gsequencer-3.1.3/0000755000175000017500000000000013622252264010664 500000000000000gsequencer-3.1.3/ags_password_store_test.xml0000644000175000017500000000135413607210263016274 00000000000000 ags-test-user-uuid-0 ags-test-login ags-test-password gsequencer-3.1.3/mkinstalldirs0000755000175000017500000000672313622252210013411 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2018-03-07.03; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the 'mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because '.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsequencer-3.1.3/test-driver0000755000175000017500000001104213622252207012775 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2018 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsequencer-3.1.3/libags_server.sym0000644000175000017500000001035313622252234014164 00000000000000ags_service_provider_get_type ags_service_provider_is_operating ags_service_provider_server_status ags_service_provider_set_registry ags_service_provider_get_registry ags_service_provider_set_server ags_service_provider_get_server ags_front_controller_get_type ags_front_controller_do_request ags_front_controller_new ags_controller_get_type ags_controller_resource_alloc ags_controller_resource_free ags_controller_resource_ref ags_controller_resource_unref ags_controller_add_resource ags_controller_remove_resource ags_controller_lookup_resource ags_controller_query_security_context ags_controller_new ags_plugin_controller_get_type ags_plugin_controller_do_request ags_authentication_manager_get_type ags_login_info_alloc ags_login_info_free ags_login_info_ref ags_login_info_unref ags_authentication_manager_get_authentication ags_authentication_manager_add_authentication ags_authentication_manager_remove_authentication ags_authentication_manager_get_session_timeout ags_authentication_manager_lookup_login ags_authentication_manager_insert_login ags_authentication_manager_remove_login ags_authentication_manager_login ags_authentication_manager_logout ags_authentication_manager_get_digest ags_authentication_manager_is_session_active ags_authentication_manager_get_instance ags_authentication_manager_new ags_password_store_manager_get_type ags_password_store_manager_get_password_store ags_password_store_manager_add_password_store ags_password_store_manager_remove_password_store ags_password_store_manager_check_password ags_password_store_manager_get_instance ags_password_store_manager_new ags_auth_security_context_get_type ags_auth_security_context_get_instance ags_auth_security_context_new ags_authentication_get_type ags_authentication_get_authentication_module ags_authentication_login ags_authentication_logout ags_authentication_generate_token ags_authentication_get_digest ags_authentication_is_session_active ags_business_group_get_type ags_business_group_get_group_uuid ags_business_group_set_group_name ags_business_group_get_group_name ags_business_group_set_user ags_business_group_get_user ags_xml_business_group_get_type ags_xml_business_group_open_filename ags_xml_business_group_new ags_password_store_get_type ags_password_store_set_login_name ags_password_store_get_login_name ags_password_store_set_password ags_password_store_get_password ags_password_store_encrypt_password ags_xml_certificate_get_type ags_xml_certificate_open_filename ags_xml_certificate_new ags_xml_authentication_get_type ags_xml_authentication_open_filename ags_xml_authentication_find_user_uuid ags_xml_authentication_new ags_certificate_get_type ags_certificate_get_cert_uuid ags_certificate_set_domain ags_certificate_get_domain ags_certificate_set_key_type ags_certificate_get_key_type ags_certificate_set_public_key_file ags_certificate_get_public_key_file ags_certificate_set_private_key_file ags_certificate_get_private_key_file ags_certificate_manager_get_type ags_certificate_manager_get_certificate ags_certificate_manager_add_certificate ags_certificate_manager_remove_certificate ags_certificate_manager_get_key_file ags_certificate_manager_get_instance ags_certificate_manager_new ags_xml_password_store_get_type ags_xml_password_store_open_filename ags_xml_password_store_find_login ags_xml_password_store_new ags_security_context_get_type ags_security_context_parse_business_group ags_security_context_get_business_group ags_security_context_add_server_context ags_security_context_remove_server_context ags_security_context_get_server_context ags_security_context_new ags_business_group_manager_get_type ags_business_group_manager_get_business_group ags_business_group_manager_add_business_group ags_business_group_manager_remove_business_group ags_business_group_manager_get_instance ags_business_group_manager_new ags_server_get_type ags_server_test_flags ags_server_set_flags ags_server_unset_flags ags_server_info_alloc ags_server_add_controller ags_server_remove_controller ags_server_start ags_server_stop ags_server_listen ags_server_new ags_registry_get_type ags_registry_entry_alloc ags_registry_entry_free ags_registry_add_entry ags_registry_find_entry ags_registry_new ags_server_status_get_type ags_server_status_new ags_server_application_context_get_type ags_server_application_context_new gsequencer-3.1.3/unit-tests.mk0000644000175000017500000031757013614062654013274 00000000000000# Copyright (C) 2005-2019 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # unit tests - libags check_PROGRAMS += \ ags_buffer_util_test \ ags_complex_test \ ags_conversion_test \ ags_log_test \ ags_time_test \ ags_turtle_manager_test \ ags_turtle_test \ ags_application_context_test \ ags_config_test \ ags_connectable_test \ ags_soundcard_test \ ags_destroy_worker_test \ ags_returnable_thread_test \ ags_task_test \ ags_thread_test \ ags_thread_pool_test \ ags_worker_thread_test \ ags_file_test \ ags_file_id_ref_test \ ags_file_launch_test \ ags_file_lookup_test \ ags_server_application_context_test \ ags_server_test \ ags_controller_test \ ags_front_controller_test \ ags_authentication_manager_test \ ags_business_group_manager_test \ ags_certificate_manager_test \ ags_password_store_manager_test \ ags_xml_authentication_test \ ags_xml_business_group_test \ ags_xml_certificate_test \ ags_xml_password_store_test \ ags_security_context_test # unit tests - libags-audio check_PROGRAMS += \ ags_base_plugin_test \ ags_dssi_manager_test \ ags_dssi_plugin_test \ ags_ladspa_conversion_test \ ags_ladspa_manager_test \ ags_lv2_conversion_test \ ags_lv2_manager_test \ ags_lv2_option_manager_test \ ags_lv2_plugin_test \ ags_lv2_preset_test \ ags_lv2_uri_map_manager_test \ ags_lv2_urid_manager_test \ ags_lv2_worker_manager_test \ ags_lv2ui_manager_test \ ags_lv2ui_plugin_test \ ags_plugin_port_test check_PROGRAMS += \ ags_audio_application_context_test \ ags_devin_test \ ags_devout_test \ ags_fifoout_test \ ags_midiin_test \ ags_audio_test \ ags_playback_domain_test \ ags_playback_test \ ags_preset_test \ ags_channel_test \ ags_input_test \ ags_output_test \ ags_recycling_test \ ags_audio_signal_test \ ags_audio_buffer_util_test \ ags_char_buffer_util_test \ ags_filter_util_test \ ags_fm_synth_util_test \ ags_fourier_transform_util_test \ ags_recall_test \ ags_recall_channel_test \ ags_recall_channel_run_test \ ags_recall_container_test \ ags_recall_dependency_test \ ags_recall_id_test \ ags_recall_recycling_test \ ags_recycling_context_test \ ags_synth_generator_test \ ags_port_test \ ags_pattern_test \ ags_notation_test \ ags_note_test \ ags_automation_test \ ags_acceleration_test \ ags_wave_test \ ags_buffer_test \ ags_midi_test \ ags_track_test \ ags_midi_buffer_util_test \ ags_midi_builder_test check_PROGRAMS += \ ags_osc_buffer_util_test \ ags_osc_client_test \ ags_osc_connection_test \ ags_osc_message_test \ ags_osc_server_test \ ags_osc_websocket_connection_test \ ags_osc_xmlrpc_message_test \ ags_osc_xmlrpc_server_test \ ags_osc_action_controller_test \ ags_osc_config_controller_test \ ags_osc_front_controller_test \ ags_osc_renew_controller_test \ ags_osc_info_controller_test \ ags_osc_meter_controller_test \ ags_osc_node_controller_test \ ags_osc_status_controller_test \ ags_osc_xmlrpc_controller_test check_PROGRAMS += \ ags_analyse_audio_signal_test \ ags_analyse_channel_test \ ags_buffer_audio_signal_test \ ags_buffer_channel_test \ ags_capture_wave_audio_test \ ags_capture_wave_channel_test \ ags_copy_audio_signal_test \ ags_copy_channel_test \ ags_copy_pattern_audio_test \ ags_copy_pattern_channel_test \ ags_count_beats_audio_test \ ags_delay_audio_test \ ags_envelope_audio_signal_test \ ags_envelope_channel_test \ ags_eq10_audio_signal_test \ ags_eq10_channel_test \ ags_feed_audio_signal_test \ ags_mute_audio_test \ ags_mute_audio_signal_test \ ags_mute_channel_test \ ags_peak_audio_signal_test \ ags_peak_channel_test \ ags_play_audio_test \ ags_play_audio_signal_test \ ags_play_channel_test \ ags_play_wave_audio_test \ ags_play_wave_channel_test \ ags_prepare_audio_signal_test \ ags_record_midi_audio_test \ ags_route_dssi_audio_test \ ags_route_lv2_audio_test \ ags_stream_audio_signal_test \ ags_volume_audio_signal_test \ ags_volume_channel_test check_PROGRAMS += \ ags_add_audio_test \ ags_add_audio_signal_test \ ags_add_effect_test \ ags_add_note_test \ ags_add_soundcard_test \ ags_apply_bpm_test \ ags_apply_presets_test \ ags_apply_sequencer_length_test \ ags_apply_synth_test \ ags_apply_tact_test \ ags_cancel_audio_test \ ags_cancel_channel_test \ ags_clear_audio_signal_test \ ags_clear_buffer_test \ ags_crop_note_test \ ags_export_output_test \ ags_free_selection_test \ ags_link_channel_test \ ags_move_note_test \ ags_remove_audio_test \ ags_remove_audio_signal_test \ ags_remove_note_test \ ags_remove_soundcard_test \ ags_reset_amplitude_test \ ags_reset_peak_test \ ags_resize_audio_test \ ags_seek_soundcard_test \ ags_set_audio_channels_test \ ags_set_buffer_size_test \ ags_set_device_test \ ags_set_format_test \ ags_set_muted_test \ ags_set_samplerate_test \ ags_start_audio_test \ ags_start_channel_test # unit tests - libgsequencer check_PROGRAMS += \ ags_xorg_application_context_test # buffer util unit test ags_buffer_util_test_SOURCES = ags/test/lib/ags_buffer_util_test.c ags_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_util_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # complex unit test ags_complex_test_SOURCES = ags/test/lib/ags_complex_test.c ags_complex_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_complex_test_LDFLAGS = -pthread $(LDFLAGS) ags_complex_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # conversion unit test ags_conversion_test_SOURCES = ags/test/lib/ags_conversion_test.c ags_conversion_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_conversion_test_LDFLAGS = -pthread $(LDFLAGS) ags_conversion_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # log unit test ags_log_test_SOURCES = ags/test/lib/ags_log_test.c ags_log_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_log_test_LDFLAGS = -pthread $(LDFLAGS) ags_log_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # time unit test ags_time_test_SOURCES = ags/test/lib/ags_time_test.c ags_time_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_time_test_LDFLAGS = -pthread $(LDFLAGS) ags_time_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle_manager unit test ags_turtle_manager_test_SOURCES = ags/test/lib/ags_turtle_manager_test.c ags_turtle_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_turtle_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_turtle_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle unit test ags_turtle_test_SOURCES = ags/test/lib/ags_turtle_test.c ags_turtle_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_turtle_test_LDFLAGS = -pthread $(LDFLAGS) ags_turtle_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # application context unit test ags_application_context_test_SOURCES = ags/test/object/ags_application_context_test.c ags_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_application_context_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # config unit test ags_config_test_SOURCES = ags/test/object/ags_config_test.c ags_config_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_config_test_LDFLAGS = -pthread $(LDFLAGS) ags_config_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # connectable unit test ags_connectable_test_SOURCES = ags/test/object/ags_connectable_test.c ags_connectable_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_connectable_test_LDFLAGS = -pthread $(LDFLAGS) ags_connectable_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # soundcard unit test ags_soundcard_test_SOURCES = ags/test/object/ags_soundcard_test.c ags_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # destroy worker unit test ags_destroy_worker_test_SOURCES = ags/test/thread/ags_destroy_worker_test.c ags_destroy_worker_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_destroy_worker_test_LDFLAGS = -pthread $(LDFLAGS) ags_destroy_worker_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # returnable thread unit test ags_returnable_thread_test_SOURCES = ags/test/thread/ags_returnable_thread_test.c ags_returnable_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_returnable_thread_test_LDFLAGS = -pthread $(LDFLAGS) ags_returnable_thread_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # task unit test ags_task_test_SOURCES = ags/test/thread/ags_task_test.c ags_task_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_task_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) ags_task_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread unit test ags_thread_test_SOURCES = ags/test/thread/ags_thread_test.c ags_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_thread_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) ags_thread_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread pool unit test ags_thread_pool_test_SOURCES = ags/test/thread/ags_thread_pool_test.c ags_thread_pool_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_thread_pool_test_LDFLAGS = -pthread $(LDFLAGS) ags_thread_pool_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # worker thread unit test ags_worker_thread_test_SOURCES = ags/test/thread/ags_worker_thread_test.c ags_worker_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_worker_thread_test_LDFLAGS = -pthread $(LDFLAGS) ags_worker_thread_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file unit test ags_file_test_SOURCES = ags/test/file/ags_file_test.c ags_file_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file id ref unit test ags_file_id_ref_test_SOURCES = ags/test/file/ags_file_id_ref_test.c ags_file_id_ref_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_id_ref_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_id_ref_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file launch unit test ags_file_launch_test_SOURCES = ags/test/file/ags_file_launch_test.c ags_file_launch_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_launch_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_launch_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file lookup unit test ags_file_lookup_test_SOURCES = ags/test/file/ags_file_lookup_test.c ags_file_lookup_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_lookup_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_lookup_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server application context unit test ags_server_application_context_test_SOURCES = ags/test/server/ags_server_application_context_test.c ags_server_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_server_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_server_application_context_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server unit test ags_server_test_SOURCES = ags/test/server/ags_server_test.c ags_server_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_server_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # controller unit test ags_controller_test_SOURCES = ags/test/server/controller/ags_controller_test.c ags_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_controller_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # front controller unit test ags_front_controller_test_SOURCES = ags/test/server/controller/ags_front_controller_test.c ags_front_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_front_controller_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # authentication manager unit test ags_authentication_manager_test_SOURCES = ags/test/server/security/ags_authentication_manager_test.c ags_authentication_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_authentication_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_authentication_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # business group manager unit test ags_business_group_manager_test_SOURCES = ags/test/server/security/ags_business_group_manager_test.c ags_business_group_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_business_group_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_business_group_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # certificate manager unit test ags_certificate_manager_test_SOURCES = ags/test/server/security/ags_certificate_manager_test.c ags_certificate_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_certificate_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_certificate_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # password store manager unit test ags_password_store_manager_test_SOURCES = ags/test/server/security/ags_password_store_manager_test.c ags_password_store_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_password_store_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_password_store_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML authentication unit test ags_xml_authentication_test_SOURCES = ags/test/server/security/ags_xml_authentication_test.c ags_xml_authentication_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_authentication_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_authentication_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML business group unit test ags_xml_business_group_test_SOURCES = ags/test/server/security/ags_xml_business_group_test.c ags_xml_business_group_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_business_group_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_business_group_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML certificate unit test ags_xml_certificate_test_SOURCES = ags/test/server/security/ags_xml_certificate_test.c ags_xml_certificate_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_certificate_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_certificate_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML password store unit test ags_xml_password_store_test_SOURCES = ags/test/server/security/ags_xml_password_store_test.c ags_xml_password_store_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_password_store_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_password_store_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # security context unit test ags_security_context_test_SOURCES = ags/test/server/security/ags_security_context_test.c ags_security_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_security_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_security_context_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # base plugin unit test ags_base_plugin_test_SOURCES = ags/test/plugin/ags_base_plugin_test.c ags_base_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_base_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_base_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi manager unit test ags_dssi_manager_test_SOURCES = ags/test/plugin/ags_dssi_manager_test.c ags_dssi_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_dssi_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_dssi_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi plugin unit test ags_dssi_plugin_test_SOURCES = ags/test/plugin/ags_dssi_plugin_test.c ags_dssi_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_dssi_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_dssi_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa conversion unit test ags_ladspa_conversion_test_SOURCES = ags/test/plugin/ags_ladspa_conversion_test.c ags_ladspa_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_ladspa_conversion_test_LDFLAGS = $(LDFLAGS) -pthread ags_ladspa_conversion_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa manager unit test ags_ladspa_manager_test_SOURCES = ags/test/plugin/ags_ladspa_manager_test.c ags_ladspa_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_ladspa_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_ladspa_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 conversion unit test ags_lv2_conversion_test_SOURCES = ags/test/plugin/ags_lv2_conversion_test.c ags_lv2_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_conversion_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_conversion_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 manager unit test ags_lv2_manager_test_SOURCES = ags/test/plugin/ags_lv2_manager_test.c ags_lv2_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 option manager unit test ags_lv2_option_manager_test_SOURCES = ags/test/plugin/ags_lv2_option_manager_test.c ags_lv2_option_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_option_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_option_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 plugin unit test ags_lv2_plugin_test_SOURCES = ags/test/plugin/ags_lv2_plugin_test.c ags_lv2_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 preset unit test ags_lv2_preset_test_SOURCES = ags/test/plugin/ags_lv2_preset_test.c ags_lv2_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_preset_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_preset_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 uri map manager unit test ags_lv2_uri_map_manager_test_SOURCES = ags/test/plugin/ags_lv2_uri_map_manager_test.c ags_lv2_uri_map_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_uri_map_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_uri_map_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 urid manager unit test ags_lv2_urid_manager_test_SOURCES = ags/test/plugin/ags_lv2_urid_manager_test.c ags_lv2_urid_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_urid_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_urid_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 worker manager unit test ags_lv2_worker_manager_test_SOURCES = ags/test/plugin/ags_lv2_worker_manager_test.c ags_lv2_worker_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_worker_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_worker_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui manager unit test ags_lv2ui_manager_test_SOURCES = ags/test/plugin/ags_lv2ui_manager_test.c ags_lv2ui_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2ui_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2ui_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui plugin unit test ags_lv2ui_plugin_test_SOURCES = ags/test/plugin/ags_lv2ui_plugin_test.c ags_lv2ui_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2ui_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2ui_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # plugin port unit test ags_plugin_port_test_SOURCES = ags/test/plugin/ags_plugin_port_test.c ags_plugin_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_plugin_port_test_LDFLAGS = $(LDFLAGS) -pthread ags_plugin_port_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio application context unit test ags_audio_application_context_test_SOURCES = ags/test/audio/ags_audio_application_context_test.c ags_audio_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_application_context_test_LDFLAGS = $(LDFLAGS) -pthread ags_audio_application_context_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devin unit test ags_devin_test_SOURCES = ags/test/audio/ags_devin_test.c ags_devin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_devin_test_LDFLAGS = -pthread $(LDFLAGS) ags_devin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devout unit test ags_devout_test_SOURCES = ags/test/audio/ags_devout_test.c ags_devout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_devout_test_LDFLAGS = -pthread $(LDFLAGS) ags_devout_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fifoout unit test ags_fifoout_test_SOURCES = ags/test/audio/ags_fifoout_test.c ags_fifoout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_fifoout_test_LDFLAGS = -pthread $(LDFLAGS) ags_fifoout_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midiin unit test ags_midiin_test_SOURCES = ags/test/audio/ags_midiin_test.c ags_midiin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midiin_test_LDFLAGS = -pthread $(LDFLAGS) ags_midiin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio unit test ags_audio_test_SOURCES = ags/test/audio/ags_audio_test.c ags_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback domain unit test ags_playback_domain_test_SOURCES = ags/test/audio/ags_playback_domain_test.c ags_playback_domain_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_playback_domain_test_LDFLAGS = -pthread $(LDFLAGS) ags_playback_domain_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback unit test ags_playback_test_SOURCES = ags/test/audio/ags_playback_test.c ags_playback_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_playback_test_LDFLAGS = -pthread $(LDFLAGS) ags_playback_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # preset unit test ags_preset_test_SOURCES = ags/test/audio/ags_preset_test.c ags_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_preset_test_LDFLAGS = -pthread $(LDFLAGS) ags_preset_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # channel unit test ags_channel_test_SOURCES = ags/test/audio/ags_channel_test.c ags_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # input unit test ags_input_test_SOURCES = ags/test/audio/ags_input_test.c ags_input_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_input_test_LDFLAGS = -pthread $(LDFLAGS) ags_input_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # output unit test ags_output_test_SOURCES = ags/test/audio/ags_output_test.c ags_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_output_test_LDFLAGS = -pthread $(LDFLAGS) ags_output_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling unit test ags_recycling_test_SOURCES = ags/test/audio/ags_recycling_test.c ags_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recycling_test_LDFLAGS = -pthread $(LDFLAGS) ags_recycling_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio signal unit test ags_audio_signal_test_SOURCES = ags/test/audio/ags_audio_signal_test.c ags_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio buffer util unit test ags_audio_buffer_util_test_SOURCES = ags/test/audio/ags_audio_buffer_util_test.c ags_audio_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_audio_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # char buffer util unit test ags_char_buffer_util_test_SOURCES = ags/test/audio/ags_char_buffer_util_test.c ags_char_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_char_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_char_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # filter util unit test ags_filter_util_test_SOURCES = ags/test/audio/ags_filter_util_test.c ags_filter_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_filter_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_filter_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # FM synth util unit test ags_fm_synth_util_test_SOURCES = ags/test/audio/ags_fm_synth_util_test.c ags_fm_synth_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_fm_synth_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_fm_synth_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fourier transform util unit test ags_fourier_transform_util_test_SOURCES = ags/test/audio/ags_fourier_transform_util_test.c ags_fourier_transform_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_fourier_transform_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_fourier_transform_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall unit test ags_recall_test_SOURCES = ags/test/audio/ags_recall_test.c ags_recall_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel unit test ags_recall_channel_test_SOURCES = ags/test/audio/ags_recall_channel_test.c ags_recall_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel run unit test ags_recall_channel_run_test_SOURCES = ags/test/audio/ags_recall_channel_run_test.c ags_recall_channel_run_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_channel_run_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_channel_run_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall container unit test ags_recall_container_test_SOURCES = ags/test/audio/ags_recall_container_test.c ags_recall_container_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_container_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_container_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall dependency unit test ags_recall_dependency_test_SOURCES = ags/test/audio/ags_recall_dependency_test.c ags_recall_dependency_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_dependency_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_dependency_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall id unit test ags_recall_id_test_SOURCES = ags/test/audio/ags_recall_id_test.c ags_recall_id_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_id_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_id_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall recycling unit test ags_recall_recycling_test_SOURCES = ags/test/audio/ags_recall_recycling_test.c ags_recall_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_recycling_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_recycling_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling context unit test ags_recycling_context_test_SOURCES = ags/test/audio/ags_recycling_context_test.c ags_recycling_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recycling_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_recycling_context_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # synth generator unit test ags_synth_generator_test_SOURCES = ags/test/audio/ags_synth_generator_test.c ags_synth_generator_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_synth_generator_test_LDFLAGS = -pthread $(LDFLAGS) ags_synth_generator_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # port unit test ags_port_test_SOURCES = ags/test/audio/ags_port_test.c ags_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_port_test_LDFLAGS = -pthread $(LDFLAGS) ags_port_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # pattern unit test ags_pattern_test_SOURCES = ags/test/audio/ags_pattern_test.c ags_pattern_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_pattern_test_LDFLAGS = -pthread $(LDFLAGS) ags_pattern_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # notation unit test ags_notation_test_SOURCES = ags/test/audio/ags_notation_test.c ags_notation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_notation_test_LDFLAGS = -pthread $(LDFLAGS) ags_notation_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # note unit test ags_note_test_SOURCES = ags/test/audio/ags_note_test.c ags_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # automation unit test ags_automation_test_SOURCES = ags/test/audio/ags_automation_test.c ags_automation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_automation_test_LDFLAGS = -pthread $(LDFLAGS) ags_automation_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # acceleration unit test ags_acceleration_test_SOURCES = ags/test/audio/ags_acceleration_test.c ags_acceleration_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_acceleration_test_LDFLAGS = -pthread $(LDFLAGS) ags_acceleration_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # wave unit test ags_wave_test_SOURCES = ags/test/audio/ags_wave_test.c ags_wave_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_wave_test_LDFLAGS = -pthread $(LDFLAGS) ags_wave_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer unit test ags_buffer_test_SOURCES = ags/test/audio/ags_buffer_test.c ags_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_buffer_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi unit test ags_midi_test_SOURCES = ags/test/audio/ags_midi_test.c ags_midi_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midi_test_LDFLAGS = -pthread $(LDFLAGS) ags_midi_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # track unit test ags_track_test_SOURCES = ags/test/audio/ags_track_test.c ags_track_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_track_test_LDFLAGS = -pthread $(LDFLAGS) ags_track_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi buffer util unit test ags_midi_buffer_util_test_SOURCES = ags/test/audio/midi/ags_midi_buffer_util_test.c ags_midi_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midi_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_midi_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi builder unit test ags_midi_builder_test_SOURCES = ags/test/audio/midi/ags_midi_builder_test.c ags_midi_builder_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midi_builder_test_LDFLAGS = -pthread $(LDFLAGS) ags_midi_builder_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc buffer util unit test ags_osc_buffer_util_test_SOURCES = ags/test/audio/osc/ags_osc_buffer_util_test.c ags_osc_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc client unit test ags_osc_client_test_SOURCES = ags/test/audio/osc/ags_osc_client_test.c ags_osc_client_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_client_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_client_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc connection unit test ags_osc_connection_test_SOURCES = ags/test/audio/osc/ags_osc_connection_test.c ags_osc_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_connection_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_connection_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc message unit test ags_osc_message_test_SOURCES = ags/test/audio/osc/ags_osc_message_test.c ags_osc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_message_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_message_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc server unit test ags_osc_server_test_SOURCES = ags/test/audio/osc/ags_osc_server_test.c ags_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_server_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc websocket connection unit test ags_osc_websocket_connection_test_SOURCES = ags/test/audio/osc/ags_osc_websocket_connection_test.c ags_osc_websocket_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_websocket_connection_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_websocket_connection_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC message unit test ags_osc_xmlrpc_message_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_message_test.c ags_osc_xmlrpc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_xmlrpc_message_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_xmlrpc_message_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC server unit test ags_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_server_test.c ags_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_xmlrpc_server_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc action controller unit test ags_osc_action_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_action_controller_test.c ags_osc_action_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_action_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_action_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc config controller unit test ags_osc_config_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_config_controller_test.c ags_osc_config_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_config_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_config_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc front controller unit test ags_osc_front_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_front_controller_test.c ags_osc_front_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_front_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc renew controller unit test ags_osc_renew_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_renew_controller_test.c ags_osc_renew_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_renew_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_renew_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc info controller unit test ags_osc_info_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_info_controller_test.c ags_osc_info_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_info_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_info_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc meter controller unit test ags_osc_meter_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_meter_controller_test.c ags_osc_meter_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_meter_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_meter_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc node controller unit test ags_osc_node_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_node_controller_test.c ags_osc_node_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_node_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_node_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc status controller unit test ags_osc_status_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_status_controller_test.c ags_osc_status_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_status_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_status_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc xmlrpc controller unit test ags_osc_xmlrpc_controller_test_SOURCES = ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c ags_osc_xmlrpc_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_xmlrpc_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_xmlrpc_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse audio signal unit test ags_analyse_audio_signal_test_SOURCES = ags/test/audio/recall/ags_analyse_audio_signal_test.c ags_analyse_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_analyse_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_analyse_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse channel unit test ags_analyse_channel_test_SOURCES = ags/test/audio/recall/ags_analyse_channel_test.c ags_analyse_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_analyse_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_analyse_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer audio signal unit test ags_buffer_audio_signal_test_SOURCES = ags/test/audio/recall/ags_buffer_audio_signal_test.c ags_buffer_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_buffer_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer channel unit test ags_buffer_channel_test_SOURCES = ags/test/audio/recall/ags_buffer_channel_test.c ags_buffer_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_buffer_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave audio unit test ags_capture_wave_audio_test_SOURCES = ags/test/audio/recall/ags_capture_wave_audio_test.c ags_capture_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_capture_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_capture_wave_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave channel unit test ags_capture_wave_channel_test_SOURCES = ags/test/audio/recall/ags_capture_wave_channel_test.c ags_capture_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_capture_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_capture_wave_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio signal unit test ags_copy_audio_signal_test_SOURCES = ags/test/audio/recall/ags_copy_audio_signal_test.c ags_copy_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel unit test ags_copy_channel_test_SOURCES = ags/test/audio/recall/ags_copy_channel_test.c ags_copy_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio pattern unit test ags_copy_pattern_audio_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_audio_test.c ags_copy_pattern_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_pattern_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_pattern_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel pattern unit test ags_copy_pattern_channel_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_channel_test.c ags_copy_pattern_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_pattern_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_pattern_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # count beats audio unit test ags_count_beats_audio_test_SOURCES = ags/test/audio/recall/ags_count_beats_audio_test.c ags_count_beats_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_count_beats_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_count_beats_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # delay audio unit test ags_delay_audio_test_SOURCES = ags/test/audio/recall/ags_delay_audio_test.c ags_delay_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_delay_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_delay_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope audio signal unit test ags_envelope_audio_signal_test_SOURCES = ags/test/audio/recall/ags_envelope_audio_signal_test.c ags_envelope_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_envelope_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_envelope_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope channel unit test ags_envelope_channel_test_SOURCES = ags/test/audio/recall/ags_envelope_channel_test.c ags_envelope_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_envelope_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_envelope_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 audio signal unit test ags_eq10_audio_signal_test_SOURCES = ags/test/audio/recall/ags_eq10_audio_signal_test.c ags_eq10_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_eq10_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_eq10_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 channel unit test ags_eq10_channel_test_SOURCES = ags/test/audio/recall/ags_eq10_channel_test.c ags_eq10_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_eq10_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_eq10_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # feed audio signal unit test ags_feed_audio_signal_test_SOURCES = ags/test/audio/recall/ags_feed_audio_signal_test.c ags_feed_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_feed_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_feed_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio unit test ags_mute_audio_test_SOURCES = ags/test/audio/recall/ags_mute_audio_test.c ags_mute_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_mute_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_mute_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio signal unit test ags_mute_audio_signal_test_SOURCES = ags/test/audio/recall/ags_mute_audio_signal_test.c ags_mute_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_mute_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_mute_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute channel unit test ags_mute_channel_test_SOURCES = ags/test/audio/recall/ags_mute_channel_test.c ags_mute_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_mute_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_mute_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak audio signal unit test ags_peak_audio_signal_test_SOURCES = ags/test/audio/recall/ags_peak_audio_signal_test.c ags_peak_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_peak_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_peak_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak channel unit test ags_peak_channel_test_SOURCES = ags/test/audio/recall/ags_peak_channel_test.c ags_peak_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_peak_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_peak_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio unit test ags_play_audio_test_SOURCES = ags/test/audio/recall/ags_play_audio_test.c ags_play_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio signal unit test ags_play_audio_signal_test_SOURCES = ags/test/audio/recall/ags_play_audio_signal_test.c ags_play_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play channel unit test ags_play_channel_test_SOURCES = ags/test/audio/recall/ags_play_channel_test.c ags_play_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave audio unit test ags_play_wave_audio_test_SOURCES = ags/test/audio/recall/ags_play_wave_audio_test.c ags_play_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_wave_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave channel unit test ags_play_wave_channel_test_SOURCES = ags/test/audio/recall/ags_play_wave_channel_test.c ags_play_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_wave_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # prepare audio signal unit test ags_prepare_audio_signal_test_SOURCES = ags/test/audio/recall/ags_prepare_audio_signal_test.c ags_prepare_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_prepare_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_prepare_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # record midi audio unit test ags_record_midi_audio_test_SOURCES = ags/test/audio/recall/ags_record_midi_audio_test.c ags_record_midi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_record_midi_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_record_midi_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route dssi audio unit test ags_route_dssi_audio_test_SOURCES = ags/test/audio/recall/ags_route_dssi_audio_test.c ags_route_dssi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_route_dssi_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_route_dssi_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route lv2 audio unit test ags_route_lv2_audio_test_SOURCES = ags/test/audio/recall/ags_route_lv2_audio_test.c ags_route_lv2_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_route_lv2_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_route_lv2_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # stream audio signal unit test ags_stream_audio_signal_test_SOURCES = ags/test/audio/recall/ags_stream_audio_signal_test.c ags_stream_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_stream_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_stream_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume audio signal unit test ags_volume_audio_signal_test_SOURCES = ags/test/audio/recall/ags_volume_audio_signal_test.c ags_volume_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_volume_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_volume_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume channel unit test ags_volume_channel_test_SOURCES = ags/test/audio/recall/ags_volume_channel_test.c ags_volume_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_volume_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_volume_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio unit test ags_add_audio_test_SOURCES = ags/test/audio/task/ags_add_audio_test.c ags_add_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio signal unit test ags_add_audio_signal_test_SOURCES = ags/test/audio/task/ags_add_audio_signal_test.c ags_add_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add effect unit test ags_add_effect_test_SOURCES = ags/test/audio/task/ags_add_effect_test.c ags_add_effect_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_effect_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_effect_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add note unit test ags_add_note_test_SOURCES = ags/test/audio/task/ags_add_note_test.c ags_add_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add soundcard unit test ags_add_soundcard_test_SOURCES = ags/test/audio/task/ags_add_soundcard_test.c ags_add_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply bpm unit test ags_apply_bpm_test_SOURCES = ags/test/audio/task/ags_apply_bpm_test.c ags_apply_bpm_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_bpm_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_bpm_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply presets unit test ags_apply_presets_test_SOURCES = ags/test/audio/task/ags_apply_presets_test.c ags_apply_presets_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_presets_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_presets_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply sequencer length unit test ags_apply_sequencer_length_test_SOURCES = ags/test/audio/task/ags_apply_sequencer_length_test.c ags_apply_sequencer_length_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_sequencer_length_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_sequencer_length_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply synth unit test ags_apply_synth_test_SOURCES = ags/test/audio/task/ags_apply_synth_test.c ags_apply_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_synth_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_synth_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply tact unit test ags_apply_tact_test_SOURCES = ags/test/audio/task/ags_apply_tact_test.c ags_apply_tact_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_tact_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_tact_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel audio unit test ags_cancel_audio_test_SOURCES = ags/test/audio/task/ags_cancel_audio_test.c ags_cancel_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_cancel_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_cancel_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel channel unit test ags_cancel_channel_test_SOURCES = ags/test/audio/task/ags_cancel_channel_test.c ags_cancel_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_cancel_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_cancel_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear audio signal unit test ags_clear_audio_signal_test_SOURCES = ags/test/audio/task/ags_clear_audio_signal_test.c ags_clear_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_clear_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_clear_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear buffer unit test ags_clear_buffer_test_SOURCES = ags/test/audio/task/ags_clear_buffer_test.c ags_clear_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_clear_buffer_test_LDFLAGS = -pthread $(LDFLAGS) ags_clear_buffer_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # crop note unit test ags_crop_note_test_SOURCES = ags/test/audio/task/ags_crop_note_test.c ags_crop_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_crop_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_crop_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # export output unit test ags_export_output_test_SOURCES = ags/test/audio/task/ags_export_output_test.c ags_export_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_export_output_test_LDFLAGS = -pthread $(LDFLAGS) ags_export_output_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # free selection unit test ags_free_selection_test_SOURCES = ags/test/audio/task/ags_free_selection_test.c ags_free_selection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_free_selection_test_LDFLAGS = -pthread $(LDFLAGS) ags_free_selection_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # link channel unit test ags_link_channel_test_SOURCES = ags/test/audio/task/ags_link_channel_test.c ags_link_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_link_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_link_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # move note unit test ags_move_note_test_SOURCES = ags/test/audio/task/ags_move_note_test.c ags_move_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_move_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_move_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio unit test ags_remove_audio_test_SOURCES = ags/test/audio/task/ags_remove_audio_test.c ags_remove_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio signal unit test ags_remove_audio_signal_test_SOURCES = ags/test/audio/task/ags_remove_audio_signal_test.c ags_remove_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove note unit test ags_remove_note_test_SOURCES = ags/test/audio/task/ags_remove_note_test.c ags_remove_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove soundcard unit test ags_remove_soundcard_test_SOURCES = ags/test/audio/task/ags_remove_soundcard_test.c ags_remove_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset amplitude unit test ags_reset_amplitude_test_SOURCES = ags/test/audio/task/ags_reset_amplitude_test.c ags_reset_amplitude_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_reset_amplitude_test_LDFLAGS = -pthread $(LDFLAGS) ags_reset_amplitude_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset peak unit test ags_reset_peak_test_SOURCES = ags/test/audio/task/ags_reset_peak_test.c ags_reset_peak_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_reset_peak_test_LDFLAGS = -pthread $(LDFLAGS) ags_reset_peak_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # resize audio unit test ags_resize_audio_test_SOURCES = ags/test/audio/task/ags_resize_audio_test.c ags_resize_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_resize_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_resize_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # seek soundcard unit test ags_seek_soundcard_test_SOURCES = ags/test/audio/task/ags_seek_soundcard_test.c ags_seek_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_seek_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_seek_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set audio channels unit test ags_set_audio_channels_test_SOURCES = ags/test/audio/task/ags_set_audio_channels_test.c ags_set_audio_channels_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_audio_channels_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_audio_channels_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set buffer size unit test ags_set_buffer_size_test_SOURCES = ags/test/audio/task/ags_set_buffer_size_test.c ags_set_buffer_size_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_buffer_size_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_buffer_size_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set device unit test ags_set_device_test_SOURCES = ags/test/audio/task/ags_set_device_test.c ags_set_device_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_device_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_device_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set format unit test ags_set_format_test_SOURCES = ags/test/audio/task/ags_set_format_test.c ags_set_format_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_format_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_format_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set muted unit test ags_set_muted_test_SOURCES = ags/test/audio/task/ags_set_muted_test.c ags_set_muted_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_muted_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_muted_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set samplerate unit test ags_set_samplerate_test_SOURCES = ags/test/audio/task/ags_set_samplerate_test.c ags_set_samplerate_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_samplerate_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_samplerate_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start audio unit test ags_start_audio_test_SOURCES = ags/test/audio/task/ags_start_audio_test.c ags_start_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_start_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_start_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start channel unit test ags_start_channel_test_SOURCES = ags/test/audio/task/ags_start_channel_test.c ags_start_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_start_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_start_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # xorg application context unit test ags_xorg_application_context_test_SOURCES = ags/test/X/ags_xorg_application_context_test.c ags_xorg_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_xorg_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_xorg_application_context_test_LDADD = libgsequencer.la libags_gui.la libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) gsequencer-3.1.3/libags.sym.in0000644000175000017500000003464113616617253013222 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_id_generator_create_uuid ags_destroy_util_dispose_and_unref ags_soundcard_helper_config_get_dsp_channels ags_soundcard_helper_config_get_pcm_channels ags_soundcard_helper_config_get_samplerate ags_soundcard_helper_config_get_buffer_size ags_soundcard_helper_config_get_format ags_list_util_find_type ags_function_get_type ags_function_collapse_parantheses ags_function_find_literals ags_function_literal_solve ags_function_push_equation ags_function_pop_equation ags_function_get_expanded ags_function_get_normalized ags_function_compute_term ags_function_symbolic_translate_value ags_function_substitute_values ags_function_translate_value ags_function_new ags_complex_get_type ags_complex_alloc ags_complex_copy ags_complex_free ags_complex_get ags_complex_set ags_solver_vector_get_type ags_solver_vector_new ags_string_util_escape_single_quote ags_strv_length ags_strv_contains ags_strv_index ags_endian_host_is_le ags_endian_host_is_be ags_endian_swap_float ags_log_get_type ags_log_add_message ags_log_get_messages ags_log_get_instance ags_log_new ags_turtle_manager_get_type ags_turtle_manager_find ags_turtle_manager_add ags_turtle_manager_get_instance ags_turtle_manager_new ags_buffer_util_s8_to_char_buffer ags_buffer_util_s16_to_char_buffer ags_buffer_util_s24_to_char_buffer ags_buffer_util_s32_to_char_buffer ags_buffer_util_s64_to_char_buffer ags_buffer_util_float_to_char_buffer ags_buffer_util_double_to_char_buffer ags_buffer_util_complex_to_char_buffer ags_buffer_util_char_buffer_to_s8 ags_buffer_util_char_buffer_to_s16 ags_buffer_util_char_buffer_to_s24 ags_buffer_util_char_buffer_to_s32 ags_buffer_util_char_buffer_to_s64 ags_buffer_util_char_buffer_to_float ags_buffer_util_char_buffer_to_double ags_buffer_util_char_buffer_to_complex ags_buffer_util_char_buffer_read_s8 ags_buffer_util_char_buffer_read_s16 ags_buffer_util_char_buffer_read_s24 ags_buffer_util_char_buffer_read_s32 ags_buffer_util_char_buffer_read_s64 ags_buffer_util_char_buffer_read_float ags_buffer_util_char_buffer_read_double ags_buffer_util_char_buffer_read_complex ags_buffer_util_char_buffer_write_s8 ags_buffer_util_char_buffer_write_s16 ags_buffer_util_char_buffer_write_s24 ags_buffer_util_char_buffer_write_s32 ags_buffer_util_char_buffer_write_s64 ags_buffer_util_char_buffer_write_float ags_buffer_util_char_buffer_write_double ags_buffer_util_char_buffer_write_complex ags_buffer_util_char_buffer_swap_bytes ags_time_get_uptime_from_offset ags_time_timeout_expired ags_turtle_get_type ags_turtle_read_iriref ags_turtle_read_pname_ns ags_turtle_read_pname_ln ags_turtle_read_blank_node_label ags_turtle_read_langtag ags_turtle_read_boolean ags_turtle_read_integer ags_turtle_read_decimal ags_turtle_read_double ags_turtle_read_exponent ags_turtle_read_string ags_turtle_read_string_literal_quote ags_turtle_read_string_literal_single_quote ags_turtle_read_string_literal_long_quote ags_turtle_read_string_literal_long_single_quote ags_turtle_read_uchar ags_turtle_read_echar ags_turtle_read_ws ags_turtle_read_anon ags_turtle_read_pn_chars_base ags_turtle_read_pn_chars_u ags_turtle_read_pn_chars ags_turtle_read_pn_prefix ags_turtle_read_pn_local ags_turtle_read_plx ags_turtle_read_percent ags_turtle_read_hex ags_turtle_read_pn_local_esc ags_turtle_find_xpath ags_turtle_find_xpath_with_context_node ags_turtle_string_convert ags_turtle_load ags_turtle_new ags_uuid_get_type ags_uuid_alloc ags_uuid_copy ags_uuid_free ags_uuid_generate ags_uuid_compare ags_uuid_to_string ags_uuid_from_string ags_regcomp ags_regexec ags_conversion_get_type ags_conversion_convert ags_conversion_new ags_solver_matrix_get_type ags_solver_matrix_new ags_application_context ags_connectable_get_type ags_connectable_get_uuid ags_connectable_has_resource ags_connectable_is_ready ags_connectable_add_to_registry ags_connectable_remove_from_registry ags_connectable_list_resource ags_connectable_xml_compose ags_connectable_xml_parse ags_connectable_is_connected ags_connectable_connect ags_connectable_disconnect ags_connectable_connect_connection ags_connectable_disconnect_connection ags_soundcard_get_type ags_soundcard_set_device ags_soundcard_get_device ags_soundcard_set_presets ags_soundcard_get_presets ags_soundcard_list_cards ags_soundcard_pcm_info ags_soundcard_get_capability ags_soundcard_is_available ags_soundcard_is_starting ags_soundcard_is_playing ags_soundcard_is_recording ags_soundcard_get_uptime ags_soundcard_play_init ags_soundcard_play ags_soundcard_record_init ags_soundcard_record ags_soundcard_stop ags_soundcard_tic ags_soundcard_offset_changed ags_soundcard_get_buffer ags_soundcard_get_next_buffer ags_soundcard_get_prev_buffer ags_soundcard_lock_buffer ags_soundcard_unlock_buffer ags_soundcard_set_bpm ags_soundcard_get_bpm ags_soundcard_set_delay_factor ags_soundcard_get_delay_factor ags_soundcard_get_absolute_delay ags_soundcard_get_delay ags_soundcard_get_attack ags_soundcard_get_delay_counter ags_soundcard_set_start_note_offset ags_soundcard_get_start_note_offset ags_soundcard_set_note_offset ags_soundcard_get_note_offset ags_soundcard_set_note_offset_absolute ags_soundcard_get_note_offset_absolute ags_soundcard_set_loop ags_soundcard_get_loop ags_soundcard_get_loop_offset ags_soundcard_get_sub_block_count ags_soundcard_trylock_sub_block ags_soundcard_unlock_sub_block ags_applicable_get_type ags_applicable_set_update ags_applicable_apply ags_applicable_reset ags_sequencer_get_type ags_sequencer_set_device ags_sequencer_get_device ags_sequencer_list_cards ags_sequencer_is_starting ags_sequencer_is_playing ags_sequencer_is_recording ags_sequencer_play_init ags_sequencer_play ags_sequencer_record_init ags_sequencer_record ags_sequencer_stop ags_sequencer_tic ags_sequencer_offset_changed ags_sequencer_get_buffer ags_sequencer_get_next_buffer ags_sequencer_lock_buffer ags_sequencer_unlock_buffer ags_sequencer_set_bpm ags_sequencer_get_bpm ags_sequencer_set_delay_factor ags_sequencer_get_delay_factor ags_sequencer_set_start_note_offset ags_sequencer_get_start_note_offset ags_sequencer_set_note_offset ags_sequencer_get_note_offset ags_tactable_get_type ags_tactable_get_sequencer_duration ags_tactable_get_notation_duration ags_tactable_get_wave_duration ags_tactable_get_midi_duration ags_tactable_get_bpm ags_tactable_get_tact ags_tactable_change_sequencer_duration ags_tactable_change_notation_duration ags_tactable_change_wave_duration ags_tactable_change_midi_duration ags_tactable_change_bpm ags_tactable_change_tact ags_main_loop_get_type ags_main_loop_get_tree_lock ags_main_loop_set_syncing ags_main_loop_is_syncing ags_main_loop_set_critical_region ags_main_loop_is_critical_region ags_main_loop_inc_queued_critical_region ags_main_loop_dec_queued_critical_region ags_main_loop_test_queued_critical_region ags_main_loop_change_frequency ags_seekable_get_type ags_seekable_seek ags_cursor_get_type ags_cursor_get_default_offset ags_cursor_get_tact ags_cursor_get_bpm ags_cursor_get_rate ags_cursor_get_delay ags_cursor_get_duration ags_cursor_get_delay_counter ags_cursor_get_offset ags_cursor_get_prev ags_cursor_get_next ags_cursor_get_current_copy ags_cursor_get_current ags_sound_server_get_type ags_sound_server_set_url ags_sound_server_get_url ags_sound_server_set_ports ags_sound_server_get_ports ags_sound_server_set_soundcard ags_sound_server_get_soundcard ags_sound_server_set_sequencer ags_sound_server_get_sequencer ags_sound_server_register_soundcard ags_sound_server_unregister_soundcard ags_sound_server_register_sequencer ags_sound_server_unregister_sequencer ags_countable_get_type ags_countable_get_sequencer_counter ags_countable_get_notation_counter ags_countable_get_wave_counter ags_countable_get_midi_counter ags_portlet_get_type ags_portlet_get_port ags_portlet_set_port ags_portlet_list_safe_properties ags_portlet_safe_get_property ags_portlet_safe_set_property ags_globals_get_hash_table ags_globals_set ags_globals_get ags_application_context_get_type ags_application_context_test_flags ags_application_context_set_flags ags_application_context_unset_flags ags_application_context_load_config ags_application_context_prepare ags_application_context_setup ags_application_context_register_types ags_application_context_quit ags_application_context_get_instance ags_application_context_new ags_priority_get_type ags_priority_load_defaults ags_priority_load_from_file ags_priority_set_value ags_priority_get_value ags_priority_get_instance ags_priority_new ags_mutable_get_type ags_mutable_set_muted ags_plugin_get_type ags_plugin_get_name ags_plugin_set_name ags_plugin_get_version ags_plugin_set_version ags_plugin_get_build_id ags_plugin_set_build_id ags_plugin_get_xml_type ags_plugin_set_xml_type ags_plugin_get_ports ags_plugin_set_ports ags_plugin_read ags_plugin_write ags_config_get_type ags_config_load_defaults ags_config_load_from_file ags_config_load_from_data ags_config_set_value ags_config_get_value ags_config_to_data ags_config_save ags_config_clear ags_config_get_instance ags_config_new ags_cclosure_marshal_VOID__UINT64 ags_cclosure_marshal_VOID__BOOLEAN_POINTER ags_cclosure_marshal_VOID__INT_UINT ags_cclosure_marshal_VOID__INT_POINTER ags_cclosure_marshal_VOID__INT_UINT_POINTER ags_cclosure_marshal_VOID__UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT ags_cclosure_marshal_VOID__UINT_INT ags_cclosure_marshal_VOID__UINT_DOUBLE ags_cclosure_marshal_VOID__UINT_STRING_UINT ags_cclosure_marshal_VOID__UINT_POINTER_UINT ags_cclosure_marshal_VOID__INT64_UINT ags_cclosure_marshal_VOID__ULONG_UINT ags_cclosure_marshal_VOID__ULONG_UINT_BOOLEAN ags_cclosure_marshal_VOID__DOUBLE_DOUBLE ags_cclosure_marshal_VOID__ULONG_UINT_UINT ags_cclosure_marshal_VOID__STRING_UINT ags_cclosure_marshal_VOID__STRING_UINT_DOUBLE ags_cclosure_marshal_VOID__STRING_UINT_POINTER ags_cclosure_marshal_VOID__STRING_UINT_STRING_DOUBLE ags_cclosure_marshal_VOID__STRING_POINTER ags_cclosure_marshal_VOID__STRING_STRING_STRING ags_cclosure_marshal_VOID__POINTER_INT ags_cclosure_marshal_VOID__POINTER_INT_POINTER ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN ags_cclosure_marshal_VOID__POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER ags_cclosure_marshal_VOID__POINTER_UINT_UINT ags_cclosure_marshal_VOID__POINTER_UINT_POINTER ags_cclosure_marshal_VOID__POINTER_POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER ags_cclosure_marshal_VOID__OBJECT_UINT ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT ags_cclosure_marshal_VOID__OBJECT_OBJECT ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT ags_cclosure_marshal_ULONG__VOID ags_cclosure_marshal_INT__VOID ags_cclosure_marshal_INT64__OBJECT ags_cclosure_marshal_UINT__VOID ags_cclosure_marshal_BOOLEAN__VOID ags_cclosure_marshal_BOOLEAN__UINT_POINTER ags_cclosure_marshal_BOOLEAN__POINTER_UINT ags_cclosure_marshal_BOOLEAN__OBJECT_OBJECT ags_cclosure_marshal_UINT__INT_UINT_POINTER ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN ags_cclosure_marshal_STRING__STRING_STRING ags_cclosure_marshal_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER ags_cclosure_marshal_POINTER__VOID ags_cclosure_marshal_POINTER__INT ags_cclosure_marshal_POINTER__UINT ags_cclosure_marshal_POINTER__POINTER ags_cclosure_marshal_POINTER__INT_UINT ags_cclosure_marshal_POINTER__UINT_UINT ags_cclosure_marshal_POINTER__UINT_POINTER ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER ags_cclosure_marshal_POINTER__POINTER_UINT ags_cclosure_marshal_POINTER__STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING_STRING ags_cclosure_marshal_POINTER__ULONG_POINTER_UINT ags_cclosure_marshal_POINTER__ULONG_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64 ags_cclosure_marshal_POINTER__OBJECT_OBJECT ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__POINTER_STRING_STRING ags_cclosure_marshal_OBJECT__VOID ags_cclosure_marshal_OBJECT__UINT_POINTER ags_cclosure_marshal_OBJECT__STRING_STRING_STRING ags_cclosure_marshal_OBJECT__OBJECT ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_OBJECT ags_file_get_type ags_file_str2md5 ags_file_add_id_ref ags_file_find_id_ref_by_node ags_file_find_id_ref_by_xpath ags_file_find_id_ref_by_reference ags_file_add_lookup ags_file_add_launch ags_file_open ags_file_open_from_data ags_file_rw_open ags_file_open_filename ags_file_close ags_file_write ags_file_write_concurrent ags_file_write_resolve ags_file_read ags_file_read_resolve ags_file_read_start ags_file_read_config ags_file_write_config ags_file_read_application_context ags_file_write_application_context ags_file_new ags_file_launch_get_type ags_file_launch_start ags_file_launch_new ags_file_lookup_get_type ags_file_lookup_find_by_node ags_file_lookup_find_by_reference ags_file_lookup_resolve ags_file_lookup_new ags_file_id_ref_get_type ags_file_id_ref_resolved ags_file_id_ref_new ags_file_link_get_type ags_file_link_new gsequencer-3.1.3/libags_audio.sym.in0000644000175000017500000022624513616617253014406 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_lv2_turtle_parser_get_type ags_lv2_turtle_parser_parse_names ags_lv2_turtle_parser_parse ags_lv2_turtle_parser_new ags_lv2_plugin_get_type ags_lv2_plugin_test_flags ags_lv2_plugin_set_flags ags_lv2_plugin_unset_flags ags_lv2_plugin_event_buffer_alloc ags_lv2_plugin_event_buffer_realloc_data ags_lv2_plugin_event_buffer_concat ags_lv2_plugin_event_buffer_append_midi ags_lv2_plugin_event_buffer_remove_midi ags_lv2_plugin_clear_event_buffer ags_lv2_plugin_alloc_atom_sequence ags_lv2_plugin_atom_sequence_append_midi ags_lv2_plugin_atom_sequence_remove_midi ags_lv2_plugin_clear_atom_sequence ags_lv2_plugin_find_uri ags_lv2_plugin_find_pname ags_lv2_plugin_change_program ags_lv2_plugin_new ags_lv2_worker_manager_get_type ags_lv2_worker_manager_pull_worker ags_lv2_worker_manager_get_instance ags_lv2_worker_manager_new ags_plugin_port_get_type ags_plugin_port_test_flags ags_plugin_port_set_flags ags_plugin_port_unset_flags ags_plugin_port_find_symbol ags_plugin_port_find_port_index ags_plugin_port_new ags_lv2_state_manager_get_type ags_lv2_state_manager_get_instance ags_lv2_state_manager_new ags_dssi_manager_get_type ags_dssi_manager_get_default_path ags_dssi_manager_set_default_path ags_dssi_manager_get_filenames ags_dssi_manager_find_dssi_plugin ags_dssi_manager_load_blacklist ags_dssi_manager_load_file ags_dssi_manager_load_default_directory ags_dssi_manager_get_instance ags_dssi_manager_new ags_lv2_preset_manager_get_type ags_lv2_preset_manager_get_instance ags_lv2_preset_manager_new ags_lv2_worker_get_type ags_lv2_worker_test_flags ags_lv2_worker_set_flags ags_lv2_worker_unset_flags ags_lv2_worker_alloc_response_data ags_lv2_worker_free_response_data ags_lv2_worker_respond ags_lv2_worker_schedule_work ags_lv2_worker_do_poll ags_lv2_worker_new ags_lv2_preset_get_type ags_lv2_port_preset_alloc ags_lv2_port_preset_free ags_lv2_preset_parse_turtle ags_lv2_preset_find_preset_uri ags_lv2_preset_find_preset_label ags_lv2_preset_new ags_lv2_uri_map_manager_get_type ags_lv2_uri_map_manager_insert ags_lv2_uri_map_manager_remove ags_lv2_uri_map_manager_lookup ags_lv2_uri_map_manager_load_default ags_lv2_uri_map_manager_uri_to_id ags_lv2_uri_map_manager_get_instance ags_lv2_uri_map_manager_new ags_ladspa_conversion_get_type ags_ladspa_conversion_test_flags ags_ladspa_conversion_set_flags ags_ladspa_conversion_unset_flags ags_ladspa_conversion_new ags_lv2_manager_get_type ags_lv2_manager_global_get_parse_names ags_lv2_manager_global_get_preserve_turtle ags_lv2_manager_get_default_path ags_lv2_manager_set_default_path ags_lv2_manager_get_filenames ags_lv2_manager_find_lv2_plugin ags_lv2_manager_load_blacklist ags_lv2_manager_load_file ags_lv2_manager_load_preset ags_lv2_manager_load_default_directory ags_lv2_manager_get_instance ags_lv2_manager_new ags_base_plugin_get_type ags_base_plugin_test_flags ags_base_plugin_set_flags ags_base_plugin_unset_flags ags_base_plugin_find_filename ags_base_plugin_find_effect ags_base_plugin_find_ui_effect_index ags_base_plugin_sort_func ags_base_plugin_sort ags_base_plugin_apply_port_group_by_prefix ags_base_plugin_instantiate ags_base_plugin_instantiate_with_params ags_base_plugin_connect_port ags_base_plugin_activate ags_base_plugin_deactivate ags_base_plugin_run ags_base_plugin_load_plugin ags_base_plugin_new ags_lv2_log_manager_get_type ags_lv2_log_manager_printf ags_lv2_log_manager_vprintf ags_lv2_log_manager_get_instance ags_lv2_log_manager_new ags_lv2ui_plugin_get_type ags_lv2ui_plugin_test_flags ags_lv2ui_plugin_set_flags ags_lv2ui_plugin_unset_flags ags_lv2ui_plugin_find_gui_uri ags_lv2ui_plugin_new ags_dssi_plugin_get_type ags_dssi_plugin_change_program ags_dssi_plugin_new ags_lv2ui_manager_get_type ags_lv2ui_manager_get_default_path ags_lv2ui_manager_set_default_path ags_lv2ui_manager_get_filenames ags_lv2ui_manager_find_lv2ui_plugin ags_lv2ui_manager_find_lv2ui_plugin_with_index ags_lv2ui_manager_load_blacklist ags_lv2ui_manager_load_file ags_lv2ui_manager_load_default_directory ags_lv2ui_manager_get_instance ags_lv2ui_manager_new ags_lv2_event_manager_get_type ags_lv2_event_manager_lv2_event_ref ags_lv2_event_manager_lv2_event_unref ags_lv2_event_manager_get_instance ags_lv2_event_manager_new ags_ladspa_manager_get_type ags_ladspa_manager_get_default_path ags_ladspa_manager_set_default_path ags_ladspa_manager_get_filenames ags_ladspa_manager_find_ladspa_plugin ags_ladspa_manager_load_blacklist ags_ladspa_manager_load_file ags_ladspa_manager_load_default_directory ags_ladspa_manager_get_instance ags_ladspa_manager_new ags_lv2_conversion_get_type ags_lv2_conversion_test_flags ags_lv2_conversion_set_flags ags_lv2_conversion_unset_flags ags_lv2_conversion_new ags_lv2_urid_manager_get_type ags_lv2_urid_manager_insert ags_lv2_urid_manager_remove ags_lv2_urid_manager_lookup ags_lv2_urid_manager_load_default ags_lv2_urid_manager_map ags_lv2_urid_manager_unmap ags_lv2_urid_manager_get_instance ags_lv2_urid_manager_new ags_ladspa_plugin_get_type ags_ladspa_plugin_new ags_lv2_option_manager_get_type ags_lv2_option_ressource_alloc ags_lv2_option_manager_ressource_insert ags_lv2_option_manager_ressource_remove ags_lv2_option_manager_ressource_lookup ags_lv2_option_manager_ressource_lookup_extended ags_lv2_option_manager_get_option ags_lv2_option_manager_set_option ags_lv2_option_manager_lv2_options_get ags_lv2_option_manager_lv2_options_set ags_lv2_option_manager_get_instance ags_lv2_option_manager_new ags_wasapi_devout_get_type ags_wasapi_devout_error_quark ags_wasapi_devout_test_flags ags_wasapi_devout_set_flags ags_wasapi_devout_unset_flags ags_wasapi_devout_switch_buffer_flag ags_wasapi_devout_adjust_delay_and_attack ags_wasapi_devout_realloc_buffer ags_wasapi_devout_new ags_wasapi_devin_get_type ags_wasapi_devin_error_quark ags_wasapi_devin_test_flags ags_wasapi_devin_set_flags ags_wasapi_devin_unset_flags ags_wasapi_devin_switch_buffer_flag ags_wasapi_devin_adjust_delay_and_attack ags_wasapi_devin_realloc_buffer ags_wasapi_devin_new ags_recall_recycling_get_type ags_recall_recycling_new ags_devin_get_type ags_devin_error_quark ags_devin_test_flags ags_devin_set_flags ags_devin_unset_flags ags_devin_switch_buffer_flag ags_devin_adjust_delay_and_attack ags_devin_realloc_buffer ags_devin_new ags_fifoout_get_type ags_fifoout_error_quark ags_fifoout_test_flags ags_fifoout_set_flags ags_fifoout_unset_flags ags_fifoout_switch_buffer_flag ags_fifoout_adjust_delay_and_attack ags_fifoout_realloc_buffer ags_fifoout_new ags_synth_util_get_xcross_count_s8 ags_synth_util_get_xcross_count_s16 ags_synth_util_get_xcross_count_s24 ags_synth_util_get_xcross_count_s32 ags_synth_util_get_xcross_count_s64 ags_synth_util_get_xcross_count_float ags_synth_util_get_xcross_count_double ags_synth_util_get_xcross_count_complex ags_synth_util_get_xcross_count ags_synth_util_sin_s8 ags_synth_util_sin_s16 ags_synth_util_sin_s24 ags_synth_util_sin_s32 ags_synth_util_sin_s64 ags_synth_util_sin_float ags_synth_util_sin_double ags_synth_util_sin_complex ags_synth_util_sawtooth_s8 ags_synth_util_sawtooth_s16 ags_synth_util_sawtooth_s24 ags_synth_util_sawtooth_s32 ags_synth_util_sawtooth_s64 ags_synth_util_sawtooth_float ags_synth_util_sawtooth_double ags_synth_util_sawtooth_complex ags_synth_util_triangle_s8 ags_synth_util_triangle_s16 ags_synth_util_triangle_s24 ags_synth_util_triangle_s32 ags_synth_util_triangle_s64 ags_synth_util_triangle_float ags_synth_util_triangle_double ags_synth_util_triangle_complex ags_synth_util_square_s8 ags_synth_util_square_s16 ags_synth_util_square_s24 ags_synth_util_square_s32 ags_synth_util_square_s64 ags_synth_util_square_float ags_synth_util_square_double ags_synth_util_square_complex ags_synth_util_impulse_s8 ags_synth_util_impulse_s16 ags_synth_util_impulse_s24 ags_synth_util_impulse_s32 ags_synth_util_impulse_s64 ags_synth_util_impulse_float ags_synth_util_impulse_double ags_synth_util_impulse_complex ags_synth_util_sin ags_synth_util_sawtooth ags_synth_util_triangle ags_synth_util_square ags_synth_util_impulse ags_notation_get_type ags_notation_get_obj_mutex ags_notation_test_flags ags_notation_set_flags ags_notation_unset_flags ags_notation_find_near_timestamp ags_notation_add ags_notation_sort_func ags_notation_get_audio ags_notation_set_audio ags_notation_get_audio_channel ags_notation_set_audio_channel ags_notation_get_is_minor ags_notation_set_is_minor ags_notation_get_sharp_flats ags_notation_set_sharp_flats ags_notation_get_timestamp ags_notation_set_timestamp ags_notation_get_note ags_notation_set_note ags_notation_add_note ags_notation_remove_note ags_notation_remove_note_at_position ags_notation_get_selection ags_notation_is_note_selected ags_notation_find_point ags_notation_find_region ags_notation_find_offset ags_notation_free_selection ags_notation_add_point_to_selection ags_notation_remove_point_from_selection ags_notation_add_region_to_selection ags_notation_remove_region_from_selection ags_notation_add_all_to_selection ags_notation_copy_selection ags_notation_cut_selection ags_notation_insert_from_clipboard ags_notation_insert_from_clipboard_extended ags_notation_to_raw_midi ags_notation_from_raw_midi ags_notation_new ags_fm_synth_util_sin_s8 ags_fm_synth_util_sin_s16 ags_fm_synth_util_sin_s24 ags_fm_synth_util_sin_s32 ags_fm_synth_util_sin_s64 ags_fm_synth_util_sin_float ags_fm_synth_util_sin_double ags_fm_synth_util_sin_complex ags_fm_synth_util_sawtooth_s8 ags_fm_synth_util_sawtooth_s16 ags_fm_synth_util_sawtooth_s24 ags_fm_synth_util_sawtooth_s32 ags_fm_synth_util_sawtooth_s64 ags_fm_synth_util_sawtooth_float ags_fm_synth_util_sawtooth_double ags_fm_synth_util_sawtooth_complex ags_fm_synth_util_triangle_s8 ags_fm_synth_util_triangle_s16 ags_fm_synth_util_triangle_s24 ags_fm_synth_util_triangle_s32 ags_fm_synth_util_triangle_s64 ags_fm_synth_util_triangle_float ags_fm_synth_util_triangle_double ags_fm_synth_util_triangle_complex ags_fm_synth_util_square_s8 ags_fm_synth_util_square_s16 ags_fm_synth_util_square_s24 ags_fm_synth_util_square_s32 ags_fm_synth_util_square_s64 ags_fm_synth_util_square_float ags_fm_synth_util_square_double ags_fm_synth_util_square_complex ags_fm_synth_util_impulse_s8 ags_fm_synth_util_impulse_s16 ags_fm_synth_util_impulse_s24 ags_fm_synth_util_impulse_s32 ags_fm_synth_util_impulse_s64 ags_fm_synth_util_impulse_float ags_fm_synth_util_impulse_double ags_fm_synth_util_impulse_complex ags_fm_synth_util_sin ags_fm_synth_util_sawtooth ags_fm_synth_util_triangle ags_fm_synth_util_square ags_fm_synth_util_impulse ags_filter_util_pitch_s8 ags_filter_util_pitch_s16 ags_filter_util_pitch_s24 ags_filter_util_pitch_s32 ags_filter_util_pitch_s64 ags_filter_util_pitch_float ags_filter_util_pitch_double ags_filter_util_pitch_complex ags_recall_ladspa_run_get_type ags_recall_ladspa_run_new ags_recycling_get_type ags_recycling_get_obj_mutex ags_recycling_test_flags ags_recycling_set_flags ags_recycling_unset_flags ags_recycling_get_channel ags_recycling_set_channel ags_recycling_next ags_recycling_prev ags_recycling_get_output_soundcard ags_recycling_set_output_soundcard ags_recycling_get_input_soundcard ags_recycling_set_input_soundcard ags_recycling_get_samplerate ags_recycling_set_samplerate ags_recycling_get_buffer_size ags_recycling_set_buffer_size ags_recycling_get_format ags_recycling_set_format ags_recycling_get_audio_signal ags_recycling_set_audio_signal ags_recycling_add_audio_signal ags_recycling_remove_audio_signal ags_recycling_data_request ags_recycling_position ags_recycling_find_next_channel ags_recycling_is_active ags_recycling_create_audio_signal_with_defaults ags_recycling_create_audio_signal_with_frame_count ags_recycling_new ags_sound_provider_get_type ags_sound_provider_set_default_soundcard ags_sound_provider_get_default_soundcard ags_sound_provider_set_default_soundcard_thread ags_sound_provider_get_default_soundcard_thread ags_sound_provider_set_soundcard ags_sound_provider_get_soundcard ags_sound_provider_set_sequencer ags_sound_provider_get_sequencer ags_sound_provider_set_audio ags_sound_provider_get_audio ags_sound_provider_set_sound_server ags_sound_provider_get_sound_server ags_sound_provider_set_osc_server ags_sound_provider_get_osc_server ags_recall_channel_run_get_type ags_recall_channel_run_get_recall_audio ags_recall_channel_run_set_recall_audio ags_recall_channel_run_get_recall_audio_run ags_recall_channel_run_set_recall_audio_run ags_recall_channel_run_get_recall_channel ags_recall_channel_run_set_recall_channel ags_recall_channel_run_get_destination ags_recall_channel_run_set_destination ags_recall_channel_run_get_source ags_recall_channel_run_set_source ags_recall_channel_run_new ags_soundcard_util_get_obj_mutex ags_recall_audio_run_get_type ags_recall_audio_run_get_audio ags_recall_audio_run_set_audio ags_recall_audio_run_get_recall_audio ags_recall_audio_run_set_recall_audio ags_recall_audio_run_new ags_devout_get_type ags_devout_error_quark ags_devout_test_flags ags_devout_set_flags ags_devout_unset_flags ags_devout_switch_buffer_flag ags_devout_adjust_delay_and_attack ags_devout_realloc_buffer ags_devout_new ags_pulse_port_get_type ags_pulse_port_test_flags ags_pulse_port_set_flags ags_pulse_port_unset_flags ags_pulse_port_find ags_pulse_port_register ags_pulse_port_unregister ags_pulse_port_get_fixed_size ags_pulse_port_set_samplerate ags_pulse_port_set_pcm_channels ags_pulse_port_set_buffer_size ags_pulse_port_set_format ags_pulse_port_set_cache_buffer_size ags_pulse_port_get_latency ags_pulse_port_new ags_pulse_server_get_type ags_pulse_server_test_flags ags_pulse_server_set_flags ags_pulse_server_unset_flags ags_pulse_server_find_url ags_pulse_server_find_client ags_pulse_server_find_port ags_pulse_server_add_client ags_pulse_server_remove_client ags_pulse_server_connect_client ags_pulse_server_disconnect_client ags_pulse_server_start_poll ags_pulse_server_new ags_pulse_client_get_type ags_pulse_client_test_flags ags_pulse_client_set_flags ags_pulse_client_unset_flags ags_pulse_client_find_uuid ags_pulse_client_find ags_pulse_client_open ags_pulse_client_close ags_pulse_client_add_device ags_pulse_client_remove_device ags_pulse_client_add_port ags_pulse_client_remove_port ags_pulse_client_activate ags_pulse_client_deactivate ags_pulse_client_new ags_pulse_devin_get_type ags_pulse_devin_error_quark ags_pulse_devin_test_flags ags_pulse_devin_set_flags ags_pulse_devin_unset_flags ags_pulse_devin_switch_buffer_flag ags_pulse_devin_adjust_delay_and_attack ags_pulse_devin_realloc_buffer ags_pulse_devin_new ags_pulse_devout_get_type ags_pulse_devout_error_quark ags_pulse_devout_test_flags ags_pulse_devout_set_flags ags_pulse_devout_unset_flags ags_pulse_devout_switch_buffer_flag ags_pulse_devout_adjust_delay_and_attack ags_pulse_devout_realloc_buffer ags_pulse_devout_new ags_audio_get_type ags_audio_get_obj_mutex ags_audio_get_play_mutex ags_audio_get_recall_mutex ags_audio_test_flags ags_audio_set_flags ags_audio_unset_flags ags_audio_test_ability_flags ags_audio_set_ability_flags ags_audio_unset_ability_flags ags_audio_test_behaviour_flags ags_audio_set_behaviour_flags ags_audio_unset_behaviour_flags ags_audio_test_staging_flags ags_audio_set_staging_flags ags_audio_unset_staging_flags ags_audio_get_audio_name ags_audio_set_audio_name ags_audio_find_name ags_audio_get_max_audio_channels ags_audio_set_max_audio_channels ags_audio_get_max_output_pads ags_audio_set_max_output_pads ags_audio_get_max_input_pads ags_audio_set_max_input_pads ags_audio_set_max_pads ags_audio_get_audio_channels ags_audio_set_audio_channels ags_audio_get_output_pads ags_audio_set_output_pads ags_audio_get_input_pads ags_audio_set_input_pads ags_audio_set_pads ags_audio_get_output_lines ags_audio_get_input_lines ags_audio_get_output ags_audio_get_input ags_audio_get_output_soundcard ags_audio_set_output_soundcard ags_audio_get_input_soundcard ags_audio_set_input_soundcard ags_audio_get_output_sequencer ags_audio_set_output_sequencer ags_audio_get_input_sequencer ags_audio_set_input_sequencer ags_audio_get_samplerate ags_audio_set_samplerate ags_audio_get_buffer_size ags_audio_set_buffer_size ags_audio_get_format ags_audio_set_format ags_audio_get_bpm ags_audio_set_bpm ags_audio_get_audio_start_mapping ags_audio_set_audio_start_mapping ags_audio_get_midi_start_mapping ags_audio_set_midi_start_mapping ags_audio_get_midi_channel ags_audio_set_midi_channel ags_audio_get_numerator ags_audio_set_numerator ags_audio_get_denominator ags_audio_set_denominator ags_audio_get_time_signature ags_audio_set_time_signature ags_audio_get_is_minor ags_audio_set_is_minor ags_audio_get_sharp_flats ags_audio_set_sharp_flats ags_audio_get_octave ags_audio_set_octave ags_audio_get_key ags_audio_set_key ags_audio_get_absolute_key ags_audio_set_absolute_key ags_audio_get_preset ags_audio_set_preset ags_audio_add_preset ags_audio_remove_preset ags_audio_get_playback_domain ags_audio_set_playback_domain ags_audio_get_synth_generator ags_audio_set_synth_generator ags_audio_add_synth_generator ags_audio_remove_synth_generator ags_audio_get_cursor ags_audio_set_cursor ags_audio_add_cursor ags_audio_remove_cursor ags_audio_get_notation ags_audio_set_notation ags_audio_add_notation ags_audio_remove_notation ags_audio_get_automation_port ags_audio_set_automation_port ags_audio_add_automation_port ags_audio_remove_automation_port ags_audio_get_automation ags_audio_set_automation ags_audio_add_automation ags_audio_remove_automation ags_audio_get_wave ags_audio_set_wave ags_audio_add_wave ags_audio_remove_wave ags_audio_get_output_audio_file ags_audio_set_output_audio_file ags_audio_get_input_audio_file ags_audio_set_input_audio_file ags_audio_get_instrument_name ags_audio_set_instrument_name ags_audio_get_track_name ags_audio_set_track_name ags_audio_get_midi ags_audio_set_midi ags_audio_add_midi ags_audio_remove_midi ags_audio_get_output_midi_file ags_audio_set_output_midi_file ags_audio_get_input_midi_file ags_audio_set_input_midi_file ags_audio_get_recall_id ags_audio_set_recall_id ags_audio_add_recall_id ags_audio_remove_recall_id ags_audio_get_recycling_context ags_audio_set_recycling_context ags_audio_add_recycling_context ags_audio_remove_recycling_context ags_audio_get_recall_container ags_audio_set_recall_container ags_audio_add_recall_container ags_audio_remove_recall_container ags_audio_get_play ags_audio_set_play ags_audio_get_recall ags_audio_set_recall ags_audio_add_recall ags_audio_remove_recall ags_audio_duplicate_recall ags_audio_resolve_recall ags_audio_init_recall ags_audio_play_recall ags_audio_done_recall ags_audio_cancel_recall ags_audio_cleanup_recall ags_audio_start ags_audio_stop ags_audio_check_scope ags_audio_collect_all_audio_ports ags_audio_collect_all_audio_ports_by_specifier_and_context ags_audio_open_audio_file_as_channel ags_audio_open_audio_file_as_wave ags_audio_open_midi_file_as_midi ags_audio_open_midi_file_as_notation ags_audio_recursive_set_property ags_audio_recursive_run_stage ags_audio_new ags_recall_dssi_run_get_type ags_recall_dssi_run_new ags_audio_buffer_util_format_from_soundcard ags_audio_buffer_util_get_copy_mode ags_audio_buffer_util_clear_float ags_audio_buffer_util_clear_float32 ags_audio_buffer_util_clear_double ags_audio_buffer_util_clear_complex ags_audio_buffer_util_clear_buffer ags_audio_buffer_util_envelope_s8 ags_audio_buffer_util_envelope_s16 ags_audio_buffer_util_envelope_s24 ags_audio_buffer_util_envelope_s32 ags_audio_buffer_util_envelope_s64 ags_audio_buffer_util_envelope_float ags_audio_buffer_util_envelope_double ags_audio_buffer_util_envelope_complex ags_audio_buffer_util_envelope ags_audio_buffer_util_volume_s8 ags_audio_buffer_util_volume_s16 ags_audio_buffer_util_volume_s24 ags_audio_buffer_util_volume_s32 ags_audio_buffer_util_volume_s64 ags_audio_buffer_util_volume_float ags_audio_buffer_util_volume_double ags_audio_buffer_util_volume_complex ags_audio_buffer_util_volume ags_audio_buffer_util_peak_s8 ags_audio_buffer_util_peak_s16 ags_audio_buffer_util_peak_s24 ags_audio_buffer_util_peak_s32 ags_audio_buffer_util_peak_s64 ags_audio_buffer_util_peak_float ags_audio_buffer_util_peak_double ags_audio_buffer_util_peak_complex ags_audio_buffer_util_peak ags_audio_buffer_util_resample_s8 ags_audio_buffer_util_resample_s16 ags_audio_buffer_util_resample_s24 ags_audio_buffer_util_resample_s32 ags_audio_buffer_util_resample_s64 ags_audio_buffer_util_resample_float ags_audio_buffer_util_resample_double ags_audio_buffer_util_resample_complex ags_audio_buffer_util_resample ags_audio_buffer_util_resample_s8_with_buffer ags_audio_buffer_util_resample_s16_with_buffer ags_audio_buffer_util_resample_s24_with_buffer ags_audio_buffer_util_resample_s32_with_buffer ags_audio_buffer_util_resample_s64_with_buffer ags_audio_buffer_util_resample_float_with_buffer ags_audio_buffer_util_resample_double_with_buffer ags_audio_buffer_util_resample_complex_with_buffer ags_audio_buffer_util_resample_with_buffer ags_audio_buffer_util_copy_s8_to_s8 ags_audio_buffer_util_copy_s8_to_s16 ags_audio_buffer_util_copy_s8_to_s24 ags_audio_buffer_util_copy_s8_to_s32 ags_audio_buffer_util_copy_s8_to_s64 ags_audio_buffer_util_copy_s8_to_float ags_audio_buffer_util_copy_s8_to_double ags_audio_buffer_util_copy_s16_to_s8 ags_audio_buffer_util_copy_s16_to_s16 ags_audio_buffer_util_copy_s16_to_s24 ags_audio_buffer_util_copy_s16_to_s32 ags_audio_buffer_util_copy_s16_to_s64 ags_audio_buffer_util_copy_s16_to_float ags_audio_buffer_util_copy_s16_to_double ags_audio_buffer_util_copy_s24_to_s8 ags_audio_buffer_util_copy_s24_to_s16 ags_audio_buffer_util_copy_s24_to_s24 ags_audio_buffer_util_copy_s24_to_s32 ags_audio_buffer_util_copy_s24_to_s64 ags_audio_buffer_util_copy_s24_to_float ags_audio_buffer_util_copy_s24_to_double ags_audio_buffer_util_copy_s32_to_s8 ags_audio_buffer_util_copy_s32_to_s16 ags_audio_buffer_util_copy_s32_to_s24 ags_audio_buffer_util_copy_s32_to_s32 ags_audio_buffer_util_copy_s32_to_s64 ags_audio_buffer_util_copy_s32_to_float ags_audio_buffer_util_copy_s32_to_double ags_audio_buffer_util_copy_s64_to_s8 ags_audio_buffer_util_copy_s64_to_s16 ags_audio_buffer_util_copy_s64_to_s24 ags_audio_buffer_util_copy_s64_to_s32 ags_audio_buffer_util_copy_s64_to_s64 ags_audio_buffer_util_copy_s64_to_float ags_audio_buffer_util_copy_s64_to_double ags_audio_buffer_util_copy_float_to_s8 ags_audio_buffer_util_copy_float_to_s16 ags_audio_buffer_util_copy_float_to_s24 ags_audio_buffer_util_copy_float_to_s32 ags_audio_buffer_util_copy_float_to_s64 ags_audio_buffer_util_copy_float_to_float ags_audio_buffer_util_copy_float_to_double ags_audio_buffer_util_copy_double_to_s8 ags_audio_buffer_util_copy_double_to_s16 ags_audio_buffer_util_copy_double_to_s24 ags_audio_buffer_util_copy_double_to_s32 ags_audio_buffer_util_copy_double_to_s64 ags_audio_buffer_util_copy_double_to_float ags_audio_buffer_util_copy_double_to_double ags_audio_buffer_util_copy_s8_to_float32 ags_audio_buffer_util_copy_s16_to_float32 ags_audio_buffer_util_copy_s24_to_float32 ags_audio_buffer_util_copy_s32_to_float32 ags_audio_buffer_util_copy_s64_to_float32 ags_audio_buffer_util_copy_float_to_float32 ags_audio_buffer_util_copy_double_to_float32 ags_audio_buffer_util_copy_float32_to_float32 ags_audio_buffer_util_copy_float32_to_s8 ags_audio_buffer_util_copy_float32_to_s16 ags_audio_buffer_util_copy_float32_to_s24 ags_audio_buffer_util_copy_float32_to_s32 ags_audio_buffer_util_copy_float32_to_s64 ags_audio_buffer_util_copy_float32_to_float ags_audio_buffer_util_copy_float32_to_double ags_audio_buffer_util_copy_s8_to_complex ags_audio_buffer_util_copy_s16_to_complex ags_audio_buffer_util_copy_s24_to_complex ags_audio_buffer_util_copy_s32_to_complex ags_audio_buffer_util_copy_s64_to_complex ags_audio_buffer_util_copy_float_to_complex ags_audio_buffer_util_copy_double_to_complex ags_audio_buffer_util_copy_float32_to_complex ags_audio_buffer_util_copy_complex_to_complex ags_audio_buffer_util_copy_complex_to_s8 ags_audio_buffer_util_copy_complex_to_s16 ags_audio_buffer_util_copy_complex_to_s24 ags_audio_buffer_util_copy_complex_to_s32 ags_audio_buffer_util_copy_complex_to_s64 ags_audio_buffer_util_copy_complex_to_float ags_audio_buffer_util_copy_complex_to_double ags_audio_buffer_util_copy_complex_to_float32 ags_audio_buffer_util_copy_buffer_to_buffer ags_recycling_context_get_type ags_recycling_context_find_scope ags_recycling_context_replace ags_recycling_context_add ags_recycling_context_remove ags_recycling_context_insert ags_recycling_context_get_toplevel ags_recycling_context_find ags_recycling_context_find_child ags_recycling_context_find_parent ags_recycling_context_add_child ags_recycling_context_remove_child ags_recycling_context_get_child_recall_id ags_recycling_context_reset_recycling ags_recycling_context_new ags_recall_audio_get_type ags_recall_audio_get_audio ags_recall_audio_set_audio ags_recall_audio_new ags_recall_audio_signal_get_type ags_recall_audio_signal_new ags_loop_channel_get_type ags_loop_channel_new ags_mute_audio_run_get_type ags_mute_audio_run_new ags_volume_recycling_get_type ags_volume_recycling_new ags_volume_channel_get_type ags_volume_channel_new ags_peak_channel_get_type ags_peak_channel_buffer_add ags_peak_channel_retrieve_peak_internal ags_peak_channel_new ags_play_recycling_get_type ags_play_recycling_new ags_record_midi_audio_run_get_type ags_record_midi_audio_run_new ags_copy_pattern_audio_run_get_type ags_copy_pattern_audio_run_new ags_stream_recycling_get_type ags_stream_recycling_new ags_feed_audio_signal_get_type ags_feed_audio_signal_new ags_envelope_channel_run_get_type ags_envelope_channel_run_new ags_prepare_audio_signal_get_type ags_prepare_audio_signal_new ags_lfo_recycling_get_type ags_lfo_recycling_new ags_play_channel_get_type ags_play_channel_new ags_mute_audio_signal_get_type ags_mute_audio_signal_new ags_lfo_channel_get_type ags_lfo_channel_new ags_count_beats_audio_run_get_type ags_count_beats_audio_run_sequencer_start ags_count_beats_audio_run_sequencer_loop ags_count_beats_audio_run_sequencer_stop ags_count_beats_audio_run_notation_start ags_count_beats_audio_run_notation_loop ags_count_beats_audio_run_notation_stop ags_count_beats_audio_run_wave_start ags_count_beats_audio_run_wave_loop ags_count_beats_audio_run_wave_stop ags_count_beats_audio_run_midi_start ags_count_beats_audio_run_midi_loop ags_count_beats_audio_run_midi_stop ags_count_beats_audio_run_new ags_play_channel_run_master_get_type ags_play_channel_run_master_test_flags ags_play_channel_run_master_set_flags ags_play_channel_run_master_unset_flags ags_play_channel_run_master_new ags_play_wave_audio_run_get_type ags_play_wave_audio_run_new ags_copy_recycling_get_type ags_copy_recycling_new ags_prepare_channel_run_get_type ags_prepare_channel_run_new ags_play_dssi_audio_run_get_type ags_play_dssi_audio_run_load_ports ags_play_dssi_audio_run_new ags_eq10_channel_get_type ags_eq10_channel_new ags_analyse_channel_run_get_type ags_analyse_channel_run_new ags_peak_audio_signal_get_type ags_peak_audio_signal_new ags_prepare_recycling_get_type ags_prepare_recycling_new ags_stream_channel_run_get_type ags_stream_channel_run_new ags_capture_wave_channel_run_get_type ags_capture_wave_channel_run_new ags_route_lv2_audio_run_get_type ags_route_lv2_audio_run_new ags_play_wave_audio_get_type ags_play_wave_audio_new ags_mute_channel_run_get_type ags_mute_channel_run_new ags_feed_recycling_get_type ags_feed_recycling_new ags_envelope_audio_signal_get_type ags_envelope_audio_signal_new ags_route_dssi_audio_run_get_type ags_route_dssi_audio_run_new ags_analyse_channel_get_type ags_analyse_channel_buffer_add ags_analyse_channel_retrieve_frequency_and_magnitude ags_analyse_channel_new ags_stream_audio_signal_get_type ags_stream_audio_signal_new ags_play_dssi_audio_get_type ags_play_dssi_audio_load ags_play_dssi_audio_load_ports ags_play_dssi_audio_load_conversion ags_play_dssi_audio_find ags_play_dssi_audio_new ags_volume_audio_signal_get_type ags_volume_audio_signal_new ags_peak_recycling_get_type ags_peak_recycling_new ags_rt_stream_channel_get_type ags_rt_stream_channel_new ags_play_notation_audio_get_type ags_play_notation_audio_new ags_envelope_channel_get_type ags_envelope_channel_new ags_play_channel_run_get_type ags_play_channel_run_test_flags ags_play_channel_run_set_flags ags_play_channel_run_unset_flags ags_play_channel_run_new ags_count_beats_audio_get_type ags_count_beats_audio_new ags_envelope_recycling_get_type ags_envelope_recycling_new ags_play_lv2_audio_run_get_type ags_play_lv2_audio_run_load_ports ags_play_lv2_audio_run_new ags_analyse_recycling_get_type ags_analyse_recycling_new ags_buffer_recycling_get_type ags_buffer_recycling_new ags_rt_stream_audio_signal_get_type ags_rt_stream_audio_signal_new ags_buffer_audio_signal_get_type ags_buffer_audio_signal_new ags_stream_channel_get_type ags_stream_channel_new ags_record_midi_audio_get_type ags_record_midi_audio_new ags_volume_channel_run_get_type ags_volume_channel_run_new ags_play_audio_signal_get_type ags_play_audio_signal_new ags_feed_channel_get_type ags_feed_channel_new ags_mute_audio_get_type ags_mute_audio_new ags_peak_channel_run_get_type ags_peak_channel_run_new ags_copy_audio_signal_get_type ags_copy_audio_signal_new ags_play_notation_audio_run_get_type ags_play_notation_audio_run_new ags_copy_channel_run_get_type ags_copy_channel_run_new ags_eq10_audio_signal_get_type ags_eq10_audio_signal_new ags_analyse_audio_signal_get_type ags_analyse_audio_signal_new ags_feed_channel_run_get_type ags_feed_channel_run_new ags_play_audio_get_type ags_play_audio_new ags_route_lv2_audio_get_type ags_route_lv2_audio_new ags_lfo_audio_signal_get_type ags_lfo_audio_signal_new ags_copy_channel_get_type ags_copy_channel_new ags_capture_wave_channel_get_type ags_capture_wave_channel_new ags_delay_audio_run_get_type ags_delay_audio_run_sequencer_alloc_output ags_delay_audio_run_sequencer_alloc_input ags_delay_audio_run_sequencer_count ags_delay_audio_run_notation_alloc_output ags_delay_audio_run_notation_alloc_input ags_delay_audio_run_notation_count ags_delay_audio_run_wave_alloc_output ags_delay_audio_run_wave_alloc_input ags_delay_audio_run_wave_count ags_delay_audio_run_midi_alloc_output ags_delay_audio_run_midi_alloc_input ags_delay_audio_run_midi_count ags_delay_audio_run_new ags_buffer_channel_run_get_type ags_buffer_channel_run_new ags_mute_recycling_get_type ags_mute_recycling_new ags_buffer_channel_get_type ags_buffer_channel_new ags_loop_channel_run_get_type ags_loop_channel_run_new ags_route_dssi_audio_get_type ags_route_dssi_audio_new ags_delay_audio_get_type ags_delay_audio_sequencer_duration_changed ags_delay_audio_notation_duration_changed ags_delay_audio_wave_duration_changed ags_delay_audio_midi_duration_changed ags_delay_audio_new ags_copy_pattern_channel_run_get_type ags_copy_pattern_channel_run_new ags_lfo_channel_run_get_type ags_lfo_channel_run_new ags_capture_wave_audio_get_type ags_capture_wave_audio_new ags_play_wave_channel_run_get_type ags_play_wave_channel_run_new ags_rt_stream_recycling_get_type ags_rt_stream_recycling_new ags_copy_pattern_channel_get_type ags_copy_pattern_channel_new ags_mute_channel_get_type ags_mute_channel_new ags_play_wave_channel_get_type ags_play_wave_channel_new ags_copy_pattern_audio_get_type ags_copy_pattern_audio_new ags_eq10_channel_run_get_type ags_eq10_channel_run_new ags_capture_wave_audio_run_get_type ags_capture_wave_audio_run_new ags_play_lv2_audio_get_type ags_play_lv2_audio_test_flags ags_play_lv2_audio_set_flags ags_play_lv2_audio_unset_flags ags_play_lv2_audio_load ags_play_lv2_audio_load_ports ags_play_lv2_audio_load_conversion ags_play_lv2_audio_find ags_play_lv2_audio_new ags_prepare_channel_get_type ags_prepare_channel_new ags_rt_stream_channel_run_get_type ags_rt_stream_channel_run_new ags_eq10_recycling_get_type ags_eq10_recycling_new ags_recall_dssi_get_type ags_recall_dssi_load ags_recall_dssi_load_ports ags_recall_dssi_load_conversion ags_recall_dssi_find ags_recall_dssi_new ags_frequency_map_manager_get_type ags_frequency_map_manager_test_flags ags_frequency_map_manager_set_flags ags_frequency_map_manager_unset_flags ags_frequency_map_manager_add_frequency_map ags_frequency_map_manager_add_factorized_frequency_map ags_frequency_map_manager_find_frequency_map ags_frequency_map_manager_find_factorized_frequency_map ags_frequency_map_manager_load_default ags_frequency_map_manager_get_instance ags_frequency_map_manager_new ags_recall_dependency_get_type ags_recall_dependency_find_dependency ags_recall_dependency_find_dependency_by_provider ags_recall_dependency_resolve ags_recall_dependency_new ags_automation_get_type ags_automation_get_obj_mutex ags_automation_test_flags ags_automation_set_flags ags_automation_unset_flags ags_automation_find_port ags_automation_find_near_timestamp ags_automation_find_near_timestamp_extended ags_automation_sort_func ags_automation_add ags_automation_get_audio ags_automation_set_audio ags_automation_get_channel_type ags_automation_set_channel_type ags_automation_get_line ags_automation_set_line ags_automation_get_timestamp ags_automation_set_timestamp ags_automation_get_control_name ags_automation_set_control_name ags_automation_get_steps ags_automation_set_steps ags_automation_get_upper ags_automation_set_upper ags_automation_get_lower ags_automation_set_lower ags_automation_get_default_value ags_automation_set_default_value ags_automation_get_port ags_automation_set_port ags_automation_get_acceleration ags_automation_set_acceleration ags_automation_add_acceleration ags_automation_remove_acceleration ags_automation_remove_acceleration_at_position ags_automation_get_selection ags_automation_is_acceleration_selected ags_automation_find_point ags_automation_find_region ags_automation_free_selection ags_automation_add_point_to_selection ags_automation_remove_point_from_selection ags_automation_add_region_to_selection ags_automation_remove_region_from_selection ags_automation_add_all_to_selection ags_automation_copy_selection ags_automation_cut_selection ags_automation_insert_from_clipboard ags_automation_insert_from_clipboard_extended ags_automation_get_specifier_unique ags_automation_get_specifier_unique_with_channel_type ags_automation_find_specifier ags_automation_find_channel_type_with_control_name ags_automation_find_specifier_with_type_and_line ags_automation_get_value ags_automation_new ags_jack_client_get_type ags_jack_client_test_flags ags_jack_client_set_flags ags_jack_client_unset_flags ags_jack_client_find_uuid ags_jack_client_find ags_jack_client_open ags_jack_client_close ags_jack_client_add_device ags_jack_client_remove_device ags_jack_client_add_port ags_jack_client_remove_port ags_jack_client_activate ags_jack_client_deactivate ags_jack_client_new ags_jack_devin_get_type ags_jack_devin_error_quark ags_jack_devin_test_flags ags_jack_devin_set_flags ags_jack_devin_unset_flags ags_jack_devin_switch_buffer_flag ags_jack_devin_adjust_delay_and_attack ags_jack_devin_realloc_buffer ags_jack_devin_new ags_jack_devout_get_type ags_jack_devout_error_quark ags_jack_devout_test_flags ags_jack_devout_set_flags ags_jack_devout_unset_flags ags_jack_devout_switch_buffer_flag ags_jack_devout_adjust_delay_and_attack ags_jack_devout_realloc_buffer ags_jack_devout_new ags_jack_port_get_type ags_jack_port_test_flags ags_jack_port_set_flags ags_jack_port_unset_flags ags_jack_port_find ags_jack_port_register ags_jack_port_unregister ags_jack_port_new ags_jack_server_get_type ags_jack_server_test_flags ags_jack_server_set_flags ags_jack_server_unset_flags ags_jack_server_find_url ags_jack_server_find_client ags_jack_server_find_port ags_jack_server_add_client ags_jack_server_remove_client ags_jack_server_connect_client ags_jack_server_disconnect_client ags_jack_server_new ags_jack_midiin_get_type ags_jack_midiin_error_quark ags_jack_midiin_test_flags ags_jack_midiin_set_flags ags_jack_midiin_unset_flags ags_jack_midiin_switch_buffer_flag ags_jack_midiin_new ags_audio_signal_get_type ags_audio_signal_get_obj_mutex ags_audio_signal_stream_lock ags_audio_signal_stream_unlock ags_audio_signal_test_flags ags_audio_signal_set_flags ags_audio_signal_unset_flags ags_stream_alloc ags_stream_free ags_audio_signal_get_recycling ags_audio_signal_set_recycling ags_audio_signal_get_output_soundcard ags_audio_signal_set_output_soundcard ags_audio_signal_get_input_soundcard ags_audio_signal_set_input_soundcard ags_audio_signal_get_samplerate ags_audio_signal_set_samplerate ags_audio_signal_get_buffer_size ags_audio_signal_set_buffer_size ags_audio_signal_get_format ags_audio_signal_set_format ags_audio_signal_get_note ags_audio_signal_set_note ags_audio_signal_add_note ags_audio_signal_remove_note ags_audio_signal_refresh_data ags_audio_signal_add_stream ags_audio_signal_stream_resize ags_audio_signal_stream_safe_resize ags_audio_signal_duplicate_stream ags_audio_signal_feed ags_audio_signal_get_length_till_current ags_audio_signal_get_template ags_audio_signal_get_rt_template ags_audio_signal_find_stream_current ags_audio_signal_find_by_recall_id ags_audio_signal_is_active ags_audio_signal_new ags_audio_signal_new_with_length ags_buffer_get_type ags_buffer_get_obj_mutex ags_buffer_lock ags_buffer_unlock ags_buffer_test_flags ags_buffer_set_flags ags_buffer_unset_flags ags_buffer_sort_func ags_buffer_get_x ags_buffer_set_x ags_buffer_get_samplerate ags_buffer_set_samplerate ags_buffer_get_buffer_size ags_buffer_set_buffer_size ags_buffer_get_format ags_buffer_set_format ags_buffer_get_data ags_buffer_duplicate ags_buffer_new ags_generic_recall_recycling_get_type ags_generic_recall_recycling_new ags_generic_recall_channel_run_get_type ags_generic_recall_channel_run_new ags_apply_presets_get_type ags_apply_presets_soundcard ags_apply_presets_new ags_resize_audio_get_type ags_resize_audio_new ags_start_audio_get_type ags_start_audio_new ags_free_selection_get_type ags_free_selection_new ags_start_sequencer_get_type ags_start_sequencer_new ags_cancel_channel_get_type ags_cancel_channel_new ags_set_audio_channels_get_type ags_set_audio_channels_new ags_open_single_file_get_type ags_open_single_file_new ags_start_channel_get_type ags_start_channel_new ags_open_sf2_instrument_get_type ags_open_sf2_instrument_new ags_remove_audio_signal_get_type ags_remove_audio_signal_new ags_add_note_get_type ags_add_note_new ags_export_output_get_type ags_export_output_new ags_add_soundcard_get_type ags_add_soundcard_new ags_add_effect_get_type ags_add_effect_new ags_add_audio_signal_get_type ags_add_audio_signal_new ags_open_file_get_type ags_open_file_new ags_reset_peak_get_type ags_reset_peak_add ags_reset_peak_remove ags_reset_peak_get_instance ags_reset_peak_new ags_link_channel_get_type ags_link_channel_new ags_stop_sequencer_get_type ags_stop_sequencer_new ags_reset_note_get_type ags_reset_note_add ags_reset_note_remove ags_reset_note_get_instance ags_reset_note_new ags_tic_device_get_type ags_tic_device_new ags_apply_sequencer_length_get_type ags_apply_sequencer_length_new ags_remove_note_get_type ags_remove_note_new ags_set_buffer_size_get_type ags_set_buffer_size_new ags_apply_tact_get_type ags_apply_tact_new ags_clear_buffer_get_type ags_clear_buffer_new ags_set_format_get_type ags_set_format_new ags_set_muted_get_type ags_set_muted_new ags_open_wave_get_type ags_open_wave_new ags_cancel_audio_get_type ags_cancel_audio_new ags_remove_audio_get_type ags_remove_audio_new ags_set_samplerate_get_type ags_set_samplerate_new ags_apply_bpm_get_type ags_apply_bpm_new ags_apply_sound_config_get_type ags_apply_sound_config_new ags_open_sf2_sample_get_type ags_open_sf2_sample_new ags_start_soundcard_get_type ags_start_soundcard_new ags_clear_audio_signal_get_type ags_clear_audio_signal_new ags_switch_buffer_flag_get_type ags_switch_buffer_flag_new ags_toggle_pattern_bit_get_type ags_toggle_pattern_bit_refresh_gui ags_toggle_pattern_bit_new ags_stop_soundcard_get_type ags_stop_soundcard_new ags_reset_amplitude_get_type ags_reset_amplitude_add ags_reset_amplitude_remove ags_reset_amplitude_get_instance ags_reset_amplitude_new ags_crop_note_get_type ags_crop_note_new ags_set_device_get_type ags_set_device_new ags_apply_synth_get_type ags_apply_synth_new ags_add_audio_get_type ags_add_audio_new ags_seek_soundcard_get_type ags_seek_soundcard_new ags_move_note_get_type ags_move_note_new ags_remove_soundcard_get_type ags_remove_soundcard_new ags_output_get_type ags_output_find_first_input_recycling ags_output_find_last_input_recycling ags_output_new ags_input_get_type ags_input_is_active ags_input_next_active ags_input_add_synth_generator ags_input_remove_synth_generator ags_input_open_file ags_input_new ags_midi_parser_get_type ags_midi_parser_read_gint16 ags_midi_parser_read_gint24 ags_midi_parser_read_gint32 ags_midi_parser_read_varlength ags_midi_parser_read_text ags_midi_parser_ticks_to_sec ags_midi_parser_midi_getc ags_midi_parser_on_error ags_midi_parser_parse_full ags_midi_parser_parse_bytes ags_midi_parser_parse_header ags_midi_parser_parse_track ags_midi_parser_channel_message ags_midi_parser_key_on ags_midi_parser_key_off ags_midi_parser_key_pressure ags_midi_parser_change_parameter ags_midi_parser_change_pitch_bend ags_midi_parser_change_program ags_midi_parser_change_channel_pressure ags_midi_parser_not_defined ags_midi_parser_sysex ags_midi_parser_system_common ags_midi_parser_meta_event ags_midi_parser_sequence_number ags_midi_parser_end_of_track ags_midi_parser_smtpe ags_midi_parser_tempo ags_midi_parser_time_signature ags_midi_parser_key_signature ags_midi_parser_sequencer_meta_event ags_midi_parser_meta_misc ags_midi_parser_text_event ags_midi_parser_new ags_midi_builder_get_type ags_midi_builder_header_alloc ags_midi_builder_header_free ags_midi_builder_track_alloc ags_midi_builder_track_free ags_midi_builder_track_find_delta_time_with_track_name ags_midi_builder_track_insert_midi_message ags_midi_builder_track_get_delta_time_offset ags_midi_builder_midi_putc ags_midi_builder_on_error ags_midi_builder_append_header ags_midi_builder_append_track ags_midi_builder_append_key_on ags_midi_builder_append_key_off ags_midi_builder_append_key_pressure ags_midi_builder_append_change_parameter ags_midi_builder_append_change_pitch_bend ags_midi_builder_append_change_program ags_midi_builder_append_change_pressure ags_midi_builder_append_sysex ags_midi_builder_append_quarter_frame ags_midi_builder_append_song_position ags_midi_builder_append_song_select ags_midi_builder_append_tune_request ags_midi_builder_append_sequence_number ags_midi_builder_append_smtpe ags_midi_builder_append_tempo ags_midi_builder_append_time_signature ags_midi_builder_append_key_signature ags_midi_builder_append_sequencer_meta_event ags_midi_builder_append_text_event ags_midi_builder_append_xml_node ags_midi_builder_from_xml_doc ags_midi_builder_build ags_midi_builder_new ags_midi_buffer_util_get_varlength_size ags_midi_buffer_util_put_varlength ags_midi_buffer_util_get_varlength ags_midi_buffer_util_put_int16 ags_midi_buffer_util_get_int16 ags_midi_buffer_util_put_int24 ags_midi_buffer_util_get_int24 ags_midi_buffer_util_put_int32 ags_midi_buffer_util_get_int32 ags_midi_buffer_util_put_header ags_midi_buffer_util_get_header ags_midi_buffer_util_put_track ags_midi_buffer_util_get_track ags_midi_buffer_util_put_key_on ags_midi_buffer_util_get_key_on ags_midi_buffer_util_put_key_off ags_midi_buffer_util_get_key_off ags_midi_buffer_util_put_key_pressure ags_midi_buffer_util_get_key_pressure ags_midi_buffer_util_put_change_parameter ags_midi_buffer_util_get_change_parameter ags_midi_buffer_util_put_pitch_bend ags_midi_buffer_util_get_pitch_bend ags_midi_buffer_util_put_change_program ags_midi_buffer_util_get_change_program ags_midi_buffer_util_put_change_pressure ags_midi_buffer_util_get_change_pressure ags_midi_buffer_util_put_sysex ags_midi_buffer_util_get_sysex ags_midi_buffer_util_put_quarter_frame ags_midi_buffer_util_get_quarter_frame ags_midi_buffer_util_put_song_position ags_midi_buffer_util_get_song_position ags_midi_buffer_util_put_song_select ags_midi_buffer_util_get_song_select ags_midi_buffer_util_put_tune_request ags_midi_buffer_util_get_tune_request ags_midi_buffer_util_put_sequence_number ags_midi_buffer_util_get_sequence_number ags_midi_buffer_util_put_smtpe ags_midi_buffer_util_get_smtpe ags_midi_buffer_util_put_tempo ags_midi_buffer_util_get_tempo ags_midi_buffer_util_put_time_signature ags_midi_buffer_util_get_time_signature ags_midi_buffer_util_put_key_signature ags_midi_buffer_util_get_key_signature ags_midi_buffer_util_put_sequencer_meta_event ags_midi_buffer_util_get_sequencer_meta_event ags_midi_buffer_util_put_text_event ags_midi_buffer_util_get_text_event ags_midi_buffer_util_put_end_of_track ags_midi_buffer_util_get_end_of_track ags_midi_buffer_util_seek_message ags_midi_buffer_util_decode ags_midi_file_get_type ags_midi_file_error_quark ags_midi_file_open ags_midi_file_open_from_data ags_midi_file_rw_open ags_midi_file_close ags_midi_file_read ags_midi_file_write ags_midi_file_seek ags_midi_file_flush ags_midi_file_read_byte ags_midi_file_read_gint16 ags_midi_file_read_gint24 ags_midi_file_read_gint32 ags_midi_file_read_varlength ags_midi_file_read_text ags_midi_file_write_byte ags_midi_file_write_gint16 ags_midi_file_write_gint24 ags_midi_file_write_gint32 ags_midi_file_write_varlength ags_midi_file_write_text ags_midi_file_read_header ags_midi_file_write_header ags_midi_file_read_track_data ags_midi_file_write_track_data ags_midi_file_read_notation ags_mid_file_read_midi ags_midi_file_new ags_midi_util_is_key_on ags_midi_util_is_key_off ags_midi_util_is_key_pressure ags_midi_util_is_change_parameter ags_midi_util_is_pitch_bend ags_midi_util_is_change_program ags_midi_util_is_change_pressure ags_midi_util_is_sysex ags_midi_util_is_quarter_frame ags_midi_util_is_song_position ags_midi_util_is_song_select ags_midi_util_is_tune_request ags_midi_util_is_meta_event ags_midi_util_to_smf ags_midi_util_delta_time_to_offset ags_midi_util_offset_to_delta_time ags_channel_get_type ags_channel_error_quark ags_channel_get_obj_mutex ags_channel_get_play_mutex ags_channel_get_recall_mutex ags_channel_test_flags ags_channel_set_flags ags_channel_unset_flags ags_channel_test_ability_flags ags_channel_set_ability_flags ags_channel_unset_ability_flags ags_channel_test_behaviour_flags ags_channel_set_behaviour_flags ags_channel_unset_behaviour_flags ags_channel_test_staging_flags ags_channel_set_staging_flags ags_channel_unset_staging_flags ags_channel_get_audio ags_channel_set_audio ags_channel_next ags_channel_prev ags_channel_next_pad ags_channel_prev_pad ags_channel_first ags_channel_last ags_channel_nth ags_channel_pad_first ags_channel_pad_last ags_channel_pad_nth ags_channel_first_with_recycling ags_channel_last_with_recycling ags_channel_prev_with_recycling ags_channel_next_with_recycling ags_channel_get_link ags_channel_set_link ags_channel_reset_recycling ags_channel_recycling_changed ags_channel_get_output_soundcard ags_channel_set_output_soundcard ags_channel_get_input_soundcard ags_channel_set_input_soundcard ags_channel_get_samplerate ags_channel_set_samplerate ags_channel_get_buffer_size ags_channel_set_buffer_size ags_channel_get_format ags_channel_set_format ags_channel_get_pad ags_channel_set_pad ags_channel_get_audio_channel ags_channel_set_audio_channel ags_channel_get_line ags_channel_set_line ags_channel_get_octave ags_channel_set_octave ags_channel_get_key ags_channel_set_key ags_channel_get_absolute_key ags_channel_set_absolute_key ags_channel_get_pattern ags_channel_set_pattern ags_channel_add_pattern ags_channel_remove_pattern ags_channel_get_playback ags_channel_set_playback ags_channel_get_recall_id ags_channel_set_recall_id ags_channel_add_recall_id ags_channel_remove_recall_id ags_channel_get_recall_container ags_channel_set_recall_container ags_channel_add_recall_container ags_channel_remove_recall_container ags_channel_get_play ags_channel_set_play ags_channel_get_recall ags_channel_set_recall ags_channel_add_recall ags_channel_remove_recall ags_channel_add_effect ags_channel_remove_effect ags_channel_duplicate_recall ags_channel_resolve_recall ags_channel_init_recall ags_channel_play_recall ags_channel_done_recall ags_channel_cancel_recall ags_channel_cleanup_recall ags_channel_start ags_channel_stop ags_channel_check_scope ags_channel_collect_all_channel_ports ags_channel_collect_all_channel_ports_by_specifier_and_context ags_channel_get_level ags_channel_recursive_set_property ags_channel_recursive_run_stage ags_channel_new ags_sf2_loader_get_type ags_sf2_loader_test_flags ags_sf2_loader_set_flags ags_sf2_loader_unset_flags ags_sf2_loader_start ags_sf2_loader_new ags_channel_thread_get_type ags_channel_thread_test_status_flags ags_channel_thread_set_status_flags ags_channel_thread_unset_status_flags ags_channel_thread_set_sound_scope ags_channel_thread_new ags_sequencer_thread_get_type ags_sequencer_thread_interval_timeout ags_sequencer_thread_find_sequencer ags_sequencer_thread_new ags_soundcard_thread_get_type ags_soundcard_thread_find_soundcard ags_soundcard_thread_new ags_wave_loader_get_type ags_wave_loader_test_flags ags_wave_loader_set_flags ags_wave_loader_unset_flags ags_wave_loader_start ags_wave_loader_new ags_audio_thread_get_type ags_audio_thread_test_status_flags ags_audio_thread_set_status_flags ags_audio_thread_unset_status_flags ags_audio_thread_set_sound_scope ags_audio_thread_new ags_sfz_loader_get_type ags_sfz_loader_test_flags ags_sfz_loader_set_flags ags_sfz_loader_unset_flags ags_sfz_loader_start ags_sfz_loader_new ags_audio_loop_get_type ags_audio_loop_test_flags ags_audio_loop_set_flags ags_audio_loop_unset_flags ags_audio_loop_add_audio ags_audio_loop_remove_audio ags_audio_loop_add_channel ags_audio_loop_remove_channel ags_audio_loop_new ags_export_thread_get_type ags_export_thread_find_soundcard ags_export_thread_new ags_audio_unit_client_get_type ags_audio_unit_client_test_flags ags_audio_unit_client_set_flags ags_audio_unit_client_unset_flags ags_audio_unit_client_find_uuid ags_audio_unit_client_find ags_audio_unit_client_open ags_audio_unit_client_add_device ags_audio_unit_client_remove_device ags_audio_unit_client_add_port ags_audio_unit_client_remove_port ags_audio_unit_client_activate ags_audio_unit_client_deactivate ags_audio_unit_client_new ags_audio_unit_devin_get_type ags_audio_unit_devin_error_quark ags_audio_unit_devin_test_flags ags_audio_unit_devin_set_flags ags_audio_unit_devin_unset_flags ags_audio_unit_devin_switch_buffer_flag ags_audio_unit_devin_adjust_delay_and_attack ags_audio_unit_devin_realloc_buffer ags_audio_unit_devin_new ags_audio_unit_server_get_type ags_audio_unit_server_test_flags ags_audio_unit_server_set_flags ags_audio_unit_server_unset_flags ags_audio_unit_server_find_url ags_audio_unit_server_find_client ags_audio_unit_server_find_port ags_audio_unit_server_add_client ags_audio_unit_server_remove_client ags_audio_unit_server_connect_client ags_audio_unit_server_start_poll ags_audio_unit_server_new ags_audio_unit_port_get_type ags_audio_unit_port_test_flags ags_audio_unit_port_set_flags ags_audio_unit_port_unset_flags ags_audio_unit_port_find ags_audio_unit_port_register ags_audio_unit_port_unregister ags_audio_unit_port_set_format ags_audio_unit_port_set_samplerate ags_audio_unit_port_set_pcm_channels ags_audio_unit_port_set_buffer_size ags_audio_unit_port_new ags_audio_unit_devout_get_type ags_audio_unit_devout_error_quark ags_audio_unit_devout_test_flags ags_audio_unit_devout_set_flags ags_audio_unit_devout_unset_flags ags_audio_unit_devout_switch_buffer_flag ags_audio_unit_devout_adjust_delay_and_attack ags_audio_unit_devout_realloc_buffer ags_audio_unit_devout_new ags_recall_lv2_get_type ags_recall_lv2_test_flags ags_recall_lv2_set_flags ags_recall_lv2_unset_flags ags_recall_lv2_load ags_recall_lv2_load_ports ags_recall_lv2_load_conversion ags_recall_lv2_find ags_recall_lv2_new ags_acceleration_get_type ags_acceleration_get_obj_mutex ags_acceleration_test_flags ags_acceleration_set_flags ags_acceleration_unset_flags ags_acceleration_sort_func ags_acceleration_get_x ags_acceleration_set_x ags_acceleration_get_y ags_acceleration_set_y ags_acceleration_duplicate ags_acceleration_new ags_midiin_get_type ags_midiin_error_quark ags_midiin_test_flags ags_midiin_set_flags ags_midiin_unset_flags ags_midiin_switch_buffer_flag ags_midiin_new ags_recall_ladspa_get_type ags_recall_ladspa_load ags_recall_ladspa_load_ports ags_recall_ladspa_load_conversion ags_recall_ladspa_find ags_recall_ladspa_new ags_lfo_synth_util_sin_s8 ags_lfo_synth_util_sin_s16 ags_lfo_synth_util_sin_s24 ags_lfo_synth_util_sin_s32 ags_lfo_synth_util_sin_s64 ags_lfo_synth_util_sin_float ags_lfo_synth_util_sin_double ags_lfo_synth_util_sin_complex ags_lfo_synth_util_sawtooth_s8 ags_lfo_synth_util_sawtooth_s16 ags_lfo_synth_util_sawtooth_s24 ags_lfo_synth_util_sawtooth_s32 ags_lfo_synth_util_sawtooth_s64 ags_lfo_synth_util_sawtooth_float ags_lfo_synth_util_sawtooth_double ags_lfo_synth_util_sawtooth_complex ags_lfo_synth_util_triangle_s8 ags_lfo_synth_util_triangle_s16 ags_lfo_synth_util_triangle_s24 ags_lfo_synth_util_triangle_s32 ags_lfo_synth_util_triangle_s64 ags_lfo_synth_util_triangle_float ags_lfo_synth_util_triangle_double ags_lfo_synth_util_triangle_complex ags_lfo_synth_util_square_s8 ags_lfo_synth_util_square_s16 ags_lfo_synth_util_square_s24 ags_lfo_synth_util_square_s32 ags_lfo_synth_util_square_s64 ags_lfo_synth_util_square_float ags_lfo_synth_util_square_double ags_lfo_synth_util_square_complex ags_lfo_synth_util_impulse_s8 ags_lfo_synth_util_impulse_s16 ags_lfo_synth_util_impulse_s24 ags_lfo_synth_util_impulse_s32 ags_lfo_synth_util_impulse_s64 ags_lfo_synth_util_impulse_float ags_lfo_synth_util_impulse_double ags_lfo_synth_util_impulse_complex ags_lfo_synth_util_sin ags_lfo_synth_util_sawtooth ags_lfo_synth_util_triangle ags_lfo_synth_util_square ags_lfo_synth_util_impulse ags_preset_get_type ags_preset_error_quark ags_preset_get_obj_mutex ags_preset_test_flags ags_preset_set_flags ags_preset_unset_flags ags_preset_get_audio ags_preset_set_audio ags_preset_get_scope ags_preset_set_scope ags_preset_get_preset_name ags_preset_set_preset_name ags_preset_get_audio_channel_start ags_preset_set_audio_channel_start ags_preset_get_audio_channel_end ags_preset_set_audio_channel_end ags_preset_get_pad_start ags_preset_set_pad_start ags_preset_get_pad_end ags_preset_set_pad_end ags_preset_get_x_start ags_preset_set_x_start ags_preset_get_x_end ags_preset_set_x_end ags_preset_find_scope ags_preset_find_name ags_preset_add_parameter ags_preset_remove_parameter ags_preset_get_parameter ags_preset_new ags_recall_container_get_type ags_recall_container_test_flags ags_recall_container_set_flags ags_recall_container_unset_flags ags_recall_container_add ags_recall_container_remove ags_recall_container_get_recall_audio ags_recall_container_get_recall_audio_run ags_recall_container_get_recall_channel ags_recall_container_get_recall_channel_run ags_recall_container_find ags_recall_container_new ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_fourier_transform_util_compute_stft_s8 ags_fourier_transform_util_compute_stft_s16 ags_fourier_transform_util_compute_stft_s24 ags_fourier_transform_util_compute_stft_s32 ags_fourier_transform_util_compute_stft_s64 ags_fourier_transform_util_compute_stft_float ags_fourier_transform_util_compute_stft_double ags_fourier_transform_util_inverse_stft_s8 ags_fourier_transform_util_inverse_stft_s16 ags_fourier_transform_util_inverse_stft_s24 ags_fourier_transform_util_inverse_stft_s32 ags_fourier_transform_util_inverse_stft_s64 ags_fourier_transform_util_inverse_stft_float ags_fourier_transform_util_inverse_stft_double ags_audio_application_context_get_type ags_audio_application_context_new ags_track_get_type ags_track_get_obj_mutex ags_track_lock ags_track_unlock ags_track_test_flags ags_track_set_flags ags_track_unset_flags ags_track_sort_func ags_track_get_x ags_track_set_x ags_track_get_smf_buffer ags_track_duplicate ags_track_new ags_wave_get_type ags_wave_get_obj_mutex ags_wave_test_flags ags_wave_set_flags ags_wave_unset_flags ags_wave_find_near_timestamp ags_wave_sort_func ags_wave_get_audio ags_wave_set_audio ags_wave_get_line ags_wave_set_line ags_wave_get_samplerate ags_wave_set_samplerate ags_wave_get_buffer_size ags_wave_set_buffer_size ags_wave_get_format ags_wave_set_format ags_wave_get_timestamp ags_wave_set_timestamp ags_wave_get_buffer ags_wave_set_buffer ags_wave_add ags_wave_add_buffer ags_wave_remove_buffer ags_wave_get_selection ags_wave_is_buffer_selected ags_wave_find_point ags_wave_find_region ags_wave_free_selection ags_wave_add_region_to_selection ags_wave_remove_region_from_selection ags_wave_add_all_to_selection ags_wave_copy_selection ags_wave_cut_selection ags_wave_insert_from_clipboard ags_wave_insert_from_clipboard_extended ags_wave_new ags_diatonic_scale_note_to_midi_key ags_diatonic_scale_midi_key_to_note ags_playback_get_type ags_playback_test_flags ags_playback_set_flags ags_playback_unset_flags ags_playback_set_channel_thread ags_playback_get_channel_thread ags_playback_set_recall_id ags_playback_get_recall_id ags_playback_find_channel ags_playback_new ags_port_get_type ags_port_test_flags ags_port_set_flags ags_port_unset_flags ags_port_safe_read ags_port_safe_read_raw ags_port_safe_write ags_port_safe_write_raw ags_port_safe_get_property ags_port_safe_set_property ags_port_find_specifier ags_port_add_automation ags_port_remove_automation ags_port_new ags_midi_get_type ags_midi_get_obj_mutex ags_midi_test_flags ags_midi_set_flags ags_midi_unset_flags ags_midi_find_near_timestamp ags_midi_sort_func ags_midi_get_audio ags_midi_set_audio ags_midi_get_audio_channel ags_midi_set_audio_channel ags_midi_get_timestamp ags_midi_set_timestamp ags_midi_get_track ags_midi_set_track ags_midi_add ags_midi_add_track ags_midi_remove_track ags_midi_new ags_pattern_get_type ags_pattern_get_obj_mutex ags_pattern_test_flags ags_pattern_set_flags ags_pattern_unset_flags ags_pattern_find_near_timestamp ags_pattern_get_channel ags_pattern_set_channel ags_pattern_get_timestamp ags_pattern_set_timestamp ags_pattern_get_dim ags_pattern_set_dim ags_pattern_get_port ags_pattern_set_port ags_pattern_is_empty ags_pattern_get_bit ags_pattern_toggle_bit ags_pattern_new ags_recall_factory_get_type ags_recall_factory_create ags_recall_factory_new ags_recall_lv2_run_get_type ags_recall_lv2_run_new ags_recall_get_type ags_recall_global_set_omit_event ags_recall_global_get_children_lock_free ags_recall_global_get_omit_event ags_recall_global_get_performance_mode ags_recall_global_get_rt_safe ags_recall_get_obj_mutex ags_recall_test_flags ags_recall_set_flags ags_recall_unset_flags ags_recall_test_ability_flags ags_recall_set_ability_flags ags_recall_unset_ability_flags ags_recall_check_ability_flags ags_recall_match_ability_flags_to_scope ags_recall_test_behaviour_flags ags_recall_set_behaviour_flags ags_recall_unset_behaviour_flags ags_recall_check_behaviour_flags ags_recall_set_sound_scope ags_recall_get_sound_scope ags_recall_check_sound_scope ags_recall_test_staging_flags ags_recall_set_staging_flags ags_recall_unset_staging_flags ags_recall_check_staging_flags ags_recall_test_state_flags ags_recall_set_state_flags ags_recall_unset_state_flags ags_recall_check_state_flags ags_recall_get_filename ags_recall_set_filename ags_recall_get_effect ags_recall_set_effect ags_recall_get_effect_index ags_recall_set_effect_index ags_recall_get_recall_container ags_recall_set_recall_container ags_recall_get_recall_id ags_recall_set_recall_id ags_recall_get_recall_dependency ags_recall_set_recall_dependency ags_recall_add_recall_dependency ags_recall_remove_recall_dependency ags_recall_get_children ags_recall_set_children ags_recall_add_child ags_recall_remove_child ags_recall_handler_free ags_recall_handler_alloc ags_recall_add_recall_handler ags_recall_remove_recall_handler ags_recall_get_output_soundcard ags_recall_set_output_soundcard ags_recall_get_input_soundcard ags_recall_set_input_soundcard ags_recall_get_samplerate ags_recall_set_samplerate ags_recall_get_buffer_size ags_recall_set_buffer_size ags_recall_get_format ags_recall_set_format ags_recall_resolve_dependency ags_recall_check_rt_data ags_recall_run_init_pre ags_recall_run_init_inter ags_recall_run_init_post ags_recall_feed_input_queue ags_recall_automate ags_recall_run_pre ags_recall_run_inter ags_recall_run_post ags_recall_do_feedback ags_recall_feed_output_queue ags_recall_stop_persistent ags_recall_cancel ags_recall_done ags_recall_duplicate ags_recall_notify_dependency ags_recall_child_added ags_recall_is_done ags_recall_get_by_effect ags_recall_find_recall_id_with_effect ags_recall_find_type ags_recall_find_template ags_recall_template_find_type ags_recall_template_find_all_type ags_recall_find_type_with_recycling_context ags_recall_find_recycling_context ags_recall_find_provider ags_recall_template_find_provider ags_recall_find_provider_with_recycling_context ags_recall_lock_port ags_recall_unlock_port ags_recall_new ags_recall_id_get_type ags_recall_id_set_sound_scope ags_recall_id_check_sound_scope ags_recall_id_test_staging_flags ags_recall_id_set_staging_flags ags_recall_id_unset_staging_flags ags_recall_id_check_staging_flags ags_recall_id_test_state_flags ags_recall_id_set_state_flags ags_recall_id_unset_state_flags ags_recall_id_check_state_flags ags_recall_id_find_recycling_context ags_recall_id_find_parent_recycling_context ags_recall_id_new ags_char_buffer_util_copy_s8_to_cbuffer ags_char_buffer_util_copy_s16_to_cbuffer ags_char_buffer_util_copy_s24_to_cbuffer ags_char_buffer_util_copy_s32_to_cbuffer ags_char_buffer_util_copy_s64_to_cbuffer ags_char_buffer_util_copy_float_to_cbuffer ags_char_buffer_util_copy_double_to_cbuffer ags_char_buffer_util_copy_cbuffer_to_s8 ags_char_buffer_util_copy_cbuffer_to_s16 ags_char_buffer_util_copy_cbuffer_to_s24 ags_char_buffer_util_copy_cbuffer_to_s32 ags_char_buffer_util_copy_cbuffer_to_s64 ags_char_buffer_util_copy_cbuffer_to_float ags_char_buffer_util_copy_cbuffer_to_double ags_char_buffer_util_copy_buffer_to_buffer ags_sequencer_util_get_obj_mutex ags_core_audio_devin_get_type ags_core_audio_devin_error_quark ags_core_audio_devin_test_flags ags_core_audio_devin_set_flags ags_core_audio_devin_unset_flags ags_core_audio_devin_switch_buffer_flag ags_core_audio_devin_adjust_delay_and_attack ags_core_audio_devin_realloc_buffer ags_core_audio_devin_new ags_core_audio_midiin_get_type ags_core_audio_midiin_error_quark ags_core_audio_midiin_test_flags ags_core_audio_midiin_set_flags ags_core_audio_midiin_unset_flags ags_core_audio_midiin_switch_buffer_flag ags_core_audio_midiin_new ags_core_audio_server_get_type ags_core_audio_server_test_flags ags_core_audio_server_set_flags ags_core_audio_server_unset_flags ags_core_audio_server_find_url ags_core_audio_server_find_client ags_core_audio_server_find_port ags_core_audio_server_add_client ags_core_audio_server_remove_client ags_core_audio_server_connect_client ags_core_audio_server_start_poll ags_core_audio_server_new ags_core_audio_client_get_type ags_core_audio_client_test_flags ags_core_audio_client_set_flags ags_core_audio_client_unset_flags ags_core_audio_client_find_uuid ags_core_audio_client_find ags_core_audio_client_open ags_core_audio_client_add_device ags_core_audio_client_remove_device ags_core_audio_client_add_port ags_core_audio_client_remove_port ags_core_audio_client_activate ags_core_audio_client_deactivate ags_core_audio_client_new ags_core_audio_devout_get_type ags_core_audio_devout_error_quark ags_core_audio_devout_test_flags ags_core_audio_devout_set_flags ags_core_audio_devout_unset_flags ags_core_audio_devout_switch_buffer_flag ags_core_audio_devout_adjust_delay_and_attack ags_core_audio_devout_realloc_buffer ags_core_audio_devout_new ags_core_audio_port_get_type ags_core_audio_port_test_flags ags_core_audio_port_set_flags ags_core_audio_port_unset_flags ags_core_audio_port_find ags_core_audio_port_register ags_core_audio_port_unregister ags_core_audio_port_set_format ags_core_audio_port_set_samplerate ags_core_audio_port_set_pcm_channels ags_core_audio_port_set_buffer_size ags_core_audio_port_set_cache_buffer_size ags_core_audio_port_get_latency ags_core_audio_port_new ags_osc_xmlrpc_message_get_type ags_osc_xmlrpc_message_new ags_osc_xmlrpc_server_get_type ags_osc_xmlrpc_server_add_websocket_handler ags_osc_xmlrpc_server_add_default_controller ags_osc_xmlrpc_server_new ags_osc_info_controller_get_type ags_osc_info_controller_get_info ags_osc_info_controller_new ags_osc_action_controller_get_type ags_osc_action_controller_run_action ags_osc_action_controller_new ags_osc_front_controller_get_type ags_osc_front_controller_test_flags ags_osc_front_controller_set_flags ags_osc_front_controller_unset_flags ags_osc_front_controller_add_message ags_osc_front_controller_remove_message ags_osc_front_controller_start_delegate ags_osc_front_controller_stop_delegate ags_osc_front_controller_do_request ags_osc_front_controller_new ags_osc_controller_get_type ags_osc_controller_new ags_osc_export_controller_get_type ags_osc_export_controller_do_export ags_osc_export_controller_new ags_osc_plugin_controller_get_type ags_osc_plugin_controller_do_request ags_osc_renew_controller_get_type ags_osc_renew_controller_set_data ags_osc_renew_controller_new ags_osc_node_controller_get_type ags_osc_node_controller_get_data ags_osc_node_controller_new ags_osc_config_controller_get_type ags_osc_config_controller_apply_config ags_osc_config_controller_new ags_osc_status_controller_get_type ags_osc_status_controller_get_status ags_osc_status_controller_new ags_osc_meter_controller_get_type ags_osc_meter_controller_test_flags ags_osc_meter_controller_set_flags ags_osc_meter_controller_unset_flags ags_osc_meter_controller_monitor_alloc ags_osc_meter_controller_monitor_free ags_osc_meter_controller_monitor_ref ags_osc_meter_controller_monitor_unref ags_osc_meter_controller_monitor_find_path ags_osc_meter_controller_monitor_find_port ags_osc_meter_controller_add_monitor ags_osc_meter_controller_remove_monitor ags_osc_meter_controller_contains_monitor ags_osc_meter_controller_start_monitor ags_osc_meter_controller_stop_monitor ags_osc_meter_controller_monitor_meter ags_osc_meter_controller_new ags_osc_message_get_type ags_osc_message_sort_func ags_osc_message_new ags_osc_client_get_type ags_osc_client_test_flags ags_osc_client_set_flags ags_osc_client_unset_flags ags_osc_client_resolve ags_osc_client_connect ags_osc_client_read_bytes ags_osc_client_write_bytes ags_osc_client_new ags_osc_util_type_tag_string_count_type ags_osc_util_meta_data ags_osc_util_mime_header ags_osc_util_slip_encode ags_osc_util_slip_decode ags_osc_util_timetag_now ags_osc_builder_get_type ags_osc_builder_packet_alloc ags_osc_builder_packet_free ags_osc_builder_bundle_alloc ags_osc_builder_bundle_free ags_osc_builder_message_alloc ags_osc_builder_message_free ags_osc_builder_osc_putc ags_osc_builder_on_error ags_osc_builder_append_packet ags_osc_builder_append_bundle ags_osc_builder_append_message ags_osc_builder_append_value ags_osc_builder_build ags_osc_builder_new ags_osc_response_get_type ags_osc_response_test_flags ags_osc_response_set_flags ags_osc_response_unset_flags ags_osc_response_new ags_osc_buffer_util_put_int32 ags_osc_buffer_util_get_int32 ags_osc_buffer_util_put_timetag ags_osc_buffer_util_get_timetag ags_osc_buffer_util_put_float ags_osc_buffer_util_get_float ags_osc_buffer_util_put_string ags_osc_buffer_util_get_string ags_osc_buffer_util_put_blob ags_osc_buffer_util_get_blob ags_osc_buffer_util_put_int64 ags_osc_buffer_util_get_int64 ags_osc_buffer_util_put_double ags_osc_buffer_util_get_double ags_osc_buffer_util_put_char ags_osc_buffer_util_get_char ags_osc_buffer_util_put_rgba ags_osc_buffer_util_get_rgba ags_osc_buffer_util_put_midi ags_osc_buffer_util_get_midi ags_osc_buffer_util_put_packet ags_osc_buffer_util_get_packet ags_osc_buffer_util_put_packets ags_osc_buffer_util_put_message ags_osc_buffer_util_get_message ags_osc_buffer_util_put_bundle ags_osc_buffer_util_get_bundle ags_osc_xmlrpc_controller_get_type ags_osc_xmlrpc_controller_test_flags ags_osc_xmlrpc_controller_set_flags ags_osc_xmlrpc_controller_unset_flags ags_osc_xmlrpc_controller_add_message ags_osc_xmlrpc_controller_remove_message ags_osc_xmlrpc_controller_start_delegate ags_osc_xmlrpc_controller_stop_delegate ags_osc_xmlrpc_controller_new ags_osc_server_get_type ags_osc_server_test_flags ags_osc_server_set_flags ags_osc_server_unset_flags ags_osc_server_add_connection ags_osc_server_remove_connection ags_osc_server_add_controller ags_osc_server_remove_controller ags_osc_server_add_default_controller ags_osc_server_start ags_osc_server_stop ags_osc_server_listen ags_osc_server_dispatch ags_osc_server_new ags_osc_parser_get_type ags_osc_parser_read_gint32 ags_osc_parser_read_gint64 ags_osc_parser_read_gfloat ags_osc_parser_read_gdouble ags_osc_parser_read_text ags_osc_parser_osc_getc ags_osc_parser_on_error ags_osc_parser_parse_full ags_osc_parser_parse_bytes ags_osc_parser_packet ags_osc_parser_bundle ags_osc_parser_message ags_osc_parser_value ags_osc_parser_new ags_osc_websocket_connection_get_type ags_osc_websocket_connection_find_resource_id ags_osc_websocket_connection_new ags_osc_connection_get_type ags_osc_connection_test_flags ags_osc_connection_set_flags ags_osc_connection_unset_flags ags_osc_connection_timeout_expired ags_osc_connection_read_bytes ags_osc_connection_write_response ags_osc_connection_close ags_osc_connection_new ags_recall_channel_get_type ags_recall_channel_get_destination ags_recall_channel_set_destination ags_recall_channel_get_source ags_recall_channel_set_source ags_recall_channel_find_channel ags_recall_channel_new ags_frequency_map_get_type ags_frequency_map_sort_func ags_frequency_map_test_flags ags_frequency_map_set_flags ags_frequency_map_unset_flags ags_frequency_map_process ags_frequency_map_factorize ags_frequency_map_compute_max_likelihood ags_frequency_map_new ags_note_get_type ags_note_get_obj_mutex ags_note_test_flags ags_note_set_flags ags_note_unset_flags ags_note_sort_func ags_note_get_is_minor ags_note_set_is_minor ags_note_get_sharp_flats ags_note_set_sharp_flats ags_note_get_x0 ags_note_set_x0 ags_note_get_x1 ags_note_set_x1 ags_note_get_y ags_note_set_y ags_note_get_rt_offset ags_note_set_rt_offset ags_note_get_rt_attack ags_note_set_rt_attack ags_note_get_attack ags_note_set_attack ags_note_get_sustain ags_note_set_sustain ags_note_get_decay ags_note_set_decay ags_note_get_release ags_note_set_release ags_note_get_ratio ags_note_set_ratio ags_note_find_prev ags_note_find_next ags_note_length_to_smf_delta_time ags_note_smf_delta_time_to_length ags_note_to_raw_midi ags_note_to_raw_midi_extended ags_note_to_seq_event ags_note_to_seq_event_extended ags_note_from_raw_midi ags_note_from_raw_midi_extended ags_note_from_seq_event ags_note_from_seq_event_extended ags_note_duplicate ags_note_new ags_note_new_with_offset ags_playback_domain_get_type ags_playback_domain_test_flags ags_playback_domain_set_flags ags_playback_domain_unset_flags ags_playback_domain_set_audio_thread ags_playback_domain_get_audio_thread ags_playback_domain_add_playback ags_playback_domain_remove_playback ags_playback_domain_new ags_ipatch_gig_reader_get_type ags_ipatch_gig_reader_test_flags ags_ipatch_gig_reader_set_flags ags_ipatch_gig_reader_unset_flags ags_ipatch_gig_reader_load ags_ipatch_gig_reader_select_instrument ags_ipatch_gig_reader_select_sample ags_ipatch_gig_reader_get_instrument_all ags_ipatch_gig_reader_get_sample_all ags_ipatch_gig_reader_get_sample_by_instrument_index ags_ipatch_gig_reader_new ags_audio_container_get_type ags_audio_container_test_flags ags_audio_container_set_flags ags_audio_container_unset_flags ags_audio_container_check_suffix ags_audio_container_find_sound_resource ags_audio_container_add_audio_signal ags_audio_container_remove_audio_signal ags_audio_container_add_wave ags_audio_container_remove_wave ags_audio_container_open ags_audio_container_open_from_data ags_audio_container_rw_open ags_audio_container_close ags_audio_container_read ags_audio_container_read_audio_signal ags_audio_container_read_wave ags_audio_container_seek ags_audio_container_write ags_audio_container_flush ags_audio_container_new ags_audio_file_link_get_type ags_audio_file_link_new ags_ipatch_sample_get_type ags_ipatch_sample_test_flags ags_ipatch_sample_set_flags ags_ipatch_sample_unset_flags ags_ipatch_sample_new ags_sfz_file_get_type ags_sfz_file_test_flags ags_sfz_file_set_flags ags_sfz_file_unset_flags ags_sfz_file_select_sample ags_sfz_file_get_range ags_sfz_file_check_suffix ags_sfz_file_parse ags_sfz_file_new ags_sfz_sample_get_type ags_sfz_sample_test_flags ags_sfz_sample_set_flags ags_sfz_sample_unset_flags ags_sfz_sample_new ags_sndfile_get_type ags_sndfile_test_flags ags_sndfile_set_flags ags_sndfile_unset_flags ags_sndfile_new ags_sound_resource_get_type ags_sound_resource_open ags_sound_resource_rw_open ags_sound_resource_load ags_sound_resource_info ags_sound_resource_set_presets ags_sound_resource_get_presets ags_sound_resource_read ags_sound_resource_write ags_sound_resource_flush ags_sound_resource_seek ags_sound_resource_read_audio_signal ags_sound_resource_read_wave ags_sound_resource_close ags_ipatch_get_type ags_ipatch_test_flags ags_ipatch_set_flags ags_ipatch_unset_flags ags_ipatch_check_suffix ags_ipatch_new ags_ipatch_sf2_reader_get_type ags_ipatch_sf2_reader_test_flags ags_ipatch_sf2_reader_set_flags ags_ipatch_sf2_reader_unset_flags ags_ipatch_sf2_reader_load ags_ipatch_sf2_reader_select_preset ags_ipatch_sf2_reader_select_instrument ags_ipatch_sf2_reader_select_sample ags_ipatch_sf2_reader_get_preset_all ags_ipatch_sf2_reader_get_instrument_all ags_ipatch_sf2_reader_get_sample_all ags_ipatch_sf2_reader_get_instrument_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index ags_ipatch_sf2_reader_new ags_sfz_region_get_type ags_sfz_region_test_flags ags_sfz_region_set_flags ags_sfz_region_unset_flags ags_sfz_region_insert_control ags_sfz_region_lookup_control ags_sfz_region_new ags_audio_file_get_type ags_audio_file_test_flags ags_audio_file_set_flags ags_audio_file_unset_flags ags_audio_file_check_suffix ags_audio_file_add_audio_signal ags_audio_file_remove_audio_signal ags_audio_file_add_wave ags_audio_file_remove_wave ags_audio_file_open ags_audio_file_open_from_data ags_audio_file_rw_open ags_audio_file_close ags_audio_file_read ags_audio_file_read_audio_signal ags_audio_file_read_wave ags_audio_file_seek ags_audio_file_write ags_audio_file_flush ags_audio_file_new ags_sfz_group_get_type ags_sfz_group_test_flags ags_sfz_group_set_flags ags_sfz_group_unset_flags ags_sfz_group_insert_control ags_sfz_group_lookup_control ags_sfz_group_new ags_sound_container_get_type ags_sound_container_open ags_sound_container_get_level_count ags_sound_container_get_nesting_level ags_sound_container_get_level_id ags_sound_container_get_level_index ags_sound_container_get_sublevel_name ags_sound_container_level_up ags_sound_container_select_level_by_id ags_sound_container_select_level_by_index ags_sound_container_get_resource_all ags_sound_container_get_resource_by_name ags_sound_container_get_resource_by_index ags_sound_container_get_resource_current ags_sound_container_close ags_ipatch_dls2_reader_get_type ags_ipatch_dls2_reader_test_flags ags_ipatch_dls2_reader_set_flags ags_ipatch_dls2_reader_unset_flags ags_ipatch_dls2_reader_load ags_ipatch_dls2_reader_select_instrument ags_ipatch_dls2_reader_select_sample ags_ipatch_dls2_reader_get_instrument_all ags_ipatch_dls2_reader_get_sample_all ags_ipatch_dls2_reader_get_sample_by_instrument_index ags_ipatch_dls2_reader_new ags_synth_generator_get_type ags_synth_generator_set_samplerate ags_synth_generator_set_buffer_size ags_synth_generator_set_format ags_synth_generator_compute ags_synth_generator_new gsequencer-3.1.3/libags.pc.in0000644000175000017500000000076213613101103012764 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libags Description: Advanced Gtk+ Sequencer audio processing engine URL: http://nongnu.org/gsequencer Version: @PACKAGE_VERSION@ Requires: uuid >= 1.0.1 libxml-2.0 >= 2.8.0 gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0 gio-2.0 >= 2.56.0 libsoup-2.4 >= 2.52.0 Libs: -L${libdir} -lags -lags_thread -lags_server Cflags: -I${includedir} -include ${includedir}/ags/config.h gsequencer-3.1.3/gsequencer.share/0000755000175000017500000000000013607210227014122 500000000000000gsequencer-3.1.3/gsequencer.share/styles/0000755000175000017500000000000013607210263015445 500000000000000gsequencer-3.1.3/gsequencer.share/styles/ags.css0000644000175000017500000000015513607210263016652 00000000000000.editor * { -GtkScrollbar-has-backward-stepper: true; -GtkScrollbar-has-forward-stepper: true; } gsequencer-3.1.3/gsequencer.share/icons/0000755000175000017500000000000013607210263015235 500000000000000gsequencer-3.1.3/gsequencer.share/icons/jumper.png0000644000175000017500000006277313607210263017204 00000000000000PNG  IHDRPqzTXtRaw profile type exifxڅS[n =JAq dj7x~4sДU3ѪBtI`[:6XuvO4K#J""m5^ vƷ:}5RL40-q67JkGjɤFV)>Qω{?Zl[6n1&1<# * !Y*{`'ɐZ(hGYg-3lbv46p[Ë~f,vLa*LREQ z ;GFx?1- Gua@x a"=W,J6/]A1d'_ z_]Ǟs}a#"x .Aΐh BiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later  iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_rޫok^M zik?W, 8zژ+%זx@ozIy&x:d-sX6vv-ygR4AMbm.dyקZF`6/)ut$yvbk$xN 6󭣾jXI--\֦tcaU/o횒K`<UdPp#dS^ŹO_'Z3lZF64go_T ؅T-<=BeyN!46myŘ;@LhWv^o TW}OXLttlD'Ua=O~_[տ|-Amg.&$x2Cl9Fӆmՠk"ŸOoM#]{]kz֮/XJ@gJ|ɒTܰ|0B8>ݯ3;AӕW~[Z^YumBzm]g[+zNh[R=^ب=K@X5){M5ۆ{']l- c%daKŨ,$^]Ov'I*2[UT-aMc'ʴboF`Tj]W}ߕ,[7b-#nV/9\*1 oVb?^p4 bi1V֜TBn펒J+/XoJ\^&J* /ZB`ճMY60W[o_`o\HDϤb:{6es,'Cvf4eIĎR,ކM[Que 3fʼntf>L'ق6n,KwvlxnV-EX UgNn r䚫[3u( {{-d!݀>oUĠ%7V}kEkv*Ժ6L;\z'HYlOӭ=Wbw}sOƕ?IFq~}52K}u+A1Zהws3ca=F-H04, {*CɆyC%fm݄*[f4y?.o=kX^` tz 0mF񎩀T԰oZc@ HD^'l (iwٓ #?;4MYvC3k[n-)a.vfm:; cdsq( /lT@VO=gRWfp@g#gOCȓCFk4mv5 2(a%5Ϯ kai[lnlL`IYnے ҄~|w=LKů'xLϵ6O>9^|-eܛ Ea|󃪜8=*A)T4S{Kϸ}.2ԝޟ\OeWF)wܞ\z+7C^&)-( w A',.3K9Ve{bb$ͻZg|y*<{g]gGeMA^f-R,]<`UɪaLtɂ l=Lk-s?PkcF2OI-ܴ3&B)W?S5ƃ]Z|!*Ça{Oje2~= M9S()Àz a+8Ss3&䞭n2i,VsmY;f=kaW{a kx74leU:p),]SĂ\pMԯXNdP@dZr5ۧEmduJ eELz3ŨﵱHG͞tف'tMΒWŖZ;ד…R!ShO9A,n.TQ \=R :yA&՝В2}=Lt2$t.1N^p1tڑ P5b$fM@}_2Admp&kמ=W;AǞI\ia%s?RCTO-:ZE| =Zk5|5`j5ՇK$|eo=I a:AFۭPfo^]y@܏@ܜF\:Ax3*1e4<~6<+ٿ֠8xp` ]ҠkqUVܹˏ𜏲=_Gc'Tecw ^,9=Υ,R#?*W gy_uC.\|0tky kl ~zĸg)wڥe˜:K6_` '% l^>K׽ʙ֐ X1镓~{#8љ 4H qУc=hczw;F^7 ׵;~ -Ok&>oƲ&wVwxp_l{y@kzk9O@ٟ_ZccUJËT֣K0#MGm PcY(Dv C*=OWU'3 lqٵpQ:uP h@& >Cᣵmsv@Oq Sߕ_Je9w+brNRXN׻ųσL %7[عafV|k[Ym G͆1bJsiY6Q4?*# pV{[˭ ?oM$qpoNVVj'gVRkXgd֕1Uzx(a/@ e5jҬsJTIѴ9hJQ5_ #NYvMn(f;aFʷm.C  ϔ>tk~WnIP%\"Lu0~5v̯R;- y2[&]@Oy[+v˵e!#,pX<iо{~P2܈gIkY9OLJ ;| t_W, U)YT~`T9+͎,X4L{ yc[kgH+e,R0]q vނ.j='93,=,N˷wl,lf<#?h*Xrb\&`Z<^xQQ\>C" vbF^s=5yʅE ^&'@WI02MM10W\T.J.&T_j qԚ@ V4IX(wË={Ѥ^ѤD'WjYzP{vaАLe"!Xoi%%t.+5{A'NRx'[3=$3I292 J%w|o НPV'y*t}%p+'6?D^")ybpaʨ=.c1peΊM2E6_`aţfɬȴЮJz5ue{}gWυ5F sjJP";<I Uk)a WD` ]]{ZKkg *kϸvx4ۆ)v:[ZJV2Z'+d?ykӥ{0cX9̑c+S^H`MBdX%i(a뀯|˭xCk{TwŋrF/A=ɘ&#"]]O0~d砼aKQMDprd`Mirqx̮ŸsmCs[Xn9x=1r1)RU. [7h3qɬ*c5#$zCt~ m Yj͒TMR7S(7.mLPEq\4=p>H ۏh, +|FyD]V(2*`3f:-9V(IQNyhZ" (AD^&.~v@3#R) =[T^._i^s϶g%+ZL0LΐM*2ݽG \zN/­,ਯ j]9yzX1++k#!#fcOT݌&#zC?() i^Th֤3Q?uvNCٳ-:Mˮ`ײ1'Aef"}M~jC:3u?h w1Mb|Ld-ugĹd:qΘgsgğJ(O#ϷfM^ 7.7a ːZ 6%t0#ADi D(U gP0PI/eV&$+l\@cCMv|:[.g$RKtPv֟azَYH'\ _5%jo͎ U>"N靈>U`(-&kcdt%r V);93<&W.mHY_,FM~o5 <)<i\-s;Ճ7ǶźAQ]B.FQ] 0zwbd9f] )/1 okb='b]tlpxVA+>1Y),UPy˭r˭}ުSVRu1y{S*nWH;(m-'-.˵GWZȳBI6Q&k!5:9jyBb^m^a(vX 12w:(&͙*)CZ/V^<)בG|1>Aj 3ЙM%H3ij1elURS?[B]mZ)ȵJf=3M@Sk5.٘G̍3?[T]gcbӬn0i֌{~Q|P~in<$a;Ipa5(YoDft`(=S^|U seJا0?ð?/)O]wZ05Nǰ ^嫭1_0m`Te+YGy# ͜Qg0ct[˝UMvI3.yT " X{ jH(\ӗڤeO0l^AkCgD厷Z<t* ]CrVpgVQgjxr̨bNGQ7j\ γ"= *~Z_m\V%([vkvItF5'cUTZj[m;܏5Y=z [yp;%Yٲ^)5hIDAT{]R}C53TwLD+jyDޡG*c:-~,O5hwYr&AϦO~៴:O=%:`^QgjM`ݭSa<#jR ϯ2Ҭ6O={JnL:_#+-VܛLXaX$6ԃC2AIJ,+\En**JSק p+. qU% Ui 3FJ(E*My[08^.ؿY1Q'8%&WC ґZ#SfVRK}¯)*1y8xV ȣ(i˰DL|[ b=\Z#; ;ut"66.#u\'xZ9S% %mSEʋޓ4PZt c'KxVmį|$! xU-6N,ϒyn0~,f2Ă;R3$ 6_K[,ZvUY _'XMsI64* GX,JOR>H0A!NZY2!8 cǨxx{m0`&D~Oȿd垯ULÝPq| L$Z qgj Q_YT-;Ѐ¡j(nZB3TmUA7qTYLX5CU2bTK>6A`U4~X$vM D.Oiʳ[>?/owYƪxǽqb8"Y%K_|h瞳AY|vO`%3b}!_&~=}v.@3KgeX(b5sⱣI[< XָՀ[ZB~א3-Y fTf ^Q7S;z2%u]BQUD =o\|Ko.7-@UsSDnȎ] U-XyS0N7?sg}!`EU֤XHH 'v UXG$=[.']g|Xn,J;/40;T*z-p*B%:YS@|T=<|W^vSmgO~}چì69`T5Yt:KmЖGVϏe&.}ؤr*%e}G?L<(C~O?(R g?&s!CU6RGN*ZM'5U)U11L\ ǔT}eĞtV'uOgԋC.*2q;l1˘je!CHD7ȣ<ȣ_-ȚݬG(kNST㶰3 UȒc`zKD{:uE, [WHOIK Ϧ_EHaT wvƔił1TUgi10$VPe dśC'8_v?SH 39M̾,x| 4wP3x4&t^V?R3/Ek/7s >?c81S~_؀csgYeh{}%\/tz'=$?pٴz:j6kG6Li*{lSCђS(1NV*t2I2(Gʼ1MR-_|.{v"R ׃F=绢S`joK/F98вL=_O"'k>s=aI#qg35@cm>Uڸi;qXor a)#|yR%drPT{Í7{Ͻ{黶\ F<QV0{黪Gj'7p):$yl ɂ9=gzG1DV9Y{TAZu<;@S֌ ̐,:9`*9ybv~I3=+V*g4ۯlexJVX8>)$ AS~xku8zNJ҇E3@$k~[h-+Hӕ Yy%8wB>ϴ{ ]veTgA XveXbJֵE!8͐4!3J0ُ2j$}X=;˜Kd!RiUb\zcmXe13 (_.m\9Xk /Kx*TD?֨F5)',B 5(!Z`ǐ3+ T!{BYy\x!92s¤.1*#! _>`&tl gR}`Uv,חix: +\Yo{Z ikN*WcKX|2_0lak"1~lG02j~XkO}-@Oy\.BC4|*=Bu%i~Loffq+EBAj؄jJe ,q>ϨGɭT1t,[w)X *Ylcy\> @"$F!`6AxmpvTl 4"I-y#+8V!@z~~6tt?fdn}'xV8Ȳ9 ~عҒ IP5 JXYTU!NLG!(n {yTqHAݺuω=vף*L܈>ld/ObɭА&|IAjRp|jWJi#2P2uLH7CX[{J$xf> ''MCy̢~EAO% AEzp[;1ɊÛ]h*(CzTRBD/W rH+93[@{IvIQ#`ѢY/C٩ uE^8qRx4Wq* |-\YLHCD MzwC- %V0LEbu o#vx+oȅڰPmn~V[' ɿ/b^Ѿ8r?W^xO Tn۠iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer AGS application icon 32x32 Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later R; iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_ {==$#C)RJ)(K~բ(r94IvE# B91ErMN(W%<32*hFdL{tBdyc9?[Q2Z jt 5,L=AqK}he9@OUtI y˕^ڍ!ym4P&^}F%^T> /۳>W[ѵW 吹tf#sdjOD=<"mwAl }z47:oWra>zE[$cPk$Wo9u?A"FX]C˄b;hdȒ2bꈖSt90&xe*&۰xXF ԧ~ #QJ V}2|PIENDB`gsequencer-3.1.3/gsequencer.share/icons/README0000644000175000017500000000125013607210263016033 00000000000000Other images used by the binary applied under the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * ags.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * ags.xpm (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * jumper.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * gsequencer-128x128.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * gsequencer-32x32.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * gsequencer-48x48.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * gsequencer-64x64.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) gsequencer-3.1.3/gsequencer.share/icons/gsequencer-48x48.png0000644000175000017500000003342113607210263020624 00000000000000PNG  IHDR00zTXtRaw profile type exifx}S[r =`=~W<4MeŲ¡}‡?)rДU3£U+7BvDTk3F/QNx3 S]r?51{;XU` 2ƨ]hO~jqAwp#E$#p_#ڿkb~jϡiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer AGS application icon 48x48 Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later a iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_ktɶH$&n5@X:J)Ĩ(S͢48xm\r?}'f޽AftZ ʑ^zz?h ]#;ڼ ]fS<$<,p(=p3zE}!B:s]oC({+9x =FIe68܄Rl;I-\WX>[jh{FHE} Ee4C݂,]kCv|iG)J٤;>`)w| a3Ll?^bQ܁#9@ HXwD!I<~C֠Md 6e8')]mApa#:5O*Yu֮I)rȝT#^kO#ni((aHdTe꘽ *c.4 umxE򸠻k"tOJő|N_y51||\iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer AGS application icon 64x64 Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later h iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_ ]ge."~+vP}S? fW[ER7]7Lk^r mcf7bV.pn <|ο˹[cZNM Swv+K[ac0F*cpy!s[PWwTA Z4gW7j`mmmMm\(3.ߧ'am&ZO_y 70{ׂg^C*} jZ(^oT[Ǵ'eBWnȢD㸻g|q !]pm9liiimiχP?&`#qշ*­ "OQ +onvC߁+ kvdøPY\'Ģ7u4涣!CLF`a܍7B: YraIA]eppiLMJHnGsPVpr:UܲiHH80 0 0 0 0 0lIENDB`gsequencer-3.1.3/gsequencer.share/icons/ags.xpm0000644000175000017500000000401113375006203016450 00000000000000/* XPM */ static char * ags_xpm[] = { "32 32 57 1", " c None", ". c #C0C0C0", "+ c #C1C1C1", "@ c #BEBEBE", "# c #BDBDBD", "$ c #C2C2C2", "% c #C3C3C3", "& c #C7C7C7", "* c #FFFFFF", "= c #E9E9E9", "- c #E5E5E5", "; c #E7E7E7", "> c #E6E6E6", ", c #F5F5F5", "' c #FCFCFC", ") c #A9A9A9", "! c #EAEAEA", "~ c #E8E8E8", "{ c #F4F4F4", "] c #BCBCBC", "^ c #E4E4E4", "/ c #DADADA", "( c #B3B3B3", "_ c #A6A6A6", ": c #FEFEFE", "< c #F9F9F9", "[ c #A1A1A1", "} c #EBEBEB", "| c #F3F3F3", "1 c #C5C5C5", "2 c #C6C6C6", "3 c #E2E2E2", "4 c #B7B7B7", "5 c #A7A7A7", "6 c #B0B0B0", "7 c #BABABA", "8 c #B4B4B4", "9 c #AAAAAA", "0 c #D6D6D6", "a c #BBBBBB", "b c #E0E0E0", "c c #B6B6B6", "d c #B2B2B2", "e c #C8C8C8", "f c #ACACAC", "g c #C9C9C9", "h c #CCCCCC", "i c #B5B5B5", "j c #D2D2D2", "k c #D3D3D3", "l c #D5D5D5", "m c #CBCBCB", "n c #DBDBDB", "o c #D8D8D8", "p c #D4D4D4", "q c #CFCFCF", "r c #CACACA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " .++++. @#@@.+$ % ", " &*=-;>-,') *****!!~ {] ", " ^/ *(_:*<=[ }|1&222&% ", " 3} 4*(5*6 @.@;****+", " 3*'<*****(5' 7 ****&", " -> 8:***(9:04a]#&*b 8cde****1", " 4 fgha ijklllk2 mnopqrer$ ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; gsequencer-3.1.3/gsequencer.share/icons/gsequencer-128x128.png0000644000175000017500000003771613607210263020775 00000000000000PNG  IHDR*zTXtRaw profile type exifxڅS[r = ! ;ff&G2} _IQ&V-\dρQ$&DŽjcd҃9g+XYܞG_xWS"^y;m\m:Gsv̝(-6Sd'}PxE"oRPTO,:9bYcIyß}->WTl1h^~I-Ri[F!$MZKlgZdP[E!<]W[1)c?dWxUkHFxY'4,htWz*e'P[ہջ_ {DPM/{k-㐞]H]yѤ7<\׫ܿ~ /-:KziTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer AGS application icon 128x128 Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later %N iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_olS(K1Z хfha.D+ᷤH=9E76{%!cy5Y}MUJI { >oo$j^!ɧ98f7Q^ & @T &r8ʛak|3zթĴեsIy&~ $ :Na3+:ޯ3MhެDP9~ 0zo ~>p +w]ȜivWex\&AU軺!%TD?.>ZUmT+Swy0 cXZ-mevt88ze$\o?} Κ qŮaY+3 rܵBEQC\ox6nP mI/ XF;M ȷ"TVd+pNgu((]4RKaΘoX ? ֝Rئ| tk?2Ͳ/p֠KV70nަ0;Fo&qzg-O5![^ag=P xhآd XYkO!JVaغǽ~`/Jo` xUt|"ekȚp )Z@;mx\'#`tE^2 ?NT5[Ir1p-ڽ@0\j܊k { D\lk> ̼_Io-{ Uuۘ g5 # 4pw3|̌}BX ^$EmzgS e5 OBF@%q6u ª٫1 X|GTW5F&7V4@\1rr/fnw6o'?Ú:xqDǿ> %z@~uH:P{ɷV/pEA]{b tоYD)qoE6 qn.f;gBwtfh3! .jo{8d,Ȑq؊5ybDiR)D`6KcSl~r,{ *_aPӞ|Tp&ɥP۷MT7)&& &Yh>@Jl(A2K#6} Oܔ?R8S^ẁ j:ԑgRZ'Rqɺ/9B;OM3~2NN䍿B8OmU@k3ði\\n0Z .sw > WV9EvVM(K2H21ƓLC-1ҵ\&z%.PluΣPJ^V&8G?Lr % V7o[3C& v[5$=x-y7.ރ5a}ԃ5 9DqImWOEƏ`LB>P*zN5TW9GWq=z+h1Pu$_GOk9Oܟu0zYWk6~ |*DcBA6_8X! Dv삻C=c&xuoص`%re*%{+`u$ElyV{5os croa0h*:zNй~':#yMtt;۷C? sV R*}.iBi#\X)TCpEx-6e^|N8&xywz$E ~EUEaVT#Zp'jۋ>ȷ=OZ[0}zLY~TjۛAX[*-ê=UUU{VWh%6}׮;x8SPs㓌aJ@IMWsuᇤNT(' 6pM^'Iܧ_deK2^=zN+.J־_=Bl%m۽}ŎO|+k>rHqOuG`pmV e=BI~Dsgé!Wq=v0I/CMf='5ט޺}CŰ+,Z.\Lk !kR׿毑)V;<%;?_yFsKtsR7Ç1㡚W-F{YTsTU";plZu-c&O@Y9l8?Wn>ѱz[ ?!acHy/&8+ q; T#+ Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_*%++/u_~1}<\Vu+;Cn$EZJyz{k=x̢.xo[,Yj-Zh~k%X&Oq _=Bm ?}'p)RO9* +oe&89{y=H(]OFdžZzzC=H{522K bdEo\m=l.cgJtiV;o{4Vk Gx}H=CiJ;f7Ͳ~l?V跋t o<|ApdKN{}<t+lľǨ kǓnz?ࡎS-[,q|Y4D =rbO:KoyC6'%^*AZ.>BD]Z{WOc-7Y춸ݘlaӼKwә?;QH|zW֞?uIUL__4J2Wu$ar+^tul>`im7;gXgg5oW9Y:^Jqz7X9>a jB X77ȵݫSM8|=`UI7[g̊Èza'wZ$7[OExB65+=Zs~}5KY&zO%1r赚(A,]Yhйgsϴ8T ͖;n^3~,xcZ`ijM7Zr:d =T;-,[6Iz/Kb[m1bb(_,omwnR,b;>cjU土=ΧO\{ ՏhrUJ|]:cjk0'U8q/ŴN^^Z Wy4_ijSU_=+#}"ڕ|l9>7[hb u5˪j$޻iQzVUs3MtFiL|:C-:GNSПzW+H︯;t֬vckJKbժU:EÂj벉a3Jon:CtZmZi:6:vR MTWCVJ^xv*w*#_Dҩy" ͦ bfUՔ5l=;9v 5W['XZ")b<=X# کNMno -Nqi07isΣJV<tj;.ЀR+O ʆƕkZKΙ:hӉxSH{}`p@ i nEwbV1M U P f_kX< HteZrOno"Es+t=ՠgQi/eH1-,,Yu*RvުriJsW]UcTeDz)fLu4KK{㮾B\Zr:d/;>uWY3q?Qa1ZLr6TidL=n=>8LG}rj{B)b]ouY}鰠'Z{-HcPc0S#*66zYyO7[(q i ^Le8XuF7O ʗ-\= V(Ԭ5Siߕw /SiӐ_~ɂҬ8-M{go?zsCꇈUge! Y^F3ևP#3trĕº{ ["vS8, kVQl*R[G|hџ}Z,"eLYuP*^15cxqGU;}1͊)DdUE)/yZÿ5:{[0X7śj% &7BwԖe iAnjR+/PoVǢWӬPOzg?*M mC aƀwksSi곲7}Okw4-]{ڵkO95/VM7d;Rc!뙙M wrwk nIK{ݕ?EW&Xkv[u1hVq zG-4U7j1ԳJrC*_8ݢ^[M%Ymw8kJtQϨ8XG,Y6ζSO':rIװk[f{o,u.K|q̺ P?M7Zp ~,ӯ=ͩ]1G{ө* TIC>g}X+uZu;RKcҝXY(&[J`8&()VO2{Mi]+Tyao4=0[k9{",U75bnS?ҽJZu4+meb+z͛,pZp$mk\}gKRMq Cc ~׹C/%XK$_SN_aw~Ż-;yjuMV<ыN?ϰ{Th9gX {V,wÚJUBb*[|JV+%w|7Y^eYʿ[|'SNjrOD[b%Xqza{[7]qdZN7ܭ*7W֦Js\OYsJʟOD8>_K_Ur*O7:$[q{fi^`1Vy}Nޣ!-aDsTUnDr],XTRyTC?Vظ> ͯ#;-t}ڐ~- MWAT=!cr??Ū\y;ZwL,Mk,ܢF V+ʹ@b[C:ǩ<:^;'K_q骽XDQgrr=ڦ dreV!hKܳXݩJn'zW-DHܿP<9(x"3.٥3M.HW:JƮeKConwUڋ0!7*Zsq.&UڇH{wj.z>rE}vX_f+j_ Z;ԧ5/9ijAZɽ||nzy}5i:?mgODɺִj3%:bhE֥Y1G]l'lwX|qt#Djy^ژ`q]kVJb)[cÛ7k8!IeJ.ts DPC197T9*OcUny5tG4y O.6 tq\&i"ƉՇQwb-IuOE+Յ_~pB3H.Fu-f]ĥB'yz馟n53e,244qhH4BɖQ›/XBW_P, fޜUdVvz1gWsą ʁ{߁D&XfDzcX8CZbn>9%EY::@?t^M;C::ԂYӐ*r3ͺX1`4 `֍Hhx8Z)Raj,TxՂAC6iYs,^g?δtO͒{[,&7,L 9qt!)XJ5XY YT_Ӛ9Xu©K- ͪj坏k)NtZε,mNՃX|}qa:PsF}~6K?Y+/X hNX#r>TGOV:Jp?ߴEV:&ݬÑJ+z &ց_%k-wv]ivV@w%sʲBLu1螠;'⧞fÅgjl^T>4*V]o]wT;}-4x* u5 wwSn{a R+}'-i}sFoJZUQ~-6qzNu8j!izetRCUS_ c/[pJ'+R,ֻJk0,(z+UjA%X9S=m;/<}bRǰz^P"ʞH':iN/1NmV/gB*SݹX^hP߀ ?V [-fζKrx^/볜R%z-QR+Uu%UN6˷t%r q (z4(zXM85uYi^p*T@hZ 44K;/|u1YԿ[H\UMgʹh.r*jR㊒a Uګ|^qwJu1dOuSUiÕ~J:U-vS*Y:މ_PTG}DOC:3gz&UV$iV5XR/B≊o|-8>tQwÍа?Kp+}+V<ՔlfJg"=j>v"g{_u+`z-4J 鹖N{G%Xd:Xܡ|$1UR&y*7=0`M,* 4xjteN`:xuXkzF VJױ4~}җnW~Aݴ4vcőc5pNQ߶5܇8*=1JFm:à< -Mo}-8JGTT;*S_8J]`qp#sǶͱ@{]a UT]mu/z.VQaUɊUi ,z]YoYw-~ tKBehNrӚ-Z}n}{,ɥ{w4 R AJ@Rx.Et؉} 7X-NZiq)ŞlxT\IDATTch%;J2,C V1驌U4"4uS|6 L!.ҴwBsF}J}ՒvP_F,-Ñi뽺pR=v $_Il5+i6lAU_eʂ#֫TLR}O_kڭtZaeJ,t_V,8½A;jr[iMӚ(M%$2'-9+;im =E @,TGq8ncNutG5i]R_7Ib/M^ǿ&Nw$ nuȎcR%JȞ@ZUʥt;#nY ;Vd:ld-rz?^)9B?ΥOGu;4 VBtMzHANg9Z`uX,^b1%BU`Akck&u!^fDC=c=9+dw,8qJaVN}=}vBAzdF́x><:^WۂWڸWUN+uѬIת|QqmׇRpm<154Qi嶻ylxqp~;wQ/XB3 k+nk۞KB=H}6y5qB%Reꯊ3& KK4Tw*=W,ˠ-s8V]`i8,ݸum쯊G o244qhч->{E{)4KPIN=[Lˇ0|,= 7͵8t[ԂcY0pՕtz]$U ϙ4KtwOW;j_0T&Lj0jУFש>5㖻Fv˱4c@ꚴ\4`t|+, ԟ~Bg#@{qw[sҤiPf+ J|%]qryJkJCۜzmZWU.ea;Sn =Ǽg|؋7WG 3^g}gY_s ԩdƹN553Fk=sIUyYiV,' kbI"+@plolsEe&bP MݞZEz[X|N,VzbY֨l;v>tMֿqq8) %jH&f ӸO85bXN4MI\nUN.k]RU~-ĕJuuZ~%>`br%WCfEUY|;çOE<Ԗ`ms巃dCZ!c:1͊in9=/>ՃMgnoz)1͊Xz]Փ*ںǶOsC-;V^_rEs^f7Y<͊%QtXc2{⮲xj*]Lg 3yrZ5i({2morNpLb{zj?Gu7<}R4ͺޥ_Ziʧ J-T-v,`{>*GkvNzꮄ/Zq53Z[l}ɵѧYn-ܣ\*Cɭ>ͽr߱ zaO5G9nŢ >ӬOOt{f۟vf1On2" :OJ>t?8=H'ܢ?f )O'7YSI{yfFI(bW\iΟpajYzq@0UivV}gIR'ʱJssϊvtܿK}qI҇G|4:xÐt>EFvZݷ,^1mIm˺1ي?szt[,3S.֩ }M,&^̱@#6SDݸu#n&o~ˢ}WgYJCb#_իI3Wz;8V0#?Q1o/P5Ycݗ4,/Ϋ'z[hL4i~J6 +'&顢($asrƆJhƉ>=*5P^S+hſm;,wU H{Ҧt;[HwuhJed1%ix%/,\mz3$k,&ou% eBݥ7;Tb3V-֯B:6{k-4]}]Lמt*TŅŰ_sCjl-:P1ՖATfLTOi:ytVO}Bj`z H44~?{feη vQR-lA4Jk5Ŗz* K-y[ gO'tW]T71ңB Zio]*GOwY|MS-|*fY]~ ܚWS%eg_TUi{y\ ܇2JlMsNI|UKX/\<oެGfom'+?ЦP UX&*(JKo}lʗwewwBK듊ɖcOJuEmXNF]OOCQUZޱJI];J[|nRұJ}TRIW%i]{.k,T.rdt, [\HZg"w\l|'Ekmנ6ק/ȴl #݆Cu\QnLʓ>n#4K>H/VN]nUI68=`GoLaP$U =poUh ApRum[G%Xߍm㮔{{&:L_̉?{&?1HzOULf}$l>ShnE|CCثJZc旷bmnadQ>`e Rz -^Je+,3zv]~Mz,-ڳIsRzfō5,Kڮsb_74M{ie ř3ǹiڝw}XHє5-bPj`qםuO;Ơ;wXm0r2)E.>|x&ϐ!p#]3,_~}|^SfŽ#yIr#b=qƕZt.M¼ ӯ-V,҄ܟ7XӦH i6g+}h :Ni4wJt{^sq07JrT V:TW}9_U2~e|'~ީ/H^۬SwOYNIENDB`gsequencer-3.1.3/gsequencer.share/images/0000755000175000017500000000000013607210263015367 500000000000000gsequencer-3.1.3/gsequencer.share/images/README0000644000175000017500000000070313607210263016167 00000000000000The Advanced Gtk+ Sequencer logo and splash screen are used by the final binary hence it is applied under the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This are the mentioned files (logo and splash screen): * ags.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) * ags_supermoon-800x450.png (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) gsequencer-3.1.3/gsequencer.share/images/gsequencer-800x450.png0000644000175000017500000007013313607210263021110 00000000000000PNG  IHDR ciCCPICC profile(}=HPOSE+8dNVDE EjVL^MGbYWWAqrtRtK -bᑏ9w L:MT".fb+׏1YƜ$%[_MuY}VXY ij0m MOaEY%>'5ď\W<~\pY3'6VژMx8j: U[r5o+\5 "TQB6bIKRU#* ~7=[+?9%@| ]@8ǎ8W'鵖=z떦;!+i <~Fϔn5on}>iU88F sӜTrbbKGDC pHYs.#.#x?vtIME (tEXtCommentCreated with GIMPW IDATxws\W7 ,AwHْJR}N66vcw7&wfHe$'z2޻<7$HdA7=<<""""""% """""DDDDDDD(Q"""""" @DDDDDDQ""""""DDDDDD """""DDDDDDD( """""" @DDDDDDQ"""""" @DDDDDD """""DDDDDD( """""" @DDDDDDQ"""""" @DDDDDD """""DDDDDD( """""" @DDDDDD(Q"""""" @DDDDDDQ""""""DDDDDD( """""DDDDDDD(Q"""""" @DDDDDDQ""""""DDDDDD( """""DDDDDDD(Q"""""" @DDDDDDQ""""""DDDDDD """""DDDDDDD( """""" @DDDDDDQ"""""" @t DDDDDD(Q"""""" @DDDDDDQ""""""DDDDDD( """""DDDDDDD(Q"""""" @DDDDDDQ""""""DDDDDD """""DDDDDDD( """""" @DDDDDDQ""""""DDDDDD """""DDDDDD~g̚]]C>oh:%PR2}aԀWdA}T fܝ@8P]eo`=)Xڮu=C/́xi t$mFOr8X0fφ2>+m˖B}=$_0xG028}}KXL9]tybo^=,[A`N Cw&|MM0Ϯ+4@O[4|\7K9?L"+pßaJ1?ϋȮ?XODpCz+^{L`ժ{b?\9BCPU+>jlŋ?׮Y~&;`|wAe=R60~{#?sp9{50k6TxbRPZj'/a cuDf꧛7maqC4?ROoddZ /Drla%<EJ^B Ms9\>xwyo<|OH$]!+WJ1֭n-V"ܺp~?xYe3,Z͛*+= A s <4QaX^ڃ?{6D_T8 ID!~qp;ɎDEfq/d46Ͱk'޽̛QIEI)Qǝ~negei!=Ͳ*f "QHȃCDu^cϭrYR۷|]6̣$zfn|ίܹG0ͪa&j!yQD.rd%{谕(Nᓲl)#e 3*)KYݽ߷lw5u75UM $ X߹[gq |88I&d!^Z}ٯ!A#p |ug?>`X?ҸxB"2A@sk+ 4jݷ {0wvjk)}Αp9؟QmhYcwng|رf1 MMTyCYI q}A"QD6hJk+gg, ۶>6 2;.AF<1klo97ٲrjj _|Y4Z\^+k7xOY ;ll49H,_ƚ_o*g0/nE[u8#\Ts%ڹ^ Æ͛PVl 9⽹R=8c{#Kk 냫]Maa#M?ywge)P:/hg%%O1<;vr({ tC{? u_#kgX#3mFr*םOUA|GOE@83O$ =jdbXoO53YGpM&.^7U3䖤5Z%`3b85k6σ6m|nfK(#?`Dy(=:: B@p۶rᣏ-9t%n6;t),_ūD( ?#멖!Ȣݻuu[df l7?WЈ#5J;As֏ -W @**|wwegdXq-|9TU1{ 6H֓+Wqq-7{(wɝBqGs:!{̩|lghv~CeyctFGo7J|恙xݲ/GOxuoc91*(? @%y#kJXc&^1>pxD|kV B¾׸u,(w>1P1Bh2ҵ쨪b39\C7TKɿ-~Ö=Œ*ض-5Q7fI"Y,(,d|{^}7S%,Q ˣ^<4Zx}CF0:q,g7gG;: cYi DC+ c4m58[GYRfzuճp}ZWRB @#F֑^QdQy ?"aAcꭉ(yL[ulݳqe(wcTyl h~ zm]hª,Eq,1;хPSM~ 7-:a Oqu+"_Cs3\F2޼[6cgeшD;D܋ՐŒI)PH3<{je圝3;^> qsOMp,$bH%'T#}#T{pI[6 -pw/|"ir g0# i FaD'm֣{# 5KE,_/xDx ۩4^~ͪ58*g#?¦l2*aC2~9Dܵ-6r 9̛7t IH9xldȴaDOӧmYQm:MY{])Y:ʒ<`0KG{L/^L&_G~L(%2*ϣyꁺ^qu2~gyim}!3;L+4>҆\pvEU \~S6:HmAE9lTht,]fϣKͶy43@ɅyI$80hW/NrQu0 mY8q64?ʢ&زٟLtGcD$@;Ad2IOPHP9T8Vsn>G(ސ9<ވH730spO?OHyN׮7T h |.UVP6JAUߦ?I!,fF.6̃To2 Lu}ăDC`0 h|v]˗s ^ZMݟɤmÛϞ ڙqo>Tp D!55P^6IkBV¦sϳ6-bŌJ֤J,1>sq7_=V~_=6 TR ,;SP2+@3 Au=pG,m]--WA*Zjui`0; p9L/xH8h#.F-p.fgn!#UY/FElSfS#/f$:Ma||J;;7pe k`u‡E{/Ϭ5`Y<097x3*+rMaY3oc{:z8` FW0Et!7i!WmYIr9_nq6¬sV4mm:ӼrՂGG.} }P;2Cemu|S[w{wujL؄c7+hy5n٠T[?$.K&&<!D EvS7mdײeOXcHxhbw. 녬cc,Y[D>sw,idDp:z|.RUGgbK/GݡCzg" @-y 8MćAOO]+[ǸbEYn|,nYgMU9 aAHdGN *> 2񡼌Iv#,Ukg'ޚwr37IIk׸¿lt)[ِz5ik;$ 9bC˯xLƅ̀7I^:MOe_mm/]B&JcQ2AGw{n" p";':dd۲v$\A'򻿙ŌJ66Ili5<'5 >ځ dS[򋁌푹q_/I&Gτ✝0>O( # /n$fQ4=k插iڔܹEqtY%ߔp?5Uo]]-TUY/ي'ۍ} ja!p,vM૖˴8O=66{ϳ`O}JJS?b׋'޸䖙y߻2+gߴF?_%%v_>/+C Ӊw`)oq8\ Bng2d mݻk p[pdi)?~1;Lޣ-;])=6s]ñaR(+yqRFZⴽ^C8^Db8o`{k궍Ǐߟ@D#~yQp5- M~v+ qax_UUe3TWYt:AI}(ĤRYCǙH+;huIs ̚e^O# g+ÁCp:ts66 FG]"Enl2 :[~zܣG%&01>Z|0+ܸN)<:|NiOKEl`VRֱ.ɍs4F+ssn`|͒Ŗi]jg_Y#==.˓ْuk~%v$̉3'/KƞE g0< pu'-i[{vkvvUQŶv.E,ya1d0(fIji犸a`$wf6WVqfBy)gĦ u UUx9r΍hokp||AWE on,<ϳ=pa?pD$x<:E @ƛ;t ̇(2{M|#H}€ڸ{MV7@w?}U֭-gy\7O_ΙC3 IDATz;]~l[5r_W!Пb9 8CBvus9ۗ708\f0_qZ|47aa#df|/pFp@o*{Q+DnWNوX?NQgomzF.]XEVm@ZʢD*9}||o564UU}攖c "Qٸ5k찮w@7n{X^]Cnh?_{=u k>]Z[m?$ݳ) |au3H%i[m[u'~kQFD\,r[ Mc*`;?**d#wu)^荸gGޗ( 2?](yb6 ߮^!_ _~9%Y[t"g_{$||RSi/lT/ϦsxO>W$ I`.8o'67HBE;=xNT.^vt` ~ַ:J ǏlN4nj_MaOɍ.;7jq߻.U<+ww ǂ8hGtp*o#EuQaVmIf7#hg4 Yqqi&~߸[`,;-hGyBj>%nޠo39dͬ߶x>Kq$_8.|D}]r@/%%vnS"TB^x@#vUC.,IL0߻I?S@ P G[DNۉ" y27˯u׮ۣ`~/Uσ `+:-^xq6'I%mjѼ̝ǜranъ-#ˏ8 had?p-͸~LVEdHD3 R."l3΃7Ϋd3g#^#2vCN.4Fns9˯lVž?`#`̛oIG 6r,{c,>|=,_NEKl3F>IY_ >{%` *_l\ޮ?|8x p-̗_ٌQi}0y޹`>OEuu\ ON?phq-w٪dgEaiB˕G:zQܽ "w/^E<0Ebdi q#uY^j\x'l?A`Ѯe,PaH`z{lݥpez7M`'M:=K&i O(QOZZ@ήѳ$(1>)ܟeF޳%ϊ#?918HߏޤqA`T7pdJnG"᳤WGcr*:'ZV/z:΃JBćD|Fۅ 62V@V&=o#g:=p#a\c{}?q׮3~~u:6m/kA07vvO,YgL}ij6WT2 ۞^ym OJt7!w/eKm45ӼŖͪ6o> DgA FJ!wv >.N;b^Y@= 7٬87n>}]'_<]+tFӒ%TwON_2e>0>jO>?6CZُb'OA_?qy`|-2 ̍ U+q4;%t*a3seOY4z>g0cul;lVk1=A"~u&L=[=bp Y,^>. 4oݲ_\%H&ޣ;Dt<c3ٜ-,BF D,qO5 ,e?$Qw%"{[g|*UM \xCt[)De\;/W۾nvA៯g AH!Dp >:GO㼟gIsu90k`?)=8 6";X2i'hodAH6 Ώ+:>l|؃-9\&4Peצ1j`^J6g ڃ<ܹg[ " )` eeO΄W^weKIO"v0W_Osiߵiqs:1 s8ݸf%gvģޟ{n"7Ϳ˖^[uhKB6KO?t\ścI Eqܑ6S$6h4ͬ;,ml@n0KH-wz{m}qJO<;q"lhQn{ٽc[ZXgdۀ ۿlv.، OZ X l/׎N=5հuؼkoݲr#;Y`?Ν TS֭eTL&S '{FxKK(0{#3gZC=E= eI<幚t^rA ~DuӅs/ֲev_N=5wXY8:q4Ϭkc&)܉P9,wq 1 $6^ǵp 7NU*a-|{^> ֬=Aؒ]QLԓA{In˅AۇWYۜ硯S)KǚNA* |)ɽ{ػr;hNayܝ3.4ƆVK+ uvRy"9WLILx@%X]MgC̪XNz ;= @Pp!_WOtn(<;[`ƌHMi}\:eAb}A' &lQA6J={K8WU|Xt9N;>! ¶mz%l_d8j?Xx ȣr;lAŸPN˗q׬믱{^/: rl+9,W_ʕN^r @, x_Uopt[{mfj_rq,lM K^|WV0\QUն>x|;cb6\ΒRb8g3Ԑtx ADy"uP^|v砯($_ɘHRc]"+`˶=A6 .rꇣŝ%ެgKn\[p⤭}F*z>,^l|/s?̙z5~Mch3*gn\K)\Ҕak1P:PC2]W˺lű2nP`w[!u8֧ҴYK\ Eow7A!H$IS$I &_618/چQ~_ESyKr*47;ρ;8^ϝ.#k}59[DDȓL͜Yb`Nuaڻc [|: }_!/W|? PK7vsA?p9}b<$sC6mWSq#kfϦOPVt#~"u=`jWC9p℥,:/ 4xhX37t { EHGyL ,#G" J>``^MXwq\c8I7.Jc#7"zs9Zݥl7rB#G06n}/qs: ^WUCKU 'W K ^zzlC+ ؿGUI)ŹMy(6Α"JˆrV9~yQ[hnh@ɂT\7UGkLa@t]#>+; :*'YK A@> CYu[FCd0 QD.h'KH}tAvˑq~ '̸L5.^߷n=TjVM%lxa=_.Z3gm灃6x" @n[Ny* e'Ihd\Q#;LXbj9s`l$\(;-Wl;[[hmZvd*aU;f~N[7Fe2hxqgp ŞϽ NYXԩKb3x_z ~3 }=UtwND6kY) Jx o=#L=Nnlh wʃ)G?ーSk>~zz$~oyY!eia3p,_΂DEx"~zv€Oe?WZgw&e^ѝ;djM8)ra\(?rM.ׁ_ΚEs]}s9E-עQ/2DtAokq_ls f弔H8TVqx6Y#G`͚,[6Sv8i{e|, BsHp\YXfxTD3|G{.npoq | ~ne psf%XwR#󑿳8j4b1o#̈́ *8BGa|k*l͝\wU QQ>pN6hd?Nv*K ;&osI~s_,]ºM|_@8|he4/l:>1|^pl|?v?ttݻ\rVѴzjg"/*(+%#%YgZ6o5Ñ#puqUp_\^c2{*zeYSlPn_Y{,Z:}u-tOɖ<0@Dea?Z*eK؊Ϸ3[Z?0 <}ʖM| eMǞݼ'Y1葍?}vJwX|U]MkK$Y@OB}ڈ8K',~:l3EK--`IU MCwo8 cy,! ++=gZuYm@*OD3pIyRg<?nEs3ٳ|glf63ϛq̮W8u+NO&gnU:n }}tukݖ-g>ϧHLWїVMfpEd('#V=o=667 k-%0eOe| #Q:haQ=-Q e=y"DN~T5<ԩpA`!ٹx'8w5WҦ&G:QIlz,,ImDt/zzⓧlKp|>K2;H8G2~}?϶jkm_Бi(,o--D Ҽqò,Z2G:x˗,G IDAT ECk -Y "]AѾ^>=:.C\{MfΝKYI D(%$:b<|IHVpA|ܵف#/|l5q%+׮On{-zUesq֡Nr&Bd}rpEtuqx.6ϙBϣOLɲщ,4~7ڞlh\k,2$ןIlb(&Q"&\eA~gmY3g+g,NGp_?z :϶nYP]CfRee$6n$r>[uZcԜ|6| UCL C)dI)text48 wl7Ey9>i֬Q1s&~"AEA@n0KP8 B[ ڨo>o ࠥ⍲9w,{\Β2FΟ3cgeY6ua^5y{qzDYmIm@sǖ'ݸaA}{%/ 7VZڲR{ g+F7MQ|o߶' , YX/x0RU˖f렪 O" zezy!Z&wQTͦwZ!@@E&!P+T@T,\+6QQR*M`DР םRvB<9Iƃdfd|wǝd˟:܃qffJ͖J~kSO*Njм ;Z"}\esW{swĐ*utb֬@.+<@*0_4+G n7ɻl6gww%ƽCIشujT72+ 8{µouYrW}: f?')4̬A-'f%ֱcs|~'8p~R0]hwyfIvy,J*o(2q3,z2(|>żQͫ[_inX]gtT|l6sA{`]ma>*1k BλafAIap!drs`]9v_T\]$\[v[xY< =}8ߋhҾ}慲 . }u6\@)$|s9e>Ǵ ~쎳aϿQswEp.W 2h3 ݚ)>H.8,4A8WM؎+q]r`ݕCnQX?s&s࿖]    @@@@ KoߤC˥/}OS 3Fͮm,sEY_HuZɃ/Ww&_PU^|*7'G)ǎqPHqo\U$IZ7|Y=:ZWw*+ 6ݺ)+#e->h5VDJ $.2Ҕ|vm٢ki%G7i.7,IZpouEG.]$IK3o; ݮƍ^|:vLvւ+aBP@W|"IjЪuy"*WaZ=wZ_o-[zLYj*ut!jtU'qJ-x]l+\{ΜL26nѵBÕ] 5j(K5*W.S)NMk:guVni__Ԯo_u{*רܜ۱C>DnT>lVݻ)vm9J=}J?oNkwujӳjԽ\JOIЊYZ[oUXv;xPk>_Тk[rE,SSJ|TIdesy*ԨFW_-x&??_d.n DhI҉$͞8ewq_H:+sgUVU6MGiӪbleZ]߾Jժ)77G{mӗ3fhwfuﮠА7]ե>7NqݍڴVj-vQnPuTY+f;dm[tqpDR_pNI6ծWoE7n`eefjZ\m&k:MS|b5UPhru`.|S}R%:Zcb'NhM%e,>vԐd>H0\F2~Rvߘw|o!c߸y=dk`EGj(5>e$.m?Ó'  Xtk d-7ϝk*'O]ZMu9aёO=U\TtˍY^ =7X|Dsgf23H0\ƪr//Zd)oqU+66q[#߻\b}cc~Z3y[$2;S.wgF28x>/ۼ[qݻ{-?~g9%}yq#g$.??X\VWreh|`)UdLXXq;j Dz_<`$.cZb1d>-~\?=sf>5Vx|RgXIK|Kubc߶nUfZԪVhd7NbWp[tgPd{HKӁ]PUVDj//ϟ7$:w++#C*VL"TѝOSzZ>/vewkr)i^OJRpXj7h.2ZOJ=&7$':)7;ϒ*hp=u5IONPUjTnv>~ %9Y\=>yrӀ3=0 ;xPG]aeR꺼qc=Tվ[SP~$IڷcSRTFMU]Kß|B9uprY['/]&i2^j(R% ;VEʺ acph:}츂T'6V>N:IUkewMPrsuh:vL>NjR(5jiIzz'rͲlҁݻuIv Q96=QBwl6K ױux~97@ d])_c4Se3:  վ>Sd^c-- ~u%&WrO7̙ưXnǍRe݆;h]u/SXK؏>}zu|uե_z܎/h<[Es}*~A1 1FhE{`Y?Ǐ/v%=Xt䰵mX4wދr]om #Fx][ H;0Rb^{jxe-y {.2_.22-1D ^s’%6J.1oOA~9%{1rё%gwL2N2:Xd #F3͖-[J[ghݻWezn<;gb-{~ިۼyBuM϶}||o\q&7ǸWw Xx8qݻ{7k&|]1*5ŨӤpR{P>qsy=nͪ|L]nKrW QQ ,2c|?qM;/ @yyZ.75t(Q\kκioA꫺TFr`߹99^2quF&,Y6r5 >ڷcFAfIqH{^n50`*Q+fӮhӲeTպ4Im{R(8Opj7 cZ9S"[t I:s=zK~{ݚ7y$鲆 %II{j{S=]LSN?~q +?_gܧaO,TAQ$)';[;~k޺kY>sn3FQk QOJoѼêH9dJl\5GY0VNI3kыSIn#oMߔl->(.UсR*w>}~xVSG Z8oߎ|l;ue67zjPң㞲*޴s%Oۄ{ф{Q1?6T:uTN!Sb\$)8,Ll6ǃݮUJiP+x /s*m$c] [5rsgm SǏ{}3gή!ps7wm^ZtlEI~Qu*i>~iĺy`.5h\WYf珛`"$0ؼRס~:)Ny-&(v-U2uZ1cIݺYU=p<@]yy\ik@38w%f+Rs*SxPfZzeRO9b϶mr\rǟ2 @ռCv|6m ZԴ2dȿX@rAjͦ/ӵ|t6o_}MM۵nW~}];[lRl6x*igRJ-uI#"l6+V<< 5 V0(BBqk(sn/)%9_3,7=Ҫ5lR]yeStJn/}yCNq:ձ_?+c$6i?_uCj뫬 ܼYՙ'cU鮹]r[A|dkԩֶpsTd+c@;GڝTU`]idĉEn5|E ~TwS(aPԋ:oA!UZUߟu=۝Yt7mRÖ-U GnI{jŬVKzV*h/x/pD[='+KNUVF!m:שBWVΞ^roG^fHYêDeG ~+ʔS?SэyRꥮ5k_T+մm[MZ$q@oW99zaZ=gNen?/K=}ZJ<R3'/7je˒b^ /n??0Pw>;?>ϜcT'6V/BRtk 'SR^|Θ1ZC#@EҚV=&kP~l)%xke !;r# @˽n$Rja^[7UJy<^ z >~%%;&Ijz][J(Vϙ_q5jVx{p JͭV#kͧYf󕓕%ݮ6zu~6m4mtIDATFkj׷ZDwѣu]g+~6[|wb0;'MҐkȘ1V-;cWNV*Uf]߾/pZ KhУE.ּ:M7V}yv&Y7֔55GTPpoճ>1VW}[v%3( =z𭉪[0}޽5q*5l ejז$IQkը"аU+=8MkyI|\.?Ó& [ҍ#G3ٞ=v?.g0w'|UR;P`H giB+Ebք ]K#G* 8X#G!Ζf_`:z@r-Ӕ'koPVF ÐdmW, _oi()-s.JOIR!C?سRYq:nVZN֜JOIQzJjAeڳSݻ MўmZM^1Rv `R5wۚHMUfZZUZJ2Ҕtxn7qhNOGPFD( (HYq:}ʄe}0ڷc33DD_Yڽu_Puh~ڹGfg[e}tA(ڳڗkMEK3ڷ}8<\a өHLc4aqQM_zYlQcJ;s< 2ҔǡY&hҨ:}|N|;VFj2RS/JWzZh8L)$<\ +?_NiʕKW-0Ƀ5<.Nsߞ+/7W!! THx$'+qZMxzl:z@^y^^ٶ<_ٙڳm>~eM/za!#-U))LrNv]NO8@ݯW|Pܩ,(4"BAaa2\.fzG?k~62RSp8/"B} `&Vi/ @OYRpoztN=/ F6UUSC)N+JۭE.iTA!{*]߾Ʋ:~Ѱ/8]ѪB##q*'3SǓz\es~B׮U޽uy Pfzvo٪rUx&ighO[y*~(s ࿟]>$S|.cF+8,4!t@@@@@   @@@@@@    @@@@   @@@@@@   @@@@@    @@@@   @@@@@@   @@@@@    @@@@   @@@@@@   @@@@@    @@@@   PRp#|uIENDB`gsequencer-3.1.3/gsequencer.share/images/ags.png0000644000175000017500000010214013607210263016565 00000000000000PNG  IHDRu]zTXtRaw profile type exifxڍSYr!9Ǚqr?>R 6[B×$[ѪqԠ8υ_)dPkS&ήwJjpg" Yy\ƏbjCTlߙDoNXK!OW|h-`}i,/=JBI,vSo5GrZoMFz"3uρ1#pnJDm>zRhѬ];NmD- tVSS fV98ș͑d1H8nCή5F0hy̠*:!اb+y7;A1e{NJ||[Z+3maRo/ h׌@+iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann Advanced Gtk+ Sequencer logo AGS logo Copyright (C) 2005-2019 Joël Krähemann, GNU General Public License version 3 or later ;E2b iCCPsRGBhe\U_Z6{ݛi;K E%DAQTPTT{΋s^{Ǜ]c[~ u05wus,"8|jO9+[{hDx DDq'D?Ux8mi~ap^{oWq|`r?%7=eAg()?r|c}/a ~ y&ٿN: a؟OJbG:{Y`k 0{žɀw X +`pn ?B@Q @Hi dP@ (սDhM t.ގf́!:'W܁'_{ p`o D(鸽M'$ R@*H dlrA>8Pp(eT*P j@- h͠6΃ .. z@/2Ap a0nQp qpS,x90g`%x^7-xVx>O3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TAG8T CPt: 5C9<]5hF[8t&)hAOy-Be-AOg+ڀ~Bh0 #a 0 T0',,Ê2kZưl[=;î;p8$8N3l8>Q8\ WUp \7p.ux;|~9^_o= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@#J'jD-фhE#:]K~50b1D<@ #K׈U:b($I@RT$ɎF!"HR )TD ՑH=!iF#.H7 A#qDd 2CF#K Id4,َF!אțqr 9\@D.#Wo / (,XP(N/J%bQ(%J 2D,Q(3C"P1T *CQը:iT ՁD nnfQs%2j H4MD3ihv47Z-fhe:Zm6A[mЎhAt::.BKUZt ݆@wWCQ8z~~~^GCocaH*Åc1y F1Ęa1g; D`b0TL&&S9)Taj11͘s K˘kq)5f"8, KŲaXQ$VU` fXkaðAl&6[-a3VlۏĎ`ǰGا%vC8cqb8)_/Ov| ?/?7 C v/A A%(4 S5F!B фDB!P@(!j -Ba0DE L kτ o"DID"(J"*Ո:Dc%ўB"CDb:1XH s0s$s"s:s>Qr:&̗G'g2b^c X*F壊Qe*T ՆE FP<j9DRQoQ'ϩ, $"&'KK8K,c,Y,cYgdK(46?M&GSi4w-GKҎiufZ'6D=^Vi_iOҹBt)]nL}!hz =^D/қ>}>OI_o"X4VVQVYVUV=VsVVwVp CXYYY/buu+6FcaeeScg`sdd ddKbb+d+eckfvm. s7lض;..îʮnɞĞ^^^~}}#E/"+CCØÆÕ×###0 &N#/8q|Dp8Y99%899M8899#88989OqrvsrqNqsȹ %%ǥeeΕUUU55)2'-nMfp+rksrs{prGs.>}c%5ܻ^ ^%^^s^G^o8t2z6뼷ygxxWxQL<2:/ES@D@N@SD^S X V CP\A]O`D`R`N'HA xLbJFN *G+"'$!,/d%*/%tP z6^a{BO^ F 3 s + [ ; G  n'<',.-0DEEEDEED DENt YY.W &*$*+)j*(#&$'z\NMWtDtRt^1]L@LZL]DA[,T,Q,WXXX؈ؤSb_vBfN#S?/~Y 5M̠0 %>Úf1G'-0c1xؕ HKKKHXHHHHKITI4ItK\x#UbW/&),)/#i)*(+)yDddSwߥ )D\RK HIH-I}ږHӤeͥc3OJH_!=%\zMzS),+#%.c*$+%&S$S%,#3"s_̪̦,BYWVJVCTvlllIV^Qidɡhrrrrrnrrr9rNu]-XnY_y<~H4"j^QiE XVa=OP  g+,(WV) )+*Z+z**&+RP<ح88AFUIXIQI_V[)\)UPZEOҌKJ;DeNerr1zA+*H9]O0**U*-*}*TfU^|QJVQRT5WuU VMTW-W=ڣzCuZuIu]uGƥ&fVvF[ڴڒںڎ:QK]R]C\U=X=IzzzMW_5EOCFC[ZS#L#UHFƀ9MM&]SDSIHQ_3V3Gffg]-VVVVyZZϴkish3յʹ]C [/k֞^$֩iչs[gNgEgK˦+k[[ۦ;{G/=^^^^^5z/>yeumGg?ߣSV@@ ٠РƠ`'C!aaaaaO#QQqFQY7Fhc6cqcuc cpt.3?LP&l&&&&&&&LNt̚14Ř2L5MLL#MLO153}bj om&mkfgkggVijvll_s&sAsEscsgGg̗7,>19--Z>w}^|ۏϵ_v~sW?xkw|bv}K|}GS3+?ʟ_??׿ڿc / 4 3"=`8QZn K #P'10$0=,-zLjN5H,H;!(8(=45zLjN05Xv@ RReSMS}RSKR[RRxҔӬ*:~Ӆӵҝ{刺MɠgHggxe$dhxTʹ ̬ʼ2Ws#K?=+6(l`֣lll;ٯPs$r s4}h0|asq3=>u|| a'O4rbz)TTԥ4tY2J̨̻,N?lVA*P*+*+F*UlTR*%*+}*VVTvUNTU\UUvUaUT}&VUT{U'UVwVߩ^=qRГ'O<bXAwMJMyŚV֡6vYFsTi]Fɺzzz_8tTةçΜ:FsTYCfCmCLii=O'.?uFD#_FsclcIc{xƝ3g؟8Sx̍3/:K?+쁳g^?FstyS`SvөMO5%M3k5i!0Z[|[2ZjZ[f[>Z[ZloiFho3jmKoiom|xq߹s=:.nО^~}y-=ou::;B;w4uXީy\xp J/\0ya"ES/V_8{KKˬ++z׳nzB]wDwQw[XrqI)y%K~.4x^ZBmoDoqo[x>Oϣ/oK?_߼??l\/\N\v˟Ӂ܁Ɓp\Q|%J镮+SW>]%\e\5t5ꙫ#W r j &V ^|85k \|]ׯ\9DRr:6taЇa0ct8h8ixtI22?u~C'ntxpc}4*5j9:Z86z{MMᛆ7nf<}s[|ԓ'Ks`N``.oyn|ne;Ϙ?29?5)SO㞖?{g4y? 6 Q 'z-l`}EꋺC/EEËmHKKvKKK}KsK^rz2e˛/߾Be*W_=|5k_׽zr^^6YY.ZXZF75oY| zk6moNw﮿[ZWWLVtL|[ZY]^CYE[Y{{ޏ_@ C܇W>,|(c|IO?v.n^~ygφ>~//j_z 0ko}tBfTe}SEZf"5:MTפf3OhPQ>/CV[LXC}5{&c|9^p6T]DŽHuۡp4| l HVo 6EP3mzc eher(h`O|5Э踌IW KE^߯z5t5ۛYs+#Fܘ2F 2[R*DaZ-}]&MUWx):^EV}jFPeZcT}^]k4kj߷YT`;n:쥵_? \ԈVlhoD^ϭsi!&M1߅ jrJT8g8x޳ϣv*ï;V1{r-weUը*CUO+Qg=@*=v+s@ܯN 傄9N_xX{7=#Xc^,ݓH!Lx|ouowAg;6Z&'`yy3`RC‘= :dū&vyRhfl ʴM;.#~90 VkVj_zI|;G|z+ߋ}g-wӲeȥWIEK/-][n7dV}5IQCyVICi SH1PIOF*UŢz@Z#'Fc6>1?i*>!tSNEϞgscg칅sI ĭ c*QĮyN>.Xvi\p+✍/҈=q-ㅗ{ qHgP%U yB^z˞7=g\uEDOGyCc&kX(ODp@z67AQLkL7j~ꉁV1L3+2cq|JtbT@} ad">Qz҇Gaߖ䝁;1-]펔VQYv#\C:>2aeMC߭x{ķG8$~CQT-;ſL28Q{T+tNJ勴x⍉5VZ#_k|$űlZȽLF|7F2?P^, ε(6t|͹ıT!X8db[Ġ"ubH}4jvk/olJKMN6<lějDjAQy=Nzݬ0T JZKm5'Ύ-;;Wwvv&0rλy]+7r#~~ib寿7ӵ׮^zm7$e?pq>bXM6`Tϻ ڤgs?~%-/u-H hR@_ӭ&-'fxs*F-_Sn>>sx6ŋݴUjiGhB/L-{0/ZUR>U T!?G޼A| Mj*JSlMeUw+t6IlY:=\[zPɹOkbꐠ*z88)Y^b<7m+&a}Í:Id蓆5QM7aoܖɯ&Ƨi 5ySZN*L_XM6:U.iTy6$bT:}0]0;=Ao VVGENn7JWɮﴊ:+uB%Ow өCSP7#}4%wBz_[ؔkޥEsa?HB8#~zâuA=˄&GGDkXbl8H3JɸG$1TpD49)c@@w)P [yv8 x&sxgW:׮QZ4t>H.mq&"h半=NX4oL붉!r^ $Ȓ24]:;C eDZ ρR~ 5O`?F|Z>-?/{)_  ->z;|{㸋L<A͛7%WR>C71uo۟<7l4"t4+_>aX&gjMY7LT h{( +eZ5d#|\ߤkhB+ z!L>]O"* T_+s=I|~^Z?֓iםqT=x|Ne|nBV+{~hlrsd<T@gOK[sRej!eaZ9`QrНT򕣹~ggճ I&WM4D iB?҇/ONјl-T_KKxpn𼚖\e"򼭳N)$!$!--yi2;Z㯋9ZZ} -V>RSAՎٌoEo#.+MsZ)g5uNe1DH OCJ۞oRC:Ѣ.UAlw]\%y Њt.^IPY&ŷ:}ˇ+|Ue5YOԢ\nCx-K{ S!WX/N'\gP}Cz:F:xD;""\.޲arVZ&tB+40L8+] ٲEhosUޡC9{LA`?4=J6ʆ&k`3dZH3`0.ЈNFZ*dS5?޴Z$)s7g-0 BTu2绡(Uv9iҜ`սmЪIs^~L )r&yR;Sq,TJ81G>2uwQ'nQ6YF f/ҲV>!N۞w^9ϼuQM .bE|,mG1#[iE :Nd?^9N]Iw9;MgBA*TEKmjtky)>2"OC]ku:"̣mfُfR&R4D9pRFZi |XU.sRVQ WjBٹ2nltM)eĘSW,qM bZ庍W"as3?.X\w>PXA!Jڬ>QOPs",_jWK2wY^Hr;Y8ɓ7]8fU_q˴&Fe=VRbwQK6F|1";׼7Vӎ=sp4oE]{.ten38VGS_+}VK TE \ry$qCyN/FJ+/mS"a:L5 N"szPD.%Qe"i<7Reٳe7lo^c=cj6P?y:<R(BpU[7oݼy۷ܾ 9 ~bZQV^>!|Zyk& xTq눪@<(-6B'xH]Ng{䈝)g9C[vskؼwy=;5SzMߗY-׫ԙBiKܡKp=5g<;kkӚh-β7RS?$m_?$I}yGD,^$y8`tNTvU+ ЬHOm)azMS B|?~6~P73YV  Lin4 UVt`nUbaxǀ0u< ,4(>` ²"sP%L%_-Hk:UV;d\yӦf Or땯 bhDm&>F?l/fFgRMuZB(9FPwٗ\ev7vTPb$A !lyZ~7v(0ȫiaS%-O3L;%{U+b"Iy.J lzwPrP` wjE91,6왩V.zSZ0 Ըg; L`3˴8s |0-[sm}{%-8׌*PKOpCsޖۙ<[|\UZc^z>乧*f!'MM~ֿ3ܜlX#䉬SMnGk}D GzƄ.ej3:dP̲^.lK ioK.aSV. z/}FH*񇴈8SjB0ۉ5c_7t2:$CX6sT B˳Tגr3)9nAMXS9 ڎ4If pC8^sz\e 9)TTK qk=Ca֊əeyv>-HLgEh^OJsy|=+Jv|afZzVkCa?f%Kbyͯw-)xSt"9Y':!שc90+$Or*pvdU+>fjP(WD sΕݵ34St8N>'&ꫴ}vmqcLOw'Ma։9YxMr,(qsUh};ZHK¬"#zF(v[蒦FJo"@Ԋ2jZF_2i{^%S0˧5#h/~HtT\{&NTŸSFl=1Z-Z!ZTJ 6PQ*q;)SoNUخ$.l:шWH}=_@=["u8Ӵf,n>_«9̣?L&y^Z M63jۧ![Ѿ`VĶ[VQʻUe *=´T=]倊Qe2̞6^QzS HF贰8쯃Ny$0`k \ry T< ,{"c;jdNe :@jTpm+Ɍ0 ys!['^E1tQaW"=z *'^&,E8Z@z`42-K}M>ݠj].;*Sj$ڙ_<>ħZ:cO iK=485_}jWx>c(RUCqU^Q]᯲VPj9d(*_eU Ӵ>{zŦl''YekS|H8jI! IDAT$&k tϕ{:V\ ZU׮մé(-Oʭ=641 MU'}+9ي]|`+5c0D`NBrh?h5 _>s~qKZ1 [99"}q˅GmyGT6h5A {4)ǃHI))ݟyz!~f@/̈́ &ֽRED8h]ثI6P5_;fORS&-2jԡطۤ Edh;Emhڟ0=ִ3;M2k 5Nڧ:u(mK% ׶2Tݝ6u_Bbc"SR*y|wouՉK}NrEC5T5q,5EŢ 0xb| 7:6Px\{X+)_Cw\[hkʰICǚ15mr󢂹pRiØP*Utz )!YB>MЮ3BQt\%]o; >l&e }FQY5m"cq,= w4-F@ºs;-Z4YdȮbUFϴ;YnE_3LZ1k'-*Jgn$GTq pm+.D.U.6߷>Rt3*CM-M~02՚f~Za d4̟ȰdFLg#ʳiI9 Uow-)؁sA*䎉*ϓpVRSXkԭ"^s^ݫ9|cNc_a0W>a{ "JyzjZAwӵGkO" U[~1PI=Dn%8U!bv'PDĐ _Yi?J=ڌs~["=b_3;tse632TD8|v"|̻HZXJ-}?5%_A٣^̭̓6 هyh} F ,Xjpؾ2-R@O^O?6WFwLcWZY#ƞ;EuNVV ЁMJz铧O>nĮ2̖$)jBLcGۏ\v?esv 1 RZNw;$܉o/y΢Ѱ 85 _Rs){}7#gLpJ@= :9>n{h2ė/-5|w e[ ɮ]|$ f}d2Z*Z)$*?O)[:oLK.U~Fʏyl=~ǏIIDrr}a=uXbM?9{=!6t}͕GQ`݃2 ts%Vl f~ێ1\tt|&z EUY ]Dk=:/IN/Κ%-'C[|}9QhV})7.4 I\6 4(lc~,|sƭq|zP3xCV:0]~{ЌSOZܿ9-Zd(DD9Q+R HXԲAc,v^ ZfFwk+hf*6ShU;,ٳPZNW B[ q9ٝ:* ==-oq"92Jv-?BD! :`%U2-<]i䴇-ņ#s9b xk5W*oS?,~QssDXdG!IN}`]iXkH@Z_iRZ7KXsʐ\oUe9Ec\iY^K aN{1rtt"LF(~?W%&l i՝k 4|\iB+wʛݼ8)BMj^=|L%7r"B ߮cIOi=o>1!i~0is?j9h_cW/E(FKgs_bW5+j]%`>X'5f-~|Tg.UKs4}Z/G# X&;Kh0ĞPkpĻ>jAtӫUR@CtXS (_wљ{:n3%"eOk<t?#ĴVS-3˺芒]`wvZ,4LKd#t?~Z324+l[?W}_u0tDծ`ԗy+p*5Q.=*XZ[ 03] xhX0#mUr%z^IU@iIyk]AX~_8pq2 0/Š"37ms!oe{mr֜JU\7Kݿ޽{'S #\s0 !vq9kzfNhyc akV;}QʬUJ<.J$`cR`y<`"bAmY"XWf5 C9fM( &E${!D `ť(*G6h导1h *[ fTj$A4dטHG?EMksj@ Q#[Qjפ -q!塡$2XW"ɴ|]Z9jGKZ}Zk!Gm(`:VX(B ~< ˶&  okn5(J xr _٩CVGjkZa1HZr<νBrīN$vgzB:V_iK6KENl.S5*|\JIdL@48iFQr̯ ak>O./ǴQ5h] I&~/BFۆtfI;w9S1pv+>`+RjmqٚJR1Z .I}9^ݙJ(IǫKV񔲷̾lzRNWc0j}nii(eB߼~L/iϦIFUiծLkt ]]{JawӊFS?5Keʃ*l [H+4+M_tU|HĄwT;?5 C=$ZZF36SNJSMxs8&gY:nV{03oXNY=:>hM etzhT":22RYoM&dvr q@%>@\'[\YR@4>!f& O"|}1чJFF8:U7l!(M15ê:1*>,-D0İ#?CzX̴^.`' V&l `W/MZQw塕w(ogh,ņy Q_DscTZ؊oGZ:C/hY; TPF7*JG~|$rq6}h(;YZfLDGu{n.<jz~0}wEsCf@|6w&O=}ǏyL$r9)8Ib?F ɋ/ҺgBdK|eLKn݄8caɠž&o=;T {%RWUC~Ч:j>ULc"ƒw 327 LfqwEu~x1 [axg=ڴU9RfD#vw?v‚pf^ӲNu\qw+*kε5sT^Q6ΚgAU^$(rQ7%0fA(4'vE@ifvd_a^4=?֭$|X6"@f?1"=ںq3-*PaVثQG{|Ç%Ն=' %䁪p[p|Zۊz-w瀆ZޙW29H%tƱr4DZNGUbZ{c S]l&VT]& մgx7'?sC5 ];}u ,`ǮdDvĮ M[ZjZh'l6֙V@+DJ>G_}#PȨ;!lOLTp>K l0JZ<5f*ϯ;;i!(1G;\%>YUB8'RE,)iaxa<῰H@(sfGyQU ū:pTpq1:zp-W[*$v;- tu|tp`kj#?pVs(g\hg|=m&(7CPBRݖ*Ƞt29LA >|CjV [rλyƮ:*jTɇKV~)dOGP fEC+t9"X}{AM*,~;LjRwO+(5F܉1(8]<~\#>\w..n'.US\gOWYOګstDkZ(UfgfrMuƘ(YݓWڪnۯks䟃+#4@zMgEkZ4H!J3H_M:A%Ztц` UVX~=ߘ-gA!ZרRQ!yPÈs1Ѫ4)Cc vBf5uıqŤ9ALs'Y!-h?a2{"3`\{dq:ِZ"iOFܴdV@- ,W}˯Y=;6-,?U_AմQco*t#]nQ̼(0 /7I ?sptѨ=Ig:gr vۉ TնWSk֓M r8){mZVs \2!rl^Wy5c$:^y׎Χ2=M9 cìi%ZC4Xfhdm{ on3#>C'3# n$zٞCMcq`LUIKthOlNȍ;rrj*VAYXvBm]C3O~x2~ZRh@ .7@4ڽdOtf RFl5tEnF,(_:fuV ӈ>)6_-G$C:DJ6:\V&)8&n)QWRL"5՝{OrUЉU~S_Tfr:K,,0*s!ճPZ _(*&y4Zɐ*O0?Vu)4TǬ51'ɧ"y\ ]Q=O]gE-EVboE cn5!Q+Zy%XSC|tnyQ\>@3K\D0 |&N-͝#SfD[`|Ȭ <}%Z>g ;r"m93=2 Civg-~c@Tw޻ycoY_(2z(YZT#J6;7/3ҡ|2|z6%Zℼf0he\v/fJ'xeOh;}.!QVUTB/xPN(D6rlf}h*v4vW+a=_:2Rm=(]l,(ÿM* OU=g4г_/A+f,}BC^"~ꮔ039= tLGT7UZ\lP3d} U3Y_fD$nؕȦļ2ʏ-{r~<3_hIDATqh6!MM`QZIcтr 7XG%֘o2]Z"bQ3"*Gp;v;QqA#LpOt bng4|xYcj`eLCXc?s>CMdRokI\?P4Q6a 86%ܝdi3ZrHMO,ж 8frL:1>XbLB|-Us5N"؊xwVr>Mh7Uz5C}PgG'Q*SI=j5MCT-a3Ao$I.&s#U1ݠxp?-fu]N %X 0 1 ]oH2O4JıQh __{RhњuB(Y0+)bR`yYowPST{hJ4E:"(zBTݔ<`y:S0/Q'126{[ qMq Hsl~cջHԾMag n}Z7P]z嵉C/i~nV$5yz-fdc5 ǵ9,OHA&)5.oZ4?}7Ww3?SAp{BLwnz4g*J)BvjuOk+_fi5Юno^[+ѕ - degUWswVO$+cyU'ݨ z^r1{6|')Cs`gޮ1f eNr ʄ?| O ^CA{& 2 Y B2@ZGRief\!|.4j, A*Jy]?U忑2QEↄ?<i _ܵ1T M:Vd/S %궕>cܔ=nFM7jWR"'s46wӥqMCsֈW1¼or2t(?;Z֥.YQGtf۠Kg!y331t fu`2Ov5% Bp)`ɓMeb$G|*TɬLZ(4(ka QQN:,@೩Ɵ1> LJ"9/GKŘzT>d].ϟ6u6S9c+ MgT)s )je=3Q-Tot[ -0^Rw_6aX?Y }e3=MGY@+FV-?*irPI [m2FIͿ5R0}ً?|.f!Pi[5X}}#,OvKxy'ЬL!FR7KAuu]V\fyyk.\>80_6`g4!5[lpt-sx=anpu \s'rjIX i#A$87GWci;Ty/)5P<2A/?tw=catVTnB.rQjث8k"63QTb=Q+9$ќyrh`htQ280δy a0 /]i\&/;.[EFޖk=]ll/WicdlECVԱ.`DәRԿH5n,bPa%wiu`tЅ6Fx:P(<}}o_ Du5I 9d-WgW\Y2;NQT\%:|wci848՜j/}c9Nϩ{/h;}EEpNe-^`^*qN>۩XtD0JR?I5ǐϴO-%}5$\>-*3 ozcKF5b;c"uZzԇ>MrI~CV&fe8dZr}U?CW X9 G].N}#MЛn`nZ4+ U88k5[=[gt)lN7Kq#7u5JϨC͹~GaıhR K2`9N+݊#'8*V3ާ+YtZѕO3{B3:dJ]_=VαlIhLB_8xCT{:}9 xr=]JK)ssmÎ{;>v15 Py,ZμK1fe+qu! |3RC5QڱON>9T Z-!WrLn!=D@2Bl?=t 5gjDQpu*tDNķSf턇'NFc[}dw((65}u[s)R-0{T4rEySN[?Z[FMvzq;,EF4aۇ?x㝕GZ:#XA`ϔ1r2b9hQa-QC zKO\U>]մSu7-':w9SzRuןO.kP܍n>GNu/5qޯݾ5pYot4KGa' [uե .Ɍ iQD C+ʉr}$@5T[=*N,۫\jjoŴ$]/QbvJ!riՅ7~D$[^升VEu9gXVQbT?=^E-,K<Dnl5g4Z~Z_EpuZ KX] ݼQq AVNƕki߭TVNŖQ;AKԜ[1SSA(**|;YkD{ŒevH=3jڽљR'Q$?Y}3)b8S ' !A.rOGv|Ko(R5RFd#j7o(N=U=ȺtWL+=N[6wkPX<`U)_&W}֤|"5uU5 ?s˻{DLCQ|VQX7[ާ0Qzk*/Ky9Z&>#:a=?*OMvDyLKVOwV%c>Z_pj*h5TAVM jk:kЪ njv~URؔ݉7& UC羿CAP;UIn+5ڞR6WT lߗhjwZ0;5z@O<8 g5#1uk,a=q=5eMZM W a})C4P5}׺iQ6ܩs_"\ѓ3.&rM{g=w|oSsrIݘrVyiR%u8^s6TKc(mO@T<蓚s1]8MN<j|T9q=fo󺭦Nʷ;w=&MN9jlsl;䌂4iҤI&Mv 4iҤI&MjҤI&M4iI&M4iҤ&M4iҤI& `5iҤI&Ml+D$IENDB`gsequencer-3.1.3/libgsequencer.pc.in0000644000175000017500000000126313613101103014350 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libgsequencer Description: Advanced Gtk+ Sequencer audio processing engine URL: http://nongnu.org/gsequencer Version: @PACKAGE_VERSION@ Requires: uuid >= 1.0.2 alsa >= 1.0.25 jack libxml-2.0 >= 2.8.0 sndfile >= 1.0.25 libinstpatch-1.0 >= 1.0 gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0 gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 libsoup-2.4 >= 2.52.0 fontconfig >= 2.11.0 gdk-pixbuf-2.0 >= 2.26.1 cairo >= 1.12.0 gtk+-3.0 >= 3.18.0 webkit2gtk-4.0 >= 2.10.0 Libs: -L${libdir} -lags -lags_thread -lags_server -lags_audio -lags_gui -lgsequencer Cflags: -I${includedir} gsequencer-3.1.3/config.sub0000755000175000017500000010645013622252204012567 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo "$1" | sed 's/-[^-]*$//'` if [ "$basic_machine" != "$1" ] then os=`echo "$1" | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases that might get confused # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4*) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac echo "$basic_machine$os" exit # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsequencer-3.1.3/ags_business_group_test.xml0000644000175000017500000000165113607210263016265 00000000000000 ags-test-group-uuid-0 ags-test-name ags-test-user-uuid-0 ags-test-user-uuid-1 ags-test-user-uuid-2 gsequencer-3.1.3/libags_server.sym.in0000644000175000017500000001175713616617253014613 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with GSequencer. If not, see . ags_service_provider_get_type ags_service_provider_is_operating ags_service_provider_server_status ags_service_provider_set_registry ags_service_provider_get_registry ags_service_provider_set_server ags_service_provider_get_server ags_front_controller_get_type ags_front_controller_do_request ags_front_controller_new ags_controller_get_type ags_controller_resource_alloc ags_controller_resource_free ags_controller_resource_ref ags_controller_resource_unref ags_controller_add_resource ags_controller_remove_resource ags_controller_lookup_resource ags_controller_query_security_context ags_controller_new ags_plugin_controller_get_type ags_plugin_controller_do_request ags_authentication_manager_get_type ags_login_info_alloc ags_login_info_free ags_login_info_ref ags_login_info_unref ags_authentication_manager_get_authentication ags_authentication_manager_add_authentication ags_authentication_manager_remove_authentication ags_authentication_manager_get_session_timeout ags_authentication_manager_lookup_login ags_authentication_manager_insert_login ags_authentication_manager_remove_login ags_authentication_manager_login ags_authentication_manager_logout ags_authentication_manager_get_digest ags_authentication_manager_is_session_active ags_authentication_manager_get_instance ags_authentication_manager_new ags_password_store_manager_get_type ags_password_store_manager_get_password_store ags_password_store_manager_add_password_store ags_password_store_manager_remove_password_store ags_password_store_manager_check_password ags_password_store_manager_get_instance ags_password_store_manager_new ags_auth_security_context_get_type ags_auth_security_context_get_instance ags_auth_security_context_new ags_authentication_get_type ags_authentication_get_authentication_module ags_authentication_login ags_authentication_logout ags_authentication_generate_token ags_authentication_get_digest ags_authentication_is_session_active ags_business_group_get_type ags_business_group_get_group_uuid ags_business_group_set_group_name ags_business_group_get_group_name ags_business_group_set_user ags_business_group_get_user ags_xml_business_group_get_type ags_xml_business_group_open_filename ags_xml_business_group_new ags_password_store_get_type ags_password_store_set_login_name ags_password_store_get_login_name ags_password_store_set_password ags_password_store_get_password ags_password_store_encrypt_password ags_xml_certificate_get_type ags_xml_certificate_open_filename ags_xml_certificate_new ags_xml_authentication_get_type ags_xml_authentication_open_filename ags_xml_authentication_find_user_uuid ags_xml_authentication_new ags_certificate_get_type ags_certificate_get_cert_uuid ags_certificate_set_domain ags_certificate_get_domain ags_certificate_set_key_type ags_certificate_get_key_type ags_certificate_set_public_key_file ags_certificate_get_public_key_file ags_certificate_set_private_key_file ags_certificate_get_private_key_file ags_certificate_manager_get_type ags_certificate_manager_get_certificate ags_certificate_manager_add_certificate ags_certificate_manager_remove_certificate ags_certificate_manager_get_key_file ags_certificate_manager_get_instance ags_certificate_manager_new ags_xml_password_store_get_type ags_xml_password_store_open_filename ags_xml_password_store_find_login ags_xml_password_store_new ags_security_context_get_type ags_security_context_parse_business_group ags_security_context_get_business_group ags_security_context_add_server_context ags_security_context_remove_server_context ags_security_context_get_server_context ags_security_context_new ags_business_group_manager_get_type ags_business_group_manager_get_business_group ags_business_group_manager_add_business_group ags_business_group_manager_remove_business_group ags_business_group_manager_get_instance ags_business_group_manager_new ags_server_get_type ags_server_test_flags ags_server_set_flags ags_server_unset_flags ags_server_info_alloc ags_server_add_controller ags_server_remove_controller ags_server_start ags_server_stop ags_server_listen ags_server_new ags_registry_get_type ags_registry_entry_alloc ags_registry_entry_free ags_registry_add_entry ags_registry_find_entry ags_registry_new ags_server_status_get_type ags_server_status_new ags_server_application_context_get_type ags_server_application_context_new gsequencer-3.1.3/apple_script.sh0000755000175000017500000001516513607210263013634 00000000000000#!/bin/bash # # Copyright (C) 2005-2018 Joël Krähemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # binary files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/MacOS/GSequencer-bin | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/MacOS/GSequencer-bin done install_name_tool -change libinstpatch-1.0.0.dylib @executable_path/../Resources/lib/libinstpatch-1.0.0.dylib Contents/MacOS/GSequencer-bin files=(libgsequencer.dylib libags_gui.dylib libags_server.dylib libags_thread.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/MacOS/GSequencer-bin done files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/Resources/lib/libags.dylib | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags.2.dylib done files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/Resources/lib/libags_thread.dylib | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_thread.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_thread.2.dylib done files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/Resources/lib/libags_server.dylib | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_server.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_server.2.dylib done files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/Resources/lib/libags_audio.dylib | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_audio.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_audio.2.dylib done install_name_tool -change libinstpatch-1.0.0.dylib @executable_path/../Resources/lib/libinstpatch-1.0.0.dylib Contents/Resources/lib/libags_audio.dylib install_name_tool -change libinstpatch-1.0.0.dylib @executable_path/../Resources/lib/libinstpatch-1.0.0.dylib Contents/Resources/lib/libags_audio.2.dylib files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/Resources/lib/libags_gui.dylib | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_gui.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_gui.2.dylib done files=`otool -L /Users/joelkraehemann/GSequencer.app/Contents/Resources/lib/libgsequencer.dylib | grep /Users/joelkraehemann/gtk/inst/lib | awk '{ print $1 }' ` for f in $files do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libgsequencer.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libgsequencer.0.dylib done install_name_tool -change libinstpatch-1.0.0.dylib @executable_path/../Resources/lib/libinstpatch-1.0.0.dylib Contents/Resources/lib/libgsequencer.dylib install_name_tool -change libinstpatch-1.0.0.dylib @executable_path/../Resources/lib/libinstpatch-1.0.0.dylib Contents/Resources/lib/libgsequencer.0.dylib files=(libgsequencer.dylib libags_gui.dylib libags_server.dylib libags_thread.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/MacOS/GSequencer-bin done # libgsequencer files=(libags_gui.dylib libags_audio.dylib libags_server.dylib libags_thread.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libgsequencer.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libgsequencer.0.dylib done # libags_gui files=(libags_server.dylib libags_audio.dylib libags_thread.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_gui.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_gui.2.dylib done # libags_audio files=(libags_server.dylib libags_thread.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_audio.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_audio.2.dylib done # libags_server files=(libags_server.dylib libags_thread.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_server.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_server.2.dylib done # libags_thread files=(libags_server.dylib libags.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_thread.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags_thread.2.dylib done # libags files=(libags_server.dylib libags_thread.dylib) for f in ${files[*]} do echo $f install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags.dylib install_name_tool -change $f @executable_path/../Resources/lib/$(basename $f) Contents/Resources/lib/libags.2.dylib done gsequencer-3.1.3/config.guess0000755000175000017500000012637313622252204013132 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gsequencer-3.1.3/ags_functional_notation_edit_test.xml0000644000175000017500000026236313607210263020311 00000000000000 gsequencer-3.1.3/unit-system-tests.mk.in0000644000175000017500000252745713622252210015220 00000000000000# unit-system-tests.mk.in generated by automake 1.16.1 from unit-system-tests.mk.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2005-2019 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_4) @WITH_LIBINSTPATCH_TRUE@am__append_1 = -DAGS_WITH_LIBINSTPATCH=1 @WITH_SYSTEM_TESTS_TRUE@am__append_2 = $(libags_installcheck_programs) $(libags_audio_installcheck_programs) $(libgsequencer_installcheck_programs) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/unit-system-tests.mk.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = libags.pc libags_audio.pc libags_gui.pc \ libgsequencer.pc CONFIG_CLEAN_VPATH_FILES = @WITH_SYSTEM_TESTS_TRUE@am__EXEEXT_1 = ags_check_system_buffer_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_complex_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_conversion_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_log_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_time_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_turtle_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_turtle_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_application_context_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_config_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_connectable_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_soundcard_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_destroy_worker_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_returnable_thread_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_task_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_thread_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_thread_pool_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_worker_thread_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_id_ref_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_launch_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_lookup_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_server_application_context_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_server_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_front_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_authentication_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_business_group_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_certificate_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_password_store_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_authentication_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_business_group_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_certificate_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_password_store_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_security_context_test$(EXEEXT) @WITH_SYSTEM_TESTS_TRUE@am__EXEEXT_2 = ags_check_system_base_plugin_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_dssi_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_dssi_plugin_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_ladspa_conversion_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_ladspa_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_conversion_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_option_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_plugin_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_preset_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_uri_map_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_urid_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_worker_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2ui_manager_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2ui_plugin_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_plugin_port_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_application_context_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_devin_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_devout_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_fifoout_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midiin_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_playback_domain_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_playback_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_preset_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_input_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_output_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recycling_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_buffer_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_char_buffer_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_filter_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_fm_synth_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_fourier_transform_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_channel_run_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_container_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_dependency_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_id_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_recycling_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recycling_context_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_synth_generator_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_port_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_pattern_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_notation_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_note_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_automation_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_acceleration_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_wave_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midi_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_track_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midi_buffer_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midi_builder_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_buffer_util_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_client_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_connection_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_message_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_server_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_websocket_connection_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_xmlrpc_message_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_xmlrpc_server_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_action_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_config_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_front_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_renew_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_info_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_meter_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_node_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_status_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_xmlrpc_controller_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_analyse_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_analyse_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_capture_wave_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_capture_wave_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_pattern_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_pattern_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_count_beats_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_delay_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_envelope_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_envelope_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_eq10_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_eq10_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_feed_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_mute_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_mute_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_mute_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_peak_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_peak_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_wave_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_wave_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_prepare_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_record_midi_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_route_dssi_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_route_lv2_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_stream_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_volume_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_volume_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_effect_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_note_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_soundcard_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_bpm_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_presets_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_sequencer_length_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_synth_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_tact_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_cancel_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_cancel_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_clear_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_clear_buffer_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_crop_note_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_export_output_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_free_selection_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_link_channel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_move_note_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_audio_signal_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_note_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_soundcard_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_reset_amplitude_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_reset_peak_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_resize_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_seek_soundcard_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_audio_channels_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_buffer_size_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_device_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_format_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_muted_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_samplerate_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_start_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_start_channel_test$(EXEEXT) @WITH_SYSTEM_TESTS_TRUE@am__EXEEXT_3 = ags_check_system_xorg_application_context_test$(EXEEXT) @WITH_SYSTEM_TESTS_TRUE@am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__EXEEXT_3) PROGRAMS = $(noinst_PROGRAMS) am__ags_check_system_acceleration_test_SOURCES_DIST = \ ags/test/audio/ags_acceleration_test.c am__dirstamp = $(am__leading_dot)dirstamp @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_acceleration_test_OBJECTS = ags/test/audio/check_system_acceleration_test-ags_acceleration_test.$(OBJEXT) ags_check_system_acceleration_test_OBJECTS = \ $(am_ags_check_system_acceleration_test_OBJECTS) am__DEPENDENCIES_1 = @WITH_SYSTEM_TESTS_TRUE@ags_check_system_acceleration_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = ags_check_system_acceleration_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_acceleration_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_acceleration_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_add_audio_signal_test_SOURCES_DIST = \ ags/test/audio/task/ags_add_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_add_audio_signal_test_OBJECTS = ags/test/audio/task/check_system_add_audio_signal_test-ags_add_audio_signal_test.$(OBJEXT) ags_check_system_add_audio_signal_test_OBJECTS = \ $(am_ags_check_system_add_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_add_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_add_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_add_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_add_audio_test_SOURCES_DIST = \ ags/test/audio/task/ags_add_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_add_audio_test_OBJECTS = ags/test/audio/task/check_system_add_audio_test-ags_add_audio_test.$(OBJEXT) ags_check_system_add_audio_test_OBJECTS = \ $(am_ags_check_system_add_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_add_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_add_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_add_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_add_effect_test_SOURCES_DIST = \ ags/test/audio/task/ags_add_effect_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_add_effect_test_OBJECTS = ags/test/audio/task/check_system_add_effect_test-ags_add_effect_test.$(OBJEXT) ags_check_system_add_effect_test_OBJECTS = \ $(am_ags_check_system_add_effect_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_effect_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_add_effect_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_add_effect_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_add_effect_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_add_note_test_SOURCES_DIST = \ ags/test/audio/task/ags_add_note_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_add_note_test_OBJECTS = ags/test/audio/task/check_system_add_note_test-ags_add_note_test.$(OBJEXT) ags_check_system_add_note_test_OBJECTS = \ $(am_ags_check_system_add_note_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_note_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_add_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_add_note_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_add_note_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_add_soundcard_test_SOURCES_DIST = \ ags/test/audio/task/ags_add_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_add_soundcard_test_OBJECTS = ags/test/audio/task/check_system_add_soundcard_test-ags_add_soundcard_test.$(OBJEXT) ags_check_system_add_soundcard_test_OBJECTS = \ $(am_ags_check_system_add_soundcard_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_soundcard_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_add_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_add_soundcard_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_add_soundcard_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_analyse_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_analyse_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_analyse_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_analyse_audio_signal_test-ags_analyse_audio_signal_test.$(OBJEXT) ags_check_system_analyse_audio_signal_test_OBJECTS = \ $(am_ags_check_system_analyse_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_analyse_audio_signal_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_analyse_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_analyse_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_analyse_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_analyse_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_analyse_channel_test_OBJECTS = ags/test/audio/recall/check_system_analyse_channel_test-ags_analyse_channel_test.$(OBJEXT) ags_check_system_analyse_channel_test_OBJECTS = \ $(am_ags_check_system_analyse_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_analyse_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_analyse_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_analyse_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_application_context_test_SOURCES_DIST = \ ags/test/object/ags_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_application_context_test_OBJECTS = ags/test/object/check_system_application_context_test-ags_application_context_test.$(OBJEXT) ags_check_system_application_context_test_OBJECTS = \ $(am_ags_check_system_application_context_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_application_context_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_application_context_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_application_context_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_application_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_apply_bpm_test_SOURCES_DIST = \ ags/test/audio/task/ags_apply_bpm_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_apply_bpm_test_OBJECTS = ags/test/audio/task/check_system_apply_bpm_test-ags_apply_bpm_test.$(OBJEXT) ags_check_system_apply_bpm_test_OBJECTS = \ $(am_ags_check_system_apply_bpm_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_bpm_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_apply_bpm_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_apply_bpm_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_apply_bpm_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_apply_presets_test_SOURCES_DIST = \ ags/test/audio/task/ags_apply_presets_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_apply_presets_test_OBJECTS = ags/test/audio/task/check_system_apply_presets_test-ags_apply_presets_test.$(OBJEXT) ags_check_system_apply_presets_test_OBJECTS = \ $(am_ags_check_system_apply_presets_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_presets_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_apply_presets_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_apply_presets_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_apply_presets_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_apply_sequencer_length_test_SOURCES_DIST = \ ags/test/audio/task/ags_apply_sequencer_length_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_apply_sequencer_length_test_OBJECTS = ags/test/audio/task/check_system_apply_sequencer_length_test-ags_apply_sequencer_length_test.$(OBJEXT) ags_check_system_apply_sequencer_length_test_OBJECTS = \ $(am_ags_check_system_apply_sequencer_length_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_sequencer_length_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_apply_sequencer_length_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_apply_sequencer_length_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_apply_sequencer_length_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_apply_synth_test_SOURCES_DIST = \ ags/test/audio/task/ags_apply_synth_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_apply_synth_test_OBJECTS = ags/test/audio/task/check_system_apply_synth_test-ags_apply_synth_test.$(OBJEXT) ags_check_system_apply_synth_test_OBJECTS = \ $(am_ags_check_system_apply_synth_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_synth_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_apply_synth_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_apply_synth_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_apply_synth_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_apply_tact_test_SOURCES_DIST = \ ags/test/audio/task/ags_apply_tact_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_apply_tact_test_OBJECTS = ags/test/audio/task/check_system_apply_tact_test-ags_apply_tact_test.$(OBJEXT) ags_check_system_apply_tact_test_OBJECTS = \ $(am_ags_check_system_apply_tact_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_tact_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_apply_tact_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_apply_tact_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_apply_tact_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_audio_application_context_test_SOURCES_DIST = \ ags/test/audio/ags_audio_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_audio_application_context_test_OBJECTS = ags/test/audio/check_system_audio_application_context_test-ags_audio_application_context_test.$(OBJEXT) ags_check_system_audio_application_context_test_OBJECTS = \ $(am_ags_check_system_audio_application_context_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_application_context_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_audio_application_context_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_audio_application_context_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_audio_application_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_audio_buffer_util_test_SOURCES_DIST = \ ags/test/audio/ags_audio_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_audio_buffer_util_test_OBJECTS = ags/test/audio/check_system_audio_buffer_util_test-ags_audio_buffer_util_test.$(OBJEXT) ags_check_system_audio_buffer_util_test_OBJECTS = \ $(am_ags_check_system_audio_buffer_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_buffer_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_audio_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_audio_buffer_util_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_audio_buffer_util_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_audio_signal_test_SOURCES_DIST = \ ags/test/audio/ags_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_audio_signal_test_OBJECTS = ags/test/audio/check_system_audio_signal_test-ags_audio_signal_test.$(OBJEXT) ags_check_system_audio_signal_test_OBJECTS = \ $(am_ags_check_system_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_audio_test_SOURCES_DIST = \ ags/test/audio/ags_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_audio_test_OBJECTS = ags/test/audio/check_system_audio_test-ags_audio_test.$(OBJEXT) ags_check_system_audio_test_OBJECTS = \ $(am_ags_check_system_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_authentication_manager_test_SOURCES_DIST = \ ags/test/server/security/ags_authentication_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_authentication_manager_test_OBJECTS = ags/test/server/security/check_system_authentication_manager_test-ags_authentication_manager_test.$(OBJEXT) ags_check_system_authentication_manager_test_OBJECTS = \ $(am_ags_check_system_authentication_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_authentication_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_authentication_manager_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_authentication_manager_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_authentication_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_automation_test_SOURCES_DIST = \ ags/test/audio/ags_automation_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_automation_test_OBJECTS = ags/test/audio/check_system_automation_test-ags_automation_test.$(OBJEXT) ags_check_system_automation_test_OBJECTS = \ $(am_ags_check_system_automation_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_automation_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_automation_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_automation_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_automation_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_base_plugin_test_SOURCES_DIST = \ ags/test/plugin/ags_base_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_base_plugin_test_OBJECTS = ags/test/plugin/check_system_base_plugin_test-ags_base_plugin_test.$(OBJEXT) ags_check_system_base_plugin_test_OBJECTS = \ $(am_ags_check_system_base_plugin_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_base_plugin_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_base_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_base_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_base_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_buffer_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_buffer_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_buffer_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_buffer_audio_signal_test-ags_buffer_audio_signal_test.$(OBJEXT) ags_check_system_buffer_audio_signal_test_OBJECTS = \ $(am_ags_check_system_buffer_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_buffer_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_buffer_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_buffer_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_buffer_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_buffer_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_buffer_channel_test_OBJECTS = ags/test/audio/recall/check_system_buffer_channel_test-ags_buffer_channel_test.$(OBJEXT) ags_check_system_buffer_channel_test_OBJECTS = \ $(am_ags_check_system_buffer_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_buffer_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_buffer_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_buffer_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_buffer_test_SOURCES_DIST = \ ags/test/audio/ags_buffer_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_buffer_test_OBJECTS = ags/test/audio/check_system_buffer_test-ags_buffer_test.$(OBJEXT) ags_check_system_buffer_test_OBJECTS = \ $(am_ags_check_system_buffer_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_buffer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_buffer_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_buffer_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_buffer_util_test_SOURCES_DIST = \ ags/test/lib/ags_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_buffer_util_test_OBJECTS = ags/test/lib/check_system_buffer_util_test-ags_buffer_util_test.$(OBJEXT) ags_check_system_buffer_util_test_OBJECTS = \ $(am_ags_check_system_buffer_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_buffer_util_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_buffer_util_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_business_group_manager_test_SOURCES_DIST = \ ags/test/server/security/ags_business_group_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_business_group_manager_test_OBJECTS = ags/test/server/security/check_system_business_group_manager_test-ags_business_group_manager_test.$(OBJEXT) ags_check_system_business_group_manager_test_OBJECTS = \ $(am_ags_check_system_business_group_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_business_group_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_business_group_manager_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_business_group_manager_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_business_group_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_cancel_audio_test_SOURCES_DIST = \ ags/test/audio/task/ags_cancel_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_cancel_audio_test_OBJECTS = ags/test/audio/task/check_system_cancel_audio_test-ags_cancel_audio_test.$(OBJEXT) ags_check_system_cancel_audio_test_OBJECTS = \ $(am_ags_check_system_cancel_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_cancel_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_cancel_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_cancel_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_cancel_channel_test_SOURCES_DIST = \ ags/test/audio/task/ags_cancel_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_cancel_channel_test_OBJECTS = ags/test/audio/task/check_system_cancel_channel_test-ags_cancel_channel_test.$(OBJEXT) ags_check_system_cancel_channel_test_OBJECTS = \ $(am_ags_check_system_cancel_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_cancel_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_cancel_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_cancel_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_capture_wave_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_capture_wave_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_capture_wave_audio_test_OBJECTS = ags/test/audio/recall/check_system_capture_wave_audio_test-ags_capture_wave_audio_test.$(OBJEXT) ags_check_system_capture_wave_audio_test_OBJECTS = \ $(am_ags_check_system_capture_wave_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_capture_wave_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_capture_wave_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_capture_wave_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_capture_wave_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_capture_wave_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_capture_wave_channel_test_OBJECTS = ags/test/audio/recall/check_system_capture_wave_channel_test-ags_capture_wave_channel_test.$(OBJEXT) ags_check_system_capture_wave_channel_test_OBJECTS = \ $(am_ags_check_system_capture_wave_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_capture_wave_channel_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_capture_wave_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_capture_wave_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_certificate_manager_test_SOURCES_DIST = \ ags/test/server/security/ags_certificate_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_certificate_manager_test_OBJECTS = ags/test/server/security/check_system_certificate_manager_test-ags_certificate_manager_test.$(OBJEXT) ags_check_system_certificate_manager_test_OBJECTS = \ $(am_ags_check_system_certificate_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_certificate_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_certificate_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_certificate_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_certificate_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_channel_test_SOURCES_DIST = \ ags/test/audio/ags_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_channel_test_OBJECTS = ags/test/audio/check_system_channel_test-ags_channel_test.$(OBJEXT) ags_check_system_channel_test_OBJECTS = \ $(am_ags_check_system_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_char_buffer_util_test_SOURCES_DIST = \ ags/test/audio/ags_char_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_char_buffer_util_test_OBJECTS = ags/test/audio/check_system_char_buffer_util_test-ags_char_buffer_util_test.$(OBJEXT) ags_check_system_char_buffer_util_test_OBJECTS = \ $(am_ags_check_system_char_buffer_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_char_buffer_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_char_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_char_buffer_util_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_char_buffer_util_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_clear_audio_signal_test_SOURCES_DIST = \ ags/test/audio/task/ags_clear_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_clear_audio_signal_test_OBJECTS = ags/test/audio/task/check_system_clear_audio_signal_test-ags_clear_audio_signal_test.$(OBJEXT) ags_check_system_clear_audio_signal_test_OBJECTS = \ $(am_ags_check_system_clear_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_clear_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_clear_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_clear_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_clear_buffer_test_SOURCES_DIST = \ ags/test/audio/task/ags_clear_buffer_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_clear_buffer_test_OBJECTS = ags/test/audio/task/check_system_clear_buffer_test-ags_clear_buffer_test.$(OBJEXT) ags_check_system_clear_buffer_test_OBJECTS = \ $(am_ags_check_system_clear_buffer_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_buffer_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_clear_buffer_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_clear_buffer_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_clear_buffer_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_complex_test_SOURCES_DIST = \ ags/test/lib/ags_complex_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_complex_test_OBJECTS = ags/test/lib/check_system_complex_test-ags_complex_test.$(OBJEXT) ags_check_system_complex_test_OBJECTS = \ $(am_ags_check_system_complex_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_complex_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_complex_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_complex_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_complex_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_config_test_SOURCES_DIST = \ ags/test/object/ags_config_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_config_test_OBJECTS = ags/test/object/check_system_config_test-ags_config_test.$(OBJEXT) ags_check_system_config_test_OBJECTS = \ $(am_ags_check_system_config_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_config_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_config_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_config_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_config_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_connectable_test_SOURCES_DIST = \ ags/test/object/ags_connectable_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_connectable_test_OBJECTS = ags/test/object/check_system_connectable_test-ags_connectable_test.$(OBJEXT) ags_check_system_connectable_test_OBJECTS = \ $(am_ags_check_system_connectable_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_connectable_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_connectable_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_connectable_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_connectable_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_controller_test_SOURCES_DIST = \ ags/test/server/controller/ags_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_controller_test_OBJECTS = ags/test/server/controller/check_system_controller_test-ags_controller_test.$(OBJEXT) ags_check_system_controller_test_OBJECTS = \ $(am_ags_check_system_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_controller_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_conversion_test_SOURCES_DIST = \ ags/test/lib/ags_conversion_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_conversion_test_OBJECTS = ags/test/lib/check_system_conversion_test-ags_conversion_test.$(OBJEXT) ags_check_system_conversion_test_OBJECTS = \ $(am_ags_check_system_conversion_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_conversion_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_conversion_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_conversion_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_conversion_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_copy_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_copy_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_copy_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_copy_audio_signal_test-ags_copy_audio_signal_test.$(OBJEXT) ags_check_system_copy_audio_signal_test_OBJECTS = \ $(am_ags_check_system_copy_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_copy_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_copy_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_copy_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_copy_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_copy_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_copy_channel_test_OBJECTS = ags/test/audio/recall/check_system_copy_channel_test-ags_copy_channel_test.$(OBJEXT) ags_check_system_copy_channel_test_OBJECTS = \ $(am_ags_check_system_copy_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_copy_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_copy_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_copy_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_copy_pattern_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_copy_pattern_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_copy_pattern_audio_test_OBJECTS = ags/test/audio/recall/check_system_copy_pattern_audio_test-ags_copy_pattern_audio_test.$(OBJEXT) ags_check_system_copy_pattern_audio_test_OBJECTS = \ $(am_ags_check_system_copy_pattern_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_copy_pattern_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_copy_pattern_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_copy_pattern_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_copy_pattern_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_copy_pattern_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_copy_pattern_channel_test_OBJECTS = ags/test/audio/recall/check_system_copy_pattern_channel_test-ags_copy_pattern_channel_test.$(OBJEXT) ags_check_system_copy_pattern_channel_test_OBJECTS = \ $(am_ags_check_system_copy_pattern_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_copy_pattern_channel_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_copy_pattern_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_copy_pattern_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_count_beats_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_count_beats_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_count_beats_audio_test_OBJECTS = ags/test/audio/recall/check_system_count_beats_audio_test-ags_count_beats_audio_test.$(OBJEXT) ags_check_system_count_beats_audio_test_OBJECTS = \ $(am_ags_check_system_count_beats_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_count_beats_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_count_beats_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_count_beats_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_count_beats_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_crop_note_test_SOURCES_DIST = \ ags/test/audio/task/ags_crop_note_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_crop_note_test_OBJECTS = ags/test/audio/task/check_system_crop_note_test-ags_crop_note_test.$(OBJEXT) ags_check_system_crop_note_test_OBJECTS = \ $(am_ags_check_system_crop_note_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_crop_note_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_crop_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_crop_note_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_crop_note_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_delay_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_delay_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_delay_audio_test_OBJECTS = ags/test/audio/recall/check_system_delay_audio_test-ags_delay_audio_test.$(OBJEXT) ags_check_system_delay_audio_test_OBJECTS = \ $(am_ags_check_system_delay_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_delay_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_delay_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_delay_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_delay_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_destroy_worker_test_SOURCES_DIST = \ ags/test/thread/ags_destroy_worker_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_destroy_worker_test_OBJECTS = ags/test/thread/check_system_destroy_worker_test-ags_destroy_worker_test.$(OBJEXT) ags_check_system_destroy_worker_test_OBJECTS = \ $(am_ags_check_system_destroy_worker_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_destroy_worker_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_destroy_worker_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_destroy_worker_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_destroy_worker_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_devin_test_SOURCES_DIST = \ ags/test/audio/ags_devin_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_devin_test_OBJECTS = ags/test/audio/check_system_devin_test-ags_devin_test.$(OBJEXT) ags_check_system_devin_test_OBJECTS = \ $(am_ags_check_system_devin_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devin_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_devin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_devin_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_devin_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_devout_test_SOURCES_DIST = \ ags/test/audio/ags_devout_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_devout_test_OBJECTS = ags/test/audio/check_system_devout_test-ags_devout_test.$(OBJEXT) ags_check_system_devout_test_OBJECTS = \ $(am_ags_check_system_devout_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devout_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_devout_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_devout_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_devout_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_dssi_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_dssi_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_dssi_manager_test_OBJECTS = ags/test/plugin/check_system_dssi_manager_test-ags_dssi_manager_test.$(OBJEXT) ags_check_system_dssi_manager_test_OBJECTS = \ $(am_ags_check_system_dssi_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_dssi_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_dssi_manager_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_dssi_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_dssi_plugin_test_SOURCES_DIST = \ ags/test/plugin/ags_dssi_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_dssi_plugin_test_OBJECTS = ags/test/plugin/check_system_dssi_plugin_test-ags_dssi_plugin_test.$(OBJEXT) ags_check_system_dssi_plugin_test_OBJECTS = \ $(am_ags_check_system_dssi_plugin_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_plugin_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_dssi_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_dssi_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_dssi_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_envelope_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_envelope_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_envelope_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_envelope_audio_signal_test-ags_envelope_audio_signal_test.$(OBJEXT) ags_check_system_envelope_audio_signal_test_OBJECTS = \ $(am_ags_check_system_envelope_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_envelope_audio_signal_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_envelope_audio_signal_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_envelope_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_envelope_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_envelope_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_envelope_channel_test_OBJECTS = ags/test/audio/recall/check_system_envelope_channel_test-ags_envelope_channel_test.$(OBJEXT) ags_check_system_envelope_channel_test_OBJECTS = \ $(am_ags_check_system_envelope_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_envelope_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_envelope_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_envelope_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_eq10_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_eq10_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_eq10_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_eq10_audio_signal_test-ags_eq10_audio_signal_test.$(OBJEXT) ags_check_system_eq10_audio_signal_test_OBJECTS = \ $(am_ags_check_system_eq10_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_eq10_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_eq10_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_eq10_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_eq10_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_eq10_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_eq10_channel_test_OBJECTS = ags/test/audio/recall/check_system_eq10_channel_test-ags_eq10_channel_test.$(OBJEXT) ags_check_system_eq10_channel_test_OBJECTS = \ $(am_ags_check_system_eq10_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_eq10_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_eq10_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_eq10_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_export_output_test_SOURCES_DIST = \ ags/test/audio/task/ags_export_output_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_export_output_test_OBJECTS = ags/test/audio/task/check_system_export_output_test-ags_export_output_test.$(OBJEXT) ags_check_system_export_output_test_OBJECTS = \ $(am_ags_check_system_export_output_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_export_output_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_export_output_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_export_output_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_export_output_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_feed_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_feed_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_feed_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_feed_audio_signal_test-ags_feed_audio_signal_test.$(OBJEXT) ags_check_system_feed_audio_signal_test_OBJECTS = \ $(am_ags_check_system_feed_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_feed_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_feed_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_feed_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_feed_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_fifoout_test_SOURCES_DIST = \ ags/test/audio/ags_fifoout_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_fifoout_test_OBJECTS = ags/test/audio/check_system_fifoout_test-ags_fifoout_test.$(OBJEXT) ags_check_system_fifoout_test_OBJECTS = \ $(am_ags_check_system_fifoout_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fifoout_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_fifoout_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_fifoout_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_fifoout_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_file_id_ref_test_SOURCES_DIST = \ ags/test/file/ags_file_id_ref_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_file_id_ref_test_OBJECTS = ags/test/file/check_system_file_id_ref_test-ags_file_id_ref_test.$(OBJEXT) ags_check_system_file_id_ref_test_OBJECTS = \ $(am_ags_check_system_file_id_ref_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_id_ref_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_file_id_ref_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_file_id_ref_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_file_id_ref_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_file_launch_test_SOURCES_DIST = \ ags/test/file/ags_file_launch_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_file_launch_test_OBJECTS = ags/test/file/check_system_file_launch_test-ags_file_launch_test.$(OBJEXT) ags_check_system_file_launch_test_OBJECTS = \ $(am_ags_check_system_file_launch_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_launch_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_file_launch_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_file_launch_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_file_launch_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_file_lookup_test_SOURCES_DIST = \ ags/test/file/ags_file_lookup_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_file_lookup_test_OBJECTS = ags/test/file/check_system_file_lookup_test-ags_file_lookup_test.$(OBJEXT) ags_check_system_file_lookup_test_OBJECTS = \ $(am_ags_check_system_file_lookup_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_lookup_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_file_lookup_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_file_lookup_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_file_lookup_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_file_test_SOURCES_DIST = \ ags/test/file/ags_file_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_file_test_OBJECTS = ags/test/file/check_system_file_test-ags_file_test.$(OBJEXT) ags_check_system_file_test_OBJECTS = \ $(am_ags_check_system_file_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_file_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_file_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_file_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_filter_util_test_SOURCES_DIST = \ ags/test/audio/ags_filter_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_filter_util_test_OBJECTS = ags/test/audio/check_system_filter_util_test-ags_filter_util_test.$(OBJEXT) ags_check_system_filter_util_test_OBJECTS = \ $(am_ags_check_system_filter_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_filter_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_filter_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_filter_util_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_filter_util_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_fm_synth_util_test_SOURCES_DIST = \ ags/test/audio/ags_fm_synth_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_fm_synth_util_test_OBJECTS = ags/test/audio/check_system_fm_synth_util_test-ags_fm_synth_util_test.$(OBJEXT) ags_check_system_fm_synth_util_test_OBJECTS = \ $(am_ags_check_system_fm_synth_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fm_synth_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_fm_synth_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_fm_synth_util_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_fm_synth_util_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_fourier_transform_util_test_SOURCES_DIST = \ ags/test/audio/ags_fourier_transform_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_fourier_transform_util_test_OBJECTS = ags/test/audio/check_system_fourier_transform_util_test-ags_fourier_transform_util_test.$(OBJEXT) ags_check_system_fourier_transform_util_test_OBJECTS = \ $(am_ags_check_system_fourier_transform_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fourier_transform_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_fourier_transform_util_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_fourier_transform_util_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_fourier_transform_util_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_free_selection_test_SOURCES_DIST = \ ags/test/audio/task/ags_free_selection_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_free_selection_test_OBJECTS = ags/test/audio/task/check_system_free_selection_test-ags_free_selection_test.$(OBJEXT) ags_check_system_free_selection_test_OBJECTS = \ $(am_ags_check_system_free_selection_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_free_selection_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_free_selection_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_free_selection_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_free_selection_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_front_controller_test_SOURCES_DIST = \ ags/test/server/controller/ags_front_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_front_controller_test_OBJECTS = ags/test/server/controller/check_system_front_controller_test-ags_front_controller_test.$(OBJEXT) ags_check_system_front_controller_test_OBJECTS = \ $(am_ags_check_system_front_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_front_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_front_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_front_controller_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_front_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_input_test_SOURCES_DIST = \ ags/test/audio/ags_input_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_input_test_OBJECTS = ags/test/audio/check_system_input_test-ags_input_test.$(OBJEXT) ags_check_system_input_test_OBJECTS = \ $(am_ags_check_system_input_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_input_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_input_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_input_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_input_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_ladspa_conversion_test_SOURCES_DIST = \ ags/test/plugin/ags_ladspa_conversion_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_ladspa_conversion_test_OBJECTS = ags/test/plugin/check_system_ladspa_conversion_test-ags_ladspa_conversion_test.$(OBJEXT) ags_check_system_ladspa_conversion_test_OBJECTS = \ $(am_ags_check_system_ladspa_conversion_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_conversion_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_ladspa_conversion_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_ladspa_conversion_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_ladspa_conversion_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_ladspa_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_ladspa_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_ladspa_manager_test_OBJECTS = ags/test/plugin/check_system_ladspa_manager_test-ags_ladspa_manager_test.$(OBJEXT) ags_check_system_ladspa_manager_test_OBJECTS = \ $(am_ags_check_system_ladspa_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_ladspa_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_ladspa_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_ladspa_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_link_channel_test_SOURCES_DIST = \ ags/test/audio/task/ags_link_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_link_channel_test_OBJECTS = ags/test/audio/task/check_system_link_channel_test-ags_link_channel_test.$(OBJEXT) ags_check_system_link_channel_test_OBJECTS = \ $(am_ags_check_system_link_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_link_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_link_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_link_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_link_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_log_test_SOURCES_DIST = \ ags/test/lib/ags_log_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_log_test_OBJECTS = ags/test/lib/check_system_log_test-ags_log_test.$(OBJEXT) ags_check_system_log_test_OBJECTS = \ $(am_ags_check_system_log_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_log_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_log_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_log_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_log_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_lv2_conversion_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_conversion_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_conversion_test_OBJECTS = ags/test/plugin/check_system_lv2_conversion_test-ags_lv2_conversion_test.$(OBJEXT) ags_check_system_lv2_conversion_test_OBJECTS = \ $(am_ags_check_system_lv2_conversion_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_conversion_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_conversion_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2_conversion_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_lv2_conversion_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_lv2_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_manager_test_OBJECTS = ags/test/plugin/check_system_lv2_manager_test-ags_lv2_manager_test.$(OBJEXT) ags_check_system_lv2_manager_test_OBJECTS = \ $(am_ags_check_system_lv2_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2_manager_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_lv2_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_lv2_option_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_option_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_option_manager_test_OBJECTS = ags/test/plugin/check_system_lv2_option_manager_test-ags_lv2_option_manager_test.$(OBJEXT) ags_check_system_lv2_option_manager_test_OBJECTS = \ $(am_ags_check_system_lv2_option_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_option_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_option_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2_option_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_lv2_option_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_lv2_plugin_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_plugin_test_OBJECTS = ags/test/plugin/check_system_lv2_plugin_test-ags_lv2_plugin_test.$(OBJEXT) ags_check_system_lv2_plugin_test_OBJECTS = \ $(am_ags_check_system_lv2_plugin_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_plugin_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_lv2_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_lv2_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_lv2_preset_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_preset_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_preset_test_OBJECTS = ags/test/plugin/check_system_lv2_preset_test-ags_lv2_preset_test.$(OBJEXT) ags_check_system_lv2_preset_test_OBJECTS = \ $(am_ags_check_system_lv2_preset_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_preset_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_preset_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_lv2_preset_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_lv2_preset_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_lv2_uri_map_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_uri_map_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_uri_map_manager_test_OBJECTS = ags/test/plugin/check_system_lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.$(OBJEXT) ags_check_system_lv2_uri_map_manager_test_OBJECTS = \ $(am_ags_check_system_lv2_uri_map_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_uri_map_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_uri_map_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2_uri_map_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_lv2_uri_map_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_lv2_urid_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_urid_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_urid_manager_test_OBJECTS = ags/test/plugin/check_system_lv2_urid_manager_test-ags_lv2_urid_manager_test.$(OBJEXT) ags_check_system_lv2_urid_manager_test_OBJECTS = \ $(am_ags_check_system_lv2_urid_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_urid_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_urid_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2_urid_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_lv2_urid_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_lv2_worker_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2_worker_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2_worker_manager_test_OBJECTS = ags/test/plugin/check_system_lv2_worker_manager_test-ags_lv2_worker_manager_test.$(OBJEXT) ags_check_system_lv2_worker_manager_test_OBJECTS = \ $(am_ags_check_system_lv2_worker_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_worker_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2_worker_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2_worker_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_lv2_worker_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_lv2ui_manager_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2ui_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2ui_manager_test_OBJECTS = ags/test/plugin/check_system_lv2ui_manager_test-ags_lv2ui_manager_test.$(OBJEXT) ags_check_system_lv2ui_manager_test_OBJECTS = \ $(am_ags_check_system_lv2ui_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2ui_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2ui_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_lv2ui_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_lv2ui_plugin_test_SOURCES_DIST = \ ags/test/plugin/ags_lv2ui_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_lv2ui_plugin_test_OBJECTS = ags/test/plugin/check_system_lv2ui_plugin_test-ags_lv2ui_plugin_test.$(OBJEXT) ags_check_system_lv2ui_plugin_test_OBJECTS = \ $(am_ags_check_system_lv2ui_plugin_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_plugin_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_lv2ui_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_lv2ui_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_lv2ui_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_midi_buffer_util_test_SOURCES_DIST = \ ags/test/audio/midi/ags_midi_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_midi_buffer_util_test_OBJECTS = ags/test/audio/midi/check_system_midi_buffer_util_test-ags_midi_buffer_util_test.$(OBJEXT) ags_check_system_midi_buffer_util_test_OBJECTS = \ $(am_ags_check_system_midi_buffer_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_buffer_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_midi_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_midi_buffer_util_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_midi_buffer_util_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_midi_builder_test_SOURCES_DIST = \ ags/test/audio/midi/ags_midi_builder_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_midi_builder_test_OBJECTS = ags/test/audio/midi/check_system_midi_builder_test-ags_midi_builder_test.$(OBJEXT) ags_check_system_midi_builder_test_OBJECTS = \ $(am_ags_check_system_midi_builder_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_builder_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_midi_builder_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_midi_builder_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_midi_builder_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_midi_test_SOURCES_DIST = \ ags/test/audio/ags_midi_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_midi_test_OBJECTS = ags/test/audio/check_system_midi_test-ags_midi_test.$(OBJEXT) ags_check_system_midi_test_OBJECTS = \ $(am_ags_check_system_midi_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_midi_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_midi_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_midi_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_midiin_test_SOURCES_DIST = \ ags/test/audio/ags_midiin_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_midiin_test_OBJECTS = ags/test/audio/check_system_midiin_test-ags_midiin_test.$(OBJEXT) ags_check_system_midiin_test_OBJECTS = \ $(am_ags_check_system_midiin_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midiin_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_midiin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_midiin_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_midiin_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_move_note_test_SOURCES_DIST = \ ags/test/audio/task/ags_move_note_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_move_note_test_OBJECTS = ags/test/audio/task/check_system_move_note_test-ags_move_note_test.$(OBJEXT) ags_check_system_move_note_test_OBJECTS = \ $(am_ags_check_system_move_note_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_move_note_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_move_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_move_note_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_move_note_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_mute_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_mute_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_mute_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_mute_audio_signal_test-ags_mute_audio_signal_test.$(OBJEXT) ags_check_system_mute_audio_signal_test_OBJECTS = \ $(am_ags_check_system_mute_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_mute_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_mute_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_mute_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_mute_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_mute_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_mute_audio_test_OBJECTS = ags/test/audio/recall/check_system_mute_audio_test-ags_mute_audio_test.$(OBJEXT) ags_check_system_mute_audio_test_OBJECTS = \ $(am_ags_check_system_mute_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_mute_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_mute_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_mute_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_mute_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_mute_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_mute_channel_test_OBJECTS = ags/test/audio/recall/check_system_mute_channel_test-ags_mute_channel_test.$(OBJEXT) ags_check_system_mute_channel_test_OBJECTS = \ $(am_ags_check_system_mute_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_mute_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_mute_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_mute_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_notation_test_SOURCES_DIST = \ ags/test/audio/ags_notation_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_notation_test_OBJECTS = ags/test/audio/check_system_notation_test-ags_notation_test.$(OBJEXT) ags_check_system_notation_test_OBJECTS = \ $(am_ags_check_system_notation_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_notation_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_notation_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_notation_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_notation_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_note_test_SOURCES_DIST = \ ags/test/audio/ags_note_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_note_test_OBJECTS = ags/test/audio/check_system_note_test-ags_note_test.$(OBJEXT) ags_check_system_note_test_OBJECTS = \ $(am_ags_check_system_note_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_note_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_note_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_note_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_osc_action_controller_test_SOURCES_DIST = ags/test/audio/osc/controller/ags_osc_action_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_action_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_action_controller_test-ags_osc_action_controller_test.$(OBJEXT) ags_check_system_osc_action_controller_test_OBJECTS = \ $(am_ags_check_system_osc_action_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_action_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_action_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_action_controller_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_osc_action_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_buffer_util_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_buffer_util_test_OBJECTS = ags/test/audio/osc/check_system_osc_buffer_util_test-ags_osc_buffer_util_test.$(OBJEXT) ags_check_system_osc_buffer_util_test_OBJECTS = \ $(am_ags_check_system_osc_buffer_util_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_buffer_util_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_buffer_util_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_osc_buffer_util_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_client_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_client_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_client_test_OBJECTS = ags/test/audio/osc/check_system_osc_client_test-ags_osc_client_test.$(OBJEXT) ags_check_system_osc_client_test_OBJECTS = \ $(am_ags_check_system_osc_client_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_client_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_client_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_osc_client_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_osc_client_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_osc_config_controller_test_SOURCES_DIST = ags/test/audio/osc/controller/ags_osc_config_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_config_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_config_controller_test-ags_osc_config_controller_test.$(OBJEXT) ags_check_system_osc_config_controller_test_OBJECTS = \ $(am_ags_check_system_osc_config_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_config_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_config_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_config_controller_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_osc_config_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_connection_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_connection_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_connection_test_OBJECTS = ags/test/audio/osc/check_system_osc_connection_test-ags_osc_connection_test.$(OBJEXT) ags_check_system_osc_connection_test_OBJECTS = \ $(am_ags_check_system_osc_connection_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_connection_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_connection_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_connection_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_osc_connection_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_front_controller_test_SOURCES_DIST = \ ags/test/audio/osc/controller/ags_osc_front_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_front_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_front_controller_test-ags_osc_front_controller_test.$(OBJEXT) ags_check_system_osc_front_controller_test_OBJECTS = \ $(am_ags_check_system_osc_front_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_front_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_front_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_front_controller_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_osc_front_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_info_controller_test_SOURCES_DIST = \ ags/test/audio/osc/controller/ags_osc_info_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_info_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_info_controller_test-ags_osc_info_controller_test.$(OBJEXT) ags_check_system_osc_info_controller_test_OBJECTS = \ $(am_ags_check_system_osc_info_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_info_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_info_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_info_controller_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_osc_info_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_message_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_message_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_message_test_OBJECTS = ags/test/audio/osc/check_system_osc_message_test-ags_osc_message_test.$(OBJEXT) ags_check_system_osc_message_test_OBJECTS = \ $(am_ags_check_system_osc_message_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_message_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_message_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_message_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_osc_message_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_osc_meter_controller_test_SOURCES_DIST = \ ags/test/audio/osc/controller/ags_osc_meter_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_meter_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_meter_controller_test-ags_osc_meter_controller_test.$(OBJEXT) ags_check_system_osc_meter_controller_test_OBJECTS = \ $(am_ags_check_system_osc_meter_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_meter_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_meter_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_meter_controller_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_osc_meter_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_node_controller_test_SOURCES_DIST = \ ags/test/audio/osc/controller/ags_osc_node_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_node_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_node_controller_test-ags_osc_node_controller_test.$(OBJEXT) ags_check_system_osc_node_controller_test_OBJECTS = \ $(am_ags_check_system_osc_node_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_node_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_node_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_node_controller_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_osc_node_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_renew_controller_test_SOURCES_DIST = \ ags/test/audio/osc/controller/ags_osc_renew_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_renew_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_renew_controller_test-ags_osc_renew_controller_test.$(OBJEXT) ags_check_system_osc_renew_controller_test_OBJECTS = \ $(am_ags_check_system_osc_renew_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_renew_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_renew_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_renew_controller_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_osc_renew_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_server_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_server_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_server_test_OBJECTS = ags/test/audio/osc/check_system_osc_server_test-ags_osc_server_test.$(OBJEXT) ags_check_system_osc_server_test_OBJECTS = \ $(am_ags_check_system_osc_server_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_server_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_osc_server_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_osc_server_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_osc_status_controller_test_SOURCES_DIST = ags/test/audio/osc/controller/ags_osc_status_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_status_controller_test_OBJECTS = ags/test/audio/osc/controller/check_system_osc_status_controller_test-ags_osc_status_controller_test.$(OBJEXT) ags_check_system_osc_status_controller_test_OBJECTS = \ $(am_ags_check_system_osc_status_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_status_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_status_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_status_controller_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_osc_status_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_websocket_connection_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_websocket_connection_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_websocket_connection_test_OBJECTS = ags/test/audio/osc/check_system_osc_websocket_connection_test-ags_osc_websocket_connection_test.$(OBJEXT) ags_check_system_osc_websocket_connection_test_OBJECTS = \ $(am_ags_check_system_osc_websocket_connection_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_websocket_connection_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_websocket_connection_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_websocket_connection_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_osc_websocket_connection_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_xmlrpc_controller_test_SOURCES_DIST = \ ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_xmlrpc_controller_test_OBJECTS = ags/test/audio/osc/xmlrpc/check_system_osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.$(OBJEXT) ags_check_system_osc_xmlrpc_controller_test_OBJECTS = \ $(am_ags_check_system_osc_xmlrpc_controller_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_controller_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_xmlrpc_controller_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_osc_xmlrpc_controller_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_osc_xmlrpc_controller_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_xmlrpc_message_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_xmlrpc_message_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_xmlrpc_message_test_OBJECTS = ags/test/audio/osc/check_system_osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.$(OBJEXT) ags_check_system_osc_xmlrpc_message_test_OBJECTS = \ $(am_ags_check_system_osc_xmlrpc_message_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_message_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_xmlrpc_message_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_xmlrpc_message_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_osc_xmlrpc_message_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_osc_xmlrpc_server_test_SOURCES_DIST = \ ags/test/audio/osc/ags_osc_xmlrpc_server_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_osc_xmlrpc_server_test_OBJECTS = ags/test/audio/osc/check_system_osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.$(OBJEXT) ags_check_system_osc_xmlrpc_server_test_OBJECTS = \ $(am_ags_check_system_osc_xmlrpc_server_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_server_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_osc_xmlrpc_server_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_osc_xmlrpc_server_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_osc_xmlrpc_server_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_output_test_SOURCES_DIST = \ ags/test/audio/ags_output_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_output_test_OBJECTS = ags/test/audio/check_system_output_test-ags_output_test.$(OBJEXT) ags_check_system_output_test_OBJECTS = \ $(am_ags_check_system_output_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_output_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_output_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_output_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_output_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_password_store_manager_test_SOURCES_DIST = \ ags/test/server/security/ags_password_store_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_password_store_manager_test_OBJECTS = ags/test/server/security/check_system_password_store_manager_test-ags_password_store_manager_test.$(OBJEXT) ags_check_system_password_store_manager_test_OBJECTS = \ $(am_ags_check_system_password_store_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_password_store_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_password_store_manager_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_password_store_manager_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_password_store_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_pattern_test_SOURCES_DIST = \ ags/test/audio/ags_pattern_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_pattern_test_OBJECTS = ags/test/audio/check_system_pattern_test-ags_pattern_test.$(OBJEXT) ags_check_system_pattern_test_OBJECTS = \ $(am_ags_check_system_pattern_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_pattern_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_pattern_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_pattern_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_pattern_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_peak_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_peak_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_peak_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_peak_audio_signal_test-ags_peak_audio_signal_test.$(OBJEXT) ags_check_system_peak_audio_signal_test_OBJECTS = \ $(am_ags_check_system_peak_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_peak_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_peak_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_peak_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_peak_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_peak_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_peak_channel_test_OBJECTS = ags/test/audio/recall/check_system_peak_channel_test-ags_peak_channel_test.$(OBJEXT) ags_check_system_peak_channel_test_OBJECTS = \ $(am_ags_check_system_peak_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_peak_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_peak_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_peak_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_play_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_play_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_play_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_play_audio_signal_test-ags_play_audio_signal_test.$(OBJEXT) ags_check_system_play_audio_signal_test_OBJECTS = \ $(am_ags_check_system_play_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_play_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_play_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_play_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_play_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_play_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_play_audio_test_OBJECTS = ags/test/audio/recall/check_system_play_audio_test-ags_play_audio_test.$(OBJEXT) ags_check_system_play_audio_test_OBJECTS = \ $(am_ags_check_system_play_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_play_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_play_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_play_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_play_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_play_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_play_channel_test_OBJECTS = ags/test/audio/recall/check_system_play_channel_test-ags_play_channel_test.$(OBJEXT) ags_check_system_play_channel_test_OBJECTS = \ $(am_ags_check_system_play_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_play_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_play_channel_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_play_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_play_wave_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_play_wave_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_play_wave_audio_test_OBJECTS = ags/test/audio/recall/check_system_play_wave_audio_test-ags_play_wave_audio_test.$(OBJEXT) ags_check_system_play_wave_audio_test_OBJECTS = \ $(am_ags_check_system_play_wave_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_play_wave_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_play_wave_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_play_wave_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_play_wave_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_play_wave_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_play_wave_channel_test_OBJECTS = ags/test/audio/recall/check_system_play_wave_channel_test-ags_play_wave_channel_test.$(OBJEXT) ags_check_system_play_wave_channel_test_OBJECTS = \ $(am_ags_check_system_play_wave_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_play_wave_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_play_wave_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_play_wave_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_playback_domain_test_SOURCES_DIST = \ ags/test/audio/ags_playback_domain_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_playback_domain_test_OBJECTS = ags/test/audio/check_system_playback_domain_test-ags_playback_domain_test.$(OBJEXT) ags_check_system_playback_domain_test_OBJECTS = \ $(am_ags_check_system_playback_domain_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_domain_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_playback_domain_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_playback_domain_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_playback_domain_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_playback_test_SOURCES_DIST = \ ags/test/audio/ags_playback_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_playback_test_OBJECTS = ags/test/audio/check_system_playback_test-ags_playback_test.$(OBJEXT) ags_check_system_playback_test_OBJECTS = \ $(am_ags_check_system_playback_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_playback_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_playback_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_playback_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_plugin_port_test_SOURCES_DIST = \ ags/test/plugin/ags_plugin_port_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_plugin_port_test_OBJECTS = ags/test/plugin/check_system_plugin_port_test-ags_plugin_port_test.$(OBJEXT) ags_check_system_plugin_port_test_OBJECTS = \ $(am_ags_check_system_plugin_port_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_plugin_port_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_plugin_port_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_plugin_port_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_plugin_port_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_port_test_SOURCES_DIST = \ ags/test/audio/ags_port_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_port_test_OBJECTS = ags/test/audio/check_system_port_test-ags_port_test.$(OBJEXT) ags_check_system_port_test_OBJECTS = \ $(am_ags_check_system_port_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_port_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_port_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_port_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_port_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_prepare_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_prepare_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_prepare_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_prepare_audio_signal_test-ags_prepare_audio_signal_test.$(OBJEXT) ags_check_system_prepare_audio_signal_test_OBJECTS = \ $(am_ags_check_system_prepare_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_prepare_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_prepare_audio_signal_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_prepare_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_prepare_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_preset_test_SOURCES_DIST = \ ags/test/audio/ags_preset_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_preset_test_OBJECTS = ags/test/audio/check_system_preset_test-ags_preset_test.$(OBJEXT) ags_check_system_preset_test_OBJECTS = \ $(am_ags_check_system_preset_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_preset_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_preset_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_preset_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_preset_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_recall_channel_run_test_SOURCES_DIST = \ ags/test/audio/ags_recall_channel_run_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_channel_run_test_OBJECTS = ags/test/audio/check_system_recall_channel_run_test-ags_recall_channel_run_test.$(OBJEXT) ags_check_system_recall_channel_run_test_OBJECTS = \ $(am_ags_check_system_recall_channel_run_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_run_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_channel_run_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_recall_channel_run_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_recall_channel_run_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recall_channel_test_SOURCES_DIST = \ ags/test/audio/ags_recall_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_channel_test_OBJECTS = ags/test/audio/check_system_recall_channel_test-ags_recall_channel_test.$(OBJEXT) ags_check_system_recall_channel_test_OBJECTS = \ $(am_ags_check_system_recall_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_recall_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_recall_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recall_container_test_SOURCES_DIST = \ ags/test/audio/ags_recall_container_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_container_test_OBJECTS = ags/test/audio/check_system_recall_container_test-ags_recall_container_test.$(OBJEXT) ags_check_system_recall_container_test_OBJECTS = \ $(am_ags_check_system_recall_container_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_container_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_container_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_recall_container_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_recall_container_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recall_dependency_test_SOURCES_DIST = \ ags/test/audio/ags_recall_dependency_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_dependency_test_OBJECTS = ags/test/audio/check_system_recall_dependency_test-ags_recall_dependency_test.$(OBJEXT) ags_check_system_recall_dependency_test_OBJECTS = \ $(am_ags_check_system_recall_dependency_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_dependency_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_dependency_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_recall_dependency_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_recall_dependency_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recall_id_test_SOURCES_DIST = \ ags/test/audio/ags_recall_id_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_id_test_OBJECTS = ags/test/audio/check_system_recall_id_test-ags_recall_id_test.$(OBJEXT) ags_check_system_recall_id_test_OBJECTS = \ $(am_ags_check_system_recall_id_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_id_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_id_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_recall_id_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_recall_id_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_recall_recycling_test_SOURCES_DIST = \ ags/test/audio/ags_recall_recycling_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_recycling_test_OBJECTS = ags/test/audio/check_system_recall_recycling_test-ags_recall_recycling_test.$(OBJEXT) ags_check_system_recall_recycling_test_OBJECTS = \ $(am_ags_check_system_recall_recycling_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_recycling_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_recycling_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_recall_recycling_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_recall_recycling_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recall_test_SOURCES_DIST = \ ags/test/audio/ags_recall_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recall_test_OBJECTS = ags/test/audio/check_system_recall_test-ags_recall_test.$(OBJEXT) ags_check_system_recall_test_OBJECTS = \ $(am_ags_check_system_recall_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recall_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_recall_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_recall_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_record_midi_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_record_midi_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_record_midi_audio_test_OBJECTS = ags/test/audio/recall/check_system_record_midi_audio_test-ags_record_midi_audio_test.$(OBJEXT) ags_check_system_record_midi_audio_test_OBJECTS = \ $(am_ags_check_system_record_midi_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_record_midi_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_record_midi_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_record_midi_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_record_midi_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recycling_context_test_SOURCES_DIST = \ ags/test/audio/ags_recycling_context_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recycling_context_test_OBJECTS = ags/test/audio/check_system_recycling_context_test-ags_recycling_context_test.$(OBJEXT) ags_check_system_recycling_context_test_OBJECTS = \ $(am_ags_check_system_recycling_context_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_context_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recycling_context_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_recycling_context_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_recycling_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_recycling_test_SOURCES_DIST = \ ags/test/audio/ags_recycling_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_recycling_test_OBJECTS = ags/test/audio/check_system_recycling_test-ags_recycling_test.$(OBJEXT) ags_check_system_recycling_test_OBJECTS = \ $(am_ags_check_system_recycling_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_recycling_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_recycling_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_recycling_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_remove_audio_signal_test_SOURCES_DIST = \ ags/test/audio/task/ags_remove_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_remove_audio_signal_test_OBJECTS = ags/test/audio/task/check_system_remove_audio_signal_test-ags_remove_audio_signal_test.$(OBJEXT) ags_check_system_remove_audio_signal_test_OBJECTS = \ $(am_ags_check_system_remove_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_remove_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_remove_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_remove_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_remove_audio_test_SOURCES_DIST = \ ags/test/audio/task/ags_remove_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_remove_audio_test_OBJECTS = ags/test/audio/task/check_system_remove_audio_test-ags_remove_audio_test.$(OBJEXT) ags_check_system_remove_audio_test_OBJECTS = \ $(am_ags_check_system_remove_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_remove_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_remove_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_remove_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_remove_note_test_SOURCES_DIST = \ ags/test/audio/task/ags_remove_note_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_remove_note_test_OBJECTS = ags/test/audio/task/check_system_remove_note_test-ags_remove_note_test.$(OBJEXT) ags_check_system_remove_note_test_OBJECTS = \ $(am_ags_check_system_remove_note_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_note_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_remove_note_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_remove_note_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_remove_note_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_remove_soundcard_test_SOURCES_DIST = \ ags/test/audio/task/ags_remove_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_remove_soundcard_test_OBJECTS = ags/test/audio/task/check_system_remove_soundcard_test-ags_remove_soundcard_test.$(OBJEXT) ags_check_system_remove_soundcard_test_OBJECTS = \ $(am_ags_check_system_remove_soundcard_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_soundcard_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_remove_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_remove_soundcard_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_remove_soundcard_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_reset_amplitude_test_SOURCES_DIST = \ ags/test/audio/task/ags_reset_amplitude_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_reset_amplitude_test_OBJECTS = ags/test/audio/task/check_system_reset_amplitude_test-ags_reset_amplitude_test.$(OBJEXT) ags_check_system_reset_amplitude_test_OBJECTS = \ $(am_ags_check_system_reset_amplitude_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_amplitude_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_reset_amplitude_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_reset_amplitude_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_reset_amplitude_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_reset_peak_test_SOURCES_DIST = \ ags/test/audio/task/ags_reset_peak_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_reset_peak_test_OBJECTS = ags/test/audio/task/check_system_reset_peak_test-ags_reset_peak_test.$(OBJEXT) ags_check_system_reset_peak_test_OBJECTS = \ $(am_ags_check_system_reset_peak_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_peak_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_reset_peak_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_reset_peak_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_reset_peak_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_resize_audio_test_SOURCES_DIST = \ ags/test/audio/task/ags_resize_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_resize_audio_test_OBJECTS = ags/test/audio/task/check_system_resize_audio_test-ags_resize_audio_test.$(OBJEXT) ags_check_system_resize_audio_test_OBJECTS = \ $(am_ags_check_system_resize_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_resize_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_resize_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_resize_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_resize_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_returnable_thread_test_SOURCES_DIST = \ ags/test/thread/ags_returnable_thread_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_returnable_thread_test_OBJECTS = ags/test/thread/check_system_returnable_thread_test-ags_returnable_thread_test.$(OBJEXT) ags_check_system_returnable_thread_test_OBJECTS = \ $(am_ags_check_system_returnable_thread_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_returnable_thread_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_returnable_thread_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_returnable_thread_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_returnable_thread_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_route_dssi_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_route_dssi_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_route_dssi_audio_test_OBJECTS = ags/test/audio/recall/check_system_route_dssi_audio_test-ags_route_dssi_audio_test.$(OBJEXT) ags_check_system_route_dssi_audio_test_OBJECTS = \ $(am_ags_check_system_route_dssi_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_dssi_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_route_dssi_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_route_dssi_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_route_dssi_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_route_lv2_audio_test_SOURCES_DIST = \ ags/test/audio/recall/ags_route_lv2_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_route_lv2_audio_test_OBJECTS = ags/test/audio/recall/check_system_route_lv2_audio_test-ags_route_lv2_audio_test.$(OBJEXT) ags_check_system_route_lv2_audio_test_OBJECTS = \ $(am_ags_check_system_route_lv2_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_lv2_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_route_lv2_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_route_lv2_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_route_lv2_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_security_context_test_SOURCES_DIST = \ ags/test/server/security/ags_security_context_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_security_context_test_OBJECTS = ags/test/server/security/check_system_security_context_test-ags_security_context_test.$(OBJEXT) ags_check_system_security_context_test_OBJECTS = \ $(am_ags_check_system_security_context_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_security_context_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_security_context_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_security_context_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_security_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_seek_soundcard_test_SOURCES_DIST = \ ags/test/audio/task/ags_seek_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_seek_soundcard_test_OBJECTS = ags/test/audio/task/check_system_seek_soundcard_test-ags_seek_soundcard_test.$(OBJEXT) ags_check_system_seek_soundcard_test_OBJECTS = \ $(am_ags_check_system_seek_soundcard_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_seek_soundcard_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_seek_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_seek_soundcard_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_seek_soundcard_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_server_application_context_test_SOURCES_DIST = \ ags/test/server/ags_server_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_server_application_context_test_OBJECTS = ags/test/server/check_system_server_application_context_test-ags_server_application_context_test.$(OBJEXT) ags_check_system_server_application_context_test_OBJECTS = $(am_ags_check_system_server_application_context_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_application_context_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_server_application_context_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_server_application_context_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_server_application_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_server_test_SOURCES_DIST = \ ags/test/server/ags_server_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_server_test_OBJECTS = ags/test/server/check_system_server_test-ags_server_test.$(OBJEXT) ags_check_system_server_test_OBJECTS = \ $(am_ags_check_system_server_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_server_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_server_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_set_audio_channels_test_SOURCES_DIST = \ ags/test/audio/task/ags_set_audio_channels_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_set_audio_channels_test_OBJECTS = ags/test/audio/task/check_system_set_audio_channels_test-ags_set_audio_channels_test.$(OBJEXT) ags_check_system_set_audio_channels_test_OBJECTS = \ $(am_ags_check_system_set_audio_channels_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_audio_channels_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_set_audio_channels_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_set_audio_channels_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_set_audio_channels_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_set_buffer_size_test_SOURCES_DIST = \ ags/test/audio/task/ags_set_buffer_size_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_set_buffer_size_test_OBJECTS = ags/test/audio/task/check_system_set_buffer_size_test-ags_set_buffer_size_test.$(OBJEXT) ags_check_system_set_buffer_size_test_OBJECTS = \ $(am_ags_check_system_set_buffer_size_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_buffer_size_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_set_buffer_size_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_set_buffer_size_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_set_buffer_size_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_set_device_test_SOURCES_DIST = \ ags/test/audio/task/ags_set_device_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_set_device_test_OBJECTS = ags/test/audio/task/check_system_set_device_test-ags_set_device_test.$(OBJEXT) ags_check_system_set_device_test_OBJECTS = \ $(am_ags_check_system_set_device_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_device_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_set_device_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_set_device_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_set_device_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_set_format_test_SOURCES_DIST = \ ags/test/audio/task/ags_set_format_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_set_format_test_OBJECTS = ags/test/audio/task/check_system_set_format_test-ags_set_format_test.$(OBJEXT) ags_check_system_set_format_test_OBJECTS = \ $(am_ags_check_system_set_format_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_format_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_set_format_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_set_format_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_set_format_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_set_muted_test_SOURCES_DIST = \ ags/test/audio/task/ags_set_muted_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_set_muted_test_OBJECTS = ags/test/audio/task/check_system_set_muted_test-ags_set_muted_test.$(OBJEXT) ags_check_system_set_muted_test_OBJECTS = \ $(am_ags_check_system_set_muted_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_muted_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_set_muted_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_set_muted_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_set_muted_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_set_samplerate_test_SOURCES_DIST = \ ags/test/audio/task/ags_set_samplerate_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_set_samplerate_test_OBJECTS = ags/test/audio/task/check_system_set_samplerate_test-ags_set_samplerate_test.$(OBJEXT) ags_check_system_set_samplerate_test_OBJECTS = \ $(am_ags_check_system_set_samplerate_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_samplerate_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_set_samplerate_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_set_samplerate_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_set_samplerate_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_soundcard_test_SOURCES_DIST = \ ags/test/object/ags_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_soundcard_test_OBJECTS = ags/test/object/check_system_soundcard_test-ags_soundcard_test.$(OBJEXT) ags_check_system_soundcard_test_OBJECTS = \ $(am_ags_check_system_soundcard_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_soundcard_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_soundcard_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_soundcard_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_start_audio_test_SOURCES_DIST = \ ags/test/audio/task/ags_start_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_start_audio_test_OBJECTS = ags/test/audio/task/check_system_start_audio_test-ags_start_audio_test.$(OBJEXT) ags_check_system_start_audio_test_OBJECTS = \ $(am_ags_check_system_start_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_start_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_start_audio_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_start_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_start_channel_test_SOURCES_DIST = \ ags/test/audio/task/ags_start_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_start_channel_test_OBJECTS = ags/test/audio/task/check_system_start_channel_test-ags_start_channel_test.$(OBJEXT) ags_check_system_start_channel_test_OBJECTS = \ $(am_ags_check_system_start_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_start_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_start_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_start_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_stream_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_stream_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_stream_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_stream_audio_signal_test-ags_stream_audio_signal_test.$(OBJEXT) ags_check_system_stream_audio_signal_test_OBJECTS = \ $(am_ags_check_system_stream_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_stream_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_stream_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_stream_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_stream_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_synth_generator_test_SOURCES_DIST = \ ags/test/audio/ags_synth_generator_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_synth_generator_test_OBJECTS = ags/test/audio/check_system_synth_generator_test-ags_synth_generator_test.$(OBJEXT) ags_check_system_synth_generator_test_OBJECTS = \ $(am_ags_check_system_synth_generator_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_synth_generator_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_synth_generator_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_synth_generator_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_synth_generator_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_task_test_SOURCES_DIST = \ ags/test/thread/ags_task_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_task_test_OBJECTS = ags/test/thread/check_system_task_test-ags_task_test.$(OBJEXT) ags_check_system_task_test_OBJECTS = \ $(am_ags_check_system_task_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_task_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_task_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_task_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_task_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_thread_pool_test_SOURCES_DIST = \ ags/test/thread/ags_thread_pool_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_thread_pool_test_OBJECTS = ags/test/thread/check_system_thread_pool_test-ags_thread_pool_test.$(OBJEXT) ags_check_system_thread_pool_test_OBJECTS = \ $(am_ags_check_system_thread_pool_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_pool_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_thread_pool_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_thread_pool_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_thread_pool_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_thread_test_SOURCES_DIST = \ ags/test/thread/ags_thread_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_thread_test_OBJECTS = ags/test/thread/check_system_thread_test-ags_thread_test.$(OBJEXT) ags_check_system_thread_test_OBJECTS = \ $(am_ags_check_system_thread_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_thread_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_thread_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_thread_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_time_test_SOURCES_DIST = \ ags/test/lib/ags_time_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_time_test_OBJECTS = ags/test/lib/check_system_time_test-ags_time_test.$(OBJEXT) ags_check_system_time_test_OBJECTS = \ $(am_ags_check_system_time_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_time_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_time_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_time_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_time_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_track_test_SOURCES_DIST = \ ags/test/audio/ags_track_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_track_test_OBJECTS = ags/test/audio/check_system_track_test-ags_track_test.$(OBJEXT) ags_check_system_track_test_OBJECTS = \ $(am_ags_check_system_track_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_track_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_track_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_track_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_track_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_turtle_manager_test_SOURCES_DIST = \ ags/test/lib/ags_turtle_manager_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_turtle_manager_test_OBJECTS = ags/test/lib/check_system_turtle_manager_test-ags_turtle_manager_test.$(OBJEXT) ags_check_system_turtle_manager_test_OBJECTS = \ $(am_ags_check_system_turtle_manager_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_manager_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_turtle_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_turtle_manager_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_turtle_manager_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_turtle_test_SOURCES_DIST = \ ags/test/lib/ags_turtle_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_turtle_test_OBJECTS = ags/test/lib/check_system_turtle_test-ags_turtle_test.$(OBJEXT) ags_check_system_turtle_test_OBJECTS = \ $(am_ags_check_system_turtle_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_turtle_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_turtle_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_turtle_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_volume_audio_signal_test_SOURCES_DIST = \ ags/test/audio/recall/ags_volume_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_volume_audio_signal_test_OBJECTS = ags/test/audio/recall/check_system_volume_audio_signal_test-ags_volume_audio_signal_test.$(OBJEXT) ags_check_system_volume_audio_signal_test_OBJECTS = \ $(am_ags_check_system_volume_audio_signal_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_audio_signal_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_volume_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_volume_audio_signal_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_volume_audio_signal_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_volume_channel_test_SOURCES_DIST = \ ags/test/audio/recall/ags_volume_channel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_volume_channel_test_OBJECTS = ags/test/audio/recall/check_system_volume_channel_test-ags_volume_channel_test.$(OBJEXT) ags_check_system_volume_channel_test_OBJECTS = \ $(am_ags_check_system_volume_channel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_channel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_volume_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_volume_channel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_volume_channel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_wave_test_SOURCES_DIST = \ ags/test/audio/ags_wave_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_wave_test_OBJECTS = ags/test/audio/check_system_wave_test-ags_wave_test.$(OBJEXT) ags_check_system_wave_test_OBJECTS = \ $(am_ags_check_system_wave_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_wave_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_wave_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_wave_test_CFLAGS) $(CFLAGS) \ $(ags_check_system_wave_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_check_system_worker_thread_test_SOURCES_DIST = \ ags/test/thread/ags_worker_thread_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_worker_thread_test_OBJECTS = ags/test/thread/check_system_worker_thread_test-ags_worker_thread_test.$(OBJEXT) ags_check_system_worker_thread_test_OBJECTS = \ $(am_ags_check_system_worker_thread_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_worker_thread_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_worker_thread_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_worker_thread_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_worker_thread_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_xml_authentication_test_SOURCES_DIST = \ ags/test/server/security/ags_xml_authentication_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_xml_authentication_test_OBJECTS = ags/test/server/security/check_system_xml_authentication_test-ags_xml_authentication_test.$(OBJEXT) ags_check_system_xml_authentication_test_OBJECTS = \ $(am_ags_check_system_xml_authentication_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_authentication_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_xml_authentication_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_xml_authentication_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_xml_authentication_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_xml_business_group_test_SOURCES_DIST = \ ags/test/server/security/ags_xml_business_group_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_xml_business_group_test_OBJECTS = ags/test/server/security/check_system_xml_business_group_test-ags_xml_business_group_test.$(OBJEXT) ags_check_system_xml_business_group_test_OBJECTS = \ $(am_ags_check_system_xml_business_group_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_business_group_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_xml_business_group_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_xml_business_group_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_xml_business_group_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_xml_certificate_test_SOURCES_DIST = \ ags/test/server/security/ags_xml_certificate_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_xml_certificate_test_OBJECTS = ags/test/server/security/check_system_xml_certificate_test-ags_xml_certificate_test.$(OBJEXT) ags_check_system_xml_certificate_test_OBJECTS = \ $(am_ags_check_system_xml_certificate_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_certificate_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_xml_certificate_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_xml_certificate_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_xml_certificate_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_xml_password_store_test_SOURCES_DIST = \ ags/test/server/security/ags_xml_password_store_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_xml_password_store_test_OBJECTS = ags/test/server/security/check_system_xml_password_store_test-ags_xml_password_store_test.$(OBJEXT) ags_check_system_xml_password_store_test_OBJECTS = \ $(am_ags_check_system_xml_password_store_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_password_store_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_xml_password_store_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_xml_password_store_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_xml_password_store_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_xorg_application_context_test_SOURCES_DIST = \ ags/test/X/ags_xorg_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_xorg_application_context_test_OBJECTS = ags/test/X/check_system_xorg_application_context_test-ags_xorg_application_context_test.$(OBJEXT) ags_check_system_xorg_application_context_test_OBJECTS = \ $(am_ags_check_system_xorg_application_context_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xorg_application_context_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) ags_check_system_xorg_application_context_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_xorg_application_context_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_xorg_application_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/ags depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(ags_check_system_acceleration_test_SOURCES) \ $(ags_check_system_add_audio_signal_test_SOURCES) \ $(ags_check_system_add_audio_test_SOURCES) \ $(ags_check_system_add_effect_test_SOURCES) \ $(ags_check_system_add_note_test_SOURCES) \ $(ags_check_system_add_soundcard_test_SOURCES) \ $(ags_check_system_analyse_audio_signal_test_SOURCES) \ $(ags_check_system_analyse_channel_test_SOURCES) \ $(ags_check_system_application_context_test_SOURCES) \ $(ags_check_system_apply_bpm_test_SOURCES) \ $(ags_check_system_apply_presets_test_SOURCES) \ $(ags_check_system_apply_sequencer_length_test_SOURCES) \ $(ags_check_system_apply_synth_test_SOURCES) \ $(ags_check_system_apply_tact_test_SOURCES) \ $(ags_check_system_audio_application_context_test_SOURCES) \ $(ags_check_system_audio_buffer_util_test_SOURCES) \ $(ags_check_system_audio_signal_test_SOURCES) \ $(ags_check_system_audio_test_SOURCES) \ $(ags_check_system_authentication_manager_test_SOURCES) \ $(ags_check_system_automation_test_SOURCES) \ $(ags_check_system_base_plugin_test_SOURCES) \ $(ags_check_system_buffer_audio_signal_test_SOURCES) \ $(ags_check_system_buffer_channel_test_SOURCES) \ $(ags_check_system_buffer_test_SOURCES) \ $(ags_check_system_buffer_util_test_SOURCES) \ $(ags_check_system_business_group_manager_test_SOURCES) \ $(ags_check_system_cancel_audio_test_SOURCES) \ $(ags_check_system_cancel_channel_test_SOURCES) \ $(ags_check_system_capture_wave_audio_test_SOURCES) \ $(ags_check_system_capture_wave_channel_test_SOURCES) \ $(ags_check_system_certificate_manager_test_SOURCES) \ $(ags_check_system_channel_test_SOURCES) \ $(ags_check_system_char_buffer_util_test_SOURCES) \ $(ags_check_system_clear_audio_signal_test_SOURCES) \ $(ags_check_system_clear_buffer_test_SOURCES) \ $(ags_check_system_complex_test_SOURCES) \ $(ags_check_system_config_test_SOURCES) \ $(ags_check_system_connectable_test_SOURCES) \ $(ags_check_system_controller_test_SOURCES) \ $(ags_check_system_conversion_test_SOURCES) \ $(ags_check_system_copy_audio_signal_test_SOURCES) \ $(ags_check_system_copy_channel_test_SOURCES) \ $(ags_check_system_copy_pattern_audio_test_SOURCES) \ $(ags_check_system_copy_pattern_channel_test_SOURCES) \ $(ags_check_system_count_beats_audio_test_SOURCES) \ $(ags_check_system_crop_note_test_SOURCES) \ $(ags_check_system_delay_audio_test_SOURCES) \ $(ags_check_system_destroy_worker_test_SOURCES) \ $(ags_check_system_devin_test_SOURCES) \ $(ags_check_system_devout_test_SOURCES) \ $(ags_check_system_dssi_manager_test_SOURCES) \ $(ags_check_system_dssi_plugin_test_SOURCES) \ $(ags_check_system_envelope_audio_signal_test_SOURCES) \ $(ags_check_system_envelope_channel_test_SOURCES) \ $(ags_check_system_eq10_audio_signal_test_SOURCES) \ $(ags_check_system_eq10_channel_test_SOURCES) \ $(ags_check_system_export_output_test_SOURCES) \ $(ags_check_system_feed_audio_signal_test_SOURCES) \ $(ags_check_system_fifoout_test_SOURCES) \ $(ags_check_system_file_id_ref_test_SOURCES) \ $(ags_check_system_file_launch_test_SOURCES) \ $(ags_check_system_file_lookup_test_SOURCES) \ $(ags_check_system_file_test_SOURCES) \ $(ags_check_system_filter_util_test_SOURCES) \ $(ags_check_system_fm_synth_util_test_SOURCES) \ $(ags_check_system_fourier_transform_util_test_SOURCES) \ $(ags_check_system_free_selection_test_SOURCES) \ $(ags_check_system_front_controller_test_SOURCES) \ $(ags_check_system_input_test_SOURCES) \ $(ags_check_system_ladspa_conversion_test_SOURCES) \ $(ags_check_system_ladspa_manager_test_SOURCES) \ $(ags_check_system_link_channel_test_SOURCES) \ $(ags_check_system_log_test_SOURCES) \ $(ags_check_system_lv2_conversion_test_SOURCES) \ $(ags_check_system_lv2_manager_test_SOURCES) \ $(ags_check_system_lv2_option_manager_test_SOURCES) \ $(ags_check_system_lv2_plugin_test_SOURCES) \ $(ags_check_system_lv2_preset_test_SOURCES) \ $(ags_check_system_lv2_uri_map_manager_test_SOURCES) \ $(ags_check_system_lv2_urid_manager_test_SOURCES) \ $(ags_check_system_lv2_worker_manager_test_SOURCES) \ $(ags_check_system_lv2ui_manager_test_SOURCES) \ $(ags_check_system_lv2ui_plugin_test_SOURCES) \ $(ags_check_system_midi_buffer_util_test_SOURCES) \ $(ags_check_system_midi_builder_test_SOURCES) \ $(ags_check_system_midi_test_SOURCES) \ $(ags_check_system_midiin_test_SOURCES) \ $(ags_check_system_move_note_test_SOURCES) \ $(ags_check_system_mute_audio_signal_test_SOURCES) \ $(ags_check_system_mute_audio_test_SOURCES) \ $(ags_check_system_mute_channel_test_SOURCES) \ $(ags_check_system_notation_test_SOURCES) \ $(ags_check_system_note_test_SOURCES) \ $(ags_check_system_osc_action_controller_test_SOURCES) \ $(ags_check_system_osc_buffer_util_test_SOURCES) \ $(ags_check_system_osc_client_test_SOURCES) \ $(ags_check_system_osc_config_controller_test_SOURCES) \ $(ags_check_system_osc_connection_test_SOURCES) \ $(ags_check_system_osc_front_controller_test_SOURCES) \ $(ags_check_system_osc_info_controller_test_SOURCES) \ $(ags_check_system_osc_message_test_SOURCES) \ $(ags_check_system_osc_meter_controller_test_SOURCES) \ $(ags_check_system_osc_node_controller_test_SOURCES) \ $(ags_check_system_osc_renew_controller_test_SOURCES) \ $(ags_check_system_osc_server_test_SOURCES) \ $(ags_check_system_osc_status_controller_test_SOURCES) \ $(ags_check_system_osc_websocket_connection_test_SOURCES) \ $(ags_check_system_osc_xmlrpc_controller_test_SOURCES) \ $(ags_check_system_osc_xmlrpc_message_test_SOURCES) \ $(ags_check_system_osc_xmlrpc_server_test_SOURCES) \ $(ags_check_system_output_test_SOURCES) \ $(ags_check_system_password_store_manager_test_SOURCES) \ $(ags_check_system_pattern_test_SOURCES) \ $(ags_check_system_peak_audio_signal_test_SOURCES) \ $(ags_check_system_peak_channel_test_SOURCES) \ $(ags_check_system_play_audio_signal_test_SOURCES) \ $(ags_check_system_play_audio_test_SOURCES) \ $(ags_check_system_play_channel_test_SOURCES) \ $(ags_check_system_play_wave_audio_test_SOURCES) \ $(ags_check_system_play_wave_channel_test_SOURCES) \ $(ags_check_system_playback_domain_test_SOURCES) \ $(ags_check_system_playback_test_SOURCES) \ $(ags_check_system_plugin_port_test_SOURCES) \ $(ags_check_system_port_test_SOURCES) \ $(ags_check_system_prepare_audio_signal_test_SOURCES) \ $(ags_check_system_preset_test_SOURCES) \ $(ags_check_system_recall_channel_run_test_SOURCES) \ $(ags_check_system_recall_channel_test_SOURCES) \ $(ags_check_system_recall_container_test_SOURCES) \ $(ags_check_system_recall_dependency_test_SOURCES) \ $(ags_check_system_recall_id_test_SOURCES) \ $(ags_check_system_recall_recycling_test_SOURCES) \ $(ags_check_system_recall_test_SOURCES) \ $(ags_check_system_record_midi_audio_test_SOURCES) \ $(ags_check_system_recycling_context_test_SOURCES) \ $(ags_check_system_recycling_test_SOURCES) \ $(ags_check_system_remove_audio_signal_test_SOURCES) \ $(ags_check_system_remove_audio_test_SOURCES) \ $(ags_check_system_remove_note_test_SOURCES) \ $(ags_check_system_remove_soundcard_test_SOURCES) \ $(ags_check_system_reset_amplitude_test_SOURCES) \ $(ags_check_system_reset_peak_test_SOURCES) \ $(ags_check_system_resize_audio_test_SOURCES) \ $(ags_check_system_returnable_thread_test_SOURCES) \ $(ags_check_system_route_dssi_audio_test_SOURCES) \ $(ags_check_system_route_lv2_audio_test_SOURCES) \ $(ags_check_system_security_context_test_SOURCES) \ $(ags_check_system_seek_soundcard_test_SOURCES) \ $(ags_check_system_server_application_context_test_SOURCES) \ $(ags_check_system_server_test_SOURCES) \ $(ags_check_system_set_audio_channels_test_SOURCES) \ $(ags_check_system_set_buffer_size_test_SOURCES) \ $(ags_check_system_set_device_test_SOURCES) \ $(ags_check_system_set_format_test_SOURCES) \ $(ags_check_system_set_muted_test_SOURCES) \ $(ags_check_system_set_samplerate_test_SOURCES) \ $(ags_check_system_soundcard_test_SOURCES) \ $(ags_check_system_start_audio_test_SOURCES) \ $(ags_check_system_start_channel_test_SOURCES) \ $(ags_check_system_stream_audio_signal_test_SOURCES) \ $(ags_check_system_synth_generator_test_SOURCES) \ $(ags_check_system_task_test_SOURCES) \ $(ags_check_system_thread_pool_test_SOURCES) \ $(ags_check_system_thread_test_SOURCES) \ $(ags_check_system_time_test_SOURCES) \ $(ags_check_system_track_test_SOURCES) \ $(ags_check_system_turtle_manager_test_SOURCES) \ $(ags_check_system_turtle_test_SOURCES) \ $(ags_check_system_volume_audio_signal_test_SOURCES) \ $(ags_check_system_volume_channel_test_SOURCES) \ $(ags_check_system_wave_test_SOURCES) \ $(ags_check_system_worker_thread_test_SOURCES) \ $(ags_check_system_xml_authentication_test_SOURCES) \ $(ags_check_system_xml_business_group_test_SOURCES) \ $(ags_check_system_xml_certificate_test_SOURCES) \ $(ags_check_system_xml_password_store_test_SOURCES) \ $(ags_check_system_xorg_application_context_test_SOURCES) DIST_SOURCES = $(am__ags_check_system_acceleration_test_SOURCES_DIST) \ $(am__ags_check_system_add_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_add_audio_test_SOURCES_DIST) \ $(am__ags_check_system_add_effect_test_SOURCES_DIST) \ $(am__ags_check_system_add_note_test_SOURCES_DIST) \ $(am__ags_check_system_add_soundcard_test_SOURCES_DIST) \ $(am__ags_check_system_analyse_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_analyse_channel_test_SOURCES_DIST) \ $(am__ags_check_system_application_context_test_SOURCES_DIST) \ $(am__ags_check_system_apply_bpm_test_SOURCES_DIST) \ $(am__ags_check_system_apply_presets_test_SOURCES_DIST) \ $(am__ags_check_system_apply_sequencer_length_test_SOURCES_DIST) \ $(am__ags_check_system_apply_synth_test_SOURCES_DIST) \ $(am__ags_check_system_apply_tact_test_SOURCES_DIST) \ $(am__ags_check_system_audio_application_context_test_SOURCES_DIST) \ $(am__ags_check_system_audio_buffer_util_test_SOURCES_DIST) \ $(am__ags_check_system_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_audio_test_SOURCES_DIST) \ $(am__ags_check_system_authentication_manager_test_SOURCES_DIST) \ $(am__ags_check_system_automation_test_SOURCES_DIST) \ $(am__ags_check_system_base_plugin_test_SOURCES_DIST) \ $(am__ags_check_system_buffer_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_buffer_channel_test_SOURCES_DIST) \ $(am__ags_check_system_buffer_test_SOURCES_DIST) \ $(am__ags_check_system_buffer_util_test_SOURCES_DIST) \ $(am__ags_check_system_business_group_manager_test_SOURCES_DIST) \ $(am__ags_check_system_cancel_audio_test_SOURCES_DIST) \ $(am__ags_check_system_cancel_channel_test_SOURCES_DIST) \ $(am__ags_check_system_capture_wave_audio_test_SOURCES_DIST) \ $(am__ags_check_system_capture_wave_channel_test_SOURCES_DIST) \ $(am__ags_check_system_certificate_manager_test_SOURCES_DIST) \ $(am__ags_check_system_channel_test_SOURCES_DIST) \ $(am__ags_check_system_char_buffer_util_test_SOURCES_DIST) \ $(am__ags_check_system_clear_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_clear_buffer_test_SOURCES_DIST) \ $(am__ags_check_system_complex_test_SOURCES_DIST) \ $(am__ags_check_system_config_test_SOURCES_DIST) \ $(am__ags_check_system_connectable_test_SOURCES_DIST) \ $(am__ags_check_system_controller_test_SOURCES_DIST) \ $(am__ags_check_system_conversion_test_SOURCES_DIST) \ $(am__ags_check_system_copy_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_copy_channel_test_SOURCES_DIST) \ $(am__ags_check_system_copy_pattern_audio_test_SOURCES_DIST) \ $(am__ags_check_system_copy_pattern_channel_test_SOURCES_DIST) \ $(am__ags_check_system_count_beats_audio_test_SOURCES_DIST) \ $(am__ags_check_system_crop_note_test_SOURCES_DIST) \ $(am__ags_check_system_delay_audio_test_SOURCES_DIST) \ $(am__ags_check_system_destroy_worker_test_SOURCES_DIST) \ $(am__ags_check_system_devin_test_SOURCES_DIST) \ $(am__ags_check_system_devout_test_SOURCES_DIST) \ $(am__ags_check_system_dssi_manager_test_SOURCES_DIST) \ $(am__ags_check_system_dssi_plugin_test_SOURCES_DIST) \ $(am__ags_check_system_envelope_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_envelope_channel_test_SOURCES_DIST) \ $(am__ags_check_system_eq10_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_eq10_channel_test_SOURCES_DIST) \ $(am__ags_check_system_export_output_test_SOURCES_DIST) \ $(am__ags_check_system_feed_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_fifoout_test_SOURCES_DIST) \ $(am__ags_check_system_file_id_ref_test_SOURCES_DIST) \ $(am__ags_check_system_file_launch_test_SOURCES_DIST) \ $(am__ags_check_system_file_lookup_test_SOURCES_DIST) \ $(am__ags_check_system_file_test_SOURCES_DIST) \ $(am__ags_check_system_filter_util_test_SOURCES_DIST) \ $(am__ags_check_system_fm_synth_util_test_SOURCES_DIST) \ $(am__ags_check_system_fourier_transform_util_test_SOURCES_DIST) \ $(am__ags_check_system_free_selection_test_SOURCES_DIST) \ $(am__ags_check_system_front_controller_test_SOURCES_DIST) \ $(am__ags_check_system_input_test_SOURCES_DIST) \ $(am__ags_check_system_ladspa_conversion_test_SOURCES_DIST) \ $(am__ags_check_system_ladspa_manager_test_SOURCES_DIST) \ $(am__ags_check_system_link_channel_test_SOURCES_DIST) \ $(am__ags_check_system_log_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_conversion_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_manager_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_option_manager_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_plugin_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_preset_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_uri_map_manager_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_urid_manager_test_SOURCES_DIST) \ $(am__ags_check_system_lv2_worker_manager_test_SOURCES_DIST) \ $(am__ags_check_system_lv2ui_manager_test_SOURCES_DIST) \ $(am__ags_check_system_lv2ui_plugin_test_SOURCES_DIST) \ $(am__ags_check_system_midi_buffer_util_test_SOURCES_DIST) \ $(am__ags_check_system_midi_builder_test_SOURCES_DIST) \ $(am__ags_check_system_midi_test_SOURCES_DIST) \ $(am__ags_check_system_midiin_test_SOURCES_DIST) \ $(am__ags_check_system_move_note_test_SOURCES_DIST) \ $(am__ags_check_system_mute_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_mute_audio_test_SOURCES_DIST) \ $(am__ags_check_system_mute_channel_test_SOURCES_DIST) \ $(am__ags_check_system_notation_test_SOURCES_DIST) \ $(am__ags_check_system_note_test_SOURCES_DIST) \ $(am__ags_check_system_osc_action_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_buffer_util_test_SOURCES_DIST) \ $(am__ags_check_system_osc_client_test_SOURCES_DIST) \ $(am__ags_check_system_osc_config_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_connection_test_SOURCES_DIST) \ $(am__ags_check_system_osc_front_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_info_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_message_test_SOURCES_DIST) \ $(am__ags_check_system_osc_meter_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_node_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_renew_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_server_test_SOURCES_DIST) \ $(am__ags_check_system_osc_status_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_websocket_connection_test_SOURCES_DIST) \ $(am__ags_check_system_osc_xmlrpc_controller_test_SOURCES_DIST) \ $(am__ags_check_system_osc_xmlrpc_message_test_SOURCES_DIST) \ $(am__ags_check_system_osc_xmlrpc_server_test_SOURCES_DIST) \ $(am__ags_check_system_output_test_SOURCES_DIST) \ $(am__ags_check_system_password_store_manager_test_SOURCES_DIST) \ $(am__ags_check_system_pattern_test_SOURCES_DIST) \ $(am__ags_check_system_peak_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_peak_channel_test_SOURCES_DIST) \ $(am__ags_check_system_play_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_play_audio_test_SOURCES_DIST) \ $(am__ags_check_system_play_channel_test_SOURCES_DIST) \ $(am__ags_check_system_play_wave_audio_test_SOURCES_DIST) \ $(am__ags_check_system_play_wave_channel_test_SOURCES_DIST) \ $(am__ags_check_system_playback_domain_test_SOURCES_DIST) \ $(am__ags_check_system_playback_test_SOURCES_DIST) \ $(am__ags_check_system_plugin_port_test_SOURCES_DIST) \ $(am__ags_check_system_port_test_SOURCES_DIST) \ $(am__ags_check_system_prepare_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_preset_test_SOURCES_DIST) \ $(am__ags_check_system_recall_channel_run_test_SOURCES_DIST) \ $(am__ags_check_system_recall_channel_test_SOURCES_DIST) \ $(am__ags_check_system_recall_container_test_SOURCES_DIST) \ $(am__ags_check_system_recall_dependency_test_SOURCES_DIST) \ $(am__ags_check_system_recall_id_test_SOURCES_DIST) \ $(am__ags_check_system_recall_recycling_test_SOURCES_DIST) \ $(am__ags_check_system_recall_test_SOURCES_DIST) \ $(am__ags_check_system_record_midi_audio_test_SOURCES_DIST) \ $(am__ags_check_system_recycling_context_test_SOURCES_DIST) \ $(am__ags_check_system_recycling_test_SOURCES_DIST) \ $(am__ags_check_system_remove_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_remove_audio_test_SOURCES_DIST) \ $(am__ags_check_system_remove_note_test_SOURCES_DIST) \ $(am__ags_check_system_remove_soundcard_test_SOURCES_DIST) \ $(am__ags_check_system_reset_amplitude_test_SOURCES_DIST) \ $(am__ags_check_system_reset_peak_test_SOURCES_DIST) \ $(am__ags_check_system_resize_audio_test_SOURCES_DIST) \ $(am__ags_check_system_returnable_thread_test_SOURCES_DIST) \ $(am__ags_check_system_route_dssi_audio_test_SOURCES_DIST) \ $(am__ags_check_system_route_lv2_audio_test_SOURCES_DIST) \ $(am__ags_check_system_security_context_test_SOURCES_DIST) \ $(am__ags_check_system_seek_soundcard_test_SOURCES_DIST) \ $(am__ags_check_system_server_application_context_test_SOURCES_DIST) \ $(am__ags_check_system_server_test_SOURCES_DIST) \ $(am__ags_check_system_set_audio_channels_test_SOURCES_DIST) \ $(am__ags_check_system_set_buffer_size_test_SOURCES_DIST) \ $(am__ags_check_system_set_device_test_SOURCES_DIST) \ $(am__ags_check_system_set_format_test_SOURCES_DIST) \ $(am__ags_check_system_set_muted_test_SOURCES_DIST) \ $(am__ags_check_system_set_samplerate_test_SOURCES_DIST) \ $(am__ags_check_system_soundcard_test_SOURCES_DIST) \ $(am__ags_check_system_start_audio_test_SOURCES_DIST) \ $(am__ags_check_system_start_channel_test_SOURCES_DIST) \ $(am__ags_check_system_stream_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_synth_generator_test_SOURCES_DIST) \ $(am__ags_check_system_task_test_SOURCES_DIST) \ $(am__ags_check_system_thread_pool_test_SOURCES_DIST) \ $(am__ags_check_system_thread_test_SOURCES_DIST) \ $(am__ags_check_system_time_test_SOURCES_DIST) \ $(am__ags_check_system_track_test_SOURCES_DIST) \ $(am__ags_check_system_turtle_manager_test_SOURCES_DIST) \ $(am__ags_check_system_turtle_test_SOURCES_DIST) \ $(am__ags_check_system_volume_audio_signal_test_SOURCES_DIST) \ $(am__ags_check_system_volume_channel_test_SOURCES_DIST) \ $(am__ags_check_system_wave_test_SOURCES_DIST) \ $(am__ags_check_system_worker_thread_test_SOURCES_DIST) \ $(am__ags_check_system_xml_authentication_test_SOURCES_DIST) \ $(am__ags_check_system_xml_business_group_test_SOURCES_DIST) \ $(am__ags_check_system_xml_certificate_test_SOURCES_DIST) \ $(am__ags_check_system_xml_password_store_test_SOURCES_DIST) \ $(am__ags_check_system_xorg_application_context_test_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/libags.pc.in $(srcdir)/libags_audio.pc.in \ $(srcdir)/libags_gui.pc.in $(srcdir)/libgsequencer.pc.in \ $(srcdir)/unit-system-tests.mk.in \ $(top_srcdir)/ags/ags_config.h.in \ $(top_srcdir)/ags/config.h.in ABOUT-NLS AUTHORS COPYING \ ChangeLog INSTALL NEWS README TODO compile config.guess \ config.rpath config.sub depcomp install-sh ltmain.sh missing \ mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign no-dependencies SUBDIRS = po AM_CPPFLAGS = -std=gnu99 -include errno.h -DSRCDIR=\"$(srcdir)\" AGS_FEATURES = $(am__append_1) # unit system tests - libags @WITH_SYSTEM_TESTS_TRUE@libags_installcheck_programs = \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_complex_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_conversion_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_log_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_time_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_turtle_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_turtle_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_application_context_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_config_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_connectable_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_soundcard_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_destroy_worker_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_returnable_thread_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_task_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_thread_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_thread_pool_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_worker_thread_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_id_ref_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_launch_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_file_lookup_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_server_application_context_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_server_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_front_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_authentication_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_business_group_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_certificate_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_password_store_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_authentication_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_business_group_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_certificate_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xml_password_store_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_security_context_test # unit system tests - libags-audio @WITH_SYSTEM_TESTS_TRUE@libags_audio_installcheck_programs = \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_base_plugin_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_dssi_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_dssi_plugin_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_ladspa_conversion_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_ladspa_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_conversion_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_option_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_plugin_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_preset_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_uri_map_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_urid_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2_worker_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2ui_manager_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_lv2ui_plugin_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_plugin_port_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_application_context_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_devin_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_devout_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_fifoout_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midiin_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_playback_domain_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_playback_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_preset_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_input_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_output_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recycling_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_audio_buffer_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_char_buffer_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_filter_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_fm_synth_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_fourier_transform_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_channel_run_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_container_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_dependency_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_id_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recall_recycling_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_recycling_context_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_synth_generator_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_port_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_pattern_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_notation_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_note_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_automation_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_acceleration_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_wave_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midi_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_track_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midi_buffer_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_midi_builder_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_buffer_util_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_client_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_connection_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_message_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_server_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_websocket_connection_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_xmlrpc_message_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_xmlrpc_server_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_action_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_config_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_front_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_renew_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_info_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_meter_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_node_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_status_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_osc_xmlrpc_controller_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_analyse_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_analyse_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_buffer_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_capture_wave_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_capture_wave_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_pattern_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_copy_pattern_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_count_beats_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_delay_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_envelope_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_envelope_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_eq10_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_eq10_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_feed_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_mute_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_mute_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_mute_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_peak_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_peak_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_wave_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_play_wave_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_prepare_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_record_midi_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_route_dssi_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_route_lv2_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_stream_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_volume_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_volume_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_effect_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_note_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_add_soundcard_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_bpm_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_presets_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_sequencer_length_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_synth_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_apply_tact_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_cancel_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_cancel_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_clear_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_clear_buffer_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_crop_note_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_export_output_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_free_selection_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_link_channel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_move_note_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_audio_signal_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_note_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_remove_soundcard_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_reset_amplitude_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_reset_peak_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_resize_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_seek_soundcard_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_audio_channels_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_buffer_size_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_device_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_format_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_muted_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_set_samplerate_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_start_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_start_channel_test # unit sytem tests - libgsequencer @WITH_SYSTEM_TESTS_TRUE@libgsequencer_installcheck_programs = \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_xorg_application_context_test # buffer util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_util_test_SOURCES = ags/test/lib/ags_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # complex unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_complex_test_SOURCES = ags/test/lib/ags_complex_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_complex_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_complex_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_complex_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_complex_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # conversion unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_conversion_test_SOURCES = ags/test/lib/ags_conversion_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_conversion_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_conversion_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_conversion_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_conversion_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # log unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_log_test_SOURCES = ags/test/lib/ags_log_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_log_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_log_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_log_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_log_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # time unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_time_test_SOURCES = ags/test/lib/ags_time_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_time_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_time_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_time_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_time_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_manager_test_SOURCES = ags/test/lib/ags_turtle_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_manager_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_test_SOURCES = ags/test/lib/ags_turtle_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_turtle_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # application context unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_application_context_test_SOURCES = ags/test/object/ags_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_application_context_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_application_context_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # config unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_config_test_SOURCES = ags/test/object/ags_config_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_config_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_config_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_config_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_config_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # connectable unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_connectable_test_SOURCES = ags/test/object/ags_connectable_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_connectable_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_connectable_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_connectable_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_connectable_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lags_audio -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # soundcard unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_soundcard_test_SOURCES = ags/test/object/ags_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_soundcard_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # destroy worker unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_destroy_worker_test_SOURCES = ags/test/thread/ags_destroy_worker_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_destroy_worker_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_destroy_worker_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_destroy_worker_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_destroy_worker_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # returnable thread unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_returnable_thread_test_SOURCES = ags/test/thread/ags_returnable_thread_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_returnable_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_returnable_thread_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_returnable_thread_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_returnable_thread_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # task unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_task_test_SOURCES = ags/test/thread/ags_task_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_task_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_task_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_task_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_task_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_test_SOURCES = ags/test/thread/ags_thread_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread pool unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_pool_test_SOURCES = ags/test/thread/ags_thread_pool_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_pool_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_pool_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_pool_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_thread_pool_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # worker thread unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_worker_thread_test_SOURCES = ags/test/thread/ags_worker_thread_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_worker_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_worker_thread_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_worker_thread_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_worker_thread_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_test_SOURCES = ags/test/file/ags_file_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file id ref unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_id_ref_test_SOURCES = ags/test/file/ags_file_id_ref_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_id_ref_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_id_ref_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_id_ref_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_id_ref_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file launch unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_launch_test_SOURCES = ags/test/file/ags_file_launch_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_launch_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_launch_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_launch_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_launch_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file lookup unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_lookup_test_SOURCES = ags/test/file/ags_file_lookup_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_lookup_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_lookup_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_lookup_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_file_lookup_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server application context unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_application_context_test_SOURCES = ags/test/server/ags_server_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_application_context_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_application_context_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_test_SOURCES = ags/test/server/ags_server_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_server_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_controller_test_SOURCES = ags/test/server/controller/ags_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # front controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_front_controller_test_SOURCES = ags/test/server/controller/ags_front_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_front_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_front_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_front_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # authentication manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_authentication_manager_test_SOURCES = ags/test/server/security/ags_authentication_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_authentication_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_authentication_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_authentication_manager_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_authentication_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # business group manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_business_group_manager_test_SOURCES = ags/test/server/security/ags_business_group_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_business_group_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_business_group_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_business_group_manager_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_business_group_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # certificate manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_certificate_manager_test_SOURCES = ags/test/server/security/ags_certificate_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_certificate_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_certificate_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_certificate_manager_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_certificate_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # password store manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_password_store_manager_test_SOURCES = ags/test/server/security/ags_password_store_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_password_store_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_password_store_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_password_store_manager_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_password_store_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML authentication unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_authentication_test_SOURCES = ags/test/server/security/ags_xml_authentication_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_authentication_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_authentication_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_authentication_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_authentication_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML business group unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_business_group_test_SOURCES = ags/test/server/security/ags_xml_business_group_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_business_group_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_business_group_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_business_group_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_business_group_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML certificate unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_certificate_test_SOURCES = ags/test/server/security/ags_xml_certificate_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_certificate_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_certificate_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_certificate_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_certificate_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML password store unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_password_store_test_SOURCES = ags/test/server/security/ags_xml_password_store_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_password_store_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_password_store_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_password_store_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xml_password_store_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # security context unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_security_context_test_SOURCES = ags/test/server/security/ags_security_context_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_security_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_security_context_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_security_context_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_security_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # base plugin unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_base_plugin_test_SOURCES = ags/test/plugin/ags_base_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_base_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_base_plugin_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_base_plugin_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_base_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_manager_test_SOURCES = ags/test/plugin/ags_dssi_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi plugin unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_plugin_test_SOURCES = ags/test/plugin/ags_dssi_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_plugin_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_plugin_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_dssi_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa conversion unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_conversion_test_SOURCES = ags/test/plugin/ags_ladspa_conversion_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_conversion_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_conversion_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_conversion_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_manager_test_SOURCES = ags/test/plugin/ags_ladspa_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_ladspa_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 conversion unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_conversion_test_SOURCES = ags/test/plugin/ags_lv2_conversion_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_conversion_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_conversion_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_conversion_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_manager_test_SOURCES = ags/test/plugin/ags_lv2_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 option manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_option_manager_test_SOURCES = ags/test/plugin/ags_lv2_option_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_option_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_option_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_option_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_option_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 plugin unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_plugin_test_SOURCES = ags/test/plugin/ags_lv2_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_plugin_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_plugin_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 preset unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_preset_test_SOURCES = ags/test/plugin/ags_lv2_preset_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_preset_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_preset_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_preset_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 uri map manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_uri_map_manager_test_SOURCES = ags/test/plugin/ags_lv2_uri_map_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_uri_map_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_uri_map_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_uri_map_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_uri_map_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 urid manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_urid_manager_test_SOURCES = ags/test/plugin/ags_lv2_urid_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_urid_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_urid_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_urid_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_urid_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 worker manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_worker_manager_test_SOURCES = ags/test/plugin/ags_lv2_worker_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_worker_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_worker_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_worker_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2_worker_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui manager unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_manager_test_SOURCES = ags/test/plugin/ags_lv2ui_manager_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_manager_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_manager_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui plugin unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_plugin_test_SOURCES = ags/test/plugin/ags_lv2ui_plugin_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_plugin_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_plugin_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_lv2ui_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # plugin port unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_plugin_port_test_SOURCES = ags/test/plugin/ags_plugin_port_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_plugin_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_plugin_port_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_plugin_port_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_plugin_port_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio application context unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_application_context_test_SOURCES = ags/test/audio/ags_audio_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_application_context_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_application_context_test_LDFLAGS = $(LDFLAGS) -pthread @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devin unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devin_test_SOURCES = ags/test/audio/ags_devin_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devin_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devin_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devout unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devout_test_SOURCES = ags/test/audio/ags_devout_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devout_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devout_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_devout_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fifoout unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fifoout_test_SOURCES = ags/test/audio/ags_fifoout_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fifoout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fifout_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fifoout_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fifoout_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midiin unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midiin_test_SOURCES = ags/test/audio/ags_midiin_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midiin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midiin_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midiin_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midiin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_test_SOURCES = ags/test/audio/ags_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback domain unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_domain_test_SOURCES = ags/test/audio/ags_playback_domain_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_domain_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_domain_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_domain_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_domain_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_test_SOURCES = ags/test/audio/ags_playback_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_playback_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # preset unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_preset_test_SOURCES = ags/test/audio/ags_preset_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_preset_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_preset_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_preset_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_channel_test_SOURCES = ags/test/audio/ags_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # input unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_input_test_SOURCES = ags/test/audio/ags_input_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_input_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_input_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_input_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_input_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # output unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_output_test_SOURCES = ags/test/audio/ags_output_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_output_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_output_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_output_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_test_SOURCES = ags/test/audio/ags_recycling_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_signal_test_SOURCES = ags/test/audio/ags_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio buffer util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_buffer_util_test_SOURCES = ags/test/audio/ags_audio_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_audio_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # char buffer util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_char_buffer_util_test_SOURCES = ags/test/audio/ags_char_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_char_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_char_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_char_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_char_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # filter util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_filter_util_test_SOURCES = ags/test/audio/ags_filter_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_filter_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_filter_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_filter_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_filter_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # FM synth util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fm_synth_util_test_SOURCES = ags/test/audio/ags_fm_synth_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fm_synth_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fm_synth_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fm_synth_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fm_synth_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fourier transform util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fourier_transform_util_test_SOURCES = ags/test/audio/ags_fourier_transform_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fourier_transform_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fourier_transfrom_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fourier_transform_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_fourier_transform_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_test_SOURCES = ags/test/audio/ags_recall_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_test_SOURCES = ags/test/audio/ags_recall_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel run unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_run_test_SOURCES = ags/test/audio/ags_recall_channel_run_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_run_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_run_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_run_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_channel_run_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall container unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_container_test_SOURCES = ags/test/audio/ags_recall_container_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_container_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_container_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_container_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_container_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall dependency unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_dependency_test_SOURCES = ags/test/audio/ags_recall_dependency_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_dependency_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_dependency_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_dependency_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_dependency_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall id unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_id_test_SOURCES = ags/test/audio/ags_recall_id_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_id_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_id_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_id_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_id_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall recycling unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_recycling_test_SOURCES = ags/test/audio/ags_recall_recycling_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_recycling_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_recycling_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recall_recycling_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling context unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_context_test_SOURCES = ags/test/audio/ags_recycling_context_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_context_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_context_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_recycling_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # synth generator unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_synth_generator_test_SOURCES = ags/test/audio/ags_synth_generator_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_synth_generator_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_synth_generator_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_synth_generator_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_synth_generator_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # port unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_port_test_SOURCES = ags/test/audio/ags_port_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_port_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_port_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_port_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # pattern unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_pattern_test_SOURCES = ags/test/audio/ags_pattern_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_pattern_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_pattern_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_pattern_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_pattern_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # notation unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_notation_test_SOURCES = ags/test/audio/ags_notation_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_notation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_notation_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_notation_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_notation_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # note unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_note_test_SOURCES = ags/test/audio/ags_note_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_note_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_note_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # automation unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_automation_test_SOURCES = ags/test/audio/ags_automation_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_automation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_automation_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_automation_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_automation_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # acceleration unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_acceleration_test_SOURCES = ags/test/audio/ags_acceleration_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_acceleration_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_acceleration_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_acceleration_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_acceleration_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # wave unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_wave_test_SOURCES = ags/test/audio/ags_wave_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_wave_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_wave_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_wave_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_wave_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_test_SOURCES = ags/test/audio/ags_buffer_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_test_SOURCES = ags/test/audio/ags_midi_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # track unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_track_test_SOURCES = ags/test/audio/ags_track_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_track_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_track_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_track_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_track_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi buffer util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_buffer_util_test_SOURCES = ags/test/audio/midi/ags_midi_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi builder unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_builder_test_SOURCES = ags/test/audio/midi/ags_midi_builder_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_builder_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_builder_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_builder_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_midi_builder_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc buffer util unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_buffer_util_test_SOURCES = ags/test/audio/osc/ags_osc_buffer_util_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc client unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_client_test_SOURCES = ags/test/audio/osc/ags_osc_client_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_client_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_client_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_client_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_client_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc connection unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_connection_test_SOURCES = ags/test/audio/osc/ags_osc_connection_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_connection_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_connection_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_connection_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc message unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_message_test_SOURCES = ags/test/audio/osc/ags_osc_message_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_message_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_message_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_message_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc server unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_server_test_SOURCES = ags/test/audio/osc/ags_osc_server_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_server_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_server_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc websocket connection unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_websocket_connection_test_SOURCES = ags/test/audio/osc/ags_osc_websocket_connection_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_websocket_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_websocket_connection_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_websocket_connection_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_websocket_connection_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC message unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_message_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_message_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_message_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_message_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_message_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC server unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_server_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_server_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_server_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc action controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_action_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_action_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_action_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_action_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_action_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_action_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc config controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_config_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_config_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_config_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_config_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_config_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_config_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc front controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_front_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_front_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_front_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_front_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_front_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc renew controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_renew_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_renew_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_renew_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_renew_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_renew_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_renew_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc info controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_info_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_info_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_info_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_info_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_info_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_info_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc meter controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_meter_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_meter_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_meter_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_meter_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_meter_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_meter_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc node controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_node_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_node_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_node_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_node_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_node_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_node_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc status controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_status_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_status_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_status_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_status_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_status_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_status_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc xmlrpc controller unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_controller_test_SOURCES = ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_controller_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_controller_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_osc_xmlrpc_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_audio_signal_test_SOURCES = ags/test/audio/recall/ags_analyse_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_channel_test_SOURCES = ags/test/audio/recall/ags_analyse_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_analyse_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_audio_signal_test_SOURCES = ags/test/audio/recall/ags_buffer_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_channel_test_SOURCES = ags/test/audio/recall/ags_buffer_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_buffer_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_audio_test_SOURCES = ags/test/audio/recall/ags_capture_wave_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_channel_test_SOURCES = ags/test/audio/recall/ags_capture_wave_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_capture_wave_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_audio_signal_test_SOURCES = ags/test/audio/recall/ags_copy_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_channel_test_SOURCES = ags/test/audio/recall/ags_copy_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio pattern unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_audio_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel pattern unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_channel_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_copy_pattern_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # count beats audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_count_beats_audio_test_SOURCES = ags/test/audio/recall/ags_count_beats_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_count_beats_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_count_beats_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_count_beats_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_count_beats_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # delay audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_delay_audio_test_SOURCES = ags/test/audio/recall/ags_delay_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_delay_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_delay_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_delay_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_delay_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_audio_signal_test_SOURCES = ags/test/audio/recall/ags_envelope_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_channel_test_SOURCES = ags/test/audio/recall/ags_envelope_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_envelope_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_audio_signal_test_SOURCES = ags/test/audio/recall/ags_eq10_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_channel_test_SOURCES = ags/test/audio/recall/ags_eq10_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_eq10_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # feed audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_feed_audio_signal_test_SOURCES = ags/test/audio/recall/ags_feed_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_feed_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_feed_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_feed_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_feed_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_test_SOURCES = ags/test/audio/recall/ags_mute_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_signal_test_SOURCES = ags/test/audio/recall/ags_mute_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_channel_test_SOURCES = ags/test/audio/recall/ags_mute_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_mute_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_audio_signal_test_SOURCES = ags/test/audio/recall/ags_peak_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_channel_test_SOURCES = ags/test/audio/recall/ags_peak_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_peak_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_test_SOURCES = ags/test/audio/recall/ags_play_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_signal_test_SOURCES = ags/test/audio/recall/ags_play_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_channel_test_SOURCES = ags/test/audio/recall/ags_play_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_audio_test_SOURCES = ags/test/audio/recall/ags_play_wave_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_channel_test_SOURCES = ags/test/audio/recall/ags_play_wave_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_channel__test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_play_wave_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # prepare audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_prepare_audio_signal_test_SOURCES = ags/test/audio/recall/ags_prepare_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_prepare_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_prepare_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_prepare_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_prepare_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # record midi audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_record_midi_audio_test_SOURCES = ags/test/audio/recall/ags_record_midi_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_record_midi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_record_midi_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_record_midi_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_record_midi_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route dssi audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_dssi_audio_test_SOURCES = ags/test/audio/recall/ags_route_dssi_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_dssi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_dssi_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_dssi_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_dssi_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route lv2 audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_lv2_audio_test_SOURCES = ags/test/audio/recall/ags_route_lv2_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_lv2_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_lv2_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_lv2_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_route_lv2_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # stream audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_stream_audio_signal_test_SOURCES = ags/test/audio/recall/ags_stream_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_stream_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_stream_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_stream_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_stream_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_audio_signal_test_SOURCES = ags/test/audio/recall/ags_volume_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_channel_test_SOURCES = ags/test/audio/recall/ags_volume_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_volume_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_test_SOURCES = ags/test/audio/task/ags_add_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_signal_test_SOURCES = ags/test/audio/task/ags_add_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add effect unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_effect_test_SOURCES = ags/test/audio/task/ags_add_effect_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_effect_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_effect_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_effect_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_effect_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add note unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_note_test_SOURCES = ags/test/audio/task/ags_add_note_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_note_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_note_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add soundcard unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_soundcard_test_SOURCES = ags/test/audio/task/ags_add_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_soundcard_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_add_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply bpm unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_bpm_test_SOURCES = ags/test/audio/task/ags_apply_bpm_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_bpm_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_bpm_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_bpm_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_bpm_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply presets unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_presets_test_SOURCES = ags/test/audio/task/ags_apply_presets_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_presets_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_presets_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_presets_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_presets_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply sequencer length unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_sequencer_length_test_SOURCES = ags/test/audio/task/ags_apply_sequencer_length_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_sequencer_length_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_sequencer_length_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_sequencer_length_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_sequencer_length_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply synth unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_synth_test_SOURCES = ags/test/audio/task/ags_apply_synth_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_synth_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_synth_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_synth_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply tact unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_tact_test_SOURCES = ags/test/audio/task/ags_apply_tact_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_tact_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_tact_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_tact_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_apply_tact_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_audio_test_SOURCES = ags/test/audio/task/ags_cancel_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_channel_test_SOURCES = ags/test/audio/task/ags_cancel_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_cancel_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_audio_signal_test_SOURCES = ags/test/audio/task/ags_clear_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear buffer unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_buffer_test_SOURCES = ags/test/audio/task/ags_clear_buffer_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_buffer_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_buffer_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_clear_buffer_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # crop note unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_crop_note_test_SOURCES = ags/test/audio/task/ags_crop_note_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_crop_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_crop_note_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_crop_note_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_crop_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # export output unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_export_output_test_SOURCES = ags/test/audio/task/ags_export_output_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_export_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_export_output_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_export_output_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_export_output_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # free selection unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_free_selection_test_SOURCES = ags/test/audio/task/ags_free_selection_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_free_selection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_free_selection_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_free_selection_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_free_selection_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # link channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_link_channel_test_SOURCES = ags/test/audio/task/ags_link_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_link_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_link_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_link_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_link_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # move note unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_move_note_test_SOURCES = ags/test/audio/task/ags_move_note_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_move_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_move_note_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_move_note_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_move_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_test_SOURCES = ags/test/audio/task/ags_remove_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio signal unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_signal_test_SOURCES = ags/test/audio/task/ags_remove_audio_signal_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove note unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_note_test_SOURCES = ags/test/audio/task/ags_remove_note_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_note_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_note_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove soundcard unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_soundcard_test_SOURCES = ags/test/audio/task/ags_remove_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_soundcard_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_remove_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset amplitude unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_amplitude_test_SOURCES = ags/test/audio/task/ags_reset_amplitude_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_amplitude_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_amplitude_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_amplitude_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_amplitude_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset peak unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_peak_test_SOURCES = ags/test/audio/task/ags_reset_peak_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_peak_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_peak_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_peak_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_reset_peak_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # resize audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_resize_audio_test_SOURCES = ags/test/audio/task/ags_resize_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_resize_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_resize_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_resize_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_resize_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # seek soundcard unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_seek_soundcard_test_SOURCES = ags/test/audio/task/ags_seek_soundcard_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_seek_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_seek_soundcard_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_seek_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_seek_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set audio channels unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_audio_channels_test_SOURCES = ags/test/audio/task/ags_set_audio_channels_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_audio_channels_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_audio_channels_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_audio_channels_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_audio_channels_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set buffer size unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_buffer_size_test_SOURCES = ags/test/audio/task/ags_set_buffer_size_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_buffer_size_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_buffer_size_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_buffer_size_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_buffer_size_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set device unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_device_test_SOURCES = ags/test/audio/task/ags_set_device_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_device_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_device_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_device_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_device_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set format unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_format_test_SOURCES = ags/test/audio/task/ags_set_format_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_format_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_format_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_format_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_format_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set muted unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_muted_test_SOURCES = ags/test/audio/task/ags_set_muted_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_muted_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_muted_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_muted_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_muted_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set samplerate unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_samplerate_test_SOURCES = ags/test/audio/task/ags_set_samplerate_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_samplerate_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_samplerate_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_samplerate_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_set_samplerate_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start audio unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_audio_test_SOURCES = ags/test/audio/task/ags_start_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start channel unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_channel_test_SOURCES = ags/test/audio/task/ags_start_channel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_channel_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_channel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_start_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # xorg application context unit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xorg_application_context_test_SOURCES = ags/test/X/ags_xorg_application_context_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xorg_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xorg_application_context_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xorg_application_context_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_xorg_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj am--refresh: unit-system-tests.mk @: $(srcdir)/unit-system-tests.mk.in: $(srcdir)/unit-system-tests.mk.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign unit-system-tests.mk'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign unit-system-tests.mk unit-system-tests.mk: $(srcdir)/unit-system-tests.mk.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): ags/config.h: ags/stamp-h1 @test -f $@ || rm -f ags/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h1 ags/stamp-h1: $(top_srcdir)/ags/config.h.in $(top_builddir)/config.status @rm -f ags/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status ags/config.h $(top_srcdir)/ags/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f ags/stamp-h1 touch $@ ags/ags_config.h: ags/stamp-h2 @test -f $@ || rm -f ags/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h2 ags/stamp-h2: $(top_srcdir)/ags/ags_config.h.in $(top_builddir)/config.status @rm -f ags/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status ags/ags_config.h distclean-hdr: -rm -f ags/config.h ags/stamp-h1 ags/ags_config.h ags/stamp-h2 libags.pc: $(top_builddir)/config.status $(srcdir)/libags.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libags_audio.pc: $(top_builddir)/config.status $(srcdir)/libags_audio.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libags_gui.pc: $(top_builddir)/config.status $(srcdir)/libags_gui.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libgsequencer.pc: $(top_builddir)/config.status $(srcdir)/libgsequencer.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ags/test/audio/$(am__dirstamp): @$(MKDIR_P) ags/test/audio @: > ags/test/audio/$(am__dirstamp) ags/test/audio/check_system_acceleration_test-ags_acceleration_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_acceleration_test$(EXEEXT): $(ags_check_system_acceleration_test_OBJECTS) $(ags_check_system_acceleration_test_DEPENDENCIES) $(EXTRA_ags_check_system_acceleration_test_DEPENDENCIES) @rm -f ags_check_system_acceleration_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_acceleration_test_LINK) $(ags_check_system_acceleration_test_OBJECTS) $(ags_check_system_acceleration_test_LDADD) $(LIBS) ags/test/audio/task/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/task @: > ags/test/audio/task/$(am__dirstamp) ags/test/audio/task/check_system_add_audio_signal_test-ags_add_audio_signal_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_add_audio_signal_test$(EXEEXT): $(ags_check_system_add_audio_signal_test_OBJECTS) $(ags_check_system_add_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_add_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_add_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_add_audio_signal_test_LINK) $(ags_check_system_add_audio_signal_test_OBJECTS) $(ags_check_system_add_audio_signal_test_LDADD) $(LIBS) ags/test/audio/task/check_system_add_audio_test-ags_add_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_add_audio_test$(EXEEXT): $(ags_check_system_add_audio_test_OBJECTS) $(ags_check_system_add_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_add_audio_test_DEPENDENCIES) @rm -f ags_check_system_add_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_add_audio_test_LINK) $(ags_check_system_add_audio_test_OBJECTS) $(ags_check_system_add_audio_test_LDADD) $(LIBS) ags/test/audio/task/check_system_add_effect_test-ags_add_effect_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_add_effect_test$(EXEEXT): $(ags_check_system_add_effect_test_OBJECTS) $(ags_check_system_add_effect_test_DEPENDENCIES) $(EXTRA_ags_check_system_add_effect_test_DEPENDENCIES) @rm -f ags_check_system_add_effect_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_add_effect_test_LINK) $(ags_check_system_add_effect_test_OBJECTS) $(ags_check_system_add_effect_test_LDADD) $(LIBS) ags/test/audio/task/check_system_add_note_test-ags_add_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_add_note_test$(EXEEXT): $(ags_check_system_add_note_test_OBJECTS) $(ags_check_system_add_note_test_DEPENDENCIES) $(EXTRA_ags_check_system_add_note_test_DEPENDENCIES) @rm -f ags_check_system_add_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_add_note_test_LINK) $(ags_check_system_add_note_test_OBJECTS) $(ags_check_system_add_note_test_LDADD) $(LIBS) ags/test/audio/task/check_system_add_soundcard_test-ags_add_soundcard_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_add_soundcard_test$(EXEEXT): $(ags_check_system_add_soundcard_test_OBJECTS) $(ags_check_system_add_soundcard_test_DEPENDENCIES) $(EXTRA_ags_check_system_add_soundcard_test_DEPENDENCIES) @rm -f ags_check_system_add_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_add_soundcard_test_LINK) $(ags_check_system_add_soundcard_test_OBJECTS) $(ags_check_system_add_soundcard_test_LDADD) $(LIBS) ags/test/audio/recall/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/recall @: > ags/test/audio/recall/$(am__dirstamp) ags/test/audio/recall/check_system_analyse_audio_signal_test-ags_analyse_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_analyse_audio_signal_test$(EXEEXT): $(ags_check_system_analyse_audio_signal_test_OBJECTS) $(ags_check_system_analyse_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_analyse_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_analyse_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_analyse_audio_signal_test_LINK) $(ags_check_system_analyse_audio_signal_test_OBJECTS) $(ags_check_system_analyse_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_analyse_channel_test-ags_analyse_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_analyse_channel_test$(EXEEXT): $(ags_check_system_analyse_channel_test_OBJECTS) $(ags_check_system_analyse_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_analyse_channel_test_DEPENDENCIES) @rm -f ags_check_system_analyse_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_analyse_channel_test_LINK) $(ags_check_system_analyse_channel_test_OBJECTS) $(ags_check_system_analyse_channel_test_LDADD) $(LIBS) ags/test/object/$(am__dirstamp): @$(MKDIR_P) ags/test/object @: > ags/test/object/$(am__dirstamp) ags/test/object/check_system_application_context_test-ags_application_context_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) ags_check_system_application_context_test$(EXEEXT): $(ags_check_system_application_context_test_OBJECTS) $(ags_check_system_application_context_test_DEPENDENCIES) $(EXTRA_ags_check_system_application_context_test_DEPENDENCIES) @rm -f ags_check_system_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_application_context_test_LINK) $(ags_check_system_application_context_test_OBJECTS) $(ags_check_system_application_context_test_LDADD) $(LIBS) ags/test/audio/task/check_system_apply_bpm_test-ags_apply_bpm_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_apply_bpm_test$(EXEEXT): $(ags_check_system_apply_bpm_test_OBJECTS) $(ags_check_system_apply_bpm_test_DEPENDENCIES) $(EXTRA_ags_check_system_apply_bpm_test_DEPENDENCIES) @rm -f ags_check_system_apply_bpm_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_apply_bpm_test_LINK) $(ags_check_system_apply_bpm_test_OBJECTS) $(ags_check_system_apply_bpm_test_LDADD) $(LIBS) ags/test/audio/task/check_system_apply_presets_test-ags_apply_presets_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_apply_presets_test$(EXEEXT): $(ags_check_system_apply_presets_test_OBJECTS) $(ags_check_system_apply_presets_test_DEPENDENCIES) $(EXTRA_ags_check_system_apply_presets_test_DEPENDENCIES) @rm -f ags_check_system_apply_presets_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_apply_presets_test_LINK) $(ags_check_system_apply_presets_test_OBJECTS) $(ags_check_system_apply_presets_test_LDADD) $(LIBS) ags/test/audio/task/check_system_apply_sequencer_length_test-ags_apply_sequencer_length_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_apply_sequencer_length_test$(EXEEXT): $(ags_check_system_apply_sequencer_length_test_OBJECTS) $(ags_check_system_apply_sequencer_length_test_DEPENDENCIES) $(EXTRA_ags_check_system_apply_sequencer_length_test_DEPENDENCIES) @rm -f ags_check_system_apply_sequencer_length_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_apply_sequencer_length_test_LINK) $(ags_check_system_apply_sequencer_length_test_OBJECTS) $(ags_check_system_apply_sequencer_length_test_LDADD) $(LIBS) ags/test/audio/task/check_system_apply_synth_test-ags_apply_synth_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_apply_synth_test$(EXEEXT): $(ags_check_system_apply_synth_test_OBJECTS) $(ags_check_system_apply_synth_test_DEPENDENCIES) $(EXTRA_ags_check_system_apply_synth_test_DEPENDENCIES) @rm -f ags_check_system_apply_synth_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_apply_synth_test_LINK) $(ags_check_system_apply_synth_test_OBJECTS) $(ags_check_system_apply_synth_test_LDADD) $(LIBS) ags/test/audio/task/check_system_apply_tact_test-ags_apply_tact_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_apply_tact_test$(EXEEXT): $(ags_check_system_apply_tact_test_OBJECTS) $(ags_check_system_apply_tact_test_DEPENDENCIES) $(EXTRA_ags_check_system_apply_tact_test_DEPENDENCIES) @rm -f ags_check_system_apply_tact_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_apply_tact_test_LINK) $(ags_check_system_apply_tact_test_OBJECTS) $(ags_check_system_apply_tact_test_LDADD) $(LIBS) ags/test/audio/check_system_audio_application_context_test-ags_audio_application_context_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_audio_application_context_test$(EXEEXT): $(ags_check_system_audio_application_context_test_OBJECTS) $(ags_check_system_audio_application_context_test_DEPENDENCIES) $(EXTRA_ags_check_system_audio_application_context_test_DEPENDENCIES) @rm -f ags_check_system_audio_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_audio_application_context_test_LINK) $(ags_check_system_audio_application_context_test_OBJECTS) $(ags_check_system_audio_application_context_test_LDADD) $(LIBS) ags/test/audio/check_system_audio_buffer_util_test-ags_audio_buffer_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_audio_buffer_util_test$(EXEEXT): $(ags_check_system_audio_buffer_util_test_OBJECTS) $(ags_check_system_audio_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_audio_buffer_util_test_DEPENDENCIES) @rm -f ags_check_system_audio_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_audio_buffer_util_test_LINK) $(ags_check_system_audio_buffer_util_test_OBJECTS) $(ags_check_system_audio_buffer_util_test_LDADD) $(LIBS) ags/test/audio/check_system_audio_signal_test-ags_audio_signal_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_audio_signal_test$(EXEEXT): $(ags_check_system_audio_signal_test_OBJECTS) $(ags_check_system_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_audio_signal_test_LINK) $(ags_check_system_audio_signal_test_OBJECTS) $(ags_check_system_audio_signal_test_LDADD) $(LIBS) ags/test/audio/check_system_audio_test-ags_audio_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_audio_test$(EXEEXT): $(ags_check_system_audio_test_OBJECTS) $(ags_check_system_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_audio_test_DEPENDENCIES) @rm -f ags_check_system_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_audio_test_LINK) $(ags_check_system_audio_test_OBJECTS) $(ags_check_system_audio_test_LDADD) $(LIBS) ags/test/server/security/$(am__dirstamp): @$(MKDIR_P) ags/test/server/security @: > ags/test/server/security/$(am__dirstamp) ags/test/server/security/check_system_authentication_manager_test-ags_authentication_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_authentication_manager_test$(EXEEXT): $(ags_check_system_authentication_manager_test_OBJECTS) $(ags_check_system_authentication_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_authentication_manager_test_DEPENDENCIES) @rm -f ags_check_system_authentication_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_authentication_manager_test_LINK) $(ags_check_system_authentication_manager_test_OBJECTS) $(ags_check_system_authentication_manager_test_LDADD) $(LIBS) ags/test/audio/check_system_automation_test-ags_automation_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_automation_test$(EXEEXT): $(ags_check_system_automation_test_OBJECTS) $(ags_check_system_automation_test_DEPENDENCIES) $(EXTRA_ags_check_system_automation_test_DEPENDENCIES) @rm -f ags_check_system_automation_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_automation_test_LINK) $(ags_check_system_automation_test_OBJECTS) $(ags_check_system_automation_test_LDADD) $(LIBS) ags/test/plugin/$(am__dirstamp): @$(MKDIR_P) ags/test/plugin @: > ags/test/plugin/$(am__dirstamp) ags/test/plugin/check_system_base_plugin_test-ags_base_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_base_plugin_test$(EXEEXT): $(ags_check_system_base_plugin_test_OBJECTS) $(ags_check_system_base_plugin_test_DEPENDENCIES) $(EXTRA_ags_check_system_base_plugin_test_DEPENDENCIES) @rm -f ags_check_system_base_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_base_plugin_test_LINK) $(ags_check_system_base_plugin_test_OBJECTS) $(ags_check_system_base_plugin_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_buffer_audio_signal_test-ags_buffer_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_buffer_audio_signal_test$(EXEEXT): $(ags_check_system_buffer_audio_signal_test_OBJECTS) $(ags_check_system_buffer_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_buffer_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_buffer_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_buffer_audio_signal_test_LINK) $(ags_check_system_buffer_audio_signal_test_OBJECTS) $(ags_check_system_buffer_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_buffer_channel_test-ags_buffer_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_buffer_channel_test$(EXEEXT): $(ags_check_system_buffer_channel_test_OBJECTS) $(ags_check_system_buffer_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_buffer_channel_test_DEPENDENCIES) @rm -f ags_check_system_buffer_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_buffer_channel_test_LINK) $(ags_check_system_buffer_channel_test_OBJECTS) $(ags_check_system_buffer_channel_test_LDADD) $(LIBS) ags/test/audio/check_system_buffer_test-ags_buffer_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_buffer_test$(EXEEXT): $(ags_check_system_buffer_test_OBJECTS) $(ags_check_system_buffer_test_DEPENDENCIES) $(EXTRA_ags_check_system_buffer_test_DEPENDENCIES) @rm -f ags_check_system_buffer_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_buffer_test_LINK) $(ags_check_system_buffer_test_OBJECTS) $(ags_check_system_buffer_test_LDADD) $(LIBS) ags/test/lib/$(am__dirstamp): @$(MKDIR_P) ags/test/lib @: > ags/test/lib/$(am__dirstamp) ags/test/lib/check_system_buffer_util_test-ags_buffer_util_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_buffer_util_test$(EXEEXT): $(ags_check_system_buffer_util_test_OBJECTS) $(ags_check_system_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_buffer_util_test_DEPENDENCIES) @rm -f ags_check_system_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_buffer_util_test_LINK) $(ags_check_system_buffer_util_test_OBJECTS) $(ags_check_system_buffer_util_test_LDADD) $(LIBS) ags/test/server/security/check_system_business_group_manager_test-ags_business_group_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_business_group_manager_test$(EXEEXT): $(ags_check_system_business_group_manager_test_OBJECTS) $(ags_check_system_business_group_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_business_group_manager_test_DEPENDENCIES) @rm -f ags_check_system_business_group_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_business_group_manager_test_LINK) $(ags_check_system_business_group_manager_test_OBJECTS) $(ags_check_system_business_group_manager_test_LDADD) $(LIBS) ags/test/audio/task/check_system_cancel_audio_test-ags_cancel_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_cancel_audio_test$(EXEEXT): $(ags_check_system_cancel_audio_test_OBJECTS) $(ags_check_system_cancel_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_cancel_audio_test_DEPENDENCIES) @rm -f ags_check_system_cancel_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_cancel_audio_test_LINK) $(ags_check_system_cancel_audio_test_OBJECTS) $(ags_check_system_cancel_audio_test_LDADD) $(LIBS) ags/test/audio/task/check_system_cancel_channel_test-ags_cancel_channel_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_cancel_channel_test$(EXEEXT): $(ags_check_system_cancel_channel_test_OBJECTS) $(ags_check_system_cancel_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_cancel_channel_test_DEPENDENCIES) @rm -f ags_check_system_cancel_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_cancel_channel_test_LINK) $(ags_check_system_cancel_channel_test_OBJECTS) $(ags_check_system_cancel_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_capture_wave_audio_test-ags_capture_wave_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_capture_wave_audio_test$(EXEEXT): $(ags_check_system_capture_wave_audio_test_OBJECTS) $(ags_check_system_capture_wave_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_capture_wave_audio_test_DEPENDENCIES) @rm -f ags_check_system_capture_wave_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_capture_wave_audio_test_LINK) $(ags_check_system_capture_wave_audio_test_OBJECTS) $(ags_check_system_capture_wave_audio_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_capture_wave_channel_test-ags_capture_wave_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_capture_wave_channel_test$(EXEEXT): $(ags_check_system_capture_wave_channel_test_OBJECTS) $(ags_check_system_capture_wave_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_capture_wave_channel_test_DEPENDENCIES) @rm -f ags_check_system_capture_wave_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_capture_wave_channel_test_LINK) $(ags_check_system_capture_wave_channel_test_OBJECTS) $(ags_check_system_capture_wave_channel_test_LDADD) $(LIBS) ags/test/server/security/check_system_certificate_manager_test-ags_certificate_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_certificate_manager_test$(EXEEXT): $(ags_check_system_certificate_manager_test_OBJECTS) $(ags_check_system_certificate_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_certificate_manager_test_DEPENDENCIES) @rm -f ags_check_system_certificate_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_certificate_manager_test_LINK) $(ags_check_system_certificate_manager_test_OBJECTS) $(ags_check_system_certificate_manager_test_LDADD) $(LIBS) ags/test/audio/check_system_channel_test-ags_channel_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_channel_test$(EXEEXT): $(ags_check_system_channel_test_OBJECTS) $(ags_check_system_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_channel_test_DEPENDENCIES) @rm -f ags_check_system_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_channel_test_LINK) $(ags_check_system_channel_test_OBJECTS) $(ags_check_system_channel_test_LDADD) $(LIBS) ags/test/audio/check_system_char_buffer_util_test-ags_char_buffer_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_char_buffer_util_test$(EXEEXT): $(ags_check_system_char_buffer_util_test_OBJECTS) $(ags_check_system_char_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_char_buffer_util_test_DEPENDENCIES) @rm -f ags_check_system_char_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_char_buffer_util_test_LINK) $(ags_check_system_char_buffer_util_test_OBJECTS) $(ags_check_system_char_buffer_util_test_LDADD) $(LIBS) ags/test/audio/task/check_system_clear_audio_signal_test-ags_clear_audio_signal_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_clear_audio_signal_test$(EXEEXT): $(ags_check_system_clear_audio_signal_test_OBJECTS) $(ags_check_system_clear_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_clear_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_clear_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_clear_audio_signal_test_LINK) $(ags_check_system_clear_audio_signal_test_OBJECTS) $(ags_check_system_clear_audio_signal_test_LDADD) $(LIBS) ags/test/audio/task/check_system_clear_buffer_test-ags_clear_buffer_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_clear_buffer_test$(EXEEXT): $(ags_check_system_clear_buffer_test_OBJECTS) $(ags_check_system_clear_buffer_test_DEPENDENCIES) $(EXTRA_ags_check_system_clear_buffer_test_DEPENDENCIES) @rm -f ags_check_system_clear_buffer_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_clear_buffer_test_LINK) $(ags_check_system_clear_buffer_test_OBJECTS) $(ags_check_system_clear_buffer_test_LDADD) $(LIBS) ags/test/lib/check_system_complex_test-ags_complex_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_complex_test$(EXEEXT): $(ags_check_system_complex_test_OBJECTS) $(ags_check_system_complex_test_DEPENDENCIES) $(EXTRA_ags_check_system_complex_test_DEPENDENCIES) @rm -f ags_check_system_complex_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_complex_test_LINK) $(ags_check_system_complex_test_OBJECTS) $(ags_check_system_complex_test_LDADD) $(LIBS) ags/test/object/check_system_config_test-ags_config_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) ags_check_system_config_test$(EXEEXT): $(ags_check_system_config_test_OBJECTS) $(ags_check_system_config_test_DEPENDENCIES) $(EXTRA_ags_check_system_config_test_DEPENDENCIES) @rm -f ags_check_system_config_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_config_test_LINK) $(ags_check_system_config_test_OBJECTS) $(ags_check_system_config_test_LDADD) $(LIBS) ags/test/object/check_system_connectable_test-ags_connectable_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) ags_check_system_connectable_test$(EXEEXT): $(ags_check_system_connectable_test_OBJECTS) $(ags_check_system_connectable_test_DEPENDENCIES) $(EXTRA_ags_check_system_connectable_test_DEPENDENCIES) @rm -f ags_check_system_connectable_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_connectable_test_LINK) $(ags_check_system_connectable_test_OBJECTS) $(ags_check_system_connectable_test_LDADD) $(LIBS) ags/test/server/controller/$(am__dirstamp): @$(MKDIR_P) ags/test/server/controller @: > ags/test/server/controller/$(am__dirstamp) ags/test/server/controller/check_system_controller_test-ags_controller_test.$(OBJEXT): \ ags/test/server/controller/$(am__dirstamp) ags_check_system_controller_test$(EXEEXT): $(ags_check_system_controller_test_OBJECTS) $(ags_check_system_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_controller_test_DEPENDENCIES) @rm -f ags_check_system_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_controller_test_LINK) $(ags_check_system_controller_test_OBJECTS) $(ags_check_system_controller_test_LDADD) $(LIBS) ags/test/lib/check_system_conversion_test-ags_conversion_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_conversion_test$(EXEEXT): $(ags_check_system_conversion_test_OBJECTS) $(ags_check_system_conversion_test_DEPENDENCIES) $(EXTRA_ags_check_system_conversion_test_DEPENDENCIES) @rm -f ags_check_system_conversion_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_conversion_test_LINK) $(ags_check_system_conversion_test_OBJECTS) $(ags_check_system_conversion_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_copy_audio_signal_test-ags_copy_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_copy_audio_signal_test$(EXEEXT): $(ags_check_system_copy_audio_signal_test_OBJECTS) $(ags_check_system_copy_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_copy_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_copy_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_copy_audio_signal_test_LINK) $(ags_check_system_copy_audio_signal_test_OBJECTS) $(ags_check_system_copy_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_copy_channel_test-ags_copy_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_copy_channel_test$(EXEEXT): $(ags_check_system_copy_channel_test_OBJECTS) $(ags_check_system_copy_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_copy_channel_test_DEPENDENCIES) @rm -f ags_check_system_copy_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_copy_channel_test_LINK) $(ags_check_system_copy_channel_test_OBJECTS) $(ags_check_system_copy_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_copy_pattern_audio_test-ags_copy_pattern_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_copy_pattern_audio_test$(EXEEXT): $(ags_check_system_copy_pattern_audio_test_OBJECTS) $(ags_check_system_copy_pattern_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_copy_pattern_audio_test_DEPENDENCIES) @rm -f ags_check_system_copy_pattern_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_copy_pattern_audio_test_LINK) $(ags_check_system_copy_pattern_audio_test_OBJECTS) $(ags_check_system_copy_pattern_audio_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_copy_pattern_channel_test-ags_copy_pattern_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_copy_pattern_channel_test$(EXEEXT): $(ags_check_system_copy_pattern_channel_test_OBJECTS) $(ags_check_system_copy_pattern_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_copy_pattern_channel_test_DEPENDENCIES) @rm -f ags_check_system_copy_pattern_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_copy_pattern_channel_test_LINK) $(ags_check_system_copy_pattern_channel_test_OBJECTS) $(ags_check_system_copy_pattern_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_count_beats_audio_test-ags_count_beats_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_count_beats_audio_test$(EXEEXT): $(ags_check_system_count_beats_audio_test_OBJECTS) $(ags_check_system_count_beats_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_count_beats_audio_test_DEPENDENCIES) @rm -f ags_check_system_count_beats_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_count_beats_audio_test_LINK) $(ags_check_system_count_beats_audio_test_OBJECTS) $(ags_check_system_count_beats_audio_test_LDADD) $(LIBS) ags/test/audio/task/check_system_crop_note_test-ags_crop_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_crop_note_test$(EXEEXT): $(ags_check_system_crop_note_test_OBJECTS) $(ags_check_system_crop_note_test_DEPENDENCIES) $(EXTRA_ags_check_system_crop_note_test_DEPENDENCIES) @rm -f ags_check_system_crop_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_crop_note_test_LINK) $(ags_check_system_crop_note_test_OBJECTS) $(ags_check_system_crop_note_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_delay_audio_test-ags_delay_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_delay_audio_test$(EXEEXT): $(ags_check_system_delay_audio_test_OBJECTS) $(ags_check_system_delay_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_delay_audio_test_DEPENDENCIES) @rm -f ags_check_system_delay_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_delay_audio_test_LINK) $(ags_check_system_delay_audio_test_OBJECTS) $(ags_check_system_delay_audio_test_LDADD) $(LIBS) ags/test/thread/$(am__dirstamp): @$(MKDIR_P) ags/test/thread @: > ags/test/thread/$(am__dirstamp) ags/test/thread/check_system_destroy_worker_test-ags_destroy_worker_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) ags_check_system_destroy_worker_test$(EXEEXT): $(ags_check_system_destroy_worker_test_OBJECTS) $(ags_check_system_destroy_worker_test_DEPENDENCIES) $(EXTRA_ags_check_system_destroy_worker_test_DEPENDENCIES) @rm -f ags_check_system_destroy_worker_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_destroy_worker_test_LINK) $(ags_check_system_destroy_worker_test_OBJECTS) $(ags_check_system_destroy_worker_test_LDADD) $(LIBS) ags/test/audio/check_system_devin_test-ags_devin_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_devin_test$(EXEEXT): $(ags_check_system_devin_test_OBJECTS) $(ags_check_system_devin_test_DEPENDENCIES) $(EXTRA_ags_check_system_devin_test_DEPENDENCIES) @rm -f ags_check_system_devin_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_devin_test_LINK) $(ags_check_system_devin_test_OBJECTS) $(ags_check_system_devin_test_LDADD) $(LIBS) ags/test/audio/check_system_devout_test-ags_devout_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_devout_test$(EXEEXT): $(ags_check_system_devout_test_OBJECTS) $(ags_check_system_devout_test_DEPENDENCIES) $(EXTRA_ags_check_system_devout_test_DEPENDENCIES) @rm -f ags_check_system_devout_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_devout_test_LINK) $(ags_check_system_devout_test_OBJECTS) $(ags_check_system_devout_test_LDADD) $(LIBS) ags/test/plugin/check_system_dssi_manager_test-ags_dssi_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_dssi_manager_test$(EXEEXT): $(ags_check_system_dssi_manager_test_OBJECTS) $(ags_check_system_dssi_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_dssi_manager_test_DEPENDENCIES) @rm -f ags_check_system_dssi_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_dssi_manager_test_LINK) $(ags_check_system_dssi_manager_test_OBJECTS) $(ags_check_system_dssi_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_dssi_plugin_test-ags_dssi_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_dssi_plugin_test$(EXEEXT): $(ags_check_system_dssi_plugin_test_OBJECTS) $(ags_check_system_dssi_plugin_test_DEPENDENCIES) $(EXTRA_ags_check_system_dssi_plugin_test_DEPENDENCIES) @rm -f ags_check_system_dssi_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_dssi_plugin_test_LINK) $(ags_check_system_dssi_plugin_test_OBJECTS) $(ags_check_system_dssi_plugin_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_envelope_audio_signal_test-ags_envelope_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_envelope_audio_signal_test$(EXEEXT): $(ags_check_system_envelope_audio_signal_test_OBJECTS) $(ags_check_system_envelope_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_envelope_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_envelope_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_envelope_audio_signal_test_LINK) $(ags_check_system_envelope_audio_signal_test_OBJECTS) $(ags_check_system_envelope_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_envelope_channel_test-ags_envelope_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_envelope_channel_test$(EXEEXT): $(ags_check_system_envelope_channel_test_OBJECTS) $(ags_check_system_envelope_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_envelope_channel_test_DEPENDENCIES) @rm -f ags_check_system_envelope_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_envelope_channel_test_LINK) $(ags_check_system_envelope_channel_test_OBJECTS) $(ags_check_system_envelope_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_eq10_audio_signal_test-ags_eq10_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_eq10_audio_signal_test$(EXEEXT): $(ags_check_system_eq10_audio_signal_test_OBJECTS) $(ags_check_system_eq10_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_eq10_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_eq10_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_eq10_audio_signal_test_LINK) $(ags_check_system_eq10_audio_signal_test_OBJECTS) $(ags_check_system_eq10_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_eq10_channel_test-ags_eq10_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_eq10_channel_test$(EXEEXT): $(ags_check_system_eq10_channel_test_OBJECTS) $(ags_check_system_eq10_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_eq10_channel_test_DEPENDENCIES) @rm -f ags_check_system_eq10_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_eq10_channel_test_LINK) $(ags_check_system_eq10_channel_test_OBJECTS) $(ags_check_system_eq10_channel_test_LDADD) $(LIBS) ags/test/audio/task/check_system_export_output_test-ags_export_output_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_export_output_test$(EXEEXT): $(ags_check_system_export_output_test_OBJECTS) $(ags_check_system_export_output_test_DEPENDENCIES) $(EXTRA_ags_check_system_export_output_test_DEPENDENCIES) @rm -f ags_check_system_export_output_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_export_output_test_LINK) $(ags_check_system_export_output_test_OBJECTS) $(ags_check_system_export_output_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_feed_audio_signal_test-ags_feed_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_feed_audio_signal_test$(EXEEXT): $(ags_check_system_feed_audio_signal_test_OBJECTS) $(ags_check_system_feed_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_feed_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_feed_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_feed_audio_signal_test_LINK) $(ags_check_system_feed_audio_signal_test_OBJECTS) $(ags_check_system_feed_audio_signal_test_LDADD) $(LIBS) ags/test/audio/check_system_fifoout_test-ags_fifoout_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_fifoout_test$(EXEEXT): $(ags_check_system_fifoout_test_OBJECTS) $(ags_check_system_fifoout_test_DEPENDENCIES) $(EXTRA_ags_check_system_fifoout_test_DEPENDENCIES) @rm -f ags_check_system_fifoout_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_fifoout_test_LINK) $(ags_check_system_fifoout_test_OBJECTS) $(ags_check_system_fifoout_test_LDADD) $(LIBS) ags/test/file/$(am__dirstamp): @$(MKDIR_P) ags/test/file @: > ags/test/file/$(am__dirstamp) ags/test/file/check_system_file_id_ref_test-ags_file_id_ref_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) ags_check_system_file_id_ref_test$(EXEEXT): $(ags_check_system_file_id_ref_test_OBJECTS) $(ags_check_system_file_id_ref_test_DEPENDENCIES) $(EXTRA_ags_check_system_file_id_ref_test_DEPENDENCIES) @rm -f ags_check_system_file_id_ref_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_file_id_ref_test_LINK) $(ags_check_system_file_id_ref_test_OBJECTS) $(ags_check_system_file_id_ref_test_LDADD) $(LIBS) ags/test/file/check_system_file_launch_test-ags_file_launch_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) ags_check_system_file_launch_test$(EXEEXT): $(ags_check_system_file_launch_test_OBJECTS) $(ags_check_system_file_launch_test_DEPENDENCIES) $(EXTRA_ags_check_system_file_launch_test_DEPENDENCIES) @rm -f ags_check_system_file_launch_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_file_launch_test_LINK) $(ags_check_system_file_launch_test_OBJECTS) $(ags_check_system_file_launch_test_LDADD) $(LIBS) ags/test/file/check_system_file_lookup_test-ags_file_lookup_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) ags_check_system_file_lookup_test$(EXEEXT): $(ags_check_system_file_lookup_test_OBJECTS) $(ags_check_system_file_lookup_test_DEPENDENCIES) $(EXTRA_ags_check_system_file_lookup_test_DEPENDENCIES) @rm -f ags_check_system_file_lookup_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_file_lookup_test_LINK) $(ags_check_system_file_lookup_test_OBJECTS) $(ags_check_system_file_lookup_test_LDADD) $(LIBS) ags/test/file/check_system_file_test-ags_file_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) ags_check_system_file_test$(EXEEXT): $(ags_check_system_file_test_OBJECTS) $(ags_check_system_file_test_DEPENDENCIES) $(EXTRA_ags_check_system_file_test_DEPENDENCIES) @rm -f ags_check_system_file_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_file_test_LINK) $(ags_check_system_file_test_OBJECTS) $(ags_check_system_file_test_LDADD) $(LIBS) ags/test/audio/check_system_filter_util_test-ags_filter_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_filter_util_test$(EXEEXT): $(ags_check_system_filter_util_test_OBJECTS) $(ags_check_system_filter_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_filter_util_test_DEPENDENCIES) @rm -f ags_check_system_filter_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_filter_util_test_LINK) $(ags_check_system_filter_util_test_OBJECTS) $(ags_check_system_filter_util_test_LDADD) $(LIBS) ags/test/audio/check_system_fm_synth_util_test-ags_fm_synth_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_fm_synth_util_test$(EXEEXT): $(ags_check_system_fm_synth_util_test_OBJECTS) $(ags_check_system_fm_synth_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_fm_synth_util_test_DEPENDENCIES) @rm -f ags_check_system_fm_synth_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_fm_synth_util_test_LINK) $(ags_check_system_fm_synth_util_test_OBJECTS) $(ags_check_system_fm_synth_util_test_LDADD) $(LIBS) ags/test/audio/check_system_fourier_transform_util_test-ags_fourier_transform_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_fourier_transform_util_test$(EXEEXT): $(ags_check_system_fourier_transform_util_test_OBJECTS) $(ags_check_system_fourier_transform_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_fourier_transform_util_test_DEPENDENCIES) @rm -f ags_check_system_fourier_transform_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_fourier_transform_util_test_LINK) $(ags_check_system_fourier_transform_util_test_OBJECTS) $(ags_check_system_fourier_transform_util_test_LDADD) $(LIBS) ags/test/audio/task/check_system_free_selection_test-ags_free_selection_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_free_selection_test$(EXEEXT): $(ags_check_system_free_selection_test_OBJECTS) $(ags_check_system_free_selection_test_DEPENDENCIES) $(EXTRA_ags_check_system_free_selection_test_DEPENDENCIES) @rm -f ags_check_system_free_selection_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_free_selection_test_LINK) $(ags_check_system_free_selection_test_OBJECTS) $(ags_check_system_free_selection_test_LDADD) $(LIBS) ags/test/server/controller/check_system_front_controller_test-ags_front_controller_test.$(OBJEXT): \ ags/test/server/controller/$(am__dirstamp) ags_check_system_front_controller_test$(EXEEXT): $(ags_check_system_front_controller_test_OBJECTS) $(ags_check_system_front_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_front_controller_test_DEPENDENCIES) @rm -f ags_check_system_front_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_front_controller_test_LINK) $(ags_check_system_front_controller_test_OBJECTS) $(ags_check_system_front_controller_test_LDADD) $(LIBS) ags/test/audio/check_system_input_test-ags_input_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_input_test$(EXEEXT): $(ags_check_system_input_test_OBJECTS) $(ags_check_system_input_test_DEPENDENCIES) $(EXTRA_ags_check_system_input_test_DEPENDENCIES) @rm -f ags_check_system_input_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_input_test_LINK) $(ags_check_system_input_test_OBJECTS) $(ags_check_system_input_test_LDADD) $(LIBS) ags/test/plugin/check_system_ladspa_conversion_test-ags_ladspa_conversion_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_ladspa_conversion_test$(EXEEXT): $(ags_check_system_ladspa_conversion_test_OBJECTS) $(ags_check_system_ladspa_conversion_test_DEPENDENCIES) $(EXTRA_ags_check_system_ladspa_conversion_test_DEPENDENCIES) @rm -f ags_check_system_ladspa_conversion_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_ladspa_conversion_test_LINK) $(ags_check_system_ladspa_conversion_test_OBJECTS) $(ags_check_system_ladspa_conversion_test_LDADD) $(LIBS) ags/test/plugin/check_system_ladspa_manager_test-ags_ladspa_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_ladspa_manager_test$(EXEEXT): $(ags_check_system_ladspa_manager_test_OBJECTS) $(ags_check_system_ladspa_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_ladspa_manager_test_DEPENDENCIES) @rm -f ags_check_system_ladspa_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_ladspa_manager_test_LINK) $(ags_check_system_ladspa_manager_test_OBJECTS) $(ags_check_system_ladspa_manager_test_LDADD) $(LIBS) ags/test/audio/task/check_system_link_channel_test-ags_link_channel_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_link_channel_test$(EXEEXT): $(ags_check_system_link_channel_test_OBJECTS) $(ags_check_system_link_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_link_channel_test_DEPENDENCIES) @rm -f ags_check_system_link_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_link_channel_test_LINK) $(ags_check_system_link_channel_test_OBJECTS) $(ags_check_system_link_channel_test_LDADD) $(LIBS) ags/test/lib/check_system_log_test-ags_log_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_log_test$(EXEEXT): $(ags_check_system_log_test_OBJECTS) $(ags_check_system_log_test_DEPENDENCIES) $(EXTRA_ags_check_system_log_test_DEPENDENCIES) @rm -f ags_check_system_log_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_log_test_LINK) $(ags_check_system_log_test_OBJECTS) $(ags_check_system_log_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_conversion_test-ags_lv2_conversion_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_conversion_test$(EXEEXT): $(ags_check_system_lv2_conversion_test_OBJECTS) $(ags_check_system_lv2_conversion_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_conversion_test_DEPENDENCIES) @rm -f ags_check_system_lv2_conversion_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_conversion_test_LINK) $(ags_check_system_lv2_conversion_test_OBJECTS) $(ags_check_system_lv2_conversion_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_manager_test-ags_lv2_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_manager_test$(EXEEXT): $(ags_check_system_lv2_manager_test_OBJECTS) $(ags_check_system_lv2_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_manager_test_DEPENDENCIES) @rm -f ags_check_system_lv2_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_manager_test_LINK) $(ags_check_system_lv2_manager_test_OBJECTS) $(ags_check_system_lv2_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_option_manager_test-ags_lv2_option_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_option_manager_test$(EXEEXT): $(ags_check_system_lv2_option_manager_test_OBJECTS) $(ags_check_system_lv2_option_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_option_manager_test_DEPENDENCIES) @rm -f ags_check_system_lv2_option_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_option_manager_test_LINK) $(ags_check_system_lv2_option_manager_test_OBJECTS) $(ags_check_system_lv2_option_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_plugin_test-ags_lv2_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_plugin_test$(EXEEXT): $(ags_check_system_lv2_plugin_test_OBJECTS) $(ags_check_system_lv2_plugin_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_plugin_test_DEPENDENCIES) @rm -f ags_check_system_lv2_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_plugin_test_LINK) $(ags_check_system_lv2_plugin_test_OBJECTS) $(ags_check_system_lv2_plugin_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_preset_test-ags_lv2_preset_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_preset_test$(EXEEXT): $(ags_check_system_lv2_preset_test_OBJECTS) $(ags_check_system_lv2_preset_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_preset_test_DEPENDENCIES) @rm -f ags_check_system_lv2_preset_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_preset_test_LINK) $(ags_check_system_lv2_preset_test_OBJECTS) $(ags_check_system_lv2_preset_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_uri_map_manager_test$(EXEEXT): $(ags_check_system_lv2_uri_map_manager_test_OBJECTS) $(ags_check_system_lv2_uri_map_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_uri_map_manager_test_DEPENDENCIES) @rm -f ags_check_system_lv2_uri_map_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_uri_map_manager_test_LINK) $(ags_check_system_lv2_uri_map_manager_test_OBJECTS) $(ags_check_system_lv2_uri_map_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_urid_manager_test-ags_lv2_urid_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_urid_manager_test$(EXEEXT): $(ags_check_system_lv2_urid_manager_test_OBJECTS) $(ags_check_system_lv2_urid_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_urid_manager_test_DEPENDENCIES) @rm -f ags_check_system_lv2_urid_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_urid_manager_test_LINK) $(ags_check_system_lv2_urid_manager_test_OBJECTS) $(ags_check_system_lv2_urid_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2_worker_manager_test-ags_lv2_worker_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2_worker_manager_test$(EXEEXT): $(ags_check_system_lv2_worker_manager_test_OBJECTS) $(ags_check_system_lv2_worker_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2_worker_manager_test_DEPENDENCIES) @rm -f ags_check_system_lv2_worker_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2_worker_manager_test_LINK) $(ags_check_system_lv2_worker_manager_test_OBJECTS) $(ags_check_system_lv2_worker_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2ui_manager_test-ags_lv2ui_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2ui_manager_test$(EXEEXT): $(ags_check_system_lv2ui_manager_test_OBJECTS) $(ags_check_system_lv2ui_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2ui_manager_test_DEPENDENCIES) @rm -f ags_check_system_lv2ui_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2ui_manager_test_LINK) $(ags_check_system_lv2ui_manager_test_OBJECTS) $(ags_check_system_lv2ui_manager_test_LDADD) $(LIBS) ags/test/plugin/check_system_lv2ui_plugin_test-ags_lv2ui_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_lv2ui_plugin_test$(EXEEXT): $(ags_check_system_lv2ui_plugin_test_OBJECTS) $(ags_check_system_lv2ui_plugin_test_DEPENDENCIES) $(EXTRA_ags_check_system_lv2ui_plugin_test_DEPENDENCIES) @rm -f ags_check_system_lv2ui_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_lv2ui_plugin_test_LINK) $(ags_check_system_lv2ui_plugin_test_OBJECTS) $(ags_check_system_lv2ui_plugin_test_LDADD) $(LIBS) ags/test/audio/midi/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/midi @: > ags/test/audio/midi/$(am__dirstamp) ags/test/audio/midi/check_system_midi_buffer_util_test-ags_midi_buffer_util_test.$(OBJEXT): \ ags/test/audio/midi/$(am__dirstamp) ags_check_system_midi_buffer_util_test$(EXEEXT): $(ags_check_system_midi_buffer_util_test_OBJECTS) $(ags_check_system_midi_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_midi_buffer_util_test_DEPENDENCIES) @rm -f ags_check_system_midi_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_midi_buffer_util_test_LINK) $(ags_check_system_midi_buffer_util_test_OBJECTS) $(ags_check_system_midi_buffer_util_test_LDADD) $(LIBS) ags/test/audio/midi/check_system_midi_builder_test-ags_midi_builder_test.$(OBJEXT): \ ags/test/audio/midi/$(am__dirstamp) ags_check_system_midi_builder_test$(EXEEXT): $(ags_check_system_midi_builder_test_OBJECTS) $(ags_check_system_midi_builder_test_DEPENDENCIES) $(EXTRA_ags_check_system_midi_builder_test_DEPENDENCIES) @rm -f ags_check_system_midi_builder_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_midi_builder_test_LINK) $(ags_check_system_midi_builder_test_OBJECTS) $(ags_check_system_midi_builder_test_LDADD) $(LIBS) ags/test/audio/check_system_midi_test-ags_midi_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_midi_test$(EXEEXT): $(ags_check_system_midi_test_OBJECTS) $(ags_check_system_midi_test_DEPENDENCIES) $(EXTRA_ags_check_system_midi_test_DEPENDENCIES) @rm -f ags_check_system_midi_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_midi_test_LINK) $(ags_check_system_midi_test_OBJECTS) $(ags_check_system_midi_test_LDADD) $(LIBS) ags/test/audio/check_system_midiin_test-ags_midiin_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_midiin_test$(EXEEXT): $(ags_check_system_midiin_test_OBJECTS) $(ags_check_system_midiin_test_DEPENDENCIES) $(EXTRA_ags_check_system_midiin_test_DEPENDENCIES) @rm -f ags_check_system_midiin_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_midiin_test_LINK) $(ags_check_system_midiin_test_OBJECTS) $(ags_check_system_midiin_test_LDADD) $(LIBS) ags/test/audio/task/check_system_move_note_test-ags_move_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_move_note_test$(EXEEXT): $(ags_check_system_move_note_test_OBJECTS) $(ags_check_system_move_note_test_DEPENDENCIES) $(EXTRA_ags_check_system_move_note_test_DEPENDENCIES) @rm -f ags_check_system_move_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_move_note_test_LINK) $(ags_check_system_move_note_test_OBJECTS) $(ags_check_system_move_note_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_mute_audio_signal_test-ags_mute_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_mute_audio_signal_test$(EXEEXT): $(ags_check_system_mute_audio_signal_test_OBJECTS) $(ags_check_system_mute_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_mute_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_mute_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_mute_audio_signal_test_LINK) $(ags_check_system_mute_audio_signal_test_OBJECTS) $(ags_check_system_mute_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_mute_audio_test-ags_mute_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_mute_audio_test$(EXEEXT): $(ags_check_system_mute_audio_test_OBJECTS) $(ags_check_system_mute_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_mute_audio_test_DEPENDENCIES) @rm -f ags_check_system_mute_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_mute_audio_test_LINK) $(ags_check_system_mute_audio_test_OBJECTS) $(ags_check_system_mute_audio_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_mute_channel_test-ags_mute_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_mute_channel_test$(EXEEXT): $(ags_check_system_mute_channel_test_OBJECTS) $(ags_check_system_mute_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_mute_channel_test_DEPENDENCIES) @rm -f ags_check_system_mute_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_mute_channel_test_LINK) $(ags_check_system_mute_channel_test_OBJECTS) $(ags_check_system_mute_channel_test_LDADD) $(LIBS) ags/test/audio/check_system_notation_test-ags_notation_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_notation_test$(EXEEXT): $(ags_check_system_notation_test_OBJECTS) $(ags_check_system_notation_test_DEPENDENCIES) $(EXTRA_ags_check_system_notation_test_DEPENDENCIES) @rm -f ags_check_system_notation_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_notation_test_LINK) $(ags_check_system_notation_test_OBJECTS) $(ags_check_system_notation_test_LDADD) $(LIBS) ags/test/audio/check_system_note_test-ags_note_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_note_test$(EXEEXT): $(ags_check_system_note_test_OBJECTS) $(ags_check_system_note_test_DEPENDENCIES) $(EXTRA_ags_check_system_note_test_DEPENDENCIES) @rm -f ags_check_system_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_note_test_LINK) $(ags_check_system_note_test_OBJECTS) $(ags_check_system_note_test_LDADD) $(LIBS) ags/test/audio/osc/controller/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/controller @: > ags/test/audio/osc/controller/$(am__dirstamp) ags/test/audio/osc/controller/check_system_osc_action_controller_test-ags_osc_action_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_action_controller_test$(EXEEXT): $(ags_check_system_osc_action_controller_test_OBJECTS) $(ags_check_system_osc_action_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_action_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_action_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_action_controller_test_LINK) $(ags_check_system_osc_action_controller_test_OBJECTS) $(ags_check_system_osc_action_controller_test_LDADD) $(LIBS) ags/test/audio/osc/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc @: > ags/test/audio/osc/$(am__dirstamp) ags/test/audio/osc/check_system_osc_buffer_util_test-ags_osc_buffer_util_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_buffer_util_test$(EXEEXT): $(ags_check_system_osc_buffer_util_test_OBJECTS) $(ags_check_system_osc_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_buffer_util_test_DEPENDENCIES) @rm -f ags_check_system_osc_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_buffer_util_test_LINK) $(ags_check_system_osc_buffer_util_test_OBJECTS) $(ags_check_system_osc_buffer_util_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_client_test-ags_osc_client_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_client_test$(EXEEXT): $(ags_check_system_osc_client_test_OBJECTS) $(ags_check_system_osc_client_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_client_test_DEPENDENCIES) @rm -f ags_check_system_osc_client_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_client_test_LINK) $(ags_check_system_osc_client_test_OBJECTS) $(ags_check_system_osc_client_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_config_controller_test-ags_osc_config_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_config_controller_test$(EXEEXT): $(ags_check_system_osc_config_controller_test_OBJECTS) $(ags_check_system_osc_config_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_config_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_config_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_config_controller_test_LINK) $(ags_check_system_osc_config_controller_test_OBJECTS) $(ags_check_system_osc_config_controller_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_connection_test-ags_osc_connection_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_connection_test$(EXEEXT): $(ags_check_system_osc_connection_test_OBJECTS) $(ags_check_system_osc_connection_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_connection_test_DEPENDENCIES) @rm -f ags_check_system_osc_connection_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_connection_test_LINK) $(ags_check_system_osc_connection_test_OBJECTS) $(ags_check_system_osc_connection_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_front_controller_test-ags_osc_front_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_front_controller_test$(EXEEXT): $(ags_check_system_osc_front_controller_test_OBJECTS) $(ags_check_system_osc_front_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_front_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_front_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_front_controller_test_LINK) $(ags_check_system_osc_front_controller_test_OBJECTS) $(ags_check_system_osc_front_controller_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_info_controller_test-ags_osc_info_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_info_controller_test$(EXEEXT): $(ags_check_system_osc_info_controller_test_OBJECTS) $(ags_check_system_osc_info_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_info_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_info_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_info_controller_test_LINK) $(ags_check_system_osc_info_controller_test_OBJECTS) $(ags_check_system_osc_info_controller_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_message_test-ags_osc_message_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_message_test$(EXEEXT): $(ags_check_system_osc_message_test_OBJECTS) $(ags_check_system_osc_message_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_message_test_DEPENDENCIES) @rm -f ags_check_system_osc_message_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_message_test_LINK) $(ags_check_system_osc_message_test_OBJECTS) $(ags_check_system_osc_message_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_meter_controller_test-ags_osc_meter_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_meter_controller_test$(EXEEXT): $(ags_check_system_osc_meter_controller_test_OBJECTS) $(ags_check_system_osc_meter_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_meter_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_meter_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_meter_controller_test_LINK) $(ags_check_system_osc_meter_controller_test_OBJECTS) $(ags_check_system_osc_meter_controller_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_node_controller_test-ags_osc_node_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_node_controller_test$(EXEEXT): $(ags_check_system_osc_node_controller_test_OBJECTS) $(ags_check_system_osc_node_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_node_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_node_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_node_controller_test_LINK) $(ags_check_system_osc_node_controller_test_OBJECTS) $(ags_check_system_osc_node_controller_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_renew_controller_test-ags_osc_renew_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_renew_controller_test$(EXEEXT): $(ags_check_system_osc_renew_controller_test_OBJECTS) $(ags_check_system_osc_renew_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_renew_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_renew_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_renew_controller_test_LINK) $(ags_check_system_osc_renew_controller_test_OBJECTS) $(ags_check_system_osc_renew_controller_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_server_test-ags_osc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_server_test$(EXEEXT): $(ags_check_system_osc_server_test_OBJECTS) $(ags_check_system_osc_server_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_server_test_DEPENDENCIES) @rm -f ags_check_system_osc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_server_test_LINK) $(ags_check_system_osc_server_test_OBJECTS) $(ags_check_system_osc_server_test_LDADD) $(LIBS) ags/test/audio/osc/controller/check_system_osc_status_controller_test-ags_osc_status_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) ags_check_system_osc_status_controller_test$(EXEEXT): $(ags_check_system_osc_status_controller_test_OBJECTS) $(ags_check_system_osc_status_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_status_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_status_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_status_controller_test_LINK) $(ags_check_system_osc_status_controller_test_OBJECTS) $(ags_check_system_osc_status_controller_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_websocket_connection_test-ags_osc_websocket_connection_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_websocket_connection_test$(EXEEXT): $(ags_check_system_osc_websocket_connection_test_OBJECTS) $(ags_check_system_osc_websocket_connection_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_websocket_connection_test_DEPENDENCIES) @rm -f ags_check_system_osc_websocket_connection_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_websocket_connection_test_LINK) $(ags_check_system_osc_websocket_connection_test_OBJECTS) $(ags_check_system_osc_websocket_connection_test_LDADD) $(LIBS) ags/test/audio/osc/xmlrpc/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/xmlrpc @: > ags/test/audio/osc/xmlrpc/$(am__dirstamp) ags/test/audio/osc/xmlrpc/check_system_osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.$(OBJEXT): \ ags/test/audio/osc/xmlrpc/$(am__dirstamp) ags_check_system_osc_xmlrpc_controller_test$(EXEEXT): $(ags_check_system_osc_xmlrpc_controller_test_OBJECTS) $(ags_check_system_osc_xmlrpc_controller_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_xmlrpc_controller_test_DEPENDENCIES) @rm -f ags_check_system_osc_xmlrpc_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_xmlrpc_controller_test_LINK) $(ags_check_system_osc_xmlrpc_controller_test_OBJECTS) $(ags_check_system_osc_xmlrpc_controller_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_xmlrpc_message_test$(EXEEXT): $(ags_check_system_osc_xmlrpc_message_test_OBJECTS) $(ags_check_system_osc_xmlrpc_message_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_xmlrpc_message_test_DEPENDENCIES) @rm -f ags_check_system_osc_xmlrpc_message_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_xmlrpc_message_test_LINK) $(ags_check_system_osc_xmlrpc_message_test_OBJECTS) $(ags_check_system_osc_xmlrpc_message_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_osc_xmlrpc_server_test$(EXEEXT): $(ags_check_system_osc_xmlrpc_server_test_OBJECTS) $(ags_check_system_osc_xmlrpc_server_test_DEPENDENCIES) $(EXTRA_ags_check_system_osc_xmlrpc_server_test_DEPENDENCIES) @rm -f ags_check_system_osc_xmlrpc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_osc_xmlrpc_server_test_LINK) $(ags_check_system_osc_xmlrpc_server_test_OBJECTS) $(ags_check_system_osc_xmlrpc_server_test_LDADD) $(LIBS) ags/test/audio/check_system_output_test-ags_output_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_output_test$(EXEEXT): $(ags_check_system_output_test_OBJECTS) $(ags_check_system_output_test_DEPENDENCIES) $(EXTRA_ags_check_system_output_test_DEPENDENCIES) @rm -f ags_check_system_output_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_output_test_LINK) $(ags_check_system_output_test_OBJECTS) $(ags_check_system_output_test_LDADD) $(LIBS) ags/test/server/security/check_system_password_store_manager_test-ags_password_store_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_password_store_manager_test$(EXEEXT): $(ags_check_system_password_store_manager_test_OBJECTS) $(ags_check_system_password_store_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_password_store_manager_test_DEPENDENCIES) @rm -f ags_check_system_password_store_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_password_store_manager_test_LINK) $(ags_check_system_password_store_manager_test_OBJECTS) $(ags_check_system_password_store_manager_test_LDADD) $(LIBS) ags/test/audio/check_system_pattern_test-ags_pattern_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_pattern_test$(EXEEXT): $(ags_check_system_pattern_test_OBJECTS) $(ags_check_system_pattern_test_DEPENDENCIES) $(EXTRA_ags_check_system_pattern_test_DEPENDENCIES) @rm -f ags_check_system_pattern_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_pattern_test_LINK) $(ags_check_system_pattern_test_OBJECTS) $(ags_check_system_pattern_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_peak_audio_signal_test-ags_peak_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_peak_audio_signal_test$(EXEEXT): $(ags_check_system_peak_audio_signal_test_OBJECTS) $(ags_check_system_peak_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_peak_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_peak_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_peak_audio_signal_test_LINK) $(ags_check_system_peak_audio_signal_test_OBJECTS) $(ags_check_system_peak_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_peak_channel_test-ags_peak_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_peak_channel_test$(EXEEXT): $(ags_check_system_peak_channel_test_OBJECTS) $(ags_check_system_peak_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_peak_channel_test_DEPENDENCIES) @rm -f ags_check_system_peak_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_peak_channel_test_LINK) $(ags_check_system_peak_channel_test_OBJECTS) $(ags_check_system_peak_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_play_audio_signal_test-ags_play_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_play_audio_signal_test$(EXEEXT): $(ags_check_system_play_audio_signal_test_OBJECTS) $(ags_check_system_play_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_play_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_play_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_play_audio_signal_test_LINK) $(ags_check_system_play_audio_signal_test_OBJECTS) $(ags_check_system_play_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_play_audio_test-ags_play_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_play_audio_test$(EXEEXT): $(ags_check_system_play_audio_test_OBJECTS) $(ags_check_system_play_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_play_audio_test_DEPENDENCIES) @rm -f ags_check_system_play_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_play_audio_test_LINK) $(ags_check_system_play_audio_test_OBJECTS) $(ags_check_system_play_audio_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_play_channel_test-ags_play_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_play_channel_test$(EXEEXT): $(ags_check_system_play_channel_test_OBJECTS) $(ags_check_system_play_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_play_channel_test_DEPENDENCIES) @rm -f ags_check_system_play_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_play_channel_test_LINK) $(ags_check_system_play_channel_test_OBJECTS) $(ags_check_system_play_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_play_wave_audio_test-ags_play_wave_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_play_wave_audio_test$(EXEEXT): $(ags_check_system_play_wave_audio_test_OBJECTS) $(ags_check_system_play_wave_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_play_wave_audio_test_DEPENDENCIES) @rm -f ags_check_system_play_wave_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_play_wave_audio_test_LINK) $(ags_check_system_play_wave_audio_test_OBJECTS) $(ags_check_system_play_wave_audio_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_play_wave_channel_test-ags_play_wave_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_play_wave_channel_test$(EXEEXT): $(ags_check_system_play_wave_channel_test_OBJECTS) $(ags_check_system_play_wave_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_play_wave_channel_test_DEPENDENCIES) @rm -f ags_check_system_play_wave_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_play_wave_channel_test_LINK) $(ags_check_system_play_wave_channel_test_OBJECTS) $(ags_check_system_play_wave_channel_test_LDADD) $(LIBS) ags/test/audio/check_system_playback_domain_test-ags_playback_domain_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_playback_domain_test$(EXEEXT): $(ags_check_system_playback_domain_test_OBJECTS) $(ags_check_system_playback_domain_test_DEPENDENCIES) $(EXTRA_ags_check_system_playback_domain_test_DEPENDENCIES) @rm -f ags_check_system_playback_domain_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_playback_domain_test_LINK) $(ags_check_system_playback_domain_test_OBJECTS) $(ags_check_system_playback_domain_test_LDADD) $(LIBS) ags/test/audio/check_system_playback_test-ags_playback_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_playback_test$(EXEEXT): $(ags_check_system_playback_test_OBJECTS) $(ags_check_system_playback_test_DEPENDENCIES) $(EXTRA_ags_check_system_playback_test_DEPENDENCIES) @rm -f ags_check_system_playback_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_playback_test_LINK) $(ags_check_system_playback_test_OBJECTS) $(ags_check_system_playback_test_LDADD) $(LIBS) ags/test/plugin/check_system_plugin_port_test-ags_plugin_port_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) ags_check_system_plugin_port_test$(EXEEXT): $(ags_check_system_plugin_port_test_OBJECTS) $(ags_check_system_plugin_port_test_DEPENDENCIES) $(EXTRA_ags_check_system_plugin_port_test_DEPENDENCIES) @rm -f ags_check_system_plugin_port_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_plugin_port_test_LINK) $(ags_check_system_plugin_port_test_OBJECTS) $(ags_check_system_plugin_port_test_LDADD) $(LIBS) ags/test/audio/check_system_port_test-ags_port_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_port_test$(EXEEXT): $(ags_check_system_port_test_OBJECTS) $(ags_check_system_port_test_DEPENDENCIES) $(EXTRA_ags_check_system_port_test_DEPENDENCIES) @rm -f ags_check_system_port_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_port_test_LINK) $(ags_check_system_port_test_OBJECTS) $(ags_check_system_port_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_prepare_audio_signal_test-ags_prepare_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_prepare_audio_signal_test$(EXEEXT): $(ags_check_system_prepare_audio_signal_test_OBJECTS) $(ags_check_system_prepare_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_prepare_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_prepare_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_prepare_audio_signal_test_LINK) $(ags_check_system_prepare_audio_signal_test_OBJECTS) $(ags_check_system_prepare_audio_signal_test_LDADD) $(LIBS) ags/test/audio/check_system_preset_test-ags_preset_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_preset_test$(EXEEXT): $(ags_check_system_preset_test_OBJECTS) $(ags_check_system_preset_test_DEPENDENCIES) $(EXTRA_ags_check_system_preset_test_DEPENDENCIES) @rm -f ags_check_system_preset_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_preset_test_LINK) $(ags_check_system_preset_test_OBJECTS) $(ags_check_system_preset_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_channel_run_test-ags_recall_channel_run_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_channel_run_test$(EXEEXT): $(ags_check_system_recall_channel_run_test_OBJECTS) $(ags_check_system_recall_channel_run_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_channel_run_test_DEPENDENCIES) @rm -f ags_check_system_recall_channel_run_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_channel_run_test_LINK) $(ags_check_system_recall_channel_run_test_OBJECTS) $(ags_check_system_recall_channel_run_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_channel_test-ags_recall_channel_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_channel_test$(EXEEXT): $(ags_check_system_recall_channel_test_OBJECTS) $(ags_check_system_recall_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_channel_test_DEPENDENCIES) @rm -f ags_check_system_recall_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_channel_test_LINK) $(ags_check_system_recall_channel_test_OBJECTS) $(ags_check_system_recall_channel_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_container_test-ags_recall_container_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_container_test$(EXEEXT): $(ags_check_system_recall_container_test_OBJECTS) $(ags_check_system_recall_container_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_container_test_DEPENDENCIES) @rm -f ags_check_system_recall_container_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_container_test_LINK) $(ags_check_system_recall_container_test_OBJECTS) $(ags_check_system_recall_container_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_dependency_test-ags_recall_dependency_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_dependency_test$(EXEEXT): $(ags_check_system_recall_dependency_test_OBJECTS) $(ags_check_system_recall_dependency_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_dependency_test_DEPENDENCIES) @rm -f ags_check_system_recall_dependency_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_dependency_test_LINK) $(ags_check_system_recall_dependency_test_OBJECTS) $(ags_check_system_recall_dependency_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_id_test-ags_recall_id_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_id_test$(EXEEXT): $(ags_check_system_recall_id_test_OBJECTS) $(ags_check_system_recall_id_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_id_test_DEPENDENCIES) @rm -f ags_check_system_recall_id_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_id_test_LINK) $(ags_check_system_recall_id_test_OBJECTS) $(ags_check_system_recall_id_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_recycling_test-ags_recall_recycling_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_recycling_test$(EXEEXT): $(ags_check_system_recall_recycling_test_OBJECTS) $(ags_check_system_recall_recycling_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_recycling_test_DEPENDENCIES) @rm -f ags_check_system_recall_recycling_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_recycling_test_LINK) $(ags_check_system_recall_recycling_test_OBJECTS) $(ags_check_system_recall_recycling_test_LDADD) $(LIBS) ags/test/audio/check_system_recall_test-ags_recall_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recall_test$(EXEEXT): $(ags_check_system_recall_test_OBJECTS) $(ags_check_system_recall_test_DEPENDENCIES) $(EXTRA_ags_check_system_recall_test_DEPENDENCIES) @rm -f ags_check_system_recall_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recall_test_LINK) $(ags_check_system_recall_test_OBJECTS) $(ags_check_system_recall_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_record_midi_audio_test-ags_record_midi_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_record_midi_audio_test$(EXEEXT): $(ags_check_system_record_midi_audio_test_OBJECTS) $(ags_check_system_record_midi_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_record_midi_audio_test_DEPENDENCIES) @rm -f ags_check_system_record_midi_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_record_midi_audio_test_LINK) $(ags_check_system_record_midi_audio_test_OBJECTS) $(ags_check_system_record_midi_audio_test_LDADD) $(LIBS) ags/test/audio/check_system_recycling_context_test-ags_recycling_context_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recycling_context_test$(EXEEXT): $(ags_check_system_recycling_context_test_OBJECTS) $(ags_check_system_recycling_context_test_DEPENDENCIES) $(EXTRA_ags_check_system_recycling_context_test_DEPENDENCIES) @rm -f ags_check_system_recycling_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recycling_context_test_LINK) $(ags_check_system_recycling_context_test_OBJECTS) $(ags_check_system_recycling_context_test_LDADD) $(LIBS) ags/test/audio/check_system_recycling_test-ags_recycling_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_recycling_test$(EXEEXT): $(ags_check_system_recycling_test_OBJECTS) $(ags_check_system_recycling_test_DEPENDENCIES) $(EXTRA_ags_check_system_recycling_test_DEPENDENCIES) @rm -f ags_check_system_recycling_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_recycling_test_LINK) $(ags_check_system_recycling_test_OBJECTS) $(ags_check_system_recycling_test_LDADD) $(LIBS) ags/test/audio/task/check_system_remove_audio_signal_test-ags_remove_audio_signal_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_remove_audio_signal_test$(EXEEXT): $(ags_check_system_remove_audio_signal_test_OBJECTS) $(ags_check_system_remove_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_remove_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_remove_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_remove_audio_signal_test_LINK) $(ags_check_system_remove_audio_signal_test_OBJECTS) $(ags_check_system_remove_audio_signal_test_LDADD) $(LIBS) ags/test/audio/task/check_system_remove_audio_test-ags_remove_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_remove_audio_test$(EXEEXT): $(ags_check_system_remove_audio_test_OBJECTS) $(ags_check_system_remove_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_remove_audio_test_DEPENDENCIES) @rm -f ags_check_system_remove_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_remove_audio_test_LINK) $(ags_check_system_remove_audio_test_OBJECTS) $(ags_check_system_remove_audio_test_LDADD) $(LIBS) ags/test/audio/task/check_system_remove_note_test-ags_remove_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_remove_note_test$(EXEEXT): $(ags_check_system_remove_note_test_OBJECTS) $(ags_check_system_remove_note_test_DEPENDENCIES) $(EXTRA_ags_check_system_remove_note_test_DEPENDENCIES) @rm -f ags_check_system_remove_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_remove_note_test_LINK) $(ags_check_system_remove_note_test_OBJECTS) $(ags_check_system_remove_note_test_LDADD) $(LIBS) ags/test/audio/task/check_system_remove_soundcard_test-ags_remove_soundcard_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_remove_soundcard_test$(EXEEXT): $(ags_check_system_remove_soundcard_test_OBJECTS) $(ags_check_system_remove_soundcard_test_DEPENDENCIES) $(EXTRA_ags_check_system_remove_soundcard_test_DEPENDENCIES) @rm -f ags_check_system_remove_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_remove_soundcard_test_LINK) $(ags_check_system_remove_soundcard_test_OBJECTS) $(ags_check_system_remove_soundcard_test_LDADD) $(LIBS) ags/test/audio/task/check_system_reset_amplitude_test-ags_reset_amplitude_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_reset_amplitude_test$(EXEEXT): $(ags_check_system_reset_amplitude_test_OBJECTS) $(ags_check_system_reset_amplitude_test_DEPENDENCIES) $(EXTRA_ags_check_system_reset_amplitude_test_DEPENDENCIES) @rm -f ags_check_system_reset_amplitude_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_reset_amplitude_test_LINK) $(ags_check_system_reset_amplitude_test_OBJECTS) $(ags_check_system_reset_amplitude_test_LDADD) $(LIBS) ags/test/audio/task/check_system_reset_peak_test-ags_reset_peak_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_reset_peak_test$(EXEEXT): $(ags_check_system_reset_peak_test_OBJECTS) $(ags_check_system_reset_peak_test_DEPENDENCIES) $(EXTRA_ags_check_system_reset_peak_test_DEPENDENCIES) @rm -f ags_check_system_reset_peak_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_reset_peak_test_LINK) $(ags_check_system_reset_peak_test_OBJECTS) $(ags_check_system_reset_peak_test_LDADD) $(LIBS) ags/test/audio/task/check_system_resize_audio_test-ags_resize_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_resize_audio_test$(EXEEXT): $(ags_check_system_resize_audio_test_OBJECTS) $(ags_check_system_resize_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_resize_audio_test_DEPENDENCIES) @rm -f ags_check_system_resize_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_resize_audio_test_LINK) $(ags_check_system_resize_audio_test_OBJECTS) $(ags_check_system_resize_audio_test_LDADD) $(LIBS) ags/test/thread/check_system_returnable_thread_test-ags_returnable_thread_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) ags_check_system_returnable_thread_test$(EXEEXT): $(ags_check_system_returnable_thread_test_OBJECTS) $(ags_check_system_returnable_thread_test_DEPENDENCIES) $(EXTRA_ags_check_system_returnable_thread_test_DEPENDENCIES) @rm -f ags_check_system_returnable_thread_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_returnable_thread_test_LINK) $(ags_check_system_returnable_thread_test_OBJECTS) $(ags_check_system_returnable_thread_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_route_dssi_audio_test-ags_route_dssi_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_route_dssi_audio_test$(EXEEXT): $(ags_check_system_route_dssi_audio_test_OBJECTS) $(ags_check_system_route_dssi_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_route_dssi_audio_test_DEPENDENCIES) @rm -f ags_check_system_route_dssi_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_route_dssi_audio_test_LINK) $(ags_check_system_route_dssi_audio_test_OBJECTS) $(ags_check_system_route_dssi_audio_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_route_lv2_audio_test-ags_route_lv2_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_route_lv2_audio_test$(EXEEXT): $(ags_check_system_route_lv2_audio_test_OBJECTS) $(ags_check_system_route_lv2_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_route_lv2_audio_test_DEPENDENCIES) @rm -f ags_check_system_route_lv2_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_route_lv2_audio_test_LINK) $(ags_check_system_route_lv2_audio_test_OBJECTS) $(ags_check_system_route_lv2_audio_test_LDADD) $(LIBS) ags/test/server/security/check_system_security_context_test-ags_security_context_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_security_context_test$(EXEEXT): $(ags_check_system_security_context_test_OBJECTS) $(ags_check_system_security_context_test_DEPENDENCIES) $(EXTRA_ags_check_system_security_context_test_DEPENDENCIES) @rm -f ags_check_system_security_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_security_context_test_LINK) $(ags_check_system_security_context_test_OBJECTS) $(ags_check_system_security_context_test_LDADD) $(LIBS) ags/test/audio/task/check_system_seek_soundcard_test-ags_seek_soundcard_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_seek_soundcard_test$(EXEEXT): $(ags_check_system_seek_soundcard_test_OBJECTS) $(ags_check_system_seek_soundcard_test_DEPENDENCIES) $(EXTRA_ags_check_system_seek_soundcard_test_DEPENDENCIES) @rm -f ags_check_system_seek_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_seek_soundcard_test_LINK) $(ags_check_system_seek_soundcard_test_OBJECTS) $(ags_check_system_seek_soundcard_test_LDADD) $(LIBS) ags/test/server/$(am__dirstamp): @$(MKDIR_P) ags/test/server @: > ags/test/server/$(am__dirstamp) ags/test/server/check_system_server_application_context_test-ags_server_application_context_test.$(OBJEXT): \ ags/test/server/$(am__dirstamp) ags_check_system_server_application_context_test$(EXEEXT): $(ags_check_system_server_application_context_test_OBJECTS) $(ags_check_system_server_application_context_test_DEPENDENCIES) $(EXTRA_ags_check_system_server_application_context_test_DEPENDENCIES) @rm -f ags_check_system_server_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_server_application_context_test_LINK) $(ags_check_system_server_application_context_test_OBJECTS) $(ags_check_system_server_application_context_test_LDADD) $(LIBS) ags/test/server/check_system_server_test-ags_server_test.$(OBJEXT): \ ags/test/server/$(am__dirstamp) ags_check_system_server_test$(EXEEXT): $(ags_check_system_server_test_OBJECTS) $(ags_check_system_server_test_DEPENDENCIES) $(EXTRA_ags_check_system_server_test_DEPENDENCIES) @rm -f ags_check_system_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_server_test_LINK) $(ags_check_system_server_test_OBJECTS) $(ags_check_system_server_test_LDADD) $(LIBS) ags/test/audio/task/check_system_set_audio_channels_test-ags_set_audio_channels_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_set_audio_channels_test$(EXEEXT): $(ags_check_system_set_audio_channels_test_OBJECTS) $(ags_check_system_set_audio_channels_test_DEPENDENCIES) $(EXTRA_ags_check_system_set_audio_channels_test_DEPENDENCIES) @rm -f ags_check_system_set_audio_channels_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_set_audio_channels_test_LINK) $(ags_check_system_set_audio_channels_test_OBJECTS) $(ags_check_system_set_audio_channels_test_LDADD) $(LIBS) ags/test/audio/task/check_system_set_buffer_size_test-ags_set_buffer_size_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_set_buffer_size_test$(EXEEXT): $(ags_check_system_set_buffer_size_test_OBJECTS) $(ags_check_system_set_buffer_size_test_DEPENDENCIES) $(EXTRA_ags_check_system_set_buffer_size_test_DEPENDENCIES) @rm -f ags_check_system_set_buffer_size_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_set_buffer_size_test_LINK) $(ags_check_system_set_buffer_size_test_OBJECTS) $(ags_check_system_set_buffer_size_test_LDADD) $(LIBS) ags/test/audio/task/check_system_set_device_test-ags_set_device_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_set_device_test$(EXEEXT): $(ags_check_system_set_device_test_OBJECTS) $(ags_check_system_set_device_test_DEPENDENCIES) $(EXTRA_ags_check_system_set_device_test_DEPENDENCIES) @rm -f ags_check_system_set_device_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_set_device_test_LINK) $(ags_check_system_set_device_test_OBJECTS) $(ags_check_system_set_device_test_LDADD) $(LIBS) ags/test/audio/task/check_system_set_format_test-ags_set_format_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_set_format_test$(EXEEXT): $(ags_check_system_set_format_test_OBJECTS) $(ags_check_system_set_format_test_DEPENDENCIES) $(EXTRA_ags_check_system_set_format_test_DEPENDENCIES) @rm -f ags_check_system_set_format_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_set_format_test_LINK) $(ags_check_system_set_format_test_OBJECTS) $(ags_check_system_set_format_test_LDADD) $(LIBS) ags/test/audio/task/check_system_set_muted_test-ags_set_muted_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_set_muted_test$(EXEEXT): $(ags_check_system_set_muted_test_OBJECTS) $(ags_check_system_set_muted_test_DEPENDENCIES) $(EXTRA_ags_check_system_set_muted_test_DEPENDENCIES) @rm -f ags_check_system_set_muted_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_set_muted_test_LINK) $(ags_check_system_set_muted_test_OBJECTS) $(ags_check_system_set_muted_test_LDADD) $(LIBS) ags/test/audio/task/check_system_set_samplerate_test-ags_set_samplerate_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_set_samplerate_test$(EXEEXT): $(ags_check_system_set_samplerate_test_OBJECTS) $(ags_check_system_set_samplerate_test_DEPENDENCIES) $(EXTRA_ags_check_system_set_samplerate_test_DEPENDENCIES) @rm -f ags_check_system_set_samplerate_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_set_samplerate_test_LINK) $(ags_check_system_set_samplerate_test_OBJECTS) $(ags_check_system_set_samplerate_test_LDADD) $(LIBS) ags/test/object/check_system_soundcard_test-ags_soundcard_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) ags_check_system_soundcard_test$(EXEEXT): $(ags_check_system_soundcard_test_OBJECTS) $(ags_check_system_soundcard_test_DEPENDENCIES) $(EXTRA_ags_check_system_soundcard_test_DEPENDENCIES) @rm -f ags_check_system_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_soundcard_test_LINK) $(ags_check_system_soundcard_test_OBJECTS) $(ags_check_system_soundcard_test_LDADD) $(LIBS) ags/test/audio/task/check_system_start_audio_test-ags_start_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_start_audio_test$(EXEEXT): $(ags_check_system_start_audio_test_OBJECTS) $(ags_check_system_start_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_start_audio_test_DEPENDENCIES) @rm -f ags_check_system_start_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_start_audio_test_LINK) $(ags_check_system_start_audio_test_OBJECTS) $(ags_check_system_start_audio_test_LDADD) $(LIBS) ags/test/audio/task/check_system_start_channel_test-ags_start_channel_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) ags_check_system_start_channel_test$(EXEEXT): $(ags_check_system_start_channel_test_OBJECTS) $(ags_check_system_start_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_start_channel_test_DEPENDENCIES) @rm -f ags_check_system_start_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_start_channel_test_LINK) $(ags_check_system_start_channel_test_OBJECTS) $(ags_check_system_start_channel_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_stream_audio_signal_test-ags_stream_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_stream_audio_signal_test$(EXEEXT): $(ags_check_system_stream_audio_signal_test_OBJECTS) $(ags_check_system_stream_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_stream_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_stream_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_stream_audio_signal_test_LINK) $(ags_check_system_stream_audio_signal_test_OBJECTS) $(ags_check_system_stream_audio_signal_test_LDADD) $(LIBS) ags/test/audio/check_system_synth_generator_test-ags_synth_generator_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_synth_generator_test$(EXEEXT): $(ags_check_system_synth_generator_test_OBJECTS) $(ags_check_system_synth_generator_test_DEPENDENCIES) $(EXTRA_ags_check_system_synth_generator_test_DEPENDENCIES) @rm -f ags_check_system_synth_generator_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_synth_generator_test_LINK) $(ags_check_system_synth_generator_test_OBJECTS) $(ags_check_system_synth_generator_test_LDADD) $(LIBS) ags/test/thread/check_system_task_test-ags_task_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) ags_check_system_task_test$(EXEEXT): $(ags_check_system_task_test_OBJECTS) $(ags_check_system_task_test_DEPENDENCIES) $(EXTRA_ags_check_system_task_test_DEPENDENCIES) @rm -f ags_check_system_task_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_task_test_LINK) $(ags_check_system_task_test_OBJECTS) $(ags_check_system_task_test_LDADD) $(LIBS) ags/test/thread/check_system_thread_pool_test-ags_thread_pool_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) ags_check_system_thread_pool_test$(EXEEXT): $(ags_check_system_thread_pool_test_OBJECTS) $(ags_check_system_thread_pool_test_DEPENDENCIES) $(EXTRA_ags_check_system_thread_pool_test_DEPENDENCIES) @rm -f ags_check_system_thread_pool_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_thread_pool_test_LINK) $(ags_check_system_thread_pool_test_OBJECTS) $(ags_check_system_thread_pool_test_LDADD) $(LIBS) ags/test/thread/check_system_thread_test-ags_thread_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) ags_check_system_thread_test$(EXEEXT): $(ags_check_system_thread_test_OBJECTS) $(ags_check_system_thread_test_DEPENDENCIES) $(EXTRA_ags_check_system_thread_test_DEPENDENCIES) @rm -f ags_check_system_thread_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_thread_test_LINK) $(ags_check_system_thread_test_OBJECTS) $(ags_check_system_thread_test_LDADD) $(LIBS) ags/test/lib/check_system_time_test-ags_time_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_time_test$(EXEEXT): $(ags_check_system_time_test_OBJECTS) $(ags_check_system_time_test_DEPENDENCIES) $(EXTRA_ags_check_system_time_test_DEPENDENCIES) @rm -f ags_check_system_time_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_time_test_LINK) $(ags_check_system_time_test_OBJECTS) $(ags_check_system_time_test_LDADD) $(LIBS) ags/test/audio/check_system_track_test-ags_track_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_track_test$(EXEEXT): $(ags_check_system_track_test_OBJECTS) $(ags_check_system_track_test_DEPENDENCIES) $(EXTRA_ags_check_system_track_test_DEPENDENCIES) @rm -f ags_check_system_track_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_track_test_LINK) $(ags_check_system_track_test_OBJECTS) $(ags_check_system_track_test_LDADD) $(LIBS) ags/test/lib/check_system_turtle_manager_test-ags_turtle_manager_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_turtle_manager_test$(EXEEXT): $(ags_check_system_turtle_manager_test_OBJECTS) $(ags_check_system_turtle_manager_test_DEPENDENCIES) $(EXTRA_ags_check_system_turtle_manager_test_DEPENDENCIES) @rm -f ags_check_system_turtle_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_turtle_manager_test_LINK) $(ags_check_system_turtle_manager_test_OBJECTS) $(ags_check_system_turtle_manager_test_LDADD) $(LIBS) ags/test/lib/check_system_turtle_test-ags_turtle_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) ags_check_system_turtle_test$(EXEEXT): $(ags_check_system_turtle_test_OBJECTS) $(ags_check_system_turtle_test_DEPENDENCIES) $(EXTRA_ags_check_system_turtle_test_DEPENDENCIES) @rm -f ags_check_system_turtle_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_turtle_test_LINK) $(ags_check_system_turtle_test_OBJECTS) $(ags_check_system_turtle_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_volume_audio_signal_test-ags_volume_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_volume_audio_signal_test$(EXEEXT): $(ags_check_system_volume_audio_signal_test_OBJECTS) $(ags_check_system_volume_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_check_system_volume_audio_signal_test_DEPENDENCIES) @rm -f ags_check_system_volume_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_volume_audio_signal_test_LINK) $(ags_check_system_volume_audio_signal_test_OBJECTS) $(ags_check_system_volume_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/check_system_volume_channel_test-ags_volume_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) ags_check_system_volume_channel_test$(EXEEXT): $(ags_check_system_volume_channel_test_OBJECTS) $(ags_check_system_volume_channel_test_DEPENDENCIES) $(EXTRA_ags_check_system_volume_channel_test_DEPENDENCIES) @rm -f ags_check_system_volume_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_volume_channel_test_LINK) $(ags_check_system_volume_channel_test_OBJECTS) $(ags_check_system_volume_channel_test_LDADD) $(LIBS) ags/test/audio/check_system_wave_test-ags_wave_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_wave_test$(EXEEXT): $(ags_check_system_wave_test_OBJECTS) $(ags_check_system_wave_test_DEPENDENCIES) $(EXTRA_ags_check_system_wave_test_DEPENDENCIES) @rm -f ags_check_system_wave_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_wave_test_LINK) $(ags_check_system_wave_test_OBJECTS) $(ags_check_system_wave_test_LDADD) $(LIBS) ags/test/thread/check_system_worker_thread_test-ags_worker_thread_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) ags_check_system_worker_thread_test$(EXEEXT): $(ags_check_system_worker_thread_test_OBJECTS) $(ags_check_system_worker_thread_test_DEPENDENCIES) $(EXTRA_ags_check_system_worker_thread_test_DEPENDENCIES) @rm -f ags_check_system_worker_thread_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_worker_thread_test_LINK) $(ags_check_system_worker_thread_test_OBJECTS) $(ags_check_system_worker_thread_test_LDADD) $(LIBS) ags/test/server/security/check_system_xml_authentication_test-ags_xml_authentication_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_xml_authentication_test$(EXEEXT): $(ags_check_system_xml_authentication_test_OBJECTS) $(ags_check_system_xml_authentication_test_DEPENDENCIES) $(EXTRA_ags_check_system_xml_authentication_test_DEPENDENCIES) @rm -f ags_check_system_xml_authentication_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_xml_authentication_test_LINK) $(ags_check_system_xml_authentication_test_OBJECTS) $(ags_check_system_xml_authentication_test_LDADD) $(LIBS) ags/test/server/security/check_system_xml_business_group_test-ags_xml_business_group_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_xml_business_group_test$(EXEEXT): $(ags_check_system_xml_business_group_test_OBJECTS) $(ags_check_system_xml_business_group_test_DEPENDENCIES) $(EXTRA_ags_check_system_xml_business_group_test_DEPENDENCIES) @rm -f ags_check_system_xml_business_group_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_xml_business_group_test_LINK) $(ags_check_system_xml_business_group_test_OBJECTS) $(ags_check_system_xml_business_group_test_LDADD) $(LIBS) ags/test/server/security/check_system_xml_certificate_test-ags_xml_certificate_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_xml_certificate_test$(EXEEXT): $(ags_check_system_xml_certificate_test_OBJECTS) $(ags_check_system_xml_certificate_test_DEPENDENCIES) $(EXTRA_ags_check_system_xml_certificate_test_DEPENDENCIES) @rm -f ags_check_system_xml_certificate_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_xml_certificate_test_LINK) $(ags_check_system_xml_certificate_test_OBJECTS) $(ags_check_system_xml_certificate_test_LDADD) $(LIBS) ags/test/server/security/check_system_xml_password_store_test-ags_xml_password_store_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) ags_check_system_xml_password_store_test$(EXEEXT): $(ags_check_system_xml_password_store_test_OBJECTS) $(ags_check_system_xml_password_store_test_DEPENDENCIES) $(EXTRA_ags_check_system_xml_password_store_test_DEPENDENCIES) @rm -f ags_check_system_xml_password_store_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_xml_password_store_test_LINK) $(ags_check_system_xml_password_store_test_OBJECTS) $(ags_check_system_xml_password_store_test_LDADD) $(LIBS) ags/test/X/$(am__dirstamp): @$(MKDIR_P) ags/test/X @: > ags/test/X/$(am__dirstamp) ags/test/X/check_system_xorg_application_context_test-ags_xorg_application_context_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_xorg_application_context_test$(EXEEXT): $(ags_check_system_xorg_application_context_test_OBJECTS) $(ags_check_system_xorg_application_context_test_DEPENDENCIES) $(EXTRA_ags_check_system_xorg_application_context_test_DEPENDENCIES) @rm -f ags_check_system_xorg_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_xorg_application_context_test_LINK) $(ags_check_system_xorg_application_context_test_OBJECTS) $(ags_check_system_xorg_application_context_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ags/test/X/*.$(OBJEXT) -rm -f ags/test/audio/*.$(OBJEXT) -rm -f ags/test/audio/midi/*.$(OBJEXT) -rm -f ags/test/audio/osc/*.$(OBJEXT) -rm -f ags/test/audio/osc/controller/*.$(OBJEXT) -rm -f ags/test/audio/osc/xmlrpc/*.$(OBJEXT) -rm -f ags/test/audio/recall/*.$(OBJEXT) -rm -f ags/test/audio/task/*.$(OBJEXT) -rm -f ags/test/file/*.$(OBJEXT) -rm -f ags/test/lib/*.$(OBJEXT) -rm -f ags/test/object/*.$(OBJEXT) -rm -f ags/test/plugin/*.$(OBJEXT) -rm -f ags/test/server/*.$(OBJEXT) -rm -f ags/test/server/controller/*.$(OBJEXT) -rm -f ags/test/server/security/*.$(OBJEXT) -rm -f ags/test/thread/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< ags/test/audio/check_system_acceleration_test-ags_acceleration_test.o: ags/test/audio/ags_acceleration_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_acceleration_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_acceleration_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_acceleration_test-ags_acceleration_test.o `test -f 'ags/test/audio/ags_acceleration_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_acceleration_test.c ags/test/audio/check_system_acceleration_test-ags_acceleration_test.obj: ags/test/audio/ags_acceleration_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_acceleration_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_acceleration_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_acceleration_test-ags_acceleration_test.obj `if test -f 'ags/test/audio/ags_acceleration_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_acceleration_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_acceleration_test.c'; fi` ags/test/audio/task/check_system_add_audio_signal_test-ags_add_audio_signal_test.o: ags/test/audio/task/ags_add_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_audio_signal_test-ags_add_audio_signal_test.o `test -f 'ags/test/audio/task/ags_add_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_audio_signal_test.c ags/test/audio/task/check_system_add_audio_signal_test-ags_add_audio_signal_test.obj: ags/test/audio/task/ags_add_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_audio_signal_test-ags_add_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_add_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_audio_signal_test.c'; fi` ags/test/audio/task/check_system_add_audio_test-ags_add_audio_test.o: ags/test/audio/task/ags_add_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_audio_test-ags_add_audio_test.o `test -f 'ags/test/audio/task/ags_add_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_audio_test.c ags/test/audio/task/check_system_add_audio_test-ags_add_audio_test.obj: ags/test/audio/task/ags_add_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_audio_test-ags_add_audio_test.obj `if test -f 'ags/test/audio/task/ags_add_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_audio_test.c'; fi` ags/test/audio/task/check_system_add_effect_test-ags_add_effect_test.o: ags/test/audio/task/ags_add_effect_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_effect_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_effect_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_effect_test-ags_add_effect_test.o `test -f 'ags/test/audio/task/ags_add_effect_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_effect_test.c ags/test/audio/task/check_system_add_effect_test-ags_add_effect_test.obj: ags/test/audio/task/ags_add_effect_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_effect_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_effect_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_effect_test-ags_add_effect_test.obj `if test -f 'ags/test/audio/task/ags_add_effect_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_effect_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_effect_test.c'; fi` ags/test/audio/task/check_system_add_note_test-ags_add_note_test.o: ags/test/audio/task/ags_add_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_note_test-ags_add_note_test.o `test -f 'ags/test/audio/task/ags_add_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_note_test.c ags/test/audio/task/check_system_add_note_test-ags_add_note_test.obj: ags/test/audio/task/ags_add_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_note_test-ags_add_note_test.obj `if test -f 'ags/test/audio/task/ags_add_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_note_test.c'; fi` ags/test/audio/task/check_system_add_soundcard_test-ags_add_soundcard_test.o: ags/test/audio/task/ags_add_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_soundcard_test-ags_add_soundcard_test.o `test -f 'ags/test/audio/task/ags_add_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_soundcard_test.c ags/test/audio/task/check_system_add_soundcard_test-ags_add_soundcard_test.obj: ags/test/audio/task/ags_add_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_add_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_add_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_add_soundcard_test-ags_add_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_add_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_soundcard_test.c'; fi` ags/test/audio/recall/check_system_analyse_audio_signal_test-ags_analyse_audio_signal_test.o: ags/test/audio/recall/ags_analyse_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_analyse_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_analyse_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_analyse_audio_signal_test-ags_analyse_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_analyse_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_analyse_audio_signal_test.c ags/test/audio/recall/check_system_analyse_audio_signal_test-ags_analyse_audio_signal_test.obj: ags/test/audio/recall/ags_analyse_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_analyse_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_analyse_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_analyse_audio_signal_test-ags_analyse_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_analyse_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_analyse_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_analyse_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_analyse_channel_test-ags_analyse_channel_test.o: ags/test/audio/recall/ags_analyse_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_analyse_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_analyse_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_analyse_channel_test-ags_analyse_channel_test.o `test -f 'ags/test/audio/recall/ags_analyse_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_analyse_channel_test.c ags/test/audio/recall/check_system_analyse_channel_test-ags_analyse_channel_test.obj: ags/test/audio/recall/ags_analyse_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_analyse_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_analyse_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_analyse_channel_test-ags_analyse_channel_test.obj `if test -f 'ags/test/audio/recall/ags_analyse_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_analyse_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_analyse_channel_test.c'; fi` ags/test/object/check_system_application_context_test-ags_application_context_test.o: ags/test/object/ags_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_application_context_test-ags_application_context_test.o `test -f 'ags/test/object/ags_application_context_test.c' || echo '$(srcdir)/'`ags/test/object/ags_application_context_test.c ags/test/object/check_system_application_context_test-ags_application_context_test.obj: ags/test/object/ags_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_application_context_test-ags_application_context_test.obj `if test -f 'ags/test/object/ags_application_context_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_application_context_test.c'; fi` ags/test/audio/task/check_system_apply_bpm_test-ags_apply_bpm_test.o: ags/test/audio/task/ags_apply_bpm_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_bpm_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_bpm_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_bpm_test-ags_apply_bpm_test.o `test -f 'ags/test/audio/task/ags_apply_bpm_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_bpm_test.c ags/test/audio/task/check_system_apply_bpm_test-ags_apply_bpm_test.obj: ags/test/audio/task/ags_apply_bpm_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_bpm_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_bpm_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_bpm_test-ags_apply_bpm_test.obj `if test -f 'ags/test/audio/task/ags_apply_bpm_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_bpm_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_bpm_test.c'; fi` ags/test/audio/task/check_system_apply_presets_test-ags_apply_presets_test.o: ags/test/audio/task/ags_apply_presets_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_presets_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_presets_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_presets_test-ags_apply_presets_test.o `test -f 'ags/test/audio/task/ags_apply_presets_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_presets_test.c ags/test/audio/task/check_system_apply_presets_test-ags_apply_presets_test.obj: ags/test/audio/task/ags_apply_presets_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_presets_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_presets_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_presets_test-ags_apply_presets_test.obj `if test -f 'ags/test/audio/task/ags_apply_presets_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_presets_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_presets_test.c'; fi` ags/test/audio/task/check_system_apply_sequencer_length_test-ags_apply_sequencer_length_test.o: ags/test/audio/task/ags_apply_sequencer_length_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_sequencer_length_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_sequencer_length_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_sequencer_length_test-ags_apply_sequencer_length_test.o `test -f 'ags/test/audio/task/ags_apply_sequencer_length_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_sequencer_length_test.c ags/test/audio/task/check_system_apply_sequencer_length_test-ags_apply_sequencer_length_test.obj: ags/test/audio/task/ags_apply_sequencer_length_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_sequencer_length_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_sequencer_length_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_sequencer_length_test-ags_apply_sequencer_length_test.obj `if test -f 'ags/test/audio/task/ags_apply_sequencer_length_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_sequencer_length_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_sequencer_length_test.c'; fi` ags/test/audio/task/check_system_apply_synth_test-ags_apply_synth_test.o: ags/test/audio/task/ags_apply_synth_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_synth_test-ags_apply_synth_test.o `test -f 'ags/test/audio/task/ags_apply_synth_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_synth_test.c ags/test/audio/task/check_system_apply_synth_test-ags_apply_synth_test.obj: ags/test/audio/task/ags_apply_synth_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_synth_test-ags_apply_synth_test.obj `if test -f 'ags/test/audio/task/ags_apply_synth_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_synth_test.c'; fi` ags/test/audio/task/check_system_apply_tact_test-ags_apply_tact_test.o: ags/test/audio/task/ags_apply_tact_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_tact_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_tact_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_tact_test-ags_apply_tact_test.o `test -f 'ags/test/audio/task/ags_apply_tact_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_tact_test.c ags/test/audio/task/check_system_apply_tact_test-ags_apply_tact_test.obj: ags/test/audio/task/ags_apply_tact_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_apply_tact_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_apply_tact_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_apply_tact_test-ags_apply_tact_test.obj `if test -f 'ags/test/audio/task/ags_apply_tact_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_tact_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_tact_test.c'; fi` ags/test/audio/check_system_audio_application_context_test-ags_audio_application_context_test.o: ags/test/audio/ags_audio_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_application_context_test-ags_audio_application_context_test.o `test -f 'ags/test/audio/ags_audio_application_context_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_application_context_test.c ags/test/audio/check_system_audio_application_context_test-ags_audio_application_context_test.obj: ags/test/audio/ags_audio_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_application_context_test-ags_audio_application_context_test.obj `if test -f 'ags/test/audio/ags_audio_application_context_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_application_context_test.c'; fi` ags/test/audio/check_system_audio_buffer_util_test-ags_audio_buffer_util_test.o: ags/test/audio/ags_audio_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_buffer_util_test-ags_audio_buffer_util_test.o `test -f 'ags/test/audio/ags_audio_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_buffer_util_test.c ags/test/audio/check_system_audio_buffer_util_test-ags_audio_buffer_util_test.obj: ags/test/audio/ags_audio_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_buffer_util_test-ags_audio_buffer_util_test.obj `if test -f 'ags/test/audio/ags_audio_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_buffer_util_test.c'; fi` ags/test/audio/check_system_audio_signal_test-ags_audio_signal_test.o: ags/test/audio/ags_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_signal_test-ags_audio_signal_test.o `test -f 'ags/test/audio/ags_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_signal_test.c ags/test/audio/check_system_audio_signal_test-ags_audio_signal_test.obj: ags/test/audio/ags_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_signal_test-ags_audio_signal_test.obj `if test -f 'ags/test/audio/ags_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_signal_test.c'; fi` ags/test/audio/check_system_audio_test-ags_audio_test.o: ags/test/audio/ags_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_test-ags_audio_test.o `test -f 'ags/test/audio/ags_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_test.c ags/test/audio/check_system_audio_test-ags_audio_test.obj: ags/test/audio/ags_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_audio_test-ags_audio_test.obj `if test -f 'ags/test/audio/ags_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_test.c'; fi` ags/test/server/security/check_system_authentication_manager_test-ags_authentication_manager_test.o: ags/test/server/security/ags_authentication_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_authentication_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_authentication_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_authentication_manager_test-ags_authentication_manager_test.o `test -f 'ags/test/server/security/ags_authentication_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_authentication_manager_test.c ags/test/server/security/check_system_authentication_manager_test-ags_authentication_manager_test.obj: ags/test/server/security/ags_authentication_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_authentication_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_authentication_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_authentication_manager_test-ags_authentication_manager_test.obj `if test -f 'ags/test/server/security/ags_authentication_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_authentication_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_authentication_manager_test.c'; fi` ags/test/audio/check_system_automation_test-ags_automation_test.o: ags/test/audio/ags_automation_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_automation_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_automation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_automation_test-ags_automation_test.o `test -f 'ags/test/audio/ags_automation_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_automation_test.c ags/test/audio/check_system_automation_test-ags_automation_test.obj: ags/test/audio/ags_automation_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_automation_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_automation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_automation_test-ags_automation_test.obj `if test -f 'ags/test/audio/ags_automation_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_automation_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_automation_test.c'; fi` ags/test/plugin/check_system_base_plugin_test-ags_base_plugin_test.o: ags/test/plugin/ags_base_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_base_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_base_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_base_plugin_test-ags_base_plugin_test.o `test -f 'ags/test/plugin/ags_base_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_base_plugin_test.c ags/test/plugin/check_system_base_plugin_test-ags_base_plugin_test.obj: ags/test/plugin/ags_base_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_base_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_base_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_base_plugin_test-ags_base_plugin_test.obj `if test -f 'ags/test/plugin/ags_base_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_base_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_base_plugin_test.c'; fi` ags/test/audio/recall/check_system_buffer_audio_signal_test-ags_buffer_audio_signal_test.o: ags/test/audio/recall/ags_buffer_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_buffer_audio_signal_test-ags_buffer_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_buffer_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_buffer_audio_signal_test.c ags/test/audio/recall/check_system_buffer_audio_signal_test-ags_buffer_audio_signal_test.obj: ags/test/audio/recall/ags_buffer_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_buffer_audio_signal_test-ags_buffer_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_buffer_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_buffer_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_buffer_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_buffer_channel_test-ags_buffer_channel_test.o: ags/test/audio/recall/ags_buffer_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_buffer_channel_test-ags_buffer_channel_test.o `test -f 'ags/test/audio/recall/ags_buffer_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_buffer_channel_test.c ags/test/audio/recall/check_system_buffer_channel_test-ags_buffer_channel_test.obj: ags/test/audio/recall/ags_buffer_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_buffer_channel_test-ags_buffer_channel_test.obj `if test -f 'ags/test/audio/recall/ags_buffer_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_buffer_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_buffer_channel_test.c'; fi` ags/test/audio/check_system_buffer_test-ags_buffer_test.o: ags/test/audio/ags_buffer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_buffer_test-ags_buffer_test.o `test -f 'ags/test/audio/ags_buffer_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_buffer_test.c ags/test/audio/check_system_buffer_test-ags_buffer_test.obj: ags/test/audio/ags_buffer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_buffer_test-ags_buffer_test.obj `if test -f 'ags/test/audio/ags_buffer_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_buffer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_buffer_test.c'; fi` ags/test/lib/check_system_buffer_util_test-ags_buffer_util_test.o: ags/test/lib/ags_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_buffer_util_test-ags_buffer_util_test.o `test -f 'ags/test/lib/ags_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_buffer_util_test.c ags/test/lib/check_system_buffer_util_test-ags_buffer_util_test.obj: ags/test/lib/ags_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_buffer_util_test-ags_buffer_util_test.obj `if test -f 'ags/test/lib/ags_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_buffer_util_test.c'; fi` ags/test/server/security/check_system_business_group_manager_test-ags_business_group_manager_test.o: ags/test/server/security/ags_business_group_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_business_group_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_business_group_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_business_group_manager_test-ags_business_group_manager_test.o `test -f 'ags/test/server/security/ags_business_group_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_business_group_manager_test.c ags/test/server/security/check_system_business_group_manager_test-ags_business_group_manager_test.obj: ags/test/server/security/ags_business_group_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_business_group_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_business_group_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_business_group_manager_test-ags_business_group_manager_test.obj `if test -f 'ags/test/server/security/ags_business_group_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_business_group_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_business_group_manager_test.c'; fi` ags/test/audio/task/check_system_cancel_audio_test-ags_cancel_audio_test.o: ags/test/audio/task/ags_cancel_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_cancel_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_cancel_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_cancel_audio_test-ags_cancel_audio_test.o `test -f 'ags/test/audio/task/ags_cancel_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_cancel_audio_test.c ags/test/audio/task/check_system_cancel_audio_test-ags_cancel_audio_test.obj: ags/test/audio/task/ags_cancel_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_cancel_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_cancel_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_cancel_audio_test-ags_cancel_audio_test.obj `if test -f 'ags/test/audio/task/ags_cancel_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_cancel_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_cancel_audio_test.c'; fi` ags/test/audio/task/check_system_cancel_channel_test-ags_cancel_channel_test.o: ags/test/audio/task/ags_cancel_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_cancel_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_cancel_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_cancel_channel_test-ags_cancel_channel_test.o `test -f 'ags/test/audio/task/ags_cancel_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_cancel_channel_test.c ags/test/audio/task/check_system_cancel_channel_test-ags_cancel_channel_test.obj: ags/test/audio/task/ags_cancel_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_cancel_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_cancel_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_cancel_channel_test-ags_cancel_channel_test.obj `if test -f 'ags/test/audio/task/ags_cancel_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_cancel_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_cancel_channel_test.c'; fi` ags/test/audio/recall/check_system_capture_wave_audio_test-ags_capture_wave_audio_test.o: ags/test/audio/recall/ags_capture_wave_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_capture_wave_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_capture_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_capture_wave_audio_test-ags_capture_wave_audio_test.o `test -f 'ags/test/audio/recall/ags_capture_wave_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_capture_wave_audio_test.c ags/test/audio/recall/check_system_capture_wave_audio_test-ags_capture_wave_audio_test.obj: ags/test/audio/recall/ags_capture_wave_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_capture_wave_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_capture_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_capture_wave_audio_test-ags_capture_wave_audio_test.obj `if test -f 'ags/test/audio/recall/ags_capture_wave_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_capture_wave_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_capture_wave_audio_test.c'; fi` ags/test/audio/recall/check_system_capture_wave_channel_test-ags_capture_wave_channel_test.o: ags/test/audio/recall/ags_capture_wave_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_capture_wave_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_capture_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_capture_wave_channel_test-ags_capture_wave_channel_test.o `test -f 'ags/test/audio/recall/ags_capture_wave_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_capture_wave_channel_test.c ags/test/audio/recall/check_system_capture_wave_channel_test-ags_capture_wave_channel_test.obj: ags/test/audio/recall/ags_capture_wave_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_capture_wave_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_capture_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_capture_wave_channel_test-ags_capture_wave_channel_test.obj `if test -f 'ags/test/audio/recall/ags_capture_wave_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_capture_wave_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_capture_wave_channel_test.c'; fi` ags/test/server/security/check_system_certificate_manager_test-ags_certificate_manager_test.o: ags/test/server/security/ags_certificate_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_certificate_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_certificate_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_certificate_manager_test-ags_certificate_manager_test.o `test -f 'ags/test/server/security/ags_certificate_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_certificate_manager_test.c ags/test/server/security/check_system_certificate_manager_test-ags_certificate_manager_test.obj: ags/test/server/security/ags_certificate_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_certificate_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_certificate_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_certificate_manager_test-ags_certificate_manager_test.obj `if test -f 'ags/test/server/security/ags_certificate_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_certificate_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_certificate_manager_test.c'; fi` ags/test/audio/check_system_channel_test-ags_channel_test.o: ags/test/audio/ags_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_channel_test-ags_channel_test.o `test -f 'ags/test/audio/ags_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_channel_test.c ags/test/audio/check_system_channel_test-ags_channel_test.obj: ags/test/audio/ags_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_channel_test-ags_channel_test.obj `if test -f 'ags/test/audio/ags_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_channel_test.c'; fi` ags/test/audio/check_system_char_buffer_util_test-ags_char_buffer_util_test.o: ags/test/audio/ags_char_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_char_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_char_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_char_buffer_util_test-ags_char_buffer_util_test.o `test -f 'ags/test/audio/ags_char_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_char_buffer_util_test.c ags/test/audio/check_system_char_buffer_util_test-ags_char_buffer_util_test.obj: ags/test/audio/ags_char_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_char_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_char_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_char_buffer_util_test-ags_char_buffer_util_test.obj `if test -f 'ags/test/audio/ags_char_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_char_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_char_buffer_util_test.c'; fi` ags/test/audio/task/check_system_clear_audio_signal_test-ags_clear_audio_signal_test.o: ags/test/audio/task/ags_clear_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_clear_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_clear_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_clear_audio_signal_test-ags_clear_audio_signal_test.o `test -f 'ags/test/audio/task/ags_clear_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_clear_audio_signal_test.c ags/test/audio/task/check_system_clear_audio_signal_test-ags_clear_audio_signal_test.obj: ags/test/audio/task/ags_clear_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_clear_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_clear_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_clear_audio_signal_test-ags_clear_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_clear_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_clear_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_clear_audio_signal_test.c'; fi` ags/test/audio/task/check_system_clear_buffer_test-ags_clear_buffer_test.o: ags/test/audio/task/ags_clear_buffer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_clear_buffer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_clear_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_clear_buffer_test-ags_clear_buffer_test.o `test -f 'ags/test/audio/task/ags_clear_buffer_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_clear_buffer_test.c ags/test/audio/task/check_system_clear_buffer_test-ags_clear_buffer_test.obj: ags/test/audio/task/ags_clear_buffer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_clear_buffer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_clear_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_clear_buffer_test-ags_clear_buffer_test.obj `if test -f 'ags/test/audio/task/ags_clear_buffer_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_clear_buffer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_clear_buffer_test.c'; fi` ags/test/lib/check_system_complex_test-ags_complex_test.o: ags/test/lib/ags_complex_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_complex_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_complex_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_complex_test-ags_complex_test.o `test -f 'ags/test/lib/ags_complex_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_complex_test.c ags/test/lib/check_system_complex_test-ags_complex_test.obj: ags/test/lib/ags_complex_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_complex_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_complex_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_complex_test-ags_complex_test.obj `if test -f 'ags/test/lib/ags_complex_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_complex_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_complex_test.c'; fi` ags/test/object/check_system_config_test-ags_config_test.o: ags/test/object/ags_config_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_config_test-ags_config_test.o `test -f 'ags/test/object/ags_config_test.c' || echo '$(srcdir)/'`ags/test/object/ags_config_test.c ags/test/object/check_system_config_test-ags_config_test.obj: ags/test/object/ags_config_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_config_test-ags_config_test.obj `if test -f 'ags/test/object/ags_config_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_config_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_config_test.c'; fi` ags/test/object/check_system_connectable_test-ags_connectable_test.o: ags/test/object/ags_connectable_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_connectable_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_connectable_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_connectable_test-ags_connectable_test.o `test -f 'ags/test/object/ags_connectable_test.c' || echo '$(srcdir)/'`ags/test/object/ags_connectable_test.c ags/test/object/check_system_connectable_test-ags_connectable_test.obj: ags/test/object/ags_connectable_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_connectable_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_connectable_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_connectable_test-ags_connectable_test.obj `if test -f 'ags/test/object/ags_connectable_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_connectable_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_connectable_test.c'; fi` ags/test/server/controller/check_system_controller_test-ags_controller_test.o: ags/test/server/controller/ags_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/check_system_controller_test-ags_controller_test.o `test -f 'ags/test/server/controller/ags_controller_test.c' || echo '$(srcdir)/'`ags/test/server/controller/ags_controller_test.c ags/test/server/controller/check_system_controller_test-ags_controller_test.obj: ags/test/server/controller/ags_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/check_system_controller_test-ags_controller_test.obj `if test -f 'ags/test/server/controller/ags_controller_test.c'; then $(CYGPATH_W) 'ags/test/server/controller/ags_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/controller/ags_controller_test.c'; fi` ags/test/lib/check_system_conversion_test-ags_conversion_test.o: ags/test/lib/ags_conversion_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_conversion_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_conversion_test-ags_conversion_test.o `test -f 'ags/test/lib/ags_conversion_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_conversion_test.c ags/test/lib/check_system_conversion_test-ags_conversion_test.obj: ags/test/lib/ags_conversion_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_conversion_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_conversion_test-ags_conversion_test.obj `if test -f 'ags/test/lib/ags_conversion_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_conversion_test.c'; fi` ags/test/audio/recall/check_system_copy_audio_signal_test-ags_copy_audio_signal_test.o: ags/test/audio/recall/ags_copy_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_audio_signal_test-ags_copy_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_copy_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_audio_signal_test.c ags/test/audio/recall/check_system_copy_audio_signal_test-ags_copy_audio_signal_test.obj: ags/test/audio/recall/ags_copy_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_audio_signal_test-ags_copy_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_copy_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_copy_channel_test-ags_copy_channel_test.o: ags/test/audio/recall/ags_copy_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_channel_test-ags_copy_channel_test.o `test -f 'ags/test/audio/recall/ags_copy_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_channel_test.c ags/test/audio/recall/check_system_copy_channel_test-ags_copy_channel_test.obj: ags/test/audio/recall/ags_copy_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_channel_test-ags_copy_channel_test.obj `if test -f 'ags/test/audio/recall/ags_copy_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_channel_test.c'; fi` ags/test/audio/recall/check_system_copy_pattern_audio_test-ags_copy_pattern_audio_test.o: ags/test/audio/recall/ags_copy_pattern_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_pattern_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_pattern_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_pattern_audio_test-ags_copy_pattern_audio_test.o `test -f 'ags/test/audio/recall/ags_copy_pattern_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_pattern_audio_test.c ags/test/audio/recall/check_system_copy_pattern_audio_test-ags_copy_pattern_audio_test.obj: ags/test/audio/recall/ags_copy_pattern_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_pattern_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_pattern_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_pattern_audio_test-ags_copy_pattern_audio_test.obj `if test -f 'ags/test/audio/recall/ags_copy_pattern_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_pattern_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_pattern_audio_test.c'; fi` ags/test/audio/recall/check_system_copy_pattern_channel_test-ags_copy_pattern_channel_test.o: ags/test/audio/recall/ags_copy_pattern_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_pattern_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_pattern_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_pattern_channel_test-ags_copy_pattern_channel_test.o `test -f 'ags/test/audio/recall/ags_copy_pattern_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_pattern_channel_test.c ags/test/audio/recall/check_system_copy_pattern_channel_test-ags_copy_pattern_channel_test.obj: ags/test/audio/recall/ags_copy_pattern_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_copy_pattern_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_copy_pattern_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_copy_pattern_channel_test-ags_copy_pattern_channel_test.obj `if test -f 'ags/test/audio/recall/ags_copy_pattern_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_pattern_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_pattern_channel_test.c'; fi` ags/test/audio/recall/check_system_count_beats_audio_test-ags_count_beats_audio_test.o: ags/test/audio/recall/ags_count_beats_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_count_beats_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_count_beats_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_count_beats_audio_test-ags_count_beats_audio_test.o `test -f 'ags/test/audio/recall/ags_count_beats_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_count_beats_audio_test.c ags/test/audio/recall/check_system_count_beats_audio_test-ags_count_beats_audio_test.obj: ags/test/audio/recall/ags_count_beats_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_count_beats_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_count_beats_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_count_beats_audio_test-ags_count_beats_audio_test.obj `if test -f 'ags/test/audio/recall/ags_count_beats_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_count_beats_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_count_beats_audio_test.c'; fi` ags/test/audio/task/check_system_crop_note_test-ags_crop_note_test.o: ags/test/audio/task/ags_crop_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_crop_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_crop_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_crop_note_test-ags_crop_note_test.o `test -f 'ags/test/audio/task/ags_crop_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_crop_note_test.c ags/test/audio/task/check_system_crop_note_test-ags_crop_note_test.obj: ags/test/audio/task/ags_crop_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_crop_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_crop_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_crop_note_test-ags_crop_note_test.obj `if test -f 'ags/test/audio/task/ags_crop_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_crop_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_crop_note_test.c'; fi` ags/test/audio/recall/check_system_delay_audio_test-ags_delay_audio_test.o: ags/test/audio/recall/ags_delay_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_delay_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_delay_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_delay_audio_test-ags_delay_audio_test.o `test -f 'ags/test/audio/recall/ags_delay_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_delay_audio_test.c ags/test/audio/recall/check_system_delay_audio_test-ags_delay_audio_test.obj: ags/test/audio/recall/ags_delay_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_delay_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_delay_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_delay_audio_test-ags_delay_audio_test.obj `if test -f 'ags/test/audio/recall/ags_delay_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_delay_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_delay_audio_test.c'; fi` ags/test/thread/check_system_destroy_worker_test-ags_destroy_worker_test.o: ags/test/thread/ags_destroy_worker_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_destroy_worker_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_destroy_worker_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_destroy_worker_test-ags_destroy_worker_test.o `test -f 'ags/test/thread/ags_destroy_worker_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_destroy_worker_test.c ags/test/thread/check_system_destroy_worker_test-ags_destroy_worker_test.obj: ags/test/thread/ags_destroy_worker_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_destroy_worker_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_destroy_worker_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_destroy_worker_test-ags_destroy_worker_test.obj `if test -f 'ags/test/thread/ags_destroy_worker_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_destroy_worker_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_destroy_worker_test.c'; fi` ags/test/audio/check_system_devin_test-ags_devin_test.o: ags/test/audio/ags_devin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_devin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_devin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_devin_test-ags_devin_test.o `test -f 'ags/test/audio/ags_devin_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_devin_test.c ags/test/audio/check_system_devin_test-ags_devin_test.obj: ags/test/audio/ags_devin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_devin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_devin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_devin_test-ags_devin_test.obj `if test -f 'ags/test/audio/ags_devin_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_devin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_devin_test.c'; fi` ags/test/audio/check_system_devout_test-ags_devout_test.o: ags/test/audio/ags_devout_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_devout_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_devout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_devout_test-ags_devout_test.o `test -f 'ags/test/audio/ags_devout_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_devout_test.c ags/test/audio/check_system_devout_test-ags_devout_test.obj: ags/test/audio/ags_devout_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_devout_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_devout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_devout_test-ags_devout_test.obj `if test -f 'ags/test/audio/ags_devout_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_devout_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_devout_test.c'; fi` ags/test/plugin/check_system_dssi_manager_test-ags_dssi_manager_test.o: ags/test/plugin/ags_dssi_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_dssi_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_dssi_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_dssi_manager_test-ags_dssi_manager_test.o `test -f 'ags/test/plugin/ags_dssi_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_dssi_manager_test.c ags/test/plugin/check_system_dssi_manager_test-ags_dssi_manager_test.obj: ags/test/plugin/ags_dssi_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_dssi_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_dssi_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_dssi_manager_test-ags_dssi_manager_test.obj `if test -f 'ags/test/plugin/ags_dssi_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_dssi_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_dssi_manager_test.c'; fi` ags/test/plugin/check_system_dssi_plugin_test-ags_dssi_plugin_test.o: ags/test/plugin/ags_dssi_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_dssi_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_dssi_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_dssi_plugin_test-ags_dssi_plugin_test.o `test -f 'ags/test/plugin/ags_dssi_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_dssi_plugin_test.c ags/test/plugin/check_system_dssi_plugin_test-ags_dssi_plugin_test.obj: ags/test/plugin/ags_dssi_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_dssi_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_dssi_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_dssi_plugin_test-ags_dssi_plugin_test.obj `if test -f 'ags/test/plugin/ags_dssi_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_dssi_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_dssi_plugin_test.c'; fi` ags/test/audio/recall/check_system_envelope_audio_signal_test-ags_envelope_audio_signal_test.o: ags/test/audio/recall/ags_envelope_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_envelope_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_envelope_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_envelope_audio_signal_test-ags_envelope_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_envelope_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_envelope_audio_signal_test.c ags/test/audio/recall/check_system_envelope_audio_signal_test-ags_envelope_audio_signal_test.obj: ags/test/audio/recall/ags_envelope_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_envelope_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_envelope_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_envelope_audio_signal_test-ags_envelope_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_envelope_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_envelope_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_envelope_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_envelope_channel_test-ags_envelope_channel_test.o: ags/test/audio/recall/ags_envelope_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_envelope_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_envelope_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_envelope_channel_test-ags_envelope_channel_test.o `test -f 'ags/test/audio/recall/ags_envelope_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_envelope_channel_test.c ags/test/audio/recall/check_system_envelope_channel_test-ags_envelope_channel_test.obj: ags/test/audio/recall/ags_envelope_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_envelope_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_envelope_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_envelope_channel_test-ags_envelope_channel_test.obj `if test -f 'ags/test/audio/recall/ags_envelope_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_envelope_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_envelope_channel_test.c'; fi` ags/test/audio/recall/check_system_eq10_audio_signal_test-ags_eq10_audio_signal_test.o: ags/test/audio/recall/ags_eq10_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_eq10_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_eq10_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_eq10_audio_signal_test-ags_eq10_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_eq10_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_eq10_audio_signal_test.c ags/test/audio/recall/check_system_eq10_audio_signal_test-ags_eq10_audio_signal_test.obj: ags/test/audio/recall/ags_eq10_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_eq10_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_eq10_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_eq10_audio_signal_test-ags_eq10_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_eq10_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_eq10_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_eq10_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_eq10_channel_test-ags_eq10_channel_test.o: ags/test/audio/recall/ags_eq10_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_eq10_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_eq10_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_eq10_channel_test-ags_eq10_channel_test.o `test -f 'ags/test/audio/recall/ags_eq10_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_eq10_channel_test.c ags/test/audio/recall/check_system_eq10_channel_test-ags_eq10_channel_test.obj: ags/test/audio/recall/ags_eq10_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_eq10_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_eq10_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_eq10_channel_test-ags_eq10_channel_test.obj `if test -f 'ags/test/audio/recall/ags_eq10_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_eq10_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_eq10_channel_test.c'; fi` ags/test/audio/task/check_system_export_output_test-ags_export_output_test.o: ags/test/audio/task/ags_export_output_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_export_output_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_export_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_export_output_test-ags_export_output_test.o `test -f 'ags/test/audio/task/ags_export_output_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_export_output_test.c ags/test/audio/task/check_system_export_output_test-ags_export_output_test.obj: ags/test/audio/task/ags_export_output_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_export_output_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_export_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_export_output_test-ags_export_output_test.obj `if test -f 'ags/test/audio/task/ags_export_output_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_export_output_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_export_output_test.c'; fi` ags/test/audio/recall/check_system_feed_audio_signal_test-ags_feed_audio_signal_test.o: ags/test/audio/recall/ags_feed_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_feed_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_feed_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_feed_audio_signal_test-ags_feed_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_feed_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_feed_audio_signal_test.c ags/test/audio/recall/check_system_feed_audio_signal_test-ags_feed_audio_signal_test.obj: ags/test/audio/recall/ags_feed_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_feed_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_feed_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_feed_audio_signal_test-ags_feed_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_feed_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_feed_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_feed_audio_signal_test.c'; fi` ags/test/audio/check_system_fifoout_test-ags_fifoout_test.o: ags/test/audio/ags_fifoout_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_fifoout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_fifoout_test-ags_fifoout_test.o `test -f 'ags/test/audio/ags_fifoout_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fifoout_test.c ags/test/audio/check_system_fifoout_test-ags_fifoout_test.obj: ags/test/audio/ags_fifoout_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_fifoout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_fifoout_test-ags_fifoout_test.obj `if test -f 'ags/test/audio/ags_fifoout_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fifoout_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fifoout_test.c'; fi` ags/test/file/check_system_file_id_ref_test-ags_file_id_ref_test.o: ags/test/file/ags_file_id_ref_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_id_ref_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_id_ref_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_id_ref_test-ags_file_id_ref_test.o `test -f 'ags/test/file/ags_file_id_ref_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_id_ref_test.c ags/test/file/check_system_file_id_ref_test-ags_file_id_ref_test.obj: ags/test/file/ags_file_id_ref_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_id_ref_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_id_ref_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_id_ref_test-ags_file_id_ref_test.obj `if test -f 'ags/test/file/ags_file_id_ref_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_id_ref_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_id_ref_test.c'; fi` ags/test/file/check_system_file_launch_test-ags_file_launch_test.o: ags/test/file/ags_file_launch_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_launch_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_launch_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_launch_test-ags_file_launch_test.o `test -f 'ags/test/file/ags_file_launch_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_launch_test.c ags/test/file/check_system_file_launch_test-ags_file_launch_test.obj: ags/test/file/ags_file_launch_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_launch_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_launch_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_launch_test-ags_file_launch_test.obj `if test -f 'ags/test/file/ags_file_launch_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_launch_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_launch_test.c'; fi` ags/test/file/check_system_file_lookup_test-ags_file_lookup_test.o: ags/test/file/ags_file_lookup_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_lookup_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_lookup_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_lookup_test-ags_file_lookup_test.o `test -f 'ags/test/file/ags_file_lookup_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_lookup_test.c ags/test/file/check_system_file_lookup_test-ags_file_lookup_test.obj: ags/test/file/ags_file_lookup_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_lookup_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_lookup_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_lookup_test-ags_file_lookup_test.obj `if test -f 'ags/test/file/ags_file_lookup_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_lookup_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_lookup_test.c'; fi` ags/test/file/check_system_file_test-ags_file_test.o: ags/test/file/ags_file_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_test-ags_file_test.o `test -f 'ags/test/file/ags_file_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_test.c ags/test/file/check_system_file_test-ags_file_test.obj: ags/test/file/ags_file_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_file_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_file_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/check_system_file_test-ags_file_test.obj `if test -f 'ags/test/file/ags_file_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_test.c'; fi` ags/test/audio/check_system_filter_util_test-ags_filter_util_test.o: ags/test/audio/ags_filter_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_filter_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_filter_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_filter_util_test-ags_filter_util_test.o `test -f 'ags/test/audio/ags_filter_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_filter_util_test.c ags/test/audio/check_system_filter_util_test-ags_filter_util_test.obj: ags/test/audio/ags_filter_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_filter_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_filter_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_filter_util_test-ags_filter_util_test.obj `if test -f 'ags/test/audio/ags_filter_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_filter_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_filter_util_test.c'; fi` ags/test/audio/check_system_fm_synth_util_test-ags_fm_synth_util_test.o: ags/test/audio/ags_fm_synth_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_fm_synth_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_fm_synth_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_fm_synth_util_test-ags_fm_synth_util_test.o `test -f 'ags/test/audio/ags_fm_synth_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fm_synth_util_test.c ags/test/audio/check_system_fm_synth_util_test-ags_fm_synth_util_test.obj: ags/test/audio/ags_fm_synth_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_fm_synth_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_fm_synth_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_fm_synth_util_test-ags_fm_synth_util_test.obj `if test -f 'ags/test/audio/ags_fm_synth_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fm_synth_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fm_synth_util_test.c'; fi` ags/test/audio/check_system_fourier_transform_util_test-ags_fourier_transform_util_test.o: ags/test/audio/ags_fourier_transform_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_fourier_transform_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_fourier_transform_util_test-ags_fourier_transform_util_test.o `test -f 'ags/test/audio/ags_fourier_transform_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fourier_transform_util_test.c ags/test/audio/check_system_fourier_transform_util_test-ags_fourier_transform_util_test.obj: ags/test/audio/ags_fourier_transform_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_fourier_transform_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_fourier_transform_util_test-ags_fourier_transform_util_test.obj `if test -f 'ags/test/audio/ags_fourier_transform_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fourier_transform_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fourier_transform_util_test.c'; fi` ags/test/audio/task/check_system_free_selection_test-ags_free_selection_test.o: ags/test/audio/task/ags_free_selection_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_free_selection_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_free_selection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_free_selection_test-ags_free_selection_test.o `test -f 'ags/test/audio/task/ags_free_selection_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_free_selection_test.c ags/test/audio/task/check_system_free_selection_test-ags_free_selection_test.obj: ags/test/audio/task/ags_free_selection_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_free_selection_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_free_selection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_free_selection_test-ags_free_selection_test.obj `if test -f 'ags/test/audio/task/ags_free_selection_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_free_selection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_free_selection_test.c'; fi` ags/test/server/controller/check_system_front_controller_test-ags_front_controller_test.o: ags/test/server/controller/ags_front_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_front_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/check_system_front_controller_test-ags_front_controller_test.o `test -f 'ags/test/server/controller/ags_front_controller_test.c' || echo '$(srcdir)/'`ags/test/server/controller/ags_front_controller_test.c ags/test/server/controller/check_system_front_controller_test-ags_front_controller_test.obj: ags/test/server/controller/ags_front_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_front_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/check_system_front_controller_test-ags_front_controller_test.obj `if test -f 'ags/test/server/controller/ags_front_controller_test.c'; then $(CYGPATH_W) 'ags/test/server/controller/ags_front_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/controller/ags_front_controller_test.c'; fi` ags/test/audio/check_system_input_test-ags_input_test.o: ags/test/audio/ags_input_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_input_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_input_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_input_test-ags_input_test.o `test -f 'ags/test/audio/ags_input_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_input_test.c ags/test/audio/check_system_input_test-ags_input_test.obj: ags/test/audio/ags_input_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_input_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_input_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_input_test-ags_input_test.obj `if test -f 'ags/test/audio/ags_input_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_input_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_input_test.c'; fi` ags/test/plugin/check_system_ladspa_conversion_test-ags_ladspa_conversion_test.o: ags/test/plugin/ags_ladspa_conversion_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_ladspa_conversion_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_ladspa_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_ladspa_conversion_test-ags_ladspa_conversion_test.o `test -f 'ags/test/plugin/ags_ladspa_conversion_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_ladspa_conversion_test.c ags/test/plugin/check_system_ladspa_conversion_test-ags_ladspa_conversion_test.obj: ags/test/plugin/ags_ladspa_conversion_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_ladspa_conversion_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_ladspa_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_ladspa_conversion_test-ags_ladspa_conversion_test.obj `if test -f 'ags/test/plugin/ags_ladspa_conversion_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_ladspa_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_ladspa_conversion_test.c'; fi` ags/test/plugin/check_system_ladspa_manager_test-ags_ladspa_manager_test.o: ags/test/plugin/ags_ladspa_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_ladspa_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_ladspa_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_ladspa_manager_test-ags_ladspa_manager_test.o `test -f 'ags/test/plugin/ags_ladspa_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_ladspa_manager_test.c ags/test/plugin/check_system_ladspa_manager_test-ags_ladspa_manager_test.obj: ags/test/plugin/ags_ladspa_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_ladspa_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_ladspa_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_ladspa_manager_test-ags_ladspa_manager_test.obj `if test -f 'ags/test/plugin/ags_ladspa_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_ladspa_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_ladspa_manager_test.c'; fi` ags/test/audio/task/check_system_link_channel_test-ags_link_channel_test.o: ags/test/audio/task/ags_link_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_link_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_link_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_link_channel_test-ags_link_channel_test.o `test -f 'ags/test/audio/task/ags_link_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_link_channel_test.c ags/test/audio/task/check_system_link_channel_test-ags_link_channel_test.obj: ags/test/audio/task/ags_link_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_link_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_link_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_link_channel_test-ags_link_channel_test.obj `if test -f 'ags/test/audio/task/ags_link_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_link_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_link_channel_test.c'; fi` ags/test/lib/check_system_log_test-ags_log_test.o: ags/test/lib/ags_log_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_log_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_log_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_log_test-ags_log_test.o `test -f 'ags/test/lib/ags_log_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_log_test.c ags/test/lib/check_system_log_test-ags_log_test.obj: ags/test/lib/ags_log_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_log_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_log_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_log_test-ags_log_test.obj `if test -f 'ags/test/lib/ags_log_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_log_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_log_test.c'; fi` ags/test/plugin/check_system_lv2_conversion_test-ags_lv2_conversion_test.o: ags/test/plugin/ags_lv2_conversion_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_conversion_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_conversion_test-ags_lv2_conversion_test.o `test -f 'ags/test/plugin/ags_lv2_conversion_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_conversion_test.c ags/test/plugin/check_system_lv2_conversion_test-ags_lv2_conversion_test.obj: ags/test/plugin/ags_lv2_conversion_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_conversion_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_conversion_test-ags_lv2_conversion_test.obj `if test -f 'ags/test/plugin/ags_lv2_conversion_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_conversion_test.c'; fi` ags/test/plugin/check_system_lv2_manager_test-ags_lv2_manager_test.o: ags/test/plugin/ags_lv2_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_manager_test-ags_lv2_manager_test.o `test -f 'ags/test/plugin/ags_lv2_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_manager_test.c ags/test/plugin/check_system_lv2_manager_test-ags_lv2_manager_test.obj: ags/test/plugin/ags_lv2_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_manager_test-ags_lv2_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_manager_test.c'; fi` ags/test/plugin/check_system_lv2_option_manager_test-ags_lv2_option_manager_test.o: ags/test/plugin/ags_lv2_option_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_option_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_option_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_option_manager_test-ags_lv2_option_manager_test.o `test -f 'ags/test/plugin/ags_lv2_option_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_option_manager_test.c ags/test/plugin/check_system_lv2_option_manager_test-ags_lv2_option_manager_test.obj: ags/test/plugin/ags_lv2_option_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_option_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_option_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_option_manager_test-ags_lv2_option_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_option_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_option_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_option_manager_test.c'; fi` ags/test/plugin/check_system_lv2_plugin_test-ags_lv2_plugin_test.o: ags/test/plugin/ags_lv2_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_plugin_test-ags_lv2_plugin_test.o `test -f 'ags/test/plugin/ags_lv2_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_plugin_test.c ags/test/plugin/check_system_lv2_plugin_test-ags_lv2_plugin_test.obj: ags/test/plugin/ags_lv2_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_plugin_test-ags_lv2_plugin_test.obj `if test -f 'ags/test/plugin/ags_lv2_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_plugin_test.c'; fi` ags/test/plugin/check_system_lv2_preset_test-ags_lv2_preset_test.o: ags/test/plugin/ags_lv2_preset_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_preset_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_preset_test-ags_lv2_preset_test.o `test -f 'ags/test/plugin/ags_lv2_preset_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_preset_test.c ags/test/plugin/check_system_lv2_preset_test-ags_lv2_preset_test.obj: ags/test/plugin/ags_lv2_preset_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_preset_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_preset_test-ags_lv2_preset_test.obj `if test -f 'ags/test/plugin/ags_lv2_preset_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_preset_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_preset_test.c'; fi` ags/test/plugin/check_system_lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o: ags/test/plugin/ags_lv2_uri_map_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_uri_map_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o `test -f 'ags/test/plugin/ags_lv2_uri_map_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_uri_map_manager_test.c ags/test/plugin/check_system_lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj: ags/test/plugin/ags_lv2_uri_map_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_uri_map_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_uri_map_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_uri_map_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_uri_map_manager_test.c'; fi` ags/test/plugin/check_system_lv2_urid_manager_test-ags_lv2_urid_manager_test.o: ags/test/plugin/ags_lv2_urid_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_urid_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_urid_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_urid_manager_test-ags_lv2_urid_manager_test.o `test -f 'ags/test/plugin/ags_lv2_urid_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_urid_manager_test.c ags/test/plugin/check_system_lv2_urid_manager_test-ags_lv2_urid_manager_test.obj: ags/test/plugin/ags_lv2_urid_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_urid_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_urid_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_urid_manager_test-ags_lv2_urid_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_urid_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_urid_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_urid_manager_test.c'; fi` ags/test/plugin/check_system_lv2_worker_manager_test-ags_lv2_worker_manager_test.o: ags/test/plugin/ags_lv2_worker_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_worker_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_worker_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_worker_manager_test-ags_lv2_worker_manager_test.o `test -f 'ags/test/plugin/ags_lv2_worker_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_worker_manager_test.c ags/test/plugin/check_system_lv2_worker_manager_test-ags_lv2_worker_manager_test.obj: ags/test/plugin/ags_lv2_worker_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2_worker_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2_worker_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2_worker_manager_test-ags_lv2_worker_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_worker_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_worker_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_worker_manager_test.c'; fi` ags/test/plugin/check_system_lv2ui_manager_test-ags_lv2ui_manager_test.o: ags/test/plugin/ags_lv2ui_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2ui_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2ui_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2ui_manager_test-ags_lv2ui_manager_test.o `test -f 'ags/test/plugin/ags_lv2ui_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2ui_manager_test.c ags/test/plugin/check_system_lv2ui_manager_test-ags_lv2ui_manager_test.obj: ags/test/plugin/ags_lv2ui_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2ui_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2ui_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2ui_manager_test-ags_lv2ui_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2ui_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2ui_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2ui_manager_test.c'; fi` ags/test/plugin/check_system_lv2ui_plugin_test-ags_lv2ui_plugin_test.o: ags/test/plugin/ags_lv2ui_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2ui_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2ui_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2ui_plugin_test-ags_lv2ui_plugin_test.o `test -f 'ags/test/plugin/ags_lv2ui_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2ui_plugin_test.c ags/test/plugin/check_system_lv2ui_plugin_test-ags_lv2ui_plugin_test.obj: ags/test/plugin/ags_lv2ui_plugin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_lv2ui_plugin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_lv2ui_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_lv2ui_plugin_test-ags_lv2ui_plugin_test.obj `if test -f 'ags/test/plugin/ags_lv2ui_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2ui_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2ui_plugin_test.c'; fi` ags/test/audio/midi/check_system_midi_buffer_util_test-ags_midi_buffer_util_test.o: ags/test/audio/midi/ags_midi_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midi_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midi_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/check_system_midi_buffer_util_test-ags_midi_buffer_util_test.o `test -f 'ags/test/audio/midi/ags_midi_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/midi/ags_midi_buffer_util_test.c ags/test/audio/midi/check_system_midi_buffer_util_test-ags_midi_buffer_util_test.obj: ags/test/audio/midi/ags_midi_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midi_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midi_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/check_system_midi_buffer_util_test-ags_midi_buffer_util_test.obj `if test -f 'ags/test/audio/midi/ags_midi_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/midi/ags_midi_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/midi/ags_midi_buffer_util_test.c'; fi` ags/test/audio/midi/check_system_midi_builder_test-ags_midi_builder_test.o: ags/test/audio/midi/ags_midi_builder_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midi_builder_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midi_builder_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/check_system_midi_builder_test-ags_midi_builder_test.o `test -f 'ags/test/audio/midi/ags_midi_builder_test.c' || echo '$(srcdir)/'`ags/test/audio/midi/ags_midi_builder_test.c ags/test/audio/midi/check_system_midi_builder_test-ags_midi_builder_test.obj: ags/test/audio/midi/ags_midi_builder_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midi_builder_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midi_builder_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/check_system_midi_builder_test-ags_midi_builder_test.obj `if test -f 'ags/test/audio/midi/ags_midi_builder_test.c'; then $(CYGPATH_W) 'ags/test/audio/midi/ags_midi_builder_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/midi/ags_midi_builder_test.c'; fi` ags/test/audio/check_system_midi_test-ags_midi_test.o: ags/test/audio/ags_midi_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midi_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midi_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_midi_test-ags_midi_test.o `test -f 'ags/test/audio/ags_midi_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_midi_test.c ags/test/audio/check_system_midi_test-ags_midi_test.obj: ags/test/audio/ags_midi_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midi_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midi_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_midi_test-ags_midi_test.obj `if test -f 'ags/test/audio/ags_midi_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_midi_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_midi_test.c'; fi` ags/test/audio/check_system_midiin_test-ags_midiin_test.o: ags/test/audio/ags_midiin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midiin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midiin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_midiin_test-ags_midiin_test.o `test -f 'ags/test/audio/ags_midiin_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_midiin_test.c ags/test/audio/check_system_midiin_test-ags_midiin_test.obj: ags/test/audio/ags_midiin_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_midiin_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_midiin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_midiin_test-ags_midiin_test.obj `if test -f 'ags/test/audio/ags_midiin_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_midiin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_midiin_test.c'; fi` ags/test/audio/task/check_system_move_note_test-ags_move_note_test.o: ags/test/audio/task/ags_move_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_move_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_move_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_move_note_test-ags_move_note_test.o `test -f 'ags/test/audio/task/ags_move_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_move_note_test.c ags/test/audio/task/check_system_move_note_test-ags_move_note_test.obj: ags/test/audio/task/ags_move_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_move_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_move_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_move_note_test-ags_move_note_test.obj `if test -f 'ags/test/audio/task/ags_move_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_move_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_move_note_test.c'; fi` ags/test/audio/recall/check_system_mute_audio_signal_test-ags_mute_audio_signal_test.o: ags/test/audio/recall/ags_mute_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_mute_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_mute_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_mute_audio_signal_test-ags_mute_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_mute_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_audio_signal_test.c ags/test/audio/recall/check_system_mute_audio_signal_test-ags_mute_audio_signal_test.obj: ags/test/audio/recall/ags_mute_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_mute_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_mute_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_mute_audio_signal_test-ags_mute_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_mute_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_mute_audio_test-ags_mute_audio_test.o: ags/test/audio/recall/ags_mute_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_mute_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_mute_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_mute_audio_test-ags_mute_audio_test.o `test -f 'ags/test/audio/recall/ags_mute_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_audio_test.c ags/test/audio/recall/check_system_mute_audio_test-ags_mute_audio_test.obj: ags/test/audio/recall/ags_mute_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_mute_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_mute_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_mute_audio_test-ags_mute_audio_test.obj `if test -f 'ags/test/audio/recall/ags_mute_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_audio_test.c'; fi` ags/test/audio/recall/check_system_mute_channel_test-ags_mute_channel_test.o: ags/test/audio/recall/ags_mute_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_mute_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_mute_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_mute_channel_test-ags_mute_channel_test.o `test -f 'ags/test/audio/recall/ags_mute_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_channel_test.c ags/test/audio/recall/check_system_mute_channel_test-ags_mute_channel_test.obj: ags/test/audio/recall/ags_mute_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_mute_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_mute_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_mute_channel_test-ags_mute_channel_test.obj `if test -f 'ags/test/audio/recall/ags_mute_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_channel_test.c'; fi` ags/test/audio/check_system_notation_test-ags_notation_test.o: ags/test/audio/ags_notation_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_notation_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_notation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_notation_test-ags_notation_test.o `test -f 'ags/test/audio/ags_notation_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_notation_test.c ags/test/audio/check_system_notation_test-ags_notation_test.obj: ags/test/audio/ags_notation_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_notation_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_notation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_notation_test-ags_notation_test.obj `if test -f 'ags/test/audio/ags_notation_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_notation_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_notation_test.c'; fi` ags/test/audio/check_system_note_test-ags_note_test.o: ags/test/audio/ags_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_note_test-ags_note_test.o `test -f 'ags/test/audio/ags_note_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_note_test.c ags/test/audio/check_system_note_test-ags_note_test.obj: ags/test/audio/ags_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_note_test-ags_note_test.obj `if test -f 'ags/test/audio/ags_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_note_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_action_controller_test-ags_osc_action_controller_test.o: ags/test/audio/osc/controller/ags_osc_action_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_action_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_action_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_action_controller_test-ags_osc_action_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_action_controller_test.c ags/test/audio/osc/controller/check_system_osc_action_controller_test-ags_osc_action_controller_test.obj: ags/test/audio/osc/controller/ags_osc_action_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_action_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_action_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_action_controller_test-ags_osc_action_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; fi` ags/test/audio/osc/check_system_osc_buffer_util_test-ags_osc_buffer_util_test.o: ags/test/audio/osc/ags_osc_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_buffer_util_test-ags_osc_buffer_util_test.o `test -f 'ags/test/audio/osc/ags_osc_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_buffer_util_test.c ags/test/audio/osc/check_system_osc_buffer_util_test-ags_osc_buffer_util_test.obj: ags/test/audio/osc/ags_osc_buffer_util_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_buffer_util_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_buffer_util_test-ags_osc_buffer_util_test.obj `if test -f 'ags/test/audio/osc/ags_osc_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_buffer_util_test.c'; fi` ags/test/audio/osc/check_system_osc_client_test-ags_osc_client_test.o: ags/test/audio/osc/ags_osc_client_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_client_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_client_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_client_test-ags_osc_client_test.o `test -f 'ags/test/audio/osc/ags_osc_client_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_client_test.c ags/test/audio/osc/check_system_osc_client_test-ags_osc_client_test.obj: ags/test/audio/osc/ags_osc_client_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_client_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_client_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_client_test-ags_osc_client_test.obj `if test -f 'ags/test/audio/osc/ags_osc_client_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_client_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_client_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_config_controller_test-ags_osc_config_controller_test.o: ags/test/audio/osc/controller/ags_osc_config_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_config_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_config_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_config_controller_test-ags_osc_config_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_config_controller_test.c ags/test/audio/osc/controller/check_system_osc_config_controller_test-ags_osc_config_controller_test.obj: ags/test/audio/osc/controller/ags_osc_config_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_config_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_config_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_config_controller_test-ags_osc_config_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; fi` ags/test/audio/osc/check_system_osc_connection_test-ags_osc_connection_test.o: ags/test/audio/osc/ags_osc_connection_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_connection_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_connection_test-ags_osc_connection_test.o `test -f 'ags/test/audio/osc/ags_osc_connection_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_connection_test.c ags/test/audio/osc/check_system_osc_connection_test-ags_osc_connection_test.obj: ags/test/audio/osc/ags_osc_connection_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_connection_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_connection_test-ags_osc_connection_test.obj `if test -f 'ags/test/audio/osc/ags_osc_connection_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_connection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_connection_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_front_controller_test-ags_osc_front_controller_test.o: ags/test/audio/osc/controller/ags_osc_front_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_front_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_front_controller_test-ags_osc_front_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_front_controller_test.c ags/test/audio/osc/controller/check_system_osc_front_controller_test-ags_osc_front_controller_test.obj: ags/test/audio/osc/controller/ags_osc_front_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_front_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_front_controller_test-ags_osc_front_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_info_controller_test-ags_osc_info_controller_test.o: ags/test/audio/osc/controller/ags_osc_info_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_info_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_info_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_info_controller_test-ags_osc_info_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_info_controller_test.c ags/test/audio/osc/controller/check_system_osc_info_controller_test-ags_osc_info_controller_test.obj: ags/test/audio/osc/controller/ags_osc_info_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_info_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_info_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_info_controller_test-ags_osc_info_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; fi` ags/test/audio/osc/check_system_osc_message_test-ags_osc_message_test.o: ags/test/audio/osc/ags_osc_message_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_message_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_message_test-ags_osc_message_test.o `test -f 'ags/test/audio/osc/ags_osc_message_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_message_test.c ags/test/audio/osc/check_system_osc_message_test-ags_osc_message_test.obj: ags/test/audio/osc/ags_osc_message_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_message_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_message_test-ags_osc_message_test.obj `if test -f 'ags/test/audio/osc/ags_osc_message_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_message_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_message_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_meter_controller_test-ags_osc_meter_controller_test.o: ags/test/audio/osc/controller/ags_osc_meter_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_meter_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_meter_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_meter_controller_test-ags_osc_meter_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_meter_controller_test.c ags/test/audio/osc/controller/check_system_osc_meter_controller_test-ags_osc_meter_controller_test.obj: ags/test/audio/osc/controller/ags_osc_meter_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_meter_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_meter_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_meter_controller_test-ags_osc_meter_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_node_controller_test-ags_osc_node_controller_test.o: ags/test/audio/osc/controller/ags_osc_node_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_node_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_node_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_node_controller_test-ags_osc_node_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_node_controller_test.c ags/test/audio/osc/controller/check_system_osc_node_controller_test-ags_osc_node_controller_test.obj: ags/test/audio/osc/controller/ags_osc_node_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_node_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_node_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_node_controller_test-ags_osc_node_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_renew_controller_test-ags_osc_renew_controller_test.o: ags/test/audio/osc/controller/ags_osc_renew_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_renew_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_renew_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_renew_controller_test-ags_osc_renew_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_renew_controller_test.c ags/test/audio/osc/controller/check_system_osc_renew_controller_test-ags_osc_renew_controller_test.obj: ags/test/audio/osc/controller/ags_osc_renew_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_renew_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_renew_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_renew_controller_test-ags_osc_renew_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; fi` ags/test/audio/osc/check_system_osc_server_test-ags_osc_server_test.o: ags/test/audio/osc/ags_osc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_server_test-ags_osc_server_test.o `test -f 'ags/test/audio/osc/ags_osc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_server_test.c ags/test/audio/osc/check_system_osc_server_test-ags_osc_server_test.obj: ags/test/audio/osc/ags_osc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_server_test-ags_osc_server_test.obj `if test -f 'ags/test/audio/osc/ags_osc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_server_test.c'; fi` ags/test/audio/osc/controller/check_system_osc_status_controller_test-ags_osc_status_controller_test.o: ags/test/audio/osc/controller/ags_osc_status_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_status_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_status_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_status_controller_test-ags_osc_status_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_status_controller_test.c ags/test/audio/osc/controller/check_system_osc_status_controller_test-ags_osc_status_controller_test.obj: ags/test/audio/osc/controller/ags_osc_status_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_status_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_status_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/check_system_osc_status_controller_test-ags_osc_status_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; fi` ags/test/audio/osc/check_system_osc_websocket_connection_test-ags_osc_websocket_connection_test.o: ags/test/audio/osc/ags_osc_websocket_connection_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_websocket_connection_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_websocket_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_websocket_connection_test-ags_osc_websocket_connection_test.o `test -f 'ags/test/audio/osc/ags_osc_websocket_connection_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_websocket_connection_test.c ags/test/audio/osc/check_system_osc_websocket_connection_test-ags_osc_websocket_connection_test.obj: ags/test/audio/osc/ags_osc_websocket_connection_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_websocket_connection_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_websocket_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_websocket_connection_test-ags_osc_websocket_connection_test.obj `if test -f 'ags/test/audio/osc/ags_osc_websocket_connection_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_websocket_connection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_websocket_connection_test.c'; fi` ags/test/audio/osc/xmlrpc/check_system_osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o: ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_xmlrpc_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/xmlrpc/check_system_osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o `test -f 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c ags/test/audio/osc/xmlrpc/check_system_osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj: ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_xmlrpc_controller_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/xmlrpc/check_system_osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj `if test -f 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; fi` ags/test/audio/osc/check_system_osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o: ags/test/audio/osc/ags_osc_xmlrpc_message_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_xmlrpc_message_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o `test -f 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_xmlrpc_message_test.c ags/test/audio/osc/check_system_osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj: ags/test/audio/osc/ags_osc_xmlrpc_message_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_xmlrpc_message_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj `if test -f 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; fi` ags/test/audio/osc/check_system_osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o: ags/test/audio/osc/ags_osc_xmlrpc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_xmlrpc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o `test -f 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_xmlrpc_server_test.c ags/test/audio/osc/check_system_osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj: ags/test/audio/osc/ags_osc_xmlrpc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_osc_xmlrpc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj `if test -f 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; fi` ags/test/audio/check_system_output_test-ags_output_test.o: ags/test/audio/ags_output_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_output_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_output_test-ags_output_test.o `test -f 'ags/test/audio/ags_output_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_output_test.c ags/test/audio/check_system_output_test-ags_output_test.obj: ags/test/audio/ags_output_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_output_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_output_test-ags_output_test.obj `if test -f 'ags/test/audio/ags_output_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_output_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_output_test.c'; fi` ags/test/server/security/check_system_password_store_manager_test-ags_password_store_manager_test.o: ags/test/server/security/ags_password_store_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_password_store_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_password_store_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_password_store_manager_test-ags_password_store_manager_test.o `test -f 'ags/test/server/security/ags_password_store_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_password_store_manager_test.c ags/test/server/security/check_system_password_store_manager_test-ags_password_store_manager_test.obj: ags/test/server/security/ags_password_store_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_password_store_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_password_store_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_password_store_manager_test-ags_password_store_manager_test.obj `if test -f 'ags/test/server/security/ags_password_store_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_password_store_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_password_store_manager_test.c'; fi` ags/test/audio/check_system_pattern_test-ags_pattern_test.o: ags/test/audio/ags_pattern_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_pattern_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_pattern_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_pattern_test-ags_pattern_test.o `test -f 'ags/test/audio/ags_pattern_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_pattern_test.c ags/test/audio/check_system_pattern_test-ags_pattern_test.obj: ags/test/audio/ags_pattern_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_pattern_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_pattern_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_pattern_test-ags_pattern_test.obj `if test -f 'ags/test/audio/ags_pattern_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_pattern_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_pattern_test.c'; fi` ags/test/audio/recall/check_system_peak_audio_signal_test-ags_peak_audio_signal_test.o: ags/test/audio/recall/ags_peak_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_peak_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_peak_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_peak_audio_signal_test-ags_peak_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_peak_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_peak_audio_signal_test.c ags/test/audio/recall/check_system_peak_audio_signal_test-ags_peak_audio_signal_test.obj: ags/test/audio/recall/ags_peak_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_peak_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_peak_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_peak_audio_signal_test-ags_peak_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_peak_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_peak_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_peak_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_peak_channel_test-ags_peak_channel_test.o: ags/test/audio/recall/ags_peak_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_peak_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_peak_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_peak_channel_test-ags_peak_channel_test.o `test -f 'ags/test/audio/recall/ags_peak_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_peak_channel_test.c ags/test/audio/recall/check_system_peak_channel_test-ags_peak_channel_test.obj: ags/test/audio/recall/ags_peak_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_peak_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_peak_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_peak_channel_test-ags_peak_channel_test.obj `if test -f 'ags/test/audio/recall/ags_peak_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_peak_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_peak_channel_test.c'; fi` ags/test/audio/recall/check_system_play_audio_signal_test-ags_play_audio_signal_test.o: ags/test/audio/recall/ags_play_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_audio_signal_test-ags_play_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_play_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_audio_signal_test.c ags/test/audio/recall/check_system_play_audio_signal_test-ags_play_audio_signal_test.obj: ags/test/audio/recall/ags_play_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_audio_signal_test-ags_play_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_play_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_play_audio_test-ags_play_audio_test.o: ags/test/audio/recall/ags_play_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_audio_test-ags_play_audio_test.o `test -f 'ags/test/audio/recall/ags_play_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_audio_test.c ags/test/audio/recall/check_system_play_audio_test-ags_play_audio_test.obj: ags/test/audio/recall/ags_play_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_audio_test-ags_play_audio_test.obj `if test -f 'ags/test/audio/recall/ags_play_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_audio_test.c'; fi` ags/test/audio/recall/check_system_play_channel_test-ags_play_channel_test.o: ags/test/audio/recall/ags_play_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_channel_test-ags_play_channel_test.o `test -f 'ags/test/audio/recall/ags_play_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_channel_test.c ags/test/audio/recall/check_system_play_channel_test-ags_play_channel_test.obj: ags/test/audio/recall/ags_play_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_channel_test-ags_play_channel_test.obj `if test -f 'ags/test/audio/recall/ags_play_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_channel_test.c'; fi` ags/test/audio/recall/check_system_play_wave_audio_test-ags_play_wave_audio_test.o: ags/test/audio/recall/ags_play_wave_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_wave_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_wave_audio_test-ags_play_wave_audio_test.o `test -f 'ags/test/audio/recall/ags_play_wave_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_wave_audio_test.c ags/test/audio/recall/check_system_play_wave_audio_test-ags_play_wave_audio_test.obj: ags/test/audio/recall/ags_play_wave_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_play_wave_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_wave_audio_test-ags_play_wave_audio_test.obj `if test -f 'ags/test/audio/recall/ags_play_wave_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_wave_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_wave_audio_test.c'; fi` ags/test/audio/recall/check_system_play_wave_channel_test-ags_play_wave_channel_test.o: ags/test/audio/recall/ags_play_wave_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_wave_channel_test-ags_play_wave_channel_test.o `test -f 'ags/test/audio/recall/ags_play_wave_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_wave_channel_test.c ags/test/audio/recall/check_system_play_wave_channel_test-ags_play_wave_channel_test.obj: ags/test/audio/recall/ags_play_wave_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_play_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_play_wave_channel_test-ags_play_wave_channel_test.obj `if test -f 'ags/test/audio/recall/ags_play_wave_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_wave_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_wave_channel_test.c'; fi` ags/test/audio/check_system_playback_domain_test-ags_playback_domain_test.o: ags/test/audio/ags_playback_domain_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_playback_domain_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_playback_domain_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_playback_domain_test-ags_playback_domain_test.o `test -f 'ags/test/audio/ags_playback_domain_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_playback_domain_test.c ags/test/audio/check_system_playback_domain_test-ags_playback_domain_test.obj: ags/test/audio/ags_playback_domain_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_playback_domain_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_playback_domain_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_playback_domain_test-ags_playback_domain_test.obj `if test -f 'ags/test/audio/ags_playback_domain_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_playback_domain_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_playback_domain_test.c'; fi` ags/test/audio/check_system_playback_test-ags_playback_test.o: ags/test/audio/ags_playback_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_playback_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_playback_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_playback_test-ags_playback_test.o `test -f 'ags/test/audio/ags_playback_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_playback_test.c ags/test/audio/check_system_playback_test-ags_playback_test.obj: ags/test/audio/ags_playback_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_playback_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_playback_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_playback_test-ags_playback_test.obj `if test -f 'ags/test/audio/ags_playback_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_playback_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_playback_test.c'; fi` ags/test/plugin/check_system_plugin_port_test-ags_plugin_port_test.o: ags/test/plugin/ags_plugin_port_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_plugin_port_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_plugin_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_plugin_port_test-ags_plugin_port_test.o `test -f 'ags/test/plugin/ags_plugin_port_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_plugin_port_test.c ags/test/plugin/check_system_plugin_port_test-ags_plugin_port_test.obj: ags/test/plugin/ags_plugin_port_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_plugin_port_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_plugin_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/check_system_plugin_port_test-ags_plugin_port_test.obj `if test -f 'ags/test/plugin/ags_plugin_port_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_plugin_port_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_plugin_port_test.c'; fi` ags/test/audio/check_system_port_test-ags_port_test.o: ags/test/audio/ags_port_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_port_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_port_test-ags_port_test.o `test -f 'ags/test/audio/ags_port_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_port_test.c ags/test/audio/check_system_port_test-ags_port_test.obj: ags/test/audio/ags_port_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_port_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_port_test-ags_port_test.obj `if test -f 'ags/test/audio/ags_port_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_port_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_port_test.c'; fi` ags/test/audio/recall/check_system_prepare_audio_signal_test-ags_prepare_audio_signal_test.o: ags/test/audio/recall/ags_prepare_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_prepare_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_prepare_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_prepare_audio_signal_test-ags_prepare_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_prepare_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_prepare_audio_signal_test.c ags/test/audio/recall/check_system_prepare_audio_signal_test-ags_prepare_audio_signal_test.obj: ags/test/audio/recall/ags_prepare_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_prepare_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_prepare_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_prepare_audio_signal_test-ags_prepare_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_prepare_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_prepare_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_prepare_audio_signal_test.c'; fi` ags/test/audio/check_system_preset_test-ags_preset_test.o: ags/test/audio/ags_preset_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_preset_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_preset_test-ags_preset_test.o `test -f 'ags/test/audio/ags_preset_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_preset_test.c ags/test/audio/check_system_preset_test-ags_preset_test.obj: ags/test/audio/ags_preset_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_preset_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_preset_test-ags_preset_test.obj `if test -f 'ags/test/audio/ags_preset_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_preset_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_preset_test.c'; fi` ags/test/audio/check_system_recall_channel_run_test-ags_recall_channel_run_test.o: ags/test/audio/ags_recall_channel_run_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_channel_run_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_channel_run_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_channel_run_test-ags_recall_channel_run_test.o `test -f 'ags/test/audio/ags_recall_channel_run_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_channel_run_test.c ags/test/audio/check_system_recall_channel_run_test-ags_recall_channel_run_test.obj: ags/test/audio/ags_recall_channel_run_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_channel_run_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_channel_run_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_channel_run_test-ags_recall_channel_run_test.obj `if test -f 'ags/test/audio/ags_recall_channel_run_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_channel_run_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_channel_run_test.c'; fi` ags/test/audio/check_system_recall_channel_test-ags_recall_channel_test.o: ags/test/audio/ags_recall_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_channel_test-ags_recall_channel_test.o `test -f 'ags/test/audio/ags_recall_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_channel_test.c ags/test/audio/check_system_recall_channel_test-ags_recall_channel_test.obj: ags/test/audio/ags_recall_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_channel_test-ags_recall_channel_test.obj `if test -f 'ags/test/audio/ags_recall_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_channel_test.c'; fi` ags/test/audio/check_system_recall_container_test-ags_recall_container_test.o: ags/test/audio/ags_recall_container_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_container_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_container_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_container_test-ags_recall_container_test.o `test -f 'ags/test/audio/ags_recall_container_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_container_test.c ags/test/audio/check_system_recall_container_test-ags_recall_container_test.obj: ags/test/audio/ags_recall_container_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_container_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_container_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_container_test-ags_recall_container_test.obj `if test -f 'ags/test/audio/ags_recall_container_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_container_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_container_test.c'; fi` ags/test/audio/check_system_recall_dependency_test-ags_recall_dependency_test.o: ags/test/audio/ags_recall_dependency_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_dependency_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_dependency_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_dependency_test-ags_recall_dependency_test.o `test -f 'ags/test/audio/ags_recall_dependency_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_dependency_test.c ags/test/audio/check_system_recall_dependency_test-ags_recall_dependency_test.obj: ags/test/audio/ags_recall_dependency_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_dependency_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_dependency_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_dependency_test-ags_recall_dependency_test.obj `if test -f 'ags/test/audio/ags_recall_dependency_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_dependency_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_dependency_test.c'; fi` ags/test/audio/check_system_recall_id_test-ags_recall_id_test.o: ags/test/audio/ags_recall_id_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_id_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_id_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_id_test-ags_recall_id_test.o `test -f 'ags/test/audio/ags_recall_id_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_id_test.c ags/test/audio/check_system_recall_id_test-ags_recall_id_test.obj: ags/test/audio/ags_recall_id_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_id_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_id_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_id_test-ags_recall_id_test.obj `if test -f 'ags/test/audio/ags_recall_id_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_id_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_id_test.c'; fi` ags/test/audio/check_system_recall_recycling_test-ags_recall_recycling_test.o: ags/test/audio/ags_recall_recycling_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_recycling_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_recycling_test-ags_recall_recycling_test.o `test -f 'ags/test/audio/ags_recall_recycling_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_recycling_test.c ags/test/audio/check_system_recall_recycling_test-ags_recall_recycling_test.obj: ags/test/audio/ags_recall_recycling_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_recycling_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_recycling_test-ags_recall_recycling_test.obj `if test -f 'ags/test/audio/ags_recall_recycling_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_recycling_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_recycling_test.c'; fi` ags/test/audio/check_system_recall_test-ags_recall_test.o: ags/test/audio/ags_recall_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_test-ags_recall_test.o `test -f 'ags/test/audio/ags_recall_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_test.c ags/test/audio/check_system_recall_test-ags_recall_test.obj: ags/test/audio/ags_recall_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recall_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recall_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recall_test-ags_recall_test.obj `if test -f 'ags/test/audio/ags_recall_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_test.c'; fi` ags/test/audio/recall/check_system_record_midi_audio_test-ags_record_midi_audio_test.o: ags/test/audio/recall/ags_record_midi_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_record_midi_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_record_midi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_record_midi_audio_test-ags_record_midi_audio_test.o `test -f 'ags/test/audio/recall/ags_record_midi_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_record_midi_audio_test.c ags/test/audio/recall/check_system_record_midi_audio_test-ags_record_midi_audio_test.obj: ags/test/audio/recall/ags_record_midi_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_record_midi_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_record_midi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_record_midi_audio_test-ags_record_midi_audio_test.obj `if test -f 'ags/test/audio/recall/ags_record_midi_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_record_midi_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_record_midi_audio_test.c'; fi` ags/test/audio/check_system_recycling_context_test-ags_recycling_context_test.o: ags/test/audio/ags_recycling_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recycling_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recycling_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recycling_context_test-ags_recycling_context_test.o `test -f 'ags/test/audio/ags_recycling_context_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recycling_context_test.c ags/test/audio/check_system_recycling_context_test-ags_recycling_context_test.obj: ags/test/audio/ags_recycling_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recycling_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recycling_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recycling_context_test-ags_recycling_context_test.obj `if test -f 'ags/test/audio/ags_recycling_context_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recycling_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recycling_context_test.c'; fi` ags/test/audio/check_system_recycling_test-ags_recycling_test.o: ags/test/audio/ags_recycling_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recycling_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recycling_test-ags_recycling_test.o `test -f 'ags/test/audio/ags_recycling_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recycling_test.c ags/test/audio/check_system_recycling_test-ags_recycling_test.obj: ags/test/audio/ags_recycling_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_recycling_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_recycling_test-ags_recycling_test.obj `if test -f 'ags/test/audio/ags_recycling_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recycling_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recycling_test.c'; fi` ags/test/audio/task/check_system_remove_audio_signal_test-ags_remove_audio_signal_test.o: ags/test/audio/task/ags_remove_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_audio_signal_test-ags_remove_audio_signal_test.o `test -f 'ags/test/audio/task/ags_remove_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_audio_signal_test.c ags/test/audio/task/check_system_remove_audio_signal_test-ags_remove_audio_signal_test.obj: ags/test/audio/task/ags_remove_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_audio_signal_test-ags_remove_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_remove_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_audio_signal_test.c'; fi` ags/test/audio/task/check_system_remove_audio_test-ags_remove_audio_test.o: ags/test/audio/task/ags_remove_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_audio_test-ags_remove_audio_test.o `test -f 'ags/test/audio/task/ags_remove_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_audio_test.c ags/test/audio/task/check_system_remove_audio_test-ags_remove_audio_test.obj: ags/test/audio/task/ags_remove_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_audio_test-ags_remove_audio_test.obj `if test -f 'ags/test/audio/task/ags_remove_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_audio_test.c'; fi` ags/test/audio/task/check_system_remove_note_test-ags_remove_note_test.o: ags/test/audio/task/ags_remove_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_note_test-ags_remove_note_test.o `test -f 'ags/test/audio/task/ags_remove_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_note_test.c ags/test/audio/task/check_system_remove_note_test-ags_remove_note_test.obj: ags/test/audio/task/ags_remove_note_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_note_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_note_test-ags_remove_note_test.obj `if test -f 'ags/test/audio/task/ags_remove_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_note_test.c'; fi` ags/test/audio/task/check_system_remove_soundcard_test-ags_remove_soundcard_test.o: ags/test/audio/task/ags_remove_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_soundcard_test-ags_remove_soundcard_test.o `test -f 'ags/test/audio/task/ags_remove_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_soundcard_test.c ags/test/audio/task/check_system_remove_soundcard_test-ags_remove_soundcard_test.obj: ags/test/audio/task/ags_remove_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_remove_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_remove_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_remove_soundcard_test-ags_remove_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_remove_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_soundcard_test.c'; fi` ags/test/audio/task/check_system_reset_amplitude_test-ags_reset_amplitude_test.o: ags/test/audio/task/ags_reset_amplitude_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_reset_amplitude_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_reset_amplitude_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_reset_amplitude_test-ags_reset_amplitude_test.o `test -f 'ags/test/audio/task/ags_reset_amplitude_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_reset_amplitude_test.c ags/test/audio/task/check_system_reset_amplitude_test-ags_reset_amplitude_test.obj: ags/test/audio/task/ags_reset_amplitude_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_reset_amplitude_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_reset_amplitude_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_reset_amplitude_test-ags_reset_amplitude_test.obj `if test -f 'ags/test/audio/task/ags_reset_amplitude_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_reset_amplitude_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_reset_amplitude_test.c'; fi` ags/test/audio/task/check_system_reset_peak_test-ags_reset_peak_test.o: ags/test/audio/task/ags_reset_peak_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_reset_peak_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_reset_peak_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_reset_peak_test-ags_reset_peak_test.o `test -f 'ags/test/audio/task/ags_reset_peak_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_reset_peak_test.c ags/test/audio/task/check_system_reset_peak_test-ags_reset_peak_test.obj: ags/test/audio/task/ags_reset_peak_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_reset_peak_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_reset_peak_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_reset_peak_test-ags_reset_peak_test.obj `if test -f 'ags/test/audio/task/ags_reset_peak_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_reset_peak_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_reset_peak_test.c'; fi` ags/test/audio/task/check_system_resize_audio_test-ags_resize_audio_test.o: ags/test/audio/task/ags_resize_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_resize_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_resize_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_resize_audio_test-ags_resize_audio_test.o `test -f 'ags/test/audio/task/ags_resize_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_resize_audio_test.c ags/test/audio/task/check_system_resize_audio_test-ags_resize_audio_test.obj: ags/test/audio/task/ags_resize_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_resize_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_resize_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_resize_audio_test-ags_resize_audio_test.obj `if test -f 'ags/test/audio/task/ags_resize_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_resize_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_resize_audio_test.c'; fi` ags/test/thread/check_system_returnable_thread_test-ags_returnable_thread_test.o: ags/test/thread/ags_returnable_thread_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_returnable_thread_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_returnable_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_returnable_thread_test-ags_returnable_thread_test.o `test -f 'ags/test/thread/ags_returnable_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_returnable_thread_test.c ags/test/thread/check_system_returnable_thread_test-ags_returnable_thread_test.obj: ags/test/thread/ags_returnable_thread_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_returnable_thread_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_returnable_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_returnable_thread_test-ags_returnable_thread_test.obj `if test -f 'ags/test/thread/ags_returnable_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_returnable_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_returnable_thread_test.c'; fi` ags/test/audio/recall/check_system_route_dssi_audio_test-ags_route_dssi_audio_test.o: ags/test/audio/recall/ags_route_dssi_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_route_dssi_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_route_dssi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_route_dssi_audio_test-ags_route_dssi_audio_test.o `test -f 'ags/test/audio/recall/ags_route_dssi_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_route_dssi_audio_test.c ags/test/audio/recall/check_system_route_dssi_audio_test-ags_route_dssi_audio_test.obj: ags/test/audio/recall/ags_route_dssi_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_route_dssi_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_route_dssi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_route_dssi_audio_test-ags_route_dssi_audio_test.obj `if test -f 'ags/test/audio/recall/ags_route_dssi_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_route_dssi_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_route_dssi_audio_test.c'; fi` ags/test/audio/recall/check_system_route_lv2_audio_test-ags_route_lv2_audio_test.o: ags/test/audio/recall/ags_route_lv2_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_route_lv2_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_route_lv2_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_route_lv2_audio_test-ags_route_lv2_audio_test.o `test -f 'ags/test/audio/recall/ags_route_lv2_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_route_lv2_audio_test.c ags/test/audio/recall/check_system_route_lv2_audio_test-ags_route_lv2_audio_test.obj: ags/test/audio/recall/ags_route_lv2_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_route_lv2_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_route_lv2_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_route_lv2_audio_test-ags_route_lv2_audio_test.obj `if test -f 'ags/test/audio/recall/ags_route_lv2_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_route_lv2_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_route_lv2_audio_test.c'; fi` ags/test/server/security/check_system_security_context_test-ags_security_context_test.o: ags/test/server/security/ags_security_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_security_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_security_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_security_context_test-ags_security_context_test.o `test -f 'ags/test/server/security/ags_security_context_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_security_context_test.c ags/test/server/security/check_system_security_context_test-ags_security_context_test.obj: ags/test/server/security/ags_security_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_security_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_security_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_security_context_test-ags_security_context_test.obj `if test -f 'ags/test/server/security/ags_security_context_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_security_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_security_context_test.c'; fi` ags/test/audio/task/check_system_seek_soundcard_test-ags_seek_soundcard_test.o: ags/test/audio/task/ags_seek_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_seek_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_seek_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_seek_soundcard_test-ags_seek_soundcard_test.o `test -f 'ags/test/audio/task/ags_seek_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_seek_soundcard_test.c ags/test/audio/task/check_system_seek_soundcard_test-ags_seek_soundcard_test.obj: ags/test/audio/task/ags_seek_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_seek_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_seek_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_seek_soundcard_test-ags_seek_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_seek_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_seek_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_seek_soundcard_test.c'; fi` ags/test/server/check_system_server_application_context_test-ags_server_application_context_test.o: ags/test/server/ags_server_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_server_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_server_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/check_system_server_application_context_test-ags_server_application_context_test.o `test -f 'ags/test/server/ags_server_application_context_test.c' || echo '$(srcdir)/'`ags/test/server/ags_server_application_context_test.c ags/test/server/check_system_server_application_context_test-ags_server_application_context_test.obj: ags/test/server/ags_server_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_server_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_server_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/check_system_server_application_context_test-ags_server_application_context_test.obj `if test -f 'ags/test/server/ags_server_application_context_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_server_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_server_application_context_test.c'; fi` ags/test/server/check_system_server_test-ags_server_test.o: ags/test/server/ags_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/check_system_server_test-ags_server_test.o `test -f 'ags/test/server/ags_server_test.c' || echo '$(srcdir)/'`ags/test/server/ags_server_test.c ags/test/server/check_system_server_test-ags_server_test.obj: ags/test/server/ags_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/check_system_server_test-ags_server_test.obj `if test -f 'ags/test/server/ags_server_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_server_test.c'; fi` ags/test/audio/task/check_system_set_audio_channels_test-ags_set_audio_channels_test.o: ags/test/audio/task/ags_set_audio_channels_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_audio_channels_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_audio_channels_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_audio_channels_test-ags_set_audio_channels_test.o `test -f 'ags/test/audio/task/ags_set_audio_channels_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_audio_channels_test.c ags/test/audio/task/check_system_set_audio_channels_test-ags_set_audio_channels_test.obj: ags/test/audio/task/ags_set_audio_channels_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_audio_channels_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_audio_channels_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_audio_channels_test-ags_set_audio_channels_test.obj `if test -f 'ags/test/audio/task/ags_set_audio_channels_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_audio_channels_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_audio_channels_test.c'; fi` ags/test/audio/task/check_system_set_buffer_size_test-ags_set_buffer_size_test.o: ags/test/audio/task/ags_set_buffer_size_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_buffer_size_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_buffer_size_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_buffer_size_test-ags_set_buffer_size_test.o `test -f 'ags/test/audio/task/ags_set_buffer_size_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_buffer_size_test.c ags/test/audio/task/check_system_set_buffer_size_test-ags_set_buffer_size_test.obj: ags/test/audio/task/ags_set_buffer_size_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_buffer_size_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_buffer_size_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_buffer_size_test-ags_set_buffer_size_test.obj `if test -f 'ags/test/audio/task/ags_set_buffer_size_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_buffer_size_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_buffer_size_test.c'; fi` ags/test/audio/task/check_system_set_device_test-ags_set_device_test.o: ags/test/audio/task/ags_set_device_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_device_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_device_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_device_test-ags_set_device_test.o `test -f 'ags/test/audio/task/ags_set_device_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_device_test.c ags/test/audio/task/check_system_set_device_test-ags_set_device_test.obj: ags/test/audio/task/ags_set_device_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_device_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_device_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_device_test-ags_set_device_test.obj `if test -f 'ags/test/audio/task/ags_set_device_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_device_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_device_test.c'; fi` ags/test/audio/task/check_system_set_format_test-ags_set_format_test.o: ags/test/audio/task/ags_set_format_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_format_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_format_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_format_test-ags_set_format_test.o `test -f 'ags/test/audio/task/ags_set_format_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_format_test.c ags/test/audio/task/check_system_set_format_test-ags_set_format_test.obj: ags/test/audio/task/ags_set_format_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_format_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_format_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_format_test-ags_set_format_test.obj `if test -f 'ags/test/audio/task/ags_set_format_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_format_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_format_test.c'; fi` ags/test/audio/task/check_system_set_muted_test-ags_set_muted_test.o: ags/test/audio/task/ags_set_muted_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_muted_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_muted_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_muted_test-ags_set_muted_test.o `test -f 'ags/test/audio/task/ags_set_muted_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_muted_test.c ags/test/audio/task/check_system_set_muted_test-ags_set_muted_test.obj: ags/test/audio/task/ags_set_muted_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_muted_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_muted_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_muted_test-ags_set_muted_test.obj `if test -f 'ags/test/audio/task/ags_set_muted_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_muted_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_muted_test.c'; fi` ags/test/audio/task/check_system_set_samplerate_test-ags_set_samplerate_test.o: ags/test/audio/task/ags_set_samplerate_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_samplerate_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_samplerate_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_samplerate_test-ags_set_samplerate_test.o `test -f 'ags/test/audio/task/ags_set_samplerate_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_samplerate_test.c ags/test/audio/task/check_system_set_samplerate_test-ags_set_samplerate_test.obj: ags/test/audio/task/ags_set_samplerate_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_set_samplerate_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_set_samplerate_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_set_samplerate_test-ags_set_samplerate_test.obj `if test -f 'ags/test/audio/task/ags_set_samplerate_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_samplerate_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_samplerate_test.c'; fi` ags/test/object/check_system_soundcard_test-ags_soundcard_test.o: ags/test/object/ags_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_soundcard_test-ags_soundcard_test.o `test -f 'ags/test/object/ags_soundcard_test.c' || echo '$(srcdir)/'`ags/test/object/ags_soundcard_test.c ags/test/object/check_system_soundcard_test-ags_soundcard_test.obj: ags/test/object/ags_soundcard_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_soundcard_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/check_system_soundcard_test-ags_soundcard_test.obj `if test -f 'ags/test/object/ags_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_soundcard_test.c'; fi` ags/test/audio/task/check_system_start_audio_test-ags_start_audio_test.o: ags/test/audio/task/ags_start_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_start_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_start_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_start_audio_test-ags_start_audio_test.o `test -f 'ags/test/audio/task/ags_start_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_start_audio_test.c ags/test/audio/task/check_system_start_audio_test-ags_start_audio_test.obj: ags/test/audio/task/ags_start_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_start_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_start_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_start_audio_test-ags_start_audio_test.obj `if test -f 'ags/test/audio/task/ags_start_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_start_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_start_audio_test.c'; fi` ags/test/audio/task/check_system_start_channel_test-ags_start_channel_test.o: ags/test/audio/task/ags_start_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_start_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_start_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_start_channel_test-ags_start_channel_test.o `test -f 'ags/test/audio/task/ags_start_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_start_channel_test.c ags/test/audio/task/check_system_start_channel_test-ags_start_channel_test.obj: ags/test/audio/task/ags_start_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_start_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_start_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/check_system_start_channel_test-ags_start_channel_test.obj `if test -f 'ags/test/audio/task/ags_start_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_start_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_start_channel_test.c'; fi` ags/test/audio/recall/check_system_stream_audio_signal_test-ags_stream_audio_signal_test.o: ags/test/audio/recall/ags_stream_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_stream_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_stream_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_stream_audio_signal_test-ags_stream_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_stream_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_stream_audio_signal_test.c ags/test/audio/recall/check_system_stream_audio_signal_test-ags_stream_audio_signal_test.obj: ags/test/audio/recall/ags_stream_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_stream_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_stream_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_stream_audio_signal_test-ags_stream_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_stream_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_stream_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_stream_audio_signal_test.c'; fi` ags/test/audio/check_system_synth_generator_test-ags_synth_generator_test.o: ags/test/audio/ags_synth_generator_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_synth_generator_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_synth_generator_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_synth_generator_test-ags_synth_generator_test.o `test -f 'ags/test/audio/ags_synth_generator_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_synth_generator_test.c ags/test/audio/check_system_synth_generator_test-ags_synth_generator_test.obj: ags/test/audio/ags_synth_generator_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_synth_generator_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_synth_generator_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_synth_generator_test-ags_synth_generator_test.obj `if test -f 'ags/test/audio/ags_synth_generator_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_synth_generator_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_synth_generator_test.c'; fi` ags/test/thread/check_system_task_test-ags_task_test.o: ags/test/thread/ags_task_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_task_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_task_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_task_test-ags_task_test.o `test -f 'ags/test/thread/ags_task_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_task_test.c ags/test/thread/check_system_task_test-ags_task_test.obj: ags/test/thread/ags_task_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_task_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_task_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_task_test-ags_task_test.obj `if test -f 'ags/test/thread/ags_task_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_task_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_task_test.c'; fi` ags/test/thread/check_system_thread_pool_test-ags_thread_pool_test.o: ags/test/thread/ags_thread_pool_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_thread_pool_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_thread_pool_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_thread_pool_test-ags_thread_pool_test.o `test -f 'ags/test/thread/ags_thread_pool_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_thread_pool_test.c ags/test/thread/check_system_thread_pool_test-ags_thread_pool_test.obj: ags/test/thread/ags_thread_pool_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_thread_pool_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_thread_pool_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_thread_pool_test-ags_thread_pool_test.obj `if test -f 'ags/test/thread/ags_thread_pool_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_thread_pool_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_thread_pool_test.c'; fi` ags/test/thread/check_system_thread_test-ags_thread_test.o: ags/test/thread/ags_thread_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_thread_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_thread_test-ags_thread_test.o `test -f 'ags/test/thread/ags_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_thread_test.c ags/test/thread/check_system_thread_test-ags_thread_test.obj: ags/test/thread/ags_thread_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_thread_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_thread_test-ags_thread_test.obj `if test -f 'ags/test/thread/ags_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_thread_test.c'; fi` ags/test/lib/check_system_time_test-ags_time_test.o: ags/test/lib/ags_time_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_time_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_time_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_time_test-ags_time_test.o `test -f 'ags/test/lib/ags_time_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_time_test.c ags/test/lib/check_system_time_test-ags_time_test.obj: ags/test/lib/ags_time_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_time_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_time_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_time_test-ags_time_test.obj `if test -f 'ags/test/lib/ags_time_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_time_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_time_test.c'; fi` ags/test/audio/check_system_track_test-ags_track_test.o: ags/test/audio/ags_track_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_track_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_track_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_track_test-ags_track_test.o `test -f 'ags/test/audio/ags_track_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_track_test.c ags/test/audio/check_system_track_test-ags_track_test.obj: ags/test/audio/ags_track_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_track_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_track_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_track_test-ags_track_test.obj `if test -f 'ags/test/audio/ags_track_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_track_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_track_test.c'; fi` ags/test/lib/check_system_turtle_manager_test-ags_turtle_manager_test.o: ags/test/lib/ags_turtle_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_turtle_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_turtle_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_turtle_manager_test-ags_turtle_manager_test.o `test -f 'ags/test/lib/ags_turtle_manager_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_turtle_manager_test.c ags/test/lib/check_system_turtle_manager_test-ags_turtle_manager_test.obj: ags/test/lib/ags_turtle_manager_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_turtle_manager_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_turtle_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_turtle_manager_test-ags_turtle_manager_test.obj `if test -f 'ags/test/lib/ags_turtle_manager_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_turtle_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_turtle_manager_test.c'; fi` ags/test/lib/check_system_turtle_test-ags_turtle_test.o: ags/test/lib/ags_turtle_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_turtle_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_turtle_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_turtle_test-ags_turtle_test.o `test -f 'ags/test/lib/ags_turtle_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_turtle_test.c ags/test/lib/check_system_turtle_test-ags_turtle_test.obj: ags/test/lib/ags_turtle_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_turtle_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_turtle_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/check_system_turtle_test-ags_turtle_test.obj `if test -f 'ags/test/lib/ags_turtle_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_turtle_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_turtle_test.c'; fi` ags/test/audio/recall/check_system_volume_audio_signal_test-ags_volume_audio_signal_test.o: ags/test/audio/recall/ags_volume_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_volume_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_volume_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_volume_audio_signal_test-ags_volume_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_volume_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_volume_audio_signal_test.c ags/test/audio/recall/check_system_volume_audio_signal_test-ags_volume_audio_signal_test.obj: ags/test/audio/recall/ags_volume_audio_signal_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_volume_audio_signal_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_volume_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_volume_audio_signal_test-ags_volume_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_volume_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_volume_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_volume_audio_signal_test.c'; fi` ags/test/audio/recall/check_system_volume_channel_test-ags_volume_channel_test.o: ags/test/audio/recall/ags_volume_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_volume_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_volume_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_volume_channel_test-ags_volume_channel_test.o `test -f 'ags/test/audio/recall/ags_volume_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_volume_channel_test.c ags/test/audio/recall/check_system_volume_channel_test-ags_volume_channel_test.obj: ags/test/audio/recall/ags_volume_channel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_volume_channel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_volume_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/check_system_volume_channel_test-ags_volume_channel_test.obj `if test -f 'ags/test/audio/recall/ags_volume_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_volume_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_volume_channel_test.c'; fi` ags/test/audio/check_system_wave_test-ags_wave_test.o: ags/test/audio/ags_wave_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_wave_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_wave_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_wave_test-ags_wave_test.o `test -f 'ags/test/audio/ags_wave_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_wave_test.c ags/test/audio/check_system_wave_test-ags_wave_test.obj: ags/test/audio/ags_wave_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_wave_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_wave_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_wave_test-ags_wave_test.obj `if test -f 'ags/test/audio/ags_wave_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_wave_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_wave_test.c'; fi` ags/test/thread/check_system_worker_thread_test-ags_worker_thread_test.o: ags/test/thread/ags_worker_thread_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_worker_thread_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_worker_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_worker_thread_test-ags_worker_thread_test.o `test -f 'ags/test/thread/ags_worker_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_worker_thread_test.c ags/test/thread/check_system_worker_thread_test-ags_worker_thread_test.obj: ags/test/thread/ags_worker_thread_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_worker_thread_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_worker_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/check_system_worker_thread_test-ags_worker_thread_test.obj `if test -f 'ags/test/thread/ags_worker_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_worker_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_worker_thread_test.c'; fi` ags/test/server/security/check_system_xml_authentication_test-ags_xml_authentication_test.o: ags/test/server/security/ags_xml_authentication_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_authentication_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_authentication_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_authentication_test-ags_xml_authentication_test.o `test -f 'ags/test/server/security/ags_xml_authentication_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_authentication_test.c ags/test/server/security/check_system_xml_authentication_test-ags_xml_authentication_test.obj: ags/test/server/security/ags_xml_authentication_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_authentication_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_authentication_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_authentication_test-ags_xml_authentication_test.obj `if test -f 'ags/test/server/security/ags_xml_authentication_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_authentication_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_authentication_test.c'; fi` ags/test/server/security/check_system_xml_business_group_test-ags_xml_business_group_test.o: ags/test/server/security/ags_xml_business_group_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_business_group_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_business_group_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_business_group_test-ags_xml_business_group_test.o `test -f 'ags/test/server/security/ags_xml_business_group_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_business_group_test.c ags/test/server/security/check_system_xml_business_group_test-ags_xml_business_group_test.obj: ags/test/server/security/ags_xml_business_group_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_business_group_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_business_group_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_business_group_test-ags_xml_business_group_test.obj `if test -f 'ags/test/server/security/ags_xml_business_group_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_business_group_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_business_group_test.c'; fi` ags/test/server/security/check_system_xml_certificate_test-ags_xml_certificate_test.o: ags/test/server/security/ags_xml_certificate_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_certificate_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_certificate_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_certificate_test-ags_xml_certificate_test.o `test -f 'ags/test/server/security/ags_xml_certificate_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_certificate_test.c ags/test/server/security/check_system_xml_certificate_test-ags_xml_certificate_test.obj: ags/test/server/security/ags_xml_certificate_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_certificate_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_certificate_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_certificate_test-ags_xml_certificate_test.obj `if test -f 'ags/test/server/security/ags_xml_certificate_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_certificate_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_certificate_test.c'; fi` ags/test/server/security/check_system_xml_password_store_test-ags_xml_password_store_test.o: ags/test/server/security/ags_xml_password_store_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_password_store_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_password_store_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_password_store_test-ags_xml_password_store_test.o `test -f 'ags/test/server/security/ags_xml_password_store_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_password_store_test.c ags/test/server/security/check_system_xml_password_store_test-ags_xml_password_store_test.obj: ags/test/server/security/ags_xml_password_store_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xml_password_store_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xml_password_store_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/check_system_xml_password_store_test-ags_xml_password_store_test.obj `if test -f 'ags/test/server/security/ags_xml_password_store_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_password_store_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_password_store_test.c'; fi` ags/test/X/check_system_xorg_application_context_test-ags_xorg_application_context_test.o: ags/test/X/ags_xorg_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xorg_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xorg_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_xorg_application_context_test-ags_xorg_application_context_test.o `test -f 'ags/test/X/ags_xorg_application_context_test.c' || echo '$(srcdir)/'`ags/test/X/ags_xorg_application_context_test.c ags/test/X/check_system_xorg_application_context_test-ags_xorg_application_context_test.obj: ags/test/X/ags_xorg_application_context_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_xorg_application_context_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_xorg_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_xorg_application_context_test-ags_xorg_application_context_test.obj `if test -f 'ags/test/X/ags_xorg_application_context_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_xorg_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_xorg_application_context_test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ags-docs-local: ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: unit-system-tests.mk $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ags/test/X/$(am__dirstamp) -rm -f ags/test/audio/$(am__dirstamp) -rm -f ags/test/audio/midi/$(am__dirstamp) -rm -f ags/test/audio/osc/$(am__dirstamp) -rm -f ags/test/audio/osc/controller/$(am__dirstamp) -rm -f ags/test/audio/osc/xmlrpc/$(am__dirstamp) -rm -f ags/test/audio/recall/$(am__dirstamp) -rm -f ags/test/audio/task/$(am__dirstamp) -rm -f ags/test/file/$(am__dirstamp) -rm -f ags/test/lib/$(am__dirstamp) -rm -f ags/test/object/$(am__dirstamp) -rm -f ags/test/plugin/$(am__dirstamp) -rm -f ags/test/server/$(am__dirstamp) -rm -f ags/test/server/controller/$(am__dirstamp) -rm -f ags/test/server/security/$(am__dirstamp) -rm -f ags/test/thread/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-recursive ags-docs-am: ags-docs-local clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f unit-system-tests.mk distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f unit-system-tests.mk maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS ags-docs-am \ ags-docs-local all all-am am--refresh check check-am clean \ clean-cscope clean-generic clean-libtool clean-noinstPROGRAMS \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: unit-system-tests.mk @WITH_SYSTEM_TESTS_TRUE@ags-check-system-unit-tests: $(libags_installcheck_programs) $(libags_audio_installcheck_programs) $(libgsequencer_installcheck_programs) @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_buffer_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_complex_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_conversion_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_log_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_time_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_turtle_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_turtle_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_application_context_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_config_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_connectable_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_soundcard_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_destroy_worker_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_returnable_thread_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_task_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_thread_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_thread_pool_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_worker_thread_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_file_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_file_id_ref_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_file_launch_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_file_lookup_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_server_application_context_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_server_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_front_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_authentication_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_business_group_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_certificate_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_password_store_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_xml_authentication_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_xml_business_group_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_xml_certificate_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_xml_password_store_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_security_context_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_base_plugin_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_dssi_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_dssi_plugin_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_ladspa_conversion_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_ladspa_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_conversion_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_option_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_plugin_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_preset_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_uri_map_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_urid_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2_worker_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2ui_manager_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_lv2ui_plugin_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_plugin_port_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_audio_application_context_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_devin_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_devout_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_fifoout_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_midiin_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_playback_domain_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_playback_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_preset_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_input_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_output_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recycling_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_audio_buffer_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_char_buffer_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_filter_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_fm_synth_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_fourier_transform_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_channel_run_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_container_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_dependency_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_id_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recall_recycling_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_recycling_context_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_synth_generator_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_port_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_pattern_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_notation_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_note_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_automation_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_acceleration_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_wave_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_buffer_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_midi_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_track_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_midi_buffer_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_midi_builder_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_buffer_util_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_client_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_connection_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_message_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_server_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_websocket_connection_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_xmlrpc_message_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_xmlrpc_server_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_action_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_config_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_front_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_renew_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_info_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_meter_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_node_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_status_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_osc_xmlrpc_controller_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_analyse_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_analyse_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_buffer_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_buffer_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_capture_wave_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_capture_wave_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_copy_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_copy_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_copy_pattern_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_copy_pattern_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_count_beats_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_delay_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_envelope_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_envelope_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_eq10_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_eq10_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_feed_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_mute_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_mute_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_mute_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_peak_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_peak_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_play_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_play_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_play_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_play_wave_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_play_wave_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_prepare_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_record_midi_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_route_dssi_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_route_lv2_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_stream_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_volume_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_volume_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_add_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_add_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_add_effect_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_add_note_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_add_soundcard_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_apply_bpm_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_apply_presets_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_apply_sequencer_length_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_apply_synth_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_apply_tact_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_cancel_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_cancel_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_clear_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_clear_buffer_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_crop_note_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_export_output_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_free_selection_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_link_channel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_move_note_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_remove_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_remove_audio_signal_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_remove_note_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_remove_soundcard_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_reset_amplitude_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_reset_peak_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_resize_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_seek_soundcard_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_set_audio_channels_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_set_buffer_size_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_set_device_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_set_format_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_set_muted_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_set_samplerate_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_start_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_start_channel_test # WITH_SYSTEM_TESTS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/AUTHORS0000644000175000017500000000075613607210263011660 00000000000000Joël Krähemann Daniel Maksymow Copyright (C) 2005-2019 Joël Krähemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". gsequencer-3.1.3/COPYING.stk-4.30000644000175000017500000000241113461636431012742 00000000000000License: STK-4.3 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gsequencer-3.1.3/org.nongnu.gsequencer.gsequencer.appdata.xml0000644000175000017500000001612113616617253021340 00000000000000 org.nongnu.gsequencer.gsequencer FSFAP GPL-3.0-or-later none GSequencer Advanced Gtk+ Sequencer

GSequencer provides you various tools to play, create, edit and mix your own music. It features a step sequencer, piano roll, automation and wave-form editor.

gsequencer.desktop GSequencer's main window https://directory.fsf.org/w/images/9/95/Gsequencer-main-window.png https://directory.fsf.org/w/images/7/79/Gsequencer-automation-window.png https://nongnu.org/gsequencer

Updated the user manual.

Implemented meta widgets of notation, automation and wave editor.

Implemented acoustic feedback of DSSI and LV2.

Fixed automation editor not showing again after machine changed.

Minor improvements

Fixes to WASAPI backend.

Fixes to CoreAudio backend.

Improved pulseaudio connect timeout.

Fixed potential SIGSEGV.

Fixed potential data-race.

Fixed potential recursive callback.

Fixed potential data-race.

Migrated to Gtk-3.

Migrated to GIO socket API.

Migrated to GThread API.

Migrated to Libsoup2.4 API.

Implemented AgsAudiorec's fast export.

Implemented GObject-Introspection support.

Improved AgsSpectrometer resolution.

Improved MIDI import/export.

Improved performance.

Implemented GObject-Introspection annotations, enjoy the new GIRs.

Implemented AgsServer XMLRPC based authentication using XML files with session cookie support. There is a new dependency on Libsoup2.4.

Implemented AGS-OSC-OVER-XMLRPC allowing you to encapsule OSC packets in your XMLRPC request. Response is handled by WebSockets.

Migrated from Gtk+-2.0 to Gtk+-3.0.

Migrated from POSIX to GThread API.

Major API changes.

Supporting LLVM's clang compiler. Replaced nested functions GNU C extension.

Fixed some potential SIGSEGVs.

Implemented ags_audio_buffer_resample_with_buffer() and related.

Fixed potential buffer-overflow in ags_sfz_sample.c.

Fixed potential SIGSEGV in ags_sound_resource.c during resample.

minor improvements.

Fixed potential SIGSEGV of AgsFFPlayer adding plugin.

Fixed accessing freed memory of AgsBulkMember.

Minor improvements.

Fixed AgsAudiorec open audio files with different samplerate.

Minor improvements.

Improved AgsPitchSampler and fixed persistence.

Minor improvements.

Implemented new machines AgsFMSynth, AgsFMSyncsynth and AgsPitchSampler.

New impulse oscillator wave.

Faster iterating on buffer in ags_audio_buffer_util.c.

Replaced regular expression in ags_turtle_read_pn_chars_base().

Improved AgsReturnableThread safety.

Fixed various memory-leaks.

Fixed uninitialized values.

Implemented GUI scale factor.

Improved LV2 logarithmic conversion.

Improved check if LV2 plugin port already exists.

Improved LV2 RDF Turtle parser.

Fixed potential SIGSEGV during restore from XML in ags_simple_file.c.

Improved mutexes.

Fixed some memory-leaks.

Fixed potential SIGSEGV during restore from XML in ags_simple_file.c.

gsequencer-3.1.3/acsite.m40000644000175000017500000000056513375006203012317 00000000000000# check for the presence of help2man # if it is available then set MANPAGES to # the list of man page files to create # # AC_PROG_HELP2MAN(list-of-man-pages) AC_DEFUN([AC_PROG_HELP2MAN], [{ AC_CHECK_PROGS([HELP2MAN], [help2man]) if ! test -z "$HELP2MAN" then AC_SUBST(MANPAGES, $1) HAVE_HELP2MAN=true fi AM_CONDITIONAL([HAVE_HELP2MAN], [test x$HAVE_HELP2MAN = xtrue]) }]) gsequencer-3.1.3/prepare-distribution.sh0000755000175000017500000000475713521306053015325 00000000000000#!/bin/bash # # Copyright (C) 2005-2019 Jo\u00EBl Kr\u00E4hemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # ============================================================================== # title: Prepare distribution # description: This script prepares various files for distribution. The # purpose is to add missing copyright and license information # to generated files. # author: Joël Krähemann # date: Mon Jun 24 15:42:52 UTC 2019 # version: v0.1.0 # usage: bash prepare-distribution.sh # ============================================================================== gpl3_license_note="$PWD/license-notice-gnu-gpl-3-0+-sym.txt"; # API Reference Manual libags docs_libags_gpl3_files=("libags-overrides.txt" "libags-sections.txt" "libags.interfaces" "libags.types") for f in "${docs_libags_gpl3_files[@]}"; do cat $gpl3_license_note > docs/reference/libags/$f.in; echo -en "\n" >> docs/reference/libags/$f.in; cat docs/reference/libags/$f >> docs/reference/libags/$f.in; done # API Reference Manual libags-audio docs_libags_audio_gpl3_files=("libags_audio-overrides.txt" "libags_audio-sections.txt" "libags_audio.interfaces" "libags_audio.types") for f in "${docs_libags_audio_gpl3_files[@]}"; do cat $gpl3_license_note > docs/reference/libags-audio/$f.in; echo -en "\n" >> docs/reference/libags-audio/$f.in; cat docs/reference/libags-audio/$f >> docs/reference/libags-audio/$f.in; done # API Reference Manual libags-gui docs_libags_gui_gpl3_files=("libags_gui-overrides.txt" "libags_gui-sections.txt" "libags_gui.interfaces" "libags_gui.types") for f in "${docs_libags_gui_gpl3_files[@]}"; do cat $gpl3_license_note > docs/reference/libags-gui/$f.in; echo -en "\n" >> docs/reference/libags-gui/$f.in; cat docs/reference/libags-gui/$f >> docs/reference/libags-gui/$f.in; done # API Reference Manual libgsequencer docs_libgsequencer_gpl3_files=("libgsequencer-overrides.txt" "libgsequencer-sections.txt" "libgsequencer.interfaces" "libgsequencer.types") for f in "${docs_libgsequencer_gpl3_files[@]}"; do cat $gpl3_license_note > docs/reference/libgsequencer/$f.in; echo -en "\n" >> docs/reference/libgsequencer/$f.in; cat docs/reference/libgsequencer/$f >> docs/reference/libgsequencer/$f.in; done gsequencer-3.1.3/NEWS0000644000175000017500000002214313607326656011317 00000000000000Advanced Gtk+ Sequencer ==== Copyright (C) 2005-2020 Joël Krähemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Overview of Changes in AGS 3.0.0 ================================ * Implemented AgsAudiorec's fast export. * Implemented support for GObject-Introspection. Many gtk-doc annotations fixed and extended symbol descriptions. * Refactored AgsComplex and AgsUUID in order to work with introspection. The typedef doesn't use array types, anymore. But derived from a struct, now. * Implemented the AgsServer API dropped xmlrpc-c in favor of Libsoup2.4. Session support using HTTP cookies. * Yay, AGS-OSC-OVER-XMLRPC has arrived. You can send your OSC packets now over HTTP based on AgsServer supporting authentication and responses arrive on a Websocket. * Migrated to Gtk+-3.0, dropped builtin theme. Minimal CSS file enabling stepper for editors. * Migrated to GThread API, this was a quiet big refactoring. AgsThread core functions have been rewritten, mainly AgsThread::clock() and AgsThread::run(). Removed exotic functions like lock, unlock, wait and signal the tree. * Major API changes, dropped many old functions like writing the "Wall of XML" file. * Supporting LLVM's clang compiler for now. Replaced all nested functions. * Fixed some potential SIGSEGVs. * Added online help browser along the WebKitGtk dependency. * Added basic key accelerators like: Ctrl-o, Ctrl-s, Ctrl-q and Ctrl-h. To open or save files, quit the application or open online help browser. * Added better resolution to AgsSpectrometer. * Improved MIDI import/export. Overview of Changes in AGS 2.3.0 ================================ * Improved AgsSynthGenerator to support impulse and FM LFO oscillator. * Implemented new impulse oscillator in ags_synth_util.c * Implemented ags_fm_synth_util.c to do frequency modulation oscillators. Used by AgsSynthGenerator. * Implemented ags_lfo_synth_util.c to do amplification using LFO oscillator. * Added new machines AgsFMSynth, AgsFMSyncsynth and AgsPitchSampler. * Added support for complex data type. Overview of Changes in AGS 2.2.39 ================================ * Added AgsComplex data type support in ags_audio_buffer_util.h and completed Float32 support. Overview of Changes in AGS 2.2.38 ================================ * Completed reworking unrolled loops to use vectorized builtin functions in ags_audio_buffer_util.c. Improved the vector and audio buffer access using incrementing indices. Overview of Changes in AGS 2.2.0 ================================ * Implemented OSC export controller. Allowing you to trigger AgsExportOutput task by the OSC server. * Reworked parsing LV2 RDF Turtles. Providing a better conforming interpretation of prefixes and faster XPath expressions. * Improved copyright and licenses notices for many files. Overview of Changes in AGS 2.1.0 ================================ * Implemented OSC server with different server paths. It has a front controller passing the requests to the matching context path of a controller. * There is a new OSC buffer util and util file. Further you may use the AgsOscBuilder or AgsOscParser to interact with the OSC content format. * Configuration in place is done by AgsApplySoundConfig task. Overview of Changes in AGS 2.0.0 ================================ * Implemented wave form editor with basic editing capabilities. Like copy & paste, cursor positioning and editing dialogs. * New machines available AgsEqualizer10, AgsSpectrometer and AgsAudiorec. You can now have a built-in 10 band equalizer, a spectrometer visualizing the frequency using FFTW3 library and the ability to edit or record audio data. * Refactored libags*.so by providing many API improvements. Grained control of sound file resources. New lock strategy and many objects are thread-safe, now. * Implemented AgsWave and AgsBuffer to contain large amount of audio data. * Added AgsMidi and AgsTrack skelleton. Overview of Changes in AGS 1.3.0 ================================ * Supporting 4 different paste modes by allowing the user to activate do 2 different check menu tool buttons. Switches are match audio channel or line as well no duplicates. * New widget AgsScale available. It visualizes a control's possible value. It is accessible, implements AtkValue and AtkAction interface to control the ::value-changed signal or retrieving the range. * New widgets AgsScaleBox, AgsVScaleBox and AgsHScaleBox available. It is responsible to layout your AgsScale. It inherits of GtkBox and overrides GtkWidget::size-allocate and GtkWidget::size-request. * New widget AgsScrolledScaleBox available. It shall contain a AgsScaleBox and make it scrollable. * Refactored automation editor by removing AgsAutomationArea and using AgsAutomationEdit instead. The editor supports segmented automation. Overview of Changes in AGS 1.2.7 ================================ * Completed migrating to asynchronous communication from libags*.so.1 to libgsequencer.so. * Refactored large parts of ags_channel.c to remove redundant code and make all functions thread-safe. Fixed some regression related to linking. Overview of Changes in AGS 1.2.0 ================================ * Audio input support for all common backends like ALSA, OSS4, JACK and Pulseaudio. * New widget AgsPiano available. It is an accessible widget which draws a piano. It has events like ::key-pressed, ::key-released and ::key-clicked. * New widget AgsScrolledPiano available. It contains an AgsPiano and addtional scrolling capabilities. * New widget AgsNotebook available. It is has been moved from libgsequencer to libags-gui. It was refactored to be generic. * Refactored notation editor by replacing AgsEditor with AgsNotationEditor. Notes have an alpha channel now. The editor supports segmented notation. Overview of Changes in AGS 1.0.0 ================================ * Sticky controls allows you to adjust multiple controls at once. * Various bug-fixes especially improved Lv2ui syncing controls. Overview of Changes in AGS 1.0.0-beta ================================ * Experimental XMLRPC-C service prototype. Overview of Changes in AGS 0.9.29 ================================ * New automation editor dialogs to select or ramp acceleration. * New editor dialog to select notes. Overview of Changes in AGS 0.9.28 ================================ * all functional tests pass now again, since gtk_main() integration. Overview of Changes in AGS 0.9.26 ================================ * full gtk_main() support you might want to run it by calling ags_gui_thread_do_run(). Overview of Changes in AGS 0.9.24 ================================ * Support for LADSPA_PATH, DSSI_PATH and LV2_PATH environment variables * Core-audio audio unit backend in order to port the application to Apple OS X. Overview of Changes in AGS 0.9.10 ================================ * Pulseaudio sink support. AgsPulseDevout has got a bigger ring-buffer to avoid caching and allow slower write functions. Overview of Changes in AGS 0.9.8 ================================ * You may now specify base note of AgsSynth or AgsSyncsynth. Overview of Changes in AGS 0.9.7 ================================ * Implemented new functions to handle LV2_Event_Buffer. Note the old functions to do so are deprecated and are incompatible to the newer API. * AgsSyncsynth is a new AgsMachine object, allowing you to edit synth notation. * Smaller refactoring of AgsApplySynth to use new AgsSynthGenerator API. Overview of Changes in AGS 0.9.0 ================================ * Using destroy worker for AgsRecall related unref resulting in much better performance. * Many new unit tests and improved code by detecting errors. * Extended chapter 3 about concurrency of developer's book. Overview of Changes in AGS 0.8.9 ================================ * Lots of properties applied during AgsTask sub-type instantiation. Thus implemented missing ::finalize() and ::dispose(). Overview of Changes in AGS 0.8.8 ================================ * Additional editing tools available. After a Standard MIDI File import you might want to move or crop notes. There are 2 dialogs available of the toolbar allowing you to do so. Overview of Changes in AGS 0.8.5 ================================ * Envelope is ready now for use. Featuring envelope editor with presets, pattern presets and information tab. * Envelope dialog available trough machine's context menu. Supported by AgsDrum, AgsMatrix, AgsFFPlayer, AgsDssiBridge and AgsLv2Bridge. * Fixed missing persistence of AgsLiveDssiBridge and AgsLiveLv2Bridge Overview of Changes in AGS 0.8.2 ================================ * Added gettext support Overview of Changes in AGS 0.8.0 ================================ * Added MIDI import wizard * Added MIDI export wizard Overview of Changes in AGS 0.7.0 ================================ * provide GSequencer functionality as libraries gsequencer-3.1.3/unit-system-tests.mk.am0000644000175000017500000041010713614062654015200 00000000000000# Copyright (C) 2005-2019 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. AUTOMAKE_OPTIONS = foreign no-dependencies SUBDIRS = po AM_CPPFLAGS = -std=gnu99 -include errno.h -DSRCDIR=\"$(srcdir)\" noinst_PROGRAMS = AGS_FEATURES = if WITH_LIBINSTPATCH AGS_FEATURES += -DAGS_WITH_LIBINSTPATCH=1 endif if WITH_SYSTEM_TESTS # unit system tests - libags libags_installcheck_programs = \ ags_check_system_buffer_util_test \ ags_check_system_complex_test \ ags_check_system_conversion_test \ ags_check_system_log_test \ ags_check_system_time_test \ ags_check_system_turtle_manager_test \ ags_check_system_turtle_test \ ags_check_system_application_context_test \ ags_check_system_config_test \ ags_check_system_connectable_test \ ags_check_system_soundcard_test \ ags_check_system_destroy_worker_test \ ags_check_system_returnable_thread_test \ ags_check_system_task_test \ ags_check_system_thread_test \ ags_check_system_thread_pool_test \ ags_check_system_worker_thread_test \ ags_check_system_file_test \ ags_check_system_file_id_ref_test \ ags_check_system_file_launch_test \ ags_check_system_file_lookup_test \ ags_check_system_server_application_context_test \ ags_check_system_server_test \ ags_check_system_controller_test \ ags_check_system_front_controller_test \ ags_check_system_authentication_manager_test \ ags_check_system_business_group_manager_test \ ags_check_system_certificate_manager_test \ ags_check_system_password_store_manager_test \ ags_check_system_xml_authentication_test \ ags_check_system_xml_business_group_test \ ags_check_system_xml_certificate_test \ ags_check_system_xml_password_store_test \ ags_check_system_security_context_test # unit system tests - libags-audio libags_audio_installcheck_programs = \ ags_check_system_base_plugin_test \ ags_check_system_dssi_manager_test \ ags_check_system_dssi_plugin_test \ ags_check_system_ladspa_conversion_test \ ags_check_system_ladspa_manager_test \ ags_check_system_lv2_conversion_test \ ags_check_system_lv2_manager_test \ ags_check_system_lv2_option_manager_test \ ags_check_system_lv2_plugin_test \ ags_check_system_lv2_preset_test \ ags_check_system_lv2_uri_map_manager_test \ ags_check_system_lv2_urid_manager_test \ ags_check_system_lv2_worker_manager_test \ ags_check_system_lv2ui_manager_test \ ags_check_system_lv2ui_plugin_test \ ags_check_system_plugin_port_test libags_audio_installcheck_programs += \ ags_check_system_audio_application_context_test \ ags_check_system_devin_test \ ags_check_system_devout_test \ ags_check_system_fifoout_test \ ags_check_system_midiin_test \ ags_check_system_audio_test \ ags_check_system_playback_domain_test \ ags_check_system_playback_test \ ags_check_system_preset_test \ ags_check_system_channel_test \ ags_check_system_input_test \ ags_check_system_output_test \ ags_check_system_recycling_test \ ags_check_system_audio_signal_test \ ags_check_system_audio_buffer_util_test \ ags_check_system_char_buffer_util_test \ ags_check_system_filter_util_test \ ags_check_system_fm_synth_util_test \ ags_check_system_fourier_transform_util_test \ ags_check_system_recall_test \ ags_check_system_recall_channel_test \ ags_check_system_recall_channel_run_test \ ags_check_system_recall_container_test \ ags_check_system_recall_dependency_test \ ags_check_system_recall_id_test \ ags_check_system_recall_recycling_test \ ags_check_system_recycling_context_test \ ags_check_system_synth_generator_test \ ags_check_system_port_test \ ags_check_system_pattern_test \ ags_check_system_notation_test \ ags_check_system_note_test \ ags_check_system_automation_test \ ags_check_system_acceleration_test \ ags_check_system_wave_test \ ags_check_system_buffer_test \ ags_check_system_midi_test \ ags_check_system_track_test \ ags_check_system_midi_buffer_util_test \ ags_check_system_midi_builder_test libags_audio_installcheck_programs += \ ags_check_system_osc_buffer_util_test \ ags_check_system_osc_client_test \ ags_check_system_osc_connection_test \ ags_check_system_osc_message_test \ ags_check_system_osc_server_test \ ags_check_system_osc_websocket_connection_test \ ags_check_system_osc_xmlrpc_message_test \ ags_check_system_osc_xmlrpc_server_test \ ags_check_system_osc_action_controller_test \ ags_check_system_osc_config_controller_test \ ags_check_system_osc_front_controller_test \ ags_check_system_osc_renew_controller_test \ ags_check_system_osc_info_controller_test \ ags_check_system_osc_meter_controller_test \ ags_check_system_osc_node_controller_test \ ags_check_system_osc_status_controller_test \ ags_check_system_osc_xmlrpc_controller_test libags_audio_installcheck_programs += \ ags_check_system_analyse_audio_signal_test \ ags_check_system_analyse_channel_test \ ags_check_system_buffer_audio_signal_test \ ags_check_system_buffer_channel_test \ ags_check_system_capture_wave_audio_test \ ags_check_system_capture_wave_channel_test \ ags_check_system_copy_audio_signal_test \ ags_check_system_copy_channel_test \ ags_check_system_copy_pattern_audio_test \ ags_check_system_copy_pattern_channel_test \ ags_check_system_count_beats_audio_test \ ags_check_system_delay_audio_test \ ags_check_system_envelope_audio_signal_test \ ags_check_system_envelope_channel_test \ ags_check_system_eq10_audio_signal_test \ ags_check_system_eq10_channel_test \ ags_check_system_feed_audio_signal_test \ ags_check_system_mute_audio_test \ ags_check_system_mute_audio_signal_test \ ags_check_system_mute_channel_test \ ags_check_system_peak_audio_signal_test \ ags_check_system_peak_channel_test \ ags_check_system_play_audio_test \ ags_check_system_play_audio_signal_test \ ags_check_system_play_channel_test \ ags_check_system_play_wave_audio_test \ ags_check_system_play_wave_channel_test \ ags_check_system_prepare_audio_signal_test \ ags_check_system_record_midi_audio_test \ ags_check_system_route_dssi_audio_test \ ags_check_system_route_lv2_audio_test \ ags_check_system_stream_audio_signal_test \ ags_check_system_volume_audio_signal_test \ ags_check_system_volume_channel_test libags_audio_installcheck_programs += \ ags_check_system_add_audio_test \ ags_check_system_add_audio_signal_test \ ags_check_system_add_effect_test \ ags_check_system_add_note_test \ ags_check_system_add_soundcard_test \ ags_check_system_apply_bpm_test \ ags_check_system_apply_presets_test \ ags_check_system_apply_sequencer_length_test \ ags_check_system_apply_synth_test \ ags_check_system_apply_tact_test \ ags_check_system_cancel_audio_test \ ags_check_system_cancel_channel_test \ ags_check_system_clear_audio_signal_test \ ags_check_system_clear_buffer_test \ ags_check_system_crop_note_test \ ags_check_system_export_output_test \ ags_check_system_free_selection_test \ ags_check_system_link_channel_test \ ags_check_system_move_note_test \ ags_check_system_remove_audio_test \ ags_check_system_remove_audio_signal_test \ ags_check_system_remove_note_test \ ags_check_system_remove_soundcard_test \ ags_check_system_reset_amplitude_test \ ags_check_system_reset_peak_test \ ags_check_system_resize_audio_test \ ags_check_system_seek_soundcard_test \ ags_check_system_set_audio_channels_test \ ags_check_system_set_buffer_size_test \ ags_check_system_set_device_test \ ags_check_system_set_format_test \ ags_check_system_set_muted_test \ ags_check_system_set_samplerate_test \ ags_check_system_start_audio_test \ ags_check_system_start_channel_test # unit sytem tests - libgsequencer libgsequencer_installcheck_programs = \ ags_check_system_xorg_application_context_test noinst_PROGRAMS += $(libags_installcheck_programs) $(libags_audio_installcheck_programs) $(libgsequencer_installcheck_programs) # buffer util unit test ags_check_system_buffer_util_test_SOURCES = ags/test/lib/ags_buffer_util_test.c ags_check_system_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # complex unit test ags_check_system_complex_test_SOURCES = ags/test/lib/ags_complex_test.c ags_check_system_complex_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_complex_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_complex_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_complex_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # conversion unit test ags_check_system_conversion_test_SOURCES = ags/test/lib/ags_conversion_test.c ags_check_system_conversion_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_conversion_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_conversion_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_conversion_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # log unit test ags_check_system_log_test_SOURCES = ags/test/lib/ags_log_test.c ags_check_system_log_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_log_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_log_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_log_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # time unit test ags_check_system_time_test_SOURCES = ags/test/lib/ags_time_test.c ags_check_system_time_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_time_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_time_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_time_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle manager unit test ags_check_system_turtle_manager_test_SOURCES = ags/test/lib/ags_turtle_manager_test.c ags_check_system_turtle_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_turtle_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_turtle_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_turtle_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle unit test ags_check_system_turtle_test_SOURCES = ags/test/lib/ags_turtle_test.c ags_check_system_turtle_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_turtle_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_turtle_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_turtle_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # application context unit test ags_check_system_application_context_test_SOURCES = ags/test/object/ags_application_context_test.c ags_check_system_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_application_context_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # config unit test ags_check_system_config_test_SOURCES = ags/test/object/ags_config_test.c ags_check_system_config_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_config_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_config_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_config_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # connectable unit test ags_check_system_connectable_test_SOURCES = ags/test/object/ags_connectable_test.c ags_check_system_connectable_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_connectable_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_connectable_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_connectable_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lags_audio -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # soundcard unit test ags_check_system_soundcard_test_SOURCES = ags/test/object/ags_soundcard_test.c ags_check_system_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_soundcard_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # destroy worker unit test ags_check_system_destroy_worker_test_SOURCES = ags/test/thread/ags_destroy_worker_test.c ags_check_system_destroy_worker_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_destroy_worker_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_destroy_worker_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_destroy_worker_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # returnable thread unit test ags_check_system_returnable_thread_test_SOURCES = ags/test/thread/ags_returnable_thread_test.c ags_check_system_returnable_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_returnable_thread_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_returnable_thread_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_returnable_thread_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # task unit test ags_check_system_task_test_SOURCES = ags/test/thread/ags_task_test.c ags_check_system_task_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_task_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_task_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) ags_check_system_task_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread unit test ags_check_system_thread_test_SOURCES = ags/test/thread/ags_thread_test.c ags_check_system_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_thread_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_thread_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) ags_check_system_thread_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread pool unit test ags_check_system_thread_pool_test_SOURCES = ags/test/thread/ags_thread_pool_test.c ags_check_system_thread_pool_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_thread_pool_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_thread_pool_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_thread_pool_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # worker thread unit test ags_check_system_worker_thread_test_SOURCES = ags/test/thread/ags_worker_thread_test.c ags_check_system_worker_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_worker_thread_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_worker_thread_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_worker_thread_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file unit test ags_check_system_file_test_SOURCES = ags/test/file/ags_file_test.c ags_check_system_file_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_file_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_file_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_file_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file id ref unit test ags_check_system_file_id_ref_test_SOURCES = ags/test/file/ags_file_id_ref_test.c ags_check_system_file_id_ref_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_file_id_ref_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_file_id_ref_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_file_id_ref_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file launch unit test ags_check_system_file_launch_test_SOURCES = ags/test/file/ags_file_launch_test.c ags_check_system_file_launch_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_file_launch_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_file_launch_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_file_launch_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file lookup unit test ags_check_system_file_lookup_test_SOURCES = ags/test/file/ags_file_lookup_test.c ags_check_system_file_lookup_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_file_lookup_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_file_lookup_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_file_lookup_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server application context unit test ags_check_system_server_application_context_test_SOURCES = ags/test/server/ags_server_application_context_test.c ags_check_system_server_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_server_application_context_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_server_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_server_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server unit test ags_check_system_server_test_SOURCES = ags/test/server/ags_server_test.c ags_check_system_server_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_server_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_server_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # controller unit test ags_check_system_controller_test_SOURCES = ags/test/server/controller/ags_controller_test.c ags_check_system_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # front controller unit test ags_check_system_front_controller_test_SOURCES = ags/test/server/controller/ags_front_controller_test.c ags_check_system_front_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_front_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_front_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # authentication manager unit test ags_check_system_authentication_manager_test_SOURCES = ags/test/server/security/ags_authentication_manager_test.c ags_check_system_authentication_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_authentication_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_authentication_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_authentication_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # business group manager unit test ags_check_system_business_group_manager_test_SOURCES = ags/test/server/security/ags_business_group_manager_test.c ags_check_system_business_group_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_business_group_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_business_group_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_business_group_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # certificate manager unit test ags_check_system_certificate_manager_test_SOURCES = ags/test/server/security/ags_certificate_manager_test.c ags_check_system_certificate_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_certificate_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_certificate_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_certificate_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # password store manager unit test ags_check_system_password_store_manager_test_SOURCES = ags/test/server/security/ags_password_store_manager_test.c ags_check_system_password_store_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_password_store_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_password_store_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_password_store_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML authentication unit test ags_check_system_xml_authentication_test_SOURCES = ags/test/server/security/ags_xml_authentication_test.c ags_check_system_xml_authentication_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_xml_authentication_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_xml_authentication_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_xml_authentication_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML business group unit test ags_check_system_xml_business_group_test_SOURCES = ags/test/server/security/ags_xml_business_group_test.c ags_check_system_xml_business_group_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_xml_business_group_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_xml_business_group_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_xml_business_group_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML certificate unit test ags_check_system_xml_certificate_test_SOURCES = ags/test/server/security/ags_xml_certificate_test.c ags_check_system_xml_certificate_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_xml_certificate_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_xml_certificate_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_xml_certificate_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML password store unit test ags_check_system_xml_password_store_test_SOURCES = ags/test/server/security/ags_xml_password_store_test.c ags_check_system_xml_password_store_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_xml_password_store_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_xml_password_store_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_xml_password_store_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # security context unit test ags_check_system_security_context_test_SOURCES = ags/test/server/security/ags_security_context_test.c ags_check_system_security_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_check_system_security_context_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_security_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_security_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # base plugin unit test ags_check_system_base_plugin_test_SOURCES = ags/test/plugin/ags_base_plugin_test.c ags_check_system_base_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_base_plugin_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_base_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_base_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi manager unit test ags_check_system_dssi_manager_test_SOURCES = ags/test/plugin/ags_dssi_manager_test.c ags_check_system_dssi_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_dssi_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_dssi_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_dssi_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi plugin unit test ags_check_system_dssi_plugin_test_SOURCES = ags/test/plugin/ags_dssi_plugin_test.c ags_check_system_dssi_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_dssi_plugin_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_dssi_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_dssi_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa conversion unit test ags_check_system_ladspa_conversion_test_SOURCES = ags/test/plugin/ags_ladspa_conversion_test.c ags_check_system_ladspa_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_ladspa_conversion_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_ladspa_conversion_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_ladspa_conversion_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa manager unit test ags_check_system_ladspa_manager_test_SOURCES = ags/test/plugin/ags_ladspa_manager_test.c ags_check_system_ladspa_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_ladspa_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_ladspa_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_ladspa_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 conversion unit test ags_check_system_lv2_conversion_test_SOURCES = ags/test/plugin/ags_lv2_conversion_test.c ags_check_system_lv2_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_conversion_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_conversion_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_conversion_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 manager unit test ags_check_system_lv2_manager_test_SOURCES = ags/test/plugin/ags_lv2_manager_test.c ags_check_system_lv2_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 option manager unit test ags_check_system_lv2_option_manager_test_SOURCES = ags/test/plugin/ags_lv2_option_manager_test.c ags_check_system_lv2_option_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_option_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_option_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_option_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 plugin unit test ags_check_system_lv2_plugin_test_SOURCES = ags/test/plugin/ags_lv2_plugin_test.c ags_check_system_lv2_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_plugin_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 preset unit test ags_check_system_lv2_preset_test_SOURCES = ags/test/plugin/ags_lv2_preset_test.c ags_check_system_lv2_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_preset_test_CPPFLAGS =-DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_lv2_preset_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_preset_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 uri map manager unit test ags_check_system_lv2_uri_map_manager_test_SOURCES = ags/test/plugin/ags_lv2_uri_map_manager_test.c ags_check_system_lv2_uri_map_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_uri_map_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_uri_map_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_uri_map_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 urid manager unit test ags_check_system_lv2_urid_manager_test_SOURCES = ags/test/plugin/ags_lv2_urid_manager_test.c ags_check_system_lv2_urid_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_urid_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_urid_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_urid_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 worker manager unit test ags_check_system_lv2_worker_manager_test_SOURCES = ags/test/plugin/ags_lv2_worker_manager_test.c ags_check_system_lv2_worker_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2_worker_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2_worker_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2_worker_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui manager unit test ags_check_system_lv2ui_manager_test_SOURCES = ags/test/plugin/ags_lv2ui_manager_test.c ags_check_system_lv2ui_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2ui_manager_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2ui_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2ui_manager_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui plugin unit test ags_check_system_lv2ui_plugin_test_SOURCES = ags/test/plugin/ags_lv2ui_plugin_test.c ags_check_system_lv2ui_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_lv2ui_plugin_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_lv2ui_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_lv2ui_plugin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # plugin port unit test ags_check_system_plugin_port_test_SOURCES = ags/test/plugin/ags_plugin_port_test.c ags_check_system_plugin_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_plugin_port_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_plugin_port_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_plugin_port_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio application context unit test ags_check_system_audio_application_context_test_SOURCES = ags/test/audio/ags_audio_application_context_test.c ags_check_system_audio_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_audio_application_context_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_audio_application_context_test_LDFLAGS = $(LDFLAGS) -pthread ags_check_system_audio_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devin unit test ags_check_system_devin_test_SOURCES = ags/test/audio/ags_devin_test.c ags_check_system_devin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_devin_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_devin_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_devin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devout unit test ags_check_system_devout_test_SOURCES = ags/test/audio/ags_devout_test.c ags_check_system_devout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_devout_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_devout_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_devout_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fifoout unit test ags_check_system_fifoout_test_SOURCES = ags/test/audio/ags_fifoout_test.c ags_check_system_fifoout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_fifout_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_fifoout_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_fifoout_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midiin unit test ags_check_system_midiin_test_SOURCES = ags/test/audio/ags_midiin_test.c ags_check_system_midiin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_midiin_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_midiin_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_midiin_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio unit test ags_check_system_audio_test_SOURCES = ags/test/audio/ags_audio_test.c ags_check_system_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback domain unit test ags_check_system_playback_domain_test_SOURCES = ags/test/audio/ags_playback_domain_test.c ags_check_system_playback_domain_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_playback_domain_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_playback_domain_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_playback_domain_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback unit test ags_check_system_playback_test_SOURCES = ags/test/audio/ags_playback_test.c ags_check_system_playback_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_playback_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_playback_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_playback_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # preset unit test ags_check_system_preset_test_SOURCES = ags/test/audio/ags_preset_test.c ags_check_system_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_preset_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_preset_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_preset_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # channel unit test ags_check_system_channel_test_SOURCES = ags/test/audio/ags_channel_test.c ags_check_system_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # input unit test ags_check_system_input_test_SOURCES = ags/test/audio/ags_input_test.c ags_check_system_input_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_input_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_input_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_input_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # output unit test ags_check_system_output_test_SOURCES = ags/test/audio/ags_output_test.c ags_check_system_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_output_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_output_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_output_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling unit test ags_check_system_recycling_test_SOURCES = ags/test/audio/ags_recycling_test.c ags_check_system_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recycling_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recycling_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recycling_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio signal unit test ags_check_system_audio_signal_test_SOURCES = ags/test/audio/ags_audio_signal_test.c ags_check_system_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio buffer util unit test ags_check_system_audio_buffer_util_test_SOURCES = ags/test/audio/ags_audio_buffer_util_test.c ags_check_system_audio_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_audio_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_audio_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_audio_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # char buffer util unit test ags_check_system_char_buffer_util_test_SOURCES = ags/test/audio/ags_char_buffer_util_test.c ags_check_system_char_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_char_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_char_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_char_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # filter util unit test ags_check_system_filter_util_test_SOURCES = ags/test/audio/ags_filter_util_test.c ags_check_system_filter_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_filter_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_filter_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_filter_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # FM synth util unit test ags_check_system_fm_synth_util_test_SOURCES = ags/test/audio/ags_fm_synth_util_test.c ags_check_system_fm_synth_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_fm_synth_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_fm_synth_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_fm_synth_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fourier transform util unit test ags_check_system_fourier_transform_util_test_SOURCES = ags/test/audio/ags_fourier_transform_util_test.c ags_check_system_fourier_transform_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_fourier_transfrom_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_fourier_transform_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_fourier_transform_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall unit test ags_check_system_recall_test_SOURCES = ags/test/audio/ags_recall_test.c ags_check_system_recall_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel unit test ags_check_system_recall_channel_test_SOURCES = ags/test/audio/ags_recall_channel_test.c ags_check_system_recall_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel run unit test ags_check_system_recall_channel_run_test_SOURCES = ags/test/audio/ags_recall_channel_run_test.c ags_check_system_recall_channel_run_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_channel_run_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_channel_run_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_channel_run_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall container unit test ags_check_system_recall_container_test_SOURCES = ags/test/audio/ags_recall_container_test.c ags_check_system_recall_container_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_container_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_container_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_container_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall dependency unit test ags_check_system_recall_dependency_test_SOURCES = ags/test/audio/ags_recall_dependency_test.c ags_check_system_recall_dependency_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_dependency_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_dependency_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_dependency_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall id unit test ags_check_system_recall_id_test_SOURCES = ags/test/audio/ags_recall_id_test.c ags_check_system_recall_id_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_id_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_id_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_id_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall recycling unit test ags_check_system_recall_recycling_test_SOURCES = ags/test/audio/ags_recall_recycling_test.c ags_check_system_recall_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recall_recycling_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recall_recycling_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recall_recycling_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling context unit test ags_check_system_recycling_context_test_SOURCES = ags/test/audio/ags_recycling_context_test.c ags_check_system_recycling_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_recycling_context_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_recycling_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_recycling_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # synth generator unit test ags_check_system_synth_generator_test_SOURCES = ags/test/audio/ags_synth_generator_test.c ags_check_system_synth_generator_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_synth_generator_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_synth_generator_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_synth_generator_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # port unit test ags_check_system_port_test_SOURCES = ags/test/audio/ags_port_test.c ags_check_system_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_port_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_port_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_port_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # pattern unit test ags_check_system_pattern_test_SOURCES = ags/test/audio/ags_pattern_test.c ags_check_system_pattern_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_pattern_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_pattern_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_pattern_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # notation unit test ags_check_system_notation_test_SOURCES = ags/test/audio/ags_notation_test.c ags_check_system_notation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_notation_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_notation_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_notation_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # note unit test ags_check_system_note_test_SOURCES = ags/test/audio/ags_note_test.c ags_check_system_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_note_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # automation unit test ags_check_system_automation_test_SOURCES = ags/test/audio/ags_automation_test.c ags_check_system_automation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_automation_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_automation_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_automation_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # acceleration unit test ags_check_system_acceleration_test_SOURCES = ags/test/audio/ags_acceleration_test.c ags_check_system_acceleration_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_acceleration_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_acceleration_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_acceleration_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # wave unit test ags_check_system_wave_test_SOURCES = ags/test/audio/ags_wave_test.c ags_check_system_wave_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_wave_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_wave_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_wave_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer unit test ags_check_system_buffer_test_SOURCES = ags/test/audio/ags_buffer_test.c ags_check_system_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_buffer_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_buffer_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_buffer_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi unit test ags_check_system_midi_test_SOURCES = ags/test/audio/ags_midi_test.c ags_check_system_midi_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_midi_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_midi_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_midi_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # track unit test ags_check_system_track_test_SOURCES = ags/test/audio/ags_track_test.c ags_check_system_track_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_track_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_track_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_track_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi buffer util unit test ags_check_system_midi_buffer_util_test_SOURCES = ags/test/audio/midi/ags_midi_buffer_util_test.c ags_check_system_midi_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_midi_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_midi_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_midi_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi builder unit test ags_check_system_midi_builder_test_SOURCES = ags/test/audio/midi/ags_midi_builder_test.c ags_check_system_midi_builder_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_midi_builder_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_midi_builder_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_midi_builder_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc buffer util unit test ags_check_system_osc_buffer_util_test_SOURCES = ags/test/audio/osc/ags_osc_buffer_util_test.c ags_check_system_osc_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_buffer_util_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_buffer_util_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc client unit test ags_check_system_osc_client_test_SOURCES = ags/test/audio/osc/ags_osc_client_test.c ags_check_system_osc_client_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_client_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_client_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_client_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc connection unit test ags_check_system_osc_connection_test_SOURCES = ags/test/audio/osc/ags_osc_connection_test.c ags_check_system_osc_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_connection_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_connection_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_connection_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc message unit test ags_check_system_osc_message_test_SOURCES = ags/test/audio/osc/ags_osc_message_test.c ags_check_system_osc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_message_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_message_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_message_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc server unit test ags_check_system_osc_server_test_SOURCES = ags/test/audio/osc/ags_osc_server_test.c ags_check_system_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_server_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_server_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc websocket connection unit test ags_check_system_osc_websocket_connection_test_SOURCES = ags/test/audio/osc/ags_osc_websocket_connection_test.c ags_check_system_osc_websocket_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_websocket_connection_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_websocket_connection_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_websocket_connection_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC message unit test ags_check_system_osc_xmlrpc_message_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_message_test.c ags_check_system_osc_xmlrpc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_xmlrpc_message_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_xmlrpc_message_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_xmlrpc_message_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC server unit test ags_check_system_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_server_test.c ags_check_system_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_xmlrpc_server_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_xmlrpc_server_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc action controller unit test ags_check_system_osc_action_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_action_controller_test.c ags_check_system_osc_action_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_action_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_action_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_action_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc config controller unit test ags_check_system_osc_config_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_config_controller_test.c ags_check_system_osc_config_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_config_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_config_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_config_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc front controller unit test ags_check_system_osc_front_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_front_controller_test.c ags_check_system_osc_front_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_front_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_front_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc renew controller unit test ags_check_system_osc_renew_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_renew_controller_test.c ags_check_system_osc_renew_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_renew_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_renew_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_renew_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc info controller unit test ags_check_system_osc_info_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_info_controller_test.c ags_check_system_osc_info_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_info_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_info_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_info_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc meter controller unit test ags_check_system_osc_meter_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_meter_controller_test.c ags_check_system_osc_meter_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_meter_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_meter_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_meter_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc node controller unit test ags_check_system_osc_node_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_node_controller_test.c ags_check_system_osc_node_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_node_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_node_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_node_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc status controller unit test ags_check_system_osc_status_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_status_controller_test.c ags_check_system_osc_status_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_status_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_status_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_status_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc xmlrpc controller unit test ags_check_system_osc_xmlrpc_controller_test_SOURCES = ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c ags_check_system_osc_xmlrpc_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_osc_xmlrpc_controller_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_osc_xmlrpc_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_osc_xmlrpc_controller_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse audio signal unit test ags_check_system_analyse_audio_signal_test_SOURCES = ags/test/audio/recall/ags_analyse_audio_signal_test.c ags_check_system_analyse_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_analyse_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_analyse_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_analyse_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse channel unit test ags_check_system_analyse_channel_test_SOURCES = ags/test/audio/recall/ags_analyse_channel_test.c ags_check_system_analyse_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_analyse_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_analyse_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_analyse_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer audio signal unit test ags_check_system_buffer_audio_signal_test_SOURCES = ags/test/audio/recall/ags_buffer_audio_signal_test.c ags_check_system_buffer_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_buffer_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_buffer_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_buffer_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer channel unit test ags_check_system_buffer_channel_test_SOURCES = ags/test/audio/recall/ags_buffer_channel_test.c ags_check_system_buffer_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_buffer_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_buffer_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_buffer_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave audio unit test ags_check_system_capture_wave_audio_test_SOURCES = ags/test/audio/recall/ags_capture_wave_audio_test.c ags_check_system_capture_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_capture_wave_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_capture_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_capture_wave_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave channel unit test ags_check_system_capture_wave_channel_test_SOURCES = ags/test/audio/recall/ags_capture_wave_channel_test.c ags_check_system_capture_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_capture_wave_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_capture_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_capture_wave_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio signal unit test ags_check_system_copy_audio_signal_test_SOURCES = ags/test/audio/recall/ags_copy_audio_signal_test.c ags_check_system_copy_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_copy_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_copy_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_copy_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel unit test ags_check_system_copy_channel_test_SOURCES = ags/test/audio/recall/ags_copy_channel_test.c ags_check_system_copy_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_copy_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_copy_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_copy_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio pattern unit test ags_check_system_copy_pattern_audio_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_audio_test.c ags_check_system_copy_pattern_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_copy_pattern_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_copy_pattern_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_copy_pattern_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel pattern unit test ags_check_system_copy_pattern_channel_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_channel_test.c ags_check_system_copy_pattern_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_copy_pattern_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_copy_pattern_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_copy_pattern_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # count beats audio unit test ags_check_system_count_beats_audio_test_SOURCES = ags/test/audio/recall/ags_count_beats_audio_test.c ags_check_system_count_beats_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_count_beats_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_count_beats_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_count_beats_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # delay audio unit test ags_check_system_delay_audio_test_SOURCES = ags/test/audio/recall/ags_delay_audio_test.c ags_check_system_delay_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_delay_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_delay_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_delay_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope audio signal unit test ags_check_system_envelope_audio_signal_test_SOURCES = ags/test/audio/recall/ags_envelope_audio_signal_test.c ags_check_system_envelope_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_envelope_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_envelope_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_envelope_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope channel unit test ags_check_system_envelope_channel_test_SOURCES = ags/test/audio/recall/ags_envelope_channel_test.c ags_check_system_envelope_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_envelope_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_envelope_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_envelope_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 audio signal unit test ags_check_system_eq10_audio_signal_test_SOURCES = ags/test/audio/recall/ags_eq10_audio_signal_test.c ags_check_system_eq10_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_eq10_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_eq10_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_eq10_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 channel unit test ags_check_system_eq10_channel_test_SOURCES = ags/test/audio/recall/ags_eq10_channel_test.c ags_check_system_eq10_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_eq10_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_eq10_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_eq10_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # feed audio signal unit test ags_check_system_feed_audio_signal_test_SOURCES = ags/test/audio/recall/ags_feed_audio_signal_test.c ags_check_system_feed_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_feed_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_feed_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_feed_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio unit test ags_check_system_mute_audio_test_SOURCES = ags/test/audio/recall/ags_mute_audio_test.c ags_check_system_mute_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_mute_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_mute_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_mute_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio signal unit test ags_check_system_mute_audio_signal_test_SOURCES = ags/test/audio/recall/ags_mute_audio_signal_test.c ags_check_system_mute_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_mute_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_mute_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_mute_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute channel unit test ags_check_system_mute_channel_test_SOURCES = ags/test/audio/recall/ags_mute_channel_test.c ags_check_system_mute_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_mute_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_mute_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_mute_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak audio signal unit test ags_check_system_peak_audio_signal_test_SOURCES = ags/test/audio/recall/ags_peak_audio_signal_test.c ags_check_system_peak_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_peak_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_peak_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_peak_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak channel unit test ags_check_system_peak_channel_test_SOURCES = ags/test/audio/recall/ags_peak_channel_test.c ags_check_system_peak_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_peak_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_peak_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_peak_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio unit test ags_check_system_play_audio_test_SOURCES = ags/test/audio/recall/ags_play_audio_test.c ags_check_system_play_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_play_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_play_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_play_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio signal unit test ags_check_system_play_audio_signal_test_SOURCES = ags/test/audio/recall/ags_play_audio_signal_test.c ags_check_system_play_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_play_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_play_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_play_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play channel unit test ags_check_system_play_channel_test_SOURCES = ags/test/audio/recall/ags_play_channel_test.c ags_check_system_play_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_play_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_play_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_play_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave audio unit test ags_check_system_play_wave_audio_test_SOURCES = ags/test/audio/recall/ags_play_wave_audio_test.c ags_check_system_play_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_play_wave_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_play_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_play_wave_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave channel unit test ags_check_system_play_wave_channel_test_SOURCES = ags/test/audio/recall/ags_play_wave_channel_test.c ags_check_system_play_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_play_wave_channel__test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_play_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_play_wave_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # prepare audio signal unit test ags_check_system_prepare_audio_signal_test_SOURCES = ags/test/audio/recall/ags_prepare_audio_signal_test.c ags_check_system_prepare_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_prepare_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_prepare_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_prepare_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # record midi audio unit test ags_check_system_record_midi_audio_test_SOURCES = ags/test/audio/recall/ags_record_midi_audio_test.c ags_check_system_record_midi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_record_midi_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_record_midi_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_record_midi_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route dssi audio unit test ags_check_system_route_dssi_audio_test_SOURCES = ags/test/audio/recall/ags_route_dssi_audio_test.c ags_check_system_route_dssi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_route_dssi_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_route_dssi_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_route_dssi_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route lv2 audio unit test ags_check_system_route_lv2_audio_test_SOURCES = ags/test/audio/recall/ags_route_lv2_audio_test.c ags_check_system_route_lv2_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_route_lv2_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_route_lv2_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_route_lv2_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # stream audio signal unit test ags_check_system_stream_audio_signal_test_SOURCES = ags/test/audio/recall/ags_stream_audio_signal_test.c ags_check_system_stream_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_stream_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_stream_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_stream_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume audio signal unit test ags_check_system_volume_audio_signal_test_SOURCES = ags/test/audio/recall/ags_volume_audio_signal_test.c ags_check_system_volume_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_volume_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_volume_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_volume_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume channel unit test ags_check_system_volume_channel_test_SOURCES = ags/test/audio/recall/ags_volume_channel_test.c ags_check_system_volume_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_volume_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_volume_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_volume_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio unit test ags_check_system_add_audio_test_SOURCES = ags/test/audio/task/ags_add_audio_test.c ags_check_system_add_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_add_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_add_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_add_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio signal unit test ags_check_system_add_audio_signal_test_SOURCES = ags/test/audio/task/ags_add_audio_signal_test.c ags_check_system_add_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_add_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_add_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_add_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add effect unit test ags_check_system_add_effect_test_SOURCES = ags/test/audio/task/ags_add_effect_test.c ags_check_system_add_effect_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_add_effect_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_add_effect_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_add_effect_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add note unit test ags_check_system_add_note_test_SOURCES = ags/test/audio/task/ags_add_note_test.c ags_check_system_add_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_add_note_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_add_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_add_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add soundcard unit test ags_check_system_add_soundcard_test_SOURCES = ags/test/audio/task/ags_add_soundcard_test.c ags_check_system_add_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_add_soundcard_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_add_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_add_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply bpm unit test ags_check_system_apply_bpm_test_SOURCES = ags/test/audio/task/ags_apply_bpm_test.c ags_check_system_apply_bpm_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_apply_bpm_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_apply_bpm_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_apply_bpm_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply presets unit test ags_check_system_apply_presets_test_SOURCES = ags/test/audio/task/ags_apply_presets_test.c ags_check_system_apply_presets_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_apply_presets_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_apply_presets_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_apply_presets_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply sequencer length unit test ags_check_system_apply_sequencer_length_test_SOURCES = ags/test/audio/task/ags_apply_sequencer_length_test.c ags_check_system_apply_sequencer_length_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_apply_sequencer_length_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_apply_sequencer_length_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_apply_sequencer_length_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply synth unit test ags_check_system_apply_synth_test_SOURCES = ags/test/audio/task/ags_apply_synth_test.c ags_check_system_apply_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_apply_synth_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_apply_synth_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_apply_synth_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply tact unit test ags_check_system_apply_tact_test_SOURCES = ags/test/audio/task/ags_apply_tact_test.c ags_check_system_apply_tact_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_apply_tact_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_apply_tact_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_apply_tact_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel audio unit test ags_check_system_cancel_audio_test_SOURCES = ags/test/audio/task/ags_cancel_audio_test.c ags_check_system_cancel_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_cancel_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_cancel_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_cancel_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel channel unit test ags_check_system_cancel_channel_test_SOURCES = ags/test/audio/task/ags_cancel_channel_test.c ags_check_system_cancel_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_cancel_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_cancel_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_cancel_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear audio signal unit test ags_check_system_clear_audio_signal_test_SOURCES = ags/test/audio/task/ags_clear_audio_signal_test.c ags_check_system_clear_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_clear_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_clear_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_clear_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear buffer unit test ags_check_system_clear_buffer_test_SOURCES = ags/test/audio/task/ags_clear_buffer_test.c ags_check_system_clear_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_clear_buffer_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_clear_buffer_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_clear_buffer_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # crop note unit test ags_check_system_crop_note_test_SOURCES = ags/test/audio/task/ags_crop_note_test.c ags_check_system_crop_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_crop_note_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_crop_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_crop_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # export output unit test ags_check_system_export_output_test_SOURCES = ags/test/audio/task/ags_export_output_test.c ags_check_system_export_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_export_output_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_export_output_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_export_output_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # free selection unit test ags_check_system_free_selection_test_SOURCES = ags/test/audio/task/ags_free_selection_test.c ags_check_system_free_selection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_free_selection_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_free_selection_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_free_selection_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # link channel unit test ags_check_system_link_channel_test_SOURCES = ags/test/audio/task/ags_link_channel_test.c ags_check_system_link_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_link_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_link_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_link_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # move note unit test ags_check_system_move_note_test_SOURCES = ags/test/audio/task/ags_move_note_test.c ags_check_system_move_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_move_note_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_move_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_move_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio unit test ags_check_system_remove_audio_test_SOURCES = ags/test/audio/task/ags_remove_audio_test.c ags_check_system_remove_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_remove_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_remove_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_remove_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio signal unit test ags_check_system_remove_audio_signal_test_SOURCES = ags/test/audio/task/ags_remove_audio_signal_test.c ags_check_system_remove_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_remove_audio_signal_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_remove_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_remove_audio_signal_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove note unit test ags_check_system_remove_note_test_SOURCES = ags/test/audio/task/ags_remove_note_test.c ags_check_system_remove_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_remove_note_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_remove_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_remove_note_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove soundcard unit test ags_check_system_remove_soundcard_test_SOURCES = ags/test/audio/task/ags_remove_soundcard_test.c ags_check_system_remove_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_remove_soundcard_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_remove_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_remove_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset amplitude unit test ags_check_system_reset_amplitude_test_SOURCES = ags/test/audio/task/ags_reset_amplitude_test.c ags_check_system_reset_amplitude_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_reset_amplitude_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_reset_amplitude_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_reset_amplitude_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset peak unit test ags_check_system_reset_peak_test_SOURCES = ags/test/audio/task/ags_reset_peak_test.c ags_check_system_reset_peak_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_reset_peak_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_reset_peak_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_reset_peak_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # resize audio unit test ags_check_system_resize_audio_test_SOURCES = ags/test/audio/task/ags_resize_audio_test.c ags_check_system_resize_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_resize_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_resize_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_resize_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # seek soundcard unit test ags_check_system_seek_soundcard_test_SOURCES = ags/test/audio/task/ags_seek_soundcard_test.c ags_check_system_seek_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_seek_soundcard_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_seek_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_seek_soundcard_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set audio channels unit test ags_check_system_set_audio_channels_test_SOURCES = ags/test/audio/task/ags_set_audio_channels_test.c ags_check_system_set_audio_channels_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_set_audio_channels_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_set_audio_channels_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_set_audio_channels_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set buffer size unit test ags_check_system_set_buffer_size_test_SOURCES = ags/test/audio/task/ags_set_buffer_size_test.c ags_check_system_set_buffer_size_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_set_buffer_size_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_set_buffer_size_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_set_buffer_size_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set device unit test ags_check_system_set_device_test_SOURCES = ags/test/audio/task/ags_set_device_test.c ags_check_system_set_device_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_set_device_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_set_device_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_set_device_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set format unit test ags_check_system_set_format_test_SOURCES = ags/test/audio/task/ags_set_format_test.c ags_check_system_set_format_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_set_format_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_set_format_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_set_format_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set muted unit test ags_check_system_set_muted_test_SOURCES = ags/test/audio/task/ags_set_muted_test.c ags_check_system_set_muted_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_set_muted_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_set_muted_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_set_muted_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set samplerate unit test ags_check_system_set_samplerate_test_SOURCES = ags/test/audio/task/ags_set_samplerate_test.c ags_check_system_set_samplerate_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_set_samplerate_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_set_samplerate_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_set_samplerate_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start audio unit test ags_check_system_start_audio_test_SOURCES = ags/test/audio/task/ags_start_audio_test.c ags_check_system_start_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_start_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_start_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_start_audio_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start channel unit test ags_check_system_start_channel_test_SOURCES = ags/test/audio/task/ags_start_channel_test.c ags_check_system_start_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_start_channel_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_start_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_start_channel_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # xorg application context unit test ags_check_system_xorg_application_context_test_SOURCES = ags/test/X/ags_xorg_application_context_test.c ags_check_system_xorg_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_xorg_application_context_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_xorg_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_xorg_application_context_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) ags-check-system-unit-tests: $(libags_installcheck_programs) $(libags_audio_installcheck_programs) $(libgsequencer_installcheck_programs) ./ags_check_system_buffer_util_test ./ags_check_system_complex_test ./ags_check_system_conversion_test ./ags_check_system_log_test ./ags_check_system_time_test ./ags_check_system_turtle_manager_test ./ags_check_system_turtle_test ./ags_check_system_application_context_test ./ags_check_system_config_test ./ags_check_system_connectable_test ./ags_check_system_soundcard_test ./ags_check_system_destroy_worker_test ./ags_check_system_returnable_thread_test ./ags_check_system_task_test ./ags_check_system_thread_test ./ags_check_system_thread_pool_test ./ags_check_system_worker_thread_test ./ags_check_system_file_test ./ags_check_system_file_id_ref_test ./ags_check_system_file_launch_test ./ags_check_system_file_lookup_test ./ags_check_system_server_application_context_test ./ags_check_system_server_test ./ags_check_system_controller_test ./ags_check_system_front_controller_test ./ags_check_system_authentication_manager_test ./ags_check_system_business_group_manager_test ./ags_check_system_certificate_manager_test ./ags_check_system_password_store_manager_test ./ags_check_system_xml_authentication_test ./ags_check_system_xml_business_group_test ./ags_check_system_xml_certificate_test ./ags_check_system_xml_password_store_test ./ags_check_system_security_context_test ./ags_check_system_base_plugin_test ./ags_check_system_dssi_manager_test ./ags_check_system_dssi_plugin_test ./ags_check_system_ladspa_conversion_test ./ags_check_system_ladspa_manager_test ./ags_check_system_lv2_conversion_test ./ags_check_system_lv2_manager_test ./ags_check_system_lv2_option_manager_test ./ags_check_system_lv2_plugin_test ./ags_check_system_lv2_preset_test ./ags_check_system_lv2_uri_map_manager_test ./ags_check_system_lv2_urid_manager_test ./ags_check_system_lv2_worker_manager_test ./ags_check_system_lv2ui_manager_test ./ags_check_system_lv2ui_plugin_test ./ags_check_system_plugin_port_test ./ags_check_system_audio_application_context_test ./ags_check_system_devin_test ./ags_check_system_devout_test ./ags_check_system_fifoout_test ./ags_check_system_midiin_test ./ags_check_system_audio_test ./ags_check_system_playback_domain_test ./ags_check_system_playback_test ./ags_check_system_preset_test ./ags_check_system_channel_test ./ags_check_system_input_test ./ags_check_system_output_test ./ags_check_system_recycling_test ./ags_check_system_audio_signal_test ./ags_check_system_audio_buffer_util_test ./ags_check_system_char_buffer_util_test ./ags_check_system_filter_util_test ./ags_check_system_fm_synth_util_test ./ags_check_system_fourier_transform_util_test ./ags_check_system_recall_test ./ags_check_system_recall_channel_test ./ags_check_system_recall_channel_run_test ./ags_check_system_recall_container_test ./ags_check_system_recall_dependency_test ./ags_check_system_recall_id_test ./ags_check_system_recall_recycling_test ./ags_check_system_recycling_context_test ./ags_check_system_synth_generator_test ./ags_check_system_port_test ./ags_check_system_pattern_test ./ags_check_system_notation_test ./ags_check_system_note_test ./ags_check_system_automation_test ./ags_check_system_acceleration_test ./ags_check_system_wave_test ./ags_check_system_buffer_test ./ags_check_system_midi_test ./ags_check_system_track_test ./ags_check_system_midi_buffer_util_test ./ags_check_system_midi_builder_test ./ags_check_system_osc_buffer_util_test ./ags_check_system_osc_client_test ./ags_check_system_osc_connection_test ./ags_check_system_osc_message_test ./ags_check_system_osc_server_test ./ags_check_system_osc_websocket_connection_test ./ags_check_system_osc_xmlrpc_message_test ./ags_check_system_osc_xmlrpc_server_test ./ags_check_system_osc_action_controller_test ./ags_check_system_osc_config_controller_test ./ags_check_system_osc_front_controller_test ./ags_check_system_osc_renew_controller_test ./ags_check_system_osc_info_controller_test ./ags_check_system_osc_meter_controller_test ./ags_check_system_osc_node_controller_test ./ags_check_system_osc_status_controller_test ./ags_check_system_osc_xmlrpc_controller_test ./ags_check_system_analyse_audio_signal_test ./ags_check_system_analyse_channel_test ./ags_check_system_buffer_audio_signal_test ./ags_check_system_buffer_channel_test ./ags_check_system_capture_wave_audio_test ./ags_check_system_capture_wave_channel_test ./ags_check_system_copy_audio_signal_test ./ags_check_system_copy_channel_test ./ags_check_system_copy_pattern_audio_test ./ags_check_system_copy_pattern_channel_test ./ags_check_system_count_beats_audio_test ./ags_check_system_delay_audio_test ./ags_check_system_envelope_audio_signal_test ./ags_check_system_envelope_channel_test ./ags_check_system_eq10_audio_signal_test ./ags_check_system_eq10_channel_test ./ags_check_system_feed_audio_signal_test ./ags_check_system_mute_audio_test ./ags_check_system_mute_audio_signal_test ./ags_check_system_mute_channel_test ./ags_check_system_peak_audio_signal_test ./ags_check_system_peak_channel_test ./ags_check_system_play_audio_test ./ags_check_system_play_audio_signal_test ./ags_check_system_play_channel_test ./ags_check_system_play_wave_audio_test ./ags_check_system_play_wave_channel_test ./ags_check_system_prepare_audio_signal_test ./ags_check_system_record_midi_audio_test ./ags_check_system_route_dssi_audio_test ./ags_check_system_route_lv2_audio_test ./ags_check_system_stream_audio_signal_test ./ags_check_system_volume_audio_signal_test ./ags_check_system_volume_channel_test ./ags_check_system_add_audio_test ./ags_check_system_add_audio_signal_test ./ags_check_system_add_effect_test ./ags_check_system_add_note_test ./ags_check_system_add_soundcard_test ./ags_check_system_apply_bpm_test ./ags_check_system_apply_presets_test ./ags_check_system_apply_sequencer_length_test ./ags_check_system_apply_synth_test ./ags_check_system_apply_tact_test ./ags_check_system_cancel_audio_test ./ags_check_system_cancel_channel_test ./ags_check_system_clear_audio_signal_test ./ags_check_system_clear_buffer_test ./ags_check_system_crop_note_test ./ags_check_system_export_output_test ./ags_check_system_free_selection_test ./ags_check_system_link_channel_test ./ags_check_system_move_note_test ./ags_check_system_remove_audio_test ./ags_check_system_remove_audio_signal_test ./ags_check_system_remove_note_test ./ags_check_system_remove_soundcard_test ./ags_check_system_reset_amplitude_test ./ags_check_system_reset_peak_test ./ags_check_system_resize_audio_test ./ags_check_system_seek_soundcard_test ./ags_check_system_set_audio_channels_test ./ags_check_system_set_buffer_size_test ./ags_check_system_set_device_test ./ags_check_system_set_format_test ./ags_check_system_set_muted_test ./ags_check_system_set_samplerate_test ./ags_check_system_start_audio_test ./ags_check_system_start_channel_test # WITH_SYSTEM_TESTS endif gsequencer-3.1.3/functional-system-tests.mk.in0000644000175000017500000033716113622252207016376 00000000000000# functional-system-tests.mk.in generated by automake 1.16.1 from functional-system-tests.mk.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2005-2020 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_2) @WITH_LIBINSTPATCH_TRUE@@WITH_SYSTEM_TESTS_TRUE@am__append_1 = -DAGS_WITH_LIBINSTPATCH=1 @WITH_SYSTEM_TESTS_TRUE@am__append_2 = $(installcheck_programs) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/functional-system-tests.mk.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = libags.pc libags_audio.pc libags_gui.pc \ libgsequencer.pc CONFIG_CLEAN_VPATH_FILES = @WITH_SYSTEM_TESTS_TRUE@am__EXEEXT_1 = ags_check_system_functional_server_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_audio_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_pitch_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_fourier_transform_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_osc_server_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_osc_xmlrpc_server_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_machine_add_and_destroy_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_machine_link_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_line_member_add_and_destroy_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_notation_editor_workflow_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_automation_editor_workflow_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_panel_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_mixer_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_drum_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_matrix_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_synth_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_ffplayer_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_notation_edit_test$(EXEEXT) \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_audio_config_test$(EXEEXT) @WITH_SYSTEM_TESTS_TRUE@am__EXEEXT_2 = $(am__EXEEXT_1) PROGRAMS = $(noinst_PROGRAMS) LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = @WITH_SYSTEM_TESTS_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) @WITH_SYSTEM_TESTS_TRUE@libgsequencer_check_system_test_la_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_2) am__libgsequencer_check_system_test_la_SOURCES_DIST = \ ags/test/X/gsequencer_setup_util.c \ ags/test/X/gsequencer_setup_util.h \ ags/test/X/ags_functional_test_util.c \ ags/test/X/ags_functional_test_util.h \ ags/test/X/libgsequencer.h am__dirstamp = $(am__leading_dot)dirstamp @WITH_SYSTEM_TESTS_TRUE@am_libgsequencer_check_system_test_la_OBJECTS = ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo \ @WITH_SYSTEM_TESTS_TRUE@ ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo libgsequencer_check_system_test_la_OBJECTS = \ $(am_libgsequencer_check_system_test_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgsequencer_check_system_test_la_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ @WITH_SYSTEM_TESTS_TRUE@am_libgsequencer_check_system_test_la_rpath = am__ags_check_system_functional_audio_config_test_SOURCES_DIST = \ ags/test/X/ags_functional_audio_config_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_audio_config_test_OBJECTS = ags/test/X/check_system_functional_audio_config_test-ags_functional_audio_config_test.$(OBJEXT) ags_check_system_functional_audio_config_test_OBJECTS = \ $(am_ags_check_system_functional_audio_config_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@am__DEPENDENCIES_3 = \ @WITH_SYSTEM_TESTS_TRUE@ libgsequencer_check_system_test.la \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_1) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_config_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_audio_config_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_functional_audio_config_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_audio_config_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_audio_test_SOURCES_DIST = \ ags/test/audio/ags_functional_audio_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_audio_test_OBJECTS = ags/test/audio/check_system_functional_audio_test-ags_functional_audio_test.$(OBJEXT) ags_check_system_functional_audio_test_OBJECTS = \ $(am_ags_check_system_functional_audio_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_audio_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_automation_editor_workflow_test_SOURCES_DIST = \ ags/test/X/ags_functional_automation_editor_workflow_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_automation_editor_workflow_test_OBJECTS = ags/test/X/check_system_functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.$(OBJEXT) ags_check_system_functional_automation_editor_workflow_test_OBJECTS = $(am_ags_check_system_functional_automation_editor_workflow_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_automation_editor_workflow_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_automation_editor_workflow_test_LINK = \ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_functional_automation_editor_workflow_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_automation_editor_workflow_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_drum_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_drum_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_drum_test_OBJECTS = ags/test/X/machine/check_system_functional_drum_test-ags_functional_drum_test.$(OBJEXT) ags_check_system_functional_drum_test_OBJECTS = \ $(am_ags_check_system_functional_drum_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_drum_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_drum_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_drum_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_drum_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_ffplayer_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_ffplayer_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_ffplayer_test_OBJECTS = ags/test/X/machine/check_system_functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT) ags_check_system_functional_ffplayer_test_OBJECTS = \ $(am_ags_check_system_functional_ffplayer_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_ffplayer_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_ffplayer_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_ffplayer_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_ffplayer_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_fourier_transform_test_SOURCES_DIST = \ ags/test/audio/ags_functional_fourier_transform_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_fourier_transform_test_OBJECTS = ags/test/audio/check_system_functional_fourier_transform_test-ags_functional_fourier_transform_test.$(OBJEXT) ags_check_system_functional_fourier_transform_test_OBJECTS = $(am_ags_check_system_functional_fourier_transform_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_fourier_transform_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_fourier_transform_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_functional_fourier_transform_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_fourier_transform_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_line_member_add_and_destroy_test_SOURCES_DIST = \ ags/test/X/ags_functional_line_member_add_and_destroy_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS = ags/test/X/check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT) ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS = $(am_ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_line_member_add_and_destroy_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_line_member_add_and_destroy_test_LINK = \ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_line_member_add_and_destroy_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_machine_add_and_destroy_test_SOURCES_DIST = \ ags/test/X/ags_functional_machine_add_and_destroy_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_machine_add_and_destroy_test_OBJECTS = ags/test/X/check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT) ags_check_system_functional_machine_add_and_destroy_test_OBJECTS = $(am_ags_check_system_functional_machine_add_and_destroy_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_add_and_destroy_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_machine_add_and_destroy_test_LINK = \ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_machine_add_and_destroy_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_machine_link_test_SOURCES_DIST = \ ags/test/X/ags_functional_machine_link_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_machine_link_test_OBJECTS = ags/test/X/check_system_functional_machine_link_test-ags_functional_machine_link_test.$(OBJEXT) ags_check_system_functional_machine_link_test_OBJECTS = \ $(am_ags_check_system_functional_machine_link_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_link_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_machine_link_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_functional_machine_link_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_machine_link_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_matrix_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_matrix_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_matrix_test_OBJECTS = ags/test/X/machine/check_system_functional_matrix_test-ags_functional_matrix_test.$(OBJEXT) ags_check_system_functional_matrix_test_OBJECTS = \ $(am_ags_check_system_functional_matrix_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_matrix_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_matrix_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_matrix_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_matrix_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_mixer_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_mixer_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_mixer_test_OBJECTS = ags/test/X/machine/check_system_functional_mixer_test-ags_functional_mixer_test.$(OBJEXT) ags_check_system_functional_mixer_test_OBJECTS = \ $(am_ags_check_system_functional_mixer_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_mixer_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_mixer_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_mixer_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_mixer_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_notation_edit_test_SOURCES_DIST = \ ags/test/X/ags_functional_notation_edit_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_notation_edit_test_OBJECTS = ags/test/X/check_system_functional_notation_edit_test-ags_functional_notation_edit_test.$(OBJEXT) ags_check_system_functional_notation_edit_test_OBJECTS = \ $(am_ags_check_system_functional_notation_edit_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_edit_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_notation_edit_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_functional_notation_edit_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_notation_edit_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_notation_editor_workflow_test_SOURCES_DIST = \ ags/test/X/ags_functional_notation_editor_workflow_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_notation_editor_workflow_test_OBJECTS = ags/test/X/check_system_functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.$(OBJEXT) ags_check_system_functional_notation_editor_workflow_test_OBJECTS = $(am_ags_check_system_functional_notation_editor_workflow_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_editor_workflow_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_notation_editor_workflow_test_LINK = \ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_check_system_functional_notation_editor_workflow_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_notation_editor_workflow_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_osc_server_test_SOURCES_DIST = \ ags/test/audio/osc/ags_functional_osc_server_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_osc_server_test_OBJECTS = ags/test/audio/osc/check_system_functional_osc_server_test-ags_functional_osc_server_test.$(OBJEXT) ags_check_system_functional_osc_server_test_OBJECTS = \ $(am_ags_check_system_functional_osc_server_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_server_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_osc_server_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_functional_osc_server_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_osc_server_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_osc_xmlrpc_server_test_SOURCES_DIST = \ ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_osc_xmlrpc_server_test_OBJECTS = ags/test/audio/osc/check_system_functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.$(OBJEXT) ags_check_system_functional_osc_xmlrpc_server_test_OBJECTS = $(am_ags_check_system_functional_osc_xmlrpc_server_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_xmlrpc_server_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_osc_xmlrpc_server_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_check_system_functional_osc_xmlrpc_server_test_CFLAGS) \ $(CFLAGS) \ $(ags_check_system_functional_osc_xmlrpc_server_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_panel_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_panel_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_panel_test_OBJECTS = ags/test/X/machine/check_system_functional_panel_test-ags_functional_panel_test.$(OBJEXT) ags_check_system_functional_panel_test_OBJECTS = \ $(am_ags_check_system_functional_panel_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_panel_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_panel_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_panel_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_panel_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_pitch_test_SOURCES_DIST = \ ags/test/audio/ags_functional_pitch_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_pitch_test_OBJECTS = ags/test/audio/check_system_functional_pitch_test-ags_functional_pitch_test.$(OBJEXT) ags_check_system_functional_pitch_test_OBJECTS = \ $(am_ags_check_system_functional_pitch_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_pitch_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_pitch_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_pitch_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_pitch_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_server_test_SOURCES_DIST = \ ags/test/server/ags_functional_server_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_server_test_OBJECTS = ags/test/server/check_system_functional_server_test-ags_functional_server_test.$(OBJEXT) ags_check_system_functional_server_test_OBJECTS = \ $(am_ags_check_system_functional_server_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_server_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_server_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_server_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_server_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_check_system_functional_synth_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_synth_test.c @WITH_SYSTEM_TESTS_TRUE@am_ags_check_system_functional_synth_test_OBJECTS = ags/test/X/machine/check_system_functional_synth_test-ags_functional_synth_test.$(OBJEXT) ags_check_system_functional_synth_test_OBJECTS = \ $(am_ags_check_system_functional_synth_test_OBJECTS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_synth_test_DEPENDENCIES = \ @WITH_SYSTEM_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_check_system_functional_synth_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_check_system_functional_synth_test_CFLAGS) \ $(CFLAGS) $(ags_check_system_functional_synth_test_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/ags depcomp = am__maybe_remake_depfiles = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgsequencer_check_system_test_la_SOURCES) \ $(ags_check_system_functional_audio_config_test_SOURCES) \ $(ags_check_system_functional_audio_test_SOURCES) \ $(ags_check_system_functional_automation_editor_workflow_test_SOURCES) \ $(ags_check_system_functional_drum_test_SOURCES) \ $(ags_check_system_functional_ffplayer_test_SOURCES) \ $(ags_check_system_functional_fourier_transform_test_SOURCES) \ $(ags_check_system_functional_line_member_add_and_destroy_test_SOURCES) \ $(ags_check_system_functional_machine_add_and_destroy_test_SOURCES) \ $(ags_check_system_functional_machine_link_test_SOURCES) \ $(ags_check_system_functional_matrix_test_SOURCES) \ $(ags_check_system_functional_mixer_test_SOURCES) \ $(ags_check_system_functional_notation_edit_test_SOURCES) \ $(ags_check_system_functional_notation_editor_workflow_test_SOURCES) \ $(ags_check_system_functional_osc_server_test_SOURCES) \ $(ags_check_system_functional_osc_xmlrpc_server_test_SOURCES) \ $(ags_check_system_functional_panel_test_SOURCES) \ $(ags_check_system_functional_pitch_test_SOURCES) \ $(ags_check_system_functional_server_test_SOURCES) \ $(ags_check_system_functional_synth_test_SOURCES) DIST_SOURCES = $(am__libgsequencer_check_system_test_la_SOURCES_DIST) \ $(am__ags_check_system_functional_audio_config_test_SOURCES_DIST) \ $(am__ags_check_system_functional_audio_test_SOURCES_DIST) \ $(am__ags_check_system_functional_automation_editor_workflow_test_SOURCES_DIST) \ $(am__ags_check_system_functional_drum_test_SOURCES_DIST) \ $(am__ags_check_system_functional_ffplayer_test_SOURCES_DIST) \ $(am__ags_check_system_functional_fourier_transform_test_SOURCES_DIST) \ $(am__ags_check_system_functional_line_member_add_and_destroy_test_SOURCES_DIST) \ $(am__ags_check_system_functional_machine_add_and_destroy_test_SOURCES_DIST) \ $(am__ags_check_system_functional_machine_link_test_SOURCES_DIST) \ $(am__ags_check_system_functional_matrix_test_SOURCES_DIST) \ $(am__ags_check_system_functional_mixer_test_SOURCES_DIST) \ $(am__ags_check_system_functional_notation_edit_test_SOURCES_DIST) \ $(am__ags_check_system_functional_notation_editor_workflow_test_SOURCES_DIST) \ $(am__ags_check_system_functional_osc_server_test_SOURCES_DIST) \ $(am__ags_check_system_functional_osc_xmlrpc_server_test_SOURCES_DIST) \ $(am__ags_check_system_functional_panel_test_SOURCES_DIST) \ $(am__ags_check_system_functional_pitch_test_SOURCES_DIST) \ $(am__ags_check_system_functional_server_test_SOURCES_DIST) \ $(am__ags_check_system_functional_synth_test_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/functional-system-tests.mk.in \ $(srcdir)/libags.pc.in $(srcdir)/libags_audio.pc.in \ $(srcdir)/libags_gui.pc.in $(srcdir)/libgsequencer.pc.in \ $(top_srcdir)/ags/ags_config.h.in \ $(top_srcdir)/ags/config.h.in ABOUT-NLS AUTHORS COPYING \ ChangeLog INSTALL NEWS README TODO compile config.guess \ config.rpath config.sub depcomp install-sh ltmain.sh missing \ mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign no-dependencies SUBDIRS = po # libadd and ldadd @WITH_SYSTEM_TESTS_TRUE@libgsequencer_check_system_test_LIBADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer -lcunit -lrt -lm -lXtst $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) @WITH_SYSTEM_TESTS_TRUE@gsequencer_check_system_functional_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer libgsequencer_check_system_test.la -lcunit -lrt -lm -lXtst $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) @WITH_SYSTEM_TESTS_TRUE@AGS_RESOURCES = -DAGS_RC_FILENAME=\"/usr/share/gsequencer/styles/ags.rc\" -DAGS_ANIMATION_FILENAME=\"/usr/share/gsequencer/images/ags_supermoon-800x450.png\" -DAGS_LOGO_FILENAME=\"/usr/share/gsequencer/images/ags.png\" -DAGS_LICENSE_FILENAME=\"/usr/share/common-licenses/GPL-3\" @WITH_SYSTEM_TESTS_TRUE@AGS_FEATURES = $(am__append_1) @WITH_SYSTEM_TESTS_TRUE@noinst_LTLIBRARIES = libgsequencer_check_system_test.la # functional system tests - edit target @WITH_SYSTEM_TESTS_TRUE@installcheck_programs = \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_server_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_audio_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_pitch_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_fourier_transform_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_osc_server_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_osc_xmlrpc_server_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_machine_add_and_destroy_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_machine_link_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_line_member_add_and_destroy_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_notation_editor_workflow_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_automation_editor_workflow_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_panel_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_mixer_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_drum_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_matrix_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_synth_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_ffplayer_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_notation_edit_test \ @WITH_SYSTEM_TESTS_TRUE@ ags_check_system_functional_audio_config_test # functional test util library @WITH_SYSTEM_TESTS_TRUE@libgsequencer_check_system_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h @WITH_SYSTEM_TESTS_TRUE@libgsequencer_check_system_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@libgsequencer_check_system_test_la_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@libgsequencer_check_system_test_la_LIBADD = $(libgsequencer_check_system_test_LIBADD) # functional server test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_server_test_SOURCES = ags/test/server/ags_functional_server_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_server_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_server_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_server_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional audio test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional pitch test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_pitch_test_SOURCES = ags/test/audio/ags_functional_pitch_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_pitch_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_pitch_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_pitch_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_pitch_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional fourier transform test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_fourier_transform_test_SOURCES = ags/test/audio/ags_functional_fourier_transform_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_fourier_transform_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_fourier_transform_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_fourier_transform_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_fourier_transform_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional osc server test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_server_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_server_test_CPPFLAGS = $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_server_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional osc xmlrpc server test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_xmlrpc_server_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_osc_xmlrpc_server_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional machine add and destroy test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional machine link test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_link_test_SOURCES = ags/test/X/ags_functional_machine_link_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_machine_link_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional line member add and destroy test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional notation editor workflow test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_notation_editor_workflow_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_editor_workflow_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional automation editor workflow test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_automation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_automation_editor_workflow_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_automation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_automation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_automation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_automation_editor_workflow_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional panel test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_panel_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional mixer test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_mixer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional drum test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_drum_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional matrix test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_matrix_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional synth test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_synth_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional ffplayer test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_ffplayer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional note edit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_edit_test_SOURCES = ags/test/X/ags_functional_notation_edit_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_edit_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_edit_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_notation_edit_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional note edit test @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_config_test_SOURCES = ags/test/X/ags_functional_audio_config_test.c @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_config_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_config_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_config_test_LDFLAGS = -pthread $(LDFLAGS) @WITH_SYSTEM_TESTS_TRUE@ags_check_system_functional_audio_config_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj am--refresh: functional-system-tests.mk @: $(srcdir)/functional-system-tests.mk.in: $(srcdir)/functional-system-tests.mk.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign functional-system-tests.mk'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign functional-system-tests.mk functional-system-tests.mk: $(srcdir)/functional-system-tests.mk.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): ags/config.h: ags/stamp-h1 @test -f $@ || rm -f ags/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h1 ags/stamp-h1: $(top_srcdir)/ags/config.h.in $(top_builddir)/config.status @rm -f ags/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status ags/config.h $(top_srcdir)/ags/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f ags/stamp-h1 touch $@ ags/ags_config.h: ags/stamp-h2 @test -f $@ || rm -f ags/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h2 ags/stamp-h2: $(top_srcdir)/ags/ags_config.h.in $(top_builddir)/config.status @rm -f ags/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status ags/ags_config.h distclean-hdr: -rm -f ags/config.h ags/stamp-h1 ags/ags_config.h ags/stamp-h2 libags.pc: $(top_builddir)/config.status $(srcdir)/libags.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libags_audio.pc: $(top_builddir)/config.status $(srcdir)/libags_audio.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libags_gui.pc: $(top_builddir)/config.status $(srcdir)/libags_gui.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libgsequencer.pc: $(top_builddir)/config.status $(srcdir)/libgsequencer.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ags/test/X/$(am__dirstamp): @$(MKDIR_P) ags/test/X @: > ags/test/X/$(am__dirstamp) ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo: \ ags/test/X/$(am__dirstamp) ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo: \ ags/test/X/$(am__dirstamp) libgsequencer_check_system_test.la: $(libgsequencer_check_system_test_la_OBJECTS) $(libgsequencer_check_system_test_la_DEPENDENCIES) $(EXTRA_libgsequencer_check_system_test_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsequencer_check_system_test_la_LINK) $(am_libgsequencer_check_system_test_la_rpath) $(libgsequencer_check_system_test_la_OBJECTS) $(libgsequencer_check_system_test_la_LIBADD) $(LIBS) ags/test/X/check_system_functional_audio_config_test-ags_functional_audio_config_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_audio_config_test$(EXEEXT): $(ags_check_system_functional_audio_config_test_OBJECTS) $(ags_check_system_functional_audio_config_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_audio_config_test_DEPENDENCIES) @rm -f ags_check_system_functional_audio_config_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_audio_config_test_LINK) $(ags_check_system_functional_audio_config_test_OBJECTS) $(ags_check_system_functional_audio_config_test_LDADD) $(LIBS) ags/test/audio/$(am__dirstamp): @$(MKDIR_P) ags/test/audio @: > ags/test/audio/$(am__dirstamp) ags/test/audio/check_system_functional_audio_test-ags_functional_audio_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_functional_audio_test$(EXEEXT): $(ags_check_system_functional_audio_test_OBJECTS) $(ags_check_system_functional_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_audio_test_DEPENDENCIES) @rm -f ags_check_system_functional_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_audio_test_LINK) $(ags_check_system_functional_audio_test_OBJECTS) $(ags_check_system_functional_audio_test_LDADD) $(LIBS) ags/test/X/check_system_functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_automation_editor_workflow_test$(EXEEXT): $(ags_check_system_functional_automation_editor_workflow_test_OBJECTS) $(ags_check_system_functional_automation_editor_workflow_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_automation_editor_workflow_test_DEPENDENCIES) @rm -f ags_check_system_functional_automation_editor_workflow_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_automation_editor_workflow_test_LINK) $(ags_check_system_functional_automation_editor_workflow_test_OBJECTS) $(ags_check_system_functional_automation_editor_workflow_test_LDADD) $(LIBS) ags/test/X/machine/$(am__dirstamp): @$(MKDIR_P) ags/test/X/machine @: > ags/test/X/machine/$(am__dirstamp) ags/test/X/machine/check_system_functional_drum_test-ags_functional_drum_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) ags_check_system_functional_drum_test$(EXEEXT): $(ags_check_system_functional_drum_test_OBJECTS) $(ags_check_system_functional_drum_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_drum_test_DEPENDENCIES) @rm -f ags_check_system_functional_drum_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_drum_test_LINK) $(ags_check_system_functional_drum_test_OBJECTS) $(ags_check_system_functional_drum_test_LDADD) $(LIBS) ags/test/X/machine/check_system_functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) ags_check_system_functional_ffplayer_test$(EXEEXT): $(ags_check_system_functional_ffplayer_test_OBJECTS) $(ags_check_system_functional_ffplayer_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_ffplayer_test_DEPENDENCIES) @rm -f ags_check_system_functional_ffplayer_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_ffplayer_test_LINK) $(ags_check_system_functional_ffplayer_test_OBJECTS) $(ags_check_system_functional_ffplayer_test_LDADD) $(LIBS) ags/test/audio/check_system_functional_fourier_transform_test-ags_functional_fourier_transform_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_functional_fourier_transform_test$(EXEEXT): $(ags_check_system_functional_fourier_transform_test_OBJECTS) $(ags_check_system_functional_fourier_transform_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_fourier_transform_test_DEPENDENCIES) @rm -f ags_check_system_functional_fourier_transform_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_fourier_transform_test_LINK) $(ags_check_system_functional_fourier_transform_test_OBJECTS) $(ags_check_system_functional_fourier_transform_test_LDADD) $(LIBS) ags/test/X/check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_line_member_add_and_destroy_test$(EXEEXT): $(ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_line_member_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_line_member_add_and_destroy_test_DEPENDENCIES) @rm -f ags_check_system_functional_line_member_add_and_destroy_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_line_member_add_and_destroy_test_LINK) $(ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_line_member_add_and_destroy_test_LDADD) $(LIBS) ags/test/X/check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_machine_add_and_destroy_test$(EXEEXT): $(ags_check_system_functional_machine_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_machine_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_machine_add_and_destroy_test_DEPENDENCIES) @rm -f ags_check_system_functional_machine_add_and_destroy_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_machine_add_and_destroy_test_LINK) $(ags_check_system_functional_machine_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_machine_add_and_destroy_test_LDADD) $(LIBS) ags/test/X/check_system_functional_machine_link_test-ags_functional_machine_link_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_machine_link_test$(EXEEXT): $(ags_check_system_functional_machine_link_test_OBJECTS) $(ags_check_system_functional_machine_link_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_machine_link_test_DEPENDENCIES) @rm -f ags_check_system_functional_machine_link_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_machine_link_test_LINK) $(ags_check_system_functional_machine_link_test_OBJECTS) $(ags_check_system_functional_machine_link_test_LDADD) $(LIBS) ags/test/X/machine/check_system_functional_matrix_test-ags_functional_matrix_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) ags_check_system_functional_matrix_test$(EXEEXT): $(ags_check_system_functional_matrix_test_OBJECTS) $(ags_check_system_functional_matrix_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_matrix_test_DEPENDENCIES) @rm -f ags_check_system_functional_matrix_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_matrix_test_LINK) $(ags_check_system_functional_matrix_test_OBJECTS) $(ags_check_system_functional_matrix_test_LDADD) $(LIBS) ags/test/X/machine/check_system_functional_mixer_test-ags_functional_mixer_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) ags_check_system_functional_mixer_test$(EXEEXT): $(ags_check_system_functional_mixer_test_OBJECTS) $(ags_check_system_functional_mixer_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_mixer_test_DEPENDENCIES) @rm -f ags_check_system_functional_mixer_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_mixer_test_LINK) $(ags_check_system_functional_mixer_test_OBJECTS) $(ags_check_system_functional_mixer_test_LDADD) $(LIBS) ags/test/X/check_system_functional_notation_edit_test-ags_functional_notation_edit_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_notation_edit_test$(EXEEXT): $(ags_check_system_functional_notation_edit_test_OBJECTS) $(ags_check_system_functional_notation_edit_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_notation_edit_test_DEPENDENCIES) @rm -f ags_check_system_functional_notation_edit_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_notation_edit_test_LINK) $(ags_check_system_functional_notation_edit_test_OBJECTS) $(ags_check_system_functional_notation_edit_test_LDADD) $(LIBS) ags/test/X/check_system_functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) ags_check_system_functional_notation_editor_workflow_test$(EXEEXT): $(ags_check_system_functional_notation_editor_workflow_test_OBJECTS) $(ags_check_system_functional_notation_editor_workflow_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_notation_editor_workflow_test_DEPENDENCIES) @rm -f ags_check_system_functional_notation_editor_workflow_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_notation_editor_workflow_test_LINK) $(ags_check_system_functional_notation_editor_workflow_test_OBJECTS) $(ags_check_system_functional_notation_editor_workflow_test_LDADD) $(LIBS) ags/test/audio/osc/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc @: > ags/test/audio/osc/$(am__dirstamp) ags/test/audio/osc/check_system_functional_osc_server_test-ags_functional_osc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_functional_osc_server_test$(EXEEXT): $(ags_check_system_functional_osc_server_test_OBJECTS) $(ags_check_system_functional_osc_server_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_osc_server_test_DEPENDENCIES) @rm -f ags_check_system_functional_osc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_osc_server_test_LINK) $(ags_check_system_functional_osc_server_test_OBJECTS) $(ags_check_system_functional_osc_server_test_LDADD) $(LIBS) ags/test/audio/osc/check_system_functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) ags_check_system_functional_osc_xmlrpc_server_test$(EXEEXT): $(ags_check_system_functional_osc_xmlrpc_server_test_OBJECTS) $(ags_check_system_functional_osc_xmlrpc_server_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_osc_xmlrpc_server_test_DEPENDENCIES) @rm -f ags_check_system_functional_osc_xmlrpc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_osc_xmlrpc_server_test_LINK) $(ags_check_system_functional_osc_xmlrpc_server_test_OBJECTS) $(ags_check_system_functional_osc_xmlrpc_server_test_LDADD) $(LIBS) ags/test/X/machine/check_system_functional_panel_test-ags_functional_panel_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) ags_check_system_functional_panel_test$(EXEEXT): $(ags_check_system_functional_panel_test_OBJECTS) $(ags_check_system_functional_panel_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_panel_test_DEPENDENCIES) @rm -f ags_check_system_functional_panel_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_panel_test_LINK) $(ags_check_system_functional_panel_test_OBJECTS) $(ags_check_system_functional_panel_test_LDADD) $(LIBS) ags/test/audio/check_system_functional_pitch_test-ags_functional_pitch_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) ags_check_system_functional_pitch_test$(EXEEXT): $(ags_check_system_functional_pitch_test_OBJECTS) $(ags_check_system_functional_pitch_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_pitch_test_DEPENDENCIES) @rm -f ags_check_system_functional_pitch_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_pitch_test_LINK) $(ags_check_system_functional_pitch_test_OBJECTS) $(ags_check_system_functional_pitch_test_LDADD) $(LIBS) ags/test/server/$(am__dirstamp): @$(MKDIR_P) ags/test/server @: > ags/test/server/$(am__dirstamp) ags/test/server/check_system_functional_server_test-ags_functional_server_test.$(OBJEXT): \ ags/test/server/$(am__dirstamp) ags_check_system_functional_server_test$(EXEEXT): $(ags_check_system_functional_server_test_OBJECTS) $(ags_check_system_functional_server_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_server_test_DEPENDENCIES) @rm -f ags_check_system_functional_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_server_test_LINK) $(ags_check_system_functional_server_test_OBJECTS) $(ags_check_system_functional_server_test_LDADD) $(LIBS) ags/test/X/machine/check_system_functional_synth_test-ags_functional_synth_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) ags_check_system_functional_synth_test$(EXEEXT): $(ags_check_system_functional_synth_test_OBJECTS) $(ags_check_system_functional_synth_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_synth_test_DEPENDENCIES) @rm -f ags_check_system_functional_synth_test$(EXEEXT) $(AM_V_CCLD)$(ags_check_system_functional_synth_test_LINK) $(ags_check_system_functional_synth_test_OBJECTS) $(ags_check_system_functional_synth_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ags/test/X/*.$(OBJEXT) -rm -f ags/test/X/*.lo -rm -f ags/test/X/machine/*.$(OBJEXT) -rm -f ags/test/audio/*.$(OBJEXT) -rm -f ags/test/audio/osc/*.$(OBJEXT) -rm -f ags/test/server/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo: ags/test/X/gsequencer_setup_util.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_check_system_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) -c -o ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo `test -f 'ags/test/X/gsequencer_setup_util.c' || echo '$(srcdir)/'`ags/test/X/gsequencer_setup_util.c ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo: ags/test/X/ags_functional_test_util.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_check_system_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) -c -o ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo `test -f 'ags/test/X/ags_functional_test_util.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_test_util.c ags/test/X/check_system_functional_audio_config_test-ags_functional_audio_config_test.o: ags/test/X/ags_functional_audio_config_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_audio_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_audio_config_test-ags_functional_audio_config_test.o `test -f 'ags/test/X/ags_functional_audio_config_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_audio_config_test.c ags/test/X/check_system_functional_audio_config_test-ags_functional_audio_config_test.obj: ags/test/X/ags_functional_audio_config_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_audio_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_audio_config_test-ags_functional_audio_config_test.obj `if test -f 'ags/test/X/ags_functional_audio_config_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_audio_config_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_audio_config_test.c'; fi` ags/test/audio/check_system_functional_audio_test-ags_functional_audio_test.o: ags/test/audio/ags_functional_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_functional_audio_test-ags_functional_audio_test.o `test -f 'ags/test/audio/ags_functional_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_audio_test.c ags/test/audio/check_system_functional_audio_test-ags_functional_audio_test.obj: ags/test/audio/ags_functional_audio_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_audio_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_functional_audio_test-ags_functional_audio_test.obj `if test -f 'ags/test/audio/ags_functional_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_audio_test.c'; fi` ags/test/X/check_system_functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o: ags/test/X/ags_functional_automation_editor_workflow_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_automation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_automation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_automation_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_automation_editor_workflow_test.c ags/test/X/check_system_functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj: ags/test/X/ags_functional_automation_editor_workflow_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_automation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_automation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_automation_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_automation_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_automation_editor_workflow_test.c'; fi` ags/test/X/machine/check_system_functional_drum_test-ags_functional_drum_test.o: ags/test/X/machine/ags_functional_drum_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_drum_test-ags_functional_drum_test.o `test -f 'ags/test/X/machine/ags_functional_drum_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_drum_test.c ags/test/X/machine/check_system_functional_drum_test-ags_functional_drum_test.obj: ags/test/X/machine/ags_functional_drum_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_drum_test-ags_functional_drum_test.obj `if test -f 'ags/test/X/machine/ags_functional_drum_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_drum_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_drum_test.c'; fi` ags/test/X/machine/check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o: ags/test/X/machine/ags_functional_ffplayer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o `test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_ffplayer_test.c ags/test/X/machine/check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj: ags/test/X/machine/ags_functional_ffplayer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj `if test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_ffplayer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_ffplayer_test.c'; fi` ags/test/audio/check_system_functional_fourier_transform_test-ags_functional_fourier_transform_test.o: ags/test/audio/ags_functional_fourier_transform_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_fourier_transform_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_fourier_transform_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_functional_fourier_transform_test-ags_functional_fourier_transform_test.o `test -f 'ags/test/audio/ags_functional_fourier_transform_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_fourier_transform_test.c ags/test/audio/check_system_functional_fourier_transform_test-ags_functional_fourier_transform_test.obj: ags/test/audio/ags_functional_fourier_transform_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_fourier_transform_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_fourier_transform_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_functional_fourier_transform_test-ags_functional_fourier_transform_test.obj `if test -f 'ags/test/audio/ags_functional_fourier_transform_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_fourier_transform_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_fourier_transform_test.c'; fi` ags/test/X/check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o: ags/test/X/ags_functional_line_member_add_and_destroy_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c ags/test/X/check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj: ags/test/X/ags_functional_line_member_add_and_destroy_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi` ags/test/X/check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o: ags/test/X/ags_functional_machine_add_and_destroy_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_add_and_destroy_test.c ags/test/X/check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj: ags/test/X/ags_functional_machine_add_and_destroy_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_add_and_destroy_test.c'; fi` ags/test/X/check_system_functional_machine_link_test-ags_functional_machine_link_test.o: ags/test/X/ags_functional_machine_link_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_machine_link_test-ags_functional_machine_link_test.o `test -f 'ags/test/X/ags_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_link_test.c ags/test/X/check_system_functional_machine_link_test-ags_functional_machine_link_test.obj: ags/test/X/ags_functional_machine_link_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_machine_link_test-ags_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_link_test.c'; fi` ags/test/X/machine/check_system_functional_matrix_test-ags_functional_matrix_test.o: ags/test/X/machine/ags_functional_matrix_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_matrix_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_matrix_test-ags_functional_matrix_test.o `test -f 'ags/test/X/machine/ags_functional_matrix_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_matrix_test.c ags/test/X/machine/check_system_functional_matrix_test-ags_functional_matrix_test.obj: ags/test/X/machine/ags_functional_matrix_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_matrix_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_matrix_test-ags_functional_matrix_test.obj `if test -f 'ags/test/X/machine/ags_functional_matrix_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_matrix_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_matrix_test.c'; fi` ags/test/X/machine/check_system_functional_mixer_test-ags_functional_mixer_test.o: ags/test/X/machine/ags_functional_mixer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_mixer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_mixer_test-ags_functional_mixer_test.o `test -f 'ags/test/X/machine/ags_functional_mixer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_mixer_test.c ags/test/X/machine/check_system_functional_mixer_test-ags_functional_mixer_test.obj: ags/test/X/machine/ags_functional_mixer_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_mixer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_mixer_test-ags_functional_mixer_test.obj `if test -f 'ags/test/X/machine/ags_functional_mixer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_mixer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_mixer_test.c'; fi` ags/test/X/check_system_functional_notation_edit_test-ags_functional_notation_edit_test.o: ags/test/X/ags_functional_notation_edit_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_notation_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_notation_edit_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_notation_edit_test-ags_functional_notation_edit_test.o `test -f 'ags/test/X/ags_functional_notation_edit_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_notation_edit_test.c ags/test/X/check_system_functional_notation_edit_test-ags_functional_notation_edit_test.obj: ags/test/X/ags_functional_notation_edit_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_notation_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_notation_edit_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_notation_edit_test-ags_functional_notation_edit_test.obj `if test -f 'ags/test/X/ags_functional_notation_edit_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_notation_edit_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_notation_edit_test.c'; fi` ags/test/X/check_system_functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o: ags/test/X/ags_functional_notation_editor_workflow_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_notation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_notation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_notation_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_notation_editor_workflow_test.c ags/test/X/check_system_functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj: ags/test/X/ags_functional_notation_editor_workflow_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_notation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_notation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/check_system_functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_notation_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_notation_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_notation_editor_workflow_test.c'; fi` ags/test/audio/osc/check_system_functional_osc_server_test-ags_functional_osc_server_test.o: ags/test/audio/osc/ags_functional_osc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_osc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_functional_osc_server_test-ags_functional_osc_server_test.o `test -f 'ags/test/audio/osc/ags_functional_osc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_functional_osc_server_test.c ags/test/audio/osc/check_system_functional_osc_server_test-ags_functional_osc_server_test.obj: ags/test/audio/osc/ags_functional_osc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_osc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_functional_osc_server_test-ags_functional_osc_server_test.obj `if test -f 'ags/test/audio/osc/ags_functional_osc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_functional_osc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_functional_osc_server_test.c'; fi` ags/test/audio/osc/check_system_functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o: ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_osc_xmlrpc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o `test -f 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c ags/test/audio/osc/check_system_functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj: ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_osc_xmlrpc_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/check_system_functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj `if test -f 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; fi` ags/test/X/machine/check_system_functional_panel_test-ags_functional_panel_test.o: ags/test/X/machine/ags_functional_panel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_panel_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_panel_test-ags_functional_panel_test.o `test -f 'ags/test/X/machine/ags_functional_panel_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_panel_test.c ags/test/X/machine/check_system_functional_panel_test-ags_functional_panel_test.obj: ags/test/X/machine/ags_functional_panel_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_panel_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_panel_test-ags_functional_panel_test.obj `if test -f 'ags/test/X/machine/ags_functional_panel_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_panel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_panel_test.c'; fi` ags/test/audio/check_system_functional_pitch_test-ags_functional_pitch_test.o: ags/test/audio/ags_functional_pitch_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_pitch_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_pitch_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_functional_pitch_test-ags_functional_pitch_test.o `test -f 'ags/test/audio/ags_functional_pitch_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_pitch_test.c ags/test/audio/check_system_functional_pitch_test-ags_functional_pitch_test.obj: ags/test/audio/ags_functional_pitch_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_pitch_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_pitch_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/check_system_functional_pitch_test-ags_functional_pitch_test.obj `if test -f 'ags/test/audio/ags_functional_pitch_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_pitch_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_pitch_test.c'; fi` ags/test/server/check_system_functional_server_test-ags_functional_server_test.o: ags/test/server/ags_functional_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/check_system_functional_server_test-ags_functional_server_test.o `test -f 'ags/test/server/ags_functional_server_test.c' || echo '$(srcdir)/'`ags/test/server/ags_functional_server_test.c ags/test/server/check_system_functional_server_test-ags_functional_server_test.obj: ags/test/server/ags_functional_server_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_server_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/check_system_functional_server_test-ags_functional_server_test.obj `if test -f 'ags/test/server/ags_functional_server_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_functional_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_functional_server_test.c'; fi` ags/test/X/machine/check_system_functional_synth_test-ags_functional_synth_test.o: ags/test/X/machine/ags_functional_synth_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_synth_test-ags_functional_synth_test.o `test -f 'ags/test/X/machine/ags_functional_synth_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_synth_test.c ags/test/X/machine/check_system_functional_synth_test-ags_functional_synth_test.obj: ags/test/X/machine/ags_functional_synth_test.c $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/check_system_functional_synth_test-ags_functional_synth_test.obj `if test -f 'ags/test/X/machine/ags_functional_synth_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_synth_test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf ags/test/X/.libs ags/test/X/_libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ags-docs-local: ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: functional-system-tests.mk $(PROGRAMS) $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ags/test/X/$(am__dirstamp) -rm -f ags/test/X/machine/$(am__dirstamp) -rm -f ags/test/audio/$(am__dirstamp) -rm -f ags/test/audio/osc/$(am__dirstamp) -rm -f ags/test/server/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-recursive ags-docs-am: ags-docs-local clean: clean-recursive clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f functional-system-tests.mk distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f functional-system-tests.mk maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS ags-docs-am \ ags-docs-local all all-am am--refresh check check-am clean \ clean-cscope clean-generic clean-libtool \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: functional-system-tests.mk @WITH_SYSTEM_TESTS_TRUE@ags-check-system-functional-test: $(installcheck_programs) @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_server_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_audio_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_pitch_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_fourier_transform_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_osc_server_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_osc_xmlrpc_server_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_machine_add_and_destroy_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_machine_link_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_line_member_add_and_destroy_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_notation_editor_workflow_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_automation_editor_workflow_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_panel_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_mixer_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_drum_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_matrix_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_synth_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_ffplayer_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_notation_edit_test @WITH_SYSTEM_TESTS_TRUE@ ./ags_check_system_functional_audio_config_test # WITH_SYSTEM_TESTS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/license-notice-gnu-agpl-3-0+-sym.txt0000644000175000017500000000140313607210263017126 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with GSequencer. If not, see . gsequencer-3.1.3/ags_certificate_test.xml0000644000175000017500000000164413607210263015502 00000000000000 ags-test-cert-uuid-0 ags-test-domain ags-test-key-type ags-test-public-key-file ags-test-private-key-file gsequencer-3.1.3/compile0000755000175000017500000001632713622252204012165 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsequencer-3.1.3/gsequencer.1.xml0000644000175000017500000001270613607210263013630 00000000000000 2020-01-08 2020 Joël Krähemann This manual page is part of GSequencer. License GPLv3+: GNU GPL version 3 or (at your option) any later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gsequencer 1 gsequencer v3.0.0 gsequencer Advanced Gtk+ Sequencer is an audio sequencer and composition editor /usr/bin/gsequencer --help --version --no-builtin-theme --filename file Description Advanced GTK+ Sequencer is intended to use for music composition. It features a piano roll, as well a synth, matrix editor, drum machine, soundfont2 player, mixer and an output panel. It’s designed to be highly configurable. You may add effects to its effect chain; and add or remove audio channels/pads. You may set up a fully functional network of engines, thus there is a link editor for linking audio lines. As version 1.0.0 it supports LADSPA, DSSI and Lv2 plugin format. And provides the ability to export to WAV, FLAC and OGG audio files. It can run on various soundcard backends including ALSA, OSS4, JACK Audio Connection Kit, Pulseaudio Core-Audio, Audio-Unit and WASAPI. OPTIONS The program follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the info 1 files. Disable built-in theme in order to display default theme. Open file from command line. Show summary of options. Show version of program. ENVIRONMENT VARIABLES The program interprets following environment variables if set. LADSPA_PATH LADSPA plugin search path DSSI_PATH DSSI plugin search path LV2_PATH LV2 plugin search path AGS_ANIMATION_FILENAME The splash screen's background picture AGS_ANIMATION_TEXT_BOX_X0 The splash screen's text box x-position AGS_ANIMATION_TEXT_BOX_Y0 The splash screen's text box y-position AGS_ANIMATION_TEXT_COLOR The splash screen's text color AGS_CSS_FILENAME The application's style sheet BUGS None. So far I know. AUTHOR Joël Krähemann Original author gsequencer-3.1.3/libags_thread.sym0000644000175000017500000001015313622252234014123 00000000000000ags_concurrency_provider_get_type ags_concurrency_provider_get_main_loop ags_concurrency_provider_set_main_loop ags_concurrency_provider_get_task_launcher ags_concurrency_provider_set_task_launcher ags_concurrency_provider_get_thread_pool ags_concurrency_provider_set_thread_pool ags_concurrency_provider_get_worker ags_concurrency_provider_set_worker ags_returnable_thread_get_type ags_returnable_thread_test_flags ags_returnable_thread_set_flags ags_returnable_thread_unset_flags ags_returnable_thread_safe_run ags_returnable_thread_connect_safe_run ags_returnable_thread_disconnect_safe_run ags_returnable_thread_new ags_message_envelope_get_type ags_message_envelope_get_sender ags_message_envelope_get_recipient ags_message_envelope_get_doc ags_message_envelope_get_parameter ags_message_envelope_new ags_message_envelope_new_with_params ags_generic_main_loop_get_type ags_generic_main_loop_new ags_timestamp_get_type ags_timestamp_test_flags ags_timestamp_set_flags ags_timestamp_unset_flags ags_timestamp_get_unix_time ags_timestamp_set_unix_time ags_timestamp_get_ags_offset ags_timestamp_set_ags_offset ags_timestamp_new ags_task_get_type ags_task_test_flags ags_task_set_flags ags_task_unset_flags ags_task_launch ags_task_failure ags_task_new ags_message_delivery_get_type ags_message_delivery_add_message_queue ags_message_delivery_remove_message_queue ags_message_delivery_find_sender_namespace ags_message_delivery_find_recipient_namespace ags_message_delivery_add_message_envelope ags_message_delivery_remove_message_envelope ags_message_delivery_find_sender ags_message_delivery_find_recipient ags_message_delivery_query_message ags_message_delivery_get_instance ags_message_delivery_new ags_thread_pool_get_type ags_thread_pool_pull ags_thread_pool_start ags_thread_pool_new ags_thread_application_context_get_type ags_thread_application_context_register_types ags_thread_application_context_new ags_thread_get_type ags_thread_global_get_use_sync_counter ags_thread_test_flags ags_thread_set_flags ags_thread_unset_flags ags_thread_test_status_flags ags_thread_set_status_flags ags_thread_unset_status_flags ags_thread_clear_status_flags ags_thread_test_sync_tic_flags ags_thread_set_sync_tic_flags ags_thread_unset_sync_tic_flags ags_thread_clear_sync_tic_flags ags_thread_set_current_sync_tic ags_thread_get_current_sync_tic ags_thread_set_delay ags_thread_get_delay ags_thread_set_frequency ags_thread_get_frequency ags_thread_set_max_precision ags_thread_get_max_precision ags_thread_find_type ags_thread_self ags_thread_parent ags_thread_next ags_thread_prev ags_thread_children ags_thread_get_toplevel ags_thread_first ags_thread_last ags_thread_lock ags_thread_trylock ags_thread_unlock ags_thread_remove_child ags_thread_add_child ags_thread_add_child_extended ags_thread_is_current_ready ags_thread_is_tree_ready_recursive ags_thread_prepare_current_sync ags_thread_prepare_tree_sync_recursive ags_thread_set_current_sync ags_thread_set_tree_sync_recursive ags_thread_clock ags_thread_add_start_queue ags_thread_add_start_queue_all ags_thread_start ags_thread_run ags_thread_stop ags_thread_new ags_worker_thread_get_type ags_worker_thread_test_status_flags ags_worker_thread_set_status_flags ags_worker_thread_unset_status_flags ags_woker_thread_do_poll_loop ags_worker_thread_do_poll ags_worker_thread_new ags_task_launcher_get_type ags_task_launcher_test_flags ags_task_launcher_set_flags ags_task_launcher_unset_flags ags_task_launcher_attach ags_task_launcher_add_task ags_task_launcher_add_task_all ags_task_launcher_add_cyclic_task ags_task_launcher_remove_cyclic_task ags_task_launcher_run ags_task_launcher_sync_run ags_task_launcher_new ags_destroy_worker_get_type ags_destroy_entry_alloc ags_destroy_worker_add ags_destroy_worker_get_instance ags_destroy_worker_new ags_message_queue_get_type ags_message_queue_add_message_envelope ags_message_queue_remove_message_envelope ags_message_queue_find_sender ags_message_queue_find_recipient ags_message_queue_query_message ags_message_queue_new ags_task_completion_get_type ags_task_completion_test_flags ags_task_completion_set_flags ags_task_completion_unset_flags ags_task_completion_complete ags_task_completion_new gsequencer-3.1.3/license-notice-gnu-gpl-3-0+-c.txt0000644000175000017500000000120013461636435016405 00000000000000 * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . gsequencer-3.1.3/libags.sym0000644000175000017500000003326213622252234012602 00000000000000ags_id_generator_create_uuid ags_destroy_util_dispose_and_unref ags_soundcard_helper_config_get_dsp_channels ags_soundcard_helper_config_get_pcm_channels ags_soundcard_helper_config_get_samplerate ags_soundcard_helper_config_get_buffer_size ags_soundcard_helper_config_get_format ags_list_util_find_type ags_function_get_type ags_function_collapse_parantheses ags_function_find_literals ags_function_literal_solve ags_function_push_equation ags_function_pop_equation ags_function_get_expanded ags_function_get_normalized ags_function_compute_term ags_function_symbolic_translate_value ags_function_substitute_values ags_function_translate_value ags_function_new ags_complex_get_type ags_complex_alloc ags_complex_copy ags_complex_free ags_complex_get ags_complex_set ags_solver_vector_get_type ags_solver_vector_new ags_string_util_escape_single_quote ags_strv_length ags_strv_contains ags_strv_index ags_endian_host_is_le ags_endian_host_is_be ags_endian_swap_float ags_log_get_type ags_log_add_message ags_log_get_messages ags_log_get_instance ags_log_new ags_turtle_manager_get_type ags_turtle_manager_find ags_turtle_manager_add ags_turtle_manager_get_instance ags_turtle_manager_new ags_buffer_util_s8_to_char_buffer ags_buffer_util_s16_to_char_buffer ags_buffer_util_s24_to_char_buffer ags_buffer_util_s32_to_char_buffer ags_buffer_util_s64_to_char_buffer ags_buffer_util_float_to_char_buffer ags_buffer_util_double_to_char_buffer ags_buffer_util_complex_to_char_buffer ags_buffer_util_char_buffer_to_s8 ags_buffer_util_char_buffer_to_s16 ags_buffer_util_char_buffer_to_s24 ags_buffer_util_char_buffer_to_s32 ags_buffer_util_char_buffer_to_s64 ags_buffer_util_char_buffer_to_float ags_buffer_util_char_buffer_to_double ags_buffer_util_char_buffer_to_complex ags_buffer_util_char_buffer_read_s8 ags_buffer_util_char_buffer_read_s16 ags_buffer_util_char_buffer_read_s24 ags_buffer_util_char_buffer_read_s32 ags_buffer_util_char_buffer_read_s64 ags_buffer_util_char_buffer_read_float ags_buffer_util_char_buffer_read_double ags_buffer_util_char_buffer_read_complex ags_buffer_util_char_buffer_write_s8 ags_buffer_util_char_buffer_write_s16 ags_buffer_util_char_buffer_write_s24 ags_buffer_util_char_buffer_write_s32 ags_buffer_util_char_buffer_write_s64 ags_buffer_util_char_buffer_write_float ags_buffer_util_char_buffer_write_double ags_buffer_util_char_buffer_write_complex ags_buffer_util_char_buffer_swap_bytes ags_time_get_uptime_from_offset ags_time_timeout_expired ags_turtle_get_type ags_turtle_read_iriref ags_turtle_read_pname_ns ags_turtle_read_pname_ln ags_turtle_read_blank_node_label ags_turtle_read_langtag ags_turtle_read_boolean ags_turtle_read_integer ags_turtle_read_decimal ags_turtle_read_double ags_turtle_read_exponent ags_turtle_read_string ags_turtle_read_string_literal_quote ags_turtle_read_string_literal_single_quote ags_turtle_read_string_literal_long_quote ags_turtle_read_string_literal_long_single_quote ags_turtle_read_uchar ags_turtle_read_echar ags_turtle_read_ws ags_turtle_read_anon ags_turtle_read_pn_chars_base ags_turtle_read_pn_chars_u ags_turtle_read_pn_chars ags_turtle_read_pn_prefix ags_turtle_read_pn_local ags_turtle_read_plx ags_turtle_read_percent ags_turtle_read_hex ags_turtle_read_pn_local_esc ags_turtle_find_xpath ags_turtle_find_xpath_with_context_node ags_turtle_string_convert ags_turtle_load ags_turtle_new ags_uuid_get_type ags_uuid_alloc ags_uuid_copy ags_uuid_free ags_uuid_generate ags_uuid_compare ags_uuid_to_string ags_uuid_from_string ags_regcomp ags_regexec ags_conversion_get_type ags_conversion_convert ags_conversion_new ags_solver_matrix_get_type ags_solver_matrix_new ags_application_context ags_connectable_get_type ags_connectable_get_uuid ags_connectable_has_resource ags_connectable_is_ready ags_connectable_add_to_registry ags_connectable_remove_from_registry ags_connectable_list_resource ags_connectable_xml_compose ags_connectable_xml_parse ags_connectable_is_connected ags_connectable_connect ags_connectable_disconnect ags_connectable_connect_connection ags_connectable_disconnect_connection ags_soundcard_get_type ags_soundcard_set_device ags_soundcard_get_device ags_soundcard_set_presets ags_soundcard_get_presets ags_soundcard_list_cards ags_soundcard_pcm_info ags_soundcard_get_capability ags_soundcard_is_available ags_soundcard_is_starting ags_soundcard_is_playing ags_soundcard_is_recording ags_soundcard_get_uptime ags_soundcard_play_init ags_soundcard_play ags_soundcard_record_init ags_soundcard_record ags_soundcard_stop ags_soundcard_tic ags_soundcard_offset_changed ags_soundcard_get_buffer ags_soundcard_get_next_buffer ags_soundcard_get_prev_buffer ags_soundcard_lock_buffer ags_soundcard_unlock_buffer ags_soundcard_set_bpm ags_soundcard_get_bpm ags_soundcard_set_delay_factor ags_soundcard_get_delay_factor ags_soundcard_get_absolute_delay ags_soundcard_get_delay ags_soundcard_get_attack ags_soundcard_get_delay_counter ags_soundcard_set_start_note_offset ags_soundcard_get_start_note_offset ags_soundcard_set_note_offset ags_soundcard_get_note_offset ags_soundcard_set_note_offset_absolute ags_soundcard_get_note_offset_absolute ags_soundcard_set_loop ags_soundcard_get_loop ags_soundcard_get_loop_offset ags_soundcard_get_sub_block_count ags_soundcard_trylock_sub_block ags_soundcard_unlock_sub_block ags_applicable_get_type ags_applicable_set_update ags_applicable_apply ags_applicable_reset ags_sequencer_get_type ags_sequencer_set_device ags_sequencer_get_device ags_sequencer_list_cards ags_sequencer_is_starting ags_sequencer_is_playing ags_sequencer_is_recording ags_sequencer_play_init ags_sequencer_play ags_sequencer_record_init ags_sequencer_record ags_sequencer_stop ags_sequencer_tic ags_sequencer_offset_changed ags_sequencer_get_buffer ags_sequencer_get_next_buffer ags_sequencer_lock_buffer ags_sequencer_unlock_buffer ags_sequencer_set_bpm ags_sequencer_get_bpm ags_sequencer_set_delay_factor ags_sequencer_get_delay_factor ags_sequencer_set_start_note_offset ags_sequencer_get_start_note_offset ags_sequencer_set_note_offset ags_sequencer_get_note_offset ags_tactable_get_type ags_tactable_get_sequencer_duration ags_tactable_get_notation_duration ags_tactable_get_wave_duration ags_tactable_get_midi_duration ags_tactable_get_bpm ags_tactable_get_tact ags_tactable_change_sequencer_duration ags_tactable_change_notation_duration ags_tactable_change_wave_duration ags_tactable_change_midi_duration ags_tactable_change_bpm ags_tactable_change_tact ags_main_loop_get_type ags_main_loop_get_tree_lock ags_main_loop_set_syncing ags_main_loop_is_syncing ags_main_loop_set_critical_region ags_main_loop_is_critical_region ags_main_loop_inc_queued_critical_region ags_main_loop_dec_queued_critical_region ags_main_loop_test_queued_critical_region ags_main_loop_change_frequency ags_seekable_get_type ags_seekable_seek ags_cursor_get_type ags_cursor_get_default_offset ags_cursor_get_tact ags_cursor_get_bpm ags_cursor_get_rate ags_cursor_get_delay ags_cursor_get_duration ags_cursor_get_delay_counter ags_cursor_get_offset ags_cursor_get_prev ags_cursor_get_next ags_cursor_get_current_copy ags_cursor_get_current ags_sound_server_get_type ags_sound_server_set_url ags_sound_server_get_url ags_sound_server_set_ports ags_sound_server_get_ports ags_sound_server_set_soundcard ags_sound_server_get_soundcard ags_sound_server_set_sequencer ags_sound_server_get_sequencer ags_sound_server_register_soundcard ags_sound_server_unregister_soundcard ags_sound_server_register_sequencer ags_sound_server_unregister_sequencer ags_countable_get_type ags_countable_get_sequencer_counter ags_countable_get_notation_counter ags_countable_get_wave_counter ags_countable_get_midi_counter ags_portlet_get_type ags_portlet_get_port ags_portlet_set_port ags_portlet_list_safe_properties ags_portlet_safe_get_property ags_portlet_safe_set_property ags_globals_get_hash_table ags_globals_set ags_globals_get ags_application_context_get_type ags_application_context_test_flags ags_application_context_set_flags ags_application_context_unset_flags ags_application_context_load_config ags_application_context_prepare ags_application_context_setup ags_application_context_register_types ags_application_context_quit ags_application_context_get_instance ags_application_context_new ags_priority_get_type ags_priority_load_defaults ags_priority_load_from_file ags_priority_set_value ags_priority_get_value ags_priority_get_instance ags_priority_new ags_mutable_get_type ags_mutable_set_muted ags_plugin_get_type ags_plugin_get_name ags_plugin_set_name ags_plugin_get_version ags_plugin_set_version ags_plugin_get_build_id ags_plugin_set_build_id ags_plugin_get_xml_type ags_plugin_set_xml_type ags_plugin_get_ports ags_plugin_set_ports ags_plugin_read ags_plugin_write ags_config_get_type ags_config_load_defaults ags_config_load_from_file ags_config_load_from_data ags_config_set_value ags_config_get_value ags_config_to_data ags_config_save ags_config_clear ags_config_get_instance ags_config_new ags_cclosure_marshal_VOID__UINT64 ags_cclosure_marshal_VOID__BOOLEAN_POINTER ags_cclosure_marshal_VOID__INT_UINT ags_cclosure_marshal_VOID__INT_POINTER ags_cclosure_marshal_VOID__INT_UINT_POINTER ags_cclosure_marshal_VOID__UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT ags_cclosure_marshal_VOID__UINT_INT ags_cclosure_marshal_VOID__UINT_DOUBLE ags_cclosure_marshal_VOID__UINT_STRING_UINT ags_cclosure_marshal_VOID__UINT_POINTER_UINT ags_cclosure_marshal_VOID__INT64_UINT ags_cclosure_marshal_VOID__ULONG_UINT ags_cclosure_marshal_VOID__ULONG_UINT_BOOLEAN ags_cclosure_marshal_VOID__DOUBLE_DOUBLE ags_cclosure_marshal_VOID__ULONG_UINT_UINT ags_cclosure_marshal_VOID__STRING_UINT ags_cclosure_marshal_VOID__STRING_UINT_DOUBLE ags_cclosure_marshal_VOID__STRING_UINT_POINTER ags_cclosure_marshal_VOID__STRING_UINT_STRING_DOUBLE ags_cclosure_marshal_VOID__STRING_POINTER ags_cclosure_marshal_VOID__STRING_STRING_STRING ags_cclosure_marshal_VOID__POINTER_INT ags_cclosure_marshal_VOID__POINTER_INT_POINTER ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN ags_cclosure_marshal_VOID__POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER ags_cclosure_marshal_VOID__POINTER_UINT_UINT ags_cclosure_marshal_VOID__POINTER_UINT_POINTER ags_cclosure_marshal_VOID__POINTER_POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER ags_cclosure_marshal_VOID__OBJECT_UINT ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT ags_cclosure_marshal_VOID__OBJECT_OBJECT ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT ags_cclosure_marshal_ULONG__VOID ags_cclosure_marshal_INT__VOID ags_cclosure_marshal_INT64__OBJECT ags_cclosure_marshal_UINT__VOID ags_cclosure_marshal_BOOLEAN__VOID ags_cclosure_marshal_BOOLEAN__UINT_POINTER ags_cclosure_marshal_BOOLEAN__POINTER_UINT ags_cclosure_marshal_BOOLEAN__OBJECT_OBJECT ags_cclosure_marshal_UINT__INT_UINT_POINTER ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN ags_cclosure_marshal_STRING__STRING_STRING ags_cclosure_marshal_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER ags_cclosure_marshal_POINTER__VOID ags_cclosure_marshal_POINTER__INT ags_cclosure_marshal_POINTER__UINT ags_cclosure_marshal_POINTER__POINTER ags_cclosure_marshal_POINTER__INT_UINT ags_cclosure_marshal_POINTER__UINT_UINT ags_cclosure_marshal_POINTER__UINT_POINTER ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER ags_cclosure_marshal_POINTER__POINTER_UINT ags_cclosure_marshal_POINTER__STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING_STRING ags_cclosure_marshal_POINTER__ULONG_POINTER_UINT ags_cclosure_marshal_POINTER__ULONG_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64 ags_cclosure_marshal_POINTER__OBJECT_OBJECT ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__POINTER_STRING_STRING ags_cclosure_marshal_OBJECT__VOID ags_cclosure_marshal_OBJECT__UINT_POINTER ags_cclosure_marshal_OBJECT__STRING_STRING_STRING ags_cclosure_marshal_OBJECT__OBJECT ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_OBJECT ags_file_get_type ags_file_str2md5 ags_file_add_id_ref ags_file_find_id_ref_by_node ags_file_find_id_ref_by_xpath ags_file_find_id_ref_by_reference ags_file_add_lookup ags_file_add_launch ags_file_open ags_file_open_from_data ags_file_rw_open ags_file_open_filename ags_file_close ags_file_write ags_file_write_concurrent ags_file_write_resolve ags_file_read ags_file_read_resolve ags_file_read_start ags_file_read_config ags_file_write_config ags_file_read_application_context ags_file_write_application_context ags_file_new ags_file_launch_get_type ags_file_launch_start ags_file_launch_new ags_file_lookup_get_type ags_file_lookup_find_by_node ags_file_lookup_find_by_reference ags_file_lookup_resolve ags_file_lookup_new ags_file_id_ref_get_type ags_file_id_ref_resolved ags_file_id_ref_new ags_file_link_get_type ags_file_link_new gsequencer-3.1.3/ags/0000755000175000017500000000000013622252263011435 500000000000000gsequencer-3.1.3/ags/test/0000755000175000017500000000000013622252250012410 500000000000000gsequencer-3.1.3/ags/test/X/0000755000175000017500000000000013622252263012623 500000000000000gsequencer-3.1.3/ags/test/X/ags_functional_notation_editor_workflow_test.c0000644000175000017500000003317713607210263024165 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_notation_editor_workflow_test_add_test(); int ags_functional_notation_editor_workflow_test_init_suite(); int ags_functional_notation_editor_workflow_test_clean_suite(); void ags_functional_notation_editor_workflow_test_drum(); void ags_functional_notation_editor_workflow_test_matrix(); #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_notation_editor_workflow_test_ffplayer(); #endif void ags_functional_notation_editor_workflow_test_edit_all(); void ags_functional_notation_editor_workflow_test_fill_all(); #define AGS_FUNCTIONAL_NOTATION_EDITOR_WORKFLOW_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_notation_editor_workflow_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer editor workflow AgsDrum", ags_functional_notation_editor_workflow_test_drum) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer editor workflow AgsMatrix", ags_functional_notation_editor_workflow_test_matrix) == NULL) || #ifdef AGS_WITH_LIBINSTPATCH (CU_add_test(pSuite, "functional test of GSequencer editor workflow AgsFFPlayer", ags_functional_notation_editor_workflow_test_ffplayer) == NULL) || #endif (CU_add_test(pSuite, "functional test of GSequencer editor workflow edit all", ags_functional_notation_editor_workflow_test_edit_all) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer editor workflow fill all", ags_functional_notation_editor_workflow_test_fill_all) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_notation_editor_workflow_test_init_suite() { /* window and editor size */ ags_functional_test_util_file_default_window_resize(); ags_functional_test_util_file_default_editor_resize(); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_notation_editor_workflow_test_clean_suite() { return(0); } void ags_functional_notation_editor_workflow_test_drum() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 0; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; ags_test_leave(); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsNotationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsNotationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsNotationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = notation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsNotationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); } void ags_functional_notation_editor_workflow_test_matrix() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 1; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MATRIX(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; ags_test_leave(); /* add index set link */ success = ags_functional_test_util_machine_selection_add_index("AgsNotationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsNotationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsNotationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = notation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsNotationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); } #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_notation_editor_workflow_test_ffplayer() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 2; /* add fplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; ags_test_leave(); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsNotationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsNotationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsNotationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = notation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsNotationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); } #endif void ags_functional_notation_editor_workflow_test_edit_all() { guint nth_machine; guint i, j; gboolean success; /* * edit drum */ nth_machine = 0; /* set zoom */ success = ags_functional_test_util_notation_toolbar_zoom(AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_4); CU_ASSERT(success == TRUE); /* edit tool */ success = ags_functional_test_util_notation_toolbar_edit_click(); CU_ASSERT(success == TRUE); /* select index */ success = ags_functional_test_util_machine_selector_select("AgsNotationEditor", nth_machine); CU_ASSERT(success == TRUE); /* add drum kick pattern 2/4 */ success = TRUE; for(i = 0; i < 64 && success;){ success = ags_functional_test_util_notation_edit_add_point(i, i, 0); i += 8; } for(i = 4; i < 64 && success;){ success = ags_functional_test_util_notation_edit_add_point(i, i, 1); i += 8; } CU_ASSERT(success == TRUE); /* * edit matrix */ nth_machine = 1; /* select index */ success = ags_functional_test_util_machine_selector_select("AgsNotationEditor", nth_machine); CU_ASSERT(success == TRUE); /* set zoom */ success = ags_functional_test_util_notation_toolbar_zoom(AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_8); CU_ASSERT(success == TRUE); /* add matrix baseline pattern 8/8 */ success = TRUE; for(i = 0; i < 32 && success;){ for(j = 0; j < 56 && success;){ success = ags_functional_test_util_notation_edit_add_point(i * 8 + j, i * 8 + j, 15); j += 8; } if(!success){ break; } success = ags_functional_test_util_notation_edit_add_point(i * 8 + 56, i * 8 + 56, 14); i += 8; } CU_ASSERT(success == TRUE); #ifdef AGS_WITH_LIBINSTPATCH /* * edit ffplayer */ nth_machine = 2; /* select index */ success = ags_functional_test_util_machine_selector_select("AgsNotationEditor", nth_machine); CU_ASSERT(success == TRUE); /* set zoom */ success = ags_functional_test_util_notation_toolbar_zoom(AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_4); CU_ASSERT(success == TRUE); /* add ffplayer note 4/4 */ success = TRUE; for(i = 0; i < 64 && success;){ success = ags_functional_test_util_notation_edit_add_point(i, i + 1, rand() % 10); i += 8; } CU_ASSERT(success == TRUE); #endif } void ags_functional_notation_editor_workflow_test_fill_all() { guint nth_machine; } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalNotationEditorWorkflowTest", ags_functional_notation_editor_workflow_test_init_suite, ags_functional_notation_editor_workflow_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_NOTATION_EDITOR_WORKFLOW_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_notation_editor_workflow_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/gsequencer_setup_util.h0000644000175000017500000000255113607210263017332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __GSEQUENCER_TEST_SETUP_UTIL_H__ #define __GSEQUENCER_TEST_SETUP_UTIL_H__ #include #include void ags_test_enter(); void ags_test_leave(); GRecMutex* ags_test_get_driver_mutex(); void ags_test_init(int *argc, char ***argv, gchar *conf_str); void ags_test_quit(); void ags_test_show_file_error(gchar *filename, GError *error); void ags_test_signal_handler(int signr); void ags_test_signal_cleanup(); void ags_test_setup(int argc, char **argv); void ags_test_launch(); void ags_test_launch_filename(gchar *filename); #endif /*__GSEQUENCER_TEST_SETUP_UTIL_H__*/ gsequencer-3.1.3/ags/test/X/ags_functional_machine_add_and_destroy_test.c0000644000175000017500000002554513607210263023641 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_machine_add_and_destroy_test_add_test(); int ags_functional_machine_add_and_destroy_test_init_suite(); int ags_functional_machine_add_and_destroy_test_clean_suite(); void ags_functional_machine_add_and_destroy_test_panel(); void ags_functional_machine_add_and_destroy_test_mixer(); void ags_functional_machine_add_and_destroy_test_spectrometer(); void ags_functional_machine_add_and_destroy_test_equalizer10(); void ags_functional_machine_add_and_destroy_test_drum(); void ags_functional_machine_add_and_destroy_test_matrix(); void ags_functional_machine_add_and_destroy_test_synth(); void ags_functional_machine_add_and_destroy_test_fm_synth(); #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_machine_add_and_destroy_test_ffplayer(); #endif void ags_functional_machine_add_and_destroy_test_syncsynth(); void ags_functional_machine_add_and_destroy_test_fm_syncsynth(); void ags_functional_machine_add_and_destroy_test_pitch_sampler(); void ags_functional_machine_add_and_destroy_test_audiorec(); #define AGS_FUNCTIONAL_MACHINE_ADD_AND_DESTROY_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_machine_add_and_destroy_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsPanel", ags_functional_machine_add_and_destroy_test_panel) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsMixer", ags_functional_machine_add_and_destroy_test_mixer) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsSpectrometer", ags_functional_machine_add_and_destroy_test_spectrometer) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsEqualizer10", ags_functional_machine_add_and_destroy_test_equalizer10) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsDrum", ags_functional_machine_add_and_destroy_test_drum) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsMatrix", ags_functional_machine_add_and_destroy_test_matrix) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsSynth", ags_functional_machine_add_and_destroy_test_synth) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsFMSynth", ags_functional_machine_add_and_destroy_test_fm_synth) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsSyncsynth", ags_functional_machine_add_and_destroy_test_syncsynth) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsFMSyncsynth", ags_functional_machine_add_and_destroy_test_fm_syncsynth) == NULL) #ifdef AGS_WITH_LIBINSTPATCH || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsFFPlayer", ags_functional_machine_add_and_destroy_test_ffplayer) == NULL) #endif || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsPitchSampler", ags_functional_machine_add_and_destroy_test_pitch_sampler) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine add and destroy AgsAudiorec", ags_functional_machine_add_and_destroy_test_audiorec) == NULL) ){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_machine_add_and_destroy_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_machine_add_and_destroy_test_clean_suite() { return(0); } void ags_functional_machine_add_and_destroy_test_panel() { gboolean success; /* add panel */ success = ags_functional_test_util_add_machine(NULL, "Panel"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* destroy panel */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_mixer() { gboolean success; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); /* destroy mixer */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_spectrometer() { gboolean success; /* add spectrometer */ success = ags_functional_test_util_add_machine(NULL, "Spectrometer"); CU_ASSERT(success == TRUE); /* destroy spectrometer */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_equalizer10() { gboolean success; /* add equalizer10 */ success = ags_functional_test_util_add_machine(NULL, "Equalizer"); CU_ASSERT(success == TRUE); /* destroy equalizer10 */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_drum() { gboolean success; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); /* destroy drum */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_matrix() { gboolean success; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); /* destroy matrix */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_synth() { gboolean success; /* add synth */ success = ags_functional_test_util_add_machine(NULL, "Synth"); CU_ASSERT(success == TRUE); /* destroy synth */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_fm_synth() { gboolean success; /* add synth */ success = ags_functional_test_util_add_machine(NULL, "FM Synth"); CU_ASSERT(success == TRUE); /* destroy synth */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_syncsynth() { gboolean success; /* add syncsynth */ success = ags_functional_test_util_add_machine(NULL, "Syncsynth"); CU_ASSERT(success == TRUE); /* destroy syncsynth */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_fm_syncsynth() { gboolean success; /* add syncsynth */ success = ags_functional_test_util_add_machine(NULL, "FM Syncsynth"); CU_ASSERT(success == TRUE); /* destroy syncsynth */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_ffplayer() { gboolean success; /* add fplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); /* destroy fplayer */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_pitch_sampler() { gboolean success; /* add fplayer */ success = ags_functional_test_util_add_machine(NULL, "Sampler"); CU_ASSERT(success == TRUE); /* destroy fplayer */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_machine_add_and_destroy_test_audiorec() { gboolean success; /* add audiorec */ success = ags_functional_test_util_add_machine(NULL, "Audiorec"); CU_ASSERT(success == TRUE); /* destroy audiorec */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalMachineAddAndDestroyTest", ags_functional_machine_add_and_destroy_test_init_suite, ags_functional_machine_add_and_destroy_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_MACHINE_ADD_AND_DESTROY_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_machine_add_and_destroy_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/ags_functional_test_util.c0000644000175000017500000036514213607210263020007 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #ifdef AGS_FAST_FUNCTIONAL_TESTS #define AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME (125000) #define AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (750000) #else #define AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME (1000000) #define AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (2000000) #endif gboolean ags_functional_test_util_driver_prepare(GSource *source, gint *timeout_); gboolean ags_functional_test_util_driver_check(GSource *source); gboolean ags_functional_test_util_driver_dispatch(GSource *source, GSourceFunc callback, gpointer user_data); void* ags_functional_test_util_add_test_thread(void *ptr); void* ags_functional_test_util_do_run_thread(void *ptr); extern AgsApplicationContext *ags_application_context; extern AgsLadspaManager *ags_ladspa_manager; extern AgsDssiManager *ags_dssi_manager; extern AgsLv2Manager *ags_lv2_manager; extern AgsLv2uiManager *ags_lv2ui_manager; GThread *ags_functional_test_util_thread; AgsTaskLauncher *task_launcher; struct _AddTest{ AgsFunctionalTestUtilAddTest add_test; volatile gboolean *is_available; }; struct timespec ags_functional_test_util_default_timeout = { 59, 0, }; gboolean ags_functional_test_util_driver_prepare(GSource *source, gint *timeout_) { if(timeout_ != NULL){ *timeout_ = -1; } return(TRUE); } gboolean ags_functional_test_util_driver_check(GSource *source) { return(TRUE); } gboolean ags_functional_test_util_driver_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { g_main_context_iteration(g_main_context_default(), FALSE); g_rec_mutex_unlock(ags_test_get_driver_mutex()); usleep(4000); g_rec_mutex_lock(ags_test_get_driver_mutex()); g_main_context_iteration(g_main_context_default(), FALSE); return(G_SOURCE_CONTINUE); } GThread* ags_functional_test_util_test_runner_thread() { return(ags_functional_test_util_thread); } struct timespec* ags_functional_test_util_get_default_timeout() { return(&ags_functional_test_util_default_timeout); } void* ags_functional_test_util_add_test_thread(void *ptr) { struct _AddTest *test; ags_functional_test_util_thread = g_thread_self(); test = ptr; while(!g_atomic_int_get(test->is_available)){ usleep(12500); } test->add_test(); g_thread_exit(NULL); return(NULL); } void ags_functional_test_util_add_test(AgsFunctionalTestUtilAddTest add_test, volatile gboolean *is_available) { struct _AddTest *test; GThread *thread; test = (struct _AddTest *) malloc(sizeof(struct _AddTest)); test->add_test = add_test; test->is_available = is_available; thread = g_thread_new("libgsequencer.so - functional test", ags_functional_test_util_add_test_thread, test); } void ags_functional_test_util_notify_add_test(volatile gboolean *is_available) { g_atomic_int_set(is_available, TRUE); } void* ags_functional_test_util_do_run_thread(void *ptr) { AgsXorgApplicationContext *xorg_application_context; volatile gboolean *is_available; xorg_application_context = (AgsXorgApplicationContext *) ags_application_context_get_instance(); is_available = ptr; while(g_atomic_int_get(&(xorg_application_context->gui_ready)) == 0){ usleep(500000); } ags_xorg_application_context_setup(xorg_application_context); // g_atomic_int_set(&(xorg_application_context->gui_ready), // FALSE); /* */ while(g_atomic_int_get(&(xorg_application_context->show_animation))){ usleep(500000); } usleep(1000000); /* get gui thread */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(xorg_application_context)); ags_functional_test_util_notify_add_test(is_available); g_thread_exit(NULL); return(NULL); } void ags_functional_test_util_do_run(int argc, char **argv, AgsFunctionalTestUtilAddTest add_test, volatile gboolean *is_available) { AgsApplicationContext *application_context; AgsLog *log; GThread *thread; GRecMutex *mutex; GSource *driver_source; GSourceFuncs driver_funcs; /* application context */ application_context = ags_application_context = (AgsApplicationContext *) ags_xorg_application_context_new(); g_object_ref(application_context); application_context->argc = argc; application_context->argv = argv; log = ags_log_get_instance(); ags_log_add_message(log, "Welcome to Advanced Gtk+ Sequencer - Test"); ags_functional_test_util_add_test(add_test, is_available); /* application context */ mutex = ags_test_get_driver_mutex(); g_rec_mutex_lock(mutex); thread = g_thread_new("libgsequencer.so - functional test", ags_functional_test_util_do_run_thread, is_available); driver_funcs.prepare = ags_functional_test_util_driver_prepare; driver_funcs.check = ags_functional_test_util_driver_check; driver_funcs.dispatch = ags_functional_test_util_driver_dispatch; driver_funcs.finalize = NULL; driver_source = g_source_new(&driver_funcs, sizeof(GSource)); g_source_attach(driver_source, g_main_context_default()); ags_application_context_prepare(application_context); } void ags_functional_test_util_clear_application_context() { ags_application_context = NULL; // ags_mutex_manager = NULL; // ags_ladspa_manager = NULL; // ags_dssi_manager = NULL; // ags_lv2_manager = NULL; // ags_lv2ui_manager = NULL; } void ags_functional_test_util_setup_and_launch() { gchar *start_arg[] = { "./gsequencer\0" }; gboolean success; ags_functional_test_util_clear_application_context(); ags_test_setup(1, start_arg); /* get gui thread */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(ags_application_context)); /* launch application */ ags_test_launch(FALSE); /* do the work */ while(g_atomic_int_get(&(AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->gui_ready)) == 0){ usleep(500000); } usleep(10000000); } void ags_functional_test_util_setup_and_launch_filename(gchar *filename) { gchar *start_arg[] = { "./gsequencer\0", "--filename\0", filename, }; gboolean success; ags_functional_test_util_clear_application_context(); ags_test_setup(3, start_arg); /* get gui thread */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(ags_application_context)); /* launch application */ ags_test_launch_filename(filename); /* do the work */ while(!ags_ui_provider_get_show_animation(AGS_UI_PROVIDER(ags_application_context))){ usleep(500000); } usleep(10000000); } void ags_functional_test_util_reaction_time() { usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME); } void ags_functional_test_util_reaction_time_long() { usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG); } void ags_functional_test_util_idle() { usleep(5000000); } void ags_functional_test_util_idle_condition_and_timeout(AgsFunctionalTestUtilIdleCondition idle_condition, struct timespec *timeout, gpointer data) { struct timespec start_time, current_time; clock_gettime(CLOCK_MONOTONIC, &start_time); while(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(idle_condition)(data)){ ags_functional_test_util_reaction_time(); clock_gettime(CLOCK_MONOTONIC, ¤t_time); if(start_time.tv_sec + timeout->tv_sec < current_time.tv_sec){ break; } } ags_functional_test_util_reaction_time(); } gboolean ags_functional_test_util_idle_test_widget_visible(GtkWidget **widget) { gboolean do_idle; do_idle = TRUE; ags_test_enter(); if(*widget != NULL && GTK_IS_WIDGET(*widget) && gtk_widget_is_visible(*widget)){ do_idle = FALSE; } ags_test_leave(); return(do_idle); } gboolean ags_functional_test_util_idle_test_widget_hidden(GtkWidget **widget) { gboolean do_idle; do_idle = TRUE; ags_test_enter(); if(*widget != NULL && GTK_IS_WIDGET(*widget) && !gtk_widget_is_visible(*widget)){ do_idle = FALSE; } ags_test_leave(); return(do_idle); } gboolean ags_functional_test_util_idle_test_widget_realized(GtkWidget **widget) { gboolean do_idle; do_idle = TRUE; ags_test_enter(); if(*widget != NULL && GTK_IS_WIDGET(*widget) && gtk_widget_get_realized(*widget)){ do_idle = FALSE; } ags_test_leave(); return(do_idle); } gboolean ags_functional_test_util_idle_test_null(GtkWidget **widget) { gboolean do_idle; do_idle = TRUE; ags_test_enter(); if(*widget == NULL){ do_idle = FALSE; } ags_test_leave(); return(do_idle); } gboolean ags_functional_test_util_idle_test_container_children_count(AgsFunctionalTestUtilContainerTest *container_test) { gboolean do_idle; do_idle = TRUE; ags_test_enter(); if(*(container_test->container) != NULL && GTK_IS_CONTAINER(*(container_test->container))){ GList *list; list = gtk_container_get_children(*(container_test->container)); if(g_list_length(list) == container_test->count){ do_idle = FALSE; } g_list_free(list); } ags_test_leave(); return(do_idle); } void ags_functional_test_util_leave(GtkWidget *window) { if(!GTK_IS_WINDOW(window)){ return; } ags_test_enter(); gdk_window_destroy(gtk_widget_get_window(window)); ags_test_leave(); ags_functional_test_util_reaction_time_long(); } void ags_functional_test_util_fake_mouse_warp(gpointer display, guint screen, guint x, guint y) { static const gulong delay = 1; XTestFakeMotionEvent((Display *) display, screen, x, y, delay); XSync((Display *) display, 0); } void ags_functional_test_util_fake_mouse_button_press(gpointer display, guint button) { static const gulong delay = 1; XTestFakeButtonEvent((Display *) display, button, 1, delay); XFlush((Display *) display); } void ags_functional_test_util_fake_mouse_button_release(gpointer display, guint button) { static const gulong delay = 1; XTestFakeButtonEvent((Display *) display, button, 0, delay); XFlush((Display *) display); } void ags_functional_test_util_fake_mouse_button_click(gpointer display, guint button) { static const gulong delay = 1; XTestFakeButtonEvent((Display *) display, button, 1, delay); XTestFakeButtonEvent((Display *) display, button, 0, delay); XFlush((Display *) display); } GtkMenu* ags_functional_test_util_submenu_find(GtkMenu *menu, gchar *item_label) { GtkMenu *submenu; GList *list_start, *list; gchar *str; if(!GTK_IS_MENU(menu) || item_label == NULL){ return(NULL); } ags_test_enter(); list = list_start = gtk_container_get_children(menu); submenu = NULL; while(list != NULL){ if(GTK_IS_MENU_ITEM(list->data)){ str = NULL; g_object_get(list->data, "label", &str, NULL); if(!g_ascii_strcasecmp(str, item_label)){ g_object_get(list->data, "submenu", &submenu, NULL); break; } } list = list->next; } g_list_free(list_start); ags_test_leave(); return(submenu); } gboolean ags_functional_test_util_menu_bar_click(gchar *item_label) { AgsXorgApplicationContext *xorg_application_context; GtkMenuBar *menu_bar; GList *list_start, *list; gchar *str; gboolean success; if(item_label == NULL){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); menu_bar = AGS_WINDOW(xorg_application_context->window)->menu_bar; list = list_start = gtk_container_get_children(menu_bar); success = FALSE; ags_test_leave(); while(list != NULL){ if(GTK_IS_MENU_ITEM(list->data)){ str = NULL; g_object_get(list->data, "label", &str, NULL); if(!g_ascii_strcasecmp(str, item_label)){ GtkWidget *widget; GtkAllocation allocation; GdkWindow *window; GdkEvent *event_motion; Display *x_display; struct timespec spec; gint x, y; gint origin_x, origin_y; gint position_x, position_y; widget = GTK_WIDGET(list->data); if(!gtk_widget_get_realized(widget)){ ags_functional_test_util_reaction_time_long(); } /* */ ags_test_enter(); gtk_widget_get_allocation(widget, &allocation); x = allocation.x; y = allocation.y; position_x = allocation.width / 2.0; position_y = allocation.height / 2.0; window = gtk_widget_get_window(widget); gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); ags_test_leave(); /* warp and click */ ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x + position_x, origin_y + y + position_y); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_click(x_display, 1); ags_functional_test_util_reaction_time(); /* */ #if 0 ags_test_enter(); g_signal_emit_by_name(widget, "activate-item"); ags_test_leave(); #endif success = TRUE; break; } } list = list->next; } g_list_free(list_start); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_menu_click(GtkMenu *menu, gchar *item_label) { GList *list_start, *list; gchar *str; gboolean success; if(menu == NULL || item_label == NULL || !GTK_IS_MENU(menu)){ return(FALSE); } ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_realized), &ags_functional_test_util_default_timeout, &menu); ags_test_enter(); list = list_start = gtk_container_get_children(menu); success = FALSE; ags_test_leave(); while(list != NULL){ if(GTK_IS_MENU_ITEM(list->data)){ str = NULL; g_object_get(list->data, "label", &str, NULL); if(!g_ascii_strcasecmp(str, item_label)){ GtkWidget *widget; GtkAllocation allocation; GdkWindow *window; Display *x_display; gint x, y; gint origin_x, origin_y; gint position_x, position_y; gboolean is_realized; widget = GTK_WIDGET(list->data); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_realized), &ags_functional_test_util_default_timeout, &widget); /* */ ags_test_enter(); is_realized = gtk_widget_get_realized(widget); ags_test_leave(); if(is_realized){ ags_test_enter(); window = gtk_widget_get_window(widget); gtk_widget_get_allocation(widget, &allocation); x = allocation.x; y = allocation.y; position_x = allocation.width / 2.0; position_y = allocation.height / 2.0; gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); ags_test_leave(); /* warp and click */ ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x + position_x, origin_y + y + position_y); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_click(x_display, 1); ags_functional_test_util_reaction_time(); } success = TRUE; /* */ #if 0 ags_test_enter(); g_signal_emit_by_name(widget, "activate-item"); ags_test_leave(); #endif break; } } list = list->next; } g_list_free(list_start); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_combo_box_click(GtkComboBox *combo_box, guint nth) { GtkWidget *widget; GtkAllocation allocation; GdkWindow *window; Display *x_display; gint x, y; gint origin_x, origin_y; gint position_x, position_y; if(combo_box == NULL || !GTK_IS_COMBO_BOX(combo_box)){ return(FALSE); } widget = combo_box; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_realized), &ags_functional_test_util_default_timeout, &widget); /* */ ags_test_enter(); window = gtk_widget_get_window(widget); gtk_widget_get_allocation(widget, &allocation); x = allocation.x; y = allocation.y; position_x = allocation.width / 2.0; position_y = allocation.height / 2.0; gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); ags_test_leave(); ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x + position_x, origin_y + y + position_y); ags_functional_test_util_reaction_time(); /* ags_functional_test_util_reaction_time(); gdk_test_simulate_button(window, x + 5, y + 5, 1, GDK_BUTTON1_MASK, GDK_BUTTON_PRESS); ags_functional_test_util_reaction_time(); gdk_test_simulate_button(window, x + 5, y + 5, 1, GDK_BUTTON1_MASK, GDK_BUTTON_RELEASE); ags_functional_test_util_reaction_time(); */ /* */ ags_test_enter(); gtk_combo_box_set_active(combo_box, nth); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_button_click(GtkButton *button) { GtkWidget *widget; GtkAllocation allocation; GdkWindow *window; Display *x_display; gint x, y; gint origin_x, origin_y; gint position_x, position_y; gboolean is_realized; if(button == NULL || !GTK_IS_BUTTON(button)){ return(FALSE); } widget = button; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_realized), &ags_functional_test_util_default_timeout, &widget); /* */ ags_test_enter(); window = gtk_widget_get_window(widget); gtk_widget_get_allocation(widget, &allocation); x = allocation.x; y = allocation.y; position_x = allocation.width / 2.0; position_y = allocation.height / 2.0; gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); ags_test_leave(); /* warp and click */ ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x + position_x, origin_y + y + position_y); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_click(x_display, 1); ags_functional_test_util_reaction_time(); /* */ #if 0 ags_test_enter(); g_signal_emit_by_name(widget, "clicked"); ags_test_leave(); #endif ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_tool_button_click(GtkToolButton *tool_button) { GtkWidget *widget; GtkAllocation allocation; GdkWindow *window; Display *x_display; gint x, y; gint origin_x, origin_y; gint position_x, position_y; gboolean is_realized; if(tool_button == NULL || !GTK_IS_TOOL_BUTTON(tool_button)){ return(FALSE); } widget = tool_button; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_realized), &ags_functional_test_util_default_timeout, &widget); /* */ ags_test_enter(); window = gtk_widget_get_window(widget); gtk_widget_get_allocation(widget, &allocation); x = allocation.x; y = allocation.y; position_x = allocation.width / 2.0; position_y = allocation.height / 2.0; gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); ags_test_leave(); /* warp and click */ ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x + position_x, origin_y + y + position_y); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_click(x_display, 1); ags_functional_test_util_reaction_time(); /* */ #if 0 ags_test_enter(); g_signal_emit_by_name(widget, "clicked"); ags_test_leave(); #endif ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_menu_tool_button_click(GtkButton *button) { GtkWidget *widget; GtkWidget *arrow_box; GtkWidget *arrow_button; GtkAllocation allocation; GdkWindow *window; Display *x_display; gint x, y; gint origin_x, origin_y; gint position_x, position_y; if(button == NULL || !GTK_IS_MENU_TOOL_BUTTON(button)){ return(FALSE); } ags_test_enter(); arrow_box = gtk_container_get_children(gtk_bin_get_child(button))->next->data; arrow_button = gtk_container_get_children(arrow_box)->data; ags_test_leave(); widget = arrow_button; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_realized), &ags_functional_test_util_default_timeout, &widget); ags_test_enter(); window = gtk_widget_get_window(widget); gtk_widget_get_allocation(widget, &allocation); x = allocation.x; y = allocation.y; position_x = allocation.width / 2.0; position_y = allocation.height / 2.0; gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); ags_test_leave(); /* warp and click */ ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x + position_x, origin_y + y + position_y); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_click(x_display, 1); ags_functional_test_util_reaction_time(); /* */ #if 0 ags_test_enter(); if(!gtk_widget_get_realized(widget)){ /* */ g_signal_emit_by_name(widget, "clicked"); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); /* */ ags_test_enter(); gtk_menu_popup(gtk_menu_tool_button_get_menu(button), NULL, NULL, NULL, widget, 1, gtk_get_current_event_time()); ags_test_leave(); #endif ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_dialog_apply(GtkDialog *dialog) { if(!GTK_IS_DIALOG(dialog)){ return(FALSE); } ags_test_enter(); gtk_dialog_response(dialog, GTK_RESPONSE_APPLY); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_dialog_ok(GtkDialog *dialog) { GtkButton *ok_button; GList *list_start, *list; gboolean success; if(!GTK_IS_DIALOG(dialog)){ return(FALSE); } ags_test_enter(); ok_button = NULL; list_start = list = gtk_container_get_children(gtk_dialog_get_action_area(dialog)); while(list != NULL){ if(!g_strcmp0(GTK_STOCK_OK, gtk_button_get_label(list->data))){ ok_button = list->data; break; } list = list->next; } ags_test_leave(); g_list_free(list_start); if(ok_button == NULL){ return(FALSE); } success = ags_functional_test_util_button_click(ok_button); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_dialog_cancel(GtkDialog *dialog) { GtkButton *cancel_button; GList *list_start, *list; gboolean success; if(!GTK_IS_DIALOG(dialog)){ return(FALSE); } ags_test_enter(); cancel_button = NULL; list_start = list = gtk_container_get_children(gtk_dialog_get_action_area(dialog)); while(list != NULL){ if(!g_strcmp0(GTK_STOCK_CANCEL, gtk_button_get_label(list->data))){ cancel_button = list->data; break; } list = list->next; } ags_test_leave(); g_list_free(list_start); if(cancel_button == NULL){ return(FALSE); } success = ags_functional_test_util_button_click(cancel_button); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_file_chooser_open_path(GtkFileChooser *file_chooser, gchar *path) { if(file_chooser == NULL || path == NULL || !GTK_IS_FILE_CHOOSER(file_chooser)){ return(FALSE); } ags_test_enter(); gtk_file_chooser_set_current_folder(file_chooser, path); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_chooser_select_filename(GtkFileChooser *file_chooser, gchar *filename) { if(file_chooser == NULL || filename == NULL || !GTK_IS_FILE_CHOOSER(file_chooser)){ return(FALSE); } ags_test_enter(); gtk_file_chooser_select_filename(file_chooser, filename); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_chooser_select_filenames(GtkFileChooser *file_chooser, GSList *filename) { if(file_chooser == NULL || filename == NULL || !GTK_IS_FILE_CHOOSER(file_chooser)){ return(FALSE); } ags_test_enter(); while(filename != NULL){ gtk_file_chooser_select_filename(file_chooser, filename->data); filename = filename->next; } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_chooser_select_all(GtkFileChooser *file_chooser) { if(file_chooser == NULL || !GTK_IS_FILE_CHOOSER(file_chooser)){ return(FALSE); } ags_test_enter(); gtk_file_chooser_select_all(file_chooser); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_default_window_resize() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); gdk_window_move_resize(gtk_widget_get_window(window), 64, 0, 1920 - 128, 1080 - 64); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_default_editor_resize() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; GtkPaned *main_paned; GtkPaned *editor_paned; GdkRectangle allocation; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; main_paned = window->paned; editor_paned = notation_editor->paned; gtk_paned_set_position(main_paned, (1080 - 64) * (2.0 / 3.0)); gtk_paned_set_position(editor_paned, (1920 - 128) / 6); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_default_automation_window_resize() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); gdk_window_move_resize(gtk_widget_get_window(window->automation_window), 64, 0, 1920 - 128, 1080 - 64); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_file_default_automation_editor_resize() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; GtkPaned *editor_paned; GdkRectangle allocation; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; editor_paned = automation_editor->paned; ags_test_leave(); /* resize */ ags_test_enter(); gtk_paned_set_position(editor_paned, (1920 - 128) / 6); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_open() { AgsXorgApplicationContext *xorg_application_context; GtkMenu *menu; gboolean success; if(!ags_functional_test_util_menu_bar_click("_File")){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); menu = AGS_WINDOW(xorg_application_context->window)->menu_bar->file; success = ags_functional_test_util_menu_click(menu, "open"); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_save() { AgsXorgApplicationContext *xorg_application_context; GtkMenu *menu; gboolean success; if(!ags_functional_test_util_menu_bar_click("_File")){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); menu = AGS_WINDOW(xorg_application_context->window)->menu_bar->file; success = ags_functional_test_util_menu_click(menu, "save"); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_save_as() { AgsXorgApplicationContext *xorg_application_context; GtkMenu *menu; gboolean success; if(!ags_functional_test_util_menu_bar_click("_File")){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); menu = AGS_WINDOW(xorg_application_context->window)->menu_bar->file; success = ags_functional_test_util_menu_click(menu, "save as"); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_export_open() { AgsXorgApplicationContext *xorg_application_context; GtkWidget *export_window; GtkMenu *menu; gboolean success; if(!ags_functional_test_util_menu_bar_click("_File")){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); menu = AGS_WINDOW(xorg_application_context->window)->menu_bar->file; export_window = AGS_WINDOW(xorg_application_context->window)->export_window; ags_test_leave(); success = ags_functional_test_util_menu_click(menu, "export"); ags_functional_test_util_reaction_time_long(); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible), &ags_functional_test_util_default_timeout, &export_window); return(success); } gboolean ags_functional_test_util_export_close() { AgsXorgApplicationContext *xorg_application_context; GtkWidget *export_window; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; ags_test_leave(); success = ags_functional_test_util_dialog_close(export_window); ags_functional_test_util_reaction_time_long(); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_hidden), &ags_functional_test_util_default_timeout, &export_window); return(success); } gboolean ags_functional_test_util_export_add() { AgsXorgApplicationContext *xorg_application_context; AgsExportWindow *export_window; GtkButton *add_button; AgsFunctionalTestUtilContainerTest container_test; GList *list_start; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; add_button = export_window->add; container_test.container = &(export_window->export_soundcard); list_start = gtk_container_get_children(export_window->export_soundcard); container_test.count = g_list_length(list_start) + 1; ags_test_leave(); g_list_free(list_start); success = ags_functional_test_util_button_click(add_button); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), &ags_functional_test_util_default_timeout, &container_test); return(success); } gboolean ags_functional_test_util_export_tact(gdouble tact) { AgsXorgApplicationContext *xorg_application_context; AgsExportWindow *export_window; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; gtk_spin_button_set_value(export_window->tact, tact); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_export_remove(guint nth) { AgsXorgApplicationContext *xorg_application_context; AgsExportWindow *export_window; GtkButton *remove_button; AgsFunctionalTestUtilContainerTest container_test; GList *list_start, *list; guint i; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; container_test.container = &(export_window->export_soundcard); list_start = gtk_container_get_children(export_window->export_soundcard); success = FALSE; if(list_start != NULL){ remove_button = NULL; list = list_start; container_test.count = g_list_length(list_start) - 1; for(i = 0; list != NULL; i++){ if(i == nth){ GtkHBox *hbox; GList *tmp_start; hbox = GTK_HBOX(list->data); tmp_start = gtk_container_get_children(hbox); remove_button = gtk_bin_get_child(tmp_start->next->data); g_list_free(tmp_start); success = TRUE; break; } list = list->next; } g_list_free(list_start); ags_test_leave(); g_list_free(list); if(!success){ return(FALSE); } success = ags_functional_test_util_button_click(remove_button); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), &ags_functional_test_util_default_timeout, &container_test); } return(success); } gboolean ags_functional_test_util_export_set_backend(guint nth, gchar *backend) { AgsXorgApplicationContext *xorg_application_context; AgsExportWindow *export_window; GList *list_start, *list; guint i; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; list_start = list = gtk_container_get_children(export_window->export_soundcard); success = FALSE; for(i = 0; list != NULL; i++){ if(i == nth){ AgsExportSoundcard *export_soundcard; GtkHBox *hbox; GtkTreeModel *model; GtkTreeIter iter; GList *tmp_start; gchar *value; guint active; hbox = GTK_HBOX(list->data); tmp_start = gtk_container_get_children(hbox); export_soundcard = AGS_EXPORT_SOUNDCARD(tmp_start->data); g_list_free(tmp_start); model = gtk_combo_box_get_model(GTK_COMBO_BOX(export_soundcard->backend)); active = 0; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(backend, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) export_soundcard->backend, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } break; } list = list->next; } g_list_free(list_start); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_export_set_device(guint nth, gchar *device) { AgsXorgApplicationContext *xorg_application_context; AgsExportWindow *export_window; GList *list_start, *list; guint i; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; list_start = list = gtk_container_get_children(export_window->export_soundcard); success = FALSE; for(i = 0; list != NULL; i++){ if(i == nth){ AgsExportSoundcard *export_soundcard; GtkHBox *hbox; GtkTreeModel *model; GtkTreeIter iter; GList *tmp_start; gchar *value; guint active; hbox = GTK_HBOX(list->data); tmp_start = gtk_container_get_children(hbox); export_soundcard = AGS_EXPORT_SOUNDCARD(tmp_start->data); g_list_free(tmp_start); model = gtk_combo_box_get_model(GTK_COMBO_BOX(export_soundcard->card)); active = 0; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(device, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) export_soundcard->card, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } break; } list = list->next; } g_list_free(list_start); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_export_set_filename(guint nth, gchar *filename) { AgsXorgApplicationContext *xorg_application_context; AgsExportWindow *export_window; GList *list_start, *list; guint i; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); export_window = AGS_WINDOW(xorg_application_context->window)->export_window; list_start = list = gtk_container_get_children(export_window->export_soundcard); success = FALSE; for(i = 0; list != NULL; i++){ if(i == nth){ AgsExportSoundcard *export_soundcard; GtkHBox *hbox; GList *tmp_start; hbox = GTK_HBOX(list->data); tmp_start = gtk_container_get_children(hbox); export_soundcard = AGS_EXPORT_SOUNDCARD(tmp_start->data); g_list_free(tmp_start); gtk_entry_set_text(export_soundcard->filename, filename); success = TRUE; break; } list = list->next; } g_list_free(list_start); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_export_nth(guint nth) { //TODO:JK: } gboolean ags_functional_test_util_export_set_format(guint nth, gchar *format) { //TODO:JK: } gboolean ags_functional_test_util_export_do_export(guint nth, gchar *format) { //TODO:JK: } gboolean ags_functional_test_util_quit() { //TODO:JK: } gboolean ags_functional_test_util_add_machine(gchar *submenu, gchar *machine_name) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMenuBar *menu_bar; AgsMachine *machine; GtkMenu *add_menu; GList *list_start; AgsFunctionalTestUtilContainerTest container_test; gboolean success; if(machine_name == NULL){ return(FALSE); } if(!ags_functional_test_util_menu_bar_click("_Edit")){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); menu_bar = window->menu_bar; container_test.container = &(window->machines); list_start = gtk_container_get_children(window->machines); ags_test_leave(); container_test.count = g_list_length(list_start) + 1; success = FALSE; success = ags_functional_test_util_menu_click(menu_bar->edit, "Add"); if(!success){ return(FALSE); } add_menu = ags_functional_test_util_submenu_find(menu_bar->edit, "Add"); if(submenu == NULL){ success = ags_functional_test_util_menu_click(add_menu, machine_name); }else{ GtkMenu *bridge_menu; bridge_menu = ags_functional_test_util_submenu_find(add_menu, submenu); success = ags_functional_test_util_menu_click(bridge_menu, machine_name); } if(success){ ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), &ags_functional_test_util_default_timeout, &container_test); ags_functional_test_util_reaction_time_long(); ags_test_enter(); list_start = gtk_container_get_children(window->machines); machine = g_list_nth_data(list_start, container_test.count - 1); ags_test_leave(); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible), &ags_functional_test_util_default_timeout, &machine); } return(success); } gboolean ags_functional_test_util_automation_open() { //TODO:JK: } gboolean ags_functional_test_util_automation_close() { //TODO:JK: } gboolean ags_functional_test_util_preferences_open() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMenuBar *menu_bar; gboolean success; if(!ags_functional_test_util_menu_bar_click("_Edit")){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); menu_bar = window->menu_bar; ags_test_leave(); success = ags_functional_test_util_menu_click(menu_bar->edit, "Preferences"); if(!success){ return(FALSE); } ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_preferences_close() { AgsXorgApplicationContext *xorg_application_context; GtkWidget *preferences; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); success = ags_functional_test_util_dialog_close(preferences); ags_functional_test_util_reaction_time_long(); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_null), &ags_functional_test_util_default_timeout, &preferences); return(success); } gboolean ags_functional_test_util_about_open() { //TODO:JK: } gboolean ags_functional_test_util_about_close() { //TODO:JK: } gboolean ags_functional_test_util_navigation_expand() { //TODO:JK: } gboolean ags_functional_test_util_navigation_bpm(gdouble bpm) { //TODO:JK: } gboolean ags_functional_test_util_navigation_rewind() { //TODO:JK: } gboolean ags_functional_test_util_navigation_prev() { //TODO:JK: } gboolean ags_functional_test_util_navigation_play() { //TODO:JK: } gboolean ags_functional_test_util_navigation_stop() { //TODO:JK: } gboolean ags_functional_test_util_navigation_next() { //TODO:JK: } gboolean ags_functional_test_util_navigation_forward() { //TODO:JK: } gboolean ags_functional_test_util_navigation_loop() { //TODO:JK: } gboolean ags_functional_test_util_navigation_position(gdouble position) { //TODO:JK: } gboolean ags_functional_test_util_navigation_loop_left(gdouble loop_left) { //TODO:JK: } gboolean ags_functional_test_util_navigation_loop_right(gdouble loop_right) { //TODO:JK: } gboolean ags_functional_test_util_navigation_exclude_sequencers() { //TODO:JK: } gboolean ags_functional_test_util_notation_toolbar_cursor_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *position; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; position = notation_toolbar->position; ags_test_leave(); success = ags_functional_test_util_tool_button_click(position); return(success); } gboolean ags_functional_test_util_notation_toolbar_edit_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *edit; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; edit = notation_toolbar->edit; ags_test_leave(); success = ags_functional_test_util_tool_button_click(edit); return(success); } gboolean ags_functional_test_util_notation_toolbar_delete_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *clear; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; clear = notation_toolbar->clear; ags_test_leave(); success = ags_functional_test_util_tool_button_click(clear); return(success); } gboolean ags_functional_test_util_notation_toolbar_select_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *select; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; select = notation_toolbar->select; ags_test_leave(); success = ags_functional_test_util_tool_button_click(select); return(success); } gboolean ags_functional_test_util_notation_toolbar_invert_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *invert; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; invert = notation_toolbar->invert; ags_test_leave(); success = ags_functional_test_util_tool_button_click(invert); return(success); } gboolean ags_functional_test_util_notation_toolbar_paste_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *paste; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; paste = notation_toolbar->paste_tool; ags_test_leave(); success = ags_functional_test_util_tool_button_click(paste); return(success); } gboolean ags_functional_test_util_notation_toolbar_copy_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *copy; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; copy = notation_toolbar->copy; ags_test_leave(); success = ags_functional_test_util_tool_button_click(copy); return(success); } gboolean ags_functional_test_util_notation_toolbar_cut_click() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkToolButton *cut; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; cut = notation_toolbar->cut; ags_test_leave(); success = ags_functional_test_util_tool_button_click(cut); return(success); } gboolean ags_functional_test_util_notation_toolbar_zoom(guint nth_zoom) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkComboBox *zoom; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; notation_toolbar = notation_editor->notation_toolbar; zoom = notation_toolbar->zoom; ags_test_leave(); success = ags_functional_test_util_combo_box_click(zoom, nth_zoom); return(success); } gboolean ags_functional_test_util_machine_selector_select(gchar *editor_type, guint nth_index) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachineSelector *machine_selector; AgsMachineRadioButton *machine_radio_button; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); machine_selector = NULL; if(!g_strcmp0(editor_type, "AgsNotationEditor")){ AgsNotationEditor *notation_editor; notation_editor = window->notation_editor; machine_selector = notation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsAutomationEditor")){ AgsAutomationEditor *automation_editor; automation_editor = window->automation_window->automation_editor; machine_selector = automation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsWaveEditor")){ AgsWaveEditor *wave_editor; wave_editor = window->wave_window->wave_editor; machine_selector = wave_editor->machine_selector; } list_start = gtk_container_get_children(machine_selector); ags_test_leave(); list = g_list_nth(list_start, nth_index + 1); if(list == NULL){ return(FALSE); } machine_radio_button = list->data; g_list_free(list_start); success = ags_functional_test_util_button_click(machine_radio_button); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_selection_select(gchar *editor_type, gchar *machine) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkRadioButton *radio_button; GList *list_start, *list; gboolean success; if(machine == NULL){ return(FALSE); } ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); machine_selector = NULL; if(!g_strcmp0(editor_type, "AgsNotationEditor")){ AgsNotationEditor *notation_editor; notation_editor = window->notation_editor; machine_selector = notation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsAutomationEditor")){ AgsAutomationEditor *automation_editor; automation_editor = window->automation_window->automation_editor; machine_selector = automation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsWaveEditor")){ AgsWaveEditor *wave_editor; wave_editor = window->wave_window->wave_editor; machine_selector = wave_editor->machine_selector; } machine_selection = machine_selector->machine_selection; list = list_start = gtk_container_get_children(gtk_dialog_get_content_area(GTK_DIALOG(machine_selection))); success = FALSE; while(list != NULL){ if(GTK_IS_RADIO_BUTTON(list->data)){ gchar *str; str = gtk_button_get_label(GTK_BUTTON(list->data)); if(!g_ascii_strcasecmp(machine, str)){ radio_button = list->data; success = TRUE; break; } } list = list->next; } ags_test_leave(); g_list_free(list_start); if(!success){ return(FALSE); } success = ags_functional_test_util_button_click(radio_button); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_selection_remove_index(gchar *editor_type) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachineSelector *machine_selector; GtkButton *menu_tool_button; GtkMenu *popup; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); machine_selector = NULL; if(!g_strcmp0(editor_type, "AgsNotationEditor")){ AgsNotationEditor *notation_editor; notation_editor = window->notation_editor; machine_selector = notation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsAutomationEditor")){ AgsAutomationEditor *automation_editor; automation_editor = window->automation_window->automation_editor; machine_selector = automation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsWaveEditor")){ AgsWaveEditor *wave_editor; wave_editor = window->wave_window->wave_editor; machine_selector = wave_editor->machine_selector; } menu_tool_button = machine_selector->menu_button; popup = machine_selector->popup; ags_test_leave(); success = ags_functional_test_util_menu_tool_button_click(menu_tool_button); if(!success){ return(FALSE); } ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "remove index"); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_selection_add_index(gchar *editor_type) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachineSelector *machine_selector; GtkButton *menu_tool_button; GtkMenu *popup; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); machine_selector = NULL; if(!g_strcmp0(editor_type, "AgsNotationEditor")){ AgsNotationEditor *notation_editor; notation_editor = window->notation_editor; machine_selector = notation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsAutomationEditor")){ AgsAutomationEditor *automation_editor; automation_editor = window->automation_window->automation_editor; machine_selector = automation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsWaveEditor")){ AgsWaveEditor *wave_editor; wave_editor = window->wave_window->wave_editor; machine_selector = wave_editor->machine_selector; } menu_tool_button = machine_selector->menu_button; popup = machine_selector->popup; ags_test_leave(); success = ags_functional_test_util_menu_tool_button_click(menu_tool_button); if(!success){ return(FALSE); } ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "add index"); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_selection_link_index(gchar *editor_type) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachineSelector *machine_selector; GtkButton *menu_tool_button; GtkMenu *popup; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); machine_selector = NULL; if(!g_strcmp0(editor_type, "AgsNotationEditor")){ AgsNotationEditor *notation_editor; notation_editor = window->notation_editor; machine_selector = notation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsAutomationEditor")){ AgsAutomationEditor *automation_editor; automation_editor = window->automation_window->automation_editor; machine_selector = automation_editor->machine_selector; }else if(!g_strcmp0(editor_type, "AgsWaveEditor")){ AgsWaveEditor *wave_editor; wave_editor = window->wave_window->wave_editor; machine_selector = wave_editor->machine_selector; } menu_tool_button = machine_selector->menu_button; popup = machine_selector->popup; ags_test_leave(); success = ags_functional_test_util_menu_tool_button_click(menu_tool_button); if(!success){ return(FALSE); } ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "link index"); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_selection_reverse_mapping() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachineSelector *machine_selector; GtkButton *menu_tool_button; GtkMenu *popup; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); notation_editor = window->notation_editor; machine_selector = notation_editor->machine_selector; menu_tool_button = machine_selector->menu_button; popup = machine_selector->popup; ags_test_leave(); success = ags_functional_test_util_menu_tool_button_click(menu_tool_button); if(!success){ return(FALSE); } ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "reverse mapping"); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_selection_shift_piano(guint nth_shift) { //TODO:JK: } gboolean ags_functional_test_util_notation_edit_delete_point(guint x, guint y) { //TODO:JK: } gboolean ags_functional_test_util_notation_edit_add_point(guint x0, guint x1, guint y) { AgsXorgApplicationContext *xorg_application_context; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; AgsNotationEdit *notation_edit; GtkWidget *widget; GtkScrollbar *hscrollbar; GtkScrollbar *vscrollbar; GtkAdjustment *adjustment; GtkAllocation allocation; GdkWindow *window; Display *x_display; gdouble zoom; guint history; guint width, height; guint control_count; guint origin_x, origin_y; guint widget_x, widget_y; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); notation_editor = AGS_WINDOW(xorg_application_context->window)->notation_editor; notation_toolbar = notation_editor->notation_toolbar; if(notation_editor->selected_machine == NULL){ ags_test_leave(); return(FALSE); } notation_edit = notation_editor->notation_edit; widget = notation_edit->drawing_area; history = gtk_combo_box_get_active(GTK_COMBO_BOX(notation_toolbar->zoom)); zoom = exp2((double) history - 2.0); ags_test_leave(); /* */ ags_test_enter(); hscrollbar = notation_edit->hscrollbar; vscrollbar = notation_edit->vscrollbar; window = gtk_widget_get_window(widget); gtk_widget_get_allocation(widget, &allocation); widget_x = allocation.x; widget_y = allocation.y; width = allocation.width; height = allocation.height; gdk_window_get_origin(window, &origin_x, &origin_y); x_display = GDK_SCREEN_XDISPLAY(gdk_window_get_screen(window)); /* make visible */ adjustment = gtk_range_get_adjustment(GTK_RANGE(hscrollbar)); if((x0 * notation_edit->control_width) / zoom > gtk_adjustment_get_value(adjustment) + width - ((x1 - x0) * notation_edit->control_width) / zoom){ gtk_adjustment_set_value(adjustment, x0 * notation_edit->control_width / zoom); ags_functional_test_util_reaction_time_long(); }else if((x0 * notation_edit->control_width) / zoom < gtk_adjustment_get_value(adjustment)){ gtk_adjustment_set_value(adjustment, x0 * notation_edit->control_width / zoom); ags_functional_test_util_reaction_time_long(); } x0 = (x0 * notation_edit->control_width) / zoom - (gtk_adjustment_get_value(adjustment)); x1 = (x1 * notation_edit->control_width) / zoom - (gtk_adjustment_get_value(adjustment)); adjustment = gtk_range_get_adjustment(GTK_RANGE(vscrollbar)); if((y * notation_edit->control_height) > gtk_adjustment_get_value(adjustment) + height){ gtk_adjustment_set_value(adjustment, (y * notation_edit->control_height)); ags_functional_test_util_reaction_time_long(); }else if((y * notation_edit->control_height) < gtk_adjustment_get_value(adjustment)){ gtk_adjustment_set_value(adjustment, (y * notation_edit->control_height)); ags_functional_test_util_reaction_time_long(); } y = (y * notation_edit->control_height) - (gtk_adjustment_get_value(adjustment)); ags_test_leave(); /* */ ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x0 + 8, origin_y + y + 7); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_press(x_display, 1); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_warp(x_display, 0, origin_x + x1 + 8, origin_y + y + 7); ags_functional_test_util_reaction_time(); ags_functional_test_util_fake_mouse_button_release(x_display, 1); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_notation_edit_select_region(guint x0, guint x1, guint y0, guint y1) { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_cursor_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_edit_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_delete_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_select_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_paste_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_copy_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_cut_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_toolbar_zoom(guint nth_zoom) { //TODO:JK: } gboolean ags_functional_test_util_automation_edit_audio_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_edit_output_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_edit_input_click() { //TODO:JK: } gboolean ags_functional_test_util_automation_edit_delete_point(guint nth_index, guint x, guint y) { //TODO:JK: } gboolean ags_functional_test_util_automation_edit_add_point(guint nth_index, guint x, guint y) { //TODO:JK: } gboolean ags_functional_test_util_automation_edit_select_region(guint nth_index, guint x0, guint x1, guint y0, guint y1) { //TODO:JK: } gboolean ags_functional_test_util_preferences_click_tab(guint nth_tab) { AgsXorgApplicationContext *xorg_application_context; AgsPreferences *preferences; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); if(preferences == NULL){ return(FALSE); } /* click tab */ ags_test_enter(); gtk_notebook_set_current_page(preferences->notebook, nth_tab); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_audio_preferences_buffer_size(guint nth_backend, guint buffer_size) { AgsXorgApplicationContext *xorg_application_context; AgsPreferences *preferences; AgsSoundcardEditor *soundcard_editor; GList *start_list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); if(preferences == NULL){ return(FALSE); } success = ags_functional_test_util_preferences_click_tab(1); if(!success){ return(FALSE); } ags_test_enter(); start_list = gtk_container_get_children(preferences->audio_preferences->soundcard_editor); soundcard_editor = g_list_nth_data(start_list, nth_backend); ags_test_leave(); g_list_free(start_list); if(soundcard_editor == NULL){ return(FALSE); } ags_test_enter(); gtk_spin_button_set_value(soundcard_editor->buffer_size, (gdouble) buffer_size); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_audio_preferences_samplerate(guint nth_backend, guint samplerate) { AgsXorgApplicationContext *xorg_application_context; AgsPreferences *preferences; AgsSoundcardEditor *soundcard_editor; GList *start_list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); if(preferences == NULL){ return(FALSE); } success = ags_functional_test_util_preferences_click_tab(1); if(!success){ return(FALSE); } ags_test_enter(); start_list = gtk_container_get_children(preferences->audio_preferences->soundcard_editor); soundcard_editor = g_list_nth_data(start_list, nth_backend); ags_test_leave(); g_list_free(start_list); if(soundcard_editor == NULL){ return(FALSE); } ags_test_enter(); gtk_spin_button_set_value(soundcard_editor->samplerate, (gdouble) samplerate); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_move_up(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_machine_move_down(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_machine_hide(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; GtkMenu *popup; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); ags_test_enter(); popup = machine->popup; ags_test_leave(); /* activate hide */ success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button); if(!success){ return(FALSE); } ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "hide"); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_show(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; GtkMenu *popup; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); ags_test_enter(); popup = machine->popup; ags_test_leave(); /* activate show */ success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button); ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "show"); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_destroy(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachine *machine; GtkMenu *popup; GList *list_start, *list; AgsFunctionalTestUtilContainerTest container_test; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); /* retrieve machine */ container_test.container = &(window->machines); list_start = gtk_container_get_children(window->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } container_test.count = g_list_length(list_start) - 1; g_list_free(list_start); ags_test_enter(); popup = machine->popup; ags_test_leave(); /* activate destroy */ success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button); ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(popup, "destroy"); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), &ags_functional_test_util_default_timeout, &container_test); return(success); } gboolean ags_functional_test_util_machine_rename_open(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_machine_rename_close(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_machine_rename_set_name(guint nth_machine, gchar *name) { //TODO:JK: } GtkWidget* ags_functional_test_util_get_line_editor(GtkWidget *machine_editor, guint nth_pad, guint nth_audio_channel, gboolean is_output) { AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; GList *list_start, *list; if(machine_editor == NULL){ return(NULL); } ags_test_enter(); if(is_output){ listing_editor = AGS_LISTING_EDITOR(AGS_MACHINE_EDITOR(machine_editor)->output_editor); }else{ listing_editor = AGS_LISTING_EDITOR(AGS_MACHINE_EDITOR(machine_editor)->input_editor); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, nth_pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); return(NULL); } /* line editor */ list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, nth_audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); return(NULL); } ags_test_leave(); return(line_editor); } gboolean ags_functional_test_util_machine_properties_open(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsMachine *machine; GtkWidget **properties; GtkMenuToolButton *menu_tool_button; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); window = AGS_WINDOW(xorg_application_context->window); /* retrieve machine */ list_start = gtk_container_get_children(window->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* activate destroy */ ags_test_enter(); properties = &(machine->properties); menu_tool_button = machine->menu_tool_button; ags_test_leave(); success = ags_functional_test_util_menu_tool_button_click(menu_tool_button); ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_menu_click(machine->popup, "properties"); ags_functional_test_util_reaction_time_long(); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible), &ags_functional_test_util_default_timeout, properties); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_click_tab(guint nth_machine, guint nth_tab) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* click tab */ ags_test_enter(); machine_editor = machine->properties; gtk_notebook_set_current_page(machine_editor->notebook, nth_tab); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_properties_click_enable(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; GtkButton *enable_button; GList *list_start, *list; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ enable_button = NULL; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* click tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { enable_button = AGS_PROPERTY_EDITOR(machine_editor->output_editor)->enabled; } break; case 1: { enable_button = AGS_PROPERTY_EDITOR(machine_editor->input_editor)->enabled; } break; case 2: { enable_button = AGS_PROPERTY_EDITOR(machine_editor->output_link_editor)->enabled; } break; case 3: { enable_button = AGS_PROPERTY_EDITOR(machine_editor->input_link_editor)->enabled; } break; case 4: { enable_button = AGS_PROPERTY_EDITOR(machine_editor->resize_editor)->enabled; } break; } ags_test_leave(); success = ags_functional_test_util_button_click(enable_button); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_link_set(guint nth_machine, guint pad, guint audio_channel, gchar *link_name, guint link_nth_line) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLinkEditor *link_editor; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* set link */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* expander */ gtk_expander_set_expanded(pad_editor->line_editor_expander, TRUE); ags_test_leave(); ags_functional_test_util_reaction_time_long(); /* line editor */ ags_test_enter(); list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* link editor */ link_editor = line_editor->link_editor; /* set link */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(link_editor->combo)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(link_name, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) link_editor->combo, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); if(!success){ return(FALSE); } /* set link line */ ags_test_enter(); success = TRUE; gtk_spin_button_set_value(link_editor->spin_button, link_nth_line); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_link_open(guint nth_machine, guint pad, guint audio_channel) { //TODO:JK: } gboolean ags_functional_test_util_machine_properties_effect_add(guint nth_machine, guint pad, guint audio_channel) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; GtkDialog **effect_dialog; GtkButton *add_button; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* expander */ gtk_expander_set_expanded(pad_editor->line_editor_expander, TRUE); ags_test_leave(); ags_functional_test_util_reaction_time_long(); /* line editor */ ags_test_enter(); list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; /* effect dialog and add button */ effect_dialog = &(member_editor->plugin_browser); add_button = member_editor->add; ags_test_leave(); success = ags_functional_test_util_button_click(add_button); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible), &ags_functional_test_util_default_timeout, effect_dialog); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_effect_remove(guint nth_machine, guint pad, guint audio_channel, guint nth_effect) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; GtkDialog **effect_dialog; GtkButton *check_button; GtkButton *remove_button; GtkTreeModel *model; AgsFunctionalTestUtilContainerTest container_test; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* expander */ gtk_expander_set_expanded(pad_editor->line_editor_expander, TRUE); ags_test_leave(); ags_functional_test_util_reaction_time_long(); /* line editor */ ags_test_enter(); list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; /* effect dialog and remove button */ effect_dialog = &(member_editor->plugin_browser); remove_button = member_editor->remove; /* check button */ container_test.container = &(member_editor->line_member); check_button = NULL; list_start = gtk_container_get_children(member_editor->line_member); container_test.count = g_list_length(list_start) - 1; list = g_list_nth(list_start, nth_effect); if(list != NULL){ GtkHBox *hbox; hbox = list->data; list_start = gtk_container_get_children(hbox); check_button = list_start->data; g_list_free(list_start); } ags_test_leave(); /* click check button */ success = ags_functional_test_util_button_click(check_button); /* click remove */ if(success){ ags_functional_test_util_reaction_time_long(); success = ags_functional_test_util_button_click(remove_button); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), &ags_functional_test_util_default_timeout, &container_test); ags_functional_test_util_reaction_time_long(); } return(success); } gboolean ags_functional_test_util_machine_properties_effect_plugin_type(guint nth_machine, guint pad, guint audio_channel, gchar *plugin_type) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; AgsPluginBrowser *plugin_browser; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } /* pad editor */ list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line editor */ list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; plugin_browser = member_editor->plugin_browser; /* set plugin type */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(plugin_browser->plugin_type)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(plugin_type, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) plugin_browser->plugin_type, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_ladspa_filename(guint nth_machine, guint pad, guint audio_channel, gchar *filename) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; AgsPluginBrowser *plugin_browser; AgsLadspaBrowser *ladspa_browser; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line editor */ list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; plugin_browser = member_editor->plugin_browser; ladspa_browser = plugin_browser->ladspa_browser; /* set plugin filename */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(ladspa_browser->filename)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(filename, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) ladspa_browser->filename, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_ladspa_effect(guint nth_machine, guint pad, guint audio_channel, gchar *effect) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; AgsPluginBrowser *plugin_browser; AgsLadspaBrowser *ladspa_browser; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line editor */ list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; plugin_browser = member_editor->plugin_browser; ladspa_browser = plugin_browser->ladspa_browser; /* set plugin effect */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(ladspa_browser->effect)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(effect, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) ladspa_browser->effect, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_lv2_filename(guint nth_machine, guint pad, guint audio_channel, gchar *filename) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; AgsPluginBrowser *plugin_browser; AgsLv2Browser *lv2_browser; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line editor */ list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; plugin_browser = member_editor->plugin_browser; lv2_browser = plugin_browser->lv2_browser; /* set plugin filename */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(lv2_browser->filename)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(filename, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) lv2_browser->filename, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_lv2_effect(guint nth_machine, guint pad, guint audio_channel, gchar *effect) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; AgsPadEditor *pad_editor; AgsLineEditor *line_editor; AgsLineMemberEditor *member_editor; AgsPluginBrowser *plugin_browser; AgsLv2Browser *lv2_browser; GtkTreeModel *model; GtkTreeIter iter; GList *list_start, *list; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case 0: { listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor); } break; case 1: { listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor); } break; default: ags_test_leave(); return(FALSE); } list_start = gtk_container_get_children(listing_editor->child); list = g_list_nth(list_start, pad); if(list != NULL && AGS_IS_PAD_EDITOR(list->data)){ pad_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line editor */ list_start = gtk_container_get_children(pad_editor->line_editor); list = g_list_nth(list_start, audio_channel); if(list != NULL && AGS_IS_LINE_EDITOR(list->data)){ line_editor = list->data; g_list_free(list_start); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* line member editor */ member_editor = line_editor->member_editor; plugin_browser = member_editor->plugin_browser; lv2_browser = plugin_browser->lv2_browser; /* set plugin effect */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(lv2_browser->effect)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(effect, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) lv2_browser->effect, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_bulk_add(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsPropertyCollectionEditor *property_collection_editor; GtkButton *add_collection; GList *list_start, *list; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor); } break; case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor); } break; default: ags_test_leave(); return(FALSE); } add_collection = property_collection_editor->add_collection; ags_test_leave(); /* add collection */ success = ags_functional_test_util_button_click(add_collection); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_bulk_remove(guint nth_machine, guint nth_bulk) { //TODO:JK: } gboolean ags_functional_test_util_machine_properties_bulk_link(guint nth_machine, guint nth_bulk, gchar *link) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsPropertyCollectionEditor *property_collection_editor; AgsLinkCollectionEditor *link_collection_editor; GList *list_start, *list; GtkTreeModel *model; GtkTreeIter iter; gchar *value; guint nth_tab; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get notebook tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor); } break; case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor); } break; default: ags_test_leave(); return(FALSE); } /* get bulk editor */ list_start = gtk_container_get_children(property_collection_editor->child); list = g_list_nth(list_start, nth_bulk); if(list != NULL){ GtkTable *table; table = list->data; g_list_free(list_start); link_collection_editor = g_object_get_data(table, "AgsChild"); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } /* set link */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(link_collection_editor->link)); success = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(link, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) link_collection_editor->link, &iter); success = TRUE; break; } }while(gtk_tree_model_iter_next(model, &iter)); } ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(success); } gboolean ags_functional_test_util_machine_properties_bulk_first_line(guint nth_machine, guint nth_bulk, guint first_line) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsPropertyCollectionEditor *property_collection_editor; AgsLinkCollectionEditor *link_collection_editor; GList *list_start, *list; GtkTreeModel *model; GtkTreeIter iter; gchar *value; guint nth_tab; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get notebook tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor); } break; case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor); } break; default: ags_test_leave(); return(FALSE); } /* get bulk editor */ list_start = gtk_container_get_children(property_collection_editor->child); list = g_list_nth(list_start, nth_bulk); if(list != NULL){ GtkTable *table; table = list->data; g_list_free(list_start); link_collection_editor = g_object_get_data(table, "AgsChild"); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } gtk_spin_button_set_value(link_collection_editor->first_line, first_line); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_properties_bulk_link_line(guint nth_machine, guint nth_bulk, guint first_link_line) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsPropertyCollectionEditor *property_collection_editor; AgsLinkCollectionEditor *link_collection_editor; GList *list_start, *list; GtkTreeModel *model; GtkTreeIter iter; gchar *value; guint nth_tab; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get notebook tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor); } break; case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor); } break; default: ags_test_leave(); return(FALSE); } /* get bulk editor */ list_start = gtk_container_get_children(property_collection_editor->child); list = g_list_nth(list_start, nth_bulk); if(list != NULL && AGS_IS_LINK_COLLECTION_EDITOR(list->data)){ GtkTable *table; table = list->data; g_list_free(list_start); link_collection_editor = g_object_get_data(table, "AgsChild"); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } gtk_spin_button_set_value(link_collection_editor->first_link, first_link_line); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_properties_bulk_count(guint nth_machine, guint nth_bulk, guint count) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsPropertyCollectionEditor *property_collection_editor; AgsLinkCollectionEditor *link_collection_editor; GList *list_start, *list; GtkTreeModel *model; GtkTreeIter iter; gchar *value; guint nth_tab; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* get notebook tab */ ags_test_enter(); machine_editor = machine->properties; nth_tab = gtk_notebook_get_current_page(machine_editor->notebook); switch(nth_tab){ case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor); } break; case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB: { property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor); } break; default: ags_test_leave(); return(FALSE); } /* get bulk editor */ list_start = gtk_container_get_children(property_collection_editor->child); list = g_list_nth(list_start, nth_bulk); if(list != NULL){ GtkTable *table; table = list->data; g_list_free(list_start); link_collection_editor = g_object_get_data(table, "AgsChild"); }else{ g_list_free(list_start); ags_test_leave(); return(FALSE); } gtk_spin_button_set_value(link_collection_editor->count, count); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_properties_resize_audio_channels(guint nth_machine, guint audio_channels) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; GList *list_start, *list; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* resize audio channels */ ags_test_enter(); machine_editor = machine->properties; gtk_spin_button_set_value(machine_editor->resize_editor->audio_channels, audio_channels); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_properties_resize_inputs(guint nth_machine, guint inputs) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; GList *list_start, *list; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* resize input pads */ ags_test_enter(); machine_editor = machine->properties; gtk_spin_button_set_value(machine_editor->resize_editor->input_pads, inputs); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_properties_resize_outputs(guint nth_machine, guint outputs) { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; GList *list_start, *list; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve machine */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MACHINE(list->data)){ machine = list->data; }else{ return(FALSE); } g_list_free(list_start); /* resize output pads */ ags_test_enter(); machine_editor = machine->properties; gtk_spin_button_set_value(machine_editor->resize_editor->output_pads, outputs); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(TRUE); } gboolean ags_functional_test_util_machine_edit_copy(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_line_member_set_toggled(gchar *specifier, gboolean is_toggled) { //TODO:JK: } gboolean ags_functional_test_util_line_member_set_value(gchar *specifier, gdouble value) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_click_tab(guint nth_machine, guint nth_tab) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_click_enable(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_set_device(guint nth_machine, guint pad, guint audio_channel, gchar *device) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_set_line(guint nth_machine, uint pad, guint audio_channel, guint line) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_bulk_add(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_bulk_remove(guint nth_machine, guint nth_bulk) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_bulk_first_line(guint nth_machine, guint nth_bulk, guint first_line) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_bulk_count(guint nth_machine, guint nth_bulk, guint count) { //TODO:JK: } gboolean ags_functional_test_util_machine_audio_connection_bulk_device(guint nth_machine, guint nth_bulk, gchar *device) { //TODO:JK: } gboolean ags_functional_test_util_machine_midi_connection_midi_channel(guint nth_machine, guint midi_channel) { //TODO:JK: } gboolean ags_functional_test_util_machine_midi_connection_audio_start_mapping(guint nth_machine, guint audio_start_mapping) { //TODO:JK: } gboolean ags_functional_test_util_machine_midi_connection_audio_end_mapping(guint nth_machine, guint audio_end_mapping) { //TODO:JK: } gboolean ags_functional_test_util_machine_midi_connection_midi_start_mapping(guint nth_machine, guint midi_start_mapping) { //TODO:JK: } gboolean ags_functional_test_util_machine_midi_connection_midi_end_mapping(guint nth_machine, guint midi_end_mapping) { //TODO:JK: } gboolean ags_functional_test_util_machine_midi_connection_midi_device(guint nth_machine, gchar *device) { //TODO:JK: } gboolean ags_functional_test_util_pad_group(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_pad_mute(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_pad_solo(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_pad_play(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_expander(guint nth_machine, guint nth_pad, guint nth_audio_channel) { //TODO:JK: } gboolean ags_functional_test_util_effect_bulk_add(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_effect_bulk_remove(guint nth_machine, guint nth_bulk_effect) { //TODO:JK: } gboolean ags_functional_test_util_effect_bulk_ladspa_filename(guint nth_machine, gchar *filename) { //TODO:JK: } gboolean ags_functional_test_util_effect_bulk_ladspa_effect(guint nth_machine, gchar *effect) { //TODO:JK: } gboolean ags_functional_test_util_effect_bulk_lv2_filename(guint nth_machine, gchar *filename) { //TODO:JK: } gboolean ags_functional_test_util_effect_bulk_lv2_effect(guint nth_machine, gchar *effect) { //TODO:JK: } gboolean ags_functional_test_util_panel_mute_line(guint nth_machine, guint nth_pad, guint nth_audio_channel) { //TODO:JK: } gboolean ags_functional_test_util_mixer_input_line_volume(guint nth_machine, guint nth_pad, guint nth_audio_channel, gdouble volume) { //TODO:JK: } gboolean ags_functional_test_util_drum_open(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsDrum *drum; GtkButton *open_button; GtkWidget **open_dialog; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve drum */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ drum = list->data; }else{ return(FALSE); } g_list_free(list_start); /* open dialog */ ags_test_enter(); open_button = drum->open; open_dialog = &(drum->open_dialog); ags_test_leave(); /* click open */ success = ags_functional_test_util_button_click(open_button); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible), &ags_functional_test_util_default_timeout, open_dialog); return(success); } gboolean ags_functional_test_util_drum_run(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_drum_loop(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_drum_bank_0(guint nth_machine, guint bank_0) { //TODO:JK: } gboolean ags_functional_test_util_drum_bank_1(guint nth_machine, guint bank_1) { //TODO:JK: } gboolean ags_functional_test_util_drum_length(guint nth_machine, guint length) { //TODO:JK: } gboolean ags_functional_test_util_drum_index(guint nth_machine, guint nth_radio) { //TODO:JK: } gboolean ags_functional_test_util_drum_pad(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_drum_pad_open(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_drum_pad_edit(guint nth_machine, guint nth_pad) { //TODO:JK: } gboolean ags_functional_test_util_drum_input_line_volume(guint nth_machine, guint nth_pad, guint nth_audio_channel, gdouble volume) { //TODO:JK: } gboolean ags_functional_test_util_matrix_run(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_matrix_loop(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_matrix_bank_1(guint nth_machine, guint bank_1) { //TODO:JK: } gboolean ags_functional_test_util_matrix_length(guint nth_machine, guint length) { //TODO:JK: } gboolean ags_functional_test_util_matrix_gutter(guint nth_machine, guint nth_gutter) { //TODO:JK: } gboolean ags_functional_test_util_drum_cell(guint nth_machine, guint x, guint y) { //TODO:JK: } gboolean ags_functional_test_util_synth_auto_update(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_synth_update(guint nth_machine) { //TODO:JK: } gboolean ags_functional_test_util_oscillator_wave(guint nth_machine, guint nth_oscillator, gchar *wave) { //TODO:JK: } gboolean ags_functional_test_util_oscillator_phase(guint nth_machine, guint nth_oscillator, gdouble phase) { //TODO:JK: } gboolean ags_functional_test_util_oscillator_attack(guint nth_machine, guint nth_oscillator, gdouble attack) { //TODO:JK: } gboolean ags_functional_test_util_oscillator_frequency(guint nth_machine, guint nth_oscillator, gdouble frequency) { //TODO:JK: } gboolean ags_functional_test_util_oscillator_length(guint nth_machine, guint nth_oscillator, gdouble length) { //TODO:JK: } gboolean ags_functional_test_util_oscillator_volume(guint nth_machine, guint nth_oscillator, gdouble volume) { //TODO:JK: } gboolean ags_functional_test_util_ffplayer_open(guint nth_machine) { AgsXorgApplicationContext *xorg_application_context; AgsFFPlayer *ffplayer; GtkButton *open_button; GtkWidget **open_dialog; GList *list_start, *list; gboolean success; ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve ffplayer */ list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ ffplayer = list->data; }else{ return(FALSE); } g_list_free(list_start); /* open dialog */ ags_test_enter(); open_button = ffplayer->open; open_dialog = &(ffplayer->open_dialog); ags_test_leave(); /* click open */ success = ags_functional_test_util_button_click(open_button); ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible), &ags_functional_test_util_default_timeout, open_dialog); return(success); } gboolean ags_functional_test_util_ffplayer_preset(guint nth_machine, gchar *preset) { //TODO:JK: } gboolean ags_functional_test_util_ffplayer_instrument(guint nth_machine, gchar *instrument) { //TODO:JK: } gsequencer-3.1.3/ags/test/X/gsequencer_setup_util.c0000644000175000017500000003625413607210263017334 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include "gsequencer_setup_util.h" #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" static void ags_test_driver_mutex_create(); static GRecMutex ags_test_driver_mutex; struct sigaction ags_test_sigact; extern AgsApplicationContext *ags_application_context; void ags_test_enter() { g_rec_mutex_lock(ags_test_get_driver_mutex()); gdk_threads_enter(); } void ags_test_leave() { gdk_threads_leave(); g_rec_mutex_unlock(ags_test_get_driver_mutex()); } GRecMutex* ags_test_get_driver_mutex() { return(&ags_test_driver_mutex); } void ags_test_init(int *argc, char ***argv, gchar *conf_str) { AgsConfig *config; AgsPriority *priority; gchar *filename; gboolean builtin_theme_disabled; guint i; #ifdef AGS_WITH_RT struct sched_param param; struct rlimit rl; #endif struct passwd *pw; gchar *wdir, *config_file; gchar *rc_filename; gchar *base_dir; gchar *str, *data_dir; gchar path[PATH_MAX]; uint32_t size = sizeof(path); uid_t uid; int result; const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb base_dir = strdup(SRCDIR); printf("base dir %s\n", base_dir); /* set some environment variables */ sprintf(path, "%s/gsequencer.share/styles", base_dir); data_dir = realpath(path, NULL); str = malloc(PATH_MAX * sizeof(gchar)); sprintf(str, "AGS_RC_FILENAME=%s/ags.rc", data_dir); putenv(str); sprintf(path, "%s/gsequencer.share/images", base_dir); data_dir = realpath(path, NULL); str = malloc(PATH_MAX * sizeof(gchar)); sprintf(str, "AGS_ANIMATION_FILENAME=%s/ags_supermoon-800x450.png", data_dir); putenv(str); sprintf(path, "%s/gsequencer.share/images", base_dir); data_dir = realpath(path, NULL); str = malloc(PATH_MAX * sizeof(gchar)); sprintf(str, "AGS_LOGO_FILENAME=%s/ags.png", data_dir); putenv(str); sprintf(path, "%s", base_dir); data_dir = realpath(path, NULL); str = malloc(PATH_MAX * sizeof(gchar)); sprintf(str, "AGS_LICENSE_FILENAME=%s/COPYING", data_dir); putenv(str); /* gettext */ setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); /* parameters */ builtin_theme_disabled = FALSE; priority = ags_priority_get_instance(); ags_priority_load_defaults(priority); // g_log_set_fatal_mask("GLib", // "Gtk" , // // G_LOG_LEVEL_CRITICAL); // G_LOG_LEVEL_WARNING #ifdef AGS_WITH_RT result = getrlimit(RLIMIT_STACK, &rl); /* set stack size 64M */ if(result == 0){ if(rl.rlim_cur < kStackSize){ rl.rlim_cur = kStackSize; result = setrlimit(RLIMIT_STACK, &rl); if(result != 0){ //TODO:JK } } } priority = ags_priority_get_instance(); param.sched_priority = 1; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_GUI_MAIN_LOOP); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); g_free(str); } if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } #endif //#ifdef AGS_WITH_X11 XInitThreads(); //#endif /* parse command line parameter */ filename = NULL; for(i = 0; i < argc[0]; i++){ if(!strncmp(argv[0][i], "--help", 7)){ printf("GSequencer is an audio sequencer and notation editor\n\n"); printf("Usage:\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\n", "Report bugs to \n", "--filename file open file", "--no-builtin-theme disable built-in theme", "--help display this help and exit", "--version output version information and exit"); exit(0); }else if(!strncmp(argv[0][i], "--version", 10)){ printf("GSequencer %s\n\n", AGS_VERSION); printf("%s\n%s\n%s\n\n", "Copyright (C) 2005-2020 Joël Krähemann", "This is free software; see the source for copying conditions. There is NO", "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); printf("Written by Joël Krähemann\n"); exit(0); }else if(!strncmp(argv[0][i], "--no-builtin-theme", 19)){ builtin_theme_disabled = TRUE; }else if(!strncmp(argv[0][i], "--filename", 11)){ filename = *argv[i + 1]; i++; } } uid = getuid(); pw = getpwuid(uid); /* parse rc file */ if(!builtin_theme_disabled){ rc_filename = g_strdup_printf("%s/%s/ags.rc", pw->pw_dir, AGS_DEFAULT_DIRECTORY); if(!g_file_test(rc_filename, G_FILE_TEST_IS_REGULAR)){ g_free(rc_filename); #ifdef AGS_RC_FILENAME rc_filename = g_strdup(AGS_RC_FILENAME); #else if((rc_filename = getenv("AGS_RC_FILENAME")) == NULL){ rc_filename = g_strdup_printf("%s%s", DESTDIR, "/gsequencer/styles/ags.rc"); }else{ rc_filename = g_strdup(rc_filename); } #endif } gtk_rc_parse(rc_filename); g_free(rc_filename); } /**/ LIBXML_TEST_VERSION; gtk_init(argc, argv); if(!builtin_theme_disabled){ g_object_set(gtk_settings_get_default(), "gtk-theme-name", "Raleigh", NULL); g_signal_handlers_block_matched(gtk_settings_get_default(), G_SIGNAL_MATCH_DETAIL, g_signal_lookup("set-property", GTK_TYPE_SETTINGS), g_quark_from_string("gtk-theme-name"), NULL, NULL, NULL); } #ifdef AGS_WITH_LIBINSTPATCH ipatch_init(); #endif /* setup */ wdir = g_strdup_printf("%s/%s", pw->pw_dir, AGS_DEFAULT_DIRECTORY); config_file = g_strdup_printf("%s/%s", wdir, AGS_DEFAULT_CONFIG); config = ags_config_get_instance(); if(conf_str != NULL){ ags_config_load_from_data(config, conf_str, strlen(conf_str)); }else{ ags_config_load_from_file(config, config_file); } g_free(wdir); g_free(config_file); } void ags_test_quit() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; xorg_application_context = ags_application_context_get_instance(); ags_test_enter(); window = xorg_application_context->window; window->flags |= AGS_WINDOW_TERMINATING; ags_test_leave(); //FIXME:JK: avoids exit to crash :( sleep(5); } void ags_test_show_file_error(gchar *filename, GError *error) { GtkDialog *dialog; g_warning("could not parse file %s\0", filename); dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Failed to open '%s'\0", filename); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect(dialog, "response\0", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); } void ags_test_signal_handler(int signr) { if(signr == SIGINT){ //TODO:JK: do backup exit(-1); }else{ sigemptyset(&(ags_test_sigact.sa_mask)); } } void ags_test_signal_cleanup() { sigemptyset(&(ags_test_sigact.sa_mask)); } void ags_test_setup(int argc, char **argv) { AgsLadspaManager *ladspa_manager; AgsDssiManager *dssi_manager; AgsLv2Manager *lv2_manager; AgsLv2uiManager *lv2ui_manager; AgsLv2WorkerManager *lv2_worker_manager; AgsLog *log; gchar *blacklist_filename; gchar *filename; uid_t uid; guint i; /* check filename */ log = ags_log_get_instance(); filename = NULL; ags_log_add_message(log, "Welcome to Advanced Gtk+ Sequencer\0"); for(i = 0; i < argc; i++){ if(!strncmp(argv[i], "--filename\0", 11)){ AgsSimpleFile *simple_file; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlChar *xpath; gchar *buffer; guint buffer_length; filename = argv[i + 1]; simple_file = ags_simple_file_new(); g_object_set(simple_file, "filename\0", filename, NULL); ags_simple_file_open(simple_file, NULL); xpath = "/ags-simple-file/ags-sf-config"; /* Create xpath evaluation context */ xpath_context = xmlXPathNewContext(simple_file->doc); if(xpath_context == NULL) { g_warning("Error: unable to create new XPath context\0"); break; } /* Evaluate xpath expression */ xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object == NULL) { g_warning("Error: unable to evaluate xpath expression \"%s\"\0", xpath); xmlXPathFreeContext(xpath_context); break; } node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ buffer = xmlNodeGetContent(node[i]); buffer_length = strlen(buffer); break; } } if(buffer != NULL){ // ags_config_clear(ags_config_get_instance()); ags_config_load_from_data(ags_config_get_instance(), buffer, buffer_length); } break; } } /* load ladspa manager */ ladspa_manager = ags_ladspa_manager_get_instance(); blacklist_filename = "ladspa.blacklist\0"; ags_ladspa_manager_load_blacklist(ladspa_manager, blacklist_filename); ags_log_add_message(ags_log_get_instance(), "* Loading LADSPA plugins\0"); ags_ladspa_manager_load_default_directory(ladspa_manager); /* load dssi manager */ dssi_manager = ags_dssi_manager_get_instance(); blacklist_filename = "dssi_plugin.blacklist\0"; ags_dssi_manager_load_blacklist(dssi_manager, blacklist_filename); ags_log_add_message(ags_log_get_instance(), "* Loading DSSI plugins\0"); ags_dssi_manager_load_default_directory(dssi_manager); /* load lv2 manager */ lv2_manager = ags_lv2_manager_get_instance(); lv2_worker_manager = ags_lv2_worker_manager_get_instance(); blacklist_filename = "lv2_plugin.blacklist\0"; ags_lv2_manager_load_blacklist(lv2_manager, blacklist_filename); ags_log_add_message(ags_log_get_instance(), "* Loading Lv2 plugins\0"); ags_lv2_manager_load_default_directory(lv2_manager); /* load lv2ui manager */ lv2ui_manager = ags_lv2ui_manager_get_instance(); blacklist_filename = "lv2ui_plugin.blacklist\0"; ags_lv2ui_manager_load_blacklist(lv2ui_manager, blacklist_filename); ags_log_add_message(ags_log_get_instance(), "* Loading Lv2ui plugins\0"); ags_lv2ui_manager_load_default_directory(lv2ui_manager); /* application contex */ ags_application_context = (AgsApplicationContext *) ags_xorg_application_context_new(); ags_application_context->argc = argc; ags_application_context->argv = argv; ags_application_context_register_types(ags_application_context); /* fix cross-references in managers */ lv2_worker_manager->thread_pool = ((AgsXorgApplicationContext *) ags_application_context)->thread_pool; ags_ui_provider_set_show_animation(AGS_UI_PROVIDER(ags_application_context), FALSE); } void ags_test_launch() { AgsThread *audio_loop; AgsThreadPool *thread_pool; AgsConfig *config; audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(ags_application_context)); /* start audio loop and thread pool*/ ags_thread_start(audio_loop); /* wait for audio loop */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(audio_loop)); if(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT)){ ags_thread_unset_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE); while(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(AGS_THREAD_GET_START_COND(audio_loop), AGS_THREAD_GET_START_MUTEX(audio_loop)); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(audio_loop)); ags_ui_provider_set_gui_ready(AGS_UI_PROVIDER(ags_application_context), TRUE); } void ags_test_launch_filename(gchar *filename) { AgsSimpleFile *simple_file; AgsSimpleFileRead *simple_file_read; AgsThread *audio_loop; AgsThreadPool *thread_pool; AgsTaskLauncher *task_launcher; AgsConfig *config; GList *start_queue; GError *error; /* get main loop and thread pool */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(ags_application_context)); thread_pool = ags_concurrency_provider_get_thread_pool(AGS_CONCURRENCY_PROVIDER(ags_application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(ags_application_context)); /* open file */ simple_file = (AgsSimpleFile *) g_object_new(AGS_TYPE_SIMPLE_FILE, "filename", filename, NULL); error = NULL; ags_simple_file_open(simple_file, &error); if(error != NULL){ ags_test_show_file_error(filename, error); ags_application_context_quit(ags_application_context); } /* start engine */ g_mutex_lock(audio_loop->start_mutex); start_queue = NULL; g_mutex_unlock(audio_loop->start_mutex); /* start audio loop and thread pool */ ags_thread_start(audio_loop); ags_thread_pool_start(thread_pool); /* wait for audio loop */ g_mutex_lock(&(audio_loop->start_mutex)); if(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT)){ ags_thread_unset_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE); while(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(&(audio_loop->start_cond), &(audio_loop->start_mutex)); } } g_mutex_unlock(&(audio_loop->start_mutex)); /* now start read task */ simple_file_read = ags_simple_file_read_new(simple_file); ags_task_launcher_add_task(task_launcher, (AgsTask *) simple_file_read); } gsequencer-3.1.3/ags/test/X/ags_xorg_application_context_test.c0000644000175000017500000001425313607210263021710 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #define AGS_XORG_APPLICATION_CONTEXT_TEST_DISPOSE_DEVOUT_COUNT (8) int ags_xorg_application_context_test_init_suite(); int ags_xorg_application_context_test_clean_suite(); void ags_xorg_application_context_test_dispose(); void ags_xorg_application_context_test_finalize(); void ags_xorg_application_context_test_finalize_stub(GObject *gobject); #define AGS_XORG_APPLICATION_CONTEXT_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" gboolean xorg_application_context_test_finalized; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xorg_application_context_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xorg_application_context_test_clean_suite() { return(0); } void ags_xorg_application_context_test_dispose() { AgsXorgApplicationContext *xorg_application_context; AgsConfig *config; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_XORG_APPLICATION_CONTEXT_TEST_CONFIG, strlen(AGS_XORG_APPLICATION_CONTEXT_TEST_CONFIG)); xorg_application_context = g_object_new(AGS_TYPE_XORG_APPLICATION_CONTEXT, NULL); g_object_ref(xorg_application_context); /* run dispose */ g_object_run_dispose(xorg_application_context); /* assert */ CU_ASSERT(xorg_application_context->thread_pool == NULL); CU_ASSERT(xorg_application_context->default_soundcard == NULL); CU_ASSERT(xorg_application_context->default_soundcard_thread == NULL); CU_ASSERT(xorg_application_context->default_export_thread == NULL); CU_ASSERT(xorg_application_context->server == NULL); CU_ASSERT(xorg_application_context->soundcard == NULL); CU_ASSERT(xorg_application_context->sequencer == NULL); CU_ASSERT(xorg_application_context->sound_server == NULL); CU_ASSERT(xorg_application_context->window == NULL); ags_application_context = NULL; } void ags_xorg_application_context_test_finalize() { AgsXorgApplicationContext *xorg_application_context; AgsThread *main_loop; GThread *thread; AgsConfig *config; GObjectClass *class; GList *list; gpointer stub_finalize; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_XORG_APPLICATION_CONTEXT_TEST_CONFIG, strlen(AGS_XORG_APPLICATION_CONTEXT_TEST_CONFIG)); xorg_application_context = g_object_new(AGS_TYPE_XORG_APPLICATION_CONTEXT, NULL); /* run dispose */ g_object_run_dispose(xorg_application_context); /* stub finalize */ xorg_application_context_test_finalized = FALSE; class = G_OBJECT_GET_CLASS(xorg_application_context); stub_finalize = class->finalize; G_OBJECT_GET_CLASS(xorg_application_context)->finalize = ags_xorg_application_context_test_finalize_stub; /* unref and assert */ g_object_unref(xorg_application_context); class->finalize = stub_finalize; CU_ASSERT(xorg_application_context_test_finalized == TRUE); ags_application_context = NULL; } void ags_xorg_application_context_test_finalize_stub(GObject *gobject) { xorg_application_context_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsXorgApplicationContextTest", ags_xorg_application_context_test_init_suite, ags_xorg_application_context_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } gtk_init(NULL, NULL); // g_log_set_fatal_mask(G_LOG_DOMAIN, // "GLib-GObject", // "Gtk" G_LOG_DOMAIN, // G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING); /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsXorgApplicationContext doing dispose", ags_xorg_application_context_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsXorgApplicationContext doing finalize", ags_xorg_application_context_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/X/ags_functional_test_util.h0000644000175000017500000005065613607210263020015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FUNCTIONAL_TEST_UTIL_H__ #define __AGS_FUNCTIONAL_TEST_UTIL_H__ #include #include #include #define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_OUTPUT_TAB (0) #define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB (1) #define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB (2) #define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB (3) #define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_RESIZE_TAB (4) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_4_TO_1 (0) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_2_TO_1 (1) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_1 (2) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_2 (3) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_4 (4) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_8 (5) #define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_16 (6) #define AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(f) ((AgsFunctionalTestUtilIdleCondition)(f)) typedef struct _AgsFunctionalTestUtilContainerTest AgsFunctionalTestUtilContainerTest; typedef void (*AgsFunctionalTestUtilAddTest)(); typedef gboolean (*AgsFunctionalTestUtilIdleCondition)(gpointer data); struct _AgsFunctionalTestUtilContainerTest { GtkContainer **container; guint count; }; GThread* ags_functional_test_util_test_runner_thread(); struct timespec* ags_functional_test_util_get_default_timeout(); /* legacy setup */ void ags_functional_test_util_setup_and_launch(); void ags_functional_test_util_setup_and_launch_filename(gchar *filename); /* gtk_main() related */ void ags_functional_test_util_add_test(AgsFunctionalTestUtilAddTest add_test, volatile gboolean *is_available); void ags_functional_test_util_notify_add_test(volatile gboolean *is_available); void ags_functional_test_util_do_run(int argc, char **argv, AgsFunctionalTestUtilAddTest add_test, volatile gboolean *is_available); /* synchronization */ void ags_functional_test_util_reaction_time(); void ags_functional_test_util_reaction_time_long(); void ags_functional_test_util_idle(); void ags_functional_test_util_idle_condition_and_timeout(AgsFunctionalTestUtilIdleCondition idle_condition, struct timespec *timeout, gpointer data); gboolean ags_functional_test_util_idle_test_widget_visible(GtkWidget **widget); gboolean ags_functional_test_util_idle_test_widget_hidden(GtkWidget **widget); gboolean ags_functional_test_util_idle_test_widget_realized(GtkWidget **widget); gboolean ags_functional_test_util_idle_test_container_children_count(AgsFunctionalTestUtilContainerTest *container_test); gboolean ags_functional_test_util_idle_test_null(GtkWidget **widget); /* leave */ void ags_functional_test_util_leave(GtkWidget *window); /* mouse */ void ags_functional_test_util_fake_mouse_warp(gpointer display, guint screen, guint x, guint y); void ags_functional_test_util_fake_mouse_button_press(gpointer display, guint button); void ags_functional_test_util_fake_mouse_button_release(gpointer display, guint button); void ags_functional_test_util_fake_mouse_button_click(gpointer display, guint button); /* common */ GtkMenu* ags_functional_test_util_submenu_find(GtkMenu *menu, gchar *item_label); gboolean ags_functional_test_util_menu_bar_click(gchar *item_label); gboolean ags_functional_test_util_menu_click(GtkMenu *menu, gchar *item_label); gboolean ags_functional_test_util_combo_box_click(GtkComboBox *combo_box, guint nth); gboolean ags_functional_test_util_button_click(GtkButton *button); gboolean ags_functional_test_util_tool_button_click(GtkToolButton *tool_button); /* generic dialog */ gboolean ags_functional_test_util_dialog_apply(GtkDialog *dialog); gboolean ags_functional_test_util_dialog_ok(GtkDialog *dialog); gboolean ags_functional_test_util_dialog_cancel(GtkDialog *dialog); #define ags_functional_test_util_dialog_close ags_functional_test_util_dialog_cancel /* file chooser */ gboolean ags_functional_test_util_file_chooser_open_path(GtkFileChooser *file_chooser, gchar *path); gboolean ags_functional_test_util_file_chooser_select_filename(GtkFileChooser *file_chooser, gchar *filename); gboolean ags_functional_test_util_file_chooser_select_filenames(GtkFileChooser *file_chooser, GSList *filename); gboolean ags_functional_test_util_file_chooser_select_all(GtkFileChooser *file_chooser); /* UI control */ gboolean ags_functional_test_util_file_default_window_resize(); gboolean ags_functional_test_util_file_default_editor_resize(); gboolean ags_functional_test_util_file_default_automation_window_resize(); gboolean ags_functional_test_util_file_default_automation_editor_resize(); /* file */ gboolean ags_functional_test_util_open(); gboolean ags_functional_test_util_save(); gboolean ags_functional_test_util_save_as(); gboolean ags_functional_test_util_export_open(); gboolean ags_functional_test_util_export_close(); gboolean ags_functional_test_util_export_add(); gboolean ags_functional_test_util_export_tact(gdouble tact); gboolean ags_functional_test_util_export_remove(guint nth); gboolean ags_functional_test_util_export_set_backend(guint nth, gchar *backend); gboolean ags_functional_test_util_export_set_device(guint nth, gchar *device); gboolean ags_functional_test_util_export_set_filename(guint nth, gchar *filename); gboolean ags_functional_test_util_export_nth(guint nth); gboolean ags_functional_test_util_export_set_format(guint nth, gchar *format); gboolean ags_functional_test_util_export_do_export(); gboolean ags_functional_test_util_quit(); /* edit */ gboolean ags_functional_test_util_add_machine(gchar *submenu, gchar *machine_name); gboolean ags_functional_test_util_automation_open(); gboolean ags_functional_test_util_automation_close(); gboolean ags_functional_test_util_preferences_open(); gboolean ags_functional_test_util_preferences_close(); /* help */ gboolean ags_functional_test_util_about_open(); gboolean ags_functional_test_util_about_close(); /* navigation */ gboolean ags_functional_test_util_navigation_expand(); gboolean ags_functional_test_util_navigation_bpm(gdouble bpm); gboolean ags_functional_test_util_navigation_rewind(); gboolean ags_functional_test_util_navigation_prev(); gboolean ags_functional_test_util_navigation_play(); gboolean ags_functional_test_util_navigation_stop(); gboolean ags_functional_test_util_navigation_next(); gboolean ags_functional_test_util_navigation_forward(); gboolean ags_functional_test_util_navigation_loop(); gboolean ags_functional_test_util_navigation_position(gdouble position); gboolean ags_functional_test_util_navigation_loop_left(gdouble loop_left); gboolean ags_functional_test_util_navigation_loop_right(gdouble loop_right); gboolean ags_functional_test_util_navigation_exclude_sequencers(); /* notation toolbar */ gboolean ags_functional_test_util_notation_toolbar_cursor_click(); gboolean ags_functional_test_util_notation_toolbar_edit_click(); gboolean ags_functional_test_util_notation_toolbar_delete_click(); gboolean ags_functional_test_util_notation_toolbar_select_click(); gboolean ags_functional_test_util_notation_toolbar_invert_click(); gboolean ags_functional_test_util_notation_toolbar_paste_click(); gboolean ags_functional_test_util_notation_toolbar_copy_click(); gboolean ags_functional_test_util_notation_toolbar_cut_click(); gboolean ags_functional_test_util_notation_toolbar_zoom(guint nth_zoom); /* machine selector */ gboolean ags_functional_test_util_machine_selector_select(gchar *editor_type, guint nth_index); /* machine selection */ gboolean ags_functional_test_util_machine_selection_select(gchar *editor_type, gchar *machine); gboolean ags_functional_test_util_machine_selection_remove_index(gchar *editor_type); gboolean ags_functional_test_util_machine_selection_add_index(gchar *editor_type); gboolean ags_functional_test_util_machine_selection_link_index(gchar *editor_type); gboolean ags_functional_test_util_machine_selection_reverse_mapping(); gboolean ags_functional_test_util_machine_selection_shift_piano(guint nth_shift); /* notation edit */ gboolean ags_functional_test_util_notation_edit_delete_point(guint x, guint y); gboolean ags_functional_test_util_notation_edit_add_point(guint x0, guint x1, guint y); gboolean ags_functional_test_util_notation_edit_select_region(guint x0, guint x1, guint y0, guint y1); /* automation toolbar */ gboolean ags_functional_test_util_automation_toolbar_cursor_click(); gboolean ags_functional_test_util_automation_toolbar_edit_click(); gboolean ags_functional_test_util_automation_toolbar_delete_click(); gboolean ags_functional_test_util_automation_toolbar_select_click(); gboolean ags_functional_test_util_automation_toolbar_paste_click(); gboolean ags_functional_test_util_automation_toolbar_copy_click(); gboolean ags_functional_test_util_automation_toolbar_cut_click(); gboolean ags_functional_test_util_automation_toolbar_zoom(guint nth_zoom); /* automation edit */ gboolean ags_functional_test_util_automation_edit_audio_click(); gboolean ags_functional_test_util_automation_edit_output_click(); gboolean ags_functional_test_util_automation_edit_input_click(); /* automation area */ gboolean ags_functional_test_util_automation_edit_delete_point(guint nth_index, guint x, guint y); gboolean ags_functional_test_util_automation_edit_add_point(guint nth_index, guint x, guint y); gboolean ags_functional_test_util_automation_edit_select_region(guint nth_index, guint x0, guint x1, guint y0, guint y1); /* preferences */ gboolean ags_functional_test_util_preferences_click_tab(guint nth_tab); gboolean ags_functional_test_util_audio_preferences_buffer_size(guint nth_backend, guint buffer_size); gboolean ags_functional_test_util_audio_preferences_samplerate(guint nth_backend, guint samplerate); /* generic machine */ gboolean ags_functional_test_util_machine_move_up(guint nth_machine); gboolean ags_functional_test_util_machine_move_down(guint nth_machine); gboolean ags_functional_test_util_machine_hide(guint nth_machine); gboolean ags_functional_test_util_machine_show(guint nth_machine); gboolean ags_functional_test_util_machine_destroy(guint nth_machine); gboolean ags_functional_test_util_machine_rename_open(guint nth_machine); gboolean ags_functional_test_util_machine_rename_close(guint nth_machine); gboolean ags_functional_test_util_machine_rename_set_name(guint nth_machine, gchar *name); GtkWidget* ags_functional_test_util_get_line_editor(GtkWidget *machine_editor, guint nth_pad, guint nth_audio_channel, gboolean is_output); gboolean ags_functional_test_util_machine_properties_open(guint nth_machine); gboolean ags_functional_test_util_machine_properties_click_tab(guint nth_machine, guint nth_tab); gboolean ags_functional_test_util_machine_properties_click_enable(guint nth_machine); gboolean ags_functional_test_util_machine_properties_link_set(guint nth_machine, guint pad, guint audio_channel, gchar *link_name, guint link_nth_line); gboolean ags_functional_test_util_machine_properties_link_open(guint nth_machine, guint pad, guint audio_channel); gboolean ags_functional_test_util_machine_properties_effect_add(guint nth_machine, guint pad, guint audio_channel); gboolean ags_functional_test_util_machine_properties_effect_remove(guint nth_machine, guint pad, guint audio_channel, guint nth_effect); gboolean ags_functional_test_util_machine_properties_effect_plugin_type(guint nth_machine, guint pad, guint audio_channel, gchar *plugin_type); gboolean ags_functional_test_util_machine_properties_ladspa_filename(guint nth_machine, guint pad, guint audio_channel, gchar *filename); gboolean ags_functional_test_util_machine_properties_ladspa_effect(guint nth_machine, guint pad, guint audio_channel, gchar *effect); gboolean ags_functional_test_util_machine_properties_lv2_filename(guint nth_machine, guint pad, guint audio_channel, gchar *filename); gboolean ags_functional_test_util_machine_properties_lv2_effect(guint nth_machine, guint pad, guint audio_channel, gchar *effect); gboolean ags_functional_test_util_machine_properties_bulk_add(guint nth_machine); gboolean ags_functional_test_util_machine_properties_bulk_remove(guint nth_machine, guint nth_bulk); gboolean ags_functional_test_util_machine_properties_bulk_link(guint nth_machine, guint nth_bulk, gchar *link); gboolean ags_functional_test_util_machine_properties_bulk_first_line(guint nth_machine, guint nth_bulk, guint first_line); gboolean ags_functional_test_util_machine_properties_bulk_link_line(guint nth_machine, guint nth_bulk, guint first_link_line); gboolean ags_functional_test_util_machine_properties_bulk_count(guint nth_machine, guint nth_bulk, guint count); gboolean ags_functional_test_util_machine_properties_resize_audio_channels(guint nth_machine, guint audio_channels); gboolean ags_functional_test_util_machine_properties_resize_inputs(guint nth_machine, guint inputs); gboolean ags_functional_test_util_machine_properties_resize_outputs(guint nth_machine, guint outputs); gboolean ags_functional_test_util_machine_edit_copy(guint nth_machine); /* line member */ gboolean ags_functional_test_util_line_member_set_toggled(gchar *specifier, gboolean is_toggled); gboolean ags_functional_test_util_line_member_set_value(gchar *specifier, gdouble value); /* audio connection */ gboolean ags_functional_test_util_machine_audio_connection_click_tab(guint nth_machine, guint nth_tab); gboolean ags_functional_test_util_machine_audio_connection_click_enable(guint nth_machine); gboolean ags_functional_test_util_machine_audio_connection_set_device(guint nth_machine, guint pad, guint audio_channel, gchar *device); gboolean ags_functional_test_util_machine_audio_connection_set_line(guint nth_machine, uint pad, guint audio_channel, guint line); gboolean ags_functional_test_util_machine_audio_connection_bulk_add(guint nth_machine); gboolean ags_functional_test_util_machine_audio_connection_bulk_remove(guint nth_machine, guint nth_bulk); gboolean ags_functional_test_util_machine_audio_connection_bulk_first_line(guint nth_machine, guint nth_bulk, guint first_line); gboolean ags_functional_test_util_machine_audio_connection_bulk_count(guint nth_machine, guint nth_bulk, guint count); gboolean ags_functional_test_util_machine_audio_connection_bulk_device(guint nth_machine, guint nth_bulk, gchar *device); /* midi connection */ gboolean ags_functional_test_util_machine_midi_connection_midi_channel(guint nth_machine, guint midi_channel); gboolean ags_functional_test_util_machine_midi_connection_audio_start_mapping(guint nth_machine, guint audio_start_mapping); gboolean ags_functional_test_util_machine_midi_connection_audio_end_mapping(guint nth_machine, guint audio_end_mapping); gboolean ags_functional_test_util_machine_midi_connection_midi_start_mapping(guint nth_machine, guint midi_start_mapping); gboolean ags_functional_test_util_machine_midi_connection_midi_end_mapping(guint nth_machine, guint midi_end_mapping); gboolean ags_functional_test_util_machine_midi_connection_midi_device(guint nth_machine, gchar *device); /* generic pad */ gboolean ags_functional_test_util_pad_group(guint nth_machine, guint nth_pad); gboolean ags_functional_test_util_pad_mute(guint nth_machine, guint nth_pad); gboolean ags_functional_test_util_pad_solo(guint nth_machine, guint nth_pad); gboolean ags_functional_test_util_pad_play(guint nth_machine, guint nth_pad); /* generic line */ gboolean ags_functional_test_util_expander(guint nth_machine, guint nth_pad, guint nth_audio_channel); /* generic effect bulk */ gboolean ags_functional_test_util_effect_bulk_add(guint nth_machine); gboolean ags_functional_test_util_effect_bulk_remove(guint nth_machine, guint nth_bulk_effect); gboolean ags_functional_test_util_effect_bulk_ladspa_filename(guint nth_machine, gchar *filename); gboolean ags_functional_test_util_effect_bulk_ladspa_effect(guint nth_machine, gchar *effect); gboolean ags_functional_test_util_effect_bulk_lv2_filename(guint nth_machine, gchar *filename); gboolean ags_functional_test_util_effect_bulk_lv2_effect(guint nth_machine, gchar *effect); /* panel */ gboolean ags_functional_test_util_panel_mute_line(guint nth_machine, guint nth_pad, guint nth_audio_channel); /* mixer input line */ gboolean ags_functional_test_util_mixer_input_line_volume(guint nth_machine, guint nth_pad, guint nth_audio_channel, gdouble volume); /* drum */ gboolean ags_functional_test_util_drum_open(guint nth_machine); gboolean ags_functional_test_util_drum_run(guint nth_machine); gboolean ags_functional_test_util_drum_loop(guint nth_machine); gboolean ags_functional_test_util_drum_bank_0(guint nth_machine, guint bank_0); gboolean ags_functional_test_util_drum_bank_1(guint nth_machine, guint bank_1); gboolean ags_functional_test_util_drum_length(guint nth_machine, guint length); gboolean ags_functional_test_util_drum_index(guint nth_machine, guint nth_radio); gboolean ags_functional_test_util_drum_pad(guint nth_machine, guint nth_pad); /* drum input pad */ gboolean ags_functional_test_util_drum_pad_open(guint nth_machine, guint nth_pad); gboolean ags_functional_test_util_drum_pad_edit(guint nth_machine, guint nth_pad); /* drum input line */ gboolean ags_functional_test_util_drum_input_line_volume(guint nth_machine, guint nth_pad, guint nth_audio_channel, gdouble volume); /* matrix */ gboolean ags_functional_test_util_matrix_run(guint nth_machine); gboolean ags_functional_test_util_matrix_loop(guint nth_machine); gboolean ags_functional_test_util_matrix_bank_1(guint nth_machine, guint bank_1); gboolean ags_functional_test_util_matrix_length(guint nth_machine, guint length); gboolean ags_functional_test_util_matrix_gutter(guint nth_machine, guint nth_gutter); gboolean ags_functional_test_util_drum_cell(guint nth_machine, guint x, guint y); /* synth */ gboolean ags_functional_test_util_synth_auto_update(guint nth_machine); gboolean ags_functional_test_util_synth_update(guint nth_machine); gboolean ags_functional_test_util_oscillator_wave(guint nth_machine, guint nth_oscillator, gchar *wave); gboolean ags_functional_test_util_oscillator_phase(guint nth_machine, guint nth_oscillator, gdouble phase); gboolean ags_functional_test_util_oscillator_attack(guint nth_machine, guint nth_oscillator, gdouble attack); gboolean ags_functional_test_util_oscillator_frequency(guint nth_machine, guint nth_oscillator, gdouble frequency); gboolean ags_functional_test_util_oscillator_length(guint nth_machine, guint nth_oscillator, gdouble length); gboolean ags_functional_test_util_oscillator_volume(guint nth_machine, guint nth_oscillator, gdouble volume); /* ffplayer */ gboolean ags_functional_test_util_ffplayer_open(guint nth_machine); gboolean ags_functional_test_util_ffplayer_preset(guint nth_machine, gchar *preset); gboolean ags_functional_test_util_ffplayer_instrument(guint nth_machine, gchar *instrument); #endif /*__AGS_FUNCTIONAL_TEST_UTIL_H__*/ gsequencer-3.1.3/ags/test/X/libgsequencer.h0000644000175000017500000002777513607210263015563 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __LIBGSEQUENCER_H__ #define __LIBGSEQUENCER_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #include #include #include #include #include #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /*__LIBGSEQUENCER_H__*/ gsequencer-3.1.3/ags/test/X/machine/0000755000175000017500000000000013622252262014226 500000000000000gsequencer-3.1.3/ags/test/X/machine/ags_functional_panel_test.c0000644000175000017500000001624513607210263021532 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include "../gsequencer_setup_util.h" #include "../ags_functional_test_util.h" void ags_functional_panel_test_add_test(); int ags_functional_panel_test_init_suite(); int ags_functional_panel_test_clean_suite(); void ags_functional_panel_test_resize_pads(); void ags_functional_panel_test_resize_audio_channels(); #define AGS_FUNCTIONAL_PANEL_TEST_RESIZE_OUTPUT_PADS (5) #define AGS_FUNCTIONAL_PANEL_TEST_RESIZE_INPUT_PADS (15) #define AGS_FUNCTIONAL_PANEL_TEST_RESIZE_AUDIO_CHANNELS (7) #define AGS_FUNCTIONAL_PANEL_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_panel_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of AgsPanel resize pads", ags_functional_panel_test_resize_pads) == NULL) || (CU_add_test(pSuite, "functional test of AgsPanel resize audio channels", ags_functional_panel_test_resize_audio_channels) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_panel_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_panel_test_clean_suite() { return(0); } void ags_functional_panel_test_resize_pads() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsPanel *panel; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add panel */ success = ags_functional_test_util_add_machine(NULL, "Panel"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve panel */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_PANEL(list->data)){ panel = list->data; }else{ panel = NULL; } CU_ASSERT(panel != NULL); /* * resize output and input pads */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output pads */ ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_PANEL_TEST_RESIZE_OUTPUT_PADS); /* set input pads */ ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_PANEL_TEST_RESIZE_INPUT_PADS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(panel)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy panel */ success = ags_functional_test_util_machine_destroy(0); } void ags_functional_panel_test_resize_audio_channels() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsPanel *panel; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add panel */ success = ags_functional_test_util_add_machine(NULL, "Panel"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve panel */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_PANEL(list->data)){ panel = list->data; }else{ panel = NULL; } CU_ASSERT(panel != NULL); /* * resize audio channels */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output audio_channels */ ags_functional_test_util_machine_properties_resize_audio_channels(nth_machine, AGS_FUNCTIONAL_PANEL_TEST_RESIZE_AUDIO_CHANNELS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(panel)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy panel */ success = ags_functional_test_util_machine_destroy(0); } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalPanelTest", ags_functional_panel_test_init_suite, ags_functional_panel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_PANEL_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_panel_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/machine/ags_functional_matrix_test.c0000644000175000017500000001647013607210263021737 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "../gsequencer_setup_util.h" #include "../ags_functional_test_util.h" void ags_functional_matrix_test_add_test(); int ags_functional_matrix_test_init_suite(); int ags_functional_matrix_test_clean_suite(); void ags_functional_matrix_test_resize_pads(); void ags_functional_matrix_test_resize_audio_channels(); #define AGS_FUNCTIONAL_MATRIX_TEST_RESIZE_OUTPUT_PADS (5) #define AGS_FUNCTIONAL_MATRIX_TEST_RESIZE_INPUT_PADS (15) #define AGS_FUNCTIONAL_MATRIX_TEST_RESIZE_AUDIO_CHANNELS (0) #define AGS_FUNCTIONAL_MATRIX_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_matrix_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of AgsMatrix resize pads", ags_functional_matrix_test_resize_pads) == NULL) || (CU_add_test(pSuite, "functional test of AgsMatrix resize audio channels", ags_functional_matrix_test_resize_audio_channels) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_matrix_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_matrix_test_clean_suite() { return(0); } void ags_functional_matrix_test_resize_pads() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsMatrix *matrix; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve matrix */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MATRIX(list->data)){ matrix = list->data; }else{ matrix = NULL; } CU_ASSERT(matrix != NULL); /* * resize output and input pads */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output pads */ ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_MATRIX_TEST_RESIZE_OUTPUT_PADS); /* set input pads */ ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_MATRIX_TEST_RESIZE_INPUT_PADS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(matrix)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy matrix */ success = ags_functional_test_util_machine_destroy(0); } void ags_functional_matrix_test_resize_audio_channels() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsMatrix *matrix; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve matrix */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MATRIX(list->data)){ matrix = list->data; }else{ matrix = NULL; } CU_ASSERT(matrix != NULL); /* * resize audio channels */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output audio_channels */ ags_functional_test_util_machine_properties_resize_audio_channels(nth_machine, AGS_FUNCTIONAL_MATRIX_TEST_RESIZE_AUDIO_CHANNELS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(matrix)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy matrix */ success = ags_functional_test_util_machine_destroy(0); } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalMatrixTest", ags_functional_matrix_test_init_suite, ags_functional_matrix_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_MATRIX_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_matrix_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/machine/ags_functional_mixer_test.c0000644000175000017500000001641013607210263021551 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "../gsequencer_setup_util.h" #include "../ags_functional_test_util.h" void ags_functional_mixer_test_add_test(); int ags_functional_mixer_test_init_suite(); int ags_functional_mixer_test_clean_suite(); void ags_functional_mixer_test_resize_pads(); void ags_functional_mixer_test_resize_audio_channels(); #define AGS_FUNCTIONAL_MIXER_TEST_RESIZE_OUTPUT_PADS (5) #define AGS_FUNCTIONAL_MIXER_TEST_RESIZE_INPUT_PADS (15) #define AGS_FUNCTIONAL_MIXER_TEST_RESIZE_AUDIO_CHANNELS (7) #define AGS_FUNCTIONAL_MIXER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_mixer_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of AgsMixer resize pads", ags_functional_mixer_test_resize_pads) == NULL) || (CU_add_test(pSuite, "functional test of AgsMixer resize audio channels", ags_functional_mixer_test_resize_audio_channels) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_mixer_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_mixer_test_clean_suite() { return(0); } void ags_functional_mixer_test_resize_pads() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsMixer *mixer; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve mixer */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MIXER(list->data)){ mixer = list->data; }else{ mixer = NULL; } CU_ASSERT(mixer != NULL); /* * resize output and input pads */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output pads */ ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_MIXER_TEST_RESIZE_OUTPUT_PADS); /* set input pads */ ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_MIXER_TEST_RESIZE_INPUT_PADS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(mixer)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy mixer */ success = ags_functional_test_util_machine_destroy(0); } void ags_functional_mixer_test_resize_audio_channels() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsMixer *mixer; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve mixer */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MIXER(list->data)){ mixer = list->data; }else{ mixer = NULL; } CU_ASSERT(mixer != NULL); /* * resize audio channels */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output audio_channels */ ags_functional_test_util_machine_properties_resize_audio_channels(nth_machine, AGS_FUNCTIONAL_MIXER_TEST_RESIZE_AUDIO_CHANNELS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(mixer)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy mixer */ success = ags_functional_test_util_machine_destroy(0); } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalMixerTest", ags_functional_mixer_test_init_suite, ags_functional_mixer_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_MIXER_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_mixer_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/machine/ags_functional_ffplayer_test.c0000644000175000017500000002305113607210263022234 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include "../gsequencer_setup_util.h" #include "../ags_functional_test_util.h" #include void ags_functional_ffplayer_test_add_test(); int ags_functional_ffplayer_test_init_suite(); int ags_functional_ffplayer_test_clean_suite(); #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_ffplayer_test_open_sf2(); void ags_functional_ffplayer_test_resize_pads(); void ags_functional_ffplayer_test_resize_audio_channels(); #endif #define AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_PATH "/usr/share/sounds/sf2" #define AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_FILENAME "/usr/share/sounds/sf2/FluidR3_GM.sf2" #define AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_DELAY (30) #define AGS_FUNCTIONAL_FFPLAYER_TEST_RESIZE_OUTPUT_PADS (5) #define AGS_FUNCTIONAL_FFPLAYER_TEST_RESIZE_INPUT_PADS (15) #define AGS_FUNCTIONAL_FFPLAYER_TEST_RESIZE_AUDIO_CHANNELS (7) #define AGS_FUNCTIONAL_FFPLAYER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_ffplayer_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of AgsFFPlayer open sf2", ags_functional_ffplayer_test_open_sf2) == NULL) || (CU_add_test(pSuite, "functional test of AgsFFPlayer resize pads", ags_functional_ffplayer_test_resize_pads) == NULL) || (CU_add_test(pSuite, "functional test of AgsFFPlayer resize audio channels", ags_functional_ffplayer_test_resize_audio_channels) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_ffplayer_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_ffplayer_test_clean_suite() { return(0); } void ags_functional_ffplayer_test_open_sf2() { AgsXorgApplicationContext *xorg_application_context; AgsFFPlayer *ffplayer; GList *list_start, *list; guint nth_machine; gboolean success; /* add ffplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve ffplayer */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ ffplayer = list->data; }else{ ffplayer = NULL; } CU_ASSERT(ffplayer != NULL); /* open dialog */ success = ags_functional_test_util_ffplayer_open(0); CU_ASSERT(success == TRUE); /* open path */ CU_ASSERT(g_file_test(AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_PATH, G_FILE_TEST_EXISTS)); success = ags_functional_test_util_file_chooser_open_path(GTK_FILE_CHOOSER(ffplayer->open_dialog), AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_PATH); CU_ASSERT(success == TRUE); /* select sf2 */ success = ags_functional_test_util_file_chooser_select_filename(GTK_FILE_CHOOSER(ffplayer->open_dialog), AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_FILENAME); CU_ASSERT(success == TRUE); /* response ok */ success = ags_functional_test_util_dialog_ok(GTK_DIALOG(ffplayer->open_dialog)); CU_ASSERT(success == TRUE); /* destroy ffplayer */ sleep(AGS_FUNCTIONAL_FFPLAYER_TEST_OPEN_SF2_DELAY); success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_ffplayer_test_resize_pads() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsFFPlayer *ffplayer; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add ffplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve ffplayer */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ ffplayer = list->data; }else{ ffplayer = NULL; } CU_ASSERT(ffplayer != NULL); /* * resize output and input pads */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output pads */ ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_FFPLAYER_TEST_RESIZE_OUTPUT_PADS); /* set input pads */ ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_FFPLAYER_TEST_RESIZE_INPUT_PADS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(ffplayer)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy ffplayer */ success = ags_functional_test_util_machine_destroy(0); } void ags_functional_ffplayer_test_resize_audio_channels() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsFFPlayer *ffplayer; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add ffplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve ffplayer */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ ffplayer = list->data; }else{ ffplayer = NULL; } CU_ASSERT(ffplayer != NULL); /* * resize audio channels */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output audio_channels */ ags_functional_test_util_machine_properties_resize_audio_channels(nth_machine, AGS_FUNCTIONAL_FFPLAYER_TEST_RESIZE_AUDIO_CHANNELS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(ffplayer)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy ffplayer */ success = ags_functional_test_util_machine_destroy(0); } int main(int argc, char **argv) { #ifdef AGS_WITH_LIBINSTPATCH /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalFFPlayerTest", ags_functional_ffplayer_test_init_suite, ags_functional_ffplayer_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_FFPLAYER_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_ffplayer_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); #else return(0); #endif } gsequencer-3.1.3/ags/test/X/machine/ags_functional_synth_test.c0000644000175000017500000001641213607210263021574 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "../gsequencer_setup_util.h" #include "../ags_functional_test_util.h" void ags_functional_synth_test_add_test(); int ags_functional_synth_test_init_suite(); int ags_functional_synth_test_clean_suite(); void ags_functional_synth_test_resize_pads(); void ags_functional_synth_test_resize_audio_channels(); #define AGS_FUNCTIONAL_SYNTH_TEST_RESIZE_OUTPUT_PADS (5) #define AGS_FUNCTIONAL_SYNTH_TEST_RESIZE_INPUT_PADS (15) #define AGS_FUNCTIONAL_SYNTH_TEST_RESIZE_AUDIO_CHANNELS (0) #define AGS_FUNCTIONAL_SYNTH_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_synth_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of AgsSynth resize pads", ags_functional_synth_test_resize_pads) == NULL) || (CU_add_test(pSuite, "functional test of AgsSynth resize audio channels", ags_functional_synth_test_resize_audio_channels) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_synth_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_synth_test_clean_suite() { return(0); } void ags_functional_synth_test_resize_pads() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsSynth *synth; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add synth */ success = ags_functional_test_util_add_machine(NULL, "Synth"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve synth */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_SYNTH(list->data)){ synth = list->data; }else{ synth = NULL; } CU_ASSERT(synth != NULL); /* * resize output and input pads */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output pads */ ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_SYNTH_TEST_RESIZE_OUTPUT_PADS); /* set input pads */ ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_SYNTH_TEST_RESIZE_INPUT_PADS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(synth)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy synth */ success = ags_functional_test_util_machine_destroy(0); } void ags_functional_synth_test_resize_audio_channels() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsSynth *synth; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add synth */ success = ags_functional_test_util_add_machine(NULL, "Synth"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve synth */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_SYNTH(list->data)){ synth = list->data; }else{ synth = NULL; } CU_ASSERT(synth != NULL); /* * resize audio channels */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output audio_channels */ ags_functional_test_util_machine_properties_resize_audio_channels(nth_machine, AGS_FUNCTIONAL_SYNTH_TEST_RESIZE_AUDIO_CHANNELS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(synth)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy synth */ success = ags_functional_test_util_machine_destroy(0); } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalSynthTest", ags_functional_synth_test_init_suite, ags_functional_synth_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_SYNTH_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_synth_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/machine/ags_functional_drum_test.c0000644000175000017500000002224613607210263021400 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "../gsequencer_setup_util.h" #include "../ags_functional_test_util.h" void ags_functional_drum_test_add_test(); int ags_functional_drum_test_init_suite(); int ags_functional_drum_test_clean_suite(); void ags_functional_drum_test_open_drum_kit(); void ags_functional_drum_test_resize_pads(); void ags_functional_drum_test_resize_audio_channels(); #define AGS_FUNCTIONAL_DRUM_TEST_OPEN_DRUM_KIT_PATH "/usr/share/hydrogen/data/drumkits/HardElectro1/" #define AGS_FUNCTIONAL_DRUM_TEST_RESIZE_OUTPUT_PADS (5) #define AGS_FUNCTIONAL_DRUM_TEST_RESIZE_INPUT_PADS (15) #define AGS_FUNCTIONAL_DRUM_TEST_RESIZE_AUDIO_CHANNELS (7) #define AGS_FUNCTIONAL_DRUM_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_drum_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of AgsDrum open drum kit", ags_functional_drum_test_open_drum_kit) == NULL) || (CU_add_test(pSuite, "functional test of AgsDrum resize pads", ags_functional_drum_test_resize_pads) == NULL) || (CU_add_test(pSuite, "functional test of AgsDrum resize audio channels", ags_functional_drum_test_resize_audio_channels) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_drum_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_drum_test_clean_suite() { return(0); } void ags_functional_drum_test_open_drum_kit() { AgsXorgApplicationContext *xorg_application_context; AgsDrum *drum; GList *list_start, *list; guint nth_machine; gboolean success; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve drum */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ drum = list->data; }else{ drum = NULL; } CU_ASSERT(drum != NULL); /* open dialog */ success = ags_functional_test_util_drum_open(0); CU_ASSERT(success == TRUE); /* open path */ CU_ASSERT(g_file_test(AGS_FUNCTIONAL_DRUM_TEST_OPEN_DRUM_KIT_PATH, G_FILE_TEST_EXISTS)); success = ags_functional_test_util_file_chooser_open_path(GTK_FILE_CHOOSER(drum->open_dialog), AGS_FUNCTIONAL_DRUM_TEST_OPEN_DRUM_KIT_PATH); CU_ASSERT(success == TRUE); /* select all */ success = ags_functional_test_util_file_chooser_select_all(GTK_FILE_CHOOSER(drum->open_dialog)); CU_ASSERT(success == TRUE); /* response ok */ success = ags_functional_test_util_dialog_ok(GTK_DIALOG(drum->open_dialog)); CU_ASSERT(success == TRUE); /* destroy drum */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); } void ags_functional_drum_test_resize_pads() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsDrum *drum; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve drum */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ drum = list->data; }else{ drum = NULL; } CU_ASSERT(drum != NULL); /* * resize output and input pads */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output pads */ ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_DRUM_TEST_RESIZE_OUTPUT_PADS); /* set input pads */ ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_DRUM_TEST_RESIZE_INPUT_PADS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(drum)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy drum */ success = ags_functional_test_util_machine_destroy(0); } void ags_functional_drum_test_resize_audio_channels() { GtkDialog *properties; AgsXorgApplicationContext *xorg_application_context; AgsDrum *drum; GList *list_start, *list; guint nth_machine; guint resize_tab; gboolean success; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve drum */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ drum = list->data; }else{ drum = NULL; } CU_ASSERT(drum != NULL); /* * resize audio channels */ /* open properties */ ags_functional_test_util_machine_properties_open(nth_machine); /* click tab */ resize_tab = 4; ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); /* click enable */ ags_functional_test_util_machine_properties_click_enable(nth_machine); /* set output audio_channels */ ags_functional_test_util_machine_properties_resize_audio_channels(nth_machine, AGS_FUNCTIONAL_DRUM_TEST_RESIZE_AUDIO_CHANNELS); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(drum)->properties; ags_test_leave(); ags_functional_test_util_dialog_ok(properties); /* destroy drum */ success = ags_functional_test_util_machine_destroy(0); } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalDrumTest", ags_functional_drum_test_init_suite, ags_functional_drum_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_DRUM_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_drum_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/ags_functional_automation_editor_workflow_test.c0000644000175000017500000006065713607210263024515 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_automation_editor_workflow_test_add_test(); int ags_functional_automation_editor_workflow_test_init_suite(); int ags_functional_automation_editor_workflow_test_clean_suite(); void ags_functional_automation_editor_workflow_test_panel(); void ags_functional_automation_editor_workflow_test_mixer(); void ags_functional_automation_editor_workflow_test_equalizer10(); void ags_functional_automation_editor_workflow_test_drum(); void ags_functional_automation_editor_workflow_test_matrix(); #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_automation_editor_workflow_test_ffplayer(); #endif void ags_functional_automation_editor_workflow_test_syncsynth(); #define AGS_FUNCTIONAL_AUTOMATION_EDITOR_WORKFLOW_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_automation_editor_workflow_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsPanel", ags_functional_automation_editor_workflow_test_panel) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsMixer", ags_functional_automation_editor_workflow_test_mixer) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsEqualizer10", ags_functional_automation_editor_workflow_test_equalizer10) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsDrum", ags_functional_automation_editor_workflow_test_drum) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsMatrix", ags_functional_automation_editor_workflow_test_matrix) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsSyncsynth", ags_functional_automation_editor_workflow_test_syncsynth) == NULL) #ifdef AGS_WITH_LIBINSTPATCH || (CU_add_test(pSuite, "functional test of GSequencer automation editor workflow AgsFFPlayer", ags_functional_automation_editor_workflow_test_ffplayer) == NULL) #endif ){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_automation_editor_workflow_test_init_suite() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; GtkMenu *edit_menu; GdkEvent *delete_event; ags_test_enter(); xorg_application_context = ags_application_context; window = AGS_WINDOW(xorg_application_context->window); edit_menu = window->menu_bar->edit; ags_test_leave(); /* window and editor size */ ags_functional_test_util_file_default_window_resize(); ags_functional_test_util_file_default_editor_resize(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); ags_functional_test_util_file_default_automation_window_resize(); ags_functional_test_util_file_default_automation_editor_resize(); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); ags_functional_test_util_reaction_time_long(); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_automation_editor_workflow_test_clean_suite() { return(0); } void ags_functional_automation_editor_workflow_test_panel() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 0; /* add panel */ success = ags_functional_test_util_add_machine(NULL, "Panel"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_PANEL(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } void ags_functional_automation_editor_workflow_test_mixer() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 1; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MIXER(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } void ags_functional_automation_editor_workflow_test_equalizer10() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 2; /* add equalizer10 */ success = ags_functional_test_util_add_machine(NULL, "Equalizer"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_EQUALIZER10(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } void ags_functional_automation_editor_workflow_test_drum() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 3; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } void ags_functional_automation_editor_workflow_test_matrix() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 4; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MATRIX(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } void ags_functional_automation_editor_workflow_test_syncsynth() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 5; /* add syncsynth */ success = ags_functional_test_util_add_machine(NULL, "Syncsynth"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_SYNCSYNTH(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_automation_editor_workflow_test_ffplayer() { AgsXorgApplicationContext *xorg_application_context; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsMachineSelector *machine_selector; AgsMachineSelection *machine_selection; GtkMenu *edit_menu; GdkEvent *delete_event; GList *list_start, *list; gchar *machine_str; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; nth_machine = 6; /* add ffplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add machine to automation editor */ ags_test_enter(); window = AGS_WINDOW(xorg_application_context->window); automation_editor = window->automation_window->automation_editor; edit_menu = window->menu_bar->edit; ags_test_leave(); /* open automation window */ ags_functional_test_util_menu_bar_click("_Edit"); ags_functional_test_util_menu_click(edit_menu, "Automation"); /* add index and link */ success = ags_functional_test_util_machine_selection_add_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selector_select("AgsAutomationEditor", nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_selection_link_index("AgsAutomationEditor"); CU_ASSERT(success == TRUE); /* select machine */ ags_test_enter(); machine_selector = automation_editor->machine_selector; machine_selection = machine_selector->machine_selection; machine_str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_selection_select("AgsAutomationEditor", machine_str); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(machine_selection); CU_ASSERT(success == TRUE); /* close automation window */ ags_test_enter(); delete_event = gdk_event_new(GDK_DELETE); gtk_widget_event((GtkWidget *) window->automation_window, (GdkEvent *) delete_event); ags_test_leave(); } #endif int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalAutomationEditorWorkflowTest", ags_functional_automation_editor_workflow_test_init_suite, ags_functional_automation_editor_workflow_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_AUTOMATION_EDITOR_WORKFLOW_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_automation_editor_workflow_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/ags_functional_machine_link_test.c0000644000175000017500000010352113607210263021442 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_machine_link_test_add_test(); int ags_functional_machine_link_test_init_suite(); int ags_functional_machine_link_test_clean_suite(); void ags_functional_machine_link_test_master_mixer(); void ags_functional_machine_link_test_slave_mixer(); void ags_functional_machine_link_test_drum(); void ags_functional_machine_link_test_matrix(); void ags_functional_machine_link_test_synth(); #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_machine_link_test_ffplayer_0(); void ags_functional_machine_link_test_ffplayer_1(); #endif void ags_functional_machine_link_test_relink_all(); void ags_functional_machine_link_test_reset_link_all(); void ags_functional_machine_link_test_destroy_all(); #define AGS_FUNCTIONAL_MACHINE_LINK_TEST_MASTER_MIXER_INPUT_PADS (1) #define AGS_FUNCTIONAL_MACHINE_LINK_TEST_MATRIX_OUTPUT_PADS (2) #define AGS_FUNCTIONAL_MACHINE_LINK_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; AgsXorgApplicationContext *xorg_application_context; AgsMachine *panel; AgsMachine *master_mixer; AgsMachine *slave_mixer; AgsMachine *drum; AgsMachine *matrix; AgsMachine *synth; #ifdef AGS_WITH_LIBINSTPATCH AgsMachine *ffplayer_0; AgsMachine *ffplayer_1; #endif void ags_functional_machine_link_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer machine link master mixer", ags_functional_machine_link_test_master_mixer) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine link slave mixer", ags_functional_machine_link_test_slave_mixer) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine link drum", ags_functional_machine_link_test_drum) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine link matrix", ags_functional_machine_link_test_matrix) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine link synth", ags_functional_machine_link_test_synth) == NULL) || #ifdef AGS_WITH_LIBINSTPATCH (CU_add_test(pSuite, "functional test of GSequencer machine link fplayer #0", ags_functional_machine_link_test_ffplayer_0) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine link fplayer #1", ags_functional_machine_link_test_ffplayer_1) == NULL) || #endif (CU_add_test(pSuite, "functional test of GSequencer machine relink all", ags_functional_machine_link_test_relink_all) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine reset link all", ags_functional_machine_link_test_reset_link_all) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer machine link destroy all", ags_functional_machine_link_test_destroy_all) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_machine_link_test_init_suite() { GList *list_start, *list; guint nth_machine; /* add panel */ ags_functional_test_util_add_machine(NULL, "Panel"); /* */ ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); /* retrieve panel */ nth_machine = 0; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_PANEL(list->data)){ panel = list->data; }else{ panel = NULL; } ags_functional_test_util_machine_hide(nth_machine); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_machine_link_test_clean_suite() { return(0); } void ags_functional_machine_link_test_master_mixer() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint output_tab; guint nth_machine; gboolean success; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve master mixer */ nth_machine = 1; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MIXER(list->data)){ master_mixer = list->data; }else{ master_mixer = NULL; } CU_ASSERT(master_mixer != NULL); /* * resize input pads */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); /* click tab */ resize_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_RESIZE_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_machine); CU_ASSERT(success == TRUE); /* resize input */ success = ags_functional_test_util_machine_properties_resize_inputs(nth_machine, AGS_FUNCTIONAL_MACHINE_LINK_TEST_MASTER_MIXER_INPUT_PADS); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(master_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* * link panel with master mixer */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); /* click tab */ output_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_OUTPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_machine, output_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(panel), AGS_MACHINE(panel)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_machine, 0, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_machine, 0, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(master_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_slave_mixer() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint output_tab; guint nth_machine; gboolean success; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve master mixer */ nth_machine = 2; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MIXER(list->data)){ slave_mixer = list->data; }else{ slave_mixer = NULL; } CU_ASSERT(slave_mixer != NULL); /* * link master mixer with slave mixer */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); /* click tab */ output_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_OUTPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_machine, output_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(master_mixer), AGS_MACHINE(master_mixer)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_machine, 0, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_machine, 0, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_drum() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint input_tab; guint nth_parent_machine; guint nth_machine; gboolean success; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve drum */ nth_parent_machine = 2; nth_machine = 3; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ drum = list->data; }else{ drum = NULL; } CU_ASSERT(drum != NULL); /* * link slave mixer with drum */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(drum), AGS_MACHINE(drum)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 0, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 0, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_matrix() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint input_tab; guint nth_parent_machine; guint nth_machine; gboolean success; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve matrix */ nth_parent_machine = 2; nth_machine = 4; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MATRIX(list->data)){ matrix = list->data; }else{ matrix = NULL; } CU_ASSERT(matrix != NULL); /* * resize output pads */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); /* click tab */ resize_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_RESIZE_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_machine, resize_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_machine); CU_ASSERT(success == TRUE); /* resize output */ success = ags_functional_test_util_machine_properties_resize_outputs(nth_machine, AGS_FUNCTIONAL_MACHINE_LINK_TEST_MATRIX_OUTPUT_PADS); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(matrix)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* * link slave mixer with matrix */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(matrix), AGS_MACHINE(matrix)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 1, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 1, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_synth() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint input_line_count; guint input_link_tab; guint nth_parent_machine; guint nth_machine; gboolean success; /* add synth */ success = ags_functional_test_util_add_machine(NULL, "Synth"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve synth */ nth_parent_machine = 4; nth_machine = 5; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_SYNTH(list->data)){ synth = list->data; }else{ synth = NULL; } CU_ASSERT(synth != NULL); /* * link matrix with synth */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_link_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_link_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(synth), AGS_MACHINE(synth)->machine_name); input_line_count = matrix->audio->input_lines; ags_test_leave(); success = ags_functional_test_util_machine_properties_bulk_add(nth_parent_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_bulk_link(nth_parent_machine, 0, link_name); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_bulk_count(nth_parent_machine, 0, input_line_count); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(matrix)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_machine_link_test_ffplayer_0() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint input_tab; guint nth_parent_machine; guint nth_machine; gboolean success; /* add ffplayer #0 */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve ffplayer #0 */ nth_parent_machine = 2; nth_machine = 6; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ ffplayer_0 = list->data; }else{ ffplayer_0 = NULL; } CU_ASSERT(ffplayer_0 != NULL); /* * link slave mixer with ffplayer #0 */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(ffplayer_0), AGS_MACHINE(ffplayer_0)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 2, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 2, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_ffplayer_1() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint input_tab; guint nth_parent_machine; guint nth_machine; gboolean success; /* add ffplayer #1 */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); /* */ ags_test_enter(); /* retrieve ffplayer #1 */ nth_parent_machine = 2; nth_machine = 7; list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ ffplayer_1 = list->data; }else{ ffplayer_1 = NULL; } CU_ASSERT(ffplayer_1 != NULL); /* * link slave mixer with ffplayer #1 */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(ffplayer_1), AGS_MACHINE(ffplayer_1)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 3, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 3, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* hide */ success = ags_functional_test_util_machine_hide(nth_machine); CU_ASSERT(success == TRUE); } #endif void ags_functional_machine_link_test_relink_all() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint input_tab; guint nth_parent_machine; guint nth_machine; gboolean success; #ifdef AGS_WITH_LIBINSTPATCH /* * relink slave mixer with ffplayer #0 */ /* */ nth_parent_machine = 2; nth_machine = 6; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(ffplayer_0), AGS_MACHINE(ffplayer_0)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 7, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 7, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); #endif /* * relink slave mixer with drum */ /* */ nth_parent_machine = 2; nth_machine = 3; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(drum), AGS_MACHINE(drum)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 6, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 6, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* * relink slave mixer with matrix */ /* */ nth_parent_machine = 2; nth_machine = 4; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(matrix), AGS_MACHINE(matrix)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 0, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 0, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_reset_link_all() { GtkDialog *properties; GList *list_start, *list; gchar *link_name; guint resize_tab; guint input_tab; guint nth_parent_machine; guint nth_machine; gboolean success; #ifdef AGS_WITH_LIBINSTPATCH /* * reset link slave mixer with ffplayer #0 */ /* */ nth_parent_machine = 2; nth_machine = 6; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(ffplayer_0), AGS_MACHINE(ffplayer_0)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 0, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 0, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); #endif /* * reset link slave mixer with drum */ /* */ nth_parent_machine = 2; nth_machine = 3; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(drum), AGS_MACHINE(drum)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 1, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 1, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* * reset link slave mixer with matrix */ /* */ nth_parent_machine = 2; nth_machine = 4; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(matrix), AGS_MACHINE(matrix)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 1, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 1, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); /* * reset link slave mixer with drum */ /* */ nth_parent_machine = 2; nth_machine = 3; /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_parent_machine); CU_ASSERT(success == TRUE); /* click tab */ input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB; success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine, input_tab); CU_ASSERT(success == TRUE); /* click enable */ success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine); CU_ASSERT(success == TRUE); /* set link */ ags_test_enter(); link_name = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(drum), AGS_MACHINE(drum)->machine_name); ags_test_leave(); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 2, 0, link_name, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine, 2, 1, link_name, 1); CU_ASSERT(success == TRUE); /* response ok */ ags_test_enter(); properties = AGS_MACHINE(slave_mixer)->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(properties); CU_ASSERT(success == TRUE); } void ags_functional_machine_link_test_destroy_all() { gboolean success; /* destroy master mixer */ success = ags_functional_test_util_machine_destroy(1); CU_ASSERT(success == TRUE); /* destroy master panel */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); /* destroy matrix */ success = ags_functional_test_util_machine_destroy(2); CU_ASSERT(success == TRUE); /* destroy drum */ success = ags_functional_test_util_machine_destroy(1); CU_ASSERT(success == TRUE); /* destroy slave mixer */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); /* destroy synth */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); #ifdef AGS_WITH_LIBINSTPATCH /* destroy ffplayer #0 */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); /* destroy ffplayer #1 */ success = ags_functional_test_util_machine_destroy(0); CU_ASSERT(success == TRUE); #endif } int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalMachineLinkTest", ags_functional_machine_link_test_init_suite, ags_functional_machine_link_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_MACHINE_LINK_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_machine_link_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/ags_functional_line_member_add_and_destroy_test.c0000644000175000017500000011361313607210263024505 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_line_member_add_and_destroy_test_add_test(); int ags_functional_line_member_add_and_destroy_test_init_suite(); int ags_functional_line_member_add_and_destroy_test_clean_suite(); void ags_functional_line_member_add_and_destroy_test_panel(); void ags_functional_line_member_add_and_destroy_test_mixer(); void ags_functional_line_member_add_and_destroy_test_drum(); void ags_functional_line_member_add_and_destroy_test_matrix(); void ags_functional_line_member_add_and_destroy_test_synth(); #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_line_member_add_and_destroy_test_ffplayer(); #endif #define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT "/usr/lib/ladspa/cmt.so" #define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY "Echo Delay Line (Maximum Delay 1s)" #define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB "Freeverb (Version 3)" #define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH "/usr/lib/lv2/gverb-swh.lv2/plugin-linux.so" #define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB "GVerb" #define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_line_member_add_and_destroy_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsPanel", ags_functional_line_member_add_and_destroy_test_panel) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsMixer", ags_functional_line_member_add_and_destroy_test_mixer) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsDrum", ags_functional_line_member_add_and_destroy_test_drum) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsMatrix", ags_functional_line_member_add_and_destroy_test_matrix) == NULL) || (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsSynth", ags_functional_line_member_add_and_destroy_test_synth) == NULL) #ifdef AGS_WITH_LIBINSTPATCH || (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsFFPlayer", ags_functional_line_member_add_and_destroy_test_ffplayer) == NULL) #endif ){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_line_member_add_and_destroy_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_line_member_add_and_destroy_test_clean_suite() { return(0); } void ags_functional_line_member_add_and_destroy_test_panel() { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; AgsPluginBrowser *plugin_browser; GList *list_start, *list; struct _AgsFunctionalTestUtilContainerTest container_test; guint nth_machine; guint nth_pad, nth_audio_channel; gboolean success; xorg_application_context = ags_application_context; /* add panel */ success = ags_functional_test_util_add_machine(NULL, "Panel"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ nth_machine = 0; container_test.container = &(AGS_WINDOW(xorg_application_context->window)->machines); container_test.count = nth_machine + 1; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), ags_functional_test_util_get_default_timeout(), &container_test); ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_PANEL(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add line member to input */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and delay */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and freeverb */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = AGS_MACHINE(machine)->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add lv2 effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* lv2 */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "Lv2"); CU_ASSERT(success == TRUE); /* lv2 and gverb */ success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* * destroy effects */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* remove effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 2); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* destroy panel */ success = ags_functional_test_util_machine_destroy(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_line_member_add_and_destroy_test_mixer() { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; AgsPluginBrowser *plugin_browser; GList *list_start, *list; struct _AgsFunctionalTestUtilContainerTest container_test; guint nth_machine; guint nth_pad, nth_audio_channel; gboolean success; xorg_application_context = ags_application_context; /* add mixer */ success = ags_functional_test_util_add_machine(NULL, "Mixer"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ nth_machine = 0; container_test.container = &(AGS_WINDOW(xorg_application_context->window)->machines); container_test.count = nth_machine + 1; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), ags_functional_test_util_get_default_timeout(), &container_test); ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MIXER(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add line member to input */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and delay */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and freeverb */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = AGS_MACHINE(machine)->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add lv2 effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* lv2 */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "Lv2"); CU_ASSERT(success == TRUE); /* lv2 and gverb */ success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* * destroy effects */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* remove effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 2); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* destroy mixer */ success = ags_functional_test_util_machine_destroy(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_line_member_add_and_destroy_test_drum() { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; AgsPluginBrowser *plugin_browser; GList *list_start, *list; struct _AgsFunctionalTestUtilContainerTest container_test; guint nth_machine; guint nth_pad, nth_audio_channel; gboolean success; xorg_application_context = ags_application_context; /* add drum */ success = ags_functional_test_util_add_machine(NULL, "Drum"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ nth_machine = 0; container_test.container = &(AGS_WINDOW(xorg_application_context->window)->machines); container_test.count = nth_machine + 1; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), ags_functional_test_util_get_default_timeout(), &container_test); ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_DRUM(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add line member to input */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and delay */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and freeverb */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = AGS_MACHINE(machine)->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add lv2 effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* lv2 */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "Lv2"); CU_ASSERT(success == TRUE); /* lv2 and gverb */ success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* * destroy effects */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* remove effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 2); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* destroy drum */ success = ags_functional_test_util_machine_destroy(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_line_member_add_and_destroy_test_matrix() { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; GList *list_start, *list; struct _AgsFunctionalTestUtilContainerTest container_test; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; /* add matrix */ success = ags_functional_test_util_add_machine(NULL, "Matrix"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ nth_machine = 0; container_test.container = &(AGS_WINDOW(xorg_application_context->window)->machines); container_test.count = nth_machine + 1; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), ags_functional_test_util_get_default_timeout(), &container_test); ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_MATRIX(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); //TODO:JK: /* destroy matrix */ success = ags_functional_test_util_machine_destroy(nth_machine); CU_ASSERT(success == TRUE); } void ags_functional_line_member_add_and_destroy_test_synth() { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; GList *list_start, *list; struct _AgsFunctionalTestUtilContainerTest container_test; guint nth_machine; gboolean success; xorg_application_context = ags_application_context; /* add synth */ success = ags_functional_test_util_add_machine(NULL, "Synth"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ nth_machine = 0; container_test.container = &(AGS_WINDOW(xorg_application_context->window)->machines); container_test.count = nth_machine + 1; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), ags_functional_test_util_get_default_timeout(), &container_test); ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_SYNTH(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); //TODO:JK: /* destroy synth */ success = ags_functional_test_util_machine_destroy(nth_machine); CU_ASSERT(success == TRUE); } #ifdef AGS_WITH_LIBINSTPATCH void ags_functional_line_member_add_and_destroy_test_ffplayer() { AgsXorgApplicationContext *xorg_application_context; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; AgsPluginBrowser *plugin_browser; GList *list_start, *list; struct _AgsFunctionalTestUtilContainerTest container_test; guint nth_machine; guint nth_pad, nth_audio_channel; gboolean success; xorg_application_context = ags_application_context; /* add fplayer */ success = ags_functional_test_util_add_machine(NULL, "FPlayer"); CU_ASSERT(success == TRUE); ags_functional_test_util_idle(); /* get machine */ nth_machine = 0; container_test.container = &(AGS_WINDOW(xorg_application_context->window)->machines); container_test.count = nth_machine + 1; ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count), ags_functional_test_util_get_default_timeout(), &container_test); ags_test_enter(); list_start = gtk_container_get_children(AGS_WINDOW(xorg_application_context->window)->machines); list = g_list_nth(list_start, nth_machine); ags_test_leave(); if(list != NULL && AGS_IS_FFPLAYER(list->data)){ machine = list->data; }else{ machine = NULL; } CU_ASSERT(machine != NULL); /* * add line member to input */ /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and delay */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* add ladspa effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* ladspa */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "LADSPA"); CU_ASSERT(success == TRUE); /* cmt and freeverb */ success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = AGS_MACHINE(machine)->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* add lv2 effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_add(nth_machine, nth_pad, nth_audio_channel); CU_ASSERT(success == TRUE); /* lv2 */ success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine, nth_pad, nth_audio_channel, "Lv2"); CU_ASSERT(success == TRUE); /* lv2 and gverb */ success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine, nth_pad, nth_audio_channel, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; line_editor = ags_functional_test_util_get_line_editor(machine_editor, nth_pad, nth_audio_channel, FALSE); plugin_browser = line_editor->member_editor->plugin_browser; ags_test_leave(); success = ags_functional_test_util_dialog_ok(plugin_browser); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* open properties */ success = ags_functional_test_util_machine_properties_open(nth_machine); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_click_tab(nth_machine, AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB); /* remove effect */ nth_pad = 0; nth_audio_channel = 0; success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 2); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); success = ags_functional_test_util_machine_properties_effect_remove(nth_machine, nth_pad, nth_audio_channel, 0); CU_ASSERT(success == TRUE); /* response OK */ ags_test_enter(); machine_editor = machine->properties; ags_test_leave(); success = ags_functional_test_util_dialog_ok(machine_editor); CU_ASSERT(success == TRUE); /* destroy fplayer */ success = ags_functional_test_util_machine_destroy(nth_machine); CU_ASSERT(success == TRUE); } #endif int main(int argc, char **argv) { /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFuncitonalLineMemberAddAndDestroyTest", ags_functional_line_member_add_and_destroy_test_init_suite, ags_functional_line_member_add_and_destroy_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); ags_test_init(&argc, &argv, AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_CONFIG); ags_functional_test_util_do_run(argc, argv, ags_functional_line_member_add_and_destroy_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/ags_functional_audio_config_test.c0000644000175000017500000001566313607210263021460 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_audio_config_test_add_test(); int ags_functional_audio_config_test_init_suite(); int ags_functional_audio_config_test_clean_suite(); void ags_functional_audio_config_test_file_setup(); #define AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_SHRINK_BUFFER_SIZE (512) #define AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_GROW_BUFFER_SIZE (1024) #define AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_GROW_SAMPLERATE (48000) #define AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_SHRINK_SAMPLERATE (44100) #define AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_FILE_SETUP_FILENAME SRCDIR "/" "ags_functional_audio_config_test.xml" #define AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; AgsApplicationContext *application_context; void ags_functional_audio_config_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer setup by file and configuring audio", ags_functional_audio_config_test_file_setup) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_audio_config_test_init_suite() { application_context = ags_application_context_get_instance(); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_audio_config_test_clean_suite() { return(0); } void ags_functional_audio_config_test_file_setup() { AgsXorgApplicationContext *xorg_application_context; GtkWidget *preferences; gboolean success; while(!ags_ui_provider_get_gui_ready(AGS_UI_PROVIDER(application_context))){ usleep(500000); } usleep(500000); ags_test_enter(); xorg_application_context = ags_application_context_get_instance(); ags_test_leave(); /* shrink buffer size */ success = ags_functional_test_util_preferences_open(); CU_ASSERT(success == TRUE); ags_test_enter(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); success = ags_functional_test_util_audio_preferences_buffer_size(0, AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_SHRINK_BUFFER_SIZE); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(preferences); CU_ASSERT(success == TRUE); /* grow buffer size */ success = ags_functional_test_util_preferences_open(); CU_ASSERT(success == TRUE); ags_test_enter(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); success = ags_functional_test_util_audio_preferences_buffer_size(0, AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_GROW_BUFFER_SIZE); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(preferences); CU_ASSERT(success == TRUE); /* grow samplerate */ success = ags_functional_test_util_preferences_open(); CU_ASSERT(success == TRUE); ags_test_enter(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); success = ags_functional_test_util_audio_preferences_samplerate(0, AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_GROW_SAMPLERATE); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(preferences); CU_ASSERT(success == TRUE); /* shrink samplerate */ success = ags_functional_test_util_preferences_open(); CU_ASSERT(success == TRUE); ags_test_enter(); preferences = AGS_WINDOW(xorg_application_context->window)->preferences; ags_test_leave(); success = ags_functional_test_util_audio_preferences_samplerate(0, AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_SHRINK_SAMPLERATE); CU_ASSERT(success == TRUE); success = ags_functional_test_util_dialog_ok(preferences); CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { char **new_argv; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFuncitonalAudioConfigTest", ags_functional_audio_config_test_init_suite, ags_functional_audio_config_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } g_atomic_int_set(&is_available, FALSE); new_argv = (char **) malloc((argc + 3) * sizeof(char *)); memcpy(new_argv, argv, argc * sizeof(char **)); new_argv[argc] = "--filename"; new_argv[argc + 1] = AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_FILE_SETUP_FILENAME; new_argv[argc + 2] = NULL; argc += 2; ags_test_init(&argc, &new_argv, AGS_FUNCTIONAL_AUDIO_CONFIG_TEST_CONFIG); ags_functional_test_util_do_run(argc, new_argv, ags_functional_audio_config_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/X/ags_functional_notation_edit_test.c0000644000175000017500000001456113607210263021666 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include "gsequencer_setup_util.h" #include "ags_functional_test_util.h" void ags_functional_notation_edit_test_add_test(); int ags_functional_notation_edit_test_init_suite(); int ags_functional_notation_edit_test_clean_suite(); void ags_functional_notation_edit_test_quit_stub(AgsApplicationContext *application_context); void ags_functional_notation_edit_test_file_setup(); #define AGS_FUNCTIONAL_NOTATION_EDIT_TEST_FILE_SETUP_FILENAME SRCDIR "/" "ags_functional_notation_edit_test.xml" #define AGS_FUNCTIONAL_NOTATION_EDIT_TEST_FILE_SETUP_PLAYBACK_COUNT (3) #define AGS_FUNCTIONAL_NOTATION_EDIT_TEST_FILE_SETUP_PLAYBACK_DURATION (30) #define AGS_FUNCTIONAL_NOTATION_EDIT_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" CU_pSuite pSuite = NULL; volatile gboolean is_available; extern AgsApplicationContext *ags_application_context; void ags_functional_notation_edit_test_add_test() { /* add the tests to the suite */ if((CU_add_test(pSuite, "functional test of GSequencer setup by file and editing notes", ags_functional_notation_edit_test_file_setup) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); ags_test_quit(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_notation_edit_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_notation_edit_test_clean_suite() { return(0); } void ags_functional_notation_edit_test_quit_stub(AgsApplicationContext *application_context) { g_critical("quit stub"); } void ags_functional_notation_edit_test_file_setup() { GtkButton *play_button; GtkButton *stop_button; struct timespec start_time, current_time; guint i; gboolean expired; gboolean success; while(!g_atomic_int_get(&(AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->file_ready))){ usleep(500000); } usleep(500000); /* get buttons */ ags_test_enter(); play_button = AGS_WINDOW(AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->window)->navigation->play; stop_button = AGS_WINDOW(AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->window)->navigation->stop; ags_test_leave(); /* get initial time */ success = TRUE; for(i = 0; success && i < AGS_FUNCTIONAL_NOTATION_EDIT_TEST_FILE_SETUP_PLAYBACK_COUNT; i++){ clock_gettime(CLOCK_MONOTONIC, &start_time); expired = FALSE; g_message("start playback"); ags_functional_test_util_button_click(play_button); while(!expired){ /* check expired */ clock_gettime(CLOCK_MONOTONIC, ¤t_time); if(start_time.tv_sec + AGS_FUNCTIONAL_NOTATION_EDIT_TEST_FILE_SETUP_PLAYBACK_DURATION < current_time.tv_sec){ expired = TRUE; } } g_message("stop playback"); ags_functional_test_util_button_click(stop_button); /* wait some time before next playback */ usleep(5000000); if(!expired){ success = FALSE; } } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { char **new_argv; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalNoteEditTest", ags_functional_notation_edit_test_init_suite, ags_functional_notation_edit_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } #if 0 g_log_set_fatal_mask("GLib-GObject", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("Gtk", G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask(NULL, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); #endif g_atomic_int_set(&is_available, FALSE); new_argv = (char **) malloc((argc + 3) * sizeof(char *)); memcpy(new_argv, argv, argc * sizeof(char **)); new_argv[argc] = "--filename"; new_argv[argc + 1] = AGS_FUNCTIONAL_NOTATION_EDIT_TEST_FILE_SETUP_FILENAME; new_argv[argc + 2] = NULL; argc += 2; ags_test_init(&argc, &new_argv, AGS_FUNCTIONAL_NOTATION_EDIT_TEST_CONFIG); ags_functional_test_util_do_run(argc, new_argv, ags_functional_notation_edit_test_add_test, &is_available); g_thread_join(ags_functional_test_util_test_runner_thread()); return(-1); } gsequencer-3.1.3/ags/test/audio/0000755000175000017500000000000013622252263013515 500000000000000gsequencer-3.1.3/ags/test/audio/ags_midi_test.c0000644000175000017500000001336613605312646016430 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_midi_test_init_suite(); int ags_midi_test_clean_suite(); void ags_midi_test_find_near_timestamp(); void ags_midi_test_add_track(); void ags_midi_test_remove_track(); #define AGS_MIDI_TEST_FIND_NEAR_TIMESTAMP_N_MIDI (8) #define AGS_MIDI_TEST_ADD_TRACK_COUNT (1024) #define AGS_MIDI_TEST_REMOVE_TRACK_TRACK_SIZE (64) #define AGS_MIDI_TEST_REMOVE_TRACK_COUNT (1024) #define AGS_MIDI_TEST_REMOVE_TRACK_REMOVE_COUNT (256) AgsAudio *audio; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midi_test_init_suite() { audio = ags_audio_new(NULL); g_object_ref(audio); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midi_test_clean_suite() { g_object_unref(audio); return(0); } void ags_midi_test_find_near_timestamp() { AgsMidi **midi; AgsTimestamp *timestamp; GList *list, *current; guint i; midi = (AgsMidi **) malloc(AGS_MIDI_TEST_FIND_NEAR_TIMESTAMP_N_MIDI * sizeof(AgsMidi *)); list = NULL; for(i = 0; i < AGS_MIDI_TEST_FIND_NEAR_TIMESTAMP_N_MIDI; i++){ /* nth midi */ midi[i] = ags_midi_new(audio, 0); timestamp = midi[i]->timestamp; timestamp->timer.ags_offset.offset = i * AGS_MIDI_DEFAULT_OFFSET; list = g_list_prepend(list, midi[i]); } list = g_list_reverse(list); /* instantiate timestamp to check against */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; /* assert find */ for(i = 0; i < AGS_MIDI_TEST_FIND_NEAR_TIMESTAMP_N_MIDI; i++){ timestamp->timer.ags_offset.offset = i * AGS_MIDI_DEFAULT_OFFSET; current = ags_midi_find_near_timestamp(list, 0, timestamp); CU_ASSERT(current != NULL && current->data == midi[i]); } } void ags_midi_test_add_track() { AgsMidi *midi; AgsTrack *track; GList *list; guint64 x; guint i; gboolean success; /* create midi */ midi = ags_midi_new(audio, 0); for(i = 0; i < AGS_MIDI_TEST_ADD_TRACK_COUNT; i++){ x = i * AGS_MIDI_DEFAULT_OFFSET; track = ags_track_new(); g_object_set(track, "x", x, NULL); ags_midi_add_track(midi, track, FALSE); } /* assert position */ list = midi->track; success = TRUE; for(i = 0; i < AGS_MIDI_TEST_ADD_TRACK_COUNT; i++){ if(list->prev != NULL){ if(AGS_TRACK(list->prev->data)->x > AGS_TRACK(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_midi_test_remove_track() { AgsMidi *midi; AgsTrack *track; GList *list; GList *current; guint64 nth; guint64 x; guint i; gboolean success; /* create midi */ midi = ags_midi_new(audio, 0); g_object_set(midi, NULL); for(i = 0; i < AGS_MIDI_TEST_REMOVE_TRACK_COUNT; i++){ x = i * AGS_MIDI_TEST_REMOVE_TRACK_TRACK_SIZE; track = ags_track_new(); g_object_set(track, "x", x, NULL); ags_midi_add_track(midi, track, FALSE); } for(i = 0; i < AGS_MIDI_TEST_REMOVE_TRACK_REMOVE_COUNT; i++){ nth = rand() % (AGS_MIDI_TEST_REMOVE_TRACK_COUNT - i); current = g_list_nth(midi->track, nth); ags_midi_remove_track(midi, current->data, FALSE); } /* assert position */ list = midi->track; success = TRUE; for(i = 0; i < AGS_MIDI_TEST_REMOVE_TRACK_COUNT - AGS_MIDI_TEST_REMOVE_TRACK_REMOVE_COUNT; i++){ if(list->prev != NULL){ if(AGS_TRACK(list->prev->data)->x > AGS_TRACK(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMidiTest", ags_midi_test_init_suite, ags_midi_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMidi find near timestamp", ags_midi_test_find_near_timestamp) == NULL) || (CU_add_test(pSuite, "test of AgsMidi add track", ags_midi_test_add_track) == NULL) || (CU_add_test(pSuite, "test of AgsMidi remove track", ags_midi_test_remove_track) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recycling_context_test.c0000644000175000017500000004523213605312646021226 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_recycling_context_test_init_suite(); int ags_recycling_context_test_clean_suite(); void ags_recycling_context_test_find_scope(); void ags_recycling_context_test_replace(); void ags_recycling_context_test_add(); void ags_recycling_context_test_remove(); void ags_recycling_context_test_insert(); void ags_recycling_context_test_get_toplevel(); void ags_recycling_context_test_find(); void ags_recycling_context_test_find_child(); void ags_recycling_context_test_find_parent(); void ags_recycling_context_test_add_child(); void ags_recycling_context_test_remove_child(); void ags_recycling_context_test_get_child_recall_id(); void ags_recycling_context_test_reset_recycling(); #define AGS_RECYCLING_CONTEXT_TEST_REPLACE_RECYCLING_COUNT (9) #define AGS_RECYCLING_CONTEXT_TEST_ADD_RECYCLING_COUNT (7) #define AGS_RECYCLING_CONTEXT_TEST_REMOVE_RECYCLING_COUNT (7) #define AGS_RECYCLING_CONTEXT_TEST_INSERT_RECYCLING_COUNT (88) #define AGS_RECYCLING_CONTEXT_TEST_GET_TOPLEVEL_NESTING_LEVEL (5) #define AGS_RECYCLING_CONTEXT_TEST_FIND_RECYCLING_COUNT (88) #define AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_CHILD_COUNT (5) #define AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_RECYCLING_COUNT (4) #define AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_CHILD_COUNT (5) #define AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_RECYCLING_COUNT (4) #define AGS_RECYCLING_CONTEXT_TEST_GET_CHILD_RECALL_ID_CHILD_COUNT (5) #define AGS_RECYCLING_CONTEXT_TEST_GET_CHILD_RECALL_ID_RECYCLING_COUNT (4) #define AGS_RECYCLING_CONTEXT_TEST_RESET_RECYCLING_RECYCLING_COUNT (4) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recycling_context_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recycling_context_test_clean_suite() { return(0); } void ags_recycling_context_test_find_scope() { AgsRecyclingContext **recycling_context; GList *list; GList *current; recycling_context = (AgsRecyclingContext **) malloc(AGS_SOUND_SCOPE_LAST * sizeof(AgsRecyclingContext *)); list = NULL; recycling_context[AGS_SOUND_SCOPE_PLAYBACK] = ags_recycling_context_new(0); recycling_context[AGS_SOUND_SCOPE_PLAYBACK]->sound_scope = AGS_SOUND_SCOPE_PLAYBACK; list = g_list_prepend(list, recycling_context[AGS_SOUND_SCOPE_PLAYBACK]); recycling_context[AGS_SOUND_SCOPE_SEQUENCER] = ags_recycling_context_new(0); recycling_context[AGS_SOUND_SCOPE_SEQUENCER]->sound_scope = AGS_SOUND_SCOPE_SEQUENCER; list = g_list_prepend(list, recycling_context[AGS_SOUND_SCOPE_SEQUENCER]); recycling_context[AGS_SOUND_SCOPE_NOTATION] = ags_recycling_context_new(0); recycling_context[AGS_SOUND_SCOPE_NOTATION]->sound_scope = AGS_SOUND_SCOPE_NOTATION; list = g_list_prepend(list, recycling_context[AGS_SOUND_SCOPE_NOTATION]); recycling_context[AGS_SOUND_SCOPE_WAVE] = ags_recycling_context_new(0); recycling_context[AGS_SOUND_SCOPE_WAVE]->sound_scope = AGS_SOUND_SCOPE_WAVE; list = g_list_prepend(list, recycling_context[AGS_SOUND_SCOPE_WAVE]); recycling_context[AGS_SOUND_SCOPE_MIDI] = ags_recycling_context_new(0); recycling_context[AGS_SOUND_SCOPE_MIDI]->sound_scope = AGS_SOUND_SCOPE_MIDI; list = g_list_prepend(list, recycling_context[AGS_SOUND_SCOPE_MIDI]); list = g_list_reverse(list); /* test */ current = ags_recycling_context_find_scope(list, AGS_SOUND_SCOPE_PLAYBACK); CU_ASSERT(current->data == recycling_context[AGS_SOUND_SCOPE_PLAYBACK]); current = ags_recycling_context_find_scope(list, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(current->data == recycling_context[AGS_SOUND_SCOPE_SEQUENCER]); current = ags_recycling_context_find_scope(list, AGS_SOUND_SCOPE_NOTATION); CU_ASSERT(current->data == recycling_context[AGS_SOUND_SCOPE_NOTATION]); current = ags_recycling_context_find_scope(list, AGS_SOUND_SCOPE_WAVE); CU_ASSERT(current->data == recycling_context[AGS_SOUND_SCOPE_WAVE]); current = ags_recycling_context_find_scope(list, AGS_SOUND_SCOPE_MIDI); CU_ASSERT(current->data == recycling_context[AGS_SOUND_SCOPE_MIDI]); } void ags_recycling_context_test_replace() { AgsRecycling **recycling; AgsRecyclingContext *recycling_context; guint i; gboolean success; recycling = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_REPLACE_RECYCLING_COUNT * sizeof(AgsRecycling *)); recycling_context = ags_recycling_context_new((guint64) AGS_RECYCLING_CONTEXT_TEST_REPLACE_RECYCLING_COUNT); success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_REPLACE_RECYCLING_COUNT; i++){ recycling[i] = ags_recycling_new(NULL); ags_recycling_context_replace(recycling_context, recycling[i], i); if(recycling_context->recycling[i] != recycling[i]){ success = FALSE; break; } } CU_ASSERT(success); } void ags_recycling_context_test_add() { AgsRecycling **recycling; AgsRecyclingContext *recycling_context; guint i; gboolean success; recycling = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_ADD_RECYCLING_COUNT * sizeof(AgsRecycling *)); recycling_context = ags_recycling_context_new(0); success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_ADD_RECYCLING_COUNT; i++){ recycling[i] = ags_recycling_new(NULL); ags_recycling_context_add(recycling_context, recycling[i]); if(recycling_context->recycling[i] != recycling[i] || recycling_context->length != i + 1){ success = FALSE; break; } } CU_ASSERT(success); } void ags_recycling_context_test_remove() { AgsRecycling **recycling; AgsRecyclingContext *recycling_context; guint i, j; gboolean success; recycling = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_REMOVE_RECYCLING_COUNT * sizeof(AgsRecycling *)); recycling_context = ags_recycling_context_new((guint64) AGS_RECYCLING_CONTEXT_TEST_REMOVE_RECYCLING_COUNT); for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_REMOVE_RECYCLING_COUNT; i++){ recycling[i] = ags_recycling_new(NULL); ags_recycling_context_replace(recycling_context, recycling[i], i); } /* test */ success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_REMOVE_RECYCLING_COUNT && success; i++){ ags_recycling_context_remove(recycling_context, recycling[i]); if(recycling_context->length != 0){ for(j = 0; AGS_RECYCLING_CONTEXT_TEST_REMOVE_RECYCLING_COUNT - (j + i + 1) > 1; j++){ if(recycling_context->recycling[j] != recycling[i + j + 1]){ success = FALSE; break; } } } if(recycling_context->length == 0){ if(recycling_context->recycling != NULL){ success = FALSE; break; } } } CU_ASSERT(success); } void ags_recycling_context_test_insert() { AgsRecycling **recycling; AgsRecyclingContext *recycling_context; gint position; guint i, j; gboolean success; recycling = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_INSERT_RECYCLING_COUNT * sizeof(AgsRecycling *)); recycling_context = ags_recycling_context_new(0); success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_INSERT_RECYCLING_COUNT; i++){ recycling[i] = ags_recycling_new(NULL); } /* test */ for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_INSERT_RECYCLING_COUNT; i++){ if(i > 0){ position = rand() % i; }else{ position = 0; } ags_recycling_context_insert(recycling_context, recycling[i], position); if(recycling_context->recycling[position] != recycling[i]){ success = FALSE; break; } } CU_ASSERT(success); } void ags_recycling_context_test_get_toplevel() { AgsRecyclingContext *toplevel; AgsRecyclingContext *recycling_context, *current; guint i; toplevel = ags_recycling_context_new(0); current = toplevel; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_GET_TOPLEVEL_NESTING_LEVEL; i++){ recycling_context = ags_recycling_context_new(0); ags_recycling_context_add_child(current, recycling_context); current = recycling_context; } CU_ASSERT(ags_recycling_context_get_toplevel(toplevel) == toplevel); CU_ASSERT(ags_recycling_context_get_toplevel(current) == toplevel); } void ags_recycling_context_test_find() { AgsRecycling **recycling; AgsRecyclingContext *recycling_context; gint position; guint i; gboolean success; recycling = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_FIND_RECYCLING_COUNT * sizeof(AgsRecycling *)); recycling_context = ags_recycling_context_new((guint64) AGS_RECYCLING_CONTEXT_TEST_FIND_RECYCLING_COUNT); for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_RECYCLING_COUNT; i++){ recycling[i] = ags_recycling_new(NULL); ags_recycling_context_replace(recycling_context, recycling[i], i); } /* test */ success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_RECYCLING_COUNT; i++){ position = ags_recycling_context_find(recycling_context, recycling[i]); if(position != i){ success = FALSE; break; } } CU_ASSERT(success); CU_ASSERT(ags_recycling_context_find(recycling_context, NULL) == -1); } void ags_recycling_context_test_find_child() { AgsRecycling ***recycling; AgsRecyclingContext *recycling_context; AgsRecyclingContext **child; gint position; guint i, j; gboolean success; recycling_context = ags_recycling_context_new(0); child = (AgsRecyclingContext **) malloc(AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_CHILD_COUNT * sizeof(AgsRecyclingContext *)); recycling = (AgsRecycling ***) malloc(AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_CHILD_COUNT * sizeof(AgsRecycling **)); for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_CHILD_COUNT; i++){ child[i] = ags_recycling_context_new((guint64) AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_RECYCLING_COUNT); ags_recycling_context_add_child(recycling_context, child[i]); recycling[i] = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_RECYCLING_COUNT * sizeof(AgsRecycling *)); for(j = 0; j < AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_RECYCLING_COUNT; j++){ recycling[i][j] = ags_recycling_new(NULL); ags_recycling_context_replace(child[i], recycling[i][j], j); } } /* test */ success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_CHILD_COUNT; i++){ for(j = 0; j < AGS_RECYCLING_CONTEXT_TEST_FIND_CHILD_RECYCLING_COUNT; j++){ position = ags_recycling_context_find_child(recycling_context, recycling[i][j]); if(position == -1){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_recycling_context_test_find_parent() { AgsRecycling **recycling; AgsRecyclingContext *recycling_context; AgsRecyclingContext **child; gint position; guint i; gboolean success; recycling_context = ags_recycling_context_new((guint64) AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_RECYCLING_COUNT); child = (AgsRecyclingContext **) malloc(AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_CHILD_COUNT * sizeof(AgsRecyclingContext *)); recycling = (AgsRecycling **) malloc(AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_RECYCLING_COUNT * sizeof(AgsRecycling *)); for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_RECYCLING_COUNT; i++){ recycling[i] = ags_recycling_new(NULL); ags_recycling_context_replace(recycling_context, recycling[i], i); } for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_CHILD_COUNT; i++){ child[i] = ags_recycling_context_new(0); ags_recycling_context_add_child(recycling_context, child[i]); } /* test */ success = TRUE; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_RECYCLING_COUNT; i++){ position = ags_recycling_context_find_parent(child[rand() % AGS_RECYCLING_CONTEXT_TEST_FIND_PARENT_CHILD_COUNT], recycling[i]); if(position == -1){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_recycling_context_test_add_child() { AgsRecyclingContext *recycling_context; AgsRecyclingContext *child; recycling_context = ags_recycling_context_new(0); child = ags_recycling_context_new(0); ags_recycling_context_add_child(recycling_context, child); CU_ASSERT(child->parent == recycling_context); CU_ASSERT(g_list_find(recycling_context->children, child) != NULL); } void ags_recycling_context_test_remove_child() { AgsRecyclingContext *recycling_context; AgsRecyclingContext *child; recycling_context = ags_recycling_context_new(0); child = ags_recycling_context_new(0); ags_recycling_context_add_child(recycling_context, child); /* test */ ags_recycling_context_remove_child(recycling_context, child); CU_ASSERT(child->parent == NULL); CU_ASSERT(g_list_find(recycling_context->children, child) == NULL); } void ags_recycling_context_test_get_child_recall_id() { AgsRecallID *recall_id; AgsRecallID **child_recall_id; AgsRecyclingContext *recycling_context; AgsRecyclingContext **child; GList *list; gint position; guint i, j; gboolean success; recall_id = ags_recall_id_new(); recycling_context = ags_recycling_context_new(0); g_object_set(recycling_context, "recall-id", recall_id, NULL); g_object_set(recall_id, "recycling-context", recycling_context, NULL); child_recall_id = (AgsRecallID **) malloc(AGS_RECYCLING_CONTEXT_TEST_GET_CHILD_RECALL_ID_CHILD_COUNT * sizeof(AgsRecallID *)); child = (AgsRecyclingContext **) malloc(AGS_RECYCLING_CONTEXT_TEST_GET_CHILD_RECALL_ID_CHILD_COUNT * sizeof(AgsRecyclingContext *)); for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_GET_CHILD_RECALL_ID_CHILD_COUNT; i++){ child_recall_id[i] = ags_recall_id_new(); child[i] = ags_recycling_context_new(0); ags_recycling_context_add_child(recycling_context, child[i]); g_object_set(child[i], "recall-id", child_recall_id[i], NULL); g_object_set(child_recall_id[i], "recycling-context", child[i], NULL); } /* test */ success = TRUE; list = ags_recycling_context_get_child_recall_id(recycling_context); CU_ASSERT(list != NULL); for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_GET_CHILD_RECALL_ID_CHILD_COUNT; i++){ if(g_list_find(list, child_recall_id[i]) == NULL){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_recycling_context_test_reset_recycling() { AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling; AgsRecyclingContext *new_recycling_context, *recycling_context; guint i; gboolean success; recycling_context = ags_recycling_context_new(0); first_recycling = recycling = ags_recycling_new(NULL); for(i = 1; i < AGS_RECYCLING_CONTEXT_TEST_RESET_RECYCLING_RECYCLING_COUNT; i++){ g_object_set(recycling, "next", ags_recycling_new(NULL), NULL); g_object_set(recycling->next, "prev", recycling, NULL); recycling = recycling->next; } last_recycling = recycling; /* test */ success = TRUE; new_recycling_context = ags_recycling_context_reset_recycling(recycling_context, NULL, NULL, first_recycling, last_recycling); CU_ASSERT(new_recycling_context != NULL); CU_ASSERT(new_recycling_context != recycling_context); CU_ASSERT(AGS_IS_RECYCLING_CONTEXT(new_recycling_context)); recycling = first_recycling; for(i = 0; i < AGS_RECYCLING_CONTEXT_TEST_RESET_RECYCLING_RECYCLING_COUNT; i++){ if(new_recycling_context->recycling[i] != recycling){ success = FALSE; break; } recycling = recycling->next; } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecyclingContextTest", ags_recycling_context_test_init_suite, ags_recycling_context_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecyclingContext find scope", ags_recycling_context_test_find_scope) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext replace", ags_recycling_context_test_replace) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext add", ags_recycling_context_test_add) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext remove", ags_recycling_context_test_remove) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext insert", ags_recycling_context_test_insert) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext get toplevel", ags_recycling_context_test_get_toplevel) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext find", ags_recycling_context_test_find) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext find child", ags_recycling_context_test_find_child) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext find parent", ags_recycling_context_test_find_parent) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext add child", ags_recycling_context_test_add_child) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext remove child", ags_recycling_context_test_remove_child) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext get child recall id", ags_recycling_context_test_get_child_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsRecyclingContext reset recycling", ags_recycling_context_test_reset_recycling) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_devin_test.c0000644000175000017500000001053713614062654016611 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_devin_test_init_suite(); int ags_devin_test_clean_suite(); void ags_devin_test_dispose(); void ags_devin_test_finalize(); void ags_devin_test_finalize_stub(GObject *gobject); #define AGS_DEVIN_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsAudioApplicationContext *audio_application_context; gboolean devin_test_finalized; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_devin_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_DEVIN_TEST_CONFIG, strlen(AGS_DEVIN_TEST_CONFIG)); audio_application_context = ags_audio_application_context_new(); g_object_ref(audio_application_context); ags_application_context_prepare(audio_application_context); ags_application_context_setup(audio_application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_devin_test_clean_suite() { g_object_unref(audio_application_context); return(0); } void ags_devin_test_dispose() { AgsDevin *devin; AgsAudio *audio; GList *list, *list_start; guint i; gboolean success; devin = g_object_new(AGS_TYPE_DEVIN, NULL); g_object_ref(devin); /* run dispose */ g_object_run_dispose(devin); success = TRUE; /* assert */ CU_ASSERT(success == TRUE); } void ags_devin_test_finalize() { AgsDevin *devin; AgsAudio *audio; guint i; devin = g_object_new(AGS_TYPE_DEVIN, NULL); /* run dispose */ g_object_run_dispose(devin); /* stub finalize */ devin_test_finalized = FALSE; G_OBJECT_GET_CLASS(devin)->finalize = ags_devin_test_finalize_stub; /* unref and assert */ g_object_unref(devin); CU_ASSERT(devin_test_finalized == TRUE); } void ags_devin_test_finalize_stub(GObject *gobject) { devin_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsDevinTest", ags_devin_test_init_suite, ags_devin_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsDevin doing dispose", ags_devin_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsDevin doing finalize", ags_devin_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_audio_application_context_test.c0000644000175000017500000001454213607210263022725 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #define AGS_AUDIO_APPLICATION_CONTEXT_TEST_DISPOSE_DEVOUT_COUNT (8) int ags_audio_application_context_test_init_suite(); int ags_audio_application_context_test_clean_suite(); void ags_audio_application_context_test_dispose(); void ags_audio_application_context_test_finalize(); void ags_audio_application_context_test_finalize_stub(GObject *gobject); #define AGS_AUDIO_APPLICATION_CONTEXT_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[soundcard-1]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" gboolean audio_application_context_test_finalized; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_application_context_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_application_context_test_clean_suite() { return(0); } void ags_audio_application_context_test_dispose() { AgsAudioApplicationContext *audio_application_context; AgsConfig *config; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_AUDIO_APPLICATION_CONTEXT_TEST_CONFIG, strlen(AGS_AUDIO_APPLICATION_CONTEXT_TEST_CONFIG)); audio_application_context = g_object_new(AGS_TYPE_AUDIO_APPLICATION_CONTEXT, NULL); g_object_ref(audio_application_context); /* run dispose */ g_object_run_dispose(audio_application_context); /* assert */ CU_ASSERT(audio_application_context->thread_pool == NULL); CU_ASSERT(audio_application_context->default_soundcard == NULL); CU_ASSERT(audio_application_context->default_soundcard_thread == NULL); CU_ASSERT(audio_application_context->default_export_thread == NULL); CU_ASSERT(audio_application_context->server == NULL); CU_ASSERT(audio_application_context->soundcard == NULL); CU_ASSERT(audio_application_context->sequencer == NULL); CU_ASSERT(audio_application_context->sound_server == NULL); ags_application_context = NULL; } void ags_audio_application_context_test_finalize() { AgsAudioApplicationContext *audio_application_context; AgsThread *main_loop; GThread *thread; AgsConfig *config; GList *list; gpointer gobject_class; gpointer orig_finalize; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_AUDIO_APPLICATION_CONTEXT_TEST_CONFIG, strlen(AGS_AUDIO_APPLICATION_CONTEXT_TEST_CONFIG)); audio_application_context = g_object_new(AGS_TYPE_AUDIO_APPLICATION_CONTEXT, NULL); /* run dispose */ g_object_run_dispose(audio_application_context); /* stub finalize */ audio_application_context_test_finalized = FALSE; gobject_class = G_OBJECT_GET_CLASS(audio_application_context); orig_finalize = G_OBJECT_CLASS(gobject_class)->finalize; G_OBJECT_CLASS(gobject_class)->finalize = ags_audio_application_context_test_finalize_stub; /* unref and assert */ g_object_unref(audio_application_context); CU_ASSERT(audio_application_context_test_finalized == TRUE); G_OBJECT_CLASS(gobject_class)->finalize = orig_finalize; ags_application_context = NULL; } void ags_audio_application_context_test_finalize_stub(GObject *gobject) { audio_application_context_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C\0"); putenv("LANG=C\0"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAudioApplicationContextTest", ags_audio_application_context_test_init_suite, ags_audio_application_context_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAudioApplicationContext doing dispose", ags_audio_application_context_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsAudioApplicationContext doing finalize", ags_audio_application_context_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_output_test.c0000644000175000017500000001244113605312646017037 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_output_test_init_suite(); int ags_output_test_clean_suite(); void ags_output_test_find_first_input_recycling(); void ags_output_test_find_last_input_recycling(); #define AGS_OUTPUT_TEST_FIND_FIRST_INPUT_RECYCLING_AUDIO_CHANNELS (2) #define AGS_OUTPUT_TEST_FIND_FIRST_INPUT_RECYCLING_OUTPUT_PADS (1) #define AGS_OUTPUT_TEST_FIND_FIRST_INPUT_RECYCLING_INPUT_PADS (8) #define AGS_OUTPUT_TEST_FIND_LAST_INPUT_RECYCLING_AUDIO_CHANNELS (2) #define AGS_OUTPUT_TEST_FIND_LAST_INPUT_RECYCLING_OUTPUT_PADS (1) #define AGS_OUTPUT_TEST_FIND_LAST_INPUT_RECYCLING_INPUT_PADS (8) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_output_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_output_test_clean_suite() { return(0); } void ags_output_test_find_first_input_recycling() { AgsAudio *audio; AgsChannel *current; AgsRecycling *recycling, *first_recycling; guint i; audio = g_object_new(AGS_TYPE_AUDIO, NULL); ags_audio_set_audio_channels(audio, AGS_OUTPUT_TEST_FIND_FIRST_INPUT_RECYCLING_AUDIO_CHANNELS, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_OUTPUT_TEST_FIND_FIRST_INPUT_RECYCLING_OUTPUT_PADS, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_OUTPUT_TEST_FIND_FIRST_INPUT_RECYCLING_INPUT_PADS, 0); /* create some recycling */ current = ags_channel_pad_nth(audio->input, 1); first_recycling = current->first_recycling; for(i = 0; i < 2; i++){ current->first_recycling = current->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); current = current->next_pad; } /* create more recycling */ current = ags_channel_pad_nth(audio->input, 5); for(i = 0; i < 2; i++){ current->first_recycling = current->last_recycling= g_object_new(AGS_TYPE_RECYCLING, NULL); current = current->next_pad; } /* assert */ recycling = ags_output_find_first_input_recycling(audio->output); CU_ASSERT(recycling == first_recycling); } void ags_output_test_find_last_input_recycling() { AgsAudio *audio; AgsChannel *current; AgsRecycling *recycling, *last_recycling; guint i; audio = g_object_new(AGS_TYPE_AUDIO, NULL); ags_audio_set_audio_channels(audio, AGS_OUTPUT_TEST_FIND_LAST_INPUT_RECYCLING_AUDIO_CHANNELS, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_OUTPUT_TEST_FIND_LAST_INPUT_RECYCLING_OUTPUT_PADS, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_OUTPUT_TEST_FIND_LAST_INPUT_RECYCLING_INPUT_PADS, 0); /* create some recycling */ current = ags_channel_pad_nth(audio->input, 1); for(i = 0; i < 2; i++){ current->first_recycling = current->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); current = current->next_pad; } /* create more recycling */ current = ags_channel_pad_nth(audio->input, 5); for(i = 0; i < 2; i++){ current->first_recycling = current->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); current = current->next_pad; } current = ags_channel_pad_nth(audio->input, 7); last_recycling = current->last_recycling; /* assert */ recycling = ags_output_find_last_input_recycling(audio->output); CU_ASSERT(recycling == last_recycling); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOutputTest", ags_output_test_init_suite, ags_output_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOutput find first input recycling", ags_output_test_find_first_input_recycling) == NULL) || (CU_add_test(pSuite, "test of AgsOutput find last input recycling", ags_output_test_find_last_input_recycling) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_automation_test.c0000644000175000017500000010744413605312646017667 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_automation_test_init_suite(); int ags_automation_test_clean_suite(); void ags_automation_test_find_port(); void ags_automation_test_find_near_timestamp(); void ags_automation_test_add_acceleration(); void ags_automation_test_remove_acceleration_at_position(); void ags_automation_test_is_acceleration_selected(); void ags_automation_test_find_point(); void ags_automation_test_find_region(); void ags_automation_test_free_selection(); void ags_automation_test_add_all_to_selection(); void ags_automation_test_add_point_to_selection(); void ags_automation_test_remove_point_from_selection(); void ags_automation_test_add_region_to_selection(); void ags_automation_test_remove_region_from_selection(); void ags_automation_test_copy_selection(); void ags_automation_test_cut_selection(); void ags_automation_test_insert_from_clipboard(); void ags_automation_test_get_current(); void ags_automation_test_get_specifier_unique(); void ags_automation_test_find_specifier(); void ags_automation_test_find_specifier_with_type_and_line(); void ags_automation_test_get_value(); #define AGS_AUTOMATION_TEST_CONTROL_NAME "./ags-test-control" #define AGS_AUTOMATION_TEST_FIND_PORT_N_AUTOMATION (8) #define AGS_AUTOMATION_TEST_FIND_NEAR_TIMESTAMP_N_AUTOMATION (8) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_WIDTH (4096) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_HEIGHT (128) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_STEPS (127) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_LOWER (0.0) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_UPPER (127.0) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_ADD_ACCELERATION_COUNT (1024) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_WIDTH (4096) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_HEIGHT (128) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_STEPS (127) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_LOWER (0.0) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_UPPER (127.0) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_COUNT (1024) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_WIDTH (4096) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_HEIGHT (88) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_STEPS (127) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_LOWER (0.0) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_UPPER (127.0) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_COUNT (1024) #define AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_SELECTION_COUNT (128) #define AGS_AUTOMATION_TEST_FIND_POINT_WIDTH (4096) #define AGS_AUTOMATION_TEST_FIND_POINT_HEIGHT (128) #define AGS_AUTOMATION_TEST_FIND_POINT_STEPS (127) #define AGS_AUTOMATION_TEST_FIND_POINT_LOWER (0.0) #define AGS_AUTOMATION_TEST_FIND_POINT_UPPER (127.0) #define AGS_AUTOMATION_TEST_FIND_POINT_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_FIND_POINT_COUNT (1024) #define AGS_AUTOMATION_TEST_FIND_POINT_N_ATTEMPTS (128) #define AGS_AUTOMATION_TEST_FIND_REGION_WIDTH (4096) #define AGS_AUTOMATION_TEST_FIND_REGION_HEIGHT (88) #define AGS_AUTOMATION_TEST_FIND_REGION_STEPS (127) #define AGS_AUTOMATION_TEST_FIND_REGION_LOWER (0.0) #define AGS_AUTOMATION_TEST_FIND_REGION_UPPER (127.0) #define AGS_AUTOMATION_TEST_FIND_REGION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_FIND_REGION_COUNT (1024) #define AGS_AUTOMATION_TEST_FIND_REGION_N_ATTEMPTS (128) #define AGS_AUTOMATION_TEST_FIND_REGION_SELECTION_WIDTH (128) #define AGS_AUTOMATION_TEST_FIND_REGION_SELECTION_HEIGHT (24) #define AGS_AUTOMATION_TEST_FREE_SELECTION_WIDTH (4096) #define AGS_AUTOMATION_TEST_FREE_SELECTION_HEIGHT (88) #define AGS_AUTOMATION_TEST_FREE_SELECTION_STEPS (127) #define AGS_AUTOMATION_TEST_FREE_SELECTION_LOWER (0.0) #define AGS_AUTOMATION_TEST_FREE_SELECTION_UPPER (127.0) #define AGS_AUTOMATION_TEST_FREE_SELECTION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_FREE_SELECTION_COUNT (1024) #define AGS_AUTOMATION_TEST_FREE_SELECTION_SELECTION_COUNT (64) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_WIDTH (4096) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_HEIGHT (88) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_STEPS (127) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_LOWER (0.0) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_UPPER (127.0) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_COUNT (1024) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_WIDTH (4096) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_HEIGHT (88) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_STEPS (127) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_LOWER (0.0) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_UPPER (127.0) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_COUNT (1024) #define AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_N_ATTEMPTS (128) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_WIDTH (4096) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_HEIGHT (88) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_STEPS (127) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_LOWER (0.0) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_UPPER (127.0) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_COUNT (1024) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_SELECTION_COUNT (128) #define AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_N_ATTEMPTS (64) #define AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_STEPS (127) #define AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_LOWER (0.0) #define AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_UPPER (127.0) #define AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_COUNT (28) #define AGS_AUTOMATION_TEST_FIND_SPECIFIER_STEPS (127) #define AGS_AUTOMATION_TEST_FIND_SPECIFIER_LOWER (0.0) #define AGS_AUTOMATION_TEST_FIND_SPECIFIER_UPPER (127.0) #define AGS_AUTOMATION_TEST_FIND_SPECIFIER_DEFAULT_VALUE (1.0) #define AGS_AUTOMATION_TEST_FIND_SPECIFIER_COUNT (28) AgsAudio *audio; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_automation_test_init_suite() { audio = ags_audio_new(NULL); g_object_ref(audio); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_automation_test_clean_suite() { g_object_unref(audio); return(0); } void ags_automation_test_find_port() { AgsAutomation **automation; AgsPort **port; GList *list, *current; guint i; automation = (AgsAutomation **) malloc(AGS_AUTOMATION_TEST_FIND_PORT_N_AUTOMATION * sizeof(AgsAutomation *)); port = (AgsAutomation **) malloc(AGS_AUTOMATION_TEST_FIND_PORT_N_AUTOMATION * sizeof(AgsPort *)); list = NULL; for(i = 0; i < AGS_AUTOMATION_TEST_FIND_PORT_N_AUTOMATION; i++){ /* nth automation */ automation[i] = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); port[i] = ags_port_new(); g_object_set(automation[i], "port", port[i], NULL); list = g_list_prepend(list, automation[i]); } /* assert find */ for(i = 0; i < AGS_AUTOMATION_TEST_FIND_PORT_N_AUTOMATION; i++){ current = list; current = ags_automation_find_port(current, port[i]); CU_ASSERT(current != NULL && AGS_AUTOMATION(current->data)->port == port[i]); } } void ags_automation_test_find_near_timestamp() { AgsAutomation **automation; AgsTimestamp *timestamp; GList *list, *current; guint i; automation = (AgsAutomation **) malloc(AGS_AUTOMATION_TEST_FIND_NEAR_TIMESTAMP_N_AUTOMATION * sizeof(AgsAutomation *)); list = NULL; for(i = 0; i < AGS_AUTOMATION_TEST_FIND_NEAR_TIMESTAMP_N_AUTOMATION; i++){ /* nth automation */ automation[i] = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); timestamp = automation[i]->timestamp; timestamp->timer.ags_offset.offset = i * AGS_AUTOMATION_DEFAULT_OFFSET; list = g_list_prepend(list, automation[i]); } list = g_list_reverse(list); /* instantiate timestamp to check against */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; /* assert find */ for(i = 0; i < AGS_AUTOMATION_TEST_FIND_NEAR_TIMESTAMP_N_AUTOMATION; i++){ timestamp->timer.ags_offset.offset = i * AGS_AUTOMATION_DEFAULT_OFFSET; current = ags_automation_find_near_timestamp(list, 0, timestamp); CU_ASSERT(current != NULL && current->data == automation[i]); } } void ags_automation_test_add_acceleration() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list; gdouble range; guint x, y; guint i; gboolean success; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_ADD_ACCELERATION_STEPS; automation->lower = AGS_AUTOMATION_TEST_ADD_ACCELERATION_LOWER; automation->upper = AGS_AUTOMATION_TEST_ADD_ACCELERATION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_ADD_ACCELERATION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_ADD_ACCELERATION_UPPER - AGS_AUTOMATION_TEST_ADD_ACCELERATION_LOWER); for(i = 0; i < AGS_AUTOMATION_TEST_ADD_ACCELERATION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_ADD_ACCELERATION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_ADD_ACCELERATION_HEIGHT; acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_ADD_ACCELERATION_LOWER + ((y / AGS_AUTOMATION_TEST_ADD_ACCELERATION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); } /* assert position */ list = automation->acceleration; success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_ADD_ACCELERATION_COUNT; i++){ if(list->prev != NULL){ if(AGS_ACCELERATION(list->prev->data)->x > AGS_ACCELERATION(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); } void ags_automation_test_remove_acceleration_at_position() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current; gdouble range; guint x, y; guint nth; guint i; gboolean success; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_STEPS; automation->lower = AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_LOWER; automation->upper = AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_UPPER - AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_LOWER); for(i = 0; i < AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_HEIGHT; acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_LOWER + ((y / AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); } for(i = 0; i < AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_COUNT; i++){ nth = rand() % (AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_COUNT - i); current = g_list_nth(automation->acceleration, nth); ags_automation_remove_acceleration_at_position(automation, AGS_ACCELERATION(current->data)->x, AGS_ACCELERATION(current->data)->y); } /* assert position */ list = automation->acceleration; success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_COUNT - AGS_AUTOMATION_TEST_REMOVE_ACCELERATION_AT_POSITION_COUNT; i++){ if(list->prev != NULL){ if(AGS_ACCELERATION(list->prev->data)->x > AGS_ACCELERATION(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); } void ags_automation_test_is_acceleration_selected() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current; gdouble range; guint x, y; guint nth; guint i; gboolean success; /* create automation */ automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_STEPS; automation->lower = AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_LOWER; automation->upper = AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_UPPER; automation->default_value = AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_UPPER - AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_LOWER); for(i = 0; i < AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_WIDTH; y = rand() % AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_HEIGHT; acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_LOWER + ((y / AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); } /* select acceleration */ for(i = 0; i < AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_SELECTION_COUNT; i++){ nth = rand() % (AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_COUNT - i); current = g_list_nth(automation->acceleration, nth); ags_automation_add_acceleration(automation, current->data, TRUE); } /* assert position */ list = automation->selection; success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_IS_ACCELERATION_SELECTED_SELECTION_COUNT; i++){ if(list->prev != NULL){ if(AGS_ACCELERATION(list->prev->data)->x > AGS_ACCELERATION(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); } void ags_automation_test_find_point() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current; gdouble range; guint count; guint nth; guint x, y; guint i; gboolean success; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_FIND_POINT_STEPS; automation->lower = AGS_AUTOMATION_TEST_FIND_POINT_LOWER; automation->upper = AGS_AUTOMATION_TEST_FIND_POINT_UPPER; automation->default_value = AGS_AUTOMATION_TEST_FIND_POINT_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_FIND_POINT_UPPER - AGS_AUTOMATION_TEST_FIND_POINT_LOWER); count = 0; for(i = 0; i < AGS_AUTOMATION_TEST_FIND_POINT_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_FIND_POINT_WIDTH; y = rand() % AGS_AUTOMATION_TEST_FIND_POINT_HEIGHT; if(ags_automation_find_point(automation, x, y, FALSE) == NULL){ acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_FIND_POINT_LOWER + ((y / AGS_AUTOMATION_TEST_FIND_POINT_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); count++; } } /* assert find point */ success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_FIND_POINT_N_ATTEMPTS; i++){ nth = rand() % count; current = g_list_nth(automation->acceleration, nth); acceleration = ags_automation_find_point(automation, AGS_ACCELERATION(current->data)->x, AGS_ACCELERATION(current->data)->y, FALSE); if(acceleration->x != AGS_ACCELERATION(current->data)->x || acceleration->y != AGS_ACCELERATION(current->data)->y){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_automation_test_find_region() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current, *region; gdouble range; guint count; guint nth; guint x, y; guint i; gboolean success; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_FIND_REGION_STEPS; automation->lower = AGS_AUTOMATION_TEST_FIND_REGION_LOWER; automation->upper = AGS_AUTOMATION_TEST_FIND_REGION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_FIND_REGION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_FIND_REGION_UPPER - AGS_AUTOMATION_TEST_FIND_REGION_LOWER); count = 0; for(i = 0; i < AGS_AUTOMATION_TEST_FIND_REGION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_FIND_REGION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_FIND_REGION_HEIGHT; if(ags_automation_find_point(automation, x, y, FALSE) == NULL){ acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_FIND_REGION_LOWER + ((y / AGS_AUTOMATION_TEST_FIND_REGION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); count++; } } /* assert find region */ success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_FIND_REGION_N_ATTEMPTS && success; i++){ nth = rand() % count; current = g_list_nth(automation->acceleration, nth); region = ags_automation_find_region(automation, AGS_ACCELERATION(current->data)->x, AGS_ACCELERATION(current->data)->y, AGS_ACCELERATION(current->data)->x + AGS_AUTOMATION_TEST_FIND_REGION_SELECTION_WIDTH, AGS_ACCELERATION(current->data)->y + AGS_AUTOMATION_TEST_FIND_REGION_SELECTION_HEIGHT, FALSE); while(region != NULL){ if(!(AGS_ACCELERATION(region->data)->x >= AGS_ACCELERATION(current->data)->x && AGS_ACCELERATION(current->data)->x < AGS_ACCELERATION(current->data)->x + AGS_AUTOMATION_TEST_FIND_REGION_SELECTION_WIDTH && AGS_ACCELERATION(region->data)->y >= AGS_ACCELERATION(current->data)->y && AGS_ACCELERATION(current->data)->y < AGS_ACCELERATION(current->data)->y + AGS_AUTOMATION_TEST_FIND_REGION_SELECTION_HEIGHT)){ success = FALSE; break; } region = region->next; } } CU_ASSERT(success == TRUE); } void ags_automation_test_free_selection() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current; gdouble range; guint count; guint x, y; guint nth; guint i; /* create automation */ automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_FREE_SELECTION_STEPS; automation->lower = AGS_AUTOMATION_TEST_FREE_SELECTION_LOWER; automation->upper = AGS_AUTOMATION_TEST_FREE_SELECTION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_FREE_SELECTION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_FREE_SELECTION_UPPER - AGS_AUTOMATION_TEST_FREE_SELECTION_LOWER); count = 0; for(i = 0; i < AGS_AUTOMATION_TEST_FREE_SELECTION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_FREE_SELECTION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_FREE_SELECTION_HEIGHT; if(ags_automation_find_point(automation, x, y, FALSE) == NULL){ acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_FREE_SELECTION_LOWER + ((y / AGS_AUTOMATION_TEST_FREE_SELECTION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); count++; } } /* select acceleration */ for(i = 0; i < AGS_AUTOMATION_TEST_FREE_SELECTION_SELECTION_COUNT && i < count; i++){ nth = rand() % (count - i); current = g_list_nth(automation->acceleration, nth); ags_automation_add_acceleration(automation, current->data, TRUE); } /* assert free slection */ CU_ASSERT(automation->selection != NULL); ags_automation_free_selection(automation); CU_ASSERT(automation->selection == NULL); } void ags_automation_test_add_all_to_selection() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current, *current_selection; gdouble range; guint count; guint x, y; guint nth; guint i; gboolean success; /* create automation */ automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_STEPS; automation->lower = AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_LOWER; automation->upper = AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_UPPER - AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_LOWER); count = 0; for(i = 0; i < AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_HEIGHT; if(ags_automation_find_point(automation, x, y, FALSE) == NULL){ acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_LOWER + ((y / AGS_AUTOMATION_TEST_ADD_ALL_TO_SELECTION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); count++; } } /* assert all present */ current = automation->acceleration; current_selection = automation->selection; success = TRUE; while(current != NULL && current_selection != NULL){ if(current->data != current_selection->data){ success = FALSE; break; } current = current->next; current_selection = current_selection->next; } CU_ASSERT(success == TRUE); } void ags_automation_test_add_point_to_selection() { AgsAutomation *automation; AgsAcceleration *acceleration; GList *list, *current; gdouble range; guint count; guint x, y; guint nth; guint i; gboolean success; /* create automation */ automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_STEPS; automation->lower = AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_LOWER; automation->upper = AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_UPPER - AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_LOWER); count = 0; for(i = 0; i < AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_HEIGHT; if(ags_automation_find_point(automation, x, y, FALSE) == NULL){ acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_LOWER + ((y / AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); count++; } } /* assert add point to selection */ success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_ADD_POINT_TO_SELECTION_N_ATTEMPTS; i++){ nth = rand() % count; current = g_list_nth(automation->acceleration, nth); if(current->prev != NULL && current->next != NULL){ ags_automation_add_point_to_selection(automation, AGS_ACCELERATION(current->data)->x, AGS_ACCELERATION(current->data)->y, FALSE); if(ags_automation_find_point(automation, AGS_ACCELERATION(current->data)->x, AGS_ACCELERATION(current->data)->y, TRUE) == NULL){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_automation_test_remove_point_from_selection() { AgsAutomation *automation; AgsAcceleration *acceleration, *match; GList *list, *current, *iter, *next; gdouble range; guint count; guint x, y; guint nth; guint n_matches; guint i; gboolean success; /* create automation */ automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, AGS_AUTOMATION_TEST_CONTROL_NAME); automation->steps = AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_STEPS; automation->lower = AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_LOWER; automation->upper = AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_UPPER; automation->default_value = AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_DEFAULT_VALUE; range = (AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_UPPER - AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_LOWER); count = 0; for(i = 0; i < AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_COUNT; i++){ x = rand() % AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_WIDTH; y = rand() % AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_HEIGHT; if(ags_automation_find_point(automation, x, y, FALSE) == NULL){ acceleration = ags_acceleration_new(); acceleration->x = x; acceleration->y = AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_LOWER + ((y / AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_HEIGHT) * range); ags_automation_add_acceleration(automation, acceleration, FALSE); count++; } } /* add point to selection */ for(i = 0; i < AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_SELECTION_COUNT; i++){ nth = rand() % count; current = g_list_nth(automation->acceleration, nth); ags_automation_add_point_to_selection(automation, AGS_ACCELERATION(current->data)->x, AGS_ACCELERATION(current->data)->y, FALSE); } /* assert remove point from selection */ success = TRUE; for(i = 0; i < AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_N_ATTEMPTS; i++){ nth = rand() % (AGS_AUTOMATION_TEST_REMOVE_POINT_FROM_SELECTION_N_ATTEMPTS); current = g_list_nth(automation->selection, nth); if(current == NULL){ continue; } iter = current->next; n_matches = 0; while(iter != NULL && AGS_ACCELERATION(iter->data)->x == AGS_ACCELERATION(current->data)->x && AGS_ACCELERATION(iter->data)->y == AGS_ACCELERATION(current->data)->y){ n_matches++; iter = iter->next; } acceleration = AGS_ACCELERATION(current->data); ags_automation_remove_point_from_selection(automation, acceleration->x, acceleration->y); if((match = ags_automation_find_point(automation, acceleration->x, acceleration->y, TRUE)) != NULL){ if(n_matches == 0){ success = FALSE; break; }else{ next = g_list_find(automation->selection, match); while(next != NULL && AGS_ACCELERATION(next->data)->x == acceleration->x && AGS_ACCELERATION(next->data)->y == acceleration->y){ n_matches--; next = next->next; } if(n_matches != 0){ success = FALSE; break; } } } } CU_ASSERT(success == TRUE); } void ags_automation_test_add_region_to_selection() { //TODO:JK: implement me } void ags_automation_test_remove_region_from_selection() { //TODO:JK: implement me } void ags_automation_test_copy_selection() { //TODO:JK: implement me } void ags_automation_test_cut_selection() { //TODO:JK: implement me } void ags_automation_test_insert_from_clipboard() { //TODO:JK: implement me } void ags_automation_test_get_current() { //TODO:JK: implement me } void ags_automation_test_get_specifier_unique() { AgsAutomation *automation; GList *start; gchar **specifier_unique; gchar **iter; gboolean *found_index; guint specifier_count; guint nth; guint i; gboolean success; static const gchar *specifier[] = { "delay", "feedback", "resonance", "osc1", "osc2", NULL, }; /* count specifiers */ iter = specifier; for(specifier_count = 0; *iter != NULL; specifier_count++, iter++); /* create automation */ start = NULL; found_index = (gboolean *) malloc(specifier_count * sizeof(gboolean)); memset(found_index, 0, specifier_count * sizeof(gboolean)); for(i = 0; i < AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_COUNT; i++){ nth = rand() % specifier_count; found_index[nth] = TRUE; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, specifier[nth]); automation->steps = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_STEPS; automation->lower = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_LOWER; automation->upper = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_UPPER; automation->default_value = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_DEFAULT_VALUE; start = g_list_prepend(start, automation); } /* verify each specifier available */ for(i = 0; i < specifier_count; i++){ if(!found_index[i]){ automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, specifier[i]); automation->steps = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_STEPS; automation->lower = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_LOWER; automation->upper = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_UPPER; automation->default_value = AGS_AUTOMATION_TEST_GET_SPECIFIER_UNIQUE_DEFAULT_VALUE; start = g_list_prepend(start, automation); } } /* assert */ success = TRUE; specifier_unique = ags_automation_get_specifier_unique(start); for(i = 0; i < specifier_count; i++){ if(!g_strv_contains(specifier, specifier_unique[i])){ success = FALSE; break; } } CU_ASSERT(success == TRUE && specifier_unique[specifier_count] == NULL); } void ags_automation_test_find_specifier() { AgsAutomation *automation; GList *start; GList *current; gchar **specifier_unique; gchar **iter; guint *n_index; guint specifier_count; guint nth; guint i; guint n_match; gboolean success; static const gchar *unavailable_specifier = "unavailable"; static const gchar *specifier[] = { "delay", "feedback", "resonance", "osc1", "osc2", NULL, }; /* count specifiers */ iter = specifier; for(specifier_count = 0; *iter != NULL; specifier_count++, iter++); /* create automation */ start = NULL; n_index = (guint *) malloc(specifier_count * sizeof(guint)); memset(n_index, 0, specifier_count * sizeof(guint)); for(i = 0; i < AGS_AUTOMATION_TEST_FIND_SPECIFIER_COUNT; i++){ nth = rand() % specifier_count; n_index[nth] += 1; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, specifier[nth]); automation->steps = AGS_AUTOMATION_TEST_FIND_SPECIFIER_STEPS; automation->lower = AGS_AUTOMATION_TEST_FIND_SPECIFIER_LOWER; automation->upper = AGS_AUTOMATION_TEST_FIND_SPECIFIER_UPPER; automation->default_value = AGS_AUTOMATION_TEST_FIND_SPECIFIER_DEFAULT_VALUE; start = g_list_prepend(start, automation); } /* verify each specifier available */ for(i = 0; i < specifier_count; i++){ if(n_index[i] == 0){ n_index[i] = 1; automation = ags_automation_new(audio, 0, AGS_TYPE_INPUT, specifier[i]); automation->steps = AGS_AUTOMATION_TEST_FIND_SPECIFIER_STEPS; automation->lower = AGS_AUTOMATION_TEST_FIND_SPECIFIER_LOWER; automation->upper = AGS_AUTOMATION_TEST_FIND_SPECIFIER_UPPER; automation->default_value = AGS_AUTOMATION_TEST_FIND_SPECIFIER_DEFAULT_VALUE; start = g_list_prepend(start, automation); } } /* assert unavailable */ current = ags_automation_find_specifier(start, unavailable_specifier); CU_ASSERT(current == NULL); /* assert specifier find n-times */ for(i = 0; i < specifier_count; i++){ current = start; n_match = 0; while((current = ags_automation_find_specifier(current, specifier[i])) != NULL){ n_match++; current = current->next; } CU_ASSERT(n_match == n_index[i] && current == NULL); } } void ags_automation_test_find_specifier_with_type_and_line() { //TODO:JK: implement me } void ags_automation_test_get_value() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAutomationTest", ags_automation_test_init_suite, ags_automation_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAutomation find port", ags_automation_test_find_port) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation find near timestamp", ags_automation_test_find_near_timestamp) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation add acceleration", ags_automation_test_add_acceleration) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation remove acceleration at position", ags_automation_test_remove_acceleration_at_position) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation is acceleration selected", ags_automation_test_is_acceleration_selected) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation find point", ags_automation_test_find_point) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation find region", ags_automation_test_find_region) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation free selection", ags_automation_test_free_selection) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation add all to selection", ags_automation_test_add_all_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation add point to selection", ags_automation_test_add_point_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation remove point from selection", ags_automation_test_remove_point_from_selection) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation get specifier unique", ags_automation_test_get_specifier_unique) == NULL) || (CU_add_test(pSuite, "test of AgsAutomation find specifier", ags_automation_test_find_specifier) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_playback_test.c0000644000175000017500000001751413605312646017273 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_playback_test_init_suite(); int ags_playback_test_clean_suite(); void ags_playback_test_set_channel_thread(); void ags_playback_test_get_channel_thread(); void ags_playback_test_set_recall_id(); void ags_playback_test_get_recall_id(); void ags_playback_test_find_channel(); #define AGS_PLAYBACK_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=recycling\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_playback_test_init_suite() { AgsConfig *config; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_PLAYBACK_TEST_CONFIG, strlen(AGS_PLAYBACK_TEST_CONFIG)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_playback_test_clean_suite() { return(0); } void ags_playback_test_set_channel_thread() { AgsPlayback *playback; playback = g_object_new(AGS_TYPE_PLAYBACK, NULL); /* set playback to NULL and assert */ ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_PLAYBACK); CU_ASSERT(playback->channel_thread[AGS_SOUND_SCOPE_PLAYBACK] == NULL); /* set sequencer to NULL and assert */ ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(playback->channel_thread[AGS_SOUND_SCOPE_SEQUENCER] == NULL); /* set notation to NULL and assert */ ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_NOTATION); CU_ASSERT(playback->channel_thread[AGS_SOUND_SCOPE_NOTATION] == NULL); } void ags_playback_test_get_channel_thread() { AgsPlayback *playback; AgsThread *thread; playback = g_object_new(AGS_TYPE_PLAYBACK, NULL); /* get playback to NULL and assert */ thread = ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_PLAYBACK); CU_ASSERT(playback->channel_thread[AGS_SOUND_SCOPE_PLAYBACK] == thread); /* get sequencer to NULL and assert */ thread = ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(playback->channel_thread[AGS_SOUND_SCOPE_SEQUENCER] == thread); /* get notation to NULL and assert */ thread = ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_NOTATION); CU_ASSERT(playback->channel_thread[AGS_SOUND_SCOPE_NOTATION] == thread); } void ags_playback_test_set_recall_id() { AgsPlayback *playback; AgsRecallID *recall_id[3]; playback = g_object_new(AGS_TYPE_PLAYBACK, NULL); recall_id[0] = g_object_new(AGS_TYPE_RECALL_ID, NULL); recall_id[1] = g_object_new(AGS_TYPE_RECALL_ID, NULL); recall_id[2] = g_object_new(AGS_TYPE_RECALL_ID, NULL); /* set playback to NULL and assert */ ags_playback_set_recall_id(playback, recall_id[0], AGS_SOUND_SCOPE_PLAYBACK); CU_ASSERT(playback->recall_id[AGS_SOUND_SCOPE_PLAYBACK] == recall_id[0]); /* set sequencer to NULL and assert */ ags_playback_set_recall_id(playback, recall_id[1], AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(playback->recall_id[AGS_SOUND_SCOPE_SEQUENCER] == recall_id[1]); /* set notation to NULL and assert */ ags_playback_set_recall_id(playback, recall_id[2], AGS_SOUND_SCOPE_NOTATION); CU_ASSERT(playback->recall_id[AGS_SOUND_SCOPE_NOTATION] == recall_id[2]); } void ags_playback_test_get_recall_id() { AgsPlayback *playback; AgsRecallID *recall_id[3]; playback = g_object_new(AGS_TYPE_PLAYBACK, NULL); recall_id[0] = g_object_new(AGS_TYPE_RECALL_ID, NULL); ags_playback_set_recall_id(playback, recall_id[0], AGS_SOUND_SCOPE_PLAYBACK); recall_id[1] = g_object_new(AGS_TYPE_RECALL_ID, NULL); ags_playback_set_recall_id(playback, recall_id[1], AGS_SOUND_SCOPE_SEQUENCER); recall_id[2] = g_object_new(AGS_TYPE_RECALL_ID, NULL); ags_playback_set_recall_id(playback, recall_id[2], AGS_SOUND_SCOPE_NOTATION); /* assert get recall id */ CU_ASSERT(ags_playback_get_recall_id(playback, AGS_SOUND_SCOPE_PLAYBACK) == recall_id[0]); CU_ASSERT(ags_playback_get_recall_id(playback, AGS_SOUND_SCOPE_SEQUENCER) == recall_id[1]); CU_ASSERT(ags_playback_get_recall_id(playback, AGS_SOUND_SCOPE_NOTATION) == recall_id[2]); } void ags_playback_test_find_channel() { AgsChannel *channel[3]; AgsPlayback *playback[3]; GList *list; list = NULL; /* playback #0 */ channel[0] = g_object_new(AGS_TYPE_INPUT, NULL); playback[0] = g_object_new(AGS_TYPE_PLAYBACK, "source", channel[0], NULL); list = g_list_prepend(list, playback[0]); /* playback #1 */ channel[1] = g_object_new(AGS_TYPE_INPUT, NULL); playback[1] = g_object_new(AGS_TYPE_PLAYBACK, "source", channel[1], NULL); list = g_list_prepend(list, playback[1]); /* playback #2 */ channel[2] = g_object_new(AGS_TYPE_INPUT, NULL); playback[2] = g_object_new(AGS_TYPE_PLAYBACK, "source", channel[2], NULL); list = g_list_prepend(list, playback[2]); /* assert */ CU_ASSERT(ags_playback_find_channel(list, channel[0]) == playback[0]); CU_ASSERT(ags_playback_find_channel(list, channel[1]) == playback[1]); CU_ASSERT(ags_playback_find_channel(list, channel[2]) == playback[2]); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlaybackTest", ags_playback_test_init_suite, ags_playback_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlayback set channel thread", ags_playback_test_set_channel_thread) == NULL) || (CU_add_test(pSuite, "test of AgsPlayback get channel thread", ags_playback_test_get_channel_thread) == NULL) || (CU_add_test(pSuite, "test of AgsPlayback set recall id", ags_playback_test_set_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsPlayback get recall id", ags_playback_test_get_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsPlayback get find source", ags_playback_test_find_channel) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_functional_pitch_test.c0000644000175000017500000004237413614062654021041 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include struct AgsFunctionalPitchTestWave { gdouble freq; gdouble key; GList *wave; }; gpointer ags_functional_pitch_test_add_thread(gpointer data); int ags_functional_pitch_test_init_suite(); int ags_functional_pitch_test_clean_suite(); void ags_functional_pitch_test_pitch_up(); void ags_functional_pitch_test_pitch_down(); struct AgsFunctionalPitchTestWave* ags_functional_pitch_test_alloc(GList *template_wave); #define AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS (2) #define AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE (44100) #define AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE (1024) #define AGS_FUNCTIONAL_PITCH_TEST_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_FUNCTIONAL_PITCH_TEST_VOLUME (1.0) #define AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY (0.0) #define AGS_FUNCTIONAL_PITCH_TEST_BASE_FREQ (440.0) #define AGS_FUNCTIONAL_PITCH_TEST_TUNE (100.0) #define AGS_FUNCTIONAL_PITCH_TEST_DELAY (8000000) #define AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_END_KEY (48.0) #define AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_FRAME_COUNT (5 * 44100) #define AGS_FUNCTIONAL_PITCH_TEST_PITCH_DOWN_END_KEY (-48.0) #define AGS_FUNCTIONAL_PITCH_TEST_PITCH_DOWN_FRAME_COUNT (5 * 44100) #define AGS_FUNCTIONAL_PITCH_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=audio\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "thread-pool-max-unused-threads=8\n" \ "max-precision=125\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" GThread *add_thread = NULL; AgsAudioApplicationContext *audio_application_context; AgsAudio *output_panel; AgsAudio *wave_player; GObject *output_soundcard; gpointer ags_functional_pitch_test_add_thread(gpointer data) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ exit(CU_get_error()); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalPitchTest", ags_functional_pitch_test_init_suite, ags_functional_pitch_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); exit(CU_get_error()); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_filter_util.h doing pitch up", ags_functional_pitch_test_pitch_up) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.h doing pitch down", ags_functional_pitch_test_pitch_down) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_pitch_test_init_suite() { AgsChannel *channel, *link; AgsConfig *config; GList *start_list; guint i; GError *error; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FUNCTIONAL_PITCH_TEST_CONFIG, strlen(AGS_FUNCTIONAL_PITCH_TEST_CONFIG)); /* audio application context */ audio_application_context = (AgsApplicationContext *) ags_audio_application_context_new(); g_object_ref(audio_application_context); ags_application_context_prepare(audio_application_context); ags_application_context_setup(audio_application_context); /* output soundcard */ output_soundcard = audio_application_context->soundcard->data; start_list = NULL; /* output panel */ output_panel = ags_audio_new(output_soundcard); g_object_ref(output_panel); start_list = g_list_prepend(start_list, output_panel); ags_audio_set_flags(output_panel, (AGS_AUDIO_SYNC)); ags_audio_set_audio_channels(output_panel, AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS, 0); ags_audio_set_pads(output_panel, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(output_panel, AGS_TYPE_INPUT, 1, 0); /* ags-play */ ags_recall_factory_create(output_panel, NULL, NULL, "ags-play-master", 0, AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS, 0, 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); ags_connectable_connect(AGS_CONNECTABLE(output_panel)); /* wave player */ wave_player = ags_audio_new(output_soundcard); g_object_ref(wave_player); start_list = g_list_prepend(start_list, wave_player); ags_audio_set_flags(wave_player, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(wave_player, (AGS_SOUND_ABILITY_WAVE)); ags_audio_set_audio_channels(wave_player, AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS, 0); ags_audio_set_pads(wave_player, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(wave_player, AGS_TYPE_INPUT, 1, 0); channel = wave_player->output; for(i = 0; i < AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS; i++){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_WAVE)); channel = channel->next; } /* ags-play-wave */ ags_recall_factory_create(wave_player, NULL, NULL, "ags-play-wave", 0, AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS, 0, 1, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); ags_connectable_connect(AGS_CONNECTABLE(wave_player)); /* */ start_list = g_list_reverse(start_list); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(audio_application_context), start_list); /* link */ channel = output_panel->input; link = wave_player->output; for(i = 0; i < AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); channel = channel->next; link = link->next; } return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_pitch_test_clean_suite() { g_object_unref(audio_application_context); return(0); } struct AgsFunctionalPitchTestWave* ags_functional_pitch_test_alloc(GList *template_wave) { struct AgsFunctionalPitchTestWave *test_wave; guint i_stop, j_stop; guint i, j; test_wave = (struct AgsFunctionalPitchTestWave *) malloc(sizeof(struct AgsFunctionalPitchTestWave)); test_wave->key = AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY; test_wave->freq = AGS_FUNCTIONAL_PITCH_TEST_BASE_FREQ; test_wave->wave = NULL; /* wave */ i_stop = g_list_length(template_wave); for(i = 0; i < i_stop; i++){ AgsWave *wave, *current_wave; GList *template_buffer; current_wave = AGS_WAVE(template_wave->data); /* instantiate wave */ wave = ags_wave_new(current_wave->audio, current_wave->line); ags_timestamp_set_ags_offset(wave, ags_timestamp_get_ags_offset(current_wave)); g_object_set(wave, "samplerate", AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, "format", AGS_FUNCTIONAL_PITCH_TEST_FORMAT, NULL); test_wave->wave = ags_wave_add(test_wave->wave, wave); /* buffer */ template_buffer = current_wave->buffer; j_stop = g_list_length(current_wave->buffer); for(j = 0; j < j_stop; j++){ AgsBuffer *buffer, *current_buffer; current_buffer = AGS_BUFFER(template_buffer->data); /* duplicate buffer */ buffer = ags_buffer_duplicate(current_buffer); ags_wave_add_buffer(wave, buffer, FALSE); /* iterate buffer */ template_buffer = template_buffer->next; } /* iterate wave */ template_wave = template_wave->next; } return(test_wave); } void ags_functional_pitch_test_pitch_up() { AgsTaskLauncher *task_launcher; GList *start_wave, *wave; GList *start_list, *list; gint i, j, k; gboolean success; start_wave = NULL; for(i = 0; i < AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS; i++){ AgsWave *current_wave; current_wave = ags_wave_new(wave_player, i); g_object_set(current_wave, "samplerate", AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, "format", AGS_FUNCTIONAL_PITCH_TEST_FORMAT, NULL); start_wave = ags_wave_add(start_wave, current_wave); for(j = 0; j < floor(AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_FRAME_COUNT / AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE); j++){ AgsBuffer *buffer; gdouble phase; buffer = ags_buffer_new(); g_object_set(buffer, "samplerate", AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, "format", AGS_FUNCTIONAL_PITCH_TEST_FORMAT, "x", (guint64) (j * AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE), NULL); ags_wave_add_buffer(current_wave, buffer, FALSE); phase = buffer->x % (guint) floor(AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE / AGS_FUNCTIONAL_PITCH_TEST_BASE_FREQ); ags_synth_util_sin(buffer->data, AGS_FUNCTIONAL_PITCH_TEST_BASE_FREQ, phase, AGS_FUNCTIONAL_PITCH_TEST_VOLUME, AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, ags_audio_buffer_util_format_from_soundcard(AGS_FUNCTIONAL_PITCH_TEST_FORMAT), 0, AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE); } } start_list = NULL; for(i = (gint) AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY; i <= (gint) AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_END_KEY; i++){ struct AgsFunctionalPitchTestWave *test_wave; GList *pitch_wave; test_wave = ags_functional_pitch_test_alloc(start_wave); start_list = g_list_prepend(start_list, test_wave); pitch_wave = test_wave->wave; while(pitch_wave != NULL){ GList *pitch_buffer; pitch_buffer = AGS_WAVE(pitch_wave->data)->buffer; for(k = 0; pitch_buffer != NULL; k++){ switch(AGS_FUNCTIONAL_PITCH_TEST_FORMAT){ case AGS_SOUNDCARD_SIGNED_16_BIT: { ags_filter_util_pitch_s16(AGS_BUFFER(pitch_buffer->data)->data, AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY, (gdouble) i * AGS_FUNCTIONAL_PITCH_TEST_TUNE); } break; } pitch_buffer = pitch_buffer->next; } pitch_wave = pitch_wave->next; } } start_list = g_list_reverse(start_list); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(audio_application_context)); list = start_list; success = TRUE; for(i = (gint) AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY; i <= (gint) AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_END_KEY; i++){ AgsStartAudio *start_audio; AgsStartSoundcard *start_soundcard; AgsCancelAudio *cancel_audio; struct AgsFunctionalPitchTestWave *test_wave; GList *task; g_message("playing key = %d", i); test_wave = list->data; wave_player->wave = test_wave->wave; /* start audio and soundcard task */ task = NULL; start_audio = ags_start_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); task = g_list_prepend(task, start_audio); start_soundcard = ags_start_soundcard_new(); task = g_list_prepend(task, start_soundcard); ags_task_launcher_add_task_all(task_launcher, task); /* delay */ usleep(AGS_FUNCTIONAL_PITCH_TEST_DELAY); /* create cancel task */ cancel_audio = ags_cancel_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); /* append AgsCancelAudio */ ags_task_launcher_add_task(task_launcher, (AgsTask *) cancel_audio); usleep(1500000); /* iterate */ list = list->next; } CU_ASSERT(success == TRUE); } void ags_functional_pitch_test_pitch_down() { AgsTaskLauncher *task_launcher; GList *start_wave, *wave; GList *start_list, *list; gint i, j, k; gboolean success; start_wave = NULL; for(i = 0; i < AGS_FUNCTIONAL_PITCH_TEST_AUDIO_CHANNELS; i++){ AgsWave *current_wave; current_wave = ags_wave_new(wave_player, i); g_object_set(current_wave, "samplerate", AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, "format", AGS_FUNCTIONAL_PITCH_TEST_FORMAT, NULL); start_wave = ags_wave_add(start_wave, current_wave); for(j = 0; j < floor(AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_FRAME_COUNT / AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE); j++){ AgsBuffer *buffer; gdouble phase; buffer = ags_buffer_new(); g_object_set(buffer, "samplerate", AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, "format", AGS_FUNCTIONAL_PITCH_TEST_FORMAT, "x", (guint64) (j * AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE), NULL); ags_wave_add_buffer(current_wave, buffer, FALSE); phase = buffer->x % (guint) floor(AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE / AGS_FUNCTIONAL_PITCH_TEST_BASE_FREQ); ags_synth_util_sin(buffer->data, AGS_FUNCTIONAL_PITCH_TEST_BASE_FREQ, phase, AGS_FUNCTIONAL_PITCH_TEST_VOLUME, AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, ags_audio_buffer_util_format_from_soundcard(AGS_FUNCTIONAL_PITCH_TEST_FORMAT), 0, AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE); } } start_list = NULL; for(i = (gint) AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY; i >= (gint) AGS_FUNCTIONAL_PITCH_TEST_PITCH_DOWN_END_KEY; i--){ struct AgsFunctionalPitchTestWave *test_wave; GList *pitch_wave; test_wave = ags_functional_pitch_test_alloc(start_wave); start_list = g_list_prepend(start_list, test_wave); pitch_wave = test_wave->wave; while(pitch_wave != NULL){ GList *pitch_buffer; pitch_buffer = AGS_WAVE(pitch_wave->data)->buffer; for(k = 0; k < floor(AGS_FUNCTIONAL_PITCH_TEST_PITCH_UP_FRAME_COUNT / AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE); k++){ switch(AGS_FUNCTIONAL_PITCH_TEST_FORMAT){ case AGS_SOUNDCARD_SIGNED_16_BIT: { ags_filter_util_pitch_s16(AGS_BUFFER(pitch_buffer->data)->data, AGS_FUNCTIONAL_PITCH_TEST_BUFFER_SIZE, AGS_FUNCTIONAL_PITCH_TEST_SAMPLERATE, AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY, (gdouble) i * AGS_FUNCTIONAL_PITCH_TEST_TUNE); } break; } pitch_buffer = pitch_buffer->next; } pitch_wave = pitch_wave->next; } } start_list = g_list_reverse(start_list); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(audio_application_context)); list = start_list; success = TRUE; for(i = (gint) AGS_FUNCTIONAL_PITCH_TEST_BASE_KEY; i >= (gint) AGS_FUNCTIONAL_PITCH_TEST_PITCH_DOWN_END_KEY; i--){ AgsStartAudio *start_audio; AgsStartSoundcard *start_soundcard; AgsCancelAudio *cancel_audio; struct AgsFunctionalPitchTestWave *test_wave; GList *task; g_message("playing key = %d", i); test_wave = list->data; wave_player->wave = test_wave->wave; /* start audio and soundcard task */ task = NULL; start_audio = ags_start_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); task = g_list_prepend(task, start_audio); start_soundcard = ags_start_soundcard_new(); task = g_list_prepend(task, start_soundcard); ags_task_launcher_add_task_all(task_launcher, task); /* delay */ usleep(AGS_FUNCTIONAL_PITCH_TEST_DELAY); /* create cancel task */ cancel_audio = ags_cancel_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); /* append AgsCancelAudio */ ags_task_launcher_add_task(task_launcher, (AgsTask *) cancel_audio); usleep(1500000); /* iterate */ list = list->next; } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { add_thread = g_thread_new("libags_audio.so - functional pitch test", ags_functional_pitch_test_add_thread, NULL); g_main_loop_run(g_main_loop_new(g_main_context_default(), FALSE)); g_thread_join(add_thread); return(-1); } gsequencer-3.1.3/ags/test/audio/ags_devout_test.c0000644000175000017500000001015513607210263016777 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_devout_test_init_suite(); int ags_devout_test_clean_suite(); void ags_devout_test_dispose(); void ags_devout_test_finalize(); void ags_devout_test_finalize_stub(GObject *gobject); #define AGS_DEVOUT_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsAudioApplicationContext *audio_application_context; gboolean devout_test_finalized; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_devout_test_init_suite() { AgsConfig *config; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_DEVOUT_TEST_CONFIG, strlen(AGS_DEVOUT_TEST_CONFIG)); audio_application_context = ags_audio_application_context_new(); g_object_ref(audio_application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_devout_test_clean_suite() { g_object_unref(audio_application_context); return(0); } void ags_devout_test_dispose() { AgsDevout *devout; AgsAudio *audio; GList *list, *list_start; guint i; gboolean success; devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* run dispose */ g_object_run_dispose(devout); success = TRUE; /* assert */ CU_ASSERT(success == TRUE); } void ags_devout_test_finalize() { AgsDevout *devout; AgsAudio *audio; guint i; devout = g_object_new(AGS_TYPE_DEVOUT, NULL); /* run dispose */ g_object_run_dispose(devout); /* stub finalize */ devout_test_finalized = FALSE; G_OBJECT_GET_CLASS(devout)->finalize = ags_devout_test_finalize_stub; /* unref and assert */ g_object_unref(devout); CU_ASSERT(devout_test_finalized == TRUE); } void ags_devout_test_finalize_stub(GObject *gobject) { devout_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsDevoutTest", ags_devout_test_init_suite, ags_devout_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsDevout doing dispose", ags_devout_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsDevout doing finalize", ags_devout_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_acceleration_test.c0000644000175000017500000000623613605312646020135 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_acceleration_test_init_suite(); int ags_acceleration_test_clean_suite(); void ags_acceleration_test_duplicate(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_acceleration_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_acceleration_test_clean_suite() { return(0); } void ags_acceleration_test_duplicate() { AgsAcceleration *acceleration, *copy; /* create acceleration */ acceleration = g_object_new(AGS_TYPE_ACCELERATION, "x", 0, "y", 0.0, "acceleration-name", "initial value", NULL); /* assert duplicate */ copy = ags_acceleration_duplicate(acceleration); CU_ASSERT(AGS_IS_ACCELERATION(copy) && copy->x == acceleration->x && copy->y == acceleration->y && !g_strcmp0(copy->acceleration_name, acceleration->acceleration_name)); /* create acceleration */ acceleration = g_object_new(AGS_TYPE_ACCELERATION, "x", 1024, "y", 52.0, "acceleration-name", "raise value", NULL); /* assert duplicate */ copy = ags_acceleration_duplicate(acceleration); CU_ASSERT(AGS_IS_ACCELERATION(copy) && copy->x == acceleration->x && copy->y == acceleration->y && !g_strcmp0(copy->acceleration_name, acceleration->acceleration_name)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAccelerationTest", ags_acceleration_test_init_suite, ags_acceleration_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAcceleration duplicate", ags_acceleration_test_duplicate) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_container_test.c0000644000175000017500000002430013605312646021000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_recall_container_test_init_suite(); int ags_recall_container_test_clean_suite(); void ags_recall_container_test_get_recall_audio(); void ags_recall_container_test_get_recall_audio_run(); void ags_recall_container_test_get_recall_channel(); void ags_recall_container_test_get_recall_channel_run(); void ags_recall_container_test_find(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_container_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_container_test_clean_suite() { return(0); } void ags_recall_container_test_get_recall_audio() { AgsRecall *recall, *current; AgsRecallContainer *recall_container; recall = g_object_new(AGS_TYPE_RECALL_AUDIO, NULL); recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, "recall-audio", recall, NULL); /* get recall audio and assert*/ current = ags_recall_container_get_recall_audio(recall_container); CU_ASSERT(current != NULL && AGS_IS_RECALL_AUDIO(current) == TRUE); } void ags_recall_container_test_get_recall_audio_run() { AgsRecall *recall[3]; AgsRecallContainer *recall_container; GList *list, *current; recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); recall[0] = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, NULL); g_object_set(recall_container, "recall-audio-run", recall[0], NULL); recall[1] = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, NULL); g_object_set(recall_container, "recall-audio-run", recall[1], NULL); recall[2] = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, NULL); g_object_set(recall_container, "recall-audio-run", recall[2], NULL); /* get recall audio and assert*/ list = ags_recall_container_get_recall_audio_run(recall_container); CU_ASSERT(list != NULL); CU_ASSERT(g_list_find(list, recall[0]) != NULL); CU_ASSERT(g_list_find(list, recall[1]) != NULL); CU_ASSERT(g_list_find(list, recall[2]) != NULL); } void ags_recall_container_test_get_recall_channel() { AgsRecall *recall[3]; AgsRecallContainer *recall_container; GList *list, *current; recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); recall[0] = g_object_new(AGS_TYPE_RECALL_CHANNEL, NULL); g_object_set(recall_container, "recall-channel", recall[0], NULL); recall[1] = g_object_new(AGS_TYPE_RECALL_CHANNEL, NULL); g_object_set(recall_container, "recall-channel", recall[1], NULL); recall[2] = g_object_new(AGS_TYPE_RECALL_CHANNEL, NULL); g_object_set(recall_container, "recall-channel", recall[2], NULL); /* get recall channel and assert*/ list = ags_recall_container_get_recall_channel(recall_container); CU_ASSERT(list != NULL); CU_ASSERT(g_list_find(list, recall[0]) != NULL); CU_ASSERT(g_list_find(list, recall[1]) != NULL); CU_ASSERT(g_list_find(list, recall[2]) != NULL); } void ags_recall_container_test_get_recall_channel_run() { AgsRecall *recall[3]; AgsRecallContainer *recall_container; GList *list, *current; recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); recall[0] = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, NULL); g_object_set(recall_container, "recall-channel-run", recall[0], NULL); recall[1] = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, NULL); g_object_set(recall_container, "recall-channel-run", recall[1], NULL); recall[2] = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, NULL); g_object_set(recall_container, "recall-channel-run", recall[2], NULL); /* get recall channel and assert*/ list = ags_recall_container_get_recall_channel_run(recall_container); CU_ASSERT(list != NULL); CU_ASSERT(g_list_find(list, recall[0]) != NULL); CU_ASSERT(g_list_find(list, recall[1]) != NULL); CU_ASSERT(g_list_find(list, recall[2]) != NULL); } void ags_recall_container_test_find() { AgsRecall *recall[6]; AgsRecallContainer *recall_container; GList *list, *current; /* assert #0 - type */ list = NULL; /* ags-count-beats */ recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); list = g_list_prepend(list, recall_container); recall[0] = g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO_RUN, NULL); g_object_set(recall_container, "recall-audio-run", recall[0], NULL); /* ags-play */ recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); list = g_list_prepend(list, recall_container); recall[1] = g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN, NULL); g_object_set(recall_container, "recall-channel-run", recall[1], NULL); /* ags-copy-pattern */ recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); list = g_list_prepend(list, recall_container); recall[2] = g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO_RUN, NULL); g_object_set(recall_container, "recall-audio-run", recall[2], NULL); recall[3] = g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, NULL); g_object_set(recall_container, "recall-channel-run", recall[3], NULL); /* ags-buffer */ recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); list = g_list_prepend(list, recall_container); recall[4] = g_object_new(AGS_TYPE_BUFFER_CHANNEL, NULL); g_object_set(recall_container, "recall-channel", recall[4], NULL); /* ags-delay */ recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); list = g_list_prepend(list, recall_container); recall[5] = g_object_new(AGS_TYPE_DELAY_AUDIO, NULL); g_object_set(recall_container, "recall-audio", recall[5], NULL); /* find and assert ags-count-beats */ current = ags_recall_container_find(list, AGS_TYPE_COUNT_BEATS_AUDIO_RUN, AGS_RECALL_CONTAINER_FIND_TYPE, NULL); CU_ASSERT(current != NULL && AGS_IS_RECALL_CONTAINER(current->data) == TRUE && g_list_find(AGS_RECALL_CONTAINER(current->data)->recall_audio_run, recall[0]) != NULL); /* find and assert ags-play */ current = ags_recall_container_find(list, AGS_TYPE_PLAY_CHANNEL_RUN, AGS_RECALL_CONTAINER_FIND_TYPE, NULL); CU_ASSERT(current != NULL && AGS_IS_RECALL_CONTAINER(current->data) == TRUE && g_list_find(AGS_RECALL_CONTAINER(current->data)->recall_channel_run, recall[1]) != NULL); /* find and assert ags-copy-pattern */ current = ags_recall_container_find(list, AGS_TYPE_COPY_PATTERN_AUDIO_RUN, AGS_RECALL_CONTAINER_FIND_TYPE, NULL); CU_ASSERT(current != NULL && AGS_IS_RECALL_CONTAINER(current->data) == TRUE && g_list_find(AGS_RECALL_CONTAINER(current->data)->recall_audio_run, recall[2]) != NULL); current = ags_recall_container_find(list, AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, AGS_RECALL_CONTAINER_FIND_TYPE, NULL); CU_ASSERT(current != NULL && AGS_IS_RECALL_CONTAINER(current->data) == TRUE && g_list_find(AGS_RECALL_CONTAINER(current->data)->recall_channel_run, recall[3]) != NULL); /* find and assert ags-buffer */ current = ags_recall_container_find(list, AGS_TYPE_BUFFER_CHANNEL, AGS_RECALL_CONTAINER_FIND_TYPE, NULL); CU_ASSERT(current != NULL && AGS_IS_RECALL_CONTAINER(current->data) == TRUE && g_list_find(AGS_RECALL_CONTAINER(current->data)->recall_channel, recall[4]) != NULL); /* find and assert ags-delay */ current = ags_recall_container_find(list, AGS_TYPE_DELAY_AUDIO, AGS_RECALL_CONTAINER_FIND_TYPE, NULL); CU_ASSERT(current != NULL && AGS_IS_RECALL_CONTAINER(current->data) == TRUE && AGS_RECALL_CONTAINER(current->data)->recall_audio == recall[5]); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallContainerTest", ags_recall_container_test_init_suite, ags_recall_container_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecallContainer get recall audio", ags_recall_container_test_get_recall_audio) == NULL) || (CU_add_test(pSuite, "test of AgsRecallContainer get recall audio run", ags_recall_container_test_get_recall_audio_run) == NULL) || (CU_add_test(pSuite, "test of AgsRecallContainer get recall channel", ags_recall_container_test_get_recall_channel) == NULL) || (CU_add_test(pSuite, "test of AgsRecallContainer get recall channel run", ags_recall_container_test_get_recall_channel_run) == NULL) || (CU_add_test(pSuite, "test of AgsRecallContainer find", ags_recall_container_test_find) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_wave_test.c0000644000175000017500000003653513605312646016453 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_wave_test_init_suite(); int ags_wave_test_clean_suite(); void ags_wave_test_find_near_timestamp(); void ags_wave_test_add_buffer(); void ags_wave_test_remove_buffer(); void ags_wave_test_get_selection(); void ags_wave_test_is_buffer_selected(); void ags_wave_test_find_point(); void ags_wave_test_find_region(); void ags_wave_test_free_selection(); void ags_wave_test_add_region_to_selection(); void ags_wave_test_remove_region_from_selection(); void ags_wave_test_add_all_to_selection(); void ags_wave_test_copy_selection(); void ags_wave_test_cut_selection(); void ags_wave_test_insert_from_clipboard(); void ags_wave_test_insert_from_clipboard_extended(); #define AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_N_WAVE (8) #define AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_SAMPLERATE (44100) #define AGS_WAVE_TEST_ADD_BUFFER_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_ADD_BUFFER_COUNT (1024) #define AGS_WAVE_TEST_REMOVE_BUFFER_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_REMOVE_BUFFER_COUNT (1024) #define AGS_WAVE_TEST_REMOVE_BUFFER_REMOVE_COUNT (256) #define AGS_WAVE_TEST_IS_BUFFER_SELECTED_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_IS_BUFFER_SELECTED_COUNT (1024) #define AGS_WAVE_TEST_IS_BUFFER_SELECTED_SELECTION_COUNT (128) #define AGS_WAVE_TEST_FIND_POINT_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_FIND_POINT_COUNT (1025) #define AGS_WAVE_TEST_FIND_POINT_N_ATTEMPTS (1024) #define AGS_WAVE_TEST_FIND_REGION_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_FIND_REGION_COUNT (1024) #define AGS_WAVE_TEST_FIND_REGION_N_ATTEMPTS (128) #define AGS_WAVE_TEST_FIND_REGION_SELECTION_WIDTH (128) #define AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_FREE_SELECTION_COUNT (1024) #define AGS_WAVE_TEST_FREE_SELECTION_SELECTION_COUNT (64) #define AGS_WAVE_TEST_ADD_ALL_TO_SELECTION_BUFFER_SIZE (1024) #define AGS_WAVE_TEST_ADD_ALL_TO_SELECTION_COUNT (1024) AgsAudio *audio; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_wave_test_init_suite() { audio = ags_audio_new(NULL); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_wave_test_clean_suite() { g_object_unref(audio); return(0); } void ags_wave_test_find_near_timestamp() { AgsWave **wave; AgsTimestamp *timestamp; GList *list, *current; guint64 relative_offset; guint i; wave = (AgsWave **) malloc(AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_N_WAVE * sizeof(AgsWave *)); list = NULL; relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_SAMPLERATE; for(i = 0; i < AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_N_WAVE; i++){ /* nth wave */ wave[i] = ags_wave_new(audio, 0); g_object_set(wave[i], "samplerate", AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_SAMPLERATE, NULL); timestamp = wave[i]->timestamp; timestamp->timer.ags_offset.offset = i * relative_offset; list = g_list_prepend(list, wave[i]); } list = g_list_reverse(list); /* instantiate timestamp to check against */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; /* assert find */ for(i = 0; i < AGS_WAVE_TEST_FIND_NEAR_TIMESTAMP_N_WAVE; i++){ timestamp->timer.ags_offset.offset = i * relative_offset; current = ags_wave_find_near_timestamp(list, 0, timestamp); CU_ASSERT(current != NULL && current->data == wave[i]); } } void ags_wave_test_add_buffer() { AgsWave *wave; AgsBuffer *buffer; GList *list; GList *current; guint64 x; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_ADD_BUFFER_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_ADD_BUFFER_COUNT; i++){ x = i * AGS_WAVE_TEST_ADD_BUFFER_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_ADD_BUFFER_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } /* assert position */ list = wave->buffer; success = TRUE; for(i = 0; i < AGS_WAVE_TEST_ADD_BUFFER_COUNT; i++){ if(list->prev != NULL){ if(AGS_BUFFER(list->prev->data)->x > AGS_BUFFER(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_wave_test_remove_buffer() { AgsWave *wave; AgsBuffer *buffer; GList *list; GList *current; guint64 nth; guint64 x; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_REMOVE_BUFFER_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_REMOVE_BUFFER_COUNT; i++){ x = i * AGS_WAVE_TEST_REMOVE_BUFFER_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_REMOVE_BUFFER_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } for(i = 0; i < AGS_WAVE_TEST_REMOVE_BUFFER_REMOVE_COUNT; i++){ nth = rand() % (AGS_WAVE_TEST_REMOVE_BUFFER_COUNT - i); current = g_list_nth(wave->buffer, nth); ags_wave_remove_buffer(wave, current->data, FALSE); } /* assert position */ list = wave->buffer; success = TRUE; for(i = 0; i < AGS_WAVE_TEST_REMOVE_BUFFER_COUNT - AGS_WAVE_TEST_REMOVE_BUFFER_REMOVE_COUNT; i++){ if(list->prev != NULL){ if(AGS_BUFFER(list->prev->data)->x > AGS_BUFFER(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_wave_test_get_selection() { //TODO:JK: implement me } void ags_wave_test_is_buffer_selected() { AgsWave *wave; AgsBuffer *buffer; GList *list; GList *current; guint64 nth; guint64 x; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_IS_BUFFER_SELECTED_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_IS_BUFFER_SELECTED_COUNT; i++){ x = i * AGS_WAVE_TEST_IS_BUFFER_SELECTED_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_IS_BUFFER_SELECTED_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } /* select buffers */ for(i = 0; i < AGS_WAVE_TEST_IS_BUFFER_SELECTED_COUNT; i++){ nth = rand() % (AGS_WAVE_TEST_IS_BUFFER_SELECTED_COUNT - i); current = g_list_nth(wave->buffer, nth); ags_wave_add_buffer(wave, current->data, TRUE); } /* assert position */ list = wave->selection; success = TRUE; for(i = 0; i < AGS_WAVE_TEST_IS_BUFFER_SELECTED_COUNT; i++){ if(list->prev != NULL){ if(AGS_BUFFER(list->prev->data)->x > AGS_BUFFER(list->data)->x){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_wave_test_find_point() { AgsWave *wave; AgsBuffer *buffer; GList *list; GList *current; guint64 nth; guint64 x; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_FIND_POINT_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_FIND_POINT_COUNT; i++){ x = i * AGS_WAVE_TEST_FIND_POINT_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_FIND_POINT_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } /* assert find point */ success = TRUE; for(i = 0; i < AGS_WAVE_TEST_FIND_POINT_N_ATTEMPTS; i++){ nth = rand() % AGS_WAVE_TEST_FIND_POINT_COUNT; current = g_list_nth(wave->buffer, nth); buffer = ags_wave_find_point(wave, AGS_BUFFER(current->data)->x, FALSE); if(buffer == NULL || buffer->x != AGS_BUFFER(current->data)->x){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_wave_test_find_region() { AgsWave *wave; AgsBuffer *buffer; GList *list; GList *region; GList *current; guint64 nth; guint64 x; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_FIND_REGION_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_FIND_REGION_COUNT; i++){ x = i * AGS_WAVE_TEST_FIND_REGION_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_FIND_REGION_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } /* assert find region */ success = TRUE; for(i = 0; i < AGS_WAVE_TEST_FIND_REGION_N_ATTEMPTS && success; i++){ nth = rand() % AGS_WAVE_TEST_FIND_REGION_COUNT; current = g_list_nth(wave->buffer, nth); region = ags_wave_find_region(wave, AGS_BUFFER(current->data)->x, AGS_BUFFER(current->data)->x + AGS_WAVE_TEST_FIND_REGION_SELECTION_WIDTH, FALSE); while(region != NULL){ if(!(AGS_BUFFER(region->data)->x >= AGS_BUFFER(current->data)->x && AGS_BUFFER(current->data)->x < AGS_BUFFER(current->data)->x + AGS_WAVE_TEST_FIND_REGION_SELECTION_WIDTH)){ success = FALSE; break; } region = region->next; } } CU_ASSERT(success == TRUE); } void ags_wave_test_free_selection() { AgsWave *wave; AgsBuffer *buffer; GList *list; GList *current; guint64 nth; guint64 x; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_FREE_SELECTION_COUNT; i++){ x = i * AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } /* select buffers */ for(i = 0; i < AGS_WAVE_TEST_FREE_SELECTION_COUNT; i++){ nth = rand() % (AGS_WAVE_TEST_FREE_SELECTION_COUNT - i); current = g_list_nth(wave->buffer, nth); ags_wave_add_buffer(wave, current->data, TRUE); } /* assert free slection */ CU_ASSERT(wave->selection != NULL); ags_wave_free_selection(wave); CU_ASSERT(wave->selection == NULL); } void ags_wave_test_add_region_to_selection() { //TODO:JK: implement me } void ags_wave_test_remove_region_from_selection() { //TODO:JK: implement me } void ags_wave_test_add_all_to_selection() { AgsWave *wave; AgsBuffer *buffer; GList *list, *current, *current_selection; guint64 x; guint nth; guint i; gboolean success; /* create wave */ wave = ags_wave_new(audio, 0); g_object_set(wave, "buffer-size", AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE, NULL); for(i = 0; i < AGS_WAVE_TEST_FREE_SELECTION_COUNT; i++){ x = i * AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE; buffer = ags_buffer_new(); g_object_set(buffer, "buffer-size", AGS_WAVE_TEST_FREE_SELECTION_BUFFER_SIZE, "x", x, NULL); ags_wave_add_buffer(wave, buffer, FALSE); } /* select all */ ags_wave_add_all_to_selection(wave); /* assert all present */ current = wave->buffer; current_selection = wave->selection; success = TRUE; while(current != NULL && current_selection != NULL){ if(current->data != current_selection->data){ success = FALSE; break; } current = current->next; current_selection = current_selection->next; } CU_ASSERT(current == NULL); CU_ASSERT(current_selection == NULL); CU_ASSERT(success == TRUE); } void ags_wave_test_copy_selection() { //TODO:JK: implement me } void ags_wave_test_cut_selection() { //TODO:JK: implement me } void ags_wave_test_insert_from_clipboard() { //TODO:JK: implement me } void ags_wave_test_insert_from_clipboard_extended() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsWaveTest", ags_wave_test_init_suite, ags_wave_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsWave find near timestamp", ags_wave_test_find_near_timestamp) == NULL) || (CU_add_test(pSuite, "test of AgsWave add buffer", ags_wave_test_add_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsWave remove buffer", ags_wave_test_remove_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsWave get selection", ags_wave_test_get_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave is buffer selected", ags_wave_test_is_buffer_selected) == NULL) || (CU_add_test(pSuite, "test of AgsWave find point", ags_wave_test_find_point) == NULL) || (CU_add_test(pSuite, "test of AgsWave find region", ags_wave_test_find_region) == NULL) || (CU_add_test(pSuite, "test of AgsWave free selection", ags_wave_test_free_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave add region to selection", ags_wave_test_add_region_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave remove region from selection", ags_wave_test_remove_region_from_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave add all to selection", ags_wave_test_add_all_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave copy selection", ags_wave_test_copy_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave cut selection", ags_wave_test_cut_selection) == NULL) || (CU_add_test(pSuite, "test of AgsWave insert from clipboard", ags_wave_test_insert_from_clipboard) == NULL) || (CU_add_test(pSuite, "test of AgsWave insert from clipboard extended", ags_wave_test_insert_from_clipboard_extended) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_pattern_test.c0000644000175000017500000002040713605312646017155 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include int ags_pattern_test_init_suite(); int ags_pattern_test_clean_suite(); void ags_pattern_test_find_near_timestamp(); void ags_pattern_test_set_dim(); void ags_pattern_test_get_bit(); void ags_pattern_test_toggle_bit(); #define AGS_PATTERN_TEST_FIND_NEAR_TIMESTAMP_N_PATTERN (8) #define AGS_PATTERN_TEST_SET_DIM_BANK_0 (16) #define AGS_PATTERN_TEST_SET_DIM_BANK_1 (4) #define AGS_PATTERN_TEST_SET_DIM_BIT (64) #define AGS_PATTERN_TEST_GET_BIT_BANK_0 (16) #define AGS_PATTERN_TEST_GET_BIT_BANK_1 (4) #define AGS_PATTERN_TEST_GET_BIT_BIT (256) #define AGS_PATTERN_TEST_TOGGLE_BIT_BANK_0 (16) #define AGS_PATTERN_TEST_TOGGLE_BIT_BANK_1 (4) #define AGS_PATTERN_TEST_TOGGLE_BIT_BIT (256) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_pattern_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_pattern_test_clean_suite() { return(0); } void ags_pattern_test_find_near_timestamp() { AgsPattern **pattern; AgsTimestamp *timestamp; GList *list, *current; guint i; pattern = (AgsPattern **) malloc(AGS_PATTERN_TEST_FIND_NEAR_TIMESTAMP_N_PATTERN * sizeof(AgsPattern *)); list = NULL; for(i = 0; i < AGS_PATTERN_TEST_FIND_NEAR_TIMESTAMP_N_PATTERN; i++){ /* nth pattern */ pattern[i] = ags_pattern_new(); timestamp = ags_timestamp_new(); g_object_set(pattern[i], "timestamp\0", timestamp, NULL); timestamp->timer.unix_time.time_val = AGS_TIMESTAMP(pattern[0]->timestamp)->timer.unix_time.time_val + ((i + 1) * AGS_PATTERN_DEFAULT_DURATION); list = g_list_prepend(list, pattern[i]); } /* instantiate timestamp to check against */ timestamp = ags_timestamp_new(); timestamp->timer.unix_time.time_val = AGS_TIMESTAMP(pattern[0]->timestamp)->timer.unix_time.time_val; /* assert find */ for(i = 0; i + 1 < AGS_PATTERN_TEST_FIND_NEAR_TIMESTAMP_N_PATTERN; i++){ timestamp->timer.unix_time.time_val = AGS_TIMESTAMP(pattern[0]->timestamp)->timer.unix_time.time_val + ((i + 1) * AGS_PATTERN_DEFAULT_DURATION + 1); current = ags_pattern_find_near_timestamp(list, timestamp); CU_ASSERT(current != NULL && current->data == pattern[i + 1]); } } void ags_pattern_test_set_dim() { AgsPattern *pattern; guint i, j; gboolean success; pattern = ags_pattern_new(); ags_pattern_set_dim(pattern, AGS_PATTERN_TEST_SET_DIM_BANK_0, AGS_PATTERN_TEST_SET_DIM_BANK_1, AGS_PATTERN_TEST_SET_DIM_BIT); /* assert dim */ CU_ASSERT(pattern->dim[0] == AGS_PATTERN_TEST_SET_DIM_BANK_0); CU_ASSERT(pattern->dim[1] == AGS_PATTERN_TEST_SET_DIM_BANK_1); CU_ASSERT(pattern->dim[2] == AGS_PATTERN_TEST_SET_DIM_BIT); /* assert pattern */ if(pattern->pattern != NULL){ success = TRUE; }else{ success = FALSE; } for(i = 0; i < AGS_PATTERN_TEST_SET_DIM_BANK_0 && success; i++){ if(pattern->pattern[i] == NULL){ success = FALSE; break; } for(j = 0; j < AGS_PATTERN_TEST_SET_DIM_BANK_1; j++){ if(pattern->pattern[i][j] == NULL){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_pattern_test_get_bit() { AgsPattern *pattern; guint ***bitmap; guint i, j, k; gboolean success; /* instantiate pattern */ pattern = ags_pattern_new(); ags_pattern_set_dim(pattern, AGS_PATTERN_TEST_GET_BIT_BANK_0, AGS_PATTERN_TEST_GET_BIT_BANK_1, AGS_PATTERN_TEST_GET_BIT_BIT); /* create and fill bitmap to check against */ bitmap = (guint ***) malloc(AGS_PATTERN_TEST_GET_BIT_BANK_0 * sizeof(guint **)); for(i = 0; i < AGS_PATTERN_TEST_GET_BIT_BANK_0; i++){ bitmap[i] = (guint **) malloc(AGS_PATTERN_TEST_GET_BIT_BANK_1 * sizeof(guint *)); for(j = 0; j < AGS_PATTERN_TEST_GET_BIT_BANK_1; j++){ bitmap[i][j] = (guint *) malloc((int) ceil((double) AGS_PATTERN_TEST_GET_BIT_BIT / (double) (sizeof(guint) * 8)) * sizeof(guint)); memset(bitmap[i][j], 0, (int) ceil((double) AGS_PATTERN_TEST_GET_BIT_BIT / (double) (sizeof(guint) * 8)) * sizeof(guint)); for(k = 0; k < AGS_PATTERN_TEST_GET_BIT_BIT; k++){ if(rand() % 2 == 1){ bitmap[i][j][(guint) floor((double) k / (double) (sizeof(guint) * 8))] |= (1 << (k % (sizeof(guint) * 8))); } } for(k = 0; k < (int) ceil((double) AGS_PATTERN_TEST_GET_BIT_BIT / (double) (sizeof(guint) * 8)); k++){ pattern->pattern[i][j][k] = bitmap[i][j][k]; } } } /* assert values to be present */ success = TRUE; for(i = 0; i < AGS_PATTERN_TEST_GET_BIT_BANK_0 && success; i++){ for(j = 0; j < AGS_PATTERN_TEST_GET_BIT_BANK_1 && success; j++){ for(k = 0; k < AGS_PATTERN_TEST_GET_BIT_BIT; k++){ if(((1 << (k % (sizeof(guint) * 8))) & bitmap[i][j][(guint) floor((double) k / (double) (sizeof(guint) * 8))]) != 0){ success = (ags_pattern_get_bit(pattern, i, j, k) == TRUE); }else{ success = (ags_pattern_get_bit(pattern, i, j, k) == FALSE); } if(!success){ break; } } } } CU_ASSERT(success = TRUE); } void ags_pattern_test_toggle_bit() { AgsPattern *pattern; guint i, j, k; gboolean success; /* instantiate pattern */ pattern = ags_pattern_new(); ags_pattern_set_dim(pattern, AGS_PATTERN_TEST_GET_BIT_BANK_0, AGS_PATTERN_TEST_GET_BIT_BANK_1, AGS_PATTERN_TEST_TOGGLE_BIT_BIT); /* assert values to be present */ for(i = 0; i < AGS_PATTERN_TEST_TOGGLE_BIT_BANK_0; i++){ for(j = 0; j < AGS_PATTERN_TEST_TOGGLE_BIT_BANK_1; j++){ for(k = 0; k < AGS_PATTERN_TEST_GET_BIT_BIT; k++){ if(rand() % 2 == 1){ ags_pattern_toggle_bit(pattern, i, j, k); success = (ags_pattern_get_bit(pattern, i, j, k) == TRUE); }else{ ags_pattern_toggle_bit(pattern, i, j, k); ags_pattern_toggle_bit(pattern, i, j, k); success = (ags_pattern_get_bit(pattern, i, j, k) == FALSE); } } } } CU_ASSERT(success = TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C\0"); putenv("LANG=C\0"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPatternTest\0", ags_pattern_test_init_suite, ags_pattern_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPattern find near timestamp\0", ags_pattern_test_find_near_timestamp) == NULL) || (CU_add_test(pSuite, "test of AgsPattern set dim\0", ags_pattern_test_set_dim) == NULL) || (CU_add_test(pSuite, "test of AgsPattern get bit\0", ags_pattern_test_get_bit) == NULL) || (CU_add_test(pSuite, "test of AgsPattern toggle bit\0", ags_pattern_test_toggle_bit) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_midiin_test.c0000644000175000017500000001042613614062654016752 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_midiin_test_init_suite(); int ags_midiin_test_clean_suite(); void ags_midiin_test_dispose(); void ags_midiin_test_finalize(); void ags_midiin_test_finalize_stub(GObject *gobject); #define AGS_MIDIIN_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsAudioApplicationContext *audio_application_context; gboolean midiin_test_finalized; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midiin_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_MIDIIN_TEST_CONFIG, strlen(AGS_MIDIIN_TEST_CONFIG)); audio_application_context = ags_audio_application_context_new(); g_object_ref(audio_application_context); ags_application_context_prepare(audio_application_context); ags_application_context_setup(audio_application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midiin_test_clean_suite() { g_object_unref(audio_application_context); return(0); } void ags_midiin_test_dispose() { AgsMidiin *midiin; AgsAudio *audio; GList *list, *list_start; guint i; gboolean success; midiin = g_object_new(AGS_TYPE_MIDIIN, NULL); g_object_ref(midiin); /* run dispose */ g_object_run_dispose(midiin); success = TRUE; /* assert */ CU_ASSERT(success == TRUE); } void ags_midiin_test_finalize() { AgsMidiin *midiin; AgsAudio *audio; guint i; midiin = g_object_new(AGS_TYPE_MIDIIN, NULL); /* run dispose */ g_object_run_dispose(midiin); /* stub finalize */ midiin_test_finalized = FALSE; G_OBJECT_GET_CLASS(midiin)->finalize = ags_midiin_test_finalize_stub; /* unref and assert */ g_object_unref(midiin); CU_ASSERT(midiin_test_finalized == TRUE); } void ags_midiin_test_finalize_stub(GObject *gobject) { midiin_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMidiinTest", ags_midiin_test_init_suite, ags_midiin_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMidiin doing dispose", ags_midiin_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsMidiin doing finalize", ags_midiin_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_input_test.c0000644000175000017500000001621013605312646016634 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_input_test_init_suite(); int ags_input_test_clean_suite(); void ags_input_test_open_file(); void ags_input_test_is_active(); void ags_input_test_next_active(); #define AGS_INPUT_TEST_OPEN_FILE_FILENAME "/usr/share/sounds/alsa/Noise.wav" #define AGS_INPUT_TEST_OPEN_FILE_AUDIO_CHANNEL (0) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_input_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_input_test_clean_suite() { return(0); } void ags_input_test_open_file() { AgsInput *input; gboolean success; input = g_object_new(AGS_TYPE_INPUT, NULL); AGS_CHANNEL(input)->first_recycling = AGS_CHANNEL(input)->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); success = ags_input_open_file(input, AGS_INPUT_TEST_OPEN_FILE_FILENAME, NULL, NULL, NULL, AGS_INPUT_TEST_OPEN_FILE_AUDIO_CHANNEL); CU_ASSERT(success == TRUE && input->file_link != NULL && AGS_CHANNEL(input)->first_recycling->audio_signal != NULL); } void ags_input_test_is_active() { AgsInput *input; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context, *parent_recycling_context; gboolean is_active; input = g_object_new(AGS_TYPE_INPUT, NULL); AGS_CHANNEL(input)->first_recycling = AGS_CHANNEL(input)->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, NULL); parent_recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, "parent", recycling_context, NULL); /* assert - not active */ is_active = ags_input_is_active(input, recycling_context); CU_ASSERT(is_active == FALSE); /* assert - active */ recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); audio_signal = g_object_new(AGS_TYPE_AUDIO_SIGNAL, "recall-id", recall_id, NULL); ags_recycling_add_audio_signal(AGS_CHANNEL(input)->first_recycling, audio_signal); is_active = ags_input_is_active(input, recycling_context); CU_ASSERT(is_active == TRUE); } void ags_input_test_next_active() { AgsInput *input[3], *current; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context, *parent_recycling_context; input[0] = g_object_new(AGS_TYPE_INPUT, NULL); AGS_CHANNEL(input[0])->first_recycling = AGS_CHANNEL(input[0])->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); input[1] = g_object_new(AGS_TYPE_INPUT, NULL); AGS_CHANNEL(input[1])->first_recycling = AGS_CHANNEL(input[1])->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); AGS_CHANNEL(input[1])->prev = input[0]; AGS_CHANNEL(input[1])->prev_pad = input[0]; AGS_CHANNEL(input[0])->next = input[1]; AGS_CHANNEL(input[0])->next_pad = input[1]; input[2] = g_object_new(AGS_TYPE_INPUT, NULL); AGS_CHANNEL(input[2])->first_recycling = AGS_CHANNEL(input[2])->last_recycling = g_object_new(AGS_TYPE_RECYCLING, NULL); AGS_CHANNEL(input[2])->prev = input[1]; AGS_CHANNEL(input[2])->prev_pad = input[1]; AGS_CHANNEL(input[1])->next = input[2]; AGS_CHANNEL(input[1])->next_pad = input[2]; recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, NULL); parent_recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, "parent", recycling_context, NULL); /* assert - no active */ current = ags_input_next_active(input[0], recycling_context); CU_ASSERT(current == NULL); /* assert - input[2] */ recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); audio_signal = g_object_new(AGS_TYPE_AUDIO_SIGNAL, "recall-id", recall_id, NULL); ags_recycling_add_audio_signal(AGS_CHANNEL(input[2])->first_recycling, audio_signal); current = ags_input_next_active(input[0], recycling_context); CU_ASSERT(current == input[2]); /* assert - input[1] */ recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); audio_signal = g_object_new(AGS_TYPE_AUDIO_SIGNAL, "recall-id", recall_id, NULL); ags_recycling_add_audio_signal(AGS_CHANNEL(input[1])->first_recycling, audio_signal); current = ags_input_next_active(input[0], recycling_context); CU_ASSERT(current == input[1]); /* assert - input[0] */ recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); audio_signal = g_object_new(AGS_TYPE_AUDIO_SIGNAL, "recall-id", recall_id, NULL); ags_recycling_add_audio_signal(AGS_CHANNEL(input[0])->first_recycling, audio_signal); current = ags_input_next_active(input[0], recycling_context); CU_ASSERT(current == input[0]); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsInputTest", ags_input_test_init_suite, ags_input_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } #if 0 g_log_set_fatal_mask("GLib-GObject", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("Gtk", G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask(NULL, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); #endif /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsInput open file", ags_input_test_open_file) == NULL) || (CU_add_test(pSuite, "test of AgsInput is active", ags_input_test_is_active) == NULL) || (CU_add_test(pSuite, "test of AgsInput next active", ags_input_test_next_active) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recycling_test.c0000644000175000017500000005316613614062654017470 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int ags_recycling_test_init_suite(); int ags_recycling_test_clean_suite(); void ags_recycling_test_add_audio_signal(); void ags_recycling_test_remove_audio_signal(); void ags_recycling_test_create_audio_signal_with_defaults(); void ags_recycling_test_create_audio_signal_with_frame_count(); void ags_recycling_test_position(); void ags_recycling_test_find_next_channel(); gboolean ags_recycling_test_create_audio_signal_with_frame_count_compare_frames(signed short *destination, signed short *source, guint buffer_size); #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_SAMPLERATE (44100) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE (944) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FREQUENCY (440.0) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FRAMES (AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_SAMPLERATE / \ AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE * \ 440.0) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_NOTE_DELAY (1.0 / 4.0) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_NOTE_LENGTH (64.0) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_SAMPLERATE (44100) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_BUFFER_SIZE (944) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FREQUENCY (440.0) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES (AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_SAMPLERATE * \ (AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_NOTE_LENGTH * \ (1.0 / 16.0 * AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_NOTE_DELAY))) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_LAST_FRAME (AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES % \ AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_BUFFER_SIZE) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_LOOP_START (2.0 * AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES / 5.0 / 16.0) #define AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_LOOP_END (3.5 * AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES / 5.0 / 16.0) #define AGS_RECYCLING_TEST_POSITION_N_RECYCLING (16) #define AGS_RECYCLING_TEST_FIND_NEXT_CHANNEL_N_CHANNEL (8) AgsApplicationContext *application_context; AgsDevout *devout; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recycling_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_application_context_new(NULL, NULL); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); devout = ags_devout_new(NULL); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recycling_test_clean_suite() { g_object_unref(devout); g_object_unref(application_context); return(0); } void ags_recycling_test_add_audio_signal() { AgsRecycling *recycling; AgsAudioSignal *audio_signal; /* instantiate recycling */ recycling = ags_recycling_new(G_OBJECT(devout)); /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); /* add audio signal */ ags_recycling_add_audio_signal(recycling, audio_signal); /* assert if audio signal available in recycling */ CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) != NULL); } void ags_recycling_test_remove_audio_signal() { AgsRecycling *recycling; AgsAudioSignal *audio_signal; /* instantiate recycling */ recycling = ags_recycling_new(G_OBJECT(devout)); /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); /* add audio signal */ ags_recycling_add_audio_signal(recycling, audio_signal); /* assert if audio signal available in recycling */ CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) != NULL); /* add audio signal */ ags_recycling_remove_audio_signal(recycling, audio_signal); /* assert if no audio signal in recycling */ CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) == NULL); } void ags_recycling_test_create_audio_signal_with_defaults() { AgsRecycling *recycling; AgsAudioSignal *template, *audio_signal; GList *stream, *template_stream; signed short *buffer; guint i, j; /* instantiate recycling */ recycling = ags_recycling_new(G_OBJECT(devout)); /* instantiate template audio signal */ template = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); template->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; g_object_set(G_OBJECT(template), "samplerate", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_SAMPLERATE, "buffer-size", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE, "format", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FORMAT, NULL); /* fill stream */ stream = NULL; for(i = 0; i < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FRAMES;){ buffer = (signed short *) malloc(template->buffer_size * sizeof(signed short)); memset(buffer, 0, template->buffer_size * sizeof(signed short)); for(j = 0; j < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE && i + j < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FRAMES; j++){ /* generate sin tone */ buffer[j] = (signed short) (0xffff & (int) (32000.0 * (double) (sin ((double)(j) * 2.0 * M_PI * AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FREQUENCY / (double) AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_SAMPLERATE)))); } /* prepend buffer */ stream = g_list_prepend(stream, buffer); /* iterate */ i += AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE; } template->stream_end = stream; template->stream = g_list_reverse(stream); template->length = g_list_length(template->stream); /* add audio signal to recycling */ ags_recycling_add_audio_signal(recycling, template); /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); audio_signal->format = AGS_SOUNDCARD_SIGNED_16_BIT; /* create defaults */ ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, 0.0, 0); /* assert audio signal */ CU_ASSERT(audio_signal->samplerate == template->samplerate); CU_ASSERT(audio_signal->buffer_size == template->buffer_size); CU_ASSERT(audio_signal->format == template->format); CU_ASSERT(audio_signal->length == template->length); CU_ASSERT(audio_signal->first_frame == template->first_frame); CU_ASSERT(audio_signal->last_frame == template->last_frame); CU_ASSERT(audio_signal->loop_start == template->loop_start); CU_ASSERT(audio_signal->loop_end == template->loop_end); stream = audio_signal->stream; template_stream = template->stream; for(i = 0; i < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FRAMES;){ for(j = 0; j < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE && i + j < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_FRAMES; j++){ CU_ASSERT(AGS_AUDIO_BUFFER_S16(stream->data)[j] == AGS_AUDIO_BUFFER_S16(template_stream->data)[j]); } /* iterate */ stream = stream->next; template_stream = template_stream->next; i += AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_DEFAULTS_BUFFER_SIZE; } } gboolean ags_recycling_test_create_audio_signal_with_frame_count_compare_frames(signed short *destination, signed short *source, guint buffer_size) { guint i; for(i = 0; i < buffer_size; i++){ if(destination[i] != source[i]){ return(FALSE); } } return(TRUE); } void ags_recycling_test_create_audio_signal_with_frame_count() { AgsRecycling *recycling; AgsAudioSignal *template, *audio_signal; GList *stream, *template_stream; signed short *entire_buffer; signed short *buffer; guint frame_count; guint first_frame; guint loop_frame_count; guint shifted_frame_count; guint stream_index, template_stream_index; guint copy_n_frames; guint i, j, k; guint nth; guint copy_mode; gboolean success; struct rlimit rl; int result; const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb /* instantiate recycling */ recycling = ags_recycling_new(G_OBJECT(devout)); /* instantiate template audio signal */ template = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); template->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; g_object_set(G_OBJECT(template), "samplerate", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_SAMPLERATE, "buffer-size", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_BUFFER_SIZE, "format", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FORMAT, NULL); /* fill stream */ ags_audio_signal_stream_resize(template, (guint) ceil(AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES / template->buffer_size) + 1); for(i = 0, nth = 0; i < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES / 16.0; nth++){ buffer = (signed short *) g_list_nth_data(template->stream, nth); for(j = 0; j < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_BUFFER_SIZE && i < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES / 16.0; j++, i++){ /* generate sin tone */ buffer[j] = (signed short) (0xffff & (int) (32000.0 * (double) (sin ((double)(j) * 2.0 * M_PI * AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FREQUENCY / (double) AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_SAMPLERATE)))); } } template->loop_start = AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_LOOP_START; template->loop_end = AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_LOOP_END; /* add audio signal to recycling */ ags_recycling_add_audio_signal(recycling, template); /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), recycling, NULL); g_object_set(G_OBJECT(audio_signal), "samplerate", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_SAMPLERATE, "buffer-size", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_BUFFER_SIZE, "format", AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FORMAT, NULL); /* create frame count */ frame_count = AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES; ags_recycling_create_audio_signal_with_frame_count(recycling, audio_signal, frame_count, 0.0, 0); /* assert audio signal */ CU_ASSERT(audio_signal->samplerate == template->samplerate); CU_ASSERT(audio_signal->buffer_size == template->buffer_size); CU_ASSERT(audio_signal->format == template->format); CU_ASSERT(audio_signal->first_frame == template->first_frame); CU_ASSERT(audio_signal->last_frame == frame_count % AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_BUFFER_SIZE); /* create compare buffer */ template_stream = template->stream; loop_frame_count = ((frame_count - template->loop_start) / (template->loop_end - template->loop_start)) * template->buffer_size; entire_buffer = (signed short *) malloc(AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES * sizeof(signed short)); memset(entire_buffer, 0, AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES * sizeof(signed short)); copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, ags_audio_buffer_util_format_from_soundcard(template->format)); for(i = 0, j = 0; i < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES;){ copy_n_frames = template->buffer_size; /* limit nth loop */ if(i > template->loop_start && i + copy_n_frames > template->loop_start + (template->loop_end - template->loop_start) && i + copy_n_frames < template->loop_start + loop_frame_count && template->loop_start + ((i - template->loop_start) % (template->loop_end - template->loop_start)) + copy_n_frames >= template->loop_end - template->loop_start){ copy_n_frames = template->loop_end - (template->loop_start + ((i - template->loop_start) % (template->loop_end - template->loop_start))); } /* check boundaries */ if(i + copy_n_frames > AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES){ copy_n_frames = AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES - i; } if(j + copy_n_frames > template->buffer_size){ copy_n_frames = template->buffer_size - j; } /* copy */ ags_audio_buffer_util_copy_buffer_to_buffer(entire_buffer, 1, i, template_stream->data, 1, j, copy_n_frames, copy_mode); /* increment and iterate */ if(j + copy_n_frames == template->buffer_size){ template_stream = template_stream->next; } if(i > template->loop_start && i + copy_n_frames > template->loop_start + (template->loop_end - template->loop_start) && i + copy_n_frames < template->loop_start + loop_frame_count && template->loop_start + ((i - template->loop_start) % (template->loop_end - template->loop_start)) + copy_n_frames >= template->loop_end - template->loop_start){ j = template->loop_start % template->buffer_size; template_stream = g_list_nth(template->stream, floor(template->loop_start / template->buffer_size)); }else{ j += copy_n_frames; } i += copy_n_frames; if(j == template->buffer_size){ j = 0; } } /* check loop */ stream = audio_signal->stream; i = 0; j = 0; k = 0; success = TRUE; for(i = 0, j = 0; i < AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES;){ copy_n_frames = template->buffer_size; /* limit nth loop */ if(i > template->loop_start && i + copy_n_frames > template->loop_start + (template->loop_end - template->loop_start) && i + copy_n_frames < template->loop_start + loop_frame_count && template->loop_start + ((i - template->loop_start) % (template->loop_end - template->loop_start)) + copy_n_frames >= template->loop_end - template->loop_start){ copy_n_frames = template->loop_end - (template->loop_start + ((i - template->loop_start) % (template->loop_end - template->loop_start))); } /* check boundaries */ if(i + copy_n_frames > AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES){ copy_n_frames = AGS_RECYCLING_TEST_CREATE_AUDIO_SIGNAL_WITH_FRAME_COUNT_FRAMES - i; } if(j + copy_n_frames > template->buffer_size){ copy_n_frames = template->buffer_size - j; } /* copy */ if(!ags_recycling_test_create_audio_signal_with_frame_count_compare_frames(&(((signed short *) stream->data)[i % audio_signal->buffer_size]), entire_buffer + i, copy_n_frames)){ success = FALSE; } /* increment and iterate */ if(j + copy_n_frames == template->buffer_size){ template_stream = template_stream->next; } if(i > template->loop_start && i + copy_n_frames > template->loop_start + (template->loop_end - template->loop_start) && i + copy_n_frames < template->loop_start + loop_frame_count && template->loop_start + ((i - template->loop_start) % (template->loop_end - template->loop_start)) + copy_n_frames >= template->loop_end - template->loop_start){ j = template->loop_start % template->buffer_size; template_stream = g_list_nth(template->stream, floor(template->loop_start / template->buffer_size)); }else{ j += copy_n_frames; } i += copy_n_frames; if(j == template->buffer_size){ j = 0; } } CU_ASSERT(success == TRUE); } void ags_recycling_test_position() { AgsRecycling *first_recycling, *last_recycling; AgsRecycling *current; guint i; /* instantiate n recycling */ first_recycling = NULL; last_recycling = NULL; for(i = 0; i < AGS_RECYCLING_TEST_POSITION_N_RECYCLING; i++){ if(first_recycling == NULL){ current = ags_recycling_new(G_OBJECT(devout)); first_recycling = current; }else{ current->next = ags_recycling_new(G_OBJECT(devout)); current->next->prev = current; current = current->next; } } last_recycling = current; /* assert every position */ current = first_recycling; for(i = 0; i < AGS_RECYCLING_TEST_POSITION_N_RECYCLING; i++){ CU_ASSERT(ags_recycling_position(first_recycling, last_recycling->next, current) == i); current = current->next; } } void ags_recycling_test_find_next_channel() { AgsChannel *start, *end; AgsChannel *channel; AgsRecycling *recycling, *prev_recycling; guint i; /* instantiate n channel and recycling */ start = NULL; end = NULL; for(i = 0; i < AGS_RECYCLING_TEST_FIND_NEXT_CHANNEL_N_CHANNEL; i++){ if(start == NULL){ recycling = ags_recycling_new(G_OBJECT(devout)); start = channel = g_object_new(AGS_TYPE_CHANNEL, NULL); channel->last_recycling = channel->first_recycling = recycling; g_object_set(G_OBJECT(recycling), "channel", channel, NULL); prev_recycling = recycling; }else{ recycling = ags_recycling_new(G_OBJECT(devout)); channel->next = channel->next_pad = g_object_new(AGS_TYPE_CHANNEL, NULL); channel->next->last_recycling = channel->next->first_recycling = recycling; g_object_set(G_OBJECT(recycling), "channel", channel->next, NULL); channel->next->prev = channel->next_pad->prev_pad = channel; recycling->prev = prev_recycling; prev_recycling->next = recycling; channel = channel->next; prev_recycling = recycling; } } end = channel; /* assert to find next channel */ channel = start; recycling = start->first_recycling; for(i = 0; i + 1 < AGS_RECYCLING_TEST_FIND_NEXT_CHANNEL_N_CHANNEL; i++){ CU_ASSERT(ags_recycling_find_next_channel(recycling, NULL, channel->prev) == recycling); channel = channel->next; recycling = recycling->next; } } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecyclingTest", ags_recycling_test_init_suite, ags_recycling_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } #if 0 g_log_set_fatal_mask("GLib-GObject", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("Gtk", G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask(NULL, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); #endif /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecycling add audio signal", ags_recycling_test_add_audio_signal) == NULL) || (CU_add_test(pSuite, "test of AgsRecycling remove audio signal", ags_recycling_test_remove_audio_signal) == NULL) || (CU_add_test(pSuite, "test of AgsRecycling create audio signal with defaults", ags_recycling_test_create_audio_signal_with_defaults) == NULL) || //FIXME:JK: uncomment /* (CU_add_test(pSuite, "test of AgsRecycling create audio signal with frame count", ags_recycling_test_create_audio_signal_with_frame_count) == NULL) || */ (CU_add_test(pSuite, "test of AgsRecycling position", ags_recycling_test_position) == NULL) || (CU_add_test(pSuite, "test of AgsRecycling find next channel", ags_recycling_test_find_next_channel) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_recycling_test.c0000644000175000017500000004174313614062654021010 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_recall_recycling_test_init_suite(); int ags_recall_recycling_test_clean_suite(); void ags_recall_recycling_test_source_add_audio_signal(); void ags_recall_recycling_test_source_remove_audio_signal(); void ags_recall_recycling_test_source_remove_audio_signal_done_callback(); #define AGS_RECALL_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *audio_application_context; gboolean remove_audio_signal_done_callback_invoked = FALSE; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_recycling_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); audio_application_context = ags_audio_application_context_new(); g_object_ref(audio_application_context); ags_application_context_prepare(audio_application_context); ags_application_context_setup(audio_application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_recycling_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_recall_recycling_test_source_add_audio_signal() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; AgsRecallChannel *recall_channel; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall; AgsRecallContainer *recall_container; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* create recall */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(input, (GObject *) recall_container); recall_channel = ags_recall_channel_new(); ags_recall_set_flags(recall_channel, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags(recall_channel, (AGS_SOUND_ABILITY_PLAYBACK)); g_object_set(recall_channel, "source", input, NULL); ags_channel_add_recall(input, recall_channel, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_channel)); recall_channel_run = ags_recall_channel_run_new(); ags_recall_set_flags(recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags(recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK)); g_object_set(recall_channel_run, "child-type", AGS_TYPE_RECALL_RECYCLING, "recall-channel", recall_channel, "source", input, "recall-container", recall_container, NULL); ags_channel_add_recall(input, recall_channel_run, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_channel_run)); recall = ags_recall_recycling_new(); g_object_set(recall, "child-type", AGS_TYPE_RECALL_AUDIO_SIGNAL, "source", recycling, "recall-container", recall_container, NULL); ags_recall_add_child(recall_channel_run, recall); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_RECALL_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_set(start_recall_recycling->data, "child-type", AGS_TYPE_RECALL_AUDIO_SIGNAL, NULL); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_RECALL_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_RECALL_AUDIO_SIGNAL(recall_audio_signal->data)); } void ags_recall_recycling_test_source_remove_audio_signal_done_callback() { remove_audio_signal_done_callback_invoked = TRUE; } void ags_recall_recycling_test_source_remove_audio_signal() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; AgsRecallChannel *recall_channel; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall; AgsRecallContainer *recall_container; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* create recall */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(input, (GObject *) recall_container); recall_channel = ags_recall_channel_new(); ags_recall_set_flags(recall_channel, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags(recall_channel, (AGS_SOUND_ABILITY_PLAYBACK)); g_object_set(recall_channel, "source", input, "recall-container", recall_container, NULL); ags_channel_add_recall(input, recall_channel, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_channel)); recall_channel_run = ags_recall_channel_run_new(); ags_recall_set_flags(recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags(recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK)); g_object_set(recall_channel_run, "child-type", AGS_TYPE_RECALL_RECYCLING, "recall-channel", recall_channel, "source", input, "recall-container", recall_container, NULL); ags_channel_add_recall(input, recall_channel_run, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_channel_run)); recall = ags_recall_recycling_new(); g_object_set(recall, "child-type", AGS_TYPE_RECALL_AUDIO_SIGNAL, "source", recycling, NULL); ags_recall_add_child(recall_channel_run, recall); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_RECALL_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_set(start_recall_recycling->data, "child-type", AGS_TYPE_RECALL_AUDIO_SIGNAL, NULL); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_RECALL_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_RECALL_AUDIO_SIGNAL(recall_audio_signal->data)); /* test remove */ g_signal_connect(recall_audio_signal->data, "done", G_CALLBACK(ags_recall_recycling_test_source_remove_audio_signal_done_callback), NULL); ags_recycling_remove_audio_signal(recycling, audio_signal); CU_ASSERT(remove_audio_signal_done_callback_invoked == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallRecyclingTest", ags_recall_recycling_test_init_suite, ags_recall_recycling_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecallRecycling source add audio signal", ags_recall_recycling_test_source_add_audio_signal) == NULL) || (CU_add_test(pSuite, "test of AgsRecallRecycling source remove audio signal", ags_recall_recycling_test_source_remove_audio_signal) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_functional_audio_test.c0000644000175000017500000006043613614062654021032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_functional_audio_test_init_suite(); int ags_functional_audio_test_clean_suite(); void ags_functional_audio_test_playback(); void ags_functional_audio_test_playback_add_sink(AgsAudio *audio); void ags_functional_audio_test_playback_add_mixer(AgsAudio *audio); void ags_functional_audio_test_playback_add_playback(AgsAudio *audio); void ags_functional_audio_test_playback_start_audio(AgsAudio *audio, AgsTaskLauncher *task_launcher); void ags_functional_audio_test_playback_stop_audio(AgsAudio *audio, AgsTaskLauncher *task_launcher, struct timespec *start_time); #define AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS (2) #define AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_PADS (78) #define AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO (4) #define AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_BUFFER (5) #define AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_NOTES (4 * (guint) (1.0 / AGS_NOTATION_MINIMUM_NOTE_LENGTH) * 120) #define AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_STOP_DELAY (120) #define AGS_FUNCTIONAL_AUDIO_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=48000\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsAudioApplicationContext *audio_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_audio_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FUNCTIONAL_AUDIO_TEST_CONFIG, strlen(AGS_FUNCTIONAL_AUDIO_TEST_CONFIG)); audio_application_context = (AgsApplicationContext *) ags_audio_application_context_new(); g_object_ref(audio_application_context); ags_application_context_prepare(audio_application_context); ags_application_context_setup(audio_application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_audio_test_clean_suite() { g_object_unref(audio_application_context); return(0); } void ags_functional_audio_test_playback_add_sink(AgsAudio *audio) { AgsChannel *channel; AgsPlayChannel *play_channel; AgsPlayChannelRunMaster *play_channel_run; GList *list; guint n_recall; channel = audio->input; while(channel != NULL){ /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-master", channel->audio_channel, channel->audio_channel + 1, channel->pad, channel->pad + 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* set audio channel */ list = channel->play; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_PLAY_CHANNEL)) != NULL){ GValue audio_channel_value = {0,}; CU_ASSERT(AGS_IS_PLAY_CHANNEL(list->data)); play_channel = AGS_PLAY_CHANNEL(list->data); CU_ASSERT(AGS_IS_PORT(play_channel->audio_channel)); g_value_init(&audio_channel_value, G_TYPE_UINT64); g_value_set_uint64(&audio_channel_value, channel->audio_channel); ags_port_safe_write(play_channel->audio_channel, &audio_channel_value); g_value_unset(&audio_channel_value); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); channel = channel->next; } } void ags_functional_audio_test_playback_add_mixer(AgsAudio *audio) { AgsChannel *channel; GList *list; guint n_recall; channel = audio->input; while(channel != NULL){ /* ags-mute */ ags_recall_factory_create(audio, NULL, NULL, "ags-mute", channel->audio_channel, channel->audio_channel + 1, channel->pad, channel->pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); list = channel->play; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_MUTE_CHANNEL)) != NULL){ CU_ASSERT(AGS_IS_MUTE_CHANNEL(list->data)); CU_ASSERT(AGS_IS_PORT(AGS_MUTE_CHANNEL(list->data)->muted)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); list = channel->recall; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_MUTE_CHANNEL)) != NULL){ CU_ASSERT(AGS_IS_MUTE_CHANNEL(list->data)); CU_ASSERT(AGS_IS_PORT(AGS_MUTE_CHANNEL(list->data)->muted)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); /* ags-volume */ ags_recall_factory_create(audio, NULL, NULL, "ags-volume", channel->audio_channel, channel->audio_channel + 1, channel->pad, channel->pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); list = channel->play; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_VOLUME_CHANNEL)) != NULL){ CU_ASSERT(AGS_IS_VOLUME_CHANNEL(list->data)); CU_ASSERT(AGS_IS_PORT(AGS_VOLUME_CHANNEL(list->data)->volume)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); list = channel->recall; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_VOLUME_CHANNEL)) != NULL){ CU_ASSERT(AGS_IS_VOLUME_CHANNEL(list->data)); CU_ASSERT(AGS_IS_PORT(AGS_VOLUME_CHANNEL(list->data)->volume)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); channel = channel->next; } } void ags_functional_audio_test_playback_add_playback(AgsAudio *audio) { AgsChannel *channel, *input; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *list; guint n_recall; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); play_delay_audio = NULL; play_delay_audio_run = NULL; list = audio->play; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_DELAY_AUDIO)) != NULL){ CU_ASSERT(AGS_IS_DELAY_AUDIO(list->data)); play_delay_audio = list->data; CU_ASSERT(AGS_IS_PORT(AGS_DELAY_AUDIO(list->data)->notation_delay)); CU_ASSERT(AGS_IS_PORT(AGS_DELAY_AUDIO(list->data)->sequencer_delay)); CU_ASSERT(AGS_IS_PORT(AGS_DELAY_AUDIO(list->data)->notation_duration)); CU_ASSERT(AGS_IS_PORT(AGS_DELAY_AUDIO(list->data)->sequencer_duration)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); list = ags_recall_find_type(audio->play, AGS_TYPE_DELAY_AUDIO_RUN); if(list != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(list->data); } /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); play_count_beats_audio = NULL; play_count_beats_audio_run = NULL; list = audio->play; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ CU_ASSERT(AGS_IS_COUNT_BEATS_AUDIO(list->data)); play_count_beats_audio = list->data; CU_ASSERT(AGS_IS_PORT(AGS_COUNT_BEATS_AUDIO(list->data)->notation_loop)); CU_ASSERT(AGS_IS_PORT(AGS_COUNT_BEATS_AUDIO(list->data)->notation_loop_start)); CU_ASSERT(AGS_IS_PORT(AGS_COUNT_BEATS_AUDIO(list->data)->notation_loop_end)); CU_ASSERT(AGS_IS_PORT(AGS_COUNT_BEATS_AUDIO(list->data)->sequencer_loop)); CU_ASSERT(AGS_IS_PORT(AGS_COUNT_BEATS_AUDIO(list->data)->sequencer_loop_start)); CU_ASSERT(AGS_IS_PORT(AGS_COUNT_BEATS_AUDIO(list->data)->sequencer_loop_end)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); list = ags_recall_find_type(audio->play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(list != NULL){ GValue value = {0,}; CU_ASSERT(AGS_IS_COUNT_BEATS_AUDIO_RUN(list->data)); play_count_beats_audio_run = list->data; /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), 0, TRUE); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, FALSE); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); } /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_RECALL), 0); recall_notation_audio = NULL; recall_notation_audio_run = NULL; list = audio->recall; n_recall = 0; while((list = ags_recall_template_find_type(list, AGS_TYPE_PLAY_NOTATION_AUDIO)) != NULL){ CU_ASSERT(AGS_IS_PLAY_NOTATION_AUDIO(list->data)); list = list->next; n_recall++; } CU_ASSERT(n_recall == 1); list = ags_recall_find_type(audio->recall, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(list != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(list->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } channel = audio->output; while(channel != NULL){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", channel->audio_channel, channel->audio_channel + 1, channel->pad, channel->pad + 1, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); input = ags_channel_pad_nth(audio->input, channel->pad); while(input != NULL){ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio->audio_channels, input->pad, input->pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); input = input->next_pad; } channel = channel->next; } channel = audio->input; while(channel != NULL){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", channel->audio_channel, channel->audio_channel + 1, channel->pad, channel->pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = channel->next; } } void ags_functional_audio_test_playback_start_audio(AgsAudio *audio, AgsTaskLauncher *task_launcher) { AgsStartAudio *start_audio; AgsStartSoundcard *start_soundcard; GList *task; task = NULL; start_audio = ags_start_audio_new(audio, AGS_SOUND_SCOPE_NOTATION); task = g_list_prepend(task, start_audio); start_soundcard = ags_start_soundcard_new(audio_application_context); task = g_list_prepend(task, start_soundcard); ags_task_launcher_add_task_all(task_launcher, task); } void ags_functional_audio_test_playback_stop_audio(AgsAudio *audio, AgsTaskLauncher *task_launcher, struct timespec *start_time) { AgsCancelAudio *cancel_audio; struct timespec sleep_time; clock_gettime(CLOCK_MONOTONIC, &sleep_time); while(sleep_time.tv_sec < start_time->tv_sec + AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_STOP_DELAY){ usleep(AGS_USEC_PER_SEC); clock_gettime(CLOCK_MONOTONIC, &sleep_time); g_message("ags_functional_audio_test_playback_stop_audio() - usleep %ds [%x]", start_time->tv_sec + AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_STOP_DELAY - sleep_time.tv_sec, audio); } /* create cancel task */ cancel_audio = ags_cancel_audio_new(audio, AGS_SOUND_SCOPE_NOTATION); /* append AgsCancelAudio */ ags_task_launcher_add_task(task_launcher, (AgsTask *) cancel_audio); } void ags_functional_audio_test_playback() { AgsAudio *panel, *mixer; AgsAudio **audio; AgsChannel *channel, *link, *current; AgsTaskLauncher *task_launcher; AgsThread *audio_loop, *soundcard_thread; GObject *soundcard; GList *start_queue; GList *list; struct timespec start_time; guint i, j, k; GError *error; /* * Setup audio tree sink, mixer and notation player as source */ soundcard = NULL; if(audio_application_context->soundcard != NULL){ soundcard = audio_application_context->soundcard->data; } /* the output panel */ panel = ags_audio_new(soundcard); g_object_ref(panel); panel->flags |= (AGS_AUDIO_SYNC); panel->audio_channels = AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; ags_audio_set_pads(panel, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(panel, AGS_TYPE_INPUT, 1, 0); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(audio_application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(audio_application_context), g_list_prepend(list, panel)); ags_functional_audio_test_playback_add_sink(panel); ags_connectable_connect(AGS_CONNECTABLE(panel)); /* assert recycling NULL */ channel = panel->output; for(i = 0; i < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; i++){ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); channel = channel->next; } channel = panel->input; for(i = 0; i < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; i++){ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); channel = channel->next; } /* the mixer */ mixer = ags_audio_new(soundcard); g_object_ref(mixer); mixer->flags |= (AGS_AUDIO_ASYNC); mixer->audio_channels = AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; ags_audio_set_pads(mixer, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(mixer, AGS_TYPE_INPUT, AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO, 0); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(audio_application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(audio_application_context), g_list_prepend(list, mixer)); ags_functional_audio_test_playback_add_mixer(mixer); ags_connectable_connect(AGS_CONNECTABLE(mixer)); /* set link, assert link set and recycling NULL */ channel = mixer->output; link = panel->input; for(i = 0; i < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); CU_ASSERT(link->first_recycling == NULL); CU_ASSERT(link->last_recycling == NULL); channel = channel->next; link = link->next; } /* create sources */ audio = (AgsAudio **) malloc(AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO * sizeof(AgsAudio *)); for(i = 0; i < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO; i++){ AgsNotation *notation; AgsTimestamp *timestamp; GList *list_notation; audio[i] = ags_audio_new(soundcard); g_object_ref(audio[i]); ags_audio_set_flags(audio[i], (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(audio[i], (AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio[i], (AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_set_audio_channels(audio[i], AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS, 0); ags_audio_set_pads(audio[i], AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio[i], AGS_TYPE_INPUT, AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_PADS, 0); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(audio_application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(audio_application_context), g_list_prepend(list, audio[i])); /* populate notation and set link, assert link set and recycling not NULL */ channel = audio[i]->output; link = ags_channel_pad_nth(mixer->input, i); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; for(j = 0; j < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; j++){ AgsAudioSignal *destination; destination = ags_audio_signal_new_with_length(soundcard, channel->first_recycling, NULL, AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_BUFFER); destination->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(channel->first_recycling, destination); /* populate notation */ for(k = 0; k < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_NOTES; k++){ AgsNote *note; note = ags_note_new(); note->x[0] = k + (rand() % 4); note->x[1] = note->x[0] + (rand() % 3) + 1; note->y = rand() % AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_PADS; timestamp->timer.ags_offset.offset = (guint64) AGS_NOTATION_DEFAULT_OFFSET * floor((double) note->x[0] / (double) AGS_NOTATION_DEFAULT_OFFSET); list_notation = audio[i]->notation; list_notation = ags_notation_find_near_timestamp(list_notation, j, timestamp); if(list_notation != NULL){ notation = list_notation->data; }else{ notation = ags_notation_new(audio[i], j); audio[i]->notation = ags_notation_add(audio[i]->notation, notation); } ags_notation_add_note(notation, note, FALSE); } /* set link */ error = NULL; ags_channel_set_link(channel, link, &error); CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); CU_ASSERT(channel->first_recycling != NULL); CU_ASSERT(channel->last_recycling != NULL); CU_ASSERT(link->first_recycling == channel->first_recycling); CU_ASSERT(link->last_recycling == channel->last_recycling); channel = channel->next; link = link->next; } channel = audio[i]->input; for(j = 0; j < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_PADS; j++){ AgsAudioSignal *source; source = ags_audio_signal_new_with_length(soundcard, channel->first_recycling, NULL, AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_BUFFER); source->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(channel->first_recycling, source); channel = channel->next; } /* find recycling within mixer */ channel = audio[i]->output; current = mixer->output; for(j = 0; j < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; j++){ CU_ASSERT(ags_recycling_position(current->first_recycling, current->last_recycling->next, channel->first_recycling) != -1); channel = channel->next; current = current->next; } /* find recycling within panel */ channel = audio[i]->output; current = panel->input; for(j = 0; j < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO_CHANNELS; j++){ CU_ASSERT(ags_recycling_position(current->first_recycling, current->last_recycling->next, channel->first_recycling) != -1); channel = channel->next; current = current->next; } ags_functional_audio_test_playback_add_playback(audio[i]); ags_connectable_connect(AGS_CONNECTABLE(audio[i])); } /* * Start threads and enable playback */ audio_loop = AGS_APPLICATION_CONTEXT(audio_application_context)->main_loop; task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(audio_application_context)); soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); /* wait for audio loop */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(audio_loop)); if(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT)){ ags_thread_unset_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE); while(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(AGS_THREAD_GET_START_COND(audio_loop), AGS_THREAD_GET_START_MUTEX(audio_loop)); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(audio_loop)); /* start playback */ g_message("start playback"); for(i = 0; i < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO; i++){ ags_functional_audio_test_playback_start_audio(audio[i], task_launcher); } clock_gettime(CLOCK_MONOTONIC, &start_time); /* stop playback */ for(i = 0; i < AGS_FUNCTIONAL_AUDIO_TEST_PLAYBACK_N_AUDIO; i++){ ags_functional_audio_test_playback_stop_audio(audio[i], task_launcher, &start_time); } g_message("playback stopped"); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalAudioTest", ags_functional_audio_test_init_suite, ags_functional_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } #if 0 g_log_set_fatal_mask("GLib-GObject", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("Gtk", G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask(NULL, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); #endif /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAudio doing playback", ags_functional_audio_test_playback) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/0000755000175000017500000000000013622252263014757 500000000000000gsequencer-3.1.3/ags/test/audio/recall/ags_feed_audio_signal_test.c0000644000175000017500000002330613614062654022365 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_feed_audio_signal_test_init_suite(); int ags_feed_audio_signal_test_clean_suite(); void ags_feed_audio_signal_test_run_pre(); void ags_feed_audio_signal_test_run_pre_callback(AgsRecall *recall, gpointer data); #define AGS_FEED_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_pre_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_feed_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-feed */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-feed", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_feed_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_feed_audio_signal_test_run_pre_callback(AgsRecall *recall, gpointer data) { test_run_pre_invoke_count += 1; } void ags_feed_audio_signal_test_run_pre() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsNote *note; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ note = ags_note_new(); note->x[0] = 0; note->x[1] = 64; //NOTE:JK: should match AGS_FEED_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH iterations note->y = 0; audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_FEED_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH); ags_audio_signal_add_note(audio_signal, note); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_FEED_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_FEED_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_FEED_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_pre != NULL); g_signal_connect(recall_audio_signal->data, "run-pre", G_CALLBACK(ags_feed_audio_signal_test_run_pre_callback), NULL); for(i = 0; i < AGS_FEED_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_pre(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_pre_invoke_count == AGS_FEED_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFeedAudioSignalTest", ags_feed_audio_signal_test_init_suite, ags_feed_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFeedAudioSignal run-pre", ags_feed_audio_signal_test_run_pre) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_envelope_audio_signal_test.c0000644000175000017500000002311713614062654023277 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_envelope_audio_signal_test_init_suite(); int ags_envelope_audio_signal_test_clean_suite(); void ags_envelope_audio_signal_test_run_inter(); void ags_envelope_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_envelope_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-envelope */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_envelope_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_envelope_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_envelope_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_ENVELOPE_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_ENVELOPE_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_ENVELOPE_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_envelope_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_ENVELOPE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsEnvelopeAudioSignalTest", ags_envelope_audio_signal_test_init_suite, ags_envelope_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsEnvelopeAudioSignal run inter", ags_envelope_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_analyse_audio_signal_test.c0000644000175000017500000002306713614062654023122 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_analyse_audio_signal_test_init_suite(); int ags_analyse_audio_signal_test_clean_suite(); void ags_analyse_audio_signal_test_run_inter(); void ags_analyse_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_ANALYSE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_analyse_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-analyse */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-analyse", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_analyse_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_analyse_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_analyse_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_ANALYSE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_ANALYSE_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_ANALYSE_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_ANALYSE_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_analyse_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_ANALYSE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_ANALYSE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAnalyseAudioSignalTest", ags_analyse_audio_signal_test_init_suite, ags_analyse_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAnalyseAudioSignal run inter", ags_analyse_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_stream_audio_signal_test.c0000644000175000017500000002262313614062654022756 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_stream_audio_signal_test_init_suite(); int ags_stream_audio_signal_test_clean_suite(); void ags_stream_audio_signal_test_run_post(); void ags_stream_audio_signal_test_run_post_callback(AgsRecall *recall, gpointer data); #define AGS_STREAM_AUDIO_SIGNAL_TEST_RUN_POST_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_post_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_stream_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-stream */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-stream", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_stream_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_stream_audio_signal_test_run_post_callback(AgsRecall *recall, gpointer data) { test_run_post_invoke_count += 1; } void ags_stream_audio_signal_test_run_post() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_STREAM_AUDIO_SIGNAL_TEST_RUN_POST_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_STREAM_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_STREAM_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_STREAM_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_post != NULL); g_signal_connect(recall_audio_signal->data, "run-post", G_CALLBACK(ags_stream_audio_signal_test_run_post_callback), NULL); for(i = 0; i < AGS_STREAM_AUDIO_SIGNAL_TEST_RUN_POST_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_post(recall_audio_signal->data); } CU_ASSERT(test_run_post_invoke_count == AGS_STREAM_AUDIO_SIGNAL_TEST_RUN_POST_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsStreamAudioSignalTest", ags_stream_audio_signal_test_init_suite, ags_stream_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsStreamAudioSignal run inter", ags_stream_audio_signal_test_run_post) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_volume_audio_signal_test.c0000644000175000017500000002304113614062654022765 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_volume_audio_signal_test_init_suite(); int ags_volume_audio_signal_test_clean_suite(); void ags_volume_audio_signal_test_run_inter(); void ags_volume_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_VOLUME_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_volume_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-volume */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-volume", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_volume_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_volume_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_volume_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_VOLUME_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_VOLUME_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_VOLUME_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_VOLUME_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_volume_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_VOLUME_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_VOLUME_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsVolumeAudioSignalTest", ags_volume_audio_signal_test_init_suite, ags_volume_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsVolumeAudioSignal run inter", ags_volume_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_volume_channel_test.c0000644000175000017500000001017513614062654021743 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_volume_channel_test_init_suite(); int ags_volume_channel_test_clean_suite(); void ags_volume_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_volume_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_volume_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_volume_channel_test_port() { AgsVolumeChannel *volume_channel; AgsPort *port; volume_channel = ags_volume_channel_new(audio->input); CU_ASSERT(volume_channel != NULL); CU_ASSERT(AGS_IS_VOLUME_CHANNEL(volume_channel)); /* test ports */ port = NULL; g_object_get(volume_channel, "volume", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsVolumeChannelTest", ags_volume_channel_test_init_suite, ags_volume_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsVolumeChannel port", ags_volume_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_buffer_audio_signal_test.c0000644000175000017500000002304113614062654022727 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_buffer_audio_signal_test_init_suite(); int ags_buffer_audio_signal_test_clean_suite(); void ags_buffer_audio_signal_test_run_inter(); void ags_buffer_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_BUFFER_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-buffer */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_buffer_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_buffer_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_BUFFER_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_BUFFER_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_BUFFER_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_BUFFER_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_buffer_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_BUFFER_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_BUFFER_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsBufferAudioSignalTest", ags_buffer_audio_signal_test_init_suite, ags_buffer_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsBufferAudioSignal run inter", ags_buffer_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_play_audio_signal_test.c0000644000175000017500000002276313614062654022435 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_play_audio_signal_test_init_suite(); int ags_play_audio_signal_test_clean_suite(); void ags_play_audio_signal_test_run_inter(); void ags_play_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_PLAY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-play */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-play", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_play_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_play_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_PLAY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_PLAY_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_PLAY_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_PLAY_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_play_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_PLAY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_PLAY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlayAudioSignalTest", ags_play_audio_signal_test_init_suite, ags_play_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlayAudioSignal run inter", ags_play_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_route_dssi_audio_test.c0000644000175000017500000001047613614062654022311 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_route_dssi_audio_test_init_suite(); int ags_route_dssi_audio_test_clean_suite(); void ags_route_dssi_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_route_dssi_audio_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_route_dssi_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_route_dssi_audio_test_port() { AgsRouteDssiAudio *route_dssi_audio; AgsPort *port; route_dssi_audio = ags_route_dssi_audio_new(audio); CU_ASSERT(route_dssi_audio != NULL); CU_ASSERT(AGS_IS_ROUTE_DSSI_AUDIO(route_dssi_audio)); /* test ports */ port = NULL; g_object_get(route_dssi_audio, "notation-input", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(route_dssi_audio, "sequencer-input", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRouteDssiAudioTest", ags_route_dssi_audio_test_init_suite, ags_route_dssi_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRouteDssiAudio port", ags_route_dssi_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_envelope_channel_test.c0000644000175000017500000001232013614062654022243 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_envelope_channel_test_init_suite(); int ags_envelope_channel_test_clean_suite(); void ags_envelope_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_envelope_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_envelope_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_envelope_channel_test_port() { AgsEnvelopeChannel *envelope_channel; AgsPort *port; envelope_channel = ags_envelope_channel_new(audio->input); CU_ASSERT(envelope_channel != NULL); CU_ASSERT(AGS_IS_ENVELOPE_CHANNEL(envelope_channel)); /* test ports */ port = NULL; g_object_get(envelope_channel, "use-note-length", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "use-fixed-length", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "fixed-length", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "attack", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "decay", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "sustain", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "release", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(envelope_channel, "ratio", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsEnvelopeChannelTest", ags_envelope_channel_test_init_suite, ags_envelope_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsEnvelopeChannel port", ags_envelope_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_copy_audio_signal_test.c0000644000175000017500000002304613614062654022435 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_copy_audio_signal_test_init_suite(); int ags_copy_audio_signal_test_clean_suite(); void ags_copy_audio_signal_test_run_inter(); void ags_copy_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_COPY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-copy */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_copy_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_copy_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_COPY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_COPY_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_COPY_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_COPY_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_copy_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_COPY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_pre(recall_audio_signal->data); ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_COPY_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCopyAudioSignalTest", ags_copy_audio_signal_test_init_suite, ags_copy_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCopyAudioSignal run inter", ags_copy_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_route_lv2_audio_test.c0000644000175000017500000001045013614062654022042 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_route_lv2_audio_test_init_suite(); int ags_route_lv2_audio_test_clean_suite(); void ags_route_lv2_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_route_lv2_audio_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_route_lv2_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_route_lv2_audio_test_port() { AgsRouteLv2Audio *route_lv2_audio; AgsPort *port; route_lv2_audio = ags_route_lv2_audio_new(audio); CU_ASSERT(route_lv2_audio != NULL); CU_ASSERT(AGS_IS_ROUTE_LV2_AUDIO(route_lv2_audio)); /* test ports */ port = NULL; g_object_get(route_lv2_audio, "notation-input", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(route_lv2_audio, "sequencer-input", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRouteLv2AudioTest", ags_route_lv2_audio_test_init_suite, ags_route_lv2_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRouteLv2Audio port", ags_route_lv2_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_delay_audio_test.c0000644000175000017500000001215413614062654021222 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_delay_audio_test_init_suite(); int ags_delay_audio_test_clean_suite(); void ags_delay_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_delay_audio_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_delay_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_delay_audio_test_port() { AgsDelayAudio *delay_audio; AgsPort *port; delay_audio = ags_delay_audio_new(audio); CU_ASSERT(delay_audio != NULL); CU_ASSERT(AGS_IS_DELAY_AUDIO(delay_audio)); /* test ports */ port = NULL; g_object_get(delay_audio, "sequencer-delay", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "notation-delay", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "wave-delay", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "midi-delay", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "sequencer-duration", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "notation-duration", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "wave-duration", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(delay_audio, "midi-duration", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsDelayAudioTest", ags_delay_audio_test_init_suite, ags_delay_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsDelayAudio port", ags_delay_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_copy_channel_test.c0000644000175000017500000001015513614062654021404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_copy_channel_test_init_suite(); int ags_copy_channel_test_clean_suite(); void ags_copy_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_copy_channel_test_port() { AgsCopyChannel *copy_channel; AgsPort *port; copy_channel = ags_copy_channel_new(audio->output, audio->input); CU_ASSERT(copy_channel != NULL); CU_ASSERT(AGS_IS_COPY_CHANNEL(copy_channel)); /* test ports */ port = NULL; g_object_get(copy_channel, "muted", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCopyChannelTest", ags_copy_channel_test_init_suite, ags_copy_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCopyChannel port", ags_copy_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_mute_channel_test.c0000644000175000017500000001012713614062654021403 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_mute_channel_test_init_suite(); int ags_mute_channel_test_clean_suite(); void ags_mute_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_mute_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_mute_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_mute_channel_test_port() { AgsMuteChannel *mute_channel; AgsPort *port; mute_channel = ags_mute_channel_new(audio->input); CU_ASSERT(mute_channel != NULL); CU_ASSERT(AGS_IS_MUTE_CHANNEL(mute_channel)); /* test ports */ port = NULL; g_object_get(mute_channel, "muted", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMuteChannelTest", ags_mute_channel_test_init_suite, ags_mute_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMuteChannel port", ags_mute_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_capture_wave_audio_test.c0000644000175000017500000001334313614062654022612 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_capture_wave_audio_test_init_suite(); int ags_capture_wave_audio_test_clean_suite(); void ags_capture_wave_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_capture_wave_audio_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_capture_wave_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_capture_wave_audio_test_port() { AgsCaptureWaveAudio *capture_wave_audio; AgsPort *port; capture_wave_audio = ags_capture_wave_audio_new(audio); CU_ASSERT(capture_wave_audio != NULL); CU_ASSERT(AGS_IS_CAPTURE_WAVE_AUDIO(capture_wave_audio)); /* test ports */ port = NULL; g_object_get(capture_wave_audio, "playback", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "replace", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "record", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "filename", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "file-audio-channels", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "file-samplerate", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "file-buffer-size", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "file-format", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "wave-loop", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "wave-loop-start", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(capture_wave_audio, "wave-loop-end", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCaptureWaveAudioTest", ags_capture_wave_audio_test_init_suite, ags_capture_wave_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCaptureWaveAudio port", ags_capture_wave_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_record_midi_audio_test.c0000644000175000017500000001120013605312646022372 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_record_midi_audio_test_init_suite(); int ags_record_midi_audio_test_clean_suite(); void ags_record_midi_audio_test_port(); AgsDevout *devout; AgsAudio *audio; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_record_midi_audio_test_init_suite() { ags_application_context = ags_audio_application_context_new(); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_record_midi_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_record_midi_audio_test_port() { AgsRecordMidiAudio *record_midi_audio; AgsPort *port; record_midi_audio = ags_record_midi_audio_new(audio); CU_ASSERT(record_midi_audio != NULL); CU_ASSERT(AGS_IS_RECORD_MIDI_AUDIO(record_midi_audio)); /* test ports */ port = NULL; g_object_get(record_midi_audio, "playback", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(record_midi_audio, "record", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(record_midi_audio, "filename", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(record_midi_audio, "division", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(record_midi_audio, "tempo", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(record_midi_audio, "bpm", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecordMidiAudioTest", ags_record_midi_audio_test_init_suite, ags_record_midi_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecordMidiAudio port", ags_record_midi_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_copy_pattern_audio_test.c0000644000175000017500000001013013605312646022622 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_copy_pattern_audio_test_init_suite(); int ags_copy_pattern_audio_test_clean_suite(); void ags_copy_pattern_audio_test_port(); AgsDevout *devout; AgsAudio *audio; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_pattern_audio_test_init_suite() { ags_application_context = ags_audio_application_context_new(); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_audio_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_audio_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_pattern_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_copy_pattern_audio_test_port() { AgsCopyPatternAudio *copy_pattern_audio; AgsPort *port; copy_pattern_audio = ags_copy_pattern_audio_new(audio, 0, 0); CU_ASSERT(copy_pattern_audio != NULL); CU_ASSERT(AGS_IS_COPY_PATTERN_AUDIO(copy_pattern_audio)); /* test ports */ port = NULL; g_object_get(copy_pattern_audio, "bank-index-0", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(copy_pattern_audio, "bank-index-1", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCopyPatternAudioTest", ags_copy_pattern_audio_test_init_suite, ags_copy_pattern_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCopyPatternAudio port", ags_copy_pattern_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_capture_wave_channel_test.c0000644000175000017500000000772213605312646023124 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_capture_wave_channel_test_init_suite(); int ags_capture_wave_channel_test_clean_suite(); void ags_capture_wave_channel_test_port(); AgsDevout *devout; AgsAudio *audio; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_capture_wave_channel_test_init_suite() { ags_application_context = ags_audio_application_context_new(); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_capture_wave_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_capture_wave_channel_test_port() { AgsCaptureWaveChannel *capture_wave_channel; AgsPort *port; capture_wave_channel = ags_capture_wave_channel_new(audio->input); CU_ASSERT(capture_wave_channel != NULL); CU_ASSERT(AGS_IS_CAPTURE_WAVE_CHANNEL(capture_wave_channel)); /* test ports */ port = NULL; g_object_get(capture_wave_channel, "x-offset", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCaptureWaveChannelTest", ags_capture_wave_channel_test_init_suite, ags_capture_wave_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCaptureWaveChannel port", ags_capture_wave_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_analyse_channel_test.c0000644000175000017500000001653613614062654022077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_analyse_channel_test_init_suite(); int ags_analyse_channel_test_clean_suite(); void ags_analyse_channel_test_port(); void ags_analyse_channel_test_buffer_add(); void ags_analyse_channel_test_retrieve_frequency_and_magnitude(); #define AGS_ANALYSE_CHANNEL_TEST_BUFFER_ADD_FREQUENCY (440.0) #define AGS_ANALYSE_CHANNEL_TEST_RETRIEVE_FREQUENCY_AND_MAGNITUDE_FREQUENCY (440.0) AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_analyse_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_analyse_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_analyse_channel_test_port() { AgsAnalyseChannel *analyse_channel; AgsPort *port; analyse_channel = ags_analyse_channel_new(audio->input); CU_ASSERT(analyse_channel != NULL); CU_ASSERT(AGS_IS_ANALYSE_CHANNEL(analyse_channel)); /* test ports */ port = NULL; g_object_get(analyse_channel, "buffer-cleared", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(analyse_channel, "buffer-computed", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(analyse_channel, "frequency-buffer", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(analyse_channel, "magnitude-buffer", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } void ags_analyse_channel_test_buffer_add() { AgsAnalyseChannel *analyse_channel; gint16 *s16_buffer; guint orig_xcross_count, xcross_count; guint i; analyse_channel = ags_analyse_channel_new(audio->input); /* create buffer and fill it */ s16_buffer = ags_stream_alloc(analyse_channel->cache_buffer_size, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < analyse_channel->cache_buffer_size; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_ANALYSE_CHANNEL_TEST_BUFFER_ADD_FREQUENCY / analyse_channel->cache_samplerate); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, analyse_channel->cache_buffer_size); /* test */ ags_audio_buffer_util_clear_double(analyse_channel->in, 1, analyse_channel->cache_buffer_size); ags_analyse_channel_buffer_add(analyse_channel, s16_buffer, analyse_channel->cache_samplerate, analyse_channel->cache_buffer_size, AGS_SOUNDCARD_SIGNED_16_BIT); xcross_count = ags_synth_util_get_xcross_count(analyse_channel->in, analyse_channel->cache_format, analyse_channel->cache_buffer_size); CU_ASSERT(xcross_count == orig_xcross_count); } void ags_analyse_channel_test_retrieve_frequency_and_magnitude() { AgsAnalyseChannel *analyse_channel; gint16 *s16_buffer; guint i; gboolean is_empty; analyse_channel = ags_analyse_channel_new(audio->input); /* create buffer and fill it */ s16_buffer = ags_stream_alloc(analyse_channel->cache_buffer_size, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < analyse_channel->cache_buffer_size; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_ANALYSE_CHANNEL_TEST_RETRIEVE_FREQUENCY_AND_MAGNITUDE_FREQUENCY / analyse_channel->cache_samplerate); } ags_analyse_channel_buffer_add(analyse_channel, s16_buffer, analyse_channel->cache_samplerate, analyse_channel->cache_buffer_size, AGS_SOUNDCARD_SIGNED_16_BIT); /* test */ ags_analyse_channel_retrieve_frequency_and_magnitude(analyse_channel); is_empty = TRUE; for(i = 0; i < ceil(analyse_channel->cache_buffer_size / 2.0); i++){ if(analyse_channel->magnitude_pre_buffer[i] != 0.0){ is_empty = FALSE; break; } } CU_ASSERT(is_empty == FALSE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAnalyseChannelTest", ags_analyse_channel_test_init_suite, ags_analyse_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAnalyseChannel port", ags_analyse_channel_test_port) == NULL) || (CU_add_test(pSuite, "test of AgsAnalyseChannel buffer add", ags_analyse_channel_test_buffer_add) == NULL) || (CU_add_test(pSuite, "test of AgsAnalyseChannel retrieve frequency and magnitude", ags_analyse_channel_test_retrieve_frequency_and_magnitude) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_buffer_channel_test.c0000644000175000017500000001007113614062654021700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_buffer_channel_test_init_suite(); int ags_buffer_channel_test_clean_suite(); void ags_buffer_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_buffer_channel_test_port() { AgsBufferChannel *buffer_channel; AgsPort *port; buffer_channel = ags_buffer_channel_new(audio->output, audio->input); CU_ASSERT(buffer_channel != NULL); CU_ASSERT(AGS_IS_BUFFER_CHANNEL(buffer_channel)); /* test ports */ port = NULL; g_object_get(buffer_channel, "muted", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsBufferChannelTest", ags_buffer_channel_test_init_suite, ags_buffer_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsBufferChannel port", ags_buffer_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_play_audio_test.c0000644000175000017500000001005213614062654021064 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_play_audio_test_init_suite(); int ags_play_audio_test_clean_suite(); void ags_play_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_audio_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_play_audio_test_port() { AgsPlayAudio *play_audio; AgsPort *port; play_audio = ags_play_audio_new(audio); CU_ASSERT(play_audio != NULL); CU_ASSERT(AGS_IS_PLAY_AUDIO(play_audio)); /* test ports */ port = NULL; g_object_get(play_audio, "muted", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlayAudioTest", ags_play_audio_test_init_suite, ags_play_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlayAudio port", ags_play_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_eq10_audio_signal_test.c0000644000175000017500000002276513614062654022240 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_eq10_audio_signal_test_init_suite(); int ags_eq10_audio_signal_test_clean_suite(); void ags_eq10_audio_signal_test_run_inter(); void ags_eq10_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_EQ10_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_eq10_audio_signal_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-eq10 */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-eq10", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_eq10_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_eq10_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_eq10_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_EQ10_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_EQ10_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_EQ10_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_EQ10_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_eq10_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_EQ10_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_EQ10_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsEq10AudioSignalTest", ags_eq10_audio_signal_test_init_suite, ags_eq10_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsEq10AudioSignal run inter", ags_eq10_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_count_beats_audio_test.c0000644000175000017500000001364613605312646022440 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_count_beats_audio_test_init_suite(); int ags_count_beats_audio_test_clean_suite(); void ags_count_beats_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_count_beats_audio_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_count_beats_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_count_beats_audio_test_port() { AgsCountBeatsAudio *count_beats_audio; AgsPort *port; count_beats_audio = ags_count_beats_audio_new(audio); CU_ASSERT(count_beats_audio != NULL); CU_ASSERT(AGS_IS_COUNT_BEATS_AUDIO(count_beats_audio)); /* test ports - sequencer */ port = NULL; g_object_get(count_beats_audio, "sequencer-loop", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "sequencer-loop-start", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "sequencer-loop-end", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); /* test ports - notation */ port = NULL; g_object_get(count_beats_audio, "notation-loop", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "notation-loop-start", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "notation-loop-end", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); /* test ports - wave */ port = NULL; g_object_get(count_beats_audio, "wave-loop", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "wave-loop-start", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "wave-loop-end", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); /* test ports - midi */ port = NULL; g_object_get(count_beats_audio, "midi-loop", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "midi-loop-start", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(count_beats_audio, "midi-loop-end", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCountBeatsAudioTest", ags_count_beats_audio_test_init_suite, ags_count_beats_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCountBeatsAudio port", ags_count_beats_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_mute_audio_test.c0000644000175000017500000000775413605312646021107 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_mute_audio_test_init_suite(); int ags_mute_audio_test_clean_suite(); void ags_mute_audio_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_mute_audio_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_mute_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_mute_audio_test_port() { AgsMuteAudio *mute_audio; AgsPort *port; mute_audio = ags_mute_audio_new(audio); CU_ASSERT(mute_audio != NULL); CU_ASSERT(AGS_IS_MUTE_AUDIO(mute_audio)); /* test ports */ port = NULL; g_object_get(mute_audio, "muted", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMuteAudioTest", ags_mute_audio_test_init_suite, ags_mute_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMuteAudio port", ags_mute_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_mute_audio_signal_test.c0000644000175000017500000002266713605312646022444 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_mute_audio_signal_test_init_suite(); int ags_mute_audio_signal_test_clean_suite(); void ags_mute_audio_signal_test_run_inter(); void ags_mute_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_MUTE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_mute_audio_signal_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-mute */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-mute", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_mute_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_mute_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_mute_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_MUTE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_MUTE_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_MUTE_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_MUTE_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_mute_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_MUTE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_MUTE_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMuteAudioSignalTest", ags_mute_audio_signal_test_init_suite, ags_mute_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMuteAudioSignal run inter", ags_mute_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_peak_channel_test.c0000644000175000017500000001074513605312646021356 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_peak_channel_test_init_suite(); int ags_peak_channel_test_clean_suite(); void ags_peak_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_peak_channel_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_peak_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_peak_channel_test_port() { AgsPeakChannel *peak_channel; AgsPort *port; peak_channel = ags_peak_channel_new(audio->input); CU_ASSERT(peak_channel != NULL); CU_ASSERT(AGS_IS_PEAK_CHANNEL(peak_channel)); /* test ports */ port = NULL; g_object_get(peak_channel, "buffer-cleared", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(peak_channel, "buffer-computed", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(peak_channel, "scale-precision", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(peak_channel, "peak", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPeakChannelTest", ags_peak_channel_test_init_suite, ags_peak_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPeakChannel port", ags_peak_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_copy_pattern_channel_test.c0000644000175000017500000001030213605312646023132 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_copy_pattern_channel_test_init_suite(); int ags_copy_pattern_channel_test_clean_suite(); void ags_copy_pattern_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_pattern_channel_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_copy_pattern_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_copy_pattern_channel_test_port() { AgsCopyPatternChannel *copy_pattern_channel; AgsPort *port; copy_pattern_channel = ags_copy_pattern_channel_new(NULL, audio->input); CU_ASSERT(copy_pattern_channel != NULL); CU_ASSERT(AGS_IS_COPY_PATTERN_CHANNEL(copy_pattern_channel)); /* test ports */ port = NULL; g_object_get(copy_pattern_channel, "pattern", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCopyPatternChannelTest", ags_copy_pattern_channel_test_init_suite, ags_copy_pattern_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCopyPatternChannel port", ags_copy_pattern_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_play_wave_channel_test.c0000644000175000017500000001042313605312646022416 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_play_wave_channel_test_init_suite(); int ags_play_wave_channel_test_clean_suite(); void ags_play_wave_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_wave_channel_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_wave_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_play_wave_channel_test_port() { AgsPlayWaveChannel *play_wave_channel; AgsPort *port; play_wave_channel = ags_play_wave_channel_new(audio->input); CU_ASSERT(play_wave_channel != NULL); CU_ASSERT(AGS_IS_PLAY_WAVE_CHANNEL(play_wave_channel)); /* test ports */ port = NULL; g_object_get(play_wave_channel, "do-playback", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(play_wave_channel, "x-offset", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlayWaveChannelTest", ags_play_wave_channel_test_init_suite, ags_play_wave_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlayWaveChannel port", ags_play_wave_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_peak_audio_signal_test.c0000644000175000017500000002266713605312646022412 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_peak_audio_signal_test_init_suite(); int ags_peak_audio_signal_test_clean_suite(); void ags_peak_audio_signal_test_run_inter(); void ags_peak_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data); #define AGS_PEAK_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_inter_invoke_count = 0; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_peak_audio_signal_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-peak */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-peak", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_peak_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_peak_audio_signal_test_run_inter_callback(AgsRecall *recall, gpointer data) { test_run_inter_invoke_count += 1; } void ags_peak_audio_signal_test_run_inter() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_PEAK_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_PEAK_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_PEAK_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_PEAK_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_inter != NULL); g_signal_connect(recall_audio_signal->data, "run-inter", G_CALLBACK(ags_peak_audio_signal_test_run_inter_callback), NULL); for(i = 0; i < AGS_PEAK_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_inter(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_inter_invoke_count == AGS_PEAK_AUDIO_SIGNAL_TEST_RUN_INTER_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPeakAudioSignalTest", ags_peak_audio_signal_test_init_suite, ags_peak_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPeakAudioSignal run inter", ags_peak_audio_signal_test_run_inter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_prepare_audio_signal_test.c0000644000175000017500000002237513605312646023124 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_prepare_audio_signal_test_init_suite(); int ags_prepare_audio_signal_test_clean_suite(); void ags_prepare_audio_signal_test_run_pre(); void ags_prepare_audio_signal_test_run_pre_callback(AgsRecall *recall, gpointer data); #define AGS_PREPARE_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH (24) AgsDevout *devout; AgsAudio *audio; GList *recall; guint test_run_pre_invoke_count = 0; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_prepare_audio_signal_test_init_suite() { ags_application_context = ags_audio_application_context_new(); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-prepare */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-prepare", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_prepare_audio_signal_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_prepare_audio_signal_test_run_pre_callback(AgsRecall *recall, gpointer data) { test_run_pre_invoke_count += 1; } void ags_prepare_audio_signal_test_run_pre() { AgsChannel *output; AgsChannel *input; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *output_audio_recall_id; AgsRecallID *input_audio_recall_id; AgsRecallID *output_recall_id; AgsRecallID *input_recall_id; AgsRecyclingContext *output_recycling_context; AgsRecyclingContext *input_recycling_context; GList *start_list, *list; GList *start_recall_recycling, *recall_recycling; GList *start_recall_audio_signal, *recall_audio_signal; guint i; output = audio->output; input = audio->input; recycling = input->first_recycling; /* output - create recall id and recycling context */ output_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, output_audio_recall_id); output_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(output_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(output, output_recall_id); output_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(output_recycling_context, output->first_recycling, 0); ags_audio_add_recycling_context(audio, output_recycling_context); g_object_set(output_audio_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recall_id, "recycling-context", output_recycling_context, NULL); g_object_set(output_recycling_context, "recall-id", output_recall_id, NULL); /* input - create recall id and recycling context */ input_audio_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_audio_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_audio_add_recall_id(audio, input_audio_recall_id); input_recall_id = ags_recall_id_new(); ags_recall_id_set_sound_scope(input_recall_id, AGS_SOUND_SCOPE_PLAYBACK); ags_channel_add_recall_id(input, input_recall_id); input_recycling_context = ags_recycling_context_new(1); ags_recycling_context_replace(input_recycling_context, recycling, 0); ags_audio_add_recycling_context(audio, input_recycling_context); g_object_set(input_audio_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(input_recall_id, "recycling-context", input_recycling_context, NULL); g_object_set(output_recycling_context, "child", input_recycling_context, NULL); g_object_set(input_recycling_context, "recall-id", input_recall_id, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, input_audio_recall_id, 0, 0, 0); ags_channel_duplicate_recall(input, input_recall_id); /* resolve recall */ ags_audio_resolve_recall(audio, input_audio_recall_id); ags_channel_resolve_recall(input, input_recall_id); /* init recall */ ags_audio_init_recall(audio, input_audio_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); ags_channel_init_recall(input, input_recall_id, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, input_recall_id); ags_audio_signal_stream_resize(audio_signal, AGS_PREPARE_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH); audio_signal->stream_current = audio_signal->stream; ags_recycling_add_audio_signal(recycling, audio_signal); /* test */ g_object_get(input, "recall", &start_list, NULL); list = ags_recall_find_type_with_recycling_context(start_list, AGS_TYPE_PREPARE_CHANNEL_RUN, input_recycling_context); g_object_get(list->data, "child", &start_recall_recycling, NULL); recall_recycling = ags_recall_find_recycling_context(start_recall_recycling, input_recycling_context); g_object_get(start_recall_recycling->data, "child", &start_recall_audio_signal, NULL); recall_audio_signal = ags_recall_find_provider_with_recycling_context(start_recall_audio_signal, audio_signal, input_recycling_context); CU_ASSERT(recall_audio_signal != NULL); CU_ASSERT(AGS_IS_PREPARE_AUDIO_SIGNAL(recall_audio_signal->data)); CU_ASSERT(AGS_RECALL_CLASS(AGS_PREPARE_AUDIO_SIGNAL_GET_CLASS(recall_audio_signal->data))->run_pre != NULL); g_signal_connect(recall_audio_signal->data, "run-pre", G_CALLBACK(ags_prepare_audio_signal_test_run_pre_callback), NULL); for(i = 0; i < AGS_PREPARE_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH; i++){ ags_recall_run_pre(recall_audio_signal->data); if(audio_signal->stream_current != NULL){ audio_signal->stream_current = audio_signal->stream_current->next; } } CU_ASSERT(test_run_pre_invoke_count == AGS_PREPARE_AUDIO_SIGNAL_TEST_RUN_PRE_AUDIO_SIGNAL_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPrepareAudioSignalTest", ags_prepare_audio_signal_test_init_suite, ags_prepare_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPrepareAudioSignal run inter", ags_prepare_audio_signal_test_run_pre) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_play_wave_audio_test.c0000644000175000017500000001024513605312646022111 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_play_wave_audio_test_init_suite(); int ags_play_wave_audio_test_clean_suite(); void ags_play_wave_audio_test_port(); AgsDevout *devout; AgsAudio *audio; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_wave_audio_test_init_suite() { ags_application_context = ags_audio_application_context_new(); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_wave_audio_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_play_wave_audio_test_port() { AgsPlayWaveAudio *play_wave_audio; AgsPort *port; play_wave_audio = ags_play_wave_audio_new(audio); CU_ASSERT(play_wave_audio != NULL); CU_ASSERT(AGS_IS_PLAY_WAVE_AUDIO(play_wave_audio)); /* test ports */ port = NULL; g_object_get(play_wave_audio, "wave-loop", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(play_wave_audio, "wave-loop-start", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(play_wave_audio, "wave-loop-end", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlayWaveAudioTest", ags_play_wave_audio_test_init_suite, ags_play_wave_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlayWaveAudio port", ags_play_wave_audio_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_eq10_channel_test.c0000644000175000017500000001276313605312646021206 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_eq10_channel_test_init_suite(); int ags_eq10_channel_test_clean_suite(); void ags_eq10_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_eq10_channel_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_eq10_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_eq10_channel_test_port() { AgsEq10Channel *eq10_channel; AgsPort *port; eq10_channel = ags_eq10_channel_new(audio->input); CU_ASSERT(eq10_channel != NULL); CU_ASSERT(AGS_IS_EQ10_CHANNEL(eq10_channel)); /* test ports */ port = NULL; g_object_get(eq10_channel, "peak-28hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-56hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-112hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-224hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-448hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-896hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-1792hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-3584hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-7168hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "peak-14336hz", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(eq10_channel, "pressure", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsEq10ChannelTest", ags_eq10_channel_test_init_suite, ags_eq10_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsEq10Channel port", ags_eq10_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/recall/ags_play_channel_test.c0000644000175000017500000001035713614062654021403 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_play_channel_test_init_suite(); int ags_play_channel_test_clean_suite(); void ags_play_channel_test_port(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_channel_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_play_channel_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_play_channel_test_port() { AgsPlayChannel *play_channel; AgsPort *port; play_channel = ags_play_channel_new(audio->input); CU_ASSERT(play_channel != NULL); CU_ASSERT(AGS_IS_PLAY_CHANNEL(play_channel)); /* test ports */ port = NULL; g_object_get(play_channel, "audio-channel", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); port = NULL; g_object_get(play_channel, "muted", &port, NULL); CU_ASSERT(port != NULL); CU_ASSERT(AGS_IS_PORT(port)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlayChannelTest", ags_play_channel_test_init_suite, ags_play_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlayChannel port", ags_play_channel_test_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_fm_synth_util_test.c0000644000175000017500000012772713605312646020401 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_fm_synth_util_test_init_suite(); int ags_fm_synth_util_test_clean_suite(); void ags_fm_synth_util_test_sin_s8(); void ags_fm_synth_util_test_sin_s16(); void ags_fm_synth_util_test_sin_s24(); void ags_fm_synth_util_test_sin_s32(); void ags_fm_synth_util_test_sin_s64(); void ags_fm_synth_util_test_sin_float(); void ags_fm_synth_util_test_sin_double(); void ags_fm_synth_util_test_sin_complex(); void ags_fm_synth_util_test_sawtooth_s8(); void ags_fm_synth_util_test_sawtooth_s16(); void ags_fm_synth_util_test_sawtooth_s24(); void ags_fm_synth_util_test_sawtooth_s32(); void ags_fm_synth_util_test_sawtooth_s64(); void ags_fm_synth_util_test_sawtooth_float(); void ags_fm_synth_util_test_sawtooth_double(); void ags_fm_synth_util_test_sawtooth_complex(); void ags_fm_synth_util_test_triangle_s8(); void ags_fm_synth_util_test_triangle_s16(); void ags_fm_synth_util_test_triangle_s24(); void ags_fm_synth_util_test_triangle_s32(); void ags_fm_synth_util_test_triangle_s64(); void ags_fm_synth_util_test_triangle_float(); void ags_fm_synth_util_test_triangle_double(); void ags_fm_synth_util_test_triangle_complex(); void ags_fm_synth_util_test_square_s8(); void ags_fm_synth_util_test_square_s16(); void ags_fm_synth_util_test_square_s24(); void ags_fm_synth_util_test_square_s32(); void ags_fm_synth_util_test_square_s64(); void ags_fm_synth_util_test_square_float(); void ags_fm_synth_util_test_square_double(); void ags_fm_synth_util_test_square_complex(); void ags_fm_synth_util_test_impulse_s8(); void ags_fm_synth_util_test_impulse_s16(); void ags_fm_synth_util_test_impulse_s24(); void ags_fm_synth_util_test_impulse_s32(); void ags_fm_synth_util_test_impulse_s64(); void ags_fm_synth_util_test_impulse_float(); void ags_fm_synth_util_test_impulse_double(); void ags_fm_synth_util_test_impulse_complex(); #define AGS_FM_SYNTH_UTIL_TEST_FREQ (440.0) #define AGS_FM_SYNTH_UTIL_TEST_PHASE (0.0) #define AGS_FM_SYNTH_UTIL_TEST_VOLUME (1.0) #define AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE (44100) #define AGS_FM_SYNTH_UTIL_TEST_OFFSET (0) #define AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT (1024) #define AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE (AGS_SYNTH_OSCILLATOR_SIN) #define AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ (8.0) #define AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH (0.5) #define AGS_FM_SYNTH_UTIL_TEST_TUNING (0.0) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_fm_synth_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_fm_synth_util_test_clean_suite() { return(0); } void ags_fm_synth_util_test_sin_s8() { gint8 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_8_BIT); ags_fm_synth_util_sin_s8(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S8, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_s16() { gint16 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_16_BIT); ags_fm_synth_util_sin_s16(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S16, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_s24() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_24_BIT); ags_fm_synth_util_sin_s24(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S24, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_s32() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_32_BIT); ags_fm_synth_util_sin_s32(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S32, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_s64() { gint64 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_64_BIT); ags_fm_synth_util_sin_s64(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S64, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_float() { gfloat *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_FLOAT); ags_fm_synth_util_sin_float(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_double() { gdouble *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_DOUBLE); ags_fm_synth_util_sin_double(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sin_complex() { AgsComplex *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_COMPLEX); ags_fm_synth_util_sin_complex(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_COMPLEX, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_s8() { gint8 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_8_BIT); ags_fm_synth_util_sawtooth_s8(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S8, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_s16() { gint16 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_16_BIT); ags_fm_synth_util_sawtooth_s16(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S16, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_s24() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_24_BIT); ags_fm_synth_util_sawtooth_s24(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S24, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_s32() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_32_BIT); ags_fm_synth_util_sawtooth_s32(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S32, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_s64() { gint64 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_64_BIT); ags_fm_synth_util_sawtooth_s64(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S64, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_float() { gfloat *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_FLOAT); ags_fm_synth_util_sawtooth_float(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_double() { gdouble *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_DOUBLE); ags_fm_synth_util_sawtooth_double(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_sawtooth_complex() { AgsComplex *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_COMPLEX); ags_fm_synth_util_sawtooth_complex(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_COMPLEX, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_s8() { gint8 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_8_BIT); ags_fm_synth_util_triangle_s8(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S8, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_s16() { gint16 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_16_BIT); ags_fm_synth_util_triangle_s16(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S16, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_s24() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_24_BIT); ags_fm_synth_util_triangle_s24(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S24, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_s32() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_32_BIT); ags_fm_synth_util_triangle_s32(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S32, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_s64() { gint64 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_64_BIT); ags_fm_synth_util_triangle_s64(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S64, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_float() { gfloat *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_FLOAT); ags_fm_synth_util_triangle_float(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_double() { gdouble *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_DOUBLE); ags_fm_synth_util_triangle_double(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_triangle_complex() { AgsComplex *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_COMPLEX); ags_fm_synth_util_triangle_complex(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_COMPLEX, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_s8() { gint8 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_8_BIT); ags_fm_synth_util_square_s8(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S8, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_s16() { gint16 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_16_BIT); ags_fm_synth_util_square_s16(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S16, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_s24() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_24_BIT); ags_fm_synth_util_square_s24(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S24, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_s32() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_32_BIT); ags_fm_synth_util_square_s32(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S32, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_s64() { gint64 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_64_BIT); ags_fm_synth_util_square_s64(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S64, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_float() { gfloat *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_FLOAT); ags_fm_synth_util_square_float(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_double() { gdouble *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_DOUBLE); ags_fm_synth_util_square_double(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_square_complex() { AgsComplex *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_COMPLEX); ags_fm_synth_util_square_complex(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_COMPLEX, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_s8() { gint8 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_8_BIT); ags_fm_synth_util_impulse_s8(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S8, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_s16() { gint16 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_16_BIT); ags_fm_synth_util_impulse_s16(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S16, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_s24() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_24_BIT); ags_fm_synth_util_impulse_s24(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S24, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_s32() { gint32 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_32_BIT); ags_fm_synth_util_impulse_s32(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S32, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_s64() { gint64 *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_64_BIT); ags_fm_synth_util_impulse_s64(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_S64, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_float() { gfloat *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_FLOAT); ags_fm_synth_util_impulse_float(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_double() { gdouble *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_DOUBLE); ags_fm_synth_util_impulse_double(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } void ags_fm_synth_util_test_impulse_complex() { AgsComplex *buffer; guint xcross_count; buffer = ags_stream_alloc(AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_COMPLEX); ags_fm_synth_util_impulse_complex(buffer, AGS_FM_SYNTH_UTIL_TEST_FREQ, AGS_FM_SYNTH_UTIL_TEST_PHASE, AGS_FM_SYNTH_UTIL_TEST_VOLUME, AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE, AGS_FM_SYNTH_UTIL_TEST_OFFSET, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT, AGS_FM_SYNTH_UTIL_TEST_LFO_OSC_MODE, AGS_FM_SYNTH_UTIL_TEST_LFO_FREQ, AGS_FM_SYNTH_UTIL_TEST_LFO_DEPTH, AGS_FM_SYNTH_UTIL_TEST_TUNING); xcross_count = ags_synth_util_get_xcross_count(buffer, AGS_AUDIO_BUFFER_UTIL_COMPLEX, AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT); CU_ASSERT(xcross_count + 2 > ((gdouble) AGS_FM_SYNTH_UTIL_TEST_FRAME_COUNT / (gdouble) AGS_FM_SYNTH_UTIL_TEST_SAMPLERATE) * AGS_FM_SYNTH_UTIL_TEST_FREQ); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFMSynthUtilTest", ags_fm_synth_util_test_init_suite, ags_fm_synth_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_fm_synth_util.c sin signed 8 bit", ags_fm_synth_util_test_sin_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin signed 16 bit", ags_fm_synth_util_test_sin_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin signed 24 bit", ags_fm_synth_util_test_sin_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin signed 32 bit", ags_fm_synth_util_test_sin_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin signed 64 bit", ags_fm_synth_util_test_sin_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin float", ags_fm_synth_util_test_sin_float) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin double", ags_fm_synth_util_test_sin_double) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sin complex", ags_fm_synth_util_test_sin_complex) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth signed 8 bit", ags_fm_synth_util_test_sawtooth_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth signed 16 bit", ags_fm_synth_util_test_sawtooth_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth signed 24 bit", ags_fm_synth_util_test_sawtooth_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth signed 32 bit", ags_fm_synth_util_test_sawtooth_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth signed 64 bit", ags_fm_synth_util_test_sawtooth_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth float", ags_fm_synth_util_test_sawtooth_float) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth double", ags_fm_synth_util_test_sawtooth_double) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c sawtooth complex", ags_fm_synth_util_test_sawtooth_complex) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle signed 8 bit", ags_fm_synth_util_test_triangle_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle signed 16 bit", ags_fm_synth_util_test_triangle_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle signed 24 bit", ags_fm_synth_util_test_triangle_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle signed 32 bit", ags_fm_synth_util_test_triangle_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle signed 64 bit", ags_fm_synth_util_test_triangle_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle float", ags_fm_synth_util_test_triangle_float) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle double", ags_fm_synth_util_test_triangle_double) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c triangle complex", ags_fm_synth_util_test_triangle_complex) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square signed 8 bit", ags_fm_synth_util_test_square_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square signed 16 bit", ags_fm_synth_util_test_square_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square signed 24 bit", ags_fm_synth_util_test_square_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square signed 32 bit", ags_fm_synth_util_test_square_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square signed 64 bit", ags_fm_synth_util_test_square_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square float", ags_fm_synth_util_test_square_float) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square double", ags_fm_synth_util_test_square_double) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c square complex", ags_fm_synth_util_test_square_complex) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse signed 8 bit", ags_fm_synth_util_test_impulse_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse signed 16 bit", ags_fm_synth_util_test_impulse_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse signed 24 bit", ags_fm_synth_util_test_impulse_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse signed 32 bit", ags_fm_synth_util_test_impulse_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse signed 64 bit", ags_fm_synth_util_test_impulse_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse float", ags_fm_synth_util_test_impulse_float) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse double", ags_fm_synth_util_test_impulse_double) == NULL) || (CU_add_test(pSuite, "test of ags_fm_synth_util.c impulse complex", ags_fm_synth_util_test_impulse_complex) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_audio_test.c0000644000175000017500000012701013607210263016571 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_audio_test_init_suite(); int ags_audio_test_clean_suite(); void ags_audio_test_set_soundcard(); void ags_audio_test_set_flags(); void ags_audio_test_unset_flags(); void ags_audio_test_dispose(); void ags_audio_test_finalize(); void ags_audio_test_check_connection(); void ags_audio_test_set_audio_channels(); void ags_audio_test_set_pads(); void ags_audio_test_set_samplerate(); void ags_audio_test_set_buffer_size(); void ags_audio_test_set_format(); void ags_audio_test_set_sequence_length(); void ags_audio_test_add_audio_connection(); void ags_audio_test_remove_audio_connection(); void ags_audio_test_add_preset(); void ags_audio_test_remove_preset(); void ags_audio_test_add_notation(); void ags_audio_test_remove_notation(); void ags_audio_test_add_automation(); void ags_audio_test_remove_automation(); void ags_audio_test_add_recall_id(); void ags_audio_test_remove_recall_id(); void ags_audio_test_add_recycling_context(); void ags_audio_test_remove_recycling_context(); void ags_audio_test_add_recall_container(); void ags_audio_test_remove_recall_container(); void ags_audio_test_add_recall(); void ags_audio_test_remove_recall(); void ags_audio_test_init_run(); void ags_audio_test_duplicate_recall(); void ags_audio_test_init_recall(); void ags_audio_test_resolve_recall(); void ags_audio_test_is_playing(); void ags_audio_test_play(); void ags_audio_test_tact(); void ags_audio_test_done(); void ags_audio_test_cancel(); void ags_audio_test_remove(); void ags_audio_test_find_port(); void ags_audio_test_open_files(); void ags_audio_test_recursive_set_property(); void ags_audio_test_recursive_play_init(); void ags_audio_test_link_channel(); void ags_audio_test_finalize_linked_channel(); void ags_audio_test_init_recall(); void ags_audio_test_resolve_recall(); void ags_audio_test_finalize_stub(GObject *gobject); void ags_audio_test_set_link_callback(AgsChannel *channel, AgsChannel *link, GError **error, AgsAudio *audio); void ags_audio_test_init_recall_callback(AgsRecall *recall, gpointer data); void ags_audio_test_resolve_recall_callback(AgsRecall *recall, gpointer data); #define AGS_AUDIO_TEST_DISPOSE_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_DISPOSE_INPUT_PADS (12) #define AGS_AUDIO_TEST_DISPOSE_OUTPUT_PADS (5) #define AGS_AUDIO_TEST_FINALIZE_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_FINALIZE_INPUT_PADS (12) #define AGS_AUDIO_TEST_FINALIZE_OUTPUT_PADS (5) #define AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_SET_PADS_INPUT_PADS (12) #define AGS_AUDIO_TEST_SET_PADS_OUTPUT_PADS (5) #define AGS_AUDIO_TEST_SET_PADS_GROW_INPUT_PADS (18) #define AGS_AUDIO_TEST_SET_PADS_GROW_OUTPUT_PADS (8) #define AGS_AUDIO_TEST_SET_PADS_SHRINK_INPUT_PADS (3) #define AGS_AUDIO_TEST_SET_PADS_SHRINK_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS (3) #define AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_INPUT_PADS (1) #define AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_OUTPUT_PADS (7) #define AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_GROW_AUDIO_CHANNELS (5) #define AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_SHRINK_AUDIO_CHANNELS (1) #define AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_INPUT_PADS (8) #define AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_INPUT_PADS (8) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS (1) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_INPUT_PADS (128) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_INPUT_PADS (1) #define AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_INPUT_PADS (8) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_INPUT_PADS (8) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_INPUT_PADS (128) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_OUTPUT_PADS (1) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS (2) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_INPUT_PADS (1) #define AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_OUTPUT_PADS (1) AgsDevout *devout; gboolean audio_test_finalized; struct{ AgsAudio *master; guint n_link_master; AgsAudio *slave_0; guint n_link_slave_0; AgsAudio *slave_1; guint n_link_slave_1; AgsAudio *slave_2; guint n_link_slave_2; }test_link_channel; struct{ AgsAudio *master; guint n_link_master; AgsAudio *slave_0; guint n_link_slave_0; AgsAudio *slave_1; guint n_link_slave_1; AgsAudio *slave_2; guint n_link_slave_2; }test_finalize_linked_channel; guint test_init_recall_callback_hits_count = 0; guint test_resolve_recall_callback_hits_count = 0; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_test_init_suite() { devout = ags_devout_new(NULL); g_object_ref(devout); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_test_clean_suite() { g_object_unref(devout); return(0); } void ags_audio_test_set_soundcard() { //TODO:JK: implement me } void ags_audio_test_set_flags() { //TODO:JK: implement me } void ags_audio_test_unset_flags() { //TODO:JK: implement me } void ags_audio_test_dispose() { AgsAudio *audio; /* instantiate audio */ audio = ags_audio_new(devout); /* set audio channels */ audio->audio_channels = AGS_AUDIO_TEST_DISPOSE_AUDIO_CHANNELS; /* set input pads */ ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_AUDIO_TEST_DISPOSE_INPUT_PADS, 0); /* set output pads */ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_DISPOSE_OUTPUT_PADS, 0); /* run dispose and assert */ g_object_run_dispose(audio); CU_ASSERT(audio->output_soundcard == NULL); CU_ASSERT(audio->input_sequencer == NULL); CU_ASSERT(audio->output_midi_file == NULL); CU_ASSERT(audio->output == NULL); CU_ASSERT(audio->input == NULL); CU_ASSERT(audio->playback_domain == NULL); CU_ASSERT(audio->notation == NULL); CU_ASSERT(audio->automation == NULL); CU_ASSERT(audio->recall_id == NULL); CU_ASSERT(audio->recycling_context == NULL); CU_ASSERT(audio->recall_container == NULL); CU_ASSERT(audio->recall == NULL); CU_ASSERT(audio->play == NULL); } void ags_audio_test_finalize() { AgsAudio *audio; /* instantiate audio */ audio = ags_audio_new(devout); /* set audio channels */ audio->audio_channels = AGS_AUDIO_TEST_FINALIZE_AUDIO_CHANNELS; /* set input pads */ ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_INPUT_PADS, 0); /* set output pads */ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_OUTPUT_PADS, 0); /* run dispose */ g_object_run_dispose(audio); /* stub */ audio_test_finalized = FALSE; G_OBJECT_GET_CLASS(audio)->finalize = ags_audio_test_finalize_stub; /* unref and assert */ g_object_unref(audio); CU_ASSERT(audio_test_finalized == TRUE); } void ags_audio_test_check_connection() { //TODO:JK: implement me } void ags_audio_test_set_audio_channels() { AgsAudio *audio; AgsChannel *channel, *current; guint i, j; /* instantiate */ audio = ags_audio_new(devout); CU_ASSERT(audio != NULL); /* set pads */ audio->output_pads = AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_OUTPUT_PADS; audio->input_pads = AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_INPUT_PADS; /* set audio channels */ ags_audio_set_audio_channels(audio, AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS, 0); CU_ASSERT(audio->audio_channels == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); /* verify pad count */ channel = audio->input; for(i = 0; channel != ags_channel_nth(audio->input, AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_INPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); /* verify line count */ channel = audio->input; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_INPUT_PADS * AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); /* verify pad count */ channel = audio->output; for(i = 0; channel != ags_channel_nth(audio->output, AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_OUTPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); /* verify line count */ channel = audio->output; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_OUTPUT_PADS * AGS_AUDIO_TEST_SET_AUDIO_CHANNELS_AUDIO_CHANNELS); } void ags_audio_test_set_pads() { AgsAudio *audio; AgsChannel *channel, *current; guint i, j; /* instantiate */ audio = ags_audio_new(devout); CU_ASSERT(audio != NULL); /* set audio channels */ audio->audio_channels = AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS; /* set input pads */ ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_AUDIO_TEST_SET_PADS_INPUT_PADS, 0); CU_ASSERT(audio->input_pads == AGS_AUDIO_TEST_SET_PADS_INPUT_PADS); /* verify pad count */ channel = audio->input; for(i = 0; channel != audio->input->next_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_INPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify reverse pad count */ channel = ags_channel_last(audio->input); for(i = 0; channel != ags_channel_last(audio->input)->prev_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->prev_pad; } g_message("--- %d", j); CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_INPUT_PADS); channel = channel->prev; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify line count */ channel = audio->input; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_INPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify reverse line count */ channel = ags_channel_last(audio->input); for(i = 0; channel != NULL; i++){ channel = channel->prev; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_INPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* set output pads */ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_SET_PADS_OUTPUT_PADS, 0); CU_ASSERT(audio->output_pads == AGS_AUDIO_TEST_SET_PADS_OUTPUT_PADS); /* verify pad count */ channel = audio->output; for(i = 0; channel != audio->output->next_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_OUTPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify line count */ channel = audio->output; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_OUTPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* * grow pads */ /* set input pads */ ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_AUDIO_TEST_SET_PADS_GROW_INPUT_PADS, 0); CU_ASSERT(audio->input_pads == AGS_AUDIO_TEST_SET_PADS_GROW_INPUT_PADS); /* verify pad count */ channel = audio->input; for(i = 0; channel != audio->input->next_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_GROW_INPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify line count */ channel = audio->input; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_GROW_INPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* set output pads */ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_SET_PADS_GROW_OUTPUT_PADS, 0); CU_ASSERT(audio->output_pads == AGS_AUDIO_TEST_SET_PADS_GROW_OUTPUT_PADS); /* verify pad count */ channel = audio->output; for(i = 0; channel != audio->output->next_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_GROW_OUTPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify line count */ channel = audio->output; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_GROW_OUTPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* * shrink pads */ /* set input pads */ ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_AUDIO_TEST_SET_PADS_SHRINK_INPUT_PADS, 0); CU_ASSERT(audio->input_pads == AGS_AUDIO_TEST_SET_PADS_SHRINK_INPUT_PADS); /* verify pad count */ channel = audio->input; for(i = 0; channel != audio->input->next_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_SHRINK_INPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify line count */ channel = audio->input; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_SHRINK_INPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* set output pads */ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_SET_PADS_SHRINK_OUTPUT_PADS, 0); CU_ASSERT(audio->output_pads == AGS_AUDIO_TEST_SET_PADS_SHRINK_OUTPUT_PADS); /* verify pad count */ channel = audio->output; for(i = 0; channel != audio->output->next_pad; i++){ current = channel; for(j = 0; current != NULL; j++){ current = current->next_pad; } CU_ASSERT(j == AGS_AUDIO_TEST_SET_PADS_SHRINK_OUTPUT_PADS); channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); /* verify line count */ channel = audio->output; for(i = 0; channel != NULL; i++){ channel = channel->next; } CU_ASSERT(i == AGS_AUDIO_TEST_SET_PADS_SHRINK_OUTPUT_PADS * AGS_AUDIO_TEST_SET_PADS_AUDIO_CHANNELS); } void ags_audio_test_set_samplerate() { //TODO:JK: implement me } void ags_audio_test_set_buffer_size() { //TODO:JK: implement me } void ags_audio_test_set_format() { //TODO:JK: implement me } void ags_audio_test_set_sequence_length() { //TODO:JK: implement me } void ags_audio_test_add_audio_connection() { //TODO:JK: implement me } void ags_audio_test_remove_audio_connection() { //TODO:JK: implement me } void ags_audio_test_add_preset() { //TODO:JK: implement me } void ags_audio_test_remove_preset() { //TODO:JK: implement me } void ags_audio_test_add_notation() { //TODO:JK: implement me } void ags_audio_test_remove_notation() { //TODO:JK: implement me } void ags_audio_test_add_automation() { //TODO:JK: implement me } void ags_audio_test_remove_automation() { //TODO:JK: implement me } void ags_audio_test_add_recall_id() { AgsAudio *audio; AgsRecallID *recall_id; /* instantiate audio */ audio = ags_audio_new(devout); /* instantiate recall */ recall_id = ags_recall_id_new(NULL); /* add to audio */ ags_audio_add_recall_id(audio, recall_id); /* assert to be in audio->recall_id */ CU_ASSERT(g_list_find(audio->recall_id, recall_id) != NULL); } void ags_audio_test_remove_recall_id() { //TODO:JK: implement me } void ags_audio_test_add_recycling_context() { AgsAudio *audio; AgsRecyclingContext *recycling_context; /* instantiate audio */ audio = ags_audio_new(devout); /* instantiate recall */ recycling_context = ags_recycling_context_new(0); /* add to audio */ ags_audio_add_recycling_context(audio, recycling_context); /* assert to be in audio->recycling_context */ CU_ASSERT(g_list_find(audio->recycling_context, recycling_context) != NULL); } void ags_audio_test_remove_recycling_context() { //TODO:JK: implement me } void ags_audio_test_add_recall_container() { AgsAudio *audio; AgsRecallContainer *recall_container; /* instantiate audio */ audio = ags_audio_new(devout); /* instantiate recall */ recall_container = ags_recall_container_new(); /* add to audio */ ags_audio_add_recall_container(audio, recall_container); /* assert to be in audio->recall_container */ CU_ASSERT(g_list_find(audio->recall_container, recall_container) != NULL); } void ags_audio_test_remove_recall_container() { //TODO:JK: implement me } void ags_audio_test_add_recall() { AgsAudio *audio; AgsRecall *recall; /* instantiate audio */ audio = ags_audio_new(devout); /* instantiate recall */ recall = ags_recall_new(); /* add recall to audio */ ags_audio_add_recall(audio, recall, TRUE); /* assert to be in audio->play */ CU_ASSERT(g_list_find(audio->play, recall) != NULL); /* instantiate recall */ recall = ags_recall_new(); /* add recall to audio */ ags_audio_add_recall(audio, recall, FALSE); /* assert to be in audio->recall */ CU_ASSERT(g_list_find(audio->recall, recall) != NULL); } void ags_audio_test_remove_recall() { //TODO:JK: implement me } void ags_audio_test_init_run() { //TODO:JK: implement me } void ags_audio_test_duplicate_recall() { AgsAudio *audio; AgsRecall *recall; AgsRecall *recall_audio_run; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsRecallID *recall_id; /* instantiate audio */ audio = ags_audio_new(devout); /* case 1: playback recall */ recall = ags_recall_new(); recall->flags |= (AGS_RECALL_TEMPLATE); recall->sound_scope = AGS_SOUND_SCOPE_NOTATION; recall->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_audio_add_recall(audio, recall, TRUE); recall_audio_run = ags_recall_audio_run_new(); recall_audio_run->flags |= (AGS_RECALL_TEMPLATE); recall_audio_run->sound_scope = AGS_SOUND_SCOPE_NOTATION; recall_audio_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_audio_add_recall(audio, recall_audio_run, TRUE); /* assert inital count */ CU_ASSERT(g_list_length(audio->play) == 2); CU_ASSERT(g_list_length(audio->recall) == 0); /* instantiate recycling context and recall id */ recycling_context = ags_recycling_context_new(0); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context", recycling_context, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, recall_id, 0, 0, 0); CU_ASSERT(g_list_length(audio->play) == 4); CU_ASSERT(g_list_length(audio->recall) == 0); /* case 2: true recall */ recall = ags_recall_new(); recall->flags |= (AGS_RECALL_TEMPLATE); recall->sound_scope = AGS_SOUND_SCOPE_NOTATION; recall->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_audio_add_recall(audio, recall, FALSE); recall_audio_run = ags_recall_audio_run_new(); recall_audio_run->flags |= (AGS_RECALL_TEMPLATE); recall_audio_run->sound_scope = AGS_SOUND_SCOPE_NOTATION; recall_audio_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_audio_add_recall(audio, recall_audio_run, FALSE); /* assert inital count */ CU_ASSERT(g_list_length(audio->play) == 4); CU_ASSERT(g_list_length(audio->recall) == 2); /* instantiate recycling context and recall id */ parent_recycling_context = ags_recycling_context_new(0); recycling_context = ags_recycling_context_new(0); g_object_set(recycling_context, "parent", parent_recycling_context, NULL); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context", recycling_context, NULL); /* duplicate recall */ ags_audio_duplicate_recall(audio, recall_id, 0, 0, 0); CU_ASSERT(g_list_length(audio->play) == 4); CU_ASSERT(g_list_length(audio->recall) == 4); } void ags_audio_test_is_playing() { //TODO:JK: implement me } void ags_audio_test_play() { //TODO:JK: implement me } void ags_audio_test_tact() { //TODO:JK: implement me } void ags_audio_test_done() { //TODO:JK: implement me } void ags_audio_test_cancel() { //TODO:JK: implement me } void ags_audio_test_remove() { //TODO:JK: implement me } void ags_audio_test_find_port() { //TODO:JK: implement me } void ags_audio_test_open_files() { //TODO:JK: implement me } void ags_audio_test_recursive_set_property() { //TODO:JK: implement me } void ags_audio_test_recursive_play_init() { //TODO:JK: implement me } void ags_audio_test_link_channel() { AgsChannel *channel, *link; AgsChannel *output, *first_channel; guint i; GError *error; /* audio - master */ test_link_channel.master = ags_audio_new(devout); test_link_channel.master->flags |= AGS_AUDIO_ASYNC; ags_audio_set_audio_channels(test_link_channel.master, AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.master, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.master, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_OUTPUT_PADS, 0); /* audio - slave 0 */ test_link_channel.slave_0 = ags_audio_new(devout); test_link_channel.slave_0->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_link_channel.slave_0, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.slave_0, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.slave_0, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_OUTPUT_PADS, 0); /* audio - slave 1 */ test_link_channel.slave_1 = ags_audio_new(devout); test_link_channel.slave_1->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_link_channel.slave_1, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.slave_1, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.slave_1, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_OUTPUT_PADS, 0); /* audio - slave 2 */ test_link_channel.slave_2 = ags_audio_new(devout); test_link_channel.slave_2->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_link_channel.slave_2, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_link_channel.slave_2, AGS_TYPE_INPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_INPUT_PADS, 0); ags_audio_set_pads(test_link_channel.slave_2, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_OUTPUT_PADS, 0); /* setup link master to slave_0 */ /* connect callback */ channel = test_link_channel.master->input; link = test_link_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ //TODO:JK: implement me /* g_signal_connect(G_OBJECT(channel), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.master); g_signal_connect(G_OBJECT(link), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.slave_0); */ channel = channel->next; link = link->next; } /* set link */ channel = test_link_channel.master->input; link = test_link_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* assert link set */ CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); /* check recycling */ CU_ASSERT(channel->first_recycling == link->first_recycling); CU_ASSERT(channel->last_recycling == link->last_recycling); /* iterate */ channel = channel->next; link = link->next; } /* check output recycling */ output = test_link_channel.master->output; first_channel = link = test_link_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == link->first_recycling); CU_ASSERT(output->last_recycling == link->last_recycling); } /* setup link master to slave_1 */ /* connect callback */ channel = ags_channel_pad_nth(test_link_channel.master->input, 1); link = test_link_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ //TODO:JK: implement me /* g_signal_connect(G_OBJECT(channel), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.master); g_signal_connect(G_OBJECT(link), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.slave_1); */ channel = channel->next; link = link->next; } /* set link */ channel = ags_channel_pad_nth(test_link_channel.master->input, 1); link = test_link_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* assert link set */ CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); /* check recycling */ CU_ASSERT(channel->first_recycling == link->first_recycling); CU_ASSERT(channel->last_recycling == link->last_recycling); /* iterate */ channel = channel->next; link = link->next; } /* check output recycling */ output = test_link_channel.master->output; first_channel = test_link_channel.slave_0->output; link = test_link_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == first_channel->first_recycling); CU_ASSERT(output->last_recycling == link->last_recycling); output = output->next; first_channel = first_channel->next; link = link->next; } /* setup link master to slave_2 */ /* connect callback */ channel = ags_channel_pad_nth(test_link_channel.master->input, 2); link = test_link_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ //TODO:JK: implement me /* g_signal_connect(G_OBJECT(channel), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.master); g_signal_connect(G_OBJECT(link), "set-link", G_CALLBACK(ags_audio_test_set_link_callback), test_link_channel.slave_2); */ channel = channel->next; link = link->next; } /* set link */ channel = ags_channel_pad_nth(test_link_channel.master->input, 2); link = test_link_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* assert link set */ CU_ASSERT(error == NULL); CU_ASSERT(channel->link == link); CU_ASSERT(link->link == channel); /* check recycling */ CU_ASSERT(channel->first_recycling == link->first_recycling); CU_ASSERT(channel->last_recycling == link->last_recycling); /* iterate */ channel = channel->next; link = link->next; } /* check output recycling */ output = test_link_channel.master->output; first_channel = test_link_channel.slave_0->output; link = test_link_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_LINK_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_LINK_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == first_channel->first_recycling); CU_ASSERT(output->last_recycling == link->last_recycling); output = output->next; first_channel = first_channel->next; link = link->next; } } void ags_audio_test_finalize_linked_channel() { AgsChannel *channel, *link; AgsChannel *output, *current, *last_channel; guint i; GError *error; /* audio - master */ test_finalize_linked_channel.master = ags_audio_new(devout); test_finalize_linked_channel.master->flags |= AGS_AUDIO_ASYNC; ags_audio_set_audio_channels(test_finalize_linked_channel.master, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.master, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.master, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_OUTPUT_PADS, 0); /* audio - slave 0 */ test_finalize_linked_channel.slave_0 = ags_audio_new(devout); test_finalize_linked_channel.slave_0->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_finalize_linked_channel.slave_0, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_OUTPUT_PADS, 0); /* audio - slave 1 */ test_finalize_linked_channel.slave_1 = ags_audio_new(devout); test_finalize_linked_channel.slave_1->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_finalize_linked_channel.slave_1, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_OUTPUT_PADS, 0); /* audio - slave 2 */ test_finalize_linked_channel.slave_2 = ags_audio_new(devout); test_finalize_linked_channel.slave_2->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_ASYNC); ags_audio_set_audio_channels(test_finalize_linked_channel.slave_2, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_INPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_INPUT_PADS, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_OUTPUT, AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_OUTPUT_PADS, 0); /* setup link master to slave_0 */ /* set link */ channel = test_finalize_linked_channel.master->input; link = test_finalize_linked_channel.slave_0->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_0_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* iterate */ channel = channel->next; link = link->next; } /* setup link master to slave_1 */ /* set link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 1); link = test_finalize_linked_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* iterate */ channel = channel->next; link = link->next; } /* setup link master to slave_2 */ /* set link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 2); link = test_finalize_linked_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); /* iterate */ channel = channel->next; link = link->next; } /* asserts */ /* unset link */ channel = test_finalize_linked_channel.master->input; ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_0, AGS_TYPE_OUTPUT, 0, 0); g_object_unref(test_finalize_linked_channel.slave_0); for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* assert link set */ CU_ASSERT(channel->link == NULL); /* check recycling */ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); /* iterate */ channel = channel->next; } /* check output recycling */ output = test_finalize_linked_channel.master->output; current = test_finalize_linked_channel.slave_1->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == current->first_recycling); output = output->next; current = current->next; } output = test_finalize_linked_channel.master->output; last_channel = test_finalize_linked_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS; i++){ CU_ASSERT(output->last_recycling == last_channel->last_recycling); output = output->next; last_channel = last_channel->next; } /* unset link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 1); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_1, AGS_TYPE_OUTPUT, 0, 0); g_object_unref(test_finalize_linked_channel.slave_1); for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* assert link set */ CU_ASSERT(channel->link == NULL); /* check recycling */ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); /* iterate */ channel = channel->next; } /* check output recycling */ output = test_finalize_linked_channel.master->output; last_channel = test_finalize_linked_channel.slave_2->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_1_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* check recycling */ CU_ASSERT(output->first_recycling == last_channel->first_recycling); CU_ASSERT(output->last_recycling == last_channel->last_recycling); output = output->next; last_channel = last_channel->next; } /* unset link */ channel = ags_channel_pad_nth(test_finalize_linked_channel.master->input, 2); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(test_finalize_linked_channel.slave_2, AGS_TYPE_OUTPUT, 0, 0); g_object_unref(test_finalize_linked_channel.slave_2); for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ /* assert link unset */ CU_ASSERT(channel->link == NULL); /* check recycling */ CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); /* iterate */ channel = channel->next; } /* check output recycling */ output = test_finalize_linked_channel.master->output; for(i = 0; i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_SLAVE_2_AUDIO_CHANNELS && i < AGS_AUDIO_TEST_FINALIZE_LINKED_CHANNEL_MASTER_AUDIO_CHANNELS; i++){ CU_ASSERT(output->first_recycling == NULL); CU_ASSERT(output->last_recycling == NULL); output = output->next; } } void ags_audio_test_init_recall() { AgsAudio *audio; AgsRecall *recall; AgsRecall *recall_audio_run; AgsRecyclingContext *recycling_context; AgsRecallID *recall_id; /* instantiate audio */ audio = ags_audio_new(devout); /* instantiate recalls */ recall = ags_recall_new(); recall->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_audio_add_recall(audio, recall, TRUE); g_signal_connect(G_OBJECT(recall), "run-init-pre", G_CALLBACK(ags_audio_test_init_recall_callback), NULL); recall_audio_run = ags_recall_audio_run_new(); recall_audio_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_audio_add_recall(audio, recall_audio_run, TRUE); g_signal_connect(G_OBJECT(recall_audio_run), "run-init-pre", G_CALLBACK(ags_audio_test_init_recall_callback), NULL); /* instantiate recycling context and recall id */ recycling_context = ags_recycling_context_new(0); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context", recycling_context, NULL); /* setup recalls */ g_object_set(recall, "recall-id", recall_id, NULL); g_object_set(recall_audio_run, "recall-id", recall_id, NULL); /* init recall */ ags_audio_init_recall(audio, recall_id, AGS_SOUND_STAGING_RUN_INIT_PRE); CU_ASSERT(test_init_recall_callback_hits_count == 2); } void ags_audio_test_resolve_recall() { AgsAudio *audio; AgsRecall *master_recall_audio_run; AgsRecall *slave_recall_audio_run; AgsRecyclingContext *recycling_context; AgsRecallID *recall_id; /* instantiate audio */ audio = ags_audio_new(devout); /* instantiate recalls */ slave_recall_audio_run = ags_recall_audio_run_new(); ags_audio_add_recall(audio, slave_recall_audio_run, TRUE); g_signal_connect(G_OBJECT(slave_recall_audio_run), "resolve-dependency", G_CALLBACK(ags_audio_test_resolve_recall_callback), NULL); /* instantiate recycling context and recall id */ recycling_context = ags_recycling_context_new(0); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context", recycling_context, NULL); /* setup recalls */ g_object_set(slave_recall_audio_run, "recall-id", recall_id, NULL); /* resolve recall */ ags_audio_resolve_recall(audio, recall_id); CU_ASSERT(test_resolve_recall_callback_hits_count == 1); } void ags_audio_test_finalize_stub(GObject *gobject) { audio_test_finalized = TRUE; } void ags_audio_test_set_link_callback(AgsChannel *channel, AgsChannel *link, GError **error, AgsAudio *audio) { //TODO:JK: implement me } void ags_audio_test_init_recall_callback(AgsRecall *recall, gpointer data) { g_message("init recall"); test_init_recall_callback_hits_count++; } void ags_audio_test_resolve_recall_callback(AgsRecall *recall, gpointer data) { g_message("resolve recall"); test_resolve_recall_callback_hits_count++; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAudioTest", ags_audio_test_init_suite, ags_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAudio dispose", ags_audio_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsAudio finalize", ags_audio_test_finalize) == NULL) || (CU_add_test(pSuite, "test of AgsAudio set pads", ags_audio_test_set_pads) == NULL) || (CU_add_test(pSuite, "test of AgsAudio set audio channels", ags_audio_test_set_audio_channels) == NULL) || (CU_add_test(pSuite, "test of AgsAudio link channel", ags_audio_test_link_channel) == NULL) || (CU_add_test(pSuite, "test of AgsAudio finalize linked channel", ags_audio_test_finalize_linked_channel) == NULL) || (CU_add_test(pSuite, "test of AgsAudio add recall", ags_audio_test_add_recall) == NULL) || (CU_add_test(pSuite, "test of AgsAudio add recall container", ags_audio_test_add_recall_container) == NULL) || (CU_add_test(pSuite, "test of AgsAudio recall id", ags_audio_test_add_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsAudio recycling context", ags_audio_test_add_recycling_context) == NULL) || (CU_add_test(pSuite, "test of AgsAudio duplicate recall", ags_audio_test_duplicate_recall) == NULL) || (CU_add_test(pSuite, "test of AgsAudio initialize recall", ags_audio_test_init_recall) == NULL) || (CU_add_test(pSuite, "test of AgsAudio resolve recall", ags_audio_test_resolve_recall) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_preset_test.c0000644000175000017500000001657713605312646017017 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_preset_test_init_suite(); int ags_preset_test_clean_suite(); void ags_preset_test_find_scope(); void ags_preset_test_find_name(); void ags_preset_test_add_parameter(); void ags_preset_test_remove_parameter(); void ags_preset_test_get_parameter(); #define AGS_PRESET_TEST_ADD_PARAMETER_ATTACK_X "attack-x" #define AGS_PRESET_TEST_ADD_PARAMETER_ATTACK_X_VALUE (128) #define AGS_PRESET_TEST_REMOVE_PARAMETER_ATTACK_X "attack-x" #define AGS_PRESET_TEST_REMOVE_PARAMETER_ATTACK_X_VALUE (128) #define AGS_PRESET_TEST_REMOVE_PARAMETER_DECAY_X "decay-x" #define AGS_PRESET_TEST_REMOVE_PARAMETER_DECAY_X_VALUE (256) #define AGS_PRESET_TEST_GET_PARAMETER_ATTACK_X "attack-x" #define AGS_PRESET_TEST_GET_PARAMETER_ATTACK_X_VALUE (128) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_preset_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_preset_test_clean_suite() { return(0); } void ags_preset_test_find_scope() { AgsPreset *preset[3]; GList *list, *current; list = NULL; /* preset #0 */ preset[0] = g_object_new(AGS_TYPE_PRESET, "scope", "ags-preset-test-scope-0", NULL); list = g_list_prepend(list, preset[0]); /* preset #1 */ preset[1] = g_object_new(AGS_TYPE_PRESET, "scope", "ags-preset-test-scope-1", NULL); list = g_list_prepend(list, preset[1]); /* preset #2 */ preset[2] = g_object_new(AGS_TYPE_PRESET, "scope", "ags-preset-test-scope-2", NULL); list = g_list_prepend(list, preset[2]); /* assert */ CU_ASSERT((current = ags_preset_find_scope(list, "ags-preset-test-scope-0")) != NULL && current->data == preset[0]); CU_ASSERT((current = ags_preset_find_scope(list, "ags-preset-test-scope-1")) != NULL && current->data == preset[1]); CU_ASSERT((current = ags_preset_find_scope(list, "ags-preset-test-scope-2")) != NULL && current->data == preset[2]); } void ags_preset_test_find_name() { AgsPreset *preset[3]; GList *list, *current; list = NULL; /* preset #0 */ preset[0] = g_object_new(AGS_TYPE_PRESET, "preset-name", "ags-preset-test-name-0", NULL); list = g_list_prepend(list, preset[0]); /* preset #1 */ preset[1] = g_object_new(AGS_TYPE_PRESET, "preset-name", "ags-preset-test-name-1", NULL); list = g_list_prepend(list, preset[1]); /* preset #2 */ preset[2] = g_object_new(AGS_TYPE_PRESET, "preset-name", "ags-preset-test-name-2", NULL); list = g_list_prepend(list, preset[2]); /* assert */ CU_ASSERT((current = ags_preset_find_name(list, "ags-preset-test-name-0")) != NULL && current->data == preset[0]); CU_ASSERT((current = ags_preset_find_name(list, "ags-preset-test-name-1")) != NULL && current->data == preset[1]); CU_ASSERT((current = ags_preset_find_name(list, "ags-preset-test-name-2")) != NULL && current->data == preset[2]); } void ags_preset_test_add_parameter() { AgsPreset *preset; GValue value = {0,}; preset = g_object_new(AGS_TYPE_PRESET, NULL); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, AGS_PRESET_TEST_ADD_PARAMETER_ATTACK_X_VALUE); ags_preset_add_parameter(preset, AGS_PRESET_TEST_ADD_PARAMETER_ATTACK_X, &value); CU_ASSERT(preset->n_params == 1 && !g_strcmp0(preset->parameter_name[0], AGS_PRESET_TEST_ADD_PARAMETER_ATTACK_X) && g_value_get_uint(&(preset->value[0])) == AGS_PRESET_TEST_ADD_PARAMETER_ATTACK_X_VALUE); } void ags_preset_test_remove_parameter() { AgsPreset *preset; GValue value = {0,}; preset = g_object_new(AGS_TYPE_PRESET, NULL); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, AGS_PRESET_TEST_REMOVE_PARAMETER_ATTACK_X_VALUE); ags_preset_add_parameter(preset, AGS_PRESET_TEST_REMOVE_PARAMETER_ATTACK_X, &value); g_value_reset(&value); g_value_set_uint(&value, AGS_PRESET_TEST_REMOVE_PARAMETER_DECAY_X_VALUE); ags_preset_add_parameter(preset, AGS_PRESET_TEST_REMOVE_PARAMETER_DECAY_X, &value); /* remove and assert */ ags_preset_remove_parameter(preset, 0); CU_ASSERT(preset->n_params == 1 && !g_strcmp0(preset->parameter_name[0], AGS_PRESET_TEST_REMOVE_PARAMETER_DECAY_X) && g_value_get_uint(&(preset->value[0])) == AGS_PRESET_TEST_REMOVE_PARAMETER_DECAY_X_VALUE); ags_preset_remove_parameter(preset, 0); CU_ASSERT(preset->n_params == 0); } void ags_preset_test_get_parameter() { AgsPreset *preset; GValue value = {0,}; GValue ret_value = {0,}; GError *error; preset = g_object_new(AGS_TYPE_PRESET, NULL); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, AGS_PRESET_TEST_GET_PARAMETER_ATTACK_X_VALUE); ags_preset_add_parameter(preset, AGS_PRESET_TEST_GET_PARAMETER_ATTACK_X, &value); /* get and assert */ g_value_init(&ret_value, G_TYPE_UINT); error = NULL; ags_preset_get_parameter(preset, AGS_PRESET_TEST_GET_PARAMETER_ATTACK_X, &ret_value, &error); CU_ASSERT(error == NULL && g_value_get_uint(&ret_value) == AGS_PRESET_TEST_GET_PARAMETER_ATTACK_X_VALUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPresetTest", ags_preset_test_init_suite, ags_preset_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPreset find scope", ags_preset_test_find_scope) == NULL) || (CU_add_test(pSuite, "test of AgsPreset find name", ags_preset_test_find_name) == NULL) || (CU_add_test(pSuite, "test of AgsPreset add parameter", ags_preset_test_add_parameter) == NULL) || (CU_add_test(pSuite, "test of AgsPreset remove parameter", ags_preset_test_remove_parameter) == NULL) || (CU_add_test(pSuite, "test of AgsPreset get parameter", ags_preset_test_get_parameter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_channel_test.c0000644000175000017500000003550013605312646017110 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_channel_test_init_suite(); int ags_channel_test_clean_suite(); void ags_channel_test_dispose(); void ags_channel_test_finalize(); void ags_channel_test_add_recall(); void ags_channel_test_add_recall_container(); void ags_channel_test_add_recall_id(); void ags_channel_test_duplicate_recall(); void ags_channel_test_init_recall(); void ags_channel_test_resolve_recall(); void ags_channel_test_finalize_stub(GObject *gobject); void ags_channel_test_run_init_pre_recall_callback(AgsRecall *recall, gpointer data); void ags_channel_test_resolve_recall_callback(AgsRecall *recall, gpointer data); #define AGS_CHANNEL_TEST_DISPOSE_PLAY_COUNT (8) #define AGS_CHANNEL_TEST_DISPOSE_RECALL_COUNT (8) #define AGS_CHANNEL_TEST_FINALIZE_PLAY_COUNT (8) #define AGS_CHANNEL_TEST_FINALIZE_RECALL_COUNT (8) AgsAudio *audio; gboolean channel_test_finalized; guint test_init_recall_callback_hits_count = 0; guint test_resolve_recall_callback_hits_count = 0; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_channel_test_init_suite() { audio = g_object_new(AGS_TYPE_AUDIO, NULL); audio->flags |= (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING); g_object_ref(audio); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_channel_test_clean_suite() { g_object_unref(audio); return(0); } void ags_channel_test_dispose() { AgsChannel *channel; AgsRecall *recall; guint i; channel = ags_output_new(audio); channel->first_recycling = channel->last_recycling = ags_recycling_new(NULL); g_object_ref(channel->first_recycling); /* add recall to play context */ for(i = 0; i < AGS_CHANNEL_TEST_DISPOSE_PLAY_COUNT; i++){ /* instantiate play */ recall = ags_recall_new(); /* add play to audio */ ags_audio_add_recall(audio, recall, TRUE); } /* add recall to recall context */ for(i = 0; i < AGS_CHANNEL_TEST_DISPOSE_RECALL_COUNT; i++){ /* instantiate recall */ recall = ags_recall_new(); /* add recall to audio */ ags_audio_add_recall(audio, recall, FALSE); } /* run dispose and assert */ g_object_run_dispose(channel); CU_ASSERT(channel->audio == NULL); CU_ASSERT(channel->output_soundcard == NULL); CU_ASSERT(channel->recall_id == NULL); CU_ASSERT(channel->recall_container == NULL); CU_ASSERT(channel->recall == NULL); CU_ASSERT(channel->play == NULL); CU_ASSERT(channel->first_recycling == NULL); CU_ASSERT(channel->last_recycling == NULL); CU_ASSERT(channel->pattern == NULL); } void ags_channel_test_finalize() { AgsChannel *channel; AgsRecall *recall; guint i; channel = ags_output_new(audio); channel->first_recycling = channel->last_recycling = ags_recycling_new(NULL); g_object_ref(channel->first_recycling); /* add recall to play context */ for(i = 0; i < AGS_CHANNEL_TEST_FINALIZE_PLAY_COUNT; i++){ /* instantiate play */ recall = ags_recall_channel_new(); g_object_set(recall, "source\0", channel, NULL); /* add play to channel */ ags_channel_add_recall(channel, recall, TRUE); } /* add recall to recall context */ for(i = 0; i < AGS_CHANNEL_TEST_FINALIZE_RECALL_COUNT; i++){ /* instantiate recall */ recall = ags_recall_channel_new(); g_object_set(recall, "source\0", channel, NULL); /* add recall to channel */ ags_channel_add_recall(channel, recall, FALSE); } /* run dispose */ g_object_run_dispose(channel); /* stub */ channel_test_finalized = FALSE; G_OBJECT_GET_CLASS(channel)->finalize = ags_channel_test_finalize_stub; /* unref and assert */ g_object_unref(channel); CU_ASSERT(channel_test_finalized == TRUE); } void ags_channel_test_add_recall() { AgsChannel *channel; AgsRecall *recall0, *recall1; /* instantiate channel */ channel = ags_channel_new(NULL); /* instantiate recall */ recall0 = ags_recall_new(); /* add recall to channel */ ags_channel_add_recall(channel, recall0, TRUE); /* assert to be in channel->play */ CU_ASSERT(g_list_find(channel->play, recall0) != NULL); /* instantiate recall */ recall1 = ags_recall_new(); /* add recall to channel */ ags_channel_add_recall(channel, recall1, TRUE); /* assert to be in channel->recall */ CU_ASSERT(g_list_find(channel->play, recall0) != NULL); CU_ASSERT(g_list_find(channel->play, recall1) != NULL); /* instantiate recall */ recall0 = ags_recall_new(); /* add recall to channel */ ags_channel_add_recall(channel, recall0, FALSE); /* assert to be in channel->play */ CU_ASSERT(g_list_find(channel->recall, recall0) != NULL); /* instantiate recall */ recall1 = ags_recall_new(); /* add recall to channel */ ags_channel_add_recall(channel, recall1, FALSE); /* assert to be in channel->recall */ CU_ASSERT(g_list_find(channel->recall, recall0) != NULL); CU_ASSERT(g_list_find(channel->recall, recall1) != NULL); } void ags_channel_test_add_recall_container() { AgsChannel *channel; AgsRecallContainer *recall_container0, *recall_container1; /* instantiate channel */ channel = ags_channel_new(NULL); /* instantiate recall */ recall_container0 = ags_recall_container_new(NULL); ags_channel_add_recall_container(channel, recall_container0); /* assert to be in channel->recall_container */ CU_ASSERT(g_list_find(channel->recall_container, recall_container0) != NULL); /* instantiate recall */ recall_container1 = ags_recall_container_new(NULL); ags_channel_add_recall_container(channel, recall_container1); /* assert to be in channel->recall_container */ CU_ASSERT(g_list_find(channel->recall_container, recall_container0) != NULL); CU_ASSERT(g_list_find(channel->recall_container, recall_container1) != NULL); } void ags_channel_test_add_recall_id() { AgsChannel *channel; AgsRecallID *recall_id0, *recall_id1; /* instantiate channel */ channel = ags_channel_new(NULL); /* instantiate recall */ recall_id0 = ags_recall_id_new(NULL); ags_channel_add_recall_id(channel, recall_id0); /* assert to be in channel->recall_id */ CU_ASSERT(g_list_find(channel->recall_id, recall_id0) != NULL); /* instantiate recall */ recall_id1 = ags_recall_id_new(NULL); ags_channel_add_recall_id(channel, recall_id1); /* assert to be in channel->recall_id */ CU_ASSERT(g_list_find(channel->recall_id, recall_id0) != NULL); CU_ASSERT(g_list_find(channel->recall_id, recall_id1) != NULL); } void ags_channel_test_duplicate_recall() { AgsChannel *channel; AgsRecall *recall; AgsRecall *recall_channel_run; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsRecallID *recall_id; /* instantiate channel */ channel = ags_channel_new(NULL); /* case 1: playback recall */ recall = ags_recall_new(); recall->flags |= AGS_RECALL_TEMPLATE; recall->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, recall, TRUE); recall_channel_run = ags_recall_channel_run_new(); recall_channel_run->flags |= AGS_RECALL_TEMPLATE; recall_channel_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, recall_channel_run, TRUE); /* assert inital count */ CU_ASSERT(g_list_length(channel->play) == 2); CU_ASSERT(g_list_length(channel->recall) == 0); /* instantiate recycling context and recall id */ recycling_context = ags_recycling_context_new(0); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context\0", recycling_context, NULL); /* duplicate recall */ ags_channel_duplicate_recall(channel, recall_id); CU_ASSERT(g_list_length(channel->play) == 4); CU_ASSERT(g_list_length(channel->recall) == 0); /* case 2: true recall */ recall = ags_recall_new(); recall->flags |= AGS_RECALL_TEMPLATE; recall->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, recall, FALSE); recall_channel_run = ags_recall_channel_run_new(); recall_channel_run->flags |= AGS_RECALL_TEMPLATE; recall_channel_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, recall_channel_run, FALSE); /* assert inital count */ CU_ASSERT(g_list_length(channel->play) == 4); CU_ASSERT(g_list_length(channel->recall) == 2); /* instantiate recycling context and recall id */ parent_recycling_context = ags_recycling_context_new(0); recycling_context = ags_recycling_context_new(0); g_object_set(recycling_context, "parent\0", parent_recycling_context, NULL); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context\0", recycling_context, NULL); /* duplicate recall */ ags_channel_duplicate_recall(channel, recall_id); CU_ASSERT(g_list_length(channel->play) == 4); CU_ASSERT(g_list_length(channel->recall) == 4); } void ags_channel_test_init_recall() { AgsChannel *channel; AgsRecall *recall; AgsRecall *recall_channel_run; AgsRecyclingContext *recycling_context; AgsRecallID *recall_id; GList *list; /* instantiate channel */ channel = ags_channel_new(NULL); /* instantiate recalls */ recall = ags_recall_new(); recall->flags |= AGS_RECALL_TEMPLATE; recall->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, recall, TRUE); recall_channel_run = ags_recall_channel_run_new(); recall_channel_run->flags |= AGS_RECALL_TEMPLATE; recall_channel_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, recall_channel_run, TRUE); /* instantiate recycling context and recall id */ recycling_context = ags_recycling_context_new(0); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context\0", recycling_context, NULL); ags_channel_add_recall_id(channel, recall_id); /* init recall */ test_init_recall_callback_hits_count = 0; ags_channel_duplicate_recall(channel, recall_id); ags_channel_resolve_recall(channel, recall_id); list = channel->play; while(list != NULL){ g_signal_connect(G_OBJECT(list->data), "run-init-pre\0", G_CALLBACK(ags_channel_test_run_init_pre_recall_callback), NULL); list = list->next; } ags_channel_init_recall(channel, recall_id, AGS_SOUND_STAGING_RUN_INIT_PRE); CU_ASSERT(test_init_recall_callback_hits_count == 2); } void ags_channel_test_resolve_recall() { AgsChannel *channel; AgsRecall *master_recall_channel_run; AgsRecall *slave_recall_channel_run; AgsRecyclingContext *recycling_context; AgsRecallID *recall_id; /* instantiate channel */ channel = ags_channel_new(NULL); /* instantiate recalls */ slave_recall_channel_run = ags_recall_channel_run_new(); slave_recall_channel_run->ability_flags = AGS_SOUND_ABILITY_NOTATION; ags_channel_add_recall(channel, slave_recall_channel_run, TRUE); g_signal_connect(G_OBJECT(slave_recall_channel_run), "resolve-dependency\0", G_CALLBACK(ags_channel_test_resolve_recall_callback), NULL); /* instantiate recycling context and recall id */ recycling_context = ags_recycling_context_new(0); recall_id = ags_recall_id_new(NULL); recall_id->sound_scope = AGS_SOUND_SCOPE_NOTATION; g_object_set(recall_id, "recycling-context\0", recycling_context, NULL); /* setup recalls */ g_object_set(slave_recall_channel_run, "recall-id\0", recall_id, NULL); /* resolve recall */ test_resolve_recall_callback_hits_count = 0; ags_channel_resolve_recall(channel, recall_id); CU_ASSERT(test_resolve_recall_callback_hits_count == 1); } void ags_channel_test_finalize_stub(GObject *gobject) { channel_test_finalized = TRUE; } void ags_channel_test_run_init_pre_recall_callback(AgsRecall *recall, gpointer data) { test_init_recall_callback_hits_count++; } void ags_channel_test_resolve_recall_callback(AgsRecall *recall, gpointer data) { test_resolve_recall_callback_hits_count++; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C\0"); putenv("LANG=C\0"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsChannelTest\0", ags_channel_test_init_suite, ags_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsChannel dispose\0", ags_channel_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsChannel finalize\0", ags_channel_test_finalize) == NULL) || (CU_add_test(pSuite, "test of AgsChannel add recall\0", ags_channel_test_add_recall) == NULL) || (CU_add_test(pSuite, "test of AgsChannel add recall container\0", ags_channel_test_add_recall_container) == NULL) || (CU_add_test(pSuite, "test of AgsChannel add recall id\0", ags_channel_test_add_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsChannel add duplicate recall\0", ags_channel_test_duplicate_recall) == NULL) || (CU_add_test(pSuite, "test of AgsChannel add resolve recall\0", ags_channel_test_resolve_recall) == NULL) || (CU_add_test(pSuite, "test of AgsChannel add init recall\0", ags_channel_test_init_recall) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_channel_test.c0000644000175000017500000000703513605312646020434 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_recall_channel_test_init_suite(); int ags_recall_channel_test_clean_suite(); void ags_recall_channel_test_find_channel(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_channel_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_channel_test_clean_suite() { return(0); } void ags_recall_channel_test_find_channel() { AgsChannel *source[3]; AgsRecallChannel *recall_channel[3]; GList *list, *current; list = NULL; /* recall channel #0 */ source[0] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall_channel[0] = g_object_new(AGS_TYPE_RECALL_CHANNEL, "source", source[0], NULL); list = g_list_prepend(list, recall_channel[0]); /* recall channel #1 */ source[1] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall_channel[1] = g_object_new(AGS_TYPE_RECALL_CHANNEL, "source", source[1], NULL); list = g_list_prepend(list, recall_channel[1]); /* recall channel #2 */ source[2] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall_channel[2] = g_object_new(AGS_TYPE_RECALL_CHANNEL, "source", source[2], NULL); list = g_list_prepend(list, recall_channel[2]); /* assert */ CU_ASSERT((current = ags_recall_channel_find_channel(list, source[0])) != NULL && current->data == recall_channel[0]); CU_ASSERT((current = ags_recall_channel_find_channel(list, source[1])) != NULL && current->data == recall_channel[1]); CU_ASSERT((current = ags_recall_channel_find_channel(list, source[2])) != NULL && current->data == recall_channel[2]); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallChannelTest", ags_recall_channel_test_init_suite, ags_recall_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecallChannel find channel", ags_recall_channel_test_find_channel) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/0000755000175000017500000000000013622252263014457 500000000000000gsequencer-3.1.3/ags/test/audio/task/ags_add_audio_test.c0000644000175000017500000000637213614062654020361 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_add_audio_test_init_suite(); int ags_add_audio_test_clean_suite(); void ags_add_audio_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_audio_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_audio_test_clean_suite() { return(0); } void ags_add_audio_test_launch() { AgsDevout *devout; AgsAudio *audio; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GList *list; ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); /* create add audio */ add_audio = ags_add_audio_new(audio); CU_ASSERT(AGS_IS_ADD_AUDIO(add_audio)); CU_ASSERT(add_audio->audio == audio); /* launch */ ags_task_launch(add_audio); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); CU_ASSERT(g_list_find(list, audio) != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAddAudioTest", ags_add_audio_test_init_suite, ags_add_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAddAudio launch", ags_add_audio_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_reset_amplitude_test.c0000644000175000017500000001146413614062654021634 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_reset_amplitude_test_init_suite(); int ags_reset_amplitude_test_clean_suite(); void ags_reset_amplitude_test_launch(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; GList *recall; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_reset_amplitude_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-analyse */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-analyse", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_reset_amplitude_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_reset_amplitude_test_launch() { AgsResetAmplitude *reset_amplitude; GList *list; GValue value = {0,}; reset_amplitude = ags_reset_amplitude_get_instance(); CU_ASSERT(AGS_IS_RESET_AMPLITUDE(reset_amplitude)); list = ags_recall_find_type(audio->input->recall, AGS_TYPE_ANALYSE_CHANNEL); ags_reset_amplitude_add(reset_amplitude, list->data); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(AGS_ANALYSE_CHANNEL(list->data)->buffer_computed, &value); /* test */ ags_task_launch(reset_amplitude); ags_port_safe_read(AGS_ANALYSE_CHANNEL(list->data)->buffer_computed, &value); CU_ASSERT(g_value_get_boolean(&value) == FALSE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsResetAmplitudeTest", ags_reset_amplitude_test_init_suite, ags_reset_amplitude_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsResetAmplitude launch", ags_reset_amplitude_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_set_format_test.c0000644000175000017500000000677013614062654020615 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_set_format_test_init_suite(); int ags_set_format_test_clean_suite(); void ags_set_format_test_launch(); AgsConfig *config; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_format_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_format_test_clean_suite() { return(0); } void ags_set_format_test_launch() { AgsDevout *devout; AgsSetFormat *set_format; guint format; devout = ags_devout_new(NULL); ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(application_context), devout); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_prepend(NULL, devout)); set_format = ags_set_format_new(devout, AGS_SOUNDCARD_SIGNED_24_BIT); CU_ASSERT(AGS_IS_SET_FORMAT(set_format)); CU_ASSERT(set_format->scope == devout); CU_ASSERT(set_format->format == AGS_SOUNDCARD_SIGNED_24_BIT); /* launch */ ags_task_launch(set_format); ags_soundcard_get_presets(AGS_SOUNDCARD(devout), NULL, NULL, NULL, &format); CU_ASSERT(format == AGS_SOUNDCARD_SIGNED_24_BIT); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSetFormatTest", ags_set_format_test_init_suite, ags_set_format_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSetFormat launch", ags_set_format_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_clear_buffer_test.c0000644000175000017500000001256113605312646021063 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_clear_buffer_test_init_suite(); int ags_clear_buffer_test_clean_suite(); void ags_clear_buffer_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_clear_buffer_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_clear_buffer_test_clean_suite() { return(0); } void ags_clear_buffer_test_launch() { AgsDevout *devout; AgsClearBuffer *clear_buffer; gint16 *buffer; guint i; gboolean success; /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_set(devout, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); g_object_ref(devout); /* fill random data - attempt #0 */ devout->flags |= AGS_DEVOUT_BUFFER0; buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); for(i = 0; i < devout->buffer_size; i++){ buffer[i] = rand() % G_MAXINT16; } /* create clear buffer */ clear_buffer = ags_clear_buffer_new(devout); CU_ASSERT(AGS_IS_CLEAR_BUFFER(clear_buffer)); CU_ASSERT(clear_buffer->device == devout); /* launch */ ags_task_launch(clear_buffer); buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); success = TRUE; for(i = 0; i < devout->buffer_size; i++){ if(buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* fill random data - attempt #1 */ devout->flags &= (~AGS_DEVOUT_BUFFER0); devout->flags |= AGS_DEVOUT_BUFFER1; buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); for(i = 0; i < devout->buffer_size; i++){ buffer[i] = rand() % G_MAXINT16; } /* create clear buffer */ clear_buffer = ags_clear_buffer_new(devout); CU_ASSERT(AGS_IS_CLEAR_BUFFER(clear_buffer)); CU_ASSERT(clear_buffer->device == devout); /* launch */ ags_task_launch(clear_buffer); buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); success = TRUE; for(i = 0; i < devout->buffer_size; i++){ if(buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* fill random data - attempt #2 */ devout->flags &= (~AGS_DEVOUT_BUFFER1); devout->flags |= AGS_DEVOUT_BUFFER2; buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); for(i = 0; i < devout->buffer_size; i++){ buffer[i] = rand() % G_MAXINT16; } /* create clear buffer */ clear_buffer = ags_clear_buffer_new(devout); CU_ASSERT(AGS_IS_CLEAR_BUFFER(clear_buffer)); CU_ASSERT(clear_buffer->device == devout); /* launch */ ags_task_launch(clear_buffer); buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); success = TRUE; for(i = 0; i < devout->buffer_size; i++){ if(buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* fill random data - attempt #3 */ devout->flags &= (~AGS_DEVOUT_BUFFER2); devout->flags |= AGS_DEVOUT_BUFFER3; buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); for(i = 0; i < devout->buffer_size; i++){ buffer[i] = rand() % G_MAXINT16; } /* create clear buffer */ clear_buffer = ags_clear_buffer_new(devout); CU_ASSERT(AGS_IS_CLEAR_BUFFER(clear_buffer)); CU_ASSERT(clear_buffer->device == devout); /* launch */ ags_task_launch(clear_buffer); buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(devout)); success = TRUE; for(i = 0; i < devout->buffer_size; i++){ if(buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsClearBufferTest", ags_clear_buffer_test_init_suite, ags_clear_buffer_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsClearBuffer launch", ags_clear_buffer_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_crop_note_test.c0000644000175000017500000000774713607210263020440 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_crop_note_test_init_suite(); int ags_crop_note_test_clean_suite(); void ags_crop_note_test_launch(); #define AGS_CROP_NOTE_TEST_LAUNCH_NOTE_COUNT (16 * 64) #define AGS_CROP_NOTE_TEST_LAUNCH_MAX_NOTE_WIDTH (4) #define AGS_CROP_NOTE_TEST_LAUNCH_MAX_NOTE_HEIGHT (88) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_crop_note_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_crop_note_test_clean_suite() { return(0); } void ags_crop_note_test_launch() { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsCropNote *crop_note; GList *selection; GList *list; guint i; gboolean success; audio = ags_audio_new(NULL); notation = ags_notation_new(audio, 0); ags_audio_add_notation(audio, notation); for(i = 0; i < AGS_CROP_NOTE_TEST_LAUNCH_NOTE_COUNT; i++){ note = ags_note_new(); note->x[0] = rand() % AGS_CROP_NOTE_TEST_LAUNCH_NOTE_COUNT; note->x[1] = note->x[0] + 1; note->y = rand() % AGS_CROP_NOTE_TEST_LAUNCH_MAX_NOTE_HEIGHT; ags_notation_add_note(notation, note, FALSE); } ags_notation_add_all_to_selection(notation); selection = g_list_copy_deep(ags_notation_get_selection(notation), (GCopyFunc) g_object_ref, NULL); crop_note = ags_crop_note_new(audio, notation, selection, 0, 4, TRUE, TRUE, TRUE); CU_ASSERT(AGS_IS_CROP_NOTE(crop_note)); CU_ASSERT(crop_note->notation == notation); // CU_ASSERT(crop_note->selection == selection); CU_ASSERT(crop_note->x_padding == 0); CU_ASSERT(crop_note->x_crop == 4); CU_ASSERT(crop_note->absolute == TRUE); CU_ASSERT(crop_note->in_place == TRUE); CU_ASSERT(crop_note->do_resize == TRUE); /* launch */ ags_task_launch(crop_note); list = notation->note; success = TRUE; for(i = 0; i < AGS_CROP_NOTE_TEST_LAUNCH_NOTE_COUNT && list != NULL; i++){ if(AGS_NOTE(list->data)->x[1] - AGS_NOTE(list->data)->x[0] != 4){ success = FALSE; break; } list = list->next; } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCropNoteTest", ags_crop_note_test_init_suite, ags_crop_note_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCropNote launch", ags_crop_note_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_start_audio_test.c0000644000175000017500000001247113614062654020763 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_start_audio_test_init_suite(); int ags_start_audio_test_clean_suite(); void ags_start_audio_test_launch(); #define AGS_START_AUDIO_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=48000\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" GThread *add_thread = NULL; AgsConfig *config; AgsApplicationContext *application_context; gpointer ags_start_audio_test_add_thread(gpointer data) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ exit(CU_get_error()); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsStartAudioTest", ags_start_audio_test_init_suite, ags_start_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); exit(CU_get_error()); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsStartAudio launch", ags_start_audio_test_launch) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_start_audio_test_init_suite() { AgsThread *main_loop; gint64 start_thread_timeout; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_START_AUDIO_TEST_CONFIG, strlen(AGS_START_AUDIO_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); main_loop = application_context->main_loop; ags_thread_set_flags(main_loop, AGS_THREAD_TIME_ACCOUNTING); start_thread_timeout = g_get_monotonic_time() + 20 * G_USEC_PER_SEC; while(!ags_thread_test_status_flags(main_loop, AGS_THREAD_STATUS_RUNNING)){ g_usleep(4); if(g_get_monotonic_time() > start_thread_timeout){ g_critical("start timeout"); break; } } return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_start_audio_test_clean_suite() { return(0); } void ags_start_audio_test_launch() { AgsAudio *audio; AgsStartAudio *start_audio; AgsTaskLauncher *task_launcher; audio = ags_audio_new(NULL); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE)); ags_audio_set_audio_channels(audio, 2, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 8, 0); start_audio = ags_start_audio_new(audio, -1); CU_ASSERT(AGS_IS_START_AUDIO(start_audio)); CU_ASSERT(start_audio->audio == audio); CU_ASSERT(start_audio->sound_scope == -1); /* launch */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); ags_task_launcher_add_task(task_launcher, start_audio); g_usleep(5 * G_USEC_PER_SEC); CU_ASSERT(audio->recall_id != NULL); } int main(int argc, char **argv) { add_thread = g_thread_new("libags_audio.so - functional pitch test", ags_start_audio_test_add_thread, NULL); g_main_loop_run(g_main_loop_new(g_main_context_default(), FALSE)); g_thread_join(add_thread); return(-1); } gsequencer-3.1.3/ags/test/audio/task/ags_remove_audio_signal_test.c0000644000175000017500000000770713605312646022465 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_remove_audio_signal_test_init_suite(); int ags_remove_audio_signal_test_clean_suite(); void ags_remove_audio_signal_test_launch_remove_audio_signal_callback(); void ags_remove_audio_signal_test_launch(); gboolean ags_remove_audio_signal_test_launch_remove_audio_signal_invoked = FALSE; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_audio_signal_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_audio_signal_test_clean_suite() { return(0); } void ags_remove_audio_signal_test_launch_remove_audio_signal_callback() { ags_remove_audio_signal_test_launch_remove_audio_signal_invoked = TRUE; } void ags_remove_audio_signal_test_launch() { AgsDevout *devout; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsRemoveAudioSignal *remove_audio_signal; /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create recycling */ recycling = ags_recycling_new(NULL); g_object_ref(recycling); /* create recall id */ recall_id = ags_recall_id_new(); g_object_ref(recall_id); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, recall_id); ags_recycling_add_audio_signal(recycling, audio_signal); /* create remove audio signal */ remove_audio_signal = ags_remove_audio_signal_new(recycling, audio_signal); CU_ASSERT(AGS_IS_REMOVE_AUDIO_SIGNAL(remove_audio_signal)); CU_ASSERT(remove_audio_signal->recycling == recycling); CU_ASSERT(remove_audio_signal->audio_signal == audio_signal); /* launch */ g_signal_connect(recycling, "remove-audio-signal", G_CALLBACK(ags_remove_audio_signal_test_launch_remove_audio_signal_callback), NULL); ags_task_launch(remove_audio_signal); CU_ASSERT(ags_remove_audio_signal_test_launch_remove_audio_signal_invoked == TRUE); CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* remove a suite to the registry */ pSuite = CU_add_suite("AgsRemoveAudioSignalTest", ags_remove_audio_signal_test_init_suite, ags_remove_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* remove the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRemoveAudioSignal launch", ags_remove_audio_signal_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_apply_tact_test.c0000644000175000017500000002012413605312646020576 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_apply_tact_test_init_suite(); int ags_apply_tact_test_clean_suite(); void ags_apply_tact_test_launch_scope_recall(); void ags_apply_tact_test_launch_scope_channel(); void ags_apply_tact_test_launch_scope_audio(); void ags_apply_tact_test_launch_scope_soundcard(); void ags_apply_tact_test_launch_scope_sequencer(); void ags_apply_tact_test_launch_scope_application_context(); #define AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_RECALL_TACT (1.0) #define AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_CHANNEL_TACT (1.0) #define AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_AUDIO_TACT (1.0) #define AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SOUNDCARD_TACT (1.0) #define AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SEQUENCER_TACT (1.0) #define AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_TACT (1.0) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_tact_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_tact_test_clean_suite() { return(0); } void ags_apply_tact_test_launch_scope_recall() { AgsDevout *devout; AgsAudio *audio; AgsDelayAudio *delay_audio; AgsApplyTact *apply_tact; devout = ags_devout_new(NULL); g_object_ref(devout); audio = ags_audio_new(devout); g_object_ref(audio); delay_audio = ags_delay_audio_new(audio); g_object_set(delay_audio, "output-soundcard", devout, NULL); apply_tact = ags_apply_tact_new(delay_audio, AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_RECALL_TACT); CU_ASSERT(AGS_IS_APPLY_TACT(apply_tact)); CU_ASSERT(apply_tact->scope == delay_audio); CU_ASSERT(apply_tact->tact == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_RECALL_TACT); /* test */ ags_task_launch(apply_tact); CU_ASSERT(ags_tactable_get_tact(AGS_TACTABLE(delay_audio)) == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_RECALL_TACT); } void ags_apply_tact_test_launch_scope_channel() { AgsChannel *channel; AgsApplyTact *apply_tact; channel = ags_channel_new(NULL); g_object_ref(channel); apply_tact = ags_apply_tact_new(channel, AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_CHANNEL_TACT); CU_ASSERT(AGS_IS_APPLY_TACT(apply_tact)); CU_ASSERT(apply_tact->scope == channel); CU_ASSERT(apply_tact->tact == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_CHANNEL_TACT); /* test */ ags_task_launch(apply_tact); } void ags_apply_tact_test_launch_scope_audio() { AgsDevout *devout; AgsAudio *audio; AgsDelayAudio *delay_audio; AgsApplyTact *apply_tact; devout = ags_devout_new(NULL); g_object_ref(devout); audio = ags_audio_new(NULL); g_object_ref(audio); delay_audio = ags_delay_audio_new(audio); g_object_set(delay_audio, "output-soundcard", devout, NULL); ags_audio_add_recall(audio, delay_audio, FALSE); apply_tact = ags_apply_tact_new(audio, AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_AUDIO_TACT); CU_ASSERT(AGS_IS_APPLY_TACT(apply_tact)); CU_ASSERT(apply_tact->scope == audio); CU_ASSERT(apply_tact->tact == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_AUDIO_TACT); /* test */ ags_task_launch(apply_tact); CU_ASSERT(ags_tactable_get_tact(AGS_TACTABLE(delay_audio)) == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_AUDIO_TACT); } void ags_apply_tact_test_launch_scope_soundcard() { AgsDevout *devout; AgsApplyTact *apply_tact; devout = ags_devout_new(NULL); g_object_ref(devout); apply_tact = ags_apply_tact_new(devout, AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SOUNDCARD_TACT); CU_ASSERT(AGS_IS_APPLY_TACT(apply_tact)); CU_ASSERT(apply_tact->scope == devout); CU_ASSERT(apply_tact->tact == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SOUNDCARD_TACT); /* test */ ags_task_launch(apply_tact); CU_ASSERT(ags_soundcard_get_delay_factor(AGS_SOUNDCARD(devout)) == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SOUNDCARD_TACT); } void ags_apply_tact_test_launch_scope_sequencer() { AgsMidiin *midiin; AgsApplyTact *apply_tact; midiin = ags_midiin_new(NULL); g_object_ref(midiin); apply_tact = ags_apply_tact_new(midiin, AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SEQUENCER_TACT); CU_ASSERT(AGS_IS_APPLY_TACT(apply_tact)); CU_ASSERT(apply_tact->scope == midiin); CU_ASSERT(apply_tact->tact == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SEQUENCER_TACT); /* test */ ags_task_launch(apply_tact); CU_ASSERT(ags_sequencer_get_delay_factor(AGS_SEQUENCER(midiin)) == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_SEQUENCER_TACT); } void ags_apply_tact_test_launch_scope_application_context() { AgsDevout *devout; AgsMidiin *midiin; AgsAudio *audio; AgsApplyTact *apply_tact; AgsApplicationContext *application_context; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); midiin = ags_midiin_new(application_context); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, midiin)); g_object_ref(midiin); audio = ags_audio_new(devout); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); apply_tact = ags_apply_tact_new(application_context, AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_TACT); /* test */ ags_task_launch(apply_tact); CU_ASSERT(ags_soundcard_get_delay_factor(AGS_SOUNDCARD(devout)) == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_TACT); CU_ASSERT(ags_sequencer_get_delay_factor(AGS_SEQUENCER(midiin)) == AGS_APPLY_TACT_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_TACT); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsApplyTactTest", ags_apply_tact_test_init_suite, ags_apply_tact_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsApplyTact launch scope recall", ags_apply_tact_test_launch_scope_recall) == NULL) || (CU_add_test(pSuite, "test of AgsApplyTact launch scope channel", ags_apply_tact_test_launch_scope_channel) == NULL) || (CU_add_test(pSuite, "test of AgsApplyTact launch scope audio", ags_apply_tact_test_launch_scope_audio) == NULL) || (CU_add_test(pSuite, "test of AgsApplyTact launch scope soundcard", ags_apply_tact_test_launch_scope_soundcard) == NULL) || (CU_add_test(pSuite, "test of AgsApplyTact launch scope sequencer", ags_apply_tact_test_launch_scope_sequencer) == NULL) || (CU_add_test(pSuite, "test of AgsApplyTact launch scope application context", ags_apply_tact_test_launch_scope_application_context) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_set_buffer_size_test.c0000644000175000017500000000705013614062654021620 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_set_buffer_size_test_init_suite(); int ags_set_buffer_size_test_clean_suite(); void ags_set_buffer_size_test_launch(); AgsConfig *config; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_buffer_size_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_buffer_size_test_clean_suite() { return(0); } void ags_set_buffer_size_test_launch() { AgsDevout *devout; AgsSetBufferSize *set_buffer_size; guint buffer_size; devout = ags_devout_new(NULL); ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(application_context), devout); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_prepend(NULL, devout)); set_buffer_size = ags_set_buffer_size_new(devout, 256); CU_ASSERT(AGS_IS_SET_BUFFER_SIZE(set_buffer_size)); CU_ASSERT(set_buffer_size->scope == devout); CU_ASSERT(set_buffer_size->buffer_size == 256); /* launch */ ags_task_launch(set_buffer_size); ags_soundcard_get_presets(AGS_SOUNDCARD(devout), NULL, NULL, &buffer_size, NULL); CU_ASSERT(buffer_size == 256); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSetBufferSizeTest", ags_set_buffer_size_test_init_suite, ags_set_buffer_size_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSetBufferSize launch", ags_set_buffer_size_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_start_channel_test.c0000644000175000017500000001271713614062654021275 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_start_channel_test_init_suite(); int ags_start_channel_test_clean_suite(); void ags_start_channel_test_launch(); #define AGS_START_CHANNEL_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=48000\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" GThread *add_thread = NULL; AgsConfig *config; AgsApplicationContext *application_context; gpointer ags_start_channel_test_add_thread(gpointer data) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ exit(CU_get_error()); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsStartChannelTest", ags_start_channel_test_init_suite, ags_start_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); exit(CU_get_error()); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsStartChannel launch", ags_start_channel_test_launch) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_start_channel_test_init_suite() { AgsThread *main_loop; gint64 start_thread_timeout; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_START_CHANNEL_TEST_CONFIG, strlen(AGS_START_CHANNEL_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); main_loop = application_context->main_loop; ags_thread_set_flags(main_loop, AGS_THREAD_TIME_ACCOUNTING); start_thread_timeout = g_get_monotonic_time() + 20 * G_USEC_PER_SEC; while(!ags_thread_test_status_flags(main_loop, AGS_THREAD_STATUS_RUNNING)){ g_usleep(4); if(g_get_monotonic_time() > start_thread_timeout){ g_critical("start timeout"); break; } } return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_start_channel_test_clean_suite() { return(0); } void ags_start_channel_test_launch() { AgsAudio *audio; AgsChannel *channel; AgsStartChannel *start_channel; AgsTaskLauncher *task_launcher; audio = ags_audio_new(NULL); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE)); ags_audio_set_audio_channels(audio, 2, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 8, 0); g_object_get(audio, "input", &channel, NULL); start_channel = ags_start_channel_new(channel, -1); CU_ASSERT(AGS_IS_START_CHANNEL(start_channel)); CU_ASSERT(start_channel->channel == channel); CU_ASSERT(start_channel->sound_scope == -1); /* launch */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); ags_task_launcher_add_task(task_launcher, start_channel); g_usleep(5 * G_USEC_PER_SEC); CU_ASSERT(channel->recall_id != NULL); } int main(int argc, char **argv) { add_thread = g_thread_new("libags_audio.so - functional pitch test", ags_start_channel_test_add_thread, NULL); g_main_loop_run(g_main_loop_new(g_main_context_default(), FALSE)); g_thread_join(add_thread); return(-1); } gsequencer-3.1.3/ags/test/audio/task/ags_add_effect_test.c0000644000175000017500000000707113605312646020510 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_add_effect_test_init_suite(); int ags_add_effect_test_clean_suite(); void ags_add_effect_test_launch(); void ags_add_effect_test_launch_add_effect_callback(); #define AGS_ADD_EFFECT_TEST_LAUNCH_FILENAME "/usr/lib/ladspa/cmt.so" #define AGS_ADD_EFFECT_TEST_LAUNCH_EFFECT "Freeverb (Version 3)" gboolean ags_add_effect_test_launch_add_effect_invoked = FALSE; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_effect_test_init_suite() { AgsLadspaManager *ladspa_manager; ladspa_manager = ags_ladspa_manager_get_instance(); ags_ladspa_manager_load_default_directory(ladspa_manager); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_effect_test_clean_suite() { return(0); } void ags_add_effect_test_launch_add_effect_callback() { ags_add_effect_test_launch_add_effect_invoked = TRUE; } void ags_add_effect_test_launch() { AgsChannel *channel; AgsAddEffect *add_effect; channel = ags_channel_new(NULL); g_object_ref(channel); add_effect = ags_add_effect_new(channel, AGS_ADD_EFFECT_TEST_LAUNCH_FILENAME, AGS_ADD_EFFECT_TEST_LAUNCH_EFFECT); CU_ASSERT(AGS_IS_ADD_EFFECT(add_effect)); CU_ASSERT(!g_strcmp0(add_effect->filename, AGS_ADD_EFFECT_TEST_LAUNCH_FILENAME)); CU_ASSERT(!g_strcmp0(add_effect->effect, AGS_ADD_EFFECT_TEST_LAUNCH_EFFECT)); /* test */ g_signal_connect(channel, "add-effect", G_CALLBACK(ags_add_effect_test_launch_add_effect_callback), NULL); ags_task_launch(add_effect); CU_ASSERT(ags_add_effect_test_launch_add_effect_invoked == TRUE); CU_ASSERT(ags_recall_find_type(channel->play, AGS_TYPE_RECALL_LADSPA) != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAddEffectTest", ags_add_effect_test_init_suite, ags_add_effect_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAddEffect launch", ags_add_effect_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_seek_soundcard_test.c0000644000175000017500000000574413605312646021442 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_seek_soundcard_test_init_suite(); int ags_seek_soundcard_test_clean_suite(); void ags_seek_soundcard_test_launch(); AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_seek_soundcard_test_init_suite() { application_context = ags_audio_application_context_new(); g_object_ref(application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_seek_soundcard_test_clean_suite() { return(0); } void ags_seek_soundcard_test_launch() { AgsDevout *devout; AgsSeekSoundcard *seek_soundcard; devout = ags_devout_new(NULL); seek_soundcard = ags_seek_soundcard_new(devout, 64 * 16, AGS_SEEK_SET); CU_ASSERT(AGS_IS_SEEK_SOUNDCARD(seek_soundcard)); CU_ASSERT(seek_soundcard->soundcard == devout); CU_ASSERT(seek_soundcard->offset == 64 * 16); CU_ASSERT(seek_soundcard->whence == AGS_SEEK_SET); /* launch */ ags_task_launch(seek_soundcard); CU_ASSERT(ags_soundcard_get_note_offset(AGS_SOUNDCARD(devout)) == 64 * 16); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSeekSoundcardTest", ags_seek_soundcard_test_init_suite, ags_seek_soundcard_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSeekSoundcard launch", ags_seek_soundcard_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_free_selection_test.c0000644000175000017500000000660513605312646021434 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_free_selection_test_init_suite(); int ags_free_selection_test_clean_suite(); void ags_free_selection_test_launch(); #define AGS_FREE_SELECTION_TEST_LAUNCH_NOTE_COUNT (16 * 64) #define AGS_FREE_SELECTION_TEST_LAUNCH_MAX_NOTE_WIDTH (4) #define AGS_FREE_SELECTION_TEST_LAUNCH_MAX_NOTE_HEIGHT (88) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_free_selection_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_free_selection_test_clean_suite() { return(0); } void ags_free_selection_test_launch() { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsFreeSelection *free_selection; guint i; audio = ags_audio_new(NULL); g_object_ref(audio); notation = ags_notation_new(audio, 0); ags_audio_add_notation(audio, notation); for(i = 0; i < AGS_FREE_SELECTION_TEST_LAUNCH_NOTE_COUNT; i++){ note = ags_note_new(); note->x[0] = rand() % AGS_FREE_SELECTION_TEST_LAUNCH_NOTE_COUNT; note->x[1] = note->x[0] + 1; note->y = rand() % AGS_FREE_SELECTION_TEST_LAUNCH_MAX_NOTE_HEIGHT; ags_notation_add_note(notation, note, FALSE); } ags_notation_add_all_to_selection(notation); free_selection = ags_free_selection_new(notation); CU_ASSERT(AGS_IS_FREE_SELECTION(free_selection)); CU_ASSERT(free_selection->notation == notation); /* launch */ ags_task_launch(free_selection); CU_ASSERT(notation->selection == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFreeSelectionTest", ags_free_selection_test_init_suite, ags_free_selection_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFreeSelection launch", ags_free_selection_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_set_device_test.c0000644000175000017500000000533213605312646020554 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_set_device_test_init_suite(); int ags_set_device_test_clean_suite(); void ags_set_device_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_device_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_device_test_clean_suite() { return(0); } void ags_set_device_test_launch() { AgsDevout *devout; AgsSetDevice *set_device; devout = ags_devout_new(NULL); set_device = ags_set_device_new(devout, "default"); CU_ASSERT(AGS_IS_SET_DEVICE(set_device)); CU_ASSERT(set_device->scope == devout); CU_ASSERT(!g_strcmp0(set_device->device, "default")); /* launch */ ags_task_launch(set_device); CU_ASSERT(!g_strcmp0(ags_soundcard_get_device(AGS_SOUNDCARD(devout)), "default")); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSetDeviceTest", ags_set_device_test_init_suite, ags_set_device_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSetDevice launch", ags_set_device_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_add_soundcard_test.c0000644000175000017500000000570613607210263021233 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_add_soundcard_test_init_suite(); int ags_add_soundcard_test_clean_suite(); void ags_add_soundcard_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_soundcard_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_soundcard_test_clean_suite() { return(0); } void ags_add_soundcard_test_launch() { AgsDevout *devout; AgsAddSoundcard *add_soundcard; AgsApplicationContext *application_context; GList *list; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); g_object_ref(devout); add_soundcard = ags_add_soundcard_new(devout); CU_ASSERT(AGS_IS_ADD_SOUNDCARD(add_soundcard)); CU_ASSERT(add_soundcard->soundcard == devout); /* test */ ags_task_launch(add_soundcard); list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); CU_ASSERT(list != NULL); CU_ASSERT(list->data == devout); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAddSoundcardTest", ags_add_soundcard_test_init_suite, ags_add_soundcard_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAddSoundcard launch", ags_add_soundcard_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_move_note_test.c0000644000175000017500000001027613607210263020432 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_move_note_test_init_suite(); int ags_move_note_test_clean_suite(); void ags_move_note_test_launch(); #define AGS_MOVE_NOTE_TEST_LAUNCH_NOTE_COUNT (16 * 64) #define AGS_MOVE_NOTE_TEST_LAUNCH_MAX_NOTE_WIDTH (4) #define AGS_MOVE_NOTE_TEST_LAUNCH_MAX_NOTE_HEIGHT (88) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_move_note_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_move_note_test_clean_suite() { return(0); } void ags_move_note_test_launch() { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsMoveNote *move_note; GList *selection; GList *list_notation, *list_note; guint i; gboolean success; audio = ags_audio_new(NULL); notation = ags_notation_new(audio, 0); ags_audio_add_notation(audio, notation); for(i = 0; i < AGS_MOVE_NOTE_TEST_LAUNCH_NOTE_COUNT; i++){ note = ags_note_new(); note->x[0] = rand() % AGS_MOVE_NOTE_TEST_LAUNCH_NOTE_COUNT; note->x[1] = note->x[0] + 1; note->y = rand() % AGS_MOVE_NOTE_TEST_LAUNCH_MAX_NOTE_HEIGHT; ags_notation_add_note(notation, note, FALSE); } ags_notation_add_all_to_selection(notation); selection = g_list_copy_deep(ags_notation_get_selection(notation), (GCopyFunc) g_object_ref, NULL); move_note = ags_move_note_new(audio, notation, selection, 0, 0, 8 * 16, 0, FALSE, TRUE); CU_ASSERT(AGS_IS_MOVE_NOTE(move_note)); CU_ASSERT(move_note->notation == notation); // CU_ASSERT(move_note->selection == selection); CU_ASSERT(move_note->first_x == 0); CU_ASSERT(move_note->first_y == 0); CU_ASSERT(move_note->move_x == 8 * 16); CU_ASSERT(move_note->move_y == 0); CU_ASSERT(move_note->relative == FALSE); CU_ASSERT(move_note->absolute == TRUE); /* launch */ ags_task_launch(move_note); list_notation = audio->notation; success = TRUE; for(i = 0; i < AGS_MOVE_NOTE_TEST_LAUNCH_NOTE_COUNT && list_notation != NULL;){ list_note = AGS_NOTATION(list_notation->data)->note; while(list_note != NULL){ if(AGS_NOTE(list_note->data)->x[0] < 8 * 16){ success = FALSE; break; } list_note = list_note->next; i++; } list_notation = list_notation->next; } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMoveNoteTest", ags_move_note_test_init_suite, ags_move_note_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMoveNote launch", ags_move_note_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_set_audio_channels_test.c0000644000175000017500000000566713605312646022304 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_set_audio_channels_test_init_suite(); int ags_set_audio_channels_test_clean_suite(); void ags_set_audio_channels_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_audio_channels_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_audio_channels_test_clean_suite() { return(0); } void ags_set_audio_channels_test_launch() { AgsDevout *devout; AgsSetAudioChannels *set_audio_channels; guint audio_channels; devout = ags_devout_new(NULL); set_audio_channels = ags_set_audio_channels_new(devout, 6); CU_ASSERT(AGS_IS_SET_AUDIO_CHANNELS(set_audio_channels)); CU_ASSERT(set_audio_channels->soundcard == devout); CU_ASSERT(set_audio_channels->audio_channels == 6); /* launch */ ags_task_launch(set_audio_channels); ags_soundcard_get_presets(AGS_SOUNDCARD(devout), &audio_channels, NULL, NULL, NULL); CU_ASSERT(audio_channels == 6); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSetAudioChannelsTest", ags_set_audio_channels_test_init_suite, ags_set_audio_channels_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSetAudioChannels launch", ags_set_audio_channels_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_set_muted_test.c0000644000175000017500000001030613614062654020431 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_set_muted_test_init_suite(); int ags_set_muted_test_clean_suite(); void ags_set_muted_test_launch(); AgsConfig *config; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_muted_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_muted_test_clean_suite() { return(0); } void ags_set_muted_test_launch() { AgsAudio *audio; AgsChannel *channel; AgsSetMuted *set_muted; guint muted; gboolean success; audio = ags_audio_new(NULL); ags_audio_set_audio_channels(audio, 2, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 8, 0); /* ags-mute */ ags_recall_factory_create(audio, NULL, NULL, "ags-mute", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); set_muted = ags_set_muted_new(audio, TRUE); CU_ASSERT(AGS_IS_SET_MUTED(set_muted)); CU_ASSERT(set_muted->scope == audio); CU_ASSERT(set_muted->muted == TRUE); /* launch */ ags_task_launch(set_muted); /* assert */ success = TRUE; channel = audio->input; while(channel != NULL){ GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); play = ags_recall_template_find_type(start_play, AGS_TYPE_MUTE_CHANNEL); recall = ags_recall_template_find_type(start_recall, AGS_TYPE_MUTE_CHANNEL); if(!AGS_MUTE_CHANNEL(play->data)->muted->port_value.ags_port_boolean || !AGS_MUTE_CHANNEL(recall->data)->muted->port_value.ags_port_boolean){ success = FALSE; break; } channel = channel->next; } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSetMutedTest", ags_set_muted_test_init_suite, ags_set_muted_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSetMuted launch", ags_set_muted_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_add_note_test.c0000644000175000017500000000566213605312646020225 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_add_note_test_init_suite(); int ags_add_note_test_clean_suite(); void ags_add_note_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_note_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_note_test_clean_suite() { return(0); } void ags_add_note_test_launch() { AgsAudio *audio; AgsNote *note; AgsAddNote *add_note; audio = ags_audio_new(NULL); g_object_ref(audio); note = ags_note_new(); g_object_ref(note); add_note = ags_add_note_new(audio, note, 0, FALSE); CU_ASSERT(AGS_IS_ADD_NOTE(add_note)); CU_ASSERT(add_note->audio == audio); CU_ASSERT(add_note->note == note); CU_ASSERT(add_note->audio_channel == 0); CU_ASSERT(add_note->use_selection_list == FALSE); /* test */ ags_task_launch(add_note); CU_ASSERT(audio->notation != NULL); CU_ASSERT(AGS_NOTATION(audio->notation->data)->note != NULL); CU_ASSERT(AGS_NOTATION(audio->notation->data)->note->data == note); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAddNoteTest", ags_add_note_test_init_suite, ags_add_note_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAddNote launch", ags_add_note_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_clear_audio_signal_test.c0000644000175000017500000000761713605312646022256 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_clear_audio_signal_test_init_suite(); int ags_clear_audio_signal_test_clean_suite(); void ags_clear_audio_signal_test_launch(); #define AGS_CLEAR_AUDIO_SIGNAL_TEST_STREAM_LENGTH (24) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_clear_audio_signal_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_clear_audio_signal_test_clean_suite() { return(0); } void ags_clear_audio_signal_test_launch() { AgsDevout *devout; AgsAudioSignal *audio_signal; AgsClearAudioSignal *clear_audio_signal; GList *list; guint i; gboolean success; /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, NULL, NULL); g_object_set(audio_signal, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); g_object_ref(audio_signal); ags_audio_signal_stream_resize(audio_signal, AGS_CLEAR_AUDIO_SIGNAL_TEST_STREAM_LENGTH); /* fill random data */ list = audio_signal->stream; while(list != NULL){ gint16 *buffer; buffer = list->data; for(i = 0; i < audio_signal->buffer_size; i++){ buffer[i] = rand() % G_MAXINT16; } list = list->next; } /* create clear audio signal */ clear_audio_signal = ags_clear_audio_signal_new(audio_signal); CU_ASSERT(AGS_IS_CLEAR_AUDIO_SIGNAL(clear_audio_signal)); CU_ASSERT(clear_audio_signal->audio_signal == audio_signal); /* launch */ ags_task_launch(clear_audio_signal); success = TRUE; list = audio_signal->stream; while(list != NULL){ gint16 *buffer; buffer = list->data; for(i = 0; i < audio_signal->buffer_size; i++){ if(buffer[i] != 0){ success = FALSE; goto ags_clear_audio_signal_launch_LOOP_END; } } list = list->next; } ags_clear_audio_signal_launch_LOOP_END: CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsClearAudioSignalTest", ags_clear_audio_signal_test_init_suite, ags_clear_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsClearAudioSignal launch", ags_clear_audio_signal_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_remove_note_test.c0000644000175000017500000000617413605312646020771 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_remove_note_test_init_suite(); int ags_remove_note_test_clean_suite(); void ags_remove_note_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_note_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_note_test_clean_suite() { return(0); } void ags_remove_note_test_launch() { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsRemoveNote *remove_note; audio = ags_audio_new(NULL); g_object_ref(audio); notation = ags_notation_new(audio, 0); g_object_ref(notation); ags_audio_add_notation(audio, notation); note = ags_note_new(); g_object_ref(note); ags_notation_add_note(notation, note, FALSE); remove_note = ags_remove_note_new(audio, note, 0, FALSE); CU_ASSERT(AGS_IS_REMOVE_NOTE(remove_note)); CU_ASSERT(remove_note->audio == audio); CU_ASSERT(remove_note->note == note); CU_ASSERT(remove_note->audio_channel == 0); CU_ASSERT(remove_note->use_selection_list == FALSE); /* test */ ags_task_launch(remove_note); CU_ASSERT(audio->notation != NULL); CU_ASSERT(AGS_NOTATION(audio->notation->data)->note == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* remove a suite to the registry */ pSuite = CU_add_suite("AgsRemoveNoteTest", ags_remove_note_test_init_suite, ags_remove_note_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* remove the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRemoveNote launch", ags_remove_note_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_cancel_channel_test.c0000644000175000017500000000531513605312646021360 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_cancel_channel_test_init_suite(); int ags_cancel_channel_test_clean_suite(); void ags_cancel_channel_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_cancel_channel_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_cancel_channel_test_clean_suite() { return(0); } void ags_cancel_channel_test_launch() { AgsChannel *channel; AgsCancelChannel *cancel_channel; channel = ags_channel_new(NULL); cancel_channel = ags_cancel_channel_new(channel, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(AGS_IS_CANCEL_CHANNEL(cancel_channel)); CU_ASSERT(cancel_channel->channel == channel); CU_ASSERT(cancel_channel->sound_scope == AGS_SOUND_SCOPE_SEQUENCER); //TODO:JK: improve me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCancelChannelTest", ags_cancel_channel_test_init_suite, ags_cancel_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCancelChannel launch", ags_cancel_channel_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_add_audio_signal_test.c0000644000175000017500000000767613605312646021725 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_add_audio_signal_test_init_suite(); int ags_add_audio_signal_test_clean_suite(); void ags_add_audio_signal_test_launch_add_audio_signal_callback(); void ags_add_audio_signal_test_launch(); gboolean ags_add_audio_signal_test_launch_add_audio_signal_invoked = FALSE; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_audio_signal_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_add_audio_signal_test_clean_suite() { return(0); } void ags_add_audio_signal_test_launch_add_audio_signal_callback() { ags_add_audio_signal_test_launch_add_audio_signal_invoked = TRUE; } void ags_add_audio_signal_test_launch() { AgsDevout *devout; AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsAddAudioSignal *add_audio_signal; /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create recycling */ recycling = ags_recycling_new(NULL); g_object_ref(recycling); /* create recall id */ recall_id = ags_recall_id_new(); g_object_ref(recall_id); /* create audio signal */ audio_signal = ags_audio_signal_new(devout, recycling, recall_id); /* create add audio signal */ add_audio_signal = ags_add_audio_signal_new(recycling, audio_signal, devout, recall_id, 0); CU_ASSERT(AGS_IS_ADD_AUDIO_SIGNAL(add_audio_signal)); CU_ASSERT(add_audio_signal->recycling == recycling); CU_ASSERT(add_audio_signal->audio_signal == audio_signal); CU_ASSERT(add_audio_signal->soundcard == devout); CU_ASSERT(add_audio_signal->recall_id == recall_id); /* launch */ g_signal_connect(recycling, "add-audio-signal", G_CALLBACK(ags_add_audio_signal_test_launch_add_audio_signal_callback), NULL); ags_task_launch(add_audio_signal); CU_ASSERT(ags_add_audio_signal_test_launch_add_audio_signal_invoked == TRUE); CU_ASSERT(g_list_find(recycling->audio_signal, audio_signal) != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAddAudioSignalTest", ags_add_audio_signal_test_init_suite, ags_add_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAddAudioSignal launch", ags_add_audio_signal_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_remove_soundcard_test.c0000644000175000017500000000631213607210263021772 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_remove_soundcard_test_init_suite(); int ags_remove_soundcard_test_clean_suite(); void ags_remove_soundcard_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_soundcard_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_soundcard_test_clean_suite() { return(0); } void ags_remove_soundcard_test_launch() { AgsDevout *devout; AgsRemoveSoundcard *remove_soundcard; AgsApplicationContext *application_context; GList *list; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); g_object_ref(devout); list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); g_object_ref(devout); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(list, devout)); remove_soundcard = ags_remove_soundcard_new(devout); CU_ASSERT(AGS_IS_REMOVE_SOUNDCARD(remove_soundcard)); CU_ASSERT(remove_soundcard->soundcard == devout); /* test */ ags_task_launch(remove_soundcard); list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); CU_ASSERT(list == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* remove a suite to the registry */ pSuite = CU_add_suite("AgsRemoveSoundcardTest", ags_remove_soundcard_test_init_suite, ags_remove_soundcard_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* remove the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRemoveSoundcard launch", ags_remove_soundcard_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_apply_bpm_test.c0000644000175000017500000002012013605312646020415 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_apply_bpm_test_init_suite(); int ags_apply_bpm_test_clean_suite(); void ags_apply_bpm_test_launch_scope_recall(); void ags_apply_bpm_test_launch_scope_channel(); void ags_apply_bpm_test_launch_scope_audio(); void ags_apply_bpm_test_launch_scope_soundcard(); void ags_apply_bpm_test_launch_scope_sequencer(); void ags_apply_bpm_test_launch_scope_application_context(); #define AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_RECALL_BPM (145.0) #define AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_CHANNEL_BPM (145.0) #define AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_AUDIO_BPM (145.0) #define AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SOUNDCARD_BPM (145.0) #define AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SEQUENCER_BPM (145.0) #define AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_BPM (145.0) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_bpm_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_bpm_test_clean_suite() { return(0); } void ags_apply_bpm_test_launch_scope_recall() { AgsDevout *devout; AgsAudio *audio; AgsDelayAudio *delay_audio; AgsApplyBpm *apply_bpm; devout = ags_devout_new(NULL); g_object_ref(devout); audio = ags_audio_new(devout); g_object_ref(audio); delay_audio = ags_delay_audio_new(audio); g_object_set(delay_audio, "output-soundcard", devout, NULL); apply_bpm = ags_apply_bpm_new(delay_audio, AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_RECALL_BPM); CU_ASSERT(AGS_IS_APPLY_BPM(apply_bpm)); CU_ASSERT(apply_bpm->scope == delay_audio); CU_ASSERT(apply_bpm->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_RECALL_BPM); /* test */ ags_task_launch(apply_bpm); CU_ASSERT(ags_tactable_get_bpm(AGS_TACTABLE(delay_audio)) == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_RECALL_BPM); } void ags_apply_bpm_test_launch_scope_channel() { AgsChannel *channel; AgsApplyBpm *apply_bpm; channel = ags_channel_new(NULL); g_object_ref(channel); apply_bpm = ags_apply_bpm_new(channel, AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_CHANNEL_BPM); CU_ASSERT(AGS_IS_APPLY_BPM(apply_bpm)); CU_ASSERT(apply_bpm->scope == channel); CU_ASSERT(apply_bpm->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_CHANNEL_BPM); /* test */ ags_task_launch(apply_bpm); } void ags_apply_bpm_test_launch_scope_audio() { AgsDevout *devout; AgsAudio *audio; AgsDelayAudio *delay_audio; AgsApplyBpm *apply_bpm; devout = ags_devout_new(NULL); g_object_ref(devout); audio = ags_audio_new(NULL); g_object_ref(audio); delay_audio = ags_delay_audio_new(audio); g_object_set(delay_audio, "output-soundcard", devout, NULL); ags_audio_add_recall(audio, delay_audio, FALSE); apply_bpm = ags_apply_bpm_new(audio, AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_AUDIO_BPM); CU_ASSERT(AGS_IS_APPLY_BPM(apply_bpm)); CU_ASSERT(apply_bpm->scope == audio); CU_ASSERT(apply_bpm->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_AUDIO_BPM); /* test */ ags_task_launch(apply_bpm); CU_ASSERT(audio->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_AUDIO_BPM); CU_ASSERT(ags_tactable_get_bpm(AGS_TACTABLE(delay_audio)) == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_AUDIO_BPM); } void ags_apply_bpm_test_launch_scope_soundcard() { AgsDevout *devout; AgsApplyBpm *apply_bpm; devout = ags_devout_new(NULL); g_object_ref(devout); apply_bpm = ags_apply_bpm_new(devout, AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SOUNDCARD_BPM); CU_ASSERT(AGS_IS_APPLY_BPM(apply_bpm)); CU_ASSERT(apply_bpm->scope == devout); CU_ASSERT(apply_bpm->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SOUNDCARD_BPM); /* test */ ags_task_launch(apply_bpm); CU_ASSERT(ags_soundcard_get_bpm(AGS_SOUNDCARD(devout)) == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SOUNDCARD_BPM); } void ags_apply_bpm_test_launch_scope_sequencer() { AgsMidiin *midiin; AgsApplyBpm *apply_bpm; midiin = ags_midiin_new(NULL); g_object_ref(midiin); apply_bpm = ags_apply_bpm_new(midiin, AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SEQUENCER_BPM); CU_ASSERT(AGS_IS_APPLY_BPM(apply_bpm)); CU_ASSERT(apply_bpm->scope == midiin); CU_ASSERT(apply_bpm->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SEQUENCER_BPM); /* test */ ags_task_launch(apply_bpm); CU_ASSERT(ags_sequencer_get_bpm(AGS_SEQUENCER(midiin)) == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_SEQUENCER_BPM); } void ags_apply_bpm_test_launch_scope_application_context() { AgsDevout *devout; AgsMidiin *midiin; AgsAudio *audio; AgsApplyBpm *apply_bpm; AgsApplicationContext *application_context; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); midiin = ags_midiin_new(application_context); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, midiin)); g_object_ref(midiin); audio = ags_audio_new(devout); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); apply_bpm = ags_apply_bpm_new(application_context, AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_BPM); /* test */ ags_task_launch(apply_bpm); CU_ASSERT(ags_soundcard_get_bpm(AGS_SOUNDCARD(devout)) == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_BPM); CU_ASSERT(ags_sequencer_get_bpm(AGS_SEQUENCER(midiin)) == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_BPM); CU_ASSERT(audio->bpm == AGS_APPLY_BPM_TEST_LAUNCH_SCOPE_APPLICATION_CONTEXT_BPM); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsApplyBpmTest", ags_apply_bpm_test_init_suite, ags_apply_bpm_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsApplyBpm launch scope recall", ags_apply_bpm_test_launch_scope_recall) == NULL) || (CU_add_test(pSuite, "test of AgsApplyBpm launch scope channel", ags_apply_bpm_test_launch_scope_channel) == NULL) || (CU_add_test(pSuite, "test of AgsApplyBpm launch scope audio", ags_apply_bpm_test_launch_scope_audio) == NULL) || (CU_add_test(pSuite, "test of AgsApplyBpm launch scope soundcard", ags_apply_bpm_test_launch_scope_soundcard) == NULL) || (CU_add_test(pSuite, "test of AgsApplyBpm launch scope sequencer", ags_apply_bpm_test_launch_scope_sequencer) == NULL) || (CU_add_test(pSuite, "test of AgsApplyBpm launch scope application context", ags_apply_bpm_test_launch_scope_application_context) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_cancel_audio_test.c0000644000175000017500000000523413605312646021051 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_cancel_audio_test_init_suite(); int ags_cancel_audio_test_clean_suite(); void ags_cancel_audio_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_cancel_audio_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_cancel_audio_test_clean_suite() { return(0); } void ags_cancel_audio_test_launch() { AgsAudio *audio; AgsCancelAudio *cancel_audio; audio = ags_audio_new(NULL); cancel_audio = ags_cancel_audio_new(audio, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(AGS_IS_CANCEL_AUDIO(cancel_audio)); CU_ASSERT(cancel_audio->audio == audio); CU_ASSERT(cancel_audio->sound_scope == AGS_SOUND_SCOPE_SEQUENCER); //TODO:JK: improve me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCancelAudioTest", ags_cancel_audio_test_init_suite, ags_cancel_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCancelAudio launch", ags_cancel_audio_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_resize_audio_test.c0000644000175000017500000000555713605312646021135 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_resize_audio_test_init_suite(); int ags_resize_audio_test_clean_suite(); void ags_resize_audio_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_resize_audio_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_resize_audio_test_clean_suite() { return(0); } void ags_resize_audio_test_launch() { AgsAudio *audio; AgsResizeAudio *resize_audio; audio = ags_audio_new(NULL); resize_audio = ags_resize_audio_new(audio, 1, 8, 2); CU_ASSERT(AGS_IS_RESIZE_AUDIO(resize_audio)); CU_ASSERT(resize_audio->audio == audio); CU_ASSERT(resize_audio->output_pads == 1); CU_ASSERT(resize_audio->input_pads == 8); CU_ASSERT(resize_audio->audio_channels == 2); /* launch */ ags_task_launch(resize_audio); CU_ASSERT(audio->output_pads == 1); CU_ASSERT(audio->input_pads == 8); CU_ASSERT(audio->audio_channels == 2); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsResizeAudioTest", ags_resize_audio_test_init_suite, ags_resize_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsResizeAudio launch", ags_resize_audio_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_export_output_test.c0000644000175000017500000000615713605312646021411 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_export_output_test_init_suite(); int ags_export_output_test_clean_suite(); void ags_export_output_test_launch(); #define AGS_EXPORT_OUTPUT_TEST_LAUNCH_FILENAME "out.wav" #define AGS_EXPORT_OUTPUT_TEST_LAUNCH_TIC (256) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_export_output_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_export_output_test_clean_suite() { return(0); } void ags_export_output_test_launch() { AgsDevout *devout; AgsExportThread *export_thread; AgsExportOutput *export_output; devout = ags_devout_new(NULL); export_thread = ags_export_thread_new(devout, NULL); export_output = ags_export_output_new(export_thread, devout, AGS_EXPORT_OUTPUT_TEST_LAUNCH_FILENAME, AGS_EXPORT_OUTPUT_TEST_LAUNCH_TIC, TRUE); CU_ASSERT(AGS_IS_EXPORT_OUTPUT(export_output)); CU_ASSERT(export_output->soundcard == devout); CU_ASSERT(!g_strcmp0(export_output->filename, AGS_EXPORT_OUTPUT_TEST_LAUNCH_FILENAME)); CU_ASSERT(export_output->tic == AGS_EXPORT_OUTPUT_TEST_LAUNCH_TIC); CU_ASSERT(export_output->live_performance == TRUE); //TODO:JK: improve me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsExportOutputTest", ags_export_output_test_init_suite, ags_export_output_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsExportOutput launch", ags_export_output_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_link_channel_test.c0000644000175000017500000000773413605312646021077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_link_channel_test_init_suite(); int ags_link_channel_test_clean_suite(); void ags_link_channel_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_link_channel_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_link_channel_test_clean_suite() { return(0); } void ags_link_channel_test_launch() { AgsAudio *master_audio, *slave_audio; AgsLinkChannel *link_channel; guint i; /* master audio */ master_audio = ags_audio_new(NULL); g_object_ref(master_audio); ags_audio_set_flags(master_audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); /* create input/output */ ags_audio_set_audio_channels(master_audio, 1, 0); ags_audio_set_pads(master_audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(master_audio, AGS_TYPE_INPUT, 1, 0); ags_connectable_connect(AGS_CONNECTABLE(master_audio)); g_object_set(master_audio->input, "file-link", ags_audio_file_link_new(), NULL); /* slave audio */ slave_audio = ags_audio_new(NULL); g_object_ref(slave_audio); ags_audio_set_flags(slave_audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); /* create input/output */ ags_audio_set_audio_channels(slave_audio, 1, 0); ags_audio_set_pads(slave_audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(slave_audio, AGS_TYPE_INPUT, 1, 0); ags_connectable_connect(AGS_CONNECTABLE(slave_audio)); link_channel = ags_link_channel_new(master_audio->input, slave_audio->output); CU_ASSERT(AGS_IS_LINK_CHANNEL(link_channel)); CU_ASSERT(link_channel->channel == master_audio->input); CU_ASSERT(link_channel->link == slave_audio->output); /* launch */ ags_task_launch(link_channel); CU_ASSERT(AGS_INPUT(master_audio->input)->file_link == NULL); CU_ASSERT(master_audio->input->link == slave_audio->output); CU_ASSERT(slave_audio->output->link == master_audio->input); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLinkChannelTest", ags_link_channel_test_init_suite, ags_link_channel_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLinkChannel launch", ags_link_channel_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_apply_presets_test.c0000644000175000017500000003410713605312646021336 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_apply_presets_test_init_suite(); int ags_apply_presets_test_clean_suite(); void ags_apply_presets_test_launch_scope_soundcard(); void ags_apply_presets_test_launch_scope_audio(); void ags_apply_presets_test_launch_scope_channel(); void ags_apply_presets_test_launch_scope_audio_signal(); #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_PCM_CHANNELS (6) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_SAMPLERATE (44100) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_BUFFER_SIZE (512) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_FORMAT (AGS_SOUNDCARD_SIGNED_24_BIT) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_PCM_CHANNELS (6) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SAMPLERATE (44100) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_BUFFER_SIZE (512) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_FORMAT (AGS_SOUNDCARD_SIGNED_24_BIT) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_PCM_CHANNELS (6) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_SAMPLERATE (44100) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_BUFFER_SIZE (512) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_FORMAT (AGS_SOUNDCARD_SIGNED_24_BIT) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_PCM_CHANNELS (6) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_SAMPLERATE (44100) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_BUFFER_SIZE (512) #define AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_FORMAT (AGS_SOUNDCARD_SIGNED_24_BIT) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_presets_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_presets_test_clean_suite() { return(0); } void ags_apply_presets_test_launch_scope_soundcard() { AgsDevout *devout; AgsAudio *audio; AgsApplyPresets *apply_presets; AgsApplicationContext *application_context; guint pcm_channels; guint samplerate; guint buffer_size; guint format; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); apply_presets = ags_apply_presets_new(devout, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_PCM_CHANNELS, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_SAMPLERATE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_BUFFER_SIZE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_FORMAT); CU_ASSERT(AGS_IS_APPLY_PRESETS(apply_presets)); CU_ASSERT(apply_presets->pcm_channels == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_PCM_CHANNELS); CU_ASSERT(apply_presets->samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_SAMPLERATE); CU_ASSERT(apply_presets->buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_BUFFER_SIZE); CU_ASSERT(apply_presets->format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_FORMAT); /* test */ ags_task_launch(apply_presets); ags_soundcard_get_presets(AGS_SOUNDCARD(devout), &pcm_channels, &samplerate, &buffer_size, &format); CU_ASSERT(pcm_channels == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_PCM_CHANNELS); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_FORMAT); g_object_get(audio, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_SOUNDCARD_FORMAT); } void ags_apply_presets_test_launch_scope_audio() { AgsDevout *devout; AgsAudio *audio; AgsChannel *channel; AgsApplyPresets *apply_presets; AgsApplicationContext *application_context; guint pcm_channels; guint samplerate; guint buffer_size; guint format; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); apply_presets = ags_apply_presets_new(audio, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_PCM_CHANNELS, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SAMPLERATE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_BUFFER_SIZE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_FORMAT); CU_ASSERT(AGS_IS_APPLY_PRESETS(apply_presets)); CU_ASSERT(apply_presets->pcm_channels == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_PCM_CHANNELS); CU_ASSERT(apply_presets->samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SAMPLERATE); CU_ASSERT(apply_presets->buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_BUFFER_SIZE); CU_ASSERT(apply_presets->format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_FORMAT); /* test */ ags_task_launch(apply_presets); g_object_get(audio, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_FORMAT); g_object_get(audio->output, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_FORMAT); g_object_get(audio->input, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_FORMAT); } void ags_apply_presets_test_launch_scope_channel() { AgsDevout *devout; AgsAudio *audio; AgsChannel *channel; AgsAudioSignal *audio_signal; AgsApplyPresets *apply_presets; AgsApplicationContext *application_context; guint pcm_channels; guint samplerate; guint buffer_size; guint format; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); audio_signal = ags_audio_signal_new(devout, audio->input->first_recycling, NULL); ags_recycling_add_audio_signal(audio->input->first_recycling, audio_signal); apply_presets = ags_apply_presets_new(audio->input, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_PCM_CHANNELS, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_SAMPLERATE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_BUFFER_SIZE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_FORMAT); CU_ASSERT(AGS_IS_APPLY_PRESETS(apply_presets)); CU_ASSERT(apply_presets->pcm_channels == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_PCM_CHANNELS); CU_ASSERT(apply_presets->samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_SAMPLERATE); CU_ASSERT(apply_presets->buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_BUFFER_SIZE); CU_ASSERT(apply_presets->format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_FORMAT); /* test */ ags_task_launch(apply_presets); g_object_get(audio->input, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_CHANNEL_FORMAT); //TODO:JK: implement resample audio data } void ags_apply_presets_test_launch_scope_audio_signal() { AgsDevout *devout; AgsAudio *audio; AgsChannel *channel; AgsAudioSignal *audio_signal; AgsApplyPresets *apply_presets; AgsApplicationContext *application_context; guint pcm_channels; guint samplerate; guint buffer_size; guint format; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); audio_signal = ags_audio_signal_new(devout, audio->input->first_recycling, NULL); ags_recycling_add_audio_signal(audio->input->first_recycling, audio_signal); apply_presets = ags_apply_presets_new(audio_signal, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_PCM_CHANNELS, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_SAMPLERATE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_BUFFER_SIZE, AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_FORMAT); CU_ASSERT(AGS_IS_APPLY_PRESETS(apply_presets)); CU_ASSERT(apply_presets->pcm_channels == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_PCM_CHANNELS); CU_ASSERT(apply_presets->samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_SAMPLERATE); CU_ASSERT(apply_presets->buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_BUFFER_SIZE); CU_ASSERT(apply_presets->format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_FORMAT); /* test */ ags_task_launch(apply_presets); g_object_get(audio_signal, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); CU_ASSERT(samplerate == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_SAMPLERATE); CU_ASSERT(buffer_size == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_BUFFER_SIZE); CU_ASSERT(format == AGS_APPLY_PRESETS_TEST_LAUNCH_SCOPE_AUDIO_SIGNAL_FORMAT); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsApplyPresetsTest", ags_apply_presets_test_init_suite, ags_apply_presets_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsApplyPresets launch scope soundcard", ags_apply_presets_test_launch_scope_soundcard) == NULL) || (CU_add_test(pSuite, "test of AgsApplyPresets launch scope audio", ags_apply_presets_test_launch_scope_audio) == NULL) || (CU_add_test(pSuite, "test of AgsApplyPresets launch scope channel", ags_apply_presets_test_launch_scope_channel) == NULL) || (CU_add_test(pSuite, "test of AgsApplyPresets launch scope audio signal", ags_apply_presets_test_launch_scope_audio_signal) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_set_samplerate_test.c0000644000175000017500000000702713614062654021456 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_set_samplerate_test_init_suite(); int ags_set_samplerate_test_clean_suite(); void ags_set_samplerate_test_launch(); AgsConfig *config; AgsApplicationContext *application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_samplerate_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_set_samplerate_test_clean_suite() { return(0); } void ags_set_samplerate_test_launch() { AgsDevout *devout; AgsSetSamplerate *set_samplerate; guint samplerate; devout = ags_devout_new(NULL); ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(application_context), devout); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_prepend(NULL, devout)); set_samplerate = ags_set_samplerate_new(devout, 48000); CU_ASSERT(AGS_IS_SET_SAMPLERATE(set_samplerate)); CU_ASSERT(set_samplerate->scope == devout); CU_ASSERT(set_samplerate->samplerate == 48000); /* launch */ ags_task_launch(set_samplerate); ags_soundcard_get_presets(AGS_SOUNDCARD(devout), NULL, &samplerate, NULL, NULL); CU_ASSERT(samplerate == 48000); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSetSamplerateTest", ags_set_samplerate_test_init_suite, ags_set_samplerate_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSetSamplerate launch", ags_set_samplerate_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_remove_audio_test.c0000644000175000017500000000644613607210263021121 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_remove_audio_test_init_suite(); int ags_remove_audio_test_clean_suite(); void ags_remove_audio_test_launch(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_audio_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_remove_audio_test_clean_suite() { return(0); } void ags_remove_audio_test_launch() { AgsDevout *devout; AgsAudio *audio; AgsRemoveAudio *remove_audio; AgsApplicationContext *application_context; GList *list; application_context = ags_audio_application_context_new(); g_object_ref(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); list = g_list_append(list, audio); g_object_ref(audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), list); /* create remove audio */ remove_audio = ags_remove_audio_new(audio); CU_ASSERT(AGS_IS_REMOVE_AUDIO(remove_audio)); CU_ASSERT(remove_audio->audio == audio); /* launch */ ags_task_launch(remove_audio); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); CU_ASSERT(g_list_find(list, audio) == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* remove a suite to the registry */ pSuite = CU_add_suite("AgsRemoveAudioTest", ags_remove_audio_test_init_suite, ags_remove_audio_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* remove the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRemoveAudio launch", ags_remove_audio_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_apply_synth_test.c0000644000175000017500000000746213605312646021022 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_apply_synth_test_init_suite(); int ags_apply_synth_test_clean_suite(); void ags_apply_synth_test_launch(); #define AGS_APPLY_SYNTH_TEST_BASE_NOTE (0.0) #define AGS_APPLY_SYNTH_TEST_INPUT_PADS (88) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_synth_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_synth_test_clean_suite() { return(0); } void ags_apply_synth_test_launch() { AgsDevout *devout; AgsAudio *audio; AgsSynthGenerator *synth_generator; AgsApplySynth *apply_synth; AgsApplicationContext *application_context; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, AGS_APPLY_SYNTH_TEST_INPUT_PADS, 0); synth_generator = ags_synth_generator_new(); apply_synth = ags_apply_synth_new(synth_generator, audio->input, AGS_APPLY_SYNTH_TEST_BASE_NOTE, AGS_APPLY_SYNTH_TEST_INPUT_PADS); CU_ASSERT(AGS_IS_APPLY_SYNTH(apply_synth)); CU_ASSERT(apply_synth->synth_generator == synth_generator); CU_ASSERT(apply_synth->start_channel == audio->input); CU_ASSERT(apply_synth->count == AGS_APPLY_SYNTH_TEST_INPUT_PADS); /* test */ ags_task_launch(apply_synth); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsApplySynthTest", ags_apply_synth_test_init_suite, ags_apply_synth_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsApplySynth launch", ags_apply_synth_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_apply_sequencer_length_test.c0000644000175000017500000002005413605312646023200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_apply_sequencer_length_test_init_suite(); int ags_apply_sequencer_length_test_clean_suite(); void ags_apply_sequencer_length_test_launch_scope_audio(); void ags_apply_sequencer_length_test_launch_scope_channel(); void ags_apply_sequencer_length_test_launch_scope_recall(); #define AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH (64) #define AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_CHANNEL_LENGTH (64) #define AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_RECALL_LENGTH (64) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_sequencer_length_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_apply_sequencer_length_test_clean_suite() { return(0); } void ags_apply_sequencer_length_test_launch_scope_audio() { AgsDevout *devout; AgsAudio *audio; AgsChannel *channel; AgsPort *port; AgsCountBeatsAudio *count_beats_audio; AgsApplySequencerLength *apply_sequencer_length; AgsApplicationContext *application_context; GValue value = {0,}; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); count_beats_audio = ags_count_beats_audio_new(audio); ags_audio_add_recall(audio, count_beats_audio, FALSE); apply_sequencer_length = ags_apply_sequencer_length_new(audio, AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); CU_ASSERT(AGS_IS_APPLY_SEQUENCER_LENGTH(apply_sequencer_length)); CU_ASSERT(apply_sequencer_length->scope == audio); CU_ASSERT(apply_sequencer_length->length == AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); /* test */ ags_task_launch(apply_sequencer_length); g_object_get(count_beats_audio, "sequencer-loop-end", &port, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(port, &value); CU_ASSERT(g_value_get_uint64(&value) == AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); } void ags_apply_sequencer_length_test_launch_scope_channel() { AgsDevout *devout; AgsAudio *audio; AgsChannel *channel; AgsApplySequencerLength *apply_sequencer_length; AgsApplicationContext *application_context; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); apply_sequencer_length = ags_apply_sequencer_length_new(audio->input, AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); CU_ASSERT(AGS_IS_APPLY_SEQUENCER_LENGTH(apply_sequencer_length)); CU_ASSERT(apply_sequencer_length->scope == audio->input); CU_ASSERT(apply_sequencer_length->length == AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); /* test */ ags_task_launch(apply_sequencer_length); } void ags_apply_sequencer_length_test_launch_scope_recall() { AgsDevout *devout; AgsAudio *audio; AgsChannel *channel; AgsPort *port; AgsCountBeatsAudio *count_beats_audio; AgsApplySequencerLength *apply_sequencer_length; AgsApplicationContext *application_context; GValue value = {0,}; application_context = ags_audio_application_context_new(); g_object_ref(application_context); devout = ags_devout_new(application_context); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, devout)); g_object_ref(devout); audio = ags_audio_new(devout); ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_append(NULL, audio)); g_object_ref(audio); ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); count_beats_audio = ags_count_beats_audio_new(audio); ags_audio_add_recall(audio, count_beats_audio, FALSE); apply_sequencer_length = ags_apply_sequencer_length_new(count_beats_audio, AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); CU_ASSERT(AGS_IS_APPLY_SEQUENCER_LENGTH(apply_sequencer_length)); CU_ASSERT(apply_sequencer_length->scope == count_beats_audio); CU_ASSERT(apply_sequencer_length->length == AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); /* test */ ags_task_launch(apply_sequencer_length); g_object_get(count_beats_audio, "sequencer-loop-end", &port, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(port, &value); CU_ASSERT(g_value_get_uint64(&value) == AGS_APPLY_SEQUENCER_LENGTH_TEST_LAUNCH_SCOPE_AUDIO_LENGTH); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsApplySequencerLengthTest", ags_apply_sequencer_length_test_init_suite, ags_apply_sequencer_length_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsApplySequencerLength launch scope audio", ags_apply_sequencer_length_test_launch_scope_audio) == NULL) || (CU_add_test(pSuite, "test of AgsApplySequencerLength launch scope channel", ags_apply_sequencer_length_test_launch_scope_channel) == NULL) || (CU_add_test(pSuite, "test of AgsApplySequencerLength launch scope recall", ags_apply_sequencer_length_test_launch_scope_recall) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/task/ags_reset_peak_test.c0000644000175000017500000001130313614062654020560 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_reset_peak_test_init_suite(); int ags_reset_peak_test_clean_suite(); void ags_reset_peak_test_launch(); AgsDevout *devout; AgsAudio *audio; AgsApplicationContext *application_context; GList *recall; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_reset_peak_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); /* create soundcard */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); /* create audio */ audio = ags_audio_new(devout); g_object_ref(audio); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, AGS_SOUND_ABILITY_PLAYBACK); /* create input/output */ ags_audio_set_audio_channels(audio, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1, 0); ags_channel_set_ability_flags(audio->output, AGS_SOUND_ABILITY_PLAYBACK); ags_channel_set_ability_flags(audio->input, AGS_SOUND_ABILITY_PLAYBACK); ags_connectable_connect(AGS_CONNECTABLE(audio)); ags_connectable_connect(AGS_CONNECTABLE(audio->output)); ags_connectable_connect(AGS_CONNECTABLE(audio->input)); /* create ags-peak */ recall = ags_recall_factory_create(audio, NULL, NULL, "ags-peak", 0, 1, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_reset_peak_test_clean_suite() { g_object_run_dispose(devout); g_object_unref(devout); g_object_run_dispose(audio); g_object_unref(audio); return(0); } void ags_reset_peak_test_launch() { AgsResetPeak *reset_peak; GList *list; GValue value = {0,}; reset_peak = ags_reset_peak_get_instance(); CU_ASSERT(AGS_IS_RESET_PEAK(reset_peak)); list = ags_recall_find_type(audio->input->recall, AGS_TYPE_PEAK_CHANNEL); ags_reset_peak_add(reset_peak, list->data); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(AGS_PEAK_CHANNEL(list->data)->buffer_computed, &value); /* test */ ags_task_launch(reset_peak); ags_port_safe_read(AGS_PEAK_CHANNEL(list->data)->buffer_computed, &value); CU_ASSERT(g_value_get_boolean(&value) == FALSE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsResetPeakTest", ags_reset_peak_test_init_suite, ags_reset_peak_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsResetPeak launch", ags_reset_peak_test_launch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/midi/0000755000175000017500000000000013622252262014436 500000000000000gsequencer-3.1.3/ags/test/audio/midi/ags_midi_buffer_util_test.c0000644000175000017500000023564013605312646021741 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_midi_buffer_util_test_init_suite(); int ags_midi_buffer_util_test_clean_suite(); void ags_midi_buffer_util_test_get_varlength_size(); void ags_midi_buffer_util_test_put_varlength(); void ags_midi_buffer_util_test_get_varlength(); void ags_midi_buffer_util_test_put_int16(); void ags_midi_buffer_util_test_get_int16(); void ags_midi_buffer_util_test_put_int24(); void ags_midi_buffer_util_test_get_int24(); void ags_midi_buffer_util_test_put_int32(); void ags_midi_buffer_util_test_get_int32(); void ags_midi_buffer_util_test_put_header(); void ags_midi_buffer_util_test_get_header(); void ags_midi_buffer_util_test_put_track(); void ags_midi_buffer_util_test_get_track(); void ags_midi_buffer_util_test_put_key_on(); void ags_midi_buffer_util_test_get_key_on(); void ags_midi_buffer_util_test_put_key_off(); void ags_midi_buffer_util_test_get_key_off(); void ags_midi_buffer_util_test_put_key_pressure(); void ags_midi_buffer_util_test_get_key_pressure(); void ags_midi_buffer_util_test_put_change_parameter(); void ags_midi_buffer_util_test_get_change_parameter(); void ags_midi_buffer_util_test_put_pitch_bend(); void ags_midi_buffer_util_test_get_pitch_bend(); void ags_midi_buffer_util_test_put_change_program(); void ags_midi_buffer_util_test_get_change_program(); void ags_midi_buffer_util_test_put_change_pressure(); void ags_midi_buffer_util_test_get_change_pressure(); void ags_midi_buffer_util_test_put_sysex(); void ags_midi_buffer_util_test_get_sysex(); void ags_midi_buffer_util_test_put_quarter_frame(); void ags_midi_buffer_util_test_get_quarter_frame(); void ags_midi_buffer_util_test_put_song_position(); void ags_midi_buffer_util_test_get_song_position(); void ags_midi_buffer_util_test_put_song_select(); void ags_midi_buffer_util_test_get_song_select(); void ags_midi_buffer_util_test_put_tune_request(); void ags_midi_buffer_util_test_get_tune_request(); void ags_midi_buffer_util_test_put_sequence_number(); void ags_midi_buffer_util_test_get_sequence_number(); void ags_midi_buffer_util_test_put_smtpe(); void ags_midi_buffer_util_test_get_smtpe(); void ags_midi_buffer_util_test_put_tempo(); void ags_midi_buffer_util_test_get_tempo(); void ags_midi_buffer_util_test_put_time_signature(); void ags_midi_buffer_util_test_get_time_signature(); void ags_midi_buffer_util_test_put_key_signature(); void ags_midi_buffer_util_test_get_key_signature(); void ags_midi_buffer_util_test_put_sequencer_meta_event(); void ags_midi_buffer_util_test_get_sequencer_meta_event(); void ags_midi_buffer_util_test_put_text_event(); void ags_midi_buffer_util_test_get_text_event(); void ags_midi_buffer_util_test_put_end_of_track(); void ags_midi_buffer_util_test_get_end_of_track(); void ags_midi_buffer_util_test_put_seek_message(); void ags_midi_buffer_util_test_decode(); static const glong varlength[12][3] = { {0x0, 0, 1}, {0x1, 1, 1}, {0x7f, 128 - 1, 1}, {0x8100, 128, 2}, {0x8101, 128 + 1, 2}, {0xff7f, 128 * 128 - 1, 2}, {0x818000, 128 * 128, 3}, {0x818001, 128 * 128 + 1, 3}, {0xffff7f, 128 * 128 * 128 - 1, 3}, {0x81808000, 128 * 128 * 128, 4}, {0x81808001, 128 * 128 * 128 + 1, 4}, {0xffffff7f, 128 * 128 * 128 * 128 - 1, 4}, }; static const unsigned char *varlength_buffer[] = { "\x00", "\x01", "\x7f", "\x81\x00", "\x81\x01", "\xff\x7f", "\x81\x80\x00", "\x81\x80\x01", "\xff\xff\x7f", "\x81\x80\x80\x00", "\x81\x80\x80\x01", "\xff\xff\xff\x7f", }; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midi_buffer_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midi_buffer_util_test_clean_suite() { return(0); } void ags_midi_buffer_util_test_get_varlength_size() { guint i; gboolean success; /* */ success = TRUE; for(i = 0; i < 12; i++){ if(ags_midi_buffer_util_get_varlength_size(varlength[i][1]) != varlength[i][2]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_varlength() { unsigned char *buffer; guint mask; guint i, j; gboolean success; /* */ buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 12 && success; i++){ ags_midi_buffer_util_put_varlength(buffer, varlength[i][1]); mask = 0xff; for(j = 0; j < varlength[i][2]; j++){ if(buffer[j] != ((mask << (8 * (varlength[i][2] - j - 1))) & varlength[i][0]) >> (8 * (varlength[i][2] - j - 1))){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_varlength() { unsigned char **iter; glong val; guint n_read; guint i; gboolean success; iter = varlength_buffer; success = TRUE; for(i = 0; i < 12; i++){ n_read = ags_midi_buffer_util_get_varlength(*iter, &val); if(n_read != varlength[i][2] || val != varlength[i][1]){ success = FALSE; break; } iter++; } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_int16() { unsigned char *buffer; guint i, j; gboolean success; static const glong val[] = { 0, 1, 255, 256, 65535, }; static const unsigned char *val_buffer[] = { "\x00\x00", "\x00\x01", "\x00\xff", "\x01\x00", "\xff\xff", }; buffer = (unsigned char *) malloc(2 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 5 && success; i++){ ags_midi_buffer_util_put_int16(buffer, val[i]); for(j = 0; j < 2; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_int16() { glong current; guint i; gboolean success; static const glong val[] = { 0, 1, 255, 256, 65535, }; static const gchar *val_buffer[] = { "\x00\x00", "\x00\x01", "\x00\xff", "\x01\x00", "\xff\xff", }; success = TRUE; for(i = 0; i < 5 && success; i++){ ags_midi_buffer_util_get_int16(val_buffer[i], ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_int24() { unsigned char *buffer; guint i, j; gboolean success; static const glong val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00", "\x00\x00\x01", "\x00\x00\xff", "\x00\x01\x00", "\x00\xff\xff", "\x01\x00\x00", "\xff\xff\xff", }; buffer = (unsigned char *) malloc(3 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 7 && success; i++){ ags_midi_buffer_util_put_int24(buffer, val[i]); for(j = 0; j < 3; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_int24() { glong current; guint i; gboolean success; static const glong val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00", "\x00\x00\x01", "\x00\x00\xff", "\x00\x01\x00", "\x00\xff\xff", "\x01\x00\x00", "\xff\xff\xff", }; success = TRUE; for(i = 0; i < 7 && success; i++){ ags_midi_buffer_util_get_int24(val_buffer[i], ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_int32() { unsigned char *buffer; guint i, j; gboolean success; static const glong val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00", "\x00\x00\x00\x01", "\x00\x00\x00\xff", "\x00\x00\x01\x00", "\x00\x00\xff\xff", "\x00\x01\x00\x00", "\x00\xff\xff\xff", "\x01\x00\x00\x00", "\xff\xff\xff\xff", }; buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 9 && success; i++){ ags_midi_buffer_util_put_int32(buffer, val[i]); for(j = 0; j < 4; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_int32() { glong current; guint i; gboolean success; static const glong val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00", "\x00\x00\x00\x01", "\x00\x00\x00\xff", "\x00\x00\x01\x00", "\x00\x00\xff\xff", "\x00\x01\x00\x00", "\x00\xff\xff\xff", "\x01\x00\x00\x00", "\xff\xff\xff\xff", }; success = TRUE; for(i = 0; i < 9 && success; i++){ ags_midi_buffer_util_get_int32(val_buffer[i], ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_header() { unsigned char *buffer; unsigned char *header_format_0 = "MThd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60"; unsigned char *header_format_1 = "MThd\x00\x00\x00\x00\x00\x01\x00\x00\x00\x60"; guint i; gboolean success; buffer = malloc(14 * sizeof(unsigned char)); /* format 0 */ success = TRUE; ags_midi_buffer_util_put_header(buffer, 0, 0, 0, 96); for(i = 0; i < 14; i++){ if(buffer[i] != header_format_0[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* format 1 */ success = TRUE; ags_midi_buffer_util_put_header(buffer, 0, 1, 0, 96); for(i = 0; i < 14; i++){ if(buffer[i] != header_format_1[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_header() { unsigned char *header_format_0 = "MThd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60"; unsigned char *header_format_1 = "MThd\x00\x00\x00\x00\x00\x01\x00\x00\x00\x60"; glong offset, format, track_count, division; /* invoke with no return location */ ags_midi_buffer_util_get_header(header_format_0, NULL, NULL, NULL, NULL); /* format 0 */ ags_midi_buffer_util_get_header(header_format_0, &offset, &format, &track_count, &division); CU_ASSERT(offset == 0 && format == 0 && track_count == 0 && division == 96); /* format 1 */ ags_midi_buffer_util_get_header(header_format_1, &offset, &format, &track_count, &division); CU_ASSERT(offset == 0 && format == 1 && track_count == 0 && division == 96); } void ags_midi_buffer_util_test_put_track() { unsigned char *buffer; unsigned char *track = "MTrk\x00\x00\x00\x00"; guint i; gboolean success; buffer = (unsigned char *) malloc(8 * sizeof(unsigned char)); /* track */ success = TRUE; ags_midi_buffer_util_put_track(buffer, 0); for(i = 0; i < 8; i++){ if(buffer[i] != track[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_track() { unsigned char *track = "MTrk\x00\x00\x00\x00"; glong offset; /* invoke with no return location */ ags_midi_buffer_util_get_track(track, NULL); /* track */ ags_midi_buffer_util_get_track(track, &offset); CU_ASSERT(offset == 0); } void ags_midi_buffer_util_test_put_key_on() { unsigned char *buffer; unsigned char *key_on = "\x90\x36\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_key_on(buffer, varlength[i][1], 0, 54, 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], key_on, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_key_on() { unsigned char *buffer; unsigned char *key_on = "\x90\x36\x7f"; guint i; glong delta_time, channel, key, velocity; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], key_on, 3); ags_midi_buffer_util_get_key_on(buffer, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], key_on, 3); ags_midi_buffer_util_get_key_on(buffer, &delta_time, &channel, &key, &velocity); if(delta_time != varlength[i][1] || channel != 0 || key != 54 || velocity != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_key_off() { unsigned char *buffer; unsigned char *key_off = "\x80\x36\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_key_off(buffer, varlength[i][1], 0, 54, 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], key_off, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_key_off() { unsigned char *buffer; unsigned char *key_off = "\x80\x36\x7f"; guint i; glong delta_time, channel, key, velocity; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], key_off, 3); ags_midi_buffer_util_get_key_off(buffer, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], key_off, 3); ags_midi_buffer_util_get_key_off(buffer, &delta_time, &channel, &key, &velocity); if(delta_time != varlength[i][1] || channel != 0 || key != 54 || velocity != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_key_pressure() { unsigned char *buffer; unsigned char *key_pressure = "\xa0\x36\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_key_pressure(buffer, varlength[i][1], 0, 54, 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], key_pressure, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_key_pressure() { unsigned char *buffer; unsigned char *key_pressure = "\xa0\x36\x7f"; guint i; glong delta_time, channel, key, velocity; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], key_pressure, 3); ags_midi_buffer_util_get_key_pressure(buffer, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], key_pressure, 3); ags_midi_buffer_util_get_key_pressure(buffer, &delta_time, &channel, &key, &velocity); if(delta_time != varlength[i][1] || channel != 0 || key != 54 || velocity != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_change_parameter() { unsigned char *buffer; unsigned char *change_parameter = "\xb0\x00\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_change_parameter(buffer, varlength[i][1], 0, 0, 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], change_parameter, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_change_parameter() { unsigned char *buffer; unsigned char *change_parameter = "\xb0\x00\x7f"; guint i; glong delta_time, channel, control, value; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], change_parameter, 3); ags_midi_buffer_util_get_change_parameter(buffer, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], change_parameter, 3); ags_midi_buffer_util_get_change_parameter(buffer, &delta_time, &channel, &control, &value); if(delta_time != varlength[i][1] || channel != 0 || control != 0 || value != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_pitch_bend() { unsigned char *buffer; unsigned char *pitch_bend = "\xe0\x00\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_pitch_bend(buffer, varlength[i][1], 0, 0, 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], pitch_bend, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_pitch_bend() { unsigned char *buffer; unsigned char *pitch_bend = "\xe0\x00\x7f"; guint i; glong delta_time, channel, pitch, transmitter; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], pitch_bend, 3); ags_midi_buffer_util_get_pitch_bend(buffer, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], pitch_bend, 3); ags_midi_buffer_util_get_pitch_bend(buffer, &delta_time, &channel, &pitch, &transmitter); if(delta_time != varlength[i][1] || channel != 0 || pitch != 0 || transmitter != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_change_program() { unsigned char *buffer; unsigned char *change_program = "\xc0\x00"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_change_program(buffer, varlength[i][1], 0, 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], change_program, 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_change_program() { unsigned char *buffer; unsigned char *change_program = "\xc0\x00"; guint i; glong delta_time, channel, program; gboolean success; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], change_program, 2); ags_midi_buffer_util_get_change_program(buffer, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], change_program, 2); ags_midi_buffer_util_get_change_program(buffer, &delta_time, &channel, &program); if(delta_time != varlength[i][1] || channel != 0 || program != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_change_pressure() { unsigned char *buffer; unsigned char *change_pressure = "\xd0\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ ags_midi_buffer_util_put_change_pressure(buffer, varlength[i][1], 0, 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], change_pressure, 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_change_pressure() { unsigned char *buffer; unsigned char *change_pressure = "\xd0\x7f"; guint i; glong delta_time, channel, pressure; gboolean success; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], change_pressure, 2); ags_midi_buffer_util_get_change_pressure(buffer, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], change_pressure, 2); ags_midi_buffer_util_get_change_pressure(buffer, &delta_time, &channel, &pressure); if(delta_time != varlength[i][1] || channel != 0 || pressure != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_sysex() { //TODO:JK: implement me } void ags_midi_buffer_util_test_get_sysex() { //TODO:JK: implement me } void ags_midi_buffer_util_test_put_quarter_frame() { unsigned char *buffer; unsigned char *quarter_frame; unsigned char *quarter_frame_frame_number_0_lsb = "\xf1\x00"; unsigned char *quarter_frame_frame_number_0_msb = "\xf1\x10"; unsigned char *quarter_frame_frame_number_30_lsb = "\xf1\x0e"; unsigned char *quarter_frame_frame_number_30_msb = "\xf1\x11"; unsigned char *quarter_frame_seconds_0_lsb = "\xf1\x20"; unsigned char *quarter_frame_seconds_0_msb = "\xf1\x30"; unsigned char *quarter_frame_seconds_59_lsb = "\xf1\x2c"; unsigned char *quarter_frame_seconds_59_msb = "\xf1\x33"; unsigned char *quarter_frame_minutes_0_lsb = "\xf1\x40"; unsigned char *quarter_frame_minutes_0_msb = "\xf1\x50"; unsigned char *quarter_frame_minutes_59_lsb = "\xf1\x4c"; unsigned char *quarter_frame_minutes_59_msb = "\xf1\x53"; unsigned char *quarter_frame_hours_0_lsb = "\xf1\x60"; unsigned char *quarter_frame_hours_0_msb = "\xf1\x70"; unsigned char *quarter_frame_hours_23_lsb = "\xf1\x67"; unsigned char *quarter_frame_hours_23_msb = "\xf1\x71"; guint i; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); quarter_frame = (unsigned char *) malloc(7 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 12; i++){ /* frame number 0 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_frame_number_0_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_LSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* frame number 0 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_frame_number_0_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_MSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* frame number 30 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_frame_number_30_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_LSB, (0x0f & 0x1e)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* frame number 30 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_frame_number_30_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_MSB, ((0x10 & 0x1e) >> 4)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* seconds 0 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_seconds_0_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_LSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* seconds 0 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_seconds_0_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_MSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* seconds 59 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_seconds_59_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_LSB, (0x0f & 0x3c)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* seconds 59 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_seconds_59_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_MSB, ((0x30 & (0x3c)) >> 4)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* minutes 0 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_minutes_0_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_LSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* minutes 0 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_minutes_0_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_MSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* minutes 59 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_minutes_59_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_LSB, (0x0f & 0x3c)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* minutes 59 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_minutes_59_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_MSB, ((0x30 & (0x3c)) >> 4)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* hours 0 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_hours_0_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_LSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* hours 0 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_hours_0_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_MSB, 0); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* hours 23 - lsb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_hours_23_lsb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_LSB, (0x0f & 0x17)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } /* hours 23 - msb */ memcpy(quarter_frame, varlength_buffer[i], varlength[i][2]); memcpy(quarter_frame + varlength[i][2], quarter_frame_hours_23_msb, 2); ags_midi_buffer_util_put_quarter_frame(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_MSB, ((0x10 & 0x17) >> 4)); if(memcmp(buffer, quarter_frame, varlength[i][2] + 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_quarter_frame() { unsigned char *buffer; unsigned char *quarter_frame_frame_number_0_lsb = "\xf1\x00"; unsigned char *quarter_frame_frame_number_0_msb = "\xf1\x10"; unsigned char *quarter_frame_frame_number_30_lsb = "\xf1\x0e"; unsigned char *quarter_frame_frame_number_30_msb = "\xf1\x11"; unsigned char *quarter_frame_seconds_0_lsb = "\xf1\x20"; unsigned char *quarter_frame_seconds_0_msb = "\xf1\x30"; unsigned char *quarter_frame_seconds_59_lsb = "\xf1\x2c"; unsigned char *quarter_frame_seconds_59_msb = "\xf1\x33"; unsigned char *quarter_frame_minutes_0_lsb = "\xf1\x40"; unsigned char *quarter_frame_minutes_0_msb = "\xf1\x50"; unsigned char *quarter_frame_minutes_59_lsb = "\xf1\x4c"; unsigned char *quarter_frame_minutes_59_msb = "\xf1\x53"; unsigned char *quarter_frame_hours_0_lsb = "\xf1\x60"; unsigned char *quarter_frame_hours_0_msb = "\xf1\x70"; unsigned char *quarter_frame_hours_23_lsb = "\xf1\x67"; unsigned char *quarter_frame_hours_23_msb = "\xf1\x71"; glong delta_time, message_type, values; guint i; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 12; i++){ /* frame number 0 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_frame_number_0_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_LSB || values != 0){ success = FALSE; break; } /* frame number 0 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_frame_number_0_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_MSB || values != 0){ success = FALSE; break; } /* frame number 30 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_frame_number_30_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_LSB || values != (0x0f & 0x1e)){ success = FALSE; break; } /* frame number 30 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_frame_number_30_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_MSB || values != ((0x10 & 0x1e) >> 4)){ success = FALSE; break; } /* seconds 0 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_seconds_0_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_LSB || values != 0){ success = FALSE; break; } /* seconds 0 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_seconds_0_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_MSB || values != 0){ success = FALSE; break; } /* seconds 59 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_seconds_59_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_LSB || values != (0x0f & 0x3c)){ success = FALSE; break; } /* seconds 59 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_seconds_59_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_MSB || values != ((0x30 & 0x3c) >> 4)){ success = FALSE; break; } /* minutes 0 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_minutes_0_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_LSB || values != 0){ success = FALSE; break; } /* minutes 0 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_minutes_0_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_MSB || values != 0){ success = FALSE; break; } /* minutes 59 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_minutes_59_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_LSB || values != (0x0f & 0x3c)){ success = FALSE; break; } /* minutes 59 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_minutes_59_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_MSB || values != ((0x30 & 0x3c) >> 4)){ success = FALSE; break; } /* hours 0 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_hours_0_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_LSB || values != 0){ success = FALSE; break; } /* hours 0 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_hours_0_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_MSB || values != 0){ success = FALSE; break; } /* hours 23 - lsb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_hours_23_lsb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_LSB || values != (0x0f & 0x17)){ success = FALSE; break; } /* hours 23 - msb */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], quarter_frame_hours_23_msb, 2); ags_midi_buffer_util_get_quarter_frame(buffer, &delta_time, &message_type, &values); if(message_type != AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_MSB || values != ((0x10 & 0x17) >> 4)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_song_position() { unsigned char *buffer; unsigned char *song_position_0 = "\xf2\x00\x00"; unsigned char *song_position_16 = "\xf2\x10\x00"; unsigned char *song_position_16383 = "\xf2\x7f\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* position 0 */ ags_midi_buffer_util_put_song_position(buffer, varlength[i][1], 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], song_position_0, 3)){ success = FALSE; break; } /* position 16 */ ags_midi_buffer_util_put_song_position(buffer, varlength[i][1], 16); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], song_position_16, 3)){ success = FALSE; break; } /* position 16383 (maximum) */ ags_midi_buffer_util_put_song_position(buffer, varlength[i][1], 16383); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], song_position_16383, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_song_position() { unsigned char *buffer; unsigned char *song_position_0 = "\xf2\x00\x00"; unsigned char *song_position_16 = "\xf2\x10\x00"; unsigned char *song_position_16383 = "\xf2\x7f\x7f"; guint i; glong delta_time, song_position; gboolean success; buffer = (unsigned char *) malloc(12 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], song_position_0, 3); ags_midi_buffer_util_get_song_position(buffer, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* position 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], song_position_0, 3); ags_midi_buffer_util_get_song_position(buffer, &delta_time, &song_position); if(delta_time != varlength[i][1] || song_position != 0){ success = FALSE; break; } /* position 16 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], song_position_16, 3); ags_midi_buffer_util_get_song_position(buffer, &delta_time, &song_position); if(delta_time != varlength[i][1] || song_position != 16){ success = FALSE; break; } /* position 16383 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], song_position_16383, 3); ags_midi_buffer_util_get_song_position(buffer, &delta_time, &song_position); if(delta_time != varlength[i][1] || song_position != 16383){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_song_select() { unsigned char *buffer; unsigned char *song_select_0 = "\xf3\x00"; unsigned char *song_select_127 = "\xf3\x7f"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* select 0 */ ags_midi_buffer_util_put_song_select(buffer, varlength[i][1], 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], song_select_0, 2)){ success = FALSE; break; } /* select 127 */ ags_midi_buffer_util_put_song_select(buffer, varlength[i][1], 127); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], song_select_127, 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_song_select() { unsigned char *buffer; unsigned char *song_select_0 = "\xf3\x00"; unsigned char *song_select_127 = "\xf3\x7f"; guint i; glong delta_time, song_select; gboolean success; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], song_select_0, 2); ags_midi_buffer_util_get_song_select(buffer, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* select 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], song_select_0, 2); ags_midi_buffer_util_get_song_select(buffer, &delta_time, &song_select); if(delta_time != varlength[i][1] || song_select != 0){ success = FALSE; break; } /* select 127 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], song_select_127, 2); ags_midi_buffer_util_get_song_select(buffer, &delta_time, &song_select); if(delta_time != varlength[i][1] || song_select != 127){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_tune_request() { unsigned char *buffer; unsigned char *tune_request = "\xf6"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* select 0 */ ags_midi_buffer_util_put_tune_request(buffer, varlength[i][1]); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tune_request, 1)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_tune_request() { unsigned char *buffer; unsigned char *tune_request = "\xf6"; guint i; glong delta_time; gboolean success; buffer = (unsigned char *) malloc(6 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], tune_request, 1); ags_midi_buffer_util_get_tune_request(buffer, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* select 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tune_request, 1); ags_midi_buffer_util_get_tune_request(buffer, &delta_time); if(delta_time != varlength[i][1]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_sequence_number() { unsigned char *buffer; unsigned char *sequence_number_0 = "\xff\x00\x02\x00\x00"; unsigned char *sequence_number_255 = "\xff\x00\x02\x00\xff"; unsigned char *sequence_number_256 = "\xff\x00\x02\x01\x00"; unsigned char *sequence_number_65535 = "\xff\x00\x02\xff\xff"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(9 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* select 0 */ ags_midi_buffer_util_put_sequence_number(buffer, varlength[i][1], 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], sequence_number_0, 5)){ success = FALSE; break; } /* select 255 */ ags_midi_buffer_util_put_sequence_number(buffer, varlength[i][1], 255); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], sequence_number_255, 5)){ success = FALSE; break; } /* select 256 */ ags_midi_buffer_util_put_sequence_number(buffer, varlength[i][1], 256); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], sequence_number_256, 5)){ success = FALSE; break; } /* select 65535 */ ags_midi_buffer_util_put_sequence_number(buffer, varlength[i][1], 65535); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], sequence_number_65535, 5)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_sequence_number() { unsigned char *buffer; unsigned char *sequence_number_0 = "\xff\x00\x02\x00\x00"; unsigned char *sequence_number_255 = "\xff\x00\x02\x00\xff"; unsigned char *sequence_number_256 = "\xff\x00\x02\x01\x00"; unsigned char *sequence_number_65535 = "\xff\x00\x02\xff\xff"; guint i; glong delta_time, sequence_number; gboolean success; buffer = (unsigned char *) malloc(9 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], sequence_number_0, 5); ags_midi_buffer_util_get_sequence_number(buffer, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* select 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], sequence_number_0, 5); ags_midi_buffer_util_get_sequence_number(buffer, &delta_time, &sequence_number); if(delta_time != varlength[i][1] || sequence_number != 0){ success = FALSE; break; } /* select 255 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], sequence_number_255, 5); ags_midi_buffer_util_get_sequence_number(buffer, &delta_time, &sequence_number); if(delta_time != varlength[i][1] || sequence_number != 255){ success = FALSE; break; } /* select 256 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], sequence_number_256, 5); ags_midi_buffer_util_get_sequence_number(buffer, &delta_time, &sequence_number); if(delta_time != varlength[i][1] || sequence_number != 256){ success = FALSE; break; } /* select 65535 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], sequence_number_65535, 5); ags_midi_buffer_util_get_sequence_number(buffer, &delta_time, &sequence_number); if(delta_time != varlength[i][1] || sequence_number != 65535){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_smtpe() { unsigned char *buffer; unsigned char *smtpe_0_0_0_0 = "\xff\x54\x05\x80\x00\x00\x00"; unsigned char *smtpe_0_0_0_30 = "\xff\x54\x05\x80\x00\x00\x1e"; unsigned char *smtpe_0_0_59_30 = "\xff\x54\x05\x80\x00\x3b\x1e"; unsigned char *smtpe_0_59_59_30 = "\xff\x54\x05\x80\x3b\x3b\x1e"; unsigned char *smtpe_23_59_59_30 = "\xff\x54\x05\x97\x3b\x3b\x1e"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(11 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* smtpe 0 */ ags_midi_buffer_util_put_smtpe(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS, 0, 0, 0, 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], smtpe_0_0_0_0, 7)){ success = FALSE; break; } /* smtpe 30 fr */ ags_midi_buffer_util_put_smtpe(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS, 0, 0, 0, 30); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], smtpe_0_0_0_30, 7)){ success = FALSE; break; } /* smtpe 59 s 30 fr */ ags_midi_buffer_util_put_smtpe(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS, 0, 0, 59, 30); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], smtpe_0_0_59_30, 7)){ success = FALSE; break; } /* smtpe 59 m 59 s 30 fr */ ags_midi_buffer_util_put_smtpe(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS, 0, 59, 59, 30); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], smtpe_0_59_59_30, 7)){ success = FALSE; break; } /* smtpe 23 h 59 m 59 s 30 fr */ ags_midi_buffer_util_put_smtpe(buffer, varlength[i][1], AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS, 23, 59, 59, 30); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], smtpe_23_59_59_30, 7)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_smtpe() { unsigned char *buffer; unsigned char *smtpe_0_0_0_0 = "\xff\x54\x05\x80\x00\x00\x00"; unsigned char *smtpe_0_0_0_30 = "\xff\x54\x05\x80\x00\x00\x1e"; unsigned char *smtpe_0_0_59_30 = "\xff\x54\x05\x80\x00\x3b\x1e"; unsigned char *smtpe_0_59_59_30 = "\xff\x54\x05\x80\x3b\x3b\x1e"; unsigned char *smtpe_23_59_59_30 = "\xff\x54\x05\x97\x3b\x3b\x1e"; guint i; glong delta_time, rr, hr, mn, se, fr; gboolean success; buffer = (unsigned char *) malloc(11 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], smtpe_0_0_0_0, 7); ags_midi_buffer_util_get_smtpe(buffer, NULL, NULL, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* smtpe 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], smtpe_0_0_0_0, 7); ags_midi_buffer_util_get_smtpe(buffer, &delta_time, &rr, &hr, &mn, &se, &fr); if(delta_time != varlength[i][1] || rr != AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS || hr != 0 || mn != 0 || se != 0 || fr != 0){ success = FALSE; break; } /* smtpe 30 fr */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], smtpe_0_0_0_30, 7); ags_midi_buffer_util_get_smtpe(buffer, &delta_time, &rr, &hr, &mn, &se, &fr); if(delta_time != varlength[i][1] || rr != AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS || hr != 0 || mn != 0 || se != 0 || fr != 30){ success = FALSE; break; } /* smtpe 59 s 30 fr */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], smtpe_0_0_59_30, 7); ags_midi_buffer_util_get_smtpe(buffer, &delta_time, &rr, &hr, &mn, &se, &fr); if(delta_time != varlength[i][1] || rr != AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS || hr != 0 || mn != 0 || se != 59 || fr != 30){ success = FALSE; break; } /* smtpe 59 m 59 s 30 fr */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], smtpe_0_59_59_30, 7); ags_midi_buffer_util_get_smtpe(buffer, &delta_time, &rr, &hr, &mn, &se, &fr); if(delta_time != varlength[i][1] || rr != AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS || hr != 0 || mn != 59 || se != 59 || fr != 30){ success = FALSE; break; } /* smtpe 23 h 59 m 59 s 30 fr */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], smtpe_23_59_59_30, 7); ags_midi_buffer_util_get_smtpe(buffer, &delta_time, &rr, &hr, &mn, &se, &fr); if(delta_time != varlength[i][1] || rr != AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS || hr != 23 || mn != 59 || se != 59 || fr != 30){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_tempo() { unsigned char *buffer; unsigned char *tempo_0 = "\xff\x51\x03\x00\x00\x00"; unsigned char *tempo_1 = "\xff\x51\x03\x00\x00\x01"; unsigned char *tempo_255 = "\xff\x51\x03\x00\x00\xff"; unsigned char *tempo_256 = "\xff\x51\x03\x00\x01\x00"; unsigned char *tempo_65535 = "\xff\x51\x03\x00\xff\xff"; unsigned char *tempo_65536 = "\xff\x51\x03\x01\x00\x00"; unsigned char *tempo_16777215 = "\xff\x51\x03\xff\xff\xff"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(10 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* tempo 0 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_0, 6)){ success = FALSE; break; } /* tempo 1 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 1); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_1, 6)){ success = FALSE; break; } /* tempo 255 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 255); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_255, 6)){ success = FALSE; break; } /* tempo 256 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 256); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_256, 6)){ success = FALSE; break; } /* tempo 65535 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 65535); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_65535, 6)){ success = FALSE; break; } /* tempo 65536 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 65536); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_65536, 6)){ success = FALSE; break; } /* tempo 16777215 */ ags_midi_buffer_util_put_tempo(buffer, varlength[i][1], 16777215); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], tempo_16777215, 6)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_tempo() { unsigned char *buffer; unsigned char *tempo_0 = "\xff\x51\x03\x00\x00\x00"; unsigned char *tempo_1 = "\xff\x51\x03\x00\x00\x01"; unsigned char *tempo_255 = "\xff\x51\x03\x00\x00\xff"; unsigned char *tempo_256 = "\xff\x51\x03\x00\x01\x00"; unsigned char *tempo_65535 = "\xff\x51\x03\x00\xff\xff"; unsigned char *tempo_65536 = "\xff\x51\x03\x01\x00\x00"; unsigned char *tempo_16777215 = "\xff\x51\x03\xff\xff\xff"; guint i; glong delta_time, tempo; gboolean success; buffer = (unsigned char *) malloc(10 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], tempo_0, 6); ags_midi_buffer_util_get_tempo(buffer, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* tempo 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_0, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 0){ success = FALSE; break; } /* tempo 1 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_1, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 1){ success = FALSE; break; } /* tempo 255 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_255, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 255){ success = FALSE; break; } /* tempo 256 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_256, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 256){ success = FALSE; break; } /* tempo 65535 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_65535, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 65535){ success = FALSE; break; } /* tempo 65536 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_65536, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 65536){ success = FALSE; break; } /* tempo 16777215 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], tempo_16777215, 6); ags_midi_buffer_util_get_tempo(buffer, &delta_time, &tempo); if(delta_time != varlength[i][1] || tempo != 16777215){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_time_signature() { unsigned char *buffer; unsigned char *time_signature_0_0_0_0 = "\xff\x58\x04\x00\x00\x00\x00"; unsigned char *time_signature_1_1_96_8 = "\xff\x58\x04\x01\x01\x60\x08"; unsigned char *time_signature_4_4_24_8 = "\xff\x58\x04\x04\x04\x18\x08"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(11 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* time signature 0 0 0 0 */ ags_midi_buffer_util_put_time_signature(buffer, varlength[i][1], 0, 0, 0, 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], time_signature_0_0_0_0, 7)){ success = FALSE; break; } /* time signature 1 1 96 8 */ ags_midi_buffer_util_put_time_signature(buffer, varlength[i][1], 1, 1, 96, 8); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], time_signature_1_1_96_8, 7)){ success = FALSE; break; } /* time signature 4 4 24 8 */ ags_midi_buffer_util_put_time_signature(buffer, varlength[i][1], 4, 4, 24, 8); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], time_signature_4_4_24_8, 7)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_time_signature() { unsigned char *buffer; unsigned char *time_signature_0_0_0_0 = "\xff\x58\x04\x00\x00\x00\x00"; unsigned char *time_signature_1_1_96_8 = "\xff\x58\x04\x01\x01\x60\x08"; unsigned char *time_signature_4_4_24_8 = "\xff\x58\x04\x04\x04\x18\x08"; guint i; glong delta_time, nn, dd, cc, bb; gboolean success; buffer = (unsigned char *) malloc(11 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], time_signature_0_0_0_0, 7); ags_midi_buffer_util_get_time_signature(buffer, NULL, NULL, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* time signature 0 0 0 0 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], time_signature_0_0_0_0, 7); ags_midi_buffer_util_get_time_signature(buffer, &delta_time, &nn, &dd, &cc, &bb); if(delta_time != varlength[i][1] || nn != 0 || dd != 0 || cc != 0 || bb != 0){ success = FALSE; break; } /* time signature 1 1 96 8 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], time_signature_1_1_96_8, 7); ags_midi_buffer_util_get_time_signature(buffer, &delta_time, &nn, &dd, &cc, &bb); if(delta_time != varlength[i][1] || nn != 1 || dd != 1 || cc != 96 || bb != 8){ success = FALSE; break; } /* time signature 4 4 24 8 */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], time_signature_4_4_24_8, 7); ags_midi_buffer_util_get_time_signature(buffer, &delta_time, &nn, &dd, &cc, &bb); if(delta_time != varlength[i][1] || nn != 4 || dd != 4 || cc != 24 || bb != 8){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_key_signature() { unsigned char *buffer; unsigned char *key_signature_3_minor = "\xff\x59\x02\x03\x01"; unsigned char *key_signature_3_major = "\xff\x59\x02\x03\x00"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(9 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* key signature 3 minor */ ags_midi_buffer_util_put_key_signature(buffer, varlength[i][1], 3, 1); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], key_signature_3_minor, 5)){ success = FALSE; break; } /* key signature 3 major */ ags_midi_buffer_util_put_key_signature(buffer, varlength[i][1], 3, 0); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], key_signature_3_major, 5)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_key_signature() { unsigned char *buffer; unsigned char *key_signature_3_minor = "\xff\x59\x02\x03\x01"; unsigned char *key_signature_3_major = "\xff\x59\x02\x03\x00"; guint i; glong delta_time, sharp_flats, is_minor; gboolean success; buffer = (unsigned char *) malloc(10 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], key_signature_3_minor, 5); ags_midi_buffer_util_get_key_signature(buffer, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* key signature 3 minor */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], key_signature_3_minor, 5); ags_midi_buffer_util_get_key_signature(buffer, &delta_time, &sharp_flats, &is_minor); if(delta_time != varlength[i][1] || sharp_flats != 3 || is_minor != 1){ success = FALSE; break; } /* key signature 3 major */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], key_signature_3_major, 5); ags_midi_buffer_util_get_key_signature(buffer, &delta_time, &sharp_flats, &is_minor); if(delta_time != varlength[i][1] || sharp_flats != 3 || is_minor != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_sequencer_meta_event() { //TODO:JK: implement me } void ags_midi_buffer_util_test_get_sequencer_meta_event() { //TODO:JK: implement me } void ags_midi_buffer_util_test_put_text_event() { unsigned char *buffer; unsigned char *text_event_MY_TEXT = "\xff\x01\x07MY TEXT\0"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(14 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* text event */ ags_midi_buffer_util_put_text_event(buffer, varlength[i][1], "MY TEXT\0", 7); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], text_event_MY_TEXT, 10)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_text_event() { unsigned char *buffer; unsigned char *text_event_MY_TEXT = "\xff\x01\x07MY TEXT\0"; guint i; unsigned char *text_event; glong delta_time, length; gboolean success; buffer = (unsigned char *) malloc(14 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], text_event_MY_TEXT, 10); ags_midi_buffer_util_get_text_event(buffer, NULL, NULL, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* text event */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], text_event_MY_TEXT, 10); ags_midi_buffer_util_get_text_event(buffer, &delta_time, &text_event, &length); if(delta_time != varlength[i][1] || memcmp(text_event, "MY TEXT\0", 7) || length != 7){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_end_of_track() { unsigned char *buffer; unsigned char *end_of_track = "\xff\x2f\x00\0"; guint i; gboolean success; /* test different delta-time */ success = TRUE; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); for(i = 0; i < 12; i++){ /* text event */ ags_midi_buffer_util_put_end_of_track(buffer, varlength[i][1]); if(memcmp(buffer, varlength_buffer[i], varlength[i][2]) || memcmp(buffer + varlength[i][2], end_of_track, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_get_end_of_track() { unsigned char *buffer; unsigned char *end_of_track = "\xff\x2f\x00\0"; guint i; glong delta_time; gboolean success; buffer = (unsigned char *) malloc(7 * sizeof(unsigned char)); /* invoke without return location */ memcpy(buffer, varlength_buffer[0], varlength[0][2]); memcpy(buffer + varlength[0][2], end_of_track, 3); ags_midi_buffer_util_get_end_of_track(buffer, NULL); /* test different delta-time */ success = TRUE; for(i = 0; i < 12; i++){ /* text event */ memcpy(buffer, varlength_buffer[i], varlength[i][2]); memcpy(buffer + varlength[i][2], end_of_track, 3); ags_midi_buffer_util_get_end_of_track(buffer, &delta_time); if(delta_time != varlength[i][1]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_midi_buffer_util_test_put_seek_message() { //TODO:JK: implement me } void ags_midi_buffer_util_test_decode() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMidiBufferUtilTest", ags_midi_buffer_util_test_init_suite, ags_midi_buffer_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_midi_buffer_util.c get varlength size", ags_midi_buffer_util_test_get_varlength_size) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put varlength", ags_midi_buffer_util_test_put_varlength) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get varlength", ags_midi_buffer_util_test_get_varlength) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put int16", ags_midi_buffer_util_test_put_int16) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get int16", ags_midi_buffer_util_test_get_int16) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put int24", ags_midi_buffer_util_test_put_int24) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get int24", ags_midi_buffer_util_test_get_int24) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put int32", ags_midi_buffer_util_test_put_int32) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get int32", ags_midi_buffer_util_test_get_int32) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put header", ags_midi_buffer_util_test_put_header) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get header", ags_midi_buffer_util_test_get_header) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put track", ags_midi_buffer_util_test_put_track) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get track", ags_midi_buffer_util_test_get_track) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put key on", ags_midi_buffer_util_test_put_key_on) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get key on", ags_midi_buffer_util_test_get_key_on) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put key off", ags_midi_buffer_util_test_put_key_off) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get key off", ags_midi_buffer_util_test_get_key_off) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put key pressure", ags_midi_buffer_util_test_put_key_pressure) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get key pressure", ags_midi_buffer_util_test_get_key_pressure) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put change parameter", ags_midi_buffer_util_test_put_change_parameter) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get change parameter", ags_midi_buffer_util_test_get_change_parameter) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put change pitch bend", ags_midi_buffer_util_test_put_pitch_bend) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get change pitch bend", ags_midi_buffer_util_test_get_pitch_bend) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put change program", ags_midi_buffer_util_test_put_change_program) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get change program", ags_midi_buffer_util_test_get_change_program) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put change pressure", ags_midi_buffer_util_test_put_change_pressure) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get change pressure", ags_midi_buffer_util_test_get_change_pressure) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put sysex", ags_midi_buffer_util_test_put_sysex) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get sysex", ags_midi_buffer_util_test_get_sysex) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put quarter frame", ags_midi_buffer_util_test_put_quarter_frame) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get quarter frame", ags_midi_buffer_util_test_get_quarter_frame) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put song position", ags_midi_buffer_util_test_put_song_position) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get song position", ags_midi_buffer_util_test_get_song_position) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put song select", ags_midi_buffer_util_test_put_song_select) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get song select", ags_midi_buffer_util_test_get_song_select) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put tune request", ags_midi_buffer_util_test_put_tune_request) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get tune request", ags_midi_buffer_util_test_get_tune_request) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put sequence number", ags_midi_buffer_util_test_put_sequence_number) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get sequence number", ags_midi_buffer_util_test_get_sequence_number) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put smtpe", ags_midi_buffer_util_test_put_smtpe) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get smtpe", ags_midi_buffer_util_test_get_smtpe) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put tempo", ags_midi_buffer_util_test_put_tempo) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get tempo", ags_midi_buffer_util_test_get_tempo) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put time signature", ags_midi_buffer_util_test_put_time_signature) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get time signature", ags_midi_buffer_util_test_get_time_signature) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put key signature", ags_midi_buffer_util_test_put_key_signature) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get key signature", ags_midi_buffer_util_test_get_key_signature) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put sequencer meta event", ags_midi_buffer_util_test_put_sequencer_meta_event) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get sequencer meta event", ags_midi_buffer_util_test_get_sequencer_meta_event) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put text event", ags_midi_buffer_util_test_put_text_event) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get text event", ags_midi_buffer_util_test_get_text_event) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c put end of track", ags_midi_buffer_util_test_put_end_of_track) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c get end of track", ags_midi_buffer_util_test_get_end_of_track) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c seek message", ags_midi_buffer_util_test_put_seek_message) == NULL) || (CU_add_test(pSuite, "test of ags_midi_buffer_util.c decode", ags_midi_buffer_util_test_decode) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/midi/ags_midi_builder_test.c0000644000175000017500000007315713605312646021064 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_midi_builder_test_init_suite(); int ags_midi_builder_test_clean_suite(); AgsMidiBuilder* ags_midi_builder_test_create_default(guint n_tracks); void ags_midi_builder_test_append_header(); void ags_midi_builder_test_append_track(); void ags_midi_builder_test_append_key_on(); void ags_midi_builder_test_append_key_off(); void ags_midi_builder_test_append_key_pressure(); void ags_midi_builder_test_append_change_parameter(); void ags_midi_builder_test_append_change_pitch_bend(); void ags_midi_builder_test_append_change_program(); void ags_midi_builder_test_append_change_pressure(); void ags_midi_builder_test_append_sysex(); void ags_midi_builder_test_append_quarter_frame(); void ags_midi_builder_test_append_song_position(); void ags_midi_builder_test_append_song_select(); void ags_midi_builder_test_append_tune_request(); void ags_midi_builder_test_append_sequence_number(); void ags_midi_builder_test_append_smtpe(); void ags_midi_builder_test_append_time_signature(); void ags_midi_builder_test_append_key_signature(); void ags_midi_builder_test_append_sequencer_meta_event(); void ags_midi_builder_test_append_text_event(); #define AGS_MIDI_BUILDER_TEST_DEFAULT_SEQUENCE_PREFIX "ags-sequence-\0" #define AGS_MIDI_BUILDER_TEST_DEFAULT_FORMAT (1) #define AGS_MIDI_BUILDER_TEST_DEFAULT_TRACK_COUNT (0) #define AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION (0xe250) #define AGS_MIDI_BUILDER_TEST_DEFAULT_TIMES (30) #define AGS_MIDI_BUILDER_TEST_DEFAULT_BPM (120) #define AGS_MIDI_BUILDER_TEST_DEFAULT_CLICKS (4) #define AGS_MIDI_BUILDER_TEST_APPEND_HEADER_FORMAT (1) #define AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TRACK_COUNT (0) #define AGS_MIDI_BUILDER_TEST_APPEND_HEADER_DIVISION (0xe250) #define AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TIMES (30) #define AGS_MIDI_BUILDER_TEST_APPEND_HEADER_BPM (120) #define AGS_MIDI_BUILDER_TEST_APPEND_HEADER_CLICKS (4) #define AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0 "ags-sequence-0\0" #define AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_1 "ags-sequence-1\0" #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_NOTE_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_CHANNEL (0) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_VELOCITY (127) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_NOTE_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_CHANNEL (0) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_VELOCITY (127) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_NOTE_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_CHANNEL (0) #define AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_VELOCITY (127) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_CONTROL_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_CHANNEL (0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_VALUE (127) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_PITCH_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_CHANNEL (0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRANSMITTER (127) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_PROGRAM_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_CHANNEL (0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_TRACK_COUNT (7) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_PRESSURE_COUNT (64) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_PULSE_UNIT (16.0 * AGS_MIDI_BUILDER_TEST_DEFAULT_BPM / 60.0 * 1.0 / (AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION >> 8) / (0xff & AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION) * 1000000.0) #define AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_CHANNEL (0) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midi_builder_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_midi_builder_test_clean_suite() { return(0); } AgsMidiBuilder* ags_midi_builder_test_create_default(guint n_tracks) { AgsMidiBuilder *midi_builder; gchar *str; guint i; midi_builder = ags_midi_builder_new(NULL); /* default header */ ags_midi_builder_append_header(midi_builder, 6, AGS_MIDI_BUILDER_TEST_DEFAULT_FORMAT, n_tracks, AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION, AGS_MIDI_BUILDER_TEST_DEFAULT_TIMES, AGS_MIDI_BUILDER_TEST_DEFAULT_BPM, AGS_MIDI_BUILDER_TEST_DEFAULT_CLICKS); for(i = 0; i < n_tracks; i++){ str = g_strdup_printf("%s%d\0", AGS_MIDI_BUILDER_TEST_DEFAULT_SEQUENCE_PREFIX, i); ags_midi_builder_append_track(midi_builder, str); free(str); } midi_builder->current_midi_track = midi_builder->midi_track->data; return(midi_builder); } void ags_midi_builder_test_append_header() { AgsMidiBuilder *midi_builder; glong offset, format; glong track_count, division; midi_builder = ags_midi_builder_new(NULL); /* append header */ ags_midi_builder_append_header(midi_builder, 6, AGS_MIDI_BUILDER_TEST_APPEND_HEADER_FORMAT, AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TRACK_COUNT, AGS_MIDI_BUILDER_TEST_APPEND_HEADER_DIVISION, AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TIMES, AGS_MIDI_BUILDER_TEST_APPEND_HEADER_BPM, AGS_MIDI_BUILDER_TEST_APPEND_HEADER_CLICKS); /* assert struct present */ CU_ASSERT(midi_builder->midi_header != NULL); CU_ASSERT(midi_builder->midi_header->offset == 6); CU_ASSERT(midi_builder->midi_header->format == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_FORMAT); CU_ASSERT(midi_builder->midi_header->count == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TRACK_COUNT); CU_ASSERT(midi_builder->midi_header->division == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_DIVISION); CU_ASSERT(midi_builder->midi_header->times == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TIMES); CU_ASSERT(midi_builder->midi_header->beat == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_BPM); CU_ASSERT(midi_builder->midi_header->clicks == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_CLICKS); /* build */ ags_midi_builder_build(midi_builder); CU_ASSERT(midi_builder->data != NULL); CU_ASSERT(midi_builder->length == 14); /* assert data */ ags_midi_buffer_util_get_header(midi_builder->data, &offset, &format, &track_count, &division); CU_ASSERT(offset == 6); CU_ASSERT(format == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_FORMAT); CU_ASSERT(track_count == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_TRACK_COUNT); CU_ASSERT(division == AGS_MIDI_BUILDER_TEST_APPEND_HEADER_DIVISION); } void ags_midi_builder_test_append_track() { AgsMidiBuilder *midi_builder; unsigned char *offset; gchar *text; guint length; glong delta_time; glong text_length; midi_builder = ags_midi_builder_new(NULL); /* default header */ ags_midi_builder_append_header(midi_builder, 6, AGS_MIDI_BUILDER_TEST_DEFAULT_FORMAT, AGS_MIDI_BUILDER_TEST_DEFAULT_TRACK_COUNT, AGS_MIDI_BUILDER_TEST_DEFAULT_DIVISION, AGS_MIDI_BUILDER_TEST_DEFAULT_TIMES, AGS_MIDI_BUILDER_TEST_DEFAULT_BPM, AGS_MIDI_BUILDER_TEST_DEFAULT_CLICKS); /* add track 0 */ ags_midi_builder_append_track(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0); CU_ASSERT(g_list_length(midi_builder->midi_track) == 1); CU_ASSERT(strcmp(midi_builder->current_midi_track->track_name, AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0) == 0); /* add track 1 */ ags_midi_builder_append_track(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_1); CU_ASSERT(g_list_length(midi_builder->midi_track) == 2); CU_ASSERT(strcmp(midi_builder->current_midi_track->track_name, AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_1) == 0); /* build */ ags_midi_builder_build(midi_builder); length = (14 + (2 * (4 + 4 + 1 + 3)) + (2 * (1 + 3)) + strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0) + strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_1)); CU_ASSERT(midi_builder->data != NULL); CU_ASSERT(midi_builder->length == length); /* assert sequence 0 */ offset = midi_builder->data; offset += (14 + 8); ags_midi_buffer_util_get_text_event(offset, &delta_time, &text, &text_length); CU_ASSERT(delta_time == 0); CU_ASSERT(text != NULL && strncmp(text, AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0, strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0)) == 0); CU_ASSERT(text_length == strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0)); /* assert sequence 1 */ offset += ((4 + 4 + 1 + 3) + (1 + 3) + strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0)); ags_midi_buffer_util_get_text_event(offset, &delta_time, &text, &text_length); CU_ASSERT(delta_time == 0); CU_ASSERT(text != NULL && strncmp(text, AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_1, strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_0)) == 0); CU_ASSERT(text_length == strlen(AGS_MIDI_BUILDER_TEST_APPEND_TRACK_SEQUENCE_1)); } void ags_midi_builder_test_append_key_on() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint keys[AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_NOTE_COUNT]; guint ret_size; glong delta_time; glong channel; glong key; glong velocity; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_NOTE_COUNT; j++){ keys[i][j] = rand() % 128; ags_midi_builder_append_key_on(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_CHANNEL, keys[i][j], AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_VELOCITY); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_KEY_ON_NOTE_COUNT; j++){ ret_size = ags_midi_buffer_util_get_key_on(offset, &delta_time, &channel, &key, &velocity); if(key != keys[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_key_off() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint keys[AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_NOTE_COUNT]; guint ret_size; glong delta_time; glong channel; glong key; glong velocity; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_NOTE_COUNT; j++){ keys[i][j] = rand() % 128; ags_midi_builder_append_key_off(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_CHANNEL, keys[i][j], AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_VELOCITY); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_KEY_OFF_NOTE_COUNT; j++){ ret_size = ags_midi_buffer_util_get_key_off(offset, &delta_time, &channel, &key, &velocity); if(key != keys[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_key_pressure() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint keys[AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_NOTE_COUNT]; guint ret_size; glong delta_time; glong channel; glong key; glong velocity; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_NOTE_COUNT; j++){ keys[i][j] = rand() % 128; ags_midi_builder_append_key_pressure(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_CHANNEL, keys[i][j], AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_VELOCITY); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_KEY_PRESSURE_NOTE_COUNT; j++){ ret_size = ags_midi_buffer_util_get_key_pressure(offset, &delta_time, &channel, &key, &velocity); if(key != keys[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_change_parameter() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint controls[AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_CONTROL_COUNT]; guint ret_size; glong delta_time; glong channel; glong control; glong value; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_CONTROL_COUNT; j++){ controls[i][j] = rand() % 128; ags_midi_builder_append_change_parameter(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_CHANNEL, controls[i][j], AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_VALUE); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PARAMETER_CONTROL_COUNT; j++){ ret_size = ags_midi_buffer_util_get_change_parameter(offset, &delta_time, &channel, &control, &value); if(control != controls[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_change_pitch_bend() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint pitchs[AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_PITCH_COUNT]; guint ret_size; glong delta_time; glong channel; glong pitch; glong transmitter; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_PITCH_COUNT; j++){ pitchs[i][j] = rand() % 128; ags_midi_builder_append_change_pitch_bend(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_CHANNEL, pitchs[i][j], AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRANSMITTER); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PITCH_BEND_PITCH_COUNT; j++){ ret_size = ags_midi_buffer_util_get_pitch_bend(offset, &delta_time, &channel, &pitch, &transmitter); if(pitch != pitchs[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_change_program() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint programs[AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_PROGRAM_COUNT]; guint ret_size; glong delta_time; glong channel; glong program; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_PROGRAM_COUNT; j++){ programs[i][j] = rand() % 128; ags_midi_builder_append_change_program(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_CHANNEL, programs[i][j]); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PROGRAM_PROGRAM_COUNT; j++){ ret_size = ags_midi_buffer_util_get_change_program(offset, &delta_time, &channel, &program); if(program != programs[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_change_pressure() { AgsMidiBuilder *midi_builder; GList *current_midi_track; unsigned char *offset; guint pressures[AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_TRACK_COUNT][AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_PRESSURE_COUNT]; guint ret_size; glong delta_time; glong channel; glong pressure; guint i, j; gboolean success; midi_builder = ags_midi_builder_test_create_default(AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_TRACK_COUNT); current_midi_track = midi_builder->midi_track; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_TRACK_COUNT; i++){ midi_builder->current_midi_track = current_midi_track->data; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_PRESSURE_COUNT; j++){ pressures[i][j] = rand() % 128; ags_midi_builder_append_change_pressure(midi_builder, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_PULSE_UNIT, AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_CHANNEL, pressures[i][j]); } current_midi_track = current_midi_track->next; } /* build */ ags_midi_builder_build(midi_builder); /* assert */ offset = midi_builder->data; offset += 14; success = TRUE; for(i = 0; i < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_TRACK_COUNT; i++){ offset += 8; ret_size = ags_midi_buffer_util_get_text_event(offset, &delta_time, NULL, NULL); if(delta_time != 0){ success = FALSE; break; } offset += ret_size; for(j = 0; j < AGS_MIDI_BUILDER_TEST_APPEND_CHANGE_PRESSURE_PRESSURE_COUNT; j++){ ret_size = ags_midi_buffer_util_get_change_pressure(offset, &delta_time, &channel, &pressure); if(pressure != pressures[i][j]){ success = FALSE; break; } offset += ret_size; } ret_size = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset += ret_size; } CU_ASSERT(success == TRUE); } void ags_midi_builder_test_append_sysex() { //TODO:JK: implement me } void ags_midi_builder_test_append_quarter_frame() { //TODO:JK: implement me } void ags_midi_builder_test_append_song_position() { //TODO:JK: implement me } void ags_midi_builder_test_append_song_select() { //TODO:JK: implement me } void ags_midi_builder_test_append_tune_request() { //TODO:JK: implement me } void ags_midi_builder_test_append_sequence_number() { //TODO:JK: implement me } void ags_midi_builder_test_append_smtpe() { //TODO:JK: implement me } void ags_midi_builder_test_append_time_signature() { //TODO:JK: implement me } void ags_midi_builder_test_append_key_signature() { //TODO:JK: implement me } void ags_midi_builder_test_append_sequencer_meta_event() { //TODO:JK: implement me } void ags_midi_builder_test_append_text_event() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C\0"); putenv("LANG=C\0"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsMidiBuilderTest\0", ags_midi_builder_test_init_suite, ags_midi_builder_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsMidiBuilder to append header\0", ags_midi_builder_test_append_header) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append track\0", ags_midi_builder_test_append_track) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append key on\0", ags_midi_builder_test_append_key_on) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append key off\0", ags_midi_builder_test_append_key_off) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append key pressure\0", ags_midi_builder_test_append_key_pressure) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append change parameter\0", ags_midi_builder_test_append_change_parameter) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append change pitch bend\0", ags_midi_builder_test_append_change_pitch_bend) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append change program\0", ags_midi_builder_test_append_change_program) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append change pressure\0", ags_midi_builder_test_append_change_pressure) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append sysex\0", ags_midi_builder_test_append_sysex) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append quarter frame\0", ags_midi_builder_test_append_quarter_frame) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append song position\0", ags_midi_builder_test_append_song_position) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append song select\0", ags_midi_builder_test_append_song_select) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append tune request\0", ags_midi_builder_test_append_tune_request) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append sequence number\0", ags_midi_builder_test_append_sequence_number) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append smtpe\0", ags_midi_builder_test_append_smtpe) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append time signature\0", ags_midi_builder_test_append_time_signature) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append key signature\0", ags_midi_builder_test_append_key_signature) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append sequencer meta event\0", ags_midi_builder_test_append_sequencer_meta_event) == NULL) || (CU_add_test(pSuite, "test of AgsMidiBuilder to append text event\0", ags_midi_builder_test_append_text_event) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_functional_fourier_transform_test.c0000644000175000017500000003123213614062654023467 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include gpointer ags_functional_fourier_transform_test_add_thread(gpointer data); int ags_functional_fourier_transform_test_init_suite(); int ags_functional_fourier_transform_test_clean_suite(); void ags_functional_fourier_transform_test_s16(); #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS (2) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_SAMPLERATE (44100) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_BUFFER_SIZE (1024) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_AUDIO_CHANNELS (2) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_SAMPLERATE (44100) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE (1024) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_VOLUME (1.0) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BASE_FREQ (440.0) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FRAME_COUNT (5 * 44100) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_DELAY (8000000) #define AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "thread-pool-max-unused-threads=8\n" \ "max-precision=125\n" \ "\n" \ "[soundcard]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" GThread *add_thread = NULL; AgsAudioApplicationContext *audio_application_context; AgsAudio *output_panel; AgsAudio *wave_player; GObject *output_soundcard; gpointer ags_functional_fourier_transform_test_add_thread(gpointer data) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ exit(CU_get_error()); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalFourierTransformTest", ags_functional_fourier_transform_test_init_suite, ags_functional_fourier_transform_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); exit(CU_get_error()); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_fourier_transform_util.h doing signed 16 bit", ags_functional_fourier_transform_test_s16) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_fourier_transform_test_init_suite() { AgsChannel *channel, *link; AgsConfig *config; GList *start_list; guint i; GError *error; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_CONFIG, strlen(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_CONFIG)); /* audio application context */ audio_application_context = (AgsApplicationContext *) ags_audio_application_context_new(); g_object_ref(audio_application_context); ags_application_context_prepare(audio_application_context); ags_application_context_setup(audio_application_context); /* output soundcard */ output_soundcard = audio_application_context->soundcard->data; start_list = NULL; /* output panel */ output_panel = ags_audio_new(output_soundcard); g_object_ref(output_panel); start_list = g_list_prepend(start_list, output_panel); ags_audio_set_flags(output_panel, (AGS_AUDIO_SYNC)); ags_audio_set_audio_channels(output_panel, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS, 0); ags_audio_set_pads(output_panel, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(output_panel, AGS_TYPE_INPUT, 1, 0); /* ags-play */ ags_recall_factory_create(output_panel, NULL, NULL, "ags-play-master", 0, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS, 0, 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); ags_connectable_connect(AGS_CONNECTABLE(output_panel)); /* wave player */ wave_player = ags_audio_new(output_soundcard); g_object_ref(wave_player); start_list = g_list_prepend(start_list, wave_player); ags_audio_set_flags(wave_player, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(wave_player, (AGS_SOUND_ABILITY_WAVE)); ags_audio_set_audio_channels(wave_player, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS, 0); ags_audio_set_pads(wave_player, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(wave_player, AGS_TYPE_INPUT, 1, 0); channel = wave_player->output; for(i = 0; i < AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS; i++){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_WAVE)); channel = channel->next; } /* ags-play-wave */ ags_recall_factory_create(wave_player, NULL, NULL, "ags-play-wave", 0, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS, 0, 1, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); ags_connectable_connect(AGS_CONNECTABLE(wave_player)); /* */ start_list = g_list_reverse(start_list); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(audio_application_context), start_list); /* link */ channel = output_panel->input; link = wave_player->output; for(i = 0; i < AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_AUDIO_CHANNELS; i++){ error = NULL; ags_channel_set_link(channel, link, &error); channel = channel->next; link = link->next; } return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_fourier_transform_test_clean_suite() { g_object_unref(audio_application_context); return(0); } void ags_functional_fourier_transform_test_s16() { AgsStartAudio *start_audio; AgsStartSoundcard *start_soundcard; AgsCancelAudio *cancel_audio; AgsTaskLauncher *task_launcher; GList *start_wave, *wave; GList *start_buffer, *buffer; GList *task; AgsComplex **ptr_ptr_val; AgsComplex *ptr_val; AgsComplex val; gint16 **ptr_ptr_data; gint16 *ptr_data; gint i, j, k; gboolean success; start_wave = NULL; for(i = 0; i < AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_AUDIO_CHANNELS; i++){ AgsWave *current_wave; current_wave = ags_wave_new(wave_player, i); g_object_set(current_wave, "samplerate", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE, "format", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FORMAT, NULL); start_wave = ags_wave_add(start_wave, current_wave); for(j = 0; j < floor(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FRAME_COUNT / AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE); j++){ AgsBuffer *buffer; gdouble phase; buffer = ags_buffer_new(); g_object_set(buffer, "samplerate", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_SAMPLERATE, "buffer-size", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE, "format", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FORMAT, "x", (guint64) j * AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE, NULL); ags_wave_add_buffer(current_wave, buffer, FALSE); phase = buffer->x % (guint) floor(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_SAMPLERATE / AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BASE_FREQ); ags_synth_util_sin(buffer->data, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BASE_FREQ, phase, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_VOLUME, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_SAMPLERATE, ags_audio_buffer_util_format_from_soundcard(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FORMAT), 0, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE); } } wave_player->wave = start_wave; g_message("playing frequency = %f", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BASE_FREQ); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(audio_application_context)); /* start audio and soundcard task */ task = NULL; start_audio = ags_start_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); task = g_list_prepend(task, start_audio); start_soundcard = ags_start_soundcard_new(audio_application_context); task = g_list_prepend(task, start_soundcard); ags_task_launcher_add_task_all(task_launcher, task); /* delay */ usleep(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_DELAY); /* create cancel task */ cancel_audio = ags_cancel_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); /* append AgsCancelAudio */ ags_task_launcher_add_task(task_launcher, (AgsTask *) cancel_audio); /* */ success = TRUE; wave = start_wave; ptr_val = &val; ptr_ptr_val = &ptr_val; ptr_ptr_data = &ptr_data; for(i = 0; i < AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_AUDIO_CHANNELS; i++){ AgsWave *current_wave; current_wave = wave->data; buffer = start_buffer = current_wave->buffer; for(j = 0; j < floor(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_FRAME_COUNT / AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE); j++){ AgsBuffer *current_buffer; gint16 *data; current_buffer = buffer->data; data = current_buffer->data; for(k = 0; k < AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE; k++){ ptr_data = data + k; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(ptr_data, 1, k, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE, ptr_ptr_val); AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_val, 1, k, AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BUFFER_SIZE, ptr_ptr_data); } } } g_message("playing frequency with transformation = %f", AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_BASE_FREQ); /* start audio and soundcard task */ task = NULL; start_audio = ags_start_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); task = g_list_prepend(task, start_audio); start_soundcard = ags_start_soundcard_new(); task = g_list_prepend(task, start_soundcard); ags_task_launcher_add_task_all(task_launcher, task); /* delay */ usleep(AGS_FUNCTIONAL_FOURIER_TRANSFORM_TEST_S16_DELAY); /* create cancel task */ cancel_audio = ags_cancel_audio_new(wave_player, AGS_SOUND_SCOPE_WAVE); /* append AgsCancelAudio */ ags_task_launcher_add_task(task_launcher, (AgsTask *) cancel_audio); CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { add_thread = g_thread_new("libags_audio.so - functional fourier transform test", ags_functional_fourier_transform_test_add_thread, NULL); g_main_loop_run(g_main_loop_new(g_main_context_default(), FALSE)); g_thread_join(add_thread); return(-1); } gsequencer-3.1.3/ags/test/audio/ags_fifoout_test.c0000644000175000017500000001021513607210263017141 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_fifoout_test_init_suite(); int ags_fifoout_test_clean_suite(); void ags_fifoout_test_dispose(); void ags_fifoout_test_finalize(); void ags_fifoout_test_finalize_stub(GObject *gobject); #define AGS_FIFOOUT_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsAudioApplicationContext *audio_application_context; gboolean fifoout_test_finalized; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_fifoout_test_init_suite() { AgsConfig *config; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FIFOOUT_TEST_CONFIG, strlen(AGS_FIFOOUT_TEST_CONFIG)); audio_application_context = ags_audio_application_context_new(); g_object_ref(audio_application_context); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_fifoout_test_clean_suite() { g_object_unref(audio_application_context); return(0); } void ags_fifoout_test_dispose() { AgsFifoout *fifoout; AgsAudio *audio; GList *list, *list_start; guint i; gboolean success; fifoout = g_object_new(AGS_TYPE_FIFOOUT, NULL); g_object_ref(fifoout); /* run dispose */ g_object_run_dispose(fifoout); success = TRUE; /* assert */ CU_ASSERT(success == TRUE); } void ags_fifoout_test_finalize() { AgsFifoout *fifoout; AgsAudio *audio; guint i; fifoout = g_object_new(AGS_TYPE_FIFOOUT, NULL); /* run dispose */ g_object_run_dispose(fifoout); /* stub finalize */ fifoout_test_finalized = FALSE; G_OBJECT_GET_CLASS(fifoout)->finalize = ags_fifoout_test_finalize_stub; /* unref and assert */ g_object_unref(fifoout); CU_ASSERT(fifoout_test_finalized == TRUE); } void ags_fifoout_test_finalize_stub(GObject *gobject) { fifoout_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFifooutTest", ags_fifoout_test_init_suite, ags_fifoout_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFifoout doing dispose", ags_fifoout_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsFifoout doing finalize", ags_fifoout_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_filter_util_test.c0000644000175000017500000002204213605312646020017 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_filter_util_test_init_suite(); int ags_filter_util_test_clean_suite(); void ags_filter_util_test_pitch_s8(); void ags_filter_util_test_pitch_s16(); void ags_filter_util_test_pitch_s24(); void ags_filter_util_test_pitch_s32(); void ags_filter_util_test_pitch_s64(); void ags_filter_util_test_pitch_float(); void ags_filter_util_test_pitch_double(); void ags_filter_util_test_pitch_complex(); #define AGS_FILTER_UTIL_TEST_FREQ (440.0) #define AGS_FILTER_UTIL_TEST_PHASE (0.0) #define AGS_FILTER_UTIL_TEST_VOLUME (1.0) #define AGS_FILTER_UTIL_TEST_SAMPLERATE (44100) #define AGS_FILTER_UTIL_TEST_OFFSET (0) #define AGS_FILTER_UTIL_TEST_FRAME_COUNT (1024) #define AGS_FILTER_UTIL_TEST_BASE_KEY (0.0) #define AGS_FILTER_UTIL_TEST_TUNING (200.0) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_filter_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_filter_util_test_clean_suite() { return(0); } void ags_filter_util_test_pitch_s8() { gint8 *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_8_BIT); ags_synth_util_sin_s8(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_s8(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_s16() { gint16 *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_16_BIT); ags_synth_util_sin_s16(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_s16(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_s24() { gint32 *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_24_BIT); ags_synth_util_sin_s24(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_s24(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_s32() { gint32 *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_32_BIT); ags_synth_util_sin_s32(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_s32(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_s64() { gint64 *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_SIGNED_64_BIT); ags_synth_util_sin_s64(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_s64(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_float() { gfloat *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_FLOAT); ags_synth_util_sin_float(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_float(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_double() { gdouble *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_DOUBLE); ags_synth_util_sin_double(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_double(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } void ags_filter_util_test_pitch_complex() { AgsComplex *buffer; gboolean success; buffer = ags_stream_alloc(AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_SOUNDCARD_COMPLEX); ags_synth_util_sin_complex(buffer, AGS_FILTER_UTIL_TEST_FREQ, AGS_FILTER_UTIL_TEST_PHASE, AGS_FILTER_UTIL_TEST_VOLUME, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_OFFSET, AGS_FILTER_UTIL_TEST_FRAME_COUNT); ags_filter_util_pitch_complex(buffer, AGS_FILTER_UTIL_TEST_FRAME_COUNT, AGS_FILTER_UTIL_TEST_SAMPLERATE, AGS_FILTER_UTIL_TEST_BASE_KEY, AGS_FILTER_UTIL_TEST_TUNING); success = TRUE; //TODO:JK: implement me CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFMSynthUtilTest", ags_filter_util_test_init_suite, ags_filter_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_filter_util.c pitch signed 8 bit", ags_filter_util_test_pitch_s8) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch signed 16 bit", ags_filter_util_test_pitch_s16) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch signed 24 bit", ags_filter_util_test_pitch_s24) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch signed 32 bit", ags_filter_util_test_pitch_s32) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch signed 64 bit", ags_filter_util_test_pitch_s64) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch float", ags_filter_util_test_pitch_float) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch double", ags_filter_util_test_pitch_double) == NULL) || (CU_add_test(pSuite, "test of ags_filter_util.c pitch complex", ags_filter_util_test_pitch_complex) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_note_test.c0000644000175000017500000001205113605312646016441 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_note_test_init_suite(); int ags_note_test_clean_suite(); void ags_note_test_find_prev(); void ags_note_test_find_next(); void ags_note_test_to_raw_midi(); void ags_note_test_to_seq_event(); void ags_note_test_from_raw_midi(); void ags_note_test_from_seq_event(); void ags_note_test_duplicate(); #define AGS_NOTE_TEST_FIND_PREV_COUNT (128) #define AGS_NOTE_TEST_FIND_NEXT_COUNT (128) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_note_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_note_test_clean_suite() { return(0); } void ags_note_test_find_prev() { AgsNote *note[AGS_NOTE_TEST_FIND_PREV_COUNT]; GList *list, *current; guint x0, y; guint i; gboolean success; /* create some notes */ list = NULL; for(i = 0; i < AGS_NOTE_TEST_FIND_PREV_COUNT; i++){ x0 = rand() % 256; y = rand() % 8; note[i] = g_object_new(AGS_TYPE_NOTE, "x0", x0, "x1", x0 + 1, "y", y, NULL); list = g_list_prepend(list, note[i]); } list = g_list_sort(list, ags_note_sort_func); /* assert find prev */ success = TRUE; for(i = 0; list != NULL; i += 16){ x0 = i; y = rand() % 8; current = ags_note_find_prev(list, x0, y); if(current != NULL && (AGS_NOTE(current->data)->x[0] > x0 || AGS_NOTE(current->data)->y != y)){ success = FALSE; break; } list = list->next; } CU_ASSERT(success == TRUE); } void ags_note_test_find_next() { AgsNote *note[AGS_NOTE_TEST_FIND_NEXT_COUNT]; GList *list, *current; guint x0, y; guint i; gboolean success; /* create some notes */ list = NULL; for(i = 0; i < AGS_NOTE_TEST_FIND_NEXT_COUNT; i++){ x0 = rand() % 256; y = rand() % 8; note[i] = g_object_new(AGS_TYPE_NOTE, "x0", x0, "x1", x0 + 1, "y", y, NULL); list = g_list_prepend(list, note[i]); } list = g_list_sort(list, ags_note_sort_func); /* assert find next */ success = TRUE; for(i = 0; list != NULL; i += 16){ x0 = i; y = rand() % 8; current = ags_note_find_next(list, x0, y); if(current != NULL && (AGS_NOTE(current->data)->x[0] < x0 || AGS_NOTE(current->data)->y != y)){ success = FALSE; break; } list = list->next; } CU_ASSERT(success == TRUE); } void ags_note_test_to_raw_midi() { //TODO:JK: implement me } void ags_note_test_to_seq_event() { //TODO:JK: implement me } void ags_note_test_from_raw_midi() { //TODO:JK: implement me } void ags_note_test_from_seq_event() { //TODO:JK: implement me } void ags_note_test_duplicate() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsNoteTest", ags_note_test_init_suite, ags_note_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsNote find prev", ags_note_test_find_prev) == NULL) || (CU_add_test(pSuite, "test of AgsNote find next", ags_note_test_find_next) == NULL) || (CU_add_test(pSuite, "test of AgsNote to raw midi", ags_note_test_to_raw_midi) == NULL) || (CU_add_test(pSuite, "test of AgsNote to seq event", ags_note_test_to_seq_event) == NULL) || (CU_add_test(pSuite, "test of AgsNote from raw midi", ags_note_test_from_raw_midi) == NULL) || (CU_add_test(pSuite, "test of AgsNote from seq event", ags_note_test_from_seq_event) == NULL) || (CU_add_test(pSuite, "test of AgsNote duplicate", ags_note_test_duplicate) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_test.c0000644000175000017500000005613013605312646016744 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_recall_test_init_suite(); int ags_recall_test_clean_suite(); void ags_recall_test_resolve_dependency(); void ags_recall_test_child_added(); void ags_recall_test_run_init_pre(); void ags_recall_test_run_init_inter(); void ags_recall_test_run_init_post(); void ags_recall_test_stop_persistent(); void ags_recall_test_done(); void ags_recall_test_cancel(); void ags_recall_test_is_done(); void ags_recall_test_duplicate(); void ags_recall_test_set_recall_id(); void ags_recall_test_notify_dependency(); void ags_recall_test_add_dependency(); void ags_recall_test_remove_dependency(); void ags_recall_test_get_dependency(); void ags_recall_test_remove_child(); void ags_recall_test_add_child(); void ags_recall_test_get_by_effect(); void ags_recall_test_find_recall_id_with_effect(); void ags_recall_test_find_type(); void ags_recall_test_find_template(); void ags_recall_test_template_find_type(); void ags_recall_test_template_find_all_type(); void ags_recall_test_find_type_with_recycling_context(); void ags_recall_test_find_recycling_context(); void ags_recall_test_find_provider(); void ags_recall_test_template_find_provider(); void ags_recall_test_find_provider_with_recycling_context(); void ags_recall_test_run_init(); void ags_recall_test_add_handler(); void ags_recall_test_remove_handler(); void ags_recall_test_lock_port(); void ags_recall_test_unlock_port(); void ags_recall_test_callback(AgsRecall *recall, gpointer data); void ags_recall_test_child_added_callback(AgsRecall *recall, AgsRecall *child, gpointer data); AgsRecall* ags_recall_test_duplicate_callback(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar *parameter_name, GValue *value, gpointer data); #define AGS_RECALL_RUN_INIT_PRE_N_CHILDREN (4) #define AGS_RECALL_RUN_INIT_INTER_N_CHILDREN (4) #define AGS_RECALL_RUN_INIT_POST_N_CHILDREN (4) #define AGS_RECALL_RUN_PRE_N_CHILDREN (4) #define AGS_RECALL_RUN_INTER_N_CHILDREN (4) #define AGS_RECALL_RUN_POST_N_CHILDREN (4) #define AGS_RECALL_TEST_IS_DONE_RECYCLING_CONTEXT_COUNT (2) #define AGS_RECALL_TEST_IS_DONE_RECALL_COUNT (16) #define AGS_RECALL_TEST_DUPLICATE_TEMPLATE_COUNT (5) #define AGS_RECALL_TEST_DUPLICATE_RECALL_ID_COUNT (2) #define AGS_RECALL_TEST_SET_RECALL_ID_CHILDREN_COUNT (16) #define AGS_RECALL_TEST_REMOVE_CHILD_CHILDREN_COUNT (16) #define AGS_RECALL_TEST_ADD_CHILD_CHILDREN_COUNT (16) #define AGS_RECALL_TEST_GET_BY_EFFECT_RECALL_COUNT (4) #define AGS_RECALL_TEST_GET_BY_EFFECT_LADSPA_RECALL_COUNT (16) AgsDevout *devout; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_test_init_suite() { devout = g_object_new(AGS_TYPE_DEVOUT, NULL); g_object_ref(devout); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_test_clean_suite() { g_object_unref(devout); return(0); } void ags_recall_test_callback(AgsRecall *recall, gpointer data) { *((guint *) data) += 1; } void ags_recall_test_resolve_dependency() { AgsRecall *recall; guint data; /* create recall */ recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "resolve-dependency", G_CALLBACK(ags_recall_test_callback), &data); /* assert callback invoked */ data = 0; ags_recall_resolve_dependency(recall); CU_ASSERT(data == 1); } void ags_recall_test_child_added_callback(AgsRecall *recall, AgsRecall *child, gpointer data) { *((guint *) data) += 1; } void ags_recall_test_child_added() { AgsRecall *recall; guint data; /* create recall */ recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "child-added", G_CALLBACK(ags_recall_test_child_added_callback), &data); /* assert callback invoked */ data = 0; ags_recall_child_added(recall, NULL); CU_ASSERT(data == 1); } void ags_recall_test_run_init_pre() { AgsRecall *recall; AgsRecall **child; guint data; guint i; recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "run-init-pre", G_CALLBACK(ags_recall_test_callback), &data); child = (AgsRecall **) malloc(AGS_RECALL_RUN_INIT_PRE_N_CHILDREN * sizeof(AgsRecall *)); for(i = 0; i < AGS_RECALL_RUN_INIT_PRE_N_CHILDREN; i++){ child[i] = ags_recall_new(); ags_recall_add_child(recall, child[i]); g_signal_connect(G_OBJECT(child[i]), "run-init-pre", G_CALLBACK(ags_recall_test_callback), &data); } /* assert callback invoked */ data = 0; ags_recall_run_init_pre(recall); CU_ASSERT(data == (AGS_RECALL_RUN_INIT_PRE_N_CHILDREN + 1)); } void ags_recall_test_run_init_inter() { AgsRecall *recall; AgsRecall **child; guint data; guint i; recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "run-init-inter", G_CALLBACK(ags_recall_test_callback), &data); child = (AgsRecall **) malloc(AGS_RECALL_RUN_INIT_INTER_N_CHILDREN * sizeof(AgsRecall *)); for(i = 0; i < AGS_RECALL_RUN_INIT_INTER_N_CHILDREN; i++){ child[i] = ags_recall_new(); ags_recall_add_child(recall, child[i]); g_signal_connect(G_OBJECT(child[i]), "run-init-inter", G_CALLBACK(ags_recall_test_callback), &data); } /* assert callback invoked */ data = 0; ags_recall_run_init_inter(recall); CU_ASSERT(data == (AGS_RECALL_RUN_INIT_INTER_N_CHILDREN + 1)); } void ags_recall_test_run_init_post() { AgsRecall *recall; AgsRecall **child; guint data; guint i; recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "run-init-post", G_CALLBACK(ags_recall_test_callback), &data); child = (AgsRecall **) malloc(AGS_RECALL_RUN_INIT_POST_N_CHILDREN * sizeof(AgsRecall *)); for(i = 0; i < AGS_RECALL_RUN_INIT_POST_N_CHILDREN; i++){ child[i] = ags_recall_new(); ags_recall_add_child(recall, child[i]); g_signal_connect(G_OBJECT(child[i]), "run-init-post", G_CALLBACK(ags_recall_test_callback), &data); } /* assert callback invoked */ data = 0; ags_recall_run_init_post(recall); CU_ASSERT(data == (AGS_RECALL_RUN_INIT_POST_N_CHILDREN + 1)); } void ags_recall_test_stop_persistent() { AgsRecall *recall; guint data; /* playback */ recall = ags_recall_new(); recall->behaviour_flags |= (AGS_SOUND_BEHAVIOUR_PERSISTENT | AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK); g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &data); /* assert callback invoked */ data = 0; ags_recall_stop_persistent(recall); CU_ASSERT(((AGS_SOUND_BEHAVIOUR_PERSISTENT & (recall->behaviour_flags)) == 0) && ((AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK & (recall->behaviour_flags)) == 0) && data == 1); /* sequencer */ recall = ags_recall_new(); recall->behaviour_flags |= (AGS_SOUND_BEHAVIOUR_PERSISTENT | AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER); g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &data); /* assert callback invoked */ data = 0; ags_recall_stop_persistent(recall); CU_ASSERT(((AGS_SOUND_BEHAVIOUR_PERSISTENT & (recall->behaviour_flags)) == 0) && ((AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER & (recall->behaviour_flags)) == 0) && data == 1); /* notation */ recall = ags_recall_new(); recall->behaviour_flags |= (AGS_SOUND_BEHAVIOUR_PERSISTENT | AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION); g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &data); /* assert callback invoked */ data = 0; ags_recall_stop_persistent(recall); CU_ASSERT(((AGS_SOUND_BEHAVIOUR_PERSISTENT & (recall->behaviour_flags)) == 0) && ((AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION & (recall->behaviour_flags)) == 0) && data == 1); } void ags_recall_test_done() { AgsRecall *recall; guint data; /* recall */ recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &data); /* assert callback invoked */ data = 0; ags_recall_set_staging_flags(recall, AGS_SOUND_STAGING_DONE); CU_ASSERT(((AGS_SOUND_STAGING_DONE & (recall->staging_flags)) != 0) && data == 1); /* persistent recall */ //FIXME:JK: doesn't pass recall = ags_recall_new(); recall->behaviour_flags |= AGS_SOUND_BEHAVIOUR_PERSISTENT; g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &data); /* assert callback not invoked */ data = 0; ags_recall_set_staging_flags(recall, AGS_SOUND_STAGING_DONE); CU_ASSERT(((AGS_SOUND_STAGING_DONE & (recall->staging_flags)) == 0) && data == 0); } void ags_recall_test_cancel() { AgsRecall *recall; guint cancel_data, done_data; /* recall */ recall = ags_recall_new(); g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &done_data); g_signal_connect(G_OBJECT(recall), "cancel", G_CALLBACK(ags_recall_test_callback), &cancel_data); /* assert callback invoked */ done_data = 0; cancel_data = 0; ags_recall_cancel(recall); CU_ASSERT(((AGS_SOUND_STAGING_DONE & (recall->staging_flags)) != 0) && done_data == 1 && cancel_data == 1); /* persistent recall */ recall = ags_recall_new(); recall->behaviour_flags |= AGS_SOUND_BEHAVIOUR_PERSISTENT; g_signal_connect(G_OBJECT(recall), "done", G_CALLBACK(ags_recall_test_callback), &done_data); g_signal_connect(G_OBJECT(recall), "cancel", G_CALLBACK(ags_recall_test_callback), &cancel_data); /* assert callback invoked */ done_data = 0; cancel_data = 0; ags_recall_cancel(recall); CU_ASSERT(((AGS_SOUND_STAGING_DONE & (recall->staging_flags)) != 0) && done_data == 1 && cancel_data == 1); } void ags_recall_test_is_done() { AgsRecall *recall; AgsRecallID *recall_id; AgsRecyclingContext *test_recycling_context, *recycling_context; GList *list; guint i, j; gboolean is_done; /* recalls not done */ test_recycling_context = NULL; list = NULL; for(i = 0; i < AGS_RECALL_TEST_IS_DONE_RECYCLING_CONTEXT_COUNT; i++){ recycling_context = ags_recycling_context_new(0); if(i == 0){ test_recycling_context = recycling_context; } for(j = 0; j < AGS_RECALL_TEST_IS_DONE_RECALL_COUNT; j++){ recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); recall = g_object_new(AGS_TYPE_RECALL, "recall-id", recall_id, NULL); if(i != 0){ recall->staging_flags |= AGS_SOUND_STAGING_DONE; } list = g_list_prepend(list, recall); } } is_done = ags_recall_is_done(list, test_recycling_context); CU_ASSERT(is_done == FALSE); /* recalls done */ test_recycling_context = NULL; list = NULL; for(i = 0; i < AGS_RECALL_TEST_IS_DONE_RECYCLING_CONTEXT_COUNT; i++){ recycling_context = ags_recycling_context_new(0); if(i == 0){ test_recycling_context = recycling_context; } for(j = 0; j < AGS_RECALL_TEST_IS_DONE_RECALL_COUNT; j++){ recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); recall = g_object_new(AGS_TYPE_RECALL, "recall-id", recall_id, NULL); if(i == 0){ recall->staging_flags |= AGS_SOUND_STAGING_DONE; } list = g_list_prepend(list, recall); } } is_done = ags_recall_is_done(list, test_recycling_context); CU_ASSERT(is_done == TRUE); } AgsRecall* ags_recall_test_duplicate_callback(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar *parameter_name, GValue *value, gpointer data) { *((guint *) data) += 1; return(NULL); } void ags_recall_test_duplicate() { AgsRecall *recall; AgsRecallContainer *recall_container; AgsRecyclingContext *recycling_context; AgsRecallID *recall_id; GList *list, *start; guint data; guint i; /* create recall templates */ start = NULL; for(i = 0; i < AGS_RECALL_TEST_DUPLICATE_TEMPLATE_COUNT; i++){ recall = g_object_new(AGS_TYPE_RECALL, NULL); recall_container = g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); g_object_set(recall, "output-soundcard", devout, "recall-container", recall_container, NULL); recall->flags |= AGS_RECALL_TEMPLATE; g_signal_connect(G_OBJECT(recall), "duplicate", G_CALLBACK(ags_recall_test_duplicate_callback), &data); start = g_list_prepend(start, recall); g_object_ref(recall); } /* assert duplicate */ data = 0; for(i = 0; i < AGS_RECALL_TEST_DUPLICATE_RECALL_ID_COUNT; i++){ recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, NULL); recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); list = start; while(list != NULL){ ags_recall_duplicate(list->data, recall_id, NULL, NULL, NULL); list = list->next; } } CU_ASSERT(data == (AGS_RECALL_TEST_DUPLICATE_RECALL_ID_COUNT * AGS_RECALL_TEST_DUPLICATE_TEMPLATE_COUNT)); } void ags_recall_test_set_recall_id() { AgsRecall *recall, *child; AgsRecallID *recall_id; GList *list; guint i; gboolean success; recall = g_object_new(AGS_TYPE_RECALL, NULL); for(i = 0; i < AGS_RECALL_TEST_SET_RECALL_ID_CHILDREN_COUNT; i++){ child = g_object_new(AGS_TYPE_RECALL, NULL); ags_recall_add_child(recall, child); } /* assert recall id set */ recall_id = g_object_new(AGS_TYPE_RECALL_ID, NULL); success = TRUE; ags_recall_set_recall_id(recall, recall_id); CU_ASSERT(recall->recall_id == recall_id); list = recall->children; while(list != NULL){ if(AGS_RECALL(list->data)->recall_id != recall_id){ success = FALSE; break; } list = list->next; } CU_ASSERT(success == TRUE); } void ags_recall_test_notify_dependency() { //TODO:JK: implement me } void ags_recall_test_add_dependency() { //TODO:JK: implement me } void ags_recall_test_remove_dependency() { //TODO:JK: implement me } void ags_recall_test_get_dependency() { //TODO:JK: implement me } void ags_recall_test_remove_child() { AgsRecall *recall, *child; GList *list, *list_next; gboolean success; guint i; /* create recall */ recall = g_object_new(AGS_TYPE_RECALL, NULL); for(i = 0; i < AGS_RECALL_TEST_REMOVE_CHILD_CHILDREN_COUNT; i++){ child = g_object_new(AGS_TYPE_RECALL, NULL); ags_recall_add_child(recall, child); } /* assert removed */ list = recall->children; success = TRUE; while(list != NULL){ list_next = list->next; child = list->data; ags_recall_remove_child(recall, child); if(g_list_find(recall->children, child) != NULL){ success = FALSE; break; } list = list_next; } CU_ASSERT(success == TRUE && recall->children == NULL); } void ags_recall_test_add_child() { AgsRecall *recall, *child; gboolean success; guint i; /* create recall and assert child to be present */ recall = g_object_new(AGS_TYPE_RECALL, NULL); success = TRUE; for(i = 0; i < AGS_RECALL_TEST_ADD_CHILD_CHILDREN_COUNT; i++){ child = g_object_new(AGS_TYPE_RECALL, NULL); ags_recall_add_child(recall, child); if(g_list_find(recall->children, child) == NULL){ success = FALSE; break; } } CU_ASSERT(success == TRUE && recall->children != NULL); } void ags_recall_test_get_by_effect() { AgsRecall *recall; AgsRecallLadspa *recall_ladspa; GList *list, *current; guint nth; guint i; guint effect_added[4]; static const gchar *filename[] = { "echo.so", "echo.so", "noise.so", NULL, }; static const gchar *effect[] = { "delay", "feedback", "noise", NULL, }; list = NULL; memset(effect_added, 0, 4 * sizeof(guint)); for(i = 0; i < AGS_RECALL_TEST_GET_BY_EFFECT_RECALL_COUNT; i++){ recall = g_object_new(AGS_TYPE_RECALL, NULL); list = g_list_prepend(list, recall); } for(i = 0; i < AGS_RECALL_TEST_GET_BY_EFFECT_LADSPA_RECALL_COUNT; i++){ nth = rand() % 3; effect_added[nth] += 1; recall_ladspa = g_object_new(AGS_TYPE_RECALL_LADSPA, "filename", filename[nth], "effect", effect[nth], NULL); list = g_list_prepend(list, recall_ladspa); } list = g_list_reverse(list); /* assert 1st filename and effect */ current = ags_recall_get_by_effect(list, filename[0], effect[0]); if(effect_added[0] > 0){ CU_ASSERT(g_list_length(current) == effect_added[0]); }else{ CU_ASSERT(current == NULL); } /* assert 2nd filename and effect */ current = ags_recall_get_by_effect(list, filename[1], effect[1]); if(effect_added[1] > 0){ CU_ASSERT(g_list_length(current) == effect_added[1]); }else{ CU_ASSERT(current == NULL); } /* assert 3rd filename and effect */ current = ags_recall_get_by_effect(list, filename[2], effect[2]); if(effect_added[2] > 0){ CU_ASSERT(g_list_length(current) == effect_added[2]); }else{ CU_ASSERT(current == NULL); } } void ags_recall_test_find_recall_id_with_effect() { //TODO:JK: implement me } void ags_recall_test_find_type() { //TODO:JK: implement me } void ags_recall_test_find_template() { //TODO:JK: implement me } void ags_recall_test_template_find_type() { //TODO:JK: implement me } void ags_recall_test_template_find_all_type() { //TODO:JK: implement me } void ags_recall_test_find_type_with_recycling_context() { //TODO:JK: implement me } void ags_recall_test_find_recycling_context() { //TODO:JK: implement me } void ags_recall_test_find_provider() { //TODO:JK: implement me } void ags_recall_test_template_find_provider() { //TODO:JK: implement me } void ags_recall_test_find_provider_with_recycling_context() { //TODO:JK: implement me } void ags_recall_test_run_init() { //TODO:JK: implement me } void ags_recall_test_add_handler() { //TODO:JK: implement me } void ags_recall_test_remove_handler() { //TODO:JK: implement me } void ags_recall_test_lock_port() { //TODO:JK: implement me } void ags_recall_test_unlock_port() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallTest", ags_recall_test_init_suite, ags_recall_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecall resolve dependency", ags_recall_test_resolve_dependency) == NULL) || (CU_add_test(pSuite, "test of AgsRecall child added", ags_recall_test_child_added) == NULL) || (CU_add_test(pSuite, "test of AgsRecall run init pre", ags_recall_test_run_init_pre) == NULL) || (CU_add_test(pSuite, "test of AgsRecall run init inter", ags_recall_test_run_init_inter) == NULL) || (CU_add_test(pSuite, "test of AgsRecall run init post", ags_recall_test_run_init_post) == NULL) || (CU_add_test(pSuite, "test of AgsRecall stop persistent", ags_recall_test_stop_persistent) == NULL) || (CU_add_test(pSuite, "test of AgsRecall done", ags_recall_test_done) == NULL) || (CU_add_test(pSuite, "test of AgsRecall cancel", ags_recall_test_cancel) == NULL) || (CU_add_test(pSuite, "test of AgsRecall is done", ags_recall_test_is_done) == NULL) || (CU_add_test(pSuite, "test of AgsRecall duplicate", ags_recall_test_duplicate) == NULL) || (CU_add_test(pSuite, "test of AgsRecall set recall id", ags_recall_test_set_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsRecall notify dependency", ags_recall_test_notify_dependency) == NULL) || (CU_add_test(pSuite, "test of AgsRecall add dependency", ags_recall_test_add_dependency) == NULL) || (CU_add_test(pSuite, "test of AgsRecall remove dependency", ags_recall_test_remove_dependency) == NULL) || (CU_add_test(pSuite, "test of AgsRecall get dependency", ags_recall_test_get_dependency) == NULL) || (CU_add_test(pSuite, "test of AgsRecall remove child", ags_recall_test_remove_child) == NULL) || (CU_add_test(pSuite, "test of AgsRecall add child", ags_recall_test_add_child) == NULL) || (CU_add_test(pSuite, "test of AgsRecall get by effect", ags_recall_test_get_by_effect) == NULL) || (CU_add_test(pSuite, "test of AgsRecall find type", ags_recall_test_find_type) == NULL) || (CU_add_test(pSuite, "test of AgsRecall find template", ags_recall_test_find_template) == NULL) || (CU_add_test(pSuite, "test of AgsRecall template find type", ags_recall_test_template_find_type) == NULL) || (CU_add_test(pSuite, "test of AgsRecall template find all type", ags_recall_test_template_find_all_type) == NULL) || (CU_add_test(pSuite, "test of AgsRecall find type with recycling context", ags_recall_test_find_type_with_recycling_context) == NULL) || (CU_add_test(pSuite, "test of AgsRecall find recycling context", ags_recall_test_find_recycling_context) == NULL) || (CU_add_test(pSuite, "test of AgsRecall find provider", ags_recall_test_find_provider) == NULL) || (CU_add_test(pSuite, "test of AgsRecall template find provider", ags_recall_test_template_find_provider) == NULL) || (CU_add_test(pSuite, "test of AgsRecall find provider with recycling context", ags_recall_test_find_provider_with_recycling_context) == NULL) || (CU_add_test(pSuite, "test of AgsRecall run init", ags_recall_test_run_init) == NULL) || (CU_add_test(pSuite, "test of AgsRecall add handler", ags_recall_test_add_handler) == NULL) || (CU_add_test(pSuite, "test of AgsRecall remove handler", ags_recall_test_remove_handler) == NULL) || (CU_add_test(pSuite, "test of AgsRecall lock port", ags_recall_test_lock_port) == NULL) || (CU_add_test(pSuite, "test of AgsRecall unlock port", ags_recall_test_unlock_port) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_channel_run_test.c0000644000175000017500000000421313605312646021313 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_recall_channel_run_test_init_suite(); int ags_recall_channel_run_test_clean_suite(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_channel_run_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_channel_run_test_clean_suite() { return(0); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; #if 0 /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallChannelRunTest", ags_recall_channel_run_test_init_suite, ags_recall_channel_run_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if(){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); #endif return(0); } gsequencer-3.1.3/ags/test/audio/ags_audio_signal_test.c0000644000175000017500000001320313605312646020132 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_audio_signal_test_init_suite(); int ags_audio_signal_test_clean_suite(); void ags_audio_signal_test_add_stream(); void ags_audio_signal_test_resize_stream(); void ags_audio_signal_test_realloc_buffer_size(); void ags_audio_signal_test_copy_buffer_to_buffer(); void ags_audio_signal_test_copy_double_buffer_to_buffer(); void ags_audio_signal_test_duplicate_stream(); void ags_audio_signal_test_get_template(); void ags_audio_signal_test_get_stream_current(); void ags_audio_signal_test_get_by_recall_id(); void ags_audio_signal_test_tile(); void ags_audio_signal_test_scale(); #define AGS_AUDIO_SIGNAL_TEST_GET_TEMPLATE_N_AUDIO_SIGNAL (3) #define AGS_AUDIO_SIGNAL_TEST_GET_STREAM_CURRENT_N_AUDIO_SIGNAL (6) AgsDevout *devout; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_signal_test_init_suite() { devout = ags_devout_new(NULL); g_object_ref(devout); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_signal_test_clean_suite() { g_object_unref(devout); return(0); } void ags_audio_signal_test_add_stream() { AgsAudioSignal *audio_signal; /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), NULL, NULL); /* assert add stream */ CU_ASSERT(audio_signal->stream == NULL); ags_audio_signal_add_stream(audio_signal); CU_ASSERT(audio_signal->stream != NULL); CU_ASSERT(g_list_length(audio_signal->stream) == 1); } void ags_audio_signal_test_resize_stream() { AgsAudioSignal *audio_signal; /* instantiate audio signal */ audio_signal = ags_audio_signal_new(G_OBJECT(devout), NULL, NULL); /* assert resize stream */ CU_ASSERT(audio_signal->stream == NULL); ags_audio_signal_stream_resize(audio_signal, 5); CU_ASSERT(audio_signal->stream != NULL); CU_ASSERT(g_list_length(audio_signal->stream) == 5); } void ags_audio_signal_test_realloc_buffer_size() { //TODO:JK: implement me } void ags_audio_signal_test_copy_buffer_to_buffer() { //TODO:JK: implement me } void ags_audio_signal_test_copy_double_buffer_to_buffer() { //TODO:JK: implement me } void ags_audio_signal_test_duplicate_stream() { //TODO:JK: implement me } void ags_audio_signal_test_get_template() { //TODO:JK: implement me } void ags_audio_signal_test_get_stream_current() { //TODO:JK: implement me } void ags_audio_signal_test_get_by_recall_id() { //TODO:JK: implement me } void ags_audio_signal_test_tile() { //TODO:JK: implement me } void ags_audio_signal_test_scale() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAudioSignalTest", ags_audio_signal_test_init_suite, ags_audio_signal_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAudioSignal add stream", ags_audio_signal_test_add_stream) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal resize stream", ags_audio_signal_test_resize_stream) == NULL) /* || (CU_add_test(pSuite, "test of AgsAudioSignal realloc buffer size", ags_audio_signal_test_realloc_buffer_size) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal copy buffer to buffer", ags_audio_signal_test_copy_buffer_to_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal copy double buffer to buffer", ags_audio_signal_test_copy_double_buffer_to_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal duplicate stream", ags_audio_signal_test_duplicate_stream) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal get template", ags_audio_signal_test_get_template) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal get stream current", ags_audio_signal_test_get_stream_current) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal get by recall id", ags_audio_signal_test_get_by_recall_id) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal tile", ags_audio_signal_test_tile) == NULL) || (CU_add_test(pSuite, "test of AgsAudioSignal scale", ags_audio_signal_test_scale) == NULL) */ ){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_char_buffer_util_test.c0000644000175000017500000001442713605312646021010 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_char_buffer_util_test_init_suite(); int ags_char_buffer_util_test_clean_suite(); void ags_char_buffer_util_test_copy_s8_to_cbuffer(); void ags_char_buffer_util_test_copy_s16_to_cbuffer(); void ags_char_buffer_util_test_copy_s24_to_cbuffer(); void ags_char_buffer_util_test_copy_s32_to_cbuffer(); void ags_char_buffer_util_test_copy_s64_to_cbuffer(); void ags_char_buffer_util_test_copy_float_to_cbuffer(); void ags_char_buffer_util_test_copy_double_to_cbuffer(); void ags_char_buffer_util_test_copy_cbuffer_to_s8(); void ags_char_buffer_util_test_copy_cbuffer_to_s16(); void ags_char_buffer_util_test_copy_cbuffer_to_s24(); void ags_char_buffer_util_test_copy_cbuffer_to_s32(); void ags_char_buffer_util_test_copy_cbuffer_to_s64(); void ags_char_buffer_util_test_copy_cbuffer_to_float(); void ags_char_buffer_util_test_copy_cbuffer_to_double(); void ags_char_buffer_util_test_copy_buffer_to_buffer(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_char_buffer_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_char_buffer_util_test_clean_suite() { return(0); } void ags_char_buffer_util_test_copy_s8_to_cbuffer() { CU_ASSERT(TRUE); //TODO:JK: implement me } void ags_char_buffer_util_test_copy_s16_to_cbuffer() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_s24_to_cbuffer() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_s32_to_cbuffer() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_s64_to_cbuffer() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_float_to_cbuffer() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_double_to_cbuffer() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_s8() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_s16() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_s24() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_s32() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_s64() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_float() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_cbuffer_to_double() { //TODO:JK: implement me } void ags_char_buffer_util_test_copy_buffer_to_buffer() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCharBufferUtilTest", ags_char_buffer_util_test_init_suite, ags_char_buffer_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s8 to cbuffer", ags_char_buffer_util_test_copy_s8_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_s16_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_s24_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_s32_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_s64_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_float_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_double_to_cbuffer) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy s16 to cbuffer", ags_char_buffer_util_test_copy_cbuffer_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_char_buffer_util.c copy buffer to buffer", ags_char_buffer_util_test_copy_buffer_to_buffer) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_track_test.c0000644000175000017500000000551613605312646016610 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_track_test_init_suite(); int ags_track_test_clean_suite(); void ags_track_test_duplicate(); #define AGS_TRACK_TEST_DUPLICATE_X_0 (17) #define AGS_TRACK_TEST_DUPLICATE_X_1 (3 * AGS_MIDI_DEFAULT_OFFSET + 17) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_track_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_track_test_clean_suite() { return(0); } void ags_track_test_duplicate() { AgsTrack *track, *copy_track; /* create track - #0 */ track = g_object_new(AGS_TYPE_TRACK, "x", (guint64) AGS_TRACK_TEST_DUPLICATE_X_0, NULL); /* assert duplicate - #0 */ copy_track = ags_track_duplicate(track); CU_ASSERT(AGS_IS_TRACK(copy_track) && copy_track->x == track->x); /* create track - #1 */ track = g_object_new(AGS_TYPE_TRACK, "x", (guint64) AGS_TRACK_TEST_DUPLICATE_X_1, NULL); /* assert duplicate - #1 */ copy_track = ags_track_duplicate(track); CU_ASSERT(AGS_IS_TRACK(copy_track) && copy_track->x == track->x); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsTrackTest", ags_track_test_init_suite, ags_track_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsTrack duplicate", ags_track_test_duplicate) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_synth_generator_test.c0000644000175000017500000001001513605312646020705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_synth_generator_test_init_suite(); int ags_synth_generator_test_clean_suite(); void ags_synth_generator_test_compute(); #define AGS_SYNTH_GENERATOR_TEST_AUDIO_SIGNAL_LENGTH (24) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_synth_generator_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_synth_generator_test_clean_suite() { return(0); } void ags_synth_generator_test_compute() { AgsAudioSignal *audio_signal; AgsSynthGenerator *synth_generator; GList *list; guint xcross_count; audio_signal = ags_audio_signal_new(NULL, NULL, NULL); ags_audio_signal_stream_resize(audio_signal, AGS_SYNTH_GENERATOR_TEST_AUDIO_SIGNAL_LENGTH); synth_generator = ags_synth_generator_new(); /* test - note 0.0 */ synth_generator->oscillator = AGS_SYNTH_GENERATOR_OSCILLATOR_SIN; synth_generator->frequency = 440.0; synth_generator->volume = 0.5; synth_generator->frame_count = AGS_SYNTH_GENERATOR_TEST_AUDIO_SIGNAL_LENGTH * audio_signal->buffer_size; ags_synth_generator_compute(synth_generator, audio_signal, 0.0); list = audio_signal->stream; xcross_count = 0; while(list != NULL){ xcross_count += ags_synth_util_get_xcross_count(list->data, ags_audio_buffer_util_format_from_soundcard(audio_signal->format), audio_signal->buffer_size); list = list->next; } CU_ASSERT(xcross_count > 0); /* test - note 48.0 */ synth_generator->oscillator = AGS_SYNTH_GENERATOR_OSCILLATOR_SIN; synth_generator->frequency = 440.0; synth_generator->volume = 0.5; synth_generator->frame_count = AGS_SYNTH_GENERATOR_TEST_AUDIO_SIGNAL_LENGTH * audio_signal->buffer_size; ags_synth_generator_compute(synth_generator, audio_signal, 48.0); list = audio_signal->stream; xcross_count = 0; while(list != NULL){ xcross_count += ags_synth_util_get_xcross_count(list->data, ags_audio_buffer_util_format_from_soundcard(audio_signal->format), audio_signal->buffer_size); list = list->next; } CU_ASSERT(xcross_count > 0); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSynthGeneratorTest", ags_synth_generator_test_init_suite, ags_synth_generator_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSynthGenerator compute", ags_synth_generator_test_compute) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_port_test.c0000644000175000017500000001161613605312646016466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_port_test_init_suite(); int ags_port_test_clean_suite(); void ags_port_test_safe_read(); void ags_port_test_safe_write(); void ags_port_test_safe_write_raw(); void ags_port_test_safe_get_property(); void ags_port_test_safe_set_property(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_port_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_port_test_clean_suite() { return(0); } void ags_port_test_safe_read() { AgsPort *port; GValue *value; /* * check boolean */ port = ags_port_new(); port->port_value_is_pointer = FALSE; port->port_value_type = G_TYPE_BOOLEAN; port->port_value_size = sizeof(gboolean); port->port_value_length = 1; /* assert false */ port->port_value.ags_port_boolean = FALSE; value = g_new0(GValue, 1); g_value_init(value, G_TYPE_BOOLEAN); ags_port_safe_read(port, value); CU_ASSERT(g_value_get_boolean(value) == FALSE); /* assert true */ port->port_value.ags_port_boolean = TRUE; g_value_reset(value); ags_port_safe_read(port, value); CU_ASSERT(g_value_get_boolean(value) == TRUE); /* * check unsigned int 64 */ port = ags_port_new(); port->port_value_is_pointer = FALSE; port->port_value_type = G_TYPE_UINT64; port->port_value_size = sizeof(guint64); port->port_value_length = 1; /* assert 0 */ port->port_value.ags_port_uint = 0; value = g_new0(GValue, 1); g_value_init(value, G_TYPE_UINT64); ags_port_safe_read(port, value); CU_ASSERT(g_value_get_uint64(value) == 0); /* assert max unsigned int 64 */ port->port_value.ags_port_uint = G_MAXUINT64; g_value_reset(value); ags_port_safe_read(port, value); CU_ASSERT(g_value_get_uint64(value) == G_MAXUINT64); /* * check double */ port = ags_port_new(); port->port_value_is_pointer = FALSE; port->port_value_type = G_TYPE_DOUBLE; port->port_value_size = sizeof(gdouble); port->port_value_length = 1; /* assert 0.0 */ port->port_value.ags_port_double = 0.0; value = g_new0(GValue, 1); g_value_init(value, G_TYPE_DOUBLE); ags_port_safe_read(port, value); CU_ASSERT(g_value_get_double(value) == 0.0); /* assert 1.0 */ port->port_value.ags_port_double = 1.0; g_value_reset(value); ags_port_safe_read(port, value); CU_ASSERT(g_value_get_double(value) == 1.0); } void ags_port_test_safe_write() { //TODO:JK: implement me } void ags_port_test_safe_write_raw() { //TODO:JK: implement me } void ags_port_test_safe_get_property() { //TODO:JK: implement me } void ags_port_test_safe_set_property() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPortTest", ags_port_test_init_suite, ags_port_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPort safe read", ags_port_test_safe_read) == NULL) || (CU_add_test(pSuite, "test of AgsPort safe write", ags_port_test_safe_write) == NULL) || (CU_add_test(pSuite, "test of AgsPort safe write raw", ags_port_test_safe_write_raw) == NULL) || (CU_add_test(pSuite, "test of AgsPort safe get property", ags_port_test_safe_get_property) == NULL) || (CU_add_test(pSuite, "test of AgsPort safe set property", ags_port_test_safe_set_property) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_notation_test.c0000644000175000017500000005331513605312646017337 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_notation_test_init_suite(); int ags_notation_test_clean_suite(); void ags_notation_test_find_near_timestamp(); void ags_notation_test_add_note(); void ags_notation_test_remove_note(); void ags_notation_test_remove_note_at_position(); void ags_notation_test_is_note_selected(); void ags_notation_test_find_point(); void ags_notation_test_find_region(); void ags_notation_test_free_selection(); void ags_notation_test_add_all_to_selection(); void ags_notation_test_add_point_to_selection(); void ags_notation_test_remove_point_from_selection(); void ags_notation_test_add_region_to_selection(); void ags_notation_test_remove_region_from_selection(); void ags_notation_test_copy_selection(); void ags_notation_test_cut_selection(); void ags_notation_test_insert_from_clipboard(); #define AGS_NOTATION_TEST_FIND_NEAR_TIMESTAMP_N_NOTATION (8) #define AGS_NOTATION_TEST_ADD_NOTE_WIDTH (1024) #define AGS_NOTATION_TEST_ADD_NOTE_HEIGHT (88) #define AGS_NOTATION_TEST_ADD_NOTE_COUNT (1024) #define AGS_NOTATION_TEST_REMOVE_NOTE_WIDTH (1024) #define AGS_NOTATION_TEST_REMOVE_NOTE_HEIGHT (88) #define AGS_NOTATION_TEST_REMOVE_NOTE_COUNT (1024) #define AGS_NOTATION_TEST_REMOVE_NOTE_REMOVE_COUNT (256) #define AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_WIDTH (1024) #define AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_HEIGHT (88) #define AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_COUNT (1024) #define AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_REMOVE_COUNT (256) #define AGS_NOTATION_TEST_IS_NOTE_SELECTED_WIDTH (1024) #define AGS_NOTATION_TEST_IS_NOTE_SELECTED_HEIGHT (88) #define AGS_NOTATION_TEST_IS_NOTE_SELECTED_COUNT (1024) #define AGS_NOTATION_TEST_IS_NOTE_SELECTED_SELECTION_COUNT (128) #define AGS_NOTATION_TEST_FIND_POINT_WIDTH (1024) #define AGS_NOTATION_TEST_FIND_POINT_HEIGHT (88) #define AGS_NOTATION_TEST_FIND_POINT_COUNT (1024) #define AGS_NOTATION_TEST_FIND_POINT_N_ATTEMPTS (128) #define AGS_NOTATION_TEST_FIND_REGION_WIDTH (1024) #define AGS_NOTATION_TEST_FIND_REGION_HEIGHT (88) #define AGS_NOTATION_TEST_FIND_REGION_COUNT (1024) #define AGS_NOTATION_TEST_FIND_REGION_N_ATTEMPTS (128) #define AGS_NOTATION_TEST_FIND_REGION_SELECTION_WIDTH (128) #define AGS_NOTATION_TEST_FIND_REGION_SELECTION_HEIGHT (24) #define AGS_NOTATION_TEST_FREE_SELECTION_WIDTH (1024) #define AGS_NOTATION_TEST_FREE_SELECTION_HEIGHT (88) #define AGS_NOTATION_TEST_FREE_SELECTION_COUNT (1024) #define AGS_NOTATION_TEST_FREE_SELECTION_SELECTION_COUNT (64) #define AGS_NOTATION_TEST_ADD_ALL_TO_SELECTION_WIDTH (1024) #define AGS_NOTATION_TEST_ADD_ALL_TO_SELECTION_HEIGHT (88) #define AGS_NOTATION_TEST_ADD_ALL_TO_SELECTION_COUNT (1024) #define AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_WIDTH (1024) #define AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_HEIGHT (88) #define AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_COUNT (1024) #define AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_N_ATTEMPTS (128) #define AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_WIDTH (1024) #define AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_HEIGHT (88) #define AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_COUNT (1024) #define AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_SELECTION_COUNT (128) #define AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_N_ATTEMPTS (64) AgsAudio *audio; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_notation_test_init_suite() { audio = ags_audio_new(NULL); g_object_ref(audio); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_notation_test_clean_suite() { g_object_unref(audio); return(0); } void ags_notation_test_find_near_timestamp() { AgsNotation **notation; AgsTimestamp *timestamp; GList *list, *current; guint i; notation = (AgsNotation **) malloc(AGS_NOTATION_TEST_FIND_NEAR_TIMESTAMP_N_NOTATION * sizeof(AgsNotation *)); list = NULL; for(i = 0; i < AGS_NOTATION_TEST_FIND_NEAR_TIMESTAMP_N_NOTATION; i++){ /* nth notation */ notation[i] = ags_notation_new(audio, 0); timestamp = notation[i]->timestamp; timestamp->timer.ags_offset.offset = i * AGS_NOTATION_DEFAULT_OFFSET; list = g_list_prepend(list, notation[i]); } list = g_list_reverse(list); /* instantiate timestamp to check against */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; /* assert find */ for(i = 0; i < AGS_NOTATION_TEST_FIND_NEAR_TIMESTAMP_N_NOTATION; i++){ timestamp->timer.ags_offset.offset = i * AGS_NOTATION_DEFAULT_OFFSET; current = ags_notation_find_near_timestamp(list, 0, timestamp); CU_ASSERT(current != NULL && current->data == notation[i]); } } void ags_notation_test_add_note() { AgsNotation *notation; AgsNote *note; GList *list; guint x0, y; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_ADD_NOTE_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_ADD_NOTE_WIDTH; y = rand() % AGS_NOTATION_TEST_ADD_NOTE_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* assert position */ list = notation->note; success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_ADD_NOTE_COUNT; i++){ if(list->prev != NULL){ if(!(AGS_NOTE(list->prev->data)->x[0] < AGS_NOTE(list->data)->x[0] || (AGS_NOTE(list->prev->data)->x[0] == AGS_NOTE(list->data)->x[0] && (AGS_NOTE(list->prev->data)->y <= AGS_NOTE(list->data)->y)))){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_notation_test_remove_note() { AgsNotation *notation; AgsNote *note; GList *list; GList *current; guint nth; guint x0, y; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_REMOVE_NOTE_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_REMOVE_NOTE_WIDTH; y = rand() % AGS_NOTATION_TEST_REMOVE_NOTE_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } for(i = 0; i < AGS_NOTATION_TEST_REMOVE_NOTE_REMOVE_COUNT; i++){ nth = rand() % (AGS_NOTATION_TEST_REMOVE_NOTE_COUNT - i); current = g_list_nth(notation->note, nth); ags_notation_remove_note(notation, current->data, FALSE); } /* assert position */ list = notation->note; success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_REMOVE_NOTE_COUNT - AGS_NOTATION_TEST_REMOVE_NOTE_REMOVE_COUNT; i++){ if(list->prev != NULL){ if(!(AGS_NOTE(list->prev->data)->x[0] < AGS_NOTE(list->data)->x[0] || (AGS_NOTE(list->prev->data)->x[0] == AGS_NOTE(list->data)->x[0] && (AGS_NOTE(list->prev->data)->y <= AGS_NOTE(list->data)->y)))){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_notation_test_remove_note_at_position() { AgsNotation *notation; AgsNote *note; GList *list, *current; guint x0, y; guint nth; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_WIDTH; y = rand() % AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } for(i = 0; i < AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_REMOVE_COUNT; i++){ nth = rand() % (AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_COUNT - i); current = g_list_nth(notation->note, nth); ags_notation_remove_note_at_position(notation, AGS_NOTE(current->data)->x[0], AGS_NOTE(current->data)->y); } /* assert position */ list = notation->note; success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_COUNT - AGS_NOTATION_TEST_REMOVE_NOTE_AT_POSITION_REMOVE_COUNT; i++){ if(list->prev != NULL){ if(!(AGS_NOTE(list->prev->data)->x[0] < AGS_NOTE(list->data)->x[0] || (AGS_NOTE(list->prev->data)->x[0] == AGS_NOTE(list->data)->x[0] && (AGS_NOTE(list->prev->data)->y <= AGS_NOTE(list->data)->y)))){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_notation_test_is_note_selected() { AgsNotation *notation; AgsNote *note; GList *list, *current; guint x0, y; guint nth; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_IS_NOTE_SELECTED_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_IS_NOTE_SELECTED_WIDTH; y = rand() % AGS_NOTATION_TEST_IS_NOTE_SELECTED_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* select notes */ for(i = 0; i < AGS_NOTATION_TEST_IS_NOTE_SELECTED_SELECTION_COUNT; i++){ nth = rand() % (AGS_NOTATION_TEST_IS_NOTE_SELECTED_COUNT - i); current = g_list_nth(notation->note, nth); ags_notation_add_note(notation, current->data, TRUE); } /* assert position */ list = notation->selection; success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_IS_NOTE_SELECTED_SELECTION_COUNT; i++){ if(list->prev != NULL){ if(!(AGS_NOTE(list->prev->data)->x[0] < AGS_NOTE(list->data)->x[0] || (AGS_NOTE(list->prev->data)->x[0] == AGS_NOTE(list->data)->x[0] && (AGS_NOTE(list->prev->data)->y <= AGS_NOTE(list->data)->y)))){ success = FALSE; break; } } list = list->next; } CU_ASSERT(success == TRUE); CU_ASSERT(list == NULL); } void ags_notation_test_find_point() { AgsNotation *notation; AgsNote *note; GList *list, *current; guint x0, y; guint nth; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_FIND_POINT_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_FIND_POINT_WIDTH; y = rand() % AGS_NOTATION_TEST_FIND_POINT_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* assert find point */ success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_FIND_POINT_N_ATTEMPTS; i++){ nth = rand() % AGS_NOTATION_TEST_FIND_POINT_COUNT; current = g_list_nth(notation->note, nth); note = ags_notation_find_point(notation, AGS_NOTE(current->data)->x[0], AGS_NOTE(current->data)->y, FALSE); if(note->x[0] != AGS_NOTE(current->data)->x[0] || note->y != AGS_NOTE(current->data)->y){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_notation_test_find_region() { AgsNotation *notation; AgsNote *note; GList *list, *current, *region; guint x0, y; guint nth; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_FIND_REGION_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_FIND_REGION_WIDTH; y = rand() % AGS_NOTATION_TEST_FIND_REGION_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* assert find region */ success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_FIND_REGION_N_ATTEMPTS && success; i++){ nth = rand() % AGS_NOTATION_TEST_FIND_REGION_COUNT; current = g_list_nth(notation->note, nth); region = ags_notation_find_region(notation, AGS_NOTE(current->data)->x[0], AGS_NOTE(current->data)->y, AGS_NOTE(current->data)->x[0] + AGS_NOTATION_TEST_FIND_REGION_SELECTION_WIDTH, AGS_NOTE(current->data)->y + AGS_NOTATION_TEST_FIND_REGION_SELECTION_HEIGHT, FALSE); while(region != NULL){ if(!(AGS_NOTE(region->data)->x[0] >= AGS_NOTE(current->data)->x[0] && AGS_NOTE(current->data)->x[0] < AGS_NOTE(current->data)->x[0] + AGS_NOTATION_TEST_FIND_REGION_SELECTION_WIDTH && AGS_NOTE(region->data)->y >= AGS_NOTE(current->data)->y && AGS_NOTE(current->data)->y < AGS_NOTE(current->data)->y + AGS_NOTATION_TEST_FIND_REGION_SELECTION_HEIGHT)){ success = FALSE; break; } region = region->next; } } CU_ASSERT(success == TRUE); } void ags_notation_test_free_selection() { AgsNotation *notation; AgsNote *note; GList *list, *current; guint x0, y; guint nth; guint i; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_FREE_SELECTION_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_FREE_SELECTION_WIDTH; y = rand() % AGS_NOTATION_TEST_FREE_SELECTION_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* select notes */ for(i = 0; i < AGS_NOTATION_TEST_FREE_SELECTION_SELECTION_COUNT; i++){ nth = rand() % (AGS_NOTATION_TEST_FREE_SELECTION_SELECTION_COUNT - i); current = g_list_nth(notation->note, nth); ags_notation_add_note(notation, current->data, TRUE); } /* assert free slection */ CU_ASSERT(notation->selection != NULL); ags_notation_free_selection(notation); CU_ASSERT(notation->selection == NULL); } void ags_notation_test_add_all_to_selection() { AgsNotation *notation; AgsNote *note; GList *list, *current, *current_selection; guint x0, y; guint nth; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_ADD_ALL_TO_SELECTION_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_ADD_ALL_TO_SELECTION_WIDTH; y = rand() % AGS_NOTATION_TEST_ADD_ALL_TO_SELECTION_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* select all */ ags_notation_add_all_to_selection(notation); /* assert all present */ current = notation->note; current_selection = notation->selection; CU_ASSERT(g_list_length(current_selection) == g_list_length(current)); } void ags_notation_test_add_point_to_selection() { AgsNotation *notation; AgsNote *note; GList *list, *current; guint x0, y; guint nth; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_WIDTH; y = rand() % AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* assert add point to selection */ success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_N_ATTEMPTS; i++){ nth = rand() % AGS_NOTATION_TEST_ADD_POINT_TO_SELECTION_COUNT; current = g_list_nth(notation->note, nth); ags_notation_add_point_to_selection(notation, AGS_NOTE(current->data)->x[0], AGS_NOTE(current->data)->y, FALSE); if(ags_notation_find_point(notation, AGS_NOTE(current->data)->x[0], AGS_NOTE(current->data)->y, TRUE) == NULL){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_notation_test_remove_point_from_selection() { AgsNotation *notation; AgsNote *note, *match; GList *list, *current, *iter, *next; guint x0, y; guint nth; guint n_matches; guint i; gboolean success; /* create notation */ notation = ags_notation_new(audio, 0); for(i = 0; i < AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_COUNT; i++){ x0 = rand() % AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_WIDTH; y = rand() % AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_HEIGHT; note = ags_note_new_with_offset(x0, x0 + 1, y, 0.0, 0.0); ags_notation_add_note(notation, note, FALSE); } /* add point to selection */ for(i = 0; i < AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_SELECTION_COUNT; i++){ nth = rand() % AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_COUNT; current = g_list_nth(notation->note, nth); ags_notation_add_point_to_selection(notation, AGS_NOTE(current->data)->x[0], AGS_NOTE(current->data)->y, FALSE); } /* assert remove point from selection */ success = TRUE; for(i = 0; i < AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_N_ATTEMPTS; i++){ nth = rand() % (AGS_NOTATION_TEST_REMOVE_POINT_FROM_SELECTION_N_ATTEMPTS); current = g_list_nth(notation->selection, nth); if(current == NULL){ continue; } iter = current->next; n_matches = 0; while(iter != NULL && AGS_NOTE(iter->data)->x[0] == AGS_NOTE(current->data)->x[0] && AGS_NOTE(iter->data)->y == AGS_NOTE(current->data)->y){ n_matches++; iter = iter->next; } note = AGS_NOTE(current->data); ags_notation_remove_point_from_selection(notation, note->x[0], note->y); if((match = ags_notation_find_point(notation, note->x[0], note->y, TRUE)) != NULL){ if(n_matches == 0){ success = FALSE; break; }else{ next = g_list_find(notation->selection, match); while(next != NULL && AGS_NOTE(next->data)->x[0] == note->x[0] && AGS_NOTE(next->data)->y == note->y){ n_matches--; next = next->next; } if(n_matches != 0){ success = FALSE; break; } } } } CU_ASSERT(success == TRUE); } void ags_notation_test_add_region_to_selection() { //TODO:JK: implement me } void ags_notation_test_remove_region_from_selection() { //TODO:JK: implement me } void ags_notation_test_copy_selection() { //TODO:JK: implement me } void ags_notation_test_cut_selection() { //TODO:JK: implement me } void ags_notation_test_insert_from_clipboard() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsNotationTest", ags_notation_test_init_suite, ags_notation_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsNotation find near timestamp", ags_notation_test_find_near_timestamp) == NULL) || (CU_add_test(pSuite, "test of AgsNotation add note", ags_notation_test_add_note) == NULL) || (CU_add_test(pSuite, "test of AgsNotation remove note", ags_notation_test_remove_note) == NULL) || (CU_add_test(pSuite, "test of AgsNotation remove note at position", ags_notation_test_remove_note_at_position) == NULL) || (CU_add_test(pSuite, "test of AgsNotation is note selected", ags_notation_test_is_note_selected) == NULL) || (CU_add_test(pSuite, "test of AgsNotation find point", ags_notation_test_find_point) == NULL) || (CU_add_test(pSuite, "test of AgsNotation find region", ags_notation_test_find_region) == NULL) || (CU_add_test(pSuite, "test of AgsNotation free selection", ags_notation_test_free_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation add all to selection", ags_notation_test_add_all_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation add point to selection", ags_notation_test_add_point_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation remove point from selection", ags_notation_test_remove_point_from_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation add region to selection", ags_notation_test_add_region_to_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation remove region from selection", ags_notation_test_remove_region_from_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation copy selection", ags_notation_test_copy_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation cut selection", ags_notation_test_cut_selection) == NULL) || (CU_add_test(pSuite, "test of AgsNotation insert from clipboard", ags_notation_test_insert_from_clipboard) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_playback_domain_test.c0000644000175000017500000001627613605312646020626 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_playback_domain_test_init_suite(); int ags_playback_domain_test_clean_suite(); void ags_playback_domain_test_set_audio_thread(); void ags_playback_domain_test_get_audio_thread(); void ags_playback_domain_test_add_playback(); void ags_playback_domain_test_remove_playback(); #define AGS_PLAYBACK_DOMAIN_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=true\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=recycling\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_playback_domain_test_init_suite() { AgsConfig *config; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_PLAYBACK_DOMAIN_TEST_CONFIG, strlen(AGS_PLAYBACK_DOMAIN_TEST_CONFIG)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_playback_domain_test_clean_suite() { return(0); } void ags_playback_domain_test_set_audio_thread() { AgsPlaybackDomain *playback_domain; playback_domain = g_object_new(AGS_TYPE_PLAYBACK_DOMAIN, NULL); /* set playback to NULL and assert */ ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_PLAYBACK); CU_ASSERT(playback_domain->audio_thread[AGS_SOUND_SCOPE_PLAYBACK] == NULL); /* set sequencer to NULL and assert */ ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(playback_domain->audio_thread[AGS_SOUND_SCOPE_SEQUENCER] == NULL); /* set notation to NULL and assert */ ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_NOTATION); CU_ASSERT(playback_domain->audio_thread[AGS_SOUND_SCOPE_NOTATION] == NULL); } void ags_playback_domain_test_get_audio_thread() { AgsPlaybackDomain *playback_domain; AgsThread *thread; playback_domain = g_object_new(AGS_TYPE_PLAYBACK_DOMAIN, NULL); /* get playback to NULL and assert */ thread = ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_PLAYBACK); CU_ASSERT(playback_domain->audio_thread[AGS_SOUND_SCOPE_PLAYBACK] == thread); /* get sequencer to NULL and assert */ thread = ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_SEQUENCER); CU_ASSERT(playback_domain->audio_thread[AGS_SOUND_SCOPE_SEQUENCER] == thread); /* get notation to NULL and assert */ thread = ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_NOTATION); CU_ASSERT(playback_domain->audio_thread[AGS_SOUND_SCOPE_NOTATION] == thread); } void ags_playback_domain_test_add_playback() { AgsPlaybackDomain *playback_domain; AgsPlayback *playback[3]; playback_domain = g_object_new(AGS_TYPE_PLAYBACK_DOMAIN, NULL); playback[0] = g_object_new(AGS_TYPE_PLAYBACK, NULL); ags_playback_domain_add_playback(playback_domain, playback[0], AGS_TYPE_OUTPUT); playback[1] = g_object_new(AGS_TYPE_PLAYBACK, NULL); ags_playback_domain_add_playback(playback_domain, playback[1], AGS_TYPE_OUTPUT); playback[2] = g_object_new(AGS_TYPE_PLAYBACK, NULL); ags_playback_domain_add_playback(playback_domain, playback[2], AGS_TYPE_OUTPUT); /* assert */ CU_ASSERT(g_list_find(playback_domain->output_playback, playback[0]) != NULL); CU_ASSERT(g_list_find(playback_domain->output_playback, playback[1]) != NULL); CU_ASSERT(g_list_find(playback_domain->output_playback, playback[2]) != NULL); } void ags_playback_domain_test_remove_playback() { AgsPlaybackDomain *playback_domain; AgsPlayback *playback[3]; playback_domain = g_object_new(AGS_TYPE_PLAYBACK_DOMAIN, NULL); playback[0] = g_object_new(AGS_TYPE_PLAYBACK, NULL); ags_playback_domain_add_playback(playback_domain, playback[0], AGS_TYPE_OUTPUT); playback[1] = g_object_new(AGS_TYPE_PLAYBACK, NULL); ags_playback_domain_add_playback(playback_domain, playback[1], AGS_TYPE_OUTPUT); playback[2] = g_object_new(AGS_TYPE_PLAYBACK, NULL); ags_playback_domain_add_playback(playback_domain, playback[2], AGS_TYPE_OUTPUT); /* assert */ ags_playback_domain_remove_playback(playback_domain, playback[1], AGS_TYPE_OUTPUT); CU_ASSERT(g_list_find(playback_domain->output_playback, playback[1]) == NULL); ags_playback_domain_remove_playback(playback_domain, playback[2], AGS_TYPE_OUTPUT); CU_ASSERT(g_list_find(playback_domain->output_playback, playback[2]) == NULL); ags_playback_domain_remove_playback(playback_domain, playback[0], AGS_TYPE_OUTPUT); CU_ASSERT(g_list_find(playback_domain->output_playback, playback[0]) == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPlaybackDomainTest", ags_playback_domain_test_init_suite, ags_playback_domain_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPlaybackDomain set audio thread", ags_playback_domain_test_set_audio_thread) == NULL) || (CU_add_test(pSuite, "test of AgsPlaybackDomain get audio thread", ags_playback_domain_test_get_audio_thread) == NULL) || (CU_add_test(pSuite, "test of AgsPlaybackDomain add playback", ags_playback_domain_test_add_playback) == NULL) || (CU_add_test(pSuite, "test of AgsPlaybackDomain remove playback", ags_playback_domain_test_remove_playback) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_fourier_transform_util_test.c0000644000175000017500000005641313605312646022311 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_fourier_transform_util_test_init_suite(); int ags_fourier_transform_util_test_clean_suite(); void ags_fourier_transform_util_test_compute_stft_s8(); void ags_fourier_transform_util_test_compute_stft_s16(); void ags_fourier_transform_util_test_compute_stft_s24(); void ags_fourier_transform_util_test_compute_stft_s32(); void ags_fourier_transform_util_test_compute_stft_s64(); void ags_fourier_transform_util_test_compute_stft_float(); void ags_fourier_transform_util_test_compute_stft_double(); void ags_fourier_transform_util_test_inverse_stft_s8(); void ags_fourier_transform_util_test_inverse_stft_s16(); void ags_fourier_transform_util_test_inverse_stft_s24(); void ags_fourier_transform_util_test_inverse_stft_s32(); void ags_fourier_transform_util_test_inverse_stft_s64(); void ags_fourier_transform_util_test_inverse_stft_float(); void ags_fourier_transform_util_test_inverse_stft_double(); #define AGS_FOURIER_TRANSFORM_UTIL_TEST_MAX_S24 (0x7fffff) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY (440.0) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE (44100.0) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S8_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S16_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S24_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S32_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S64_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_FLOAT_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_DOUBLE_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE (8192) #define AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE (8192) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_fourier_transform_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_fourier_transform_util_test_clean_suite() { return(0); } void ags_fourier_transform_util_test_compute_stft_s8() { AgsComplex *retval; gint8 *s8_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; s8_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S8_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S8_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_s8(s8_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S8_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S8_BUFFER_SIZE; i++){ if(s8_buffer[i] != 0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_compute_stft_s16() { AgsComplex *retval; gint16 *s16_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; s16_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S16_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S16_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_s16(s16_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S16_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S16_BUFFER_SIZE; i++){ if(s16_buffer[i] != 0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_compute_stft_s24() { AgsComplex *retval; gint32 *s24_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; s24_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S24_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_FOURIER_TRANSFORM_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S24_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_s24(s24_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S24_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S24_BUFFER_SIZE; i++){ if(s24_buffer[i] != 0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_compute_stft_s32() { AgsComplex *retval; gint32 *s32_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; s32_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S32_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S32_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_s32(s32_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S32_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S32_BUFFER_SIZE; i++){ if(s32_buffer[i] != 0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_compute_stft_s64() { AgsComplex *retval; gint64 *s64_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; s64_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S64_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S64_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_s64(s64_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S64_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_S64_BUFFER_SIZE; i++){ if(s64_buffer[i] != 0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_compute_stft_float() { AgsComplex *retval; gfloat *float_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; float_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_FLOAT_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_float(float_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_FLOAT_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_FLOAT_BUFFER_SIZE; i++){ if(float_buffer[i] != 0.0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_compute_stft_double() { AgsComplex *retval; gdouble *double_buffer; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; double_buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_DOUBLE_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); ags_fourier_transform_util_compute_stft_double(double_buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_DOUBLE_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_COMPUTE_STFT_DOUBLE_BUFFER_SIZE; i++){ if(double_buffer[i] != 0.0 && ags_complex_get(retval + i) == z_zero){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_s8() { AgsComplex *buffer; gint8 *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); ags_fourier_transform_util_inverse_stft_s8(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S8_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_s16() { AgsComplex *buffer; gint16 *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); ags_fourier_transform_util_inverse_stft_s16(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S16_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_s24() { AgsComplex *buffer; gint32 *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); ags_fourier_transform_util_inverse_stft_s24(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S24_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_s32() { AgsComplex *buffer; gint32 *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); ags_fourier_transform_util_inverse_stft_s32(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S32_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_s64() { AgsComplex *buffer; gint64 *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); ags_fourier_transform_util_inverse_stft_s64(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_S64_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_float() { AgsComplex *buffer; gfloat *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); ags_fourier_transform_util_inverse_stft_float(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_FLOAT_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_fourier_transform_util_test_inverse_stft_double() { AgsComplex *buffer; gdouble *retval; guint i; gboolean success; static const complex z_zero = 0.0 + I * 0.0; buffer = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_COMPLEX); for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE; i++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) i; r = (gdouble) i; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(i - r); z = sin(i * 2.0 * M_PI * AGS_FOURIER_TRANSFORM_UTIL_TEST_FREQUENCY / AGS_FOURIER_TRANSFORM_UTIL_TEST_SAMPLERATE) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r / AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE); ags_complex_set(buffer + i, z); } /* test */ retval = ags_stream_alloc(AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); ags_fourier_transform_util_inverse_stft_double(buffer, 1, AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE, &retval); success = TRUE; for(i = 0; i < AGS_FOURIER_TRANSFORM_UTIL_TEST_INVERSE_STFT_DOUBLE_BUFFER_SIZE; i++){ if(ags_complex_get(buffer + i) == z_zero && retval[i] != 0){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFourierTransformUtilTest", ags_fourier_transform_util_test_init_suite, ags_fourier_transform_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT signed 8 bit", ags_fourier_transform_util_test_compute_stft_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT signed 16 bit", ags_fourier_transform_util_test_compute_stft_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT signed 24 bit", ags_fourier_transform_util_test_compute_stft_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT signed 32 bit", ags_fourier_transform_util_test_compute_stft_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT signed 64 bit", ags_fourier_transform_util_test_compute_stft_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT float", ags_fourier_transform_util_test_compute_stft_float) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c compute STFT double", ags_fourier_transform_util_test_compute_stft_double) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT signed 8 bit", ags_fourier_transform_util_test_inverse_stft_s8) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT signed 16 bit", ags_fourier_transform_util_test_inverse_stft_s16) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT signed 24 bit", ags_fourier_transform_util_test_inverse_stft_s24) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT signed 32 bit", ags_fourier_transform_util_test_inverse_stft_s32) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT signed 64 bit", ags_fourier_transform_util_test_inverse_stft_s64) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT float", ags_fourier_transform_util_test_inverse_stft_float) == NULL) || (CU_add_test(pSuite, "test of ags_fourier_transform_util.c inverse STFT double", ags_fourier_transform_util_test_inverse_stft_double) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_dependency_test.c0000644000175000017500000002010113605312646021127 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_recall_dependency_test_init_suite(); int ags_recall_dependency_test_clean_suite(); void ags_recall_dependency_test_find_dependency(); void ags_recall_dependency_test_find_dependency_by_provider(); void ags_recall_dependency_test_resolve(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_dependency_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_dependency_test_clean_suite() { return(0); } void ags_recall_dependency_test_find_dependency() { AgsRecall *recall[3]; AgsRecallDependency *recall_dependency[3]; GList *list, *current; list = NULL; /* dependency #0 */ recall[0] = g_object_new(AGS_TYPE_RECALL, NULL); recall_dependency[0] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall[0], NULL); list = g_list_prepend(list, recall_dependency[0]); /* dependency #1 */ recall[1] = g_object_new(AGS_TYPE_RECALL, NULL); recall_dependency[1] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall[1], NULL); list = g_list_prepend(list, recall_dependency[1]); /* dependency #2 */ recall[2] = g_object_new(AGS_TYPE_RECALL, NULL); recall_dependency[2] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall[2], NULL); list = g_list_prepend(list, recall_dependency[2]); /* find and assert */ CU_ASSERT((current = ags_recall_dependency_find_dependency(list, recall[0])) != NULL && AGS_RECALL_DEPENDENCY(current->data)->dependency == recall[0]); CU_ASSERT((current = ags_recall_dependency_find_dependency(list, recall[1])) != NULL && AGS_RECALL_DEPENDENCY(current->data)->dependency == recall[1]); CU_ASSERT((current = ags_recall_dependency_find_dependency(list, recall[2])) != NULL && AGS_RECALL_DEPENDENCY(current->data)->dependency == recall[2]); } void ags_recall_dependency_test_find_dependency_by_provider() { AgsChannel *channel[3]; AgsAudio *audio[3]; AgsRecall *recall; AgsRecallAudio *recall_audio; AgsRecallDependency *recall_dependency[6]; GList *list, *current; list = NULL; /* dependency #0 */ audio[0] = g_object_new(AGS_TYPE_AUDIO, NULL); recall_audio = g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio[0], NULL); recall = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, "recall-audio", recall_audio, NULL); recall_dependency[0] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[0]); /* dependency #1 */ channel[0] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, "source", channel[0], NULL); recall_dependency[1] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[1]); /* dependency #2 */ channel[1] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, "source", channel[1], NULL); recall_dependency[2] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[2]); /* dependency #3 */ audio[1] = g_object_new(AGS_TYPE_AUDIO, NULL); recall_audio = g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio[1], NULL); recall = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, "recall-audio", recall_audio, NULL); recall_dependency[3] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[3]); /* dependency #4 */ audio[2] = g_object_new(AGS_TYPE_AUDIO, NULL); recall_audio = g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio[2], NULL); recall = g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, "recall-audio", recall_audio, NULL); recall_dependency[4] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[4]); /* dependency #5 */ channel[2] = g_object_new(AGS_TYPE_CHANNEL, NULL); recall = g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, "source", channel[2], NULL); recall_dependency[5] = g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", recall, NULL); list = g_list_prepend(list, recall_dependency[5]); /* find and assert - audio */ CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, audio[0])) != NULL && AGS_RECALL_AUDIO_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->recall_audio->audio == audio[0]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, audio[1])) != NULL && AGS_RECALL_AUDIO_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->recall_audio->audio == audio[1]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, audio[2])) != NULL && AGS_RECALL_AUDIO_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->recall_audio->audio == audio[2]); /* find and assert - channel */ CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, channel[0])) != NULL && AGS_RECALL_CHANNEL_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->source == channel[0]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, channel[1])) != NULL && AGS_RECALL_CHANNEL_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->source == channel[1]); CU_ASSERT((current = ags_recall_dependency_find_dependency_by_provider(list, channel[2])) != NULL && AGS_RECALL_CHANNEL_RUN(AGS_RECALL_DEPENDENCY(current->data)->dependency)->source == channel[2]); } void ags_recall_dependency_test_resolve() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallDependencyTest", ags_recall_dependency_test_init_suite, ags_recall_dependency_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecallDependency find dependency", ags_recall_dependency_test_find_dependency) == NULL) || (CU_add_test(pSuite, "test of AgsRecallDependency find dependency by provider", ags_recall_dependency_test_find_dependency_by_provider) == NULL) || (CU_add_test(pSuite, "test of AgsRecallDependency resolve", ags_recall_dependency_test_resolve) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_recall_id_test.c0000644000175000017500000001226113605312646017415 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_recall_id_test_init_suite(); int ags_recall_id_test_clean_suite(); void ags_recall_id_test_find_recycling_context(); void ags_recall_id_test_find_parent_recycling_context(); #define AGS_RECALL_ID_TEST_FIND_RECYCLING_CONTEXT_N_RECALL_ID (16) #define AGS_RECALL_ID_TEST_FIND_PARENT_RECYCLING_CONTEXT_N_RECALL_ID (16) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_id_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_recall_id_test_clean_suite() { return(0); } void ags_recall_id_test_find_recycling_context() { AgsRecallID **recall_id; AgsRecallID *current; AgsRecyclingContext **recycling_context; GList *list; guint i; gboolean success; recall_id = (AgsRecallID **) malloc(AGS_RECALL_ID_TEST_FIND_RECYCLING_CONTEXT_N_RECALL_ID * sizeof(AgsRecallID*)); recycling_context = (AgsRecallID **) malloc(AGS_RECALL_ID_TEST_FIND_RECYCLING_CONTEXT_N_RECALL_ID * sizeof(AgsRecyclingContext*)); list = NULL; for(i = 0; i < AGS_RECALL_ID_TEST_FIND_RECYCLING_CONTEXT_N_RECALL_ID; i++){ recycling_context[i] = ags_recycling_context_new(0); recall_id[i] = ags_recall_id_new(); g_object_set(recall_id[i], "recycling-context", recycling_context[i], NULL); list = g_list_prepend(list, recall_id[i]); } list = g_list_reverse(list); /* test */ success = TRUE; for(i = 0; i < AGS_RECALL_ID_TEST_FIND_RECYCLING_CONTEXT_N_RECALL_ID; i++){ current = ags_recall_id_find_recycling_context(list, recycling_context[i]); if(current != recall_id[i]){ success = FALSE; break; } } CU_ASSERT(success); } void ags_recall_id_test_find_parent_recycling_context() { AgsRecallID **recall_id; AgsRecallID *current; AgsRecyclingContext **recycling_context; AgsRecyclingContext **parent_recycling_context; GList *list; guint i; gboolean success; recall_id = (AgsRecallID **) malloc(AGS_RECALL_ID_TEST_FIND_PARENT_RECYCLING_CONTEXT_N_RECALL_ID * sizeof(AgsRecallID*)); recycling_context = (AgsRecallID **) malloc(AGS_RECALL_ID_TEST_FIND_PARENT_RECYCLING_CONTEXT_N_RECALL_ID * sizeof(AgsRecyclingContext*)); parent_recycling_context = (AgsRecallID **) malloc(AGS_RECALL_ID_TEST_FIND_PARENT_RECYCLING_CONTEXT_N_RECALL_ID * sizeof(AgsRecyclingContext*)); list = NULL; for(i = 0; i < AGS_RECALL_ID_TEST_FIND_PARENT_RECYCLING_CONTEXT_N_RECALL_ID; i++){ parent_recycling_context[i] = ags_recycling_context_new(0); recycling_context[i] = ags_recycling_context_new(0); g_object_set(recycling_context[i], "parent", parent_recycling_context[i], NULL); recall_id[i] = ags_recall_id_new(); g_object_set(recall_id[i], "recycling-context", recycling_context[i], NULL); list = g_list_prepend(list, recall_id[i]); } list = g_list_reverse(list); /* test */ success = TRUE; for(i = 0; i < AGS_RECALL_ID_TEST_FIND_PARENT_RECYCLING_CONTEXT_N_RECALL_ID; i++){ current = ags_recall_id_find_parent_recycling_context(list, parent_recycling_context[i]); if(current != recall_id[i]){ success = FALSE; break; } } CU_ASSERT(success); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsRecallIDTest", ags_recall_id_test_init_suite, ags_recall_id_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsRecallID find reycling context", ags_recall_id_test_find_recycling_context) == NULL) || (CU_add_test(pSuite, "test of AgsRecallID find parent reycling context", ags_recall_id_test_find_parent_recycling_context) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_audio_buffer_util_test.c0000644000175000017500000042266513605312646021203 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_audio_buffer_util_test_init_suite(); int ags_audio_buffer_util_test_clean_suite(); void ags_audio_buffer_util_test_format_from_soundcard(); void ags_audio_buffer_util_test_get_copy_mode(); void ags_audio_buffer_util_test_clear_float(); void ags_audio_buffer_util_test_clear_double(); void ags_audio_buffer_util_test_clear_buffer(); void ags_audio_buffer_util_test_envelope_s8(); void ags_audio_buffer_util_test_envelope_s16(); void ags_audio_buffer_util_test_envelope_s24(); void ags_audio_buffer_util_test_envelope_s32(); void ags_audio_buffer_util_test_envelope_s64(); void ags_audio_buffer_util_test_envelope_float(); void ags_audio_buffer_util_test_envelope_double(); void ags_audio_buffer_util_test_envelope(); void ags_audio_buffer_util_test_volume_s8(); void ags_audio_buffer_util_test_volume_s16(); void ags_audio_buffer_util_test_volume_s24(); void ags_audio_buffer_util_test_volume_s32(); void ags_audio_buffer_util_test_volume_s64(); void ags_audio_buffer_util_test_volume_float(); void ags_audio_buffer_util_test_volume_double(); void ags_audio_buffer_util_test_volume(); void ags_audio_buffer_util_test_resample_s8(); void ags_audio_buffer_util_test_resample_s16(); void ags_audio_buffer_util_test_resample_s24(); void ags_audio_buffer_util_test_resample_s32(); void ags_audio_buffer_util_test_resample_s64(); void ags_audio_buffer_util_test_resample_float(); void ags_audio_buffer_util_test_resample_double(); void ags_audio_buffer_util_test_resample(); void ags_audio_buffer_util_test_peak_s8(); void ags_audio_buffer_util_test_peak_s16(); void ags_audio_buffer_util_test_peak_s24(); void ags_audio_buffer_util_test_peak_s32(); void ags_audio_buffer_util_test_peak_s64(); void ags_audio_buffer_util_test_peak_float(); void ags_audio_buffer_util_test_peak_double(); void ags_audio_buffer_util_test_peak(); void ags_audio_buffer_util_test_copy_s8_to_s8(); void ags_audio_buffer_util_test_copy_s8_to_s16(); void ags_audio_buffer_util_test_copy_s8_to_s24(); void ags_audio_buffer_util_test_copy_s8_to_s32(); void ags_audio_buffer_util_test_copy_s8_to_s64(); void ags_audio_buffer_util_test_copy_s8_to_float(); void ags_audio_buffer_util_test_copy_s8_to_double(); void ags_audio_buffer_util_test_copy_s16_to_s8(); void ags_audio_buffer_util_test_copy_s16_to_s16(); void ags_audio_buffer_util_test_copy_s16_to_s24(); void ags_audio_buffer_util_test_copy_s16_to_s32(); void ags_audio_buffer_util_test_copy_s16_to_s64(); void ags_audio_buffer_util_test_copy_s16_to_float(); void ags_audio_buffer_util_test_copy_s16_to_double(); void ags_audio_buffer_util_test_copy_s24_to_s8(); void ags_audio_buffer_util_test_copy_s24_to_s16(); void ags_audio_buffer_util_test_copy_s24_to_s24(); void ags_audio_buffer_util_test_copy_s24_to_s32(); void ags_audio_buffer_util_test_copy_s24_to_s64(); void ags_audio_buffer_util_test_copy_s24_to_float(); void ags_audio_buffer_util_test_copy_s24_to_double(); void ags_audio_buffer_util_test_copy_s32_to_s8(); void ags_audio_buffer_util_test_copy_s32_to_s16(); void ags_audio_buffer_util_test_copy_s32_to_s24(); void ags_audio_buffer_util_test_copy_s32_to_s32(); void ags_audio_buffer_util_test_copy_s32_to_s64(); void ags_audio_buffer_util_test_copy_s32_to_float(); void ags_audio_buffer_util_test_copy_s32_to_double(); void ags_audio_buffer_util_test_copy_s64_to_s8(); void ags_audio_buffer_util_test_copy_s64_to_s16(); void ags_audio_buffer_util_test_copy_s64_to_s24(); void ags_audio_buffer_util_test_copy_s64_to_s32(); void ags_audio_buffer_util_test_copy_s64_to_s64(); void ags_audio_buffer_util_test_copy_s64_to_float(); void ags_audio_buffer_util_test_copy_s64_to_double(); void ags_audio_buffer_util_test_copy_float_to_s8(); void ags_audio_buffer_util_test_copy_float_to_s16(); void ags_audio_buffer_util_test_copy_float_to_s24(); void ags_audio_buffer_util_test_copy_float_to_s32(); void ags_audio_buffer_util_test_copy_float_to_s64(); void ags_audio_buffer_util_test_copy_float_to_float(); void ags_audio_buffer_util_test_copy_float_to_double(); void ags_audio_buffer_util_test_copy_double_to_s8(); void ags_audio_buffer_util_test_copy_double_to_s16(); void ags_audio_buffer_util_test_copy_double_to_s24(); void ags_audio_buffer_util_test_copy_double_to_s32(); void ags_audio_buffer_util_test_copy_double_to_s64(); void ags_audio_buffer_util_test_copy_double_to_float(); void ags_audio_buffer_util_test_copy_double_to_double(); void ags_audio_buffer_util_test_copy_buffer_to_buffer(); #define AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 (0x7fffff) #define AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE (44100.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_FLOAT_BUFFER_SIZE (1024) #define AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_DOUBLE_BUFFER_SIZE (1024) #define AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE (1024) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE (44100) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE (48000) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE (440.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE (22000.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR (1.0) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE (8192) #define AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE (8192) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_buffer_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_audio_buffer_util_test_clean_suite() { return(0); } void ags_audio_buffer_util_test_format_from_soundcard() { CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_SIGNED_8_BIT) == AGS_AUDIO_BUFFER_UTIL_S8); CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_SIGNED_16_BIT) == AGS_AUDIO_BUFFER_UTIL_S16); CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_SIGNED_24_BIT) == AGS_AUDIO_BUFFER_UTIL_S24); CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_SIGNED_32_BIT) == AGS_AUDIO_BUFFER_UTIL_S32); CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_SIGNED_64_BIT) == AGS_AUDIO_BUFFER_UTIL_S64); CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_FLOAT) == AGS_AUDIO_BUFFER_UTIL_FLOAT); CU_ASSERT(ags_audio_buffer_util_format_from_soundcard(AGS_SOUNDCARD_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_DOUBLE); } void ags_audio_buffer_util_test_get_copy_mode() { CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_S8) == AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_DOUBLE); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_S16) == AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_DOUBLE); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_S24) == AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_DOUBLE); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_S32) == AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_DOUBLE); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_S64) == AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_DOUBLE); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_FLOAT) == AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_DOUBLE); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S8); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S16); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S24); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S32); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S64); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT); CU_ASSERT(ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_DOUBLE) == AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE); } void ags_audio_buffer_util_test_clear_float() { gfloat *buffer; guint i; gboolean success; buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_FLOAT_BUFFER_SIZE; i++){ buffer[i] = 1.0 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_float(buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_FLOAT_BUFFER_SIZE); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_FLOAT_BUFFER_SIZE; i++){ if(buffer[i] != 0.0){ success = FALSE; break; } } CU_ASSERT(success); } void ags_audio_buffer_util_test_clear_double() { gdouble *buffer; guint i; gboolean success; buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_DOUBLE_BUFFER_SIZE; i++){ buffer[i] = 1.0 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_double(buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_DOUBLE_BUFFER_SIZE); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_DOUBLE_BUFFER_SIZE; i++){ if(buffer[i] != 0.0){ success = FALSE; break; } } CU_ASSERT(success); } void ags_audio_buffer_util_test_clear_buffer() { gint8 *s8_buffer; gint16 *s16_buffer; gint32 *s24_buffer; gint32 *s32_buffer; gint64 *s64_buffer; guint i; gboolean success; /* signed 8 bit */ s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_buffer(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_S8); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ if(s8_buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success); /* signed 16 bit */ s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_buffer(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_S16); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ if(s16_buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success); /* signed 24 bit */ s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_buffer(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_S24); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ if(s24_buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success); /* signed 32 bit */ s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_buffer(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_S32); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ if(s32_buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success); /* signed 64 bit */ s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 / rand(); } /* clear and assert */ ags_audio_buffer_util_clear_buffer(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_S64); success = TRUE; for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_CLEAR_BUFFER_BUFFER_SIZE; i++){ if(s64_buffer[i] != 0){ success = FALSE; break; } } CU_ASSERT(success); } void ags_audio_buffer_util_test_envelope_s8() { gint8 *s8_buffer; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_s8(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope_s16() { gint16 *s16_buffer; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_s16(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope_s24() { gint32 *s24_buffer; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_s24(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope_s32() { gint32 *s32_buffer; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_s32(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope_s64() { gint64 *s64_buffer; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_s64(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope_float() { gfloat *float_buffer; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_float(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope_double() { gdouble *double_buffer; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope_double(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_envelope() { gint8 *s8_buffer; gint16 *s16_buffer; gint32 *s24_buffer; gint32 *s32_buffer; gint64 *s64_buffer; gfloat *float_buffer; gdouble *double_buffer; guint orig_xcross_count, xcross_count; guint i; /* envelope - s8 buffer */ s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* envelope - s16 buffer */ s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* envelope - s24 buffer */ s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* envelope - s32 buffer */ s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* envelope - s64 buffer */ s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* envelope - float buffer */ float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gfloat) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* envelope - double buffer */ double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_envelope(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE, 0.25, ((0.5 - 0.25) / ((gdouble) AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE - 0.0))); xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_ENVELOPE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_s8() { gint8 *s8_buffer; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S8_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_s8(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S8_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_s16() { gint16 *s16_buffer; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S16_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_s16(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S16_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_s24() { gint32 *s24_buffer; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S24_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_s24(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S24_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_s32() { gint32 *s32_buffer; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S32_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_s32(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S32_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_s64() { gint64 *s64_buffer; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S64_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_s64(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S64_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_float() { gfloat *float_buffer; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_FLOAT_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_float(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_FLOAT_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume_double() { gdouble *double_buffer; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_DOUBLE_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume_double(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_DOUBLE_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_volume() { gint8 *s8_buffer; gint16 *s16_buffer; gint32 *s24_buffer; gint32 *s32_buffer; gint64 *s64_buffer; gfloat *float_buffer; gdouble *double_buffer; guint orig_xcross_count, xcross_count; guint i; /* volume - s8 buffer */ s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* volume - s16 buffer */ s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* volume - s24 buffer */ s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* volume - s32 buffer */ s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* volume - s64 buffer */ s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* volume - float buffer */ float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); /* volume - double buffer */ double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); /* test */ ags_audio_buffer_util_volume(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE, 0.5); xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_VOLUME_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_resample_s8() { gint8 *s8_buffer, *retval; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_s8(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S8_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample_s16() { gint16 *s16_buffer, *retval; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_s16(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S16_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample_s24() { gint32 *s24_buffer, *retval; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_s24(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S24_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample_s32() { gint32 *s32_buffer, *retval; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_s32(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S32_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample_s64() { gint64 *s64_buffer, *retval; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_s64(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_S64_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample_float() { gfloat *float_buffer, *retval; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_BUFFER_SIZE; i++){ float_buffer[i] = (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_float(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_FLOAT_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample_double() { gdouble *double_buffer, *retval; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_BUFFER_SIZE; i++){ double_buffer[i] = (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample_double(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_DOUBLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_resample() { gint8 *s8_buffer; gint16 *s16_buffer; gint32 *s24_buffer; gint32 *s32_buffer; gint64 *s64_buffer; gfloat *float_buffer; gdouble *double_buffer; void *retval; guint i; /* s8 buffer */ s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); /* s16 buffer */ s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); /* s24 buffer */ s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); /* s32 buffer */ s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); /* s64 buffer */ s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); /* float buffer */ float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ float_buffer[i] = (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); /* double buffer */ double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE; i++){ double_buffer[i] = (1.0 / rand()); } /* test */ retval = ags_audio_buffer_util_resample(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_SAMPLERATE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_RESAMPLE_TARGET_SAMPLERATE); CU_ASSERT(retval != NULL); free(retval); } void ags_audio_buffer_util_test_peak_s8() { gint8 *s8_buffer; gdouble retval; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_s8(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S8_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak_s16() { gint16 *s16_buffer; gdouble retval; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_s16(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S16_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak_s24() { gint32 *s24_buffer; gdouble retval; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_s24(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S24_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak_s32() { gint32 *s32_buffer; gdouble retval; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_s32(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S32_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak_s64() { gint64 *s64_buffer; gdouble retval; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_s64(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_S64_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak_float() { gfloat *float_buffer; gdouble retval; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_float(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_FLOAT_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak_double() { gdouble *double_buffer; gdouble retval; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak_double(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_DOUBLE_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_peak() { gint8 *s8_buffer; gint16 *s16_buffer; gint32 *s24_buffer; gint32 *s32_buffer; gint64 *s64_buffer; gfloat *float_buffer; gdouble *double_buffer; gdouble retval; guint i; /* signed 8 bit buffer */ s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); /* signed 16 bit buffer */ s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); /* signed 24 bit buffer */ s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); /* signed 32 bit buffer */ s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); /* signed 64 bit buffer */ s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); /* float buffer */ float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); /* double buffer */ double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } /* test */ retval = ags_audio_buffer_util_peak(double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_BUFFER_SIZE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_HARMONIC_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_MAX_RATE, AGS_AUDIO_BUFFER_UTIL_TEST_PEAK_PRESSURE_FACTOR); CU_ASSERT(retval != 0.0); } void ags_audio_buffer_util_test_copy_s8_to_s8() { gint8 *s8_buffer, *s8_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_s8(s8_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s8_to_s16() { gint8 *s8_buffer; gint16 *s16_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_s16(s16_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s8_to_s24() { gint8 *s8_buffer; gint32 *s24_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_s24(s24_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s8_to_s32() { gint8 *s8_buffer; gint32 *s32_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_s32(s32_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s8_to_s64() { gint8 *s8_buffer; gint64 *s64_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_s64(s64_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s8_to_float() { gint8 *s8_buffer; gfloat *float_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_float(float_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s8_to_double() { gint8 *s8_buffer; gdouble *double_destination; guint orig_xcross_count, xcross_count; guint i; s8_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE; i++){ s8_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s8(s8_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s8_to_double(double_destination, 1, s8_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S8_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_s8() { gint16 *s16_buffer; gint8 *s8_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_s8(s8_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_s16() { gint16 *s16_buffer, *s16_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_s16(s16_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_s24() { gint16 *s16_buffer; gint32 *s24_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_s24(s24_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_s32() { gint16 *s16_buffer; gint32 *s32_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_s32(s32_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_s64() { gint16 *s16_buffer; gint64 *s64_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_s64(s64_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_float() { gint16 *s16_buffer; gfloat *float_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_float(float_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s16_to_double() { gint16 *s16_buffer; gdouble *double_destination; guint orig_xcross_count, xcross_count; guint i; s16_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE; i++){ s16_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s16(s16_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s16_to_double(double_destination, 1, s16_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S16_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_s8() { gint32 *s24_buffer; gint8 *s8_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE; i++){ s24_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_s8(s8_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_s16() { gint32 *s24_buffer; gint16 *s16_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE; i++){ s24_buffer[i] = G_MAXINT16 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_s16(s16_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_s24() { gint32 *s24_buffer, *s24_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE; i++){ s24_buffer[i] = AGS_AUDIO_BUFFER_UTIL_TEST_MAX_S24 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_s24(s24_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_s32() { gint32 *s24_buffer; gint32 *s32_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE; i++){ s24_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_s32(s32_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_s64() { gint32 *s24_buffer; gint64 *s64_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE; i++){ s24_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_s64(s64_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_float() { gint32 *s24_buffer; gfloat *float_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE; i++){ s24_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_float(float_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s24_to_double() { gint32 *s24_buffer; gdouble *double_destination; guint orig_xcross_count, xcross_count; guint i; s24_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE; i++){ s24_buffer[i] = G_MAXINT8 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s24(s24_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s24_to_double(double_destination, 1, s24_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S24_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_s8() { gint32 *s32_buffer; gint8 *s8_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_s8(s8_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_s16() { gint32 *s32_buffer; gint16 *s16_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_s16(s16_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_s24() { gint32 *s32_buffer; gint32 *s24_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_s24(s24_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_s32() { gint32 *s32_buffer, *s32_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_s32(s32_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_s64() { gint32 *s32_buffer; gint64 *s64_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_s64(s64_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_float() { gint32 *s32_buffer; gfloat *float_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_float(float_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s32_to_double() { gint32 *s32_buffer; gdouble *double_destination; guint orig_xcross_count, xcross_count; guint i; s32_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE; i++){ s32_buffer[i] = G_MAXINT32 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s32(s32_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s32_to_double(double_destination, 1, s32_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S32_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_s8() { gint64 *s64_buffer; gint8 *s8_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_s8(s8_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_s16() { gint64 *s64_buffer; gint16 *s16_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_s16(s16_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_s24() { gint64 *s64_buffer; gint32 *s24_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_s24(s24_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_s32() { gint64 *s64_buffer; gint32 *s32_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_s32(s32_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_s64() { gint64 *s64_buffer, *s64_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_s64(s64_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_float() { gint64 *s64_buffer; gfloat *float_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_float(float_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_s64_to_double() { gint64 *s64_buffer; gdouble *double_destination; guint orig_xcross_count, xcross_count; guint i; s64_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE; i++){ s64_buffer[i] = G_MAXINT64 * sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_s64(s64_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_s64_to_double(double_destination, 1, s64_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_S64_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_s8() { gfloat *float_buffer; gint8 *s8_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_s8(s8_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_s16() { gfloat *float_buffer; gint16 *s16_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_s16(s16_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_s24() { gfloat *float_buffer; gint32 *s24_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_s24(s24_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_s32() { gfloat *float_buffer; gint32 *s32_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_s32(s32_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_s64() { gfloat *float_buffer; gint64 *s64_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_s64(s64_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_float() { gfloat *float_buffer, *float_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_float(float_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_float_to_double() { gfloat *float_buffer; gdouble *double_destination; guint orig_xcross_count, xcross_count; guint i; float_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE; i++){ float_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_float(float_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_float_to_double(double_destination, 1, float_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_FLOAT_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_s8() { gdouble *double_buffer; gint8 *s8_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); s8_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_8_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_s8(s8_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s8(s8_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S8_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_s16() { gdouble *double_buffer; gint16 *s16_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); s16_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_16_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_s16(s16_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s16(s16_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S16_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_s24() { gdouble *double_buffer; gint32 *s24_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); s24_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_24_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_s24(s24_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s24(s24_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S24_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_s32() { gdouble *double_buffer; gint32 *s32_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); s32_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_32_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_s32(s32_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s32(s32_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S32_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_s64() { gdouble *double_buffer; gint64 *s64_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); s64_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE, AGS_SOUNDCARD_SIGNED_64_BIT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_s64(s64_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_s64(s64_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_S64_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_float() { gdouble *double_buffer; gfloat *float_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); float_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE, AGS_SOUNDCARD_FLOAT); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_float(float_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_float(float_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_FLOAT_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_double_to_double() { gdouble *double_buffer, *double_destination; guint orig_xcross_count, xcross_count; guint i; double_buffer = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); double_destination = ags_stream_alloc(AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE, AGS_SOUNDCARD_DOUBLE); for(i = 0; i < AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE; i++){ double_buffer[i] = sin(i * 2.0 * M_PI * AGS_AUDIO_BUFFER_UTIL_TEST_FREQUENCY / AGS_AUDIO_BUFFER_UTIL_TEST_SAMPLERATE); } orig_xcross_count = ags_synth_util_get_xcross_count_double(double_buffer, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE); /* test */ ags_audio_buffer_util_copy_double_to_double(double_destination, 1, double_buffer, 1, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE); xcross_count = ags_synth_util_get_xcross_count_double(double_destination, AGS_AUDIO_BUFFER_UTIL_TEST_COPY_DOUBLE_TO_DOUBLE_BUFFER_SIZE); CU_ASSERT(orig_xcross_count == xcross_count); } void ags_audio_buffer_util_test_copy_buffer_to_buffer() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAudioBufferUtilTest", ags_audio_buffer_util_test_init_suite, ags_audio_buffer_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_audio_buffer_util.c format from soundcard", ags_audio_buffer_util_test_format_from_soundcard) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c get copy mode", ags_audio_buffer_util_test_get_copy_mode) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c clear float", ags_audio_buffer_util_test_clear_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c clear double", ags_audio_buffer_util_test_clear_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c clear buffer", ags_audio_buffer_util_test_clear_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope s8", ags_audio_buffer_util_test_envelope_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope s16", ags_audio_buffer_util_test_envelope_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope s24", ags_audio_buffer_util_test_envelope_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope s32", ags_audio_buffer_util_test_envelope_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope s64", ags_audio_buffer_util_test_envelope_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope float", ags_audio_buffer_util_test_envelope_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope double", ags_audio_buffer_util_test_envelope_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c envelope", ags_audio_buffer_util_test_envelope) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume s8", ags_audio_buffer_util_test_volume_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume s16", ags_audio_buffer_util_test_volume_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume s24", ags_audio_buffer_util_test_volume_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume s32", ags_audio_buffer_util_test_volume_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume s64", ags_audio_buffer_util_test_volume_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume float", ags_audio_buffer_util_test_volume_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume double", ags_audio_buffer_util_test_volume_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c volume", ags_audio_buffer_util_test_volume) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample s8", ags_audio_buffer_util_test_resample_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample s16", ags_audio_buffer_util_test_resample_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample s24", ags_audio_buffer_util_test_resample_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample s32", ags_audio_buffer_util_test_resample_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample s64", ags_audio_buffer_util_test_resample_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample float", ags_audio_buffer_util_test_resample_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample double", ags_audio_buffer_util_test_resample_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c resample", ags_audio_buffer_util_test_resample) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak s8", ags_audio_buffer_util_test_peak_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak s16", ags_audio_buffer_util_test_peak_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak s24", ags_audio_buffer_util_test_peak_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak s32", ags_audio_buffer_util_test_peak_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak s64", ags_audio_buffer_util_test_peak_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak float", ags_audio_buffer_util_test_peak_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak double", ags_audio_buffer_util_test_peak_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c peak", ags_audio_buffer_util_test_peak) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to s8", ags_audio_buffer_util_test_copy_s8_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to s16", ags_audio_buffer_util_test_copy_s8_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to s24", ags_audio_buffer_util_test_copy_s8_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to s32", ags_audio_buffer_util_test_copy_s8_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to s64", ags_audio_buffer_util_test_copy_s8_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to float", ags_audio_buffer_util_test_copy_s8_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s8 to double", ags_audio_buffer_util_test_copy_s8_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to s8", ags_audio_buffer_util_test_copy_s16_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to s16", ags_audio_buffer_util_test_copy_s16_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to s24", ags_audio_buffer_util_test_copy_s16_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to s32", ags_audio_buffer_util_test_copy_s16_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to s64", ags_audio_buffer_util_test_copy_s16_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to float", ags_audio_buffer_util_test_copy_s16_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s16 to double", ags_audio_buffer_util_test_copy_s16_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to s8", ags_audio_buffer_util_test_copy_s24_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to s16", ags_audio_buffer_util_test_copy_s24_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to s24", ags_audio_buffer_util_test_copy_s24_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to s32", ags_audio_buffer_util_test_copy_s24_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to s64", ags_audio_buffer_util_test_copy_s24_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to float", ags_audio_buffer_util_test_copy_s24_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s24 to double", ags_audio_buffer_util_test_copy_s24_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to s8", ags_audio_buffer_util_test_copy_s32_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to s16", ags_audio_buffer_util_test_copy_s32_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to s24", ags_audio_buffer_util_test_copy_s32_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to s32", ags_audio_buffer_util_test_copy_s32_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to s64", ags_audio_buffer_util_test_copy_s32_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to float", ags_audio_buffer_util_test_copy_s32_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s32 to double", ags_audio_buffer_util_test_copy_s32_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to s8", ags_audio_buffer_util_test_copy_s64_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to s16", ags_audio_buffer_util_test_copy_s64_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to s24", ags_audio_buffer_util_test_copy_s64_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to s32", ags_audio_buffer_util_test_copy_s64_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to s64", ags_audio_buffer_util_test_copy_s64_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to float", ags_audio_buffer_util_test_copy_s64_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy s64 to double", ags_audio_buffer_util_test_copy_s64_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to s8", ags_audio_buffer_util_test_copy_float_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to s16", ags_audio_buffer_util_test_copy_float_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to s24", ags_audio_buffer_util_test_copy_float_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to s32", ags_audio_buffer_util_test_copy_float_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to s64", ags_audio_buffer_util_test_copy_float_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to float", ags_audio_buffer_util_test_copy_float_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy float to double", ags_audio_buffer_util_test_copy_float_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to s8", ags_audio_buffer_util_test_copy_double_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to s16", ags_audio_buffer_util_test_copy_double_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to s24", ags_audio_buffer_util_test_copy_double_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to s32", ags_audio_buffer_util_test_copy_double_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to s64", ags_audio_buffer_util_test_copy_double_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to float", ags_audio_buffer_util_test_copy_double_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy double to double", ags_audio_buffer_util_test_copy_double_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_audio_buffer_util.c copy buffer to buffer", ags_audio_buffer_util_test_copy_buffer_to_buffer) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/0000755000175000017500000000000013622252263014301 500000000000000gsequencer-3.1.3/ags/test/audio/osc/controller/0000755000175000017500000000000013622252263016464 500000000000000gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_front_controller_test.c0000644000175000017500000001567013614062654024715 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_osc_front_controller_test_init_suite(); int ags_osc_front_controller_test_clean_suite(); void ags_osc_front_controller_test_add_message(); void ags_osc_front_controller_test_remove_message(); void ags_osc_front_controller_test_start_delegate(); void ags_osc_front_controller_test_stop_delegate(); void ags_osc_front_controller_test_do_request(); #define AGS_OSC_FRONT_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_front_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_FRONT_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_FRONT_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_front_controller_test_clean_suite() { return(0); } void ags_osc_front_controller_test_add_message() { AgsOscFrontController *front_controller; AgsOscMessage *message; front_controller = ags_osc_front_controller_new(); CU_ASSERT(front_controller->message == NULL); message = ags_osc_message_new(); CU_ASSERT(message != NULL); message->immediately = TRUE; ags_osc_front_controller_add_message(front_controller, message); CU_ASSERT(front_controller->message != NULL); } void ags_osc_front_controller_test_remove_message() { AgsOscFrontController *front_controller; AgsOscMessage *message; front_controller = ags_osc_front_controller_new(); message = ags_osc_message_new(); CU_ASSERT(message != NULL); message->immediately = TRUE; front_controller->message = g_list_prepend(front_controller->message, message); ags_osc_front_controller_remove_message(front_controller, message); CU_ASSERT(front_controller->message == NULL); } void ags_osc_front_controller_test_start_delegate() { AgsOscServer *server; AgsOscFrontController *front_controller; server = ags_osc_server_new(); front_controller = ags_osc_front_controller_new(); g_object_set(front_controller, "osc-server", server, NULL); ags_osc_front_controller_start_delegate(front_controller); CU_ASSERT(ags_osc_front_controller_test_flags(front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED) == TRUE); } void ags_osc_front_controller_test_stop_delegate() { AgsOscServer *server; AgsOscFrontController *front_controller; server = ags_osc_server_new(); front_controller = ags_osc_front_controller_new(); g_object_set(front_controller, "osc-server", server, NULL); ags_osc_front_controller_start_delegate(front_controller); CU_ASSERT(ags_osc_front_controller_test_flags(front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED) == TRUE); while(!ags_osc_front_controller_test_flags(front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_RUNNING)){ sleep(1); } ags_osc_front_controller_stop_delegate(front_controller); CU_ASSERT(ags_osc_front_controller_test_flags(front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED) == FALSE); } void ags_osc_front_controller_test_do_request() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscFrontControllerTest", ags_osc_front_controller_test_init_suite, ags_osc_front_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscFrontController add message", ags_osc_front_controller_test_add_message) == NULL) || (CU_add_test(pSuite, "test of AgsOscFrontController remove message", ags_osc_front_controller_test_remove_message) == NULL) || (CU_add_test(pSuite, "test of AgsOscFrontController start delegate", ags_osc_front_controller_test_start_delegate) == NULL) || (CU_add_test(pSuite, "test of AgsOscFrontController stop delegate", ags_osc_front_controller_test_stop_delegate) == NULL) || (CU_add_test(pSuite, "test of AgsOscFrontController do request", ags_osc_front_controller_test_do_request) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_config_controller_test.c0000644000175000017500000001365513614062654025033 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include int ags_osc_config_controller_test_init_suite(); int ags_osc_config_controller_test_clean_suite(); void ags_osc_config_controller_test_apply_config(); #define AGS_OSC_CONFIG_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" #define AGS_OSC_CONFIG_CONTROLLER_TEST_APPLY_CONFIG_ARGUMENT "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=256\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_config_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_CONFIG_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_CONFIG_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_config_controller_test_clean_suite() { return(0); } void ags_osc_config_controller_test_apply_config() { AgsOscConnection *osc_connection; AgsOscConfigController *osc_config_controller; GList *osc_response; unsigned char *message; guint config_length; guint length; static const unsigned char *config_message = "/config\x00,s\x00\x00"; static const guint config_message_size = 12; osc_connection = ags_osc_connection_new(NULL); osc_config_controller = ags_osc_config_controller_new(); config_length = strlen(AGS_OSC_CONFIG_CONTROLLER_TEST_APPLY_CONFIG_ARGUMENT); length = config_message_size + (4 * ceil((double) (config_length + 1) / 4.0)); message = (unsigned char *) malloc(length * sizeof(unsigned char)); memset(message, 0, length * sizeof(unsigned char)); memcpy(message, config_message, config_message_size * sizeof(unsigned char)); memcpy(message + config_message_size, AGS_OSC_CONFIG_CONTROLLER_TEST_APPLY_CONFIG_ARGUMENT, config_length * sizeof(unsigned char)); osc_response = ags_osc_config_controller_apply_config(osc_config_controller, osc_connection, message, length); CU_ASSERT(osc_response != NULL); sleep(5); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscConfigControllerTest", ags_osc_config_controller_test_init_suite, ags_osc_config_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscConfigController apply config", ags_osc_config_controller_test_apply_config) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_action_controller_test.c0000644000175000017500000001736613614062654025046 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_osc_action_controller_test_init_suite(); int ags_osc_action_controller_test_clean_suite(); void ags_osc_action_controller_test_run_action(); #define AGS_OSC_ACTION_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[sequencer-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; AgsAudio *drum; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_action_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_ACTION_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_ACTION_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* drum */ drum = ags_audio_new(default_soundcard); g_object_ref(drum); g_object_set(drum, "audio-name", "test-drum", NULL); ags_audio_set_flags(drum, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(drum, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_audio_channels(drum, 2, 0); ags_audio_set_pads(drum, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(drum, AGS_TYPE_INPUT, 8, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, drum)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_action_controller_test_clean_suite() { return(0); } void ags_osc_action_controller_test_run_action() { AgsOscConnection *osc_connection; AgsOscActionController *osc_action_controller; GList *osc_response; static const unsigned char *start_soundcard_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSoundcard\x00\x00start\x00\x00\x00"; static const unsigned char *start_sequencer_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSequencer\x00\x00start\x00\x00\x00"; static const unsigned char *start_audio_message = "/action\x00,ss\x00/AgsSoundProvider/AgsAudio[0]\x00\x00\x00start\x00\x00\x00"; static const unsigned char *stop_soundcard_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSoundcard\x00\x00stop\x00\x00\x00\x00"; static const unsigned char *stop_sequencer_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSequencer\x00\x00stop\x00\x00\x00\x00"; static const unsigned char *stop_audio_message = "/action\x00,ss\x00/AgsSoundProvider/AgsAudio[0]\x00\x00\x00stop\x00\x00\x00\x00"; static const guint start_soundcard_message_size = 52; static const guint start_sequencer_message_size = 52; static const guint start_audio_message_size = 52; static const guint stop_soundcard_message_size = 52; static const guint stop_sequencer_message_size = 52; static const guint stop_audio_message_size = 52; osc_connection = ags_osc_connection_new(NULL); osc_action_controller = ags_osc_action_controller_new(); /* soundcard */ osc_response = ags_osc_action_controller_run_action(osc_action_controller, osc_connection, start_soundcard_message, start_soundcard_message_size); CU_ASSERT(osc_response != NULL); /* sequencer */ osc_response = ags_osc_action_controller_run_action(osc_action_controller, osc_connection, start_sequencer_message, start_sequencer_message_size); CU_ASSERT(osc_response != NULL); /* audio */ osc_response = ags_osc_action_controller_run_action(osc_action_controller, osc_connection, start_audio_message, start_audio_message_size); CU_ASSERT(osc_response != NULL); /* wait a moment */ sleep(10); /* soundcard */ osc_response = ags_osc_action_controller_run_action(osc_action_controller, osc_connection, stop_soundcard_message, stop_soundcard_message_size); CU_ASSERT(osc_response != NULL); /* sequencer */ osc_response = ags_osc_action_controller_run_action(osc_action_controller, osc_connection, stop_sequencer_message, stop_sequencer_message_size); CU_ASSERT(osc_response != NULL); /* audio */ osc_response = ags_osc_action_controller_run_action(osc_action_controller, osc_connection, stop_audio_message, stop_audio_message_size); CU_ASSERT(osc_response != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscActionControllerTest", ags_osc_action_controller_test_init_suite, ags_osc_action_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscActionController run action", ags_osc_action_controller_test_run_action) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_info_controller_test.c0000644000175000017500000001075313614062654024515 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include int ags_osc_info_controller_test_init_suite(); int ags_osc_info_controller_test_clean_suite(); void ags_osc_info_controller_test_get_info(); #define AGS_OSC_INFO_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_info_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_INFO_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_INFO_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_info_controller_test_clean_suite() { return(0); } void ags_osc_info_controller_test_get_info() { AgsOscConnection *osc_connection; AgsOscInfoController *osc_info_controller; GList *osc_response; static const unsigned char *info_message = "/info\x00\x00\x00"; static const guint info_message_size = 8; osc_connection = ags_osc_connection_new(NULL); osc_info_controller = ags_osc_info_controller_new(); /* drum */ osc_response = ags_osc_info_controller_get_info(osc_info_controller, osc_connection, info_message, info_message_size); CU_ASSERT(osc_response != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscInfoControllerTest", ags_osc_info_controller_test_init_suite, ags_osc_info_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscInfoController get info", ags_osc_info_controller_test_get_info) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_meter_controller_test.c0000644000175000017500000003666213614062654024705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include int ags_osc_meter_controller_test_init_suite(); int ags_osc_meter_controller_test_clean_suite(); void ags_osc_meter_controller_test_monitor_alloc(); void ags_osc_meter_controller_test_monitor_free(); void ags_osc_meter_controller_test_monitor_ref(); void ags_osc_meter_controller_test_monitor_unref(); void ags_osc_meter_controller_test_find_path(); void ags_osc_meter_controller_test_find_port(); void ags_osc_meter_controller_test_add_monitor(); void ags_osc_meter_controller_test_remove_monitor(); void ags_osc_meter_controller_test_contains_monitor(); void ags_osc_meter_controller_test_start_monitor(); void ags_osc_meter_controller_test_stop_monitor(); void ags_osc_meter_controller_test_monitor_meter(); #define AGS_OSC_METER_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; AgsAudio *drum; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_meter_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_METER_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_METER_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* drum */ drum = ags_audio_new(default_soundcard); g_object_ref(drum); g_object_set(drum, "audio-name", "test-drum", NULL); ags_audio_set_flags(drum, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_audio_channels(drum, 2, 0); ags_audio_set_pads(drum, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(drum, AGS_TYPE_INPUT, 8, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, drum)); /* ags-peak */ ags_recall_factory_create(drum, NULL, NULL, "ags-peak", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_meter_controller_test_clean_suite() { return(0); } void ags_osc_meter_controller_test_monitor_alloc() { AgsOscMeterControllerMonitor *monitor; monitor = ags_osc_meter_controller_monitor_alloc(); CU_ASSERT(monitor != NULL); } void ags_osc_meter_controller_test_monitor_free() { AgsOscMeterControllerMonitor *monitor; monitor = ags_osc_meter_controller_monitor_alloc(); CU_ASSERT(monitor != NULL); ags_osc_meter_controller_monitor_free(monitor); //TODO:JK: improve me } void ags_osc_meter_controller_test_monitor_ref() { AgsOscMeterControllerMonitor *monitor; monitor = ags_osc_meter_controller_monitor_alloc(); CU_ASSERT(monitor != NULL); ags_osc_meter_controller_monitor_ref(monitor); CU_ASSERT(g_atomic_int_get(&(monitor->ref_count)) == 1); } void ags_osc_meter_controller_test_monitor_unref() { AgsOscMeterControllerMonitor *monitor; monitor = ags_osc_meter_controller_monitor_alloc(); g_atomic_int_set(&(monitor->ref_count), 2); CU_ASSERT(monitor != NULL); ags_osc_meter_controller_monitor_unref(monitor); CU_ASSERT(g_atomic_int_get(&(monitor->ref_count)) == 1); } void ags_osc_meter_controller_test_find_path() { AgsOscMeterControllerMonitor **monitor; GList *start_list, *list; guint i; monitor = (AgsOscMeterControllerMonitor **) malloc(7 * sizeof(AgsOscMeterControllerMonitor *)); start_list = NULL; for(i = 0; i < 7; i++){ monitor[i] = ags_osc_meter_controller_monitor_alloc(); start_list = g_list_prepend(start_list, monitor[i]); monitor[i]->path = g_strdup_printf("/test[%d]", i); } start_list = g_list_reverse(start_list); list = ags_osc_meter_controller_monitor_find_path(start_list, "/test[0]"); CU_ASSERT(list->data == monitor[0]); list = ags_osc_meter_controller_monitor_find_path(start_list, "/test[3]"); CU_ASSERT(list->data == monitor[3]); list = ags_osc_meter_controller_monitor_find_path(start_list, "/test[6]"); CU_ASSERT(list->data == monitor[6]); } void ags_osc_meter_controller_test_find_port() { AgsPort **port; AgsOscMeterControllerMonitor **monitor; GList *start_list, *list; guint i; port = (AgsPort **) malloc(7 * sizeof(AgsPort *)); monitor = (AgsOscMeterControllerMonitor **) malloc(7 * sizeof(AgsOscMeterControllerMonitor *)); start_list = NULL; for(i = 0; i < 7; i++){ port[i] = ags_port_new(); monitor[i] = ags_osc_meter_controller_monitor_alloc(); start_list = g_list_prepend(start_list, monitor[i]); monitor[i]->port = port[i]; } start_list = g_list_reverse(start_list); list = ags_osc_meter_controller_monitor_find_port(start_list, port[0]); CU_ASSERT(list->data == monitor[0]); list = ags_osc_meter_controller_monitor_find_port(start_list, port[3]); CU_ASSERT(list->data == monitor[3]); list = ags_osc_meter_controller_monitor_find_port(start_list, port[6]); CU_ASSERT(list->data == monitor[6]); } void ags_osc_meter_controller_test_add_monitor() { AgsOscConnection *osc_connection; AgsOscMeterController *osc_meter_controller; AgsOscMeterControllerMonitor *monitor; osc_connection = ags_osc_connection_new(NULL); osc_meter_controller = ags_osc_meter_controller_new(); CU_ASSERT(osc_meter_controller->monitor == NULL); monitor = ags_osc_meter_controller_monitor_alloc(); monitor->osc_connection = osc_connection; monitor->path = g_strdup("./test[0]"); monitor->port = ags_port_new(); ags_osc_meter_controller_add_monitor(osc_meter_controller, monitor); CU_ASSERT(osc_meter_controller->monitor->data == monitor); ags_osc_meter_controller_add_monitor(osc_meter_controller, monitor); CU_ASSERT(g_list_length(osc_meter_controller->monitor) == 1); } void ags_osc_meter_controller_test_remove_monitor() { AgsOscConnection *osc_connection; AgsOscMeterController *osc_meter_controller; AgsOscMeterControllerMonitor *monitor; osc_connection = ags_osc_connection_new(NULL); osc_meter_controller = ags_osc_meter_controller_new(); CU_ASSERT(osc_meter_controller->monitor == NULL); monitor = ags_osc_meter_controller_monitor_alloc(); monitor->osc_connection = osc_connection; monitor->path = g_strdup("./test[0]"); monitor->port = ags_port_new(); osc_meter_controller->monitor = g_list_prepend(osc_meter_controller->monitor, monitor); ags_osc_meter_controller_remove_monitor(osc_meter_controller, monitor); CU_ASSERT(osc_meter_controller->monitor == NULL); } void ags_osc_meter_controller_test_contains_monitor() { AgsOscConnection *osc_connection; AgsOscMeterController *osc_meter_controller; AgsOscMeterControllerMonitor *monitor; osc_connection = ags_osc_connection_new(NULL); osc_meter_controller = ags_osc_meter_controller_new(); CU_ASSERT(osc_meter_controller->monitor == NULL); monitor = ags_osc_meter_controller_monitor_alloc(); monitor->osc_connection = osc_connection; monitor->path = g_strdup("./test[0]"); monitor->port = ags_port_new(); osc_meter_controller->monitor = g_list_prepend(osc_meter_controller->monitor, monitor); CU_ASSERT(ags_osc_meter_controller_contains_monitor(osc_meter_controller, monitor->osc_connection, monitor->port) == TRUE); CU_ASSERT(ags_osc_meter_controller_contains_monitor(osc_meter_controller, monitor->osc_connection, ags_port_new()) == FALSE); CU_ASSERT(ags_osc_meter_controller_contains_monitor(osc_meter_controller, ags_osc_connection_new(NULL), monitor->port) == FALSE); CU_ASSERT(ags_osc_meter_controller_contains_monitor(osc_meter_controller, ags_osc_connection_new(NULL), ags_port_new()) == FALSE); CU_ASSERT(ags_osc_meter_controller_contains_monitor(osc_meter_controller, NULL, NULL) == FALSE); } void ags_osc_meter_controller_test_start_monitor() { AgsOscMeterController *osc_meter_controller; struct timespec delay; guint i; osc_meter_controller = ags_osc_meter_controller_new(); ags_osc_meter_controller_start_monitor(osc_meter_controller); CU_ASSERT(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_STARTED) == TRUE); delay.tv_sec = 0; delay.tv_nsec = AGS_NSEC_PER_SEC / 30; i = 0; while(i < 3334 && !ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING)){ nanosleep(&delay, NULL); i++; } CU_ASSERT(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING) == TRUE); } void ags_osc_meter_controller_test_stop_monitor() { AgsOscMeterController *osc_meter_controller; struct timespec delay; guint i; osc_meter_controller = ags_osc_meter_controller_new(); ags_osc_meter_controller_start_monitor(osc_meter_controller); CU_ASSERT(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_STARTED) == TRUE); delay.tv_sec = 0; delay.tv_nsec = AGS_NSEC_PER_SEC / 30; i = 0; while(i < 3334 && !ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING)){ nanosleep(&delay, NULL); i++; } CU_ASSERT(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING) == TRUE); ags_osc_meter_controller_stop_monitor(osc_meter_controller); CU_ASSERT(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING) == FALSE); CU_ASSERT(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_STARTED) == FALSE); } void ags_osc_meter_controller_test_monitor_meter() { AgsOscConnection *osc_connection; AgsOscMeterController *osc_meter_controller; GList *osc_response; static const unsigned char *enable_peak_message = "/meter\x00\x00,sT\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-15]/AgsPeakChannel[0]/AgsPort[\"./peak[0]\"]:value\x00"; static const unsigned char *disable_peak_message = "/meter\x00\x00,sF\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-15]/AgsPeakChannel[0]/AgsPort[\"./peak[0]\"]:value\x00"; static const guint enable_peak_message_size = 112; static const guint disable_peak_message_size = 112; osc_connection = ags_osc_connection_new(NULL); osc_meter_controller = ags_osc_meter_controller_new(); /* drum */ osc_response = ags_osc_meter_controller_monitor_meter(osc_meter_controller, osc_connection, enable_peak_message, enable_peak_message_size); CU_ASSERT(osc_response != NULL); osc_response = ags_osc_meter_controller_monitor_meter(osc_meter_controller, osc_connection, disable_peak_message, disable_peak_message_size); CU_ASSERT(osc_response != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscMeterControllerTest", ags_osc_meter_controller_test_init_suite, ags_osc_meter_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscMeterController monitor alloc", ags_osc_meter_controller_test_monitor_alloc) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController monitor free", ags_osc_meter_controller_test_monitor_free) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController monitor ref", ags_osc_meter_controller_test_monitor_ref) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController monitor unref", ags_osc_meter_controller_test_monitor_unref) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController find path", ags_osc_meter_controller_test_find_path) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController find port", ags_osc_meter_controller_test_find_port) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController add monitor", ags_osc_meter_controller_test_add_monitor) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController remove monitor", ags_osc_meter_controller_test_remove_monitor) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController contains monitor", ags_osc_meter_controller_test_contains_monitor) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController start monitor", ags_osc_meter_controller_test_start_monitor) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController stop monitor", ags_osc_meter_controller_test_stop_monitor) == NULL) || (CU_add_test(pSuite, "test of AgsOscMeterController monitor meter", ags_osc_meter_controller_test_monitor_meter) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_node_controller_test.c0000644000175000017500000002223213614062654024502 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include int ags_osc_node_controller_test_init_suite(); int ags_osc_node_controller_test_clean_suite(); void ags_osc_node_controller_test_get_data(); #define AGS_OSC_NODE_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; AgsAudio *panel; AgsAudio *spectrometer; AgsAudio *drum; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_node_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_NODE_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_NODE_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* panel */ panel = ags_audio_new(default_soundcard); g_object_ref(panel); g_object_set(panel, "audio-name", "test-panel", NULL); ags_audio_set_flags(panel, (AGS_AUDIO_SYNC)); ags_audio_set_audio_channels(panel, 2, 0); ags_audio_set_pads(panel, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(panel, AGS_TYPE_INPUT, 1, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, panel)); /* ags-play */ ags_recall_factory_create(panel, NULL, NULL, "ags-play-master", 0, 2, 0, 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-mute */ ags_recall_factory_create(panel, NULL, NULL, "ags-mute", 0, 2, 0, 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* spectrometer */ spectrometer = ags_audio_new(default_soundcard); g_object_ref(spectrometer); g_object_set(spectrometer, "audio-name", "test-spectrometer", NULL); ags_audio_set_flags(spectrometer, (AGS_AUDIO_SYNC)); ags_audio_set_audio_channels(spectrometer, 2, 0); ags_audio_set_pads(spectrometer, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(spectrometer, AGS_TYPE_INPUT, 1, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, spectrometer)); ags_recall_factory_create(spectrometer, NULL, NULL, "ags-analyse", 0, 2, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* drum */ drum = ags_audio_new(default_soundcard); g_object_ref(drum); g_object_set(drum, "audio-name", "test-drum", NULL); ags_audio_set_flags(drum, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_audio_channels(drum, 2, 0); ags_audio_set_pads(drum, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(drum, AGS_TYPE_INPUT, 8, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, drum)); /* ags-copy-pattern */ ags_recall_factory_create(drum, NULL, NULL, "ags-copy-pattern", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_REMAP | AGS_RECALL_FACTORY_RECALL), 0); /* ags-volume */ ags_recall_factory_create(drum, NULL, NULL, "ags-volume", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-envelope */ ags_recall_factory_create(drum, NULL, NULL, "ags-envelope", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_node_controller_test_clean_suite() { return(0); } void ags_osc_node_controller_test_get_data() { AgsChannel *channel; AgsOscConnection *osc_connection; AgsOscNodeController *osc_node_controller; GList *osc_response; guint length; guint padding; gboolean success; static const unsigned char *volume_message = "/node\x00\x00\x00,s\x00\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-1]/AgsVolumeChannel[0]/AgsPort[\"./volume[0]\"]:value\x00\x00"; static const guint volume_message_size = 116; osc_connection = ags_osc_connection_new(NULL); osc_node_controller = ags_osc_node_controller_new(); /* drum */ osc_response = ags_osc_node_controller_get_data(osc_node_controller, osc_connection, volume_message, volume_message_size); CU_ASSERT(osc_response != NULL); success = TRUE; while(osc_response != NULL){ gchar *address_pattern; gchar *type_tag; gchar *path; gfloat volume; ags_osc_buffer_util_get_message(AGS_OSC_RESPONSE(osc_response->data)->packet + 4, &address_pattern, &type_tag); success = !g_strcmp0(address_pattern, "/node"); if(!success){ break; } success = !g_strcmp0(type_tag, ",sf"); if(!success){ break; } ags_osc_buffer_util_get_string(AGS_OSC_RESPONSE(osc_response->data)->packet + 16, &path, &length); if(path == NULL){ success = FALSE; break; } length = 4 * (guint) ceil((double) (length + 1) / 4.0); ags_osc_buffer_util_get_float(AGS_OSC_RESPONSE(osc_response->data)->packet + 16 + length, &volume); if(volume != 1.0){ success = FALSE; break; } osc_response = osc_response->next; } CU_ASSERT(success); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscNodeControllerTest", ags_osc_node_controller_test_init_suite, ags_osc_node_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscNodeController get data", ags_osc_node_controller_test_get_data) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_renew_controller_test.c0000644000175000017500000003254013614062654024700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include int ags_osc_renew_controller_test_init_suite(); int ags_osc_renew_controller_test_clean_suite(); void ags_osc_renew_controller_test_set_data(); #define AGS_OSC_RENEW_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; AgsAudio *panel; AgsAudio *spectrometer; AgsAudio *drum; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_renew_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_RENEW_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_RENEW_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* panel */ panel = ags_audio_new(default_soundcard); g_object_ref(panel); g_object_set(panel, "audio-name", "test-panel", NULL); ags_audio_set_flags(panel, (AGS_AUDIO_SYNC)); ags_audio_set_audio_channels(panel, 2, 0); ags_audio_set_pads(panel, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(panel, AGS_TYPE_INPUT, 1, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, panel)); /* ags-play */ ags_recall_factory_create(panel, NULL, NULL, "ags-play-master", 0, 2, 0, 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-mute */ ags_recall_factory_create(panel, NULL, NULL, "ags-mute", 0, 2, 0, 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* spectrometer */ spectrometer = ags_audio_new(default_soundcard); g_object_ref(spectrometer); g_object_set(spectrometer, "audio-name", "test-spectrometer", NULL); ags_audio_set_flags(spectrometer, (AGS_AUDIO_SYNC)); ags_audio_set_audio_channels(spectrometer, 2, 0); ags_audio_set_pads(spectrometer, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(spectrometer, AGS_TYPE_INPUT, 1, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, spectrometer)); ags_recall_factory_create(spectrometer, NULL, NULL, "ags-analyse", 0, 2, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* drum */ drum = ags_audio_new(default_soundcard); g_object_ref(drum); g_object_set(drum, "audio-name", "test-drum", NULL); ags_audio_set_flags(drum, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_audio_channels(drum, 2, 0); ags_audio_set_pads(drum, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(drum, AGS_TYPE_INPUT, 8, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, drum)); /* ags-copy-pattern */ ags_recall_factory_create(drum, NULL, NULL, "ags-copy-pattern", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_REMAP | AGS_RECALL_FACTORY_RECALL), 0); /* ags-volume */ ags_recall_factory_create(drum, NULL, NULL, "ags-volume", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-envelope */ ags_recall_factory_create(drum, NULL, NULL, "ags-envelope", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_renew_controller_test_clean_suite() { return(0); } void ags_osc_renew_controller_test_set_data() { AgsChannel *channel; AgsOscConnection *osc_connection; AgsOscRenewController *osc_renew_controller; GList *osc_response; unsigned char *message; unsigned char *magnitude_message; gdouble *magnitude_buffer; guint magnitude_message_size; guint cache_buffer_size; guint length; guint padding; guint i, j; gboolean success; GValue value = {0,}; static const unsigned char *mute_message = "/renew\x00\x00,sf\x00/AgsSoundProvider/AgsAudio[\"test-panel\"]/AgsInput[0-1]/AgsMuteChannel[0]/AgsPort[\"./muted[0]\"]:value\x00\x00\x00\x00\x00\x00"; static const unsigned char *magnitude_path = "/AgsSoundProvider/AgsAudio[\"test-spectrometer\"]/AgsInput[0-1]/AgsAnalyseChannel[0]/AgsPort[\"./magnitude-buffer[0]\"]:value"; static const guint mute_message_size = 120; osc_connection = ags_osc_connection_new(NULL); osc_renew_controller = ags_osc_renew_controller_new(); /* panel */ message = (unsigned char *) malloc(mute_message_size * sizeof(unsigned char)); memcpy(message, mute_message, mute_message_size * sizeof(unsigned char)); ags_osc_buffer_util_put_float(message + mute_message_size - 4, 1.0); g_value_init(&value, G_TYPE_FLOAT); g_object_get(panel, "input", &channel, NULL); success = TRUE; for(i = 0; i < 2 && success; i++){ GList *start_play, *play; GList *start_port, *port; g_object_get(channel, "play", &start_play, NULL); play = ags_recall_template_find_type(start_play, AGS_TYPE_MUTE_CHANNEL); g_object_get(play->data, "port", &start_port, NULL); port = ags_port_find_specifier(start_port, "./muted[0]"); ags_port_safe_read(port->data, &value); if(g_value_get_float(&value) == 1.0){ success = FALSE; break; } g_object_get(channel, "next", &channel, NULL); } CU_ASSERT(success); osc_response = ags_osc_renew_controller_set_data(osc_renew_controller, osc_connection, message, mute_message_size); CU_ASSERT(osc_response != NULL); g_object_get(panel, "input", &channel, NULL); success = TRUE; for(i = 0; i < 2 && success; i++){ GList *start_play, *play; GList *start_port, *port; g_object_get(channel, "play", &start_play, NULL); play = ags_recall_template_find_type(start_play, AGS_TYPE_MUTE_CHANNEL); g_object_get(play->data, "port", &start_port, NULL); port = ags_port_find_specifier(start_port, "./muted[0]"); ags_port_safe_read(port->data, &value); if(g_value_get_float(&value) != 1.0){ success = FALSE; break; } g_object_get(channel, "next", &channel, NULL); } CU_ASSERT(success); /* spectrometer */ magnitude_message = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); cache_buffer_size = ags_soundcard_helper_config_get_buffer_size(ags_config_get_instance()) / 2; memcpy(magnitude_message, "/renew\x00\x00,s[", 11 * sizeof(unsigned char)); magnitude_message_size = 11; for(i = 0; i < cache_buffer_size; i++){ magnitude_message[11 + i] = 'd'; } magnitude_message[11 + i] = ']'; magnitude_message_size += (cache_buffer_size + 1); padding = (4 * (guint) ceil((cache_buffer_size + 5) / 4.0)) - (cache_buffer_size + 4); for(i = 0; i < padding; i++){ magnitude_message[magnitude_message_size + i] = '\x00'; } magnitude_message_size += padding; length = strlen(magnitude_path); memcpy(magnitude_message + magnitude_message_size, magnitude_path, (length) * sizeof(unsigned char)); padding = (4 * (guint) ceil((length + 1) / 4.0)) - length; magnitude_message_size += length; for(i = 0; i < padding; i++){ magnitude_message[magnitude_message_size + i] = '\x00'; } magnitude_message_size += padding; for(i = 0; i < cache_buffer_size; i++){ ags_osc_buffer_util_put_double(magnitude_message + magnitude_message_size + (i * 8), 4.0); } magnitude_message_size += (cache_buffer_size * 8); g_value_unset(&value); g_value_init(&value, G_TYPE_POINTER); magnitude_buffer = (gdouble *) malloc(cache_buffer_size * sizeof(gdouble)); g_value_set_pointer(&value, magnitude_buffer); g_object_get(spectrometer, "input", &channel, NULL); success = TRUE; for(i = 0; i < 2 && success; i++){ GList *start_play, *play; GList *start_port, *port; g_object_get(channel, "play", &start_play, NULL); play = ags_recall_template_find_type(start_play, AGS_TYPE_ANALYSE_CHANNEL); g_object_get(play->data, "port", &start_port, NULL); port = ags_port_find_specifier(start_port, "./magnitude-buffer[0]"); ags_port_safe_read(port->data, &value); for(j = 0; j < cache_buffer_size; j++){ if(magnitude_buffer[j] != 0.0){ success = FALSE; break; } } g_object_get(channel, "next", &channel, NULL); } CU_ASSERT(success); osc_response = ags_osc_renew_controller_set_data(osc_renew_controller, osc_connection, magnitude_message, magnitude_message_size); g_object_get(spectrometer, "input", &channel, NULL); success = TRUE; for(i = 0; i < 2 && success; i++){ GList *start_play, *play; GList *start_port, *port; g_object_get(channel, "play", &start_play, NULL); play = ags_recall_template_find_type(start_play, AGS_TYPE_ANALYSE_CHANNEL); g_object_get(play->data, "port", &start_port, NULL); port = ags_port_find_specifier(start_port, "./magnitude-buffer[0]"); ags_port_safe_read(port->data, &value); for(j = 0; j < cache_buffer_size; j++){ if(magnitude_buffer[j] != 4.0){ success = FALSE; break; } } g_object_get(channel, "next", &channel, NULL); } CU_ASSERT(success); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscRenewControllerTest", ags_osc_renew_controller_test_init_suite, ags_osc_renew_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscRenewController set data", ags_osc_renew_controller_test_set_data) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/controller/ags_osc_status_controller_test.c0000644000175000017500000001116513614062654025103 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include int ags_osc_status_controller_test_init_suite(); int ags_osc_status_controller_test_clean_suite(); void ags_osc_status_controller_test_get_status(); #define AGS_OSC_STATUS_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_status_controller_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_STATUS_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_STATUS_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_status_controller_test_clean_suite() { return(0); } void ags_osc_status_controller_test_get_status() { AgsOscServer *osc_server; AgsOscConnection *osc_connection; AgsOscStatusController *osc_status_controller; GList *osc_response; static const unsigned char *status_message = "/status\x00,\x00\x00\x00"; static const guint status_message_size = 12; osc_server = ags_osc_server_new(); osc_connection = ags_osc_connection_new(osc_server); osc_status_controller = ags_osc_status_controller_new(); /* drum */ osc_response = ags_osc_status_controller_get_status(osc_status_controller, osc_connection, status_message, status_message_size); CU_ASSERT(osc_response != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscStatusControllerTest", ags_osc_status_controller_test_init_suite, ags_osc_status_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscStatusController get status", ags_osc_status_controller_test_get_status) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_server_test.c0000644000175000017500000001447313614062654020445 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_osc_server_test_init_suite(); int ags_osc_server_test_clean_suite(); void ags_osc_server_test_add_connection(); void ags_osc_server_test_remove_connection(); void ags_osc_server_test_add_controller(); void ags_osc_server_test_remove_controller(); void ags_osc_server_test_add_default_controller(); void ags_osc_server_test_start(); void ags_osc_server_test_stop(); void ags_osc_server_test_listen(); void ags_osc_server_test_dispatch(); #define AGS_OSC_SERVER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_server_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_SERVER_TEST_CONFIG, strlen(AGS_OSC_SERVER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_server_test_clean_suite() { return(0); } void ags_osc_server_test_add_connection() { AgsOscServer *osc_server; AgsOscConnection *osc_connection; osc_server = ags_osc_server_new(); CU_ASSERT(osc_server->connection == NULL); osc_connection = ags_osc_connection_new(osc_server); ags_osc_server_add_connection(osc_server, osc_connection); CU_ASSERT(osc_server->connection != NULL); } void ags_osc_server_test_remove_connection() { AgsOscServer *osc_server; AgsOscConnection *osc_connection; osc_server = ags_osc_server_new(); osc_connection = ags_osc_connection_new(osc_server); osc_server->connection = g_list_prepend(osc_server->connection, osc_connection); CU_ASSERT(osc_server->connection != NULL); ags_osc_server_remove_connection(osc_server, osc_connection); CU_ASSERT(osc_server->connection == NULL); } void ags_osc_server_test_add_controller() { //TODO:JK: implement me } void ags_osc_server_test_remove_controller() { //TODO:JK: implement me } void ags_osc_server_test_add_default_controller() { //TODO:JK: implement me } void ags_osc_server_test_start() { //TODO:JK: implement me } void ags_osc_server_test_stop() { //TODO:JK: implement me } void ags_osc_server_test_listen() { //TODO:JK: implement me } void ags_osc_server_test_dispatch() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscServerTest", ags_osc_server_test_init_suite, ags_osc_server_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscServer add connection", ags_osc_server_test_add_connection) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer remove connection", ags_osc_server_test_remove_connection) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer add controller", ags_osc_server_test_add_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer remove controller", ags_osc_server_test_remove_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer add default controller", ags_osc_server_test_add_default_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer start", ags_osc_server_test_start) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer stop", ags_osc_server_test_stop) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer listen", ags_osc_server_test_listen) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer dispatch", ags_osc_server_test_dispatch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/xmlrpc/0000755000175000017500000000000013622252263015606 500000000000000gsequencer-3.1.3/ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c0000644000175000017500000001521513607210263024200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_osc_xmlrpc_controller_test_init_suite(); int ags_osc_xmlrpc_controller_test_clean_suite(); void ags_osc_xmlrpc_controller_test_add_message(); void ags_osc_xmlrpc_controller_test_remove_message(); void ags_osc_xmlrpc_controller_test_start_delegate(); void ags_osc_xmlrpc_controller_test_stop_delegate(); void ags_osc_xmlrpc_controller_test_do_request(); #define AGS_OSC_XMLRPC_CONTROLLER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_xmlrpc_controller_test_init_suite() { AgsConfig *config; GList *start_audio; config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_XMLRPC_CONTROLLER_TEST_CONFIG, strlen(AGS_OSC_XMLRPC_CONTROLLER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_xmlrpc_controller_test_clean_suite() { return(0); } void ags_osc_xmlrpc_controller_test_add_message() { AgsOscXmlrpcController *xmlrpc_controller; AgsOscMessage *message; xmlrpc_controller = ags_osc_xmlrpc_controller_new(); CU_ASSERT(xmlrpc_controller->message == NULL); message = ags_osc_message_new(); CU_ASSERT(message != NULL); message->immediately = TRUE; ags_osc_xmlrpc_controller_add_message(xmlrpc_controller, message); CU_ASSERT(xmlrpc_controller->message != NULL); } void ags_osc_xmlrpc_controller_test_remove_message() { AgsOscXmlrpcController *xmlrpc_controller; AgsOscMessage *message; xmlrpc_controller = ags_osc_xmlrpc_controller_new(); message = ags_osc_message_new(); CU_ASSERT(message != NULL); message->immediately = TRUE; xmlrpc_controller->message = g_list_prepend(xmlrpc_controller->message, message); ags_osc_xmlrpc_controller_remove_message(xmlrpc_controller, message); CU_ASSERT(xmlrpc_controller->message == NULL); } void ags_osc_xmlrpc_controller_test_start_delegate() { AgsOscXmlrpcServer *server; AgsOscXmlrpcController *xmlrpc_controller; server = ags_osc_xmlrpc_server_new(); xmlrpc_controller = ags_osc_xmlrpc_controller_new(); g_object_set(xmlrpc_controller, "osc-xmlrpc-server", server, NULL); ags_osc_xmlrpc_controller_start_delegate(xmlrpc_controller); CU_ASSERT(ags_osc_xmlrpc_controller_test_flags(xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED) == TRUE); } void ags_osc_xmlrpc_controller_test_stop_delegate() { AgsOscXmlrpcServer *server; AgsOscXmlrpcController *xmlrpc_controller; server = ags_osc_xmlrpc_server_new(); xmlrpc_controller = ags_osc_xmlrpc_controller_new(); g_object_set(xmlrpc_controller, "osc-xmlrpc-server", server, NULL); ags_osc_xmlrpc_controller_start_delegate(xmlrpc_controller); CU_ASSERT(ags_osc_xmlrpc_controller_test_flags(xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED) == TRUE); ags_osc_xmlrpc_controller_stop_delegate(xmlrpc_controller); CU_ASSERT(ags_osc_xmlrpc_controller_test_flags(xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED) == FALSE); } void ags_osc_xmlrpc_controller_test_do_request() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscXmlrpcControllerTest", ags_osc_xmlrpc_controller_test_init_suite, ags_osc_xmlrpc_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscXmlrpcController add message", ags_osc_xmlrpc_controller_test_add_message) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcController remove message", ags_osc_xmlrpc_controller_test_remove_message) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcController start delegate", ags_osc_xmlrpc_controller_test_start_delegate) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcController stop delegate", ags_osc_xmlrpc_controller_test_stop_delegate) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcController do request", ags_osc_xmlrpc_controller_test_do_request) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_message_test.c0000644000175000017500000001342713607210263020552 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include int ags_osc_message_test_init_suite(); int ags_osc_message_test_clean_suite(); void ags_osc_message_test_set_property(); void ags_osc_message_test_get_property(); void ags_osc_message_test_sort_func(); #define AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_SEC (32) #define AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_FRACTION (25000) #define AGS_OSC_MESSAGE_TEST_GET_PROPERTY_TV_SEC (32) #define AGS_OSC_MESSAGE_TEST_GET_PROPERTY_TV_FRACTION (25000) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_message_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_message_test_clean_suite() { return(0); } void ags_osc_message_test_set_property() { AgsOscConnection *osc_connection; AgsOscMessage *osc_message; guint i; gboolean success; static const guchar *info_message = "/info\x00\x00\x00"; static const guint info_message_size = 8; osc_message = ags_osc_message_new(); osc_connection = ags_osc_connection_new(NULL); g_object_set(osc_message, "osc-connection", osc_connection, "tv-sec", AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_SEC, "tv-fraction", AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_FRACTION, "immediately", FALSE, "message-size", info_message_size, "message", info_message, NULL); CU_ASSERT(osc_message->osc_connection == osc_connection); CU_ASSERT(osc_message->tv_sec == AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_SEC); CU_ASSERT(osc_message->tv_fraction == AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_FRACTION); CU_ASSERT(osc_message->immediately == FALSE); CU_ASSERT(osc_message->message_size == info_message_size); success = TRUE; for(i = 0; i < info_message_size; i++){ if(osc_message->message[i] != info_message[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); g_object_set(osc_message, "immediately", TRUE, NULL); CU_ASSERT(osc_message->immediately == TRUE); } void ags_osc_message_test_get_property() { AgsOscConnection *osc_connection; AgsOscMessage *osc_message; gpointer message; guint message_size; gint32 tv_sec; gint32 tv_fraction; gboolean immediately; static const guchar *info_message = "/info\x00\x00\x00"; static const guint info_message_size = 8; osc_message = ags_osc_message_new(); osc_message->osc_connection = ags_osc_connection_new(NULL); osc_message->tv_sec = AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_SEC; osc_message->tv_fraction = AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_FRACTION; osc_message->immediately = FALSE; osc_message->message_size = info_message_size; osc_message->message = info_message; g_object_get(osc_message, "osc-connection", &osc_connection, "tv-sec", &tv_sec, "tv-fraction", &tv_fraction, "immediately", &immediately, "message-size", &message_size, "message", &message, NULL); CU_ASSERT(AGS_IS_OSC_CONNECTION(osc_connection) == TRUE); CU_ASSERT(osc_message->osc_connection == osc_connection); CU_ASSERT(tv_sec == AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_SEC); CU_ASSERT(tv_fraction == AGS_OSC_MESSAGE_TEST_SET_PROPERTY_TV_FRACTION); CU_ASSERT(immediately == FALSE); CU_ASSERT(message_size == info_message_size); CU_ASSERT(message == info_message); osc_message->immediately = TRUE; g_object_get(osc_message, "immediately", &immediately, NULL); CU_ASSERT(immediately == TRUE); } void ags_osc_message_test_sort_func() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscMessageTest", ags_osc_message_test_init_suite, ags_osc_message_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscMessage set property", ags_osc_message_test_set_property) == NULL) || (CU_add_test(pSuite, "test of AgsOscMessage get property", ags_osc_message_test_get_property) == NULL) || (CU_add_test(pSuite, "test of AgsOscMessage sort func", ags_osc_message_test_sort_func) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_connection_test.c0000644000175000017500000001022213607210263021253 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include int ags_osc_connection_test_init_suite(); int ags_osc_connection_test_clean_suite(); void ags_osc_connection_test_read_bytes(); void ags_osc_connection_test_write_response(); void ags_osc_connection_test_close(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_connection_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_connection_test_clean_suite() { return(0); } void ags_osc_connection_test_read_bytes() { //TODO:JK: implement me } void ags_osc_connection_test_write_response() { AgsOscConnection *osc_connection; AgsOscResponse *osc_response; unsigned char *packet; guint packet_size; gint64 retval; static const unsigned char server_info_message[] = "/info\0\0\0,ssss\0\0\0V2.1.0\0\0osc-server\0\0Advanced Gtk+ Sequencer\02.1.0\0\0\0"; osc_connection = ags_osc_connection_new(NULL); osc_connection->fd = open("/dev/null", O_RDWR, 0); CU_ASSERT(osc_connection->fd != -1); osc_response = ags_osc_response_new(); /* create packet */ packet = (unsigned char *) malloc((4 * sizeof(unsigned char)) + sizeof(server_info_message)); ags_osc_buffer_util_put_int32(packet, sizeof(server_info_message)); memcpy(packet + 4, server_info_message, sizeof(server_info_message)); /* set response packet */ g_object_set(osc_response, "packet", packet, "packet-size", (4 * sizeof(unsigned char)) + sizeof(server_info_message), NULL); retval = ags_osc_connection_write_response(osc_connection, osc_response); CU_ASSERT(retval >= (4 * sizeof(unsigned char)) + sizeof(server_info_message)); } void ags_osc_connection_test_close() { AgsOscConnection *osc_connection; osc_connection = ags_osc_connection_new(NULL); ags_osc_connection_close(osc_connection); CU_ASSERT(osc_connection->fd == -1); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscConnectionTest", ags_osc_connection_test_init_suite, ags_osc_connection_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscConnection read bytes", ags_osc_connection_test_read_bytes) == NULL) || (CU_add_test(pSuite, "test of AgsOscConnection write response", ags_osc_connection_test_write_response) == NULL) || (CU_add_test(pSuite, "test of AgsOscConnection close", ags_osc_connection_test_close) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_functional_osc_server_test.c0000644000175000017500000005614713622251556022673 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #ifdef __APPLE__ #include #include #endif #include #include #include #include #include gpointer ags_functional_osc_server_test_add_thread(gpointer data); int ags_functional_osc_server_test_init_suite(); int ags_functional_osc_server_test_clean_suite(); void ags_functional_osc_server_test_action_controller(); void ags_functional_osc_server_test_config_controller(); void ags_functional_osc_server_test_info_controller(); void ags_functional_osc_server_test_meter_controller(); void ags_functional_osc_server_test_node_controller(); void ags_functional_osc_server_test_renew_controller(); void ags_functional_osc_server_test_status_controller(); #define AGS_FUNCTIONAL_OSC_SERVER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "thread-pool-max-unused-threads=8\n" \ "max-precision=125\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[sequencer-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" #define AGS_FUNCTIONAL_OSC_SERVER_TEST_APPLY_CONFIG_ARGUMENT "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "thread-pool-max-unused-threads=8\n" \ "max-precision=125\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=256\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" #define AGS_FUNCTIONAL_OSC_SERVER_TEST_METER_PACKET_COUNT (16 * 30) GThread *add_thread = NULL; AgsApplicationContext *application_context; AgsAudio *drum; AgsOscServer *osc_server; AgsOscClient *osc_client; GObject *default_soundcard; gpointer ags_functional_osc_server_test_add_thread(gpointer data) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ exit(CU_get_error()); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalOscServerTest", ags_functional_osc_server_test_init_suite, ags_functional_osc_server_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); exit(CU_get_error()); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscServer providing action controller", ags_functional_osc_server_test_action_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer providing config controller", ags_functional_osc_server_test_config_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer providing info controller", ags_functional_osc_server_test_info_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer providing meter controller", ags_functional_osc_server_test_meter_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer providing node controller", ags_functional_osc_server_test_node_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer providing renew controller", ags_functional_osc_server_test_renew_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscServer providing status controller", ags_functional_osc_server_test_status_controller) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_osc_server_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FUNCTIONAL_OSC_SERVER_TEST_CONFIG, strlen(AGS_FUNCTIONAL_OSC_SERVER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* drum */ drum = ags_audio_new(default_soundcard); g_object_ref(drum); g_object_set(drum, "audio-name", "test-drum", NULL); ags_audio_set_flags(drum, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(drum, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_audio_channels(drum, 2, 0); ags_audio_set_pads(drum, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(drum, AGS_TYPE_INPUT, 8, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, drum)); /* ags-volume */ ags_recall_factory_create(drum, NULL, NULL, "ags-volume", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-mute */ ags_recall_factory_create(drum, NULL, NULL, "ags-mute", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-peak */ ags_recall_factory_create(drum, NULL, NULL, "ags-peak", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); ags_connectable_connect(AGS_CONNECTABLE(drum)); /* OSC server */ signal(SIGPIPE, SIG_IGN); osc_server = ags_osc_server_new(); osc_server->accept_delay->tv_nsec = AGS_NSEC_PER_SEC / 30; osc_server->dispatch_delay->tv_nsec = AGS_NSEC_PER_SEC / 30; ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET4 | AGS_OSC_SERVER_TCP)); ags_osc_server_add_default_controller(osc_server); ags_osc_server_start(osc_server); sleep(5); /* OSC client */ osc_client = ags_osc_client_new(); ags_osc_client_set_flags(osc_client, (AGS_OSC_CLIENT_INET4 | AGS_OSC_CLIENT_TCP)); ags_osc_client_connect(osc_client); sleep(5); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_osc_server_test_clean_suite() { close(osc_client->ip4_fd); ags_osc_server_stop(osc_server); return(0); } void ags_functional_osc_server_test_action_controller() { guchar *buffer; guchar *packet; guint buffer_length; gboolean retval; static const guchar *start_soundcard_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSoundcard\x00\x00start\x00\x00\x00"; static const guchar *start_sequencer_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSequencer\x00\x00start\x00\x00\x00"; static const guchar *start_audio_message = "/action\x00,ss\x00/AgsSoundProvider/AgsAudio[0]\x00\x00\x00start\x00\x00\x00"; static const guchar *stop_soundcard_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSoundcard\x00\x00stop\x00\x00\x00\x00"; static const guchar *stop_sequencer_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSequencer\x00\x00stop\x00\x00\x00\x00"; static const guchar *stop_audio_message = "/action\x00,ss\x00/AgsSoundProvider/AgsAudio[0]\x00\x00\x00stop\x00\x00\x00\x00"; static const guint start_soundcard_message_size = 52; static const guint start_sequencer_message_size = 52; static const guint start_audio_message_size = 52; static const guint stop_soundcard_message_size = 52; static const guint stop_sequencer_message_size = 52; static const guint stop_audio_message_size = 52; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); /* start soundcard */ packet = (guchar *) malloc((4 + start_soundcard_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, start_soundcard_message_size); memcpy(packet + 4, start_soundcard_message, (start_soundcard_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + start_soundcard_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + start_soundcard_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); /* start sequencer */ packet = (guchar *) malloc((4 + start_sequencer_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, start_sequencer_message_size); memcpy(packet + 4, start_sequencer_message, (start_sequencer_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + start_sequencer_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + start_sequencer_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); /* start audio */ packet = (guchar *) malloc((4 + start_audio_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, start_audio_message_size); memcpy(packet + 4, start_audio_message, (start_audio_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + start_audio_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + start_audio_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); /* stop soundcard */ packet = (guchar *) malloc((4 + stop_soundcard_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, stop_soundcard_message_size); memcpy(packet + 4, stop_soundcard_message, (stop_soundcard_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + stop_soundcard_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + stop_soundcard_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); /* stop sequencer */ packet = (guchar *) malloc((4 + stop_sequencer_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, stop_sequencer_message_size); memcpy(packet + 4, stop_sequencer_message, (stop_sequencer_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + stop_sequencer_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + stop_sequencer_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); /* stop audio */ packet = (guchar *) malloc((4 + stop_audio_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, stop_audio_message_size); memcpy(packet + 4, stop_audio_message, (stop_audio_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + stop_audio_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + stop_audio_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); } void ags_functional_osc_server_test_config_controller() { guchar *message; guchar *buffer; guchar *packet; guint config_length; guint length; guint buffer_length; gboolean retval; static const guchar *config_message = "/config\x00,s\x00\x00"; static const guint config_message_size = 12; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); /* apply config */ config_length = strlen(AGS_FUNCTIONAL_OSC_SERVER_TEST_APPLY_CONFIG_ARGUMENT); length = config_message_size + (4 * ceil((double) (config_length + 1) / 4.0)); message = (guchar *) malloc(length * sizeof(guchar)); memset(message, 0, length * sizeof(guchar)); memcpy(message, config_message, config_message_size * sizeof(guchar)); memcpy(message + config_message_size, AGS_FUNCTIONAL_OSC_SERVER_TEST_APPLY_CONFIG_ARGUMENT, config_length * sizeof(guchar)); packet = (guchar *) malloc((4 + length) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, length); memcpy(packet + 4, message, (length) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + length, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + length); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); } void ags_functional_osc_server_test_info_controller() { guchar *buffer; guchar *packet; guint buffer_length; gboolean retval; static const guchar *info_message = "/info\x00\x00\x00"; static const guint info_message_size = 8; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); packet = (guchar *) malloc((4 + info_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, info_message_size); memcpy(packet + 4, info_message, (info_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + info_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + info_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); sleep(5); } void ags_functional_osc_server_test_meter_controller() { struct timespec start_time; struct timespec timeout_delay; struct timespec idle_delay; guchar *buffer; guchar *packet; guint buffer_length; guint meter_packet_count; guint i; gboolean retval; static const guchar *enable_peak_message = "/meter\x00\x00,sT\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-15]/AgsPeakChannel[0]/AgsPort[\"./peak[0]\"]:value\x00"; static const guchar *disable_peak_message = "/meter\x00\x00,sF\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-15]/AgsPeakChannel[0]/AgsPort[\"./peak[0]\"]:value\x00"; static const guint enable_peak_message_size = 112; static const guint disable_peak_message_size = 112; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); /* enable meter */ packet = (guchar *) malloc((4 + enable_peak_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, enable_peak_message_size); memcpy(packet + 4, enable_peak_message, (enable_peak_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + enable_peak_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + enable_peak_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); /* read packets */ #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); start_time.tv_sec = mts.tv_sec; start_time.tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, &start_time); #endif timeout_delay.tv_sec = 180; timeout_delay.tv_nsec = 0; idle_delay.tv_sec = 0; idle_delay.tv_nsec = AGS_NSEC_PER_SEC / 30; meter_packet_count = 0; i = 0; /* set work-around for arm */ g_object_set(osc_client->ip4_socket, "blocking", FALSE, NULL); g_object_set(osc_client->ip6_socket, "blocking", FALSE, NULL); while(!ags_time_timeout_expired(&start_time, &timeout_delay)){ guchar *current_data; guchar *current_packet; gchar *address_pattern; guint data_length; current_data = ags_osc_client_read_bytes(osc_client, &data_length); if(current_data != NULL){ current_packet = ags_osc_util_slip_decode(current_data, data_length, NULL); if(data_length >= 8){ ags_osc_buffer_util_get_message(current_packet + 4, &address_pattern, NULL); if(!g_strcmp0(address_pattern, "/meter")){ meter_packet_count++; i++; } } free(current_packet); } if(i == 16){ i = 0; nanosleep(&idle_delay, NULL); } } CU_ASSERT(meter_packet_count >= AGS_FUNCTIONAL_OSC_SERVER_TEST_METER_PACKET_COUNT); /* unset work-around for arm */ g_object_set(osc_client->ip4_socket, "blocking", TRUE, NULL); g_object_set(osc_client->ip6_socket, "blocking", TRUE, NULL); /* disable meter */ packet = (guchar *) malloc((4 + disable_peak_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, disable_peak_message_size); memcpy(packet + 4, disable_peak_message, (disable_peak_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + disable_peak_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + disable_peak_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); } void ags_functional_osc_server_test_node_controller() { struct timespec start_time; struct timespec timeout_delay; guchar *buffer; guchar *packet; guint buffer_length; gboolean retval; gboolean success; static const guchar *volume_message = "/node\x00\x00\x00,s\x00\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-1]/AgsVolumeChannel[0]/AgsPort[\"./volume[0]\"]:value\x00\x00"; static const guint volume_message_size = 116; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); /* volume message */ packet = (guchar *) malloc((4 + volume_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, volume_message_size); memcpy(packet + 4, volume_message, (volume_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + volume_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + volume_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); /* read volume */ #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); start_time.tv_sec = mts.tv_sec; start_time.tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, &start_time); #endif timeout_delay.tv_sec = 10; timeout_delay.tv_nsec = 0; success = FALSE; while(!ags_time_timeout_expired(&start_time, &timeout_delay)){ guchar *current_data; guchar *current_packet; gchar *address_pattern; guint data_length; current_data = ags_osc_client_read_bytes(osc_client, &data_length); if(current_data != NULL){ current_packet = ags_osc_util_slip_decode(current_data, data_length, NULL); if(data_length >= 8){ ags_osc_buffer_util_get_message(current_packet + 4, &address_pattern, NULL); if(!g_strcmp0(address_pattern, "/node")){ success = TRUE; break; } } } } CU_ASSERT(success == TRUE); } void ags_functional_osc_server_test_renew_controller() { guchar *buffer; guchar *packet; guint buffer_length; gboolean retval; static const guchar *mute_message = "/renew\x00\x00,sf\x00/AgsSoundProvider/AgsAudio[\"test-panel\"]/AgsInput[0-1]/AgsMuteChannel[0]/AgsPort[\"./muted[0]\"]:value\x00\x00\x00\x00\x00\x00"; static const guint mute_message_size = 120; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); /* mute message */ packet = (guchar *) malloc((4 + mute_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, mute_message_size); memcpy(packet + 4, mute_message, (mute_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + mute_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + mute_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); } void ags_functional_osc_server_test_status_controller() { guchar *buffer; guchar *packet; guint buffer_length; gboolean retval; static const guchar *status_message = "/status\x00,\x00\x00\x00"; static const guint status_message_size = 12; CU_ASSERT(osc_server->ip4_fd != -1); CU_ASSERT(osc_client->ip4_fd != -1); /* status message */ packet = (guchar *) malloc((4 + status_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, status_message_size); memcpy(packet + 4, status_message, (status_message_size) * sizeof(guchar)); buffer = ags_osc_util_slip_encode(packet, 4 + status_message_size, &buffer_length); CU_ASSERT(buffer_length - 2 >= 4 + status_message_size); retval = ags_osc_client_write_bytes(osc_client, buffer, buffer_length); CU_ASSERT(retval == TRUE); } int main(int argc, char **argv) { add_thread = g_thread_new("libags_audio.so - functional OSC server test", ags_functional_osc_server_test_add_thread, NULL); g_main_loop_run(g_main_loop_new(g_main_context_default(), FALSE)); g_thread_join(add_thread); return(-1); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_xmlrpc_server_test.c0000644000175000017500000001513413614062654022025 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_osc_xmlrpc_server_test_init_suite(); int ags_osc_xmlrpc_server_test_clean_suite(); void ags_osc_xmlrpc_server_test_add_websocket_handler(); void ags_osc_xmlrpc_server_test_add_default_controller(); void ags_osc_xmlrpc_server_test_start(); void ags_osc_xmlrpc_server_test_stop(); void ags_osc_xmlrpc_server_test_listen(); void ags_osc_xmlrpc_server_test_dispatch(); void ags_osc_xmlrpc_server_test_add_websocket_handler_callback(SoupServer *server, SoupWebsocketConnection *connection, const char *path, SoupClientContext *client, gpointer user_data); #define AGS_OSC_XMLRPC_SERVER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" AgsApplicationContext *application_context; GObject *default_soundcard; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_xmlrpc_server_test_init_suite() { AgsConfig *config; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_OSC_XMLRPC_SERVER_TEST_CONFIG, strlen(AGS_OSC_XMLRPC_SERVER_TEST_CONFIG)); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_xmlrpc_server_test_clean_suite() { return(0); } void ags_osc_xmlrpc_server_test_add_websocket_handler_callback(SoupServer *server, SoupWebsocketConnection *connection, const char *path, SoupClientContext *client, gpointer user_data) { } void ags_osc_xmlrpc_server_test_add_websocket_handler() { AgsOscXmlrpcServer *osc_xmlrpc_server; AgsServer *server; osc_xmlrpc_server = ags_osc_xmlrpc_server_new(); server = ags_server_new(); server->soup_server = soup_server_new(NULL); g_object_set(osc_xmlrpc_server, "xmlrpc-server", server, NULL); ags_osc_xmlrpc_server_add_websocket_handler(osc_xmlrpc_server, "/ags-test-osc-xmlrpc", NULL, NULL, ags_osc_xmlrpc_server_test_add_websocket_handler_callback, osc_xmlrpc_server, NULL); } void ags_osc_xmlrpc_server_test_add_default_controller() { AgsOscXmlrpcServer *osc_xmlrpc_server; AgsServer *server; osc_xmlrpc_server = ags_osc_xmlrpc_server_new(); server = ags_server_new(); server->soup_server = soup_server_new(NULL); g_object_set(osc_xmlrpc_server, "xmlrpc-server", server, NULL); ags_osc_xmlrpc_server_add_default_controller(osc_xmlrpc_server); CU_ASSERT(server->controller != NULL); CU_ASSERT(AGS_OSC_SERVER(osc_xmlrpc_server)->controller != NULL); } void ags_osc_xmlrpc_server_test_start() { //TODO:JK: implement me } void ags_osc_xmlrpc_server_test_stop() { //TODO:JK: implement me } void ags_osc_xmlrpc_server_test_listen() { //TODO:JK: implement me } void ags_osc_xmlrpc_server_test_dispatch() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscXmlrpcServerTest", ags_osc_xmlrpc_server_test_init_suite, ags_osc_xmlrpc_server_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscXmlrpcServer add websocket handler", ags_osc_xmlrpc_server_test_add_websocket_handler) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer add default controller", ags_osc_xmlrpc_server_test_add_default_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer start", ags_osc_xmlrpc_server_test_start) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer stop", ags_osc_xmlrpc_server_test_stop) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer listen", ags_osc_xmlrpc_server_test_listen) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer dispatch", ags_osc_xmlrpc_server_test_dispatch) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_client_test.c0000644000175000017500000000742713607210263020407 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include int ags_osc_client_test_init_suite(); int ags_osc_client_test_clean_suite(); void ags_osc_client_test_resolve(); void ags_osc_client_test_connect(); void ags_osc_client_test_write_bytes(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_client_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_client_test_clean_suite() { return(0); } void ags_osc_client_test_resolve() { AgsOscClient *osc_client; osc_client = ags_osc_client_new(); g_object_set(osc_client, "ip4", NULL, "ip6", NULL, NULL); ags_osc_client_resolve(osc_client); CU_ASSERT(osc_client->ip4 != NULL); CU_ASSERT(osc_client->ip6 != NULL); } void ags_osc_client_test_connect() { AgsOscClient *osc_client; osc_client = ags_osc_client_new(); ags_osc_client_set_flags(osc_client, (AGS_OSC_CLIENT_INET4 | AGS_OSC_CLIENT_INET6 | AGS_OSC_CLIENT_TCP)); ags_osc_client_connect(osc_client); CU_ASSERT(osc_client->ip4_fd != -1); CU_ASSERT(osc_client->ip6_fd != -1); } void ags_osc_client_test_write_bytes() { AgsOscClient *osc_client; gboolean retval; static const unsigned char *status_message = "/status\x00,\x00\x00\x00"; static const guint status_message_size = 12; osc_client = ags_osc_client_new(); ags_osc_client_set_flags(osc_client, AGS_OSC_CLIENT_INET4); retval = ags_osc_client_write_bytes(osc_client, status_message, status_message_size); CU_ASSERT(retval == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscClientTest", ags_osc_client_test_init_suite, ags_osc_client_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscClient resolve", ags_osc_client_test_resolve) == NULL) || (CU_add_test(pSuite, "test of AgsOscClient connect", ags_osc_client_test_connect) == NULL) || (CU_add_test(pSuite, "test of AgsOscClient write bytes", ags_osc_client_test_write_bytes) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_buffer_util_test.c0000644000175000017500000006327413605312646021447 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include int ags_osc_buffer_util_test_init_suite(); int ags_osc_buffer_util_test_clean_suite(); void ags_osc_buffer_util_test_put_int32(); void ags_osc_buffer_util_test_get_int32(); void ags_osc_buffer_util_test_put_timetag(); void ags_osc_buffer_util_test_get_timetag(); void ags_osc_buffer_util_test_put_float(); void ags_osc_buffer_util_test_get_float(); void ags_osc_buffer_util_test_put_string(); void ags_osc_buffer_util_test_get_string(); void ags_osc_buffer_util_test_put_blob(); void ags_osc_buffer_util_test_get_blob(); void ags_osc_buffer_util_test_put_int64(); void ags_osc_buffer_util_test_get_int64(); void ags_osc_buffer_util_test_put_double(); void ags_osc_buffer_util_test_get_double(); void ags_osc_buffer_util_test_put_char(); void ags_osc_buffer_util_test_get_char(); void ags_osc_buffer_util_test_put_rgba(); void ags_osc_buffer_util_test_get_rgba(); void ags_osc_buffer_util_test_put_midi(); void ags_osc_buffer_util_test_get_midi(); void ags_osc_buffer_util_test_put_packet(); void ags_osc_buffer_util_test_get_packet(); void ags_osc_buffer_util_test_put_packets(); void ags_osc_buffer_util_test_put_message(); void ags_osc_buffer_util_test_get_message(); void ags_osc_buffer_util_test_put_bundle(); void ags_osc_buffer_util_test_get_bundle(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_buffer_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_buffer_util_test_clean_suite() { return(0); } void ags_osc_buffer_util_test_put_int32() { unsigned char *buffer; guint i, j; gboolean success; static const gint32 val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00", "\x00\x00\x00\x01", "\x00\x00\x00\xff", "\x00\x00\x01\x00", "\x00\x00\xff\xff", "\x00\x01\x00\x00", "\x00\xff\xff\xff", "\x01\x00\x00\x00", "\xff\xff\xff\xff", }; buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_put_int32(buffer, val[i]); for(j = 0; j < 4; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_int32() { gint32 current; guint i; gboolean success; static const gint32 val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00", "\x00\x00\x00\x01", "\x00\x00\x00\xff", "\x00\x00\x01\x00", "\x00\x00\xff\xff", "\x00\x01\x00\x00", "\x00\xff\xff\xff", "\x01\x00\x00\x00", "\xff\xff\xff\xff", }; success = TRUE; for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_get_int32(val_buffer[i], ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_timetag() { unsigned char *buffer; guint i, j; gboolean success; static const gint32 val_tv_secs[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const gint32 val_tv_fraction[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const gint32 val_immediately[] = { TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00\x00\x00\x00\x01", "\x00\x00\x00\x01\x00\x00\x00\x00", "\x00\x00\x00\xff\x00\x00\x00\xfe", "\x00\x00\x01\x00\x00\x00\x01\x01", "\x00\x00\xff\xff\x00\x00\xff\xfe", "\x00\x01\x00\x00\x00\x01\x00\x01", "\x00\xff\xff\xff\x00\xff\xff\xfe", "\x01\x00\x00\x00\x01\x00\x00\x01", "\xff\xff\xff\xff\xff\xff\xff\xfe", }; success = TRUE; buffer = (unsigned char *) malloc(8 * sizeof(unsigned char)); for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_put_timetag(buffer, val_tv_secs[i], val_tv_fraction[i], val_immediately[i]); for(j = 0; j < 8; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_timetag() { gint32 current_tv_secs, current_tv_fraction; gboolean current_immediately; guint i; gboolean success; static const gint32 val_tv_secs[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const gint32 val_tv_fraction[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, }; static const gint32 val_immediately[] = { TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00\x00\x00\x00\x01", "\x00\x00\x00\x01\x00\x00\x00\x00", "\x00\x00\x00\xff\x00\x00\x00\xfe", "\x00\x00\x01\x00\x00\x00\x01\x01", "\x00\x00\xff\xff\x00\x00\xff\xfe", "\x00\x01\x00\x00\x00\x01\x00\x01", "\x00\xff\xff\xff\x00\xff\xff\xfe", "\x01\x00\x00\x00\x01\x00\x00\x01", "\xff\xff\xff\xff\xff\xff\xff\xfe", }; success = TRUE; for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_get_timetag(val_buffer[i], ¤t_tv_secs, ¤t_tv_fraction, ¤t_immediately); if(current_tv_secs != val_tv_secs[i] || current_tv_fraction != (val_tv_fraction[i] & (~0x1)) || current_immediately != val_immediately[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_float() { unsigned char *buffer; gfloat current; guint i, j; gboolean success; static const gfloat val[] = { 0.0, 1.0, 4.125, 5.25, 7.8, 9.87, 16.99, 23.5, 31.75, }; success = TRUE; buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_put_float(buffer, val[i]); ags_osc_buffer_util_get_float(buffer, ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_float() { //NOTE:JK: see above } void ags_osc_buffer_util_test_put_string() { unsigned char *buffer; static const gchar *str = "I bytes OSC"; guint i; buffer = (unsigned char *) malloc(16 * sizeof(unsigned char)); ags_osc_buffer_util_put_string(buffer, str, -1); CU_ASSERT(!g_strcmp0(buffer, str)); } void ags_osc_buffer_util_test_get_string() { gchar *str; static const unsigned char *str_buffer = "Every bytes OSC\0"; str = NULL; ags_osc_buffer_util_get_string(str_buffer, &str, NULL); CU_ASSERT(!g_strcmp0(str_buffer, str)); } void ags_osc_buffer_util_test_put_blob() { unsigned char *buffer; guint i; gboolean success; static const unsigned char *blob = "\x00\x00\x00\x00\x00\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x00\x00"; static const unsigned char *blob_length_data = "\x00\x00\x00\x10"; buffer = (unsigned char *) malloc(32 * sizeof(unsigned char)); ags_osc_buffer_util_put_blob(buffer, 16, blob); success = TRUE; for(i = 0; i < 4; i++){ if(blob_length_data[i] != buffer[i]){ success = FALSE; break; } } for(i = 0; i < 16; i++){ if(blob[i] != buffer[i + 4]){ success = FALSE; break; } } CU_ASSERT(success); } void ags_osc_buffer_util_test_get_blob() { unsigned char *data; gint32 data_size; guint i; gboolean success; static const unsigned char *buffer = "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x00\x00"; ags_osc_buffer_util_get_blob(buffer, &data_size, &data); CU_ASSERT(data_size == 16); success = TRUE; for(i = 0; i < 16; i++){ if(data[i] != buffer[i + 4]){ success = FALSE; break; } } CU_ASSERT(success); } void ags_osc_buffer_util_test_put_int64() { unsigned char *buffer; guint i, j; gboolean success; static const gint64 val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, 9223372036854775807, 18446744073709551615, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\x01", "\x00\x00\x00\x00\x00\x00\x00\xff", "\x00\x00\x00\x00\x00\x00\x01\x00", "\x00\x00\x00\x00\x00\x00\xff\xff", "\x00\x00\x00\x00\x00\x01\x00\x00", "\x00\x00\x00\x00\x00\xff\xff\xff", "\x00\x00\x00\x00\x01\x00\x00\x00", "\x00\x00\x00\x00\xff\xff\xff\xff", "\x7f\xff\xff\xff\xff\xff\xff\xff", "\xff\xff\xff\xff\xff\xff\xff\xff", }; buffer = (unsigned char *) malloc(8 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 11 && success; i++){ ags_osc_buffer_util_put_int64(buffer, val[i]); for(j = 0; j < 8; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_int64() { gint64 current; guint i; gboolean success; static const gint64 val[] = { 0, 1, 255, 256, 65535, 65536, 16777215, 16777216, 4294967295, 9223372036854775807, 18446744073709551615, }; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\x01", "\x00\x00\x00\x00\x00\x00\x00\xff", "\x00\x00\x00\x00\x00\x00\x01\x00", "\x00\x00\x00\x00\x00\x00\xff\xff", "\x00\x00\x00\x00\x00\x01\x00\x00", "\x00\x00\x00\x00\x00\xff\xff\xff", "\x00\x00\x00\x00\x01\x00\x00\x00", "\x00\x00\x00\x00\xff\xff\xff\xff", "\x7f\xff\xff\xff\xff\xff\xff\xff", "\xff\xff\xff\xff\xff\xff\xff\xff", }; success = TRUE; for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_get_int64(val_buffer[i], ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_double() { unsigned char *buffer; gdouble current; guint i; gboolean success; static const gdouble val[] = { 0.0, 1.0, 4.125, 5.25, 7.8, 9.87, 16.99, 23.5, 31.75, }; success = TRUE; buffer = (unsigned char *) malloc(8 * sizeof(unsigned char)); for(i = 0; i < 9 && success; i++){ ags_osc_buffer_util_put_double(buffer, val[i]); ags_osc_buffer_util_get_double(buffer, ¤t); if(current != val[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_double() { //NOTE:JK: see above } void ags_osc_buffer_util_test_put_char() { unsigned char *buffer; guint i, j; gboolean success; static const gchar *str = "abcdefghijklmnopqrstuvwxyz0123456789 "; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x61", "\x00\x00\x00\x62", "\x00\x00\x00\x63", "\x00\x00\x00\x64", "\x00\x00\x00\x65", "\x00\x00\x00\x66", "\x00\x00\x00\x67", "\x00\x00\x00\x68", "\x00\x00\x00\x69", "\x00\x00\x00\x6a", "\x00\x00\x00\x6b", "\x00\x00\x00\x6c", "\x00\x00\x00\x6d", "\x00\x00\x00\x6e", "\x00\x00\x00\x6f", "\x00\x00\x00\x70", "\x00\x00\x00\x71", "\x00\x00\x00\x72", "\x00\x00\x00\x73", "\x00\x00\x00\x74", "\x00\x00\x00\x75", "\x00\x00\x00\x76", "\x00\x00\x00\x77", "\x00\x00\x00\x78", "\x00\x00\x00\x79", "\x00\x00\x00\x7a", "\x00\x00\x00\x30", "\x00\x00\x00\x31", "\x00\x00\x00\x32", "\x00\x00\x00\x33", "\x00\x00\x00\x34", "\x00\x00\x00\x35", "\x00\x00\x00\x36", "\x00\x00\x00\x37", "\x00\x00\x00\x38", "\x00\x00\x00\x39", "\x00\x00\x00\x20", }; buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 37 && success; i++){ ags_osc_buffer_util_put_char(buffer, str[i]); for(j = 0; j < 4; j++){ if(buffer[j] != val_buffer[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_char() { gchar current; guint i; gboolean success; static const gchar *str = "abcdefghijklmnopqrstuvwxyz0123456789 "; static const unsigned char *val_buffer[] = { "\x00\x00\x00\x61", "\x00\x00\x00\x62", "\x00\x00\x00\x63", "\x00\x00\x00\x64", "\x00\x00\x00\x65", "\x00\x00\x00\x66", "\x00\x00\x00\x67", "\x00\x00\x00\x68", "\x00\x00\x00\x69", "\x00\x00\x00\x6a", "\x00\x00\x00\x6b", "\x00\x00\x00\x6c", "\x00\x00\x00\x6d", "\x00\x00\x00\x6e", "\x00\x00\x00\x6f", "\x00\x00\x00\x70", "\x00\x00\x00\x71", "\x00\x00\x00\x72", "\x00\x00\x00\x73", "\x00\x00\x00\x74", "\x00\x00\x00\x75", "\x00\x00\x00\x76", "\x00\x00\x00\x77", "\x00\x00\x00\x78", "\x00\x00\x00\x79", "\x00\x00\x00\x7a", "\x00\x00\x00\x30", "\x00\x00\x00\x31", "\x00\x00\x00\x32", "\x00\x00\x00\x33", "\x00\x00\x00\x34", "\x00\x00\x00\x35", "\x00\x00\x00\x36", "\x00\x00\x00\x37", "\x00\x00\x00\x38", "\x00\x00\x00\x39", "\x00\x00\x00\x20", }; success = TRUE; for(i = 0; i < 37 && success; i++){ ags_osc_buffer_util_get_char(val_buffer[i], ¤t); if(current != str[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_rgba() { unsigned char *buffer; guint i, j; gboolean success; static const guint8 rgba[14][4] = { {0x0, 0x0, 0x0, 0xff}, {0x0, 0x0, 0xff, 0xff}, {0x0, 0xff, 0x0, 0xff}, {0xff, 0x0, 0x0, 0xff}, {0x0, 0xff, 0xff, 0xff}, {0xff, 0x0, 0xff, 0xff}, {0xff, 0xff, 0x0, 0xff}, {0xff, 0xff, 0xff, 0xff}, {0x0, 0x0, 0x0, 0x7f}, {0x0, 0x0, 0xff, 0x7f}, {0x0, 0xff, 0x0, 0x7f}, {0xff, 0x0, 0x0, 0x7f}, {0x0, 0xff, 0xff, 0x7f}, {0xff, 0x0, 0xff, 0x7f}, {0xff, 0xff, 0x0, 0x7f}, {0xff, 0xff, 0xff, 0x7f}, }; static const unsigned char *val_rgba[] = { "\x00\x00\x00\xff", "\x00\x00\xff\xff", "\x00\xff\x00\xff", "\xff\x00\x00\xff", "\x00\xff\xff\xff", "\xff\x00\xff\xff", "\xff\xff\x00\xff", "\xff\xff\xff\xff", "\x00\x00\x00\x7f", "\x00\x00\xff\x7f", "\x00\xff\x00\x7f", "\xff\x00\x00\x7f", "\x00\xff\xff\x7f", "\xff\x00\xff\x7f", "\xff\xff\x00\x7f", "\xff\xff\xff\x7f", }; buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 14 && success; i++){ ags_osc_buffer_util_put_rgba(buffer, rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); for(j = 0; j < 4; j++){ if(buffer[j] != val_rgba[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_rgba() { guint8 r, g, b, a; guint i; gboolean success; static const guint8 rgba[14][4] = { {0x0, 0x0, 0x0, 0xff}, {0x0, 0x0, 0xff, 0xff}, {0x0, 0xff, 0x0, 0xff}, {0xff, 0x0, 0x0, 0xff}, {0x0, 0xff, 0xff, 0xff}, {0xff, 0x0, 0xff, 0xff}, {0xff, 0xff, 0x0, 0xff}, {0xff, 0xff, 0xff, 0xff}, {0x0, 0x0, 0x0, 0x7f}, {0x0, 0x0, 0xff, 0x7f}, {0x0, 0xff, 0x0, 0x7f}, {0xff, 0x0, 0x0, 0x7f}, {0x0, 0xff, 0xff, 0x7f}, {0xff, 0x0, 0xff, 0x7f}, {0xff, 0xff, 0x0, 0x7f}, {0xff, 0xff, 0xff, 0x7f}, }; static const unsigned char *val_rgba[] = { "\x00\x00\x00\xff", "\x00\x00\xff\xff", "\x00\xff\x00\xff", "\xff\x00\x00\xff", "\x00\xff\xff\xff", "\xff\x00\xff\xff", "\xff\xff\x00\xff", "\xff\xff\xff\xff", "\x00\x00\x00\x7f", "\x00\x00\xff\x7f", "\x00\xff\x00\x7f", "\xff\x00\x00\x7f", "\x00\xff\xff\x7f", "\xff\x00\xff\x7f", "\xff\xff\x00\x7f", "\xff\xff\xff\x7f", }; success = TRUE; for(i = 0; i < 14 && success; i++){ ags_osc_buffer_util_get_rgba(val_rgba[i], &r, &g, &b, &a); if(r != rgba[i][0] || g != rgba[i][1] || b != rgba[i][2] || a != rgba[i][3]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_midi() { unsigned char *buffer; guint i, j; gboolean success; static const guint8 midi[2][4] = { {0x0, 0x7f, 0xff, 0x0}, {0x0, 0x80, 0xff, 0x0}, }; static const unsigned char *val_midi[] = { "\x00\x7f\xff\x00", "\x00\x80\xff\x00", }; buffer = (unsigned char *) malloc(4 * sizeof(unsigned char)); success = TRUE; for(i = 0; i < 2 && success; i++){ ags_osc_buffer_util_put_midi(buffer, midi[i][0], midi[i][1], midi[i][2], midi[i][3]); for(j = 0; j < 4; j++){ if(buffer[j] != val_midi[i][j]){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_midi() { guint8 port, status_byte, data0, data1; guint i; gboolean success; static const guint8 midi[2][4] = { {0x0, 0x7f, 0xff, 0x0}, {0x0, 0x80, 0xff, 0x0}, }; static const unsigned char *val_midi[] = { "\x00\x7f\xff\x00", "\x00\x80\xff\x00", }; success = TRUE; for(i = 0; i < 2 && success; i++){ ags_osc_buffer_util_get_midi(val_midi[i], &port, &status_byte, &data0, &data1); if(port != midi[i][0] || status_byte != midi[i][1] || data0 != midi[i][2] || data1 != midi[i][3]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_packet() { unsigned char *buffer; guint i; gboolean success; static const unsigned char *packet_bundle = "\x00\x00\x00\x8c#bundle\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x7c/meter\x00\x00,sT\x00/AgsSoundProvider/AgsAudio[\"spectrometer\"]/AgsChannel[0]/AgsAnalyseChannel[0]/AgsPort[\"./magnitude-buffer[0]\"]\x00\x00\x00\x00"; buffer = (unsigned char *) malloc(256 * sizeof(unsigned char)); success = TRUE; ags_osc_buffer_util_put_packet(buffer, 140, packet_bundle + 4); for(i = 0; i < 144 && success; i++){ if(packet_bundle[i] != buffer[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_packet() { unsigned char *packet; gint32 packet_size; guint i; gboolean success; static const unsigned char *packet_bundle = "\x00\x00\x00\x8c#bundle\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x7c/meter\x00\x00,sT\x00/AgsSoundProvider/AgsAudio[\"spectrometer\"]/AgsChannel[0]/AgsAnalyseChannel[0]/AgsPort[\"./magnitude-buffer[0]\"]\x00\x00\x00\x00"; success = TRUE; ags_osc_buffer_util_get_packet(packet_bundle, &packet_size, &packet); CU_ASSERT(packet_size == 140); for(i = 0; i < 140 && success; i++){ if(packet_bundle[i + 4] != packet[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_put_packets() { //TODO:JK: implement me } void ags_osc_buffer_util_test_put_message() { unsigned char *buffer; guint i; gboolean success; static const unsigned char *message = "/meter\x00\x00,sT\x00"; buffer = (unsigned char *) malloc(256 * sizeof(unsigned char)); success = TRUE; ags_osc_buffer_util_put_message(buffer, "/meter", ",sT"); for(i = 0; i < 12 && success; i++){ if(message[i] != buffer[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_message() { gchar *address_pattern; gchar *type_tag; static const unsigned char *message = "/meter\x00\x00,sT\x00"; ags_osc_buffer_util_get_message(message, &address_pattern, &type_tag); CU_ASSERT(!g_strcmp0(address_pattern, "/meter")); CU_ASSERT(!g_strcmp0(type_tag, ",sT")); } void ags_osc_buffer_util_test_put_bundle() { unsigned char *buffer; guint i; gboolean success; static const unsigned char *bundle = "#bundle\x00\x00\x00\x00\x00\x00\x00\x00\x01"; buffer = (unsigned char *) malloc(256 * sizeof(unsigned char)); success = TRUE; ags_osc_buffer_util_put_bundle(buffer, 0, 0, TRUE); for(i = 0; i < 16 && success; i++){ if(bundle[i] != buffer[i]){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_osc_buffer_util_test_get_bundle() { gint32 tv_secs, tv_fraction; gboolean immediately; static const unsigned char *bundle = "#bundle\x00\x00\x00\x00\x00\x00\x00\x00\x01"; ags_osc_buffer_util_get_bundle(bundle, &tv_secs, &tv_fraction, &immediately); CU_ASSERT(tv_secs == 0); CU_ASSERT(tv_fraction == 0); CU_ASSERT(immediately == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscBufferUtilTest", ags_osc_buffer_util_test_init_suite, ags_osc_buffer_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_osc_buffer_util.c put int32", ags_osc_buffer_util_test_put_int32) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get int32", ags_osc_buffer_util_test_get_int32) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put timetag", ags_osc_buffer_util_test_put_timetag) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get timetag", ags_osc_buffer_util_test_get_timetag) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put float", ags_osc_buffer_util_test_put_float) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get float", ags_osc_buffer_util_test_get_float) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put string", ags_osc_buffer_util_test_put_string) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get string", ags_osc_buffer_util_test_get_string) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put blob", ags_osc_buffer_util_test_put_blob) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get blob", ags_osc_buffer_util_test_get_blob) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put int64", ags_osc_buffer_util_test_put_int64) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get int64", ags_osc_buffer_util_test_get_int64) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put double", ags_osc_buffer_util_test_put_double) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get double", ags_osc_buffer_util_test_get_double) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put char", ags_osc_buffer_util_test_put_char) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get char", ags_osc_buffer_util_test_get_char) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put rgba", ags_osc_buffer_util_test_put_rgba) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get rgba", ags_osc_buffer_util_test_get_rgba) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put midi", ags_osc_buffer_util_test_put_midi) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get midi", ags_osc_buffer_util_test_get_midi) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put packet", ags_osc_buffer_util_test_put_packet) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get packet", ags_osc_buffer_util_test_get_packet) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put packets", ags_osc_buffer_util_test_put_packets) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put message", ags_osc_buffer_util_test_put_message) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get message", ags_osc_buffer_util_test_get_message) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c put bundle", ags_osc_buffer_util_test_put_bundle) == NULL) || (CU_add_test(pSuite, "test of ags_osc_buffer_util.c get bundle", ags_osc_buffer_util_test_get_bundle) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_xmlrpc_message_test.c0000644000175000017500000000747513607210263022145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_osc_xmlrpc_message_test_init_suite(); int ags_osc_xmlrpc_message_test_clean_suite(); void ags_osc_xmlrpc_message_test_set_property(); void ags_osc_xmlrpc_message_test_get_property(); /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_xmlrpc_message_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_xmlrpc_message_test_clean_suite() { return(0); } void ags_osc_xmlrpc_message_test_set_property() { AgsOscXmlrpcMessage *osc_xmlrpc_message; SoupMessage *soup_message; GHashTable *query; osc_xmlrpc_message = ags_osc_xmlrpc_message_new(); soup_message = soup_message_new("/ags-test-osc-xmlrpc", "http://localhost/ags-test-osc-xmlrpc"); query = g_hash_table_new(g_str_hash, g_str_equal); g_object_set(osc_xmlrpc_message, "msg", soup_message, "query", query, NULL); CU_ASSERT(osc_xmlrpc_message->msg == soup_message); CU_ASSERT(osc_xmlrpc_message->query == query); } void ags_osc_xmlrpc_message_test_get_property() { AgsOscXmlrpcMessage *osc_xmlrpc_message; SoupMessage *soup_message; GHashTable *query; osc_xmlrpc_message = ags_osc_xmlrpc_message_new(); osc_xmlrpc_message->msg = soup_message_new("/ags-test-osc-xmlrpc", "http://localhost/ags-test-osc-xmlrpc"); osc_xmlrpc_message->query = g_hash_table_new(g_str_hash, g_str_equal); g_object_get(osc_xmlrpc_message, "msg", &soup_message, "query", &query, NULL); CU_ASSERT(osc_xmlrpc_message->msg == soup_message); CU_ASSERT(osc_xmlrpc_message->query == query); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscXmlrpcMessageTest", ags_osc_xmlrpc_message_test_init_suite, ags_osc_xmlrpc_message_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscXmlrpcMessage set property", ags_osc_xmlrpc_message_test_set_property) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcMessage get property", ags_osc_xmlrpc_message_test_get_property) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c0000644000175000017500000011423013614062654024244 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #ifdef __APPLE__ #include #include #endif #include #include #include #include #include gpointer ags_functional_osc_xmlrpc_server_test_add_thread(gpointer data); int ags_functional_osc_xmlrpc_server_test_init_suite(); int ags_functional_osc_xmlrpc_server_test_clean_suite(); void ags_functional_osc_xmlrpc_server_test_action_controller(); void ags_functional_osc_xmlrpc_server_test_config_controller(); void ags_functional_osc_xmlrpc_server_test_info_controller(); void ags_functional_osc_xmlrpc_server_test_meter_controller(); void ags_functional_osc_xmlrpc_server_test_node_controller(); void ags_functional_osc_xmlrpc_server_test_renew_controller(); void ags_functional_osc_xmlrpc_server_test_status_controller(); void ags_functional_osc_xmlrpc_server_test_authenticate_authenticate_callback(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data); void ags_functional_osc_xmlrpc_server_test_websocket_callback(GObject *source_object, GAsyncResult *res, gpointer user_data); void ags_functional_osc_xmlrpc_server_test_websocket_message_callback(SoupWebsocketConnection *websocket_connection, gint type, GBytes *message, gpointer user_data); void ags_functional_osc_xmlrpc_server_test_websocket_error_callback(SoupWebsocketConnection *websocket_connection, GError *error, gpointer user_data); #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_CONFIG "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[server]\n" \ "realm=ags-test-realm\n" \ "auto-start=true\n" \ "any-address=false\n" \ "enable-ip4=true\n" \ "ip4-address=127.0.0.1\n" \ "enable-ip6=false\n" \ "ip6-address=::1\n" \ "server-port=8080\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "thread-pool-max-unused-threads=8\n" \ "max-precision=125\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=1024\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[sequencer-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_APPLY_CONFIG_ARGUMENT "[generic]\n" \ "autosave-thread=false\n" \ "simple-file=false\n" \ "disable-feature=experimental\n" \ "segmentation=4/4\n" \ "\n" \ "[thread]\n" \ "model=super-threaded\n" \ "super-threaded-scope=channel\n" \ "lock-global=ags-thread\n" \ "lock-parent=ags-recycling-thread\n" \ "thread-pool-max-unused-threads=8\n" \ "max-precision=125\n" \ "\n" \ "[soundcard-0]\n" \ "backend=alsa\n" \ "device=default\n" \ "samplerate=44100\n" \ "buffer-size=256\n" \ "pcm-channels=2\n" \ "dsp-channels=2\n" \ "format=16\n" \ "\n" \ "[recall]\n" \ "auto-sense=true\n" \ "\n" #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_METER_PACKET_COUNT (16 * 30) #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_XML_AUTHENTICATION_FILENAME SRCDIR "/" "ags_functional_osc_xmlrpc_server_test_authentication.xml" #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_XML_PASSWORD_STORE_FILENAME SRCDIR "/" "ags_functional_osc_xmlrpc_server_test_password_store.xml" #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_XML_COOKIE_FILENAME SRCDIR "/" "ags_functional_osc_xmlrpc_server_test_cookie" #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_AUTHENTICATE_LOGIN "ags-test-login" #define AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_AUTHENTICATE_PASSWORD "ags-test-password" GThread *add_thread = NULL; GMainLoop *test_main_loop; GMainContext *test_main_context; AgsApplicationContext *application_context; AgsAudio *drum; AgsOscXmlrpcServer *osc_xmlrpc_server; SoupSession *soup_session; SoupCookieJar *jar; SoupWebsocketConnection *websocket_connection; GObject *default_soundcard; struct TestDataMeter{ gchar *login; gchar *security_token; gchar *resource_id; volatile gint *meter_packet_count; }meter_data; gpointer ags_functional_osc_xmlrpc_server_test_add_thread(gpointer data) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); test_main_context = g_main_context_new(); test_main_loop = g_main_loop_new(test_main_context, FALSE); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ exit(CU_get_error()); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalOscXmlrpcServerTest", ags_functional_osc_xmlrpc_server_test_init_suite, ags_functional_osc_xmlrpc_server_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); exit(CU_get_error()); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing action controller", ags_functional_osc_xmlrpc_server_test_action_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing config controller", ags_functional_osc_xmlrpc_server_test_config_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing info controller", ags_functional_osc_xmlrpc_server_test_info_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing meter controller", ags_functional_osc_xmlrpc_server_test_meter_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing node controller", ags_functional_osc_xmlrpc_server_test_node_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing renew controller", ags_functional_osc_xmlrpc_server_test_renew_controller) == NULL) || (CU_add_test(pSuite, "test of AgsOscXmlrpcServer providing status controller", ags_functional_osc_xmlrpc_server_test_status_controller) == NULL)){ CU_cleanup_registry(); exit(CU_get_error()); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); exit(CU_get_error()); } /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_osc_xmlrpc_server_test_init_suite() { AgsAuthenticationManager *authentication_manager; AgsPasswordStoreManager *password_store_manager; AgsXmlAuthentication *xml_authentication; AgsXmlPasswordStore *xml_password_store; AgsConfig *config; GList *server; GList *start_audio; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_CONFIG, strlen(AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_CONFIG)); authentication_manager = ags_authentication_manager_get_instance(); password_store_manager = ags_password_store_manager_get_instance(); xml_authentication = ags_xml_authentication_new(); ags_xml_authentication_open_filename(xml_authentication, AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_XML_AUTHENTICATION_FILENAME); ags_authentication_manager_add_authentication(authentication_manager, xml_authentication); xml_password_store = ags_xml_password_store_new(); ags_xml_password_store_open_filename(xml_password_store, AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_XML_PASSWORD_STORE_FILENAME); ags_password_store_manager_add_password_store(password_store_manager, xml_password_store); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* drum */ drum = ags_audio_new(default_soundcard); g_object_ref(drum); g_object_set(drum, "audio-name", "test-drum", NULL); ags_audio_set_flags(drum, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(drum, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_audio_channels(drum, 2, 0); ags_audio_set_pads(drum, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(drum, AGS_TYPE_INPUT, 8, 0); start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), g_list_prepend(start_audio, drum)); /* ags-volume */ ags_recall_factory_create(drum, NULL, NULL, "ags-volume", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-mute */ ags_recall_factory_create(drum, NULL, NULL, "ags-mute", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-peak */ ags_recall_factory_create(drum, NULL, NULL, "ags-peak", 0, 2, 0, 8, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); ags_connectable_connect(AGS_CONNECTABLE(drum)); /* OSC XMLRPC server */ signal(SIGPIPE, SIG_IGN); server = ags_service_provider_get_server(AGS_SERVICE_PROVIDER(application_context)); osc_xmlrpc_server = ags_osc_xmlrpc_server_new(); g_object_set(osc_xmlrpc_server, "xmlrpc-server", server->data, NULL); while(!ags_server_test_flags(server->data, AGS_SERVER_RUNNING)){ sleep(1); } ags_osc_xmlrpc_server_add_default_controller(osc_xmlrpc_server); ags_osc_server_start(osc_xmlrpc_server); sleep(5); /* soup session */ soup_session = soup_session_new_with_options(SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_AUTH_BASIC, SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_AUTH_DIGEST, SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_LOGGER, NULL); jar = soup_cookie_jar_text_new(AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_XML_COOKIE_FILENAME, FALSE); soup_session_add_feature(soup_session, jar); g_object_set(G_OBJECT(soup_session), SOUP_SESSION_SSL_STRICT, FALSE, NULL); g_signal_connect(soup_session, "authenticate", G_CALLBACK(ags_functional_osc_xmlrpc_server_test_authenticate_authenticate_callback), NULL); sleep(5); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_osc_xmlrpc_server_test_clean_suite() { ags_osc_server_stop(osc_xmlrpc_server); return(0); } void ags_functional_osc_xmlrpc_server_test_authenticate_authenticate_callback(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data) { g_message("authenticate: ****"); soup_auth_authenticate(auth, AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_AUTHENTICATE_LOGIN, AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_AUTHENTICATE_PASSWORD); } void ags_functional_osc_xmlrpc_server_test_websocket_callback(GObject *source_object, GAsyncResult *res, gpointer user_data) { xmlDoc *doc; xmlNode *root_node; xmlNode *login_node; xmlNode *security_token_node; xmlNode *redirect_node; xmlChar *buffer; int buffer_length; GError *error; error = NULL; websocket_connection = soup_session_websocket_connect_finish(SOUP_SESSION(source_object), res, &error); g_object_ref(websocket_connection); if(error != NULL){ g_critical("%s", error->message); g_error_free(error); } g_message("websocket ..."); g_signal_connect(websocket_connection, "message", G_CALLBACK(ags_functional_osc_xmlrpc_server_test_websocket_message_callback), NULL); g_signal_connect(websocket_connection, "error", G_CALLBACK(ags_functional_osc_xmlrpc_server_test_websocket_error_callback), NULL); /* websocket */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); login_node = xmlNewNode(NULL, BAD_CAST "ags-srv-login"); xmlNodeSetContent(login_node, meter_data.login); xmlAddChild(root_node, login_node); security_token_node = xmlNewNode(NULL, BAD_CAST "ags-srv-security-token"); xmlNodeSetContent(security_token_node, meter_data.security_token); xmlAddChild(root_node, security_token_node); redirect_node = xmlNewNode(NULL, BAD_CAST "ags-srv-redirect"); xmlNewProp(redirect_node, "resource-id", meter_data.resource_id); xmlAddChild(root_node, redirect_node); buffer = NULL; xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); sleep(5); soup_websocket_connection_send_text(websocket_connection, buffer); } void ags_functional_osc_xmlrpc_server_test_websocket_message_callback(SoupWebsocketConnection *websocket_connection, gint type, GBytes *message, gpointer user_data) { xmlDoc *response_doc; xmlNode *response_root_node; volatile gint *meter_packet_count; guchar *data; gsize data_length; GError *error; data = g_bytes_get_data(message, &data_length); meter_packet_count = meter_data.meter_packet_count; response_doc = xmlParseDoc(data); response_root_node = NULL; if(response_doc != NULL){ response_root_node = xmlDocGetRootElement(response_doc); if(response_root_node != NULL && !g_ascii_strncasecmp(response_root_node->name, "ags-osc-over-xmlrpc", 20)){ g_atomic_int_inc(meter_packet_count); } xmlFreeDoc(response_doc); } } void ags_functional_osc_xmlrpc_server_test_websocket_error_callback(SoupWebsocketConnection *websocket_connection, GError *error, gpointer user_data) { g_message("%s", error->message); } void ags_functional_osc_xmlrpc_server_test_action_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; gchar *data; guchar *packet; xmlChar *buffer; int buffer_length; guint status; static const guchar *start_soundcard_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSoundcard\x00\x00start\x00\x00\x00"; static const guchar *start_sequencer_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSequencer\x00\x00start\x00\x00\x00"; static const guchar *start_audio_message = "/action\x00,ss\x00/AgsSoundProvider/AgsAudio[0]\x00\x00\x00start\x00\x00\x00"; static const guchar *stop_soundcard_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSoundcard\x00\x00stop\x00\x00\x00\x00"; static const guchar *stop_sequencer_message = "/action\x00,ss\x00/AgsSoundProvider/AgsSequencer\x00\x00stop\x00\x00\x00\x00"; static const guchar *stop_audio_message = "/action\x00,ss\x00/AgsSoundProvider/AgsAudio[0]\x00\x00\x00stop\x00\x00\x00\x00"; static const guint start_soundcard_message_size = 52; static const guint start_sequencer_message_size = 52; static const guint start_audio_message_size = 52; static const guint stop_soundcard_message_size = 52; static const guint stop_sequencer_message_size = 52; static const guint stop_audio_message_size = 52; /* start soundcard */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, BAD_CAST "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) g_malloc((4 + start_soundcard_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, start_soundcard_message_size); memcpy(packet + 4, start_soundcard_message, (start_soundcard_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + start_soundcard_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); xmlFree(buffer); sleep(5); /* start sequencer */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, BAD_CAST "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) malloc((4 + start_sequencer_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, start_sequencer_message_size); memcpy(packet + 4, start_sequencer_message, (start_sequencer_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + start_sequencer_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); xmlFree(buffer); CU_ASSERT(status == 200); sleep(5); /* start audio */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) malloc((4 + start_audio_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, start_audio_message_size); memcpy(packet + 4, start_audio_message, (start_audio_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + start_audio_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); sleep(5); /* stop soundcard */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) g_malloc((4 + stop_soundcard_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, stop_soundcard_message_size); memcpy(packet + 4, stop_soundcard_message, (stop_soundcard_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + stop_soundcard_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); sleep(5); /* stop sequencer */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) malloc((4 + stop_sequencer_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, stop_sequencer_message_size); memcpy(packet + 4, stop_sequencer_message, (stop_sequencer_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + stop_sequencer_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); sleep(5); /* stop audio */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) malloc((4 + stop_audio_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, stop_audio_message_size); memcpy(packet + 4, stop_audio_message, (stop_audio_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + stop_audio_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); sleep(5); } void ags_functional_osc_xmlrpc_server_test_config_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; guchar *message; gchar *data; guchar *packet; xmlChar *buffer; guint config_length; guint length; int buffer_length; guint status; static const guchar *config_message = "/config\x00,s\x00\x00"; static const guint config_message_size = 12; /* apply config */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ config_length = strlen(AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_APPLY_CONFIG_ARGUMENT); length = config_message_size + (4 * ceil((double) (config_length + 1) / 4.0)); message = (guchar *) malloc(length * sizeof(guchar)); memset(message, 0, length * sizeof(guchar)); memcpy(message, config_message, config_message_size * sizeof(guchar)); memcpy(message + config_message_size, AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_APPLY_CONFIG_ARGUMENT, config_length * sizeof(guchar)); packet = (guchar *) g_malloc((4 + length) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, length); memcpy(packet + 4, message, (length) * sizeof(guchar)); data = g_base64_encode(packet, 4 + length); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); sleep(5); } void ags_functional_osc_xmlrpc_server_test_info_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; gchar *data; guchar *packet; xmlChar *buffer; int buffer_length; guint status; static const guchar *info_message = "/info\x00\x00\x00"; static const guint info_message_size = 8; /* info */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) g_malloc((4 + info_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, info_message_size); memcpy(packet + 4, info_message, (info_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + info_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); sleep(5); } void ags_functional_osc_xmlrpc_server_test_meter_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *child; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; xmlNode *login_node; xmlNode *security_token_node; xmlNode *redirect_node; struct timespec start_time; struct timespec timeout_delay; struct timespec idle_delay; gchar *login; gchar *security_token; gchar *resource_id; gchar *data; guchar *packet; xmlChar *buffer; int buffer_length; volatile gint meter_packet_count; guint i; gboolean retval; guint status; static const guchar *enable_peak_message = "/meter\x00\x00,sT\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-15]/AgsPeakChannel[0]/AgsPort[\"./peak[0]\"]:value\x00"; static const guchar *disable_peak_message = "/meter\x00\x00,sF\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-15]/AgsPeakChannel[0]/AgsPort[\"./peak[0]\"]:value\x00"; static const guint enable_peak_message_size = 112; static const guint disable_peak_message_size = 112; /* meter */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); xmlAddChild(osc_packet_node_list, osc_packet_node); /* OSC message */ packet = (guchar *) g_malloc((4 + enable_peak_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, enable_peak_message_size); memcpy(packet + 4, enable_peak_message, (enable_peak_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + enable_peak_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); sleep(5); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); /* parse cookies */ cookie = soup_cookies_from_response(msg); login = NULL; security_token = NULL; while(cookie != NULL){ char *cookie_name; cookie_name = soup_cookie_get_name(cookie->data); if(!g_ascii_strncasecmp(cookie_name, "ags-srv-login", 14)){ login = meter_data.login = soup_cookie_get_value(cookie->data); }else if(!g_ascii_strncasecmp(cookie_name, "ags-srv-security-token", 23)){ security_token = meter_data.security_token = soup_cookie_get_value(cookie->data); } if(login != NULL && security_token != NULL){ break; } cookie = cookie->next; } /* parse response */ g_message("%s", response_body->data); doc = xmlParseDoc(response_body->data); CU_ASSERT(doc != NULL); root_node = xmlDocGetRootElement(doc); CU_ASSERT(root_node != NULL); child = root_node->children; resource_id = NULL; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-srv-redirect", 17)){ xmlChar *tmp_resource_id; tmp_resource_id = xmlGetProp(child, "resource-id"); resource_id = meter_data.resource_id = g_strdup(tmp_resource_id); xmlFree(tmp_resource_id); break; } } child = child->next; } CU_ASSERT(resource_id != NULL); /* read packets */ #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); start_time.tv_sec = mts.tv_sec; start_time.tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, &start_time); #endif timeout_delay.tv_sec = 180; timeout_delay.tv_nsec = 0; idle_delay.tv_sec = 0; idle_delay.tv_nsec = AGS_NSEC_PER_SEC / 30; g_atomic_int_set(&(meter_packet_count), 0); i = 0; /* follow redirect */ msg = soup_message_new("GET", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc/response"); meter_data.meter_packet_count = &meter_packet_count; soup_session_websocket_connect_async(soup_session, msg, NULL, NULL, NULL, ags_functional_osc_xmlrpc_server_test_websocket_callback, NULL); g_message("wait for websocket"); while(!ags_time_timeout_expired(&start_time, &timeout_delay)){ g_main_context_iteration(test_main_context, FALSE); //empty nanosleep(&idle_delay, NULL); } g_message("Total received packets: %d", g_atomic_int_get(&meter_packet_count)); CU_ASSERT(g_atomic_int_get(&(meter_packet_count)) >= AGS_FUNCTIONAL_OSC_XMLRPC_SERVER_TEST_METER_PACKET_COUNT); /* disable meter */ packet = (guchar *) malloc((4 + disable_peak_message_size) * sizeof(guchar)); ags_osc_buffer_util_put_int32(packet, disable_peak_message_size); memcpy(packet + 4, disable_peak_message, (disable_peak_message_size) * sizeof(guchar)); data = g_base64_encode(packet, 4 + disable_peak_message_size); xmlNodeSetContent(osc_packet_node, data); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); /* send message */ msg = soup_form_request_new("POST", "http://127.0.0.1:8080/ags-xmlrpc/ags-osc-over-xmlrpc", NULL); soup_message_set_request(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, buffer, buffer_length); xmlFree(buffer); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); CU_ASSERT(status == 200); //TODO:JK: implement me } void ags_functional_osc_xmlrpc_server_test_node_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; gchar *data; guchar *packet; xmlChar *buffer; int buffer_length; guint status; static const guchar *volume_message = "/node\x00\x00\x00,s\x00\x00/AgsSoundProvider/AgsAudio[\"test-drum\"]/AgsInput[0-1]/AgsVolumeChannel[0]/AgsPort[\"./volume[0]\"]:value\x00\x00"; static const guint volume_message_size = 116; //TODO:JK: implement me } void ags_functional_osc_xmlrpc_server_test_renew_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; gchar *data; guchar *packet; xmlChar *buffer; int buffer_length; guint status; static const guchar *mute_message = "/renew\x00\x00,sf\x00/AgsSoundProvider/AgsAudio[\"test-panel\"]/AgsInput[0-1]/AgsMuteChannel[0]/AgsPort[\"./muted[0]\"]:value\x00\x00\x00\x00\x00\x00"; static const guint mute_message_size = 120; //TODO:JK: implement me } void ags_functional_osc_xmlrpc_server_test_status_controller() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; gchar *data; guchar *packet; xmlChar *buffer; int buffer_length; guint status; static const guchar *status_message = "/status\x00,\x00\x00\x00"; static const guint status_message_size = 12; //TODO:JK: implement me } int main(int argc, char **argv) { add_thread = g_thread_new("libags_audio.so - functional OSC XMLRPC server test", ags_functional_osc_xmlrpc_server_test_add_thread, NULL); g_main_loop_run(g_main_loop_new(g_main_context_default(), FALSE)); g_thread_join(add_thread); return(-1); } gsequencer-3.1.3/ags/test/audio/osc/ags_osc_websocket_connection_test.c0000644000175000017500000001370713607210263023334 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include int ags_osc_websocket_connection_test_init_suite(); int ags_osc_websocket_connection_test_clean_suite(); void ags_osc_websocket_connection_test_set_property(); void ags_osc_websocket_connection_test_get_property(); #define AGS_OSC_WEBSOCKET_CONNECTION_TEST_SET_PROPERTY_LOGIN "ags-test-login" #define AGS_OSC_WEBSOCKET_CONNECTION_TEST_SET_PROPERTY_SECURITY_TOKEN "ags-test-security-token" #define AGS_OSC_WEBSOCKET_CONNECTION_TEST_GET_PROPERTY_LOGIN "ags-test-login" #define AGS_OSC_WEBSOCKET_CONNECTION_TEST_GET_PROPERTY_SECURITY_TOKEN "ags-test-security-token" /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_websocket_connection_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_osc_websocket_connection_test_clean_suite() { return(0); } void ags_osc_websocket_connection_test_set_property() { AgsOscWebsocketConnection *osc_websocket_connection; AgsSecurityContext *security_context; SoupWebsocketConnection *websocket_connection; osc_websocket_connection = ags_osc_websocket_connection_new(NULL); websocket_connection = soup_websocket_connection_new(g_simple_io_stream_new(g_memory_input_stream_new(), g_memory_output_stream_new(NULL, 0, g_realloc, g_free)), soup_uri_new("http://localhost/ags-test-osc-xmlrpc"), SOUP_WEBSOCKET_CONNECTION_SERVER, NULL, NULL); security_context = ags_security_context_new(); g_object_set(osc_websocket_connection, "websocket-connection", websocket_connection, "security-context", security_context, "login", AGS_OSC_WEBSOCKET_CONNECTION_TEST_SET_PROPERTY_LOGIN, "security-token", AGS_OSC_WEBSOCKET_CONNECTION_TEST_SET_PROPERTY_SECURITY_TOKEN, NULL); CU_ASSERT(osc_websocket_connection->websocket_connection == websocket_connection); CU_ASSERT(osc_websocket_connection->security_context == security_context); CU_ASSERT((!g_strcmp0(osc_websocket_connection->login, AGS_OSC_WEBSOCKET_CONNECTION_TEST_SET_PROPERTY_LOGIN)) == TRUE); CU_ASSERT((!g_strcmp0(osc_websocket_connection->security_token, AGS_OSC_WEBSOCKET_CONNECTION_TEST_SET_PROPERTY_SECURITY_TOKEN)) == TRUE); } void ags_osc_websocket_connection_test_get_property() { AgsOscWebsocketConnection *osc_websocket_connection; AgsSecurityContext *security_context; SoupWebsocketConnection *websocket_connection; gchar *login; gchar *security_token; osc_websocket_connection = ags_osc_websocket_connection_new(NULL); osc_websocket_connection->websocket_connection = soup_websocket_connection_new(g_simple_io_stream_new(g_memory_input_stream_new(), g_memory_output_stream_new(NULL, 0, g_realloc, g_free)), soup_uri_new("http://localhost/ags-test-osc-xmlrpc"), SOUP_WEBSOCKET_CONNECTION_SERVER, NULL, NULL); osc_websocket_connection->security_context = ags_security_context_new(); osc_websocket_connection->login = AGS_OSC_WEBSOCKET_CONNECTION_TEST_GET_PROPERTY_LOGIN; osc_websocket_connection->security_token = AGS_OSC_WEBSOCKET_CONNECTION_TEST_GET_PROPERTY_SECURITY_TOKEN; g_object_get(osc_websocket_connection, "websocket-connection", &websocket_connection, "security-context", &security_context, "login", &login, "security-token", &security_token, NULL); CU_ASSERT(osc_websocket_connection->websocket_connection == websocket_connection); CU_ASSERT(osc_websocket_connection->security_context == security_context); CU_ASSERT((!g_strcmp0(login, AGS_OSC_WEBSOCKET_CONNECTION_TEST_GET_PROPERTY_LOGIN)) == TRUE); CU_ASSERT((!g_strcmp0(security_token, AGS_OSC_WEBSOCKET_CONNECTION_TEST_GET_PROPERTY_SECURITY_TOKEN)) == TRUE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsOscWebsocketConnectionTest", ags_osc_websocket_connection_test_init_suite, ags_osc_websocket_connection_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsOscWebsocketConnection set property", ags_osc_websocket_connection_test_set_property) == NULL) || (CU_add_test(pSuite, "test of AgsOscWebsocketConnection get property", ags_osc_websocket_connection_test_get_property) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/audio/ags_buffer_test.c0000644000175000017500000000763213605312646016756 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_buffer_test_init_suite(); int ags_buffer_test_clean_suite(); void ags_buffer_test_duplicate(); #define AGS_BUFFER_TEST_DUPLICATE_SAMPLERATE_0 (44100) #define AGS_BUFFER_TEST_DUPLICATE_BUFFER_SIZE_0 (1024) #define AGS_BUFFER_TEST_DUPLICATE_FORMAT_0 (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_BUFFER_TEST_DUPLICATE_X_0 (17 * AGS_BUFFER_TEST_DUPLICATE_BUFFER_SIZE_0) #define AGS_BUFFER_TEST_DUPLICATE_SAMPLERATE_1 (44100) #define AGS_BUFFER_TEST_DUPLICATE_BUFFER_SIZE_1 (1024) #define AGS_BUFFER_TEST_DUPLICATE_FORMAT_1 (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_BUFFER_TEST_DUPLICATE_X_1 (17 * AGS_BUFFER_TEST_DUPLICATE_BUFFER_SIZE_1) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_test_clean_suite() { return(0); } void ags_buffer_test_duplicate() { AgsBuffer *buffer, *copy_buffer; /* create buffer - #0 */ buffer = g_object_new(AGS_TYPE_BUFFER, "x", (guint64) AGS_BUFFER_TEST_DUPLICATE_X_0, "samplerate", AGS_BUFFER_TEST_DUPLICATE_SAMPLERATE_0, "buffer-size", AGS_BUFFER_TEST_DUPLICATE_BUFFER_SIZE_0, "format", AGS_BUFFER_TEST_DUPLICATE_FORMAT_0, NULL); /* assert duplicate - #0 */ copy_buffer = ags_buffer_duplicate(buffer); CU_ASSERT(AGS_IS_BUFFER(copy_buffer) && copy_buffer->x == buffer->x && copy_buffer->samplerate == buffer->samplerate && copy_buffer->buffer_size == buffer->buffer_size && copy_buffer->format == buffer->format); /* create buffer - #1 */ buffer = g_object_new(AGS_TYPE_BUFFER, "x", (guint64) AGS_BUFFER_TEST_DUPLICATE_X_1, "samplerate", AGS_BUFFER_TEST_DUPLICATE_SAMPLERATE_1, "buffer-size", AGS_BUFFER_TEST_DUPLICATE_BUFFER_SIZE_1, "format", AGS_BUFFER_TEST_DUPLICATE_FORMAT_1, NULL); /* assert duplicate - #1 */ copy_buffer = ags_buffer_duplicate(buffer); CU_ASSERT(AGS_IS_BUFFER(copy_buffer) && copy_buffer->x == buffer->x && copy_buffer->samplerate == buffer->samplerate && copy_buffer->buffer_size == buffer->buffer_size && copy_buffer->format == buffer->format); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsBufferTest", ags_buffer_test_init_suite, ags_buffer_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsBuffer duplicate", ags_buffer_test_duplicate) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/0000755000175000017500000000000013622252263013712 500000000000000gsequencer-3.1.3/ags/test/plugin/ags_ladspa_manager_test.c0000644000175000017500000002000113605312646020621 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_ladspa_manager_test_init_suite(); int ags_ladspa_manager_test_clean_suite(); void ags_ladspa_manager_test_get_filenames(); void ags_ladspa_manager_test_find_ladspa_plugin(); void ags_ladspa_manager_test_load_blacklist(); void ags_ladspa_manager_test_load_file(); void ags_ladspa_manager_test_load_default_directory(); #define AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_CMT "cmt.so" #define AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_SWH "swh.so" #define AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_VOCODER "vocoder.so" #define AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT "cmt.so" #define AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT_EFFECT "freeverb" #define AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH "swh.so" #define AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH_EFFECT "flanger" gchar **ags_ladspa_default_path; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_ladspa_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_ladspa_manager_test_clean_suite() { return(0); } void ags_ladspa_manager_test_get_filenames() { AgsLadspaManager *ladspa_manager; AgsLadspaPlugin *ladspa_plugin; GList *list; gchar **filename; ladspa_manager = ags_ladspa_manager_get_instance(); /* assert get NULL */ filename = ags_ladspa_manager_get_filenames(ladspa_manager); CU_ASSERT(filename == NULL); /* create some ladspa plugins */ list = NULL; ladspa_plugin = g_object_new(AGS_TYPE_LADSPA_PLUGIN, "filename", AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_CMT, NULL); list = g_list_prepend(list, ladspa_plugin); ladspa_plugin = g_object_new(AGS_TYPE_LADSPA_PLUGIN, "filename", AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_SWH, NULL); list = g_list_prepend(list, ladspa_plugin); ladspa_plugin = g_object_new(AGS_TYPE_LADSPA_PLUGIN, "filename", AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_VOCODER, NULL); list = g_list_prepend(list, ladspa_plugin); /* add plugins to manager */ ladspa_manager->ladspa_plugin = list; /* assert get filenames */ filename = ags_ladspa_manager_get_filenames(ladspa_manager); CU_ASSERT(g_strv_contains(filename, AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_CMT)); CU_ASSERT(g_strv_contains(filename, AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_SWH)); CU_ASSERT(g_strv_contains(filename, AGS_LADSPA_MANAGER_TEST_GET_FILENAMES_VOCODER)); CU_ASSERT(filename[3] == NULL); g_object_unref(ladspa_manager); } void ags_ladspa_manager_test_find_ladspa_plugin() { AgsLadspaManager *ladspa_manager; AgsLadspaPlugin *ladspa_plugin; GList *list; ladspa_manager = ags_ladspa_manager_get_instance(); CU_ASSERT(ags_ladspa_manager_find_ladspa_plugin(ladspa_manager, NULL, NULL) == NULL); /* create some ladspa plugins */ list = NULL; ladspa_plugin = g_object_new(AGS_TYPE_LADSPA_PLUGIN, "filename", AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT, "effect", AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT_EFFECT, NULL); list = g_list_prepend(list, ladspa_plugin); ladspa_plugin = g_object_new(AGS_TYPE_LADSPA_PLUGIN, "filename", AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH, "effect", AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH_EFFECT, NULL); list = g_list_prepend(list, ladspa_plugin); /* add plugins to manager */ ladspa_manager->ladspa_plugin = list; /* assert find ladspa plugin */ CU_ASSERT((ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ladspa_manager, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(ladspa_plugin)->filename, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT) && !g_strcmp0(AGS_BASE_PLUGIN(ladspa_plugin)->effect, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_CMT_EFFECT)); CU_ASSERT((ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ladspa_manager, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(ladspa_plugin)->filename, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH) && !g_strcmp0(AGS_BASE_PLUGIN(ladspa_plugin)->effect, AGS_LADSPA_MANAGER_TEST_FIND_LADSPA_PLUGIN_SWH_EFFECT)); g_object_unref(ladspa_manager); } void ags_ladspa_manager_test_load_blacklist() { AgsLadspaManager *ladspa_manager; ladspa_manager = ags_ladspa_manager_get_instance(); /* test NULL */ ags_ladspa_manager_load_blacklist(ladspa_manager, NULL); CU_ASSERT(ladspa_manager->ladspa_plugin_blacklist == NULL); //TODO:JK: implement better test g_object_unref(ladspa_manager); } void ags_ladspa_manager_test_load_file() { AgsLadspaManager *ladspa_manager; ladspa_manager = ags_ladspa_manager_get_instance(); /* test NULL */ ags_ladspa_manager_load_file(ladspa_manager, NULL, NULL); CU_ASSERT(ladspa_manager->ladspa_plugin == NULL); //TODO:JK: implement better test g_object_unref(ladspa_manager); } void ags_ladspa_manager_test_load_default_directory() { AgsLadspaManager *ladspa_manager; gchar *first_path; ladspa_manager = ags_ladspa_manager_get_instance(); /* test NULL */ ags_ladspa_default_path = ags_ladspa_manager_get_default_path(); first_path = ags_ladspa_default_path[0]; ags_ladspa_default_path[0] = NULL; ags_ladspa_manager_load_default_directory(ladspa_manager); CU_ASSERT(ladspa_manager->ladspa_plugin == NULL); //TODO:JK: implement better test ags_ladspa_default_path[0] = first_path; g_object_unref(ladspa_manager); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLadspaManagerTest\0", ags_ladspa_manager_test_init_suite, ags_ladspa_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLadspaManager get filenames\0", ags_ladspa_manager_test_get_filenames) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaManager find ladspa plugin\0", ags_ladspa_manager_test_find_ladspa_plugin) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaManager load blacklist\0", ags_ladspa_manager_test_load_blacklist) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaManager load file\0", ags_ladspa_manager_test_load_file) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaManager load default directory\0", ags_ladspa_manager_test_load_default_directory) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_dssi_manager_test.c0000644000175000017500000001740213605312646020332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_dssi_manager_test_init_suite(); int ags_dssi_manager_test_clean_suite(); void ags_dssi_manager_test_get_filenames(); void ags_dssi_manager_test_find_dssi_plugin(); void ags_dssi_manager_test_load_blacklist(); void ags_dssi_manager_test_load_file(); void ags_dssi_manager_test_load_default_directory(); #define AGS_DSSI_MANAGER_TEST_GET_FILENAMES_XSYNTH "xsynth.so" #define AGS_DSSI_MANAGER_TEST_GET_FILENAMES_HEXTER "hexter.so" #define AGS_DSSI_MANAGER_TEST_GET_FILENAMES_YOSHIMI "yoshimi.so" #define AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH "wsynth.so" #define AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH_EFFECT "wsynth" #define AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI "yoshimi.so" #define AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI_EFFECT "yoshimi" gchar **ags_dssi_default_path; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_dssi_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_dssi_manager_test_clean_suite() { return(0); } void ags_dssi_manager_test_get_filenames() { AgsDssiManager *dssi_manager; AgsDssiPlugin *dssi_plugin; GList *list; gchar **filename; dssi_manager = ags_dssi_manager_get_instance(); /* assert get NULL */ filename = ags_dssi_manager_get_filenames(dssi_manager); CU_ASSERT(filename == NULL); /* create some dssi plugins */ list = NULL; dssi_plugin = g_object_new(AGS_TYPE_DSSI_PLUGIN, "filename", AGS_DSSI_MANAGER_TEST_GET_FILENAMES_XSYNTH, NULL); list = g_list_prepend(list, dssi_plugin); dssi_plugin = g_object_new(AGS_TYPE_DSSI_PLUGIN, "filename", AGS_DSSI_MANAGER_TEST_GET_FILENAMES_HEXTER, NULL); list = g_list_prepend(list, dssi_plugin); dssi_plugin = g_object_new(AGS_TYPE_DSSI_PLUGIN, "filename", AGS_DSSI_MANAGER_TEST_GET_FILENAMES_YOSHIMI, NULL); list = g_list_prepend(list, dssi_plugin); /* add plugins to manager */ dssi_manager->dssi_plugin = list; /* assert get filenames */ filename = ags_dssi_manager_get_filenames(dssi_manager); CU_ASSERT(g_strv_contains(filename, AGS_DSSI_MANAGER_TEST_GET_FILENAMES_XSYNTH)); CU_ASSERT(g_strv_contains(filename, AGS_DSSI_MANAGER_TEST_GET_FILENAMES_HEXTER)); CU_ASSERT(g_strv_contains(filename, AGS_DSSI_MANAGER_TEST_GET_FILENAMES_YOSHIMI)); CU_ASSERT(filename[3] == NULL); g_object_unref(dssi_manager); } void ags_dssi_manager_test_find_dssi_plugin() { AgsDssiManager *dssi_manager; AgsDssiPlugin *dssi_plugin; GList *list; dssi_manager = ags_dssi_manager_get_instance(); CU_ASSERT(ags_dssi_manager_find_dssi_plugin(dssi_manager, NULL, NULL) == NULL); /* create some dssi plugins */ list = NULL; dssi_plugin = g_object_new(AGS_TYPE_DSSI_PLUGIN, "filename", AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH, "effect", AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH_EFFECT, NULL); list = g_list_prepend(list, dssi_plugin); dssi_plugin = g_object_new(AGS_TYPE_DSSI_PLUGIN, "filename", AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI, "effect", AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI_EFFECT, NULL); list = g_list_prepend(list, dssi_plugin); /* add plugins to manager */ dssi_manager->dssi_plugin = list; /* assert find dssi plugin */ CU_ASSERT((dssi_plugin = ags_dssi_manager_find_dssi_plugin(dssi_manager, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(dssi_plugin)->filename, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH) && !g_strcmp0(AGS_BASE_PLUGIN(dssi_plugin)->effect, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_WSYNTH_EFFECT)); CU_ASSERT((dssi_plugin = ags_dssi_manager_find_dssi_plugin(dssi_manager, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(dssi_plugin)->filename, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI) && !g_strcmp0(AGS_BASE_PLUGIN(dssi_plugin)->effect, AGS_DSSI_MANAGER_TEST_FIND_DSSI_PLUGIN_YOSHIMI_EFFECT)); g_object_unref(dssi_manager); } void ags_dssi_manager_test_load_blacklist() { AgsDssiManager *dssi_manager; dssi_manager = ags_dssi_manager_get_instance(); /* test NULL */ ags_dssi_manager_load_blacklist(dssi_manager, NULL); CU_ASSERT(dssi_manager->dssi_plugin_blacklist == NULL); //TODO:JK: implement better test g_object_unref(dssi_manager); } void ags_dssi_manager_test_load_file() { AgsDssiManager *dssi_manager; dssi_manager = ags_dssi_manager_get_instance(); /* test NULL */ ags_dssi_manager_load_file(dssi_manager, NULL, NULL); CU_ASSERT(dssi_manager->dssi_plugin == NULL); //TODO:JK: implement better test g_object_unref(dssi_manager); } void ags_dssi_manager_test_load_default_directory() { AgsDssiManager *dssi_manager; gchar *first_path; dssi_manager = ags_dssi_manager_get_instance(); /* test NULL */ ags_dssi_default_path = ags_dssi_manager_get_default_path(); first_path = ags_dssi_default_path[0]; ags_dssi_default_path[0] = NULL; ags_dssi_manager_load_default_directory(dssi_manager); CU_ASSERT(dssi_manager->dssi_plugin == NULL); //TODO:JK: implement better test ags_dssi_default_path[0] = first_path; g_object_unref(dssi_manager); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsDssiManagerTest\0", ags_dssi_manager_test_init_suite, ags_dssi_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsDssiManager get filenames\0", ags_dssi_manager_test_get_filenames) == NULL) || (CU_add_test(pSuite, "test of AgsDssiManager find dssi plugin\0", ags_dssi_manager_test_find_dssi_plugin) == NULL) || (CU_add_test(pSuite, "test of AgsDssiManager load blacklist\0", ags_dssi_manager_test_load_blacklist) == NULL) || (CU_add_test(pSuite, "test of AgsDssiManager load file\0", ags_dssi_manager_test_load_file) == NULL) || (CU_add_test(pSuite, "test of AgsDssiManager load default directory\0", ags_dssi_manager_test_load_default_directory) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2ui_manager_test.c0000644000175000017500000002466713605312646020444 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2ui_manager_test_init_suite(); int ags_lv2ui_manager_test_clean_suite(); void ags_lv2ui_manager_test_get_filenames(); void ags_lv2ui_manager_test_find_lv2ui_plugin(); void ags_lv2ui_manager_test_find_lv2ui_plugin_with_index(); void ags_lv2ui_manager_test_load_blacklist(); void ags_lv2ui_manager_test_load_file(); void ags_lv2ui_manager_test_load_default_directory(); #define AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_DELAY_SWH "plugin.so" #define AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_ZYNADD "zynadd.so" #define AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_HERMES_FILTER "plugin-linux.so" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA "plugin.so" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA_EFFECT "mono compressor" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42 "x42.so" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42_EFFECT "balance" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA "plugin.so" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA_INDEX (1) #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42 "x42.so" #define AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42_INDEX (3) gchar **ags_lv2ui_default_path; /* Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2ui_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2ui_manager_test_clean_suite() { return(0); } void ags_lv2ui_manager_test_get_filenames() { AgsLv2uiManager *lv2ui_manager; AgsLv2uiPlugin *lv2ui_plugin; GList *list; gchar **filename; lv2ui_manager = ags_lv2ui_manager_get_instance(); /* assert get NULL */ filename = ags_lv2ui_manager_get_filenames(lv2ui_manager); CU_ASSERT(filename == NULL); /* create some lv2 plugins */ list = NULL; lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_DELAY_SWH, NULL); list = g_list_prepend(list, lv2ui_plugin); lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_ZYNADD, NULL); list = g_list_prepend(list, lv2ui_plugin); lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_HERMES_FILTER, NULL); list = g_list_prepend(list, lv2ui_plugin); /* add plugins to manager */ lv2ui_manager->lv2ui_plugin = list; /* assert get filenames */ filename = ags_lv2ui_manager_get_filenames(lv2ui_manager); CU_ASSERT(g_strv_contains(filename, AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_DELAY_SWH)); CU_ASSERT(g_strv_contains(filename, AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_ZYNADD)); CU_ASSERT(g_strv_contains(filename, AGS_LV2UI_MANAGER_TEST_GET_FILENAMES_HERMES_FILTER)); CU_ASSERT(filename[3] == NULL); g_object_unref(lv2ui_manager); } void ags_lv2ui_manager_test_find_lv2ui_plugin() { AgsLv2uiManager *lv2ui_manager; AgsLv2uiPlugin *lv2ui_plugin; GList *list; lv2ui_manager = ags_lv2ui_manager_get_instance(); CU_ASSERT(ags_lv2ui_manager_find_lv2ui_plugin(lv2ui_manager, NULL, NULL) == NULL); /* create some lv2ui plugins */ list = NULL; lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA, "effect", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA_EFFECT, NULL); list = g_list_prepend(list, lv2ui_plugin); lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42, "effect", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42_EFFECT, NULL); list = g_list_prepend(list, lv2ui_plugin); /* add plugins to manager */ lv2ui_manager->lv2ui_plugin = list; /* assert find lv2ui plugin */ CU_ASSERT((lv2ui_plugin = ags_lv2ui_manager_find_lv2ui_plugin(lv2ui_manager, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA) && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->effect, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_INVADA_EFFECT)); CU_ASSERT((lv2ui_plugin = ags_lv2ui_manager_find_lv2ui_plugin(lv2ui_manager, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42) && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->effect, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_X42_EFFECT)); g_object_unref(lv2ui_manager); } void ags_lv2ui_manager_test_find_lv2ui_plugin_with_index() { AgsLv2uiManager *lv2ui_manager; AgsLv2uiPlugin *lv2ui_plugin; GList *list; lv2ui_manager = ags_lv2ui_manager_get_instance(); CU_ASSERT(ags_lv2ui_manager_find_lv2ui_plugin(lv2ui_manager, NULL, NULL) == NULL); /* create some lv2ui plugins */ list = NULL; lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA, "ui-effect-index", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA_INDEX, NULL); list = g_list_prepend(list, lv2ui_plugin); lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "ui-filename", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42, "ui-effect-index", AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42_INDEX, NULL); list = g_list_prepend(list, lv2ui_plugin); /* add plugins to manager */ lv2ui_manager->lv2ui_plugin = list; /* assert find lv2ui plugin */ CU_ASSERT((lv2ui_plugin = ags_lv2ui_manager_find_lv2ui_plugin_with_index(lv2ui_manager, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA_INDEX)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA) && AGS_BASE_PLUGIN(lv2ui_plugin)->ui_effect_index == AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_INVADA_INDEX); CU_ASSERT((lv2ui_plugin = ags_lv2ui_manager_find_lv2ui_plugin_with_index(lv2ui_manager, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42_INDEX)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42) && AGS_BASE_PLUGIN(lv2ui_plugin)->ui_effect_index == AGS_LV2UI_MANAGER_TEST_FIND_LV2UI_PLUGIN_WITH_INDEX_X42_INDEX); g_object_unref(lv2ui_manager); } void ags_lv2ui_manager_test_load_blacklist() { AgsLv2uiManager *lv2ui_manager; lv2ui_manager = ags_lv2ui_manager_get_instance(); /* test NULL */ ags_lv2ui_manager_load_blacklist(lv2ui_manager, NULL); CU_ASSERT(lv2ui_manager->lv2ui_plugin_blacklist == NULL); //TODO:JK: implement better test g_object_unref(lv2ui_manager); } void ags_lv2ui_manager_test_load_file() { AgsLv2uiManager *lv2ui_manager; lv2ui_manager = ags_lv2ui_manager_get_instance(); /* test NULL */ ags_lv2ui_manager_load_file(lv2ui_manager, NULL, NULL, NULL, NULL); CU_ASSERT(lv2ui_manager->lv2ui_plugin == NULL); //TODO:JK: implement better test g_object_unref(lv2ui_manager); } void ags_lv2ui_manager_test_load_default_directory() { AgsLv2uiManager *lv2ui_manager; gchar *first_path; lv2ui_manager = ags_lv2ui_manager_get_instance(); /* test NULL */ ags_lv2ui_default_path = ags_lv2ui_manager_get_default_path(); first_path = ags_lv2ui_default_path[0]; ags_lv2ui_default_path[0] = NULL; ags_lv2ui_manager_load_default_directory(lv2ui_manager); CU_ASSERT(lv2ui_manager->lv2ui_plugin == NULL); //TODO:JK: implement better test ags_lv2ui_default_path[0] = first_path; g_object_unref(lv2ui_manager); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2uiManagerTest", ags_lv2ui_manager_test_init_suite, ags_lv2ui_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2uiManager get filenames", ags_lv2ui_manager_test_get_filenames) == NULL) || (CU_add_test(pSuite, "test of AgsLv2uiManager find lv2ui plugin", ags_lv2ui_manager_test_find_lv2ui_plugin) == NULL) || (CU_add_test(pSuite, "test of AgsLv2uiManager find lv2ui plugin with index", ags_lv2ui_manager_test_find_lv2ui_plugin_with_index) == NULL) || (CU_add_test(pSuite, "test of AgsLv2uiManager load blacklist", ags_lv2ui_manager_test_load_blacklist) == NULL) || (CU_add_test(pSuite, "test of AgsLv2uiManager load file", ags_lv2ui_manager_test_load_file) == NULL) || (CU_add_test(pSuite, "test of AgsLv2uiManager load default directory", ags_lv2ui_manager_test_load_default_directory) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_plugin_port_test.c0000644000175000017500000005041313605312646020237 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_plugin_port_test_init_suite(); int ags_plugin_port_test_clean_suite(); void ags_plugin_port_test_test_flags(); void ags_plugin_port_test_set_flags(); void ags_plugin_port_test_unset_flags(); void ags_plugin_port_test_find_symbol(); #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_VOLUME "./volume[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_MUTED "./muted[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_28HZ "./peak-28hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_56HZ "./peak-56hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_112HZ "./peak-112hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_224HZ "./peak-224hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_448HZ "./peak-448hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_896HZ "./peak-896hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_1792HZ "./peak-1792hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_3584HZ "./peak-3584hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_7168HZ "./peak-7168hz[0]" #define AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_14336HZ "./peak-14336hz[0]" /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_plugin_port_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_plugin_port_test_clean_suite() { return(0); } void ags_plugin_port_test_test_flags() { AgsPluginPort *plugin_port; plugin_port = ags_plugin_port_new(); /* set flags */ plugin_port->flags = 0; /* test flags - AGS_PLUGIN_PORT_ATOM */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_ATOM)); /* test flags - AGS_PLUGIN_PORT_AUDIO */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_AUDIO)); /* test flags - AGS_PLUGIN_PORT_CONTROL */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_CONTROL)); /* test flags - AGS_PLUGIN_PORT_MIDI */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_MIDI)); /* test flags - AGS_PLUGIN_PORT_EVENT */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_EVENT)); /* test flags - AGS_PLUGIN_PORT_OUTPUT */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_OUTPUT)); /* test flags - AGS_PLUGIN_PORT_INPUT */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_INPUT)); /* test flags - AGS_PLUGIN_PORT_TOGGLED */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED)); /* test flags - AGS_PLUGIN_PORT_ENUMERATION */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_ENUMERATION)); /* test flags - AGS_PLUGIN_PORT_LOGARITHMIC */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)); /* test flags - AGS_PLUGIN_PORT_INTEGER */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER)); /* test flags - AGS_PLUGIN_PORT_SAMPLERATE */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_SAMPLERATE)); /* test flags - AGS_PLUGIN_PORT_BOUNDED_BELOW */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW)); /* test flags - AGS_PLUGIN_PORT_BOUNDED_ABOVE */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE)); /* test flags - AGS_PLUGIN_PORT_UI_NOTIFICATION */ CU_ASSERT(!ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_UI_NOTIFICATION)); /* set flags */ plugin_port->flags = (AGS_PLUGIN_PORT_ATOM | AGS_PLUGIN_PORT_AUDIO | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_MIDI | AGS_PLUGIN_PORT_EVENT | AGS_PLUGIN_PORT_OUTPUT | AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_TOGGLED | AGS_PLUGIN_PORT_ENUMERATION | AGS_PLUGIN_PORT_LOGARITHMIC | AGS_PLUGIN_PORT_INTEGER | AGS_PLUGIN_PORT_SAMPLERATE | AGS_PLUGIN_PORT_BOUNDED_BELOW | AGS_PLUGIN_PORT_BOUNDED_ABOVE | AGS_PLUGIN_PORT_UI_NOTIFICATION); /* test flags - AGS_PLUGIN_PORT_ATOM */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_ATOM)); /* test flags - AGS_PLUGIN_PORT_AUDIO */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_AUDIO)); /* test flags - AGS_PLUGIN_PORT_CONTROL */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_CONTROL)); /* test flags - AGS_PLUGIN_PORT_MIDI */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_MIDI)); /* test flags - AGS_PLUGIN_PORT_EVENT */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_EVENT)); /* test flags - AGS_PLUGIN_PORT_OUTPUT */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_OUTPUT)); /* test flags - AGS_PLUGIN_PORT_INPUT */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_INPUT)); /* test flags - AGS_PLUGIN_PORT_TOGGLED */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED)); /* test flags - AGS_PLUGIN_PORT_ENUMERATION */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_ENUMERATION)); /* test flags - AGS_PLUGIN_PORT_LOGARITHMIC */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)); /* test flags - AGS_PLUGIN_PORT_INTEGER */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER)); /* test flags - AGS_PLUGIN_PORT_SAMPLERATE */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_SAMPLERATE)); /* test flags - AGS_PLUGIN_PORT_BOUNDED_BELOW */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW)); /* test flags - AGS_PLUGIN_PORT_BOUNDED_ABOVE */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE)); /* test flags - AGS_PLUGIN_PORT_UI_NOTIFICATION */ CU_ASSERT(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_UI_NOTIFICATION)); } void ags_plugin_port_test_set_flags() { AgsPluginPort *plugin_port; plugin_port = ags_plugin_port_new(); /* set flags */ plugin_port->flags = 0; /* set flags - AGS_PLUGIN_PORT_ATOM */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_ATOM); CU_ASSERT((AGS_PLUGIN_PORT_ATOM & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_AUDIO */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_AUDIO); CU_ASSERT((AGS_PLUGIN_PORT_AUDIO & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_CONTROL */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_CONTROL); CU_ASSERT((AGS_PLUGIN_PORT_CONTROL & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_MIDI */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_MIDI); CU_ASSERT((AGS_PLUGIN_PORT_MIDI & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_EVENT */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_EVENT); CU_ASSERT((AGS_PLUGIN_PORT_EVENT & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_OUTPUT */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_OUTPUT); CU_ASSERT((AGS_PLUGIN_PORT_OUTPUT & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_INPUT */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_INPUT); CU_ASSERT((AGS_PLUGIN_PORT_INPUT & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_TOGGLED */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED); CU_ASSERT((AGS_PLUGIN_PORT_TOGGLED & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_ENUMERATION */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_ENUMERATION); CU_ASSERT((AGS_PLUGIN_PORT_ENUMERATION & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_LOGARITHMIC */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC); CU_ASSERT((AGS_PLUGIN_PORT_LOGARITHMIC & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_INTEGER */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER); CU_ASSERT((AGS_PLUGIN_PORT_INTEGER & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_SAMPLERATE */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_SAMPLERATE); CU_ASSERT((AGS_PLUGIN_PORT_SAMPLERATE & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_BOUNDED_BELOW */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW); CU_ASSERT((AGS_PLUGIN_PORT_BOUNDED_BELOW & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_BOUNDED_ABOVE */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE); CU_ASSERT((AGS_PLUGIN_PORT_BOUNDED_ABOVE & (plugin_port->flags)) != 0); /* set flags - AGS_PLUGIN_PORT_UI_NOTIFICATION */ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_UI_NOTIFICATION); CU_ASSERT((AGS_PLUGIN_PORT_UI_NOTIFICATION & (plugin_port->flags)) != 0); } void ags_plugin_port_test_unset_flags() { AgsPluginPort *plugin_port; plugin_port = ags_plugin_port_new(); /* set flags */ plugin_port->flags = (AGS_PLUGIN_PORT_ATOM | AGS_PLUGIN_PORT_AUDIO | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_MIDI | AGS_PLUGIN_PORT_EVENT | AGS_PLUGIN_PORT_OUTPUT | AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_TOGGLED | AGS_PLUGIN_PORT_ENUMERATION | AGS_PLUGIN_PORT_LOGARITHMIC | AGS_PLUGIN_PORT_INTEGER | AGS_PLUGIN_PORT_SAMPLERATE | AGS_PLUGIN_PORT_BOUNDED_BELOW | AGS_PLUGIN_PORT_BOUNDED_ABOVE | AGS_PLUGIN_PORT_UI_NOTIFICATION); /* unset flags - AGS_PLUGIN_PORT_ATOM */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_ATOM); CU_ASSERT((AGS_PLUGIN_PORT_ATOM & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_AUDIO */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_AUDIO); CU_ASSERT((AGS_PLUGIN_PORT_AUDIO & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_CONTROL */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_CONTROL); CU_ASSERT((AGS_PLUGIN_PORT_CONTROL & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_MIDI */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_MIDI); CU_ASSERT((AGS_PLUGIN_PORT_MIDI & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_EVENT */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_EVENT); CU_ASSERT((AGS_PLUGIN_PORT_EVENT & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_OUTPUT */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_OUTPUT); CU_ASSERT((AGS_PLUGIN_PORT_OUTPUT & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_INPUT */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_INPUT); CU_ASSERT((AGS_PLUGIN_PORT_INPUT & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_TOGGLED */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED); CU_ASSERT((AGS_PLUGIN_PORT_TOGGLED & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_ENUMERATION */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_ENUMERATION); CU_ASSERT((AGS_PLUGIN_PORT_ENUMERATION & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_LOGARITHMIC */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC); CU_ASSERT((AGS_PLUGIN_PORT_LOGARITHMIC & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_INTEGER */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER); CU_ASSERT((AGS_PLUGIN_PORT_INTEGER & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_SAMPLERATE */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_SAMPLERATE); CU_ASSERT((AGS_PLUGIN_PORT_SAMPLERATE & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_BOUNDED_BELOW */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW); CU_ASSERT((AGS_PLUGIN_PORT_BOUNDED_BELOW & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_BOUNDED_ABOVE */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE); CU_ASSERT((AGS_PLUGIN_PORT_BOUNDED_ABOVE & (plugin_port->flags)) == 0); /* unset flags - AGS_PLUGIN_PORT_UI_NOTIFICATION */ ags_plugin_port_unset_flags(plugin_port, AGS_PLUGIN_PORT_UI_NOTIFICATION); CU_ASSERT((AGS_PLUGIN_PORT_UI_NOTIFICATION & (plugin_port->flags)) == 0); } void ags_plugin_port_test_find_symbol() { AgsPluginPort *plugin_port; GList *list; GList *current; list = NULL; /* volume */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_VOLUME, NULL); list = g_list_prepend(list, plugin_port); /* muted */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_MUTED, NULL); list = g_list_prepend(list, plugin_port); /* peak-28hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_28HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-56hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_56HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-112hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_112HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-224hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_224HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-448hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_448HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-896hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_896HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-1792hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_1792HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-3584hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_3584HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-7168hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_7168HZ, NULL); list = g_list_prepend(list, plugin_port); /* peak-14336hz */ plugin_port = g_object_new(AGS_TYPE_PLUGIN_PORT, "port-symbol", AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_14336HZ, NULL); list = g_list_prepend(list, plugin_port); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_VOLUME */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_VOLUME); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_VOLUME)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_MUTED */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_MUTED); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_MUTED)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_28HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_28HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_28HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_56HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_56HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_56HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_112HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_112HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_112HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_224HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_224HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_224HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_448HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_448HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_448HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_896HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_896HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_896HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_1792HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_1792HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_1792HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_3584HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_3584HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_3584HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_7168HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_7168HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_7168HZ)); /* test find symbol - AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_14336HZ */ current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_14336HZ); CU_ASSERT(current != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_PORT_SYMBOL_PEAK_14336HZ)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPluginPortTest", ags_plugin_port_test_init_suite, ags_plugin_port_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPluginPort test flags", ags_plugin_port_test_test_flags) == NULL) || (CU_add_test(pSuite, "test of AgsPluginPort set flags", ags_plugin_port_test_set_flags) == NULL) || (CU_add_test(pSuite, "test of AgsPluginPort unset flags", ags_plugin_port_test_unset_flags) == NULL) || (CU_add_test(pSuite, "test of AgsPluginPort find symbol", ags_plugin_port_test_find_symbol) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_preset_test.c0000644000175000017500000001106513605312646017762 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2_preset_test_init_suite(); int ags_lv2_preset_test_clean_suite(); void ags_lv2_preset_test_parse_turtle(); void ags_lv2_preset_test_find_preset_label(); #define AGS_LV2_PRESET_TEST_PARSE_TURTLE_URI "" #define AGS_LV2_PRESET_TEST_PARSE_TURTLE_TTL SRCDIR "/lv2.lib/mda/EPiano-presets.ttl" #define AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_DEFAULT "Default" #define AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_BRIGHT "Bright" #define AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_TREMOLO "Tremolo" /* Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_preset_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_preset_test_clean_suite() { return(0); } void ags_lv2_preset_test_parse_turtle() { AgsLv2Preset *lv2_preset; AgsTurtle *turtle; GError *error; g_message("%s", AGS_LV2_PRESET_TEST_PARSE_TURTLE_TTL); turtle = ags_turtle_new(AGS_LV2_PRESET_TEST_PARSE_TURTLE_TTL); error = NULL; ags_turtle_load(turtle, &error); // xmlSaveFormatFileEnc("-", turtle->doc, "UTF-8", 1); lv2_preset = (AgsLv2Preset *) g_object_new(AGS_TYPE_LV2_PRESET, "turtle", turtle, "uri", AGS_LV2_PRESET_TEST_PARSE_TURTLE_URI, NULL); /* parse and assert */ ags_lv2_preset_parse_turtle(lv2_preset); CU_ASSERT(lv2_preset->port_preset != NULL); } void ags_lv2_preset_test_find_preset_label() { AgsLv2Preset *lv2_preset[3]; GList *list, *current; list = NULL; lv2_preset[0] = (AgsLv2Preset *) g_object_new(AGS_TYPE_LV2_PRESET, "preset-label", AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_DEFAULT, NULL); list = g_list_prepend(list, lv2_preset[0]); lv2_preset[1] = (AgsLv2Preset *) g_object_new(AGS_TYPE_LV2_PRESET, "preset-label", AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_BRIGHT, NULL); list = g_list_prepend(list, lv2_preset[1]); lv2_preset[2] = (AgsLv2Preset *) g_object_new(AGS_TYPE_LV2_PRESET, "preset-label", AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_TREMOLO, NULL); list = g_list_prepend(list, lv2_preset[2]); /* assert */ CU_ASSERT((current = ags_lv2_preset_find_preset_label(list, AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_DEFAULT)) != NULL && current->data == lv2_preset[0]); CU_ASSERT((current = ags_lv2_preset_find_preset_label(list, AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_BRIGHT)) != NULL && current->data == lv2_preset[1]); CU_ASSERT((current = ags_lv2_preset_find_preset_label(list, AGS_LV2_PRESET_TEST_FIND_PRESET_LABEL_TREMOLO)) != NULL && current->data == lv2_preset[2]); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; #if 0 /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2PresetTest", ags_lv2_preset_test_init_suite, ags_lv2_preset_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2Preset parse turtle", ags_lv2_preset_test_parse_turtle) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Preset find preset label", ags_lv2_preset_test_find_preset_label) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); #endif return(0); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_conversion_test.c0000644000175000017500000001045513605312646020647 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2_conversion_test_init_suite(); int ags_lv2_conversion_test_clean_suite(); void ags_lv2_conversion_test_test_flags(); void ags_lv2_conversion_test_set_flags(); void ags_lv2_conversion_test_unset_flags(); void ags_lv2_conversion_test_convert(); /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_conversion_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_conversion_test_clean_suite() { return(0); } void ags_lv2_conversion_test_test_flags() { AgsLv2Conversion *lv2_conversion; lv2_conversion = ags_lv2_conversion_new(); /* test flags - no logarithmic */ CU_ASSERT(!ags_lv2_conversion_test_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC)); /* set flags */ lv2_conversion->flags = (AGS_LV2_CONVERSION_LOGARITHMIC); /* test flags - logarithmic */ CU_ASSERT(ags_lv2_conversion_test_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC)); } void ags_lv2_conversion_test_set_flags() { AgsLv2Conversion *lv2_conversion; lv2_conversion = ags_lv2_conversion_new(); lv2_conversion->flags = 0; /* set flags - logarithmic */ ags_lv2_conversion_set_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC); CU_ASSERT((AGS_LV2_CONVERSION_LOGARITHMIC & (lv2_conversion->flags)) != 0); } void ags_lv2_conversion_test_unset_flags() { AgsLv2Conversion *lv2_conversion; lv2_conversion = ags_lv2_conversion_new(); lv2_conversion->flags = (AGS_LV2_CONVERSION_LOGARITHMIC); /* unset flags - logarithmic */ ags_lv2_conversion_unset_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC); CU_ASSERT((AGS_LV2_CONVERSION_LOGARITHMIC & (lv2_conversion->flags)) == 0); } void ags_lv2_conversion_test_convert() { AgsLv2Conversion *lv2_conversion; gdouble retval; lv2_conversion = ags_lv2_conversion_new(); /* convert - #0 */ ags_lv2_conversion_set_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC); retval = ags_conversion_convert(lv2_conversion, 0.25, FALSE); CU_ASSERT(retval != 0.0); retval = ags_conversion_convert(lv2_conversion, exp(0.25), TRUE); CU_ASSERT(retval != 0.0); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2ConversionTest", ags_lv2_conversion_test_init_suite, ags_lv2_conversion_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2Conversion test flags", ags_lv2_conversion_test_test_flags) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Conversion set flags", ags_lv2_conversion_test_set_flags) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Conversion unset flags", ags_lv2_conversion_test_unset_flags) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Conversion convert", ags_lv2_conversion_test_convert) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_base_plugin_test.c0000644000175000017500000005555513605312646020201 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_base_plugin_test_init_suite(); int ags_base_plugin_test_clean_suite(); void ags_plugin_port_test_find_symbol(); void ags_base_plugin_test_find_filename(); void ags_base_plugin_test_find_effect(); void ags_base_plugin_test_find_ui_effect_index(); void ags_base_plugin_test_sort(); void ags_base_plugin_test_apply_port_group_by_prefix(); void ags_base_plugin_test_instantiate(); void ags_base_plugin_test_connect_port(); void ags_base_plugin_test_activate(); void ags_base_plugin_test_deactivate(); void ags_base_plugin_test_run(); void ags_base_plugin_test_load_plugin(); gpointer ags_base_plugin_test_stub_instantiate(AgsBasePlugin *base_plugin, guint samplerate); void ags_base_plugin_test_stub_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void ags_base_plugin_test_stub_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_base_plugin_test_stub_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_base_plugin_test_stub_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void ags_base_plugin_test_stub_load_plugin(AgsBasePlugin *base_plugin); #define AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DELAY "delay" #define AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DRY "dry" #define AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_WET "wet" #define AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_FEEDBACK "feedback" #define AGS_BASE_PLUGIN_TEST_FIND_FILENAME_DEFAULT "default" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT "cmt.so" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_PINK_NOISE "pink noise" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ECHO_DELAY "echo delay" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_GVERB "gverb" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH "swh.so" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_AMPLIFIER "amplifier" #define AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ENVELOPE_TRACKER "envelope tracker" #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR "compressor.so" #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR_INDEX (3) #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS "chorus.so" #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS_INDEX (15) #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER "flanger.so" #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER_INDEX (37) #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER "spatializer.so" #define AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER_INDEX (1) #define AGS_BASE_PLUGIN_TEST_SORT_PINK_NOISE "pink noise" #define AGS_BASE_PLUGIN_TEST_SORT_ECHO_DELAY "echo delay" #define AGS_BASE_PLUGIN_TEST_SORT_GVERB "gverb" #define AGS_BASE_PLUGIN_TEST_SORT_AMPLIFIER "amplifier" #define AGS_BASE_PLUGIN_TEST_SORT_ENVELOPE_TRACKER "envelope tracker" #define AGS_BASE_PLUGIN_TEST_SORT_COMPRESSOR "compressor" #define AGS_BASE_PLUGIN_TEST_SORT_CHORUS "chorus" #define AGS_BASE_PLUGIN_TEST_SORT_FLANGER "flanger" #define AGS_BASE_PLUGIN_TEST_SORT_SPATIALIZER "spatializer" #define AGS_BASE_PLUGIN_TEST_INSTANTIATE_SAMPLERATE (48000) #define AGS_BASE_PLUGIN_TEST_INSTANTIATE_BUFFER_SIZE (512) #define AGS_BASE_PLUGIN_TEST_RUN_FRAME_COUNT (512) gboolean stub_instantiate = FALSE; gboolean stub_connect_port = FALSE; gboolean stub_activate = FALSE; gboolean stub_deactivate = FALSE; gboolean stub_run = FALSE; gboolean stub_load_plugin = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_base_plugin_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_base_plugin_test_clean_suite() { return(0); } void ags_plugin_port_test_find_symbol() { AgsPluginPort *plugin_port; GList *list, *current; list = NULL; /* delay */ plugin_port = ags_plugin_port_new(); plugin_port->port_symbol = AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DELAY; list = g_list_prepend(list, plugin_port); /* dry */ plugin_port = ags_plugin_port_new(); plugin_port->port_symbol = AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DRY; list = g_list_prepend(list, plugin_port); /* wet */ plugin_port = ags_plugin_port_new(); plugin_port->port_symbol = AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_WET; list = g_list_prepend(list, plugin_port); /* feedback */ plugin_port = ags_plugin_port_new(); plugin_port->port_symbol = AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_FEEDBACK; list = g_list_prepend(list, plugin_port); /* assert find */ CU_ASSERT((current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DELAY)) != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DELAY)); CU_ASSERT((current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DRY)) != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_DRY)); CU_ASSERT((current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_WET)) != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_WET)); CU_ASSERT((current = ags_plugin_port_find_symbol(list, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_FEEDBACK)) != NULL && !g_strcmp0(AGS_PLUGIN_PORT(current->data)->port_symbol, AGS_PLUGIN_PORT_TEST_FIND_SYMBOL_FEEDBACK)); } void ags_base_plugin_test_find_filename() { AgsBasePlugin *base_plugin; GList *list, *current; gchar *str[3]; guint i; list = NULL; i = 0; /* base plugin #0 */ str[0] = g_strdup_printf("%s %d", AGS_BASE_PLUGIN_TEST_FIND_FILENAME_DEFAULT, i); i++; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", str[0], NULL); list = g_list_prepend(list, base_plugin); /* base plugin #1 */ str[1] = g_strdup_printf("%s %d", AGS_BASE_PLUGIN_TEST_FIND_FILENAME_DEFAULT, i); i++; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", str[1], NULL); list = g_list_prepend(list, base_plugin); /* base plugin #2 */ str[2] = g_strdup_printf("%s %d", AGS_BASE_PLUGIN_TEST_FIND_FILENAME_DEFAULT, i); i++; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", str[2], NULL); list = g_list_prepend(list, base_plugin); /* assert find filename */ CU_ASSERT((current = ags_base_plugin_find_filename(list, str[0])) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, str[0])); CU_ASSERT((current = ags_base_plugin_find_filename(list, str[1])) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, str[1])); CU_ASSERT((current = ags_base_plugin_find_filename(list, str[2])) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, str[2])); } void ags_base_plugin_test_find_effect() { AgsBasePlugin *base_plugin; GList *list, *current; list = NULL; /* cmt */ base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT, "effect", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_PINK_NOISE, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT, "effect", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ECHO_DELAY, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT, "effect", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_GVERB, NULL); list = g_list_prepend(list, base_plugin); /* swh */ base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH, "effect", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_AMPLIFIER, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH, "effect", AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ENVELOPE_TRACKER, NULL); list = g_list_prepend(list, base_plugin); /* assert find - cmt effect */ CU_ASSERT((current = ags_base_plugin_find_effect(list, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_PINK_NOISE)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT) && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_PINK_NOISE)); CU_ASSERT((current = ags_base_plugin_find_effect(list, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ECHO_DELAY)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT) && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ECHO_DELAY)); CU_ASSERT((current = ags_base_plugin_find_effect(list, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_GVERB)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_CMT) && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_GVERB)); /* assert find - swh effect */ CU_ASSERT((current = ags_base_plugin_find_effect(list, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_AMPLIFIER)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH) && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_AMPLIFIER)); CU_ASSERT((current = ags_base_plugin_find_effect(list, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ENVELOPE_TRACKER)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->filename, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_SWH) && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_FIND_EFFECT_ENVELOPE_TRACKER)); } void ags_base_plugin_test_find_ui_effect_index() { AgsBasePlugin *base_plugin; GList *list, *current; list = NULL; /* create some base plugin */ base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "ui-filename", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR, "ui-effect-index", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR_INDEX, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "ui-filename", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS, "ui-effect-index", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS_INDEX, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "ui-filename", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER, "ui-effect-index", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER_INDEX, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "ui-filename", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER, "ui-effect-index", AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER_INDEX, NULL); list = g_list_prepend(list, base_plugin); /* assert find UI effect index */ CU_ASSERT((current = ags_base_plugin_find_ui_effect_index(list, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR_INDEX)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->ui_filename, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR) && AGS_BASE_PLUGIN(current->data)->ui_effect_index == AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_COMPRESSOR_INDEX); CU_ASSERT((current = ags_base_plugin_find_ui_effect_index(list, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS_INDEX)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->ui_filename, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS) && AGS_BASE_PLUGIN(current->data)->ui_effect_index == AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_CHORUS_INDEX); CU_ASSERT((current = ags_base_plugin_find_ui_effect_index(list, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER_INDEX)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->ui_filename, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER) && AGS_BASE_PLUGIN(current->data)->ui_effect_index == AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_FLANGER_INDEX); CU_ASSERT((current = ags_base_plugin_find_ui_effect_index(list, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER_INDEX)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(current->data)->ui_filename, AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER) && AGS_BASE_PLUGIN(current->data)->ui_effect_index == AGS_BASE_PLUGIN_TEST_FIND_UI_EFFECT_INDEX_SPATIALIZER_INDEX); } void ags_base_plugin_test_sort() { AgsBasePlugin *base_plugin; GList *list, *current; list = NULL; /* add some effects */ base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_PINK_NOISE, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_ECHO_DELAY, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_GVERB, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_AMPLIFIER, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_ENVELOPE_TRACKER, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_COMPRESSOR, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_CHORUS, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_FLANGER, NULL); list = g_list_prepend(list, base_plugin); base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, "effect", AGS_BASE_PLUGIN_TEST_SORT_SPATIALIZER, NULL); list = g_list_prepend(list, base_plugin); /* sort base plugins */ list = ags_base_plugin_sort(list); /* assert sorted alphabetically */ current = list; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_AMPLIFIER)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_CHORUS)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_COMPRESSOR)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_ECHO_DELAY)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_ENVELOPE_TRACKER)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_FLANGER)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_GVERB)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_PINK_NOISE)); current = current->next; CU_ASSERT(!g_strcmp0(AGS_BASE_PLUGIN(current->data)->effect, AGS_BASE_PLUGIN_TEST_SORT_SPATIALIZER)); current = current->next; CU_ASSERT(current == NULL); } void ags_base_plugin_test_apply_port_group_by_prefix() { //TODO:JK: implement me } void ags_base_plugin_test_instantiate() { AgsBasePlugin *base_plugin; gpointer ptr; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, NULL); ptr = AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->instantiate; AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->instantiate = ags_base_plugin_test_stub_instantiate; ags_base_plugin_instantiate(base_plugin, AGS_BASE_PLUGIN_TEST_INSTANTIATE_SAMPLERATE, AGS_BASE_PLUGIN_TEST_INSTANTIATE_BUFFER_SIZE); CU_ASSERT(stub_instantiate == TRUE); AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->instantiate = ptr; } void ags_base_plugin_test_connect_port() { AgsBasePlugin *base_plugin; gpointer ptr; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, NULL); ptr = AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->connect_port; AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->connect_port = ags_base_plugin_test_stub_connect_port; ags_base_plugin_connect_port(base_plugin, NULL, 0, NULL); CU_ASSERT(stub_connect_port == TRUE); AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->connect_port = ptr; } void ags_base_plugin_test_activate() { AgsBasePlugin *base_plugin; gpointer ptr; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, NULL); ptr = AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->activate; AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->activate = ags_base_plugin_test_stub_activate; ags_base_plugin_activate(base_plugin, NULL); CU_ASSERT(stub_activate == TRUE); AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->activate = ptr; } void ags_base_plugin_test_deactivate() { AgsBasePlugin *base_plugin; gpointer ptr; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, NULL); ptr = AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->deactivate; AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->deactivate = ags_base_plugin_test_stub_deactivate; ags_base_plugin_deactivate(base_plugin, NULL); CU_ASSERT(stub_deactivate == TRUE); AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->deactivate = ptr; } void ags_base_plugin_test_run() { AgsBasePlugin *base_plugin; gpointer ptr; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, NULL); ptr = AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->run; AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->run = ags_base_plugin_test_stub_run; ags_base_plugin_run(base_plugin, NULL, NULL, AGS_BASE_PLUGIN_TEST_RUN_FRAME_COUNT); CU_ASSERT(stub_run == TRUE); AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->run = ptr; } void ags_base_plugin_test_load_plugin() { AgsBasePlugin *base_plugin; base_plugin = g_object_new(AGS_TYPE_BASE_PLUGIN, NULL); AGS_BASE_PLUGIN_GET_CLASS(base_plugin)->load_plugin = ags_base_plugin_test_stub_load_plugin; ags_base_plugin_load_plugin(base_plugin); CU_ASSERT(stub_load_plugin == TRUE); } gpointer ags_base_plugin_test_stub_instantiate(AgsBasePlugin *base_plugin, guint samplerate) { stub_instantiate = TRUE; return(NULL); } void ags_base_plugin_test_stub_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location) { stub_connect_port = TRUE; } void ags_base_plugin_test_stub_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { stub_activate = TRUE; } void ags_base_plugin_test_stub_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { stub_deactivate = TRUE; } void ags_base_plugin_test_stub_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count) { stub_run = TRUE; } void ags_base_plugin_test_stub_load_plugin(AgsBasePlugin *base_plugin) { stub_load_plugin = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsBasePluginTest\0", ags_base_plugin_test_init_suite, ags_base_plugin_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPortDescriptor find symbol\0", ags_plugin_port_test_find_symbol) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin find filename\0", ags_base_plugin_test_find_filename) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin find effect\0", ags_base_plugin_test_find_effect) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin find UI effect index\0", ags_base_plugin_test_find_ui_effect_index) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin sort\0", ags_base_plugin_test_sort) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin apply port group by prefix\0", ags_base_plugin_test_apply_port_group_by_prefix) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin instantiate\0", ags_base_plugin_test_instantiate) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin connect port\0", ags_base_plugin_test_connect_port) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin activate\0", ags_base_plugin_test_activate) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin deactivate\0", ags_base_plugin_test_deactivate) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin run\0", ags_base_plugin_test_run) == NULL) || (CU_add_test(pSuite, "test of AgsBasePlugin load plugin\0", ags_base_plugin_test_load_plugin) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_ladspa_conversion_test.c0000644000175000017500000001652513605312646021414 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_ladspa_conversion_test_init_suite(); int ags_ladspa_conversion_test_clean_suite(); void ags_ladspa_conversion_test_test_flags(); void ags_ladspa_conversion_test_set_flags(); void ags_ladspa_conversion_test_unset_flags(); void ags_ladspa_conversion_test_convert(); #define AGS_LADSPA_CONVERSION_TEST_CONVERT_SAMPLERATE (44100) /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_ladspa_conversion_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_ladspa_conversion_test_clean_suite() { return(0); } void ags_ladspa_conversion_test_test_flags() { AgsLadspaConversion *ladspa_conversion; ladspa_conversion = ags_ladspa_conversion_new(); ladspa_conversion->flags = 0; /* test flags - samplerate */ CU_ASSERT(!ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE)); /* test flags - bounded below */ CU_ASSERT(!ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_BELOW)); /* test flags - bounded above */ CU_ASSERT(!ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_ABOVE)); /* test flags - logarithmic */ CU_ASSERT(!ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC)); /* set flags */ ladspa_conversion->flags = (AGS_LADSPA_CONVERSION_SAMPLERATE | AGS_LADSPA_CONVERSION_BOUNDED_BELOW | AGS_LADSPA_CONVERSION_BOUNDED_ABOVE | AGS_LADSPA_CONVERSION_LOGARITHMIC); /* test flags - samplerate */ CU_ASSERT(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE)); /* test flags - bounded below */ CU_ASSERT(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_BELOW)); /* test flags - bounded above */ CU_ASSERT(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_ABOVE)); /* test flags - logarithmic */ CU_ASSERT(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC)); } void ags_ladspa_conversion_test_set_flags() { AgsLadspaConversion *ladspa_conversion; ladspa_conversion = ags_ladspa_conversion_new(); ladspa_conversion->flags = 0; /* set flags - samplerate */ ags_ladspa_conversion_set_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE); CU_ASSERT((AGS_LADSPA_CONVERSION_SAMPLERATE & (ladspa_conversion->flags)) != 0); /* set flags - bounded below */ ags_ladspa_conversion_set_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_BELOW); CU_ASSERT((AGS_LADSPA_CONVERSION_BOUNDED_BELOW & (ladspa_conversion->flags)) != 0); /* set flags - bounded above */ ags_ladspa_conversion_set_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_ABOVE); CU_ASSERT((AGS_LADSPA_CONVERSION_BOUNDED_ABOVE & (ladspa_conversion->flags)) != 0); /* set flags - logarithmic */ ags_ladspa_conversion_set_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC); CU_ASSERT((AGS_LADSPA_CONVERSION_LOGARITHMIC & (ladspa_conversion->flags)) != 0); } void ags_ladspa_conversion_test_unset_flags() { AgsLadspaConversion *ladspa_conversion; ladspa_conversion = ags_ladspa_conversion_new(); ladspa_conversion->flags = (AGS_LADSPA_CONVERSION_SAMPLERATE | AGS_LADSPA_CONVERSION_BOUNDED_BELOW | AGS_LADSPA_CONVERSION_BOUNDED_ABOVE | AGS_LADSPA_CONVERSION_LOGARITHMIC); /* unset flags - samplerate */ ags_ladspa_conversion_unset_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE); CU_ASSERT((AGS_LADSPA_CONVERSION_SAMPLERATE & (ladspa_conversion->flags)) == 0); /* unset flags - bounded below */ ags_ladspa_conversion_unset_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_BELOW); CU_ASSERT((AGS_LADSPA_CONVERSION_BOUNDED_BELOW & (ladspa_conversion->flags)) == 0); /* unset flags - bounded above */ ags_ladspa_conversion_unset_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_BOUNDED_ABOVE); CU_ASSERT((AGS_LADSPA_CONVERSION_BOUNDED_ABOVE & (ladspa_conversion->flags)) == 0); /* unset flags - logarithmic */ ags_ladspa_conversion_unset_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC); CU_ASSERT((AGS_LADSPA_CONVERSION_LOGARITHMIC & (ladspa_conversion->flags)) == 0); } void ags_ladspa_conversion_test_convert() { AgsLadspaConversion *ladspa_conversion; gdouble retval; ladspa_conversion = ags_ladspa_conversion_new(); g_object_set(ladspa_conversion, "samplerate", AGS_LADSPA_CONVERSION_TEST_CONVERT_SAMPLERATE, NULL); /* convert - #0 */ ags_ladspa_conversion_set_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC); retval = ags_conversion_convert(ladspa_conversion, 0.25, FALSE); CU_ASSERT(retval != 0.0); retval = ags_conversion_convert(ladspa_conversion, exp(0.25), TRUE); CU_ASSERT(retval != 0.0); /* convert - #1 */ ags_ladspa_conversion_set_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE); retval = ags_conversion_convert(ladspa_conversion, 0.25, FALSE); CU_ASSERT(retval != 0.0); retval = ags_conversion_convert(ladspa_conversion, exp(0.25), TRUE); CU_ASSERT(retval != 0.0); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLadspaConversionTest", ags_ladspa_conversion_test_init_suite, ags_ladspa_conversion_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLadspaConversion test flags", ags_ladspa_conversion_test_test_flags) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaConversion set flags", ags_ladspa_conversion_test_set_flags) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaConversion unset flags", ags_ladspa_conversion_test_unset_flags) == NULL) || (CU_add_test(pSuite, "test of AgsLadspaConversion convert", ags_ladspa_conversion_test_convert) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2ui_plugin_test.c0000644000175000017500000000722613605312646020320 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2ui_plugin_test_init_suite(); int ags_lv2ui_plugin_test_clean_suite(); void ags_lv2ui_plugin_test_find_gui_uri(); #define AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_SWH "http://plugin.org.uk/ladspa-swh" #define AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_INVADA "http://invadarecords.com/plugins/lv2" #define AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_ZYN "http://home.gna.org/zyn/zynadd" /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2ui_plugin_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2ui_plugin_test_clean_suite() { return(0); } void ags_lv2ui_plugin_test_find_gui_uri() { AgsLv2uiPlugin *lv2ui_plugin[3]; GList *list, *current; list = NULL; lv2ui_plugin[0] = (AgsLv2uiPlugin *) g_object_new(AGS_TYPE_LV2UI_PLUGIN, "gui-uri", AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_SWH, NULL); list = g_list_prepend(list, lv2ui_plugin[0]); lv2ui_plugin[1] = (AgsLv2uiPlugin *) g_object_new(AGS_TYPE_LV2UI_PLUGIN, "gui-uri", AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_INVADA, NULL); list = g_list_prepend(list, lv2ui_plugin[1]); lv2ui_plugin[2] = (AgsLv2uiPlugin *) g_object_new(AGS_TYPE_LV2UI_PLUGIN, "gui-uri", AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_ZYN, NULL); list = g_list_prepend(list, lv2ui_plugin[2]); /* assert */ CU_ASSERT((current = ags_lv2ui_plugin_find_gui_uri(list, AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_SWH)) != NULL && current->data == lv2ui_plugin[0]); CU_ASSERT((current = ags_lv2ui_plugin_find_gui_uri(list, AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_INVADA)) != NULL && current->data == lv2ui_plugin[1]); CU_ASSERT((current = ags_lv2ui_plugin_find_gui_uri(list, AGS_LV2UI_PLUGIN_TEST_FIND_GUI_URI_ZYN)) != NULL && current->data == lv2ui_plugin[2]); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2uiPluginTest", ags_lv2ui_plugin_test_init_suite, ags_lv2ui_plugin_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2uiPlugin find GUI URI", ags_lv2ui_plugin_test_find_gui_uri) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_urid_manager_test.c0000644000175000017500000001365613605312646021125 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2_urid_manager_test_init_suite(); int ags_lv2_urid_manager_test_clean_suite(); void ags_lv2_urid_manager_test_insert(); void ags_lv2_urid_manager_test_remove(); void ags_lv2_urid_manager_test_lookup(); void ags_lv2_urid_manager_test_map(); void ags_lv2_urid_manager_test_unmap(); gboolean ags_lv2_urid_manager_test_map_ghrfunc(gpointer key, gpointer value, gpointer user_data); #define AGS_LV2_URID_MANAGER_TEST_INSERT_URI "http://drobilla.net/plugins/mda/EPiano" #define AGS_LV2_URID_MANAGER_TEST_REMOVE_URI "http://drobilla.net/plugins/mda/EPiano" #define AGS_LV2_URID_MANAGER_TEST_LOOKUP_URI "http://drobilla.net/plugins/mda/EPiano" #define AGS_LV2_URID_MANAGER_TEST_MAP_URI "http://drobilla.net/plugins/mda/EPiano" #define AGS_LV2_URID_MANAGER_TEST_UNMAP_URI "http://drobilla.net/plugins/mda/EPiano" /* Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_urid_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_urid_manager_test_clean_suite() { return(0); } void ags_lv2_urid_manager_test_insert() { AgsLv2UridManager *urid_manager; GValue value; urid_manager = ags_lv2_urid_manager_get_instance(); /* insert and assert */ ags_lv2_urid_manager_insert(urid_manager, AGS_LV2_URID_MANAGER_TEST_INSERT_URI, &value); CU_ASSERT(g_hash_table_lookup(urid_manager->urid, AGS_LV2_URID_MANAGER_TEST_INSERT_URI) == &value); g_object_unref(urid_manager); } void ags_lv2_urid_manager_test_remove() { AgsLv2UridManager *urid_manager; GValue value; urid_manager = ags_lv2_urid_manager_get_instance(); ags_lv2_urid_manager_insert(urid_manager, AGS_LV2_URID_MANAGER_TEST_REMOVE_URI, &value); /* remove and assert */ ags_lv2_urid_manager_remove(urid_manager, AGS_LV2_URID_MANAGER_TEST_REMOVE_URI); CU_ASSERT(g_hash_table_lookup(urid_manager->urid, AGS_LV2_URID_MANAGER_TEST_REMOVE_URI) == NULL); g_object_unref(urid_manager); } void ags_lv2_urid_manager_test_lookup() { AgsLv2UridManager *urid_manager; GValue value; urid_manager = ags_lv2_urid_manager_get_instance(); /* lookup and assert */ ags_lv2_urid_manager_lookup(urid_manager, AGS_LV2_URID_MANAGER_TEST_LOOKUP_URI); CU_ASSERT(g_hash_table_lookup(urid_manager->urid, AGS_LV2_URID_MANAGER_TEST_LOOKUP_URI) != NULL); g_object_unref(urid_manager); } void ags_lv2_urid_manager_test_map() { AgsLv2UridManager *urid_manager; uint32_t id; GValue value = {0,}; urid_manager = ags_lv2_urid_manager_get_instance(); id = ags_lv2_urid_manager_map(NULL, AGS_LV2_URID_MANAGER_TEST_MAP_URI); g_value_init(&value, G_TYPE_ULONG); g_value_set_ulong(&value, id); CU_ASSERT(g_hash_table_find(urid_manager->urid, ags_lv2_urid_manager_test_map_ghrfunc, &value) != NULL); g_object_unref(urid_manager); } void ags_lv2_urid_manager_test_unmap() { AgsLv2UridManager *urid_manager; uint32_t id; GValue value = {0,}; urid_manager = ags_lv2_urid_manager_get_instance(); id = ags_lv2_urid_manager_map(NULL, AGS_LV2_URID_MANAGER_TEST_UNMAP_URI); g_value_init(&value, G_TYPE_ULONG); g_value_set_ulong(&value, id); ags_lv2_urid_manager_unmap(NULL, id); CU_ASSERT(g_hash_table_lookup(urid_manager->urid, AGS_LV2_URID_MANAGER_TEST_UNMAP_URI) == NULL); g_object_unref(urid_manager); } gboolean ags_lv2_urid_manager_test_map_ghrfunc(gpointer key, gpointer value, gpointer user_data) { if(value != NULL && user_data != NULL && g_value_get_ulong((GValue *) value) == g_value_get_ulong((GValue *) user_data)){ return(TRUE); } return(FALSE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2UridManagerTest", ags_lv2_urid_manager_test_init_suite, ags_lv2_urid_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2UridManager insert", ags_lv2_urid_manager_test_insert) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UridManager remove", ags_lv2_urid_manager_test_remove) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UridManager lookup", ags_lv2_urid_manager_test_lookup) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UridManager map", ags_lv2_urid_manager_test_map) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UridManager unmap", ags_lv2_urid_manager_test_unmap) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_dssi_plugin_test.c0000644000175000017500000000617613605312646020224 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_dssi_plugin_test_init_suite(); int ags_dssi_plugin_test_clean_suite(); void ags_dssi_plugin_test_change_program(); void ags_dssi_plugin_test_stub_change_program(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index); gboolean stub_change_program = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_dssi_plugin_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_dssi_plugin_test_clean_suite() { return(0); } void ags_dssi_plugin_test_change_program() { AgsDssiPlugin *dssi_plugin; gpointer ptr; dssi_plugin = g_object_new(AGS_TYPE_DSSI_PLUGIN, NULL); ptr = AGS_DSSI_PLUGIN_GET_CLASS(dssi_plugin)->change_program; AGS_DSSI_PLUGIN_GET_CLASS(dssi_plugin)->change_program = ags_dssi_plugin_test_stub_change_program; /* assert change program */ ags_dssi_plugin_change_program(dssi_plugin, NULL, 0, 0); CU_ASSERT(stub_change_program == TRUE); AGS_DSSI_PLUGIN_GET_CLASS(dssi_plugin)->change_program = ptr; } void ags_dssi_plugin_test_stub_change_program(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index) { stub_change_program = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsDssiPluginTest", ags_dssi_plugin_test_init_suite, ags_dssi_plugin_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsDssiPlugin change program", ags_dssi_plugin_test_change_program) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_worker_manager_test.c0000644000175000017500000000630613614062654021466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_lv2_worker_manager_test_init_suite(); int ags_lv2_worker_manager_test_clean_suite(); void ags_lv2_worker_manager_test_pull_worker(); #define AGS_LV2_WORKER_MANAGER_TEST_PULL_WORKER_DELAY (5000000) AgsApplicationContext *application_context; /* Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_worker_manager_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_audio_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_worker_manager_test_clean_suite() { return(0); } void ags_lv2_worker_manager_test_pull_worker() { AgsLv2WorkerManager *lv2_worker_manager; AgsThreadPool *thread_pool; GObject *worker; lv2_worker_manager = ags_lv2_worker_manager_get_instance(); thread_pool = g_object_new(AGS_TYPE_THREAD_POOL, NULL); lv2_worker_manager->thread_pool = thread_pool; ags_thread_pool_start(thread_pool); usleep(AGS_LV2_WORKER_MANAGER_TEST_PULL_WORKER_DELAY); worker = ags_lv2_worker_manager_pull_worker(lv2_worker_manager); CU_ASSERT(AGS_IS_LV2_WORKER(worker) == TRUE); g_object_unref(lv2_worker_manager); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2WorkerManagerTest", ags_lv2_worker_manager_test_init_suite, ags_lv2_worker_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2WorkerManager pull worker", ags_lv2_worker_manager_test_pull_worker) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_uri_map_manager_test.c0000644000175000017500000001312213605312646021602 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2_uri_map_manager_test_init_suite(); int ags_lv2_uri_map_manager_test_clean_suite(); void ags_lv2_uri_map_manager_test_insert(); void ags_lv2_uri_map_manager_test_remove(); void ags_lv2_uri_map_manager_test_lookup(); void ags_lv2_uri_map_manager_test_uri_to_id(); gboolean ags_lv2_uri_map_manager_test_uri_to_id_ghrfunc(gpointer key, gpointer value, gpointer user_data); #define AGS_LV2_URI_MAP_MANAGER_TEST_INSERT_URI "TEST_INSERT" #define AGS_LV2_URI_MAP_MANAGER_TEST_REMOVE_URI "TEST_REMOVE" #define AGS_LV2_URI_MAP_MANAGER_TEST_LOOKUP_URI "TEST_LOOKUP" #define AGS_LV2_URI_MAP_MANAGER_TEST_URI_TO_ID_MAP "TEST_URI_TO_ID" #define AGS_LV2_URI_MAP_MANAGER_TEST_URI_TO_ID_URI "http://drobilla.net/plugins/mda/EPiano" /* Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_uri_map_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_uri_map_manager_test_clean_suite() { return(0); } void ags_lv2_uri_map_manager_test_insert() { AgsLv2UriMapManager *uri_map_manager; GValue value; uri_map_manager = ags_lv2_uri_map_manager_get_instance(); /* insert and assert */ ags_lv2_uri_map_manager_insert(uri_map_manager, AGS_LV2_URI_MAP_MANAGER_TEST_INSERT_URI, &value); CU_ASSERT(g_hash_table_lookup(uri_map_manager->uri_map, AGS_LV2_URI_MAP_MANAGER_TEST_INSERT_URI) == &value); g_object_unref(uri_map_manager); } void ags_lv2_uri_map_manager_test_remove() { AgsLv2UriMapManager *uri_map_manager; GValue value; uri_map_manager = ags_lv2_uri_map_manager_get_instance(); ags_lv2_uri_map_manager_insert(uri_map_manager, AGS_LV2_URI_MAP_MANAGER_TEST_REMOVE_URI, &value); /* remove and assert */ ags_lv2_uri_map_manager_remove(uri_map_manager, AGS_LV2_URI_MAP_MANAGER_TEST_REMOVE_URI); CU_ASSERT(g_hash_table_lookup(uri_map_manager->uri_map, AGS_LV2_URI_MAP_MANAGER_TEST_REMOVE_URI) == NULL); g_object_unref(uri_map_manager); } void ags_lv2_uri_map_manager_test_lookup() { AgsLv2UriMapManager *uri_map_manager; GValue value; uri_map_manager = ags_lv2_uri_map_manager_get_instance(); /* lookup and assert */ ags_lv2_uri_map_manager_lookup(uri_map_manager, AGS_LV2_URI_MAP_MANAGER_TEST_LOOKUP_URI); CU_ASSERT(g_hash_table_lookup(uri_map_manager->uri_map, AGS_LV2_URI_MAP_MANAGER_TEST_LOOKUP_URI) != NULL); g_object_unref(uri_map_manager); } void ags_lv2_uri_map_manager_test_uri_to_id() { AgsLv2UriMapManager *uri_map_manager; uint32_t id; GValue value = {0,}; uri_map_manager = ags_lv2_uri_map_manager_get_instance(); id = ags_lv2_uri_map_manager_uri_to_id(NULL, AGS_LV2_URI_MAP_MANAGER_TEST_URI_TO_ID_MAP, AGS_LV2_URI_MAP_MANAGER_TEST_URI_TO_ID_URI); g_value_init(&value, G_TYPE_ULONG); g_value_set_ulong(&value, id); CU_ASSERT(g_hash_table_find(uri_map_manager->uri_map, ags_lv2_uri_map_manager_test_uri_to_id_ghrfunc, &value) != NULL); g_object_unref(uri_map_manager); } gboolean ags_lv2_uri_map_manager_test_uri_to_id_ghrfunc(gpointer key, gpointer value, gpointer user_data) { if(value != NULL && user_data != NULL && g_value_get_ulong((GValue *) value) == g_value_get_ulong((GValue *) user_data)){ return(TRUE); } return(FALSE); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2UriMapManagerTest", ags_lv2_uri_map_manager_test_init_suite, ags_lv2_uri_map_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2UriMapManager insert", ags_lv2_uri_map_manager_test_insert) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UriMapManager remove", ags_lv2_uri_map_manager_test_remove) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UriMapManager lookup", ags_lv2_uri_map_manager_test_lookup) == NULL) || (CU_add_test(pSuite, "test of AgsLv2UriMapManager uri to id", ags_lv2_uri_map_manager_test_uri_to_id) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_manager_test.c0000644000175000017500000001767413605312646020106 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2_manager_test_init_suite(); int ags_lv2_manager_test_clean_suite(); void ags_lv2_manager_test_get_filenames(); void ags_lv2_manager_test_find_lv2_plugin(); void ags_lv2_manager_test_load_blacklist(); void ags_lv2_manager_test_load_preset(); void ags_lv2_manager_test_load_file(); void ags_lv2_manager_test_load_default_directory(); #define AGS_LV2_MANAGER_TEST_GET_FILENAMES_DELAY_SWH "plugin.so" #define AGS_LV2_MANAGER_TEST_GET_FILENAMES_ZYNADD "zynadd.so" #define AGS_LV2_MANAGER_TEST_GET_FILENAMES_HERMES_FILTER "plugin-linux.so" #define AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA "plugin.so" #define AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA_EFFECT "mono compressor" #define AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42 "x42.so" #define AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42_EFFECT "balance" gchar **ags_lv2_default_path; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_manager_test_clean_suite() { return(0); } void ags_lv2_manager_test_get_filenames() { AgsLv2Manager *lv2_manager; AgsLv2Plugin *lv2_plugin; GList *list; gchar **filename; lv2_manager = ags_lv2_manager_get_instance(); /* assert get NULL */ filename = ags_lv2_manager_get_filenames(lv2_manager); CU_ASSERT(filename == NULL); /* create some lv2 plugins */ list = NULL; lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "filename", AGS_LV2_MANAGER_TEST_GET_FILENAMES_DELAY_SWH, NULL); list = g_list_prepend(list, lv2_plugin); lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "filename", AGS_LV2_MANAGER_TEST_GET_FILENAMES_ZYNADD, NULL); list = g_list_prepend(list, lv2_plugin); lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "filename", AGS_LV2_MANAGER_TEST_GET_FILENAMES_HERMES_FILTER, NULL); list = g_list_prepend(list, lv2_plugin); /* add plugins to manager */ lv2_manager->lv2_plugin = list; /* assert get filenames */ filename = ags_lv2_manager_get_filenames(lv2_manager); CU_ASSERT(g_strv_contains(filename, AGS_LV2_MANAGER_TEST_GET_FILENAMES_DELAY_SWH)); CU_ASSERT(g_strv_contains(filename, AGS_LV2_MANAGER_TEST_GET_FILENAMES_ZYNADD)); CU_ASSERT(g_strv_contains(filename, AGS_LV2_MANAGER_TEST_GET_FILENAMES_HERMES_FILTER)); CU_ASSERT(filename[3] == NULL); g_object_unref(lv2_manager); } void ags_lv2_manager_test_find_lv2_plugin() { AgsLv2Manager *lv2_manager; AgsLv2Plugin *lv2_plugin; GList *list; lv2_manager = ags_lv2_manager_get_instance(); CU_ASSERT(ags_lv2_manager_find_lv2_plugin(lv2_manager, NULL, NULL) == NULL); /* create some lv2 plugins */ list = NULL; lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "filename", AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA, "effect", AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA_EFFECT, NULL); list = g_list_prepend(list, lv2_plugin); lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "filename", AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42, "effect", AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42_EFFECT, NULL); list = g_list_prepend(list, lv2_plugin); /* add plugins to manager */ lv2_manager->lv2_plugin = list; /* assert find lv2 plugin */ CU_ASSERT((lv2_plugin = ags_lv2_manager_find_lv2_plugin(lv2_manager, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2_plugin)->filename, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA) && !g_strcmp0(AGS_BASE_PLUGIN(lv2_plugin)->effect, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_INVADA_EFFECT)); CU_ASSERT((lv2_plugin = ags_lv2_manager_find_lv2_plugin(lv2_manager, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42_EFFECT)) != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2_plugin)->filename, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42) && !g_strcmp0(AGS_BASE_PLUGIN(lv2_plugin)->effect, AGS_LV2_MANAGER_TEST_FIND_LV2_PLUGIN_X42_EFFECT)); g_object_unref(lv2_manager); } void ags_lv2_manager_test_load_blacklist() { AgsLv2Manager *lv2_manager; lv2_manager = ags_lv2_manager_get_instance(); /* test NULL */ ags_lv2_manager_load_blacklist(lv2_manager, NULL); CU_ASSERT(lv2_manager->lv2_plugin_blacklist == NULL); //TODO:JK: implement better test g_object_unref(lv2_manager); } void ags_lv2_manager_test_load_preset() { AgsLv2Manager *lv2_manager; lv2_manager = ags_lv2_manager_get_instance(); //TODO:JK: implement better test g_object_unref(lv2_manager); } void ags_lv2_manager_test_load_file() { AgsLv2Manager *lv2_manager; lv2_manager = ags_lv2_manager_get_instance(); /* test NULL */ ags_lv2_manager_load_file(lv2_manager, NULL, NULL, NULL, NULL); CU_ASSERT(lv2_manager->lv2_plugin == NULL); //TODO:JK: implement better test g_object_unref(lv2_manager); } void ags_lv2_manager_test_load_default_directory() { AgsLv2Manager *lv2_manager; gchar *first_path; lv2_manager = ags_lv2_manager_get_instance(); /* test NULL */ ags_lv2_default_path = ags_lv2_manager_get_default_path(); first_path = ags_lv2_default_path[0]; ags_lv2_default_path[0] = NULL; ags_lv2_manager_load_default_directory(lv2_manager); CU_ASSERT(lv2_manager->lv2_plugin == NULL); //TODO:JK: implement better test ags_lv2_default_path[0] = first_path; g_object_unref(lv2_manager); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2ManagerTest\0", ags_lv2_manager_test_init_suite, ags_lv2_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2Manager get filenames\0", ags_lv2_manager_test_get_filenames) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Manager find lv2 plugin\0", ags_lv2_manager_test_find_lv2_plugin) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Manager load blacklist\0", ags_lv2_manager_test_load_blacklist) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Manager load file\0", ags_lv2_manager_test_load_file) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Manager load preset\0", ags_lv2_manager_test_load_preset) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Manager load default directory\0", ags_lv2_manager_test_load_default_directory) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_plugin_test.c0000644000175000017500000004644313607210263017760 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_lv2_plugin_test_init_suite(); int ags_lv2_plugin_test_clean_suite(); void ags_lv2_plugin_test_event_buffer_concat(); void ags_lv2_plugin_test_event_buffer_append_midi(); void ags_lv2_plugin_test_event_buffer_remove_midi(); void ags_lv2_plugin_test_clear_event_buffer(); void ags_lv2_plugin_test_concat_atom_sequence(); void ags_lv2_plugin_test_atom_sequence_append_midi(); void ags_lv2_plugin_test_atom_sequence_remove_midi(); void ags_lv2_plugin_test_clear_atom_sequence(); void ags_lv2_plugin_test_find_pname(); void ags_lv2_plugin_test_change_program(); void ags_lv2_plugin_test_stub_change_program(AgsLv2Plugin *lv2_plugin, gpointer lv2_handle, guint bank_index, guint program_index); #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_CONCAT_LENGTH_0 (1024 * sizeof(char)) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_CONCAT_LENGTH_1 (2048 * sizeof(char)) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_CONCAT_LENGTH_2 (512 * sizeof(char)) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_0 (32) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_1 (48) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_2 (64) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_SIZE (1024) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_0 (32) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_1 (48) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_2 (64) #define AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_SIZE (1024) #define AGS_LV2_PLUGIN_TEST_CLEAR_EVENT_BUFFER_NOTE_0 (17) #define AGS_LV2_PLUGIN_TEST_CLEAR_EVENT_BUFFER_SIZE (1024) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_0 (32) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_1 (48) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_2 (64) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_SIZE (1024) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_0 (32) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_1 (48) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_2 (64) #define AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_SIZE (1024) #define AGS_LV2_PLUGIN_TEST_CLEAR_ATOM_SEQUENCE_NOTE_0 (17) #define AGS_LV2_PLUGIN_TEST_CLEAR_ATOM_SEQUENCE_SIZE (1024) #define AGS_LV2_PLUGIN_TEST_FIND_PNAME_SWH "swh" #define AGS_LV2_PLUGIN_TEST_FIND_PNAME_INVADA "invada" #define AGS_LV2_PLUGIN_TEST_FIND_PNAME_ZYN "zyn" AgsLv2UriMapManager *uri_map_manager; AgsLv2UridManager *urid_manager; gboolean stub_change_program = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_plugin_test_init_suite() { uri_map_manager = ags_lv2_uri_map_manager_get_instance(); urid_manager = ags_lv2_urid_manager_get_instance(); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_plugin_test_clean_suite() { return(0); } void ags_lv2_plugin_test_event_buffer_concat() { LV2_Event_Buffer *event_buffer[3]; guint length[3]; void *ptr; length[0] = AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_CONCAT_LENGTH_0; length[1] = AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_CONCAT_LENGTH_1; length[2] = AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_CONCAT_LENGTH_2; event_buffer[0] = ags_lv2_plugin_event_buffer_alloc(length[0]); event_buffer[1] = ags_lv2_plugin_event_buffer_alloc(length[1]); event_buffer[2] = ags_lv2_plugin_event_buffer_alloc(length[2]); ptr = ags_lv2_plugin_event_buffer_concat(event_buffer[0], event_buffer[1], event_buffer[2], NULL); CU_ASSERT(AGS_LV2_EVENT_BUFFER(ptr)->capacity == length[0]); ptr += sizeof(LV2_Event_Buffer); CU_ASSERT(AGS_LV2_EVENT_BUFFER(ptr)->capacity == length[1]); ptr += sizeof(LV2_Event_Buffer); CU_ASSERT(AGS_LV2_EVENT_BUFFER(ptr)->capacity == length[2]); } void ags_lv2_plugin_test_event_buffer_append_midi() { LV2_Event_Buffer *event_buffer; snd_seq_event_t seq_event[3]; void *offset; uint32_t id; id = ags_lv2_uri_map_manager_uri_to_id(NULL, LV2_EVENT_URI, LV2_MIDI__MidiEvent); memset(&seq_event, 0, 3 * sizeof(snd_seq_event_t)); /* note #0 */ seq_event[0].type = SND_SEQ_EVENT_NOTEON; seq_event[0].data.note.channel = 0; seq_event[0].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_0; seq_event[0].data.note.velocity = 127; /* note #1 */ seq_event[1].type = SND_SEQ_EVENT_NOTEON; seq_event[1].data.note.channel = 0; seq_event[1].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_1; seq_event[1].data.note.velocity = 127; /* note #2 */ seq_event[2].type = SND_SEQ_EVENT_NOTEON; seq_event[2].data.note.channel = 0; seq_event[2].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_2; seq_event[2].data.note.velocity = 127; /* event buffer */ event_buffer = ags_lv2_plugin_event_buffer_alloc(AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_SIZE); offset = event_buffer->data; /* append midi and assert */ ags_lv2_plugin_event_buffer_append_midi(event_buffer, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_SIZE, &seq_event, 3); CU_ASSERT(AGS_LV2_EVENT(offset)->type == id && ((uint8_t *) (offset + sizeof(LV2_Event)))[1] == AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_0); offset += (sizeof(LV2_Event) + 8); CU_ASSERT(AGS_LV2_EVENT(offset)->type == id && ((uint8_t *) (offset + sizeof(LV2_Event)))[1] == AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_1); offset += (sizeof(LV2_Event) + 8); CU_ASSERT(AGS_LV2_EVENT(offset)->type == id && ((uint8_t *) (offset + sizeof(LV2_Event)))[1] == AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_APPEND_MIDI_NOTE_2); } void ags_lv2_plugin_test_event_buffer_remove_midi() { LV2_Event_Buffer *event_buffer; snd_seq_event_t seq_event[3]; void *offset; uint32_t id; id = ags_lv2_uri_map_manager_uri_to_id(NULL, LV2_EVENT_URI, LV2_MIDI__MidiEvent); memset(&seq_event, 0, 3 * sizeof(snd_seq_event_t)); /* note #0 */ seq_event[0].type = SND_SEQ_EVENT_NOTEON; seq_event[0].data.note.channel = 0; seq_event[0].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_0; seq_event[0].data.note.velocity = 127; /* note #1 */ seq_event[1].type = SND_SEQ_EVENT_NOTEON; seq_event[1].data.note.channel = 0; seq_event[1].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_1; seq_event[1].data.note.velocity = 127; /* note #2 */ seq_event[2].type = SND_SEQ_EVENT_NOTEON; seq_event[2].data.note.channel = 0; seq_event[2].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_2; seq_event[2].data.note.velocity = 127; /* event buffer and append midi */ event_buffer = ags_lv2_plugin_event_buffer_alloc(AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_SIZE); ags_lv2_plugin_event_buffer_append_midi(event_buffer, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_SIZE, &seq_event, 3); /* remove midi and assert */ ags_lv2_plugin_event_buffer_remove_midi(event_buffer, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_SIZE, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_1); offset = event_buffer->data; CU_ASSERT(AGS_LV2_EVENT(offset)->type == id && ((uint8_t *) (offset + sizeof(LV2_Event)))[1] == AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_0); offset += (sizeof(LV2_Event) + 8); CU_ASSERT(AGS_LV2_EVENT(offset)->type == id && ((uint8_t *) (offset + sizeof(LV2_Event)))[1] == AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_2); ags_lv2_plugin_event_buffer_remove_midi(event_buffer, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_SIZE, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_2); offset = event_buffer->data; CU_ASSERT(AGS_LV2_EVENT(offset)->type == id && ((uint8_t *) (offset + sizeof(LV2_Event)))[1] == AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_0); offset += (sizeof(LV2_Event) + 8); CU_ASSERT(((uint8_t *) (offset + sizeof(LV2_Event)))[1] == 0); ags_lv2_plugin_event_buffer_remove_midi(event_buffer, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_SIZE, AGS_LV2_PLUGIN_TEST_EVENT_BUFFER_REMOVE_MIDI_NOTE_0); offset = event_buffer->data; CU_ASSERT(((uint8_t *) (offset + sizeof(LV2_Event)))[1] == 0); } void ags_lv2_plugin_test_clear_event_buffer() { LV2_Event_Buffer *event_buffer; snd_seq_event_t seq_event[1]; void *offset; memset(&seq_event, 0, sizeof(snd_seq_event_t)); /* note #0 */ seq_event[0].type = SND_SEQ_EVENT_NOTEON; seq_event[0].data.note.channel = 0; seq_event[0].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_CLEAR_EVENT_BUFFER_NOTE_0; seq_event[0].data.note.velocity = 127; /* event buffer and append midi */ event_buffer = ags_lv2_plugin_event_buffer_alloc(AGS_LV2_PLUGIN_TEST_CLEAR_EVENT_BUFFER_SIZE); ags_lv2_plugin_event_buffer_append_midi(event_buffer, AGS_LV2_PLUGIN_TEST_CLEAR_EVENT_BUFFER_SIZE, &seq_event, 1); /* clear and assert */ ags_lv2_plugin_clear_event_buffer(event_buffer, AGS_LV2_PLUGIN_TEST_CLEAR_EVENT_BUFFER_SIZE); offset = event_buffer->data; CU_ASSERT(((uint8_t *) (offset + sizeof(LV2_Event)))[1] == 0); } void ags_lv2_plugin_test_concat_atom_sequence() { //TODO:JK: not implemented } void ags_lv2_plugin_test_atom_sequence_append_midi() { LV2_Atom_Sequence *aseq; LV2_Atom_Event *aev; snd_seq_event_t seq_event[3]; uint32_t id; id = ags_lv2_urid_manager_map(NULL, LV2_MIDI__MidiEvent); memset(&seq_event, 0, 3 * sizeof(snd_seq_event_t)); /* note #0 */ seq_event[0].type = SND_SEQ_EVENT_NOTEON; seq_event[0].data.note.channel = 0; seq_event[0].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_0; seq_event[0].data.note.velocity = 127; /* note #1 */ seq_event[1].type = SND_SEQ_EVENT_NOTEON; seq_event[1].data.note.channel = 0; seq_event[1].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_1; seq_event[1].data.note.velocity = 127; /* note #2 */ seq_event[2].type = SND_SEQ_EVENT_NOTEON; seq_event[2].data.note.channel = 0; seq_event[2].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_2; seq_event[2].data.note.velocity = 127; /* atom sequence */ aseq = ags_lv2_plugin_alloc_atom_sequence(AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_SIZE); aev = (LV2_Atom_Event *) ((char *) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); /* append midi and assert */ ags_lv2_plugin_atom_sequence_append_midi(aseq, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_SIZE, &seq_event, 3); CU_ASSERT(aev->body.type == id && ((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_0); aev += ((3 + 7) & (~7)); CU_ASSERT(aev->body.type == id && ((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_1); aev += ((3 + 7) & (~7)); CU_ASSERT(aev->body.type == id && ((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_APPEND_MIDI_NOTE_2); } void ags_lv2_plugin_test_atom_sequence_remove_midi() { LV2_Atom_Sequence *aseq; LV2_Atom_Event *aev; snd_seq_event_t seq_event[3]; uint32_t id; id = ags_lv2_urid_manager_map(NULL, LV2_MIDI__MidiEvent); memset(&seq_event, 0, 3 * sizeof(snd_seq_event_t)); /* note #0 */ seq_event[0].type = SND_SEQ_EVENT_NOTEON; seq_event[0].data.note.channel = 0; seq_event[0].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_0; seq_event[0].data.note.velocity = 127; /* note #1 */ seq_event[1].type = SND_SEQ_EVENT_NOTEON; seq_event[1].data.note.channel = 0; seq_event[1].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_1; seq_event[1].data.note.velocity = 127; /* note #2 */ seq_event[2].type = SND_SEQ_EVENT_NOTEON; seq_event[2].data.note.channel = 0; seq_event[2].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_2; seq_event[2].data.note.velocity = 127; /* atom sequence */ aseq = ags_lv2_plugin_alloc_atom_sequence(AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_SIZE); ags_lv2_plugin_atom_sequence_append_midi(aseq, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_SIZE, &seq_event, 3); /* remove midi and assert */ ags_lv2_plugin_atom_sequence_remove_midi(aseq, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_SIZE, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_1); aev = (LV2_Atom_Event *) ((char *) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); CU_ASSERT(aev->body.type == id && ((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_0); aev += ((3 + 7) & (~7)); CU_ASSERT(aev->body.type == id && ((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_2); ags_lv2_plugin_atom_sequence_remove_midi(aseq, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_SIZE, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_2); aev = (LV2_Atom_Event *) ((char *) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); CU_ASSERT(aev->body.type == id && ((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_0); aev += ((3 + 7) & (~7)); CU_ASSERT(((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == 0); ags_lv2_plugin_atom_sequence_remove_midi(aseq, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_SIZE, AGS_LV2_PLUGIN_TEST_ATOM_SEQUENCE_REMOVE_MIDI_NOTE_0); aev = (LV2_Atom_Event *) ((char *) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); CU_ASSERT(((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == 0); } void ags_lv2_plugin_test_clear_atom_sequence() { LV2_Atom_Sequence *aseq; LV2_Atom_Event *aev; snd_seq_event_t seq_event[1]; uint32_t id; id = ags_lv2_urid_manager_map(NULL, LV2_MIDI__MidiEvent); memset(&seq_event, 0, sizeof(snd_seq_event_t)); /* note #0 */ seq_event[0].type = SND_SEQ_EVENT_NOTEON; seq_event[0].data.note.channel = 0; seq_event[0].data.note.note = 0x7f & AGS_LV2_PLUGIN_TEST_CLEAR_ATOM_SEQUENCE_NOTE_0; seq_event[0].data.note.velocity = 127; /* atom sequence */ aseq = ags_lv2_plugin_alloc_atom_sequence(AGS_LV2_PLUGIN_TEST_CLEAR_ATOM_SEQUENCE_SIZE); ags_lv2_plugin_atom_sequence_append_midi(aseq, AGS_LV2_PLUGIN_TEST_CLEAR_ATOM_SEQUENCE_SIZE, &seq_event, 1); /* clear and assert */ ags_lv2_plugin_clear_atom_sequence(aseq, AGS_LV2_PLUGIN_TEST_CLEAR_ATOM_SEQUENCE_SIZE); aev = (LV2_Atom_Event *) ((char *) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); CU_ASSERT(((uint8_t *) (LV2_ATOM_BODY(&(aev->body))))[1] == 0); } void ags_lv2_plugin_test_find_pname() { AgsLv2Plugin *lv2_plugin[3]; GList *list, *current; list = NULL; lv2_plugin[0] = (AgsLv2Plugin *) g_object_new(AGS_TYPE_LV2_PLUGIN, "pname", AGS_LV2_PLUGIN_TEST_FIND_PNAME_SWH, NULL); list = g_list_prepend(list, lv2_plugin[0]); lv2_plugin[1] = (AgsLv2Plugin *) g_object_new(AGS_TYPE_LV2_PLUGIN, "pname", AGS_LV2_PLUGIN_TEST_FIND_PNAME_INVADA, NULL); list = g_list_prepend(list, lv2_plugin[1]); lv2_plugin[2] = (AgsLv2Plugin *) g_object_new(AGS_TYPE_LV2_PLUGIN, "pname", AGS_LV2_PLUGIN_TEST_FIND_PNAME_ZYN, NULL); list = g_list_prepend(list, lv2_plugin[2]); /* assert */ CU_ASSERT((current = ags_lv2_plugin_find_pname(list, AGS_LV2_PLUGIN_TEST_FIND_PNAME_SWH)) != NULL && current->data == lv2_plugin[0]); CU_ASSERT((current = ags_lv2_plugin_find_pname(list, AGS_LV2_PLUGIN_TEST_FIND_PNAME_INVADA)) != NULL && current->data == lv2_plugin[1]); CU_ASSERT((current = ags_lv2_plugin_find_pname(list, AGS_LV2_PLUGIN_TEST_FIND_PNAME_ZYN)) != NULL && current->data == lv2_plugin[2]); } void ags_lv2_plugin_test_change_program() { AgsLv2Plugin *lv2_plugin; gpointer ptr; lv2_plugin = (AgsLv2Plugin *) g_object_new(AGS_TYPE_LV2_PLUGIN, NULL); /* stub */ ptr = AGS_LV2_PLUGIN_GET_CLASS(lv2_plugin)->change_program; AGS_LV2_PLUGIN_GET_CLASS(lv2_plugin)->change_program = ags_lv2_plugin_test_stub_change_program; /* assert */ ags_lv2_plugin_change_program(lv2_plugin, NULL, 0, 0); CU_ASSERT(stub_change_program == TRUE); /* reset */ AGS_LV2_PLUGIN_GET_CLASS(lv2_plugin)->change_program = ptr; } void ags_lv2_plugin_test_stub_change_program(AgsLv2Plugin *lv2_plugin, gpointer lv2_handle, guint bank_index, guint program_index) { stub_change_program = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2PluginTest", ags_lv2_plugin_test_init_suite, ags_lv2_plugin_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2Plugin event buffer concat", ags_lv2_plugin_test_event_buffer_concat) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin event buffer append midi", ags_lv2_plugin_test_event_buffer_append_midi) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin event buffer remove midi", ags_lv2_plugin_test_event_buffer_remove_midi) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin clear event buffer", ags_lv2_plugin_test_clear_event_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin concat atom sequence", ags_lv2_plugin_test_concat_atom_sequence) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin atom sequence append midi", ags_lv2_plugin_test_atom_sequence_append_midi) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin atom sequence remove midi", ags_lv2_plugin_test_atom_sequence_remove_midi) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin clear atom sequence", ags_lv2_plugin_test_clear_atom_sequence) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin find pname", ags_lv2_plugin_test_find_pname) == NULL) || (CU_add_test(pSuite, "test of AgsLv2Plugin change program", ags_lv2_plugin_test_change_program) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/plugin/ags_lv2_option_manager_test.c0000644000175000017500000003057513605312646021471 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include int ags_lv2_option_manager_test_init_suite(); int ags_lv2_option_manager_test_clean_suite(); void ags_lv2_option_manager_test_ressource_insert(); void ags_lv2_option_manager_test_ressource_remove(); void ags_lv2_option_manager_test_ressource_lookup(); void ags_lv2_option_manager_test_get_option(); void ags_lv2_option_manager_test_set_option(); void ags_lv2_option_manager_test_lv2_options_get(); void ags_lv2_option_manager_test_lv2_options_set(); void ags_lv2_option_manager_test_stub_get_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval); void ags_lv2_option_manager_test_stub_set_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval); #define AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_PLUGIN_FILENAME "/usr/lib/lv2/delay-swh.lv2/plugin-linux.so" #define AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_PLUGIN_EFFECT "Simple delay line, noninterpolating" #define AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SAMPLERATE (44100) #define AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_BUFFER_SIZE (512) #define AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SUBJECT (3) #define AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SIZE (4) #define AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT (3) #define AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_SET_SUBJECT (3) AgsLv2Manager *lv2_manager; AgsLv2UridManager *lv2_urid_manager; guint stub_get_option = 0; guint stub_set_option = 0; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_option_manager_test_init_suite() { lv2_manager = ags_lv2_manager_get_instance(); ags_lv2_manager_load_default_directory(lv2_manager); lv2_urid_manager = ags_lv2_urid_manager_get_instance(); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_lv2_option_manager_test_clean_suite() { return(0); } void ags_lv2_option_manager_test_ressource_insert() { AgsLv2OptionManager *lv2_option_manager; AgsLv2OptionRessource *lv2_option_ressource; GValue value = {0,}; g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, 0); lv2_option_manager = ags_lv2_option_manager_get_instance(); lv2_option_ressource = ags_lv2_option_ressource_alloc(); ags_lv2_option_manager_ressource_insert(lv2_option_manager, lv2_option_ressource, &value); CU_ASSERT(g_hash_table_lookup(lv2_option_manager->ressource, lv2_option_ressource) == &value); g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_ressource_remove() { AgsLv2OptionManager *lv2_option_manager; AgsLv2OptionRessource *lv2_option_ressource; GValue value = {0,}; g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, 0); lv2_option_manager = ags_lv2_option_manager_get_instance(); lv2_option_ressource = ags_lv2_option_ressource_alloc(); ags_lv2_option_manager_ressource_insert(lv2_option_manager, lv2_option_ressource, &value); ags_lv2_option_manager_ressource_remove(lv2_option_manager, lv2_option_ressource); CU_ASSERT(g_hash_table_lookup(lv2_option_manager->ressource, lv2_option_ressource) == NULL); g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_ressource_lookup() { AgsLv2OptionManager *lv2_option_manager; AgsLv2OptionRessource *lv2_option_ressource; GValue value = {0,}; g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, 0); lv2_option_manager = ags_lv2_option_manager_get_instance(); lv2_option_ressource = ags_lv2_option_ressource_alloc(); ags_lv2_option_manager_ressource_insert(lv2_option_manager, lv2_option_ressource, &value); CU_ASSERT(ags_lv2_option_manager_ressource_lookup(lv2_option_manager, lv2_option_ressource) == &value); g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_get_option() { AgsLv2OptionManager *lv2_option_manager; AgsLv2OptionRessource *lv2_option_ressource; AgsLv2Plugin *lv2_plugin; LV2_Handle instance; LV2_Options_Option *option, *current; uint32_t retval; GValue value = {0,}; g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, 0); lv2_option_manager = ags_lv2_option_manager_get_instance(); /* creat plugin instance */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(lv2_manager, AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_PLUGIN_FILENAME, AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_PLUGIN_EFFECT); instance = ags_base_plugin_instantiate(AGS_BASE_PLUGIN(lv2_plugin), AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SAMPLERATE, AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_BUFFER_SIZE); lv2_option_ressource = ags_lv2_option_ressource_alloc(); lv2_option_ressource->instance = instance; option = lv2_option_ressource->option; option->context = LV2_OPTIONS_RESOURCE; option->subject = AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SUBJECT; option->key = ags_lv2_urid_manager_map(NULL, LV2_MIDI_URI); option->type = ags_lv2_urid_manager_map(NULL, LV2_ATOM_URI); option->size = AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SIZE; option->value = &value; ags_lv2_option_manager_ressource_insert(lv2_option_manager, lv2_option_ressource, &value); /* assert */ current = (LV2_Options_Option *) malloc(sizeof(LV2_Options_Option)); current->context = LV2_OPTIONS_RESOURCE; current->subject = option->subject; current->key = option->key; ags_lv2_option_manager_get_option(lv2_option_manager, (gpointer) instance, (gpointer) current, (gpointer) &retval); CU_ASSERT(retval == 0 && current->type == option->type && current->size == option->size && current->value == option->value); g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_set_option() { AgsLv2OptionManager *lv2_option_manager; AgsLv2OptionRessource *lv2_option_ressource; AgsLv2Plugin *lv2_plugin; LV2_Handle instance; LV2_Options_Option *option; uint32_t retval; GValue value = {0,}; g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, 0); lv2_option_manager = ags_lv2_option_manager_get_instance(); /* creat plugin instance */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(lv2_manager, AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_PLUGIN_FILENAME, AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_PLUGIN_EFFECT); instance = ags_base_plugin_instantiate(AGS_BASE_PLUGIN(lv2_plugin), AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SAMPLERATE, AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_BUFFER_SIZE); option = (LV2_Options_Option *) malloc(sizeof(LV2_Options_Option)); option->context = LV2_OPTIONS_RESOURCE; option->subject = AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SUBJECT; option->key = ags_lv2_urid_manager_map(NULL, LV2_MIDI_URI); option->type = ags_lv2_urid_manager_map(NULL, LV2_ATOM_URI); option->size = AGS_LV2_OPTION_MANAGER_TEST_GET_OPTION_SIZE; option->value = &value; /* assert */ ags_lv2_option_manager_set_option(lv2_option_manager, (gpointer) instance, (gpointer) option, (gpointer) &retval); lv2_option_ressource = ags_lv2_option_ressource_alloc(); lv2_option_ressource->instance = instance; lv2_option_ressource->option = option; CU_ASSERT(retval == 0 && ags_lv2_option_manager_ressource_lookup(lv2_option_manager, lv2_option_ressource) == &value); g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_lv2_options_get() { AgsLv2OptionManager *lv2_option_manager; LV2_Options_Option options[4]; gpointer ptr; lv2_option_manager = ags_lv2_option_manager_get_instance(); ptr = AGS_LV2_OPTION_MANAGER_GET_CLASS(lv2_option_manager)->get_option; AGS_LV2_OPTION_MANAGER_GET_CLASS(lv2_option_manager)->get_option = ags_lv2_option_manager_test_stub_get_option; options[0].subject = AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT; options[1].subject = AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT; options[2].subject = AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT; options[3].subject = 0; options[3].key = 0; options[3].type = 0; options[3].size = 0; options[3].value = NULL; ags_lv2_option_manager_lv2_options_get(NULL, &options); CU_ASSERT(stub_get_option == 3); AGS_LV2_OPTION_MANAGER_GET_CLASS(lv2_option_manager)->get_option = ptr; g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_stub_get_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval) { stub_get_option++; } void ags_lv2_option_manager_test_lv2_options_set() { AgsLv2OptionManager *lv2_option_manager; LV2_Options_Option options[4]; gpointer ptr; lv2_option_manager = ags_lv2_option_manager_get_instance(); ptr = AGS_LV2_OPTION_MANAGER_GET_CLASS(lv2_option_manager)->set_option; AGS_LV2_OPTION_MANAGER_GET_CLASS(lv2_option_manager)->set_option = ags_lv2_option_manager_test_stub_set_option; options[0].subject = AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT; options[1].subject = AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT; options[2].subject = AGS_LV2_OPTION_MANAGER_TEST_LV2_OPTIONS_GET_SUBJECT; options[3].subject = 0; options[3].key = 0; options[3].type = 0; options[3].size = 0; options[3].value = NULL; ags_lv2_option_manager_lv2_options_set(NULL, &options); CU_ASSERT(stub_set_option == 3); AGS_LV2_OPTION_MANAGER_GET_CLASS(lv2_option_manager)->set_option = ptr; g_object_unref(lv2_option_manager); } void ags_lv2_option_manager_test_stub_set_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval) { stub_set_option++; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLv2OptionManagerTest\0", ags_lv2_option_manager_test_init_suite, ags_lv2_option_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLv2OptionManager ressource insert\0", ags_lv2_option_manager_test_ressource_insert) == NULL) || (CU_add_test(pSuite, "test of AgsLv2OptionManager ressource remove\0", ags_lv2_option_manager_test_ressource_remove) == NULL) || (CU_add_test(pSuite, "test of AgsLv2OptionManager ressource lookup\0", ags_lv2_option_manager_test_ressource_lookup) == NULL) || (CU_add_test(pSuite, "test of AgsLv2OptionManager get option\0", ags_lv2_option_manager_test_get_option) == NULL) || (CU_add_test(pSuite, "test of AgsLv2OptionManager set option\0", ags_lv2_option_manager_test_set_option) == NULL) || (CU_add_test(pSuite, "test of AgsLv2OptionManager lv2 options get\0", ags_lv2_option_manager_test_lv2_options_get) == NULL) || (CU_add_test(pSuite, "test of AgsLv2OptionManager lv2 options set\0", ags_lv2_option_manager_test_lv2_options_set) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/thread/0000755000175000017500000000000013622252263013663 500000000000000gsequencer-3.1.3/ags/test/thread/ags_returnable_thread_test.c0000644000175000017500000001141313605312646021335 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_returnable_thread_test_init_suite(); int ags_returnable_thread_test_clean_suite(); void ags_returnable_thread_test_safe_run(); void ags_returnable_thread_test_connect_safe_run(); void ags_returnable_thread_test_disconnect_safe_run(); void ags_returnable_thread_test_stub_safe_run(AgsReturnableThread *returnable_thread); void ags_returnable_thread_test_safe_run_callback(AgsReturnableThread *returnable_thread, gpointer data); gboolean stub_safe_run = FALSE; gboolean safe_run_callback; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_returnable_thread_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_returnable_thread_test_clean_suite() { return(0); } void ags_returnable_thread_test_safe_run() { AgsReturnableThread *returnable_thread; gpointer ptr; returnable_thread = g_object_new(AGS_TYPE_RETURNABLE_THREAD, NULL); /* stub safe-run */ ptr = AGS_RETURNABLE_THREAD_GET_CLASS(returnable_thread)->safe_run; AGS_RETURNABLE_THREAD_GET_CLASS(returnable_thread)->safe_run = ags_returnable_thread_test_stub_safe_run; /* assert safe-run */ ags_returnable_thread_safe_run(returnable_thread); CU_ASSERT(stub_safe_run == TRUE); AGS_RETURNABLE_THREAD_GET_CLASS(returnable_thread)->safe_run = ptr; } void ags_returnable_thread_test_connect_safe_run() { AgsReturnableThread *returnable_thread; returnable_thread = g_object_new(AGS_TYPE_RETURNABLE_THREAD, NULL); /* connect safe run and assert */ ags_returnable_thread_connect_safe_run(returnable_thread, ags_returnable_thread_test_safe_run_callback); CU_ASSERT(returnable_thread->handler > 0); /* safe run and assert */ safe_run_callback = FALSE; ags_returnable_thread_safe_run(returnable_thread); CU_ASSERT(safe_run_callback == TRUE); } void ags_returnable_thread_test_disconnect_safe_run() { AgsReturnableThread *returnable_thread; returnable_thread = g_object_new(AGS_TYPE_RETURNABLE_THREAD, NULL); ags_returnable_thread_connect_safe_run(returnable_thread, ags_returnable_thread_test_safe_run_callback); /* connect safe run and assert */ ags_returnable_thread_disconnect_safe_run(returnable_thread); CU_ASSERT(returnable_thread->handler == 0); /* safe run and assert */ safe_run_callback = FALSE; ags_returnable_thread_safe_run(returnable_thread); CU_ASSERT(safe_run_callback == FALSE); } void ags_returnable_thread_test_stub_safe_run(AgsReturnableThread *returnable_thread) { stub_safe_run = TRUE; } void ags_returnable_thread_test_safe_run_callback(AgsReturnableThread *returnable_thread, gpointer data) { safe_run_callback = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsReturnableThreadTest\0", ags_returnable_thread_test_init_suite, ags_returnable_thread_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsReturnableThread safe run\0", ags_returnable_thread_test_safe_run) == NULL) || (CU_add_test(pSuite, "test of AgsReturnableThread connect safe run\0", ags_returnable_thread_test_connect_safe_run) == NULL) || (CU_add_test(pSuite, "test of AgsReturnableThread disconnect safe run\0", ags_returnable_thread_test_disconnect_safe_run) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/thread/ags_thread_pool_test.c0000644000175000017500000001112613614062654020145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_thread_pool_test_init_suite(); int ags_thread_pool_test_clean_suite(); void ags_thread_pool_test_pull(); void ags_thread_pool_test_start(); void ags_thread_pool_stub_start(AgsThreadPool *thread_pool); #define AGS_THREAD_POOL_TEST_INITIAL_DELAY (50000000) AgsApplicationContext *application_context; AgsThread *main_loop; gboolean stub_start = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_thread_pool_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_thread_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); ags_thread_start(main_loop); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_thread_pool_test_clean_suite() { ags_thread_stop(main_loop); g_object_unref(main_loop); g_object_unref(application_context); return(0); } void ags_thread_pool_test_pull() { AgsThreadPool *thread_pool; AgsThread *parent; AgsReturnableThread *returnable_thread; parent = main_loop; thread_pool = ags_thread_pool_new(parent); ags_concurrency_provider_set_thread_pool(AGS_CONCURRENCY_PROVIDER(application_context), thread_pool); ags_thread_pool_start(thread_pool); usleep(AGS_THREAD_POOL_TEST_INITIAL_DELAY); /* pull and assert */ returnable_thread = ags_thread_pool_pull(thread_pool); CU_ASSERT(AGS_IS_RETURNABLE_THREAD(returnable_thread) && ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_RUNNING)); returnable_thread = ags_thread_pool_pull(thread_pool); CU_ASSERT(AGS_IS_RETURNABLE_THREAD(returnable_thread) && ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_RUNNING)); returnable_thread = ags_thread_pool_pull(thread_pool); CU_ASSERT(AGS_IS_RETURNABLE_THREAD(returnable_thread) && ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_RUNNING)); } void ags_thread_pool_test_start() { AgsThreadPool *thread_pool; gpointer ptr; thread_pool = ags_thread_pool_new(NULL); ptr = AGS_THREAD_POOL_GET_CLASS(thread_pool)->start; /* stub and assert */ AGS_THREAD_POOL_GET_CLASS(thread_pool)->start = ags_thread_pool_stub_start; ags_thread_pool_start(thread_pool); CU_ASSERT(stub_start == TRUE); /* reset */ AGS_THREAD_POOL_GET_CLASS(thread_pool)->start = ptr; } void ags_thread_pool_stub_start(AgsThreadPool *thread_pool) { stub_start = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C\0"); putenv("LANG=C\0"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsThreadPoolTest\0", ags_thread_pool_test_init_suite, ags_thread_pool_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsThreadPool pull\0", ags_thread_pool_test_pull) == NULL) || (CU_add_test(pSuite, "test of AgsThreadPool start\0", ags_thread_pool_test_start) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/thread/ags_thread_test.c0000644000175000017500000002531313614062654017117 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_thread_test_init_suite(); int ags_thread_test_clean_suite(); void ags_thread_test_lock(); void ags_thread_test_trylock(); void ags_thread_test_get_toplevel(); void ags_thread_test_first(); void ags_thread_test_last(); void ags_thread_test_remove_child(); void ags_thread_test_add_child(); void ags_thread_test_is_current_ready(); void ags_thread_test_stop(); void* ags_thread_test_lock_assert_locked(void *ptr); #define AGS_THREAD_TEST_LOCK_N_THREADS (4) #define AGS_THREAD_TEST_GET_TOPLEVEL_N_LEVELS (7) #define AGS_THREAD_TEST_FIRST_N_THREADS (16) #define AGS_THREAD_TEST_LAST_N_THREADS (16) #define AGS_THREAD_TEST_REMOVE_CHILD_N_THREADS (16) #define AGS_THREAD_TEST_ADD_CHILD_N_THREADS (16) AgsApplicationContext *application_context; AgsThread *main_loop; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_thread_test_init_suite() { ags_priority_load_defaults(ags_priority_get_instance()); application_context = ags_thread_application_context_new(); g_object_ref(application_context); ags_application_context_prepare(application_context); ags_application_context_setup(application_context); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); ags_thread_start(main_loop); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_thread_test_clean_suite() { ags_thread_stop(main_loop); g_object_unref(main_loop); g_object_unref(application_context); return(0); } void* ags_thread_test_lock_assert_locked(void *ptr) { AgsThread **thread; guint i; thread = (AgsThread **) ptr; for(i = 0; i < AGS_THREAD_TEST_LOCK_N_THREADS; i++){ CU_ASSERT(ags_thread_trylock(thread[i]) == FALSE); } g_thread_exit(NULL); return(NULL); } void ags_thread_test_lock() { AgsThread **thread; guint i; GThread *assert_thread; thread = (AgsThread **) malloc(AGS_THREAD_TEST_LOCK_N_THREADS * sizeof(AgsThread*)); for(i = 0; i < AGS_THREAD_TEST_LOCK_N_THREADS; i++){ thread[i] = ags_thread_new(NULL); ags_thread_add_child_extended(main_loop, thread[i], TRUE, TRUE); } /* lock the threads */ for(i = 0; i < AGS_THREAD_TEST_LOCK_N_THREADS; i++){ ags_thread_lock(thread[i]); } /* try to lock from another thread */ assert_thread = g_thread_new("libags.so - unit test", ags_thread_test_lock_assert_locked, thread); g_thread_join(assert_thread); /* unlock the threads */ for(i = 0; i < AGS_THREAD_TEST_LOCK_N_THREADS; i++){ ags_thread_unlock(thread[i]); } } void ags_thread_test_trylock() { //TODO:JK: implement me } void ags_thread_test_get_toplevel() { AgsThread *main_loop; AgsThread *thread, *current; guint i; main_loop = ags_generic_main_loop_new(application_context); thread = main_loop; for(i = 0; i < AGS_THREAD_TEST_GET_TOPLEVEL_N_LEVELS; i++){ current = ags_thread_new(NULL); ags_thread_add_child_extended(thread, current, TRUE, TRUE); thread = current; } CU_ASSERT(ags_thread_get_toplevel(thread) == main_loop); } void ags_thread_test_first() { AgsThread *parent; AgsThread **thread; AgsThread *first_thread; guint i; parent = ags_thread_new(NULL); ags_thread_add_child_extended(main_loop, parent, TRUE, TRUE); thread = (AgsThread **) malloc(AGS_THREAD_TEST_FIRST_N_THREADS * sizeof(AgsThread*)); for(i = 0; i < AGS_THREAD_TEST_FIRST_N_THREADS; i++){ thread[i] = ags_thread_new(NULL); ags_thread_add_child_extended(parent, thread[i], TRUE, TRUE); } first_thread = thread[0]; for(i = 0; i < AGS_THREAD_TEST_FIRST_N_THREADS; i++){ CU_ASSERT(ags_thread_first(thread[i]) == first_thread); } } void ags_thread_test_last() { AgsThread *parent; AgsThread **thread; AgsThread *last_thread; guint i; parent = ags_thread_new(NULL); ags_thread_add_child_extended(main_loop, parent, TRUE, TRUE); thread = (AgsThread **) malloc(AGS_THREAD_TEST_LAST_N_THREADS * sizeof(AgsThread*)); for(i = 0; i < AGS_THREAD_TEST_LAST_N_THREADS; i++){ thread[i] = ags_thread_new(NULL); ags_thread_add_child_extended(parent, thread[i], TRUE, TRUE); } last_thread = thread[AGS_THREAD_TEST_LAST_N_THREADS - 1]; for(i = 0; i < AGS_THREAD_TEST_LAST_N_THREADS; i++){ CU_ASSERT(ags_thread_last(thread[i]) == last_thread); } } void ags_thread_test_remove_child() { AgsThread *parent; AgsThread **thread; AgsThread *current, *next_current; guint i; parent = ags_thread_new(NULL); ags_thread_add_child_extended(main_loop, parent, TRUE, TRUE); thread = (AgsThread **) malloc(AGS_THREAD_TEST_REMOVE_CHILD_N_THREADS * sizeof(AgsThread*)); for(i = 0; i < AGS_THREAD_TEST_REMOVE_CHILD_N_THREADS; i++){ thread[i] = ags_thread_new(NULL); ags_thread_add_child_extended(parent, thread[i], TRUE, TRUE); } for(i = 0; i < AGS_THREAD_TEST_REMOVE_CHILD_N_THREADS; i++){ g_object_ref(thread[i]); ags_thread_remove_child(parent, thread[i]); current = ags_thread_children(parent); while(current != NULL){ CU_ASSERT(current != thread[i]); /* iterate */ next_current = ags_thread_next(current); g_object_unref(current); current = next_current; } CU_ASSERT(ags_thread_parent(thread[i]) == NULL); g_object_unref(thread[i]); } } void ags_thread_test_add_child() { AgsThread *parent; AgsThread **thread; AgsThread *current, *next_current; guint i; gboolean success; parent = ags_thread_new(NULL); ags_thread_add_child_extended(main_loop, parent, TRUE, TRUE); thread = (AgsThread **) malloc(AGS_THREAD_TEST_ADD_CHILD_N_THREADS * sizeof(AgsThread*)); for(i = 0; i < AGS_THREAD_TEST_ADD_CHILD_N_THREADS; i++){ thread[i] = ags_thread_new(NULL); ags_thread_add_child_extended(parent, thread[i], TRUE, TRUE); current = ags_thread_children(parent); success = FALSE; while(current != NULL){ if(current = thread[i]){ success = TRUE; break; } /* iterate */ next_current = ags_thread_next(current); g_object_unref(current); current = next_current; } CU_ASSERT(success); CU_ASSERT(ags_thread_parent(thread[i]) == parent); } } void ags_thread_test_is_current_ready() { AgsThread *parent; AgsThread *thread; parent = ags_thread_new(NULL); thread = ags_thread_new(NULL); ags_thread_add_child_extended(parent, thread, TRUE, TRUE); /* not ready at all */ CU_ASSERT(ags_thread_is_current_ready(parent, 0) == TRUE); CU_ASSERT(ags_thread_is_current_ready(thread, 0) == TRUE); CU_ASSERT(ags_thread_is_current_ready(parent, 1) == TRUE); CU_ASSERT(ags_thread_is_current_ready(thread, 1) == TRUE); CU_ASSERT(ags_thread_is_current_ready(parent, 2) == TRUE); CU_ASSERT(ags_thread_is_current_ready(thread, 2) == TRUE); /* wait 0 ready */ ags_thread_set_sync_tic_flags(parent, AGS_THREAD_SYNC_TIC_WAIT_0); ags_thread_set_sync_tic_flags(thread, AGS_THREAD_SYNC_TIC_WAIT_0); CU_ASSERT(ags_thread_is_current_ready(parent, 0) == TRUE); CU_ASSERT(ags_thread_is_current_ready(thread, 0) == TRUE); ags_thread_unset_sync_tic_flags(parent, AGS_THREAD_SYNC_TIC_WAIT_0); ags_thread_unset_sync_tic_flags(thread, AGS_THREAD_SYNC_TIC_WAIT_0); /* wait 1 ready */ ags_thread_set_sync_tic_flags(parent, AGS_THREAD_SYNC_TIC_WAIT_1); ags_thread_set_sync_tic_flags(thread, AGS_THREAD_SYNC_TIC_WAIT_1); CU_ASSERT(ags_thread_is_current_ready(parent, 1) == TRUE); CU_ASSERT(ags_thread_is_current_ready(thread, 1) == TRUE); ags_thread_unset_sync_tic_flags(parent, AGS_THREAD_SYNC_TIC_WAIT_1); ags_thread_unset_sync_tic_flags(thread, AGS_THREAD_SYNC_TIC_WAIT_1); /* wait 2 ready */ ags_thread_set_sync_tic_flags(parent, AGS_THREAD_SYNC_TIC_WAIT_2); ags_thread_set_sync_tic_flags(thread, AGS_THREAD_SYNC_TIC_WAIT_2); CU_ASSERT(ags_thread_is_current_ready(parent, 2) == TRUE); CU_ASSERT(ags_thread_is_current_ready(thread, 2) == TRUE); ags_thread_unset_sync_tic_flags(parent, AGS_THREAD_SYNC_TIC_WAIT_2); ags_thread_unset_sync_tic_flags(thread, AGS_THREAD_SYNC_TIC_WAIT_2); } void ags_thread_test_stop() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsThreadTest", ags_thread_test_init_suite, ags_thread_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsThread lock", ags_thread_test_lock) == NULL) || (CU_add_test(pSuite, "test of AgsThread trylock", ags_thread_test_trylock) == NULL) || (CU_add_test(pSuite, "test of AgsThread get toplevel", ags_thread_test_get_toplevel) == NULL) || (CU_add_test(pSuite, "test of AgsThread first", ags_thread_test_first) == NULL) || (CU_add_test(pSuite, "test of AgsThread last", ags_thread_test_last) == NULL) || (CU_add_test(pSuite, "test of AgsThread remove child", ags_thread_test_remove_child) == NULL) || (CU_add_test(pSuite, "test of AgsThread add child", ags_thread_test_add_child) == NULL) || (CU_add_test(pSuite, "test of AgsThread is current ready", ags_thread_test_is_current_ready) == NULL) || (CU_add_test(pSuite, "test of AgsThread stop", ags_thread_test_stop) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/thread/ags_task_test.c0000644000175000017500000000652313605312646016613 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_task_test_init_suite(); int ags_task_test_clean_suite(); void ags_task_test_launch(); void ags_task_test_failure(); void ags_task_test_stub_launch(AgsTask *task); void ags_task_test_stub_failure(AgsTask *task, GError *error); gboolean stub_launch = FALSE; gboolean stub_failure = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_task_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_task_test_clean_suite() { return(0); } void ags_task_test_launch() { AgsTask *task; gpointer *ptr; task = g_object_new(AGS_TYPE_TASK, NULL); /* stub launch */ ptr = AGS_TASK_GET_CLASS(task)->launch; AGS_TASK_GET_CLASS(task)->launch = ags_task_test_stub_launch; /* launch and assert */ ags_task_launch(task); CU_ASSERT(stub_launch == TRUE); AGS_TASK_GET_CLASS(task)->launch = ptr; } void ags_task_test_failure() { AgsTask *task; gpointer *ptr; GError *error; task = g_object_new(AGS_TYPE_TASK, NULL); /* stub failure */ ptr = AGS_TASK_GET_CLASS(task)->failure; AGS_TASK_GET_CLASS(task)->failure = ags_task_test_stub_failure; /* failure and assert */ error = NULL; ags_task_failure(task, &error); CU_ASSERT(stub_failure == TRUE); AGS_TASK_GET_CLASS(task)->failure = ptr; } void ags_task_test_stub_launch(AgsTask *task) { stub_launch = TRUE; } void ags_task_test_stub_failure(AgsTask *task, GError *error) { stub_failure = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsTaskTest\0", ags_task_test_init_suite, ags_task_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsTask launch\0", ags_task_test_launch) == NULL) || (CU_add_test(pSuite, "test of AgsTask failure\0", ags_task_test_failure) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/thread/ags_destroy_worker_test.c0000644000175000017500000001160513605312646020730 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_destroy_worker_test_init_suite(); int ags_destroy_worker_test_clean_suite(); void ags_destroy_worker_test_add(); void ags_destroy_worker_test_stub_finalize(GObject *gobject); #define AGS_DESTROY_WORKER_TEST_ADD_TOTAL (AGS_DESTROY_WORKER_TEST_ADD_STAGE_0 + \ AGS_DESTROY_WORKER_TEST_ADD_STAGE_1 + \ AGS_DESTROY_WORKER_TEST_ADD_STAGE_2 + \ AGS_DESTROY_WORKER_TEST_ADD_STAGE_3 + \ AGS_DESTROY_WORKER_TEST_ADD_STAGE_4) #define AGS_DESTROY_WORKER_TEST_ADD_INITIAL_DELAY (4000) #define AGS_DESTROY_WORKER_TEST_ADD_FINAL_DELAY (5000000) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_0 (8) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_0_DELAY (4000) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_1 (3) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_1_DELAY (8000) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_2 (2) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_2_DELAY (1500000) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_3 (5) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_3_DELAY (500000) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_4 (7) #define AGS_DESTROY_WORKER_TEST_ADD_STAGE_4_DELAY (125000) guint n_finalize = 0; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_destroy_worker_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_destroy_worker_test_clean_suite() { return(0); } void ags_destroy_worker_test_add() { AgsDestroyWorker *destroy_worker; AgsThread *thread[AGS_DESTROY_WORKER_TEST_ADD_TOTAL]; guint i, nth; destroy_worker = ags_destroy_worker_new(); ags_thread_start(destroy_worker); for(i = 0; i < AGS_DESTROY_WORKER_TEST_ADD_TOTAL; i++){ thread[i] = g_object_new(AGS_TYPE_THREAD, NULL); G_OBJECT_GET_CLASS(thread[i])->finalize = ags_destroy_worker_test_stub_finalize; } /* */ nth = 0; usleep(AGS_DESTROY_WORKER_TEST_ADD_INITIAL_DELAY); for(i = 0; i < AGS_DESTROY_WORKER_TEST_ADD_STAGE_0; i++, nth++){ ags_destroy_worker_add(destroy_worker, thread[nth], g_object_unref); } usleep(AGS_DESTROY_WORKER_TEST_ADD_STAGE_0_DELAY); for(i = 0; i < AGS_DESTROY_WORKER_TEST_ADD_STAGE_1; i++, nth++){ ags_destroy_worker_add(destroy_worker, thread[nth], g_object_unref); } usleep(AGS_DESTROY_WORKER_TEST_ADD_STAGE_1_DELAY); for(i = 0; i < AGS_DESTROY_WORKER_TEST_ADD_STAGE_2; i++, nth++){ ags_destroy_worker_add(destroy_worker, thread[nth], g_object_unref); } usleep(AGS_DESTROY_WORKER_TEST_ADD_STAGE_2_DELAY); for(i = 0; i < AGS_DESTROY_WORKER_TEST_ADD_STAGE_3; i++, nth++){ ags_destroy_worker_add(destroy_worker, thread[nth], g_object_unref); } usleep(AGS_DESTROY_WORKER_TEST_ADD_STAGE_3_DELAY); for(i = 0; i < AGS_DESTROY_WORKER_TEST_ADD_STAGE_4; i++, nth++){ ags_destroy_worker_add(destroy_worker, thread[nth], g_object_unref); } usleep(AGS_DESTROY_WORKER_TEST_ADD_STAGE_4_DELAY); /* assert */ usleep(AGS_DESTROY_WORKER_TEST_ADD_FINAL_DELAY); CU_ASSERT(n_finalize == AGS_DESTROY_WORKER_TEST_ADD_TOTAL); } void ags_destroy_worker_test_stub_finalize(GObject *gobject) { n_finalize++; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsDestroyWorkerTest\0", ags_destroy_worker_test_init_suite, ags_destroy_worker_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsDestroyWorker add\0", ags_destroy_worker_test_add) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/thread/ags_worker_thread_test.c0000644000175000017500000000556113605312646020512 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_worker_thread_test_init_suite(); int ags_worker_thread_test_clean_suite(); void ags_worker_thread_test_do_poll(); void ags_worker_thread_test_stub_do_poll(AgsWorkerThread *worker_thread); gboolean stub_do_poll = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_worker_thread_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_worker_thread_test_clean_suite() { return(0); } void ags_worker_thread_test_do_poll() { AgsWorkerThread *worker_thread; gpointer ptr; worker_thread = g_object_new(AGS_TYPE_WORKER_THREAD, NULL); ptr = AGS_WORKER_THREAD_GET_CLASS(worker_thread)->do_poll; AGS_WORKER_THREAD_GET_CLASS(worker_thread)->do_poll = ags_worker_thread_test_stub_do_poll; /* assert do poll */ ags_worker_thread_do_poll(worker_thread); CU_ASSERT(stub_do_poll == TRUE); AGS_WORKER_THREAD_GET_CLASS(worker_thread)->do_poll = ptr; } void ags_worker_thread_test_stub_do_poll(AgsWorkerThread *worker_thread) { stub_do_poll = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsWorkerThreadTest\0", ags_worker_thread_test_init_suite, ags_worker_thread_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsWorkerThread do poll\0", ags_worker_thread_test_do_poll) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/0000755000175000017500000000000013622252263013162 500000000000000gsequencer-3.1.3/ags/test/lib/ags_complex_test.c0000644000175000017500000001041113607210263016600 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_complex_test_init_suite(); int ags_complex_test_clean_suite(); void ags_complex_test_copy(); void ags_complex_test_get(); void ags_complex_test_set(); /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_complex_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_complex_test_clean_suite() { return(0); } void ags_complex_test_copy() { AgsComplex a; AgsComplex *ptr; /* test x = 1.0 */ a.real = 1.0; a.imag = 0.0; ptr = ags_complex_copy(&a); CU_ASSERT(ptr[0].real == a.real && ptr[0].imag == a.imag); /* test y = 1.0 */ a.real = 0.0; a.imag = 1.0; ptr = ags_complex_copy(&a); CU_ASSERT(ptr[0].real == a.real && ptr[0].imag == a.imag); /* test x = 1.25, y = 2 * M_PI */ a.real = 1.25; a.imag = 2.0 * M_PI; ptr = ags_complex_copy(&a); CU_ASSERT(ptr[0].real == a.real && ptr[0].imag == a.imag); /* test x = 2 * M_PI, y = 1.25 */ a.real = 2.0 * M_PI; a.imag = 1.25; ptr = ags_complex_copy(&a); CU_ASSERT(ptr[0].real == a.real && ptr[0].imag == a.imag); } void ags_complex_test_get() { AgsComplex a; complex z; /* test x = 1.0 */ a.real = 1.0; a.imag = 0.0; z = ags_complex_get(&a); CU_ASSERT(z == (a.real + a.imag * I)); /* test y = 1.0 */ a.real = 0.0; a.imag = 1.0; z = ags_complex_get(&a); CU_ASSERT(z == (a.real + a.imag * I)); /* test x = 1.25, y = 2 * M_PI */ a.real = 1.25; a.imag = 2.0 * M_PI; z = ags_complex_get(&a); CU_ASSERT(z == (a.real + a.imag * I)); /* test x = 2 * M_PI, y = 1.25 */ a.real = 2.0 * M_PI; a.imag = 1.25; z = ags_complex_get(&a); CU_ASSERT(z == (a.real + a.imag * I)); } void ags_complex_test_set() { AgsComplex a; complex z; /* test x = 1.0 */ z = 1.0 + 0.0 * I; ags_complex_set(&a, z); CU_ASSERT(a.real == 1.0 && a.imag == 0.0); /* test y = 1.0 */ z = 0.0 + 1.0 * I; ags_complex_set(&a, z); CU_ASSERT(a.real == 0.0 && a.imag == 1.0); /* test x = 1.25, y = 2 * M_PI */ z = 1.25 + (2.0 * M_PI) * I; ags_complex_set(&a, z); CU_ASSERT(a.real == 1.25 && a.imag == 2.0 * M_PI); /* test x = 2 * M_PI, y = 1.25 */ z = (2.0 * M_PI) + 1.25 * I; ags_complex_set(&a, z); CU_ASSERT(a.real == 2.0 * M_PI && a.imag == 1.25); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsComplexTest", ags_complex_test_init_suite, ags_complex_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsComplex copy", ags_complex_test_copy) == NULL) || (CU_add_test(pSuite, "test of AgsComplex get", ags_complex_test_get) == NULL) || (CU_add_test(pSuite, "test of AgsComplex set", ags_complex_test_set) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/ags_time_test.c0000644000175000017500000000704013605312646016101 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_time_test_init_suite(); int ags_time_test_clean_suite(); void ags_time_test_get_uptime_from_offset(); /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_time_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_time_test_clean_suite() { return(0); } void ags_time_test_get_uptime_from_offset() { gdouble bpm = 120.0; gdouble delay = (60.0 * ((44100 / 1024) / 120.0)) * ((1.0 / 16.0) * (1.0 / 0.25)); gdouble delay_factor = 0.25; guint offset_0 = 0; guint offset_1_times_delay = delay; guint offset_4_times_delay = 4 * delay; guint offset_16_times_delay = 16 * delay; gchar *offset_0_str = "0000:00.000"; gchar *offset_1_times_delay_str = "0000:00.125"; gchar *offset_4_times_delay_str = "0000:00.500"; gchar *offset_16_times_delay_str = "0000:02.000"; gchar *str; /* assert offset 0 */ str = ags_time_get_uptime_from_offset(0, bpm, delay, delay_factor); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(offset_0_str, str, 12)); /* assert offset 1 */ str = ags_time_get_uptime_from_offset(1, bpm, delay, delay_factor); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(offset_1_times_delay_str, str, 12)); /* assert offset 4 */ str = ags_time_get_uptime_from_offset(4, bpm, delay, delay_factor); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(offset_4_times_delay_str, str, 12)); /* assert offset 16 */ str = ags_time_get_uptime_from_offset(16, bpm, delay, delay_factor); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(offset_16_times_delay_str, str, 12)); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsTimeTest", ags_time_test_init_suite, ags_time_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_time.c get uptime from offset", ags_time_test_get_uptime_from_offset) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/ags_conversion_test.c0000644000175000017500000001577213605312646017343 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_conversion_test_init_suite(); int ags_conversion_test_clean_suite(); void ags_conversion_test_property(); void ags_conversion_test_finalize(); void ags_conversion_test_convert(); void ags_conversion_test_stub_finalize(GObject *gobject); gdouble ags_conversion_test_stub_convert(AgsConversion *conversion, gdouble value, gboolean reverse); #define AGS_CONVERSION_TEST_PROPERTY_NAME_0 "logarithmic transform" #define AGS_CONVERSION_TEST_PROPERTY_NAME_1 "linear transform" #define AGS_CONVERSION_TEST_PROPERTY_DESCRIPTION_0 "transform using log(), see `man -s3 log` or `man -s3 exp` for further information" #define AGS_CONVERSION_TEST_PROPERTY_DESCRIPTION_1 "transform using multiplication" #define AGS_CONVERSION_TEST_CONVERT_VALUE_0 (8.0) #define AGS_CONVERSION_TEST_CONVERT_IS_REVERSE_0 (FALSE) #define AGS_CONVERSION_TEST_CONVERT_RETVAL_0 (19.0) #define AGS_CONVERSION_TEST_CONVERT_VALUE_1 (17.0) #define AGS_CONVERSION_TEST_CONVERT_IS_REVERSE_1 (TRUE) #define AGS_CONVERSION_TEST_CONVERT_RETVAL_1 (3.0) gboolean ags_conversion_test_finalize_invoked = FALSE; guint ags_conversion_test_convert_invoked = 0; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_conversion_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_conversion_test_clean_suite() { return(0); } void ags_conversion_test_property() { AgsConversion *conversion; conversion = ags_conversion_new(); g_object_ref(conversion); CU_ASSERT(conversion != NULL); /* test AgsConversion:name - #0 */ g_object_set(conversion, "name", AGS_CONVERSION_TEST_PROPERTY_NAME_0, NULL); CU_ASSERT(!g_strcmp0(conversion->name, AGS_CONVERSION_TEST_PROPERTY_NAME_0)); /* test AgsConversion:name - #1 */ g_object_set(conversion, "name", AGS_CONVERSION_TEST_PROPERTY_NAME_1, NULL); CU_ASSERT(!g_strcmp0(conversion->name, AGS_CONVERSION_TEST_PROPERTY_NAME_1)); /* test AgsConversion:description - #0 */ g_object_set(conversion, "description", AGS_CONVERSION_TEST_PROPERTY_DESCRIPTION_0, NULL); CU_ASSERT(!g_strcmp0(conversion->description, AGS_CONVERSION_TEST_PROPERTY_DESCRIPTION_0)); /* test AgsConversion:description - #1 */ g_object_set(conversion, "description", AGS_CONVERSION_TEST_PROPERTY_DESCRIPTION_1, NULL); CU_ASSERT(!g_strcmp0(conversion->description, AGS_CONVERSION_TEST_PROPERTY_DESCRIPTION_1)); } void ags_conversion_test_stub_finalize(GObject *gobject) { ags_conversion_test_finalize_invoked = TRUE; } void ags_conversion_test_finalize() { AgsConversion *conversion; gpointer stubbed_class; gpointer orig_finalize; conversion = ags_conversion_new(); g_object_ref(conversion); CU_ASSERT(conversion != NULL); /* stub finalize */ stubbed_class = AGS_CONVERSION_GET_CLASS(conversion); orig_finalize = G_OBJECT_CLASS(stubbed_class)->finalize; G_OBJECT_CLASS(stubbed_class)->finalize = ags_conversion_test_stub_finalize; /* test finalize */ g_object_unref(conversion); CU_ASSERT(ags_conversion_test_finalize_invoked == TRUE); /* undo stub */ G_OBJECT_CLASS(stubbed_class)->finalize = orig_finalize; } gdouble ags_conversion_test_stub_convert(AgsConversion *conversion, gdouble value, gboolean reverse) { gdouble retval; retval = value; switch(ags_conversion_test_convert_invoked){ case 0: { CU_ASSERT(value == AGS_CONVERSION_TEST_CONVERT_VALUE_0); CU_ASSERT(reverse == AGS_CONVERSION_TEST_CONVERT_IS_REVERSE_0); retval = AGS_CONVERSION_TEST_CONVERT_RETVAL_0; } break; case 1: { CU_ASSERT(value == AGS_CONVERSION_TEST_CONVERT_VALUE_1); CU_ASSERT(reverse == AGS_CONVERSION_TEST_CONVERT_IS_REVERSE_1); retval = AGS_CONVERSION_TEST_CONVERT_RETVAL_1; } break; } ags_conversion_test_convert_invoked++; return(retval); } void ags_conversion_test_convert() { AgsConversion *conversion; gpointer stubbed_class; gpointer orig_convert; gdouble retval; conversion = ags_conversion_new(); g_object_ref(conversion); CU_ASSERT(conversion != NULL); /* stub convert */ stubbed_class = AGS_CONVERSION_GET_CLASS(conversion); orig_convert = AGS_CONVERSION_CLASS(stubbed_class)->convert; AGS_CONVERSION_CLASS(stubbed_class)->convert = ags_conversion_test_stub_convert; /* test convert - #0 */ retval = ags_conversion_convert(conversion, AGS_CONVERSION_TEST_CONVERT_VALUE_0, AGS_CONVERSION_TEST_CONVERT_IS_REVERSE_0); CU_ASSERT(retval == AGS_CONVERSION_TEST_CONVERT_RETVAL_0); CU_ASSERT(ags_conversion_test_convert_invoked == 1); /* test convert - #1 */ retval = ags_conversion_convert(conversion, AGS_CONVERSION_TEST_CONVERT_VALUE_1, AGS_CONVERSION_TEST_CONVERT_IS_REVERSE_1); CU_ASSERT(retval == AGS_CONVERSION_TEST_CONVERT_RETVAL_1); CU_ASSERT(ags_conversion_test_convert_invoked == 2); /* undo stub */ AGS_CONVERSION_CLASS(stubbed_class)->convert = orig_convert; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsConversionTest", ags_conversion_test_init_suite, ags_conversion_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsConversion property", ags_conversion_test_property) == NULL) || (CU_add_test(pSuite, "test of AgsConversion finalize", ags_conversion_test_finalize) == NULL) || (CU_add_test(pSuite, "test of AgsConversion convert", ags_conversion_test_convert) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/ags_turtle_test.c0000644000175000017500000007377313605312646016502 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2016 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_turtle_test_init_suite(); int ags_turtle_test_clean_suite(); void ags_turtle_test_read_iriref(); void ags_turtle_test_read_pname_ns(); void ags_turtle_test_read_pname_ln(); void ags_turtle_test_read_blank_node_label(); void ags_turtle_test_read_langtag(); void ags_turtle_test_read_boolean(); void ags_turtle_test_read_integer(); void ags_turtle_test_read_decimal(); void ags_turtle_test_read_double(); void ags_turtle_test_read_exponent(); void ags_turtle_test_read_string(); void ags_turtle_test_read_string_literal_quote(); void ags_turtle_test_read_string_literal_single_quote(); void ags_turtle_test_read_string_literal_long_quote(); void ags_turtle_test_read_string_literal_long_single_quote(); void ags_turtle_test_read_uchar(); void ags_turtle_test_read_echar(); void ags_turtle_test_read_ws(); void ags_turtle_test_read_anon(); void ags_turtle_test_read_pn_chars_base(); void ags_turtle_test_read_pn_chars_u(); void ags_turtle_test_read_pn_chars(); void ags_turtle_test_read_pn_prefix(); void ags_turtle_test_read_pn_local(); void ags_turtle_test_read_plx(); void ags_turtle_test_read_percent(); void ags_turtle_test_read_hex(); void ags_turtle_test_read_pn_local_esc(); #define AGS_TURTLE_TEST_READ_INTEGER_COUNT (1024) #define AGS_TURTLE_TEST_READ_DECIMAL_COUNT (1024) #define AGS_TURTLE_TEST_READ_DOUBLE_COUNT (1024) #define AGS_TURTLE_TEST_READ_PN_CHARS_BASE_ITERATION_COUNT (65535) #define AGS_TURTLE_TEST_READ_PN_CHARS_BASE_ITERATION_COUNT (65535) #define AGS_TURTLE_TEST_READ_PN_CHARS_ITERATION_COUNT (256) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_turtle_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_turtle_test_clean_suite() { return(0); } void ags_turtle_test_read_iriref() { gchar *iriref_lv2 = ""; gchar *no_iriref = ""; gchar *str; /* assert iriref lv2 */ str = ags_turtle_read_iriref(iriref_lv2, iriref_lv2 + strlen(iriref_lv2)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(str, "", 6)); /* assert no iriref */ str = ags_turtle_read_iriref(no_iriref, no_iriref + strlen(no_iriref)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_pname_ns() { gchar *pname_ns_port = ":port"; gchar *pname_ns_swh_plugin = "swh:plugin"; gchar *no_pname_ns = "port"; gchar *str; /* assert pname ns port */ str = ags_turtle_read_pname_ns(pname_ns_port, pname_ns_port + strlen(pname_ns_port)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(str, ":", 2)); /* assert pname ns swh plugin */ str = ags_turtle_read_pname_ns(pname_ns_swh_plugin, pname_ns_swh_plugin + strlen(pname_ns_swh_plugin)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(str, "swh:", 5)); /* assert no pname ns */ str = ags_turtle_read_pname_ns(no_pname_ns, no_pname_ns + strlen(no_pname_ns)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_pname_ln() { gchar *pname_ln_port = ":port"; gchar *pname_ln_swh_plugin = "swh:plugin"; gchar *no_pname_ln = "port"; gchar *str; /* assert pname ln port */ str = ags_turtle_read_pname_ln(pname_ln_port, pname_ln_port + strlen(pname_ln_port)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(str, ":port", 6)); /* assert pname ln swh plugin */ str = ags_turtle_read_pname_ln(pname_ln_swh_plugin, pname_ln_swh_plugin + strlen(pname_ln_swh_plugin)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(str, "swh:plugin", 11)); /* assert no pname ln */ str = ags_turtle_read_pname_ln(no_pname_ln, no_pname_ln + strlen(no_pname_ln)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_blank_node_label() { gchar *blank_node_myid = "_:myid"; gchar *no_blank_node = "_ no id"; gchar *str; /* assert blank node myid */ str = ags_turtle_read_blank_node_label(blank_node_myid, blank_node_myid + strlen(blank_node_myid)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(str, "_:myid", 6)); /* assert no blank_node */ str = ags_turtle_read_blank_node_label(no_blank_node, no_blank_node + strlen(no_blank_node)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_langtag() { gchar *langtag_DE = "@DE"; gchar *langtag_DE_CH = "@DE-CH"; gchar *langtag_DE_AT = "@DE-AT"; gchar *no_langtag = "Fr"; gchar *str; /* assert DE */ str = ags_turtle_read_langtag(langtag_DE, langtag_DE + strlen(langtag_DE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(langtag_DE, str, 4)); /* assert DE-CH */ str = ags_turtle_read_langtag(langtag_DE_CH, langtag_DE_CH + strlen(langtag_DE_CH)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(langtag_DE_CH, str, 4)); /* assert DE-AT */ str = ags_turtle_read_langtag(langtag_DE_AT, langtag_DE_AT + strlen(langtag_DE_AT)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(langtag_DE_AT, str, 4)); /* assert no */ str = ags_turtle_read_langtag(no_langtag, no_langtag + strlen(no_langtag)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_boolean() { gchar *boolean_true = "true"; gchar *boolean_false = "false"; gchar *not_boolean_0 = "0"; gchar *not_boolean_1 = "1"; gchar *str; /* assert true */ str = ags_turtle_read_boolean(boolean_true, boolean_true + strlen(boolean_true)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(boolean_true, str, 5)); /* assert false */ str = ags_turtle_read_boolean(boolean_false, boolean_false + strlen(boolean_false)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(boolean_false, str, 5)); /* assert not 0 */ str = ags_turtle_read_boolean(not_boolean_0, not_boolean_0 + strlen(not_boolean_0)); CU_ASSERT(str == NULL); /* assert not 1 */ str = ags_turtle_read_boolean(not_boolean_1, not_boolean_1 + strlen(not_boolean_1)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_integer() { gchar *str, *tmp; gchar *no_integer = "!0"; guint i; gboolean success; /* check random integer */ success = TRUE; for(i = 0; i < AGS_TURTLE_TEST_READ_INTEGER_COUNT; i++){ tmp = g_strdup_printf("%d", rand() % 4294967296 - 2147483648); str = ags_turtle_read_integer(tmp, tmp + strlen(tmp)); if(str == NULL || g_ascii_strcasecmp(tmp, str)){ success = FALSE; break; } free(tmp); } CU_ASSERT(success == TRUE); /* check no */ str = ags_turtle_read_integer(no_integer, no_integer + strlen(no_integer)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_decimal() { gchar *str, *tmp; gchar *no_double = "!0"; guint i; gboolean success; /* check random double */ success = TRUE; for(i = 0; i < AGS_TURTLE_TEST_READ_DECIMAL_COUNT; i++){ tmp = g_strdup_printf("%.5f", (rand() % 4294967296 - 2147483648) / 31.0); str = ags_turtle_read_decimal(tmp, tmp + strlen(tmp)); if(str == NULL || g_ascii_strcasecmp(tmp, str)){ success = FALSE; break; } free(tmp); } CU_ASSERT(success == TRUE); /* check no */ str = ags_turtle_read_decimal(no_double, no_double + strlen(no_double)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_double() { gchar *str, *tmp; gchar *no_double = "!0E12"; gdouble val_0; guint i; gboolean success; /* check random double */ success = TRUE; for(i = 0; i < AGS_TURTLE_TEST_READ_DOUBLE_COUNT; i++){ val_0 = (rand() % 4294967296 - 2147483648) / 31.0; tmp = g_strdup_printf("%01.5fE11", val_0); str = ags_turtle_read_double(tmp, tmp + strlen(tmp)); if(str == NULL || g_ascii_strcasecmp(str, tmp)){ success = FALSE; break; } free(tmp); } CU_ASSERT(success == TRUE); /* check no */ str = ags_turtle_read_double(no_double, no_double + strlen(no_double)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_exponent() { gchar *exponent_e10 = "e+10"; gchar *exponent_E10 = "E-10"; gchar *no_exponent = "e 10"; gchar *str; /* assert e+10 */ str = ags_turtle_read_exponent(exponent_e10, exponent_e10 + strlen(exponent_e10)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(exponent_e10, str, 5)); /* assert E-10 */ str = ags_turtle_read_exponent(exponent_E10, exponent_E10 + strlen(exponent_E10)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(exponent_E10, str, 5)); } void ags_turtle_test_read_string() { gchar *string_literal_quote_MY_TURTLE = "\"MY Turtle\""; gchar *string_literal_single_quote_MY_TURTLE = "\'MY Turtle\'"; gchar *string_literal_long_quote_MY_TURTLE = "\"\"\"MY Turtle\nis just looking at the mirror\nand is waiting to get feed\"\"\""; gchar *string_literal_long_single_quote_MY_TURTLE = "'''MY Turtle\nis just looking at the mirror\nand is waiting to get feed'''"; gchar *str; /* assert my turtle quote */ str = ags_turtle_read_string(string_literal_quote_MY_TURTLE, string_literal_quote_MY_TURTLE + strlen(string_literal_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_quote_MY_TURTLE, str, strlen(string_literal_quote_MY_TURTLE))); /* assert my turtle single quote */ str = ags_turtle_read_string(string_literal_single_quote_MY_TURTLE, string_literal_single_quote_MY_TURTLE + strlen(string_literal_single_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_single_quote_MY_TURTLE, str, strlen(string_literal_single_quote_MY_TURTLE))); /* assert my turtle long quote */ str = ags_turtle_read_string(string_literal_long_quote_MY_TURTLE, string_literal_long_quote_MY_TURTLE + strlen(string_literal_long_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_long_quote_MY_TURTLE, str, strlen(string_literal_long_quote_MY_TURTLE))); /* assert my turtle long single quote */ str = ags_turtle_read_string(string_literal_long_single_quote_MY_TURTLE, string_literal_long_single_quote_MY_TURTLE + strlen(string_literal_long_single_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_long_single_quote_MY_TURTLE, str, strlen(string_literal_long_single_quote_MY_TURTLE))); } void ags_turtle_test_read_string_literal_quote() { gchar *string_literal_quote_MY_TURTLE = "\"MY Turtle\""; gchar *str; /* assert my turtle quote */ str = ags_turtle_read_string(string_literal_quote_MY_TURTLE, string_literal_quote_MY_TURTLE + strlen(string_literal_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_quote_MY_TURTLE, str, strlen(string_literal_quote_MY_TURTLE))); } void ags_turtle_test_read_string_literal_single_quote() { gchar *string_literal_single_quote_MY_TURTLE = "\'MY Turtle\'"; gchar *str; /* assert my turtle single quote */ str = ags_turtle_read_string(string_literal_single_quote_MY_TURTLE, string_literal_single_quote_MY_TURTLE + strlen(string_literal_single_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_single_quote_MY_TURTLE, str, strlen(string_literal_single_quote_MY_TURTLE))); } void ags_turtle_test_read_string_literal_long_quote() { gchar *string_literal_long_quote_MY_TURTLE = "\"\"\"MY Turtle\nis just looking at the mirror\nand is waiting to get feed\"\"\""; gchar *str; /* assert my turtle long quote */ str = ags_turtle_read_string(string_literal_long_quote_MY_TURTLE, string_literal_long_quote_MY_TURTLE + strlen(string_literal_long_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_long_quote_MY_TURTLE, str, strlen(string_literal_long_quote_MY_TURTLE))); } void ags_turtle_test_read_string_literal_long_single_quote() { gchar *string_literal_long_single_quote_MY_TURTLE = "'''MY Turtle\nis just looking at the mirror\nand is waiting to get feed'''"; gchar *str; /* assert my turtle long single quote */ str = ags_turtle_read_string(string_literal_long_single_quote_MY_TURTLE, string_literal_long_single_quote_MY_TURTLE + strlen(string_literal_long_single_quote_MY_TURTLE)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(string_literal_long_single_quote_MY_TURTLE, str, strlen(string_literal_long_single_quote_MY_TURTLE))); } void ags_turtle_test_read_uchar() { gchar *uchar_2_A = "\\u0041"; gchar *uchar_2_e_diaresis = "\\u00eb"; gchar *uchar_4_A = "\\Uffef0041"; gchar *uchar_4_e_diaresis = "\\Uffef00eb"; gchar *str; /* assert 2 byte capital A */ str = ags_turtle_read_uchar(uchar_2_A, uchar_2_A + strlen(uchar_2_A)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(uchar_2_A, str, 7)); /* assert 2 byte e diaresis */ str = ags_turtle_read_uchar(uchar_2_e_diaresis, uchar_2_e_diaresis + strlen(uchar_2_e_diaresis)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(uchar_2_e_diaresis, str, 7)); /* assert 4 byte capital A */ str = ags_turtle_read_uchar(uchar_4_A, uchar_4_A + strlen(uchar_4_A)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(uchar_4_A, str, 11)); /* assert 4 byte e diaresis */ str = ags_turtle_read_uchar(uchar_4_e_diaresis, uchar_4_e_diaresis + strlen(uchar_4_e_diaresis)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(uchar_4_e_diaresis, str, 11)); } void ags_turtle_test_read_echar() { gchar current[3]; gchar *echar = "tbnrf\""; gchar *str; guint i; gboolean success; /* assert escaped characters */ current[0] = '\\'; current[2] = '\0'; success = TRUE; for(i = 0; i < 7; i++){ current[1] = echar[i]; str = ags_turtle_read_echar(current, current + 3); if(g_ascii_strncasecmp(current, str, 3)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* assert not escaped */ current[1] = 'x'; str = ags_turtle_read_echar(current, current + 3); CU_ASSERT(str == NULL); } void ags_turtle_test_read_ws() { gchar current[2]; gchar *ws = "\x20\x09\x0D\x0A"; gchar *str; guint i; gboolean success; /* assert white-space */ current[1] = '\0'; success = TRUE; for(i = 0; i < 4; i++){ current[0] = ws[i]; str = ags_turtle_read_ws(current, current + 2); if(g_ascii_strncasecmp(current, str, 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* assert no ws */ current[0] = 'a'; str = ags_turtle_read_ws(current, current + 2); CU_ASSERT(str == NULL); } void ags_turtle_test_read_anon() { gchar *anon_empty = "[]"; gchar *anon_ws = "[ ]"; gchar *anon_tab = "[\t\t\t]"; gchar *anon_mixed = "[\t \t ]"; gchar *str; /* assert anon empty */ str = ags_turtle_read_anon(anon_empty, anon_empty + 3); CU_ASSERT(str != NULL && !g_ascii_strcasecmp(str, anon_empty)); /* assert anon ws */ str = ags_turtle_read_anon(anon_ws, anon_ws + 5); CU_ASSERT(str != NULL && !g_ascii_strcasecmp(str, anon_ws)); /* assert anon tab */ str = ags_turtle_read_anon(anon_tab, anon_tab + 6); CU_ASSERT(str != NULL && !g_ascii_strcasecmp(str, anon_tab)); /* assert anon mixed */ str = ags_turtle_read_anon(anon_mixed, anon_mixed + 7); CU_ASSERT(str != NULL && !g_ascii_strcasecmp(str, anon_mixed)); } void ags_turtle_test_read_pn_chars_base() { gchar current[25]; gchar *str; guint n_bytes, nth; guint i; gboolean success; /* test single char A-Z */ success = TRUE; for(i = 0; i < 26; i++){ current[0] = 'A' + i; current[1] = '\0'; str = ags_turtle_read_pn_chars_base(current, current + 2); if(g_ascii_strncasecmp(current, str, 2)){ success = FALSE; break; } current[0] = 'a' + i; current[1] = '\0'; str = ags_turtle_read_pn_chars_base(current, current + 2); if(g_ascii_strncasecmp(current, str, 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* test random string */ success = TRUE; for(i = 0; i < AGS_TURTLE_TEST_READ_PN_CHARS_BASE_ITERATION_COUNT; i++){ guint range; nth = 0; n_bytes = 0; range = rand() % 13; switch(range){ case 0: { if(rand() % 2 == 1){ current[nth] = 'a' + (rand() % 26); }else{ current[nth] = 'A' + (rand() % 26); } n_bytes = 1; } break; case 1: { current[nth] = 0xC3; current[nth + 1] = 0x80 + (rand() % 22); n_bytes = 2; } break; case 2: { current[nth] = 0xC3; current[nth + 1] = 0x98 + (rand() % 30); n_bytes = 2; } break; case 3: { guint sub; sub = rand() % 3; if(sub == 0){ current[nth] = 0xC3; current[nth + 1] = 0xB8 + (rand() % 8); }else if(sub == 1){ current[nth] = 0xC3 + (rand() % 7); current[nth + 1] = 0x80 + (rand() % 64); }else if(sub == 2){ current[nth] = 0xCB; current[nth + 1] = 0x80 + (rand() % 64); } n_bytes = 2; } break; case 4: { current[nth] = 0xCD; current[nth + 1] = 0xB0 + (rand() % 13); n_bytes = 2; } break; case 5: { guint sub; sub = rand() % 3; if(sub == 0){ current[nth] = 0xCD; current[nth + 1] = 0xBF + (rand() % 32); n_bytes = 2; }else if(sub == 1){ current[nth] = 0xCE + (rand() % 7); current[nth + 1] = 0x80 + (rand() % 64); n_bytes = 2; }else if(sub == 2){ current[nth] = 0xE0 + (rand() % 2); current[nth + 1] = 0x80 + (rand() % 64); current[nth + 2] = 0x80 + (rand() % 64); n_bytes = 3; } } break; case 6: { current[nth] = 0xE2; current[nth + 1] = 0x80; current[nth + 2] = 0x8C + (rand() % 2); n_bytes = 3; } break; case 7: { guint sub; sub = rand() % 3; if(sub == 0){ current[nth] = 0xE2; current[nth + 1] = 0x81; current[nth + 2] = 0xB0 + (rand() % 16); }else if(sub == 1){ current[nth] = 0xE2; current[nth + 1] = 0x81 + (rand() % 4); current[nth + 2] = 0x80 + (rand() % 64); }else if(sub == 2){ current[nth] = 0xE2; current[nth + 1] = 0x86; current[nth + 2] = 0x80 + (rand() % 16); } n_bytes = 3; } break; case 8: { guint sub; sub = rand() % 2; if(sub == 0){ current[nth] = 0xE2; current[nth + 1] = 0xB0 + (rand() % 15); current[nth + 2] = 0x80 + (rand() % 64); }else if(sub == 1){ current[nth] = 0xE2; current[nth + 1] = 0xBF; current[nth + 2] = 0x80 + (rand() % 48); } n_bytes = 3; } break; case 9: { guint sub; sub = rand() % 2; if(sub == 0){ current[nth] = 0xE3; current[nth + 1] = 0x80 + (rand() % 64); current[nth + 2] = 0x81 + (rand() % 63); }else if(sub == 1){ current[nth] = 0xE4 + (rand() % 8); current[nth + 1] = 0x80 + (rand() % 16); current[nth + 2] = 0x80 + (rand() % 64); } n_bytes = 3; } break; case 10: { guint sub; sub = rand() % 2; if(sub == 0){ current[nth] = 0xEF; current[nth + 1] = 0xA4 + (rand() % 18); current[nth + 2] = 0x80 + (rand() % 64); }else if(sub == 1){ current[nth] = 0xEF; current[nth + 1] = 0xBF; current[nth + 2] = 0x80 + (rand() % 16); } n_bytes = 3; } break; case 11: { guint sub; sub = rand() % 3; if(sub == 0){ current[nth] = 0xEF; current[nth + 1] = 0xB7; current[nth + 2] = 0xB0 + (rand() % 16); }else if(sub == 1){ current[nth] = 0xEF; current[nth + 1] = 0xB8 + (rand() % 6); current[nth + 2] = 0x80 + (rand() % 64); }else if(sub == 2){ current[nth] = 0xEF; current[nth + 1] = 0xBF; current[nth + 2] = 0x80 + (rand() % 62); } n_bytes = 3; } break; case 12: { current[nth] = 0xF0 + (rand() % 4); current[nth + 1] = 0x90 + (rand() % 32); current[nth + 2] = 0x80 + (rand() % 64); current[nth + 3] = 0x80 + (rand() % 64); n_bytes = 4; } } current[nth + n_bytes] = '\0'; str = ags_turtle_read_pn_chars_base(current, current + n_bytes); if(str == NULL || g_ascii_strncasecmp(current, str, n_bytes)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); } void ags_turtle_test_read_pn_chars_u() { gchar *underscore = "_"; gchar *str; str = ags_turtle_read_pn_chars_u(underscore, underscore + 2); CU_ASSERT(str != NULL || !g_ascii_strncasecmp(underscore, str, 2)); } void ags_turtle_test_read_pn_chars() { gchar *dash = "-"; gchar *bullet = "\xC2\xB7"; gchar *key_0 = "\xE2\x80\xBF"; gchar *key_1 = "\xE2\x81\x80"; gchar current[25]; gchar *str; guint n_bytes, nth; guint i; gboolean success; /* test single char 0-9 */ success = TRUE; for(i = 0; i < 10; i++){ current[0] = '0' + i; current[1] = '\0'; str = ags_turtle_read_pn_chars(current, current + 2); if(g_ascii_strncasecmp(current, str, 2)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* test dash */ str = ags_turtle_read_pn_chars(dash, dash + 2); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(dash, str, 2)); /* test bullet */ str = ags_turtle_read_pn_chars(bullet, bullet + 2); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(bullet, str, 2)); /* test random string */ success = TRUE; for(i = 0; i < AGS_TURTLE_TEST_READ_PN_CHARS_BASE_ITERATION_COUNT; i++){ guint range; nth = 0; n_bytes = 0; range = rand() % 2; switch(range){ case 0: { current[nth] = 0xCC; current[nth + 1] = 0xB0 + (rand() % 16); n_bytes = 2; } break; case 1: { current[nth] = 0xCD; current[nth + 1] = 0x80 + (rand() % 48); n_bytes = 2; } break; } current[nth + n_bytes] = '\0'; str = ags_turtle_read_pn_chars(current, current + n_bytes); if(str == NULL || g_ascii_strncasecmp(current, str, n_bytes)){ success = FALSE; break; } } CU_ASSERT(success == TRUE); /* test key_0 */ str = ags_turtle_read_pn_chars(key_0, key_0 + 2); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(key_0, str, 2)); /* test key_1 */ str = ags_turtle_read_pn_chars(key_1, key_1 + 2); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(key_1, str, 2)); } void ags_turtle_test_read_pn_prefix() { gchar *no_prefix = "."; gchar *str; static const gchar *prefix[] = { "aa.", "aaa...", "aaa.zzz", "aaa...zzz", }; /* test prefix 0 */ str = ags_turtle_read_pn_prefix(prefix[0], prefix[0] + strlen(prefix[0])); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(prefix[0], str, strlen(prefix[0]))); /* test prefix 1 */ str = ags_turtle_read_pn_prefix(prefix[1], prefix[1] + strlen(prefix[1])); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(prefix[1], str, strlen(prefix[1]))); /* test prefix 2 */ str = ags_turtle_read_pn_prefix(prefix[2], prefix[2] + strlen(prefix[2])); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(prefix[2], str, strlen(prefix[2]))); /* test prefix 3 */ str = ags_turtle_read_pn_prefix(prefix[3], prefix[3] + strlen(prefix[3])); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(prefix[3], str, strlen(prefix[3]))); /* test no prefix */ str = ags_turtle_read_pn_prefix(no_prefix, no_prefix + strlen(no_prefix)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_pn_local() { gchar *no_local = "%"; gchar *str; static const gchar *local[] = { "::", "_:", ":_", "_a", ":%00:", ":%ff:", "zzz:", "000.999", "0xff", }; guint i; /* test local 0 */ for(i = 0; i < 9; i++){ str = ags_turtle_read_pn_local(local[i], local[i] + strlen(local[i])); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(local[i], str, strlen(local[i]))); } /* test no local */ str = ags_turtle_read_pn_local(no_local, no_local + strlen(no_local)); CU_ASSERT(str == NULL); } void ags_turtle_test_read_plx() { //TODO:JK: implement me } void ags_turtle_test_read_percent() { gchar percent[4]; gchar *hex = "0123456789abcdef"; gchar *str; guint i, j; gboolean success; percent[0] = '%'; percent[3] = '\0'; success = TRUE; for(i = 0; i < 16; i++){ percent[1] = hex[i]; for(j = 0; j < 16; j++){ percent[2] = hex[j]; str = ags_turtle_read_percent(percent, percent + strlen(percent)); if(str == NULL || g_ascii_strncasecmp(percent, str, 4)){ success = FALSE; break; } } } CU_ASSERT(success == TRUE); } void ags_turtle_test_read_hex() { gchar hex[2]; //TODO:JK: implement me } void ags_turtle_test_read_pn_local_esc() { gchar local_esc[3]; gchar *escapes = "\\_~.-!$&()*+,;=/?#@%"; gchar *str; guint i; local_esc[0] = '\\'; local_esc[2] = '\0'; for(i = 0; i < strlen(escapes); i++){ local_esc[1] = escapes[i]; str = ags_turtle_read_pn_local_esc(local_esc, local_esc + strlen(local_esc)); CU_ASSERT(str != NULL && !g_ascii_strncasecmp(local_esc, str, 3)); } } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsTurtleTest", ags_turtle_test_init_suite, ags_turtle_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsTurtle read iriref", ags_turtle_test_read_iriref) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read prefixed name namespace", ags_turtle_test_read_pname_ns) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read prefixed name localized name", ags_turtle_test_read_pname_ln) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read blank node label", ags_turtle_test_read_blank_node_label) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read language tag", ags_turtle_test_read_langtag) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read boolean", ags_turtle_test_read_boolean) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read integer", ags_turtle_test_read_integer) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read decimal", ags_turtle_test_read_decimal) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read double", ags_turtle_test_read_double) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read exponent", ags_turtle_test_read_exponent) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read string", ags_turtle_test_read_string) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read string literal quote", ags_turtle_test_read_string_literal_quote) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read string literal single quote", ags_turtle_test_read_string_literal_single_quote) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read string literal long quote", ags_turtle_test_read_string_literal_long_quote) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read string literal long single quote", ags_turtle_test_read_string_literal_long_single_quote) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read uchar", ags_turtle_test_read_uchar) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read echar", ags_turtle_test_read_echar) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read ws", ags_turtle_test_read_ws) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read anon", ags_turtle_test_read_anon) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read pn-chars base", ags_turtle_test_read_pn_chars_base) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read pn-chars u", ags_turtle_test_read_pn_chars_u) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read pn-chars", ags_turtle_test_read_pn_chars) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read pn-prefix", ags_turtle_test_read_pn_prefix) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read pn-local", ags_turtle_test_read_pn_local) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read plx", ags_turtle_test_read_plx) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read percent", ags_turtle_test_read_percent) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read hex", ags_turtle_test_read_hex) == NULL) || (CU_add_test(pSuite, "test of AgsTurtle read pn-local esc", ags_turtle_test_read_pn_local_esc) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/ags_turtle_manager_test.c0000644000175000017500000001163313605312646020157 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_turtle_manager_test_init_suite(); int ags_turtle_manager_test_clean_suite(); void ags_turtle_manager_test_find(); void ags_turtle_manager_test_add(); #define AGS_TURTLE_MANAGER_TEST_FIND_MICHAELANGELO "Michael-Angelo.rdf" #define AGS_TURTLE_MANAGER_TEST_FIND_RAPHAEL "Raphael.rdf" #define AGS_TURTLE_MANAGER_TEST_FIND_LEONARDO "Leonardo.rdf" #define AGS_TURTLE_MANAGER_TEST_FIND_DONATELLO "Donatello.rdf" #define AGS_TURTLE_MANAGER_TEST_ADD_DEFAULT "Default" /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_turtle_manager_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_turtle_manager_test_clean_suite() { return(0); } void ags_turtle_manager_test_find() { AgsTurtleManager *turtle_manager; AgsTurtle *turtle[4], *current; turtle_manager = ags_turtle_manager_get_instance(); /* turtle #0 */ turtle[0] = ags_turtle_new(AGS_TURTLE_MANAGER_TEST_FIND_MICHAELANGELO); ags_turtle_manager_add(turtle_manager, turtle[0]); /* turtle #1 */ turtle[1] = ags_turtle_new(AGS_TURTLE_MANAGER_TEST_FIND_RAPHAEL); ags_turtle_manager_add(turtle_manager, turtle[1]); /* turtle #2 */ turtle[2] = ags_turtle_new(AGS_TURTLE_MANAGER_TEST_FIND_LEONARDO); ags_turtle_manager_add(turtle_manager, turtle[2]); /* turtle #3 */ turtle[3] = ags_turtle_new(AGS_TURTLE_MANAGER_TEST_FIND_DONATELLO); ags_turtle_manager_add(turtle_manager, turtle[3]); /* assert find */ CU_ASSERT((current = ags_turtle_manager_find(turtle_manager, AGS_TURTLE_MANAGER_TEST_FIND_MICHAELANGELO)) != NULL && current == turtle[0]); CU_ASSERT((current = ags_turtle_manager_find(turtle_manager, AGS_TURTLE_MANAGER_TEST_FIND_RAPHAEL)) != NULL && current == turtle[1]); CU_ASSERT((current = ags_turtle_manager_find(turtle_manager, AGS_TURTLE_MANAGER_TEST_FIND_LEONARDO)) != NULL && current == turtle[2]); CU_ASSERT((current = ags_turtle_manager_find(turtle_manager, AGS_TURTLE_MANAGER_TEST_FIND_DONATELLO)) != NULL && current == turtle[3]); /* unref turtle manager */ g_object_unref(turtle_manager); } void ags_turtle_manager_test_add() { AgsTurtleManager *turtle_manager; AgsTurtle *turtle; gchar *str; guint i; turtle_manager = ags_turtle_manager_get_instance(); /* add turtle - #0 */ i = 0; str = g_strdup_printf("%s %d", AGS_TURTLE_MANAGER_TEST_ADD_DEFAULT, i); i++; turtle = ags_turtle_new(str); ags_turtle_manager_add(turtle_manager, turtle); /* add turtle - #1 */ str = g_strdup_printf("%s %d", AGS_TURTLE_MANAGER_TEST_ADD_DEFAULT, i); i++; turtle = ags_turtle_new(str); ags_turtle_manager_add(turtle_manager, turtle); /* add turtle - #2 */ str = g_strdup_printf("%s %d", AGS_TURTLE_MANAGER_TEST_ADD_DEFAULT, i); i++; turtle = ags_turtle_new(str); ags_turtle_manager_add(turtle_manager, turtle); /* assert count equals 3 */ CU_ASSERT(g_list_length(turtle_manager->turtle) == 3); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsTurtleManagerTest", ags_turtle_manager_test_init_suite, ags_turtle_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsTurtleManager find", ags_turtle_manager_test_find) == NULL) || (CU_add_test(pSuite, "test of AgsTurtleManager add", ags_turtle_manager_test_add) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/ags_log_test.c0000644000175000017500000001066213605312646015730 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_log_test_init_suite(); int ags_log_test_clean_suite(); void ags_log_test_add_message(); void ags_log_test_get_messages(); #define AGS_LOG_TEST_ADD_MESSAGE_START_ENGINE "start engine" #define AGS_LOG_TEST_ADD_MESSAGE_LOAD_PLUGINS "load plugins" #define AGS_LOG_TEST_ADD_MESSAGE_APPLICATION_READY "application ready" #define AGS_LOG_TEST_ADD_MESSAGE_STOP_ENGINE "stop engine" #define AGS_LOG_TEST_GET_MESSAGES_DEFAULT "default" /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_log_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_log_test_clean_suite() { return(0); } void ags_log_test_add_message() { AgsLog *log; log = ags_log_get_instance(); /* message - start engine */ ags_log_add_message(log, AGS_LOG_TEST_ADD_MESSAGE_START_ENGINE); CU_ASSERT(g_list_find_custom(g_atomic_pointer_get(&(log->messages)), AGS_LOG_TEST_ADD_MESSAGE_START_ENGINE, g_strcmp0) != NULL); /* message - load plugins */ ags_log_add_message(log, AGS_LOG_TEST_ADD_MESSAGE_LOAD_PLUGINS); CU_ASSERT(g_list_find_custom(g_atomic_pointer_get(&(log->messages)), AGS_LOG_TEST_ADD_MESSAGE_LOAD_PLUGINS, g_strcmp0) != NULL); /* message - application ready */ ags_log_add_message(log, AGS_LOG_TEST_ADD_MESSAGE_APPLICATION_READY); CU_ASSERT(g_list_find_custom(g_atomic_pointer_get(&(log->messages)), AGS_LOG_TEST_ADD_MESSAGE_APPLICATION_READY, g_strcmp0) != NULL); /* message - stop engine */ ags_log_add_message(log, AGS_LOG_TEST_ADD_MESSAGE_STOP_ENGINE); CU_ASSERT(g_list_find_custom(g_atomic_pointer_get(&(log->messages)), AGS_LOG_TEST_ADD_MESSAGE_STOP_ENGINE, g_strcmp0) != NULL); /* unref log */ g_object_unref(log); } void ags_log_test_get_messages() { AgsLog *log; gchar *str; guint i; log = ags_log_get_instance(); /* assert initial NULL */ CU_ASSERT(ags_log_get_messages(log) == NULL); /* add messages - #0 */ i = 0; str = g_strdup_printf("%s %d", AGS_LOG_TEST_GET_MESSAGES_DEFAULT, i); i++; ags_log_add_message(log, str); /* add messages - #1 */ str = g_strdup_printf("%s %d", AGS_LOG_TEST_GET_MESSAGES_DEFAULT, i); i++; ags_log_add_message(log, str); /* add messages - #2 */ i = 0; str = g_strdup_printf("%s %d", AGS_LOG_TEST_GET_MESSAGES_DEFAULT, i); i++; ags_log_add_message(log, str); /* assert list length equals 3 */ CU_ASSERT(g_list_length(ags_log_get_messages(log)) == 3); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsLogTest", ags_log_test_init_suite, ags_log_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsLog add message", ags_log_test_add_message) == NULL) || (CU_add_test(pSuite, "test of AgsLog get messages", ags_log_test_get_messages) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/lib/ags_buffer_util_test.c0000644000175000017500000010070713605312646017455 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include int ags_buffer_util_test_init_suite(); int ags_buffer_util_test_clean_suite(); void ags_buffer_util_test_s8_to_char_buffer(); void ags_buffer_util_test_s16_to_char_buffer(); void ags_buffer_util_test_s24_to_char_buffer(); void ags_buffer_util_test_s32_to_char_buffer(); void ags_buffer_util_test_s64_to_char_buffer(); void ags_buffer_util_test_float_to_char_buffer(); void ags_buffer_util_test_double_to_char_buffer(); void ags_buffer_util_test_char_buffer_to_s8(); void ags_buffer_util_test_char_buffer_to_s16(); void ags_buffer_util_test_char_buffer_to_s24(); void ags_buffer_util_test_char_buffer_to_s32(); void ags_buffer_util_test_char_buffer_to_s64(); void ags_buffer_util_test_char_buffer_to_float(); void ags_buffer_util_test_char_buffer_to_double(); void ags_buffer_util_test_read_s8(); void ags_buffer_util_test_read_s16(); void ags_buffer_util_test_read_s24(); void ags_buffer_util_test_read_s32(); void ags_buffer_util_test_read_s64(); void ags_buffer_util_test_read_float(); void ags_buffer_util_test_read_double(); void ags_buffer_util_test_write_s8(); void ags_buffer_util_test_write_s16(); void ags_buffer_util_test_write_s24(); void ags_buffer_util_test_write_s32(); void ags_buffer_util_test_write_s64(); void ags_buffer_util_test_write_float(); void ags_buffer_util_test_write_double(); void ags_buffer_util_test_swap_bytes(); #define AGS_BUFFER_UTIL_TEST_MAX_S24 (0x7fffff) /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_util_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_buffer_util_test_clean_suite() { return(0); } void ags_buffer_util_test_s8_to_char_buffer() { gint8 source[] = {0x80, 0x7f, 0xff, 0x01, 0x00, 0xa0, 0xb0, 0xde, 0xad, 0xbe, 0xef, 0x10, 0xaf, 0xfe, 0x00, 0x00}; guchar *retval; retval = ags_buffer_util_s8_to_char_buffer(source, 16); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_s16_to_char_buffer() { gint16 source[] = { G_MAXINT16, G_MAXINT16 * (7.0 / 8.0), G_MAXINT16 * (6.0 / 8.0), G_MAXINT16 * (5.0 / 8.0), G_MAXINT16 * (4.0 / 8.0), G_MAXINT16 * (3.0 / 8.0), G_MAXINT16 * (2.0 / 8.0), G_MAXINT16 * (1.0 / 8.0), 0, -1 * G_MAXINT16 * (1.0 / 8.0), -1 * G_MAXINT16 * (2.0 / 8.0), -1 * G_MAXINT16 * (3.0 / 8.0), -1 * G_MAXINT16 * (4.0 / 8.0), -1 * G_MAXINT16 * (5.0 / 8.0), -1 * G_MAXINT16 * (6.0 / 8.0), -1 * G_MAXINT16 * (7.0 / 8.0), -1 * G_MAXINT16, }; guchar *retval; retval = ags_buffer_util_s16_to_char_buffer(source, 17); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_s24_to_char_buffer() { gint32 source[] = { AGS_BUFFER_UTIL_TEST_MAX_S24, AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0), AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0), AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0), AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0), AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0), AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0), AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0), 0, -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0), -1 * AGS_BUFFER_UTIL_TEST_MAX_S24, }; guchar *retval; retval = ags_buffer_util_s24_to_char_buffer(source, 17); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_s32_to_char_buffer() { gint32 source[] = { G_MAXINT32, G_MAXINT32 * (7.0 / 8.0), G_MAXINT32 * (6.0 / 8.0), G_MAXINT32 * (5.0 / 8.0), G_MAXINT32 * (4.0 / 8.0), G_MAXINT32 * (3.0 / 8.0), G_MAXINT32 * (2.0 / 8.0), G_MAXINT32 * (1.0 / 8.0), 0, -1 * G_MAXINT32 * (1.0 / 8.0), -1 * G_MAXINT32 * (2.0 / 8.0), -1 * G_MAXINT32 * (3.0 / 8.0), -1 * G_MAXINT32 * (4.0 / 8.0), -1 * G_MAXINT32 * (5.0 / 8.0), -1 * G_MAXINT32 * (6.0 / 8.0), -1 * G_MAXINT32 * (7.0 / 8.0), -1 * G_MAXINT32, }; guchar *retval; retval = ags_buffer_util_s32_to_char_buffer(source, 17); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_s64_to_char_buffer() { gint64 source[] = { G_MAXINT64, G_MAXINT64 * (7.0 / 8.0), G_MAXINT64 * (6.0 / 8.0), G_MAXINT64 * (5.0 / 8.0), G_MAXINT64 * (4.0 / 8.0), G_MAXINT64 * (3.0 / 8.0), G_MAXINT64 * (2.0 / 8.0), G_MAXINT64 * (1.0 / 8.0), 0, -1 * G_MAXINT64 * (1.0 / 8.0), -1 * G_MAXINT64 * (2.0 / 8.0), -1 * G_MAXINT64 * (3.0 / 8.0), -1 * G_MAXINT64 * (4.0 / 8.0), -1 * G_MAXINT64 * (5.0 / 8.0), -1 * G_MAXINT64 * (6.0 / 8.0), -1 * G_MAXINT64 * (7.0 / 8.0), -1 * G_MAXINT64, }; guchar *retval; retval = ags_buffer_util_s64_to_char_buffer(source, 17); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_float_to_char_buffer() { gfloat source[] = { 1.0, 1.0 * (7.0 / 8.0), 1.0 * (6.0 / 8.0), 1.0 * (5.0 / 8.0), 1.0 * (4.0 / 8.0), 1.0 * (3.0 / 8.0), 1.0 * (2.0 / 8.0), 1.0 * (1.0 / 8.0), 0.0, -1.0 * (1.0 / 8.0), -1.0 * (2.0 / 8.0), -1.0 * (3.0 / 8.0), -1.0 * (4.0 / 8.0), -1.0 * (5.0 / 8.0), -1.0 * (6.0 / 8.0), -1.0 * (7.0 / 8.0), -1.0, }; guchar *retval; retval = ags_buffer_util_float_to_char_buffer(source, 17); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_double_to_char_buffer() { gdouble source[] = { 1.0, 1.0 * (7.0 / 8.0), 1.0 * (6.0 / 8.0), 1.0 * (5.0 / 8.0), 1.0 * (4.0 / 8.0), 1.0 * (3.0 / 8.0), 1.0 * (2.0 / 8.0), 1.0 * (1.0 / 8.0), 0.0, -1.0 * (1.0 / 8.0), -1.0 * (2.0 / 8.0), -1.0 * (3.0 / 8.0), -1.0 * (4.0 / 8.0), -1.0 * (5.0 / 8.0), -1.0 * (6.0 / 8.0), -1.0 * (7.0 / 8.0), -1.0, }; guchar *retval; retval = ags_buffer_util_double_to_char_buffer(source, 17); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_s8() { guchar source[] = {0x80, 0x7f, 0xff, 0x01, 0x00, 0xa0, 0xb0, 0xde, 0xad, 0xbe, 0xef, 0x10, 0xaf, 0xfe, 0x00, 0x00}; gint8 *retval; retval = ags_buffer_util_char_buffer_to_s8(source, 16 * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_s16() { guchar source[] = { 0xff & (gint16) (G_MAXINT16), (0xff00 & (gint16) (G_MAXINT16)) >> 8, 0xff & (gint16) (G_MAXINT16 * (7.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (7.0 / 8.0))) >> 8, 0xff & (gint16) (G_MAXINT16 * (6.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (6.0 / 8.0))) >> 8, 0xff & (gint16) (G_MAXINT16 * (5.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (5.0 / 8.0))) >> 8, 0xff & (gint16) (G_MAXINT16 * (4.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (4.0 / 8.0))) >> 8, 0xff & (gint16) (G_MAXINT16 * (3.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (3.0 / 8.0))) >> 8, 0xff & (gint16) (G_MAXINT16 * (2.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (2.0 / 8.0))) >> 8, 0xff & (gint16) (G_MAXINT16 * (1.0 / 8.0)), (0xff00 & (gint16) (G_MAXINT16 * (1.0 / 8.0))) >> 8, 0, 0, 0xff & (gint16) (-1 * G_MAXINT16 * (1.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (1.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16 * (2.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (2.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16 * (3.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (3.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16 * (4.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (4.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16 * (5.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (5.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16 * (6.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (6.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16 * (7.0 / 8.0)), (0xff00 & (gint16) (-1 * G_MAXINT16 * (7.0 / 8.0))) >> 8, 0xff & (gint16) (-1 * G_MAXINT16), (0xff00 & (gint16) (-1 * G_MAXINT16)) >> 8, }; gint16 *retval; retval = ags_buffer_util_char_buffer_to_s16(source, (2 * 17) * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_s24() { guchar source[] = { 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24)) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24)) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0))) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0))) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0))) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0))) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0))) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0))) >> 16, 0, 0xff & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0)), (0xff00 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint32) (AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0))) >> 16, 0, 0, 0, 0, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (1.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (2.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (3.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (4.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (5.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (6.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0)), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24 * (7.0 / 8.0))) >> 16, 0, 0xff & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24), (0xff00 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24)) >> 8, (0xff0000 & (gint32) (-1 * AGS_BUFFER_UTIL_TEST_MAX_S24)) >> 16, 0, }; gint32 *retval; retval = ags_buffer_util_char_buffer_to_s24(source, (4 * 17) * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_s32() { guchar source[] = { 0xff & (gint32) (G_MAXINT32), (0xff00 & (gint32) (G_MAXINT32)) >> 8, (0xff0000 & (gint32) (G_MAXINT32)) >> 16, (0xff000000 & (gint32) (G_MAXINT32)) >> 24, 0xff & (gint32) (G_MAXINT32 * (7.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (7.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (7.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (7.0 / 8.0))) >> 24, 0xff & (gint32) (G_MAXINT32 * (6.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (6.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (6.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (6.0 / 8.0))) >> 24, 0xff & (gint32) (G_MAXINT32 * (5.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (5.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (5.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (5.0 / 8.0))) >> 24, 0xff & (gint32) (G_MAXINT32 * (4.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (4.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (4.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (4.0 / 8.0))) >> 24, 0xff & (gint32) (G_MAXINT32 * (3.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (3.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (3.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (3.0 / 8.0))) >> 24, 0xff & (gint32) (G_MAXINT32 * (2.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (2.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (2.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (2.0 / 8.0))) >> 24, 0xff & (gint32) (G_MAXINT32 * (1.0 / 8.0)), (0xff00 & (gint32) (G_MAXINT32 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint32) (G_MAXINT32 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint32) (G_MAXINT32 * (1.0 / 8.0))) >> 24, 0, 0, 0, 0, 0xff & (gint32) (-1 * G_MAXINT32 * (1.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (1.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32 * (2.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (2.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (2.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (2.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32 * (3.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (3.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (3.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (3.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32 * (4.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (4.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (4.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (4.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32 * (5.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (5.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (5.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (5.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32 * (6.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (6.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (6.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (6.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32 * (7.0 / 8.0)), (0xff00 & (gint32) (-1 * G_MAXINT32 * (7.0 / 8.0))) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32 * (7.0 / 8.0))) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32 * (7.0 / 8.0))) >> 24, 0xff & (gint32) (-1 * G_MAXINT32), (0xff00 & (gint32) (-1 * G_MAXINT32)) >> 8, (0xff0000 & (gint32) (-1 * G_MAXINT32)) >> 16, (0xff000000 & (gint32) (-1 * G_MAXINT32)) >> 24, }; gint32 *retval; retval = ags_buffer_util_char_buffer_to_s32(source, (4 * 17) * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_s64() { guchar source[] = { 0xff & (gint64) (G_MAXINT64), (0xff00 & (gint64) (G_MAXINT64)) >> 8, (0xff0000 & (gint64) (G_MAXINT64)) >> 16, (0xff000000 & (gint64) (G_MAXINT64)) >> 24, (0xff00000000 & (gint64) (G_MAXINT64)) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64)) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64)) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64)) >> 56, 0xff & (gint64) (G_MAXINT64 * (7.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (7.0 / 8.0))) >> 56, 0xff & (gint64) (G_MAXINT64 * (6.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (6.0 / 8.0))) >> 56, 0xff & (gint64) (G_MAXINT64 * (5.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (5.0 / 8.0))) >> 56, 0xff & (gint64) (G_MAXINT64 * (4.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (4.0 / 8.0))) >> 56, 0xff & (gint64) (G_MAXINT64 * (3.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (3.0 / 8.0))) >> 56, 0xff & (gint64) (G_MAXINT64 * (2.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (2.0 / 8.0))) >> 56, 0xff & (gint64) (G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (G_MAXINT64 * (1.0 / 8.0))) >> 56, 0, 0, 0, 0, 0, 0, 0, 0, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0)), (0xff00 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 48, (0xff00000000000000 & (gint64) (-1 * G_MAXINT64 * (1.0 / 8.0))) >> 56, 0xff & (gint64) (-1 * G_MAXINT64), (0xff00 & (gint64) (-1 * G_MAXINT64)) >> 8, (0xff0000 & (gint64) (-1 * G_MAXINT64)) >> 16, (0xff000000 & (gint64) (-1 * G_MAXINT64)) >> 24, (0xff00000000 & (gint64) (-1 * G_MAXINT64)) >> 32, (0xff0000000000 & (gint64) (-1 * G_MAXINT64)) >> 40, (0xff000000000000 & (gint64) (-1 * G_MAXINT64)) >> 48, }; gint64 *retval; retval = ags_buffer_util_char_buffer_to_s64(source, (8 * 17) * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_float() { guchar source[17 * sizeof(guint32)]; union{ guint32 val; GFloatIEEE754 ieee_float; }data; gfloat *retval; guint i; for(i = 0; i < 8; i++){ data.ieee_float.v_float = 1.0 * ((8 - i) / 8.0); source[i * sizeof(guint32)] = 0xff & (data.val); source[i * sizeof(guint32) + 1] = (0xff00 & (data.val)) >> 8; source[i * sizeof(guint32) + 2] = (0xff0000 & (data.val)) >> 16; source[i * sizeof(guint32) + 3] = (0xff000000 & (data.val)) >> 24; } data.ieee_float.v_float = 0.0; source[i * sizeof(guint32)] = 0xff & (data.val); source[i * sizeof(guint32) + 1] = (0xff00 & (data.val)) >> 8; source[i * sizeof(guint32) + 2] = (0xff0000 & (data.val)) >> 16; source[i * sizeof(guint32) + 3] = (0xff000000 & (data.val)) >> 24; for(i = 0; i < 8; i++){ data.ieee_float.v_float = -1.0 * (i / 8.0); source[(i + 9) * sizeof(guint32)] = 0xff & (data.val); source[(i + 9) * sizeof(guint32) + 1] = (0xff00 & (data.val)) >> 8; source[(i + 9) * sizeof(guint32) + 2] = (0xff0000 & (data.val)) >> 16; source[(i + 9) * sizeof(guint32) + 3] = (0xff000000 & (data.val)) >> 24; } retval = ags_buffer_util_char_buffer_to_float(source, (17 * sizeof(guint32)) * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_char_buffer_to_double() { guchar source[17 * sizeof(guint64)]; union{ guint64 val; GDoubleIEEE754 ieee_double; }data; gdouble *retval; guint i; for(i = 0; i < 8; i++){ data.ieee_double.v_double = 1.0 * ((8 - i) / 8.0); source[i * sizeof(guint64)] = 0xff & (data.val); source[i * sizeof(guint64) + 1] = (0xff00 & (data.val)) >> 8; source[i * sizeof(guint64) + 2] = (0xff0000 & (data.val)) >> 16; source[i * sizeof(guint64) + 3] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 4] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 5] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 6] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 7] = (0xff000000 & (data.val)) >> 24; } data.ieee_double.v_double = 0.0; source[i * sizeof(guint64)] = 0xff & (data.val); source[i * sizeof(guint64) + 1] = (0xff00 & (data.val)) >> 8; source[i * sizeof(guint64) + 2] = (0xff0000 & (data.val)) >> 16; source[i * sizeof(guint64) + 3] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 4] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 5] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 6] = (0xff000000 & (data.val)) >> 24; source[i * sizeof(guint64) + 7] = (0xff000000 & (data.val)) >> 24; for(i = 0; i < 8; i++){ data.ieee_double.v_double = -1.0 * (i / 8.0); source[(i + 9) * sizeof(guint64)] = 0xff & (data.val); source[(i + 9) * sizeof(guint64) + 1] = (0xff00 & (data.val)) >> 8; source[(i + 9) * sizeof(guint64) + 2] = (0xff0000 & (data.val)) >> 16; source[(i + 9) * sizeof(guint64) + 3] = (0xff000000 & (data.val)) >> 24; source[(i + 9) * sizeof(guint64) + 4] = (0xff000000 & (data.val)) >> 24; source[(i + 9) * sizeof(guint64) + 5] = (0xff000000 & (data.val)) >> 24; source[(i + 9) * sizeof(guint64) + 6] = (0xff000000 & (data.val)) >> 24; source[(i + 9) * sizeof(guint64) + 7] = (0xff000000 & (data.val)) >> 24; } retval = ags_buffer_util_char_buffer_to_double(source, (17 * sizeof(guint64)) * sizeof(guchar)); CU_ASSERT(retval != NULL); } void ags_buffer_util_test_read_s8() { //TODO:JK: implement me } void ags_buffer_util_test_read_s16() { //TODO:JK: implement me } void ags_buffer_util_test_read_s24() { //TODO:JK: implement me } void ags_buffer_util_test_read_s32() { //TODO:JK: implement me } void ags_buffer_util_test_read_s64() { //TODO:JK: implement me } void ags_buffer_util_test_read_float() { //TODO:JK: implement me } void ags_buffer_util_test_read_double() { //TODO:JK: implement me } void ags_buffer_util_test_write_s8() { //TODO:JK: implement me } void ags_buffer_util_test_write_s16() { //TODO:JK: implement me } void ags_buffer_util_test_write_s24() { //TODO:JK: implement me } void ags_buffer_util_test_write_s32() { //TODO:JK: implement me } void ags_buffer_util_test_write_s64() { //TODO:JK: implement me } void ags_buffer_util_test_write_float() { //TODO:JK: implement me } void ags_buffer_util_test_write_double() { //TODO:JK: implement me } void ags_buffer_util_test_swap_bytes() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsBufferUtilTest", ags_buffer_util_test_init_suite, ags_buffer_util_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of ags_buffer_util.c s8 to char buffer", ags_buffer_util_test_s8_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c s16 to char buffer", ags_buffer_util_test_s16_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c s24 to char buffer", ags_buffer_util_test_s24_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c s32 to char buffer", ags_buffer_util_test_s32_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c s64 to char buffer", ags_buffer_util_test_s64_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c float to char buffer", ags_buffer_util_test_float_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c double to char buffer", ags_buffer_util_test_double_to_char_buffer) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to s8", ags_buffer_util_test_char_buffer_to_s8) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to s16", ags_buffer_util_test_char_buffer_to_s16) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to s24", ags_buffer_util_test_char_buffer_to_s24) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to s32", ags_buffer_util_test_char_buffer_to_s32) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to s64", ags_buffer_util_test_char_buffer_to_s64) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to float", ags_buffer_util_test_char_buffer_to_float) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c char buffer to double", ags_buffer_util_test_char_buffer_to_double) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read s8", ags_buffer_util_test_read_s8) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read s16", ags_buffer_util_test_read_s16) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read s24", ags_buffer_util_test_read_s24) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read s32", ags_buffer_util_test_read_s32) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read s64", ags_buffer_util_test_read_s64) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read float", ags_buffer_util_test_read_float) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c read double", ags_buffer_util_test_read_double) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write s8", ags_buffer_util_test_write_s8) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write s16", ags_buffer_util_test_write_s16) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write s24", ags_buffer_util_test_write_s24) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write s32", ags_buffer_util_test_write_s32) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write s64", ags_buffer_util_test_write_s64) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write float", ags_buffer_util_test_write_float) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c write double", ags_buffer_util_test_write_double) == NULL) || (CU_add_test(pSuite, "test of ags_buffer_util.c swap bytes", ags_buffer_util_test_swap_bytes) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/object/0000755000175000017500000000000013622252263013662 500000000000000gsequencer-3.1.3/ags/test/object/ags_soundcard_test.c0000644000175000017500000010511213607210263017616 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_soundcard_test_init_suite(); int ags_soundcard_test_clean_suite(); void ags_soundcard_test_set_device(); void ags_soundcard_test_get_device(); void ags_soundcard_test_pcm_info(); void ags_soundcard_test_get_capability(); void ags_soundcard_test_set_presets(); void ags_soundcard_test_get_presets(); void ags_soundcard_test_list_cards(); void ags_soundcard_test_is_available(); void ags_soundcard_test_is_starting(); void ags_soundcard_test_is_playing(); void ags_soundcard_test_is_recording(); void ags_soundcard_test_get_uptime(); void ags_soundcard_test_play_init(); void ags_soundcard_test_play(); void ags_soundcard_test_record_init(); void ags_soundcard_test_record(); void ags_soundcard_test_stop(); void ags_soundcard_test_tic(); void ags_soundcard_test_offset_changed(); void ags_soundcard_test_get_buffer(); void ags_soundcard_test_get_next_buffer(); void ags_soundcard_test_get_prev_buffer(); void ags_soundcard_test_lock_buffer(); void ags_soundcard_test_unlock_buffer(); void ags_soundcard_test_set_bpm(); void ags_soundcard_test_get_bpm(); void ags_soundcard_test_set_delay_factor(); void ags_soundcard_test_get_delay_factor(); void ags_soundcard_test_get_absolute_delay(); void ags_soundcard_test_get_delay(); void ags_soundcard_test_get_attack(); void ags_soundcard_test_get_delay_counter(); void ags_soundcard_test_set_note_offset(); void ags_soundcard_test_get_note_offset(); void ags_soundcard_test_set_note_offset_absolute(); void ags_soundcard_test_get_note_offset_absolute(); void ags_soundcard_test_set_loop(); void ags_soundcard_test_get_loop(); void ags_soundcard_test_get_loop_offset(); #define AGS_SOUNDCARD_TEST_SET_DEVICE_DEVICE "ags-test-default-0" #define AGS_SOUNDCARD_TEST_SET_PRESETS_CHANNELS (2) #define AGS_SOUNDCARD_TEST_SET_PRESETS_SAMPLERATE (44100) #define AGS_SOUNDCARD_TEST_SET_PRESETS_BUFFER_SIZE (512) #define AGS_SOUNDCARD_TEST_SET_PRESETS_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_SOUNDCARD_TEST_SET_BPM_BPM (145.0) #define AGS_SOUNDCARD_TEST_SET_DELAY_FACTOR_DELAY_FACTOR (1.0 / 8.0) #define AGS_SOUNDCARD_TEST_SET_NOTE_OFFSET_NOTE_OFFSET (16 * 64) #define AGS_SOUNDCARD_TEST_SET_NOTE_OFFSET_ABSOLUTE_NOTE_OFFSET (16 * 64) #define AGS_SOUNDCARD_TEST_SET_LOOP_LOOP_LEFT (0) #define AGS_SOUNDCARD_TEST_SET_LOOP_LOOP_RIGHT (16 * 4) #define AGS_SOUNDCARD_TEST_SET_DO_LOOP (TRUE) GType soundcard_test_types[10]; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_soundcard_test_init_suite() { guint i; i = 0; soundcard_test_types[i++] = AGS_TYPE_DEVOUT; soundcard_test_types[i++] = AGS_TYPE_DEVIN; soundcard_test_types[i++] = AGS_TYPE_CORE_AUDIO_DEVOUT; soundcard_test_types[i++] = AGS_TYPE_CORE_AUDIO_DEVIN; soundcard_test_types[i++] = AGS_TYPE_JACK_DEVOUT; soundcard_test_types[i++] = AGS_TYPE_JACK_DEVIN; soundcard_test_types[i++] = AGS_TYPE_PULSE_DEVOUT; soundcard_test_types[i++] = AGS_TYPE_PULSE_DEVIN; soundcard_test_types[i++] = AGS_TYPE_WASAPI_DEVOUT; soundcard_test_types[i++] = AGS_TYPE_WASAPI_DEVIN; soundcard_test_types[i++] = G_TYPE_NONE; return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_soundcard_test_clean_suite() { return(0); } void ags_soundcard_test_set_device() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_device == NULL){ g_message("AgsSoundcard::set-device missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_device(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_DEVICE_DEVICE); } CU_ASSERT(success); } void ags_soundcard_test_get_device() { GObject *current; GType current_type; gchar *retval; guint i; gboolean success; success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_device == NULL){ g_message("AgsSoundcard::get-device missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_pcm_info() { GObject *current; GType current_type; gchar *retval; guint i; gboolean success; GError *error; success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->pcm_info == NULL){ g_message("AgsSoundcard::pcm-info missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } error = NULL; ags_soundcard_pcm_info(AGS_SOUNDCARD(current), NULL, NULL, NULL, NULL, NULL, NULL, NULL, &error); if(error != NULL){ g_message("%s", error->message); } } CU_ASSERT(success); } void ags_soundcard_test_get_capability() { GObject *current; GType current_type; guint retval; guint i; gboolean success; success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_capability == NULL){ g_message("AgsSoundcard::get-capability missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_capability(AGS_SOUNDCARD(current)); if(!(retval == AGS_SOUNDCARD_CAPABILITY_PLAYBACK || retval == AGS_SOUNDCARD_CAPABILITY_CAPTURE)){ g_message("AgsSoundcard::get-capability failed: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_set_presets() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_presets == NULL){ g_message("AgsSoundcard::set-presets missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_presets(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_PRESETS_CHANNELS, AGS_SOUNDCARD_TEST_SET_PRESETS_SAMPLERATE, AGS_SOUNDCARD_TEST_SET_PRESETS_BUFFER_SIZE, AGS_SOUNDCARD_TEST_SET_PRESETS_FORMAT); } CU_ASSERT(success); } void ags_soundcard_test_get_presets() { GObject *current; GType current_type; guint channels; guint samplerate; guint buffer_size; guint format; guint i; gboolean success; success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_presets == NULL){ g_message("AgsSoundcard::get-presets missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_get_presets(AGS_SOUNDCARD(current), &channels, &samplerate, &buffer_size, &format); } CU_ASSERT(success); } void ags_soundcard_test_list_cards() { AgsApplicationContext *application_context; GObject *current; GType current_type; GList *card_id, *card_name; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->list_cards == NULL){ g_message("AgsSoundcard::list-cards missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } card_id = NULL; card_name = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(current), &card_id, &card_name); } CU_ASSERT(success); } void ags_soundcard_test_is_available() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); ags_soundcard_is_available(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_is_starting() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->is_starting == NULL){ g_message("AgsSoundcard::is-starting missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_is_starting(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_is_playing() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(ags_soundcard_get_capability(AGS_SOUNDCARD(current)) == AGS_SOUNDCARD_CAPABILITY_PLAYBACK && AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->is_playing == NULL){ g_message("AgsSoundcard::is-playing missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_is_playing(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_is_recording() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(ags_soundcard_get_capability(AGS_SOUNDCARD(current)) == AGS_SOUNDCARD_CAPABILITY_CAPTURE && AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->is_recording == NULL){ g_message("AgsSoundcard::is-recording missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_is_recording(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_uptime() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_uptime == NULL){ g_message("AgsSoundcard::get-uptime missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_get_uptime(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_play_init() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(ags_soundcard_get_capability(AGS_SOUNDCARD(current)) == AGS_SOUNDCARD_CAPABILITY_PLAYBACK && AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->play_init == NULL){ g_message("AgsSoundcard::play-init missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_play() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(ags_soundcard_get_capability(AGS_SOUNDCARD(current)) == AGS_SOUNDCARD_CAPABILITY_PLAYBACK && AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->play == NULL){ g_message("AgsSoundcard::play missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_record_init() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(ags_soundcard_get_capability(AGS_SOUNDCARD(current)) == AGS_SOUNDCARD_CAPABILITY_CAPTURE && AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->record_init == NULL){ g_message("AgsSoundcard::record-init missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_record() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(ags_soundcard_get_capability(AGS_SOUNDCARD(current)) == AGS_SOUNDCARD_CAPABILITY_CAPTURE && AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->record == NULL){ g_message("AgsSoundcard::record missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_stop() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->stop == NULL){ g_message("AgsSoundcard::stop missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } } CU_ASSERT(success); } void ags_soundcard_test_tic() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->tic == NULL){ g_message("AgsSoundcard::tic missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_tic(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_offset_changed() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->offset_changed == NULL){ g_message("AgsSoundcard::offset-changed missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_offset_changed(AGS_SOUNDCARD(current), 0); } CU_ASSERT(success); } void ags_soundcard_test_get_buffer() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_buffer == NULL){ g_message("AgsSoundcard::get-buffer missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_get_buffer(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_next_buffer() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_next_buffer == NULL){ g_message("AgsSoundcard::get-next-buffer missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_get_next_buffer(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_prev_buffer() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_prev_buffer == NULL){ g_message("AgsSoundcard::get-prev-buffer missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_get_prev_buffer(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_lock_buffer() { //TODO:JK: implement me } void ags_soundcard_test_unlock_buffer() { //TODO:JK: implement me } void ags_soundcard_test_set_bpm() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_bpm == NULL){ g_message("AgsSoundcard::set-bpm missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_bpm(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_BPM_BPM); } CU_ASSERT(success); } void ags_soundcard_test_get_bpm() { AgsApplicationContext *application_context; GObject *current; GType current_type; gdouble retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_bpm == NULL){ g_message("AgsSoundcard::get-bpm missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_bpm(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_set_delay_factor() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_delay_factor == NULL){ g_message("AgsSoundcard::set-delay-factor missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_delay_factor(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_DELAY_FACTOR_DELAY_FACTOR); } CU_ASSERT(success); } void ags_soundcard_test_get_delay_factor() { AgsApplicationContext *application_context; GObject *current; GType current_type; gdouble retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_delay_factor == NULL){ g_message("AgsSoundcard::get-delay-factor missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_absolute_delay() { AgsApplicationContext *application_context; GObject *current; GType current_type; gdouble retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_absolute_delay == NULL){ g_message("AgsSoundcard::get-absolute-delay missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_delay() { AgsApplicationContext *application_context; GObject *current; GType current_type; gdouble retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_delay == NULL){ g_message("AgsSoundcard::get-delay missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_delay(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_attack() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_attack == NULL){ g_message("AgsSoundcard::get-attack missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_attack(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_get_delay_counter() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_delay_counter == NULL){ g_message("AgsSoundcard::get-delay-counter missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_delay_counter(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_set_note_offset() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_note_offset == NULL){ g_message("AgsSoundcard::set-note-offset missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_note_offset(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_NOTE_OFFSET_NOTE_OFFSET); } CU_ASSERT(success); } void ags_soundcard_test_get_note_offset() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_note_offset == NULL){ g_message("AgsSoundcard::get-note-offset missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_note_offset(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_set_note_offset_absolute() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_note_offset_absolute == NULL){ g_message("AgsSoundcard::set-note-offset-absolute missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_note_offset_absolute(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_NOTE_OFFSET_ABSOLUTE_NOTE_OFFSET); } CU_ASSERT(success); } void ags_soundcard_test_get_note_offset_absolute() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_note_offset_absolute == NULL){ g_message("AgsSoundcard::get-note-offset-absolute missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_note_offset_absolute(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } void ags_soundcard_test_set_loop() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint loop_left, loop_right; gboolean do_loop; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->set_loop == NULL){ g_message("AgsSoundcard::set-loop missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_set_loop(AGS_SOUNDCARD(current), AGS_SOUNDCARD_TEST_SET_LOOP_LOOP_LEFT, AGS_SOUNDCARD_TEST_SET_LOOP_LOOP_RIGHT, AGS_SOUNDCARD_TEST_SET_DO_LOOP); } CU_ASSERT(success); } void ags_soundcard_test_get_loop() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint loop_left, loop_right; gboolean do_loop; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_loop == NULL){ g_message("AgsSoundcard::get-loop missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_soundcard_get_loop(AGS_SOUNDCARD(current), &loop_left, &loop_right, &do_loop); } CU_ASSERT(success); } void ags_soundcard_test_get_loop_offset() { AgsApplicationContext *application_context; GObject *current; GType current_type; guint retval; guint i; gboolean success; application_context = ags_audio_application_context_new(); success = TRUE; for(i = 0; soundcard_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(soundcard_test_types[i], NULL); if(AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(current))->get_loop_offset == NULL){ g_message("AgsSoundcard::get-loop-offset missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } retval = ags_soundcard_get_loop_offset(AGS_SOUNDCARD(current)); } CU_ASSERT(success); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* remove a suite to the registry */ pSuite = CU_add_suite("AgsSoundcardTest", ags_soundcard_test_init_suite, ags_soundcard_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* remove the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSoundcard set device", ags_soundcard_test_set_device) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get device", ags_soundcard_test_get_device) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard pcm info", ags_soundcard_test_pcm_info) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get capability", ags_soundcard_test_get_capability) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard set presets", ags_soundcard_test_set_presets) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get presets", ags_soundcard_test_get_presets) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard list cards", ags_soundcard_test_list_cards) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard is available", ags_soundcard_test_is_available) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard is starting", ags_soundcard_test_is_starting) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard is playing", ags_soundcard_test_is_playing) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard is recording", ags_soundcard_test_is_recording) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get uptime", ags_soundcard_test_get_uptime) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard play init", ags_soundcard_test_play_init) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard play", ags_soundcard_test_play) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard record init", ags_soundcard_test_record_init) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard record", ags_soundcard_test_record) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard stop", ags_soundcard_test_stop) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard tic", ags_soundcard_test_tic) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard offset changed", ags_soundcard_test_offset_changed) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get buffer", ags_soundcard_test_get_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get next buffer", ags_soundcard_test_get_next_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get prev buffer", ags_soundcard_test_get_prev_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard lock buffer", ags_soundcard_test_lock_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard unlock buffer", ags_soundcard_test_unlock_buffer) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard set bpm", ags_soundcard_test_set_bpm) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get bpm", ags_soundcard_test_get_bpm) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard set delay factor", ags_soundcard_test_set_delay_factor) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get delay factor", ags_soundcard_test_get_delay_factor) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get absolute delay", ags_soundcard_test_get_absolute_delay) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get delay", ags_soundcard_test_get_delay) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get attack", ags_soundcard_test_get_attack) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get delay counter", ags_soundcard_test_get_delay_counter) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard set note offset", ags_soundcard_test_set_note_offset) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get note offset", ags_soundcard_test_get_note_offset) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard set note offset absolute", ags_soundcard_test_set_note_offset_absolute) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get note offset absolute", ags_soundcard_test_get_note_offset_absolute) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard set loop", ags_soundcard_test_set_loop) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get loop", ags_soundcard_test_get_loop) == NULL) || (CU_add_test(pSuite, "test of AgsSoundcard get loop offset", ags_soundcard_test_get_loop_offset) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/object/ags_connectable_test.c0000644000175000017500000002763613605312646020135 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include int ags_connectable_test_init_suite(); int ags_connectable_test_clean_suite(); void ags_connectable_test_get_uuid(); void ags_connectable_test_has_resource(); void ags_connectable_test_is_ready(); void ags_connectable_test_add_to_registry(); void ags_connectable_test_remove_from_registry(); void ags_connectable_test_list_resource(); void ags_connectable_test_xml_compose(); void ags_connectable_test_xml_parse(); void ags_connectable_test_is_connected(); void ags_connectable_test_connect(); void ags_connectable_test_disconnect(); void ags_connectable_test_connect_connection(); void ags_connectable_test_disconnect_connection(); GType connectable_test_types[39]; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_connectable_test_init_suite() { guint i; i = 0; connectable_test_types[i++] = AGS_TYPE_APPLICATION_CONTEXT; connectable_test_types[i++] = AGS_TYPE_THREAD; connectable_test_types[i++] = AGS_TYPE_AUDIO; connectable_test_types[i++] = AGS_TYPE_AUDIO_SIGNAL; connectable_test_types[i++] = AGS_TYPE_CHANNEL; connectable_test_types[i++] = AGS_TYPE_DEVIN; connectable_test_types[i++] = AGS_TYPE_DEVOUT; connectable_test_types[i++] = AGS_TYPE_FIFOOUT; connectable_test_types[i++] = AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN; connectable_test_types[i++] = AGS_TYPE_GENERIC_RECALL_RECYCLING; connectable_test_types[i++] = AGS_TYPE_MIDIIN; connectable_test_types[i++] = AGS_TYPE_PATTERN; connectable_test_types[i++] = AGS_TYPE_PORT; connectable_test_types[i++] = AGS_TYPE_RECALL; connectable_test_types[i++] = AGS_TYPE_RECYCLING; connectable_test_types[i++] = AGS_TYPE_AUDIO_FILE; connectable_test_types[i++] = AGS_TYPE_AUDIO_CONTAINER; connectable_test_types[i++] = AGS_TYPE_IPATCH; connectable_test_types[i++] = AGS_TYPE_IPATCH_DLS2_READER; connectable_test_types[i++] = AGS_TYPE_IPATCH_GIG_READER; connectable_test_types[i++] = AGS_TYPE_IPATCH_SF2_READER; connectable_test_types[i++] = AGS_TYPE_SNDFILE; connectable_test_types[i++] = AGS_TYPE_CORE_AUDIO_CLIENT; connectable_test_types[i++] = AGS_TYPE_CORE_AUDIO_DEVOUT; connectable_test_types[i++] = AGS_TYPE_CORE_AUDIO_MIDIIN; connectable_test_types[i++] = AGS_TYPE_CORE_AUDIO_PORT; connectable_test_types[i++] = AGS_TYPE_CORE_AUDIO_SERVER; connectable_test_types[i++] = AGS_TYPE_JACK_CLIENT; connectable_test_types[i++] = AGS_TYPE_JACK_DEVIN; connectable_test_types[i++] = AGS_TYPE_JACK_DEVOUT; connectable_test_types[i++] = AGS_TYPE_JACK_MIDIIN; connectable_test_types[i++] = AGS_TYPE_JACK_PORT; connectable_test_types[i++] = AGS_TYPE_JACK_SERVER; connectable_test_types[i++] = AGS_TYPE_PULSE_CLIENT; connectable_test_types[i++] = AGS_TYPE_PULSE_DEVIN; connectable_test_types[i++] = AGS_TYPE_PULSE_DEVOUT; connectable_test_types[i++] = AGS_TYPE_PULSE_PORT; connectable_test_types[i++] = AGS_TYPE_PULSE_SERVER; connectable_test_types[i++] = G_TYPE_NONE; return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_connectable_test_clean_suite() { return(0); } void ags_connectable_test_get_uuid() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->get_uuid == NULL){ g_message("AgsConnectable::get-uuid missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_connectable_get_uuid(current); } CU_ASSERT(success); } void ags_connectable_test_has_resource() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->has_resource == NULL){ g_message("AgsConnectable::has-resource missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_connectable_has_resource(current); } CU_ASSERT(success); } void ags_connectable_test_is_ready() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); ags_connectable_is_ready(current); } } void ags_connectable_test_add_to_registry() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); ags_connectable_add_to_registry(current); } } void ags_connectable_test_remove_from_registry() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); ags_connectable_add_to_registry(current); ags_connectable_remove_from_registry(current); } } void ags_connectable_test_list_resource() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); ags_connectable_list_resource(current); } } void ags_connectable_test_xml_compose() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); ags_connectable_xml_compose(current); } } void ags_connectable_test_xml_parse() { GObject *current; xmlNode *node; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); node = ags_connectable_xml_compose(current); ags_connectable_xml_parse(current, node); } } void ags_connectable_test_is_connected() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->is_connected == NULL){ g_message("AgsConnectable::is-connected missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_connectable_is_connected(current); } CU_ASSERT(success); } void ags_connectable_test_connect() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->connect == NULL){ g_message("AgsConnectable::connect missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_connectable_connect(current); } CU_ASSERT(success); } void ags_connectable_test_disconnect() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->disconnect == NULL){ g_message("AgsConnectable::disconnect missing: %s", G_OBJECT_TYPE_NAME(current)); success = FALSE; } ags_connectable_connect(current); ags_connectable_disconnect(current); } CU_ASSERT(success); } void ags_connectable_test_connect_connection() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->connect_connection != NULL){ ags_connectable_connect_connection(current, NULL); } } } void ags_connectable_test_disconnect_connection() { GObject *current; GType current_type; guint i; gboolean success; success = TRUE; for(i = 0; connectable_test_types[i] != G_TYPE_NONE; i++){ current = g_object_new(connectable_test_types[i], NULL); if(AGS_CONNECTABLE_GET_INTERFACE(AGS_CONNECTABLE(current))->disconnect_connection != NULL){ ags_connectable_disconnect_connection(current, NULL); } } } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* remove a suite to the registry */ pSuite = CU_add_suite("AgsConnectableTest", ags_connectable_test_init_suite, ags_connectable_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* remove the tests to the suite */ if((CU_add_test(pSuite, "test of AgsConnectable get uuid", ags_connectable_test_get_uuid) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable has resource", ags_connectable_test_has_resource) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable is ready", ags_connectable_test_is_ready) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable add to registry", ags_connectable_test_add_to_registry) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable remove from registry", ags_connectable_test_remove_from_registry) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable list resource", ags_connectable_test_list_resource) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable xml compose", ags_connectable_test_xml_compose) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable xml parse", ags_connectable_test_xml_parse) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable is connected", ags_connectable_test_is_connected) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable connect", ags_connectable_test_connect) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable disconnect", ags_connectable_test_disconnect) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable connect connection", ags_connectable_test_connect_connection) == NULL) || (CU_add_test(pSuite, "test of AgsConnectable disconnect connection", ags_connectable_test_disconnect_connection) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/object/ags_config_test.c0000644000175000017500000001506213607210263017105 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_config_test_init_suite(); int ags_config_test_clean_suite(); void ags_config_test_load_defaults(); void ags_config_test_load_from_file(); void ags_config_test_load_from_data(); void ags_config_test_set_value(); void ags_config_test_get_value(); void ags_config_test_to_data(); void ags_config_test_save(); void ags_config_test_clear(); void ags_config_test_stub_load_defaults(); void ags_config_test_stub_set_value(); gchar* ags_config_test_stub_get_value(); #define AGS_CONFIG_TEST_SAMPLE_CONF "ags_config_test_sample.conf" #define AGS_CONFIG_TEST_SAMPLE_CONF_DATA "[the-group]\n" \ "subject=very first value\n\n" gboolean stub_load_defaults = FALSE; gboolean stub_set_value = FALSE; gboolean stub_get_value = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_config_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_config_test_clean_suite() { return(0); } void ags_config_test_load_defaults() { AgsConfig *config; gpointer ptr; config = ags_config_get_instance(); /* stub */ ptr = AGS_CONFIG_GET_CLASS(config)->load_defaults; AGS_CONFIG_GET_CLASS(config)->load_defaults = ags_config_test_stub_load_defaults; ags_config_load_defaults(config); CU_ASSERT(stub_load_defaults == TRUE); AGS_CONFIG_GET_CLASS(config)->load_defaults = ptr; g_object_unref(config); } void ags_config_test_load_from_file() { AgsConfig *config; /* test not existing file */ config = ags_config_get_instance(); ags_config_load_from_file(config, NULL); CU_ASSERT(config->key_file != NULL); g_object_unref(config); /* test sample configuration */ config = ags_config_get_instance(); ags_config_load_from_file(config, AGS_CONFIG_TEST_SAMPLE_CONF); CU_ASSERT(config->key_file != NULL); g_object_unref(config); } void ags_config_test_load_from_data() { AgsConfig *config; /* test NULL */ config = ags_config_get_instance(); ags_config_load_from_data(config, NULL, 0); CU_ASSERT(config->key_file != NULL); g_object_unref(config); /* test sample configuration */ config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_CONFIG_TEST_SAMPLE_CONF_DATA, sizeof(AGS_CONFIG_TEST_SAMPLE_CONF_DATA)); CU_ASSERT(config->key_file != NULL); g_object_unref(config); } void ags_config_test_set_value() { AgsConfig *config; gpointer ptr; config = ags_config_get_instance(); /* stub */ ptr = AGS_CONFIG_GET_CLASS(config)->set_value; AGS_CONFIG_GET_CLASS(config)->set_value = ags_config_test_stub_set_value; ags_config_set_value(config, NULL, NULL, NULL); CU_ASSERT(stub_set_value == TRUE); AGS_CONFIG_GET_CLASS(config)->set_value = ptr; g_object_unref(config); } void ags_config_test_get_value() { AgsConfig *config; gpointer ptr; config = ags_config_get_instance(); /* stub */ ptr = AGS_CONFIG_GET_CLASS(config)->get_value; AGS_CONFIG_GET_CLASS(config)->get_value = ags_config_test_stub_get_value; ags_config_get_value(config, NULL, NULL); CU_ASSERT(stub_get_value == TRUE); AGS_CONFIG_GET_CLASS(config)->get_value = ptr; g_object_unref(config); } void ags_config_test_to_data() { AgsConfig *config; char *buffer; gsize buffer_length; /* test NULL */ config = ags_config_get_instance(); ags_config_to_data(config, NULL, 0); g_object_unref(config); /* test default configuration */ config = ags_config_get_instance(); ags_config_load_defaults(config); g_message("%s", g_key_file_to_data(config->key_file, NULL, NULL)); buffer = NULL; buffer_length = 0; ags_config_to_data(config, &buffer, &buffer_length); CU_ASSERT(buffer != NULL); CU_ASSERT(buffer_length > 0); g_object_unref(config); } void ags_config_test_save() { //TODO:JK: implement me } void ags_config_test_clear() { //TODO:JK: implement me } void ags_config_test_stub_load_defaults() { stub_load_defaults = TRUE; } void ags_config_test_stub_set_value() { stub_set_value = TRUE; } gchar* ags_config_test_stub_get_value() { stub_get_value = TRUE; return(NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsConfigTest", ags_config_test_init_suite, ags_config_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsConfig load defaults", ags_config_test_load_defaults) == NULL) || (CU_add_test(pSuite, "test of AgsConfig load from file", ags_config_test_load_from_file) == NULL) || (CU_add_test(pSuite, "test of AgsConfig load from data", ags_config_test_load_from_data) == NULL) || (CU_add_test(pSuite, "test of AgsConfig set value", ags_config_test_set_value) == NULL) || (CU_add_test(pSuite, "test of AgsConfig get value", ags_config_test_get_value) == NULL) || (CU_add_test(pSuite, "test of AgsConfig to data", ags_config_test_to_data) == NULL) || (CU_add_test(pSuite, "test of AgsConfig save", ags_config_test_save) == NULL) || (CU_add_test(pSuite, "test of AgsConfig clear", ags_config_test_clear) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/object/ags_application_context_test.c0000644000175000017500000001333213605312646021713 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_application_context_test_init_suite(); int ags_application_context_test_clean_suite(); void ags_application_context_test_load_config(); void ags_application_context_test_register_types(); void ags_application_context_test_add_sibling(); void ags_application_context_test_remove_sibling(); void ags_application_context_test_find_default(); void ags_application_context_test_find_main_loop(); void ags_application_context_test_quit(); void ags_application_context_test_stub_load_config(AgsApplicationContext *application_context); void ags_application_context_test_stub_register_types(AgsApplicationContext *application_context); void ags_application_context_test_stub_quit(AgsApplicationContext *application_context); gboolean stub_load_config = FALSE; gboolean stub_register_types = FALSE; gboolean stub_read = FALSE; gboolean stub_write = FALSE; gboolean stub_quit = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_application_context_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_application_context_test_clean_suite() { return(0); } void ags_application_context_test_load_config() { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); /* stub */ AGS_APPLICATION_CONTEXT_GET_CLASS(application_context)->load_config = ags_application_context_test_stub_load_config; /* assert */ ags_application_context_load_config(application_context); CU_ASSERT(stub_load_config == TRUE); g_object_unref(application_context); } void ags_application_context_test_register_types() { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); /* stub */ AGS_APPLICATION_CONTEXT_GET_CLASS(application_context)->register_types = ags_application_context_test_stub_register_types; /* assert */ ags_application_context_register_types(application_context); CU_ASSERT(stub_register_types == TRUE); g_object_unref(application_context); } void ags_application_context_test_add_sibling() { //TODO:JK: implement me } void ags_application_context_test_remove_sibling() { //TODO:JK: implement me } void ags_application_context_test_find_default() { //TODO:JK: implement me } void ags_application_context_test_find_main_loop() { //TODO:JK: implement me } void ags_application_context_test_quit() { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); /* stub */ AGS_APPLICATION_CONTEXT_GET_CLASS(application_context)->quit = ags_application_context_test_stub_quit; /* assert */ ags_application_context_quit(application_context); CU_ASSERT(stub_quit == TRUE); g_object_unref(application_context); } void ags_application_context_test_stub_load_config(AgsApplicationContext *application_context) { stub_load_config = TRUE; } void ags_application_context_test_stub_register_types(AgsApplicationContext *application_context) { stub_register_types = TRUE; } void ags_application_context_test_stub_quit(AgsApplicationContext *application_context) { stub_quit = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsApplicationContextTest\0", ags_application_context_test_init_suite, ags_application_context_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsApplicationContext load config\0", ags_application_context_test_load_config) == NULL) || (CU_add_test(pSuite, "test of AgsApplicationContext register types\0", ags_application_context_test_register_types) == NULL) || (CU_add_test(pSuite, "test of AgsApplicationContext add sibling\0", ags_application_context_test_add_sibling) == NULL) || (CU_add_test(pSuite, "test of AgsApplicationContext remove sibling\0", ags_application_context_test_remove_sibling) == NULL) || (CU_add_test(pSuite, "test of AgsApplicationContext find default\0", ags_application_context_test_find_default) == NULL) || (CU_add_test(pSuite, "test of AgsApplicationContext find main loop\0", ags_application_context_test_find_main_loop) == NULL) || (CU_add_test(pSuite, "test of AgsApplicationContext quit\0", ags_application_context_test_quit) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/0000755000175000017500000000000013622252263013722 500000000000000gsequencer-3.1.3/ags/test/server/controller/0000755000175000017500000000000013622252262016104 500000000000000gsequencer-3.1.3/ags/test/server/controller/ags_controller_test.c0000644000175000017500000001632113607210263022245 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_controller_test_init_suite(); int ags_controller_test_clean_suite(); void ags_controller_test_resource_alloc(); void ags_controller_test_resource_free(); void ags_controller_test_resource_ref(); void ags_controller_test_resource_unref(); void ags_controller_test_add_resource(); void ags_controller_test_remove_resource(); void ags_controller_test_lookup_resource(); void ags_controller_test_query_security_context(); #define AGS_CONTROLLER_TEST_ADD_RESOURCE_RESOURCE_COUNT (7) #define AGS_CONTROLLER_TEST_REMOVE_RESOURCE_RESOURCE_COUNT (9) #define AGS_CONTROLLER_TEST_LOOKUP_RESOURCE_RESOURCE_COUNT (5) /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_controller_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_controller_test_clean_suite() { return(0); } void ags_controller_test_resource_alloc() { AgsControllerResource *controller_resource; controller_resource = ags_controller_resource_alloc("group-id", "user-id", 0x744); CU_ASSERT(controller_resource != NULL); CU_ASSERT(controller_resource->ref_count == 1); CU_ASSERT(!g_strcmp0(controller_resource->group_id, "group-id") == TRUE); CU_ASSERT(!g_strcmp0(controller_resource->user_id, "user-id") == TRUE); CU_ASSERT(controller_resource->access_mode == 0x744); } void ags_controller_test_resource_free() { AgsControllerResource *controller_resource; controller_resource = ags_controller_resource_alloc(NULL, NULL, 0x0); ags_controller_resource_free(controller_resource); } void ags_controller_test_resource_ref() { AgsControllerResource *controller_resource; controller_resource = ags_controller_resource_alloc("group-id", "user-id", 0x744); ags_controller_resource_ref(controller_resource); CU_ASSERT(controller_resource->ref_count == 2); } void ags_controller_test_resource_unref() { AgsControllerResource *controller_resource; controller_resource = ags_controller_resource_alloc("group-id", "user-id", 0x744); ags_controller_resource_unref(controller_resource); } void ags_controller_test_add_resource() { AgsController *controller; AgsControllerResource **controller_resource; guint i; controller = ags_controller_new(); controller_resource = (AgsControllerResource **) malloc(AGS_CONTROLLER_TEST_ADD_RESOURCE_RESOURCE_COUNT * sizeof(AgsControllerResource *)); for(i = 0; i < AGS_CONTROLLER_TEST_ADD_RESOURCE_RESOURCE_COUNT; i++){ controller_resource[i] = ags_controller_resource_alloc(NULL, NULL, 0x0); ags_controller_add_resource(controller, g_strdup_printf("resource-%d", i), controller_resource[i]); } CU_ASSERT(g_hash_table_size(controller->resource) == AGS_CONTROLLER_TEST_ADD_RESOURCE_RESOURCE_COUNT); } void ags_controller_test_remove_resource() { AgsController *controller; AgsControllerResource **controller_resource; guint i; controller = ags_controller_new(); controller_resource = (AgsControllerResource **) malloc(AGS_CONTROLLER_TEST_REMOVE_RESOURCE_RESOURCE_COUNT * sizeof(AgsControllerResource *)); for(i = 0; i < AGS_CONTROLLER_TEST_REMOVE_RESOURCE_RESOURCE_COUNT; i++){ controller_resource[i] = ags_controller_resource_alloc(NULL, NULL, 0x0); g_hash_table_insert(controller->resource, g_strdup_printf("resource-%d", i), controller_resource[i]); } for(i = 0; i < AGS_CONTROLLER_TEST_REMOVE_RESOURCE_RESOURCE_COUNT; i++){ ags_controller_remove_resource(controller, g_strdup_printf("resource-%d", i)); } CU_ASSERT(g_hash_table_size(controller->resource) == 0); } void ags_controller_test_lookup_resource() { AgsController *controller; AgsControllerResource **controller_resource; guint i; gboolean success; controller = ags_controller_new(); controller_resource = (AgsControllerResource **) malloc(AGS_CONTROLLER_TEST_LOOKUP_RESOURCE_RESOURCE_COUNT * sizeof(AgsControllerResource *)); for(i = 0; i < AGS_CONTROLLER_TEST_LOOKUP_RESOURCE_RESOURCE_COUNT; i++){ controller_resource[i] = ags_controller_resource_alloc(NULL, NULL, 0x0); g_hash_table_insert(controller->resource, g_strdup_printf("resource-%d", i), controller_resource[i]); } success = TRUE; for(i = 0; i < AGS_CONTROLLER_TEST_LOOKUP_RESOURCE_RESOURCE_COUNT; i++){ AgsControllerResource *current; current = ags_controller_lookup_resource(controller, g_strdup_printf("resource-%d", i)); if(current == NULL){ success = FALSE; } } CU_ASSERT(success == TRUE); } void ags_controller_test_query_security_context() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsControllerTest", ags_controller_test_init_suite, ags_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsController resource alloc", ags_controller_test_resource_alloc) == NULL) || (CU_add_test(pSuite, "test of AgsController resource free", ags_controller_test_resource_free) == NULL) || (CU_add_test(pSuite, "test of AgsController resource ref", ags_controller_test_resource_ref) == NULL) || (CU_add_test(pSuite, "test of AgsController resource unref", ags_controller_test_resource_unref) == NULL) || (CU_add_test(pSuite, "test of AgsController add resource", ags_controller_test_add_resource) == NULL) || (CU_add_test(pSuite, "test of AgsController remove resource", ags_controller_test_remove_resource) == NULL) || (CU_add_test(pSuite, "test of AgsController lookup resource", ags_controller_test_lookup_resource) == NULL) || (CU_add_test(pSuite, "test of AgsController query security context", ags_controller_test_query_security_context) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/controller/ags_front_controller_test.c0000644000175000017500000000653113614062654023466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_front_controller_test_init_suite(); int ags_front_controller_test_clean_suite(); void ags_front_controller_test_do_request(); AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_front_controller_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_front_controller_test_clean_suite() { return(0); } void ags_front_controller_test_do_request() { AgsServer *server; AgsFrontController *front_controller; AgsSecurityContext *security_context; gpointer response; server = server_application_context->server->data; front_controller = ags_front_controller_new(); ags_server_add_controller(server, front_controller); g_object_set(front_controller, "server", server, NULL); security_context = ags_security_context_new(); response = ags_front_controller_do_request(front_controller, NULL, NULL, NULL, security_context, "/ags-xmlrpc/status", "ags-test-login", "ags-test-security-token"); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFrontControllerTest", ags_front_controller_test_init_suite, ags_front_controller_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFrontController do request", ags_front_controller_test_do_request) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/0000755000175000017500000000000013622252263015571 500000000000000gsequencer-3.1.3/ags/test/server/security/ags_xml_password_store_test.c0000644000175000017500000002115513614062654023514 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_xml_password_store_test_init_suite(); int ags_xml_password_store_test_clean_suite(); void ags_xml_password_store_test_set_login_name(); void ags_xml_password_store_test_get_login_name(); void ags_xml_password_store_test_set_password(); void ags_xml_password_store_test_get_password(); void ags_xml_password_store_test_encrypt_password(); void ags_xml_password_store_test_open_filename(); void ags_xml_password_store_test_find_login(); #define AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_LOGIN_NAME "ags-test-user" #define AGS_XML_PASSWORD_STORE_TEST_GET_LOGIN_NAME_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_PASSWORD_STORE_TEST_GET_LOGIN_NAME_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_PASSWORD "ags-test-password" #define AGS_XML_PASSWORD_STORE_TEST_GET_PASSWORD_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_PASSWORD_STORE_TEST_GET_PASSWORD_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_PASSWORD_STORE_TEST_ENCRYPT_PASSWORD_DEFAULT_PASSWORD "ags-test-password" #define AGS_XML_PASSWORD_STORE_TEST_ENCRYPT_PASSWORD_DEFAULT_SALT "ags-puts-salt-in-pizza" #define AGS_XML_PASSWORD_STORE_TEST_OPEN_FILENAME SRCDIR "/" "ags_password_store_test.xml" AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_password_store_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_password_store_test_clean_suite() { return(0); } void ags_xml_password_store_test_set_login_name() { AgsXmlPasswordStore *xml_password_store; AgsSecurityContext *security_context; GError *error; xml_password_store = ags_xml_password_store_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_password_store_set_login_name(AGS_PASSWORD_STORE(xml_password_store), security_context, AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_USER_UUID, AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_SECURITY_TOKEN, AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_LOGIN_NAME, &error); //TODO:JK: implement me } void ags_xml_password_store_test_get_login_name() { AgsXmlPasswordStore *xml_password_store; AgsSecurityContext *security_context; gchar *login_name; GError *error; xml_password_store = ags_xml_password_store_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; login_name = ags_password_store_get_login_name(AGS_PASSWORD_STORE(xml_password_store), security_context, AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_USER_UUID, AGS_XML_PASSWORD_STORE_TEST_SET_LOGIN_NAME_DEFAULT_SECURITY_TOKEN, &error); CU_ASSERT(login_name == NULL); //TODO:JK: implement me } void ags_xml_password_store_test_set_password() { AgsXmlPasswordStore *xml_password_store; AgsSecurityContext *security_context; GError *error; xml_password_store = ags_xml_password_store_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_password_store_set_password(AGS_PASSWORD_STORE(xml_password_store), security_context, AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_USER_UUID, AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_SECURITY_TOKEN, AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_PASSWORD, &error); //TODO:JK: implement me } void ags_xml_password_store_test_get_password() { AgsXmlPasswordStore *xml_password_store; AgsSecurityContext *security_context; gchar *password; GError *error; xml_password_store = ags_xml_password_store_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; password = ags_password_store_get_password(AGS_PASSWORD_STORE(xml_password_store), security_context, AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_USER_UUID, AGS_XML_PASSWORD_STORE_TEST_SET_PASSWORD_DEFAULT_SECURITY_TOKEN, &error); CU_ASSERT(password == NULL); //TODO:JK: implement me } void ags_xml_password_store_test_encrypt_password() { AgsXmlPasswordStore *xml_password_store; AgsSecurityContext *security_context; gchar *password; GError *error; xml_password_store = ags_xml_password_store_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; password = ags_password_store_encrypt_password(AGS_PASSWORD_STORE(xml_password_store), AGS_XML_PASSWORD_STORE_TEST_ENCRYPT_PASSWORD_DEFAULT_PASSWORD, AGS_XML_PASSWORD_STORE_TEST_ENCRYPT_PASSWORD_DEFAULT_SALT, &error); CU_ASSERT(password != NULL); CU_ASSERT((password != NULL) && ((!g_strcmp0(password, AGS_XML_PASSWORD_STORE_TEST_ENCRYPT_PASSWORD_DEFAULT_PASSWORD)) == FALSE)); //TODO:JK: implement me } void ags_xml_password_store_test_open_filename() { AgsXmlPasswordStore *xml_password_store; xml_password_store = ags_xml_password_store_new(); ags_xml_password_store_open_filename(xml_password_store, AGS_XML_PASSWORD_STORE_TEST_OPEN_FILENAME); CU_ASSERT(xml_password_store->filename != NULL); CU_ASSERT(xml_password_store->doc != NULL); CU_ASSERT(xml_password_store->root_node != NULL); } void ags_xml_password_store_test_find_login() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsXmlPasswordStoreTest", ags_xml_password_store_test_init_suite, ags_xml_password_store_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsXmlPasswordStore set login name", ags_xml_password_store_test_set_login_name) == NULL) || (CU_add_test(pSuite, "test of AgsXmlPasswordStore get login name", ags_xml_password_store_test_get_login_name) == NULL) || (CU_add_test(pSuite, "test of AgsXmlPasswordStore set password", ags_xml_password_store_test_set_password) == NULL) || (CU_add_test(pSuite, "test of AgsXmlPasswordStore get password", ags_xml_password_store_test_get_password) == NULL) || (CU_add_test(pSuite, "test of AgsXmlPasswordStore encrypt password", ags_xml_password_store_test_encrypt_password) == NULL) || (CU_add_test(pSuite, "test of AgsXmlPasswordStore open filename", ags_xml_password_store_test_open_filename) == NULL) || (CU_add_test(pSuite, "test of AgsXmlPasswordStore find login", ags_xml_password_store_test_find_login) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_certificate_manager_test.c0000644000175000017500000001542213614062654023532 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_certificate_manager_test_init_suite(); int ags_certificate_manager_test_clean_suite(); void ags_certificate_manager_test_get_certificate(); void ags_certificate_manager_test_add_certificate(); void ags_certificate_manager_test_remove_certificate(); #define AGS_CERTIFICATE_MANAGER_TEST_GET_CERTIFICATE_XML_CERTIFICATE_COUNT (7) #define AGS_CERTIFICATE_MANAGER_TEST_ADD_CERTIFICATE_XML_CERTIFICATE_COUNT (9) #define AGS_CERTIFICATE_MANAGER_TEST_REMOVE_CERTIFICATE_XML_CERTIFICATE_COUNT (13) AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_certificate_manager_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_certificate_manager_test_clean_suite() { return(0); } void ags_certificate_manager_test_get_certificate() { AgsCertificateManager *certificate_manager; AgsXmlCertificate **xml_certificate; GList *start_certificate, *certificate; guint i; certificate_manager = ags_certificate_manager_get_instance(); certificate_manager->certificate = NULL; /* assert #0 - empty */ start_certificate = ags_certificate_manager_get_certificate(certificate_manager); CU_ASSERT(start_certificate == NULL); /* assert #1 - with certificate */ xml_certificate = (AgsXmlCertificate **) malloc(AGS_CERTIFICATE_MANAGER_TEST_GET_CERTIFICATE_XML_CERTIFICATE_COUNT * sizeof(AgsXmlCertificate *)); for(i = 0; i < AGS_CERTIFICATE_MANAGER_TEST_GET_CERTIFICATE_XML_CERTIFICATE_COUNT; i++){ xml_certificate[i] = ags_xml_certificate_new(); certificate_manager->certificate = g_list_prepend(certificate_manager->certificate, xml_certificate[i]); } start_certificate = ags_certificate_manager_get_certificate(certificate_manager); CU_ASSERT(start_certificate != NULL); CU_ASSERT(g_list_length(start_certificate) == AGS_CERTIFICATE_MANAGER_TEST_GET_CERTIFICATE_XML_CERTIFICATE_COUNT); } void ags_certificate_manager_test_add_certificate() { AgsCertificateManager *certificate_manager; AgsXmlCertificate **xml_certificate; GList *start_certificate, *certificate; guint i; certificate_manager = ags_certificate_manager_get_instance(); certificate_manager->certificate = NULL; /* assert #0 - empty */ start_certificate = ags_certificate_manager_get_certificate(certificate_manager); CU_ASSERT(start_certificate == NULL); /* assert #1 - with certificate */ xml_certificate = (AgsXmlCertificate **) malloc(AGS_CERTIFICATE_MANAGER_TEST_ADD_CERTIFICATE_XML_CERTIFICATE_COUNT * sizeof(AgsXmlCertificate *)); for(i = 0; i < AGS_CERTIFICATE_MANAGER_TEST_ADD_CERTIFICATE_XML_CERTIFICATE_COUNT; i++){ xml_certificate[i] = ags_xml_certificate_new(); ags_certificate_manager_add_certificate(certificate_manager, xml_certificate[i]); } start_certificate = ags_certificate_manager_get_certificate(certificate_manager); CU_ASSERT(start_certificate != NULL); CU_ASSERT(g_list_length(start_certificate) == AGS_CERTIFICATE_MANAGER_TEST_ADD_CERTIFICATE_XML_CERTIFICATE_COUNT); } void ags_certificate_manager_test_remove_certificate() { AgsCertificateManager *certificate_manager; AgsXmlCertificate **xml_certificate; GList *start_certificate, *certificate; guint i; certificate_manager = ags_certificate_manager_get_instance(); certificate_manager->certificate = NULL; /* assert #0 - empty */ start_certificate = ags_certificate_manager_get_certificate(certificate_manager); CU_ASSERT(start_certificate == NULL); /* assert #1 - with certificate */ xml_certificate = (AgsXmlCertificate **) malloc(AGS_CERTIFICATE_MANAGER_TEST_REMOVE_CERTIFICATE_XML_CERTIFICATE_COUNT * sizeof(AgsXmlCertificate *)); for(i = 0; i < AGS_CERTIFICATE_MANAGER_TEST_REMOVE_CERTIFICATE_XML_CERTIFICATE_COUNT; i++){ xml_certificate[i] = ags_xml_certificate_new(); certificate_manager->certificate = g_list_prepend(certificate_manager->certificate, xml_certificate[i]); } for(i = 0; i < AGS_CERTIFICATE_MANAGER_TEST_REMOVE_CERTIFICATE_XML_CERTIFICATE_COUNT; i++){ ags_certificate_manager_remove_certificate(certificate_manager, xml_certificate[i]); } start_certificate = ags_certificate_manager_get_certificate(certificate_manager); CU_ASSERT(start_certificate == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsCertificateManagerTest", ags_certificate_manager_test_init_suite, ags_certificate_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsCertificateManager get certificate", ags_certificate_manager_test_get_certificate) == NULL) || (CU_add_test(pSuite, "test of AgsCertificateManager add certificate", ags_certificate_manager_test_add_certificate) == NULL) || (CU_add_test(pSuite, "test of AgsCertificateManager remove certificate", ags_certificate_manager_test_remove_certificate) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_xml_certificate_test.c0000644000175000017500000003254713614062654022727 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_xml_certificate_test_init_suite(); int ags_xml_certificate_test_clean_suite(); void ags_xml_certificate_test_get_cert_uuid(); void ags_xml_certificate_test_set_domain(); void ags_xml_certificate_test_get_domain(); void ags_xml_certificate_test_set_key_type(); void ags_xml_certificate_test_get_key_type(); void ags_xml_certificate_test_set_public_key_file(); void ags_xml_certificate_test_get_public_key_file(); void ags_xml_certificate_test_set_private_key_file(); void ags_xml_certificate_test_get_private_key_file(); void ags_xml_certificate_test_open_filename(); #define AGS_XML_CERTIFICATE_TEST_GET_CERT_UUID_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_GET_CERT_UUID_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_DOMAIN "ags-test-domain" #define AGS_XML_CERTIFICATE_TEST_GET_DOMAIN_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_GET_DOMAIN_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_GET_DOMAIN_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_KEY_TYPE "ags-test-key-type" #define AGS_XML_CERTIFICATE_TEST_GET_KEY_TYPE_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_GET_KEY_TYPE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_GET_KEY_TYPE_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_PUBLIC_KEY_FILE "./ags-test-public-key-file" #define AGS_XML_CERTIFICATE_TEST_GET_PUBLIC_KEY_FILE_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_GET_PUBLIC_KEY_FILE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_GET_PUBLIC_KEY_FILE_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_PRIVATE_KEY_FILE "./ags-test-private-key-file" #define AGS_XML_CERTIFICATE_TEST_GET_PRIVATE_KEY_FILE_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_CERTIFICATE_TEST_GET_PRIVATE_KEY_FILE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_CERTIFICATE_TEST_GET_PRIVATE_KEY_FILE_DEFAULT_CERT_UUID "ags-test-cert-uuid" #define AGS_XML_CERTIFICATE_TEST_OPEN_FILENAME SRCDIR "/" "ags_certificate_test.xml" AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_certificate_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_certificate_test_clean_suite() { return(0); } void ags_xml_certificate_test_get_cert_uuid() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_certificate_get_cert_uuid(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_GET_CERT_UUID_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_GET_CERT_UUID_DEFAULT_SECURITY_TOKEN, &error); //TODO:JK: implement me } void ags_xml_certificate_test_set_domain() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_certificate_set_domain(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_CERT_UUID, AGS_XML_CERTIFICATE_TEST_SET_DOMAIN_DEFAULT_DOMAIN, &error); //TODO:JK: implement me } void ags_xml_certificate_test_get_domain() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; gchar *domain; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; domain = ags_certificate_get_domain(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_GET_DOMAIN_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_GET_DOMAIN_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_GET_DOMAIN_DEFAULT_CERT_UUID, &error); CU_ASSERT(domain == NULL); //TODO:JK: implement me } void ags_xml_certificate_test_set_key_type() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_certificate_set_key_type(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_CERT_UUID, AGS_XML_CERTIFICATE_TEST_SET_KEY_TYPE_DEFAULT_KEY_TYPE, &error); //TODO:JK: implement me } void ags_xml_certificate_test_get_key_type() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; gchar *key_type; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; key_type = ags_certificate_get_key_type(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_GET_KEY_TYPE_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_GET_KEY_TYPE_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_GET_KEY_TYPE_DEFAULT_CERT_UUID, &error); CU_ASSERT(key_type == NULL); //TODO:JK: implement me } void ags_xml_certificate_test_set_public_key_file() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_certificate_set_public_key_file(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_CERT_UUID, AGS_XML_CERTIFICATE_TEST_SET_PUBLIC_KEY_FILE_DEFAULT_PUBLIC_KEY_FILE, &error); //TODO:JK: implement me } void ags_xml_certificate_test_get_public_key_file() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; gchar *public_key_file; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; public_key_file = ags_certificate_get_public_key_file(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_GET_PUBLIC_KEY_FILE_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_GET_PUBLIC_KEY_FILE_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_GET_PUBLIC_KEY_FILE_DEFAULT_CERT_UUID, &error); CU_ASSERT(public_key_file == NULL); //TODO:JK: implement me } void ags_xml_certificate_test_set_private_key_file() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_certificate_set_private_key_file(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_CERT_UUID, AGS_XML_CERTIFICATE_TEST_SET_PRIVATE_KEY_FILE_DEFAULT_PRIVATE_KEY_FILE, &error); //TODO:JK: implement me } void ags_xml_certificate_test_get_private_key_file() { AgsXmlCertificate *xml_certificate; AgsSecurityContext *security_context; gchar *private_key_file; GError *error; xml_certificate = ags_xml_certificate_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; private_key_file = ags_certificate_get_private_key_file(AGS_CERTIFICATE(xml_certificate), security_context, AGS_XML_CERTIFICATE_TEST_GET_PRIVATE_KEY_FILE_DEFAULT_USER_UUID, AGS_XML_CERTIFICATE_TEST_GET_PRIVATE_KEY_FILE_DEFAULT_SECURITY_TOKEN, AGS_XML_CERTIFICATE_TEST_GET_PRIVATE_KEY_FILE_DEFAULT_CERT_UUID, &error); CU_ASSERT(private_key_file == NULL); //TODO:JK: implement me } void ags_xml_certificate_test_open_filename() { AgsXmlPasswordStore *xml_certificate; xml_certificate = ags_xml_certificate_new(); ags_xml_certificate_open_filename(xml_certificate, AGS_XML_CERTIFICATE_TEST_OPEN_FILENAME); CU_ASSERT(xml_certificate->filename != NULL); CU_ASSERT(xml_certificate->doc != NULL); CU_ASSERT(xml_certificate->root_node != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsXmlCertificateTest", ags_xml_certificate_test_init_suite, ags_xml_certificate_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsXmlCertificate get cert UUID", ags_xml_certificate_test_get_cert_uuid) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate set domain", ags_xml_certificate_test_set_domain) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate get domain", ags_xml_certificate_test_get_domain) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate set key type", ags_xml_certificate_test_set_key_type) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate get key type", ags_xml_certificate_test_get_key_type) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate set public key file", ags_xml_certificate_test_set_public_key_file) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate get public key file", ags_xml_certificate_test_get_public_key_file) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate set private key file", ags_xml_certificate_test_set_private_key_file) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate get private key file", ags_xml_certificate_test_get_private_key_file) == NULL) || (CU_add_test(pSuite, "test of AgsXmlCertificate open filename", ags_xml_certificate_test_open_filename) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_xml_authentication_test.c0000644000175000017500000002076113614062654023457 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_xml_authentication_test_init_suite(); int ags_xml_authentication_test_clean_suite(); void ags_xml_authentication_test_get_authentication_module(); void ags_xml_authentication_test_login(); void ags_xml_authentication_test_logout(); void ags_xml_authentication_test_generate_token(); void ags_xml_authentication_test_get_digest(); void ags_xml_authentication_test_is_session_active(); void ags_xml_authentication_test_open_filename(); void ags_xml_authentication_test_find_user_uuid(); #define AGS_XML_AUTHENTICATION_TEST_LOGIN_DEFAULT_LOGIN "ags-test-user" #define AGS_XML_AUTHENTICATION_TEST_LOGIN_DEFAULT_PASSWORD "ags-test-password" #define AGS_XML_AUTHENTICATION_TEST_LOGOUT_DEFAULT_LOGIN "ags-test-user" #define AGS_XML_AUTHENTICATION_TEST_LOGOUT_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_AUTHENTICATION_TEST_GET_DIGEST_DEFAULT_REALM "ags-test-realm" #define AGS_XML_AUTHENTICATION_TEST_GET_DIGEST_DEFAULT_LOGIN "ags-test-user" #define AGS_XML_AUTHENTICATION_TEST_GET_DIGEST_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_AUTHENTICATION_TEST_IS_SESSION_ACTIVE_DEFAULT_LOGIN "ags-test-user" #define AGS_XML_AUTHENTICATION_TEST_IS_SESSION_ACTIVE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_AUTHENTICATION_TEST_OPEN_FILENAME SRCDIR "/" "ags_authentication_test.xml" AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_authentication_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_authentication_test_clean_suite() { return(0); } void ags_xml_authentication_test_get_authentication_module() { AgsXmlAuthentication *xml_authentication; gchar **authentication_module; gchar **iter; guint i; xml_authentication = ags_xml_authentication_new(); authentication_module = ags_authentication_get_authentication_module(AGS_AUTHENTICATION(xml_authentication)); CU_ASSERT(authentication_module != NULL); i = 0; if(authentication_module != NULL){ iter = authentication_module; for(; iter[0] != NULL; i++, iter++); } CU_ASSERT(i > 0); } void ags_xml_authentication_test_login() { AgsXmlAuthentication *xml_authentication; gchar *user_uuid, *security_token; gboolean success; GError *error; xml_authentication = ags_xml_authentication_new(); error = NULL; success = ags_authentication_login(AGS_AUTHENTICATION(xml_authentication), AGS_XML_AUTHENTICATION_TEST_LOGIN_DEFAULT_LOGIN, AGS_XML_AUTHENTICATION_TEST_LOGIN_DEFAULT_PASSWORD, &user_uuid, &security_token, &error); CU_ASSERT(success == FALSE); CU_ASSERT(user_uuid == NULL); CU_ASSERT(security_token == NULL); //TODO:JK: implement me } void ags_xml_authentication_test_logout() { AgsXmlAuthentication *xml_authentication; AgsSecurityContext *security_context; gboolean success; GError *error; xml_authentication = ags_xml_authentication_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; success = ags_authentication_logout(AGS_AUTHENTICATION(xml_authentication), security_context, AGS_XML_AUTHENTICATION_TEST_LOGOUT_DEFAULT_LOGIN, AGS_XML_AUTHENTICATION_TEST_LOGOUT_DEFAULT_SECURITY_TOKEN, &error); CU_ASSERT(success == FALSE); //TODO:JK: implement me } void ags_xml_authentication_test_generate_token() { AgsXmlAuthentication *xml_authentication; gchar *security_token; GError *error; xml_authentication = ags_xml_authentication_new(); error = NULL; security_token = ags_authentication_generate_token(AGS_AUTHENTICATION(xml_authentication), &error); CU_ASSERT(security_token != NULL); g_free(security_token); } void ags_xml_authentication_test_get_digest() { AgsXmlAuthentication *xml_authentication; gchar *digest; GError *error; xml_authentication = ags_xml_authentication_new(); error = NULL; digest = ags_authentication_get_digest(AGS_AUTHENTICATION(xml_authentication), AGS_XML_AUTHENTICATION_TEST_GET_DIGEST_DEFAULT_REALM, AGS_XML_AUTHENTICATION_TEST_GET_DIGEST_DEFAULT_LOGIN, AGS_XML_AUTHENTICATION_TEST_GET_DIGEST_DEFAULT_SECURITY_TOKEN, &error); CU_ASSERT(digest == NULL); //TODO:JK: implement me } void ags_xml_authentication_test_is_session_active() { AgsXmlAuthentication *xml_authentication; AgsSecurityContext *security_context; gboolean success; GError *error; xml_authentication = ags_xml_authentication_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; success = ags_authentication_logout(AGS_AUTHENTICATION(xml_authentication), security_context, AGS_XML_AUTHENTICATION_TEST_IS_SESSION_ACTIVE_DEFAULT_LOGIN, AGS_XML_AUTHENTICATION_TEST_IS_SESSION_ACTIVE_DEFAULT_SECURITY_TOKEN, &error); CU_ASSERT(success == FALSE); //TODO:JK: implement me } void ags_xml_authentication_test_open_filename() { AgsXmlAuthentication *xml_authentication; xml_authentication = ags_xml_authentication_new(); ags_xml_authentication_open_filename(xml_authentication, AGS_XML_AUTHENTICATION_TEST_OPEN_FILENAME); CU_ASSERT(xml_authentication->filename != NULL); CU_ASSERT(xml_authentication->doc != NULL); CU_ASSERT(xml_authentication->root_node != NULL); } void ags_xml_authentication_test_find_user_uuid() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsXmlAuthenticationTest", ags_xml_authentication_test_init_suite, ags_xml_authentication_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsXmlAuthentication get authentication module", ags_xml_authentication_test_get_authentication_module) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication login", ags_xml_authentication_test_login) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication logout", ags_xml_authentication_test_logout) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication generate token", ags_xml_authentication_test_generate_token) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication get digest", ags_xml_authentication_test_get_digest) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication is session active", ags_xml_authentication_test_is_session_active) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication open filename", ags_xml_authentication_test_open_filename) == NULL) || (CU_add_test(pSuite, "test of AgsXmlAuthentication find user UUID", ags_xml_authentication_test_find_user_uuid) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_security_context_test.c0000644000175000017500000001021413607210263023154 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_security_context_test_init_suite(); int ags_security_context_test_clean_suite(); void ags_security_context_test_parse_business_group(); void ags_security_context_test_add_server_context(); void ags_security_context_test_remove_server_context(); /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_security_context_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_security_context_test_clean_suite() { return(0); } void ags_security_context_test_parse_business_group() { //TODO:JK: implement me } void ags_security_context_test_add_server_context() { AgsSecurityContext *security_context; security_context = ags_security_context_new(); ags_security_context_add_server_context(security_context, "/ags-xmlrpc/logout"); CU_ASSERT(g_strv_contains(security_context->server_context, "/ags-xmlrpc/logout") == TRUE); ags_security_context_add_server_context(security_context, "/ags-xmlrpc/osc"); CU_ASSERT(g_strv_contains(security_context->server_context, "/ags-xmlrpc/logout") == TRUE); CU_ASSERT(g_strv_contains(security_context->server_context, "/ags-xmlrpc/osc") == TRUE); } void ags_security_context_test_remove_server_context() { AgsSecurityContext *security_context; security_context = ags_security_context_new(); security_context->server_context = (gchar **) malloc(3 * sizeof(gchar *)); security_context->server_context[0] = g_strdup("/ags-xmlrpc/logout"); security_context->server_context[1] = g_strdup("/ags-xmlrpc/osc"); security_context->server_context[2] = NULL; /* remove #0 */ ags_security_context_remove_server_context(security_context, "/ags-xmlrpc/logout"); CU_ASSERT(g_strv_contains(security_context->server_context, "/ags-xmlrpc/logout") == FALSE); CU_ASSERT(g_strv_contains(security_context->server_context, "/ags-xmlrpc/osc") == TRUE); /* remove #1 */ ags_security_context_remove_server_context(security_context, "/ags-xmlrpc/osc"); CU_ASSERT(security_context->server_context == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsSecurityContextTest", ags_security_context_test_init_suite, ags_security_context_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsSecurityContext parse business group", ags_security_context_test_parse_business_group) == NULL) || (CU_add_test(pSuite, "test of AgsSecurityContext add server context", ags_security_context_test_add_server_context) == NULL) || (CU_add_test(pSuite, "test of AgsSecurityContext remove server context", ags_security_context_test_remove_server_context) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_xml_business_group_test.c0000644000175000017500000002142013614062654023500 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_xml_business_group_test_init_suite(); int ags_xml_business_group_test_clean_suite(); void ags_xml_business_group_test_get_group_uuid(); void ags_xml_business_group_test_set_group_name(); void ags_xml_business_group_test_get_group_name(); void ags_xml_business_group_test_set_user(); void ags_xml_business_group_test_get_user(); void ags_xml_business_group_test_open_filename(); #define AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_UUID_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_UUID_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_GROUP_UUID "ags-test-group-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_GROUP_NAME "ags-test-group-name" #define AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_NAME_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_NAME_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_NAME_DEFAULT_GROUP_UUID "ags-test-group-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_SET_USER_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_SET_USER_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_BUSINESS_GROUP_TEST_SET_USER_DEFAULT_GROUP_UUID "ags-test-group-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_GET_USER_DEFAULT_USER_UUID "ags-test-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_GET_USER_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_XML_BUSINESS_GROUP_TEST_GET_USER_DEFAULT_GROUP_UUID "ags-test-group-uuid" #define AGS_XML_BUSINESS_GROUP_TEST_OPEN_FILENAME SRCDIR "/" "ags_business_group_test.xml" AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_business_group_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_xml_business_group_test_clean_suite() { return(0); } void ags_xml_business_group_test_get_group_uuid() { AgsXmlBusinessGroup *xml_business_group; AgsSecurityContext *security_context; GError *error; xml_business_group = ags_xml_business_group_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_business_group_get_group_uuid(AGS_BUSINESS_GROUP(xml_business_group), security_context, AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_UUID_DEFAULT_USER_UUID, AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_UUID_DEFAULT_SECURITY_TOKEN, &error); //TODO:JK: implement me } void ags_xml_business_group_test_set_group_name() { AgsXmlBusinessGroup *xml_business_group; AgsSecurityContext *security_context; GError *error; xml_business_group = ags_xml_business_group_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_business_group_set_group_name(AGS_BUSINESS_GROUP(xml_business_group), security_context, AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_USER_UUID, AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_SECURITY_TOKEN, AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_GROUP_UUID, AGS_XML_BUSINESS_GROUP_TEST_SET_GROUP_NAME_DEFAULT_GROUP_NAME, &error); //TODO:JK: implement me } void ags_xml_business_group_test_get_group_name() { AgsXmlBusinessGroup *xml_business_group; AgsSecurityContext *security_context; gchar *group_name; GError *error; xml_business_group = ags_xml_business_group_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; group_name = ags_business_group_get_group_name(AGS_BUSINESS_GROUP(xml_business_group), security_context, AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_NAME_DEFAULT_USER_UUID, AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_NAME_DEFAULT_SECURITY_TOKEN, AGS_XML_BUSINESS_GROUP_TEST_GET_GROUP_NAME_DEFAULT_GROUP_UUID, &error); CU_ASSERT(group_name == NULL); //TODO:JK: implement me } void ags_xml_business_group_test_set_user() { AgsXmlBusinessGroup *xml_business_group; AgsSecurityContext *security_context; GError *error; static const gchar **default_user = { "ags-test-user-uuid-0", "ags-test-user-uuid-1", "ags-test-user-uuid-2", NULL, }; xml_business_group = ags_xml_business_group_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; ags_business_group_set_user(AGS_BUSINESS_GROUP(xml_business_group), security_context, AGS_XML_BUSINESS_GROUP_TEST_SET_USER_DEFAULT_USER_UUID, AGS_XML_BUSINESS_GROUP_TEST_SET_USER_DEFAULT_SECURITY_TOKEN, AGS_XML_BUSINESS_GROUP_TEST_SET_USER_DEFAULT_GROUP_UUID, default_user, &error); //TODO:JK: implement me } void ags_xml_business_group_test_get_user() { AgsXmlBusinessGroup *xml_business_group; AgsSecurityContext *security_context; gchar *user; GError *error; xml_business_group = ags_xml_business_group_new(); security_context = ags_auth_security_context_get_instance(); error = NULL; user = ags_business_group_get_user(AGS_BUSINESS_GROUP(xml_business_group), security_context, AGS_XML_BUSINESS_GROUP_TEST_GET_USER_DEFAULT_USER_UUID, AGS_XML_BUSINESS_GROUP_TEST_GET_USER_DEFAULT_SECURITY_TOKEN, AGS_XML_BUSINESS_GROUP_TEST_GET_USER_DEFAULT_GROUP_UUID, &error); CU_ASSERT(user == NULL); //TODO:JK: implement me } void ags_xml_business_group_test_open_filename() { AgsXmlPasswordStore *xml_business_group; xml_business_group = ags_xml_business_group_new(); ags_xml_business_group_open_filename(xml_business_group, AGS_XML_BUSINESS_GROUP_TEST_OPEN_FILENAME); CU_ASSERT(xml_business_group->filename != NULL); CU_ASSERT(xml_business_group->doc != NULL); CU_ASSERT(xml_business_group->root_node != NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsXmlBusinessGroupTest", ags_xml_business_group_test_init_suite, ags_xml_business_group_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsXmlBusinessGroup get group UUID", ags_xml_business_group_test_get_group_uuid) == NULL) || (CU_add_test(pSuite, "test of AgsXmlBusinessGroup set group name", ags_xml_business_group_test_set_group_name) == NULL) || (CU_add_test(pSuite, "test of AgsXmlBusinessGroup get group name", ags_xml_business_group_test_get_group_name) == NULL) || (CU_add_test(pSuite, "test of AgsXmlBusinessGroup set user", ags_xml_business_group_test_set_user) == NULL) || (CU_add_test(pSuite, "test of AgsXmlBusinessGroup get user", ags_xml_business_group_test_get_user) == NULL) || (CU_add_test(pSuite, "test of AgsXmlBusinessGroup open filename", ags_xml_business_group_test_open_filename) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_business_group_manager_test.c0000644000175000017500000001636113614062654024322 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_business_group_manager_test_init_suite(); int ags_business_group_manager_test_clean_suite(); void ags_business_group_manager_test_get_business_group(); void ags_business_group_manager_test_add_business_group(); void ags_business_group_manager_test_remove_business_group(); #define AGS_BUSINESS_GROUP_MANAGER_TEST_GET_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT (7) #define AGS_BUSINESS_GROUP_MANAGER_TEST_ADD_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT (9) #define AGS_BUSINESS_GROUP_MANAGER_TEST_REMOVE_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT (13) AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_business_group_manager_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_business_group_manager_test_clean_suite() { return(0); } void ags_business_group_manager_test_get_business_group() { AgsBusinessGroupManager *business_group_manager; AgsXmlBusinessGroup **xml_business_group; GList *start_business_group, *business_group; guint i; business_group_manager = ags_business_group_manager_get_instance(); business_group_manager->business_group = NULL; /* assert #0 - empty */ start_business_group = ags_business_group_manager_get_business_group(business_group_manager); CU_ASSERT(start_business_group == NULL); /* assert #1 - with business group */ xml_business_group = (AgsXmlBusinessGroup **) malloc(AGS_BUSINESS_GROUP_MANAGER_TEST_GET_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT * sizeof(AgsXmlBusinessGroup *)); for(i = 0; i < AGS_BUSINESS_GROUP_MANAGER_TEST_GET_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT; i++){ xml_business_group[i] = ags_xml_business_group_new(); business_group_manager->business_group = g_list_prepend(business_group_manager->business_group, xml_business_group[i]); } start_business_group = ags_business_group_manager_get_business_group(business_group_manager); CU_ASSERT(start_business_group != NULL); CU_ASSERT(g_list_length(start_business_group) == AGS_BUSINESS_GROUP_MANAGER_TEST_GET_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT); } void ags_business_group_manager_test_add_business_group() { AgsBusinessGroupManager *business_group_manager; AgsXmlBusinessGroup **xml_business_group; GList *start_business_group, *business_group; guint i; business_group_manager = ags_business_group_manager_get_instance(); business_group_manager->business_group = NULL; /* assert #0 - empty */ start_business_group = ags_business_group_manager_get_business_group(business_group_manager); CU_ASSERT(start_business_group == NULL); /* assert #1 - with business group */ xml_business_group = (AgsXmlBusinessGroup **) malloc(AGS_BUSINESS_GROUP_MANAGER_TEST_ADD_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT * sizeof(AgsXmlBusinessGroup *)); for(i = 0; i < AGS_BUSINESS_GROUP_MANAGER_TEST_ADD_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT; i++){ xml_business_group[i] = ags_xml_business_group_new(); ags_business_group_manager_add_business_group(business_group_manager, xml_business_group[i]); } start_business_group = ags_business_group_manager_get_business_group(business_group_manager); CU_ASSERT(start_business_group != NULL); CU_ASSERT(g_list_length(start_business_group) == AGS_BUSINESS_GROUP_MANAGER_TEST_ADD_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT); } void ags_business_group_manager_test_remove_business_group() { AgsBusinessGroupManager *business_group_manager; AgsXmlBusinessGroup **xml_business_group; GList *start_business_group, *business_group; guint i; business_group_manager = ags_business_group_manager_get_instance(); business_group_manager->business_group = NULL; /* assert #0 - empty */ start_business_group = ags_business_group_manager_get_business_group(business_group_manager); CU_ASSERT(start_business_group == NULL); /* assert #1 - with business group */ xml_business_group = (AgsXmlBusinessGroup **) malloc(AGS_BUSINESS_GROUP_MANAGER_TEST_REMOVE_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT * sizeof(AgsXmlBusinessGroup *)); for(i = 0; i < AGS_BUSINESS_GROUP_MANAGER_TEST_REMOVE_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT; i++){ xml_business_group[i] = ags_xml_business_group_new(); business_group_manager->business_group = g_list_prepend(business_group_manager->business_group, xml_business_group[i]); } for(i = 0; i < AGS_BUSINESS_GROUP_MANAGER_TEST_REMOVE_BUSINESS_GROUP_XML_BUSINESS_GROUP_COUNT; i++){ ags_business_group_manager_remove_business_group(business_group_manager, xml_business_group[i]); } start_business_group = ags_business_group_manager_get_business_group(business_group_manager); CU_ASSERT(start_business_group == NULL); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsBusinessGroupManagerTest", ags_business_group_manager_test_init_suite, ags_business_group_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsBusinessGroupManager get business group", ags_business_group_manager_test_get_business_group) == NULL) || (CU_add_test(pSuite, "test of AgsBusinessGroupManager add business group", ags_business_group_manager_test_add_business_group) == NULL) || (CU_add_test(pSuite, "test of AgsBusinessGroupManager remove business group", ags_business_group_manager_test_remove_business_group) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_password_store_manager_test.c0000644000175000017500000002012313614062654024320 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_password_store_manager_test_init_suite(); int ags_password_store_manager_test_clean_suite(); void ags_password_store_manager_test_get_password_store(); void ags_password_store_manager_test_add_password_store(); void ags_password_store_manager_test_remove_password_store(); void ags_password_store_manager_test_check_password(); #define AGS_PASSWORD_STORE_MANAGER_TEST_GET_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT (7) #define AGS_PASSWORD_STORE_MANAGER_TEST_ADD_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT (9) #define AGS_PASSWORD_STORE_MANAGER_TEST_REMOVE_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT (13) #define AGS_PASSWORD_STORE_MANAGER_TEST_CHECK_PASSWORD_DEFAULT_LOGIN "ags-test-login" #define AGS_PASSWORD_STORE_MANAGER_TEST_CHECK_PASSWORD_DEFAULT_PASSWORD "ags-test-password" AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_password_store_manager_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_password_store_manager_test_clean_suite() { return(0); } void ags_password_store_manager_test_get_password_store() { AgsPasswordStoreManager *password_store_manager; AgsXmlPasswordStore **xml_password_store; GList *start_password_store, *password_store; guint i; password_store_manager = ags_password_store_manager_get_instance(); password_store_manager->password_store = NULL; /* assert #0 - empty */ start_password_store = ags_password_store_manager_get_password_store(password_store_manager); CU_ASSERT(start_password_store == NULL); /* assert #1 - with password store */ xml_password_store = (AgsXmlPasswordStore **) malloc(AGS_PASSWORD_STORE_MANAGER_TEST_GET_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT * sizeof(AgsXmlPasswordStore *)); for(i = 0; i < AGS_PASSWORD_STORE_MANAGER_TEST_GET_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT; i++){ xml_password_store[i] = ags_xml_password_store_new(); password_store_manager->password_store = g_list_prepend(password_store_manager->password_store, xml_password_store[i]); } start_password_store = ags_password_store_manager_get_password_store(password_store_manager); CU_ASSERT(start_password_store != NULL); CU_ASSERT(g_list_length(start_password_store) == AGS_PASSWORD_STORE_MANAGER_TEST_GET_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT); } void ags_password_store_manager_test_add_password_store() { AgsPasswordStoreManager *password_store_manager; AgsXmlPasswordStore **xml_password_store; GList *start_password_store, *password_store; guint i; password_store_manager = ags_password_store_manager_get_instance(); password_store_manager->password_store = NULL; /* assert #0 - empty */ start_password_store = ags_password_store_manager_get_password_store(password_store_manager); CU_ASSERT(start_password_store == NULL); /* assert #1 - with password store */ xml_password_store = (AgsXmlPasswordStore **) malloc(AGS_PASSWORD_STORE_MANAGER_TEST_ADD_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT * sizeof(AgsXmlPasswordStore *)); for(i = 0; i < AGS_PASSWORD_STORE_MANAGER_TEST_ADD_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT; i++){ xml_password_store[i] = ags_xml_password_store_new(); ags_password_store_manager_add_password_store(password_store_manager, xml_password_store[i]); } start_password_store = ags_password_store_manager_get_password_store(password_store_manager); CU_ASSERT(start_password_store != NULL); CU_ASSERT(g_list_length(start_password_store) == AGS_PASSWORD_STORE_MANAGER_TEST_ADD_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT); } void ags_password_store_manager_test_remove_password_store() { AgsPasswordStoreManager *password_store_manager; AgsXmlPasswordStore **xml_password_store; GList *start_password_store, *password_store; guint i; password_store_manager = ags_password_store_manager_get_instance(); password_store_manager->password_store = NULL; /* assert #0 - empty */ start_password_store = ags_password_store_manager_get_password_store(password_store_manager); CU_ASSERT(start_password_store == NULL); /* assert #1 - with password store */ xml_password_store = (AgsXmlPasswordStore **) malloc(AGS_PASSWORD_STORE_MANAGER_TEST_REMOVE_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT * sizeof(AgsXmlPasswordStore *)); for(i = 0; i < AGS_PASSWORD_STORE_MANAGER_TEST_REMOVE_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT; i++){ xml_password_store[i] = ags_xml_password_store_new(); password_store_manager->password_store = g_list_prepend(password_store_manager->password_store, xml_password_store[i]); } for(i = 0; i < AGS_PASSWORD_STORE_MANAGER_TEST_REMOVE_PASSWORD_STORE_XML_PASSWORD_STORE_COUNT; i++){ ags_password_store_manager_remove_password_store(password_store_manager, xml_password_store[i]); } start_password_store = ags_password_store_manager_get_password_store(password_store_manager); CU_ASSERT(start_password_store == NULL); } void ags_password_store_manager_test_check_password() { AgsPasswordStoreManager *password_store_manager; gboolean success; password_store_manager = ags_password_store_manager_get_instance(); success = ags_password_store_manager_check_password(password_store_manager, AGS_PASSWORD_STORE_MANAGER_TEST_CHECK_PASSWORD_DEFAULT_LOGIN, AGS_PASSWORD_STORE_MANAGER_TEST_CHECK_PASSWORD_DEFAULT_PASSWORD); CU_ASSERT(success == FALSE); //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsPasswordStoreManagerTest", ags_password_store_manager_test_init_suite, ags_password_store_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsPasswordStoreManager get password store", ags_password_store_manager_test_get_password_store) == NULL) || (CU_add_test(pSuite, "test of AgsPasswordStoreManager add password store", ags_password_store_manager_test_add_password_store) == NULL) || (CU_add_test(pSuite, "test of AgsPasswordStoreManager remove password store", ags_password_store_manager_test_remove_password_store) == NULL) || (CU_add_test(pSuite, "test of AgsPasswordStoreManager check password", ags_password_store_manager_test_check_password) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/security/ags_authentication_manager_test.c0000644000175000017500000003731713614062654024276 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_authentication_manager_test_init_suite(); int ags_authentication_manager_test_clean_suite(); void ags_authentication_manager_test_login_info_alloc(); void ags_authentication_manager_test_login_info_free(); void ags_authentication_manager_test_login_info_ref(); void ags_authentication_manager_test_login_info_unref(); void ags_authentication_manager_test_get_authentication(); void ags_authentication_manager_test_add_authentication(); void ags_authentication_manager_test_remove_authentication(); void ags_authentication_manager_test_get_session_timeout(); void ags_authentication_manager_test_lookup_login(); void ags_authentication_manager_test_insert_login(); void ags_authentication_manager_test_remove_login(); void ags_authentication_manager_test_login(); void ags_authentication_manager_test_logout(); void ags_authentication_manager_test_get_digest(); void ags_authentication_manager_test_is_session_active(); #define AGS_AUTHENTICATION_MANAGER_TEST_GET_AUTHENTICATION_XML_AUTHENTICATION_COUNT (7) #define AGS_AUTHENTICATION_MANAGER_TEST_ADD_AUTHENTICATION_XML_AUTHENTICATION_COUNT (9) #define AGS_AUTHENTICATION_MANAGER_TEST_REMOVE_AUTHENTICATION_XML_AUTHENTICATION_COUNT (13) #define AGS_AUTHENTICATION_MANAGER_TEST_LOOKUP_LOGIN_DEFAULT_LOGIN "ags-test-login" #define AGS_AUTHENTICATION_MANAGER_TEST_INSERT_LOGIN_DEFAULT_LOGIN "ags-test-login" #define AGS_AUTHENTICATION_MANAGER_TEST_REMOVE_LOGIN_DEFAULT_LOGIN "ags-test-login" #define AGS_AUTHENTICATION_MANAGER_TEST_LOGIN_DEFAULT_AUTHENTICATION_MODULE "ags-xml-authentication" #define AGS_AUTHENTICATION_MANAGER_TEST_LOGIN_DEFAULT_LOGIN "ags-test-login" #define AGS_AUTHENTICATION_MANAGER_TEST_LOGIN_DEFAULT_PASSWORD "ags-test-password" #define AGS_AUTHENTICATION_MANAGER_TEST_LOGOUT_DEFAULT_AUTHENTICATION_MODULE "ags-xml-authentication" #define AGS_AUTHENTICATION_MANAGER_TEST_LOGOUT_DEFAULT_LOGIN "ags-test-login" #define AGS_AUTHENTICATION_MANAGER_TEST_LOGOUT_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_AUTHENTICATION_MODULE "ags-xml-authentication" #define AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_REALM "ags-test-realm" #define AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_LOGIN "ags-test-login" #define AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_SECURITY_TOKEN "ags-test-security-token" #define AGS_AUTHENTICATION_MANAGER_TEST_IS_SESSION_ACTIVE_DEFAULT_USER_UUID "ags-test-user-uuid" #define AGS_AUTHENTICATION_MANAGER_TEST_IS_SESSION_ACTIVE_DEFAULT_SECURITY_TOKEN "ags-test-security-token" AgsServerApplicationContext *server_application_context; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_authentication_manager_test_init_suite() { AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_authentication_manager_test_clean_suite() { return(0); } void ags_authentication_manager_test_login_info_alloc() { AgsLoginInfo *login_info; login_info = ags_login_info_alloc(); CU_ASSERT(login_info != 0); CU_ASSERT(login_info->ref_count == 1); CU_ASSERT(login_info->active_session_count == 0); CU_ASSERT(login_info->user_uuid == NULL); CU_ASSERT(login_info->security_context == NULL); } void ags_authentication_manager_test_login_info_free() { AgsLoginInfo *login_info; /* check empty */ login_info = ags_login_info_alloc(); ags_login_info_free(login_info); /* check with fields */ login_info = ags_login_info_alloc(); login_info->user_uuid = g_strdup("ags-test-uuid"); login_info->security_context = ags_security_context_new(); ags_login_info_free(login_info); } void ags_authentication_manager_test_login_info_ref() { AgsLoginInfo *login_info; /* check empty */ login_info = ags_login_info_alloc(); ags_login_info_ref(login_info); } void ags_authentication_manager_test_login_info_unref() { AgsLoginInfo *login_info; /* check empty */ login_info = ags_login_info_alloc(); ags_login_info_unref(login_info); } void ags_authentication_manager_test_get_authentication() { AgsAuthenticationManager *authentication_manager; AgsXmlAuthentication **xml_authentication; GList *start_authentication, *authentication; guint i; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager->authentication = NULL; /* assert #0 - empty */ start_authentication = ags_authentication_manager_get_authentication(authentication_manager); CU_ASSERT(start_authentication == NULL); /* assert #1 - with authentication */ xml_authentication = (AgsXmlAuthentication **) malloc(AGS_AUTHENTICATION_MANAGER_TEST_GET_AUTHENTICATION_XML_AUTHENTICATION_COUNT * sizeof(AgsXmlAuthentication *)); for(i = 0; i < AGS_AUTHENTICATION_MANAGER_TEST_GET_AUTHENTICATION_XML_AUTHENTICATION_COUNT; i++){ xml_authentication[i] = ags_xml_authentication_new(); authentication_manager->authentication = g_list_prepend(authentication_manager->authentication, xml_authentication[i]); } start_authentication = ags_authentication_manager_get_authentication(authentication_manager); CU_ASSERT(start_authentication != NULL); CU_ASSERT(g_list_length(start_authentication) == AGS_AUTHENTICATION_MANAGER_TEST_GET_AUTHENTICATION_XML_AUTHENTICATION_COUNT); } void ags_authentication_manager_test_add_authentication() { AgsAuthenticationManager *authentication_manager; AgsXmlAuthentication **xml_authentication; GList *start_authentication, *authentication; guint i; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager->authentication = NULL; /* assert #0 - empty */ start_authentication = ags_authentication_manager_get_authentication(authentication_manager); CU_ASSERT(start_authentication == NULL); /* assert #1 - with authentication */ xml_authentication = (AgsXmlAuthentication **) malloc(AGS_AUTHENTICATION_MANAGER_TEST_ADD_AUTHENTICATION_XML_AUTHENTICATION_COUNT * sizeof(AgsXmlAuthentication *)); for(i = 0; i < AGS_AUTHENTICATION_MANAGER_TEST_ADD_AUTHENTICATION_XML_AUTHENTICATION_COUNT; i++){ xml_authentication[i] = ags_xml_authentication_new(); ags_authentication_manager_add_authentication(authentication_manager, xml_authentication[i]); } start_authentication = ags_authentication_manager_get_authentication(authentication_manager); CU_ASSERT(start_authentication != NULL); CU_ASSERT(g_list_length(start_authentication) == AGS_AUTHENTICATION_MANAGER_TEST_ADD_AUTHENTICATION_XML_AUTHENTICATION_COUNT); } void ags_authentication_manager_test_remove_authentication() { AgsAuthenticationManager *authentication_manager; AgsXmlAuthentication **xml_authentication; GList *start_authentication, *authentication; guint i; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager->authentication = NULL; /* assert #0 - empty */ start_authentication = ags_authentication_manager_get_authentication(authentication_manager); CU_ASSERT(start_authentication == NULL); /* assert #1 - with authentication */ xml_authentication = (AgsXmlAuthentication **) malloc(AGS_AUTHENTICATION_MANAGER_TEST_REMOVE_AUTHENTICATION_XML_AUTHENTICATION_COUNT * sizeof(AgsXmlAuthentication *)); for(i = 0; i < AGS_AUTHENTICATION_MANAGER_TEST_REMOVE_AUTHENTICATION_XML_AUTHENTICATION_COUNT; i++){ xml_authentication[i] = ags_xml_authentication_new(); authentication_manager->authentication = g_list_prepend(authentication_manager->authentication, xml_authentication[i]); } for(i = 0; i < AGS_AUTHENTICATION_MANAGER_TEST_REMOVE_AUTHENTICATION_XML_AUTHENTICATION_COUNT; i++){ ags_authentication_manager_remove_authentication(authentication_manager, xml_authentication[i]); } start_authentication = ags_authentication_manager_get_authentication(authentication_manager); CU_ASSERT(start_authentication == NULL); } void ags_authentication_manager_test_get_session_timeout() { AgsAuthenticationManager *authentication_manager; gint64 session_timeout; authentication_manager = ags_authentication_manager_get_instance(); session_timeout = ags_authentication_manager_get_session_timeout(authentication_manager); CU_ASSERT(session_timeout != 0); } void ags_authentication_manager_test_lookup_login() { AgsAuthenticationManager *authentication_manager; AgsLoginInfo *login_info; authentication_manager = ags_authentication_manager_get_instance(); login_info = ags_authentication_manager_lookup_login(authentication_manager, AGS_AUTHENTICATION_MANAGER_TEST_LOOKUP_LOGIN_DEFAULT_LOGIN); CU_ASSERT(login_info == NULL); } void ags_authentication_manager_test_insert_login() { AgsAuthenticationManager *authentication_manager; AgsLoginInfo *login_info; authentication_manager = ags_authentication_manager_get_instance(); login_info = ags_login_info_alloc(); ags_authentication_manager_insert_login(authentication_manager, AGS_AUTHENTICATION_MANAGER_TEST_INSERT_LOGIN_DEFAULT_LOGIN, login_info); } void ags_authentication_manager_test_remove_login() { AgsAuthenticationManager *authentication_manager; authentication_manager = ags_authentication_manager_get_instance(); ags_authentication_manager_remove_login(authentication_manager, AGS_AUTHENTICATION_MANAGER_TEST_REMOVE_LOGIN_DEFAULT_LOGIN); } void ags_authentication_manager_test_login() { AgsAuthenticationManager *authentication_manager; gchar *user_uuid; gchar *security_token; gboolean success; authentication_manager = ags_authentication_manager_get_instance(); success = ags_authentication_manager_login(authentication_manager, AGS_AUTHENTICATION_MANAGER_TEST_LOGIN_DEFAULT_AUTHENTICATION_MODULE, AGS_AUTHENTICATION_MANAGER_TEST_LOGIN_DEFAULT_LOGIN, AGS_AUTHENTICATION_MANAGER_TEST_LOGIN_DEFAULT_PASSWORD, &user_uuid, &security_token); CU_ASSERT(success == FALSE); CU_ASSERT(user_uuid == NULL); CU_ASSERT(security_token == NULL); } void ags_authentication_manager_test_logout() { AgsAuthenticationManager *authentication_manager; gboolean success; authentication_manager = ags_authentication_manager_get_instance(); success = ags_authentication_manager_logout(authentication_manager, AGS_AUTHENTICATION_MANAGER_TEST_LOGOUT_DEFAULT_AUTHENTICATION_MODULE, AGS_AUTHENTICATION_MANAGER_TEST_LOGOUT_DEFAULT_LOGIN, AGS_AUTHENTICATION_MANAGER_TEST_LOGOUT_DEFAULT_SECURITY_TOKEN); CU_ASSERT(success == FALSE); } void ags_authentication_manager_test_get_digest() { AgsAuthenticationManager *authentication_manager; gchar *digest; authentication_manager = ags_authentication_manager_get_instance(); digest = ags_authentication_manager_get_digest(authentication_manager, AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_AUTHENTICATION_MODULE, AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_REALM, AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_LOGIN, AGS_AUTHENTICATION_MANAGER_TEST_GET_DIGEST_DEFAULT_SECURITY_TOKEN); CU_ASSERT(digest == NULL); //TODO:JK: implement me } void ags_authentication_manager_test_is_session_active() { AgsAuthenticationManager *authentication_manager; AgsSecurityContext *security_context; gboolean success; authentication_manager = ags_authentication_manager_get_instance(); security_context = ags_security_context_new(); success = ags_authentication_manager_is_session_active(authentication_manager, security_context, AGS_AUTHENTICATION_MANAGER_TEST_IS_SESSION_ACTIVE_DEFAULT_USER_UUID, AGS_AUTHENTICATION_MANAGER_TEST_IS_SESSION_ACTIVE_DEFAULT_SECURITY_TOKEN); CU_ASSERT(success == FALSE); //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsAuthenticationManagerTest", ags_authentication_manager_test_init_suite, ags_authentication_manager_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsAuthenticationManager login info alloc", ags_authentication_manager_test_login_info_alloc) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager login info free", ags_authentication_manager_test_login_info_free) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager login info ref", ags_authentication_manager_test_login_info_ref) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager login info unref", ags_authentication_manager_test_login_info_unref) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager get authentication", ags_authentication_manager_test_get_authentication) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager add authentication", ags_authentication_manager_test_add_authentication) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager remove authentication", ags_authentication_manager_test_remove_authentication) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager get session timeout", ags_authentication_manager_test_get_session_timeout) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager lookup login", ags_authentication_manager_test_lookup_login) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager insert login", ags_authentication_manager_test_insert_login) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager remove login", ags_authentication_manager_test_remove_login) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager login", ags_authentication_manager_test_login) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager logout", ags_authentication_manager_test_logout) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager get digest", ags_authentication_manager_test_get_digest) == NULL) || (CU_add_test(pSuite, "test of AgsAuthenticationManager is session active", ags_authentication_manager_test_is_session_active) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/ags_server_application_context_test.c0000644000175000017500000001153013607210263023331 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_server_application_context_test_init_suite(); int ags_server_application_context_test_clean_suite(); void ags_server_application_context_test_dispose(); void ags_server_application_context_test_finalize(); void ags_server_application_context_test_finalize_stub(GObject *gobject); gboolean server_application_context_test_finalized; extern AgsApplicationContext *ags_application_context; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_server_application_context_test_init_suite() { return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_server_application_context_test_clean_suite() { return(0); } void ags_server_application_context_test_dispose() { AgsServerApplicationContext *server_application_context; AgsConfig *config; config = ags_config_get_instance(); // ags_config_load_from_data(config, // AGS_SERVER_APPLICATION_CONTEXT_TEST_CONFIG, // strlen(AGS_SERVER_APPLICATION_CONTEXT_TEST_CONFIG)); server_application_context = g_object_new(AGS_TYPE_SERVER_APPLICATION_CONTEXT, NULL); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); /* run dispose */ g_object_run_dispose(server_application_context); /* assert */ CU_ASSERT(server_application_context->thread_pool == NULL); CU_ASSERT(server_application_context->worker == NULL); CU_ASSERT(server_application_context->registry == NULL); CU_ASSERT(server_application_context->server == NULL); ags_application_context = NULL; } void ags_server_application_context_test_finalize() { AgsServerApplicationContext *server_application_context; AgsConfig *config; config = ags_config_get_instance(); // ags_config_load_from_data(config, // AGS_SERVER_APPLICATION_CONTEXT_TEST_CONFIG, // strlen(AGS_SERVER_APPLICATION_CONTEXT_TEST_CONFIG)); server_application_context = g_object_new(AGS_TYPE_SERVER_APPLICATION_CONTEXT, NULL); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); /* run dispose */ g_object_run_dispose(server_application_context); /* stub finalize */ server_application_context_test_finalized = FALSE; G_OBJECT_GET_CLASS(server_application_context)->finalize = ags_server_application_context_test_finalize_stub; /* unref and assert */ g_object_unref(server_application_context); CU_ASSERT(server_application_context_test_finalized == TRUE); ags_application_context = NULL; } void ags_server_application_context_test_finalize_stub(GObject *gobject) { server_application_context_test_finalized = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsServerApplicationContextTest", ags_server_application_context_test_init_suite, ags_server_application_context_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsServerApplicationContext doing dispose", ags_server_application_context_test_dispose) == NULL) || (CU_add_test(pSuite, "test of AgsServerApplicationContext doing finalize", ags_server_application_context_test_finalize) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/ags_server_test.c0000644000175000017500000000761613607210263017214 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_server_test_init_suite(); int ags_server_test_clean_suite(); void ags_server_test_test_flags(); void ags_server_test_set_flags(); void ags_server_test_unset_flags(); void ags_server_test_info_alloc(); void ags_server_test_add_controller(); void ags_server_test_remove_controller(); void ags_server_test_start(); void ags_server_test_stop(); void ags_server_test_listen(); void ags_server_test_lookup(); /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_server_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_server_test_clean_suite() { return(0); } void ags_server_test_test_flags() { //TODO:JK: implement me } void ags_server_test_set_flags() { //TODO:JK: implement me } void ags_server_test_unset_flags() { //TODO:JK: implement me } void ags_server_test_info_alloc() { //TODO:JK: implement me } void ags_server_test_add_controller() { //TODO:JK: implement me } void ags_server_test_remove_controller() { //TODO:JK: implement me } void ags_server_test_start() { //TODO:JK: implement me } void ags_server_test_stop() { //TODO:JK: implement me } void ags_server_test_listen() { //TODO:JK: implement me } void ags_server_test_lookup() { //TODO:JK: implement me } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsServerTest\0", ags_server_test_init_suite, ags_server_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsServer test flags", ags_server_test_test_flags) == NULL) || (CU_add_test(pSuite, "test of AgsServer set flags", ags_server_test_set_flags) == NULL) || (CU_add_test(pSuite, "test of AgsServer unset flags", ags_server_test_unset_flags) == NULL) || (CU_add_test(pSuite, "test of AgsServer info alloc", ags_server_test_info_alloc) == NULL) || (CU_add_test(pSuite, "test of AgsServer add controller", ags_server_test_add_controller) == NULL) || (CU_add_test(pSuite, "test of AgsServer remove controller", ags_server_test_remove_controller) == NULL) || (CU_add_test(pSuite, "test of AgsServer start", ags_server_test_start) == NULL) || (CU_add_test(pSuite, "test of AgsServer stop", ags_server_test_stop) == NULL) || (CU_add_test(pSuite, "test of AgsServer listen", ags_server_test_listen) == NULL) || (CU_add_test(pSuite, "test of AgsServer lookup", ags_server_test_lookup) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/server/ags_functional_server_test.c0000644000175000017500000001655213614062654021444 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include int ags_functional_server_test_init_suite(); int ags_functional_server_test_clean_suite(); void ags_functional_server_test_authenticate(); void ags_functional_server_test_authenticate_authenticate_callback(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data); #define AGS_FUNCTIONAL_SERVER_TEST_CONFIG "[server]\n" \ "realm=ags-test-realm\n" \ "auto-start=true\n" \ "any-address=false\n" \ "enable-ip4=true\n" \ "ip4-address=127.0.0.1\n" \ "enable-ip6=false\n" \ "ip6-address=::1\n" \ "server-port=8080\n" \ "\n" #define AGS_FUNCTIONAL_SERVER_TEST_XML_AUTHENTICATION_FILENAME SRCDIR "/" "ags_functional_server_test_authentication.xml" #define AGS_FUNCTIONAL_SERVER_TEST_XML_PASSWORD_STORE_FILENAME SRCDIR "/" "ags_functional_server_test_password_store.xml" #define AGS_FUNCTIONAL_SERVER_TEST_XML_COOKIE_FILENAME SRCDIR "/" "ags_functional_server_test_cookie" #define AGS_FUNCTIONAL_SERVER_TEST_AUTHENTICATE_LOGIN "ags-test-login" #define AGS_FUNCTIONAL_SERVER_TEST_AUTHENTICATE_PASSWORD "ags-test-password" AgsServerApplicationContext *server_application_context; SoupSession *soup_session; SoupCookieJar *jar; /* The suite initialization function. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_server_test_init_suite() { AgsAuthenticationManager *authentication_manager; AgsPasswordStoreManager *password_store_manager; AgsXmlAuthentication *xml_authentication; AgsXmlPasswordStore *xml_password_store; AgsConfig *config; ags_priority_load_defaults(ags_priority_get_instance()); config = ags_config_get_instance(); ags_config_load_from_data(config, AGS_FUNCTIONAL_SERVER_TEST_CONFIG, strlen(AGS_FUNCTIONAL_SERVER_TEST_CONFIG)); authentication_manager = ags_authentication_manager_get_instance(); password_store_manager = ags_password_store_manager_get_instance(); xml_authentication = ags_xml_authentication_new(); ags_xml_authentication_open_filename(xml_authentication, AGS_FUNCTIONAL_SERVER_TEST_XML_AUTHENTICATION_FILENAME); ags_authentication_manager_add_authentication(authentication_manager, xml_authentication); xml_password_store = ags_xml_password_store_new(); ags_xml_password_store_open_filename(xml_password_store, AGS_FUNCTIONAL_SERVER_TEST_XML_PASSWORD_STORE_FILENAME); ags_password_store_manager_add_password_store(password_store_manager, xml_password_store); server_application_context = (AgsApplicationContext *) ags_server_application_context_new(); g_object_ref(server_application_context); ags_application_context_prepare(server_application_context); ags_application_context_setup(server_application_context); /* server */ sleep(5); /* soup session */ soup_session = soup_session_new_with_options(SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_AUTH_BASIC, SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_AUTH_DIGEST, NULL); jar = soup_cookie_jar_text_new(AGS_FUNCTIONAL_SERVER_TEST_XML_COOKIE_FILENAME, FALSE); soup_session_add_feature(soup_session, jar); g_signal_connect(soup_session, "authenticate", G_CALLBACK(ags_functional_server_test_authenticate_authenticate_callback), NULL); return(0); } /* The suite cleanup function. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_functional_server_test_clean_suite() { g_object_unref(server_application_context); return(0); } void ags_functional_server_test_authenticate() { SoupMessage *msg; SoupMessageHeaders *response_headers; SoupMessageBody *response_body; SoupMessageHeadersIter iter; GSList *cookie; gchar *login; gchar *security_token; char *name, *value; guint status; GError *error; msg = soup_form_request_new("GET", "http://127.0.0.1:8080/ags-xmlrpc", NULL); status = soup_session_send_message(soup_session, msg); g_object_get(msg, "response-headers", &response_headers, "response-body", &response_body, NULL); g_message("status %d", status); cookie = NULL; soup_message_headers_iter_init(&iter, response_headers); while(soup_message_headers_iter_next(&iter, &name, &value)){ g_message("%s: %s", name, value); } g_message("%s", response_body->data); CU_ASSERT(status == 200); cookie = soup_cookies_from_response(msg); login = NULL; security_token = NULL; while(cookie != NULL){ char *cookie_name; cookie_name = soup_cookie_get_name(cookie->data); if(!g_ascii_strncasecmp(cookie_name, "ags-srv-login", 14)){ login = soup_cookie_get_value(cookie->data); }else if(!g_ascii_strncasecmp(cookie_name, "ags-srv-security-token", 23)){ security_token = soup_cookie_get_value(cookie->data); } if(login != NULL && security_token != NULL){ break; } cookie = cookie->next; } CU_ASSERT((!g_strcmp0(login, AGS_FUNCTIONAL_SERVER_TEST_AUTHENTICATE_LOGIN)) == TRUE); CU_ASSERT(security_token != NULL); } void ags_functional_server_test_authenticate_authenticate_callback(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer user_data) { g_message("authenticate: ****"); soup_auth_authenticate(auth, AGS_FUNCTIONAL_SERVER_TEST_AUTHENTICATE_LOGIN, AGS_FUNCTIONAL_SERVER_TEST_AUTHENTICATE_PASSWORD); } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; putenv("LC_ALL=C"); putenv("LANG=C"); putenv("LADSPA_PATH=\"\""); putenv("DSSI_PATH=\"\""); putenv("LV2_PATH=\"\""); /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFunctionalServerTest", ags_functional_server_test_init_suite, ags_functional_server_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsServer doing authentication", ags_functional_server_test_authenticate) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/file/0000755000175000017500000000000013622252262013332 500000000000000gsequencer-3.1.3/ags/test/file/ags_file_launch_test.c0000644000175000017500000000541113605312646017565 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_file_launch_test_init_suite(); int ags_file_launch_test_clean_suite(); void ags_file_launch_test_start(); void ags_file_launch_test_stub_start(AgsFileLaunch *file_launch); gboolean stub_start; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_launch_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_launch_test_clean_suite() { return(0); } void ags_file_launch_test_start() { AgsFileLaunch *file_launch; gpointer ptr; file_launch = g_object_new(AGS_TYPE_FILE_LAUNCH, NULL); ptr = AGS_FILE_LAUNCH_GET_CLASS(file_launch)->start; AGS_FILE_LAUNCH_GET_CLASS(file_launch)->start = ags_file_launch_test_stub_start; /* assert start */ ags_file_launch_start(file_launch); CU_ASSERT(stub_start == TRUE); AGS_FILE_LAUNCH_GET_CLASS(file_launch)->start = ptr; } void ags_file_launch_test_stub_start(AgsFileLaunch *file_launch) { stub_start = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFileLaunchTest\0", ags_file_launch_test_init_suite, ags_file_launch_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFileLaunch start\0", ags_file_launch_test_start) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/file/ags_file_id_ref_test.c0000644000175000017500000000546113605312646017550 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_file_id_ref_test_init_suite(); int ags_file_id_ref_test_clean_suite(); void ags_file_id_ref_test_resolved(); void ags_file_id_ref_test_stub_resolved(AgsFileIdRef *file_id_ref); gboolean stub_resolved; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_id_ref_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_id_ref_test_clean_suite() { return(0); } void ags_file_id_ref_test_resolved() { AgsFileIdRef *file_id_ref; gpointer ptr; file_id_ref = g_object_new(AGS_TYPE_FILE_ID_REF, NULL); ptr = AGS_FILE_ID_REF_GET_CLASS(file_id_ref)->resolved; AGS_FILE_ID_REF_GET_CLASS(file_id_ref)->resolved = ags_file_id_ref_test_stub_resolved; /* assert resolved */ ags_file_id_ref_resolved(file_id_ref); CU_ASSERT(stub_resolved == TRUE); AGS_FILE_ID_REF_GET_CLASS(file_id_ref)->resolved = ptr; } void ags_file_id_ref_test_stub_resolved(AgsFileIdRef *file_id_ref) { stub_resolved = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFileIdRefTest\0", ags_file_id_ref_test_init_suite, ags_file_id_ref_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFileIdRef resolved\0", ags_file_id_ref_test_resolved) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/file/ags_file_lookup_test.c0000644000175000017500000001227313605312646017630 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_file_lookup_test_init_suite(); int ags_file_lookup_test_clean_suite(); void ags_file_lookup_test_find_by_node(); void ags_file_lookup_test_find_by_reference(); void ags_file_lookup_test_resolve(); void ags_file_lookup_test_stub_resolve(AgsFileLookup *file_lookup); gboolean stub_resolve; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_lookup_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_lookup_test_clean_suite() { return(0); } void ags_file_lookup_test_find_by_node() { AgsFileLookup *file_lookup[3]; xmlNode *node[3]; GList *list; list = NULL; /* file lookup #0 */ node[0] = xmlNewNode(NULL, "ags-test"); file_lookup[0] = g_object_new(AGS_TYPE_FILE_LOOKUP, "node", node[0], NULL); list = g_list_prepend(list, file_lookup[0]); /* file lookup #1 */ node[1] = xmlNewNode(NULL, "ags-test"); file_lookup[1] = g_object_new(AGS_TYPE_FILE_LOOKUP, "node", node[1], NULL); list = g_list_prepend(list, file_lookup[1]); /* file lookup #2 */ node[2] = xmlNewNode(NULL, "ags-test"); file_lookup[2] = g_object_new(AGS_TYPE_FILE_LOOKUP, "node", node[2], NULL); list = g_list_prepend(list, file_lookup[2]); /* assert find by node */ CU_ASSERT(ags_file_lookup_find_by_node(list, node[0]) != NULL); CU_ASSERT(ags_file_lookup_find_by_node(list, node[1]) != NULL); CU_ASSERT(ags_file_lookup_find_by_node(list, node[2]) != NULL); } void ags_file_lookup_test_find_by_reference() { AgsFileLookup *file_lookup[3]; AgsTurtle *turtle[3]; GList *list; list = NULL; /* file lookup #0 */ turtle[0] = g_object_new(AGS_TYPE_TURTLE, NULL); file_lookup[0] = g_object_new(AGS_TYPE_FILE_LOOKUP, "reference", turtle[0], NULL); list = g_list_prepend(list, file_lookup[0]); /* file lookup #1 */ turtle[1] = g_object_new(AGS_TYPE_TURTLE, NULL); file_lookup[1] = g_object_new(AGS_TYPE_FILE_LOOKUP, "reference", turtle[1], NULL); list = g_list_prepend(list, file_lookup[1]); /* file lookup #2 */ turtle[2] = g_object_new(AGS_TYPE_TURTLE, NULL); file_lookup[2] = g_object_new(AGS_TYPE_FILE_LOOKUP, "reference", turtle[2], NULL); list = g_list_prepend(list, file_lookup[2]); /* assert find by reference */ CU_ASSERT(ags_file_lookup_find_by_reference(list, turtle[0]) != NULL); CU_ASSERT(ags_file_lookup_find_by_reference(list, turtle[1]) != NULL); CU_ASSERT(ags_file_lookup_find_by_reference(list, turtle[2]) != NULL); } void ags_file_lookup_test_resolve() { AgsFileLookup *file_lookup; gpointer ptr; file_lookup = g_object_new(AGS_TYPE_FILE_LOOKUP, NULL); ptr = AGS_FILE_LOOKUP_GET_CLASS(file_lookup)->resolve; AGS_FILE_LOOKUP_GET_CLASS(file_lookup)->resolve = ags_file_lookup_test_stub_resolve; /* assert resolve */ ags_file_lookup_resolve(file_lookup); CU_ASSERT(stub_resolve == TRUE); AGS_FILE_LOOKUP_GET_CLASS(file_lookup)->resolve = ptr; } void ags_file_lookup_test_stub_resolve(AgsFileLookup *file_lookup) { stub_resolve = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFileLookupTest", ags_file_lookup_test_init_suite, ags_file_lookup_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFileLookup find by node", ags_file_lookup_test_find_by_node) == NULL) || (CU_add_test(pSuite, "test of AgsFileLookup find by reference", ags_file_lookup_test_find_by_reference) == NULL) || (CU_add_test(pSuite, "test of AgsFileLookup resolve", ags_file_lookup_test_resolve) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/test/file/ags_file_test.c0000644000175000017500000003757013605312646016246 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_file_test_init_suite(); int ags_file_test_clean_suite(); void ags_file_test_str2md5(); void ags_file_test_add_id_ref(); void ags_file_test_find_id_ref_by_node(); void ags_file_test_find_id_ref_by_xpath(); void ags_file_test_find_id_ref_by_reference(); void ags_file_test_add_lookup(); void ags_file_test_add_launch(); void ags_file_test_open(); void ags_file_test_open_from_data(); void ags_file_test_rw_open(); void ags_file_test_open_filename(); void ags_file_test_close(); void ags_file_test_write(); void ags_file_test_write_concurrent(); void ags_file_test_write_resolve(); void ags_file_test_read(); void ags_file_test_read_resolve(); void ags_file_test_read_start(); void ags_file_test_read_config(); void ags_file_test_write_config(); void ags_file_test_read_application_context(); void ags_file_test_write_application_context(); void ags_file_test_stub_open(AgsFile *file, GError **error); void ags_file_test_stub_open_from_data(AgsFile *file, gchar *data, guint length, GError **error); void ags_file_test_stub_rw_open(AgsFile *file, gboolean create, GError **error); void ags_file_test_stub_write(AgsFile *file); void ags_file_test_stub_write_concurrent(AgsFile *file); void ags_file_test_stub_write_resolve(AgsFile *file); void ags_file_test_stub_read(AgsFile *file); void ags_file_test_stub_read_resolve(AgsFile *file); void ags_file_test_stub_read_start(AgsFile *file); #define AGS_FILE_TEST_STR2MD5_CONTENT "GNU's not linux" gboolean stub_open = FALSE; gboolean stub_open_from_data = FALSE; gboolean stub_rw_open = FALSE; gboolean stub_write = FALSE; gboolean stub_write_concurrent = FALSE; gboolean stub_write_resolve = FALSE; gboolean stub_read = FALSE; gboolean stub_read_resolve = FALSE; gboolean stub_read_start = FALSE; /* The suite initialization time. * Opens the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_test_init_suite() { return(0); } /* The suite cleanup time. * Closes the temporary file used by the tests. * Returns zero on success, non-zero otherwise. */ int ags_file_test_clean_suite() { return(0); } void ags_file_test_str2md5() { gchar *md5_checksum; md5_checksum = ags_file_str2md5(AGS_FILE_TEST_STR2MD5_CONTENT, strlen(AGS_FILE_TEST_STR2MD5_CONTENT)); CU_ASSERT(strlen(md5_checksum) == AGS_FILE_CHECKSUM_LENGTH); } void ags_file_test_add_id_ref() { AgsFile *file; AgsFileIdRef *file_id_ref[3]; file = g_object_new(AGS_TYPE_FILE, NULL); /* add some id refs */ file_id_ref[0] = g_object_new(AGS_TYPE_FILE_ID_REF, NULL); ags_file_add_id_ref(file, file_id_ref[0]); file_id_ref[1] = g_object_new(AGS_TYPE_FILE_ID_REF, NULL); ags_file_add_id_ref(file, file_id_ref[1]); file_id_ref[2] = g_object_new(AGS_TYPE_FILE_ID_REF, NULL); ags_file_add_id_ref(file, file_id_ref[2]); /* assert to be present */ CU_ASSERT(g_list_find(file->id_refs, file_id_ref[0]) != NULL); CU_ASSERT(g_list_find(file->id_refs, file_id_ref[1]) != NULL); CU_ASSERT(g_list_find(file->id_refs, file_id_ref[2]) != NULL); } void ags_file_test_find_id_ref_by_node() { AgsFile *file; AgsFileIdRef *file_id_ref[3], *current; xmlNode *node[3]; file = g_object_new(AGS_TYPE_FILE, NULL); /* add some id refs */ node[0] = xmlNewNode(NULL, "ags-file-test"); file_id_ref[0] = g_object_new(AGS_TYPE_FILE_ID_REF, "node", node[0], NULL); ags_file_add_id_ref(file, file_id_ref[0]); node[1] = xmlNewNode(NULL, "ags-file-test"); file_id_ref[1] = g_object_new(AGS_TYPE_FILE_ID_REF, "node", node[1], NULL); ags_file_add_id_ref(file, file_id_ref[1]); node[2] = xmlNewNode(NULL, "ags-file-test"); file_id_ref[2] = g_object_new(AGS_TYPE_FILE_ID_REF, "node", node[2], NULL); ags_file_add_id_ref(file, file_id_ref[2]); /* assert find by node */ CU_ASSERT((current = ags_file_find_id_ref_by_node(file, node[0])) != NULL && current == file_id_ref[0]); CU_ASSERT((current = ags_file_find_id_ref_by_node(file, node[1])) != NULL && current == file_id_ref[1]); CU_ASSERT((current = ags_file_find_id_ref_by_node(file, node[2])) != NULL && current == file_id_ref[2]); } void ags_file_test_find_id_ref_by_xpath() { //TODO:JK: implement me } void ags_file_test_find_id_ref_by_reference() { AgsFile *file; AgsFileIdRef *file_id_ref[3], *current; AgsTurtle *turtle[3]; file = g_object_new(AGS_TYPE_FILE, NULL); /* add some id refs */ turtle[0] = g_object_new(AGS_TYPE_TURTLE, NULL); file_id_ref[0] = g_object_new(AGS_TYPE_FILE_ID_REF, "reference", turtle[0], NULL); ags_file_add_id_ref(file, file_id_ref[0]); turtle[1] = g_object_new(AGS_TYPE_TURTLE, NULL); file_id_ref[1] = g_object_new(AGS_TYPE_FILE_ID_REF, "reference", turtle[1], NULL); ags_file_add_id_ref(file, file_id_ref[1]); turtle[2] = g_object_new(AGS_TYPE_TURTLE, NULL); file_id_ref[2] = g_object_new(AGS_TYPE_FILE_ID_REF, "reference", turtle[2], NULL); ags_file_add_id_ref(file, file_id_ref[2]); /* assert find by reference */ CU_ASSERT((current = ags_file_find_id_ref_by_reference(file, turtle[0])) != NULL && current == file_id_ref[0]); CU_ASSERT((current = ags_file_find_id_ref_by_reference(file, turtle[1])) != NULL && current == file_id_ref[1]); CU_ASSERT((current = ags_file_find_id_ref_by_reference(file, turtle[2])) != NULL && current == file_id_ref[2]); } void ags_file_test_add_lookup() { AgsFile *file; AgsFileIdRef *file_lookup[3]; file = g_object_new(AGS_TYPE_FILE, NULL); /* add some id refs */ file_lookup[0] = g_object_new(AGS_TYPE_FILE_LOOKUP, NULL); ags_file_add_lookup(file, file_lookup[0]); file_lookup[1] = g_object_new(AGS_TYPE_FILE_LOOKUP, NULL); ags_file_add_lookup(file, file_lookup[1]); file_lookup[2] = g_object_new(AGS_TYPE_FILE_LOOKUP, NULL); ags_file_add_lookup(file, file_lookup[2]); /* assert to be present */ CU_ASSERT(g_list_find(file->lookup, file_lookup[0]) != NULL); CU_ASSERT(g_list_find(file->lookup, file_lookup[1]) != NULL); CU_ASSERT(g_list_find(file->lookup, file_lookup[2]) != NULL); } void ags_file_test_add_launch() { AgsFile *file; AgsFileIdRef *file_launch[3]; file = g_object_new(AGS_TYPE_FILE, NULL); /* add some id refs */ file_launch[0] = g_object_new(AGS_TYPE_FILE_LAUNCH, NULL); ags_file_add_launch(file, file_launch[0]); file_launch[1] = g_object_new(AGS_TYPE_FILE_LAUNCH, NULL); ags_file_add_launch(file, file_launch[1]); file_launch[2] = g_object_new(AGS_TYPE_FILE_LAUNCH, NULL); ags_file_add_launch(file, file_launch[2]); /* assert to be present */ CU_ASSERT(g_list_find(file->launch, file_launch[0]) != NULL); CU_ASSERT(g_list_find(file->launch, file_launch[1]) != NULL); CU_ASSERT(g_list_find(file->launch, file_launch[2]) != NULL); } void ags_file_test_open() { AgsFile *file; gpointer ptr; GError *error; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub open */ ptr = AGS_FILE_GET_CLASS(file)->open; AGS_FILE_GET_CLASS(file)->open = ags_file_test_stub_open; /* assert open */ error = NULL; ags_file_open(file, &error); CU_ASSERT(stub_open == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->open = ptr; } void ags_file_test_open_from_data() { AgsFile *file; gpointer ptr; GError *error; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub open from data */ ptr = AGS_FILE_GET_CLASS(file)->open_from_data; AGS_FILE_GET_CLASS(file)->open_from_data = ags_file_test_stub_open_from_data; /* assert open from data */ error = NULL; ags_file_open_from_data(file, NULL, 0, &error); CU_ASSERT(stub_open_from_data == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->open_from_data = ptr; } void ags_file_test_rw_open() { AgsFile *file; gpointer ptr; GError *error; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub read/write open */ ptr = AGS_FILE_GET_CLASS(file)->rw_open; AGS_FILE_GET_CLASS(file)->rw_open = ags_file_test_stub_rw_open; /* assert read/write open */ error = NULL; ags_file_rw_open(file, FALSE, &error); CU_ASSERT(stub_rw_open == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->rw_open = ptr; } void ags_file_test_open_filename() { //TODO:JK: implement me } void ags_file_test_close() { //TODO:JK: implement me } void ags_file_test_write() { AgsFile *file; gpointer ptr; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub write */ ptr = AGS_FILE_GET_CLASS(file)->write; AGS_FILE_GET_CLASS(file)->write = ags_file_test_stub_write; /* assert write */ ags_file_write(file); CU_ASSERT(stub_write == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->write = ptr; } void ags_file_test_write_concurrent() { AgsFile *file; gpointer ptr; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub write concurrent */ ptr = AGS_FILE_GET_CLASS(file)->write_concurrent; AGS_FILE_GET_CLASS(file)->write_concurrent = ags_file_test_stub_write_concurrent; /* assert write concurrent */ ags_file_write_concurrent(file); CU_ASSERT(stub_write_concurrent == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->write_concurrent = ptr; } void ags_file_test_write_resolve() { AgsFile *file; gpointer ptr; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub write resolve */ ptr = AGS_FILE_GET_CLASS(file)->write_resolve; AGS_FILE_GET_CLASS(file)->write_resolve = ags_file_test_stub_write_resolve; /* assert write resolve */ ags_file_write_resolve(file); CU_ASSERT(stub_write_resolve == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->write_resolve = ptr; } void ags_file_test_read() { AgsFile *file; gpointer ptr; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub read */ ptr = AGS_FILE_GET_CLASS(file)->read; AGS_FILE_GET_CLASS(file)->read = ags_file_test_stub_read; /* assert read */ ags_file_read(file); CU_ASSERT(stub_read == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->read = ptr; } void ags_file_test_read_resolve() { AgsFile *file; gpointer ptr; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub read resolve */ ptr = AGS_FILE_GET_CLASS(file)->read_resolve; AGS_FILE_GET_CLASS(file)->read_resolve = ags_file_test_stub_read_resolve; /* assert read resolve */ ags_file_read_resolve(file); CU_ASSERT(stub_read_resolve == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->read_resolve = ptr; } void ags_file_test_read_start() { AgsFile *file; gpointer ptr; file = g_object_new(AGS_TYPE_FILE, NULL); /* stub read start */ ptr = AGS_FILE_GET_CLASS(file)->read_start; AGS_FILE_GET_CLASS(file)->read_start = ags_file_test_stub_read_start; /* assert read start */ ags_file_read_start(file); CU_ASSERT(stub_read_start == TRUE); /* reset */ AGS_FILE_GET_CLASS(file)->read_start = ptr; } void ags_file_test_read_config() { //TODO:JK: implement me } void ags_file_test_write_config() { //TODO:JK: implement me } void ags_file_test_read_application_context() { //TODO:JK: implement me } void ags_file_test_write_application_context() { //TODO:JK: implement me } void ags_file_test_stub_open(AgsFile *file, GError **error) { stub_open = TRUE; } void ags_file_test_stub_open_from_data(AgsFile *file, gchar *data, guint length, GError **error) { stub_open_from_data = TRUE; } void ags_file_test_stub_rw_open(AgsFile *file, gboolean create, GError **error) { stub_rw_open = TRUE; } void ags_file_test_stub_write(AgsFile *file) { stub_write = TRUE; } void ags_file_test_stub_write_concurrent(AgsFile *file) { stub_write_concurrent = TRUE; } void ags_file_test_stub_write_resolve(AgsFile *file) { stub_write_resolve = TRUE; } void ags_file_test_stub_read(AgsFile *file) { stub_read = TRUE; } void ags_file_test_stub_read_resolve(AgsFile *file) { stub_read_resolve = TRUE; } void ags_file_test_stub_read_start(AgsFile *file) { stub_read_start = TRUE; } int main(int argc, char **argv) { CU_pSuite pSuite = NULL; /* initialize the CUnit test registry */ if(CUE_SUCCESS != CU_initialize_registry()){ return CU_get_error(); } /* add a suite to the registry */ pSuite = CU_add_suite("AgsFileTest\0", ags_file_test_init_suite, ags_file_test_clean_suite); if(pSuite == NULL){ CU_cleanup_registry(); return CU_get_error(); } /* add the tests to the suite */ if((CU_add_test(pSuite, "test of AgsFile string to md5 sum\0", ags_file_test_str2md5) == NULL) || (CU_add_test(pSuite, "test of AgsFile add id ref\0", ags_file_test_add_id_ref) == NULL) || (CU_add_test(pSuite, "test of AgsFile find id ref by node\0", ags_file_test_find_id_ref_by_node) == NULL) || (CU_add_test(pSuite, "test of AgsFile find id ref by xpath\0", ags_file_test_find_id_ref_by_xpath) == NULL) || (CU_add_test(pSuite, "test of AgsFile find id ref by reference\0", ags_file_test_find_id_ref_by_reference) == NULL) || (CU_add_test(pSuite, "test of AgsFile add lookup\0", ags_file_test_add_lookup) == NULL) || (CU_add_test(pSuite, "test of AgsFile add launch\0", ags_file_test_add_launch) == NULL) || (CU_add_test(pSuite, "test of AgsFile open\0", ags_file_test_open) == NULL) || (CU_add_test(pSuite, "test of AgsFile open from data\0", ags_file_test_open_from_data) == NULL) || (CU_add_test(pSuite, "test of AgsFile rw open\0", ags_file_test_rw_open) == NULL) || (CU_add_test(pSuite, "test of AgsFile open filename\0", ags_file_test_open_filename) == NULL) || (CU_add_test(pSuite, "test of AgsFile close\0", ags_file_test_close) == NULL) || (CU_add_test(pSuite, "test of AgsFile write\0", ags_file_test_write) == NULL) || (CU_add_test(pSuite, "test of AgsFile write concurrent\0", ags_file_test_write_concurrent) == NULL) || (CU_add_test(pSuite, "test of AgsFile write resolve\0", ags_file_test_write_resolve) == NULL) || (CU_add_test(pSuite, "test of AgsFile read\0", ags_file_test_read) == NULL) || (CU_add_test(pSuite, "test of AgsFile read resolve\0", ags_file_test_read_resolve) == NULL) || (CU_add_test(pSuite, "test of AgsFile read start\0", ags_file_test_read_start) == NULL) || (CU_add_test(pSuite, "test of AgsFile read config\0", ags_file_test_read_config) == NULL) || (CU_add_test(pSuite, "test of AgsFile write config\0", ags_file_test_write_config) == NULL) || (CU_add_test(pSuite, "test of AgsFile read application context\0", ags_file_test_read_application_context) == NULL) || (CU_add_test(pSuite, "test of AgsFile write application context\0", ags_file_test_write_application_context) == NULL)){ CU_cleanup_registry(); return CU_get_error(); } /* Run all tests using the CUnit Basic interface */ CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); CU_cleanup_registry(); return(CU_get_error()); } gsequencer-3.1.3/ags/ags_config.h.in0000644000175000017500000000215113557341126014235 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_API_CONFIG_H__ #define __AGS_API_CONFIG_H__ #undef AGS_WITH_W32API #undef AGS_WITH_OSXAPI #undef AGS_WITH_ALSA #undef AGS_WITH_OSS #undef AGS_WITH_CORE_AUDIO #undef AGS_WITH_JACK #undef AGS_WITH_PULSE #undef AGS_WITH_WASAPI #undef AGS_WITH_LIBINSTPATCH #undef AGS_WITH_QUARTZ #undef AGS_WITH_XMLRPC_C #endif /*__AGS_API_CONFIG_H__*/ gsequencer-3.1.3/ags/X/0000755000175000017500000000000013622252261011642 500000000000000gsequencer-3.1.3/ags/X/ags_soundcard_editor_callbacks.h0000644000175000017500000000407713607210263020123 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNCARD_EDITOR_CALLBACKS_H__ #define __AGS_SOUNCARD_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_soundcard_editor_backend_changed_callback(GtkComboBox *combo, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_card_changed_callback(GtkComboBox *combo, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_add_port_callback(GtkWidget *button, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_remove_port_callback(GtkWidget *button, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_audio_channels_changed_callback(GtkSpinButton *spin_button, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_samplerate_changed_callback(GtkSpinButton *spin_button, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_buffer_size_changed_callback(GtkSpinButton *spin_button, AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_format_changed_callback(GtkComboBox *combo_box, AgsSoundcardEditor *soundcard_editor); G_END_DECLS #endif /*__AGS_SOUNDCARD_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_plugin_preferences.h0000644000175000017500000000460613607210263016451 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_PREFERENCES_H__ #define __AGS_PLUGIN_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLUGIN_PREFERENCES (ags_plugin_preferences_get_type()) #define AGS_PLUGIN_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLUGIN_PREFERENCES, AgsPluginPreferences)) #define AGS_PLUGIN_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLUGIN_PREFERENCES, AgsPluginPreferencesClass)) #define AGS_IS_PLUGIN_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLUGIN_PREFERENCES)) #define AGS_IS_PLUGIN_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PLUGIN_PREFERENCES)) #define AGS_PLUGIN_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PLUGIN_PREFERENCES, AgsPluginPreferencesClass)) typedef struct _AgsPluginPreferences AgsPluginPreferences; typedef struct _AgsPluginPreferencesClass AgsPluginPreferencesClass; typedef struct _AgsLadspaPluginPreferences AgsLadspaPluginPreferences; struct _AgsPluginPreferences { GtkVBox vbox; AgsLadspaPluginPreferences *ladspa_plugin_preferencens; }; struct _AgsPluginPreferencesClass { GtkVBoxClass vbox; }; struct _AgsLadspaPluginPreferences { GtkEntry *ladspa_path; GtkCellView *plugin_file; }; GType ags_plugin_preferences_get_type(void); AgsLadspaPluginPreferences* ags_ladspa_plugin_preferences_alloc(); AgsPluginPreferences* ags_plugin_preferences_new(); G_BEGIN_DECLS #endif /*__AGS_PLUGIN_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_machine_editor.c0000644000175000017500000004120713607210263015535 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_machine_editor_class_init(AgsMachineEditorClass *machine_editor); void ags_machine_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_machine_editor_init(AgsMachineEditor *machine_editor); void ags_machine_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_machine_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_machine_editor_connect(AgsConnectable *connectable); void ags_machine_editor_disconnect(AgsConnectable *connectable); void ags_machine_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_machine_editor_apply(AgsApplicable *applicable); void ags_machine_editor_reset(AgsApplicable *applicable); void ags_machine_editor_real_set_machine(AgsMachineEditor *machine_editor, AgsMachine *machine); /** * SECTION:ags_machine_editor * @short_description: Edit audio related aspects * @title: AgsMachineEditor * @section_id: * @include: ags/X/ags_machine_editor.h * * #AgsMachineEditor is a composite widget to edit all aspects of #AgsAudio. * It consists of multiple child editors. */ enum{ SET_MACHINE, LAST_SIGNAL, }; enum{ PROP_0, PROP_MACHINE, }; static guint machine_editor_signals[LAST_SIGNAL]; GType ags_machine_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine_editor = 0; static const GTypeInfo ags_machine_editor_info = { sizeof (AgsMachineEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachineEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_machine_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine_editor = g_type_register_static(GTK_TYPE_DIALOG, "AgsMachineEditor", &ags_machine_editor_info, 0); g_type_add_interface_static(ags_type_machine_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_machine_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine_editor); } return g_define_type_id__volatile; } void ags_machine_editor_class_init(AgsMachineEditorClass *machine_editor) { GObjectClass *gobject; GParamSpec *param_spec; /* GObjectClass */ gobject = (GObjectClass *) machine_editor; gobject->set_property = ags_machine_editor_set_property; gobject->get_property = ags_machine_editor_get_property; /* properties */ /** * AgsMachineEditor:machine: * * The #AgsMachine to edit. * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine which this machine editor is assigned with"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); /* AgsMachineEditorClass */ machine_editor->set_machine = ags_machine_editor_real_set_machine; /* signals */ /** * AgsMachineEditor::set-machine: * @machine_editor: the #AgsMachineEditor * @machine: the #AgsMachine to set * * The ::set-machine notify about modified machine. * * Since: 3.0.0 */ machine_editor_signals[SET_MACHINE] = g_signal_new("set-machine", G_TYPE_FROM_CLASS (machine_editor), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsMachineEditorClass, set_machine), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_machine_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_editor_connect; connectable->disconnect = ags_machine_editor_disconnect; } void ags_machine_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_machine_editor_set_update; applicable->apply = ags_machine_editor_apply; applicable->reset = ags_machine_editor_reset; } void ags_machine_editor_init(AgsMachineEditor *machine_editor) { GtkNotebook *notebook; GtkScrolledWindow *scrolled_window; gtk_window_set_title((GtkWindow *) machine_editor, i18n("properties")); machine_editor->flags = 0; machine_editor->version = AGS_MACHINE_EDITOR_DEFAULT_VERSION; machine_editor->build_id = AGS_MACHINE_EDITOR_DEFAULT_BUILD_ID; machine_editor->machine = NULL; machine_editor->notebook = notebook = (GtkNotebook *) gtk_notebook_new(); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(machine_editor), (GtkWidget *) notebook, TRUE, TRUE, 0); /* AgsOutput */ machine_editor->output_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("output"))); /* AgsInput */ machine_editor->input_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("input"))); /* AgsOutput link editor */ machine_editor->output_link_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("link output"))); /* AgsInput link editor */ machine_editor->input_link_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("link input"))); /* resize editor */ machine_editor->resize_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("resize channels"))); /* GtkButton's in GtkDialog->action_area */ machine_editor->apply = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_APPLY); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(machine_editor), (GtkWidget *) machine_editor->apply, FALSE, FALSE, 0); machine_editor->ok = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(machine_editor), (GtkWidget *) machine_editor->ok, FALSE, FALSE, 0); machine_editor->cancel = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(machine_editor), (GtkWidget *) machine_editor->cancel, FALSE, FALSE, 0); } void ags_machine_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(gobject); switch(prop_id){ case PROP_MACHINE: { AgsMachine *machine; machine = (AgsMachine *) g_value_get_object(value); ags_machine_editor_set_machine(machine_editor, machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(gobject); switch(prop_id){ case PROP_MACHINE: g_value_set_object(value, machine_editor->machine); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_editor_connect(AgsConnectable *connectable) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(connectable); if((AGS_MACHINE_EDITOR_CONNECTED & (machine_editor->flags)) != 0){ return; } machine_editor->flags |= AGS_MACHINE_EDITOR_CONNECTED; /* AgsMachineEditor tabs */ ags_connectable_connect(AGS_CONNECTABLE(machine_editor->output_editor)); ags_connectable_connect(AGS_CONNECTABLE(machine_editor->input_editor)); ags_connectable_connect(AGS_CONNECTABLE(machine_editor->output_link_editor)); ags_connectable_connect(AGS_CONNECTABLE(machine_editor->input_link_editor)); ags_connectable_connect(AGS_CONNECTABLE(machine_editor->resize_editor)); /* AgsMachineEditor buttons */ g_signal_connect((GObject *) machine_editor->apply, "clicked", G_CALLBACK(ags_machine_editor_apply_callback), (gpointer) machine_editor); g_signal_connect((GObject *) machine_editor->ok, "clicked", G_CALLBACK(ags_machine_editor_ok_callback), (gpointer) machine_editor); g_signal_connect((GObject *) machine_editor->cancel, "clicked", G_CALLBACK(ags_machine_editor_cancel_callback), (gpointer) machine_editor); } void ags_machine_editor_disconnect(AgsConnectable *connectable) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(connectable); if((AGS_MACHINE_EDITOR_CONNECTED & (machine_editor->flags)) == 0){ return; } machine_editor->flags &= (~AGS_MACHINE_EDITOR_CONNECTED); /* AgsMachineEditor tabs */ ags_connectable_disconnect(AGS_CONNECTABLE(machine_editor->output_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(machine_editor->input_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(machine_editor->output_link_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(machine_editor->input_link_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(machine_editor->resize_editor)); } void ags_machine_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(applicable); ags_applicable_set_update(AGS_APPLICABLE(machine_editor->output_editor), update); ags_applicable_set_update(AGS_APPLICABLE(machine_editor->input_editor), update); ags_applicable_set_update(AGS_APPLICABLE(machine_editor->output_link_editor), update); ags_applicable_set_update(AGS_APPLICABLE(machine_editor->input_link_editor), update); ags_applicable_set_update(AGS_APPLICABLE(machine_editor->resize_editor), update); } void ags_machine_editor_apply(AgsApplicable *applicable) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(applicable); ags_applicable_apply(AGS_APPLICABLE(machine_editor->output_editor)); ags_applicable_apply(AGS_APPLICABLE(machine_editor->input_editor)); ags_applicable_apply(AGS_APPLICABLE(machine_editor->output_link_editor)); ags_applicable_apply(AGS_APPLICABLE(machine_editor->input_link_editor)); ags_applicable_apply(AGS_APPLICABLE(machine_editor->resize_editor)); } void ags_machine_editor_reset(AgsApplicable *applicable) { AgsMachineEditor *machine_editor; machine_editor = AGS_MACHINE_EDITOR(applicable); ags_applicable_reset(AGS_APPLICABLE(machine_editor->output_editor)); ags_applicable_reset(AGS_APPLICABLE(machine_editor->input_editor)); ags_applicable_reset(AGS_APPLICABLE(machine_editor->output_link_editor)); ags_applicable_reset(AGS_APPLICABLE(machine_editor->input_link_editor)); ags_applicable_reset(AGS_APPLICABLE(machine_editor->resize_editor)); } /** * ags_machine_editor_add_children: * @machine_editor: the #AgsMachineEditor * * Add all child editors. * * Since: 3.0.0 */ void ags_machine_editor_add_children(AgsMachineEditor *machine_editor) { GParameter *output_link_editor_child_parameter; GParameter *input_link_editor_child_parameter; /* output */ output_link_editor_child_parameter = g_new0(GParameter, 1); output_link_editor_child_parameter[0].name = "channel-type"; g_value_init(&(output_link_editor_child_parameter[0].value), G_TYPE_GTYPE); g_value_set_gtype(&(output_link_editor_child_parameter[0].value), AGS_TYPE_OUTPUT); /* input */ input_link_editor_child_parameter = g_new0(GParameter, 1); input_link_editor_child_parameter[0].name = "channel-type"; g_value_init(&(input_link_editor_child_parameter[0].value), G_TYPE_GTYPE); g_value_set_gtype(&(input_link_editor_child_parameter[0].value), AGS_TYPE_INPUT); /* AgsOutput */ machine_editor->output_editor = ags_listing_editor_new(AGS_TYPE_OUTPUT); gtk_scrolled_window_add_with_viewport(machine_editor->output_scrolled_window, (GtkWidget *) machine_editor->output_editor); /* AgsInput */ machine_editor->input_editor = ags_listing_editor_new(AGS_TYPE_INPUT); gtk_scrolled_window_add_with_viewport(machine_editor->input_scrolled_window, (GtkWidget *) machine_editor->input_editor); /* AgsOutput link editor */ machine_editor->output_link_editor = ags_property_collection_editor_new(AGS_TYPE_LINK_COLLECTION_EDITOR, 1, output_link_editor_child_parameter); gtk_scrolled_window_add_with_viewport(machine_editor->output_link_editor_scrolled_window, (GtkWidget *) machine_editor->output_link_editor); /* AgsInput link editor */ machine_editor->input_link_editor = ags_property_collection_editor_new(AGS_TYPE_LINK_COLLECTION_EDITOR, 1, input_link_editor_child_parameter); gtk_scrolled_window_add_with_viewport(machine_editor->input_link_editor_scrolled_window, (GtkWidget *) machine_editor->input_link_editor); /* resize editor */ machine_editor->resize_editor = ags_resize_editor_new(); gtk_scrolled_window_add_with_viewport(machine_editor->resize_editor_scrolled_window, (GtkWidget *) machine_editor->resize_editor); } void ags_machine_editor_real_set_machine(AgsMachineEditor *machine_editor, AgsMachine *machine) { if(machine_editor->machine != NULL){ gtk_widget_destroy(GTK_WIDGET(machine_editor->output_editor)); gtk_widget_destroy(GTK_WIDGET(machine_editor->input_editor)); gtk_widget_destroy(GTK_WIDGET(machine_editor->output_link_editor)); gtk_widget_destroy(GTK_WIDGET(machine_editor->input_link_editor)); gtk_widget_destroy(GTK_WIDGET(machine_editor->resize_editor)); } machine_editor->machine = machine; if(machine != NULL){ ags_machine_editor_add_children(machine_editor); } } /** * ags_machine_editor_set_machine: * @machine_editor: an #AgsMachineEditor * @machine: the new #AgsMachine * * Is emitted as machine gets modified. * * Since: 3.0.0 */ void ags_machine_editor_set_machine(AgsMachineEditor *machine_editor, AgsMachine *machine) { g_return_if_fail(AGS_IS_MACHINE_EDITOR(machine_editor)); g_object_ref((GObject *) machine_editor); g_signal_emit(G_OBJECT(machine_editor), machine_editor_signals[SET_MACHINE], 0, machine); g_object_unref((GObject *) machine_editor); } /** * ags_machine_editor_new: * @machine: the assigned machine. * * Creates an #AgsMachineEditor * * Returns: a new #AgsMachineEditor * * Since: 3.0.0 */ AgsMachineEditor* ags_machine_editor_new(AgsMachine *machine) { AgsMachineEditor *machine_editor; machine_editor = (AgsMachineEditor *) g_object_new(AGS_TYPE_MACHINE_EDITOR, "machine", machine, NULL); return(machine_editor); } gsequencer-3.1.3/ags/X/ags_osc_server_preferences.c0000644000175000017500000004641413607210263017323 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_osc_server_preferences_class_init(AgsOscServerPreferencesClass *osc_server_preferences); void ags_osc_server_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_osc_server_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_osc_server_preferences_init(AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_finalize(GObject *gobject); void ags_osc_server_preferences_connect(AgsConnectable *connectable); void ags_osc_server_preferences_disconnect(AgsConnectable *connectable); void ags_osc_server_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_osc_server_preferences_apply(AgsApplicable *applicable); void ags_osc_server_preferences_reset(AgsApplicable *applicable); /** * SECTION:ags_osc_server_preferences * @short_description: A composite widget to do OSC server related preferences * @title: AgsOscServerPreferences * @section_id: * @include: ags/X/ags_osc_server_preferences.h * * #AgsOscServerPreferences enables you to make OSC server related preferences. */ static gpointer ags_osc_server_preferences_parent_class = NULL; GType ags_osc_server_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_server_preferences = 0; static const GTypeInfo ags_osc_server_preferences_info = { sizeof (AgsOscServerPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_server_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscServerPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_server_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_osc_server_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_osc_server_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_osc_server_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsOscServerPreferences", &ags_osc_server_preferences_info, 0); g_type_add_interface_static(ags_type_osc_server_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_osc_server_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_server_preferences); } return g_define_type_id__volatile; } void ags_osc_server_preferences_class_init(AgsOscServerPreferencesClass *osc_server_preferences) { GObjectClass *gobject; ags_osc_server_preferences_parent_class = g_type_class_peek_parent(osc_server_preferences); /* GtkObjectClass */ gobject = (GObjectClass *) osc_server_preferences; gobject->finalize = ags_osc_server_preferences_finalize; } void ags_osc_server_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_osc_server_preferences_connect; connectable->disconnect = ags_osc_server_preferences_disconnect; } void ags_osc_server_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_osc_server_preferences_set_update; applicable->apply = ags_osc_server_preferences_apply; applicable->reset = ags_osc_server_preferences_reset; } void ags_osc_server_preferences_init(AgsOscServerPreferences *osc_server_preferences) { GtkTable *table; GtkHBox *hbox; GtkLabel *label; gchar *str; osc_server_preferences->flags = 0; label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("Note: the fields below are applied immediately"), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(osc_server_preferences), GTK_WIDGET(label), FALSE, FALSE, 2); /* table */ table = (GtkTable *) gtk_table_new(2, 9, FALSE); gtk_box_pack_start(GTK_BOX(osc_server_preferences), GTK_WIDGET(table), FALSE, FALSE, 2); /* auto-start */ osc_server_preferences->auto_start = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("auto-start OSC server")); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->auto_start), 0, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* start/stop */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(hbox), 0, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); osc_server_preferences->start = (GtkButton *) gtk_button_new_with_label(i18n("start OSC server")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(osc_server_preferences->start), FALSE, FALSE, 0); osc_server_preferences->stop = (GtkButton *) gtk_button_new_with_label(i18n("stop OSC server")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(osc_server_preferences->stop), FALSE, FALSE, 0); /* listen any address */ osc_server_preferences->any_address = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("listen on any address")); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->any_address), 0, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* enable IP4 address */ osc_server_preferences->enable_ip4 = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("enable IPv4")); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->enable_ip4), 0, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* IP4 address */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("IPv4 address"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); osc_server_preferences->ip4_address = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(osc_server_preferences->ip4_address, AGS_OSC_SERVER_DEFAULT_INET4_ADDRESS); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->ip4_address), 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0); /* enable IP6 address */ osc_server_preferences->enable_ip6 = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("enable IPv6")); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->enable_ip6), 0, 2, 5, 6, GTK_FILL, GTK_FILL, 0, 0); /* IP6 address */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("IPv6 address"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 6, 7, GTK_FILL, GTK_FILL, 0, 0); osc_server_preferences->ip6_address = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(osc_server_preferences->ip6_address, AGS_OSC_SERVER_DEFAULT_INET6_ADDRESS); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->ip6_address), 1, 2, 6, 7, GTK_FILL, GTK_FILL, 0, 0); /* port */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("port"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 7, 8, GTK_FILL, GTK_FILL, 0, 0); str = g_strdup_printf("%d", AGS_OSC_SERVER_DEFAULT_SERVER_PORT); osc_server_preferences->port = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(osc_server_preferences->port, str); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->port), 1, 2, 7, 8, GTK_FILL, GTK_FILL, 0, 0); g_free(str); /* monitor timeout */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("monitor timeout"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0); osc_server_preferences->monitor_timeout = (GtkSpinButton *) gtk_spin_button_new_with_range(0.000001, 10.0, 0.0001); gtk_spin_button_set_digits(osc_server_preferences->monitor_timeout, 9); gtk_spin_button_set_value(osc_server_preferences->monitor_timeout, AGS_OSC_METER_CONTROLLER_DEFAULT_MONITOR_TIMEOUT); gtk_table_attach(table, GTK_WIDGET(osc_server_preferences->monitor_timeout), 1, 2, 8, 9, GTK_FILL, GTK_FILL, 0, 0); } void ags_osc_server_preferences_finalize(GObject *gobject) { //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_osc_server_preferences_parent_class)->finalize(gobject); } void ags_osc_server_preferences_connect(AgsConnectable *connectable) { AgsOscServerPreferences *osc_server_preferences; osc_server_preferences = AGS_OSC_SERVER_PREFERENCES(connectable); if((AGS_OSC_SERVER_PREFERENCES_CONNECTED & (osc_server_preferences->flags)) != 0){ return; } osc_server_preferences->flags |= AGS_OSC_SERVER_PREFERENCES_CONNECTED; /* start/stop */ g_signal_connect(G_OBJECT(osc_server_preferences->start), "clicked", G_CALLBACK(ags_osc_server_preferences_start_callback), osc_server_preferences); g_signal_connect(G_OBJECT(osc_server_preferences->stop), "clicked", G_CALLBACK(ags_osc_server_preferences_stop_callback), osc_server_preferences); /* listen any address */ g_signal_connect_after(G_OBJECT(osc_server_preferences->any_address), "clicked", G_CALLBACK(ags_osc_server_preferences_any_address_callback), osc_server_preferences); /* IPv4 */ g_signal_connect_after(G_OBJECT(osc_server_preferences->enable_ip4), "clicked", G_CALLBACK(ags_osc_server_preferences_enable_ip4_callback), osc_server_preferences); g_signal_connect_after(G_OBJECT(osc_server_preferences->ip4_address), "changed", G_CALLBACK(ags_osc_server_preferences_ip4_address_callback), osc_server_preferences); /* IPv6 */ g_signal_connect_after(G_OBJECT(osc_server_preferences->enable_ip6), "clicked", G_CALLBACK(ags_osc_server_preferences_enable_ip6_callback), osc_server_preferences); g_signal_connect_after(G_OBJECT(osc_server_preferences->ip6_address), "changed", G_CALLBACK(ags_osc_server_preferences_ip6_address_callback), osc_server_preferences); /* port */ g_signal_connect_after(G_OBJECT(osc_server_preferences->port), "changed", G_CALLBACK(ags_osc_server_preferences_port_callback), osc_server_preferences); } void ags_osc_server_preferences_disconnect(AgsConnectable *connectable) { AgsOscServerPreferences *osc_server_preferences; osc_server_preferences = AGS_OSC_SERVER_PREFERENCES(connectable); if((AGS_OSC_SERVER_PREFERENCES_CONNECTED & (osc_server_preferences->flags)) == 0){ return; } osc_server_preferences->flags &= (~AGS_OSC_SERVER_PREFERENCES_CONNECTED); /* start/stop */ g_object_disconnect(G_OBJECT(osc_server_preferences->start), "any_signal::clicked", G_CALLBACK(ags_osc_server_preferences_start_callback), osc_server_preferences, NULL); g_object_disconnect(G_OBJECT(osc_server_preferences->stop), "any_signal::clicked", G_CALLBACK(ags_osc_server_preferences_stop_callback), osc_server_preferences, NULL); /* listen any address */ g_object_disconnect(G_OBJECT(osc_server_preferences->any_address), "any_signal::clicked", G_CALLBACK(ags_osc_server_preferences_any_address_callback), osc_server_preferences, NULL); /* IPv4 */ g_object_disconnect(G_OBJECT(osc_server_preferences->enable_ip4), "any_signal::clicked", G_CALLBACK(ags_osc_server_preferences_enable_ip6_callback), osc_server_preferences, NULL); g_object_disconnect(G_OBJECT(osc_server_preferences->ip4_address), "any_signal::changed", G_CALLBACK(ags_osc_server_preferences_ip4_address_callback), osc_server_preferences, NULL); /* IPv6 */ g_object_disconnect(G_OBJECT(osc_server_preferences->enable_ip6), "any_signal::clicked", G_CALLBACK(ags_osc_server_preferences_enable_ip6_callback), osc_server_preferences, NULL); g_object_disconnect(G_OBJECT(osc_server_preferences->ip6_address), "any_signal::changed", G_CALLBACK(ags_osc_server_preferences_ip6_address_callback), osc_server_preferences, NULL); /* port */ g_object_disconnect(G_OBJECT(osc_server_preferences->port), "any_signal::changed", G_CALLBACK(ags_osc_server_preferences_port_callback), osc_server_preferences, NULL); } void ags_osc_server_preferences_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_osc_server_preferences_apply(AgsApplicable *applicable) { AgsOscServerPreferences *osc_server_preferences; AgsConfig *config; gchar *str; osc_server_preferences = AGS_OSC_SERVER_PREFERENCES(applicable); config = ags_config_get_instance(); /* auto-start */ if(gtk_toggle_button_get_active((GtkToggleButton *) osc_server_preferences->auto_start)){ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "auto-start", "true"); }else{ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "auto-start", "false"); } /* any address */ if(gtk_toggle_button_get_active((GtkToggleButton *) osc_server_preferences->any_address)){ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "any-address", "true"); }else{ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "any-address", "false"); } /* IPv4 */ if(gtk_toggle_button_get_active((GtkToggleButton *) osc_server_preferences->enable_ip4)){ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "enable-ip4", "true"); }else{ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "enable-ip4", "false"); } str = gtk_entry_get_text(osc_server_preferences->ip4_address); if(str == NULL){ str = AGS_OSC_SERVER_DEFAULT_INET4_ADDRESS; } ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "ip4-address", str); /* IPv6 */ if(gtk_toggle_button_get_active((GtkToggleButton *) osc_server_preferences->enable_ip6)){ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "enable-ip6", "true"); }else{ ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "enable-ip6", "false"); } str = gtk_entry_get_text(osc_server_preferences->ip6_address); if(str == NULL){ str = AGS_OSC_SERVER_DEFAULT_INET6_ADDRESS; } ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "ip6-address", str); /* port */ str = gtk_entry_get_text(osc_server_preferences->port); if(str == NULL){ str = g_strdup_printf("%d", AGS_OSC_SERVER_DEFAULT_SERVER_PORT); } ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "server-port", str); /* monitor timeout */ str = g_strdup_printf("%f", gtk_spin_button_get_value(osc_server_preferences->monitor_timeout)); ags_config_set_value(config, AGS_CONFIG_OSC_SERVER, "monitor-timeout", str); } void ags_osc_server_preferences_reset(AgsApplicable *applicable) { AgsOscServerPreferences *osc_server_preferences; AgsConfig *config; gchar *str; osc_server_preferences = AGS_OSC_SERVER_PREFERENCES(applicable); config = ags_config_get_instance(); /* block update */ osc_server_preferences->flags |= AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE; /* auto-start */ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "auto-start"); if(str != NULL && !g_ascii_strncasecmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->auto_start, TRUE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->auto_start, FALSE); } /* any address */ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "any-address"); if(str != NULL && !g_ascii_strncasecmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->any_address, TRUE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->any_address, FALSE); } /* IPv4 */ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "enable-ip4"); if(str != NULL && !g_ascii_strncasecmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->enable_ip4, TRUE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->enable_ip4, FALSE); } str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "ip4-address"); if(str != NULL){ gtk_entry_set_text(osc_server_preferences->ip4_address, str); } /* IPv6 */ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "enable-ip6"); if(str != NULL && !g_ascii_strncasecmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->enable_ip6, TRUE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) osc_server_preferences->enable_ip6, FALSE); } str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "ip6-address"); if(str != NULL){ gtk_entry_set_text(osc_server_preferences->ip6_address, str); } /* port */ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "server-port"); if(str != NULL){ gtk_entry_set_text(osc_server_preferences->port, str); } /* monitor timeout */ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "monitor-timeout"); if(str != NULL){ gtk_spin_button_set_value(osc_server_preferences->monitor_timeout, g_ascii_strtod(str, NULL)); } /* unblock update */ osc_server_preferences->flags &= (~AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE); } /** * ags_osc_server_preferences_new: * * Create a new instance of #AgsOscServerPreferences * * Returns: the new #AgsOscServerPreferences * * Since: 3.0.0 */ AgsOscServerPreferences* ags_osc_server_preferences_new() { AgsOscServerPreferences *osc_server_preferences; osc_server_preferences = (AgsOscServerPreferences *) g_object_new(AGS_TYPE_OSC_SERVER_PREFERENCES, NULL); return(osc_server_preferences); } gsequencer-3.1.3/ags/X/ags_notation_editor_callbacks.c0000644000175000017500000000603613616617253017776 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_notation_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsNotationEditor *notation_editor) { ags_notation_editor_machine_changed(notation_editor, machine); } void ags_notation_editor_piano_key_pressed_callback(AgsPiano *piano, gchar *note, gint key_code, AgsNotationEditor *notation_editor) { g_message("AgsPiano - key pressed %s %d", note, key_code); ags_notation_editor_start_play_key(notation_editor, key_code); } void ags_notation_editor_piano_key_released_callback(AgsPiano *piano, gchar *note, gint key_code, AgsNotationEditor *notation_editor) { g_message("AgsPiano - key released %s %d", note, key_code); ags_notation_editor_stop_play_key(notation_editor, key_code); } void ags_notation_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsNotationEditor *notation_editor) { guint i; if(audio_channels > audio_channels_old){ GList *tab; for(i = audio_channels_old; i < audio_channels; i++){ ags_notebook_insert_tab(notation_editor->notebook, i); tab = notation_editor->notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } }else{ /* shrink notebook */ for(i = audio_channels; i < audio_channels_old; i++){ ags_notebook_remove_tab(notation_editor->notebook, audio_channels); } } } void ags_notation_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsNotationEditor *notation_editor) { AgsAudio *audio; audio = machine->audio; /* verify pads */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ if(!g_type_is_a(channel_type, AGS_TYPE_INPUT)){ return; } }else{ if(!g_type_is_a(channel_type, AGS_TYPE_OUTPUT)){ return; } } /* */ g_object_set(notation_editor->scrolled_piano->piano, "key-count", pads, NULL); gtk_widget_queue_draw((GtkWidget *) notation_editor->scrolled_piano->piano); /* */ gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } gsequencer-3.1.3/ags/X/ags_effect_pad_callbacks.h0000644000175000017500000000206313607210263016644 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_PAD_CALLBACKS_H__ #define __AGS_EFFECT_PAD_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_EFFECT_PAD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_input_listing_editor_callbacks.c0000644000175000017500000000500413607210263021013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_input_listing_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsInputListingEditor *input_listing_editor) { AgsConnectionEditor *connection_editor; if(old_parent != NULL){ return; } connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ ags_input_listing_editor_add_children(input_listing_editor, connection_editor->machine->audio, 0, FALSE); } } void ags_input_listing_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsInputListingEditor *input_listing_editor) { AgsAudio *audio; audio = machine->audio; if(channel_type != input_listing_editor->channel_type){ return; } if(pads_old < pads){ guint audio_channels; guint nth_channel; /* get some audio fields */ g_object_get(audio, "audio-channels", &audio_channels, NULL); /* add children */ nth_channel = pads_old * audio_channels; ags_input_listing_editor_add_children(input_listing_editor, audio, nth_channel, TRUE); }else{ GList *list, *list_next, *list_start; list_start = list = gtk_container_get_children(GTK_CONTAINER(input_listing_editor->child)); list = g_list_nth(list, pads); while(list != NULL){ list_next = list->next; gtk_widget_destroy(GTK_WIDGET(list->data)); list = list_next; } g_list_free(list_start); } } gsequencer-3.1.3/ags/X/ags_pad_editor.h0000644000175000017500000000454213607210263014703 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PAD_EDITOR_H__ #define __AGS_PAD_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PAD_EDITOR (ags_pad_editor_get_type()) #define AGS_PAD_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PAD_EDITOR, AgsPadEditor)) #define AGS_PAD_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PAD_EDITOR, AgsPadEditorClass)) #define AGS_IS_PAD_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PAD_EDITOR)) #define AGS_IS_PAD_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PAD_EDITOR)) #define AGS_PAD_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_PAD_EDITOR, AgsPadEditorClass)) #define AGS_PAD_EDITOR_DEFAULT_VERSION "0.4.2" #define AGS_PAD_EDITOR_DEFAULT_BUILD_ID "CEST 02-10-2014 19:36" typedef struct _AgsPadEditor AgsPadEditor; typedef struct _AgsPadEditorClass AgsPadEditorClass; typedef enum{ AGS_PAD_EDITOR_CONNECTED = 1, }AgsPadEditorFlags; struct _AgsPadEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; AgsChannel *pad; guint editor_type_count; GType *editor_type; GtkExpander *line_editor_expander; GtkVBox *line_editor; }; struct _AgsPadEditorClass { GtkVBoxClass vbox; }; GType ags_pad_editor_get_type(void); void ags_pad_editor_set_channel(AgsPadEditor *pad_editor, AgsChannel *channel); AgsPadEditor* ags_pad_editor_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_PAD_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_audio_preferences_callbacks.c0000644000175000017500000001130713607210263020242 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_audio_preferences_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsAudioPreferences *audio_preferences) { AgsPreferences *preferences; if(old_parent != NULL){ return; } preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(audio_preferences), AGS_TYPE_PREFERENCES); audio_preferences->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_end(gtk_dialog_get_action_area(GTK_DIALOG(preferences)), (GtkWidget *) audio_preferences->add, TRUE, FALSE, 0); } void ags_audio_preferences_add_callback(GtkWidget *widget, AgsAudioPreferences *audio_preferences) { AgsPreferences *preferences; AgsSoundcardEditor *soundcard_editor; AgsSoundcardThread *soundcard_thread; AgsThread *main_loop; AgsApplicationContext *application_context; GObject *soundcard; GList *start_list, *list; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(audio_preferences), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* retrieve first soundcard */ soundcard = NULL; list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ soundcard = list->data; } g_list_free_full(start_list, g_object_unref); /* soundcard editor */ soundcard_editor = ags_soundcard_editor_new(); if(soundcard != NULL){ soundcard_editor->soundcard = soundcard; soundcard_editor->soundcard_thread = (GObject *) ags_thread_find_type(main_loop, AGS_TYPE_SOUNDCARD_THREAD); } list = start_list = gtk_container_get_children((GtkContainer *) audio_preferences->soundcard_editor); if(list != NULL){ gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, FALSE); } g_list_free(start_list); gtk_box_pack_start((GtkBox *) audio_preferences->soundcard_editor, (GtkWidget *) soundcard_editor, FALSE, FALSE, 0); ags_applicable_reset(AGS_APPLICABLE(soundcard_editor)); ags_connectable_connect(AGS_CONNECTABLE(soundcard_editor)); g_signal_connect(soundcard_editor->remove, "clicked", G_CALLBACK(ags_audio_preferences_remove_soundcard_editor_callback), audio_preferences); gtk_widget_show_all((GtkWidget *) soundcard_editor); /* reset default card */ g_object_unref(main_loop); } void ags_audio_preferences_remove_soundcard_editor_callback(GtkWidget *button, AgsAudioPreferences *audio_preferences) { AgsPreferences *preferences; AgsSoundcardEditor *soundcard_editor; GObject *soundcard; GList *start_list, *list; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(audio_preferences), AGS_TYPE_PREFERENCES); soundcard_editor = (AgsSoundcardEditor *) gtk_widget_get_ancestor(button, AGS_TYPE_SOUNDCARD_EDITOR); if(!AGS_IS_JACK_DEVOUT(soundcard_editor->soundcard)){ ags_soundcard_editor_remove_soundcard(soundcard_editor, soundcard_editor->soundcard); } gtk_widget_destroy((GtkWidget *) soundcard_editor); /* reset default card */ /* */ list = start_list = gtk_container_get_children((GtkContainer *) audio_preferences->soundcard_editor); if(list != NULL){ gtk_widget_set_sensitive((GtkWidget *) AGS_SOUNDCARD_EDITOR(list->data)->buffer_size, TRUE); } g_list_free(start_list); } void ags_audio_preferences_start_jack_callback(GtkButton *button, AgsAudioPreferences *audio_preferences) { //TODO:JK: implement me } void ags_audio_preferences_stop_jack_callback(GtkButton *button, AgsAudioPreferences *audio_preferences) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/ags_connection_editor_callbacks.c0000644000175000017500000000403313607210263020263 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include int ags_connection_editor_apply_callback(GtkWidget *widget, AgsConnectionEditor *connection_editor) { ags_applicable_apply(AGS_APPLICABLE(connection_editor)); //TODO:JK: remove me // ags_applicable_reset(AGS_APPLICABLE(connection_editor)); return(0); } int ags_connection_editor_ok_callback(GtkWidget *widget, AgsConnectionEditor *connection_editor) { // ags_applicable_set_update(AGS_APPLICABLE(connection_editor), FALSE); ags_connectable_disconnect(AGS_CONNECTABLE(connection_editor)); ags_applicable_apply(AGS_APPLICABLE(connection_editor)); if(connection_editor->machine != NULL){ connection_editor->machine->connection_editor = NULL; } gtk_widget_destroy((GtkWidget *) connection_editor); return(0); } int ags_connection_editor_cancel_callback(GtkWidget *widget, AgsConnectionEditor *connection_editor) { if(connection_editor->machine != NULL){ connection_editor->machine->connection_editor = NULL; } gtk_widget_destroy((GtkWidget *) connection_editor); return(0); } gboolean ags_connection_editor_delete_event(GtkWidget *dialog, gint response, AgsConnectionEditor *connection_editor) { connection_editor->machine->connection_editor = NULL; return(TRUE); } gsequencer-3.1.3/ags/X/ags_output_editor.c0000644000175000017500000002404713607210263015474 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_output_editor_class_init(AgsOutputEditorClass *output_editor); void ags_output_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_output_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_output_editor_init(AgsOutputEditor *output_editor); void ags_output_editor_connect(AgsConnectable *connectable); void ags_output_editor_disconnect(AgsConnectable *connectable); void ags_output_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_output_editor_apply(AgsApplicable *applicable); void ags_output_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_output_editor * @short_description: A composite widget to edit #AgsChannel * @title: AgsOutputEditor * @section_id: * @include: ags/X/ags_output_editor.h * * #AgsOutputEditor is a composite widget to edit #AgsChannel. */ static gpointer ags_output_editor_parent_class = NULL; GType ags_output_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_output_editor = 0; static const GTypeInfo ags_output_editor_info = { sizeof (AgsOutputEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_output_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOutputEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_output_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_output_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_output_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_output_editor = g_type_register_static(GTK_TYPE_HBOX, "AgsOutputEditor", &ags_output_editor_info, 0); g_type_add_interface_static(ags_type_output_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_output_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_output_editor); } return g_define_type_id__volatile; } void ags_output_editor_class_init(AgsOutputEditorClass *output_editor) { ags_output_editor_parent_class = g_type_class_peek_parent(output_editor); } void ags_output_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_output_editor_connect; connectable->disconnect = ags_output_editor_disconnect; } void ags_output_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_output_editor_set_update; applicable->apply = ags_output_editor_apply; applicable->reset = ags_output_editor_reset; } void ags_output_editor_init(AgsOutputEditor *output_editor) { g_signal_connect_after((GObject *) output_editor, "parent_set", G_CALLBACK(ags_output_editor_parent_set_callback), (gpointer) output_editor); output_editor->flags = 0; output_editor->version = AGS_OUTPUT_EDITOR_DEFAULT_VERSION; output_editor->build_id = AGS_OUTPUT_EDITOR_DEFAULT_BUILD_ID; /* connecting soundcard */ output_editor->soundcard = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(output_editor), GTK_WIDGET(output_editor->soundcard), FALSE, FALSE, 0); /* connect with line */ output_editor->audio_channel = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_box_pack_start(GTK_BOX(output_editor), GTK_WIDGET(output_editor->audio_channel), FALSE, FALSE, 0); } void ags_output_editor_connect(AgsConnectable *connectable) { AgsOutputEditor *output_editor; output_editor = AGS_OUTPUT_EDITOR(connectable); if((AGS_OUTPUT_EDITOR_CONNECTED & (output_editor->flags)) != 0){ return; } output_editor->flags |= AGS_OUTPUT_EDITOR_CONNECTED; g_signal_connect(G_OBJECT(output_editor->soundcard), "changed", G_CALLBACK(ags_output_editor_soundcard_callback), output_editor); } void ags_output_editor_disconnect(AgsConnectable *connectable) { AgsOutputEditor *output_editor; output_editor = AGS_OUTPUT_EDITOR(connectable); if((AGS_OUTPUT_EDITOR_CONNECTED & (output_editor->flags)) == 0){ return; } output_editor->flags &= (~AGS_OUTPUT_EDITOR_CONNECTED); g_object_disconnect(G_OBJECT(output_editor->soundcard), "any_signal::changed", G_CALLBACK(ags_output_editor_soundcard_callback), output_editor, NULL); } void ags_output_editor_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_output_editor_apply(AgsApplicable *applicable) { AgsOutputEditor *output_editor; AgsLineEditor *line_editor; GtkTreeIter iter; output_editor = AGS_OUTPUT_EDITOR(applicable); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(output_editor->soundcard), &iter)){ AgsWindow *window; AgsChannel *channel; GObject *output_soundcard; GtkTreeModel *model; guint soundcard_channel; guint pad, audio_channel; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(output_editor), AGS_TYPE_LINE_EDITOR)); channel = line_editor->channel; /* get channel fields */ g_object_get(channel, "pad", &pad, "audio-channel", &audio_channel, NULL); /* get mapping and soundcard */ soundcard_channel = (guint) gtk_spin_button_get_value_as_int(output_editor->audio_channel); model = gtk_combo_box_get_model(GTK_COMBO_BOX(output_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &output_soundcard, -1); /* create task */ g_object_set(channel, "output-soundcard", output_soundcard, "output-soundcard-channel", soundcard_channel, NULL); } } void ags_output_editor_reset(AgsApplicable *applicable) { AgsOutputEditor *output_editor; GtkTreeModel *model; GtkTreeIter iter; output_editor = AGS_OUTPUT_EDITOR(applicable); model = gtk_combo_box_get_model(GTK_COMBO_BOX(output_editor->soundcard)); if(gtk_tree_model_get_iter_first(model, &iter)){ AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel; GObject *output_soundcard, *current; GList *list; gint i; gboolean found; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(output_editor), AGS_TYPE_LINE_EDITOR)); output_soundcard = NULL; audio = NULL; channel = line_editor->channel; if(channel != NULL){ g_object_get(channel, "audio", &audio, "output-soundcard", &output_soundcard, NULL); } i = 0; found = FALSE; if(output_soundcard != NULL){ do{ gtk_tree_model_get(model, &iter, 1, ¤t, -1); if(output_soundcard == current){ found = TRUE; break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } if(found && audio != NULL){ guint audio_channel; /* set channel link */ gtk_combo_box_set_active(GTK_COMBO_BOX(output_editor->soundcard), i); g_object_get(channel, "output-soundcard-channel", &audio_channel, NULL); gtk_spin_button_set_value(output_editor->audio_channel, audio_channel); }else{ gtk_combo_box_set_active(GTK_COMBO_BOX(output_editor->soundcard), 0); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } } } /** * ags_output_editor_check: * @output_editor: the #AgsOutputEditor * * Checks for possible channels to output. And modifies its ranges. * * Since: 3.0.0 */ void ags_output_editor_check(AgsOutputEditor *output_editor) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(output_editor->soundcard), &iter)){ GObject *output_soundcard; GtkTreeModel *model; guint audio_channels; /* soundcard connection */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(output_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &output_soundcard, -1); if(output_soundcard != NULL){ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), &audio_channels, NULL, NULL, NULL); gtk_spin_button_set_range(output_editor->audio_channel, 0.0, audio_channels - 1.0); }else{ gtk_spin_button_set_range(output_editor->audio_channel, -1.0, -1.0); } }else{ gtk_spin_button_set_range(output_editor->audio_channel, -1.0, -1.0); } } /** * ags_output_editor_new: * * Create a new instance of #AgsOutputEditor * * Returns: the new #AgsOutputEditor * * Since: 3.0.0 */ AgsOutputEditor* ags_output_editor_new() { AgsOutputEditor *output_editor; output_editor = (AgsOutputEditor *) g_object_new(AGS_TYPE_OUTPUT_EDITOR, NULL); return(output_editor); } gsequencer-3.1.3/ags/X/ags_lv2_browser.c0000644000175000017500000003132213607210264015027 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_lv2_browser_class_init(AgsLv2BrowserClass *lv2_browser); void ags_lv2_browser_connectable_interface_init(AgsConnectableInterface *connectable); void ags_lv2_browser_applicable_interface_init(AgsApplicableInterface *applicable); void ags_lv2_browser_init(AgsLv2Browser *lv2_browser); void ags_lv2_browser_connect(AgsConnectable *connectable); void ags_lv2_browser_disconnect(AgsConnectable *connectable); void ags_lv2_browser_set_update(AgsApplicable *applicable, gboolean update); void ags_lv2_browser_apply(AgsApplicable *applicable); void ags_lv2_browser_reset(AgsApplicable *applicable); /** * SECTION:ags_lv2_browser * @short_description: A composite to select lv2 uri. * @title: AgsLv2Browser * @section_id: * @include: ags/X/ags_lv2_browser.h * * #AgsLv2Browser is a composite widget to select lv2 plugin and the desired * uri. */ GType ags_lv2_browser_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_browser = 0; static const GTypeInfo ags_lv2_browser_info = { sizeof (AgsLv2BrowserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_browser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2Browser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_browser_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_lv2_browser_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_lv2_browser_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_lv2_browser = g_type_register_static(GTK_TYPE_VBOX, "AgsLv2Browser", &ags_lv2_browser_info, 0); g_type_add_interface_static(ags_type_lv2_browser, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_lv2_browser, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_browser); } return g_define_type_id__volatile; } void ags_lv2_browser_class_init(AgsLv2BrowserClass *lv2_browser) { /* empty */ } void ags_lv2_browser_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_lv2_browser_connect; connectable->disconnect = ags_lv2_browser_disconnect; } void ags_lv2_browser_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_lv2_browser_set_update; applicable->apply = ags_lv2_browser_apply; applicable->reset = ags_lv2_browser_reset; } void ags_lv2_browser_init(AgsLv2Browser *lv2_browser) { GtkTable *table; GtkLabel *label; GList *start_list, *list; gchar *str; gchar **filenames, **filenames_start; lv2_browser->flags = 0; /* plugin */ lv2_browser->plugin = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) lv2_browser, GTK_WIDGET(lv2_browser->plugin), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("filename: ")); gtk_box_pack_start(GTK_BOX(lv2_browser->plugin), GTK_WIDGET(label), FALSE, FALSE, 0); lv2_browser->filename = (GtkComboBox *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(lv2_browser->plugin), GTK_WIDGET(lv2_browser->filename), FALSE, FALSE, 0); lv2_browser->path = NULL; filenames = filenames_start = ags_lv2_manager_get_filenames(ags_lv2_manager_get_instance()); if(filenames_start != NULL){ list = NULL; while(filenames[0] != NULL){ list = g_list_prepend(list, filenames[0]); filenames++; } list = start_list = g_list_sort(list, g_strcmp0); while(list != NULL){ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(lv2_browser->filename), list->data); list = list->next; } g_list_free(start_list); g_free(filenames_start); } label = (GtkLabel *) gtk_label_new(i18n("effect: ")); gtk_box_pack_start(GTK_BOX(lv2_browser->plugin), GTK_WIDGET(label), FALSE, FALSE, 0); lv2_browser->effect = (GtkComboBox *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(lv2_browser->plugin), GTK_WIDGET(lv2_browser->effect), FALSE, FALSE, 0); /* description */ lv2_browser->description = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) lv2_browser, GTK_WIDGET(lv2_browser->description), FALSE, FALSE, 0); str = g_strdup_printf("%s: ", i18n("Name")); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_box_pack_start(GTK_BOX(lv2_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); g_free(str); str = g_strdup_printf("%s: ", i18n("Homepage")); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_box_pack_start(GTK_BOX(lv2_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); g_free(str); str = g_strdup_printf("%s: ", i18n("M-Box")); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_box_pack_start(GTK_BOX(lv2_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); g_free(str); str = g_strdup_printf("%s: ", i18n("Ports")); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_box_pack_start(GTK_BOX(lv2_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); g_free(str); table = (GtkTable *) gtk_table_new(256, 2, FALSE); gtk_box_pack_start(GTK_BOX(lv2_browser->description), GTK_WIDGET(table), FALSE, FALSE, 0); } void ags_lv2_browser_connect(AgsConnectable *connectable) { AgsLv2Browser *lv2_browser; lv2_browser = AGS_LV2_BROWSER(connectable); if((AGS_LV2_BROWSER_CONNECTED & (lv2_browser->flags)) != 0){ return; } lv2_browser->flags |= AGS_LV2_BROWSER_CONNECTED; g_signal_connect_after(G_OBJECT(lv2_browser->filename), "changed", G_CALLBACK(ags_lv2_browser_plugin_filename_callback), lv2_browser); g_signal_connect_after(G_OBJECT(lv2_browser->effect), "changed", G_CALLBACK(ags_lv2_browser_plugin_uri_callback), lv2_browser); } void ags_lv2_browser_disconnect(AgsConnectable *connectable) { AgsLv2Browser *lv2_browser; lv2_browser = AGS_LV2_BROWSER(connectable); if((AGS_LV2_BROWSER_CONNECTED & (lv2_browser->flags)) == 0){ return; } lv2_browser->flags &= (~AGS_LV2_BROWSER_CONNECTED); g_object_disconnect(G_OBJECT(lv2_browser->filename), "any_signal::changed", G_CALLBACK(ags_lv2_browser_plugin_filename_callback), lv2_browser, NULL); g_object_disconnect(G_OBJECT(lv2_browser->effect), "any_signal::changed", G_CALLBACK(ags_lv2_browser_plugin_uri_callback), lv2_browser, NULL); } void ags_lv2_browser_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_lv2_browser_apply(AgsApplicable *applicable) { /* empty */ } void ags_lv2_browser_reset(AgsApplicable *applicable) { AgsLv2Browser *lv2_browser; GtkComboBoxText *filename; GList *list; lv2_browser = AGS_LV2_BROWSER(applicable); list = gtk_container_get_children(GTK_CONTAINER(lv2_browser->plugin)); filename = GTK_COMBO_BOX_TEXT(list->next->data); g_list_free(list); gtk_combo_box_set_active((GtkComboBox *) filename, 0); } /** * ags_lv2_browser_get_plugin_filename: * @lv2_browser: the #AgsLv2Browser * * Retrieve selected lv2 plugin filename. * * Returns: the active lv2 filename * * Since: 3.0.0 */ gchar* ags_lv2_browser_get_plugin_filename(AgsLv2Browser *lv2_browser) { GtkComboBoxText *filename; GList *list, *list_start; list_start = list = gtk_container_get_children(GTK_CONTAINER(lv2_browser->plugin)); filename = GTK_COMBO_BOX_TEXT(list->next->data); g_list_free(list_start); return(gtk_combo_box_text_get_active_text(filename)); } /** * ags_lv2_browser_get_plugin_uri: * @lv2_browser: the #AgsLv2Browser * * Retrieve selected lv2 uri. * * Returns: the active lv2 uri * * Since: 3.0.0 */ gchar* ags_lv2_browser_get_plugin_effect(AgsLv2Browser *lv2_browser) { GtkComboBoxText *effect; AgsLv2Plugin *lv2_plugin; GList *list, *list_start; gchar *effect_name; /* retrieve filename and effect */ list_start = list = gtk_container_get_children(GTK_CONTAINER(lv2_browser->plugin)); effect = GTK_COMBO_BOX_TEXT(list->next->next->next->data); effect_name = gtk_combo_box_text_get_active_text(effect); g_list_free(list_start); return(effect_name); } /** * ags_lv2_browser_combo_box_output_boolean_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_lv2_browser_combo_box_output_boolean_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "led"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } /** * ags_lv2_browser_combo_box_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_lv2_browser_combo_box_output_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "vertical indicator"); gtk_combo_box_text_append_text(combo_box, "horizontal indicator"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } /** * ags_lv2_browser_combo_box_boolean_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_lv2_browser_combo_box_boolean_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "check-button"); gtk_combo_box_text_append_text(combo_box, "toggle button"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } /** * ags_lv2_browser_combo_box_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_lv2_browser_combo_box_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "spin button"); gtk_combo_box_text_append_text(combo_box, "dial"); gtk_combo_box_text_append_text(combo_box, "vertical scale"); gtk_combo_box_text_append_text(combo_box, "horizontal scale"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } GtkWidget* ags_lv2_browser_preview_new() { GtkWidget *preview; preview = NULL; //TODO:JK: implement me return(preview); } /** * ags_lv2_browser_new: * * Create a new instance of #AgsLv2Browser * * Returns: the new #AgsLv2Browser * * Since: 3.0.0 */ AgsLv2Browser* ags_lv2_browser_new() { AgsLv2Browser *lv2_browser; lv2_browser = (AgsLv2Browser *) g_object_new(AGS_TYPE_LV2_BROWSER, "homogeneous", FALSE, "spacing", 0, NULL); return(lv2_browser); } gsequencer-3.1.3/ags/X/ags_output_collection_editor_callbacks.c0000644000175000017500000000335513607210263021705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_output_collection_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsOutputCollectionEditor *output_collection_editor) { AgsConnectionEditor *connection_editor; if(old_parent != NULL){ return; } connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ gtk_combo_box_set_model(GTK_COMBO_BOX(output_collection_editor->soundcard), GTK_TREE_MODEL(ags_machine_get_possible_audio_output_connections(connection_editor->machine))); ags_output_collection_editor_check(output_collection_editor); } } void ags_output_collection_editor_soundcard_callback(GtkWidget *combo_box, AgsOutputCollectionEditor *output_collection_editor) { ags_output_collection_editor_check(output_collection_editor); } gsequencer-3.1.3/ags/X/ags_line_callbacks.c0000644000175000017500000001005313607210263015504 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_line_check_message_callback(GObject *application_context, AgsLine *line) { ags_line_check_message(line); } void ags_line_group_clicked_callback(GtkWidget *widget, AgsLine *line) { AgsPad *pad; AgsLine *current; GtkContainer *container; GList *list, *list_start; pad = (AgsPad *) gtk_widget_get_ancestor(GTK_WIDGET(line), AGS_TYPE_PAD); container = (GtkContainer *) pad->expander_set; list_start = list = gtk_container_get_children(container); if(gtk_toggle_button_get_active(line->group)){ ags_line_group_changed(line); while(list != NULL){ current = AGS_LINE(list->data); if(!gtk_toggle_button_get_active(current->group)){ g_list_free(list_start); return; } list = list->next; } gtk_toggle_button_set_active(pad->group, TRUE); }else{ if(g_list_length(list) > 1){ if(gtk_toggle_button_get_active(pad->group)){ gtk_toggle_button_set_active(pad->group, FALSE); } while(list != NULL){ current = AGS_LINE(list->data); if(gtk_toggle_button_get_active(current->group)){ ags_line_group_changed(line); g_list_free(list_start); return; } list = list->next; } } gtk_toggle_button_set_active(line->group, TRUE); } g_list_free(list_start); return; } void ags_line_volume_callback(GtkRange *range, AgsLine *line) { AgsVolumeChannel *volume_channel; GList *start_list, *list; GValue value = {0,}; g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, gtk_range_get_value(range)); /* play context */ g_object_get(line->channel, "play", &start_list, NULL); list = start_list; while((list = ags_recall_find_type(list, AGS_TYPE_VOLUME_CHANNEL)) != NULL){ AgsPort *port; volume_channel = AGS_VOLUME_CHANNEL(list->data); g_object_get(volume_channel, "volume", &port, NULL); ags_port_safe_write(port, &value); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); /* recall context */ g_object_get(line->channel, "recall", &start_list, NULL); list = start_list; while((list = ags_recall_find_type(list, AGS_TYPE_VOLUME_CHANNEL)) != NULL){ AgsPort *port; volume_channel = AGS_VOLUME_CHANNEL(list->data); g_object_get(volume_channel, "volume", &port, NULL); ags_port_safe_write(port, &value); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_line_stop_callback(AgsLine *line, GList *recall_id, gint sound_scope, gpointer data) { AgsPad *pad; gboolean reset_active; pad = AGS_PAD(line->pad); if((AGS_PAD_BLOCK_STOP & (pad->flags)) != 0){ return; } pad->flags |= AGS_PAD_BLOCK_STOP; /* play button - check reset active */ reset_active = (sound_scope == AGS_SOUND_SCOPE_PLAYBACK) ? TRUE: FALSE; if(reset_active){ gtk_toggle_button_set_active(pad->play, FALSE); } pad->flags &= (~AGS_PAD_BLOCK_STOP); } gsequencer-3.1.3/ags/X/ags_server_preferences_callbacks.h0000644000175000017500000000212413607210263020451 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SERVER_PREFERENCES_CALLBACKS_H__ #define __AGS_SERVER_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_SERVER_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_output_editor.h0000644000175000017500000000453213607210263015476 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_EDITOR_H__ #define __AGS_OUTPUT_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OUTPUT_EDITOR (ags_output_editor_get_type()) #define AGS_OUTPUT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OUTPUT_EDITOR, AgsOutputEditor)) #define AGS_OUTPUT_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OUTPUT_EDITOR, AgsOutputEditorClass)) #define AGS_IS_OUTPUT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OUTPUT_EDITOR)) #define AGS_IS_OUTPUT_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OUTPUT_EDITOR)) #define AGS_OUTPUT_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OUTPUT_EDITOR, AgsOutputEditorClass)) #define AGS_OUTPUT_EDITOR_DEFAULT_VERSION "0.7.131" #define AGS_OUTPUT_EDITOR_DEFAULT_BUILD_ID "CEST 2017 18-02-2014 04:53" typedef struct _AgsOutputEditor AgsOutputEditor; typedef struct _AgsOutputEditorClass AgsOutputEditorClass; typedef enum{ AGS_OUTPUT_EDITOR_CONNECTED = 1, }AgsOutputEditorFlags; struct _AgsOutputEditor { GtkHBox hbox; guint flags; gchar *version; gchar *build_id; GtkComboBoxText *soundcard; GtkSpinButton *audio_channel; }; struct _AgsOutputEditorClass { GtkHBoxClass hbox; }; GType ags_output_editor_get_type(void); void ags_output_editor_check(AgsOutputEditor *output_editor); AgsOutputEditor* ags_output_editor_new(); G_END_DECLS #endif /*__AGS_OUTPUT_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_machine_callbacks.h0000644000175000017500000000726013607210263016174 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_CALLBACKS_H__ #define __AGS_MACHINE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_machine_check_message_callback(GObject *application_context, AgsMachine *machine); /* controls */ int ags_machine_button_press_callback(GtkWidget *handle_box, GdkEventButton *event, AgsMachine *machine); void ags_machine_popup_move_up_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_move_down_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_hide_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_show_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_destroy_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_rename_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_rename_audio_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_reposition_audio_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_properties_activate_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_sticky_controls_toggled_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_copy_pattern_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_paste_pattern_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_envelope_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_connection_editor_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_midi_dialog_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_midi_export_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_wave_export_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_midi_import_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_popup_wave_import_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_open_response_callback(GtkDialog *dialog, gint response, AgsMachine *machine); void ags_machine_play_callback(GtkWidget *toggle_button, AgsMachine *machine); /* forwarded callbacks */ void ags_machine_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_machine_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data); void ags_machine_stop_callback(AgsMachine *machine, GList *recall_id, gint sound_scope, gpointer data); /* library callbacks */ void ags_machine_active_playback_start_channel_launch_callback(AgsTask *task, AgsPlayback *playback); G_END_DECLS #endif /*__AGS_MACHINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_plugin_browser.c0000644000175000017500000002456013607210263015627 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_plugin_browser_class_init(AgsPluginBrowserClass *plugin_browser); void ags_plugin_browser_init(AgsPluginBrowser *plugin_browser); void ags_plugin_browser_connectable_interface_init(AgsConnectableInterface *connectable); void ags_plugin_browser_applicable_interface_init(AgsApplicableInterface *applicable); void ags_plugin_browser_show(GtkWidget *widget); void ags_plugin_browser_connect(AgsConnectable *connectable); void ags_plugin_browser_disconnect(AgsConnectable *connectable); void ags_plugin_browser_set_update(AgsApplicable *applicable, gboolean update); void ags_plugin_browser_apply(AgsApplicable *applicable); void ags_plugin_browser_reset(AgsApplicable *applicable); /** * SECTION:ags_plugin_browser * @short_description: A composite to select plugin effect. * @title: AgsPluginBrowser * @section_id: * @include: ags/X/ags_plugin_browser.h * * #AgsPluginBrowser is a composite widget to select plugin plugin and the desired * effect. */ static gpointer ags_plugin_browser_parent_class = NULL; GType ags_plugin_browser_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_plugin_browser = 0; static const GTypeInfo ags_plugin_browser_info = { sizeof (AgsPluginBrowserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_plugin_browser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPluginBrowser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_plugin_browser_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_plugin_browser_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_plugin_browser_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_plugin_browser = g_type_register_static(GTK_TYPE_DIALOG, "AgsPluginBrowser", &ags_plugin_browser_info, 0); g_type_add_interface_static(ags_type_plugin_browser, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_plugin_browser, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin_browser); } return g_define_type_id__volatile; } void ags_plugin_browser_class_init(AgsPluginBrowserClass *plugin_browser) { GtkWidgetClass *widget; ags_plugin_browser_parent_class = g_type_class_peek_parent(plugin_browser); /* GtkWidgetClass */ widget = (GtkWidgetClass *) plugin_browser; widget->show = ags_plugin_browser_show; } void ags_plugin_browser_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_plugin_browser_connect; connectable->disconnect = ags_plugin_browser_disconnect; } void ags_plugin_browser_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_plugin_browser_set_update; applicable->apply = ags_plugin_browser_apply; applicable->reset = ags_plugin_browser_reset; } void ags_plugin_browser_init(AgsPluginBrowser *plugin_browser) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; GList *list; plugin_browser->flags = 0; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(plugin_browser)), GTK_WIDGET(vbox), FALSE, FALSE, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("Plugin type:")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); plugin_browser->plugin_type = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) plugin_browser->plugin_type, FALSE, FALSE, 0); gtk_combo_box_text_append_text(plugin_browser->plugin_type, "Lv2"); gtk_combo_box_text_append_text(plugin_browser->plugin_type, "LADSPA"); plugin_browser->active_browser = NULL; plugin_browser->lv2_browser = (GtkWidget *) ags_lv2_browser_new(); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) plugin_browser->lv2_browser, FALSE, FALSE, 0); plugin_browser->dssi_browser = NULL; plugin_browser->ladspa_browser = (GtkWidget *) ags_ladspa_browser_new(); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) plugin_browser->ladspa_browser, FALSE, FALSE, 0); plugin_browser->vst_browser = NULL; /* action area */ gtk_dialog_add_buttons((GtkDialog *) plugin_browser, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); list = gtk_container_get_children((GtkContainer *) gtk_dialog_get_action_area((GtkDialog *) plugin_browser)); plugin_browser->ok = GTK_BUTTON(list->data); plugin_browser->cancel = GTK_BUTTON(list->next->data); g_list_free(list); } void ags_plugin_browser_show(GtkWidget *widget) { AgsPluginBrowser *plugin_browser; plugin_browser = AGS_PLUGIN_BROWSER(widget); GTK_WIDGET_CLASS(ags_plugin_browser_parent_class)->show(widget); gtk_widget_hide(plugin_browser->lv2_browser); gtk_widget_hide(plugin_browser->ladspa_browser); } void ags_plugin_browser_connect(AgsConnectable *connectable) { AgsPluginBrowser *plugin_browser; plugin_browser = AGS_PLUGIN_BROWSER(connectable); if((AGS_PLUGIN_BROWSER_CONNECTED & (plugin_browser->flags)) != 0){ return; } plugin_browser->flags |= AGS_PLUGIN_BROWSER_CONNECTED; g_signal_connect(plugin_browser->plugin_type, "changed", G_CALLBACK(ags_plugin_browser_plugin_type_changed_callback), plugin_browser); ags_connectable_connect(AGS_CONNECTABLE(plugin_browser->lv2_browser)); ags_connectable_connect(AGS_CONNECTABLE(plugin_browser->ladspa_browser)); /* AgsPluginBrowser buttons */ g_signal_connect((GObject *) plugin_browser->ok, "clicked", G_CALLBACK(ags_plugin_browser_ok_callback), (gpointer) plugin_browser); g_signal_connect((GObject *) plugin_browser->cancel, "clicked", G_CALLBACK(ags_plugin_browser_cancel_callback), (gpointer) plugin_browser); } void ags_plugin_browser_disconnect(AgsConnectable *connectable) { AgsPluginBrowser *plugin_browser; plugin_browser = AGS_PLUGIN_BROWSER(connectable); if((AGS_PLUGIN_BROWSER_CONNECTED & (plugin_browser->flags)) == 0){ return; } plugin_browser->flags &= (~AGS_PLUGIN_BROWSER_CONNECTED); g_object_disconnect(plugin_browser->plugin_type, "any_signal::changed", G_CALLBACK(ags_plugin_browser_plugin_type_changed_callback), plugin_browser, NULL); ags_connectable_disconnect(AGS_CONNECTABLE(plugin_browser->lv2_browser)); ags_connectable_disconnect(AGS_CONNECTABLE(plugin_browser->ladspa_browser)); /* AgsPluginBrowser buttons */ g_object_disconnect((GObject *) plugin_browser->ok, "any_signal::clicked", G_CALLBACK(ags_plugin_browser_ok_callback), (gpointer) plugin_browser, NULL); g_object_disconnect((GObject *) plugin_browser->cancel, "any_signal::clicked", G_CALLBACK(ags_plugin_browser_cancel_callback), (gpointer) plugin_browser, NULL); } void ags_plugin_browser_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_plugin_browser_apply(AgsApplicable *applicable) { //TODO:JK: implement me } void ags_plugin_browser_reset(AgsApplicable *applicable) { //TODO:JK: implement me } /** * ags_plugin_browser_get_plugin_filename: * @plugin_browser: the #AgsPluginBrowser * * Retrieve selected plugin plugin filename. * * Returns: the active plugin filename * * Since: 3.0.0 */ gchar* ags_plugin_browser_get_plugin_filename(AgsPluginBrowser *plugin_browser) { if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){ return(ags_lv2_browser_get_plugin_filename((AgsLv2Browser *) plugin_browser->lv2_browser)); }else if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){ return(ags_ladspa_browser_get_plugin_filename((AgsLadspaBrowser *) plugin_browser->ladspa_browser)); }else{ return(NULL); } } /** * ags_plugin_browser_get_plugin_effect: * @plugin_browser: the #AgsPluginBrowser * * Retrieve selected plugin effect. * * Returns: the active plugin effect * * Since: 3.0.0 */ gchar* ags_plugin_browser_get_plugin_effect(AgsPluginBrowser *plugin_browser) { if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){ return(ags_lv2_browser_get_plugin_effect((AgsLv2Browser *) plugin_browser->lv2_browser)); }else if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){ return(ags_ladspa_browser_get_plugin_effect((AgsLadspaBrowser *) plugin_browser->ladspa_browser)); }else{ return(NULL); } } /** * ags_plugin_browser_new: * @parent_window: the #AgsWindow * * Create a new instance of #AgsPluginBrowser * * Returns: the new #AgsPluginBrowser * * Since: 3.0.0 */ AgsPluginBrowser* ags_plugin_browser_new(GtkWidget *parent_window) { AgsPluginBrowser *plugin_browser; plugin_browser = (AgsPluginBrowser *) g_object_new(AGS_TYPE_PLUGIN_BROWSER, NULL); plugin_browser->parent_window = parent_window; return(plugin_browser); } gsequencer-3.1.3/ags/X/ags_plugin_preferences.c0000644000175000017500000001264013607210263016441 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_plugin_preferences_class_init(AgsPluginPreferencesClass *plugin_preferences); void ags_plugin_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_plugin_preferences_init(AgsPluginPreferences *plugin_preferences); void ags_plugin_preferences_connect(AgsConnectable *connectable); void ags_plugin_preferences_disconnect(AgsConnectable *connectable); void ags_plugin_preferences_reset(AgsPluginPreferences *plugin_preferences); void* ags_plugin_preferences_refresh(void *ptr); /** * SECTION:ags_plugin_preferences * @short_description: A composite widget to do plugin related preferences * @title: AgsPluginPreferences * @section_id: * @include: ags/X/ags_plugin_preferences.h * * #AgsPluginPreferences enables you to make plugin related preferences. */ static gpointer ags_plugin_preferences_parent_class = NULL; GType ags_plugin_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_plugin_preferences = 0; static const GTypeInfo ags_plugin_preferences_info = { sizeof (AgsPluginPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_plugin_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPluginPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_plugin_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_plugin_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_plugin_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsPluginPreferences", &ags_plugin_preferences_info, 0); g_type_add_interface_static(ags_type_plugin_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin_preferences); } return g_define_type_id__volatile; } void ags_plugin_preferences_class_init(AgsPluginPreferencesClass *plugin_preferences) { ags_plugin_preferences_parent_class = g_type_class_peek_parent(plugin_preferences); } void ags_plugin_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_plugin_preferences_connect; connectable->disconnect = ags_plugin_preferences_disconnect; } void ags_plugin_preferences_init(AgsPluginPreferences *plugin_preferences) { //TODO:JK: implement me } void ags_plugin_preferences_connect(AgsConnectable *connectable) { /* empty */ } void ags_plugin_preferences_disconnect(AgsConnectable *connectable) { /* empty */ } AgsLadspaPluginPreferences* ags_ladspa_plugin_preferences_alloc(gchar *ladspa_path) { AgsLadspaPluginPreferences *ladspa_plugin_preferences; GtkListStore *list_store; GtkTreePath *path; GtkTreeIter iter; gchar **filenames, **filenames_start; static const gchar *default_ladspa_path = "/usr/lib/ladspa"; ladspa_plugin_preferences = (AgsLadspaPluginPreferences *) malloc(sizeof(AgsLadspaPluginPreferences)); ladspa_plugin_preferences->ladspa_path = (GtkEntry *) gtk_entry_new(); if(ladspa_path == NULL){ gtk_entry_set_text(ladspa_plugin_preferences->ladspa_path, default_ladspa_path); }else{ gtk_entry_set_text(ladspa_plugin_preferences->ladspa_path, ladspa_path); } ladspa_plugin_preferences->plugin_file = (GtkCellView *) gtk_cell_view_new(); list_store = gtk_list_store_new(1, G_TYPE_STRING); filenames = filenames_start = ags_ladspa_manager_get_filenames(ags_ladspa_manager_get_instance()); while(*filenames != NULL){ // Add a new row to the model gtk_list_store_append (list_store, &iter); gtk_list_store_set(list_store, &iter, 0, *filenames, -1); filenames++; } free(filenames_start); gtk_cell_view_set_model(ladspa_plugin_preferences->plugin_file, GTK_TREE_MODEL(list_store)); return(ladspa_plugin_preferences); } /** * ags_plugin_preferences_new: * * Create a new instance of #AgsPluginPreferences * * Returns: the new #AgsPluginPreferences * * Since: 3.0.0 */ AgsPluginPreferences* ags_plugin_preferences_new() { AgsPluginPreferences *plugin_preferences; plugin_preferences = (AgsPluginPreferences *) g_object_new(AGS_TYPE_PLUGIN_PREFERENCES, NULL); return(plugin_preferences); } gsequencer-3.1.3/ags/X/ags_server_preferences.c0000644000175000017500000001743613607210263016461 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_server_preferences_class_init(AgsServerPreferencesClass *server_preferences); void ags_server_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_server_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_server_preferences_init(AgsServerPreferences *server_preferences); void ags_server_preferences_connect(AgsConnectable *connectable); void ags_server_preferences_disconnect(AgsConnectable *connectable); void ags_server_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_server_preferences_apply(AgsApplicable *applicable); void ags_server_preferences_reset(AgsApplicable *applicable); /** * SECTION:ags_server_preferences * @short_description: A composite widget to do server related preferences * @title: AgsServerPreferences * @section_id: * @include: ags/X/ags_server_preferences.h * * #AgsServerPreferences enables you to make server related preferences. */ static gpointer ags_server_preferences_parent_class = NULL; GType ags_server_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_server_preferences = 0; static const GTypeInfo ags_server_preferences_info = { sizeof (AgsServerPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_server_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsServerPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_server_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_server_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_server_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_server_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsServerPreferences", &ags_server_preferences_info, 0); g_type_add_interface_static(ags_type_server_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_server_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_server_preferences); } return g_define_type_id__volatile; } void ags_server_preferences_class_init(AgsServerPreferencesClass *server_preferences) { ags_server_preferences_parent_class = g_type_class_peek_parent(server_preferences); } void ags_server_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_server_preferences_connect; connectable->disconnect = ags_server_preferences_disconnect; } void ags_server_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_server_preferences_set_update; applicable->apply = ags_server_preferences_apply; applicable->reset = ags_server_preferences_reset; } void ags_server_preferences_init(AgsServerPreferences *server_preferences) { GtkTable *table; GtkLabel *label; table = (GtkTable *) gtk_table_new(2, 5, FALSE); gtk_box_pack_start(GTK_BOX(server_preferences), GTK_WIDGET(table), FALSE, FALSE, 2); server_preferences->start = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("start server")); gtk_table_attach(table, GTK_WIDGET(server_preferences->start), 0, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_sensitive((GtkWidget *) server_preferences->start, FALSE); /* address */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("address"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); server_preferences->address = (GtkEntry *) gtk_entry_new(); gtk_table_attach(table, GTK_WIDGET(server_preferences->address), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_sensitive((GtkWidget *) server_preferences->address, FALSE); /* port */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("port"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); server_preferences->port = (GtkEntry *) gtk_entry_new(); gtk_table_attach(table, GTK_WIDGET(server_preferences->port), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_sensitive((GtkWidget *) server_preferences->port, FALSE); /* username */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("username"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0); server_preferences->username = (GtkEntry *) gtk_entry_new(); gtk_table_attach(table, GTK_WIDGET(server_preferences->username), 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_sensitive((GtkWidget *) server_preferences->username, FALSE); /* password */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("password"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); server_preferences->password = (GtkEntry *) gtk_entry_new(); gtk_entry_set_visibility(server_preferences->password, FALSE); gtk_table_attach(table, GTK_WIDGET(server_preferences->password), 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_sensitive((GtkWidget *) server_preferences->password, FALSE); } void ags_server_preferences_connect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_server_preferences_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_server_preferences_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_server_preferences_apply(AgsApplicable *applicable) { //TODO:JK: implement me } void ags_server_preferences_reset(AgsApplicable *applicable) { //TODO:JK: implement me } /** * ags_server_preferences_new: * * Create a new instance of #AgsServerPreferences * * Returns: the new #AgsServerPreferences * * Since: 3.0.0 */ AgsServerPreferences* ags_server_preferences_new() { AgsServerPreferences *server_preferences; server_preferences = (AgsServerPreferences *) g_object_new(AGS_TYPE_SERVER_PREFERENCES, NULL); return(server_preferences); } gsequencer-3.1.3/ags/X/ags_effect_separator.c0000644000175000017500000001640213607210263016076 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_effect_separator_class_init(AgsEffectSeparatorClass *effect_separator); void ags_effect_separator_init(AgsEffectSeparator *effect_separator); void ags_effect_separator_connectable_interface_init(AgsConnectableInterface *connectable); void ags_effect_separator_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_effect_separator_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); /** * SECTION:ags_effect_separator * @short_description: A effect separator widget * @title: AgsEffectSeparator * @section_id: * @include: ags/widget/ags_effect_separator.h * * #AgsEffectSeparator is a widget representing an separator of effects. */ enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_TEXT, }; static gpointer ags_effect_separator_parent_class = NULL; GType ags_effect_separator_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_effect_separator = 0; static const GTypeInfo ags_effect_separator_info = { sizeof(AgsEffectSeparatorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_effect_separator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEffectSeparator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_effect_separator_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_effect_separator_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_effect_separator = g_type_register_static(GTK_TYPE_HBOX, "AgsEffectSeparator", &ags_effect_separator_info, 0); g_type_add_interface_static(ags_type_effect_separator, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_effect_separator); } return g_define_type_id__volatile; } void ags_effect_separator_class_init(AgsEffectSeparatorClass *effect_separator) { GObjectClass *gobject; GParamSpec *param_spec; ags_effect_separator_parent_class = g_type_class_peek_parent(effect_separator); /* GObjectClass */ gobject = (GObjectClass *) effect_separator; gobject->set_property = ags_effect_separator_set_property; gobject->get_property = ags_effect_separator_get_property; /* properties */ /** * AgsEffectSeparator:filename: * * The filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename"), i18n_pspec("The filename"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsEffectSeparator:effect: * * The effect. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("effect"), i18n_pspec("The effect"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsEffectSeparator:text: * * The text. * * Since: 3.0.0 */ param_spec = g_param_spec_string("text", i18n_pspec("text"), i18n_pspec("The text"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TEXT, param_spec); } void ags_effect_separator_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = NULL; connectable->disconnect = NULL; } void ags_effect_separator_init(AgsEffectSeparator *effect_separator) { GtkSeparator *separator; effect_separator->filename = NULL; effect_separator->effect = NULL; /* heading separator */ separator = (GtkSeparator *) gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(effect_separator), GTK_WIDGET(separator), TRUE, TRUE, 0); /* label */ effect_separator->label = (GtkLabel *) gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(effect_separator), GTK_WIDGET(effect_separator->label), FALSE, FALSE, 0); /* trailing separator */ separator = (GtkSeparator *) gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(effect_separator), GTK_WIDGET(separator), TRUE, TRUE, 0); } void ags_effect_separator_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEffectSeparator *effect_separator; effect_separator = AGS_EFFECT_SEPARATOR(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(effect_separator->filename != NULL){ g_free(effect_separator->filename); } effect_separator->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect_separator->effect != NULL){ g_free(effect_separator->effect); } effect_separator->effect = g_strdup(effect); } break; case PROP_TEXT: { gchar *text; text = g_value_get_string(value); gtk_label_set_text(effect_separator->label, text); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_separator_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEffectSeparator *effect_separator; effect_separator = AGS_EFFECT_SEPARATOR(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, effect_separator->filename); } break; case PROP_EFFECT: { g_value_set_string(value, effect_separator->effect); } break; case PROP_TEXT: { g_value_set_string(value, gtk_label_get_text(effect_separator->label)); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } /** * ags_effect_separator_new: * * Create a new instance of #AgsEffectSeparator. * * Returns: the new #AgsEffectSeparator * * Since: 3.0.0 */ AgsEffectSeparator* ags_effect_separator_new() { AgsEffectSeparator *effect_separator; effect_separator = (AgsEffectSeparator *) g_object_new(AGS_TYPE_EFFECT_SEPARATOR, NULL); return(effect_separator); } gsequencer-3.1.3/ags/X/ags_property_listing_editor.h0000644000175000017500000000450213607210263017550 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PROPERTY_LISTING_EDITOR_H__ #define __AGS_PROPERTY_LISTING_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PROPERTY_LISTING_EDITOR (ags_property_listing_editor_get_type()) #define AGS_PROPERTY_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PROPERTY_LISTING_EDITOR, AgsPropertyListingEditor)) #define AGS_PROPERTY_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PROPERTY_LISTING_EDITOR, AgsPropertyListingEditorClass)) #define AGS_IS_PROPERTY_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PROPERTY_LISTING_EDITOR)) #define AGS_IS_PROPERTY_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PROPERTY_LISTING_EDITOR)) #define AGS_PROPERTY_LISTING_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PROPERTY_LISTING_EDITOR, AgsPropertyListingEditorClass)) typedef struct _AgsPropertyListingEditor AgsPropertyListingEditor; typedef struct _AgsPropertyListingEditorClass AgsPropertyListingEditorClass; struct _AgsPropertyListingEditor { AgsPropertyEditor property_editor; GtkVBox *child; }; struct _AgsPropertyListingEditorClass { AgsPropertyEditorClass property_editor; }; GType ags_property_listing_editor_get_type(); AgsPropertyListingEditor* ags_property_listing_editor_new(); G_END_DECLS #endif /*__AGS_PROPERTY_LISTING_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_export_soundcard.h0000644000175000017500000000602713607210263016154 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPORT_SOUNDCARD_H__ #define __AGS_EXPORT_SOUNDCARD_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EXPORT_SOUNDCARD (ags_export_soundcard_get_type()) #define AGS_EXPORT_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EXPORT_SOUNDCARD, AgsExportSoundcard)) #define AGS_EXPORT_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EXPORT_SOUNDCARD, AgsExportSoundcardClass)) #define AGS_IS_EXPORT_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EXPORT_SOUNDCARD)) #define AGS_IS_EXPORT_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EXPORT_SOUNDCARD)) #define AGS_EXPORT_SOUNDCARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EXPORT_SOUNDCARD, AgsExportSoundcardClass)) #define AGS_EXPORT_SOUNDCARD_FORMAT_WAV "wav" #define AGS_EXPORT_SOUNDCARD_FORMAT_FLAC "flac" #define AGS_EXPORT_SOUNDCARD_FORMAT_AIFF "aiff" #define AGS_EXPORT_SOUNDCARD_FORMAT_OGG "ogg" typedef struct _AgsExportSoundcard AgsExportSoundcard; typedef struct _AgsExportSoundcardClass AgsExportSoundcardClass; typedef enum{ AGS_EXPORT_SOUNDCARD_CONNECTED = 1, }AgsExportSoundcardFlags; struct _AgsExportSoundcard { GtkVBox vbox; guint flags; GObject *soundcard; GtkComboBoxText *backend; GtkComboBoxText *card; GtkEntry *filename; GtkButton *file_chooser_button; GtkComboBoxText *output_format; }; struct _AgsExportSoundcardClass { GtkVBoxClass vbox; }; GType ags_export_soundcard_get_type(void); /* soundcard */ gboolean ags_export_soundcard_set_backend(AgsExportSoundcard *export_soundcard, gchar *backend); void ags_export_soundcard_refresh_card(AgsExportSoundcard *export_soundcard); gboolean ags_export_soundcard_set_card(AgsExportSoundcard *export_soundcard, gchar *card); /* filename */ void ags_export_soundcard_set_filename(AgsExportSoundcard *export_soundcard, gchar *filename); /* format */ void ags_export_soundcard_set_format(AgsExportSoundcard *export_soundcard, gchar *format); /* */ AgsExportSoundcard* ags_export_soundcard_new(); G_END_DECLS #endif /*__AGS_EXPORT_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/X/ags_osc_server_preferences.h0000644000175000017500000000516413607210263017325 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_SERVER_PREFERENCES_H__ #define __AGS_OSC_SERVER_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_SERVER_PREFERENCES (ags_osc_server_preferences_get_type()) #define AGS_OSC_SERVER_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_SERVER_PREFERENCES, AgsOscServerPreferences)) #define AGS_OSC_SERVER_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_SERVER_PREFERENCES, AgsOscServerPreferencesClass)) #define AGS_IS_OSC_SERVER_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OSC_SERVER_PREFERENCES)) #define AGS_IS_OSC_SERVER_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OSC_SERVER_PREFERENCES)) #define AGS_OSC_SERVER_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OSC_SERVER_PREFERENCES, AgsOscServerPreferencesClass)) typedef struct _AgsOscServerPreferences AgsOscServerPreferences; typedef struct _AgsOscServerPreferencesClass AgsOscServerPreferencesClass; typedef enum{ AGS_OSC_SERVER_PREFERENCES_CONNECTED = 1, AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE = 1 << 1, }AgsOscServerPreferencesFlags; struct _AgsOscServerPreferences { GtkVBox vbox; guint flags; GtkCheckButton *auto_start; GtkButton *start; GtkButton *stop; GtkCheckButton *any_address; GtkCheckButton *enable_ip4; GtkEntry *ip4_address; GtkCheckButton *enable_ip6; GtkEntry *ip6_address; GtkEntry *port; GtkSpinButton *monitor_timeout; }; struct _AgsOscServerPreferencesClass { GtkVBoxClass vbox; }; GType ags_osc_server_preferences_get_type(void); AgsOscServerPreferences* ags_osc_server_preferences_new(); G_END_DECLS #endif /*__AGS_OSC_SERVER_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_osc_server_preferences_callbacks.h0000644000175000017500000000411213607210263021314 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_SERVER_PREFERENCES_CALLBACKS_H__ #define __AGS_OSC_SERVER_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_osc_server_preferences_start_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_stop_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_any_address_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_enable_ip4_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_ip4_address_callback(GtkEditable *editable, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_enable_ip6_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_ip6_address_callback(GtkEditable *editable, AgsOscServerPreferences *osc_server_preferences); void ags_osc_server_preferences_port_callback(GtkEditable *editable, AgsOscServerPreferences *osc_server_preferences); G_END_DECLS #endif /*__AGS_OSC_SERVER_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_midi_dialog_callbacks.c0000644000175000017500000000353613605312646017034 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include int ags_midi_dialog_apply_callback(GtkWidget *widget, AgsMidiDialog *midi_dialog) { ags_applicable_apply(AGS_APPLICABLE(midi_dialog)); //TODO:JK: remove me // ags_applicable_reset(AGS_APPLICABLE(midi_dialog)); return(0); } int ags_midi_dialog_ok_callback(GtkWidget *widget, AgsMidiDialog *midi_dialog) { // ags_applicable_set_update(AGS_APPLICABLE(midi_dialog), FALSE); ags_connectable_disconnect(AGS_CONNECTABLE(midi_dialog)); ags_applicable_apply(AGS_APPLICABLE(midi_dialog)); midi_dialog->machine->midi_dialog = NULL; gtk_widget_destroy((GtkWidget *) midi_dialog); return(0); } int ags_midi_dialog_cancel_callback(GtkWidget *widget, AgsMidiDialog *midi_dialog) { midi_dialog->machine->midi_dialog = NULL; gtk_widget_destroy((GtkWidget *) midi_dialog); return(0); } gboolean ags_midi_dialog_delete_event(GtkWidget *widget, GdkEventAny *event, AgsMidiDialog *midi_dialog) { midi_dialog->machine->midi_dialog = NULL; return(TRUE); } gsequencer-3.1.3/ags/X/ags_ui_provider.h0000644000175000017500000002131113613101102015075 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_UI_PROVIDER_H__ #define __AGS_UI_PROVIDER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_UI_PROVIDER (ags_ui_provider_get_type()) #define AGS_UI_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_UI_PROVIDER, AgsUiProvider)) #define AGS_UI_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_UI_PROVIDER, AgsUiProviderInterface)) #define AGS_IS_UI_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_UI_PROVIDER)) #define AGS_IS_UI_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_UI_PROVIDER)) #define AGS_UI_PROVIDER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_UI_PROVIDER, AgsUiProviderInterface)) #define AGS_UI_PROVIDER_DEFAULT_TIMEOUT (1.0 / 30.0) typedef struct _AgsUiProvider AgsUiProvider; typedef struct _AgsUiProviderInterface AgsUiProviderInterface; struct _AgsUiProviderInterface { GTypeInterface ginterface; gboolean (*get_show_animation)(AgsUiProvider *ui_provider); void (*set_show_animation)(AgsUiProvider *ui_provider, gboolean show_animation); gboolean (*get_gui_ready)(AgsUiProvider *ui_provider); void (*set_gui_ready)(AgsUiProvider *ui_provider, gboolean gui_ready); gboolean (*get_file_ready)(AgsUiProvider *ui_provider); void (*set_file_ready)(AgsUiProvider *ui_provider, gboolean file_ready); gdouble (*get_gui_scale_factor)(AgsUiProvider *ui_provider); void (*set_gui_scale_factor)(AgsUiProvider *ui_provider, gdouble gui_scale_factor); void (*schedule_task)(AgsUiProvider *ui_provider, AgsTask *task); void (*schedule_task_all)(AgsUiProvider *ui_provider, GList *task); void (*setup_completed)(AgsUiProvider *ui_provider); void (*check_message)(AgsUiProvider *ui_provider); void (*clean_message)(AgsUiProvider *ui_provider); GtkWidget* (*get_animation_window)(AgsUiProvider *ui_provider); void (*set_animation_window)(AgsUiProvider *ui_provider, GtkWidget *animation_window); GtkWidget* (*get_window)(AgsUiProvider *ui_provider); void (*set_window)(AgsUiProvider *ui_provider, GtkWidget *window); GtkWidget* (*get_automation_window)(AgsUiProvider *ui_provider); void (*set_automation_window)(AgsUiProvider *ui_provider, GtkWidget *automation_window); GtkWidget* (*get_wave_window)(AgsUiProvider *ui_provider); void (*set_wave_window)(AgsUiProvider *ui_provider, GtkWidget *wave_window); GtkWidget* (*get_sheet_window)(AgsUiProvider *ui_provider); void (*set_sheet_window)(AgsUiProvider *ui_provider, GtkWidget *sheet_window); GtkWidget* (*get_export_window)(AgsUiProvider *ui_provider); void (*set_export_window)(AgsUiProvider *ui_provider, GtkWidget *export_window); GtkWidget* (*get_preferences)(AgsUiProvider *ui_provider); void (*set_preferences)(AgsUiProvider *ui_provider, GtkWidget *preferences); GtkWidget* (*get_history_browser)(AgsUiProvider *ui_provider); void (*set_history_browser)(AgsUiProvider *ui_provider, GtkWidget *history_browser); GtkWidget* (*get_midi_browser)(AgsUiProvider *ui_provider); void (*set_midi_browser)(AgsUiProvider *ui_provider, GtkWidget *midi_browser); GtkWidget* (*get_sample_browser)(AgsUiProvider *ui_provider); void (*set_sample_browser)(AgsUiProvider *ui_provider, GtkWidget *sample_browser); GtkWidget* (*get_midi_import_wizard)(AgsUiProvider *ui_provider); void (*set_midi_import_wizard)(AgsUiProvider *ui_provider, GtkWidget *midi_import_wizard); GtkWidget* (*get_midi_export_wizard)(AgsUiProvider *ui_provider); void (*set_midi_export_wizard)(AgsUiProvider *ui_provider, GtkWidget *midi_export_wizard); GList* (*get_machine)(AgsUiProvider *ui_provider); void (*set_machine)(AgsUiProvider *ui_provider, GList *machine); GtkWidget* (*get_composite_editor)(AgsUiProvider *ui_provider); void (*set_composite_editor)(AgsUiProvider *ui_provider, GtkWidget *composite_editor); GtkWidget* (*get_navigation)(AgsUiProvider *ui_provider); void (*set_navigation)(AgsUiProvider *ui_provider, GtkWidget *navigation); }; GType ags_ui_provider_get_type(); gboolean ags_ui_provider_get_show_animation(AgsUiProvider *ui_provider); void ags_ui_provider_set_show_animation(AgsUiProvider *ui_provider, gboolean show_animation); gboolean ags_ui_provider_get_gui_ready(AgsUiProvider *ui_provider); void ags_ui_provider_set_gui_ready(AgsUiProvider *ui_provider, gboolean gui_ready); gboolean ags_ui_provider_get_file_ready(AgsUiProvider *ui_provider); void ags_ui_provider_set_file_ready(AgsUiProvider *ui_provider, gboolean file_ready); gdouble ags_ui_provider_get_gui_scale_factor(AgsUiProvider *ui_provider); void ags_ui_provider_set_gui_scale_factor(AgsUiProvider *ui_provider, gdouble gui_scale_factor); void ags_ui_provider_schedule_task(AgsUiProvider *ui_provider, AgsTask *task); void ags_ui_provider_schedule_task_all(AgsUiProvider *ui_provider, GList *task); void ags_ui_provider_setup_completed(AgsUiProvider *ui_provider); void ags_ui_provider_check_message(AgsUiProvider *ui_provider); void ags_ui_provider_clean_message(AgsUiProvider *ui_provider); GtkWidget* ags_ui_provider_get_animation_window(AgsUiProvider *ui_provider); void ags_ui_provider_set_animation_window(AgsUiProvider *ui_provider, GtkWidget *animation_window); GtkWidget* ags_ui_provider_get_window(AgsUiProvider *ui_provider); void ags_ui_provider_set_window(AgsUiProvider *ui_provider, GtkWidget *window); GtkWidget* ags_ui_provider_get_automation_window(AgsUiProvider *ui_provider); void ags_ui_provider_set_automation_window(AgsUiProvider *ui_provider, GtkWidget *automation_window); GtkWidget* ags_ui_provider_get_wave_window(AgsUiProvider *ui_provider); void ags_ui_provider_set_wave_window(AgsUiProvider *ui_provider, GtkWidget *wave_window); GtkWidget* ags_ui_provider_get_sheet_window(AgsUiProvider *ui_provider); void ags_ui_provider_set_sheet_window(AgsUiProvider *ui_provider, GtkWidget *sheet_window); GtkWidget* ags_ui_provider_get_export_window(AgsUiProvider *ui_provider); void ags_ui_provider_set_export_window(AgsUiProvider *ui_provider, GtkWidget *export_window); GtkWidget* ags_ui_provider_get_preferences(AgsUiProvider *ui_provider); void ags_ui_provider_set_preferences(AgsUiProvider *ui_provider, GtkWidget *preferences); GtkWidget* ags_ui_provider_get_history_browser(AgsUiProvider *ui_provider); void ags_ui_provider_set_history_browser(AgsUiProvider *ui_provider, GtkWidget *history_browser); GtkWidget* ags_ui_provider_get_midi_browser(AgsUiProvider *ui_provider); void ags_ui_provider_set_midi_browser(AgsUiProvider *ui_provider, GtkWidget *midi_browser); GtkWidget* ags_ui_provider_get_sample_browser(AgsUiProvider *ui_provider); void ags_ui_provider_set_sample_browser(AgsUiProvider *ui_provider, GtkWidget *sample_browser); GtkWidget* ags_ui_provider_get_midi_import_wizard(AgsUiProvider *ui_provider); void ags_ui_provider_set_midi_import_wizard(AgsUiProvider *ui_provider, GtkWidget *midi_import_wizard); GtkWidget* ags_ui_provider_get_midi_export_wizard(AgsUiProvider *ui_provider); void ags_ui_provider_set_midi_export_wizard(AgsUiProvider *ui_provider, GtkWidget *midi_export_wizard); GList* ags_ui_provider_get_machine(AgsUiProvider *ui_provider); void ags_ui_provider_set_machine(AgsUiProvider *ui_provider, GList *machine); GtkWidget* ags_ui_provider_get_composite_editor(AgsUiProvider *ui_provider); void ags_ui_provider_set_composite_editor(AgsUiProvider *ui_provider, GtkWidget *composite_editor); GtkWidget* ags_ui_provider_get_navigation(AgsUiProvider *ui_provider); void ags_ui_provider_set_navigation(AgsUiProvider *ui_provider, GtkWidget *navigation); G_END_DECLS #endif /*__AGS_UI_PROVIDER_H__*/ gsequencer-3.1.3/ags/X/ags_link_collection_editor.c0000644000175000017500000004742213607210263017306 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_link_collection_editor_class_init(AgsLinkCollectionEditorClass *link_collection_editor); void ags_link_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_link_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_link_collection_editor_init(AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_link_collection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_link_collection_editor_connect(AgsConnectable *connectable); void ags_link_collection_editor_disconnect(AgsConnectable *connectable); void ags_link_collection_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_link_collection_editor_apply(AgsApplicable *applicable); void ags_link_collection_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_link_collection_editor * @short_description: edit links in bulk mode. * @title: AgsLinkCollectionEditor * @section_id: * @include: ags/X/ags_link_collection_editor.h * * #AgsLinkCollectionEditor is a composite widget to modify links in bulk mode. A link collection * editor should be packed by a #AgsMachineEditor. */ enum{ PROP_0, PROP_CHANNEL_TYPE, }; static gpointer ags_link_collection_editor_parent_class = NULL; GType ags_link_collection_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_link_collection_editor = 0; static const GTypeInfo ags_link_collection_editor_info = { sizeof (AgsLinkCollectionEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_link_collection_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLinkCollectionEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_link_collection_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_link_collection_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_link_collection_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_link_collection_editor = g_type_register_static(GTK_TYPE_TABLE, "AgsLinkCollectionEditor", &ags_link_collection_editor_info, 0); g_type_add_interface_static(ags_type_link_collection_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_link_collection_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_link_collection_editor); } return g_define_type_id__volatile; } void ags_link_collection_editor_class_init(AgsLinkCollectionEditorClass *link_collection_editor) { GObjectClass *gobject; GParamSpec *param_spec; ags_link_collection_editor_parent_class = g_type_class_peek_parent(link_collection_editor); /* GObjectClass */ gobject = (GObjectClass *) link_collection_editor; gobject->set_property = ags_link_collection_editor_set_property; gobject->get_property = ags_link_collection_editor_get_property; /* properties */ /** * AgsLinkCollectionEditor:channel-type: * * The channel type to apply to. Either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("channel-type", i18n_pspec("assigned channel type"), i18n_pspec("The channel type which this channel link collection editor is assigned with"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL_TYPE, param_spec); } void ags_link_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_link_collection_editor_connect; connectable->disconnect = ags_link_collection_editor_disconnect; } void ags_link_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_link_collection_editor_set_update; applicable->apply = ags_link_collection_editor_apply; applicable->reset = ags_link_collection_editor_reset; } void ags_link_collection_editor_init(AgsLinkCollectionEditor *link_collection_editor) { GtkAlignment *alignment; GtkLabel *label; GtkCellRenderer *cell_renderer; GtkListStore *model; GtkTreeIter iter; link_collection_editor->flags = 0; g_signal_connect_after(GTK_WIDGET(link_collection_editor), "parent_set", G_CALLBACK(ags_link_collection_editor_parent_set_callback), link_collection_editor); link_collection_editor->channel_type = G_TYPE_NONE; gtk_table_resize(GTK_TABLE(link_collection_editor), 4, 2); gtk_table_set_row_spacings(GTK_TABLE(link_collection_editor), 4); gtk_table_set_col_spacings(GTK_TABLE(link_collection_editor), 2); /* link */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 0, 1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("link")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); link_collection_editor->link = (GtkComboBox *) gtk_combo_box_new(); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(link_collection_editor->link)); model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "NULL", 1, NULL, -1); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(link_collection_editor->link), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(link_collection_editor->link), cell_renderer, "text", 0, NULL); gtk_combo_box_set_model(link_collection_editor->link, GTK_TREE_MODEL(model)); /* first line */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("first line")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); link_collection_editor->first_line = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(link_collection_editor->first_line)); /* first link line */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 0, 1, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("first link line")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 1, 2, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); link_collection_editor->first_link = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(link_collection_editor->first_link)); /* count */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("count")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(link_collection_editor), GTK_WIDGET(alignment), 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); link_collection_editor->count = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(link_collection_editor->count)); } void ags_link_collection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLinkCollectionEditor *link_collection_editor; link_collection_editor = AGS_LINK_COLLECTION_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: link_collection_editor->channel_type = g_value_get_gtype(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_link_collection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLinkCollectionEditor *link_collection_editor; link_collection_editor = AGS_LINK_COLLECTION_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: g_value_set_gtype(value, link_collection_editor->channel_type); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_link_collection_editor_connect(AgsConnectable *connectable) { AgsLinkCollectionEditor *link_collection_editor; link_collection_editor = AGS_LINK_COLLECTION_EDITOR(connectable); if((AGS_LINK_COLLECTION_EDITOR_CONNECTED & (link_collection_editor->flags)) != 0){ return; } link_collection_editor->flags |= AGS_LINK_COLLECTION_EDITOR_CONNECTED; /* AgsLinkCollectionEditor */ g_signal_connect_after(G_OBJECT(link_collection_editor->link), "changed", G_CALLBACK(ags_link_collection_editor_link_callback), link_collection_editor); g_signal_connect_after(G_OBJECT(link_collection_editor->first_line), "value-changed", G_CALLBACK(ags_link_collection_editor_first_line_callback), link_collection_editor); g_signal_connect_after(G_OBJECT(link_collection_editor->first_link), "value-changed", G_CALLBACK(ags_link_collection_editor_first_link_callback), link_collection_editor); } void ags_link_collection_editor_disconnect(AgsConnectable *connectable) { AgsLinkCollectionEditor *link_collection_editor; link_collection_editor = AGS_LINK_COLLECTION_EDITOR(connectable); if((AGS_LINK_COLLECTION_EDITOR_CONNECTED & (link_collection_editor->flags)) == 0){ return; } link_collection_editor->flags &= (~AGS_LINK_COLLECTION_EDITOR_CONNECTED); /* AgsLinkCollectionEditor */ g_object_disconnect(G_OBJECT(link_collection_editor->link), "any_signal::changed", G_CALLBACK(ags_link_collection_editor_link_callback), link_collection_editor, NULL); g_object_disconnect(G_OBJECT(link_collection_editor->first_line), "any_signal::value-changed", G_CALLBACK(ags_link_collection_editor_first_line_callback), link_collection_editor, NULL); g_object_disconnect(G_OBJECT(link_collection_editor->first_link), "any_signal::value-changed", G_CALLBACK(ags_link_collection_editor_first_link_callback), link_collection_editor, NULL); } void ags_link_collection_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_link_collection_editor_apply(AgsApplicable *applicable) { AgsLinkCollectionEditor *link_collection_editor; GtkTreeIter iter; link_collection_editor = AGS_LINK_COLLECTION_EDITOR(applicable); if(gtk_combo_box_get_active_iter(link_collection_editor->link, &iter)){ AgsWindow *window; AgsMachine *machine, *link_machine; AgsMachineEditor *machine_editor; GtkTreeModel *model; AgsAudio *audio; AgsChannel *start_channel, *start_link; AgsChannel *channel, *next_channel, *nth_channel; AgsChannel *link, *next_link, *nth_link; AgsLinkChannel *link_channel; AgsApplicationContext *application_context; GList *task; guint first_line, count; guint i; machine_editor = AGS_MACHINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(link_collection_editor), AGS_TYPE_MACHINE_EDITOR)); machine = machine_editor->machine; audio = machine->audio; /* get window and application_context */ window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) machine); application_context = ags_application_context_get_instance(); /* get first line */ first_line = (guint) gtk_spin_button_get_value_as_int(link_collection_editor->first_line); if(g_type_is_a(link_collection_editor->channel_type, AGS_TYPE_INPUT)){ g_object_get(audio, "input", &start_channel, NULL); nth_channel = ags_channel_nth(start_channel, first_line); channel = nth_channel; }else{ g_object_get(audio, "output", &start_channel, NULL); nth_channel = ags_channel_nth(start_channel, first_line); channel = nth_channel; } model = gtk_combo_box_get_model(link_collection_editor->link); gtk_tree_model_get(model, &iter, 1, &link_machine, -1); task = NULL; count = (guint) gtk_spin_button_get_value_as_int(link_collection_editor->count); if(link_machine == NULL){ next_channel = NULL; for(i = 0; i < count; i++){ /* create task */ link_channel = ags_link_channel_new(channel, NULL); task = g_list_prepend(task, link_channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* append AgsLinkChannel */ task = g_list_reverse(task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); }else{ guint first_link; first_link = (guint) gtk_spin_button_get_value_as_int(link_collection_editor->first_link); /* get link */ if(g_type_is_a(link_collection_editor->channel_type, AGS_TYPE_INPUT)){ g_object_get(link_machine->audio, "output", &start_link, NULL); }else{ g_object_get(link_machine->audio, "input", &start_link, NULL); } nth_link = ags_channel_nth(start_link, first_link); link = nth_link; next_channel = NULL; next_link = NULL; for(i = 0; i < count; i++){ /* create task */ link_channel = ags_link_channel_new(channel, link); task = g_list_prepend(task, link_channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; next_link = ags_channel_next(link); g_object_unref(link); link = next_link; } task = g_list_reverse(task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); g_object_unref(start_link); if(next_channel != NULL){ g_object_unref(next_channel); } if(next_link != NULL){ g_object_unref(next_link); } } g_object_unref(start_channel); } } void ags_link_collection_editor_reset(AgsApplicable *applicable) { /* empty */ } /** * ags_link_collection_editor_check: * @link_collection_editor: the #AgsLinkCollectionEditor * * Checks for possible channels to link. And modifies its ranges. * * Since: 3.0.0 */ void ags_link_collection_editor_check(AgsLinkCollectionEditor *link_collection_editor) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(link_collection_editor->link, &iter)){ AgsMachine *link_machine; AgsMachineEditor *machine_editor; GtkTreeModel *model; guint first_line, first_line_stop, first_line_range; guint first_link, first_link_stop, first_link_range; guint max; first_line = gtk_spin_button_get_value(link_collection_editor->first_line); machine_editor = AGS_MACHINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(link_collection_editor), AGS_TYPE_MACHINE_EDITOR)); if(link_collection_editor->channel_type == AGS_TYPE_INPUT){ g_object_get(machine_editor->machine->audio, "input-lines", &first_line_stop, NULL); }else{ g_object_get(machine_editor->machine->audio, "output-lines", &first_line_stop, NULL); } /* link machine */ first_link = gtk_spin_button_get_value(link_collection_editor->first_link); model = gtk_combo_box_get_model(link_collection_editor->link); gtk_tree_model_get(model, &iter, 1, &link_machine, -1); first_line_range = first_line_stop - first_line; if(link_machine != NULL){ if(link_collection_editor->channel_type == AGS_TYPE_INPUT){ g_object_get(link_machine->audio, "output-lines", &first_link_stop, NULL); }else{ g_object_get(link_machine->audio, "input-lines", &first_link_stop, NULL); } first_link_range = first_link_stop - first_link; if(first_line_range > first_link_range){ max = first_link_range; }else{ max = first_line_range; } }else{ first_link_stop = 0.0; max = first_line_range; } gtk_spin_button_set_range(link_collection_editor->first_line, 0.0, first_line_stop - 1.0); if(link_machine == NULL){ gtk_spin_button_set_range(link_collection_editor->first_link, 0.0, 0.0); }else{ gtk_spin_button_set_range(link_collection_editor->first_link, 0.0, first_link_stop - 1.0); } gtk_spin_button_set_range(link_collection_editor->count, 0.0, max); }else{ gtk_spin_button_set_range(link_collection_editor->count, -1.0, -1.0); } } /** * ags_link_collection_editor_new: * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * * Create a new instance of #AgsLinkCollectionEditor * * Returns: the new #AgsLinkCollectionEditor * * Since: 3.0.0 */ AgsLinkCollectionEditor* ags_link_collection_editor_new(GType channel_type) { AgsLinkCollectionEditor *link_collection_editor; link_collection_editor = (AgsLinkCollectionEditor *) g_object_new(AGS_TYPE_LINK_COLLECTION_EDITOR, "channel-type", channel_type, NULL); return(link_collection_editor); } gsequencer-3.1.3/ags/X/ags_midi_preferences_callbacks.c0000644000175000017500000000722613607210263020070 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_midi_preferences_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsMidiPreferences *midi_preferences) { AgsPreferences *preferences; if(old_parent != NULL){ return; } preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(midi_preferences), AGS_TYPE_PREFERENCES); midi_preferences->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_end((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(preferences)), (GtkWidget *) midi_preferences->add, TRUE, FALSE, 0); } void ags_midi_preferences_add_callback(GtkWidget *widget, AgsMidiPreferences *midi_preferences) { AgsPreferences *preferences; AgsSequencerEditor *sequencer_editor; AgsSequencerThread *sequencer_thread; AgsThread *main_loop; AgsApplicationContext *application_context; GObject *sequencer; GList *start_list, *list; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(midi_preferences), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* retrieve first sequencer */ sequencer = NULL; list = start_list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ sequencer = list->data; } g_list_free_full(start_list, g_object_unref); /* sequencer editor */ sequencer_editor = ags_sequencer_editor_new(); if(sequencer != NULL){ sequencer_editor->sequencer = sequencer; sequencer_editor->sequencer_thread = (GObject *) ags_thread_find_type(main_loop, AGS_TYPE_SEQUENCER_THREAD); } gtk_box_pack_start((GtkBox *) midi_preferences->sequencer_editor, (GtkWidget *) sequencer_editor, FALSE, FALSE, 0); ags_applicable_reset(AGS_APPLICABLE(sequencer_editor)); ags_connectable_connect(AGS_CONNECTABLE(sequencer_editor)); g_signal_connect(sequencer_editor->remove, "clicked", G_CALLBACK(ags_midi_preferences_remove_sequencer_editor_callback), midi_preferences); gtk_widget_show_all((GtkWidget *) sequencer_editor); g_object_unref(main_loop); } void ags_midi_preferences_remove_sequencer_editor_callback(GtkWidget *button, AgsMidiPreferences *midi_preferences) { AgsSequencerEditor *sequencer_editor; GList *list; GObject *sequencer; sequencer_editor = (AgsSequencerEditor *) gtk_widget_get_ancestor(button, AGS_TYPE_SEQUENCER_EDITOR); if(!AGS_IS_JACK_DEVOUT(sequencer_editor->sequencer)){ ags_sequencer_editor_remove_sequencer(sequencer_editor, sequencer_editor->sequencer); } gtk_widget_destroy((GtkWidget *) sequencer_editor); } gsequencer-3.1.3/ags/X/ags_ladspa_browser.h0000644000175000017500000000540113607210263015573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_BROWSER_H__ #define __AGS_LADSPA_BROWSER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LADSPA_BROWSER (ags_ladspa_browser_get_type()) #define AGS_LADSPA_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_LADSPA_BROWSER, AgsLadspaBrowser)) #define AGS_LADSPA_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_LADSPA_BROWSER, AgsLadspaBrowserClass)) #define AGS_IS_LADSPA_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LADSPA_BROWSER)) #define AGS_IS_LADSPA_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LADSPA_BROWSER)) #define AGS_LADSPA_BROWSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LADSPA_BROWSER, AgsLadspaBrowserClass)) typedef struct _AgsLadspaBrowser AgsLadspaBrowser; typedef struct _AgsLadspaBrowserClass AgsLadspaBrowserClass; typedef enum{ AGS_LADSPA_BROWSER_CONNECTED = 1, }AgsLadspaBrowserFlags; struct _AgsLadspaBrowser { GtkVBox vbox; guint flags; gchar *path; GtkHBox *plugin; GtkComboBox *filename; GtkComboBox *effect; GtkVBox *description; GtkLabel *label; GtkLabel *maker; GtkLabel *copyright; GtkTable *port_table; GtkWidget *preview; }; struct _AgsLadspaBrowserClass { GtkVBoxClass vbox; }; GType ags_ladspa_browser_get_type(void); gchar* ags_ladspa_browser_get_plugin_filename(AgsLadspaBrowser *ladspa_browser); gchar* ags_ladspa_browser_get_plugin_effect(AgsLadspaBrowser *ladspa_browser); GtkWidget* ags_ladspa_browser_combo_box_output_boolean_controls_new(); GtkWidget* ags_ladspa_browser_combo_box_output_controls_new(); GtkWidget* ags_ladspa_browser_combo_box_boolean_controls_new(); GtkWidget* ags_ladspa_browser_combo_box_controls_new(); GtkWidget* ags_ladspa_browser_preview_new(); AgsLadspaBrowser* ags_ladspa_browser_new(); G_END_DECLS #endif /*__AGS_LADSPA_BROWSER_H__*/ gsequencer-3.1.3/ags/X/ags_listing_editor_callbacks.c0000644000175000017500000000443313607210263017601 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_listing_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsListingEditor *listing_editor) { AgsMachineEditor *machine_editor; if(old_parent != NULL) return; machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_MACHINE_EDITOR); if(machine_editor->machine != NULL){ ags_listing_editor_add_children(listing_editor, machine_editor->machine->audio, 0, FALSE); } } void ags_listing_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsListingEditor *listing_editor) { AgsAudio *audio; audio = machine->audio; if(channel_type != listing_editor->channel_type){ return; } if(pads_old < pads){ guint audio_channels; guint nth_channel; /* get some audio fields */ g_object_get(audio, "audio-channels", &audio_channels, NULL); /* add children */ nth_channel = pads_old * audio_channels; ags_listing_editor_add_children(listing_editor, audio, nth_channel, TRUE); }else{ GList *list, *list_next, *list_start; list_start = list = gtk_container_get_children(GTK_CONTAINER(listing_editor->child)); list = g_list_nth(list, pads); while(list != NULL){ list_next = list->next; gtk_widget_destroy(GTK_WIDGET(list->data)); list = list_next; } g_list_free(list_start); } } gsequencer-3.1.3/ags/X/ags_pad_editor.c0000644000175000017500000003242613607210263014700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_pad_editor_class_init(AgsPadEditorClass *pad_editor); void ags_pad_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pad_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_pad_editor_init(AgsPadEditor *pad_editor); void ags_pad_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pad_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pad_editor_finalize(GObject *gobject); void ags_pad_editor_connect(AgsConnectable *connectable); void ags_pad_editor_disconnect(AgsConnectable *connectable); void ags_pad_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_pad_editor_apply(AgsApplicable *applicable); void ags_pad_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_pad_editor * @short_description: A composite widget to edit #AgsChannel * @title: AgsPadEditor * @section_id: * @include: ags/X/ags_pad_editor.h * * #AgsPadEditor is a composite widget to edit #AgsChannel. It should be * packed by an #AgsPadEditor. */ enum{ PROP_0, PROP_CHANNEL, }; static gpointer ags_pad_editor_parent_class = NULL; GType ags_pad_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pad_editor = 0; static const GTypeInfo ags_pad_editor_info = { sizeof (AgsPadEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pad_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPadEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pad_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pad_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_pad_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pad_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsPadEditor", &ags_pad_editor_info, 0); g_type_add_interface_static(ags_type_pad_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_pad_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pad_editor); } return g_define_type_id__volatile; } void ags_pad_editor_class_init(AgsPadEditorClass *pad_editor) { GObjectClass *gobject; GParamSpec *param_spec; ags_pad_editor_parent_class = g_type_class_peek_parent(pad_editor); /* GObjectClass */ gobject = (GObjectClass *) pad_editor; gobject->set_property = ags_pad_editor_set_property; gobject->get_property = ags_pad_editor_get_property; gobject->finalize = ags_pad_editor_finalize; /* properties */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel which this pad editor is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); } void ags_pad_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_pad_editor_connect; connectable->disconnect = ags_pad_editor_disconnect; } void ags_pad_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_pad_editor_set_update; applicable->apply = ags_pad_editor_apply; applicable->reset = ags_pad_editor_reset; } void ags_pad_editor_init(AgsPadEditor *pad_editor) { pad_editor->flags = 0; pad_editor->version = AGS_PAD_EDITOR_DEFAULT_VERSION; pad_editor->build_id = AGS_PAD_EDITOR_DEFAULT_BUILD_ID; pad_editor->pad = NULL; pad_editor->line_editor_expander = (GtkExpander *) gtk_expander_new(NULL); gtk_box_pack_start(GTK_BOX(pad_editor), GTK_WIDGET(pad_editor->line_editor_expander), FALSE, FALSE, 0); pad_editor->line_editor = NULL; } void ags_pad_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPadEditor *pad_editor; pad_editor = AGS_PAD_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); ags_pad_editor_set_channel(pad_editor, channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pad_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPadEditor *pad_editor; pad_editor = AGS_PAD_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL: g_value_set_object(value, pad_editor->pad); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pad_editor_finalize(GObject *gobject) { AgsPadEditor *pad_editor; pad_editor = (AgsPadEditor *) gobject; if(pad_editor->pad != NULL){ g_object_unref(pad_editor->pad); } /* call parent */ G_OBJECT_CLASS(ags_pad_editor_parent_class)->finalize(gobject); } void ags_pad_editor_connect(AgsConnectable *connectable) { AgsMachine *machine; AgsMachineEditor *machine_editor; AgsConnectionEditor *connection_editor; AgsPadEditor *pad_editor; GList *line_editor, *line_editor_start; pad_editor = AGS_PAD_EDITOR(connectable); if((AGS_PAD_EDITOR_CONNECTED & (pad_editor->flags)) != 0){ return; } pad_editor->flags |= AGS_PAD_EDITOR_CONNECTED; machine = NULL; machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor(GTK_WIDGET(pad_editor), AGS_TYPE_MACHINE_EDITOR); connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(GTK_WIDGET(pad_editor), AGS_TYPE_CONNECTION_EDITOR); if(machine_editor != NULL){ machine = machine_editor->machine; }else if(connection_editor != NULL){ machine = connection_editor->machine; } /* */ if(machine != NULL){ g_signal_connect_after(G_OBJECT(machine), "resize-audio-channels", G_CALLBACK(ags_pad_editor_resize_audio_channels_callback), pad_editor); } /* AgsLineEditor */ line_editor_start = line_editor = gtk_container_get_children(GTK_CONTAINER(pad_editor->line_editor)); while(line_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->data)); line_editor = line_editor->next; } g_list_free(line_editor_start); } void ags_pad_editor_disconnect(AgsConnectable *connectable) { AgsMachine *machine; AgsMachineEditor *machine_editor; AgsConnectionEditor *connection_editor; AgsPadEditor *pad_editor; GList *line_editor, *line_editor_start; pad_editor = AGS_PAD_EDITOR(connectable); if((AGS_PAD_EDITOR_CONNECTED & (pad_editor->flags)) == 0){ return; } pad_editor->flags &= (~AGS_PAD_EDITOR_CONNECTED); machine = NULL; machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor(GTK_WIDGET(pad_editor), AGS_TYPE_MACHINE_EDITOR); connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(GTK_WIDGET(pad_editor), AGS_TYPE_CONNECTION_EDITOR); if(machine_editor != NULL){ machine = machine_editor->machine; }else if(connection_editor != NULL){ machine = connection_editor->machine; } /* */ if(machine != NULL){ g_object_disconnect(G_OBJECT(machine), "any_signal::resize-audio-channels", G_CALLBACK(ags_pad_editor_resize_audio_channels_callback), pad_editor, NULL); } /* AgsLineEditor */ line_editor_start = line_editor = gtk_container_get_children(GTK_CONTAINER(pad_editor->line_editor)); while(line_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(line_editor->data)); line_editor = line_editor->next; } g_list_free(line_editor_start); } void ags_pad_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsPadEditor *pad_editor; GList *line_editor, *line_editor_start; pad_editor = AGS_PAD_EDITOR(applicable); line_editor_start = line_editor = gtk_container_get_children(GTK_CONTAINER(pad_editor->line_editor)); while(line_editor != NULL){ ags_applicable_set_update(AGS_APPLICABLE(line_editor->data), update); line_editor = line_editor->next; } g_list_free(line_editor_start); } void ags_pad_editor_apply(AgsApplicable *applicable) { AgsPadEditor *pad_editor; GList *line_editor, *line_editor_start; pad_editor = AGS_PAD_EDITOR(applicable); line_editor_start = line_editor = gtk_container_get_children(GTK_CONTAINER(pad_editor->line_editor)); while(line_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(line_editor->data)); line_editor = line_editor->next; } g_list_free(line_editor_start); } void ags_pad_editor_reset(AgsApplicable *applicable) { AgsPadEditor *pad_editor; GList *line_editor, *line_editor_start; pad_editor = AGS_PAD_EDITOR(applicable); line_editor_start = line_editor = gtk_container_get_children(GTK_CONTAINER(pad_editor->line_editor)); while(line_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(line_editor->data)); line_editor = line_editor->next; } g_list_free(line_editor_start); } /** * ags_pad_editor_set_channel: * @pad_editor: an #AgsPadEditor * @channel: the new #AgsChannel * * Is called as channel gets modified. * * Since: 3.0.0 */ void ags_pad_editor_set_channel(AgsPadEditor *pad_editor, AgsChannel *start_channel) { GtkVBox *vbox; if(pad_editor->line_editor != NULL){ vbox = pad_editor->line_editor; pad_editor->line_editor = NULL; gtk_widget_destroy(GTK_WIDGET(vbox)); } if(pad_editor->pad != start_channel){ if(pad_editor->pad != NULL){ g_object_unref(pad_editor->pad); } if(start_channel != NULL){ g_object_ref(start_channel); } pad_editor->pad = start_channel; } if(start_channel != NULL){ AgsLineEditor *line_editor; AgsChannel *channel; AgsChannel *next_pad, *next_channel; gchar *str; guint pad; guint i; /* get some channel fields */ pad = 0; g_object_get(start_channel, "pad", &pad, NULL); /* set label */ str = g_strdup_printf("%s: %u", i18n("pad"), pad + 1); gtk_expander_set_label(pad_editor->line_editor_expander, str); g_free(str); pad_editor->line_editor = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(pad_editor->line_editor_expander), GTK_WIDGET(pad_editor->line_editor)); channel = start_channel; next_pad = NULL; if(channel != NULL){ g_object_ref(channel); next_pad = ags_channel_next_pad(start_channel); } next_channel = NULL; while(channel != next_pad){ /* instantiate line editor */ line_editor = ags_line_editor_new(NULL); line_editor->editor_type_count = pad_editor->editor_type_count; line_editor->editor_type = (GType *) malloc(line_editor->editor_type_count * sizeof(GType)); for(i = 0; i < line_editor->editor_type_count; i++){ line_editor->editor_type[i] = pad_editor->editor_type[i]; } g_object_set(line_editor, "channel", channel, NULL); gtk_box_pack_start(GTK_BOX(pad_editor->line_editor), GTK_WIDGET(line_editor), FALSE, FALSE, 0); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(channel != NULL){ g_object_unref(channel); } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ gtk_expander_set_label(pad_editor->line_editor_expander, NULL); } } /** * ags_pad_editor_new: * @channel: the #AgsChannel to edit * * Create a new instance of #AgsPadEditor * * Returns: the new #AgsPadEditor * * Since: 3.0.0 */ AgsPadEditor* ags_pad_editor_new(AgsChannel *channel) { AgsPadEditor *pad_editor; pad_editor = (AgsPadEditor *) g_object_new(AGS_TYPE_PAD_EDITOR, "channel", channel, NULL); return(pad_editor); } gsequencer-3.1.3/ags/X/ags_performance_preferences_callbacks.c0000644000175000017500000000261013605312646021445 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_performance_preferences_super_threaded_channel_callback(GtkWidget *button, AgsPerformancePreferences *performance_preferences) { if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ gtk_toggle_button_set_active((GtkToggleButton *) performance_preferences->super_threaded_audio, TRUE); gtk_widget_set_sensitive((GtkWidget *) performance_preferences->super_threaded_audio, FALSE); }else{ gtk_widget_set_sensitive((GtkWidget *) performance_preferences->super_threaded_audio, TRUE); } } gsequencer-3.1.3/ags/X/ags_sheet_editor_callbacks.c0000644000175000017500000000441313605312646017244 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_sheet_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsSheetEditor *sheet_editor) { ags_sheet_editor_machine_changed(sheet_editor, machine); } void ags_sheet_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsSheetEditor *sheet_editor) { guint i; if(audio_channels > audio_channels_old){ GList *tab; for(i = audio_channels_old; i < audio_channels; i++){ ags_notebook_insert_tab(sheet_editor->notebook, i); tab = sheet_editor->notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } }else{ /* shrink notebook */ for(i = audio_channels; i < audio_channels_old; i++){ ags_notebook_remove_tab(sheet_editor->notebook, audio_channels); } } } void ags_sheet_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsSheetEditor *sheet_editor) { AgsAudio *audio; audio = machine->audio; /* verify pads */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ if(!g_type_is_a(channel_type, AGS_TYPE_INPUT)){ return; } }else{ if(!g_type_is_a(channel_type, AGS_TYPE_OUTPUT)){ return; } } //TODO:JK: implement me } gsequencer-3.1.3/ags/X/ags_property_collection_editor.c0000644000175000017500000002057113607210263020231 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_property_collection_editor_class_init(AgsPropertyCollectionEditorClass *property_collection_editor); void ags_property_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_property_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_property_collection_editor_init(AgsPropertyCollectionEditor *property_collection_editor); void ags_property_collection_editor_connect(AgsConnectable *connectable); void ags_property_collection_editor_disconnect(AgsConnectable *connectable); void ags_property_collection_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_property_collection_editor_apply(AgsApplicable *applicable); void ags_property_collection_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_property_collection_editor * @short_description: Edit propertys in bulk mode. * @title: AgsPropertyCollectionEditor * @section_id: * @include: ags/X/ags_property_collection_editor.h * * #AgsPropertyCollectionEditor is a composite widget to modify propertys in bulk mode. A property collection * editor should be packed by a #AgsMachineEditor. */ AgsConnectableInterface *ags_property_collection_editor_parent_connectable_interface; GType ags_property_collection_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_property_collection_editor = 0; static const GTypeInfo ags_property_collection_editor_info = { sizeof (AgsPropertyCollectionEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_property_collection_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPropertyCollectionEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_property_collection_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_property_collection_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_property_collection_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_property_collection_editor = g_type_register_static(AGS_TYPE_PROPERTY_EDITOR, "AgsPropertyCollectionEditor", &ags_property_collection_editor_info, 0); g_type_add_interface_static(ags_type_property_collection_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_property_collection_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_property_collection_editor); } return g_define_type_id__volatile; } void ags_property_collection_editor_class_init(AgsPropertyCollectionEditorClass *property_collection_editor) { } void ags_property_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable) { ags_property_collection_editor_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_property_collection_editor_connect; connectable->disconnect = ags_property_collection_editor_disconnect; } void ags_property_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_property_collection_editor_set_update; applicable->apply = ags_property_collection_editor_apply; applicable->reset = ags_property_collection_editor_reset; } void ags_property_collection_editor_init(AgsPropertyCollectionEditor *property_collection_editor) { GtkAlignment *alignment; property_collection_editor->flags = 0; property_collection_editor->child = (GtkVBox *) gtk_vbox_new(FALSE, 16); gtk_box_pack_start(GTK_BOX(property_collection_editor), GTK_WIDGET(property_collection_editor->child), TRUE, TRUE, 0); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.0, 0.0, 0.0); gtk_box_pack_start(GTK_BOX(property_collection_editor), GTK_WIDGET(alignment), FALSE, FALSE, 0); property_collection_editor->add_collection = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(property_collection_editor->add_collection)); } void ags_property_collection_editor_connect(AgsConnectable *connectable) { AgsPropertyCollectionEditor *property_collection_editor; if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(connectable)->flags)) != 0){ return; } /* call parent */ ags_property_collection_editor_parent_connectable_interface->connect(connectable); /* AgsPropertyCollectionEditor */ property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(connectable); g_signal_connect(G_OBJECT(property_collection_editor->add_collection), "clicked", G_CALLBACK(ags_property_collection_editor_add_collection_callback), property_collection_editor); } void ags_property_collection_editor_disconnect(AgsConnectable *connectable) { AgsPropertyCollectionEditor *property_collection_editor; if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(connectable)->flags)) == 0){ return; } /* AgsPropertyCollectionEditor */ property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(connectable); g_object_disconnect(G_OBJECT(property_collection_editor->add_collection), "any_signal::clicked", G_CALLBACK(ags_property_collection_editor_add_collection_callback), property_collection_editor, NULL); /* call parent */ ags_property_collection_editor_parent_connectable_interface->disconnect(connectable); } void ags_property_collection_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_property_collection_editor_apply(AgsApplicable *applicable) { AgsPropertyCollectionEditor *property_collection_editor; GtkWidget *child; GList *list, *list_start; property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(applicable); if((AGS_PROPERTY_EDITOR_ENABLED & (AGS_PROPERTY_EDITOR(property_collection_editor)->flags)) == 0){ return; } list_start = list = gtk_container_get_children(GTK_CONTAINER(property_collection_editor->child)); while(list != NULL){ child = GTK_WIDGET(g_object_get_data(G_OBJECT(list->data), "AgsChild")); ags_applicable_apply(AGS_APPLICABLE(child)); list = list->next; } g_list_free(list_start); } void ags_property_collection_editor_reset(AgsApplicable *applicable) { /* empty */ } /** * ags_property_collection_editor_new: * @child_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * @child_parameter_count: child parameter count * @child_parameter: child parameter * * Creates an #AgsPropertyCollectionEditor * * Returns: a new #AgsPropertyCollectionEditor * * Since: 3.0.0 */ AgsPropertyCollectionEditor* ags_property_collection_editor_new(GType child_type, guint child_parameter_count, GParameter *child_parameter) { AgsPropertyCollectionEditor *property_collection_editor; property_collection_editor = (AgsPropertyCollectionEditor *) g_object_new(AGS_TYPE_PROPERTY_COLLECTION_EDITOR, NULL); property_collection_editor->child_type = child_type; property_collection_editor->child_parameter_count = child_parameter_count; property_collection_editor->child_parameter = child_parameter; return(property_collection_editor); } gsequencer-3.1.3/ags/X/ags_line_editor.h0000644000175000017500000000515213607210263015064 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_EDITOR_H__ #define __AGS_LINE_EDITOR_H__ #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINE_EDITOR (ags_line_editor_get_type()) #define AGS_LINE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LINE_EDITOR, AgsLineEditor)) #define AGS_LINE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LINE_EDITOR, AgsLineEditorClass)) #define AGS_IS_LINE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LINE_EDITOR)) #define AGS_IS_LINE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LINE_EDITOR)) #define AGS_LINE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LINE_EDITOR, AgsLineEditorClass)) #define AGS_LINE_EDITOR_DEFAULT_VERSION "0.4.2" #define AGS_LINE_EDITOR_DEFAULT_BUILD_ID "CEST 02-10-2014 19:36" typedef struct _AgsLineEditor AgsLineEditor; typedef struct _AgsLineEditorClass AgsLineEditorClass; typedef enum{ AGS_LINE_EDITOR_CONNECTED = 1, }AgsLineEditorFlags; struct _AgsLineEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; AgsChannel *channel; guint editor_type_count; GType *editor_type; AgsLinkEditor *link_editor; AgsOutputEditor *output_editor; AgsInputEditor *input_editor; AgsLineMemberEditor *member_editor; }; struct _AgsLineEditorClass { GtkVBoxClass vbox; }; GType ags_line_editor_get_type(void); void ags_line_editor_set_channel(AgsLineEditor *line_editor, AgsChannel *channel); AgsLineEditor* ags_line_editor_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_LINE_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_lv2_browser.h0000644000175000017500000000506313607210263015036 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_BROWSER_H__ #define __AGS_LV2_BROWSER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_BROWSER (ags_lv2_browser_get_type()) #define AGS_LV2_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_LV2_BROWSER, AgsLv2Browser)) #define AGS_LV2_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_LV2_BROWSER, AgsLv2BrowserClass)) #define AGS_IS_LV2_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_BROWSER)) #define AGS_IS_LV2_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_BROWSER)) #define AGS_LV2_BROWSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_BROWSER, AgsLv2BrowserClass)) typedef struct _AgsLv2Browser AgsLv2Browser; typedef struct _AgsLv2BrowserClass AgsLv2BrowserClass; typedef enum{ AGS_LV2_BROWSER_CONNECTED = 1, }AgsLv2BrowserFlags; struct _AgsLv2Browser { GtkVBox vbox; guint flags; gchar *path; GtkHBox *plugin; GtkComboBox *filename; GtkComboBox *effect; GtkVBox *description; GtkWidget *preview; }; struct _AgsLv2BrowserClass { GtkVBoxClass vbox; }; GType ags_lv2_browser_get_type(void); gchar* ags_lv2_browser_get_plugin_filename(AgsLv2Browser *lv2_browser); gchar* ags_lv2_browser_get_plugin_effect(AgsLv2Browser *lv2_browser); GtkWidget* ags_lv2_browser_combo_box_output_boolean_controls_new(); GtkWidget* ags_lv2_browser_combo_box_output_controls_new(); GtkWidget* ags_lv2_browser_combo_box_boolean_controls_new(); GtkWidget* ags_lv2_browser_combo_box_controls_new(); GtkWidget* ags_lv2_browser_preview_new(); AgsLv2Browser* ags_lv2_browser_new(); G_END_DECLS #endif /*__AGS_LV2_BROWSER_H__*/ gsequencer-3.1.3/ags/X/ags_menu_bar.h0000644000175000017500000000456713607210263014370 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MENU_BAR_H__ #define __AGS_MENU_BAR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MENU_BAR (ags_menu_bar_get_type ()) #define AGS_MENU_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MENU_BAR, AgsMenuBar)) #define AGS_MENU_BAR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MENU_BAR, AgsMenuBarClass)) #define AGS_IS_MENU_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MENU_BAR)) #define AGS_IS_MENU_BAR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MENU_BAR)) #define AGS_MENU_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MENU_BAR, AgsMenuBarClass)) typedef struct _AgsMenuBar AgsMenuBar; typedef struct _AgsMenuBarClass AgsMenuBarClass; typedef enum{ AGS_MENU_BAR_CONNECTED = 1, }AgsMenuBarFlags; struct _AgsMenuBar { GtkMenuBar menu_bar; guint flags; GtkMenu *file; GtkMenu *edit; GtkMenu *add; GtkMenu *live; GtkMenu *midi; GtkMenu *help; }; struct _AgsMenuBarClass { GtkMenuBarClass menu_bar; }; GType ags_menu_bar_get_type(void); GtkMenu* ags_zoom_menu_new(); GtkMenu* ags_tact_menu_new(); GtkComboBox* ags_zoom_combo_box_new(); GtkComboBox* ags_tact_combo_box_new(); GtkMenu* ags_ladspa_bridge_menu_new(); GtkMenu* ags_dssi_bridge_menu_new(); GtkMenu* ags_lv2_bridge_menu_new(); GtkMenu* ags_live_dssi_bridge_menu_new(); GtkMenu* ags_live_lv2_bridge_menu_new(); AgsMenuBar* ags_menu_bar_new(); G_END_DECLS #endif /*__AGS_MENU_BAR_H__*/ gsequencer-3.1.3/ags/X/import/0000755000175000017500000000000013622252261013154 500000000000000gsequencer-3.1.3/ags/X/import/ags_track_collection_mapper_callbacks.c0000644000175000017500000000150213605312646022757 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/import/ags_track_collection_callbacks.c0000644000175000017500000000147413605312646021423 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/import/ags_track_collection_callbacks.h0000644000175000017500000000212213607210263021411 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TRACK_COLLECTION_CALLBACKS_H__ #define __AGS_TRACK_COLLECTION_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_TRACK_COLLECTION_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/import/ags_midi_import_wizard.c0000644000175000017500000002632213607210263017772 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_midi_import_wizard_class_init(AgsMidiImportWizardClass *midi_import_wizard); void ags_midi_import_wizard_connectable_interface_init(AgsConnectableInterface *connectable); void ags_midi_import_wizard_applicable_interface_init(AgsApplicableInterface *applicable); void ags_midi_import_wizard_init(AgsMidiImportWizard *midi_import_wizard); void ags_midi_import_wizard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_import_wizard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_import_wizard_connect(AgsConnectable *connectable); void ags_midi_import_wizard_disconnect(AgsConnectable *connectable); void ags_midi_import_wizard_set_update(AgsApplicable *applicable, gboolean update); void ags_midi_import_wizard_apply(AgsApplicable *applicable); void ags_midi_import_wizard_reset(AgsApplicable *applicable); gboolean ags_midi_import_wizard_delete_event(GtkWidget *widget, GdkEventAny *event); void ags_midi_import_wizard_show(GtkWidget *widget); /** * SECTION:ags_midi_import_wizard * @short_description: Import MIDI using wizard * @title: AgsMidiImportWizard * @section_id: * @include: ags/X/ags_midi_import_wizard.h * * #AgsMidiImportWizard is a wizard to import midi files and do track mapping. */ static gpointer ags_midi_import_wizard_parent_class = NULL; enum{ PROP_0, PROP_MAIN_WINDOW, }; GType ags_midi_import_wizard_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_import_wizard = 0; static const GTypeInfo ags_midi_import_wizard_info = { sizeof (AgsMidiImportWizardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_import_wizard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiImportWizard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_import_wizard_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_midi_import_wizard_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_midi_import_wizard_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_midi_import_wizard = g_type_register_static(GTK_TYPE_DIALOG, "AgsMidiImportWizard", &ags_midi_import_wizard_info, 0); g_type_add_interface_static(ags_type_midi_import_wizard, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_midi_import_wizard, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_import_wizard); } return g_define_type_id__volatile; } void ags_midi_import_wizard_class_init(AgsMidiImportWizardClass *midi_import_wizard) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_midi_import_wizard_parent_class = g_type_class_peek_parent(midi_import_wizard); /* GObjectClass */ gobject = (GObjectClass *) midi_import_wizard; /* GtkWidgetClass */ widget = (GtkWidgetClass *) midi_import_wizard; gobject->set_property = ags_midi_import_wizard_set_property; gobject->get_property = ags_midi_import_wizard_get_property; /* properties */ /** * AgsMidiImportWizard:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidget */ widget->delete_event = ags_midi_import_wizard_delete_event; widget->show = ags_midi_import_wizard_show; } void ags_midi_import_wizard_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_midi_import_wizard_connect; connectable->disconnect = ags_midi_import_wizard_disconnect; } void ags_midi_import_wizard_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_midi_import_wizard_set_update; applicable->apply = ags_midi_import_wizard_apply; applicable->reset = ags_midi_import_wizard_reset; } void ags_midi_import_wizard_init(AgsMidiImportWizard *midi_import_wizard) { GtkAlignment *alignment; midi_import_wizard->flags = AGS_MIDI_IMPORT_WIZARD_SHOW_FILE_CHOOSER; midi_import_wizard->main_window = NULL; /* file chooser */ alignment = g_object_new(GTK_TYPE_ALIGNMENT, NULL); gtk_widget_set_no_show_all((GtkWidget *) alignment, TRUE); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(midi_import_wizard), (GtkWidget*) alignment, TRUE, TRUE, 0); midi_import_wizard->file_chooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN); gtk_container_add((GtkContainer *) alignment, midi_import_wizard->file_chooser); /* track collection */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.0, 1.0, 1.0); gtk_widget_set_no_show_all((GtkWidget *) alignment, TRUE); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(midi_import_wizard), (GtkWidget*) alignment, TRUE, TRUE, 0); midi_import_wizard->track_collection = (GtkWidget *) ags_track_collection_new(AGS_TYPE_TRACK_COLLECTION_MAPPER, 0, NULL); gtk_container_add((GtkContainer *) alignment, midi_import_wizard->track_collection); gtk_dialog_add_buttons((GtkDialog *) midi_import_wizard, GTK_STOCK_GO_BACK, GTK_RESPONSE_REJECT, GTK_STOCK_GO_FORWARD, GTK_RESPONSE_ACCEPT, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_midi_import_wizard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) midi_import_wizard->main_window == main_window){ return; } if(midi_import_wizard->main_window != NULL){ g_object_unref(midi_import_wizard->main_window); } if(main_window != NULL){ g_object_ref(main_window); } midi_import_wizard->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_import_wizard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, midi_import_wizard->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_import_wizard_connect(AgsConnectable *connectable) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(connectable); if((AGS_MIDI_IMPORT_WIZARD_CONNECTED & (midi_import_wizard->flags)) != 0){ return; } midi_import_wizard->flags |= AGS_MIDI_IMPORT_WIZARD_CONNECTED; g_signal_connect(midi_import_wizard, "response", G_CALLBACK(ags_midi_import_wizard_response_callback), NULL); ags_connectable_connect(AGS_CONNECTABLE(midi_import_wizard->track_collection)); } void ags_midi_import_wizard_disconnect(AgsConnectable *connectable) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(connectable); if((AGS_MIDI_IMPORT_WIZARD_CONNECTED & (midi_import_wizard->flags)) == 0){ return; } midi_import_wizard->flags &= (~AGS_MIDI_IMPORT_WIZARD_CONNECTED); ags_connectable_disconnect(AGS_CONNECTABLE(midi_import_wizard->track_collection)); } void ags_midi_import_wizard_set_update(AgsApplicable *applicable, gboolean update) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(applicable); ags_applicable_set_update(AGS_APPLICABLE(midi_import_wizard->track_collection), update); } void ags_midi_import_wizard_apply(AgsApplicable *applicable) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(applicable); ags_applicable_apply(AGS_APPLICABLE(midi_import_wizard->track_collection)); } void ags_midi_import_wizard_reset(AgsApplicable *applicable) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(applicable); ags_applicable_reset(AGS_APPLICABLE(midi_import_wizard->track_collection)); } gboolean ags_midi_import_wizard_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); return(TRUE); } void ags_midi_import_wizard_show(GtkWidget *widget) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = AGS_MIDI_IMPORT_WIZARD(widget); GTK_WIDGET_CLASS(ags_midi_import_wizard_parent_class)->show(widget); if((AGS_MIDI_IMPORT_WIZARD_SHOW_FILE_CHOOSER & (midi_import_wizard->flags)) != 0){ gtk_widget_show(gtk_widget_get_parent(midi_import_wizard->file_chooser)); gtk_widget_show_all(midi_import_wizard->file_chooser); } if((AGS_MIDI_IMPORT_WIZARD_SHOW_TRACK_COLLECTION & (midi_import_wizard->flags)) != 0){ gtk_widget_show(gtk_widget_get_parent(midi_import_wizard->track_collection)); gtk_widget_show_all(midi_import_wizard->track_collection); } } /** * ags_midi_import_wizard_new: * * Create a new instance of #AgsMidiImportWizard * * Returns: the new #AgsMidiImportWizard * * Since: 3.0.0 */ AgsMidiImportWizard* ags_midi_import_wizard_new() { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = (AgsMidiImportWizard *) g_object_new(AGS_TYPE_MIDI_IMPORT_WIZARD, NULL); return(midi_import_wizard); } gsequencer-3.1.3/ags/X/import/ags_track_collection_mapper.h0000644000175000017500000000541213607210263020763 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TRACK_COLLECTION_MAPPER_H__ #define __AGS_TRACK_COLLECTION_MAPPER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TRACK_COLLECTION_MAPPER (ags_track_collection_mapper_get_type()) #define AGS_TRACK_COLLECTION_MAPPER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TRACK_COLLECTION_MAPPER, AgsTrackCollectionMapper)) #define AGS_TRACK_COLLECTION_MAPPER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TRACK_COLLECTION_MAPPER, AgsTrackCollectionMapperClass)) #define AGS_IS_TRACK_COLLECTION_MAPPER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TRACK_COLLECTION_MAPPER)) #define AGS_IS_TRACK_COLLECTION_MAPPER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TRACK_COLLECTION_MAPPER)) #define AGS_TRACK_COLLECTION_MAPPER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_TRACK_COLLECTION_MAPPER, AgsTrackCollectionMapperClass)) #define AGS_TRACK_COLLECTION_MAPPER_DEFAULT_BEATS (16.0) #define AGS_MIDI_DEFAULT_BEATS (4.0) typedef struct _AgsTrackCollectionMapper AgsTrackCollectionMapper; typedef struct _AgsTrackCollectionMapperClass AgsTrackCollectionMapperClass; struct _AgsTrackCollectionMapper { GtkTable table; gchar *instrument; gchar *sequence; GList *track; GList *notation; GtkCheckButton *enabled; GtkVBox *info; GtkComboBoxText *machine_type; GtkSpinButton *audio_channels; GtkSpinButton *offset; }; struct _AgsTrackCollectionMapperClass { GtkTableClass table; }; GType ags_track_collection_mapper_get_type(void); GList* ags_track_collection_mapper_find_instrument_with_sequence(GList *track_collection_mapper, gchar *instrument, gchar *sequence); void ags_track_collection_mapper_map(AgsTrackCollectionMapper *track_collection_mapper); AgsTrackCollectionMapper* ags_track_collection_mapper_new(); G_END_DECLS #endif /*__AGS_TRACK_COLLECTION_MAPPER_H__*/ gsequencer-3.1.3/ags/X/import/ags_midi_import_wizard.h0000644000175000017500000000463613607210263020003 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_IMPORT_WIZARD_H__ #define __AGS_MIDI_IMPORT_WIZARD_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_IMPORT_WIZARD (ags_midi_import_wizard_get_type()) #define AGS_MIDI_IMPORT_WIZARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_IMPORT_WIZARD, AgsMidiImportWizard)) #define AGS_MIDI_IMPORT_WIZARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_IMPORT_WIZARD, AgsMidiImportWizardClass)) #define AGS_IS_MIDI_IMPORT_WIZARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDI_IMPORT_WIZARD)) #define AGS_IS_MIDI_IMPORT_WIZARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDI_IMPORT_WIZARD)) #define AGS_MIDI_IMPORT_WIZARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MIDI_IMPORT_WIZARD, AgsMidiImportWizardClass)) typedef struct _AgsMidiImportWizard AgsMidiImportWizard; typedef struct _AgsMidiImportWizardClass AgsMidiImportWizardClass; typedef enum{ AGS_MIDI_IMPORT_WIZARD_CONNECTED = 1, AGS_MIDI_IMPORT_WIZARD_SHOW_FILE_CHOOSER = 1 << 1, AGS_MIDI_IMPORT_WIZARD_SHOW_TRACK_COLLECTION = 1 << 2, }AgsMidiImportWizardFlags; struct _AgsMidiImportWizard { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkWidget *file_chooser; GtkWidget *track_collection; }; struct _AgsMidiImportWizardClass { GtkDialogClass dialog; }; GType ags_midi_import_wizard_get_type(void); AgsMidiImportWizard* ags_midi_import_wizard_new(); G_END_DECLS #endif /*__AGS_MIDI_IMPORT_WIZARD_H__*/ gsequencer-3.1.3/ags/X/import/ags_track_collection_mapper.c0000644000175000017500000005423613607210263020766 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include void ags_track_collection_mapper_class_init(AgsTrackCollectionMapperClass *track_collection_mapper); void ags_track_collection_mapper_connectable_interface_init(AgsConnectableInterface *connectable); void ags_track_collection_mapper_applicable_interface_init(AgsApplicableInterface *applicable); void ags_track_collection_mapper_init(AgsTrackCollectionMapper *track_collection_mapper); void ags_track_collection_mapper_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_track_collection_mapper_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_track_collection_mapper_connect(AgsConnectable *connectable); void ags_track_collection_mapper_disconnect(AgsConnectable *connectable); void ags_track_collection_mapper_set_update(AgsApplicable *applicable, gboolean update); void ags_track_collection_mapper_apply(AgsApplicable *applicable); void ags_track_collection_mapper_reset(AgsApplicable *applicable); /** * SECTION:ags_track_collection_mapper * @short_description: pack pad editors. * @title: AgsTrackCollectionMapper * @section_id: * @include: ags/X/ags_track_collection_mapper.h * * #AgsTrackCollectionMapper is a wizard to import midi files and do track mapping.. */ enum{ PROP_0, PROP_TRACK, PROP_INSTRUMENT, PROP_SEQUENCE, }; GType ags_track_collection_mapper_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_track_collection_mapper = 0; static const GTypeInfo ags_track_collection_mapper_info = { sizeof (AgsTrackCollectionMapperClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_track_collection_mapper_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTrackCollectionMapper), 0, /* n_preallocs */ (GInstanceInitFunc) ags_track_collection_mapper_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_track_collection_mapper_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_track_collection_mapper_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_track_collection_mapper = g_type_register_static(GTK_TYPE_TABLE, "AgsTrackCollectionMapper", &ags_track_collection_mapper_info, 0); g_type_add_interface_static(ags_type_track_collection_mapper, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_track_collection_mapper, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_track_collection_mapper); } return g_define_type_id__volatile; } void ags_track_collection_mapper_class_init(AgsTrackCollectionMapperClass *track_collection_mapper) { GObjectClass *gobject; GParamSpec *param_spec; /* GObjectClass */ gobject = (GObjectClass *) track_collection_mapper; gobject->set_property = ags_track_collection_mapper_set_property; gobject->get_property = ags_track_collection_mapper_get_property; /* properties */ /** * AgsTrackCollectionMapper:track: * * The tracks as xmlNode to parse. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("track", i18n_pspec("assigned track"), i18n_pspec("The track which this track mapper is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TRACK, param_spec); /** * AgsTrackCollectionMapper:instrument: * * The instruments as string to parse. * * Since: 3.0.0 */ param_spec = g_param_spec_string("instrument", i18n_pspec("assigned instrument"), i18n_pspec("The instrument which this track mapper is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INSTRUMENT, param_spec); /** * AgsTrackCollectionMapper:sequence: * * The sequences as string to parse. * * Since: 3.0.0 */ param_spec = g_param_spec_string("sequence", i18n_pspec("assigned sequence"), i18n_pspec("The sequence which this track mapper is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCE, param_spec); } void ags_track_collection_mapper_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_track_collection_mapper_connect; connectable->disconnect = ags_track_collection_mapper_disconnect; } void ags_track_collection_mapper_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_track_collection_mapper_set_update; applicable->apply = ags_track_collection_mapper_apply; applicable->reset = ags_track_collection_mapper_reset; } void ags_track_collection_mapper_init(AgsTrackCollectionMapper *track_collection_mapper) { GtkLabel *label; gtk_table_resize((GtkTable *) track_collection_mapper, 3, 4); track_collection_mapper->instrument = NULL; track_collection_mapper->sequence = NULL; track_collection_mapper->track = NULL; track_collection_mapper->notation = NULL; /* enabled */ track_collection_mapper->enabled = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("enabled")); gtk_table_attach((GtkTable *) track_collection_mapper, (GtkWidget *) track_collection_mapper->enabled, 0, 4, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* info box */ track_collection_mapper->info = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach((GtkTable *) track_collection_mapper, (GtkWidget *) track_collection_mapper->info, 0, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* instrument */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("instrument: "), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(track_collection_mapper->info), GTK_WIDGET(label), TRUE, TRUE, 0); /* sequence */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("sequence: "), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(track_collection_mapper->info), GTK_WIDGET(label), TRUE, TRUE, 0); /* machine type */ track_collection_mapper->machine_type = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach((GtkTable *) track_collection_mapper, (GtkWidget *) track_collection_mapper->machine_type, 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* audio channels */ track_collection_mapper->audio_channels = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 16.0, 1.0); gtk_spin_button_set_value(track_collection_mapper->audio_channels, 2.0); gtk_table_attach((GtkTable *) track_collection_mapper, (GtkWidget *) track_collection_mapper->audio_channels, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* offset */ track_collection_mapper->offset = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, (gdouble) AGS_NOTATION_EDITOR_MAX_CONTROLS, 1.0); gtk_table_attach((GtkTable *) track_collection_mapper, (GtkWidget *) track_collection_mapper->offset, 3, 4, 2, 3, GTK_FILL, GTK_FILL, 0, 0); } void ags_track_collection_mapper_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTrackCollectionMapper *track_collection_mapper; track_collection_mapper = AGS_TRACK_COLLECTION_MAPPER(gobject); switch(prop_id){ case PROP_TRACK: { xmlNode *track; track = (xmlNode *) g_value_get_pointer(value); if(g_list_find(track_collection_mapper->track, track) != NULL){ return; } track_collection_mapper->track = g_list_prepend(track_collection_mapper->track, track); } break; case PROP_INSTRUMENT: { GList *list, *list_start; gchar *str; gchar *instrument; instrument = g_value_get_string(value); if(instrument == track_collection_mapper->instrument){ return; } if(track_collection_mapper->instrument != NULL){ g_free(track_collection_mapper->instrument); } track_collection_mapper->instrument = g_strdup(instrument); list_start = list = gtk_container_get_children((GtkContainer *) track_collection_mapper->info); str = g_strdup_printf("%s: %s", i18n("instrument"), instrument); gtk_label_set_text(list->data, str); g_list_free(list_start); g_free(str); } break; case PROP_SEQUENCE: { GList *list, *list_start; gchar *str; gchar *sequence; sequence = g_value_get_string(value); if(sequence == track_collection_mapper->sequence){ return; } if(track_collection_mapper->sequence != NULL){ g_free(track_collection_mapper->sequence); } track_collection_mapper->sequence = g_strdup(sequence); list_start = list = gtk_container_get_children((GtkContainer *) track_collection_mapper->info); list = list->next; str = g_strdup_printf("%s: %s", i18n("sequence"), sequence); gtk_label_set_text(list->data, str); g_list_free(list_start); g_free(str); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_track_collection_mapper_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTrackCollectionMapper *track_collection_mapper; track_collection_mapper = AGS_TRACK_COLLECTION_MAPPER(gobject); switch(prop_id){ case PROP_TRACK: { g_value_set_pointer(value, g_list_copy(track_collection_mapper->track)); } break; case PROP_INSTRUMENT: { g_value_set_string(value, track_collection_mapper->instrument); } break; case PROP_SEQUENCE: { g_value_set_string(value, track_collection_mapper->sequence); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_track_collection_mapper_connect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_track_collection_mapper_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_track_collection_mapper_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_track_collection_mapper_apply(AgsApplicable *applicable) { AgsWindow *window; AgsMachine *machine; AgsMidiImportWizard *midi_import_wizard; AgsTrackCollectionMapper *track_collection_mapper; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; GList *imported_notation; gchar *machine_type; track_collection_mapper = AGS_TRACK_COLLECTION_MAPPER(applicable); if(!gtk_toggle_button_get_active((GtkToggleButton *) track_collection_mapper->enabled)){ return; } midi_import_wizard = (AgsMidiImportWizard *) gtk_widget_get_ancestor((GtkWidget *) track_collection_mapper, AGS_TYPE_MIDI_IMPORT_WIZARD); window = (AgsWindow *) midi_import_wizard->main_window; application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create machine */ machine = NULL; machine_type = gtk_combo_box_text_get_active_text(track_collection_mapper->machine_type); if(!g_ascii_strcasecmp(machine_type, g_type_name(AGS_TYPE_DRUM))){ machine = (AgsMachine *) ags_drum_new(default_soundcard); }else if(!g_ascii_strcasecmp(machine_type, g_type_name(AGS_TYPE_MATRIX))){ machine = (AgsMachine *) ags_matrix_new(default_soundcard); }else if(!g_ascii_strcasecmp(machine_type, g_type_name(AGS_TYPE_SYNCSYNTH))){ machine = (AgsMachine *) ags_syncsynth_new(default_soundcard); #ifdef AGS_WITH_LIBINSTPATCH }else if(!g_ascii_strcasecmp(machine_type, g_type_name(AGS_TYPE_FFPLAYER))){ machine = (AgsMachine *) ags_ffplayer_new(default_soundcard); #endif }else if(!g_ascii_strcasecmp(machine_type, g_type_name(AGS_TYPE_SYNTH))){ machine = (AgsMachine *) ags_synth_new(default_soundcard); }else{ g_warning("unknown machine type"); return; } /* add audio */ add_audio = ags_add_audio_new(machine->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(machine), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(machine)); /* set size */ ags_audio_set_audio_channels(machine->audio, gtk_spin_button_get_value_as_int(track_collection_mapper->audio_channels), 0); ags_audio_set_pads(machine->audio, AGS_TYPE_OUTPUT, 1, 0); ags_audio_set_pads(machine->audio, AGS_TYPE_INPUT, 128, 0); /* apply notation */ imported_notation = track_collection_mapper->notation; g_list_free_full(machine->audio->notation, g_object_unref); machine->audio->notation = imported_notation; while(imported_notation != NULL){ g_object_ref(imported_notation->data); imported_notation = imported_notation->next; } /* */ gtk_widget_show_all(GTK_WIDGET(machine)); } void ags_track_collection_mapper_reset(AgsApplicable *applicable) { //TODO:JK: implement me } /** * ags_track_collection_mapper_find_instrument_with_sequence: * @track_collection_mapper: a #GList containing #AgsTrackCollectionMapper * @instrument: the instrument as string * @sequence: the sequence as string * * Finds next matching track in a #GList. * * Returns: the next matching #GList * * Since: 3.0.0 */ GList* ags_track_collection_mapper_find_instrument_with_sequence(GList *track_collection_mapper, gchar *instrument, gchar *sequence) { if(instrument == NULL || sequence == NULL){ return(NULL); } while(track_collection_mapper != NULL){ if((!g_ascii_strcasecmp(AGS_TRACK_COLLECTION_MAPPER(track_collection_mapper->data)->instrument, instrument) && !g_ascii_strcasecmp(AGS_TRACK_COLLECTION_MAPPER(track_collection_mapper->data)->sequence, sequence))){ return(track_collection_mapper); } track_collection_mapper = track_collection_mapper->next; } return(NULL); } /** * ags_track_collection_mapper_map: * @track_collection_mapper: an #AgsTrackCollectionMapper * * Maps XML tracks to #AgsNotation * * Since: 3.0.0 */ void ags_track_collection_mapper_map(AgsTrackCollectionMapper *track_collection_mapper) { AgsTrackCollection *track_collection; AgsNotation *current_notation; AgsNote *note; AgsTimestamp *timestamp; xmlNode *current, *child; GList *track, *notation_start, *notation; GList *list; gchar *segmentation; gdouble delay_factor; guint audio_channels; guint n_key_on, n_key_off; guint x, y, velocity; guint prev_x; guint default_length; guint i; gboolean pattern; track_collection = (AgsTrackCollection *) gtk_widget_get_ancestor((GtkWidget *) track_collection_mapper, AGS_TYPE_TRACK_COLLECTION); track = track_collection_mapper->track; /* map notation */ notation_start = notation = NULL; audio_channels = 1; for(i = 0; i < audio_channels; i++){ current_notation = ags_notation_new(NULL, i); notation_start = ags_notation_add(notation_start, current_notation); } track_collection_mapper->notation = notation_start; n_key_on = 0; n_key_off = 0; default_length = track_collection->default_length; if(default_length == 0){ default_length = 1; } timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = 0; prev_x = 0; delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(ags_config_get_instance(), AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ guint denominator, numerator; sscanf(segmentation, "%d/%d", &denominator, &numerator); delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } while(track != NULL){ current = track->data; child = current->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ xmlChar *str; glong delta_time; if(!xmlStrncmp(xmlGetProp(child, "event"), "note-on", 8)){ str = xmlGetProp(child, "delta-time"); delta_time = g_ascii_strtod(str, NULL); xmlFree(str); x = ags_midi_util_delta_time_to_offset(delay_factor, track_collection->division, track_collection->tempo, (glong) track_collection->bpm, delta_time); x -= track_collection->first_offset; str = xmlGetProp(child, "note"); y = (guint) g_ascii_strtoull(str, NULL, 10); xmlFree(str); str = xmlGetProp(child, "velocity"); velocity = (guint) g_ascii_strtoull(str, NULL, 10); xmlFree(str); notation = notation_start; for(i = 0; i < audio_channels; i++){ note = ags_note_new(); note->x[0] = x; note->x[1] = x + default_length; note->y = y; /* velocity */ #if 0 note->attack.imag = (gdouble) velocity / 127.0; #endif if(x >= prev_x + AGS_NOTATION_DEFAULT_OFFSET){ current_notation = ags_notation_new(NULL, i); ags_timestamp_set_ags_offset(current_notation->timestamp, AGS_NOTATION_DEFAULT_OFFSET * floor(x / AGS_NOTATION_DEFAULT_OFFSET)); notation_start = ags_notation_add(notation_start, current_notation); }else{ ags_timestamp_set_ags_offset(timestamp, AGS_NOTATION_DEFAULT_OFFSET * floor(x / AGS_NOTATION_DEFAULT_OFFSET)); notation = ags_notation_find_near_timestamp(notation_start, i, timestamp); current_notation = notation->data; } ags_notation_add_note(current_notation, note, FALSE); notation = notation->next; } // g_object_unref(note); n_key_on++; }else if(!xmlStrncmp(xmlGetProp(child, "event"), "note-off", 9)){ str = xmlGetProp(child, "delta-time"); delta_time = g_ascii_strtod(str, NULL); xmlFree(str); x = ags_midi_util_delta_time_to_offset(delay_factor, track_collection->division, track_collection->tempo, (glong) track_collection->bpm, delta_time); x -= track_collection->first_offset; str = xmlGetProp(child, "note"); y = (guint) g_ascii_strtoull(str, NULL, 10); xmlFree(str); str = xmlGetProp(child, "velocity"); velocity = (guint) g_ascii_strtoull(str, NULL, 10); xmlFree(str); for(i = 0; i < audio_channels; i++){ notation = g_list_last(notation_start); while(notation != NULL){ list = ags_note_find_prev(AGS_NOTATION(notation->data)->note, x, y); if(list != NULL){ note = list->data; if(note->x[0] == x){ note->x[1] = x + 1; }else{ note->x[1] = x; } note->y = y; /* velocity */ #if 0 note->release.imag = (gdouble) velocity / 127.0; #endif break; } notation = notation->prev; } } n_key_off++; } } child = child->next; } track = track->next; } g_object_unref(timestamp); /* populate machine_type */ gtk_combo_box_text_append_text(track_collection_mapper->machine_type, g_type_name(AGS_TYPE_SYNCSYNTH)); #ifdef AGS_WITH_LIBINSTPATCH gtk_combo_box_text_append_text(track_collection_mapper->machine_type, g_type_name(AGS_TYPE_FFPLAYER)); #endif gtk_combo_box_text_append_text(track_collection_mapper->machine_type, g_type_name(AGS_TYPE_DRUM)); gtk_combo_box_text_append_text(track_collection_mapper->machine_type, g_type_name(AGS_TYPE_MATRIX)); gtk_combo_box_set_active(GTK_COMBO_BOX(track_collection_mapper->machine_type), 0); } /** * ags_track_collection_mapper_new: * * Creates an #AgsTrackCollectionMapper * * Returns: a new #AgsTrackCollectionMapper * * Since: 3.0.0 */ AgsTrackCollectionMapper* ags_track_collection_mapper_new() { AgsTrackCollectionMapper *track_collection_mapper; track_collection_mapper = (AgsTrackCollectionMapper *) g_object_new(AGS_TYPE_TRACK_COLLECTION_MAPPER, NULL); return(track_collection_mapper); } gsequencer-3.1.3/ags/X/import/ags_midi_import_wizard_callbacks.h0000644000175000017500000000232713607210263021775 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_IMPORT_WIZARD_CALLBACKS_H__ #define __AGS_MIDI_IMPORT_WIZARD_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_midi_import_wizard_response_callback(GtkWidget *wizard, gint response, gpointer data); G_END_DECLS #endif /*__AGS_MIDI_IMPORT_WIZARD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/import/ags_track_collection.c0000644000175000017500000004026013607210263017412 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_track_collection_class_init(AgsTrackCollectionClass *track_collection); void ags_track_collection_connectable_interface_init(AgsConnectableInterface *connectable); void ags_track_collection_applicable_interface_init(AgsApplicableInterface *applicable); void ags_track_collection_init(AgsTrackCollection *track_collection); void ags_track_collection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_track_collection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_track_collection_connect(AgsConnectable *connectable); void ags_track_collection_disconnect(AgsConnectable *connectable); void ags_track_collection_set_update(AgsApplicable *applicable, gboolean update); void ags_track_collection_apply(AgsApplicable *applicable); void ags_track_collection_reset(AgsApplicable *applicable); /** * SECTION:ags_track_collection * @short_description: Pack track mapper * @title: AgsTrackCollection * @section_id: * @include: ags/X/ags_track_collection.h * * #AgsTrackCollection is a composite widget to property. A property editor * should be packed by a #AgsPropertyCollectionEditor. */ enum{ PROP_0, PROP_MIDI_DOCUMENT, }; static gpointer ags_track_collection_parent_class = NULL; GType ags_track_collection_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_track_collection = 0; static const GTypeInfo ags_track_collection_info = { sizeof (AgsTrackCollectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_track_collection_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTrackCollection), 0, /* n_preallocs */ (GInstanceInitFunc) ags_track_collection_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_track_collection_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_track_collection_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_track_collection = g_type_register_static(GTK_TYPE_VBOX, "AgsTrackCollection", &ags_track_collection_info, 0); g_type_add_interface_static(ags_type_track_collection, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_track_collection, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_track_collection); } return g_define_type_id__volatile; } void ags_track_collection_class_init(AgsTrackCollectionClass *track_collection) { GObjectClass *gobject; GParamSpec *param_spec; ags_track_collection_parent_class = g_type_class_peek_parent(track_collection); /* GObjectClass */ gobject = (GObjectClass *) track_collection; gobject->set_property = ags_track_collection_set_property; gobject->get_property = ags_track_collection_get_property; /* properties */ /** * AgsTrackCollection:midi-document: * * The assigned midi document. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("midi-document", i18n_pspec("midi document of track collection"), i18n_pspec("The midi document this track collection is assigned to"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_DOCUMENT, param_spec); } void ags_track_collection_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_track_collection_connect; connectable->disconnect = ags_track_collection_disconnect; } void ags_track_collection_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_track_collection_set_update; applicable->apply = ags_track_collection_apply; applicable->reset = ags_track_collection_reset; } void ags_track_collection_init(AgsTrackCollection *track_collection) { GtkScrolledWindow *scrolled_window; track_collection->midi_doc = NULL; track_collection->first_offset = 0; track_collection->bpm = 120.0; track_collection->division = 96; track_collection->tempo = 500000; track_collection->default_length = 4; scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(track_collection), (GtkWidget *) scrolled_window, TRUE, TRUE, 0); track_collection->child = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) track_collection->child); } void ags_track_collection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTrackCollection *track_collection; track_collection = AGS_TRACK_COLLECTION(gobject); switch(prop_id){ case PROP_MIDI_DOCUMENT: { xmlDoc *midi_document; midi_document = (xmlDoc *) g_value_get_pointer(value); if(track_collection->midi_doc == midi_document){ return; } track_collection->midi_doc = midi_document; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_track_collection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTrackCollection *track_collection; track_collection = AGS_TRACK_COLLECTION(gobject); switch(prop_id){ case PROP_MIDI_DOCUMENT: { g_value_set_pointer(value, track_collection->midi_doc); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_track_collection_connect(AgsConnectable *connectable) { AgsTrackCollection *track_collection; GList *list, *list_start; track_collection = AGS_TRACK_COLLECTION(connectable); /* children */ list_start = list = gtk_container_get_children((GtkContainer *) track_collection->child); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_track_collection_disconnect(AgsConnectable *connectable) { AgsTrackCollection *track_collection; GList *list, *list_start; track_collection = AGS_TRACK_COLLECTION(connectable); /* children */ list_start = list = gtk_container_get_children((GtkContainer *) track_collection->child); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_track_collection_set_update(AgsApplicable *applicable, gboolean update) { AgsTrackCollection *track_collection; GList *list, *list_start; track_collection = AGS_TRACK_COLLECTION(applicable); list_start = list = gtk_container_get_children((GtkContainer *) track_collection->child); while(list != NULL){ ags_applicable_set_update(AGS_APPLICABLE(list->data), update); list = list->next; } g_list_free(list_start); } void ags_track_collection_apply(AgsApplicable *applicable) { AgsTrackCollection *track_collection; GList *list, *list_start; track_collection = AGS_TRACK_COLLECTION(applicable); list_start = list = gtk_container_get_children((GtkContainer *) track_collection->child); while(list != NULL){ ags_applicable_apply(AGS_APPLICABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_track_collection_reset(AgsApplicable *applicable) { AgsTrackCollection *track_collection; GList *list, *list_start; track_collection = AGS_TRACK_COLLECTION(applicable); list_start = list = gtk_container_get_children((GtkContainer *) track_collection->child); while(list != NULL){ ags_applicable_reset(AGS_APPLICABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_track_collection_parse(AgsTrackCollection *track_collection) { xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode *header_node, *tempo_node; xmlNode *time_signature_node; xmlNode **node, **instrument_node, **sequence_node; GList *list, *list_start; xmlChar *str; gchar *instrument, *sequence; gdouble sec_val; guint denominator, numerator; guint i, j; /* bpm and first_offset */ header_node = NULL; xpath_context = xmlXPathNewContext(track_collection->midi_doc); xpath_object = xmlXPathEval((xmlChar *) "//midi-header", xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ header_node = node[i]; } } } tempo_node = NULL; xpath_context = xmlXPathNewContext(track_collection->midi_doc); xpath_object = xmlXPathEval((xmlChar *) "//midi-tracks/midi-track/midi-message[@event=\"tempo-number\"]", xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ tempo_node = node[i]; } } } if(header_node == NULL){ return; } str = xmlGetProp(header_node, "division"); track_collection->division = g_ascii_strtoull(str, NULL, 10); xmlFree(str); if(tempo_node != NULL){ track_collection->first_offset = 0; str = xmlGetProp(tempo_node, "tempo"); track_collection->tempo = g_ascii_strtoull(str, NULL, 10); xmlFree(str); sec_val = ags_midi_parser_ticks_to_sec(NULL, (guint) track_collection->division, (gint) track_collection->division, (guint) track_collection->tempo); // g_message("", sec_val); track_collection->bpm = 60.0 / sec_val; } // g_message("bpm %f", track_collection->bpm); /* default length */ time_signature_node = NULL; denominator = 4; numerator = 4; xpath_context = xmlXPathNewContext(track_collection->midi_doc); xpath_object = xmlXPathEval((xmlChar *) "//midi-tracks/midi-track/midi-message[@event=\"time-signature\"]", xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ time_signature_node = node[i]; } } if(time_signature_node != NULL){ xmlChar *str; str = xmlGetProp(time_signature_node, "timesig"); if(str != NULL){ sscanf(str, "%d/%d", &numerator, &denominator); } } } track_collection->default_length = numerator * (numerator / denominator); /* collect */ xpath_context = xmlXPathNewContext(track_collection->midi_doc); xpath_object = xmlXPathEval((xmlChar *) "//midi-tracks/midi-track", xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; GList *track_collection_mapper; instrument = NULL; sequence = NULL; xpath_context = xmlXPathNewContext(track_collection->midi_doc); // xmlXPathSetContextNode(node[i], // xpath_context); xpath_context->node = node[i]; xpath_object = xmlXPathEval((xmlChar *) "./midi-message[boolean(@instrument-name)]", xpath_context); if(xpath_object->nodesetval != NULL){ instrument_node = xpath_object->nodesetval->nodeTab; for(j = 0; j < xpath_object->nodesetval->nodeNr; j++){ if(instrument_node[j]->type == XML_ELEMENT_NODE){ instrument = xmlGetProp(instrument_node[j], "instrument-name"); break; } } } xpath_context = xmlXPathNewContext(track_collection->midi_doc); // xmlXPathSetContextNode(node[i], // xpath_context); xpath_context->node = node[i]; xpath_object = xmlXPathEval((xmlChar *) "./midi-message[boolean(@sequence-name)]", xpath_context); if(xpath_object->nodesetval != NULL){ sequence_node = xpath_object->nodesetval->nodeTab; for(j = 0; j < xpath_object->nodesetval->nodeNr; j++){ if(sequence_node[j]->type == XML_ELEMENT_NODE){ sequence = xmlGetProp(sequence_node[j], "sequence-name"); break; } } } if(instrument == NULL){ instrument = g_strdup("GSequencer - instrument default"); } if(sequence == NULL){ sequence = g_strdup("GSequencer - sequence default"); } list = gtk_container_get_children((GtkContainer *) track_collection->child); track_collection_mapper = ags_track_collection_mapper_find_instrument_with_sequence(list, instrument, sequence); if(track_collection_mapper == NULL){ ags_track_collection_add_mapper(track_collection, node[i], instrument, sequence); }else{ g_object_set(AGS_TRACK_COLLECTION_MAPPER(track_collection_mapper->data), "track", node[i], NULL); } g_list_free(list); } } } // xmlSaveFormatFileEnc("-", track_collection->midi_doc, "UTF-8", 1); /* map */ list_start = list = gtk_container_get_children((GtkContainer *) track_collection->child); while(list != NULL){ ags_track_collection_mapper_map(list->data); gtk_widget_show_all(GTK_WIDGET(list->data)); list = list->next; } g_list_free(list_start); } void ags_track_collection_add_mapper(AgsTrackCollection *track_collection, xmlNode *track, gchar *instrument, gchar *sequence) { AgsTrackCollectionMapper *track_collection_mapper; if(track == NULL){ return; } g_message("%s", instrument); g_message("%s", sequence); //FIXME:JK: deprecated track_collection_mapper = (AgsTrackCollectionMapper *) g_object_newv(track_collection->child_type, track_collection->child_parameter_count, track_collection->child_parameter); g_object_set(track_collection_mapper, "track", track, "instrument", instrument, "sequence", sequence, NULL); gtk_box_pack_start(GTK_BOX(track_collection->child), GTK_WIDGET(track_collection_mapper), FALSE, FALSE, 0); } /** * ags_track_collection_new: * @child_type: the child type * @child_parameter_count: the child parameter count * @child_parameter: the child parameters * * Creates an #AgsTrackCollection * * Returns: a new #AgsTrackCollection * * Since: 3.0.0 */ AgsTrackCollection* ags_track_collection_new(GType child_type, guint child_parameter_count, GParameter *child_parameter) { AgsTrackCollection *track_collection; track_collection = (AgsTrackCollection *) g_object_new(AGS_TYPE_TRACK_COLLECTION, NULL); track_collection->child_type = child_type; track_collection->child_parameter_count = child_parameter_count; track_collection->child_parameter = child_parameter; return(track_collection); } gsequencer-3.1.3/ags/X/import/ags_track_collection.h0000644000175000017500000000513413607210263017420 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TRACK_COLLECTION_H__ #define __AGS_TRACK_COLLECTION_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TRACK_COLLECTION (ags_track_collection_get_type()) #define AGS_TRACK_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TRACK_COLLECTION, AgsTrackCollection)) #define AGS_TRACK_COLLECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TRACK_COLLECTION, AgsTrackCollectionClass)) #define AGS_IS_TRACK_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TRACK_COLLECTION)) #define AGS_IS_TRACK_COLLECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TRACK_COLLECTION)) #define AGS_TRACK_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_TRACK_COLLECTION, AgsTrackCollectionClass)) typedef struct _AgsTrackCollection AgsTrackCollection; typedef struct _AgsTrackCollectionClass AgsTrackCollectionClass; struct _AgsTrackCollection { GtkVBox vbox; xmlDoc *midi_doc; guint first_offset; gdouble bpm; glong tempo; glong division; guint default_length; GType child_type; guint child_parameter_count; GParameter *child_parameter; GtkVBox *child; }; struct _AgsTrackCollectionClass { GtkVBoxClass vbox; }; GType ags_track_collection_get_type(); void ags_track_collection_parse(AgsTrackCollection *track_collection); void ags_track_collection_add_mapper(AgsTrackCollection *track_collection, xmlNode *track, gchar *instrument, gchar *sequence); AgsTrackCollection* ags_track_collection_new(GType child_type, guint child_parameter_count, GParameter *child_parameter); G_END_DECLS #endif /*__AGS_TRACK_COLLECTION_H__*/ gsequencer-3.1.3/ags/X/import/ags_midi_import_wizard_callbacks.c0000644000175000017500000000605613607210263021773 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_midi_import_wizard_response_callback(GtkWidget *wizard, gint response, gpointer data) { AgsMidiImportWizard *midi_import_wizard; midi_import_wizard = (AgsMidiImportWizard *) wizard; switch(response){ case GTK_RESPONSE_REJECT: { if((AGS_MIDI_IMPORT_WIZARD_SHOW_TRACK_COLLECTION & (midi_import_wizard->flags)) != 0){ /* show/hide */ midi_import_wizard->flags |= AGS_MIDI_IMPORT_WIZARD_SHOW_FILE_CHOOSER; midi_import_wizard->flags &= (~AGS_MIDI_IMPORT_WIZARD_SHOW_TRACK_COLLECTION); gtk_widget_hide(gtk_widget_get_parent(midi_import_wizard->track_collection)); gtk_widget_show(gtk_widget_get_parent(midi_import_wizard->file_chooser)); gtk_widget_show_all(midi_import_wizard->file_chooser); } } break; case GTK_RESPONSE_ACCEPT: { if((AGS_MIDI_IMPORT_WIZARD_SHOW_FILE_CHOOSER & (midi_import_wizard->flags)) != 0){ AgsMidiParser *midi_parser; xmlDoc *midi_doc; FILE *file; /* show/hide */ gtk_widget_hide(gtk_widget_get_parent(midi_import_wizard->file_chooser)); gtk_widget_show(gtk_widget_get_parent(midi_import_wizard->track_collection)); gtk_widget_show_all(midi_import_wizard->track_collection); midi_import_wizard->flags |= AGS_MIDI_IMPORT_WIZARD_SHOW_TRACK_COLLECTION; midi_import_wizard->flags &= (~AGS_MIDI_IMPORT_WIZARD_SHOW_FILE_CHOOSER); /* parse */ file = fopen(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(midi_import_wizard->file_chooser)), "r"); midi_parser = ags_midi_parser_new(file); midi_doc = ags_midi_parser_parse_full(midi_parser); // xmlSaveFormatFileEnc("-", midi_doc, "UTF-8", 1); g_object_set(midi_import_wizard->track_collection, "midi-document", midi_doc, NULL); ags_track_collection_parse((AgsTrackCollection *) midi_import_wizard->track_collection); } } break; case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(wizard)); } case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_CLOSE: case GTK_RESPONSE_CANCEL: { AGS_WINDOW(midi_import_wizard->main_window)->midi_import_wizard = NULL; gtk_widget_destroy(wizard); } break; default: g_warning("unknown response"); } } gsequencer-3.1.3/ags/X/import/ags_track_collection_mapper_callbacks.h0000644000175000017500000000215613607210263022764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TRACK_COLLECTION_MAPPER_CALLBACKS_H__ #define __AGS_TRACK_COLLECTION_MAPPER_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_TRACK_COLLECTION_MAPPER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_midi_preferences_callbacks.h0000644000175000017500000000272213607210263020071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_PREFERENCES_CALLBACKS_H__ #define __AGS_MIDI_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_midi_preferences_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsMidiPreferences *midi_preferences); void ags_midi_preferences_add_callback(GtkWidget *widget, AgsMidiPreferences *midi_preferences); void ags_midi_preferences_remove_sequencer_editor_callback(GtkWidget *sequencer_editor, AgsMidiPreferences *midi_preferences); G_END_DECLS #endif /*__AGS_MIDI_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_property_collection_editor_callbacks.c0000644000175000017500000000467113605312646022241 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_property_collection_editor_add_collection_callback(GtkButton *button, AgsPropertyCollectionEditor *property_collection_editor) { GtkTable *table; GtkWidget *collection; GtkButton *remove_collection; GtkAlignment *alignment; table = (GtkTable *) gtk_table_new(2, 2, FALSE); gtk_box_pack_start(GTK_BOX(property_collection_editor->child), GTK_WIDGET(table), FALSE, FALSE, 0); //FIXME:JK: deprecated function collection = (GtkWidget *) g_object_newv(property_collection_editor->child_type, property_collection_editor->child_parameter_count, property_collection_editor->child_parameter); g_object_set_data(G_OBJECT(table), "AgsChild", collection); gtk_table_attach(table, GTK_WIDGET(collection), 0, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); alignment = (GtkAlignment *) gtk_alignment_new(1.0, 0.0, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 1, 2, 1, 2, GTK_FILL, 0, 0, 0); remove_collection = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(remove_collection)); g_signal_connect_after(G_OBJECT(remove_collection), "clicked", G_CALLBACK(ags_property_collection_editor_remove_collection_callback), table); gtk_table_set_row_spacing(table, 0, 8); ags_connectable_connect(AGS_CONNECTABLE(collection)); gtk_widget_show_all(GTK_WIDGET(table)); } void ags_property_collection_editor_remove_collection_callback(GtkButton *button, GtkTable *table) { gtk_widget_destroy(GTK_WIDGET(table)); } gsequencer-3.1.3/ags/X/ags_notation_editor_callbacks.h0000644000175000017500000000366613616617253020011 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_EDITOR_CALLBACKS_H__ #define __AGS_NOTATION_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_notation_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsNotationEditor *notation_editor); void ags_notation_editor_piano_key_pressed_callback(AgsPiano *piano, gchar *note, gint key_code, AgsNotationEditor *notation_editor); void ags_notation_editor_piano_key_released_callback(AgsPiano *piano, gchar *note, gint key_code, AgsNotationEditor *notation_editor); void ags_notation_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsNotationEditor *notation_editor); void ags_notation_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsNotationEditor *notation_editor); G_END_DECLS #endif /*__AGS_NOTATION_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_osc_server_preferences_callbacks.c0000644000175000017500000001603113605312646021320 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_osc_server_preferences_start_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(!ags_osc_server_test_flags(list->data, AGS_OSC_SERVER_STARTED)){ ags_osc_server_start(list->data); } list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_osc_server_preferences_stop_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(ags_osc_server_test_flags(list->data, AGS_OSC_SERVER_STARTED)){ ags_osc_server_stop(list->data); } list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_osc_server_preferences_any_address_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; if((AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE & (osc_server_preferences->flags)) != 0){ return; } application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ ags_osc_server_set_flags(list->data, AGS_OSC_SERVER_ANY_ADDRESS); }else{ ags_osc_server_unset_flags(list->data, AGS_OSC_SERVER_ANY_ADDRESS); } g_list_free_full(start_list, g_object_unref); } /* set address fields in-/sensitive */ if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ gtk_widget_set_sensitive((GtkWidget *) osc_server_preferences->ip4_address, FALSE); gtk_widget_set_sensitive((GtkWidget *) osc_server_preferences->ip6_address, FALSE); }else{ gtk_widget_set_sensitive((GtkWidget *) osc_server_preferences->ip4_address, TRUE); gtk_widget_set_sensitive((GtkWidget *) osc_server_preferences->ip6_address, TRUE); } } void ags_osc_server_preferences_enable_ip4_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; if((AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE & (osc_server_preferences->flags)) != 0){ return; } application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ ags_osc_server_set_flags(list->data, AGS_OSC_SERVER_INET4); }else{ ags_osc_server_unset_flags(list->data, AGS_OSC_SERVER_INET4); } g_list_free_full(start_list, g_object_unref); } } void ags_osc_server_preferences_ip4_address_callback(GtkEditable *editable, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; if((AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE & (osc_server_preferences->flags)) != 0){ return; } application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ g_object_set(list->data, "ip4", gtk_entry_get_text(GTK_ENTRY(editable)), NULL); g_list_free_full(start_list, g_object_unref); } } void ags_osc_server_preferences_enable_ip6_callback(GtkButton *button, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; if((AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE & (osc_server_preferences->flags)) != 0){ return; } application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ ags_osc_server_set_flags(list->data, AGS_OSC_SERVER_INET6); }else{ ags_osc_server_unset_flags(list->data, AGS_OSC_SERVER_INET6); } g_list_free_full(start_list, g_object_unref); } } void ags_osc_server_preferences_ip6_address_callback(GtkEditable *editable, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; if((AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE & (osc_server_preferences->flags)) != 0){ return; } application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ g_object_set(list->data, "ip6", gtk_entry_get_text(GTK_ENTRY(editable)), NULL); g_list_free_full(start_list, g_object_unref); } } void ags_osc_server_preferences_port_callback(GtkEditable *editable, AgsOscServerPreferences *osc_server_preferences) { AgsApplicationContext *application_context; GList *start_list, *list; gchar *str; guint server_port; if((AGS_OSC_SERVER_PREFERENCES_BLOCK_UPDATE & (osc_server_preferences->flags)) != 0){ return; } application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_osc_server(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ server_port = AGS_OSC_SERVER_DEFAULT_SERVER_PORT; str = gtk_entry_get_text(GTK_ENTRY(editable)); if(str != NULL){ server_port = (guint) g_ascii_strtoull(str, NULL, 10); } g_object_set(list->data, "server-port", server_port, NULL); g_list_free_full(start_list, g_object_unref); } } gsequencer-3.1.3/ags/X/ags_pad_editor_callbacks.c0000644000175000017500000000536413607210263016700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_pad_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsPadEditor *pad_editor) { AgsAudio *audio; if(audio_channels > audio_channels_old){ AgsLineEditor *line_editor; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; guint i; /* get some channel fields */ next_pad = ags_channel_next_pad(pad_editor->pad); /* get current last of pad */ nth_channel = ags_channel_nth(pad_editor->pad, audio_channels_old); channel = nth_channel; next_channel = NULL; while(channel != next_pad){ /* instantiate line editor */ line_editor = ags_line_editor_new(channel); line_editor->editor_type_count = pad_editor->editor_type_count; line_editor->editor_type = (GType *) malloc(line_editor->editor_type_count * sizeof(GType)); for(i = 0; i < line_editor->editor_type_count; i++){ line_editor->editor_type[i] = pad_editor->editor_type[i]; } gtk_box_pack_start(GTK_BOX(pad_editor->line_editor), GTK_WIDGET(line_editor), FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(line_editor)); gtk_widget_show_all(GTK_WIDGET(line_editor)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ GList *list, *list_next, *list_start; list_start = list = gtk_container_get_children(GTK_CONTAINER(pad_editor->line_editor)); list = g_list_nth(list, audio_channels); while(list != NULL){ list_next = list->next; gtk_widget_destroy(GTK_WIDGET(list->data)); list = list_next; } g_list_free(list_start); } } gsequencer-3.1.3/ags/X/ags_machine.c0000644000175000017500000024460113616617253014204 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_machine_class_init(AgsMachineClass *machine); void ags_machine_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_init(AgsMachine *machine); void ags_machine_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_machine_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); static void ags_machine_finalize(GObject *gobject); void ags_machine_connect(AgsConnectable *connectable); void ags_machine_disconnect(AgsConnectable *connectable); void ags_machine_real_resize_audio_channels(AgsMachine *machine, guint new_size, guint old_size); void ags_machine_real_resize_pads(AgsMachine *machine, GType channel_type, guint new_size, guint old_size); void ags_machine_real_map_recall(AgsMachine *machine); GList* ags_machine_real_find_port(AgsMachine *machine); GtkMenu* ags_machine_popup_new(AgsMachine *machine); xmlNode* ags_machine_copy_pattern_to_notation(AgsMachine *machine, AgsChannel *start_current, guint input_pads); /** * SECTION:ags_machine * @short_description: visualize audio object. * @title: AgsMachine * @section_id: * @include: ags/X/ags_machine.h * * #AgsMachine is a composite widget to act as base class to visualize #AgsAudio. */ #define AGS_DEFAULT_MACHINE "ags-default-machine" enum{ SAMPLERATE_CHANGED, BUFFER_SIZE_CHANGED, FORMAT_CHANGED, RESIZE_AUDIO_CHANNELS, RESIZE_PADS, MAP_RECALL, FIND_PORT, STOP, LAST_SIGNAL, }; enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_AUDIO, PROP_MACHINE_NAME, }; static gpointer ags_machine_parent_class = NULL; static guint machine_signals[LAST_SIGNAL]; GType ags_machine_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine = 0; static const GTypeInfo ags_machine_info = { sizeof (AgsMachineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine = g_type_register_static(GTK_TYPE_BIN, "AgsMachine", &ags_machine_info, 0); g_type_add_interface_static(ags_type_machine, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine); } return g_define_type_id__volatile; } void ags_machine_class_init(AgsMachineClass *machine) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_machine_parent_class = g_type_class_peek_parent(machine); /* GObjectClass */ gobject = (GObjectClass *) machine; gobject->set_property = ags_machine_set_property; gobject->get_property = ags_machine_get_property; gobject->finalize = ags_machine_finalize; /* properties */ /** * AgsMachine:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsMachine:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsMachine:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsMachine:audio: * * The assigned #AgsAudio to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio it is assigned to"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsMachine:machine-name: * * The machine's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("machine-name", i18n_pspec("machine name"), i18n_pspec("The machine's name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE_NAME, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) machine; /* AgsMachineClass */ machine->samplerate_changed = NULL; machine->buffer_size_changed = NULL; machine->format_changed = NULL; machine->resize_pads = ags_machine_real_resize_pads; machine->resize_audio_channels = ags_machine_real_resize_audio_channels; machine->map_recall = ags_machine_real_map_recall; machine->find_port = ags_machine_real_find_port; machine->stop = NULL; /* signals */ /** * AgsMachine::samplerate-changed: * @machine: the #AgsMachine * @samplerate: the samplerate * @old_samplerate: the old samplerate * * The ::samplerate-changed signal notifies about changed samplerate. * * Since: 3.0.0 */ machine_signals[SAMPLERATE_CHANGED] = g_signal_new("samplerate-changed", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, samplerate_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMachine::buffer-size-changed: * @machine: the #AgsMachine * @buffer_size: the buffer size * @old_buffer_size: the old buffer size * * The ::buffer-size-changed signal notifies about changed buffer size. * * Since: 3.0.0 */ machine_signals[BUFFER_SIZE_CHANGED] = g_signal_new("buffer-size-changed", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, buffer_size_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMachine::format-changed: * @machine: the #AgsMachine * @format: the format * @old_format: the old format * * The ::format-changed signal notifies about changed format. * * Since: 3.0.0 */ machine_signals[FORMAT_CHANGED] = g_signal_new("format-changed", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, format_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMachine::resize-audio-channels: * @machine: the #AgsMachine to modify * @new_size: the new size * @old_size: the old size * * The ::resize-audio-channels signal notifies about changed channel allocation within * audio. * * Since: 3.0.0 */ machine_signals[RESIZE_AUDIO_CHANNELS] = g_signal_new("resize-audio-channels", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, resize_audio_channels), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMachine::resize-pads: * @machine: the #AgsMachine to modify * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * @new_size: the new size * @old_size: the old size * * The ::resize-pads signal notifies about changed channel allocation within * audio. * * Since: 3.0.0 */ machine_signals[RESIZE_PADS] = g_signal_new("resize-pads", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, resize_pads), NULL, NULL, ags_cclosure_marshal_VOID__ULONG_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_ULONG, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMachine::map-recall: * @machine: the #AgsMachine * * The ::map-recall should be used to add the machine's default recall. * * Since: 3.0.0 */ machine_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsMachine::find-port: * @machine: the #AgsMachine to resize * Returns: a #GList with associated ports * * The ::find-port signal emits as recall should be mapped. * * Since: 3.0.0 */ machine_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsMachine::stop: * @machine: the #AgsMachine * @recall_id: the #GList-struct containing #AgsRecallID * @sound_scope: the sound scope * * The ::stop signal gets emited as audio stops playback. * * Since: 3.0.0 */ machine_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS(machine), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineClass, stop), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_INT, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT); } void ags_machine_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_connect; connectable->disconnect = ags_machine_disconnect; } void ags_machine_init(AgsMachine *machine) { GtkVBox *vbox; GtkFrame *frame; AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); g_signal_connect(application_context, "check-message", G_CALLBACK(ags_machine_check_message_callback), machine); machine->machine_name = NULL; machine->version = AGS_MACHINE_DEFAULT_VERSION; machine->build_id = AGS_MACHINE_DEFAULT_BUILD_ID; machine->flags = 0; machine->file_input_flags = 0; machine->mapping_flags = 0; machine->connection_flags = 0; machine->output_pad_type = G_TYPE_NONE; machine->input_pad_type = G_TYPE_NONE; machine->bank_0 = 0; machine->bank_1 = 0; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); frame = (GtkFrame *) gtk_frame_new(NULL); gtk_container_add((GtkContainer *) machine, (GtkWidget *) frame); machine->audio = ags_audio_new(NULL); g_object_ref(G_OBJECT(machine->audio)); machine->samplerate = machine->audio->samplerate; machine->buffer_size = machine->audio->buffer_size; machine->format = machine->audio->format; machine->audio->flags |= AGS_AUDIO_CAN_NEXT_ACTIVE; machine->audio->machine_widget = (GObject *) machine; machine->active_playback = NULL; /* AgsAudio related forwarded signals */ g_signal_connect_after(G_OBJECT(machine), "resize-audio-channels", G_CALLBACK(ags_machine_resize_audio_channels_callback), NULL); g_signal_connect_after(G_OBJECT(machine), "resize-pads", G_CALLBACK(ags_machine_resize_pads_callback), NULL); g_signal_connect_after(G_OBJECT(machine), "stop", G_CALLBACK(ags_machine_stop_callback), NULL); machine->play = NULL; machine->output = NULL; machine->selected_output_pad = NULL; machine->input = NULL; machine->selected_input_pad = NULL; machine->bridge = NULL; machine->port = NULL; machine->enabled_automation_port = NULL; machine->popup = ags_machine_popup_new(machine); g_object_ref(machine->popup); machine->menu_tool_button = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "label", "machine", "menu", machine->popup, NULL); gtk_frame_set_label_widget(frame, (GtkWidget *) machine->menu_tool_button); machine->properties = NULL; machine->rename = NULL; machine->rename_audio = NULL; machine->reposition_audio = NULL; machine->connection_editor = NULL; machine->midi_dialog = NULL; machine->envelope_dialog = NULL; machine->midi_export_dialog = NULL; machine->wave_export_dialog = NULL; machine->midi_import_dialog = NULL; machine->wave_import_dialog = NULL; } void ags_machine_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWindow *window; AgsMachine *machine; machine = AGS_MACHINE(gobject); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); switch(prop_id){ case PROP_SAMPLERATE: { GList *start_list, *list; guint samplerate, old_samplerate; samplerate = g_value_get_uint(value); old_samplerate = machine->samplerate; if(samplerate == old_samplerate){ return; } machine->samplerate = samplerate; ags_machine_samplerate_changed(machine, samplerate, old_samplerate); if(machine->output != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(machine->output)); while(list != NULL){ if(AGS_IS_PAD(list->data)){ g_object_set(list->data, "samplerate", samplerate, NULL); } list = list->next; } g_list_free(start_list); } if(machine->input != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(machine->input)); while(list != NULL){ if(AGS_IS_PAD(list->data)){ g_object_set(list->data, "samplerate", samplerate, NULL); } list = list->next; } g_list_free(start_list); } if(machine->bridge != NULL){ g_object_set(machine->bridge, "samplerate", samplerate, NULL); } } break; case PROP_BUFFER_SIZE: { GList *start_list, *list; guint buffer_size, old_buffer_size; buffer_size = g_value_get_uint(value); old_buffer_size = machine->buffer_size; if(buffer_size == old_buffer_size){ return; } machine->buffer_size = buffer_size; ags_machine_buffer_size_changed(machine, buffer_size, old_buffer_size); if(machine->output != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(machine->output)); while(list != NULL){ if(AGS_IS_PAD(list->data)){ g_object_set(list->data, "buffer-size", buffer_size, NULL); } list = list->next; } g_list_free(start_list); } if(machine->input != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(machine->input)); while(list != NULL){ if(AGS_IS_PAD(list->data)){ g_object_set(list->data, "buffer-size", buffer_size, NULL); } list = list->next; } g_list_free(start_list); } if(machine->bridge != NULL){ g_object_set(machine->bridge, "buffer-size", buffer_size, NULL); } } break; case PROP_FORMAT: { GList *start_list, *list; guint format, old_format; format = g_value_get_uint(value); old_format = machine->format; if(format == old_format){ return; } machine->format = format; ags_machine_format_changed(machine, format, old_format); if(machine->output != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(machine->output)); while(list != NULL){ if(AGS_IS_PAD(list->data)){ g_object_set(list->data, "format", format, NULL); } list = list->next; } g_list_free(start_list); } if(machine->input != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(machine->input)); while(list != NULL){ if(AGS_IS_PAD(list->data)){ g_object_set(list->data, "format", format, NULL); } list = list->next; } g_list_free(start_list); } if(machine->bridge != NULL){ g_object_set(machine->bridge, "format", format, NULL); } } break; case PROP_AUDIO: { AgsAudio *audio; gboolean reset; audio = (AgsAudio *) g_value_get_object(value); reset = TRUE; if(machine->audio != NULL){ GList *pad; GList *list; g_object_unref(G_OBJECT(machine->audio)); if(audio == NULL){ /* destroy pad */ pad = gtk_container_get_children(machine->output); // pad = g_list_nth(pad, audio->output_pads); while(pad != NULL){ gtk_widget_destroy(pad->data); pad = pad->next; } pad = gtk_container_get_children(machine->input); // pad = g_list_nth(pad, audio->input_pads); while(pad != NULL){ gtk_widget_destroy(pad->data); pad = pad->next; } reset = FALSE; } } if(audio != NULL){ g_object_ref(G_OBJECT(audio)); machine->audio = audio; if(reset){ AgsChannel *start_input, *start_output; AgsChannel *input, *next_pad_input, *output, *next_pad_output; GList *start_pad, *pad; GList *start_line, *line; guint audio_channels; guint output_pads, input_pads; guint i; g_object_get(audio, "audio-channels", &audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, "output", &start_output, "input", &start_input, NULL); /* set channel and resize for AgsOutput */ output = start_output; if(output != NULL){ g_object_ref(output); } next_pad_output = NULL; if(machine->output_pad_type != G_TYPE_NONE){ pad = start_pad = gtk_container_get_children(machine->output); i = 0; while(pad != NULL && output != NULL){ line = start_line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(pad->data)->expander_set)); ags_pad_resize_lines(AGS_PAD(pad->data), machine->output_line_type, audio_channels, g_list_length(line)); g_object_set(G_OBJECT(pad->data), "channel", output, NULL); g_list_free(start_line); /* iterate */ next_pad_output = ags_channel_next_pad(output); g_object_unref(output); output = next_pad_output; pad = pad->next; i++; } g_list_free(start_pad); if(output != NULL){ AgsPad *pad; /* add pad */ for(; i < audio->output_pads; i++){ pad = g_object_new(machine->output_pad_type, "channel", output, NULL); gtk_container_add(machine->output, GTK_WIDGET(pad)); ags_pad_resize_lines(pad, machine->output_line_type, audio_channels, 0); } }else{ /* destroy pad */ pad = start_pad = gtk_container_get_children(machine->output); pad = g_list_nth(pad, output_pads); while(pad != NULL){ gtk_widget_destroy(pad->data); pad = pad->next; } g_list_free(start_pad); } } if(start_output != NULL){ g_object_unref(start_output); } if(next_pad_output != NULL){ g_object_unref(next_pad_output); } /* set channel and resize for AgsOutput */ input = start_input; if(input != NULL){ g_object_ref(input); } next_pad_input = NULL; if(machine->input_pad_type != G_TYPE_NONE){ pad = start_pad = gtk_container_get_children(machine->input); i = 0; while(pad != NULL && input != NULL){ line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(pad->data)->expander_set)); ags_pad_resize_lines(AGS_PAD(pad->data), machine->input_line_type, audio_channels, g_list_length(line)); g_object_set(G_OBJECT(pad->data), "channel", input, NULL); g_list_free(line); /* iterate */ next_pad_output = ags_channel_next_pad(output); g_object_unref(output); output = next_pad_output; pad = pad->next; i++; } g_list_free(start_pad); if(input != NULL){ AgsPad *pad; /* add pad */ for(; i < audio->input_pads; i++){ pad = g_object_new(machine->input_pad_type, "channel", input, NULL); gtk_container_add(machine->input, GTK_WIDGET(pad)); ags_pad_resize_lines(pad, machine->input_line_type, audio_channels, 0); } }else{ /* destroy pad */ pad = start_pad = gtk_container_get_children(machine->input); pad = g_list_nth(pad, audio->input_pads); while(pad != NULL){ gtk_widget_destroy(pad->data); pad = pad->next; } g_list_free(start_pad); } } if(start_input != NULL){ g_object_unref(start_input); } if(next_pad_input != NULL){ g_object_unref(next_pad_input); } }else{ AgsPad *pad; AgsChannel *start_input, *start_output; AgsChannel *input, *next_pad_input, *output, *next_pad_output; guint audio_channels; guint output_pads, input_pads; guint i; g_object_get(audio, "audio-channels", &audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, "output", &start_output, "input", &start_input, NULL); /* add pad */ output = start_output; if(output != NULL){ g_object_ref(output); } next_pad_output = NULL; if(machine->output_pad_type != G_TYPE_NONE){ for(i = 0; i < output_pads; i++){ pad = g_object_new(machine->output_pad_type, "channel", output, NULL); gtk_container_add(machine->output, GTK_WIDGET(pad)); ags_pad_resize_lines(pad, machine->output_line_type, audio_channels, 0); /* iterate */ next_pad_output = ags_channel_next_pad(output); g_object_unref(output); output = next_pad_output; } } if(start_output != NULL){ g_object_unref(start_output); } if(next_pad_output != NULL){ g_object_unref(next_pad_output); } /* add pad */ input = start_input; if(input != NULL){ g_object_ref(input); } next_pad_input = NULL; if(machine->input_pad_type != G_TYPE_NONE){ for(i = 0; i < input_pads; i++){ pad = g_object_new(machine->input_pad_type, "channel", input, NULL); gtk_container_add(machine->input, GTK_WIDGET(pad)); ags_pad_resize_lines(pad, machine->input_line_type, audio_channels, 0); /* iterate */ next_pad_input = ags_channel_next_pad(input); g_object_unref(input); input = next_pad_input; } } if(start_input != NULL){ g_object_unref(start_input); } if(next_pad_input != NULL){ g_object_unref(next_pad_input); } } }else{ machine->audio = NULL; } } break; case PROP_MACHINE_NAME: { gchar *machine_name; gchar *str; machine_name = g_value_get_string(value); if(machine_name == machine->machine_name){ return; } if(machine->machine_name != NULL){ g_free(machine->machine_name); } machine->machine_name = g_strdup(machine_name); /* update UI */ str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine_name); g_object_set(machine->menu_tool_button, "label", str, NULL); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMachine *machine; machine = AGS_MACHINE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, machine->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, machine->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, machine->format); } break; case PROP_AUDIO: { g_value_set_object(value, machine->audio); } break; case PROP_MACHINE_NAME: { g_value_set_string(value, machine->machine_name); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } static void ags_machine_finalize(GObject *gobject) { AgsMachine *machine; AgsAudio *audio; AgsApplicationContext *application_context; GList *list, *list_start; char *str; machine = (AgsMachine *) gobject; application_context = ags_application_context_get_instance(); g_object_disconnect(application_context, "any_signal::check-message", G_CALLBACK(ags_machine_check_message_callback), machine, NULL); /* remove from sound provider */ list = list_start = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); list_start = g_list_remove(list_start, machine->audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), list_start); g_object_unref(machine->audio); g_list_foreach(list_start, (GFunc) g_object_unref, NULL); g_list_free_full(machine->enabled_automation_port, (GDestroyNotify) ags_machine_automation_port_free); //TODO:JK: better clean-up of audio if(machine->properties != NULL){ gtk_widget_destroy((GtkWidget *) machine->properties); } if(machine->rename != NULL){ gtk_widget_destroy((GtkWidget *) machine->rename); } if(machine->rename_audio != NULL){ gtk_widget_destroy((GtkWidget *) machine->rename_audio); } if(machine->reposition_audio != NULL){ gtk_widget_destroy((GtkWidget *) machine->reposition_audio); } if(machine->machine_name != NULL){ g_free(machine->machine_name); } audio = machine->audio; /* call parent */ G_OBJECT_CLASS(ags_machine_parent_class)->finalize(gobject); if(audio != NULL){ g_object_unref(G_OBJECT(audio)); } } void ags_machine_connect(AgsConnectable *connectable) { AgsMachine *machine; GList *list_start, *list; /* AgsMachine */ machine = AGS_MACHINE(connectable); if((AGS_MACHINE_CONNECTED & (machine->flags)) != 0){ return; } machine->flags |= AGS_MACHINE_CONNECTED; if((AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) == 0){ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) == 0){ ags_machine_map_recall(machine); } }else{ // machine->flags &= ~AGS_MACHINE_PREMAPPED_RECALL; #ifdef AGS_DEBUG g_message("find port"); #endif ags_machine_find_port(machine); } if(machine->bridge != NULL){ ags_connectable_connect(AGS_CONNECTABLE(machine->bridge)); } if(machine->play != NULL){ g_signal_connect(G_OBJECT(machine->play), "clicked", G_CALLBACK(ags_machine_play_callback), (gpointer) machine); } /* GtkWidget */ // g_signal_connect(G_OBJECT (machine), "button_press_event", // G_CALLBACK(ags_machine_button_press_callback), (gpointer) machine); /* AgsPad - input */ if(machine->input != NULL){ list_start = list = gtk_container_get_children(GTK_CONTAINER(machine->input)); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /* AgsPad - output */ if(machine->output != NULL){ list_start = list = gtk_container_get_children(GTK_CONTAINER(machine->output)); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } } void ags_machine_disconnect(AgsConnectable *connectable) { AgsMachine *machine; GList *list_start, *list; /* AgsMachine */ machine = AGS_MACHINE(connectable); if((AGS_MACHINE_CONNECTED & (machine->flags)) == 0){ return; } machine->flags &= (~AGS_MACHINE_CONNECTED); if(machine->bridge != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(machine->bridge)); } /* AgsPad - input */ if(machine->input != NULL){ list_start = list = gtk_container_get_children(GTK_CONTAINER(machine->input)); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /* AgsPad - output */ if(machine->output != NULL){ list_start = list = gtk_container_get_children(GTK_CONTAINER(machine->output)); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } //TODO:JK: implement me g_signal_handlers_disconnect_by_data(machine->audio, machine); } /** * ags_machine_automation_port_alloc: * @channel_type: the #GType of channel * @control_name: the control name as string * * Allocate #AgsMachineAutomationPort * * Returns: the new allocated #AgsMachineAutomationPort * * Since: 3.0.0 */ AgsMachineAutomationPort* ags_machine_automation_port_alloc(GType channel_type, gchar *control_name) { AgsMachineAutomationPort *automation_port; automation_port = (AgsMachineAutomationPort *) malloc(sizeof(AgsMachineAutomationPort)); automation_port->channel_type = channel_type; automation_port->control_name = g_strdup(control_name); return(automation_port); } /** * ags_machine_automation_port_free: * @automation_port: the #AgsAutomationPort * * Free @automation_port * * Since: 3.0.0 */ void ags_machine_automation_port_free(AgsMachineAutomationPort *automation_port) { if(automation_port == NULL){ return; } g_free(automation_port->control_name); g_free(automation_port); } /** * ags_machine_automation_port_find_channel_type_with_control_name: * @list: a #GList-struct containing #AgsAutomationPort * @channel_type: the #GType to match * @control_name: the control name as string to match * * Find #AgsAutomationPort by specifying channel type and control name. * * Returns: the matching #AgsAutomationPort or %NULL * * Since: 3.0.0 */ GList* ags_machine_automation_port_find_channel_type_with_control_name(GList *list, GType channel_type, gchar *control_name) { while(list != NULL){ if(AGS_MACHINE_AUTOMATION_PORT(list->data)->channel_type == channel_type && !g_strcmp0(AGS_MACHINE_AUTOMATION_PORT(list->data)->control_name, control_name)){ return(list); } list = list->next; } return(NULL); } /** * ags_machine_samplerate_changed: * @machine: the #AgsMachine * @samplerate: the samplerate * @old_samplerate: the old samplerate * * Notify about samplerate changed. * * Since: 3.0.0 */ void ags_machine_samplerate_changed(AgsMachine *machine, guint samplerate, guint old_samplerate) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit(G_OBJECT(machine), machine_signals[SAMPLERATE_CHANGED], 0, samplerate, old_samplerate); g_object_unref((GObject *) machine); } /** * ags_machine_buffer_size_changed: * @machine: the #AgsMachine * @buffer_size: the buffer_size * @old_buffer_size: the old buffer_size * * Notify about buffer_size changed. * * Since: 3.0.0 */ void ags_machine_buffer_size_changed(AgsMachine *machine, guint buffer_size, guint old_buffer_size) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit(G_OBJECT(machine), machine_signals[BUFFER_SIZE_CHANGED], 0, buffer_size, old_buffer_size); g_object_unref((GObject *) machine); } /** * ags_machine_format_changed: * @machine: the #AgsMachine * @format: the format * @old_format: the old format * * Notify about format changed. * * Since: 3.0.0 */ void ags_machine_format_changed(AgsMachine *machine, guint format, guint old_format) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit(G_OBJECT(machine), machine_signals[FORMAT_CHANGED], 0, format, old_format); g_object_unref((GObject *) machine); } void ags_machine_real_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old) { AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_pad_channel; GList *list_output_pad, *list_output_pad_start; GList *list_input_pad, *list_input_pad_start; GList *list_output_pad_next, *list_output_pad_next_start; GList *list_input_pad_next, *list_input_pad_next_start; guint i, j; audio = machine->audio; list_output_pad = list_output_pad_start = NULL; list_input_pad = list_input_pad_start = NULL; if(audio_channels > audio_channels_old){ /* grow lines */ AgsPad *pad; GList *list, *list_start; guint input_pads, output_pads; g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, NULL); if(machine->input != NULL){ list_input_pad_start = list_input_pad = g_list_reverse(gtk_container_get_children((GtkContainer *) machine->input)); } if(machine->output != NULL){ list_output_pad_start = list_output_pad = g_list_reverse(gtk_container_get_children((GtkContainer *) machine->output)); } /* AgsInput */ if(machine->input != NULL){ /* get input */ g_object_get(audio, "input", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_pad_channel = NULL; for(i = 0; i < input_pads; i++){ /* create AgsPad's if necessary or resize */ if(audio_channels_old == 0){ pad = g_object_new(machine->input_pad_type, "channel", channel, NULL); gtk_box_pack_start((GtkBox *) machine->input, (GtkWidget *) pad, FALSE, FALSE, 0); ags_pad_resize_lines((AgsPad *) pad, machine->input_line_type, audio_channels, 0); }else{ pad = AGS_PAD(list_input_pad->data); ags_pad_resize_lines((AgsPad *) pad, machine->input_line_type, audio_channels, audio_channels_old); } /* iterate */ next_pad_channel = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad_channel; if(audio_channels_old != 0){ list_input_pad = list_input_pad->next; } } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_pad_channel != NULL){ g_object_unref(next_pad_channel); } } /* AgsOutput */ if(machine->output != NULL){ /* get output */ g_object_get(audio, "output", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_pad_channel = NULL; for(i = 0; i < output_pads; i++){ /* create AgsPad's if necessary or resize */ if(audio_channels_old == 0){ pad = g_object_new(machine->output_pad_type, "channel", channel, NULL); gtk_box_pack_start((GtkBox *) machine->output, (GtkWidget *) pad, FALSE, FALSE, 0); ags_pad_resize_lines((AgsPad *) pad, machine->output_line_type, audio_channels, 0); }else{ pad = AGS_PAD(list_output_pad->data); ags_pad_resize_lines((AgsPad *) pad, machine->output_line_type, audio_channels, audio_channels_old); } /* iterate */ next_pad_channel = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad_channel; if(audio_channels_old != 0){ list_output_pad = list_output_pad->next; } } } /* show all */ if(audio_channels_old == 0){ if(machine->input != NULL){ list_input_pad_start = list_input_pad = g_list_reverse(gtk_container_get_children((GtkContainer *) machine->input)); } if(machine->output != NULL){ list_output_pad_start = list_output_pad = g_list_reverse(gtk_container_get_children((GtkContainer *) machine->output)); } } if(gtk_widget_get_visible((GtkWidget *) machine)){ if(audio_channels_old == 0){ /* AgsInput */ if(machine->input != NULL){ list_input_pad = list_input_pad_start; while(list_input_pad != NULL){ gtk_widget_show_all(GTK_WIDGET(list_input_pad->data)); list_input_pad = list_input_pad->next; } } /* AgsOutput */ if(machine->output != NULL){ list_output_pad = list_output_pad_start; while(list_input_pad != NULL){ gtk_widget_show_all(GTK_WIDGET(list_input_pad->data)); list_input_pad = list_input_pad->next; } } }else{ if(machine->input != NULL){ GList *list_input_line, *list_input_line_start; list_input_pad = list_input_pad_start; while(list_input_pad != NULL){ list_input_line_start = list_input_line = g_list_reverse(gtk_container_get_children(GTK_CONTAINER(AGS_PAD(list_input_pad->data)->expander_set))); list_input_line = g_list_nth(list_input_line, audio_channels_old); while(list_input_line != NULL){ gtk_widget_show_all(GTK_WIDGET(list_input_line->data)); list_input_line = list_input_line->next; } g_list_free(list_input_line_start); list_input_pad = list_input_pad->next; } } /* AgsOutput */ if(machine->output != NULL){ GList *list_output_line, *list_output_line_start; list_output_pad = list_output_pad_start; while(list_output_pad != NULL){ list_output_line_start = list_output_line = g_list_reverse(gtk_container_get_children(GTK_CONTAINER(AGS_PAD(list_output_pad->data)->expander_set))); list_output_line = g_list_nth(list_output_line, audio_channels_old); while(list_output_line != NULL){ gtk_widget_show_all(GTK_WIDGET(list_output_line->data)); list_output_line = list_output_line->next; } list_output_pad = list_output_pad->next; } } } } g_list_free(list_input_pad_start); g_list_free(list_output_pad_start); }else if(audio_channels < audio_channels_old){ /* shrink lines */ if(machine->output != NULL){ list_output_pad_start = list_output_pad = gtk_container_get_children((GtkContainer *) machine->output); } if(machine->input != NULL){ list_input_pad_start = list_input_pad = gtk_container_get_children((GtkContainer *) machine->input); } if(audio_channels == 0){ /* AgsInput */ if(machine->input != NULL){ while(list_input_pad != NULL){ list_input_pad_next = list_input_pad->next; gtk_widget_destroy(GTK_WIDGET(list_input_pad->data)); list_input_pad = list_input_pad_next; } } /* AgsOutput */ if(machine->output != NULL){ while(list_output_pad != NULL){ list_output_pad_next = list_output_pad->next; gtk_widget_destroy(GTK_WIDGET(list_output_pad->data)); list_output_pad = list_output_pad_next; } } }else{ /* AgsInput */ if(machine->input != NULL){ for(i = 0; list_input_pad != NULL; i++){ ags_pad_resize_lines(AGS_PAD(list_input_pad->data), machine->input_pad_type, audio_channels, audio_channels_old); list_input_pad = list_input_pad->next; } } /* AgsOutput */ if(machine->output != NULL){ for(i = 0; list_output_pad != NULL; i++){ ags_pad_resize_lines(AGS_PAD(list_output_pad->data), machine->output_pad_type, audio_channels, audio_channels_old); list_output_pad = list_output_pad->next; } } } g_list_free(list_output_pad_start); g_list_free(list_input_pad_start); } } /** * ags_machine_resize_audio_channels: * @machine: the #AgsMachine * @new_size: new allocation * @old_size: old allocation * * Resize audio channel allocation. * * Since: 3.0.0 */ void ags_machine_resize_audio_channels(AgsMachine *machine, guint new_size, guint old_size) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit(G_OBJECT(machine), machine_signals[RESIZE_AUDIO_CHANNELS], 0, new_size, old_size); g_object_unref((GObject *) machine); } void ags_machine_real_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old) { AgsPad *pad; AgsAudio *audio; AgsChannel *start_input, *start_output; AgsChannel *input, *next_pad_input, *output, *next_pad_output; GList *list_pad_start, *list_pad; guint audio_channels; guint i, j; audio = machine->audio; if(pads_old < pads){ g_object_get(audio, "audio-channels", &audio_channels, "output", &start_output, "input", &start_input, NULL); /* grow input */ input = start_input; if(input != NULL){ g_object_ref(input); } next_pad_input = NULL; if(machine->input != NULL){ if(channel_type == AGS_TYPE_INPUT){ input = ags_channel_nth(start_input, pads_old * audio_channels); for(i = pads_old; i < pads; i++){ /* instantiate pad */ pad = g_object_new(machine->input_pad_type, "channel", input, NULL); gtk_box_pack_start((GtkBox *) machine->input, (GtkWidget *) pad, FALSE, FALSE, 0); /* resize lines */ ags_pad_resize_lines((AgsPad *) pad, machine->input_line_type, audio_channels, 0); /* iterate */ next_pad_input = ags_channel_next_pad(input); g_object_unref(input); input = next_pad_input; } /* show all */ list_pad_start = list_pad = gtk_container_get_children(GTK_CONTAINER(machine->input)); list_pad = g_list_nth(list_pad, pads_old); while(list_pad != NULL){ gtk_widget_show_all(GTK_WIDGET(list_pad->data)); list_pad = list_pad->next; } g_list_free(list_pad_start); } } if(start_input != NULL){ g_object_unref(start_input); } if(next_pad_input != NULL){ g_object_unref(next_pad_input); } /* grow output */ output = start_output; if(output != NULL){ g_object_ref(output); } next_pad_output = NULL; if(machine->output != NULL){ if(channel_type == AGS_TYPE_OUTPUT){ output = ags_channel_nth(start_output, pads_old * audio_channels); for(i = pads_old; i < pads; i++){ /* instantiate pad */ pad = g_object_new(machine->output_pad_type, "channel", output, NULL); gtk_box_pack_start((GtkBox *) machine->output, (GtkWidget *) pad, FALSE, FALSE, 0); /* resize lines */ ags_pad_resize_lines((AgsPad *) pad, machine->output_line_type, audio_channels, 0); /* iterate */ next_pad_output = ags_channel_next_pad(output); g_object_unref(output); output = next_pad_output; } /* show all */ list_pad_start = list_pad = gtk_container_get_children(GTK_CONTAINER(machine->output)); list_pad = g_list_nth(list_pad, pads_old); while(list_pad != NULL){ gtk_widget_show_all(GTK_WIDGET(list_pad->data)); list_pad = list_pad->next; } g_list_free(list_pad_start); } } if(start_output != NULL){ g_object_unref(start_output); } if(next_pad_output != NULL){ g_object_unref(next_pad_output); } }else if(pads_old > pads){ GList *list, *list_start; /* input - destroy AgsPad's */ if(channel_type == AGS_TYPE_INPUT && machine->input != NULL){ for(i = 0; i < pads_old - pads; i++){ list_start = gtk_container_get_children(GTK_CONTAINER(machine->input)); list = g_list_nth(list_start, pads); if(list != NULL){ gtk_widget_destroy(GTK_WIDGET(list->data)); } g_list_free(list_start); } } /* output - destroy AgsPad's */ if(channel_type == AGS_TYPE_OUTPUT && machine->output != NULL){ for(i = 0; i < pads_old - pads; i++){ list_start = gtk_container_get_children(GTK_CONTAINER(machine->output)); list = g_list_nth(list_start, pads); if(list != NULL){ gtk_widget_destroy(GTK_WIDGET(list->data)); } g_list_free(list_start); } } } } /** * ags_machine_resize_pads: * @machine: the #AgsMachine * @channel_type: the channel #GType * @new_size: new allocation * @old_size: old allocation * * Resize pad allocation. * * Since: 3.0.0 */ void ags_machine_resize_pads(AgsMachine *machine, GType channel_type, guint new_size, guint old_size) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit(G_OBJECT(machine), machine_signals[RESIZE_PADS], 0, channel_type, new_size, old_size); g_object_unref((GObject *) machine); } void ags_machine_real_map_recall(AgsMachine *machine) { if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ return; } machine->flags |= AGS_MACHINE_MAPPED_RECALL; ags_machine_find_port(machine); } /** * ags_machine_map_recall: * @machine: the #AgsMachine to add its default recall. * * You may want the @machine to add its default recall. * * Since: 3.0.0 */ void ags_machine_map_recall(AgsMachine *machine) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit((GObject *) machine, machine_signals[MAP_RECALL], 0); g_object_unref((GObject *) machine); } GList* ags_machine_real_find_port(AgsMachine *machine) { GList *pad, *pad_start; GList *port, *tmp_port; port = NULL; /* find output ports */ if(machine->output != NULL){ pad_start = pad = gtk_container_get_children(machine->output); while(pad != NULL){ tmp_port = ags_pad_find_port(AGS_PAD(pad->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } pad = pad->next; } g_list_free(pad_start); } /* find input ports */ if(machine->input != NULL){ pad_start = pad = gtk_container_get_children(machine->input); while(pad != NULL){ tmp_port = ags_pad_find_port(AGS_PAD(pad->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } pad = pad->next; } g_list_free(pad_start); } /* find bridge ports */ if(machine->bridge != NULL){ tmp_port = ags_effect_bridge_find_port((AgsEffectBridge *) machine->bridge); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } } return(port); } /** * ags_machine_find_port: * @machine: the #AgsMachine * Returns: an #GList containing all related #AgsPort * * Lookup ports of associated recalls. * * Since: 3.0.0 */ GList* ags_machine_find_port(AgsMachine *machine) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_MACHINE(machine), NULL); g_object_ref((GObject *) machine); g_signal_emit((GObject *) machine, machine_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) machine); return(list); } /** * ags_machine_stop: * @machine: the #AgsMachine * @recall_id: the #GList-struct containing #AgsRecallID * @sound_scope: the sound scope * * Notify about to stop playback of @recall_id. * * Since: 3.0.0 */ void ags_machine_stop(AgsMachine *machine, GList *recall_id, gint sound_scope) { g_return_if_fail(AGS_IS_MACHINE(machine)); g_object_ref((GObject *) machine); g_signal_emit((GObject *) machine, machine_signals[STOP], 0, recall_id, sound_scope); g_object_unref((GObject *) machine); } /** * ags_machine_find_by_name: * @list: a #GList of #AgsMachine * @name: the name of machine * * Find the specified by @name machine. * * Returns: the matching #AgsMachine, or %NULL * * Since: 3.0.0 */ AgsMachine* ags_machine_find_by_name(GList *list, char *name) { while(list != NULL){ if(!g_strcmp0(AGS_MACHINE(list->data)->machine_name, name)) return((AgsMachine *) list->data); list = list->next; } return(NULL); } /** * ags_machine_playback_set_active: * @machine: the #AgsMachine * @playback: the #AgsPlayback * @is_active: if %TRUE playback is started, otherwise stopped * * Start/stop @playback of @machine. * * Since: 3.0.0 */ void ags_machine_playback_set_active(AgsMachine *machine, AgsPlayback *playback, gboolean is_active) { AgsChannel *channel; AgsNote *play_note; AgsStartSoundcard *start_soundcard; AgsStartChannel *start_channel; AgsCancelChannel *cancel_channel; AgsResetNote *reset_note; AgsApplicationContext *application_context; GList *start_task; if(!AGS_IS_MACHINE(machine) || !AGS_IS_PLAYBACK(playback)){ return; } application_context = ags_application_context_get_instance(); start_task = NULL; if(is_active){ if(g_list_find(machine->active_playback, playback) != NULL){ return; } machine->active_playback = g_list_prepend(machine->active_playback, playback); g_object_ref(playback); /* start playback of channel */ g_object_get(playback, "channel", &channel, NULL); start_channel = ags_start_channel_new(channel, AGS_SOUND_SCOPE_PLAYBACK); g_signal_connect_after(G_OBJECT(start_channel), "launch", G_CALLBACK(ags_machine_active_playback_start_channel_launch_callback), playback); start_task = g_list_prepend(start_task, start_channel); /* start soundcard */ start_soundcard = ags_start_soundcard_new(application_context); start_task = g_list_prepend(start_task, start_soundcard); /* launch task */ start_task = g_list_reverse(start_task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), start_task); /* feed note */ g_object_get(playback, "play-note", &play_note, NULL); if(ags_note_test_flags(play_note, AGS_NOTE_FEED)){ reset_note = ags_reset_note_get_instance(); ags_reset_note_add(reset_note, play_note); } /* unref */ g_object_unref(channel); g_object_unref(play_note); }else{ if(g_list_find(machine->active_playback, playback) == NULL){ return; } machine->active_playback = g_list_remove(machine->active_playback, playback); g_object_unref(playback); /* cancel playback of channel */ g_object_get(playback, "channel", &channel, NULL); cancel_channel = ags_cancel_channel_new(channel, AGS_SOUND_SCOPE_PLAYBACK); start_task = g_list_prepend(start_task, cancel_channel); /* launch task */ start_task = g_list_reverse(start_task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), start_task); /* feed note */ g_object_get(playback, "play-note", &play_note, NULL); if(ags_note_test_flags(play_note, AGS_NOTE_FEED)){ reset_note = ags_reset_note_get_instance(); ags_reset_note_remove(reset_note, play_note); } /* unref */ g_object_unref(channel); g_object_unref(play_note); } } /** * ags_machine_set_run: * @machine: the #AgsMachine * @run: if %TRUE playback is started, otherwise stopped * * Start/stop playback of @machine. * * Since: 3.0.0 */ void ags_machine_set_run(AgsMachine *machine, gboolean run) { ags_machine_set_run_extended(machine, run, TRUE, TRUE, TRUE, TRUE); } /** * ags_machine_set_run_extended: * @machine: the #AgsMachine * @run: if %TRUE playback is started, otherwise stopped * @sequencer: if doing sequencer * @notation: if doing notation * @wave: if doing wave * @midi: if doing midi * * Start/stop playback of @machine. * * Since: 3.0.0 */ void ags_machine_set_run_extended(AgsMachine *machine, gboolean run, gboolean sequencer, gboolean notation, gboolean wave, gboolean midi) { AgsWindow *window; AgsApplicationContext *application_context; GList *start_list; gboolean no_soundcard; if(!AGS_IS_MACHINE(machine)){ return; } window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) machine); application_context = ags_application_context_get_instance(); no_soundcard = FALSE; if((start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context))) == NULL){ no_soundcard = TRUE; } g_list_free_full(start_list, g_object_unref); if(no_soundcard){ g_message("No soundcard available"); return; } if(run){ AgsStartAudio *start_audio; AgsStartSoundcard *start_soundcard; AgsStartSequencer *start_sequencer; GList *list; list = NULL; if(sequencer){ /* create start task */ start_audio = ags_start_audio_new(machine->audio, AGS_SOUND_SCOPE_SEQUENCER); list = g_list_prepend(list, start_audio); } if(notation){ /* create start task */ start_audio = ags_start_audio_new(machine->audio, AGS_SOUND_SCOPE_NOTATION); list = g_list_prepend(list, start_audio); } if(wave){ /* create start task */ start_audio = ags_start_audio_new(machine->audio, AGS_SOUND_SCOPE_WAVE); list = g_list_prepend(list, start_audio); } if(midi){ /* create start task */ start_audio = ags_start_audio_new(machine->audio, AGS_SOUND_SCOPE_MIDI); list = g_list_prepend(list, start_audio); } /* create start task */ if(list != NULL){ /* start soundcard */ start_soundcard = ags_start_soundcard_new(application_context); list = g_list_prepend(list, start_soundcard); /* start sequencer */ start_sequencer = ags_start_sequencer_new(application_context); list = g_list_prepend(list, start_sequencer); /* append AgsStartSoundcard and AgsStartSequencer */ list = g_list_reverse(list); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), list); } }else{ AgsCancelAudio *cancel_audio; if(sequencer){ /* create cancel task */ cancel_audio = ags_cancel_audio_new(machine->audio, AGS_SOUND_SCOPE_SEQUENCER); /* append AgsCancelAudio */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) cancel_audio); } if(notation){ /* create cancel task */ cancel_audio = ags_cancel_audio_new(machine->audio, AGS_SOUND_SCOPE_NOTATION); /* append AgsCancelAudio */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) cancel_audio); } if(wave){ /* create cancel task */ cancel_audio = ags_cancel_audio_new(machine->audio, AGS_SOUND_SCOPE_WAVE); /* append AgsCancelAudio */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) cancel_audio); } if(midi){ /* create cancel task */ cancel_audio = ags_cancel_audio_new(machine->audio, AGS_SOUND_SCOPE_MIDI); /* append AgsCancelAudio */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) cancel_audio); } } } /** * ags_machine_get_possible_audio_output_connections: * @machine: the #AgsMachine * * Find audio output connections suitable for @machine. * * Returns: a #GtkListStore containing one column with a string representing * machines by its type and name. * * Since: 3.0.0 */ GtkListStore* ags_machine_get_possible_audio_output_connections(AgsMachine *machine) { AgsWindow *window; AgsApplicationContext *application_context; GtkListStore *model; GList *start_list, *list; GtkTreeIter iter; window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); application_context = ags_application_context_get_instance(); model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "NULL", 1, NULL, -1); if(application_context != NULL){ list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ guint soundcard_capability; soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(list->data)); if((AGS_SOUNDCARD_CAPABILITY_PLAYBACK & (soundcard_capability)) != 0 || (AGS_SOUNDCARD_CAPABILITY_DUPLEX & (soundcard_capability)) != 0){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(G_OBJECT(list->data)), ags_soundcard_get_device(AGS_SOUNDCARD(list->data))), 1, list->data, -1); } list = list->next; } g_list_free_full(start_list, g_object_unref); } return(model); } /** * ags_machine_get_possible_audio_input_connections: * @machine: the #AgsMachine * * Find audio input connections suitable for @machine. * * Returns: a #GtkListStore containing one column with a string representing * machines by its type and name. * * Since: 3.0.0 */ GtkListStore* ags_machine_get_possible_audio_input_connections(AgsMachine *machine) { AgsWindow *window; AgsApplicationContext *application_context; GtkListStore *model; GList *start_list, *list; GtkTreeIter iter; window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); if(window != NULL){ application_context = ags_application_context_get_instance(); }else{ application_context = NULL; } model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "NULL", 1, NULL, -1); if(application_context != NULL){ list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ guint soundcard_capability; soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(list->data)); if((AGS_SOUNDCARD_CAPABILITY_CAPTURE & (soundcard_capability)) != 0 || (AGS_SOUNDCARD_CAPABILITY_DUPLEX & (soundcard_capability)) != 0){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(G_OBJECT(list->data)), ags_soundcard_get_device(AGS_SOUNDCARD(list->data))), 1, list->data, -1); } list = list->next; } g_list_free_full(start_list, g_object_unref); } return(model); } /** * ags_machine_get_possible_links: * @machine: the #AgsMachine * * Find links suitable for @machine. * * Returns: a #GtkListStore containing one column with a string representing * machines by its type and name. * * Since: 3.0.0 */ GtkListStore* ags_machine_get_possible_links(AgsMachine *machine) { GtkListStore *model; GList *list; GtkTreeIter iter; model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "NULL", 1, NULL, -1); if(gtk_widget_get_parent(GTK_WIDGET(machine)) != NULL){ list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(machine)))); while(list != NULL){ if(list->data != machine){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(G_OBJECT(list->data)), AGS_MACHINE(list->data)->machine_name), 1, list->data, -1); } list = list->next; } } return(model); } /** * ags_machine_file_chooser_dialog_new: * @machine: the #AgsMachine * * Creates a new machine file chooser dialog in order to * open audio files. * * Returns: a new #GtkFileChooserDialog * * Since: 3.0.0 */ GtkFileChooserDialog* ags_machine_file_chooser_dialog_new(AgsMachine *machine) { GtkFileChooserDialog *file_chooser; GtkCheckButton *check_button; file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new(i18n("Open audio files"), (GtkWindow *) gtk_widget_get_toplevel((GtkWidget *) machine), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), TRUE); check_button = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("open in new channel")); gtk_toggle_button_set_active((GtkToggleButton *) check_button, TRUE); gtk_box_pack_start(gtk_dialog_get_content_area(GTK_DIALOG(file_chooser)), (GtkWidget *) check_button, FALSE, FALSE, 0); g_object_set_data((GObject *) file_chooser, "create", (gpointer) check_button); check_button = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("overwrite existing links")); gtk_toggle_button_set_active((GtkToggleButton *) check_button, TRUE); gtk_box_pack_start(gtk_dialog_get_content_area(GTK_DIALOG(file_chooser)), (GtkWidget *) check_button, FALSE, FALSE, 0); g_object_set_data((GObject *) file_chooser, "overwrite", (gpointer) check_button); return(file_chooser); } /** * ags_machine_open_files: * @machine: the #AgsMachine * @filenames: the filenames * @overwrite_channels: reset channels * @create_channels: instantiate new channels * * Opens audio files and modifies or creates new channels if wished. * * Since: 3.0.0 */ void ags_machine_open_files(AgsMachine *machine, GSList *filenames, gboolean overwrite_channels, gboolean create_channels) { AgsWindow *window; AgsOpenFile *open_file; AgsApplicationContext *application_context; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) machine); application_context = ags_application_context_get_instance(); /* instantiate open file task */ open_file = ags_open_file_new(machine->audio, filenames, overwrite_channels, create_channels); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) open_file); } xmlNode* ags_machine_copy_pattern_to_notation(AgsMachine *machine, AgsChannel *start_current, guint input_pads) { AgsChannel *current, *next_current; AgsPattern *pattern; xmlNode *notation_node, *current_note; GList *start_list; gchar *str; guint audio_channel; guint x_boundary, y_boundary; guint bank_0, bank_1, k; current = start_current; audio_channel = 0; if(current != NULL){ g_object_ref(current); g_object_get(current, "audio-channel", &audio_channel, NULL); } next_current = NULL; /* create root node */ notation_node = xmlNewNode(NULL, BAD_CAST "notation"); xmlNewProp(notation_node, BAD_CAST "program", BAD_CAST "ags"); xmlNewProp(notation_node, BAD_CAST "type", BAD_CAST AGS_NOTATION_CLIPBOARD_TYPE); xmlNewProp(notation_node, BAD_CAST "version", BAD_CAST AGS_NOTATION_CLIPBOARD_VERSION); xmlNewProp(notation_node, BAD_CAST "format", BAD_CAST AGS_NOTATION_CLIPBOARD_FORMAT); xmlNewProp(notation_node, BAD_CAST "base_frequency", BAD_CAST "0"); str = g_strdup_printf("%u", audio_channel); xmlNewProp(notation_node, BAD_CAST "audio-channel", BAD_CAST str); g_free(str); bank_0 = machine->bank_0; bank_1 = machine->bank_1; x_boundary = G_MAXUINT; y_boundary = G_MAXUINT; while(current != NULL){ guint length; GRecMutex *pattern_mutex; g_object_get(current, "pattern", &start_list, NULL); pattern = start_list->data; g_object_ref(pattern); g_list_free_full(start_list, g_object_unref); /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* get length */ g_rec_mutex_lock(pattern_mutex); length = pattern->dim[2]; g_rec_mutex_unlock(pattern_mutex); for(k = 0; k < length; k++){ guint current_pad; g_object_get(current, "pad", ¤t_pad, NULL); if(ags_pattern_get_bit(pattern, bank_0, bank_1, k)){ current_note = xmlNewChild(notation_node, NULL, BAD_CAST "note", NULL); xmlNewProp(current_note, BAD_CAST "x", BAD_CAST g_strdup_printf("%u", k)); xmlNewProp(current_note, BAD_CAST "x1", BAD_CAST g_strdup_printf("%u", k + 1)); if((AGS_MACHINE_REVERSE_NOTATION & (machine->flags)) != 0){ xmlNewProp(current_note, BAD_CAST "y", BAD_CAST g_strdup_printf("%u", input_pads - current_pad - 1)); }else{ xmlNewProp(current_note, BAD_CAST "y", BAD_CAST g_strdup_printf("%u", current_pad)); } if(x_boundary > k){ x_boundary = k; } if((AGS_MACHINE_REVERSE_NOTATION & (machine->flags)) != 0){ guint tmp; tmp = input_pads - current_pad - 1; if(y_boundary > tmp){ y_boundary = tmp; } }else{ if(y_boundary > current->pad){ y_boundary = current->pad; } } } } g_object_unref(pattern); /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } xmlNewProp(notation_node, BAD_CAST "x_boundary", BAD_CAST g_strdup_printf("%u", x_boundary)); xmlNewProp(notation_node, BAD_CAST "y_boundary", BAD_CAST g_strdup_printf("%u", y_boundary)); return(notation_node); } void ags_machine_copy_pattern(AgsMachine *machine) { AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; xmlDoc *clipboard; xmlNode *audio_node, *notation_list_node, *notation_node; xmlChar *buffer; guint audio_channels; guint input_pads; int size; gint i; /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); notation_list_node = xmlNewNode(NULL, BAD_CAST "notation-list"); xmlAddChild(audio_node, notation_list_node); audio = machine->audio; /* copy to clipboard */ g_object_get(audio, "audio-channels", &audio_channels, "input-pads", &input_pads, "input", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; i < audio_channels; i++){ /* do it so */ notation_node = ags_machine_copy_pattern_to_notation(machine, channel, input_pads); xmlAddChild(notation_list_node, notation_node); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } } /** * ags_machine_check_message: * @machine: the #AgsMachine * * Check message queue for message envelopes. * * Since: 3.0.0 */ void ags_machine_check_message(AgsMachine *machine) { AgsMessageDelivery *message_delivery; GList *start_message_envelope, *message_envelope; GList *start_active_playback, *active_playback; if(!AGS_IS_MACHINE(machine)){ return; } /* retrieve message */ message_delivery = ags_message_delivery_get_instance(); message_envelope = start_message_envelope = ags_message_delivery_find_sender(message_delivery, "libgsequencer", (GObject *) machine->audio); while(message_envelope != NULL){ xmlNode *root_node; root_node = xmlDocGetRootElement(AGS_MESSAGE_ENVELOPE(message_envelope->data)->doc); if(!xmlStrncmp(root_node->name, "ags-command", 12)){ if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsAudio::set-samplerate", 25)){ guint samplerate; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "samplerate"); samplerate = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set samplerate */ g_object_set(machine, "samplerate", samplerate, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsAudio::set-buffer-size", 26)){ guint buffer_size; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "buffer-size"); buffer_size = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set buffer size */ g_object_set(machine, "buffer-size", buffer_size, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsAudio::set-format", 21)){ guint format; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "format"); format = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set format */ g_object_set(machine, "format", format, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsAudio::set-audio-channels", 29)){ guint audio_channels, audio_channels_old; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "audio-channels"); audio_channels = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "audio-channels-old"); audio_channels_old = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* resize audio channels */ ags_machine_resize_audio_channels(machine, audio_channels, audio_channels_old); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsAudio::set-pads", 19)){ GType channel_type; guint pads, pads_old; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "channel-type"); channel_type = g_value_get_ulong(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "pads"); pads = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "pads-old"); pads_old = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* resize pads */ ags_machine_resize_pads(machine, channel_type, pads, pads_old); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsAudio::stop", 15)){ GList *recall_id; gint sound_scope; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "recall-id"); recall_id = g_value_get_pointer(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "sound-scope"); sound_scope = g_value_get_int(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* stop */ ags_machine_stop(machine, recall_id, sound_scope); } } message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, (GDestroyNotify) g_object_unref); /* */ active_playback = start_active_playback = g_list_copy(machine->active_playback); while(active_playback != NULL){ AgsChannel *channel; AgsPlayback *playback; playback = active_playback->data; g_object_ref(playback); g_object_get(playback, "channel", &channel, NULL); message_envelope = start_message_envelope = ags_message_delivery_find_sender(message_delivery, "libgsequencer", (GObject *) channel); while(message_envelope != NULL){ xmlNode *root_node; root_node = xmlDocGetRootElement(AGS_MESSAGE_ENVELOPE(message_envelope->data)->doc); if(!xmlStrncmp(root_node->name, "ags-command", 12)){ if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::stop", 18)){ ags_machine_playback_set_active(machine, playback, FALSE); } } message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, (GDestroyNotify) g_object_unref); g_object_unref(channel); g_object_unref(playback); active_playback = active_playback->next; } g_list_free(start_active_playback); } /** * ags_machine_new: * @soundcard: the assigned soundcard. * * Creates an #AgsMachine * * Returns: a new #AgsMachine * * Since: 3.0.0 */ AgsMachine* ags_machine_new(GObject *soundcard) { AgsMachine *machine; GValue value; machine = (AgsMachine *) g_object_new(AGS_TYPE_MACHINE, NULL); g_value_init(&value, G_TYPE_OBJECT); g_value_set_object(&value, soundcard); g_object_set_property(G_OBJECT(machine->audio), "soundcard", &value); g_value_unset(&value); return(machine); } /** * ags_machine_popup_new: * @machine: the assigned machine. * * Creates #GtkMenu to use as @machine's popup context menu. * * Returns: a new #GtkMenu containing basic actions. * * Since: 3.0.0 */ GtkMenu* ags_machine_popup_new(AgsMachine *machine) { GtkMenu *popup; GtkMenuItem *item; GList *list, *list_start; popup = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("move up")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("move down")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("hide")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("show")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("destroy")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("rename")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("rename audio")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("reposition audio")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("properties")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_check_menu_item_new_with_label(i18n("sticky controls")); gtk_menu_shell_append((GtkMenuShell *) popup, (GtkWidget*) item); list_start = list = gtk_container_get_children((GtkContainer *) popup); g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_move_up_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_move_down_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_hide_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_show_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_destroy_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_rename_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_rename_audio_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_reposition_audio_activate_callback), (gpointer) machine); list = list->next; g_signal_connect((GObject*) list->data, "activate", G_CALLBACK(ags_machine_popup_properties_activate_callback), (gpointer) machine); list = list->next; g_signal_connect_after((GObject*) list->data, "toggled", G_CALLBACK(ags_machine_popup_sticky_controls_toggled_callback), (gpointer) machine); g_list_free(list_start); gtk_widget_show_all((GtkWidget*) popup); return(popup); } /** * ags_machine_popup_add_edit_options: * @machine: the assigned machine. * @edit_options: the options to set * * Add options to edit submenu * * Since: 3.0.0 */ void ags_machine_popup_add_edit_options(AgsMachine *machine, guint edit_options) { GtkMenu *edit; GtkMenuItem *item; item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("edit")); gtk_menu_shell_append((GtkMenuShell *) machine->popup, (GtkWidget*) item); gtk_widget_show((GtkWidget *) item); edit = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu(item, (GtkWidget *) edit); gtk_widget_show((GtkWidget *) edit); if((AGS_MACHINE_POPUP_COPY_PATTERN & edit_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("copy pattern")); gtk_menu_shell_append((GtkMenuShell *) edit, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_copy_pattern_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } if((AGS_MACHINE_POPUP_PASTE_PATTERN & edit_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("paste pattern")); gtk_menu_shell_append((GtkMenuShell *) edit, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_paste_pattern_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } if((AGS_MACHINE_POPUP_ENVELOPE & edit_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("envelope")); gtk_menu_shell_append((GtkMenuShell *) edit, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_envelope_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } gtk_widget_show_all((GtkWidget *) machine->popup); } /** * ags_machine_popup_add_connection_options: * @machine: the assigned machine. * @connection_options: the options to set * * Add options to connection submenu * * Since: 3.0.0 */ void ags_machine_popup_add_connection_options(AgsMachine *machine, guint connection_options) { GtkMenu *connection; GtkMenuItem *item; gchar *str; item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("connection")); gtk_menu_shell_append((GtkMenuShell *) machine->popup, (GtkWidget*) item); gtk_widget_show((GtkWidget *) item); connection = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu(item, (GtkWidget *) connection); gtk_widget_show((GtkWidget *) connection); if((AGS_MACHINE_POPUP_CONNECTION_EDITOR & connection_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("audio connection")); gtk_menu_shell_append((GtkMenuShell *) connection, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_connection_editor_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } if((AGS_MACHINE_POPUP_MIDI_DIALOG & connection_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("MIDI dialog")); gtk_menu_shell_append((GtkMenuShell *) connection, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_midi_dialog_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } gtk_widget_show_all((GtkWidget *) machine->popup); } void ags_machine_popup_add_export_options(AgsMachine *machine, guint export_options) { GtkMenu *export; GtkMenuItem *item; gchar *str; item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export")); gtk_menu_shell_append((GtkMenuShell *) machine->popup, (GtkWidget*) item); gtk_widget_show((GtkWidget *) item); export = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu(item, (GtkWidget *) export); gtk_widget_show((GtkWidget *) export); if((AGS_MACHINE_POPUP_MIDI_EXPORT & export_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("MIDI export")); gtk_menu_shell_append((GtkMenuShell *) export, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_midi_export_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } if((AGS_MACHINE_POPUP_WAVE_EXPORT & export_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Audio export")); gtk_menu_shell_append((GtkMenuShell *) export, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_wave_export_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } gtk_widget_show_all((GtkWidget *) machine->popup); } void ags_machine_popup_add_import_options(AgsMachine *machine, guint import_options) { GtkMenu *import; GtkMenuItem *item; gchar *str; item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("import")); gtk_menu_shell_append((GtkMenuShell *) machine->popup, (GtkWidget*) item); gtk_widget_show((GtkWidget *) item); import = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu(item, (GtkWidget *) import); gtk_widget_show((GtkWidget *) import); if((AGS_MACHINE_POPUP_MIDI_IMPORT & import_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("MIDI import")); gtk_menu_shell_append((GtkMenuShell *) import, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_midi_import_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } if((AGS_MACHINE_POPUP_WAVE_IMPORT & import_options) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Audio import")); gtk_menu_shell_append((GtkMenuShell *) import, (GtkWidget*) item); g_signal_connect((GObject*) item, "activate", G_CALLBACK(ags_machine_popup_wave_import_callback), (gpointer) machine); gtk_widget_show((GtkWidget *) item); } gtk_widget_show_all((GtkWidget *) machine->popup); } gsequencer-3.1.3/ags/X/ags_bulk_member.h0000644000175000017500000000761013607210263015054 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BULK_MEMBER_H__ #define __AGS_BULK_MEMBER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BULK_MEMBER (ags_bulk_member_get_type()) #define AGS_BULK_MEMBER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BULK_MEMBER, AgsBulkMember)) #define AGS_BULK_MEMBER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BULK_MEMBER, AgsBulkMemberClass)) #define AGS_IS_BULK_MEMBER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_BULK_MEMBER)) #define AGS_IS_BULK_MEMBER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_BULK_MEMBER)) #define AGS_BULK_MEMBER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_BULK_MEMBER, AgsBulkMemberClass)) #define AGS_BULK_PORT(ptr) ((AgsBulkPort *)(ptr)) #define AGS_BULK_MEMBER_DEFAULT_VERSION "0.7.21" #define AGS_BULK_MEMBER_DEFAULT_BUILD_ID "CEST 01-03-2016 00:23" typedef struct _AgsBulkMember AgsBulkMember; typedef struct _AgsBulkMemberClass AgsBulkMemberClass; typedef struct _AgsBulkPort AgsBulkPort; typedef enum{ AGS_BULK_MEMBER_CONNECTED = 1, AGS_BULK_MEMBER_DEFAULT_TEMPLATE = 1 << 1, AGS_BULK_MEMBER_RESET_BY_ATOMIC = 1 << 2, AGS_BULK_MEMBER_RESET_BY_TASK = 1 << 3, AGS_BULK_MEMBER_APPLY_RECALL = 1 << 4, AGS_BULK_MEMBER_NO_UPDATE = 1 << 5, AGS_BULK_MEMBER_APPLY_INITIAL = 1 << 6, }AgsBulkMemberFlags; typedef enum{ AGS_BULK_MEMBER_PORT_BOOLEAN = 1, AGS_BULK_MEMBER_PORT_INTEGER = 1 << 1, }AgsBulkMemberPortFlags; struct _AgsBulkMember { GtkFrame frame; guint flags; guint port_flags; gchar *version; gchar *build_id; GList *handler; GType widget_type; gchar *widget_label; gchar *filename; gchar *effect; gchar *plugin_name; gchar *specifier; guint port_index; gchar *control_port; guint scale_precision; gdouble step_count; AgsConversion *conversion; GList *bulk_port; GList *recall_bulk_port; GType task_type; }; struct _AgsBulkMemberClass { GtkFrameClass frame; void (*change_port)(AgsBulkMember *bulk_member, gpointer port_data); GList* (*find_port)(AgsBulkMember *bulk_member); }; struct _AgsBulkPort { AgsPort *port; guint pad; guint audio_channel; gpointer port_data; gboolean active; }; GType ags_bulk_member_get_type(void); AgsBulkPort* ags_bulk_port_alloc(AgsPort *port, guint pad, guint audio_channel); void ags_bulk_port_free(AgsBulkPort *bulk_port); GList* ags_bulk_port_find(GList *list, AgsPort *port); GtkWidget* ags_bulk_member_get_widget(AgsBulkMember *bulk_member); void ags_bulk_member_set_label(AgsBulkMember *bulk_member, gchar *label); void ags_bulk_member_change_port(AgsBulkMember *bulk_member, gpointer port_data); GList* ags_bulk_member_find_port(AgsBulkMember *bulk_member); GList* ags_bulk_member_find_effect_and_specifier(GList *bulk_member, gchar *filename, gchar *effect, gchar *specifier); AgsBulkMember* ags_bulk_member_new(); G_END_DECLS #endif /*__AGS_BULK_MEMBER_H__*/ gsequencer-3.1.3/ags/X/ags_output_listing_editor.c0000644000175000017500000002775713607210263017240 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_output_listing_editor_class_init(AgsOutputListingEditorClass *output_listing_editor); void ags_output_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_output_listing_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_output_listing_editor_init(AgsOutputListingEditor *output_listing_editor); void ags_output_listing_editor_connect(AgsConnectable *connectable); void ags_output_listing_editor_disconnect(AgsConnectable *connectable); void ags_output_listing_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_output_listing_editor_apply(AgsApplicable *applicable); void ags_output_listing_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_output_listing_editor * @short_description: pack output editors * @title: AgsOutputListingEditor * @section_id: * @include: ags/X/ags_output_listing_editor.h * * #AgsOutputListingEditor is a composite widget to pack #AgsOutputEditor. */ static gpointer ags_output_listing_editor_parent_class = NULL; static AgsConnectableInterface* ags_output_listing_editor_parent_connectable_interface; GType ags_output_listing_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_output_listing_editor = 0; static const GTypeInfo ags_output_listing_editor_info = { sizeof (AgsOutputListingEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_output_listing_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOutputListingEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_output_listing_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_output_listing_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_output_listing_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_output_listing_editor = g_type_register_static(AGS_TYPE_PROPERTY_LISTING_EDITOR, "AgsOutputListingEditor", &ags_output_listing_editor_info, 0); g_type_add_interface_static(ags_type_output_listing_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_output_listing_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_output_listing_editor); } return g_define_type_id__volatile; } void ags_output_listing_editor_class_init(AgsOutputListingEditorClass *output_listing_editor) { } void ags_output_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable) { ags_output_listing_editor_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_output_listing_editor_connect; connectable->disconnect = ags_output_listing_editor_disconnect; } void ags_output_listing_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_output_listing_editor_set_update; applicable->apply = ags_output_listing_editor_apply; applicable->reset = ags_output_listing_editor_reset; } void ags_output_listing_editor_init(AgsOutputListingEditor *output_listing_editor) { g_signal_connect_after(G_OBJECT(output_listing_editor), "parent_set", G_CALLBACK(ags_output_listing_editor_parent_set_callback), output_listing_editor); output_listing_editor->channel_type = G_TYPE_NONE; output_listing_editor->child = NULL; } void ags_output_listing_editor_connect(AgsConnectable *connectable) { AgsConnectionEditor *connection_editor; AgsOutputListingEditor *output_listing_editor; GList *pad_editor, *pad_editor_start; output_listing_editor = AGS_OUTPUT_LISTING_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(output_listing_editor)->flags)) != 0){ return; } ags_output_listing_editor_parent_connectable_interface->connect(connectable); connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(GTK_WIDGET(output_listing_editor), AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ g_signal_connect_after(G_OBJECT(connection_editor->machine), "resize-pads", G_CALLBACK(ags_output_listing_editor_resize_pads_callback), output_listing_editor); } /* AgsPadEditor */ if(output_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(output_listing_editor->child)); while(pad_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_output_listing_editor_disconnect(AgsConnectable *connectable) { AgsConnectionEditor *connection_editor; AgsOutputListingEditor *output_listing_editor; GList *pad_editor, *pad_editor_start; output_listing_editor = AGS_OUTPUT_LISTING_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(output_listing_editor)->flags)) == 0){ return; } ags_output_listing_editor_parent_connectable_interface->disconnect(connectable); connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(GTK_WIDGET(output_listing_editor), AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ g_object_disconnect(G_OBJECT(connection_editor->machine), "any_signal::resize-pads", G_CALLBACK(ags_output_listing_editor_resize_pads_callback), output_listing_editor, NULL); } /* AgsPadEditor */ if(output_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(output_listing_editor->child)); while(pad_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_output_listing_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsOutputListingEditor *output_listing_editor; GList *pad_editor, *pad_editor_start; output_listing_editor = AGS_OUTPUT_LISTING_EDITOR(applicable); if(output_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(output_listing_editor->child)); while(pad_editor != NULL){ ags_applicable_set_update(AGS_APPLICABLE(pad_editor->data), update); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_output_listing_editor_apply(AgsApplicable *applicable) { AgsOutputListingEditor *output_listing_editor; GList *pad_editor, *pad_editor_start; output_listing_editor = AGS_OUTPUT_LISTING_EDITOR(applicable); if((AGS_PROPERTY_EDITOR_ENABLED & (AGS_PROPERTY_EDITOR(output_listing_editor)->flags)) == 0){ return; } if(output_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(output_listing_editor->child)); while(pad_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_output_listing_editor_reset(AgsApplicable *applicable) { AgsOutputListingEditor *output_listing_editor; GList *pad_editor, *pad_editor_start; output_listing_editor = AGS_OUTPUT_LISTING_EDITOR(applicable); if(output_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(output_listing_editor->child)); while(pad_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } /** * ags_output_listing_editor_add_children: * @output_listing_editor: the #AgsOutputListingEditor * @audio: the #AgsAudio to use * @nth: nth channel to start creation until end * @connect: if %TRUE widget is connected and shown * * Creates new pad editors or destroys them. * * Since: 3.0.0 */ void ags_output_listing_editor_add_children(AgsOutputListingEditor *output_listing_editor, AgsAudio *audio, guint nth, gboolean connect) { AgsPadEditor *pad_editor; GtkVBox *vbox; AgsChannel *start_channel; AgsChannel *channel, *next_pad, *nth_channel; if(nth == 0 && output_listing_editor->child != NULL){ vbox = output_listing_editor->child; output_listing_editor->child = NULL; gtk_widget_destroy(GTK_WIDGET(vbox)); } if(audio == NULL){ return; } /* instantiate pad editor vbox */ if(nth == 0){ output_listing_editor->child = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(output_listing_editor), GTK_WIDGET(output_listing_editor->child), FALSE, FALSE, 0); } /* get current channel */ if(g_type_is_a(output_listing_editor->channel_type, AGS_TYPE_OUTPUT)){ g_object_get(audio, "output", &start_channel, NULL); }else if(g_type_is_a(output_listing_editor->channel_type, AGS_TYPE_INPUT)){ g_object_get(audio, "input", &start_channel, NULL); }else{ start_channel = NULL; } nth_channel = ags_channel_nth(start_channel, nth); channel = nth_channel; next_pad = NULL; while(channel != NULL){ /* instantiate pad editor */ pad_editor = ags_pad_editor_new(NULL); pad_editor->editor_type_count = 1; pad_editor->editor_type = (GType *) malloc(pad_editor->editor_type_count * sizeof(GType)); pad_editor->editor_type[0] = AGS_TYPE_OUTPUT_EDITOR; g_object_set(pad_editor, "channel", channel, NULL); gtk_box_pack_start(GTK_BOX(output_listing_editor->child), GTK_WIDGET(pad_editor), FALSE, FALSE, 0); if(connect){ ags_connectable_connect(AGS_CONNECTABLE(pad_editor)); gtk_widget_show_all(GTK_WIDGET(pad_editor)); } /* iterate */ next_pad = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } } /** * ags_output_listing_editor_new: * @channel_type: the channel type to represent * * Create a new instance of #AgsOutputListingEditor * * Returns: the new #AgsOutputListingEditor * * Since: 3.0.0 */ AgsOutputListingEditor* ags_output_listing_editor_new(GType channel_type) { AgsOutputListingEditor *output_listing_editor; output_listing_editor = (AgsOutputListingEditor *) g_object_new(AGS_TYPE_OUTPUT_LISTING_EDITOR, NULL); output_listing_editor->channel_type = channel_type; return(output_listing_editor); } gsequencer-3.1.3/ags/X/ags_wave_editor_callbacks.h0000644000175000017500000000402313607210263017072 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EDITOR_CALLBACKS_H__ #define __AGS_WAVE_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS gboolean ags_wave_editor_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsWaveEditor *wave_editor); void ags_wave_editor_vscrollbar_value_changed(GtkRange *range, AgsWaveEditor *wave_editor); void ags_wave_editor_hscrollbar_value_changed(GtkRange *range, AgsWaveEditor *wave_editor); void ags_wave_editor_wave_edit_hscrollbar_value_changed(GtkRange *range, AgsWaveEditor *wave_editor); void ags_wave_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsWaveEditor *wave_editor); void ags_wave_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsWaveEditor *wave_editor); void ags_wave_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsWaveEditor *wave_editor); G_END_DECLS #endif /*__AGS_WAVE_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_input_listing_editor_callbacks.h0000644000175000017500000000275313607210263021030 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_LISTING_EDITOR_CALLBACKS_H__ #define __AGS_INPUT_LISTING_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_input_listing_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsInputListingEditor *input_listing_editor); void ags_input_listing_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsInputListingEditor *input_listing_editor); G_END_DECLS #endif /*__AGS_INPUT_LISTING_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_machine_editor_callbacks.c0000644000175000017500000000305613607210263017534 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include int ags_machine_editor_apply_callback(GtkWidget *widget, AgsMachineEditor *machine_editor) { ags_applicable_apply(AGS_APPLICABLE(machine_editor)); //TODO:JK: remove me // ags_applicable_reset(AGS_APPLICABLE(machine_editor)); return(0); } int ags_machine_editor_ok_callback(GtkWidget *widget, AgsMachineEditor *machine_editor) { // ags_applicable_set_update(AGS_APPLICABLE(machine_editor), FALSE); ags_connectable_disconnect(AGS_CONNECTABLE(machine_editor)); ags_applicable_apply(AGS_APPLICABLE(machine_editor)); gtk_widget_destroy((GtkWidget *) machine_editor); return(0); } int ags_machine_editor_cancel_callback(GtkWidget *widget, AgsMachineEditor *machine_editor) { gtk_widget_destroy((GtkWidget *) machine_editor); return(0); } gsequencer-3.1.3/ags/X/ags_input_collection_editor_callbacks.h0000644000175000017500000000265213607210263021510 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_COLLECTION_EDITOR_CALLBACKS_H__ #define __AGS_INPUT_COLLECTION_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_input_collection_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsInputCollectionEditor *input_collection_editor); void ags_input_collection_editor_soundcard_callback(GtkWidget *combo_box, AgsInputCollectionEditor *input_collection_editor); G_END_DECLS #endif /*__AGS_INPUT_COLLECTION_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_performance_preferences.h0000644000175000017500000000505313607210263017451 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PERFORMANCE_PREFERENCES_H__ #define __AGS_PERFORMANCE_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PERFORMANCE_PREFERENCES (ags_performance_preferences_get_type()) #define AGS_PERFORMANCE_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PERFORMANCE_PREFERENCES, AgsPerformancePreferences)) #define AGS_PERFORMANCE_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PERFORMANCE_PREFERENCES, AgsPerformancePreferencesClass)) #define AGS_IS_PERFORMANCE_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PERFORMANCE_PREFERENCES)) #define AGS_IS_PERFORMANCE_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PERFORMANCE_PREFERENCES)) #define AGS_PERFORMANCE_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PERFORMANCE_PREFERENCES, AgsPerformancePreferencesClass)) typedef struct _AgsPerformancePreferences AgsPerformancePreferences; typedef struct _AgsPerformancePreferencesClass AgsPerformancePreferencesClass; typedef enum{ AGS_PERFORMANCE_PREFERENCES_CONNECTED = 1, }AgsPerformancePreferencesFlags; struct _AgsPerformancePreferences { GtkVBox vbox; guint flags; GtkCheckButton *stream_auto_sense; GtkCheckButton *super_threaded_audio; GtkCheckButton *super_threaded_channel; GtkSpinButton *thread_pool_max_unused_threads; GtkComboBoxText *max_precision; }; struct _AgsPerformancePreferencesClass { GtkVBoxClass vbox; }; GType ags_performance_preferences_get_type(void); AgsPerformancePreferences* ags_performance_preferences_new(); G_END_DECLS #endif /*__AGS_PERFORMANCE_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_listing_editor_callbacks.h0000644000175000017500000000266413607210263017612 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LISTING_EDITOR_CALLBACKS_H__ #define __AGS_LISTING_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_listing_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsListingEditor *listing_editor); void ags_listing_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsListingEditor *listing_editor); G_END_DECLS #endif /*__AGS_LISTING_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_automation_editor_callbacks.h0000644000175000017500000000630113607210263020311 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_EDITOR_CALLBACKS_H__ #define __AGS_AUTOMATION_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS gboolean ags_automation_editor_audio_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEditor *automation_editor); gboolean ags_automation_editor_output_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEditor *automation_editor); gboolean ags_automation_editor_input_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEditor *automation_editor); void ags_automation_editor_audio_vscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_audio_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_output_vscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_output_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_input_vscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_input_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_audio_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_output_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_input_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor); void ags_automation_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsAutomationEditor *automation_editor); void ags_automation_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsAutomationEditor *automation_editor); void ags_automation_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsAutomationEditor *automation_editor); G_END_DECLS #endif /*__AGS_AUTOMATION_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_automation_window.h0000644000175000017500000000456313607210263016343 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_WINDOW_H__ #define __AGS_AUTOMATION_WINDOW_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION_WINDOW (ags_automation_window_get_type()) #define AGS_AUTOMATION_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION_WINDOW, AgsAutomationWindow)) #define AGS_AUTOMATION_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION_WINDOW, AgsAutomationWindowClass)) #define AGS_IS_AUTOMATION_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUTOMATION_WINDOW)) #define AGS_IS_AUTOMATION_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_AUTOMATION_WINDOW)) #define AGS_AUTOMATION_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_AUTOMATION_WINDOW, AgsAutomationWindowClass)) typedef struct _AgsAutomationWindow AgsAutomationWindow; typedef struct _AgsAutomationWindowClass AgsAutomationWindowClass; typedef enum{ AGS_AUTOMATION_WINDOW_CONNECTED = 1, AGS_AUTOMATION_WINDOW_LIVE_AUTOMATION = 1 << 1, }AgsAutomationWindowFlags; struct _AgsAutomationWindow { GtkWindow window; guint flags; GtkWidget *parent_window; AgsAutomationEditor *automation_editor; }; struct _AgsAutomationWindowClass { GtkWindowClass window; }; GType ags_automation_window_get_type(void); AgsAutomationWindow* ags_automation_window_new(GtkWidget *parent_window); G_END_DECLS #endif /*__AGS_AUTOMATION_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_pad_editor_callbacks.h0000644000175000017500000000242513607210263016700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PAD_EDITOR_CALLBACKS_H__ #define __AGS_PAD_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_pad_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsPadEditor *pad_editor); G_END_DECLS #endif /*__AGS_PAD_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_wave_window.c0000644000175000017500000001450213607210263015112 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_wave_window_class_init(AgsWaveWindowClass *wave_window); void ags_wave_window_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wave_window_init(AgsWaveWindow *wave_window); void ags_wave_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_window_finalize(GObject *gobject); void ags_wave_window_connect(AgsConnectable *connectable); void ags_wave_window_disconnect(AgsConnectable *connectable); gboolean ags_wave_window_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_wave_window * @short_description: The wave window * @title: AgsWaveWindow * @section_id: * @include: ags/X/ags_wave_window.h * * #AgsWaveWindow lets you edit audio files. */ enum{ PROP_0, }; static gpointer ags_wave_window_parent_class = NULL; GType ags_wave_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_window = 0; static const GTypeInfo ags_wave_window_info = { sizeof (AgsWaveWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_window_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wave_window_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wave_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsWaveWindow", &ags_wave_window_info, 0); g_type_add_interface_static(ags_type_wave_window, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_window); } return g_define_type_id__volatile; } void ags_wave_window_class_init(AgsWaveWindowClass *wave_window) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_wave_window_parent_class = g_type_class_peek_parent(wave_window); /* GObjectClass */ gobject = (GObjectClass *) wave_window; gobject->set_property = ags_wave_window_set_property; gobject->get_property = ags_wave_window_get_property; gobject->finalize = ags_wave_window_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) wave_window; widget->delete_event = ags_wave_window_delete_event; } void ags_wave_window_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_wave_window_connect; connectable->disconnect = ags_wave_window_disconnect; } void ags_wave_window_init(AgsWaveWindow *wave_window) { g_object_set(G_OBJECT(wave_window), "title", "edit wave", NULL); wave_window->flags = 0; wave_window->wave_editor = ags_wave_editor_new(); gtk_container_add((GtkContainer *) wave_window, (GtkWidget *) wave_window->wave_editor); } void ags_wave_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWaveWindow *wave_window; wave_window = AGS_WAVE_WINDOW(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWaveWindow *wave_window; wave_window = AGS_WAVE_WINDOW(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_window_connect(AgsConnectable *connectable) { AgsWaveWindow *wave_window; wave_window = AGS_WAVE_WINDOW(connectable); if((AGS_WAVE_WINDOW_CONNECTED & (wave_window->flags)) != 0){ return; } wave_window->flags |= AGS_WAVE_WINDOW_CONNECTED; if(wave_window->wave_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(wave_window->wave_editor)); } } void ags_wave_window_disconnect(AgsConnectable *connectable) { AgsWaveWindow *wave_window; wave_window = AGS_WAVE_WINDOW(connectable); if((AGS_WAVE_WINDOW_CONNECTED & (wave_window->flags)) == 0){ return; } wave_window->flags &= (~AGS_WAVE_WINDOW_CONNECTED); if(wave_window->wave_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(wave_window->wave_editor)); } } void ags_wave_window_finalize(GObject *gobject) { AgsWaveWindow *wave_window; wave_window = (AgsWaveWindow *) gobject; /* call parent */ G_OBJECT_CLASS(ags_wave_window_parent_class)->finalize(gobject); } gboolean ags_wave_window_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); return(TRUE); } /** * ags_wave_window_new: * @parent_window: the parent #AgsWindow * * Instantiate #AgsWaveWindow * * Returns: the new #AgsWaveWindow instance * * Since: 3.0.0 */ AgsWaveWindow* ags_wave_window_new(GtkWidget *parent_window) { AgsWaveWindow *wave_window; wave_window = (AgsWaveWindow *) g_object_new(AGS_TYPE_WAVE_WINDOW, NULL); wave_window->parent_window = parent_window; return(wave_window); } gsequencer-3.1.3/ags/X/ags_listing_editor.h0000644000175000017500000000445613607210263015614 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LISTING_EDITOR_H__ #define __AGS_LISTING_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LISTING_EDITOR (ags_listing_editor_get_type()) #define AGS_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LISTING_EDITOR, AgsListingEditor)) #define AGS_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LISTING_EDITOR, AgsListingEditorClass)) #define AGS_IS_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LISTING_EDITOR)) #define AGS_IS_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LISTING_EDITOR)) #define AGS_LISTING_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LISTING_EDITOR, AgsListingEditorClass)) typedef struct _AgsListingEditor AgsListingEditor; typedef struct _AgsListingEditorClass AgsListingEditorClass; struct _AgsListingEditor { AgsPropertyListingEditor property_listing_editor; GType channel_type; GtkVBox *child; }; struct _AgsListingEditorClass { AgsPropertyListingEditorClass property_listing_editor; }; GType ags_listing_editor_get_type(); void ags_listing_editor_add_children(AgsListingEditor *listing_editor, AgsAudio *audio, guint nth, gboolean connect); AgsListingEditor* ags_listing_editor_new(GType channel_type); G_END_DECLS #endif /*__AGS_LISTING_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_pad.h0000644000175000017500000000710313607210263013331 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PAD_H__ #define __AGS_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PAD (ags_pad_get_type()) #define AGS_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PAD, AgsPad)) #define AGS_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PAD, AgsPadClass)) #define AGS_IS_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PAD)) #define AGS_IS_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PAD)) #define AGS_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PAD, AgsPadClass)) #define AGS_PAD_DEFAULT_VERSION "0.4.2" #define AGS_PAD_DEFAULT_BUILD_ID "CEST 02-10-2014 19:36" typedef struct _AgsPad AgsPad; typedef struct _AgsPadClass AgsPadClass; typedef enum{ AGS_PAD_CONNECTED = 1, AGS_PAD_SHOW_GROUPING = 1 << 1, AGS_PAD_GROUP_ALL = 1 << 2, AGS_PAD_GROUP_LINE = 1 << 3, AGS_PAD_MAPPED_RECALL = 1 << 4, AGS_PAD_PREMAPPED_RECALL = 1 << 5, AGS_PAD_BLOCK_PLAY = 1 << 6, AGS_PAD_BLOCK_STOP = 1 << 7, }AgsPadFlags; struct _AgsPad { GtkVBox vbox; guint flags; gchar *name; gchar *version; gchar *build_id; guint samplerate; guint buffer_size; guint format; AgsChannel *channel; guint cols; AgsExpanderSet *expander_set; GtkToggleButton *group; GtkToggleButton *mute; GtkToggleButton *solo; GtkToggleButton *play; }; struct _AgsPadClass { GtkVBoxClass vbox; void (*samplerate_changed)(AgsPad *pad, guint samplerate, guint old_samplerate); void (*buffer_size_changed)(AgsPad *pad, guint buffer_size, guint old_buffer_size); void (*format_changed)(AgsPad *pad, guint format, guint old_format); void (*set_channel)(AgsPad *pad, AgsChannel *channel); void (*resize_lines)(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); void (*map_recall)(AgsPad *pad, guint output_pad_start); GList* (*find_port)(AgsPad *pad); }; GType ags_pad_get_type(void); void ags_pad_samplerate_changed(AgsPad *pad, guint samplerate, guint old_samplerate); void ags_pad_buffer_size_changed(AgsPad *pad, guint buffer_size, guint old_buffer_size); void ags_pad_format_changed(AgsPad *pad, guint format, guint old_format); void ags_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); void ags_pad_map_recall(AgsPad *pad, guint output_pad_start); GList* ags_pad_find_port(AgsPad *pad); void ags_pad_play(AgsPad *pad); AgsPad* ags_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_PAD_H__*/ gsequencer-3.1.3/ags/X/ags_input_listing_editor.c0000644000175000017500000002753013607210263017024 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_input_listing_editor_class_init(AgsInputListingEditorClass *input_listing_editor); void ags_input_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_input_listing_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_input_listing_editor_init(AgsInputListingEditor *input_listing_editor); void ags_input_listing_editor_connect(AgsConnectable *connectable); void ags_input_listing_editor_disconnect(AgsConnectable *connectable); void ags_input_listing_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_input_listing_editor_apply(AgsApplicable *applicable); void ags_input_listing_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_input_listing_editor * @short_description: pack input editors * @title: AgsInputListingEditor * @section_id: * @include: ags/X/ags_input_listing_editor.h * * #AgsInputListingEditor is a composite widget to pack #AgsInputEditor. */ static gpointer ags_input_listing_editor_parent_class = NULL; static AgsConnectableInterface* ags_input_listing_editor_parent_connectable_interface; GType ags_input_listing_editor_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_input_listing_editor = 0; static const GTypeInfo ags_input_listing_editor_info = { sizeof (AgsInputListingEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_input_listing_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsInputListingEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_input_listing_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_input_listing_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_input_listing_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_input_listing_editor = g_type_register_static(AGS_TYPE_PROPERTY_LISTING_EDITOR, "AgsInputListingEditor", &ags_input_listing_editor_info, 0); g_type_add_interface_static(ags_type_input_listing_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_input_listing_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_input_listing_editor); } return g_define_type_id__volatile; } void ags_input_listing_editor_class_init(AgsInputListingEditorClass *input_listing_editor) { } void ags_input_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable) { ags_input_listing_editor_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_input_listing_editor_connect; connectable->disconnect = ags_input_listing_editor_disconnect; } void ags_input_listing_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_input_listing_editor_set_update; applicable->apply = ags_input_listing_editor_apply; applicable->reset = ags_input_listing_editor_reset; } void ags_input_listing_editor_init(AgsInputListingEditor *input_listing_editor) { g_signal_connect_after(G_OBJECT(input_listing_editor), "parent_set", G_CALLBACK(ags_input_listing_editor_parent_set_callback), input_listing_editor); input_listing_editor->channel_type = G_TYPE_NONE; input_listing_editor->child = NULL; } void ags_input_listing_editor_connect(AgsConnectable *connectable) { AgsConnectionEditor *connection_editor; AgsInputListingEditor *input_listing_editor; GList *pad_editor, *pad_editor_start; input_listing_editor = AGS_INPUT_LISTING_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(input_listing_editor)->flags)) != 0){ return; } ags_input_listing_editor_parent_connectable_interface->connect(connectable); connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(GTK_WIDGET(input_listing_editor), AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ g_signal_connect_after(G_OBJECT(connection_editor->machine), "resize-pads", G_CALLBACK(ags_input_listing_editor_resize_pads_callback), input_listing_editor); } /* AgsPadEditor */ if(input_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(input_listing_editor->child)); while(pad_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_input_listing_editor_disconnect(AgsConnectable *connectable) { AgsConnectionEditor *connection_editor; AgsInputListingEditor *input_listing_editor; GList *pad_editor, *pad_editor_start; input_listing_editor = AGS_INPUT_LISTING_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(input_listing_editor)->flags)) == 0){ return; } ags_input_listing_editor_parent_connectable_interface->disconnect(connectable); connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(GTK_WIDGET(input_listing_editor), AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ g_object_disconnect(G_OBJECT(connection_editor->machine), "any_signal::resize-pads", G_CALLBACK(ags_input_listing_editor_resize_pads_callback), input_listing_editor, NULL); } /* AgsPadEditor */ if(input_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(input_listing_editor->child)); while(pad_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_input_listing_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsInputListingEditor *input_listing_editor; GList *pad_editor, *pad_editor_start; input_listing_editor = AGS_INPUT_LISTING_EDITOR(applicable); if(input_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(input_listing_editor->child)); while(pad_editor != NULL){ ags_applicable_set_update(AGS_APPLICABLE(pad_editor->data), update); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_input_listing_editor_apply(AgsApplicable *applicable) { AgsInputListingEditor *input_listing_editor; GList *pad_editor, *pad_editor_start; input_listing_editor = AGS_INPUT_LISTING_EDITOR(applicable); if((AGS_PROPERTY_EDITOR_ENABLED & (AGS_PROPERTY_EDITOR(input_listing_editor)->flags)) == 0){ return; } if(input_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(input_listing_editor->child)); while(pad_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } void ags_input_listing_editor_reset(AgsApplicable *applicable) { AgsInputListingEditor *input_listing_editor; GList *pad_editor, *pad_editor_start; input_listing_editor = AGS_INPUT_LISTING_EDITOR(applicable); if(input_listing_editor->child != NULL){ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(input_listing_editor->child)); while(pad_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } } /** * ags_input_listing_editor_add_children: * @input_listing_editor: the #AgsInputListingEditor * @audio: the #AgsAudio to use * @nth: nth channel to start creation until end * @connect: if %TRUE widget is connected and shown * * Creates new pad editors or destroys them. * * Since: 3.0.0 */ void ags_input_listing_editor_add_children(AgsInputListingEditor *input_listing_editor, AgsAudio *audio, guint nth, gboolean connect) { AgsPadEditor *pad_editor; GtkVBox *vbox; AgsChannel *start_channel; AgsChannel *channel, *next_pad, *nth_channel; if(nth == 0 && input_listing_editor->child != NULL){ vbox = input_listing_editor->child; input_listing_editor->child = NULL; gtk_widget_destroy(GTK_WIDGET(vbox)); } if(audio == NULL){ return; } /* instantiate pad editor vbox */ if(nth == 0){ input_listing_editor->child = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(input_listing_editor), GTK_WIDGET(input_listing_editor->child), FALSE, FALSE, 0); } /* get current channel */ if(g_type_is_a(input_listing_editor->channel_type, AGS_TYPE_OUTPUT)){ g_object_get(audio, "output", &start_channel, NULL); }else if(g_type_is_a(input_listing_editor->channel_type, AGS_TYPE_INPUT)){ g_object_get(audio, "input", &start_channel, NULL); }else{ start_channel = NULL; } nth_channel = ags_channel_nth(start_channel, nth); channel = nth_channel; next_pad = NULL; while(channel != NULL){ /* instantiate pad editor */ pad_editor = ags_pad_editor_new(NULL); pad_editor->editor_type_count = 1; pad_editor->editor_type = (GType *) malloc(pad_editor->editor_type_count * sizeof(GType)); pad_editor->editor_type[0] = AGS_TYPE_INPUT_EDITOR; g_object_set(pad_editor, "channel", channel, NULL); gtk_box_pack_start(GTK_BOX(input_listing_editor->child), GTK_WIDGET(pad_editor), FALSE, FALSE, 0); if(connect){ ags_connectable_connect(AGS_CONNECTABLE(pad_editor)); gtk_widget_show_all(GTK_WIDGET(pad_editor)); } /* iterate */ next_pad = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } } /** * ags_input_listing_editor_new: * @channel_type: the channel type to represent * * Create a new instance of #AgsInputListingEditor * * Returns: the new #AgsInputListingEditor * * Since: 3.0.0 */ AgsInputListingEditor* ags_input_listing_editor_new(GType channel_type) { AgsInputListingEditor *input_listing_editor; input_listing_editor = (AgsInputListingEditor *) g_object_new(AGS_TYPE_INPUT_LISTING_EDITOR, NULL); input_listing_editor->channel_type = channel_type; return(input_listing_editor); } gsequencer-3.1.3/ags/X/ags_property_collection_editor.h0000644000175000017500000000520413607210263020232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PROPERTY_COLLECTION_EDITOR_H__ #define __AGS_PROPERTY_COLLECTION_EDITOR_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PROPERTY_COLLECTION_EDITOR (ags_property_collection_editor_get_type()) #define AGS_PROPERTY_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PROPERTY_COLLECTION_EDITOR, AgsPropertyCollectionEditor)) #define AGS_PROPERTY_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PROPERTY_COLLECTION_EDITOR, AgsPropertyCollectionEditorClass)) #define AGS_IS_PROPERTY_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PROPERTY_COLLECTION_EDITOR)) #define AGS_IS_PROPERTY_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PROPERTY_COLLECTION_EDITOR)) #define AGS_PROPERTY_COLLECTION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PROPERTY_COLLECTION_EDITOR, AgsPropertyCollectionEditorClass)) typedef struct _AgsPropertyCollectionEditor AgsPropertyCollectionEditor; typedef struct _AgsPropertyCollectionEditorClass AgsPropertyCollectionEditorClass; struct _AgsPropertyCollectionEditor { AgsPropertyEditor property_editor; guint flags; GType child_type; guint child_parameter_count; GParameter *child_parameter; GtkVBox *child; GtkButton *add_collection; }; struct _AgsPropertyCollectionEditorClass { AgsPropertyEditorClass property_editor; }; GType ags_property_collection_editor_get_type(); AgsPropertyCollectionEditor* ags_property_collection_editor_new(GType child_type, guint child_parameter_count, GParameter *child_parameter); G_END_DECLS #endif /*__AGS_PROPERTY_COLLECTION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_line_callbacks.h0000644000175000017500000000264413607210263015520 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_CALLBACKS_H__ #define __AGS_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_line_check_message_callback(GObject *application_context, AgsLine *line); void ags_line_group_clicked_callback(GtkWidget *widget, AgsLine *line); /* AgsLine */ void ags_line_volume_callback(GtkRange *range, AgsLine *line); /* stop */ void ags_line_stop_callback(AgsLine *line, GList *recall_id, gint sound_scope, gpointer data); G_END_DECLS #endif /*__AGS_LINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_ladspa_browser_callbacks.c0000644000175000017500000001407713607210263017576 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_ladspa_browser_plugin_filename_callback(GtkComboBoxText *combo_box, AgsLadspaBrowser *ladspa_browser) { GtkComboBoxText *filename, *effect; AgsLadspaManager *ladspa_manager; AgsLadspaPlugin *ladspa_plugin; GList *start_list, *list; gchar *str; GRecMutex *ladspa_manager_mutex; filename = (GtkComboBoxText *) ladspa_browser->filename; effect = (GtkComboBoxText *) ladspa_browser->effect; gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model((GtkComboBox *) effect))); ladspa_manager = ags_ladspa_manager_get_instance(); /* get ladspa manager mutex */ ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager); /* get ladspa plugin */ g_rec_mutex_lock(ladspa_manager_mutex); list = start_list = g_list_copy_deep(ladspa_manager->ladspa_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(ladspa_manager_mutex); str = gtk_combo_box_text_get_active_text(filename); while((list = ags_base_plugin_find_filename(list, str)) != NULL){ gchar *str; ladspa_plugin = list->data; /* set effect */ g_object_get(ladspa_plugin, "effect", &str, NULL); if(str != NULL){ gtk_combo_box_text_append_text(effect, str); } g_free(str); /* iterate */ list = list->next; } gtk_combo_box_set_active((GtkComboBox *) effect, 0); g_list_free_full(start_list, g_object_unref); } void ags_ladspa_browser_plugin_effect_callback(GtkComboBoxText *combo_box, AgsLadspaBrowser *ladspa_browser) { GtkComboBoxText *filename, *effect; GtkTable *table; AgsLadspaPlugin *ladspa_plugin; GList *child, *child_start; gchar *str, *tmp; guint effect_index; guint port_count; guint y; unsigned long i; void *plugin_so; LADSPA_Descriptor *plugin_descriptor; LADSPA_PortDescriptor *port_descriptor; GRecMutex *base_plugin_mutex; /* retrieve filename and effect */ filename = (GtkComboBoxText *) ladspa_browser->filename; effect = (GtkComboBoxText *) ladspa_browser->effect; ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), gtk_combo_box_text_get_active_text(filename), gtk_combo_box_text_get_active_text(effect)); g_object_get(ladspa_plugin, "plugin-so", &plugin_so, "effect-index", &effect_index, NULL); /* update description */ if(plugin_so){ /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(ladspa_plugin); /* plugin and port descriptor */ g_rec_mutex_lock(base_plugin_mutex); plugin_descriptor = AGS_LADSPA_PLUGIN_DESCRIPTOR(AGS_BASE_PLUGIN(ladspa_plugin)->plugin_descriptor); port_descriptor = plugin_descriptor->PortDescriptors; /* update ui - reading plugin file */ str = g_strconcat(i18n("Label"), ": ", plugin_descriptor->Label, NULL); gtk_label_set_text(ladspa_browser->label, str); g_free(str); str = g_strconcat(i18n("Maker"), ": ", plugin_descriptor->Label, NULL); gtk_label_set_text(ladspa_browser->maker, str); g_free(str); str = g_strconcat(i18n("Copyright"), ": ", plugin_descriptor->Label, NULL); gtk_label_set_text(ladspa_browser->copyright, str); g_free(str); /* update ui - port information */ port_count = plugin_descriptor->PortCount; table = ladspa_browser->port_table; child_start = child = gtk_container_get_children(GTK_CONTAINER(table)); while(child != NULL){ gtk_widget_destroy(GTK_WIDGET(child->data)); child = child->next; } g_list_free(child_start); for(i = 0, y = 0; i < port_count; i++){ GtkLabel *label; if(!(LADSPA_IS_PORT_CONTROL(port_descriptor[i]) && (LADSPA_IS_PORT_INPUT(port_descriptor[i]) || LADSPA_IS_PORT_OUTPUT(port_descriptor[i])))){ continue; } str = g_strdup(plugin_descriptor->PortNames[i]); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_table_attach_defaults(table, GTK_WIDGET(label), 0, 1, y, y + 1); gtk_table_attach_defaults(table, GTK_WIDGET(ags_ladspa_browser_combo_box_controls_new()), 1, 2, y, y + 1); y++; } g_rec_mutex_unlock(base_plugin_mutex); gtk_widget_show_all((GtkWidget *) table); }else{ /* update ui - empty */ str = g_strdup_printf("%s: ", i18n("Label")); gtk_label_set_text(ladspa_browser->label, str); g_free(str); str = g_strdup_printf("%s: ", i18n("Maker")); gtk_label_set_text(ladspa_browser->maker, str); g_free(str); str = g_strdup_printf("%s: ", i18n("Copyright")); gtk_label_set_text(ladspa_browser->copyright, str); g_free(str); /* update ui - no ports */ table = ladspa_browser->port_table; child_start = child = gtk_container_get_children(GTK_CONTAINER(table)); while(child != NULL){ gtk_widget_destroy(GTK_WIDGET(child->data)); child = child->next; } g_list_free(child_start); } } gsequencer-3.1.3/ags/X/ags_machine_callbacks.c0000644000175000017500000005777413615125733016214 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define AGS_RENAME_ENTRY "AgsRenameEntry" int ags_machine_popup_rename_response_callback(GtkWidget *widget, gint response, AgsMachine *machine); int ags_machine_popup_rename_audio_response_callback(GtkWidget *widget, gint response, AgsMachine *machine); int ags_machine_popup_reposition_audio_response_callback(GtkWidget *widget, gint response, AgsMachine *machine); int ags_machine_popup_properties_destroy_callback(GtkWidget *widget, AgsMachine *machine); void ags_machine_check_message_callback(GObject *application_context, AgsMachine *machine) { ags_machine_check_message(machine); } int ags_machine_button_press_callback(GtkWidget *handle_box, GdkEventButton *event, AgsMachine *machine) { AgsWindow *window = AGS_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET(handle_box))); if(event->button == 3){ gtk_menu_popup (GTK_MENU (machine->popup), NULL, NULL, NULL, NULL, event->button, event->time); }else if(event->button == 1){ window->selected = machine; } return(0); } void ags_machine_popup_move_up_activate_callback(GtkWidget *widget, AgsMachine *machine) { GValue val={0,}; g_value_init (&val, G_TYPE_INT); gtk_container_child_get_property(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(machine))), GTK_WIDGET(machine), "position", &val); if(g_value_get_int (&val) > 0){ gtk_box_reorder_child(GTK_BOX(gtk_widget_get_parent(GTK_WIDGET(machine))), GTK_WIDGET(machine), g_value_get_int (&val) - 1); } g_value_unset (&val); } void ags_machine_popup_move_down_activate_callback(GtkWidget *widget, AgsMachine *machine) { GList *start_list; GValue val={0,}; g_value_init (&val, G_TYPE_INT); gtk_container_child_get_property(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(machine))), GTK_WIDGET(machine), "position", &val); start_list = gtk_container_get_children((GtkContainer *) gtk_widget_get_parent(GTK_WIDGET(machine))); if(g_value_get_int (&val) < g_list_length(start_list) - 1){ gtk_box_reorder_child(GTK_BOX(gtk_widget_get_parent(GTK_WIDGET(machine))), GTK_WIDGET(machine), g_value_get_int (&val) + 1); } g_value_unset (&val); g_list_free(start_list); } void ags_machine_popup_hide_activate_callback(GtkWidget *widget, AgsMachine *machine) { GList *start_list; start_list = gtk_container_get_children((GtkContainer *) machine); gtk_widget_hide(gtk_bin_get_child(GTK_BIN(start_list->data))); g_list_free(start_list); } void ags_machine_popup_show_activate_callback(GtkWidget *widget, AgsMachine *machine) { GList *start_list; start_list = gtk_container_get_children((GtkContainer *) machine); gtk_widget_show(gtk_bin_get_child(GTK_BIN(start_list->data))); g_list_free(start_list); } void ags_machine_popup_destroy_activate_callback(GtkWidget *widget, AgsMachine *machine) { AgsWindow *window; AgsAudio *audio; AgsRemoveAudio *remove_audio; AgsApplicationContext *application_context; GList *list, *list_start; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) machine); application_context = ags_application_context_get_instance(); /* destroy editor */ list = list_start = gtk_container_get_children((GtkContainer *) window->notation_editor->machine_selector); list = list->next; while(list != NULL){ if(AGS_IS_MACHINE_RADIO_BUTTON(list->data) && AGS_MACHINE_RADIO_BUTTON(list->data)->machine == machine){ gtk_widget_destroy(list->data); break; } list = list->next; } g_list_free(list_start); /* destroy automation editor */ list = list_start = gtk_container_get_children((GtkContainer *) window->automation_window->automation_editor->machine_selector); list = list->next; while(list != NULL){ if(AGS_IS_MACHINE_RADIO_BUTTON(list->data) && AGS_MACHINE_RADIO_BUTTON(list->data)->machine == machine){ gtk_widget_destroy(list->data); break; } list = list->next; } g_list_free(list_start); /* destroy machine */ audio = machine->audio; g_object_ref(audio); ags_connectable_disconnect(AGS_CONNECTABLE(machine)); gtk_widget_destroy((GtkWidget *) machine); /* get task thread */ remove_audio = ags_remove_audio_new(audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) remove_audio); } void ags_machine_popup_rename_activate_callback(GtkWidget *widget, AgsMachine *machine) { GtkDialog *dialog; GtkEntry *entry; if(machine->rename != NULL){ return; } machine->rename = dialog = (GtkDialog *) gtk_dialog_new_with_buttons(i18n("rename"), (GtkWindow *) gtk_widget_get_toplevel(GTK_WIDGET(machine)), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); entry = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(entry, machine->machine_name); gtk_box_pack_start(gtk_dialog_get_content_area(dialog), (GtkWidget *) entry, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_machine_popup_rename_response_callback), (gpointer) machine); } int ags_machine_popup_rename_response_callback(GtkWidget *widget, gint response, AgsMachine *machine) { if(response == GTK_RESPONSE_ACCEPT){ GList *children; gchar *str; children = gtk_container_get_children((GtkContainer *) gtk_dialog_get_content_area(GTK_DIALOG(widget))); str = gtk_editable_get_chars(GTK_EDITABLE(children->data), 0, -1); g_object_set(machine, "machine-name", str, NULL); g_list_free(children); } machine->rename = NULL; gtk_widget_destroy(widget); return(0); } void ags_machine_popup_rename_audio_activate_callback(GtkWidget *widget, AgsMachine *machine) { GtkDialog *dialog; GtkEntry *entry; AgsAudio *audio; gchar *audio_name; if(machine->rename_audio != NULL){ return; } audio = machine->audio; machine->rename_audio = dialog = (GtkDialog *) gtk_dialog_new_with_buttons(i18n("rename audio"), (GtkWindow *) gtk_widget_get_toplevel(GTK_WIDGET(machine)), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); g_object_get(audio, "audio-name", &audio_name, NULL); entry = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(entry, audio_name); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(dialog), (GtkWidget *) entry, FALSE, FALSE, 0); g_free(audio_name); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_machine_popup_rename_audio_response_callback), (gpointer) machine); } int ags_machine_popup_rename_audio_response_callback(GtkWidget *widget, gint response, AgsMachine *machine) { if(response == GTK_RESPONSE_ACCEPT){ GList *children; gchar *str; children = gtk_container_get_children((GtkContainer *) gtk_dialog_get_content_area(GTK_DIALOG(widget))); str = gtk_editable_get_chars(GTK_EDITABLE(children->data), 0, -1); g_object_set(machine->audio, "audio-name", str, NULL); g_list_free(children); } machine->rename_audio = NULL; gtk_widget_destroy(widget); return(0); } void ags_machine_popup_reposition_audio_activate_callback(GtkWidget *widget, AgsMachine *machine) { GtkDialog *dialog; GtkSpinButton *spin_button; AgsAudio *audio; AgsApplicationContext *application_context; GList *start_list; gint length; gint position; if(machine->reposition_audio != NULL){ return; } application_context = ags_application_context_get_instance(); audio = machine->audio; start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); length = g_list_length(start_list); position = g_list_index(start_list, audio); machine->reposition_audio = dialog = (GtkDialog *) gtk_dialog_new_with_buttons(i18n("reposition audio"), (GtkWindow *) gtk_widget_get_toplevel(GTK_WIDGET(machine)), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); if(position >= 0){ spin_button = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, (gdouble) (length - 1), 1.0); }else{ spin_button = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 0.0); } gtk_spin_button_set_value(spin_button, (gdouble) position); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(dialog), (GtkWidget *) spin_button, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_machine_popup_reposition_audio_response_callback), (gpointer) machine); g_list_free_full(start_list, g_object_unref); } int ags_machine_popup_reposition_audio_response_callback(GtkWidget *widget, gint response, AgsMachine *machine) { if(response == GTK_RESPONSE_ACCEPT){ AgsAudio *audio; AgsApplicationContext *application_context; GList *children; GList *start_list; gint new_position; application_context = ags_application_context_get_instance(); audio = machine->audio; start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); children = gtk_container_get_children((GtkContainer *) gtk_dialog_get_content_area(GTK_DIALOG(widget))); new_position = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(children->data)); start_list = g_list_remove(start_list, audio); start_list = g_list_insert(start_list, audio, new_position); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), start_list); g_list_foreach(start_list, (GFunc) g_object_unref, NULL); g_list_free(children); } machine->reposition_audio = NULL; gtk_widget_destroy(widget); return(0); } void ags_machine_popup_properties_activate_callback(GtkWidget *widget, AgsMachine *machine) { machine->properties = (GtkDialog *) ags_machine_editor_new(machine); g_signal_connect_after(machine->properties, "destroy", G_CALLBACK(ags_machine_popup_properties_destroy_callback), machine); gtk_window_set_default_size((GtkWindow *) machine->properties, -1, 400); ags_connectable_connect(AGS_CONNECTABLE(machine->properties)); ags_applicable_reset(AGS_APPLICABLE(machine->properties)); gtk_widget_show_all((GtkWidget *) machine->properties); } void ags_machine_popup_sticky_controls_toggled_callback(GtkWidget *widget, AgsMachine *machine) { if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))){ machine->flags |= AGS_MACHINE_STICKY_CONTROLS; }else{ machine->flags &= (~AGS_MACHINE_STICKY_CONTROLS); } } int ags_machine_popup_properties_destroy_callback(GtkWidget *widget, AgsMachine *machine) { machine->properties = NULL; return(0); } void ags_machine_popup_copy_pattern_callback(GtkWidget *widget, AgsMachine *machine) { ags_machine_copy_pattern(machine); } void ags_machine_popup_paste_pattern_callback(GtkWidget *widget, AgsMachine *machine) { //TODO:JK: implement me } void ags_machine_popup_envelope_callback(GtkWidget *widget, AgsMachine *machine) { AgsEnvelopeDialog *envelope_dialog; if(machine->envelope_dialog == NULL){ envelope_dialog = ags_envelope_dialog_new(machine); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0){ ags_envelope_dialog_add_pattern_tab(envelope_dialog); } machine->envelope_dialog = (GtkDialog *) envelope_dialog; ags_connectable_connect(AGS_CONNECTABLE(envelope_dialog)); ags_applicable_reset(AGS_APPLICABLE(envelope_dialog)); gtk_widget_show_all((GtkWidget *) envelope_dialog); } } void ags_machine_popup_connection_editor_callback(GtkWidget *widget, AgsMachine *machine) { AgsConnectionEditor *connection_editor; if(machine->connection_editor == NULL){ connection_editor = ags_connection_editor_new(NULL); if((AGS_MACHINE_SHOW_AUDIO_OUTPUT_CONNECTION & (machine->connection_flags)) != 0){ connection_editor->flags |= AGS_CONNECTION_EDITOR_SHOW_OUTPUT; } if((AGS_MACHINE_SHOW_AUDIO_INPUT_CONNECTION & (machine->connection_flags)) != 0){ connection_editor->flags |= AGS_CONNECTION_EDITOR_SHOW_INPUT; } ags_connection_editor_set_machine(connection_editor, machine); machine->connection_editor = (GtkDialog *) connection_editor; ags_connectable_connect(AGS_CONNECTABLE(connection_editor)); ags_applicable_reset(AGS_APPLICABLE(connection_editor)); gtk_widget_show_all((GtkWidget *) connection_editor); }else{ connection_editor = (AgsConnectionEditor *) machine->connection_editor; } gtk_widget_show_all((GtkWidget *) connection_editor); } void ags_machine_popup_midi_dialog_callback(GtkWidget *widget, AgsMachine *machine) { AgsMidiDialog *midi_dialog; if(machine->midi_dialog == NULL){ midi_dialog = ags_midi_dialog_new(machine); machine->midi_dialog = (GtkDialog *) midi_dialog; midi_dialog->flags |= (AGS_MIDI_DIALOG_IO_OPTIONS | AGS_MIDI_DIALOG_MAPPING | AGS_MIDI_DIALOG_DEVICE); ags_connectable_connect(AGS_CONNECTABLE(midi_dialog)); ags_applicable_reset(AGS_APPLICABLE(midi_dialog)); gtk_widget_show_all((GtkWidget *) midi_dialog); }else{ midi_dialog = (AgsMidiDialog *) machine->midi_dialog; } gtk_widget_show_all((GtkWidget *) midi_dialog); } void ags_machine_popup_midi_export_callback(GtkWidget *widget, AgsMachine *machine) { //TODO:JK: implement me } void ags_machine_popup_wave_export_callback(GtkWidget *widget, AgsMachine *machine) { AgsWaveExportDialog *wave_export_dialog; if(machine->wave_export_dialog == NULL){ wave_export_dialog = ags_wave_export_dialog_new(machine); machine->wave_export_dialog = (GtkDialog *) wave_export_dialog; ags_connectable_connect(AGS_CONNECTABLE(wave_export_dialog)); ags_applicable_reset(AGS_APPLICABLE(wave_export_dialog)); gtk_widget_show_all((GtkWidget *) wave_export_dialog); }else{ wave_export_dialog = (AgsWaveExportDialog *) machine->wave_export_dialog; } gtk_widget_show_all((GtkWidget *) wave_export_dialog); } void ags_machine_popup_midi_import_callback(GtkWidget *widget, AgsMachine *machine) { //TODO:JK: implement me } void ags_machine_popup_wave_import_callback(GtkWidget *widget, AgsMachine *machine) { //TODO:JK: implement me } void ags_machine_open_response_callback(GtkDialog *dialog, gint response, AgsMachine *machine) { GtkFileChooserDialog *file_chooser; GtkCheckButton *overwrite; GtkCheckButton *create; GSList *filenames; file_chooser = GTK_FILE_CHOOSER_DIALOG(dialog); if(response == GTK_RESPONSE_ACCEPT){ filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_chooser)); overwrite = g_object_get_data(G_OBJECT(dialog), "overwrite"); create = g_object_get_data(G_OBJECT(dialog), "create"); ags_machine_open_files(machine, filenames, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(overwrite)), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(create))); } gtk_widget_destroy(GTK_WIDGET(file_chooser)); } void ags_machine_play_callback(GtkWidget *toggle_button, AgsMachine *machine) { if(machine == NULL){ return; } if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle_button))){ if((AGS_MACHINE_BLOCK_PLAY & (machine->flags)) != 0){ return; } g_message("machine: on"); machine->flags |= AGS_MACHINE_BLOCK_PLAY; ags_machine_set_run_extended(machine, TRUE, TRUE, FALSE, FALSE, FALSE); machine->flags &= (~AGS_MACHINE_BLOCK_PLAY); }else{ if((AGS_MACHINE_BLOCK_STOP & (machine->flags)) != 0){ return; } g_message("machine: off"); machine->flags |= AGS_MACHINE_BLOCK_STOP; ags_machine_set_run_extended(machine, FALSE, TRUE, FALSE, FALSE, FALSE); machine->flags &= (~AGS_MACHINE_BLOCK_STOP); } } void ags_machine_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { GList *pad_list; GList *line_list; guint i; /* resize */ if((AGS_MACHINE_CONNECTED & (machine->flags)) != 0){ if(audio_channels > audio_channels_old){ if(machine->input != NULL){ pad_list = gtk_container_get_children(GTK_CONTAINER(machine->input)); while(pad_list != NULL){ line_list = gtk_container_get_children((GtkContainer *) AGS_PAD(pad_list->data)->expander_set); line_list = g_list_nth(line_list, audio_channels_old); for(i = 0; i < audio_channels - audio_channels_old; i++){ ags_connectable_connect(AGS_CONNECTABLE(line_list->data)); line_list = line_list->next; } pad_list = pad_list->next; } } if(machine->output != NULL){ pad_list = gtk_container_get_children(GTK_CONTAINER(machine->output)); while(pad_list != NULL){ line_list = gtk_container_get_children((GtkContainer *) AGS_PAD(pad_list->data)->expander_set); line_list = g_list_nth(line_list, audio_channels_old); for(i = 0; i < audio_channels - audio_channels_old; i++){ ags_connectable_connect(AGS_CONNECTABLE(line_list->data)); line_list = line_list->next; } pad_list = pad_list->next; } } } } } void ags_machine_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data) { GList *pad_list; /* resize */ if((AGS_MACHINE_CONNECTED & (machine->flags)) != 0){ if(pads > pads_old){ if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ if(machine->input != NULL){ pad_list = gtk_container_get_children(GTK_CONTAINER(machine->input)); pad_list = g_list_nth(pad_list, pads_old); while(pad_list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(pad_list->data)); pad_list = pad_list->next; } } } if(g_type_is_a(channel_type, AGS_TYPE_OUTPUT)){ if(machine->output != NULL){ pad_list = gtk_container_get_children(GTK_CONTAINER(machine->output)); pad_list = g_list_nth(pad_list, pads_old); while(pad_list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(pad_list->data)); pad_list = pad_list->next; } } } } } } void ags_machine_stop_callback(AgsMachine *machine, GList *recall_id, gint sound_scope, gpointer data) { gboolean reset_active; if((AGS_MACHINE_BLOCK_STOP_CALLBACK & (machine->flags)) != 0){ return; } machine->flags |= AGS_MACHINE_BLOCK_STOP_CALLBACK; /* play button - check reset active */ reset_active = (sound_scope == AGS_SOUND_SCOPE_SEQUENCER) ? TRUE: FALSE; if(reset_active){ gtk_toggle_button_set_active(machine->play, FALSE); } #if 0 if(sound_scope == AGS_SOUND_SCOPE_SEQUENCER){ ags_machine_set_run_extended(machine, FALSE, TRUE, FALSE, FALSE, FALSE); } if(sound_scope == AGS_SOUND_SCOPE_NOTATION){ ags_machine_set_run_extended(machine, FALSE, FALSE, TRUE, FALSE, FALSE); } if(sound_scope == AGS_SOUND_SCOPE_WAVE){ ags_machine_set_run_extended(machine, FALSE, FALSE, FALSE, TRUE, FALSE); } if(sound_scope == AGS_SOUND_SCOPE_MIDI){ ags_machine_set_run_extended(machine, FALSE, FALSE, FALSE, FALSE, TRUE); } #endif machine->flags &= (~AGS_MACHINE_BLOCK_STOP_CALLBACK); } void ags_machine_active_playback_start_channel_launch_callback(AgsTask *task, AgsPlayback *playback) { AgsAudio *audio; AgsChannel *channel; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsNote *play_note; GObject *output_soundcard; g_object_get(playback, "channel", &channel, "play-note", &play_note, NULL); g_object_get(channel, "audio", &audio, NULL); recall_id = ags_playback_get_recall_id(playback, AGS_SOUND_SCOPE_PLAYBACK); /* get some fields */ g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); end_recycling = ags_recycling_next(last_recycling); recycling = first_recycling; g_object_ref(recycling); next_recycling = NULL; while(recycling != end_recycling){ g_object_get(recycling, "output-soundcard", &output_soundcard, NULL); if(!ags_recall_global_get_rt_safe()){ /* instantiate audio signal */ audio_signal = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) recall_id); g_object_set(audio_signal, "note", play_note, NULL); /* add audio signal */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_PATTERN_MODE)){ ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, 0.0, 0); }else{ gdouble notation_delay; guint buffer_size; guint note_x0, note_x1; notation_delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(output_soundcard)); g_object_get(recycling, "buffer-size", &buffer_size, NULL); g_object_get(play_note, "x0", ¬e_x0, "x1", ¬e_x1, NULL); ags_recycling_create_audio_signal_with_frame_count(recycling, audio_signal, (guint) (((gdouble) buffer_size * notation_delay) * (gdouble) (note_x1 - note_x0)), 0.0, 0); } audio_signal->stream_current = audio_signal->stream; ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); /* * emit add_audio_signal on AgsRecycling */ ags_recycling_add_audio_signal(recycling, audio_signal); }else{ GList *start_list, *list; g_object_get(recycling, "audio-signal", &start_list, NULL); audio_signal = NULL; list = ags_audio_signal_find_by_recall_id(start_list, (GObject *) recall_id); if(list != NULL){ audio_signal = list->data; g_object_set(audio_signal, "note", play_note, NULL); } g_list_free_full(start_list, g_object_unref); g_object_set(play_note, "rt-offset", 0, NULL); } g_object_unref(output_soundcard); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } if(next_recycling != NULL){ g_object_unref(next_recycling); } /* unref */ g_object_unref(audio); g_object_unref(channel); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_recycling != NULL){ g_object_unref(end_recycling); } g_object_unref(recall_id); g_object_unref(play_note); } gsequencer-3.1.3/ags/X/ags_listing_editor.c0000644000175000017500000002545713607210263015613 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_listing_editor_class_init(AgsListingEditorClass *listing_editor); void ags_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_listing_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_listing_editor_init(AgsListingEditor *listing_editor); void ags_listing_editor_connect(AgsConnectable *connectable); void ags_listing_editor_disconnect(AgsConnectable *connectable); void ags_listing_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_listing_editor_apply(AgsApplicable *applicable); void ags_listing_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_listing_editor * @short_description: pack pad editors. * @title: AgsListingEditor * @section_id: * @include: ags/X/ags_listing_editor.h * * #AgsListingEditor is a composite widget to pack #AgsPadEditor. */ static gpointer ags_listing_editor_parent_class = NULL; static AgsConnectableInterface* ags_listing_editor_parent_connectable_interface; GType ags_listing_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_listing_editor = 0; static const GTypeInfo ags_listing_editor_info = { sizeof (AgsListingEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_listing_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsListingEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_listing_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_listing_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_listing_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_listing_editor = g_type_register_static(AGS_TYPE_PROPERTY_LISTING_EDITOR, "AgsListingEditor", &ags_listing_editor_info, 0); g_type_add_interface_static(ags_type_listing_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_listing_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_listing_editor); } return g_define_type_id__volatile; } void ags_listing_editor_class_init(AgsListingEditorClass *listing_editor) { } void ags_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable) { ags_listing_editor_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_listing_editor_connect; connectable->disconnect = ags_listing_editor_disconnect; } void ags_listing_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_listing_editor_set_update; applicable->apply = ags_listing_editor_apply; applicable->reset = ags_listing_editor_reset; } void ags_listing_editor_init(AgsListingEditor *listing_editor) { g_signal_connect_after(G_OBJECT(listing_editor), "parent_set", G_CALLBACK(ags_listing_editor_parent_set_callback), listing_editor); listing_editor->channel_type = G_TYPE_NONE; listing_editor->child = NULL; } void ags_listing_editor_connect(AgsConnectable *connectable) { AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; GList *pad_editor, *pad_editor_start; listing_editor = AGS_LISTING_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(listing_editor)->flags)) != 0){ return; } ags_listing_editor_parent_connectable_interface->connect(connectable); machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor(GTK_WIDGET(listing_editor), AGS_TYPE_MACHINE_EDITOR); if(machine_editor != NULL && machine_editor->machine != NULL){ g_signal_connect_after(G_OBJECT(machine_editor->machine), "resize-pads", G_CALLBACK(ags_listing_editor_resize_pads_callback), listing_editor); } /* AgsPadEditor */ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(listing_editor->child)); while(pad_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } void ags_listing_editor_disconnect(AgsConnectable *connectable) { AgsMachineEditor *machine_editor; AgsListingEditor *listing_editor; GList *pad_editor, *pad_editor_start; listing_editor = AGS_LISTING_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (AGS_PROPERTY_EDITOR(listing_editor)->flags)) == 0){ return; } ags_listing_editor_parent_connectable_interface->disconnect(connectable); machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor(GTK_WIDGET(listing_editor), AGS_TYPE_MACHINE_EDITOR); if(machine_editor != NULL && machine_editor->machine != NULL){ g_object_disconnect(G_OBJECT(machine_editor->machine), "any_signal::resize-pads", G_CALLBACK(ags_listing_editor_resize_pads_callback), listing_editor, NULL); } /* AgsPadEditor */ pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(listing_editor->child)); while(pad_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } void ags_listing_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsListingEditor *listing_editor; GList *pad_editor, *pad_editor_start; listing_editor = AGS_LISTING_EDITOR(applicable); pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(listing_editor->child)); while(pad_editor != NULL){ ags_applicable_set_update(AGS_APPLICABLE(pad_editor->data), update); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } void ags_listing_editor_apply(AgsApplicable *applicable) { AgsListingEditor *listing_editor; GList *pad_editor, *pad_editor_start; listing_editor = AGS_LISTING_EDITOR(applicable); if((AGS_PROPERTY_EDITOR_ENABLED & (AGS_PROPERTY_EDITOR(listing_editor)->flags)) == 0){ return; } pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(listing_editor->child)); while(pad_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } void ags_listing_editor_reset(AgsApplicable *applicable) { AgsListingEditor *listing_editor; GList *pad_editor, *pad_editor_start; listing_editor = AGS_LISTING_EDITOR(applicable); pad_editor_start = pad_editor = gtk_container_get_children(GTK_CONTAINER(listing_editor->child)); while(pad_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(pad_editor->data)); pad_editor = pad_editor->next; } g_list_free(pad_editor_start); } /** * ags_listing_editor_add_children: * @listing_editor: the #AgsListingEditor * @audio: the #AgsAudio to use * @nth: nth channel to start creation until end * @connect: if %TRUE widget is connected and shown * * Creates new pad editors or destroys them. * * Since: 3.0.0 */ void ags_listing_editor_add_children(AgsListingEditor *listing_editor, AgsAudio *audio, guint nth, gboolean connect) { AgsPadEditor *pad_editor; GtkVBox *vbox; AgsChannel *start_channel; AgsChannel *channel, *next_pad, *nth_channel; if(nth == 0 && listing_editor->child != NULL){ vbox = listing_editor->child; listing_editor->child = NULL; gtk_widget_destroy(GTK_WIDGET(vbox)); } if(audio == NULL){ return; } /* instantiate pad editor vbox */ if(nth == 0){ listing_editor->child = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(listing_editor), GTK_WIDGET(listing_editor->child), FALSE, FALSE, 0); } /* get current channel */ start_channel = NULL; if(listing_editor->channel_type == AGS_TYPE_OUTPUT){ g_object_get(audio, "output", &start_channel, NULL); }else{ g_object_get(audio, "input", &start_channel, NULL); } nth_channel = ags_channel_nth(start_channel, nth); channel = nth_channel; next_pad = NULL; while(channel != NULL){ /* instantiate pad editor */ pad_editor = ags_pad_editor_new(NULL); pad_editor->editor_type_count = 2; pad_editor->editor_type = (GType *) malloc(pad_editor->editor_type_count * sizeof(GType)); pad_editor->editor_type[0] = AGS_TYPE_LINK_EDITOR; pad_editor->editor_type[1] = AGS_TYPE_LINE_MEMBER_EDITOR; g_object_set(pad_editor, "channel", channel, NULL); gtk_box_pack_start(GTK_BOX(listing_editor->child), GTK_WIDGET(pad_editor), FALSE, FALSE, 0); if(connect){ ags_connectable_connect(AGS_CONNECTABLE(pad_editor)); gtk_widget_show_all(GTK_WIDGET(pad_editor)); } /* iterate */ next_pad = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } } /** * ags_listing_editor_new: * @channel_type: the channel type to represent * * Create a new instance of #AgsListingEditor * * Returns: the new #AgsListingEditor * * Since: 3.0.0 */ AgsListingEditor* ags_listing_editor_new(GType channel_type) { AgsListingEditor *listing_editor; listing_editor = (AgsListingEditor *) g_object_new(AGS_TYPE_LISTING_EDITOR, NULL); listing_editor->channel_type = channel_type; return(listing_editor); } gsequencer-3.1.3/ags/X/ags_effect_bridge_callbacks.h0000644000175000017500000000273613607210263017343 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_BRIDGE_CALLBACKS_H__ #define __AGS_EFFECT_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_effect_bridge_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsEffectBridge *effect_bridge); void ags_effect_bridge_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsEffectBridge *effect_bridge); G_END_DECLS #endif /*__AGS_EFFECT_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_output_collection_editor.c0000644000175000017500000004020113607210263017675 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_output_collection_editor_class_init(AgsOutputCollectionEditorClass *output_collection_editor); void ags_output_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_output_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_output_collection_editor_init(AgsOutputCollectionEditor *output_collection_editor); void ags_output_collection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_output_collection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_output_collection_editor_connect(AgsConnectable *connectable); void ags_output_collection_editor_disconnect(AgsConnectable *connectable); void ags_output_collection_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_output_collection_editor_apply(AgsApplicable *applicable); void ags_output_collection_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_output_collection_editor * @short_description: edit audio connections in bulk mode. * @title: AgsOutputCollectionEditor * @section_id: * @include: ags/X/ags_output_collection_editor.h * * #AgsOutputCollectionEditor is a composite widget to modify audio connections. A output collection * editor should be packed by a #AgsConnectionEditor. */ static gpointer ags_output_collection_editor_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL_TYPE, }; GType ags_output_collection_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_output_collection_editor = 0; static const GTypeInfo ags_output_collection_editor_info = { sizeof (AgsOutputCollectionEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_output_collection_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOutputCollectionEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_output_collection_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_output_collection_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_output_collection_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_output_collection_editor = g_type_register_static(GTK_TYPE_TABLE, "AgsOutputCollectionEditor", &ags_output_collection_editor_info, 0); g_type_add_interface_static(ags_type_output_collection_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_output_collection_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_output_collection_editor); } return g_define_type_id__volatile; } void ags_output_collection_editor_class_init(AgsOutputCollectionEditorClass *output_collection_editor) { GObjectClass *gobject; GParamSpec *param_spec; ags_output_collection_editor_parent_class = g_type_class_peek_parent(output_collection_editor); /* GObjectClass */ gobject = (GObjectClass *) output_collection_editor; gobject->set_property = ags_output_collection_editor_set_property; gobject->get_property = ags_output_collection_editor_get_property; /* properties */ /** * AgsOutputCollectionEditor:channel-type: * * The channel type to apply to. Either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("channel-type", i18n_pspec("assigned channel type"), i18n_pspec("The channel type which this channel output collection editor is assigned with"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL_TYPE, param_spec); } void ags_output_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_output_collection_editor_connect; connectable->disconnect = ags_output_collection_editor_disconnect; } void ags_output_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_output_collection_editor_set_update; applicable->apply = ags_output_collection_editor_apply; applicable->reset = ags_output_collection_editor_reset; } void ags_output_collection_editor_init(AgsOutputCollectionEditor *output_collection_editor) { GtkAlignment *alignment; GtkLabel *label; output_collection_editor->flags = 0; g_signal_connect_after(GTK_WIDGET(output_collection_editor), "parent-set", G_CALLBACK(ags_output_collection_editor_parent_set_callback), output_collection_editor); output_collection_editor->channel_type = G_TYPE_NONE; gtk_table_resize(GTK_TABLE(output_collection_editor), 4, 2); gtk_table_set_row_spacings(GTK_TABLE(output_collection_editor), 4); gtk_table_set_col_spacings(GTK_TABLE(output_collection_editor), 2); /* first line */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(alignment), 0, 1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("first line")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); output_collection_editor->first_line = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 1.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(output_collection_editor->first_line), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* count */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(alignment), 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("count")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); output_collection_editor->count = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 1.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(output_collection_editor->count), 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* soundcard */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(alignment), 0, 1, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("soundcard")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); output_collection_editor->soundcard = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(output_collection_editor->soundcard), 1, 2, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* audio channel */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(alignment), 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("audio channel")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); output_collection_editor->audio_channel = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 1.0); gtk_table_attach(GTK_TABLE(output_collection_editor), GTK_WIDGET(output_collection_editor->audio_channel), 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); } void ags_output_collection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOutputCollectionEditor *output_collection_editor; output_collection_editor = AGS_OUTPUT_COLLECTION_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: { output_collection_editor->channel_type = g_value_get_gtype(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_output_collection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOutputCollectionEditor *output_collection_editor; output_collection_editor = AGS_OUTPUT_COLLECTION_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: { g_value_set_gtype(value, output_collection_editor->channel_type); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_output_collection_editor_connect(AgsConnectable *connectable) { AgsOutputCollectionEditor *output_collection_editor; /* AgsOutputCollectionEditor */ output_collection_editor = AGS_OUTPUT_COLLECTION_EDITOR(connectable); if((AGS_OUTPUT_COLLECTION_EDITOR_CONNECTED & (output_collection_editor->flags)) != 0){ return; } output_collection_editor->flags |= AGS_OUTPUT_COLLECTION_EDITOR_CONNECTED; g_signal_connect_after(G_OBJECT(output_collection_editor->soundcard), "changed", G_CALLBACK(ags_output_collection_editor_soundcard_callback), output_collection_editor); } void ags_output_collection_editor_disconnect(AgsConnectable *connectable) { AgsOutputCollectionEditor *output_collection_editor; /* AgsOutputCollectionEditor */ output_collection_editor = AGS_OUTPUT_COLLECTION_EDITOR(connectable); if((AGS_OUTPUT_COLLECTION_EDITOR_CONNECTED & (output_collection_editor->flags)) == 0){ return; } output_collection_editor->flags &= (~AGS_OUTPUT_COLLECTION_EDITOR_CONNECTED); g_object_disconnect(G_OBJECT(output_collection_editor->soundcard), "any_signal::changed", G_CALLBACK(ags_output_collection_editor_soundcard_callback), output_collection_editor, NULL); } void ags_output_collection_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_output_collection_editor_apply(AgsApplicable *applicable) { AgsOutputCollectionEditor *output_collection_editor; GtkTreeIter iter; output_collection_editor = AGS_OUTPUT_COLLECTION_EDITOR(applicable); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(output_collection_editor->soundcard), &iter)){ AgsMachine *machine; AgsConnectionEditor *connection_editor; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel; GObject *output_soundcard; GtkTreeModel *model; GList *task; guint audio_channels; guint first_line, count; guint audio_channel; guint i; connection_editor = AGS_CONNECTION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(output_collection_editor), AGS_TYPE_CONNECTION_EDITOR)); machine = connection_editor->machine; audio = machine->audio; /* get mapping and soundcard */ first_line = (guint) gtk_spin_button_get_value_as_int(output_collection_editor->first_line); count = (guint) gtk_spin_button_get_value_as_int(output_collection_editor->count); audio_channel = (guint) gtk_spin_button_get_value_as_int(output_collection_editor->audio_channel); model = gtk_combo_box_get_model(GTK_COMBO_BOX(output_collection_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &output_soundcard, -1); /* apply */ g_object_get(audio, "output", &start_output, "input", &start_input, NULL); for(i = 0; i < count; i++){ channel = NULL; if(g_type_is_a(output_collection_editor->channel_type, AGS_TYPE_OUTPUT)){ channel = start_output; }else if(g_type_is_a(output_collection_editor->channel_type, AGS_TYPE_INPUT)){ channel = start_input; } nth_channel = ags_channel_nth(channel, first_line + i); g_object_set(nth_channel, "output-soundcard", output_soundcard, "output-soundcard-channel", audio_channel, NULL); g_object_unref(nth_channel); } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } } void ags_output_collection_editor_reset(AgsApplicable *applicable) { /* empty */ } /** * ags_output_collection_editor_check: * @output_collection_editor: the #AgsOutputCollectionEditor * * Checks for possible channels to output. And modifies its ranges. * * Since: 3.0.0 */ void ags_output_collection_editor_check(AgsOutputCollectionEditor *output_collection_editor) { AgsConnectionEditor *connection_editor; AgsAudio *audio; GtkTreeIter iter; guint count; connection_editor = AGS_CONNECTION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(output_collection_editor), AGS_TYPE_CONNECTION_EDITOR)); audio = connection_editor->machine->audio; /* get audio fields */ if(g_type_is_a(output_collection_editor->channel_type, AGS_TYPE_INPUT)){ g_object_get(audio, "input-lines", &count, NULL); }else if(g_type_is_a(output_collection_editor->channel_type, AGS_TYPE_OUTPUT)){ g_object_get(audio, "output-lines", &count, NULL); }else{ count = 0; } gtk_spin_button_set_range(output_collection_editor->first_line, 0.0, count - 1.0); gtk_spin_button_set_range(output_collection_editor->count, 0.0, count); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(output_collection_editor->soundcard), &iter)){ GObject *output_soundcard; GtkTreeModel *model; guint audio_channels; /* soundcard connection */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(output_collection_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &output_soundcard, -1); ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), &audio_channels, NULL, NULL, NULL); gtk_spin_button_set_range(output_collection_editor->audio_channel, 0.0, audio_channels - 1.0); if(audio_channels < count){ gtk_spin_button_set_range(output_collection_editor->count, 0.0, audio_channels); } }else{ gtk_spin_button_set_range(output_collection_editor->audio_channel, -1.0, -1.0); } } /** * ags_output_collection_editor_new: * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * * Create a new instance of #AgsOutputCollectionEditor * * Returns: the new #AgsOutputCollectionEditor * * Since: 3.0.0 */ AgsOutputCollectionEditor* ags_output_collection_editor_new(GType channel_type) { AgsOutputCollectionEditor *output_collection_editor; output_collection_editor = (AgsOutputCollectionEditor *) g_object_new(AGS_TYPE_OUTPUT_COLLECTION_EDITOR, "channel_type", channel_type, NULL); return(output_collection_editor); } gsequencer-3.1.3/ags/X/ags_effect_bridge_callbacks.c0000644000175000017500000000264713607210263017337 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_effect_bridge_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsEffectBridge *effect_bridge) { ags_effect_bridge_resize_audio_channels(effect_bridge, audio_channels, audio_channels_old); } void ags_effect_bridge_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsEffectBridge *effect_bridge) { ags_effect_bridge_resize_pads(effect_bridge, channel_type, pads, pads_old); } gsequencer-3.1.3/ags/X/ags_audio_preferences.h0000644000175000017500000000445613607210263016257 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_PREFERENCES_H__ #define __AGS_AUDIO_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_PREFERENCES (ags_audio_preferences_get_type()) #define AGS_AUDIO_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_PREFERENCES, AgsAudioPreferences)) #define AGS_AUDIO_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIO_PREFERENCES, AgsAudioPreferencesClass)) #define AGS_IS_AUDIO_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUDIO_PREFERENCES)) #define AGS_IS_AUDIO_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_AUDIO_PREFERENCES)) #define AGS_AUDIO_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_AUDIO_PREFERENCES, AgsAudioPreferencesClass)) typedef struct _AgsAudioPreferences AgsAudioPreferences; typedef struct _AgsAudioPreferencesClass AgsAudioPreferencesClass; typedef enum{ AGS_AUDIO_PREFERENCES_CONNECTED = 1, }AgsAudioPreferencesFlags; struct _AgsAudioPreferences { GtkVBox vbox; guint flags; GtkVBox *soundcard_editor; GtkButton *add; GtkComboBoxText *jack_driver; GtkButton *start_jack; GtkButton *stop_jack; }; struct _AgsAudioPreferencesClass { GtkVBoxClass vbox; }; GType ags_audio_preferences_get_type(void); AgsAudioPreferences* ags_audio_preferences_new(); G_END_DECLS #endif /*__AGS_AUDIO_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_sheet_window_callbacks.h0000644000175000017500000000207313607210263017264 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_WINDOW_CALLBACKS_H__ #define __AGS_SHEET_WINDOW_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_SHEET_WINDOW_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_wave_window_callbacks.c0000644000175000017500000000145713605312646017124 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/ags_server_preferences.h0000644000175000017500000000431713607210263016460 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SERVER_PREFERENCES_H__ #define __AGS_SERVER_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SERVER_PREFERENCES (ags_server_preferences_get_type()) #define AGS_SERVER_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SERVER_PREFERENCES, AgsServerPreferences)) #define AGS_SERVER_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SERVER_PREFERENCES, AgsServerPreferencesClass)) #define AGS_IS_SERVER_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SERVER_PREFERENCES)) #define AGS_IS_SERVER_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SERVER_PREFERENCES)) #define AGS_SERVER_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SERVER_PREFERENCES, AgsServerPreferencesClass)) typedef struct _AgsServerPreferences AgsServerPreferences; typedef struct _AgsServerPreferencesClass AgsServerPreferencesClass; struct _AgsServerPreferences { GtkVBox vbox; GtkCheckButton *start; GtkEntry *address; GtkEntry *port; GtkEntry *username; GtkEntry *password; }; struct _AgsServerPreferencesClass { GtkVBoxClass vbox; }; GType ags_server_preferences_get_type(void); AgsServerPreferences* ags_server_preferences_new(); G_END_DECLS #endif /*__AGS_SERVER_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_input_listing_editor.h0000644000175000017500000000472513607210263017032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_LISTING_EDITOR_H__ #define __AGS_INPUT_LISTING_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_INPUT_LISTING_EDITOR (ags_input_listing_editor_get_type()) #define AGS_INPUT_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_INPUT_LISTING_EDITOR, AgsInputListingEditor)) #define AGS_INPUT_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_INPUT_LISTING_EDITOR, AgsInputListingEditorClass)) #define AGS_IS_INPUT_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_INPUT_LISTING_EDITOR)) #define AGS_IS_INPUT_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_INPUT_LISTING_EDITOR)) #define AGS_INPUT_LISTING_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_INPUT_LISTING_EDITOR, AgsInputListingEditorClass)) typedef struct _AgsInputListingEditor AgsInputListingEditor; typedef struct _AgsInputListingEditorClass AgsInputListingEditorClass; struct _AgsInputListingEditor { AgsPropertyListingEditor property_listing_editor; GType channel_type; GtkVBox *child; }; struct _AgsInputListingEditorClass { AgsPropertyListingEditorClass property_listing_editor; }; GType ags_input_listing_editor_get_type(); void ags_input_listing_editor_add_children(AgsInputListingEditor *input_listing_editor, AgsAudio *audio, guint nth, gboolean connect); AgsInputListingEditor* ags_input_listing_editor_new(GType channel_type); G_END_DECLS #endif /*__AGS_INPUT_LISTING_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_plugin_browser_callbacks.c0000644000175000017500000000355113605312646017631 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_plugin_browser_plugin_type_changed_callback(GtkWidget *combo_box, AgsPluginBrowser *plugin_browser) { if(gtk_combo_box_get_active((GtkComboBox *) combo_box) == 0){ plugin_browser->active_browser = plugin_browser->lv2_browser; gtk_widget_show(plugin_browser->lv2_browser); gtk_widget_hide(plugin_browser->ladspa_browser); }else if(gtk_combo_box_get_active((GtkComboBox *) combo_box) == 1){ plugin_browser->active_browser = plugin_browser->ladspa_browser; gtk_widget_show(plugin_browser->ladspa_browser); gtk_widget_hide(plugin_browser->lv2_browser); } } void ags_plugin_browser_ok_callback(GtkWidget *button, AgsPluginBrowser *plugin_browser) { gtk_combo_box_set_active((GtkComboBox *) plugin_browser->plugin_type, -1); gtk_widget_hide((GtkWidget *) plugin_browser); } void ags_plugin_browser_cancel_callback(GtkWidget *button, AgsPluginBrowser *plugin_browser) { gtk_combo_box_set_active((GtkComboBox *) plugin_browser->plugin_type, -1); gtk_widget_hide((GtkWidget *) plugin_browser); } gsequencer-3.1.3/ags/X/ags_dssi_browser.h0000644000175000017500000000475713607210263015306 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DSSI_BROWSER_H__ #define __AGS_DSSI_BROWSER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DSSI_BROWSER (ags_dssi_browser_get_type()) #define AGS_DSSI_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_DSSI_BROWSER, AgsDssiBrowser)) #define AGS_DSSI_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DSSI_BROWSER, AgsDssiBrowserClass)) #define AGS_IS_DSSI_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DSSI_BROWSER)) #define AGS_IS_DSSI_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DSSI_BROWSER)) #define AGS_DSSI_BROWSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_DSSI_BROWSER, AgsDssiBrowserClass)) typedef struct _AgsDssiBrowser AgsDssiBrowser; typedef struct _AgsDssiBrowserClass AgsDssiBrowserClass; typedef enum{ AGS_DSSI_BROWSER_CONNECTED = 1, }AgsDssiBrowserFlags; struct _AgsDssiBrowser { GtkVBox vbox; guint flags; gchar *path; GtkHBox *plugin; GtkComboBox *filename; GtkComboBox *effect; GtkVBox *description; GtkLabel *label; GtkLabel *maker; GtkLabel *copyright; GtkTable *port_table; GtkWidget *preview; }; struct _AgsDssiBrowserClass { GtkVBoxClass vbox; }; GType ags_dssi_browser_get_type(void); gchar* ags_dssi_browser_get_plugin_filename(AgsDssiBrowser *dssi_browser); gchar* ags_dssi_browser_get_plugin_effect(AgsDssiBrowser *dssi_browser); GtkWidget* ags_dssi_browser_combo_box_controls_new(); GtkWidget* ags_dssi_browser_preview_new(); AgsDssiBrowser* ags_dssi_browser_new(); G_END_DECLS #endif /*__AGS_DSSI_BROWSER_H__*/ gsequencer-3.1.3/ags/X/ags_sequencer_editor_callbacks.h0000644000175000017500000000306313607210263020125 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNCARD_EDITOR_CALLBACKS_H__ #define __AGS_SOUNCARD_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_sequencer_editor_backend_changed_callback(GtkComboBox *combo, AgsSequencerEditor *sequencer_editor); void ags_sequencer_editor_card_changed_callback(GtkComboBox *combo, AgsSequencerEditor *sequencer_editor); void ags_sequencer_editor_add_jack_callback(GtkWidget *button, AgsSequencerEditor *sequencer_editor); void ags_sequencer_editor_remove_jack_callback(GtkWidget *button, AgsSequencerEditor *sequencer_editor); G_END_DECLS #endif /*__AGS_SEQUENCER_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_sheet_editor.h0000644000175000017500000000721313607210263015245 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_EDITOR_H__ #define __AGS_SHEET_EDITOR_H__ #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SHEET_EDITOR (ags_sheet_editor_get_type ()) #define AGS_SHEET_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SHEET_EDITOR, AgsSheetEditor)) #define AGS_SHEET_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SHEET_EDITOR, AgsSheetEditorClass)) #define AGS_IS_SHEET_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SHEET_EDITOR)) #define AGS_IS_SHEET_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SHEET_EDITOR)) #define AGS_SHEET_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SHEET_EDITOR, AgsSheetEditorClass)) #define AGS_SHEET_EDITOR_DEFAULT_VERSION "2.0.0" #define AGS_SHEET_EDITOR_DEFAULT_BUILD_ID "Sat Feb 3 16:15:50 UTC 2018" #define AGS_SHEET_EDITOR_MAX_CONTROLS (16 * 16 * 1200) typedef struct _AgsSheetEditor AgsSheetEditor; typedef struct _AgsSheetEditorClass AgsSheetEditorClass; typedef enum{ AGS_SHEET_EDITOR_CONNECTED = 1, AGS_SHEET_EDITOR_PATTERN_MODE = 1 << 1, AGS_SHEET_EDITOR_PASTE_MATCH_AUDIO_CHANNEL = 1 << 2, AGS_SHEET_EDITOR_PASTE_NO_DUPLICATES = 1 << 3, }AgsSheetEditorFlags; struct _AgsSheetEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; guint tact_counter; gdouble current_tact; guint chunk_duration; GObject *soundcard; GtkHPaned *paned; AgsSheetToolbar *sheet_toolbar; AgsMachineSelector *machine_selector; AgsMachine *selected_machine; AgsNotebook *notebook; AgsSheetEdit *sheet_edit; }; struct _AgsSheetEditorClass { GtkVBoxClass vbox; void (*machine_changed)(AgsSheetEditor *sheet_editor, AgsMachine *machine); }; GType ags_sheet_editor_get_type(void); void ags_sheet_editor_machine_changed(AgsSheetEditor *sheet_editor, AgsMachine *machine); void ags_sheet_editor_add_note(AgsSheetEditor *sheet_editor, AgsNote *note); void ags_sheet_editor_delete_note(AgsSheetEditor *sheet_editor, guint x, guint y); void ags_sheet_editor_select_region(AgsSheetEditor *sheet_editor, guint x0, guint y0, guint x1, guint y1); void ags_sheet_editor_do_feedback(AgsSheetEditor *sheet_editor); void ags_sheet_editor_select_all(AgsSheetEditor *sheet_editor); void ags_sheet_editor_paste(AgsSheetEditor *sheet_editor); void ags_sheet_editor_copy(AgsSheetEditor *sheet_editor); void ags_sheet_editor_cut(AgsSheetEditor *sheet_editor); AgsSheetEditor* ags_sheet_editor_new(); G_END_DECLS #endif /*__AGS_SHEET_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_input_collection_editor_callbacks.c0000644000175000017500000000334513607210263021503 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_input_collection_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsInputCollectionEditor *input_collection_editor) { AgsConnectionEditor *connection_editor; if(old_parent != NULL){ return; } connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ gtk_combo_box_set_model(GTK_COMBO_BOX(input_collection_editor->soundcard), GTK_TREE_MODEL(ags_machine_get_possible_audio_input_connections(connection_editor->machine))); ags_input_collection_editor_check(input_collection_editor); } } void ags_input_collection_editor_soundcard_callback(GtkWidget *combo_box, AgsInputCollectionEditor *input_collection_editor) { ags_input_collection_editor_check(input_collection_editor); } gsequencer-3.1.3/ags/X/ags_export_soundcard_callbacks.c0000644000175000017500000002077313607210263020152 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_export_soundcard_backend_callback(GtkWidget *combo_box, AgsExportSoundcard *export_soundcard) { AgsExportWindow *export_window; AgsApplicationContext *application_context; GList *start_soundcard, *soundcard; gchar *backend; gchar *device; gboolean found_card; export_window = (AgsExportWindow *) gtk_widget_get_ancestor(GTK_WIDGET(export_soundcard), AGS_TYPE_EXPORT_WINDOW); application_context = ags_application_context_get_instance(); /* refresh card */ ags_export_soundcard_refresh_card(export_soundcard); /* get soundcard */ start_soundcard = NULL; if(application_context != NULL){ start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); } soundcard = start_soundcard; backend = gtk_combo_box_text_get_active_text(export_soundcard->backend); device = gtk_combo_box_text_get_active_text(export_soundcard->card); if(backend == NULL || device == NULL){ g_list_free_full(start_soundcard, g_object_unref); return; } found_card = FALSE; while(soundcard != NULL){ if(!g_ascii_strncasecmp(backend, "wasapi", 7)){ if(AGS_IS_WASAPI_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ if(AGS_IS_DEVOUT(soundcard->data) && ags_devout_test_flags(AGS_DEVOUT(soundcard->data), AGS_DEVOUT_ALSA) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ if(AGS_IS_DEVOUT(soundcard->data) && ags_devout_test_flags(AGS_DEVOUT(soundcard->data), AGS_DEVOUT_OSS) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ if(AGS_IS_JACK_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ if(AGS_IS_PULSE_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "core-audio", 11)){ if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } } soundcard = soundcard->next; } g_list_free_full(start_soundcard, g_object_unref); if(!found_card){ g_object_set(export_soundcard, "soundcard", NULL, NULL); } } void ags_export_soundcard_card_callback(GtkWidget *combo_box, AgsExportSoundcard *export_soundcard) { AgsExportWindow *export_window; AgsApplicationContext *application_context; GList *start_soundcard, *soundcard; gchar *backend; gchar *device; gboolean found_card; export_window = (AgsExportWindow *) gtk_widget_get_ancestor(GTK_WIDGET(export_soundcard), AGS_TYPE_EXPORT_WINDOW); application_context = ags_application_context_get_instance(); /* get soundcard */ start_soundcard = NULL; if(application_context != NULL){ start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); } soundcard = start_soundcard; backend = gtk_combo_box_text_get_active_text(export_soundcard->backend); device = gtk_combo_box_text_get_active_text(export_soundcard->card); if(backend == NULL || device == NULL){ g_list_free_full(start_soundcard, g_object_unref); return; } found_card = FALSE; while(soundcard != NULL){ if(!g_ascii_strncasecmp(backend, "wasapi", 7)){ if(AGS_IS_WASAPI_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ if(AGS_IS_DEVOUT(soundcard->data) && ags_devout_test_flags(AGS_DEVOUT(soundcard->data), AGS_DEVOUT_ALSA) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ if(AGS_IS_DEVOUT(soundcard->data) && ags_devout_test_flags(AGS_DEVOUT(soundcard->data), AGS_DEVOUT_OSS) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ if(AGS_IS_JACK_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ if(AGS_IS_PULSE_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } }else if(!g_ascii_strncasecmp(backend, "core-audio", 11)){ if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard->data) && !g_ascii_strcasecmp(device, ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)))){ g_object_set(export_soundcard, "soundcard", soundcard->data, NULL); found_card = TRUE; break; } } soundcard = soundcard->next; } g_list_free_full(start_soundcard, g_object_unref); if(!found_card){ g_object_set(export_soundcard, "soundcard", NULL, NULL); } } void ags_export_soundcard_file_chooser_button_callback(GtkWidget *file_chooser_button, AgsExportSoundcard *export_soundcard) { AgsExportWindow *export_window; GtkFileChooserDialog *file_chooser; export_window = (AgsExportWindow *) gtk_widget_get_ancestor(GTK_WIDGET(export_soundcard), AGS_TYPE_EXPORT_WINDOW); file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new("Export to file ...", GTK_WINDOW(export_window), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if(gtk_dialog_run(GTK_DIALOG(file_chooser)) == GTK_RESPONSE_ACCEPT){ char *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); gtk_entry_set_text(export_soundcard->filename, filename); } gtk_widget_destroy((GtkWidget *) file_chooser); } gsequencer-3.1.3/ags/X/ags_preferences_callbacks.c0000644000175000017500000000532413607210263017063 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include gboolean ags_preferences_delete_event_callback(GtkWidget *widget, GdkEventAny *event, gpointer user_data) { AgsWindow *window; AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); window = ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); window->preferences = NULL; return(FALSE); } void ags_preferences_response_callback(GtkDialog *dialog, gint response_id, gpointer user_data) { gboolean apply; apply = FALSE; switch(response_id){ case GTK_RESPONSE_APPLY: { apply = TRUE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(dialog)); if(apply){ #if 0 ags_applicable_reset(AGS_APPLICABLE(dialog)); #endif break; } } case GTK_RESPONSE_CANCEL: { AgsWindow *window; AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); window = ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); AGS_PREFERENCES(dialog)->flags |= AGS_PREFERENCES_SHUTDOWN; window->preferences = NULL; gtk_widget_destroy(GTK_WIDGET(dialog)); } } } void ags_preferences_notebook_switch_page_callback(GtkNotebook *notebook, gpointer page, guint page_n, AgsPreferences *preferences) { GList *list, *list_start; list_start = list = gtk_container_get_children((GtkContainer *) gtk_dialog_get_action_area(GTK_DIALOG(preferences))); list = g_list_nth(list, 3); while(list != NULL){ gtk_widget_hide(list->data); list = list->next; } g_list_free(list_start); if(page_n == 1){ gtk_widget_show((GtkWidget *) preferences->audio_preferences->add); }else if(page_n == 2){ gtk_widget_show((GtkWidget *) preferences->midi_preferences->add); } } gsequencer-3.1.3/ags/X/ags_line_editor_callbacks.c0000644000175000017500000000420713607210263017056 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_line_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLineEditor *line_editor) { if(old_parent != NULL){ return; } if(line_editor->link_editor != NULL){ gtk_box_pack_start((GtkBox *) line_editor, (GtkWidget *) line_editor->link_editor, FALSE, FALSE, 0); } if(line_editor->output_editor != NULL){ gtk_box_pack_start((GtkBox *) line_editor, (GtkWidget *) line_editor->output_editor, FALSE, FALSE, 0); } if(line_editor->input_editor != NULL){ gtk_box_pack_start((GtkBox *) line_editor, (GtkWidget *) line_editor->input_editor, FALSE, FALSE, 0); } } int ags_line_editor_show_callback(GtkWidget *widget, AgsLineEditor *line_editor) { if(line_editor->link_editor != NULL){ gtk_widget_show((GtkWidget *) line_editor->link_editor); } if(line_editor->output_editor != NULL){ gtk_widget_show((GtkWidget *) line_editor->output_editor); } if(line_editor->input_editor != NULL){ gtk_widget_show((GtkWidget *) line_editor->input_editor); } if(line_editor->member_editor != NULL){ gtk_widget_show((GtkWidget *) line_editor->member_editor); } return(0); } gsequencer-3.1.3/ags/X/ags_plugin_preferences_callbacks.c0000644000175000017500000000154213605312646020445 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include gsequencer-3.1.3/ags/X/ags_pad_callbacks.c0000644000175000017500000001253013607210263015323 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_pad_group_clicked_callback(GtkWidget *widget, AgsPad *pad) { AgsLine *line; GtkContainer *container; GList *list, *list_start; if(gtk_toggle_button_get_active(pad->group)){ container = (GtkContainer *) pad->expander_set; list_start = list = gtk_container_get_children(container); while(list != NULL){ line = AGS_LINE(list->data); if(!gtk_toggle_button_get_active(line->group)){ gtk_toggle_button_set_active(line->group, TRUE); } list = list->next; } g_list_free(list_start); }else{ container = (GtkContainer *) pad->expander_set; list_start = list = gtk_container_get_children(container); while(list != NULL){ line = AGS_LINE(list->data); if(!gtk_toggle_button_get_active(line->group)){ g_list_free(list_start); return; } list = list->next; } g_list_free(list_start); gtk_toggle_button_set_active(pad->group, TRUE); } } void ags_pad_mute_clicked_callback(GtkWidget *widget, AgsPad *pad) { AgsMachine *machine; GtkContainer *container; AgsChannel *current, *next_pad, *next_current; AgsSetMuted *set_muted; AgsApplicationContext *application_context; GList *list, *list_start; GList *start_task; gboolean is_output; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pad, AGS_TYPE_MACHINE); application_context = ags_application_context_get_instance(); /* */ start_task = NULL; if(gtk_toggle_button_get_active(pad->mute)){ if(gtk_toggle_button_get_active(pad->solo)){ gtk_toggle_button_set_active(pad->solo, FALSE); } /* mute */ current = pad->channel; if(current != NULL){ g_object_ref(current); } next_pad = ags_channel_next_pad(pad->channel); next_current = NULL; while(current != next_pad){ /* instantiate set muted task */ set_muted = ags_set_muted_new((GObject *) current, TRUE); start_task = g_list_prepend(start_task, set_muted); /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } if(next_pad != NULL){ g_object_unref(next_pad); } if(next_current != NULL){ g_object_unref(next_current); } }else{ if((AGS_MACHINE_SOLO & (machine->flags)) != 0){ is_output = (AGS_IS_OUTPUT(pad->channel))? TRUE: FALSE; container = (GtkContainer *) (is_output ? machine->output: machine->input); list_start = list = gtk_container_get_children(container); while(!gtk_toggle_button_get_active(AGS_PAD(list->data)->solo)){ list = list->next; } g_list_free(list_start); gtk_toggle_button_set_active(AGS_PAD(list->data)->solo, FALSE); machine->flags &= ~(AGS_MACHINE_SOLO); } /* unmute */ current = pad->channel; if(current != NULL){ g_object_ref(current); } next_pad = ags_channel_next_pad(pad->channel); next_current = NULL; while(current != next_pad){ /* instantiate set muted task */ set_muted = ags_set_muted_new((GObject *) current, FALSE); start_task = g_list_prepend(start_task, set_muted); /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } if(next_pad != NULL){ g_object_unref(next_pad); } if(next_current != NULL){ g_object_unref(next_current); } } ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), start_task); } void ags_pad_solo_clicked_callback(GtkWidget *widget, AgsPad *pad) { AgsMachine *machine; GtkContainer *container; GList *list, *list_start; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pad, AGS_TYPE_MACHINE); if(gtk_toggle_button_get_active(pad->solo)){ container = (GtkContainer *) (AGS_IS_OUTPUT(pad->channel) ? machine->output: machine->input); if(gtk_toggle_button_get_active(pad->mute)) gtk_toggle_button_set_active(pad->mute, FALSE); list_start = list = gtk_container_get_children(container); while(list != NULL){ if(list->data == pad){ list = list->next; continue; } gtk_toggle_button_set_active(AGS_PAD(list->data)->mute, TRUE); list = list->next; } g_list_free(list_start); machine->flags |= (AGS_MACHINE_SOLO); }else{ machine->flags &= ~(AGS_MACHINE_SOLO); } } gsequencer-3.1.3/ags/X/ags_output_editor_callbacks.h0000644000175000017500000000247213607210263017476 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_EDITOR_CALLBACKS_H__ #define __AGS_OUTPUT_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_output_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsOutputEditor *output_editor); void ags_output_editor_soundcard_callback(GtkComboBoxText *combo_box, AgsOutputEditor *output_editor); G_END_DECLS #endif /*__AGS_OUTPUT_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_performance_preferences.c0000644000175000017500000003305313607210263017445 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_performance_preferences_class_init(AgsPerformancePreferencesClass *performance_preferences); void ags_performance_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_performance_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_performance_preferences_init(AgsPerformancePreferences *performance_preferences); void ags_performance_preferences_connect(AgsConnectable *connectable); void ags_performance_preferences_disconnect(AgsConnectable *connectable); void ags_performance_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_performance_preferences_apply(AgsApplicable *applicable); void ags_performance_preferences_reset(AgsApplicable *applicable); /** * SECTION:ags_performance_preferences * @short_description: A composite widget to do performance related preferences * @title: AgsPerformancePreferences * @section_id: * @include: ags/X/ags_performance_preferences.h * * #AgsPerformancePreferences enables you to make performance related preferences. */ static gpointer ags_performance_preferences_parent_class = NULL; GType ags_performance_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_performance_preferences = 0; static const GTypeInfo ags_performance_preferences_info = { sizeof (AgsPerformancePreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_performance_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPerformancePreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_performance_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_performance_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_performance_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_performance_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsPerformancePreferences", &ags_performance_preferences_info, 0); g_type_add_interface_static(ags_type_performance_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_performance_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_performance_preferences); } return g_define_type_id__volatile; } void ags_performance_preferences_class_init(AgsPerformancePreferencesClass *performance_preferences) { ags_performance_preferences_parent_class = g_type_class_peek_parent(performance_preferences); } void ags_performance_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_performance_preferences_connect; connectable->disconnect = ags_performance_preferences_disconnect; } void ags_performance_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_performance_preferences_set_update; applicable->apply = ags_performance_preferences_apply; applicable->reset = ags_performance_preferences_reset; } void ags_performance_preferences_init(AgsPerformancePreferences *performance_preferences) { GtkHBox *hbox; GtkLabel *label; performance_preferences->flags = 0; /* auto-sense */ performance_preferences->stream_auto_sense = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("Auto-sense on stream")); gtk_box_pack_start(GTK_BOX(performance_preferences), GTK_WIDGET(performance_preferences->stream_auto_sense), FALSE, FALSE, 0); /* super threaded - audio */ performance_preferences->super_threaded_audio = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("Super threaded - audio")); gtk_box_pack_start(GTK_BOX(performance_preferences), GTK_WIDGET(performance_preferences->super_threaded_audio), FALSE, FALSE, 0); /* super threaded - channel */ performance_preferences->super_threaded_channel = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("Super threaded - channel")); gtk_box_pack_start(GTK_BOX(performance_preferences), GTK_WIDGET(performance_preferences->super_threaded_channel), FALSE, FALSE, 0); /* thread-pool - max unused threads */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(performance_preferences), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("thread pool - max unused threads")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); performance_preferences->thread_pool_max_unused_threads = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, (gdouble) AGS_THREAD_POOL_DEFAULT_MAX_THREADS, 1.0); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(performance_preferences->thread_pool_max_unused_threads), FALSE, FALSE, 0); /* max precision */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(performance_preferences), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("max precision of threads [Hz]")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); performance_preferences->max_precision = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(performance_preferences->max_precision, "125"); gtk_combo_box_text_append_text(performance_preferences->max_precision, "250"); gtk_combo_box_text_append_text(performance_preferences->max_precision, "1000"); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(performance_preferences->max_precision), FALSE, FALSE, 0); } void ags_performance_preferences_connect(AgsConnectable *connectable) { AgsPerformancePreferences *performance_preferences; performance_preferences = AGS_PERFORMANCE_PREFERENCES(connectable); if((AGS_PERFORMANCE_PREFERENCES_CONNECTED & (performance_preferences->flags)) != 0){ return; } performance_preferences->flags |= AGS_PERFORMANCE_PREFERENCES_CONNECTED; g_signal_connect_after(G_OBJECT(performance_preferences->super_threaded_channel), "clicked", G_CALLBACK(ags_performance_preferences_super_threaded_channel_callback), performance_preferences); } void ags_performance_preferences_disconnect(AgsConnectable *connectable) { AgsPerformancePreferences *performance_preferences; performance_preferences = AGS_PERFORMANCE_PREFERENCES(connectable); if((AGS_PERFORMANCE_PREFERENCES_CONNECTED & (performance_preferences->flags)) == 0){ return; } performance_preferences->flags &= (~AGS_PERFORMANCE_PREFERENCES_CONNECTED); g_object_disconnect(G_OBJECT(performance_preferences->super_threaded_channel), "any_signal::clicked", G_CALLBACK(ags_performance_preferences_super_threaded_channel_callback), performance_preferences, NULL); } void ags_performance_preferences_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_performance_preferences_apply(AgsApplicable *applicable) { AgsPerformancePreferences *performance_preferences; AgsConfig *config; gchar *str; guint max_precision; performance_preferences = AGS_PERFORMANCE_PREFERENCES(applicable); config = ags_config_get_instance(); /* auto-sense */ str = g_strdup(((gtk_toggle_button_get_active((GtkToggleButton *) performance_preferences->stream_auto_sense)) ? "true": "false")); ags_config_set_value(config, AGS_CONFIG_RECALL, "auto-sense", str); g_free(str); /* restore thread config */ if(gtk_toggle_button_get_active((GtkToggleButton *) performance_preferences->super_threaded_audio) || gtk_toggle_button_get_active((GtkToggleButton *) performance_preferences->super_threaded_channel)){ ags_config_set_value(config, AGS_CONFIG_THREAD, "model", "super-threaded"); if(gtk_toggle_button_get_active((GtkToggleButton *) performance_preferences->super_threaded_channel)){ ags_config_set_value(config, AGS_CONFIG_THREAD, "super-threaded-scope", "channel"); }else if(gtk_toggle_button_get_active((GtkToggleButton *) performance_preferences->super_threaded_audio)){ ags_config_set_value(config, AGS_CONFIG_THREAD, "super-threaded-scope", "audio"); } }else{ ags_config_set_value(config, AGS_CONFIG_THREAD, "model", "multi-threaded"); } ags_config_set_value(config, AGS_CONFIG_THREAD, "lock-global", "ags-thread"); ags_config_set_value(config, AGS_CONFIG_THREAD, "lock-parent", "ags-recycling-thread"); /* thread pool - max unused threads */ str = g_strdup_printf("%d", gtk_spin_button_get_value_as_int(performance_preferences->thread_pool_max_unused_threads)); ags_config_set_value(config, AGS_CONFIG_THREAD, "thread-pool-max-unused-threads", str); g_free(str); /* max-precision */ str = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX(performance_preferences->max_precision)); max_precision = 0; if(str != NULL){ max_precision = g_ascii_strtoull(str, NULL, 10); } switch(max_precision){ case 0: { g_critical("invalid max-precision configuration"); max_precision = AGS_THREAD_DEFAULT_MAX_PRECISION; } case 125: case 250: case 1000: default: str = g_strdup_printf("%d", max_precision); ags_config_set_value(config, AGS_CONFIG_THREAD, "max-precision", str); g_free(str); } //TODO:JK: implement me } void ags_performance_preferences_reset(AgsApplicable *applicable) { AgsPerformancePreferences *performance_preferences; AgsConfig *config; gchar *str; guint max_precision; performance_preferences = AGS_PERFORMANCE_PREFERENCES(applicable); config = ags_config_get_instance(); /* auto-sense */ str = ags_config_get_value(config, AGS_CONFIG_RECALL, "auto-sense"); gtk_toggle_button_set_active((GtkToggleButton *) performance_preferences->stream_auto_sense, !g_strcmp0("true", str)); /* */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "super-threaded-scope"); if(str != NULL){ if(!g_ascii_strncasecmp(str, "audio", 6)){ gtk_toggle_button_set_active((GtkToggleButton *) performance_preferences->super_threaded_audio, TRUE); }else if(!g_ascii_strncasecmp(str, "channel", 8)){ gtk_toggle_button_set_active((GtkToggleButton *) performance_preferences->super_threaded_channel, TRUE); } } /* */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "thread-pool-max-unused-threads"); if(str != NULL){ gtk_spin_button_set_value(performance_preferences->thread_pool_max_unused_threads, g_ascii_strtod(str, NULL)); }else{ gtk_spin_button_set_value(performance_preferences->thread_pool_max_unused_threads, AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS); } /* max-precision */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "max-precision"); if(str != NULL){ max_precision = g_ascii_strtoull(str, NULL, 10); switch(max_precision){ case 125: { gtk_combo_box_set_active((GtkComboBox *) performance_preferences->max_precision, 0); } break; case 250: { gtk_combo_box_set_active((GtkComboBox *) performance_preferences->max_precision, 1); } break; case 1000: { gtk_combo_box_set_active((GtkComboBox *) performance_preferences->max_precision, 2); } break; default: g_warning("unknown max-precision configuration"); } } //TODO:JK: implement me } /** * ags_performance_preferences_new: * * Create a new instance of #AgsPerformancePreferences * * Returns: the new #AgsPerformancePreferences * * Since: 3.0.0 */ AgsPerformancePreferences* ags_performance_preferences_new() { AgsPerformancePreferences *performance_preferences; performance_preferences = (AgsPerformancePreferences *) g_object_new(AGS_TYPE_PERFORMANCE_PREFERENCES, NULL); return(performance_preferences); } gsequencer-3.1.3/ags/X/ags_line_member_editor_callbacks.c0000644000175000017500000002622013607210263020404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_line_member_editor_plugin_browser_response_create_entry(AgsLineMemberEditor *line_member_editor, gchar *filename, gchar *effect); void ags_line_member_editor_add_callback(GtkWidget *button, AgsLineMemberEditor *line_member_editor) { gtk_widget_show_all((GtkWidget *) line_member_editor->plugin_browser); } void ags_line_member_editor_plugin_browser_response_create_entry(AgsLineMemberEditor *line_member_editor, gchar *filename, gchar *effect) { GtkHBox *hbox; GtkCheckButton *check_button; GtkLabel *label; gchar *str; /* create entry */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(line_member_editor->line_member), GTK_WIDGET(hbox), FALSE, FALSE, 0); check_button = (GtkCheckButton *) gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(check_button), FALSE, FALSE, 0); str = g_strdup_printf("%s - %s", filename, effect); label = (GtkLabel *) gtk_label_new(str); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) hbox); g_free(str); } void ags_line_member_editor_plugin_browser_response_callback(GtkDialog *dialog, gint response, AgsLineMemberEditor *line_member_editor) { AgsWindow *window; AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; AgsApplicationContext *application_context; GList *pad, *pad_start; GList *list, *list_start; gchar *filename, *effect; gboolean has_bridge; gboolean is_output; switch(response){ case GTK_RESPONSE_ACCEPT: { machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor((GtkWidget *) line_member_editor, AGS_TYPE_MACHINE_EDITOR); line_editor = (AgsLineEditor *) gtk_widget_get_ancestor((GtkWidget *) line_member_editor, AGS_TYPE_LINE_EDITOR); machine = machine_editor->machine; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) machine); application_context = ags_application_context_get_instance(); if(AGS_IS_OUTPUT(line_editor->channel)){ is_output = TRUE; }else{ is_output = FALSE; } if(machine->bridge != NULL){ has_bridge = TRUE; }else{ has_bridge = FALSE; } if(!has_bridge){ AgsLine *line; /* find pad and line */ line = NULL; if(is_output){ pad_start = pad = gtk_container_get_children((GtkContainer *) machine_editor->machine->output); }else{ pad_start = pad = gtk_container_get_children((GtkContainer *) machine_editor->machine->input); } pad = g_list_nth(pad, line_editor->channel->pad); if(pad != NULL){ list_start = list = gtk_container_get_children((GtkContainer *) AGS_PAD(pad->data)->expander_set); while(list != NULL){ if(AGS_LINE(list->data)->channel == line_editor->channel){ break; } list = list->next; } if(list != NULL){ line = AGS_LINE(list->data); g_list_free(list_start); } } g_list_free(pad_start); /* retrieve plugin */ filename = ags_plugin_browser_get_plugin_filename(line_member_editor->plugin_browser); effect = ags_plugin_browser_get_plugin_effect(line_member_editor->plugin_browser); if(line != NULL){ AgsAddEffect *add_effect; GList *start_play, *start_recall; g_object_get(line->channel, "play", &start_play, "recall", &start_recall, NULL); if(ags_recall_find_recall_id_with_effect(start_play, NULL, filename, effect) == NULL && ags_recall_find_recall_id_with_effect(start_recall, NULL, filename, effect) == NULL){ ags_line_member_editor_plugin_browser_response_create_entry(line_member_editor, filename, effect); /* add effect */ add_effect = ags_add_effect_new(line->channel, filename, effect); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_effect); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } g_free(filename); g_free(effect); }else{ AgsEffectBridge *effect_bridge; AgsEffectLine *effect_line; effect_bridge = (AgsEffectBridge *) machine->bridge; effect_line = NULL; /* find effect pad and effect line */ if(is_output){ pad_start = pad = gtk_container_get_children((GtkContainer *) effect_bridge->output); }else{ pad_start = pad = gtk_container_get_children((GtkContainer *) effect_bridge->input); } pad = g_list_nth(pad, line_editor->channel->pad); if(pad != NULL){ list_start = list = gtk_container_get_children((GtkContainer *) AGS_EFFECT_PAD(pad->data)->table); while(list != NULL){ if(AGS_EFFECT_LINE(list->data)->channel == line_editor->channel){ break; } list = list->next; } if(list != NULL){ effect_line = AGS_EFFECT_LINE(list->data); g_list_free(list_start); } } g_list_free(pad_start); /* retrieve plugin */ filename = ags_plugin_browser_get_plugin_filename(line_member_editor->plugin_browser); effect = ags_plugin_browser_get_plugin_effect(line_member_editor->plugin_browser); if(effect_line != NULL){ AgsAddEffect *add_effect; GList *start_play, *start_recall; g_object_get(effect_line->channel, "play", &start_play, "recall", &start_recall, NULL); if(ags_recall_find_recall_id_with_effect(start_play, NULL, filename, effect) == NULL && ags_recall_find_recall_id_with_effect(start_recall, NULL, filename, effect) == NULL){ ags_line_member_editor_plugin_browser_response_create_entry(line_member_editor, filename, effect); /* add effect */ add_effect = ags_add_effect_new(effect_line->channel, filename, effect); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_effect); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } g_free(filename); g_free(effect); } } break; } } void ags_line_member_editor_remove_callback(GtkWidget *button, AgsLineMemberEditor *line_member_editor) { AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; GList *start_line_member, *line_member; GList *list, *list_start, *pad, *pad_start; GList *children; guint nth; gboolean has_bridge; gboolean is_output; if(button == NULL || line_member_editor == NULL){ return; } machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor((GtkWidget *) line_member_editor, AGS_TYPE_MACHINE_EDITOR); line_editor = (AgsLineEditor *) gtk_widget_get_ancestor((GtkWidget *) line_member_editor, AGS_TYPE_LINE_EDITOR); line_member = start_line_member = gtk_container_get_children(GTK_CONTAINER(line_member_editor->line_member)); machine = machine_editor->machine; if(AGS_IS_OUTPUT(line_editor->channel)){ is_output = TRUE; }else{ is_output = FALSE; } if(machine->bridge != NULL){ has_bridge = TRUE; }else{ has_bridge = FALSE; } if(!has_bridge){ AgsLine *line; /* retrieve line and pad */ line = NULL; if(AGS_IS_OUTPUT(line_editor->channel)){ pad_start = pad = gtk_container_get_children((GtkContainer *) machine->output); }else{ pad_start = pad = gtk_container_get_children((GtkContainer *) machine->input); } pad = g_list_nth(pad, line_editor->channel->pad); if(pad != NULL){ list_start = list = gtk_container_get_children((GtkContainer *) AGS_PAD(pad->data)->expander_set); while(list != NULL){ if(AGS_LINE(list->data)->channel == line_editor->channel){ break; } list = list->next; } if(list != NULL){ line = AGS_LINE(list->data); g_list_free(list_start); } } g_list_free(pad_start); /* iterate line member */ if(line != NULL){ for(nth = 0; line_member != NULL; nth++){ children = gtk_container_get_children((GtkContainer *) GTK_CONTAINER(line_member->data)); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(children->data))){ gtk_widget_destroy(GTK_WIDGET(line_member->data)); /* remove effect */ ags_line_remove_effect(line, nth); } g_list_free(children); line_member = line_member->next; } } }else{ AgsEffectBridge *effect_bridge; AgsEffectLine *effect_line; effect_bridge = AGS_EFFECT_BRIDGE(machine->bridge); effect_line = NULL; /* retrieve effect line and effect pad */ if(is_output){ pad_start = pad = gtk_container_get_children((GtkContainer *) effect_bridge->output); }else{ pad_start = pad = gtk_container_get_children((GtkContainer *) effect_bridge->input); } pad = g_list_nth(pad, line_editor->channel->pad); if(pad != NULL){ list_start = list = gtk_container_get_children((GtkContainer *) AGS_EFFECT_PAD(pad->data)->table); while(list != NULL){ if(AGS_EFFECT_LINE(list->data)->channel == line_editor->channel){ break; } list = list->next; } if(list != NULL){ effect_line = AGS_EFFECT_LINE(list->data); g_list_free(list_start); } } g_list_free(pad_start); /* iterate line member */ if(effect_line != NULL){ for(nth = 0; line_member != NULL; nth++){ children = gtk_container_get_children(GTK_CONTAINER(line_member->data)); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(children->data))){ gtk_widget_destroy(GTK_WIDGET(line_member->data)); /* remove effect */ ags_effect_line_remove_effect(effect_line, nth); } g_list_free(children); line_member = line_member->next; } } } g_list_free(start_line_member); } gsequencer-3.1.3/ags/X/ags_input_editor.c0000644000175000017500000002360213607210263015267 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_input_editor_class_init(AgsInputEditorClass *input_editor); void ags_input_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_input_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_input_editor_init(AgsInputEditor *input_editor); void ags_input_editor_connect(AgsConnectable *connectable); void ags_input_editor_disconnect(AgsConnectable *connectable); void ags_input_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_input_editor_apply(AgsApplicable *applicable); void ags_input_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_input_editor * @short_description: A composite widget to edit #AgsChannel * @title: AgsInputEditor * @section_id: * @include: ags/X/ags_input_editor.h * * #AgsInputEditor is a composite widget to edit #AgsChannel. */ static gpointer ags_input_editor_parent_class = NULL; GType ags_input_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_input_editor = 0; static const GTypeInfo ags_input_editor_info = { sizeof (AgsInputEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_input_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsInputEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_input_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_input_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_input_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_input_editor = g_type_register_static(GTK_TYPE_HBOX, "AgsInputEditor", &ags_input_editor_info, 0); g_type_add_interface_static(ags_type_input_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_input_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_input_editor); } return g_define_type_id__volatile; } void ags_input_editor_class_init(AgsInputEditorClass *input_editor) { ags_input_editor_parent_class = g_type_class_peek_parent(input_editor); } void ags_input_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_input_editor_connect; connectable->disconnect = ags_input_editor_disconnect; } void ags_input_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_input_editor_set_update; applicable->apply = ags_input_editor_apply; applicable->reset = ags_input_editor_reset; } void ags_input_editor_init(AgsInputEditor *input_editor) { g_signal_connect_after((GObject *) input_editor, "parent_set", G_CALLBACK(ags_input_editor_parent_set_callback), (gpointer) input_editor); input_editor->flags = 0; input_editor->version = AGS_INPUT_EDITOR_DEFAULT_VERSION; input_editor->build_id = AGS_INPUT_EDITOR_DEFAULT_BUILD_ID; /* connecting soundcard */ input_editor->soundcard = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(input_editor), GTK_WIDGET(input_editor->soundcard), FALSE, FALSE, 0); /* connect with line */ input_editor->audio_channel = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_box_pack_start(GTK_BOX(input_editor), GTK_WIDGET(input_editor->audio_channel), FALSE, FALSE, 0); } void ags_input_editor_connect(AgsConnectable *connectable) { AgsInputEditor *input_editor; input_editor = AGS_INPUT_EDITOR(connectable); if((AGS_INPUT_EDITOR_CONNECTED & (input_editor->flags)) != 0){ return; } input_editor->flags |= AGS_INPUT_EDITOR_CONNECTED; g_signal_connect(G_OBJECT(input_editor->soundcard), "changed", G_CALLBACK(ags_input_editor_soundcard_callback), input_editor); } void ags_input_editor_disconnect(AgsConnectable *connectable) { AgsInputEditor *input_editor; input_editor = AGS_INPUT_EDITOR(connectable); if((AGS_INPUT_EDITOR_CONNECTED & (input_editor->flags)) == 0){ return; } input_editor->flags &= (~AGS_INPUT_EDITOR_CONNECTED); g_object_disconnect(G_OBJECT(input_editor->soundcard), "any_signal::changed", G_CALLBACK(ags_input_editor_soundcard_callback), input_editor, NULL); } void ags_input_editor_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_input_editor_apply(AgsApplicable *applicable) { AgsInputEditor *input_editor; AgsLineEditor *line_editor; GtkTreeIter iter; input_editor = AGS_INPUT_EDITOR(applicable); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(input_editor->soundcard), &iter)){ AgsChannel *channel; GObject *input_soundcard; GtkTreeModel *model; guint soundcard_channel; guint pad, audio_channel; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(input_editor), AGS_TYPE_LINE_EDITOR)); channel = line_editor->channel; /* get channel fields */ g_object_get(channel, "pad", &pad, "audio-channel", &audio_channel, NULL); /* get mapping and soundcard */ soundcard_channel = (guint) gtk_spin_button_get_value_as_int(input_editor->audio_channel); model = gtk_combo_box_get_model(GTK_COMBO_BOX(input_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &input_soundcard, -1); /* create task */ g_object_set(channel, "input-soundcard", input_soundcard, "input-soundcard-channel", soundcard_channel, NULL); } } void ags_input_editor_reset(AgsApplicable *applicable) { AgsInputEditor *input_editor; GtkTreeModel *model; GtkTreeIter iter; input_editor = AGS_INPUT_EDITOR(applicable); model = gtk_combo_box_get_model(GTK_COMBO_BOX(input_editor->soundcard)); if(gtk_tree_model_get_iter_first(model, &iter)){ AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel; GObject *input_soundcard, *current; GList *list; gint i; gboolean found; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(input_editor), AGS_TYPE_LINE_EDITOR)); input_soundcard = NULL; audio = NULL; channel = line_editor->channel; if(channel != NULL){ g_object_get(channel, "audio", &audio, "input-soundcard", &input_soundcard, NULL); g_object_unref(audio); g_object_unref(input_soundcard); } i = 0; found = FALSE; if(input_soundcard != NULL){ do{ gtk_tree_model_get(model, &iter, 1, ¤t, -1); if(input_soundcard == current){ found = TRUE; break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } if(found && audio != NULL){ guint audio_channel; /* set channel link */ gtk_combo_box_set_active(GTK_COMBO_BOX(input_editor->soundcard), i); g_object_get(channel, "input-soundcard-channel", &audio_channel, NULL); gtk_spin_button_set_value(input_editor->audio_channel, audio_channel); }else{ gtk_combo_box_set_active(GTK_COMBO_BOX(input_editor->soundcard), 0); } } } /** * ags_input_editor_check: * @input_editor: the #AgsInputEditor * * Checks for possible channels to input. And modifies its ranges. * * Since: 3.0.0 */ void ags_input_editor_check(AgsInputEditor *input_editor) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(input_editor->soundcard), &iter)){ GObject *input_soundcard; GtkTreeModel *model; guint audio_channels; /* soundcard connection */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(input_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &input_soundcard, -1); if(input_soundcard != NULL){ ags_soundcard_get_presets(AGS_SOUNDCARD(input_soundcard), &audio_channels, NULL, NULL, NULL); gtk_spin_button_set_range(input_editor->audio_channel, 0.0, audio_channels - 1.0); }else{ gtk_spin_button_set_range(input_editor->audio_channel, -1.0, -1.0); } }else{ gtk_spin_button_set_range(input_editor->audio_channel, -1.0, -1.0); } } /** * ags_input_editor_new: * * Create a new instance of #AgsInputEditor * * Returns: the new #AgsInputEditor * * Since: 3.0.0 */ AgsInputEditor* ags_input_editor_new() { AgsInputEditor *input_editor; input_editor = (AgsInputEditor *) g_object_new(AGS_TYPE_INPUT_EDITOR, NULL); return(input_editor); } gsequencer-3.1.3/ags/X/ags_effect_bulk_callbacks.h0000644000175000017500000000342413607210263017037 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_BULK_CALLBACKS_H__ #define __AGS_EFFECT_BULK_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_effect_bulk_add_callback(GtkWidget *button, AgsEffectBulk *effect_bulk); void ags_effect_bulk_remove_callback(GtkWidget *button, AgsEffectBulk *effect_bulk); void ags_effect_bulk_plugin_browser_response_callback(GtkDialog *dialog, gint response, AgsEffectBulk *effect_bulk); void ags_effect_bulk_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsEffectBulk *effect_bulk); void ags_effect_bulk_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsEffectBulk *effect_bulk); G_END_DECLS #endif /*__AGS_EFFECT_BULK_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_menu_action_callbacks.h0000644000175000017500000000726313607210263017074 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MENU_ACTION_CALLBACKS_H__ #define __AGS_MENU_ACTION_CALLBACKS_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_MENU_ITEM_FILENAME_KEY "ags-menu-bar-filename-key" #define AGS_MENU_ITEM_EFFECT_KEY "ags-menu-bar-effect-key" void ags_menu_action_open_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_save_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_save_as_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_export_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_quit_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_panel_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_mixer_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_spectrometer_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_equalizer_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_drum_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_matrix_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_synth_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_fm_synth_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_syncsynth_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_fm_syncsynth_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_ffplayer_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_pitch_sampler_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_audiorec_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_ladspa_bridge_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_dssi_bridge_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_lv2_bridge_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_live_dssi_bridge_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_add_live_lv2_bridge_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_automation_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_wave_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_preferences_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_midi_import_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_midi_export_track_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_midi_playback_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_online_help_callback(GtkWidget *menu_item, gpointer data); void ags_menu_action_about_callback(GtkWidget *menu_item, gpointer data); G_END_DECLS #endif /*__AGS_MENU_ACTION_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_line_member_callbacks.h0000644000175000017500000000356013607210263017045 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_MEMBER_CALLBACKS_H__ #define __AGS_LINE_MEMBER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_line_member_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLineMember *line_member); void ags_line_member_dial_changed_callback(GtkWidget *dial, AgsLineMember *line_member); void ags_line_member_vscale_changed_callback(GtkWidget *vscale, AgsLineMember *line_member); void ags_line_member_hscale_changed_callback(GtkWidget *hscale, AgsLineMember *line_member); void ags_line_member_spin_button_changed_callback(GtkWidget *spin_button, AgsLineMember *line_member); void ags_line_member_check_button_clicked_callback(GtkWidget *check_button, AgsLineMember *line_member); void ags_line_member_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsLineMember *line_member); void ags_line_member_button_clicked_callback(GtkWidget *button, AgsLineMember *line_member); G_END_DECLS #endif /*__AGS_LINE_MEMBER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_output_listing_editor_callbacks.c0000644000175000017500000000474413607210263021226 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_output_listing_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsOutputListingEditor *output_listing_editor) { AgsConnectionEditor *connection_editor; if(old_parent != NULL){ return; } connection_editor = (AgsConnectionEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_CONNECTION_EDITOR); if(connection_editor != NULL && connection_editor->machine != NULL){ ags_output_listing_editor_add_children(output_listing_editor, connection_editor->machine->audio, 0, FALSE); } } void ags_output_listing_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsOutputListingEditor *output_listing_editor) { AgsAudio *audio; audio = machine->audio; if(channel_type != output_listing_editor->channel_type){ return; } if(pads_old < pads){ guint audio_channels; guint nth_channel; /* get some audio fields */ g_object_get(audio, "audio-channels", &audio_channels, NULL); /* add children */ nth_channel = pads_old * audio_channels; ags_output_listing_editor_add_children(output_listing_editor, audio, nth_channel, TRUE); }else{ GList *list, *list_next, *list_start; list_start = list = gtk_container_get_children(GTK_CONTAINER(output_listing_editor->child)); list = g_list_nth(list, pads); while(list != NULL){ list_next = list->next; gtk_widget_destroy(GTK_WIDGET(list->data)); list = list_next; } g_list_free(list_start); } } gsequencer-3.1.3/ags/X/ags_menu_action_callbacks.c0000644000175000017500000013302513613101164017057 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include "config.h" #if defined(AGS_W32API) || defined(AGS_OSXAPI) #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include #include #include #include #include #if defined __APPLE__ || AGS_W32API #else #include #endif void ags_menu_action_open_response_callback(GtkFileChooserDialog *file_chooser, gint response, gpointer data); void ags_menu_action_open_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; GtkFileChooserDialog *file_chooser; gint response; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new("open file", (GtkWindow *) window, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), FALSE); gtk_widget_show_all((GtkWidget *) file_chooser); g_signal_connect((GObject *) file_chooser, "response", G_CALLBACK(ags_menu_action_open_response_callback), data); } void ags_menu_action_open_response_callback(GtkFileChooserDialog *file_chooser, gint response, gpointer data) { if(response == GTK_RESPONSE_ACCEPT){ #if defined(AGS_W32API) AgsApplicationContext *application_context; #endif char *filename; gchar *str; #if defined(AGS_W32API) gchar *app_dir; #endif GError *error; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); error = NULL; #if defined(AGS_W32API) application_context = ags_application_context_get_instance(); if(strlen(application_context->argv[0]) > strlen("gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("gsequencer.exe")); }else{ app_dir = NULL; } if(g_path_is_absolute(app_dir)){ str = g_strdup_printf("%s\\gsequencer.exe --filename %s", app_dir, filename); }else{ str = g_strdup_printf("%s\\%s\\gsequencer.exe --filename %s", g_get_current_dir(), app_dir, filename); } g_free(app_dir); { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); g_message("launch %s", str); CreateProcess(NULL, str, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); } #else str = g_strdup_printf("gsequencer --filename %s", filename); g_spawn_command_line_async(str, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } #endif g_free(filename); g_free(str); } gtk_widget_destroy((GtkWidget *) file_chooser); } void ags_menu_action_save_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; GError *error; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); if(g_strcmp0(ags_config_get_value(AGS_APPLICATION_CONTEXT(application_context)->config, AGS_CONFIG_GENERIC, "simple-file"), "false")){ AgsSimpleFile *simple_file; simple_file = (AgsSimpleFile *) g_object_new(AGS_TYPE_SIMPLE_FILE, "filename", window->name, NULL); error = NULL; ags_simple_file_rw_open(simple_file, TRUE, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_simple_file_write(simple_file); ags_simple_file_close(simple_file); g_object_unref(G_OBJECT(simple_file)); }else{ AgsFile *file; file = (AgsFile *) g_object_new(AGS_TYPE_FILE, "filename", window->name, NULL); error = NULL; ags_file_rw_open(file, TRUE, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_file_write(file); ags_file_close(file); g_object_unref(G_OBJECT(file)); } } void ags_menu_action_save_as_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; GtkFileChooserDialog *file_chooser; gint response; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new("save file as", (GtkWindow *) window, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), FALSE); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(file_chooser), TRUE); gtk_widget_show_all((GtkWidget *) file_chooser); response = gtk_dialog_run(GTK_DIALOG(file_chooser)); if(response == GTK_RESPONSE_ACCEPT){ gchar *filename; gchar *str; GError *error; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); if(g_strcmp0(ags_config_get_value(AGS_APPLICATION_CONTEXT(application_context)->config, AGS_CONFIG_GENERIC, "simple-file"), "false")){ AgsSimpleFile *simple_file; simple_file = (AgsSimpleFile *) g_object_new(AGS_TYPE_SIMPLE_FILE, "filename", filename, NULL); error = NULL; ags_simple_file_rw_open(simple_file, TRUE, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_simple_file_write(simple_file); ags_simple_file_close(simple_file); g_object_unref(G_OBJECT(simple_file)); }else{ AgsFile *file; file = (AgsFile *) g_object_new(AGS_TYPE_FILE, "filename", filename, NULL); error = NULL; ags_file_rw_open(file, TRUE, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_file_write(file); ags_file_close(file); g_object_unref(G_OBJECT(file)); } if(window->name != NULL){ g_free(window->name); } window->name = g_strdup(filename); str = g_strconcat("GSequencer - ", window->name, NULL); gtk_window_set_title((GtkWindow *) window, str); g_free(str); } gtk_widget_destroy((GtkWidget *) file_chooser); } void ags_menu_action_export_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); gtk_widget_show_all((GtkWidget *) window->export_window); } void ags_menu_action_quit_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; GtkDialog *dialog; GtkWidget *cancel_button; gint response; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); /* ask the user if he wants save to a file */ dialog = (GtkDialog *) gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Do you want to save '%s'?", window->name); cancel_button = gtk_dialog_add_button(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_widget_grab_focus(cancel_button); response = gtk_dialog_run(dialog); if(response == GTK_RESPONSE_YES){ AgsFile *file; //TODO:JK: revise me file = (AgsFile *) g_object_new(AGS_TYPE_FILE, "filename", window->name, NULL); ags_file_write(file); g_object_unref(G_OBJECT(file)); } if(response != GTK_RESPONSE_CANCEL){ ags_application_context_quit(AGS_APPLICATION_CONTEXT(application_context)); }else{ gtk_widget_destroy(GTK_WIDGET(dialog)); } } void ags_menu_action_add_callback(GtkWidget *menu_item, gpointer data) { } void ags_menu_action_add_panel_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsPanel *panel; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create panel */ panel = ags_panel_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(panel)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(panel), FALSE, FALSE, 0); AGS_MACHINE(panel)->audio->audio_channels = 2; ags_connectable_connect(AGS_CONNECTABLE(panel)); ags_audio_set_pads(AGS_MACHINE(panel)->audio, AGS_TYPE_INPUT, 1, 0); ags_audio_set_pads(AGS_MACHINE(panel)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all(GTK_WIDGET(panel)); } void ags_menu_action_add_mixer_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsMixer *mixer; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create mixer */ mixer = ags_mixer_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(mixer)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(mixer), FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(mixer)); AGS_MACHINE(mixer)->audio->audio_channels = 2; ags_audio_set_pads(AGS_MACHINE(mixer)->audio, AGS_TYPE_INPUT, 8, 0); ags_audio_set_pads(AGS_MACHINE(mixer)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all(GTK_WIDGET(mixer)); } void ags_menu_action_add_spectrometer_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsSpectrometer *spectrometer; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create spectrometer */ spectrometer = ags_spectrometer_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(spectrometer)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(spectrometer), FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(spectrometer)); AGS_MACHINE(spectrometer)->audio->audio_channels = 2; ags_audio_set_pads(AGS_MACHINE(spectrometer)->audio, AGS_TYPE_INPUT, 1, 0); ags_audio_set_pads(AGS_MACHINE(spectrometer)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all(GTK_WIDGET(spectrometer)); } void ags_menu_action_add_equalizer_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsEqualizer10 *equalizer10; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create equalizer10 */ equalizer10 = ags_equalizer10_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(equalizer10)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(equalizer10), FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(equalizer10)); AGS_MACHINE(equalizer10)->audio->audio_channels = 2; ags_audio_set_pads(AGS_MACHINE(equalizer10)->audio, AGS_TYPE_INPUT, 1, 0); ags_audio_set_pads(AGS_MACHINE(equalizer10)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all(GTK_WIDGET(equalizer10)); } void ags_menu_action_add_drum_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsDrum *drum; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create drum */ drum = ags_drum_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(drum)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(drum), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(drum)); /* */ AGS_MACHINE(drum)->audio->audio_channels = 2; /* AgsDrumInputPad */ ags_audio_set_pads(AGS_MACHINE(drum)->audio, AGS_TYPE_INPUT, 8, 0); ags_audio_set_pads(AGS_MACHINE(drum)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ gtk_widget_show_all(GTK_WIDGET(drum)); } void ags_menu_action_add_matrix_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsMatrix *matrix; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create matrix */ matrix = ags_matrix_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(matrix)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(matrix), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(matrix)); /* */ AGS_MACHINE(matrix)->audio->audio_channels = 1; /* AgsMatrixInputPad */ ags_audio_set_pads(AGS_MACHINE(matrix)->audio, AGS_TYPE_INPUT, 78, 0); ags_audio_set_pads(AGS_MACHINE(matrix)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ gtk_widget_show_all(GTK_WIDGET(matrix)); } void ags_menu_action_add_synth_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsSynth *synth; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create synth */ synth = ags_synth_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(synth)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) synth, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(synth)); AGS_MACHINE(synth)->audio->audio_channels = 1; ags_audio_set_pads(AGS_MACHINE(synth)->audio, AGS_TYPE_INPUT, 2, 0); ags_audio_set_pads(AGS_MACHINE(synth)->audio, AGS_TYPE_OUTPUT, 78, 0); gtk_widget_show_all((GtkWidget *) synth); } void ags_menu_action_add_fm_synth_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsFMSynth *fm_synth; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create fm_synth */ fm_synth = ags_fm_synth_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(fm_synth)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) fm_synth, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(fm_synth)); AGS_MACHINE(fm_synth)->audio->audio_channels = 1; ags_audio_set_pads(AGS_MACHINE(fm_synth)->audio, AGS_TYPE_INPUT, 2, 0); ags_audio_set_pads(AGS_MACHINE(fm_synth)->audio, AGS_TYPE_OUTPUT, 78, 0); gtk_widget_show_all((GtkWidget *) fm_synth); } void ags_menu_action_add_syncsynth_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsSyncsynth *syncsynth; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create syncsynth */ syncsynth = ags_syncsynth_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(syncsynth)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) syncsynth, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(syncsynth)); AGS_MACHINE(syncsynth)->audio->audio_channels = 1; ags_audio_set_pads(AGS_MACHINE(syncsynth)->audio, AGS_TYPE_INPUT, 78, 0); ags_audio_set_pads(AGS_MACHINE(syncsynth)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all((GtkWidget *) syncsynth); } void ags_menu_action_add_fm_syncsynth_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsFMSyncsynth *fm_syncsynth; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create fm_syncsynth */ fm_syncsynth = ags_fm_syncsynth_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(fm_syncsynth)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) fm_syncsynth, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(fm_syncsynth)); AGS_MACHINE(fm_syncsynth)->audio->audio_channels = 1; ags_audio_set_pads(AGS_MACHINE(fm_syncsynth)->audio, AGS_TYPE_INPUT, 78, 0); ags_audio_set_pads(AGS_MACHINE(fm_syncsynth)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all((GtkWidget *) fm_syncsynth); } #ifdef AGS_WITH_LIBINSTPATCH void ags_menu_action_add_ffplayer_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsFFPlayer *ffplayer; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create ffplayer */ ffplayer = ags_ffplayer_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(ffplayer)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) ffplayer, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(ffplayer)); AGS_MACHINE(ffplayer)->audio->audio_channels = 2; ags_audio_set_pads(AGS_MACHINE(ffplayer)->audio, AGS_TYPE_INPUT, 78, 0); ags_audio_set_pads(AGS_MACHINE(ffplayer)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all((GtkWidget *) ffplayer); } #endif void ags_menu_action_add_pitch_sampler_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsPitchSampler *pitch_sampler; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create pitch_sampler */ pitch_sampler = ags_pitch_sampler_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(pitch_sampler)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) pitch_sampler, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(pitch_sampler)); AGS_MACHINE(pitch_sampler)->audio->audio_channels = 2; ags_audio_set_pads(AGS_MACHINE(pitch_sampler)->audio, AGS_TYPE_INPUT, 78, 0); ags_audio_set_pads(AGS_MACHINE(pitch_sampler)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all((GtkWidget *) pitch_sampler); } void ags_menu_action_add_audiorec_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsAudiorec *audiorec; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create audiorec */ audiorec = ags_audiorec_new(G_OBJECT(default_soundcard)); add_audio = ags_add_audio_new(AGS_MACHINE(audiorec)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, (GtkWidget *) audiorec, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(audiorec)); AGS_MACHINE(audiorec)->audio->audio_channels = 2; ags_audio_set_pads(AGS_MACHINE(audiorec)->audio, AGS_TYPE_INPUT, 1, 0); ags_audio_set_pads(AGS_MACHINE(audiorec)->audio, AGS_TYPE_OUTPUT, 1, 0); gtk_widget_show_all((GtkWidget *) audiorec); } void ags_menu_action_add_ladspa_bridge_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsLadspaBridge *ladspa_bridge; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; gchar *filename, *effect; filename = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_FILENAME_KEY); effect = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_EFFECT_KEY); application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create ladspa bridge */ ladspa_bridge = ags_ladspa_bridge_new(G_OBJECT(default_soundcard), filename, effect); add_audio = ags_add_audio_new(AGS_MACHINE(ladspa_bridge)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(ladspa_bridge), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(ladspa_bridge)); /* */ AGS_MACHINE(ladspa_bridge)->audio->audio_channels = 2; /* */ ags_audio_set_pads(AGS_MACHINE(ladspa_bridge)->audio, AGS_TYPE_INPUT, 1, 0); ags_audio_set_pads(AGS_MACHINE(ladspa_bridge)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ ags_ladspa_bridge_load(ladspa_bridge); /* */ gtk_widget_show_all(GTK_WIDGET(ladspa_bridge)); } void ags_menu_action_add_dssi_bridge_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsDssiBridge *dssi_bridge; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; gchar *filename, *effect; filename = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_FILENAME_KEY); effect = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_EFFECT_KEY); application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create dssi bridge */ dssi_bridge = ags_dssi_bridge_new(G_OBJECT(default_soundcard), filename, effect); add_audio = ags_add_audio_new(AGS_MACHINE(dssi_bridge)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(dssi_bridge), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(dssi_bridge)); /* */ AGS_MACHINE(dssi_bridge)->audio->audio_channels = 2; /* */ ags_audio_set_pads(AGS_MACHINE(dssi_bridge)->audio, AGS_TYPE_INPUT, 128, 0); ags_audio_set_pads(AGS_MACHINE(dssi_bridge)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ ags_dssi_bridge_load(dssi_bridge); /* */ gtk_widget_show_all(GTK_WIDGET(dssi_bridge)); } void ags_menu_action_add_lv2_bridge_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsLv2Bridge *lv2_bridge; AgsAddAudio *add_audio; AgsApplicationContext *application_context; AgsLv2Plugin *lv2_plugin; GObject *default_soundcard; gchar *filename, *effect; filename = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_FILENAME_KEY); effect = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_EFFECT_KEY); application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create lv2 bridge */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL && AGS_BASE_PLUGIN(lv2_plugin)->plugin_port == NULL){ AgsLv2TurtleParser *lv2_turtle_parser; AgsTurtle *manifest; AgsTurtle **turtle; guint n_turtle; g_object_get(lv2_plugin, "manifest", &manifest, NULL); lv2_turtle_parser = ags_lv2_turtle_parser_new(manifest); n_turtle = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); g_object_run_dispose(lv2_turtle_parser); g_object_unref(lv2_turtle_parser); g_object_unref(manifest); free(turtle); } lv2_bridge = ags_lv2_bridge_new(G_OBJECT(default_soundcard), filename, effect); if(lv2_plugin != NULL && (AGS_LV2_PLUGIN_IS_SYNTHESIZER & (lv2_plugin->flags)) != 0){ ags_audio_set_flags(AGS_MACHINE(lv2_bridge)->audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(AGS_MACHINE(lv2_bridge)->audio, (AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(AGS_MACHINE(lv2_bridge)->audio, (AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT | AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)); g_object_set(AGS_MACHINE(lv2_bridge)->audio, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(lv2_bridge)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); ags_machine_popup_add_connection_options((AgsMachine *) lv2_bridge, (AGS_MACHINE_POPUP_MIDI_DIALOG)); ags_machine_popup_add_edit_options((AgsMachine *) lv2_bridge, (AGS_MACHINE_POPUP_ENVELOPE)); } add_audio = ags_add_audio_new(AGS_MACHINE(lv2_bridge)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(lv2_bridge), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(lv2_bridge)); /* */ AGS_MACHINE(lv2_bridge)->audio->audio_channels = 2; /* */ if(lv2_plugin != NULL){ if((AGS_LV2_PLUGIN_IS_SYNTHESIZER & (lv2_plugin->flags)) == 0){ ags_audio_set_pads(AGS_MACHINE(lv2_bridge)->audio, AGS_TYPE_INPUT, 1, 0); }else{ ags_audio_set_pads(AGS_MACHINE(lv2_bridge)->audio, AGS_TYPE_INPUT, 128, 0); } } ags_audio_set_pads(AGS_MACHINE(lv2_bridge)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ ags_lv2_bridge_load(lv2_bridge); /* */ gtk_widget_show_all(GTK_WIDGET(lv2_bridge)); } void ags_menu_action_add_live_dssi_bridge_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsLiveDssiBridge *live_dssi_bridge; AgsAddAudio *add_audio; AgsApplicationContext *application_context; GObject *default_soundcard; gchar *filename, *effect; filename = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_FILENAME_KEY); effect = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_EFFECT_KEY); application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create live dssi bridge */ live_dssi_bridge = ags_live_dssi_bridge_new(G_OBJECT(default_soundcard), filename, effect); add_audio = ags_add_audio_new(AGS_MACHINE(live_dssi_bridge)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(live_dssi_bridge), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(live_dssi_bridge)); /* */ AGS_MACHINE(live_dssi_bridge)->audio->audio_channels = 2; /* */ ags_audio_set_pads(AGS_MACHINE(live_dssi_bridge)->audio, AGS_TYPE_INPUT, 128, 0); ags_audio_set_pads(AGS_MACHINE(live_dssi_bridge)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ ags_live_dssi_bridge_load(live_dssi_bridge); /* */ gtk_widget_show_all(GTK_WIDGET(live_dssi_bridge)); } void ags_menu_action_add_live_lv2_bridge_callback(GtkWidget *menu_item, gpointer data) { AgsWindow *window; AgsLiveLv2Bridge *live_lv2_bridge; AgsAddAudio *add_audio; AgsApplicationContext *application_context; AgsLv2Plugin *lv2_plugin; GObject *default_soundcard; gchar *filename, *effect; filename = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_FILENAME_KEY); effect = g_object_get_data((GObject *) menu_item, AGS_MENU_ITEM_EFFECT_KEY); application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create live lv2 bridge */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL && AGS_BASE_PLUGIN(lv2_plugin)->plugin_port == NULL){ AgsLv2TurtleParser *lv2_turtle_parser; AgsTurtle *manifest; AgsTurtle **turtle; guint n_turtle; g_object_get(lv2_plugin, "manifest", &manifest, NULL); lv2_turtle_parser = ags_lv2_turtle_parser_new(manifest); n_turtle = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); g_object_run_dispose(lv2_turtle_parser); g_object_unref(lv2_turtle_parser); g_object_unref(manifest); free(turtle); } live_lv2_bridge = ags_live_lv2_bridge_new(G_OBJECT(default_soundcard), filename, effect); add_audio = ags_add_audio_new(AGS_MACHINE(live_lv2_bridge)->audio); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) add_audio); gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(live_lv2_bridge), FALSE, FALSE, 0); /* connect everything */ ags_connectable_connect(AGS_CONNECTABLE(live_lv2_bridge)); /* */ AGS_MACHINE(live_lv2_bridge)->audio->audio_channels = 2; /* */ if(lv2_plugin != NULL){ if((AGS_LV2_PLUGIN_IS_SYNTHESIZER & (lv2_plugin->flags)) == 0){ ags_audio_set_pads(AGS_MACHINE(live_lv2_bridge)->audio, AGS_TYPE_INPUT, 1, 0); }else{ ags_audio_set_pads(AGS_MACHINE(live_lv2_bridge)->audio, AGS_TYPE_INPUT, 128, 0); } } ags_audio_set_pads(AGS_MACHINE(live_lv2_bridge)->audio, AGS_TYPE_OUTPUT, 1, 0); /* */ ags_live_lv2_bridge_load(live_lv2_bridge); /* */ gtk_widget_show_all(GTK_WIDGET(live_lv2_bridge)); } void ags_menu_action_automation_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); gtk_widget_show_all((GtkWidget *) window->automation_window); } void ags_menu_action_wave_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); gtk_widget_show_all((GtkWidget *) window->wave_window); } void ags_menu_action_preferences_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); if(window->preferences != NULL){ return; } window->preferences = ags_preferences_new(); window->preferences->main_window = GTK_WINDOW(window); ags_connectable_connect(AGS_CONNECTABLE(window->preferences)); ags_applicable_reset(AGS_APPLICABLE(window->preferences)); gtk_widget_show_all(GTK_WIDGET(window->preferences)); } void ags_menu_action_midi_import_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); if(window->midi_import_wizard != NULL){ return; } window->midi_import_wizard = (GtkWidget *) ags_midi_import_wizard_new(); g_object_set(window->midi_import_wizard, "main-window", window, NULL); ags_connectable_connect(AGS_CONNECTABLE(window->midi_import_wizard)); ags_applicable_reset(AGS_APPLICABLE(window->midi_import_wizard)); gtk_widget_show_all(GTK_WIDGET(window->midi_import_wizard)); } void ags_menu_action_midi_export_track_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); if(window->midi_export_wizard != NULL){ return; } window->midi_export_wizard = (GtkWidget *) ags_midi_export_wizard_new((GtkWidget *) window); g_object_set(window->midi_export_wizard, NULL); ags_connectable_connect(AGS_CONNECTABLE(window->midi_export_wizard)); ags_applicable_reset(AGS_APPLICABLE(window->midi_export_wizard)); gtk_widget_show_all(GTK_WIDGET(window->midi_export_wizard)); } void ags_menu_action_midi_playback_callback(GtkWidget *menu_item, gpointer data) { //TODO:JK: implement me } void ags_menu_action_online_help_callback(GtkWidget *menu_item, gpointer data) { GtkWidget *online_help_window; #if defined(AGS_W32API) || defined(AGS_OSXAPI) #else WebKitWebView *web_view; #endif AgsApplicationContext *application_context; gchar *start_filename; #if defined(AGS_W32API) gchar *app_dir; #endif start_filename = NULL; #if defined AGS_W32API app_dir = NULL; #endif #if defined(AGS_W32API) || defined(AGS_OSXAPI) #else #if defined(AGS_ONLINE_HELP_START_FILENAME) start_filename = g_strdup(AGS_ONLINE_HELP_START_FILENAME); #else if((start_filename = getenv("AGS_ONLINE_HELP_START_FILENAME")) != NULL){ start_filename = g_strdup(start_filename); }else{ #if defined (AGS_W32API) application_context = ags_application_context_get_instance(); if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } start_filename = g_strdup_printf("%s\\share\\doc\\gsequencer-doc\\html\\index.html", g_get_current_dir()); if(!g_file_test(start_filename, G_FILE_TEST_IS_REGULAR)){ g_free(start_filename); if(g_path_is_absolute(app_dir)){ start_filename = g_strdup_printf("%s\\%s", app_dir, "\\share\\doc\\gsequencer-doc\\html\\index.html"); }else{ start_filename = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\share\\doc\\gsequencer-doc\\html\\index.html"); } } #else #if defined(AGS_WITH_SINGLE_DOCDIR) start_filename = g_strdup_printf("file://%s/user-manual/index.html", DOCDIR); #else start_filename = g_strdup_printf("file://%s/html/index.html", DOCDIR); #endif #endif } #endif /* defined(AGS_ONLINE_HELP_START_FILENAME) */ #endif /* defined(AGS_W32API) || defined(AGS_OSXAPI) */ online_help_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_object_set(online_help_window, "default-width", 800, "default-height", 600, NULL); #if defined(AGS_W32API) || defined(AGS_OSXAPI) #else web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); gtk_container_add(GTK_CONTAINER(online_help_window), GTK_WIDGET(web_view)); //FIXME:JK: hard-coded webkit_web_view_load_uri(web_view, start_filename); #endif gtk_widget_show_all(online_help_window); g_free(start_filename); #if defined AGS_W32API g_free(app_dir); #endif } void ags_menu_action_about_callback(GtkWidget *menu_item, gpointer data) { AgsApplicationContext *application_context; AgsWindow *window; static FILE *file = NULL; struct stat sb; static gchar *license = NULL; static GdkPixbuf *logo = NULL; gchar *license_filename; gchar *logo_filename; gchar *str; #if defined(AGS_W32API) gchar *app_dir; #endif int n_read; GError *error; gchar *authors[] = { "Joël Krähemann", NULL }; license_filename = NULL; logo_filename = NULL; #if defined AGS_W32API app_dir = NULL; #endif #ifdef AGS_LICENSE_FILENAME license_filename = g_strdup(AGS_LICENSE_FILENAME); #else if((license_filename = getenv("AGS_LICENSE_FILENAME")) == NULL){ #if defined (AGS_W32API) application_context = ags_application_context_get_instance(); if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } license_filename = g_strdup_printf("%s\\share\\gsequencer\\license\\GPL-3", g_get_current_dir()); if(!g_file_test(license_filename, G_FILE_TEST_IS_REGULAR)){ g_free(license_filename); if(g_path_is_absolute(app_dir)){ license_filename = g_strdup_printf("%s\\%s", app_dir, "\\share\\gsequencer\\license\\GPL-3"); }else{ license_filename = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\share\\gsequencer\\license\\GPL-3"); } } #else license_filename = g_strdup("/usr/share/common-licenses/GPL-3"); #endif }else{ license_filename = g_strdup(license_filename); } #endif if(g_file_test(license_filename, G_FILE_TEST_EXISTS)){ if(file == NULL){ file = fopen(license_filename, "r"); if(file != NULL){ stat(license_filename, &sb); license = (gchar *) malloc((sb.st_size + 1) * sizeof(gchar)); n_read = fread(license, sizeof(char), sb.st_size, file); if(n_read != sb.st_size){ g_critical("fread() number of bytes returned doesn't match buffer size"); } license[sb.st_size] = '\0'; fclose(file); } #ifdef AGS_LOGO_FILENAME logo_filename = g_strdup(AGS_LOGO_FILENAME); #else if((logo_filename = getenv("AGS_LOGO_FILENAME")) == NULL){ #if defined AGS_W32API logo_filename = g_strdup_printf("%s\\share\\gsequencer\\images\\ags.png", g_get_current_dir()); if(!g_file_test(logo_filename, G_FILE_TEST_IS_REGULAR)){ g_free(logo_filename); if(g_path_is_absolute(app_dir)){ logo_filename = g_strdup_printf("%s\\%s", app_dir, "\\share\\gsequencer\\images\\ags.png"); }else{ logo_filename = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\share\\gsequencer\\images\\ags.png"); } } #else logo_filename = g_strdup_printf("%s/%s", DESTDIR, "/gsequencer/images/ags.png"); #endif }else{ logo_filename = g_strdup(logo_filename); } #endif error = NULL; logo = gdk_pixbuf_new_from_file(logo_filename, &error); //g_free(logo_filename); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } } } application_context = ags_application_context_get_instance(); window = (AgsWindow *) ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); gtk_show_about_dialog((GtkWindow *) window, "program-name", "gsequencer", "authors", authors, "license", license, "version", AGS_VERSION, "website", "http://nongnu.org/gsequencer", "title", "Advanced Gtk+ Sequencer", "logo", logo, NULL); g_free(license_filename); #if defined AGS_W32API g_free(app_dir); #endif } gsequencer-3.1.3/ags/X/ags_performance_preferences_callbacks.h0000644000175000017500000000242613607210263021451 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PERFORMANCE_PREFERENCES_CALLBACKS_H__ #define __AGS_PERFORMANCE_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_performance_preferences_super_threaded_channel_callback(GtkWidget *button, AgsPerformancePreferences *performance_preferences); G_END_DECLS #endif /*__AGS_PERFORMANCE_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_link_editor_callbacks.h0000644000175000017500000000243213607210263017067 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINK_EDITOR_CALLBACKS_H__ #define __AGS_LINK_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_link_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLinkEditor *link_editor); void ags_link_editor_combo_callback(GtkComboBox *combo, AgsLinkEditor *link_editor); G_END_DECLS #endif /*__AGS_LINK_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_export_soundcard_callbacks.h0000644000175000017500000000272013607210263020147 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPORT_SOUNDCARD_CALLBACKS_H__ #define __AGS_EXPORT_SOUNDCARD_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_export_soundcard_backend_callback(GtkWidget *combo_box, AgsExportSoundcard *export_soundcard); void ags_export_soundcard_card_callback(GtkWidget *combo_box, AgsExportSoundcard *export_soundcard); void ags_export_soundcard_file_chooser_button_callback(GtkWidget *file_chooser_button, AgsExportSoundcard *export_soundcard); G_END_DECLS #endif /*__AGS_EXPORT_SOUNDCARD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_notation_editor.h0000644000175000017500000001042313616617253015777 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_EDITOR_H__ #define __AGS_NOTATION_EDITOR_H__ #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NOTATION_EDITOR (ags_notation_editor_get_type ()) #define AGS_NOTATION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTATION_EDITOR, AgsNotationEditor)) #define AGS_NOTATION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTATION_EDITOR, AgsNotationEditorClass)) #define AGS_IS_NOTATION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_NOTATION_EDITOR)) #define AGS_IS_NOTATION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_NOTATION_EDITOR)) #define AGS_NOTATION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_NOTATION_EDITOR, AgsNotationEditorClass)) #define AGS_NOTATION_EDITOR_DEFAULT_VERSION "1.2.0" #define AGS_NOTATION_EDITOR_DEFAULT_BUILD_ID "Mon Nov 27 08:23:16 UTC 2017" #define AGS_NOTATION_EDITOR_MAX_CONTROLS (16 * 16 * 1200) typedef struct _AgsNotationEditor AgsNotationEditor; typedef struct _AgsNotationEditorClass AgsNotationEditorClass; typedef enum{ AGS_NOTATION_EDITOR_CONNECTED = 1, AGS_NOTATION_EDITOR_PATTERN_MODE = 1 << 1, AGS_NOTATION_EDITOR_PASTE_MATCH_AUDIO_CHANNEL = 1 << 2, AGS_NOTATION_EDITOR_PASTE_NO_DUPLICATES = 1 << 3, }AgsNotationEditorFlags; struct _AgsNotationEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; guint tact_counter; gdouble current_tact; guint chunk_duration; gint *active_key; guint active_key_count; GObject *soundcard; GtkHPaned *paned; AgsNotationToolbar *notation_toolbar; AgsMachineSelector *machine_selector; AgsMachine *selected_machine; AgsNotebook *notebook; AgsScrolledPiano *scrolled_piano; AgsNotationEdit *notation_edit; AgsNotationMeta *notation_meta; }; struct _AgsNotationEditorClass { GtkVBoxClass vbox; void (*machine_changed)(AgsNotationEditor *notation_editor, AgsMachine *machine); }; GType ags_notation_editor_get_type(void); void ags_notation_editor_machine_changed(AgsNotationEditor *notation_editor, AgsMachine *machine); void ags_notation_editor_add_note(AgsNotationEditor *notation_editor, AgsNote *note); void ags_notation_editor_delete_note(AgsNotationEditor *notation_editor, guint x, guint y); void ags_notation_editor_select_region(AgsNotationEditor *notation_editor, guint x0, guint y0, guint x1, guint y1); void ags_notation_editor_do_feedback(AgsNotationEditor *notation_editor); void ags_notation_editor_start_play_key(AgsNotationEditor *notation_editor, gint key_code); void ags_notation_editor_stop_play_key(AgsNotationEditor *notation_editor, gint key_code); void ags_notation_editor_select_all(AgsNotationEditor *notation_editor); void ags_notation_editor_paste(AgsNotationEditor *notation_editor); void ags_notation_editor_copy(AgsNotationEditor *notation_editor); void ags_notation_editor_cut(AgsNotationEditor *notation_editor); void ags_notation_editor_invert(AgsNotationEditor *notation_editor); AgsNotationEditor* ags_notation_editor_new(); G_END_DECLS #endif /*__AGS_NOTATION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_line_editor.c0000644000175000017500000002753613607210263015071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_line_editor_class_init(AgsLineEditorClass *line_editor); void ags_line_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_line_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_line_editor_init(AgsLineEditor *line_editor); void ags_line_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_line_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_line_editor_finalize(GObject *gobject); void ags_line_editor_connect(AgsConnectable *connectable); void ags_line_editor_disconnect(AgsConnectable *connectable); void ags_line_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_line_editor_apply(AgsApplicable *applicable); void ags_line_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_line_editor * @short_description: A composite widget to edit #AgsChannel * @title: AgsLineEditor * @section_id: * @include: ags/X/ags_line_editor.h * * #AgsLineEditor is a composite widget to edit #AgsChannel. It should be * packed by an #AgsPadEditor. */ enum{ PROP_0, PROP_CHANNEL, }; static gpointer ags_line_editor_parent_class = NULL; GType ags_line_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_line_editor = 0; static const GTypeInfo ags_line_editor_info = { sizeof (AgsLineEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_line_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLineEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_line_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_line_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_line_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_line_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsLineEditor", &ags_line_editor_info, 0); g_type_add_interface_static(ags_type_line_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_line_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_line_editor); } return g_define_type_id__volatile; } void ags_line_editor_class_init(AgsLineEditorClass *line_editor) { GObjectClass *gobject; GParamSpec *param_spec; ags_line_editor_parent_class = g_type_class_peek_parent(line_editor); /* GObjectClass */ gobject = (GObjectClass *) line_editor; gobject->set_property = ags_line_editor_set_property; gobject->get_property = ags_line_editor_get_property; gobject->finalize = ags_line_editor_finalize; /* properties */ /** * AgsLineEditor:channel: * * The assigned #AgsChannel to edit. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel which this line editor is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); } void ags_line_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_line_editor_connect; connectable->disconnect = ags_line_editor_disconnect; } void ags_line_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_line_editor_set_update; applicable->apply = ags_line_editor_apply; applicable->reset = ags_line_editor_reset; } void ags_line_editor_init(AgsLineEditor *line_editor) { line_editor->flags = 0; line_editor->version = AGS_LINE_EDITOR_DEFAULT_VERSION; line_editor->build_id = AGS_LINE_EDITOR_DEFAULT_BUILD_ID; line_editor->channel = NULL; line_editor->link_editor = NULL; line_editor->member_editor = NULL; } void ags_line_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); ags_line_editor_set_channel(line_editor, channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_line_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, line_editor->channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_line_editor_finalize(GObject *gobject) { AgsLineEditor *line_editor; line_editor = (AgsLineEditor *) gobject; if(line_editor->channel != NULL){ g_object_unref(line_editor->channel); } /* call parent */ G_OBJECT_CLASS(ags_line_editor_parent_class)->finalize(gobject); } void ags_line_editor_connect(AgsConnectable *connectable) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(connectable); if((AGS_LINE_EDITOR_CONNECTED & (line_editor->flags)) != 0){ return; } line_editor->flags |= AGS_LINE_EDITOR_CONNECTED; g_signal_connect(G_OBJECT(line_editor), "show", G_CALLBACK(ags_line_editor_show_callback), (gpointer) line_editor); if(line_editor->link_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->link_editor)); } if(line_editor->output_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->output_editor)); } if(line_editor->input_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->input_editor)); } if(line_editor->member_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->member_editor)); } } void ags_line_editor_disconnect(AgsConnectable *connectable) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(connectable); if((AGS_LINE_EDITOR_CONNECTED & (line_editor->flags)) == 0){ return; } line_editor->flags &= (~AGS_LINE_EDITOR_CONNECTED); g_object_disconnect(G_OBJECT(line_editor), "any_signal::show", G_CALLBACK(ags_line_editor_show_callback), (gpointer) line_editor, NULL); if(line_editor->link_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(line_editor->link_editor)); } if(line_editor->output_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->output_editor)); } if(line_editor->input_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_editor->input_editor)); } if(line_editor->member_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(line_editor->member_editor)); } } void ags_line_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(applicable); if(line_editor->link_editor != NULL){ ags_applicable_set_update(AGS_APPLICABLE(line_editor->link_editor), update); } } void ags_line_editor_apply(AgsApplicable *applicable) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(applicable); if(line_editor->link_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(line_editor->link_editor)); } if(line_editor->output_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(line_editor->output_editor)); } if(line_editor->input_editor != NULL){ ags_applicable_apply(AGS_APPLICABLE(line_editor->input_editor)); } } void ags_line_editor_reset(AgsApplicable *applicable) { AgsLineEditor *line_editor; line_editor = AGS_LINE_EDITOR(applicable); if(line_editor->link_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(line_editor->link_editor)); } if(line_editor->output_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(line_editor->output_editor)); } if(line_editor->input_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(line_editor->input_editor)); } if(line_editor->member_editor != NULL){ ags_applicable_reset(AGS_APPLICABLE(line_editor->member_editor)); } } /** * ags_line_editor_set_channel: * @line_editor: an #AgsLineEditor * @channel: the new #AgsChannel * * Is called as channel gets modified. * * Since: 3.0.0 */ void ags_line_editor_set_channel(AgsLineEditor *line_editor, AgsChannel *channel) { if(line_editor->link_editor != NULL){ line_editor->link_editor = NULL; gtk_widget_destroy(GTK_WIDGET(line_editor->link_editor)); gtk_widget_destroy(GTK_WIDGET(line_editor->output_editor)); gtk_widget_destroy(GTK_WIDGET(line_editor->input_editor)); gtk_widget_destroy(GTK_WIDGET(line_editor->member_editor)); } if(line_editor->channel != channel){ if(line_editor->channel != NULL){ g_object_unref(line_editor->channel); } if(channel != NULL){ g_object_ref(channel); } line_editor->channel = channel; } if(channel != NULL){ guint i; for(i = 0; i < line_editor->editor_type_count; i++){ /* link */ if(line_editor->editor_type[i] == AGS_TYPE_LINK_EDITOR){ line_editor->link_editor = ags_link_editor_new(); gtk_box_pack_start(GTK_BOX(line_editor), GTK_WIDGET(line_editor->link_editor), FALSE, FALSE, 0); } /* output */ if(line_editor->editor_type[i] == AGS_TYPE_OUTPUT_EDITOR){ line_editor->output_editor = ags_output_editor_new(); gtk_box_pack_start(GTK_BOX(line_editor), GTK_WIDGET(line_editor->output_editor), FALSE, FALSE, 0); } /* input */ if(line_editor->editor_type[i] == AGS_TYPE_INPUT_EDITOR){ line_editor->input_editor = ags_input_editor_new(); gtk_box_pack_start(GTK_BOX(line_editor), GTK_WIDGET(line_editor->input_editor), FALSE, FALSE, 0); } /* recall */ if(line_editor->editor_type[i] == AGS_TYPE_LINE_MEMBER_EDITOR){ line_editor->member_editor = ags_line_member_editor_new(); gtk_box_pack_start(GTK_BOX(line_editor), GTK_WIDGET(line_editor->member_editor), FALSE, FALSE, 0); } } } } /** * ags_line_editor_new: * @channel: the channel to edit * * Create a new instance of #AgsLineEditor * * Returns: the new #AgsLineEditor * * Since: 3.0.0 */ AgsLineEditor* ags_line_editor_new(AgsChannel *channel) { AgsLineEditor *line_editor; line_editor = (AgsLineEditor *) g_object_new(AGS_TYPE_LINE_EDITOR, "channel", channel, NULL); return(line_editor); } gsequencer-3.1.3/ags/X/ags_effect_line.c0000644000175000017500000021441013607210263015024 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_effect_line_class_init(AgsEffectLineClass *effect_line); void ags_effect_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_effect_line_init(AgsEffectLine *effect_line); void ags_effect_line_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_effect_line_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_effect_line_dispose(GObject *gobject); void ags_effect_line_finalize(GObject *gobject); void ags_effect_line_connect(AgsConnectable *connectable); void ags_effect_line_disconnect(AgsConnectable *connectable); void ags_effect_line_real_set_channel(AgsEffectLine *effect_line, AgsChannel *channel); GList* ags_effect_line_add_ladspa_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_effect_line_add_lv2_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_effect_line_real_add_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect); void ags_effect_line_real_remove_effect(AgsEffectLine *effect_line, guint nth); void ags_effect_line_real_map_recall(AgsEffectLine *effect_line, guint output_pad_start); GList* ags_effect_line_real_find_port(AgsEffectLine *effect_line); /** * SECTION:ags_effect_line * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsEffectLine * @section_id: * @include: ags/X/ags_effect_line.h * * #AgsEffectLine is a composite widget to visualize one #AgsChannel. It should be * packed by an #AgsEffectLine. */ enum{ SAMPLERATE_CHANGED, BUFFER_SIZE_CHANGED, FORMAT_CHANGED, SET_CHANNEL, ADD_EFFECT, REMOVE_EFFECT, MAP_RECALL, FIND_PORT, DONE, LAST_SIGNAL, }; enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_CHANNEL, }; static gpointer ags_effect_line_parent_class = NULL; static guint effect_line_signals[LAST_SIGNAL]; GHashTable *ags_effect_line_indicator_queue_draw = NULL; GType ags_effect_line_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_effect_line = 0; static const GTypeInfo ags_effect_line_info = { sizeof(AgsEffectLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_effect_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEffectLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_effect_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_effect_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_effect_line = g_type_register_static(GTK_TYPE_VBOX, "AgsEffectLine", &ags_effect_line_info, 0); g_type_add_interface_static(ags_type_effect_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_effect_line); } return g_define_type_id__volatile; } void ags_effect_line_class_init(AgsEffectLineClass *effect_line) { GObjectClass *gobject; GParamSpec *param_spec; ags_effect_line_parent_class = g_type_class_peek_parent(effect_line); /* GObjectClass */ gobject = G_OBJECT_CLASS(effect_line); gobject->set_property = ags_effect_line_set_property; gobject->get_property = ags_effect_line_get_property; gobject->dispose = ags_effect_line_dispose; gobject->finalize = ags_effect_line_finalize; /* properties */ /** * AgsEffectLine:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsEffectLine:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsEffectLine:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsEffectLine:channel: * * The start of a bunch of #AgsChannel to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /* AgsEffectLineClass */ effect_line->samplerate_changed = NULL; effect_line->buffer_size_changed = NULL; effect_line->format_changed = NULL; effect_line->set_channel = ags_effect_line_real_set_channel; effect_line->add_effect = ags_effect_line_real_add_effect; effect_line->remove_effect = ags_effect_line_real_remove_effect; effect_line->map_recall = ags_effect_line_real_map_recall; effect_line->find_port = ags_effect_line_real_find_port; effect_line->done = NULL; /* signals */ /** * AgsEffectLine::samplerate-changed: * @effect_line: the #AgsEffectLine * @samplerate: the samplerate * @old_samplerate: the old samplerate * * The ::samplerate-changed signal notifies about changed samplerate. * * Since: 3.0.0 */ effect_line_signals[SAMPLERATE_CHANGED] = g_signal_new("samplerate-changed", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, samplerate_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectLine::buffer-size-changed: * @effect_line: the #AgsEffectLine * @buffer_size: the buffer size * @old_buffer_size: the old buffer size * * The ::buffer-size-changed signal notifies about changed buffer size. * * Since: 3.0.0 */ effect_line_signals[BUFFER_SIZE_CHANGED] = g_signal_new("buffer-size-changed", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, buffer_size_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectLine::format-changed: * @effect_line: the #AgsEffectLine * @format: the format * @old_format: the old format * * The ::format-changed signal notifies about changed format. * * Since: 3.0.0 */ effect_line_signals[FORMAT_CHANGED] = g_signal_new("format-changed", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, format_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectLine::set-channel: * @effect_line: the #AgsEffectLine to modify * @channel: the #AgsChannel to set * * The ::set-channel signal notifies about changed channel. * * Since: 3.0.0 */ effect_line_signals[SET_CHANNEL] = g_signal_new("set-channel", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, set_channel), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsEffectLine::add-effect: * @effect_line: the #AgsEffectLine to modify * @control_type_name: the string representation of a #GType * @filename: the effect's filename * @effect: the effect's name * * The ::add-effect signal notifies about added effect. * * Returns: the #GList-struct containing the #AgsPort objects added * * Since: 3.0.0 */ effect_line_signals[ADD_EFFECT] = g_signal_new("add-effect", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, add_effect), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER_STRING_STRING, G_TYPE_POINTER, 3, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING); /** * AgsEffectLine::remove-effect: * @effect_line: the #AgsEffectLine to modify * @nth: the nth effect * * The ::remove-effect signal notifies about removed effect. * * Since: 3.0.0 */ effect_line_signals[REMOVE_EFFECT] = g_signal_new("remove-effect", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, remove_effect), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsEffectLine::map-recall: * @effect_line: the #AgsEffectLine * @output_pad_start: the channel's start pad * * The ::map-recall should be used to add the effect_line's default recall. This function * may call ags_effect_line_find_port(). * * Since: 3.0.0 */ effect_line_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS (effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsEffectLineClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsEffectLine::find-port: * @effect_line: the #AgsEffectLine to resize * * The ::find-port as recall should be mapped * * Returns: an #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ effect_line_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsEffectLine::done: * @effect_line: the #AgsEffectLine * @recall_id: the #AgsRecallID * * The ::done signal gets emited as audio stops playback. * * Since: 3.0.0 */ effect_line_signals[DONE] = g_signal_new("done", G_TYPE_FROM_CLASS(effect_line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectLineClass, done), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_effect_line_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_effect_line_connect; connectable->disconnect = ags_effect_line_disconnect; } void ags_effect_line_init(AgsEffectLine *effect_line) { AgsApplicationContext *application_context; AgsConfig *config; application_context = ags_application_context_get_instance(); g_signal_connect(application_context, "check-message", G_CALLBACK(ags_effect_line_check_message_callback), effect_line); if(ags_effect_line_indicator_queue_draw == NULL){ ags_effect_line_indicator_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } effect_line->flags = 0; effect_line->name = NULL; effect_line->version = AGS_EFFECT_LINE_DEFAULT_VERSION; effect_line->build_id = AGS_EFFECT_LINE_DEFAULT_BUILD_ID; config = ags_config_get_instance(); effect_line->samplerate = ags_soundcard_helper_config_get_samplerate(config); effect_line->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); effect_line->format = ags_soundcard_helper_config_get_format(config); effect_line->channel = NULL; effect_line->label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, NULL); gtk_box_pack_start(GTK_BOX(effect_line), GTK_WIDGET(effect_line->label), FALSE, FALSE, 0); effect_line->group = (GtkToggleButton *) gtk_toggle_button_new_with_label(i18n("group")); gtk_box_pack_start(GTK_BOX(effect_line), GTK_WIDGET(effect_line->group), FALSE, FALSE, 0); effect_line->table = (GtkTable *) gtk_table_new(1, AGS_EFFECT_LINE_COLUMNS_COUNT, TRUE); gtk_box_pack_start(GTK_BOX(effect_line), GTK_WIDGET(effect_line->table), FALSE, FALSE, 0); effect_line->queued_drawing = NULL; } void ags_effect_line_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEffectLine *effect_line; effect_line = AGS_EFFECT_LINE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { guint samplerate, old_samplerate; samplerate = g_value_get_uint(value); old_samplerate = effect_line->samplerate; if(samplerate == old_samplerate){ return; } effect_line->samplerate = samplerate; ags_effect_line_samplerate_changed(effect_line, samplerate, old_samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size, old_buffer_size; buffer_size = g_value_get_uint(value); old_buffer_size = effect_line->buffer_size; if(buffer_size == old_buffer_size){ return; } effect_line->buffer_size = buffer_size; ags_effect_line_buffer_size_changed(effect_line, buffer_size, old_buffer_size); } break; case PROP_FORMAT: { guint format, old_format; format = g_value_get_uint(value); old_format = effect_line->format; if(format == old_format){ return; } effect_line->format = format; ags_effect_line_format_changed(effect_line, format, old_format); } break; case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); ags_effect_line_set_channel(effect_line, channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_line_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEffectLine *effect_line; effect_line = AGS_EFFECT_LINE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, effect_line->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, effect_line->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, effect_line->format); } break; case PROP_CHANNEL: { g_value_set_object(value, effect_line->channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_line_dispose(GObject *gobject) { AgsEffectLine *effect_line; GList *list; effect_line = AGS_EFFECT_LINE(gobject); if(effect_line->channel != NULL){ g_object_unref(effect_line->channel); effect_line->channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_effect_line_parent_class)->dispose(gobject); } void ags_effect_line_finalize(GObject *gobject) { AgsEffectLine *effect_line; AgsApplicationContext *application_context; GList *list; effect_line = AGS_EFFECT_LINE(gobject); application_context = ags_application_context_get_instance(); g_object_disconnect(application_context, "any_signal::check-message", G_CALLBACK(ags_effect_line_check_message_callback), effect_line, NULL); /* remove of the queued drawing hash */ list = effect_line->queued_drawing; while(list != NULL){ g_hash_table_remove(ags_effect_line_indicator_queue_draw, list->data); list = list->next; } /* channel */ if(effect_line->channel != NULL){ g_object_unref(effect_line->channel); } /* call parent */ G_OBJECT_CLASS(ags_effect_line_parent_class)->finalize(gobject); } void ags_effect_line_connect(AgsConnectable *connectable) { AgsEffectLine *effect_line; GList *list, *list_start; effect_line = AGS_EFFECT_LINE(connectable); if((AGS_EFFECT_LINE_CONNECTED & (effect_line->flags)) == 0){ return; } effect_line->flags &= (~AGS_EFFECT_LINE_CONNECTED); if((AGS_EFFECT_LINE_PREMAPPED_RECALL & (effect_line->flags)) == 0){ if((AGS_EFFECT_LINE_MAPPED_RECALL & (effect_line->flags)) == 0){ ags_effect_line_map_recall(effect_line, 0); } }else{ ags_effect_line_find_port(effect_line); } /* connect line members */ list_start = list = gtk_container_get_children(GTK_CONTAINER(effect_line->table)); while(list != NULL){ if(AGS_IS_CONNECTABLE(list->data)){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); } list = list->next; } g_list_free(list_start); } void ags_effect_line_disconnect(AgsConnectable *connectable) { AgsEffectLine *effect_line; GList *list, *list_start; effect_line = AGS_EFFECT_LINE(connectable); if((AGS_EFFECT_LINE_CONNECTED & (effect_line->flags)) == 0){ return; } /* unset connected flag */ effect_line->flags &= (~AGS_EFFECT_LINE_CONNECTED); /* disconnect line members */ list_start = list = gtk_container_get_children(GTK_CONTAINER(effect_line->table)); while(list != NULL){ if(AGS_IS_CONNECTABLE(list->data)){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); } list = list->next; } g_list_free(list_start); } /** * ags_effect_line_samplerate_changed: * @effect_line: the #AgsEffectLine * @samplerate: the samplerate * @old_samplerate: the old samplerate * * Notify about samplerate changed. * * Since: 3.0.0 */ void ags_effect_line_samplerate_changed(AgsEffectLine *effect_line, guint samplerate, guint old_samplerate) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit(G_OBJECT(effect_line), effect_line_signals[SAMPLERATE_CHANGED], 0, samplerate, old_samplerate); g_object_unref((GObject *) effect_line); } /** * ags_effect_line_buffer_size_changed: * @effect_line: the #AgsEffectLine * @buffer_size: the buffer_size * @old_buffer_size: the old buffer_size * * Notify about buffer_size changed. * * Since: 3.0.0 */ void ags_effect_line_buffer_size_changed(AgsEffectLine *effect_line, guint buffer_size, guint old_buffer_size) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit(G_OBJECT(effect_line), effect_line_signals[BUFFER_SIZE_CHANGED], 0, buffer_size, old_buffer_size); g_object_unref((GObject *) effect_line); } /** * ags_effect_line_format_changed: * @effect_line: the #AgsEffectLine * @format: the format * @old_format: the old format * * Notify about format changed. * * Since: 3.0.0 */ void ags_effect_line_format_changed(AgsEffectLine *effect_line, guint format, guint old_format) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit(G_OBJECT(effect_line), effect_line_signals[FORMAT_CHANGED], 0, format, old_format); g_object_unref((GObject *) effect_line); } void ags_effect_line_real_set_channel(AgsEffectLine *effect_line, AgsChannel *channel) { gchar *str; if(effect_line->channel == channel){ return; } if(effect_line->channel != NULL){ g_object_unref(G_OBJECT(effect_line->channel)); } if(channel != NULL){ g_object_ref(G_OBJECT(channel)); } if(effect_line->channel != NULL){ effect_line->flags &= (~AGS_EFFECT_LINE_PREMAPPED_RECALL); } if(channel != NULL){ effect_line->samplerate = channel->samplerate; effect_line->buffer_size = channel->buffer_size; effect_line->format = channel->format; } effect_line->channel = channel; if(channel != NULL){ guint audio_channel; /* get audio channel */ g_object_get(channel, "audio-channel", &audio_channel, NULL); /* set label */ str = g_strdup_printf("%s %d", i18n("channel"), audio_channel + 1); gtk_label_set_label(effect_line->label, str); g_free(str); }else{ str = g_strdup_printf("%s (null)", i18n("channel")); gtk_label_set_label(effect_line->label, str); g_free(str); } } /** * ags_effect_line_set_channel: * @effect_line: the #AgsEffectLine * @channel: the #AgsChannel to set * * Is emitted as channel gets modified. * * Since: 3.0.0 */ void ags_effect_line_set_channel(AgsEffectLine *effect_line, AgsChannel *channel) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit(G_OBJECT(effect_line), effect_line_signals[SET_CHANNEL], 0, channel); g_object_unref((GObject *) effect_line); } GList* ags_effect_line_add_ladspa_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect) { AgsLineMember *line_member; AgsEffectSeparator *separator; GtkAdjustment *adjustment; AgsLadspaPlugin *ladspa_plugin; AgsRecallHandler *recall_handler; GList *start_list, *list; GList *start_recall, *recall; GList *play_port, *recall_port; GList *start_plugin_port, *plugin_port; gdouble step; guint port_count; guint x, y; guint k; /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); play_port = NULL; recall_port = NULL; /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(effect_line->table); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_line->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* play - find ports */ g_object_get(effect_line->channel, "play", &start_recall, NULL); /* get by effect */ recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(start_recall, g_object_unref); start_recall = recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &play_port, NULL); g_list_foreach(play_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* recall - find ports */ g_object_get(effect_line->channel, "recall", &start_recall, NULL); /* get by effect */ recall = start_recall; start_recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(recall, g_object_unref); recall = start_recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &recall_port, NULL); g_list_foreach(recall_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* add separator */ separator = ags_effect_separator_new(); g_object_set(separator, "text", effect, "filename", filename, "effect", effect, NULL); gtk_table_attach(effect_line->table, (GtkWidget *) separator, 0, AGS_EFFECT_LINE_COLUMNS_COUNT, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show_all(GTK_WIDGET(separator)); y++; /* load ports */ g_object_get(ladspa_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLadspaConversion *ladspa_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; gchar *port_name; guint unique_id; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_LINE_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_line->table, y + 1, AGS_EFFECT_LINE_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } if(control_type_name != NULL){ widget_type = g_type_from_name(control_type_name->data); control_type_name = control_type_name->next; } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); /* add line member */ g_object_get(ladspa_plugin, "unique-id", &unique_id, NULL); plugin_name = g_strdup_printf("ladspa-%u", unique_id); control_port = g_strdup_printf("%u/%u", k + 1, port_count); line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", widget_type, "widget-label", AGS_PLUGIN_PORT(plugin_port->data)->port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "specifier", AGS_PLUGIN_PORT(plugin_port->data)->port_name, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_line_member_get_widget(line_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* ladspa conversion */ ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_SAMPLERATE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(line_member, "conversion", ladspa_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; float lower_bound, upper_bound; float default_value; gdouble lower, upper; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_RANGE(child_widget)){ GtkRange *range; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; range = (GtkRange *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(range, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ GtkSpinButton *spin_button; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; spin_button = (GtkSpinButton *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(spin_button, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_line_indicator_queue_draw, child_widget, ags_effect_line_indicator_queue_draw_timeout); effect_line->queued_drawing = g_list_prepend(effect_line->queued_drawing, child_widget); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_effect_line_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("ladspa bounds: %f %f", lower, upper); #endif gtk_table_attach(effect_line->table, (GtkWidget *) line_member, (x % AGS_EFFECT_LINE_COLUMNS_COUNT), (x % AGS_EFFECT_LINE_COLUMNS_COUNT) + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(line_member)); gtk_widget_show_all((GtkWidget *) line_member); /* iterate */ x++; if(x % AGS_EFFECT_LINE_COLUMNS_COUNT == 0){ y++; } } /* iterate */ plugin_port = plugin_port->next; k++; } g_list_free_full(start_plugin_port, g_object_unref); return(g_list_concat(play_port, recall_port)); } GList* ags_effect_line_add_lv2_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect) { AgsLineMember *line_member; AgsEffectSeparator *separator; GtkAdjustment *adjustment; AgsLv2Plugin *lv2_plugin; AgsRecallHandler *recall_handler; GList *start_list, *list; GList *start_recall, *recall; GList *play_port, *recall_port; GList *start_plugin_port, *plugin_port; gchar *uri; gdouble step; guint port_count; guint x, y; guint k; /* load plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(effect_line->table); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_line->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* play - find ports */ g_object_get(effect_line->channel, "play", &start_recall, NULL); /* get by effect */ recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(start_recall, g_object_unref); start_recall = recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &play_port, NULL); g_list_foreach(play_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* recall - find ports */ g_object_get(effect_line->channel, "recall", &start_recall, NULL); /* get by effect */ recall = start_recall; start_recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(recall, g_object_unref); recall = start_recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &recall_port, NULL); g_list_foreach(recall_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* add separator */ separator = ags_effect_separator_new(); g_object_set(separator, "text", effect, "filename", filename, "effect", effect, NULL); gtk_table_attach(effect_line->table, (GtkWidget *) separator, 0, AGS_EFFECT_LINE_COLUMNS_COUNT, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show_all(GTK_WIDGET(separator)); y++; /* get uri */ g_object_get(lv2_plugin, "uri", &uri, NULL); /* load ports */ g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLv2Conversion *lv2_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; gchar *port_name; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_LINE_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_line->table, y + 1, AGS_EFFECT_LINE_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } if(control_type_name != NULL){ widget_type = g_type_from_name(control_type_name->data); control_type_name = control_type_name->next; } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); /* add line member */ plugin_name = g_strdup_printf("lv2-<%s>", uri); control_port = g_strdup_printf("%u/%u", k + 1, port_count); line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", widget_type, "widget-label", port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "specifier", port_name, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_line_member_get_widget(line_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* lv2 conversion */ lv2_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(lv2_conversion == NULL || !AGS_IS_LV2_CONVERSION(lv2_conversion)){ lv2_conversion = ags_lv2_conversion_new(); } lv2_conversion->flags |= AGS_LV2_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(line_member, "conversion", lv2_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_RANGE(child_widget)){ GtkRange *range; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; range = (GtkRange *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(range, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ GtkSpinButton *spin_button; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; spin_button = (GtkSpinButton *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(spin_button, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_line_indicator_queue_draw, child_widget, ags_effect_line_indicator_queue_draw_timeout); effect_line->queued_drawing = g_list_prepend(effect_line->queued_drawing, child_widget); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_effect_line_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("lv2 bounds: %f %f", lower, upper); #endif gtk_table_attach(effect_line->table, (GtkWidget *) line_member, (x % AGS_EFFECT_LINE_COLUMNS_COUNT), (x % AGS_EFFECT_LINE_COLUMNS_COUNT) + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(line_member)); gtk_widget_show_all((GtkWidget *) line_member); /* iterate */ x++; if(x % AGS_EFFECT_LINE_COLUMNS_COUNT == 0){ y++; } } /* iterate */ plugin_port = plugin_port->next; k++; } g_list_free_full(start_plugin_port, g_object_unref); g_free(uri); return(g_list_concat(play_port, recall_port)); } GList* ags_effect_line_real_add_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect) { AgsWindow *window; AgsLadspaPlugin *ladspa_plugin; AgsLv2Plugin *lv2_plugin; GList *port; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) effect_line); /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); port = NULL; if(ladspa_plugin != NULL){ port = ags_effect_line_add_ladspa_effect(effect_line, control_type_name, filename, effect); }else{ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL){ port = ags_effect_line_add_lv2_effect(effect_line, control_type_name, filename, effect); } } /* */ ags_automation_toolbar_load_port(window->automation_window->automation_editor->automation_toolbar); return(port); } /** * ags_effect_line_add_effect: * @effect_line: the #AgsEffectLine to modify * @control_type_name: the #GList-struct containing string representation of a #GType * @filename: the effect's filename * @effect: the effect's name * * Add an effect by its filename and effect specifier. * * Returns: the #GList-struct containing the #AgsPort objects added * * Since: 3.0.0 */ GList* ags_effect_line_add_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect) { GList *port; g_return_val_if_fail(AGS_IS_EFFECT_LINE(effect_line), NULL); g_object_ref((GObject *) effect_line); g_signal_emit(G_OBJECT(effect_line), effect_line_signals[ADD_EFFECT], 0, control_type_name, filename, effect, &port); g_object_unref((GObject *) effect_line); return(port); } void ags_effect_line_real_remove_effect(AgsEffectLine *effect_line, guint nth) { AgsWindow *window; GList *control, *control_start; GList *start_recall, *recall; GList *start_port, *port; gchar *filename, *effect; guint nth_effect, n_bulk; guint i; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) effect_line); /* get nth_effect */ g_object_get(effect_line->channel, "play", &start_recall, NULL); recall = start_recall; nth_effect = 0; n_bulk = 0; while((recall = ags_recall_template_find_all_type(recall, AGS_TYPE_RECALL_LADSPA, AGS_TYPE_RECALL_LV2, G_TYPE_NONE)) != NULL){ if(ags_recall_test_flags(recall->data, AGS_RECALL_TEMPLATE)){ nth_effect++; } if(ags_recall_test_behaviour_flags(recall->data, AGS_SOUND_BEHAVIOUR_BULK_MODE)){ n_bulk++; } if(nth_effect - n_bulk == nth + 1){ break; } recall = recall->next; } if(recall == NULL){ g_list_free_full(start_recall, g_object_unref); return; } nth_effect--; /* get filename and effect */ g_object_get(recall->data, "filename", &filename, "effect", &effect, NULL); /* destroy separator */ control_start = control = gtk_container_get_children((GtkContainer *) effect_line->table); while(control != NULL){ gchar *separator_filename; gchar *separator_effect; if(AGS_IS_EFFECT_SEPARATOR(control->data)){ g_object_get(control->data, "filename", &separator_filename, "effect", &separator_effect, NULL); if(separator_filename != NULL && separator_effect != NULL && !g_strcmp0(filename, separator_filename) && !g_strcmp0(effect, separator_effect)){ gtk_widget_destroy(control->data); break; } } control = control->next; } g_list_free(control_start); /* destroy controls */ g_object_get(recall->data, "port", &start_port, NULL); port = start_port; i = 0; while(port != NULL){ control_start = control = gtk_container_get_children((GtkContainer *) effect_line->table); while(control != NULL){ if(AGS_IS_LINE_MEMBER(control->data) && AGS_LINE_MEMBER(control->data)->port == port->data){ GtkWidget *child_widget; child_widget = gtk_bin_get_child(control->data); /* collect specifier */ i++; /* remove widget */ if(AGS_IS_LED(child_widget) || AGS_IS_INDICATOR(child_widget)){ g_hash_table_remove(ags_effect_line_indicator_queue_draw, child_widget); } gtk_widget_destroy(control->data); break; } /* iterate */ control = control->next; } g_list_free(control_start); /* iterate */ port = port->next; } g_list_free_full(start_recall, g_object_unref); g_list_free_full(start_port, g_object_unref); /* remove recalls */ ags_channel_remove_effect(effect_line->channel, nth_effect); /* reset automation editor */ ags_automation_toolbar_load_port(window->automation_window->automation_editor->automation_toolbar); } /** * ags_effect_line_remove_effect: * @effect_line: the #AgsEffectLine to modify * @nth: the nth effect to remove * * Remove an effect by its position. * * Since: 3.0.0 */ void ags_effect_line_remove_effect(AgsEffectLine *effect_line, guint nth) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit(G_OBJECT(effect_line), effect_line_signals[REMOVE_EFFECT], 0, nth); g_object_unref((GObject *) effect_line); } void ags_effect_line_real_map_recall(AgsEffectLine *effect_line, guint ouput_pad_start) { if((AGS_EFFECT_LINE_MAPPED_RECALL & (effect_line->flags)) != 0){ return; } effect_line->flags |= AGS_EFFECT_LINE_MAPPED_RECALL; ags_effect_line_find_port(effect_line); } /** * ags_effect_line_map_recall: * @effect_line: the #AgsEffectLine to add its default recall. * @output_pad_start: the start channel's index * * You may want the @effect_line to add its default recall. This function * may call ags_effect_line_find_port(). * * Since: 3.0.0 */ void ags_effect_line_map_recall(AgsEffectLine *effect_line, guint output_pad_start) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit((GObject *) effect_line, effect_line_signals[MAP_RECALL], 0, output_pad_start); g_object_unref((GObject *) effect_line); } GList* ags_effect_line_real_find_port(AgsEffectLine *effect_line) { GList *port, *tmp_port; GList *line_member, *line_member_start; if(effect_line == NULL || effect_line->table == NULL){ return(NULL); } line_member_start = line_member = gtk_container_get_children(GTK_CONTAINER(effect_line->table)); port = NULL; if(line_member != NULL){ while(line_member != NULL){ if(AGS_IS_LINE_MEMBER(line_member->data)){ tmp_port = ags_line_member_find_port(AGS_LINE_MEMBER(line_member->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } } line_member = line_member->next; } g_list_free(line_member_start); } return(port); } /** * ags_effect_line_find_port: * @effect_line: the #AgsEffectLine * * Lookup ports of associated recalls. * * Returns: a #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ GList* ags_effect_line_find_port(AgsEffectLine *effect_line) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_EFFECT_LINE(effect_line), NULL); g_object_ref((GObject *) effect_line); g_signal_emit((GObject *) effect_line, effect_line_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) effect_line); return(list); } /** * ags_effect_line_done: * @effect_line: the #AgsEffectLine * @recall_id: the #AgsRecallID * * Notify about to stop playback of @recall_id. * * Since: 3.0.0 */ void ags_effect_line_done(AgsEffectLine *effect_line, GObject *recall_id) { g_return_if_fail(AGS_IS_EFFECT_LINE(effect_line)); g_object_ref((GObject *) effect_line); g_signal_emit((GObject *) effect_line, effect_line_signals[DONE], 0, recall_id); g_object_unref((GObject *) effect_line); } /** * ags_effect_line_find_next_grouped: * @effect_line: a #GList-struct of #AgsEffectLine objects * * Retrieve next grouped effect_line. * * Returns: next matching #GList-struct containing #AgsEffectLine * * Since: 3.0.0 */ GList* ags_effect_line_find_next_grouped(GList *effect_line) { while(effect_line != NULL && !gtk_toggle_button_get_active(AGS_EFFECT_LINE(effect_line->data)->group)){ effect_line = effect_line->next; } return(effect_line); } /** * ags_effect_line_check_message: * @effect_line: the #AgsEffectLine * * Check message queue for message envelopes. * * Since: 3.0.0 */ void ags_effect_line_check_message(AgsEffectLine *effect_line) { AgsChannel *channel; AgsMessageDelivery *message_delivery; GList *start_message_envelope, *message_envelope; if(!AGS_IS_EFFECT_LINE(effect_line)){ return; } /* retrieve message */ message_delivery = ags_message_delivery_get_instance(); channel = effect_line->channel; message_envelope = start_message_envelope = ags_message_delivery_find_sender(message_delivery, "libgsequencer", (GObject *) channel); while(message_envelope != NULL){ xmlNode *root_node; root_node = xmlDocGetRootElement(AGS_MESSAGE_ENVELOPE(message_envelope->data)->doc); if(!xmlStrncmp(root_node->name, "ags-command", 12)){ if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::set-samplerate", 27)){ guint samplerate; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "samplerate"); samplerate = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set samplerate */ g_object_set(effect_line, "samplerate", samplerate, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::set-buffer-size", 28)){ guint buffer_size; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "buffer-size"); buffer_size = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set buffer size */ g_object_set(effect_line, "buffer-size", buffer_size, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::set-format", 23)){ guint format; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "format"); format = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set format */ g_object_set(effect_line, "format", format, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::add-effect", 22)){ AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineMemberEditor *line_member_editor; AgsPluginBrowser *plugin_browser; GList *pad_editor, *pad_editor_start; GList *line_editor, *line_editor_start; GList *control_type_name; gchar *filename, *effect; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "filename"); filename = g_value_get_string(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "effect"); effect = g_value_get_string(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* get machine and machine editor */ machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) effect_line, AGS_TYPE_MACHINE); machine_editor = (AgsMachineEditor *) machine->properties; /* get control type */ control_type_name = NULL; pad_editor_start = NULL; line_editor_start = NULL; if(machine_editor != NULL){ pad_editor_start = pad_editor = gtk_container_get_children((GtkContainer *) machine_editor->input_editor->child); pad_editor = g_list_nth(pad_editor, channel->pad); if(pad_editor != NULL){ line_editor_start = line_editor = gtk_container_get_children((GtkContainer *) AGS_PAD_EDITOR(pad_editor->data)->line_editor); line_editor = g_list_nth(line_editor, channel->audio_channel); }else{ line_editor = NULL; } if(line_editor != NULL){ line_member_editor = AGS_LINE_EDITOR(line_editor->data)->member_editor; plugin_browser = line_member_editor->plugin_browser; if(plugin_browser != NULL && plugin_browser->active_browser != NULL){ GList *description, *description_start; GList *port_control, *port_control_start; gchar *controls; /* get plugin browser */ description = description_start = NULL; port_control = port_control_start = NULL; if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){ description_start = description = gtk_container_get_children((GtkContainer *) AGS_LADSPA_BROWSER(plugin_browser->active_browser)->description); }else if(AGS_IS_DSSI_BROWSER(plugin_browser->active_browser)){ description_start = description = gtk_container_get_children((GtkContainer *) AGS_DSSI_BROWSER(plugin_browser->active_browser)->description); }else if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){ description_start = description = gtk_container_get_children((GtkContainer *) AGS_LV2_BROWSER(plugin_browser->active_browser)->description); }else{ g_message("ags_line_callbacks.c unsupported plugin browser"); } /* get port description */ if(description != NULL){ description = g_list_last(description); port_control_start = port_control = gtk_container_get_children(GTK_CONTAINER(description->data)); if(port_control != NULL){ while(port_control != NULL){ controls = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(port_control->data)); if(!g_ascii_strncasecmp(controls, "led", 4)){ control_type_name = g_list_prepend(control_type_name, "AgsLed"); }else if(!g_ascii_strncasecmp(controls, "vertical indicator", 19)){ control_type_name = g_list_prepend(control_type_name, "AgsVIndicator"); }else if(!g_ascii_strncasecmp(controls, "horizontal indicator", 19)){ control_type_name = g_list_prepend(control_type_name, "AgsHIndicator"); }else if(!g_ascii_strncasecmp(controls, "spin button", 12)){ control_type_name = g_list_prepend(control_type_name, "GtkSpinButton"); }else if(!g_ascii_strncasecmp(controls, "dial", 5)){ control_type_name = g_list_prepend(control_type_name, "AgsDial"); }else if(!g_ascii_strncasecmp(controls, "vertical scale", 15)){ control_type_name = g_list_prepend(control_type_name, "GtkVScale"); }else if(!g_ascii_strncasecmp(controls, "horizontal scale", 17)){ control_type_name = g_list_prepend(control_type_name, "GtkHScale"); }else if(!g_ascii_strncasecmp(controls, "check-button", 13)){ control_type_name = g_list_prepend(control_type_name, "GtkCheckButton"); }else if(!g_ascii_strncasecmp(controls, "toggle button", 14)){ control_type_name = g_list_prepend(control_type_name, "GtkToggleButton"); } port_control = port_control->next; port_control = port_control->next; } } /* free lists */ g_list_free(description_start); g_list_free(port_control_start); } } // line_member_editor->plugin_browser; } }else{ control_type_name = NULL; } /* free lists */ g_list_free(pad_editor_start); g_list_free(line_editor_start); /* add effect */ ags_effect_line_add_effect(effect_line, control_type_name, filename, effect); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::done", 16)){ AgsRecallID *recall_id; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "recall-id"); recall_id = g_value_get_object(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* done */ ags_effect_line_done(effect_line, (GObject *) recall_id); } } message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, g_object_unref); } /** * ags_effect_line_indicator_queue_draw_timeout: * @widget: the indicator widgt * * Queue draw widget * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_effect_line_indicator_queue_draw_timeout(GtkWidget *widget) { AgsEffectLine *effect_line; if(g_hash_table_lookup(ags_effect_line_indicator_queue_draw, widget) != NULL){ GList *list, *list_start; effect_line = (AgsEffectLine *) gtk_widget_get_ancestor(widget, AGS_TYPE_EFFECT_LINE); list_start = list = gtk_container_get_children((GtkContainer *) AGS_EFFECT_LINE(effect_line)->table); /* check members */ while(list != NULL){ if(AGS_IS_LINE_MEMBER(list->data) && (AGS_LINE_MEMBER(list->data)->widget_type == AGS_TYPE_VINDICATOR || AGS_LINE_MEMBER(list->data)->widget_type == AGS_TYPE_HINDICATOR || AGS_LINE_MEMBER(list->data)->widget_type == AGS_TYPE_LED)){ AgsLineMember *line_member; GtkAdjustment *adjustment; GtkWidget *child; AgsPort *current; AgsPluginPort *plugin_port; gdouble average_peak; gdouble lower, upper; gdouble range; gdouble peak; gboolean success; GValue value = {0,}; GRecMutex *port_mutex; GRecMutex *plugin_port_mutex; line_member = AGS_LINE_MEMBER(list->data); child = gtk_bin_get_child(GTK_BIN(line_member)); average_peak = 0.0; /* play port */ current = line_member->port; if(current == NULL){ list = list->next; continue; } /* check if output port and specifier matches */ if(!ags_port_test_flags(current, AGS_PORT_IS_OUTPUT)){ list = list->next; continue; } g_object_get(current, "plugin-port", &plugin_port, NULL); if(plugin_port == NULL){ list = list->next; continue; } g_object_unref(plugin_port); /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current); /* match specifier */ g_rec_mutex_lock(port_mutex); success = (!g_ascii_strcasecmp(current->specifier, line_member->specifier)) ? TRUE: FALSE; g_rec_mutex_unlock(port_mutex); if(!success){ list = list->next; continue; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); /* lower and upper */ g_rec_mutex_lock(plugin_port_mutex); lower = g_value_get_float(plugin_port->lower_value); upper = g_value_get_float(plugin_port->upper_value); g_rec_mutex_unlock(plugin_port_mutex); /* get range */ if(line_member->conversion != NULL){ lower = ags_conversion_convert(line_member->conversion, lower, TRUE); upper = ags_conversion_convert(line_member->conversion, upper, TRUE); } range = upper - lower; /* play port - read value */ g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current, &value); peak = g_value_get_float(&value); g_value_unset(&value); if(line_member->conversion != NULL){ peak = ags_conversion_convert(line_member->conversion, peak, TRUE); } /* calculate peak */ if(range == 0.0 || current->port_value_type == G_TYPE_BOOLEAN){ if(peak != 0.0){ average_peak = 10.0; } }else{ average_peak += ((1.0 / (range / peak)) * 10.0); } /* recall port */ current = line_member->recall_port; /* recall port - read value */ g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current, &value); peak = g_value_get_float(&value); g_value_unset(&value); if(line_member->conversion != NULL){ peak = ags_conversion_convert(line_member->conversion, peak, TRUE); } /* calculate peak */ if(range == 0.0 || current->port_value_type == G_TYPE_BOOLEAN){ if(peak != 0.0){ average_peak = 10.0; } }else{ average_peak += ((1.0 / (range / peak)) * 10.0); } /* apply */ if(AGS_IS_LED(child)){ if(average_peak != 0.0){ ags_led_set_active((AgsLed *) child); } }else{ g_object_get(child, "adjustment", &adjustment, NULL); gtk_adjustment_set_value(adjustment, average_peak); } } list = list->next; } g_list_free(list_start); /* queue draw */ gtk_widget_queue_draw(widget); return(TRUE); }else{ return(FALSE); } } /** * ags_effect_line_new: * @channel: the #AgsChannel to visualize * * Create a new instance of #AgsEffectLine * * Returns: the new #AgsEffectLine * * Since: 3.0.0 */ AgsEffectLine* ags_effect_line_new(AgsChannel *channel) { AgsEffectLine *effect_line; effect_line = (AgsEffectLine *) g_object_new(AGS_TYPE_EFFECT_LINE, "channel", channel, NULL); return(effect_line); } gsequencer-3.1.3/ags/X/ags_input_collection_editor.c0000644000175000017500000003771313607210263017512 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_input_collection_editor_class_init(AgsInputCollectionEditorClass *input_collection_editor); void ags_input_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_input_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_input_collection_editor_init(AgsInputCollectionEditor *input_collection_editor); void ags_input_collection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_input_collection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_input_collection_editor_connect(AgsConnectable *connectable); void ags_input_collection_editor_disconnect(AgsConnectable *connectable); void ags_input_collection_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_input_collection_editor_apply(AgsApplicable *applicable); void ags_input_collection_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_input_collection_editor * @short_description: edit audio connections in bulk mode. * @title: AgsInputCollectionEditor * @section_id: * @include: ags/X/ags_input_collection_editor.h * * #AgsInputCollectionEditor is a composite widget to modify audio connections. A input collection * editor should be packed by a #AgsConnectionEditor. */ static gpointer ags_input_collection_editor_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL_TYPE, }; GType ags_input_collection_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_input_collection_editor = 0; static const GTypeInfo ags_input_collection_editor_info = { sizeof (AgsInputCollectionEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_input_collection_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsInputCollectionEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_input_collection_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_input_collection_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_input_collection_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_input_collection_editor = g_type_register_static(GTK_TYPE_TABLE, "AgsInputCollectionEditor", &ags_input_collection_editor_info, 0); g_type_add_interface_static(ags_type_input_collection_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_input_collection_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_input_collection_editor); } return g_define_type_id__volatile; } void ags_input_collection_editor_class_init(AgsInputCollectionEditorClass *input_collection_editor) { GObjectClass *gobject; GParamSpec *param_spec; ags_input_collection_editor_parent_class = g_type_class_peek_parent(input_collection_editor); /* GObjectClass */ gobject = (GObjectClass *) input_collection_editor; gobject->set_property = ags_input_collection_editor_set_property; gobject->get_property = ags_input_collection_editor_get_property; /* properties */ /** * AgsInputCollectionEditor:channel-type: * * The channel type to apply to. Either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("channel-type", i18n_pspec("assigned channel type"), i18n_pspec("The channel type which this channel input collection editor is assigned with"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL_TYPE, param_spec); } void ags_input_collection_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_input_collection_editor_connect; connectable->disconnect = ags_input_collection_editor_disconnect; } void ags_input_collection_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_input_collection_editor_set_update; applicable->apply = ags_input_collection_editor_apply; applicable->reset = ags_input_collection_editor_reset; } void ags_input_collection_editor_init(AgsInputCollectionEditor *input_collection_editor) { GtkAlignment *alignment; GtkLabel *label; input_collection_editor->flags = 0; g_signal_connect_after(GTK_WIDGET(input_collection_editor), "parent-set", G_CALLBACK(ags_input_collection_editor_parent_set_callback), input_collection_editor); input_collection_editor->channel_type = G_TYPE_NONE; gtk_table_resize(GTK_TABLE(input_collection_editor), 4, 2); gtk_table_set_row_spacings(GTK_TABLE(input_collection_editor), 4); gtk_table_set_col_spacings(GTK_TABLE(input_collection_editor), 2); /* first line */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(alignment), 0, 1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("first line")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); input_collection_editor->first_line = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 1.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(input_collection_editor->first_line), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* count */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(alignment), 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("count")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); input_collection_editor->count = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 1.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(input_collection_editor->count), 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* soundcard */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(alignment), 0, 1, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("soundcard")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); input_collection_editor->soundcard = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(input_collection_editor->soundcard), 1, 2, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* audio channel */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(alignment), 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("audio channel")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); input_collection_editor->audio_channel = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0, -1.0, 1.0); gtk_table_attach(GTK_TABLE(input_collection_editor), GTK_WIDGET(input_collection_editor->audio_channel), 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); } void ags_input_collection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsInputCollectionEditor *input_collection_editor; input_collection_editor = AGS_INPUT_COLLECTION_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: { input_collection_editor->channel_type = g_value_get_gtype(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_input_collection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsInputCollectionEditor *input_collection_editor; input_collection_editor = AGS_INPUT_COLLECTION_EDITOR(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: { g_value_set_gtype(value, input_collection_editor->channel_type); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_input_collection_editor_connect(AgsConnectable *connectable) { AgsInputCollectionEditor *input_collection_editor; /* AgsInputCollectionEditor */ input_collection_editor = AGS_INPUT_COLLECTION_EDITOR(connectable); if((AGS_INPUT_COLLECTION_EDITOR_CONNECTED & (input_collection_editor->flags)) != 0){ return; } input_collection_editor->flags |= AGS_INPUT_COLLECTION_EDITOR_CONNECTED; g_signal_connect_after(G_OBJECT(input_collection_editor->soundcard), "changed", G_CALLBACK(ags_input_collection_editor_soundcard_callback), input_collection_editor); } void ags_input_collection_editor_disconnect(AgsConnectable *connectable) { AgsInputCollectionEditor *input_collection_editor; /* AgsInputCollectionEditor */ input_collection_editor = AGS_INPUT_COLLECTION_EDITOR(connectable); if((AGS_INPUT_COLLECTION_EDITOR_CONNECTED & (input_collection_editor->flags)) == 0){ return; } input_collection_editor->flags &= (~AGS_INPUT_COLLECTION_EDITOR_CONNECTED); g_object_disconnect(G_OBJECT(input_collection_editor->soundcard), "any_signal::changed", G_CALLBACK(ags_input_collection_editor_soundcard_callback), input_collection_editor, NULL); } void ags_input_collection_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_input_collection_editor_apply(AgsApplicable *applicable) { AgsInputCollectionEditor *input_collection_editor; GtkTreeIter iter; input_collection_editor = AGS_INPUT_COLLECTION_EDITOR(applicable); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(input_collection_editor->soundcard), &iter)){ AgsMachine *machine; AgsConnectionEditor *connection_editor; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel; GObject *input_soundcard; GtkTreeModel *model; GList *task; guint audio_channels; guint first_line, count; guint audio_channel; guint i; connection_editor = AGS_CONNECTION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(input_collection_editor), AGS_TYPE_CONNECTION_EDITOR)); machine = connection_editor->machine; audio = machine->audio; /* get mapping and soundcard */ first_line = (guint) gtk_spin_button_get_value_as_int(input_collection_editor->first_line); count = (guint) gtk_spin_button_get_value_as_int(input_collection_editor->count); audio_channel = (guint) gtk_spin_button_get_value_as_int(input_collection_editor->audio_channel); model = gtk_combo_box_get_model(GTK_COMBO_BOX(input_collection_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &input_soundcard, -1); /* apply */ g_object_get(audio, "output", &start_output, "input", &start_input, NULL); for(i = 0; i < count; i++){ channel = NULL; if(g_type_is_a(input_collection_editor->channel_type, AGS_TYPE_OUTPUT)){ channel = start_output; }else if(g_type_is_a(input_collection_editor->channel_type, AGS_TYPE_INPUT)){ channel = start_input; } nth_channel = ags_channel_nth(channel, first_line + i); g_object_set(nth_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", audio_channel, NULL); g_object_unref(nth_channel); } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } } void ags_input_collection_editor_reset(AgsApplicable *applicable) { /* empty */ } /** * ags_input_collection_editor_check: * @input_collection_editor: the #AgsInputCollectionEditor * * Checks for possible channels to input. And modifies its ranges. * * Since: 3.0.0 */ void ags_input_collection_editor_check(AgsInputCollectionEditor *input_collection_editor) { AgsConnectionEditor *connection_editor; AgsAudio *audio; GtkTreeIter iter; guint count; connection_editor = AGS_CONNECTION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(input_collection_editor), AGS_TYPE_CONNECTION_EDITOR)); audio = connection_editor->machine->audio; /* get audio fields */ if(g_type_is_a(input_collection_editor->channel_type, AGS_TYPE_INPUT)){ g_object_get(audio, "input-lines", &count, NULL); }else if(g_type_is_a(input_collection_editor->channel_type, AGS_TYPE_OUTPUT)){ g_object_get(audio, "output-lines", &count, NULL); }else{ count = 0; } gtk_spin_button_set_range(input_collection_editor->first_line, 0.0, count - 1.0); gtk_spin_button_set_range(input_collection_editor->count, 0.0, count); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(input_collection_editor->soundcard), &iter)){ GObject *input_soundcard; GtkTreeModel *model; guint audio_channels; /* soundcard connection */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(input_collection_editor->soundcard)); gtk_tree_model_get(model, &iter, 1, &input_soundcard, -1); ags_soundcard_get_presets(AGS_SOUNDCARD(input_soundcard), &audio_channels, NULL, NULL, NULL); gtk_spin_button_set_range(input_collection_editor->audio_channel, 0.0, audio_channels - 1.0); if(audio_channels < count){ gtk_spin_button_set_range(input_collection_editor->count, 0.0, audio_channels); } }else{ gtk_spin_button_set_range(input_collection_editor->audio_channel, -1.0, -1.0); } } /** * ags_input_collection_editor_new: * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * * Create a new instance of #AgsInputCollectionEditor * * Returns: the new #AgsInputCollectionEditor * * Since: 3.0.0 */ AgsInputCollectionEditor* ags_input_collection_editor_new(GType channel_type) { AgsInputCollectionEditor *input_collection_editor; input_collection_editor = (AgsInputCollectionEditor *) g_object_new(AGS_TYPE_INPUT_COLLECTION_EDITOR, "channel_type", channel_type, NULL); return(input_collection_editor); } gsequencer-3.1.3/ags/X/ags_server_preferences_callbacks.c0000644000175000017500000000146713605312646020463 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/ags_machine.h0000644000175000017500000002027613607210263014177 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_H__ #define __AGS_MACHINE_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE (ags_machine_get_type()) #define AGS_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE, AgsMachine)) #define AGS_MACHINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE, AgsMachineClass)) #define AGS_IS_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MACHINE)) #define AGS_IS_MACHINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MACHINE)) #define AGS_MACHINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MACHINE, AgsMachineClass)) #define AGS_MACHINE_AUTOMATION_PORT(ptr) ((AgsMachineAutomationPort *)(ptr)) #define AGS_MACHINE_DEFAULT_VERSION "2.1.60" #define AGS_MACHINE_DEFAULT_BUILD_ID "Wed Feb 20 18:38:17 UTC 2019" typedef struct _AgsMachine AgsMachine; typedef struct _AgsMachineClass AgsMachineClass; typedef struct _AgsMachineAutomationPort AgsMachineAutomationPort; typedef enum{ AGS_MACHINE_SOLO = 1, AGS_MACHINE_IS_EFFECT = 1 << 1, AGS_MACHINE_IS_SEQUENCER = 1 << 2, AGS_MACHINE_IS_SYNTHESIZER = 1 << 3, AGS_MACHINE_IS_WAVE_PLAYER = 1 << 4, AGS_MACHINE_TAKES_FILE_INPUT = 1 << 5, AGS_MACHINE_MAPPED_RECALL = 1 << 6, AGS_MACHINE_PREMAPPED_RECALL = 1 << 7, AGS_MACHINE_BLOCK_PLAY = 1 << 8, AGS_MACHINE_BLOCK_STOP = 1 << 9, AGS_MACHINE_BLOCK_STOP_CALLBACK = 1 << 10, AGS_MACHINE_CONNECTED = 1 << 11, AGS_MACHINE_REVERSE_NOTATION = 1 << 12, AGS_MACHINE_STICKY_CONTROLS = 1 << 13, }AgsMachineFlags; typedef enum{ AGS_MACHINE_ACCEPT_WAV = 1, AGS_MACHINE_ACCEPT_OGG = 1 << 1, AGS_MACHINE_ACCEPT_SOUNDFONT2 = 1 << 2, AGS_MACHINE_ACCEPT_SFZ = 1 << 3, }AgsMachineFileInputFlags; typedef enum{ AGS_MACHINE_MONO = 1, AGS_MACHINE_DISABLE_LINE_MEMBER = 1 << 1, AGS_MACHINE_DISABLE_BULK_MEMBER = 1 << 2, }AgsMachineMappingFlags; typedef enum{ AGS_MACHINE_POPUP_COPY_PATTERN = 1, AGS_MACHINE_POPUP_PASTE_PATTERN = 1 << 1, AGS_MACHINE_POPUP_ENVELOPE = 1 << 2, }AgsMachineEditOptions; typedef enum{ AGS_MACHINE_POPUP_CONNECTION_EDITOR = 1, AGS_MACHINE_SHOW_AUDIO_OUTPUT_CONNECTION = 1 << 1, AGS_MACHINE_SHOW_AUDIO_INPUT_CONNECTION = 1 << 2, AGS_MACHINE_POPUP_MIDI_DIALOG = 1 << 3, AGS_MACHINE_SHOW_MIDI_INPUT = 1 << 4, AGS_MACHINE_SHOW_MIDI_OUTPUT = 1 << 5, }AgsMachineConnectionOptions; typedef enum{ AGS_MACHINE_POPUP_MIDI_EXPORT = 1, AGS_MACHINE_POPUP_WAVE_EXPORT = 1 << 1, }AgsMachineExportOptions; typedef enum{ AGS_MACHINE_POPUP_MIDI_IMPORT = 1, AGS_MACHINE_POPUP_WAVE_IMPORT = 1 << 1, }AgsMachineImportOptions; struct _AgsMachine { GtkBin bin; guint flags; guint file_input_flags; guint mapping_flags; guint connection_flags; guint export_flags; guint import_flags; char *machine_name; gchar *version; gchar *build_id; guint samplerate; guint buffer_size; guint format; guint bank_0; guint bank_1; AgsAudio *audio; GList *active_playback; GtkToggleButton *play; GType output_pad_type; GType output_line_type; GtkContainer *output; GtkWidget *selected_output_pad; GType input_pad_type; GType input_line_type; GtkContainer *input; GtkWidget *selected_input_pad; GtkContainer *bridge; GList *port; GList *enabled_automation_port; GtkMenuToolButton *menu_tool_button; GtkMenu *popup; GtkDialog *properties; GtkDialog *rename; GtkDialog *rename_audio; GtkDialog *reposition_audio; GtkDialog *connection_editor; GtkDialog *midi_dialog; GtkDialog *envelope_dialog; GtkDialog *envelope_info; GtkDialog *midi_export_dialog; GtkDialog *wave_export_dialog; GtkDialog *midi_import_dialog; GtkDialog *wave_import_dialog; }; struct _AgsMachineClass { GtkBinClass bin; void (*samplerate_changed)(AgsMachine *machine, guint samplerate, guint old_samplerate); void (*buffer_size_changed)(AgsMachine *machine, guint buffer_size, guint old_buffer_size); void (*format_changed)(AgsMachine *machine, guint format, guint old_format); void (*resize_audio_channels)(AgsMachine *machine, guint new_size, guint old_size); void (*resize_pads)(AgsMachine *machine, GType channel_type, guint new_size, guint old_size); void (*map_recall)(AgsMachine *machine); GList* (*find_port)(AgsMachine *machine); void (*stop)(AgsMachine *machine, GList *recall_id, gint sound_scope); }; struct _AgsMachineAutomationPort { GType channel_type; gchar *control_name; }; GType ags_machine_get_type(void); AgsMachineAutomationPort* ags_machine_automation_port_alloc(GType channel_type, gchar *control_name); void ags_machine_automation_port_free(AgsMachineAutomationPort *automation_port); GList* ags_machine_automation_port_find_channel_type_with_control_name(GList *list, GType channel_type, gchar *control_name); void ags_machine_samplerate_changed(AgsMachine *machine, guint samplerate, guint old_samplerate); void ags_machine_buffer_size_changed(AgsMachine *machine, guint buffer_size, guint old_buffer_size); void ags_machine_format_changed(AgsMachine *machine, guint format, guint old_format); void ags_machine_resize_audio_channels(AgsMachine *machine, guint new_size, guint old_size); void ags_machine_resize_pads(AgsMachine *machine, GType channel_type, guint new_size, guint old_size); void ags_machine_map_recall(AgsMachine *machine); GList* ags_machine_find_port(AgsMachine *machine); void ags_machine_stop(AgsMachine *machine, GList *recall_id, gint sound_scope); void ags_machine_add_default_recalls(AgsMachine *machine) G_DEPRECATED_FOR(ags_machine_map_recall); AgsMachine* ags_machine_find_by_name(GList *list, char *name); void ags_machine_playback_set_active(AgsMachine *machine, AgsPlayback *playback, gboolean is_active); void ags_machine_set_run(AgsMachine *machine, gboolean run); void ags_machine_set_run_extended(AgsMachine *machine, gboolean run, gboolean sequencer, gboolean notation, gboolean wave, gboolean midi); GtkListStore* ags_machine_get_possible_links(AgsMachine *machine); GtkListStore* ags_machine_get_possible_audio_output_connections(AgsMachine *machine); GtkListStore* ags_machine_get_possible_audio_input_connections(AgsMachine *machine); GtkFileChooserDialog* ags_machine_file_chooser_dialog_new(AgsMachine *machine); void ags_machine_open_files(AgsMachine *machine, GSList *filenames, gboolean overwrite_channels, gboolean create_channels); void ags_machine_copy_pattern(AgsMachine *machine); void ags_machine_popup_add_edit_options(AgsMachine *machine, guint edit_options); void ags_machine_popup_add_connection_options(AgsMachine *machine, guint connection_options); void ags_machine_popup_add_export_options(AgsMachine *machine, guint export_options); void ags_machine_popup_add_import_options(AgsMachine *machine, guint import_options); void ags_machine_check_message(AgsMachine *machine); AgsMachine* ags_machine_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_MACHINE_H__*/ gsequencer-3.1.3/ags/X/ags_plugin_browser.h0000644000175000017500000000503313607210263015626 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_BROWSER_H__ #define __AGS_PLUGIN_BROWSER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLUGIN_BROWSER (ags_plugin_browser_get_type()) #define AGS_PLUGIN_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_PLUGIN_BROWSER, AgsPluginBrowser)) #define AGS_PLUGIN_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PLUGIN_BROWSER, AgsPluginBrowserClass)) #define AGS_IS_PLUGIN_BROWSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLUGIN_BROWSER)) #define AGS_IS_PLUGIN_BROWSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLUGIN_BROWSER)) #define AGS_PLUGIN_BROWSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLUGIN_BROWSER, AgsPluginBrowserClass)) typedef struct _AgsPluginBrowser AgsPluginBrowser; typedef struct _AgsPluginBrowserClass AgsPluginBrowserClass; typedef enum{ AGS_PLUGIN_BROWSER_CONNECTED = 1, }AgsPluginBrowserFlags; struct _AgsPluginBrowser { GtkDialog dialog; guint flags; GtkWidget *parent_window; GtkComboBoxText *plugin_type; GtkWidget *active_browser; GtkWidget *lv2_browser; GtkWidget *dssi_browser; GtkWidget *ladspa_browser; GtkWidget *vst_browser; GtkButton *apply; GtkButton *ok; GtkButton *cancel; }; struct _AgsPluginBrowserClass { GtkDialogClass dialog; }; GType ags_plugin_browser_get_type(void); gchar* ags_plugin_browser_get_plugin_filename(AgsPluginBrowser *plugin_browser); gchar* ags_plugin_browser_get_plugin_effect(AgsPluginBrowser *plugin_browser); AgsPluginBrowser* ags_plugin_browser_new(GtkWidget *parent_window); G_END_DECLS #endif /*__AGS_PLUGIN_BROWSER_H__*/ gsequencer-3.1.3/ags/X/ags_automation_window_callbacks.c0000644000175000017500000000146513605312646020341 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/ags_output_collection_editor_callbacks.h0000644000175000017500000000266713607210263021717 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_COLLECTION_EDITOR_CALLBACKS_H__ #define __AGS_OUTPUT_COLLECTION_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_output_collection_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsOutputCollectionEditor *output_collection_editor); void ags_output_collection_editor_soundcard_callback(GtkWidget *combo_box, AgsOutputCollectionEditor *output_collection_editor); G_END_DECLS #endif /*__AGS_OUTPUT_COLLECTION_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_notation_editor.c0000644000175000017500000014445613616617253016010 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_notation_editor_class_init(AgsNotationEditorClass *notation_editor); void ags_notation_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_notation_editor_init(AgsNotationEditor *notation_editor); void ags_notation_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_notation_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_notation_editor_finalize(GObject *gobject); void ags_notation_editor_connect(AgsConnectable *connectable); void ags_notation_editor_disconnect(AgsConnectable *connectable); void ags_notation_editor_show(GtkWidget *widget); void ags_notation_editor_show_all(GtkWidget *widget); void ags_notation_editor_real_machine_changed(AgsNotationEditor *notation_editor, AgsMachine *machine); gint ags_notation_editor_paste_notation_all(AgsNotationEditor *notation_editor, AgsMachine *machine, xmlNode *notation_node, AgsTimestamp *timestamp, gboolean match_channel, gboolean no_duplicates, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x); gint ags_notation_editor_paste_notation(AgsNotationEditor *notation_editor, AgsMachine *machine, xmlNode *audio_node, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x); void ags_notation_editor_get_boundary(AgsNotationEditor *notation_editor, AgsMachine *machine, AgsNotation *notation, guint *lower, guint *upper); void ags_notation_editor_invert_notation(AgsNotationEditor *notation_editor, AgsMachine *machine, AgsNotation *notation, guint lower, guint upper); enum{ MACHINE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, PROP_SOUNDCARD, }; static gpointer ags_notation_editor_parent_class = NULL; static guint notation_editor_signals[LAST_SIGNAL]; /** * SECTION:ags_notation_editor * @short_description: A composite widget to edit notation * @title: AgsNotationEditor * @section_id: * @include: ags/X/ags_notation_editor.h * * #AgsNotationEditor is a composite widget to edit notation. You may select machines * or change editor tool to do notation. */ GType ags_notation_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_notation_editor = 0; static const GTypeInfo ags_notation_editor_info = { sizeof (AgsNotationEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_notation_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsNotationEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_notation_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_notation_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_notation_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsNotationEditor", &ags_notation_editor_info, 0); g_type_add_interface_static(ags_type_notation_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_notation_editor); } return g_define_type_id__volatile; } void ags_notation_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_notation_editor_connect; connectable->disconnect = ags_notation_editor_disconnect; } void ags_notation_editor_class_init(AgsNotationEditorClass *notation_editor) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_notation_editor_parent_class = g_type_class_peek_parent(notation_editor); /* GObjectClass */ gobject = (GObjectClass *) notation_editor; gobject->set_property = ags_notation_editor_set_property; gobject->get_property = ags_notation_editor_get_property; gobject->finalize = ags_notation_editor_finalize; /* properties */ /** * AgsNotationEditor:soundcard: * * The assigned #AgsSoundcard acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("assigned soundcard"), i18n_pspec("The soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) notation_editor; widget->show = ags_notation_editor_show; widget->show_all = ags_notation_editor_show_all; /* AgsEditorClass */ notation_editor->machine_changed = ags_notation_editor_real_machine_changed; /* signals */ /** * AgsEditor::machine-changed: * @editor: the object to change machine. * @machine: the #AgsMachine to set * * The ::machine-changed signal notifies about changed machine. * * Since: 3.0.0 */ notation_editor_signals[MACHINE_CHANGED] = g_signal_new("machine-changed", G_TYPE_FROM_CLASS(notation_editor), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsNotationEditorClass, machine_changed), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_notation_editor_init(AgsNotationEditor *notation_editor) { GtkViewport *viewport; GtkScrolledWindow *scrolled_window; GtkTable *table; AgsConfig *config; gchar *str; gdouble gui_scale_factor; notation_editor->flags = (AGS_NOTATION_EDITOR_PASTE_MATCH_AUDIO_CHANNEL | AGS_NOTATION_EDITOR_PASTE_NO_DUPLICATES); notation_editor->version = AGS_NOTATION_EDITOR_DEFAULT_VERSION; notation_editor->build_id = AGS_NOTATION_EDITOR_DEFAULT_BUILD_ID; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } /* offset */ notation_editor->tact_counter = 0; notation_editor->current_tact = 0.0; /* active keys */ notation_editor->active_key = NULL; notation_editor->active_key_count = 0; /* soundcard */ notation_editor->soundcard = NULL; /* notation toolbar */ notation_editor->notation_toolbar = ags_notation_toolbar_new(); gtk_box_pack_start((GtkBox *) notation_editor, (GtkWidget *) notation_editor->notation_toolbar, FALSE, FALSE, 0); /* paned */ notation_editor->paned = (GtkHPaned *) gtk_hpaned_new(); gtk_box_pack_start((GtkBox *) notation_editor, (GtkWidget *) notation_editor->paned, TRUE, TRUE, 0); /* machine selector */ viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_paned_pack1((GtkPaned *) notation_editor->paned, (GtkWidget *) viewport, FALSE, TRUE); scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(scrolled_window)); notation_editor->machine_selector = g_object_new(AGS_TYPE_MACHINE_SELECTOR, "homogeneous", FALSE, "spacing", 0, NULL); notation_editor->machine_selector->flags |= (AGS_MACHINE_SELECTOR_SHOW_REVERSE_MAPPING | AGS_MACHINE_SELECTOR_SHOW_SHIFT_PIANO | AGS_MACHINE_SELECTOR_NOTATION); gtk_label_set_label(notation_editor->machine_selector->label, i18n("notation")); notation_editor->machine_selector->popup = ags_machine_selector_popup_new(notation_editor->machine_selector); g_object_set(notation_editor->machine_selector->menu_button, "menu", notation_editor->machine_selector->popup, NULL); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) notation_editor->machine_selector); /* selected machine */ notation_editor->selected_machine = NULL; /* table */ viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_paned_pack2((GtkPaned *) notation_editor->paned, (GtkWidget *) viewport, TRUE, TRUE); table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(table)); /* notebook */ notation_editor->notebook = g_object_new(AGS_TYPE_NOTEBOOK, "homogeneous", FALSE, "spacing", 0, "prefix", i18n("channel"), NULL); gtk_table_attach(table, (GtkWidget *) notation_editor->notebook, 0, 3, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); /* scrolled piano */ notation_editor->scrolled_piano = ags_scrolled_piano_new(); g_object_set(notation_editor->scrolled_piano, "margin-top", (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT), NULL); g_object_set(notation_editor->scrolled_piano->piano, "key-width", (guint) (gui_scale_factor * AGS_PIANO_DEFAULT_KEY_WIDTH), "key-height", (guint) (gui_scale_factor * AGS_PIANO_DEFAULT_KEY_HEIGHT), NULL); gtk_table_attach(table, (GtkWidget *) notation_editor->scrolled_piano, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* notation edit */ notation_editor->notation_edit = ags_notation_edit_new(); gtk_table_attach(table, (GtkWidget *) notation_editor->notation_edit, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* notation meta */ notation_editor->notation_meta = ags_notation_meta_new(); g_object_set(notation_editor->notation_meta, "valign", GTK_ALIGN_START, NULL); gtk_table_attach(table, (GtkWidget *) notation_editor->notation_meta, 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0); } void ags_notation_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); if(notation_editor->soundcard == soundcard){ return; } if(notation_editor->soundcard != NULL){ g_object_unref(notation_editor->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } notation_editor->soundcard = soundcard; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_notation_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, notation_editor->soundcard); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_notation_editor_finalize(GObject *gobject) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(gobject); if(notation_editor->soundcard != NULL){ g_object_unref(notation_editor->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_notation_editor_parent_class)->finalize(gobject); } void ags_notation_editor_connect(AgsConnectable *connectable) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(connectable); if((AGS_NOTATION_EDITOR_CONNECTED & (notation_editor->flags)) != 0){ return; } notation_editor->flags |= AGS_NOTATION_EDITOR_CONNECTED; g_signal_connect((GObject *) notation_editor->machine_selector, "changed", G_CALLBACK(ags_notation_editor_machine_changed_callback), (gpointer) notation_editor); g_signal_connect((GObject *) notation_editor->scrolled_piano->piano, "key-pressed", G_CALLBACK(ags_notation_editor_piano_key_pressed_callback), (gpointer) notation_editor); g_signal_connect((GObject *) notation_editor->scrolled_piano->piano, "key-released", G_CALLBACK(ags_notation_editor_piano_key_released_callback), (gpointer) notation_editor); /* toolbar */ ags_connectable_connect(AGS_CONNECTABLE(notation_editor->notation_toolbar)); /* machine selector */ ags_connectable_connect(AGS_CONNECTABLE(notation_editor->machine_selector)); /* notation edit */ ags_connectable_connect(AGS_CONNECTABLE(notation_editor->notation_edit)); /* notation meta */ ags_connectable_connect(AGS_CONNECTABLE(notation_editor->notation_meta)); } void ags_notation_editor_disconnect(AgsConnectable *connectable) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(connectable); if((AGS_NOTATION_EDITOR_CONNECTED & (notation_editor->flags)) == 0){ return; } notation_editor->flags &= (~AGS_NOTATION_EDITOR_CONNECTED); g_object_disconnect((GObject *) notation_editor->machine_selector, "any_signal::changed", G_CALLBACK(ags_notation_editor_machine_changed_callback), (gpointer) notation_editor, NULL); g_object_disconnect((GObject *) notation_editor->scrolled_piano->piano, "any_signal::key-pressed", G_CALLBACK(ags_notation_editor_piano_key_pressed_callback), (gpointer) notation_editor, "any_signal::key-released", G_CALLBACK(ags_notation_editor_piano_key_released_callback), (gpointer) notation_editor, NULL); /* notation toolbar */ ags_connectable_disconnect(AGS_CONNECTABLE(notation_editor->notation_toolbar)); /* machine selector */ ags_connectable_disconnect(AGS_CONNECTABLE(notation_editor->machine_selector)); /* notation edit */ ags_connectable_disconnect(AGS_CONNECTABLE(notation_editor->notation_edit)); /* notation meta */ ags_connectable_disconnect(AGS_CONNECTABLE(notation_editor->notation_meta)); } void ags_notation_editor_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_notation_editor_parent_class)->show(widget); gtk_widget_hide(AGS_NOTATION_EDITOR(widget)->notation_meta); } void ags_notation_editor_show_all(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_notation_editor_parent_class)->show_all(widget); gtk_widget_hide(AGS_NOTATION_EDITOR(widget)->notation_meta); } void ags_notation_editor_real_machine_changed(AgsNotationEditor *notation_editor, AgsMachine *machine) { AgsMachine *old_machine; GList *tab; guint length; guint audio_channels; guint i; /* disconnect set pads - old */ old_machine = notation_editor->selected_machine; if(old_machine != NULL){ g_object_disconnect(old_machine, "any_signal::resize-audio-channels", G_CALLBACK(ags_notation_editor_resize_audio_channels_callback), (gpointer) notation_editor, "any_signal::resize-pads", G_CALLBACK(ags_notation_editor_resize_pads_callback), (gpointer) notation_editor, NULL); } /* notebook - remove tabs */ length = g_list_length(notation_editor->notebook->tab); for(i = 0; i < length; i++){ ags_notebook_remove_tab(notation_editor->notebook, 0); } /* check pattern mode */ if(AGS_IS_DRUM(machine) || AGS_IS_MATRIX(machine)){ notation_editor->flags |= AGS_NOTATION_EDITOR_PATTERN_MODE; }else{ notation_editor->flags &= (~AGS_NOTATION_EDITOR_PATTERN_MODE); } /* notebook - add tabs */ if(machine != NULL){ g_object_get(machine->audio, "audio-channels", &audio_channels, NULL); for(i = 0; i < audio_channels; i++){ ags_notebook_insert_tab(notation_editor->notebook, i); tab = notation_editor->notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } } /* piano */ if(machine != NULL){ guint channel_count; /* get channel count */ if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ g_object_get(machine->audio, "input-pads", &channel_count, NULL); }else{ g_object_get(machine->audio, "output-pads", &channel_count, NULL); } /* apply channel count */ g_object_set(notation_editor->scrolled_piano->piano, "key-count", channel_count, NULL); }else{ /* apply default */ g_object_set(notation_editor->scrolled_piano->piano, "key-count", AGS_PIANO_DEFAULT_KEY_COUNT, NULL); } gtk_widget_queue_draw((GtkWidget *) notation_editor->scrolled_piano->piano); gtk_widget_queue_draw((GtkWidget *) notation_editor->scrolled_piano); /* selected machine */ notation_editor->selected_machine = machine; /* reset scrollbars */ ags_notation_edit_reset_vscrollbar(notation_editor->notation_edit); ags_notation_edit_reset_hscrollbar(notation_editor->notation_edit); /* redraw */ gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); /* connect set-pads - new */ if(machine != NULL){ g_signal_connect_after(machine, "resize-audio-channels", G_CALLBACK(ags_notation_editor_resize_audio_channels_callback), notation_editor); g_signal_connect_after(machine, "resize-pads", G_CALLBACK(ags_notation_editor_resize_pads_callback), notation_editor); } } /** * ags_notation_editor_machine_changed: * @notation_editor: the #AgsNotationEditor * @machine: the new #AgsMachine * * Is emitted as machine changed of notation_editor. * * Since: 3.0.0 */ void ags_notation_editor_machine_changed(AgsNotationEditor *notation_editor, AgsMachine *machine) { g_return_if_fail(AGS_IS_NOTATION_EDITOR(notation_editor)); g_object_ref((GObject *) notation_editor); g_signal_emit((GObject *) notation_editor, notation_editor_signals[MACHINE_CHANGED], 0, machine); g_object_unref((GObject *) notation_editor); } /** * ags_notation_editor_add_note: * @notation_editor: the #AgsNotationEditor * @note: the #AgsNote to add * * Add note. * * Since: 3.0.0 */ void ags_notation_editor_add_note(AgsNotationEditor *notation_editor, AgsNote *note) { AgsMachine *machine; AgsNotation *notation; AgsTimestamp *timestamp; GList *start_list_notation, *list_notation; guint x0; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor) || !AGS_IS_NOTE(note)){ return; } if(notation_editor->selected_machine != NULL){ machine = notation_editor->selected_machine; /* check all active tabs */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; g_object_get(note, "x0", &x0, NULL); timestamp->timer.ags_offset.offset = (guint64) AGS_NOTATION_DEFAULT_OFFSET * floor((double) x0 / (double) AGS_NOTATION_DEFAULT_OFFSET); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ AgsNote *new_note; g_object_get(machine->audio, "notation", &start_list_notation, NULL); list_notation = ags_notation_find_near_timestamp(start_list_notation, i, timestamp); if(list_notation != NULL){ notation = list_notation->data; }else{ notation = ags_notation_new((GObject *) machine->audio, i); AGS_TIMESTAMP(notation->timestamp)->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; ags_audio_add_notation(machine->audio, (GObject *) notation); } new_note = ags_note_duplicate(note); ags_notation_add_note(notation, new_note, FALSE); g_list_free_full(start_list_notation, g_object_unref); /* iterate */ i++; } g_object_unref(timestamp); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } } /** * ags_notation_editor_delete_note: * @notation_editor: the #AgsNotationEditor * @x: point x * @y: point y * * Delete note. * * Since: 3.0.0 */ void ags_notation_editor_delete_note(AgsNotationEditor *notation_editor, guint x, guint y) { AgsMachine *machine; AgsNotation *notation; AgsTimestamp *timestamp; GList *start_list_notation, *list_notation; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ machine = notation_editor->selected_machine; /* check all active tabs */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = (guint64) AGS_NOTATION_DEFAULT_OFFSET * floor((double) x / (double) AGS_NOTATION_DEFAULT_OFFSET); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ AgsNote *new_note; g_object_get(machine->audio, "notation", &start_list_notation, NULL); list_notation = ags_notation_find_near_timestamp(start_list_notation, i, timestamp); if(list_notation != NULL){ notation = list_notation->data; ags_notation_remove_note_at_position(notation, x, y); } g_list_free_full(start_list_notation, g_object_unref); /* iterate */ i++; } g_object_unref(timestamp); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } } /** * ags_notation_editor_select_region: * @notation_editor: the #AgsNotationEditor * @x0: point x0 * @y0: point y0 * @x1: point x1 * @y1: point y1 * * Select region. * * Since: 3.0.0 */ void ags_notation_editor_select_region(AgsNotationEditor *notation_editor, guint x0, guint y0, guint x1, guint y1) { AgsMachine *machine; AgsNotation *notation; AgsTimestamp *timestamp; GList *start_list_notation, *list_notation; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ machine = notation_editor->selected_machine; /* swap values if needed */ if(x0 > x1){ guint tmp; tmp = x0; x0 = x1; x1 = tmp; } if(y0 > y1){ guint tmp; tmp = y0; y0 = y1; y1 = tmp; } /* check all active tabs */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; i = 0; g_object_get(machine->audio, "notation", &start_list_notation, NULL); while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ list_notation = start_list_notation; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(x0 / AGS_NOTATION_DEFAULT_OFFSET); while((list_notation = ags_notation_find_near_timestamp(list_notation, i, timestamp)) != NULL && timestamp->timer.ags_offset.offset < (AGS_NOTATION_DEFAULT_OFFSET * floor(x1 / AGS_NOTATION_DEFAULT_OFFSET)) + AGS_NOTATION_DEFAULT_OFFSET){ ags_notation_add_region_to_selection(list_notation->data, x0, y0, x1, y1, TRUE); /* iterate */ timestamp->timer.ags_offset.offset += AGS_NOTATION_DEFAULT_OFFSET; list_notation = list_notation->next; } /* iterate */ i++; } g_list_free_full(start_list_notation, g_object_unref); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } } /** * ags_notation_editor_do_feedback: * @notation_editor: the #AgsNotationEditor * * Do playback feedback. * * Since: 3.0.0 */ void ags_notation_editor_do_feedback(AgsNotationEditor *notation_editor) { if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ AgsNotationEdit *notation_edit; AgsMachine *machine; AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel, *nth_pad; AgsPlayback *playback; AgsNotation *notation; AgsTimestamp *timestamp; GList *start_list_notation, *list_notation; guint output_pads, input_pads; gint i; notation_edit = notation_editor->notation_edit; machine = notation_editor->selected_machine; /* check all active tabs */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_edit->cursor_position_x / AGS_NOTATION_DEFAULT_OFFSET); i = 0; g_object_get(machine->audio, "output", &start_output, "output-pads", &output_pads, "input", &start_input, "input-pads", &input_pads, "notation", &start_list_notation, NULL); while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ AgsNote *current_note; AgsNote *play_note; list_notation = start_list_notation; list_notation = ags_notation_find_near_timestamp(list_notation, i, timestamp); if(list_notation != NULL){ notation = list_notation->data; }else{ i++; continue; } current_note = ags_notation_find_point(list_notation->data, notation_edit->cursor_position_x, notation_edit->cursor_position_y, FALSE); if(current_note != NULL){ if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT)){ nth_channel = ags_channel_nth(start_output, i); }else{ nth_channel = ags_channel_nth(start_input, i); } if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_pad = ags_channel_pad_nth(nth_channel, (ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT) ? output_pads: input_pads) - notation_edit->cursor_position_y - 1); }else{ nth_pad = ags_channel_pad_nth(nth_channel, notation_edit->cursor_position_y); } if(nth_pad != NULL){ guint x0, x1; g_object_get(nth_pad, "playback", &playback, NULL); g_object_get(playback, "play-note", &play_note, NULL); g_object_get(current_note, "x0", &x0, "x1", &x1, NULL); g_object_set(play_note, "x0", 0, "x1", x1 - x0, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); g_object_unref(play_note); } /* unref */ if(nth_channel != NULL){ g_object_unref(nth_channel); } if(nth_pad != NULL){ g_object_unref(nth_pad); } } /* iterate */ i++; } g_list_free_full(start_list_notation, g_object_unref); /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } } /** * ags_notation_editor_start_play_key: * @notation_editor: the #AgsNotationEditor * @key_code: the key to play * * Start play @key_code. * * Since: 3.0.0 */ void ags_notation_editor_start_play_key(AgsNotationEditor *notation_editor, gint key_code) { if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ AgsMachine *machine; AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel, *nth_pad; AgsPlayback *playback; GObject *output_soundcard; guint output_pads, input_pads; guint audio_channels; guint note_offset; guint y; gint i; machine = notation_editor->selected_machine; i = 0; g_object_get(machine->audio, "output-soundcard", &output_soundcard, "output", &start_output, "output-pads", &output_pads, "input", &start_input, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); for(i = 0; i < audio_channels; i++){ AgsNote *play_note; //TODO:JK: improve me y = key_code; #if 0 if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT)){ nth_channel = ags_channel_nth(start_output, i); }else{ nth_channel = ags_channel_nth(start_input, i); } if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_pad = ags_channel_pad_nth(nth_channel, (ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT) ? output_pads: input_pads) - y - 1); }else{ nth_pad = ags_channel_pad_nth(nth_channel, y); } #else nth_channel = ags_channel_nth(start_input, i); if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_pad = ags_channel_pad_nth(nth_channel, (input_pads) - y - 1); }else{ nth_pad = ags_channel_pad_nth(nth_channel, y); } #endif if(nth_pad != NULL){ g_object_get(nth_pad, "playback", &playback, NULL); g_object_get(playback, "play-note", &play_note, NULL); note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); ags_note_set_flags(play_note, AGS_NOTE_FEED); g_object_set(play_note, "x0", note_offset, "x1", note_offset + 1, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); g_object_unref(play_note); } /* unref */ if(nth_channel != NULL){ g_object_unref(nth_channel); } if(nth_pad != NULL){ g_object_unref(nth_pad); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } } /** * ags_notation_editor_stop_play_key: * @notation_editor: the #AgsNotationEditor * @key_code: the key to stop * * Stop play @key_code. * * Since: 3.0.0 */ void ags_notation_editor_stop_play_key(AgsNotationEditor *notation_editor, gint key_code) { if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ AgsMachine *machine; AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel, *nth_pad; AgsPlayback *playback; guint output_pads, input_pads; guint audio_channels; guint y; gint i; machine = notation_editor->selected_machine; i = 0; g_object_get(machine->audio, "output", &start_output, "output-pads", &output_pads, "input", &start_input, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); for(i = 0; i < audio_channels; i++){ AgsNote *play_note; //TODO:JK: improve me y = key_code; #if 0 if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT)){ nth_channel = ags_channel_nth(start_output, i); }else{ nth_channel = ags_channel_nth(start_input, i); } if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_pad = ags_channel_pad_nth(nth_channel, (ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT) ? output_pads: input_pads) - y - 1); }else{ nth_pad = ags_channel_pad_nth(nth_channel, y); } #else nth_channel = ags_channel_nth(start_input, i); if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_pad = ags_channel_pad_nth(nth_channel, (input_pads) - y - 1); }else{ nth_pad = ags_channel_pad_nth(nth_channel, y); } #endif if(nth_pad != NULL){ g_object_get(nth_pad, "playback", &playback, NULL); g_object_get(playback, "play-note", &play_note, NULL); ags_note_unset_flags(play_note, AGS_NOTE_FEED); ags_machine_playback_set_active(machine, playback, FALSE); g_object_unref(playback); g_object_unref(play_note); } /* unref */ if(nth_channel != NULL){ g_object_unref(nth_channel); } if(nth_pad != NULL){ g_object_unref(nth_pad); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } } /** * ags_notation_editor_select_all: * @notation_editor: the #AgsNotationEditor * * Is emitted as machine changed of notation_editor. * * Since: 3.0.0 */ void ags_notation_editor_select_all(AgsNotationEditor *notation_editor) { AgsMachine *machine; GList *start_list_notation, *list_notation; guint audio_channel; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ machine = notation_editor->selected_machine; /* check all active tabs */ g_object_get(machine->audio, "notation", &start_list_notation, NULL); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ list_notation = start_list_notation; while(list_notation != NULL){ g_object_get(list_notation->data, "audio-channel", &audio_channel, NULL); if(i != audio_channel){ list_notation = list_notation->next; continue; } ags_notation_add_all_to_selection(AGS_NOTATION(list_notation->data)); list_notation = list_notation->next; } /* iterate */ i++; } g_list_free_full(start_list_notation, g_object_unref); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } } gint ags_notation_editor_paste_notation_all(AgsNotationEditor *notation_editor, AgsMachine *machine, xmlNode *notation_node, AgsTimestamp *timestamp, gboolean match_channel, gboolean no_duplicates, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x) { AgsNotation *notation; GList *start_list_notation, *list_notation; gint first_x; guint current_x; gint i; first_x = -1; /* */ i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ g_object_get(machine->audio, "notation", &start_list_notation, NULL); list_notation = ags_notation_find_near_timestamp(start_list_notation, i, timestamp); if(list_notation == NULL){ notation = ags_notation_new((GObject *) machine->audio, i); notation->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; ags_audio_add_notation(machine->audio, (GObject *) notation); }else{ notation = AGS_NOTATION(list_notation->data); } g_list_free_full(start_list_notation, g_object_unref); if(paste_from_position){ xmlNode *child; guint x_boundary; ags_notation_insert_from_clipboard_extended(notation, notation_node, TRUE, position_x, TRUE, position_y, match_channel, no_duplicates); /* get boundaries */ child = notation_node->children; current_x = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "note", 5)){ guint tmp; tmp = g_ascii_strtoull(xmlGetProp(child, "x1"), NULL, 10); if(tmp > current_x){ current_x = tmp; } } } child = child->next; } x_boundary = g_ascii_strtoull(xmlGetProp(notation_node, "x_boundary"), NULL, 10); if(first_x == -1 || x_boundary < first_x){ first_x = x_boundary; } if(position_x > x_boundary){ current_x += (position_x - x_boundary); }else{ current_x -= (x_boundary - position_x); } if(current_x > last_x[0]){ last_x[0] = current_x; } }else{ xmlNode *child; ags_notation_insert_from_clipboard(notation, notation_node, FALSE, 0, FALSE, 0); /* get boundaries */ child = notation_node->children; current_x = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "note", 5)){ guint tmp; tmp = g_ascii_strtoull(xmlGetProp(child, "x1"), NULL, 10); if(tmp > current_x){ current_x = tmp; } } } child = child->next; } if(current_x > last_x[0]){ last_x[0] = current_x; } } /* iterate */ i++; } return(first_x); } gint ags_notation_editor_paste_notation(AgsNotationEditor *notation_editor, AgsMachine *machine, xmlNode *audio_node, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x) { AgsTimestamp *timestamp; xmlNode *notation_list_node, *notation_node; xmlNode *timestamp_node; gint first_x; gboolean match_channel, no_duplicates; first_x = -1; match_channel = ((AGS_NOTATION_EDITOR_PASTE_MATCH_AUDIO_CHANNEL & (notation_editor->flags)) != 0) ? TRUE: FALSE; no_duplicates = ((AGS_NOTATION_EDITOR_PASTE_NO_DUPLICATES & (notation_editor->flags)) != 0) ? TRUE: FALSE; /* timestamp */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = 0; /* paste notation */ notation_list_node = audio_node->children; while(notation_list_node != NULL){ if(notation_list_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(notation_list_node->name, "notation-list", 14)){ notation_node = notation_list_node->children; while(notation_node != NULL){ if(notation_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(notation_node->name, "notation", 9)){ guint64 offset; timestamp_node = notation_node->children; offset = 0; while(timestamp_node != NULL){ if(timestamp_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(timestamp_node->name, "timestamp", 10)){ offset = g_ascii_strtoull(xmlGetProp(timestamp_node, "offset"), NULL, 10); break; } } timestamp_node = timestamp_node->next; } /* 1st attempt */ timestamp->timer.ags_offset.offset = (guint64) AGS_NOTATION_DEFAULT_OFFSET * floor((double) position_x / (double) AGS_NOTATION_DEFAULT_OFFSET); first_x = ags_notation_editor_paste_notation_all(notation_editor, machine, notation_node, timestamp, match_channel, no_duplicates, position_x, position_y, paste_from_position, last_x); /* 2nd attempt */ timestamp->timer.ags_offset.offset += AGS_NOTATION_DEFAULT_OFFSET; ags_notation_editor_paste_notation_all(notation_editor, machine, notation_node, timestamp, match_channel, no_duplicates, position_x, position_y, paste_from_position, last_x); } } notation_node = notation_node->next; } } } notation_list_node = notation_list_node->next; } g_object_unref(timestamp); return(first_x); } /** * ags_notation_editor_paste: * @notation_editor: the #AgsNotationEditor * * Is emitted as machine changed of notation_editor. * * Since: 3.0.0 */ void ags_notation_editor_paste(AgsNotationEditor *notation_editor) { AgsMachine *machine; AgsNotationEdit *notation_edit; AgsNotation *notation; xmlDoc *clipboard; xmlNode *audio_node; xmlNode *notation_node; gchar *buffer; guint position_x, position_y; gint first_x, last_x; gboolean paste_from_position; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if((machine = notation_editor->selected_machine) != NULL){ notation_edit = notation_editor->notation_edit; /* get clipboard */ buffer = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); if(buffer == NULL){ return; } position_x = 0; position_y = 0; /* get position */ if(notation_editor->notation_toolbar->selected_edit_mode == notation_editor->notation_toolbar->position){ last_x = 0; paste_from_position = TRUE; position_x = notation_editor->notation_edit->cursor_position_x; position_y = notation_editor->notation_edit->cursor_position_y; #ifdef DEBUG printf("pasting at position: [%u,%u]\n", position_x, position_y); #endif }else{ paste_from_position = FALSE; } /* get xml tree */ clipboard = xmlReadMemory(buffer, strlen(buffer), NULL, "UTF-8", 0); audio_node = xmlDocGetRootElement(clipboard); first_x = -1; /* iterate xml tree */ while(audio_node != NULL){ if(audio_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("audio", audio_node->name, 6)){ notation_node = audio_node->children; first_x = ags_notation_editor_paste_notation(notation_editor, machine, audio_node, position_x, position_y, paste_from_position, &last_x); break; } } audio_node = audio_node->next; } if(first_x == -1){ first_x = 0; } xmlFreeDoc(clipboard); if(paste_from_position){ gint big_step, small_step; //TODO:JK: implement me big_step = (guint) ceil((double) last_x / 16.0) * 16.0 + (notation_edit->cursor_position_x % (guint) 16); small_step = (guint) big_step - 16; if(small_step < last_x){ notation_editor->notation_edit->cursor_position_x = big_step; }else{ notation_editor->notation_edit->cursor_position_x = small_step; } } gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } } /** * ags_notation_editor_copy: * @notation_editor: the #AgsNotationEditor * * Is emitted as machine changed of notation_editor. * * Since: 3.0.0 */ void ags_notation_editor_copy(AgsNotationEditor *notation_editor) { AgsMachine *machine; AgsNotation *notation; xmlDoc *clipboard; xmlNode *audio_node, *notation_list_node, *notation_node; GList *start_list_notation, *list_notation; xmlChar *buffer; int size; guint audio_channel; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ machine = notation_editor->selected_machine; /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); notation_list_node = xmlNewNode(NULL, BAD_CAST "notation-list"); xmlAddChild(audio_node, notation_list_node); /* create notation nodes */ g_object_get(machine->audio, "notation", &start_list_notation, NULL); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ list_notation = start_list_notation; /* copy */ while(list_notation != NULL){ g_object_get(list_notation->data, "audio-channel", &audio_channel, NULL); if(i != audio_channel){ list_notation = list_notation->next; continue; } notation_node = ags_notation_copy_selection(AGS_NOTATION(list_notation->data)); xmlAddChild(notation_list_node, notation_node); list_notation = list_notation->next; } /* iterate */ i++; } g_list_free_full(start_list_notation, g_object_unref); /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } /** * ags_notation_editor_cut: * @notation_editor: the #AgsNotationEditor * * Is emitted as machine changed of notation_editor. * * Since: 3.0.0 */ void ags_notation_editor_cut(AgsNotationEditor *notation_editor) { AgsMachine *machine; AgsNotation *notation; xmlDoc *clipboard; xmlNode *audio_node; xmlNode *notation_list_node, *notation_node; GList *start_list_notation, *list_notation; xmlChar *buffer; int size; guint audio_channel; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ machine = notation_editor->selected_machine; /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); notation_list_node = xmlNewNode(NULL, BAD_CAST "notation-list"); xmlAddChild(audio_node, notation_list_node); /* create notation nodes */ g_object_get(machine->audio, "notation", &start_list_notation, NULL); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ list_notation = start_list_notation; /* cut */ while(list_notation != NULL){ g_object_get(list_notation->data, "audio-channel", &audio_channel, NULL); if(i != audio_channel){ list_notation = list_notation->next; continue; } notation_node = ags_notation_cut_selection(AGS_NOTATION(list_notation->data)); xmlAddChild(notation_list_node, notation_node); list_notation = list_notation->next; } /* iterate */ i++; } g_list_free_full(start_list_notation, g_object_unref); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_notation_editor_get_boundary(AgsNotationEditor *notation_editor, AgsMachine *machine, AgsNotation *notation, guint *lower, guint *upper) { GList *start_note, *note; guint note_y; g_object_get(notation, "note", &start_note, NULL); /* retrieve upper and lower */ note = start_note; while(note != NULL){ g_object_get(note->data, "y", ¬e_y, NULL); if(note_y < lower[0]){ lower[0] = note_y; } if(note_y > upper[0]){ upper[0] = note_y; } note = note->next; } g_list_free_full(start_note, g_object_unref); } void ags_notation_editor_invert_notation(AgsNotationEditor *notation_editor, AgsMachine *machine, AgsNotation *notation, guint lower, guint upper) { GList *start_note, *note; guint note_y; g_object_get(notation, "note", &start_note, NULL); /* invert */ note = start_note; while(note != NULL){ g_object_get(note->data, "y", ¬e_y, NULL); if((gdouble) note_y < (gdouble) (upper - lower) / 2.0){ g_object_set(note->data, "y", (upper - (note_y - lower)), NULL); }else if((gdouble) note_y > (gdouble) (upper - lower) / 2.0){ g_object_set(note->data, "y", (lower + (upper - AGS_NOTE(note->data)->y)), NULL); } note = note->next; } g_list_free_full(start_note, g_object_unref); } /** * ags_notation_editor_invert: * @notation_editor: the #AgsNotationEditor * * Invert all notation of @notation_editor's selected machine. * * Since: 3.0.0 */ void ags_notation_editor_invert(AgsNotationEditor *notation_editor) { AgsMachine *machine; AgsNotation *notation; GList *start_list_notation, *list_notation; int size; guint audio_channel; gint i; if(!AGS_IS_NOTATION_EDITOR(notation_editor)){ return; } if(notation_editor->selected_machine != NULL){ guint lower, upper; /* create notation nodes */ machine = notation_editor->selected_machine; g_object_get(machine->audio, "notation", &start_list_notation, NULL); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ /* get boundary */ list_notation = start_list_notation; lower = G_MAXUINT; upper = 0; while(list_notation != NULL){ g_object_get(list_notation->data, "audio-channel", &audio_channel, NULL); if(i != audio_channel){ list_notation = list_notation->next; continue; } ags_notation_editor_get_boundary(notation_editor, machine, AGS_NOTATION(list_notation->data), &lower, &upper); list_notation = list_notation->next; } /* invert */ list_notation = start_list_notation; while(list_notation != NULL){ g_object_get(list_notation->data, "audio-channel", &audio_channel, NULL); if(i != audio_channel){ list_notation = list_notation->next; continue; } ags_notation_editor_invert_notation(notation_editor, machine, AGS_NOTATION(list_notation->data), lower, upper); list_notation = list_notation->next; } i++; } g_list_free_full(start_list_notation, g_object_unref); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } } /** * ags_notation_editor_new: * * Creates the #AgsNotationEditor * * Returns: a new #AgsNotationEditor * * Since: 3.0.0 */ AgsNotationEditor* ags_notation_editor_new() { AgsNotationEditor *notation_editor; notation_editor = (AgsNotationEditor *) g_object_new(AGS_TYPE_NOTATION_EDITOR, NULL); return(notation_editor); } gsequencer-3.1.3/ags/X/ags_automation_editor_callbacks.c0000644000175000017500000003267613607210263020322 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gboolean ags_automation_editor_audio_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEditor *automation_editor) { ags_automation_editor_reset_audio_scrollbar(automation_editor); return(FALSE); } gboolean ags_automation_editor_output_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEditor *automation_editor) { ags_automation_editor_reset_output_scrollbar(automation_editor); return(FALSE); } gboolean ags_automation_editor_input_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEditor *automation_editor) { ags_automation_editor_reset_input_scrollbar(automation_editor); return(FALSE); } void ags_automation_editor_audio_vscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { GtkAdjustment *vadjustment; vadjustment = gtk_viewport_get_vadjustment(automation_editor->audio_scrolled_automation_edit_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); vadjustment = gtk_viewport_get_vadjustment(automation_editor->audio_scrolled_scale_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); } void ags_automation_editor_audio_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { AgsConfig *config; GList *list_start, *list; gchar *str; gdouble gui_scale_factor; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_adjustment_set_value(automation_editor->audio_ruler->adjustment, gtk_range_get_value(range) / (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH)); gtk_widget_queue_draw(GTK_WIDGET(automation_editor->audio_ruler)); /* automation edit */ if((AGS_AUTOMATION_EDITOR_RESET_AUDIO_HSCROLLBAR & (automation_editor->flags)) == 0){ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ gtk_range_set_value(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar), gtk_range_get_value(range)); list = list->next; } g_list_free(list_start); } } void ags_automation_editor_output_vscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { GtkAdjustment *vadjustment; vadjustment = gtk_viewport_get_vadjustment(automation_editor->output_scrolled_automation_edit_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); vadjustment = gtk_viewport_get_vadjustment(automation_editor->output_scrolled_scale_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); } void ags_automation_editor_output_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { AgsConfig *config; GList *list_start, *list; gchar *str; gdouble gui_scale_factor; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_adjustment_set_value(automation_editor->output_ruler->adjustment, gtk_range_get_value(range) / (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH)); gtk_widget_queue_draw(GTK_WIDGET(automation_editor->output_ruler)); /* automation edit */ if((AGS_AUTOMATION_EDITOR_RESET_OUTPUT_HSCROLLBAR & (automation_editor->flags)) == 0){ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->output_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ gtk_range_set_value(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar), gtk_range_get_value(range)); list = list->next; } g_list_free(list_start); } } void ags_automation_editor_input_vscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { GtkAdjustment *vadjustment; vadjustment = gtk_viewport_get_vadjustment(automation_editor->input_scrolled_automation_edit_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); vadjustment = gtk_viewport_get_vadjustment(automation_editor->input_scrolled_scale_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); } void ags_automation_editor_input_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { AgsConfig *config; GList *list_start, *list; gchar *str; gdouble gui_scale_factor; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_adjustment_set_value(automation_editor->input_ruler->adjustment, gtk_range_get_value(range) / (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH)); gtk_widget_queue_draw(GTK_WIDGET(automation_editor->input_ruler)); /* automation edit */ if((AGS_AUTOMATION_EDITOR_RESET_INPUT_HSCROLLBAR & (automation_editor->flags)) == 0){ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->input_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ gtk_range_set_value(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar), gtk_range_get_value(range)); list = list->next; } g_list_free(list_start); } } void ags_automation_editor_audio_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { AgsAutomationEdit *automation_edit; GList *list_start, *list; gchar *str; gdouble gui_scale_factor; if((AGS_AUTOMATION_EDITOR_RESET_AUDIO_HSCROLLBAR & (automation_editor->flags)) != 0){ return; } automation_edit = (AgsAutomationEdit *) gtk_widget_get_ancestor(GTK_WIDGET(range), AGS_TYPE_AUTOMATION_EDIT); automation_editor->flags |= AGS_AUTOMATION_EDITOR_RESET_AUDIO_HSCROLLBAR; gtk_range_set_value(GTK_RANGE(automation_editor->audio_hscrollbar), gtk_range_get_value(range)); /* automation edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ if(automation_edit != list->data){ gtk_range_set_value(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar), gtk_range_get_value(range)); } list = list->next; } g_list_free(list_start); automation_editor->flags &= (~AGS_AUTOMATION_EDITOR_RESET_AUDIO_HSCROLLBAR); } void ags_automation_editor_output_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { AgsAutomationEdit *automation_edit; GList *list_start, *list; if((AGS_AUTOMATION_EDITOR_RESET_OUTPUT_HSCROLLBAR & (automation_editor->flags)) != 0){ return; } automation_edit = (AgsAutomationEdit *) gtk_widget_get_ancestor(GTK_WIDGET(range), AGS_TYPE_AUTOMATION_EDIT); automation_editor->flags |= AGS_AUTOMATION_EDITOR_RESET_OUTPUT_HSCROLLBAR; gtk_range_set_value(GTK_RANGE(automation_editor->output_hscrollbar), gtk_range_get_value(range)); /* automation edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->output_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ if(automation_edit != list->data){ gtk_range_set_value(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar), gtk_range_get_value(range)); } list = list->next; } g_list_free(list_start); automation_editor->flags &= (~AGS_AUTOMATION_EDITOR_RESET_OUTPUT_HSCROLLBAR); } void ags_automation_editor_input_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEditor *automation_editor) { AgsAutomationEdit *automation_edit; GList *list_start, *list; if((AGS_AUTOMATION_EDITOR_RESET_INPUT_HSCROLLBAR & (automation_editor->flags)) != 0){ return; } automation_edit = (AgsAutomationEdit *) gtk_widget_get_ancestor(GTK_WIDGET(range), AGS_TYPE_AUTOMATION_EDIT); automation_editor->flags |= AGS_AUTOMATION_EDITOR_RESET_INPUT_HSCROLLBAR; gtk_range_set_value(GTK_RANGE(automation_editor->input_hscrollbar), gtk_range_get_value(range)); /* automation edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->input_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ if(automation_edit != list->data){ gtk_range_set_value(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar), gtk_range_get_value(range)); } list = list->next; } g_list_free(list_start); automation_editor->flags &= (~AGS_AUTOMATION_EDITOR_RESET_INPUT_HSCROLLBAR); } void ags_automation_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsAutomationEditor *automation_editor) { ags_automation_editor_machine_changed(automation_editor, machine); } void ags_automation_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsAutomationEditor *automation_editor) { AgsAudio *audio; guint output_pads, input_pads; guint i; GRecMutex *audio_mutex; audio = machine->audio; /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_pads = audio->output_pads; input_pads = audio->input_pads; g_rec_mutex_unlock(audio_mutex); if(audio_channels > audio_channels_old){ GList *tab; /* output line */ for(i = audio_channels_old * output_pads; i < audio_channels * output_pads; i++){ ags_notebook_insert_tab(automation_editor->output_notebook, i); tab = automation_editor->output_notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } /* input line */ for(i = audio_channels_old * input_pads; i < audio_channels * input_pads; i++){ ags_notebook_insert_tab(automation_editor->output_notebook, i); tab = automation_editor->output_notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } }else{ /* output line */ for(i = audio_channels * output_pads; i < audio_channels_old * output_pads; i++){ ags_notebook_remove_tab(automation_editor->output_notebook, audio_channels * output_pads); } /* input line */ for(i = audio_channels * input_pads; i < audio_channels_old * input_pads; i++){ ags_notebook_remove_tab(automation_editor->input_notebook, audio_channels * input_pads); } } } void ags_automation_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsAutomationEditor *automation_editor) { AgsAudio *audio; guint audio_channels; guint i; GRecMutex *audio_mutex; audio = machine->audio; /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); audio_channels = audio->audio_channels; g_rec_mutex_unlock(audio_mutex); if(pads > pads_old){ GList *tab; if(channel_type == AGS_TYPE_OUTPUT){ for(i = audio_channels * pads_old; i < audio_channels * pads; i++){ ags_notebook_insert_tab(automation_editor->output_notebook, i); tab = automation_editor->output_notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } }else if(channel_type == AGS_TYPE_INPUT){ for(i = audio_channels * pads_old; i < audio_channels * pads; i++){ ags_notebook_insert_tab(automation_editor->input_notebook, i); tab = automation_editor->input_notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } } }else{ if(channel_type == AGS_TYPE_OUTPUT){ for(i = audio_channels * pads; i < audio_channels * pads_old; i++){ ags_notebook_remove_tab(automation_editor->output_notebook, audio_channels * pads); } }else if(channel_type == AGS_TYPE_INPUT){ for(i = audio_channels * pads; i < audio_channels * pads_old; i++){ ags_notebook_remove_tab(automation_editor->input_notebook, audio_channels * pads); } } } } gsequencer-3.1.3/ags/X/ags_preferences.c0000644000175000017500000003121313607210263015060 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_preferences_class_init(AgsPreferencesClass *preferences); void ags_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_preferences_init(AgsPreferences *preferences); void ags_preferences_connect(AgsConnectable *connectable); void ags_preferences_disconnect(AgsConnectable *connectable); void ags_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_preferences_apply(AgsApplicable *applicable); void ags_preferences_reset(AgsApplicable *applicable); void ags_preferences_show(GtkWidget *widget); void ags_preferences_show_all(GtkWidget *widget); /** * SECTION:ags_preferences * @short_description: A dialog to do preferences * @title: AgsPluginPreferences * @section_id: * @include: ags/X/ags_plugin_preferences.h * * #AgsDialogPreferences enables you to make preferences. */ static gpointer ags_preferences_parent_class = NULL; GType ags_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_preferences = 0; static const GTypeInfo ags_preferences_info = { sizeof (AgsPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_preferences = g_type_register_static(GTK_TYPE_DIALOG, "AgsPreferences", &ags_preferences_info, 0); g_type_add_interface_static(ags_type_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_preferences); } return g_define_type_id__volatile; } void ags_preferences_class_init(AgsPreferencesClass *preferences) { GtkWidgetClass *widget; ags_preferences_parent_class = g_type_class_peek_parent(preferences); /* GtkWidgetClass */ widget = (GtkWidgetClass *) preferences; widget->show = ags_preferences_show; widget->show_all = ags_preferences_show_all; } void ags_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_preferences_connect; connectable->disconnect = ags_preferences_disconnect; } void ags_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_preferences_set_update; applicable->apply = ags_preferences_apply; applicable->reset = ags_preferences_reset; } void ags_preferences_init(AgsPreferences *preferences) { GtkButton *button; gchar *str; preferences->flags = 0; preferences->main_window = NULL; gtk_window_set_title(GTK_WINDOW(preferences), i18n("preferences")); gtk_window_set_deletable(GTK_WINDOW(preferences), TRUE); preferences->notebook = (GtkNotebook *) gtk_notebook_new(); g_object_set(G_OBJECT(preferences->notebook), "tab-pos", GTK_POS_LEFT, NULL); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(preferences))), GTK_WIDGET(preferences->notebook)); preferences->generic_preferences = ags_generic_preferences_new(); gtk_widget_set_hexpand(preferences->generic_preferences, TRUE); gtk_widget_set_vexpand(preferences->generic_preferences, TRUE); gtk_notebook_append_page(preferences->notebook, GTK_WIDGET(preferences->generic_preferences), gtk_label_new(i18n("generic"))); preferences->audio_preferences = ags_audio_preferences_new(); gtk_widget_set_hexpand(preferences->audio_preferences, TRUE); gtk_widget_set_vexpand(preferences->audio_preferences, TRUE); gtk_notebook_append_page(preferences->notebook, GTK_WIDGET(preferences->audio_preferences), gtk_label_new(i18n("audio"))); preferences->midi_preferences = ags_midi_preferences_new(); gtk_widget_set_hexpand(preferences->midi_preferences, TRUE); gtk_widget_set_vexpand(preferences->midi_preferences, TRUE); gtk_notebook_append_page(preferences->notebook, GTK_WIDGET(preferences->midi_preferences), gtk_label_new(i18n("midi"))); preferences->performance_preferences = ags_performance_preferences_new(); gtk_widget_set_hexpand(preferences->performance_preferences, TRUE); gtk_widget_set_vexpand(preferences->performance_preferences, TRUE); gtk_notebook_append_page(preferences->notebook, GTK_WIDGET(preferences->performance_preferences), gtk_label_new(i18n("performance"))); str = ags_config_get_value(ags_config_get_instance(), AGS_CONFIG_GENERIC, "disable-feature"); preferences->osc_server_preferences = ags_osc_server_preferences_new(); gtk_widget_set_hexpand(preferences->osc_server_preferences, TRUE); gtk_widget_set_vexpand(preferences->osc_server_preferences, TRUE); gtk_notebook_append_page(preferences->notebook, GTK_WIDGET(preferences->osc_server_preferences), gtk_label_new(i18n("OSC server"))); if(str == NULL || !g_ascii_strncasecmp(str, "experimental", 13)){ preferences->server_preferences = NULL; }else{ preferences->server_preferences = ags_server_preferences_new(); gtk_notebook_append_page(preferences->notebook, GTK_WIDGET(preferences->server_preferences), gtk_label_new(i18n("server"))); } gtk_dialog_add_action_widget(GTK_DIALOG(preferences), gtk_button_new_from_stock(GTK_STOCK_APPLY), GTK_RESPONSE_APPLY); gtk_dialog_add_action_widget(GTK_DIALOG(preferences), gtk_button_new_from_stock(GTK_STOCK_CANCEL), GTK_RESPONSE_CANCEL); gtk_dialog_add_action_widget(GTK_DIALOG(preferences), gtk_button_new_from_stock(GTK_STOCK_OK), GTK_RESPONSE_OK); } void ags_preferences_connect(AgsConnectable *connectable) { AgsPreferences *preferences; preferences = AGS_PREFERENCES(connectable); ags_connectable_connect(AGS_CONNECTABLE(preferences->generic_preferences)); ags_connectable_connect(AGS_CONNECTABLE(preferences->audio_preferences)); ags_connectable_connect(AGS_CONNECTABLE(preferences->midi_preferences)); ags_connectable_connect(AGS_CONNECTABLE(preferences->performance_preferences)); ags_connectable_connect(AGS_CONNECTABLE(preferences->osc_server_preferences)); if(preferences->server_preferences != NULL){ ags_connectable_connect(AGS_CONNECTABLE(preferences->server_preferences)); } g_signal_connect(G_OBJECT(preferences), "delete-event", G_CALLBACK(ags_preferences_delete_event_callback), NULL); g_signal_connect_after(G_OBJECT(preferences), "response", G_CALLBACK(ags_preferences_response_callback), NULL); g_signal_connect_after(G_OBJECT(preferences->notebook), "switch-page", G_CALLBACK(ags_preferences_notebook_switch_page_callback), preferences); } void ags_preferences_disconnect(AgsConnectable *connectable) { /* empty */ } void ags_preferences_set_update(AgsApplicable *applicable, gboolean update) { AgsPreferences *preferences; preferences = AGS_PREFERENCES(applicable); ags_applicable_set_update(AGS_APPLICABLE(preferences->generic_preferences), update); ags_applicable_set_update(AGS_APPLICABLE(preferences->audio_preferences), update); ags_applicable_set_update(AGS_APPLICABLE(preferences->midi_preferences), update); ags_applicable_set_update(AGS_APPLICABLE(preferences->performance_preferences), update); ags_applicable_set_update(AGS_APPLICABLE(preferences->osc_server_preferences), update); if(preferences->server_preferences != NULL){ ags_applicable_set_update(AGS_APPLICABLE(preferences->server_preferences), update); } } void ags_preferences_apply(AgsApplicable *applicable) { AgsWindow *window; AgsPreferences *preferences; GtkDialog *dialog; AgsApplySoundConfig *apply_sound_config; AgsApplicationContext *application_context; AgsConfig *config; gchar *filename; gchar **argv; preferences = AGS_PREFERENCES(applicable); application_context = ags_application_context_get_instance(); window = ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); config = ags_config_get_instance(); ags_config_clear(config); ags_applicable_apply(AGS_APPLICABLE(preferences->generic_preferences)); ags_applicable_apply(AGS_APPLICABLE(preferences->audio_preferences)); ags_applicable_apply(AGS_APPLICABLE(preferences->midi_preferences)); ags_applicable_apply(AGS_APPLICABLE(preferences->performance_preferences)); ags_applicable_apply(AGS_APPLICABLE(preferences->osc_server_preferences)); if(preferences->server_preferences != NULL){ ags_applicable_apply(AGS_APPLICABLE(preferences->server_preferences)); } ags_config_save(config); apply_sound_config = ags_apply_sound_config_new(NULL); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) apply_sound_config); /* notify user about safe GSequencer */ dialog = (GtkDialog *) gtk_message_dialog_new((GtkWindow *) window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "After finished your modifications you should safe your file"); g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show_all((GtkWidget *) dialog); } void ags_preferences_reset(AgsApplicable *applicable) { AgsPreferences *preferences; preferences = AGS_PREFERENCES(applicable); ags_applicable_reset(AGS_APPLICABLE(preferences->generic_preferences)); ags_applicable_reset(AGS_APPLICABLE(preferences->audio_preferences)); ags_applicable_reset(AGS_APPLICABLE(preferences->midi_preferences)); ags_applicable_reset(AGS_APPLICABLE(preferences->performance_preferences)); ags_applicable_reset(AGS_APPLICABLE(preferences->osc_server_preferences)); if(preferences->server_preferences != NULL){ ags_applicable_reset(AGS_APPLICABLE(preferences->server_preferences)); } } void ags_preferences_show(GtkWidget *widget) { GList *list, *list_start; GTK_WIDGET_CLASS(ags_preferences_parent_class)->show(widget); list_start = list = gtk_container_get_children((GtkContainer *) gtk_dialog_get_action_area(GTK_DIALOG(widget))); list = g_list_nth(list, 3); while(list != NULL){ gtk_widget_hide((GtkWidget *) list->data); list = list->next; } g_list_free(list_start); } void ags_preferences_show_all(GtkWidget *widget) { GList *list, *list_start; GTK_WIDGET_CLASS(ags_preferences_parent_class)->show_all(widget); list_start = list = gtk_container_get_children((GtkContainer *) gtk_dialog_get_action_area(GTK_DIALOG(widget))); list = g_list_nth(list, 3); while(list != NULL){ gtk_widget_hide(list->data); list = list->next; } g_list_free(list_start); } /** * ags_preferences_new: * * Create a new instance of #AgsPreferences * * Returns: the new #AgsPreferences * * Since: 3.0.0 */ AgsPreferences* ags_preferences_new() { AgsPreferences *preferences; preferences = (AgsPreferences *) g_object_new(AGS_TYPE_PREFERENCES, NULL); return(preferences); } gsequencer-3.1.3/ags/X/ags_window.h0000644000175000017500000000725613613101102014071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WINDOW_H__ #define __AGS_WINDOW_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WINDOW (ags_window_get_type()) #define AGS_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WINDOW, AgsWindow)) #define AGS_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WINDOW, AgsWindowClass)) #define AGS_IS_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_WINDOW)) #define AGS_IS_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_WINDOW)) #define AGS_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_WINDOW, AgsWindowClass)) #define AGS_MACHINE_COUNTER(ptr) ((AgsMachineCounter *)(ptr)) typedef struct _AgsWindow AgsWindow; typedef struct _AgsWindowClass AgsWindowClass; typedef struct _AgsMachineCounter AgsMachineCounter; typedef enum{ AGS_WINDOW_CONNECTED = 1, AGS_WINDOW_READY = 1 << 1, AGS_WINDOW_LOADING = 1 << 2, AGS_WINDOW_SAVING = 1 << 3, AGS_WINDOW_TERMINATING = 1 << 4, }AgsWindowFlags; struct _AgsWindow { GtkWindow window; guint flags; gchar *filename; char *name; AgsMenuBar *menu_bar; AgsContextMenu *context_menu; GtkVPaned *paned; GtkVBox *machines; GList *machine_counter; AgsMachine *selected; AgsNotationEditor *notation_editor; AgsNavigation *navigation; GList *dialog; AgsAutomationWindow *automation_window; AgsWaveWindow *wave_window; AgsExportWindow *export_window; GtkWidget *midi_import_wizard; GtkWidget *midi_export_wizard; GtkWidget *midi_file_chooser; AgsPreferences *preferences; }; struct _AgsWindowClass { GtkWindowClass window; }; struct _AgsMachineCounter { gchar *version; gchar *build_id; GType machine_type; gchar *filename; gchar *effect; guint counter; }; GType ags_window_get_type(void); GList* ags_window_standard_machine_counter_alloc(); AgsMachineCounter* ags_window_find_machine_counter(AgsWindow *window, GType machine_type); void ags_window_increment_machine_counter(AgsWindow *window, GType machine_type); void ags_window_decrement_machine_counter(AgsWindow *window, GType machine_type); AgsMachineCounter* ags_machine_counter_alloc(gchar *version, gchar *build_id, GType machine_type, guint initial_value); void ags_window_show_error(AgsWindow *window, gchar *message); gboolean ags_window_load_file_timeout(AgsWindow *window); AgsWindow* ags_window_new(); G_END_DECLS #endif /*__AGS_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_playback_window.c0000644000175000017500000001645713607210263015751 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_playback_window_class_init(AgsPlaybackWindowClass *playback_window); void ags_playback_window_connectable_interface_init(AgsConnectableInterface *connectable); void ags_playback_window_init(AgsPlaybackWindow *playback_window); void ags_playback_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_playback_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_playback_window_finalize(GObject *gobject); void ags_playback_window_connect(AgsConnectable *connectable); void ags_playback_window_disconnect(AgsConnectable *connectable); gboolean ags_playback_window_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_playback_window * @short_description: The playback dialog * @title: AgsPlaybackWindow * @section_id: * @include: ags/X/ags_playback_window.h * * #AgsPlaybackWindow lets you playback to audio files. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_playback_window_parent_class = NULL; GType ags_playback_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_playback_window = 0; static const GTypeInfo ags_playback_window_info = { sizeof (AgsPlaybackWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_playback_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlaybackWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_playback_window_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_playback_window_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_playback_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsPlaybackWindow", &ags_playback_window_info, 0); g_type_add_interface_static(ags_type_playback_window, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_playback_window); } return g_define_type_id__volatile; } void ags_playback_window_class_init(AgsPlaybackWindowClass *playback_window) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_playback_window_parent_class = g_type_class_peek_parent(playback_window); /* GObjectClass */ gobject = (GObjectClass *) playback_window; gobject->set_property = ags_playback_window_set_property; gobject->get_property = ags_playback_window_get_property; gobject->finalize = ags_playback_window_finalize; /* properties */ /** * AgsPlaybackWindow:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) playback_window; widget->delete_event = ags_playback_window_delete_event; } void ags_playback_window_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_playback_window_connect; connectable->disconnect = ags_playback_window_disconnect; } void ags_playback_window_init(AgsPlaybackWindow *playback_window) { playback_window->flags = 0; g_object_set(playback_window, "title", "MIDI playback", NULL); playback_window->main_window = NULL; } void ags_playback_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlaybackWindow *playback_window; playback_window = AGS_PLAYBACK_WINDOW(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) playback_window->main_window == main_window){ return; } if(playback_window->main_window != NULL){ g_object_unref(playback_window->main_window); } if(main_window != NULL){ g_object_ref(main_window); } playback_window->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_playback_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlaybackWindow *playback_window; playback_window = AGS_PLAYBACK_WINDOW(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, playback_window->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_playback_window_connect(AgsConnectable *connectable) { AgsPlaybackWindow *playback_window; playback_window = AGS_PLAYBACK_WINDOW(connectable); if((AGS_PLAYBACK_WINDOW_CONNECTED & (playback_window->flags)) != 0){ return; } playback_window->flags |= AGS_PLAYBACK_WINDOW_CONNECTED; } void ags_playback_window_disconnect(AgsConnectable *connectable) { AgsPlaybackWindow *playback_window; playback_window = AGS_PLAYBACK_WINDOW(connectable); if((AGS_PLAYBACK_WINDOW_CONNECTED & (playback_window->flags)) == 0){ return; } playback_window->flags &= (~AGS_PLAYBACK_WINDOW_CONNECTED); } void ags_playback_window_finalize(GObject *gobject) { AgsPlaybackWindow *playback_window; playback_window = (AgsPlaybackWindow *) gobject; G_OBJECT_CLASS(ags_playback_window_parent_class)->finalize(gobject); } gboolean ags_playback_window_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_playback_window_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_playback_window_new: * * Create a new instance of #AgsPlaybackWindow * * Returns: the new #AgsPlaybackWindow * * Since: 3.0.0 */ AgsPlaybackWindow* ags_playback_window_new() { AgsPlaybackWindow *playback_window; playback_window = (AgsPlaybackWindow *) g_object_new(AGS_TYPE_PLAYBACK_WINDOW, NULL); return(playback_window); } gsequencer-3.1.3/ags/X/ags_connection_editor.h0000644000175000017500000000662713607210263016304 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONNECTION_EDITOR_H__ #define __AGS_CONNECTION_EDITOR_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CONNECTION_EDITOR (ags_connection_editor_get_type()) #define AGS_CONNECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONNECTION_EDITOR, AgsConnectionEditor)) #define AGS_CONNECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CONNECTION_EDITOR, AgsConnectionEditorClass)) #define AGS_IS_CONNECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CONNECTION_EDITOR)) #define AGS_IS_CONNECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CONNECTION_EDITOR)) #define AGS_CONNECTION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CONNECTION_EDITOR, AgsConnectionEditorClass)) #define AGS_CONNECTION_EDITOR_DEFAULT_VERSION "2.0.0" #define AGS_CONNECTION_EDITOR_DEFAULT_BUILD_ID "Sun Aug 26 19:06:10 UTC 2018" typedef struct _AgsConnectionEditor AgsConnectionEditor; typedef struct _AgsConnectionEditorClass AgsConnectionEditorClass; typedef enum{ AGS_CONNECTION_EDITOR_CONNECTED = 1, AGS_CONNECTION_EDITOR_CLOSING = 1 << 1, AGS_CONNECTION_EDITOR_SHOW_OUTPUT = 1 << 2, AGS_CONNECTION_EDITOR_SHOW_INPUT = 1 << 3, }AgsConnectionEditorFlags; struct _AgsConnectionEditor { GtkDialog dialog; guint flags; gchar *version; gchar *build_id; AgsMachine *machine; GtkNotebook *notebook; GtkScrolledWindow *output_listing_editor_scrolled_window; AgsPropertyCollectionEditor *output_listing_editor; GtkScrolledWindow *input_listing_editor_scrolled_window; AgsPropertyCollectionEditor *input_listing_editor; GtkScrolledWindow *output_connection_editor_scrolled_window; AgsPropertyCollectionEditor *output_connection_editor; GtkScrolledWindow *input_connection_editor_scrolled_window; AgsPropertyCollectionEditor *input_connection_editor; GtkButton *apply; GtkButton *ok; GtkButton *cancel; }; struct _AgsConnectionEditorClass { GtkDialogClass dialog; void (*set_machine)(AgsConnectionEditor *connection_editor, AgsMachine *machine); }; GType ags_connection_editor_get_type(void); void ags_connection_editor_set_machine(AgsConnectionEditor *connection_editor, AgsMachine *machine); AgsConnectionEditor* ags_connection_editor_new(AgsMachine *machine); G_END_DECLS #endif /*__AGS_CONNECTION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_lv2_browser_callbacks.h0000644000175000017500000000245613607210263017040 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_BROWSER_CALLBACKS_H__ #define __AGS_LV2_BROWSER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_lv2_browser_plugin_filename_callback(GtkComboBoxText *combo_box, AgsLv2Browser *lv2_browser); void ags_lv2_browser_plugin_uri_callback(GtkComboBoxText *combo_box, AgsLv2Browser *lv2_browser); G_END_DECLS #endif /*__AGS_LV2_BROWSER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_dssi_browser_callbacks.c0000644000175000017500000001401213607210263017261 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_dssi_browser_plugin_filename_callback(GtkComboBoxText *combo_box, AgsDssiBrowser *dssi_browser) { GtkComboBoxText *filename, *effect; AgsDssiManager *dssi_manager; AgsDssiPlugin *dssi_plugin; GList *start_list, *list; gchar *str; GRecMutex *dssi_manager_mutex; filename = GTK_COMBO_BOX_TEXT(dssi_browser->filename); effect = GTK_COMBO_BOX_TEXT(dssi_browser->effect); gtk_list_store_clear(GTK_LIST_STORE(effect)); dssi_manager = ags_dssi_manager_get_instance(); /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* get dssi plugin */ g_rec_mutex_lock(dssi_manager_mutex); list = start_list = g_list_copy_deep(dssi_manager->dssi_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(dssi_manager_mutex); str = gtk_combo_box_text_get_active_text(filename); while((list = ags_base_plugin_find_filename(list, str)) != NULL){ gchar *str; dssi_plugin = list->data; /* set effect */ g_object_get(dssi_plugin, "effect", &str, NULL); if(str != NULL){ gtk_combo_box_text_append_text(effect, str); } g_free(str); /* iterate */ list = list->next; } gtk_combo_box_set_active((GtkComboBox *) effect, 0); g_list_free_full(start_list, g_object_unref); } void ags_dssi_browser_plugin_effect_callback(GtkComboBoxText *combo_box, AgsDssiBrowser *dssi_browser) { GtkComboBoxText *filename, *effect; GtkTable *table; AgsDssiPlugin *dssi_plugin; GList *child, *child_start; gchar *str, *tmp; guint effect_index; guint port_count; guint y; unsigned long i; void *plugin_so; DSSI_Descriptor *plugin_descriptor; LADSPA_PortDescriptor *port_descriptor; GRecMutex *base_plugin_mutex; /* retrieve filename and effect */ filename = GTK_COMBO_BOX_TEXT(dssi_browser->filename); effect = GTK_COMBO_BOX_TEXT(dssi_browser->effect); dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), gtk_combo_box_text_get_active_text(filename), gtk_combo_box_text_get_active_text(effect)); g_object_get(dssi_plugin, "plugin-so", &plugin_so, "effect-index", &effect_index, NULL); /* update description */ if(plugin_so){ /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* plugin and port descriptor */ g_rec_mutex_lock(base_plugin_mutex); plugin_descriptor = AGS_DSSI_PLUGIN_DESCRIPTOR(AGS_BASE_PLUGIN(dssi_plugin)->plugin_descriptor); port_descriptor = plugin_descriptor->LADSPA_Plugin->PortDescriptors; /* update ui - reading plugin file */ str = g_strconcat(i18n("Label"), ": ", plugin_descriptor->LADSPA_Plugin->Label, NULL); gtk_label_set_text(dssi_browser->label, str); g_free(str); str = g_strconcat(i18n("Maker"), ": ", plugin_descriptor->LADSPA_Plugin->Label, NULL); gtk_label_set_text(dssi_browser->maker, str); g_free(str); str = g_strconcat(i18n("Copyright"), ": ", plugin_descriptor->LADSPA_Plugin->Label, NULL); gtk_label_set_text(dssi_browser->copyright, str); g_free(str); /* update ui - port information */ port_count = plugin_descriptor->LADSPA_Plugin->PortCount; table = dssi_browser->port_table; child_start = child = gtk_container_get_children(GTK_CONTAINER(table)); while(child != NULL){ gtk_widget_destroy(GTK_WIDGET(child->data)); child = child->next; } g_list_free(child_start); for(i = 0, y = 0; i < port_count; i++){ GtkLabel *label; if(!(LADSPA_IS_PORT_CONTROL(port_descriptor[i]) && (LADSPA_IS_PORT_INPUT(port_descriptor[i]) || LADSPA_IS_PORT_OUTPUT(port_descriptor[i])))){ continue; } str = g_strdup(plugin_descriptor->LADSPA_Plugin->PortNames[i]); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_table_attach_defaults(table, GTK_WIDGET(label), 0, 1, y, y + 1); gtk_table_attach_defaults(table, GTK_WIDGET(ags_dssi_browser_combo_box_controls_new()), 1, 2, y, y + 1); y++; } g_rec_mutex_unlock(base_plugin_mutex); gtk_widget_show_all((GtkWidget *) table); }else{ /* update ui - empty */ str = g_strdup_printf("%s: ", i18n("Label")); gtk_label_set_text(dssi_browser->label, str); g_free(str); str = g_strdup_printf("%s: ", i18n("Maker")); gtk_label_set_text(dssi_browser->maker, str); g_free(str); str = g_strdup_printf("%s: ", i18n("Copyright")); gtk_label_set_text(dssi_browser->copyright, str); g_free(str); /* update ui - no ports */ table = dssi_browser->port_table; child_start = child = gtk_container_get_children(GTK_CONTAINER(table)); while(child != NULL){ gtk_widget_destroy(GTK_WIDGET(child->data)); child = child->next; } g_list_free(child_start); } } gsequencer-3.1.3/ags/X/ags_output_listing_editor_callbacks.h0000644000175000017500000000277013607210263021230 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_LISTING_EDITOR_CALLBACKS_H__ #define __AGS_OUTPUT_LISTING_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_output_listing_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsOutputListingEditor *output_listing_editor); void ags_output_listing_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsOutputListingEditor *output_listing_editor); G_END_DECLS #endif /*__AGS_OUTPUT_LISTING_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_sheet_editor_callbacks.h0000644000175000017500000000301113607210263017234 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_EDITOR_CALLBACKS_H__ #define __AGS_SHEET_EDITOR_CALLBACKS_H__ #include #include #include #include #include G_BEGIN_DECLS void ags_sheet_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsSheetEditor *sheet_editor); void ags_sheet_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsSheetEditor *sheet_editor); void ags_sheet_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsSheetEditor *sheet_editor); G_END_DECLS #endif /*__AGS_SHEET_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_preferences.h0000644000175000017500000000524313607210263015071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PREFERENCES_H__ #define __AGS_PREFERENCES_H__ #include #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PREFERENCES (ags_preferences_get_type()) #define AGS_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PREFERENCES, AgsPreferences)) #define AGS_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PREFERENCES, AgsPreferencesClass)) #define AGS_IS_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PREFERENCES)) #define AGS_IS_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PREFERENCES)) #define AGS_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PREFERENCES, AgsPreferencesClass)) #define AGS_PREFERENCES_DEFAULT_FILENAME "ags_current.xml" typedef struct _AgsPreferences AgsPreferences; typedef struct _AgsPreferencesClass AgsPreferencesClass; typedef enum{ AGS_PREFERENCES_SHUTDOWN = 1, }AgsPreferencesFlags; struct _AgsPreferences { GtkDialog dialog; guint flags; GtkWindow *main_window; GtkNotebook *notebook; AgsGenericPreferences *generic_preferences; AgsAudioPreferences *audio_preferences; AgsMidiPreferences *midi_preferences; AgsPerformancePreferences *performance_preferences; AgsOscServerPreferences *osc_server_preferences; AgsServerPreferences *server_preferences; }; struct _AgsPreferencesClass { GtkDialogClass dialog; }; GType ags_preferences_get_type(void); AgsPreferences* ags_preferences_new(); G_END_DECLS #endif /*__AGS_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_automation_window_callbacks.h0000644000175000017500000000211713607210263020333 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_WINDOW_CALLBACKS_H__ #define __AGS_AUTOMATION_WINDOW_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_AUTOMATION_WINDOW_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_soundcard_editor_callbacks.c0000644000175000017500000002452013607210263020111 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_soundcard_editor_backend_changed_callback(GtkComboBox *combo, AgsSoundcardEditor *soundcard_editor) { gchar *str; gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), TRUE); str = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo)); if(str != NULL){ if(!g_ascii_strncasecmp(str, "wasapi", 6)){ ags_soundcard_editor_show_wasapi_control(soundcard_editor); }else{ ags_soundcard_editor_hide_wasapi_control(soundcard_editor); } if(!g_ascii_strncasecmp(str, "core-audio", 11)){ gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), TRUE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->samplerate, FALSE); ags_soundcard_editor_load_core_audio_card(soundcard_editor); gtk_widget_show_all((GtkWidget *) soundcard_editor->port_hbox); }else if(!g_ascii_strncasecmp(str, "pulse", 6)){ gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->capability), 0); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), TRUE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->samplerate, FALSE); ags_soundcard_editor_load_pulse_card(soundcard_editor); gtk_widget_show_all((GtkWidget *) soundcard_editor->port_hbox); }else if(!g_ascii_strncasecmp(str, "jack", 5)){ gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->samplerate, FALSE); ags_soundcard_editor_load_jack_card(soundcard_editor); gtk_widget_show_all((GtkWidget *) soundcard_editor->port_hbox); }else if(!g_ascii_strncasecmp(str, "wasapi", 6)){ gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, TRUE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->samplerate, TRUE); ags_soundcard_editor_load_wasapi_card(soundcard_editor); // gtk_widget_hide((GtkWidget *) soundcard_editor->port_hbox); }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, TRUE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->samplerate, TRUE); ags_soundcard_editor_load_alsa_card(soundcard_editor); // gtk_widget_hide((GtkWidget *) soundcard_editor->port_hbox); }else if(!g_ascii_strncasecmp(str, "oss", 4)){ gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, TRUE); gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->samplerate, TRUE); ags_soundcard_editor_load_oss_card(soundcard_editor); // gtk_widget_hide((GtkWidget *) soundcard_editor->port_hbox); } } } void ags_soundcard_editor_card_changed_callback(GtkComboBox *combo, AgsSoundcardEditor *soundcard_editor) { GObject *soundcard; gchar *card; guint channels, channels_min, channels_max; guint rate, rate_min, rate_max; guint buffer_size, buffer_size_min, buffer_size_max; GError *error; if((AGS_SOUNDCARD_EDITOR_BLOCK_CARD & (soundcard_editor->flags)) != 0){ return; } soundcard_editor->flags |= AGS_SOUNDCARD_EDITOR_BLOCK_CARD; soundcard = soundcard_editor->soundcard; /* */ card = gtk_combo_box_text_get_active_text(soundcard_editor->card); /* reset dialog */ error = NULL; ags_soundcard_pcm_info(AGS_SOUNDCARD(soundcard), card, &channels_min, &channels_max, &rate_min, &rate_max, &buffer_size_min, &buffer_size_max, &error); if(error != NULL){ GtkMessageDialog *dialog; dialog = (GtkMessageDialog *) gtk_message_dialog_new((GtkWindow *) gtk_widget_get_ancestor(GTK_WIDGET(soundcard_editor), AGS_TYPE_PREFERENCES), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", error->message); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(GTK_WIDGET(dialog)); gtk_spin_button_set_range(soundcard_editor->audio_channels, 0.0, 24.0); gtk_spin_button_set_range(soundcard_editor->samplerate, 1.0, 192000.0); gtk_spin_button_set_range(soundcard_editor->buffer_size, 1.0, 65535.0); soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_CARD); g_error_free(error); return; } if(card != NULL){ ags_soundcard_set_device(AGS_SOUNDCARD(soundcard), card); gtk_spin_button_set_range(soundcard_editor->audio_channels, channels_min, channels_max); gtk_spin_button_set_range(soundcard_editor->samplerate, rate_min, rate_max); gtk_spin_button_set_range(soundcard_editor->buffer_size, buffer_size_min, buffer_size_max); } soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_CARD); } void ags_soundcard_editor_add_port_callback(GtkWidget *button, AgsSoundcardEditor *soundcard_editor) { ags_soundcard_editor_add_port(soundcard_editor, NULL); } void ags_soundcard_editor_remove_port_callback(GtkWidget *button, AgsSoundcardEditor *soundcard_editor) { ags_soundcard_editor_remove_port(soundcard_editor, gtk_combo_box_text_get_active_text(soundcard_editor->card)); } void ags_soundcard_editor_audio_channels_changed_callback(GtkSpinButton *spin_button, AgsSoundcardEditor *soundcard_editor) { AgsSetAudioChannels *set_audio_channels; AgsApplicationContext *application_context; GObject *soundcard; soundcard = soundcard_editor->soundcard; application_context = ags_application_context_get_instance(); /* create set output device task */ set_audio_channels = ags_set_audio_channels_new(soundcard, (guint) gtk_spin_button_get_value(spin_button)); /* append AgsSetAudioChannels */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) set_audio_channels); } void ags_soundcard_editor_samplerate_changed_callback(GtkSpinButton *spin_button, AgsSoundcardEditor *soundcard_editor) { AgsSetSamplerate *set_samplerate; AgsApplicationContext *application_context; GObject *soundcard; soundcard = soundcard_editor->soundcard; application_context = ags_application_context_get_instance(); /* create set output device task */ set_samplerate = ags_set_samplerate_new(soundcard, (guint) gtk_spin_button_get_value(spin_button)); /* append AgsSetSamplerate */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) set_samplerate); } void ags_soundcard_editor_buffer_size_changed_callback(GtkSpinButton *spin_button, AgsSoundcardEditor *soundcard_editor) { AgsSetBufferSize *set_buffer_size; AgsApplicationContext *application_context; GObject *soundcard; soundcard = soundcard_editor->soundcard; application_context = ags_application_context_get_instance(); /* create set output device task */ set_buffer_size = ags_set_buffer_size_new(soundcard, (guint) gtk_spin_button_get_value(spin_button)); /* append AgsSetBufferSize */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) set_buffer_size); } void ags_soundcard_editor_format_changed_callback(GtkComboBox *combo_box, AgsSoundcardEditor *soundcard_editor) { AgsSetFormat *set_format; AgsApplicationContext *application_context; GObject *soundcard; guint format; soundcard = soundcard_editor->soundcard; application_context = ags_application_context_get_instance(); /* format */ switch(gtk_combo_box_get_active(GTK_COMBO_BOX(soundcard_editor->format))){ case 0: format = AGS_SOUNDCARD_SIGNED_8_BIT; break; case 1: format = AGS_SOUNDCARD_SIGNED_16_BIT; break; case 2: format = AGS_SOUNDCARD_SIGNED_24_BIT; break; case 3: format = AGS_SOUNDCARD_SIGNED_32_BIT; break; case 4: format = AGS_SOUNDCARD_SIGNED_64_BIT; break; default: g_warning("unsupported format"); return; } /* create set output device task */ set_format = ags_set_format_new((GObject *) soundcard, format); /* append AgsSetBufferSize */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (GObject *) set_format); } gsequencer-3.1.3/ags/X/ags_machine_editor.h0000644000175000017500000000713413607210263015543 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_EDITOR_H__ #define __AGS_MACHINE_EDITOR_H__ #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE_EDITOR (ags_machine_editor_get_type()) #define AGS_MACHINE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE_EDITOR, AgsMachineEditor)) #define AGS_MACHINE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE_EDITOR, AgsMachineEditorClass)) #define AGS_IS_MACHINE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MACHINE_EDITOR)) #define AGS_IS_MACHINE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MACHINE_EDITOR)) #define AGS_MACHINE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MACHINE_EDITOR, AgsMachineEditorClass)) #define AGS_MACHINE_EDITOR_DEFAULT_VERSION "0.4.2" #define AGS_MACHINE_EDITOR_DEFAULT_BUILD_ID "CEST 02-10-2014 19:36" typedef struct _AgsMachineEditor AgsMachineEditor; typedef struct _AgsMachineEditorClass AgsMachineEditorClass; typedef enum{ AGS_MACHINE_EDITOR_CONNECTED = 1, AGS_MACHINE_EDITOR_CLOSING = 1 << 1, }AgsMachineEditorFlags; struct _AgsMachineEditor { GtkDialog dialog; guint flags; gchar *version; gchar *build_id; AgsMachine *machine; GtkNotebook *notebook; GtkScrolledWindow *output_scrolled_window; AgsListingEditor *output_editor; GtkScrolledWindow *input_scrolled_window; AgsListingEditor *input_editor; GtkScrolledWindow *output_link_editor_scrolled_window; AgsPropertyCollectionEditor *output_link_editor; GtkScrolledWindow *input_link_editor_scrolled_window; AgsPropertyCollectionEditor *input_link_editor; GtkScrolledWindow *resize_editor_scrolled_window; AgsResizeEditor *resize_editor; GtkButton *add; GtkButton *remove; GtkButton *apply; GtkButton *ok; GtkButton *cancel; }; struct _AgsMachineEditorClass { GtkDialogClass dialog; void (*set_machine)(AgsMachineEditor *machine_editor, AgsMachine *machine); }; GType ags_machine_editor_get_type(void); void ags_machine_editor_add_children(AgsMachineEditor *machine_editor); void ags_machine_editor_set_machine(AgsMachineEditor *machine_editor, AgsMachine *machine); void ags_machine_editor_add_input(AgsMachineEditor *machine_editor); void ags_machine_editor_add_output(AgsMachineEditor *machine_editor); void ags_machine_editor_remove_input(AgsMachineEditor *machine_editor); void ags_machine_editor_remove_output(AgsMachineEditor *machine_editor); AgsMachineEditor* ags_machine_editor_new(AgsMachine *machine); G_END_DECLS #endif /*__AGS_MACHINE_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_ladspa_browser.c0000644000175000017500000003132613607210264015574 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_ladspa_browser_class_init(AgsLadspaBrowserClass *ladspa_browser); void ags_ladspa_browser_init(AgsLadspaBrowser *ladspa_browser); void ags_ladspa_browser_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ladspa_browser_applicable_interface_init(AgsApplicableInterface *applicable); void ags_ladspa_browser_connect(AgsConnectable *connectable); void ags_ladspa_browser_disconnect(AgsConnectable *connectable); void ags_ladspa_browser_set_update(AgsApplicable *applicable, gboolean update); void ags_ladspa_browser_apply(AgsApplicable *applicable); void ags_ladspa_browser_reset(AgsApplicable *applicable); /** * SECTION:ags_ladspa_browser * @short_description: A composite to select ladspa effect. * @title: AgsLadspaBrowser * @section_id: * @include: ags/X/ags_ladspa_browser.h * * #AgsLadspaBrowser is a composite widget to select ladspa plugin and the desired * effect. */ GType ags_ladspa_browser_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ladspa_browser = 0; static const GTypeInfo ags_ladspa_browser_info = { sizeof (AgsLadspaBrowserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ladspa_browser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLadspaBrowser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ladspa_browser_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ladspa_browser_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_ladspa_browser_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ladspa_browser = g_type_register_static(GTK_TYPE_VBOX, "AgsLadspaBrowser", &ags_ladspa_browser_info, 0); g_type_add_interface_static(ags_type_ladspa_browser, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_ladspa_browser, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ladspa_browser); } return g_define_type_id__volatile; } void ags_ladspa_browser_class_init(AgsLadspaBrowserClass *ladspa_browser) { /* empty */ } void ags_ladspa_browser_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ladspa_browser_connect; connectable->disconnect = ags_ladspa_browser_disconnect; } void ags_ladspa_browser_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_ladspa_browser_set_update; applicable->apply = ags_ladspa_browser_apply; applicable->reset = ags_ladspa_browser_reset; } void ags_ladspa_browser_init(AgsLadspaBrowser *ladspa_browser) { GtkTable *table; GtkLabel *label; GList *start_list, *list; gchar **filenames, **filenames_start; /* plugin */ ladspa_browser->plugin = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ladspa_browser), GTK_WIDGET(ladspa_browser->plugin), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("filename: ")); gtk_box_pack_start(GTK_BOX(ladspa_browser->plugin), GTK_WIDGET(label), FALSE, FALSE, 0); ladspa_browser->filename = (GtkComboBox *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(ladspa_browser->plugin), GTK_WIDGET(ladspa_browser->filename), FALSE, FALSE, 0); ladspa_browser->path = NULL; filenames = filenames_start = ags_ladspa_manager_get_filenames(ags_ladspa_manager_get_instance()); if(filenames_start != NULL){ list = NULL; while(filenames[0] != NULL){ list = g_list_prepend(list, filenames[0]); filenames++; } list = start_list = g_list_sort(list, g_strcmp0); while(list != NULL){ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(ladspa_browser->filename), list->data); list = list->next; } g_list_free(start_list); g_strfreev(filenames_start); } label = (GtkLabel *) gtk_label_new(i18n("effect: ")); gtk_box_pack_start(GTK_BOX(ladspa_browser->plugin), GTK_WIDGET(label), FALSE, FALSE, 0); ladspa_browser->effect = (GtkComboBox *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(ladspa_browser->plugin), GTK_WIDGET(ladspa_browser->effect), FALSE, FALSE, 0); /* description */ ladspa_browser->description = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(ladspa_browser), GTK_WIDGET(ladspa_browser->description), FALSE, FALSE, 0); ladspa_browser->label = label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Label: "), NULL); gtk_box_pack_start(GTK_BOX(ladspa_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); ladspa_browser->maker = label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Maker: "), NULL); gtk_box_pack_start(GTK_BOX(ladspa_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); ladspa_browser->copyright = label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Copyright: "), NULL); gtk_box_pack_start(GTK_BOX(ladspa_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Ports: "), NULL); gtk_box_pack_start(GTK_BOX(ladspa_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); ladspa_browser->port_table = table = (GtkTable *) gtk_table_new(256, 2, FALSE); gtk_box_pack_start(GTK_BOX(ladspa_browser->description), GTK_WIDGET(table), FALSE, FALSE, 0); ladspa_browser->preview = NULL; } void ags_ladspa_browser_connect(AgsConnectable *connectable) { AgsLadspaBrowser *ladspa_browser; ladspa_browser = AGS_LADSPA_BROWSER(connectable); if((AGS_LADSPA_BROWSER_CONNECTED & (ladspa_browser->flags)) != 0){ return; } ladspa_browser->flags |= AGS_LADSPA_BROWSER_CONNECTED; g_signal_connect_after(G_OBJECT(ladspa_browser->filename), "changed", G_CALLBACK(ags_ladspa_browser_plugin_filename_callback), ladspa_browser); g_signal_connect_after(G_OBJECT(ladspa_browser->effect), "changed", G_CALLBACK(ags_ladspa_browser_plugin_effect_callback), ladspa_browser); } void ags_ladspa_browser_disconnect(AgsConnectable *connectable) { AgsLadspaBrowser *ladspa_browser; ladspa_browser = AGS_LADSPA_BROWSER(connectable); if((AGS_LADSPA_BROWSER_CONNECTED & (ladspa_browser->flags)) == 0){ return; } ladspa_browser->flags &= (~AGS_LADSPA_BROWSER_CONNECTED); g_object_disconnect(G_OBJECT(ladspa_browser->filename), "any_signal::changed", G_CALLBACK(ags_ladspa_browser_plugin_filename_callback), ladspa_browser, NULL); g_object_disconnect(G_OBJECT(ladspa_browser->effect), "any_signal::changed", G_CALLBACK(ags_ladspa_browser_plugin_effect_callback), ladspa_browser, NULL); } void ags_ladspa_browser_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_ladspa_browser_apply(AgsApplicable *applicable) { /* empty */ } void ags_ladspa_browser_reset(AgsApplicable *applicable) { AgsLadspaBrowser *ladspa_browser; GtkComboBoxText *filename; GList *list; ladspa_browser = AGS_LADSPA_BROWSER(applicable); list = gtk_container_get_children(GTK_CONTAINER(ladspa_browser->plugin)); filename = GTK_COMBO_BOX_TEXT(list->next->data); g_list_free(list); gtk_combo_box_set_active((GtkComboBox *) filename, 0); } /** * ags_ladspa_browser_get_plugin_filename: * @ladspa_browser: the #AgsLadspaBrowser * * Retrieve selected ladspa plugin filename. * * Returns: the active ladspa filename * * Since: 3.0.0 */ gchar* ags_ladspa_browser_get_plugin_filename(AgsLadspaBrowser *ladspa_browser) { if(!AGS_IS_LADSPA_BROWSER(ladspa_browser)){ return(NULL); } return(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(ladspa_browser->filename))); } /** * ags_ladspa_browser_get_plugin_effect: * @ladspa_browser: the #AgsLadspaBrowser * * Retrieve selected ladspa effect. * * Returns: the active ladspa effect * * Since: 3.0.0 */ gchar* ags_ladspa_browser_get_plugin_effect(AgsLadspaBrowser *ladspa_browser) { if(!AGS_IS_LADSPA_BROWSER(ladspa_browser)){ return(NULL); } return(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(ladspa_browser->effect))); } /** * ags_ladspa_browser_combo_box_output_boolean_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_ladspa_browser_combo_box_output_boolean_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "led"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } /** * ags_ladspa_browser_combo_box_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_ladspa_browser_combo_box_output_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "vertical indicator"); gtk_combo_box_text_append_text(combo_box, "horizontal indicator"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } /** * ags_ladspa_browser_combo_box_boolean_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_ladspa_browser_combo_box_boolean_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "check-button"); gtk_combo_box_text_append_text(combo_box, "toggle button"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } /** * ags_ladspa_browser_combo_box_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_ladspa_browser_combo_box_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "spin button"); gtk_combo_box_text_append_text(combo_box, "dial"); gtk_combo_box_text_append_text(combo_box, "vertical scale"); gtk_combo_box_text_append_text(combo_box, "horizontal scale"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } GtkWidget* ags_ladspa_browser_preview_new() { GtkWidget *preview; preview = NULL; //TODO:JK: implement me return(preview); } /** * ags_ladspa_browser_new: * * Create a new instance of #AgsLadspaBrowser * * Returns: the new #AgsLadspaBrowser * * Since: 3.0.0 */ AgsLadspaBrowser* ags_ladspa_browser_new() { AgsLadspaBrowser *ladspa_browser; ladspa_browser = (AgsLadspaBrowser *) g_object_new(AGS_TYPE_LADSPA_BROWSER, "homogeneous", FALSE, "spacing", 0, NULL); return(ladspa_browser); } gsequencer-3.1.3/ags/X/ags_context_menu.c0000644000175000017500000004445713607210263015305 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_context_menu_class_init(AgsContextMenuClass *context_menu); void ags_context_menu_connectable_interface_init(AgsConnectableInterface *connectable); void ags_context_menu_init(AgsContextMenu *context_menu); void ags_context_menu_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_context_menu_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_context_menu_connect(AgsConnectable *connectable); void ags_context_menu_disconnect(AgsConnectable *connectable); /** * SECTION:ags_context_menu * @short_description: the context menu * @title: AgsContextMenu * @section_id: * @include: ags/X/ags_context_menu.h * * #AgsContextMenu is a composite widget to be used as application's context menu. */ GType ags_context_menu_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_context_menu = 0; static const GTypeInfo ags_context_menu_info = { sizeof (AgsContextMenuClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_context_menu_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsContextMenu), 0, /* n_preallocs */ (GInstanceInitFunc) ags_context_menu_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_context_menu_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_context_menu = g_type_register_static(GTK_TYPE_MENU, "AgsContextMenu", &ags_context_menu_info, 0); g_type_add_interface_static(ags_type_context_menu, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_context_menu); } return g_define_type_id__volatile; } void ags_context_menu_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_context_menu_connect; connectable->disconnect = ags_context_menu_disconnect; } void ags_context_menu_class_init(AgsContextMenuClass *context_menu) { } void ags_context_menu_init(AgsContextMenu *context_menu) { GtkMenuItem *item; context_menu->flags = 0; item = (GtkImageMenuItem *) gtk_tearoff_menu_item_new(); gtk_menu_shell_append((GtkMenuShell*) context_menu, (GtkWidget*) item); /* File */ item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_File")); gtk_menu_shell_append((GtkMenuShell*) context_menu, (GtkWidget*) item); context_menu->file = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) context_menu->file); item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Open")); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Save")); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Save as")); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) item); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export")); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) item); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Quit")); gtk_menu_shell_append((GtkMenuShell*) context_menu->file, (GtkWidget*) item); /* Edit */ item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Edit")); gtk_menu_shell_append((GtkMenuShell*) context_menu, (GtkWidget*) item); context_menu->edit = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) context_menu->edit); // item = (GtkMenuItem *) gtk_menu_item_new_with_label(GTK_STOCK_UNDO); // gtk_menu_shell_append((GtkMenuShell*) menu, (GtkWidget*) item); // item = (GtkMenuItem *) gtk_menu_item_new_with_label(GTK_STOCK_REDO); // gtk_menu_shell_append((GtkMenuShell*) menu, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Add")); gtk_menu_shell_append((GtkMenuShell*) context_menu->edit, (GtkWidget*) item); context_menu->add = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) context_menu->add); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Panel")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Mixer")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Spectrometer")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Equalizer")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Drum")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Matrix")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Synth")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FM Synth")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Syncsynth")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FM Syncsynth")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); #ifdef AGS_WITH_LIBINSTPATCH item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FPlayer")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); #endif item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Sampler")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Audiorec")); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); /* automation */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Automation")); // gtk_widget_set_sensitive(item, // FALSE); gtk_menu_shell_append((GtkMenuShell*) context_menu->edit, (GtkWidget*) item); /* wave */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Wave")); // gtk_widget_set_sensitive(item, // FALSE); gtk_menu_shell_append((GtkMenuShell*) context_menu->edit, (GtkWidget*) item); /* preferences */ gtk_menu_shell_append((GtkMenuShell*) context_menu->edit, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Preferences")); gtk_menu_shell_append((GtkMenuShell*) context_menu->edit, (GtkWidget*) item); /* MIDI */ item = (GtkMenuItem *) gtk_menu_item_new_with_label("MIDI"); gtk_menu_shell_append((GtkMenuShell*) context_menu, (GtkWidget*) item); context_menu->midi = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) context_menu->midi); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("import")); gtk_menu_shell_append((GtkMenuShell*) context_menu->midi, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export track")); gtk_menu_shell_append((GtkMenuShell*) context_menu->midi, (GtkWidget*) item); gtk_menu_shell_append((GtkMenuShell*) context_menu->midi, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("playback")); gtk_widget_set_sensitive((GtkWidget *) item, FALSE); gtk_menu_shell_append((GtkMenuShell*) context_menu->midi, (GtkWidget*) item); /* Help */ item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Help")); gtk_menu_shell_append((GtkMenuShell*) context_menu, (GtkWidget*) item); context_menu->help = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) context_menu->help); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Online help")); gtk_menu_shell_append((GtkMenuShell*) context_menu->help, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("About")); gtk_menu_shell_append((GtkMenuShell*) context_menu->help, (GtkWidget*) item); } void ags_context_menu_connect(AgsConnectable *connectable) { AgsContextMenu *context_menu; GList *list0, *list1, *list2, *list3, *list4; GList *list0_start, *list1_start, *list2_start, *list3_start, *list4_start; context_menu = AGS_CONTEXT_MENU(connectable); if((AGS_CONTEXT_MENU_CONNECTED & (context_menu->flags)) != 0){ return; } context_menu->flags |= AGS_CONTEXT_MENU_CONNECTED; /* File */ list0 = list0_start = gtk_container_get_children(context_menu); list0 = list0->next; list1_start = list1 = gtk_container_get_children ((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_open_callback), (gpointer) context_menu); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_save_callback), (gpointer) context_menu); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_save_as_callback), context_menu); list1 = list1->next->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_export_callback), context_menu); list1 = list1->next->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_quit_callback), (gpointer) context_menu); g_list_free(list1_start); /* Edit */ list0 = list0->next; list1_start = list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_add_callback), (gpointer) context_menu); list2_start = list2 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list1->data)); list1 = list1->next; /* machines */ g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_panel_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_mixer_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_spectrometer_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_equalizer_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_drum_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_matrix_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_synth_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_fm_synth_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_syncsynth_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_fm_syncsynth_callback), (gpointer) context_menu); list2 = list2->next; #ifdef AGS_WITH_LIBINSTPATCH g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_ffplayer_callback), (gpointer) context_menu); list2 = list2->next; #endif g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_pitch_sampler_callback), (gpointer) context_menu); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_audiorec_callback), (gpointer) context_menu); list2 = list2->next; /* ladspa */ list3_start = list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); list2 = list2->next; while(list3 != NULL){ g_signal_connect(G_OBJECT(list3->data), "activate", G_CALLBACK(ags_menu_action_add_ladspa_bridge_callback), (gpointer) context_menu); list3 = list3->next; } g_list_free(list3_start); /* dssi */ list3_start = list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); list2 = list2->next; while(list3 != NULL){ g_signal_connect(G_OBJECT(list3->data), "activate", G_CALLBACK(ags_menu_action_add_dssi_bridge_callback), (gpointer) context_menu); list3 = list3->next; } g_list_free(list3_start); /* lv2 */ list3_start = list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); list2 = list2->next; while(list3 != NULL){ g_signal_connect(G_OBJECT(list3->data), "activate", G_CALLBACK(ags_menu_action_add_lv2_bridge_callback), (gpointer) context_menu); list3 = list3->next; } g_list_free(list3_start); /* live! */ list3 = list3_start = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); /* dssi */ list4_start = list4 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list3->data)); list3 = list3->next; while(list4 != NULL){ g_signal_connect(G_OBJECT(list4->data), "activate", G_CALLBACK(ags_menu_action_add_live_dssi_bridge_callback), (gpointer) context_menu); list4 = list4->next; } g_list_free(list4_start); /* lv2 */ list4_start = list4 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list3->data)); // list3 = list3->next; while(list4 != NULL){ g_signal_connect(G_OBJECT(list4->data), "activate", G_CALLBACK(ags_menu_action_add_live_lv2_bridge_callback), (gpointer) context_menu); list4 = list4->next; } g_list_free(list4_start); g_list_free(list3_start); g_list_free(list2_start); /* automation, wave and preferences */ g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_automation_callback), (gpointer) context_menu); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_wave_callback), (gpointer) context_menu); list1 = list1->next; list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_preferences_callback), (gpointer) context_menu); g_list_free(list1_start); /* MIDI */ list0 = list0->next; list1_start = list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT(list1->data), "activate", G_CALLBACK(ags_menu_action_midi_import_callback), (gpointer) context_menu); list1 = list1->next; g_signal_connect(G_OBJECT(list1->data), "activate", G_CALLBACK(ags_menu_action_midi_export_track_callback), (gpointer) context_menu); list1 = list1->next; list1 = list1->next; g_signal_connect(G_OBJECT(list1->data), "activate", G_CALLBACK(ags_menu_action_midi_playback_callback), (gpointer) context_menu); g_list_free(list1_start); /* Help */ list0 = list0->next; list1_start = list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_online_help_callback), (gpointer) context_menu); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_about_callback), (gpointer) context_menu); g_list_free(list1_start); g_list_free(list0_start); } void ags_context_menu_disconnect(AgsConnectable *connectable) { AgsContextMenu *context_menu; context_menu = AGS_CONTEXT_MENU(connectable); if((AGS_CONTEXT_MENU_CONNECTED & (context_menu->flags)) == 0){ return; } context_menu->flags &= (~AGS_CONTEXT_MENU_CONNECTED); /* empty */ } /** * ags_context_menu_new: * * Creates an #AgsContextMenu * * Returns: a new #AgsContextMenu * * Since: 3.0.0 */ AgsContextMenu* ags_context_menu_new() { AgsContextMenu *context_menu; context_menu = (AgsContextMenu *) g_object_new(AGS_TYPE_CONTEXT_MENU, NULL); return(context_menu); } gsequencer-3.1.3/ags/X/ags_connection_editor_callbacks.h0000644000175000017500000000303213607210263020266 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONNECTION_EDITOR_CALLBACKS_H__ #define __AGS_CONNECTION_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS int ags_connection_editor_apply_callback(GtkWidget *widget, AgsConnectionEditor *connection_editor); int ags_connection_editor_ok_callback(GtkWidget *widget, AgsConnectionEditor *connection_editor); int ags_connection_editor_cancel_callback(GtkWidget *widget, AgsConnectionEditor *connection_editor); gboolean ags_connection_editor_delete_event(GtkWidget *dialog, gint response, AgsConnectionEditor *connection_editor); G_END_DECLS #endif /*__AGS_CONNECTION_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_effect_pad.c0000644000175000017500000005527013607210263014650 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_effect_pad_class_init(AgsEffectPadClass *effect_pad); void ags_effect_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_effect_pad_init(AgsEffectPad *effect_pad); void ags_effect_pad_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_effect_pad_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_effect_pad_connect(AgsConnectable *connectable); void ags_effect_pad_disconnect(AgsConnectable *connectable); void ags_effect_pad_real_resize_lines(AgsEffectPad *effect_pad, GType line_type, guint audio_channels, guint audio_channels_old); void ags_effect_pad_real_map_recall(AgsEffectPad *effect_pad); GList* ags_effect_pad_real_find_port(AgsEffectPad *effect_pad); /** * SECTION:ags_effect_pad * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsEffectPad * @section_id: * @include: ags/X/ags_effect_pad.h * * #AgsEffectPad is a composite widget to visualize a bunch of #AgsChannel. It should be * packed by an #AgsEffectBridge. */ enum{ SAMPLERATE_CHANGED, BUFFER_SIZE_CHANGED, FORMAT_CHANGED, SET_CHANNEL, RESIZE_LINES, MAP_RECALL, FIND_PORT, LAST_SIGNAL, }; enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_CHANNEL, }; static gpointer ags_effect_pad_parent_class = NULL; static guint effect_pad_signals[LAST_SIGNAL]; GType ags_effect_pad_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_effect_pad = 0; static const GTypeInfo ags_effect_pad_info = { sizeof(AgsEffectPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_effect_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEffectPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_effect_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_effect_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_effect_pad = g_type_register_static(GTK_TYPE_VBOX, "AgsEffectPad", &ags_effect_pad_info, 0); g_type_add_interface_static(ags_type_effect_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_effect_pad); } return g_define_type_id__volatile; } void ags_effect_pad_class_init(AgsEffectPadClass *effect_pad) { GObjectClass *gobject; GParamSpec *param_spec; ags_effect_pad_parent_class = g_type_class_peek_parent(effect_pad); /* GObjectClass */ gobject = G_OBJECT_CLASS(effect_pad); gobject->set_property = ags_effect_pad_set_property; gobject->get_property = ags_effect_pad_get_property; /* properties */ /** * AgsEffectPad:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsEffectPad:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsEffectPad:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsEffectPad:channel: * * The start of a bunch of #AgsChannel to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /* AgsEffectPadClass */ effect_pad->samplerate_changed = NULL; effect_pad->buffer_size_changed = NULL; effect_pad->format_changed = NULL; effect_pad->resize_lines = ags_effect_pad_real_resize_lines; effect_pad->map_recall = ags_effect_pad_real_map_recall; effect_pad->find_port = ags_effect_pad_real_find_port; /* signals */ /** * AgsEffectPad::samplerate-changed: * @effect_pad: the #AgsEffectPad * @samplerate: the samplerate * @old_samplerate: the old samplerate * * The ::samplerate-changed signal notifies about changed samplerate. * * Since: 3.0.0 */ effect_pad_signals[SAMPLERATE_CHANGED] = g_signal_new("samplerate-changed", G_TYPE_FROM_CLASS(effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectPadClass, samplerate_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectPad::buffer-size-changed: * @effect_pad: the #AgsEffectPad * @buffer_size: the buffer size * @old_buffer_size: the old buffer size * * The ::buffer-size-changed signal notifies about changed buffer size. * * Since: 3.0.0 */ effect_pad_signals[BUFFER_SIZE_CHANGED] = g_signal_new("buffer-size-changed", G_TYPE_FROM_CLASS(effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectPadClass, buffer_size_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectPad::format-changed: * @effect_pad: the #AgsEffectPad * @format: the format * @old_format: the old format * * The ::format-changed signal notifies about changed format. * * Since: 3.0.0 */ effect_pad_signals[FORMAT_CHANGED] = g_signal_new("format-changed", G_TYPE_FROM_CLASS(effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectPadClass, format_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectPad::set-channel: * @effect_pad: the #AgsEffectPad to modify * @channel: the #AgsChannel to set * * The ::set-channel signal notifies about changed channel. * * Since: 3.0.0 */ effect_pad_signals[SET_CHANNEL] = g_signal_new("set-channel", G_TYPE_FROM_CLASS(effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectPadClass, set_channel), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsPad::resize-lines: * @effect_pad: the #AgsEffectPad to resize * @line_type: the channel type * @audio_channels: count of lines * @audio_channels_old: old count of lines * * The ::resize-lines is emitted as count of lines pack is modified. * * Since: 3.0.0 */ effect_pad_signals[RESIZE_LINES] = g_signal_new("resize-lines", G_TYPE_FROM_CLASS(effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectPadClass, resize_lines), NULL, NULL, ags_cclosure_marshal_VOID__ULONG_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_ULONG, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectPad::map-recall: * @effect_pad: the #AgsEffectPad * * The ::map-recall should be used to add the effect_pad's default recall. * * Since: 3.0.0 */ effect_pad_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS (effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsEffectPadClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsEffectPad::find-port: * @effect_pad: the #AgsEffectPad to resize * * The ::find-port as recall should be mapped * * Returns: a #GList-struct with associated ports * * Since: 3.0.0 */ effect_pad_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(effect_pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectPadClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); } void ags_effect_pad_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_effect_pad_connect; connectable->disconnect = ags_effect_pad_disconnect; } void ags_effect_pad_init(AgsEffectPad *effect_pad) { AgsConfig *config; effect_pad->flags = 0; effect_pad->name = NULL; effect_pad->version = AGS_EFFECT_PAD_DEFAULT_VERSION; effect_pad->build_id = AGS_EFFECT_PAD_DEFAULT_BUILD_ID; config = ags_config_get_instance(); effect_pad->samplerate = ags_soundcard_helper_config_get_samplerate(config); effect_pad->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); effect_pad->format = ags_soundcard_helper_config_get_format(config); effect_pad->channel = NULL; effect_pad->cols = AGS_EFFECT_PAD_COLUMNS_COUNT; effect_pad->table = (GtkTable *) gtk_table_new(1, AGS_EFFECT_PAD_COLUMNS_COUNT, TRUE); gtk_box_pack_start(GTK_BOX(effect_pad), GTK_WIDGET(effect_pad->table), FALSE, TRUE, 0); } void ags_effect_pad_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEffectPad *effect_pad; effect_pad = AGS_EFFECT_PAD(gobject); switch(prop_id){ case PROP_SAMPLERATE: { GList *start_list, *list; guint samplerate, old_samplerate; samplerate = g_value_get_uint(value); old_samplerate = effect_pad->samplerate; if(samplerate == old_samplerate){ return; } effect_pad->samplerate = samplerate; ags_effect_pad_samplerate_changed(effect_pad, samplerate, old_samplerate); list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_pad->table)); while(list != NULL){ if(AGS_IS_EFFECT_LINE(list->data)){ g_object_set(list->data, "samplerate", samplerate, NULL); } list = list->next; } g_list_free(start_list); } break; case PROP_BUFFER_SIZE: { GList *start_list, *list; guint buffer_size, old_buffer_size; buffer_size = g_value_get_uint(value); old_buffer_size = effect_pad->buffer_size; if(buffer_size == old_buffer_size){ return; } effect_pad->buffer_size = buffer_size; ags_effect_pad_buffer_size_changed(effect_pad, buffer_size, old_buffer_size); list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_pad->table)); while(list != NULL){ if(AGS_IS_EFFECT_LINE(list->data)){ g_object_set(list->data, "buffer-size", buffer_size, NULL); } list = list->next; } g_list_free(start_list); } break; case PROP_FORMAT: { GList *start_list, *list; guint format, old_format; format = g_value_get_uint(value); old_format = effect_pad->format; if(format == old_format){ return; } effect_pad->format = format; ags_effect_pad_format_changed(effect_pad, format, old_format); list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_pad->table)); while(list != NULL){ if(AGS_IS_EFFECT_LINE(list->data)){ g_object_set(list->data, "format", format, NULL); } list = list->next; } g_list_free(start_list); } break; case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); ags_effect_pad_set_channel(effect_pad, channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_pad_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEffectPad *effect_pad; effect_pad = AGS_EFFECT_PAD(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, effect_pad->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, effect_pad->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, effect_pad->format); } break; case PROP_CHANNEL: { g_value_set_object(value, effect_pad->channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_pad_connect(AgsConnectable *connectable) { AgsEffectPad *effect_pad; GList *effect_line_list, *effect_line_list_start; /* AgsEffect_Pad */ effect_pad = AGS_EFFECT_PAD(connectable); if((AGS_EFFECT_PAD_CONNECTED & (effect_pad->flags)) != 0){ return; } effect_pad->flags |= AGS_EFFECT_PAD_CONNECTED; if((AGS_EFFECT_PAD_PREMAPPED_RECALL & (effect_pad->flags)) == 0){ if((AGS_EFFECT_PAD_MAPPED_RECALL & (effect_pad->flags)) == 0){ //TODO:JK: implement me } }else{ effect_pad->flags &= (~AGS_EFFECT_PAD_PREMAPPED_RECALL); } /* AgsEffectLine */ effect_line_list_start = effect_line_list = gtk_container_get_children(GTK_CONTAINER(effect_pad->table)); while(effect_line_list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(effect_line_list->data)); effect_line_list = effect_line_list->next; } g_list_free(effect_line_list_start); } void ags_effect_pad_disconnect(AgsConnectable *connectable) { AgsEffectPad *effect_pad; GList *effect_line_list, *effect_line_list_start; /* AgsEffect_Pad */ effect_pad = AGS_EFFECT_PAD(connectable); if((AGS_EFFECT_PAD_CONNECTED & (effect_pad->flags)) == 0){ return; } effect_pad->flags &= (~AGS_EFFECT_PAD_CONNECTED); /* AgsEffectLine */ effect_line_list_start = effect_line_list = gtk_container_get_children(GTK_CONTAINER(effect_pad->table)); while(effect_line_list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(effect_line_list->data)); effect_line_list = effect_line_list->next; } g_list_free(effect_line_list_start); } /** * ags_effect_pad_samplerate_changed: * @effect_pad: the #AgsEffectPad * @samplerate: the samplerate * @old_samplerate: the old samplerate * * Notify about samplerate changed. * * Since: 3.0.0 */ void ags_effect_pad_samplerate_changed(AgsEffectPad *effect_pad, guint samplerate, guint old_samplerate) { g_return_if_fail(AGS_IS_EFFECT_PAD(effect_pad)); g_object_ref((GObject *) effect_pad); g_signal_emit(G_OBJECT(effect_pad), effect_pad_signals[SAMPLERATE_CHANGED], 0, samplerate, old_samplerate); g_object_unref((GObject *) effect_pad); } /** * ags_effect_pad_buffer_size_changed: * @effect_pad: the #AgsEffectPad * @buffer_size: the buffer_size * @old_buffer_size: the old buffer_size * * Notify about buffer_size changed. * * Since: 3.0.0 */ void ags_effect_pad_buffer_size_changed(AgsEffectPad *effect_pad, guint buffer_size, guint old_buffer_size) { g_return_if_fail(AGS_IS_EFFECT_PAD(effect_pad)); g_object_ref((GObject *) effect_pad); g_signal_emit(G_OBJECT(effect_pad), effect_pad_signals[BUFFER_SIZE_CHANGED], 0, buffer_size, old_buffer_size); g_object_unref((GObject *) effect_pad); } /** * ags_effect_pad_format_changed: * @effect_pad: the #AgsEffectPad * @format: the format * @old_format: the old format * * Notify about format changed. * * Since: 3.0.0 */ void ags_effect_pad_format_changed(AgsEffectPad *effect_pad, guint format, guint old_format) { g_return_if_fail(AGS_IS_EFFECT_PAD(effect_pad)); g_object_ref((GObject *) effect_pad); g_signal_emit(G_OBJECT(effect_pad), effect_pad_signals[FORMAT_CHANGED], 0, format, old_format); g_object_unref((GObject *) effect_pad); } void ags_effect_pad_real_set_channel(AgsEffectPad *effect_pad, AgsChannel *channel) { GList *start_effect_line, *effect_line; gchar *str; if(effect_pad->channel == channel){ return; } if(effect_pad->channel != NULL){ g_object_unref(G_OBJECT(effect_pad->channel)); } if(channel != NULL){ g_object_ref(G_OBJECT(channel)); } if(effect_pad->channel != NULL){ effect_pad->flags &= (~AGS_EFFECT_PAD_PREMAPPED_RECALL); } if(channel != NULL){ effect_pad->samplerate = channel->samplerate; effect_pad->buffer_size = channel->buffer_size; effect_pad->format = channel->format; } effect_pad->channel = channel; start_effect_line = effect_line = gtk_container_get_children((GtkContainer *) effect_pad->table); while(effect_line != NULL){ g_object_set(G_OBJECT(effect_line->data), "channel", channel, NULL); effect_line = effect_line->next; } g_list_free(start_effect_line); } /** * ags_effect_pad_set_channel: * @effect_pad: the #AgsEffectPad * @channel: the #AgsChannel to set * * Is emitted as channel gets modified. * * Since: 3.0.0 */ void ags_effect_pad_set_channel(AgsEffectPad *effect_pad, AgsChannel *channel) { g_return_if_fail(AGS_IS_EFFECT_PAD(effect_pad)); g_object_ref((GObject *) effect_pad); g_signal_emit(G_OBJECT(effect_pad), effect_pad_signals[SET_CHANNEL], 0, channel); g_object_unref((GObject *) effect_pad); } void ags_effect_pad_real_resize_lines(AgsEffectPad *effect_pad, GType effect_line_type, guint audio_channels, guint audio_channels_old) { AgsEffectLine *effect_line; AgsChannel *channel, *next_channel, *nth_channel; GList *start_list, *list; guint i, j; if(audio_channels > audio_channels_old){ nth_channel = ags_channel_nth(effect_pad->channel, audio_channels_old); if(nth_channel == NULL){ return; } channel = nth_channel; next_channel = NULL; for(i = audio_channels_old; i < audio_channels;){ for(j = audio_channels_old % effect_pad->cols; j < effect_pad->cols && i < audio_channels; j++, i++){ effect_line = (AgsEffectLine *) g_object_new(effect_line_type, "channel", channel, NULL); gtk_table_attach(effect_pad->table, (GtkWidget *) effect_line, j, j + 1, i / effect_pad->cols, i / effect_pad->cols + 1, FALSE, FALSE, 0, 0); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ start_list = gtk_container_get_children((GtkContainer *) effect_pad->table); list = g_list_nth(start_list, audio_channels); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(start_list); } } /** * ags_effect_pad_resize_lines: * @effect_pad: the #AgsEffectPad to resize * @line_type: channel type, either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * @audio_channels: count of lines * @audio_channels_old: old count of lines * * Resize the count of #AgsEffectLine packe by #AgsEffectPad. * * Since: 3.0.0 */ void ags_effect_pad_resize_lines(AgsEffectPad *effect_pad, GType line_type, guint audio_channels, guint audio_channels_old) { g_return_if_fail(AGS_IS_EFFECT_PAD(effect_pad)); g_object_ref((GObject *) effect_pad); g_signal_emit(G_OBJECT(effect_pad), effect_pad_signals[RESIZE_LINES], 0, line_type, audio_channels, audio_channels_old); g_object_unref((GObject *) effect_pad); } void ags_effect_pad_real_map_recall(AgsEffectPad *effect_pad) { if((AGS_EFFECT_PAD_MAPPED_RECALL & (effect_pad->flags)) != 0){ return; } effect_pad->flags |= AGS_EFFECT_PAD_MAPPED_RECALL; ags_effect_pad_find_port(effect_pad); } /** * ags_effect_pad_map_recall: * @effect_pad: the #AgsEffectPad to add its default recall. * * You may want the @effect_pad to add its default recall. * * Since: 3.0.0 */ void ags_effect_pad_map_recall(AgsEffectPad *effect_pad) { g_return_if_fail(AGS_IS_EFFECT_PAD(effect_pad)); g_object_ref((GObject *) effect_pad); g_signal_emit((GObject *) effect_pad, effect_pad_signals[MAP_RECALL], 0); g_object_unref((GObject *) effect_pad); } GList* ags_effect_pad_real_find_port(AgsEffectPad *effect_pad) { GList *effect_line, *effect_line_start; GList *port, *tmp_port; port = NULL; /* find output ports */ if(effect_pad->table != NULL){ effect_line_start = effect_line = gtk_container_get_children((GtkContainer *) effect_pad->table); while(effect_line != NULL){ tmp_port = ags_effect_line_find_port(AGS_EFFECT_LINE(effect_line->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } effect_line = effect_line->next; } g_list_free(effect_line_start); } return(port); } /** * ags_effect_pad_find_port: * @effect_pad: the #AgsEffectPad * * Lookup ports of associated recalls. * * Returns: an #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ GList* ags_effect_pad_find_port(AgsEffectPad *effect_pad) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_EFFECT_PAD(effect_pad), NULL); g_object_ref((GObject *) effect_pad); g_signal_emit((GObject *) effect_pad, effect_pad_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) effect_pad); return(list); } /** * ags_effect_pad_new: * @channel: the #AgsChannel to visualize * * Create a new instance of #AgsEffectPad * * Returns: the new #AgsEffectPad * * Since: 3.0.0 */ AgsEffectPad* ags_effect_pad_new(AgsChannel *channel) { AgsEffectPad *effect_pad; effect_pad = (AgsEffectPad *) g_object_new(AGS_TYPE_EFFECT_PAD, "channel", channel, NULL); return(effect_pad); } gsequencer-3.1.3/ags/X/ags_link_collection_editor.h0000644000175000017500000000550013607210263017302 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINK_COLLECTION_EDITOR_H__ #define __AGS_LINK_COLLECTION_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINK_COLLECTION_EDITOR (ags_link_collection_editor_get_type()) #define AGS_LINK_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LINK_COLLECTION_EDITOR, AgsLinkCollectionEditor)) #define AGS_LINK_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LINK_COLLECTION_EDITOR, AgsLinkCollectionEditorClass)) #define AGS_IS_LINK_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LINK_COLLECTION_EDITOR)) #define AGS_IS_LINK_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LINK_COLLECTION_EDITOR)) #define AGS_LINK_COLLECTION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LINK_COLLECTION_EDITOR, AgsLinkCollectionEditorClass)) typedef struct _AgsLinkCollectionEditor AgsLinkCollectionEditor; typedef struct _AgsLinkCollectionEditorClass AgsLinkCollectionEditorClass; typedef enum{ AGS_LINK_COLLECTION_EDITOR_CONNECTED = 1, }AgsLinkCollectionEditorFlags; struct _AgsLinkCollectionEditor { GtkTable table; guint flags; GType channel_type; GtkComboBox *link; GtkSpinButton *first_line; GtkSpinButton *first_link; GtkSpinButton *count; }; struct _AgsLinkCollectionEditorClass { GtkTableClass table; }; GType ags_link_collection_editor_get_type(); void ags_link_collection_editor_check(AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_check_first_line(AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_check_first_link(AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_check_count(AgsLinkCollectionEditor *link_collection_editor); AgsLinkCollectionEditor* ags_link_collection_editor_new(GType channel_type); G_END_DECLS #endif /*__AGS_LINK_COLLECTION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_navigation_callbacks.c0000644000175000017500000004254413607210263016726 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_navigation_expander_callback(GtkWidget *widget, AgsNavigation *navigation) { GtkArrow *arrow; GList *list; guint arrow_type; list = gtk_container_get_children((GtkContainer *) widget); arrow = (GtkArrow *) list->data; g_list_free(list); list = gtk_container_get_children((GtkContainer *) navigation); widget = (GtkWidget *) list->next->data; g_list_free(list); g_object_get(arrow, "arrow-type", &arrow_type, NULL); if(arrow_type == GTK_ARROW_DOWN){ gtk_widget_hide(widget); g_object_set(arrow, "arrow-type", GTK_ARROW_RIGHT, NULL); }else{ gtk_widget_show_all(widget); g_object_set(arrow, "arrow-type", GTK_ARROW_DOWN, NULL); } } void ags_navigation_bpm_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsApplyBpm *apply_bpm; AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); /* get task thread */ apply_bpm = ags_apply_bpm_new(application_context, gtk_spin_button_get_value(navigation->bpm)); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) apply_bpm); } void ags_navigation_rewind_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsApplicationContext *application_context; GObject *default_soundcard; gdouble tact; application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); tact = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)) / 16.0; gtk_spin_button_set_value(navigation->position_tact, tact + (-1.0 * AGS_NAVIGATION_DEFAULT_TACT_STEP)); } void ags_navigation_prev_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsApplicationContext *application_context; GObject *default_soundcard; gdouble tact; application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); tact = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)) / 16.0; gtk_spin_button_set_value(navigation->position_tact, tact + (-1.0 * AGS_NAVIGATION_REWIND_STEPS)); } void ags_navigation_play_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsWindow *window; AgsMachine *machine; AgsApplicationContext *application_context; GObject *default_soundcard; GList *machines, *machines_start; gboolean initialized_time; if((AGS_NAVIGATION_BLOCK_PLAY & (navigation->flags)) != 0){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(navigation))); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); initialized_time = FALSE; while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to play!\n"); #endif if(!initialized_time){ initialized_time = TRUE; navigation->start_tact = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)); } ags_machine_set_run_extended(machine, TRUE, !gtk_toggle_button_get_active((GtkToggleButton *) navigation->exclude_sequencer), TRUE, FALSE, FALSE); }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to play!\n"); #endif if(!initialized_time){ initialized_time = TRUE; navigation->start_tact = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)); } ags_machine_set_run_extended(machine, TRUE, FALSE, FALSE, TRUE, FALSE); } machines = machines->next; } g_list_free(machines_start); } void ags_navigation_stop_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsWindow *window; AgsMachine *machine; AgsApplicationContext *application_context; GObject *default_soundcard; GList *machines,*machines_start; gchar *timestr; window = AGS_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(navigation))); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to stop!"); #endif ags_machine_set_run_extended(machine, FALSE, !gtk_toggle_button_get_active((GtkToggleButton *) navigation->exclude_sequencer), TRUE, FALSE, FALSE); }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to stop!"); #endif ags_machine_set_run_extended(machine, FALSE, FALSE, FALSE, TRUE, FALSE); } machines = machines->next; } g_list_free(machines_start); /* toggle play button */ navigation->flags |= AGS_NAVIGATION_BLOCK_PLAY; gtk_toggle_button_set_active(navigation->play, FALSE); navigation->flags &= (~AGS_NAVIGATION_BLOCK_PLAY); navigation->start_tact = 0.0; timestr = ags_time_get_uptime_from_offset(0.0, gtk_spin_button_get_value(navigation->bpm), ags_soundcard_get_delay(AGS_SOUNDCARD(default_soundcard)), ags_soundcard_get_delay_factor(AGS_SOUNDCARD(default_soundcard))); gtk_label_set_text(navigation->duration_time, timestr); g_free(timestr); ags_soundcard_set_note_offset(AGS_SOUNDCARD(default_soundcard), 0); } void ags_navigation_next_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsApplicationContext *application_context; GObject *default_soundcard; gdouble tact; application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); tact = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)) / 16.0; gtk_spin_button_set_value(navigation->position_tact, tact + AGS_NAVIGATION_REWIND_STEPS); } void ags_navigation_forward_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsApplicationContext *application_context; GObject *default_soundcard; gdouble tact; application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); tact = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)) / 16.0; gtk_spin_button_set_value(navigation->position_tact, tact + AGS_NAVIGATION_DEFAULT_TACT_STEP); } void ags_navigation_loop_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsWindow *window; AgsMachine *machine; AgsAudio *audio; AgsRecall *recall; AgsApplicationContext *application_context; GObject *default_soundcard; GList *machines, *machines_start; GList *list, *list_start; guint loop_left, loop_right; GValue do_loop_value = {0,}; window = AGS_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(navigation))); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); loop_left = 16 * gtk_spin_button_get_value(navigation->loop_left_tact); loop_right = 16 * gtk_spin_button_get_value(navigation->loop_right_tact); ags_soundcard_set_loop(AGS_SOUNDCARD(default_soundcard), loop_left, loop_right, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); g_value_init(&do_loop_value, G_TYPE_BOOLEAN); g_value_set_boolean(&do_loop_value, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to loop!\n"); #endif audio = machine->audio; /* do it so */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "notation-loop", &port, NULL); ags_port_safe_write(port, &do_loop_value); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to loop!\n"); #endif audio = machine->audio; /* do it so */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_PLAY_WAVE_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "wave-loop", &port, NULL); ags_port_safe_write(port, &do_loop_value); list = list->next; } list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_CAPTURE_WAVE_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "wave-loop", &port, NULL); ags_port_safe_write(port, &do_loop_value); list = list->next; } g_list_free_full(list_start, g_object_unref); } machines = machines->next; } g_list_free(machines_start); /* enable fader */ //TODO:JK: implement me } void ags_navigation_position_tact_callback(GtkWidget *widget, AgsNavigation *navigation) { ags_navigation_change_position(navigation, gtk_spin_button_get_value((GtkSpinButton *) widget)); } void ags_navigation_duration_tact_callback(GtkWidget *widget, AgsNavigation *navigation) { /* empty */ } void ags_navigation_loop_left_tact_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsWindow *window; AgsMachine *machine; AgsAudio *audio; AgsRecall *recall; AgsApplicationContext *application_context; GObject *default_soundcard; GList *machines, *machines_start; GList *list, *list_start; // find AgsPlayNotationAudio and AgsCopyPatternAudio guint loop_left, loop_right; GValue value = {0,}; window = AGS_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(navigation))); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); loop_left = 16 * gtk_spin_button_get_value(navigation->loop_left_tact); loop_right = 16 * gtk_spin_button_get_value(navigation->loop_right_tact); ags_soundcard_set_loop(AGS_SOUNDCARD(default_soundcard), loop_left, loop_right, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(navigation->loop))); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) loop_left); while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to loop!\n"); #endif audio = machine->audio; /* do it so */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "notation-loop-start", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to loop!\n"); #endif audio = machine->audio; /* do it so */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_PLAY_WAVE_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "wave-loop-start", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); list = list->next; } list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_CAPTURE_WAVE_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "wave-loop-start", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); list = list->next; } g_list_free_full(list_start, g_object_unref); } machines = machines->next; } g_list_free(machines_start); } void ags_navigation_loop_right_tact_callback(GtkWidget *widget, AgsNavigation *navigation) { AgsWindow *window; AgsMachine *machine; AgsAudio *audio; AgsRecall *recall; AgsApplicationContext *application_context; GObject *default_soundcard; GList *machines, *machines_start; GList *list, *list_start; // find AgsPlayNotationAudio and AgsCopyPatternAudio guint loop_left, loop_right; GValue value = {0,}; window = AGS_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(navigation))); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); loop_left = 16 * gtk_spin_button_get_value(navigation->loop_left_tact); loop_right = 16 * gtk_spin_button_get_value(navigation->loop_right_tact); ags_soundcard_set_loop(AGS_SOUNDCARD(default_soundcard), loop_left, loop_right, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(navigation->loop))); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) loop_right); while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to loop!\n"); #endif audio = machine->audio; /* do it so */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "notation-loop-end", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ #ifdef AGS_DEBUG g_message("found machine to loop!\n"); #endif audio = machine->audio; /* do it so */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_PLAY_WAVE_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "wave-loop-end", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); list = list->next; } list = list_start; while((list = ags_recall_find_type(list, AGS_TYPE_CAPTURE_WAVE_AUDIO)) != NULL){ AgsPort *port; recall = AGS_RECALL(list->data); g_object_get(recall, "wave-loop-end", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); list = list->next; } g_list_free_full(list_start, g_object_unref); } machines = machines->next; } g_list_free(machines_start); } void ags_navigation_soundcard_stop_callback(GObject *soundcard, AgsNavigation *navigation) { navigation->flags |= AGS_NAVIGATION_BLOCK_TIC; } gsequencer-3.1.3/ags/X/task/0000755000175000017500000000000013622252261012604 500000000000000gsequencer-3.1.3/ags/X/task/ags_simple_file_write.c0000644000175000017500000001173713607210263017234 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_simple_file_write_class_init(AgsSimpleFileWriteClass *simple_file_write); void ags_simple_file_write_connectable_interface_init(AgsConnectableInterface *connectable); void ags_simple_file_write_init(AgsSimpleFileWrite *simple_file_write); void ags_simple_file_write_connect(AgsConnectable *connectable); void ags_simple_file_write_disconnect(AgsConnectable *connectable); void ags_simple_file_write_finalize(GObject *gobject); void ags_simple_file_write_launch(AgsTask *task); /** * SECTION:ags_simple_file_write * @short_description: task to write simple file format * @title: AgsSimpleFileWrite * @section_id: * @include: ags/X/task/ags_simple_file_write.h * * #AgsSimpleFileWrite lets you write the simple file format as a task. */ static gpointer ags_simple_file_write_parent_class = NULL; static AgsConnectableInterface *ags_simple_file_write_parent_connectable_interface; GType ags_simple_file_write_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_simple_file_write = 0; static const GTypeInfo ags_simple_file_write_info = { sizeof (AgsSimpleFileWriteClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_simple_file_write_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSimpleFileWrite), 0, /* n_preallocs */ (GInstanceInitFunc) ags_simple_file_write_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_simple_file_write_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_simple_file_write = g_type_register_static(AGS_TYPE_TASK, "AgsSimpleFileWrite", &ags_simple_file_write_info, 0); g_type_add_interface_static(ags_type_simple_file_write, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_simple_file_write); } return g_define_type_id__volatile; } void ags_simple_file_write_class_init(AgsSimpleFileWriteClass *simple_file_write) { GObjectClass *gobject; AgsTaskClass *task; ags_simple_file_write_parent_class = g_type_class_peek_parent(simple_file_write); /* gobject */ gobject = (GObjectClass *) simple_file_write; gobject->finalize = ags_simple_file_write_finalize; /* task */ task = (AgsTaskClass *) simple_file_write; task->launch = ags_simple_file_write_launch; } void ags_simple_file_write_connectable_interface_init(AgsConnectableInterface *connectable) { ags_simple_file_write_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_simple_file_write_connect; connectable->disconnect = ags_simple_file_write_disconnect; } void ags_simple_file_write_init(AgsSimpleFileWrite *simple_file_write) { simple_file_write->simple_file = NULL; } void ags_simple_file_write_connect(AgsConnectable *connectable) { ags_simple_file_write_parent_connectable_interface->connect(connectable); /* empty */ } void ags_simple_file_write_disconnect(AgsConnectable *connectable) { ags_simple_file_write_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_simple_file_write_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_simple_file_write_parent_class)->finalize(gobject); /* empty */ } void ags_simple_file_write_launch(AgsTask *task) { ags_simple_file_write(AGS_SIMPLE_FILE_WRITE(task)->simple_file); ags_simple_file_close(AGS_SIMPLE_FILE_WRITE(task)->simple_file); g_object_unref(AGS_SIMPLE_FILE_WRITE(task)->simple_file); } /** * ags_simple_file_write_new: * @simple_file: the #AgsSimpleFile * * Create a new task to write the simple file format. * * Returns: the #AgsSimpleFileWrite task * * Since: 3.0.0 */ AgsSimpleFileWrite* ags_simple_file_write_new(AgsSimpleFile *simple_file) { AgsSimpleFileWrite *simple_file_write; simple_file_write = (AgsSimpleFileWrite *) g_object_new(AGS_TYPE_SIMPLE_FILE_WRITE, NULL); simple_file_write->simple_file = simple_file; g_object_ref(simple_file); return(simple_file_write); } gsequencer-3.1.3/ags/X/task/ags_simple_file_read.h0000644000175000017500000000415013607210263017011 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SIMPLE_FILE_READ_H__ #define __AGS_SIMPLE_FILE_READ_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SIMPLE_FILE_READ (ags_simple_file_read_get_type()) #define AGS_SIMPLE_FILE_READ(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SIMPLE_FILE_READ, AgsSimpleFileRead)) #define AGS_SIMPLE_FILE_READ_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SIMPLE_FILE_READ, AgsSimpleFileReadClass)) #define AGS_IS_SIMPLE_FILE_READ(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SIMPLE_FILE_READ)) #define AGS_IS_SIMPLE_FILE_READ_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SIMPLE_FILE_READ)) #define AGS_SIMPLE_FILE_READ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SIMPLE_FILE_READ, AgsSimpleFileReadClass)) typedef struct _AgsSimpleFileRead AgsSimpleFileRead; typedef struct _AgsSimpleFileReadClass AgsSimpleFileReadClass; struct _AgsSimpleFileRead { AgsTask task; AgsSimpleFile *simple_file; }; struct _AgsSimpleFileReadClass { AgsTaskClass task; }; GType ags_simple_file_read_get_type(); AgsSimpleFileRead* ags_simple_file_read_new(AgsSimpleFile *simple_file); G_END_DECLS #endif /*__AGS_SIMPLE_FILE_READ_H__*/ gsequencer-3.1.3/ags/X/task/ags_simple_file_read.c0000644000175000017500000001151413607210263017006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_simple_file_read_class_init(AgsSimpleFileReadClass *simple_file_read); void ags_simple_file_read_connectable_interface_init(AgsConnectableInterface *connectable); void ags_simple_file_read_init(AgsSimpleFileRead *simple_file_read); void ags_simple_file_read_connect(AgsConnectable *connectable); void ags_simple_file_read_disconnect(AgsConnectable *connectable); void ags_simple_file_read_finalize(GObject *gobject); void ags_simple_file_read_launch(AgsTask *task); /** * SECTION:ags_simple_file_read * @short_description: task to read simple file format * @title: AgsSimpleFileRead * @section_id: * @include: ags/X/task/ags_simple_file_read.h * * #AgsSimpleFileRead lets you read the simple file format as a task. */ static gpointer ags_simple_file_read_parent_class = NULL; static AgsConnectableInterface *ags_simple_file_read_parent_connectable_interface; GType ags_simple_file_read_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_simple_file_read = 0; static const GTypeInfo ags_simple_file_read_info = { sizeof (AgsSimpleFileReadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_simple_file_read_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSimpleFileRead), 0, /* n_preallocs */ (GInstanceInitFunc) ags_simple_file_read_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_simple_file_read_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_simple_file_read = g_type_register_static(AGS_TYPE_TASK, "AgsSimpleFileRead", &ags_simple_file_read_info, 0); g_type_add_interface_static(ags_type_simple_file_read, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_simple_file_read); } return g_define_type_id__volatile; } void ags_simple_file_read_class_init(AgsSimpleFileReadClass *simple_file_read) { GObjectClass *gobject; AgsTaskClass *task; ags_simple_file_read_parent_class = g_type_class_peek_parent(simple_file_read); /* gobject */ gobject = (GObjectClass *) simple_file_read; gobject->finalize = ags_simple_file_read_finalize; /* task */ task = (AgsTaskClass *) simple_file_read; task->launch = ags_simple_file_read_launch; } void ags_simple_file_read_connectable_interface_init(AgsConnectableInterface *connectable) { ags_simple_file_read_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_simple_file_read_connect; connectable->disconnect = ags_simple_file_read_disconnect; } void ags_simple_file_read_init(AgsSimpleFileRead *simple_file_read) { simple_file_read->simple_file = NULL; } void ags_simple_file_read_connect(AgsConnectable *connectable) { ags_simple_file_read_parent_connectable_interface->connect(connectable); /* empty */ } void ags_simple_file_read_disconnect(AgsConnectable *connectable) { ags_simple_file_read_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_simple_file_read_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_simple_file_read_parent_class)->finalize(gobject); /* empty */ } void ags_simple_file_read_launch(AgsTask *task) { ags_simple_file_read(AGS_SIMPLE_FILE_READ(task)->simple_file); ags_simple_file_close(AGS_SIMPLE_FILE_READ(task)->simple_file); } /** * ags_simple_file_read_new: * @simple_file: the #AgsSimpleFile * * Create a new task to read the simple file format. * * Returns: the #AgsSimpleFileRead task * * Since: 3.0.0 */ AgsSimpleFileRead* ags_simple_file_read_new(AgsSimpleFile *simple_file) { AgsSimpleFileRead *simple_file_read; simple_file_read = (AgsSimpleFileRead *) g_object_new(AGS_TYPE_SIMPLE_FILE_READ, NULL); simple_file_read->simple_file = simple_file; return(simple_file_read); } gsequencer-3.1.3/ags/X/task/ags_simple_file_write.h0000644000175000017500000000414713607210263017236 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SIMPLE_FILE_WRITE_H__ #define __AGS_SIMPLE_FILE_WRITE_H__ #include #include #include #include #include #include #define AGS_TYPE_SIMPLE_FILE_WRITE (ags_simple_file_write_get_type()) #define AGS_SIMPLE_FILE_WRITE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SIMPLE_FILE_WRITE, AgsSimpleFileWrite)) #define AGS_SIMPLE_FILE_WRITE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SIMPLE_FILE_WRITE, AgsSimpleFileWriteClass)) #define AGS_IS_SIMPLE_FILE_WRITE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SIMPLE_FILE_WRITE)) #define AGS_IS_SIMPLE_FILE_WRITE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SIMPLE_FILE_WRITE)) #define AGS_SIMPLE_FILE_WRITE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SIMPLE_FILE_WRITE, AgsSimpleFileWriteClass)) typedef struct _AgsSimpleFileWrite AgsSimpleFileWrite; typedef struct _AgsSimpleFileWriteClass AgsSimpleFileWriteClass; struct _AgsSimpleFileWrite { AgsTask task; AgsSimpleFile *simple_file; }; struct _AgsSimpleFileWriteClass { AgsTaskClass task; }; GType ags_simple_file_write_get_type(); AgsSimpleFileWrite* ags_simple_file_write_new(AgsSimpleFile *simple_file); #endif /*__AGS_SIMPLE_FILE_WRITE_H__*/ gsequencer-3.1.3/ags/X/ags_property_editor_callbacks.c0000644000175000017500000000213013605312646020012 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_property_editor_enable_callback(GtkToggleButton *toggle, AgsPropertyEditor *property_editor) { if(gtk_toggle_button_get_active(toggle)){ property_editor->flags |= AGS_PROPERTY_EDITOR_ENABLED; }else{ property_editor->flags &= (~AGS_PROPERTY_EDITOR_ENABLED); } } gsequencer-3.1.3/ags/X/ags_animation_window.c0000644000175000017500000002316213613101164016125 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_animation_window_class_init(AgsAnimationWindowClass *animation_window); void ags_animation_window_init(AgsAnimationWindow *animation_window); void ags_animation_window_show(GtkWidget *widget); gboolean ags_animation_window_draw(AgsAnimationWindow *animation_window, cairo_t *cr); static gpointer ags_animation_window_parent_class = NULL; GType ags_animation_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_animation_window = 0; static const GTypeInfo ags_animation_window_info = { sizeof (AgsAnimationWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_animation_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAnimationWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_animation_window_init, }; ags_type_animation_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsAnimationWindow", &ags_animation_window_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_animation_window); } return g_define_type_id__volatile; } void ags_animation_window_class_init(AgsAnimationWindowClass *animation_window) { GtkWidgetClass *widget; ags_animation_window_parent_class = g_type_class_peek_parent(animation_window); /* GtkWidgetClass */ widget = (GtkWidgetClass *) animation_window; widget->draw = ags_animation_window_draw; // widget->show = ags_animation_window_show; } void ags_animation_window_init(AgsAnimationWindow *animation_window) { cairo_surface_t *surface; #if defined(AGS_W32API) AgsApplicationContext *application_context; gchar *app_dir; #endif gchar *filename; gchar *str; unsigned char *image_data; g_object_set(animation_window, "app-paintable", TRUE, "decorated", FALSE, "window-position", GTK_WIN_POS_CENTER, NULL); animation_window->message_count = 0; /* create gdk cairo graphics context */ #ifdef AGS_ANIMATION_FILENAME filename = g_strdup(AGS_ANIMATION_FILENAME); #else if((filename = getenv("AGS_ANIMATION_FILENAME")) == NULL){ #if defined(AGS_W32API) application_context = ags_application_context_get_instance(); app_dir = NULL; if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } filename = g_strdup_printf("%s\\share\\gsequencer\\images\\gsequencer-800x450.png", g_get_current_dir()); if(!g_file_test(filename, G_FILE_TEST_IS_REGULAR)){ g_free(filename); if(g_path_is_absolute(app_dir)){ filename = g_strdup_printf("%s\\%s", app_dir, "\\share\\gsequencer\\images\\gsequencer-800x450.png"); }else{ filename = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\share\\gsequencer\\images\\gsequencer-800x450.png"); } } #else filename = g_strdup_printf("%s%s", DESTDIR, "/gsequencer/images/gsequencer-800x450.png"); #endif }else{ filename = g_strdup(filename); } #endif animation_window->filename = filename; animation_window->image_size = 3 * 800 * 600; animation_window->bg_data = (unsigned char *) malloc(animation_window->image_size * sizeof(unsigned char)); animation_window->cache_data = (unsigned char *) malloc(animation_window->image_size * sizeof(unsigned char)); if(filename != NULL){ surface = cairo_image_surface_create_from_png(filename); image_data = cairo_image_surface_get_data(surface); if(image_data != NULL){ memcpy(animation_window->bg_data, image_data, animation_window->image_size * sizeof(unsigned char)); } cairo_surface_destroy(surface); } animation_window->text_box_x0 = 4; animation_window->text_box_y0 = 220; if((str = getenv("AGS_ANIMATION_TEXT_BOX_X0")) != 0){ animation_window->text_box_x0 = g_ascii_strtoull(str, NULL, 10); } if((str = getenv("AGS_ANIMATION_TEXT_BOX_Y0")) != 0){ animation_window->text_box_y0 = g_ascii_strtoull(str, NULL, 10); } animation_window->text_color = g_new0(GdkRGBA, 1); animation_window->text_color->red = 0.680067002; animation_window->text_color->green = 1.0; animation_window->text_color->blue = 0.998324958; animation_window->text_color->alpha = 1.0; if((str = getenv("AGS_ANIMATION_TEXT_COLOR")) != 0){ gdk_rgba_parse(animation_window->text_color, str); } gtk_widget_set_size_request((GtkWidget *) animation_window, 800, 450); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_animation_window_progress_timeout, (gpointer) animation_window); } void ags_animation_window_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_animation_window_parent_class)->show(widget); } gboolean ags_animation_window_draw(AgsAnimationWindow *animation_window, cairo_t *cr) { AgsLog *log; PangoLayout *layout; PangoFontDescription *desc; cairo_surface_t *surface; GList *start_list, *list; unsigned char *image_data; gchar *font_name; gdouble x0, y0; guint i, i_stop; GRecMutex *log_mutex; if(!AGS_IS_ANIMATION_WINDOW(animation_window)){ return(FALSE); } log = ags_log_get_instance(); log_mutex = AGS_LOG_GET_OBJ_MUTEX(log); list = start_list = ags_log_get_messages(log); i_stop = g_list_length(start_list); #if 0 if(animation_window->message_count >= i_stop){ return; } #endif surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 800, 600); if((image_data = cairo_image_surface_get_data(surface)) != NULL){ memcpy(image_data, animation_window->bg_data, animation_window->image_size * sizeof(unsigned char)); } cairo_set_source_surface(cr, surface, 0, 0); cairo_paint(cr); g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); /* */ x0 = (gdouble) animation_window->text_box_x0; y0 = (gdouble) animation_window->text_box_y0 + (i_stop * 12.0); cairo_set_source_rgba(cr, animation_window->text_color->red, animation_window->text_color->green, animation_window->text_color->blue, animation_window->text_color->alpha); /* text */ layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, "...", -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, 9 * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); cairo_move_to(cr, x0, y0 + 12.0); pango_cairo_show_layout(cr, layout); g_object_unref(layout); for(i = 0; i < i_stop; i++){ gchar *str; g_rec_mutex_lock(log_mutex); str = g_strdup(list->data); list = list->next; g_rec_mutex_unlock(log_mutex); /* text */ layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, str, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, 9 * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); cairo_move_to(cr, x0, y0); pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(str); y0 -= 12.0; } animation_window->message_count = i_stop; g_free(font_name); cairo_surface_mark_dirty(cairo_get_target(cr)); // cairo_destroy(cr); cairo_surface_destroy(surface); return(FALSE); } gboolean ags_animation_window_progress_timeout(AgsAnimationWindow *animation_window) { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); if(ags_ui_provider_get_show_animation(AGS_UI_PROVIDER(application_context))){ AgsLog *log; GList *start_list; guint i_stop; log = ags_log_get_instance(); start_list = ags_log_get_messages(log); i_stop = g_list_length(start_list); if(animation_window->message_count < i_stop){ gtk_widget_queue_draw((GtkWidget *) animation_window); } return(TRUE); }else{ gtk_widget_hide((GtkWidget *) animation_window); ags_ui_provider_setup_completed(AGS_UI_PROVIDER(application_context)); return(FALSE); } } /** * ags_animation_window_new: * * Creates an #AgsAnimationWindow * * Returns: a new #AgsAnimationWindow * * Since: 3.0.0 */ AgsAnimationWindow* ags_animation_window_new() { AgsAnimationWindow *animation_window; animation_window = (AgsAnimationWindow *) g_object_new(AGS_TYPE_ANIMATION_WINDOW, NULL); return(animation_window); } gsequencer-3.1.3/ags/X/ags_sequencer_editor.c0000644000175000017500000006620313607210263016126 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_sequencer_editor_class_init(AgsSequencerEditorClass *sequencer_editor); void ags_sequencer_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sequencer_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_sequencer_editor_init(AgsSequencerEditor *sequencer_editor); void ags_sequencer_editor_connect(AgsConnectable *connectable); void ags_sequencer_editor_disconnect(AgsConnectable *connectable); void ags_sequencer_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_sequencer_editor_apply(AgsApplicable *applicable); void ags_sequencer_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_sequencer_editor * @short_description: A composite widget to configure sequencer * @title: AgsSequencerEditor * @section_id: * @include: ags/X/ags_sequencer_editor.h * * #AgsSequencerEditor enables you to make preferences of sequencer. */ static gpointer ags_sequencer_editor_parent_class = NULL; GType ags_sequencer_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sequencer_editor = 0; static const GTypeInfo ags_sequencer_editor_info = { sizeof (AgsSequencerEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sequencer_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSequencerEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sequencer_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sequencer_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_sequencer_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sequencer_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsSequencerEditor", &ags_sequencer_editor_info, 0); g_type_add_interface_static(ags_type_sequencer_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_sequencer_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sequencer_editor); } return g_define_type_id__volatile; } void ags_sequencer_editor_class_init(AgsSequencerEditorClass *sequencer_editor) { ags_sequencer_editor_parent_class = g_type_class_peek_parent(sequencer_editor); } void ags_sequencer_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_sequencer_editor_connect; connectable->disconnect = ags_sequencer_editor_disconnect; } void ags_sequencer_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_sequencer_editor_set_update; applicable->apply = ags_sequencer_editor_apply; applicable->reset = ags_sequencer_editor_reset; } void ags_sequencer_editor_init(AgsSequencerEditor *sequencer_editor) { GtkTable *table; GtkLabel *label; sequencer_editor->flags = 0; sequencer_editor->sequencer = NULL; sequencer_editor->sequencer_thread = NULL; table = (GtkTable *) gtk_table_new(3, 8, FALSE); gtk_box_pack_start(GTK_BOX(sequencer_editor), GTK_WIDGET(table), FALSE, FALSE, 2); /* backend */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("backend"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); sequencer_editor->backend = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(sequencer_editor->backend), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_combo_box_text_append_text(sequencer_editor->backend, "jack"); #ifdef AGS_WITH_ALSA gtk_combo_box_text_append_text(sequencer_editor->backend, "alsa"); #endif #ifdef AGS_WITH_OSS gtk_combo_box_text_append_text(sequencer_editor->backend, "oss"); #endif gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->backend), 0); /* sound card */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("MIDI card"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); sequencer_editor->card = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(sequencer_editor->card), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* jack */ sequencer_editor->jack_hbox = NULL; sequencer_editor->add_jack = NULL; sequencer_editor->remove_jack = NULL; sequencer_editor->jack_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(sequencer_editor->jack_hbox), 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0); sequencer_editor->add_jack = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) sequencer_editor->jack_hbox, (GtkWidget *) sequencer_editor->add_jack, FALSE, FALSE, 0); sequencer_editor->remove_jack = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) sequencer_editor->jack_hbox, (GtkWidget *) sequencer_editor->remove_jack, FALSE, FALSE, 0); /* */ sequencer_editor->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_table_attach(table, GTK_WIDGET(sequencer_editor->remove), 2, 3, 7, 8, GTK_FILL, GTK_FILL, 0, 0); } void ags_sequencer_editor_connect(AgsConnectable *connectable) { AgsSequencerEditor *sequencer_editor; sequencer_editor = AGS_SEQUENCER_EDITOR(connectable); if((AGS_SEQUENCER_EDITOR_CONNECTED & (sequencer_editor->flags)) != 0){ return; } sequencer_editor->flags |= AGS_SEQUENCER_EDITOR_CONNECTED; /* backend and card */ g_signal_connect(G_OBJECT(sequencer_editor->backend), "changed", G_CALLBACK(ags_sequencer_editor_backend_changed_callback), sequencer_editor); g_signal_connect(G_OBJECT(sequencer_editor->card), "changed", G_CALLBACK(ags_sequencer_editor_card_changed_callback), sequencer_editor); /* add / remove jack */ g_signal_connect(G_OBJECT(sequencer_editor->add_jack), "clicked", G_CALLBACK(ags_sequencer_editor_add_jack_callback), sequencer_editor); g_signal_connect(G_OBJECT(sequencer_editor->remove_jack), "clicked", G_CALLBACK(ags_sequencer_editor_remove_jack_callback), sequencer_editor); } void ags_sequencer_editor_disconnect(AgsConnectable *connectable) { AgsSequencerEditor *sequencer_editor; sequencer_editor = AGS_SEQUENCER_EDITOR(connectable); if((AGS_SEQUENCER_EDITOR_CONNECTED & (sequencer_editor->flags)) == 0){ return; } sequencer_editor->flags &= (~AGS_SEQUENCER_EDITOR_CONNECTED); /* backend and card */ g_object_disconnect(G_OBJECT(sequencer_editor->backend), "any_signal::changed", G_CALLBACK(ags_sequencer_editor_backend_changed_callback), sequencer_editor, NULL); g_object_disconnect(G_OBJECT(sequencer_editor->card), "any_signal::changed", G_CALLBACK(ags_sequencer_editor_card_changed_callback), sequencer_editor, NULL); /* add / remove jack */ g_object_disconnect(G_OBJECT(sequencer_editor->add_jack), "any_signal::clicked", G_CALLBACK(ags_sequencer_editor_add_jack_callback), sequencer_editor, NULL); g_object_disconnect(G_OBJECT(sequencer_editor->remove_jack), "any_signal::clicked", G_CALLBACK(ags_sequencer_editor_remove_jack_callback), sequencer_editor, NULL); } void ags_sequencer_editor_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_sequencer_editor_apply(AgsApplicable *applicable) { AgsMidiPreferences *midi_preferences; AgsSequencerEditor *sequencer_editor; GtkListStore *model; GtkTreeIter current; AgsConfig *config; GList *tasks; GList *list; gchar *sequencer_group; gchar *backend; char *device, *str; gint nth; gboolean use_jack, use_alsa, use_oss; GValue value = {0,}; sequencer_editor = AGS_SEQUENCER_EDITOR(applicable); midi_preferences = (AgsMidiPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_MIDI_PREFERENCES); config = ags_config_get_instance(); list = gtk_container_get_children((GtkContainer *) midi_preferences->sequencer_editor); nth = g_list_index(list, sequencer_editor); if(nth < 0){ return; } sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, nth); g_list_free(list); /* backend */ use_jack = TRUE; use_alsa = FALSE; use_oss = FALSE; backend = gtk_combo_box_text_get_active_text(sequencer_editor->backend); ags_config_set_value(config, sequencer_group, "backend", backend); if(backend != NULL){ if(!g_ascii_strncasecmp(backend, "jack", 5)){ use_jack = TRUE; }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ use_alsa = TRUE; }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ use_oss = TRUE; } } /* device */ model = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card))); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(sequencer_editor->card), ¤t)){ gtk_tree_model_get_value(GTK_TREE_MODEL(model), ¤t, 0, &value); device = g_value_get_string(&value); }else{ device = NULL; } /* handle */ g_message("%s", device); if(use_jack){ ags_config_set_value(config, sequencer_group, "device", device); }else if(use_alsa){ ags_config_set_value(config, sequencer_group, "device", device); }else if(use_oss){ ags_config_set_value(config, sequencer_group, "device", device); } } void ags_sequencer_editor_reset(AgsApplicable *applicable) { AgsPreferences *preferences; AgsSequencerEditor *sequencer_editor; GObject *sequencer; GList *card_id, *card_id_start, *card_name, *card_name_start; gchar *backend, *device, *str, *tmp; guint nth; gboolean use_alsa; gboolean found_card; sequencer_editor = AGS_SEQUENCER_EDITOR(applicable); sequencer = sequencer_editor->sequencer; /* refresh */ use_alsa = FALSE; backend = NULL; if(AGS_IS_JACK_MIDIIN(sequencer)){ backend = "jack"; }else if(AGS_IS_MIDIIN(sequencer)){ if((AGS_MIDIIN_ALSA & (AGS_MIDIIN(sequencer)->flags)) != 0){ backend = "alsa"; }else if((AGS_MIDIIN_OSS & (AGS_MIDIIN(sequencer)->flags)) != 0){ backend = "oss"; } } if(backend != NULL){ if(!g_ascii_strncasecmp(backend, "jack", 5)){ gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->backend), 0); ags_sequencer_editor_load_jack_card(sequencer_editor); }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ use_alsa = TRUE; #ifdef AGS_WITH_ALSA gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->backend), 1); #endif ags_sequencer_editor_load_alsa_card(sequencer_editor); }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ #ifdef AGS_WITH_ALSA gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->backend), 2); #else gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->backend), -1); #endif ags_sequencer_editor_load_oss_card(sequencer_editor); } } /* */ device = ags_sequencer_get_device(AGS_SEQUENCER(sequencer)); card_id_start = NULL; card_name_start = NULL; ags_sequencer_list_cards(AGS_SEQUENCER(sequencer), &card_id_start, &card_name_start); card_id = card_id_start; card_name = card_name_start; nth = 0; found_card = FALSE; gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card)))); while(card_id != NULL){ //FIXME:JK: work-around for alsa-handle tmp = card_id->data; if(card_id->data != NULL && use_alsa){ tmp = g_strdup_printf("%s,0", (gchar *) card_id->data); } if(tmp != NULL && device != NULL && !g_ascii_strcasecmp(tmp, device)){ found_card = TRUE; } if(tmp != NULL){ gtk_combo_box_text_append_text(sequencer_editor->card, tmp); } if(use_alsa){ g_free(tmp); } if(!found_card){ nth++; } card_id = card_id->next; card_name = card_name->next; } if(!found_card){ nth = 0; } gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->card), nth); if(card_id_start != NULL){ g_list_free_full(card_id_start, g_free); g_list_free_full(card_name_start, g_free); } } void ags_sequencer_editor_add_source(AgsSequencerEditor *sequencer_editor, gchar *device) { AgsPreferences *preferences; AgsJackServer *jack_server; AgsJackMidiin *jack_midiin; AgsThread *main_loop; AgsThread *sequencer_thread; AgsApplicationContext *application_context; GList *start_sound_server, *sound_server; GList *start_sequencer; GList *card_name, *card_uri; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); /* create sequencer */ sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((sound_server = ags_list_util_find_type(sound_server, AGS_TYPE_JACK_SERVER)) != NULL){ jack_server = AGS_JACK_SERVER(sound_server->data); }else{ g_warning("sound server not found"); g_list_free_full(start_sound_server, g_object_unref); return; } jack_midiin = (AgsJackMidiin *) ags_sound_server_register_sequencer(AGS_SOUND_SERVER(jack_server), FALSE); if(jack_midiin == NULL){ g_list_free_full(start_sound_server, g_object_unref); return; } /* add new */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); sequencer_editor->sequencer = (GObject *) jack_midiin; start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); g_list_foreach(start_sequencer, (GFunc) g_object_unref, NULL); g_object_ref(jack_midiin); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_append(start_sequencer, jack_midiin)); sequencer_thread = (AgsThread *) ags_sequencer_thread_new((GObject *) jack_midiin); sequencer_editor->sequencer_thread = (GObject *) sequencer_thread; ags_thread_add_child_extended(main_loop, sequencer_thread, TRUE, TRUE); /* */ card_name = NULL; card_uri = NULL; ags_sequencer_list_cards(AGS_SEQUENCER(jack_midiin), &card_uri, &card_name); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card)))); while(card_uri != NULL){ if(card_uri->data != NULL){ gtk_combo_box_text_append_text(sequencer_editor->card, card_uri->data); } card_uri = card_uri->next; } g_object_unref(main_loop); /* unref */ g_list_free_full(start_sound_server, g_object_unref); } void ags_sequencer_editor_remove_source(AgsSequencerEditor *sequencer_editor, gchar *device) { AgsPreferences *preferences; AgsJackMidiin *jack_midiin; AgsApplicationContext *application_context; AgsThread *main_loop; GList *start_sound_server, *sound_server; GList *start_sequencer, *sequencer; GList *card_id; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); /* create sequencer */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((sound_server = ags_list_util_find_type(start_sound_server, AGS_TYPE_JACK_SERVER)) == NULL){ g_object_unref(main_loop); g_list_free_full(start_sound_server, g_object_unref); g_warning("sound server not found"); return; } jack_midiin = NULL; sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(sequencer != NULL){ if(AGS_IS_JACK_MIDIIN(sequencer->data) && !g_ascii_strcasecmp(ags_sequencer_get_device(AGS_SEQUENCER(sequencer->data)), device)){ jack_midiin = sequencer->data; break; } sequencer = sequencer->next; } if(jack_midiin == NULL){ g_object_unref(main_loop); g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_sequencer, g_object_unref); return; } /* */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card)))); gtk_combo_box_set_active(GTK_COMBO_BOX(sequencer_editor->backend), -1); #if 0 if((sound_server = ags_list_util_find_type(start_sound_server, AGS_TYPE_JACK_SERVER)) != NULL){ ags_sound_server_unregister_sequencer(AGS_SOUND_SERVER(sound_server->data), jack_midiin); } #endif /* remove */ if((GObject *) jack_midiin == sequencer_editor->sequencer){ sequencer_editor->sequencer = NULL; } #if 0 if(jack_midiin != NULL){ GList *tmp; tmp = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_remove(tmp, jack_midiin)); g_object_unref(jack_midiin); g_list_free_full(tmp, g_object_unref); } #endif #if 0 if(sequencer_editor->sequencer_thread != NULL){ ags_thread_stop((AgsThread *) sequencer_editor->sequencer_thread); ags_thread_remove_child(main_loop, (AgsThread *) sequencer_editor->sequencer_thread); // g_object_unref(sequencer_editor->sequencer_thread); sequencer_editor->sequencer_thread = NULL; } #endif /* unref */ g_object_unref(main_loop); g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_sequencer, g_object_unref); } void ags_sequencer_editor_add_sequencer(AgsSequencerEditor *sequencer_editor, GObject *sequencer) { AgsPreferences *preferences; AgsThread *main_loop; AgsThread *sequencer_thread; AgsApplicationContext *application_context; GList *start_sequencer; if(sequencer == NULL || AGS_IS_JACK_MIDIIN(sequencer)){ return; } preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); if(AGS_IS_MIDIIN(sequencer)){ if((AGS_MIDIIN_ALSA & (AGS_MIDIIN(sequencer)->flags)) != 0){ ags_sequencer_set_device(AGS_SEQUENCER(sequencer), "hw:0,0"); }else if((AGS_MIDIIN_OSS & (AGS_MIDIIN(sequencer)->flags)) != 0){ ags_sequencer_set_device(AGS_SEQUENCER(sequencer), "/dev/dsp0"); }else{ g_warning("unknown sequencer implementation"); } }else{ g_warning("unknown sequencer implementation"); } /* */ start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); if(g_list_find(start_sequencer, sequencer) != NULL){ g_list_free_full(start_sequencer, g_object_unref); return; } main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); sequencer_editor->sequencer = sequencer; g_list_foreach(start_sequencer, (GFunc) g_object_unref, NULL); g_object_ref(sequencer); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_append(start_sequencer, sequencer)); sequencer_thread = (AgsThread *) ags_sequencer_thread_new(sequencer); sequencer_editor->sequencer_thread = (GObject *) sequencer_thread; ags_thread_add_child_extended(main_loop, sequencer_thread, TRUE, TRUE); /* unref */ g_object_unref(main_loop); } void ags_sequencer_editor_remove_sequencer(AgsSequencerEditor *sequencer_editor, GObject *sequencer) { AgsPreferences *preferences; AgsThread *main_loop; AgsThread *sequencer_thread; AgsApplicationContext *application_context; if(AGS_IS_JACK_MIDIIN(sequencer)){ return; } preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); if(sequencer == sequencer_editor->sequencer){ sequencer_editor->sequencer = NULL; } #if 0 if(sequencer != NULL){ GList *tmp; tmp = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_remove(tmp, sequencer)); g_object_unref(sequencer); g_list_free_full(tmp, g_object_unref); } #endif #if 0 if(sequencer_editor->sequencer_thread != NULL){ ags_thread_stop((AgsThread *) sequencer_editor->sequencer_thread); ags_thread_remove_child(main_loop, (AgsThread *) sequencer_editor->sequencer_thread); // g_object_unref(sequencer_editor->sequencer_thread); sequencer_editor->sequencer_thread = NULL; } #endif } void ags_sequencer_editor_load_jack_card(AgsSequencerEditor *sequencer_editor) { AgsPreferences *preferences; AgsJackMidiin *jack_midiin; AgsApplicationContext *application_context; GList *start_sound_server, *sound_server; GList *start_sequencer, *sequencer; GList *card_id; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); /* create sequencer */ sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((sound_server = ags_list_util_find_type(sound_server, AGS_TYPE_JACK_SERVER)) == NULL){ g_warning("sound server not found"); g_list_free_full(sound_server, g_object_unref); return; } sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); jack_midiin = NULL; while(sequencer != NULL){ if(AGS_IS_JACK_MIDIIN(sequencer->data)){ jack_midiin = sequencer->data; break; } sequencer = sequencer->next; } card_id = NULL; ags_sequencer_list_cards(AGS_SEQUENCER(jack_midiin), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card)))); while(card_id != NULL){ if(card_id->data != NULL){ gtk_combo_box_text_append_text(sequencer_editor->card, card_id->data); } card_id = card_id->next; } g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_sequencer, g_object_unref); } void ags_sequencer_editor_load_alsa_card(AgsSequencerEditor *sequencer_editor) { AgsPreferences *preferences; AgsMidiin *midiin; AgsApplicationContext *application_context; GList *list; GList *card_id; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); /* */ midiin = g_object_new(AGS_TYPE_MIDIIN, NULL); midiin->flags &= (~AGS_MIDIIN_OSS); midiin->flags |= AGS_MIDIIN_ALSA; card_id = NULL; ags_sequencer_list_cards(AGS_SEQUENCER(midiin), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card)))); while(card_id != NULL){ if(card_id->data != NULL){ gtk_combo_box_text_append_text(sequencer_editor->card, card_id->data); } card_id = card_id->next; } /* remove previous */ if(sequencer_editor->sequencer != NULL){ ags_sequencer_editor_remove_sequencer(sequencer_editor, (GObject *) sequencer_editor->sequencer); } /* add new */ ags_sequencer_editor_add_sequencer(sequencer_editor, (GObject *) midiin); } void ags_sequencer_editor_load_oss_card(AgsSequencerEditor *sequencer_editor) { AgsPreferences *preferences; AgsMidiin *midiin; AgsApplicationContext *application_context; GList *list; GList *card_id; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(sequencer_editor), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); /* */ midiin = g_object_new(AGS_TYPE_MIDIIN, NULL); midiin->flags &= (~AGS_MIDIIN_ALSA); midiin->flags |= AGS_MIDIIN_OSS; card_id = NULL; ags_sequencer_list_cards(AGS_SEQUENCER(midiin), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(sequencer_editor->card)))); while(card_id != NULL){ if(card_id->data != NULL){ gtk_combo_box_text_append_text(sequencer_editor->card, card_id->data); } card_id = card_id->next; } /* remove previous */ if(sequencer_editor->sequencer != NULL){ ags_sequencer_editor_remove_sequencer(sequencer_editor, (GObject *) sequencer_editor->sequencer); } /* add new */ ags_sequencer_editor_add_sequencer(sequencer_editor, (GObject *) midiin); } /** * ags_sequencer_editor_new: * * Create a new instance of #AgsSequencerEditor * * Returns: the new #AgsSequencerEditor * * Since: 3.0.0 */ AgsSequencerEditor* ags_sequencer_editor_new() { AgsSequencerEditor *sequencer_editor; sequencer_editor = (AgsSequencerEditor *) g_object_new(AGS_TYPE_SEQUENCER_EDITOR, NULL); return(sequencer_editor); } gsequencer-3.1.3/ags/X/ags_playback_window.h0000644000175000017500000000422313607210263015742 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAYBACK_WINDOW_H__ #define __AGS_PLAYBACK_WINDOW_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAYBACK_WINDOW (ags_playback_window_get_type()) #define AGS_PLAYBACK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAYBACK_WINDOW, AgsPlaybackWindow)) #define AGS_PLAYBACK_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAYBACK_WINDOW, AgsPlaybackWindowClass)) #define AGS_IS_PLAYBACK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLAYBACK_WINDOW)) #define AGS_IS_PLAYBACK_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PLAYBACK_WINDOW)) #define AGS_PLAYBACK_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PLAYBACK_WINDOW, AgsPlaybackWindowClass)) typedef struct _AgsPlaybackWindow AgsPlaybackWindow; typedef struct _AgsPlaybackWindowClass AgsPlaybackWindowClass; typedef enum{ AGS_PLAYBACK_WINDOW_CONNECTED = 1, }AgsPlaybackWindowFlags; struct _AgsPlaybackWindow { GtkWindow window; guint flags; GtkWidget *main_window; }; struct _AgsPlaybackWindowClass { GtkWindowClass window; }; GType ags_playback_window_get_type(void); AgsPlaybackWindow* ags_playback_window_new(); G_END_DECLS #endif /*__AGS_PLAYBACK_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_sheet_editor.c0000644000175000017500000002275713607210263015252 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_sheet_editor_class_init(AgsSheetEditorClass *sheet_editor); void ags_sheet_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sheet_editor_init(AgsSheetEditor *sheet_editor); void ags_sheet_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sheet_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sheet_editor_connect(AgsConnectable *connectable); void ags_sheet_editor_disconnect(AgsConnectable *connectable); void ags_sheet_editor_finalize(GObject *gobject); void ags_sheet_editor_real_machine_changed(AgsSheetEditor *sheet_editor, AgsMachine *machine); enum{ MACHINE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, PROP_SOUNDCARD, }; static gpointer ags_sheet_editor_parent_class = NULL; static guint sheet_editor_signals[LAST_SIGNAL]; /** * SECTION:ags_sheet_editor * @short_description: A composite widget to edit notation * @title: AgsSheetEditor * @section_id: * @include: ags/X/ags_sheet_editor.h * * #AgsSheetEditor is a composite widget to edit notation. You may select machines * or change sheet tool to do notation. */ GType ags_sheet_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sheet_editor = 0; static const GTypeInfo ags_sheet_editor_info = { sizeof (AgsSheetEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sheet_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSheetEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sheet_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sheet_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sheet_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsSheetEditor", &ags_sheet_editor_info, 0); g_type_add_interface_static(ags_type_sheet_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sheet_editor); } return g_define_type_id__volatile; } void ags_sheet_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_sheet_editor_connect; connectable->disconnect = ags_sheet_editor_disconnect; } void ags_sheet_editor_class_init(AgsSheetEditorClass *sheet_editor) { GObjectClass *gobject; GParamSpec *param_spec; ags_sheet_editor_parent_class = g_type_class_peek_parent(sheet_editor); /* GObjectClass */ gobject = (GObjectClass *) sheet_editor; gobject->set_property = ags_sheet_editor_set_property; gobject->get_property = ags_sheet_editor_get_property; gobject->finalize = ags_sheet_editor_finalize; /* properties */ /** * AgsSheetEditor:soundcard: * * The assigned #AgsSoundcard acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("assigned soundcard"), i18n_pspec("The soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /* AgsSheetClass */ sheet_editor->machine_changed = ags_sheet_editor_real_machine_changed; /* signals */ /** * AgsSheet::machine-changed: * @sheet: the object to change machine. * @machine: the #AgsMachine to set * * The ::machine-changed signal notifies about changed machine. * * Since: 3.0.0 */ sheet_editor_signals[MACHINE_CHANGED] = g_signal_new("machine-changed", G_TYPE_FROM_CLASS(sheet_editor), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSheetEditorClass, machine_changed), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_sheet_editor_init(AgsSheetEditor *sheet_editor) { //TODO:JK: implement me } void ags_sheet_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSheetEditor *sheet_editor; sheet_editor = AGS_SHEET_EDITOR(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); if(sheet_editor->soundcard == soundcard){ return; } if(sheet_editor->soundcard != NULL){ g_object_unref(sheet_editor->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } sheet_editor->soundcard = soundcard; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sheet_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSheetEditor *sheet_editor; sheet_editor = AGS_SHEET_EDITOR(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, sheet_editor->soundcard); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sheet_editor_connect(AgsConnectable *connectable) { AgsSheetEditor *sheet_editor; sheet_editor = AGS_SHEET_EDITOR(connectable); if((AGS_SHEET_EDITOR_CONNECTED & (sheet_editor->flags)) != 0){ return; } sheet_editor->flags |= AGS_SHEET_EDITOR_CONNECTED; // g_signal_connect((GObject *) sheet_editor->machine_selector, "changed", // G_CALLBACK(ags_sheet_editor_machine_changed_callback), (gpointer) sheet_editor); /* toolbar */ ags_connectable_connect(AGS_CONNECTABLE(sheet_editor->sheet_toolbar)); /* machine selector */ ags_connectable_connect(AGS_CONNECTABLE(sheet_editor->machine_selector)); /* notation page */ // ags_connectable_connect(AGS_CONNECTABLE(sheet_editor->notation_page)); } void ags_sheet_editor_disconnect(AgsConnectable *connectable) { AgsSheetEditor *sheet_editor; sheet_editor = AGS_SHEET_EDITOR(connectable); /* sheet toolbar */ ags_connectable_disconnect(AGS_CONNECTABLE(sheet_editor->sheet_toolbar)); /* machine selector */ ags_connectable_disconnect(AGS_CONNECTABLE(sheet_editor->machine_selector)); /* notation page */ // ags_connectable_disconnect(AGS_CONNECTABLE(sheet_editor->notation_page)); } void ags_sheet_editor_finalize(GObject *gobject) { AgsSheetEditor *sheet_editor; sheet_editor = AGS_SHEET_EDITOR(gobject); if(sheet_editor->soundcard != NULL){ g_object_unref(sheet_editor->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_sheet_editor_parent_class)->finalize(gobject); } void ags_sheet_editor_real_machine_changed(AgsSheetEditor *sheet_editor, AgsMachine *machine) { //TODO:JK: implement me } /** * ags_sheet_editor_machine_changed: * @sheet_editor: an #AgsSheetEditor * @machine: the new #AgsMachine * * Is emitted as machine changed of sheet_editor. * * Since: 3.0.0 */ void ags_sheet_editor_machine_changed(AgsSheetEditor *sheet_editor, AgsMachine *machine) { g_return_if_fail(AGS_IS_SHEET_EDITOR(sheet_editor)); g_object_ref((GObject *) sheet_editor); g_signal_emit((GObject *) sheet_editor, sheet_editor_signals[MACHINE_CHANGED], 0, machine); g_object_unref((GObject *) sheet_editor); } void ags_sheet_editor_add_note(AgsSheetEditor *sheet_editor, AgsNote *note) { //TODO:JK: implement me } void ags_sheet_editor_delete_note(AgsSheetEditor *sheet_editor, guint x, guint y) { //TODO:JK: implement me } void ags_sheet_editor_select_region(AgsSheetEditor *sheet_editor, guint x0, guint y0, guint x1, guint y1) { //TODO:JK: implement me } void ags_sheet_editor_do_feedback(AgsSheetEditor *sheet_editor) { //TODO:JK: implement me } void ags_sheet_editor_select_all(AgsSheetEditor *sheet_editor) { //TODO:JK: implement me } void ags_sheet_editor_paste(AgsSheetEditor *sheet_editor) { //TODO:JK: implement me } void ags_sheet_editor_copy(AgsSheetEditor *sheet_editor) { //TODO:JK: implement me } void ags_sheet_editor_cut(AgsSheetEditor *sheet_editor) { //TODO:JK: implement me } /** * ags_sheet_editor_new: * * Creates an #AgsSheetEditor * * Returns: a new #AgsSheetEditor * * Since: 3.0.0 */ AgsSheetEditor* ags_sheet_editor_new() { AgsSheetEditor *sheet_editor; sheet_editor = (AgsSheetEditor *) g_object_new(AGS_TYPE_SHEET_EDITOR, NULL); return(sheet_editor); } gsequencer-3.1.3/ags/X/ags_property_editor.h0000644000175000017500000000435113607210263016021 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PROPERTY_EDITOR_H__ #define __AGS_PROPERTY_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PROPERTY_EDITOR (ags_property_editor_get_type()) #define AGS_PROPERTY_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PROPERTY_EDITOR, AgsPropertyEditor)) #define AGS_PROPERTY_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PROPERTY_EDITOR, AgsPropertyEditorClass)) #define AGS_IS_PROPERTY_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PROPERTY_EDITOR)) #define AGS_IS_PROPERTY_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PROPERTY_EDITOR)) #define AGS_PROPERTY_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PROPERTY_EDITOR, AgsPropertyEditorClass)) typedef struct _AgsPropertyEditor AgsPropertyEditor; typedef struct _AgsPropertyEditorClass AgsPropertyEditorClass; typedef enum{ AGS_PROPERTY_EDITOR_CONNECTED = 1, AGS_PROPERTY_EDITOR_ENABLED = 1 << 1, }AgsPropertyEditorFlags; struct _AgsPropertyEditor { GtkVBox vbox; guint flags; GtkCheckButton *enabled; }; struct _AgsPropertyEditorClass { GtkVBoxClass vbox; void (*apply)(AgsPropertyEditor *property_editor); }; GType ags_property_editor_get_type(); AgsPropertyEditor* ags_property_editor_new(); G_END_DECLS #endif /*__AGS_PROPERTY_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_property_listing_editor.c0000644000175000017500000001051213607210263017541 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_property_listing_editor_class_init(AgsPropertyListingEditorClass *property_listing_editor); void ags_property_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_property_listing_editor_init(AgsPropertyListingEditor *property_listing_editor); void ags_property_listing_editor_connect(AgsConnectable *connectable); void ags_property_listing_editor_disconnect(AgsConnectable *connectable); /** * SECTION:ags_property_listing_editor * @short_description: Pack child widgets using #GtkVBox * @title: AgsPropertyListingEditor * @section_id: * @include: ags/X/ags_property_listing_editor.h * * #AgsPropertyListingEditor is a composite widget to pack using a #GtkVBox. */ static AgsConnectableInterface* ags_property_listing_editor_parent_connectable_interface; GType ags_property_listing_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_property_listing_editor = 0; static const GTypeInfo ags_property_listing_editor_info = { sizeof (AgsPropertyListingEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_property_listing_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPropertyListingEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_property_listing_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_property_listing_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_property_listing_editor = g_type_register_static(AGS_TYPE_PROPERTY_EDITOR, "AgsPropertyListingEditor", &ags_property_listing_editor_info, 0); g_type_add_interface_static(ags_type_property_listing_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_property_listing_editor); } return g_define_type_id__volatile; } void ags_property_listing_editor_class_init(AgsPropertyListingEditorClass *property_listing_editor) { /* empty */ } void ags_property_listing_editor_connectable_interface_init(AgsConnectableInterface *connectable) { ags_property_listing_editor_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_property_listing_editor_connect; connectable->disconnect = ags_property_listing_editor_disconnect; } void ags_property_listing_editor_init(AgsPropertyListingEditor *property_listing_editor) { /* empty */ } void ags_property_listing_editor_connect(AgsConnectable *connectable) { ags_property_listing_editor_parent_connectable_interface->connect(connectable); /* empty */ } void ags_property_listing_editor_disconnect(AgsConnectable *connectable) { /* empty */ ags_property_listing_editor_parent_connectable_interface->disconnect(connectable); } /** * ags_property_listing_editor_new: * * Create a new instance of #AgsPropertyListingEditor * * Returns: the new #AgsPropertyListingEditor * * Since: 3.0.0 */ AgsPropertyListingEditor* ags_property_listing_editor_new() { AgsPropertyListingEditor *property_listing_editor; property_listing_editor = (AgsPropertyListingEditor *) g_object_new(AGS_TYPE_PROPERTY_LISTING_EDITOR, NULL); return(property_listing_editor); } gsequencer-3.1.3/ags/X/ags_dssi_browser_callbacks.h0000644000175000017500000000250013607210263017265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DSSI_BROWSER_CALLBACKS_H__ #define __AGS_DSSI_BROWSER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_dssi_browser_plugin_filename_callback(GtkComboBoxText *combo_box, AgsDssiBrowser *dssi_browser); void ags_dssi_browser_plugin_effect_callback(GtkComboBoxText *combo_box, AgsDssiBrowser *dssi_browser); G_END_DECLS #endif /*__AGS_DSSI_BROWSER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_property_editor.c0000644000175000017500000001135013607210263016011 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_property_editor_class_init(AgsPropertyEditorClass *property_editor); void ags_property_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_property_editor_init(AgsPropertyEditor *property_editor); void ags_property_editor_connect(AgsConnectable *connectable); void ags_property_editor_disconnect(AgsConnectable *connectable); /** * SECTION:ags_property_editor * @short_description: Property of audio, channels or pads in bulk mode. * @title: AgsPropertyEditor * @section_id: * @include: ags/X/ags_property_editor.h * * #AgsPropertyEditor is a composite widget to property. A property editor * should be packed by a #AgsPropertyCollectionEditor. */ GType ags_property_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_property_editor = 0; static const GTypeInfo ags_property_editor_info = { sizeof (AgsPropertyEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_property_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPropertyEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_property_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_property_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_property_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsPropertyEditor", &ags_property_editor_info, 0); g_type_add_interface_static(ags_type_property_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_property_editor); } return g_define_type_id__volatile; } void ags_property_editor_class_init(AgsPropertyEditorClass *property_editor) { } void ags_property_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_property_editor_connect; connectable->disconnect = ags_property_editor_disconnect; } void ags_property_editor_init(AgsPropertyEditor *property_editor) { property_editor->flags = 0; property_editor->enabled = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("enabled")); gtk_box_pack_start(GTK_BOX(property_editor), GTK_WIDGET(property_editor->enabled), FALSE, FALSE, 0); } void ags_property_editor_connect(AgsConnectable *connectable) { AgsPropertyEditor *property_editor; /* AgsPropertyEditor */ property_editor = AGS_PROPERTY_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (property_editor->flags)) != 0){ return; } property_editor->flags |= AGS_PROPERTY_EDITOR_CONNECTED; g_signal_connect_after(G_OBJECT(property_editor->enabled), "toggled", G_CALLBACK(ags_property_editor_enable_callback), property_editor); } void ags_property_editor_disconnect(AgsConnectable *connectable) { AgsPropertyEditor *property_editor; /* AgsPropertyEditor */ property_editor = AGS_PROPERTY_EDITOR(connectable); if((AGS_PROPERTY_EDITOR_CONNECTED & (property_editor->flags)) == 0){ return; } property_editor->flags &= (~AGS_PROPERTY_EDITOR_CONNECTED); g_object_disconnect(property_editor->enabled, "any_signal::toggled", G_CALLBACK(ags_property_editor_enable_callback), property_editor, NULL); } /** * ags_property_editor_new: * * Create a new instance of #AgsPropertyEditor * * Returns: the new #AgsPropertyEditor * * Since: 3.0.0 */ AgsPropertyEditor* ags_property_editor_new() { AgsPropertyEditor *property_editor; property_editor = (AgsPropertyEditor *) g_object_new(AGS_TYPE_PROPERTY_EDITOR, NULL); return(property_editor); } gsequencer-3.1.3/ags/X/ags_context_menu.h0000644000175000017500000000423513607210263015300 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONTEXT_MENU_H__ #define __AGS_CONTEXT_MENU_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CONTEXT_MENU (ags_context_menu_get_type ()) #define AGS_CONTEXT_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONTEXT_MENU, AgsContextMenu)) #define AGS_CONTEXT_MENU_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CONTEXT_MENU, AgsContextMenuClass)) #define AGS_IS_CONTEXT_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CONTEXT_MENU)) #define AGS_IS_CONTEXT_MENU_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CONTEXT_MENU)) #define AGS_CONTEXT_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_CONTEXT_MENU, AgsContextMenuClass)) typedef struct _AgsContextMenu AgsContextMenu; typedef struct _AgsContextMenuClass AgsContextMenuClass; typedef enum{ AGS_CONTEXT_MENU_CONNECTED = 1, }AgsContextMenuFlags; struct _AgsContextMenu { GtkMenu context_menu; guint flags; GtkMenu *file; GtkMenu *edit; GtkMenu *add; GtkMenu *live; GtkMenu *midi; GtkMenu *help; }; struct _AgsContextMenuClass { GtkMenuClass context_menu; }; GType ags_context_menu_get_type(void); AgsContextMenu* ags_context_menu_new(); G_END_DECLS #endif /*__AGS_CONTEXT_MENU_H__*/ gsequencer-3.1.3/ags/X/ags_bulk_member_callbacks.h0000644000175000017500000000374513607210263017060 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BULK_MEMBER_CALLBACKS_H__ #define __AGS_BULK_MEMBER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_bulk_member_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsBulkMember *bulk_member); void ags_bulk_member_dial_changed_callback(GtkWidget *dial, AgsBulkMember *bulk_member); void ags_bulk_member_vscale_changed_callback(GtkWidget *vscale, AgsBulkMember *bulk_member); void ags_bulk_member_hscale_changed_callback(GtkWidget *hscale, AgsBulkMember *bulk_member); void ags_bulk_member_spin_button_changed_callback(GtkWidget *spin_button, AgsBulkMember *bulk_member); void ags_bulk_member_check_button_clicked_callback(GtkWidget *check_button, AgsBulkMember *bulk_member); void ags_bulk_member_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsBulkMember *bulk_member); void ags_bulk_member_button_clicked_callback(GtkWidget *button, AgsBulkMember *bulk_member); void ags_bulk_member_port_safe_write_callback(AgsPort *port, GValue *value, AgsBulkMember *bulk_member); G_END_DECLS #endif /*__AGS_BULK_MEMBER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_wave_editor.c0000644000175000017500000011675313616617253015116 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_wave_editor_class_init(AgsWaveEditorClass *wave_editor); void ags_wave_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wave_editor_init(AgsWaveEditor *wave_editor); void ags_wave_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_editor_finalize(GObject *gobject); void ags_wave_editor_connect(AgsConnectable *connectable); void ags_wave_editor_disconnect(AgsConnectable *connectable); void ags_wave_editor_show(GtkWidget *widget); void ags_wave_editor_show_all(GtkWidget *widget); gint ags_wave_editor_paste_wave_all(AgsWaveEditor *wave_editor, AgsMachine *machine, AgsNotebook *notebook, xmlNode *wave_node, AgsTimestamp *timestamp, gboolean match_line, gboolean paste_from_position, guint64 position_x, gint64 *last_x); gint ags_wave_editor_paste_wave(AgsWaveEditor *wave_editor, AgsMachine *machine, AgsNotebook *notebook, xmlNode *audio_node, gboolean paste_from_position, guint64 position_x, guint64 relative_offset); void ags_wave_editor_real_machine_changed(AgsWaveEditor *wave_editor, AgsMachine *machine); enum{ MACHINE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, }; static gpointer ags_wave_editor_parent_class = NULL; static guint wave_editor_signals[LAST_SIGNAL]; /** * SECTION:ags_wave_editor * @short_description: A composite widget to edit wave * @title: AgsWaveEditor * @section_id: * @include: ags/X/ags_wave_editor.h * * #AgsWaveEditor is a composite widget to edit wave. You may select machines * or change editor tool to do wave. */ GType ags_wave_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_editor = 0; static const GTypeInfo ags_wave_editor_info = { sizeof (AgsWaveEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wave_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wave_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsWaveEditor", &ags_wave_editor_info, 0); g_type_add_interface_static(ags_type_wave_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_editor); } return g_define_type_id__volatile; } void ags_wave_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_wave_editor_connect; connectable->disconnect = ags_wave_editor_disconnect; } void ags_wave_editor_class_init(AgsWaveEditorClass *wave_editor) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_wave_editor_parent_class = g_type_class_peek_parent(wave_editor); /* GObjectClass */ gobject = (GObjectClass *) wave_editor; gobject->set_property = ags_wave_editor_set_property; gobject->get_property = ags_wave_editor_get_property; gobject->finalize = ags_wave_editor_finalize; /* properties */ /* GtkWidgetClass */ widget = (GtkWidgetClass *) wave_editor; widget->show = ags_wave_editor_show; widget->show_all = ags_wave_editor_show_all; /* AgsEditorClass */ wave_editor->machine_changed = ags_wave_editor_real_machine_changed; /* signals */ /** * AgsEditor::machine-changed: * @editor: the object to change machine. * @machine: the #AgsMachine to set * * The ::machine-changed signal notifies about changed machine. * * Since: 3.0.0 */ wave_editor_signals[MACHINE_CHANGED] = g_signal_new("machine-changed", G_TYPE_FROM_CLASS(wave_editor), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsWaveEditorClass, machine_changed), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_wave_editor_init(AgsWaveEditor *wave_editor) { GtkViewport *viewport; GtkHBox *hbox; GtkScrolledWindow *scrolled_window; GtkTable *table; GtkStyleContext *style_context; GtkAdjustment *adjustment; AgsConfig *config; gchar *str; gdouble gui_scale_factor; wave_editor->flags = AGS_WAVE_EDITOR_PASTE_MATCH_LINE; wave_editor->version = AGS_WAVE_EDITOR_DEFAULT_VERSION; wave_editor->build_id = AGS_WAVE_EDITOR_DEFAULT_BUILD_ID; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } /* offset */ wave_editor->tact_counter = 0; wave_editor->current_tact = 0.0; /* soundcard */ wave_editor->wave_toolbar = ags_wave_toolbar_new(); gtk_box_pack_start((GtkBox *) wave_editor, (GtkWidget *) wave_editor->wave_toolbar, FALSE, FALSE, 0); wave_editor->paned = (GtkHPaned *) gtk_hpaned_new(); gtk_box_pack_start((GtkBox *) wave_editor, (GtkWidget *) wave_editor->paned, TRUE, TRUE, 0); /* machine selector */ viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_paned_pack1((GtkPaned *) wave_editor->paned, (GtkWidget *) viewport, FALSE, TRUE); scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(scrolled_window)); wave_editor->machine_selector = g_object_new(AGS_TYPE_MACHINE_SELECTOR, "homogeneous", FALSE, "spacing", 0, NULL); wave_editor->machine_selector->flags |= (AGS_MACHINE_SELECTOR_WAVE); gtk_label_set_label(wave_editor->machine_selector->label, i18n("wave")); wave_editor->machine_selector->popup = ags_machine_selector_popup_new(wave_editor->machine_selector); g_object_set(wave_editor->machine_selector->menu_button, "menu", wave_editor->machine_selector->popup, NULL); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) wave_editor->machine_selector); /* selected machine */ wave_editor->selected_machine = NULL; /* table */ hbox = gtk_hbox_new(FALSE, 0); gtk_paned_pack2((GtkPaned *) wave_editor->paned, (GtkWidget *) hbox, TRUE, TRUE); viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) viewport, TRUE, TRUE, 0); table = (GtkTable *) gtk_table_new(4, 3, FALSE); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(table)); /* notebook */ wave_editor->notebook = g_object_new(AGS_TYPE_NOTEBOOK, "homogeneous", FALSE, "spacing", 0, "prefix", i18n("line"), NULL); gtk_table_attach(table, (GtkWidget *) wave_editor->notebook, 0, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* ruler */ wave_editor->ruler = ags_ruler_new(); g_object_set(wave_editor->ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), NULL); gtk_widget_set_size_request((GtkWidget *) wave_editor->ruler, -1, (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT)); gtk_table_attach(table, (GtkWidget *) wave_editor->ruler, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* level */ wave_editor->scrolled_level_box = ags_scrolled_level_box_new(); gtk_widget_set_vexpand(wave_editor->scrolled_level_box->viewport, TRUE); g_object_set(wave_editor->scrolled_level_box, "margin-top", (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT), NULL); wave_editor->scrolled_level_box->level_box = (AgsLevelBox *) ags_vlevel_box_new(); g_object_set(wave_editor->scrolled_level_box->level_box, "fixed-level-width", (guint) (gui_scale_factor * AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH), "fixed-level-height", (guint) (gui_scale_factor * AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(wave_editor->scrolled_level_box->viewport), GTK_WIDGET(wave_editor->scrolled_level_box->level_box)); gtk_widget_set_size_request((GtkWidget *) wave_editor->scrolled_level_box, (gint) (gui_scale_factor * AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH), -1); gtk_table_attach(table, (GtkWidget *) wave_editor->scrolled_level_box, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); /* wave edit */ wave_editor->scrolled_wave_edit_box = ags_scrolled_wave_edit_box_new(); wave_editor->scrolled_wave_edit_box->wave_edit_box = (AgsWaveEditBox *) ags_vwave_edit_box_new(); g_object_set(wave_editor->scrolled_wave_edit_box->wave_edit_box, "fixed-edit-height", (guint) (gui_scale_factor * AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(wave_editor->scrolled_wave_edit_box->viewport), GTK_WIDGET(wave_editor->scrolled_wave_edit_box->wave_edit_box)); gtk_table_attach(table, (GtkWidget *) wave_editor->scrolled_wave_edit_box, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_set_events(GTK_WIDGET(wave_editor->scrolled_wave_edit_box->viewport), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK); /* scrollbars */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_HEIGHT), 1.0); wave_editor->vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) wave_editor->vscrollbar, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH), 1.0); wave_editor->hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) wave_editor->hscrollbar, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* focused wave edit */ wave_editor->focused_wave_edit = NULL; /* wave meta */ wave_editor->wave_meta = ags_wave_meta_new(); g_object_set(wave_editor->wave_meta, "valign", GTK_ALIGN_START, NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) wave_editor->wave_meta, FALSE, FALSE, 0); /* style context */ style_context = gtk_widget_get_style_context(wave_editor); gtk_style_context_add_class(style_context, "editor"); } void ags_wave_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_editor_connect(AgsConnectable *connectable) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(connectable); if((AGS_WAVE_EDITOR_CONNECTED & (wave_editor->flags)) != 0){ return; } wave_editor->flags |= AGS_WAVE_EDITOR_CONNECTED; /* edit */ g_signal_connect_after((GObject *) wave_editor->scrolled_wave_edit_box->viewport, "configure_event", G_CALLBACK(ags_wave_editor_edit_configure_event), (gpointer) wave_editor); g_signal_connect_after((GObject *) wave_editor->vscrollbar, "value-changed", G_CALLBACK(ags_wave_editor_vscrollbar_value_changed), (gpointer) wave_editor); g_signal_connect_after((GObject *) wave_editor->hscrollbar, "value-changed", G_CALLBACK(ags_wave_editor_hscrollbar_value_changed), (gpointer) wave_editor); /* */ g_signal_connect((GObject *) wave_editor->machine_selector, "changed", G_CALLBACK(ags_wave_editor_machine_changed_callback), (gpointer) wave_editor); /* */ ags_connectable_connect(AGS_CONNECTABLE(wave_editor->wave_toolbar)); ags_connectable_connect(AGS_CONNECTABLE(wave_editor->machine_selector)); ags_connectable_connect(AGS_CONNECTABLE(wave_editor->wave_meta)); } void ags_wave_editor_disconnect(AgsConnectable *connectable) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(connectable); if((AGS_WAVE_EDITOR_CONNECTED & (wave_editor->flags)) == 0){ return; } wave_editor->flags &= (~AGS_WAVE_EDITOR_CONNECTED); /* edit */ g_object_disconnect((GObject *) wave_editor->scrolled_wave_edit_box->viewport, "any_signal::configure_event", G_CALLBACK(ags_wave_editor_edit_configure_event), wave_editor, NULL); /* */ g_object_disconnect((GObject *) wave_editor->machine_selector, "changed", G_CALLBACK(ags_wave_editor_machine_changed_callback), (gpointer) wave_editor, NULL); ags_connectable_disconnect(AGS_CONNECTABLE(wave_editor->wave_toolbar)); ags_connectable_disconnect(AGS_CONNECTABLE(wave_editor->machine_selector)); ags_connectable_disconnect(AGS_CONNECTABLE(wave_editor->wave_meta)); } void ags_wave_editor_finalize(GObject *gobject) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(gobject); G_OBJECT_CLASS(ags_wave_editor_parent_class)->finalize(gobject); } void ags_wave_editor_reset_scrollbar(AgsWaveEditor *wave_editor) { AgsWaveToolbar *wave_toolbar; GtkAdjustment *vscrollbar_adjustment, *hscrollbar_adjustment; GtkAllocation wave_edit_box_allocation; GtkAllocation viewport_allocation; GList *list_start, *list; gdouble old_h_upper; gdouble v_upper, h_upper; double zoom_factor, zoom; double zoom_correction; guint map_width; wave_toolbar = wave_editor->wave_toolbar; /* reset vertical scrollbar */ gtk_widget_get_allocation(GTK_WIDGET(wave_editor->scrolled_wave_edit_box->wave_edit_box), &wave_edit_box_allocation); gtk_widget_get_allocation(GTK_WIDGET(wave_editor->scrolled_wave_edit_box->viewport), &viewport_allocation); v_upper = wave_edit_box_allocation.height - viewport_allocation.height; if(v_upper < 0.0){ v_upper = 0.0; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_editor->vscrollbar)); gtk_adjustment_set_upper(vscrollbar_adjustment, v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(wave_editor->scrolled_wave_edit_box->viewport), v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(wave_editor->scrolled_level_box->viewport), v_upper); /* reset horizontal scrollbar */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); /* upper */ hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_editor->hscrollbar)); old_h_upper = gtk_adjustment_get_upper(hscrollbar_adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_WAVE_EDITOR_MAX_CONTROLS * zoom * zoom_correction); h_upper = map_width - wave_edit_box_allocation.width; if(h_upper < 0.0){ h_upper = 0.0; } gtk_adjustment_set_upper(wave_editor->ruler->adjustment, h_upper); gtk_adjustment_set_upper(hscrollbar_adjustment, h_upper); /* wave edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(wave_editor->scrolled_wave_edit_box->wave_edit_box)); while(list != NULL){ gtk_adjustment_set_upper(hscrollbar_adjustment, h_upper); list = list->next; } g_list_free(list_start); /* reset value */ if(old_h_upper != 0.0){ #if 0 gtk_adjustment_set_value(hscrollbar_adjustment, gtk_adjustment_get_value(hscrollbar_adjustment) / old_h_upper * h_upper); #endif } } void ags_wave_editor_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_wave_editor_parent_class)->show(widget); gtk_widget_hide(AGS_WAVE_EDITOR(widget)->wave_meta); } void ags_wave_editor_show_all(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_wave_editor_parent_class)->show_all(widget); gtk_widget_hide(AGS_WAVE_EDITOR(widget)->wave_meta); } void ags_wave_editor_real_machine_changed(AgsWaveEditor *wave_editor, AgsMachine *machine) { AgsMachine *old_machine; AgsWaveEdit *wave_edit; AgsLevel *level; AgsConfig *config; GList *list_start, *list; GList *tab; gchar *str; gdouble gui_scale_factor; guint length; guint output_lines, input_lines; guint pads; guint i; if(wave_editor->selected_machine == machine){ return; } old_machine = wave_editor->selected_machine; if(old_machine != NULL){ g_object_disconnect(old_machine, "any_signal::resize-audio-channels", G_CALLBACK(ags_wave_editor_resize_audio_channels_callback), (gpointer) wave_editor, "any_signal::resize-pads", G_CALLBACK(ags_wave_editor_resize_pads_callback), (gpointer) wave_editor, NULL); } config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } /* notebook - remove tabs */ length = g_list_length(wave_editor->notebook->tab); for(i = 0; i < length; i++){ ags_notebook_remove_tab(wave_editor->notebook, 0); } /* */ if(machine != NULL){ g_object_get(machine->audio, "input-lines", &input_lines, NULL); for(i = 0; i < input_lines; i++){ ags_notebook_insert_tab(wave_editor->notebook, i); tab = wave_editor->notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } } /* destroy edit */ list = list_start = gtk_container_get_children(GTK_CONTAINER(wave_editor->scrolled_level_box->level_box)); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); list = list_start = gtk_container_get_children(GTK_CONTAINER(wave_editor->scrolled_wave_edit_box->wave_edit_box)); while(list != NULL){ g_object_disconnect(AGS_WAVE_EDIT(list->data)->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_wave_editor_wave_edit_hscrollbar_value_changed), (gpointer) wave_editor, NULL); gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); /* * add new */ if(machine != NULL){ guint input_lines; g_object_get(machine->audio, "input-lines", &input_lines, NULL); for(i = 0; i < input_lines; i++){ AgsWaveEdit *wave_edit; AgsLevel *level; /* level */ level = ags_level_new(); g_object_set(level, "level-width", (guint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_WIDTH), "level-height", (guint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_HEIGHT), NULL); gtk_box_pack_start(GTK_BOX(wave_editor->scrolled_level_box->level_box), GTK_WIDGET(level), FALSE, TRUE, AGS_WAVE_EDIT_DEFAULT_PADDING); gtk_widget_show(GTK_WIDGET(level)); /* wave edit */ wave_edit = ags_wave_edit_new(i); gtk_box_pack_start(GTK_BOX(wave_editor->scrolled_wave_edit_box->wave_edit_box), GTK_WIDGET(wave_edit), FALSE, FALSE, AGS_WAVE_EDIT_DEFAULT_PADDING); ags_connectable_connect(AGS_CONNECTABLE(wave_edit)); gtk_widget_show(GTK_WIDGET(wave_edit)); g_signal_connect_after((GObject *) wave_edit->hscrollbar, "value-changed", G_CALLBACK(ags_wave_editor_wave_edit_hscrollbar_value_changed), (gpointer) wave_editor); } } /* connect set-pads - new */ if(machine != NULL){ g_signal_connect_after(machine, "resize-audio-channels", G_CALLBACK(ags_wave_editor_resize_audio_channels_callback), wave_editor); g_signal_connect_after(machine, "resize-pads", G_CALLBACK(ags_wave_editor_resize_pads_callback), wave_editor); } /* selected machine */ wave_editor->selected_machine = machine; } /** * ags_wave_editor_machine_changed: * @wave_editor: an #AgsWaveEditor * @machine: the new #AgsMachine * * Is emitted as machine changed of wave editor. * * Since: 3.0.0 */ void ags_wave_editor_machine_changed(AgsWaveEditor *wave_editor, AgsMachine *machine) { g_return_if_fail(AGS_IS_WAVE_EDITOR(wave_editor)); g_object_ref((GObject *) wave_editor); g_signal_emit((GObject *) wave_editor, wave_editor_signals[MACHINE_CHANGED], 0, machine); g_object_unref((GObject *) wave_editor); } void ags_wave_editor_select_region(AgsWaveEditor *wave_editor, guint x0, gdouble y0, guint x1, gdouble y1) { AgsWindow *window; AgsWaveWindow *wave_window; AgsWaveToolbar *wave_toolbar; AgsNotebook *notebook; AgsMachine *machine; AgsWave *wave; AgsTimestamp *timestamp; GObject *soundcard; GList *start_wave_edit, *wave_edit; GList *start_list_wave, *list_wave; gdouble bpm; guint samplerate; guint buffer_size; guint64 relative_offset; guint64 x0_offset, x1_offset; double zoom, zoom_factor; gdouble delay_factor; gint i; if(!AGS_IS_WAVE_EDITOR(wave_editor) || wave_editor->focused_wave_edit == NULL){ return; } if(wave_editor->selected_machine != NULL){ machine = wave_editor->selected_machine; wave_window = (AgsWaveWindow *) gtk_widget_get_ancestor(GTK_WIDGET(wave_editor), AGS_TYPE_WAVE_WINDOW); window = (AgsWindow *) wave_window->parent_window; wave_toolbar = wave_editor->wave_toolbar; notebook = wave_editor->notebook; bpm = gtk_spin_button_get_value(window->navigation->bpm); /* swap values if needed */ if(x0 > x1){ guint tmp; tmp = x0; x0 = x1; x1 = tmp; } if(y0 > y1){ gdouble tmp; tmp = y0; y0 = y1; y1 = tmp; } /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* check all active tabs */ g_object_get(machine->audio, "output-soundcard", &soundcard, "wave", &start_list_wave, "samplerate", &samplerate, "buffer-size", &buffer_size, NULL); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(soundcard)); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; x0_offset = (x0 / 64.0) * delay_factor / (bpm / 60.0) * samplerate; x1_offset = (x1 / 64.0) * delay_factor / (bpm / 60.0) * samplerate; //TODO:JK: improve me x0_offset = buffer_size * floor(x0_offset / buffer_size); x1_offset = buffer_size * ceil(x1_offset / buffer_size); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; start_wave_edit = gtk_container_get_children(GTK_CONTAINER(wave_editor->scrolled_wave_edit_box->wave_edit_box)); i = 0; while((i = ags_notebook_next_active_tab(notebook, i)) != -1){ wave_edit = g_list_nth(start_wave_edit, i); list_wave = start_list_wave; timestamp->timer.ags_offset.offset = relative_offset * floor(x0 / relative_offset); while(timestamp->timer.ags_offset.offset < (relative_offset * floor(x1 / relative_offset)) + relative_offset){ while((list_wave = ags_wave_find_near_timestamp(list_wave, i, timestamp)) != NULL){ ags_wave_add_region_to_selection(list_wave->data, x0_offset, x1_offset, TRUE); /* iterate */ list_wave = list_wave->next; } timestamp->timer.ags_offset.offset += relative_offset; } /* queue draw */ gtk_widget_queue_draw(GTK_WIDGET(wave_edit->data)); i++; } if(soundcard != NULL){ g_object_unref(soundcard); } g_list_free(start_wave_edit); g_list_free_full(start_list_wave, g_object_unref); } } void ags_wave_editor_select_all(AgsWaveEditor *wave_editor) { AgsMachine *machine; AgsNotebook *notebook; GList *start_list_wave, *list_wave; guint samplerate; guint64 relative_offset; guint line; gint i; if(!AGS_IS_WAVE_EDITOR(wave_editor)){ return; } if(wave_editor->selected_machine != NULL){ machine = wave_editor->selected_machine; notebook = wave_editor->notebook; /* check all active tabs */ g_object_get(machine->audio, "wave", &start_list_wave, "samplerate", &samplerate, NULL); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_wave = start_list_wave; while(list_wave != NULL){ g_object_get(list_wave->data, "line", &line, NULL); if(i != line){ list_wave = list_wave->next; continue; } ags_wave_add_all_to_selection(AGS_WAVE(list_wave->data)); list_wave = list_wave->next; } i++; } g_list_free_full(start_list_wave, g_object_unref); /* queue draw */ gtk_widget_queue_draw(GTK_WIDGET(wave_editor->focused_wave_edit)); } } gint ags_wave_editor_paste_wave_all(AgsWaveEditor *wave_editor, AgsMachine *machine, AgsNotebook *notebook, xmlNode *wave_node, AgsTimestamp *timestamp, gboolean match_line, gboolean paste_from_position, guint64 position_x, gint64 *last_x) { AgsWave *wave; GList *start_list_wave, *list_wave; guint64 first_x; guint64 current_x; gint i; GRecMutex *audio_mutex; first_x = -1; /* */ i = 0; while((i = ags_notebook_next_active_tab(notebook, i)) != -1){ g_object_get(machine->audio, "wave", &start_list_wave, NULL); list_wave = ags_wave_find_near_timestamp(start_list_wave, i, timestamp); if(list_wave == NULL){ wave = ags_wave_new((GObject *) machine->audio, i); wave->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; /* add to audio */ ags_audio_add_wave(machine->audio, (GObject *) wave); }else{ wave = AGS_WAVE(list_wave->data); } if(paste_from_position){ xmlNode *child; guint64 x_boundary; ags_wave_insert_from_clipboard_extended(wave, wave_node, TRUE, position_x, 0.0, 0, match_line, FALSE); /* get boundaries */ child = wave_node->children; current_x = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "buffer", 5)){ guint64 tmp; tmp = g_ascii_strtoull(xmlGetProp(child, "x"), NULL, 10); if(tmp > current_x){ current_x = tmp; } } } child = child->next; } x_boundary = g_ascii_strtoull(xmlGetProp(wave_node, "x-boundary"), NULL, 10); if(first_x == -1 || x_boundary < first_x){ first_x = x_boundary; } if(position_x > x_boundary){ current_x += (position_x - x_boundary); }else{ current_x -= (x_boundary - position_x); } if(current_x > last_x[0]){ last_x[0] = current_x; } }else{ xmlNode *child; ags_wave_insert_from_clipboard_extended(wave, wave_node, FALSE, 0, 0.0, 0, match_line, FALSE); /* get boundaries */ child = wave_node->children; current_x = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "buffer", 5)){ guint64 tmp; tmp = g_ascii_strtoull(xmlGetProp(child, "x"), NULL, 10); if(tmp > current_x){ current_x = tmp; } } } child = child->next; } if(current_x > last_x[0]){ last_x[0] = current_x; } } g_list_free_full(start_list_wave, g_object_unref); i++; } return(first_x); } gint ags_wave_editor_paste_wave(AgsWaveEditor *wave_editor, AgsMachine *machine, AgsNotebook *notebook, xmlNode *audio_node, gboolean paste_from_position, guint64 position_x, guint64 relative_offset) { AgsTimestamp *timestamp; xmlNode *wave_list_node, *wave_node; xmlNode *timestamp_node; gint64 first_x, last_x; gboolean match_line; first_x = -1; match_line = ((AGS_WAVE_EDITOR_PASTE_MATCH_LINE & (wave_editor->flags)) != 0) ? TRUE: FALSE; timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = 0; /* paste wave */ wave_list_node = audio_node->children; while(wave_list_node != NULL){ if(wave_list_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(wave_list_node->name, "wave-list", 14)){ wave_node = wave_list_node->children; while(wave_node != NULL){ if(wave_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(wave_node->name, "wave", 9)){ guint64 offset; timestamp_node = wave_node->children; offset = 0; while(timestamp_node != NULL){ if(timestamp_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(timestamp_node->name, "timestamp", 10)){ offset = g_ascii_strtoull(xmlGetProp(timestamp_node, "offset"), NULL, 10); break; } } timestamp_node = timestamp_node->next; } /* 1st attempt */ timestamp->timer.ags_offset.offset = (guint64) relative_offset * floor((double) position_x / (double) relative_offset); first_x = ags_wave_editor_paste_wave_all(wave_editor, machine, notebook, wave_node, timestamp, match_line, paste_from_position, position_x, &last_x); /* 2nd attempt */ timestamp->timer.ags_offset.offset += relative_offset; ags_wave_editor_paste_wave_all(wave_editor, machine, notebook, wave_node, timestamp, match_line, paste_from_position, position_x, &last_x); } } wave_node = wave_node->next; } } } wave_list_node = wave_list_node->next; } g_object_unref(timestamp); return(first_x); } void ags_wave_editor_paste(AgsWaveEditor *wave_editor) { AgsWindow *window; AgsWaveWindow *wave_window; AgsWaveToolbar *wave_toolbar; AgsWaveEdit *wave_edit; AgsNotebook *notebook; AgsMachine *machine; AgsWave *wave; GObject *soundcard; xmlDoc *clipboard; xmlNode *audio_node; xmlNode *wave_node; gchar *buffer; gdouble bpm; guint samplerate; guint64 relative_offset; guint64 position_x; gint64 first_x, last_x; double zoom, zoom_factor; gdouble delay_factor; gboolean paste_from_position; if(!AGS_IS_WAVE_EDITOR(wave_editor) || wave_editor->focused_wave_edit == NULL){ return; } if((machine = wave_editor->selected_machine) != NULL){ machine = wave_editor->selected_machine; wave_window = (AgsWaveWindow *) gtk_widget_get_ancestor(GTK_WIDGET(wave_editor), AGS_TYPE_WAVE_WINDOW); window = (AgsWindow *) wave_window->parent_window; wave_toolbar = wave_editor->wave_toolbar; wave_edit = wave_editor->focused_wave_edit; notebook = wave_editor->notebook; bpm = gtk_spin_button_get_value(window->navigation->bpm); /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* check all active tabs */ g_object_get(machine->audio, "output-soundcard", &soundcard, "samplerate", &samplerate, NULL); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(soundcard)); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; /* get clipboard */ buffer = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); if(buffer == NULL){ if(soundcard != NULL){ g_object_unref(soundcard); } return; } /* get position */ position_x = 0; if(wave_toolbar->selected_edit_mode == wave_toolbar->position){ last_x = 0; paste_from_position = TRUE; position_x = 15.0 * delay_factor * wave_editor->focused_wave_edit->cursor_position_x * samplerate / (16.0 * bpm); #ifdef DEBUG printf("pasting at position: [%u]\n", position_x); #endif }else{ paste_from_position = FALSE; } /* get xml tree */ clipboard = xmlReadMemory(buffer, strlen(buffer), NULL, "UTF-8", XML_PARSE_HUGE); audio_node = xmlDocGetRootElement(clipboard); first_x = -1; /* iterate xml tree */ while(audio_node != NULL){ if(audio_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("audio", audio_node->name, 6)){ wave_node = audio_node->children; // g_message("paste"); first_x = ags_wave_editor_paste_wave(wave_editor, machine, notebook, audio_node, paste_from_position, position_x, relative_offset); break; } } audio_node = audio_node->next; } if(first_x == -1){ first_x = 0; } xmlFreeDoc(clipboard); if(paste_from_position){ gint big_step, small_step; //TODO:JK: implement me } if(soundcard != NULL){ g_object_unref(soundcard); } gtk_widget_queue_draw(GTK_WIDGET(wave_edit)); } } void ags_wave_editor_copy(AgsWaveEditor *wave_editor) { AgsMachine *machine; AgsNotebook *notebook; AgsWave *wave; xmlDoc *clipboard; xmlNode *audio_node, *wave_list_node, *wave_node; GList *start_list_wave, *list_wave; xmlChar *buffer; int size; guint line; gint i; if(!AGS_IS_WAVE_EDITOR(wave_editor) || wave_editor->focused_wave_edit == NULL){ return; } if(wave_editor->selected_machine != NULL){ machine = wave_editor->selected_machine; notebook = wave_editor->notebook; /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); wave_list_node = xmlNewNode(NULL, BAD_CAST "wave-list"); xmlAddChild(audio_node, wave_list_node); /* create wave nodes */ g_object_get(machine->audio, "wave", &start_list_wave, NULL); i = 0; while((i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_wave = start_list_wave; /* copy */ while(list_wave != NULL){ g_object_get(list_wave->data, "line", &line, NULL); if(i != line){ list_wave = list_wave->next; continue; } // g_message("copy %d", i); wave_node = ags_wave_copy_selection(AGS_WAVE(list_wave->data)); xmlAddChild(wave_list_node, wave_node); list_wave = list_wave->next; } i++; } g_list_free_full(start_list_wave, g_object_unref); /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_wave_editor_cut(AgsWaveEditor *wave_editor) { AgsMachine *machine; AgsNotebook *notebook; AgsWave *wave; xmlDoc *clipboard; xmlNode *audio_node; xmlNode *wave_list_node, *wave_node; GList *start_list_wave, *list_wave; xmlChar *buffer; int size; guint line; gint i; if(!AGS_IS_WAVE_EDITOR(wave_editor) || wave_editor->focused_wave_edit == NULL){ return; } if(wave_editor->selected_machine != NULL){ machine = wave_editor->selected_machine; notebook = wave_editor->notebook; /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); wave_list_node = xmlNewNode(NULL, BAD_CAST "wave-list"); xmlAddChild(audio_node, wave_list_node); /* create wave nodes */ g_object_get(machine->audio, "wave", &start_list_wave, NULL); i = 0; while((i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_wave = start_list_wave; /* cut */ while(list_wave != NULL){ g_object_get(list_wave->data, "line", &line, NULL); if(i != line){ list_wave = list_wave->next; continue; } // g_message("cut %d", i); wave_node = ags_wave_cut_selection(AGS_WAVE(list_wave->data)); xmlAddChild(wave_list_node, wave_node); list_wave = list_wave->next; } i++; } g_list_free_full(start_list_wave, g_object_unref); gtk_widget_queue_draw(GTK_WIDGET(wave_editor->focused_wave_edit)); /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_wave_editor_invert(AgsWaveEditor *wave_editor) { g_message("ags_wave_editor_invert() - not implemented"); } /** * ags_wave_editor_new: * * Create a new #AgsWaveEditor. * * Returns: a new #AgsWaveEditor * * Since: 3.0.0 */ AgsWaveEditor* ags_wave_editor_new() { AgsWaveEditor *wave_editor; wave_editor = (AgsWaveEditor *) g_object_new(AGS_TYPE_WAVE_EDITOR, NULL); return(wave_editor); } gsequencer-3.1.3/ags/X/ags_plugin_browser_callbacks.h0000644000175000017500000000263713607210263017634 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_BROWSER_CALLBACKS_H__ #define __AGS_PLUGIN_BROWSER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_plugin_browser_plugin_type_changed_callback(GtkWidget *combo_box, AgsPluginBrowser *plugin_browser); void ags_plugin_browser_ok_callback(GtkWidget *button, AgsPluginBrowser *plugin_browser); void ags_plugin_browser_cancel_callback(GtkWidget *button, AgsPluginBrowser *plugin_browser); G_END_DECLS #endif /*__AGS_PLUGIN_BROWSER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_midi_preferences.h0000644000175000017500000000427513607210263016077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_PREFERENCES_H__ #define __AGS_MIDI_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_PREFERENCES (ags_midi_preferences_get_type()) #define AGS_MIDI_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_PREFERENCES, AgsMidiPreferences)) #define AGS_MIDI_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_PREFERENCES, AgsMidiPreferencesClass)) #define AGS_IS_MIDI_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MIDI_PREFERENCES)) #define AGS_IS_MIDI_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MIDI_PREFERENCES)) #define AGS_MIDI_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MIDI_PREFERENCES, AgsMidiPreferencesClass)) typedef struct _AgsMidiPreferences AgsMidiPreferences; typedef struct _AgsMidiPreferencesClass AgsMidiPreferencesClass; typedef enum{ AGS_MIDI_PREFERENCES_CONNECTED = 1, }AgsMidiPreferencesFlags; struct _AgsMidiPreferences { GtkVBox vbox; guint flags; GtkVBox *sequencer_editor; GtkButton *add; }; struct _AgsMidiPreferencesClass { GtkVBoxClass vbox; }; GType ags_midi_preferences_get_type(void); AgsMidiPreferences* ags_midi_preferences_new(); G_END_DECLS #endif /*__AGS_MIDI_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_generic_preferences.h0000644000175000017500000000465513607210263016573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_GENERIC_PREFERENCES_H__ #define __AGS_GENERIC_PREFERENCES_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_GENERIC_PREFERENCES (ags_generic_preferences_get_type()) #define AGS_GENERIC_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_GENERIC_PREFERENCES, AgsGenericPreferences)) #define AGS_GENERIC_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_GENERIC_PREFERENCES, AgsGenericPreferencesClass)) #define AGS_IS_GENERIC_PREFERENCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_GENERIC_PREFERENCES)) #define AGS_IS_GENERIC_PREFERENCES_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_GENERIC_PREFERENCES)) #define AGS_GENERIC_PREFERENCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_GENERIC_PREFERENCES, AgsGenericPreferencesClass)) typedef struct _AgsGenericPreferences AgsGenericPreferences; typedef struct _AgsGenericPreferencesClass AgsGenericPreferencesClass; typedef enum{ AGS_GENERIC_PREFERENCES_CONNECTED = 1, }AgsGenericPreferencesFlags; struct _AgsGenericPreferences { GtkVBox vbox; guint flags; GtkCheckButton *autosave_thread; GtkComboBox *audio_output_module; GtkComboBoxText *segmentation; GtkComboBoxText *engine_mode; GtkCheckButton *rt_safe; GtkComboBoxText *gui_scale; }; struct _AgsGenericPreferencesClass { GtkVBoxClass vbox; }; GType ags_generic_preferences_get_type(void); AgsGenericPreferences* ags_generic_preferences_new(); G_END_DECLS #endif /*__AGS_GENERIC_PREFERENCES_H__*/ gsequencer-3.1.3/ags/X/ags_wave_window_callbacks.h0000644000175000017500000000206713607210263017121 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_WINDOW_CALLBACKS_H__ #define __AGS_WAVE_WINDOW_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_WAVE_WINDOW_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_midi_dialog.c0000644000175000017500000004630213607210263015025 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_midi_dialog_class_init(AgsMidiDialogClass *midi_dialog); void ags_midi_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_midi_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_midi_dialog_init(AgsMidiDialog *midi_dialog); void ags_midi_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_dialog_connect(AgsConnectable *connectable); void ags_midi_dialog_disconnect(AgsConnectable *connectable); void ags_midi_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_midi_dialog_apply(AgsApplicable *applicable); void ags_midi_dialog_reset(AgsApplicable *applicable); void ags_midi_dialog_show_all(GtkWidget *widget); /** * SECTION:ags_midi_dialog * @short_description: Edit MIDI settings * @title: AgsMidiDialog * @section_id: * @include: ags/X/ags_midi_dialog.h * * #AgsMidiDialog is a composite widget to edit MIDI settings. */ enum{ SET_MACHINE, LAST_SIGNAL, }; enum{ PROP_0, PROP_MACHINE, }; static guint midi_dialog_signals[LAST_SIGNAL]; static gpointer ags_midi_dialog_parent_class = NULL; GType ags_midi_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_dialog = 0; static const GTypeInfo ags_midi_dialog_info = { sizeof (AgsMidiDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_midi_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_midi_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_midi_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsMidiDialog", &ags_midi_dialog_info, 0); g_type_add_interface_static(ags_type_midi_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_midi_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_dialog); } return g_define_type_id__volatile; } void ags_midi_dialog_class_init(AgsMidiDialogClass *midi_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_midi_dialog_parent_class = g_type_class_peek_parent(midi_dialog); /* GObjectClass */ gobject = (GObjectClass *) midi_dialog; gobject->set_property = ags_midi_dialog_set_property; gobject->get_property = ags_midi_dialog_get_property; /* properties */ /** * AgsMachine:machine: * * The #AgsMachine to edit. * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine which this machine editor is assigned with"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) midi_dialog; widget->show_all = ags_midi_dialog_show_all; // widget->delete_event = ags_midi_dialog_delete_event; } void ags_midi_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_midi_dialog_connect; connectable->disconnect = ags_midi_dialog_disconnect; } void ags_midi_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_midi_dialog_set_update; applicable->apply = ags_midi_dialog_apply; applicable->reset = ags_midi_dialog_reset; } void ags_midi_dialog_init(AgsMidiDialog *midi_dialog) { GtkLabel *label; GtkTable *table; GtkHBox *hbox; gtk_window_set_title((GtkWindow *) midi_dialog, g_strdup("MIDI connection")); midi_dialog->flags = 0; midi_dialog->version = AGS_MIDI_DIALOG_DEFAULT_VERSION; midi_dialog->build_id = AGS_MIDI_DIALOG_DEFAULT_BUILD_ID; midi_dialog->machine = NULL; /* connection */ midi_dialog->io_options = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(midi_dialog)), GTK_WIDGET(midi_dialog->io_options), FALSE, FALSE, 0); /* midi channel */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) midi_dialog->io_options, GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("midi channel")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); midi_dialog->midi_channel = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 15.0, 1.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(midi_dialog->midi_channel), FALSE, FALSE, 0); /* playback */ midi_dialog->playback = NULL; // midi_dialog->playback = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("playback")); // gtk_box_pack_start((GtkBox *) midi_dialog->io_options, // GTK_WIDGET(midi_dialog->playback), // FALSE, FALSE, // 0); /* record */ midi_dialog->record = NULL; // midi_dialog->record = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("record")); // gtk_box_pack_start((GtkBox *) midi_dialog->io_options, // GTK_WIDGET(midi_dialog->record), // FALSE, FALSE, // 0); /* mapping */ midi_dialog->mapping = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(midi_dialog)), GTK_WIDGET(midi_dialog->mapping), FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(4, 2, FALSE); gtk_box_pack_start((GtkBox *) midi_dialog->mapping, GTK_WIDGET(table), FALSE, FALSE, 0); /* audio start */ label = (GtkLabel *) gtk_label_new(i18n("audio start mapping")); g_object_set(label, "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); midi_dialog->audio_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(midi_dialog->audio_start), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* audio end */ label = (GtkLabel *) gtk_label_new(i18n("audio end mapping")); g_object_set(label, "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); midi_dialog->audio_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(midi_dialog->audio_end), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* midi start */ label = (GtkLabel *) gtk_label_new(i18n("midi start mapping")); g_object_set(label, "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); midi_dialog->midi_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 128.0, 1.0); gtk_table_attach(table, GTK_WIDGET(midi_dialog->midi_start), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* midi end */ label = (GtkLabel *) gtk_label_new(i18n("midi end mapping")); g_object_set(label, "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); midi_dialog->midi_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 128.0, 1.0); gtk_table_attach(table, GTK_WIDGET(midi_dialog->midi_end), 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* device */ midi_dialog->device = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(midi_dialog)), GTK_WIDGET(midi_dialog->device), FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_box_pack_start((GtkBox *) midi_dialog->device, GTK_WIDGET(table), FALSE, FALSE, 0); /* midi device */ label = (GtkLabel *) gtk_label_new(i18n("midi device")); g_object_set(label, "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); midi_dialog->midi_device = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(midi_dialog->midi_device), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* GtkButton's in GtkDialog->action_area */ midi_dialog->apply = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_APPLY); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(midi_dialog)), (GtkWidget *) midi_dialog->apply, FALSE, FALSE, 0); midi_dialog->ok = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(midi_dialog)), (GtkWidget *) midi_dialog->ok, FALSE, FALSE, 0); midi_dialog->cancel = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(midi_dialog)), (GtkWidget *) midi_dialog->cancel, FALSE, FALSE, 0); } void ags_midi_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiDialog *midi_dialog; midi_dialog = AGS_MIDI_DIALOG(gobject); switch(prop_id){ case PROP_MACHINE: { AgsMachine *machine; machine = (AgsMachine *) g_value_get_object(value); if(machine == midi_dialog->machine){ return; } if(midi_dialog->machine != NULL){ g_object_unref(midi_dialog->machine); } if(machine != NULL){ g_object_ref(machine); } midi_dialog->machine = machine; /* set cards */ ags_midi_dialog_load_sequencers(midi_dialog); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiDialog *midi_dialog; midi_dialog = AGS_MIDI_DIALOG(gobject); switch(prop_id){ case PROP_MACHINE: { g_value_set_object(value, midi_dialog->machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_dialog_connect(AgsConnectable *connectable) { AgsMidiDialog *midi_dialog; midi_dialog = AGS_MIDI_DIALOG(connectable); if((AGS_MIDI_DIALOG_CONNECTED & (midi_dialog->flags)) != 0){ return; } midi_dialog->flags |= AGS_MIDI_DIALOG_CONNECTED; g_signal_connect((GObject *) midi_dialog, "delete-event", G_CALLBACK(ags_midi_dialog_delete_event), (gpointer) midi_dialog); /* applicable */ g_signal_connect((GObject *) midi_dialog->apply, "clicked", G_CALLBACK(ags_midi_dialog_apply_callback), (gpointer) midi_dialog); g_signal_connect((GObject *) midi_dialog->ok, "clicked", G_CALLBACK(ags_midi_dialog_ok_callback), (gpointer) midi_dialog); g_signal_connect((GObject *) midi_dialog->cancel, "clicked", G_CALLBACK(ags_midi_dialog_cancel_callback), (gpointer) midi_dialog); } void ags_midi_dialog_disconnect(AgsConnectable *connectable) { AgsMidiDialog *midi_dialog; midi_dialog = AGS_MIDI_DIALOG(connectable); if((AGS_MIDI_DIALOG_CONNECTED & (midi_dialog->flags)) == 0){ return; } midi_dialog->flags &= (~AGS_MIDI_DIALOG_CONNECTED); /* applicable */ g_object_disconnect((GObject *) midi_dialog->apply, "any_signal::clicked", G_CALLBACK(ags_midi_dialog_apply_callback), (gpointer) midi_dialog, NULL); g_object_disconnect((GObject *) midi_dialog->ok, "any_signal::clicked", G_CALLBACK(ags_midi_dialog_ok_callback), (gpointer) midi_dialog, NULL); g_object_disconnect((GObject *) midi_dialog->cancel, "any_signal::clicked", G_CALLBACK(ags_midi_dialog_cancel_callback), (gpointer) midi_dialog, NULL); } void ags_midi_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_midi_dialog_apply(AgsApplicable *applicable) { AgsMidiDialog *midi_dialog; AgsMachine *machine; AgsAudio *audio; GObject *sequencer; GtkTreeIter tree_iter; midi_dialog = AGS_MIDI_DIALOG(applicable); machine = midi_dialog->machine; /* audio and sequencer */ audio = machine->audio; gtk_combo_box_get_active_iter(GTK_COMBO_BOX(midi_dialog->midi_device), &tree_iter); gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(midi_dialog->midi_device)), &tree_iter, 1, &sequencer, -1); /* set properties */ g_object_set(audio, "midi-channel", gtk_spin_button_get_value_as_int(midi_dialog->midi_channel), "audio-start-mapping", gtk_spin_button_get_value_as_int(midi_dialog->audio_start), "audio-end-mapping", gtk_spin_button_get_value_as_int(midi_dialog->audio_end), "midi-start-mapping", gtk_spin_button_get_value_as_int(midi_dialog->midi_start), "midi-end-mapping", gtk_spin_button_get_value_as_int(midi_dialog->midi_end), "input-sequencer", sequencer, NULL); } void ags_midi_dialog_reset(AgsApplicable *applicable) { AgsMidiDialog *midi_dialog; AgsMachine *machine; AgsAudio *audio; GObject *sequencer; GObject *current; GList *list; GtkTreeModel *model; GtkTreeIter iter; guint midi_channel; guint audio_start, audio_end; guint midi_start, midi_end; guint i; gboolean found_device; midi_dialog = AGS_MIDI_DIALOG(applicable); machine = midi_dialog->machine; /* audio and sequencer */ audio = machine->audio; /* */ g_object_get(audio, "midi-channel", &midi_channel, "audio-start-mapping", &audio_start, "audio-end-mapping", &audio_end, "midi-start-mapping", &midi_start, "midi-end-mapping", &midi_end, "input-sequencer", &sequencer, NULL); /* mapping */ gtk_spin_button_set_value(midi_dialog->midi_channel, (gdouble) midi_channel); gtk_spin_button_set_value(midi_dialog->audio_start, (gdouble) audio_start); gtk_spin_button_set_value(midi_dialog->audio_end, (gdouble) audio_end); gtk_spin_button_set_value(midi_dialog->midi_start, (gdouble) midi_start); gtk_spin_button_set_value(midi_dialog->midi_end, (gdouble) midi_end); /* load midi devices */ ags_midi_dialog_load_sequencers(midi_dialog); /* find device */ found_device = FALSE; if(sequencer != NULL){ model = gtk_combo_box_get_model(GTK_COMBO_BOX(midi_dialog->midi_device)); i = 0; if(model != NULL && gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 1, ¤t, -1); if(current == sequencer){ found_device = TRUE; break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } g_object_unref(sequencer); } if(found_device){ gtk_combo_box_set_active(GTK_COMBO_BOX(midi_dialog->midi_device), i); }else{ gtk_combo_box_set_active(GTK_COMBO_BOX(midi_dialog->midi_device), 0); } } void ags_midi_dialog_load_sequencers(AgsMidiDialog *midi_dialog) { AgsWindow *window; GObject *sequencer; GtkListStore *model; AgsAudio *audio; AgsApplicationContext *application_context; GtkTreeIter iter; GList *start_list, *list; gchar *midi_device; window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) midi_dialog->machine, AGS_TYPE_WINDOW); /* application context and mutex manager */ application_context = ags_application_context_get_instance(); /* clear model */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(midi_dialog->midi_device)))); /* tree model */ model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_POINTER); /* null device */ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "NULL", 1, NULL, -1); /* load sequencer */ list = start_list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, ags_sequencer_get_device(AGS_SEQUENCER(list->data)), 1, list->data, -1); list = list->next; } g_list_free_full(start_list, g_object_unref); gtk_combo_box_set_model(GTK_COMBO_BOX(midi_dialog->midi_device), GTK_TREE_MODEL(model)); } void ags_midi_dialog_show_all(GtkWidget *widget) { AgsMidiDialog *midi_dialog; midi_dialog = (AgsMidiDialog *) widget; if((AGS_MIDI_DIALOG_IO_OPTIONS & (midi_dialog->flags)) != 0){ gtk_widget_show_all((GtkWidget *) midi_dialog->io_options); } if((AGS_MIDI_DIALOG_MAPPING & (midi_dialog->flags)) != 0){ gtk_widget_show_all((GtkWidget *) midi_dialog->mapping); } if((AGS_MIDI_DIALOG_DEVICE & (midi_dialog->flags)) != 0){ gtk_widget_show_all((GtkWidget *) midi_dialog->device); } gtk_widget_show(widget); gtk_widget_show((GtkWidget *) midi_dialog->apply); gtk_widget_show((GtkWidget *) midi_dialog->ok); gtk_widget_show((GtkWidget *) midi_dialog->cancel); } /** * ags_midi_dialog_new: * @machine: the assigned machine. * * Creates an #AgsMidiDialog * * Returns: a new #AgsMidiDialog * * Since: 3.0.0 */ AgsMidiDialog* ags_midi_dialog_new(AgsMachine *machine) { AgsMidiDialog *midi_dialog; midi_dialog = (AgsMidiDialog *) g_object_new(AGS_TYPE_MIDI_DIALOG, "machine", machine, NULL); return(midi_dialog); } gsequencer-3.1.3/ags/X/ags_dssi_browser.c0000644000175000017500000002530313607210263015267 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_dssi_browser_class_init(AgsDssiBrowserClass *dssi_browser); void ags_dssi_browser_init(AgsDssiBrowser *dssi_browser); void ags_dssi_browser_connectable_interface_init(AgsConnectableInterface *connectable); void ags_dssi_browser_applicable_interface_init(AgsApplicableInterface *applicable); void ags_dssi_browser_connect(AgsConnectable *connectable); void ags_dssi_browser_disconnect(AgsConnectable *connectable); void ags_dssi_browser_set_update(AgsApplicable *applicable, gboolean update); void ags_dssi_browser_apply(AgsApplicable *applicable); void ags_dssi_browser_reset(AgsApplicable *applicable); /** * SECTION:ags_dssi_browser * @short_description: A composite to select dssi effect. * @title: AgsDssiBrowser * @section_id: * @include: ags/X/ags_dssi_browser.h * * #AgsDssiBrowser is a composite widget to select dssi plugin and the desired * effect. */ GType ags_dssi_browser_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_dssi_browser = 0; static const GTypeInfo ags_dssi_browser_info = { sizeof (AgsDssiBrowserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_dssi_browser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsDssiBrowser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_dssi_browser_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_dssi_browser_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_dssi_browser_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_dssi_browser = g_type_register_static(GTK_TYPE_VBOX, "AgsDssiBrowser", &ags_dssi_browser_info, 0); g_type_add_interface_static(ags_type_dssi_browser, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_dssi_browser, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_dssi_browser); } return g_define_type_id__volatile; } void ags_dssi_browser_class_init(AgsDssiBrowserClass *dssi_browser) { /* empty */ } void ags_dssi_browser_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_dssi_browser_connect; connectable->disconnect = ags_dssi_browser_disconnect; } void ags_dssi_browser_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_dssi_browser_set_update; applicable->apply = ags_dssi_browser_apply; applicable->reset = ags_dssi_browser_reset; } void ags_dssi_browser_init(AgsDssiBrowser *dssi_browser) { GtkTable *table; GtkComboBoxText *combo_box; GtkLabel *label; AgsDssiManager *dssi_manager; GList *list; gchar *str; gchar **filenames, **filenames_start; dssi_browser->flags = 0; dssi_manager = ags_dssi_manager_get_instance(); /* plugin */ dssi_browser->plugin = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(dssi_browser), GTK_WIDGET(dssi_browser->plugin), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("filename: ")); gtk_box_pack_start(GTK_BOX(dssi_browser->plugin), GTK_WIDGET(label), FALSE, FALSE, 0); dssi_browser->filename = (GtkComboBox *) gtk_combo_box_text_new(); combo_box = (GtkComboBoxText *) dssi_browser->filename; gtk_box_pack_start(GTK_BOX(dssi_browser->plugin), GTK_WIDGET(combo_box), FALSE, FALSE, 0); dssi_browser->path = NULL; ags_dssi_manager_load_default_directory(dssi_manager); filenames = filenames_start = ags_dssi_manager_get_filenames(dssi_manager); while(*filenames != NULL){ gtk_combo_box_text_append_text(combo_box, *filenames); filenames++; } g_strfreev(filenames_start); label = (GtkLabel *) gtk_label_new(i18n("effect: ")); gtk_box_pack_start(GTK_BOX(dssi_browser->plugin), GTK_WIDGET(label), FALSE, FALSE, 0); dssi_browser->effect = (GtkComboBox *) gtk_combo_box_text_new(); combo_box = (GtkComboBoxText *) dssi_browser->effect; gtk_box_pack_start(GTK_BOX(dssi_browser->plugin), GTK_WIDGET(combo_box), FALSE, FALSE, 0); /* description */ dssi_browser->description = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(dssi_browser), GTK_WIDGET(dssi_browser->description), FALSE, FALSE, 0); dssi_browser->label = label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Label: "), NULL); gtk_box_pack_start(GTK_BOX(dssi_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); dssi_browser->maker = label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Maker: "), NULL); gtk_box_pack_start(GTK_BOX(dssi_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); dssi_browser->copyright = label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Copyright: "), NULL); gtk_box_pack_start(GTK_BOX(dssi_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", i18n("Ports: "), NULL); gtk_box_pack_start(GTK_BOX(dssi_browser->description), GTK_WIDGET(label), FALSE, FALSE, 0); dssi_browser->port_table = table = (GtkTable *) gtk_table_new(256, 2, FALSE); gtk_box_pack_start(GTK_BOX(dssi_browser->description), GTK_WIDGET(table), FALSE, FALSE, 0); dssi_browser->preview = NULL; } void ags_dssi_browser_connect(AgsConnectable *connectable) { AgsDssiBrowser *dssi_browser; dssi_browser = AGS_DSSI_BROWSER(connectable); if((AGS_DSSI_BROWSER_CONNECTED & (dssi_browser->flags)) != 0){ return; } dssi_browser->flags |= AGS_DSSI_BROWSER_CONNECTED; g_signal_connect_after(G_OBJECT(dssi_browser->filename), "changed", G_CALLBACK(ags_dssi_browser_plugin_filename_callback), dssi_browser); g_signal_connect_after(G_OBJECT(dssi_browser->effect), "changed", G_CALLBACK(ags_dssi_browser_plugin_effect_callback), dssi_browser); } void ags_dssi_browser_disconnect(AgsConnectable *connectable) { AgsDssiBrowser *dssi_browser; dssi_browser = AGS_DSSI_BROWSER(connectable); if((AGS_DSSI_BROWSER_CONNECTED & (dssi_browser->flags)) == 0){ return; } dssi_browser->flags &= (~AGS_DSSI_BROWSER_CONNECTED); g_object_disconnect(G_OBJECT(dssi_browser->filename), "changed", G_CALLBACK(ags_dssi_browser_plugin_filename_callback), dssi_browser, NULL); g_object_disconnect(G_OBJECT(dssi_browser->effect), "changed", G_CALLBACK(ags_dssi_browser_plugin_effect_callback), dssi_browser, NULL); } void ags_dssi_browser_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_dssi_browser_apply(AgsApplicable *applicable) { /* empty */ } void ags_dssi_browser_reset(AgsApplicable *applicable) { AgsDssiBrowser *dssi_browser; GtkComboBoxText *filename; GList *list; dssi_browser = AGS_DSSI_BROWSER(applicable); list = gtk_container_get_children(GTK_CONTAINER(dssi_browser->plugin)); filename = GTK_COMBO_BOX_TEXT(list->next->data); g_list_free(list); gtk_combo_box_set_active((GtkComboBox *) filename, 0); } /** * ags_dssi_browser_get_plugin_filename: * @dssi_browser: the #AgsDssiBrowser * * Retrieve selected dssi plugin filename. * * Returns: the active dssi filename * * Since: 3.0.0 */ gchar* ags_dssi_browser_get_plugin_filename(AgsDssiBrowser *dssi_browser) { if(!AGS_IS_DSSI_BROWSER(dssi_browser)){ return(NULL); } return(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dssi_browser->filename))); } /** * ags_dssi_browser_get_plugin_effect: * @dssi_browser: the #AgsDssiBrowser * * Retrieve selected dssi effect. * * Returns: the active dssi effect * * Since: 3.0.0 */ gchar* ags_dssi_browser_get_plugin_effect(AgsDssiBrowser *dssi_browser) { if(!AGS_IS_DSSI_BROWSER(dssi_browser)){ return(NULL); } return(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(dssi_browser->effect))); } /** * ags_dssi_browser_combo_box_controls_new: * * Creates a #GtkComboBox containing suitable widgets as controls. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkWidget* ags_dssi_browser_combo_box_controls_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "spin button"); gtk_combo_box_text_append_text(combo_box, "dial"); gtk_combo_box_text_append_text(combo_box, "vertical scale"); gtk_combo_box_text_append_text(combo_box, "horizontal scale"); gtk_combo_box_set_active((GtkComboBox *) combo_box, 1); return((GtkWidget *) combo_box); } GtkWidget* ags_dssi_browser_preview_new() { GtkWidget *preview; preview = NULL; //TODO:JK: implement me return(preview); } /** * ags_dssi_browser_new: * * Create a new instance of #AgsDssiBrowser * * Returns: the new #AgsDssiBrowser * * Since: 3.0.0 */ AgsDssiBrowser* ags_dssi_browser_new() { AgsDssiBrowser *dssi_browser; dssi_browser = (AgsDssiBrowser *) g_object_new(AGS_TYPE_DSSI_BROWSER, "homogeneous", FALSE, "spacing", 0, NULL); return(dssi_browser); } gsequencer-3.1.3/ags/X/ags_generic_preferences.c0000644000175000017500000003234213607210263016560 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_generic_preferences_class_init(AgsGenericPreferencesClass *generic_preferences); void ags_generic_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_generic_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_generic_preferences_init(AgsGenericPreferences *generic_preferences); static void ags_generic_preferences_finalize(GObject *gobject); void ags_generic_preferences_connect(AgsConnectable *connectable); void ags_generic_preferences_disconnect(AgsConnectable *connectable); void ags_generic_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_generic_preferences_apply(AgsApplicable *applicable); void ags_generic_preferences_reset(AgsApplicable *applicable); GtkListStore* ags_generic_preferences_create_segmentation(); /** * SECTION:ags_generic_preferences * @short_description: A composite widget to do generic related preferences * @title: AgsGenericPreferences * @section_id: * @include: ags/X/ags_generic_preferences.h * * #AgsGenericPreferences enables you to make generic related preferences. */ static gpointer ags_generic_preferences_parent_class = NULL; GType ags_generic_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_generic_preferences = 0; static const GTypeInfo ags_generic_preferences_info = { sizeof (AgsGenericPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_generic_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsGenericPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_generic_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_generic_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_generic_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_generic_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsGenericPreferences", &ags_generic_preferences_info, 0); g_type_add_interface_static(ags_type_generic_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_generic_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_generic_preferences); } return g_define_type_id__volatile; } void ags_generic_preferences_class_init(AgsGenericPreferencesClass *generic_preferences) { GObjectClass *gobject; ags_generic_preferences_parent_class = g_type_class_peek_parent(generic_preferences); /* GtkObjectClass */ gobject = (GObjectClass *) generic_preferences; gobject->finalize = ags_generic_preferences_finalize; } void ags_generic_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_generic_preferences_connect; connectable->disconnect = ags_generic_preferences_disconnect; } void ags_generic_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_generic_preferences_set_update; applicable->apply = ags_generic_preferences_apply; applicable->reset = ags_generic_preferences_reset; } void ags_generic_preferences_init(AgsGenericPreferences *generic_preferences) { GtkHBox *hbox; GtkLabel *label; generic_preferences->autosave_thread = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("autosave thread")); gtk_box_pack_start(GTK_BOX(generic_preferences), GTK_WIDGET(generic_preferences->autosave_thread), FALSE, FALSE, 0); /* segmentation */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(generic_preferences), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("segmentation")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); generic_preferences->segmentation = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_set_model((GtkComboBox *) generic_preferences->segmentation, (GtkTreeModel *) ags_generic_preferences_create_segmentation()); gtk_combo_box_set_active(GTK_COMBO_BOX(generic_preferences->segmentation), 2); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(generic_preferences->segmentation), FALSE, FALSE, 0); /* engine mode */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(generic_preferences), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("engine mode")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); generic_preferences->engine_mode = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(generic_preferences->engine_mode, "deterministic"); gtk_combo_box_text_append_text(generic_preferences->engine_mode, "performance"); gtk_combo_box_set_active(GTK_COMBO_BOX(generic_preferences->engine_mode), 0); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(generic_preferences->engine_mode), FALSE, FALSE, 0); /* rt-safe */ generic_preferences->rt_safe = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("rt-safe")); gtk_box_pack_start(GTK_BOX(generic_preferences), GTK_WIDGET(generic_preferences->rt_safe), FALSE, FALSE, 0); /* GUI scale factor */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(generic_preferences), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("GUI scale factor")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); generic_preferences->gui_scale = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(generic_preferences->gui_scale, "1.0"); gtk_combo_box_text_append_text(generic_preferences->gui_scale, "1.25"); gtk_combo_box_text_append_text(generic_preferences->gui_scale, "2.0"); gtk_combo_box_set_active(GTK_COMBO_BOX(generic_preferences->gui_scale), 0); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(generic_preferences->gui_scale), FALSE, FALSE, 0); } static void ags_generic_preferences_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_generic_preferences_parent_class)->finalize(gobject); } void ags_generic_preferences_connect(AgsConnectable *connectable) { AgsGenericPreferences *generic_preferences; generic_preferences = AGS_GENERIC_PREFERENCES(connectable); if((AGS_GENERIC_PREFERENCES_CONNECTED & (generic_preferences->flags)) != 0){ return; } generic_preferences->flags |= AGS_GENERIC_PREFERENCES_CONNECTED; g_signal_connect_after(G_OBJECT(generic_preferences->rt_safe), "clicked", G_CALLBACK(ags_generic_preferences_rt_safe_callback), generic_preferences); } void ags_generic_preferences_disconnect(AgsConnectable *connectable) { AgsGenericPreferences *generic_preferences; generic_preferences = AGS_GENERIC_PREFERENCES(connectable); if((AGS_GENERIC_PREFERENCES_CONNECTED & (generic_preferences->flags)) == 0){ return; } generic_preferences->flags &= (~AGS_GENERIC_PREFERENCES_CONNECTED); g_object_disconnect(G_OBJECT(generic_preferences->rt_safe), "any_signal::clicked", G_CALLBACK(ags_generic_preferences_rt_safe_callback), generic_preferences, NULL); } void ags_generic_preferences_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_generic_preferences_apply(AgsApplicable *applicable) { AgsGenericPreferences *generic_preferences; AgsConfig *config; generic_preferences = AGS_GENERIC_PREFERENCES(applicable); config = ags_config_get_instance(); ags_config_set_value(config, AGS_CONFIG_GENERIC, "disable-feature", "experimental"); if(gtk_toggle_button_get_active((GtkToggleButton *) generic_preferences->autosave_thread)){ ags_config_set_value(config, AGS_CONFIG_GENERIC, "autosave-thread", "true"); }else{ ags_config_set_value(config, AGS_CONFIG_GENERIC, "autosave-thread", "false"); } ags_config_set_value(config, AGS_CONFIG_GENERIC, "segmentation", gtk_combo_box_text_get_active_text(generic_preferences->segmentation)); ags_config_set_value(config, AGS_CONFIG_GENERIC, "engine-mode", gtk_combo_box_text_get_active_text(generic_preferences->engine_mode)); ags_config_set_value(config, AGS_CONFIG_GENERIC, "rt-safe", (gtk_toggle_button_get_active((GtkToggleButton *) generic_preferences->rt_safe) ? "true": "false")); ags_config_set_value(config, AGS_CONFIG_GENERIC, "gui-scale", gtk_combo_box_text_get_active_text(generic_preferences->gui_scale)); } void ags_generic_preferences_reset(AgsApplicable *applicable) { AgsGenericPreferences *generic_preferences; AgsConfig *config; gchar *str; generic_preferences = AGS_GENERIC_PREFERENCES(applicable); config = ags_config_get_instance(); /* auto-save thread */ str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "autosave-thread"); if(str != NULL){ gtk_toggle_button_set_active((GtkToggleButton *) generic_preferences->autosave_thread, ((!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE)); }else{ gtk_toggle_button_set_active((GtkToggleButton *) generic_preferences->autosave_thread, FALSE); } g_free(str); /* engine mode */ str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "engine-mode"); if(str != NULL){ if(!g_ascii_strncasecmp(str, "performance", 12)){ gtk_combo_box_set_active((GtkComboBox *) generic_preferences->engine_mode, 1); }else{ gtk_combo_box_set_active((GtkComboBox *) generic_preferences->engine_mode, 0); } } g_free(str); /* rt-safe */ str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "rt-safe"); if(str != NULL && !g_ascii_strncasecmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) generic_preferences->rt_safe, TRUE); } g_free(str); /* GUI scale factor */ str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ if(!g_ascii_strncasecmp(str, "1.0", 4)){ gtk_combo_box_set_active((GtkComboBox *) generic_preferences->gui_scale, 0); }else if(!g_ascii_strncasecmp(str, "1.25", 5)){ gtk_combo_box_set_active((GtkComboBox *) generic_preferences->gui_scale, 1); }else if(!g_ascii_strncasecmp(str, "2.0", 4)){ gtk_combo_box_set_active((GtkComboBox *) generic_preferences->gui_scale, 2); } } g_free(str); } GtkListStore* ags_generic_preferences_create_segmentation() { GtkListStore *model; GtkTreeIter iter; model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "1/1", 1, 1, 2, 1, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "3/4", 1, 4, 2, 4, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "4/4", 1, 4, 2, 4, -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "8/8", 1, 4, 2, 4, -1); return(model); } /** * ags_generic_preferences_new: * * Creates an #AgsGenericPreferences * * Returns: a new #AgsGenericPreferences * * Since: 3.0.0 */ AgsGenericPreferences* ags_generic_preferences_new() { AgsGenericPreferences *generic_preferences; generic_preferences = (AgsGenericPreferences *) g_object_new(AGS_TYPE_GENERIC_PREFERENCES, NULL); return(generic_preferences); } gsequencer-3.1.3/ags/X/ags_effect_line.h0000644000175000017500000001075113607210263015033 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_LINE_H__ #define __AGS_EFFECT_LINE_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EFFECT_LINE (ags_effect_line_get_type()) #define AGS_EFFECT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EFFECT_LINE, AgsEffectLine)) #define AGS_EFFECT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EFFECT_LINE, AgsEffectLineClass)) #define AGS_IS_EFFECT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EFFECT_LINE)) #define AGS_IS_EFFECT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EFFECT_LINE)) #define AGS_EFFECT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EFFECT_LINE, AgsEffectLineClass)) #define AGS_EFFECT_LINE_DEFAULT_VERSION "0.7.8" #define AGS_EFFECT_LINE_DEFAULT_BUILD_ID "CEST 01-03-2016 00:23" #define AGS_EFFECT_LINE_COLUMNS_COUNT (2) #define AGS_EFFECT_LINE_SEPARATOR_FILENAME "ags-effect-line-separator-filename" #define AGS_EFFECT_LINE_SEPARATOR_EFFECT "ags-effect-line-separator-effect" typedef struct _AgsEffectLine AgsEffectLine; typedef struct _AgsEffectLineClass AgsEffectLineClass; typedef enum{ AGS_EFFECT_LINE_CONNECTED = 1, AGS_EFFECT_LINE_MAPPED_RECALL = 1 << 1, AGS_EFFECT_LINE_PREMAPPED_RECALL = 1 << 2, }AgsEffectLineFlags; struct _AgsEffectLine { GtkVBox vbox; guint flags; gchar *name; gchar *version; gchar *build_id; guint samplerate; guint buffer_size; guint format; AgsChannel *channel; GtkLabel *label; GtkToggleButton *group; GtkTable *table; GList *queued_drawing; }; struct _AgsEffectLineClass { GtkVBoxClass vbox; void (*samplerate_changed)(AgsEffectLine *effect_line, guint samplerate, guint old_samplerate); void (*buffer_size_changed)(AgsEffectLine *effect_line, guint buffer_size, guint old_buffer_size); void (*format_changed)(AgsEffectLine *effect_line, guint format, guint old_format); void (*set_channel)(AgsEffectLine *effect_line, AgsChannel *channel); GList* (*add_effect)(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect); void (*remove_effect)(AgsEffectLine *effect_line, guint nth); void (*map_recall)(AgsEffectLine *effect_line, guint output_pad_start); GList* (*find_port)(AgsEffectLine *effect_line); void (*done)(AgsEffectLine *effect_line, GObject *recall_id); }; GType ags_effect_line_get_type(void); void ags_effect_line_samplerate_changed(AgsEffectLine *effect_line, guint samplerate, guint old_samplerate); void ags_effect_line_buffer_size_changed(AgsEffectLine *effect_line, guint buffer_size, guint old_buffer_size); void ags_effect_line_format_changed(AgsEffectLine *effect_line, guint format, guint old_format); void ags_effect_line_set_channel(AgsEffectLine *effect_line, AgsChannel *channel); GList* ags_effect_line_add_effect(AgsEffectLine *effect_line, GList *control_type_name, gchar *filename, gchar *effect); void ags_effect_line_remove_effect(AgsEffectLine *effect_line, guint nth); void ags_effect_line_map_recall(AgsEffectLine *effect_line, guint output_pad_start); GList* ags_effect_line_find_port(AgsEffectLine *effect_line); void ags_effect_line_done(AgsEffectLine *effect_line, GObject *recall_id); GList* ags_effect_line_find_next_grouped(GList *effect_line); void ags_effect_line_check_message(AgsEffectLine *effect_line); gboolean ags_effect_line_indicator_queue_draw_timeout(GtkWidget *widget); AgsEffectLine* ags_effect_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_EFFECT_LINE_H__*/ gsequencer-3.1.3/ags/X/ags_output_editor_callbacks.c0000644000175000017500000000354613607210263017474 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_output_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsOutputEditor *output_editor) { AgsMachine *machine; AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel; if(old_parent != NULL){ return; } //TODO:JK: missing mutex line_editor = (AgsLineEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_LINE_EDITOR); if(line_editor != NULL){ channel = line_editor->channel; if(channel != NULL){ GtkTreeIter iter; audio = AGS_AUDIO(channel->audio); if(audio != NULL){ machine = AGS_MACHINE(audio->machine_widget); gtk_combo_box_set_model(GTK_COMBO_BOX(output_editor->soundcard), GTK_TREE_MODEL(ags_machine_get_possible_audio_output_connections(machine))); ags_output_editor_check(output_editor); } } } } void ags_output_editor_soundcard_callback(GtkComboBoxText *combo_text, AgsOutputEditor *output_editor) { ags_output_editor_check(output_editor); } gsequencer-3.1.3/ags/X/ags_machine_editor_callbacks.h0000644000175000017500000000256213607210263017542 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_EDITOR_CALLBACKS_H__ #define __AGS_MACHINE_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS int ags_machine_editor_apply_callback(GtkWidget *widget, AgsMachineEditor *machine_editor); int ags_machine_editor_ok_callback(GtkWidget *widget, AgsMachineEditor *machine_editor); int ags_machine_editor_cancel_callback(GtkWidget *widget, AgsMachineEditor *machine_editor); G_END_DECLS #endif /*__AGS_MACHINE_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/export/0000755000175000017500000000000013622252261013163 500000000000000gsequencer-3.1.3/ags/X/export/ags_machine_collection_entry_callbacks.c0000644000175000017500000000150313605312646023144 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/export/ags_machine_collection.h0000644000175000017500000000510213607210263017722 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_COLLECTION_H__ #define __AGS_MACHINE_COLLECTION_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE_COLLECTION (ags_machine_collection_get_type()) #define AGS_MACHINE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE_COLLECTION, AgsMachineCollection)) #define AGS_MACHINE_COLLECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE_COLLECTION, AgsMachineCollectionClass)) #define AGS_IS_MACHINE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MACHINE_COLLECTION)) #define AGS_IS_MACHINE_COLLECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MACHINE_COLLECTION)) #define AGS_MACHINE_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MACHINE_COLLECTION, AgsMachineCollectionClass)) typedef struct _AgsMachineCollection AgsMachineCollection; typedef struct _AgsMachineCollectionClass AgsMachineCollectionClass; typedef enum{ AGS_MACHINE_COLLECTION_CONNECTED = 1, }AgsMachineCollectionFlags; struct _AgsMachineCollection { GtkVBox vbox; guint flags; GType child_type; guint child_parameter_count; GParameter *child_parameter; GtkVBox *child; }; struct _AgsMachineCollectionClass { GtkVBoxClass vbox; }; GType ags_machine_collection_get_type(); void ags_machine_collection_reload(AgsMachineCollection *machine_collection); void ags_machine_collection_add_entry(AgsMachineCollection *machine_collection, GtkWidget *machine); AgsMachineCollection* ags_machine_collection_new(GType child_type, guint child_parameter_count, GParameter *child_parameter); G_END_DECLS #endif /*__AGS_MACHINE_COLLECTION_H__*/ gsequencer-3.1.3/ags/X/export/ags_midi_export_wizard.c0000644000175000017500000003224213607210263020006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_midi_export_wizard_class_init(AgsMidiExportWizardClass *midi_export_wizard); void ags_midi_export_wizard_connectable_interface_init(AgsConnectableInterface *connectable); void ags_midi_export_wizard_applicable_interface_init(AgsApplicableInterface *applicable); void ags_midi_export_wizard_init(AgsMidiExportWizard *midi_export_wizard); void ags_midi_export_wizard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_export_wizard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_export_wizard_connect(AgsConnectable *connectable); void ags_midi_export_wizard_disconnect(AgsConnectable *connectable); void ags_midi_export_wizard_set_update(AgsApplicable *applicable, gboolean update); void ags_midi_export_wizard_apply(AgsApplicable *applicable); void ags_midi_export_wizard_reset(AgsApplicable *applicable); void ags_midi_export_wizard_show(GtkWidget *widget); /** * SECTION:ags_midi_export_wizard * @short_description: Export to MIDI using wizard * @title: AgsMidiExportWizard * @section_id: * @include: ags/X/ags_midi_export_wizard.h * * #AgsMidiExportWizard is a wizard to select machines in order * to export to midi files. */ static gpointer ags_midi_export_wizard_parent_class = NULL; enum{ PROP_0, PROP_MAIN_WINDOW, }; GType ags_midi_export_wizard_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_export_wizard = 0; static const GTypeInfo ags_midi_export_wizard_info = { sizeof (AgsMidiExportWizardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_export_wizard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiExportWizard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_export_wizard_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_midi_export_wizard_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_midi_export_wizard_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_midi_export_wizard = g_type_register_static(GTK_TYPE_DIALOG, "AgsMidiExportWizard", &ags_midi_export_wizard_info, 0); g_type_add_interface_static(ags_type_midi_export_wizard, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_midi_export_wizard, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_export_wizard); } return g_define_type_id__volatile; } void ags_midi_export_wizard_class_init(AgsMidiExportWizardClass *midi_export_wizard) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_midi_export_wizard_parent_class = g_type_class_peek_parent(midi_export_wizard); /* GObjectClass */ gobject = (GObjectClass *) midi_export_wizard; /* GtkWidgetClass */ widget = (GtkWidgetClass *) midi_export_wizard; gobject->set_property = ags_midi_export_wizard_set_property; gobject->get_property = ags_midi_export_wizard_get_property; /* properties */ /** * AgsMidiExportWizard:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidget */ widget->show = ags_midi_export_wizard_show; } void ags_midi_export_wizard_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_midi_export_wizard_connect; connectable->disconnect = ags_midi_export_wizard_disconnect; } void ags_midi_export_wizard_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_midi_export_wizard_set_update; applicable->apply = ags_midi_export_wizard_apply; applicable->reset = ags_midi_export_wizard_reset; } void ags_midi_export_wizard_init(AgsMidiExportWizard *midi_export_wizard) { GtkAlignment *alignment; midi_export_wizard->flags = AGS_MIDI_EXPORT_WIZARD_SHOW_MACHINE_COLLECTION; midi_export_wizard->main_window = NULL; /* midi builder */ midi_export_wizard->midi_builder = ags_midi_builder_new(NULL); midi_export_wizard->pulse_unit = AGS_MIDI_EXPORT_WIZARD_DEFAULT_PULSE_UNIT; /* machine collection */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.0, 1.0, 1.0); gtk_widget_set_no_show_all((GtkWidget *) alignment, TRUE); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(midi_export_wizard), (GtkWidget*) alignment, TRUE, TRUE, 0); midi_export_wizard->machine_collection = (GtkWidget *) ags_machine_collection_new(AGS_TYPE_MACHINE_COLLECTION_ENTRY, 0, NULL); gtk_container_add((GtkContainer *) alignment, midi_export_wizard->machine_collection); /* file chooser */ alignment = g_object_new(GTK_TYPE_ALIGNMENT, NULL); gtk_widget_set_no_show_all((GtkWidget *) alignment, TRUE); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(midi_export_wizard), (GtkWidget*) alignment, TRUE, TRUE, 0); midi_export_wizard->file_chooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_SAVE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(midi_export_wizard->file_chooser), AGS_MIDI_EXPORT_WIZARD_DEFAULT_FILENAME); gtk_container_add((GtkContainer *) alignment, midi_export_wizard->file_chooser); gtk_dialog_add_buttons((GtkDialog *) midi_export_wizard, GTK_STOCK_GO_BACK, GTK_RESPONSE_REJECT, GTK_STOCK_GO_FORWARD, GTK_RESPONSE_ACCEPT, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_midi_export_wizard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) midi_export_wizard->main_window == main_window){ return; } if(midi_export_wizard->main_window != NULL){ g_object_unref(midi_export_wizard->main_window); } if(main_window != NULL){ g_object_ref(main_window); } midi_export_wizard->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_export_wizard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, midi_export_wizard->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_export_wizard_connect(AgsConnectable *connectable) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(connectable); if((AGS_MIDI_EXPORT_WIZARD_CONNECTED & (midi_export_wizard->flags)) != 0){ return; } midi_export_wizard->flags |= AGS_MIDI_EXPORT_WIZARD_CONNECTED; g_signal_connect(midi_export_wizard, "response", G_CALLBACK(ags_midi_export_wizard_response_callback), NULL); ags_connectable_connect(AGS_CONNECTABLE(midi_export_wizard->machine_collection)); } void ags_midi_export_wizard_disconnect(AgsConnectable *connectable) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(connectable); if((AGS_MIDI_EXPORT_WIZARD_CONNECTED & (midi_export_wizard->flags)) == 0){ return; } midi_export_wizard->flags &= (~AGS_MIDI_EXPORT_WIZARD_CONNECTED); ags_connectable_disconnect(AGS_CONNECTABLE(midi_export_wizard->machine_collection)); } void ags_midi_export_wizard_set_update(AgsApplicable *applicable, gboolean update) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(applicable); ags_applicable_set_update(AGS_APPLICABLE(midi_export_wizard->machine_collection), update); } void ags_midi_export_wizard_apply(AgsApplicable *applicable) { AgsWindow *window; AgsMidiExportWizard *midi_export_wizard; FILE *file; GList *list, *list_start; gchar *filename; guint track_count; guint division; guint times; guint bpm; guint clicks; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(applicable); window = (AgsWindow *) midi_export_wizard->main_window; /* retrieve BPM */ bpm = gtk_spin_button_get_value_as_int(window->navigation->bpm); /* find tracks */ list = list_start = gtk_container_get_children(GTK_CONTAINER(AGS_MACHINE_COLLECTION(midi_export_wizard->machine_collection)->child)); track_count = 0; while(list != NULL){ if(gtk_toggle_button_get_active((GtkToggleButton *) AGS_MACHINE_COLLECTION_ENTRY(list->data)->enabled)){ track_count++; } list = list->next; } g_list_free(list_start); if(track_count == 0){ return; } /* set division, times and clicks */ division = AGS_MIDI_EXPORT_WIZARD_DEFAULT_DIVISION; times = AGS_MIDI_EXPORT_WIZARD_DEFAULT_TIMES; clicks = AGS_MIDI_EXPORT_WIZARD_DEFAULT_CLICKS; /* set pulse unit */ midi_export_wizard->pulse_unit = division / 16.0; /* open file */ filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(midi_export_wizard->file_chooser)); file = fopen(filename, "w"); g_object_set(midi_export_wizard->midi_builder, "file", file, NULL); /* add header */ ags_midi_builder_append_header(midi_export_wizard->midi_builder, 6, 1, track_count, division, times, AGS_MIDI_EXPORT_WIZARD_DEFAULT_BPM, clicks); /* apply tracks */ ags_applicable_apply(AGS_APPLICABLE(midi_export_wizard->machine_collection)); /* build and write */ ags_midi_builder_build(midi_export_wizard->midi_builder); fwrite(midi_export_wizard->midi_builder->data, sizeof(unsigned char), midi_export_wizard->midi_builder->length, file); fflush(file); fclose(file); } void ags_midi_export_wizard_reset(AgsApplicable *applicable) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(applicable); ags_machine_collection_reload(AGS_MACHINE_COLLECTION(midi_export_wizard->machine_collection)); ags_applicable_reset(AGS_APPLICABLE(midi_export_wizard->machine_collection)); } void ags_midi_export_wizard_show(GtkWidget *widget) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = AGS_MIDI_EXPORT_WIZARD(widget); GTK_WIDGET_CLASS(ags_midi_export_wizard_parent_class)->show(widget); if((AGS_MIDI_EXPORT_WIZARD_SHOW_FILE_CHOOSER & (midi_export_wizard->flags)) != 0){ gtk_widget_show(gtk_widget_get_parent(midi_export_wizard->file_chooser)); gtk_widget_show_all(midi_export_wizard->file_chooser); } if((AGS_MIDI_EXPORT_WIZARD_SHOW_MACHINE_COLLECTION & (midi_export_wizard->flags)) != 0){ gtk_widget_show(gtk_widget_get_parent(midi_export_wizard->machine_collection)); gtk_widget_show_all(midi_export_wizard->machine_collection); } } /** * ags_midi_export_wizard_new: * @main_window: the #AgsWindow * * Create a new instance of #AgsMidiExportWizard * * Returns: the new #AgsMidiExportWizard * * Since: 3.0.0 */ AgsMidiExportWizard* ags_midi_export_wizard_new(GtkWidget *main_window) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = (AgsMidiExportWizard *) g_object_new(AGS_TYPE_MIDI_EXPORT_WIZARD, "main-window", main_window, NULL); return(midi_export_wizard); } gsequencer-3.1.3/ags/X/export/ags_machine_collection_entry_callbacks.h0000644000175000017500000000207213607210263023145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_COLLECTION_ENTRY_CALLBACKS_H__ #define __AGS_MACHINE_COLLECTION_ENTRY_CALLBACKS_H__ #include #include #include #include #include #include #endif /*__AGS_MACHINE_COLLECTION_ENTRY_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/export/ags_wave_export_dialog.c0000644000175000017500000005167713613101102017766 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_wave_export_dialog_class_init(AgsWaveExportDialogClass *wave_export_dialog); void ags_wave_export_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wave_export_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_wave_export_dialog_init(AgsWaveExportDialog *wave_export_dialog); void ags_wave_export_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_export_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_export_dialog_finalize(GObject *gobject); void ags_wave_export_dialog_connect(AgsConnectable *connectable); void ags_wave_export_dialog_disconnect(AgsConnectable *connectable); void ags_wave_export_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_wave_export_dialog_apply(AgsApplicable *applicable); void ags_wave_export_dialog_reset(AgsApplicable *applicable); void ags_wave_export_dialog_show(GtkWidget *widget); /** * SECTION:ags_wave_export_dialog * @short_description: The export dialog * @title: AgsWaveExportDialog * @section_id: * @include: ags/X/ags_wave_export_dialog.h * * #AgsWaveExportDialog lets you export to audio files. This widget * can contain mulitple #AgsExportSoundcard widgets. */ enum{ PROP_0, PROP_MACHINE, }; static gpointer ags_wave_export_dialog_parent_class = NULL; GType ags_wave_export_dialog_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_export_dialog = 0; static const GTypeInfo ags_wave_export_dialog_info = { sizeof (AgsWaveExportDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_export_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveExportDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_export_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wave_export_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_wave_export_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wave_export_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsWaveExportDialog", &ags_wave_export_dialog_info, 0); g_type_add_interface_static(ags_type_wave_export_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_wave_export_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_export_dialog); } return g_define_type_id__volatile; } void ags_wave_export_dialog_class_init(AgsWaveExportDialogClass *wave_export_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_wave_export_dialog_parent_class = g_type_class_peek_parent(wave_export_dialog); /* GObjectClass */ gobject = (GObjectClass *) wave_export_dialog; gobject->set_property = ags_wave_export_dialog_set_property; gobject->get_property = ags_wave_export_dialog_get_property; gobject->finalize = ags_wave_export_dialog_finalize; /* properties */ /** * AgsMachine:machine: * * The #AgsMachine to edit. * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine which this machine editor is assigned with"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) wave_export_dialog; widget->show = ags_wave_export_dialog_show; } void ags_wave_export_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_wave_export_dialog_connect; connectable->disconnect = ags_wave_export_dialog_disconnect; } void ags_wave_export_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_wave_export_dialog_set_update; applicable->apply = ags_wave_export_dialog_apply; applicable->reset = ags_wave_export_dialog_reset; } void ags_wave_export_dialog_init(AgsWaveExportDialog *wave_export_dialog) { GtkHBox *hbox; GtkLabel *label; wave_export_dialog->flags = 0; g_object_set(wave_export_dialog, "title", i18n("Audio fast export"), NULL); wave_export_dialog->machine = NULL; /* filename */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(wave_export_dialog)), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("file")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), TRUE, TRUE, 0); wave_export_dialog->filename = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(wave_export_dialog->filename, "out.wav"); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(wave_export_dialog->filename), TRUE, TRUE, 0); wave_export_dialog->file_chooser_button = (GtkButton *) gtk_button_new_with_label(i18n("open")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(wave_export_dialog->file_chooser_button), TRUE, TRUE, 0); /* start tact */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(wave_export_dialog)), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("start tact")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), TRUE, TRUE, 0); wave_export_dialog->start_tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, (gdouble) AGS_NOTATION_EDITOR_MAX_CONTROLS, 1.0); gtk_spin_button_set_digits(wave_export_dialog->start_tact, 3); gtk_spin_button_set_value(wave_export_dialog->start_tact, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(wave_export_dialog->start_tact), FALSE, FALSE, 0); /* end tact */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(wave_export_dialog)), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("end tact")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), TRUE, TRUE, 0); wave_export_dialog->end_tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, (gdouble) AGS_NOTATION_EDITOR_MAX_CONTROLS / 16.0, 1.0); gtk_spin_button_set_digits(wave_export_dialog->end_tact, 3); gtk_spin_button_set_value(wave_export_dialog->end_tact, 4.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(wave_export_dialog->end_tact), FALSE, FALSE, 0); /* duration */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(wave_export_dialog)), GTK_WIDGET(hbox), FALSE, FALSE, 0); wave_export_dialog->duration = (GtkLabel *) gtk_label_new("0000:00.000"); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(wave_export_dialog->duration), FALSE, FALSE, 0); /* output format */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(wave_export_dialog)), GTK_WIDGET(hbox), FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("output format")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), TRUE, TRUE, 0); wave_export_dialog->output_format = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(wave_export_dialog->output_format, AGS_WAVE_EXPORT_DIALOG_FORMAT_WAV); gtk_combo_box_text_append_text(wave_export_dialog->output_format, AGS_WAVE_EXPORT_DIALOG_FORMAT_FLAC); gtk_combo_box_text_append_text(wave_export_dialog->output_format, AGS_WAVE_EXPORT_DIALOG_FORMAT_AIFF); gtk_combo_box_text_append_text(wave_export_dialog->output_format, AGS_WAVE_EXPORT_DIALOG_FORMAT_OGG); gtk_combo_box_set_active((GtkComboBox *) wave_export_dialog->output_format, 0); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(wave_export_dialog->output_format), FALSE, FALSE, 0); /* GtkButton's in GtkDialog->action_area */ wave_export_dialog->apply = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_APPLY); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(wave_export_dialog)), (GtkWidget *) wave_export_dialog->apply, FALSE, FALSE, 0); wave_export_dialog->ok = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(wave_export_dialog)), (GtkWidget *) wave_export_dialog->ok, FALSE, FALSE, 0); wave_export_dialog->cancel = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(wave_export_dialog)), (GtkWidget *) wave_export_dialog->cancel, FALSE, FALSE, 0); } void ags_wave_export_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWaveExportDialog *wave_export_dialog; wave_export_dialog = AGS_WAVE_EXPORT_DIALOG(gobject); switch(prop_id){ case PROP_MACHINE: { AgsMachine *machine; machine = (AgsMachine *) g_value_get_object(value); if(machine == wave_export_dialog->machine){ return; } if(wave_export_dialog->machine != NULL){ g_object_unref(wave_export_dialog->machine); } if(machine != NULL){ g_object_ref(machine); } wave_export_dialog->machine = machine; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_export_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWaveExportDialog *wave_export_dialog; wave_export_dialog = AGS_WAVE_EXPORT_DIALOG(gobject); switch(prop_id){ case PROP_MACHINE: { g_value_set_object(value, wave_export_dialog->machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_export_dialog_finalize(GObject *gobject) { AgsWaveExportDialog *wave_export_dialog; wave_export_dialog = (AgsWaveExportDialog *) gobject; G_OBJECT_CLASS(ags_wave_export_dialog_parent_class)->finalize(gobject); } void ags_wave_export_dialog_connect(AgsConnectable *connectable) { AgsWaveExportDialog *wave_export_dialog; GList *list, *list_start; wave_export_dialog = AGS_WAVE_EXPORT_DIALOG(connectable); if((AGS_WAVE_EXPORT_DIALOG_CONNECTED & (wave_export_dialog->flags)) != 0){ return; } wave_export_dialog->flags |= AGS_WAVE_EXPORT_DIALOG_CONNECTED; g_signal_connect(G_OBJECT(wave_export_dialog->file_chooser_button), "clicked", G_CALLBACK(ags_wave_export_dialog_file_chooser_button_callback), wave_export_dialog); g_signal_connect_after(G_OBJECT(wave_export_dialog->start_tact), "value-changed", G_CALLBACK(ags_wave_export_dialog_start_tact_callback), wave_export_dialog); g_signal_connect_after(G_OBJECT(wave_export_dialog->end_tact), "value-changed", G_CALLBACK(ags_wave_export_dialog_end_tact_callback), wave_export_dialog); g_signal_connect(G_OBJECT(wave_export_dialog->apply), "clicked", G_CALLBACK(ags_wave_export_dialog_apply_callback), wave_export_dialog); g_signal_connect(G_OBJECT(wave_export_dialog->ok), "clicked", G_CALLBACK(ags_wave_export_dialog_ok_callback), wave_export_dialog); g_signal_connect(G_OBJECT(wave_export_dialog->cancel), "clicked", G_CALLBACK(ags_wave_export_dialog_cancel_callback), wave_export_dialog); } void ags_wave_export_dialog_disconnect(AgsConnectable *connectable) { AgsWaveExportDialog *wave_export_dialog; GList *list, *list_start; wave_export_dialog = AGS_WAVE_EXPORT_DIALOG(connectable); if((AGS_WAVE_EXPORT_DIALOG_CONNECTED & (wave_export_dialog->flags)) == 0){ return; } wave_export_dialog->flags &= (~AGS_WAVE_EXPORT_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(wave_export_dialog->file_chooser_button), "any_signal::clicked", G_CALLBACK(ags_wave_export_dialog_file_chooser_button_callback), wave_export_dialog, NULL); g_object_disconnect(G_OBJECT(wave_export_dialog->start_tact), "any_signal::value-changed", G_CALLBACK(ags_wave_export_dialog_start_tact_callback), wave_export_dialog, NULL); g_object_disconnect(G_OBJECT(wave_export_dialog->end_tact), "any_signal::value-changed", G_CALLBACK(ags_wave_export_dialog_end_tact_callback), wave_export_dialog, NULL); g_object_disconnect(G_OBJECT(wave_export_dialog->apply), "any_signal::clicked", G_CALLBACK(ags_wave_export_dialog_apply_callback), wave_export_dialog, NULL); g_object_disconnect(G_OBJECT(wave_export_dialog->ok), "any_signal::clicked", G_CALLBACK(ags_wave_export_dialog_ok_callback), wave_export_dialog, NULL); g_object_disconnect(G_OBJECT(wave_export_dialog->cancel), "any_signal::clicked", G_CALLBACK(ags_wave_export_dialog_cancel_callback), wave_export_dialog, NULL); } void ags_wave_export_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_wave_export_dialog_apply(AgsApplicable *applicable) { AgsApplicationContext *application_context; AgsWaveExportDialog *wave_export_dialog; AgsBuffer *buffer; AgsAudioFile *audio_file; AgsTimestamp *timestamp; GObject *soundcard; GList *start_wave, *wave; void *data; gchar *filename; gdouble bpm; gdouble delay, delay_factor; gdouble start_tact, end_tact; gdouble offset; guint default_offset; guint64 start_frame, end_frame; guint destination_offset, source_offset; guint audio_channels; guint copy_mode; guint samplerate; guint format; guint source_format; guint buffer_size; guint i, j; wave_export_dialog = AGS_WAVE_EXPORT_DIALOG(applicable); application_context = ags_application_context_get_instance(); soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); bpm = ags_soundcard_get_bpm(AGS_SOUNDCARD(soundcard)); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(soundcard)); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(soundcard)); /* get some fields */ g_object_get(wave_export_dialog->machine->audio, "wave", &start_wave, "audio-channels", &audio_channels, "samplerate", &samplerate, "format", &format, "buffer-size", &buffer_size, NULL); filename = gtk_entry_get_text(wave_export_dialog->filename); if(g_file_test(filename, G_FILE_TEST_EXISTS)){ g_remove(filename); } start_tact = gtk_spin_button_get_value(wave_export_dialog->start_tact); end_tact = gtk_spin_button_get_value(wave_export_dialog->end_tact); offset = 16.0 * (end_tact - start_tact); audio_file = ags_audio_file_new(filename, soundcard, -1); audio_file->file_audio_channels = audio_channels; audio_file->file_samplerate = samplerate; ags_audio_file_rw_open(audio_file, TRUE); default_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; timestamp = ags_timestamp_new(); timestamp->flags = AGS_TIMESTAMP_OFFSET; data = ags_stream_alloc(audio_channels * buffer_size, format); start_frame = ((16.0 * start_tact) / (16.0 * delay_factor * bpm / 60.0)) * samplerate; end_frame = ((16.0 * end_tact) / (16.0 * delay_factor * bpm / 60.0)) * samplerate + buffer_size; for(i = start_frame; i + buffer_size < end_frame; ){ guint current_buffer_size; GRecMutex *buffer_mutex; ags_timestamp_set_ags_offset(timestamp, default_offset * floor((gdouble) i / (gdouble) default_offset)); ags_audio_buffer_util_clear_buffer(data, audio_channels, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); current_buffer_size = buffer_size; if(i == start_frame){ source_offset = start_frame % buffer_size; current_buffer_size -= source_offset; }else{ source_offset = 0; } for(j = 0; j < audio_channels; j++){ wave = ags_wave_find_near_timestamp(start_wave, j, timestamp); if(wave == NULL){ continue; } buffer = ags_wave_find_point(wave->data, i, FALSE); if(buffer != NULL){ g_object_get(buffer, "format", &source_format, NULL); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(source_format)); buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); destination_offset = j; g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_copy_buffer_to_buffer(data, audio_channels, destination_offset, buffer->data, 1, source_offset, current_buffer_size, copy_mode); g_rec_mutex_unlock(buffer_mutex); } } ags_audio_file_write(audio_file, data, current_buffer_size, format); i += buffer_size; } ags_audio_file_flush(audio_file); ags_audio_file_close(audio_file); } void ags_wave_export_dialog_reset(AgsApplicable *applicable) { AgsWaveExportDialog *wave_export_dialog; wave_export_dialog = AGS_WAVE_EXPORT_DIALOG(applicable); ags_wave_export_dialog_update_duration(wave_export_dialog); } void ags_wave_export_dialog_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_wave_export_dialog_parent_class)->show(widget); } void ags_wave_export_dialog_update_duration(AgsWaveExportDialog *wave_export_dialog) { AgsApplicationContext *application_context; GObject *soundcard; gchar *str; gdouble bpm; gdouble delay, delay_factor; gdouble start_tact, end_tact; gdouble offset; if(!AGS_IS_WAVE_EXPORT_DIALOG(wave_export_dialog)){ return; } application_context = ags_application_context_get_instance(); soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); bpm = ags_soundcard_get_bpm(AGS_SOUNDCARD(soundcard)); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(soundcard)); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(soundcard)); start_tact = gtk_spin_button_get_value(wave_export_dialog->start_tact); end_tact = gtk_spin_button_get_value(wave_export_dialog->end_tact); offset = 16.0 * (end_tact - start_tact); str = ags_time_get_uptime_from_offset(offset, bpm, delay, delay_factor); gtk_label_set_label(wave_export_dialog->duration, str); g_free(str); } /** * ags_wave_export_dialog_new: * @machine: the #AgsMachine * * Create a new instance of #AgsWaveExportDialog * * Returns: the #AgsWaveExportDialog * * Since: 3.0.0 */ AgsWaveExportDialog* ags_wave_export_dialog_new(AgsMachine *machine) { AgsWaveExportDialog *wave_export_dialog; wave_export_dialog = (AgsWaveExportDialog *) g_object_new(AGS_TYPE_WAVE_EXPORT_DIALOG, "machine", machine, NULL); return(wave_export_dialog); } gsequencer-3.1.3/ags/X/export/ags_machine_collection_entry.c0000644000175000017500000003556713607210263021160 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_machine_collection_entry_class_init(AgsMachineCollectionEntryClass *machine_collection_entry); void ags_machine_collection_entry_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_collection_entry_applicable_interface_init(AgsApplicableInterface *applicable); void ags_machine_collection_entry_init(AgsMachineCollectionEntry *machine_collection_entry); void ags_machine_collection_entry_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_machine_collection_entry_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_machine_collection_entry_connect(AgsConnectable *connectable); void ags_machine_collection_entry_disconnect(AgsConnectable *connectable); void ags_machine_collection_entry_set_update(AgsApplicable *applicable, gboolean update); void ags_machine_collection_entry_apply(AgsApplicable *applicable); void ags_machine_collection_entry_reset(AgsApplicable *applicable); /** * SECTION:ags_machine_collection_entry * @short_description: Machine entry * @title: AgsMachineCollectionEntry * @section_id: * @include: ags/X/ags_machine_collection_entry.h * * #AgsMachineCollectionEntry is a composite widget specifying machines * to export. */ enum{ PROP_0, PROP_MACHINE, }; GType ags_machine_collection_entry_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine_collection_entry = 0; static const GTypeInfo ags_machine_collection_entry_info = { sizeof (AgsMachineCollectionEntryClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_collection_entry_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachineCollectionEntry), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_collection_entry_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_collection_entry_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_machine_collection_entry_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine_collection_entry = g_type_register_static(GTK_TYPE_TABLE, "AgsMachineCollectionEntry", &ags_machine_collection_entry_info, 0); g_type_add_interface_static(ags_type_machine_collection_entry, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_machine_collection_entry, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine_collection_entry); } return g_define_type_id__volatile; } void ags_machine_collection_entry_class_init(AgsMachineCollectionEntryClass *machine_collection_entry) { GObjectClass *gobject; GParamSpec *param_spec; /* GObjectClass */ gobject = (GObjectClass *) machine_collection_entry; gobject->set_property = ags_machine_collection_entry_set_property; gobject->get_property = ags_machine_collection_entry_get_property; /* properties */ /** * AgsMachineCollectionEntry:machine: * * The assigned #AgsMachine. * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine which this machine entry is assigned with"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); } void ags_machine_collection_entry_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_collection_entry_connect; connectable->disconnect = ags_machine_collection_entry_disconnect; } void ags_machine_collection_entry_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_machine_collection_entry_set_update; applicable->apply = ags_machine_collection_entry_apply; applicable->reset = ags_machine_collection_entry_reset; } void ags_machine_collection_entry_init(AgsMachineCollectionEntry *machine_collection_entry) { GtkLabel *label; machine_collection_entry->flags = 0; gtk_table_resize((GtkTable *) machine_collection_entry, 4, 4); machine_collection_entry->machine = NULL; /* enabled */ machine_collection_entry->enabled = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("enabled")); gtk_table_attach((GtkTable *) machine_collection_entry, (GtkWidget *) machine_collection_entry->enabled, 0, 4, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* machine label */ machine_collection_entry->label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, NULL); gtk_table_attach((GtkTable *) machine_collection_entry, (GtkWidget *) machine_collection_entry->label, 0, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* instrument * / label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", "instrument: ", "xalign", 0.0, NULL); gtk_table_attach((GtkTable *) machine_collection_entry, (GtkWidget *) label, 0, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); machine_collection_entry->instrument = (GtkEntry *) gtk_entry_new(); gtk_table_attach((GtkTable *) machine_collection_entry, (GtkWidget *) machine_collection_entry->instrument, 2, 4, 2, 3, GTK_FILL, GTK_FILL, 0, 0); */ machine_collection_entry->instrument = NULL; /* sequence */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("sequence: "), "xalign", 0.0, NULL); gtk_table_attach((GtkTable *) machine_collection_entry, (GtkWidget *) label, 0, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); machine_collection_entry->sequence = (GtkEntry *) gtk_entry_new(); gtk_table_attach((GtkTable *) machine_collection_entry, (GtkWidget *) machine_collection_entry->sequence, 2, 4, 3, 4, GTK_FILL, GTK_FILL, 0, 0); } void ags_machine_collection_entry_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMachineCollectionEntry *machine_collection_entry; machine_collection_entry = AGS_MACHINE_COLLECTION_ENTRY(gobject); switch(prop_id){ case PROP_MACHINE: { GtkWidget *machine; machine = (GtkWidget *) g_value_get_object(value); if(machine_collection_entry->machine == machine){ return; } if(machine_collection_entry->machine != NULL){ g_object_unref(machine_collection_entry->machine); } if(machine != NULL){ g_object_ref(machine); /* fill in some fields */ gtk_label_set_text(machine_collection_entry->label, g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), AGS_MACHINE(machine)->machine_name)); // gtk_entry_set_text(machine_collection_entry->instrument, // G_OBJECT_TYPE_NAME(machine)); gtk_entry_set_text(machine_collection_entry->sequence, AGS_MACHINE(machine)->machine_name); } machine_collection_entry->machine = machine; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_collection_entry_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMachineCollectionEntry *machine_collection_entry; machine_collection_entry = AGS_MACHINE_COLLECTION_ENTRY(gobject); switch(prop_id){ case PROP_MACHINE: { g_value_set_object(value, machine_collection_entry->machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_collection_entry_connect(AgsConnectable *connectable) { AgsMachineCollectionEntry *machine_collection_entry; machine_collection_entry = AGS_MACHINE_COLLECTION_ENTRY(connectable); if((AGS_MACHINE_COLLECTION_ENTRY_CONNECTED & (machine_collection_entry->flags)) != 0){ return; } machine_collection_entry->flags |= AGS_MACHINE_COLLECTION_ENTRY_CONNECTED; } void ags_machine_collection_entry_disconnect(AgsConnectable *connectable) { AgsMachineCollectionEntry *machine_collection_entry; machine_collection_entry = AGS_MACHINE_COLLECTION_ENTRY(connectable); if((AGS_MACHINE_COLLECTION_ENTRY_CONNECTED & (machine_collection_entry->flags)) == 0){ return; } machine_collection_entry->flags &= (~AGS_MACHINE_COLLECTION_ENTRY_CONNECTED); } void ags_machine_collection_entry_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_machine_collection_entry_apply(AgsApplicable *applicable) { AgsMachine *machine; AgsMidiExportWizard *midi_export_wizard; AgsMachineCollectionEntry *machine_collection_entry; AgsMidiBuilder *midi_builder; GList *start_notation, *notation; gchar *segmentation; guint audio_channels; gdouble delay_factor; gdouble bpm; guint prev_delta_time; guint delta_time; guint i; machine_collection_entry = AGS_MACHINE_COLLECTION_ENTRY(applicable); if(!gtk_toggle_button_get_active((GtkToggleButton *) machine_collection_entry->enabled)){ return; } midi_export_wizard = (AgsMidiExportWizard *) gtk_widget_get_ancestor((GtkWidget *) machine_collection_entry, AGS_TYPE_MIDI_EXPORT_WIZARD); machine = (AgsMachine *) machine_collection_entry->machine; g_object_get(machine->audio, "notation", &start_notation, "audio-channels", &audio_channels, NULL); midi_builder = midi_export_wizard->midi_builder; bpm = midi_builder->midi_header->beat; delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(ags_config_get_instance(), AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ guint denominator, numerator; sscanf(segmentation, "%d/%d", &denominator, &numerator); delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } delta_time = 0; prev_delta_time = 0; for(i = 0; i < audio_channels; i++){ GList *start_note, *note; GList *start_active_note, *active_note; gchar *str; gint key_on[128]; /* append track */ str = g_strdup_printf("%s #%d", gtk_entry_get_text(machine_collection_entry->sequence), i); ags_midi_builder_append_track(midi_builder, str); g_free(str); /* append tempo */ ags_midi_builder_append_time_signature(midi_builder, 0, 4, 4, 36, 8); notation = start_notation; start_active_note = NULL; /* put keys */ memset(key_on, 0, 128 * sizeof(gint)); while(notation != NULL){ guint audio_channel; g_object_get(notation->data, "audio-channel", &audio_channel, NULL); if(i != audio_channel){ notation = notation->next; continue; } g_object_get(notation->data, "note", &start_note, NULL); note = start_note; while(note != NULL){ guint note_x0; guint note_y; g_object_get(note->data, "x0", ¬e_x0, "y", ¬e_y, NULL); /* check note-off */ active_note = start_active_note; while(active_note != NULL){ guint active_x1; guint active_y; g_object_get(active_note->data, "x1", &active_x1, "y", &active_y, NULL); if(active_x1 <= note_x0){ key_on[active_y] -= 1; if(key_on[note_y] == 0){ delta_time = ags_midi_util_offset_to_delta_time(delay_factor, AGS_MIDI_EXPORT_WIZARD_DEFAULT_DIVISION, AGS_MIDI_EXPORT_WIZARD_DEFAULT_TEMPO, AGS_MIDI_EXPORT_WIZARD_DEFAULT_BPM, note_x0); /* append key-off */ ags_midi_builder_append_key_off(midi_builder, delta_time - prev_delta_time, 0, active_y, (guint) 127); /* * AGS_NOTE(active_note->data)->release.imag */ prev_delta_time = delta_time; start_active_note = g_list_remove(start_active_note, active_note->data); } } active_note = active_note->next; } /* note-on */ if(note_y < 128){ start_active_note = g_list_prepend(start_active_note, note->data); key_on[note_y] += 1; if(key_on[note_y] == 1){ delta_time = ags_midi_util_offset_to_delta_time(delay_factor, AGS_MIDI_EXPORT_WIZARD_DEFAULT_DIVISION, AGS_MIDI_EXPORT_WIZARD_DEFAULT_TEMPO, AGS_MIDI_EXPORT_WIZARD_DEFAULT_BPM, note_x0); /* append key-on */ ags_midi_builder_append_key_on(midi_builder, delta_time - prev_delta_time, 0, note_y, (guint) 127); /* * AGS_NOTE(note->data)->attack.imag */ prev_delta_time = delta_time; } } note = note->next; } g_list_free_full(start_note, g_object_unref); notation = notation->next; } } g_list_free_full(start_notation, g_object_unref); } void ags_machine_collection_entry_reset(AgsApplicable *applicable) { //TODO:JK: implement me } /** * ags_machine_collection_entry_new: * @machine: the #AgsMachine * * Create a new instance of #AgsMachineCollectionEntry * * Returns: the new #AgsMachineCollectionEntry * * Since: 3.0.0 */ AgsMachineCollectionEntry* ags_machine_collection_entry_new(GtkWidget *machine) { AgsMachineCollectionEntry *machine_collection_entry; machine_collection_entry = (AgsMachineCollectionEntry *) g_object_new(AGS_TYPE_MACHINE_COLLECTION_ENTRY, "machine", machine, NULL); return(machine_collection_entry); } gsequencer-3.1.3/ags/X/export/ags_machine_collection_callbacks.h0000644000175000017500000000205013607210263021720 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_COLLECTION_CALLBACKS_H__ #define __AGS_MACHINE_COLLECTION_CALLBACKS_H__ #include #include #include #include #include #include #endif /*__AGS_MACHINE_COLLECTION_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/export/ags_midi_export_wizard.h0000644000175000017500000000555713607210263020024 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_EXPORT_WIZARD_H__ #define __AGS_MIDI_EXPORT_WIZARD_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_EXPORT_WIZARD (ags_midi_export_wizard_get_type()) #define AGS_MIDI_EXPORT_WIZARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_EXPORT_WIZARD, AgsMidiExportWizard)) #define AGS_MIDI_EXPORT_WIZARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_EXPORT_WIZARD, AgsMidiExportWizardClass)) #define AGS_IS_MIDI_EXPORT_WIZARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDI_EXPORT_WIZARD)) #define AGS_IS_MIDI_EXPORT_WIZARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDI_EXPORT_WIZARD)) #define AGS_MIDI_EXPORT_WIZARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MIDI_EXPORT_WIZARD, AgsMidiExportWizardClass)) #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_FILENAME "out.mid" #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_TIMES (30) #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_CLICKS (4) #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_DIVISION (96) #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_TEMPO (500000) #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_BPM (120) #define AGS_MIDI_EXPORT_WIZARD_DEFAULT_PULSE_UNIT (500.0 / 16.0) typedef struct _AgsMidiExportWizard AgsMidiExportWizard; typedef struct _AgsMidiExportWizardClass AgsMidiExportWizardClass; typedef enum{ AGS_MIDI_EXPORT_WIZARD_CONNECTED = 1, AGS_MIDI_EXPORT_WIZARD_SHOW_MACHINE_COLLECTION = 1 << 1, AGS_MIDI_EXPORT_WIZARD_SHOW_FILE_CHOOSER = 1 << 2, }AgsMidiExportWizardFlags; struct _AgsMidiExportWizard { GtkDialog dialog; guint flags; GtkWidget *main_window; AgsMidiBuilder *midi_builder; guint pulse_unit; GtkWidget *machine_collection; GtkWidget *file_chooser; }; struct _AgsMidiExportWizardClass { GtkDialogClass dialog; }; GType ags_midi_export_wizard_get_type(void); AgsMidiExportWizard* ags_midi_export_wizard_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_MIDI_EXPORT_WIZARD_H__*/ gsequencer-3.1.3/ags/X/export/ags_wave_export_dialog.h0000644000175000017500000000542413607210263017774 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EXPORT_DIALOG_H__ #define __AGS_WAVE_EXPORT_DIALOG_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_EXPORT_DIALOG (ags_wave_export_dialog_get_type()) #define AGS_WAVE_EXPORT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_EXPORT_DIALOG, AgsWaveExportDialog)) #define AGS_WAVE_EXPORT_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_EXPORT_DIALOG, AgsWaveExportDialogClass)) #define AGS_IS_WAVE_EXPORT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_WAVE_EXPORT_DIALOG)) #define AGS_IS_WAVE_EXPORT_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_WAVE_EXPORT_DIALOG)) #define AGS_WAVE_EXPORT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_WAVE_EXPORT_DIALOG, AgsWaveExportDialogClass)) #define AGS_WAVE_EXPORT_DIALOG_FORMAT_WAV "wav" #define AGS_WAVE_EXPORT_DIALOG_FORMAT_FLAC "flac" #define AGS_WAVE_EXPORT_DIALOG_FORMAT_AIFF "aiff" #define AGS_WAVE_EXPORT_DIALOG_FORMAT_OGG "ogg" typedef struct _AgsWaveExportDialog AgsWaveExportDialog; typedef struct _AgsWaveExportDialogClass AgsWaveExportDialogClass; typedef enum{ AGS_WAVE_EXPORT_DIALOG_CONNECTED = 1, }AgsWaveExportDialogFlags; struct _AgsWaveExportDialog { GtkDialog dialog; guint flags; AgsMachine *machine; GtkEntry *filename; GtkButton *file_chooser_button; GtkSpinButton *start_tact; GtkSpinButton *end_tact; GtkLabel *duration; GtkComboBoxText *output_format; GtkButton *apply; GtkButton *ok; GtkButton *cancel; }; struct _AgsWaveExportDialogClass { GtkDialogClass dialog; }; GType ags_wave_export_dialog_get_type(void); void ags_wave_export_dialog_update_duration(AgsWaveExportDialog *wave_export_dialog); AgsWaveExportDialog* ags_wave_export_dialog_new(AgsMachine *machine); G_END_DECLS #endif /*__AGS_WAVE_EXPORT_DIALOG_H__*/ gsequencer-3.1.3/ags/X/export/ags_wave_export_dialog_callbacks.h0000644000175000017500000000344313607210263021772 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EXPORT_DIALOG_CALLBACKS_H__ #define __AGS_WAVE_EXPORT_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_wave_export_dialog_file_chooser_button_callback(GtkWidget *file_chooser_button, AgsWaveExportDialog *wave_export_dialog); void ags_wave_export_dialog_start_tact_callback(GtkSpinButton *spin_button, AgsWaveExportDialog *wave_export_dialog); void ags_wave_export_dialog_end_tact_callback(GtkSpinButton *spin_button, AgsWaveExportDialog *wave_export_dialog); int ags_wave_export_dialog_apply_callback(GtkWidget *widget, AgsWaveExportDialog *wave_export_dialog); int ags_wave_export_dialog_ok_callback(GtkWidget *widget, AgsWaveExportDialog *wave_export_dialog); int ags_wave_export_dialog_cancel_callback(GtkWidget *widget, AgsWaveExportDialog *wave_export_dialog); G_END_DECLS #endif /*__AGS_WAVE_EXPORT_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/export/ags_midi_export_wizard_callbacks.c0000644000175000017500000000473213607210263022010 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_midi_export_wizard_response_callback(GtkWidget *wizard, gint response, gpointer data) { AgsMidiExportWizard *midi_export_wizard; midi_export_wizard = (AgsMidiExportWizard *) wizard; switch(response){ case GTK_RESPONSE_REJECT: { if((AGS_MIDI_EXPORT_WIZARD_SHOW_FILE_CHOOSER & (midi_export_wizard->flags)) != 0){ /* show/hide */ gtk_widget_hide(gtk_widget_get_parent(midi_export_wizard->file_chooser)); gtk_widget_show(gtk_widget_get_parent(midi_export_wizard->machine_collection)); gtk_widget_show_all(midi_export_wizard->machine_collection); midi_export_wizard->flags |= AGS_MIDI_EXPORT_WIZARD_SHOW_MACHINE_COLLECTION; midi_export_wizard->flags &= (~AGS_MIDI_EXPORT_WIZARD_SHOW_FILE_CHOOSER); } } break; case GTK_RESPONSE_ACCEPT: { if((AGS_MIDI_EXPORT_WIZARD_SHOW_MACHINE_COLLECTION & (midi_export_wizard->flags)) != 0){ /* show/hide */ midi_export_wizard->flags |= AGS_MIDI_EXPORT_WIZARD_SHOW_FILE_CHOOSER; midi_export_wizard->flags &= (~AGS_MIDI_EXPORT_WIZARD_SHOW_MACHINE_COLLECTION); gtk_widget_hide(gtk_widget_get_parent(midi_export_wizard->machine_collection)); gtk_widget_show(gtk_widget_get_parent(midi_export_wizard->file_chooser)); gtk_widget_show_all(midi_export_wizard->file_chooser); } } break; case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(wizard)); } case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_CLOSE: case GTK_RESPONSE_CANCEL: { AGS_WINDOW(midi_export_wizard->main_window)->midi_export_wizard = NULL; gtk_widget_destroy(wizard); } break; default: g_warning("unknown response"); } } gsequencer-3.1.3/ags/X/export/ags_machine_collection_callbacks.c0000644000175000017500000000147513605312646021733 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/export/ags_machine_collection_entry.h0000644000175000017500000000477113607210263021156 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_COLLECTION_ENTRY_H__ #define __AGS_MACHINE_COLLECTION_ENTRY_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE_COLLECTION_ENTRY (ags_machine_collection_entry_get_type()) #define AGS_MACHINE_COLLECTION_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE_COLLECTION_ENTRY, AgsMachineCollectionEntry)) #define AGS_MACHINE_COLLECTION_ENTRY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE_COLLECTION_ENTRY, AgsMachineCollectionEntryClass)) #define AGS_IS_MACHINE_COLLECTION_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MACHINE_COLLECTION_ENTRY)) #define AGS_IS_MACHINE_COLLECTION_ENTRY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MACHINE_COLLECTION_ENTRY)) #define AGS_MACHINE_COLLECTION_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MACHINE_COLLECTION_ENTRY, AgsMachineCollectionEntryClass)) typedef struct _AgsMachineCollectionEntry AgsMachineCollectionEntry; typedef struct _AgsMachineCollectionEntryClass AgsMachineCollectionEntryClass; typedef enum{ AGS_MACHINE_COLLECTION_ENTRY_CONNECTED = 1, }AgsMachineCollectionEntryFlags; struct _AgsMachineCollectionEntry { GtkTable table; guint flags; GtkWidget *machine; GtkCheckButton *enabled; GtkLabel *label; GtkEntry *instrument; GtkEntry *sequence; }; struct _AgsMachineCollectionEntryClass { GtkTableClass table; }; GType ags_machine_collection_entry_get_type(void); AgsMachineCollectionEntry* ags_machine_collection_entry_new(GtkWidget *machine); G_END_DECLS #endif /*__AGS_MACHINE_COLLECTION_ENTRY_H__*/ gsequencer-3.1.3/ags/X/export/ags_machine_collection.c0000644000175000017500000002404213607210263017721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_machine_collection_class_init(AgsMachineCollectionClass *machine_collection); void ags_machine_collection_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_collection_applicable_interface_init(AgsApplicableInterface *applicable); void ags_machine_collection_init(AgsMachineCollection *machine_collection); void ags_machine_collection_connect(AgsConnectable *connectable); void ags_machine_collection_disconnect(AgsConnectable *connectable); void ags_machine_collection_set_update(AgsApplicable *applicable, gboolean update); void ags_machine_collection_apply(AgsApplicable *applicable); void ags_machine_collection_reset(AgsApplicable *applicable); /** * SECTION:ags_machine_collection * @short_description: Pack machine entry * @title: AgsMachineCollection * @section_id: * @include: ags/X/ags_machine_collection.h * * #AgsMachineCollection is a composite widget which packs * several #AgsMachineCollectionEntry widgets. */ enum{ PROP_0, }; static gpointer ags_machine_collection_parent_class = NULL; GType ags_machine_collection_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine_collection = 0; static const GTypeInfo ags_machine_collection_info = { sizeof (AgsMachineCollectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_collection_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachineCollection), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_collection_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_collection_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_machine_collection_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine_collection = g_type_register_static(GTK_TYPE_VBOX, "AgsMachineCollection", &ags_machine_collection_info, 0); g_type_add_interface_static(ags_type_machine_collection, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_machine_collection, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine_collection); } return g_define_type_id__volatile; } void ags_machine_collection_class_init(AgsMachineCollectionClass *machine_collection) { ags_machine_collection_parent_class = g_type_class_peek_parent(machine_collection); /* properties */ } void ags_machine_collection_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_collection_connect; connectable->disconnect = ags_machine_collection_disconnect; } void ags_machine_collection_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_machine_collection_set_update; applicable->apply = ags_machine_collection_apply; applicable->reset = ags_machine_collection_reset; } void ags_machine_collection_init(AgsMachineCollection *machine_collection) { GtkScrolledWindow *scrolled_window; machine_collection->flags = 0; scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start(GTK_BOX(machine_collection), (GtkWidget *) scrolled_window, TRUE, TRUE, 0); machine_collection->child = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) machine_collection->child); } void ags_machine_collection_connect(AgsConnectable *connectable) { AgsMachineCollection *machine_collection; GList *list, *list_start; machine_collection = AGS_MACHINE_COLLECTION(connectable); if((AGS_MACHINE_COLLECTION_CONNECTED & (machine_collection->flags)) != 0){ return; } machine_collection->flags |= AGS_MACHINE_COLLECTION_CONNECTED; /* children */ list_start = list = gtk_container_get_children((GtkContainer *) machine_collection->child); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_machine_collection_disconnect(AgsConnectable *connectable) { AgsMachineCollection *machine_collection; GList *list, *list_start; machine_collection = AGS_MACHINE_COLLECTION(connectable); if((AGS_MACHINE_COLLECTION_CONNECTED & (machine_collection->flags)) == 0){ return; } machine_collection->flags &= (~AGS_MACHINE_COLLECTION_CONNECTED); /* children */ list_start = list = gtk_container_get_children((GtkContainer *) machine_collection->child); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_machine_collection_set_update(AgsApplicable *applicable, gboolean update) { AgsMachineCollection *machine_collection; GList *list, *list_start; machine_collection = AGS_MACHINE_COLLECTION(applicable); list_start = list = gtk_container_get_children((GtkContainer *) machine_collection->child); while(list != NULL){ ags_applicable_set_update(AGS_APPLICABLE(list->data), update); list = list->next; } g_list_free(list_start); } void ags_machine_collection_apply(AgsApplicable *applicable) { AgsMachineCollection *machine_collection; GList *list, *list_start; machine_collection = AGS_MACHINE_COLLECTION(applicable); list_start = list = gtk_container_get_children((GtkContainer *) machine_collection->child); while(list != NULL){ ags_applicable_apply(AGS_APPLICABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_machine_collection_reset(AgsApplicable *applicable) { AgsMachineCollection *machine_collection; GList *list, *list_start; machine_collection = AGS_MACHINE_COLLECTION(applicable); list_start = list = gtk_container_get_children((GtkContainer *) machine_collection->child); while(list != NULL){ ags_applicable_reset(AGS_APPLICABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_machine_collection_reload(AgsMachineCollection *machine_collection) { AgsWindow *window; AgsMidiExportWizard *midi_export_wizard; GtkWidget *parent; GList *machine, *machine_start; midi_export_wizard = (AgsMidiExportWizard *) gtk_widget_get_ancestor((GtkWidget *) machine_collection, AGS_TYPE_MIDI_EXPORT_WIZARD); window = (AgsWindow *) midi_export_wizard->main_window; /* destroy old */ parent = gtk_widget_get_parent(GTK_WIDGET(machine_collection->child)); gtk_widget_destroy((GtkWidget *) machine_collection->child); machine_collection->child = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) parent, (GtkWidget *) machine_collection->child); /* add entry */ machine = machine_start = gtk_container_get_children((GtkContainer *) window->machines); while(machine != NULL){ if(AGS_MACHINE(machine->data)->audio != NULL && ags_audio_test_ability_flags(AGS_MACHINE(machine->data)->audio, AGS_SOUND_ABILITY_NOTATION)){ ags_machine_collection_add_entry(machine_collection, machine->data); } machine = machine->next; } g_list_free(machine_start); } void ags_machine_collection_add_entry(AgsMachineCollection *machine_collection, GtkWidget *machine) { AgsMachineCollectionEntry *machine_collection_entry; if(machine == NULL){ return; } //FIXME:JK: deprecated machine_collection_entry = (AgsMachineCollectionEntry *) g_object_newv(machine_collection->child_type, machine_collection->child_parameter_count, machine_collection->child_parameter); g_object_set(machine_collection_entry, "machine", machine, NULL); gtk_box_pack_start(GTK_BOX(machine_collection->child), GTK_WIDGET(machine_collection_entry), FALSE, FALSE, 0); } /** * ags_machine_collection_new: * @child_type: the child type * @child_parameter_count: the child parameter count * @child_parameter: the child parameters * * Creates an #AgsMachineCollection * * Returns: a new #AgsMachineCollection * * Since: 3.0.0 */ AgsMachineCollection* ags_machine_collection_new(GType child_type, guint child_parameter_count, GParameter *child_parameter) { AgsMachineCollection *machine_collection; machine_collection = (AgsMachineCollection *) g_object_new(AGS_TYPE_MACHINE_COLLECTION, NULL); machine_collection->child_type = child_type; machine_collection->child_parameter_count = child_parameter_count; machine_collection->child_parameter = child_parameter; return(machine_collection); } gsequencer-3.1.3/ags/X/export/ags_wave_export_dialog_callbacks.c0000644000175000017500000000556213607210263021771 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_wave_export_dialog_file_chooser_button_callback(GtkWidget *file_chooser_button, AgsWaveExportDialog *wave_export_dialog) { GtkFileChooserDialog *file_chooser; file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new("Export to file ...", GTK_WINDOW(wave_export_dialog), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if(gtk_dialog_run(GTK_DIALOG(file_chooser)) == GTK_RESPONSE_ACCEPT){ char *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser)); gtk_entry_set_text(wave_export_dialog->filename, filename); } gtk_widget_destroy((GtkWidget *) file_chooser); } void ags_wave_export_dialog_start_tact_callback(GtkSpinButton *spin_button, AgsWaveExportDialog *wave_export_dialog) { ags_wave_export_dialog_update_duration(wave_export_dialog); } void ags_wave_export_dialog_end_tact_callback(GtkSpinButton *spin_button, AgsWaveExportDialog *wave_export_dialog) { ags_wave_export_dialog_update_duration(wave_export_dialog); } int ags_wave_export_dialog_apply_callback(GtkWidget *widget, AgsWaveExportDialog *wave_export_dialog) { ags_applicable_apply(AGS_APPLICABLE(wave_export_dialog)); //TODO:JK: remove me // ags_applicable_reset(AGS_APPLICABLE(wave_export_dialog)); return(0); } int ags_wave_export_dialog_ok_callback(GtkWidget *widget, AgsWaveExportDialog *wave_export_dialog) { // ags_applicable_set_update(AGS_APPLICABLE(wave_export_dialog), FALSE); ags_connectable_disconnect(AGS_CONNECTABLE(wave_export_dialog)); ags_applicable_apply(AGS_APPLICABLE(wave_export_dialog)); wave_export_dialog->machine->wave_export_dialog = NULL; gtk_widget_destroy((GtkWidget *) wave_export_dialog); return(0); } int ags_wave_export_dialog_cancel_callback(GtkWidget *widget, AgsWaveExportDialog *wave_export_dialog) { wave_export_dialog->machine->wave_export_dialog = NULL; gtk_widget_destroy((GtkWidget *) wave_export_dialog); return(0); } gsequencer-3.1.3/ags/X/export/ags_midi_export_wizard_callbacks.h0000644000175000017500000000232713607210263022013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_EXPORT_WIZARD_CALLBACKS_H__ #define __AGS_MIDI_EXPORT_WIZARD_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_midi_export_wizard_response_callback(GtkWidget *wizard, gint response, gpointer data); G_END_DECLS #endif /*__AGS_MIDI_EXPORT_WIZARD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_navigation_callbacks.h0000644000175000017500000000470613607210263016731 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NAVIGATION_CALLBACKS_H__ #define __AGS_NAVIGATION_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_navigation_expander_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_bpm_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_rewind_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_prev_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_play_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_stop_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_next_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_forward_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_loop_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_position_tact_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_duration_tact_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_loop_left_tact_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_loop_right_tact_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_raster_callback(GtkWidget *widget, AgsNavigation *navigation); void ags_navigation_soundcard_stop_callback(GObject *soundcard, AgsNavigation *navigation); G_END_DECLS #endif /*__AGS_NAVIGATION_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_automation_window.c0000644000175000017500000001611513607210263016332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_automation_window_class_init(AgsAutomationWindowClass *automation_window); void ags_automation_window_connectable_interface_init(AgsConnectableInterface *connectable); void ags_automation_window_init(AgsAutomationWindow *automation_window); void ags_automation_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_automation_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_automation_window_finalize(GObject *gobject); void ags_automation_window_connect(AgsConnectable *connectable); void ags_automation_window_disconnect(AgsConnectable *connectable); gboolean ags_automation_window_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_automation_window * @short_description: The automation window * @title: AgsAutomationWindow * @section_id: * @include: ags/X/ags_automation_window.h * * #AgsAutomationWindow lets you automation to audio files. Currently only * WAV supported. */ enum{ PROP_0, }; static gpointer ags_automation_window_parent_class = NULL; GType ags_automation_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation_window = 0; static const GTypeInfo ags_automation_window_info = { sizeof (AgsAutomationWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_automation_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAutomationWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_automation_window_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_automation_window_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_automation_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsAutomationWindow", &ags_automation_window_info, 0); g_type_add_interface_static(ags_type_automation_window, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation_window); } return g_define_type_id__volatile; } void ags_automation_window_class_init(AgsAutomationWindowClass *automation_window) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_automation_window_parent_class = g_type_class_peek_parent(automation_window); /* GObjectClass */ gobject = (GObjectClass *) automation_window; gobject->set_property = ags_automation_window_set_property; gobject->get_property = ags_automation_window_get_property; gobject->finalize = ags_automation_window_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) automation_window; widget->delete_event = ags_automation_window_delete_event; } void ags_automation_window_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_automation_window_connect; connectable->disconnect = ags_automation_window_disconnect; } void ags_automation_window_init(AgsAutomationWindow *automation_window) { g_object_set(G_OBJECT(automation_window), "title", "edit automation", NULL); automation_window->flags = 0; automation_window->automation_editor = ags_automation_editor_new(); gtk_container_add((GtkContainer *) automation_window, (GtkWidget *) automation_window->automation_editor); } void ags_automation_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAutomationWindow *automation_window; automation_window = AGS_AUTOMATION_WINDOW(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAutomationWindow *automation_window; automation_window = AGS_AUTOMATION_WINDOW(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_window_finalize(GObject *gobject) { AgsAutomationWindow *automation_window; automation_window = (AgsAutomationWindow *) gobject; /* call parent */ G_OBJECT_CLASS(ags_automation_window_parent_class)->finalize(gobject); } void ags_automation_window_connect(AgsConnectable *connectable) { AgsAutomationWindow *automation_window; automation_window = AGS_AUTOMATION_WINDOW(connectable); if((AGS_AUTOMATION_WINDOW_CONNECTED & (automation_window->flags)) != 0){ return; } automation_window->flags |= AGS_AUTOMATION_WINDOW_CONNECTED; if(automation_window->automation_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(automation_window->automation_editor)); } } void ags_automation_window_disconnect(AgsConnectable *connectable) { AgsAutomationWindow *automation_window; automation_window = AGS_AUTOMATION_WINDOW(connectable); if((AGS_AUTOMATION_WINDOW_CONNECTED & (automation_window->flags)) == 0){ return; } automation_window->flags &= (~AGS_AUTOMATION_WINDOW_CONNECTED); if(automation_window->automation_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(automation_window->automation_editor)); } } gboolean ags_automation_window_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); return(TRUE); } /** * ags_automation_window_new: * @parent_window: the parent #AgsWindow * * Create a new instance of #AgsAutomationWindow * * Returns: the new #AgsAutomationWindow * * Since: 3.0.0 */ AgsAutomationWindow* ags_automation_window_new(GtkWidget *parent_window) { AgsAutomationWindow *automation_window; automation_window = (AgsAutomationWindow *) g_object_new(AGS_TYPE_AUTOMATION_WINDOW, NULL); automation_window->parent_window = parent_window; return(automation_window); } gsequencer-3.1.3/ags/X/ags_plugin_preferences_callbacks.h0000644000175000017500000000212213607210263020437 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_PREFERENCES_CALLBACKS_H__ #define __AGS_PLUGIN_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_PLUGIN_PREFERENCES_CALLBACKS__*/ gsequencer-3.1.3/ags/X/ags_resize_editor.c0000644000175000017500000002414413607210263015433 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_resize_editor_class_init(AgsResizeEditorClass *resize_editor); void ags_resize_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_resize_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_resize_editor_init(AgsResizeEditor *resize_editor); void ags_resize_editor_connect(AgsConnectable *connectable); void ags_resize_editor_disconnect(AgsConnectable *connectable); void ags_resize_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_resize_editor_apply(AgsApplicable *applicable); void ags_resize_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_resize_editor * @short_description: Resize audio channels or pads. * @title: AgsResizeEditor * @section_id: * @include: ags/X/ags_resize_editor.h * * #AgsResizeEditor is a composite widget to resize. A resize editor * should be packed by a #AgsMachineEditor. */ static gpointer ags_resize_editor_parent_class = NULL; AgsConnectableInterface *ags_resize_editor_parent_connectable_interface; GType ags_resize_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_resize_editor = 0; static const GTypeInfo ags_resize_editor_info = { sizeof (AgsResizeEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_resize_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsResizeEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_resize_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_resize_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_resize_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_resize_editor = g_type_register_static(AGS_TYPE_PROPERTY_EDITOR, "AgsResizeEditor", &ags_resize_editor_info, 0); g_type_add_interface_static(ags_type_resize_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_resize_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_resize_editor); } return g_define_type_id__volatile; } void ags_resize_editor_class_init(AgsResizeEditorClass *resize_editor) { ags_resize_editor_parent_class = g_type_class_peek_parent(resize_editor); } void ags_resize_editor_connectable_interface_init(AgsConnectableInterface *connectable) { ags_resize_editor_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_resize_editor_connect; connectable->disconnect = ags_resize_editor_disconnect; } void ags_resize_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_resize_editor_set_update; applicable->apply = ags_resize_editor_apply; applicable->reset = ags_resize_editor_reset; } void ags_resize_editor_init(AgsResizeEditor *resize_editor) { GtkTable *table; GtkAlignment *alignment; GtkLabel *label; table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_box_pack_start(GTK_BOX(resize_editor), GTK_WIDGET(table), FALSE, FALSE, 0); /* audio channels */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("audio channels")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); resize_editor->audio_channels = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1024.0, 1.0); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(resize_editor->audio_channels)); /* output pads */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("outputs")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); resize_editor->output_pads = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1024.0, 1.0); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(resize_editor->output_pads)); /* input pads */ alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("inputs")); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(label)); alignment = (GtkAlignment *) gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_table_attach(table, GTK_WIDGET(alignment), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); resize_editor->input_pads = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1024.0, 1.0); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(resize_editor->input_pads)); } void ags_resize_editor_connect(AgsConnectable *connectable) { ags_resize_editor_parent_connectable_interface->connect(connectable); } void ags_resize_editor_disconnect(AgsConnectable *connectable) { ags_resize_editor_parent_connectable_interface->disconnect(connectable); } void ags_resize_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_resize_editor_apply(AgsApplicable *applicable) { AgsMachineEditor *machine_editor; AgsResizeEditor *resize_editor; AgsAudio *audio; AgsResizeAudio *resize_audio; AgsApplicationContext *application_context; guint audio_channels; guint output_pads, input_pads; resize_editor = AGS_RESIZE_EDITOR(applicable); if((AGS_PROPERTY_EDITOR_ENABLED & (AGS_PROPERTY_EDITOR(resize_editor)->flags)) == 0){ return; } machine_editor = AGS_MACHINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(resize_editor), AGS_TYPE_MACHINE_EDITOR)); application_context = ags_application_context_get_instance(); /* get audio */ audio = machine_editor->machine->audio; /* create task */ audio_channels = gtk_spin_button_get_value_as_int(resize_editor->audio_channels); output_pads = gtk_spin_button_get_value_as_int(resize_editor->output_pads); input_pads = gtk_spin_button_get_value_as_int(resize_editor->input_pads); resize_audio = ags_resize_audio_new(audio, output_pads, input_pads, audio_channels); /* append AgsResizeAudio */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) resize_audio); } void ags_resize_editor_reset(AgsApplicable *applicable) { AgsMachineEditor *machine_editor; AgsResizeEditor *resize_editor; AgsAudio *audio; guint audio_channels; guint min_audio_channels, max_audio_channels; guint output_pads, input_pads; guint min_output_pads, max_output_pads, min_input_pads, max_input_pads; resize_editor = AGS_RESIZE_EDITOR(applicable); machine_editor = AGS_MACHINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(resize_editor), AGS_TYPE_MACHINE_EDITOR)); audio = machine_editor->machine->audio; g_object_get(audio, "audio-channels", &audio_channels, "min-audio-channels", &min_audio_channels, "max-audio-channels", &max_audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, "min-output-pads", &min_output_pads, "max-output-pads", &max_output_pads, "min-input-pads", &min_input_pads, "max-input-pads", &max_input_pads, NULL); /* reset - audio channels */ gtk_spin_button_set_range(resize_editor->audio_channels, (gdouble) min_audio_channels, (gdouble) max_audio_channels); gtk_spin_button_set_value(resize_editor->audio_channels, (gdouble) audio_channels); /* reset - output/input pads */ gtk_spin_button_set_range(resize_editor->output_pads, (gdouble) min_output_pads, (gdouble) max_output_pads); gtk_spin_button_set_range(resize_editor->input_pads, (gdouble) min_input_pads, (gdouble) max_input_pads); gtk_spin_button_set_value(resize_editor->output_pads, (gdouble) output_pads); gtk_spin_button_set_value(resize_editor->input_pads, (gdouble) input_pads); } /** * ags_resize_editor_new: * * Create a new instance of #AgsResizeEditor * * Returns: the new #AgsResizeEditor * * Since: 3.0.0 */ AgsResizeEditor* ags_resize_editor_new() { AgsResizeEditor *resize_editor; resize_editor = (AgsResizeEditor *) g_object_new(AGS_TYPE_RESIZE_EDITOR, NULL); return(resize_editor); } gsequencer-3.1.3/ags/X/ags_automation_editor.c0000644000175000017500000024655313616617253016336 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_automation_editor_class_init(AgsAutomationEditorClass *automation_editor); void ags_automation_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_automation_editor_init(AgsAutomationEditor *automation_editor); void ags_automation_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_automation_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_automation_editor_connect(AgsConnectable *connectable); void ags_automation_editor_disconnect(AgsConnectable *connectable); void ags_automation_editor_finalize(GObject *gobject); void ags_automation_editor_show(GtkWidget *widget); void ags_automation_editor_show_all(GtkWidget *widget); void ags_automation_editor_real_machine_changed(AgsAutomationEditor *automation_editor, AgsMachine *machine); gint ags_automation_editor_paste_automation_all(AgsAutomationEditor *automation_editor, AgsNotebook *notebook, AgsMachine *machine, xmlNode *automation_node, AgsTimestamp *timestamp, gboolean match_line, gboolean no_duplicates, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x); gint ags_automation_editor_paste_automation(AgsAutomationEditor *automation_editor, AgsNotebook *notebook, AgsMachine *machine, xmlNode *audio_node, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x); enum{ MACHINE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, }; static gpointer ags_automation_editor_parent_class = NULL; static guint automation_editor_signals[LAST_SIGNAL]; /** * SECTION:ags_automation_editor * @short_description: A composite widget to edit automation * @title: AgsAutomationEditor * @section_id: * @include: ags/X/ags_automation_editor.h * * #AgsAutomationEditor is a composite widget to edit automation. You may select machines * or change editor tool to do automation. */ GType ags_automation_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation_editor = 0; static const GTypeInfo ags_automation_editor_info = { sizeof (AgsAutomationEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_automation_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAutomationEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_automation_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_automation_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_automation_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsAutomationEditor", &ags_automation_editor_info, 0); g_type_add_interface_static(ags_type_automation_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation_editor); } return g_define_type_id__volatile; } void ags_automation_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_automation_editor_connect; connectable->disconnect = ags_automation_editor_disconnect; } void ags_automation_editor_class_init(AgsAutomationEditorClass *automation_editor) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_automation_editor_parent_class = g_type_class_peek_parent(automation_editor); /* GObjectClass */ gobject = (GObjectClass *) automation_editor; gobject->set_property = ags_automation_editor_set_property; gobject->get_property = ags_automation_editor_get_property; gobject->finalize = ags_automation_editor_finalize; /* properties */ /* GtkWidgetClass */ widget = (GtkWidgetClass *) automation_editor; widget->show = ags_automation_editor_show; widget->show_all = ags_automation_editor_show_all; /* AgsEditorClass */ automation_editor->machine_changed = ags_automation_editor_real_machine_changed; /* signals */ /** * AgsEditor::machine-changed: * @editor: the object to change machine. * @machine: the #AgsMachine to set * * The ::machine-changed signal notifies about changed machine. * * Since: 3.0.0 */ automation_editor_signals[MACHINE_CHANGED] = g_signal_new("machine-changed", G_TYPE_FROM_CLASS(automation_editor), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAutomationEditorClass, machine_changed), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_automation_editor_init(AgsAutomationEditor *automation_editor) { GtkViewport *viewport; GtkHBox *hbox; GtkScrolledWindow *scrolled_window; GtkTable *table; GtkStyleContext *style_context; GtkAdjustment *adjustment; AgsConfig *config; gchar *str; gdouble gui_scale_factor; automation_editor->flags = (AGS_AUTOMATION_EDITOR_PASTE_MATCH_LINE | AGS_AUTOMATION_EDITOR_PASTE_NO_DUPLICATES); automation_editor->version = AGS_AUTOMATION_EDITOR_DEFAULT_VERSION; automation_editor->build_id = AGS_AUTOMATION_EDITOR_DEFAULT_BUILD_ID; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } /* offset */ automation_editor->tact_counter = 0; automation_editor->current_tact = 0.0; /* automation toolbar */ automation_editor->automation_toolbar = ags_automation_toolbar_new(); gtk_box_pack_start((GtkBox *) automation_editor, (GtkWidget *) automation_editor->automation_toolbar, FALSE, FALSE, 0); /* paned */ automation_editor->paned = (GtkHPaned *) gtk_hpaned_new(); gtk_box_pack_start((GtkBox *) automation_editor, (GtkWidget *) automation_editor->paned, TRUE, TRUE, 0); /* machine selector */ viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_paned_pack1((GtkPaned *) automation_editor->paned, (GtkWidget *) viewport, FALSE, TRUE); scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(scrolled_window)); automation_editor->machine_selector = g_object_new(AGS_TYPE_MACHINE_SELECTOR, "homogeneous", FALSE, "spacing", 0, NULL); automation_editor->machine_selector->flags |= (AGS_MACHINE_SELECTOR_AUTOMATION); gtk_label_set_label(automation_editor->machine_selector->label, i18n("automation")); automation_editor->machine_selector->popup = ags_machine_selector_popup_new(automation_editor->machine_selector); g_object_set(automation_editor->machine_selector->menu_button, "menu", automation_editor->machine_selector->popup, NULL); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) automation_editor->machine_selector); /* selected machine */ automation_editor->selected_machine = NULL; /* notebook audio, output, input */ hbox = gtk_hbox_new(FALSE, 0); gtk_paned_pack2((GtkPaned *) automation_editor->paned, (GtkWidget *) hbox, TRUE, TRUE); viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) viewport, TRUE, TRUE, 0); automation_editor->notebook = (GtkNotebook *) gtk_notebook_new(); gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(automation_editor->notebook)); /* audio */ table = (GtkTable *) gtk_table_new(4, 3, FALSE); gtk_notebook_append_page(automation_editor->notebook, (GtkWidget *) table, gtk_label_new(i18n("audio"))); /* audio - scrollbars */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_HEIGHT), 1.0); automation_editor->audio_vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) automation_editor->audio_vscrollbar, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH), 1.0); automation_editor->audio_hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) automation_editor->audio_hscrollbar, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* audio - ruler */ automation_editor->audio_ruler = ags_ruler_new(); g_object_set(automation_editor->audio_ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), NULL); gtk_widget_set_size_request((GtkWidget *) automation_editor->audio_ruler, -1, (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT)); gtk_table_attach(table, (GtkWidget *) automation_editor->audio_ruler, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* audio - scale */ automation_editor->audio_scrolled_scale_box = ags_scrolled_scale_box_new(); gtk_widget_set_vexpand(automation_editor->audio_scrolled_scale_box, TRUE); g_object_set(automation_editor->audio_scrolled_scale_box, "margin-top", (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT), NULL); automation_editor->audio_scrolled_scale_box->scale_box = (AgsScaleBox *) ags_vscale_box_new(); g_object_set(automation_editor->audio_scrolled_scale_box->scale_box, "fixed-scale-width", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH), "fixed-scale-height", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(automation_editor->audio_scrolled_scale_box->viewport), GTK_WIDGET(automation_editor->audio_scrolled_scale_box->scale_box)); gtk_widget_set_size_request((GtkWidget *) automation_editor->audio_scrolled_scale_box, (gint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH), -1); gtk_table_attach(table, (GtkWidget *) automation_editor->audio_scrolled_scale_box, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); /* audio - automation edit */ automation_editor->audio_scrolled_automation_edit_box = ags_scrolled_automation_edit_box_new(); automation_editor->audio_scrolled_automation_edit_box->automation_edit_box = (AgsAutomationEditBox *) ags_vautomation_edit_box_new(); g_object_set(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box, "fixed-edit-height", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(automation_editor->audio_scrolled_automation_edit_box->viewport), GTK_WIDGET(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box)); gtk_table_attach(table, (GtkWidget *) automation_editor->audio_scrolled_automation_edit_box, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_set_events(GTK_WIDGET(automation_editor->audio_scrolled_automation_edit_box->viewport), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK); /* output */ table = (GtkTable *) gtk_table_new(4, 3, FALSE); gtk_notebook_append_page(automation_editor->notebook, (GtkWidget *) table, gtk_label_new(i18n("output"))); /* output - scrollbars */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_HEIGHT), 1.0); automation_editor->output_vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) automation_editor->output_vscrollbar, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH), 1.0); automation_editor->output_hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) automation_editor->output_hscrollbar, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* output - notebook */ automation_editor->output_notebook = g_object_new(AGS_TYPE_NOTEBOOK, "homogeneous", FALSE, "spacing", 0, "prefix", i18n("line"), NULL); gtk_table_attach(table, (GtkWidget *) automation_editor->output_notebook, 0, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* output - ruler */ automation_editor->output_ruler = ags_ruler_new(); gtk_widget_set_size_request((GtkWidget *) automation_editor->output_ruler, -1, (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT)); g_object_set(automation_editor->output_ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), NULL); gtk_table_attach(table, (GtkWidget *) automation_editor->output_ruler, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* output - scale */ automation_editor->output_scrolled_scale_box = ags_scrolled_scale_box_new(); gtk_widget_set_vexpand(automation_editor->output_scrolled_scale_box, TRUE); g_object_set(automation_editor->output_scrolled_scale_box, "margin-top", (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT), NULL); automation_editor->output_scrolled_scale_box->scale_box = (AgsScaleBox *) ags_vscale_box_new(); g_object_set(automation_editor->output_scrolled_scale_box->scale_box, "fixed-scale-width", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH), "fixed-scale-height", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(automation_editor->output_scrolled_scale_box->viewport), GTK_WIDGET(automation_editor->output_scrolled_scale_box->scale_box)); gtk_widget_set_size_request((GtkWidget *) automation_editor->output_scrolled_scale_box, (gint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH), -1); gtk_table_attach(table, (GtkWidget *) automation_editor->output_scrolled_scale_box, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); /* output - automation edit */ automation_editor->output_scrolled_automation_edit_box = ags_scrolled_automation_edit_box_new(); automation_editor->output_scrolled_automation_edit_box->automation_edit_box = (AgsAutomationEditBox *) ags_vautomation_edit_box_new(); g_object_set(automation_editor->output_scrolled_automation_edit_box->automation_edit_box, "fixed-edit-height", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(automation_editor->output_scrolled_automation_edit_box->viewport), GTK_WIDGET(automation_editor->output_scrolled_automation_edit_box->automation_edit_box)); gtk_table_attach(table, (GtkWidget *) automation_editor->output_scrolled_automation_edit_box, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_set_events(GTK_WIDGET(automation_editor->output_scrolled_automation_edit_box->viewport), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK); /* input */ table = (GtkTable *) gtk_table_new(4, 3, FALSE); gtk_notebook_append_page(automation_editor->notebook, (GtkWidget *) table, gtk_label_new(i18n("input"))); /* input - scrollbars */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_HEIGHT), 1.0); automation_editor->input_vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) automation_editor->input_vscrollbar, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH), 1.0); automation_editor->input_hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); gtk_table_attach(table, (GtkWidget *) automation_editor->input_hscrollbar, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* input - notebook */ automation_editor->input_notebook = g_object_new(AGS_TYPE_NOTEBOOK, "homogeneous", FALSE, "spacing", 0, "prefix", i18n("line"), NULL); gtk_table_attach(table, (GtkWidget *) automation_editor->input_notebook, 0, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* input - ruler */ automation_editor->input_ruler = ags_ruler_new(); gtk_widget_set_size_request((GtkWidget *) automation_editor->input_ruler, -1, (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT)); g_object_set(automation_editor->input_ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), NULL); gtk_table_attach(table, (GtkWidget *) automation_editor->input_ruler, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); /* input - scale */ automation_editor->input_scrolled_scale_box = ags_scrolled_scale_box_new(); gtk_widget_set_vexpand(automation_editor->input_scrolled_scale_box, TRUE); g_object_set(automation_editor->input_scrolled_scale_box, "margin-top", (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT), NULL); automation_editor->input_scrolled_scale_box->scale_box = (AgsScaleBox *) ags_vscale_box_new(); g_object_set(automation_editor->input_scrolled_scale_box->scale_box, "fixed-scale-width", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH), "fixed-scale-height", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(automation_editor->input_scrolled_scale_box->viewport), GTK_WIDGET(automation_editor->input_scrolled_scale_box->scale_box)); gtk_widget_set_size_request((GtkWidget *) automation_editor->input_scrolled_scale_box, (gint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH), -1); gtk_table_attach(table, (GtkWidget *) automation_editor->input_scrolled_scale_box, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_show_all(GTK_WIDGET(automation_editor->input_scrolled_scale_box)); gtk_widget_show_all(GTK_WIDGET(automation_editor->input_scrolled_scale_box->viewport)); /* input automation edit */ automation_editor->input_scrolled_automation_edit_box = ags_scrolled_automation_edit_box_new(); automation_editor->input_scrolled_automation_edit_box->automation_edit_box = (AgsAutomationEditBox *) ags_vautomation_edit_box_new(); g_object_set(automation_editor->input_scrolled_automation_edit_box->automation_edit_box, "fixed-edit-height", (guint) (gui_scale_factor * AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT), NULL); gtk_container_add(GTK_CONTAINER(automation_editor->input_scrolled_automation_edit_box->viewport), GTK_WIDGET(automation_editor->input_scrolled_automation_edit_box->automation_edit_box)); gtk_table_attach(table, (GtkWidget *) automation_editor->input_scrolled_automation_edit_box, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); gtk_widget_set_events(GTK_WIDGET(automation_editor->input_scrolled_automation_edit_box->viewport), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK); /* focused automation edit */ automation_editor->focused_automation_edit = NULL; /* automation meta */ automation_editor->automation_meta = ags_automation_meta_new(); g_object_set(automation_editor->automation_meta, "valign", GTK_ALIGN_START, NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) automation_editor->automation_meta, FALSE, FALSE, 0); /* style context */ style_context = gtk_widget_get_style_context(automation_editor); gtk_style_context_add_class(style_context, "editor"); } void ags_automation_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_editor_connect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(connectable); if((AGS_AUTOMATION_EDITOR_CONNECTED & (automation_editor->flags)) != 0){ return; } automation_editor->flags |= AGS_AUTOMATION_EDITOR_CONNECTED; /* audio */ g_signal_connect_after((GObject *) automation_editor->audio_scrolled_automation_edit_box->viewport, "configure_event", G_CALLBACK(ags_automation_editor_audio_edit_configure_event), (gpointer) automation_editor); g_signal_connect_after((GObject *) automation_editor->audio_vscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_audio_vscrollbar_value_changed), (gpointer) automation_editor); g_signal_connect_after((GObject *) automation_editor->audio_hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_audio_hscrollbar_value_changed), (gpointer) automation_editor); /* output */ g_signal_connect_after((GObject *) automation_editor->output_scrolled_automation_edit_box->viewport, "configure_event", G_CALLBACK(ags_automation_editor_output_edit_configure_event), (gpointer) automation_editor); g_signal_connect_after((GObject *) automation_editor->output_vscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_output_vscrollbar_value_changed), (gpointer) automation_editor); g_signal_connect_after((GObject *) automation_editor->output_hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_output_hscrollbar_value_changed), (gpointer) automation_editor); /* input */ g_signal_connect_after((GObject *) automation_editor->input_scrolled_automation_edit_box->viewport, "configure_event", G_CALLBACK(ags_automation_editor_input_edit_configure_event), (gpointer) automation_editor); g_signal_connect_after((GObject *) automation_editor->input_vscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_input_vscrollbar_value_changed), (gpointer) automation_editor); g_signal_connect_after((GObject *) automation_editor->input_hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_input_hscrollbar_value_changed), (gpointer) automation_editor); /* machine selector */ g_signal_connect((GObject *) automation_editor->machine_selector, "changed", G_CALLBACK(ags_automation_editor_machine_changed_callback), (gpointer) automation_editor); /* toolbar and selector */ ags_connectable_connect(AGS_CONNECTABLE(automation_editor->automation_toolbar)); ags_connectable_connect(AGS_CONNECTABLE(automation_editor->machine_selector)); ags_connectable_connect(AGS_CONNECTABLE(automation_editor->automation_meta)); } void ags_automation_editor_disconnect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(connectable); if((AGS_AUTOMATION_EDITOR_CONNECTED & (automation_editor->flags)) == 0){ return; } automation_editor->flags &= (~AGS_AUTOMATION_EDITOR_CONNECTED); /* audio */ g_object_disconnect((GObject *) automation_editor->audio_scrolled_automation_edit_box->viewport, "any_signal::configure_event", G_CALLBACK(ags_automation_editor_audio_edit_configure_event), automation_editor, NULL); /* output */ g_object_disconnect((GObject *) automation_editor->output_scrolled_automation_edit_box->viewport, "any_signal::configure_event", G_CALLBACK(ags_automation_editor_output_edit_configure_event), automation_editor, NULL); /* input */ g_object_disconnect((GObject *) automation_editor->input_scrolled_automation_edit_box->viewport, "any_signal::configure_event", G_CALLBACK(ags_automation_editor_input_edit_configure_event), automation_editor, NULL); /* toolbar and selector */ ags_connectable_disconnect(AGS_CONNECTABLE(automation_editor->automation_toolbar)); ags_connectable_disconnect(AGS_CONNECTABLE(automation_editor->machine_selector)); ags_connectable_disconnect(AGS_CONNECTABLE(automation_editor->automation_meta)); } void ags_automation_editor_finalize(GObject *gobject) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gobject); /* call parent */ G_OBJECT_CLASS(ags_automation_editor_parent_class)->finalize(gobject); } void ags_automation_editor_reset_audio_scrollbar(AgsAutomationEditor *automation_editor) { AgsAutomationToolbar *automation_toolbar; GtkAdjustment *audio_vscrollbar_adjustment; GtkAdjustment *audio_hscrollbar_adjustment; GtkAllocation automation_edit_box_allocation; GtkAllocation viewport_allocation; GList *list_start, *list; gdouble old_h_upper; gdouble v_upper, h_upper; double zoom_factor, zoom; double zoom_correction; guint map_width; automation_toolbar = automation_editor->automation_toolbar; /* audio */ gtk_widget_get_allocation(GTK_WIDGET(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box), &automation_edit_box_allocation); gtk_widget_get_allocation(GTK_WIDGET(automation_editor->audio_scrolled_automation_edit_box->viewport), &viewport_allocation); /* reset vertical scrollbar */ v_upper = automation_edit_box_allocation.height - viewport_allocation.height; if(v_upper < 0.0){ v_upper = 0.0; } audio_vscrollbar_adjustment = gtk_range_get_adjustment(automation_editor->audio_vscrollbar); gtk_adjustment_set_upper(audio_vscrollbar_adjustment, v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(automation_editor->audio_scrolled_automation_edit_box->viewport), v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(automation_editor->audio_scrolled_scale_box->viewport), v_upper); /* reset horizontal scrollbar */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom) - 2.0); /* upper */ audio_hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_editor->audio_hscrollbar)); old_h_upper = gtk_adjustment_get_upper(audio_hscrollbar_adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_AUTOMATION_EDITOR_MAX_CONTROLS * zoom * zoom_correction); h_upper = map_width - automation_edit_box_allocation.width; if(h_upper < 0.0){ h_upper = 0.0; } gtk_adjustment_set_upper(automation_editor->audio_ruler->adjustment, h_upper); gtk_adjustment_set_upper(audio_hscrollbar_adjustment, h_upper); /* automation edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ GtkAdjustment *adjustment; adjustment = gtk_range_get_adjustment(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar)); gtk_adjustment_set_upper(adjustment, h_upper); list = list->next; } g_list_free(list_start); /* reset value */ if(old_h_upper != 0.0){ #if 0 gtk_adjustment_set_value(audio_hscrollbar_adjustment, gtk_adjustment_get_value(audio_hscrollbar_adjustment) / old_h_upper * h_upper); #endif } } void ags_automation_editor_reset_output_scrollbar(AgsAutomationEditor *automation_editor) { AgsAutomationToolbar *automation_toolbar; GtkAdjustment *output_vscrollbar_adjustment; GtkAdjustment *output_hscrollbar_adjustment; GtkAllocation automation_edit_box_allocation; GtkAllocation viewport_allocation; GList *list_start, *list; gdouble old_h_upper; gdouble v_upper, h_upper; double zoom_factor, zoom; double zoom_correction; guint map_width; automation_toolbar = automation_editor->automation_toolbar; /* output */ gtk_widget_get_allocation(GTK_WIDGET(automation_editor->output_scrolled_automation_edit_box->automation_edit_box), &automation_edit_box_allocation); gtk_widget_get_allocation(GTK_WIDGET(automation_editor->output_scrolled_automation_edit_box->viewport), &viewport_allocation); /* reset vertical scrollbar */ v_upper = automation_edit_box_allocation.height - viewport_allocation.height; if(v_upper < 0.0){ v_upper = 0.0; } output_vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_editor->output_vscrollbar)); gtk_adjustment_set_upper(output_vscrollbar_adjustment, v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(automation_editor->output_scrolled_automation_edit_box->viewport), v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(automation_editor->output_scrolled_scale_box->viewport), v_upper); /* reset horizontal scrollbar */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom) - 2.0); /* upper */ output_hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_editor->output_hscrollbar)); old_h_upper = gtk_adjustment_get_upper(output_hscrollbar_adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_AUTOMATION_EDITOR_MAX_CONTROLS * zoom * zoom_correction); h_upper = map_width - automation_edit_box_allocation.width; if(h_upper < 0.0){ h_upper = 0.0; } gtk_adjustment_set_upper(automation_editor->output_ruler->adjustment, h_upper); gtk_adjustment_set_upper(output_hscrollbar_adjustment, h_upper); /* automation edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->output_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ GtkAdjustment *adjustment; adjustment = gtk_range_get_adjustment(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar)); gtk_adjustment_set_upper(adjustment, h_upper); list = list->next; } g_list_free(list_start); /* reset value */ if(old_h_upper != 0.0){ #if 0 gtk_adjustment_set_value(output_hscrollbar_adjustment, gtk_adjustment_get_value(output_hscrollbar_adjustment) / old_h_upper * h_upper); #endif } } void ags_automation_editor_reset_input_scrollbar(AgsAutomationEditor *automation_editor) { AgsAutomationToolbar *automation_toolbar; GtkAdjustment *input_vscrollbar_adjustment; GtkAdjustment *input_hscrollbar_adjustment; GtkAllocation automation_edit_box_allocation; GtkAllocation viewport_allocation; GList *list_start, *list; gdouble old_h_upper; gdouble v_upper, h_upper; double zoom_factor, zoom; double zoom_correction; guint map_width; automation_toolbar = automation_editor->automation_toolbar; /* input */ gtk_widget_get_allocation(GTK_WIDGET(automation_editor->input_scrolled_automation_edit_box->automation_edit_box), &automation_edit_box_allocation); gtk_widget_get_allocation(GTK_WIDGET(automation_editor->input_scrolled_automation_edit_box->viewport), &viewport_allocation); /* reset vertical scrollbar */ v_upper = automation_edit_box_allocation.height - viewport_allocation.height; if(v_upper < 0.0){ v_upper = 0.0; } input_vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_editor->input_vscrollbar)); gtk_adjustment_set_upper(input_vscrollbar_adjustment, v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(automation_editor->input_scrolled_automation_edit_box->viewport), v_upper); gtk_adjustment_set_upper(gtk_viewport_get_vadjustment(automation_editor->input_scrolled_scale_box->viewport), v_upper); /* reset horizontal scrollbar */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom) - 2.0); /* upper */ input_hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_editor->input_hscrollbar)); old_h_upper = gtk_adjustment_get_upper(input_hscrollbar_adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_AUTOMATION_EDITOR_MAX_CONTROLS * zoom * zoom_correction); h_upper = map_width - automation_edit_box_allocation.width; if(h_upper < 0.0){ h_upper = 0.0; } gtk_adjustment_set_upper(automation_editor->input_ruler->adjustment, h_upper); gtk_adjustment_set_upper(input_hscrollbar_adjustment, h_upper); /* automation edit */ list_start = list = gtk_container_get_children(GTK_CONTAINER(automation_editor->input_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ GtkAdjustment *adjustment; adjustment = gtk_range_get_adjustment(GTK_RANGE(AGS_AUTOMATION_EDIT(list->data)->hscrollbar)); gtk_adjustment_set_upper(adjustment, h_upper); list = list->next; } g_list_free(list_start); /* reset value */ if(old_h_upper != 0.0){ #if 0 gtk_adjustment_set_value(input_hscrollbar_adjustment, gtk_adjustment_get_value(input_hscrollbar_adjustment) / old_h_upper * h_upper); #endif } } void ags_automation_editor_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_automation_editor_parent_class)->show(widget); gtk_widget_hide(AGS_AUTOMATION_EDITOR(widget)->automation_meta); } void ags_automation_editor_show_all(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_automation_editor_parent_class)->show_all(widget); gtk_widget_hide(AGS_AUTOMATION_EDITOR(widget)->automation_meta); } void ags_automation_editor_real_machine_changed(AgsAutomationEditor *automation_editor, AgsMachine *machine) { AgsMachine *old_machine; AgsConfig *config; GList *list_start, *list; GList *tab; gchar *str; gdouble gui_scale_factor; guint length; guint output_pads, input_pads; guint audio_channels; guint i; GRecMutex *audio_mutex; GRecMutex *automation_mutex; /* disconnect set pads - old */ old_machine = automation_editor->selected_machine; if(old_machine != NULL){ g_object_disconnect(old_machine, "any_signal::resize-audio-channels", G_CALLBACK(ags_automation_editor_resize_audio_channels_callback), (gpointer) automation_editor, "any_signal::resize-pads", G_CALLBACK(ags_automation_editor_resize_pads_callback), (gpointer) automation_editor, NULL); } config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } /* get audio mutex */ audio_mutex = NULL; if(machine != NULL){ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(machine->audio); } /* notebook - remove tabs */ length = g_list_length(automation_editor->output_notebook->tab); for(i = 0; i < length; i++){ ags_notebook_remove_tab(automation_editor->output_notebook, 0); } length = g_list_length(automation_editor->input_notebook->tab); for(i = 0; i < length; i++){ ags_notebook_remove_tab(automation_editor->input_notebook, 0); } /* notebook - add tabs */ if(machine != NULL){ g_rec_mutex_lock(audio_mutex); output_pads = machine->audio->output_pads; input_pads = machine->audio->input_pads; audio_channels = machine->audio->audio_channels; g_rec_mutex_unlock(audio_mutex); for(i = 0; i < output_pads * audio_channels; i++){ ags_notebook_insert_tab(automation_editor->output_notebook, i); tab = automation_editor->output_notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } for(i = 0; i < input_pads * audio_channels; i++){ ags_notebook_insert_tab(automation_editor->input_notebook, i); tab = automation_editor->input_notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } } /* * destroy old */ /* audio */ list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->audio_scrolled_scale_box->scale_box)); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ g_object_disconnect(AGS_AUTOMATION_EDIT(list->data)->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_automation_editor_audio_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor, NULL); gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); /* output */ list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->output_scrolled_scale_box->scale_box)); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->output_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ g_object_disconnect(AGS_AUTOMATION_EDIT(list->data)->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_automation_editor_output_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor, NULL); gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); /* input */ list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->input_scrolled_scale_box->scale_box)); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->input_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ g_object_disconnect(AGS_AUTOMATION_EDIT(list->data)->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_automation_editor_input_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor, NULL); gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); /* * add new */ if(machine != NULL){ AgsChannel *start_channel, *channel; GList *automation_port; GList *start_audio_port; GList *start_output_port; GList *start_input_port; GList *start_port, *port; /* audio */ automation_port = machine->enabled_automation_port; start_audio_port = ags_audio_collect_all_audio_ports(machine->audio); g_object_get(machine->audio, "output", &start_channel, NULL); channel = start_channel; start_output_port = NULL; while(channel != NULL){ AgsChannel *next_channel; GList *list; list = ags_channel_collect_all_channel_ports(channel); if(start_output_port == NULL){ start_output_port = list; }else{ start_output_port = g_list_concat(start_output_port, list); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_get(machine->audio, "input", &start_channel, NULL); channel = start_channel; start_input_port = NULL; while(channel != NULL){ AgsChannel *next_channel; GList *list; list = ags_channel_collect_all_channel_ports(channel); if(start_input_port == NULL){ start_input_port = list; }else{ start_input_port = g_list_concat(start_input_port, list); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } while(automation_port != NULL){ AgsAutomationEdit *automation_edit; AgsScale *scale; AgsPluginPort *plugin_port; gchar *control_name; gdouble upper, lower; gdouble default_value; g_message("%s", AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->control_name); /* scale */ scale = ags_scale_new(); g_object_set(scale, "scale-width", (guint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_WIDTH), "scale-height", (guint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT), NULL); control_name = g_strdup(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->control_name); start_port = NULL; if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == G_TYPE_NONE){ start_port = start_audio_port; }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_OUTPUT){ start_port = start_output_port; }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_INPUT){ start_port = start_input_port; } upper = 0.0; lower = 0.0; default_value = 0.0; port = start_port; while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean success; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); success = FALSE; if(!g_strcmp0(specifier, control_name)){ GValue *upper_value; GValue *lower_value; GValue *value; g_object_get(plugin_port, "upper-value", &upper_value, "lower-value", &lower_value, "default-value", &value, NULL); upper = g_value_get_float(upper_value); lower = g_value_get_float(lower_value); default_value = g_value_get_float(value); g_value_unset(upper_value); g_free(upper_value); g_value_unset(lower_value); g_free(lower_value); g_value_unset(value); g_free(value); success = TRUE; } if(plugin_port != NULL){ g_object_unref(plugin_port); } if(success){ break; } port = port->next; } g_object_set(scale, "control-name", control_name, "upper", upper, "lower", lower, "default-value", default_value, NULL); if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == G_TYPE_NONE){ gtk_box_pack_start(GTK_BOX(automation_editor->audio_scrolled_scale_box->scale_box), GTK_WIDGET(scale), FALSE, TRUE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_OUTPUT){ gtk_box_pack_start(GTK_BOX(automation_editor->output_scrolled_scale_box->scale_box), GTK_WIDGET(scale), FALSE, TRUE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_INPUT){ gtk_box_pack_start(GTK_BOX(automation_editor->input_scrolled_scale_box->scale_box), GTK_WIDGET(scale), FALSE, TRUE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); } { GtkAllocation allocation; gtk_widget_get_allocation(scale, &allocation); g_message("%d|%d %d,%d", allocation.x, allocation.y, allocation.width, allocation.height); } gtk_widget_show(GTK_WIDGET(scale)); /* automation edit */ automation_edit = ags_automation_edit_new(); g_object_set(automation_edit, "channel-type", AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type, "control-specifier", AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->control_name, "control-name", control_name, "upper", upper, "lower", lower, "default-value", default_value, NULL); if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == G_TYPE_NONE){ gtk_box_pack_start(GTK_BOX(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box), GTK_WIDGET(automation_edit), FALSE, TRUE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_OUTPUT){ gtk_box_pack_start(GTK_BOX(automation_editor->output_scrolled_automation_edit_box->automation_edit_box), GTK_WIDGET(automation_edit), FALSE, TRUE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_INPUT){ gtk_box_pack_start(GTK_BOX(automation_editor->input_scrolled_automation_edit_box->automation_edit_box), GTK_WIDGET(automation_edit), FALSE, TRUE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); } ags_connectable_connect(AGS_CONNECTABLE(automation_edit)); gtk_widget_show(GTK_WIDGET(automation_edit)); if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == G_TYPE_NONE){ g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_audio_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor); }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_OUTPUT){ g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_output_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor); }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_INPUT){ g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_input_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor); } g_free(control_name); /* iterate */ automation_port = automation_port->next; } g_list_free_full(start_audio_port, (GDestroyNotify) g_object_unref); g_list_free_full(start_output_port, (GDestroyNotify) g_object_unref); g_list_free_full(start_input_port, (GDestroyNotify) g_object_unref); } /* selected machine */ automation_editor->selected_machine = machine; /* connect set-pads - new */ if(machine != NULL){ g_signal_connect_after(machine, "resize-audio-channels", G_CALLBACK(ags_automation_editor_resize_audio_channels_callback), automation_editor); g_signal_connect_after(machine, "resize-pads", G_CALLBACK(ags_automation_editor_resize_pads_callback), automation_editor); } } /** * ags_automation_editor_machine_changed: * @automation_editor: an #AgsAutomationEditor * @machine: the new #AgsMachine * * Is emitted as machine changed of automation editor. * * Since: 3.0.0 */ void ags_automation_editor_machine_changed(AgsAutomationEditor *automation_editor, AgsMachine *machine) { g_return_if_fail(AGS_IS_AUTOMATION_EDITOR(automation_editor)); g_object_ref((GObject *) automation_editor); g_signal_emit((GObject *) automation_editor, automation_editor_signals[MACHINE_CHANGED], 0, machine); g_object_unref((GObject *) automation_editor); } void ags_automation_editor_add_acceleration(AgsAutomationEditor *automation_editor, AgsAcceleration *acceleration) { AgsMachine *machine; AgsNotebook *notebook; AgsAutomation *automation; AgsTimestamp *timestamp; GList *list_automation; gint i; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor) || !AGS_IS_ACCELERATION(acceleration) || automation_editor->focused_automation_edit == NULL){ return; } if(automation_editor->selected_machine != NULL){ AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel; GRecMutex *audio_mutex; machine = automation_editor->selected_machine; notebook = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(machine->audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); start_output = machine->audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = machine->audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* check all active tabs */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(acceleration->x / AGS_AUTOMATION_DEFAULT_OFFSET); i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ AgsAcceleration *new_acceleration; GList *start_play_port, *play_port; GList *start_recall_port, *recall_port; GList *start_list, *list; play_port = NULL; recall_port = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ nth_channel = ags_channel_nth(start_output, i); play_port = start_play_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, TRUE); recall_port = start_recall_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, FALSE); if(nth_channel != NULL){ g_object_unref(nth_channel); } }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ nth_channel = ags_channel_nth(start_input, i); play_port = start_play_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, TRUE); recall_port = start_recall_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, FALSE); if(nth_channel != NULL){ g_object_unref(nth_channel); } }else{ play_port = start_play_port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, automation_editor->focused_automation_edit->control_name, TRUE); recall_port = start_recall_port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, automation_editor->focused_automation_edit->control_name, FALSE); } /* play port */ while(play_port != NULL){ AgsPort *current_port; current_port = play_port->data; g_object_get(current_port, "automation", &start_list, NULL); list = ags_automation_find_near_timestamp(start_list, i, timestamp); if(list == NULL){ automation = ags_automation_new(G_OBJECT(machine->audio), i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name); automation->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; g_object_set(automation, "port", current_port, NULL); /* add to audio */ ags_audio_add_automation(machine->audio, (GObject *) automation); /* add to port */ ags_port_add_automation(current_port, (GObject *) automation); }else{ automation = list->data; } new_acceleration = ags_acceleration_duplicate(acceleration); ags_automation_add_acceleration(automation, new_acceleration, FALSE); g_list_free_full(start_list, g_object_unref); /* iterate */ play_port = play_port->next; } g_list_free_full(start_play_port, g_object_unref); /* recall port */ if(recall_port != NULL){ AgsPort *current_port; current_port = recall_port->data; g_object_get(current_port, "automation", &start_list, NULL); list = ags_automation_find_near_timestamp(start_list, i, timestamp); if(list == NULL){ automation = ags_automation_new(G_OBJECT(machine->audio), i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name); automation->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; g_object_set(automation, "port", current_port, NULL); /* add to audio */ ags_audio_add_automation(machine->audio, (GObject *) automation); /* add to port */ ags_port_add_automation(current_port, (GObject *) automation); }else{ automation = list->data; } new_acceleration = ags_acceleration_duplicate(acceleration); ags_automation_add_acceleration(automation, new_acceleration, FALSE); g_list_free_full(start_list, g_object_unref); /* iterate */ recall_port = recall_port->next; } g_list_free_full(start_recall_port, g_object_unref); if(notebook == NULL){ break; } i++; } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } g_object_unref(timestamp); gtk_widget_queue_draw(GTK_WIDGET(automation_editor->focused_automation_edit)); } } void ags_automation_editor_delete_acceleration(AgsAutomationEditor *automation_editor, guint x, gdouble y) { AgsMachine *machine; AgsNotebook *notebook; GtkAdjustment *automation_edit_vscrollbar_adjustment; AgsAutomation *automation; AgsTimestamp *timestamp; GtkAllocation automation_edit_allocation; GList *start_list_automation, *list_automation; gdouble c_range; guint g_range; guint scan_x; gdouble scan_y; gboolean success; gint i, j, j_step, j_stop; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor) || automation_editor->focused_automation_edit == NULL){ return; } if(automation_editor->selected_machine != NULL){ machine = automation_editor->selected_machine; notebook = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_editor->focused_automation_edit->flags)) != 0){ c_range = exp(automation_editor->focused_automation_edit->upper) - exp(automation_editor->focused_automation_edit->lower); }else{ c_range = automation_editor->focused_automation_edit->upper - automation_editor->focused_automation_edit->lower; } gtk_widget_get_allocation(GTK_WIDGET(automation_editor->focused_automation_edit->drawing_area), &automation_edit_allocation); automation_edit_vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_editor->focused_automation_edit->vscrollbar)); g_range = gtk_adjustment_get_upper(automation_edit_vscrollbar_adjustment) + automation_edit_allocation.height; /* check all active tabs */ g_object_get(machine->audio, "automation", &start_list_automation, NULL); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(x / AGS_AUTOMATION_DEFAULT_OFFSET); i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ AgsAcceleration *new_acceleration; list_automation = start_list_automation; while((list_automation = ags_automation_find_near_timestamp_extended(list_automation, i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name, timestamp)) != NULL){ if(list_automation != NULL){ automation = list_automation->data; }else{ if(notebook == NULL){ break; } list_automation = list_automation->next; i++; continue; } success = FALSE; j = 0; j_step = 1; j_stop = 4; while(!success && exp2(j_step) <= AGS_AUTOMATION_EDIT_DEFAULT_SCAN_WIDTH){ scan_x = (-1 * j_step + floor(j / (2 * j_step))); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_editor->focused_automation_edit->flags)) != 0){ scan_y = log((-1 * j_step + floor(j % (2 * j_step))) / g_range) * c_range; }else{ scan_y = ((-1 * j_step + floor(j % (2 * j_step))) / g_range) * c_range; } success = ags_automation_remove_acceleration_at_position(automation, x - scan_x, y - scan_y); j++; if(j >= j_stop){ j_step++; j_stop = exp2(j_step + 1); } } list_automation = list_automation->next; } if(notebook == NULL){ break; } i++; } g_list_free_full(start_list_automation, g_object_unref); /* queue draw */ gtk_widget_queue_draw(GTK_WIDGET(automation_editor->focused_automation_edit)); } } void ags_automation_editor_select_region(AgsAutomationEditor *automation_editor, guint x0, gdouble y0, guint x1, gdouble y1) { AgsMachine *machine; AgsNotebook *notebook; AgsAutomation *automation; AgsTimestamp *timestamp; GList *start_list_automation, *list_automation; gint i; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor) || automation_editor->focused_automation_edit == NULL){ return; } if(automation_editor->selected_machine != NULL){ machine = automation_editor->selected_machine; notebook = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } /* swap values if needed */ if(x0 > x1){ guint tmp; tmp = x0; x0 = x1; x1 = tmp; } if(y0 > y1){ gdouble tmp; tmp = y0; y0 = y1; y1 = tmp; } /* check all active tabs */ g_object_get(machine->audio, "automation", &start_list_automation, NULL); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_automation = start_list_automation; timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(x0 / AGS_AUTOMATION_DEFAULT_OFFSET); while(timestamp->timer.ags_offset.offset < (AGS_AUTOMATION_DEFAULT_OFFSET * floor(x1 / AGS_AUTOMATION_DEFAULT_OFFSET)) + AGS_AUTOMATION_DEFAULT_OFFSET){ while((list_automation = ags_automation_find_near_timestamp_extended(list_automation, i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name, timestamp)) != NULL){ ags_automation_add_region_to_selection(list_automation->data, x0, y0, x1, y1, TRUE); /* iterate */ list_automation = list_automation->next; } timestamp->timer.ags_offset.offset += AGS_AUTOMATION_DEFAULT_OFFSET; } if(notebook == NULL){ break; } i++; } g_list_free_full(start_list_automation, g_object_unref); /* queue draw */ gtk_widget_queue_draw(GTK_WIDGET(automation_editor->focused_automation_edit)); } } void ags_automation_editor_select_all(AgsAutomationEditor *automation_editor) { AgsMachine *machine; AgsNotebook *notebook; GType channel_type; GList *start_list_automation, *list_automation; gchar *control_name; guint line; gint i; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor)){ return; } if(automation_editor->selected_machine != NULL){ machine = automation_editor->selected_machine; notebook = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } /* check all active tabs */ g_object_get(machine->audio, "automation", &start_list_automation, NULL); i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_automation = start_list_automation; while(list_automation != NULL){ g_object_get(list_automation->data, "line", &line, "channel-type", &channel_type, "control-name", &control_name, NULL); if(i != line || channel_type != automation_editor->focused_automation_edit->channel_type || !g_strcmp0(control_name, automation_editor->focused_automation_edit->control_name) != TRUE){ list_automation = list_automation->next; continue; } ags_automation_add_all_to_selection(AGS_AUTOMATION(list_automation->data)); list_automation = list_automation->next; } if(notebook == NULL){ break; } i++; } g_list_free_full(start_list_automation, g_object_unref); /* queue draw */ gtk_widget_queue_draw(GTK_WIDGET(automation_editor->focused_automation_edit)); } } gint ags_automation_editor_paste_automation_all(AgsAutomationEditor *automation_editor, AgsNotebook *notebook, AgsMachine *machine, xmlNode *automation_node, AgsTimestamp *timestamp, gboolean match_line, gboolean no_duplicates, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x) { AgsChannel *start_output, *start_input; AgsChannel *channel, *nth_channel; AgsAutomation *automation; GList *start_list_automation, *list_automation; guint first_x; guint current_x; gint i; GRecMutex *audio_mutex; first_x = -1; /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(machine->audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); start_output = machine->audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = machine->audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* */ i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ g_object_get(machine->audio, "automation", &start_list_automation, NULL); list_automation = ags_automation_find_near_timestamp_extended(start_list_automation, i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name, timestamp); if(list_automation == NULL){ GList *start_play_port, *play_port; GList *start_recall_port, *recall_port; AgsPort *current_port; play_port = NULL; recall_port = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ nth_channel = ags_channel_nth(start_output, i); play_port = start_play_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, TRUE); recall_port = start_recall_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, FALSE); if(nth_channel != NULL){ g_object_unref(nth_channel); } }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ nth_channel = ags_channel_nth(start_input, i); play_port = start_play_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, TRUE); recall_port = start_recall_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, automation_editor->focused_automation_edit->control_name, FALSE); if(nth_channel != NULL){ g_object_unref(nth_channel); } }else{ play_port = start_play_port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, automation_editor->focused_automation_edit->control_name, TRUE); recall_port = start_recall_port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, automation_editor->focused_automation_edit->control_name, FALSE); } /* play port */ while(play_port != NULL){ AgsPort *current_port; current_port = play_port->data; automation = ags_automation_new(G_OBJECT(machine->audio), i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name); automation->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; g_object_set(automation, "port", current_port, NULL); /* add to audio */ ags_audio_add_automation(machine->audio, (GObject *) automation); /* add to port */ ags_port_add_automation(current_port, (GObject *) automation); /* iterate */ play_port = play_port->next; } g_list_free_full(start_play_port, g_object_unref); /* recall port */ if(recall_port != NULL){ AgsPort *current_port; current_port = recall_port->data; automation = ags_automation_new(G_OBJECT(machine->audio), i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name); automation->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; g_object_set(automation, "port", current_port, NULL); /* add to audio */ ags_audio_add_automation(machine->audio, (GObject *) automation); /* add to port */ ags_port_add_automation(current_port, (GObject *) automation); /* iterate */ recall_port = recall_port->next; } g_list_free_full(start_recall_port, g_object_unref); }else{ automation = AGS_AUTOMATION(list_automation->data); } g_list_free_full(start_list_automation, g_object_unref); g_object_get(machine->audio, "automation", &start_list_automation, NULL); list_automation = start_list_automation; while((list_automation = ags_automation_find_near_timestamp_extended(list_automation, i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name, timestamp)) != NULL){ automation = list_automation->data; if(paste_from_position){ xmlNode *child; guint x_boundary; ags_automation_insert_from_clipboard_extended(automation, automation_node, TRUE, position_x, TRUE, position_y, match_line, no_duplicates); /* get boundaries */ child = automation_node->children; current_x = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "note", 5)){ guint tmp; tmp = g_ascii_strtoull(xmlGetProp(child, "x"), NULL, 10); if(tmp > current_x){ current_x = tmp; } } } child = child->next; } x_boundary = g_ascii_strtoull(xmlGetProp(automation_node, "x_boundary"), NULL, 10); if(first_x == -1 || x_boundary < first_x){ first_x = x_boundary; } if(position_x > x_boundary){ current_x += (position_x - x_boundary); }else{ current_x -= (x_boundary - position_x); } if(current_x > last_x[0]){ last_x[0] = current_x; } }else{ xmlNode *child; ags_automation_insert_from_clipboard(automation, automation_node, FALSE, 0, FALSE, 0); /* get boundaries */ child = automation_node->children; current_x = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "note", 5)){ guint tmp; tmp = g_ascii_strtoull(xmlGetProp(child, "x"), NULL, 10); if(tmp > current_x){ current_x = tmp; } } } child = child->next; } if(current_x > last_x[0]){ last_x[0] = current_x; } } list_automation = list_automation->next; } g_list_free_full(start_list_automation, g_object_unref); if(notebook == NULL){ break; } i++; } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } return(first_x); } gint ags_automation_editor_paste_automation(AgsAutomationEditor *automation_editor, AgsNotebook *notebook, AgsMachine *machine, xmlNode *audio_node, guint position_x, guint position_y, gboolean paste_from_position, gint *last_x) { AgsTimestamp *timestamp; xmlNode *automation_list_node, *automation_node; xmlNode *timestamp_node; guint first_x; gboolean match_line, no_duplicates; first_x = -1; match_line = ((AGS_AUTOMATION_EDITOR_PASTE_MATCH_LINE & (automation_editor->flags)) != 0) ? TRUE: FALSE; no_duplicates = ((AGS_AUTOMATION_EDITOR_PASTE_NO_DUPLICATES & (automation_editor->flags)) != 0) ? TRUE: FALSE; timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = 0; /* paste automation */ automation_list_node = audio_node->children; while(automation_list_node != NULL){ if(automation_list_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(automation_list_node->name, "automation-list", 14)){ automation_node = automation_list_node->children; while(automation_node != NULL){ if(automation_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(automation_node->name, "automation", 9)){ guint64 offset; timestamp_node = automation_node->children; offset = 0; while(timestamp_node != NULL){ if(timestamp_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(timestamp_node->name, "timestamp", 10)){ offset = g_ascii_strtoull(xmlGetProp(timestamp_node, "offset"), NULL, 10); break; } } timestamp_node = timestamp_node->next; } /* 1st attempt */ timestamp->timer.ags_offset.offset = (guint64) AGS_AUTOMATION_DEFAULT_OFFSET * floor((double) position_x / (double) AGS_AUTOMATION_DEFAULT_OFFSET); first_x = ags_automation_editor_paste_automation_all(automation_editor, notebook, machine, automation_node, timestamp, match_line, no_duplicates, position_x, position_y, paste_from_position, last_x); /* 2nd attempt */ timestamp->timer.ags_offset.offset += AGS_AUTOMATION_DEFAULT_OFFSET; ags_automation_editor_paste_automation_all(automation_editor, notebook, machine, automation_node, timestamp, match_line, no_duplicates, position_x, position_y, paste_from_position, last_x); } } automation_node = automation_node->next; } } } automation_list_node = automation_list_node->next; } g_object_unref(timestamp); return(first_x); } void ags_automation_editor_paste(AgsAutomationEditor *automation_editor) { AgsMachine *machine; AgsAutomationEdit *automation_edit; AgsNotebook *notebook; AgsAutomation *automation; xmlDoc *clipboard; xmlNode *audio_node; xmlNode *automation_list_node, *automation_node; xmlNode *timestamp_node; gchar *buffer; guint position_x, position_y; gint first_x, last_x; gboolean paste_from_position; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor) || automation_editor->focused_automation_edit == NULL){ return; } if((machine = automation_editor->selected_machine) != NULL){ machine = automation_editor->selected_machine; automation_edit = NULL; notebook = NULL; position_x = 0; position_y = 0; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ GList *list_start, *list; notebook = automation_editor->output_notebook; list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->output_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ if(!g_strcmp0(automation_editor->focused_automation_edit->control_name, AGS_AUTOMATION_EDIT(list->data)->control_name)){ automation_edit = list->data; break; } list = list->next; } g_list_free(list_start); }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ GList *list_start, *list; notebook = automation_editor->input_notebook; list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->input_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ if(!g_strcmp0(automation_editor->focused_automation_edit->control_name, AGS_AUTOMATION_EDIT(list->data)->control_name)){ automation_edit = list->data; break; } list = list->next; } g_list_free(list_start); }else{ GList *list_start, *list; list = list_start = gtk_container_get_children(GTK_CONTAINER(automation_editor->audio_scrolled_automation_edit_box->automation_edit_box)); while(list != NULL){ if(!g_strcmp0(automation_editor->focused_automation_edit->control_name, AGS_AUTOMATION_EDIT(list->data)->control_name)){ automation_edit = list->data; break; } list = list->next; } g_list_free(list_start); } /* get clipboard */ buffer = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); if(buffer == NULL){ return; } /* get position */ if(automation_editor->automation_toolbar->selected_edit_mode == automation_editor->automation_toolbar->position){ last_x = 0; paste_from_position = TRUE; position_x = automation_editor->focused_automation_edit->cursor_position_x; position_y = automation_editor->focused_automation_edit->cursor_position_y; #ifdef DEBUG printf("pasting at position: [%u,%u]\n", position_x, position_y); #endif }else{ paste_from_position = FALSE; } /* get xml tree */ clipboard = xmlReadMemory(buffer, strlen(buffer), NULL, "UTF-8", 0); audio_node = xmlDocGetRootElement(clipboard); first_x = -1; /* iterate xml tree */ while(audio_node != NULL){ if(audio_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("audio", audio_node->name, 6)){ automation_node = audio_node->children; first_x = ags_automation_editor_paste_automation(automation_editor, notebook, machine, audio_node, position_x, position_y, paste_from_position, &last_x); break; } } audio_node = audio_node->next; } if(first_x == -1){ first_x = 0; } xmlFreeDoc(clipboard); if(paste_from_position){ gint big_step, small_step; //TODO:JK: implement me big_step = (guint) ceil((double) last_x / 16.0) * 16.0 + (automation_editor->focused_automation_edit->cursor_position_x % (guint) 16); small_step = (guint) big_step - 16; if(small_step < last_x){ automation_editor->focused_automation_edit->cursor_position_x = big_step; }else{ automation_editor->focused_automation_edit->cursor_position_x = small_step; } } gtk_widget_queue_draw(GTK_WIDGET(automation_edit)); } } void ags_automation_editor_copy(AgsAutomationEditor *automation_editor) { AgsMachine *machine; AgsNotebook *notebook; AgsAutomation *automation; xmlDoc *clipboard; xmlNode *audio_node, *automation_list_node, *automation_node; GList *start_list_automation, *list_automation; xmlChar *buffer; int size; gint i; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor) || automation_editor->focused_automation_edit == NULL){ return; } if(automation_editor->selected_machine != NULL){ machine = automation_editor->selected_machine; notebook = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); automation_list_node = xmlNewNode(NULL, BAD_CAST "automation-list"); xmlAddChild(audio_node, automation_list_node); /* create automation nodes */ g_object_get(machine->audio, "automation", &start_list_automation, NULL); i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_automation = start_list_automation; /* copy */ while((list_automation = ags_automation_find_near_timestamp_extended(list_automation, i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name, NULL)) != NULL){ automation_node = ags_automation_copy_selection(AGS_AUTOMATION(list_automation->data)); xmlAddChild(automation_list_node, automation_node); list_automation = list_automation->next; } if(notebook == NULL){ break; } i++; } g_list_free_full(start_list_automation, g_object_unref); /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_automation_editor_cut(AgsAutomationEditor *automation_editor) { AgsMachine *machine; AgsNotebook *notebook; AgsAutomation *automation; xmlDoc *clipboard; xmlNode *audio_node; xmlNode *automation_list_node, *automation_node; GList *start_list_automation, *list_automation; xmlChar *buffer; int size; gint i; if(!AGS_IS_AUTOMATION_EDITOR(automation_editor) || automation_editor->focused_automation_edit == NULL){ return; } if(automation_editor->selected_machine != NULL){ machine = automation_editor->selected_machine; notebook = NULL; if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); automation_list_node = xmlNewNode(NULL, BAD_CAST "automation-list"); xmlAddChild(audio_node, automation_list_node); /* create automation nodes */ g_object_get(machine->audio, "automation", &start_list_automation, NULL); i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_automation = start_list_automation; /* cut */ while((list_automation = ags_automation_find_near_timestamp_extended(list_automation, i, automation_editor->focused_automation_edit->channel_type, automation_editor->focused_automation_edit->control_name, NULL)) != NULL){ automation_node = ags_automation_cut_selection(AGS_AUTOMATION(list_automation->data)); xmlAddChild(automation_list_node, automation_node); list_automation = list_automation->next; } if(notebook == NULL){ break; } i++; } g_list_free_full(start_list_automation, g_object_unref); gtk_widget_queue_draw(GTK_WIDGET(automation_editor->focused_automation_edit)); /* write to clipboard */ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_automation_editor_invert(AgsAutomationEditor *automation_editor) { g_message("ags_automation_editor_invert() - not implemented"); } /** * ags_automation_editor_new: * * Create a new instance of #AgsAutomationEditor. * * Returns: the new #AgsAutomationEditor * * Since: 3.0.0 */ AgsAutomationEditor* ags_automation_editor_new() { AgsAutomationEditor *automation_editor; automation_editor = (AgsAutomationEditor *) g_object_new(AGS_TYPE_AUTOMATION_EDITOR, NULL); return(automation_editor); } gsequencer-3.1.3/ags/X/ags_sequencer_editor.h0000644000175000017500000000575713607210263016142 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SEQUENCER_EDITOR_H__ #define __AGS_SEQUENCER_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SEQUENCER_EDITOR (ags_sequencer_editor_get_type()) #define AGS_SEQUENCER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SEQUENCER_EDITOR, AgsSequencerEditor)) #define AGS_SEQUENCER_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SEQUENCER_EDITOR, AgsSequencerEditorClass)) #define AGS_IS_SEQUENCER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SEQUENCER_EDITOR)) #define AGS_IS_SEQUENCER_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SEQUENCER_EDITOR)) #define AGS_SEQUENCER_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SEQUENCER_EDITOR, AgsSequencerEditorClass)) typedef struct _AgsSequencerEditor AgsSequencerEditor; typedef struct _AgsSequencerEditorClass AgsSequencerEditorClass; typedef enum{ AGS_SEQUENCER_EDITOR_CONNECTED = 1, }AgsSequencerEditorFlags; struct _AgsSequencerEditor { GtkVBox vbox; guint flags; GObject *sequencer; GObject *sequencer_thread; GtkComboBoxText *backend; GtkComboBoxText *card; GtkHBox *jack_hbox; GtkButton *add_jack; GtkButton *remove_jack; GtkButton *remove; }; struct _AgsSequencerEditorClass { GtkVBoxClass vbox; }; GType ags_sequencer_editor_get_type(void); void ags_sequencer_editor_add_source(AgsSequencerEditor *sequencer_editor, gchar *device); void ags_sequencer_editor_remove_source(AgsSequencerEditor *sequencer_editor, gchar *device); void ags_sequencer_editor_add_sequencer(AgsSequencerEditor *sequencer_editor, GObject *sequencer); void ags_sequencer_editor_remove_sequencer(AgsSequencerEditor *sequencer_editor, GObject *sequencer); void ags_sequencer_editor_load_jack_card(AgsSequencerEditor *sequencer_editor); void ags_sequencer_editor_load_alsa_card(AgsSequencerEditor *sequencer_editor); void ags_sequencer_editor_load_oss_card(AgsSequencerEditor *sequencer_editor); AgsSequencerEditor* ags_sequencer_editor_new(); G_END_DECLS #endif /*__AGS_SEQUENCER_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_line_editor_callbacks.h0000644000175000017500000000242613607210263017064 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_EDITOR_CALLBACKS_H__ #define __AGS_LINE_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_line_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLineEditor *line_editor); int ags_line_editor_show_callback(GtkWidget *widget, AgsLineEditor *line_editor); G_END_DECLS #endif /*__AGS_LINE_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_xorg_application_context.h0000644000175000017500000000720313613101102017660 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_XORG_APPLICATION_CONTEXT_H__ #define __AGS_XORG_APPLICATION_CONTEXT_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_XORG_APPLICATION_CONTEXT (ags_xorg_application_context_get_type()) #define AGS_XORG_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_XORG_APPLICATION_CONTEXT, AgsXorgApplicationContext)) #define AGS_XORG_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_XORG_APPLICATION_CONTEXT, AgsXorgApplicationContextClass)) #define AGS_IS_XORG_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_XORG_APPLICATION_CONTEXT)) #define AGS_IS_XORG_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_XORG_APPLICATION_CONTEXT)) #define AGS_XORG_APPLICATION_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_XORG_APPLICATION_CONTEXT, AgsXorgApplicationContextClass)) #define AGS_XORG_VERSION "3.0.0" #define AGS_XORG_BUILD_ID "Thu Nov 7 01:44:21 UTC 2019" typedef struct _AgsXorgApplicationContext AgsXorgApplicationContext; typedef struct _AgsXorgApplicationContextClass AgsXorgApplicationContextClass; struct _AgsXorgApplicationContext { AgsApplicationContext application_context; guint flags; AgsThreadPool *thread_pool; GList *worker; GMainContext *server_main_context; gboolean is_operating; AgsServerStatus *server_status; AgsRegistry *registry; GList *server; GMainContext *audio_main_context; GMainContext *osc_server_main_context; GObject *default_soundcard; AgsThread *default_soundcard_thread; AgsThread *default_export_thread; GList *soundcard; GList *sequencer; GList *audio; GList *sound_server; GList *osc_server; gboolean gui_ready; gboolean show_animation; gboolean file_ready; gdouble gui_scale_factor; GList *task; GtkWidget *animation_window; GtkWidget *window; GtkWidget *automation_window; GtkWidget *wave_window; GtkWidget *sheet_window; GtkWidget *export_window; GtkWidget *preferences; GtkWidget *history_browser; GtkWidget *midi_browser; GtkWidget *sample_browser; GtkWidget *midi_import_wizard; GtkWidget *midi_export_wizard; GList *machine; GtkWidget *composite_editor; GtkWidget *navigation; }; struct _AgsXorgApplicationContextClass { AgsApplicationContextClass application_context; }; GType ags_xorg_application_context_get_type(); gboolean ags_xorg_application_context_message_monitor_timeout(AgsXorgApplicationContext *xorg_application_context); gboolean ags_xorg_application_context_task_timeout(AgsXorgApplicationContext *xorg_application_context); AgsXorgApplicationContext* ags_xorg_application_context_new(); G_END_DECLS #endif /*__AGS_XORG_APPLICATION_CONTEXT_H__*/ gsequencer-3.1.3/ags/X/ags_pad_callbacks.h0000644000175000017500000000240113607210263015324 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PAD_CALLBACKS_H__ #define __AGS_PAD_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_pad_group_clicked_callback(GtkWidget *widget, AgsPad *pad); void ags_pad_mute_clicked_callback(GtkWidget *widget, AgsPad *pad); void ags_pad_solo_clicked_callback(GtkWidget *widget, AgsPad *pad); G_END_DECLS #endif /*__AGS_PAD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_line_member_callbacks.c0000644000175000017500000000644713607210263017047 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_line_member_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLineMember *line_member) { if(old_parent == NULL){ //TODO:JK: implement me } } void ags_line_member_dial_changed_callback(GtkWidget *dial, AgsLineMember *line_member) { GtkAdjustment *adjustment; gdouble value; g_object_get(dial, "adjustment", &adjustment, NULL); value = gtk_adjustment_get_value(adjustment); ags_line_member_change_port(line_member, (gpointer) &value); ags_line_member_chained_event(line_member); } void ags_line_member_vscale_changed_callback(GtkWidget *vscale, AgsLineMember *line_member) { GtkAdjustment *adjustment; gdouble value; adjustment = gtk_range_get_adjustment(GTK_RANGE(vscale)); value = gtk_adjustment_get_value(adjustment); ags_line_member_change_port(line_member, (gpointer) &value); ags_line_member_chained_event(line_member); } void ags_line_member_hscale_changed_callback(GtkWidget *hscale, AgsLineMember *line_member) { GtkAdjustment *adjustment; gdouble value; adjustment = gtk_range_get_adjustment(GTK_RANGE(hscale)); value = gtk_adjustment_get_value(adjustment); ags_line_member_change_port(line_member, &value); ags_line_member_chained_event(line_member); } void ags_line_member_spin_button_changed_callback(GtkWidget *spin_button, AgsLineMember *line_member) { GtkAdjustment *adjustment; gdouble value; adjustment = gtk_spin_button_get_adjustment((GtkSpinButton *) spin_button); value = gtk_adjustment_get_value(adjustment); ags_line_member_change_port(line_member, &value); ags_line_member_chained_event(line_member); } void ags_line_member_check_button_clicked_callback(GtkWidget *check_button, AgsLineMember *line_member) { line_member->active = gtk_toggle_button_get_active((GtkToggleButton *) check_button); ags_line_member_change_port(line_member, &(line_member->active)); ags_line_member_chained_event(line_member); } void ags_line_member_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsLineMember *line_member) { line_member->active = gtk_toggle_button_get_active((GtkToggleButton *) toggle_button); ags_line_member_change_port(line_member, &(line_member->active)); ags_line_member_chained_event(line_member); } void ags_line_member_button_clicked_callback(GtkWidget *button, AgsLineMember *line_member) { ags_line_member_change_port(line_member, &(line_member->active)); ags_line_member_chained_event(line_member); } gsequencer-3.1.3/ags/X/ags_soundcard_editor.c0000644000175000017500000017750113607210263016122 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_soundcard_editor_class_init(AgsSoundcardEditorClass *soundcard_editor); void ags_soundcard_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_soundcard_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_soundcard_editor_init(AgsSoundcardEditor *soundcard_editor); static void ags_soundcard_editor_finalize(GObject *gobject); void ags_soundcard_editor_connect(AgsConnectable *connectable); void ags_soundcard_editor_disconnect(AgsConnectable *connectable); void ags_soundcard_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_soundcard_editor_apply(AgsApplicable *applicable); void ags_soundcard_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_soundcard_editor * @short_description: A composite widget to configure soundcard * @title: AgsSoundcardEditor * @section_id: * @include: ags/X/ags_soundcard_editor.h * * #AgsSoundcardEditor enables you to make preferences of soundcard, audio channels, * samplerate and buffer size. */ static gpointer ags_soundcard_editor_parent_class = NULL; GType ags_soundcard_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_soundcard_editor = 0; static const GTypeInfo ags_soundcard_editor_info = { sizeof (AgsSoundcardEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_soundcard_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSoundcardEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_soundcard_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_soundcard_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_soundcard_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_soundcard_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsSoundcardEditor", &ags_soundcard_editor_info, 0); g_type_add_interface_static(ags_type_soundcard_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_soundcard_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_soundcard_editor); } return g_define_type_id__volatile; } void ags_soundcard_editor_class_init(AgsSoundcardEditorClass *soundcard_editor) { GObjectClass *gobject; GtkWidgetClass *widget; ags_soundcard_editor_parent_class = g_type_class_peek_parent(soundcard_editor); /* GtkObjectClass */ gobject = (GObjectClass *) soundcard_editor; gobject->finalize = ags_soundcard_editor_finalize; } void ags_soundcard_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_soundcard_editor_connect; connectable->disconnect = ags_soundcard_editor_disconnect; } void ags_soundcard_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_soundcard_editor_set_update; applicable->apply = ags_soundcard_editor_apply; applicable->reset = ags_soundcard_editor_reset; } void ags_soundcard_editor_init(AgsSoundcardEditor *soundcard_editor) { GtkTable *table; GtkLabel *label; guint y0; soundcard_editor->flags = 0; soundcard_editor->soundcard = NULL; soundcard_editor->soundcard_thread = NULL; table = (GtkTable *) gtk_table_new(3, 12, FALSE); gtk_box_pack_start(GTK_BOX(soundcard_editor), GTK_WIDGET(table), FALSE, FALSE, 2); y0 = 0; /* backend */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("backend"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->backend = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->backend), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); #ifdef AGS_WITH_CORE_AUDIO gtk_combo_box_text_append_text(soundcard_editor->backend, "core-audio"); #endif #ifdef AGS_WITH_PULSE gtk_combo_box_text_append_text(soundcard_editor->backend, "pulse"); #endif #ifdef AGS_WITH_JACK gtk_combo_box_text_append_text(soundcard_editor->backend, "jack"); #endif #ifdef AGS_WITH_WASAPI gtk_combo_box_text_append_text(soundcard_editor->backend, "wasapi"); #endif #ifdef AGS_WITH_ALSA gtk_combo_box_text_append_text(soundcard_editor->backend, "alsa"); #endif #ifdef AGS_WITH_OSS gtk_combo_box_text_append_text(soundcard_editor->backend, "oss"); #endif gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), 0); y0++; /* sound card */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("soundcard"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->card = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->card), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; /* port */ soundcard_editor->port_hbox = NULL; soundcard_editor->add_port = NULL; soundcard_editor->remove_port = NULL; soundcard_editor->port_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->port_hbox), 2, 3, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->add_port = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) soundcard_editor->port_hbox, (GtkWidget *) soundcard_editor->add_port, FALSE, FALSE, 0); soundcard_editor->remove_port = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) soundcard_editor->port_hbox, (GtkWidget *) soundcard_editor->remove_port, FALSE, FALSE, 0); y0++; /* capability */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("capability"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->capability = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->capability), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); gtk_combo_box_text_append_text(soundcard_editor->capability, "playback"); gtk_combo_box_text_append_text(soundcard_editor->capability, "capture"); #if 0 gtk_combo_box_text_append_text(soundcard_editor->capability, "duplex"); #endif gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->capability), 0); y0++; /* audio channels */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("audio channels"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->audio_channels = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 24.0, 1.0); gtk_spin_button_set_value(soundcard_editor->audio_channels, 2); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->audio_channels), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; /* samplerate */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("samplerate"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->samplerate = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 192000.0, 1.0); gtk_spin_button_set_value(soundcard_editor->samplerate, 44100); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->samplerate), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; /* buffer size */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("buffer size"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->buffer_size = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 65535.0, 1.0); gtk_spin_button_set_value(soundcard_editor->buffer_size, 512.0); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->buffer_size), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; /* format */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("format"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->format = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->format), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); gtk_combo_box_text_append_text(soundcard_editor->format, "8"); gtk_combo_box_text_append_text(soundcard_editor->format, "16"); gtk_combo_box_text_append_text(soundcard_editor->format, "24"); gtk_combo_box_text_append_text(soundcard_editor->format, "32"); gtk_combo_box_text_append_text(soundcard_editor->format, "64"); gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->format), 1); y0++; /* use cache */ soundcard_editor->use_cache = gtk_check_button_new_with_label(i18n("use cache")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(soundcard_editor->use_cache), TRUE); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->use_cache), 0, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; /* cache buffer size */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("cache buffer size"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->cache_buffer_size = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 65535.0, 1.0); gtk_spin_button_set_value(soundcard_editor->cache_buffer_size, 4096.0); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->cache_buffer_size), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); #if !defined(AGS_WITH_CORE_AUDIO) && defined(AGS_WITH_PULSE) gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), FALSE); #else gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), TRUE); #endif #if defined(AGS_WITH_CORE_AUDIO) || defined(AGS_WITH_PULSE) gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), TRUE); #else gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); #endif y0++; #if defined(AGS_WITH_WASAPI) /* wasapi share mode */ soundcard_editor->wasapi_share_mode_label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("WASAPI share mode"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->wasapi_share_mode_label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->wasapi_share_mode = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->wasapi_share_mode), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); gtk_combo_box_text_append_text(soundcard_editor->wasapi_share_mode, "exclusive"); gtk_combo_box_text_append_text(soundcard_editor->wasapi_share_mode, "shared"); y0++; /* wasapi buffer size */ soundcard_editor->wasapi_buffer_size_label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("WASAPI buffer size"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->wasapi_buffer_size_label), 0, 1, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); soundcard_editor->wasapi_buffer_size = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 65535.0, 1.0); gtk_spin_button_set_value(soundcard_editor->wasapi_buffer_size, 8192.0); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->wasapi_buffer_size), 1, 2, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; #else soundcard_editor->wasapi_share_mode_label = NULL; soundcard_editor->wasapi_share_mode = NULL; soundcard_editor->wasapi_buffer_size_label = NULL; soundcard_editor->wasapi_buffer_size = NULL; #endif /* */ // soundcard_editor->remove = NULL; soundcard_editor->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_table_attach(table, GTK_WIDGET(soundcard_editor->remove), 2, 3, y0, y0 + 1, GTK_FILL, GTK_FILL, 0, 0); y0++; } static void ags_soundcard_editor_finalize(GObject *gobject) { //TODO:JK: implement me G_OBJECT_CLASS(ags_soundcard_editor_parent_class)->finalize(gobject); } void ags_soundcard_editor_connect(AgsConnectable *connectable) { AgsSoundcardEditor *soundcard_editor; soundcard_editor = AGS_SOUNDCARD_EDITOR(connectable); if((AGS_SOUNDCARD_EDITOR_CONNECTED & (soundcard_editor->flags)) != 0){ return; } soundcard_editor->flags |= AGS_SOUNDCARD_EDITOR_CONNECTED; /* backend and card */ g_signal_connect_after(G_OBJECT(soundcard_editor->backend), "changed", G_CALLBACK(ags_soundcard_editor_backend_changed_callback), soundcard_editor); g_signal_connect_after(G_OBJECT(soundcard_editor->card), "changed", G_CALLBACK(ags_soundcard_editor_card_changed_callback), soundcard_editor); /* add / remove port */ g_signal_connect(G_OBJECT(soundcard_editor->add_port), "clicked", G_CALLBACK(ags_soundcard_editor_add_port_callback), soundcard_editor); g_signal_connect(G_OBJECT(soundcard_editor->remove_port), "clicked", G_CALLBACK(ags_soundcard_editor_remove_port_callback), soundcard_editor); /* presets */ g_signal_connect_after(G_OBJECT(soundcard_editor->audio_channels), "changed", G_CALLBACK(ags_soundcard_editor_audio_channels_changed_callback), soundcard_editor); g_signal_connect_after(G_OBJECT(soundcard_editor->samplerate), "changed", G_CALLBACK(ags_soundcard_editor_samplerate_changed_callback), soundcard_editor); g_signal_connect_after(G_OBJECT(soundcard_editor->buffer_size), "changed", G_CALLBACK(ags_soundcard_editor_buffer_size_changed_callback), soundcard_editor); g_signal_connect_after(G_OBJECT(soundcard_editor->format), "changed", G_CALLBACK(ags_soundcard_editor_format_changed_callback), soundcard_editor); } void ags_soundcard_editor_disconnect(AgsConnectable *connectable) { AgsSoundcardEditor *soundcard_editor; soundcard_editor = AGS_SOUNDCARD_EDITOR(connectable); if((AGS_SOUNDCARD_EDITOR_CONNECTED & (soundcard_editor->flags)) == 0){ return; } soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_CONNECTED); /* backend and card */ g_object_disconnect(G_OBJECT(soundcard_editor->backend), "any_signal::changed", G_CALLBACK(ags_soundcard_editor_backend_changed_callback), soundcard_editor, NULL); g_object_disconnect(G_OBJECT(soundcard_editor->card), "any_signal::changed", G_CALLBACK(ags_soundcard_editor_card_changed_callback), soundcard_editor, NULL); /* add / remove port */ g_object_disconnect(G_OBJECT(soundcard_editor->add_port), "any_signal::clicked", G_CALLBACK(ags_soundcard_editor_add_port_callback), soundcard_editor, NULL); g_object_disconnect(G_OBJECT(soundcard_editor->remove_port), "any_signal::clicked", G_CALLBACK(ags_soundcard_editor_remove_port_callback), soundcard_editor, NULL); /* presets */ g_object_disconnect(G_OBJECT(soundcard_editor->audio_channels), "any_signal::changed", G_CALLBACK(ags_soundcard_editor_audio_channels_changed_callback), soundcard_editor, NULL); g_object_disconnect(G_OBJECT(soundcard_editor->samplerate), "any_signal::changed", G_CALLBACK(ags_soundcard_editor_samplerate_changed_callback), soundcard_editor, NULL); g_object_disconnect(G_OBJECT(soundcard_editor->buffer_size), "any_signal::changed", G_CALLBACK(ags_soundcard_editor_buffer_size_changed_callback), soundcard_editor, NULL); g_object_disconnect(G_OBJECT(soundcard_editor->format), "any_signal::changed", G_CALLBACK(ags_soundcard_editor_format_changed_callback), soundcard_editor, NULL); } void ags_soundcard_editor_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_soundcard_editor_apply(AgsApplicable *applicable) { AgsAudioPreferences *audio_preferences; AgsSoundcardEditor *soundcard_editor; GtkListStore *model; GtkTreeIter current; AgsConfig *config; GList *tasks; GList *list; gchar *soundcard_group; gchar *backend; gchar *capability; char *device, *str; #if defined AGS_WITH_WASAPI gchar *wasapi_share_mode; #endif gint nth; guint channels; guint samplerate; guint buffer_size; guint cache_buffer_size; guint format; #if defined AGS_WITH_WASAPI guint wasapi_buffer_size; #endif gboolean use_core_audio, use_pulse, use_jack, use_wasapi, use_alsa, use_oss; GValue value = {0,}; soundcard_editor = AGS_SOUNDCARD_EDITOR(applicable); audio_preferences = (AgsAudioPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(soundcard_editor), AGS_TYPE_AUDIO_PREFERENCES); config = ags_config_get_instance(); list = gtk_container_get_children((GtkContainer *) audio_preferences->soundcard_editor); nth = g_list_index(list, soundcard_editor); if(nth < 0){ return; } soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, nth); g_list_free(list); /* backend */ #if defined AGS_WITH_WASAPI use_wasapi = TRUE; use_core_audio = FALSE; use_pulse = FALSE; #elif defined AGS_WITH_CORE_AUDIO use_wasapi = FALSE; use_core_audio = TRUE; use_pulse = FALSE; #else use_wasapi = FALSE; use_core_audio = FALSE; use_pulse = TRUE; #endif use_jack = FALSE; use_alsa = FALSE; use_oss = FALSE; backend = gtk_combo_box_text_get_active_text(soundcard_editor->backend); ags_config_set_value(config, soundcard_group, "backend", backend); if(backend != NULL){ if(!g_ascii_strncasecmp(backend, "core-audio", 11)){ use_core_audio = TRUE; }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ use_pulse = TRUE; }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ use_jack = TRUE; use_wasapi = FALSE; use_core_audio = FALSE; use_pulse = FALSE; }else if(!g_ascii_strncasecmp(backend, "wasapi", 7)){ use_wasapi = TRUE; }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ use_alsa = TRUE; use_wasapi = FALSE; use_core_audio = FALSE; use_pulse = FALSE; }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ use_oss = TRUE; use_wasapi = FALSE; use_core_audio = FALSE; use_pulse = FALSE; } } capability = gtk_combo_box_text_get_active_text(soundcard_editor->capability); ags_config_set_value(config, soundcard_group, "capability", capability); /* buffer size */ buffer_size = gtk_spin_button_get_value(soundcard_editor->buffer_size); str = g_strdup_printf("%u", buffer_size); ags_config_set_value(config, soundcard_group, "buffer-size", str); g_free(str); /* pcm channels */ channels = gtk_spin_button_get_value(soundcard_editor->audio_channels); str = g_strdup_printf("%u", channels); ags_config_set_value(config, soundcard_group, "pcm-channels", str); g_free(str); /* format */ format = 0; switch(gtk_combo_box_get_active(GTK_COMBO_BOX(soundcard_editor->format))){ case 0: format = AGS_SOUNDCARD_SIGNED_8_BIT; break; case 1: format = AGS_SOUNDCARD_SIGNED_16_BIT; break; case 2: format = AGS_SOUNDCARD_SIGNED_24_BIT; break; case 3: format = AGS_SOUNDCARD_SIGNED_32_BIT; break; case 4: format = AGS_SOUNDCARD_SIGNED_64_BIT; break; } str = g_strdup_printf("%u", format); ags_config_set_value(config, soundcard_group, "format", str); g_free(str); /* samplerate */ samplerate = gtk_spin_button_get_value(soundcard_editor->samplerate); str = g_strdup_printf("%u", samplerate); ags_config_set_value(config, soundcard_group, "samplerate", str); g_free(str); /* device */ model = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card))); if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(soundcard_editor->card), ¤t)){ gtk_tree_model_get_value(GTK_TREE_MODEL(model), ¤t, 0, &value); device = g_value_get_string(&value); }else{ device = NULL; } /* handle */ #ifdef AGS_DEBUG g_message("%s", device); #endif if(use_core_audio){ ags_config_set_value(config, soundcard_group, "device", device); }else if(use_pulse){ ags_config_set_value(config, soundcard_group, "device", device); }else if(use_jack){ ags_config_set_value(config, soundcard_group, "device", device); }else if(use_wasapi){ ags_config_set_value(config, soundcard_group, "device", device); }else if(use_alsa){ ags_config_set_value(config, soundcard_group, "device", device); }else if(use_oss){ ags_config_set_value(config, soundcard_group, "device", device); } if(AGS_IS_PULSE_DEVOUT(soundcard_editor->soundcard) || AGS_IS_CORE_AUDIO_DEVOUT(soundcard_editor->soundcard)){ ags_config_set_value(config, soundcard_group, "use-cache", (gtk_toggle_button_get_active(soundcard_editor->use_cache) ? "true": "false")); cache_buffer_size = gtk_spin_button_get_value(soundcard_editor->cache_buffer_size); str = g_strdup_printf("%u", cache_buffer_size); ags_config_set_value(config, soundcard_group, "cache-buffer-size", str); g_free(str); } #if defined AGS_WITH_WASAPI wasapi_share_mode = gtk_combo_box_text_get_active_text(soundcard_editor->wasapi_share_mode); ags_config_set_value(config, soundcard_group, "wasapi-share-mode", wasapi_share_mode); /* buffer size */ wasapi_buffer_size = gtk_spin_button_get_value(soundcard_editor->wasapi_buffer_size); str = g_strdup_printf("%u", wasapi_buffer_size); ags_config_set_value(config, soundcard_group, "wasapi-buffer-size", str); g_free(str); #endif } void ags_soundcard_editor_reset(AgsApplicable *applicable) { AgsSoundcardEditor *soundcard_editor; GObject *soundcard; GList *card_id, *card_id_start, *card_name, *card_name_start; gchar *backend, *device, *str, *tmp; #if defined AGS_WITH_WASAPI gchar *wasapi_share_mode; #endif guint capability; guint nth; guint channels, channels_min, channels_max; guint samplerate, samplerate_min, samplerate_max; guint buffer_size, buffer_size_min, buffer_size_max; guint format; #if defined AGS_WITH_WASAPI guint wasapi_buffer_size; #endif gboolean found_card; GError *error; soundcard_editor = AGS_SOUNDCARD_EDITOR(applicable); if((AGS_SOUNDCARD_EDITOR_BLOCK_RESET & (soundcard_editor->flags)) != 0){ return; } soundcard_editor->flags |= AGS_SOUNDCARD_EDITOR_BLOCK_RESET; soundcard = soundcard_editor->soundcard; /* refresh */ backend = NULL; capability = 0; if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ backend = "core-audio"; capability = AGS_SOUNDCARD_CAPABILITY_PLAYBACK; }else if(AGS_IS_PULSE_DEVOUT(soundcard)){ backend = "pulse"; capability = AGS_SOUNDCARD_CAPABILITY_PLAYBACK; }else if(AGS_IS_JACK_DEVOUT(soundcard)){ backend = "jack"; capability = AGS_SOUNDCARD_CAPABILITY_PLAYBACK; }else if(AGS_IS_WASAPI_DEVOUT(soundcard)){ backend = "wasapi"; capability = AGS_SOUNDCARD_CAPABILITY_PLAYBACK; }else if(AGS_IS_DEVOUT(soundcard)){ if((AGS_DEVOUT_ALSA & (AGS_DEVOUT(soundcard)->flags)) != 0){ backend = "alsa"; }else if((AGS_DEVOUT_OSS & (AGS_DEVOUT(soundcard)->flags)) != 0){ backend = "oss"; } capability = AGS_SOUNDCARD_CAPABILITY_PLAYBACK; }else if(AGS_IS_CORE_AUDIO_DEVIN(soundcard)){ backend = "core-audio"; capability = AGS_SOUNDCARD_CAPABILITY_CAPTURE; }else if(AGS_IS_PULSE_DEVIN(soundcard)){ backend = "pulse"; capability = AGS_SOUNDCARD_CAPABILITY_CAPTURE; }else if(AGS_IS_JACK_DEVIN(soundcard)){ backend = "jack"; capability = AGS_SOUNDCARD_CAPABILITY_CAPTURE; }else if(AGS_IS_WASAPI_DEVIN(soundcard)){ backend = "wasapi"; capability = AGS_SOUNDCARD_CAPABILITY_CAPTURE; }else if(AGS_IS_DEVIN(soundcard)){ if((AGS_DEVIN_ALSA & (AGS_DEVIN(soundcard)->flags)) != 0){ backend = "alsa"; }else if((AGS_DEVIN_OSS & (AGS_DEVIN(soundcard)->flags)) != 0){ backend = "oss"; } capability = AGS_SOUNDCARD_CAPABILITY_CAPTURE; } if(backend != NULL){ GtkTreeModel *model; GtkTreeIter current; gint nth_backend; guint i; GValue value = {0,}; model = gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->backend)); nth_backend = -1; if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), ¤t)){ i = 0; do{ gchar *str; gtk_tree_model_get_value(GTK_TREE_MODEL(model), ¤t, 0, &value); str = g_value_get_string(&value); if(str != NULL && !g_strcmp0(backend, str)){ nth_backend = i; g_value_unset(&value); break; } g_value_unset(&value); i++; }while(gtk_tree_model_iter_next(GTK_TREE_MODEL(model), ¤t)); } if(!g_ascii_strncasecmp(backend, "core-audio", 11)){ #ifdef AGS_WITH_CORE_AUDIO gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), nth_backend); #else gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #endif gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), TRUE); // ags_soundcard_editor_load_core_audio_card(soundcard_editor); }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ #ifdef AGS_WITH_PULSE gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), nth_backend); #else gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #endif gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->capability), 0); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), FALSE); // ags_soundcard_editor_load_pulse_card(soundcard_editor); }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ #ifdef AGS_WITH_JACK gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), nth_backend); #else gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #endif gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); // ags_soundcard_editor_load_jack_card(soundcard_editor); }else if(!g_ascii_strncasecmp(backend, "wasapi", 7)){ #ifdef AGS_WITH_WASAPI gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), nth_backend); #else gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #endif gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); // ags_soundcard_editor_load_wasapi_card(soundcard_editor); }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ #ifdef AGS_WITH_ALSA gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), nth_backend); #else gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #endif gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); // ags_soundcard_editor_load_alsa_card(soundcard_editor); }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ #ifdef AGS_WITH_OSS gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), nth_backend); #else gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #endif gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->capability), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->use_cache), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(soundcard_editor->cache_buffer_size), FALSE); // ags_soundcard_editor_load_oss_card(soundcard_editor); } } /* */ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard)); card_id = NULL; card_name = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(soundcard), &card_id_start, &card_name_start); card_id = card_id_start; card_name = card_name_start; nth = 0; found_card = FALSE; gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ //FIXME:JK: work-around for alsa-handle tmp = card_id->data; if(tmp != NULL && device != NULL && !g_ascii_strcasecmp(tmp, device)){ found_card = TRUE; } if(tmp != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, tmp); } if(!found_card){ nth++; } card_id = card_id->next; card_name = card_name->next; } if(!found_card){ nth = 0; } gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->card), nth); if(card_id_start != NULL){ g_list_free_full(card_id_start, g_free); g_list_free_full(card_name_start, g_free); } /* capability */ switch(capability){ case AGS_SOUNDCARD_CAPABILITY_PLAYBACK: { gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->capability), 0); } break; case AGS_SOUNDCARD_CAPABILITY_CAPTURE: { gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->capability), 1); } break; case AGS_SOUNDCARD_CAPABILITY_DUPLEX: { gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->capability), 2); } break; } /* */ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), &channels, &samplerate, &buffer_size, &format); /* */ gtk_spin_button_set_value(soundcard_editor->audio_channels, (gdouble) channels); gtk_spin_button_set_value(soundcard_editor->samplerate, (gdouble) samplerate); gtk_spin_button_set_value(soundcard_editor->buffer_size, (gdouble) buffer_size); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->format), 0); break; case AGS_SOUNDCARD_SIGNED_16_BIT: gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->format), 1); break; case AGS_SOUNDCARD_SIGNED_24_BIT: gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->format), 2); break; case AGS_SOUNDCARD_SIGNED_32_BIT: gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->format), 3); break; case AGS_SOUNDCARD_SIGNED_64_BIT: gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->format), 4); break; } /* */ if(device != NULL && soundcard != NULL){ error = NULL; ags_soundcard_pcm_info(AGS_SOUNDCARD(soundcard), device, &channels_min, &channels_max, &samplerate_min, &samplerate_max, &buffer_size_min, &buffer_size_max, &error); if(error != NULL){ channels_min = 0.0; channels_max = 24.0; samplerate_min = 8000.0; samplerate_max = 192000.0; buffer_size_min = 2.0; buffer_size_max = 65535.0; g_message("%s", error->message); g_error_free(error); } }else{ channels_min = 0.0; channels_max = 24.0; samplerate_min = 8000.0; samplerate_max = 192000.0; buffer_size_min = 2.0; buffer_size_max = 65535.0; } gtk_spin_button_set_range(soundcard_editor->audio_channels, channels_min, channels_max); gtk_spin_button_set_range(soundcard_editor->samplerate, samplerate_min, samplerate_max); gtk_spin_button_set_range(soundcard_editor->buffer_size, buffer_size_min, buffer_size_max); soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_RESET); if(AGS_IS_PULSE_DEVOUT(soundcard)){ GList *start_port, *port; guint cache_buffer_size; gboolean use_cache; GRecMutex *pulse_port_mutex; g_object_get(soundcard, "pulse-port", &start_port, NULL); port = start_port; if(port != NULL){ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(port->data); /* read use cache and cache buffer size */ g_rec_mutex_lock(pulse_port_mutex); use_cache = AGS_PULSE_PORT(port->data)->use_cache; cache_buffer_size = AGS_PULSE_PORT(port->data)->cache_buffer_size; g_rec_mutex_unlock(pulse_port_mutex); /* reset */ gtk_toggle_button_set_active(soundcard_editor->use_cache, use_cache); gtk_spin_button_set_value(soundcard_editor->cache_buffer_size, cache_buffer_size); } g_list_free_full(start_port, g_object_unref); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ GList *start_port, *port; guint cache_buffer_size; gboolean use_cache; GRecMutex *core_audio_port_mutex; g_object_get(soundcard, "core-audio-port", &start_port, NULL); port = start_port; if(port != NULL){ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(port->data); /* read use cache and cache buffer size */ g_rec_mutex_lock(core_audio_port_mutex); use_cache = AGS_CORE_AUDIO_PORT(port->data)->use_cache; cache_buffer_size = AGS_CORE_AUDIO_PORT(port->data)->cache_buffer_size; g_rec_mutex_unlock(core_audio_port_mutex); /* reset */ gtk_toggle_button_set_active(soundcard_editor->use_cache, use_cache); gtk_spin_button_set_value(soundcard_editor->cache_buffer_size, cache_buffer_size); } g_list_free_full(start_port, g_object_unref); }else{ gtk_toggle_button_set_active(soundcard_editor->use_cache, FALSE); } #if defined AGS_WITH_WASAPI if(AGS_IS_WASAPI_DEVOUT(soundcard)){ GRecMutex *mutex; mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(AGS_WASAPI_DEVOUT(soundcard)); g_rec_mutex_lock(mutex); wasapi_buffer_size = AGS_WASAPI_DEVOUT(soundcard)->wasapi_buffer_size; g_rec_mutex_unlock(mutex); gtk_spin_button_set_value(soundcard_editor->wasapi_buffer_size, (gdouble) wasapi_buffer_size); if(ags_wasapi_devout_test_flags(soundcard, AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE)){ gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->wasapi_share_mode), 0); }else{ gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->wasapi_share_mode), 1); } }else if(AGS_IS_WASAPI_DEVIN(soundcard)){ GRecMutex *mutex; mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(AGS_WASAPI_DEVIN(soundcard)); g_rec_mutex_lock(mutex); wasapi_buffer_size = AGS_WASAPI_DEVIN(soundcard)->wasapi_buffer_size; g_rec_mutex_unlock(mutex); gtk_spin_button_set_value(soundcard_editor->wasapi_buffer_size, (gdouble) wasapi_buffer_size); if(ags_wasapi_devin_test_flags(soundcard, AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE)){ gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->wasapi_share_mode), 0); }else{ gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->wasapi_share_mode), 1); } } #endif } void ags_soundcard_editor_add_port(AgsSoundcardEditor *soundcard_editor, gchar *device) { AgsPulseServer *pulse_server; AgsPulseDevout *pulse_devout; AgsJackServer *jack_server; AgsJackDevout *jack_devout; AgsCoreAudioServer *core_audio_server; AgsCoreAudioDevout *core_audio_devout; AgsThread *main_loop; AgsThread *soundcard_thread, *default_soundcard_thread; AgsThread *export_thread; AgsApplicationContext *application_context; GObject *soundcard; GType server_type; GList *start_sound_server, *sound_server; GList *start_soundcard; GList *card_name, *card_uri; gchar *backend; gboolean use_core_audio, use_pulse, use_jack; gboolean is_output; gboolean initial_soundcard; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } application_context = ags_application_context_get_instance(); core_audio_server = NULL; core_audio_devout = NULL; pulse_server = NULL; pulse_devout = NULL; jack_server = NULL; jack_devout = NULL; soundcard = NULL; server_type = G_TYPE_NONE; backend = NULL; use_core_audio = FALSE; use_pulse = FALSE; use_jack = FALSE; is_output = (gtk_combo_box_get_active(GTK_COMBO_BOX(soundcard_editor->capability)) == 0) ? TRUE: FALSE; initial_soundcard = FALSE; /* determine backend */ backend = gtk_combo_box_text_get_active_text(soundcard_editor->backend); if(backend != NULL){ if(!g_ascii_strncasecmp(backend, "core-audio", 11)){ server_type = AGS_TYPE_CORE_AUDIO_SERVER; use_core_audio = TRUE; }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ server_type = AGS_TYPE_PULSE_SERVER; use_pulse = TRUE; }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ server_type = AGS_TYPE_JACK_SERVER; use_jack = TRUE; } } /* create soundcard */ sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((sound_server = ags_list_util_find_type(start_sound_server, server_type)) != NULL){ if(use_core_audio){ core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server->data); core_audio_devout = (AgsCoreAudioDevout *) ags_sound_server_register_soundcard(AGS_SOUND_SERVER(core_audio_server), is_output); soundcard = (GObject *) core_audio_devout; }else if(use_pulse){ pulse_server = AGS_PULSE_SERVER(sound_server->data); pulse_devout = (AgsPulseDevout *) ags_sound_server_register_soundcard(AGS_SOUND_SERVER(pulse_server), is_output); soundcard = (GObject *) pulse_devout; }else if(use_jack){ jack_server = AGS_JACK_SERVER(sound_server->data); jack_devout = (AgsJackDevout *) ags_sound_server_register_soundcard(AGS_SOUND_SERVER(jack_server), is_output); soundcard = (GObject *) jack_devout; } }else{ g_warning("sound server not found"); g_list_free_full(start_sound_server, g_object_unref); return; } if(soundcard == NULL){ g_list_free_full(start_sound_server, g_object_unref); return; } /* add new */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); if(ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)) == NULL){ initial_soundcard = TRUE; } soundcard_editor->soundcard = soundcard; start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); g_list_foreach(start_soundcard, (GFunc) g_object_unref, NULL); start_soundcard = g_list_append(start_soundcard, soundcard); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), start_soundcard); /* add AgsAudio to AgsSoundcard */ #if 0 if(initial_soundcard){ GList *machine, *machine_start; GList *start_list, *list; machine = machine_start = gtk_container_get_children(GTK_CONTAINER(window->machines)); while(machine != NULL){ g_object_ref(G_OBJECT(AGS_MACHINE(machine->data)->audio)); list = start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); g_list_foreach(start_list, (GFunc) g_object_unref, NULL); list = g_list_append(start_list, AGS_MACHINE(machine->data)->audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), start_list); machine = machine->next; } g_list_free(machine_start); } #endif g_object_ref(soundcard); soundcard_thread = (AgsThread *) ags_soundcard_thread_new(soundcard, ags_soundcard_get_capability(AGS_SOUNDCARD(soundcard))); soundcard_editor->soundcard_thread = (GObject *) soundcard_thread; ags_thread_add_child_extended(main_loop, soundcard_thread, TRUE, TRUE); if((default_soundcard_thread = ags_sound_provider_get_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context))) == NULL){ ags_sound_provider_set_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context), (GObject *) soundcard_thread); }else{ g_object_unref(default_soundcard_thread); } /* export thread */ export_thread = (AgsThread *) ags_export_thread_new(soundcard, NULL); ags_thread_add_child_extended(main_loop, (AgsThread *) export_thread, TRUE, TRUE); /* */ card_name = NULL; card_uri = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(soundcard), &card_uri, &card_name); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_uri != NULL){ if(card_uri->data != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_uri->data); } card_uri = card_uri->next; } /* unref */ g_object_unref(main_loop); } void ags_soundcard_editor_remove_port(AgsSoundcardEditor *soundcard_editor, gchar *device) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioDevout *core_audio_devout; AgsPulseServer *pulse_server; AgsPulseDevout *pulse_devout; AgsJackServer *jack_server; AgsJackDevout *jack_devout; AgsApplicationContext *application_context; AgsThread *main_loop; GObject *soundcard; GType server_type; GList *machine, *machine_start; GList *start_sound_server, *sound_server; GList *start_list, *list; GList *card_id; gchar *backend; gboolean use_core_audio, use_pulse, use_jack; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } application_context = ags_application_context_get_instance(); core_audio_server = NULL; core_audio_devout = NULL; pulse_server = NULL; pulse_devout = NULL; jack_server = NULL; jack_devout = NULL; soundcard = NULL; server_type = G_TYPE_NONE; backend = NULL; use_core_audio = FALSE; use_pulse = FALSE; use_jack = FALSE; /* determine backend */ backend = gtk_combo_box_text_get_active_text(soundcard_editor->backend); if(backend != NULL){ if(!g_ascii_strncasecmp(backend, "core-audio", 6)){ server_type = AGS_TYPE_CORE_AUDIO_SERVER; use_core_audio = TRUE; }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ server_type = AGS_TYPE_PULSE_SERVER; use_pulse = TRUE; }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ server_type = AGS_TYPE_JACK_SERVER; use_jack = TRUE; } } /* destroy soundcard */ start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((sound_server = ags_list_util_find_type(start_sound_server, server_type)) == NULL){ g_list_free_full(start_sound_server, g_object_unref); g_warning("sound server not found"); return; } g_list_free_full(start_sound_server, g_object_unref); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(use_core_audio){ if(AGS_IS_CORE_AUDIO_DEVOUT(list->data) && !g_ascii_strcasecmp(ags_soundcard_get_device(AGS_SOUNDCARD(list->data)), device)){ core_audio_devout = list->data; soundcard = (GObject *) core_audio_devout; break; } }else if(use_pulse){ if(AGS_IS_PULSE_DEVOUT(list->data) && !g_ascii_strcasecmp(ags_soundcard_get_device(AGS_SOUNDCARD(list->data)), device)){ pulse_devout = list->data; soundcard = (GObject *) pulse_devout; break; } }else if(use_jack){ if(AGS_IS_JACK_DEVOUT(list->data) && !g_ascii_strcasecmp(ags_soundcard_get_device(AGS_SOUNDCARD(list->data)), device)){ jack_devout = list->data; soundcard = (GObject *) jack_devout; break; } } list = list->next; } g_list_free_full(start_list, g_object_unref); if(soundcard == NULL){ return; } /* remove AgsSoundcard from AgsAudio */ #if 0 machine = machine_start = gtk_container_get_children(GTK_CONTAINER(window->machines)); while(machine != NULL){ if(AGS_MACHINE(machine->data)->audio->soundcard == soundcard){ g_object_set(AGS_MACHINE(machine->data)->audio, "soundcard", NULL, NULL); g_object_unref(G_OBJECT(AGS_MACHINE(machine->data)->audio)); } machine = machine->next; } ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), NULL); g_list_free(machine_start); #endif /* */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); gtk_combo_box_set_active(GTK_COMBO_BOX(soundcard_editor->backend), -1); #if 0 if(server != NULL){ ags_sound_server_unregister_soundcard(AGS_SOUND_SERVER(server), soundcard); } #endif /* remove */ if(soundcard == soundcard_editor->soundcard){ soundcard_editor->soundcard = NULL; } #if 0 if(soundcard != NULL){ ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_remove(ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)), soundcard)); g_object_unref(soundcard); } if(soundcard_editor->soundcard_thread != NULL){ ags_thread_stop((AgsThread *) soundcard_editor->soundcard_thread); ags_thread_remove_child(main_loop, (AgsThread *) soundcard_editor->soundcard_thread); // g_object_unref(soundcard_editor->soundcard_thread); soundcard_editor->soundcard_thread = NULL; } #endif /* unref */ g_object_unref(main_loop); } void ags_soundcard_editor_add_soundcard(AgsSoundcardEditor *soundcard_editor, GObject *soundcard) { AgsThread *main_loop; AgsThread *soundcard_thread, *default_soundcard_thread; AgsThread *export_thread; AgsApplicationContext *application_context; GList *start_list, *list; gboolean initial_soundcard; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } if(soundcard == NULL || AGS_IS_CORE_AUDIO_DEVOUT(soundcard) || AGS_IS_PULSE_DEVOUT(soundcard) || AGS_IS_JACK_DEVOUT(soundcard)){ return; } if((AGS_SOUNDCARD_EDITOR_BLOCK_ADD & (soundcard_editor->flags)) != 0){ return; } soundcard_editor->flags |= AGS_SOUNDCARD_EDITOR_BLOCK_ADD; application_context = ags_application_context_get_instance(); initial_soundcard = FALSE; if(AGS_IS_DEVOUT(soundcard)){ if((AGS_DEVOUT_ALSA & (AGS_DEVOUT(soundcard)->flags)) != 0){ ags_soundcard_set_device(AGS_SOUNDCARD(soundcard), "hw:0,0"); }else if((AGS_DEVOUT_OSS & (AGS_DEVOUT(soundcard)->flags)) != 0){ ags_soundcard_set_device(AGS_SOUNDCARD(soundcard), "/dev/dsp0"); }else{ g_warning("unknown soundcard implementation"); } }else if(AGS_IS_WASAPI_DEVOUT(soundcard)){ //nothing }else{ g_warning("unknown soundcard implementation"); } /* */ start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(g_list_find(start_list, soundcard) != NULL){ soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_ADD); g_list_free_full(start_list, g_object_unref); return; } main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); if(start_list == NULL){ initial_soundcard = TRUE; } soundcard_editor->soundcard = soundcard; g_list_foreach(start_list, (GFunc) g_object_unref, NULL); start_list = g_list_append(start_list, soundcard); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), start_list); /* add AgsAudio to AgsSoundcard */ #if 0 if(initial_soundcard){ GList *machine, *machine_start; GList *list; machine = machine_start = gtk_container_get_children(GTK_CONTAINER(window->machines)); while(machine != NULL){ g_object_ref(G_OBJECT(AGS_MACHINE(machine->data)->audio)); list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); list = g_list_prepend(list, AGS_MACHINE(machine->data)->audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), list); g_object_set(AGS_MACHINE(machine->data)->audio, "soundcard", soundcard, NULL); machine = machine->next; } g_list_free(machine_start); } #endif g_object_ref(soundcard); soundcard_thread = (AgsThread *) ags_soundcard_thread_new(soundcard, ags_soundcard_get_capability(AGS_SOUNDCARD(soundcard))); soundcard_editor->soundcard_thread = (GObject *) soundcard_thread; ags_thread_add_child_extended(main_loop, soundcard_thread, TRUE, TRUE); if((default_soundcard_thread = ags_sound_provider_get_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context))) == NULL){ ags_sound_provider_set_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context), (GObject *) soundcard_thread); }else{ g_object_unref(default_soundcard_thread); } /* export thread */ export_thread = (AgsThread *) ags_export_thread_new(soundcard, NULL); ags_thread_add_child_extended(main_loop, (AgsThread *) export_thread, TRUE, TRUE); soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_ADD); /* unref */ g_object_unref(main_loop); } void ags_soundcard_editor_remove_soundcard(AgsSoundcardEditor *soundcard_editor, GObject *soundcard) { AgsThread *main_loop; AgsThread *soundcard_thread; AgsApplicationContext *application_context; GList *machine, *machine_start; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } if(soundcard == NULL || AGS_IS_CORE_AUDIO_DEVOUT(soundcard) || AGS_IS_PULSE_DEVOUT(soundcard) || AGS_IS_JACK_DEVOUT(soundcard)){ return; } application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* remove AgsSoundcard from AgsAudio */ #if 0 machine = machine_start = gtk_container_get_children(window->machines); while(machine != NULL){ if(AGS_MACHINE(machine->data)->audio->soundcard == soundcard){ g_object_set(AGS_MACHINE(machine->data)->audio, "soundcard", NULL, NULL); g_object_unref(G_OBJECT(AGS_MACHINE(machine->data)->audio)); } machine = machine->next; } ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), NULL); g_list_free(machine_start); #endif /* */ if(soundcard == soundcard_editor->soundcard){ soundcard_editor->soundcard = NULL; } #if 0 if(soundcard != NULL){ ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_remove(ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)), soundcard)); g_object_unref(soundcard); } #endif #if 0 if(soundcard_editor->soundcard_thread != NULL){ ags_thread_stop((AgsThread *) soundcard_editor->soundcard_thread); ags_thread_remove_child(main_loop, (AgsThread *) soundcard_editor->soundcard_thread); // g_object_unref(soundcard_editor->soundcard_thread); soundcard_editor->soundcard_thread = NULL; } #endif /* unref */ g_object_unref(main_loop); } void ags_soundcard_editor_load_core_audio_card(AgsSoundcardEditor *soundcard_editor) { AgsCoreAudioDevout *core_audio_devout; AgsApplicationContext *application_context; GList *start_sound_server, *sound_server; GList *start_soundcard, *soundcard; GList *card_id; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } application_context = ags_application_context_get_instance(); /* create soundcard */ sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if(sound_server == NULL){ g_warning("sound server not found"); return; } soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); core_audio_devout = NULL; while(soundcard != NULL){ if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard->data)){ core_audio_devout = soundcard->data; break; } soundcard = soundcard->next; } card_id = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(core_audio_devout), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ if(card_id->data != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_id->data); } card_id = card_id->next; } /* unref */ g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_soundcard, g_object_unref); } void ags_soundcard_editor_load_pulse_card(AgsSoundcardEditor *soundcard_editor) { AgsPulseDevout *pulse_devout; AgsApplicationContext *application_context; GList *start_sound_server, *sound_server; GList *start_soundcard, *soundcard; GList *card_id; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } application_context = ags_application_context_get_instance(); /* create soundcard */ sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if(sound_server == NULL){ g_warning("sound server not found"); return; } soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); pulse_devout = NULL; while(soundcard != NULL){ if(AGS_IS_PULSE_DEVOUT(soundcard->data)){ pulse_devout = soundcard->data; break; } soundcard = soundcard->next; } card_id = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(pulse_devout), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ if(card_id->data != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_id->data); } card_id = card_id->next; } /* unref */ g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_soundcard, g_object_unref); } void ags_soundcard_editor_load_jack_card(AgsSoundcardEditor *soundcard_editor) { AgsJackDevout *jack_devout; AgsApplicationContext *application_context; GList *start_sound_server, *sound_server; GList *start_soundcard, *soundcard; GList *card_id; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } application_context = ags_application_context_get_instance(); /* create soundcard */ sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if(sound_server == NULL){ g_warning("sound server not found"); return; } soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); jack_devout = NULL; while(soundcard != NULL){ if(AGS_IS_JACK_DEVOUT(soundcard->data)){ jack_devout = soundcard->data; break; } soundcard = soundcard->next; } card_id = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(jack_devout), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ if(card_id->data != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_id->data); } card_id = card_id->next; } /* unref */ g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_soundcard, g_object_unref); } void ags_soundcard_editor_load_wasapi_card(AgsSoundcardEditor *soundcard_editor) { AgsDevout *devout; AgsApplicationContext *application_context; GList *list; GList *card_id; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } if((AGS_SOUNDCARD_EDITOR_BLOCK_LOAD & (soundcard_editor->flags)) != 0){ return; } soundcard_editor->flags |= AGS_SOUNDCARD_EDITOR_BLOCK_LOAD; application_context = ags_application_context_get_instance(); /* */ devout = g_object_new(AGS_TYPE_WASAPI_DEVOUT, NULL); card_id = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(devout), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ if(card_id != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_id->data); } card_id = card_id->next; } /* remove previous */ if(soundcard_editor->soundcard != NULL){ ags_soundcard_editor_remove_soundcard(soundcard_editor, (GObject *) soundcard_editor->soundcard); } /* add new */ ags_soundcard_editor_add_soundcard(soundcard_editor, (GObject *) devout); /* */ list = gtk_container_get_children((GtkContainer *) gtk_widget_get_parent(GTK_WIDGET(soundcard_editor))); if(list->data == soundcard_editor){ gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, TRUE); } g_list_free(list); soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_LOAD); } void ags_soundcard_editor_load_alsa_card(AgsSoundcardEditor *soundcard_editor) { AgsDevout *devout; AgsApplicationContext *application_context; GList *list; GList *card_id; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } if((AGS_SOUNDCARD_EDITOR_BLOCK_LOAD & (soundcard_editor->flags)) != 0){ return; } soundcard_editor->flags |= AGS_SOUNDCARD_EDITOR_BLOCK_LOAD; application_context = ags_application_context_get_instance(); /* */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); devout->flags &= (~AGS_DEVOUT_OSS); devout->flags |= AGS_DEVOUT_ALSA; card_id = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(devout), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ if(card_id != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_id->data); } card_id = card_id->next; } /* remove previous */ if(soundcard_editor->soundcard != NULL){ ags_soundcard_editor_remove_soundcard(soundcard_editor, (GObject *) soundcard_editor->soundcard); } /* add new */ ags_soundcard_editor_add_soundcard(soundcard_editor, (GObject *) devout); /* */ list = gtk_container_get_children((GtkContainer *) gtk_widget_get_parent(GTK_WIDGET(soundcard_editor))); if(list->data == soundcard_editor){ gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, TRUE); } g_list_free(list); soundcard_editor->flags &= (~AGS_SOUNDCARD_EDITOR_BLOCK_LOAD); } void ags_soundcard_editor_load_oss_card(AgsSoundcardEditor *soundcard_editor) { AgsDevout *devout; AgsApplicationContext *application_context; GList *list; GList *card_id; if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } application_context = ags_application_context_get_instance(); /* */ devout = g_object_new(AGS_TYPE_DEVOUT, NULL); devout->flags &= (~AGS_DEVOUT_ALSA); devout->flags |= AGS_DEVOUT_OSS; card_id = NULL; ags_soundcard_list_cards(AGS_SOUNDCARD(devout), &card_id, NULL); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(soundcard_editor->card)))); while(card_id != NULL){ if(card_id != NULL){ gtk_combo_box_text_append_text(soundcard_editor->card, card_id->data); } card_id = card_id->next; } /* remove previous */ if(soundcard_editor->soundcard != NULL){ ags_soundcard_editor_remove_soundcard(soundcard_editor, (GObject *) soundcard_editor->soundcard); } /* add new */ ags_soundcard_editor_add_soundcard(soundcard_editor, (GObject *) devout); /* */ list = gtk_container_get_children((GtkContainer *) gtk_widget_get_parent(GTK_WIDGET(soundcard_editor))); if(list->data == soundcard_editor){ gtk_widget_set_sensitive((GtkWidget *) soundcard_editor->buffer_size, TRUE); } g_list_free(list); } void ags_soundcard_editor_show_wasapi_control(AgsSoundcardEditor *soundcard_editor) { if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } #if defined(AGS_WITH_WASAPI) gtk_widget_show(soundcard_editor->wasapi_share_mode_label); gtk_widget_show(soundcard_editor->wasapi_share_mode); gtk_widget_show(soundcard_editor->wasapi_buffer_size_label); gtk_widget_show(soundcard_editor->wasapi_buffer_size); #endif } void ags_soundcard_editor_hide_wasapi_control(AgsSoundcardEditor *soundcard_editor) { if(!AGS_IS_SOUNDCARD_EDITOR(soundcard_editor)){ return; } #if defined(AGS_WITH_WASAPI) gtk_widget_hide(soundcard_editor->wasapi_share_mode_label); gtk_widget_hide(soundcard_editor->wasapi_share_mode); gtk_widget_hide(soundcard_editor->wasapi_buffer_size_label); gtk_widget_hide(soundcard_editor->wasapi_buffer_size); #endif } /** * ags_soundcard_editor_new: * * Create a new instance of #AgsSoundcardEditor * * Returns: the new #AgsSoundcardEditor * * Since: 3.0.0 */ AgsSoundcardEditor* ags_soundcard_editor_new() { AgsSoundcardEditor *soundcard_editor; soundcard_editor = (AgsSoundcardEditor *) g_object_new(AGS_TYPE_SOUNDCARD_EDITOR, NULL); return(soundcard_editor); } gsequencer-3.1.3/ags/X/ags_effect_line_callbacks.h0000644000175000017500000000227313607210263017032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_LINE_CALLBACKS_H__ #define __AGS_EFFECT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_effect_line_check_message_callback(GObject *application_context, AgsEffectLine *effect_line); G_END_DECLS #endif /*__AGS_EFFECT_LINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_midi_preferences.c0000644000175000017500000002245413607210263016071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_midi_preferences_class_init(AgsMidiPreferencesClass *midi_preferences); void ags_midi_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_midi_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_midi_preferences_init(AgsMidiPreferences *midi_preferences); void ags_midi_preferences_connect(AgsConnectable *connectable); void ags_midi_preferences_disconnect(AgsConnectable *connectable); void ags_midi_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_midi_preferences_apply(AgsApplicable *applicable); void ags_midi_preferences_reset(AgsApplicable *applicable); static void ags_midi_preferences_finalize(GObject *gobject); /** * SECTION:ags_midi_preferences * @short_description: A composite widget to do midi related preferences * @title: AgsMidiPreferences * @section_id: * @include: ags/X/ags_midi_preferences.h * * #AgsMidiPreferences enables you to make preferences of sequencer, midi channels, * samplerate and buffer size. */ static gpointer ags_midi_preferences_parent_class = NULL; GType ags_midi_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_preferences = 0; static const GTypeInfo ags_midi_preferences_info = { sizeof (AgsMidiPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_midi_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_midi_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_midi_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsMidiPreferences", &ags_midi_preferences_info, 0); g_type_add_interface_static(ags_type_midi_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_midi_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_preferences); } return g_define_type_id__volatile; } void ags_midi_preferences_class_init(AgsMidiPreferencesClass *midi_preferences) { GObjectClass *gobject; GtkWidgetClass *widget; ags_midi_preferences_parent_class = g_type_class_peek_parent(midi_preferences); /* GtkObjectClass */ gobject = (GObjectClass *) midi_preferences; gobject->finalize = ags_midi_preferences_finalize; } void ags_midi_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_midi_preferences_connect; connectable->disconnect = ags_midi_preferences_disconnect; } void ags_midi_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_midi_preferences_set_update; applicable->apply = ags_midi_preferences_apply; applicable->reset = ags_midi_preferences_reset; } void ags_midi_preferences_init(AgsMidiPreferences *midi_preferences) { GtkScrolledWindow *scrolled_window; GtkTable *table; GtkHBox *hbox; g_signal_connect_after((GObject *) midi_preferences, "parent-set", G_CALLBACK(ags_midi_preferences_parent_set_callback), (gpointer) midi_preferences); midi_preferences->flags = 0; /* scrolled window */ scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start((GtkBox *) midi_preferences, (GtkWidget *) scrolled_window, TRUE, TRUE, 0); midi_preferences->sequencer_editor = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) midi_preferences->sequencer_editor); /* */ midi_preferences->add = NULL; } static void ags_midi_preferences_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_midi_preferences_parent_class)->finalize(gobject); } void ags_midi_preferences_connect(AgsConnectable *connectable) { AgsMidiPreferences *midi_preferences; midi_preferences = AGS_MIDI_PREFERENCES(connectable); if((AGS_MIDI_PREFERENCES_CONNECTED & (midi_preferences->flags)) != 0){ return; } midi_preferences->flags |= AGS_MIDI_PREFERENCES_CONNECTED; if(midi_preferences->add != NULL){ g_signal_connect(G_OBJECT(midi_preferences->add), "clicked", G_CALLBACK(ags_midi_preferences_add_callback), midi_preferences); } } void ags_midi_preferences_disconnect(AgsConnectable *connectable) { AgsMidiPreferences *midi_preferences; midi_preferences = AGS_MIDI_PREFERENCES(connectable); if((AGS_MIDI_PREFERENCES_CONNECTED & (midi_preferences->flags)) == 0){ return; } midi_preferences->flags &= (~AGS_MIDI_PREFERENCES_CONNECTED); if(midi_preferences->add != NULL){ g_object_disconnect(G_OBJECT(midi_preferences->add), "any_signal::clicked", G_CALLBACK(ags_midi_preferences_add_callback), midi_preferences, NULL); } } void ags_midi_preferences_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_midi_preferences_apply(AgsApplicable *applicable) { AgsMidiPreferences *midi_preferences; GList *list_start, *list; midi_preferences = AGS_MIDI_PREFERENCES(applicable); list = list_start = gtk_container_get_children((GtkContainer *) midi_preferences->sequencer_editor); while(list != NULL){ ags_applicable_apply(AGS_APPLICABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_midi_preferences_reset(AgsApplicable *applicable) { AgsPreferences *preferences; AgsMidiPreferences *midi_preferences; AgsSequencerEditor *sequencer_editor; AgsThread *main_loop; AgsThread *sequencer_thread; AgsApplicationContext *application_context; GObject *sequencer; GList *list_start, *list; midi_preferences = AGS_MIDI_PREFERENCES(applicable); preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(midi_preferences), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); sequencer_thread = ags_thread_find_type(main_loop, AGS_TYPE_SEQUENCER_THREAD); /* clear */ list = list_start = gtk_container_get_children((GtkContainer *) midi_preferences->sequencer_editor); while(list != NULL){ gtk_widget_destroy(GTK_WIDGET(list->data)); list = list->next; } g_list_free(list_start); /* reset */ list = list_start = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ sequencer_editor = ags_sequencer_editor_new(); sequencer_editor->sequencer = list->data; sequencer_editor->sequencer_thread = (GObject *) ags_sequencer_thread_find_sequencer((AgsSequencerThread *) sequencer_thread, list->data); gtk_box_pack_start((GtkBox *) midi_preferences->sequencer_editor, (GtkWidget *) sequencer_editor, FALSE, FALSE, 0); ags_applicable_reset(AGS_APPLICABLE(sequencer_editor)); ags_connectable_connect(AGS_CONNECTABLE(sequencer_editor)); g_signal_connect(sequencer_editor->remove, "clicked", G_CALLBACK(ags_midi_preferences_remove_sequencer_editor_callback), midi_preferences); list = list->next; } g_list_free_full(list_start, g_object_unref); gtk_widget_show_all((GtkWidget *) midi_preferences->sequencer_editor); /* unref */ g_object_unref(main_loop); } /** * ags_midi_preferences_new: * * Create a new instance of #AgsMidiPreferences * * Returns: the new #AgsMidiPreferences * * Since: 3.0.0 */ AgsMidiPreferences* ags_midi_preferences_new() { AgsMidiPreferences *midi_preferences; midi_preferences = (AgsMidiPreferences *) g_object_new(AGS_TYPE_MIDI_PREFERENCES, NULL); return(midi_preferences); } gsequencer-3.1.3/ags/X/ags_ui_provider.c0000644000175000017500000006521413613101102015102 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_ui_provider_class_init(AgsUiProviderInterface *ginterface); /** * SECTION:ags_ui_provider * @short_description: provide accoustics * @title: AgsUiProvider * @section_id: AgsUiProvider * @include: ags/X/ags_ui_provider.h * * The #AgsUiProvider provides you the window capabilities. */ enum { SETUP_COMPLETED, CHECK_MESSAGE, CLEAN_MESSAGE, LAST_SIGNAL, }; static guint ui_provider_signals[LAST_SIGNAL]; GType ags_ui_provider_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ui_provider = 0; ags_type_ui_provider = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsUiProvider", sizeof(AgsUiProviderInterface), (GClassInitFunc) ags_ui_provider_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_ui_provider); } return g_define_type_id__volatile; } void ags_ui_provider_class_init(AgsUiProviderInterface *ginterface) { /** * AgsUiProvider::setup-completed: * @ui_provider: the #AgsUiProvider object * * The ::setup-completed signal is emitted every check message of the UI provider. This notifies * about to check for messages from message delivery. * * Since: 3.0.8 */ ui_provider_signals[SETUP_COMPLETED] = g_signal_new("setup-completed", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsUiProviderInterface, setup_completed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsUiProvider::check-message: * @ui_provider: the #AgsUiProvider object * * The ::check-message signal is emitted every check message of the UI provider. This notifies * about to check for messages from message delivery. * * Since: 3.0.0 */ ui_provider_signals[CHECK_MESSAGE] = g_signal_new("check-message", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsUiProviderInterface, check_message), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsUiProvider::clean-message: * @ui_provider: the #AgsUiProvider object * * The ::clean-message signal is emitted every clean message of the UI provider. This notifies * about to clean messages from message delivery. * * Since: 3.0.0 */ ui_provider_signals[CLEAN_MESSAGE] = g_signal_new("clean-message", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsUiProviderInterface, clean_message), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } /** * ags_ui_provider_get_show_animation: * @ui_provider: the #AgsUiProvider * * Get show animation. * * Returns: %TRUE if animation does show, else %FALSE * * Since: 3.0.0 */ gboolean ags_ui_provider_get_show_animation(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), FALSE); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_show_animation, FALSE); return(ui_provider_interface->get_show_animation(ui_provider)); } /** * ags_ui_provider_set_show_animation: * @ui_provider: the #AgsUiProvider * @show_animation: do show animation * * Set show animation. * * Since: 3.0.0 */ void ags_ui_provider_set_show_animation(AgsUiProvider *ui_provider, gboolean show_animation) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_show_animation); ui_provider_interface->set_show_animation(ui_provider, show_animation); } /** * ags_ui_provider_get_gui_ready: * @ui_provider: the #AgsUiProvider * * Get GUI ready. * * Returns: %TRUE if gui is ready, else %FALSE * * Since: 3.0.0 */ gboolean ags_ui_provider_get_gui_ready(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), FALSE); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_gui_ready, FALSE); return(ui_provider_interface->get_gui_ready(ui_provider)); } /** * ags_ui_provider_set_gui_ready: * @ui_provider: the #AgsUiProvider * @gui_ready: is GUI ready * * Set GUI ready. * * Since: 3.0.0 */ void ags_ui_provider_set_gui_ready(AgsUiProvider *ui_provider, gboolean gui_ready) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_gui_ready); ui_provider_interface->set_gui_ready(ui_provider, gui_ready); } /** * ags_ui_provider_get_file_ready: * @ui_provider: the #AgsUiProvider * * Get file ready. * * Returns: %TRUE if gui is ready, else %FALSE * * Since: 3.0.0 */ gboolean ags_ui_provider_get_file_ready(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), FALSE); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_file_ready, FALSE); return(ui_provider_interface->get_file_ready(ui_provider)); } /** * ags_ui_provider_set_file_ready: * @ui_provider: the #AgsUiProvider * @file_ready: is GUI ready * * Set file ready. * * Since: 3.0.0 */ void ags_ui_provider_set_file_ready(AgsUiProvider *ui_provider, gboolean file_ready) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_file_ready); ui_provider_interface->set_file_ready(ui_provider, file_ready); } /** * ags_ui_provider_get_gui_scale_factor: * @ui_provider: the #AgsUiProvider * * Get GUI scale factor. * * Returns: the GUI scale factor as gdouble * * Since: 3.0.0 */ gdouble ags_ui_provider_get_gui_scale_factor(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), FALSE); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_gui_scale_factor, FALSE); return(ui_provider_interface->get_gui_scale_factor(ui_provider)); } /** * ags_ui_provider_set_gui_scale_factor: * @ui_provider: the #AgsUiProvider * @gui_scale_factor: GUI scale factor * * Set the GUI scale factor as gdouble. * * Since: 3.0.0 */ void ags_ui_provider_set_gui_scale_factor(AgsUiProvider *ui_provider, gdouble gui_scale_factor) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_gui_scale_factor); ui_provider_interface->set_gui_scale_factor(ui_provider, gui_scale_factor); } /** * ags_ui_provider_schedule_task: * @ui_provider: the #AgsUiProvider * @task: the #AgsTask * * Schedule @task to be launched. * * Since: 3.0.0 */ void ags_ui_provider_schedule_task(AgsUiProvider *ui_provider, AgsTask *task) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->schedule_task); ui_provider_interface->schedule_task(ui_provider, task); } /** * ags_ui_provider_schedule_task_all: * @ui_provider: the #AgsUiProvider * @task: the #GList-struct containig #AgsTask * * Schedule all @task to be launched. * * Since: 3.0.0 */ void ags_ui_provider_schedule_task_all(AgsUiProvider *ui_provider, GList *task) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->schedule_task_all); ui_provider_interface->schedule_task_all(ui_provider, task); } /** * ags_ui_provider_setup_completed: * @ui_provider: the #AgsUiProvider * * Application context setup completed. * * Since: 3.0.8 */ void ags_ui_provider_setup_completed(AgsUiProvider *ui_provider) { g_signal_emit(ui_provider, ui_provider_signals[SETUP_COMPLETED], 0); } /** * ags_ui_provider_check_message: * @ui_provider: the #AgsUiProvider * * Check messages the UI provider needs to consume. * * Since: 3.0.0 */ void ags_ui_provider_check_message(AgsUiProvider *ui_provider) { g_signal_emit(ui_provider, ui_provider_signals[CHECK_MESSAGE], 0); } /** * ags_ui_provider_clean_message: * @ui_provider: the #AgsUiProvider * * Clean messages the UI provider needs to consume. * * Since: 3.0.0 */ void ags_ui_provider_clean_message(AgsUiProvider *ui_provider) { g_signal_emit(ui_provider, ui_provider_signals[CLEAN_MESSAGE], 0); } /** * ags_ui_provider_get_animation_window: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_animation_window(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_animation_window, NULL); return(ui_provider_interface->get_animation_window(ui_provider)); } /** * ags_ui_provider_set_animation_window: * @ui_provider: the #AgsUiProvider * @animation_window: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_animation_window(AgsUiProvider *ui_provider, GtkWidget *animation_window) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_animation_window); ui_provider_interface->set_animation_window(ui_provider, animation_window); } /** * ags_ui_provider_get_window: * @ui_provider: the #AgsUiProvider * * Get window. * * Returns: the #AgsWindow * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_window(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_window, NULL); return(ui_provider_interface->get_window(ui_provider)); } /** * ags_ui_provider_set_window: * @ui_provider: the #AgsUiProvider * @window: the #AgsWindow * * Set window. * * Since: 3.0.0 */ void ags_ui_provider_set_window(AgsUiProvider *ui_provider, GtkWidget *window) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_window); ui_provider_interface->set_window(ui_provider, window); } /** * ags_ui_provider_get_automation_window: * @ui_provider: the #AgsUiProvider * * Get automation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_automation_window(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_automation_window, NULL); return(ui_provider_interface->get_automation_window(ui_provider)); } /** * ags_ui_provider_set_automation_window: * @ui_provider: the #AgsUiProvider * @automation_window: the #GtkWidget * * Set automation window. * * Since: 3.0.0 */ void ags_ui_provider_set_automation_window(AgsUiProvider *ui_provider, GtkWidget *automation_window) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_automation_window); ui_provider_interface->set_automation_window(ui_provider, automation_window); } /** * ags_ui_provider_get_wave_window: * @ui_provider: the #AgsUiProvider * * Get wave window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_wave_window(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_wave_window, NULL); return(ui_provider_interface->get_wave_window(ui_provider)); } /** * ags_ui_provider_set_wave_window: * @ui_provider: the #AgsUiProvider * @wave_window: the #GtkWidget * * Set wave window. * * Since: 3.0.0 */ void ags_ui_provider_set_wave_window(AgsUiProvider *ui_provider, GtkWidget *wave_window) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_wave_window); ui_provider_interface->set_wave_window(ui_provider, wave_window); } /** * ags_ui_provider_get_sheet_window: * @ui_provider: the #AgsUiProvider * * Get sheet window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_sheet_window(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_sheet_window, NULL); return(ui_provider_interface->get_sheet_window(ui_provider)); } /** * ags_ui_provider_set_sheet_window: * @ui_provider: the #AgsUiProvider * @sheet_window: the #GtkWidget * * Set sheet window. * * Since: 3.0.0 */ void ags_ui_provider_set_sheet_window(AgsUiProvider *ui_provider, GtkWidget *sheet_window) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_sheet_window); ui_provider_interface->set_sheet_window(ui_provider, sheet_window); } /** * ags_ui_provider_get_export_window: * @ui_provider: the #AgsUiProvider * * Get export window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_export_window(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_export_window, NULL); return(ui_provider_interface->get_export_window(ui_provider)); } /** * ags_ui_provider_set_export_window: * @ui_provider: the #AgsUiProvider * @export_window: the #GtkWidget * * Set export window. * * Since: 3.0.0 */ void ags_ui_provider_set_export_window(AgsUiProvider *ui_provider, GtkWidget *export_window) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_export_window); ui_provider_interface->set_export_window(ui_provider, export_window); } /** * ags_ui_provider_get_preferences: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_preferences(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_preferences, NULL); return(ui_provider_interface->get_preferences(ui_provider)); } /** * ags_ui_provider_set_preferences: * @ui_provider: the #AgsUiProvider * @preferences: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_preferences(AgsUiProvider *ui_provider, GtkWidget *preferences) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_preferences); ui_provider_interface->set_preferences(ui_provider, preferences); } /** * ags_ui_provider_get_history_browser: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_history_browser(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_history_browser, NULL); return(ui_provider_interface->get_history_browser(ui_provider)); } /** * ags_ui_provider_set_history_browser: * @ui_provider: the #AgsUiProvider * @history_browser: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_history_browser(AgsUiProvider *ui_provider, GtkWidget *history_browser) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_history_browser); ui_provider_interface->set_history_browser(ui_provider, history_browser); } /** * ags_ui_provider_get_midi_browser: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_midi_browser(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_midi_browser, NULL); return(ui_provider_interface->get_midi_browser(ui_provider)); } /** * ags_ui_provider_set_midi_browser: * @ui_provider: the #AgsUiProvider * @midi_browser: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_midi_browser(AgsUiProvider *ui_provider, GtkWidget *midi_browser) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_midi_browser); ui_provider_interface->set_midi_browser(ui_provider, midi_browser); } /** * ags_ui_provider_et_sample_browser: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_sample_browser(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_sample_browser, NULL); return(ui_provider_interface->get_sample_browser(ui_provider)); } /** * ags_ui_provider_set_sample_browser: * @ui_provider: the #AgsUiProvider * @sample_browser: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_sample_browser(AgsUiProvider *ui_provider, GtkWidget *sample_browser) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_sample_browser); ui_provider_interface->set_sample_browser(ui_provider, sample_browser); } /** * ags_ui_provider_get_midi_import_wizard: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_midi_import_wizard(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_midi_import_wizard, NULL); return(ui_provider_interface->get_midi_import_wizard(ui_provider)); } /** * ags_ui_provider_set_midi_import_wizard: * @ui_provider: the #AgsUiProvider * @midi_import_wizard: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_midi_import_wizard(AgsUiProvider *ui_provider, GtkWidget *midi_import_wizard) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_midi_import_wizard); ui_provider_interface->set_midi_import_wizard(ui_provider, midi_import_wizard); } /** * ags_ui_provider_get_midi_export_wizard: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_midi_export_wizard(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_midi_export_wizard, NULL); return(ui_provider_interface->get_midi_export_wizard(ui_provider)); } /** * ags_ui_provider_set_midi_export_wizard: * @ui_provider: the #AgsUiProvider * @midi_export_wizard: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_midi_export_wizard(AgsUiProvider *ui_provider, GtkWidget *midi_export_wizard) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_midi_export_wizard); ui_provider_interface->set_midi_export_wizard(ui_provider, midi_export_wizard); } /** * ags_ui_provider_get_machine: * @ui_provider: the #AgsUiProvider * * Get machine. * * Returns: the #GList-struct containing #AgsMachine * * Since: 3.0.0 */ GList* ags_ui_provider_get_machine(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_machine, NULL); return(ui_provider_interface->get_machine(ui_provider)); } /** * ags_ui_provider_set_machine: * @ui_provider: the #AgsUiProvider * @machine: the #GList-struct containing #AgsMachine * * Set machine. * * Since: 3.0.0 */ void ags_ui_provider_set_machine(AgsUiProvider *ui_provider, GList *machine) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_machine); ui_provider_interface->set_machine(ui_provider, machine); } /** * ags_ui_provider_get_composite_editor: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_composite_editor(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_composite_editor, NULL); return(ui_provider_interface->get_composite_editor(ui_provider)); } /** * ags_ui_provider_set_composite_editor: * @ui_provider: the #AgsUiProvider * @composite_editor: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_composite_editor(AgsUiProvider *ui_provider, GtkWidget *composite_editor) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_composite_editor); ui_provider_interface->set_composite_editor(ui_provider, composite_editor); } /** * ags_ui_provider_get_navigation: * @ui_provider: the #AgsUiProvider * * Get animation window. * * Returns: the #GtkWidget * * Since: 3.0.0 */ GtkWidget* ags_ui_provider_get_navigation(AgsUiProvider *ui_provider) { AgsUiProviderInterface *ui_provider_interface; g_return_val_if_fail(AGS_IS_UI_PROVIDER(ui_provider), NULL); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_val_if_fail(ui_provider_interface->get_navigation, NULL); return(ui_provider_interface->get_navigation(ui_provider)); } /** * ags_ui_provider_set_navigation: * @ui_provider: the #AgsUiProvider * @navigation: the #GtkWidget * * Set animation window. * * Since: 3.0.0 */ void ags_ui_provider_set_navigation(AgsUiProvider *ui_provider, GtkWidget *navigation) { AgsUiProviderInterface *ui_provider_interface; g_return_if_fail(AGS_IS_UI_PROVIDER(ui_provider)); ui_provider_interface = AGS_UI_PROVIDER_GET_INTERFACE(ui_provider); g_return_if_fail(ui_provider_interface->set_navigation); ui_provider_interface->set_navigation(ui_provider, navigation); } gsequencer-3.1.3/ags/X/ags_connection_editor.c0000644000175000017500000004322113607210263016266 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_connection_editor_class_init(AgsConnectionEditorClass *connection_editor); void ags_connection_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_connection_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_connection_editor_init(AgsConnectionEditor *connection_editor); void ags_connection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_connection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_connection_editor_connect(AgsConnectable *connectable); void ags_connection_editor_disconnect(AgsConnectable *connectable); void ags_connection_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_connection_editor_apply(AgsApplicable *applicable); void ags_connection_editor_reset(AgsApplicable *applicable); void ags_connection_editor_real_set_machine(AgsConnectionEditor *connection_editor, AgsMachine *machine); /** * SECTION:ags_connection_editor * @short_description: Edit audio connections * @title: AgsConnectionEditor * @section_id: * @include: ags/X/ags_connection_editor.h * * #AgsConnectionEditor is a composite widget intended to assign output or input * soundcards. It consists of multiple child editors. */ enum{ SET_MACHINE, LAST_SIGNAL, }; enum{ PROP_0, PROP_MACHINE, }; static guint connection_editor_signals[LAST_SIGNAL]; GType ags_connection_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_connection_editor = 0; static const GTypeInfo ags_connection_editor_info = { sizeof (AgsConnectionEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_connection_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsConnectionEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_connection_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_connection_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_connection_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_connection_editor = g_type_register_static(GTK_TYPE_DIALOG, "AgsConnectionEditor", &ags_connection_editor_info, 0); g_type_add_interface_static(ags_type_connection_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_connection_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_connection_editor); } return g_define_type_id__volatile; } void ags_connection_editor_class_init(AgsConnectionEditorClass *connection_editor) { GObjectClass *gobject; GParamSpec *param_spec; /* GObjectClass */ gobject = (GObjectClass *) connection_editor; gobject->set_property = ags_connection_editor_set_property; gobject->get_property = ags_connection_editor_get_property; /* properties */ /** * AgsConnection:machine: * * The #AgsMachine to edit. * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine which this machine editor is assigned with"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); /* AgsConnectionEditorClass */ connection_editor->set_machine = ags_connection_editor_real_set_machine; /* signals */ /** * AgsConnection::set-machine: * @connection_editor: the #AgsConnectionEditor * @machine: the #AgsMachine to set * * The ::set-machine notify about modified machine. * * Since: 3.0.0 */ connection_editor_signals[SET_MACHINE] = g_signal_new("set-machine", G_TYPE_FROM_CLASS (connection_editor), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsConnectionEditorClass, set_machine), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_connection_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_connection_editor_connect; connectable->disconnect = ags_connection_editor_disconnect; } void ags_connection_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_connection_editor_set_update; applicable->apply = ags_connection_editor_apply; applicable->reset = ags_connection_editor_reset; } void ags_connection_editor_init(AgsConnectionEditor *connection_editor) { GtkNotebook *notebook; GtkScrolledWindow *scrolled_window; gtk_window_set_title((GtkWindow *) connection_editor, i18n("connections")); g_object_set(connection_editor, "default-width", 400, "default-height", 450, NULL); connection_editor->flags = 0; connection_editor->version = AGS_CONNECTION_EDITOR_DEFAULT_VERSION; connection_editor->build_id = AGS_CONNECTION_EDITOR_DEFAULT_BUILD_ID; connection_editor->machine = NULL; connection_editor->notebook = notebook = (GtkNotebook *) gtk_notebook_new(); gtk_box_pack_start(gtk_dialog_get_content_area(connection_editor), (GtkWidget*) notebook, TRUE, TRUE, 0); /* output listing editor */ connection_editor->output_listing_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); /* input listing editor */ connection_editor->input_listing_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); /* output connection editor */ connection_editor->output_connection_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); /* input connection editor */ connection_editor->input_connection_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); /* GtkButton's in GtkDialog->action_area */ connection_editor->apply = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_APPLY); gtk_box_pack_start(gtk_dialog_get_action_area(connection_editor), (GtkWidget *) connection_editor->apply, FALSE, FALSE, 0); connection_editor->ok = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start(gtk_dialog_get_action_area(connection_editor), (GtkWidget *) connection_editor->ok, FALSE, FALSE, 0); connection_editor->cancel = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_start(gtk_dialog_get_action_area(connection_editor), (GtkWidget *) connection_editor->cancel, FALSE, FALSE, 0); } void ags_connection_editor_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(gobject); switch(prop_id){ case PROP_MACHINE: { AgsMachine *machine; machine = (AgsMachine *) g_value_get_object(value); ags_connection_editor_set_machine(connection_editor, machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_connection_editor_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(gobject); switch(prop_id){ case PROP_MACHINE: { g_value_set_object(value, connection_editor->machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_connection_editor_connect(AgsConnectable *connectable) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(connectable); if((AGS_CONNECTION_EDITOR_CONNECTED & (connection_editor->flags)) != 0){ return; } connection_editor->flags |= AGS_CONNECTION_EDITOR_CONNECTED; g_signal_connect(connection_editor, "delete-event", G_CALLBACK(ags_connection_editor_delete_event), connection_editor); /* AgsConnectionEditor tabs */ ags_connectable_connect(AGS_CONNECTABLE(connection_editor->output_listing_editor)); ags_connectable_connect(AGS_CONNECTABLE(connection_editor->input_listing_editor)); ags_connectable_connect(AGS_CONNECTABLE(connection_editor->output_connection_editor)); ags_connectable_connect(AGS_CONNECTABLE(connection_editor->input_connection_editor)); /* AgsConnectionEditor buttons */ g_signal_connect((GObject *) connection_editor->apply, "clicked", G_CALLBACK(ags_connection_editor_apply_callback), (gpointer) connection_editor); g_signal_connect((GObject *) connection_editor->ok, "clicked", G_CALLBACK(ags_connection_editor_ok_callback), (gpointer) connection_editor); g_signal_connect((GObject *) connection_editor->cancel, "clicked", G_CALLBACK(ags_connection_editor_cancel_callback), (gpointer) connection_editor); } void ags_connection_editor_disconnect(AgsConnectable *connectable) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(connectable); if((AGS_CONNECTION_EDITOR_CONNECTED & (connection_editor->flags)) == 0){ return; } connection_editor->flags &= (~AGS_CONNECTION_EDITOR_CONNECTED); /* AgsConnectionEditor tabs */ ags_connectable_disconnect(AGS_CONNECTABLE(connection_editor->output_listing_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(connection_editor->input_listing_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(connection_editor->output_connection_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(connection_editor->input_connection_editor)); } void ags_connection_editor_set_update(AgsApplicable *applicable, gboolean update) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(applicable); ags_applicable_set_update(AGS_APPLICABLE(connection_editor->output_listing_editor), update); ags_applicable_set_update(AGS_APPLICABLE(connection_editor->input_listing_editor), update); ags_applicable_set_update(AGS_APPLICABLE(connection_editor->output_connection_editor), update); ags_applicable_set_update(AGS_APPLICABLE(connection_editor->input_connection_editor), update); } void ags_connection_editor_apply(AgsApplicable *applicable) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(applicable); ags_applicable_apply(AGS_APPLICABLE(connection_editor->output_listing_editor)); ags_applicable_apply(AGS_APPLICABLE(connection_editor->input_listing_editor)); ags_applicable_apply(AGS_APPLICABLE(connection_editor->output_connection_editor)); ags_applicable_apply(AGS_APPLICABLE(connection_editor->input_connection_editor)); } void ags_connection_editor_reset(AgsApplicable *applicable) { AgsConnectionEditor *connection_editor; connection_editor = AGS_CONNECTION_EDITOR(applicable); ags_applicable_reset(AGS_APPLICABLE(connection_editor->output_listing_editor)); ags_applicable_reset(AGS_APPLICABLE(connection_editor->input_listing_editor)); ags_applicable_reset(AGS_APPLICABLE(connection_editor->output_connection_editor)); ags_applicable_reset(AGS_APPLICABLE(connection_editor->input_connection_editor)); } /** * ags_connection_editor_add_children: * @connection_editor: the #AgsConnectionEditor * * Add all child editors. * * Since: 3.0.0 */ void ags_connection_editor_add_children(AgsConnectionEditor *connection_editor) { GParameter *output_connection_editor_child_parameter; GParameter *input_connection_editor_child_parameter; /* output */ output_connection_editor_child_parameter = g_new0(GParameter, 1); output_connection_editor_child_parameter[0].name = "channel_type"; g_value_init(&(output_connection_editor_child_parameter[0].value), G_TYPE_GTYPE); g_value_set_gtype(&(output_connection_editor_child_parameter[0].value), AGS_TYPE_OUTPUT); /* AgsOutput listing editor */ connection_editor->output_listing_editor = (AgsPropertyCollectionEditor *) ags_output_listing_editor_new(AGS_TYPE_OUTPUT); if((AGS_CONNECTION_EDITOR_SHOW_OUTPUT & (connection_editor->flags)) != 0){ gtk_notebook_append_page(connection_editor->notebook, (GtkWidget *) connection_editor->output_listing_editor_scrolled_window, (GtkWidget *) gtk_label_new(i18n("output"))); } gtk_scrolled_window_add_with_viewport(connection_editor->output_listing_editor_scrolled_window, (GtkWidget *) connection_editor->output_listing_editor); /* input */ input_connection_editor_child_parameter = g_new0(GParameter, 1); input_connection_editor_child_parameter[0].name = "channel_type"; g_value_init(&(input_connection_editor_child_parameter[0].value), G_TYPE_GTYPE); g_value_set_gtype(&(input_connection_editor_child_parameter[0].value), AGS_TYPE_INPUT); /* AgsInput listing editor */ connection_editor->input_listing_editor = (AgsPropertyCollectionEditor *) ags_input_listing_editor_new(AGS_TYPE_INPUT); if((AGS_CONNECTION_EDITOR_SHOW_INPUT & (connection_editor->flags)) != 0){ gtk_notebook_append_page(connection_editor->notebook, (GtkWidget *) connection_editor->input_listing_editor_scrolled_window, (GtkWidget *) gtk_label_new(i18n("input"))); } gtk_scrolled_window_add_with_viewport(connection_editor->input_listing_editor_scrolled_window, (GtkWidget *) connection_editor->input_listing_editor); /* AgsOutput connection editor */ connection_editor->output_connection_editor = ags_property_collection_editor_new(AGS_TYPE_OUTPUT_COLLECTION_EDITOR, 1, output_connection_editor_child_parameter); if((AGS_CONNECTION_EDITOR_SHOW_OUTPUT & (connection_editor->flags)) != 0){ gtk_notebook_append_page(connection_editor->notebook, (GtkWidget *) connection_editor->output_connection_editor_scrolled_window, (GtkWidget *) gtk_label_new(i18n("connect output"))); } gtk_scrolled_window_add_with_viewport(connection_editor->output_connection_editor_scrolled_window, (GtkWidget *) connection_editor->output_connection_editor); /* AgsInput connection editor */ connection_editor->input_connection_editor = ags_property_collection_editor_new(AGS_TYPE_INPUT_COLLECTION_EDITOR, 1, input_connection_editor_child_parameter); if((AGS_CONNECTION_EDITOR_SHOW_INPUT & (connection_editor->flags)) != 0){ gtk_notebook_append_page(connection_editor->notebook, (GtkWidget *) connection_editor->input_connection_editor_scrolled_window, (GtkWidget *) gtk_label_new(i18n("connect input"))); } gtk_scrolled_window_add_with_viewport(connection_editor->input_connection_editor_scrolled_window, (GtkWidget *) connection_editor->input_connection_editor); } void ags_connection_editor_real_set_machine(AgsConnectionEditor *connection_editor, AgsMachine *machine) { if(connection_editor->machine != NULL){ gtk_widget_destroy(GTK_WIDGET(connection_editor->output_listing_editor)); gtk_widget_destroy(GTK_WIDGET(connection_editor->input_listing_editor)); gtk_widget_destroy(GTK_WIDGET(connection_editor->output_connection_editor)); gtk_widget_destroy(GTK_WIDGET(connection_editor->input_connection_editor)); } connection_editor->machine = machine; if(machine != NULL){ ags_connection_editor_add_children(connection_editor); } } /** * ags_connection_editor_set_machine: * @connection_editor: an #AgsConnectionEditor * @machine: the new #AgsMachine * * Is emitted as machine gets modified. * * Since: 3.0.0 */ void ags_connection_editor_set_machine(AgsConnectionEditor *connection_editor, AgsMachine *machine) { g_return_if_fail(AGS_IS_CONNECTION_EDITOR(connection_editor)); g_object_ref((GObject *) connection_editor); g_signal_emit(G_OBJECT(connection_editor), connection_editor_signals[SET_MACHINE], 0, machine); g_object_unref((GObject *) connection_editor); } /** * ags_connection_editor_new: * @machine: the assigned #AgsMachine. * * Create a new instance of #AgsConnectionEditor * * Returns: the new #AgsConnectionEditor * * Since: 3.0.0 */ AgsConnectionEditor* ags_connection_editor_new(AgsMachine *machine) { AgsConnectionEditor *connection_editor; connection_editor = (AgsConnectionEditor *) g_object_new(AGS_TYPE_CONNECTION_EDITOR, "machine", machine, NULL); return(connection_editor); } gsequencer-3.1.3/ags/X/ags_playback_window_callbacks.c0000644000175000017500000000146413605312646017746 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/ags_sheet_window_callbacks.c0000644000175000017500000000146013605312646017264 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/ags_property_editor_callbacks.h0000644000175000017500000000232113607210263020013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PROPERTY_EDITOR_CALLBACKS_H__ #define __AGS_PROPERTY_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_property_editor_enable_callback(GtkToggleButton *toggle, AgsPropertyEditor *property_editor); G_END_DECLS #endif /*__AGS_PROPERTY_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_line_member.c0000644000175000017500000013253613607210263015047 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_line_member_class_init(AgsLineMemberClass *line_member); void ags_line_member_connectable_interface_init(AgsConnectableInterface *connectable); void ags_line_member_init(AgsLineMember *line_member); void ags_line_member_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_line_member_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_line_member_finalize(GObject *gobject); void ags_line_member_connect(AgsConnectable *connectable); void ags_line_member_disconnect(AgsConnectable *connectable); void ags_line_member_real_change_port(AgsLineMember *line_member, gpointer port_data); AgsPort* ags_line_member_find_specifier(GList *recall, gchar *specifier); GList* ags_line_member_real_find_port(AgsLineMember *line_member); /** * SECTION:ags_line_member * @short_description: Modify assigned recall's port * @title: AgsLineMember * @section_id: * @include: ags/X/ags_line_member.h * * #AgsLineMember is a composite widget to modify ports of recalls. A line member * controls only one specific port of a recall but distinguishes between simple/complex * recall. It is generally packed into a #AgsLine. */ enum{ CHANGE_PORT, FIND_PORT, LAST_SIGNAL, }; enum{ PROP_0, PROP_WIDGET_TYPE, PROP_WIDGET_LABEL, PROP_PLUGIN_NAME, PROP_FILENAME, PROP_EFFECT, PROP_SPECIFIER, PROP_CONTROL_PORT, PROP_SCALE_PRECISION, PROP_STEP_COUNT, PROP_CONVERSION, PROP_PORT, PROP_PORT_DATA, PROP_RECALL_PORT, PROP_RECALL_PORT_DATA, PROP_TASK_TYPE, }; static gpointer ags_line_member_parent_class = NULL; static guint line_member_signals[LAST_SIGNAL]; GType ags_line_member_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_line_member = 0; static const GTypeInfo ags_line_member_info = { sizeof(AgsLineMemberClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_line_member_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLineMember), 0, /* n_preallocs */ (GInstanceInitFunc) ags_line_member_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_line_member_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_line_member = g_type_register_static(GTK_TYPE_FRAME, "AgsLineMember", &ags_line_member_info, 0); g_type_add_interface_static(ags_type_line_member, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_line_member); } return g_define_type_id__volatile; } void ags_line_member_class_init(AgsLineMemberClass *line_member) { GObjectClass *gobject; GParamSpec *param_spec; ags_line_member_parent_class = g_type_class_peek_parent(line_member); /* GObjectClass */ gobject = G_OBJECT_CLASS(line_member); gobject->set_property = ags_line_member_set_property; gobject->get_property = ags_line_member_get_property; gobject->finalize = ags_line_member_finalize; /* properties */ /** * AgsLineMember:widget-type: * * The widget type to instantiate and use as control. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("widget-type", i18n_pspec("widget type of line member"), i18n_pspec("The widget type this line member packs"), 0, G_MAXULONG, G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WIDGET_TYPE, param_spec); /** * AgsLineMember:widget-label: * * The widget's label to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("widget-label", i18n_pspec("label to display"), i18n_pspec("The label to display"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WIDGET_LABEL, param_spec); /** * AgsLineMember:plugin-name: * * The plugin name of the recall to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("plugin-name", i18n_pspec("plugin name to control"), i18n_pspec("The plugin's name to control"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN_NAME, param_spec); /** * AgsLineMember:filename: * * The plugin filename of the recall to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename of the plugin"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsLineMember:effect: * * The plugin effect of the recall to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect of the plugin"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsLineMember:specifier: * * The plugin specifier of the recall to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_string("specifier", i18n_pspec("port specifier"), i18n_pspec("The specifier of the port"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SPECIFIER, param_spec); /** * AgsLineMember:control-port: * * The control port of the recall. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-port", i18n_pspec("control port index"), i18n_pspec("The index of the port to control"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_PORT, param_spec); /** * AgsLineMember:scale-precision: * * If line member has integer ports, this is the number of steps. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("scale-precision", i18n_pspec("scale precision of line members port"), i18n_pspec("The scale precision this line members port has"), 0, G_MAXUINT, (guint) AGS_DIAL_DEFAULT_PRECISION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_PRECISION, param_spec); /** * AgsLineMember:step-count: * * If line member has logarithmic ports, this is the number of step count. * * Since: 3.0.0 */ param_spec = g_param_spec_double("step-count", i18n_pspec("step count of line members port"), i18n_pspec("The step count this line members port has"), 0.0, G_MAXDOUBLE, AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STEP_COUNT, param_spec); /** * AgsLineMember:conversion: * * The conversion of plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("conversion", i18n_pspec("conversion to apply"), i18n_pspec("The conversion to apply"), AGS_TYPE_CONVERSION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONVERSION, param_spec); /** * AgsLineMember:port: * * The matching simple port of plugin name and specifier. * * Since: 3.0.0 */ param_spec = g_param_spec_object("port", i18n_pspec("port to apply"), i18n_pspec("The port to apply"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); /** * AgsLineMember:port-data: * * The port data to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port-data", i18n_pspec("port data"), i18n_pspec("The port data"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_DATA, param_spec); /** * AgsLineMember:recall-port: * * The matching complex port of plugin name and specifier. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-port", i18n_pspec("recall port to apply"), i18n_pspec("The recall port to apply"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_PORT, param_spec); /** * AgsLineMember:recall-port-data: * * The complex port data to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-port-data", i18n_pspec("recall port data"), i18n_pspec("The recall port data"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_PORT_DATA, param_spec); /** * AgsLineMember:task-type: * * The task type to apply the port. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("task-type", i18n_pspec("task type to apply"), i18n_pspec("The task type to apply the port"), 0, G_MAXULONG, G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TASK_TYPE, param_spec); /* AgsLineMember */ line_member->change_port = ags_line_member_real_change_port; line_member->find_port = ags_line_member_real_find_port; /* signals */ /** * AgsLineMember::change-port: * @line_member: the #AgsLineMember * @port_data: the port's data * * The ::change-port signal notifies modified port. * * Since: 3.0.0 */ line_member_signals[CHANGE_PORT] = g_signal_new("change-port", G_TYPE_FROM_CLASS(line_member), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineMemberClass, change_port), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsLine_Member::find-port: * @line_member: the #AgsLineMember to resize * * The ::find-port retrieves all associated ports * * Returns: a #GList-struct with associated ports * * Since: 3.0.0 */ line_member_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(line_member), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineMemberClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); } void ags_line_member_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_line_member_connect; connectable->disconnect = ags_line_member_disconnect; } void ags_line_member_init(AgsLineMember *line_member) { AgsDial *dial; AgsConfig *config; gchar *str; g_signal_connect_after((GObject *) line_member, "parent_set", G_CALLBACK(ags_line_member_parent_set_callback), (gpointer) line_member); line_member->flags = (AGS_LINE_MEMBER_RESET_BY_ATOMIC | AGS_LINE_MEMBER_APPLY_RECALL); line_member->port_flags = 0; config = ags_config_get_instance(); line_member->widget_type = AGS_TYPE_DIAL; dial = (AgsDial *) g_object_new(AGS_TYPE_DIAL, "adjustment", gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0), NULL); str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gdouble gui_scale_factor; gui_scale_factor = g_ascii_strtod(str, NULL); g_object_set(dial, "radius", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_RADIUS), "font-size", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_FONT_SIZE), "button-width", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_WIDTH), "button-height", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_HEIGHT), NULL); g_free(str); } gtk_container_add(GTK_CONTAINER(line_member), (GtkWidget *) dial); line_member->widget_label = NULL; line_member->filename = NULL; line_member->effect = NULL; line_member->plugin_name = NULL; line_member->specifier = NULL; line_member->control_port = NULL; line_member->scale_precision = AGS_DIAL_DEFAULT_PRECISION; line_member->step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; line_member->conversion = NULL; line_member->port = NULL; line_member->port_data = NULL; line_member->active = FALSE; line_member->recall_port = NULL; line_member->recall_port_data = NULL; line_member->recall_active = FALSE; line_member->task_type = G_TYPE_NONE; } void ags_line_member_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLineMember *line_member; line_member = AGS_LINE_MEMBER(gobject); switch(prop_id){ case PROP_WIDGET_TYPE: { GtkWidget *child, *new_child; GtkAdjustment *adjustment; AgsConfig *config; GType widget_type; gchar *str; gboolean active; //TODO:JK: verify me widget_type = g_value_get_ulong(value); if(widget_type == line_member->widget_type){ return; } child = gtk_bin_get_child(GTK_BIN(line_member)); /* preserver previous range */ adjustment = NULL; active = FALSE; if(GTK_IS_RANGE(child)){ adjustment = gtk_range_get_adjustment(GTK_RANGE(child)); }else if(GTK_IS_SPIN_BUTTON(child)){ adjustment = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(child)); }else if(AGS_IS_DIAL(child)){ adjustment = AGS_DIAL(child)->adjustment; }else if(GTK_IS_TOGGLE_BUTTON(child)){ active = gtk_toggle_button_get_active((GtkToggleButton *) child); } if(adjustment != NULL){ g_object_ref(adjustment); } /* destroy old */ if(child != NULL){ gtk_widget_destroy(child); } line_member->widget_type = widget_type; new_child = (GtkWidget *) g_object_new(widget_type, NULL); config = ags_config_get_instance(); str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gdouble gui_scale_factor; gui_scale_factor = g_ascii_strtod(str, NULL); if(AGS_IS_DIAL(new_child)){ g_object_set(new_child, "radius", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_RADIUS), "font-size", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_FONT_SIZE), "button-width", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_WIDTH), "button-height", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_HEIGHT), NULL); }else if(GTK_IS_VSCALE(new_child)){ gtk_widget_set_size_request(new_child, gui_scale_factor * 16, gui_scale_factor * 100); }else if(GTK_IS_HSCALE(new_child)){ gtk_widget_set_size_request(new_child, gui_scale_factor * 100, gui_scale_factor * 16); }else if(AGS_IS_VINDICATOR(new_child)){ g_object_set(new_child, "segment-width", (guint) (gui_scale_factor * AGS_VINDICATOR_DEFAULT_SEGMENT_WIDTH), "segment-height", (guint) (gui_scale_factor * AGS_VINDICATOR_DEFAULT_SEGMENT_HEIGHT), "segment-padding", (guint) (gui_scale_factor * AGS_INDICATOR_DEFAULT_SEGMENT_PADDING), NULL); }else if(AGS_IS_HINDICATOR(new_child)){ g_object_set(new_child, "segment-width", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH), "segment-height", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT), "segment-padding", (guint) (gui_scale_factor * AGS_INDICATOR_DEFAULT_SEGMENT_PADDING), NULL); } gtk_widget_queue_resize_no_redraw(new_child); gtk_widget_queue_draw(new_child); g_free(str); } /* set range */ if(GTK_IS_RANGE(new_child)){ GtkAdjustment *new_adjustment; new_adjustment = gtk_range_get_adjustment(GTK_RANGE(new_child)); gtk_adjustment_set_lower(new_adjustment, gtk_adjustment_get_lower(adjustment)); gtk_adjustment_set_upper(new_adjustment, gtk_adjustment_get_upper(adjustment)); gtk_adjustment_set_value(new_adjustment, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_SPIN_BUTTON(new_child)){ GtkAdjustment *new_adjustment; new_adjustment = gtk_spin_button_get_adjustment(GTK_RANGE(new_child)); gtk_adjustment_set_lower(new_adjustment, gtk_adjustment_get_lower(adjustment)); gtk_adjustment_set_upper(new_adjustment, gtk_adjustment_get_upper(adjustment)); gtk_adjustment_set_value(new_adjustment, gtk_adjustment_get_value(adjustment)); }else if(AGS_IS_DIAL(new_child)){ GtkAdjustment *new_adjustment; new_adjustment = AGS_DIAL(new_child)->adjustment; gtk_adjustment_set_lower(new_adjustment, gtk_adjustment_get_lower(adjustment)); gtk_adjustment_set_upper(new_adjustment, gtk_adjustment_get_upper(adjustment)); gtk_adjustment_set_value(new_adjustment, gtk_adjustment_get_value(adjustment)); gtk_widget_queue_draw((AgsDial *) new_child); }else if(GTK_IS_TOGGLE_BUTTON(new_child)){ gtk_toggle_button_set_active((GtkToggleButton *) new_child, active); }else{ if(!(AGS_IS_INDICATOR(new_child) || AGS_IS_LED(new_child))){ g_warning("ags_line_member_set_property() - unknown child type %s", g_type_name(widget_type)); } } /* add */ gtk_container_add(GTK_CONTAINER(line_member), new_child); } break; case PROP_WIDGET_LABEL: { gchar *label; label = g_value_get_string(value); if(label == line_member->widget_label){ return; } if(line_member->widget_label != NULL){ g_free(line_member->widget_label); } line_member->widget_label = g_strdup(label); ags_line_member_set_label(line_member, line_member->widget_label); } break; case PROP_PLUGIN_NAME: { gchar *plugin_name; plugin_name = g_value_get_string(value); if(plugin_name == line_member->plugin_name){ return; } line_member->plugin_name = g_strdup(plugin_name); } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(filename == line_member->filename){ return; } if(line_member->filename != NULL){ g_free(line_member->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) line_member); ags_window_show_error(window, g_strdup_printf("Plugin file not present %s", filename)); } } line_member->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == line_member->effect){ return; } line_member->effect = g_strdup(effect); } break; case PROP_SPECIFIER: { gchar *specifier; specifier = g_value_get_string(value); if(specifier == line_member->specifier){ return; } line_member->specifier = g_strdup(specifier); } break; case PROP_CONTROL_PORT: { gchar *control_port; control_port = g_value_get_string(value); if(control_port == line_member->control_port){ return; } line_member->control_port = g_strdup(control_port); } break; case PROP_SCALE_PRECISION: { GtkWidget *child; guint scale_precision; scale_precision = g_value_get_uint(value); line_member->scale_precision = scale_precision; child = gtk_bin_get_child(GTK_BIN(line_member)); if(AGS_IS_DIAL(child)){ g_object_set(child, "scale-precision", scale_precision, NULL); } } break; case PROP_STEP_COUNT: { GtkWidget *child; gdouble step_count; step_count = g_value_get_double(value); line_member->step_count = step_count; } break; case PROP_CONVERSION: { AgsConversion *conversion; conversion = g_value_get_object(value); if(conversion == line_member->conversion){ return; } if(line_member->conversion != NULL){ g_object_unref(line_member->conversion); } if(conversion != NULL){ g_object_ref(conversion); } line_member->conversion = conversion; } break; case PROP_PORT: { AgsPort *port; port = g_value_get_object(value); if(port == line_member->port){ return; } if(line_member->port != NULL){ g_object_unref(line_member->port); } if(port != NULL){ g_object_ref(port); if((AGS_PORT_INFINITE_RANGE & (port->flags)) != 0){ GtkWidget *child; child = gtk_bin_get_child(GTK_BIN(line_member)); //TODO:JK: add more types if(AGS_IS_DIAL(child)){ AGS_DIAL(child)->flags |= AGS_DIAL_SEEMLESS_MODE; } } } line_member->port = port; } break; case PROP_PORT_DATA: { gpointer port_data; port_data = g_value_get_pointer(value); if(port_data == line_member->port_data){ return; } line_member->port_data = port_data; } break; case PROP_RECALL_PORT: { AgsPort *port; port = g_value_get_object(value); if(port == line_member->recall_port){ return; } if(line_member->recall_port != NULL){ g_object_unref(line_member->recall_port); } if(port != NULL){ g_object_ref(port); } line_member->recall_port = port; } break; case PROP_RECALL_PORT_DATA: { gpointer port_data; port_data = g_value_get_pointer(value); if(port_data == line_member->recall_port_data){ return; } line_member->recall_port_data = port_data; } break; case PROP_TASK_TYPE: { GType type; type = g_value_get_ulong(value); if(line_member->task_type == type){ return; } line_member->task_type = type; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_line_member_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLineMember *line_member; line_member = AGS_LINE_MEMBER(gobject); switch(prop_id){ case PROP_WIDGET_TYPE: { g_value_set_ulong(value, line_member->widget_type); } break; case PROP_WIDGET_LABEL: { g_value_set_string(value, line_member->widget_label); } break; case PROP_PLUGIN_NAME: { g_value_set_string(value, line_member->plugin_name); } break; case PROP_FILENAME: { g_value_set_string(value, line_member->filename); } break; case PROP_EFFECT: { g_value_set_string(value, line_member->effect); } break; case PROP_SPECIFIER: { g_value_set_string(value, line_member->specifier); } break; case PROP_CONTROL_PORT: { g_value_set_string(value, line_member->control_port); } break; case PROP_SCALE_PRECISION: { g_value_set_uint(value, line_member->scale_precision); } break; case PROP_STEP_COUNT: { g_value_set_double(value, line_member->step_count); } break; case PROP_CONVERSION: { g_value_set_object(value, line_member->conversion); } break; case PROP_PORT: { g_value_set_object(value, line_member->port); } break; case PROP_PORT_DATA: { g_value_set_pointer(value, line_member->port_data); } break; case PROP_RECALL_PORT: { g_value_set_object(value, line_member->port); } break; case PROP_RECALL_PORT_DATA: { g_value_set_pointer(value, line_member->port_data); } break; case PROP_TASK_TYPE: { g_value_set_ulong(value, line_member->task_type); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_line_member_finalize(GObject *gobject) { AgsLineMember *line_member; line_member = (AgsLineMember *) gobject; g_free(line_member->widget_label); g_free(line_member->filename); g_free(line_member->effect); g_free(line_member->plugin_name); g_free(line_member->specifier); g_free(line_member->control_port); if(line_member->conversion != NULL){ g_object_unref(line_member->conversion); } if(line_member->port != NULL){ g_object_unref(line_member->port); } if(line_member->recall_port != NULL){ g_object_unref(line_member->recall_port); } /* call parent */ G_OBJECT_CLASS(ags_line_member_parent_class)->finalize(gobject); } void ags_line_member_connect(AgsConnectable *connectable) { AgsLineMember *line_member; GtkWidget *control; line_member = AGS_LINE_MEMBER(connectable); if((AGS_LINE_MEMBER_CONNECTED & (line_member->flags)) != 0){ return; } line_member->flags |= AGS_LINE_MEMBER_CONNECTED; ags_line_member_find_port(line_member); control = gtk_bin_get_child(GTK_BIN(line_member)); if((AGS_LINE_MEMBER_APPLY_INITIAL & (line_member->flags)) != 0){ GtkAdjustment *adjustment; gboolean is_toggled; adjustment = NULL; is_toggled = FALSE; if(AGS_IS_DIAL(control)){ adjustment = AGS_DIAL(control)->adjustment; }else if(GTK_IS_RANGE(control)){ adjustment = gtk_range_get_adjustment(GTK_RANGE(control)); }else if(GTK_IS_SPIN_BUTTON(control)){ adjustment = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(control)); }else if(GTK_IS_TOGGLE_BUTTON(control)){ line_member->active = gtk_toggle_button_get_active((GtkToggleButton *) control); is_toggled = TRUE; } if(is_toggled){ ags_line_member_change_port(line_member, &(line_member->active)); }else if(adjustment != NULL){ gdouble value; value = gtk_adjustment_get_value(adjustment); ags_line_member_change_port(line_member, &value); } line_member->flags &= (~AGS_LINE_MEMBER_APPLY_INITIAL); } /* widget callback */ if(line_member->widget_type == AGS_TYPE_DIAL){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_line_member_dial_changed_callback), line_member); }else if(line_member->widget_type == GTK_TYPE_VSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_line_member_vscale_changed_callback), line_member); }else if(line_member->widget_type == GTK_TYPE_HSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_line_member_hscale_changed_callback), line_member); }else if(line_member->widget_type == GTK_TYPE_SPIN_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_line_member_spin_button_changed_callback), line_member); }else if(line_member->widget_type == GTK_TYPE_CHECK_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_line_member_check_button_clicked_callback), line_member); }else if(line_member->widget_type == GTK_TYPE_TOGGLE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_line_member_toggle_button_clicked_callback), line_member); }else if(line_member->widget_type == GTK_TYPE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_line_member_button_clicked_callback), line_member); } } void ags_line_member_disconnect(AgsConnectable *connectable) { AgsLineMember *line_member; GtkWidget *control; line_member = AGS_LINE_MEMBER(connectable); if((AGS_LINE_MEMBER_CONNECTED & (line_member->flags)) == 0){ return; } line_member->flags &= (~AGS_LINE_MEMBER_CONNECTED); /* widget callback */ control = gtk_bin_get_child(GTK_BIN(line_member)); if(line_member->widget_type == AGS_TYPE_DIAL){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_line_member_dial_changed_callback), line_member, NULL); }else if(line_member->widget_type == GTK_TYPE_VSCALE){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_line_member_vscale_changed_callback), line_member, NULL); }else if(line_member->widget_type == GTK_TYPE_HSCALE){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_line_member_hscale_changed_callback), line_member, NULL); }else if(line_member->widget_type == GTK_TYPE_SPIN_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_line_member_spin_button_changed_callback), line_member, NULL); }else if(line_member->widget_type == GTK_TYPE_CHECK_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::clicked", G_CALLBACK(ags_line_member_check_button_clicked_callback), line_member, NULL); }else if(line_member->widget_type == GTK_TYPE_TOGGLE_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::clicked", G_CALLBACK(ags_line_member_toggle_button_clicked_callback), line_member, NULL); }else if(line_member->widget_type == GTK_TYPE_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::clicked", G_CALLBACK(ags_line_member_button_clicked_callback), line_member, NULL); } } GtkWidget* ags_line_member_get_widget(AgsLineMember *line_member) { return(gtk_bin_get_child(GTK_BIN(line_member))); } /** * ags_line_member_set_label: * @line_member: an #AgsLineMember * @label: the label of the control * * Modify the label of the line member. */ void ags_line_member_set_label(AgsLineMember *line_member, gchar *label) { GtkWidget *child_widget; if(g_type_is_a(line_member->widget_type, GTK_TYPE_BUTTON)){ child_widget = gtk_bin_get_child(GTK_BIN(line_member)); g_object_set(G_OBJECT(child_widget), "label", label, NULL); }else{ gtk_frame_set_label_widget((GtkFrame *) line_member, g_object_new(GTK_TYPE_LABEL, "wrap", FALSE, "use-markup", TRUE, "label", g_markup_printf_escaped("%s", label), NULL)); } line_member->widget_label = label; } void ags_line_member_real_change_port(AgsLineMember *line_member, gpointer port_data) { if((AGS_LINE_MEMBER_RESET_BY_ATOMIC & (line_member->flags)) != 0){ AgsPort *port; GRecMutex *port_mutex; GValue value = {0,}; port = line_member->port; if(port == NULL){ g_warning("ags_line_member_change_port() - no port available"); return; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* change */ g_rec_mutex_lock(port_mutex); if(!port->port_value_is_pointer){ if(port->port_value_type == G_TYPE_BOOLEAN){ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, ((gboolean *) port_data)[0]); }else if(port->port_value_type == G_TYPE_INT64){ g_value_init(&value, G_TYPE_INT64); g_value_set_int64(&value, ((gint *) port_data)[0]); }else if(port->port_value_type == G_TYPE_UINT64){ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, ((guint *) port_data)[0]); }else if(port->port_value_type == G_TYPE_FLOAT){ gdouble val; gfloat port_val; if(GTK_IS_TOGGLE_BUTTON(gtk_bin_get_child((GtkBin *) line_member))){ if(((gboolean *) port_data)[0]){ val = 1.0; }else{ val = 0.0; } }else{ val = ((gdouble *) port_data)[0]; } port_val = (gfloat) val; if(line_member->conversion != NULL){ gboolean success; success = FALSE; if(AGS_IS_DIAL(gtk_bin_get_child((GtkBin *) line_member))){ success = TRUE; }else if(GTK_IS_RANGE(gtk_bin_get_child((GtkBin *) line_member))){ success = TRUE; }else if(GTK_IS_SPIN_BUTTON(gtk_bin_get_child((GtkBin *) line_member))){ success = TRUE; }else{ g_warning("unsupported child type in conversion"); } if(success){ port_val = ags_conversion_convert(line_member->conversion, val, FALSE); } } g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gfloat) port_val); }else if(port->port_value_type == G_TYPE_DOUBLE){ gdouble val; gdouble port_val; if(GTK_IS_TOGGLE_BUTTON(gtk_bin_get_child((GtkBin *) line_member))){ if(((gboolean *) port_data)[0]){ val = 1.0; }else{ val = 0.0; } }else{ val = ((gdouble *) port_data)[0]; } port_val = val; if(line_member->conversion != NULL){ gdouble upper, lower, range, step; gdouble c_upper, c_lower, c_range; gboolean success; success = FALSE; if(AGS_IS_DIAL(gtk_bin_get_child((GtkBin *) line_member))){ success = TRUE; }else if(GTK_IS_RANGE(gtk_bin_get_child((GtkBin *) line_member))){ success = TRUE; }else if(GTK_IS_SPIN_BUTTON(gtk_bin_get_child((GtkBin *) line_member))){ success = TRUE; }else{ g_warning("unsupported child type in conversion"); } if(success){ port_val = ags_conversion_convert(line_member->conversion, val, FALSE); } } g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, port_val); } }else{ if(port->port_value_type == G_TYPE_OBJECT){ g_value_init(&value, G_TYPE_OBJECT); g_value_set_object(&value, port_data); }else{ if(port->port_value_type == G_TYPE_BOOLEAN || port->port_value_type == G_TYPE_INT64 || port->port_value_type == G_TYPE_UINT64 || port->port_value_type == G_TYPE_FLOAT || port->port_value_type == G_TYPE_DOUBLE || port->port_value_type == G_TYPE_POINTER){ g_value_init(&value, G_TYPE_POINTER); g_value_set_pointer(&value, port_data); } } } g_rec_mutex_unlock(port_mutex); ags_port_safe_write(line_member->port, &value); if((AGS_LINE_MEMBER_APPLY_RECALL & (line_member->flags)) != 0){ ags_port_safe_write(line_member->recall_port, &value); } } if((AGS_LINE_MEMBER_RESET_BY_TASK & (line_member->flags)) != 0){ AgsWindow *window; AgsTask *task; AgsApplicationContext *application_context; window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) line_member, AGS_TYPE_WINDOW); application_context = ags_application_context_get_instance(); task = (AgsTask *) g_object_new(line_member->task_type, line_member->control_port, port_data, NULL); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) task); } } /** * ags_line_change_port: * @line_member: an #AgsLineMember * @port_data: the port's value * * Is emitted as port's value is modified. * * Since: 3.0.0 */ void ags_line_member_change_port(AgsLineMember *line_member, gpointer port_data) { g_return_if_fail(AGS_IS_LINE_MEMBER(line_member)); g_object_ref((GObject *) line_member); g_signal_emit(G_OBJECT(line_member), line_member_signals[CHANGE_PORT], 0, port_data); g_object_unref((GObject *) line_member); } AgsPort* ags_line_member_find_specifier(GList *recall, gchar *specifier) { AgsPort *current_port; GList *start_port, *port; current_port = NULL; while(recall != NULL){ if(ags_recall_test_behaviour_flags(recall->data, AGS_SOUND_BEHAVIOUR_BULK_MODE)){ recall = recall->next; continue; } g_object_get(recall->data, "port", &start_port, NULL); port = ags_port_find_specifier(start_port, specifier); #ifdef AGS_DEBUG g_message("search port in %s", G_OBJECT_TYPE_NAME(recall->data)); #endif if(port != NULL){ current_port = port->data; } g_list_free_full(start_port, g_object_unref); if(current_port != NULL){ break; } /* iterate */ recall = recall->next; } return(current_port); } GList* ags_line_member_real_find_port(AgsLineMember *line_member) { AgsMachine *machine; GtkWidget *parent; AgsAudio *audio; AgsChannel *channel; AgsPort *audio_port, *channel_port; AgsPort *recall_audio_port, *recall_channel_port; GList *recall; GList *port; GList *list_start; gchar *specifier; if(!AGS_IS_LINE_MEMBER(line_member)){ return(NULL); } specifier = line_member->specifier; if(specifier == NULL){ return(NULL); } machine = (AgsMachine *) gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_MACHINE); parent = gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_LINE); audio = machine->audio; if(parent != NULL){ channel = AGS_LINE(parent)->channel; }else{ parent = gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_EFFECT_LINE); if(parent != NULL){ channel = AGS_EFFECT_LINE(parent)->channel; }else{ return(NULL); } } audio_port = NULL; channel_port = NULL; recall_audio_port = NULL; recall_channel_port = NULL; port = NULL; /* play context */ g_object_get(channel, "play", &list_start, NULL); channel_port = ags_line_member_find_specifier(list_start, specifier); g_list_free_full(list_start, g_object_unref); /* recall context */ g_object_get(channel, "recall", &list_start, NULL); recall_channel_port = ags_line_member_find_specifier(list_start, specifier); g_list_free_full(list_start, g_object_unref); if(channel_port != NULL){ port = g_list_prepend(port, channel_port); } if(recall_channel_port != NULL){ port = g_list_prepend(port, recall_channel_port); } /* search audio */ if(channel_port == NULL && recall_channel_port == NULL){ GList *list_start; /* play context */ g_object_get(audio, "play", &list_start, NULL); audio_port = ags_line_member_find_specifier(list_start, specifier); g_list_free_full(list_start, g_object_unref); /* recall context */ g_object_get(audio, "recall", &list_start, NULL); recall_audio_port = ags_line_member_find_specifier(list_start, specifier); g_list_free_full(list_start, g_object_unref); if(audio_port != NULL){ port = g_list_prepend(port, audio_port); } if(recall_audio_port != NULL){ port = g_list_prepend(port, recall_audio_port); } } if(channel_port != NULL || recall_channel_port != NULL){ g_object_set(G_OBJECT(line_member), "port", channel_port, NULL); g_object_set(G_OBJECT(line_member), "recall-port", recall_channel_port, NULL); }else if(audio_port != NULL || recall_audio_port != NULL){ g_object_set(G_OBJECT(line_member), "port", audio_port, NULL); g_object_set(G_OBJECT(line_member), "recall-port", recall_audio_port, NULL); } return(port); } /** * ags_line_member_find_port: * @line_member: an #AgsLineMember * * Lookup ports of assigned recalls. * * Returns: a #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ GList* ags_line_member_find_port(AgsLineMember *line_member) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_LINE_MEMBER(line_member), NULL); g_object_ref((GObject *) line_member); g_signal_emit((GObject *) line_member, line_member_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) line_member); return(list); } /** * ags_line_member_chained_event: * @line_member: an #AgsLineMember * * Chain changed control and apply the very same value to grouped * controls if sticky controls set. * * Since: 3.0.0 */ void ags_line_member_chained_event(AgsLineMember *line_member) { AgsMachine *machine; if(!AGS_IS_LINE_MEMBER(line_member) || (AGS_LINE_MEMBER_BLOCK_CHAINED & (line_member->flags)) != 0){ return; } machine = (AgsMachine *) gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_MACHINE); if((AGS_MACHINE_STICKY_CONTROLS & (machine->flags)) != 0){ AgsPad *pad; AgsEffectPad *effect_pad; GtkWidget *child_widget; GtkAdjustment *adjustment; gboolean is_active; pad = (AgsPad *) gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_PAD); effect_pad = (AgsEffectPad *) gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_EFFECT_PAD); is_active = FALSE; child_widget = gtk_bin_get_child((GtkBin *) line_member); if(AGS_IS_DIAL(child_widget) || GTK_IS_SPIN_BUTTON(child_widget) || GTK_IS_SCALE(child_widget)){ g_object_get(gtk_bin_get_child((GtkBin *) line_member), "adjustment", &adjustment, NULL); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ is_active = gtk_toggle_button_get_active((GtkToggleButton *) gtk_bin_get_child(GTK_BIN(line_member))); } if(pad != NULL){ AgsLine *line; GList *list_line, *list_line_start; GList *list_line_member, *list_line_member_start; line = (AgsLine *) gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_LINE); list_line = list_line_start = gtk_container_get_children(GTK_CONTAINER(pad->expander_set)); while((list_line = ags_line_find_next_grouped(list_line)) != NULL){ if(list_line->data != line){ list_line_member = list_line_member_start = gtk_container_get_children((GtkContainer *) AGS_LINE(list_line->data)->expander->table); while(list_line_member != NULL){ if(!g_strcmp0(line_member->specifier, AGS_LINE_MEMBER(list_line_member->data)->specifier)){ AGS_LINE_MEMBER(list_line_member->data)->flags |= AGS_LINE_MEMBER_BLOCK_CHAINED; child_widget = gtk_bin_get_child(GTK_BIN(list_line_member->data)); if(AGS_IS_DIAL(child_widget)){ ags_dial_set_value((AgsDial *) child_widget, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ gtk_spin_button_set_value((GtkSpinButton *) child_widget, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_SCALE(child_widget)){ gtk_range_set_value((GtkRange *) child_widget, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, is_active); }else if(GTK_IS_BUTTON(child_widget)){ gtk_button_clicked((GtkButton *) child_widget); } AGS_LINE_MEMBER(list_line_member->data)->flags &= (~AGS_LINE_MEMBER_BLOCK_CHAINED); break; } list_line_member = list_line_member->next; } g_list_free(list_line_member_start); } list_line = list_line->next; } g_list_free(list_line_start); }else if(effect_pad != NULL){ AgsEffectLine *effect_line; GList *list_effect_line, *list_effect_line_start; GList *list_line_member, *list_line_member_start; effect_line = (AgsEffectLine *) gtk_widget_get_ancestor(GTK_WIDGET(line_member), AGS_TYPE_EFFECT_LINE); list_effect_line = list_effect_line_start = gtk_container_get_children(GTK_CONTAINER(effect_pad->table)); while((list_effect_line = ags_effect_line_find_next_grouped(list_effect_line)) != NULL){ if(list_effect_line->data != effect_line){ list_line_member = list_line_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_LINE(list_effect_line->data)->table); while(list_line_member != NULL){ if(!g_strcmp0(line_member->specifier, AGS_LINE_MEMBER(list_line_member->data)->specifier)){ AGS_LINE_MEMBER(list_line_member->data)->flags |= AGS_LINE_MEMBER_BLOCK_CHAINED; child_widget = gtk_bin_get_child(GTK_BIN(list_line_member->data)); if(AGS_IS_DIAL(child_widget)){ ags_dial_set_value((AgsDial *) child_widget, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ gtk_spin_button_set_value((GtkSpinButton *) child_widget, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_SCALE(child_widget)){ gtk_range_set_value((GtkRange *) child_widget, gtk_adjustment_get_value(adjustment)); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, is_active); }else if(GTK_IS_BUTTON(child_widget)){ gtk_button_clicked((GtkButton *) child_widget); } AGS_LINE_MEMBER(list_line_member->data)->flags &= (~AGS_LINE_MEMBER_BLOCK_CHAINED); break; } list_line_member = list_line_member->next; } g_list_free(list_line_member_start); } list_effect_line = list_effect_line->next; } g_list_free(list_effect_line_start); } } } /** * ags_line_member_new: * * Create a new instance of #AgsLineMember * * Returns: the new #AgsLineMember * * Since: 3.0.0 */ AgsLineMember* ags_line_member_new() { AgsLineMember *line_member; line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, NULL); return(line_member); } gsequencer-3.1.3/ags/X/ags_export_window_callbacks.h0000644000175000017500000000303113607210263017470 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPORT_WINDOW_CALLBACKS_H__ #define __AGS_EXPORT_WINDOW_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_export_window_add_export_soundcard_callback(GtkWidget *button, AgsExportWindow *export_window); void ags_export_window_remove_export_soundcard_callback(GtkWidget *button, AgsExportWindow *export_window); void ags_export_window_tact_callback(GtkWidget *spin_button, AgsExportWindow *export_window); void ags_export_window_export_callback(GtkWidget *toggle_button, AgsExportWindow *export_window); G_END_DECLS #endif /*__AGS_EXPORT_WINDOW_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_effect_pad_callbacks.c0000644000175000017500000000145613605312646016652 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/ags_link_editor.h0000644000175000017500000000440713607210263015074 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINK_EDITOR_H__ #define __AGS_LINK_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINK_EDITOR (ags_link_editor_get_type()) #define AGS_LINK_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_LINK_EDITOR, AgsLinkEditor)) #define AGS_LINK_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_LINK_EDITOR, AgsLinkEditorClass)) #define AGS_IS_LINK_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LINK_EDITOR)) #define AGS_IS_LINK_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LINK_EDITOR)) #define AGS_LINK_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LINK_EDITOR, AgsLinkEditorClass)) typedef struct _AgsLinkEditor AgsLinkEditor; typedef struct _AgsLinkEditorClass AgsLinkEditorClass; typedef enum{ AGS_LINK_EDITOR_CONNECTED = 1, AGS_LINK_EDITOR_FILE_CHOOSER_PLAY_DONE = 1 << 1, AGS_LINK_EDITOR_BLOCK_FILE_CHOOSER = 1 << 2, }AgsLinkEditorFlags; struct _AgsLinkEditor { GtkHBox hbox; guint flags; GtkComboBox *combo; GtkSpinButton *spin_button; AgsAudioFile *audio_file; GtkFileChooserDialog *file_chooser; }; struct _AgsLinkEditorClass { GtkHBoxClass hbox; }; GType ags_link_editor_get_type(void); AgsLinkEditor* ags_link_editor_new(); G_END_DECLS #endif /*__AGS_LINK_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_navigation.h0000644000175000017500000000714413607210263014731 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NAVIGATION_H__ #define __AGS_NAVIGATION_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NAVIGATION (ags_navigation_get_type()) #define AGS_NAVIGATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NAVIGATION, AgsNavigation)) #define AGS_NAVIGATION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NAVIGATION, AgsNavigationClass)) #define AGS_IS_NAVIGATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_NAVIGATION)) #define AGS_IS_NAVIGATION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_NAVIGATION)) #define AGS_NAVIGATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_NAVIGATION, AgsNavigationClass)) #define AGS_NAVIGATION_DEFAULT_TACT_STEP (1.0) #define AGS_NAVIGATION_SEEK_STEPS (1.0) #define AGS_NAVIGATION_REWIND_STEPS (4.0) typedef struct _AgsNavigation AgsNavigation; typedef struct _AgsNavigationClass AgsNavigationClass; typedef enum{ AGS_NAVIGATION_CONNECTED = 1, AGS_NAVIGATION_BLOCK_TACT = 1 << 1, AGS_NAVIGATION_BLOCK_PLAY = 1 << 2, AGS_NAVIGATION_BLOCK_TIC = 1 << 3, }AgsNavigationFlags; struct _AgsNavigation { GtkVBox vbox; guint flags; GObject *soundcard; gdouble start_tact; gdouble note_offset; GtkToggleButton *expander; GtkSpinButton *bpm; gdouble current_bpm; GtkToggleButton *rewind; GtkButton *previous; GtkToggleButton *play; GtkButton *stop; GtkButton *next; GtkToggleButton *forward; GtkCheckButton *loop; GtkLabel *position_time; GtkSpinButton *position_tact; GtkLabel *duration_time; GtkSpinButton *duration_tact; GtkSpinButton *loop_left_tact; GtkSpinButton *loop_right_tact; GtkCheckButton *scroll; GtkCheckButton *exclude_sequencer; }; struct _AgsNavigationClass { GtkVBoxClass vbox; void (*change_position)(AgsNavigation *navigation, gdouble tact); }; GType ags_navigation_get_type(void); gchar* ags_navigation_tact_to_time_string(gdouble tact, gdouble bpm, gdouble delay_factor); gchar* ags_navigation_relative_tact_to_time_string(gchar *timestr, gdouble delay, gdouble bpm, gdouble delay_factor); gchar* ags_navigation_absolute_tact_to_time_string(gdouble tact, gdouble bpm, gdouble delay_factor); void ags_navigation_update_time_string(double tact, gdouble bpm, gdouble delay_factor, gchar *time_string); void ags_navigation_set_seeking_sensitive(AgsNavigation *navigation, gboolean enabled); void ags_navigation_change_position(AgsNavigation *navigation, gdouble tact); gboolean ags_navigation_duration_time_queue_draw(GtkWidget *widget); AgsNavigation* ags_navigation_new(); G_END_DECLS #endif /*__AGS_NAVIGATION_H__*/ gsequencer-3.1.3/ags/X/editor/0000755000175000017500000000000013622252262013131 500000000000000gsequencer-3.1.3/ags/X/editor/ags_wave_edit_box.h0000644000175000017500000000420113607210263016666 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EDIT_BOX_H__ #define __AGS_WAVE_EDIT_BOX_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_EDIT_BOX (ags_wave_edit_box_get_type()) #define AGS_WAVE_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_EDIT_BOX, AgsWaveEditBox)) #define AGS_WAVE_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_EDIT_BOX, AgsWaveEditBoxClass)) #define AGS_IS_WAVE_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE_EDIT_BOX)) #define AGS_IS_WAVE_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE_EDIT_BOX)) #define AGS_WAVE_EDIT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_WAVE_EDIT_BOX, AgsWaveEditBoxClass)) #define AGS_WAVE_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT (128) typedef struct _AgsWaveEditBox AgsWaveEditBox; typedef struct _AgsWaveEditBoxClass AgsWaveEditBoxClass; typedef enum{ AGS_WAVE_EDIT_BOX_FIXED_EDIT_SIZE = 1, }AgsWaveEditBoxFlags; struct _AgsWaveEditBox { GtkBox box; guint flags; guint fixed_edit_height; }; struct _AgsWaveEditBoxClass { GtkBoxClass box; }; GType ags_wave_edit_box_get_type(void); AgsWaveEditBox* ags_wave_edit_box_new(); G_END_DECLS #endif /*__AGS_WAVE_EDIT_BOX_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_edit_callbacks.h0000644000175000017500000000426313607210263020716 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_EDIT_CALLBACKS_H__ #define __AGS_NOTATION_EDIT_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_notation_edit_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsNotationEdit *notation_edit); gboolean ags_notation_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsNotationEdit *notation_edit); gboolean ags_notation_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsNotationEdit *notation_edit); gboolean ags_notation_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsNotationEdit *notation_edit); gboolean ags_notation_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsNotationEdit *notation_edit); gboolean ags_notation_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsNotationEdit *notation_edit); gboolean ags_notation_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsNotationEdit *notation_edit); void ags_notation_edit_vscrollbar_value_changed(GtkRange *range, AgsNotationEdit *notation_edit); void ags_notation_edit_hscrollbar_value_changed(GtkRange *range, AgsNotationEdit *notation_edit); G_END_DECLS #endif /*__AGS_NOTATION_EDIT_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_meta_callbacks.h0000644000175000017500000000246213616617253021255 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_META_CALLBACKS_H__ #define __AGS_AUTOMATION_META_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_automation_meta_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsAutomationMeta *automation_meta); G_END_DECLS #endif /*__AGS_AUTOMATION_META_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_sheet_edit.h0000644000175000017500000000576613607210263016205 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_EDIT_H__ #define __AGS_SHEET_EDIT_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SHEET_EDIT (ags_sheet_edit_get_type ()) #define AGS_SHEET_EDIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SHEET_EDIT, AgsSheetEdit)) #define AGS_SHEET_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SHEET_EDIT, AgsSheetEditClass)) #define AGS_IS_SHEET_EDIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SHEET_EDIT)) #define AGS_IS_SHEET_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SHEET_EDIT)) #define AGS_SHEET_EDIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SHEET_EDIT, AgsSheetEditClass)) #define AGS_SHEET_EDIT_DEFAULT_CURSOR_POSITION_X (0) #define AGS_SHEET_EDIT_DEFAULT_CURSOR_POSITION_Y (0) #define AGS_SHEET_EDIT_DEFAULT_FADER_WIDTH (3) typedef struct _AgsSheetEdit AgsSheetEdit; typedef struct _AgsSheetEditClass AgsSheetEditClass; typedef enum{ AGS_SHEET_EDIT_CONNECTED = 1, AGS_SHEET_EDIT_AUTO_SCROLL = 1 << 1, }AgsSheetEditFlags; typedef enum{ AGS_SHEET_EDIT_NO_EDIT_MODE, AGS_SHEET_EDIT_POSITION_CURSOR, AGS_SHEET_EDIT_ADD_NOTE, AGS_SHEET_EDIT_DELETE_NOTE, AGS_SHEET_EDIT_SELECT_NOTE, }AgsSheetEditMode; typedef enum{ AGS_SHEET_EDIT_BUTTON_1 = 1, }AgsSheetEditButtonMask; typedef enum{ AGS_SHEET_EDIT_KEY_L_CONTROL = 1, AGS_SHEET_EDIT_KEY_R_CONTROL = 1 << 1, AGS_SHEET_EDIT_KEY_L_SHIFT = 1 << 2, AGS_SHEET_EDIT_KEY_R_SHIFT = 1 << 3, }AgsSheetEditKeyMask; struct _AgsSheetEdit { GtkTable table; guint flags; guint mode; guint button_mask; guint key_mask; guint note_offset; guint note_offset_absolute; guint cursor_position_x; guint cursor_position_y; guint selection_x0; guint selection_x1; guint selection_y0; guint selection_y1; GtkDrawingArea *drawing_area; }; struct _AgsSheetEditClass { GtkTableClass table; }; GType ags_sheet_edit_get_type(void); void ags_sheet_edit_draw(AgsSheetEdit *sheet_edit); AgsSheetEdit* ags_sheet_edit_new(); G_END_DECLS #endif /*__AGS_SHEET_EDIT_H__*/ gsequencer-3.1.3/ags/X/editor/ags_sheet_edit_callbacks.c0000644000175000017500000001272713607210263020172 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include gboolean ags_sheet_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsSheetEdit *sheet_edit) { ags_sheet_edit_draw(sheet_edit); return(FALSE); } gboolean ags_sheet_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsSheetEdit *sheet_edit) { AgsSheetEditor *sheet_editor; AgsSheetToolbar *sheet_toolbar; sheet_editor = (AgsSheetEditor *) gtk_widget_get_ancestor(GTK_WIDGET(sheet_edit), AGS_TYPE_SHEET_EDITOR); sheet_toolbar = sheet_editor->sheet_toolbar; gtk_widget_grab_focus((GtkWidget *) sheet_edit->drawing_area); //TODO:JK: implement me return(TRUE); } gboolean ags_sheet_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsSheetEdit *sheet_edit) { AgsSheetEditor *sheet_editor; AgsSheetToolbar *sheet_toolbar; sheet_editor = (AgsSheetEditor *) gtk_widget_get_ancestor(GTK_WIDGET(sheet_edit), AGS_TYPE_SHEET_EDITOR); sheet_toolbar = sheet_editor->sheet_toolbar; //TODO:JK: implement me return(FALSE); } gboolean ags_sheet_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsSheetEdit *sheet_edit) { AgsSheetEditor *sheet_editor; AgsSheetToolbar *sheet_toolbar; sheet_editor = (AgsSheetEditor *) gtk_widget_get_ancestor(GTK_WIDGET(sheet_edit), AGS_TYPE_SHEET_EDITOR); sheet_toolbar = sheet_editor->sheet_toolbar; //TODO:JK: implement me return(FALSE); } gboolean ags_sheet_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsSheetEdit *sheet_edit) { AgsSheetEditor *sheet_editor; AgsMachine *machine; gboolean retval; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } sheet_editor = (AgsSheetEditor *) gtk_widget_get_ancestor(GTK_WIDGET(sheet_edit), AGS_TYPE_SHEET_EDITOR); machine = sheet_editor->selected_machine; if(machine != NULL){ switch(event->keyval){ case GDK_KEY_Control_L: { sheet_edit->key_mask |= AGS_SHEET_EDIT_KEY_L_CONTROL; } break; case GDK_KEY_Control_R: { sheet_edit->key_mask |= AGS_SHEET_EDIT_KEY_R_CONTROL; } break; case GDK_KEY_Shift_L: { sheet_edit->key_mask |= AGS_SHEET_EDIT_KEY_L_SHIFT; } break; case GDK_KEY_Shift_R: { sheet_edit->key_mask |= AGS_SHEET_EDIT_KEY_R_SHIFT; } break; case GDK_KEY_a: { /* select all notes */ if((AGS_SHEET_EDIT_KEY_L_CONTROL & (sheet_edit->key_mask)) != 0 || (AGS_SHEET_EDIT_KEY_R_CONTROL & (sheet_edit->key_mask)) != 0){ ags_sheet_editor_select_all(sheet_editor); } } break; case GDK_KEY_c: { /* copy notes */ if((AGS_SHEET_EDIT_KEY_L_CONTROL & (sheet_edit->key_mask)) != 0 || (AGS_SHEET_EDIT_KEY_R_CONTROL & (sheet_edit->key_mask)) != 0){ ags_sheet_editor_copy(sheet_editor); } } break; case GDK_KEY_v: { /* paste notes */ if((AGS_SHEET_EDIT_KEY_L_CONTROL & (sheet_edit->key_mask)) != 0 || (AGS_SHEET_EDIT_KEY_R_CONTROL & (sheet_edit->key_mask)) != 0){ ags_sheet_editor_paste(sheet_editor); } } break; case GDK_KEY_x: { /* cut notes */ if((AGS_SHEET_EDIT_KEY_L_CONTROL & (sheet_edit->key_mask)) != 0 || (AGS_SHEET_EDIT_KEY_R_CONTROL & (sheet_edit->key_mask)) != 0){ ags_sheet_editor_cut(sheet_editor); } } break; } } return(retval); } gboolean ags_sheet_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsSheetEdit *sheet_edit) { AgsSheetEditor *sheet_editor; AgsSheetToolbar *sheet_toolbar; AgsMachine *machine; gboolean retval; sheet_editor = (AgsSheetEditor *) gtk_widget_get_ancestor(GTK_WIDGET(sheet_edit), AGS_TYPE_SHEET_EDITOR); sheet_toolbar = sheet_editor->sheet_toolbar; machine = sheet_editor->selected_machine; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } //TODO:JK: implement me return(retval); } gsequencer-3.1.3/ags/X/editor/ags_wave_edit_box.c0000644000175000017500000001246613607210263016675 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_wave_edit_box_class_init(AgsWaveEditBoxClass *wave_edit_box); void ags_wave_edit_box_init(AgsWaveEditBox *wave_edit_box); void ags_wave_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_edit_box_finalize(GObject *gobject); GType ags_wave_edit_box_child_type(GtkContainer *container); /** * SECTION:ags_wave_edit_box * @short_description: abstract box widget * @title: AgsWaveEditBox * @section_id: * @include: ags/widget/ags_wave_edit_box.h * * The #AgsWaveEditBox is an abstract box widget containing #AgsWaveEdit. */ enum{ PROP_0, PROP_FIXED_EDIT_WIDTH, PROP_FIXED_EDIT_HEIGHT, }; static gpointer ags_wave_edit_box_parent_class = NULL; GType ags_wave_edit_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_edit_box = 0; static const GTypeInfo ags_wave_edit_box_info = { sizeof (AgsWaveEditBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_edit_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveEditBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_edit_box_init, }; ags_type_wave_edit_box = g_type_register_static(GTK_TYPE_BOX, "AgsWaveEditBox", &ags_wave_edit_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_edit_box); } return g_define_type_id__volatile; } void ags_wave_edit_box_class_init(AgsWaveEditBoxClass *wave_edit_box) { GObjectClass *gobject; GtkContainerClass *container; GParamSpec *param_spec; ags_wave_edit_box_parent_class = g_type_class_peek_parent(wave_edit_box); /* GObjectClass */ gobject = (GObjectClass *) wave_edit_box; gobject->set_property = ags_wave_edit_box_set_property; gobject->get_property = ags_wave_edit_box_get_property; gobject->finalize = ags_wave_edit_box_finalize; /* properties */ /** * AgsWaveEditBox:fixed-edit-height: * * The fixed height of a edit. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fixed-edit-height", "fixed edit height", "The fixed height of a edit", 0, G_MAXUINT, AGS_WAVE_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_EDIT_HEIGHT, param_spec); /* GtkContainerClass */ container = (GtkContainerClass *) wave_edit_box; container->child_type = ags_wave_edit_box_child_type; } void ags_wave_edit_box_init(AgsWaveEditBox *wave_edit_box) { g_object_set(wave_edit_box, "homogeneous", FALSE, "spacing", 0, NULL); wave_edit_box->flags = 0; wave_edit_box->fixed_edit_height = AGS_WAVE_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT; } void ags_wave_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWaveEditBox *wave_edit_box; wave_edit_box = AGS_WAVE_EDIT_BOX(gobject); switch(prop_id){ case PROP_FIXED_EDIT_HEIGHT: { wave_edit_box->fixed_edit_height = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWaveEditBox *wave_edit_box; wave_edit_box = AGS_WAVE_EDIT_BOX(gobject); switch(prop_id){ case PROP_FIXED_EDIT_HEIGHT: { g_value_set_uint(value, wave_edit_box->fixed_edit_height); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_edit_box_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_wave_edit_box_parent_class)->finalize(gobject); } GType ags_wave_edit_box_child_type(GtkContainer *container) { return(AGS_TYPE_WAVE_EDIT); } /** * ags_wave_edit_box_new: * * Create a new instance of #AgsWaveEditBox. * * Returns: the new #AgsWaveEditBox instance * * Since: 3.0.0 */ AgsWaveEditBox* ags_wave_edit_box_new() { AgsWaveEditBox *wave_edit_box; wave_edit_box = (AgsWaveEditBox *) g_object_new(AGS_TYPE_WAVE_EDIT_BOX, NULL); return(wave_edit_box); } gsequencer-3.1.3/ags/X/editor/ags_sheet_toolbar_callbacks.c0000644000175000017500000000300613605312646020703 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_sheet_toolbar_position_callback(GtkToggleToolButton *toggle_button, AgsSheetToolbar *sheet_toolbar) { //TODO:JK: implement me } void ags_sheet_toolbar_clear_callback(GtkToggleToolButton *toggle_button, AgsSheetToolbar *sheet_toolbar) { //TODO:JK: implement me } void ags_sheet_toolbar_select_callback(GtkToggleToolButton *toggle_button, AgsSheetToolbar *sheet_toolbar) { //TODO:JK: implement me } void ags_sheet_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsSheetToolbar *sheet_toolbar) { //TODO:JK: implement me } void ags_sheet_toolbar_paste_callback(GtkWidget *widget, AgsSheetToolbar *sheet_toolbar) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/editor/ags_ramp_acceleration_dialog.c0000644000175000017500000010217613607210263021043 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_ramp_acceleration_dialog_class_init(AgsRampAccelerationDialogClass *ramp_acceleration_dialog); void ags_ramp_acceleration_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ramp_acceleration_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_ramp_acceleration_dialog_init(AgsRampAccelerationDialog *ramp_acceleration_dialog); void ags_ramp_acceleration_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ramp_acceleration_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ramp_acceleration_dialog_finalize(GObject *gobject); void ags_ramp_acceleration_dialog_connect(AgsConnectable *connectable); void ags_ramp_acceleration_dialog_disconnect(AgsConnectable *connectable); void ags_ramp_acceleration_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_ramp_acceleration_dialog_apply(AgsApplicable *applicable); void ags_ramp_acceleration_dialog_reset(AgsApplicable *applicable); gboolean ags_ramp_acceleration_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_ramp_acceleration_dialog * @short_description: ramp tool * @title: AgsRampAccelerationDialog * @section_id: * @include: ags/X/editor/ags_ramp_acceleration_dialog.h * * The #AgsRampAccelerationDialog lets you ramp accelerations. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_ramp_acceleration_dialog_parent_class = NULL; GType ags_ramp_acceleration_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ramp_acceleration_dialog = 0; static const GTypeInfo ags_ramp_acceleration_dialog_info = { sizeof (AgsRampAccelerationDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ramp_acceleration_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRampAccelerationDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ramp_acceleration_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ramp_acceleration_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_ramp_acceleration_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ramp_acceleration_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsRampAccelerationDialog", &ags_ramp_acceleration_dialog_info, 0); g_type_add_interface_static(ags_type_ramp_acceleration_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_ramp_acceleration_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ramp_acceleration_dialog); } return g_define_type_id__volatile; } void ags_ramp_acceleration_dialog_class_init(AgsRampAccelerationDialogClass *ramp_acceleration_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_ramp_acceleration_dialog_parent_class = g_type_class_peek_parent(ramp_acceleration_dialog); /* GObjectClass */ gobject = (GObjectClass *) ramp_acceleration_dialog; gobject->set_property = ags_ramp_acceleration_dialog_set_property; gobject->get_property = ags_ramp_acceleration_dialog_get_property; gobject->finalize = ags_ramp_acceleration_dialog_finalize; /* properties */ /** * AgsRampAccelerationDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) ramp_acceleration_dialog; widget->delete_event = ags_ramp_acceleration_dialog_delete_event; } void ags_ramp_acceleration_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ramp_acceleration_dialog_connect; connectable->disconnect = ags_ramp_acceleration_dialog_disconnect; } void ags_ramp_acceleration_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_ramp_acceleration_dialog_set_update; applicable->apply = ags_ramp_acceleration_dialog_apply; applicable->reset = ags_ramp_acceleration_dialog_reset; } void ags_ramp_acceleration_dialog_init(AgsRampAccelerationDialog *ramp_acceleration_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; ramp_acceleration_dialog->flags = 0; g_object_set(ramp_acceleration_dialog, "title", i18n("ramp accelerations"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(ramp_acceleration_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* automation */ ramp_acceleration_dialog->port = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(ramp_acceleration_dialog->port), FALSE, FALSE, 0); /* ramp x0 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* ramp x0 - label */ label = (GtkLabel *) gtk_label_new(i18n("ramp x0")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* ramp x0 - spin button */ ramp_acceleration_dialog->ramp_x0 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_RAMP_ACCELERATION_MAX_BEATS, 0.25); gtk_spin_button_set_digits(ramp_acceleration_dialog->ramp_x0, 2); gtk_spin_button_set_value(ramp_acceleration_dialog->ramp_x0, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(ramp_acceleration_dialog->ramp_x0), FALSE, FALSE, 0); /* ramp y0 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* ramp y0 - label */ label = (GtkLabel *) gtk_label_new(i18n("ramp y0")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* ramp y0 - spin button */ ramp_acceleration_dialog->ramp_y0 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.001); gtk_spin_button_set_value(ramp_acceleration_dialog->ramp_y0, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(ramp_acceleration_dialog->ramp_y0), FALSE, FALSE, 0); /* ramp x1 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* ramp x1 - label */ label = (GtkLabel *) gtk_label_new(i18n("ramp x1")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* ramp x1 - spin button */ ramp_acceleration_dialog->ramp_x1 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_RAMP_ACCELERATION_MAX_BEATS, 0.25); gtk_spin_button_set_digits(ramp_acceleration_dialog->ramp_x1, 2); gtk_spin_button_set_value(ramp_acceleration_dialog->ramp_x1, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(ramp_acceleration_dialog->ramp_x1), FALSE, FALSE, 0); /* ramp y1 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* ramp y1 - label */ label = (GtkLabel *) gtk_label_new(i18n("ramp y1")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* ramp y1 - spin button */ ramp_acceleration_dialog->ramp_y1 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.001); gtk_spin_button_set_value(ramp_acceleration_dialog->ramp_y1, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(ramp_acceleration_dialog->ramp_y1), FALSE, FALSE, 0); /* ramp step count - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* ramp step count - label */ label = (GtkLabel *) gtk_label_new(i18n("ramp step count")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* ramp step count - spin button */ ramp_acceleration_dialog->ramp_step_count = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_RAMP_ACCELERATION_MAX_STEPS, 1.0); gtk_spin_button_set_value(ramp_acceleration_dialog->ramp_step_count, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(ramp_acceleration_dialog->ramp_step_count), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) ramp_acceleration_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_ramp_acceleration_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRampAccelerationDialog *ramp_acceleration_dialog; ramp_acceleration_dialog = AGS_RAMP_ACCELERATION_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) ramp_acceleration_dialog->main_window == main_window){ return; } if(ramp_acceleration_dialog->main_window != NULL){ g_object_unref(ramp_acceleration_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } ramp_acceleration_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ramp_acceleration_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRampAccelerationDialog *ramp_acceleration_dialog; ramp_acceleration_dialog = AGS_RAMP_ACCELERATION_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, ramp_acceleration_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ramp_acceleration_dialog_connect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsRampAccelerationDialog *ramp_acceleration_dialog; ramp_acceleration_dialog = AGS_RAMP_ACCELERATION_DIALOG(connectable); if((AGS_RAMP_ACCELERATION_DIALOG_CONNECTED & (ramp_acceleration_dialog->flags)) != 0){ return; } ramp_acceleration_dialog->flags |= AGS_RAMP_ACCELERATION_DIALOG_CONNECTED; automation_editor = AGS_WINDOW(ramp_acceleration_dialog->main_window)->automation_window->automation_editor; g_signal_connect(ramp_acceleration_dialog, "response", G_CALLBACK(ags_ramp_acceleration_dialog_response_callback), ramp_acceleration_dialog); g_signal_connect(ramp_acceleration_dialog->port, "changed", G_CALLBACK(ags_ramp_acceleration_dialog_port_callback), ramp_acceleration_dialog); /* machine changed */ g_signal_connect_after(automation_editor, "machine-changed", G_CALLBACK(ags_ramp_acceleration_dialog_machine_changed_callback), ramp_acceleration_dialog); } void ags_ramp_acceleration_dialog_disconnect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsRampAccelerationDialog *ramp_acceleration_dialog; ramp_acceleration_dialog = AGS_RAMP_ACCELERATION_DIALOG(connectable); if((AGS_RAMP_ACCELERATION_DIALOG_CONNECTED & (ramp_acceleration_dialog->flags)) == 0){ return; } ramp_acceleration_dialog->flags &= (~AGS_RAMP_ACCELERATION_DIALOG_CONNECTED); automation_editor = AGS_WINDOW(ramp_acceleration_dialog->main_window)->automation_window->automation_editor; g_object_disconnect(G_OBJECT(ramp_acceleration_dialog), "any_signal::response", G_CALLBACK(ags_ramp_acceleration_dialog_response_callback), ramp_acceleration_dialog, NULL); g_object_disconnect(G_OBJECT(ramp_acceleration_dialog->port), "any_signal::changed", G_CALLBACK(ags_ramp_acceleration_dialog_port_callback), ramp_acceleration_dialog, NULL); g_object_disconnect(G_OBJECT(automation_editor), "any_signal::machine-changed", G_CALLBACK(ags_ramp_acceleration_dialog_machine_changed_callback), ramp_acceleration_dialog, NULL); } void ags_ramp_acceleration_dialog_finalize(GObject *gobject) { AgsRampAccelerationDialog *ramp_acceleration_dialog; ramp_acceleration_dialog = (AgsRampAccelerationDialog *) gobject; G_OBJECT_CLASS(ags_ramp_acceleration_dialog_parent_class)->finalize(gobject); } void ags_ramp_acceleration_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_ramp_acceleration_dialog_apply(AgsApplicable *applicable) { AgsRampAccelerationDialog *ramp_acceleration_dialog; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsNotebook *notebook; AgsAudio *audio; AgsAutomation *current; AgsAcceleration *acceleration; AgsTimestamp *timestamp; GList *start_list_automation, *list_automation; GList *list_acceleration, *list_acceleration_start; gchar *specifier; GType channel_type; gdouble gui_y; gdouble tact; gdouble c_y0, c_y1; gdouble val; gdouble upper, lower, range, step; gdouble c_upper, c_lower, c_range; guint tmp; guint x0, x1; gdouble y0, y1; guint step_count; gint line; guint i, i_start, i_stop; guint nth_match, match_count; gboolean success; ramp_acceleration_dialog = AGS_RAMP_ACCELERATION_DIALOG(applicable); window = (AgsWindow *) ramp_acceleration_dialog->main_window; automation_editor = window->automation_window->automation_editor; machine = automation_editor->selected_machine; if(machine == NULL || automation_editor->focused_automation_edit == NULL){ return; } specifier = gtk_combo_box_text_get_active_text(ramp_acceleration_dialog->port); notebook = NULL; channel_type = G_TYPE_NONE; if(automation_editor->focused_automation_edit->channel_type == G_TYPE_NONE){ notebook = NULL; channel_type = G_TYPE_NONE; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; channel_type = AGS_TYPE_OUTPUT; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; channel_type = AGS_TYPE_INPUT; } audio = machine->audio; /* get some values */ x0 = AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH * gtk_spin_button_get_value_as_int(ramp_acceleration_dialog->ramp_x0); y0 = gtk_spin_button_get_value(ramp_acceleration_dialog->ramp_y0); x1 = AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH * gtk_spin_button_get_value_as_int(ramp_acceleration_dialog->ramp_x1); y1 = gtk_spin_button_get_value(ramp_acceleration_dialog->ramp_y1); step_count = gtk_spin_button_get_value_as_int(ramp_acceleration_dialog->ramp_step_count); /* remove acceleration of region */ line = 0; g_object_get(audio, "automation", &start_list_automation, NULL); while(notebook == NULL || (line = ags_notebook_next_active_tab(notebook, line)) != -1){ list_automation = start_list_automation; while((list_automation = ags_automation_find_specifier_with_type_and_line(list_automation, specifier, channel_type, line)) != NULL){ AgsPort *current_port; AgsTimestamp *current_timestamp; AgsConversion *conversion; guint steps; current = AGS_AUTOMATION(list_automation->data); g_object_get(current, "timestamp", ¤t_timestamp, NULL); g_object_unref(current_timestamp); if(ags_timestamp_get_ags_offset(current_timestamp) < x0){ list_automation = list_automation->next; continue; } if(ags_timestamp_get_ags_offset(current_timestamp) > x1){ break; } g_object_get(current, "port", ¤t_port, "upper", &upper, "lower", &lower, "steps", &steps, NULL); g_object_get(current_port, "conversion", &conversion, NULL); range = upper - lower; if(conversion != NULL){ c_upper = ags_conversion_convert(conversion, upper, FALSE); c_lower = ags_conversion_convert(conversion, lower, FALSE); c_range = c_upper - c_lower; }else{ c_upper = upper; c_lower = lower; c_range = range; } g_object_unref(current_port); if(range == 0.0){ list_automation = list_automation->next; g_warning("ags_ramp_acceleration_dialog.c - range = 0.0"); continue; } /* check steps */ gui_y = steps; val = c_lower + (gui_y * (c_range / steps)); c_y0 = val; /* conversion */ if(conversion != NULL){ c_y0 = ags_conversion_convert(conversion, c_y0, TRUE); } /* check steps */ gui_y = 0; val = c_lower + (gui_y * (c_range / steps)); c_y1 = val; /* conversion */ if(conversion != NULL){ c_y1 = ags_conversion_convert(conversion, c_y1, TRUE); } /* find and remove region */ list_acceleration = list_acceleration_start = ags_automation_find_region(list_automation->data, x0, c_y0, x1, c_y1, FALSE); while(list_acceleration != NULL){ current->acceleration = g_list_remove(current->acceleration, list_acceleration->data); list_acceleration = list_acceleration->next; } g_list_free(list_acceleration_start); list_automation = list_automation->next; } if(notebook == NULL){ break; } line++; } g_list_free_full(start_list_automation, g_object_unref); /* ramp acceleration */ line = 0; timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; while(notebook == NULL || (line = ags_notebook_next_active_tab(notebook, line)) != -1){ AgsChannel *start_channel; AgsChannel *nth_channel; GList *start_play_port, *start_recall_port; GList *play_port, *recall_port; guint j; guint tmp; play_port = start_play_port = NULL; recall_port = start_recall_port = NULL; if(channel_type == AGS_TYPE_OUTPUT){ g_object_get(machine->audio, "output", &start_channel, NULL); nth_channel = ags_channel_nth(start_channel, line); play_port = start_play_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, specifier, TRUE); recall_port = start_recall_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, specifier, FALSE); if(nth_channel != NULL){ g_object_unref(nth_channel); } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } }else if(channel_type == AGS_TYPE_INPUT){ g_object_get(machine->audio, "input", &start_channel, NULL); nth_channel = ags_channel_nth(start_channel, line); play_port = start_play_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, specifier, TRUE); recall_port = start_recall_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(nth_channel, specifier, FALSE); if(nth_channel != NULL){ g_object_unref(nth_channel); } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } }else{ play_port = start_play_port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, specifier, TRUE); recall_port = start_recall_port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, specifier, FALSE); } if(play_port != NULL){ match_count = 0; tmp = x1 - x0; if(x0 % (guint) AGS_AUTOMATION_DEFAULT_OFFSET != 0 && x0 / (guint) AGS_AUTOMATION_DEFAULT_OFFSET != (x1 - AGS_AUTOMATION_DEFAULT_OFFSET) / (guint) AGS_AUTOMATION_DEFAULT_OFFSET){ match_count = 1; tmp -= (x0 % (guint) AGS_AUTOMATION_DEFAULT_OFFSET); } match_count += (guint) ceil((gdouble) tmp / AGS_AUTOMATION_DEFAULT_OFFSET); success = FALSE; timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(x0 / AGS_AUTOMATION_DEFAULT_OFFSET); for(nth_match = 0; nth_match < match_count; nth_match++){ list_automation = AGS_PORT(play_port->data)->automation; list_automation = ags_automation_find_near_timestamp(list_automation, line, timestamp); if(list_automation == NULL){ current = ags_automation_new((GObject *) machine->audio, line, channel_type, specifier); g_object_set(current, "port", play_port->data, NULL); current->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; ags_audio_add_automation(machine->audio, (GObject *) current); ags_port_add_automation(AGS_PORT(play_port->data), (GObject *) current); }else{ current = list_automation->data; } upper = current->upper; lower = current->lower; range = upper - lower; if(range == 0.0){ g_warning("ags_ramp_acceleration_dialog.c - range = 0.0"); break; } /* ramp value and move offset */ if(!success){ i = 0; if(floor(x0 / (guint) AGS_AUTOMATION_DEFAULT_OFFSET) == floor(x1 / (guint) AGS_AUTOMATION_DEFAULT_OFFSET)){ i_stop = step_count; tmp += (x1 - x0); }else{ i_stop = tmp / (x1 - x0) * step_count; if(tmp + AGS_AUTOMATION_DEFAULT_OFFSET < x1 - x0){ tmp += AGS_AUTOMATION_DEFAULT_OFFSET; }else{ tmp = x1 - x0; } } success = TRUE; }else{ i_stop = (x1 - tmp) / (x1 - x0) * step_count; if(tmp + AGS_AUTOMATION_DEFAULT_OFFSET < x1 - x0){ tmp += AGS_AUTOMATION_DEFAULT_OFFSET; }else{ tmp = x1 - x0; } } for(; i < step_count && i < i_stop; i++){ acceleration = ags_acceleration_new(); acceleration->x = ((gdouble) x0 + (gdouble) ((gdouble) (x1 - x0) * (gdouble) ((gdouble) (i) / ((gdouble) step_count)))); acceleration->y = ((gdouble) y0 + ((gdouble) (y1 - y0) * (gdouble) ((gdouble) (i + 1) / ((gdouble) step_count)))); //#ifdef AGS_DEBUG g_message("line %d - %d %f", line, acceleration->x, acceleration->y); //#endif ags_automation_add_acceleration(current, acceleration, FALSE); } timestamp->timer.ags_offset.offset += AGS_AUTOMATION_DEFAULT_OFFSET; } } if(recall_port != NULL){ match_count = 0; tmp = x1 - x0; if(x0 % (guint) AGS_AUTOMATION_DEFAULT_OFFSET != 0 && x0 / (guint) AGS_AUTOMATION_DEFAULT_OFFSET != (x1 - AGS_AUTOMATION_DEFAULT_OFFSET) / (guint) AGS_AUTOMATION_DEFAULT_OFFSET){ match_count = 1; tmp -= (x0 % (guint) AGS_AUTOMATION_DEFAULT_OFFSET); } match_count += (guint) ceil((gdouble) tmp / AGS_AUTOMATION_DEFAULT_OFFSET); success = FALSE; timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(x0 / AGS_AUTOMATION_DEFAULT_OFFSET); for(nth_match = 0; nth_match < match_count; nth_match++){ list_automation = AGS_PORT(recall_port->data)->automation; list_automation = ags_automation_find_near_timestamp(list_automation, line, timestamp); if(list_automation == NULL){ current = ags_automation_new((GObject *) machine->audio, line, channel_type, specifier); g_object_set(current, "port", recall_port->data, NULL); current->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; ags_audio_add_automation(machine->audio, (GObject *) current); ags_port_add_automation(AGS_PORT(recall_port->data), (GObject *) current); }else{ current = list_automation->data; } upper = current->upper; lower = current->lower; range = upper - lower; if(range == 0.0){ g_warning("ags_ramp_acceleration_dialog.c - range = 0.0"); break; } /* ramp value and move offset */ if(!success){ i = 0; if(floor(x0 / (guint) AGS_AUTOMATION_DEFAULT_OFFSET) == floor(x1 / (guint) AGS_AUTOMATION_DEFAULT_OFFSET)){ i_stop = step_count; tmp += (x1 - x0); }else{ i_stop = tmp / (x1 - x0) * step_count; if(tmp + AGS_AUTOMATION_DEFAULT_OFFSET < x1 - x0){ tmp += AGS_AUTOMATION_DEFAULT_OFFSET; }else{ tmp = x1 - x0; } } success = TRUE; }else{ i_stop = (x1 - tmp) / (x1 - x0) * step_count; if(tmp + AGS_AUTOMATION_DEFAULT_OFFSET < x1 - x0){ tmp += AGS_AUTOMATION_DEFAULT_OFFSET; }else{ tmp = x1 - x0; } } for(; i < step_count && i < i_stop; i++){ acceleration = ags_acceleration_new(); acceleration->x = ((gdouble) x0 + (gdouble) ((gdouble) (x1 - x0) * (gdouble) ((gdouble) (i) / ((gdouble) step_count)))); acceleration->y = ((gdouble) y0 + ((gdouble) (y1 - y0) * (gdouble) ((gdouble) (i + 1) / ((gdouble) step_count)))); #ifdef AGS_DEBUG g_message("line %d - %d %f", line, acceleration->x, acceleration->y); #endif ags_automation_add_acceleration(current, acceleration, FALSE); } timestamp->timer.ags_offset.offset += AGS_AUTOMATION_DEFAULT_OFFSET; } } g_list_free_full(start_play_port, g_object_unref); g_list_free_full(start_recall_port, g_object_unref); if(notebook == NULL){ break; } line++; } } void ags_ramp_acceleration_dialog_reset(AgsApplicable *applicable) { AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsRampAccelerationDialog *ramp_acceleration_dialog; AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; GList *start_port, *port; gchar **collected_specifier; guint length; ramp_acceleration_dialog = AGS_RAMP_ACCELERATION_DIALOG(applicable); window = AGS_WINDOW(ramp_acceleration_dialog->main_window); automation_editor = window->automation_window->automation_editor; machine = automation_editor->selected_machine; gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(ramp_acceleration_dialog->port)))); if(machine == NULL){ return; } audio = machine->audio; collected_specifier = (gchar **) malloc(sizeof(gchar*)); collected_specifier[0] = NULL; length = 1; /* audio */ port = start_port = ags_audio_collect_all_audio_ports(audio); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ gtk_combo_box_text_append_text(ramp_acceleration_dialog->port, g_strdup(specifier)); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* output */ g_object_get(audio, "output", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* output */ port = start_port = ags_channel_collect_all_channel_ports(channel); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ gtk_combo_box_text_append_text(ramp_acceleration_dialog->port, g_strdup(specifier)); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } /* input */ g_object_get(audio, "input", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* input */ port = start_port = ags_channel_collect_all_channel_ports(channel); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ gtk_combo_box_text_append_text(ramp_acceleration_dialog->port, g_strdup(specifier)); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } g_strfreev(collected_specifier); } gboolean ags_ramp_acceleration_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_ramp_acceleration_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_ramp_acceleration_dialog_new: * @main_window: the #AgsWindow * * Create a new instance of #AgsRampAccelerationDialog. * * Returns: the new #AgsRampAccelerationDialog * * Since: 3.0.0 */ AgsRampAccelerationDialog* ags_ramp_acceleration_dialog_new(GtkWidget *main_window) { AgsRampAccelerationDialog *ramp_acceleration_dialog; ramp_acceleration_dialog = (AgsRampAccelerationDialog *) g_object_new(AGS_TYPE_RAMP_ACCELERATION_DIALOG, "main-window", main_window, NULL); return(ramp_acceleration_dialog); } gsequencer-3.1.3/ags/X/editor/ags_machine_selector_callbacks.c0000644000175000017500000001741613607210263021361 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_machine_selector_selection_response(GtkWidget *machine_selection, gint response, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_add_tab_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { //TODO:JK: implement me } void ags_machine_selector_popup_remove_tab_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { //TODO:JK: implement me } void ags_machine_selector_popup_add_index_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { ags_machine_selector_add_index(machine_selector); } void ags_machine_selector_popup_remove_index_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { GList *list, *list_start; guint nth; /* find index */ list_start = list = gtk_container_get_children(GTK_CONTAINER(machine_selector)); list = list->next; nth = 0; while(list != NULL){ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->data))){ ags_machine_selector_changed(machine_selector, NULL); break; } list = list->next; nth++; } g_list_free(list_start); /* remove index */ ags_machine_selector_remove_index(machine_selector, nth); } void ags_machine_selector_popup_link_index_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { AgsWindow *window; AgsMachine *machine; AgsMachineSelection *machine_selection; AgsMachineRadioButton *machine_radio_button; GList *list; list = gtk_window_list_toplevels(); while(list != NULL && !AGS_IS_WINDOW(list->data)) list = list->next; if(list == NULL){ return; } window = list->data; machine_selection = (AgsMachineSelection *) ags_machine_selection_new(window); machine_selector->machine_selection = (GtkDialog *) machine_selection; if((AGS_MACHINE_SELECTOR_NOTATION & (machine_selector->flags)) != 0){ machine_selection->flags |= AGS_MACHINE_SELECTION_NOTATION; }else if((AGS_MACHINE_SELECTOR_AUTOMATION & (machine_selector->flags)) != 0){ machine_selection->flags |= AGS_MACHINE_SELECTION_AUTOMATION; }else if((AGS_MACHINE_SELECTOR_WAVE & (machine_selector->flags)) != 0){ machine_selection->flags |= AGS_MACHINE_SELECTION_WAVE; } ags_machine_selection_load_defaults(machine_selection); g_signal_connect(G_OBJECT(machine_selection), "response", G_CALLBACK(ags_machine_selector_selection_response), machine_selector); gtk_widget_show_all((GtkWidget *) machine_selection); } void ags_machine_selector_selection_response(GtkWidget *machine_selection, gint response, AgsMachineSelector *machine_selector) { AgsMachine *machine; GtkVBox *vbox; GtkContainer *content_area; GList *list, *list_start; if(response == GTK_RESPONSE_ACCEPT){ /* retrieve machine */ machine = NULL; vbox = (GtkVBox *) gtk_dialog_get_content_area(GTK_DIALOG(machine_selection)); if(response == GTK_RESPONSE_ACCEPT){ list_start = list = gtk_container_get_children((GtkContainer *) vbox); while(list != NULL){ if(GTK_IS_TOGGLE_BUTTON(list->data) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->data))){ machine = g_object_get_data(list->data, AGS_MACHINE_SELECTION_INDEX); break; } list = list->next; } g_list_free(list_start); } /* link index */ ags_machine_selector_link_index(machine_selector, machine); } /* unset machine selection and destroy */ machine_selector->machine_selection = NULL; gtk_widget_destroy(machine_selection); } void ags_machine_selector_radio_changed(GtkWidget *radio_button, AgsMachineSelector *machine_selector) { ags_machine_selector_changed(machine_selector, AGS_MACHINE_RADIO_BUTTON(radio_button)->machine); } void ags_machine_selector_popup_reverse_mapping_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { AgsNotationEditor *notation_editor; if((AGS_MACHINE_SELECTOR_BLOCK_REVERSE_MAPPING & (machine_selector->flags)) != 0){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) machine_selector, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine != NULL){ if(gtk_check_menu_item_get_active((GtkCheckMenuItem *) menu_item)){ ags_audio_set_behaviour_flags(notation_editor->selected_machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING); }else{ ags_audio_unset_behaviour_flags(notation_editor->selected_machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING); } } } void ags_machine_selector_popup_shift_piano_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector) { AgsNotationEditor *notation_editor; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) machine_selector, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine != NULL){ GList *notation; gchar *base_note; gchar *label; gint base_key_code; label = gtk_menu_item_get_label((GtkMenuItem *) menu_item); //FIXME:JK: modify to the new API #if 0 notation = notation_editor->selected_machine->audio->notation; while(notation != NULL){ g_free(AGS_NOTATION(notation->data)->base_note); AGS_NOTATION(notation->data)->base_note = g_strdup(label); notation = notation->next; } #endif base_note = NULL; base_key_code = 0; if(!g_strcmp0(label, "A")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_A; base_key_code = 33; }else if(!g_strcmp0(label, "A#")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_AIS; base_key_code = 34; }else if(!g_strcmp0(label, "H")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_H; base_key_code = 35; }else if(!g_strcmp0(label, "C")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_C; base_key_code = 24; }else if(!g_strcmp0(label, "C#")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_CIS; base_key_code = 25; }else if(!g_strcmp0(label, "D")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_D; base_key_code = 26; }else if(!g_strcmp0(label, "D#")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_DIS; base_key_code = 27; }else if(!g_strcmp0(label, "E")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_E; base_key_code = 28; }else if(!g_strcmp0(label, "F")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_F; base_key_code = 29; }else if(!g_strcmp0(label, "F#")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_FIS; base_key_code = 30; }else if(!g_strcmp0(label, "G")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_G; base_key_code = 31; }else if(!g_strcmp0(label, "G#")){ base_note = AGS_PIANO_KEYS_OCTAVE_2_GIS; base_key_code = 32; } g_object_set(notation_editor->scrolled_piano->piano, "base-note", base_note, "base-key-code", base_key_code, NULL); gtk_widget_queue_draw((GtkWidget *) notation_editor->scrolled_piano->piano); } } gsequencer-3.1.3/ags/X/editor/ags_machine_selection.h0000644000175000017500000000506513607210263017531 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_SELECTION_H__ #define __AGS_MACHINE_SELECTION_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE_SELECTION (ags_machine_selection_get_type()) #define AGS_MACHINE_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE_SELECTION, AgsMachineSelection)) #define AGS_MACHINE_SELECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE_SELECTION, AgsMachineSelectionClass)) #define AGS_IS_MACHINE_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MACHINE_SELECTION)) #define AGS_IS_MACHINE_SELECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MACHINE_SELECTION)) #define AGS_MACHINE_SELECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_MACHINE_SELECTION, AgsMachineSelectionClass)) #define AGS_MACHINE_SELECTION_INDEX "ags-machine-selection-index\0" typedef struct _AgsMachineSelection AgsMachineSelection; typedef struct _AgsMachineSelectionClass AgsMachineSelectionClass; typedef enum{ AGS_MACHINE_SELECTION_CONNECTED = 1, AGS_MACHINE_SELECTION_NOTATION = 1 << 1, AGS_MACHINE_SELECTION_AUTOMATION = 1 << 2, AGS_MACHINE_SELECTION_WAVE = 1 << 3, }AgsMachineSelectionFlags; struct _AgsMachineSelection { GtkDialog dialog; guint flags; AgsWindow *window; GList *machine; }; struct _AgsMachineSelectionClass { GtkDialogClass dialog; }; GType ags_machine_selection_get_type(void); void ags_machine_selection_load_defaults(AgsMachineSelection *machine_selection); AgsMachineSelection* ags_machine_selection_new(AgsWindow *window); G_END_DECLS #endif /*__AGS_MACHINE_SELECTION_H__*/ gsequencer-3.1.3/ags/X/editor/ags_machine_radio_button.c0000644000175000017500000001646613607210263020237 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_machine_radio_button_class_init(AgsMachineRadioButtonClass *machine_radio_button); void ags_machine_radio_button_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_radio_button_init(AgsMachineRadioButton *machine_radio_button); void ags_machine_radio_button_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_machine_radio_button_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_machine_radio_button_connect(AgsConnectable *connectable); void ags_machine_radio_button_disconnect(AgsConnectable *connectable); void ags_machine_radio_button_finalize(GObject *gobject); /** * SECTION:ags_machine_radio_button * @short_description: machine radio buttons * @title: AgsMachineRadioButton * @section_id: * @include: ags/X/editor/ags_machine_radio_button.h * * The #AgsMachineRadioButton enables you make choice of an #AgsMachine. */ enum{ PROP_0, PROP_MACHINE, }; static gpointer ags_machine_radio_button_parent_class = NULL; GType ags_machine_radio_button_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine_radio_button = 0; static const GTypeInfo ags_machine_radio_button_info = { sizeof (AgsMachineRadioButtonClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_radio_button_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachineRadioButton), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_radio_button_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_radio_button_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine_radio_button = g_type_register_static(GTK_TYPE_RADIO_BUTTON, "AgsMachineRadioButton", &ags_machine_radio_button_info, 0); g_type_add_interface_static(ags_type_machine_radio_button, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine_radio_button); } return g_define_type_id__volatile; } void ags_machine_radio_button_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_radio_button_connect; connectable->disconnect = ags_machine_radio_button_disconnect; } void ags_machine_radio_button_class_init(AgsMachineRadioButtonClass *machine_radio_button) { GObjectClass *gobject; GParamSpec *param_spec; ags_machine_radio_button_parent_class = g_type_class_peek_parent(machine_radio_button); /* GObjectClass */ gobject = (GObjectClass *) machine_radio_button; gobject->set_property = ags_machine_radio_button_set_property; gobject->get_property = ags_machine_radio_button_get_property; gobject->finalize = ags_machine_radio_button_finalize; /* properties */ /** * AgsMachineRadioButton:machine: * * The assigned #AgsMachine * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine it is assigned to"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); } void ags_machine_radio_button_init(AgsMachineRadioButton *machine_radio_button) { machine_radio_button->machine = NULL; } void ags_machine_radio_button_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMachineRadioButton *machine_radio_button; machine_radio_button = AGS_MACHINE_RADIO_BUTTON(gobject); switch(prop_id){ case PROP_MACHINE: { AgsMachine *machine; AgsMachineSelector *machine_selector; machine = (AgsMachine *) g_value_get_object(value); if(machine == machine_radio_button->machine){ return; } if(machine_radio_button->machine != NULL){ g_object_unref(machine_radio_button->machine); } if(machine != NULL){ gchar *str; str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), machine->machine_name); g_object_set(gobject, "label", str, NULL); g_signal_connect_after(machine, "notify::machine-name", G_CALLBACK(ags_machine_radio_button_notify_machine_name_callback), machine_radio_button); g_object_ref(machine); g_free(str); } machine_radio_button->machine = machine; machine_selector = (AgsMachineSelector *) gtk_widget_get_ancestor((GtkWidget *) machine_radio_button, AGS_TYPE_MACHINE_SELECTOR); ags_machine_selector_changed(machine_selector, machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_radio_button_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMachineRadioButton *machine_radio_button; machine_radio_button = AGS_MACHINE_RADIO_BUTTON(gobject); switch(prop_id){ case PROP_MACHINE: { g_value_set_object(value, machine_radio_button->machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_machine_radio_button_connect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_machine_radio_button_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_machine_radio_button_finalize(GObject *gobject) { AgsMachineRadioButton *machine_radio_button; machine_radio_button = AGS_MACHINE_RADIO_BUTTON(gobject); if(machine_radio_button->machine != NULL){ g_object_unref(G_OBJECT(machine_radio_button->machine)); } } /** * ags_machine_radio_button_new: * * Create a new #AgsMachineRadioButton. * * Returns: a new #AgsMachineRadioButton * * Since: 3.0.0 */ AgsMachineRadioButton* ags_machine_radio_button_new() { AgsMachineRadioButton *machine_radio_button; machine_radio_button = (AgsMachineRadioButton *) g_object_new(AGS_TYPE_MACHINE_RADIO_BUTTON, NULL); return(machine_radio_button); } gsequencer-3.1.3/ags/X/editor/ags_automation_meta.h0000644000175000017500000000516013616617253017254 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_META_H__ #define __AGS_AUTOMATION_META_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION_META (ags_automation_meta_get_type()) #define AGS_AUTOMATION_META(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION_META, AgsAutomationMeta)) #define AGS_AUTOMATION_META_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION_META, AgsAutomationMetaClass)) #define AGS_IS_AUTOMATION_META(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTOMATION_META)) #define AGS_IS_AUTOMATION_META_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTOMATION_META)) #define AGS_AUTOMATION_META_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUTOMATION_META, AgsAutomationMetaClass)) typedef struct _AgsAutomationMeta AgsAutomationMeta; typedef struct _AgsAutomationMetaClass AgsAutomationMetaClass; typedef enum{ AGS_AUTOMATION_META_CONNECTED = 1, AGS_AUTOMATION_META_ENABLED = 1 << 1, }AgsAutomationMetaFlags; struct _AgsAutomationMeta { GtkVBox vbox; guint flags; GtkLabel *machine_type; GtkLabel *machine_name; GtkLabel *audio_channels; GtkLabel *output_pads; GtkLabel *input_pads; GtkLabel *editor_tool; GtkLabel *active_audio_channel; GtkLabel *active_port; GtkLabel *focused_port; GtkLabel *range_upper; GtkLabel *range_lower; GtkLabel *cursor_x_position; GtkLabel *cursor_y_position; GtkLabel *current_acceleration; }; struct _AgsAutomationMetaClass { GtkVBoxClass vbox; }; GType ags_automation_meta_get_type(void); void ags_automation_meta_refresh(AgsAutomationMeta *automation_meta); AgsAutomationMeta* ags_automation_meta_new(); G_END_DECLS #endif /*__AGS_AUTOMATION_META_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_toolbar.h0000644000175000017500000000475113607210263016545 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_TOOLBAR_H__ #define __AGS_WAVE_TOOLBAR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_TOOLBAR (ags_wave_toolbar_get_type()) #define AGS_WAVE_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_TOOLBAR, AgsWaveToolbar)) #define AGS_WAVE_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_TOOLBAR, AgsWaveToolbarClass)) #define AGS_IS_WAVE_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE_TOOLBAR)) #define AGS_IS_WAVE_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE_TOOLBAR)) #define AGS_WAVE_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_WAVE_TOOLBAR, AgsWaveToolbarClass)) typedef struct _AgsWaveToolbar AgsWaveToolbar; typedef struct _AgsWaveToolbarClass AgsWaveToolbarClass; typedef enum{ AGS_WAVE_TOOLBAR_CONNECTED = 1, }AgsWaveToolbarFlags; struct _AgsWaveToolbar { GtkToolbar toolbar; guint flags; GtkToggleToolButton *selected_edit_mode; GtkToggleToolButton *position; GtkToggleToolButton *select; GtkToolButton *copy; GtkToolButton *cut; GtkMenuToolButton *paste_tool; GtkMenuToolButton *menu_tool; GtkMenu *tool_popup; GtkDialog *select_buffer; GtkDialog *position_wave_cursor; guint zoom_history; GtkComboBox *zoom; GtkSpinButton *opacity; }; struct _AgsWaveToolbarClass { GtkToolbarClass toolbar; }; GType ags_wave_toolbar_get_type(void); GtkMenu* ags_wave_toolbar_tool_popup_new(AgsWaveToolbar *wave_toolbar); AgsWaveToolbar* ags_wave_toolbar_new(); G_END_DECLS #endif /*__AGS_WAVE_TOOLBAR_H__*/ gsequencer-3.1.3/ags/X/editor/ags_crop_note_dialog.c0000644000175000017500000003435413607210263017365 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_crop_note_dialog_class_init(AgsCropNoteDialogClass *crop_note_dialog); void ags_crop_note_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_crop_note_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_crop_note_dialog_init(AgsCropNoteDialog *crop_note_dialog); void ags_crop_note_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_crop_note_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_crop_note_dialog_finalize(GObject *gobject); void ags_crop_note_dialog_connect(AgsConnectable *connectable); void ags_crop_note_dialog_disconnect(AgsConnectable *connectable); void ags_crop_note_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_crop_note_dialog_apply(AgsApplicable *applicable); void ags_crop_note_dialog_reset(AgsApplicable *applicable); gboolean ags_crop_note_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_crop_note_dialog * @short_description: crop tool * @title: AgsCropNoteDialog * @section_id: * @include: ags/X/editor/ags_crop_note_dialog.h * * The #AgsCropNoteDialog lets you crop notes. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_crop_note_dialog_parent_class = NULL; GType ags_crop_note_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_crop_note_dialog = 0; static const GTypeInfo ags_crop_note_dialog_info = { sizeof (AgsCropNoteDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_crop_note_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCropNoteDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_crop_note_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_crop_note_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_crop_note_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_crop_note_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsCropNoteDialog", &ags_crop_note_dialog_info, 0); g_type_add_interface_static(ags_type_crop_note_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_crop_note_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_crop_note_dialog); } return g_define_type_id__volatile; } void ags_crop_note_dialog_class_init(AgsCropNoteDialogClass *crop_note_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_crop_note_dialog_parent_class = g_type_class_peek_parent(crop_note_dialog); /* GObjectClass */ gobject = (GObjectClass *) crop_note_dialog; gobject->set_property = ags_crop_note_dialog_set_property; gobject->get_property = ags_crop_note_dialog_get_property; gobject->finalize = ags_crop_note_dialog_finalize; /* properties */ /** * AgsCropNoteDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) crop_note_dialog; widget->delete_event = ags_crop_note_dialog_delete_event; } void ags_crop_note_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_crop_note_dialog_connect; connectable->disconnect = ags_crop_note_dialog_disconnect; } void ags_crop_note_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_crop_note_dialog_set_update; applicable->apply = ags_crop_note_dialog_apply; applicable->reset = ags_crop_note_dialog_reset; } void ags_crop_note_dialog_init(AgsCropNoteDialog *crop_note_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; crop_note_dialog->flags = 0; g_object_set(crop_note_dialog, "title", i18n("crop notes"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(crop_note_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* absolute */ crop_note_dialog->absolute = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("absolute")); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(crop_note_dialog->absolute), FALSE, FALSE, 0); /* radio - in place */ crop_note_dialog->in_place = (GtkRadioButton *) gtk_radio_button_new_with_label(NULL, i18n("in-place")); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(crop_note_dialog->in_place), FALSE, FALSE, 0); /* radio - do resize */ crop_note_dialog->do_resize = (GtkRadioButton *) gtk_radio_button_new_with_label(gtk_radio_button_get_group(crop_note_dialog->in_place), i18n("do resize")); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(crop_note_dialog->do_resize), FALSE, FALSE, 0); /* crop note - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* crop note - label */ label = (GtkLabel *) gtk_label_new(i18n("crop note")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* crop note - spin button */ crop_note_dialog->crop_note = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0 * AGS_CROP_NOTE_DIALOG_MAX_WIDTH, AGS_CROP_NOTE_DIALOG_MAX_WIDTH, 1.0); gtk_spin_button_set_value(crop_note_dialog->crop_note, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(crop_note_dialog->crop_note), FALSE, FALSE, 0); /* padding note - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* padding note - label */ label = (GtkLabel *) gtk_label_new(i18n("padding note")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* padding note - spin button */ crop_note_dialog->padding_note = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0 * AGS_CROP_NOTE_DIALOG_MAX_WIDTH, AGS_CROP_NOTE_DIALOG_MAX_WIDTH, 1.0); gtk_spin_button_set_value(crop_note_dialog->padding_note, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(crop_note_dialog->padding_note), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) crop_note_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_crop_note_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCropNoteDialog *crop_note_dialog; crop_note_dialog = AGS_CROP_NOTE_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) crop_note_dialog->main_window == main_window){ return; } if(crop_note_dialog->main_window != NULL){ g_object_unref(crop_note_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } crop_note_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_crop_note_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCropNoteDialog *crop_note_dialog; crop_note_dialog = AGS_CROP_NOTE_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, crop_note_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_crop_note_dialog_connect(AgsConnectable *connectable) { AgsCropNoteDialog *crop_note_dialog; crop_note_dialog = AGS_CROP_NOTE_DIALOG(connectable); if((AGS_CROP_NOTE_DIALOG_CONNECTED & (crop_note_dialog->flags)) != 0){ return; } crop_note_dialog->flags |= AGS_CROP_NOTE_DIALOG_CONNECTED; g_signal_connect(crop_note_dialog, "response", G_CALLBACK(ags_crop_note_dialog_response_callback), crop_note_dialog); /* absolute */ g_signal_connect_after(crop_note_dialog->absolute, "clicked", G_CALLBACK(ags_crop_note_dialog_absolute_callback), crop_note_dialog); } void ags_crop_note_dialog_disconnect(AgsConnectable *connectable) { AgsCropNoteDialog *crop_note_dialog; crop_note_dialog = AGS_CROP_NOTE_DIALOG(connectable); if((AGS_CROP_NOTE_DIALOG_CONNECTED & (crop_note_dialog->flags)) == 0){ return; } crop_note_dialog->flags &= (~AGS_CROP_NOTE_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(crop_note_dialog), "any_signal::response", G_CALLBACK(ags_crop_note_dialog_response_callback), crop_note_dialog, NULL); /* absolute */ g_object_disconnect(G_OBJECT(crop_note_dialog->absolute), "any_signal::clicked", G_CALLBACK(ags_crop_note_dialog_absolute_callback), crop_note_dialog, NULL); } void ags_crop_note_dialog_finalize(GObject *gobject) { AgsCropNoteDialog *crop_note_dialog; crop_note_dialog = (AgsCropNoteDialog *) gobject; G_OBJECT_CLASS(ags_crop_note_dialog_parent_class)->finalize(gobject); } void ags_crop_note_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_crop_note_dialog_apply(AgsApplicable *applicable) { AgsCropNoteDialog *crop_note_dialog; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachine *machine; AgsCropNote *crop_note; AgsAudio *audio; AgsApplicationContext *application_context; GList *start_notation, *notation; GList *task; guint x_padding; guint x_crop; gboolean absolute; gboolean in_place; gboolean do_resize; crop_note_dialog = AGS_CROP_NOTE_DIALOG(applicable); /* application context */ application_context = ags_application_context_get_instance(); window = (AgsWindow *) crop_note_dialog->main_window; notation_editor = window->notation_editor; machine = notation_editor->selected_machine; if(machine == NULL){ return; } audio = machine->audio; /* get some values */ x_crop = gtk_spin_button_get_value_as_int(crop_note_dialog->crop_note); x_padding = gtk_spin_button_get_value_as_int(crop_note_dialog->padding_note); absolute = gtk_toggle_button_get_active((GtkToggleButton *) crop_note_dialog->absolute); in_place = gtk_toggle_button_get_active((GtkToggleButton *) crop_note_dialog->in_place); do_resize = gtk_toggle_button_get_active((GtkToggleButton *) crop_note_dialog->do_resize); /* crop note */ g_object_get(audio, "notation", &start_notation, NULL); notation = start_notation; task = NULL; while(notation != NULL){ GList *start_selection; GRecMutex *notation_mutex; notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation->data); /* selection */ g_rec_mutex_lock(notation_mutex); start_selection = g_list_copy_deep(AGS_NOTATION(notation->data)->selection, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(notation_mutex); if(start_selection != NULL){ crop_note = ags_crop_note_new(audio, notation->data, start_selection, x_padding, x_crop, absolute, in_place, do_resize); task = g_list_prepend(task, crop_note); g_list_free_full(start_selection, g_object_unref); } notation = notation->next; } g_list_free_full(start_notation, g_object_unref); /* append tasks */ ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); } void ags_crop_note_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_crop_note_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_crop_note_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_crop_note_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsCropNoteDialog. * * Returns: a new #AgsCropNoteDialog * * Since: 3.0.0 */ AgsCropNoteDialog* ags_crop_note_dialog_new(GtkWidget *main_window) { AgsCropNoteDialog *crop_note_dialog; crop_note_dialog = (AgsCropNoteDialog *) g_object_new(AGS_TYPE_CROP_NOTE_DIALOG, "main-window", main_window, NULL); return(crop_note_dialog); } gsequencer-3.1.3/ags/X/editor/ags_select_note_dialog.c0000644000175000017500000003663613607210263017706 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_select_note_dialog_class_init(AgsSelectNoteDialogClass *select_note_dialog); void ags_select_note_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_select_note_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_select_note_dialog_init(AgsSelectNoteDialog *select_note_dialog); void ags_select_note_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_select_note_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_select_note_dialog_finalize(GObject *gobject); void ags_select_note_dialog_connect(AgsConnectable *connectable); void ags_select_note_dialog_disconnect(AgsConnectable *connectable); void ags_select_note_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_select_note_dialog_apply(AgsApplicable *applicable); void ags_select_note_dialog_reset(AgsApplicable *applicable); gboolean ags_select_note_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_select_note_dialog * @short_description: select tool * @title: AgsSelectNoteDialog * @section_id: * @include: ags/X/editor/ags_select_note_dialog.h * * The #AgsSelectNoteDialog lets you select notes. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_select_note_dialog_parent_class = NULL; GType ags_select_note_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_select_note_dialog = 0; static const GTypeInfo ags_select_note_dialog_info = { sizeof (AgsSelectNoteDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_select_note_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSelectNoteDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_select_note_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_select_note_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_select_note_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_select_note_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsSelectNoteDialog", &ags_select_note_dialog_info, 0); g_type_add_interface_static(ags_type_select_note_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_select_note_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_select_note_dialog); } return g_define_type_id__volatile; } void ags_select_note_dialog_class_init(AgsSelectNoteDialogClass *select_note_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_select_note_dialog_parent_class = g_type_class_peek_parent(select_note_dialog); /* GObjectClass */ gobject = (GObjectClass *) select_note_dialog; gobject->set_property = ags_select_note_dialog_set_property; gobject->get_property = ags_select_note_dialog_get_property; gobject->finalize = ags_select_note_dialog_finalize; /* properties */ /** * AgsSelectNoteDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) select_note_dialog; widget->delete_event = ags_select_note_dialog_delete_event; } void ags_select_note_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_select_note_dialog_connect; connectable->disconnect = ags_select_note_dialog_disconnect; } void ags_select_note_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_select_note_dialog_set_update; applicable->apply = ags_select_note_dialog_apply; applicable->reset = ags_select_note_dialog_reset; } void ags_select_note_dialog_init(AgsSelectNoteDialog *select_note_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; select_note_dialog->flags = 0; g_object_set(select_note_dialog, "title", i18n("select notes"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(select_note_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* copy selection */ select_note_dialog->copy_selection = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("copy selection")); gtk_toggle_button_set_active((GtkToggleButton *) select_note_dialog->copy_selection, TRUE); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(select_note_dialog->copy_selection), FALSE, FALSE, 0); /* select x0 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select x0 - label */ label = (GtkLabel *) gtk_label_new(i18n("select x0")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select x0 - spin button */ select_note_dialog->select_x0 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_NOTE_MAX_BEATS, 1.0); gtk_spin_button_set_value(select_note_dialog->select_x0, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_note_dialog->select_x0), FALSE, FALSE, 0); /* select y0 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select y0 - label */ label = (GtkLabel *) gtk_label_new(i18n("select y0")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select y0 - spin button */ select_note_dialog->select_y0 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_NOTE_MAX_KEYS, 1.0); gtk_spin_button_set_value(select_note_dialog->select_y0, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_note_dialog->select_y0), FALSE, FALSE, 0); /* select x1 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select x1 - label */ label = (GtkLabel *) gtk_label_new(i18n("select x1")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select x1 - spin button */ select_note_dialog->select_x1 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_NOTE_MAX_BEATS, 1.0); gtk_spin_button_set_value(select_note_dialog->select_x1, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_note_dialog->select_x1), FALSE, FALSE, 0); /* select y1 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select y1 - label */ label = (GtkLabel *) gtk_label_new(i18n("select y1")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select y1 - spin button */ select_note_dialog->select_y1 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_NOTE_MAX_KEYS, 1.0); gtk_spin_button_set_value(select_note_dialog->select_y1, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_note_dialog->select_y1), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) select_note_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_select_note_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSelectNoteDialog *select_note_dialog; select_note_dialog = AGS_SELECT_NOTE_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) select_note_dialog->main_window == main_window){ return; } if(select_note_dialog->main_window != NULL){ g_object_unref(select_note_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } select_note_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_select_note_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSelectNoteDialog *select_note_dialog; select_note_dialog = AGS_SELECT_NOTE_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, select_note_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_select_note_dialog_connect(AgsConnectable *connectable) { AgsSelectNoteDialog *select_note_dialog; select_note_dialog = AGS_SELECT_NOTE_DIALOG(connectable); if((AGS_SELECT_NOTE_DIALOG_CONNECTED & (select_note_dialog->flags)) != 0){ return; } select_note_dialog->flags |= AGS_SELECT_NOTE_DIALOG_CONNECTED; g_signal_connect(select_note_dialog, "response", G_CALLBACK(ags_select_note_dialog_response_callback), select_note_dialog); } void ags_select_note_dialog_disconnect(AgsConnectable *connectable) { AgsSelectNoteDialog *select_note_dialog; select_note_dialog = AGS_SELECT_NOTE_DIALOG(connectable); if((AGS_SELECT_NOTE_DIALOG_CONNECTED & (select_note_dialog->flags)) == 0){ return; } select_note_dialog->flags &= (~AGS_SELECT_NOTE_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(select_note_dialog), "any_signal::response", G_CALLBACK(ags_select_note_dialog_response_callback), select_note_dialog, NULL); } void ags_select_note_dialog_finalize(GObject *gobject) { AgsSelectNoteDialog *select_note_dialog; select_note_dialog = (AgsSelectNoteDialog *) gobject; G_OBJECT_CLASS(ags_select_note_dialog_parent_class)->finalize(gobject); } void ags_select_note_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_select_note_dialog_apply(AgsApplicable *applicable) { AgsSelectNoteDialog *select_note_dialog; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachine *machine; AgsAudio *audio; AgsTimestamp *timestamp; xmlDoc *clipboard; xmlNode *audio_node, *notation_node; GList *start_list_notation, *list_notation; xmlChar *buffer; int size; guint x0, y0; guint x1, y1; gint i; gboolean copy_selection; select_note_dialog = AGS_SELECT_NOTE_DIALOG(applicable); window = (AgsWindow *) select_note_dialog->main_window; notation_editor = window->notation_editor; machine = notation_editor->selected_machine; if(machine == NULL){ return; } audio = machine->audio; g_object_get(audio, "notation", &start_list_notation, NULL); /* get some values */ copy_selection = gtk_toggle_button_get_active((GtkToggleButton *) select_note_dialog->copy_selection); x0 = gtk_spin_button_get_value_as_int(select_note_dialog->select_x0); y0 = gtk_spin_button_get_value_as_int(select_note_dialog->select_y0); x1 = gtk_spin_button_get_value_as_int(select_note_dialog->select_x1); y1 = gtk_spin_button_get_value_as_int(select_note_dialog->select_y1); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; /* select note */ if(copy_selection){ /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); } i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ list_notation = start_list_notation; timestamp->timer.ags_offset.offset = 0; while((list_notation = ags_notation_find_near_timestamp(list_notation, i, timestamp)) != NULL){ ags_notation_add_region_to_selection(AGS_NOTATION(list_notation->data), x0, y0, x1, y1, TRUE); if(copy_selection){ notation_node = ags_notation_copy_selection(AGS_NOTATION(list_notation->data)); xmlAddChild(audio_node, notation_node); } /* iterate */ timestamp->timer.ags_offset.offset += AGS_NOTATION_DEFAULT_OFFSET; list_notation = list_notation->next; } i++; } g_object_unref(timestamp); g_list_free_full(start_list_notation, g_object_unref); /* write to clipboard */ if(copy_selection){ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_select_note_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_select_note_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_select_note_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_select_note_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsSelectNoteDialog. * * Returns: a new #AgsSelectNoteDialog * * Since: 3.0.0 */ AgsSelectNoteDialog* ags_select_note_dialog_new(GtkWidget *main_window) { AgsSelectNoteDialog *select_note_dialog; select_note_dialog = (AgsSelectNoteDialog *) g_object_new(AGS_TYPE_SELECT_NOTE_DIALOG, "main-window", main_window, NULL); return(select_note_dialog); } gsequencer-3.1.3/ags/X/editor/ags_position_notation_cursor_dialog_callbacks.h0000644000175000017500000000252513607210263024550 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_POSITION_NOTATION_CURSOR_DIALOG_CALLBACKS_H__ #define __AGS_POSITION_NOTATION_CURSOR_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_position_notation_cursor_dialog_response_callback(GtkWidget *dialog, gint response, AgsPositionNotationCursorDialog *position_notation_cursor_dialog); G_END_DECLS #endif /*__AGS_POSITION_NOTATION_CURSOR_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_toolbar_callbacks.h0000644000175000017500000000610413616617253021441 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_TOOLBAR_CALLBACKS_H__ #define __AGS_NOTATION_TOOLBAR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_notation_toolbar_position_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_edit_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_clear_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_select_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_paste_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_invert_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_match_audio_channel_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_no_duplicates_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_tool_popup_move_note_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_tool_popup_crop_note_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_tool_popup_select_note_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_tool_popup_position_cursor_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_tool_popup_enable_all_lines_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_tool_popup_disable_all_lines_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_zoom_callback(GtkComboBox *combo_box, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_mode_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_opacity_callback(GtkSpinButton *spin_button, AgsNotationToolbar *notation_toolbar); G_END_DECLS #endif /*__AGS_NOTATION_TOOLBAR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_toolbar.c0000644000175000017500000004576113616617253017451 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_notation_toolbar_class_init(AgsNotationToolbarClass *notation_toolbar); void ags_notation_toolbar_connectable_interface_init(AgsConnectableInterface *connectable); void ags_notation_toolbar_init(AgsNotationToolbar *notation_toolbar); void ags_notation_toolbar_connect(AgsConnectable *connectable); void ags_notation_toolbar_disconnect(AgsConnectable *connectable); /** * SECTION:ags_notation_toolbar * @short_description: notation_toolbar * @title: AgsNotationToolbar * @section_id: * @include: ags/X/editor/ags_notation_toolbar.h * * The #AgsNotationToolbar lets you choose edit tool. */ GType ags_notation_toolbar_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_notation_toolbar = 0; static const GTypeInfo ags_notation_toolbar_info = { sizeof (AgsNotationToolbarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_notation_toolbar_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsNotationToolbar), 0, /* n_preallocs */ (GInstanceInitFunc) ags_notation_toolbar_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_notation_toolbar_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_notation_toolbar = g_type_register_static(GTK_TYPE_TOOLBAR, "AgsNotationToolbar", &ags_notation_toolbar_info, 0); g_type_add_interface_static(ags_type_notation_toolbar, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_notation_toolbar); } return g_define_type_id__volatile; } void ags_notation_toolbar_class_init(AgsNotationToolbarClass *notation_toolbar) { /* empty */ } void ags_notation_toolbar_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_notation_toolbar_connect; connectable->disconnect = ags_notation_toolbar_disconnect; } void ags_notation_toolbar_init(AgsNotationToolbar *notation_toolbar) { GtkToolItem *tool_item; GtkLabel *label; GtkMenu *menu; GtkMenuItem *item; GtkHBox *hbox; notation_toolbar->flags = 0; /* position */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->position = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Position"), "stock-id", GTK_STOCK_JUMP_TO, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->position); /* edit */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->edit = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "stock-id", GTK_STOCK_EDIT, "active", TRUE, NULL); notation_toolbar->selected_edit_mode = notation_toolbar->edit; gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->edit); /* clear */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->clear = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "stock-id", GTK_STOCK_CLEAR, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->clear); /* select */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->select = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Select"), "stock-id", GTK_STOCK_SELECT_ALL, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->select); /* copy */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->copy = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_COPY, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->copy); /* cut */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->cut = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_CUT, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->cut); /* paste */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->paste_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "stock-id", GTK_STOCK_PASTE, NULL); menu = (GtkMenu *) gtk_menu_new(); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("match audio channel"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("no duplicates"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); gtk_menu_tool_button_set_menu(notation_toolbar->paste_tool, (GtkWidget *) menu); gtk_widget_show_all((GtkWidget *) menu); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->paste_tool); /* invert */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->invert = (GtkButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "icon-widget", (GtkWidget *) gtk_image_new_from_icon_name("object-flip-vertical", GTK_ICON_SIZE_LARGE_TOOLBAR), "label", i18n("Invert"), NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->invert); /* menu tool */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); notation_toolbar->menu_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "label", i18n("Tool"), "stock-id", GTK_STOCK_EXECUTE, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) notation_toolbar->menu_tool); /* menu tool - tool popup */ notation_toolbar->tool_popup = ags_notation_toolbar_tool_popup_new(notation_toolbar); gtk_menu_tool_button_set_menu(notation_toolbar->menu_tool, (GtkWidget *) notation_toolbar->tool_popup); /* menu tool - dialogs */ notation_toolbar->move_note = (GtkDialog *) ags_move_note_dialog_new(NULL); notation_toolbar->crop_note = (GtkDialog *) ags_crop_note_dialog_new(NULL); notation_toolbar->select_note = (GtkDialog *) ags_select_note_dialog_new(NULL); notation_toolbar->position_notation_cursor = (GtkDialog *) ags_position_notation_cursor_dialog_new(NULL); /* zoom */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("Zoom")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); notation_toolbar->zoom_history = 2; notation_toolbar->zoom = (GtkComboBoxText *) ags_zoom_combo_box_new(); gtk_combo_box_set_active((GtkComboBox *) notation_toolbar->zoom, 2); gtk_box_pack_start(hbox, (GtkWidget *) notation_toolbar->zoom, FALSE, FALSE, 0); /* opacity */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) notation_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("Opacity")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); notation_toolbar->opacity = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.001); gtk_spin_button_set_value(notation_toolbar->opacity, 0.8); gtk_box_pack_start(hbox, (GtkWidget *) notation_toolbar->opacity, FALSE, FALSE, 0); } void ags_notation_toolbar_connect(AgsConnectable *connectable) { AgsWindow *window; AgsNotationToolbar *notation_toolbar; GList *list; notation_toolbar = AGS_NOTATION_TOOLBAR(connectable); if((AGS_NOTATION_TOOLBAR_CONNECTED & (notation_toolbar->flags)) != 0){ return; } notation_toolbar->flags |= AGS_NOTATION_TOOLBAR_CONNECTED; window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) notation_toolbar, AGS_TYPE_WINDOW)); g_object_set(notation_toolbar->move_note, "main-window", window, NULL); g_object_set(notation_toolbar->crop_note, "main-window", window, NULL); g_object_set(notation_toolbar->select_note, "main-window", window, NULL); g_object_set(notation_toolbar->position_notation_cursor, "main-window", window, NULL); /* tool */ g_signal_connect_after((GObject *) notation_toolbar->position, "toggled", G_CALLBACK(ags_notation_toolbar_position_callback), (gpointer) notation_toolbar); g_signal_connect_after((GObject *) notation_toolbar->edit, "toggled", G_CALLBACK(ags_notation_toolbar_edit_callback), (gpointer) notation_toolbar); g_signal_connect_after((GObject *) notation_toolbar->clear, "toggled", G_CALLBACK(ags_notation_toolbar_clear_callback), (gpointer) notation_toolbar); g_signal_connect_after((GObject *) notation_toolbar->select, "toggled", G_CALLBACK(ags_notation_toolbar_select_callback), (gpointer) notation_toolbar); /* edit */ g_signal_connect((GObject *) notation_toolbar->copy, "clicked", G_CALLBACK(ags_notation_toolbar_copy_or_cut_callback), (gpointer) notation_toolbar); g_signal_connect((GObject *) notation_toolbar->cut, "clicked", G_CALLBACK(ags_notation_toolbar_copy_or_cut_callback), (gpointer) notation_toolbar); g_signal_connect((GObject *) notation_toolbar->paste_tool, "clicked", G_CALLBACK(ags_notation_toolbar_paste_callback), (gpointer) notation_toolbar); g_signal_connect((GObject *) notation_toolbar->invert, "clicked", G_CALLBACK(ags_notation_toolbar_invert_callback), (gpointer) notation_toolbar); list = gtk_container_get_children((GtkContainer *) gtk_menu_tool_button_get_menu(notation_toolbar->paste_tool)); g_signal_connect_after(list->data, "activate", G_CALLBACK(ags_notation_toolbar_match_audio_channel_callback), notation_toolbar); g_signal_connect_after(list->next->data, "activate", G_CALLBACK(ags_notation_toolbar_no_duplicates_callback), notation_toolbar); g_list_free(list); /* additional tools */ ags_connectable_connect(AGS_CONNECTABLE(notation_toolbar->position_notation_cursor)); ags_connectable_connect(AGS_CONNECTABLE(notation_toolbar->crop_note)); ags_connectable_connect(AGS_CONNECTABLE(notation_toolbar->move_note)); ags_connectable_connect(AGS_CONNECTABLE(notation_toolbar->select_note)); /* zoom */ g_signal_connect_after((GObject *) notation_toolbar->zoom, "changed", G_CALLBACK(ags_notation_toolbar_zoom_callback), (gpointer) notation_toolbar); /* opacity */ g_signal_connect_after((GObject *) notation_toolbar->opacity, "value-changed", G_CALLBACK(ags_notation_toolbar_opacity_callback), (gpointer) notation_toolbar); } void ags_notation_toolbar_disconnect(AgsConnectable *connectable) { AgsNotationToolbar *notation_toolbar; GList *list; notation_toolbar = AGS_NOTATION_TOOLBAR(connectable); if((AGS_NOTATION_TOOLBAR_CONNECTED & (notation_toolbar->flags)) == 0){ return; } notation_toolbar->flags &= (~AGS_NOTATION_TOOLBAR_CONNECTED); /* tool */ g_object_disconnect(G_OBJECT(notation_toolbar->position), "any_signal::toggled", G_CALLBACK(ags_notation_toolbar_position_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(notation_toolbar->edit), "any_signal::toggled", G_CALLBACK(ags_notation_toolbar_edit_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(notation_toolbar->clear), "any_signal::toggled", G_CALLBACK(ags_notation_toolbar_clear_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(notation_toolbar->select), "any_signal::toggled", G_CALLBACK(ags_notation_toolbar_select_callback), notation_toolbar, NULL); /* edit */ g_object_disconnect(G_OBJECT(notation_toolbar->copy), "any_signal::clicked", G_CALLBACK(ags_notation_toolbar_copy_or_cut_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(notation_toolbar->cut), "any_signal::clicked", G_CALLBACK(ags_notation_toolbar_copy_or_cut_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(notation_toolbar->paste_tool), "any_signal::clicked", G_CALLBACK(ags_notation_toolbar_paste_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(notation_toolbar->invert), "any_signal::clicked", G_CALLBACK(ags_notation_toolbar_invert_callback), notation_toolbar, NULL); list = gtk_container_get_children((GtkContainer *) gtk_menu_tool_button_get_menu(notation_toolbar->paste_tool)); g_object_disconnect(G_OBJECT(list->data), "any_signal::activate", G_CALLBACK(ags_notation_toolbar_match_audio_channel_callback), notation_toolbar, NULL); g_object_disconnect(G_OBJECT(list->next->data), "any_signal::activate", G_CALLBACK(ags_notation_toolbar_no_duplicates_callback), notation_toolbar, NULL); g_list_free(list); /* additional tools */ ags_connectable_disconnect(AGS_CONNECTABLE(notation_toolbar->position_notation_cursor)); ags_connectable_disconnect(AGS_CONNECTABLE(notation_toolbar->crop_note)); ags_connectable_disconnect(AGS_CONNECTABLE(notation_toolbar->move_note)); ags_connectable_disconnect(AGS_CONNECTABLE(notation_toolbar->select_note)); /* zoom */ g_object_disconnect(G_OBJECT(notation_toolbar->zoom), "any_signal::changed", G_CALLBACK(ags_notation_toolbar_zoom_callback), notation_toolbar, NULL); /* opacity */ g_object_disconnect(G_OBJECT(notation_toolbar->opacity), "any_signal::value-changed", G_CALLBACK(ags_notation_toolbar_opacity_callback), notation_toolbar, NULL); } /** * ags_notation_toolbar_tool_popup_new: * @notation_toolbar: the #AgsNotationToolbar * * Create a new #GtkMenu suitable for menu tool button. * * Returns: a new #GtkMenu * * Since: 3.0.0 */ GtkMenu* ags_notation_toolbar_tool_popup_new(AgsNotationToolbar *notation_toolbar) { GtkMenu *tool_popup; GtkMenuItem *item; GList *list, *list_start; tool_popup = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("move notes")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("crop notes")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("select notes")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); gtk_menu_shell_append((GtkMenuShell*) tool_popup, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("enable all audio channels")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("disable all audio channels")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); /* connect */ list_start = list = gtk_container_get_children((GtkContainer *) tool_popup); g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_notation_toolbar_tool_popup_move_note_callback), (gpointer) notation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_notation_toolbar_tool_popup_crop_note_callback), (gpointer) notation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_notation_toolbar_tool_popup_select_note_callback), (gpointer) notation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_notation_toolbar_tool_popup_position_cursor_callback), (gpointer) notation_toolbar); list = list->next->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_notation_toolbar_tool_popup_enable_all_lines_callback), (gpointer) notation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_notation_toolbar_tool_popup_disable_all_lines_callback), (gpointer) notation_toolbar); g_list_free(list_start); /* show */ gtk_widget_show_all((GtkWidget *) tool_popup); return(tool_popup); } /** * ags_notation_toolbar_new: * * Create a new #AgsNotationToolbar. * * Returns: a new #AgsNotationToolbar * * Since: 3.0.0 */ AgsNotationToolbar* ags_notation_toolbar_new() { AgsNotationToolbar *notation_toolbar; notation_toolbar = (AgsNotationToolbar *) g_object_new(AGS_TYPE_NOTATION_TOOLBAR, NULL); return(notation_toolbar); } gsequencer-3.1.3/ags/X/editor/ags_automation_meta.c0000644000175000017500000007124113617035271017245 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_automation_meta_class_init(AgsAutomationMetaClass *automation_meta); void ags_automation_meta_connectable_interface_init(AgsConnectableInterface *connectable); void ags_automation_meta_init(AgsAutomationMeta *automation_meta); void ags_automation_meta_connect(AgsConnectable *connectable); void ags_automation_meta_disconnect(AgsConnectable *connectable); /** * SECTION:ags_automation_meta * @short_description: automation_meta * @title: AgsAutomationMeta * @section_id: * @include: ags/X/editor/ags_automation_meta.h * * The #AgsAutomationMeta provides you information about automation editor. */ GType ags_automation_meta_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation_meta = 0; static const GTypeInfo ags_automation_meta_info = { sizeof (AgsAutomationMetaClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_automation_meta_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAutomationMeta), 0, /* n_preallocs */ (GInstanceInitFunc) ags_automation_meta_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_automation_meta_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_automation_meta = g_type_register_static(GTK_TYPE_VBOX, "AgsAutomationMeta", &ags_automation_meta_info, 0); g_type_add_interface_static(ags_type_automation_meta, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation_meta); } return g_define_type_id__volatile; } void ags_automation_meta_class_init(AgsAutomationMetaClass *automation_meta) { /* empty */ } void ags_automation_meta_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_automation_meta_connect; connectable->disconnect = ags_automation_meta_disconnect; } void ags_automation_meta_init(AgsAutomationMeta *automation_meta) { GtkGrid *grid; GtkLabel *label; guint i; guint j; automation_meta->flags = 0; grid = gtk_grid_new(); gtk_box_pack_start((GtkBox *) automation_meta, (GtkWidget *) grid, FALSE, TRUE, 0); /* machine type */ i = 0; label = (GtkLabel *) gtk_label_new(i18n("machine type: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->machine_type = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->machine_type, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->machine_type, 1, i, 1, 1); /* machine name */ i++; label = (GtkLabel *) gtk_label_new(i18n("machine name: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->machine_name = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->machine_name, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->machine_name, 1, i, 1, 1); /* audio channels */ i++; label = (GtkLabel *) gtk_label_new(i18n("audio channels: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->audio_channels = (GtkLabel *) gtk_label_new("-1"); g_object_set(automation_meta->audio_channels, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->audio_channels, 1, i, 1, 1); /* output pads */ i++; label = (GtkLabel *) gtk_label_new(i18n("output pads: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->output_pads = (GtkLabel *) gtk_label_new("-1"); g_object_set(automation_meta->output_pads, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->output_pads, 1, i, 1, 1); /* input pads */ i++; label = (GtkLabel *) gtk_label_new(i18n("input pads: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->input_pads = (GtkLabel *) gtk_label_new("-1"); g_object_set(automation_meta->input_pads, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->input_pads, 1, i, 1, 1); /* editor tool */ i++; label = (GtkLabel *) gtk_label_new(i18n("editor tool: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->editor_tool = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->editor_tool, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->editor_tool, 1, i, 1, 1); /* active audio channel */ i++; label = (GtkLabel *) gtk_label_new(i18n("active audio channel: ")); g_object_set(label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->active_audio_channel = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->active_audio_channel, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->active_audio_channel, 1, i, 1, 1); /* active port */ i++; label = (GtkLabel *) gtk_label_new(i18n("active port: ")); g_object_set(label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->active_port = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->active_port, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->active_port, 1, i, 1, 1); /* focused port */ i++; label = (GtkLabel *) gtk_label_new(i18n("focused port: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->focused_port = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->focused_port, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->focused_port, 1, i, 1, 1); /* range upper */ i++; label = (GtkLabel *) gtk_label_new(i18n("range upper: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->range_upper = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->range_upper, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->range_upper, 1, i, 1, 1); /* range lower */ i++; label = (GtkLabel *) gtk_label_new(i18n("range lower: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->range_lower = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->range_lower, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->range_lower, 1, i, 1, 1); /* cursor x-position */ i++; label = (GtkLabel *) gtk_label_new(i18n("cursor x-position: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->cursor_x_position = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->cursor_x_position, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->cursor_x_position, 1, i, 1, 1); /* cursor y-position */ i++; label = (GtkLabel *) gtk_label_new(i18n("cursor y-position: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->cursor_y_position = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->cursor_y_position, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->cursor_y_position, 1, i, 1, 1); /* current acceleration */ i++; label = (GtkLabel *) gtk_label_new(i18n("current acceleration: ")); g_object_set(label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); automation_meta->current_acceleration = (GtkLabel *) gtk_label_new("(null)"); g_object_set(automation_meta->current_acceleration, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) automation_meta->current_acceleration, 1, i, 1, 1); } void ags_automation_meta_connect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsAutomationMeta *automation_meta; automation_meta = AGS_AUTOMATION_META(connectable); if((AGS_AUTOMATION_META_CONNECTED & (automation_meta->flags)) != 0){ return; } automation_meta->flags |= AGS_AUTOMATION_META_CONNECTED; automation_editor = gtk_widget_get_ancestor(automation_meta, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor != NULL){ g_signal_connect_after(automation_editor, "machine-changed", G_CALLBACK(ags_automation_meta_machine_changed_callback), automation_meta); } } void ags_automation_meta_disconnect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsAutomationMeta *automation_meta; automation_meta = AGS_AUTOMATION_META(connectable); if((AGS_AUTOMATION_META_CONNECTED & (automation_meta->flags)) == 0){ return; } automation_meta->flags &= (~AGS_AUTOMATION_META_CONNECTED); automation_editor = gtk_widget_get_ancestor(automation_meta, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor != NULL){ g_object_disconnect(automation_editor, "any_signal::machine-changed", G_CALLBACK(ags_automation_meta_machine_changed_callback), automation_meta, NULL); } } /** * ags_automation_meta_refresh: * @automation_meta: the #AgsAutomationMeta * * Refresh @automation_meta. * * Since: 3.1.0 */ void ags_automation_meta_refresh(AgsAutomationMeta *automation_meta) { AgsAutomationEditor *automation_editor; if(!AGS_IS_AUTOMATION_META(automation_meta)){ return; } automation_editor = gtk_widget_get_ancestor(automation_meta, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor == NULL){ return; } if(automation_editor->selected_machine == NULL){ gtk_label_set_label(automation_meta->machine_type, "(null)"); gtk_label_set_label(automation_meta->machine_name, "(null)"); gtk_label_set_label(automation_meta->audio_channels, "-1"); gtk_label_set_label(automation_meta->output_pads, "-1"); gtk_label_set_label(automation_meta->input_pads, "-1"); gtk_label_set_label(automation_meta->editor_tool, "(null)"); gtk_label_set_label(automation_meta->active_audio_channel, "(null)"); gtk_label_set_label(automation_meta->active_port, "(null)"); gtk_label_set_label(automation_meta->focused_port, "(null)"); gtk_label_set_label(automation_meta->range_upper, "0.0"); gtk_label_set_label(automation_meta->range_lower, "0.0"); gtk_label_set_label(automation_meta->cursor_x_position, "-1"); gtk_label_set_label(automation_meta->cursor_y_position, "-1"); gtk_label_set_label(automation_meta->current_acceleration, "(null)"); }else{ AgsNotebook *notebook; AgsTimestamp *timestamp; GList *start_port, *port; GList *start_automation, *automation; GList *start_acceleration, *acceleration; gchar **collected_specifier; gchar *str; guint audio_channels; guint output_pads, input_pads; gint active_start, active_end; gint position; guint length; guint x0, y0; guint x1, y1; guint i, i_stop; guint j, j_stop; gtk_label_set_label(automation_meta->machine_type, G_OBJECT_TYPE_NAME(automation_editor->selected_machine)); gtk_label_set_label(automation_meta->machine_name, automation_editor->selected_machine->machine_name); g_object_get(automation_editor->selected_machine->audio, "audio-channels", &audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, NULL); /* audio channels */ str = g_strdup_printf("%u", audio_channels); gtk_label_set_label(automation_meta->audio_channels, str); g_free(str); /* output pads */ str = g_strdup_printf("%u", output_pads); gtk_label_set_label(automation_meta->output_pads, str); g_free(str); /* input pads */ str = g_strdup_printf("%u", input_pads); gtk_label_set_label(automation_meta->input_pads, str); g_free(str); str = NULL; if(automation_editor->automation_toolbar->selected_edit_mode == automation_editor->automation_toolbar->position){ str = i18n("position"); }else if(automation_editor->automation_toolbar->selected_edit_mode == automation_editor->automation_toolbar->edit){ str = i18n("edit"); }else if(automation_editor->automation_toolbar->selected_edit_mode == automation_editor->automation_toolbar->clear){ str = i18n("clear"); }else if(automation_editor->automation_toolbar->selected_edit_mode == automation_editor->automation_toolbar->select){ str = i18n("select"); } if(str != NULL){ gtk_label_set_label(automation_meta->editor_tool, str); }else{ gtk_label_set_label(automation_meta->editor_tool, "(null)"); } /* active audio channels */ notebook = NULL; if(gtk_notebook_get_current_page(automation_editor->notebook) == 1){ notebook = automation_editor->output_notebook; }else if(gtk_notebook_get_current_page(automation_editor->notebook) == 2){ notebook = automation_editor->input_notebook; } str = NULL; if(notebook != NULL){ for(i = 0; i < audio_channels; i++){ gchar *current_str; guint active_prev; gboolean found; active_start = -1; active_end = -1; active_prev = -1; position = i; current_str = NULL; found = FALSE; for(; (position = ags_notebook_next_active_tab(notebook, position)) != -1;){ if(position % audio_channels != i){ position++; }else{ found = TRUE; if(active_start == -1){ active_start = position; active_end = position; }else{ if(active_prev != -1 && active_prev + audio_channels != position){ if(current_str == NULL){ if(active_start == active_end){ current_str = g_strdup_printf("%d", active_start); }else{ current_str = g_strdup_printf("%d-%d", active_start, active_end); } }else{ if(active_start == active_end){ gchar *tmp; tmp = g_strdup_printf("%s, %d", current_str, active_start); g_free(current_str); current_str = tmp; }else{ gchar *tmp; tmp = g_strdup_printf("%s, %d-%d", current_str, active_start, active_end); g_free(current_str); current_str = tmp; } } active_start = position; active_end = position; } } active_prev = position; active_end = position; position += audio_channels; } } if(active_start == -1){ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> (null)", i); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> (null)", str, i); g_free(str); str = tmp; } }else{ if(active_start == active_end){ if(current_str == NULL){ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> [%d]", i, active_start); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> [%d]", str, i, active_start); g_free(str); str = tmp; } }else{ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> [%s, %d]", i, current_str, active_start); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> [%s, %d]", str, i, current_str, active_start); g_free(str); str = tmp; } g_free(current_str); } }else{ if(current_str == NULL){ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> [%d-%d]", i, active_start, active_end); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> [%d-%d]", str, i, active_start, active_end); g_free(str); str = tmp; } }else{ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> [%s, %d-%d]", i, current_str, active_start, active_end); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> [%s, %d-%d]", str, i, current_str, active_start, active_end); g_free(str); str = tmp; } g_free(current_str); } } } } } if(str == NULL){ gtk_label_set_label(automation_meta->active_audio_channel, "(null)"); }else{ gchar *tmp; tmp = g_strdup_printf("[%s]", str); gtk_label_set_label(automation_meta->active_audio_channel, tmp); g_free(str); g_free(tmp); } /* active port */ start_port = NULL; if(notebook == NULL){ start_port = ags_audio_collect_all_audio_ports(automation_editor->selected_machine->audio); }else{ AgsChannel *start_channel, *channel; if(notebook == automation_editor->output_notebook){ g_object_get(automation_editor->selected_machine->audio, "output", &start_channel, NULL); }else if(notebook == automation_editor->input_notebook){ g_object_get(automation_editor->selected_machine->audio, "input", &start_channel, NULL); } channel = start_channel; start_port = NULL; while(channel != NULL){ AgsChannel *next_channel; GList *list; list = ags_channel_collect_all_channel_ports(channel); if(start_port == NULL){ start_port = list; }else{ start_port = g_list_concat(start_port, list); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } port = start_port; collected_specifier = (gchar **) malloc(sizeof(gchar*)); collected_specifier[0] = NULL; length = 1; str = NULL; while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); contains_control_name = g_strv_contains(collected_specifier, specifier); if(plugin_port != NULL && !contains_control_name){ is_enabled = FALSE; if(notebook == NULL){ is_enabled = (ags_machine_automation_port_find_channel_type_with_control_name(automation_editor->selected_machine->enabled_automation_port, G_TYPE_NONE, specifier)) ? TRUE: FALSE; }else if(notebook == automation_editor->output_notebook){ is_enabled = (ags_machine_automation_port_find_channel_type_with_control_name(automation_editor->selected_machine->enabled_automation_port, AGS_TYPE_OUTPUT, specifier)) ? TRUE: FALSE; }else if(notebook == automation_editor->input_notebook){ is_enabled = (ags_machine_automation_port_find_channel_type_with_control_name(automation_editor->selected_machine->enabled_automation_port, AGS_TYPE_INPUT, specifier)) ? TRUE: FALSE; } /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; if(is_enabled){ if(str == NULL){ str = specifier; }else{ gchar *tmp; tmp = g_strdup_printf("%s, %s", str, specifier); g_free(specifier); g_free(str); str = tmp; } } } if(plugin_port != NULL){ g_object_unref(plugin_port); } port = port->next; } if(str == NULL){ gtk_label_set_label(automation_meta->active_port, "(null)"); }else{ gchar *tmp; tmp = g_strdup_printf("(%s)", str); gtk_label_set_label(automation_meta->active_port, tmp); g_free(str); g_free(tmp); } /* focus related */ if(automation_editor->focused_automation_edit == NULL){ gtk_label_set_label(automation_meta->focused_port, "(null)"); gtk_label_set_label(automation_meta->range_upper, "0.0"); gtk_label_set_label(automation_meta->range_lower, "0.0"); gtk_label_set_label(automation_meta->cursor_x_position, "-1"); gtk_label_set_label(automation_meta->cursor_y_position, "-1"); gtk_label_set_label(automation_meta->current_acceleration, "(null)"); }else{ GType channel_type; /* focused port */ gtk_label_set_label(automation_meta->focused_port, automation_editor->focused_automation_edit->control_specifier); /* upper */ str = g_strdup_printf("%f", automation_editor->focused_automation_edit->upper); gtk_label_set_label(automation_meta->range_upper, str); g_free(str); /* lower */ str = g_strdup_printf("%f", automation_editor->focused_automation_edit->lower); gtk_label_set_label(automation_meta->range_lower, str); g_free(str); /* cursor x-position */ str = g_strdup_printf("%f", (double) automation_editor->focused_automation_edit->cursor_position_x / (double) AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH); gtk_label_set_label(automation_meta->cursor_x_position, str); g_free(str); /* cursor y-position */ str = g_strdup_printf("%f", automation_editor->focused_automation_edit->cursor_position_y); gtk_label_set_label(automation_meta->cursor_y_position, str); g_free(str); /* current acceleration */ g_object_get(automation_editor->selected_machine->audio, "automation", &start_automation, NULL); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; x0 = automation_editor->focused_automation_edit->cursor_position_x; y0 = automation_editor->focused_automation_edit->lower; x1 = x0 + (exp2(6.0 - (double) gtk_combo_box_get_active(automation_editor->automation_toolbar->zoom)) * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH); y1 = automation_editor->focused_automation_edit->upper; str = NULL; i_stop = 0; if(notebook == NULL){ i_stop = 1; j_stop = 1; channel_type = G_TYPE_NONE; }else if(notebook == automation_editor->output_notebook){ g_object_get(automation_editor->selected_machine->audio, "audio-channels", &i_stop, "output-pads", &j_stop, NULL); channel_type = AGS_TYPE_OUTPUT; }else if(notebook == automation_editor->input_notebook){ g_object_get(automation_editor->selected_machine->audio, "audio-channels", &i_stop, "input-pads", &j_stop, NULL); channel_type = AGS_TYPE_INPUT; } for(i = 0; i < i_stop; i++){ gchar *current_str; timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(x0 / AGS_AUTOMATION_DEFAULT_OFFSET); position = i; current_str = NULL; for(j = 0; j < j_stop;){ gboolean j_success; position = ags_notebook_next_active_tab(notebook, position); if(position == -1){ break; } j = (guint) floor(position / i_stop); if(position % i_stop != i){ position++; continue; } j_success = FALSE; ags_automation_meta_refresh_CURRENT_ACCELERATION_TIMESTAMP_NO2: automation = start_automation; while((automation = ags_automation_find_near_timestamp_extended(automation, position, channel_type, automation_editor->focused_automation_edit->control_specifier, timestamp)) != NULL){ start_acceleration = ags_automation_find_region(automation->data, x0, y0, x1, y1, FALSE); acceleration = start_acceleration; while(acceleration != NULL){ guint x; gdouble y; g_object_get(acceleration->data, "x", &x, "y", &y, NULL); if(current_str == NULL){ current_str = g_strdup_printf("\n @line[%u] -> {%u|%f", j, x, y); }else{ gchar *tmp; if(!j_success){ tmp = g_strdup_printf("%s,\n @line[%u] -> {%u|%f", current_str, j, x, y); }else{ tmp = g_strdup_printf("%s, %u|%f", current_str, x, y); } g_free(current_str); current_str = tmp; } j_success = TRUE; acceleration = acceleration->next; } automation = automation->next; } if(timestamp->timer.ags_offset.offset < AGS_AUTOMATION_DEFAULT_OFFSET * floor(x1 / AGS_AUTOMATION_DEFAULT_OFFSET)){ timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(x1 / AGS_AUTOMATION_DEFAULT_OFFSET); goto ags_automation_meta_refresh_CURRENT_ACCELERATION_TIMESTAMP_NO2; } if(j_success){ gchar *tmp; tmp = g_strdup_printf("%s}", current_str); g_free(current_str); current_str = tmp; } j++; position++; } if(current_str == NULL){ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> (null)", i); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> (null)", str, i); g_free(str); str = tmp; } }else{ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> {%s}", i, current_str); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> {%s}", str, i, current_str); g_free(str); str = tmp; } g_free(current_str); } } g_list_free_full(start_automation, (GDestroyNotify) g_object_unref); if(str == NULL){ gtk_label_set_label(automation_meta->current_acceleration, "(null)"); }else{ gchar *tmp; tmp = g_strdup_printf("[%s]", str); gtk_label_set_label(automation_meta->current_acceleration, tmp); g_free(str); g_free(tmp); } g_object_unref(timestamp); } } } /** * ags_automation_meta_new: * * Create a new #AgsAutomationMeta. * * Returns: a new #AgsAutomationMeta * * Since: 3.1.0 */ AgsAutomationMeta* ags_automation_meta_new() { AgsAutomationMeta *automation_meta; automation_meta = (AgsAutomationMeta *) g_object_new(AGS_TYPE_AUTOMATION_META, NULL); return(automation_meta); } gsequencer-3.1.3/ags/X/editor/ags_wave_meta.c0000644000175000017500000003126613616617253016037 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_wave_meta_class_init(AgsWaveMetaClass *wave_meta); void ags_wave_meta_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wave_meta_init(AgsWaveMeta *wave_meta); void ags_wave_meta_connect(AgsConnectable *connectable); void ags_wave_meta_disconnect(AgsConnectable *connectable); /** * SECTION:ags_wave_meta * @short_description: wave_meta * @title: AgsWaveMeta * @section_id: * @include: ags/X/editor/ags_wave_meta.h * * The #AgsWaveMeta provides you information about wave editor. */ GType ags_wave_meta_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_meta = 0; static const GTypeInfo ags_wave_meta_info = { sizeof (AgsWaveMetaClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_meta_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveMeta), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_meta_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wave_meta_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wave_meta = g_type_register_static(GTK_TYPE_VBOX, "AgsWaveMeta", &ags_wave_meta_info, 0); g_type_add_interface_static(ags_type_wave_meta, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_meta); } return g_define_type_id__volatile; } void ags_wave_meta_class_init(AgsWaveMetaClass *wave_meta) { /* empty */ } void ags_wave_meta_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_wave_meta_connect; connectable->disconnect = ags_wave_meta_disconnect; } void ags_wave_meta_init(AgsWaveMeta *wave_meta) { GtkGrid *grid; GtkLabel *label; guint i; wave_meta->flags = 0; grid = gtk_grid_new(); gtk_box_pack_start((GtkBox *) wave_meta, (GtkWidget *) grid, FALSE, TRUE, 0); /* machine type */ i = 0; label = (GtkLabel *) gtk_label_new(i18n("machine type: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->machine_type = (GtkLabel *) gtk_label_new("(null)"); g_object_set(wave_meta->machine_type, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->machine_type, 1, i, 1, 1); /* machine name */ i++; label = (GtkLabel *) gtk_label_new(i18n("machine name: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->machine_name = (GtkLabel *) gtk_label_new("(null)"); g_object_set(wave_meta->machine_name, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->machine_name, 1, i, 1, 1); /* audio channels */ i++; label = (GtkLabel *) gtk_label_new(i18n("audio channels: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->audio_channels = (GtkLabel *) gtk_label_new("-1"); g_object_set(wave_meta->audio_channels, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->audio_channels, 1, i, 1, 1); /* output pads */ i++; label = (GtkLabel *) gtk_label_new(i18n("output pads: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->output_pads = (GtkLabel *) gtk_label_new("-1"); g_object_set(wave_meta->output_pads, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->output_pads, 1, i, 1, 1); /* input pads */ i++; label = (GtkLabel *) gtk_label_new(i18n("input pads: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->input_pads = (GtkLabel *) gtk_label_new("-1"); g_object_set(wave_meta->input_pads, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->input_pads, 1, i, 1, 1); /* editor tool */ i++; label = (GtkLabel *) gtk_label_new(i18n("editor tool: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->editor_tool = (GtkLabel *) gtk_label_new("(null)"); g_object_set(wave_meta->editor_tool, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->editor_tool, 1, i, 1, 1); /* active audio channel */ i++; label = (GtkLabel *) gtk_label_new(i18n("active audio channel: ")); g_object_set(label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->active_audio_channel = (GtkLabel *) gtk_label_new("(null)"); g_object_set(wave_meta->active_audio_channel, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->active_audio_channel, 1, i, 1, 1); /* cursor x-position */ i++; label = (GtkLabel *) gtk_label_new(i18n("cursor x-position: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); wave_meta->cursor_x_position = (GtkLabel *) gtk_label_new("-1"); g_object_set(wave_meta->cursor_x_position, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) wave_meta->cursor_x_position, 1, i, 1, 1); } void ags_wave_meta_connect(AgsConnectable *connectable) { AgsWaveEditor *wave_editor; AgsWaveMeta *wave_meta; wave_meta = AGS_WAVE_META(connectable); if((AGS_WAVE_META_CONNECTED & (wave_meta->flags)) != 0){ return; } wave_meta->flags |= AGS_WAVE_META_CONNECTED; wave_editor = gtk_widget_get_ancestor(wave_meta, AGS_TYPE_WAVE_EDITOR); if(wave_editor != NULL){ g_signal_connect_after(wave_editor, "machine-changed", G_CALLBACK(ags_wave_meta_machine_changed_callback), wave_meta); } } void ags_wave_meta_disconnect(AgsConnectable *connectable) { AgsWaveEditor *wave_editor; AgsWaveMeta *wave_meta; wave_meta = AGS_WAVE_META(connectable); if((AGS_WAVE_META_CONNECTED & (wave_meta->flags)) == 0){ return; } wave_meta->flags &= (~AGS_WAVE_META_CONNECTED); wave_editor = gtk_widget_get_ancestor(wave_meta, AGS_TYPE_WAVE_EDITOR); if(wave_editor != NULL){ g_object_disconnect(wave_editor, "any_signal::machine-changed", G_CALLBACK(ags_wave_meta_machine_changed_callback), wave_meta, NULL); } } /** * ags_wave_meta_refresh: * @wave_meta: the #AgsWaveMeta * * Refresh @wave_meta. * * Since: 3.1.0 */ void ags_wave_meta_refresh(AgsWaveMeta *wave_meta) { AgsWaveEditor *wave_editor; if(!AGS_IS_WAVE_META(wave_meta)){ return; } wave_editor = gtk_widget_get_ancestor(wave_meta, AGS_TYPE_WAVE_EDITOR); if(wave_editor == NULL){ return; } if(wave_editor->selected_machine == NULL){ gtk_label_set_label(wave_meta->machine_type, "(null)"); gtk_label_set_label(wave_meta->machine_name, "(null)"); gtk_label_set_label(wave_meta->audio_channels, "-1"); gtk_label_set_label(wave_meta->output_pads, "-1"); gtk_label_set_label(wave_meta->input_pads, "-1"); gtk_label_set_label(wave_meta->editor_tool, "(null)"); gtk_label_set_label(wave_meta->active_audio_channel, "(null)"); gtk_label_set_label(wave_meta->cursor_x_position, "-1"); }else{ gchar *str; guint audio_channels; guint output_pads, input_pads; gint active_start, active_end; gint position; guint i; gtk_label_set_label(wave_meta->machine_type, G_OBJECT_TYPE_NAME(wave_editor->selected_machine)); gtk_label_set_label(wave_meta->machine_name, wave_editor->selected_machine->machine_name); g_object_get(wave_editor->selected_machine->audio, "audio-channels", &audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, NULL); /* audio channels */ str = g_strdup_printf("%u", audio_channels); gtk_label_set_label(wave_meta->audio_channels, str); g_free(str); /* output pads */ str = g_strdup_printf("%u", output_pads); gtk_label_set_label(wave_meta->output_pads, str); g_free(str); /* input pads */ str = g_strdup_printf("%u", input_pads); gtk_label_set_label(wave_meta->input_pads, str); g_free(str); str = NULL; if(wave_editor->wave_toolbar->selected_edit_mode == wave_editor->wave_toolbar->position){ str = i18n("position"); }else if(wave_editor->wave_toolbar->selected_edit_mode == wave_editor->wave_toolbar->select){ str = i18n("select"); } if(str != NULL){ gtk_label_set_label(wave_meta->editor_tool, str); }else{ gtk_label_set_label(wave_meta->editor_tool, "(null)"); } /* active audio channels */ str = NULL; active_start = -1; active_end = -1; position = 0; for(; (position = ags_notebook_next_active_tab(wave_editor->notebook, position)) != -1; position++){ if(active_start == -1){ active_start = position; active_end = position; }else{ if(position == active_end + 1){ active_end = position; }else{ if(str == NULL){ if(active_start == active_end){ str = g_strdup_printf("%d", active_start); }else{ str = g_strdup_printf("%d-%d", active_start, active_end); } }else{ if(active_start == active_end){ gchar *tmp; tmp = g_strdup_printf("%s, %d", str, active_start); g_free(str); str = tmp; }else{ gchar *tmp; tmp = g_strdup_printf("%s, %d-%d", str, active_start, active_end); g_free(str); str = tmp; } } active_start = position; active_end = position; } } } if(active_start == -1){ gtk_label_set_label(wave_meta->active_audio_channel, "(null)"); }else{ if(str == NULL){ if(active_start == active_end){ str = g_strdup_printf("[%d]", active_start); }else{ gchar *tmp; tmp = g_strdup_printf("[%d-%d]", active_start, active_end); g_free(str); str = tmp; } }else{ if(active_start == active_end){ gchar *tmp; tmp = g_strdup_printf("[%s, %d]", str, active_start); g_free(str); str = tmp; }else{ gchar *tmp; tmp = g_strdup_printf("[%s, %d-%d]", str, active_start, active_end); g_free(str); str = tmp; } } gtk_label_set_label(wave_meta->active_audio_channel, str); g_free(str); } /* cursor position x */ if(wave_editor->focused_wave_edit == NULL){ gtk_label_set_label(wave_meta->cursor_x_position, "-1"); }else{ str = g_strdup_printf("%u", wave_editor->focused_wave_edit->cursor_position_x); gtk_label_set_label(wave_meta->cursor_x_position, str); g_free(str); } } } /** * ags_wave_meta_new: * * Create a new #AgsWaveMeta. * * Returns: a new #AgsWaveMeta * * Since: 3.1.0 */ AgsWaveMeta* ags_wave_meta_new() { AgsWaveMeta *wave_meta; wave_meta = (AgsWaveMeta *) g_object_new(AGS_TYPE_WAVE_META, NULL); return(wave_meta); } gsequencer-3.1.3/ags/X/editor/ags_machine_radio_button_callbacks.c0000644000175000017500000000225313605312646022231 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_machine_radio_button_notify_machine_name_callback(GObject *machine, GParamSpec *pspec, AgsMachineRadioButton *machine_radio_button) { gchar *str; str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(machine), AGS_MACHINE(machine)->machine_name); g_object_set(machine_radio_button, "label", str, NULL); g_free(str); } gsequencer-3.1.3/ags/X/editor/ags_notation_toolbar.h0000644000175000017500000000536313616617253017450 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_TOOLBAR_H__ #define __AGS_NOTATION_TOOLBAR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NOTATION_TOOLBAR (ags_notation_toolbar_get_type()) #define AGS_NOTATION_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTATION_TOOLBAR, AgsNotationToolbar)) #define AGS_NOTATION_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTATION_TOOLBAR, AgsNotationToolbarClass)) #define AGS_IS_NOTATION_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_NOTATION_TOOLBAR)) #define AGS_IS_NOTATION_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_NOTATION_TOOLBAR)) #define AGS_NOTATION_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_NOTATION_TOOLBAR, AgsNotationToolbarClass)) typedef struct _AgsNotationToolbar AgsNotationToolbar; typedef struct _AgsNotationToolbarClass AgsNotationToolbarClass; typedef enum{ AGS_NOTATION_TOOLBAR_CONNECTED = 1, }AgsNotationToolbarFlags; struct _AgsNotationToolbar { GtkToolbar toolbar; guint flags; GtkToggleToolButton *selected_edit_mode; GtkToggleToolButton *position; GtkToggleToolButton *edit; GtkToggleToolButton *clear; GtkToggleToolButton *select; GtkToolButton *copy; GtkToolButton *cut; GtkMenuToolButton *paste_tool; GtkButton *invert; GtkMenuToolButton *menu_tool; GtkMenu *tool_popup; GtkDialog *move_note; GtkDialog *crop_note; GtkDialog *select_note; GtkDialog *position_notation_cursor; guint zoom_history; GtkComboBoxText *zoom; GtkSpinButton *opacity; }; struct _AgsNotationToolbarClass { GtkToolbarClass toolbar; }; GType ags_notation_toolbar_get_type(void); GtkMenu* ags_notation_toolbar_tool_popup_new(AgsNotationToolbar *notation_toolbar); AgsNotationToolbar* ags_notation_toolbar_new(); G_END_DECLS #endif /*__AGS_NOTATION_TOOLBAR_H__*/ gsequencer-3.1.3/ags/X/editor/ags_move_note_dialog.c0000644000175000017500000003620213607210263017362 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_move_note_dialog_class_init(AgsMoveNoteDialogClass *move_note_dialog); void ags_move_note_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_move_note_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_move_note_dialog_init(AgsMoveNoteDialog *move_note_dialog); void ags_move_note_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_move_note_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_move_note_dialog_finalize(GObject *gobject); void ags_move_note_dialog_connect(AgsConnectable *connectable); void ags_move_note_dialog_disconnect(AgsConnectable *connectable); void ags_move_note_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_move_note_dialog_apply(AgsApplicable *applicable); void ags_move_note_dialog_reset(AgsApplicable *applicable); gboolean ags_move_note_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_move_note_dialog * @short_description: move tool * @title: AgsMoveNoteDialog * @section_id: * @include: ags/X/editor/ags_move_note_dialog.h * * The #AgsMoveNoteDialog lets you move notes. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_move_note_dialog_parent_class = NULL; GType ags_move_note_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_move_note_dialog = 0; static const GTypeInfo ags_move_note_dialog_info = { sizeof (AgsMoveNoteDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_move_note_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMoveNoteDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_move_note_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_move_note_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_move_note_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_move_note_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsMoveNoteDialog", &ags_move_note_dialog_info, 0); g_type_add_interface_static(ags_type_move_note_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_move_note_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_move_note_dialog); } return g_define_type_id__volatile; } void ags_move_note_dialog_class_init(AgsMoveNoteDialogClass *move_note_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_move_note_dialog_parent_class = g_type_class_peek_parent(move_note_dialog); /* GObjectClass */ gobject = (GObjectClass *) move_note_dialog; gobject->set_property = ags_move_note_dialog_set_property; gobject->get_property = ags_move_note_dialog_get_property; gobject->finalize = ags_move_note_dialog_finalize; /* properties */ /** * AgsMoveNoteDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) move_note_dialog; widget->delete_event = ags_move_note_dialog_delete_event; } void ags_move_note_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_move_note_dialog_connect; connectable->disconnect = ags_move_note_dialog_disconnect; } void ags_move_note_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_move_note_dialog_set_update; applicable->apply = ags_move_note_dialog_apply; applicable->reset = ags_move_note_dialog_reset; } void ags_move_note_dialog_init(AgsMoveNoteDialog *move_note_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; move_note_dialog->flags = 0; g_object_set(move_note_dialog, "title", i18n("move notes"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(move_note_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* radio - relative */ move_note_dialog->relative = (GtkRadioButton *) gtk_radio_button_new_with_label(NULL, i18n("relative")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) move_note_dialog->relative, FALSE, FALSE, 0); /* radio - absolute */ move_note_dialog->absolute = (GtkRadioButton *) gtk_radio_button_new_with_label(gtk_radio_button_get_group(move_note_dialog->relative), i18n("absolute")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) move_note_dialog->absolute, FALSE, FALSE, 0); /* move x - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* move x - label */ label = (GtkLabel *) gtk_label_new(i18n("move x")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* move x - spin button */ move_note_dialog->move_x = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0 * AGS_MOVE_NOTE_DIALOG_MAX_X, AGS_MOVE_NOTE_DIALOG_MAX_X, 1.0); gtk_spin_button_set_value(move_note_dialog->move_x, 0.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) move_note_dialog->move_x, FALSE, FALSE, 0); /* move y - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* move y - label */ label = (GtkLabel *) gtk_label_new(i18n("move y")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* move y - spin button */ move_note_dialog->move_y = (GtkSpinButton *) gtk_spin_button_new_with_range(-1.0 * AGS_MOVE_NOTE_DIALOG_MAX_Y, AGS_MOVE_NOTE_DIALOG_MAX_Y, 1.0); gtk_spin_button_set_value(move_note_dialog->move_y, 0.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) move_note_dialog->move_y, FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) move_note_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_move_note_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMoveNoteDialog *move_note_dialog; move_note_dialog = AGS_MOVE_NOTE_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) move_note_dialog->main_window == main_window){ return; } if(move_note_dialog->main_window != NULL){ g_object_unref(move_note_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } move_note_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_move_note_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMoveNoteDialog *move_note_dialog; move_note_dialog = AGS_MOVE_NOTE_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, move_note_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_move_note_dialog_connect(AgsConnectable *connectable) { AgsMoveNoteDialog *move_note_dialog; move_note_dialog = AGS_MOVE_NOTE_DIALOG(connectable); if((AGS_MOVE_NOTE_DIALOG_CONNECTED & (move_note_dialog->flags)) != 0){ return; } move_note_dialog->flags |= AGS_MOVE_NOTE_DIALOG_CONNECTED; g_signal_connect(move_note_dialog, "response", G_CALLBACK(ags_move_note_dialog_response_callback), move_note_dialog); g_signal_connect_after(move_note_dialog->relative, "clicked", G_CALLBACK(ags_move_note_dialog_relative_callback), move_note_dialog); g_signal_connect_after(move_note_dialog->absolute, "clicked", G_CALLBACK(ags_move_note_dialog_absolute_callback), move_note_dialog); } void ags_move_note_dialog_disconnect(AgsConnectable *connectable) { AgsMoveNoteDialog *move_note_dialog; move_note_dialog = AGS_MOVE_NOTE_DIALOG(connectable); if((AGS_MOVE_NOTE_DIALOG_CONNECTED & (move_note_dialog->flags)) == 0){ return; } move_note_dialog->flags &= (~AGS_MOVE_NOTE_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(move_note_dialog), "any_signal::response", G_CALLBACK(ags_move_note_dialog_response_callback), move_note_dialog, NULL); g_object_disconnect(G_OBJECT(move_note_dialog->relative), "any_signal::clicked", G_CALLBACK(ags_move_note_dialog_relative_callback), move_note_dialog, NULL); g_object_disconnect(G_OBJECT(move_note_dialog->absolute), "any_signal::clicked", G_CALLBACK(ags_move_note_dialog_absolute_callback), move_note_dialog, NULL); } void ags_move_note_dialog_finalize(GObject *gobject) { AgsMoveNoteDialog *move_note_dialog; move_note_dialog = (AgsMoveNoteDialog *) gobject; G_OBJECT_CLASS(ags_move_note_dialog_parent_class)->finalize(gobject); } void ags_move_note_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_move_note_dialog_apply(AgsApplicable *applicable) { AgsMoveNoteDialog *move_note_dialog; AgsWindow *window; AgsNotationEditor *notation_editor; AgsMachine *machine; AgsMoveNote *move_note; AgsAudio *audio; AgsApplicationContext *application_context; GList *start_notation, *notation; GList *task; guint first_x; guint first_y; guint move_x; guint move_y; gboolean relative; gboolean absolute; move_note_dialog = AGS_MOVE_NOTE_DIALOG(applicable); /* application context */ application_context = ags_application_context_get_instance(); window = (AgsWindow *) move_note_dialog->main_window; notation_editor = window->notation_editor; machine = notation_editor->selected_machine; if(machine == NULL){ return; } audio = machine->audio; /* get some values */ move_x = gtk_spin_button_get_value_as_int(move_note_dialog->move_x); move_y = gtk_spin_button_get_value_as_int(move_note_dialog->move_y); relative = gtk_toggle_button_get_active((GtkToggleButton *) move_note_dialog->relative); absolute = gtk_toggle_button_get_active((GtkToggleButton *) move_note_dialog->absolute); /* get position and move note */ g_object_get(audio, "notation", &start_notation, NULL); first_x = 0; first_y = 0; if(absolute){ notation = start_notation; first_x = G_MAXUINT; first_y = G_MAXUINT; while(notation != NULL){ GList *start_selection, *selection; GRecMutex *notation_mutex; notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation->data); /* selection */ g_rec_mutex_lock(notation_mutex); selection = start_selection = g_list_copy_deep(AGS_NOTATION(notation->data)->selection, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(notation_mutex); while(selection != NULL){ guint x0, y; g_object_get(selection->data, "x0", &x0, "y", &y, NULL); if(x0 < first_x){ first_x = AGS_NOTE(selection->data)->x[0]; } if(y < first_y){ first_y = AGS_NOTE(selection->data)->y; } selection = selection->next; } g_list_free_full(start_selection, g_object_unref); notation = notation->next; } } /* create move note task */ notation = start_notation; task = NULL; while(notation != NULL){ GList *start_selection; GRecMutex *notation_mutex; notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation->data); /* selection */ g_rec_mutex_lock(notation_mutex); start_selection = g_list_copy_deep(AGS_NOTATION(notation->data)->selection, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(notation_mutex); if(start_selection != NULL){ move_note = ags_move_note_new(audio, notation->data, start_selection, first_x, first_y, move_x, move_y, relative, absolute); task = g_list_prepend(task, move_note); g_list_free_full(start_selection, g_object_unref); } notation = notation->next; } g_list_free_full(start_notation, g_object_unref); /* append tasks */ ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); } void ags_move_note_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_move_note_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_move_note_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_move_note_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsMoveNoteDialog. * * Returns: a new #AgsMoveNoteDialog * * Since: 3.0.0 */ AgsMoveNoteDialog* ags_move_note_dialog_new(GtkWidget *main_window) { AgsMoveNoteDialog *move_note_dialog; move_note_dialog = (AgsMoveNoteDialog *) g_object_new(AGS_TYPE_MOVE_NOTE_DIALOG, "main-window", main_window, NULL); return(move_note_dialog); } gsequencer-3.1.3/ags/X/editor/ags_envelope_dialog_callbacks.c0000644000175000017500000000370613605312646021214 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include int ags_envelope_dialog_apply_callback(GtkWidget *widget, AgsEnvelopeDialog *envelope_dialog) { ags_applicable_apply(AGS_APPLICABLE(envelope_dialog)); //TODO:JK: remove me // ags_applicable_reset(AGS_APPLICABLE(envelope_dialog)); return(0); } int ags_envelope_dialog_ok_callback(GtkWidget *widget, AgsEnvelopeDialog *envelope_dialog) { // ags_applicable_set_update(AGS_APPLICABLE(envelope_dialog), FALSE); ags_connectable_disconnect(AGS_CONNECTABLE(envelope_dialog)); ags_applicable_apply(AGS_APPLICABLE(envelope_dialog)); envelope_dialog->machine->envelope_dialog = NULL; gtk_widget_destroy((GtkWidget *) envelope_dialog); return(0); } int ags_envelope_dialog_cancel_callback(GtkWidget *widget, AgsEnvelopeDialog *envelope_dialog) { envelope_dialog->machine->envelope_dialog = NULL; gtk_widget_destroy((GtkWidget *) envelope_dialog); return(0); } gboolean ags_envelope_dialog_delete_event(GtkWidget *widget, GdkEventAny *event, AgsEnvelopeDialog *envelope_dialog) { envelope_dialog->machine->envelope_dialog = NULL; return(FALSE); } gsequencer-3.1.3/ags/X/editor/ags_envelope_editor.c0000644000175000017500000010406713607210263017240 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_envelope_editor_class_init(AgsEnvelopeEditorClass *envelope_editor); void ags_envelope_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_envelope_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_envelope_editor_init(AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_connect(AgsConnectable *connectable); void ags_envelope_editor_disconnect(AgsConnectable *connectable); void ags_envelope_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_envelope_editor_apply(AgsApplicable *applicable); void ags_envelope_editor_reset(AgsApplicable *applicable); gboolean ags_envelope_editor_delete_event(GtkWidget *widget, GdkEventAny *event); gchar* ags_envelope_editor_x_label_func(gdouble value, gpointer data); gchar* ags_envelope_editor_y_label_func(gdouble value, gpointer data); /** * SECTION:ags_envelope_editor * @short_description: Edit envelope of notes * @title: AgsEnvelopeEditor * @section_id: * @include: ags/X/ags_envelope_editor.h * * #AgsEnvelopeEditor is a composite widget to edit envelope controls * of selected #AgsNote. */ static gpointer ags_envelope_editor_parent_class = NULL; GType ags_envelope_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_editor = 0; static const GTypeInfo ags_envelope_editor_info = { sizeof (AgsEnvelopeEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_envelope_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_envelope_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_envelope_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsEnvelopeEditor", &ags_envelope_editor_info, 0); g_type_add_interface_static(ags_type_envelope_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_envelope_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_editor); } return g_define_type_id__volatile; } void ags_envelope_editor_class_init(AgsEnvelopeEditorClass *envelope_editor) { ags_envelope_editor_parent_class = g_type_class_peek_parent(envelope_editor); } void ags_envelope_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_envelope_editor_connect; connectable->disconnect = ags_envelope_editor_disconnect; } void ags_envelope_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_envelope_editor_set_update; applicable->apply = ags_envelope_editor_apply; applicable->reset = ags_envelope_editor_reset; } void ags_envelope_editor_init(AgsEnvelopeEditor *envelope_editor) { GtkFrame *frame; GtkHBox *hbox; GtkVBox *control; GtkTable *table; GtkLabel *label; AgsCartesian *cartesian; AgsPlot *plot; gdouble width, height; gdouble default_width, default_height; gdouble offset; envelope_editor->flags = 0; envelope_editor->version = AGS_ENVELOPE_EDITOR_DEFAULT_VERSION; envelope_editor->build_id = AGS_ENVELOPE_EDITOR_DEFAULT_BUILD_ID; /* enabled */ envelope_editor->enabled = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("enabled")); gtk_box_pack_start((GtkBox *) envelope_editor, (GtkWidget *) envelope_editor->enabled, FALSE, FALSE, 0); /* rename dialog */ envelope_editor->rename = NULL; /* frame - preset */ frame = (GtkFrame *) gtk_frame_new(i18n("preset")); gtk_box_pack_start((GtkBox *) envelope_editor, (GtkWidget *) frame, FALSE, FALSE, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) frame, (GtkWidget *) hbox); envelope_editor->preset = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) envelope_editor->preset, FALSE, FALSE, 0); envelope_editor->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) envelope_editor->add, FALSE, FALSE, 0); envelope_editor->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) envelope_editor->remove, FALSE, FALSE, 0); /* cartesian */ cartesian = envelope_editor->cartesian = ags_cartesian_new(); cartesian->x_label_func = ags_envelope_editor_x_label_func; cartesian->y_label_func = ags_envelope_editor_y_label_func; ags_cartesian_fill_label(cartesian, TRUE); ags_cartesian_fill_label(cartesian, FALSE); /* cartesian - plot */ plot = ags_plot_alloc(5, 0, 0); plot->join_points = TRUE; plot->point_color[0][0] = 0.125; plot->point_color[0][1] = 0.5; plot->point_color[0][2] = 1.0; plot->point_color[1][0] = 0.125; plot->point_color[1][1] = 0.5; plot->point_color[1][2] = 1.0; plot->point_color[2][0] = 0.125; plot->point_color[2][1] = 0.5; plot->point_color[2][2] = 1.0; plot->point_color[3][0] = 0.125; plot->point_color[3][1] = 0.5; plot->point_color[3][2] = 1.0; plot->point_color[4][0] = 0.125; plot->point_color[4][1] = 0.5; plot->point_color[4][2] = 1.0; width = cartesian->x_end - cartesian->x_start; height = cartesian->y_end - cartesian->y_start; default_width = cartesian->x_step_width * cartesian->x_scale_step_width; default_height = cartesian->y_step_height * cartesian->y_scale_step_height; plot->point[0][0] = 0.0; plot->point[0][1] = default_height * 1.0; plot->point[1][0] = default_width * 0.25; plot->point[1][1] = default_height * 1.0; offset = default_width * 0.25; plot->point[2][0] = offset + default_width * 0.25; plot->point[2][1] = default_height * 1.0; offset += default_width * 0.25; plot->point[3][0] = offset + default_width * 0.25; plot->point[3][1] = default_height * 1.0; offset += default_width * 0.25; plot->point[4][0] = offset + default_width * 0.25; plot->point[4][1] = default_height * 1.0; ags_cartesian_add_plot(cartesian, plot); /* cartesian - size, pack and redraw */ gtk_widget_set_size_request((GtkWidget *) cartesian, (gint) width + 2.0 * cartesian->x_margin, (gint) height + 2.0 * cartesian->y_margin); gtk_box_pack_start((GtkBox *) envelope_editor, GTK_WIDGET(cartesian), FALSE, FALSE, 0); gtk_widget_queue_draw((GtkWidget *) cartesian); /* table */ table = (GtkTable *) gtk_table_new(5, 2, FALSE); gtk_box_pack_start((GtkBox *) envelope_editor, GTK_WIDGET(table), FALSE, FALSE, 0); /* attack */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("attack"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); envelope_editor->attack_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->attack_x, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->attack_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->attack_x, FALSE, FALSE, 0); envelope_editor->attack_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->attack_y, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->attack_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->attack_y, FALSE, FALSE, 0); /* decay */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("decay"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); envelope_editor->decay_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->decay_x, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->decay_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->decay_x, FALSE, FALSE, 0); envelope_editor->decay_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->decay_y, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->decay_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->decay_y, FALSE, FALSE, 0); /* sustain */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("sustain"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); envelope_editor->sustain_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->sustain_x, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->sustain_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->sustain_x, FALSE, FALSE, 0); envelope_editor->sustain_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->sustain_y, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->sustain_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->sustain_y, FALSE, FALSE, 0); /* release */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("release"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); envelope_editor->release_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->release_x, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->release_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->release_x, FALSE, FALSE, 0); envelope_editor->release_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->release_y, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->release_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) envelope_editor->release_y, FALSE, FALSE, 0); /* ratio */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("ratio"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); envelope_editor->ratio = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) envelope_editor->ratio, TRUE); gtk_range_set_value((GtkRange *) envelope_editor->ratio, 1.0); gtk_table_attach(table, GTK_WIDGET(envelope_editor->ratio), 1, 2, 4, 5, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); } void ags_envelope_editor_connect(AgsConnectable *connectable) { AgsEnvelopeEditor *envelope_editor; envelope_editor = AGS_ENVELOPE_EDITOR(connectable); if((AGS_ENVELOPE_EDITOR_CONNECTED & (envelope_editor->flags)) != 0){ return; } envelope_editor->flags |= AGS_ENVELOPE_EDITOR_CONNECTED; /* preset */ g_signal_connect((GObject *) envelope_editor->preset, "changed", G_CALLBACK(ags_envelope_editor_preset_callback), (gpointer) envelope_editor); g_signal_connect((GObject *) envelope_editor->add, "clicked", G_CALLBACK(ags_envelope_editor_preset_add_callback), (gpointer) envelope_editor); g_signal_connect((GObject *) envelope_editor->remove, "clicked", G_CALLBACK(ags_envelope_editor_preset_remove_callback), (gpointer) envelope_editor); /* attack x,y */ g_signal_connect((GObject *) envelope_editor->attack_x, "value-changed", G_CALLBACK(ags_envelope_editor_attack_x_callback), (gpointer) envelope_editor); g_signal_connect((GObject *) envelope_editor->attack_y, "value-changed", G_CALLBACK(ags_envelope_editor_attack_y_callback), (gpointer) envelope_editor); /* decay x,y */ g_signal_connect((GObject *) envelope_editor->decay_x, "value-changed", G_CALLBACK(ags_envelope_editor_decay_x_callback), (gpointer) envelope_editor); g_signal_connect((GObject *) envelope_editor->decay_y, "value-changed", G_CALLBACK(ags_envelope_editor_decay_y_callback), (gpointer) envelope_editor); /* sustain x,y */ g_signal_connect((GObject *) envelope_editor->sustain_x, "value-changed", G_CALLBACK(ags_envelope_editor_sustain_x_callback), (gpointer) envelope_editor); g_signal_connect((GObject *) envelope_editor->sustain_y, "value-changed", G_CALLBACK(ags_envelope_editor_sustain_y_callback), (gpointer) envelope_editor); /* release x,y */ g_signal_connect((GObject *) envelope_editor->release_x, "value-changed", G_CALLBACK(ags_envelope_editor_release_x_callback), (gpointer) envelope_editor); g_signal_connect((GObject *) envelope_editor->release_y, "value-changed", G_CALLBACK(ags_envelope_editor_release_y_callback), (gpointer) envelope_editor); /* ratio */ g_signal_connect((GObject *) envelope_editor->ratio, "value-changed", G_CALLBACK(ags_envelope_editor_ratio_callback), (gpointer) envelope_editor); } void ags_envelope_editor_disconnect(AgsConnectable *connectable) { AgsEnvelopeEditor *envelope_editor; envelope_editor = AGS_ENVELOPE_EDITOR(connectable); if((AGS_ENVELOPE_EDITOR_CONNECTED & (envelope_editor->flags)) == 0){ return; } envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_CONNECTED); /* preset */ g_object_disconnect((GObject *) envelope_editor->preset, "any_signal::changed", G_CALLBACK(ags_envelope_editor_preset_callback), (gpointer) envelope_editor, NULL); g_object_disconnect((GObject *) envelope_editor->add, "any_signal::clicked", G_CALLBACK(ags_envelope_editor_preset_add_callback), (gpointer) envelope_editor, NULL); g_object_disconnect((GObject *) envelope_editor->remove, "any_signal::clicked", G_CALLBACK(ags_envelope_editor_preset_remove_callback), (gpointer) envelope_editor, NULL); /* attack x,y */ g_object_disconnect((GObject *) envelope_editor->attack_x, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_attack_x_callback), (gpointer) envelope_editor, NULL); g_object_disconnect((GObject *) envelope_editor->attack_y, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_attack_y_callback), (gpointer) envelope_editor, NULL); /* decay x,y */ g_object_disconnect((GObject *) envelope_editor->decay_x, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_decay_x_callback), (gpointer) envelope_editor, NULL); g_object_disconnect((GObject *) envelope_editor->decay_y, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_decay_y_callback), (gpointer) envelope_editor, NULL); /* sustain x,y */ g_object_disconnect((GObject *) envelope_editor->sustain_x, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_sustain_x_callback), (gpointer) envelope_editor, NULL); g_object_disconnect((GObject *) envelope_editor->sustain_y, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_sustain_y_callback), (gpointer) envelope_editor, NULL); /* release x,y */ g_object_disconnect((GObject *) envelope_editor->release_x, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_release_x_callback), (gpointer) envelope_editor, NULL); g_object_disconnect((GObject *) envelope_editor->release_y, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_release_y_callback), (gpointer) envelope_editor, NULL); /* ratio */ g_object_disconnect((GObject *) envelope_editor->ratio, "any_signal::value-changed", G_CALLBACK(ags_envelope_editor_ratio_callback), (gpointer) envelope_editor, NULL); } void ags_envelope_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_envelope_editor_apply(AgsApplicable *applicable) { AgsEnvelopeDialog *envelope_dialog; AgsEnvelopeEditor *envelope_editor; AgsMachine *machine; AgsAudio *audio; GList *start_notation, *notation; GList *start_selection, *selection; double attack_x, attack_y; double decay_x, decay_y; double sustain_x, sustain_y; double release_x, release_y; double ratio; complex z; envelope_editor = AGS_ENVELOPE_EDITOR(applicable); envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get z */ attack_x = gtk_range_get_value(GTK_RANGE(envelope_editor->attack_x)); attack_y = gtk_range_get_value(GTK_RANGE(envelope_editor->attack_y)); decay_x = gtk_range_get_value(GTK_RANGE(envelope_editor->decay_x)); decay_y = gtk_range_get_value(GTK_RANGE(envelope_editor->decay_y)); sustain_x = gtk_range_get_value(GTK_RANGE(envelope_editor->sustain_x)); sustain_y = gtk_range_get_value(GTK_RANGE(envelope_editor->sustain_y)); release_x = gtk_range_get_value(GTK_RANGE(envelope_editor->release_x)); release_y = gtk_range_get_value(GTK_RANGE(envelope_editor->release_y)); ratio = gtk_range_get_value(GTK_RANGE(envelope_editor->ratio)); /* notation */ g_object_get(audio, "notation", &start_notation, NULL); notation = start_notation; /* set attack, decay, sustain and release */ while(notation != NULL){ GRecMutex *notation_mutex; /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation->data); /**/ g_rec_mutex_lock(notation_mutex); selection = start_selection = g_list_copy_deep(AGS_NOTATION(notation->data)->selection, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(notation_mutex); while(selection != NULL){ AgsNote *current_note; GRecMutex *note_mutex; current_note = AGS_NOTE(selection->data); /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(current_note); /* apply */ g_rec_mutex_lock(note_mutex); current_note->flags |= AGS_NOTE_ENVELOPE; z = attack_x + I * attack_y; ags_complex_set(&(current_note->attack), z); z = decay_x + I * decay_y; ags_complex_set(&(current_note->decay), z); z = sustain_x + I * sustain_y; ags_complex_set(&(current_note->sustain), z); z = release_x + I * release_y; ags_complex_set(&(current_note->release), z); z = 0.0 + I * ratio; ags_complex_set(&(current_note->ratio), z); g_rec_mutex_unlock(note_mutex); /* iterate */ selection = selection->next; } g_list_free_full(start_selection, g_object_unref); notation = notation->next; } g_list_free_full(start_notation, g_object_unref); } void ags_envelope_editor_reset(AgsApplicable *applicable) { AgsEnvelopeEditor *envelope_editor; envelope_editor = AGS_ENVELOPE_EDITOR(applicable); ags_envelope_editor_load_preset(envelope_editor); } gchar* ags_envelope_editor_x_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 10.0); g_free(format); return(str); } gchar* ags_envelope_editor_y_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 10.0); g_free(format); return(str); } /** * ags_envelope_editor_get_active_preset: * @envelope_editor: the #AgsEnvelopeEditor * * Get active preset. * * Returns: the matching #AgsPreset, if none selected %NULL * * Since: 3.0.0 */ AgsPreset* ags_envelope_editor_get_active_preset(AgsEnvelopeEditor *envelope_editor) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; AgsAudio *audio; AgsPreset *current; GList *start_preset, *preset; gchar *preset_name; if(!AGS_IS_ENVELOPE_EDITOR(envelope_editor)){ return(NULL); } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* preset name */ preset_name = gtk_combo_box_text_get_active_text(envelope_editor->preset); /* find preset */ g_object_get(audio, "preset", &start_preset, NULL); preset = start_preset; current = NULL; preset = ags_preset_find_name(preset, preset_name); g_free(preset_name); if(preset != NULL){ current = preset->data; } g_list_free_full(start_preset, g_object_unref); return(current); } /** * ags_envelope_editor_load_preset: * @envelope_editor: the #AgsPatternEnvelope * * Load preset. * * Since: 3.0.0 */ void ags_envelope_editor_load_preset(AgsEnvelopeEditor *envelope_editor) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; GtkTreeModel *model; AgsAudio *audio; GList *start_preset, *preset; if(!AGS_IS_ENVELOPE_EDITOR(envelope_editor)){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get model */ model = GTK_TREE_MODEL(gtk_combo_box_get_model(GTK_COMBO_BOX(envelope_editor->preset))); /* clear old */ gtk_list_store_clear(GTK_LIST_STORE(model)); /* create new */ g_object_get(audio, "preset", &start_preset, NULL); preset = start_preset; while(preset != NULL){ if(AGS_PRESET(preset->data)->preset_name != NULL){ gtk_combo_box_text_append_text(envelope_editor->preset, AGS_PRESET(preset->data)->preset_name); } preset = preset->next; } g_list_free_full(start_preset, g_object_unref); } /** * ags_envelope_editor_add_preset: * @envelope_editor: the #AgsPatternEnvelope * @preset_name: the preset name * * Add preset. * * Since: 3.0.0 */ void ags_envelope_editor_add_preset(AgsEnvelopeEditor *envelope_editor, gchar *preset_name) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; AgsAudio *audio; AgsPreset *preset; GList *start_preset; AgsComplex *val; GValue value = {0,}; if(!AGS_IS_ENVELOPE_EDITOR(envelope_editor) || preset_name == NULL){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; g_object_get(audio, "preset", &start_preset, NULL); /* check if already present */ if(ags_preset_find_name(start_preset, preset_name) != NULL){ g_list_free_full(start_preset, g_object_unref); return; } /* create preset */ preset = g_object_new(AGS_TYPE_PRESET, "scope", "ags-envelope", "preset-name", preset_name, NULL); ags_audio_add_preset(audio, (GObject *) preset); /* preset - attack */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + I * 0.0); g_value_init(&value, AGS_TYPE_COMPLEX); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "attack", &value); /* preset - decay */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + I * 0.0); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "decay", &value); /* preset - sustain */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + I * 0.0); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "sustain", &value); /* preset - release */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + I * 0.0); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "release", &value); /* preset - ratio */ val = ags_complex_alloc(); ags_complex_set(val, 0.0 + I * 1.0); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "ratio", &value); g_list_free(start_preset); } /** * ags_envelope_editor_remove_preset: * @envelope_editor: the #AgsPatternEnvelope * @nth: the nth preset to remove * * Remove preset. * * Since: 3.0.0 */ void ags_envelope_editor_remove_preset(AgsEnvelopeEditor *envelope_editor, guint nth) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; AgsAudio *audio; AgsPreset *preset; GList *start_preset; if(!AGS_IS_ENVELOPE_EDITOR(envelope_editor)){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* remove preset */ g_object_get(audio, "preset", &start_preset, NULL); preset = g_list_nth_data(start_preset, nth); g_list_free_full(start_preset, g_object_unref); ags_audio_remove_preset(audio, (GObject *) preset); } /** * ags_envelope_editor_reset_control: * @envelope_editor: the #AgsEnvelopeEditor * * Reset controls. * * Since: 3.0.0 */ void ags_envelope_editor_reset_control(AgsEnvelopeEditor *envelope_editor) { AgsEnvelopeDialog *envelope_dialog; AgsPreset *preset; AgsComplex *val; complex z; GValue value = {0,}; GError *error; if(!AGS_IS_ENVELOPE_EDITOR(envelope_editor)){ return; } /* disable update */ envelope_editor->flags |= AGS_ENVELOPE_EDITOR_NO_UPDATE; /* check preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); /* attack */ g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "attack", &value, &error); if(error != NULL){ g_warning("%s", error->message); envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); z = ags_complex_get(val); gtk_range_set_value((GtkRange *) envelope_editor->attack_x, creal(z)); gtk_range_set_value((GtkRange *) envelope_editor->attack_y, cimag(z)); /* decay */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "decay", &value, &error); if(error != NULL){ g_warning("%s", error->message); envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); z = ags_complex_get(val); gtk_range_set_value((GtkRange *) envelope_editor->decay_x, creal(z)); gtk_range_set_value((GtkRange *) envelope_editor->decay_y, cimag(z)); /* sustain */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "sustain", &value, &error); if(error != NULL){ g_warning("%s", error->message); envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); z = ags_complex_get(val); gtk_range_set_value((GtkRange *) envelope_editor->sustain_x, creal(z)); gtk_range_set_value((GtkRange *) envelope_editor->sustain_y, cimag(z)); /* release */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "release", &value, &error); if(error != NULL){ g_warning("%s", error->message); envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); z = ags_complex_get(val); gtk_range_set_value((GtkRange *) envelope_editor->release_x, creal(z)); gtk_range_set_value((GtkRange *) envelope_editor->release_y, cimag(z)); /* ratio */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "ratio", &value, &error); if(error != NULL){ g_warning("%s", error->message); envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); z = ags_complex_get(val); gtk_range_set_value((GtkRange *) envelope_editor->ratio, cimag(z)); /* unset no update */ envelope_editor->flags &= (~AGS_ENVELOPE_EDITOR_NO_UPDATE); } /** * ags_envelope_editor_plot: * @envelope_editor: the #AgsEnvelopeEditor * * Plot envelope. * * Since: 3.0.0 */ void ags_envelope_editor_plot(AgsEnvelopeEditor *envelope_editor) { AgsCartesian *cartesian; AgsPlot *plot; gdouble default_width, default_height; gdouble attack_x, attack_y; gdouble decay_x, decay_y; gdouble sustain_x, sustain_y; gdouble release_x, release_y; gdouble ratio; gdouble offset; if(!AGS_IS_ENVELOPE_EDITOR(envelope_editor)){ return; } cartesian = envelope_editor->cartesian; plot = cartesian->plot->data; default_width = cartesian->x_step_width * cartesian->x_scale_step_width; default_height = cartesian->y_step_height * cartesian->y_scale_step_height; attack_x = gtk_range_get_value((GtkRange *) envelope_editor->attack_x); attack_y = gtk_range_get_value((GtkRange *) envelope_editor->attack_y); decay_x = gtk_range_get_value((GtkRange *) envelope_editor->decay_x); decay_y = gtk_range_get_value((GtkRange *) envelope_editor->decay_y); sustain_x = gtk_range_get_value((GtkRange *) envelope_editor->sustain_x); sustain_y = gtk_range_get_value((GtkRange *) envelope_editor->sustain_y); release_x = gtk_range_get_value((GtkRange *) envelope_editor->release_x); release_y = gtk_range_get_value((GtkRange *) envelope_editor->release_y); ratio = gtk_range_get_value((GtkRange *) envelope_editor->ratio); /* reset plot points */ plot->point[0][0] = 0.0; plot->point[0][1] = default_height * ratio; plot->point[1][0] = default_width * attack_x; plot->point[1][1] = default_height * (attack_y + ratio); offset = default_width * attack_x; plot->point[2][0] = offset + default_width * decay_x; plot->point[2][1] = default_height * (decay_y + ratio); offset += default_width * decay_x; plot->point[3][0] = offset + default_width * sustain_x; plot->point[3][1] = default_height * (sustain_y + ratio); offset += default_width * sustain_x; plot->point[4][0] = offset + default_width * release_x; plot->point[4][1] = default_height * (release_y + ratio); /* redraw */ gtk_widget_queue_draw((GtkWidget *) cartesian); } /** * ags_envelope_editor_new: * * Create a new instance of #AgsEnvelopeEditor * * Returns: the new #AgsEnvelopeEditor * * Since: 3.0.0 */ AgsEnvelopeEditor* ags_envelope_editor_new() { AgsEnvelopeEditor *envelope_editor; envelope_editor = (AgsEnvelopeEditor *) g_object_new(AGS_TYPE_ENVELOPE_EDITOR, NULL); return(envelope_editor); } gsequencer-3.1.3/ags/X/editor/ags_move_note_dialog_callbacks.h0000644000175000017500000000271113607210263021364 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MOVE_NOTE_DIALOG_CALLBACKS_H__ #define __AGS_MOVE_NOTE_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_move_note_dialog_response_callback(GtkWidget *dialog, gint response, AgsMoveNoteDialog *move_note_dialog); void ags_move_note_dialog_relative_callback(GtkWidget *button, AgsMoveNoteDialog *move_note_dialog); void ags_move_note_dialog_absolute_callback(GtkWidget *button, AgsMoveNoteDialog *move_note_dialog); G_END_DECLS #endif /*__AGS_MOVE_NOTE_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_select_acceleration_dialog_callbacks.c0000644000175000017500000001706213607210263023361 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_select_acceleration_dialog_response_callback(GtkWidget *dialog, gint response, AgsSelectAccelerationDialog *select_acceleration_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(select_acceleration_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) select_acceleration_dialog); } } } } void ags_select_acceleration_dialog_add_callback(GtkWidget *button, AgsSelectAccelerationDialog *select_acceleration_dialog) { AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; GtkHBox *hbox; GtkComboBoxText *combo_box; GtkButton *remove; AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; GList *start_port, *port; gchar **collected_specifier; guint length; window = AGS_WINDOW(select_acceleration_dialog->main_window); automation_editor = window->automation_window->automation_editor; machine = automation_editor->selected_machine; audio = machine->audio; /* select automation */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) select_acceleration_dialog->port, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* automation combo box */ combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(combo_box), FALSE, FALSE, 0); /* */ collected_specifier = (gchar **) malloc(sizeof(gchar*)); collected_specifier[0] = NULL; length = 1; /* audio */ port = start_port = ags_audio_collect_all_audio_ports(audio); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ gtk_combo_box_text_append_text(combo_box, g_strdup(specifier)); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* output */ g_object_get(audio, "output", &start_channel, NULL); channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ /* output */ port = start_port = ags_channel_collect_all_channel_ports(channel); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ gtk_combo_box_text_append_text(combo_box, g_strdup(specifier)); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } /* input */ g_object_get(audio, "input", &start_channel, NULL); channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ /* input */ port = start_port = ags_channel_collect_all_channel_ports(channel); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ gtk_combo_box_text_append_text(combo_box, g_strdup(specifier)); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } g_strfreev(collected_specifier); /* remove button */ remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) remove, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) hbox); g_signal_connect(remove, "clicked", G_CALLBACK(ags_select_acceleration_dialog_remove_callback), select_acceleration_dialog); } void ags_select_acceleration_dialog_remove_callback(GtkWidget *button, AgsSelectAccelerationDialog *select_acceleration_dialog) { gtk_widget_destroy(gtk_widget_get_parent(button)); } void ags_select_acceleration_dialog_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsSelectAccelerationDialog *select_acceleration_dialog) { ags_applicable_reset(AGS_APPLICABLE(select_acceleration_dialog)); } gsequencer-3.1.3/ags/X/editor/ags_notation_meta_callbacks.c0000644000175000017500000000177213616617253020726 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_notation_meta_machine_changed_callback(AgsNotationEditor *notation_editor, AgsMachine *machine, AgsNotationMeta *notation_meta) { ags_notation_meta_refresh(notation_meta); } gsequencer-3.1.3/ags/X/editor/ags_vwave_edit_box.c0000644000175000017500000000514413607210263017056 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_vwave_edit_box_class_init(AgsVWaveEditBoxClass *vwave_edit_box); void ags_vwave_edit_box_init(AgsVWaveEditBox *vwave_edit_box); /** * SECTION:ags_vwave_edit_box * @short_description: vertical box widget * @title: AgsVWaveEditBox * @section_id: * @include: ags/widget/ags_vwave_edit_box.h * * The #AgsVWaveEditBox is an horizontal box widget containing #AgsWaveEdit. */ GType ags_vwave_edit_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_vwave_edit_box = 0; static const GTypeInfo ags_vwave_edit_box_info = { sizeof (AgsVWaveEditBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_vwave_edit_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVWaveEditBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_vwave_edit_box_init, }; ags_type_vwave_edit_box = g_type_register_static(AGS_TYPE_WAVE_EDIT_BOX, "AgsVWaveEditBox", &ags_vwave_edit_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_vwave_edit_box); } return g_define_type_id__volatile; } void ags_vwave_edit_box_class_init(AgsVWaveEditBoxClass *vwave_edit_box) { } void ags_vwave_edit_box_init(AgsVWaveEditBox *vwave_edit_box) { gtk_orientable_set_orientation(GTK_ORIENTABLE(vwave_edit_box), GTK_ORIENTATION_VERTICAL); } /** * ags_vwave_edit_box_new: * * Create a new instance of #AgsVWaveEditBox. * * Returns: the new #AgsVWaveEditBox instance * * Since: 3.0.0 */ AgsVWaveEditBox* ags_vwave_edit_box_new() { AgsVWaveEditBox *vwave_edit_box; vwave_edit_box = (AgsVWaveEditBox *) g_object_new(AGS_TYPE_VWAVE_EDIT_BOX, NULL); return(vwave_edit_box); } gsequencer-3.1.3/ags/X/editor/ags_automation_edit_callbacks.h0000644000175000017500000000436113607210263021242 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_EDIT_CALLBACKS_H__ #define __AGS_AUTOMATION_EDIT_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_automation_edit_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsAutomationEdit *automation_edit); gboolean ags_automation_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEdit *automation_edit); gboolean ags_automation_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsAutomationEdit *automation_edit); gboolean ags_automation_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsAutomationEdit *automation_edit); gboolean ags_automation_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsAutomationEdit *automation_edit); gboolean ags_automation_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsAutomationEdit *automation_edit); gboolean ags_automation_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsAutomationEdit *automation_edit); void ags_automation_edit_vscrollbar_value_changed(GtkRange *range, AgsAutomationEdit *automation_edit); void ags_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEdit *automation_edit); G_END_DECLS #endif /*__AGS_AUTOMATION_EDIT_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_edit_box.h0000644000175000017500000000446513607210263020120 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_EDIT_BOX_H__ #define __AGS_AUTOMATION_EDIT_BOX_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION_EDIT_BOX (ags_automation_edit_box_get_type()) #define AGS_AUTOMATION_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION_EDIT_BOX, AgsAutomationEditBox)) #define AGS_AUTOMATION_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION_EDIT_BOX, AgsAutomationEditBoxClass)) #define AGS_IS_AUTOMATION_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTOMATION_EDIT_BOX)) #define AGS_IS_AUTOMATION_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTOMATION_EDIT_BOX)) #define AGS_AUTOMATION_EDIT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUTOMATION_EDIT_BOX, AgsAutomationEditBoxClass)) #define AGS_AUTOMATION_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT (128) typedef struct _AgsAutomationEditBox AgsAutomationEditBox; typedef struct _AgsAutomationEditBoxClass AgsAutomationEditBoxClass; typedef enum{ AGS_AUTOMATION_EDIT_BOX_FIXED_EDIT_SIZE = 1, }AgsAutomationEditBoxFlags; struct _AgsAutomationEditBox { GtkBox box; guint flags; guint fixed_edit_height; }; struct _AgsAutomationEditBoxClass { GtkBoxClass box; }; GType ags_automation_edit_box_get_type(void); AgsAutomationEditBox* ags_automation_edit_box_new(); G_END_DECLS #endif /*__AGS_AUTOMATION_EDIT_BOX_H__*/ gsequencer-3.1.3/ags/X/editor/ags_envelope_dialog_callbacks.h0000644000175000017500000000300413607210263021202 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_DIALOG_CALLBACKS_H__ #define __AGS_ENVELOPE_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS int ags_envelope_dialog_apply_callback(GtkWidget *widget, AgsEnvelopeDialog *envelope_dialog); int ags_envelope_dialog_ok_callback(GtkWidget *widget, AgsEnvelopeDialog *envelope_dialog); int ags_envelope_dialog_cancel_callback(GtkWidget *widget, AgsEnvelopeDialog *envelope_dialog); gboolean ags_envelope_dialog_delete_event(GtkWidget *widget, GdkEventAny *event, AgsEnvelopeDialog *envelope_dialog); G_END_DECLS #endif /*__AGS_ENVELOPE_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_sheet_toolbar.c0000644000175000017500000001745213607210263016710 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_sheet_toolbar_class_init(AgsSheetToolbarClass *sheet_toolbar); void ags_sheet_toolbar_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sheet_toolbar_init(AgsSheetToolbar *sheet_toolbar); void ags_sheet_toolbar_connect(AgsConnectable *connectable); void ags_sheet_toolbar_disconnect(AgsConnectable *connectable); /** * SECTION:ags_sheet_toolbar * @short_description: sheet_toolbar * @title: AgsSheetToolbar * @section_id: * @include: ags/X/editor/ags_sheet_toolbar.h * * The #AgsSheetToolbar lets you choose edit tool. */ GType ags_sheet_toolbar_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sheet_toolbar = 0; static const GTypeInfo ags_sheet_toolbar_info = { sizeof (AgsSheetToolbarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sheet_toolbar_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSheetToolbar), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sheet_toolbar_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sheet_toolbar_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sheet_toolbar = g_type_register_static(GTK_TYPE_TOOLBAR, "AgsSheetToolbar", &ags_sheet_toolbar_info, 0); g_type_add_interface_static(ags_type_sheet_toolbar, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sheet_toolbar); } return g_define_type_id__volatile; } void ags_sheet_toolbar_class_init(AgsSheetToolbarClass *sheet_toolbar) { } void ags_sheet_toolbar_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_sheet_toolbar_connect; connectable->disconnect = ags_sheet_toolbar_disconnect; } void ags_sheet_toolbar_init(AgsSheetToolbar *sheet_toolbar) { GtkLabel *label; GtkMenu *menu; GtkMenuItem *item; sheet_toolbar->flags = 0; /* position */ sheet_toolbar->position = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Position"), "stock-id", GTK_STOCK_JUMP_TO, NULL); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->position); /* edit */ sheet_toolbar->edit_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "stock-id", GTK_STOCK_EDIT, NULL); menu = (GtkMenu *) gtk_menu_new(); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("1/1"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("1/2"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("1/4"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("1/8"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("1/16"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("1/32"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); gtk_menu_tool_button_set_menu(sheet_toolbar->edit_tool, (GtkWidget *) menu); gtk_widget_show_all((GtkWidget *) menu); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->edit_tool); /* clear */ sheet_toolbar->clear = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "stock-id", GTK_STOCK_CLEAR, NULL); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->clear); /* select */ sheet_toolbar->select = (GtkToggleToolButton *) g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Select"), "stock-id", GTK_STOCK_SELECT_ALL, NULL); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->select); /* copy */ sheet_toolbar->copy = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_COPY, NULL); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->copy); /* cut */ sheet_toolbar->cut = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_CUT, NULL); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->cut); /* paste */ sheet_toolbar->paste_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "stock-id", GTK_STOCK_PASTE, NULL); menu = (GtkMenu *) gtk_menu_new(); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("match audio channel"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", i18n("no duplicates"), "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); gtk_menu_tool_button_set_menu(sheet_toolbar->paste_tool, (GtkWidget *) menu); gtk_widget_show_all((GtkWidget *) menu); gtk_container_add((GtkToolbar *) sheet_toolbar, (GtkWidget *) sheet_toolbar->paste_tool); } void ags_sheet_toolbar_connect(AgsConnectable *connectable) { AgsWindow *window; AgsSheetToolbar *sheet_toolbar; GList *list; sheet_toolbar = AGS_SHEET_TOOLBAR(connectable); if((AGS_SHEET_TOOLBAR_CONNECTED & (sheet_toolbar->flags)) != 0){ return; } sheet_toolbar->flags |= AGS_SHEET_TOOLBAR_CONNECTED; //TODO:JK: implement me } void ags_sheet_toolbar_disconnect(AgsConnectable *connectable) { AgsSheetToolbar *sheet_toolbar; GList *list; sheet_toolbar = AGS_SHEET_TOOLBAR(connectable); if((AGS_SHEET_TOOLBAR_CONNECTED & (sheet_toolbar->flags)) == 0){ return; } sheet_toolbar->flags &= (~AGS_SHEET_TOOLBAR_CONNECTED); //TODO:JK: implement me } /** * ags_sheet_toolbar_new: * * Create a new #AgsSheetToolbar. * * Returns: a new #AgsSheetToolbar * * Since: 3.0.0 */ AgsSheetToolbar* ags_sheet_toolbar_new() { AgsSheetToolbar *sheet_toolbar; sheet_toolbar = (AgsSheetToolbar *) g_object_new(AGS_TYPE_SHEET_TOOLBAR, NULL); return(sheet_toolbar); } gsequencer-3.1.3/ags/X/editor/ags_notation_meta_callbacks.h0000644000175000017500000000243413616617253020727 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_META_CALLBACKS_H__ #define __AGS_NOTATION_META_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_notation_meta_machine_changed_callback(AgsNotationEditor *notation_editor, AgsMachine *machine, AgsNotationMeta *notation_meta); G_END_DECLS #endif /*__AGS_NOTATION_META_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_edit_callbacks.c0000644000175000017500000007473613616617253020737 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_notation_edit_drawing_area_button_press_position_cursor(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_button_press_add_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_button_press_select_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_button_release_position_cursor(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_button_release_add_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_button_release_delete_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_button_release_select_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event); void ags_notation_edit_drawing_area_motion_notify_position_cursor(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventMotion *event); void ags_notation_edit_drawing_area_motion_notify_add_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventMotion *event); void ags_notation_edit_drawing_area_motion_notify_select_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventMotion *event); void ags_notation_edit_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsNotationEdit *notation_edit) { ags_notation_edit_draw(notation_edit, cr); } gboolean ags_notation_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsNotationEdit *notation_edit) { ags_notation_edit_reset_vscrollbar(notation_edit); ags_notation_edit_reset_hscrollbar(notation_edit); gtk_widget_queue_draw(notation_edit); return(FALSE); } void ags_notation_edit_drawing_area_button_press_position_cursor(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { double zoom_factor; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* cursor position */ notation_edit->cursor_position_x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; notation_edit->cursor_position_x = zoom_factor * floor(notation_edit->cursor_position_x / zoom_factor); notation_edit->cursor_position_y = (guint) ((event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))) / notation_edit->control_height); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit); } void ags_notation_edit_drawing_area_button_press_add_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { AgsNote *note; double zoom_factor; note = ags_note_new(); /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* note */ note->x[0] = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; note->x[0] = zoom_factor * floor(note->x[0] / zoom_factor); if((AGS_NOTATION_EDITOR_PATTERN_MODE & (notation_editor->flags)) == 0){ note->x[1] = note->x[0] + zoom_factor; }else{ note->x[1] = note->x[0] + 1; } note->y = (guint) ((event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))) / notation_edit->control_height); /* current note */ if(notation_edit->current_note != NULL){ g_object_unref(notation_edit->current_note); notation_edit->current_note = NULL; } notation_edit->current_note = note; g_object_ref(note); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit); } void ags_notation_edit_drawing_area_button_press_select_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { notation_edit->selection_x0 = (guint) event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)); notation_edit->selection_x1 = notation_edit->selection_x0; notation_edit->selection_y0 = (guint) event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)); notation_edit->selection_y1 = notation_edit->selection_y0; gtk_widget_queue_draw((GtkWidget *) notation_edit); } gboolean ags_notation_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; AgsMachine *machine; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_edit), AGS_TYPE_NOTATION_EDITOR); notation_toolbar = notation_editor->notation_toolbar; gtk_widget_grab_focus((GtkWidget *) notation_edit->drawing_area); if((machine = notation_editor->selected_machine) != NULL && event->button == 1){ notation_edit->button_mask |= AGS_NOTATION_EDIT_BUTTON_1; if(notation_toolbar->selected_edit_mode == notation_toolbar->position){ notation_edit->mode = AGS_NOTATION_EDIT_POSITION_CURSOR; ags_notation_edit_drawing_area_button_press_position_cursor(notation_editor, notation_toolbar, notation_edit, machine, event); }else if(notation_toolbar->selected_edit_mode == notation_toolbar->edit){ notation_edit->mode = AGS_NOTATION_EDIT_ADD_NOTE; ags_notation_edit_drawing_area_button_press_add_note(notation_editor, notation_toolbar, notation_edit, machine, event); }else if(notation_toolbar->selected_edit_mode == notation_toolbar->clear){ notation_edit->mode = AGS_NOTATION_EDIT_DELETE_NOTE; //NOTE:JK: only takes action on release }else if(notation_toolbar->selected_edit_mode == notation_toolbar->select){ notation_edit->mode = AGS_NOTATION_EDIT_SELECT_NOTE; ags_notation_edit_drawing_area_button_press_select_note(notation_editor, notation_toolbar, notation_edit, machine, event); } } return(TRUE); } void ags_notation_edit_drawing_area_button_release_position_cursor(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { double zoom_factor; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* cursor position */ notation_edit->cursor_position_x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; notation_edit->cursor_position_x = zoom_factor * floor(notation_edit->cursor_position_x / zoom_factor); notation_edit->cursor_position_y = (guint) ((event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))) / notation_edit->control_height); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit); } void ags_notation_edit_drawing_area_button_release_add_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { AgsNote *note; double zoom_factor; guint new_x; note = notation_edit->current_note; if(note == NULL){ return; } /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* new x[1] */ if((AGS_NOTATION_EDITOR_PATTERN_MODE & (notation_editor->flags)) == 0){ new_x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; new_x = zoom_factor * floor((new_x + zoom_factor) / zoom_factor); if(new_x >= note->x[0] + zoom_factor){ note->x[1] = new_x; } }else{ note->x[1] = note->x[0] + 1; } #ifdef AGS_DEBUG g_message("%lu-%lu %lu", note->x[0], note->x[1], note->y); #endif /* add note */ ags_notation_editor_add_note(notation_editor, note); notation_edit->current_note = NULL; g_object_unref(note); } void ags_notation_edit_drawing_area_button_release_delete_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { double zoom_factor; guint x, y; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* note */ x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; x = zoom_factor * floor(x / zoom_factor); y = (guint) ((event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))) / notation_edit->control_height); /* delete note */ ags_notation_editor_delete_note(notation_editor, x, y); } void ags_notation_edit_drawing_area_button_release_select_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventButton *event) { double zoom_factor; guint x0, x1, y0, y1; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* region */ x0 = (guint) (zoom_factor * notation_edit->selection_x0) / notation_edit->control_width; y0 = (guint) (notation_edit->selection_y0 / notation_edit->control_height); x1 = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; y1 = (guint) ((event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))) / notation_edit->control_height); /* select region */ ags_notation_editor_select_region(notation_editor, x0, y0, x1, y1); } gboolean ags_notation_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; AgsMachine *machine; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_edit), AGS_TYPE_NOTATION_EDITOR); notation_toolbar = notation_editor->notation_toolbar; if((machine = notation_editor->selected_machine) != NULL && event->button == 1){ notation_edit->button_mask &= (~AGS_NOTATION_EDIT_BUTTON_1); if(notation_edit->mode == AGS_NOTATION_EDIT_POSITION_CURSOR){ ags_notation_edit_drawing_area_button_release_position_cursor(notation_editor, notation_toolbar, notation_edit, machine, event); // notation_edit->mode = AGS_NOTATION_EDIT_NO_EDIT_MODE; }else if(notation_edit->mode == AGS_NOTATION_EDIT_ADD_NOTE){ ags_notation_edit_drawing_area_button_release_add_note(notation_editor, notation_toolbar, notation_edit, machine, event); notation_edit->mode = AGS_NOTATION_EDIT_NO_EDIT_MODE; }else if(notation_edit->mode == AGS_NOTATION_EDIT_DELETE_NOTE){ ags_notation_edit_drawing_area_button_release_delete_note(notation_editor, notation_toolbar, notation_edit, machine, event); notation_edit->mode = AGS_NOTATION_EDIT_NO_EDIT_MODE; }else if(notation_edit->mode == AGS_NOTATION_EDIT_SELECT_NOTE){ ags_notation_edit_drawing_area_button_release_select_note(notation_editor, notation_toolbar, notation_edit, machine, event); notation_edit->mode = AGS_NOTATION_EDIT_NO_EDIT_MODE; } } return(FALSE); } void ags_notation_edit_drawing_area_motion_notify_position_cursor(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventMotion *event) { double zoom_factor; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* cursor position */ notation_edit->cursor_position_x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; notation_edit->cursor_position_x = zoom_factor * floor(notation_edit->cursor_position_x / zoom_factor); notation_edit->cursor_position_y = (guint) ((event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))) / notation_edit->control_height); #ifdef AGS_DEBUG g_message("%lu %lu", notation_edit->cursor_position_x, notation_edit->cursor_position_y); #endif /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit); } void ags_notation_edit_drawing_area_motion_notify_add_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventMotion *event) { AgsNote *note; double zoom_factor; guint new_x; note = notation_edit->current_note; if(note == NULL){ return; } /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* new x[1] */ if((AGS_NOTATION_EDITOR_PATTERN_MODE & (notation_editor->flags)) == 0){ new_x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)))) / notation_edit->control_width; new_x = zoom_factor * floor((new_x + zoom_factor) / zoom_factor); if(new_x >= note->x[0] + zoom_factor){ note->x[1] = new_x; } }else{ note->x[1] = note->x[0] + 1; } #ifdef AGS_DEBUG g_message("%lu-%lu %lu", note->x[0], note->x[1], note->y); #endif /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit); } void ags_notation_edit_drawing_area_motion_notify_select_note(AgsNotationEditor *notation_editor, AgsNotationToolbar *notation_toolbar, AgsNotationEdit *notation_edit, AgsMachine *machine, GdkEventMotion *event) { if(event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)) >= 0.0){ notation_edit->selection_x1 = (guint) event->x + gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)); }else{ notation_edit->selection_x1 = 0.0; } if(event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)) >= 0.0){ notation_edit->selection_y1 = (guint) event->y + gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)); }else{ notation_edit->selection_y1 = 0.0; } gtk_widget_queue_draw((GtkWidget *) notation_edit); } gboolean ags_notation_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; AgsMachine *machine; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_edit), AGS_TYPE_NOTATION_EDITOR); notation_toolbar = notation_editor->notation_toolbar; gtk_widget_grab_focus((GtkWidget *) notation_edit->drawing_area); if((machine = notation_editor->selected_machine) != NULL && (AGS_NOTATION_EDIT_BUTTON_1 & (notation_edit->button_mask)) != 0){ if(notation_edit->mode == AGS_NOTATION_EDIT_POSITION_CURSOR){ ags_notation_edit_drawing_area_motion_notify_position_cursor(notation_editor, notation_toolbar, notation_edit, machine, event); }else if(notation_edit->mode == AGS_NOTATION_EDIT_ADD_NOTE){ ags_notation_edit_drawing_area_motion_notify_add_note(notation_editor, notation_toolbar, notation_edit, machine, event); }else if(notation_edit->mode == AGS_NOTATION_EDIT_DELETE_NOTE){ //NOTE:JK: only takes action on release }else if(notation_edit->mode == AGS_NOTATION_EDIT_SELECT_NOTE){ ags_notation_edit_drawing_area_motion_notify_select_note(notation_editor, notation_toolbar, notation_edit, machine, event); } } return(FALSE); } gboolean ags_notation_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; AgsMachine *machine; gboolean retval; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_edit), AGS_TYPE_NOTATION_EDITOR); machine = notation_editor->selected_machine; if(machine != NULL){ switch(event->keyval){ case GDK_KEY_Control_L: { notation_edit->key_mask |= AGS_NOTATION_EDIT_KEY_L_CONTROL; } break; case GDK_KEY_Control_R: { notation_edit->key_mask |= AGS_NOTATION_EDIT_KEY_R_CONTROL; } break; case GDK_KEY_Shift_L: { notation_edit->key_mask |= AGS_NOTATION_EDIT_KEY_L_SHIFT; } break; case GDK_KEY_Shift_R: { notation_edit->key_mask |= AGS_NOTATION_EDIT_KEY_R_SHIFT; } break; case GDK_KEY_a: { /* select all notes */ if((AGS_NOTATION_EDIT_KEY_L_CONTROL & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_CONTROL & (notation_edit->key_mask)) != 0){ ags_notation_editor_select_all(notation_editor); } } break; case GDK_KEY_c: { /* copy notes */ if((AGS_NOTATION_EDIT_KEY_L_CONTROL & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_CONTROL & (notation_edit->key_mask)) != 0){ ags_notation_editor_copy(notation_editor); } } break; case GDK_KEY_v: { /* paste notes */ if((AGS_NOTATION_EDIT_KEY_L_CONTROL & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_CONTROL & (notation_edit->key_mask)) != 0){ ags_notation_editor_paste(notation_editor); } } break; case GDK_KEY_x: { /* cut notes */ if((AGS_NOTATION_EDIT_KEY_L_CONTROL & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_CONTROL & (notation_edit->key_mask)) != 0){ ags_notation_editor_cut(notation_editor); } } break; case GDK_KEY_i: { /* invert notes */ if((AGS_NOTATION_EDIT_KEY_L_CONTROL & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_CONTROL & (notation_edit->key_mask)) != 0){ ags_notation_editor_invert(notation_editor); } } break; case GDK_KEY_m: { /* meta */ if((AGS_NOTATION_EDIT_KEY_L_CONTROL & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_CONTROL & (notation_edit->key_mask)) != 0){ if((AGS_NOTATION_META_ENABLED & (notation_editor->notation_meta->flags)) != 0){ notation_editor->notation_meta->flags &= (~AGS_NOTATION_META_ENABLED); gtk_widget_hide(notation_editor->notation_meta); }else{ notation_editor->notation_meta->flags |= AGS_NOTATION_META_ENABLED; gtk_widget_show_all(notation_editor->notation_meta); ags_notation_meta_refresh(notation_editor->notation_meta); } } } break; } } return(retval); } gboolean ags_notation_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; AgsMachine *machine; GtkAllocation allocation; double zoom_factor; gint i; gboolean retval; gboolean do_feedback; GRecMutex *audio_mutex; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_edit), AGS_TYPE_NOTATION_EDITOR); notation_toolbar = notation_editor->notation_toolbar; machine = notation_editor->selected_machine; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); if(machine != NULL){ /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(machine->audio); /* do feedback - initial set */ do_feedback = FALSE; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* check key value */ switch(event->keyval){ case GDK_KEY_Control_L: { notation_edit->key_mask &= (~AGS_NOTATION_EDIT_KEY_L_CONTROL); } break; case GDK_KEY_Control_R: { notation_edit->key_mask &= (~AGS_NOTATION_EDIT_KEY_R_CONTROL); } break; case GDK_KEY_Shift_L: { notation_edit->key_mask &= (~AGS_NOTATION_EDIT_KEY_L_SHIFT); } break; case GDK_KEY_Shift_R: { notation_edit->key_mask &= (~AGS_NOTATION_EDIT_KEY_R_SHIFT); } break; case GDK_KEY_Left: case GDK_KEY_leftarrow: { if((AGS_NOTATION_EDIT_KEY_L_SHIFT & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_SHIFT & (notation_edit->key_mask)) != 0){ AgsTimestamp *timestamp; if((AGS_NOTATION_EDITOR_PATTERN_MODE & (notation_editor->flags)) != 0){ return(retval); } /* shrink note */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_edit->cursor_position_x / AGS_NOTATION_DEFAULT_OFFSET); i = 0; do_feedback = TRUE; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ GList *list_notation; g_rec_mutex_lock(audio_mutex); list_notation = ags_notation_find_near_timestamp(machine->audio->notation, i, timestamp); if(list_notation != NULL){ AgsNote *note; note = ags_notation_find_point(AGS_NOTATION(list_notation->data), notation_edit->cursor_position_x, notation_edit->cursor_position_y, FALSE); if(note != NULL && note->x[1] - note->x[0] - zoom_factor >= zoom_factor){ note->x[1] -= zoom_factor; } } g_rec_mutex_unlock(audio_mutex); i++; } g_object_unref(timestamp); }else{ gdouble x0_offset; /* position cursor */ if(notation_edit->cursor_position_x > 0){ if(notation_edit->cursor_position_x - (zoom_factor) > 0){ notation_edit->cursor_position_x -= (zoom_factor); }else{ notation_edit->cursor_position_x = 0; } do_feedback = TRUE; } x0_offset = notation_edit->cursor_position_x * notation_edit->control_width; if(x0_offset / zoom_factor < gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar))){ gtk_range_set_value(GTK_RANGE(notation_edit->hscrollbar), x0_offset / zoom_factor); } } } break; case GDK_KEY_Right: case GDK_KEY_rightarrow: { if((AGS_NOTATION_EDIT_KEY_L_SHIFT & (notation_edit->key_mask)) != 0 || (AGS_NOTATION_EDIT_KEY_R_SHIFT & (notation_edit->key_mask)) != 0){ AgsTimestamp *timestamp; if((AGS_NOTATION_EDITOR_PATTERN_MODE & (notation_editor->flags)) != 0){ return(retval); } /* shrink note */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_edit->cursor_position_x / AGS_NOTATION_DEFAULT_OFFSET); i = 0; do_feedback = TRUE; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ GList *list_notation; g_rec_mutex_lock(audio_mutex); list_notation = ags_notation_find_near_timestamp(machine->audio->notation, i, timestamp); if(list_notation != NULL){ AgsNote *note; note = ags_notation_find_point(AGS_NOTATION(list_notation->data), notation_edit->cursor_position_x, notation_edit->cursor_position_y, FALSE); if(note != NULL){ note->x[1] += zoom_factor; } } g_rec_mutex_unlock(audio_mutex); i++; } g_object_unref(timestamp); }else{ gdouble x0_offset; /* position cursor */ if(notation_edit->cursor_position_x < AGS_NOTATION_EDITOR_MAX_CONTROLS){ notation_edit->cursor_position_x += (zoom_factor); do_feedback = TRUE; } x0_offset = notation_edit->cursor_position_x * notation_edit->control_width; if((x0_offset + notation_edit->control_width) / zoom_factor > gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)) + allocation.width){ gtk_range_set_value(GTK_RANGE(notation_edit->hscrollbar), x0_offset / zoom_factor); } } } break; case GDK_KEY_Up: case GDK_KEY_uparrow: { gdouble y0_offset; if(notation_edit->cursor_position_y > 0){ notation_edit->cursor_position_y -= 1; do_feedback = TRUE; } y0_offset = notation_edit->cursor_position_y * notation_edit->control_height; if(y0_offset < gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))){ gtk_range_set_value(GTK_RANGE(notation_edit->vscrollbar), y0_offset); } } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { gdouble y0_offset; if(notation_edit->cursor_position_y > 0){ notation_edit->cursor_position_y += 1; do_feedback = TRUE; } y0_offset = notation_edit->cursor_position_y * notation_edit->control_height; if(y0_offset < gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar))){ gtk_range_set_value(GTK_RANGE(notation_edit->vscrollbar), y0_offset); } } break; case GDK_KEY_space: { AgsNote *note; do_feedback = TRUE; note = ags_note_new(); note->x[0] = notation_edit->cursor_position_x; if((AGS_NOTATION_EDITOR_PATTERN_MODE & (notation_editor->flags)) == 0){ note->x[1] = notation_edit->cursor_position_x + zoom_factor; }else{ note->x[1] = note->x[0] + 1; } note->y = notation_edit->cursor_position_y; /* add note */ ags_notation_editor_add_note(notation_editor, note); } break; case GDK_KEY_Delete: { /* delete note */ ags_notation_editor_delete_note(notation_editor, notation_edit->cursor_position_x, notation_edit->cursor_position_y); } break; } gtk_widget_queue_draw((GtkWidget *) notation_edit); /* do feedback */ if(do_feedback){ ags_notation_editor_do_feedback(notation_editor); } } return(retval); } void ags_notation_edit_vscrollbar_value_changed(GtkRange *range, AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; GtkAdjustment *piano_adjustment; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); g_object_get(notation_editor->scrolled_piano->viewport, "vadjustment", &piano_adjustment, NULL); gtk_adjustment_set_value(piano_adjustment, gtk_range_get_value(range)); gtk_widget_queue_draw((GtkWidget *) notation_editor->scrolled_piano); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit->drawing_area); } void ags_notation_edit_hscrollbar_value_changed(GtkRange *range, AgsNotationEdit *notation_edit) { AgsConfig *config; gchar *str; gdouble gui_scale_factor; gdouble value; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } value = gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)) / (guint) (gui_scale_factor * 64.0); gtk_adjustment_set_value(notation_edit->ruler->adjustment, value); gtk_widget_queue_draw((GtkWidget *) notation_edit->ruler); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) notation_edit->drawing_area); } gsequencer-3.1.3/ags/X/editor/ags_ramp_acceleration_dialog.h0000644000175000017500000000534313607210263021046 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RAMP_ACCELERATION_DIALOG_H__ #define __AGS_RAMP_ACCELERATION_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RAMP_ACCELERATION_DIALOG (ags_ramp_acceleration_dialog_get_type()) #define AGS_RAMP_ACCELERATION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RAMP_ACCELERATION_DIALOG, AgsRampAccelerationDialog)) #define AGS_RAMP_ACCELERATION_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RAMP_ACCELERATION_DIALOG, AgsRampAccelerationDialogClass)) #define AGS_IS_RAMP_ACCELERATION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RAMP_ACCELERATION_DIALOG)) #define AGS_IS_RAMP_ACCELERATION_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RAMP_ACCELERATION_DIALOG)) #define AGS_RAMP_ACCELERATION_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_RAMP_ACCELERATION_DIALOG, AgsRampAccelerationDialogClass)) #define AGS_RAMP_ACCELERATION_MAX_BEATS (16 * 16 * 1200) #define AGS_RAMP_ACCELERATION_MAX_STEPS (128) #define AGS_RAMP_ACCELERATION_DEFAULT_WIDTH (64) typedef struct _AgsRampAccelerationDialog AgsRampAccelerationDialog; typedef struct _AgsRampAccelerationDialogClass AgsRampAccelerationDialogClass; typedef enum{ AGS_RAMP_ACCELERATION_DIALOG_CONNECTED = 1, }AgsRampAccelerationDialogFlags; struct _AgsRampAccelerationDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkComboBoxText *port; GtkSpinButton *ramp_x0; GtkSpinButton *ramp_y0; GtkSpinButton *ramp_x1; GtkSpinButton *ramp_y1; GtkSpinButton *ramp_step_count; }; struct _AgsRampAccelerationDialogClass { GtkDialogClass dialog; }; GType ags_ramp_acceleration_dialog_get_type(void); AgsRampAccelerationDialog* ags_ramp_acceleration_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_RAMP_ACCELERATION_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_pattern_envelope.c0000644000175000017500000013537013607210263017430 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_pattern_envelope_class_init(AgsPatternEnvelopeClass *pattern_envelope); void ags_pattern_envelope_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pattern_envelope_applicable_interface_init(AgsApplicableInterface *applicable); void ags_pattern_envelope_init(AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_connect(AgsConnectable *connectable); void ags_pattern_envelope_disconnect(AgsConnectable *connectable); void ags_pattern_envelope_finalize(GObject *gobject); void ags_pattern_envelope_set_update(AgsApplicable *applicable, gboolean update); void ags_pattern_envelope_apply(AgsApplicable *applicable); void ags_pattern_envelope_reset(AgsApplicable *applicable); gchar* ags_pattern_envelope_x_label_func(gdouble value, gpointer data); gchar* ags_pattern_envelope_y_label_func(gdouble value, gpointer data); /** * SECTION:ags_pattern_envelope * @short_description: Edit envelope presets * @title: AgsPatternEnvelope * @section_id: * @include: ags/X/editor/ags_pattern_envelope.h * * #AgsPatternEnvelope is a composite widget to edit envelope controls * by applying to #AgsPreset used by ags-copy-pattern recall. */ static gpointer ags_pattern_envelope_parent_class = NULL; GType ags_pattern_envelope_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pattern_envelope = 0; static const GTypeInfo ags_pattern_envelope_info = { sizeof (AgsPatternEnvelopeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pattern_envelope_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPatternEnvelope), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pattern_envelope_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pattern_envelope_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_pattern_envelope_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pattern_envelope = g_type_register_static(GTK_TYPE_VBOX, "AgsPatternEnvelope", &ags_pattern_envelope_info, 0); g_type_add_interface_static(ags_type_pattern_envelope, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_pattern_envelope, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pattern_envelope); } return g_define_type_id__volatile; } void ags_pattern_envelope_class_init(AgsPatternEnvelopeClass *pattern_envelope) { GObjectClass *gobject; ags_pattern_envelope_parent_class = g_type_class_peek_parent(pattern_envelope); /* GObjectClass */ gobject = (GObjectClass *) pattern_envelope; gobject->finalize = ags_pattern_envelope_finalize; } void ags_pattern_envelope_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_pattern_envelope_connect; connectable->disconnect = ags_pattern_envelope_disconnect; } void ags_pattern_envelope_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_pattern_envelope_set_update; applicable->apply = ags_pattern_envelope_apply; applicable->reset = ags_pattern_envelope_reset; } void ags_pattern_envelope_init(AgsPatternEnvelope *pattern_envelope) { GtkTable *table; GtkHBox *hbox; GtkVBox *control; AgsCartesian *cartesian; GtkLabel *label; GtkCellRenderer *edit_renderer; GtkCellRenderer *plot_renderer; GtkCellRenderer *renderer; GtkListStore *model; gdouble width, height; pattern_envelope->flags = 0; pattern_envelope->version = AGS_PATTERN_ENVELOPE_DEFAULT_VERSION; pattern_envelope->build_id = AGS_PATTERN_ENVELOPE_DEFAULT_BUILD_ID; /* enabled */ //NOTE:JK: it is edited in place since only preset is used pattern_envelope->enabled = NULL; // gtk_check_button_new_with_label(i18n("enabled")); // gtk_box_pack_start((GtkBox *) pattern_envelope, // pattern_envelope->enabled, // FALSE, FALSE, // 0); /* cartesian */ cartesian = pattern_envelope->cartesian = ags_cartesian_new(); cartesian->x_label_func = ags_pattern_envelope_x_label_func; cartesian->y_label_func = ags_pattern_envelope_y_label_func; ags_cartesian_fill_label(cartesian, TRUE); ags_cartesian_fill_label(cartesian, FALSE); /* cartesian - width and height */ width = cartesian->x_end - cartesian->x_start; height = cartesian->y_end - cartesian->y_start; /* cartesian - size, pack and redraw */ gtk_widget_set_size_request((GtkWidget *) cartesian, (gint) width + 2.0 * cartesian->x_margin, (gint) height + 2.0 * cartesian->y_margin); gtk_box_pack_start((GtkBox *) pattern_envelope, (GtkWidget *) cartesian, FALSE, FALSE, 0); gtk_widget_queue_draw((GtkWidget *) cartesian); /* tree view */ pattern_envelope->tree_view = (GtkTreeView *) gtk_tree_view_new(); g_object_set(pattern_envelope->tree_view, "enable-grid-lines", TRUE, NULL); model = gtk_list_store_new(AGS_PATTERN_ENVELOPE_COLUMN_LAST, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); gtk_tree_view_set_model(pattern_envelope->tree_view, GTK_TREE_MODEL(model)); edit_renderer = gtk_cell_renderer_toggle_new(); plot_renderer = gtk_cell_renderer_toggle_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("edit"), edit_renderer, "active", AGS_PATTERN_ENVELOPE_COLUMN_EDIT, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("plot"), plot_renderer, "active", AGS_PATTERN_ENVELOPE_COLUMN_PLOT, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("preset"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("audio channel start"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_START, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("audio channel end"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_END, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("pad start"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_PAD_START, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("pad end"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_PAD_END, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("x start"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_X_START, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(pattern_envelope->tree_view), -1, i18n("x end"), renderer, "text", AGS_PATTERN_ENVELOPE_COLUMN_X_END, NULL); gtk_box_pack_start((GtkBox *) pattern_envelope, (GtkWidget *) pattern_envelope->tree_view, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(edit_renderer), "toggled\0", G_CALLBACK(ags_pattern_envelope_edit_callback), pattern_envelope); g_signal_connect(G_OBJECT(plot_renderer), "toggled\0", G_CALLBACK(ags_pattern_envelope_plot_callback), pattern_envelope); /* table */ table = (GtkTable *) gtk_table_new(6, 2, FALSE); gtk_box_pack_start((GtkBox *) pattern_envelope, GTK_WIDGET(table), FALSE, FALSE, 0); /* audio channel - start */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("audio channel start"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->audio_channel_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->audio_channel_start), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* audio channel - end */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("audio channel end"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->audio_channel_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->audio_channel_end), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* pad - start */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("pad start"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->pad_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->pad_start), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* pad - end */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("pad end"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->pad_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->pad_end), 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* x - start */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("x start"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->x_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->x_start), 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0); /* x - end */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("x end"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->x_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65535.0, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->x_end), 1, 2, 5, 6, GTK_FILL, GTK_FILL, 0, 0); /* table */ table = (GtkTable *) gtk_table_new(5, 2, FALSE); gtk_box_pack_start((GtkBox *) pattern_envelope, GTK_WIDGET(table), FALSE, FALSE, 0); /* attack */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("attack"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); pattern_envelope->attack_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->attack_x, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->attack_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->attack_x, FALSE, FALSE, 0); pattern_envelope->attack_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->attack_y, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->attack_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->attack_y, FALSE, FALSE, 0); /* decay */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("decay"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); pattern_envelope->decay_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->decay_x, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->decay_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->decay_x, FALSE, FALSE, 0); pattern_envelope->decay_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->decay_y, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->decay_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->decay_y, FALSE, FALSE, 0); /* sustain */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("sustain"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); pattern_envelope->sustain_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->sustain_x, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->sustain_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->sustain_x, FALSE, FALSE, 0); pattern_envelope->sustain_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->sustain_y, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->sustain_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->sustain_y, FALSE, FALSE, 0); /* release */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("release"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0); control = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(control), 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); pattern_envelope->release_x = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->release_x, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->release_x, 0.25); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->release_x, FALSE, FALSE, 0); pattern_envelope->release_y = (GtkHScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->release_y, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->release_y, 0.0); gtk_box_pack_start((GtkBox *) control, (GtkWidget *) pattern_envelope->release_y, FALSE, FALSE, 0); /* ratio */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("ratio"), "xalign", 0.0, "yalign", 1.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); pattern_envelope->ratio = (GtkHScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_scale_set_draw_value((GtkScale *) pattern_envelope->ratio, TRUE); gtk_range_set_value((GtkRange *) pattern_envelope->ratio, 1.0); gtk_table_attach(table, GTK_WIDGET(pattern_envelope->ratio), 1, 2, 4, 5, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); /* rename dialog */ pattern_envelope->rename = NULL; /* hbox - actions */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) pattern_envelope, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* move up */ pattern_envelope->move_up = (GtkButton *) gtk_button_new_with_label(i18n("move up")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(pattern_envelope->move_up), FALSE, FALSE, 0); /* move down */ pattern_envelope->move_down = (GtkButton *) gtk_button_new_with_label(i18n("move down")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(pattern_envelope->move_down), FALSE, FALSE, 0); /* add */ pattern_envelope->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(pattern_envelope->add), FALSE, FALSE, 0); /* remove */ pattern_envelope->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(pattern_envelope->remove), FALSE, FALSE, 0); } void ags_pattern_envelope_connect(AgsConnectable *connectable) { AgsPatternEnvelope *pattern_envelope; pattern_envelope = AGS_PATTERN_ENVELOPE(connectable); if((AGS_PATTERN_ENVELOPE_CONNECTED & (pattern_envelope->flags)) != 0){ return; } pattern_envelope->flags |= AGS_PATTERN_ENVELOPE_CONNECTED; /* audio channel start/end */ g_signal_connect((GObject *) pattern_envelope->audio_channel_start, "value-changed", G_CALLBACK(ags_pattern_envelope_audio_channel_start_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->audio_channel_end, "value-changed", G_CALLBACK(ags_pattern_envelope_audio_channel_end_callback), (gpointer) pattern_envelope); /* pad start/end */ g_signal_connect((GObject *) pattern_envelope->pad_start, "value-changed", G_CALLBACK(ags_pattern_envelope_pad_start_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->pad_end, "value-changed", G_CALLBACK(ags_pattern_envelope_pad_end_callback), (gpointer) pattern_envelope); /* x start/end */ g_signal_connect((GObject *) pattern_envelope->x_start, "value-changed", G_CALLBACK(ags_pattern_envelope_x_start_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->x_end, "value-changed", G_CALLBACK(ags_pattern_envelope_x_end_callback), (gpointer) pattern_envelope); /* attack x,y */ g_signal_connect((GObject *) pattern_envelope->attack_x, "value-changed", G_CALLBACK(ags_pattern_envelope_attack_x_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->attack_y, "value-changed", G_CALLBACK(ags_pattern_envelope_attack_y_callback), (gpointer) pattern_envelope); /* decay x,y */ g_signal_connect((GObject *) pattern_envelope->decay_x, "value-changed", G_CALLBACK(ags_pattern_envelope_decay_x_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->decay_y, "value-changed", G_CALLBACK(ags_pattern_envelope_decay_y_callback), (gpointer) pattern_envelope); /* sustain x,y */ g_signal_connect((GObject *) pattern_envelope->sustain_x, "value-changed", G_CALLBACK(ags_pattern_envelope_sustain_x_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->sustain_y, "value-changed", G_CALLBACK(ags_pattern_envelope_sustain_y_callback), (gpointer) pattern_envelope); /* release x,y */ g_signal_connect((GObject *) pattern_envelope->release_x, "value-changed", G_CALLBACK(ags_pattern_envelope_release_x_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->release_y, "value-changed", G_CALLBACK(ags_pattern_envelope_release_y_callback), (gpointer) pattern_envelope); /* ratio y */ g_signal_connect((GObject *) pattern_envelope->ratio, "value-changed", G_CALLBACK(ags_pattern_envelope_ratio_callback), (gpointer) pattern_envelope); /* move up/down preset */ g_signal_connect((GObject *) pattern_envelope->move_up, "clicked", G_CALLBACK(ags_pattern_envelope_preset_move_up_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->move_down, "clicked", G_CALLBACK(ags_pattern_envelope_preset_move_down_callback), (gpointer) pattern_envelope); /* add/remove preset */ g_signal_connect((GObject *) pattern_envelope->add, "clicked", G_CALLBACK(ags_pattern_envelope_preset_add_callback), (gpointer) pattern_envelope); g_signal_connect((GObject *) pattern_envelope->remove, "clicked", G_CALLBACK(ags_pattern_envelope_preset_remove_callback), (gpointer) pattern_envelope); } void ags_pattern_envelope_disconnect(AgsConnectable *connectable) { AgsPatternEnvelope *pattern_envelope; pattern_envelope = AGS_PATTERN_ENVELOPE(connectable); if((AGS_PATTERN_ENVELOPE_CONNECTED & (pattern_envelope->flags)) == 0){ return; } pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_CONNECTED); /* audio channel start/end */ g_object_disconnect((GObject *) pattern_envelope->audio_channel_start, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_audio_channel_start_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->audio_channel_end, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_audio_channel_end_callback), (gpointer) pattern_envelope, NULL); /* pad start/end */ g_object_disconnect((GObject *) pattern_envelope->pad_start, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_pad_start_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->pad_end, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_pad_end_callback), (gpointer) pattern_envelope, NULL); /* x start/end */ g_object_disconnect((GObject *) pattern_envelope->x_start, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_x_start_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->x_end, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_x_end_callback), (gpointer) pattern_envelope, NULL); /* attack x,y */ g_object_disconnect((GObject *) pattern_envelope->attack_x, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_attack_x_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->attack_y, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_attack_y_callback), (gpointer) pattern_envelope, NULL); /* decay x,y */ g_object_disconnect((GObject *) pattern_envelope->decay_x, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_decay_x_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->decay_y, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_decay_y_callback), (gpointer) pattern_envelope, NULL); /* sustain x,y */ g_object_disconnect((GObject *) pattern_envelope->sustain_x, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_sustain_x_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->sustain_y, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_sustain_y_callback), (gpointer) pattern_envelope, NULL); /* release x,y */ g_object_disconnect((GObject *) pattern_envelope->release_x, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_release_x_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->release_y, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_release_y_callback), (gpointer) pattern_envelope, NULL); /* ratio */ g_object_disconnect((GObject *) pattern_envelope->ratio, "any_signal::value-changed", G_CALLBACK(ags_pattern_envelope_ratio_callback), (gpointer) pattern_envelope, NULL); /* move up/down preset */ g_object_disconnect((GObject *) pattern_envelope->move_up, "any_signal::clicked", G_CALLBACK(ags_pattern_envelope_preset_move_up_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->move_down, "any_signal::clicked", G_CALLBACK(ags_pattern_envelope_preset_move_down_callback), (gpointer) pattern_envelope, NULL); /* add/remove preset */ g_object_disconnect((GObject *) pattern_envelope->add, "any_signal::clicked", G_CALLBACK(ags_pattern_envelope_preset_add_callback), (gpointer) pattern_envelope, NULL); g_object_disconnect((GObject *) pattern_envelope->remove, "any_signal::clicked", G_CALLBACK(ags_pattern_envelope_preset_remove_callback), (gpointer) pattern_envelope, NULL); } void ags_pattern_envelope_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_pattern_envelope_parent_class)->finalize(gobject); } void ags_pattern_envelope_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_pattern_envelope_apply(AgsApplicable *applicable) { /* empty */ } void ags_pattern_envelope_reset(AgsApplicable *applicable) { AgsPatternEnvelope *pattern_envelope; pattern_envelope = AGS_PATTERN_ENVELOPE(applicable); ags_pattern_envelope_load_preset(pattern_envelope); } gchar* ags_pattern_envelope_x_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 10.0); g_free(format); return(str); } gchar* ags_pattern_envelope_y_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 10.0); g_free(format); return(str); } /** * ags_pattern_envelope_get_active_preset: * @pattern_envelope: the #AgsPatternEnvelope * * Get active preset. * * Returns: the matching #AgsPreset, if none selected %NULL * * Since: 3.0.0 */ AgsPreset* ags_pattern_envelope_get_active_preset(AgsPatternEnvelope *pattern_envelope) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; GtkTreeModel *model; GtkTreeIter iter; AgsAudio *audio; AgsPreset *current; GList *start_preset, *preset; gchar *preset_name; gboolean do_edit; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return(NULL); } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get model */ model = gtk_tree_view_get_model(pattern_envelope->tree_view); /* get active */ do_edit = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, &do_edit, -1); if(do_edit){ break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(!do_edit){ return(NULL); } /* preset name */ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, &preset_name, -1); /* find preset */ g_object_get(audio, "preset", &start_preset, NULL); preset = start_preset; current = NULL; preset = ags_preset_find_name(preset, preset_name); if(preset != NULL){ current = preset->data; } g_list_free_full(start_preset, g_object_unref); return(current); } /** * ags_pattern_envelope_load_preset: * @pattern_envelope: the #AgsPatternEnvelope * * Load preset. * * Since: 3.0.0 */ void ags_pattern_envelope_load_preset(AgsPatternEnvelope *pattern_envelope) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; GtkListStore *model; GtkTreeIter iter; AgsAudio *audio; GList *start_preset, *preset; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get model */ model = GTK_LIST_STORE(gtk_tree_view_get_model(pattern_envelope->tree_view)); /* clear old */ gtk_list_store_clear(model); /* create new */ g_object_get(audio, "preset", &start_preset, NULL); preset = start_preset; while(preset != NULL){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, AGS_PRESET(preset->data)->preset_name, AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_START, AGS_PRESET(preset->data)->audio_channel_start, AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_END, AGS_PRESET(preset->data)->audio_channel_end, AGS_PATTERN_ENVELOPE_COLUMN_PAD_START, AGS_PRESET(preset->data)->pad_start, AGS_PATTERN_ENVELOPE_COLUMN_PAD_END, AGS_PRESET(preset->data)->pad_end, AGS_PATTERN_ENVELOPE_COLUMN_X_START, AGS_PRESET(preset->data)->x_start, AGS_PATTERN_ENVELOPE_COLUMN_X_END, AGS_PRESET(preset->data)->x_end, -1); preset = preset->next; } g_list_free_full(start_preset, g_object_unref); } /** * ags_pattern_envelope_set_preset_property: * @pattern_envelope: the #AgsPatternEnvelope * @preset: the preset name * @property_name: the property name * @value: the #GValue-struct * * Set preset property. * * Since: 3.0.0 */ void ags_pattern_envelope_set_preset_property(AgsPatternEnvelope *pattern_envelope, AgsPreset *preset, gchar *property_name, GValue *value) { if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return; } /* set property */ g_object_set_property((GObject *) preset, property_name, value); /* reset */ ags_pattern_envelope_reset_tree_view(pattern_envelope); } /** * ags_pattern_envelope_add_preset: * @pattern_envelope: the #AgsPatternEnvelope * @preset_name: the preset name * * Add preset. * * Since: 3.0.0 */ void ags_pattern_envelope_add_preset(AgsPatternEnvelope *pattern_envelope, gchar *preset_name) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; AgsAudio *audio; AgsPreset *preset; GList *start_preset; AgsComplex *val; GValue value = {0,}; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope) || preset_name == NULL){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* check if already present */ g_object_get(audio, "preset", &start_preset, NULL); if(ags_preset_find_name(start_preset, preset_name) != NULL){ g_list_free_full(start_preset, g_object_unref); return; } /* create preset */ preset = g_object_new(AGS_TYPE_PRESET, "scope", "ags-envelope", "preset-name", preset_name, NULL); ags_audio_add_preset(audio, (GObject *) preset); /* preset - ratio */ val = ags_complex_alloc(); ags_complex_set(val, 0.0 + 1.0 * I); g_value_init(&value, AGS_TYPE_COMPLEX); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "ratio", &value); /* preset - attack */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + 0.0 * I); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "attack", &value); /* preset - decay */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + 0.0 * I); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "decay", &value); /* preset - sustain */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + 0.0 * I); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "sustain", &value); /* preset - release */ val = ags_complex_alloc(); ags_complex_set(val, 0.25 + 0.0 * I); g_value_reset(&value); g_value_set_boxed(&value, val); ags_preset_add_parameter(preset, "release", &value); g_list_free_full(start_preset, g_object_unref); } /** * ags_pattern_envelope_remove_preset: * @pattern_envelope: the #AgsPatternEnvelope * @nth: the nth preset to remove * * Remove preset. * * Since: 3.0.0 */ void ags_pattern_envelope_remove_preset(AgsPatternEnvelope *pattern_envelope, guint nth) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; AgsAudio *audio; AgsPreset *preset; GList *start_preset; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* create preset */ g_object_get(audio, "preset", &start_preset, NULL); preset = g_list_nth_data(start_preset, nth); ags_audio_remove_preset(audio, (GObject *) preset); g_list_free_full(start_preset, g_object_unref); } /** * ags_pattern_envelope_reset_control: * @pattern_envelope: the #AgsPatternEnvelope * * Reset controls. * * Since: 3.0.0 */ void ags_pattern_envelope_reset_control(AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; guint audio_channel_start, audio_channel_end; guint pad_start, pad_end; guint x_start, x_end; GValue value = {0,}; GError *error; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return; } /* disable update */ pattern_envelope->flags |= AGS_PATTERN_ENVELOPE_NO_UPDATE; /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); return; } /* get preset properties */ g_object_get(preset, "audio-channel-start", &audio_channel_start, "audio-channel-end", &audio_channel_end, "pad-start", &pad_start, "pad-end", &pad_end, "x-start", &x_start, "x-end", &x_end, NULL); gtk_spin_button_set_value(pattern_envelope->audio_channel_start, audio_channel_start); gtk_spin_button_set_value(pattern_envelope->audio_channel_end, audio_channel_end); gtk_spin_button_set_value(pattern_envelope->pad_start, pad_start); gtk_spin_button_set_value(pattern_envelope->pad_end, pad_end); gtk_spin_button_set_value(pattern_envelope->x_start, x_start); gtk_spin_button_set_value(pattern_envelope->x_end, x_end); /* attack */ g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "attack", &value, &error); if(error != NULL){ g_warning("%s", error->message); pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); gtk_range_set_value((GtkRange *) pattern_envelope->attack_x, val[0].real); gtk_range_set_value((GtkRange *) pattern_envelope->attack_y, val[0].imag); /* decay */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "decay", &value, &error); if(error != NULL){ g_warning("%s", error->message); pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); gtk_range_set_value((GtkRange *) pattern_envelope->decay_x, val[0].real); gtk_range_set_value((GtkRange *) pattern_envelope->decay_y, val[0].imag); /* sustain */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "sustain", &value, &error); if(error != NULL){ g_warning("%s", error->message); pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); gtk_range_set_value((GtkRange *) pattern_envelope->sustain_x, val[0].real); gtk_range_set_value((GtkRange *) pattern_envelope->sustain_y, val[0].imag); /* release */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "release", &value, &error); if(error != NULL){ g_warning("%s", error->message); pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); gtk_range_set_value((GtkRange *) pattern_envelope->release_x, val[0].real); gtk_range_set_value((GtkRange *) pattern_envelope->release_y, val[0].imag); /* ratio */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset, "ratio", &value, &error); if(error != NULL){ g_warning("%s", error->message); pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); gtk_range_set_value((GtkRange *) pattern_envelope->ratio, val[0].imag); /* unset no update */ pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); } /** * ags_pattern_envelope_reset_tree_view: * @pattern_envelope: the #AgsPatternEnvelope * * Reset tree view. * * Since: 3.0.0 */ void ags_pattern_envelope_reset_tree_view(AgsPatternEnvelope *pattern_envelope) { GtkTreeModel *model; GtkTreeIter iter; AgsPreset *preset; gboolean do_edit; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return; } /* disable update */ pattern_envelope->flags |= AGS_PATTERN_ENVELOPE_NO_UPDATE; /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); return; } /* get model and get editing iter */ model = gtk_tree_view_get_model(pattern_envelope->tree_view); do_edit = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, &do_edit, -1); if(do_edit){ break; } }while(gtk_tree_model_iter_next(model, &iter)); } /* update row */ if(do_edit){ guint audio_channel_start, audio_channel_end; guint pad_start, pad_end; guint x_start, x_end; g_object_get(preset, "audio-channel-start", &audio_channel_start, "audio-channel-end", &audio_channel_end, "pad-start", &pad_start, "pad-end", &pad_end, "x-start", &x_start, "x-end", &x_end, NULL); gtk_list_store_set(GTK_LIST_STORE(model), &iter, AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_START, audio_channel_start, AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_END, audio_channel_end, AGS_PATTERN_ENVELOPE_COLUMN_PAD_START, pad_start, AGS_PATTERN_ENVELOPE_COLUMN_PAD_END, pad_end, AGS_PATTERN_ENVELOPE_COLUMN_X_START, x_start, AGS_PATTERN_ENVELOPE_COLUMN_X_END, x_end, -1); } /* unset no update */ pattern_envelope->flags &= (~AGS_PATTERN_ENVELOPE_NO_UPDATE); } /** * ags_pattern_envelope_plot: * @pattern_envelope: the #AgsPatternEnvelope * * Plot envelope. * * Since: 3.0.0 */ void ags_pattern_envelope_plot(AgsPatternEnvelope *pattern_envelope) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; AgsCartesian *cartesian; AgsPlot *plot; GtkTreeModel *model; GtkTreeIter iter; AgsAudio *audio; GList *preset; AgsComplex *val; gchar *preset_name; gdouble default_width, default_height; gdouble offset; gboolean do_plot; GValue value = {0,}; GError *error; if(!AGS_IS_PATTERN_ENVELOPE(pattern_envelope)){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get dimension of cartesian */ cartesian = pattern_envelope->cartesian; default_width = cartesian->x_step_width * cartesian->x_scale_step_width; default_height = cartesian->y_step_height * cartesian->y_scale_step_height; /* get model */ model = GTK_TREE_MODEL(gtk_tree_view_get_model(pattern_envelope->tree_view)); /* clear old plot */ if(cartesian->plot != NULL){ g_list_free_full(cartesian->plot, (GDestroyNotify) ags_plot_free); cartesian->plot = NULL; } /* plot */ if(gtk_tree_model_get_iter_first(model, &iter)){ g_value_init(&value, AGS_TYPE_COMPLEX); do{ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PLOT, &do_plot, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, &preset_name, -1); if(do_plot){ gdouble ratio; preset = ags_preset_find_name(audio->preset, preset_name); /* AgsPlot struct */ plot = ags_plot_alloc(5, 0, 0); plot->join_points = TRUE; plot->point_color[0][0] = 0.125; plot->point_color[0][1] = 0.5; plot->point_color[0][2] = 1.0; plot->point_color[1][0] = 0.125; plot->point_color[1][1] = 0.5; plot->point_color[1][2] = 1.0; plot->point_color[2][0] = 0.125; plot->point_color[2][1] = 0.5; plot->point_color[2][2] = 1.0; plot->point_color[3][0] = 0.125; plot->point_color[3][1] = 0.5; plot->point_color[3][2] = 1.0; plot->point_color[4][0] = 0.125; plot->point_color[4][1] = 0.5; plot->point_color[4][2] = 1.0; /* add plot */ ags_cartesian_add_plot(cartesian, plot); /* set plot points - ratio */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset->data, "ratio", &value, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); continue; } val = (AgsComplex *) g_value_get_boxed(&value); ratio = val[0].imag; plot->point[0][0] = 0.0; plot->point[0][1] = default_height * val[0].imag; /* set plot points - attack */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset->data, "attack", &value, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); continue; } val = (AgsComplex *) g_value_get_boxed(&value); plot->point[1][0] = default_width * val[0].real; plot->point[1][1] = default_height * (val[0].imag + ratio); offset = default_width * val[0].real; /* set plot points - decay */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset->data, "decay", &value, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); continue; } val = (AgsComplex *) g_value_get_boxed(&value); plot->point[2][0] = offset + default_width * val[0].real; plot->point[2][1] = default_height * (val[0].imag + ratio); offset += default_width * val[0].real; /* set plot points - sustain */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset->data, "sustain", &value, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); continue; } val = (AgsComplex *) g_value_get_boxed(&value); plot->point[3][0] = offset + default_width * val[0].real; plot->point[3][1] = default_height * (val[0].imag + ratio); offset += default_width * val[0].real; /* set plot points - release */ g_value_reset(&value); error = NULL; ags_preset_get_parameter(preset->data, "release", &value, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); continue; } val = (AgsComplex *) g_value_get_boxed(&value); plot->point[4][0] = offset + default_width * val[0].real; plot->point[4][1] = default_height * (val[0].imag + ratio); } }while(gtk_tree_model_iter_next(model, &iter)); } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) cartesian); } /** * ags_pattern_envelope_new: * * Creates an #AgsPatternEnvelope * * Returns: a new #AgsPatternEnvelope * * Since: 3.0.0 */ AgsPatternEnvelope* ags_pattern_envelope_new() { AgsPatternEnvelope *pattern_envelope; pattern_envelope = (AgsPatternEnvelope *) g_object_new(AGS_TYPE_PATTERN_ENVELOPE, NULL); return(pattern_envelope); } gsequencer-3.1.3/ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c0000644000175000017500000000257413605312646023664 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_position_wave_cursor_dialog_response_callback(GtkWidget *dialog, gint response, AgsPositionWaveCursorDialog *position_wave_cursor_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(position_wave_cursor_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) position_wave_cursor_dialog); } } } } gsequencer-3.1.3/ags/X/editor/ags_envelope_info.h0000644000175000017500000000513413607210263016705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_INFO_H__ #define __AGS_ENVELOPE_INFO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_INFO (ags_envelope_info_get_type()) #define AGS_ENVELOPE_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_INFO, AgsEnvelopeInfo)) #define AGS_ENVELOPE_INFO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_INFO, AgsEnvelopeInfoClass)) #define AGS_IS_ENVELOPE_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ENVELOPE_INFO)) #define AGS_IS_ENVELOPE_INFO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ENVELOPE_INFO)) #define AGS_ENVELOPE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ENVELOPE_INFO, AgsEnvelopeInfoClass)) #define AGS_ENVELOPE_INFO_DEFAULT_VERSION "0.8.2" #define AGS_ENVELOPE_INFO_DEFAULT_BUILD_ID "CEST 24-05-2017 10:19" typedef struct _AgsEnvelopeInfo AgsEnvelopeInfo; typedef struct _AgsEnvelopeInfoClass AgsEnvelopeInfoClass; typedef enum{ AGS_ENVELOPE_INFO_CONNECTED = 1, }AgsEnvelopeInfoFlags; typedef enum{ AGS_ENVELOPE_INFO_COLUMN_PLOT, AGS_ENVELOPE_INFO_COLUMN_AUDIO_CHANNEL, AGS_ENVELOPE_INFO_COLUMN_NOTE_X0, AGS_ENVELOPE_INFO_COLUMN_NOTE_X1, AGS_ENVELOPE_INFO_COLUMN_NOTE_Y, AGS_ENVELOPE_INFO_COLUMN_LAST, }AgsEnvelopeInfoColumn; struct _AgsEnvelopeInfo { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; GList *selection; AgsCartesian *cartesian; GtkTreeView *tree_view; }; struct _AgsEnvelopeInfoClass { GtkVBoxClass vbox; }; GType ags_envelope_info_get_type(void); void ags_envelope_info_plot(AgsEnvelopeInfo *envelope_info); AgsEnvelopeInfo* ags_envelope_info_new(); G_END_DECLS #endif /*__AGS_ENVELOPE_INFO_H__*/ gsequencer-3.1.3/ags/X/editor/ags_envelope_info_callbacks.h0000644000175000017500000000236213607210263020704 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_INFO_CALLBACKS_H__ #define __AGS_ENVELOPE_INFO_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_envelope_info_plot_callback(GtkCellRendererToggle *cell_renderer, gchar *path_str, AgsEnvelopeInfo *envelope_info); G_END_DECLS #endif /*__AGS_ENVELOPE_INFO_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_move_note_dialog.h0000644000175000017500000000460013607210263017364 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MOVE_NOTE_DIALOG_H__ #define __AGS_MOVE_NOTE_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MOVE_NOTE_DIALOG (ags_move_note_dialog_get_type()) #define AGS_MOVE_NOTE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MOVE_NOTE_DIALOG, AgsMoveNoteDialog)) #define AGS_MOVE_NOTE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MOVE_NOTE_DIALOG, AgsMoveNoteDialogClass)) #define AGS_IS_MOVE_NOTE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MOVE_NOTE_DIALOG)) #define AGS_IS_MOVE_NOTE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MOVE_NOTE_DIALOG)) #define AGS_MOVE_NOTE_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_MOVE_NOTE_DIALOG, AgsMoveNoteDialogClass)) #define AGS_MOVE_NOTE_DIALOG_MAX_X (16 * 19200) #define AGS_MOVE_NOTE_DIALOG_MAX_Y (1024) typedef struct _AgsMoveNoteDialog AgsMoveNoteDialog; typedef struct _AgsMoveNoteDialogClass AgsMoveNoteDialogClass; typedef enum{ AGS_MOVE_NOTE_DIALOG_CONNECTED = 1, }AgsMoveNoteDialogFlags; struct _AgsMoveNoteDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkRadioButton *relative; GtkRadioButton *absolute; GtkSpinButton *move_x; GtkSpinButton *move_y; }; struct _AgsMoveNoteDialogClass { GtkDialogClass dialog; }; GType ags_move_note_dialog_get_type(void); AgsMoveNoteDialog* ags_move_note_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_MOVE_NOTE_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_machine_selection.c0000644000175000017500000001771613607210263017532 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include void ags_machine_selection_class_init(AgsMachineSelectionClass *machine_selection); void ags_machine_selection_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_selection_init(AgsMachineSelection *machine_selection); void ags_machine_selection_connect(AgsConnectable *connectable); void ags_machine_selection_disconnect(AgsConnectable *connectable); void ags_machine_selection_finalize(GObject *gobject); /** * SECTION:ags_machine_selection * @short_description: machine selection * @title: AgsMachineSelection * @section_id: * @include: ags/X/editor/ags_machine_selection.h * * The #AgsMachineSelection enables you make choice of an #AgsMachine. */ static gpointer ags_machine_selection_parent_class = NULL; GType ags_machine_selection_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine_selection = 0; static const GTypeInfo ags_machine_selection_info = { sizeof (AgsMachineSelectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_selection_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachineSelection), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_selection_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_selection_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine_selection = g_type_register_static(GTK_TYPE_DIALOG, "AgsMachineSelection", &ags_machine_selection_info, 0); g_type_add_interface_static(ags_type_machine_selection, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine_selection); } return g_define_type_id__volatile; } void ags_machine_selection_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_selection_connect; connectable->disconnect = ags_machine_selection_disconnect; } void ags_machine_selection_class_init(AgsMachineSelectionClass *machine_selection) { GObjectClass *gobject; ags_machine_selection_parent_class = g_type_class_peek_parent(machine_selection); /* GObjectClass */ gobject = (GObjectClass *) machine_selection; gobject->finalize = ags_machine_selection_finalize; } void ags_machine_selection_init(AgsMachineSelection *machine_selection) { machine_selection->flags = 0; g_object_set(G_OBJECT(machine_selection), "modal", TRUE, "title", i18n("select machines"), NULL); gtk_dialog_add_buttons(GTK_DIALOG(machine_selection), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); } void ags_machine_selection_connect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_machine_selection_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_machine_selection_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_machine_selection_parent_class)->finalize(gobject); } void ags_machine_selection_load_defaults(AgsMachineSelection *machine_selection) { AgsMachine *machine; AgsMachineRadioButton *machine_radio_button; GtkVBox *vbox; GtkRadioButton *group; GList *list, *list_start, *index, *index_start; gchar *str; gint response; machine_selection->machine = list = gtk_container_get_children(GTK_CONTAINER(machine_selection->window->machines)); machine = NULL; vbox = (GtkVBox *) gtk_dialog_get_content_area(GTK_DIALOG(machine_selection)); group = NULL; while(list != NULL){ GtkRadioButton *radio_button; if((AGS_MACHINE_SELECTION_NOTATION & (machine_selection->flags)) != 0){ if(AGS_IS_DRUM(list->data) || AGS_IS_MATRIX(list->data) || AGS_IS_SYNCSYNTH(list->data) || AGS_IS_FM_SYNCSYNTH(list->data) || #ifdef AGS_WITH_LIBINSTPATCH AGS_IS_FFPLAYER(list->data) || #endif AGS_IS_PITCH_SAMPLER(list->data) || AGS_IS_DSSI_BRIDGE(list->data) || (AGS_IS_LV2_BRIDGE(list->data) && (AGS_MACHINE_IS_SYNTHESIZER & (AGS_MACHINE(list->data)->flags)) != 0) || AGS_IS_LIVE_DSSI_BRIDGE(list->data) || AGS_IS_LIVE_LV2_BRIDGE(list->data)){ str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(list->data), AGS_MACHINE(list->data)->machine_name); radio_button = (GtkRadioButton *) gtk_radio_button_new_with_label_from_widget(group, str); g_object_set_data((GObject *) radio_button, AGS_MACHINE_SELECTION_INDEX, list->data); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(radio_button), FALSE, FALSE, 0); g_free(str); if(group == NULL){ group = radio_button; } } }else if((AGS_MACHINE_SELECTION_AUTOMATION & (machine_selection->flags)) != 0){ str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(list->data), AGS_MACHINE(list->data)->machine_name); radio_button = (GtkRadioButton *) gtk_radio_button_new_with_label_from_widget(group, str); g_object_set_data((GObject *) radio_button, AGS_MACHINE_SELECTION_INDEX, list->data); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(radio_button), FALSE, FALSE, 0); g_free(str); if(group == NULL){ group = radio_button; } }else if((AGS_MACHINE_SELECTION_WAVE & (machine_selection->flags)) != 0){ if(AGS_IS_AUDIOREC(list->data)){ str = g_strdup_printf("%s: %s", G_OBJECT_TYPE_NAME(list->data), AGS_MACHINE(list->data)->machine_name); radio_button = (GtkRadioButton *) gtk_radio_button_new_with_label_from_widget(group, str); g_object_set_data((GObject *) radio_button, AGS_MACHINE_SELECTION_INDEX, list->data); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(radio_button), FALSE, FALSE, 0); g_free(str); if(group == NULL){ group = radio_button; } } } list = list->next; } } /** * ags_machine_selection_new: * @window: the #AgsWindow * * Create a new #AgsMachineSelection. * * Returns: a new #AgsMachineSelection * * Since: 3.0.0 */ AgsMachineSelection* ags_machine_selection_new(AgsWindow *window) { AgsMachineSelection *machine_selection; machine_selection = (AgsMachineSelection *) g_object_new(AGS_TYPE_MACHINE_SELECTION, NULL); machine_selection->window = window; return(machine_selection); } gsequencer-3.1.3/ags/X/editor/ags_envelope_info_callbacks.c0000644000175000017500000000324113605312646020702 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_envelope_info_plot_callback(GtkCellRendererToggle *cell_renderer, gchar *path_str, AgsEnvelopeInfo *envelope_info) { GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; gboolean do_plot; model = gtk_tree_view_get_model(envelope_info->tree_view); path = gtk_tree_path_new_from_string(path_str); /* get toggled iter */ gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, AGS_ENVELOPE_INFO_COLUMN_PLOT, &do_plot, -1); /* do something with the value */ do_plot ^= 1; /* set new value */ gtk_list_store_set(GTK_LIST_STORE(model), &iter, AGS_ENVELOPE_INFO_COLUMN_PLOT, do_plot, -1); /* clean up */ gtk_tree_path_free(path); /* plot */ ags_envelope_info_plot(envelope_info); } gsequencer-3.1.3/ags/X/editor/ags_envelope_dialog.c0000644000175000017500000003347313607210263017213 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_envelope_dialog_class_init(AgsEnvelopeDialogClass *envelope_dialog); void ags_envelope_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_envelope_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_envelope_dialog_init(AgsEnvelopeDialog *envelope_dialog); void ags_envelope_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_envelope_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_envelope_dialog_connect(AgsConnectable *connectable); void ags_envelope_dialog_disconnect(AgsConnectable *connectable); void ags_envelope_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_envelope_dialog_apply(AgsApplicable *applicable); void ags_envelope_dialog_reset(AgsApplicable *applicable); /** * SECTION:ags_envelope_dialog * @short_description: Edit envelope dialog * @title: AgsEnvelopeDialog * @section_id: * @include: ags/X/ags_envelope_dialog.h * * #AgsEnvelopeDialog is a composite widget to edit envelope controls * of selected AgsNote. */ enum{ PROP_0, PROP_MACHINE, }; static gpointer ags_envelope_dialog_parent_class = NULL; GType ags_envelope_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_dialog = 0; static const GTypeInfo ags_envelope_dialog_info = { sizeof (AgsEnvelopeDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_envelope_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_envelope_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_envelope_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsEnvelopeDialog", &ags_envelope_dialog_info, 0); g_type_add_interface_static(ags_type_envelope_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_envelope_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_dialog); } return g_define_type_id__volatile; } void ags_envelope_dialog_class_init(AgsEnvelopeDialogClass *envelope_dialog) { GObjectClass *gobject; GParamSpec *param_spec; ags_envelope_dialog_parent_class = g_type_class_peek_parent(envelope_dialog); /* GObjectClass */ gobject = (GObjectClass *) envelope_dialog; gobject->set_property = ags_envelope_dialog_set_property; gobject->get_property = ags_envelope_dialog_get_property; /* properties */ /** * AgsMachine:machine: * * The #AgsMachine to edit. * * Since: 3.0.0 */ param_spec = g_param_spec_object("machine", i18n_pspec("assigned machine"), i18n_pspec("The machine which this machine editor is assigned with"), AGS_TYPE_MACHINE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MACHINE, param_spec); } void ags_envelope_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_envelope_dialog_connect; connectable->disconnect = ags_envelope_dialog_disconnect; } void ags_envelope_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_envelope_dialog_set_update; applicable->apply = ags_envelope_dialog_apply; applicable->reset = ags_envelope_dialog_reset; } void ags_envelope_dialog_init(AgsEnvelopeDialog *envelope_dialog) { GtkNotebook *notebook; GtkScrolledWindow *scrolled_window; gtk_window_set_title((GtkWindow *) envelope_dialog, i18n("Envelope")); g_object_set(envelope_dialog, "default-width", 400, "default-height", 450, NULL); envelope_dialog->flags = 0; envelope_dialog->version = AGS_ENVELOPE_DIALOG_DEFAULT_VERSION; envelope_dialog->build_id = AGS_ENVELOPE_DIALOG_DEFAULT_BUILD_ID; envelope_dialog->machine = NULL; envelope_dialog->notebook = notebook = (GtkNotebook *) gtk_notebook_new(); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(envelope_dialog), (GtkWidget *) notebook, TRUE, TRUE, 0); /* envelope editor */ envelope_dialog->envelope_editor_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("editor"))); envelope_dialog->envelope_editor = ags_envelope_editor_new(); gtk_scrolled_window_add_with_viewport(envelope_dialog->envelope_editor_scrolled_window, (GtkWidget *) envelope_dialog->envelope_editor); /* envelope info */ envelope_dialog->envelope_info_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("info"))); envelope_dialog->envelope_info = ags_envelope_info_new(); gtk_scrolled_window_add_with_viewport(envelope_dialog->envelope_info_scrolled_window, (GtkWidget *) envelope_dialog->envelope_info); envelope_dialog->pattern_envelope_scrolled_window = NULL; envelope_dialog->pattern_envelope = NULL; /* GtkButton's in GtkDialog->action_area */ envelope_dialog->apply = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_APPLY); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(envelope_dialog)), (GtkWidget *) envelope_dialog->apply, FALSE, FALSE, 0); envelope_dialog->ok = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OK); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(envelope_dialog)), (GtkWidget *) envelope_dialog->ok, FALSE, FALSE, 0); envelope_dialog->cancel = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_box_pack_start((GtkBox *) gtk_dialog_get_action_area(GTK_DIALOG(envelope_dialog)), (GtkWidget *) envelope_dialog->cancel, FALSE, FALSE, 0); } void ags_envelope_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = AGS_ENVELOPE_DIALOG(gobject); switch(prop_id){ case PROP_MACHINE: { AgsMachine *machine; machine = (AgsMachine *) g_value_get_object(value); if(machine == envelope_dialog->machine){ return; } if(envelope_dialog->machine != NULL){ g_object_unref(envelope_dialog->machine); } if(machine != NULL){ g_object_ref(machine); } envelope_dialog->machine = machine; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_envelope_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = AGS_ENVELOPE_DIALOG(gobject); switch(prop_id){ case PROP_MACHINE: { g_value_set_object(value, envelope_dialog->machine); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_envelope_dialog_connect(AgsConnectable *connectable) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = AGS_ENVELOPE_DIALOG(connectable); if((AGS_ENVELOPE_DIALOG_CONNECTED & (envelope_dialog->flags)) != 0){ return; } envelope_dialog->flags |= AGS_ENVELOPE_DIALOG_CONNECTED; ags_connectable_connect(AGS_CONNECTABLE(envelope_dialog->envelope_editor)); ags_connectable_connect(AGS_CONNECTABLE(envelope_dialog->envelope_info)); if(envelope_dialog->pattern_envelope != NULL){ ags_connectable_connect(AGS_CONNECTABLE(envelope_dialog->pattern_envelope)); } /* applicable */ g_signal_connect((GObject *) envelope_dialog->apply, "clicked", G_CALLBACK(ags_envelope_dialog_apply_callback), (gpointer) envelope_dialog); g_signal_connect((GObject *) envelope_dialog->ok, "clicked", G_CALLBACK(ags_envelope_dialog_ok_callback), (gpointer) envelope_dialog); g_signal_connect((GObject *) envelope_dialog->cancel, "clicked", G_CALLBACK(ags_envelope_dialog_cancel_callback), (gpointer) envelope_dialog); g_signal_connect((GObject *) envelope_dialog, "delete-event", G_CALLBACK(ags_envelope_dialog_delete_event), (gpointer) envelope_dialog); } void ags_envelope_dialog_disconnect(AgsConnectable *connectable) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = AGS_ENVELOPE_DIALOG(connectable); if((AGS_ENVELOPE_DIALOG_CONNECTED & (envelope_dialog->flags)) == 0){ return; } envelope_dialog->flags &= (~AGS_ENVELOPE_DIALOG_CONNECTED); ags_connectable_disconnect(AGS_CONNECTABLE(envelope_dialog->envelope_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(envelope_dialog->envelope_info)); if(envelope_dialog->pattern_envelope != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(envelope_dialog->pattern_envelope)); } /* applicable */ g_object_disconnect((GObject *) envelope_dialog->apply, "any_signal::clicked", G_CALLBACK(ags_envelope_dialog_apply_callback), (gpointer) envelope_dialog, NULL); g_object_disconnect((GObject *) envelope_dialog->ok, "any_signal::clicked", G_CALLBACK(ags_envelope_dialog_ok_callback), (gpointer) envelope_dialog, NULL); g_object_disconnect((GObject *) envelope_dialog->cancel, "any_signal::clicked", G_CALLBACK(ags_envelope_dialog_cancel_callback), (gpointer) envelope_dialog, NULL); } void ags_envelope_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_envelope_dialog_apply(AgsApplicable *applicable) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = AGS_ENVELOPE_DIALOG(applicable); ags_applicable_apply(AGS_APPLICABLE(envelope_dialog->envelope_editor)); ags_applicable_apply(AGS_APPLICABLE(envelope_dialog->envelope_info)); if(envelope_dialog->pattern_envelope != NULL){ ags_applicable_apply(AGS_APPLICABLE(envelope_dialog->pattern_envelope)); } } void ags_envelope_dialog_reset(AgsApplicable *applicable) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = AGS_ENVELOPE_DIALOG(applicable); ags_applicable_reset(AGS_APPLICABLE(envelope_dialog->envelope_editor)); ags_applicable_reset(AGS_APPLICABLE(envelope_dialog->envelope_info)); if(envelope_dialog->pattern_envelope != NULL){ ags_applicable_reset(AGS_APPLICABLE(envelope_dialog->pattern_envelope)); } } /** * ags_envelope_dialog_load_preset: * @envelope_dialog: the #AgsEnvelopeDialog * * Load presets. * * Since: 3.0.0 */ void ags_envelope_dialog_load_preset(AgsEnvelopeDialog *envelope_dialog) { ags_envelope_editor_load_preset(envelope_dialog->envelope_editor); if(envelope_dialog->pattern_envelope != NULL){ ags_pattern_envelope_load_preset(envelope_dialog->pattern_envelope); } } /** * ags_envelope_dialog_add_pattern_tab: * @envelope_dialog: the #AgsEnvelopeDialog * * Add pattern tab. * * Since: 3.0.0 */ void ags_envelope_dialog_add_pattern_tab(AgsEnvelopeDialog *envelope_dialog) { GtkNotebook *notebook; GtkScrolledWindow *scrolled_window; if(!AGS_IS_ENVELOPE_DIALOG(envelope_dialog)){ return; } notebook = envelope_dialog->notebook; /* pattern envelope */ envelope_dialog->pattern_envelope_scrolled_window = scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_notebook_append_page(notebook, (GtkWidget *) scrolled_window, (GtkWidget *) gtk_label_new(i18n("pattern"))); envelope_dialog->pattern_envelope = ags_pattern_envelope_new(); gtk_scrolled_window_add_with_viewport(envelope_dialog->pattern_envelope_scrolled_window, (GtkWidget *) envelope_dialog->pattern_envelope); } /** * ags_envelope_dialog_new: * @machine: the assigned machine. * * Creates an #AgsEnvelopeDialog * * Returns: a new #AgsEnvelopeDialog * * Since: 3.0.0 */ AgsEnvelopeDialog* ags_envelope_dialog_new(AgsMachine *machine) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = (AgsEnvelopeDialog *) g_object_new(AGS_TYPE_ENVELOPE_DIALOG, "machine", machine, NULL); return(envelope_dialog); } gsequencer-3.1.3/ags/X/editor/ags_position_wave_cursor_dialog_callbacks.h0000644000175000017500000000247413607210263023662 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_POSITION_WAVE_CURSOR_DIALOG_CALLBACKS_H__ #define __AGS_POSITION_WAVE_CURSOR_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_position_wave_cursor_dialog_response_callback(GtkWidget *dialog, gint response, AgsPositionWaveCursorDialog *position_wave_cursor_dialog); G_END_DECLS #endif /*__AGS_POSITION_WAVE_CURSOR_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_edit.c0000644000175000017500000020320013616617253017241 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include static GType ags_accessible_automation_edit_get_type(void); void ags_automation_edit_class_init(AgsAutomationEditClass *automation_edit); void ags_accessible_automation_edit_class_init(AtkObject *object); void ags_accessible_automation_edit_action_interface_init(AtkActionIface *action); void ags_automation_edit_connectable_interface_init(AgsConnectableInterface *connectable); void ags_automation_edit_init(AgsAutomationEdit *automation_edit); void ags_automation_edit_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_automation_edit_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_automation_edit_finalize(GObject *gobject); void ags_automation_edit_connect(AgsConnectable *connectable); void ags_automation_edit_disconnect(AgsConnectable *connectable); AtkObject* ags_automation_edit_get_accessible(GtkWidget *widget); gboolean ags_accessible_automation_edit_do_action(AtkAction *action, gint i); gint ags_accessible_automation_edit_get_n_actions(AtkAction *action); const gchar* ags_accessible_automation_edit_get_description(AtkAction *action, gint i); const gchar* ags_accessible_automation_edit_get_name(AtkAction *action, gint i); const gchar* ags_accessible_automation_edit_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_automation_edit_set_description(AtkAction *action, gint i); gchar* ags_accessible_automation_edit_get_localized_name(AtkAction *action, gint i); void ags_automation_edit_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_automation_edit_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_automation_edit_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_automation_edit_show(GtkWidget *widget); void ags_automation_edit_show_all(GtkWidget *widget); gboolean ags_automation_edit_auto_scroll_timeout(GtkWidget *widget); /** * SECTION:ags_automation_edit * @short_description: edit automations * @title: AgsAutomationEdit * @section_id: * @include: ags/X/editor/ags_automation_edit.h * * The #AgsAutomationEdit lets you edit automations. */ enum{ PROP_0, PROP_CHANNEL_TYPE, PROP_FILENAME, PROP_EFFECT, PROP_CONTROL_SPECIFIER, PROP_CONTROL_NAME, PROP_LOWER, PROP_UPPER, PROP_DEFAULT_VALUE, }; static gpointer ags_automation_edit_parent_class = NULL; static GQuark quark_accessible_object = 0; GHashTable *ags_automation_edit_auto_scroll = NULL; GType ags_automation_edit_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation_edit = 0; static const GTypeInfo ags_automation_edit_info = { sizeof (AgsAutomationEditClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_automation_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAutomationEdit), 0, /* n_preallocs */ (GInstanceInitFunc) ags_automation_edit_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_automation_edit_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_automation_edit = g_type_register_static(GTK_TYPE_TABLE, "AgsAutomationEdit", &ags_automation_edit_info, 0); g_type_add_interface_static(ags_type_automation_edit, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation_edit); } return g_define_type_id__volatile; } static GType ags_accessible_automation_edit_get_type(void) { static GType ags_type_accessible_automation_edit = 0; if(!ags_type_accessible_automation_edit){ const GTypeInfo ags_accesssible_automation_edit_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_automation_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_automation_edit_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_automation_edit = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleAutomationEdit", &ags_accesssible_automation_edit_info, 0); g_type_add_interface_static(ags_type_accessible_automation_edit, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_automation_edit); } void ags_automation_edit_class_init(AgsAutomationEditClass *automation_edit) { GtkWidgetClass *widget; GObjectClass *gobject; GParamSpec *param_spec; ags_automation_edit_parent_class = g_type_class_peek_parent(automation_edit); /* GObjectClass */ gobject = G_OBJECT_CLASS(automation_edit); gobject->set_property = ags_automation_edit_set_property; gobject->get_property = ags_automation_edit_get_property; gobject->finalize = ags_automation_edit_finalize; /* properties */ /** * AgsAutomationArea:channel-type: * * The target channel. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("channel-type", i18n_pspec("assigned channel type"), i18n_pspec("The channel type it is assigned with"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL_TYPE, param_spec); /** * AgsChannel:filename: * * The assigned #AgsFilename representing this channel. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename assigned with"), i18n_pspec("The filename it is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsChannel:effect: * * The assigned #AgsEffect representing this channel. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("effect assigned with"), i18n_pspec("The effect name it is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsChannel:control-specifier: * * The assigned #AgsControl-Specifier representing this channel. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-specifier", i18n_pspec("assigned control specifier"), i18n_pspec("The control specifier it is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_SPECIFIER, param_spec); /** * AgsChannel:control-name: * * The assigned #AgsControl-Name representing this channel. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-name", i18n_pspec("displayed control name"), i18n_pspec("The control name to display"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_NAME, param_spec); /** * AgsAutomationEdit:lower: * * The automation edit's lower range. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lower", "lower", "The lower of automation edit", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_AUTOMATION_EDIT_DEFAULT_LOWER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER, param_spec); /** * AgsAutomationEdit:upper: * * The automation edit's upper range. * * Since: 3.0.0 */ param_spec = g_param_spec_double("upper", "upper", "The upper of automation edit", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_AUTOMATION_EDIT_DEFAULT_UPPER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER, param_spec); /** * AgsAutomationEdit:default-value: * * The automation edit's default value. * * Since: 3.0.0 */ param_spec = g_param_spec_double("default-value", "default value", "The default value of automation edit", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_AUTOMATION_EDIT_DEFAULT_VALUE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_VALUE, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) automation_edit; // widget->get_preferred_width = ags_automation_edit_get_preferred_width; widget->get_preferred_height = ags_automation_edit_get_preferred_height; // widget->size_allocate = ags_automation_edit_size_allocate; // widget->draw = ags_automation_edit_draw; widget->show = ags_automation_edit_show; widget->show_all = ags_automation_edit_show_all; } void ags_accessible_automation_edit_class_init(AtkObject *object) { quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); } void ags_accessible_automation_edit_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_automation_edit_do_action; action->get_n_actions = ags_accessible_automation_edit_get_n_actions; action->get_description = ags_accessible_automation_edit_get_description; action->get_name = ags_accessible_automation_edit_get_name; action->get_keybinding = ags_accessible_automation_edit_get_keybinding; action->set_description = ags_accessible_automation_edit_set_description; action->get_localized_name = ags_accessible_automation_edit_get_localized_name; } void ags_automation_edit_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_automation_edit_connect; connectable->disconnect = ags_automation_edit_disconnect; } void ags_automation_edit_init(AgsAutomationEdit *automation_edit) { GtkAdjustment *adjustment; AgsApplicationContext *application_context; gdouble gui_scale_factor; application_context = ags_application_context_get_instance(); g_object_set(automation_edit, "can-focus", FALSE, "n-columns", 3, "n-rows", 4, "homogeneous", FALSE, NULL); automation_edit->flags = 0; automation_edit->mode = AGS_AUTOMATION_EDIT_NO_EDIT_MODE; automation_edit->button_mask = 0; automation_edit->key_mask = 0; /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); automation_edit->note_offset = 0; automation_edit->note_offset_absolute = 0; automation_edit->point_radius = (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_POINT_RADIUS); automation_edit->scan_width = (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_SCAN_WIDTH); automation_edit->scan_height = (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_SCAN_HEIGHT); automation_edit->control_width = (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH); automation_edit->control_height = (guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_HEIGHT); automation_edit->step_count = (guint) (AGS_AUTOMATION_EDIT_DEFAULT_STEP_COUNT); automation_edit->cursor_position_x = AGS_AUTOMATION_EDIT_DEFAULT_CURSOR_POSITION_X; automation_edit->cursor_position_y = AGS_AUTOMATION_EDIT_DEFAULT_CURSOR_POSITION_Y; automation_edit->selected_acceleration_border = AGS_AUTOMATION_EDIT_DEFAULT_SELECTED_ACCELERATION_BORDER; automation_edit->selection_x0 = 0; automation_edit->selection_x1 = 0; automation_edit->selection_y0 = 0; automation_edit->selection_y1 = 0; automation_edit->current_acceleration = NULL; automation_edit->ruler = ags_ruler_new(); g_object_set(automation_edit->ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), "no-show-all", TRUE, NULL); gtk_table_attach(GTK_TABLE(automation_edit), (GtkWidget *) automation_edit->ruler, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); automation_edit->channel_type = G_TYPE_NONE; automation_edit->filename = NULL; automation_edit->effect = NULL; automation_edit->control_specifier = NULL; automation_edit->control_name = NULL; automation_edit->lower = AGS_AUTOMATION_EDIT_DEFAULT_LOWER; automation_edit->upper = AGS_AUTOMATION_EDIT_DEFAULT_UPPER; automation_edit->default_value = AGS_AUTOMATION_EDIT_DEFAULT_VALUE; automation_edit->drawing_area = (GtkDrawingArea *) gtk_drawing_area_new(); gtk_widget_set_has_window(automation_edit->drawing_area, TRUE); gtk_widget_set_events(GTK_WIDGET (automation_edit->drawing_area), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_set_can_focus((GtkWidget *) automation_edit->drawing_area, TRUE); gtk_table_attach(GTK_TABLE(automation_edit), (GtkWidget *) automation_edit->drawing_area, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); /* vscrollbar */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, automation_edit->control_height, 1.0); automation_edit->vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); g_object_set(automation_edit->vscrollbar, "no-show-all", TRUE, NULL); gtk_widget_set_size_request((GtkWidget *) automation_edit->vscrollbar, -1, (guint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT)); gtk_table_attach(GTK_TABLE(automation_edit), (GtkWidget *) automation_edit->vscrollbar, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* hscrollbar */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (gdouble) automation_edit->control_width, 1.0); automation_edit->hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); g_object_set(automation_edit->hscrollbar, "no-show-all", TRUE, NULL); gtk_widget_set_size_request((GtkWidget *) automation_edit->hscrollbar, -1, -1); gtk_table_attach(GTK_TABLE(automation_edit), (GtkWidget *) automation_edit->hscrollbar, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* auto-scroll */ if(ags_automation_edit_auto_scroll == NULL){ ags_automation_edit_auto_scroll = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_automation_edit_auto_scroll, automation_edit, ags_automation_edit_auto_scroll_timeout); g_timeout_add(1000 / 30, (GSourceFunc) ags_automation_edit_auto_scroll_timeout, (gpointer) automation_edit); } void ags_automation_edit_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: { automation_edit->channel_type = g_value_get_gtype(value); } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(automation_edit->filename == filename){ return; } automation_edit->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(automation_edit->effect == effect){ return; } automation_edit->effect = g_strdup(effect); } break; case PROP_CONTROL_SPECIFIER: { gchar *control_specifier; control_specifier = g_value_get_string(value); if(automation_edit->control_specifier == control_specifier){ return; } automation_edit->control_specifier = g_strdup(control_specifier); } break; case PROP_CONTROL_NAME: { gchar *control_name; control_name = g_value_get_string(value); if(automation_edit->control_name == control_name){ return; } automation_edit->control_name = g_strdup(control_name); } break; case PROP_LOWER: { automation_edit->lower = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) automation_edit); } break; case PROP_UPPER: { automation_edit->upper = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) automation_edit); } break; case PROP_DEFAULT_VALUE: { automation_edit->default_value = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) automation_edit); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_edit_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(gobject); switch(prop_id){ case PROP_CHANNEL_TYPE: { g_value_set_gtype(value, automation_edit->channel_type); } break; case PROP_FILENAME: { g_value_set_string(value, automation_edit->filename); } break; case PROP_EFFECT: { g_value_set_string(value, automation_edit->effect); } break; case PROP_CONTROL_SPECIFIER: { g_value_set_string(value, automation_edit->control_specifier); } break; case PROP_CONTROL_NAME: { g_value_set_string(value, automation_edit->control_name); } break; case PROP_LOWER: { g_value_set_double(value, automation_edit->lower); } break; case PROP_UPPER: { g_value_set_double(value, automation_edit->upper); } break; case PROP_DEFAULT_VALUE: { g_value_set_double(value, automation_edit->default_value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_edit_finalize(GObject *gobject) { AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(gobject); /* remove auto scroll */ g_hash_table_remove(ags_automation_edit_auto_scroll, automation_edit); /* call parent */ G_OBJECT_CLASS(ags_automation_edit_parent_class)->finalize(gobject); } void ags_automation_edit_connect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(connectable); if((AGS_AUTOMATION_EDIT_CONNECTED & (automation_edit->flags)) != 0){ return; } automation_edit->flags |= AGS_AUTOMATION_EDIT_CONNECTED; /* drawing area */ g_signal_connect(G_OBJECT(automation_edit->drawing_area), "draw", G_CALLBACK(ags_automation_edit_draw_callback), (gpointer) automation_edit); g_signal_connect_after((GObject *) automation_edit->drawing_area, "configure_event", G_CALLBACK(ags_automation_edit_drawing_area_configure_event), (gpointer) automation_edit); g_signal_connect((GObject *) automation_edit->drawing_area, "button_press_event", G_CALLBACK(ags_automation_edit_drawing_area_button_press_event), (gpointer) automation_edit); g_signal_connect((GObject *) automation_edit->drawing_area, "button_release_event", G_CALLBACK(ags_automation_edit_drawing_area_button_release_event), (gpointer) automation_edit); g_signal_connect((GObject *) automation_edit->drawing_area, "motion_notify_event", G_CALLBACK(ags_automation_edit_drawing_area_motion_notify_event), (gpointer) automation_edit); g_signal_connect((GObject *) automation_edit->drawing_area, "key_press_event", G_CALLBACK(ags_automation_edit_drawing_area_key_press_event), (gpointer) automation_edit); g_signal_connect((GObject *) automation_edit->drawing_area, "key_release_event", G_CALLBACK(ags_automation_edit_drawing_area_key_release_event), (gpointer) automation_edit); /* scrollbars */ g_signal_connect_after((GObject *) automation_edit->vscrollbar, "value-changed", G_CALLBACK(ags_automation_edit_vscrollbar_value_changed), (gpointer) automation_edit); g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_edit_hscrollbar_value_changed), (gpointer) automation_edit); } void ags_automation_edit_disconnect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(connectable); if((AGS_AUTOMATION_EDIT_CONNECTED & (automation_edit->flags)) == 0){ return; } automation_edit->flags &= (~AGS_AUTOMATION_EDIT_CONNECTED); /* drawing area */ g_object_disconnect((GObject *) automation_edit->drawing_area, "any_signal::draw", G_CALLBACK(ags_automation_edit_draw_callback), (gpointer) automation_edit, "any_signal::configure_event", G_CALLBACK(ags_automation_edit_drawing_area_configure_event), automation_edit, "any_signal::button_press_event", G_CALLBACK(ags_automation_edit_drawing_area_button_press_event), automation_edit, "any_signal::button_release_event", G_CALLBACK(ags_automation_edit_drawing_area_button_release_event), automation_edit, "any_signal::motion_notify_event", G_CALLBACK(ags_automation_edit_drawing_area_motion_notify_event), automation_edit, "any_signal::key_press_event", G_CALLBACK(ags_automation_edit_drawing_area_key_press_event), automation_edit, "any_signal::key_release_event", G_CALLBACK(ags_automation_edit_drawing_area_key_release_event), automation_edit, NULL); /* scrollbars */ g_object_disconnect((GObject *) automation_edit->vscrollbar, "any_signal::value-changed", G_CALLBACK(ags_automation_edit_vscrollbar_value_changed), (gpointer) automation_edit, NULL); g_object_disconnect((GObject *) automation_edit->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_automation_edit_hscrollbar_value_changed), (gpointer) automation_edit, NULL); } AtkObject* ags_automation_edit_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_automation_edit_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } gboolean ags_accessible_automation_edit_do_action(AtkAction *action, gint i) { AgsAutomationEdit *automation_edit; GdkEventKey *key_press, *key_release; GdkEventKey *modifier_press, *modifier_release; GdkEventKey *second_level_press, *second_level_release; if(!(i >= 0 && i < 13)){ return(FALSE); } automation_edit = (AgsAutomationEdit *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); key_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); /* create modifier */ modifier_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); modifier_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); modifier_press->keyval = modifier_release->keyval = GDK_KEY_Control_R; /* create second level */ second_level_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); second_level_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); second_level_press->keyval = second_level_release->keyval = GDK_KEY_Shift_R; switch(i){ case 0: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); } break; case 1: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); } break; case 2: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); } break; case 3: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); } break; case 4: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 5: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 6: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 7: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 8: { key_press->keyval = key_release->keyval = GDK_KEY_space; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); } break; case 9: { key_press->keyval = key_release->keyval = GDK_KEY_Delete; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); } break; case 10: { key_press->keyval = key_release->keyval = GDK_KEY_c; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 11: { key_press->keyval = key_release->keyval = GDK_KEY_x; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 12: { key_press->keyval = key_release->keyval = GDK_KEY_v; /* send event */ gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) automation_edit->drawing_area, (GdkEvent *) modifier_release); } break; } return(TRUE); } gint ags_accessible_automation_edit_get_n_actions(AtkAction *action) { return(13); } const gchar* ags_accessible_automation_edit_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move cursor left", "move cursor right", "move cursor up", "move cursor down", "move cursor relative up", "move cursor relative down", "move cursor small left", "move cursor small right", "add acceleration", "remove acceleration", "copy automation to clipboard", "cut automation to clipbaord", "paste automation from clipboard", }; if(i >= 0 && i < 13){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_automation_edit_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "small-left", "small-right", "relative-up", "relative-down", "add", "remove", "copy", "cut", "paste", }; if(i >= 0 && i < 13){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_automation_edit_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "Shft+Left", "Shft+Right", "Shft+up", "Schft+down", "space", "Del" "Ctrl+c" "Ctrl+x", "Ctrl+v", }; if(i >= 0 && i < 13){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_automation_edit_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_automation_edit_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_automation_edit_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width = natural_width = NULL; } void ags_automation_edit_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsApplicationContext *application_context; gdouble gui_scale_factor; application_context = ags_application_context_get_instance(); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); minimal_height[0] = natural_height[0] = (gint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT); } void ags_automation_edit_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsAutomationEdit *automation_edit; GtkAllocation child_allocation; GdkWindow *window; AgsApplicationContext *application_context; gdouble gui_scale_factor; automation_edit = AGS_AUTOMATION_EDIT(widget); application_context = ags_application_context_get_instance(); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); // widget->allocation = *allocation; // widget->allocation.height = (gint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT); allocation->height = (gint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = allocation->width; child_allocation.height = (gint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT); gtk_widget_size_allocate((GtkWidget *) automation_edit->drawing_area, &child_allocation); window = gtk_widget_get_window((GtkWidget *) automation_edit->drawing_area); gdk_window_move(window, allocation->x, allocation->y); } void ags_automation_edit_show(GtkWidget *widget) { AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_automation_edit_parent_class)->show(widget); gtk_widget_show((GtkWidget *) automation_edit->drawing_area); if((AGS_AUTOMATION_EDIT_SHOW_RULER & (automation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) automation_edit->ruler); } if((AGS_AUTOMATION_EDIT_SHOW_VSCROLLBAR & (automation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) automation_edit->vscrollbar); } if((AGS_AUTOMATION_EDIT_SHOW_HSCROLLBAR & (automation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) automation_edit->hscrollbar); } } void ags_automation_edit_show_all(GtkWidget *widget) { AgsAutomationEdit *automation_edit; automation_edit = AGS_AUTOMATION_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_automation_edit_parent_class)->show_all(widget); gtk_widget_show_all((GtkWidget *) automation_edit->drawing_area); if((AGS_AUTOMATION_EDIT_SHOW_RULER & (automation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) automation_edit->ruler); } if((AGS_AUTOMATION_EDIT_SHOW_VSCROLLBAR & (automation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) automation_edit->vscrollbar); } if((AGS_AUTOMATION_EDIT_SHOW_HSCROLLBAR & (automation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) automation_edit->hscrollbar); } } gboolean ags_automation_edit_auto_scroll_timeout(GtkWidget *widget) { if(g_hash_table_lookup(ags_automation_edit_auto_scroll, widget) != NULL){ AgsAutomationEditor *automation_editor; AgsAutomationEdit *automation_edit; GtkAdjustment *hscrollbar_adjustment; GObject *output_soundcard; double x; automation_edit = AGS_AUTOMATION_EDIT(widget); if((AGS_AUTOMATION_EDIT_AUTO_SCROLL & (automation_edit->flags)) == 0){ return(TRUE); } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return(TRUE); } /* reset offset */ g_object_get(automation_editor->selected_machine->audio, "output-soundcard", &output_soundcard, NULL); automation_edit->note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); automation_edit->note_offset_absolute = ags_soundcard_get_note_offset_absolute(AGS_SOUNDCARD(output_soundcard)); /* reset scrollbar */ hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); x = ((automation_edit->note_offset * automation_edit->control_width) / (AGS_AUTOMATION_EDITOR_MAX_CONTROLS * automation_edit->control_width)) * gtk_adjustment_get_upper(hscrollbar_adjustment); gtk_range_set_value(GTK_RANGE(automation_edit->hscrollbar), x); g_object_unref(output_soundcard); return(TRUE); }else{ return(FALSE); } } void ags_automation_edit_reset_vscrollbar(AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; GtkAdjustment *adjustment; GtkAllocation allocation; double varea_height; gdouble upper, old_upper; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } /* adjustment and allocation */ adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); /* upper */ old_upper = gtk_adjustment_get_upper(adjustment); varea_height = automation_edit->step_count * automation_edit->control_height; upper = varea_height - allocation.height; if(upper < 0.0){ upper = 0.0; } gtk_adjustment_set_upper(adjustment, upper); /* reset value */ if(old_upper != 0.0){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) / old_upper * upper); } } void ags_automation_edit_reset_hscrollbar(AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; GtkAdjustment *adjustment; GtkAllocation allocation; double zoom_factor, zoom; double zoom_correction; guint map_width; gdouble upper, old_upper; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } automation_toolbar = automation_editor->automation_toolbar; /* adjustment and allocation */ adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom) - 2.0); /* upper */ old_upper = gtk_adjustment_get_upper(adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_AUTOMATION_EDITOR_MAX_CONTROLS * zoom * zoom_correction); upper = map_width - allocation.width; if(upper < 0.0){ upper = 0.0; } gtk_adjustment_set_upper(adjustment, upper); /* ruler */ automation_edit->ruler->factor = zoom_factor; automation_edit->ruler->precision = zoom; automation_edit->ruler->scale_precision = 1.0 / zoom; gtk_adjustment_set_upper(automation_edit->ruler->adjustment, upper / automation_edit->control_width); /* reset value */ if(old_upper != 0.0){ #if 0 gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) / old_upper * upper); #endif } } void ags_automation_edit_draw_segment(AgsAutomationEdit *automation_edit, cairo_t *cr) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; GtkStyleContext *automation_edit_style_context; GtkAdjustment *hscrollbar_adjustment; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; gdouble gui_scale_factor; gdouble x_offset; gdouble translated_ground; double tact; gdouble y; gdouble map_height; gdouble width, height; guint control_width; guint i, j; guint j_set; GValue value = {0,}; const static double quarter_dashes = { 0.25, }; const static double segment_dashes = { 0.5, }; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } application_context = ags_application_context_get_instance(); automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } automation_toolbar = automation_editor->automation_toolbar; gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* dimension and offset */ width = (gdouble) allocation.width; height = (gdouble) allocation.height; hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); x_offset = gtk_adjustment_get_value(hscrollbar_adjustment); y = 0.0; /* style context */ automation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(automation_edit->drawing_area)); gtk_style_context_get_property(automation_edit_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(automation_edit_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(automation_edit_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); /* push group */ cairo_push_group(cr); /* background */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, y, width, height); cairo_fill(cr); /* border */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_set_line_width(cr, 1.0); cairo_rectangle(cr, 0.0, y, width, height); cairo_stroke(cr); cairo_set_line_width(cr, 1.0); tact = exp2((double) gtk_combo_box_get_active(automation_toolbar->zoom) - 2.0); y = (gdouble) 0.0; map_height = (gdouble) height; control_width = (gint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH); i = control_width - (guint) x_offset % control_width; cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); if(i < width && tact > 1.0 ){ j_set = ((guint) x_offset / control_width + 1) % ((guint) tact); cairo_set_dash(cr, &segment_dashes, 1, 0.0); if(j_set != 0){ j = j_set; goto ags_automation_edit_draw_segment0; } } for(; i < width; ){ cairo_set_dash(cr, NULL, 0, 0.0); cairo_move_to(cr, (double) i, y); cairo_line_to(cr, (double) i, y + height); cairo_stroke(cr); i += control_width; cairo_set_dash(cr, &segment_dashes, 1, 0.0); for(j = 1; i < width && j < tact; j++){ ags_automation_edit_draw_segment0: cairo_move_to(cr, (double) i, y); cairo_line_to(cr, (double) i, y + height); cairo_stroke(cr); i += control_width; } } cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); /* middle */ if(map_height * 0.5 < height){ cairo_move_to(cr, 0.0, y + map_height * 0.5); cairo_line_to(cr, width, y + map_height * 0.5); cairo_stroke(cr); } /* set dash */ cairo_set_dash(cr, &quarter_dashes, 1, 0.0); /* lower quarter */ if(map_height * 0.25 < height){ cairo_move_to(cr, 0.0, y + map_height * 0.25); cairo_line_to(cr, width, y + map_height * 0.25); cairo_stroke(cr); } /* upper quarter */ if(map_height * 0.75 < height){ cairo_move_to(cr, 0.0, y + map_height * 0.75); cairo_line_to(cr, width, y + map_height * 0.75); cairo_stroke(cr); } /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); } void ags_automation_edit_draw_position(AgsAutomationEdit *automation_edit, cairo_t *cr) { AgsAutomationEditor *automation_editor; GtkStyleContext *automation_edit_style_context; AgsApplicationContext *application_context; GdkRGBA *fg_color_active; gdouble gui_scale_factor; double position; double x, y; double width, height; gboolean height_fits; GValue value = {0,}; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } application_context = ags_application_context_get_instance(); automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* style context */ automation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(automation_edit->drawing_area)); gtk_style_context_get_property(automation_edit_style_context, "color", GTK_STATE_FLAG_ACTIVE, &value); fg_color_active = g_value_dup_boxed(&value); g_value_unset(&value); /* get offset and dimensions */ position = ((double) automation_edit->note_offset) * ((double) automation_edit->control_width); y = 0.0; x = (position) - (gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar))); width = (double) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_FADER_WIDTH)); height = automation_edit->step_count * automation_edit->control_height; /* push group */ cairo_push_group(cr); /* draw fader */ cairo_set_source_rgba(cr, fg_color_active->red, fg_color_active->blue, fg_color_active->green, fg_color_active->alpha); cairo_rectangle(cr, (double) x, (double) y, (double) width, (double) height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); //cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_active); } void ags_automation_edit_draw_cursor(AgsAutomationEdit *automation_edit, cairo_t *cr) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; GtkStyleContext *automation_edit_style_context; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color_focused; gdouble gui_scale_factor; double zoom_factor; gdouble val, step; gdouble upper, lower, step_count; gdouble c_range; double x, y; double width, height; GValue value = {0,}; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } application_context = ags_application_context_get_instance(); automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } automation_toolbar = automation_editor->automation_toolbar; /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* style context */ automation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(automation_edit->drawing_area)); gtk_style_context_get_property(automation_edit_style_context, "color", GTK_STATE_FLAG_FOCUSED, &value); fg_color_focused = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* get offset */ x = ((double) automation_edit->cursor_position_x) - (gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)) * zoom_factor); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; val = automation_edit->cursor_position_y; y = (step_count - 1) * log(val / lower) / log(upper / lower); }else{ y = allocation.height - ((((double) automation_edit->cursor_position_y / c_range) * allocation.height) - gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar))); } width = (double) AGS_AUTOMATION_EDIT_CURSOR_WIDTH; height = (double) AGS_AUTOMATION_EDIT_CURSOR_HEIGHT; /* apply zoom */ x /= zoom_factor; /* clip */ if(x < 0.0){ width += x; x = 0.0; }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(y < 0.0){ height += y; y = 0.0; }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* push group */ cairo_push_group(cr); /* draw cursor */ cairo_set_source_rgba(cr, fg_color_focused->red, fg_color_focused->blue, fg_color_focused->green, fg_color_focused->alpha); cairo_move_to(cr, x, y); cairo_line_to(cr, x + width, y); cairo_stroke(cr); cairo_move_to(cr, x, y); cairo_line_to(cr, x, y + height); cairo_stroke(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); //cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); } void ags_automation_edit_draw_selection(AgsAutomationEdit *automation_edit, cairo_t *cr) { GtkStyleContext *automation_edit_style_context; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color_prelight; double x, y; double width, height; GValue value = {0,}; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } application_context = ags_application_context_get_instance(); /* style context */ automation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(automation_edit->drawing_area)); gtk_style_context_get_property(automation_edit_style_context, "color", GTK_STATE_FLAG_PRELIGHT, &value); fg_color_prelight = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); /* get offset and dimensions */ if(automation_edit->selection_x0 < automation_edit->selection_x1){ x = ((double) automation_edit->selection_x0) - gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)); width = ((double) automation_edit->selection_x1 - (double) automation_edit->selection_x0); }else{ x = ((double) automation_edit->selection_x1) - gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)); width = ((double) automation_edit->selection_x0 - (double) automation_edit->selection_x1); } if(automation_edit->selection_y0 < automation_edit->selection_y1){ y = ((double) automation_edit->selection_y0) - gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)); height = ((double) automation_edit->selection_y1 - (double) automation_edit->selection_y0); }else{ y = ((double) automation_edit->selection_y1) - gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)); height = ((double) automation_edit->selection_y0 - (double) automation_edit->selection_y1); } /* clip */ if(x < 0.0){ width += x; x = 0.0; }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(y < 0.0){ height += y; y = 0.0; }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* push group */ cairo_push_group(cr); /* draw selection */ cairo_set_source_rgba(cr, fg_color_prelight->red, fg_color_prelight->blue, fg_color_prelight->green, 1.0 / 3.0); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); //cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); } void ags_automation_edit_draw_acceleration(AgsAutomationEdit *automation_edit, AgsAcceleration *acceleration_a, AgsAcceleration *acceleration_b, cairo_t *cr, gdouble opacity) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; GtkStyleContext *automation_edit_style_context; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *fg_color_selected; gdouble gui_scale_factor; double zoom_factor; double viewport_x, viewport_y; gdouble val, step; gdouble upper, lower, step_count; gdouble c_range; guint x, y; guint a_x, b_x; gdouble a_y, b_y; double width, height; GValue value = {0}; if(!AGS_IS_AUTOMATION_EDIT(automation_edit) || !AGS_IS_ACCELERATION(acceleration_a) || cr == NULL){ return; } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } application_context = ags_application_context_get_instance(); automation_toolbar = automation_editor->automation_toolbar; /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* style context */ automation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(automation_edit->drawing_area)); gtk_style_context_get_property(automation_edit_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(automation_edit_style_context, "color", GTK_STATE_FLAG_SELECTED, &value); fg_color_selected = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* get offset and dimensions */ if(AGS_AUTOMATION_EDITOR_MAX_CONTROLS > allocation.width){ viewport_x = zoom_factor * gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)); }else{ viewport_x = 0.0; } viewport_y = gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)); g_object_get(acceleration_a, "x", &a_x, "y", &a_y, NULL); x = ((double) a_x) - viewport_x; if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; val = a_y; y = (step_count - 1.0) * log(val / lower) / log(upper / lower); }else{ y = allocation.height - ((double) a_y / c_range) * allocation.height - viewport_y; } if(acceleration_b != NULL){ g_object_get(acceleration_b, "x", &b_x, NULL); width = ((double) b_x - a_x); }else{ width = 1.0; } height = allocation.height - y; if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ gdouble tmp; tmp = height; height = y; y = tmp; } /* apply zoom */ x /= zoom_factor; width /= zoom_factor; /* clip */ if(x < 0.0){ if(x + width < 0.0){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; }else{ width += x; x = 0.0; } }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(acceleration_b == NULL){ width = ((double) allocation.width - x); } if(y < 0.0){ if(y + height < 0.0){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; }else{ height += y; y = 0.0; } }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* draw acceleration - dot */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, opacity * fg_color->alpha); cairo_arc(cr, x, y, automation_edit->point_radius, 0.0, 2.0 * M_PI); cairo_stroke(cr); /* draw acceleration - area */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, opacity * fg_color->alpha); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); /* check acceleration selected */ if(ags_acceleration_test_flags(acceleration_a, AGS_ACCELERATION_IS_SELECTED)){ double selected_x, selected_y; double selected_width, selected_height; selected_x = x - automation_edit->selected_acceleration_border; selected_y = y - automation_edit->selected_acceleration_border; selected_width = width + (2.0 * (double) automation_edit->selected_acceleration_border); selected_height = height + (2.0 * (double) automation_edit->selected_acceleration_border); /* clip */ if(selected_x < 0.0){ selected_x = 0.0; } if(selected_x + selected_width > allocation.width){ selected_width = ((double) allocation.width) - selected_x; } if(selected_y < 0.0){ selected_y = 0.0; } if(selected_y + selected_height > allocation.height){ selected_height = ((double) allocation.height) - selected_y; } /* draw selected acceleration - dot */ cairo_set_source_rgba(cr, fg_color_selected->red, fg_color_selected->blue, fg_color_selected->green, opacity / 3.0); cairo_arc(cr, selected_x, selected_y, automation_edit->point_radius + (2.0 * (double) automation_edit->selected_acceleration_border), 0.0, 2.0 * M_PI); cairo_stroke(cr); /* draw selected acceleration - area */ cairo_rectangle(cr, selected_x, selected_y, selected_width, selected_height); cairo_fill(cr); } g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); } void ags_automation_edit_draw_automation(AgsAutomationEdit *automation_edit, cairo_t *cr) { AgsAutomationEditor *automation_editor; AgsNotebook *notebook; AgsTimestamp *timestamp; AgsTimestamp *current_timestamp; GtkAllocation allocation; GType channel_type; GList *start_list_automation, *list_automation; GList *start_list_acceleration, *list_acceleration; gchar *control_name; gdouble opacity; guint x0, x1; guint offset; guint line; gint i; if(!AGS_IS_AUTOMATION_EDIT(automation_edit)){ return; } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); if(automation_editor->selected_machine == NULL){ return; } notebook = NULL; if(automation_edit->channel_type == G_TYPE_NONE){ notebook = NULL; }else if(automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); opacity = gtk_spin_button_get_value(automation_editor->automation_toolbar->opacity); /* get visisble region */ x0 = gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)); x1 = (gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)) + allocation.width); /* draw automation */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; g_object_get(automation_editor->selected_machine->audio, "automation", &start_list_automation, NULL); timestamp->timer.ags_offset.offset = (guint64) AGS_NOTATION_DEFAULT_OFFSET * floor((double) x0 / (double) AGS_NOTATION_DEFAULT_OFFSET); i = 0; while(notebook == NULL || (i = ags_notebook_next_active_tab(notebook, i)) != -1){ list_automation = ags_automation_find_near_timestamp_extended(start_list_automation, i, automation_edit->channel_type, automation_edit->control_name, timestamp); while(list_automation != NULL){ AgsAutomation *automation; GList *start_list_acceleration, *list_acceleration; automation = AGS_AUTOMATION(list_automation->data); g_object_get(automation, "timestamp", ¤t_timestamp, "line", &line, "channel-type", &channel_type, "control-name", &control_name, NULL); g_object_unref(current_timestamp); if(i != line || channel_type != automation_editor->focused_automation_edit->channel_type || !g_strcmp0(control_name, automation_editor->focused_automation_edit->control_name) != TRUE || current_timestamp == NULL){ list_automation = list_automation->next; continue; } if(ags_timestamp_get_ags_offset(current_timestamp) > x1){ break; } if(ags_timestamp_get_ags_offset(current_timestamp) + AGS_AUTOMATION_DEFAULT_OFFSET < x0){ list_automation = list_automation->next; continue; } g_object_get(automation, "acceleration", &start_list_acceleration, NULL); list_acceleration = start_list_acceleration; while(list_acceleration != NULL){ ags_automation_edit_draw_acceleration(automation_edit, list_acceleration->data, ((list_acceleration->next != NULL) ? list_acceleration->next->data: NULL), cr, opacity); /* iterate */ list_acceleration = list_acceleration->next; } g_list_free_full(start_list_acceleration, g_object_unref); /* iterate */ list_automation = list_automation->next; } if(notebook == NULL){ break; } i++; } g_list_free_full(start_list_automation, g_object_unref); } void ags_automation_edit_draw(AgsAutomationEdit *automation_edit, cairo_t *cr) { AgsAutomationEditor *automation_editor; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_edit, AGS_TYPE_AUTOMATION_EDITOR); ags_automation_editor_reset_audio_scrollbar(automation_editor); ags_automation_editor_reset_output_scrollbar(automation_editor); ags_automation_editor_reset_input_scrollbar(automation_editor); ags_automation_edit_reset_vscrollbar(automation_edit); ags_automation_edit_reset_hscrollbar(automation_edit); /* segment */ ags_automation_edit_draw_segment(automation_edit, cr); /* automation */ ags_automation_edit_draw_automation(automation_edit, cr); /* edit mode */ switch(automation_edit->mode){ case AGS_AUTOMATION_EDIT_POSITION_CURSOR: { ags_automation_edit_draw_cursor(automation_edit, cr); } break; case AGS_AUTOMATION_EDIT_ADD_ACCELERATION: { if(automation_edit->current_acceleration != NULL){ ags_automation_edit_draw_acceleration(automation_edit, automation_edit->current_acceleration, NULL, cr, 1.0); cairo_surface_mark_dirty(cairo_get_target(cr)); } } break; case AGS_AUTOMATION_EDIT_SELECT_ACCELERATION: { ags_automation_edit_draw_selection(automation_edit, cr); } break; } /* fader */ if((AGS_AUTOMATION_EDIT_AUTO_SCROLL & (automation_edit->flags)) != 0){ ags_automation_edit_draw_position(automation_edit, cr); } } /** * ags_automation_edit_new: * * Create a new #AgsAutomationEdit. * * Returns: a new #AgsAutomationEdit * * Since: 3.0.0 */ AgsAutomationEdit* ags_automation_edit_new() { AgsAutomationEdit *automation_edit; automation_edit = (AgsAutomationEdit *) g_object_new(AGS_TYPE_AUTOMATION_EDIT, NULL); return(automation_edit); } gsequencer-3.1.3/ags/X/editor/ags_wave_edit_callbacks.c0000644000175000017500000004514513616617253020036 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_wave_edit_drawing_area_button_press_position_cursor(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event); void ags_wave_edit_drawing_area_button_press_select_buffer(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event); void ags_wave_edit_drawing_area_button_release_position_cursor(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event); void ags_wave_edit_drawing_area_button_release_select_buffer(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event); void ags_wave_edit_drawing_area_motion_notify_position_cursor(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventMotion *event); void ags_wave_edit_drawing_area_motion_notify_select_buffer(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventMotion *event); void ags_wave_edit_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsWaveEdit *wave_edit) { ags_wave_edit_draw(wave_edit, cr); } gboolean ags_wave_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsWaveEdit *wave_edit) { ags_wave_edit_reset_vscrollbar(wave_edit); ags_wave_edit_reset_hscrollbar(wave_edit); gtk_widget_queue_draw(wave_edit); return(TRUE); } void ags_wave_edit_drawing_area_button_press_position_cursor(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAllocation allocation; gdouble c_range; guint g_range; double zoom_factor; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->vscrollbar)); c_range = wave_edit->upper - wave_edit->lower; g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* cursor position */ wave_edit->cursor_position_x = (guint) ((zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)))); wave_edit->cursor_position_y = (((allocation.height - event->y) / g_range) * c_range); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) wave_edit); } void ags_wave_edit_drawing_area_button_press_select_buffer(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event) { double zoom_factor; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); wave_edit->selection_x0 = (guint) zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)); wave_edit->selection_x1 = wave_edit->selection_x0; wave_edit->selection_y0 = (guint) event->y + gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar)); wave_edit->selection_y1 = wave_edit->selection_y0; gtk_widget_queue_draw((GtkWidget *) wave_edit); } gboolean ags_wave_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; AgsMachine *machine; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor(GTK_WIDGET(wave_edit), AGS_TYPE_WAVE_EDITOR); wave_toolbar = wave_editor->wave_toolbar; gtk_widget_grab_focus((GtkWidget *) wave_edit->drawing_area); wave_editor->focused_wave_edit = wave_edit; if((machine = wave_editor->selected_machine) != NULL && event->button == 1){ wave_edit->button_mask = AGS_WAVE_EDIT_BUTTON_1; if(wave_toolbar->selected_edit_mode == wave_toolbar->position){ wave_edit->mode = AGS_WAVE_EDIT_POSITION_CURSOR; ags_wave_edit_drawing_area_button_press_position_cursor(wave_editor, wave_toolbar, wave_edit, machine, event); }else if(wave_toolbar->selected_edit_mode == wave_toolbar->select){ wave_edit->mode = AGS_WAVE_EDIT_SELECT_BUFFER; ags_wave_edit_drawing_area_button_press_select_buffer(wave_editor, wave_toolbar, wave_edit, machine, event); } } return(TRUE); } void ags_wave_edit_drawing_area_button_release_position_cursor(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAllocation allocation; gdouble c_range; guint g_range; double zoom_factor; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->vscrollbar)); c_range = wave_edit->upper - wave_edit->lower; g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* cursor position */ wave_edit->cursor_position_x = (guint) ((zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)))); wave_edit->cursor_position_y = (((allocation.height - event->y) / g_range) * c_range); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) wave_edit); } void ags_wave_edit_drawing_area_button_release_select_buffer(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAllocation allocation; gdouble c_range; guint g_range; double zoom_factor; guint x0, x1; gdouble y0, y1; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->vscrollbar)); c_range = wave_edit->upper - wave_edit->lower; g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* region */ x0 = (guint) wave_edit->selection_x0; y0 = ((gdouble) (allocation.height - wave_edit->selection_y0) / g_range) * c_range; x1 = (guint) (zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar))); y1 = (((allocation.height - event->y) + gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar))) / g_range) * c_range; /* select region */ ags_wave_editor_select_region(wave_editor, x0, y0, x1, y1); } gboolean ags_wave_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; AgsMachine *machine; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor(GTK_WIDGET(wave_edit), AGS_TYPE_WAVE_EDITOR); wave_toolbar = wave_editor->wave_toolbar; if((machine = wave_editor->selected_machine) != NULL && event->button == 1){ wave_edit->button_mask &= (~AGS_WAVE_EDIT_BUTTON_1); if(wave_edit->mode == AGS_WAVE_EDIT_POSITION_CURSOR){ ags_wave_edit_drawing_area_button_release_position_cursor(wave_editor, wave_toolbar, wave_edit, machine, event); wave_edit->mode = AGS_WAVE_EDIT_NO_EDIT_MODE; }else if(wave_edit->mode == AGS_WAVE_EDIT_SELECT_BUFFER){ ags_wave_edit_drawing_area_button_release_select_buffer(wave_editor, wave_toolbar, wave_edit, machine, event); wave_edit->mode = AGS_WAVE_EDIT_NO_EDIT_MODE; } } return(FALSE); } void ags_wave_edit_drawing_area_motion_notify_position_cursor(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventMotion *event) { GtkAdjustment *vscrollbar_adjustment; GtkAllocation allocation; gdouble c_range; guint g_range; double zoom_factor; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->vscrollbar)); c_range = wave_edit->upper - wave_edit->lower; g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* cursor position */ wave_edit->cursor_position_x = ((zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)))); wave_edit->cursor_position_y = (((allocation.height - event->y) / g_range) * c_range); #ifdef AGS_DEBUG g_message("%lu %f", wave_edit->cursor_position_x, wave_edit->cursor_position_y); #endif /* queue draw */ gtk_widget_queue_draw((GtkWidget *) wave_edit); } void ags_wave_edit_drawing_area_motion_notify_select_buffer(AgsWaveEditor *wave_editor, AgsWaveToolbar *wave_toolbar, AgsWaveEdit *wave_edit, AgsMachine *machine, GdkEventMotion *event) { double zoom_factor; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); if(zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)) >= 0.0){ wave_edit->selection_x1 = (guint) zoom_factor * event->x + gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)); }else{ wave_edit->selection_x1 = 0.0; } if(event->y + gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar)) >= 0.0){ wave_edit->selection_y1 = (guint) event->y + gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar)); }else{ wave_edit->selection_y1 = 0.0; } gtk_widget_queue_draw((GtkWidget *) wave_edit); } gboolean ags_wave_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; AgsMachine *machine; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor(GTK_WIDGET(wave_edit), AGS_TYPE_WAVE_EDITOR); wave_toolbar = wave_editor->wave_toolbar; gtk_widget_grab_focus((GtkWidget *) wave_edit->drawing_area); if((machine = wave_editor->selected_machine) != NULL && (AGS_WAVE_EDIT_BUTTON_1 & (wave_edit->button_mask)) != 0){ if(wave_edit->mode == AGS_WAVE_EDIT_POSITION_CURSOR){ ags_wave_edit_drawing_area_motion_notify_position_cursor(wave_editor, wave_toolbar, wave_edit, machine, event); }else if(wave_edit->mode == AGS_WAVE_EDIT_SELECT_BUFFER){ ags_wave_edit_drawing_area_motion_notify_select_buffer(wave_editor, wave_toolbar, wave_edit, machine, event); } } return(FALSE); } gboolean ags_wave_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; AgsMachine *machine; gboolean retval; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor(GTK_WIDGET(wave_edit), AGS_TYPE_WAVE_EDITOR); machine = wave_editor->selected_machine; if(machine != NULL){ switch(event->keyval){ case GDK_KEY_Control_L: { wave_edit->key_mask |= AGS_WAVE_EDIT_KEY_L_CONTROL; } break; case GDK_KEY_Control_R: { wave_edit->key_mask |= AGS_WAVE_EDIT_KEY_R_CONTROL; } break; case GDK_KEY_Shift_L: { wave_edit->key_mask |= AGS_WAVE_EDIT_KEY_L_SHIFT; } break; case GDK_KEY_Shift_R: { wave_edit->key_mask |= AGS_WAVE_EDIT_KEY_R_SHIFT; } break; case GDK_KEY_a: { /* select all accelerations */ if((AGS_WAVE_EDIT_KEY_L_CONTROL & (wave_edit->key_mask)) != 0 || (AGS_WAVE_EDIT_KEY_R_CONTROL & (wave_edit->key_mask)) != 0){ ags_wave_editor_select_all(wave_editor); } } break; case GDK_KEY_c: { /* copy accelerations */ if((AGS_WAVE_EDIT_KEY_L_CONTROL & (wave_edit->key_mask)) != 0 || (AGS_WAVE_EDIT_KEY_R_CONTROL & (wave_edit->key_mask)) != 0){ ags_wave_editor_copy(wave_editor); } } break; case GDK_KEY_v: { /* paste accelerations */ if((AGS_WAVE_EDIT_KEY_L_CONTROL & (wave_edit->key_mask)) != 0 || (AGS_WAVE_EDIT_KEY_R_CONTROL & (wave_edit->key_mask)) != 0){ ags_wave_editor_paste(wave_editor); } } break; case GDK_KEY_x: { /* cut accelerations */ if((AGS_WAVE_EDIT_KEY_L_CONTROL & (wave_edit->key_mask)) != 0 || (AGS_WAVE_EDIT_KEY_R_CONTROL & (wave_edit->key_mask)) != 0){ ags_wave_editor_cut(wave_editor); } } break; case GDK_KEY_m: { /* meta */ if((AGS_WAVE_EDIT_KEY_L_CONTROL & (wave_edit->key_mask)) != 0 || (AGS_WAVE_EDIT_KEY_R_CONTROL & (wave_edit->key_mask)) != 0){ if((AGS_WAVE_META_ENABLED & (wave_editor->wave_meta->flags)) != 0){ wave_editor->wave_meta->flags &= (~AGS_WAVE_META_ENABLED); gtk_widget_hide(wave_editor->wave_meta); }else{ wave_editor->wave_meta->flags |= AGS_WAVE_META_ENABLED; gtk_widget_show_all(wave_editor->wave_meta); ags_wave_meta_refresh(wave_editor->wave_meta); } } } break; } } return(retval); } gboolean ags_wave_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; AgsMachine *machine; GtkAllocation allocation; double zoom_factor; gint i; gboolean retval; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor(GTK_WIDGET(wave_edit), AGS_TYPE_WAVE_EDITOR); wave_toolbar = wave_editor->wave_toolbar; machine = wave_editor->selected_machine; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } if(machine != NULL){ /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* check key value */ switch(event->keyval){ case GDK_KEY_Control_L: { wave_edit->key_mask &= (~AGS_WAVE_EDIT_KEY_L_CONTROL); } break; case GDK_KEY_Control_R: { wave_edit->key_mask &= (~AGS_WAVE_EDIT_KEY_R_CONTROL); } break; case GDK_KEY_Shift_L: { wave_edit->key_mask &= (~AGS_WAVE_EDIT_KEY_L_SHIFT); } break; case GDK_KEY_Shift_R: { wave_edit->key_mask &= (~AGS_WAVE_EDIT_KEY_R_SHIFT); } break; case GDK_KEY_Left: case GDK_KEY_leftarrow: { gdouble x0_offset; /* position cursor */ if(wave_edit->cursor_position_x > 0){ if(wave_edit->cursor_position_x - (zoom_factor * wave_edit->control_width) > 0){ wave_edit->cursor_position_x -= (zoom_factor * wave_edit->control_width); }else{ wave_edit->cursor_position_x = 0; } } x0_offset = wave_edit->cursor_position_x / zoom_factor; if(x0_offset / zoom_factor < gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar))){ gtk_range_set_value(GTK_RANGE(wave_edit->hscrollbar), x0_offset / zoom_factor); } } break; case GDK_KEY_Right: case GDK_KEY_rightarrow: { gdouble x0_offset; /* position cursor */ if(wave_edit->cursor_position_x < AGS_WAVE_EDITOR_MAX_CONTROLS){ wave_edit->cursor_position_x += (zoom_factor * wave_edit->control_width); } x0_offset = wave_edit->cursor_position_x / zoom_factor; if((x0_offset + wave_edit->control_width) / zoom_factor > gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)) + allocation.width){ gtk_range_set_value(GTK_RANGE(wave_edit->hscrollbar), x0_offset / zoom_factor); } } break; } gtk_widget_queue_draw((GtkWidget *) wave_edit); } return(retval); } void ags_wave_edit_vscrollbar_value_changed(GtkRange *range, AgsWaveEdit *wave_edit) { /* queue draw */ gtk_widget_queue_draw((GtkWidget *) wave_edit->drawing_area); } void ags_wave_edit_hscrollbar_value_changed(GtkRange *range, AgsWaveEdit *wave_edit) { AgsConfig *config; gchar *str; gdouble gui_scale_factor; gdouble value; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } value = gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)) / (gui_scale_factor * 64.0); gtk_adjustment_set_value(wave_edit->ruler->adjustment, value); gtk_widget_queue_draw((GtkWidget *) wave_edit->ruler); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) wave_edit->drawing_area); } gsequencer-3.1.3/ags/X/editor/ags_select_acceleration_dialog.h0000644000175000017500000000531013607210263021360 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SELECT_ACCELERATION_DIALOG_H__ #define __AGS_SELECT_ACCELERATION_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SELECT_ACCELERATION_DIALOG (ags_select_acceleration_dialog_get_type()) #define AGS_SELECT_ACCELERATION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SELECT_ACCELERATION_DIALOG, AgsSelectAccelerationDialog)) #define AGS_SELECT_ACCELERATION_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SELECT_ACCELERATION_DIALOG, AgsSelectAccelerationDialogClass)) #define AGS_IS_SELECT_ACCELERATION_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SELECT_ACCELERATION_DIALOG)) #define AGS_IS_SELECT_ACCELERATION_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SELECT_ACCELERATION_DIALOG)) #define AGS_SELECT_ACCELERATION_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SELECT_ACCELERATION_DIALOG, AgsSelectAccelerationDialogClass)) #define AGS_SELECT_ACCELERATION_MAX_BEATS (16 * 1200) #define AGS_SELECT_ACCELERATION_DEFAULT_WIDTH (64) typedef struct _AgsSelectAccelerationDialog AgsSelectAccelerationDialog; typedef struct _AgsSelectAccelerationDialogClass AgsSelectAccelerationDialogClass; typedef enum{ AGS_SELECT_ACCELERATION_DIALOG_CONNECTED = 1, }AgsSelectAccelerationDialogFlags; struct _AgsSelectAccelerationDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *copy_selection; GtkVBox *port; GtkButton *add; GtkSpinButton *select_x0; GtkSpinButton *select_x1; }; struct _AgsSelectAccelerationDialogClass { GtkDialogClass dialog; }; GType ags_select_acceleration_dialog_get_type(void); AgsSelectAccelerationDialog* ags_select_acceleration_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_SELECT_ACCELERATION_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_edit.c0000644000175000017500000015355313607210263016721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include static GType ags_accessible_notation_edit_get_type(void); void ags_notation_edit_class_init(AgsNotationEditClass *notation_edit); void ags_accessible_notation_edit_class_init(AtkObject *object); void ags_accessible_notation_edit_action_interface_init(AtkActionIface *action); void ags_notation_edit_connectable_interface_init(AgsConnectableInterface *connectable); void ags_notation_edit_init(AgsNotationEdit *notation_edit); void ags_notation_edit_finalize(GObject *gobject); AtkObject* ags_notation_edit_get_accessible(GtkWidget *widget); void ags_notation_edit_connect(AgsConnectable *connectable); void ags_notation_edit_disconnect(AgsConnectable *connectable); gboolean ags_accessible_notation_edit_do_action(AtkAction *action, gint i); gint ags_accessible_notation_edit_get_n_actions(AtkAction *action); const gchar* ags_accessible_notation_edit_get_description(AtkAction *action, gint i); const gchar* ags_accessible_notation_edit_get_name(AtkAction *action, gint i); const gchar* ags_accessible_notation_edit_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_notation_edit_set_description(AtkAction *action, gint i); gchar* ags_accessible_notation_edit_get_localized_name(AtkAction *action, gint i); void ags_notation_edit_show(GtkWidget *widget); void ags_notation_edit_show_all(GtkWidget *widget); gboolean ags_notation_edit_auto_scroll_timeout(GtkWidget *widget); /** * SECTION:ags_notation_edit * @short_description: edit notes * @title: AgsNotationEdit * @section_id: * @include: ags/X/editor/ags_notation_edit.h * * The #AgsNotationEdit lets you edit notes. */ enum{ PROP_0, }; static gpointer ags_notation_edit_parent_class = NULL; static GQuark quark_accessible_object = 0; GHashTable *ags_notation_edit_auto_scroll = NULL; GType ags_notation_edit_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_notation_edit = 0; static const GTypeInfo ags_notation_edit_info = { sizeof (AgsNotationEditClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_notation_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsNotationEdit), 0, /* n_preallocs */ (GInstanceInitFunc) ags_notation_edit_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_notation_edit_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_notation_edit = g_type_register_static(GTK_TYPE_TABLE, "AgsNotationEdit", &ags_notation_edit_info, 0); g_type_add_interface_static(ags_type_notation_edit, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_notation_edit); } return g_define_type_id__volatile; } static GType ags_accessible_notation_edit_get_type(void) { static GType ags_type_accessible_notation_edit = 0; if(!ags_type_accessible_notation_edit){ const GTypeInfo ags_accesssible_notation_edit_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_notation_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_notation_edit_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_notation_edit = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleNotationEdit", &ags_accesssible_notation_edit_info, 0); g_type_add_interface_static(ags_type_accessible_notation_edit, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_notation_edit); } void ags_notation_edit_class_init(AgsNotationEditClass *notation_edit) { GtkWidgetClass *widget; GObjectClass *gobject; ags_notation_edit_parent_class = g_type_class_peek_parent(notation_edit); /* GObjectClass */ gobject = G_OBJECT_CLASS(notation_edit); gobject->finalize = ags_notation_edit_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) notation_edit; widget->show = ags_notation_edit_show; widget->show_all = ags_notation_edit_show_all; // widget->draw = ags_notation_edit_draw; } void ags_accessible_notation_edit_class_init(AtkObject *object) { quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); } void ags_accessible_notation_edit_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_notation_edit_do_action; action->get_n_actions = ags_accessible_notation_edit_get_n_actions; action->get_description = ags_accessible_notation_edit_get_description; action->get_name = ags_accessible_notation_edit_get_name; action->get_keybinding = ags_accessible_notation_edit_get_keybinding; action->set_description = ags_accessible_notation_edit_set_description; action->get_localized_name = ags_accessible_notation_edit_get_localized_name; } void ags_notation_edit_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_notation_edit_connect; connectable->disconnect = ags_notation_edit_disconnect; } void ags_notation_edit_init(AgsNotationEdit *notation_edit) { GtkStyleContext *style_context; GtkAdjustment *adjustment; AgsConfig *config; gchar *str; gdouble gui_scale_factor; notation_edit->flags = (AGS_NOTATION_EDIT_SHOW_RULER | AGS_NOTATION_EDIT_SHOW_VSCROLLBAR | AGS_NOTATION_EDIT_SHOW_HSCROLLBAR); notation_edit->mode = AGS_NOTATION_EDIT_NO_EDIT_MODE; notation_edit->button_mask = 0; notation_edit->key_mask = 0; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } notation_edit->note_offset = 0; notation_edit->note_offset_absolute = 0; notation_edit->control_width = (guint) (gui_scale_factor * AGS_NOTATION_EDIT_DEFAULT_CONTROL_WIDTH); notation_edit->control_height = (guint) (gui_scale_factor * AGS_NOTATION_EDIT_DEFAULT_CONTROL_HEIGHT); notation_edit->control_margin_x = AGS_NOTATION_EDIT_DEFAULT_CONTROL_MARGIN_X; notation_edit->control_margin_y = AGS_NOTATION_EDIT_DEFAULT_CONTROL_MARGIN_Y; notation_edit->cursor_position_x = AGS_NOTATION_EDIT_DEFAULT_CURSOR_POSITION_X; notation_edit->cursor_position_y = AGS_NOTATION_EDIT_DEFAULT_CURSOR_POSITION_Y; notation_edit->selected_note_border = AGS_NOTATION_EDIT_DEFAULT_SELECTED_NOTE_BORDER; notation_edit->selection_x0 = 0; notation_edit->selection_x1 = 0; notation_edit->selection_y0 = 0; notation_edit->selection_y1 = 0; notation_edit->current_note = NULL; notation_edit->ruler = ags_ruler_new(); g_object_set(notation_edit->ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), NULL); gtk_table_attach(GTK_TABLE(notation_edit), (GtkWidget *) notation_edit->ruler, 0, 1, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0); notation_edit->drawing_area = (GtkDrawingArea *) gtk_drawing_area_new(); gtk_widget_set_has_window(notation_edit->drawing_area, TRUE); gtk_widget_set_events(GTK_WIDGET(notation_edit->drawing_area), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_set_can_focus((GtkWidget *) notation_edit->drawing_area, TRUE); gtk_table_attach(GTK_TABLE(notation_edit), (GtkWidget *) notation_edit->drawing_area, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); /* vscrollbar */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, notation_edit->control_height, 1.0); notation_edit->vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); g_object_set(notation_edit->vscrollbar, "no-show-all", TRUE, NULL); gtk_table_attach(GTK_TABLE(notation_edit), (GtkWidget *) notation_edit->vscrollbar, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* hscrollbar */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (gdouble) notation_edit->control_width, 1.0); notation_edit->hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); g_object_set(notation_edit->hscrollbar, "no-show-all", TRUE, NULL); gtk_table_attach(GTK_TABLE(notation_edit), (GtkWidget *) notation_edit->hscrollbar, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* style context */ style_context = gtk_widget_get_style_context(notation_edit); gtk_style_context_add_class(style_context, "editor"); /* auto-scroll */ if(ags_notation_edit_auto_scroll == NULL){ ags_notation_edit_auto_scroll = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_notation_edit_auto_scroll, notation_edit, ags_notation_edit_auto_scroll_timeout); g_timeout_add(1000 / 30, (GSourceFunc) ags_notation_edit_auto_scroll_timeout, (gpointer) notation_edit); } void ags_notation_edit_finalize(GObject *gobject) { AgsNotationEdit *notation_edit; notation_edit = AGS_NOTATION_EDIT(gobject); /* remove auto scroll */ g_hash_table_remove(ags_notation_edit_auto_scroll, notation_edit); /* call parent */ G_OBJECT_CLASS(ags_notation_edit_parent_class)->finalize(gobject); } AtkObject* ags_notation_edit_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_notation_edit_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_notation_edit_connect(AgsConnectable *connectable) { AgsNotationEdit *notation_edit; notation_edit = AGS_NOTATION_EDIT(connectable); if((AGS_NOTATION_EDIT_CONNECTED & (notation_edit->flags)) != 0){ return; } notation_edit->flags |= AGS_NOTATION_EDIT_CONNECTED; /* drawing area */ g_signal_connect(G_OBJECT(notation_edit->drawing_area), "draw", G_CALLBACK(ags_notation_edit_draw_callback), (gpointer) notation_edit); g_signal_connect_after((GObject *) notation_edit->drawing_area, "configure_event", G_CALLBACK(ags_notation_edit_drawing_area_configure_event), (gpointer) notation_edit); g_signal_connect((GObject *) notation_edit->drawing_area, "button_press_event", G_CALLBACK(ags_notation_edit_drawing_area_button_press_event), (gpointer) notation_edit); g_signal_connect((GObject *) notation_edit->drawing_area, "button_release_event", G_CALLBACK(ags_notation_edit_drawing_area_button_release_event), (gpointer) notation_edit); g_signal_connect((GObject *) notation_edit->drawing_area, "motion_notify_event", G_CALLBACK(ags_notation_edit_drawing_area_motion_notify_event), (gpointer) notation_edit); g_signal_connect((GObject *) notation_edit->drawing_area, "key_press_event", G_CALLBACK(ags_notation_edit_drawing_area_key_press_event), (gpointer) notation_edit); g_signal_connect((GObject *) notation_edit->drawing_area, "key_release_event", G_CALLBACK(ags_notation_edit_drawing_area_key_release_event), (gpointer) notation_edit); /* scrollbars */ g_signal_connect_after((GObject *) notation_edit->vscrollbar, "value-changed", G_CALLBACK(ags_notation_edit_vscrollbar_value_changed), (gpointer) notation_edit); g_signal_connect_after((GObject *) notation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_notation_edit_hscrollbar_value_changed), (gpointer) notation_edit); } void ags_notation_edit_disconnect(AgsConnectable *connectable) { AgsNotationEdit *notation_edit; notation_edit = AGS_NOTATION_EDIT(connectable); if((AGS_NOTATION_EDIT_CONNECTED & (notation_edit->flags)) == 0){ return; } notation_edit->flags &= (~AGS_NOTATION_EDIT_CONNECTED); /* drawing area */ g_object_disconnect(notation_edit->drawing_area, "any_signal::draw", G_CALLBACK(ags_notation_edit_draw_callback), (gpointer) notation_edit, "any_signal::configure_event", G_CALLBACK(ags_notation_edit_drawing_area_configure_event), (gpointer) notation_edit, "any_signal::button_press_event", G_CALLBACK(ags_notation_edit_drawing_area_button_press_event), (gpointer) notation_edit, "any_signal::button_release_event", G_CALLBACK(ags_notation_edit_drawing_area_button_release_event), (gpointer) notation_edit, "any_signal::motion_notify_event", G_CALLBACK(ags_notation_edit_drawing_area_motion_notify_event), notation_edit, "any_signal::key_press_event", G_CALLBACK(ags_notation_edit_drawing_area_key_press_event), (gpointer) notation_edit, "any_signal::key_release_event", G_CALLBACK(ags_notation_edit_drawing_area_key_release_event), (gpointer) notation_edit, NULL); /* scrollbars */ g_object_disconnect(notation_edit->vscrollbar, "any_signal::value-changed", G_CALLBACK(ags_notation_edit_vscrollbar_value_changed), (gpointer) notation_edit, NULL); g_object_disconnect(notation_edit->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_notation_edit_hscrollbar_value_changed), (gpointer) notation_edit, NULL); } gboolean ags_accessible_notation_edit_do_action(AtkAction *action, gint i) { AgsNotationEdit *notation_edit; GdkEventKey *key_press, *key_release; GdkEventKey *modifier_press, *modifier_release; GdkEventKey *second_level_press, *second_level_release; if(!(i >= 0 && i < 13)){ return(FALSE); } notation_edit = (AgsNotationEdit *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); key_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); /* create modifier */ modifier_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); modifier_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); modifier_press->keyval = modifier_release->keyval = GDK_KEY_Control_R; /* create second level */ second_level_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); second_level_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); second_level_press->keyval = second_level_release->keyval = GDK_KEY_Shift_R; switch(i){ case 0: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); } break; case 1: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); } break; case 2: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); } break; case 3: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); } break; case 4: { key_press->keyval = key_release->keyval = GDK_KEY_space; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); } break; case 5: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 6: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 7: { key_press->keyval = key_release->keyval = GDK_KEY_Delete; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); } break; case 8: { key_press->keyval = key_release->keyval = GDK_KEY_c; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 9: { key_press->keyval = key_release->keyval = GDK_KEY_x; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 10: { key_press->keyval = key_release->keyval = GDK_KEY_v; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 11: { key_press->keyval = key_release->keyval = GDK_KEY_a; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 12: { key_press->keyval = key_release->keyval = GDK_KEY_i; /* send event */ gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) notation_edit->drawing_area, (GdkEvent *) modifier_release); } break; } return(TRUE); } gint ags_accessible_notation_edit_get_n_actions(AtkAction *action) { return(13); } const gchar* ags_accessible_notation_edit_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move cursor left", "move cursor right", "move cursor up", "move cursor down", "add audio note", "shrink audio note", "grow audio note", "remove audio note", "copy note to clipboard", "cut note to clipbaord", "paste note from clipboard", "select all note", "invert note", }; if(i >= 0 && i < 13){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_notation_edit_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "add", "shrink", "grow", "remove", "copy", "cut", "paste", "select-all", "invert", }; if(i >= 0 && i < 13){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_notation_edit_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "space", "Shft+Left", "Shft+Right", "Del" "Ctrl+c" "Ctrl+x", "Ctrl+v", "Ctrl+a", "Ctrl+i", }; if(i >= 0 && i < 13){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_notation_edit_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_notation_edit_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_notation_edit_show(GtkWidget *widget) { AgsNotationEdit *notation_edit; notation_edit = AGS_NOTATION_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_notation_edit_parent_class)->show(widget); if((AGS_NOTATION_EDIT_SHOW_RULER & (notation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) notation_edit->ruler); } if((AGS_NOTATION_EDIT_SHOW_VSCROLLBAR & (notation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) notation_edit->vscrollbar); } if((AGS_NOTATION_EDIT_SHOW_HSCROLLBAR & (notation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) notation_edit->hscrollbar); } ags_notation_edit_reset_vscrollbar(notation_edit); ags_notation_edit_reset_hscrollbar(notation_edit); } void ags_notation_edit_show_all(GtkWidget *widget) { AgsNotationEdit *notation_edit; notation_edit = AGS_NOTATION_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_notation_edit_parent_class)->show_all(widget); if((AGS_NOTATION_EDIT_SHOW_RULER & (notation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) notation_edit->ruler); } if((AGS_NOTATION_EDIT_SHOW_VSCROLLBAR & (notation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) notation_edit->vscrollbar); } if((AGS_NOTATION_EDIT_SHOW_HSCROLLBAR & (notation_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) notation_edit->hscrollbar); } ags_notation_edit_reset_vscrollbar(notation_edit); ags_notation_edit_reset_hscrollbar(notation_edit); } gboolean ags_notation_edit_auto_scroll_timeout(GtkWidget *widget) { if(g_hash_table_lookup(ags_notation_edit_auto_scroll, widget) != NULL){ AgsNotationEditor *notation_editor; AgsNotationEdit *notation_edit; GtkAdjustment *hscrollbar_adjustment; GObject *output_soundcard; double x; notation_edit = AGS_NOTATION_EDIT(widget); if((AGS_NOTATION_EDIT_AUTO_SCROLL & (notation_edit->flags)) == 0){ return(TRUE); } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine == NULL){ return(TRUE); } /* reset offset */ g_object_get(notation_editor->selected_machine->audio, "output-soundcard", &output_soundcard, NULL); notation_edit->note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); notation_edit->note_offset_absolute = ags_soundcard_get_note_offset_absolute(AGS_SOUNDCARD(output_soundcard)); /* reset scrollbar */ hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(notation_edit->hscrollbar)); x = ((notation_edit->note_offset * notation_edit->control_width) / (AGS_NOTATION_EDITOR_MAX_CONTROLS * notation_edit->control_width)) * gtk_adjustment_get_upper(hscrollbar_adjustment); gtk_range_set_value(GTK_RANGE(notation_edit->hscrollbar), x); g_object_unref(output_soundcard); return(TRUE); }else{ return(FALSE); } } void ags_notation_edit_reset_vscrollbar(AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; GtkAdjustment *adjustment; GtkAdjustment *piano_adjustment; GtkAllocation allocation; guint channel_count; double varea_height; gdouble upper, old_upper; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); /* fix margin-bottom */ gtk_widget_get_allocation(notation_editor->notation_edit->hscrollbar, &allocation); g_object_set(notation_editor->scrolled_piano, "margin-bottom", (gint) allocation.height, NULL); if(notation_editor->selected_machine == NULL){ return; } /* */ gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* adjustment */ adjustment = gtk_range_get_adjustment(GTK_RANGE(notation_edit->vscrollbar)); g_object_get(notation_editor->scrolled_piano->viewport, "vadjustment", &piano_adjustment, NULL); /* get channel count */ #if 0 if(ags_audio_test_flags(notation_editor->selected_machine->audio, AGS_AUDIO_NOTATION_DEFAULT)){ g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); channel_count = notation_editor->selected_machine->audio->input_pads; }else{ g_object_get(notation_editor->selected_machine->audio, "output-pads", &channel_count, NULL); } #else g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); #endif /* upper */ old_upper = gtk_adjustment_get_upper(adjustment); varea_height = (channel_count * notation_edit->control_height); upper = varea_height - allocation.height; if(upper < 0.0){ upper = 0.0; } gtk_adjustment_set_upper(adjustment, upper); /* piano - upper */ gtk_adjustment_set_lower(piano_adjustment, gtk_adjustment_get_lower(adjustment)); gtk_adjustment_set_step_increment(piano_adjustment, gtk_adjustment_get_step_increment(adjustment)); gtk_adjustment_set_page_increment(piano_adjustment, gtk_adjustment_get_page_increment(adjustment)); gtk_adjustment_set_page_size(piano_adjustment, gtk_adjustment_get_page_size(adjustment)); gtk_adjustment_set_upper(piano_adjustment, gtk_adjustment_get_upper(adjustment)); /* reset value */ if(old_upper != 0.0){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) / old_upper * upper); gtk_adjustment_set_value(piano_adjustment, gtk_adjustment_get_value(adjustment)); } } void ags_notation_edit_reset_hscrollbar(AgsNotationEdit *notation_edit) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkAdjustment *adjustment; GtkAllocation allocation; double zoom_factor, zoom; double zoom_correction; guint map_width; gdouble upper, old_upper; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine == NULL){ return; } notation_toolbar = notation_editor->notation_toolbar; gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* adjustment */ adjustment = gtk_range_get_adjustment(GTK_RANGE(notation_edit->hscrollbar)); /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom) - 2.0); /* upper */ old_upper = gtk_adjustment_get_upper(adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_NOTATION_EDITOR_MAX_CONTROLS * notation_edit->control_width * zoom * zoom_correction); upper = map_width - allocation.width; if(upper < 0.0){ upper = 0.0; } gtk_adjustment_set_upper(adjustment, upper); /* ruler */ notation_edit->ruler->factor = zoom_factor; notation_edit->ruler->precision = zoom; notation_edit->ruler->scale_precision = 1.0 / zoom; gtk_adjustment_set_upper(notation_edit->ruler->adjustment, upper / notation_edit->control_width); /* reset value */ if(old_upper != 0.0){ #if 0 gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) / old_upper * upper); #endif } } void ags_notation_edit_draw_segment(AgsNotationEdit *notation_edit, cairo_t *cr) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkStyleContext *notation_edit_style_context; GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; guint channel_count; guint width, height; gboolean width_fits, height_fits; double zoom; guint y0, x0; guint nth_x; guint i, j; guint j_set; GValue value = {0,}; const static double segment_dashes = { 0.5, }; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine == NULL){ return; } notation_toolbar = notation_editor->notation_toolbar; gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* style context */ notation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(notation_edit->drawing_area)); gtk_style_context_get_property(notation_edit_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(notation_edit_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(notation_edit_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); /* adjustment */ vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(notation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(notation_edit->hscrollbar)); /* get channel count */ #if 0 if(ags_audio_test_flags(notation_editor->selected_machine->audio, AGS_AUDIO_NOTATION_DEFAULT)){ g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); channel_count = notation_editor->selected_machine->audio->input_pads; }else{ g_object_get(notation_editor->selected_machine->audio, "output-pads", &channel_count, NULL); } #else g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); #endif /* get width */ width = allocation.width; width_fits = FALSE; if(AGS_NOTATION_EDITOR_MAX_CONTROLS * notation_edit->control_width < width){ width = AGS_NOTATION_EDITOR_MAX_CONTROLS * notation_edit->control_width; width_fits = TRUE; } /* get height */ height = allocation.height; height_fits = FALSE; if(channel_count * notation_edit->control_height < height){ height = channel_count * notation_edit->control_height; height_fits = TRUE; } /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom) - 2.0); /* */ if(width_fits){ x0 = 0; }else{ x0 = notation_edit->control_width - ((guint) gtk_adjustment_get_value(hscrollbar_adjustment) % notation_edit->control_width); } if(height_fits){ y0 = 0; }else{ y0 = notation_edit->control_height - ((guint) gtk_adjustment_get_value(vscrollbar_adjustment) % notation_edit->control_height); } nth_x = (guint) floor(gtk_adjustment_get_value(hscrollbar_adjustment) / notation_edit->control_width); nth_x += 1; /* push group */ cairo_push_group(cr); /* clear with background color */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, 0.0, (double) allocation.width, (double) allocation.height); cairo_fill(cr); /* horizontal lines */ cairo_set_line_width(cr, 1.0); cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); for(i = y0 ; i < height; ){ cairo_move_to(cr, 0.0, (double) i); cairo_line_to(cr, (double) width, (double) i); cairo_stroke(cr); i += notation_edit->control_height; } if(height_fits){ cairo_move_to(cr, 0.0, (double) i); cairo_line_to(cr, (double) width, (double) i); cairo_stroke(cr); } /* vertical lines */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); i = x0; if(i < width && zoom > 1.0 ){ j_set = nth_x % ((guint) zoom); /* thin lines */ cairo_set_dash(cr, &segment_dashes, 1, 0.0); if(j_set != 0){ j = j_set; goto ags_notation_edit_draw_segment0; } } for(; i < width; ){ /* strong lines */ cairo_set_dash(cr, NULL, 0, 0.0); cairo_move_to(cr, (double) i, 0.0); cairo_line_to(cr, (double) i, (double) height); cairo_stroke(cr); i += notation_edit->control_width; /* thin lines */ cairo_set_dash(cr, &segment_dashes, 1, 0.0); for(j = 1; i < width && j < zoom; j++){ ags_notation_edit_draw_segment0: cairo_move_to(cr, (double) i, 0.0); cairo_line_to(cr, (double) i, (double) height); cairo_stroke(cr); i += notation_edit->control_width; } } /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); } void ags_notation_edit_draw_position(AgsNotationEdit *notation_edit, cairo_t *cr) { AgsNotationEditor *notation_editor; GtkStyleContext *notation_edit_style_context; GtkAllocation allocation; GdkRGBA *fg_color_active; guint channel_count; double position; double x, y; double width, height; gboolean height_fits; GValue value = {0,}; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine == NULL){ return; } gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* style context */ notation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(notation_edit->drawing_area)); gtk_style_context_get_property(notation_edit_style_context, "color", GTK_STATE_FLAG_ACTIVE, &value); fg_color_active = g_value_dup_boxed(&value); g_value_unset(&value); /* get channel count */ #if 0 if(ags_audio_test_flags(notation_editor->selected_machine->audio, AGS_AUDIO_NOTATION_DEFAULT)){ g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); channel_count = notation_editor->selected_machine->audio->input_pads; }else{ g_object_get(notation_editor->selected_machine->audio, "output-pads", &channel_count, NULL); } #else g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); #endif /* get offset and dimensions */ position = ((double) notation_edit->note_offset) * ((double) notation_edit->control_width); y = 0.0; x = (position) - (gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar))); height = (double) allocation.height; width = (double) AGS_NOTATION_EDIT_DEFAULT_FADER_WIDTH; if(height < channel_count * notation_edit->control_height){ height = channel_count * notation_edit->control_height; } /* push group */ cairo_push_group(cr); /* draw fader */ cairo_set_source_rgba(cr, fg_color_active->red, fg_color_active->blue, fg_color_active->green, fg_color_active->alpha); cairo_rectangle(cr, (double) x, (double) y, (double) width, (double) height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_active); } void ags_notation_edit_draw_cursor(AgsNotationEdit *notation_edit, cairo_t *cr) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkStyleContext *notation_edit_style_context; GtkAllocation allocation; GdkRGBA *fg_color_focused; double zoom_factor; double x, y; double width, height; GValue value = {0,}; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine == NULL){ return; } notation_toolbar = notation_editor->notation_toolbar; gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* style context */ notation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(notation_edit->drawing_area)); gtk_style_context_get_property(notation_edit_style_context, "color", GTK_STATE_FLAG_FOCUSED, &value); fg_color_focused = g_value_dup_boxed(&value); g_value_unset(&value); /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* get offset */ x = ((double) notation_edit->cursor_position_x * (double) notation_edit->control_width) - (gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)) * zoom_factor); y = ((double) notation_edit->cursor_position_y * (double) notation_edit->control_height) - gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)); width = (double) notation_edit->control_width; height = (double) notation_edit->control_height; /* apply zoom */ x /= zoom_factor; /* clip */ if(x < 0.0){ width += x; x = 0.0; }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(y < 0.0){ height += y; y = 0.0; }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* push group */ cairo_push_group(cr); /* draw cursor */ cairo_set_source_rgba(cr, fg_color_focused->red, fg_color_focused->blue, fg_color_focused->green, fg_color_focused->alpha); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); } void ags_notation_edit_draw_selection(AgsNotationEdit *notation_edit, cairo_t *cr) { GtkAllocation allocation; GtkStyleContext *notation_edit_style_context; GdkRGBA *fg_color_prelight; double x, y; double width, height; GValue value = {0,}; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* style context */ notation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(notation_edit->drawing_area)); gtk_style_context_get_property(notation_edit_style_context, "color", GTK_STATE_FLAG_PRELIGHT, &value); fg_color_prelight = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* get offset and dimensions */ if(notation_edit->selection_x0 < notation_edit->selection_x1){ x = ((double) notation_edit->selection_x0) - gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)); width = ((double) notation_edit->selection_x1 - (double) notation_edit->selection_x0); }else{ x = ((double) notation_edit->selection_x1) - gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)); width = ((double) notation_edit->selection_x0 - (double) notation_edit->selection_x1); } if(notation_edit->selection_y0 < notation_edit->selection_y1){ y = ((double) notation_edit->selection_y0) - gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)); height = ((double) notation_edit->selection_y1 - (double) notation_edit->selection_y0); }else{ y = ((double) notation_edit->selection_y1) - gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)); height = ((double) notation_edit->selection_y0 - (double) notation_edit->selection_y1); } /* clip */ if(x < 0.0){ width += x; x = 0.0; }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(y < 0.0){ height += y; y = 0.0; }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* push group */ cairo_push_group(cr); /* draw selection */ cairo_set_source_rgba(cr, fg_color_prelight->red, fg_color_prelight->blue, fg_color_prelight->green, 1.0 / 3.0); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); } void ags_notation_edit_draw_note(AgsNotationEdit *notation_edit, AgsNote *note, cairo_t *cr, gdouble opacity) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkStyleContext *notation_edit_style_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *fg_color_selected; double zoom_factor; guint channel_count; double viewport_x, viewport_y; double x, y; double width, height; GValue value = {0,}; if(!AGS_IS_NOTATION_EDIT(notation_edit) || !AGS_IS_NOTE(note)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); if(notation_editor->selected_machine == NULL){ return; } notation_toolbar = notation_editor->notation_toolbar; gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); /* style context */ notation_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(notation_edit->drawing_area)); gtk_style_context_get_property(notation_edit_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(notation_edit_style_context, "color", GTK_STATE_FLAG_SELECTED, &value); fg_color_selected = g_value_dup_boxed(&value); g_value_unset(&value); /* get channel count */ #if 0 if(ags_audio_test_flags(notation_editor->selected_machine->audio, AGS_AUDIO_NOTATION_DEFAULT)){ g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); channel_count = notation_editor->selected_machine->audio->input_pads; }else{ g_object_get(notation_editor->selected_machine->audio, "output-pads", &channel_count, NULL); } #else g_object_get(notation_editor->selected_machine->audio, "input-pads", &channel_count, NULL); #endif /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* get offset and dimensions */ if((AGS_NOTATION_EDITOR_MAX_CONTROLS * notation_edit->control_width) > allocation.width){ viewport_x = zoom_factor * gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)); }else{ viewport_x = 0.0; } if((channel_count * notation_edit->control_height) > allocation.height){ viewport_y = gtk_range_get_value(GTK_RANGE(notation_edit->vscrollbar)); }else{ viewport_y = 0.0; } x = ((double) note->x[0]) * ((double) notation_edit->control_width) - viewport_x; y = ((double) note->y) * ((double) notation_edit->control_height) - viewport_y; width = ((double) (note->x[1] - note->x[0])) * ((double) notation_edit->control_width); height = ((double) notation_edit->control_height); /* apply zoom */ x /= zoom_factor; x += ((double) notation_edit->control_margin_x); y += ((double) notation_edit->control_margin_y); width /= zoom_factor; width -= (2.0 * (double) notation_edit->control_margin_x); height -= (2.0 * (double) notation_edit->control_margin_y); /* clip */ if(x < 0.0){ if(x + width < 0.0){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; }else{ width += x; x = 0.0; } }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(y < 0.0){ if(y + height < 0.0){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; }else{ height += y; y = 0.0; } }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* draw note */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, opacity * fg_color->alpha); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); /* check note selected */ if((AGS_NOTE_IS_SELECTED & (note->flags)) != 0){ double selected_x, selected_y; double selected_width, selected_height; selected_x = x - notation_edit->selected_note_border; selected_y = y - notation_edit->selected_note_border; selected_width = width + (2.0 * (double) notation_edit->selected_note_border); selected_height = height + (2.0 * (double) notation_edit->selected_note_border); /* clip */ if(selected_x < 0.0){ selected_x = 0.0; } if(selected_x + selected_width > allocation.width){ selected_width = ((double) allocation.width) - selected_x; } if(selected_y < 0.0){ selected_y = 0.0; } if(selected_y + selected_height > allocation.height){ selected_height = ((double) allocation.height) - selected_y; } /* draw selected note */ cairo_set_source_rgba(cr, fg_color_selected->red, fg_color_selected->blue, fg_color_selected->green, opacity / 3.0); cairo_rectangle(cr, selected_x, selected_y, selected_width, selected_height); cairo_fill(cr); } g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); } void ags_notation_edit_draw_notation(AgsNotationEdit *notation_edit, cairo_t *cr) { AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; GtkAllocation allocation; AgsTimestamp *timestamp; AgsTimestamp *current_timestamp; GList *start_list_notation, *list_notation; gdouble opacity; gdouble zoom, zoom_factor; guint x0, x1; guint offset; guint audio_channel; gint i; if(!AGS_IS_NOTATION_EDIT(notation_edit)){ return; } notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_edit, AGS_TYPE_NOTATION_EDITOR); notation_toolbar = notation_editor->notation_toolbar; if(notation_editor->selected_machine == NULL){ return; } gtk_widget_get_allocation(GTK_WIDGET(notation_edit->drawing_area), &allocation); opacity = gtk_spin_button_get_value(notation_editor->notation_toolbar->opacity); /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom)); /* get visisble region */ x0 = (zoom_factor * gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar))) / notation_edit->control_width; x1 = ((zoom_factor * gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar))) / notation_edit->control_width) + (allocation.width * zoom); /* draw notation */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; g_object_get(notation_editor->selected_machine->audio, "notation", &start_list_notation, NULL); timestamp->timer.ags_offset.offset = (guint64) AGS_NOTATION_DEFAULT_OFFSET * floor((double) x0 / (double) AGS_NOTATION_DEFAULT_OFFSET); i = 0; while((i = ags_notebook_next_active_tab(notation_editor->notebook, i)) != -1){ list_notation = ags_notation_find_near_timestamp(start_list_notation, i, timestamp); while(list_notation != NULL){ AgsNotation *notation; GList *start_list_note, *list_note; notation = AGS_NOTATION(list_notation->data); g_object_get(notation, "audio-channel", &audio_channel, "timestamp", ¤t_timestamp, NULL); g_object_unref(current_timestamp); if(ags_timestamp_get_ags_offset(current_timestamp) > AGS_NOTATION_DEFAULT_OFFSET * floor((double) x1 / (double) AGS_NOTATION_DEFAULT_OFFSET) + AGS_NOTATION_DEFAULT_OFFSET){ break; } if(ags_timestamp_get_ags_offset(current_timestamp) + AGS_NOTATION_DEFAULT_OFFSET < x0){ list_notation = list_notation->next; continue; } if(i != audio_channel){ list_notation = list_notation->next; continue; } g_object_get(notation, "note", &start_list_note, NULL); list_note = start_list_note; while(list_note != NULL){ ags_notation_edit_draw_note(notation_edit, list_note->data, cr, opacity); list_note = list_note->next; } g_list_free_full(start_list_note, g_object_unref); list_notation = list_notation->next; } i++; } g_list_free_full(start_list_notation, g_object_unref); g_object_unref(timestamp); } void ags_notation_edit_draw(AgsNotationEdit *notation_edit, cairo_t *cr) { /* segment */ ags_notation_edit_draw_segment(notation_edit, cr); /* notation */ ags_notation_edit_draw_notation(notation_edit, cr); /* edit mode */ switch(notation_edit->mode){ case AGS_NOTATION_EDIT_POSITION_CURSOR: { ags_notation_edit_draw_cursor(notation_edit, cr); } break; case AGS_NOTATION_EDIT_ADD_NOTE: { if(notation_edit->current_note != NULL){ if(cr != NULL){ ags_notation_edit_draw_note(notation_edit, notation_edit->current_note, cr, 1.0); cairo_surface_mark_dirty(cairo_get_target(cr)); } } } break; case AGS_NOTATION_EDIT_SELECT_NOTE: { ags_notation_edit_draw_selection(notation_edit, cr); } break; } /* fader */ if((AGS_NOTATION_EDIT_AUTO_SCROLL & (notation_edit->flags)) != 0){ ags_notation_edit_draw_position(notation_edit, cr); } } /** * ags_notation_edit_new: * * Create a new #AgsNotationEdit. * * Returns: a new #AgsNotationEdit * * Since: 3.0.0 */ AgsNotationEdit* ags_notation_edit_new() { AgsNotationEdit *notation_edit; notation_edit = (AgsNotationEdit *) g_object_new(AGS_TYPE_NOTATION_EDIT, NULL); return(notation_edit); } gsequencer-3.1.3/ags/X/editor/ags_notation_meta.c0000644000175000017500000004362113616617253016726 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_notation_meta_class_init(AgsNotationMetaClass *notation_meta); void ags_notation_meta_connectable_interface_init(AgsConnectableInterface *connectable); void ags_notation_meta_init(AgsNotationMeta *notation_meta); void ags_notation_meta_connect(AgsConnectable *connectable); void ags_notation_meta_disconnect(AgsConnectable *connectable); /** * SECTION:ags_notation_meta * @short_description: notation_meta * @title: AgsNotationMeta * @section_id: * @include: ags/X/editor/ags_notation_meta.h * * The #AgsNotationMeta provides you information about notation editor. */ GType ags_notation_meta_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_notation_meta = 0; static const GTypeInfo ags_notation_meta_info = { sizeof (AgsNotationMetaClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_notation_meta_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsNotationMeta), 0, /* n_preallocs */ (GInstanceInitFunc) ags_notation_meta_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_notation_meta_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_notation_meta = g_type_register_static(GTK_TYPE_VBOX, "AgsNotationMeta", &ags_notation_meta_info, 0); g_type_add_interface_static(ags_type_notation_meta, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_notation_meta); } return g_define_type_id__volatile; } void ags_notation_meta_class_init(AgsNotationMetaClass *notation_meta) { /* empty */ } void ags_notation_meta_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_notation_meta_connect; connectable->disconnect = ags_notation_meta_disconnect; } void ags_notation_meta_init(AgsNotationMeta *notation_meta) { GtkGrid *grid; GtkLabel *label; guint i; notation_meta->flags = 0; grid = gtk_grid_new(); gtk_box_pack_start((GtkBox *) notation_meta, (GtkWidget *) grid, FALSE, TRUE, 0); /* machine type */ i = 0; label = (GtkLabel *) gtk_label_new(i18n("machine type: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->machine_type = (GtkLabel *) gtk_label_new("(null)"); g_object_set(notation_meta->machine_type, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->machine_type, 1, i, 1, 1); /* machine name */ i++; label = (GtkLabel *) gtk_label_new(i18n("machine name: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->machine_name = (GtkLabel *) gtk_label_new("(null)"); g_object_set(notation_meta->machine_name, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->machine_name, 1, i, 1, 1); /* audio channels */ i++; label = (GtkLabel *) gtk_label_new(i18n("audio channels: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->audio_channels = (GtkLabel *) gtk_label_new("-1"); g_object_set(notation_meta->audio_channels, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->audio_channels, 1, i, 1, 1); /* output pads */ i++; label = (GtkLabel *) gtk_label_new(i18n("output pads: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->output_pads = (GtkLabel *) gtk_label_new("-1"); g_object_set(notation_meta->output_pads, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->output_pads, 1, i, 1, 1); /* input pads */ i++; label = (GtkLabel *) gtk_label_new(i18n("input pads: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->input_pads = (GtkLabel *) gtk_label_new("-1"); g_object_set(notation_meta->input_pads, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->input_pads, 1, i, 1, 1); /* editor tool */ i++; label = (GtkLabel *) gtk_label_new(i18n("editor tool: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->editor_tool = (GtkLabel *) gtk_label_new("(null)"); g_object_set(notation_meta->editor_tool, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->editor_tool, 1, i, 1, 1); /* active audio channel */ i++; label = (GtkLabel *) gtk_label_new(i18n("active audio channel: ")); g_object_set(label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->active_audio_channel = (GtkLabel *) gtk_label_new("(null)"); g_object_set(notation_meta->active_audio_channel, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->active_audio_channel, 1, i, 1, 1); /* cursor x-position */ i++; label = (GtkLabel *) gtk_label_new(i18n("cursor x-position: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->cursor_x_position = (GtkLabel *) gtk_label_new("-1"); g_object_set(notation_meta->cursor_x_position, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->cursor_x_position, 1, i, 1, 1); /* cursor y-position */ i++; label = (GtkLabel *) gtk_label_new(i18n("cursor y-position: ")); g_object_set(label, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->cursor_y_position = (GtkLabel *) gtk_label_new("-1"); g_object_set(notation_meta->cursor_y_position, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->cursor_y_position, 1, i, 1, 1); /* current note */ i++; label = (GtkLabel *) gtk_label_new(i18n("current note: ")); g_object_set(label, "halign", GTK_ALIGN_START, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) label, 0, i, 1, 1); notation_meta->current_note = (GtkLabel *) gtk_label_new("(null)"); g_object_set(notation_meta->current_note, "halign", GTK_ALIGN_START, NULL); gtk_grid_attach(grid, (GtkWidget *) notation_meta->current_note, 1, i, 1, 1); } void ags_notation_meta_connect(AgsConnectable *connectable) { AgsNotationEditor *notation_editor; AgsNotationMeta *notation_meta; notation_meta = AGS_NOTATION_META(connectable); if((AGS_NOTATION_META_CONNECTED & (notation_meta->flags)) != 0){ return; } notation_meta->flags |= AGS_NOTATION_META_CONNECTED; notation_editor = gtk_widget_get_ancestor(notation_meta, AGS_TYPE_NOTATION_EDITOR); if(notation_editor != NULL){ g_signal_connect_after(notation_editor, "machine-changed", G_CALLBACK(ags_notation_meta_machine_changed_callback), notation_meta); } } void ags_notation_meta_disconnect(AgsConnectable *connectable) { AgsNotationEditor *notation_editor; AgsNotationMeta *notation_meta; notation_meta = AGS_NOTATION_META(connectable); if((AGS_NOTATION_META_CONNECTED & (notation_meta->flags)) == 0){ return; } notation_meta->flags &= (~AGS_NOTATION_META_CONNECTED); notation_editor = gtk_widget_get_ancestor(notation_meta, AGS_TYPE_NOTATION_EDITOR); if(notation_editor != NULL){ g_object_disconnect(notation_editor, "any_signal::machine-changed", G_CALLBACK(ags_notation_meta_machine_changed_callback), notation_meta, NULL); } } /** * ags_notation_meta_refresh: * @notation_meta: the #AgsNotationMeta * * Refresh @notation_meta. * * Since: 3.1.0 */ void ags_notation_meta_refresh(AgsNotationMeta *notation_meta) { AgsNotationEditor *notation_editor; if(!AGS_IS_NOTATION_META(notation_meta)){ return; } notation_editor = gtk_widget_get_ancestor(notation_meta, AGS_TYPE_NOTATION_EDITOR); if(notation_editor == NULL){ return; } if(notation_editor->selected_machine == NULL){ gtk_label_set_label(notation_meta->machine_type, "(null)"); gtk_label_set_label(notation_meta->machine_name, "(null)"); gtk_label_set_label(notation_meta->audio_channels, "-1"); gtk_label_set_label(notation_meta->output_pads, "-1"); gtk_label_set_label(notation_meta->input_pads, "-1"); gtk_label_set_label(notation_meta->editor_tool, "(null)"); gtk_label_set_label(notation_meta->active_audio_channel, "(null)"); gtk_label_set_label(notation_meta->cursor_x_position, "-1"); gtk_label_set_label(notation_meta->cursor_y_position, "-1"); gtk_label_set_label(notation_meta->current_note, "(null)"); }else{ AgsTimestamp *timestamp; GList *start_notation, *notation; GList *start_note, *note; gchar *str; guint audio_channels; guint output_pads, input_pads; gint active_start, active_end; gint position; guint x0, y0; guint x1, y1; guint i; gtk_label_set_label(notation_meta->machine_type, G_OBJECT_TYPE_NAME(notation_editor->selected_machine)); gtk_label_set_label(notation_meta->machine_name, notation_editor->selected_machine->machine_name); g_object_get(notation_editor->selected_machine->audio, "audio-channels", &audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, NULL); /* audio channels */ str = g_strdup_printf("%u", audio_channels); gtk_label_set_label(notation_meta->audio_channels, str); g_free(str); /* output pads */ str = g_strdup_printf("%u", output_pads); gtk_label_set_label(notation_meta->output_pads, str); g_free(str); /* input pads */ str = g_strdup_printf("%u", input_pads); gtk_label_set_label(notation_meta->input_pads, str); g_free(str); str = NULL; if(notation_editor->notation_toolbar->selected_edit_mode == notation_editor->notation_toolbar->position){ str = i18n("position"); }else if(notation_editor->notation_toolbar->selected_edit_mode == notation_editor->notation_toolbar->edit){ str = i18n("edit"); }else if(notation_editor->notation_toolbar->selected_edit_mode == notation_editor->notation_toolbar->clear){ str = i18n("clear"); }else if(notation_editor->notation_toolbar->selected_edit_mode == notation_editor->notation_toolbar->select){ str = i18n("select"); } if(str != NULL){ gtk_label_set_label(notation_meta->editor_tool, str); }else{ gtk_label_set_label(notation_meta->editor_tool, "(null)"); } /* active audio channels */ str = NULL; active_start = -1; active_end = -1; position = 0; for(; (position = ags_notebook_next_active_tab(notation_editor->notebook, position)) != -1; position++){ if(active_start == -1){ active_start = position; active_end = position; }else{ if(position == active_end + 1){ active_end = position; }else{ if(str == NULL){ if(active_start == active_end){ str = g_strdup_printf("%d", active_start); }else{ str = g_strdup_printf("%d-%d", active_start, active_end); } }else{ if(active_start == active_end){ gchar *tmp; tmp = g_strdup_printf("%s, %d", str, active_start); g_free(str); str = tmp; }else{ gchar *tmp; tmp = g_strdup_printf("%s, %d-%d", str, active_start, active_end); g_free(str); str = tmp; } } active_start = position; active_end = position; } } } if(active_start == -1){ gtk_label_set_label(notation_meta->active_audio_channel, "(null)"); }else{ if(str == NULL){ if(active_start == active_end){ str = g_strdup_printf("[%d]", active_start); }else{ gchar *tmp; tmp = g_strdup_printf("[%d-%d]", active_start, active_end); g_free(str); str = tmp; } }else{ if(active_start == active_end){ gchar *tmp; tmp = g_strdup_printf("[%s, %d]", str, active_start); g_free(str); str = tmp; }else{ gchar *tmp; tmp = g_strdup_printf("[%s, %d-%d]", str, active_start, active_end); g_free(str); str = tmp; } } gtk_label_set_label(notation_meta->active_audio_channel, str); g_free(str); } /* cursor position x */ str = g_strdup_printf("%u", notation_editor->notation_edit->cursor_position_x); gtk_label_set_label(notation_meta->cursor_x_position, str); g_free(str); /* cursor position y */ str = g_strdup_printf("%u", notation_editor->notation_edit->cursor_position_y); gtk_label_set_label(notation_meta->cursor_y_position, str); g_free(str); /* current note */ g_object_get(notation_editor->selected_machine->audio, "notation", &start_notation, NULL); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; x0 = notation_editor->notation_edit->cursor_position_x; y0 = notation_editor->notation_edit->cursor_position_y; x1 = x0 + exp2(6.0 - (double) gtk_combo_box_get_active(notation_editor->notation_toolbar->zoom)); y1 = y0 + 1; str = NULL; for(i = 0; i < audio_channels;){ gchar *current_str; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(x0 / AGS_NOTATION_DEFAULT_OFFSET); position = i; position = ags_notebook_next_active_tab(notation_editor->notebook, position); if(position == -1){ break; } current_str = NULL; ags_notation_meta_refresh_CURRENT_NOTE_TIMESTAMP_NO2: notation = start_notation; i = position; while((notation = ags_notation_find_near_timestamp(notation, i, timestamp)) != NULL){ start_note = ags_notation_find_region(notation->data, x0, y0, x1, y1, FALSE); note = start_note; while(note != NULL){ guint x0, x1; guint y; g_object_get(note->data, "x0", &x0, "x1", &x1, "y", &y, NULL); if(current_str == NULL){ current_str = g_strdup_printf("%u-%u", x0, x1); }else{ gchar *tmp; tmp = g_strdup_printf("%s, %u-%u", current_str, x0, x1); g_free(current_str); current_str = tmp; } note = note->next; } notation = notation->next; } if(timestamp->timer.ags_offset.offset < AGS_NOTATION_DEFAULT_OFFSET * floor(x1 / AGS_NOTATION_DEFAULT_OFFSET)){ timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(x1 / AGS_NOTATION_DEFAULT_OFFSET); position = i; goto ags_notation_meta_refresh_CURRENT_NOTE_TIMESTAMP_NO2; } if(current_str == NULL){ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> (null)", i); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> (null)", str, i); g_free(str); str = tmp; } }else{ if(str == NULL){ str = g_strdup_printf("@audio_channel[%d] -> {%s}", i, current_str); }else{ gchar *tmp; tmp = g_strdup_printf("%s,\n @audio_channel[%d] -> {%s}", str, i, current_str); g_free(str); str = tmp; } g_free(current_str); } i++; } g_list_free_full(start_notation, (GDestroyNotify) g_object_unref); if(str == NULL){ gtk_label_set_label(notation_meta->current_note, "(null)"); }else{ gchar *tmp; tmp = g_strdup_printf("[%s]", str); gtk_label_set_label(notation_meta->current_note, tmp); g_free(str); g_free(tmp); } g_object_unref(timestamp); } } /** * ags_notation_meta_new: * * Create a new #AgsNotationMeta. * * Returns: a new #AgsNotationMeta * * Since: 3.1.0 */ AgsNotationMeta* ags_notation_meta_new() { AgsNotationMeta *notation_meta; notation_meta = (AgsNotationMeta *) g_object_new(AGS_TYPE_NOTATION_META, NULL); return(notation_meta); } gsequencer-3.1.3/ags/X/editor/ags_automation_edit.h0000644000175000017500000001320413607210263017237 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_EDIT_H__ #define __AGS_AUTOMATION_EDIT_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION_EDIT (ags_automation_edit_get_type()) #define AGS_AUTOMATION_EDIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION_EDIT, AgsAutomationEdit)) #define AGS_AUTOMATION_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION_EDIT, AgsAutomationEditClass)) #define AGS_IS_AUTOMATION_EDIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTOMATION_EDIT)) #define AGS_IS_AUTOMATION_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTOMATION_EDIT)) #define AGS_AUTOMATION_EDIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUTOMATION_EDIT, AgsAutomationEditClass)) #define AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT (128) #define AGS_AUTOMATION_EDIT_DEFAULT_WIDTH (512) #define AGS_AUTOMATION_EDIT_DEFAULT_POINT_RADIUS (1.75) #define AGS_AUTOMATION_EDIT_DEFAULT_SCAN_HEIGHT (8) #define AGS_AUTOMATION_EDIT_DEFAULT_SCAN_WIDTH (64) #define AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH (64) #define AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_HEIGHT (8) #define AGS_AUTOMATION_EDIT_DEFAULT_STEP_COUNT (16) #define AGS_AUTOMATION_EDIT_DEFAULT_CURSOR_POSITION_X (0) #define AGS_AUTOMATION_EDIT_DEFAULT_CURSOR_POSITION_Y (0.0) #define AGS_AUTOMATION_EDIT_DEFAULT_SELECTED_ACCELERATION_BORDER (2) #define AGS_AUTOMATION_EDIT_DEFAULT_FADER_WIDTH (3) #define AGS_AUTOMATION_EDIT_CURSOR_WIDTH (5) #define AGS_AUTOMATION_EDIT_CURSOR_HEIGHT (5) #define AGS_AUTOMATION_EDIT_MIN_ZOOM (1.0 / 16.0) #define AGS_AUTOMATION_EDIT_MAX_ZOOM (4.0) #define AGS_AUTOMATION_EDIT_DEFAULT_LOWER (0.0) #define AGS_AUTOMATION_EDIT_DEFAULT_UPPER (1.0) #define AGS_AUTOMATION_EDIT_DEFAULT_VALUE (0.0) #define AGS_AUTOMATION_EDIT_DEFAULT_PADDING (8) typedef struct _AgsAutomationEdit AgsAutomationEdit; typedef struct _AgsAutomationEditClass AgsAutomationEditClass; typedef enum{ AGS_AUTOMATION_EDIT_CONNECTED = 1, AGS_AUTOMATION_EDIT_AUTO_SCROLL = 1 << 1, AGS_AUTOMATION_EDIT_SHOW_RULER = 1 << 2, AGS_AUTOMATION_EDIT_SHOW_VSCROLLBAR = 1 << 3, AGS_AUTOMATION_EDIT_SHOW_HSCROLLBAR = 1 << 4, AGS_AUTOMATION_EDIT_LOGARITHMIC = 1 << 5, }AgsAutomationEditFlags; typedef enum{ AGS_AUTOMATION_EDIT_NO_EDIT_MODE, AGS_AUTOMATION_EDIT_POSITION_CURSOR, AGS_AUTOMATION_EDIT_ADD_ACCELERATION, AGS_AUTOMATION_EDIT_DELETE_ACCELERATION, AGS_AUTOMATION_EDIT_SELECT_ACCELERATION, }AgsAutomationEditMode; typedef enum{ AGS_AUTOMATION_EDIT_BUTTON_1 = 1, }AgsAutomationEditButtonMask; typedef enum{ AGS_AUTOMATION_EDIT_KEY_L_CONTROL = 1, AGS_AUTOMATION_EDIT_KEY_R_CONTROL = 1 << 1, AGS_AUTOMATION_EDIT_KEY_L_SHIFT = 1 << 2, AGS_AUTOMATION_EDIT_KEY_R_SHIFT = 1 << 3, }AgsAutomationEditKeyMask; struct _AgsAutomationEdit { GtkTable table; guint flags; guint mode; guint button_mask; guint key_mask; guint note_offset; guint note_offset_absolute; guint point_radius; guint scan_width; guint scan_height; guint control_width; guint control_height; guint step_count; guint cursor_position_x; gdouble cursor_position_y; guint selected_acceleration_border; guint selection_x0; guint selection_x1; guint selection_y0; guint selection_y1; AgsAcceleration *current_acceleration; AgsRuler *ruler; GType channel_type; gchar *filename; gchar *effect; gchar *control_specifier; gchar *control_name; gdouble lower; gdouble upper; gdouble default_value; GtkDrawingArea *drawing_area; GtkVScrollbar *vscrollbar; GtkHScrollbar *hscrollbar; }; struct _AgsAutomationEditClass { GtkTableClass table; }; GType ags_automation_edit_get_type(void); void ags_automation_edit_reset_vscrollbar(AgsAutomationEdit *automation_edit); void ags_automation_edit_reset_hscrollbar(AgsAutomationEdit *automation_edit); void ags_automation_edit_draw_segment(AgsAutomationEdit *automation_edit, cairo_t *cr); void ags_automation_edit_draw_position(AgsAutomationEdit *automation_edit, cairo_t *cr); void ags_automation_edit_draw_cursor(AgsAutomationEdit *automation_edit, cairo_t *cr); void ags_automation_edit_draw_selection(AgsAutomationEdit *automation_edit, cairo_t *cr); void ags_automation_edit_draw_acceleration(AgsAutomationEdit *automation_edit, AgsAcceleration *acceleration_a, AgsAcceleration *acceleration_b, cairo_t *cr, gdouble opacity); void ags_automation_edit_draw_automation(AgsAutomationEdit *automation_edit, cairo_t *cr); void ags_automation_edit_draw(AgsAutomationEdit *automation_edit, cairo_t *cr); AgsAutomationEdit* ags_automation_edit_new(); G_END_DECLS #endif /*__AGS_AUTOMATION_EDIT_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_wave_cursor_dialog.c0000644000175000017500000003267613607210263021665 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_position_wave_cursor_dialog_class_init(AgsPositionWaveCursorDialogClass *position_wave_cursor_dialog); void ags_position_wave_cursor_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_position_wave_cursor_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_position_wave_cursor_dialog_init(AgsPositionWaveCursorDialog *position_wave_cursor_dialog); void ags_position_wave_cursor_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_position_wave_cursor_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_position_wave_cursor_dialog_finalize(GObject *gobject); void ags_position_wave_cursor_dialog_connect(AgsConnectable *connectable); void ags_position_wave_cursor_dialog_disconnect(AgsConnectable *connectable); void ags_position_wave_cursor_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_position_wave_cursor_dialog_apply(AgsApplicable *applicable); void ags_position_wave_cursor_dialog_reset(AgsApplicable *applicable); gboolean ags_position_wave_cursor_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_position_wave_cursor_dialog * @short_description: position tool * @title: AgsPositionWaveCursorDialog * @section_id: * @include: ags/X/editor/ags_position_wave_cursor_dialog.h * * The #AgsPositionWaveCursorDialog lets you position wave editor cursor. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_position_wave_cursor_dialog_parent_class = NULL; GType ags_position_wave_cursor_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_position_wave_cursor_dialog = 0; static const GTypeInfo ags_position_wave_cursor_dialog_info = { sizeof (AgsPositionWaveCursorDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_position_wave_cursor_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPositionWaveCursorDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_position_wave_cursor_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_position_wave_cursor_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_position_wave_cursor_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_position_wave_cursor_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsPositionWaveCursorDialog", &ags_position_wave_cursor_dialog_info, 0); g_type_add_interface_static(ags_type_position_wave_cursor_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_position_wave_cursor_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_position_wave_cursor_dialog); } return g_define_type_id__volatile; } void ags_position_wave_cursor_dialog_class_init(AgsPositionWaveCursorDialogClass *position_wave_cursor_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_position_wave_cursor_dialog_parent_class = g_type_class_peek_parent(position_wave_cursor_dialog); /* GObjectClass */ gobject = (GObjectClass *) position_wave_cursor_dialog; gobject->set_property = ags_position_wave_cursor_dialog_set_property; gobject->get_property = ags_position_wave_cursor_dialog_get_property; gobject->finalize = ags_position_wave_cursor_dialog_finalize; /* properties */ /** * AgsPositionWaveCursorDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) position_wave_cursor_dialog; widget->delete_event = ags_position_wave_cursor_dialog_delete_event; } void ags_position_wave_cursor_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_position_wave_cursor_dialog_connect; connectable->disconnect = ags_position_wave_cursor_dialog_disconnect; } void ags_position_wave_cursor_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_position_wave_cursor_dialog_set_update; applicable->apply = ags_position_wave_cursor_dialog_apply; applicable->reset = ags_position_wave_cursor_dialog_reset; } void ags_position_wave_cursor_dialog_init(AgsPositionWaveCursorDialog *position_wave_cursor_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; position_wave_cursor_dialog->flags = 0; g_object_set(position_wave_cursor_dialog, "title", i18n("position wave cursor"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(position_wave_cursor_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* set focus */ position_wave_cursor_dialog->set_focus = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("set focus")); gtk_toggle_button_set_active((GtkToggleButton *) position_wave_cursor_dialog->set_focus, TRUE); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(position_wave_cursor_dialog->set_focus), FALSE, FALSE, 0); /* position x - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* position x - label */ label = (GtkLabel *) gtk_label_new(i18n("position x")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* position x - spin button */ position_wave_cursor_dialog->position_x = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_POSITION_WAVE_CURSOR_MAX_BEATS, 1.0); gtk_spin_button_set_value(position_wave_cursor_dialog->position_x, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(position_wave_cursor_dialog->position_x), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) position_wave_cursor_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_position_wave_cursor_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; position_wave_cursor_dialog = AGS_POSITION_WAVE_CURSOR_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) position_wave_cursor_dialog->main_window == main_window){ return; } if(position_wave_cursor_dialog->main_window != NULL){ g_object_unref(position_wave_cursor_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } position_wave_cursor_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_position_wave_cursor_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; position_wave_cursor_dialog = AGS_POSITION_WAVE_CURSOR_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, position_wave_cursor_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_position_wave_cursor_dialog_connect(AgsConnectable *connectable) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; position_wave_cursor_dialog = AGS_POSITION_WAVE_CURSOR_DIALOG(connectable); if((AGS_POSITION_WAVE_CURSOR_DIALOG_CONNECTED & (position_wave_cursor_dialog->flags)) != 0){ return; } position_wave_cursor_dialog->flags |= AGS_POSITION_WAVE_CURSOR_DIALOG_CONNECTED; g_signal_connect(position_wave_cursor_dialog, "response", G_CALLBACK(ags_position_wave_cursor_dialog_response_callback), position_wave_cursor_dialog); } void ags_position_wave_cursor_dialog_disconnect(AgsConnectable *connectable) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; position_wave_cursor_dialog = AGS_POSITION_WAVE_CURSOR_DIALOG(connectable); if((AGS_POSITION_WAVE_CURSOR_DIALOG_CONNECTED & (position_wave_cursor_dialog->flags)) == 0){ return; } position_wave_cursor_dialog->flags &= (~AGS_POSITION_WAVE_CURSOR_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(position_wave_cursor_dialog), "any_signal::response", G_CALLBACK(ags_position_wave_cursor_dialog_response_callback), position_wave_cursor_dialog, NULL); } void ags_position_wave_cursor_dialog_finalize(GObject *gobject) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; position_wave_cursor_dialog = (AgsPositionWaveCursorDialog *) gobject; G_OBJECT_CLASS(ags_position_wave_cursor_dialog_parent_class)->finalize(gobject); } void ags_position_wave_cursor_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_position_wave_cursor_dialog_apply(AgsApplicable *applicable) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; AgsWindow *window; AgsWaveWindow *wave_window; AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; AgsWaveEdit *wave_edit; AgsMachine *machine; GtkWidget *widget; GtkAdjustment *hadjustment; gdouble zoom; guint history; guint x; position_wave_cursor_dialog = AGS_POSITION_WAVE_CURSOR_DIALOG(applicable); window = (AgsWindow *) position_wave_cursor_dialog->main_window; wave_window = window->wave_window; wave_editor = wave_window->wave_editor; machine = wave_editor->selected_machine; if(machine == NULL){ return; } wave_toolbar = wave_editor->wave_toolbar; history = gtk_combo_box_get_active(GTK_COMBO_BOX(wave_toolbar->zoom)); zoom = exp2((double) history - 2.0); wave_edit = wave_editor->focused_wave_edit; if(wave_edit == NULL){ return; } x = gtk_spin_button_get_value_as_int(position_wave_cursor_dialog->position_x); wave_edit->cursor_position_x = 16 * x; wave_edit->cursor_position_y = 0.0; hadjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->hscrollbar)); widget = (GtkWidget *) wave_edit->drawing_area; /* make visible */ if(hadjustment != NULL){ gtk_adjustment_set_value(hadjustment, ((x * 16 * 64 / zoom) * (gtk_adjustment_get_upper(hadjustment) / (AGS_WAVE_EDITOR_MAX_CONTROLS / zoom)))); } if(gtk_toggle_button_get_active((GtkToggleButton *) position_wave_cursor_dialog->set_focus)){ gtk_widget_grab_focus(widget); } } void ags_position_wave_cursor_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_position_wave_cursor_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_position_wave_cursor_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_position_wave_cursor_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsPositionWaveCursorDialog. * * Returns: a new #AgsPositionWaveCursorDialog * * Since: 3.0.0 */ AgsPositionWaveCursorDialog* ags_position_wave_cursor_dialog_new(GtkWidget *main_window) { AgsPositionWaveCursorDialog *position_wave_cursor_dialog; position_wave_cursor_dialog = (AgsPositionWaveCursorDialog *) g_object_new(AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG, "main-window", main_window, NULL); return(position_wave_cursor_dialog); } gsequencer-3.1.3/ags/X/editor/ags_move_note_dialog_callbacks.c0000644000175000017500000000400313605312646021361 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_move_note_dialog_response_callback(GtkWidget *dialog, gint response, AgsMoveNoteDialog *move_note_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(move_note_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) move_note_dialog); } } } } void ags_move_note_dialog_relative_callback(GtkWidget *button, AgsMoveNoteDialog *move_note_dialog) { gtk_spin_button_set_range(move_note_dialog->move_x, -1 * AGS_MOVE_NOTE_DIALOG_MAX_X, AGS_MOVE_NOTE_DIALOG_MAX_X); gtk_spin_button_set_range(move_note_dialog->move_y, -1 * AGS_MOVE_NOTE_DIALOG_MAX_Y, AGS_MOVE_NOTE_DIALOG_MAX_Y); } void ags_move_note_dialog_absolute_callback(GtkWidget *button, AgsMoveNoteDialog *move_note_dialog) { gtk_spin_button_set_range(move_note_dialog->move_x, 0, AGS_MOVE_NOTE_DIALOG_MAX_X); gtk_spin_button_set_range(move_note_dialog->move_y, 0, AGS_MOVE_NOTE_DIALOG_MAX_Y); } gsequencer-3.1.3/ags/X/editor/ags_select_note_dialog_callbacks.c0000644000175000017500000000245413607210263021674 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_select_note_dialog_response_callback(GtkWidget *dialog, gint response, AgsSelectNoteDialog *select_note_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(select_note_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) select_note_dialog); } } } } gsequencer-3.1.3/ags/X/editor/ags_pattern_envelope_callbacks.c0000644000175000017500000005572013607210263021427 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_pattern_envelope_edit_callback(GtkCellRendererToggle *cell_renderer, gchar *path_str, AgsPatternEnvelope *pattern_envelope) { GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; gchar *str; gboolean do_edit; model = gtk_tree_view_get_model(pattern_envelope->tree_view); path = gtk_tree_path_new_from_string(path_str); /* get toggled iter */ gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, &do_edit, -1); /* do something with the value */ do_edit ^= 1; /* set new value */ gtk_list_store_set(GTK_LIST_STORE(model), &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, do_edit, -1); /* clean up */ gtk_tree_path_free(path); /* turn-off others */ if(gtk_tree_model_get_iter_first(model, &iter)){ do{ str = gtk_tree_model_get_string_from_iter(model, &iter); if(strcmp(path_str, str) != 0){ gtk_list_store_set(GTK_LIST_STORE(model), &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, FALSE, -1); } g_free(str); }while(gtk_tree_model_iter_next(model, &iter)); } /* reset control */ ags_pattern_envelope_reset_control(pattern_envelope); } void ags_pattern_envelope_plot_callback(GtkCellRendererToggle *cell_renderer, gchar *path_str, AgsPatternEnvelope *pattern_envelope) { GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; gboolean do_plot; model = gtk_tree_view_get_model(pattern_envelope->tree_view); path = gtk_tree_path_new_from_string(path_str); /* get toggled iter */ gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PLOT, &do_plot, -1); /* do something with the value */ do_plot ^= 1; /* set new value */ gtk_list_store_set(GTK_LIST_STORE(model), &iter, AGS_PATTERN_ENVELOPE_COLUMN_PLOT, do_plot, -1); /* clean up */ gtk_tree_path_free(path); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_audio_channel_start_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; GValue value = {0,}; guint audio_channel_start; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* set property */ audio_channel_start = gtk_spin_button_get_value_as_int((GtkSpinButton *) spin_button); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, audio_channel_start); ags_pattern_envelope_set_preset_property(pattern_envelope, preset, "audio-channel-start", &value); } void ags_pattern_envelope_audio_channel_end_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; guint audio_channel_end; GValue value = {0,}; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* set property */ audio_channel_end = gtk_spin_button_get_value_as_int((GtkSpinButton *) spin_button); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, audio_channel_end); ags_pattern_envelope_set_preset_property(pattern_envelope, preset, "audio-channel-end", &value); } void ags_pattern_envelope_pad_start_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; guint pad_start; GValue value = {0,}; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* set property */ pad_start = gtk_spin_button_get_value_as_int((GtkSpinButton *) spin_button); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, pad_start); ags_pattern_envelope_set_preset_property(pattern_envelope, preset, "pad-start", &value); } void ags_pattern_envelope_pad_end_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; guint pad_end; GValue value = {0,}; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* set property */ pad_end = gtk_spin_button_get_value_as_int((GtkSpinButton *) spin_button); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, pad_end); ags_pattern_envelope_set_preset_property(pattern_envelope, preset, "pad-end", &value); } void ags_pattern_envelope_x_start_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; guint x_start; GValue value = {0,}; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* set property */ x_start = gtk_spin_button_get_value_as_int((GtkSpinButton *) spin_button); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, x_start); ags_pattern_envelope_set_preset_property(pattern_envelope, preset, "x-start", &value); } void ags_pattern_envelope_x_end_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; guint x_end; GValue value = {0,}; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* set property */ x_end = gtk_spin_button_get_value_as_int((GtkSpinButton *) spin_button); g_value_init(&value, G_TYPE_UINT); g_value_set_uint(&value, x_end); ags_pattern_envelope_set_preset_property(pattern_envelope, preset, "x-end", &value); } void ags_pattern_envelope_attack_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble attack_x; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ attack_x = gtk_range_get_value(GTK_RANGE(range)); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "attack", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = attack_x; ags_preset_add_parameter(preset, "attack", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_attack_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble attack_y; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ attack_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "attack", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = attack_y; ags_preset_add_parameter(preset, "attack", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_decay_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble decay_x; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ decay_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "decay", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = decay_x; ags_preset_add_parameter(preset, "decay", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_decay_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble decay_y; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ decay_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "decay", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = decay_y; ags_preset_add_parameter(preset, "decay", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_sustain_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble sustain_x; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ sustain_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "sustain", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = sustain_x; ags_preset_add_parameter(preset, "sustain", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_sustain_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble sustain_y; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ sustain_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "sustain", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = sustain_y; ags_preset_add_parameter(preset, "sustain", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_release_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble release_x; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ release_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "release", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = release_x; ags_preset_add_parameter(preset, "release", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_release_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble release_y; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ release_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "release", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = release_y; ags_preset_add_parameter(preset, "release", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_ratio_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope) { AgsPreset *preset; AgsComplex *val; gdouble ratio; GValue value = {0,}; GError *error; if((AGS_PATTERN_ENVELOPE_NO_UPDATE & (pattern_envelope->flags)) != 0){ return; } /* get preset */ preset = ags_pattern_envelope_get_active_preset(pattern_envelope); if(preset == NULL){ return; } /* get value and update preset */ ratio = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "ratio", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = ratio; ags_preset_add_parameter(preset, "ratio", &value); /* plot */ ags_pattern_envelope_plot(pattern_envelope); } void ags_pattern_envelope_preset_move_up_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; GtkTreeModel *model; GtkTreeIter iter; AgsAudio *audio; AgsPreset *current; GList *start_preset; GList *preset, *prev; gchar *preset_name, *prev_name; guint nth; gboolean do_edit; GRecMutex *audio_mutex; envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get model */ model = gtk_tree_view_get_model(pattern_envelope->tree_view); /* get position */ nth = 0; do_edit = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, &do_edit, -1); if(do_edit){ break; } nth++; }while(gtk_tree_model_iter_next(model, &iter)); } /* move position */ if(!do_edit || nth == 0){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get prev and current preset name */ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, &preset_name, -1); gtk_tree_model_iter_nth_child(model, &iter, NULL, nth - 1); gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, &prev_name, -1); /* find preset */ g_object_get(audio, "preset", &start_preset, NULL); preset = ags_preset_find_name(start_preset, preset_name); prev = ags_preset_find_name(start_preset, prev_name); /* reorder list */ current = preset->data; g_rec_mutex_lock(audio_mutex); audio->preset = g_list_delete_link(audio->preset, preset); audio->preset = g_list_insert_before(audio->preset, prev, current); g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_preset, g_object_unref); /* load preset */ ags_envelope_dialog_load_preset(envelope_dialog); } void ags_pattern_envelope_preset_move_down_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope) { AgsEnvelopeDialog *envelope_dialog; AgsMachine *machine; GtkTreeModel *model; GtkTreeIter iter; AgsAudio *audio; AgsPreset *current; GList *start_preset; GList *preset, *next; gchar *preset_name, *next_name; guint nth; gboolean do_edit; GRecMutex *audio_mutex; envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get model */ model = gtk_tree_view_get_model(pattern_envelope->tree_view); /* get position */ nth = 0; do_edit = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_EDIT, &do_edit, -1); if(do_edit){ break; } nth++; }while(gtk_tree_model_iter_next(model, &iter)); } /* move position */ if(!do_edit){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get next and current preset name */ gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, &preset_name, -1); if(!gtk_tree_model_iter_next(model, &iter)){ return; } gtk_tree_model_get(model, &iter, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, &next_name, -1); /* find preset */ g_object_get(audio, "preset", &start_preset, NULL); preset = ags_preset_find_name(start_preset, preset_name); next = ags_preset_find_name(start_preset, next_name); /* reorder list */ current = next->data; g_rec_mutex_lock(audio_mutex); audio->preset = g_list_delete_link(audio->preset, next); audio->preset = g_list_insert_before(audio->preset, preset, current); g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_preset, g_object_unref); /* load preset */ ags_envelope_dialog_load_preset(envelope_dialog); } void ags_pattern_envelope_preset_add_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope) { GtkDialog *dialog; GtkEntry *entry; if(pattern_envelope->rename != NULL){ return; } pattern_envelope->rename = dialog = (GtkDialog *) gtk_dialog_new_with_buttons(i18n("preset name"), (GtkWindow *) gtk_widget_get_toplevel(GTK_WIDGET(pattern_envelope)), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); entry = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(dialog), (GtkWidget *) entry, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_pattern_envelope_preset_rename_response_callback), (gpointer) pattern_envelope); } void ags_pattern_envelope_preset_remove_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope) { GtkTreeModel *model; GtkTreeIter iter; gint nth; gboolean do_edit; model = gtk_tree_view_get_model(pattern_envelope->tree_view); nth = -1; do_edit = FALSE; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, AGS_PATTERN_ENVELOPE_COLUMN_PLOT, &do_edit, -1); nth++; }while(!do_edit && gtk_tree_model_iter_next(model, &iter)); } /* remove preset */ if(do_edit){ AgsEnvelopeDialog *envelope_dialog; envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); ags_pattern_envelope_remove_preset(pattern_envelope, nth); /* load preset */ ags_envelope_dialog_load_preset(envelope_dialog); } } int ags_pattern_envelope_preset_rename_response_callback(GtkWidget *widget, gint response, AgsPatternEnvelope *pattern_envelope) { if(response == GTK_RESPONSE_ACCEPT){ AgsEnvelopeDialog *envelope_dialog; GList *start_list; gchar *text; envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) pattern_envelope, AGS_TYPE_ENVELOPE_DIALOG); /* get name */ start_list = gtk_container_get_children((GtkContainer *) gtk_dialog_get_content_area(GTK_DIALOG(widget))); text = gtk_editable_get_chars(GTK_EDITABLE(start_list->data), 0, -1); g_list_free(start_list); /* add preset */ ags_pattern_envelope_add_preset(pattern_envelope, text); /* load preset */ ags_envelope_dialog_load_preset(envelope_dialog); } pattern_envelope->rename = NULL; gtk_widget_destroy(widget); return(0); } gsequencer-3.1.3/ags/X/editor/ags_select_note_dialog.h0000644000175000017500000000473713607210263017710 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SELECT_NOTE_DIALOG_H__ #define __AGS_SELECT_NOTE_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SELECT_NOTE_DIALOG (ags_select_note_dialog_get_type()) #define AGS_SELECT_NOTE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SELECT_NOTE_DIALOG, AgsSelectNoteDialog)) #define AGS_SELECT_NOTE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SELECT_NOTE_DIALOG, AgsSelectNoteDialogClass)) #define AGS_IS_SELECT_NOTE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SELECT_NOTE_DIALOG)) #define AGS_IS_SELECT_NOTE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SELECT_NOTE_DIALOG)) #define AGS_SELECT_NOTE_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SELECT_NOTE_DIALOG, AgsSelectNoteDialogClass)) #define AGS_SELECT_NOTE_MAX_BEATS (16 * 1200) #define AGS_SELECT_NOTE_MAX_KEYS (1024) typedef struct _AgsSelectNoteDialog AgsSelectNoteDialog; typedef struct _AgsSelectNoteDialogClass AgsSelectNoteDialogClass; typedef enum{ AGS_SELECT_NOTE_DIALOG_CONNECTED = 1, }AgsSelectNoteDialogFlags; struct _AgsSelectNoteDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *copy_selection; GtkSpinButton *select_x0; GtkSpinButton *select_y0; GtkSpinButton *select_x1; GtkSpinButton *select_y1; }; struct _AgsSelectNoteDialogClass { GtkDialogClass dialog; }; GType ags_select_note_dialog_get_type(void); AgsSelectNoteDialog* ags_select_note_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_SELECT_NOTE_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_toolbar_callbacks.c0000644000175000017500000001713413607210263020536 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_wave_toolbar_zoom_callback_apply(GList *list, gdouble old_zoom_factor, gdouble zoom_factor, gdouble zoom); void ags_wave_toolbar_position_callback(GtkToggleToolButton *toggle_tool_button, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_toolbar, AGS_TYPE_WAVE_EDITOR); if(toggle_tool_button == wave_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_tool_button)){ gtk_toggle_tool_button_set_active(toggle_tool_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_tool_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = wave_toolbar->selected_edit_mode; wave_toolbar->selected_edit_mode = toggle_tool_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_wave_toolbar_select_callback(GtkToggleToolButton *toggle_tool_button, AgsWaveToolbar *wave_toolbar) { if(toggle_tool_button == wave_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_tool_button)){ gtk_toggle_tool_button_set_active(toggle_tool_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_tool_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = wave_toolbar->selected_edit_mode; wave_toolbar->selected_edit_mode = toggle_tool_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_wave_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(wave_toolbar), AGS_TYPE_WAVE_EDITOR)); if(widget == (GtkWidget *) wave_toolbar->copy){ ags_wave_editor_copy(wave_editor); }else{ ags_wave_editor_cut(wave_editor); } } void ags_wave_toolbar_paste_callback(GtkWidget *widget, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(wave_toolbar), AGS_TYPE_WAVE_EDITOR)); ags_wave_editor_paste(wave_editor); } void ags_wave_toolbar_match_line_callback(GtkWidget *widget, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; wave_editor = AGS_WAVE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(wave_toolbar), AGS_TYPE_WAVE_EDITOR)); if(gtk_check_menu_item_get_active((GtkCheckMenuItem *) widget)){ wave_editor->flags |= AGS_WAVE_EDITOR_PASTE_MATCH_LINE; }else{ wave_editor->flags &= (~AGS_WAVE_EDITOR_PASTE_MATCH_LINE); } } void ags_wave_toolbar_tool_popup_select_buffer_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar) { gtk_widget_show_all((GtkWidget *) wave_toolbar->select_buffer); } void ags_wave_toolbar_tool_popup_position_cursor_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar) { gtk_widget_show_all((GtkWidget *) wave_toolbar->position_wave_cursor); } void ags_wave_toolbar_tool_popup_enable_all_lines_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; AgsNotebook *notebook; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_toolbar, AGS_TYPE_WAVE_EDITOR); /* enable */ notebook = wave_editor->notebook; if(notebook != NULL){ GList *start_list, *list; list = start_list = g_list_copy(notebook->tab); while(list != NULL){ gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(list->data)->toggle, TRUE); list = list->next; } g_list_free(start_list); } } void ags_wave_toolbar_tool_popup_disable_all_lines_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; AgsNotebook *notebook; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_toolbar, AGS_TYPE_WAVE_EDITOR); /* disable */ notebook = wave_editor->notebook; if(notebook != NULL){ GList *start_list, *list; list = start_list = g_list_copy(notebook->tab); while(list != NULL){ gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(list->data)->toggle, FALSE); list = list->next; } g_list_free(start_list); } } void ags_wave_toolbar_zoom_callback_apply(GList *list, gdouble old_zoom_factor, gdouble zoom_factor, gdouble zoom) { AgsWaveEdit *wave_edit; while(list != NULL){ wave_edit = list->data; gtk_widget_queue_draw((GtkWidget *) wave_edit); /* reset ruler */ wave_edit->ruler->factor = zoom_factor; wave_edit->ruler->precision = zoom; wave_edit->ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) wave_edit->ruler); list = list->next; } } void ags_wave_toolbar_zoom_callback(GtkComboBox *combo_box, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; GtkWidget *widget; GtkAdjustment *adjustment; GList *list_start; gdouble old_value; gdouble old_zoom_factor; gdouble zoom_factor, zoom; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_toolbar, AGS_TYPE_WAVE_EDITOR); /* zoom */ old_zoom_factor = exp2(6.0 - (double) wave_toolbar->zoom_history); wave_toolbar->zoom_history = gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom); zoom_factor = exp2(6.0 - (double) wave_toolbar->zoom_history); zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); old_value = gtk_range_get_value(wave_editor->hscrollbar); /* edit */ wave_editor->ruler->factor = zoom_factor; wave_editor->ruler->precision = zoom; wave_editor->ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) wave_editor->ruler); list_start = gtk_container_get_children((GtkContainer *) wave_editor->scrolled_wave_edit_box->wave_edit_box); ags_wave_toolbar_zoom_callback_apply(list_start, old_zoom_factor, zoom_factor, zoom); g_list_free(list_start); ags_wave_editor_reset_scrollbar(wave_editor); gtk_range_set_value(wave_editor->hscrollbar, old_value * old_zoom_factor / zoom_factor); } void ags_wave_toolbar_opacity_callback(GtkSpinButton *spin_button, AgsWaveToolbar *wave_toolbar) { AgsWaveEditor *wave_editor; GList *start_list, *list; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_toolbar, AGS_TYPE_WAVE_EDITOR); /* queue draw */ list = start_list = gtk_container_get_children((GtkContainer *) wave_editor->scrolled_wave_edit_box->wave_edit_box); while(list != NULL){ gtk_widget_queue_draw((GtkWidget *) list->data); list = list->next; } g_list_free(start_list); } gsequencer-3.1.3/ags/X/editor/ags_envelope_editor_callbacks.c0000644000175000017500000003014613607210263021233 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_envelope_editor_preset_callback(GtkWidget *combo_box, AgsEnvelopeEditor *envelope_editor) { ags_envelope_editor_reset_control(envelope_editor); } void ags_envelope_editor_preset_add_callback(GtkWidget *button, AgsEnvelopeEditor *envelope_editor) { GtkDialog *dialog; GtkEntry *entry; if(envelope_editor->rename != NULL){ return; } envelope_editor->rename = dialog = (GtkDialog *) gtk_dialog_new_with_buttons(i18n("preset name"), (GtkWindow *) gtk_widget_get_toplevel(GTK_WIDGET(envelope_editor)), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); entry = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(dialog), (GtkWidget *) entry, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_envelope_editor_preset_rename_response_callback), (gpointer) envelope_editor); } void ags_envelope_editor_preset_remove_callback(GtkWidget *button, AgsEnvelopeEditor *envelope_editor) { AgsEnvelopeDialog *envelope_dialog; envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); /* remove preset */ ags_envelope_editor_remove_preset(envelope_editor, gtk_combo_box_get_active(GTK_COMBO_BOX(envelope_editor->preset))); /* load preset */ ags_envelope_dialog_load_preset(envelope_dialog); } void ags_envelope_editor_preset_rename_response_callback(GtkWidget *widget, gint response, AgsEnvelopeEditor *envelope_editor) { if(response == GTK_RESPONSE_ACCEPT){ AgsEnvelopeDialog *envelope_dialog; GList *start_list; gchar *text; envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_editor, AGS_TYPE_ENVELOPE_DIALOG); /* get name */ start_list = gtk_container_get_children((GtkContainer *) gtk_dialog_get_content_area(GTK_DIALOG(widget))); text = gtk_editable_get_chars(GTK_EDITABLE(start_list->data), 0, -1); g_list_free(start_list); /* add preset */ ags_envelope_editor_add_preset(envelope_editor, text); /* load preset */ ags_envelope_dialog_load_preset(envelope_dialog); } envelope_editor->rename = NULL; gtk_widget_destroy(widget); return; } void ags_envelope_editor_attack_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble attack_x; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ attack_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "attack", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = attack_x; ags_preset_add_parameter(preset, "attack", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_attack_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble attack_y; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ attack_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "attack", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = attack_y; ags_preset_add_parameter(preset, "attack", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_decay_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble decay_x; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ decay_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "decay", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = decay_x; ags_preset_add_parameter(preset, "decay", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_decay_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble decay_y; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ decay_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "decay", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = decay_y; ags_preset_add_parameter(preset, "decay", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_sustain_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble sustain_x; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ sustain_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "sustain", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = sustain_x; ags_preset_add_parameter(preset, "sustain", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_sustain_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble sustain_y; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ sustain_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "sustain", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = sustain_y; ags_preset_add_parameter(preset, "sustain", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_release_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble release_x; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ release_x = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "release", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].real = release_x; ags_preset_add_parameter(preset, "release", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_release_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble release_y; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ release_y = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "release", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = release_y; ags_preset_add_parameter(preset, "release", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } void ags_envelope_editor_ratio_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor) { AgsPreset *preset; AgsComplex *val; gdouble ratio; GValue value = {0,}; GError *error; if((AGS_ENVELOPE_EDITOR_NO_UPDATE & (envelope_editor->flags)) != 0){ return; } /* get preset */ preset = ags_envelope_editor_get_active_preset(envelope_editor); if(preset == NULL){ return; } /* get value and update preset */ ratio = gtk_range_get_value((GtkRange *) range); g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter(preset, "ratio", &value, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); return; } val = (AgsComplex *) g_value_get_boxed(&value); /* add parameter */ val[0].imag = ratio; ags_preset_add_parameter(preset, "ratio", &value); /* plot */ ags_envelope_editor_plot(envelope_editor); } gsequencer-3.1.3/ags/X/editor/ags_envelope_editor.h0000644000175000017500000000624613607210263017245 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_EDITOR_H__ #define __AGS_ENVELOPE_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_EDITOR (ags_envelope_editor_get_type()) #define AGS_ENVELOPE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_EDITOR, AgsEnvelopeEditor)) #define AGS_ENVELOPE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_EDITOR, AgsEnvelopeEditorClass)) #define AGS_IS_ENVELOPE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ENVELOPE_EDITOR)) #define AGS_IS_ENVELOPE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ENVELOPE_EDITOR)) #define AGS_ENVELOPE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ENVELOPE_EDITOR, AgsEnvelopeEditorClass)) #define AGS_ENVELOPE_EDITOR_DEFAULT_VERSION "0.8.2" #define AGS_ENVELOPE_EDITOR_DEFAULT_BUILD_ID "CEST 24-05-2017 10:16" typedef struct _AgsEnvelopeEditor AgsEnvelopeEditor; typedef struct _AgsEnvelopeEditorClass AgsEnvelopeEditorClass; typedef enum{ AGS_ENVELOPE_EDITOR_CONNECTED = 1, AGS_ENVELOPE_EDITOR_NO_UPDATE = 1 << 1, }AgsEnvelopeEditorFlags; struct _AgsEnvelopeEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; GtkCheckButton *enabled; GtkDialog *rename; GtkComboBoxText *preset; GtkButton *add; GtkButton *remove; AgsCartesian *cartesian; GtkHScale *attack_x; GtkHScale *attack_y; GtkHScale *decay_x; GtkHScale *decay_y; GtkHScale *sustain_x; GtkHScale *sustain_y; GtkHScale *release_x; GtkHScale *release_y; GtkHScale *ratio; }; struct _AgsEnvelopeEditorClass { GtkVBoxClass vbox; }; GType ags_envelope_editor_get_type(void); AgsPreset* ags_envelope_editor_get_active_preset(AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_load_preset(AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_add_preset(AgsEnvelopeEditor *envelope_editor, gchar *preset_name); void ags_envelope_editor_remove_preset(AgsEnvelopeEditor *envelope_editor, guint nth); void ags_envelope_editor_reset_control(AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_plot(AgsEnvelopeEditor *envelope_editor); AgsEnvelopeEditor* ags_envelope_editor_new(); G_END_DECLS #endif /*__AGS_ENVELOPE_EDITOR_H__*/ gsequencer-3.1.3/ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c0000644000175000017500000001601413605312646023043 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_ramp_acceleration_dialog_response_callback(GtkWidget *dialog, gint response, AgsRampAccelerationDialog *ramp_acceleration_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(ramp_acceleration_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) ramp_acceleration_dialog); } } } } void ags_ramp_acceleration_dialog_port_callback(GtkComboBox *combo_box, AgsRampAccelerationDialog *ramp_acceleration_dialog) { AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsChannel *start_channel; AgsChannel *channel, *next_channel; AgsPluginPort *plugin_port; GList *start_port, *port; gchar *specifier; window = AGS_WINDOW(ramp_acceleration_dialog->main_window); automation_editor = window->automation_window->automation_editor; machine = automation_editor->selected_machine; if(machine == NULL){ return; } /* specifier */ specifier = gtk_combo_box_text_get_active_text(ramp_acceleration_dialog->port); start_port = NULL; switch(gtk_notebook_get_current_page(automation_editor->notebook)){ case 0: { port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, specifier, TRUE); start_port = port; port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, specifier, FALSE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } } break; case 1: { g_object_get(machine->audio, "output", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; start_port = NULL; while(channel != NULL){ port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, specifier, TRUE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, specifier, FALSE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } } break; case 2: { g_object_get(machine->audio, "input", &start_channel, NULL); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; start_port = NULL; while(channel != NULL){ port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, specifier, TRUE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, specifier, FALSE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } } break; } /* reset range */ plugin_port = NULL; if(start_port != NULL){ g_object_get(start_port->data, "plugin-port", &plugin_port, NULL); g_list_free_full(start_port, g_object_unref); } if(plugin_port != NULL){ gint steps; gdouble lower, upper; GValue *upper_value, *lower_value; /* get some fields */ g_object_get(plugin_port, "upper-value", &upper_value, "lower-value", &lower_value, NULL); upper = g_value_get_float(upper_value); lower = g_value_get_float(lower_value); steps = -1; if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED)){ steps = 1; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER)){ steps = upper - lower; } if(steps == -1){ steps = AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT; } gtk_spin_button_set_range(ramp_acceleration_dialog->ramp_y0, lower, upper); gtk_spin_button_set_increments(ramp_acceleration_dialog->ramp_y0, (upper - lower) / steps, (upper - lower) / steps); gtk_spin_button_set_range(ramp_acceleration_dialog->ramp_y1, lower, upper); gtk_spin_button_set_increments(ramp_acceleration_dialog->ramp_y1, (upper - lower) / steps, (upper - lower) / steps); gtk_spin_button_set_range(ramp_acceleration_dialog->ramp_step_count, 0.0, steps); g_object_unref(plugin_port); }else{ gtk_spin_button_set_range(ramp_acceleration_dialog->ramp_y0, 0.0, 0.0); gtk_spin_button_set_increments(ramp_acceleration_dialog->ramp_y0, 1.0, 1.0); gtk_spin_button_set_range(ramp_acceleration_dialog->ramp_y1, 0.0, 0.0); gtk_spin_button_set_increments(ramp_acceleration_dialog->ramp_y1, 1.0, 1.0); gtk_spin_button_set_range(ramp_acceleration_dialog->ramp_step_count, 0.0, 0.0); } } void ags_ramp_acceleration_dialog_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsRampAccelerationDialog *ramp_acceleration_dialog) { ags_applicable_reset(AGS_APPLICABLE(ramp_acceleration_dialog)); } gsequencer-3.1.3/ags/X/editor/ags_scrolled_automation_edit_box.c0000644000175000017500000002625513607210263022003 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_scrolled_automation_edit_box_class_init(AgsScrolledAutomationEditBoxClass *scrolled_automation_edit_box); void ags_scrolled_automation_edit_box_init(AgsScrolledAutomationEditBox *scrolled_automation_edit_box); void ags_scrolled_automation_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_scrolled_automation_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_scrolled_automation_edit_box_finalize(GObject *gobject); void ags_scrolled_automation_edit_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_scrolled_automation_edit_box_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width); void ags_scrolled_automation_edit_box_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height); /** * SECTION:ags_scrolled_automation_edit_box * @short_description: scrolled automation_edit box widget * @title: AgsScrolledAutomationEditBox * @section_id: * @include: ags/widget/ags_scrolled_automation_edit_box.h * * The #AgsScrolledAutomationEditBox lets you to have a scrolled automation_edit box widget. */ enum{ PROP_0, PROP_MARGIN_TOP, PROP_MARGIN_BOTTOM, PROP_MARGIN_LEFT, PROP_MARGIN_RIGHT, }; static gpointer ags_scrolled_automation_edit_box_parent_class = NULL; GType ags_scrolled_automation_edit_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scrolled_automation_edit_box = 0; static const GTypeInfo ags_scrolled_automation_edit_box_info = { sizeof (AgsScrolledAutomationEditBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scrolled_automation_edit_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsScrolledAutomationEditBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scrolled_automation_edit_box_init, }; ags_type_scrolled_automation_edit_box = g_type_register_static(GTK_TYPE_BIN, "AgsScrolledAutomationEditBox", &ags_scrolled_automation_edit_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scrolled_automation_edit_box); } return g_define_type_id__volatile; } void ags_scrolled_automation_edit_box_class_init(AgsScrolledAutomationEditBoxClass *scrolled_automation_edit_box) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_scrolled_automation_edit_box_parent_class = g_type_class_peek_parent(scrolled_automation_edit_box); /* GObjectClass */ gobject = (GObjectClass *) scrolled_automation_edit_box; gobject->set_property = ags_scrolled_automation_edit_box_set_property; gobject->get_property = ags_scrolled_automation_edit_box_get_property; gobject->finalize = ags_scrolled_automation_edit_box_finalize; /* properties */ /** * AgsScrolledAutomationEditBox:margin-top: * * The margin top. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-top", "margin top", "The margin top", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_TOP, param_spec); /** * AgsScrolledAutomationEditBox:margin-bottom: * * The margin bottom. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-bottom", "margin bottom", "The margin bottom", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_BOTTOM, param_spec); /** * AgsScrolledAutomationEditBox:margin-left: * * The margin left. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-left", "margin left", "The margin left", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_LEFT, param_spec); /** * AgsScrolledAutomationEditBox:margin-right: * * The margin right. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-right", "margin right", "The margin right", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_RIGHT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) scrolled_automation_edit_box; // widget->size_allocate = ags_scrolled_automation_edit_box_size_allocate; // widget->get_preferred_width = ags_scrolled_automation_edit_box_get_preferred_width; // widget->get_preferred_height = ags_scrolled_automation_edit_box_get_preferred_height; } void ags_scrolled_automation_edit_box_init(AgsScrolledAutomationEditBox *scrolled_automation_edit_box) { scrolled_automation_edit_box->margin_top = 0; scrolled_automation_edit_box->margin_bottom = 0; scrolled_automation_edit_box->margin_left = 0; scrolled_automation_edit_box->margin_right = 0; /* viewport */ scrolled_automation_edit_box->viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(scrolled_automation_edit_box->viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_widget_set_vexpand(scrolled_automation_edit_box->viewport, TRUE); gtk_widget_set_hexpand(scrolled_automation_edit_box->viewport, TRUE); gtk_container_add((GtkContainer *) scrolled_automation_edit_box, (GtkWidget *) scrolled_automation_edit_box->viewport); /* automation_edit box */ scrolled_automation_edit_box->automation_edit_box = NULL; #if 0 scrolled_automation_edit_box->automation_edit_box = ags_vautomation_edit_box_new(); gtk_container_add(scrolled_automation_edit_box->viewport, scrolled_automation_edit_box->automation_edit_box); #endif } void ags_scrolled_automation_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsScrolledAutomationEditBox *scrolled_automation_edit_box; scrolled_automation_edit_box = AGS_SCROLLED_AUTOMATION_EDIT_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { scrolled_automation_edit_box->margin_top = g_value_get_uint(value); } break; case PROP_MARGIN_BOTTOM: { scrolled_automation_edit_box->margin_bottom = g_value_get_uint(value); } break; case PROP_MARGIN_LEFT: { scrolled_automation_edit_box->margin_left = g_value_get_uint(value); } break; case PROP_MARGIN_RIGHT: { scrolled_automation_edit_box->margin_right = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_automation_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsScrolledAutomationEditBox *scrolled_automation_edit_box; scrolled_automation_edit_box = AGS_SCROLLED_AUTOMATION_EDIT_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { g_value_set_uint(value, scrolled_automation_edit_box->margin_top); } break; case PROP_MARGIN_BOTTOM: { g_value_set_uint(value, scrolled_automation_edit_box->margin_bottom); } break; case PROP_MARGIN_LEFT: { g_value_set_uint(value, scrolled_automation_edit_box->margin_left); } break; case PROP_MARGIN_RIGHT: { g_value_set_uint(value, scrolled_automation_edit_box->margin_right); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_automation_edit_box_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_scrolled_automation_edit_box_parent_class)->finalize(gobject); } void ags_scrolled_automation_edit_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsScrolledAutomationEditBox *scrolled_automation_edit_box; AgsApplicationContext *application_context; GtkAllocation child_allocation; GtkRequisition child_requisition; gdouble gui_scale_factor; scrolled_automation_edit_box = AGS_SCROLLED_AUTOMATION_EDIT_BOX(widget); application_context = ags_application_context_get_instance(); GTK_WIDGET_CLASS(ags_scrolled_automation_edit_box_parent_class)->size_allocate(widget, allocation); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); allocation->height = (gint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT); /* viewport allocation */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_automation_edit_box->viewport, &child_requisition); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = allocation->width; child_allocation.height = allocation->height; gtk_widget_size_allocate((GtkWidget *) scrolled_automation_edit_box->viewport, &child_allocation); /* box */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_automation_edit_box->automation_edit_box, &child_requisition); child_allocation.x = 0; child_allocation.y = 0; child_allocation.width = allocation->width; child_allocation.height = child_requisition.height; gtk_widget_size_allocate((GtkWidget *) scrolled_automation_edit_box->automation_edit_box, &child_allocation); } void ags_scrolled_automation_edit_box_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width = natural_width = NULL; } void ags_scrolled_automation_edit_box_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height = natural_height = NULL; } /** * ags_scrolled_automation_edit_box_new: * * Create a new #AgsScrolledAutomationEditBox. * * Returns: a new #AgsScrolledAutomationEditBox * * Since: 3.0.0 */ AgsScrolledAutomationEditBox* ags_scrolled_automation_edit_box_new() { AgsScrolledAutomationEditBox *scrolled_automation_edit_box; scrolled_automation_edit_box = (AgsScrolledAutomationEditBox *) g_object_new(AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX, NULL); return(scrolled_automation_edit_box); } gsequencer-3.1.3/ags/X/editor/ags_ramp_acceleration_dialog_callbacks.h0000644000175000017500000000326613607210263023047 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RAMP_ACCELERATION_DIALOG_CALLBACKS_H__ #define __AGS_RAMP_ACCELERATION_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_ramp_acceleration_dialog_response_callback(GtkWidget *dialog, gint response, AgsRampAccelerationDialog *ramp_acceleration_dialog); void ags_ramp_acceleration_dialog_port_callback(GtkComboBox *combo_box, AgsRampAccelerationDialog *ramp_acceleration_dialog); void ags_ramp_acceleration_dialog_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsRampAccelerationDialog *ramp_acceleration_dialog); G_END_DECLS #endif /*__AGS_RAMP_ACCELERATION_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_wave_cursor_dialog.h0000644000175000017500000000514113607210263021655 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_POSITION_WAVE_CURSOR_DIALOG_H__ #define __AGS_POSITION_WAVE_CURSOR_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG (ags_position_wave_cursor_dialog_get_type()) #define AGS_POSITION_WAVE_CURSOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG, AgsPositionWaveCursorDialog)) #define AGS_POSITION_WAVE_CURSOR_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG, AgsPositionWaveCursorDialogClass)) #define AGS_IS_POSITION_WAVE_CURSOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG)) #define AGS_IS_POSITION_WAVE_CURSOR_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG)) #define AGS_POSITION_WAVE_CURSOR_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG, AgsPositionWaveCursorDialogClass)) #define AGS_POSITION_WAVE_CURSOR_MAX_BEATS (16 * 1200) typedef struct _AgsPositionWaveCursorDialog AgsPositionWaveCursorDialog; typedef struct _AgsPositionWaveCursorDialogClass AgsPositionWaveCursorDialogClass; typedef enum{ AGS_POSITION_WAVE_CURSOR_DIALOG_CONNECTED = 1, }AgsPositionWaveCursorDialogFlags; struct _AgsPositionWaveCursorDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *set_focus; GtkSpinButton *position_x; }; struct _AgsPositionWaveCursorDialogClass { GtkDialogClass dialog; }; GType ags_position_wave_cursor_dialog_get_type(void); AgsPositionWaveCursorDialog* ags_position_wave_cursor_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_POSITION_WAVE_CURSOR_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_sheet_edit_callbacks.h0000644000175000017500000000347713607210263020201 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_EDIT_CALLBACKS_H__ #define __AGS_SHEET_EDIT_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS gboolean ags_sheet_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsSheetEdit *sheet_edit); gboolean ags_sheet_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsSheetEdit *sheet_edit); gboolean ags_sheet_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsSheetEdit *sheet_edit); gboolean ags_sheet_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsSheetEdit *sheet_edit); gboolean ags_sheet_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsSheetEdit *sheet_edit); gboolean ags_sheet_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsSheetEdit *sheet_edit); G_END_DECLS #endif /*__AGS_SHEET_EDIT_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_toolbar.c0000644000175000017500000003442213607210263016536 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_wave_toolbar_class_init(AgsWaveToolbarClass *wave_toolbar); void ags_wave_toolbar_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wave_toolbar_init(AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_connect(AgsConnectable *connectable); void ags_wave_toolbar_disconnect(AgsConnectable *connectable); /** * SECTION:ags_wave_toolbar * @short_description: wave toolbar * @title: AgsWaveToolbar * @section_id: * @include: ags/X/editor/ags_wave_toolbar.h * * The #AgsWaveToolbar lets you choose edit tool. */ GType ags_wave_toolbar_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_toolbar = 0; static const GTypeInfo ags_wave_toolbar_info = { sizeof (AgsWaveToolbarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_toolbar_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveToolbar), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_toolbar_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wave_toolbar_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wave_toolbar = g_type_register_static(GTK_TYPE_TOOLBAR, "AgsWaveToolbar", &ags_wave_toolbar_info, 0); g_type_add_interface_static(ags_type_wave_toolbar, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_toolbar); } return g_define_type_id__volatile; } void ags_wave_toolbar_class_init(AgsWaveToolbarClass *wave_toolbar) { } void ags_wave_toolbar_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_wave_toolbar_connect; connectable->disconnect = ags_wave_toolbar_disconnect; } void ags_wave_toolbar_init(AgsWaveToolbar *wave_toolbar) { GtkToolItem *tool_item; GtkMenuToolButton *menu_tool_button; GtkMenu *menu; GtkMenuItem *item; GtkLabel *label; GtkCellRenderer *cell_renderer; GtkHBox *hbox; wave_toolbar->flags = 0; wave_toolbar->selected_edit_mode = NULL; /* position */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); wave_toolbar->position = g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Position"), "stock-id", GTK_STOCK_JUMP_TO, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) wave_toolbar->position); /* select */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); wave_toolbar->select = g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Select"), "stock-id", GTK_STOCK_SELECT_ALL, NULL); gtk_container_add((GtkToolbar *) wave_toolbar, (GtkWidget *) wave_toolbar->select); /* copy */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); wave_toolbar->copy = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_COPY, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) wave_toolbar->copy); /* cut */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); wave_toolbar->cut = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_CUT, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) wave_toolbar->cut); /* paste */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); wave_toolbar->paste_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "stock-id", GTK_STOCK_PASTE, NULL); menu = (GtkMenu *) gtk_menu_new(); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", "match line", "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); gtk_menu_tool_button_set_menu(wave_toolbar->paste_tool, (GtkWidget *) menu); gtk_widget_show_all((GtkWidget *) menu); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) wave_toolbar->paste_tool); /* menu tool */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); wave_toolbar->menu_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "label", i18n("Tool"), "stock-id", GTK_STOCK_EXECUTE, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) wave_toolbar->menu_tool); /* menu tool - tool popup */ wave_toolbar->tool_popup = ags_wave_toolbar_tool_popup_new(wave_toolbar); gtk_menu_tool_button_set_menu(wave_toolbar->menu_tool, (GtkWidget *) wave_toolbar->tool_popup); /* menu tool - dialogs */ wave_toolbar->select_buffer = (GtkDialog *) ags_select_buffer_dialog_new(NULL); wave_toolbar->position_wave_cursor = (GtkDialog *) ags_position_wave_cursor_dialog_new(NULL); /* zoom */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); wave_toolbar->zoom_history = 2; label = (GtkLabel *) gtk_label_new(i18n("Zoom")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); wave_toolbar->zoom = ags_zoom_combo_box_new(); gtk_combo_box_set_active(GTK_COMBO_BOX(wave_toolbar->zoom), 2); gtk_box_pack_start(hbox, (GtkWidget *) wave_toolbar->zoom, FALSE, FALSE, 0); /* opacity */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) wave_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("Opacity")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); wave_toolbar->opacity = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.001); gtk_spin_button_set_value(wave_toolbar->opacity, 0.5); gtk_box_pack_start(hbox, (GtkWidget *) wave_toolbar->opacity, FALSE, FALSE, 0); } void ags_wave_toolbar_connect(AgsConnectable *connectable) { AgsWindow *window; AgsWaveWindow *wave_window; AgsWaveToolbar *wave_toolbar; GList *list; wave_toolbar = AGS_WAVE_TOOLBAR(connectable); if((AGS_WAVE_TOOLBAR_CONNECTED & (wave_toolbar->flags)) != 0){ return; } wave_toolbar->flags |= AGS_WAVE_TOOLBAR_CONNECTED; wave_window = (AgsWaveWindow *) gtk_widget_get_ancestor((GtkWidget *) wave_toolbar, AGS_TYPE_WAVE_WINDOW); window = (AgsWindow *) wave_window->parent_window; g_object_set(wave_toolbar->select_buffer, "main-window", window, NULL); g_object_set(wave_toolbar->position_wave_cursor, "main-window", window, NULL); /* tool */ g_signal_connect_after((GObject *) wave_toolbar->position, "toggled", G_CALLBACK(ags_wave_toolbar_position_callback), (gpointer) wave_toolbar); g_signal_connect_after((GObject *) wave_toolbar->select, "toggled", G_CALLBACK(ags_wave_toolbar_select_callback), (gpointer) wave_toolbar); /* edit */ g_signal_connect((GObject *) wave_toolbar->copy, "clicked", G_CALLBACK(ags_wave_toolbar_copy_or_cut_callback), (gpointer) wave_toolbar); g_signal_connect((GObject *) wave_toolbar->cut, "clicked", G_CALLBACK(ags_wave_toolbar_copy_or_cut_callback), (gpointer) wave_toolbar); g_signal_connect((GObject *) wave_toolbar->paste_tool, "clicked", G_CALLBACK(ags_wave_toolbar_paste_callback), (gpointer) wave_toolbar); list = gtk_container_get_children((GtkContainer *) gtk_menu_tool_button_get_menu(wave_toolbar->paste_tool)); g_signal_connect_after(list->data, "activate", G_CALLBACK(ags_wave_toolbar_match_line_callback), wave_toolbar); g_list_free(list); /* additional tools */ ags_connectable_connect(AGS_CONNECTABLE(wave_toolbar->select_buffer)); ags_connectable_connect(AGS_CONNECTABLE(wave_toolbar->position_wave_cursor)); /* zoom */ g_signal_connect_after((GObject *) wave_toolbar->zoom, "changed", G_CALLBACK(ags_wave_toolbar_zoom_callback), (gpointer) wave_toolbar); /* opacity */ g_signal_connect_after((GObject *) wave_toolbar->opacity, "value-changed", G_CALLBACK(ags_wave_toolbar_opacity_callback), (gpointer) wave_toolbar); } void ags_wave_toolbar_disconnect(AgsConnectable *connectable) { AgsWaveToolbar *wave_toolbar; GList *list; wave_toolbar = AGS_WAVE_TOOLBAR(connectable); if((AGS_WAVE_TOOLBAR_CONNECTED & (wave_toolbar->flags)) == 0){ return; } wave_toolbar->flags &= (~AGS_WAVE_TOOLBAR_CONNECTED); /* tool */ g_object_disconnect(G_OBJECT(wave_toolbar->position), "any_signal::toggled", G_CALLBACK(ags_wave_toolbar_position_callback), wave_toolbar, NULL); g_object_disconnect(G_OBJECT(wave_toolbar->select), "any_signal::toggled", G_CALLBACK(ags_wave_toolbar_select_callback), wave_toolbar, NULL); /* edit */ g_object_disconnect(G_OBJECT(wave_toolbar->copy), "any_signal::clicked", G_CALLBACK(ags_wave_toolbar_copy_or_cut_callback), wave_toolbar, NULL); g_object_disconnect(G_OBJECT(wave_toolbar->cut), "any_signal::clicked", G_CALLBACK(ags_wave_toolbar_copy_or_cut_callback), wave_toolbar, NULL); g_object_disconnect(G_OBJECT(wave_toolbar->paste_tool), "any_signal::clicked", G_CALLBACK(ags_wave_toolbar_paste_callback), wave_toolbar, NULL); list = gtk_container_get_children((GtkContainer *) gtk_menu_tool_button_get_menu(wave_toolbar->paste_tool)); g_object_disconnect(G_OBJECT(list->data), "any_signal::activate", G_CALLBACK(ags_wave_toolbar_match_line_callback), wave_toolbar, NULL); g_list_free(list); /* additional tools */ ags_connectable_disconnect(AGS_CONNECTABLE(wave_toolbar->select_buffer)); ags_connectable_disconnect(AGS_CONNECTABLE(wave_toolbar->position_wave_cursor)); /* zoom */ g_object_disconnect(G_OBJECT(wave_toolbar->zoom), "any_signal::changed", G_CALLBACK(ags_wave_toolbar_zoom_callback), wave_toolbar, NULL); /* opacity */ g_object_disconnect(G_OBJECT(wave_toolbar->opacity), "any_signal::value-changed", G_CALLBACK(ags_wave_toolbar_opacity_callback), wave_toolbar, NULL); } /** * ags_wave_toolbar_tool_popup_new: * @wave_toolbar: the #AgsWaveToolbar * * Create a new #GtkMenu suitable for menu tool button. * * Returns: a new #GtkMenu * * Since: 3.0.0 */ GtkMenu* ags_wave_toolbar_tool_popup_new(AgsWaveToolbar *wave_toolbar) { GtkMenu *tool_popup; GtkMenuItem *item; GList *list, *list_start; tool_popup = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("select audio data")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); gtk_menu_shell_append((GtkMenuShell*) tool_popup, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("enable all lines")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("disable all lines")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); /* connect */ list_start = list = gtk_container_get_children((GtkContainer *) tool_popup); g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_wave_toolbar_tool_popup_select_buffer_callback), (gpointer) wave_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_wave_toolbar_tool_popup_position_cursor_callback), (gpointer) wave_toolbar); list = list->next->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_wave_toolbar_tool_popup_enable_all_lines_callback), (gpointer) wave_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_wave_toolbar_tool_popup_disable_all_lines_callback), (gpointer) wave_toolbar); g_list_free(list_start); /* show */ gtk_widget_show_all((GtkWidget *) tool_popup); return(tool_popup); } /** * ags_wave_toolbar_new: * * Create a new #AgsWaveToolbar. * * Returns: a new #AgsWaveToolbar * * Since: 3.0.0 */ AgsWaveToolbar* ags_wave_toolbar_new() { AgsWaveToolbar *wave_toolbar; wave_toolbar = (AgsWaveToolbar *) g_object_new(AGS_TYPE_WAVE_TOOLBAR, NULL); return(wave_toolbar); } gsequencer-3.1.3/ags/X/editor/ags_position_automation_cursor_dialog.c0000644000175000017500000003467013607210263023077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_position_automation_cursor_dialog_class_init(AgsPositionAutomationCursorDialogClass *position_automation_cursor_dialog); void ags_position_automation_cursor_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_position_automation_cursor_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_position_automation_cursor_dialog_init(AgsPositionAutomationCursorDialog *position_automation_cursor_dialog); void ags_position_automation_cursor_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_position_automation_cursor_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_position_automation_cursor_dialog_finalize(GObject *gobject); void ags_position_automation_cursor_dialog_connect(AgsConnectable *connectable); void ags_position_automation_cursor_dialog_disconnect(AgsConnectable *connectable); void ags_position_automation_cursor_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_position_automation_cursor_dialog_apply(AgsApplicable *applicable); void ags_position_automation_cursor_dialog_reset(AgsApplicable *applicable); gboolean ags_position_automation_cursor_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_position_automation_cursor_dialog * @short_description: position tool * @title: AgsPositionAutomationCursorDialog * @section_id: * @include: ags/X/editor/ags_position_automation_cursor_dialog.h * * The #AgsPositionAutomationCursorDialog lets you position automation editor cursor. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_position_automation_cursor_dialog_parent_class = NULL; GType ags_position_automation_cursor_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_position_automation_cursor_dialog = 0; static const GTypeInfo ags_position_automation_cursor_dialog_info = { sizeof (AgsPositionAutomationCursorDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_position_automation_cursor_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPositionAutomationCursorDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_position_automation_cursor_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_position_automation_cursor_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_position_automation_cursor_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_position_automation_cursor_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsPositionAutomationCursorDialog", &ags_position_automation_cursor_dialog_info, 0); g_type_add_interface_static(ags_type_position_automation_cursor_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_position_automation_cursor_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_position_automation_cursor_dialog); } return g_define_type_id__volatile; } void ags_position_automation_cursor_dialog_class_init(AgsPositionAutomationCursorDialogClass *position_automation_cursor_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_position_automation_cursor_dialog_parent_class = g_type_class_peek_parent(position_automation_cursor_dialog); /* GObjectClass */ gobject = (GObjectClass *) position_automation_cursor_dialog; gobject->set_property = ags_position_automation_cursor_dialog_set_property; gobject->get_property = ags_position_automation_cursor_dialog_get_property; gobject->finalize = ags_position_automation_cursor_dialog_finalize; /* properties */ /** * AgsPositionAutomationCursorDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) position_automation_cursor_dialog; widget->delete_event = ags_position_automation_cursor_dialog_delete_event; } void ags_position_automation_cursor_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_position_automation_cursor_dialog_connect; connectable->disconnect = ags_position_automation_cursor_dialog_disconnect; } void ags_position_automation_cursor_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_position_automation_cursor_dialog_set_update; applicable->apply = ags_position_automation_cursor_dialog_apply; applicable->reset = ags_position_automation_cursor_dialog_reset; } void ags_position_automation_cursor_dialog_init(AgsPositionAutomationCursorDialog *position_automation_cursor_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; position_automation_cursor_dialog->flags = 0; g_object_set(position_automation_cursor_dialog, "title", i18n("position automation cursor"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(position_automation_cursor_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* set focus */ position_automation_cursor_dialog->set_focus = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("set focus")); gtk_toggle_button_set_active((GtkToggleButton *) position_automation_cursor_dialog->set_focus, TRUE); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(position_automation_cursor_dialog->set_focus), FALSE, FALSE, 0); /* position x - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* position x - label */ label = (GtkLabel *) gtk_label_new(i18n("position x")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* position x - spin button */ position_automation_cursor_dialog->position_x = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_POSITION_AUTOMATION_CURSOR_MAX_BEATS, 1.0); gtk_spin_button_set_value(position_automation_cursor_dialog->position_x, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(position_automation_cursor_dialog->position_x), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) position_automation_cursor_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_position_automation_cursor_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; position_automation_cursor_dialog = AGS_POSITION_AUTOMATION_CURSOR_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) position_automation_cursor_dialog->main_window == main_window){ return; } if(position_automation_cursor_dialog->main_window != NULL){ g_object_unref(position_automation_cursor_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } position_automation_cursor_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_position_automation_cursor_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; position_automation_cursor_dialog = AGS_POSITION_AUTOMATION_CURSOR_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, position_automation_cursor_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_position_automation_cursor_dialog_connect(AgsConnectable *connectable) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; position_automation_cursor_dialog = AGS_POSITION_AUTOMATION_CURSOR_DIALOG(connectable); if((AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CONNECTED & (position_automation_cursor_dialog->flags)) != 0){ return; } position_automation_cursor_dialog->flags |= AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CONNECTED; g_signal_connect(position_automation_cursor_dialog, "response", G_CALLBACK(ags_position_automation_cursor_dialog_response_callback), position_automation_cursor_dialog); } void ags_position_automation_cursor_dialog_disconnect(AgsConnectable *connectable) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; position_automation_cursor_dialog = AGS_POSITION_AUTOMATION_CURSOR_DIALOG(connectable); if((AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CONNECTED & (position_automation_cursor_dialog->flags)) == 0){ return; } position_automation_cursor_dialog->flags &= (~AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(position_automation_cursor_dialog), "any_signal::response", G_CALLBACK(ags_position_automation_cursor_dialog_response_callback), position_automation_cursor_dialog, NULL); } void ags_position_automation_cursor_dialog_finalize(GObject *gobject) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; position_automation_cursor_dialog = (AgsPositionAutomationCursorDialog *) gobject; G_OBJECT_CLASS(ags_position_automation_cursor_dialog_parent_class)->finalize(gobject); } void ags_position_automation_cursor_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_position_automation_cursor_dialog_apply(AgsApplicable *applicable) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; AgsWindow *window; AgsAutomationWindow *automation_window; AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; AgsAutomationEdit *automation_edit; AgsMachine *machine; GtkWidget *widget; GtkAdjustment *hadjustment; gdouble zoom; guint history; guint x; position_automation_cursor_dialog = AGS_POSITION_AUTOMATION_CURSOR_DIALOG(applicable); window = (AgsWindow *) position_automation_cursor_dialog->main_window; automation_window = window->automation_window; automation_editor = automation_window->automation_editor; machine = automation_editor->selected_machine; if(machine == NULL){ return; } automation_toolbar = automation_editor->automation_toolbar; history = gtk_combo_box_get_active(GTK_COMBO_BOX(automation_toolbar->zoom)); zoom = exp2((double) history - 2.0); automation_edit = automation_editor->focused_automation_edit; if(automation_edit == NULL){ return; } x = gtk_spin_button_get_value_as_int(position_automation_cursor_dialog->position_x); automation_edit->cursor_position_x = 16 * x; automation_edit->cursor_position_y = 0.0; hadjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); widget = (GtkWidget *) automation_edit->drawing_area; /* make visible */ if(hadjustment != NULL){ gtk_adjustment_set_value(hadjustment, ((x * 16 * 64 / zoom) * (gtk_adjustment_get_upper(hadjustment) / (AGS_AUTOMATION_EDITOR_MAX_CONTROLS / zoom)))); } if(gtk_toggle_button_get_active((GtkToggleButton *) position_automation_cursor_dialog->set_focus)){ gtk_widget_grab_focus(widget); } } void ags_position_automation_cursor_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_position_automation_cursor_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_position_automation_cursor_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_position_automation_cursor_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsPositionAutomationCursorDialog. * * Returns: a new #AgsPositionAutomationCursorDialog * * Since: 3.0.0 */ AgsPositionAutomationCursorDialog* ags_position_automation_cursor_dialog_new(GtkWidget *main_window) { AgsPositionAutomationCursorDialog *position_automation_cursor_dialog; position_automation_cursor_dialog = (AgsPositionAutomationCursorDialog *) g_object_new(AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG, "main-window", main_window, NULL); return(position_automation_cursor_dialog); } gsequencer-3.1.3/ags/X/editor/ags_envelope_dialog.h0000644000175000017500000000604413607210263017212 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_DIALOG_H__ #define __AGS_ENVELOPE_DIALOG_H__ #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_DIALOG (ags_envelope_dialog_get_type()) #define AGS_ENVELOPE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_DIALOG, AgsEnvelopeDialog)) #define AGS_ENVELOPE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_DIALOG, AgsEnvelopeDialogClass)) #define AGS_IS_ENVELOPE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ENVELOPE_DIALOG)) #define AGS_IS_ENVELOPE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ENVELOPE_DIALOG)) #define AGS_ENVELOPE_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ENVELOPE_DIALOG, AgsEnvelopeDialogClass)) #define AGS_ENVELOPE_DIALOG_DEFAULT_VERSION "0.8.1" #define AGS_ENVELOPE_DIALOG_DEFAULT_BUILD_ID "CEST 29-04-2017 09:55" typedef struct _AgsEnvelopeDialog AgsEnvelopeDialog; typedef struct _AgsEnvelopeDialogClass AgsEnvelopeDialogClass; typedef enum{ AGS_ENVELOPE_DIALOG_CONNECTED = 1, AGS_ENVELOPE_DIALOG_PATTERN_TAB = 1 << 1, }AgsEnvelopeDialogFlags; struct _AgsEnvelopeDialog { GtkDialog dialog; guint flags; gchar *version; gchar *build_id; AgsMachine *machine; GtkNotebook *notebook; GtkScrolledWindow *envelope_editor_scrolled_window; AgsEnvelopeEditor *envelope_editor; GtkScrolledWindow *pattern_envelope_scrolled_window; AgsPatternEnvelope *pattern_envelope; GtkScrolledWindow *envelope_info_scrolled_window; AgsEnvelopeInfo *envelope_info; GtkButton *apply; GtkButton *ok; GtkButton *cancel; }; struct _AgsEnvelopeDialogClass { GtkDialogClass dialog; }; GType ags_envelope_dialog_get_type(void); void ags_envelope_dialog_load_preset(AgsEnvelopeDialog *envelope_dialog); void ags_envelope_dialog_add_pattern_tab(AgsEnvelopeDialog *envelope_dialog); AgsEnvelopeDialog* ags_envelope_dialog_new(AgsMachine *machine); G_END_DECLS #endif /*__AGS_ENVELOPE_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c0000644000175000017500000000264713605312646024556 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_position_notation_cursor_dialog_response_callback(GtkWidget *dialog, gint response, AgsPositionNotationCursorDialog *position_notation_cursor_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(position_notation_cursor_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) position_notation_cursor_dialog); } } } } gsequencer-3.1.3/ags/X/editor/ags_envelope_info.c0000644000175000017500000003633113607210263016703 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_envelope_info_class_init(AgsEnvelopeInfoClass *envelope_info); void ags_envelope_info_connectable_interface_init(AgsConnectableInterface *connectable); void ags_envelope_info_applicable_interface_init(AgsApplicableInterface *applicable); void ags_envelope_info_init(AgsEnvelopeInfo *envelope_info); void ags_envelope_info_connect(AgsConnectable *connectable); void ags_envelope_info_disconnect(AgsConnectable *connectable); void ags_envelope_info_finalize(GObject *gobject); void ags_envelope_info_set_update(AgsApplicable *applicable, gboolean update); void ags_envelope_info_apply(AgsApplicable *applicable); void ags_envelope_info_reset(AgsApplicable *applicable); gchar* ags_envelope_info_x_label_func(gdouble value, gpointer data); gchar* ags_envelope_info_y_label_func(gdouble value, gpointer data); /** * SECTION:ags_envelope_info * @short_description: Show envelope info notes * @title: AgsEnvelopeInfo * @section_id: * @include: ags/X/ags_envelope_info.h * * #AgsEnvelopeInfo is a composite widget to show envelope controls * of selected #AgsNote. */ static gpointer ags_envelope_info_parent_class = NULL; GType ags_envelope_info_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_info = 0; static const GTypeInfo ags_envelope_info_info = { sizeof (AgsEnvelopeInfoClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_info_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeInfo), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_info_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_envelope_info_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_envelope_info_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_envelope_info = g_type_register_static(GTK_TYPE_VBOX, "AgsEnvelopeInfo", &ags_envelope_info_info, 0); g_type_add_interface_static(ags_type_envelope_info, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_envelope_info, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_info); } return g_define_type_id__volatile; } void ags_envelope_info_class_init(AgsEnvelopeInfoClass *envelope_info) { GObjectClass *gobject; GParamSpec *param_spec; ags_envelope_info_parent_class = g_type_class_peek_parent(envelope_info); /* GObjectClass */ gobject = (GObjectClass *) envelope_info; gobject->finalize = ags_envelope_info_finalize; } void ags_envelope_info_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_envelope_info_connect; connectable->disconnect = ags_envelope_info_disconnect; } void ags_envelope_info_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_envelope_info_set_update; applicable->apply = ags_envelope_info_apply; applicable->reset = ags_envelope_info_reset; } void ags_envelope_info_init(AgsEnvelopeInfo *envelope_info) { AgsCartesian *cartesian; GtkCellRenderer *toggle_renderer; GtkCellRenderer *renderer; GtkListStore *model; GtkTreeIter iter; gdouble width, height; envelope_info->flags = 0; envelope_info->version = AGS_ENVELOPE_INFO_DEFAULT_VERSION; envelope_info->build_id = AGS_ENVELOPE_INFO_DEFAULT_BUILD_ID; envelope_info->selection = NULL; /* cartesian */ cartesian = envelope_info->cartesian = ags_cartesian_new(); cartesian->x_label_func = ags_envelope_info_x_label_func; cartesian->y_label_func = ags_envelope_info_y_label_func; ags_cartesian_fill_label(cartesian, TRUE); ags_cartesian_fill_label(cartesian, FALSE); /* cartesian - width and height */ width = cartesian->x_end - cartesian->x_start; height = cartesian->y_end - cartesian->y_start; /* cartesian - size, pack and redraw */ gtk_widget_set_size_request((GtkWidget *) cartesian, (gint) width + 2.0 * cartesian->x_margin, (gint) height + 2.0 * cartesian->y_margin); gtk_box_pack_start((GtkBox *) envelope_info, (GtkWidget *) cartesian, FALSE, FALSE, 0); gtk_widget_queue_draw((GtkWidget *) cartesian); /* tree view */ envelope_info->tree_view = (GtkTreeView *) gtk_tree_view_new(); g_object_set(envelope_info->tree_view, "enable-grid-lines", TRUE, NULL); model = gtk_list_store_new(AGS_ENVELOPE_INFO_COLUMN_LAST, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); gtk_tree_view_set_model(envelope_info->tree_view, GTK_TREE_MODEL(model)); toggle_renderer = gtk_cell_renderer_toggle_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(envelope_info->tree_view), -1, i18n("plot"), toggle_renderer, "active", AGS_ENVELOPE_INFO_COLUMN_PLOT, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(envelope_info->tree_view), -1, i18n("audio channel"), renderer, "text", AGS_ENVELOPE_INFO_COLUMN_AUDIO_CHANNEL, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(envelope_info->tree_view), -1, i18n("Note:x0"), renderer, "text", AGS_ENVELOPE_INFO_COLUMN_NOTE_X0, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(envelope_info->tree_view), -1, i18n("Note:x1"), renderer, "text", AGS_ENVELOPE_INFO_COLUMN_NOTE_X1, NULL); gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(envelope_info->tree_view), -1, i18n("Note:y"), renderer, "text", AGS_ENVELOPE_INFO_COLUMN_NOTE_Y, NULL); gtk_box_pack_start((GtkBox *) envelope_info, (GtkWidget *) envelope_info->tree_view, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(toggle_renderer), "toggled\0", G_CALLBACK(ags_envelope_info_plot_callback), envelope_info); } void ags_envelope_info_connect(AgsConnectable *connectable) { AgsEnvelopeInfo *envelope_info; envelope_info = AGS_ENVELOPE_INFO(connectable); if((AGS_ENVELOPE_INFO_CONNECTED & (envelope_info->flags)) != 0){ return; } envelope_info->flags |= AGS_ENVELOPE_INFO_CONNECTED; } void ags_envelope_info_disconnect(AgsConnectable *connectable) { AgsEnvelopeInfo *envelope_info; envelope_info = AGS_ENVELOPE_INFO(connectable); if((AGS_ENVELOPE_INFO_CONNECTED & (envelope_info->flags)) == 0){ return; } envelope_info->flags &= (~AGS_ENVELOPE_INFO_CONNECTED); } void ags_envelope_info_finalize(GObject *gobject) { AgsEnvelopeInfo *envelope_info; envelope_info = AGS_ENVELOPE_INFO(gobject); if(envelope_info->selection != NULL){ g_list_free_full(envelope_info->selection, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_envelope_info_parent_class)->finalize(gobject); } void ags_envelope_info_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_envelope_info_apply(AgsApplicable *applicable) { /* empty */ } void ags_envelope_info_reset(AgsApplicable *applicable) { AgsEnvelopeDialog *envelope_dialog; AgsEnvelopeInfo *envelope_info; AgsMachine *machine; GtkListStore *model; GtkTreeIter iter; AgsAudio *audio; GList *start_notation, *notation; GList *start_selection, *selection; envelope_info = AGS_ENVELOPE_INFO(applicable); envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_info, AGS_TYPE_ENVELOPE_DIALOG); machine = envelope_dialog->machine; audio = machine->audio; /* get tree model */ model = GTK_LIST_STORE(gtk_tree_view_get_model(envelope_info->tree_view)); /* fill tree view */ g_object_get(audio, "notation", &start_notation, NULL); notation = start_notation; while(notation != NULL){ guint audio_channel; GRecMutex *notation_mutex; /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation->data); /**/ g_rec_mutex_lock(notation_mutex); selection = start_selection = g_list_copy_deep(AGS_NOTATION(notation->data)->selection, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(notation_mutex); if(envelope_info->selection == NULL){ envelope_info->selection = g_list_copy_deep(start_selection, (GCopyFunc) g_object_ref, NULL); }else{ envelope_info->selection = g_list_concat(envelope_info->selection, g_list_copy_deep(start_selection, (GCopyFunc) g_object_ref, NULL)); } g_object_get(AGS_NOTATION(notation->data), "audio-channel", &audio_channel, NULL); while(selection != NULL){ AgsNote *current_note; GRecMutex *note_mutex; current_note = AGS_NOTE(selection->data); /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(current_note); /* apply */ g_rec_mutex_lock(note_mutex); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, AGS_ENVELOPE_INFO_COLUMN_AUDIO_CHANNEL, audio_channel, AGS_ENVELOPE_INFO_COLUMN_NOTE_X0, current_note->x[0], AGS_ENVELOPE_INFO_COLUMN_NOTE_X1, current_note->x[1], AGS_ENVELOPE_INFO_COLUMN_NOTE_Y, current_note->y, -1); g_rec_mutex_unlock(note_mutex); selection = selection->next; } g_list_free_full(start_selection, g_object_unref); notation = notation->next; } g_list_free_full(start_notation, g_object_unref); } gchar* ags_envelope_info_x_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 10.0); g_free(format); return(str); } gchar* ags_envelope_info_y_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 10.0); g_free(format); return(str); } /** * ags_envelope_info_plot: * @envelope_info: the #AgsEnvelopeInfo * * Plot envelope. * * Since: 3.0.0 */ void ags_envelope_info_plot(AgsEnvelopeInfo *envelope_info) { AgsEnvelopeDialog *envelope_dialog; AgsCartesian *cartesian; AgsPlot *plot; GtkTreeModel *model; GtkTreeIter iter; AgsNote *note; GList *selection; complex z; gdouble default_width, default_height; gdouble offset; gboolean do_plot; if(!AGS_IS_ENVELOPE_INFO(envelope_info)){ return; } envelope_dialog = (AgsEnvelopeDialog *) gtk_widget_get_ancestor((GtkWidget *) envelope_info, AGS_TYPE_ENVELOPE_DIALOG); /* cartesian */ cartesian = envelope_info->cartesian; default_width = cartesian->x_step_width * cartesian->x_scale_step_width; default_height = cartesian->y_step_height * cartesian->y_scale_step_height; model = GTK_TREE_MODEL(gtk_tree_view_get_model(envelope_info->tree_view)); /* clear old plot */ if(cartesian->plot != NULL){ g_list_free_full(cartesian->plot, (GDestroyNotify) ags_plot_free); cartesian->plot = NULL; } /* plot */ if(gtk_tree_model_get_iter_first(model, &iter)){ selection = envelope_info->selection; while(selection != NULL){ gtk_tree_model_get(model, &iter, AGS_ENVELOPE_INFO_COLUMN_PLOT, &do_plot, -1); if(do_plot){ gdouble ratio; GRecMutex *note_mutex; note = AGS_NOTE(selection->data); /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); /* AgsPlot struct */ plot = ags_plot_alloc(5, 0, 0); plot->join_points = TRUE; plot->point_color[0][0] = 0.125; plot->point_color[0][1] = 0.5; plot->point_color[0][2] = 1.0; plot->point_color[1][0] = 0.125; plot->point_color[1][1] = 0.5; plot->point_color[1][2] = 1.0; plot->point_color[2][0] = 0.125; plot->point_color[2][1] = 0.5; plot->point_color[2][2] = 1.0; plot->point_color[3][0] = 0.125; plot->point_color[3][1] = 0.5; plot->point_color[3][2] = 1.0; plot->point_color[4][0] = 0.125; plot->point_color[4][1] = 0.5; plot->point_color[4][2] = 1.0; /* set plot points */ g_rec_mutex_lock(note_mutex); z = ags_complex_get(&(note->ratio)); ratio = cimag(z); plot->point[0][0] = 0.0; plot->point[0][1] = default_height * cimag(z); z = ags_complex_get(&(note->attack)); plot->point[1][0] = default_width * creal(z); plot->point[1][1] = default_height * (cimag(z) + ratio); offset = default_width * creal(z); z = ags_complex_get(&(note->decay)); plot->point[2][0] = offset + default_width * creal(z); plot->point[2][1] = default_height * (cimag(z) + ratio); offset += default_width * creal(z); z = ags_complex_get(&(note->sustain)); plot->point[3][0] = offset + default_width * creal(z); plot->point[3][1] = default_height * (cimag(z) + ratio); offset += default_width * creal(z); z = ags_complex_get(&(note->release)); plot->point[4][0] = offset + default_width * creal(z); plot->point[4][1] = default_height * (cimag(z) + ratio); g_rec_mutex_unlock(note_mutex); /* add plot */ ags_cartesian_add_plot(cartesian, plot); } /* iterate */ selection = selection->next; if(!gtk_tree_model_iter_next(model, &iter)){ break; } } } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) cartesian); } /** * ags_envelope_info_new: * * Create a new instance of #AgsEnvelopeInfo * * Returns: a new #AgsEnvelopeInfo * * Since: 3.0.0 */ AgsEnvelopeInfo* ags_envelope_info_new() { AgsEnvelopeInfo *envelope_info; envelope_info = (AgsEnvelopeInfo *) g_object_new(AGS_TYPE_ENVELOPE_INFO, NULL); return(envelope_info); } gsequencer-3.1.3/ags/X/editor/ags_wave_meta_callbacks.h0000644000175000017500000000236713616617253020043 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_META_CALLBACKS_H__ #define __AGS_WAVE_META_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_wave_meta_machine_changed_callback(AgsWaveEditor *wave_editor, AgsMachine *machine, AgsWaveMeta *wave_meta); G_END_DECLS #endif /*__AGS_WAVE_META_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_sheet_edit.c0000644000175000017500000005042013607210263016163 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include static GType ags_accessible_sheet_edit_get_type(void); void ags_sheet_edit_class_init(AgsSheetEditClass *sheet_edit); void ags_accessible_sheet_edit_class_init(AtkObject *object); void ags_accessible_sheet_edit_action_interface_init(AtkActionIface *action); void ags_sheet_edit_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sheet_edit_init(AgsSheetEdit *sheet_edit); void ags_sheet_edit_finalize(GObject *gobject); AtkObject* ags_sheet_edit_get_accessible(GtkWidget *widget); void ags_sheet_edit_connect(AgsConnectable *connectable); void ags_sheet_edit_disconnect(AgsConnectable *connectable); gboolean ags_accessible_sheet_edit_do_action(AtkAction *action, gint i); gint ags_accessible_sheet_edit_get_n_actions(AtkAction *action); const gchar* ags_accessible_sheet_edit_get_description(AtkAction *action, gint i); const gchar* ags_accessible_sheet_edit_get_name(AtkAction *action, gint i); const gchar* ags_accessible_sheet_edit_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_sheet_edit_set_description(AtkAction *action, gint i); gchar* ags_accessible_sheet_edit_get_localized_name(AtkAction *action, gint i); void ags_sheet_edit_show(GtkWidget *widget); void ags_sheet_edit_show_all(GtkWidget *widget); gboolean ags_sheet_edit_auto_scroll_timeout(GtkWidget *widget); /** * SECTION:ags_sheet_edit * @short_description: edit notes * @title: AgsSheetEdit * @section_id: * @include: ags/X/editor/ags_sheet_edit.h * * The #AgsSheetEdit lets you edit notes. */ enum{ PROP_0, }; static gpointer ags_sheet_edit_parent_class = NULL; static GQuark quark_accessible_object = 0; GtkStyle *sheet_edit_style = NULL; GHashTable *ags_sheet_edit_auto_scroll = NULL; GType ags_sheet_edit_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sheet_edit = 0; static const GTypeInfo ags_sheet_edit_info = { sizeof (AgsSheetEditClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sheet_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSheetEdit), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sheet_edit_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sheet_edit_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sheet_edit = g_type_register_static(GTK_TYPE_TABLE, "AgsSheetEdit", &ags_sheet_edit_info, 0); g_type_add_interface_static(ags_type_sheet_edit, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sheet_edit); } return g_define_type_id__volatile; } static GType ags_accessible_sheet_edit_get_type(void) { static GType ags_type_accessible_sheet_edit = 0; if(!ags_type_accessible_sheet_edit){ const GTypeInfo ags_accesssible_sheet_edit_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_sheet_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_sheet_edit_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_sheet_edit = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleSheetEdit", &ags_accesssible_sheet_edit_info, 0); g_type_add_interface_static(ags_type_accessible_sheet_edit, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_sheet_edit); } void ags_sheet_edit_class_init(AgsSheetEditClass *sheet_edit) { GtkWidgetClass *widget; GObjectClass *gobject; ags_sheet_edit_parent_class = g_type_class_peek_parent(sheet_edit); /* GObjectClass */ gobject = G_OBJECT_CLASS(sheet_edit); gobject->finalize = ags_sheet_edit_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) sheet_edit; widget->show = ags_sheet_edit_show; widget->show_all = ags_sheet_edit_show_all; } void ags_accessible_sheet_edit_class_init(AtkObject *object) { quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); } void ags_accessible_sheet_edit_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_sheet_edit_do_action; action->get_n_actions = ags_accessible_sheet_edit_get_n_actions; action->get_description = ags_accessible_sheet_edit_get_description; action->get_name = ags_accessible_sheet_edit_get_name; action->get_keybinding = ags_accessible_sheet_edit_get_keybinding; action->set_description = ags_accessible_sheet_edit_set_description; action->get_localized_name = ags_accessible_sheet_edit_get_localized_name; } void ags_sheet_edit_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_sheet_edit_connect; connectable->disconnect = ags_sheet_edit_disconnect; } void ags_sheet_edit_init(AgsSheetEdit *sheet_edit) { GtkAdjustment *adjustment; sheet_edit->flags = 0; sheet_edit->mode = AGS_SHEET_EDIT_NO_EDIT_MODE; sheet_edit->button_mask = 0; sheet_edit->key_mask = 0; sheet_edit->note_offset = 0; sheet_edit->note_offset_absolute = 0; sheet_edit->cursor_position_x = AGS_SHEET_EDIT_DEFAULT_CURSOR_POSITION_X; sheet_edit->cursor_position_y = AGS_SHEET_EDIT_DEFAULT_CURSOR_POSITION_Y; sheet_edit->selection_x0 = 0; sheet_edit->selection_x1 = 0; sheet_edit->selection_y0 = 0; sheet_edit->selection_y1 = 0; if(sheet_edit_style == NULL){ sheet_edit_style = gtk_style_copy(gtk_widget_get_style((GtkWidget *) sheet_edit)); } sheet_edit->drawing_area = (GtkDrawingArea *) gtk_drawing_area_new(); gtk_widget_set_events(GTK_WIDGET(sheet_edit->drawing_area), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_set_can_focus((GtkWidget *) sheet_edit->drawing_area, TRUE); gtk_table_attach(GTK_TABLE(sheet_edit), (GtkWidget *) sheet_edit->drawing_area, 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); /* auto-scroll */ if(ags_sheet_edit_auto_scroll == NULL){ ags_sheet_edit_auto_scroll = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_sheet_edit_auto_scroll, sheet_edit, ags_sheet_edit_auto_scroll_timeout); g_timeout_add(1000 / 30, (GSourceFunc) ags_sheet_edit_auto_scroll_timeout, (gpointer) sheet_edit); } void ags_sheet_edit_finalize(GObject *gobject) { AgsSheetEdit *sheet_edit; sheet_edit = AGS_SHEET_EDIT(gobject); /* remove auto scroll */ g_hash_table_remove(ags_sheet_edit_auto_scroll, sheet_edit); /* call parent */ G_OBJECT_CLASS(ags_sheet_edit_parent_class)->finalize(gobject); } AtkObject* ags_sheet_edit_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_sheet_edit_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_sheet_edit_connect(AgsConnectable *connectable) { AgsSheetEdit *sheet_edit; sheet_edit = AGS_SHEET_EDIT(connectable); if((AGS_SHEET_EDIT_CONNECTED & (sheet_edit->flags)) != 0){ return; } sheet_edit->flags |= AGS_SHEET_EDIT_CONNECTED; /* drawing area */ g_signal_connect_after((GObject *) sheet_edit->drawing_area, "configure_event", G_CALLBACK(ags_sheet_edit_drawing_area_configure_event), (gpointer) sheet_edit); g_signal_connect((GObject *) sheet_edit->drawing_area, "button_press_event", G_CALLBACK(ags_sheet_edit_drawing_area_button_press_event), (gpointer) sheet_edit); g_signal_connect((GObject *) sheet_edit->drawing_area, "button_release_event", G_CALLBACK(ags_sheet_edit_drawing_area_button_release_event), (gpointer) sheet_edit); g_signal_connect((GObject *) sheet_edit->drawing_area, "motion_notify_event", G_CALLBACK(ags_sheet_edit_drawing_area_motion_notify_event), (gpointer) sheet_edit); g_signal_connect((GObject *) sheet_edit->drawing_area, "key_press_event", G_CALLBACK(ags_sheet_edit_drawing_area_key_press_event), (gpointer) sheet_edit); g_signal_connect((GObject *) sheet_edit->drawing_area, "key_release_event", G_CALLBACK(ags_sheet_edit_drawing_area_key_release_event), (gpointer) sheet_edit); } void ags_sheet_edit_disconnect(AgsConnectable *connectable) { AgsSheetEdit *sheet_edit; sheet_edit = AGS_SHEET_EDIT(connectable); if((AGS_SHEET_EDIT_CONNECTED & (sheet_edit->flags)) == 0){ return; } sheet_edit->flags &= (~AGS_SHEET_EDIT_CONNECTED); /* drawing area */ g_object_disconnect(sheet_edit->drawing_area, "any_signal::configure_event", G_CALLBACK(ags_sheet_edit_drawing_area_configure_event), (gpointer) sheet_edit, "any_signal::button_press_event", G_CALLBACK(ags_sheet_edit_drawing_area_button_press_event), (gpointer) sheet_edit, "any_signal::button_release_event", G_CALLBACK(ags_sheet_edit_drawing_area_button_release_event), (gpointer) sheet_edit, "any_signal::motion_notify_event", G_CALLBACK(ags_sheet_edit_drawing_area_motion_notify_event), sheet_edit, "any_signal::key_press_event", G_CALLBACK(ags_sheet_edit_drawing_area_key_press_event), (gpointer) sheet_edit, "any_signal::key_release_event", G_CALLBACK(ags_sheet_edit_drawing_area_key_release_event), (gpointer) sheet_edit, NULL); } gboolean ags_accessible_sheet_edit_do_action(AtkAction *action, gint i) { AgsSheetEdit *sheet_edit; GdkEventKey *key_press, *key_release; GdkEventKey *modifier_press, *modifier_release; GdkEventKey *second_level_press, *second_level_release; if(!(i >= 0 && i < 12)){ return(FALSE); } sheet_edit = (AgsSheetEdit *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); key_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); /* create modifier */ modifier_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); modifier_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); modifier_press->keyval = modifier_release->keyval = GDK_KEY_Control_R; /* create second level */ second_level_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); second_level_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); second_level_press->keyval = second_level_release->keyval = GDK_KEY_Shift_R; switch(i){ case 0: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); } break; case 1: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); } break; case 2: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); } break; case 3: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); } break; case 4: { key_press->keyval = key_release->keyval = GDK_KEY_space; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); } break; case 5: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 6: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 7: { key_press->keyval = key_release->keyval = GDK_KEY_Delete; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); } break; case 8: { key_press->keyval = key_release->keyval = GDK_KEY_c; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 9: { key_press->keyval = key_release->keyval = GDK_KEY_x; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 10: { key_press->keyval = key_release->keyval = GDK_KEY_v; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 11: { key_press->keyval = key_release->keyval = GDK_KEY_a; /* send event */ gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) sheet_edit->drawing_area, (GdkEvent *) modifier_release); } break; } return(TRUE); } gint ags_accessible_sheet_edit_get_n_actions(AtkAction *action) { return(12); } const gchar* ags_accessible_sheet_edit_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move cursor left", "move cursor right", "move cursor up", "move cursor down", "add audio note", "shrink audio note", "grow audio note", "remove audio note", "copy note to clipboard", "cut note to clipbaord", "paste note from clipboard", "select all note", }; if(i >= 0 && i < 12){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_sheet_edit_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "add", "shrink", "grow", "remove", "copy", "cut", "paste", "select-all", }; if(i >= 0 && i < 12){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_sheet_edit_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "space", "Shft+Left", "Shft+Right", "Del" "Ctrl+c" "Ctrl+x", "Ctrl+v", "Ctrl+a", }; if(i >= 0 && i < 12){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_sheet_edit_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_sheet_edit_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_sheet_edit_show(GtkWidget *widget) { AgsSheetEdit *sheet_edit; sheet_edit = AGS_SHEET_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_sheet_edit_parent_class)->show(widget); } void ags_sheet_edit_show_all(GtkWidget *widget) { AgsSheetEdit *sheet_edit; sheet_edit = AGS_SHEET_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_sheet_edit_parent_class)->show_all(widget); } gboolean ags_sheet_edit_auto_scroll_timeout(GtkWidget *widget) { if(g_hash_table_lookup(ags_sheet_edit_auto_scroll, widget) != NULL){ AgsSheetEditor *sheet_editor; AgsSheetEdit *sheet_edit; GObject *output_soundcard; double x; sheet_edit = AGS_SHEET_EDIT(widget); if((AGS_SHEET_EDIT_AUTO_SCROLL & (sheet_edit->flags)) == 0){ return(TRUE); } sheet_editor = (AgsSheetEditor *) gtk_widget_get_ancestor((GtkWidget *) sheet_edit, AGS_TYPE_SHEET_EDITOR); if(sheet_editor->selected_machine == NULL){ return(TRUE); } //TODO:JK: implement me return(TRUE); }else{ return(FALSE); } } void ags_sheet_edit_draw(AgsSheetEdit *sheet_edit) { //TODO:JK: implement me } /** * ags_sheet_edit_new: * * Create a new #AgsSheetEdit. * * Returns: a new #AgsSheetEdit * * Since: 3.0.0 */ AgsSheetEdit* ags_sheet_edit_new() { AgsSheetEdit *sheet_edit; sheet_edit = (AgsSheetEdit *) g_object_new(AGS_TYPE_SHEET_EDIT, NULL); return(sheet_edit); } gsequencer-3.1.3/ags/X/editor/ags_pattern_envelope.h0000644000175000017500000001015613607210263017427 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PATTERN_ENVELOPE_H__ #define __AGS_PATTERN_ENVELOPE_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PATTERN_ENVELOPE (ags_pattern_envelope_get_type()) #define AGS_PATTERN_ENVELOPE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PATTERN_ENVELOPE, AgsPatternEnvelope)) #define AGS_PATTERN_ENVELOPE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PATTERN_ENVELOPE, AgsPatternEnvelopeClass)) #define AGS_IS_PATTERN_ENVELOPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PATTERN_ENVELOPE)) #define AGS_IS_PATTERN_ENVELOPE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PATTERN_ENVELOPE)) #define AGS_PATTERN_ENVELOPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PATTERN_ENVELOPE, AgsPatternEnvelopeClass)) #define AGS_PATTERN_ENVELOPE_DEFAULT_VERSION "0.8.5" #define AGS_PATTERN_ENVELOPE_DEFAULT_BUILD_ID "CEST 16-06-2017 11:29" typedef struct _AgsPatternEnvelope AgsPatternEnvelope; typedef struct _AgsPatternEnvelopeClass AgsPatternEnvelopeClass; typedef enum{ AGS_PATTERN_ENVELOPE_CONNECTED = 1, AGS_PATTERN_ENVELOPE_NO_UPDATE = 1 << 1, }AgsPatternEnvelopeFlags; typedef enum{ AGS_PATTERN_ENVELOPE_COLUMN_EDIT, AGS_PATTERN_ENVELOPE_COLUMN_PLOT, AGS_PATTERN_ENVELOPE_COLUMN_PRESET_NAME, AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_START, AGS_PATTERN_ENVELOPE_COLUMN_AUDIO_CHANNEL_END, AGS_PATTERN_ENVELOPE_COLUMN_PAD_START, AGS_PATTERN_ENVELOPE_COLUMN_PAD_END, AGS_PATTERN_ENVELOPE_COLUMN_X_START, AGS_PATTERN_ENVELOPE_COLUMN_X_END, AGS_PATTERN_ENVELOPE_COLUMN_LAST, }AgsPatternEnvelopeColumn; struct _AgsPatternEnvelope { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; GtkCheckButton *enabled; AgsCartesian *cartesian; GtkTreeView *tree_view; GtkSpinButton *audio_channel_start; GtkSpinButton *audio_channel_end; GtkSpinButton *pad_start; GtkSpinButton *pad_end; GtkSpinButton *x_start; GtkSpinButton *x_end; GtkHScale *attack_x; GtkHScale *attack_y; GtkHScale *decay_x; GtkHScale *decay_y; GtkHScale *sustain_x; GtkHScale *sustain_y; GtkHScale *release_x; GtkHScale *release_y; GtkHScale *ratio; GtkDialog *rename; GtkButton *move_up; GtkButton *move_down; GtkButton *add; GtkButton *remove; }; struct _AgsPatternEnvelopeClass { GtkVBoxClass vbox; }; GType ags_pattern_envelope_get_type(void); void ags_pattern_envelope_set_preset_property(AgsPatternEnvelope *pattern_envelope, AgsPreset *preset, gchar *property_name, GValue *value); AgsPreset* ags_pattern_envelope_get_active_preset(AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_load_preset(AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_add_preset(AgsPatternEnvelope *pattern_envelope, gchar *preset_name); void ags_pattern_envelope_remove_preset(AgsPatternEnvelope *pattern_envelope, guint nth); void ags_pattern_envelope_reset_control(AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_reset_tree_view(AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_plot(AgsPatternEnvelope *pattern_envelope); AgsPatternEnvelope* ags_pattern_envelope_new(); G_END_DECLS #endif /*__AGS_PATTERN_ENVELOPE_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_edit_callbacks.h0000644000175000017500000000406713607210263020027 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EDIT_CALLBACKS_H__ #define __AGS_WAVE_EDIT_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_wave_edit_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsWaveEdit *wave_edit); gboolean ags_wave_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsWaveEdit *wave_edit); gboolean ags_wave_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsWaveEdit *wave_edit); gboolean ags_wave_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsWaveEdit *wave_edit); gboolean ags_wave_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsWaveEdit *wave_edit); gboolean ags_wave_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsWaveEdit *wave_edit); gboolean ags_wave_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsWaveEdit *wave_edit); void ags_wave_edit_vscrollbar_value_changed(GtkRange *range, AgsWaveEdit *wave_edit); void ags_wave_edit_hscrollbar_value_changed(GtkRange *range, AgsWaveEdit *wave_edit); G_END_DECLS #endif /*__AGS_WAVE_EDIT_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_meta.h0000644000175000017500000000467713616617253016743 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_META_H__ #define __AGS_NOTATION_META_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NOTATION_META (ags_notation_meta_get_type()) #define AGS_NOTATION_META(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTATION_META, AgsNotationMeta)) #define AGS_NOTATION_META_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTATION_META, AgsNotationMetaClass)) #define AGS_IS_NOTATION_META(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_NOTATION_META)) #define AGS_IS_NOTATION_META_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_NOTATION_META)) #define AGS_NOTATION_META_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_NOTATION_META, AgsNotationMetaClass)) typedef struct _AgsNotationMeta AgsNotationMeta; typedef struct _AgsNotationMetaClass AgsNotationMetaClass; typedef enum{ AGS_NOTATION_META_CONNECTED = 1, AGS_NOTATION_META_ENABLED = 1 << 1, }AgsNotationMetaFlags; struct _AgsNotationMeta { GtkVBox vbox; guint flags; GtkLabel *machine_type; GtkLabel *machine_name; GtkLabel *audio_channels; GtkLabel *output_pads; GtkLabel *input_pads; GtkLabel *editor_tool; GtkLabel *active_audio_channel; GtkLabel *cursor_x_position; GtkLabel *cursor_y_position; GtkLabel *current_note; }; struct _AgsNotationMetaClass { GtkVBoxClass vbox; }; GType ags_notation_meta_get_type(void); void ags_notation_meta_refresh(AgsNotationMeta *notation_meta); AgsNotationMeta* ags_notation_meta_new(); G_END_DECLS #endif /*__AGS_NOTATION_META_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_toolbar.c0000644000175000017500000011523413616617253017767 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_automation_toolbar_class_init(AgsAutomationToolbarClass *automation_toolbar); void ags_automation_toolbar_connectable_interface_init(AgsConnectableInterface *connectable); void ags_automation_toolbar_init(AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_connect(AgsConnectable *connectable); void ags_automation_toolbar_disconnect(AgsConnectable *connectable); /** * SECTION:ags_automation_toolbar * @short_description: automation toolbar * @title: AgsAutomationToolbar * @section_id: * @include: ags/X/editor/ags_automation_toolbar.h * * The #AgsAutomationToolbar lets you choose edit tool. */ GType ags_automation_toolbar_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation_toolbar = 0; static const GTypeInfo ags_automation_toolbar_info = { sizeof (AgsAutomationToolbarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_automation_toolbar_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAutomationToolbar), 0, /* n_preallocs */ (GInstanceInitFunc) ags_automation_toolbar_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_automation_toolbar_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_automation_toolbar = g_type_register_static(GTK_TYPE_TOOLBAR, "AgsAutomationToolbar", &ags_automation_toolbar_info, 0); g_type_add_interface_static(ags_type_automation_toolbar, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation_toolbar); } return g_define_type_id__volatile; } void ags_automation_toolbar_class_init(AgsAutomationToolbarClass *automation_toolbar) { } void ags_automation_toolbar_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_automation_toolbar_connect; connectable->disconnect = ags_automation_toolbar_disconnect; } void ags_automation_toolbar_init(AgsAutomationToolbar *automation_toolbar) { GtkToolItem *tool_item; GtkMenuToolButton *menu_tool_button; GtkMenu *menu; GtkMenuItem *item; GtkLabel *label; GtkCellRenderer *cell_renderer; GtkHBox *hbox; /* position */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->position = g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Position"), "stock-id", GTK_STOCK_JUMP_TO, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->position); /* edit */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->edit = g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "stock-id", GTK_STOCK_EDIT, NULL); automation_toolbar->selected_edit_mode = automation_toolbar->edit; gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->edit); /* clear */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->clear = g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "stock-id", GTK_STOCK_CLEAR, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->clear); /* select */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->select = g_object_new(GTK_TYPE_TOGGLE_TOOL_BUTTON, "label", i18n("Select"), "stock-id", GTK_STOCK_SELECT_ALL, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->select); /* copy */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->copy = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_COPY, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->copy); /* cut */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->cut = (GtkToolButton *) g_object_new(GTK_TYPE_TOOL_BUTTON, "stock-id", GTK_STOCK_CUT, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->cut); /* paste */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->paste_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "stock-id", GTK_STOCK_PASTE, NULL); menu = (GtkMenu *) gtk_menu_new(); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", "match line", "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = g_object_new(GTK_TYPE_CHECK_MENU_ITEM, "label", "no duplicates", "active", TRUE, NULL); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); gtk_menu_tool_button_set_menu(automation_toolbar->paste_tool, (GtkWidget *) menu); gtk_widget_show_all((GtkWidget *) menu); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->paste_tool); /* menu tool */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); automation_toolbar->menu_tool = (GtkMenuToolButton *) g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "label", i18n("Tool"), "stock-id", GTK_STOCK_EXECUTE, NULL); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) automation_toolbar->menu_tool); /* menu tool - tool popup */ automation_toolbar->tool_popup = ags_automation_toolbar_tool_popup_new(automation_toolbar); gtk_menu_tool_button_set_menu(automation_toolbar->menu_tool, (GtkWidget *) automation_toolbar->tool_popup); /* menu tool - dialogs */ automation_toolbar->select_acceleration = (GtkDialog *) ags_select_acceleration_dialog_new(NULL); automation_toolbar->ramp_acceleration = (GtkDialog *) ags_ramp_acceleration_dialog_new(NULL); automation_toolbar->position_automation_cursor = (GtkDialog *) ags_position_automation_cursor_dialog_new(NULL); /* */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("Zoom")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); automation_toolbar->zoom_history = 2; automation_toolbar->zoom = ags_zoom_combo_box_new(); gtk_combo_box_set_active(GTK_COMBO_BOX(automation_toolbar->zoom), 2); gtk_box_pack_start(hbox, (GtkWidget *) automation_toolbar->zoom, FALSE, FALSE, 0); /* port */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("Port")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); automation_toolbar->port = (GtkComboBox *) gtk_combo_box_new(); cell_renderer = gtk_cell_renderer_toggle_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(automation_toolbar->port), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(automation_toolbar->port), cell_renderer, "active", 0, NULL); gtk_cell_renderer_toggle_set_activatable(GTK_CELL_RENDERER_TOGGLE(cell_renderer), TRUE); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(automation_toolbar->port), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(automation_toolbar->port), cell_renderer, "text", 1, NULL); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(automation_toolbar->port), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(automation_toolbar->port), cell_renderer, "text", 2, NULL); gtk_box_pack_start(hbox, (GtkWidget *) automation_toolbar->port, FALSE, FALSE, 0); /* opacity */ tool_item = gtk_tool_item_new(); gtk_toolbar_insert((GtkToolbar *) automation_toolbar, (GtkWidget *) tool_item, -1); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) tool_item, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("Opacity")); gtk_box_pack_start(hbox, (GtkWidget *) label, FALSE, FALSE, 0); automation_toolbar->opacity = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.001); gtk_spin_button_set_value(automation_toolbar->opacity, 0.3); gtk_box_pack_start(hbox, (GtkWidget *) automation_toolbar->opacity, FALSE, FALSE, 0); } void ags_automation_toolbar_connect(AgsConnectable *connectable) { AgsWindow *window; AgsAutomationWindow *automation_window; AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; GList *list; automation_toolbar = AGS_AUTOMATION_TOOLBAR(connectable); if((AGS_AUTOMATION_TOOLBAR_CONNECTED & (automation_toolbar->flags)) != 0){ return; } automation_toolbar->flags |= AGS_AUTOMATION_TOOLBAR_CONNECTED; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); automation_window = (AgsAutomationWindow *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_WINDOW); window = (AgsWindow *) automation_window->parent_window; g_object_set(automation_toolbar->select_acceleration, "main-window", window, NULL); g_object_set(automation_toolbar->ramp_acceleration, "main-window", window, NULL); g_object_set(automation_toolbar->position_automation_cursor, "main-window", window, NULL); /* */ g_signal_connect_after(G_OBJECT(automation_editor), "machine-changed", G_CALLBACK(ags_automation_toolbar_machine_changed_callback), automation_toolbar); /* tool */ g_signal_connect_after((GObject *) automation_toolbar->position, "toggled", G_CALLBACK(ags_automation_toolbar_position_callback), (gpointer) automation_toolbar); g_signal_connect_after((GObject *) automation_toolbar->edit, "toggled", G_CALLBACK(ags_automation_toolbar_edit_callback), (gpointer) automation_toolbar); g_signal_connect_after((GObject *) automation_toolbar->clear, "toggled", G_CALLBACK(ags_automation_toolbar_clear_callback), (gpointer) automation_toolbar); g_signal_connect_after((GObject *) automation_toolbar->select, "toggled", G_CALLBACK(ags_automation_toolbar_select_callback), (gpointer) automation_toolbar); /* edit */ g_signal_connect((GObject *) automation_toolbar->copy, "clicked", G_CALLBACK(ags_automation_toolbar_copy_or_cut_callback), (gpointer) automation_toolbar); g_signal_connect((GObject *) automation_toolbar->cut, "clicked", G_CALLBACK(ags_automation_toolbar_copy_or_cut_callback), (gpointer) automation_toolbar); g_signal_connect((GObject *) automation_toolbar->paste_tool, "clicked", G_CALLBACK(ags_automation_toolbar_paste_callback), (gpointer) automation_toolbar); list = gtk_container_get_children((GtkContainer *) gtk_menu_tool_button_get_menu(automation_toolbar->paste_tool)); g_signal_connect_after(list->data, "activate", G_CALLBACK(ags_automation_toolbar_match_line_callback), automation_toolbar); g_signal_connect_after(list->next->data, "activate", G_CALLBACK(ags_automation_toolbar_no_duplicates_callback), automation_toolbar); g_list_free(list); /* additional tools */ ags_connectable_connect(AGS_CONNECTABLE(automation_toolbar->select_acceleration)); ags_connectable_connect(AGS_CONNECTABLE(automation_toolbar->ramp_acceleration)); ags_connectable_connect(AGS_CONNECTABLE(automation_toolbar->position_automation_cursor)); /* zoom */ g_signal_connect_after((GObject *) automation_toolbar->zoom, "changed", G_CALLBACK(ags_automation_toolbar_zoom_callback), (gpointer) automation_toolbar); /* port */ g_signal_connect_after(automation_toolbar->port, "changed", G_CALLBACK(ags_automation_toolbar_port_callback), automation_toolbar); /* opacity */ g_signal_connect_after((GObject *) automation_toolbar->opacity, "value-changed", G_CALLBACK(ags_automation_toolbar_opacity_callback), (gpointer) automation_toolbar); } void ags_automation_toolbar_disconnect(AgsConnectable *connectable) { AgsAutomationToolbar *automation_toolbar; GList *list; automation_toolbar = AGS_AUTOMATION_TOOLBAR(connectable); if((AGS_AUTOMATION_TOOLBAR_CONNECTED & (automation_toolbar->flags)) == 0){ return; } automation_toolbar->flags &= (~AGS_AUTOMATION_TOOLBAR_CONNECTED); /* tool */ g_object_disconnect(G_OBJECT(automation_toolbar->position), "any_signal::toggled", G_CALLBACK(ags_automation_toolbar_position_callback), automation_toolbar, NULL); g_object_disconnect(G_OBJECT(automation_toolbar->edit), "any_signal::toggled", G_CALLBACK(ags_automation_toolbar_edit_callback), automation_toolbar, NULL); g_object_disconnect(G_OBJECT(automation_toolbar->clear), "any_signal::toggled", G_CALLBACK(ags_automation_toolbar_clear_callback), automation_toolbar, NULL); g_object_disconnect(G_OBJECT(automation_toolbar->select), "any_signal::toggled", G_CALLBACK(ags_automation_toolbar_select_callback), automation_toolbar, NULL); /* edit */ g_object_disconnect(G_OBJECT(automation_toolbar->copy), "any_signal::clicked", G_CALLBACK(ags_automation_toolbar_copy_or_cut_callback), automation_toolbar, NULL); g_object_disconnect(G_OBJECT(automation_toolbar->cut), "any_signal::clicked", G_CALLBACK(ags_automation_toolbar_copy_or_cut_callback), automation_toolbar, NULL); g_object_disconnect(G_OBJECT(automation_toolbar->paste_tool), "any_signal::clicked", G_CALLBACK(ags_automation_toolbar_paste_callback), automation_toolbar, NULL); list = gtk_container_get_children((GtkContainer *) gtk_menu_tool_button_get_menu(automation_toolbar->paste_tool)); g_object_disconnect(G_OBJECT(list->data), "any_signal::activate", G_CALLBACK(ags_automation_toolbar_match_line_callback), automation_toolbar, NULL); g_object_disconnect(G_OBJECT(list->next->data), "any_signal::activate", G_CALLBACK(ags_automation_toolbar_no_duplicates_callback), automation_toolbar, NULL); g_list_free(list); /* additional tools */ ags_connectable_disconnect(AGS_CONNECTABLE(automation_toolbar->select_acceleration)); ags_connectable_disconnect(AGS_CONNECTABLE(automation_toolbar->ramp_acceleration)); ags_connectable_disconnect(AGS_CONNECTABLE(automation_toolbar->position_automation_cursor)); /* zoom */ g_object_disconnect(G_OBJECT(automation_toolbar->zoom), "any_signal::changed", G_CALLBACK(ags_automation_toolbar_zoom_callback), automation_toolbar, NULL); /* port */ g_object_disconnect(G_OBJECT(automation_toolbar->port), "any_signal::changed", G_CALLBACK(ags_automation_toolbar_port_callback), automation_toolbar, NULL); /* opacity */ g_object_disconnect(G_OBJECT(automation_toolbar->opacity), "any_signal::value-changed", G_CALLBACK(ags_automation_toolbar_opacity_callback), automation_toolbar, NULL); } /** * ags_automation_toolbar_load_port: * @automation_toolbar: an #AgsAutomationToolbar * * Fill in port field with available ports. * * Since: 3.0.0 */ void ags_automation_toolbar_load_port(AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; AgsMachine *machine; GtkListStore *list_store; GtkTreeIter iter; AgsChannel *start_channel; AgsChannel *channel, *next_channel; GList *start_port, *port; gchar **collected_specifier; guint length; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); machine = automation_editor->selected_machine; if(machine == NULL){ gtk_combo_box_set_model(automation_toolbar->port, NULL); return; } /* */ list_store = gtk_list_store_new(3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING); gtk_combo_box_set_model(automation_toolbar->port, GTK_TREE_MODEL(list_store)); collected_specifier = (gchar **) malloc(sizeof(gchar*)); collected_specifier[0] = NULL; length = 1; /* audio */ port = start_port = ags_audio_collect_all_audio_ports(machine->audio); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); contains_control_name = g_strv_contains(collected_specifier, specifier); if(plugin_port != NULL && !contains_control_name){ /* create list store entry */ is_enabled = (ags_machine_automation_port_find_channel_type_with_control_name(machine->enabled_automation_port, G_TYPE_NONE, specifier)) ? TRUE: FALSE; gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, 0, is_enabled, 1, g_strdup("audio"), 2, g_strdup(specifier), -1); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* output */ g_object_get(machine->audio, "output", &start_channel, NULL); channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ /* output */ port = start_port = ags_channel_collect_all_channel_ports(channel); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); contains_control_name = g_strv_contains(collected_specifier, specifier); if(plugin_port != NULL && !contains_control_name){ /* create list store entry */ is_enabled = (ags_machine_automation_port_find_channel_type_with_control_name(machine->enabled_automation_port, AGS_TYPE_OUTPUT, specifier)) ? TRUE: FALSE; gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, 0, is_enabled, 1, g_strdup("output"), 2, g_strdup(specifier), -1); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } /* input */ g_object_get(machine->audio, "input", &start_channel, NULL); channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ /* input */ port = start_port = ags_channel_collect_all_channel_ports(channel); while(port != NULL){ AgsPluginPort *plugin_port; gchar *specifier; gboolean is_enabled; gboolean contains_control_name; g_object_get(port->data, "specifier", &specifier, "plugin-port", &plugin_port, NULL); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(collected_specifier, specifier); #else contains_control_name = ags_strv_contains(collected_specifier, specifier); #endif if(plugin_port != NULL && !contains_control_name){ /* create list store entry */ is_enabled = (ags_machine_automation_port_find_channel_type_with_control_name(machine->enabled_automation_port, AGS_TYPE_INPUT, specifier)) ? TRUE: FALSE; gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, 0, is_enabled, 1, g_strdup("input"), 2, g_strdup(specifier), -1); /* add to collected specifier */ collected_specifier = (gchar **) realloc(collected_specifier, (length + 1) * sizeof(gchar *)); collected_specifier[length - 1] = g_strdup(specifier); collected_specifier[length] = NULL; length++; } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } g_strfreev(collected_specifier); gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, 0, FALSE, 1, g_strdup(""), 2, g_strdup(""), -1); gtk_combo_box_set_active_iter(automation_toolbar->port, &iter); } /** * ags_automation_toolbar_apply_port: * @automation_toolbar: an #AgsAutomationToolbar * @channel_type: the #GType of channel * @control_name: the specifier as string * * Applies all port to appropriate #AgsMachine. * * Since: 3.0.0 */ void ags_automation_toolbar_apply_port(AgsAutomationToolbar *automation_toolbar, GType channel_type, gchar *control_name) { AgsAutomationEditor *automation_editor; AgsMachine *machine; GtkTreeModel *model; GtkTreeIter iter; AgsChannel *start_channel; AgsChannel *channel, *next_channel; AgsConfig *config; GList *start_automation, *automation; GList *start_port, *port; gchar *str; gdouble gui_scale_factor; guint length; gboolean contains_specifier; gboolean is_active; if(!g_ascii_strncasecmp(control_name, "", 1)){ return; } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); machine = automation_editor->selected_machine; model = gtk_combo_box_get_model(automation_toolbar->port); config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } /* update port combo box */ start_port = NULL; contains_specifier = FALSE; if(gtk_combo_box_get_active_iter(automation_toolbar->port, &iter)){ GType scope; gchar *str, *specifier; GValue value = {0,}; gtk_tree_model_get(model, &iter, 1, &str, 2, &specifier, -1); scope = G_TYPE_NONE; if(!g_ascii_strcasecmp("audio", str)){ scope = G_TYPE_NONE; port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, control_name, TRUE); start_port = port; port = ags_audio_collect_all_audio_ports_by_specifier_and_context(machine->audio, control_name, FALSE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } }else if(!g_ascii_strcasecmp("output", str)){ scope = AGS_TYPE_OUTPUT; g_object_get(machine->audio, "output", &start_channel, NULL); channel = start_channel; g_object_ref(channel); next_channel = NULL; start_port = NULL; while(channel != NULL){ port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, control_name, TRUE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, control_name, FALSE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(!g_ascii_strcasecmp("input", str)){ scope = AGS_TYPE_INPUT; g_object_get(machine->audio, "input", &start_channel, NULL); channel = start_channel; g_object_ref(channel); next_channel = NULL; start_port = NULL; while(channel != NULL){ port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, control_name, TRUE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, control_name, FALSE); if(start_port != NULL){ start_port = g_list_concat(start_port, port); }else{ start_port = port; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } } if(scope == channel_type && !g_ascii_strcasecmp(specifier, control_name)){ gtk_tree_model_get_value(model, &iter, 0, &value); if(g_value_get_boolean(&value)){ g_value_set_boolean(&value, FALSE); }else{ g_value_set_boolean(&value, TRUE); contains_specifier = TRUE; } gtk_list_store_set_value(GTK_LIST_STORE(model), &iter, 0, &value); } } /* add/remove enabled automation port */ if(contains_specifier){ machine->enabled_automation_port = g_list_prepend(machine->enabled_automation_port, ags_machine_automation_port_alloc(channel_type, control_name)); }else{ machine->enabled_automation_port = g_list_delete_link(machine->enabled_automation_port, ags_machine_automation_port_find_channel_type_with_control_name(machine->enabled_automation_port, channel_type, control_name)); } g_object_get(machine->audio, "automation", &start_automation, NULL); /* apply */ if(contains_specifier){ AgsAutomationEdit *automation_edit; AgsScale *scale; AgsPluginPort *plugin_port; gchar *specifier; gdouble upper, lower; gdouble default_value; GValue *upper_value, *lower_value; GValue *value; /* scale */ scale = ags_scale_new(); g_object_set(scale, "scale-width", (guint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_WIDTH), "scale-height", (guint) (gui_scale_factor * AGS_SCALE_DEFAULT_SCALE_HEIGHT), NULL); /* get some fields */ plugin_port = NULL; if(start_port != NULL){ g_object_get(start_port->data, "plugin-port", &plugin_port, NULL); } if(plugin_port != NULL){ g_object_get(plugin_port, "upper-value", &upper_value, "lower-value", &lower_value, "default-value", &value, NULL); upper = g_value_get_float(upper_value); lower = g_value_get_float(lower_value); default_value = g_value_get_float(value); g_object_unref(plugin_port); }else{ upper = 1.0; lower = 0.0; default_value = 1.0; } specifier = g_strdup(control_name); /* apply scale */ g_object_set(scale, "control-name", specifier, "upper", upper, "lower", lower, "default-value", default_value, NULL); if(channel_type == G_TYPE_NONE){ gtk_box_pack_start((GtkBox *) automation_editor->audio_scrolled_scale_box->scale_box, (GtkWidget *) scale, FALSE, FALSE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(channel_type == AGS_TYPE_OUTPUT){ gtk_box_pack_start((GtkBox *) automation_editor->output_scrolled_scale_box->scale_box, (GtkWidget *) scale, FALSE, FALSE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(channel_type == AGS_TYPE_INPUT){ gtk_box_pack_start((GtkBox *) automation_editor->input_scrolled_scale_box->scale_box, (GtkWidget *) scale, FALSE, FALSE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); } gtk_widget_show((GtkWidget *) scale); /* automation edit */ automation_edit = ags_automation_edit_new(); g_object_set(automation_edit, "channel-type", channel_type, "control-specifier", specifier, "control-name", control_name, "upper", upper, "lower", lower, "default-value", default_value, "upper", upper, "lower", lower, NULL); if(plugin_port != NULL && ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)){ automation_edit->flags |= AGS_AUTOMATION_EDIT_LOGARITHMIC; } if(channel_type == G_TYPE_NONE){ gtk_box_pack_start((GtkBox *) automation_editor->audio_scrolled_automation_edit_box->automation_edit_box, (GtkWidget *) automation_edit, FALSE, FALSE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(channel_type == AGS_TYPE_OUTPUT){ gtk_box_pack_start((GtkBox *) automation_editor->output_scrolled_automation_edit_box->automation_edit_box, (GtkWidget *) automation_edit, FALSE, FALSE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); }else if(channel_type == AGS_TYPE_INPUT){ gtk_box_pack_start((GtkBox *) automation_editor->input_scrolled_automation_edit_box->automation_edit_box, (GtkWidget *) automation_edit, FALSE, FALSE, AGS_AUTOMATION_EDIT_DEFAULT_PADDING); } ags_connectable_connect(AGS_CONNECTABLE(automation_edit)); gtk_widget_show((GtkWidget *) automation_edit); if(channel_type == G_TYPE_NONE){ g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_audio_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor); }else if(channel_type == AGS_TYPE_OUTPUT){ g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_output_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor); }else if(channel_type == AGS_TYPE_INPUT){ g_signal_connect_after((GObject *) automation_edit->hscrollbar, "value-changed", G_CALLBACK(ags_automation_editor_input_automation_edit_hscrollbar_value_changed), (gpointer) automation_editor); } /* unset bypass */ ags_audio_add_automation_port(machine->audio, control_name); automation = start_automation; while((automation = ags_automation_find_channel_type_with_control_name(automation, channel_type, control_name)) != NULL){ ags_automation_unset_flags(automation->data, AGS_AUTOMATION_BYPASS); automation = automation->next; } }else{ GList *list_start, *list; gint nth; gboolean success; /* audio */ nth = -1; success = FALSE; list = list_start = NULL; if(channel_type == G_TYPE_NONE){ list = list_start = gtk_container_get_children((GtkContainer *) automation_editor->audio_scrolled_automation_edit_box->automation_edit_box); }else if(channel_type == AGS_TYPE_OUTPUT){ list = list_start = gtk_container_get_children((GtkContainer *) automation_editor->output_scrolled_automation_edit_box->automation_edit_box); }else if(channel_type == AGS_TYPE_INPUT){ list = list_start = gtk_container_get_children((GtkContainer *) automation_editor->input_scrolled_automation_edit_box->automation_edit_box); } while(list != NULL){ nth++; if(AGS_AUTOMATION_EDIT(list->data)->channel_type == channel_type && !g_strcmp0(AGS_AUTOMATION_EDIT(list->data)->control_name, control_name)){ gtk_widget_destroy(list->data); success = TRUE; break; } list = list->next; } g_list_free(list_start); if(success){ if(channel_type == G_TYPE_NONE){ list_start = gtk_container_get_children((GtkContainer *) automation_editor->audio_scrolled_scale_box->scale_box); }else if(channel_type == AGS_TYPE_OUTPUT){ list_start = gtk_container_get_children((GtkContainer *) automation_editor->output_scrolled_scale_box->scale_box); }else if(channel_type == AGS_TYPE_INPUT){ list_start = gtk_container_get_children((GtkContainer *) automation_editor->input_scrolled_scale_box->scale_box); } list = g_list_nth(list_start, nth); gtk_widget_destroy(list->data); g_list_free(list_start); } /* set bypass */ ags_audio_remove_automation_port(machine->audio, control_name); automation = start_automation; while((automation = ags_automation_find_channel_type_with_control_name(automation, channel_type, control_name)) != NULL){ ags_automation_set_flags(automation->data, AGS_AUTOMATION_BYPASS); automation = automation->next; } } g_list_free_full(start_automation, g_object_unref); g_list_free_full(start_port, g_object_unref); } /** * ags_automation_toolbar_tool_popup_new: * @automation_toolbar: the #AgsAutomationToolbar * * Create a new #GtkMenu suitable for menu tool button. * * Returns: a new #GtkMenu * * Since: 3.0.0 */ GtkMenu* ags_automation_toolbar_tool_popup_new(AgsAutomationToolbar *automation_toolbar) { GtkMenu *tool_popup; GtkMenuItem *item; GList *list, *list_start; tool_popup = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("select accelerations")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("ramp accelerations")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("position cursor")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); gtk_menu_shell_append((GtkMenuShell*) tool_popup, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("enable all lines")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("disable all lines")); gtk_menu_shell_append((GtkMenuShell *) tool_popup, (GtkWidget *) item); /* connect */ list_start = list = gtk_container_get_children((GtkContainer *) tool_popup); g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_automation_toolbar_tool_popup_select_acceleration_callback), (gpointer) automation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_automation_toolbar_tool_popup_ramp_acceleration_callback), (gpointer) automation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_automation_toolbar_tool_popup_position_cursor_callback), (gpointer) automation_toolbar); list = list->next->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_automation_toolbar_tool_popup_enable_all_lines_callback), (gpointer) automation_toolbar); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_automation_toolbar_tool_popup_disable_all_lines_callback), (gpointer) automation_toolbar); g_list_free(list_start); /* show */ gtk_widget_show_all((GtkWidget *) tool_popup); return(tool_popup); } /** * ags_automation_toolbar_new: * * Create a new instance of #AgsAutomationToolbar. * * Returns: the new #AgsAutomationToolbar * * Since: 3.0.0 */ AgsAutomationToolbar* ags_automation_toolbar_new() { AgsAutomationToolbar *automation_toolbar; automation_toolbar = (AgsAutomationToolbar *) g_object_new(AGS_TYPE_AUTOMATION_TOOLBAR, NULL); return(automation_toolbar); } gsequencer-3.1.3/ags/X/editor/ags_position_automation_cursor_dialog.h0000644000175000017500000000542713607210263023102 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_POSITION_AUTOMATION_CURSOR_DIALOG_H__ #define __AGS_POSITION_AUTOMATION_CURSOR_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG (ags_position_automation_cursor_dialog_get_type()) #define AGS_POSITION_AUTOMATION_CURSOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG, AgsPositionAutomationCursorDialog)) #define AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG, AgsPositionAutomationCursorDialogClass)) #define AGS_IS_POSITION_AUTOMATION_CURSOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG)) #define AGS_IS_POSITION_AUTOMATION_CURSOR_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG)) #define AGS_POSITION_AUTOMATION_CURSOR_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG, AgsPositionAutomationCursorDialogClass)) #define AGS_POSITION_AUTOMATION_CURSOR_MAX_BEATS (16 * 1200) typedef struct _AgsPositionAutomationCursorDialog AgsPositionAutomationCursorDialog; typedef struct _AgsPositionAutomationCursorDialogClass AgsPositionAutomationCursorDialogClass; typedef enum{ AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CONNECTED = 1, }AgsPositionAutomationCursorDialogFlags; struct _AgsPositionAutomationCursorDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *set_focus; GtkSpinButton *position_x; }; struct _AgsPositionAutomationCursorDialogClass { GtkDialogClass dialog; }; GType ags_position_automation_cursor_dialog_get_type(void); AgsPositionAutomationCursorDialog* ags_position_automation_cursor_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_POSITION_AUTOMATION_CURSOR_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_machine_radio_button_callbacks.h0000644000175000017500000000242713607210263022233 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_RADIO_BUTTON_CALLBACKS_H__ #define __AGS_MACHINE_RADIO_BUTTON_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_machine_radio_button_notify_machine_name_callback(GObject *machine, GParamSpec *pspec, AgsMachineRadioButton *machine_radio_button); G_END_DECLS #endif /*__AGS_MACHINE_RADIO_BUTTON_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_toolbar_callbacks.h0000644000175000017500000000633413607210263021761 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_TOOLBAR_CALLBACKS_H__ #define __AGS_AUTOMATION_TOOLBAR_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_automation_toolbar_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsAutomationToolbar *toolbar); void ags_automation_toolbar_position_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_edit_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_clear_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_select_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_paste_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_match_line_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_no_duplicates_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_tool_popup_select_acceleration_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_tool_popup_ramp_acceleration_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_tool_popup_position_cursor_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_tool_popup_enable_all_lines_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_tool_popup_disable_all_lines_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_zoom_callback(GtkComboBox *combo_box, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_port_callback(GtkComboBox *combo_box, AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_opacity_callback(GtkSpinButton *spin_button, AgsAutomationToolbar *automation_toolbar); G_END_DECLS #endif /*__AGS_AUTOMATION_TOOLBAR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_automation_cursor_dialog_callbacks.h0000644000175000017500000000254513607210263025077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CALLBACKS_H__ #define __AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_position_automation_cursor_dialog_response_callback(GtkWidget *dialog, gint response, AgsPositionAutomationCursorDialog *position_automation_cursor_dialog); G_END_DECLS #endif /*__AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_vautomation_edit_box.h0000644000175000017500000000436713607210263020307 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VAUTOMATION_EDIT_BOX_H__ #define __AGS_VAUTOMATION_EDIT_BOX_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_VAUTOMATION_EDIT_BOX (ags_vautomation_edit_box_get_type()) #define AGS_VAUTOMATION_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VAUTOMATION_EDIT_BOX, AgsVAutomationEditBox)) #define AGS_VAUTOMATION_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VAUTOMATION_EDIT_BOX, AgsVAutomationEditBoxClass)) #define AGS_IS_VAUTOMATION_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VAUTOMATION_EDIT_BOX)) #define AGS_IS_VAUTOMATION_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VAUTOMATION_EDIT_BOX)) #define AGS_VAUTOMATION_EDIT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_VAUTOMATION_EDIT_BOX, AgsVAutomationEditBoxClass)) typedef struct _AgsVAutomationEditBox AgsVAutomationEditBox; typedef struct _AgsVAutomationEditBoxClass AgsVAutomationEditBoxClass; struct _AgsVAutomationEditBox { AgsAutomationEditBox automation_edit_box; }; struct _AgsVAutomationEditBoxClass { AgsAutomationEditBoxClass automation_edit_box; }; GType ags_vautomation_edit_box_get_type(void); AgsVAutomationEditBox* ags_vautomation_edit_box_new(); G_END_DECLS #endif /*__AGS_VAUTOMATION_EDIT_BOX_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_toolbar_callbacks.c0000644000175000017500000003427013607210263021754 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_automation_toolbar_zoom_callback_apply(GList *list, gdouble old_zoom_factor, gdouble zoom_factor, gdouble zoom); void ags_automation_toolbar_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsAutomationToolbar *toolbar) { AgsAutomation *automation; /* load ports */ ags_automation_toolbar_load_port(automation_editor->automation_toolbar); } void ags_automation_toolbar_position_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); if(toggle_button == automation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = automation_toolbar->selected_edit_mode; automation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_automation_toolbar_edit_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar) { if(toggle_button == automation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = automation_toolbar->selected_edit_mode; automation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_automation_toolbar_clear_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar) { if(toggle_button == automation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = automation_toolbar->selected_edit_mode; automation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_automation_toolbar_select_callback(GtkToggleToolButton *toggle_button, AgsAutomationToolbar *automation_toolbar) { if(toggle_button == automation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = automation_toolbar->selected_edit_mode; automation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_automation_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(automation_toolbar), AGS_TYPE_AUTOMATION_EDITOR)); if(widget == (GtkWidget *) automation_toolbar->copy){ ags_automation_editor_copy(automation_editor); }else{ ags_automation_editor_cut(automation_editor); } } void ags_automation_toolbar_paste_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(automation_toolbar), AGS_TYPE_AUTOMATION_EDITOR)); ags_automation_editor_paste(automation_editor); } void ags_automation_toolbar_match_line_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(automation_toolbar), AGS_TYPE_AUTOMATION_EDITOR)); if(gtk_check_menu_item_get_active((GtkCheckMenuItem *) widget)){ automation_editor->flags |= AGS_AUTOMATION_EDITOR_PASTE_MATCH_LINE; }else{ automation_editor->flags &= (~AGS_AUTOMATION_EDITOR_PASTE_MATCH_LINE); } } void ags_automation_toolbar_no_duplicates_callback(GtkWidget *widget, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; automation_editor = AGS_AUTOMATION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(automation_toolbar), AGS_TYPE_AUTOMATION_EDITOR)); if(gtk_check_menu_item_get_active((GtkCheckMenuItem *) widget)){ automation_editor->flags |= AGS_AUTOMATION_EDITOR_PASTE_NO_DUPLICATES; }else{ automation_editor->flags &= (~AGS_AUTOMATION_EDITOR_PASTE_NO_DUPLICATES); } } void ags_automation_toolbar_tool_popup_select_acceleration_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar) { gtk_widget_show_all((GtkWidget *) automation_toolbar->select_acceleration); } void ags_automation_toolbar_tool_popup_ramp_acceleration_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar) { gtk_widget_show_all((GtkWidget *) automation_toolbar->ramp_acceleration); } void ags_automation_toolbar_tool_popup_position_cursor_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar) { gtk_widget_show_all((GtkWidget *) automation_toolbar->position_automation_cursor); } void ags_automation_toolbar_tool_popup_enable_all_lines_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; AgsNotebook *notebook; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); notebook = NULL; /* queue draw */ switch(gtk_notebook_get_current_page(automation_editor->notebook)){ case 1: { notebook = automation_editor->output_notebook; } break; case 2: { notebook = automation_editor->input_notebook; } break; } if(notebook != NULL){ GList *start_list, *list; list = start_list = g_list_copy(notebook->tab); while(list != NULL){ gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(list->data)->toggle, TRUE); list = list->next; } g_list_free(start_list); } } void ags_automation_toolbar_tool_popup_disable_all_lines_callback(GtkWidget *item, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; AgsNotebook *notebook; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); notebook = NULL; /* queue draw */ switch(gtk_notebook_get_current_page(automation_editor->notebook)){ case 1: { notebook = automation_editor->output_notebook; } break; case 2: { notebook = automation_editor->input_notebook; } break; } if(notebook != NULL){ GList *start_list, *list; list = start_list = g_list_copy(notebook->tab); while(list != NULL){ gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(list->data)->toggle, FALSE); list = list->next; } g_list_free(start_list); } } void ags_automation_toolbar_zoom_callback_apply(GList *list, gdouble old_zoom_factor, gdouble zoom_factor, gdouble zoom) { AgsAutomationEdit *automation_edit; while(list != NULL){ automation_edit = list->data; gtk_widget_queue_draw((GtkWidget *) automation_edit); /* reset ruler */ automation_edit->ruler->factor = zoom_factor; automation_edit->ruler->precision = zoom; automation_edit->ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) automation_edit->ruler); list = list->next; } } void ags_automation_toolbar_zoom_callback(GtkComboBox *combo_box, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; GtkWidget *widget; GtkAdjustment *adjustment; GList *list_start; gdouble old_value; gdouble old_zoom_factor; gdouble zoom_factor, zoom; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); /* zoom */ old_zoom_factor = exp2(6.0 - (double) automation_toolbar->zoom_history); automation_toolbar->zoom_history = gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom); zoom_factor = exp2(6.0 - (double) automation_toolbar->zoom_history); zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom) - 2.0); /* audio */ old_value = gtk_range_get_value(automation_editor->audio_hscrollbar); automation_editor->audio_ruler->factor = zoom_factor; automation_editor->audio_ruler->precision = zoom; automation_editor->audio_ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) automation_editor->audio_ruler); list_start = gtk_container_get_children((GtkContainer *) automation_editor->audio_scrolled_automation_edit_box->automation_edit_box); ags_automation_toolbar_zoom_callback_apply(list_start, old_zoom_factor, zoom_factor, zoom); g_list_free(list_start); ags_automation_editor_reset_audio_scrollbar(automation_editor); gtk_range_set_value(automation_editor->audio_hscrollbar, old_value * old_zoom_factor / zoom_factor); /* output */ old_value = gtk_range_get_value(automation_editor->output_hscrollbar); automation_editor->output_ruler->factor = zoom_factor; automation_editor->output_ruler->precision = zoom; automation_editor->output_ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) automation_editor->output_ruler); list_start = gtk_container_get_children((GtkContainer *) automation_editor->output_scrolled_automation_edit_box->automation_edit_box); ags_automation_toolbar_zoom_callback_apply(list_start, old_zoom_factor, zoom_factor, zoom); g_list_free(list_start); ags_automation_editor_reset_output_scrollbar(automation_editor); gtk_range_set_value(automation_editor->output_hscrollbar, old_value * old_zoom_factor / zoom_factor); /* input */ old_value = gtk_range_get_value(automation_editor->input_hscrollbar); automation_editor->input_ruler->factor = zoom_factor; automation_editor->input_ruler->precision = zoom; automation_editor->input_ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) automation_editor->input_ruler); list_start = gtk_container_get_children((GtkContainer *) automation_editor->input_scrolled_automation_edit_box->automation_edit_box); ags_automation_toolbar_zoom_callback_apply(list_start, old_zoom_factor, zoom_factor, zoom); g_list_free(list_start); ags_automation_editor_reset_input_scrollbar(automation_editor); gtk_range_set_value(automation_editor->input_hscrollbar, old_value * old_zoom_factor / zoom_factor); } void ags_automation_toolbar_port_callback(GtkComboBox *combo_box, AgsAutomationToolbar *automation_toolbar) { GtkTreeModel *model; GtkTreeIter iter; gchar *scope; gchar *control_name; GType channel_type; GValue value = {0,}; if((AGS_AUTOMATION_TOOLBAR_RESET_PORT & (automation_toolbar->flags)) != 0){ return; } automation_toolbar->flags |= AGS_AUTOMATION_TOOLBAR_RESET_PORT; model = gtk_combo_box_get_model(combo_box); gtk_combo_box_get_active_iter(combo_box, &iter); gtk_tree_model_get(model, &iter, 1, &scope, 2, &control_name, -1); channel_type = G_TYPE_NONE; if(!g_strcmp0("audio", scope)){ channel_type = G_TYPE_NONE; }else if(!g_strcmp0("output", scope)){ channel_type = AGS_TYPE_OUTPUT; }else if(!g_strcmp0("input", scope)){ channel_type = AGS_TYPE_INPUT; } if(control_name != NULL && strlen(control_name) > 0){ ags_automation_toolbar_apply_port(automation_toolbar, channel_type, control_name); } automation_toolbar->flags &= (~AGS_AUTOMATION_TOOLBAR_RESET_PORT); } void ags_automation_toolbar_opacity_callback(GtkSpinButton *spin_button, AgsAutomationToolbar *automation_toolbar) { AgsAutomationEditor *automation_editor; GList *start_list, *list; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor((GtkWidget *) automation_toolbar, AGS_TYPE_AUTOMATION_EDITOR); /* queue draw */ switch(gtk_notebook_get_current_page(automation_editor->notebook)){ case 0: { list = start_list = gtk_container_get_children((GtkContainer *) automation_editor->audio_scrolled_automation_edit_box->automation_edit_box); } break; case 1: { list = start_list = gtk_container_get_children((GtkContainer *) automation_editor->output_scrolled_automation_edit_box->automation_edit_box); } break; case 2: { list = start_list = gtk_container_get_children((GtkContainer *) automation_editor->input_scrolled_automation_edit_box->automation_edit_box); } break; default: { list = start_list = NULL; } } while(list != NULL){ gtk_widget_queue_draw((GtkWidget *) list->data); list = list->next; } g_list_free(start_list); } gsequencer-3.1.3/ags/X/editor/ags_select_buffer_dialog_callbacks.h0000644000175000017500000000251613607210263022204 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SELECT_BUFFER_DIALOG_CALLBACKS_H__ #define __AGS_SELECT_BUFFER_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_select_buffer_dialog_response_callback(GtkWidget *dialog, gint response, AgsSelectBufferDialog *select_buffer_dialog); G_END_DECLS #endif /*__AGS_SELECT_BUFFER_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_pattern_envelope_callbacks.h0000644000175000017500000000730313607210263021426 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PATTERN_ENVELOPE_CALLBACKS_H__ #define __AGS_PATTERN_ENVELOPE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_pattern_envelope_edit_callback(GtkCellRendererToggle *cell_renderer, gchar *path_str, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_plot_callback(GtkCellRendererToggle *cell_renderer, gchar *path_str, AgsPatternEnvelope *pattern_envelope); /* range */ void ags_pattern_envelope_audio_channel_start_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_audio_channel_end_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_pad_start_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_pad_end_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_x_start_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_x_end_callback(GtkWidget *spin_button, AgsPatternEnvelope *pattern_envelope); /* envelope */ void ags_pattern_envelope_attack_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_attack_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_decay_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_decay_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_sustain_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_sustain_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_release_x_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_release_y_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_ratio_callback(GtkWidget *range, AgsPatternEnvelope *pattern_envelope); /* actions */ void ags_pattern_envelope_preset_move_up_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_preset_move_down_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_preset_add_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope); void ags_pattern_envelope_preset_remove_callback(GtkWidget *button, AgsPatternEnvelope *pattern_envelope); int ags_pattern_envelope_preset_rename_response_callback(GtkWidget *widget, gint response, AgsPatternEnvelope *pattern_envelope); G_END_DECLS #endif /*__AGS_PATTERN_ENVELOPE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_notation_cursor_dialog.c0000644000175000017500000003543613607210263022553 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_position_notation_cursor_dialog_class_init(AgsPositionNotationCursorDialogClass *position_notation_cursor_dialog); void ags_position_notation_cursor_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_position_notation_cursor_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_position_notation_cursor_dialog_init(AgsPositionNotationCursorDialog *position_notation_cursor_dialog); void ags_position_notation_cursor_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_position_notation_cursor_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_position_notation_cursor_dialog_finalize(GObject *gobject); void ags_position_notation_cursor_dialog_connect(AgsConnectable *connectable); void ags_position_notation_cursor_dialog_disconnect(AgsConnectable *connectable); void ags_position_notation_cursor_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_position_notation_cursor_dialog_apply(AgsApplicable *applicable); void ags_position_notation_cursor_dialog_reset(AgsApplicable *applicable); gboolean ags_position_notation_cursor_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_position_notation_cursor_dialog * @short_description: position tool * @title: AgsPositionNotationCursorDialog * @section_id: * @include: ags/X/editor/ags_position_notation_cursor_dialog.h * * The #AgsPositionNotationCursorDialog lets you position notation editor cursor. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_position_notation_cursor_dialog_parent_class = NULL; GType ags_position_notation_cursor_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_position_notation_cursor_dialog = 0; static const GTypeInfo ags_position_notation_cursor_dialog_info = { sizeof (AgsPositionNotationCursorDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_position_notation_cursor_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPositionNotationCursorDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_position_notation_cursor_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_position_notation_cursor_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_position_notation_cursor_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_position_notation_cursor_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsPositionNotationCursorDialog", &ags_position_notation_cursor_dialog_info, 0); g_type_add_interface_static(ags_type_position_notation_cursor_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_position_notation_cursor_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_position_notation_cursor_dialog); } return g_define_type_id__volatile; } void ags_position_notation_cursor_dialog_class_init(AgsPositionNotationCursorDialogClass *position_notation_cursor_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_position_notation_cursor_dialog_parent_class = g_type_class_peek_parent(position_notation_cursor_dialog); /* GObjectClass */ gobject = (GObjectClass *) position_notation_cursor_dialog; gobject->set_property = ags_position_notation_cursor_dialog_set_property; gobject->get_property = ags_position_notation_cursor_dialog_get_property; gobject->finalize = ags_position_notation_cursor_dialog_finalize; /* properties */ /** * AgsPositionNotationCursorDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) position_notation_cursor_dialog; widget->delete_event = ags_position_notation_cursor_dialog_delete_event; } void ags_position_notation_cursor_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_position_notation_cursor_dialog_connect; connectable->disconnect = ags_position_notation_cursor_dialog_disconnect; } void ags_position_notation_cursor_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_position_notation_cursor_dialog_set_update; applicable->apply = ags_position_notation_cursor_dialog_apply; applicable->reset = ags_position_notation_cursor_dialog_reset; } void ags_position_notation_cursor_dialog_init(AgsPositionNotationCursorDialog *position_notation_cursor_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; position_notation_cursor_dialog->flags = 0; g_object_set(position_notation_cursor_dialog, "title", i18n("position notation cursor"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(position_notation_cursor_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* set focus */ position_notation_cursor_dialog->set_focus = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("set focus")); gtk_toggle_button_set_active((GtkToggleButton *) position_notation_cursor_dialog->set_focus, TRUE); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(position_notation_cursor_dialog->set_focus), FALSE, FALSE, 0); /* position x - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* position x - label */ label = (GtkLabel *) gtk_label_new(i18n("position x")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* position x - spin button */ position_notation_cursor_dialog->position_x = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_POSITION_NOTATION_CURSOR_MAX_BEATS, 1.0); gtk_spin_button_set_value(position_notation_cursor_dialog->position_x, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(position_notation_cursor_dialog->position_x), FALSE, FALSE, 0); /* position y - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* position y - label */ label = (GtkLabel *) gtk_label_new(i18n("position y")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* position y - spin button */ position_notation_cursor_dialog->position_y = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_POSITION_NOTATION_CURSOR_MAX_KEYS, 1.0); gtk_spin_button_set_value(position_notation_cursor_dialog->position_y, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(position_notation_cursor_dialog->position_y), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) position_notation_cursor_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_position_notation_cursor_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; position_notation_cursor_dialog = AGS_POSITION_NOTATION_CURSOR_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) position_notation_cursor_dialog->main_window == main_window){ return; } if(position_notation_cursor_dialog->main_window != NULL){ g_object_unref(position_notation_cursor_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } position_notation_cursor_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_position_notation_cursor_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; position_notation_cursor_dialog = AGS_POSITION_NOTATION_CURSOR_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, position_notation_cursor_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_position_notation_cursor_dialog_connect(AgsConnectable *connectable) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; position_notation_cursor_dialog = AGS_POSITION_NOTATION_CURSOR_DIALOG(connectable); if((AGS_POSITION_NOTATION_CURSOR_DIALOG_CONNECTED & (position_notation_cursor_dialog->flags)) != 0){ return; } position_notation_cursor_dialog->flags |= AGS_POSITION_NOTATION_CURSOR_DIALOG_CONNECTED; g_signal_connect(position_notation_cursor_dialog, "response", G_CALLBACK(ags_position_notation_cursor_dialog_response_callback), position_notation_cursor_dialog); } void ags_position_notation_cursor_dialog_disconnect(AgsConnectable *connectable) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; position_notation_cursor_dialog = AGS_POSITION_NOTATION_CURSOR_DIALOG(connectable); if((AGS_POSITION_NOTATION_CURSOR_DIALOG_CONNECTED & (position_notation_cursor_dialog->flags)) == 0){ return; } position_notation_cursor_dialog->flags &= (~AGS_POSITION_NOTATION_CURSOR_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(position_notation_cursor_dialog), "any_signal::response", G_CALLBACK(ags_position_notation_cursor_dialog_response_callback), position_notation_cursor_dialog, NULL); } void ags_position_notation_cursor_dialog_finalize(GObject *gobject) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; position_notation_cursor_dialog = (AgsPositionNotationCursorDialog *) gobject; G_OBJECT_CLASS(ags_position_notation_cursor_dialog_parent_class)->finalize(gobject); } void ags_position_notation_cursor_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_position_notation_cursor_dialog_apply(AgsApplicable *applicable) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; AgsWindow *window; AgsNotationEditor *notation_editor; AgsNotationToolbar *notation_toolbar; AgsNotationEdit *notation_edit; AgsMachine *machine; GtkWidget *widget; GtkAdjustment *hadjustment; gdouble zoom; guint map_height, height; guint history; guint x, y; position_notation_cursor_dialog = AGS_POSITION_NOTATION_CURSOR_DIALOG(applicable); window = (AgsWindow *) position_notation_cursor_dialog->main_window; notation_editor = window->notation_editor; machine = notation_editor->selected_machine; if(machine == NULL){ return; } notation_toolbar = notation_editor->notation_toolbar; history = gtk_combo_box_get_active(GTK_COMBO_BOX(notation_toolbar->zoom)); zoom = exp2((double) history - 2.0); notation_edit = notation_editor->notation_edit; if(notation_edit == NULL){ return; } x = gtk_spin_button_get_value_as_int(position_notation_cursor_dialog->position_x); notation_edit->cursor_position_x = 16 * x; notation_edit->cursor_position_y = 0.0; hadjustment = gtk_range_get_adjustment(GTK_RANGE(notation_edit->hscrollbar)); widget = (GtkWidget *) notation_edit->drawing_area; /* make visible */ if(hadjustment != NULL){ gtk_adjustment_set_value(hadjustment, ((x * 16 * 64 / zoom) * (gtk_adjustment_get_upper(hadjustment) / (AGS_NOTATION_EDITOR_MAX_CONTROLS / zoom)))); } if(gtk_toggle_button_get_active((GtkToggleButton *) position_notation_cursor_dialog->set_focus)){ gtk_widget_grab_focus(widget); } //TODO:JK: implement me } void ags_position_notation_cursor_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_position_notation_cursor_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_position_notation_cursor_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_position_notation_cursor_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsPositionNotationCursorDialog. * * Returns: a new #AgsPositionNotationCursorDialog * * Since: 3.0.0 */ AgsPositionNotationCursorDialog* ags_position_notation_cursor_dialog_new(GtkWidget *main_window) { AgsPositionNotationCursorDialog *position_notation_cursor_dialog; position_notation_cursor_dialog = (AgsPositionNotationCursorDialog *) g_object_new(AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG, "main-window", main_window, NULL); return(position_notation_cursor_dialog); } gsequencer-3.1.3/ags/X/editor/ags_vwave_edit_box.h0000644000175000017500000000406713607210263017066 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VWAVE_EDIT_BOX_H__ #define __AGS_VWAVE_EDIT_BOX_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_VWAVE_EDIT_BOX (ags_vwave_edit_box_get_type()) #define AGS_VWAVE_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VWAVE_EDIT_BOX, AgsVWaveEditBox)) #define AGS_VWAVE_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VWAVE_EDIT_BOX, AgsVWaveEditBoxClass)) #define AGS_IS_VWAVE_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VWAVE_EDIT_BOX)) #define AGS_IS_VWAVE_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VWAVE_EDIT_BOX)) #define AGS_VWAVE_EDIT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_VWAVE_EDIT_BOX, AgsVWaveEditBoxClass)) typedef struct _AgsVWaveEditBox AgsVWaveEditBox; typedef struct _AgsVWaveEditBoxClass AgsVWaveEditBoxClass; struct _AgsVWaveEditBox { AgsWaveEditBox wave_edit_box; }; struct _AgsVWaveEditBoxClass { AgsWaveEditBoxClass wave_edit_box; }; GType ags_vwave_edit_box_get_type(void); AgsVWaveEditBox* ags_vwave_edit_box_new(); G_END_DECLS #endif /*__AGS_VWAVE_EDIT_BOX_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_meta_callbacks.c0000644000175000017500000000201413616617253021241 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_automation_meta_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsAutomationMeta *automation_meta) { ags_automation_meta_refresh(automation_meta); } gsequencer-3.1.3/ags/X/editor/ags_automation_edit_box.c0000644000175000017500000001336313607210263020110 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_automation_edit_box_class_init(AgsAutomationEditBoxClass *automation_edit_box); void ags_automation_edit_box_init(AgsAutomationEditBox *automation_edit_box); void ags_automation_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_automation_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_automation_edit_box_finalize(GObject *gobject); GType ags_automation_edit_box_child_type(GtkContainer *container); /** * SECTION:ags_automation_edit_box * @short_description: abstract box widget * @title: AgsAutomationEditBox * @section_id: * @include: ags/widget/ags_automation_edit_box.h * * The #AgsAutomationEditBox is an abstract box widget containing #AgsAutomationEdit. */ enum{ PROP_0, PROP_FIXED_EDIT_WIDTH, PROP_FIXED_EDIT_HEIGHT, }; static gpointer ags_automation_edit_box_parent_class = NULL; GType ags_automation_edit_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation_edit_box = 0; static const GTypeInfo ags_automation_edit_box_info = { sizeof (AgsAutomationEditBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_automation_edit_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAutomationEditBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_automation_edit_box_init, }; ags_type_automation_edit_box = g_type_register_static(GTK_TYPE_BOX, "AgsAutomationEditBox", &ags_automation_edit_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation_edit_box); } return g_define_type_id__volatile; } void ags_automation_edit_box_class_init(AgsAutomationEditBoxClass *automation_edit_box) { GObjectClass *gobject; GtkContainerClass *container; GParamSpec *param_spec; ags_automation_edit_box_parent_class = g_type_class_peek_parent(automation_edit_box); /* GObjectClass */ gobject = (GObjectClass *) automation_edit_box; gobject->set_property = ags_automation_edit_box_set_property; gobject->get_property = ags_automation_edit_box_get_property; gobject->finalize = ags_automation_edit_box_finalize; /* properties */ /** * AgsAutomationEditBox:fixed-edit-height: * * The fixed height of a edit. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fixed-edit-height", "fixed edit height", "The fixed height of a edit", 0, G_MAXUINT, AGS_AUTOMATION_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_EDIT_HEIGHT, param_spec); /* GtkContainerClass */ container = (GtkContainerClass *) automation_edit_box; container->child_type = ags_automation_edit_box_child_type; } void ags_automation_edit_box_init(AgsAutomationEditBox *automation_edit_box) { g_object_set(automation_edit_box, "homogeneous", FALSE, "spacing", 0, NULL); automation_edit_box->flags = 0; automation_edit_box->fixed_edit_height = AGS_AUTOMATION_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT; } void ags_automation_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAutomationEditBox *automation_edit_box; automation_edit_box = AGS_AUTOMATION_EDIT_BOX(gobject); switch(prop_id){ case PROP_FIXED_EDIT_HEIGHT: { automation_edit_box->fixed_edit_height = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAutomationEditBox *automation_edit_box; automation_edit_box = AGS_AUTOMATION_EDIT_BOX(gobject); switch(prop_id){ case PROP_FIXED_EDIT_HEIGHT: { g_value_set_uint(value, automation_edit_box->fixed_edit_height); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_edit_box_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_automation_edit_box_parent_class)->finalize(gobject); } GType ags_automation_edit_box_child_type(GtkContainer *container) { return(AGS_TYPE_AUTOMATION_EDIT); } /** * ags_automation_edit_box_new: * * Create a new instance of #AgsAutomationEditBox. * * Returns: the new #AgsAutomationEditBox instance * * Since: 3.0.0 */ AgsAutomationEditBox* ags_automation_edit_box_new() { AgsAutomationEditBox *automation_edit_box; automation_edit_box = (AgsAutomationEditBox *) g_object_new(AGS_TYPE_AUTOMATION_EDIT_BOX, NULL); return(automation_edit_box); } gsequencer-3.1.3/ags/X/editor/ags_envelope_editor_callbacks.h0000644000175000017500000000466213607210263021244 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_EDITOR_CALLBACKS_H__ #define __AGS_ENVELOPE_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_envelope_editor_preset_callback(GtkWidget *combo_box, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_preset_add_callback(GtkWidget *button, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_preset_remove_callback(GtkWidget *button, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_preset_rename_response_callback(GtkWidget *widget, gint response, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_attack_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_attack_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_decay_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_decay_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_sustain_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_sustain_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_release_x_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_release_y_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); void ags_envelope_editor_ratio_callback(GtkWidget *range, AgsEnvelopeEditor *envelope_editor); G_END_DECLS #endif /*__AGS_ENVELOPE_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_meta.h0000644000175000017500000000440113616617253016033 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_META_H__ #define __AGS_WAVE_META_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_META (ags_wave_meta_get_type()) #define AGS_WAVE_META(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_META, AgsWaveMeta)) #define AGS_WAVE_META_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_META, AgsWaveMetaClass)) #define AGS_IS_WAVE_META(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE_META)) #define AGS_IS_WAVE_META_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE_META)) #define AGS_WAVE_META_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_WAVE_META, AgsWaveMetaClass)) typedef struct _AgsWaveMeta AgsWaveMeta; typedef struct _AgsWaveMetaClass AgsWaveMetaClass; typedef enum{ AGS_WAVE_META_CONNECTED = 1, AGS_WAVE_META_ENABLED = 1 << 1, }AgsWaveMetaFlags; struct _AgsWaveMeta { GtkVBox vbox; guint flags; GtkLabel *machine_type; GtkLabel *machine_name; GtkLabel *audio_channels; GtkLabel *output_pads; GtkLabel *input_pads; GtkLabel *editor_tool; GtkLabel *active_audio_channel; GtkLabel *cursor_x_position; }; struct _AgsWaveMetaClass { GtkVBoxClass vbox; }; GType ags_wave_meta_get_type(void); void ags_wave_meta_refresh(AgsWaveMeta *wave_meta); AgsWaveMeta* ags_wave_meta_new(); G_END_DECLS #endif /*__AGS_WAVE_META_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c0000644000175000017500000000263713605312647025103 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_position_automation_cursor_dialog_response_callback(GtkWidget *dialog, gint response, AgsPositionAutomationCursorDialog *position_automation_cursor_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(position_automation_cursor_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) position_automation_cursor_dialog); } } } } gsequencer-3.1.3/ags/X/editor/ags_sheet_toolbar.h0000644000175000017500000000503313607210263016705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_TOOLBAR_H__ #define __AGS_SHEET_TOOLBAR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SHEET_TOOLBAR (ags_sheet_toolbar_get_type()) #define AGS_SHEET_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SHEET_TOOLBAR, AgsSheetToolbar)) #define AGS_SHEET_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SHEET_TOOLBAR, AgsSheetToolbarClass)) #define AGS_IS_SHEET_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SHEET_TOOLBAR)) #define AGS_IS_SHEET_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SHEET_TOOLBAR)) #define AGS_SHEET_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SHEET_TOOLBAR, AgsSheetToolbarClass)) typedef struct _AgsSheetToolbar AgsSheetToolbar; typedef struct _AgsSheetToolbarClass AgsSheetToolbarClass; typedef enum{ AGS_SHEET_TOOLBAR_CONNECTED = 1, }AgsSheetToolbarFlags; struct _AgsSheetToolbar { GtkToolbar toolbar; guint flags; GtkToggleToolButton *position; GtkMenuToolButton *edit_tool; GtkToggleToolButton *clear; GtkToggleToolButton *select; GtkToolButton *copy; GtkToolButton *cut; GtkMenuToolButton *paste_tool; GtkButton *invert; GtkMenuToolButton *menu_tool; GtkMenu *tool_popup; GtkDialog *move_note; GtkDialog *crop_note; GtkDialog *select_note; GtkDialog *position_sheet_cursor; guint zoom_history; GtkComboBoxText *zoom; GtkSpinButton *opacity; }; struct _AgsSheetToolbarClass { GtkToolbarClass toolbar; }; GType ags_sheet_toolbar_get_type(void); AgsSheetToolbar* ags_sheet_toolbar_new(); G_END_DECLS #endif /*__AGS_SHEET_TOOLBAR_H__*/ gsequencer-3.1.3/ags/X/editor/ags_vautomation_edit_box.c0000644000175000017500000000553413607210263020277 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_vautomation_edit_box_class_init(AgsVAutomationEditBoxClass *vautomation_edit_box); void ags_vautomation_edit_box_init(AgsVAutomationEditBox *vautomation_edit_box); /** * SECTION:ags_vautomation_edit_box * @short_description: vertical box widget * @title: AgsVAutomationEditBox * @section_id: * @include: ags/widget/ags_vautomation_edit_box.h * * The #AgsVAutomationEditBox is an horizontal box widget containing #AgsAutomationEdit. */ GType ags_vautomation_edit_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_vautomation_edit_box = 0; static const GTypeInfo ags_vautomation_edit_box_info = { sizeof (AgsVAutomationEditBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_vautomation_edit_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVAutomationEditBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_vautomation_edit_box_init, }; ags_type_vautomation_edit_box = g_type_register_static(AGS_TYPE_AUTOMATION_EDIT_BOX, "AgsVAutomationEditBox", &ags_vautomation_edit_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_vautomation_edit_box); } return g_define_type_id__volatile; } void ags_vautomation_edit_box_class_init(AgsVAutomationEditBoxClass *vautomation_edit_box) { } void ags_vautomation_edit_box_init(AgsVAutomationEditBox *vautomation_edit_box) { gtk_orientable_set_orientation(GTK_ORIENTABLE(vautomation_edit_box), GTK_ORIENTATION_VERTICAL); } /** * ags_vautomation_edit_box_new: * * Create a new instance of #AgsVAutomationEditBox. * * Returns: the new #AgsVAutomationEditBox instance * * Since: 3.0.0 */ AgsVAutomationEditBox* ags_vautomation_edit_box_new() { AgsVAutomationEditBox *vautomation_edit_box; vautomation_edit_box = (AgsVAutomationEditBox *) g_object_new(AGS_TYPE_VAUTOMATION_EDIT_BOX, NULL); return(vautomation_edit_box); } gsequencer-3.1.3/ags/X/editor/ags_crop_note_dialog_callbacks.c0000644000175000017500000000345213605312647021366 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_crop_note_dialog_response_callback(GtkWidget *dialog, gint response, AgsCropNoteDialog *crop_note_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(crop_note_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) crop_note_dialog); } } } } void ags_crop_note_dialog_absolute_callback(GtkWidget *button, AgsCropNoteDialog *crop_note_dialog) { if(gtk_toggle_button_get_active((GtkToggleButton *) crop_note_dialog->absolute)){ gtk_spin_button_set_range(crop_note_dialog->crop_note, 0.0, AGS_CROP_NOTE_DIALOG_MAX_WIDTH); }else{ gtk_spin_button_set_range(crop_note_dialog->crop_note, -1.0 * AGS_CROP_NOTE_DIALOG_MAX_WIDTH, AGS_CROP_NOTE_DIALOG_MAX_WIDTH); } } gsequencer-3.1.3/ags/X/editor/ags_machine_selector.h0000644000175000017500000000625213607210263017363 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_SELECTOR_H__ #define __AGS_MACHINE_SELECTOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE_SELECTOR (ags_machine_selector_get_type()) #define AGS_MACHINE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE_SELECTOR, AgsMachineSelector)) #define AGS_MACHINE_SELECTOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE_SELECTOR, AgsMachineSelectorClass)) #define AGS_IS_MACHINE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MACHINE_SELECTOR)) #define AGS_IS_MACHINE_SELECTOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MACHINE_SELECTOR)) #define AGS_MACHINE_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_MACHINE_SELECTOR, AgsMachineSelectorClass)) typedef struct _AgsMachineSelector AgsMachineSelector; typedef struct _AgsMachineSelectorClass AgsMachineSelectorClass; typedef enum{ AGS_MACHINE_SELECTOR_CONNECTED = 1, AGS_MACHINE_SELECTOR_SHOW_REVERSE_MAPPING = 1 << 1, AGS_MACHINE_SELECTOR_SHOW_SHIFT_PIANO = 1 << 2, AGS_MACHINE_SELECTOR_NOTATION = 1 << 3, AGS_MACHINE_SELECTOR_AUTOMATION = 1 << 4, AGS_MACHINE_SELECTOR_WAVE = 1 << 5, AGS_MACHINE_SELECTOR_BLOCK_REVERSE_MAPPING = 1 << 6, }AgsMachineSelectorFlags; struct _AgsMachineSelector { GtkVBox vbox; guint flags; GtkLabel *label; GtkMenuToolButton *menu_button; GtkMenu *popup; GtkWidget *current; GtkDialog *machine_selection; }; struct _AgsMachineSelectorClass { GtkVBoxClass vbox; void (*changed)(AgsMachineSelector *machine_selector, AgsMachine *machine); }; GType ags_machine_selector_get_type(void); void ags_machine_selector_add_index(AgsMachineSelector *machine_selector); void ags_machine_selector_remove_index(AgsMachineSelector *machine_selector, guint nth); void ags_machine_selector_link_index(AgsMachineSelector *machine_selector, AgsMachine *machine); void ags_machine_selector_changed(AgsMachineSelector *machine_selector, AgsMachine *machine); GtkMenu* ags_machine_selector_popup_new(AgsMachineSelector *machine_selector); AgsMachineSelector* ags_machine_selector_new(); G_END_DECLS #endif /*__AGS_MACHINE_SELECTOR_H__*/ gsequencer-3.1.3/ags/X/editor/ags_scrolled_automation_edit_box.h0000644000175000017500000000505213607210263022000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCROLLED_AUTOMATION_EDIT_BOX_H__ #define __AGS_SCROLLED_AUTOMATION_EDIT_BOX_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX (ags_scrolled_automation_edit_box_get_type()) #define AGS_SCROLLED_AUTOMATION_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX, AgsScrolledAutomationEditBox)) #define AGS_SCROLLED_AUTOMATION_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX, AgsScrolledAutomationEditBoxClass)) #define AGS_IS_SCROLLED_AUTOMATION_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX)) #define AGS_IS_SCROLLED_AUTOMATION_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX)) #define AGS_SCROLLED_AUTOMATION_EDIT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX, AgsScrolledAutomationEditBoxClass)) typedef struct _AgsScrolledAutomationEditBox AgsScrolledAutomationEditBox; typedef struct _AgsScrolledAutomationEditBoxClass AgsScrolledAutomationEditBoxClass; struct _AgsScrolledAutomationEditBox { GtkBin bin; guint margin_top; guint margin_bottom; guint margin_left; guint margin_right; GtkViewport *viewport; AgsAutomationEditBox *automation_edit_box; }; struct _AgsScrolledAutomationEditBoxClass { GtkBinClass bin; }; GType ags_scrolled_automation_edit_box_get_type(void); AgsScrolledAutomationEditBox* ags_scrolled_automation_edit_box_new(); G_END_DECLS #endif /*__AGS_SCROLLED_AUTOMATION_EDIT_BOX_H__*/ gsequencer-3.1.3/ags/X/editor/ags_position_notation_cursor_dialog.h0000644000175000017500000000545513607210263022556 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_POSITION_NOTATION_CURSOR_DIALOG_H__ #define __AGS_POSITION_NOTATION_CURSOR_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG (ags_position_notation_cursor_dialog_get_type()) #define AGS_POSITION_NOTATION_CURSOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG, AgsPositionNotationCursorDialog)) #define AGS_POSITION_NOTATION_CURSOR_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG, AgsPositionNotationCursorDialogClass)) #define AGS_IS_POSITION_NOTATION_CURSOR_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG)) #define AGS_IS_POSITION_NOTATION_CURSOR_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG)) #define AGS_POSITION_NOTATION_CURSOR_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG, AgsPositionNotationCursorDialogClass)) #define AGS_POSITION_NOTATION_CURSOR_MAX_BEATS (16 * 1200) #define AGS_POSITION_NOTATION_CURSOR_MAX_KEYS (1024) typedef struct _AgsPositionNotationCursorDialog AgsPositionNotationCursorDialog; typedef struct _AgsPositionNotationCursorDialogClass AgsPositionNotationCursorDialogClass; typedef enum{ AGS_POSITION_NOTATION_CURSOR_DIALOG_CONNECTED = 1, }AgsPositionNotationCursorDialogFlags; struct _AgsPositionNotationCursorDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *set_focus; GtkSpinButton *position_x; GtkSpinButton *position_y; }; struct _AgsPositionNotationCursorDialogClass { GtkDialogClass dialog; }; GType ags_position_notation_cursor_dialog_get_type(void); AgsPositionNotationCursorDialog* ags_position_notation_cursor_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_POSITION_NOTATION_CURSOR_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_scrolled_wave_edit_box.c0000644000175000017500000002471713607210263020566 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_scrolled_wave_edit_box_class_init(AgsScrolledWaveEditBoxClass *scrolled_wave_edit_box); void ags_scrolled_wave_edit_box_init(AgsScrolledWaveEditBox *scrolled_wave_edit_box); void ags_scrolled_wave_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_scrolled_wave_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_scrolled_wave_edit_box_finalize(GObject *gobject); void ags_scrolled_wave_edit_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_scrolled_wave_edit_box_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_scrolled_wave_edit_box_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); /** * SECTION:ags_scrolled_wave_edit_box * @short_description: scrolled wave_edit box widget * @title: AgsScrolledWaveEditBox * @section_id: * @include: ags/widget/ags_scrolled_wave_edit_box.h * * The #AgsScrolledWaveEditBox lets you to have a scrolled wave_edit box widget. */ enum{ PROP_0, PROP_MARGIN_TOP, PROP_MARGIN_BOTTOM, PROP_MARGIN_LEFT, PROP_MARGIN_RIGHT, }; static gpointer ags_scrolled_wave_edit_box_parent_class = NULL; GType ags_scrolled_wave_edit_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scrolled_wave_edit_box = 0; static const GTypeInfo ags_scrolled_wave_edit_box_info = { sizeof (AgsScrolledWaveEditBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scrolled_wave_edit_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsScrolledWaveEditBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scrolled_wave_edit_box_init, }; ags_type_scrolled_wave_edit_box = g_type_register_static(GTK_TYPE_BIN, "AgsScrolledWaveEditBox", &ags_scrolled_wave_edit_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scrolled_wave_edit_box); } return g_define_type_id__volatile; } void ags_scrolled_wave_edit_box_class_init(AgsScrolledWaveEditBoxClass *scrolled_wave_edit_box) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_scrolled_wave_edit_box_parent_class = g_type_class_peek_parent(scrolled_wave_edit_box); /* GObjectClass */ gobject = (GObjectClass *) scrolled_wave_edit_box; gobject->set_property = ags_scrolled_wave_edit_box_set_property; gobject->get_property = ags_scrolled_wave_edit_box_get_property; gobject->finalize = ags_scrolled_wave_edit_box_finalize; /* properties */ /** * AgsScrolledWaveEditBox:margin-top: * * The margin top. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-top", "margin top", "The margin top", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_TOP, param_spec); /** * AgsScrolledWaveEditBox:margin-bottom: * * The margin bottom. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-bottom", "margin bottom", "The margin bottom", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_BOTTOM, param_spec); /** * AgsScrolledWaveEditBox:margin-left: * * The margin left. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-left", "margin left", "The margin left", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_LEFT, param_spec); /** * AgsScrolledWaveEditBox:margin-right: * * The margin right. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-right", "margin right", "The margin right", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_RIGHT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) scrolled_wave_edit_box; // widget->size_allocate = ags_scrolled_wave_edit_box_size_allocate; // widget->get_preferred_width = ags_scrolled_wave_edit_box_get_preferred_width; // widget->get_preferred_height = ags_scrolled_wave_edit_box_get_preferred_height; } void ags_scrolled_wave_edit_box_init(AgsScrolledWaveEditBox *scrolled_wave_edit_box) { scrolled_wave_edit_box->margin_top = 0; scrolled_wave_edit_box->margin_bottom = 0; scrolled_wave_edit_box->margin_left = 0; scrolled_wave_edit_box->margin_right = 0; /* viewport */ scrolled_wave_edit_box->viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); gtk_widget_set_vexpand(scrolled_wave_edit_box->viewport, TRUE); gtk_widget_set_hexpand(scrolled_wave_edit_box->viewport, TRUE); g_object_set(scrolled_wave_edit_box->viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_container_add((GtkContainer *) scrolled_wave_edit_box, (GtkWidget *) scrolled_wave_edit_box->viewport); /* wave_edit box */ scrolled_wave_edit_box->wave_edit_box = NULL; #if 0 scrolled_wave_edit_box->wave_edit_box = ags_vwave_edit_box_new(); gtk_container_add(scrolled_wave_edit_box->viewport, scrolled_wave_edit_box->wave_edit_box); #endif } void ags_scrolled_wave_edit_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsScrolledWaveEditBox *scrolled_wave_edit_box; scrolled_wave_edit_box = AGS_SCROLLED_WAVE_EDIT_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { scrolled_wave_edit_box->margin_top = g_value_get_uint(value); } break; case PROP_MARGIN_BOTTOM: { scrolled_wave_edit_box->margin_bottom = g_value_get_uint(value); } break; case PROP_MARGIN_LEFT: { scrolled_wave_edit_box->margin_left = g_value_get_uint(value); } break; case PROP_MARGIN_RIGHT: { scrolled_wave_edit_box->margin_right = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_wave_edit_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsScrolledWaveEditBox *scrolled_wave_edit_box; scrolled_wave_edit_box = AGS_SCROLLED_WAVE_EDIT_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { g_value_set_uint(value, scrolled_wave_edit_box->margin_top); } break; case PROP_MARGIN_BOTTOM: { g_value_set_uint(value, scrolled_wave_edit_box->margin_bottom); } break; case PROP_MARGIN_LEFT: { g_value_set_uint(value, scrolled_wave_edit_box->margin_left); } break; case PROP_MARGIN_RIGHT: { g_value_set_uint(value, scrolled_wave_edit_box->margin_right); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_wave_edit_box_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_scrolled_wave_edit_box_parent_class)->finalize(gobject); } void ags_scrolled_wave_edit_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsScrolledWaveEditBox *scrolled_wave_edit_box; AgsApplicationContext *application_context; GtkAllocation child_allocation; GtkRequisition child_requisition; gdouble gui_scale_factor; scrolled_wave_edit_box = AGS_SCROLLED_WAVE_EDIT_BOX(widget); application_context = ags_application_context_get_instance(); GTK_WIDGET_CLASS(ags_scrolled_wave_edit_box_parent_class)->size_allocate(widget, allocation); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); allocation->height = (gint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_HEIGHT); /* viewport allocation */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_wave_edit_box->viewport, &child_requisition); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = allocation->width; child_allocation.height = allocation->height; gtk_widget_size_allocate((GtkWidget *) scrolled_wave_edit_box->viewport, &child_allocation); /* box */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_wave_edit_box->wave_edit_box, &child_requisition); child_allocation.x = 0; child_allocation.y = 0; child_allocation.width = allocation->width; child_allocation.height = child_requisition.height; gtk_widget_size_allocate((GtkWidget *) scrolled_wave_edit_box->wave_edit_box, &child_allocation); } void ags_scrolled_wave_edit_box_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width = natural_width = NULL; } void ags_scrolled_wave_edit_box_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height = natural_height = NULL; } /** * ags_scrolled_wave_edit_box_new: * * Create a new #AgsScrolledWaveEditBox. * * Returns: a new #AgsScrolledWaveEditBox * * Since: 3.0.0 */ AgsScrolledWaveEditBox* ags_scrolled_wave_edit_box_new() { AgsScrolledWaveEditBox *scrolled_wave_edit_box; scrolled_wave_edit_box = (AgsScrolledWaveEditBox *) g_object_new(AGS_TYPE_SCROLLED_WAVE_EDIT_BOX, NULL); return(scrolled_wave_edit_box); } gsequencer-3.1.3/ags/X/editor/ags_automation_toolbar.h0000644000175000017500000000623513607210263017762 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_TOOLBAR_H__ #define __AGS_AUTOMATION_TOOLBAR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION_TOOLBAR (ags_automation_toolbar_get_type()) #define AGS_AUTOMATION_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION_TOOLBAR, AgsAutomationToolbar)) #define AGS_AUTOMATION_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION_TOOLBAR, AgsAutomationToolbarClass)) #define AGS_IS_AUTOMATION_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTOMATION_TOOLBAR)) #define AGS_IS_AUTOMATION_TOOLBAR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTOMATION_TOOLBAR)) #define AGS_AUTOMATION_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUTOMATION_TOOLBAR, AgsAutomationToolbarClass)) #define AGS_AUTOMATION_TOOLBAR_DATA_CHANNEL "ags-channel" #define AGS_AUTOMATION_TOOLBAR_DATA_PORT "ags-port" typedef struct _AgsAutomationToolbar AgsAutomationToolbar; typedef struct _AgsAutomationToolbarClass AgsAutomationToolbarClass; typedef enum{ AGS_AUTOMATION_TOOLBAR_CONNECTED = 1, AGS_AUTOMATION_TOOLBAR_RESET_PORT = 1 << 1, }AgsAutomationToolbarFlags; struct _AgsAutomationToolbar { GtkToolbar toolbar; guint flags; GtkToggleToolButton *selected_edit_mode; GtkToggleToolButton *position; GtkToggleToolButton *edit; GtkToggleToolButton *clear; GtkToggleToolButton *select; GtkToolButton *copy; GtkToolButton *cut; GtkMenuToolButton *paste_tool; GtkMenuToolButton *menu_tool; GtkMenu *tool_popup; GtkDialog *select_acceleration; GtkDialog *ramp_acceleration; GtkDialog *position_automation_cursor; guint zoom_history; GtkComboBox *zoom; GtkComboBox *port; GtkSpinButton *opacity; }; struct _AgsAutomationToolbarClass { GtkToolbarClass toolbar; }; GType ags_automation_toolbar_get_type(void); void ags_automation_toolbar_load_port(AgsAutomationToolbar *automation_toolbar); void ags_automation_toolbar_apply_port(AgsAutomationToolbar *automation_toolbar, GType channel_type, gchar *control_name); GtkMenu* ags_automation_toolbar_tool_popup_new(AgsAutomationToolbar *automation_toolbar); AgsAutomationToolbar* ags_automation_toolbar_new(); G_END_DECLS #endif /*__AGS_AUTOMATION_TOOLBAR_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_edit.h0000644000175000017500000001124413607210263016023 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EDIT_H__ #define __AGS_WAVE_EDIT_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_EDIT (ags_wave_edit_get_type()) #define AGS_WAVE_EDIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_EDIT, AgsWaveEdit)) #define AGS_WAVE_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_EDIT, AgsWaveEditClass)) #define AGS_IS_WAVE_EDIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE_EDIT)) #define AGS_IS_WAVE_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE_EDIT)) #define AGS_WAVE_EDIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_WAVE_EDIT, AgsWaveEditClass)) #define AGS_WAVE_EDIT_DEFAULT_HEIGHT (512) #define AGS_WAVE_EDIT_DEFAULT_WIDTH (512) #define AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH (64) #define AGS_WAVE_EDIT_DEFAULT_CONTROL_HEIGHT (8) #define AGS_WAVE_EDIT_DEFAULT_STEP_COUNT (16) #define AGS_WAVE_EDIT_DEFAULT_CURSOR_POSITION_X (0) #define AGS_WAVE_EDIT_DEFAULT_CURSOR_POSITION_Y (0.0) #define AGS_WAVE_EDIT_DEFAULT_SELECTED_BUFFER_BORDER (2) #define AGS_WAVE_EDIT_DEFAULT_FADER_WIDTH (3) #define AGS_WAVE_EDIT_CURSOR_WIDTH (5) #define AGS_WAVE_EDIT_CURSOR_HEIGHT (5) #define AGS_WAVE_EDIT_MIN_ZOOM (1.0 / 16.0) #define AGS_WAVE_EDIT_MAX_ZOOM (4.0) #define AGS_WAVE_EDIT_DEFAULT_LOWER (0.0) #define AGS_WAVE_EDIT_DEFAULT_UPPER (1.0) #define AGS_WAVE_EDIT_DEFAULT_VALUE (0.0) #define AGS_WAVE_EDIT_DEFAULT_PADDING (8) #define AGS_WAVE_EDIT_X_RESOLUTION (16.0 * 64.0) typedef struct _AgsWaveEdit AgsWaveEdit; typedef struct _AgsWaveEditClass AgsWaveEditClass; typedef enum{ AGS_WAVE_EDIT_CONNECTED = 1, AGS_WAVE_EDIT_AUTO_SCROLL = 1 << 1, AGS_WAVE_EDIT_SHOW_RULER = 1 << 2, AGS_WAVE_EDIT_SHOW_VSCROLLBAR = 1 << 3, AGS_WAVE_EDIT_SHOW_HSCROLLBAR = 1 << 4, }AgsWaveEditFlags; typedef enum{ AGS_WAVE_EDIT_NO_EDIT_MODE, AGS_WAVE_EDIT_POSITION_CURSOR, AGS_WAVE_EDIT_SELECT_BUFFER, }AgsWaveEditMode; typedef enum{ AGS_WAVE_EDIT_BUTTON_1 = 1, }AgsWaveEditButtonMask; typedef enum{ AGS_WAVE_EDIT_KEY_L_CONTROL = 1, AGS_WAVE_EDIT_KEY_R_CONTROL = 1 << 1, AGS_WAVE_EDIT_KEY_L_SHIFT = 1 << 2, AGS_WAVE_EDIT_KEY_R_SHIFT = 1 << 3, }AgsWaveEditKeyMask; struct _AgsWaveEdit { GtkTable table; guint flags; guint mode; guint button_mask; guint key_mask; guint line; guint note_offset; guint note_offset_absolute; guint control_width; guint control_height; guint step_count; guint cursor_position_x; gdouble cursor_position_y; guint selected_buffer_border; guint selection_x0; guint selection_x1; guint selection_y0; guint selection_y1; AgsRuler *ruler; gdouble lower; gdouble upper; gdouble default_value; GtkDrawingArea *drawing_area; unsigned char *wave_data; int stride; GtkVScrollbar *vscrollbar; GtkHScrollbar *hscrollbar; }; struct _AgsWaveEditClass { GtkTableClass table; }; GType ags_wave_edit_get_type(void); void ags_wave_edit_reset_vscrollbar(AgsWaveEdit *wave_edit); void ags_wave_edit_reset_hscrollbar(AgsWaveEdit *wave_edit); void ags_wave_edit_draw_segment(AgsWaveEdit *wave_edit, cairo_t *cr); void ags_wave_edit_draw_position(AgsWaveEdit *wave_edit, cairo_t *cr); void ags_wave_edit_draw_cursor(AgsWaveEdit *wave_edit, cairo_t *cr); void ags_wave_edit_draw_selection(AgsWaveEdit *wave_edit, cairo_t *cr); void ags_wave_edit_draw_buffer(AgsWaveEdit *wave_edit, AgsBuffer *buffer, cairo_t *cr, gdouble bpm, gdouble opacity); void ags_wave_edit_draw_wave(AgsWaveEdit *wave_edit, cairo_t *cr); void ags_wave_edit_draw(AgsWaveEdit *wave_edit, cairo_t *cr); AgsWaveEdit* ags_wave_edit_new(guint line); G_END_DECLS #endif /*__AGS_WAVE_EDIT_H__*/ gsequencer-3.1.3/ags/X/editor/ags_select_acceleration_dialog_callbacks.h0000644000175000017500000000353413607210263023365 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SELECT_ACCELERATION_DIALOG_CALLBACKS_H__ #define __AGS_SELECT_ACCELERATION_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_select_acceleration_dialog_response_callback(GtkWidget *dialog, gint response, AgsSelectAccelerationDialog *select_acceleration_dialog); void ags_select_acceleration_dialog_add_callback(GtkWidget *button, AgsSelectAccelerationDialog *select_acceleration_dialog); void ags_select_acceleration_dialog_remove_callback(GtkWidget *button, AgsSelectAccelerationDialog *select_acceleration_dialog); void ags_select_acceleration_dialog_machine_changed_callback(AgsAutomationEditor *automation_editor, AgsMachine *machine, AgsSelectAccelerationDialog *select_acceleration_dialog); G_END_DECLS #endif /*__AGS_SELECT_ACCELERATION_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_select_buffer_dialog_callbacks.c0000644000175000017500000000247213607210263022200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_select_buffer_dialog_response_callback(GtkWidget *dialog, gint response, AgsSelectBufferDialog *select_buffer_dialog) { gboolean hide_dialog; hide_dialog = TRUE; switch(response){ case GTK_RESPONSE_APPLY: { hide_dialog = FALSE; } case GTK_RESPONSE_OK: { ags_applicable_apply(AGS_APPLICABLE(select_buffer_dialog)); } case GTK_RESPONSE_CANCEL: { if(hide_dialog){ gtk_widget_hide((GtkWidget *) select_buffer_dialog); } } } } gsequencer-3.1.3/ags/X/editor/ags_select_buffer_dialog.c0000644000175000017500000003532713607210263020206 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_select_buffer_dialog_class_init(AgsSelectBufferDialogClass *select_buffer_dialog); void ags_select_buffer_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_select_buffer_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_select_buffer_dialog_init(AgsSelectBufferDialog *select_buffer_dialog); void ags_select_buffer_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_select_buffer_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_select_buffer_dialog_finalize(GObject *gobject); void ags_select_buffer_dialog_connect(AgsConnectable *connectable); void ags_select_buffer_dialog_disconnect(AgsConnectable *connectable); void ags_select_buffer_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_select_buffer_dialog_apply(AgsApplicable *applicable); void ags_select_buffer_dialog_reset(AgsApplicable *applicable); gboolean ags_select_buffer_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_select_buffer_dialog * @short_description: select tool * @title: AgsSelectBufferDialog * @section_id: * @include: ags/X/editor/ags_select_buffer_dialog.h * * The #AgsSelectBufferDialog lets you select buffers. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_select_buffer_dialog_parent_class = NULL; GType ags_select_buffer_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_select_buffer_dialog = 0; static const GTypeInfo ags_select_buffer_dialog_info = { sizeof (AgsSelectBufferDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_select_buffer_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSelectBufferDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_select_buffer_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_select_buffer_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_select_buffer_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_select_buffer_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsSelectBufferDialog", &ags_select_buffer_dialog_info, 0); g_type_add_interface_static(ags_type_select_buffer_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_select_buffer_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_select_buffer_dialog); } return g_define_type_id__volatile; } void ags_select_buffer_dialog_class_init(AgsSelectBufferDialogClass *select_buffer_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_select_buffer_dialog_parent_class = g_type_class_peek_parent(select_buffer_dialog); /* GObjectClass */ gobject = (GObjectClass *) select_buffer_dialog; gobject->set_property = ags_select_buffer_dialog_set_property; gobject->get_property = ags_select_buffer_dialog_get_property; gobject->finalize = ags_select_buffer_dialog_finalize; /* properties */ /** * AgsSelectBufferDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) select_buffer_dialog; widget->delete_event = ags_select_buffer_dialog_delete_event; } void ags_select_buffer_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_select_buffer_dialog_connect; connectable->disconnect = ags_select_buffer_dialog_disconnect; } void ags_select_buffer_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_select_buffer_dialog_set_update; applicable->apply = ags_select_buffer_dialog_apply; applicable->reset = ags_select_buffer_dialog_reset; } void ags_select_buffer_dialog_init(AgsSelectBufferDialog *select_buffer_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; select_buffer_dialog->flags = 0; g_object_set(select_buffer_dialog, "title", i18n("select buffers"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(select_buffer_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* copy selection */ select_buffer_dialog->copy_selection = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("copy selection")); gtk_toggle_button_set_active((GtkToggleButton *) select_buffer_dialog->copy_selection, TRUE); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(select_buffer_dialog->copy_selection), FALSE, FALSE, 0); /* select x0 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select x0 - label */ label = (GtkLabel *) gtk_label_new(i18n("select x0")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select x0 - spin button */ select_buffer_dialog->select_x0 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_BUFFER_MAX_BEATS, 0.25); gtk_spin_button_set_digits(select_buffer_dialog->select_x0, 2); gtk_spin_button_set_value(select_buffer_dialog->select_x0, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_buffer_dialog->select_x0), FALSE, FALSE, 0); /* select x1 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select x1 - label */ label = (GtkLabel *) gtk_label_new(i18n("select x1")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select x1 - spin button */ select_buffer_dialog->select_x1 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_BUFFER_MAX_BEATS, 0.25); gtk_spin_button_set_digits(select_buffer_dialog->select_x1, 2); gtk_spin_button_set_value(select_buffer_dialog->select_x1, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_buffer_dialog->select_x1), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) select_buffer_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_select_buffer_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSelectBufferDialog *select_buffer_dialog; select_buffer_dialog = AGS_SELECT_BUFFER_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) select_buffer_dialog->main_window == main_window){ return; } if(select_buffer_dialog->main_window != NULL){ g_object_unref(select_buffer_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } select_buffer_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_select_buffer_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSelectBufferDialog *select_buffer_dialog; select_buffer_dialog = AGS_SELECT_BUFFER_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, select_buffer_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_select_buffer_dialog_connect(AgsConnectable *connectable) { AgsSelectBufferDialog *select_buffer_dialog; select_buffer_dialog = AGS_SELECT_BUFFER_DIALOG(connectable); if((AGS_SELECT_BUFFER_DIALOG_CONNECTED & (select_buffer_dialog->flags)) != 0){ return; } select_buffer_dialog->flags |= AGS_SELECT_BUFFER_DIALOG_CONNECTED; g_signal_connect(select_buffer_dialog, "response", G_CALLBACK(ags_select_buffer_dialog_response_callback), select_buffer_dialog); } void ags_select_buffer_dialog_disconnect(AgsConnectable *connectable) { AgsSelectBufferDialog *select_buffer_dialog; select_buffer_dialog = AGS_SELECT_BUFFER_DIALOG(connectable); if((AGS_SELECT_BUFFER_DIALOG_CONNECTED & (select_buffer_dialog->flags)) == 0){ return; } select_buffer_dialog->flags &= (~AGS_SELECT_BUFFER_DIALOG_CONNECTED); g_object_disconnect(G_OBJECT(select_buffer_dialog), "any_signal::response", G_CALLBACK(ags_select_buffer_dialog_response_callback), select_buffer_dialog, NULL); } void ags_select_buffer_dialog_finalize(GObject *gobject) { AgsSelectBufferDialog *select_buffer_dialog; select_buffer_dialog = (AgsSelectBufferDialog *) gobject; G_OBJECT_CLASS(ags_select_buffer_dialog_parent_class)->finalize(gobject); } void ags_select_buffer_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_select_buffer_dialog_apply(AgsApplicable *applicable) { AgsSelectBufferDialog *select_buffer_dialog; AgsWindow *window; AgsWaveEditor *wave_editor; AgsMachine *machine; AgsAudio *audio; AgsTimestamp *timestamp; GObject *output_soundcard; xmlDoc *clipboard; xmlNode *audio_node, *wave_node; GList *start_list_wave, *list_wave; xmlChar *buffer; guint samplerate; guint buffer_size; gdouble delay; guint64 relative_offset; int size; guint x0, y0; guint x1, y1; gint i; gboolean copy_selection; select_buffer_dialog = AGS_SELECT_BUFFER_DIALOG(applicable); window = (AgsWindow *) select_buffer_dialog->main_window; wave_editor = window->wave_window->wave_editor; machine = wave_editor->selected_machine; if(machine == NULL){ return; } audio = machine->audio; g_object_get(audio, "output-soundcard", &output_soundcard, "buffer-size", &buffer_size, "samplerate", &samplerate, "wave", &start_list_wave, NULL); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* get some values */ copy_selection = gtk_toggle_button_get_active((GtkToggleButton *) select_buffer_dialog->copy_selection); x0 = gtk_spin_button_get_value_as_int(select_buffer_dialog->select_x0); x0 = delay * buffer_size * x0; x1 = gtk_spin_button_get_value_as_int(select_buffer_dialog->select_x1); x1 = delay * buffer_size * x1; timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; relative_offset = samplerate * AGS_WAVE_DEFAULT_BUFFER_LENGTH; /* select buffer */ if(copy_selection){ /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); } i = 0; while((i = ags_notebook_next_active_tab(wave_editor->notebook, i)) != -1){ list_wave = start_list_wave; timestamp->timer.ags_offset.offset = 0; while((list_wave = ags_wave_find_near_timestamp(list_wave, i, timestamp)) != NULL){ ags_wave_add_region_to_selection(AGS_WAVE(list_wave->data), x0, x1, TRUE); if(copy_selection){ wave_node = ags_wave_copy_selection(AGS_WAVE(list_wave->data)); xmlAddChild(audio_node, wave_node); } /* iterate */ timestamp->timer.ags_offset.offset += relative_offset; list_wave = list_wave->next; } i++; } g_object_unref(timestamp); g_list_free_full(start_list_wave, g_object_unref); g_object_unref(output_soundcard); /* write to clipboard */ if(copy_selection){ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_select_buffer_dialog_reset(AgsApplicable *applicable) { //TODO:JK: implement me } gboolean ags_select_buffer_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_select_buffer_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_select_buffer_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsSelectBufferDialog. * * Returns: a new #AgsSelectBufferDialog * * Since: 3.0.0 */ AgsSelectBufferDialog* ags_select_buffer_dialog_new(GtkWidget *main_window) { AgsSelectBufferDialog *select_buffer_dialog; select_buffer_dialog = (AgsSelectBufferDialog *) g_object_new(AGS_TYPE_SELECT_BUFFER_DIALOG, "main-window", main_window, NULL); return(select_buffer_dialog); } gsequencer-3.1.3/ags/X/editor/ags_machine_radio_button.h0000644000175000017500000000434213607210263020232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_RADIO_BUTTON_H__ #define __AGS_MACHINE_RADIO_BUTTON_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MACHINE_RADIO_BUTTON (ags_machine_radio_button_get_type()) #define AGS_MACHINE_RADIO_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MACHINE_RADIO_BUTTON, AgsMachineRadioButton)) #define AGS_MACHINE_RADIO_BUTTON_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MACHINE_RADIO_BUTTON, AgsMachineRadioButtonClass)) #define AGS_IS_MACHINE_RADIO_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MACHINE_RADIO_BUTTON)) #define AGS_IS_MACHINE_RADIO_BUTTON_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MACHINE_RADIO_BUTTON)) #define AGS_MACHINE_RADIO_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_MACHINE_RADIO_BUTTON, AgsMachineRadioButtonClass)) typedef struct _AgsMachineRadioButton AgsMachineRadioButton; typedef struct _AgsMachineRadioButtonClass AgsMachineRadioButtonClass; struct _AgsMachineRadioButton { GtkRadioButton radio_button; AgsMachine *machine; }; struct _AgsMachineRadioButtonClass { GtkRadioButtonClass radio_button; }; GType ags_machine_radio_button_get_type(void); AgsMachineRadioButton* ags_machine_radio_button_new(); G_END_DECLS #endif /*__AGS_MACHINE_RADIO_BUTTON_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_meta_callbacks.c0000644000175000017500000000173513616617253020034 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_wave_meta_machine_changed_callback(AgsWaveEditor *wave_editor, AgsMachine *machine, AgsWaveMeta *wave_meta) { ags_wave_meta_refresh(wave_meta); } gsequencer-3.1.3/ags/X/editor/ags_scrolled_wave_edit_box.h0000644000175000017500000000456613607210263020573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCROLLED_WAVE_EDIT_BOX_H__ #define __AGS_SCROLLED_WAVE_EDIT_BOX_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SCROLLED_WAVE_EDIT_BOX (ags_scrolled_wave_edit_box_get_type()) #define AGS_SCROLLED_WAVE_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCROLLED_WAVE_EDIT_BOX, AgsScrolledWaveEditBox)) #define AGS_SCROLLED_WAVE_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCROLLED_WAVE_EDIT_BOX, AgsScrolledWaveEditBoxClass)) #define AGS_IS_SCROLLED_WAVE_EDIT_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCROLLED_WAVE_EDIT_BOX)) #define AGS_IS_SCROLLED_WAVE_EDIT_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCROLLED_WAVE_EDIT_BOX)) #define AGS_SCROLLED_WAVE_EDIT_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCROLLED_WAVE_EDIT_BOX, AgsScrolledWaveEditBoxClass)) typedef struct _AgsScrolledWaveEditBox AgsScrolledWaveEditBox; typedef struct _AgsScrolledWaveEditBoxClass AgsScrolledWaveEditBoxClass; struct _AgsScrolledWaveEditBox { GtkBin bin; guint margin_top; guint margin_bottom; guint margin_left; guint margin_right; GtkViewport *viewport; AgsWaveEditBox *wave_edit_box; }; struct _AgsScrolledWaveEditBoxClass { GtkBinClass bin; }; GType ags_scrolled_wave_edit_box_get_type(void); AgsScrolledWaveEditBox* ags_scrolled_wave_edit_box_new(); G_END_DECLS #endif /*__AGS_SCROLLED_WAVE_EDIT_BOX_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_edit.h0000644000175000017500000001125613607210263016717 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_EDIT_H__ #define __AGS_NOTATION_EDIT_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NOTATION_EDIT (ags_notation_edit_get_type ()) #define AGS_NOTATION_EDIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTATION_EDIT, AgsNotationEdit)) #define AGS_NOTATION_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTATION_EDIT, AgsNotationEditClass)) #define AGS_IS_NOTATION_EDIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_NOTATION_EDIT)) #define AGS_IS_NOTATION_EDIT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_NOTATION_EDIT)) #define AGS_NOTATION_EDIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_NOTATION_EDIT, AgsNotationEditClass)) #define AGS_NOTATION_EDIT_DEFAULT_CONTROL_WIDTH (64) #define AGS_NOTATION_EDIT_DEFAULT_CONTROL_HEIGHT (14) #define AGS_NOTATION_EDIT_DEFAULT_CONTROL_MARGIN_X (0) #define AGS_NOTATION_EDIT_DEFAULT_CONTROL_MARGIN_Y (2) #define AGS_NOTATION_EDIT_DEFAULT_CURSOR_POSITION_X (0) #define AGS_NOTATION_EDIT_DEFAULT_CURSOR_POSITION_Y (0) #define AGS_NOTATION_EDIT_DEFAULT_SELECTED_NOTE_BORDER (2) #define AGS_NOTATION_EDIT_DEFAULT_FADER_WIDTH (3) #define AGS_NOTATION_EDIT_MIN_ZOOM (1.0 / 16.0) #define AGS_NOTATION_EDIT_MAX_ZOOM (4.0) #define AGS_NOTATION_EDIT_MAX_ZOOM_CONTROL_WIDTH (64.0 * AGS_NOTATION_EDIT_DEFAULT_CONTROL_WIDTH) typedef struct _AgsNotationEdit AgsNotationEdit; typedef struct _AgsNotationEditClass AgsNotationEditClass; typedef enum{ AGS_NOTATION_EDIT_CONNECTED = 1, AGS_NOTATION_EDIT_AUTO_SCROLL = 1 << 1, AGS_NOTATION_EDIT_SHOW_RULER = 1 << 2, AGS_NOTATION_EDIT_SHOW_VSCROLLBAR = 1 << 3, AGS_NOTATION_EDIT_SHOW_HSCROLLBAR = 1 << 4, }AgsNotationEditFlags; typedef enum{ AGS_NOTATION_EDIT_NO_EDIT_MODE, AGS_NOTATION_EDIT_POSITION_CURSOR, AGS_NOTATION_EDIT_ADD_NOTE, AGS_NOTATION_EDIT_DELETE_NOTE, AGS_NOTATION_EDIT_SELECT_NOTE, }AgsNotationEditMode; typedef enum{ AGS_NOTATION_EDIT_BUTTON_1 = 1, }AgsNotationEditButtonMask; typedef enum{ AGS_NOTATION_EDIT_KEY_L_CONTROL = 1, AGS_NOTATION_EDIT_KEY_R_CONTROL = 1 << 1, AGS_NOTATION_EDIT_KEY_L_SHIFT = 1 << 2, AGS_NOTATION_EDIT_KEY_R_SHIFT = 1 << 3, }AgsNotationEditKeyMask; struct _AgsNotationEdit { GtkTable table; guint flags; guint mode; guint button_mask; guint key_mask; guint note_offset; guint note_offset_absolute; guint control_width; guint control_height; guint control_margin_x; guint control_margin_y; guint cursor_position_x; guint cursor_position_y; guint selected_note_border; guint selection_x0; guint selection_x1; guint selection_y0; guint selection_y1; AgsNote *current_note; AgsRuler *ruler; GtkDrawingArea *drawing_area; GtkVScrollbar *vscrollbar; GtkHScrollbar *hscrollbar; }; struct _AgsNotationEditClass { GtkTableClass table; }; GType ags_notation_edit_get_type(void); void ags_notation_edit_reset_vscrollbar(AgsNotationEdit *notation_edit); void ags_notation_edit_reset_hscrollbar(AgsNotationEdit *notation_edit); void ags_notation_edit_draw_segment(AgsNotationEdit *notation_edit, cairo_t *cr); void ags_notation_edit_draw_position(AgsNotationEdit *notation_edit, cairo_t *cr); void ags_notation_edit_draw_cursor(AgsNotationEdit *notation_edit, cairo_t *cr); void ags_notation_edit_draw_selection(AgsNotationEdit *notation_edit, cairo_t *cr); void ags_notation_edit_draw_note(AgsNotationEdit *notation_edit, AgsNote *note, cairo_t *cr, gdouble opacity); void ags_notation_edit_draw_notation(AgsNotationEdit *notation_edit, cairo_t *cr); void ags_notation_edit_draw(AgsNotationEdit *notation_edit, cairo_t *cr); AgsNotationEdit* ags_notation_edit_new(); G_END_DECLS #endif /*__AGS_NOTATION_EDIT_H__*/ gsequencer-3.1.3/ags/X/editor/ags_notation_toolbar_callbacks.c0000644000175000017500000002202613616617253021435 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_notation_toolbar_position_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar) { if(toggle_button == notation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = notation_toolbar->selected_edit_mode; notation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_notation_toolbar_edit_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar) { if(toggle_button == notation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = notation_toolbar->selected_edit_mode; notation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_notation_toolbar_clear_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar) { if(toggle_button == notation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = notation_toolbar->selected_edit_mode; notation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_notation_toolbar_select_callback(GtkToggleToolButton *toggle_button, AgsNotationToolbar *notation_toolbar) { if(toggle_button == notation_toolbar->selected_edit_mode){ if(!gtk_toggle_tool_button_get_active(toggle_button)){ gtk_toggle_tool_button_set_active(toggle_button, TRUE); } }else if(gtk_toggle_tool_button_get_active(toggle_button)){ GtkToggleToolButton *old_selected_edit_mode; old_selected_edit_mode = notation_toolbar->selected_edit_mode; notation_toolbar->selected_edit_mode = toggle_button; gtk_toggle_tool_button_set_active(old_selected_edit_mode, FALSE); } } void ags_notation_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; /* add notation to root node */ notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_toolbar), AGS_TYPE_NOTATION_EDITOR); if(widget == (GtkWidget *) notation_toolbar->copy){ ags_notation_editor_copy(notation_editor); }else{ ags_notation_editor_cut(notation_editor); } } void ags_notation_toolbar_paste_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_toolbar), AGS_TYPE_NOTATION_EDITOR); ags_notation_editor_paste(notation_editor); } void ags_notation_toolbar_match_audio_channel_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(notation_toolbar), AGS_TYPE_NOTATION_EDITOR)); if(gtk_check_menu_item_get_active((GtkCheckMenuItem *) widget)){ notation_editor->flags |= AGS_NOTATION_EDITOR_PASTE_MATCH_AUDIO_CHANNEL; }else{ notation_editor->flags &= (~AGS_NOTATION_EDITOR_PASTE_MATCH_AUDIO_CHANNEL); } } void ags_notation_toolbar_no_duplicates_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; notation_editor = AGS_NOTATION_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(notation_toolbar), AGS_TYPE_NOTATION_EDITOR)); if(gtk_check_menu_item_get_active((GtkCheckMenuItem *) widget)){ notation_editor->flags |= AGS_NOTATION_EDITOR_PASTE_NO_DUPLICATES; }else{ notation_editor->flags &= (~AGS_NOTATION_EDITOR_PASTE_NO_DUPLICATES); } } void ags_notation_toolbar_invert_callback(GtkWidget *widget, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(notation_toolbar), AGS_TYPE_NOTATION_EDITOR); ags_notation_editor_invert(notation_editor); } void ags_notation_toolbar_tool_popup_move_note_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar) { gtk_widget_show_all((GtkWidget *) notation_toolbar->move_note); } void ags_notation_toolbar_tool_popup_crop_note_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar) { gtk_widget_show_all((GtkWidget *) notation_toolbar->crop_note); } void ags_notation_toolbar_tool_popup_select_note_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar) { gtk_widget_show_all((GtkWidget *) notation_toolbar->select_note); } void ags_notation_toolbar_tool_popup_position_cursor_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar) { gtk_widget_show_all((GtkWidget *) notation_toolbar->position_notation_cursor); } void ags_notation_toolbar_tool_popup_enable_all_lines_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; AgsNotebook *notebook; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_toolbar, AGS_TYPE_NOTATION_EDITOR); /* enable */ notebook = notation_editor->notebook; if(notebook != NULL){ GList *start_list, *list; list = start_list = g_list_copy(notebook->tab); while(list != NULL){ gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(list->data)->toggle, TRUE); list = list->next; } g_list_free(start_list); } } void ags_notation_toolbar_tool_popup_disable_all_lines_callback(GtkWidget *item, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; AgsNotebook *notebook; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_toolbar, AGS_TYPE_NOTATION_EDITOR); /* disable */ notebook = notation_editor->notebook; if(notebook != NULL){ GList *start_list, *list; list = start_list = g_list_copy(notebook->tab); while(list != NULL){ gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(list->data)->toggle, FALSE); list = list->next; } g_list_free(start_list); } } void ags_notation_toolbar_zoom_callback(GtkComboBox *combo_box, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; AgsNotationEdit *notation_edit; gdouble old_zoom_factor; gdouble zoom_factor, zoom; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_toolbar, AGS_TYPE_NOTATION_EDITOR); notation_edit = notation_editor->notation_edit; /* zoom */ old_zoom_factor = exp2(6.0 - (double) notation_toolbar->zoom_history); notation_toolbar->zoom_history = gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom); zoom_factor = exp2(6.0 - (double) notation_toolbar->zoom_history); zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) notation_toolbar->zoom) - 2.0); /* reset notation edit */ gtk_range_set_value(GTK_RANGE(notation_edit->hscrollbar), gtk_range_get_value(GTK_RANGE(notation_edit->hscrollbar)) * old_zoom_factor / zoom_factor); gtk_widget_queue_draw((GtkWidget *) notation_edit); /* reset ruler */ notation_edit->ruler->factor = zoom_factor; notation_edit->ruler->precision = zoom; notation_edit->ruler->scale_precision = 1.0 / zoom; gtk_widget_queue_draw((GtkWidget *) notation_edit->ruler); } void ags_notation_toolbar_opacity_callback(GtkSpinButton *spin_button, AgsNotationToolbar *notation_toolbar) { AgsNotationEditor *notation_editor; notation_editor = (AgsNotationEditor *) gtk_widget_get_ancestor((GtkWidget *) notation_toolbar, AGS_TYPE_NOTATION_EDITOR); gtk_widget_queue_draw((GtkWidget *) notation_editor->notation_edit); } gsequencer-3.1.3/ags/X/editor/ags_select_note_dialog_callbacks.h0000644000175000017500000000237413607210263021702 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SELECT_NOTE_DIALOG_CALLBACKS_H__ #define __AGS_SELECT_NOTE_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_select_note_dialog_response_callback(GtkWidget *dialog, gint response, AgsSelectNoteDialog *select_note_dialog); G_END_DECLS #endif /*__AGS_SELECT_NOTE_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_crop_note_dialog_callbacks.h0000644000175000017500000000253313607210263021363 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CROP_NOTE_DIALOG_CALLBACKS_H__ #define __AGS_CROP_NOTE_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_crop_note_dialog_response_callback(GtkWidget *dialog, gint response, AgsCropNoteDialog *crop_note_dialog); void ags_crop_note_dialog_absolute_callback(GtkWidget *button, AgsCropNoteDialog *crop_note_dialog); G_END_DECLS #endif /*__AGS_CROP_NOTE_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_wave_toolbar_callbacks.h0000644000175000017500000000427113607210263020541 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_TOOLBAR_CALLBACKS_H__ #define __AGS_WAVE_TOOLBAR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_wave_toolbar_position_callback(GtkToggleToolButton *toggle_tool_button, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_select_callback(GtkToggleToolButton *toggle_tool_button, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_paste_callback(GtkWidget *widget, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_match_line_callback(GtkWidget *widget, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_tool_popup_select_buffer_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_tool_popup_position_cursor_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_tool_popup_enable_all_lines_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_tool_popup_disable_all_lines_callback(GtkWidget *item, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_zoom_callback(GtkComboBox *combo_box, AgsWaveToolbar *wave_toolbar); void ags_wave_toolbar_opacity_callback(GtkSpinButton *spin_button, AgsWaveToolbar *wave_toolbar); G_END_DECLS #endif /*__AGS_WAVE_TOOLBAR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_machine_selector_callbacks.h0000644000175000017500000000376313607210263021366 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACHINE_SELECTOR_CALLBACKS_H__ #define __AGS_MACHINE_SELECTOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_machine_selector_popup_add_tab_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_remove_tab_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_add_index_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_remove_index_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_link_index_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_reverse_mapping_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_popup_shift_piano_callback(GtkWidget *menu_item, AgsMachineSelector *machine_selector); void ags_machine_selector_radio_changed(GtkWidget *radio_button, AgsMachineSelector *machine_selector); G_END_DECLS #endif /*__AGS_MACHINE_SELECTOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/editor/ags_select_acceleration_dialog.c0000644000175000017500000005073313607210263021364 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_select_acceleration_dialog_class_init(AgsSelectAccelerationDialogClass *select_acceleration_dialog); void ags_select_acceleration_dialog_connectable_interface_init(AgsConnectableInterface *connectable); void ags_select_acceleration_dialog_applicable_interface_init(AgsApplicableInterface *applicable); void ags_select_acceleration_dialog_init(AgsSelectAccelerationDialog *select_acceleration_dialog); void ags_select_acceleration_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_select_acceleration_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_select_acceleration_dialog_finalize(GObject *gobject); void ags_select_acceleration_dialog_connect(AgsConnectable *connectable); void ags_select_acceleration_dialog_disconnect(AgsConnectable *connectable); void ags_select_acceleration_dialog_set_update(AgsApplicable *applicable, gboolean update); void ags_select_acceleration_dialog_apply(AgsApplicable *applicable); void ags_select_acceleration_dialog_reset(AgsApplicable *applicable); gboolean ags_select_acceleration_dialog_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_select_acceleration_dialog * @short_description: select tool * @title: AgsSelectAccelerationDialog * @section_id: * @include: ags/X/editor/ags_select_acceleration_dialog.h * * The #AgsSelectAccelerationDialog lets you select accelerations. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_select_acceleration_dialog_parent_class = NULL; GType ags_select_acceleration_dialog_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_select_acceleration_dialog = 0; static const GTypeInfo ags_select_acceleration_dialog_info = { sizeof (AgsSelectAccelerationDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_select_acceleration_dialog_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSelectAccelerationDialog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_select_acceleration_dialog_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_select_acceleration_dialog_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_select_acceleration_dialog_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_select_acceleration_dialog = g_type_register_static(GTK_TYPE_DIALOG, "AgsSelectAccelerationDialog", &ags_select_acceleration_dialog_info, 0); g_type_add_interface_static(ags_type_select_acceleration_dialog, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_select_acceleration_dialog, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_select_acceleration_dialog); } return g_define_type_id__volatile; } void ags_select_acceleration_dialog_class_init(AgsSelectAccelerationDialogClass *select_acceleration_dialog) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_select_acceleration_dialog_parent_class = g_type_class_peek_parent(select_acceleration_dialog); /* GObjectClass */ gobject = (GObjectClass *) select_acceleration_dialog; gobject->set_property = ags_select_acceleration_dialog_set_property; gobject->get_property = ags_select_acceleration_dialog_get_property; gobject->finalize = ags_select_acceleration_dialog_finalize; /* properties */ /** * AgsSelectAccelerationDialog:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) select_acceleration_dialog; widget->delete_event = ags_select_acceleration_dialog_delete_event; } void ags_select_acceleration_dialog_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_select_acceleration_dialog_connect; connectable->disconnect = ags_select_acceleration_dialog_disconnect; } void ags_select_acceleration_dialog_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_select_acceleration_dialog_set_update; applicable->apply = ags_select_acceleration_dialog_apply; applicable->reset = ags_select_acceleration_dialog_reset; } void ags_select_acceleration_dialog_init(AgsSelectAccelerationDialog *select_acceleration_dialog) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; select_acceleration_dialog->flags = 0; g_object_set(select_acceleration_dialog, "title", i18n("select accelerations"), NULL); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(select_acceleration_dialog), GTK_WIDGET(vbox), FALSE, FALSE, 0); /* copy selection */ select_acceleration_dialog->copy_selection = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("copy selection")); gtk_toggle_button_set_active((GtkToggleButton *) select_acceleration_dialog->copy_selection, TRUE); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(select_acceleration_dialog->copy_selection), FALSE, FALSE, 0); /* automation */ select_acceleration_dialog->port = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(select_acceleration_dialog->port), FALSE, FALSE, 0); /* add */ select_acceleration_dialog->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(select_acceleration_dialog->add), FALSE, FALSE, 0); /* select x0 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select x0 - label */ label = (GtkLabel *) gtk_label_new(i18n("select x0")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select x0 - spin button */ select_acceleration_dialog->select_x0 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_ACCELERATION_MAX_BEATS, 0.25); gtk_spin_button_set_digits(select_acceleration_dialog->select_x0, 2); gtk_spin_button_set_value(select_acceleration_dialog->select_x0, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_acceleration_dialog->select_x0), FALSE, FALSE, 0); /* select x1 - hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(hbox), FALSE, FALSE, 0); /* select x1 - label */ label = (GtkLabel *) gtk_label_new(i18n("select x1")); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(label), FALSE, FALSE, 0); /* select x1 - spin button */ select_acceleration_dialog->select_x1 = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_SELECT_ACCELERATION_MAX_BEATS, 0.25); gtk_spin_button_set_digits(select_acceleration_dialog->select_x1, 2); gtk_spin_button_set_value(select_acceleration_dialog->select_x1, 0.0); gtk_box_pack_start((GtkBox *) hbox, GTK_WIDGET(select_acceleration_dialog->select_x1), FALSE, FALSE, 0); /* dialog buttons */ gtk_dialog_add_buttons((GtkDialog *) select_acceleration_dialog, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); } void ags_select_acceleration_dialog_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSelectAccelerationDialog *select_acceleration_dialog; select_acceleration_dialog = AGS_SELECT_ACCELERATION_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) select_acceleration_dialog->main_window == main_window){ return; } if(select_acceleration_dialog->main_window != NULL){ g_object_unref(select_acceleration_dialog->main_window); } if(main_window != NULL){ g_object_ref(main_window); } select_acceleration_dialog->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_select_acceleration_dialog_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSelectAccelerationDialog *select_acceleration_dialog; select_acceleration_dialog = AGS_SELECT_ACCELERATION_DIALOG(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, select_acceleration_dialog->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_select_acceleration_dialog_connect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsSelectAccelerationDialog *select_acceleration_dialog; select_acceleration_dialog = AGS_SELECT_ACCELERATION_DIALOG(connectable); if((AGS_SELECT_ACCELERATION_DIALOG_CONNECTED & (select_acceleration_dialog->flags)) != 0){ return; } select_acceleration_dialog->flags |= AGS_SELECT_ACCELERATION_DIALOG_CONNECTED; automation_editor = AGS_WINDOW(select_acceleration_dialog->main_window)->automation_window->automation_editor; g_signal_connect(select_acceleration_dialog, "response", G_CALLBACK(ags_select_acceleration_dialog_response_callback), select_acceleration_dialog); /* add automation */ g_signal_connect(select_acceleration_dialog->add, "clicked", G_CALLBACK(ags_select_acceleration_dialog_add_callback), select_acceleration_dialog); /* machine changed */ g_signal_connect_after(automation_editor, "machine-changed", G_CALLBACK(ags_select_acceleration_dialog_machine_changed_callback), select_acceleration_dialog); } void ags_select_acceleration_dialog_disconnect(AgsConnectable *connectable) { AgsAutomationEditor *automation_editor; AgsSelectAccelerationDialog *select_acceleration_dialog; select_acceleration_dialog = AGS_SELECT_ACCELERATION_DIALOG(connectable); if((AGS_SELECT_ACCELERATION_DIALOG_CONNECTED & (select_acceleration_dialog->flags)) == 0){ return; } select_acceleration_dialog->flags &= (~AGS_SELECT_ACCELERATION_DIALOG_CONNECTED); automation_editor = AGS_WINDOW(select_acceleration_dialog->main_window)->automation_window->automation_editor; g_object_disconnect(G_OBJECT(select_acceleration_dialog), "any_signal::response", G_CALLBACK(ags_select_acceleration_dialog_response_callback), select_acceleration_dialog, NULL); g_object_disconnect(G_OBJECT(select_acceleration_dialog->add), "any_signal::clicked", G_CALLBACK(ags_select_acceleration_dialog_add_callback), select_acceleration_dialog, NULL); g_object_disconnect(G_OBJECT(automation_editor), "any_signal::machine-changed", G_CALLBACK(ags_select_acceleration_dialog_machine_changed_callback), select_acceleration_dialog, NULL); } void ags_select_acceleration_dialog_finalize(GObject *gobject) { AgsSelectAccelerationDialog *select_acceleration_dialog; select_acceleration_dialog = (AgsSelectAccelerationDialog *) gobject; G_OBJECT_CLASS(ags_select_acceleration_dialog_parent_class)->finalize(gobject); } void ags_select_acceleration_dialog_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_select_acceleration_dialog_apply(AgsApplicable *applicable) { AgsSelectAccelerationDialog *select_acceleration_dialog; AgsWindow *window; AgsAutomationEditor *automation_editor; AgsMachine *machine; AgsNotebook *notebook; AgsAudio *audio; xmlDoc *clipboard; xmlNode *audio_node, *automation_node; GList *start_list_automation, *list_automation; GList *port, *port_start; GList *list; gchar **specifier; xmlChar *buffer; gchar *str; GType channel_type; gdouble gui_y; gdouble c_y0, c_y1; gdouble val; gdouble upper, lower, range, step; gdouble c_upper, c_lower, c_range; int size; guint x0, y0; guint x1, y1; guint i; gint line; gboolean copy_selection; select_acceleration_dialog = AGS_SELECT_ACCELERATION_DIALOG(applicable); window = (AgsWindow *) select_acceleration_dialog->main_window; automation_editor = window->automation_window->automation_editor; machine = automation_editor->selected_machine; if(machine == NULL || automation_editor->focused_automation_edit == NULL){ return; } notebook = NULL; channel_type = G_TYPE_NONE; if(automation_editor->focused_automation_edit->channel_type == G_TYPE_NONE){ notebook = NULL; channel_type = G_TYPE_NONE; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; channel_type = AGS_TYPE_OUTPUT; }else if(automation_editor->focused_automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; channel_type = AGS_TYPE_INPUT; } audio = machine->audio; g_object_get(audio, "automation", &start_list_automation, NULL); /* get some values */ copy_selection = gtk_toggle_button_get_active((GtkToggleButton *) select_acceleration_dialog->copy_selection); x0 = (AGS_SELECT_ACCELERATION_DEFAULT_WIDTH / 16) * gtk_spin_button_get_value_as_int(select_acceleration_dialog->select_x0); x1 = (AGS_SELECT_ACCELERATION_DEFAULT_WIDTH / 16) * gtk_spin_button_get_value_as_int(select_acceleration_dialog->select_x1); /* select acceleration */ port = port_start = gtk_container_get_children((GtkContainer *) select_acceleration_dialog->port); specifier = NULL; clipboard = NULL; audio_node = NULL; if(copy_selection){ /* create document */ clipboard = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); /* create root node */ audio_node = xmlNewNode(NULL, BAD_CAST "audio"); xmlDocSetRootElement(clipboard, audio_node); } for(i = 0; port != NULL;){ list = gtk_container_get_children((GtkContainer *) port->data); str = gtk_combo_box_text_get_active_text(list->data); g_list_free(list); if(specifier != NULL && g_strv_contains(specifier, str)){ port = port->next; continue; } if(specifier == NULL){ specifier = (gchar **) malloc(2 * sizeof(gchar *)); }else{ specifier = (gchar **) realloc(specifier, (i + 2) * sizeof(gchar *)); } specifier[i] = str; specifier[i + 1] = NULL; line = 0; while((line = ags_notebook_next_active_tab(notebook, line)) != -1){ list_automation = start_list_automation; while((list_automation = ags_automation_find_specifier_with_type_and_line(list_automation, specifier[i], channel_type, line)) != NULL){ AgsAutomation *current_automation; AgsPort *current_port; AgsConversion *conversion; AgsTimestamp *timestamp; current_automation = list_automation->data; g_object_get(current_automation, "timestamp", ×tamp, NULL); g_object_unref(timestamp); if(ags_timestamp_get_ags_offset(timestamp) + AGS_AUTOMATION_DEFAULT_OFFSET < x0){ list_automation = list_automation->next; continue; } if(ags_timestamp_get_ags_offset(timestamp) > x1){ break; } g_object_get(current_automation, "port", ¤t_port, "upper", &upper, "lower", &lower, NULL); g_object_get(current_port, "conversion", &conversion, NULL); range = upper - lower; if(conversion != NULL){ c_upper = ags_conversion_convert(conversion, upper, FALSE); c_lower = ags_conversion_convert(conversion, lower, FALSE); c_range = c_upper - c_lower; g_object_unref(conversion); }else{ c_upper = upper; c_lower = lower; c_range = range; } g_object_unref(current_port); if(range == 0.0){ list_automation = list_automation->next; g_warning("ags_select_acceleration_dialog.c - range = 0.0"); continue; } /* check steps */ g_object_get(current_automation, "steps", &gui_y, NULL); val = c_lower + (gui_y * (c_range / gui_y)); c_y0 = val; /* conversion */ if(conversion != NULL){ c_y0 = ags_conversion_convert(conversion, c_y0, TRUE); } /* check steps */ gui_y = 0; val = c_lower + (gui_y * (c_range / gui_y)); c_y1 = val; /* conversion */ if(conversion != NULL){ c_y1 = ags_conversion_convert(conversion, c_y1, TRUE); } /* select */ ags_automation_add_region_to_selection(current_automation, x0 * AGS_SELECT_ACCELERATION_DEFAULT_WIDTH, c_y0, x1 * AGS_SELECT_ACCELERATION_DEFAULT_WIDTH, c_y1, TRUE); if(copy_selection){ automation_node = ags_automation_copy_selection(list_automation->data); xmlAddChild(audio_node, automation_node); } list_automation = list_automation->next; } line++; } port = port->next; i++; } g_strfreev(specifier); g_list_free_full(start_list_automation, g_object_unref); g_list_free(port_start); /* write to clipboard */ if(copy_selection){ xmlDocDumpFormatMemoryEnc(clipboard, &buffer, &size, "UTF-8", TRUE); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, size); gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); xmlFreeDoc(clipboard); } } void ags_select_acceleration_dialog_reset(AgsApplicable *applicable) { AgsSelectAccelerationDialog *select_acceleration_dialog; GList *list_start, *list; select_acceleration_dialog = AGS_SELECT_ACCELERATION_DIALOG(applicable); list = list_start = gtk_container_get_children((GtkContainer *) select_acceleration_dialog->port); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(list_start); } gboolean ags_select_acceleration_dialog_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_select_acceleration_dialog_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_select_acceleration_dialog_new: * @main_window: the #AgsWindow * * Create a new #AgsSelectAccelerationDialog. * * Returns: a new #AgsSelectAccelerationDialog * * Since: 3.0.0 */ AgsSelectAccelerationDialog* ags_select_acceleration_dialog_new(GtkWidget *main_window) { AgsSelectAccelerationDialog *select_acceleration_dialog; select_acceleration_dialog = (AgsSelectAccelerationDialog *) g_object_new(AGS_TYPE_SELECT_ACCELERATION_DIALOG, "main-window", main_window, NULL); return(select_acceleration_dialog); } gsequencer-3.1.3/ags/X/editor/ags_crop_note_dialog.h0000644000175000017500000000460113607210263017362 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CROP_NOTE_DIALOG_H__ #define __AGS_CROP_NOTE_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CROP_NOTE_DIALOG (ags_crop_note_dialog_get_type()) #define AGS_CROP_NOTE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CROP_NOTE_DIALOG, AgsCropNoteDialog)) #define AGS_CROP_NOTE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CROP_NOTE_DIALOG, AgsCropNoteDialogClass)) #define AGS_IS_CROP_NOTE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CROP_NOTE_DIALOG)) #define AGS_IS_CROP_NOTE_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CROP_NOTE_DIALOG)) #define AGS_CROP_NOTE_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_CROP_NOTE_DIALOG, AgsCropNoteDialogClass)) #define AGS_CROP_NOTE_DIALOG_MAX_WIDTH (128 * 16) typedef struct _AgsCropNoteDialog AgsCropNoteDialog; typedef struct _AgsCropNoteDialogClass AgsCropNoteDialogClass; typedef enum{ AGS_CROP_NOTE_DIALOG_CONNECTED = 1, }AgsCropNoteDialogFlags; struct _AgsCropNoteDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *absolute; GtkRadioButton *in_place; GtkRadioButton *do_resize; GtkSpinButton *crop_note; GtkSpinButton *padding_note; }; struct _AgsCropNoteDialogClass { GtkDialogClass dialog; }; GType ags_crop_note_dialog_get_type(void); AgsCropNoteDialog* ags_crop_note_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_CROP_NOTE_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_automation_edit_callbacks.c0000644000175000017500000012307513616617253021253 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_automation_edit_drawing_area_button_press_position_cursor(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_button_press_add_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_button_press_select_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_button_release_position_cursor(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_button_release_add_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_button_release_delete_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_button_release_select_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event); void ags_automation_edit_drawing_area_motion_notify_position_cursor(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventMotion *event); void ags_automation_edit_drawing_area_motion_notify_add_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventMotion *event); void ags_automation_edit_drawing_area_motion_notify_select_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventMotion *event); void ags_automation_edit_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsAutomationEdit *automation_edit) { ags_automation_edit_draw(automation_edit, cr); } gboolean ags_automation_edit_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsAutomationEdit *automation_edit) { ags_automation_edit_reset_vscrollbar(automation_edit); ags_automation_edit_reset_hscrollbar(automation_edit); gtk_widget_queue_draw(automation_edit); return(FALSE); } void ags_automation_edit_drawing_area_button_press_position_cursor(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } g_range = gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* cursor position */ automation_edit->cursor_position_x = (guint) (zoom_factor * (event->x + gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)))); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; automation_edit->cursor_position_y = lower * pow(upper / lower, step / (step_count - 1)); }else{ automation_edit->cursor_position_y = (((allocation.height - event->y) / g_range) * c_range); } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit); } void ags_automation_edit_drawing_area_button_press_add_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { AgsAcceleration *acceleration; GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; GtkAllocation allocation; AgsConfig *config; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); acceleration = ags_acceleration_new(); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* acceleration */ acceleration->x = (guint) (zoom_factor * (event->x + gtk_adjustment_get_value(hscrollbar_adjustment))); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; acceleration->y = lower * pow(upper / lower, step / (step_count - 1)); }else{ acceleration->y = (((allocation.height - event->y) / g_range) * c_range); } /* current acceleration */ if(automation_edit->current_acceleration != NULL){ g_object_unref(automation_edit->current_acceleration); automation_edit->current_acceleration = NULL; } automation_edit->current_acceleration = acceleration; g_object_ref(acceleration); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit); } void ags_automation_edit_drawing_area_button_press_select_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { automation_edit->selection_x0 = (guint) event->x + gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)); automation_edit->selection_x1 = automation_edit->selection_x0; automation_edit->selection_y0 = (guint) event->y + gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)); automation_edit->selection_y1 = automation_edit->selection_y0; gtk_widget_queue_draw((GtkWidget *) automation_edit); } gboolean ags_automation_edit_drawing_area_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; AgsMachine *machine; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(automation_edit), AGS_TYPE_AUTOMATION_EDITOR); automation_toolbar = automation_editor->automation_toolbar; gtk_widget_grab_focus((GtkWidget *) automation_edit->drawing_area); automation_editor->focused_automation_edit = automation_edit; if((machine = automation_editor->selected_machine) != NULL && event->button == 1){ automation_edit->button_mask = AGS_AUTOMATION_EDIT_BUTTON_1; if(automation_toolbar->selected_edit_mode == automation_toolbar->position){ automation_edit->mode = AGS_AUTOMATION_EDIT_POSITION_CURSOR; ags_automation_edit_drawing_area_button_press_position_cursor(automation_editor, automation_toolbar, automation_edit, machine, event); }else if(automation_toolbar->selected_edit_mode == automation_toolbar->edit){ automation_edit->mode = AGS_AUTOMATION_EDIT_ADD_ACCELERATION; ags_automation_edit_drawing_area_button_press_add_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); }else if(automation_toolbar->selected_edit_mode == automation_toolbar->clear){ automation_edit->mode = AGS_AUTOMATION_EDIT_DELETE_ACCELERATION; //ACCELERATION:JK: only takes action on release }else if(automation_toolbar->selected_edit_mode == automation_toolbar->select){ automation_edit->mode = AGS_AUTOMATION_EDIT_SELECT_ACCELERATION; ags_automation_edit_drawing_area_button_press_select_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); } } return(TRUE); } void ags_automation_edit_drawing_area_button_release_position_cursor(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* cursor position */ automation_edit->cursor_position_x = (guint) (zoom_factor * (event->x + gtk_adjustment_get_value(hscrollbar_adjustment))); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; automation_edit->cursor_position_y = lower * pow(upper / lower, step / (step_count - 1)); }else{ automation_edit->cursor_position_y = (((allocation.height - event->y) / g_range) * c_range); } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit); } void ags_automation_edit_drawing_area_button_release_add_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; AgsAcceleration *acceleration; AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; guint new_x; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); acceleration = automation_edit->current_acceleration; if(acceleration == NULL){ return; } if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* acceleration */ acceleration->x = (guint) (zoom_factor * (event->x + gtk_adjustment_get_value(hscrollbar_adjustment))); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; acceleration->y = lower * pow(upper / lower, step / (step_count - 1)); }else{ acceleration->y = (((allocation.height - event->y) / g_range) * c_range); } #ifdef AGS_DEBUG g_message("%lu %f", acceleration->x, acceleration->y); #endif /* add acceleration */ ags_automation_editor_add_acceleration(automation_editor, acceleration); automation_edit->current_acceleration = NULL; g_object_unref(acceleration); } void ags_automation_edit_drawing_area_button_release_delete_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; guint x; gdouble y; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* acceleration */ x = (guint) zoom_factor * ((event->x + gtk_adjustment_get_value(hscrollbar_adjustment))); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; y = lower * pow(upper / lower, step / (step_count - 1)); }else{ y = (((allocation.height - event->y) / g_range) * c_range); } /* delete acceleration */ ags_automation_editor_delete_acceleration(automation_editor, x, y); } void ags_automation_edit_drawing_area_button_release_select_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventButton *event) { GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; guint x0, x1; gdouble y0, y1; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* region */ x0 = (guint) zoom_factor * automation_edit->selection_x0; if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) automation_edit->selection_y0; y0 = lower * pow(upper / lower, step / (step_count - 1)); }else{ y0 = ((gdouble) (allocation.height - automation_edit->selection_y0) / g_range) * c_range; } x1 = (guint) zoom_factor * (event->x + gtk_adjustment_get_value(hscrollbar_adjustment)); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; y1 = lower * pow(upper / lower, step / (step_count - 1)); }else{ y1 = (((allocation.height - event->y) + gtk_adjustment_get_value(vscrollbar_adjustment) / g_range)) * c_range; } /* select region */ ags_automation_editor_select_region(automation_editor, x0, y0, x1, y1); } gboolean ags_automation_edit_drawing_area_button_release_event(GtkWidget *widget, GdkEventButton *event, AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; AgsMachine *machine; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(automation_edit), AGS_TYPE_AUTOMATION_EDITOR); automation_toolbar = automation_editor->automation_toolbar; if((machine = automation_editor->selected_machine) != NULL && event->button == 1){ automation_edit->button_mask &= (~AGS_AUTOMATION_EDIT_BUTTON_1); if(automation_edit->mode == AGS_AUTOMATION_EDIT_POSITION_CURSOR){ ags_automation_edit_drawing_area_button_release_position_cursor(automation_editor, automation_toolbar, automation_edit, machine, event); automation_edit->mode = AGS_AUTOMATION_EDIT_NO_EDIT_MODE; }else if(automation_edit->mode == AGS_AUTOMATION_EDIT_ADD_ACCELERATION){ ags_automation_edit_drawing_area_button_release_add_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); automation_edit->mode = AGS_AUTOMATION_EDIT_NO_EDIT_MODE; }else if(automation_edit->mode == AGS_AUTOMATION_EDIT_DELETE_ACCELERATION){ ags_automation_edit_drawing_area_button_release_delete_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); automation_edit->mode = AGS_AUTOMATION_EDIT_NO_EDIT_MODE; }else if(automation_edit->mode == AGS_AUTOMATION_EDIT_SELECT_ACCELERATION){ ags_automation_edit_drawing_area_button_release_select_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); automation_edit->mode = AGS_AUTOMATION_EDIT_NO_EDIT_MODE; } } return(FALSE); } void ags_automation_edit_drawing_area_motion_notify_position_cursor(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventMotion *event) { GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* cursor position */ automation_edit->cursor_position_x = (guint) zoom_factor * (event->x + gtk_adjustment_get_value(hscrollbar_adjustment)); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; automation_edit->cursor_position_y = lower * pow(upper / lower, step / (step_count - 1)); }else{ automation_edit->cursor_position_y = (((allocation.height - event->y) / g_range) * c_range); } #ifdef AGS_DEBUG g_message("%lu %f", automation_edit->cursor_position_x, automation_edit->cursor_position_y); #endif /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit); } void ags_automation_edit_drawing_area_motion_notify_add_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventMotion *event) { GtkAdjustment *vscrollbar_adjustment; GtkAdjustment *hscrollbar_adjustment; AgsAcceleration *acceleration; AgsConfig *config; GtkAllocation allocation; gchar *str; gdouble gui_scale_factor; double zoom_factor; gdouble c_range; guint g_range; gdouble value, step; gdouble upper, lower, step_count; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); acceleration = automation_edit->current_acceleration; if(acceleration == NULL){ return; } if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = (gdouble) ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)); }else{ c_range = automation_edit->upper - automation_edit->lower; } vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->hscrollbar)); g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* acceleration */ acceleration->x = (guint) zoom_factor * (event->x + gtk_adjustment_get_value(hscrollbar_adjustment)); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ lower = automation_edit->lower; upper = automation_edit->upper; step_count = ((guint) (gui_scale_factor * AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT)) + 1.0; step = (gdouble) allocation.height - (gdouble) event->y; acceleration->y = lower * pow(upper / lower, step / (step_count - 1)); }else{ acceleration->y = (((allocation.height - event->y) / g_range) * c_range); } #ifdef AGS_DEBUG g_message("%lu %f", acceleration->x, acceleration->y); #endif /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit); } void ags_automation_edit_drawing_area_motion_notify_select_acceleration(AgsAutomationEditor *automation_editor, AgsAutomationToolbar *automation_toolbar, AgsAutomationEdit *automation_edit, AgsMachine *machine, GdkEventMotion *event) { if(event->x + gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)) >= 0.0){ automation_edit->selection_x1 = (guint) event->x + gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)); }else{ automation_edit->selection_x1 = 0.0; } if(event->y + gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)) >= 0.0){ automation_edit->selection_y1 = (guint) event->y + gtk_range_get_value(GTK_RANGE(automation_edit->vscrollbar)); }else{ automation_edit->selection_y1 = 0.0; } gtk_widget_queue_draw((GtkWidget *) automation_edit); } gboolean ags_automation_edit_drawing_area_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; AgsMachine *machine; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(automation_edit), AGS_TYPE_AUTOMATION_EDITOR); automation_toolbar = automation_editor->automation_toolbar; gtk_widget_grab_focus((GtkWidget *) automation_edit->drawing_area); if((machine = automation_editor->selected_machine) != NULL && (AGS_AUTOMATION_EDIT_BUTTON_1 & (automation_edit->button_mask)) != 0){ if(automation_edit->mode == AGS_AUTOMATION_EDIT_POSITION_CURSOR){ ags_automation_edit_drawing_area_motion_notify_position_cursor(automation_editor, automation_toolbar, automation_edit, machine, event); }else if(automation_edit->mode == AGS_AUTOMATION_EDIT_ADD_ACCELERATION){ ags_automation_edit_drawing_area_motion_notify_add_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); }else if(automation_edit->mode == AGS_AUTOMATION_EDIT_DELETE_ACCELERATION){ //ACCELERATION:JK: only takes action on release }else if(automation_edit->mode == AGS_AUTOMATION_EDIT_SELECT_ACCELERATION){ ags_automation_edit_drawing_area_motion_notify_select_acceleration(automation_editor, automation_toolbar, automation_edit, machine, event); } } return(FALSE); } gboolean ags_automation_edit_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; AgsMachine *machine; gboolean retval; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(automation_edit), AGS_TYPE_AUTOMATION_EDITOR); machine = automation_editor->selected_machine; if(machine != NULL){ switch(event->keyval){ case GDK_KEY_Control_L: { automation_edit->key_mask |= AGS_AUTOMATION_EDIT_KEY_L_CONTROL; } break; case GDK_KEY_Control_R: { automation_edit->key_mask |= AGS_AUTOMATION_EDIT_KEY_R_CONTROL; } break; case GDK_KEY_Shift_L: { automation_edit->key_mask |= AGS_AUTOMATION_EDIT_KEY_L_SHIFT; } break; case GDK_KEY_Shift_R: { automation_edit->key_mask |= AGS_AUTOMATION_EDIT_KEY_R_SHIFT; } break; case GDK_KEY_a: { /* select all accelerations */ if((AGS_AUTOMATION_EDIT_KEY_L_CONTROL & (automation_edit->key_mask)) != 0 || (AGS_AUTOMATION_EDIT_KEY_R_CONTROL & (automation_edit->key_mask)) != 0){ ags_automation_editor_select_all(automation_editor); } } break; case GDK_KEY_c: { /* copy accelerations */ if((AGS_AUTOMATION_EDIT_KEY_L_CONTROL & (automation_edit->key_mask)) != 0 || (AGS_AUTOMATION_EDIT_KEY_R_CONTROL & (automation_edit->key_mask)) != 0){ ags_automation_editor_copy(automation_editor); } } break; case GDK_KEY_v: { /* paste accelerations */ if((AGS_AUTOMATION_EDIT_KEY_L_CONTROL & (automation_edit->key_mask)) != 0 || (AGS_AUTOMATION_EDIT_KEY_R_CONTROL & (automation_edit->key_mask)) != 0){ ags_automation_editor_paste(automation_editor); } } break; case GDK_KEY_x: { /* cut accelerations */ if((AGS_AUTOMATION_EDIT_KEY_L_CONTROL & (automation_edit->key_mask)) != 0 || (AGS_AUTOMATION_EDIT_KEY_R_CONTROL & (automation_edit->key_mask)) != 0){ ags_automation_editor_cut(automation_editor); } } break; case GDK_KEY_i: { /* invert accelerations */ if((AGS_AUTOMATION_EDIT_KEY_L_CONTROL & (automation_edit->key_mask)) != 0 || (AGS_AUTOMATION_EDIT_KEY_R_CONTROL & (automation_edit->key_mask)) != 0){ ags_automation_editor_invert(automation_editor); } } break; case GDK_KEY_m: { /* meta */ if((AGS_AUTOMATION_EDIT_KEY_L_CONTROL & (automation_edit->key_mask)) != 0 || (AGS_AUTOMATION_EDIT_KEY_R_CONTROL & (automation_edit->key_mask)) != 0){ if((AGS_AUTOMATION_META_ENABLED & (automation_editor->automation_meta->flags)) != 0){ automation_editor->automation_meta->flags &= (~AGS_AUTOMATION_META_ENABLED); gtk_widget_hide(automation_editor->automation_meta); }else{ automation_editor->automation_meta->flags |= AGS_AUTOMATION_META_ENABLED; gtk_widget_show_all(automation_editor->automation_meta); ags_automation_meta_refresh(automation_editor->automation_meta); } } } break; } } return(retval); } gboolean ags_automation_edit_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsAutomationEdit *automation_edit) { AgsAutomationEditor *automation_editor; AgsAutomationToolbar *automation_toolbar; AgsMachine *machine; AgsNotebook *notebook; GtkAllocation allocation; double zoom_factor; gint i; gboolean retval; automation_editor = (AgsAutomationEditor *) gtk_widget_get_ancestor(GTK_WIDGET(automation_edit), AGS_TYPE_AUTOMATION_EDITOR); automation_toolbar = automation_editor->automation_toolbar; machine = automation_editor->selected_machine; gtk_widget_get_allocation(GTK_WIDGET(automation_edit->drawing_area), &allocation); if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ retval = FALSE; }else{ retval = TRUE; } if(machine != NULL){ if(automation_edit->channel_type == G_TYPE_NONE){ notebook = NULL; }else if(automation_edit->channel_type == AGS_TYPE_OUTPUT){ notebook = automation_editor->output_notebook; }else if(automation_edit->channel_type == AGS_TYPE_INPUT){ notebook = automation_editor->input_notebook; } /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) automation_toolbar->zoom)); /* check key value */ switch(event->keyval){ case GDK_KEY_Control_L: { automation_edit->key_mask &= (~AGS_AUTOMATION_EDIT_KEY_L_CONTROL); } break; case GDK_KEY_Control_R: { automation_edit->key_mask &= (~AGS_AUTOMATION_EDIT_KEY_R_CONTROL); } break; case GDK_KEY_Shift_L: { automation_edit->key_mask &= (~AGS_AUTOMATION_EDIT_KEY_L_SHIFT); } break; case GDK_KEY_Shift_R: { automation_edit->key_mask &= (~AGS_AUTOMATION_EDIT_KEY_R_SHIFT); } break; case GDK_KEY_Left: case GDK_KEY_leftarrow: { gdouble x0_offset; /* position cursor */ if(automation_edit->cursor_position_x > 0){ if(automation_edit->cursor_position_x - (zoom_factor * automation_edit->control_width) > 0){ automation_edit->cursor_position_x -= (zoom_factor * automation_edit->control_width); }else{ automation_edit->cursor_position_x = 0; } } x0_offset = automation_edit->cursor_position_x / zoom_factor; if(x0_offset / zoom_factor < gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar))){ gtk_range_set_value(GTK_RANGE(automation_edit->hscrollbar), x0_offset / zoom_factor); } } break; case GDK_KEY_Right: case GDK_KEY_rightarrow: { gdouble x0_offset; /* position cursor */ if(automation_edit->cursor_position_x < AGS_AUTOMATION_EDITOR_MAX_CONTROLS){ automation_edit->cursor_position_x += (zoom_factor * automation_edit->control_width); } x0_offset = automation_edit->cursor_position_x / zoom_factor; if((x0_offset + automation_edit->control_width) / zoom_factor > gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)) + allocation.width){ gtk_range_set_value(GTK_RANGE(automation_edit->hscrollbar), x0_offset / zoom_factor); } } break; case GDK_KEY_Up: case GDK_KEY_uparrow: { GtkAdjustment *vscrollbar_adjustment; gdouble y0_offset; gdouble c_range; guint g_range; vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = exp(automation_edit->upper) - exp(automation_edit->lower); }else{ c_range = automation_edit->upper - automation_edit->lower; } g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; if(automation_edit->cursor_position_y < automation_edit->upper){ if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ automation_edit->cursor_position_y += log((1.0 / g_range) * c_range); }else{ automation_edit->cursor_position_y += ((1.0 / g_range) * c_range); } if(automation_edit->cursor_position_y > automation_edit->upper){ automation_edit->cursor_position_y = automation_edit->upper; } } if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ y0_offset = exp(automation_edit->cursor_position_y) / c_range * g_range; }else{ y0_offset = automation_edit->cursor_position_y / c_range * g_range; } if(y0_offset < gtk_adjustment_get_value(vscrollbar_adjustment)){ gtk_range_set_value(GTK_RANGE(automation_edit->vscrollbar), y0_offset); } } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { GtkAdjustment *vscrollbar_adjustment; gdouble y0_offset; gdouble c_range; guint g_range; vscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(automation_edit->vscrollbar)); if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ c_range = exp(automation_edit->upper) - exp(automation_edit->lower); }else{ c_range = automation_edit->upper - automation_edit->lower; } g_range = gtk_adjustment_get_upper(vscrollbar_adjustment) + allocation.height; if(automation_edit->cursor_position_y < automation_edit->lower){ if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ automation_edit->cursor_position_y -= log((1.0 / g_range) * c_range); }else{ automation_edit->cursor_position_y -= ((1.0 / g_range) * c_range); } if(automation_edit->cursor_position_y < automation_edit->lower){ automation_edit->cursor_position_y = automation_edit->lower; } } if((AGS_AUTOMATION_EDIT_LOGARITHMIC & (automation_edit->flags)) != 0){ y0_offset = exp(automation_edit->cursor_position_y) / c_range * g_range; }else{ y0_offset = automation_edit->cursor_position_y / c_range * g_range; } if(y0_offset < gtk_adjustment_get_value(vscrollbar_adjustment)){ gtk_range_set_value(GTK_RANGE(automation_edit->vscrollbar), y0_offset); } } break; case GDK_KEY_space: { AgsAcceleration *acceleration; acceleration = ags_acceleration_new(); acceleration->x = automation_edit->cursor_position_x; acceleration->y = automation_edit->cursor_position_y; /* add acceleration */ ags_automation_editor_add_acceleration(automation_editor, acceleration); } break; case GDK_KEY_Delete: { /* delete acceleration */ ags_automation_editor_delete_acceleration(automation_editor, automation_edit->cursor_position_x, automation_edit->cursor_position_y); } break; } gtk_widget_queue_draw((GtkWidget *) automation_edit); } return(retval); } void ags_automation_edit_vscrollbar_value_changed(GtkRange *range, AgsAutomationEdit *automation_edit) { GtkAdjustment *piano_adjustment; /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit->drawing_area); } void ags_automation_edit_hscrollbar_value_changed(GtkRange *range, AgsAutomationEdit *automation_edit) { AgsConfig *config; gchar *str; gdouble gui_scale_factor; gdouble value; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } value = gtk_range_get_value(GTK_RANGE(automation_edit->hscrollbar)) / (guint) (gui_scale_factor * 64.0); gtk_adjustment_set_value(automation_edit->ruler->adjustment, value); gtk_widget_queue_draw((GtkWidget *) automation_edit->ruler); /* queue draw */ gtk_widget_queue_draw((GtkWidget *) automation_edit->drawing_area); } gsequencer-3.1.3/ags/X/editor/ags_select_buffer_dialog.h0000644000175000017500000000475213607210263020211 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SELECT_BUFFER_DIALOG_H__ #define __AGS_SELECT_BUFFER_DIALOG_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SELECT_BUFFER_DIALOG (ags_select_buffer_dialog_get_type()) #define AGS_SELECT_BUFFER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SELECT_BUFFER_DIALOG, AgsSelectBufferDialog)) #define AGS_SELECT_BUFFER_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SELECT_BUFFER_DIALOG, AgsSelectBufferDialogClass)) #define AGS_IS_SELECT_BUFFER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SELECT_BUFFER_DIALOG)) #define AGS_IS_SELECT_BUFFER_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SELECT_BUFFER_DIALOG)) #define AGS_SELECT_BUFFER_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SELECT_BUFFER_DIALOG, AgsSelectBufferDialogClass)) #define AGS_SELECT_BUFFER_MAX_BEATS (16 * 1200) #define AGS_SELECT_BUFFER_DEFAULT_WIDTH (64) typedef struct _AgsSelectBufferDialog AgsSelectBufferDialog; typedef struct _AgsSelectBufferDialogClass AgsSelectBufferDialogClass; typedef enum{ AGS_SELECT_BUFFER_DIALOG_CONNECTED = 1, }AgsSelectBufferDialogFlags; struct _AgsSelectBufferDialog { GtkDialog dialog; guint flags; GtkWidget *main_window; GtkCheckButton *copy_selection; GtkSpinButton *select_x0; GtkSpinButton *select_x1; }; struct _AgsSelectBufferDialogClass { GtkDialogClass dialog; }; GType ags_select_buffer_dialog_get_type(void); AgsSelectBufferDialog* ags_select_buffer_dialog_new(GtkWidget *main_window); G_END_DECLS #endif /*__AGS_SELECT_BUFFER_DIALOG_H__*/ gsequencer-3.1.3/ags/X/editor/ags_machine_selector.c0000644000175000017500000004002113607210263017346 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_machine_selector_class_init(AgsMachineSelectorClass *machine_selector); void ags_machine_selector_connectable_interface_init(AgsConnectableInterface *connectable); void ags_machine_selector_init(AgsMachineSelector *machine_selector); void ags_machine_selector_connect(AgsConnectable *connectable); void ags_machine_selector_disconnect(AgsConnectable *connectable); void ags_machine_selector_show(GtkWidget *widget); void ags_machine_selector_real_changed(AgsMachineSelector *machine_selector, AgsMachine *machine); /** * SECTION:ags_machine_selector * @short_description: machine selector * @title: AgsMachineSelector * @section_id: * @include: ags/X/editor/ags_machine_selector.h * * The #AgsMachineSelector enables you make choice of an #AgsMachine. */ enum{ CHANGED, LAST_SIGNAL, }; static gpointer ags_machine_selector_parent_class = NULL; static guint machine_selector_signals[LAST_SIGNAL]; GType ags_machine_selector_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_machine_selector = 0; static const GTypeInfo ags_machine_selector_info = { sizeof (AgsMachineSelectorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_machine_selector_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMachineSelector), 0, /* n_preallocs */ (GInstanceInitFunc) ags_machine_selector_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_machine_selector_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_machine_selector = g_type_register_static(GTK_TYPE_VBOX, "AgsMachineSelector", &ags_machine_selector_info, 0); g_type_add_interface_static(ags_type_machine_selector, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_machine_selector); } return g_define_type_id__volatile; } void ags_machine_selector_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_machine_selector_connect; connectable->disconnect = ags_machine_selector_disconnect; } void ags_machine_selector_class_init(AgsMachineSelectorClass *machine_selector) { ags_machine_selector_parent_class = g_type_class_peek_parent(machine_selector); /* AgsMachineSelectorClass */ machine_selector->changed = ags_machine_selector_real_changed; /** * AgsMachineSelector::changed: * @machine_selector: the #AgsMachineSelector * @machine: the changed #AgsMachine * * The ::changed signal notifies changed #AgsMachine. * * Since: 3.0.0 */ machine_selector_signals[CHANGED] = g_signal_new("changed", G_TYPE_FROM_CLASS(machine_selector), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMachineSelectorClass, changed), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_machine_selector_init(AgsMachineSelector *machine_selector) { GtkHBox *hbox; machine_selector->flags = 0; hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(machine_selector), GTK_WIDGET(hbox), FALSE, FALSE, 0); machine_selector->label = (GtkLabel *) gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(machine_selector->label), FALSE, FALSE, 0); machine_selector->current = NULL; machine_selector->popup = NULL; machine_selector->menu_button = g_object_new(GTK_TYPE_MENU_TOOL_BUTTON, "stock-id", GTK_STOCK_EXECUTE, NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(machine_selector->menu_button), FALSE, FALSE, 0); machine_selector->machine_selection = NULL; } void ags_machine_selector_connect(AgsConnectable *connectable) { AgsMachineSelector *machine_selector; GList *list, *list_start; machine_selector = AGS_MACHINE_SELECTOR(connectable); if((AGS_MACHINE_SELECTOR_CONNECTED & (machine_selector->flags)) != 0){ return; } machine_selector->flags |= AGS_MACHINE_SELECTOR_CONNECTED; /* machine radio button */ list = list_start = gtk_container_get_children((GtkContainer *) machine_selector); list = list->next; while(list != NULL){ g_signal_connect_after(G_OBJECT(list->data), "clicked", G_CALLBACK(ags_machine_selector_radio_changed), machine_selector); list = list->next; } g_list_free(list_start); } void ags_machine_selector_disconnect(AgsConnectable *connectable) { AgsMachineSelector *machine_selector; GList *list, *list_start; machine_selector = AGS_MACHINE_SELECTOR(connectable); if((AGS_MACHINE_SELECTOR_CONNECTED & (machine_selector->flags)) == 0){ return; } machine_selector->flags &= (~AGS_MACHINE_SELECTOR_CONNECTED); /* machine radio button */ list = list_start = gtk_container_get_children((GtkContainer *) machine_selector); list = list->next; while(list != NULL){ g_object_disconnect(G_OBJECT(list->data), "any_signal::clicked", G_CALLBACK(ags_machine_selector_radio_changed), machine_selector, NULL); list = list->next; } g_list_free(list_start); } void ags_machine_selector_add_index(AgsMachineSelector *machine_selector) { AgsMachineRadioButton *machine_radio_button, *group; GList *list, *list_start; list_start = list = gtk_container_get_children(GTK_CONTAINER(machine_selector)); list = list->next; if(list == NULL){ group = NULL; }else{ group = AGS_MACHINE_RADIO_BUTTON(list->data); } g_list_free(list_start); machine_radio_button = (AgsMachineRadioButton *) g_object_new(AGS_TYPE_MACHINE_RADIO_BUTTON, "group", group, NULL); gtk_box_pack_start(GTK_BOX(machine_selector), GTK_WIDGET(machine_radio_button), FALSE, FALSE, 0); g_signal_connect_after(G_OBJECT(machine_radio_button), "clicked", G_CALLBACK(ags_machine_selector_radio_changed), machine_selector); gtk_widget_show_all((GtkWidget *) machine_radio_button); } void ags_machine_selector_remove_index(AgsMachineSelector *machine_selector, guint nth) { AgsNotationEditor *notation_editor; AgsAutomationEditor *automation_editor; AgsMachineRadioButton *machine_radio_button; GList *list, *list_start; /* get machine radio button */ machine_radio_button = NULL; list_start = list = gtk_container_get_children(GTK_CONTAINER(machine_selector)); list = list->next; list = g_list_nth(list, nth); if(list != NULL){ machine_radio_button = list->data; } g_list_free(list_start); if(machine_radio_button == NULL){ return; } /**/ gtk_widget_destroy(GTK_WIDGET(machine_radio_button)); } void ags_machine_selector_link_index(AgsMachineSelector *machine_selector, AgsMachine *machine) { AgsMachineRadioButton *machine_radio_button, *existing_radio_button; GList *list, *list_start; /* retrieve selected */ machine_radio_button = NULL; existing_radio_button = NULL; list_start = list = gtk_container_get_children(GTK_CONTAINER(machine_selector)); list = list->next; while(list != NULL){ if(GTK_IS_TOGGLE_BUTTON(list->data)){ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->data))){ machine_radio_button = AGS_MACHINE_RADIO_BUTTON(list->data); } if(AGS_MACHINE_RADIO_BUTTON(list->data)->machine == machine){ existing_radio_button = AGS_MACHINE_RADIO_BUTTON(list->data); } } list = list->next; } g_list_free(list_start); /* decide if link to editor or change index */ if(existing_radio_button != NULL){ gtk_button_clicked((GtkButton *) existing_radio_button); }else{ g_object_set(G_OBJECT(machine_radio_button), "machine", machine, NULL); } } void ags_machine_selector_real_changed(AgsMachineSelector *machine_selector, AgsMachine *machine) { if((AGS_MACHINE_SELECTOR_SHOW_REVERSE_MAPPING & (machine_selector->flags)) != 0){ GtkMenuItem *menu_item; GList *start_list; machine_selector->flags |= AGS_MACHINE_SELECTOR_BLOCK_REVERSE_MAPPING; start_list = gtk_container_get_children((GtkContainer *) machine_selector->popup); menu_item = g_list_nth_data(start_list, 3); if(machine != NULL){ if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ gtk_check_menu_item_set_active((GtkCheckMenuItem *) menu_item, TRUE); }else{ gtk_check_menu_item_set_active((GtkCheckMenuItem *) menu_item, FALSE); } }else{ gtk_check_menu_item_set_active((GtkCheckMenuItem *) menu_item, FALSE); } g_list_free(start_list); machine_selector->flags &= (~AGS_MACHINE_SELECTOR_BLOCK_REVERSE_MAPPING); } } /** * ags_machine_selector_changed: * @machine_selector: the #AgsMachineSelector * @machine: the selected #AgsMachine * * Emitted as #AgsMachineSelector modified. * * Since: 3.0.0 */ void ags_machine_selector_changed(AgsMachineSelector *machine_selector, AgsMachine *machine) { g_return_if_fail(AGS_IS_MACHINE_SELECTOR(machine_selector)); g_object_ref((GObject *) machine_selector); g_signal_emit((GObject *) machine_selector, machine_selector_signals[CHANGED], 0, machine); g_object_unref((GObject *) machine_selector); } /** * ags_machine_selector_new: * * Create a new #AgsMachineSelector. * * Returns: a new #AgsMachineSelector * * Since: 3.0.0 */ AgsMachineSelector* ags_machine_selector_new() { AgsMachineSelector *machine_selector; machine_selector = (AgsMachineSelector *) g_object_new(AGS_TYPE_MACHINE_SELECTOR, NULL); return(machine_selector); } /** * ags_machine_selector_popup_new: * @machine_selector: the #AgsMachineSelector * * Create a new #AgsMachineSelectorPopup. * * Returns: a new #GtkMenu suitable for #AgsMachineSelector * * Since: 3.0.0 */ GtkMenu* ags_machine_selector_popup_new(AgsMachineSelector *machine_selector) { GtkMenu *popup, *keys; GtkMenuItem *item; GList *list, *list_start; popup = (GtkMenu *) gtk_menu_new(); g_object_set_data((GObject *) popup, g_type_name(AGS_TYPE_MACHINE_SELECTOR), machine_selector); /* item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("add tab")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("remove tab")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("add index")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("remove index")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("link index")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); if((AGS_MACHINE_SELECTOR_SHOW_REVERSE_MAPPING & (machine_selector->flags)) != 0){ item = (GtkMenuItem *) gtk_check_menu_item_new_with_label(i18n("reverse mapping")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); } keys = NULL; if((AGS_MACHINE_SELECTOR_SHOW_SHIFT_PIANO & (machine_selector->flags)) != 0){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("shift piano")); gtk_menu_shell_append((GtkMenuShell*) popup, (GtkWidget*) item); keys = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu(item, (GtkWidget *) keys); item = (GtkMenuItem *) gtk_menu_item_new_with_label("A"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("A#"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("H"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("C"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("C#"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("D"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("D#"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("E"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("F"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("F#"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("G"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label("G#"); gtk_menu_shell_append((GtkMenuShell*) keys, (GtkWidget*) item); } /* connect */ list_start = list = gtk_container_get_children((GtkContainer *) popup); /* g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_add_tab_callback), (gpointer) machine_selector); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_remove_tab_callback), (gpointer) machine_selector); list = list->next; */ g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_add_index_callback), (gpointer) machine_selector); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_remove_index_callback), (gpointer) machine_selector); list = list->next; g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_link_index_callback), (gpointer) machine_selector); if((AGS_MACHINE_SELECTOR_SHOW_REVERSE_MAPPING & (machine_selector->flags)) != 0){ list = list->next; g_signal_connect_after(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_reverse_mapping_callback), (gpointer) machine_selector); } g_list_free(list_start); /* keys */ if((AGS_MACHINE_SELECTOR_SHOW_SHIFT_PIANO & (machine_selector->flags)) != 0){ list_start = list = gtk_container_get_children((GtkContainer *) keys); while(list != NULL){ g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_machine_selector_popup_shift_piano_callback), (gpointer) machine_selector); list = list->next; } g_list_free(list_start); } /* show */ if((AGS_MACHINE_SELECTOR_SHOW_SHIFT_PIANO & (machine_selector->flags)) != 0){ gtk_widget_show_all((GtkWidget *) keys); } gtk_widget_show_all((GtkWidget *) popup); return(popup); } gsequencer-3.1.3/ags/X/editor/ags_wave_edit.c0000644000175000017500000015120413607210264016020 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include static GType ags_accessible_wave_edit_get_type(void); void ags_wave_edit_class_init(AgsWaveEditClass *wave_edit); void ags_accessible_wave_edit_class_init(AtkObject *object); void ags_accessible_wave_edit_action_interface_init(AtkActionIface *action); void ags_wave_edit_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wave_edit_init(AgsWaveEdit *wave_edit); void ags_wave_edit_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_edit_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_edit_finalize(GObject *gobject); void ags_wave_edit_connect(AgsConnectable *connectable); void ags_wave_edit_disconnect(AgsConnectable *connectable); AtkObject* ags_wave_edit_get_accessible(GtkWidget *widget); gboolean ags_accessible_wave_edit_do_action(AtkAction *action, gint i); gint ags_accessible_wave_edit_get_n_actions(AtkAction *action); const gchar* ags_accessible_wave_edit_get_description(AtkAction *action, gint i); const gchar* ags_accessible_wave_edit_get_name(AtkAction *action, gint i); const gchar* ags_accessible_wave_edit_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_wave_edit_set_description(AtkAction *action, gint i); gchar* ags_accessible_wave_edit_get_localized_name(AtkAction *action, gint i); void ags_wave_edit_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_wave_edit_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_wave_edit_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_wave_edit_show(GtkWidget *widget); void ags_wave_edit_show_all(GtkWidget *widget); gboolean ags_wave_edit_auto_scroll_timeout(GtkWidget *widget); /** * SECTION:ags_wave_edit * @short_description: edit audio data * @title: AgsWaveEdit * @section_id: * @include: ags/X/editor/ags_wave_edit.h * * The #AgsWaveEdit lets you edit audio data. */ static gpointer ags_wave_edit_parent_class = NULL; static GQuark quark_accessible_object = 0; GHashTable *ags_wave_edit_auto_scroll = NULL; enum{ PROP_0, PROP_LINE, }; GType ags_wave_edit_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_edit = 0; static const GTypeInfo ags_wave_edit_info = { sizeof (AgsWaveEditClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWaveEdit), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_edit_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wave_edit_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wave_edit = g_type_register_static(GTK_TYPE_TABLE, "AgsWaveEdit", &ags_wave_edit_info, 0); g_type_add_interface_static(ags_type_wave_edit, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_edit); } return g_define_type_id__volatile; } static GType ags_accessible_wave_edit_get_type(void) { static GType ags_type_accessible_wave_edit = 0; if(!ags_type_accessible_wave_edit){ const GTypeInfo ags_accesssible_wave_edit_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_wave_edit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_wave_edit_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_wave_edit = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleWaveEdit", &ags_accesssible_wave_edit_info, 0); g_type_add_interface_static(ags_type_accessible_wave_edit, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_wave_edit); } void ags_wave_edit_class_init(AgsWaveEditClass *wave_edit) { GtkWidgetClass *widget; GObjectClass *gobject; GParamSpec *param_spec; ags_wave_edit_parent_class = g_type_class_peek_parent(wave_edit); /* GObjectClass */ gobject = G_OBJECT_CLASS(wave_edit); gobject->set_property = ags_wave_edit_set_property; gobject->get_property = ags_wave_edit_get_property; gobject->finalize = ags_wave_edit_finalize; /* properties */ /** * AgsWaveEdit:line: * * The wave edit's line. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("line", "line", "The line of wave edit", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINE, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) wave_edit; // widget->get_preferred_width = ags_wave_edit_get_preferred_width; // widget->get_preferred_height = ags_wave_edit_get_preferred_height; // widget->size_allocate = ags_wave_edit_size_allocate; // widget->draw = ags_wave_edit_draw; widget->show = ags_wave_edit_show; widget->show_all = ags_wave_edit_show_all; } void ags_wave_edit_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_wave_edit_connect; connectable->disconnect = ags_wave_edit_disconnect; } void ags_accessible_wave_edit_class_init(AtkObject *object) { quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); } void ags_accessible_wave_edit_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_wave_edit_do_action; action->get_n_actions = ags_accessible_wave_edit_get_n_actions; action->get_description = ags_accessible_wave_edit_get_description; action->get_name = ags_accessible_wave_edit_get_name; action->get_keybinding = ags_accessible_wave_edit_get_keybinding; action->set_description = ags_accessible_wave_edit_set_description; action->get_localized_name = ags_accessible_wave_edit_get_localized_name; } void ags_wave_edit_init(AgsWaveEdit *wave_edit) { GtkAdjustment *adjustment; AgsApplicationContext *application_context; gdouble gui_scale_factor; application_context = ags_application_context_get_instance(); g_object_set(wave_edit, "can-focus", FALSE, "n-columns", 3, "n-rows", 4, "homogeneous", FALSE, NULL); wave_edit->flags = 0; wave_edit->mode = AGS_WAVE_EDIT_NO_EDIT_MODE; wave_edit->button_mask = 0; wave_edit->key_mask = 0; /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); wave_edit->line = 0; wave_edit->note_offset = 0; wave_edit->note_offset_absolute = 0; wave_edit->control_width = (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH); wave_edit->control_height = (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_HEIGHT); wave_edit->cursor_position_x = AGS_WAVE_EDIT_DEFAULT_CURSOR_POSITION_X; wave_edit->cursor_position_y = AGS_WAVE_EDIT_DEFAULT_CURSOR_POSITION_Y; wave_edit->selected_buffer_border = AGS_WAVE_EDIT_DEFAULT_SELECTED_BUFFER_BORDER; wave_edit->selection_x0 = 0; wave_edit->selection_x1 = 0; wave_edit->selection_y0 = 0; wave_edit->selection_y1 = 0; wave_edit->ruler = ags_ruler_new(); g_object_set(wave_edit->ruler, "step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_STEP), "large-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_LARGE_STEP), "small-step", (guint) (gui_scale_factor * AGS_RULER_DEFAULT_SMALL_STEP), "no-show-all", TRUE, NULL); gtk_widget_set_size_request((GtkWidget *) wave_edit->ruler, -1, (gint) (gui_scale_factor * AGS_RULER_DEFAULT_HEIGHT)); gtk_table_attach(GTK_TABLE(wave_edit), (GtkWidget *) wave_edit->ruler, 0, 1, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL, 0, 0); wave_edit->lower = AGS_WAVE_EDIT_DEFAULT_LOWER; wave_edit->upper = AGS_WAVE_EDIT_DEFAULT_UPPER; wave_edit->default_value = AGS_WAVE_EDIT_DEFAULT_VALUE; wave_edit->drawing_area = (GtkDrawingArea *) gtk_drawing_area_new(); gtk_widget_set_events(GTK_WIDGET (wave_edit->drawing_area), GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_set_can_focus((GtkWidget *) wave_edit->drawing_area, TRUE); gtk_widget_set_size_request((GtkWidget *) wave_edit->drawing_area, -1, (gint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_HEIGHT)); gtk_table_attach(GTK_TABLE(wave_edit), (GtkWidget *) wave_edit->drawing_area, 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); wave_edit->wave_data = NULL; wave_edit->stride = -1; /* vscrollbar */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, wave_edit->control_height, 1.0); wave_edit->vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); g_object_set(wave_edit->vscrollbar, "no-show-all", TRUE, NULL); gtk_widget_set_size_request((GtkWidget *) wave_edit->vscrollbar, -1, (gint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_HEIGHT)); gtk_table_attach(GTK_TABLE(wave_edit), (GtkWidget *) wave_edit->vscrollbar, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* hscrollbar */ adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, (gdouble) wave_edit->control_width, 1.0); wave_edit->hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(adjustment); g_object_set(wave_edit->hscrollbar, "no-show-all", TRUE, NULL); gtk_widget_set_size_request((GtkWidget *) wave_edit->hscrollbar, -1, -1); gtk_table_attach(GTK_TABLE(wave_edit), (GtkWidget *) wave_edit->hscrollbar, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* auto-scroll */ if(ags_wave_edit_auto_scroll == NULL){ ags_wave_edit_auto_scroll = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_wave_edit_auto_scroll, wave_edit, ags_wave_edit_auto_scroll_timeout); g_timeout_add(1000 / 30, (GSourceFunc) ags_wave_edit_auto_scroll_timeout, (gpointer) wave_edit); } void ags_wave_edit_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWaveEdit *wave_edit; wave_edit = AGS_WAVE_EDIT(gobject); switch(prop_id){ case PROP_LINE: { wave_edit->line = g_value_get_uint(value); gtk_widget_queue_draw((GtkWidget *) wave_edit); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_edit_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWaveEdit *wave_edit; wave_edit = AGS_WAVE_EDIT(gobject); switch(prop_id){ case PROP_LINE: { g_value_set_uint(value, wave_edit->line); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_edit_finalize(GObject *gobject) { AgsWaveEdit *wave_edit; wave_edit = AGS_WAVE_EDIT(gobject); /* remove auto scroll */ g_hash_table_remove(ags_wave_edit_auto_scroll, wave_edit); /* call parent */ G_OBJECT_CLASS(ags_wave_edit_parent_class)->finalize(gobject); } void ags_wave_edit_connect(AgsConnectable *connectable) { AgsWaveEdit *wave_edit; wave_edit = AGS_WAVE_EDIT(connectable); if((AGS_WAVE_EDIT_CONNECTED & (wave_edit->flags)) != 0){ return; } wave_edit->flags |= AGS_WAVE_EDIT_CONNECTED; /* drawing area */ g_signal_connect(G_OBJECT(wave_edit->drawing_area), "draw", G_CALLBACK(ags_wave_edit_draw_callback), (gpointer) wave_edit); g_signal_connect_after((GObject *) wave_edit->drawing_area, "configure_event", G_CALLBACK(ags_wave_edit_drawing_area_configure_event), (gpointer) wave_edit); g_signal_connect((GObject *) wave_edit->drawing_area, "button_press_event", G_CALLBACK(ags_wave_edit_drawing_area_button_press_event), (gpointer) wave_edit); g_signal_connect((GObject *) wave_edit->drawing_area, "button_release_event", G_CALLBACK(ags_wave_edit_drawing_area_button_release_event), (gpointer) wave_edit); g_signal_connect((GObject *) wave_edit->drawing_area, "motion_notify_event", G_CALLBACK(ags_wave_edit_drawing_area_motion_notify_event), (gpointer) wave_edit); g_signal_connect((GObject *) wave_edit->drawing_area, "key_press_event", G_CALLBACK(ags_wave_edit_drawing_area_key_press_event), (gpointer) wave_edit); g_signal_connect((GObject *) wave_edit->drawing_area, "key_release_event", G_CALLBACK(ags_wave_edit_drawing_area_key_release_event), (gpointer) wave_edit); /* scrollbars */ g_signal_connect_after((GObject *) wave_edit->vscrollbar, "value-changed", G_CALLBACK(ags_wave_edit_vscrollbar_value_changed), (gpointer) wave_edit); g_signal_connect_after((GObject *) wave_edit->hscrollbar, "value-changed", G_CALLBACK(ags_wave_edit_hscrollbar_value_changed), (gpointer) wave_edit); } void ags_wave_edit_disconnect(AgsConnectable *connectable) { AgsWaveEdit *wave_edit; wave_edit = AGS_WAVE_EDIT(connectable); if((AGS_WAVE_EDIT_CONNECTED & (wave_edit->flags)) == 0){ return; } wave_edit->flags &= (~AGS_WAVE_EDIT_CONNECTED); /* drawing area */ g_object_disconnect((GObject *) wave_edit->drawing_area, "any_signal::draw", G_CALLBACK(ags_wave_edit_draw_callback), (gpointer) wave_edit, "any_signal::configure_event", G_CALLBACK(ags_wave_edit_drawing_area_configure_event), wave_edit, "any_signal::button_press_event", G_CALLBACK(ags_wave_edit_drawing_area_button_press_event), wave_edit, "any_signal::button_release_event", G_CALLBACK(ags_wave_edit_drawing_area_button_release_event), wave_edit, "any_signal::motion_notify_event", G_CALLBACK(ags_wave_edit_drawing_area_motion_notify_event), wave_edit, "any_signal::key_press_event", G_CALLBACK(ags_wave_edit_drawing_area_key_press_event), wave_edit, "any_signal::key_release_event", G_CALLBACK(ags_wave_edit_drawing_area_key_release_event), wave_edit, NULL); /* scrollbars */ g_object_disconnect((GObject *) wave_edit->vscrollbar, "any_signal::value-changed", G_CALLBACK(ags_wave_edit_vscrollbar_value_changed), (gpointer) wave_edit, NULL); g_object_disconnect((GObject *) wave_edit->hscrollbar, "any_signal::value-changed", G_CALLBACK(ags_wave_edit_hscrollbar_value_changed), (gpointer) wave_edit, NULL); } AtkObject* ags_wave_edit_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_wave_edit_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } gboolean ags_accessible_wave_edit_do_action(AtkAction *action, gint i) { AgsWaveEdit *wave_edit; GdkEventKey *key_press, *key_release; GdkEventKey *modifier_press, *modifier_release; GdkEventKey *second_level_press, *second_level_release; if(!(i >= 0 && i < 7)){ return(FALSE); } wave_edit = (AgsWaveEdit *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); key_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); /* create modifier */ modifier_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); modifier_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); modifier_press->keyval = modifier_release->keyval = GDK_KEY_Control_R; /* create second level */ second_level_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); second_level_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); second_level_press->keyval = second_level_release->keyval = GDK_KEY_Shift_R; switch(i){ case 0: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); } break; case 1: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); } break; case 2: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 3: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) second_level_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) second_level_release); } break; case 4: { key_press->keyval = key_release->keyval = GDK_KEY_c; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 5: { key_press->keyval = key_release->keyval = GDK_KEY_x; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) modifier_release); } break; case 6: { key_press->keyval = key_release->keyval = GDK_KEY_v; /* send event */ gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) wave_edit->drawing_area, (GdkEvent *) modifier_release); } break; } return(TRUE); } gint ags_accessible_wave_edit_get_n_actions(AtkAction *action) { return(7); } const gchar* ags_accessible_wave_edit_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move cursor left", "move cursor right", "move cursor small left", "move cursor small right", "copy wave to clipboard", "cut wave to clipbaord", "paste wave from clipboard", }; if(i >= 0 && i < 7){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_wave_edit_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "small-left", "small-right", "copy", "cut", "paste", }; if(i >= 0 && i < 7){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_wave_edit_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "Shft+Left", "Shft+Right", "Ctrl+c", "Ctrl+x", "Ctrl+v", }; if(i >= 0 && i < 7){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_wave_edit_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_wave_edit_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_wave_edit_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width = natural_width = NULL; } void ags_wave_edit_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height = natural_height = NULL; } void ags_wave_edit_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsWaveEdit *wave_edit; GdkWindow *window; AgsApplicationContext *application_context; GtkAllocation child_allocation; gdouble gui_scale_factor; wave_edit = AGS_WAVE_EDIT(widget); application_context = ags_application_context_get_instance(); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); allocation->height = (gint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_HEIGHT); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = allocation->width; child_allocation.height = (gint) (gui_scale_factor * AGS_LEVEL_DEFAULT_LEVEL_HEIGHT); gtk_widget_size_allocate((GtkWidget *) wave_edit->drawing_area, &child_allocation); window = gtk_widget_get_window((GtkWidget *) wave_edit->drawing_area); gdk_window_move(window, allocation->x, allocation->y); } void ags_wave_edit_show(GtkWidget *widget) { AgsWaveEdit *wave_edit; GtkAllocation allocation; wave_edit = AGS_WAVE_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_wave_edit_parent_class)->show(widget); gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); gtk_widget_show((GtkWidget *) wave_edit->drawing_area); if((AGS_WAVE_EDIT_SHOW_RULER & (wave_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) wave_edit->ruler); } if((AGS_WAVE_EDIT_SHOW_VSCROLLBAR & (wave_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) wave_edit->vscrollbar); } if((AGS_WAVE_EDIT_SHOW_HSCROLLBAR & (wave_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) wave_edit->hscrollbar); } } void ags_wave_edit_show_all(GtkWidget *widget) { AgsWaveEdit *wave_edit; wave_edit = AGS_WAVE_EDIT(widget); /* call parent */ GTK_WIDGET_CLASS(ags_wave_edit_parent_class)->show_all(widget); gtk_widget_show_all((GtkWidget *) wave_edit->drawing_area); if((AGS_WAVE_EDIT_SHOW_RULER & (wave_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) wave_edit->ruler); } if((AGS_WAVE_EDIT_SHOW_VSCROLLBAR & (wave_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) wave_edit->vscrollbar); } if((AGS_WAVE_EDIT_SHOW_HSCROLLBAR & (wave_edit->flags)) != 0){ gtk_widget_show((GtkWidget *) wave_edit->hscrollbar); } } gboolean ags_wave_edit_auto_scroll_timeout(GtkWidget *widget) { if(g_hash_table_lookup(ags_wave_edit_auto_scroll, widget) != NULL){ AgsWaveEditor *wave_editor; AgsWaveEdit *wave_edit; GtkAdjustment *hscrollbar_adjustment; GObject *output_soundcard; double x; wave_edit = AGS_WAVE_EDIT(widget); if((AGS_WAVE_EDIT_AUTO_SCROLL & (wave_edit->flags)) == 0){ return(TRUE); } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return(TRUE); } hscrollbar_adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->hscrollbar)); /* reset offset */ g_object_get(wave_editor->selected_machine->audio, "output-soundcard", &output_soundcard, NULL); wave_edit->note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); wave_edit->note_offset_absolute = ags_soundcard_get_note_offset_absolute(AGS_SOUNDCARD(output_soundcard)); /* reset scrollbar */ x = ((wave_edit->note_offset * wave_edit->control_width) / (AGS_WAVE_EDITOR_MAX_CONTROLS * wave_edit->control_width)) * gtk_adjustment_get_upper(hscrollbar_adjustment); gtk_range_set_value(GTK_RANGE(wave_edit->hscrollbar), x); g_object_unref(output_soundcard); return(TRUE); }else{ return(FALSE); } } void ags_wave_edit_reset_vscrollbar(AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; GtkAdjustment *adjustment; GtkAllocation allocation; double varea_height; gdouble upper, old_upper; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->vscrollbar)); gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); /* upper */ old_upper = gtk_adjustment_get_upper(adjustment); varea_height = wave_edit->step_count * wave_edit->control_height; upper = varea_height - allocation.height; if(upper < 0.0){ upper = 0.0; } gtk_adjustment_set_upper(adjustment, upper); /* reset value */ if(old_upper != 0.0){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) / old_upper * upper); } } void ags_wave_edit_reset_hscrollbar(AgsWaveEdit *wave_edit) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; GtkAdjustment *adjustment; GtkAllocation allocation; double zoom_factor, zoom; double zoom_correction; guint map_width; gdouble upper, old_upper; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } wave_toolbar = wave_editor->wave_toolbar; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); /* adjustment */ adjustment = gtk_range_get_adjustment(GTK_RANGE(wave_edit->hscrollbar)); /* zoom */ zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); /* upper */ old_upper = gtk_adjustment_get_upper(adjustment); zoom_correction = 1.0 / 16; map_width = ((double) AGS_WAVE_EDITOR_MAX_CONTROLS * zoom * zoom_correction); upper = map_width - allocation.width; if(upper < 0.0){ upper = 0.0; } gtk_adjustment_set_upper(adjustment, upper); /* ruler */ wave_edit->ruler->factor = zoom_factor; wave_edit->ruler->precision = zoom; wave_edit->ruler->scale_precision = 1.0 / zoom; gtk_adjustment_set_upper(wave_edit->ruler->adjustment, upper / wave_edit->control_width); /* reset value */ if(old_upper != 0.0){ #if 0 gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) / old_upper * upper); #endif } } void ags_wave_edit_draw_segment(AgsWaveEdit *wave_edit, cairo_t *cr) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; GtkStyleContext *wave_edit_style_context; GtkAdjustment *hscrollbar_adjustment; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; gdouble gui_scale_factor; gdouble x_offset, y_offset; gdouble translated_ground; double tact; gdouble y; gdouble map_height; gdouble width, height; guint control_width; guint i, j; guint j_set; GValue value = {0,}; const static double quarter_dashes = { 0.25, }; const static double segment_dashes = { 0.5, }; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } application_context = ags_application_context_get_instance(); wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } wave_toolbar = wave_editor->wave_toolbar; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* dimension and offset */ x_offset = gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)); y_offset = gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar)); y = (gdouble) 0.0; width = (gdouble) allocation.width; height = (gdouble) allocation.height; /* style context */ wave_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(wave_edit->drawing_area)); gtk_style_context_get_property(wave_edit_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(wave_edit_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(wave_edit_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); /* push group */ cairo_push_group(cr); /* background */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, y, width, height); cairo_fill(cr); /* background border */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_set_line_width(cr, 1.0); cairo_rectangle(cr, 0.0, y, width, height); cairo_stroke(cr); cairo_set_line_width(cr, 1.0); tact = exp2((double) gtk_combo_box_get_active(wave_toolbar->zoom) - 2.0); map_height = (gdouble) height; control_width = (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH); i = control_width - (guint) x_offset % control_width; cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); if(i < width && tact > 1.0 ){ j_set = ((guint) x_offset / control_width + 1) % ((guint) tact); cairo_set_dash(cr, &segment_dashes, 1, 0.0); if(j_set != 0){ j = j_set; goto ags_wave_edit_draw_segment0; } } for(; i < width; ){ cairo_set_dash(cr, NULL, 0, 0.0); cairo_move_to(cr, (double) i, y); cairo_line_to(cr, (double) i, y + height); cairo_stroke(cr); i += control_width; cairo_set_dash(cr, &segment_dashes, 1, 0.0); for(j = 1; i < width && j < tact; j++){ ags_wave_edit_draw_segment0: cairo_move_to(cr, (double) i, y); cairo_line_to(cr, (double) i, y + height); cairo_stroke(cr); i += control_width; } } cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); /* middle */ if(map_height * 0.5 < height){ cairo_move_to(cr, 0.0, y + map_height * 0.5); cairo_line_to(cr, width, y + map_height * 0.5); cairo_stroke(cr); } /* set dash */ cairo_set_dash(cr, &quarter_dashes, 1, 0.0); /* lower quarter */ if(map_height * 0.25 < height){ cairo_move_to(cr, 0.0, y + map_height * 0.25); cairo_line_to(cr, width, y + map_height * 0.25); cairo_stroke(cr); } /* upper quarter */ if(map_height * 0.75 < height){ cairo_move_to(cr, 0.0, y + map_height * 0.75); cairo_line_to(cr, width, y + map_height * 0.75); cairo_stroke(cr); } /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); } void ags_wave_edit_draw_position(AgsWaveEdit *wave_edit, cairo_t *cr) { AgsWaveEditor *wave_editor; GtkStyleContext *wave_edit_style_context; AgsApplicationContext *application_context; GdkRGBA *fg_color_active; gdouble gui_scale_factor; double position; double x, y; double width, height; gboolean height_fits; GValue value = {0,}; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } application_context = ags_application_context_get_instance(); wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* style context */ wave_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(wave_edit->drawing_area)); gtk_style_context_get_property(wave_edit_style_context, "color", GTK_STATE_FLAG_ACTIVE, &value); fg_color_active = g_value_dup_boxed(&value); g_value_unset(&value); /* get offset and dimensions */ position = ((double) wave_edit->note_offset) * ((double) wave_edit->control_width); y = 0.0; x = (position) - (gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar))); width = (double) ((guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_FADER_WIDTH)); height = (double) ((guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_HEIGHT)); /* push group */ cairo_push_group(cr); /* draw fader */ cairo_set_source_rgba(cr, fg_color_active->red, fg_color_active->blue, fg_color_active->green, fg_color_active->alpha); cairo_rectangle(cr, (double) x, (double) y, (double) width, (double) height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_active); } void ags_wave_edit_draw_cursor(AgsWaveEdit *wave_edit, cairo_t *cr) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; GtkStyleContext *wave_edit_style_context; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color_focused; gdouble gui_scale_factor; double zoom, zoom_factor; double x, y; double width, height; gboolean height_fits; GValue value = {0,}; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } application_context = ags_application_context_get_instance(); wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } wave_toolbar = wave_editor->wave_toolbar; /* scale factor */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); /* style context */ wave_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(wave_edit->drawing_area)); gtk_style_context_get_property(wave_edit_style_context, "color", GTK_STATE_FLAG_FOCUSED, &value); fg_color_focused = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); y = 0.0; x = (((double) wave_edit->cursor_position_x) - (gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)))) / zoom_factor; width = (double) ((guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_FADER_WIDTH)); height = (double) ((guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_HEIGHT)); /* push group */ cairo_push_group(cr); /* draw cursor */ cairo_set_source_rgba(cr, fg_color_focused->red, fg_color_focused->blue, fg_color_focused->green, fg_color_focused->alpha); cairo_rectangle(cr, (double) x, (double) y, (double) width, (double) height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_focused); } void ags_wave_edit_draw_selection(AgsWaveEdit *wave_edit, cairo_t *cr) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; GtkStyleContext *wave_edit_style_context; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color_prelight; double zoom, zoom_factor; double x, y; double width, height; GValue value = {0,}; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); wave_toolbar = wave_editor->wave_toolbar; application_context = ags_application_context_get_instance(); /* style context */ wave_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(wave_edit->drawing_area)); gtk_style_context_get_property(wave_edit_style_context, "color", GTK_STATE_FLAG_PRELIGHT, &value); fg_color_prelight = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); /* get offset and dimensions */ if(wave_edit->selection_x0 < wave_edit->selection_x1){ x = (((double) wave_edit->selection_x0) - gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar))) / zoom_factor; width = ((double) wave_edit->selection_x1 - (double) wave_edit->selection_x0) / zoom_factor; }else{ x = (((double) wave_edit->selection_x1) - gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar))) / zoom_factor; width = ((double) wave_edit->selection_x0 - (double) wave_edit->selection_x1) / zoom_factor; } if(wave_edit->selection_y0 < wave_edit->selection_y1){ y = ((double) wave_edit->selection_y0) - gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar)); height = ((double) wave_edit->selection_y1 - (double) wave_edit->selection_y0); }else{ y = ((double) wave_edit->selection_y1) - gtk_range_get_value(GTK_RANGE(wave_edit->vscrollbar)); height = ((double) wave_edit->selection_y0 - (double) wave_edit->selection_y1); } /* clip */ if(x < 0.0){ width += x; x = 0.0; }else if(x > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); return; } if(x + width > allocation.width){ width = ((double) allocation.width) - x; } if(y < 0.0){ height += y; y = 0.0; }else if(y > allocation.height){ g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); return; } if(y + height > allocation.height){ height = ((double) allocation.height) - y; } /* push group */ cairo_push_group(cr); /* draw selection */ cairo_set_source_rgba(cr, fg_color_prelight->red, fg_color_prelight->blue, fg_color_prelight->green, 1.0 / 3.0); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); /* complete */ cairo_pop_group_to_source(cr); cairo_paint(cr); //cairo_surface_mark_dirty(cairo_get_target(cr)); g_boxed_free(GDK_TYPE_RGBA, fg_color_prelight); } void ags_wave_edit_draw_buffer(AgsWaveEdit *wave_edit, AgsBuffer *buffer, cairo_t *cr, gdouble bpm, gdouble opacity) { AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; GtkStyleContext *wave_edit_style_context; AgsApplicationContext *application_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *fg_color_selected; GObject *soundcard; cairo_t *i_cr; cairo_surface_t *surface; unsigned char *image_data, *bg_data; guint samplerate; guint buffer_size; guint format; guint x0, x1; guint x_cut; guint64 x; gdouble width, height; double zoom, zoom_factor; gdouble delay_factor; guint wave_data_width; guint i; GValue value = {0}; GRecMutex *buffer_mutex; if(!AGS_IS_WAVE_EDIT(wave_edit) || !AGS_IS_BUFFER(buffer)){ return; } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } application_context = ags_application_context_get_instance(); wave_toolbar = wave_editor->wave_toolbar; /* style context */ wave_edit_style_context = gtk_widget_get_style_context(GTK_WIDGET(wave_edit->drawing_area)); gtk_style_context_get_property(wave_edit_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(wave_edit_style_context, "color", GTK_STATE_FLAG_SELECTED, &value); fg_color_selected = g_value_dup_boxed(&value); g_value_unset(&value); gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); g_object_get(wave_editor->selected_machine->audio, "output-soundcard", &soundcard, NULL); g_object_unref(soundcard); /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(soundcard)); /* get visisble region */ x0 = gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)); x1 = (gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)) + allocation.width * zoom_factor); /* width and height */ width = (gdouble) allocation.width; height = (gdouble) allocation.height; /* draw point */ g_object_get(buffer, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, "x", &x, NULL); x_cut = x0; if(((((double) (x) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut < 0.0 || ((((double) (x) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut > allocation.width){ g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); return; } wave_data_width = buffer_size; /* if(wave_edit->stride != cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, wave_data_width)){ if(wave_edit->wave_data != NULL){ free(wave_edit->wave_data); } wave_edit->stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, wave_data_width); wave_edit->wave_data = malloc(wave_edit->stride * AGS_WAVE_EDIT_DEFAULT_HEIGHT); } surface = cairo_image_surface_create_for_data(wave_edit->wave_data, CAIRO_FORMAT_ARGB32, wave_data_width, AGS_WAVE_EDIT_DEFAULT_HEIGHT, wave_edit->stride); i_cr = cairo_create(surface); */ /* draw buffer */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, opacity * fg_color->alpha); cairo_set_line_width(cr, 1.0); // cairo_scale(cr, // 1.0 / (zoom_factor * (((60.0 / bpm) * ((double) buffer_size / (double) samplerate)) * AGS_WAVE_EDIT_X_RESOLUTION)), 1.0); for(i = 0; i < buffer_size; i += (zoom_factor * 16)){ double y0, y1; y0 = 0.0; y1 = 0.0; g_rec_mutex_lock(buffer_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { y1 = (double) ((gint8 *) buffer->data)[i] / exp2(7.0); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { y1 = (double) ((gint16 *) buffer->data)[i] / exp2(15.0); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { y1 = (double) ((gint32 *) buffer->data)[i] / exp2(23.0); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { y1 = (double) ((gint32 *) buffer->data)[i] / exp2(31.0); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { y1 = (double) ((gint64 *) buffer->data)[i] / exp2(63.0); } break; case AGS_SOUNDCARD_FLOAT: { y1 = (double) ((gfloat *) buffer->data)[i]; } break; case AGS_SOUNDCARD_DOUBLE: { y1 = (double) ((gdouble *) buffer->data)[i]; } break; } g_rec_mutex_unlock(buffer_mutex); y0 = 0.5 * height; y1 = (((y1 + 1.0) * height) / 2.0); cairo_move_to(cr, ((((double) (x + i) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut, y0); cairo_line_to(cr, ((((double) (x + i) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut, y1); cairo_stroke(cr); } /* check buffer selected */ if(ags_buffer_test_flags(buffer, AGS_BUFFER_IS_SELECTED)){ /* draw selected buffer */ cairo_set_source_rgba(cr, fg_color_selected->red, fg_color_selected->blue, fg_color_selected->green, opacity / 3.0); cairo_set_line_width(cr, 1.0 + (double) wave_edit->selected_buffer_border); for(i = 0; i < buffer_size; i += (zoom_factor * 16)){ double y0, y1; y0 = 0.0; y1 = 0.0; g_rec_mutex_lock(buffer_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { y1 = (double) ((gint8 *) buffer->data)[i] / exp2(7.0); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { y1 = (double) ((gint16 *) buffer->data)[i] / exp2(15.0); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { y1 = (double) ((gint32 *) buffer->data)[i] / exp2(23.0); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { y1 = (double) ((gint32 *) buffer->data)[i] / exp2(31.0); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { y1 = (double) ((gint64 *) buffer->data)[i] / exp2(63.0); } break; case AGS_SOUNDCARD_FLOAT: { y1 = (double) ((gfloat *) buffer->data)[i]; } break; case AGS_SOUNDCARD_DOUBLE: { y1 = (double) ((gdouble *) buffer->data)[i]; } break; } g_rec_mutex_unlock(buffer_mutex); y0 = 0.5 * height; y1 = (((y1 + 1.0) * height) / 2.0); cairo_move_to(cr, ((((double) (x + i) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut, y0); cairo_line_to(cr, ((((double) (x + i) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut, y1); cairo_stroke(cr); } } /* draw buffer */ // cairo_set_source_surface(cr, surface, // (bpm / (60.0 * (x / samplerate))) * AGS_WAVE_EDIT_X_RESOLUTION, 0.0); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_selected); } void ags_wave_edit_draw_wave(AgsWaveEdit *wave_edit, cairo_t *cr) { AgsWindow *window; AgsWaveWindow *wave_window; AgsWaveEditor *wave_editor; AgsWaveToolbar *wave_toolbar; AgsTimestamp *current_timestamp; GObject *soundcard; GtkAllocation allocation; GList *start_list_wave, *list_wave; GList *start_list_buffer, *list_buffer; double zoom, zoom_factor; gdouble delay_factor; gdouble opacity; guint line; guint samplerate; gdouble bpm; guint x0, x1; guint x_cut; if(!AGS_IS_WAVE_EDIT(wave_edit)){ return; } wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); if(wave_editor->selected_machine == NULL){ return; } wave_window = (AgsWaveWindow *) gtk_widget_get_ancestor((GtkWidget *) wave_editor, AGS_TYPE_WAVE_WINDOW); window = (AgsWindow *) wave_window->parent_window; wave_toolbar = wave_editor->wave_toolbar; gtk_widget_get_allocation(GTK_WIDGET(wave_edit->drawing_area), &allocation); g_object_get(wave_editor->selected_machine->audio, "output-soundcard", &soundcard, NULL); g_object_unref(soundcard); bpm = gtk_spin_button_get_value(window->navigation->bpm); /* zoom */ zoom = exp2((double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom) - 2.0); zoom_factor = exp2(6.0 - (double) gtk_combo_box_get_active((GtkComboBox *) wave_toolbar->zoom)); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(soundcard)); /* get visisble region */ x0 = (guint) gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)); x1 = ((guint) gtk_range_get_value(GTK_RANGE(wave_edit->hscrollbar)) + allocation.width * zoom_factor); x_cut = x0; /* draw wave */ g_object_get(wave_editor->selected_machine->audio, "wave", &start_list_wave, NULL); list_wave = start_list_wave; line = wave_edit->line; opacity = gtk_spin_button_get_value(wave_editor->wave_toolbar->opacity); while(list_wave != NULL){ AgsWave *wave; GList *start_list_buffer, *list_buffer; guint current_line; guint64 offset; wave = AGS_WAVE(list_wave->data); g_object_get(wave, "timestamp", ¤t_timestamp, "line", ¤t_line, "samplerate", &samplerate, NULL); g_object_unref(current_timestamp); if(current_line != line || current_timestamp == NULL){ list_wave = list_wave->next; continue; } offset = ags_timestamp_get_ags_offset(current_timestamp); if(((((double) (offset) / samplerate * (bpm / 60.0) / delay_factor) * 64.0)) / zoom_factor - x_cut > allocation.width){ break; } g_object_get(wave, "buffer", &start_list_buffer, NULL); list_buffer = start_list_buffer; while(list_buffer != NULL){ ags_wave_edit_draw_buffer(wave_edit, list_buffer->data, cr, bpm, opacity); /* iterate */ list_buffer = list_buffer->next; } g_list_free_full(start_list_buffer, g_object_unref); /* iterate */ list_wave = list_wave->next; } //TODO:JK: implement me g_list_free_full(start_list_wave, g_object_unref); } void ags_wave_edit_draw(AgsWaveEdit *wave_edit, cairo_t *cr) { AgsWaveEditor *wave_editor; wave_editor = (AgsWaveEditor *) gtk_widget_get_ancestor((GtkWidget *) wave_edit, AGS_TYPE_WAVE_EDITOR); ags_wave_editor_reset_scrollbar(wave_editor); ags_wave_edit_reset_vscrollbar(wave_edit); ags_wave_edit_reset_hscrollbar(wave_edit); /* segment */ ags_wave_edit_draw_segment(wave_edit, cr); /* wave */ ags_wave_edit_draw_wave(wave_edit, cr); /* edit mode */ switch(wave_edit->mode){ case AGS_WAVE_EDIT_POSITION_CURSOR: { ags_wave_edit_draw_cursor(wave_edit, cr); } break; case AGS_WAVE_EDIT_SELECT_BUFFER: { ags_wave_edit_draw_selection(wave_edit, cr); } break; } /* fader */ if((AGS_WAVE_EDIT_AUTO_SCROLL & (wave_edit->flags)) != 0){ ags_wave_edit_draw_position(wave_edit, cr); } } /** * ags_wave_edit_new: * @line: the line * * Create a new instance of #AgsWaveEdit. * * Returns: the new #AgsWaveEdit * * Since: 3.0.0 */ AgsWaveEdit* ags_wave_edit_new(guint line) { AgsWaveEdit *wave_edit; wave_edit = (AgsWaveEdit *) g_object_new(AGS_TYPE_WAVE_EDIT, "line", line, NULL); return(wave_edit); } gsequencer-3.1.3/ags/X/editor/ags_sheet_toolbar_callbacks.h0000644000175000017500000000314413607210263020705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_TOOLBAR_CALLBACKS_H__ #define __AGS_SHEET_TOOLBAR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_sheet_toolbar_position_callback(GtkToggleToolButton *toggle_button, AgsSheetToolbar *sheet_toolbar); void ags_sheet_toolbar_clear_callback(GtkToggleToolButton *toggle_button, AgsSheetToolbar *sheet_toolbar); void ags_sheet_toolbar_select_callback(GtkToggleToolButton *toggle_button, AgsSheetToolbar *sheet_toolbar); void ags_sheet_toolbar_copy_or_cut_callback(GtkWidget *widget, AgsSheetToolbar *sheet_toolbar); void ags_sheet_toolbar_paste_callback(GtkWidget *widget, AgsSheetToolbar *sheet_toolbar); G_END_DECLS #endif /*__AGS_SHEET_TOOLBAR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_input_editor.h0000644000175000017500000000447013607210263015276 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_EDITOR_H__ #define __AGS_INPUT_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_INPUT_EDITOR (ags_input_editor_get_type()) #define AGS_INPUT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_INPUT_EDITOR, AgsInputEditor)) #define AGS_INPUT_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_INPUT_EDITOR, AgsInputEditorClass)) #define AGS_IS_INPUT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_INPUT_EDITOR)) #define AGS_IS_INPUT_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_INPUT_EDITOR)) #define AGS_INPUT_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_INPUT_EDITOR, AgsInputEditorClass)) #define AGS_INPUT_EDITOR_DEFAULT_VERSION "2.0.0" #define AGS_INPUT_EDITOR_DEFAULT_BUILD_ID "Sun Aug 26 18:34:53 UTC 2018" typedef struct _AgsInputEditor AgsInputEditor; typedef struct _AgsInputEditorClass AgsInputEditorClass; typedef enum{ AGS_INPUT_EDITOR_CONNECTED = 1, }AgsInputEditorFlags; struct _AgsInputEditor { GtkHBox hbox; guint flags; gchar *version; gchar *build_id; GtkComboBoxText *soundcard; GtkSpinButton *audio_channel; }; struct _AgsInputEditorClass { GtkHBoxClass hbox; }; GType ags_input_editor_get_type(void); void ags_input_editor_check(AgsInputEditor *input_editor); AgsInputEditor* ags_input_editor_new(); G_END_DECLS #endif /*__AGS_INPUT_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_ladspa_browser_callbacks.h0000644000175000017500000000252113607210263017572 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_BROWSER_CALLBACKS_H__ #define __AGS_LADSPA_BROWSER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_ladspa_browser_plugin_filename_callback(GtkComboBoxText *combo_box, AgsLadspaBrowser *ladspa_browser); void ags_ladspa_browser_plugin_effect_callback(GtkComboBoxText *combo_box, AgsLadspaBrowser *ladspa_browser); G_END_DECLS #endif /*__AGS_LADSPA_BROWSER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_resize_editor.h0000644000175000017500000000414113607210263015433 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RESIZE_EDITOR_H__ #define __AGS_RESIZE_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RESIZE_EDITOR (ags_resize_editor_get_type()) #define AGS_RESIZE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RESIZE_EDITOR, AgsResizeEditor)) #define AGS_RESIZE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RESIZE_EDITOR, AgsResizeEditorClass)) #define AGS_IS_RESIZE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RESIZE_EDITOR)) #define AGS_IS_RESIZE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RESIZE_EDITOR)) #define AGS_RESIZE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RESIZE_EDITOR, AgsResizeEditorClass)) typedef struct _AgsResizeEditor AgsResizeEditor; typedef struct _AgsResizeEditorClass AgsResizeEditorClass; struct _AgsResizeEditor { AgsPropertyEditor property_editor; GtkSpinButton *audio_channels; GtkSpinButton *input_pads; GtkSpinButton *output_pads; }; struct _AgsResizeEditorClass { AgsPropertyEditorClass property_editor; }; AgsResizeEditor* ags_resize_editor_new(); G_END_DECLS #endif /*__AGS_RESIZE_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_bulk_member_callbacks.c0000644000175000017500000000722413607210263017047 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_bulk_member_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsBulkMember *bulk_member) { if(old_parent == NULL){ //TODO:JK: implement me } } void ags_bulk_member_dial_changed_callback(GtkWidget *dial, AgsBulkMember *bulk_member) { GtkAdjustment *adjustment; gdouble value; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } g_object_get(dial, "adjustment", &adjustment, NULL); value = gtk_adjustment_get_value(adjustment); ags_bulk_member_change_port(bulk_member, (gpointer) &value); } void ags_bulk_member_vscale_changed_callback(GtkWidget *vscale, AgsBulkMember *bulk_member) { GtkAdjustment *adjustment; gdouble value; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } adjustment = gtk_range_get_adjustment(GTK_RANGE(vscale)); value = gtk_adjustment_get_value(adjustment); ags_bulk_member_change_port(bulk_member, (gpointer) &value); } void ags_bulk_member_hscale_changed_callback(GtkWidget *hscale, AgsBulkMember *bulk_member) { GtkAdjustment *adjustment; gdouble value; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } adjustment = gtk_range_get_adjustment(GTK_RANGE(hscale)); value = gtk_adjustment_get_value(adjustment); ags_bulk_member_change_port(bulk_member, &value); } void ags_bulk_member_spin_button_changed_callback(GtkWidget *spin_button, AgsBulkMember *bulk_member) { GtkAdjustment *adjustment; gdouble value; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } adjustment = gtk_spin_button_get_adjustment((GtkSpinButton *) spin_button); value = gtk_adjustment_get_value(adjustment); ags_bulk_member_change_port(bulk_member, &value); } void ags_bulk_member_check_button_clicked_callback(GtkWidget *check_button, AgsBulkMember *bulk_member) { gboolean active; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } active = gtk_toggle_button_get_active((GtkToggleButton *) check_button); ags_bulk_member_change_port(bulk_member, &(active)); } void ags_bulk_member_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsBulkMember *bulk_member) { gboolean active; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } active = gtk_toggle_button_get_active((GtkToggleButton *) toggle_button); ags_bulk_member_change_port(bulk_member, &(active)); } void ags_bulk_member_button_clicked_callback(GtkWidget *button, AgsBulkMember *bulk_member) { gboolean active; if((AGS_BULK_MEMBER_NO_UPDATE & (bulk_member->flags)) != 0){ return; } ags_bulk_member_change_port(bulk_member, &(active)); } void ags_bulk_member_port_safe_write_callback(AgsPort *port, GValue *value, AgsBulkMember *bulk_member) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/ags_sheet_window.c0000644000175000017500000001714213607210263015263 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_sheet_window_class_init(AgsSheetWindowClass *sheet_window); void ags_sheet_window_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sheet_window_init(AgsSheetWindow *sheet_window); void ags_sheet_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sheet_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sheet_window_finalize(GObject *gobject); void ags_sheet_window_connect(AgsConnectable *connectable); void ags_sheet_window_disconnect(AgsConnectable *connectable); gboolean ags_sheet_window_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_sheet_window * @short_description: The sheet window * @title: AgsSheetWindow * @section_id: * @include: ags/X/ags_sheet_window.h * * #AgsSheetWindow lets you edit audio files. */ enum{ PROP_0, PROP_SOUNDCARD, }; static gpointer ags_sheet_window_parent_class = NULL; GType ags_sheet_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sheet_window = 0; static const GTypeInfo ags_sheet_window_info = { sizeof (AgsSheetWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sheet_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSheetWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sheet_window_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sheet_window_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sheet_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsSheetWindow", &ags_sheet_window_info, 0); g_type_add_interface_static(ags_type_sheet_window, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sheet_window); } return g_define_type_id__volatile; } void ags_sheet_window_class_init(AgsSheetWindowClass *sheet_window) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_sheet_window_parent_class = g_type_class_peek_parent(sheet_window); /* GObjectClass */ gobject = (GObjectClass *) sheet_window; gobject->set_property = ags_sheet_window_set_property; gobject->get_property = ags_sheet_window_get_property; gobject->finalize = ags_sheet_window_finalize; /** * AgsSheetWindow:soundcard: * * The assigned #AgsSoundcard acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("assigned soundcard"), i18n_pspec("The soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) sheet_window; widget->delete_event = ags_sheet_window_delete_event; } void ags_sheet_window_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_sheet_window_connect; connectable->disconnect = ags_sheet_window_disconnect; } void ags_sheet_window_init(AgsSheetWindow *sheet_window) { g_object_set(G_OBJECT(sheet_window), "title", "edit sheet", NULL); sheet_window->flags = 0; sheet_window->soundcard = NULL; sheet_window->sheet_editor = ags_sheet_editor_new(); gtk_container_add((GtkContainer *) sheet_window, (GtkWidget *) sheet_window->sheet_editor); } void ags_sheet_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSheetWindow *sheet_window; sheet_window = AGS_SHEET_WINDOW(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); if(sheet_window->soundcard == soundcard){ return; } if(sheet_window->soundcard != NULL){ g_object_unref(sheet_window->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } sheet_window->soundcard = soundcard; g_object_set(G_OBJECT(sheet_window->sheet_editor), "soundcard", soundcard, NULL); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sheet_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSheetWindow *sheet_window; sheet_window = AGS_SHEET_WINDOW(gobject); switch(prop_id){ case PROP_SOUNDCARD: g_value_set_object(value, sheet_window->soundcard); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sheet_window_connect(AgsConnectable *connectable) { AgsSheetWindow *sheet_window; sheet_window = AGS_SHEET_WINDOW(connectable); if((AGS_SHEET_WINDOW_CONNECTED & (sheet_window->flags)) != 0){ return; } sheet_window->flags |= AGS_SHEET_WINDOW_CONNECTED; if(sheet_window->sheet_editor != NULL){ ags_connectable_connect(AGS_CONNECTABLE(sheet_window->sheet_editor)); } } void ags_sheet_window_disconnect(AgsConnectable *connectable) { AgsSheetWindow *sheet_window; sheet_window = AGS_SHEET_WINDOW(connectable); if((AGS_SHEET_WINDOW_CONNECTED & (sheet_window->flags)) == 0){ return; } sheet_window->flags &= (~AGS_SHEET_WINDOW_CONNECTED); if(sheet_window->sheet_editor != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(sheet_window->sheet_editor)); } } void ags_sheet_window_finalize(GObject *gobject) { AgsSheetWindow *sheet_window; sheet_window = (AgsSheetWindow *) gobject; if(sheet_window->soundcard != NULL){ g_object_unref(G_OBJECT(sheet_window->soundcard)); } G_OBJECT_CLASS(ags_sheet_window_parent_class)->finalize(gobject); } gboolean ags_sheet_window_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); return(TRUE); } /** * ags_sheet_window_new: * @parent_window: the parent #AgsWindow * * Instantiate #AgsSheetWindow * * Returns: the new #AgsSheetWindow instance * * Since: 3.0.0 */ AgsSheetWindow* ags_sheet_window_new(GtkWidget *parent_window) { AgsSheetWindow *sheet_window; sheet_window = (AgsSheetWindow *) g_object_new(AGS_TYPE_SHEET_WINDOW, NULL); sheet_window->parent_window = parent_window; return(sheet_window); } gsequencer-3.1.3/ags/X/ags_wave_editor_callbacks.c0000644000175000017500000001312313607210263017066 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gboolean ags_wave_editor_edit_configure_event(GtkWidget *widget, GdkEventConfigure *event, AgsWaveEditor *wave_editor) { ags_wave_editor_reset_scrollbar(wave_editor); return(FALSE); } void ags_wave_editor_vscrollbar_value_changed(GtkRange *range, AgsWaveEditor *wave_editor) { GtkAdjustment *vadjustment; vadjustment = gtk_viewport_get_vadjustment(wave_editor->scrolled_wave_edit_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); vadjustment = gtk_viewport_get_vadjustment(wave_editor->scrolled_level_box->viewport); gtk_adjustment_set_value(vadjustment, gtk_range_get_value(range)); } void ags_wave_editor_hscrollbar_value_changed(GtkRange *range, AgsWaveEditor *wave_editor) { AgsConfig *config; GList *list_start, *list; gchar *str; gdouble gui_scale_factor; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_adjustment_set_value(wave_editor->ruler->adjustment, gtk_range_get_value(range) / (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH)); gtk_widget_queue_draw(GTK_WIDGET(wave_editor->ruler)); /* wave edit */ if((AGS_WAVE_EDITOR_RESET_HSCROLLBAR & (wave_editor->flags)) == 0){ list_start = list = gtk_container_get_children(GTK_CONTAINER(wave_editor->scrolled_wave_edit_box->wave_edit_box)); while(list != NULL){ GtkAdjustment *adjustment; adjustment = gtk_range_get_adjustment(GTK_RANGE(AGS_WAVE_EDIT(list->data)->hscrollbar)); gtk_adjustment_set_value(adjustment, gtk_range_get_value(range)); list = list->next; } g_list_free(list_start); } } void ags_wave_editor_wave_edit_hscrollbar_value_changed(GtkRange *range, AgsWaveEditor *wave_editor) { AgsConfig *config; GList *list_start, *list; gchar *str; gdouble gui_scale_factor; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } gtk_adjustment_set_value(wave_editor->ruler->adjustment, gtk_range_get_value(range) / (guint) (gui_scale_factor * AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH)); gtk_widget_queue_draw(GTK_WIDGET(wave_editor->ruler)); /* wave edit */ if((AGS_WAVE_EDITOR_RESET_HSCROLLBAR & (wave_editor->flags)) == 0){ list_start = list = gtk_container_get_children(GTK_CONTAINER(wave_editor->scrolled_wave_edit_box->wave_edit_box)); while(list != NULL){ GtkAdjustment *adjustment; adjustment = gtk_range_get_adjustment(GTK_RANGE(AGS_WAVE_EDIT(list->data)->hscrollbar)); gtk_adjustment_set_value(adjustment, gtk_range_get_value(range)); list = list->next; } g_list_free(list_start); } } void ags_wave_editor_machine_changed_callback(AgsMachineSelector *machine_selector, AgsMachine *machine, AgsWaveEditor *wave_editor) { ags_wave_editor_machine_changed(wave_editor, machine); } void ags_wave_editor_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsWaveEditor *wave_editor) { guint input_pads; guint i; g_object_get(machine->audio, "input-pads", &input_pads, NULL); if(audio_channels > audio_channels_old){ GList *tab; for(i = audio_channels_old * input_pads; i < audio_channels * input_pads; i++){ ags_notebook_insert_tab(wave_editor->notebook, i); tab = wave_editor->notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } }else{ /* shrink notebook */ for(i = audio_channels * input_pads; i < audio_channels_old * input_pads; i++){ ags_notebook_remove_tab(wave_editor->notebook, audio_channels); } } //TODO:JK: implement me } void ags_wave_editor_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsWaveEditor *wave_editor) { AgsAudio *audio; GList *tab; guint audio_channels; guint i; /* verify pads */ if(!g_type_is_a(channel_type, AGS_TYPE_INPUT)){ return; } audio = machine->audio; g_object_get(audio, "audio-channels", &audio_channels, NULL); for(i = audio_channels * pads_old; i < audio_channels * pads; i++){ ags_notebook_insert_tab(wave_editor->notebook, i); tab = wave_editor->notebook->tab; gtk_toggle_button_set_active(AGS_NOTEBOOK_TAB(tab->data)->toggle, TRUE); } //TODO:JK: implement me } gsequencer-3.1.3/ags/X/ags_midi_dialog_callbacks.h0000644000175000017500000000270013607210263017023 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_DIALOG_CALLBACKS_H__ #define __AGS_MIDI_DIALOG_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS int ags_midi_dialog_apply_callback(GtkWidget *widget, AgsMidiDialog *midi_dialog); int ags_midi_dialog_ok_callback(GtkWidget *widget, AgsMidiDialog *midi_dialog); int ags_midi_dialog_cancel_callback(GtkWidget *widget, AgsMidiDialog *midi_dialog); gboolean ags_midi_dialog_delete_event(GtkWidget *widget, GdkEventAny *event, AgsMidiDialog *midi_dialog); G_END_DECLS #endif /*__AGS_MIDI_DIALOG_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_input_editor_callbacks.h0000644000175000017500000000246013607210263017272 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_EDITOR_CALLBACKS_H__ #define __AGS_INPUT_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_input_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsInputEditor *input_editor); void ags_input_editor_soundcard_callback(GtkComboBoxText *combo_box, AgsInputEditor *input_editor); G_END_DECLS #endif /*__AGS_INPUT_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_playback_window_callbacks.h0000644000175000017500000000203713607210263017742 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAYBACK_WINDOW_CALLBACKS_H__ #define __AGS_PLAYBACK_WINDOW_CALLBACKS_H__ #include #include #include #include #include #include #endif /*__AGS_PLAYBACK_WINDOW_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_window.c0000644000175000017500000004771013613101102014063 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include "config.h" #ifdef AGS_WITH_QUARTZ #include #endif #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include #include #include #include void ags_window_class_init(AgsWindowClass *window); void ags_window_connectable_interface_init(AgsConnectableInterface *connectable); void ags_window_init(AgsWindow *window); void ags_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_window_finalize(GObject *gobject); void ags_window_connect(AgsConnectable *connectable); void ags_window_disconnect(AgsConnectable *connectable); void ags_window_show(GtkWidget *widget); gboolean ags_window_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_window * @short_description: The window object. * @title: AgsWindow * @section_id: * @include: ags/X/ags_window.h * * #AgsWindow is a composite toplevel widget. It contains the * menubar, the machine rack and the notation editor. */ enum{ PROP_0, PROP_SOUNDCARD, }; static gpointer ags_window_parent_class = NULL; GHashTable *ags_window_load_file = NULL; GType ags_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_window = 0; static const GTypeInfo ags_window_info = { sizeof (AgsWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_window_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_window_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsWindow", &ags_window_info, 0); g_type_add_interface_static(ags_type_window, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_window); } return g_define_type_id__volatile; } void ags_window_class_init(AgsWindowClass *window) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_window_parent_class = g_type_class_peek_parent(window); /* GObjectClass */ gobject = (GObjectClass *) window; gobject->set_property = ags_window_set_property; gobject->get_property = ags_window_get_property; gobject->finalize = ags_window_finalize; /* properties */ /* GtkWidgetClass */ widget = (GtkWidgetClass *) window; widget->show = ags_window_show; widget->delete_event = ags_window_delete_event; } void ags_window_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_window_connect; connectable->disconnect = ags_window_disconnect; } void ags_window_init(AgsWindow *window) { GtkVBox *vbox; GtkViewport *viewport; GtkWidget *scrolled_window; AgsApplicationContext *application_context; gchar *str; GError *error; application_context = ags_application_context_get_instance(); window->flags = 0; g_signal_connect(application_context, "setup-completed", G_CALLBACK(ags_window_setup_completed_callback), window); error = NULL; str = g_strdup_printf("%s%s", DESTDIR, "/gsequencer/icons/jumper.png"); g_object_set(G_OBJECT(window), "icon", gdk_pixbuf_new_from_file(str, &error), NULL); g_free(str); if(error != NULL){ g_error_free(error); } /* window name and title */ window->filename = NULL; window->name = g_strdup("unnamed"); str = g_strconcat("GSequencer - ", window->name, NULL); gtk_window_set_title((GtkWindow *) window, str); g_free(str); /* vbox */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) window, (GtkWidget*) vbox); /* menubar */ window->context_menu = ags_context_menu_new(); gtk_widget_set_events(GTK_WIDGET(window), (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK)); gtk_widget_show_all(GTK_WIDGET(window->context_menu)); g_signal_connect((GObject *) window, "button-press-event", G_CALLBACK(ags_window_button_press_event), (gpointer) window); window->menu_bar = ags_menu_bar_new(); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) window->menu_bar, FALSE, FALSE, 0); gtk_widget_show_all(window->menu_bar); /* vpaned and scrolled window */ window->paned = (GtkVPaned *) gtk_vpaned_new(); gtk_box_pack_start((GtkBox*) vbox, (GtkWidget*) window->paned, TRUE, TRUE, 0); viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_paned_pack1((GtkPaned *) window->paned, (GtkWidget *) viewport, TRUE, TRUE); scrolled_window = (GtkWidget *) gtk_scrolled_window_new(NULL, NULL); gtk_container_add((GtkContainer *) viewport, (GtkWidget *) scrolled_window); /* machines rack */ window->machines = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport((GtkScrolledWindow *) scrolled_window, (GtkWidget *) window->machines); window->machine_counter = ags_window_standard_machine_counter_alloc(); window->selected = NULL; /* editor */ viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_paned_pack2((GtkPaned *) window->paned, (GtkWidget *) viewport, TRUE, TRUE); window->notation_editor = g_object_new(AGS_TYPE_NOTATION_EDITOR, "homogeneous", FALSE, "spacing", 0, NULL); gtk_container_add((GtkContainer *) viewport, (GtkWidget *) window->notation_editor); /* navigation */ window->navigation = g_object_new(AGS_TYPE_NAVIGATION, "homogeneous", FALSE, "spacing", 0, NULL); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) window->navigation, FALSE, FALSE, 0); /* windows and dialogs */ window->dialog = NULL; window->automation_window = ags_automation_window_new((GtkWidget *) window); window->wave_window = ags_wave_window_new((GtkWidget *) window); window->export_window = (AgsExportWindow *) g_object_new(AGS_TYPE_EXPORT_WINDOW, "main-window", window, NULL); window->midi_import_wizard = NULL; window->midi_export_wizard = NULL; window->midi_file_chooser = NULL; window->preferences = NULL; /* load file */ if(ags_window_load_file == NULL){ ags_window_load_file = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_window_load_file, window, ags_window_load_file_timeout); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_window_load_file_timeout, (gpointer) window); } void ags_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWindow *window; window = AGS_WINDOW(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWindow *window; window = AGS_WINDOW(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_window_connect(AgsConnectable *connectable) { AgsWindow *window; GList *list, *list_start; window = AGS_WINDOW(connectable); if((AGS_WINDOW_CONNECTED & (window->flags)) != 0){ return; } window->flags |= AGS_WINDOW_CONNECTED; g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(ags_window_delete_event_callback), NULL); ags_connectable_connect(AGS_CONNECTABLE(window->context_menu)); ags_connectable_connect(AGS_CONNECTABLE(window->menu_bar)); list_start = list = gtk_container_get_children((GtkContainer *) window->machines); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); ags_connectable_connect(AGS_CONNECTABLE(window->notation_editor)); ags_connectable_connect(AGS_CONNECTABLE(window->navigation)); ags_connectable_connect(AGS_CONNECTABLE(window->automation_window)); ags_connectable_connect(AGS_CONNECTABLE(window->wave_window)); ags_connectable_connect(AGS_CONNECTABLE(window->export_window)); } void ags_window_disconnect(AgsConnectable *connectable) { AgsWindow *window; GList *list, *list_start; window = AGS_WINDOW(connectable); if((AGS_WINDOW_CONNECTED & (window->flags)) == 0){ return; } window->flags &= (~AGS_WINDOW_CONNECTED); g_object_disconnect(window, "any_signal::delete_event", G_CALLBACK(ags_window_delete_event_callback), NULL, NULL); ags_connectable_disconnect(AGS_CONNECTABLE(window->context_menu)); ags_connectable_disconnect(AGS_CONNECTABLE(window->menu_bar)); list_start = list = gtk_container_get_children((GtkContainer *) window->machines); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); ags_connectable_disconnect(AGS_CONNECTABLE(window->notation_editor)); ags_connectable_disconnect(AGS_CONNECTABLE(window->navigation)); ags_connectable_disconnect(AGS_CONNECTABLE(window->automation_window)); ags_connectable_disconnect(AGS_CONNECTABLE(window->wave_window)); ags_connectable_disconnect(AGS_CONNECTABLE(window->export_window)); } void ags_window_finalize(GObject *gobject) { AgsWindow *window; window = (AgsWindow *) gobject; /* remove message monitor */ g_hash_table_remove(ags_window_load_file, window); g_object_unref(G_OBJECT(window->export_window)); if(window->name != NULL){ free(window->name); } /* call parent */ G_OBJECT_CLASS(ags_window_parent_class)->finalize(gobject); } void ags_window_show(GtkWidget *widget) { AgsWindow *window; window = (AgsWindow *) widget; GTK_WIDGET_CLASS(ags_window_parent_class)->show(widget); } gboolean ags_window_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_destroy(widget); GTK_WIDGET_CLASS(ags_window_parent_class)->delete_event(widget, event); return(FALSE); } /** * ags_window_standard_machine_counter_alloc: * * Keep track of count of machines. Allocates a #GList of well * known machines. * * Returns: a new #GList containing #AgsMachineCounter for know machines * * Since: 3.0.0 */ GList* ags_window_standard_machine_counter_alloc() { GList *machine_counter = NULL; machine_counter = NULL; machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_PANEL, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_MIXER, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_SPECTROMETER, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_EQUALIZER10, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_DRUM, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_MATRIX, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_SYNTH, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_FM_SYNTH, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_SYNCSYNTH, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_FM_SYNCSYNTH, 0)); #ifdef AGS_WITH_LIBINSTPATCH machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_FFPLAYER, 0)); #endif machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_PITCH_SAMPLER, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_AUDIOREC, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_LADSPA_BRIDGE, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_DSSI_BRIDGE, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_LV2_BRIDGE, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_LIVE_DSSI_BRIDGE, 0)); machine_counter = g_list_prepend(machine_counter, ags_machine_counter_alloc(AGS_RECALL_DEFAULT_VERSION, AGS_RECALL_DEFAULT_BUILD_ID, AGS_TYPE_LIVE_LV2_BRIDGE, 0)); return(machine_counter); } /** * ags_window_find_machine_counter: * @window: the #AgsWindow * @machine_type: the machine type * * Keep track of count of machines. Lookup window's counter. * * Returns: an #AgsMachineCounter * * Since: 3.0.0 */ AgsMachineCounter* ags_window_find_machine_counter(AgsWindow *window, GType machine_type) { GList *list; list = window->machine_counter; while(list != NULL){ if(AGS_MACHINE_COUNTER(list->data)->machine_type == machine_type){ return(AGS_MACHINE_COUNTER(list->data)); } list = list->next; } return(NULL); } /** * ags_window_increment_machine_counter: * @window: the #AgsWindow * @machine_type: the machine type * * Keep track of count of machines. Increment window's counter. * * Since: 3.0.0 */ void ags_window_increment_machine_counter(AgsWindow *window, GType machine_type) { AgsMachineCounter *machine_counter; machine_counter = ags_window_find_machine_counter(window, machine_type); if(machine_counter != NULL){ machine_counter->counter++; } } /** * ags_window_decrement_machine_counter: * @window: the #AgsWindow * @machine_type: the machine type * * Keep track of count of machines. Decrement window's counter. * * Since: 3.0.0 */ void ags_window_decrement_machine_counter(AgsWindow *window, GType machine_type) { AgsMachineCounter *machine_counter; machine_counter = ags_window_find_machine_counter(window, machine_type); if(machine_counter != NULL){ machine_counter->counter--; } } /** * ags_machine_counter_alloc: * @version: the machine's version * @build_id: the machine's build id * @machine_type: the machine type * @initial_value: initialize counter * * Keep track of count of machines. * * Returns: an #AgsMachineCounter * * Since: 3.0.0 */ AgsMachineCounter* ags_machine_counter_alloc(gchar *version, gchar *build_id, GType machine_type, guint initial_value) { AgsMachineCounter *machine_counter; machine_counter = (AgsMachineCounter *) malloc(sizeof(AgsMachineCounter)); machine_counter->version = version; machine_counter->build_id = build_id; machine_counter->machine_type = machine_type; machine_counter->filename = NULL; machine_counter->effect = NULL; machine_counter->counter = initial_value; return(machine_counter); } void ags_window_show_error(AgsWindow *window, gchar *message) { GtkDialog *dialog; dialog = (GtkDialog *) gtk_message_dialog_new((GtkWindow *) window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", message); gtk_widget_show_all((GtkWidget *) dialog); } /** * ags_window_load_file_timeout: * @window: the #AgsWindow * * Load file. * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_window_load_file_timeout(AgsWindow *window) { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); if((AGS_WINDOW_TERMINATING & (window->flags)) != 0){ ags_application_context_quit(application_context); return(FALSE); } if(g_hash_table_lookup(ags_window_load_file, window) != NULL){ if(window->filename != NULL){ AgsSimpleFile *simple_file; gchar *str; GError *error; if(ags_ui_provider_get_show_animation(AGS_UI_PROVIDER(application_context))){ return(TRUE); } simple_file = (AgsSimpleFile *) g_object_new(AGS_TYPE_SIMPLE_FILE, "filename", window->filename, NULL); error = NULL; ags_simple_file_open(simple_file, &error); if(error != NULL){ g_error_free(error); } ags_simple_file_read(simple_file); ags_simple_file_close(simple_file); /* set name */ window->name = g_strdup(window->filename); str = g_strconcat("GSequencer - ", window->name, NULL); gtk_window_set_title((GtkWindow *) window, str); window->filename = NULL; } return(TRUE); }else{ return(FALSE); } } /** * ags_window_new: * * Creates an #AgsWindow * * Returns: a new #AgsWindow * * Since: 3.0.0 */ AgsWindow* ags_window_new() { AgsWindow *window; window = (AgsWindow *) g_object_new(AGS_TYPE_WINDOW, NULL); return(window); } gsequencer-3.1.3/ags/X/ags_line_member.h0000644000175000017500000000721213607210263015044 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_MEMBER_H__ #define __AGS_LINE_MEMBER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINE_MEMBER (ags_line_member_get_type()) #define AGS_LINE_MEMBER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LINE_MEMBER, AgsLineMember)) #define AGS_LINE_MEMBER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LINE_MEMBER, AgsLineMemberClass)) #define AGS_IS_LINE_MEMBER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LINE_MEMBER)) #define AGS_IS_LINE_MEMBER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LINE_MEMBER)) #define AGS_LINE_MEMBER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LINE_MEMBER, AgsLineMemberClass)) #define AGS_LINE_MEMBER_DEFAULT_VERSION "0.7.33" #define AGS_LINE_MEMBER_DEFAULT_BUILD_ID "Wed Jun 15 13:48:15 UTC 2016" typedef struct _AgsLineMember AgsLineMember; typedef struct _AgsLineMemberClass AgsLineMemberClass; typedef enum{ AGS_LINE_MEMBER_CONNECTED = 1, AGS_LINE_MEMBER_DEFAULT_TEMPLATE = 1 << 1, AGS_LINE_MEMBER_RESET_BY_ATOMIC = 1 << 2, AGS_LINE_MEMBER_RESET_BY_TASK = 1 << 3, AGS_LINE_MEMBER_APPLY_RECALL = 1 << 4, AGS_LINE_MEMBER_PLAY_CALLBACK_WRITE = 1 << 5, AGS_LINE_MEMBER_RECALL_CALLBACK_WRITE = 1 << 6, AGS_LINE_MEMBER_CALLBACK_READ_BLOCK = 1 << 7, AGS_LINE_MEMBER_CALLBACK_WRITE_BLOCK = 1 << 8, AGS_LINE_MEMBER_APPLY_INITIAL = 1 << 9, AGS_LINE_MEMBER_BLOCK_CHAINED = 1 << 10, }Agslinememberflags; typedef enum{ AGS_LINE_MEMBER_PORT_BOOLEAN = 1, AGS_LINE_MEMBER_PORT_INTEGER = 1 << 1, }AgsLineMemberPortFlags; struct _AgsLineMember { GtkFrame frame; guint flags; guint port_flags; GType widget_type; gchar *widget_label; gchar *filename; gchar *effect; gchar *plugin_name; gchar *specifier; gchar *control_port; guint scale_precision; gdouble step_count; AgsConversion *conversion; AgsPort *port; gpointer port_data; gboolean active; AgsPort *recall_port; gpointer recall_port_data; gboolean recall_active; GType task_type; }; struct _AgsLineMemberClass { GtkFrameClass frame; void (*change_port)(AgsLineMember *line_member, gpointer port_data); GList* (*find_port)(AgsLineMember *line_member); }; GType ags_line_member_get_type(void); GtkWidget* ags_line_member_get_widget(AgsLineMember *line_member); void ags_line_member_set_label(AgsLineMember *line_member, gchar *label); void ags_line_member_change_port(AgsLineMember *line_member, gpointer port_data); GList* ags_line_member_find_port(AgsLineMember *line_member); void ags_line_member_chained_event(AgsLineMember *line_member); AgsLineMember* ags_line_member_new(); G_END_DECLS #endif /*__AGS_LINE_MEMBER_H__*/ gsequencer-3.1.3/ags/X/ags_link_collection_editor_callbacks.c0000644000175000017500000000405013607210263021273 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_link_collection_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLinkCollectionEditor *link_collection_editor) { AgsMachineEditor *machine_editor; if(old_parent != NULL){ return; } machine_editor = (AgsMachineEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_MACHINE_EDITOR); if(machine_editor != NULL && machine_editor->machine != NULL){ gtk_combo_box_set_model(link_collection_editor->link, GTK_TREE_MODEL(ags_machine_get_possible_links(machine_editor->machine))); ags_link_collection_editor_check(link_collection_editor); } } void ags_link_collection_editor_link_callback(GtkComboBox *combo, AgsLinkCollectionEditor *link_collection_editor) { ags_link_collection_editor_check(link_collection_editor); } void ags_link_collection_editor_first_line_callback(GtkSpinButton *spin_button, AgsLinkCollectionEditor *link_collection_editor) { ags_link_collection_editor_check(link_collection_editor); } void ags_link_collection_editor_first_link_callback(GtkSpinButton *spin_button, AgsLinkCollectionEditor *link_collection_editor) { ags_link_collection_editor_check(link_collection_editor); } gsequencer-3.1.3/ags/X/ags_lv2_browser_callbacks.c0000644000175000017500000002017613607210263017032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_lv2_browser_plugin_filename_callback(GtkComboBoxText *combo_box, AgsLv2Browser *lv2_browser) { GtkComboBoxText *filename, *effect; AgsLv2Manager *lv2_manager; AgsLv2Plugin *lv2_plugin; GList *start_list, *list; GRecMutex *lv2_manager_mutex; list = gtk_container_get_children(GTK_CONTAINER(lv2_browser->plugin)); filename = GTK_COMBO_BOX_TEXT(list->next->data); effect = GTK_COMBO_BOX_TEXT(list->next->next->next->data); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model((GtkComboBox *) effect))); lv2_manager = ags_lv2_manager_get_instance(); /* get lv2 manager mutex */ lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager); /* get lv2 plugin */ g_rec_mutex_lock(lv2_manager_mutex); list = start_list = g_list_copy_deep(lv2_manager->lv2_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(lv2_manager_mutex); while((list = ags_base_plugin_find_filename(list, gtk_combo_box_text_get_active_text(filename))) != NULL){ gchar *str; lv2_plugin = list->data; /* set effect */ g_object_get(lv2_plugin, "effect", &str, NULL); if(str != NULL){ gtk_combo_box_text_append_text(effect, str); } g_free(str); /* iterate */ list = list->next; } gtk_combo_box_set_active((GtkComboBox *) effect, 0); g_list_free_full(start_list, g_object_unref); } void ags_lv2_browser_plugin_uri_callback(GtkComboBoxText *combo_box, AgsLv2Browser *lv2_browser) { GtkTable *table; GtkComboBoxText *filename, *effect; GtkLabel *label; AgsLv2Plugin *lv2_plugin; GList *list, *list_start; GList *child, *child_start; gchar *str; guint y; GRecMutex *base_plugin_mutex; GRecMutex *plugin_port_mutex; /* retrieve filename and uri */ list_start = list = gtk_container_get_children(GTK_CONTAINER(lv2_browser->plugin)); filename = GTK_COMBO_BOX_TEXT(list->next->data); effect = GTK_COMBO_BOX_TEXT(list->next->next->next->data); g_list_free(list_start); /* update description */ list_start = list = gtk_container_get_children(GTK_CONTAINER(lv2_browser->description)); lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), gtk_combo_box_text_get_active_text(filename), gtk_combo_box_text_get_active_text(effect)); if(lv2_plugin != NULL && AGS_BASE_PLUGIN(lv2_plugin)->plugin_port == NULL){ AgsLv2TurtleParser *lv2_turtle_parser; AgsTurtle *manifest; AgsTurtle **turtle; guint n_turtle; g_object_get(lv2_plugin, "manifest", &manifest, NULL); lv2_turtle_parser = ags_lv2_turtle_parser_new(manifest); n_turtle = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); g_object_run_dispose(lv2_turtle_parser); g_object_unref(lv2_turtle_parser); g_object_unref(manifest); free(turtle); } if(lv2_plugin != NULL){ GList *start_plugin_port, *plugin_port; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* update ui - empty */ g_rec_mutex_lock(base_plugin_mutex); label = GTK_LABEL(list->data); str = g_strdup_printf("%s: %s", i18n("Name"), lv2_plugin->foaf_name); gtk_label_set_text(label, str); g_free(str); list = list->next; label = GTK_LABEL(list->data); str = g_strdup_printf("%s: %s", i18n("Homepage"), lv2_plugin->foaf_homepage); gtk_label_set_text(label, str); g_free(str); list = list->next; label = GTK_LABEL(list->data); str = g_strdup_printf("%s: %s", i18n("M-Box"), lv2_plugin->foaf_mbox); gtk_label_set_text(label, str); g_free(str); list = list->next; label = GTK_LABEL(list->data); str = g_strdup_printf("%s: ", i18n("Ports")); gtk_label_set_text(label, str); g_free(str); list = list->next; table = GTK_TABLE(list->data); /* update ui - port information */ child_start = child = gtk_container_get_children(GTK_CONTAINER(table)); while(child != NULL){ gtk_widget_destroy(GTK_WIDGET(child->data)); child = child->next; } g_list_free(child_start); start_plugin_port = g_list_copy(AGS_BASE_PLUGIN(lv2_plugin)->plugin_port); g_rec_mutex_unlock(base_plugin_mutex); plugin_port = start_plugin_port; y = 0; while(plugin_port != NULL){ if(!ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ plugin_port = plugin_port->next; continue; } /* get base plugin mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get some fields */ g_rec_mutex_lock(plugin_port_mutex); str = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "xalign", 0.0, "label", str, NULL); gtk_table_attach_defaults(table, GTK_WIDGET(label), 0, 1, y, y + 1); if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ gtk_table_attach_defaults(table, GTK_WIDGET(ags_lv2_browser_combo_box_output_boolean_controls_new()), 1, 2, y, y + 1); }else{ gtk_table_attach_defaults(table, GTK_WIDGET(ags_lv2_browser_combo_box_boolean_controls_new()), 1, 2, y, y + 1); } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ gtk_table_attach_defaults(table, GTK_WIDGET(ags_lv2_browser_combo_box_output_controls_new()), 1, 2, y, y + 1); }else{ gtk_table_attach_defaults(table, GTK_WIDGET(ags_lv2_browser_combo_box_controls_new()), 1, 2, y, y + 1); } } y++; plugin_port = plugin_port->next; } g_list_free(start_plugin_port); gtk_widget_show_all((GtkWidget *) table); }else{ /* update ui - empty */ label = GTK_LABEL(list->data); str = g_strdup_printf("%s: ", i18n("Name")); gtk_label_set_text(label, str); g_free(str); list = list->next; label = GTK_LABEL(list->data); str = g_strdup_printf("%s: ", i18n("Homepage")); gtk_label_set_text(label, str); g_free(str); list = list->next; label = GTK_LABEL(list->data); str = g_strdup_printf("%s: ", i18n("M-Box")); gtk_label_set_text(label, str); g_free(str); list = list->next; label = GTK_LABEL(list->data); str = g_strdup_printf("%s: ", i18n("Ports")); gtk_label_set_text(label, str); g_free(str); list = list->next; table = GTK_TABLE(list->data); /* update ui - no ports */ child_start = child = gtk_container_get_children(GTK_CONTAINER(table)); while(child != NULL){ gtk_widget_destroy(GTK_WIDGET(child->data)); child = child->next; } g_list_free(child_start); } g_list_free(list_start); } gsequencer-3.1.3/ags/X/ags_output_listing_editor.h0000644000175000017500000000476513607210263017237 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_LISTING_EDITOR_H__ #define __AGS_OUTPUT_LISTING_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OUTPUT_LISTING_EDITOR (ags_output_listing_editor_get_type()) #define AGS_OUTPUT_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OUTPUT_LISTING_EDITOR, AgsOutputListingEditor)) #define AGS_OUTPUT_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OUTPUT_LISTING_EDITOR, AgsOutputListingEditorClass)) #define AGS_IS_OUTPUT_LISTING_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OUTPUT_LISTING_EDITOR)) #define AGS_IS_OUTPUT_LISTING_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OUTPUT_LISTING_EDITOR)) #define AGS_OUTPUT_LISTING_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OUTPUT_LISTING_EDITOR, AgsOutputListingEditorClass)) typedef struct _AgsOutputListingEditor AgsOutputListingEditor; typedef struct _AgsOutputListingEditorClass AgsOutputListingEditorClass; struct _AgsOutputListingEditor { AgsPropertyListingEditor property_listing_editor; GType channel_type; GtkVBox *child; }; struct _AgsOutputListingEditorClass { AgsPropertyListingEditorClass property_listing_editor; }; GType ags_output_listing_editor_get_type(); void ags_output_listing_editor_add_children(AgsOutputListingEditor *output_listing_editor, AgsAudio *audio, guint nth, gboolean connect); AgsOutputListingEditor* ags_output_listing_editor_new(GType channel_type); G_END_DECLS #endif /*__AGS_OUTPUT_LISTING_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_link_editor_callbacks.c0000644000175000017500000002062613607210263017067 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int ags_link_editor_file_chooser_response_callback(GtkWidget *widget, guint response, AgsLinkEditor *link_editor); #define AGS_LINK_EDITOR_OPEN_SPIN_BUTTON "AgsLinkEditorOpenSpinButton" void ags_link_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLinkEditor *link_editor) { AgsMachine *machine; AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel; GtkTreeModel *model; if(old_parent != NULL){ return; } //TODO:JK: missing mutex line_editor = (AgsLineEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_LINE_EDITOR); if(line_editor != NULL){ channel = line_editor->channel; if(channel != NULL){ GtkTreeIter iter; g_object_get(channel, "audio", &audio, NULL); if(audio != NULL){ //FIXME:JK: don't access AgsAudio to obtain widget machine = AGS_MACHINE(audio->machine_widget); model = GTK_TREE_MODEL(ags_machine_get_possible_links(machine)); if(AGS_IS_INPUT(line_editor->channel) && (AGS_MACHINE_TAKES_FILE_INPUT & (machine->flags)) != 0 && ((AGS_MACHINE_ACCEPT_WAV & (machine->file_input_flags)) != 0 || ((AGS_MACHINE_ACCEPT_OGG & (machine->file_input_flags)) != 0))){ AgsFileLink *file_link; gtk_list_store_append(GTK_LIST_STORE(model), &iter); g_object_get(channel, "file-link", &file_link, NULL); if(file_link != NULL){ gchar *filename; /* get some fields */ g_object_get(file_link, "filename", &filename, NULL); gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, g_strdup_printf("file://%s", filename), 1, NULL, -1); gtk_combo_box_set_active_iter(link_editor->combo, &iter); g_free(filename); g_object_unref(file_link); }else{ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, "file://", 1, NULL, -1); } } gtk_combo_box_set_model(link_editor->combo, model); g_object_unref(audio); } } } } void ags_link_editor_combo_callback(GtkComboBox *combo, AgsLinkEditor *link_editor) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(link_editor->combo, &iter)){ AgsMachine *machine, *link_machine; AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel; GtkTreeModel *model; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(link_editor), AGS_TYPE_LINE_EDITOR)); channel = line_editor->channel; g_object_get(channel, "audio", &audio, NULL); g_object_unref(audio); //FIXME:JK: don't access AgsAudio to obtain widget machine = AGS_MACHINE(audio->machine_widget); model = gtk_combo_box_get_model(link_editor->combo); if(!((AGS_MACHINE_TAKES_FILE_INPUT & (machine->flags)) != 0 && ((AGS_MACHINE_ACCEPT_WAV & (machine->file_input_flags)) != 0 || ((AGS_MACHINE_ACCEPT_OGG & (machine->file_input_flags)) != 0)) && AGS_IS_INPUT(channel) && gtk_combo_box_get_active(link_editor->combo) + 1 == gtk_tree_model_iter_n_children(model, NULL))){ gtk_widget_set_sensitive((GtkWidget *) link_editor->spin_button, TRUE); /* set machine link */ gtk_tree_model_get(model, &iter, 1, &link_machine, -1); if(link_machine == NULL){ gtk_spin_button_set_value(link_editor->spin_button, 0.0); }else{ if(AGS_IS_INPUT(channel)){ gtk_spin_button_set_range(link_editor->spin_button, 0.0, (gdouble) (link_machine->audio->output_lines - 1)); }else{ gtk_spin_button_set_range(link_editor->spin_button, 0.0, (gdouble) (link_machine->audio->input_lines - 1)); } } }else{ GtkHBox *hbox; GtkLabel *label; GtkSpinButton *spin_button; gchar *str, *tmp; /* set file link */ if(link_editor->file_chooser != NULL || (AGS_LINK_EDITOR_BLOCK_FILE_CHOOSER & (link_editor->flags)) != 0){ return; } gtk_widget_set_sensitive((GtkWidget *) link_editor->spin_button, FALSE); link_editor->file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new(i18n("select audio file"), (GtkWindow *) gtk_widget_get_toplevel((GtkWidget *) link_editor), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(link_editor->file_chooser), FALSE); /* extra widget */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_file_chooser_set_extra_widget((GtkFileChooser *) link_editor->file_chooser, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("audio channel: ")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); spin_button = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 256.0, 1.0); g_object_set_data((GObject *) link_editor->file_chooser, AGS_LINK_EDITOR_OPEN_SPIN_BUTTON, spin_button); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) spin_button, FALSE, FALSE, 0); /* */ gtk_tree_model_get(model, &iter, 0, &str, -1); tmp = g_strdup(str + 7); if(g_strcmp0(tmp, "")){ char *tmp0, *name, *dir; tmp0 = g_strrstr(tmp, "/"); name = g_strdup(tmp0 + 1); dir = g_strndup(tmp, tmp0 - tmp); gtk_file_chooser_set_current_folder((GtkFileChooser *) link_editor->file_chooser, dir); gtk_file_chooser_set_current_name((GtkFileChooser *) link_editor->file_chooser, name); } g_signal_connect((GObject *) link_editor->file_chooser, "response", G_CALLBACK(ags_link_editor_file_chooser_response_callback), (gpointer) link_editor); gtk_widget_show_all((GtkWidget *) link_editor->file_chooser); } } } int ags_link_editor_option_changed_callback(GtkWidget *widget, AgsLinkEditor *link_editor) { /* AgsLineEditor *line_editor; AgsMachine *machine; machine = (AgsMachine *) g_object_get_data((GObject *) link_editor->option->menu_item, g_type_name(AGS_TYPE_MACHINE)); if(machine == NULL) return; line_editor = (AgsLineEditor *) gtk_widget_get_ancestor((GtkWidget *) link_editor, AGS_TYPE_LINE_EDITOR); link_editor->spin_button->adjustment->upper = (gdouble) (AGS_IS_OUTPUT(line_editor->channel) ? machine->audio->input_lines - 1: machine->audio->output_lines - 1); */ return(0); } int ags_link_editor_file_chooser_response_callback(GtkWidget *widget, guint response, AgsLinkEditor *link_editor) { GtkFileChooserDialog *file_chooser; char *name; file_chooser = link_editor->file_chooser; if(response == GTK_RESPONSE_ACCEPT){ GtkSpinButton *spin_button; GtkTreeModel *model; GtkTreeIter iter; /* set filename in combo box */ model = gtk_combo_box_get_model(link_editor->combo); name = gtk_file_chooser_get_filename((GtkFileChooser *) file_chooser); gtk_tree_model_iter_nth_child(model, &iter, NULL, gtk_tree_model_iter_n_children(model, NULL) - 1); gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, g_strdup_printf("file://%s", name), -1); /* set audio channel */ spin_button = (GtkSpinButton *) g_object_get_data((GObject *) file_chooser, AGS_LINK_EDITOR_OPEN_SPIN_BUTTON); gtk_spin_button_set_value(link_editor->spin_button, gtk_spin_button_get_value(spin_button)); } link_editor->file_chooser = NULL; gtk_widget_destroy((GtkWidget *) file_chooser); return(0); } gsequencer-3.1.3/ags/X/ags_wave_editor.h0000644000175000017500000000775013616617253015117 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_EDITOR_H__ #define __AGS_WAVE_EDITOR_H__ #include #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_EDITOR (ags_wave_editor_get_type()) #define AGS_WAVE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_EDITOR, AgsWaveEditor)) #define AGS_WAVE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_EDITOR, AgsWaveEditorClass)) #define AGS_IS_WAVE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE_EDITOR)) #define AGS_IS_WAVE_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE_EDITOR)) #define AGS_WAVE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_WAVE_EDITOR, AgsWaveEditorClass)) #define AGS_WAVE_EDITOR_MAX_VALUE_COUNT (64 * 16 * 16 * 1200) #define AGS_WAVE_EDITOR_MAX_CONTROLS (64 * 16 * 16 * 1200) #define AGS_WAVE_EDITOR_DEFAULT_VERSION "1.4.0" #define AGS_WAVE_EDITOR_DEFAULT_BUILD_ID "Thu Jan 4 19:47:23 UTC 2018" typedef struct _AgsWaveEditor AgsWaveEditor; typedef struct _AgsWaveEditorClass AgsWaveEditorClass; typedef enum{ AGS_WAVE_EDITOR_CONNECTED = 1, AGS_WAVE_EDITOR_RESET_HSCROLLBAR = 1 << 1, AGS_WAVE_EDITOR_PASTE_MATCH_LINE = 1 << 2, AGS_WAVE_EDITOR_PASTE_REPLACE = 1 << 3, }AgsWaveEditorFlags; struct _AgsWaveEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; guint tact_counter; gdouble current_tact; GtkHPaned *paned; AgsWaveToolbar *wave_toolbar; AgsMachineSelector *machine_selector; AgsMachine *selected_machine; AgsNotebook *notebook; AgsRuler *ruler; AgsScrolledLevelBox *scrolled_level_box; AgsScrolledWaveEditBox *scrolled_wave_edit_box; GtkVScrollbar *vscrollbar; GtkHScrollbar *hscrollbar; AgsWaveEdit *focused_wave_edit; AgsWaveMeta *wave_meta; }; struct _AgsWaveEditorClass { GtkVBoxClass vbox; void (*machine_changed)(AgsWaveEditor *wave_editor, AgsMachine *machine); }; GType ags_wave_editor_get_type(void); void ags_wave_editor_reset_scrollbar(AgsWaveEditor *wave_editor); void ags_wave_editor_reset_audio_scrollbar(AgsWaveEditor *wave_editor); void ags_wave_editor_reset_output_scrollbar(AgsWaveEditor *wave_editor); void ags_wave_editor_reset_input_scrollbar(AgsWaveEditor *wave_editor); void ags_wave_editor_machine_changed(AgsWaveEditor *wave_editor, AgsMachine *machine); void ags_wave_editor_select_region(AgsWaveEditor *wave_editor, guint x0, gdouble y0, guint x1, gdouble y1); void ags_wave_editor_select_all(AgsWaveEditor *wave_editor); void ags_wave_editor_paste(AgsWaveEditor *wave_editor); void ags_wave_editor_copy(AgsWaveEditor *wave_editor); void ags_wave_editor_cut(AgsWaveEditor *wave_editor); void ags_wave_editor_invert(AgsWaveEditor *wave_editor); AgsWaveEditor* ags_wave_editor_new(); G_END_DECLS #endif /*__AGS_WAVE_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_soundcard_editor.h0000644000175000017500000000776713607210263016135 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNDCARD_EDITOR_H__ #define __AGS_SOUNDCARD_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUNDCARD_EDITOR (ags_soundcard_editor_get_type()) #define AGS_SOUNDCARD_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUNDCARD_EDITOR, AgsSoundcardEditor)) #define AGS_SOUNDCARD_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SOUNDCARD_EDITOR, AgsSoundcardEditorClass)) #define AGS_IS_SOUNDCARD_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SOUNDCARD_EDITOR)) #define AGS_IS_SOUNDCARD_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SOUNDCARD_EDITOR)) #define AGS_SOUNDCARD_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SOUNDCARD_EDITOR, AgsSoundcardEditorClass)) typedef struct _AgsSoundcardEditor AgsSoundcardEditor; typedef struct _AgsSoundcardEditorClass AgsSoundcardEditorClass; typedef enum{ AGS_SOUNDCARD_EDITOR_CONNECTED = 1, AGS_SOUNDCARD_EDITOR_BLOCK_RESET = 1 << 1, AGS_SOUNDCARD_EDITOR_BLOCK_BACKEND = 1 << 2, AGS_SOUNDCARD_EDITOR_BLOCK_CARD = 1 << 3, AGS_SOUNDCARD_EDITOR_BLOCK_ADD = 1 << 4, AGS_SOUNDCARD_EDITOR_BLOCK_LOAD = 1 << 5, }AgsSoundcardEditorFlags; struct _AgsSoundcardEditor { GtkVBox vbox; guint flags; GObject *soundcard; GObject *soundcard_thread; GtkComboBoxText *backend; GtkComboBoxText *card; GtkHBox *port_hbox; GtkButton *add_port; GtkButton *remove_port; GtkComboBoxText *capability; GtkSpinButton *audio_channels; GtkSpinButton *samplerate; GtkSpinButton *buffer_size; GtkComboBoxText *format; GtkCheckButton *use_cache; GtkSpinButton *cache_buffer_size; GtkLabel *wasapi_share_mode_label; GtkComboBoxText *wasapi_share_mode; GtkLabel *wasapi_buffer_size_label; GtkSpinButton *wasapi_buffer_size; GtkButton *remove; }; struct _AgsSoundcardEditorClass { GtkVBoxClass vbox; }; GType ags_soundcard_editor_get_type(void); void ags_soundcard_editor_add_port(AgsSoundcardEditor *soundcard_editor, gchar *device); void ags_soundcard_editor_remove_port(AgsSoundcardEditor *soundcard_editor, gchar *device); void ags_soundcard_editor_add_soundcard(AgsSoundcardEditor *soundcard_editor, GObject *soundcard); void ags_soundcard_editor_remove_soundcard(AgsSoundcardEditor *soundcard_editor, GObject *soundcard); void ags_soundcard_editor_load_core_audio_card(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_load_pulse_card(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_load_jack_card(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_load_wasapi_card(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_load_alsa_card(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_load_oss_card(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_show_wasapi_control(AgsSoundcardEditor *soundcard_editor); void ags_soundcard_editor_hide_wasapi_control(AgsSoundcardEditor *soundcard_editor); AgsSoundcardEditor* ags_soundcard_editor_new(); G_END_DECLS #endif /*__AGS_SOUNDCARD_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_output_collection_editor.h0000644000175000017500000000515413607210263017712 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_COLLECTION_EDITOR_H__ #define __AGS_OUTPUT_COLLECTION_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OUTPUT_COLLECTION_EDITOR (ags_output_collection_editor_get_type()) #define AGS_OUTPUT_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OUTPUT_COLLECTION_EDITOR, AgsOutputCollectionEditor)) #define AGS_OUTPUT_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OUTPUT_COLLECTION_EDITOR, AgsOutputCollectionEditorClass)) #define AGS_IS_OUTPUT_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OUTPUT_COLLECTION_EDITOR)) #define AGS_IS_OUTPUT_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OUTPUT_COLLECTION_EDITOR)) #define AGS_OUTPUT_COLLECTION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OUTPUT_COLLECTION_EDITOR, AgsOutputCollectionEditorClass)) typedef struct _AgsOutputCollectionEditor AgsOutputCollectionEditor; typedef struct _AgsOutputCollectionEditorClass AgsOutputCollectionEditorClass; typedef enum{ AGS_OUTPUT_COLLECTION_EDITOR_CONNECTED = 1, }AgsOutputCollectionEditorFlags; struct _AgsOutputCollectionEditor { GtkTable table; guint flags; GType channel_type; GtkSpinButton *first_line; GtkSpinButton *count; GtkComboBoxText *soundcard; GtkSpinButton *audio_channel; }; struct _AgsOutputCollectionEditorClass { GtkTableClass table; }; GType ags_output_collection_editor_get_type(); void ags_output_collection_editor_check(AgsOutputCollectionEditor *output_collection_editor); AgsOutputCollectionEditor* ags_output_collection_editor_new(GType channel_type); G_END_DECLS #endif /*__AGS_OUTPUT_COLLECTION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_line.h0000644000175000017500000001016313607210263013514 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_H__ #define __AGS_LINE_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINE (ags_line_get_type()) #define AGS_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LINE, AgsLine)) #define AGS_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LINE, AgsLineClass)) #define AGS_IS_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LINE)) #define AGS_IS_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LINE)) #define AGS_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LINE, AgsLineClass)) #define AGS_LINE_DEFAULT_VERSION "0.7.0" #define AGS_LINE_DEFAULT_BUILD_ID "CEST 31-10-2015 19:49" #define AGS_LINE_COLUMNS_COUNT (2) #define AGS_LINE_SEPARATOR_FILENAME "ags-line-separator-filename" #define AGS_LINE_SEPARATOR_EFFECT "ags-line-separator-effect" typedef struct _AgsLine AgsLine; typedef struct _AgsLineClass AgsLineClass; typedef enum{ AGS_LINE_CONNECTED = 1, AGS_LINE_GROUPED = 1 << 1, AGS_LINE_MAPPED_RECALL = 1 << 2, AGS_LINE_PREMAPPED_RECALL = 1 << 3, }AgsLineFlags; struct _AgsLine { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; guint samplerate; guint buffer_size; guint format; gchar *name; AgsChannel *channel; GtkWidget *pad; GtkLabel *label; GtkToggleButton *group; AgsExpander *expander; GtkWidget *indicator; GList *queued_drawing; }; struct _AgsLineClass { GtkVBoxClass vbox; void (*samplerate_changed)(AgsLine *line, guint samplerate, guint old_samplerate); void (*buffer_size_changed)(AgsLine *line, guint buffer_size, guint old_buffer_size); void (*format_changed)(AgsLine *line, guint format, guint old_format); void (*set_channel)(AgsLine *line, AgsChannel *channel); void (*group_changed)(AgsLine *line); GList* (*add_effect)(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect); void (*remove_effect)(AgsLine *line, guint nth); void (*map_recall)(AgsLine *line, guint output_pad_start); GList* (*find_port)(AgsLine *line); void (*stop)(AgsLine *line, GList *recall_id, gint sound_scope); }; GType ags_line_get_type(void); void ags_line_samplerate_changed(AgsLine *line, guint samplerate, guint old_samplerate); void ags_line_buffer_size_changed(AgsLine *line, guint buffer_size, guint old_buffer_size); void ags_line_format_changed(AgsLine *line, guint format, guint old_format); void ags_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_line_group_changed(AgsLine *line); GList* ags_line_add_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect); void ags_line_remove_effect(AgsLine *line, guint nth); void ags_line_map_recall(AgsLine *line, guint output_pad_start); GList* ags_line_find_port(AgsLine *line); void ags_line_stop(AgsLine *line, GList *recall_id, gint sound_scope); GList* ags_line_find_next_grouped(GList *line); void ags_line_check_message(AgsLine *line); gboolean ags_line_indicator_queue_draw_timeout(GtkWidget *widget); AgsLine* ags_line_new(GtkWidget *pad, AgsChannel *channel); G_END_DECLS #endif /*__AGS_LINE_H__*/ gsequencer-3.1.3/ags/X/ags_sequencer_editor_callbacks.c0000644000175000017500000000645013607210263020123 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_sequencer_editor_backend_changed_callback(GtkComboBox *combo, AgsSequencerEditor *sequencer_editor) { gchar *str; str = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo)); if(str != NULL){ if(!g_ascii_strncasecmp(str, "jack", 5)){ ags_sequencer_editor_load_jack_card(sequencer_editor); gtk_widget_show_all((GtkWidget *) sequencer_editor->jack_hbox); }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ ags_sequencer_editor_load_alsa_card(sequencer_editor); gtk_widget_hide((GtkWidget *) sequencer_editor->jack_hbox); }else if(!g_ascii_strncasecmp(str, "oss", 4)){ ags_sequencer_editor_load_oss_card(sequencer_editor); gtk_widget_hide((GtkWidget *) sequencer_editor->jack_hbox); } } } void ags_sequencer_editor_card_changed_callback(GtkComboBox *combo, AgsSequencerEditor *sequencer_editor) { GObject *sequencer; GtkTreeIter current; gchar *str; gchar *card; gboolean use_alsa; guint channels, channels_min, channels_max; guint rate, rate_min, rate_max; guint buffer_size, buffer_size_min, buffer_size_max; sequencer = sequencer_editor->sequencer; /* */ use_alsa = FALSE; str = NULL; if(AGS_IS_JACK_MIDIIN(sequencer)){ str = "jack"; }else if(AGS_IS_MIDIIN(sequencer)){ if((AGS_MIDIIN_ALSA & (AGS_MIDIIN(sequencer)->flags)) != 0){ str = "alsa"; }else if((AGS_MIDIIN_OSS & (AGS_MIDIIN(sequencer)->flags)) != 0){ str = "oss"; } } if(str != NULL && !g_ascii_strncasecmp(str, "alsa", 5)){ use_alsa = TRUE; } card = gtk_combo_box_text_get_active_text(sequencer_editor->card); if(card != NULL && use_alsa){ if(strchr(card, ',') != NULL){ str = g_strndup(card, strchr(card, ',') - card); g_free(card); card = str; } } /* reset dialog */ if(card != NULL){ ags_sequencer_set_device(AGS_SEQUENCER(sequencer), card); } } void ags_sequencer_editor_add_jack_callback(GtkWidget *button, AgsSequencerEditor *sequencer_editor) { ags_sequencer_editor_add_source(sequencer_editor, NULL); } void ags_sequencer_editor_remove_jack_callback(GtkWidget *button, AgsSequencerEditor *sequencer_editor) { ags_sequencer_editor_remove_source(sequencer_editor, gtk_combo_box_text_get_active_text(sequencer_editor->card)); } gsequencer-3.1.3/ags/X/ags_export_soundcard.c0000644000175000017500000004421213607210263016145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_export_soundcard_class_init(AgsExportSoundcardClass *export_soundcard); void ags_export_soundcard_connectable_interface_init(AgsConnectableInterface *connectable); void ags_export_soundcard_init(AgsExportSoundcard *export_soundcard); void ags_export_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_export_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_export_soundcard_finalize(GObject *gobject); void ags_export_soundcard_connect(AgsConnectable *connectable); void ags_export_soundcard_disconnect(AgsConnectable *connectable); void ags_export_soundcard_show(GtkWidget *widget); gboolean ags_export_soundcard_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_export_soundcard * @short_description: The export soundcard widget * @title: AgsExportSoundcard * @section_id: * @include: ags/X/ags_export_soundcard.h * * #AgsExportSoundcard lets you export to audio files. This widget * enables you to specify what soundcard is written to what file. */ enum{ PROP_0, PROP_SOUNDCARD, }; static gpointer ags_export_soundcard_parent_class = NULL; GType ags_export_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_export_soundcard = 0; static const GTypeInfo ags_export_soundcard_info = { sizeof (AgsExportSoundcardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_export_soundcard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsExportSoundcard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_export_soundcard_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_export_soundcard_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_export_soundcard = g_type_register_static(GTK_TYPE_VBOX, "AgsExportSoundcard", &ags_export_soundcard_info, 0); g_type_add_interface_static(ags_type_export_soundcard, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_export_soundcard); } return g_define_type_id__volatile; } void ags_export_soundcard_class_init(AgsExportSoundcardClass *export_soundcard) { GObjectClass *gobject; GParamSpec *param_spec; ags_export_soundcard_parent_class = g_type_class_peek_parent(export_soundcard); /* GObjectClass */ gobject = (GObjectClass *) export_soundcard; gobject->set_property = ags_export_soundcard_set_property; gobject->get_property = ags_export_soundcard_get_property; gobject->finalize = ags_export_soundcard_finalize; /* properties */ /** * AgsExportSoundcard:soundcard: * * The assigned #AgsSoundcard acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("assigned soundcard"), i18n_pspec("The soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); } void ags_export_soundcard_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_export_soundcard_connect; connectable->disconnect = ags_export_soundcard_disconnect; } void ags_export_soundcard_init(AgsExportSoundcard *export_soundcard) { GtkHBox *hbox; GtkTable *table; GtkLabel *label; export_soundcard->flags = 0; /* table */ table = (GtkTable *) gtk_table_new(4, 2, FALSE); gtk_box_pack_start(GTK_BOX(export_soundcard), GTK_WIDGET(table), FALSE, FALSE, 0); /* backend */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("backend"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); export_soundcard->backend = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(export_soundcard->backend), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); #ifdef AGS_WITH_WASAPI gtk_combo_box_text_append_text(export_soundcard->backend, "wasapi"); #endif #ifdef AGS_WITH_CORE_AUDIO gtk_combo_box_text_append_text(export_soundcard->backend, "core-audio"); #endif #ifdef AGS_WITH_PULSE gtk_combo_box_text_append_text(export_soundcard->backend, "pulse"); #endif #ifdef AGS_WITH_JACK gtk_combo_box_text_append_text(export_soundcard->backend, "jack"); #endif #ifdef AGS_WITH_ALSA gtk_combo_box_text_append_text(export_soundcard->backend, "alsa"); #endif #ifdef AGS_WITH_OSS gtk_combo_box_text_append_text(export_soundcard->backend, "oss"); #endif gtk_combo_box_set_active(GTK_COMBO_BOX(export_soundcard->backend), 0); /* sound card */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("soundcard"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); export_soundcard->card = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(export_soundcard->card), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* filename */ label = (GtkLabel *) gtk_label_new(i18n("file")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(hbox), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); export_soundcard->filename = (GtkEntry *) gtk_entry_new(); gtk_entry_set_text(export_soundcard->filename, "out.wav"); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(export_soundcard->filename), TRUE, TRUE, 0); export_soundcard->file_chooser_button = (GtkButton *) gtk_button_new_with_label(i18n("open")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(export_soundcard->file_chooser_button), TRUE, TRUE, 0); /* output format */ label = (GtkLabel *) gtk_label_new(i18n("output format")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); export_soundcard->output_format = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(export_soundcard->output_format, AGS_EXPORT_SOUNDCARD_FORMAT_WAV); gtk_combo_box_text_append_text(export_soundcard->output_format, AGS_EXPORT_SOUNDCARD_FORMAT_FLAC); gtk_combo_box_text_append_text(export_soundcard->output_format, AGS_EXPORT_SOUNDCARD_FORMAT_AIFF); gtk_combo_box_text_append_text(export_soundcard->output_format, AGS_EXPORT_SOUNDCARD_FORMAT_OGG); gtk_combo_box_set_active((GtkComboBox *) export_soundcard->output_format, 0); gtk_table_attach(table, GTK_WIDGET(export_soundcard->output_format), 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); } void ags_export_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsExportSoundcard *export_soundcard; export_soundcard = AGS_EXPORT_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); if(export_soundcard->soundcard == soundcard){ return; } if(soundcard != NULL){ g_object_ref(soundcard); } export_soundcard->soundcard = soundcard; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsExportSoundcard *export_soundcard; export_soundcard = AGS_EXPORT_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, export_soundcard->soundcard); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_soundcard_finalize(GObject *gobject) { AgsExportSoundcard *export_soundcard; export_soundcard = (AgsExportSoundcard *) gobject; if(export_soundcard->soundcard != NULL){ g_object_unref(export_soundcard->soundcard); } G_OBJECT_CLASS(ags_export_soundcard_parent_class)->finalize(gobject); } void ags_export_soundcard_connect(AgsConnectable *connectable) { AgsExportSoundcard *export_soundcard; export_soundcard = AGS_EXPORT_SOUNDCARD(connectable); if((AGS_EXPORT_SOUNDCARD_CONNECTED & (export_soundcard->flags)) != 0){ return; } export_soundcard->flags |= AGS_EXPORT_SOUNDCARD_CONNECTED; g_signal_connect_after(G_OBJECT(export_soundcard->backend), "changed", G_CALLBACK(ags_export_soundcard_backend_callback), export_soundcard); g_signal_connect_after(G_OBJECT(export_soundcard->card), "changed", G_CALLBACK(ags_export_soundcard_card_callback), export_soundcard); g_signal_connect_after(G_OBJECT(export_soundcard->file_chooser_button), "clicked", G_CALLBACK(ags_export_soundcard_file_chooser_button_callback), export_soundcard); } void ags_export_soundcard_disconnect(AgsConnectable *connectable) { AgsExportSoundcard *export_soundcard; export_soundcard = AGS_EXPORT_SOUNDCARD(connectable); if((AGS_EXPORT_SOUNDCARD_CONNECTED & (export_soundcard->flags)) == 0){ return; } export_soundcard->flags &= (~AGS_EXPORT_SOUNDCARD_CONNECTED); g_object_disconnect(G_OBJECT(export_soundcard->backend), "any_signal::changed", G_CALLBACK(ags_export_soundcard_backend_callback), export_soundcard, NULL); g_object_disconnect(G_OBJECT(export_soundcard->card), "any_signal::changed", G_CALLBACK(ags_export_soundcard_card_callback), export_soundcard, NULL); g_object_disconnect(G_OBJECT(export_soundcard->file_chooser_button), "any_signal::clicked", G_CALLBACK(ags_export_soundcard_file_chooser_button_callback), export_soundcard, NULL); } /** * ags_export_soundcard_set_backend: * @export_soundcard: the #AgsExportSoundcard * @backend: the backend * * Set backend. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_export_soundcard_set_backend(AgsExportSoundcard *export_soundcard, gchar *backend) { GtkTreeModel *model; GtkTreeIter iter; gchar *str; guint i; if(backend == NULL){ return(FALSE); } model = gtk_combo_box_get_model(GTK_COMBO_BOX(export_soundcard->backend)); i = 0; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &str, -1); if(!g_ascii_strcasecmp(str, backend)){ break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } gtk_combo_box_set_active(GTK_COMBO_BOX(export_soundcard->backend), i); return(TRUE); } /** * ags_export_soundcard_refresh_card: * @export_soundcard: the #AgsExportSoundcard * * Refresh cards. * * Since: 3.0.0 */ void ags_export_soundcard_refresh_card(AgsExportSoundcard *export_soundcard) { AgsExportWindow *export_window; GtkTreeModel *model; AgsApplicationContext *application_context; GList *start_soundcard, *soundcard; GList *card, *card_start; gchar *backend; gchar *device; export_window = (AgsExportWindow *) gtk_widget_get_ancestor(GTK_WIDGET(export_soundcard), AGS_TYPE_EXPORT_WINDOW); application_context = ags_application_context_get_instance(); start_soundcard = NULL; if(export_window != NULL){ start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); } card_start = NULL; backend = gtk_combo_box_text_get_active_text(export_soundcard->backend); soundcard = start_soundcard; if(backend != NULL){ if(!g_ascii_strncasecmp(backend, "wasapi", 7)){ while(soundcard != NULL){ if(AGS_IS_WASAPI_DEVOUT(soundcard->data)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)); if(device != NULL){ card_start = g_list_prepend(card_start, device); } } soundcard = soundcard->next; } }else if(!g_ascii_strncasecmp(backend, "alsa", 5)){ while(soundcard != NULL){ if(AGS_IS_DEVOUT(soundcard->data) && ags_devout_test_flags(AGS_DEVOUT(soundcard->data), AGS_DEVOUT_ALSA)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)); if(device != NULL){ card_start = g_list_prepend(card_start, device); } } soundcard = soundcard->next; } }else if(!g_ascii_strncasecmp(backend, "oss", 4)){ while(soundcard != NULL){ if(AGS_IS_DEVOUT(soundcard->data) && ags_devout_test_flags(AGS_DEVOUT(soundcard->data), AGS_DEVOUT_OSS)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)); if(device != NULL){ card_start = g_list_prepend(card_start, device); } } soundcard = soundcard->next; } }else if(!g_ascii_strncasecmp(backend, "jack", 5)){ while(soundcard != NULL){ if(AGS_IS_JACK_DEVOUT(soundcard->data)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)); if(device != NULL){ card_start = g_list_prepend(card_start, device); } } soundcard = soundcard->next; } }else if(!g_ascii_strncasecmp(backend, "pulse", 6)){ while(soundcard != NULL){ if(AGS_IS_PULSE_DEVOUT(soundcard->data)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)); if(device != NULL){ card_start = g_list_prepend(card_start, device); } } soundcard = soundcard->next; } }else if(!g_ascii_strncasecmp(backend, "core-audio", 11)){ while(soundcard != NULL){ if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard->data)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard->data)); if(device != NULL){ card_start = g_list_prepend(card_start, device); } } soundcard = soundcard->next; } } } g_list_free_full(start_soundcard, g_object_unref); model = gtk_combo_box_get_model(GTK_COMBO_BOX(export_soundcard->card)); gtk_list_store_clear(GTK_LIST_STORE(model)); if(card_start != NULL){ card_start = g_list_reverse(card_start); card = card_start; while(card != NULL){ if(card->data != NULL){ gtk_combo_box_text_append_text(export_soundcard->card, (gchar *) card->data); } card = card->next; } g_list_free_full(card_start, g_free); } } /** * ags_export_soundcard_set_card: * @export_soundcard: the #AgsExportSoundcard * @card: the card * * Set card. * * Since: 3.0.0 */ gboolean ags_export_soundcard_set_card(AgsExportSoundcard *export_soundcard, gchar *card) { GtkTreeModel *model; GtkTreeIter iter; gchar *str; guint i; model = gtk_combo_box_get_model(GTK_COMBO_BOX(export_soundcard->card)); i = 0; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &str, -1); if(!g_ascii_strcasecmp(str, card)){ break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } gtk_combo_box_set_active(GTK_COMBO_BOX(export_soundcard->card), i); return(TRUE); } /** * ags_export_soundcard_set_filename: * @export_soundcard: the #AgsExportSoundcard * @filename: the filename * * Set filename. * * Since: 3.0.0 */ void ags_export_soundcard_set_filename(AgsExportSoundcard *export_soundcard, gchar *filename) { gtk_entry_set_text(export_soundcard->filename, filename); } /** * ags_export_soundcard_set_format: * @export_soundcard: the #AgsExportSoundcard * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_export_soundcard_set_format(AgsExportSoundcard *export_soundcard, gchar *format) { GtkTreeModel *model; GtkTreeIter iter; gchar *str; guint i; model = gtk_combo_box_get_model(GTK_COMBO_BOX(export_soundcard->output_format)); i = 0; if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &str, -1); if(!g_ascii_strcasecmp(str, format)){ break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } gtk_combo_box_set_active(GTK_COMBO_BOX(export_soundcard->output_format), i); } /** * ags_export_soundcard_new: * * Create a new instance of #AgsExportSoundcard * * Returns: the new #AgsExportSoundcard * * Since: 3.0.0 */ AgsExportSoundcard* ags_export_soundcard_new() { AgsExportSoundcard *export_soundcard; export_soundcard = (AgsExportSoundcard *) g_object_new(AGS_TYPE_EXPORT_SOUNDCARD, NULL); return(export_soundcard); } gsequencer-3.1.3/ags/X/ags_generic_preferences_callbacks.c0000644000175000017500000000403313607210263020553 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_generic_preferences_autosave_thread_clicked_callback(GtkWidget *check_button, AgsGenericPreferences *generic_preferences) { AgsApplicationContext *application_context; AgsPreferences *preferences; preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(generic_preferences), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); //FIXME:JK: defunct #if 0 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button))){ ags_thread_start((AgsThread *) autosave_thread); }else{ ags_thread_stop((AgsThread *) autosave_thread); } #endif } void ags_generic_preferences_rt_safe_callback(GtkWidget *check_button, AgsGenericPreferences *generic_preferences) { if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button))){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generic_preferences->engine_mode), 1); gtk_widget_set_sensitive(GTK_WIDGET(generic_preferences->engine_mode), FALSE); }else{ gtk_widget_set_sensitive(GTK_WIDGET(generic_preferences->engine_mode), TRUE); } } gsequencer-3.1.3/ags/X/ags_window_callbacks.c0000644000175000017500000002103213613101164016057 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include "config.h" #ifdef AGS_WITH_QUARTZ #include #endif #include #include #include #include #include void ags_window_setup_completed_callback(AgsApplicationContext *application_context, AgsWindow *window) { AgsMenuBar *menu_bar; AgsContextMenu *context_menu; GtkMenuItem *item; #ifdef AGS_WITH_QUARTZ GtkosxApplication *app; #endif GtkAccelGroup *accel_group; GClosure *closure; /* open */ accel_group = gtk_accel_group_new(); closure = g_cclosure_new(ags_menu_action_open_callback, NULL, NULL); gtk_accel_group_connect(accel_group, GDK_KEY_O, GDK_CONTROL_MASK, 0, closure); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); /* save */ accel_group = gtk_accel_group_new(); closure = g_cclosure_new(ags_menu_action_save_callback, NULL, NULL); gtk_accel_group_connect(accel_group, GDK_KEY_S, GDK_CONTROL_MASK, 0, closure); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); /* save as */ accel_group = gtk_accel_group_new(); closure = g_cclosure_new(ags_menu_action_save_as_callback, NULL, NULL); gtk_accel_group_connect(accel_group, GDK_KEY_S, GDK_CONTROL_MASK | GDK_SHIFT_MASK, 0, closure); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); /* quit */ accel_group = gtk_accel_group_new(); closure = g_cclosure_new(ags_menu_action_quit_callback, NULL, NULL); gtk_accel_group_connect(accel_group, GDK_KEY_Q, GDK_CONTROL_MASK, 0, closure); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); /* online help */ accel_group = gtk_accel_group_new(); closure = g_cclosure_new(ags_menu_action_online_help_callback, NULL, NULL); gtk_accel_group_connect(accel_group, GDK_KEY_H, GDK_CONTROL_MASK, 0, closure); gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); /* menu */ menu_bar = window->menu_bar; context_menu = window->context_menu; /* menu - bridge */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("LADSPA")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_ladspa_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("DSSI")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_dssi_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Lv2")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_lv2_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); /* menu - live */ menu_bar->live = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new_with_label("live!"); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget *) menu_bar->live); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("DSSI")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_live_dssi_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) menu_bar->live, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Lv2")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_live_lv2_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) menu_bar->live, (GtkWidget*) item); /* context menu - bridge */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("LADSPA")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_ladspa_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("DSSI")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_dssi_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Lv2")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_lv2_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); /* context menu - live */ context_menu->live = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new_with_label("live!"); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) context_menu->live); gtk_menu_shell_append((GtkMenuShell*) context_menu->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("DSSI")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_live_dssi_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) context_menu->live, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Lv2")); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) ags_live_lv2_bridge_menu_new()); gtk_menu_shell_append((GtkMenuShell*) context_menu->live, (GtkWidget*) item); /* connect and show window */ ags_connectable_connect(AGS_CONNECTABLE(window)); gtk_widget_show_all(window); #ifdef AGS_WITH_QUARTZ app = gtkosx_application_get(); gtkosx_application_sync_menubar(app); #endif } gboolean ags_window_delete_event_callback(GtkWidget *widget, gpointer data) { AgsWindow *window; GtkDialog *dialog; GtkWidget *cancel_button; AgsApplicationContext *application_context; gint response; window = AGS_WINDOW(widget); application_context = ags_application_context_get_instance(); /* ask the user if he wants save to a file */ dialog = (GtkDialog *) gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Do you want to save '%s'?", window->name); cancel_button = gtk_dialog_add_button(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); gtk_widget_grab_focus(cancel_button); response = gtk_dialog_run(dialog); if(response == GTK_RESPONSE_YES){ if(g_strcmp0(ags_config_get_value(ags_config_get_instance(), AGS_CONFIG_GENERIC, "simple-file"), "false")){ AgsSimpleFile *simple_file; GError *error; simple_file = (AgsSimpleFile *) g_object_new(AGS_TYPE_SIMPLE_FILE, "filename", window->name, NULL); error = NULL; ags_simple_file_rw_open(simple_file, TRUE, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_simple_file_write(simple_file); ags_simple_file_close(simple_file); g_object_unref(G_OBJECT(simple_file)); }else{ AgsFile *file; GError *error; file = (AgsFile *) g_object_new(AGS_TYPE_FILE, "filename", window->name, NULL); error = NULL; ags_file_rw_open(file, TRUE, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_file_write(file); ags_file_close(file); g_object_unref(G_OBJECT(file)); } } if(response != GTK_RESPONSE_CANCEL){ ags_application_context_quit(application_context); }else{ gtk_widget_destroy(GTK_WIDGET(dialog)); } return(TRUE); } void ags_window_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsWindow *window) { if(event->type == GDK_BUTTON_PRESS && event->button == 3){ gtk_menu_popup(GTK_MENU(window->context_menu), NULL, NULL, NULL, NULL, (event != NULL) ? event->button : 0, gdk_event_get_time((GdkEvent*)event)); } } gsequencer-3.1.3/ags/X/ags_export_window.h0000644000175000017500000000466113607210263015503 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPORT_WINDOW_H__ #define __AGS_EXPORT_WINDOW_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EXPORT_WINDOW (ags_export_window_get_type()) #define AGS_EXPORT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EXPORT_WINDOW, AgsExportWindow)) #define AGS_EXPORT_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EXPORT_WINDOW, AgsExportWindowClass)) #define AGS_IS_EXPORT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EXPORT_WINDOW)) #define AGS_IS_EXPORT_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EXPORT_WINDOW)) #define AGS_EXPORT_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EXPORT_WINDOW, AgsExportWindowClass)) typedef struct _AgsExportWindow AgsExportWindow; typedef struct _AgsExportWindowClass AgsExportWindowClass; typedef enum{ AGS_EXPORT_WINDOW_CONNECTED = 1, AGS_EXPORT_WINDOW_LIVE_EXPORT = 1 << 1, }AgsExportWindowFlags; struct _AgsExportWindow { GtkWindow window; guint flags; GtkWidget *main_window; GtkCheckButton *live_export; GtkCheckButton *exclude_sequencer; GtkComboBoxText *mode; GtkSpinButton *tact; GtkLabel *duration; GtkVBox *export_soundcard; GtkButton *add; GtkToggleButton *export; }; struct _AgsExportWindowClass { GtkWindowClass window; }; GType ags_export_window_get_type(void); void ags_export_window_reload_soundcard_editor(AgsExportWindow *export_window); AgsExportWindow* ags_export_window_new(); G_END_DECLS #endif /*__AGS_EXPORT_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_line_member_editor.c0000644000175000017500000002344613607210263016414 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_line_member_editor_class_init(AgsLineMemberEditorClass *line_member_editor); void ags_line_member_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_line_member_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_line_member_editor_init(AgsLineMemberEditor *line_member_editor); void ags_line_member_editor_connect(AgsConnectable *connectable); void ags_line_member_editor_disconnect(AgsConnectable *connectable); void ags_line_member_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_line_member_editor_apply(AgsApplicable *applicable); void ags_line_member_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_line_member_editor * @short_description: Edit line member's aspects. * @title: AgsLineMemberEditor * @section_id: * @include: ags/X/ags_line_member_editor.h * * #AgsLineMemberEditor is a composite widget to modify line member. A line member * editor should be packed by a #AgsLineEditor. You may add/remove plugins with this * editor. */ GType ags_line_member_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_line_member_editor = 0; static const GTypeInfo ags_line_member_editor_info = { sizeof (AgsLineMemberEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_line_member_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLineMemberEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_line_member_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_line_member_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_line_member_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_line_member_editor = g_type_register_static(GTK_TYPE_VBOX, "AgsLineMemberEditor", &ags_line_member_editor_info, 0); g_type_add_interface_static(ags_type_line_member_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_line_member_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_line_member_editor); } return g_define_type_id__volatile; } void ags_line_member_editor_class_init(AgsLineMemberEditorClass *line_member_editor) { /* empty */ } void ags_line_member_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_line_member_editor_connect; connectable->disconnect = ags_line_member_editor_disconnect; } void ags_line_member_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_line_member_editor_set_update; applicable->apply = ags_line_member_editor_apply; applicable->reset = ags_line_member_editor_reset; } void ags_line_member_editor_init(AgsLineMemberEditor *line_member_editor) { GtkHBox *hbox; line_member_editor->flags = 0; line_member_editor->line_member = (GtkVBox *) gtk_vbox_new(FALSE, 2); gtk_box_pack_start((GtkBox *) line_member_editor, (GtkWidget *) line_member_editor->line_member, FALSE, FALSE, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 2); gtk_box_pack_start((GtkBox *) line_member_editor, (GtkWidget *) hbox, FALSE, FALSE, 0); line_member_editor->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) line_member_editor->add, FALSE, FALSE, 0); line_member_editor->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) line_member_editor->remove, FALSE, FALSE, 0); line_member_editor->plugin_browser = ags_plugin_browser_new((GtkWidget *) line_member_editor); } void ags_line_member_editor_connect(AgsConnectable *connectable) { AgsLineMemberEditor *line_member_editor; line_member_editor = AGS_LINE_MEMBER_EDITOR(connectable); if((AGS_LINE_MEMBER_EDITOR_CONNECTED & (line_member_editor->flags)) != 0){ return; } line_member_editor->flags |= AGS_LINE_MEMBER_EDITOR_CONNECTED; g_signal_connect(G_OBJECT(line_member_editor->add), "clicked", G_CALLBACK(ags_line_member_editor_add_callback), line_member_editor); g_signal_connect(G_OBJECT(line_member_editor->remove), "clicked", G_CALLBACK(ags_line_member_editor_remove_callback), line_member_editor); ags_connectable_connect(AGS_CONNECTABLE(line_member_editor->plugin_browser)); g_signal_connect(G_OBJECT(line_member_editor->plugin_browser), "response", G_CALLBACK(ags_line_member_editor_plugin_browser_response_callback), line_member_editor); } void ags_line_member_editor_disconnect(AgsConnectable *connectable) { AgsLineMemberEditor *line_member_editor; line_member_editor = AGS_LINE_MEMBER_EDITOR(connectable); if((AGS_LINE_MEMBER_EDITOR_CONNECTED & (line_member_editor->flags)) == 0){ return; } line_member_editor->flags &= (~AGS_LINE_MEMBER_EDITOR_CONNECTED); g_object_disconnect(G_OBJECT(line_member_editor->add), "any_signal::clicked", G_CALLBACK(ags_line_member_editor_add_callback), line_member_editor, NULL); g_object_disconnect(G_OBJECT(line_member_editor->remove), "any_signal::clicked", G_CALLBACK(ags_line_member_editor_remove_callback), line_member_editor, NULL); ags_connectable_disconnect(AGS_CONNECTABLE(line_member_editor->plugin_browser)); g_object_disconnect(G_OBJECT(line_member_editor->plugin_browser), "any_signal::response", G_CALLBACK(ags_line_member_editor_plugin_browser_response_callback), line_member_editor, NULL); } void ags_line_member_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_line_member_editor_apply(AgsApplicable *applicable) { /* empty */ } void ags_line_member_editor_reset(AgsApplicable *applicable) { AgsLineEditor *line_editor; AgsLineMemberEditor *line_member_editor; GtkHBox *hbox; GtkCheckButton *check_button; GtkLabel *label; GList *start_recall, *recall; gchar *str; gchar *filename, *effect; line_member_editor = AGS_LINE_MEMBER_EDITOR(applicable); line_editor = (AgsLineEditor *) gtk_widget_get_ancestor((GtkWidget *) line_member_editor, AGS_TYPE_LINE_EDITOR); g_object_get(line_editor->channel, "recall", &start_recall, NULL); recall = start_recall; while((recall = ags_recall_template_find_all_type(recall, AGS_TYPE_RECALL_LADSPA, AGS_TYPE_RECALL_LV2, G_TYPE_NONE)) != NULL){ if(ags_recall_test_behaviour_flags(recall->data, AGS_SOUND_BEHAVIOUR_BULK_MODE)){ recall = recall->next; continue; } g_object_get(G_OBJECT(recall->data), "filename", &filename, NULL); if(AGS_IS_RECALL_LADSPA(recall->data)){ g_object_get(G_OBJECT(recall->data), "effect", &effect, NULL); }else if(AGS_IS_RECALL_LV2(recall->data)){ g_object_get(G_OBJECT(recall->data), "uri", &effect, NULL); } hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(line_member_editor->line_member), GTK_WIDGET(hbox), FALSE, FALSE, 0); check_button = (GtkCheckButton *) gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(check_button), FALSE, FALSE, 0); filename = NULL; effect = NULL; g_object_get(G_OBJECT(recall->data), "filename", &filename, NULL); if(AGS_IS_RECALL_LADSPA(recall->data)){ g_object_get(G_OBJECT(recall->data), "effect", &effect, NULL); }else if(AGS_IS_RECALL_LV2(recall->data)){ g_object_get(G_OBJECT(recall->data), "uri", &effect, NULL); } str = g_strdup_printf("%s - %s", filename, effect); label = (GtkLabel *) gtk_label_new(str); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) hbox); g_free(str); recall = recall->next; } g_list_free_full(start_recall, g_object_unref); } /** * ags_line_member_editor_new: * * Create a new instance of #AgsLineMemberEditor * * Returns: the new #AgsLineMemberEditor * * Since: 3.0.0 */ AgsLineMemberEditor* ags_line_member_editor_new() { AgsLineMemberEditor *line_member_editor; line_member_editor = (AgsLineMemberEditor *) g_object_new(AGS_TYPE_LINE_MEMBER_EDITOR, NULL); return(line_member_editor); } gsequencer-3.1.3/ags/X/ags_wave_window.h0000644000175000017500000000420013607210263015111 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_WINDOW_H__ #define __AGS_WAVE_WINDOW_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_WINDOW (ags_wave_window_get_type()) #define AGS_WAVE_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_WINDOW, AgsWaveWindow)) #define AGS_WAVE_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_WINDOW, AgsWaveWindowClass)) #define AGS_IS_WAVE_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_WAVE_WINDOW)) #define AGS_IS_WAVE_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_WAVE_WINDOW)) #define AGS_WAVE_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_WAVE_WINDOW, AgsWaveWindowClass)) typedef struct _AgsWaveWindow AgsWaveWindow; typedef struct _AgsWaveWindowClass AgsWaveWindowClass; typedef enum{ AGS_WAVE_WINDOW_CONNECTED = 1, }AgsWaveWindowFlags; struct _AgsWaveWindow { GtkWindow window; guint flags; GtkWidget *parent_window; AgsWaveEditor *wave_editor; }; struct _AgsWaveWindowClass { GtkWindowClass window; }; GType ags_wave_window_get_type(void); AgsWaveWindow* ags_wave_window_new(GtkWidget *parent_window); G_END_DECLS #endif /*__AGS_WAVE_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_automation_editor.h0000644000175000017500000001254513616617253016333 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_EDITOR_H__ #define __AGS_AUTOMATION_EDITOR_H__ #include #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION_EDITOR (ags_automation_editor_get_type()) #define AGS_AUTOMATION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION_EDITOR, AgsAutomationEditor)) #define AGS_AUTOMATION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION_EDITOR, AgsAutomationEditorClass)) #define AGS_IS_AUTOMATION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTOMATION_EDITOR)) #define AGS_IS_AUTOMATION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTOMATION_EDITOR)) #define AGS_AUTOMATION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUTOMATION_EDITOR, AgsAutomationEditorClass)) #define AGS_AUTOMATION_EDITOR_CHILD(ptr) ((AgsAutomationEditorChild *)(ptr)) #define AGS_AUTOMATION_EDITOR_MAX_VALUE_COUNT (64 * 16 * 16 * 1200) #define AGS_AUTOMATION_EDITOR_MAX_CONTROLS (64 * 16 * 16 * 1200) #define AGS_AUTOMATION_EDITOR_DEFAULT_VERSION "1.3.0" #define AGS_AUTOMATION_EDITOR_DEFAULT_BUILD_ID "Wed Dec 27 03:43:55 UTC 2017" typedef struct _AgsAutomationEditor AgsAutomationEditor; typedef struct _AgsAutomationEditorClass AgsAutomationEditorClass; typedef enum{ AGS_AUTOMATION_EDITOR_CONNECTED = 1, AGS_AUTOMATION_EDITOR_RESET_AUDIO_HSCROLLBAR = 1 << 1, AGS_AUTOMATION_EDITOR_RESET_OUTPUT_HSCROLLBAR = 1 << 2, AGS_AUTOMATION_EDITOR_RESET_INPUT_HSCROLLBAR = 1 << 3, AGS_AUTOMATION_EDITOR_PASTE_MATCH_LINE = 1 << 4, AGS_AUTOMATION_EDITOR_PASTE_NO_DUPLICATES = 1 << 5, }AgsAutomationEditorFlags; struct _AgsAutomationEditor { GtkVBox vbox; guint flags; gchar *version; gchar *build_id; guint tact_counter; gdouble current_tact; guint chunk_duration; GtkHPaned *paned; AgsMachineSelector *machine_selector; AgsMachine *selected_machine; AgsAutomationToolbar *automation_toolbar; GtkNotebook *notebook; AgsRuler *audio_ruler; AgsScrolledScaleBox *audio_scrolled_scale_box; AgsScrolledAutomationEditBox *audio_scrolled_automation_edit_box; GtkVScrollbar *audio_vscrollbar; GtkHScrollbar *audio_hscrollbar; AgsNotebook *output_notebook; AgsRuler *output_ruler; AgsScrolledScaleBox *output_scrolled_scale_box; AgsScrolledAutomationEditBox *output_scrolled_automation_edit_box; GtkVScrollbar *output_vscrollbar; GtkHScrollbar *output_hscrollbar; AgsNotebook *input_notebook; AgsRuler *input_ruler; AgsScrolledScaleBox *input_scrolled_scale_box; AgsScrolledAutomationEditBox *input_scrolled_automation_edit_box; GtkVScrollbar *input_vscrollbar; GtkHScrollbar *input_hscrollbar; AgsAutomationEdit *focused_automation_edit; AgsAutomationMeta *automation_meta; }; struct _AgsAutomationEditorClass { GtkVBoxClass vbox; void (*machine_changed)(AgsAutomationEditor *automation_editor, AgsMachine *machine); }; GType ags_automation_editor_get_type(void); void ags_automation_editor_reset_audio_scrollbar(AgsAutomationEditor *automation_editor); void ags_automation_editor_reset_output_scrollbar(AgsAutomationEditor *automation_editor); void ags_automation_editor_reset_input_scrollbar(AgsAutomationEditor *automation_editor); void ags_automation_editor_machine_changed(AgsAutomationEditor *automation_editor, AgsMachine *machine); void ags_automation_editor_add_acceleration(AgsAutomationEditor *automation_editor, AgsAcceleration *acceleration); void ags_automation_editor_delete_acceleration(AgsAutomationEditor *automation_editor, guint x, gdouble y); void ags_automation_editor_select_region(AgsAutomationEditor *automation_editor, guint x0, gdouble y0, guint x1, gdouble y1); void ags_automation_editor_select_all(AgsAutomationEditor *automation_editor); void ags_automation_editor_paste(AgsAutomationEditor *automation_editor); void ags_automation_editor_copy(AgsAutomationEditor *automation_editor); void ags_automation_editor_cut(AgsAutomationEditor *automation_editor); void ags_automation_editor_invert(AgsAutomationEditor *automation_editor); AgsAutomationEditor* ags_automation_editor_new(); G_END_DECLS #endif /*__AGS_AUTOMATION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_window_callbacks.h0000644000175000017500000000253213613101102016060 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WINDOW_CALLBACKS_H__ #define __AGS_WINDOW_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_window_setup_completed_callback(AgsApplicationContext *application_context, AgsWindow *window); gboolean ags_window_delete_event_callback(GtkWidget *widget, gpointer data); void ags_window_button_press_event(GtkWidget *widget, GdkEventButton *event, AgsWindow *window); G_END_DECLS #endif /*__AGS_WINDOW_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_pad.c0000644000175000017500000006176213607331151013337 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_pad_class_init(AgsPadClass *pad); void ags_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pad_init(AgsPad *pad); void ags_pad_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pad_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pad_connect(AgsConnectable *connectable); void ags_pad_disconnect(AgsConnectable *connectable); void ags_pad_real_set_channel(AgsPad *pad, AgsChannel *channel); void ags_pad_real_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); void ags_pad_real_map_recall(AgsPad *pad, guint output_pad_start); GList* ags_pad_real_find_port(AgsPad *pad); /** * SECTION:ags_pad * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsPad * @section_id: * @include: ags/X/ags_pad.h * * #AgsPad is a composite widget to visualize a bunch of #AgsChannel. It should be * packed by an #AgsMachine. */ enum{ SAMPLERATE_CHANGED, BUFFER_SIZE_CHANGED, FORMAT_CHANGED, SET_CHANNEL, RESIZE_LINES, MAP_RECALL, FIND_PORT, LAST_SIGNAL, }; enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_CHANNEL, }; static gpointer ags_pad_parent_class = NULL; static guint pad_signals[LAST_SIGNAL]; GType ags_pad_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pad = 0; static const GTypeInfo ags_pad_info = { sizeof(AgsPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pad = g_type_register_static(GTK_TYPE_VBOX, "AgsPad", &ags_pad_info, 0); g_type_add_interface_static(ags_type_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pad); } return g_define_type_id__volatile; } void ags_pad_class_init(AgsPadClass *pad) { GObjectClass *gobject; GParamSpec *param_spec; ags_pad_parent_class = g_type_class_peek_parent(pad); /* GObjectClass */ gobject = G_OBJECT_CLASS(pad); gobject->set_property = ags_pad_set_property; gobject->get_property = ags_pad_get_property; //TODO:JK: add finalize /* properties */ /** * AgsPad:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsPad:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsPad:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsPad:channel: * * The start of a bunch of #AgsChannel to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /* AgsPadClass */ pad->samplerate_changed = NULL; pad->buffer_size_changed = NULL; pad->format_changed = NULL; pad->set_channel = ags_pad_real_set_channel; pad->resize_lines = ags_pad_real_resize_lines; pad->map_recall = ags_pad_real_map_recall; pad->find_port = ags_pad_real_find_port; /* signals */ /** * AgsPad::samplerate-changed: * @pad: the #AgsPad * @samplerate: the samplerate * @old_samplerate: the old samplerate * * The ::samplerate-changed signal notifies about changed samplerate. * * Since: 3.0.0 */ pad_signals[SAMPLERATE_CHANGED] = g_signal_new("samplerate-changed", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, samplerate_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsPad::buffer-size-changed: * @pad: the #AgsPad * @buffer_size: the buffer size * @old_buffer_size: the old buffer size * * The ::buffer-size-changed signal notifies about changed buffer size. * * Since: 3.0.0 */ pad_signals[BUFFER_SIZE_CHANGED] = g_signal_new("buffer-size-changed", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, buffer_size_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsPad::format-changed: * @pad: the #AgsPad * @format: the format * @old_format: the old format * * The ::format-changed signal notifies about changed format. * * Since: 3.0.0 */ pad_signals[FORMAT_CHANGED] = g_signal_new("format-changed", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, format_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsPad::set-channel: * @pad: the #AgsPad to modify * @channel: the #AgsChannel to set * * The ::set-channel signal notifies about changed channel. * * Since: 3.0.0 */ pad_signals[SET_CHANNEL] = g_signal_new("set-channel", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, set_channel), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsPad::resize-lines: * @pad: the #AgsPad to resize * @line_type: the channel type * @audio_channels: count of lines * @audio_channels_old: old count of lines * * The ::resize-lines is emitted as count of lines pack is modified. * * Since: 3.0.0 */ pad_signals[RESIZE_LINES] = g_signal_new("resize-lines", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, resize_lines), NULL, NULL, ags_cclosure_marshal_VOID__ULONG_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_ULONG, G_TYPE_UINT, G_TYPE_UINT); /** * AgsPad::map-recall: * @pad: the #AgsPad to resize * @output_pad_start: start of output pad * * The ::map-recall as recall should be mapped * * Since: 3.0.0 */ pad_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsPad::find-port: * @pad: the #AgsPad to resize * * The ::find-port retrieves all associated ports * * Returns: a #GList-struct with associated ports * * Since: 3.0.0 */ pad_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(pad), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPadClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); } void ags_pad_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_pad_connect; connectable->disconnect = ags_pad_disconnect; } void ags_pad_init(AgsPad *pad) { GtkMenu *menu; GtkHBox *hbox; AgsConfig *config; pad->flags = 0; pad->name = NULL; pad->version = AGS_VERSION; pad->build_id = AGS_BUILD_ID; config = ags_config_get_instance(); pad->samplerate = ags_soundcard_helper_config_get_samplerate(config); pad->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); pad->format = ags_soundcard_helper_config_get_format(config); pad->channel = NULL; pad->cols = 2; pad->expander_set = ags_expander_set_new(1, 1); gtk_box_pack_start((GtkBox *) pad, (GtkWidget *) pad->expander_set, TRUE, TRUE, 0); hbox = (GtkHBox *) gtk_hbox_new(TRUE, 0); gtk_box_pack_start((GtkBox *) pad, (GtkWidget *) hbox, FALSE, FALSE, 0); pad->group = (GtkToggleButton *) gtk_toggle_button_new_with_label("G"); gtk_toggle_button_set_active(pad->group, TRUE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) pad->group, FALSE, FALSE, 0); pad->mute = (GtkToggleButton *) gtk_toggle_button_new_with_label("M"); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) pad->mute, FALSE, FALSE, 0); pad->solo = (GtkToggleButton *) gtk_toggle_button_new_with_label("S"); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) pad->solo, FALSE, FALSE, 0); pad->play = NULL; } void ags_pad_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPad *pad; pad = AGS_PAD(gobject); switch(prop_id){ case PROP_SAMPLERATE: { GList *start_list, *list; guint samplerate, old_samplerate; samplerate = g_value_get_uint(value); old_samplerate = pad->samplerate; if(samplerate == old_samplerate){ return; } pad->samplerate = samplerate; ags_pad_samplerate_changed(pad, samplerate, old_samplerate); list = start_list = gtk_container_get_children(pad->expander_set); while(list != NULL){ if(AGS_LINE(list->data)){ g_object_set(list->data, "samplerate", samplerate, NULL); } list = list->next; } g_list_free(start_list); } break; case PROP_BUFFER_SIZE: { GList *start_list, *list; guint buffer_size, old_buffer_size; buffer_size = g_value_get_uint(value); old_buffer_size = pad->buffer_size; if(buffer_size == old_buffer_size){ return; } pad->buffer_size = buffer_size; ags_pad_buffer_size_changed(pad, buffer_size, old_buffer_size); list = start_list = gtk_container_get_children(pad->expander_set); while(list != NULL){ if(AGS_LINE(list->data)){ g_object_set(list->data, "buffer-size", buffer_size, NULL); } list = list->next; } g_list_free(start_list); } break; case PROP_FORMAT: { GList *start_list, *list; guint format, old_format; format = g_value_get_uint(value); old_format = pad->format; if(format == old_format){ return; } pad->format = format; ags_pad_format_changed(pad, format, old_format); list = start_list = gtk_container_get_children(pad->expander_set); while(list != NULL){ if(AGS_LINE(list->data)){ g_object_set(list->data, "format", format, NULL); } list = list->next; } g_list_free(start_list); } break; case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); ags_pad_set_channel(pad, channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pad_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPad *pad; pad = AGS_PAD(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, pad->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, pad->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, pad->format); } break; case PROP_CHANNEL: { g_value_set_object(value, pad->channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pad_connect(AgsConnectable *connectable) { AgsPad *pad; GList *line_list, *line_list_start; /* AgsPad */ pad = AGS_PAD(connectable); if((AGS_PAD_CONNECTED & (pad->flags)) != 0){ return; } pad->flags |= AGS_PAD_CONNECTED; if((AGS_PAD_PREMAPPED_RECALL & (pad->flags)) == 0){ if((AGS_PAD_MAPPED_RECALL & (pad->flags)) == 0){ ags_pad_map_recall(pad, 0); } }else{ pad->flags &= (~AGS_PAD_PREMAPPED_RECALL); ags_pad_find_port(pad); } /* GtkButton */ g_signal_connect_after((GObject *) pad->group, "clicked", G_CALLBACK(ags_pad_group_clicked_callback), (gpointer) pad); g_signal_connect_after((GObject *) pad->mute, "clicked", G_CALLBACK(ags_pad_mute_clicked_callback), (gpointer) pad); g_signal_connect_after((GObject *) pad->solo, "clicked", G_CALLBACK(ags_pad_solo_clicked_callback), (gpointer) pad); /* AgsLine */ line_list_start = line_list = gtk_container_get_children(GTK_CONTAINER(pad->expander_set)); while(line_list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(line_list->data)); line_list = line_list->next; } g_list_free(line_list_start); } void ags_pad_disconnect(AgsConnectable *connectable) { AgsPad *pad; GList *line_list, *line_list_start; /* AgsPad */ pad = AGS_PAD(connectable); if((AGS_PAD_CONNECTED & (pad->flags)) == 0){ return; } pad->flags &= (~AGS_PAD_CONNECTED); /* AgsLine */ line_list_start = line_list = gtk_container_get_children(GTK_CONTAINER(pad->expander_set)); while(line_list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(line_list->data)); line_list = line_list->next; } g_list_free(line_list_start); g_signal_handlers_disconnect_by_data(pad->channel, pad); } /** * ags_pad_samplerate_changed: * @pad: the #AgsPad * @samplerate: the samplerate * @old_samplerate: the old samplerate * * Notify about samplerate changed. * * Since: 3.0.0 */ void ags_pad_samplerate_changed(AgsPad *pad, guint samplerate, guint old_samplerate) { g_return_if_fail(AGS_IS_PAD(pad)); g_object_ref((GObject *) pad); g_signal_emit(G_OBJECT(pad), pad_signals[SAMPLERATE_CHANGED], 0, samplerate, old_samplerate); g_object_unref((GObject *) pad); } /** * ags_pad_buffer_size_changed: * @pad: the #AgsPad * @buffer_size: the buffer_size * @old_buffer_size: the old buffer_size * * Notify about buffer_size changed. * * Since: 3.0.0 */ void ags_pad_buffer_size_changed(AgsPad *pad, guint buffer_size, guint old_buffer_size) { g_return_if_fail(AGS_IS_PAD(pad)); g_object_ref((GObject *) pad); g_signal_emit(G_OBJECT(pad), pad_signals[BUFFER_SIZE_CHANGED], 0, buffer_size, old_buffer_size); g_object_unref((GObject *) pad); } /** * ags_pad_format_changed: * @pad: the #AgsPad * @format: the format * @old_format: the old format * * Notify about format changed. * * Since: 3.0.0 */ void ags_pad_format_changed(AgsPad *pad, guint format, guint old_format) { g_return_if_fail(AGS_IS_PAD(pad)); g_object_ref((GObject *) pad); g_signal_emit(G_OBJECT(pad), pad_signals[FORMAT_CHANGED], 0, format, old_format); g_object_unref((GObject *) pad); } void ags_pad_real_set_channel(AgsPad *pad, AgsChannel *channel) { AgsChannel *current, *next_current; GList *line, *line_start; if(pad->channel == channel){ return; } if(pad->channel != NULL){ g_object_unref(G_OBJECT(pad->channel)); } if(channel != NULL){ g_object_ref(G_OBJECT(channel)); } if(channel != NULL){ pad->samplerate = channel->samplerate; pad->buffer_size = channel->buffer_size; pad->format = channel->format; } pad->channel = channel; line_start = line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(pad)->expander_set)); current = channel; if(current != NULL){ g_object_ref(current); } next_current = NULL; /* set channel */ while(line != NULL){ g_object_set(G_OBJECT(line->data), "channel", current, NULL); /* iterate */ if(current != NULL){ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } line = line->next; } if(next_current != NULL){ g_object_unref(next_current); } g_list_free(line_start); } /** * ags_pad_set_channel: * @pad: an #AgsPad * @channel: the #AgsChannel to set * * Is emitted as channel gets modified. * * Since: 3.0.0 */ void ags_pad_set_channel(AgsPad *pad, AgsChannel *channel) { g_return_if_fail(AGS_IS_PAD(pad)); g_object_ref((GObject *) pad); g_signal_emit(G_OBJECT(pad), pad_signals[SET_CHANNEL], 0, channel); g_object_unref((GObject *) pad); } void ags_pad_real_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AgsLine *line; AgsChannel *channel, *next_channel; guint i, j; #ifdef AGS_DEBUG g_message("ags_pad_real_resize_lines: audio_channels = %u ; audio_channels_old = %u\n", audio_channels, audio_channels_old); #endif /* resize */ if(audio_channels > audio_channels_old){ channel = ags_channel_nth(pad->channel, audio_channels_old); next_channel = NULL; /* create AgsLine */ for(i = audio_channels_old; i < audio_channels;){ for(j = audio_channels_old % pad->cols; j < pad->cols && i < audio_channels; j++, i++){ /* instantiate line */ line = (AgsLine *) g_object_new(line_type, "pad", pad, "channel", channel, NULL); if(channel != NULL){ channel->line_widget = (GObject *) line; } ags_expander_set_add(pad->expander_set, (GtkWidget *) line, j, floor(i / pad->cols), 1, 1); /* iterate */ if(channel != NULL){ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(audio_channels < audio_channels_old){ GList *list, *list_start; list_start = list = g_list_nth(g_list_reverse(gtk_container_get_children(GTK_CONTAINER(pad->expander_set))), audio_channels); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } list = list_start; while(list != NULL){ gtk_widget_destroy(GTK_WIDGET(list->data)); list = list->next; } g_list_free(list_start); } } /** * ags_pad_resize_lines: * @pad: the #AgsPad to resize * @line_type: channel type, either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * @audio_channels: count of lines * @audio_channels_old: old count of lines * * Resize the count of #AgsLine packe by #AgsPad. * * Since: 3.0.0 */ void ags_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { g_return_if_fail(AGS_IS_PAD(pad)); // fprintf(stdout, "ags_pad_resize_lines: audio_channels = %u ; audio_channels_old = %u\n", audio_channels, audio_channels_old); g_object_ref((GObject *) pad); g_signal_emit(G_OBJECT(pad), pad_signals[RESIZE_LINES], 0, line_type, audio_channels, audio_channels_old); g_object_unref((GObject *) pad); } void ags_pad_real_map_recall(AgsPad *pad, guint output_pad_start) { if((AGS_PAD_MAPPED_RECALL & (pad->flags)) != 0){ return; } pad->flags |= AGS_PAD_MAPPED_RECALL; ags_pad_find_port(pad); } /** * ags_pad_map_recall: * @pad: the #AgsPad to resize * @output_pad_start: start of output pad * * Start of output pad * * Since: 3.0.0 */ void ags_pad_map_recall(AgsPad *pad, guint output_pad_start) { g_return_if_fail(AGS_IS_PAD(pad)); g_object_ref((GObject *) pad); g_signal_emit(G_OBJECT(pad), pad_signals[MAP_RECALL], 0, output_pad_start); g_object_unref((GObject *) pad); } GList* ags_pad_real_find_port(AgsPad *pad) { GList *line; GList *port, *tmp_port; port = NULL; /* find output ports */ if(pad->expander_set != NULL){ line = gtk_container_get_children((GtkContainer *) pad->expander_set); while(line != NULL){ tmp_port = ags_line_find_port(AGS_LINE(line->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } line = line->next; } } return(port); } /** * ags_pad_find_port: * @pad: an #AgsPad * * Lookup ports of assigned recalls. * * Returns: an #GList containing all related #AgsPort * * Since: 3.0.0 */ GList* ags_pad_find_port(AgsPad *pad) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_PAD(pad), NULL); g_object_ref((GObject *) pad); g_signal_emit((GObject *) pad, pad_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) pad); return(list); } void ags_pad_play(AgsPad *pad) { AgsMachine *machine; AgsChannel *channel; AgsChannel *next_pad, *next_channel; AgsPlayback *playback; GList *start_list, *list; gboolean play_all; if(!AGS_IS_PAD(pad)){ return; } machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pad, AGS_TYPE_MACHINE); list = start_list = gtk_container_get_children(GTK_CONTAINER(pad->expander_set)); /* */ play_all = gtk_toggle_button_get_active(pad->group); if(gtk_toggle_button_get_active(pad->play)){ if(play_all){ channel = pad->channel; if(channel != NULL){ g_object_ref(channel); } next_pad = ags_channel_next_pad(channel); next_channel = NULL; while(channel != next_pad){ AgsNote *play_note; g_object_get(channel, "playback", &playback, NULL); g_object_get(playback, "play-note", &play_note, NULL); g_object_set(play_note, "x0", 0, "x1", 1, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ while((list = ags_line_find_next_grouped(list)) != NULL){ AgsLine *line; line = AGS_LINE(list->data); channel = line->channel; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); /* iterate */ list = list->next; } } }else{ if(play_all){ channel = pad->channel; if(channel != NULL){ g_object_ref(channel); } next_pad = ags_channel_next_pad(channel); next_channel = NULL; while(channel != next_pad){ g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, FALSE); g_object_unref(playback); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ while((list = ags_line_find_next_grouped(list)) != NULL){ AgsLine *line; line = AGS_LINE(list->data); channel = line->channel; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, FALSE); g_object_unref(playback); /* iterate */ list = list->next; } } } g_list_free(start_list); } /** * ags_pad_new: * @channel: the bunch of channel to visualize * * Creates an #AgsPad * * Returns: a new #AgsPad * * Since: 3.0.0 */ AgsPad* ags_pad_new(AgsChannel *channel) { AgsPad *pad; pad = (AgsPad *) g_object_new(AGS_TYPE_PAD, NULL); return(pad); } gsequencer-3.1.3/ags/X/ags_effect_bulk.h0000644000175000017500000001033613607210264015041 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_BULK_H__ #define __AGS_EFFECT_BULK_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EFFECT_BULK (ags_effect_bulk_get_type()) #define AGS_EFFECT_BULK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EFFECT_BULK, AgsEffectBulk)) #define AGS_EFFECT_BULK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EFFECT_BULK, AgsEffectBulkClass)) #define AGS_IS_EFFECT_BULK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EFFECT_BULK)) #define AGS_IS_EFFECT_BULK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EFFECT_BULK)) #define AGS_EFFECT_BULK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EFFECT_BULK, AgsEffectBulkClass)) #define AGS_EFFECT_BULK_PLUGIN(ptr) ((AgsEffectBulkPlugin *)(ptr)) #define AGS_EFFECT_BULK_DEFAULT_VERSION "0.7.8" #define AGS_EFFECT_BULK_DEFAULT_BUILD_ID "CEST 01-03-2016 00:23" #define AGS_EFFECT_BULK_COLUMNS_COUNT (4) typedef struct _AgsEffectBulk AgsEffectBulk; typedef struct _AgsEffectBulkClass AgsEffectBulkClass; typedef struct _AgsEffectBulkPlugin AgsEffectBulkPlugin; typedef enum{ AGS_EFFECT_BULK_MAPPED_RECALL = 1, AGS_EFFECT_BULK_PREMAPPED_RECALL = 1 << 1, AGS_EFFECT_BULK_CONNECTED = 1 << 2, AGS_EFFECT_BULK_HIDE_BUTTONS = 1 << 3, AGS_EFFECT_BULK_HIDE_ENTRIES = 1 << 4, AGS_EFFECT_BULK_SHOW_LABELS = 1 << 5, }AgsEffectBulkFlags; struct _AgsEffectBulk { GtkVBox vbox; guint flags; gchar *name; gchar *version; gchar *build_id; GType channel_type; AgsAudio *audio; GtkButton *add; GtkButton *remove; GtkVBox *bulk_member; GtkTable *table; GList *plugin; GtkDialog *plugin_browser; GList *queued_drawing; }; struct _AgsEffectBulkClass { GtkVBoxClass vbox; GList* (*add_effect)(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect); void (*remove_effect)(AgsEffectBulk *effect_bulk, guint nth); void (*resize_audio_channels)(AgsEffectBulk *effect_bulk, guint new_size, guint old_size); void (*resize_pads)(AgsEffectBulk *effect_bulk, guint new_size, guint old_size); void (*map_recall)(AgsEffectBulk *effect_bulk); GList* (*find_port)(AgsEffectBulk *effect_bulk); }; struct _AgsEffectBulkPlugin { gchar *filename; gchar *effect; GList *control_type_name; guint control_count; }; GType ags_effect_bulk_get_type(void); AgsEffectBulkPlugin* ags_effect_bulk_plugin_alloc(gchar *filename, gchar *effect); void ags_effect_bulk_plugin_free(AgsEffectBulkPlugin *effect_bulk_plugin); GList* ags_effect_bulk_add_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect); void ags_effect_bulk_remove_effect(AgsEffectBulk *effect_bulk, guint nth); void ags_effect_bulk_resize_audio_channels(AgsEffectBulk *effect_bulk, guint new_size, guint old_size); void ags_effect_bulk_resize_pads(AgsEffectBulk *effect_bulk, guint new_size, guint old_size); void ags_effect_bulk_map_recall(AgsEffectBulk *effect_bulk); GList* ags_effect_bulk_find_port(AgsEffectBulk *effect_bulk); gboolean ags_effect_bulk_indicator_queue_draw_timeout(GtkWidget *widget); AgsEffectBulk* ags_effect_bulk_new(AgsAudio *audio, GType channel_type); G_END_DECLS #endif /*__AGS_EFFECT_BULK_H__*/ gsequencer-3.1.3/ags/X/ags_line_member_editor.h0000644000175000017500000000453713607210263016421 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_MEMBER_EDITOR_H__ #define __AGS_LINE_MEMBER_EDITOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINE_MEMBER_EDITOR (ags_line_member_editor_get_type()) #define AGS_LINE_MEMBER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LINE_MEMBER_EDITOR, AgsLineMemberEditor)) #define AGS_LINE_MEMBER_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LINE_MEMBER_EDITOR, AgsLineMemberEditorClass)) #define AGS_IS_LINE_MEMBER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LINE_MEMBER_EDITOR)) #define AGS_IS_LINE_MEMBER_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LINE_MEMBER_EDITOR)) #define AGS_LINE_MEMBER_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LINE_MEMBER_EDITOR, AgsLineMemberEditorClass)) typedef struct _AgsLineMemberEditor AgsLineMemberEditor; typedef struct _AgsLineMemberEditorClass AgsLineMemberEditorClass; typedef enum{ AGS_LINE_MEMBER_EDITOR_CONNECTED = 1, }AgsLineMemberEditorFlags; struct _AgsLineMemberEditor { GtkVBox vbox; guint flags; GtkVBox *line_member; GtkButton *add; GtkMenu *popup; GtkButton *remove; AgsPluginBrowser *plugin_browser; }; struct _AgsLineMemberEditorClass { GtkVBoxClass vbox; }; GType ags_line_member_editor_get_type(void); AgsLineMemberEditor* ags_line_member_editor_new(); G_END_DECLS #endif /*__AGS_LINE_MEMBER_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_midi_dialog.h0000644000175000017500000000544713607210263015037 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_DIALOG_H__ #define __AGS_MIDI_DIALOG_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_DIALOG (ags_midi_dialog_get_type()) #define AGS_MIDI_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_DIALOG, AgsMidiDialog)) #define AGS_MIDI_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_DIALOG, AgsMidiDialogClass)) #define AGS_IS_MIDI_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MIDI_DIALOG)) #define AGS_IS_MIDI_DIALOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MIDI_DIALOG)) #define AGS_MIDI_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MIDI_DIALOG, AgsMidiDialogClass)) #define AGS_MIDI_DIALOG_DEFAULT_VERSION "0.7.0" #define AGS_MIDI_DIALOG_DEFAULT_BUILD_ID "CEST 02-11-2015 19:44" typedef struct _AgsMidiDialog AgsMidiDialog; typedef struct _AgsMidiDialogClass AgsMidiDialogClass; typedef enum{ AGS_MIDI_DIALOG_CONNECTED = 1, AGS_MIDI_DIALOG_IO_OPTIONS = 1 << 1, AGS_MIDI_DIALOG_MAPPING = 1 << 2, AGS_MIDI_DIALOG_DEVICE = 1 << 3, }AgsMidiDialogFlags; struct _AgsMidiDialog { GtkDialog dialog; guint flags; gchar *version; gchar *build_id; AgsMachine *machine; GtkVBox *io_options; GtkSpinButton *midi_channel; GtkCheckButton *playback; GtkCheckButton *record; GtkVBox *mapping; GtkSpinButton *audio_start; GtkSpinButton *audio_end; GtkSpinButton *midi_start; GtkSpinButton *midi_end; GtkVBox *device; GtkComboBoxText *midi_device; GtkButton *apply; GtkButton *ok; GtkButton *cancel; }; struct _AgsMidiDialogClass { GtkDialogClass dialog; }; GType ags_midi_dialog_get_type(void); void ags_midi_dialog_load_sequencers(AgsMidiDialog *midi_dialog); AgsMidiDialog* ags_midi_dialog_new(AgsMachine *machine); G_END_DECLS #endif /*__AGS_MIDI_DIALOG_H__*/ gsequencer-3.1.3/ags/X/ags_menu_bar.c0000644000175000017500000007376513607210263014371 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_menu_bar_class_init(AgsMenuBarClass *menu_bar); void ags_menu_bar_connectable_interface_init(AgsConnectableInterface *connectable); void ags_menu_bar_init(AgsMenuBar *menu_bar); void ags_menu_bar_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_menu_bar_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_menu_bar_connect(AgsConnectable *connectable); void ags_menu_bar_disconnect(AgsConnectable *connectable); /** * SECTION:ags_menu_bar * @short_description: the menu bar. * @title: AgsMenuBar * @section_id: * @include: ags/X/ags_menu_bar.h * * #AgsMenuBar is a composite widget to be used as application's menu bar. */ GType ags_menu_bar_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_menu_bar = 0; static const GTypeInfo ags_menu_bar_info = { sizeof (AgsMenuBarClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_menu_bar_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMenuBar), 0, /* n_preallocs */ (GInstanceInitFunc) ags_menu_bar_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_menu_bar_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_menu_bar = g_type_register_static(GTK_TYPE_MENU_BAR, "AgsMenuBar", &ags_menu_bar_info, 0); g_type_add_interface_static(ags_type_menu_bar, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_menu_bar); } return g_define_type_id__volatile; } void ags_menu_bar_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_menu_bar_connect; connectable->disconnect = ags_menu_bar_disconnect; } void ags_menu_bar_class_init(AgsMenuBarClass *menu_bar) { } void ags_menu_bar_init(AgsMenuBar *menu_bar) { GtkMenuItem *item; menu_bar->flags = 0; /* File */ item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_File")); gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item); menu_bar->file = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->file); item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Open")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Save")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Save as")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Quit")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->file, (GtkWidget*) item); /* Edit */ item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Edit")); gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item); menu_bar->edit = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->edit); // item = (GtkMenuItem *) gtk_menu_item_new_with_label(GTK_STOCK_UNDO); // gtk_menu_shell_append((GtkMenuShell*) menu, (GtkWidget*) item); // item = (GtkMenuItem *) gtk_menu_item_new_with_label(GTK_STOCK_REDO); // gtk_menu_shell_append((GtkMenuShell*) menu, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Add")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item); menu_bar->add = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->add); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Panel")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Mixer")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Spectrometer")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Equalizer")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Drum")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Matrix")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Synth")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FM Synth")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Syncsynth")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FM Syncsynth")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); #ifdef AGS_WITH_LIBINSTPATCH item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("FPlayer")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); #endif item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Sampler")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Audiorec")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->add, (GtkWidget*) item); /* automation */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Automation")); // gtk_widget_set_sensitive(item, // FALSE); gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item); /* wave */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Wave")); // gtk_widget_set_sensitive(item, // FALSE); gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item); /* preferences */ gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Preferences")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->edit, (GtkWidget*) item); /* MIDI */ item = (GtkMenuItem *) gtk_menu_item_new_with_label("MIDI"); gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item); menu_bar->midi = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->midi); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("import")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("export track")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) item); gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) gtk_separator_menu_item_new()); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("playback")); gtk_widget_set_sensitive((GtkWidget *) item, FALSE); gtk_menu_shell_append((GtkMenuShell*) menu_bar->midi, (GtkWidget*) item); /* Help */ item = (GtkMenuItem *) gtk_menu_item_new_with_mnemonic(i18n("_Help")); gtk_menu_shell_append((GtkMenuShell*) menu_bar, (GtkWidget*) item); menu_bar->help = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem*) item, (GtkWidget*) menu_bar->help); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("Online help")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->help, (GtkWidget*) item); item = (GtkMenuItem *) gtk_menu_item_new_with_label(i18n("About")); gtk_menu_shell_append((GtkMenuShell*) menu_bar->help, (GtkWidget*) item); } void ags_menu_bar_connect(AgsConnectable *connectable) { AgsMenuBar *menu_bar; GList *list0, *list1, *list2, *list3, *list4; GList *list0_start, *list1_start, *list2_start, *list3_start, *list4_start; menu_bar = AGS_MENU_BAR(connectable); if((AGS_MENU_BAR_CONNECTED & (menu_bar->flags)) != 0){ return; } menu_bar->flags |= AGS_MENU_BAR_CONNECTED; /* File */ list0 = list0_start = gtk_container_get_children(GTK_MENU_SHELL(menu_bar)); list1_start = list1 = gtk_container_get_children ((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_open_callback), (gpointer) menu_bar); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_save_callback), (gpointer) menu_bar); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_save_as_callback), menu_bar); list1 = list1->next->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_export_callback), menu_bar); list1 = list1->next->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_quit_callback), (gpointer) menu_bar); g_list_free(list1_start); /* Edit */ list0 = list0->next; list1_start = list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_add_callback), (gpointer) menu_bar); list2_start = list2 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list1->data)); list1 = list1->next; /* machines */ g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_panel_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_mixer_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_spectrometer_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_equalizer_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_drum_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_matrix_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_synth_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_fm_synth_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_syncsynth_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_fm_syncsynth_callback), (gpointer) menu_bar); list2 = list2->next; #ifdef AGS_WITH_LIBINSTPATCH g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_ffplayer_callback), (gpointer) menu_bar); list2 = list2->next; #endif g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_pitch_sampler_callback), (gpointer) menu_bar); list2 = list2->next; g_signal_connect(G_OBJECT (list2->data), "activate", G_CALLBACK (ags_menu_action_add_audiorec_callback), (gpointer) menu_bar); list2 = list2->next; /* ladspa */ list3_start = list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); list2 = list2->next; while(list3 != NULL){ g_signal_connect(G_OBJECT(list3->data), "activate", G_CALLBACK(ags_menu_action_add_ladspa_bridge_callback), (gpointer) menu_bar); list3 = list3->next; } g_list_free(list3_start); /* dssi */ list3_start = list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); list2 = list2->next; while(list3 != NULL){ g_signal_connect(G_OBJECT(list3->data), "activate", G_CALLBACK(ags_menu_action_add_dssi_bridge_callback), (gpointer) menu_bar); list3 = list3->next; } g_list_free(list3_start); /* lv2 */ list3_start = list3 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); list2 = list2->next; while(list3 != NULL){ g_signal_connect(G_OBJECT(list3->data), "activate", G_CALLBACK(ags_menu_action_add_lv2_bridge_callback), (gpointer) menu_bar); list3 = list3->next; } g_list_free(list3_start); /* live! */ list3 = list3_start = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list2->data)); /* dssi */ list4_start = list4 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list3->data)); list3 = list3->next; while(list4 != NULL){ g_signal_connect(G_OBJECT(list4->data), "activate", G_CALLBACK(ags_menu_action_add_live_dssi_bridge_callback), (gpointer) menu_bar); list4 = list4->next; } g_list_free(list4_start); /* lv2 */ list4_start = list4 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list3->data)); // list3 = list3->next; while(list4 != NULL){ g_signal_connect(G_OBJECT(list4->data), "activate", G_CALLBACK(ags_menu_action_add_live_lv2_bridge_callback), (gpointer) menu_bar); list4 = list4->next; } g_list_free(list4_start); g_list_free(list3_start); g_list_free(list2_start); /* automation, wave and preferences */ g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_automation_callback), (gpointer) menu_bar); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_wave_callback), (gpointer) menu_bar); list1 = list1->next; list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_preferences_callback), (gpointer) menu_bar); g_list_free(list1_start); /* MIDI */ list0 = list0->next; list1_start = list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT(list1->data), "activate", G_CALLBACK(ags_menu_action_midi_import_callback), (gpointer) menu_bar); list1 = list1->next; g_signal_connect(G_OBJECT(list1->data), "activate", G_CALLBACK(ags_menu_action_midi_export_track_callback), (gpointer) menu_bar); list1 = list1->next; list1 = list1->next; g_signal_connect(G_OBJECT(list1->data), "activate", G_CALLBACK(ags_menu_action_midi_playback_callback), (gpointer) menu_bar); g_list_free(list1_start); /* Help */ list0 = list0->next; list1_start = list1 = gtk_container_get_children((GtkContainer *) gtk_menu_item_get_submenu((GtkMenuItem *) list0->data)); g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_online_help_callback), (gpointer) menu_bar); list1 = list1->next; g_signal_connect(G_OBJECT (list1->data), "activate", G_CALLBACK (ags_menu_action_about_callback), (gpointer) menu_bar); g_list_free(list1_start); g_list_free(list0_start); } void ags_menu_bar_disconnect(AgsConnectable *connectable) { AgsMenuBar *menu_bar; menu_bar = AGS_MENU_BAR(connectable); if((AGS_MENU_BAR_CONNECTED & (menu_bar->flags)) == 0){ return; } menu_bar->flags &= (~AGS_MENU_BAR_CONNECTED); /* empty */ } GtkMenu* ags_zoom_menu_new() { GtkMenu *menu; GtkMenuItem *item; GtkLabel *label; menu = (GtkMenu *) gtk_menu_new(); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("16:1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("8:1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("4:1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("2:1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1:1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1:2"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1:4"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1:8"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1:16"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); return(menu); } GtkMenu* ags_tact_menu_new() { GtkMenu *menu; GtkMenuItem *item; GtkLabel *label; menu = (GtkMenu *) gtk_menu_new(); //TODO:JK: uncomment me if tact implemented /* item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("16/1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("8/1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("4/1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("2/1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1:1"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1/2"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1/4"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1/8"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); item = (GtkMenuItem *) gtk_menu_item_new(); label = (GtkLabel *) gtk_label_new("1/16"); gtk_container_add((GtkContainer *) item, (GtkWidget *) label); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); */ return(menu); } /** * ags_zoom_combo_box_new: * * Creates an #GtkComboBox to select zoom. * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkComboBox* ags_zoom_combo_box_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); // gtk_combo_box_text_append_text(combo_box, // "16:1"); // gtk_combo_box_text_append_text(combo_box, // "8:1"); gtk_combo_box_text_append_text(combo_box, "4:1"); gtk_combo_box_text_append_text(combo_box, "2:1"); gtk_combo_box_text_append_text(combo_box, "1:1"); gtk_combo_box_text_append_text(combo_box, "1:2"); gtk_combo_box_text_append_text(combo_box, "1:4"); gtk_combo_box_text_append_text(combo_box, "1:8"); gtk_combo_box_text_append_text(combo_box, "1:16"); return((GtkComboBox *) combo_box); } /** * ags_zoom_combo_box_new: * * Creates an #GtkComboBox to select tact * * Returns: a new #GtkComboBox * * Since: 3.0.0 */ GtkComboBox* ags_tact_combo_box_new() { GtkComboBoxText *combo_box; combo_box = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(combo_box, "16/1"); gtk_combo_box_text_append_text(combo_box, "8/1"); gtk_combo_box_text_append_text(combo_box, "4/1"); gtk_combo_box_text_append_text(combo_box, "2/1"); gtk_combo_box_text_append_text(combo_box, "1/1"); gtk_combo_box_text_append_text(combo_box, "1/2"); gtk_combo_box_text_append_text(combo_box, "1/4"); gtk_combo_box_text_append_text(combo_box, "1/8"); gtk_combo_box_text_append_text(combo_box, "1/16"); return((GtkComboBox *) combo_box); } GtkMenu* ags_ladspa_bridge_menu_new() { GtkMenu *menu; GtkMenuItem *item; AgsLadspaManager *ladspa_manager; GList *list, *start_list; GRecMutex *ladspa_manager_mutex; menu = (GtkMenu *) gtk_menu_new(); ladspa_manager = ags_ladspa_manager_get_instance(); /* get ladspa manager mutex */ ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager); /* get plugin */ g_rec_mutex_lock(ladspa_manager_mutex); list = start_list = g_list_copy_deep(ladspa_manager->ladspa_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(ladspa_manager_mutex); start_list = ags_base_plugin_sort(start_list); g_list_free(list); list = start_list; while(list != NULL){ gchar *filename, *effect; /* get filename and effect */ g_object_get(list->data, "filename", &filename, "effect", &effect, NULL); /* create item */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect); g_object_set_data((GObject *) item, AGS_MENU_ITEM_FILENAME_KEY, filename); g_object_set_data((GObject *) item, AGS_MENU_ITEM_EFFECT_KEY, effect); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); list = list->next; } g_list_free_full(start_list, g_object_unref); return(menu); } GtkMenu* ags_dssi_bridge_menu_new() { GtkMenu *menu; GtkMenuItem *item; AgsDssiManager *dssi_manager; GList *list, *start_list; GRecMutex *dssi_manager_mutex; menu = (GtkMenu *) gtk_menu_new(); dssi_manager = ags_dssi_manager_get_instance(); /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* get plugin */ g_rec_mutex_lock(dssi_manager_mutex); list = start_list = g_list_copy_deep(dssi_manager->dssi_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(dssi_manager_mutex); start_list = ags_base_plugin_sort(start_list); g_list_free(list); list = start_list; while(list != NULL){ gchar *filename, *effect; /* get filename and effect */ g_object_get(list->data, "filename", &filename, "effect", &effect, NULL); /* create item */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect); g_object_set_data((GObject *) item, AGS_MENU_ITEM_FILENAME_KEY, filename); g_object_set_data((GObject *) item, AGS_MENU_ITEM_EFFECT_KEY, effect); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); list = list->next; } g_list_free_full(start_list, g_object_unref); return(menu); } GtkMenu* ags_lv2_bridge_menu_new() { GtkMenu *menu; GtkMenuItem *item; AgsLv2Manager *lv2_manager; GList *list, *start_list; GRecMutex *lv2_manager_mutex; menu = (GtkMenu *) gtk_menu_new(); lv2_manager = ags_lv2_manager_get_instance(); /* get lv2 manager mutex */ lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager); /* get plugin */ g_rec_mutex_lock(lv2_manager_mutex); list = start_list = g_list_copy_deep(lv2_manager->lv2_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(lv2_manager_mutex); start_list = ags_base_plugin_sort(start_list); g_list_free(list); list = start_list; while(list != NULL){ gchar *filename, *effect; /* get filename and effect */ g_object_get(list->data, "filename", &filename, "effect", &effect, NULL); /* create item */ if(filename != NULL && effect != NULL){ item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect); g_object_set_data((GObject *) item, AGS_MENU_ITEM_FILENAME_KEY, filename); g_object_set_data((GObject *) item, AGS_MENU_ITEM_EFFECT_KEY, effect); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); } list = list->next; } g_list_free(start_list); return(menu); } GtkMenu* ags_live_dssi_bridge_menu_new() { GtkMenu *menu; GtkMenuItem *item; AgsDssiManager *dssi_manager; GList *list, *start_list; GRecMutex *dssi_manager_mutex; menu = (GtkMenu *) gtk_menu_new(); dssi_manager = ags_dssi_manager_get_instance(); /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* get plugin */ g_rec_mutex_lock(dssi_manager_mutex); list = start_list = g_list_copy_deep(dssi_manager->dssi_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(dssi_manager_mutex); start_list = ags_base_plugin_sort(start_list); g_list_free(list); list = start_list; while(list != NULL){ gchar *filename, *effect; /* get filename and effect */ g_object_get(list->data, "filename", &filename, "effect", &effect, NULL); /* create item */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect); g_object_set_data((GObject *) item, AGS_MENU_ITEM_FILENAME_KEY, filename); g_object_set_data((GObject *) item, AGS_MENU_ITEM_EFFECT_KEY, effect); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); list = list->next; } g_list_free_full(start_list, g_object_unref); return(menu); } GtkMenu* ags_live_lv2_bridge_menu_new() { GtkMenu *menu; GtkMenuItem *item; AgsLv2Manager *lv2_manager; GList *list, *start_list; GRecMutex *lv2_manager_mutex; menu = (GtkMenu *) gtk_menu_new(); lv2_manager = ags_lv2_manager_get_instance(); /* get lv2 manager mutex */ lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager); /* get plugin */ g_rec_mutex_lock(lv2_manager_mutex); list = start_list = g_list_copy_deep(lv2_manager->lv2_plugin, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(lv2_manager_mutex); start_list = ags_base_plugin_sort(start_list); g_list_free(list); list = start_list; while(list != NULL){ if(ags_lv2_plugin_test_flags(list->data, AGS_LV2_PLUGIN_IS_SYNTHESIZER)){ gchar *filename, *effect; /* get filename and effect */ g_object_get(list->data, "filename", &filename, "effect", &effect, NULL); /* create item */ item = (GtkMenuItem *) gtk_menu_item_new_with_label(effect); g_object_set_data((GObject *) item, AGS_MENU_ITEM_FILENAME_KEY, filename); g_object_set_data((GObject *) item, AGS_MENU_ITEM_EFFECT_KEY, effect); gtk_menu_shell_append((GtkMenuShell *) menu, (GtkWidget *) item); } list = list->next; } return(menu); } /** * ags_menu_bar_new: * * Creates an #AgsMenuBar * * Returns: a new #AgsMenuBar * * Since: 3.0.0 */ AgsMenuBar* ags_menu_bar_new() { AgsMenuBar *menu_bar; menu_bar = (AgsMenuBar *) g_object_new(AGS_TYPE_MENU_BAR, NULL); return(menu_bar); } gsequencer-3.1.3/ags/X/ags_effect_bulk_callbacks.c0000644000175000017500000001022713607210263017031 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_effect_bulk_plugin_browser_response_create_entry(AgsEffectBulk *effect_bulk, gchar *filename, gchar *effect); void ags_effect_bulk_add_callback(GtkWidget *button, AgsEffectBulk *effect_bulk) { gtk_widget_show_all((GtkWidget *) effect_bulk->plugin_browser); } void ags_effect_bulk_remove_callback(GtkWidget *button, AgsEffectBulk *effect_bulk) { GList *start_bulk_member, *bulk_member; GList *children; guint nth; if(button == NULL || effect_bulk == NULL){ return; } bulk_member = start_bulk_member = gtk_container_get_children((GtkContainer *) effect_bulk->bulk_member); /* iterate bulk member */ for(nth = 0; bulk_member != NULL; nth++){ children = gtk_container_get_children(GTK_CONTAINER(bulk_member->data)); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(children->data))){ gtk_widget_destroy(GTK_WIDGET(bulk_member->data)); /* remove effect */ ags_effect_bulk_remove_effect(effect_bulk, nth); } g_list_free(children); bulk_member = bulk_member->next; } g_list_free(start_bulk_member); } void ags_effect_bulk_plugin_browser_response_create_entry(AgsEffectBulk *effect_bulk, gchar *filename, gchar *effect){ GtkHBox *hbox; GtkCheckButton *check_button; GtkLabel *label; gchar *str; /* create entry */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(effect_bulk->bulk_member), GTK_WIDGET(hbox), FALSE, FALSE, 0); check_button = (GtkCheckButton *) gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(check_button), FALSE, FALSE, 0); str = g_strdup_printf("%s - %s", filename, effect); label = (GtkLabel *) gtk_label_new(str); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); g_free(str); gtk_widget_show_all((GtkWidget *) hbox); } void ags_effect_bulk_plugin_browser_response_callback(GtkDialog *dialog, gint response, AgsEffectBulk *effect_bulk) { gchar *filename, *effect; switch(response){ case GTK_RESPONSE_ACCEPT: { /* retrieve plugin */ filename = ags_plugin_browser_get_plugin_filename((AgsPluginBrowser *) effect_bulk->plugin_browser); effect = ags_plugin_browser_get_plugin_effect((AgsPluginBrowser *) effect_bulk->plugin_browser); ags_effect_bulk_plugin_browser_response_create_entry(effect_bulk, filename, effect); /* add effect */ ags_effect_bulk_add_effect(effect_bulk, NULL, filename, effect); g_free(filename); g_free(effect); } break; } } void ags_effect_bulk_resize_audio_channels_callback(AgsMachine *machine, guint audio_channels, guint audio_channels_old, AgsEffectBulk *effect_bulk) { ags_effect_bulk_resize_audio_channels(effect_bulk, audio_channels, audio_channels_old); } void ags_effect_bulk_resize_pads_callback(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, AgsEffectBulk *effect_bulk) { if(channel_type == effect_bulk->channel_type){ ags_effect_bulk_resize_pads(effect_bulk, pads, pads_old); } } gsequencer-3.1.3/ags/X/ags_generic_preferences_callbacks.h0000644000175000017500000000260513607210263020563 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_GENERIC_PREFERENCES_CALLBACKS_H__ #define __AGS_GENERIC_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_generic_preferences_autosave_thread_clicked_callback(GtkWidget *check_button, AgsGenericPreferences *generic_preferences); void ags_generic_preferences_rt_safe_callback(GtkWidget *check_button, AgsGenericPreferences *generic_preferences); G_END_DECLS #endif /*__AGS_GENERIC_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_effect_line_callbacks.c0000644000175000017500000000171013607210263017020 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_effect_line_check_message_callback(GObject *application_context, AgsEffectLine *effect_line) { ags_effect_line_check_message(effect_line); } gsequencer-3.1.3/ags/X/ags_effect_bridge.c0000644000175000017500000010611113607210263015327 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_effect_bridge_class_init(AgsEffectBridgeClass *effect_bridge); void ags_effect_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_effect_bridge_init(AgsEffectBridge *effect_bridge); void ags_effect_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_effect_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_effect_bridge_connect(AgsConnectable *connectable); void ags_effect_bridge_disconnect(AgsConnectable *connectable); void ags_effect_bridge_real_resize_audio_channels(AgsEffectBridge *effect_bridge, guint new_size, guint old_size); void ags_effect_bridge_real_resize_pads(AgsEffectBridge *effect_bridge, GType channel_type, guint new_size, guint old_size); void ags_effect_bridge_real_map_recall(AgsEffectBridge *effect_bridge); GList* ags_effect_bridge_real_find_port(AgsEffectBridge *effect_bridge); /** * SECTION:ags_effect_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsEffectBridge * @section_id: * @include: ags/X/ags_effect_bridge.h * * #AgsEffectBridge is a composite widget containing #AgsEffectBulk or #AgsEffectPad. It should be * packed by an #AgsMachine. */ enum{ SAMPLERATE_CHANGED, BUFFER_SIZE_CHANGED, FORMAT_CHANGED, RESIZE_AUDIO_CHANNELS, RESIZE_PADS, MAP_RECALL, FIND_PORT, LAST_SIGNAL, }; enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_AUDIO, }; static gpointer ags_effect_bridge_parent_class = NULL; static guint effect_bridge_signals[LAST_SIGNAL]; GType ags_effect_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_effect_bridge = 0; static const GTypeInfo ags_effect_bridge_info = { sizeof(AgsEffectBridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_effect_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEffectBridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_effect_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_effect_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_effect_bridge = g_type_register_static(GTK_TYPE_VBOX, "AgsEffectBridge", &ags_effect_bridge_info, 0); g_type_add_interface_static(ags_type_effect_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_effect_bridge); } return g_define_type_id__volatile; } void ags_effect_bridge_class_init(AgsEffectBridgeClass *effect_bridge) { GObjectClass *gobject; GParamSpec *param_spec; ags_effect_bridge_parent_class = g_type_class_peek_parent(effect_bridge); /* GObjectClass */ gobject = (GObjectClass *) effect_bridge; gobject->set_property = ags_effect_bridge_set_property; gobject->get_property = ags_effect_bridge_get_property; /* properties */ /** * AgsEffectBridge:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsEffectBridge:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsEffectBridge:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsEffectBridge:audio: * * The start of a bunch of #AgsAudio to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio it is assigned with"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /* AgsEffectBridgeClass */ effect_bridge->samplerate_changed = NULL; effect_bridge->buffer_size_changed = NULL; effect_bridge->format_changed = NULL; effect_bridge->resize_pads = ags_effect_bridge_real_resize_pads; effect_bridge->resize_audio_channels = ags_effect_bridge_real_resize_audio_channels; effect_bridge->map_recall = ags_effect_bridge_real_map_recall; effect_bridge->find_port = ags_effect_bridge_real_find_port; /* signals */ /** * AgsEffectBridge::samplerate-changed: * @effect_bridge: the #AgsEffectBridge * @samplerate: the samplerate * @old_samplerate: the old samplerate * * The ::samplerate-changed signal notifies about changed samplerate. * * Since: 3.0.0 */ effect_bridge_signals[SAMPLERATE_CHANGED] = g_signal_new("samplerate-changed", G_TYPE_FROM_CLASS(effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBridgeClass, samplerate_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBridge::buffer-size-changed: * @effect_bridge: the #AgsEffectBridge * @buffer_size: the buffer size * @old_buffer_size: the old buffer size * * The ::buffer-size-changed signal notifies about changed buffer size. * * Since: 3.0.0 */ effect_bridge_signals[BUFFER_SIZE_CHANGED] = g_signal_new("buffer-size-changed", G_TYPE_FROM_CLASS(effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBridgeClass, buffer_size_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBridge::format-changed: * @effect_bridge: the #AgsEffectBridge * @format: the format * @old_format: the old format * * The ::format-changed signal notifies about changed format. * * Since: 3.0.0 */ effect_bridge_signals[FORMAT_CHANGED] = g_signal_new("format-changed", G_TYPE_FROM_CLASS(effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBridgeClass, format_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBridge::resize-audio-channels: * @effect_bridge: the #AgsEffectBridge to modify * @channel: the #AgsChannel to set * @new_size: the new size * @old_size: the old size * * The ::resize-audio-channels signal notifies about changed channel allocation within * audio. * * Since: 3.0.0 */ effect_bridge_signals[RESIZE_AUDIO_CHANNELS] = g_signal_new("resize-audio-channels", G_TYPE_FROM_CLASS(effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBridgeClass, resize_audio_channels), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBridge::resize-pads: * @effect_bridge: the #AgsEffectBridge to modify * @channel: the #AgsChannel to set * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * @new_size: the new size * @old_size: the old size * * The ::resize-pads signal notifies about changed channel allocation within * audio. * * Since: 3.0.0 */ effect_bridge_signals[RESIZE_PADS] = g_signal_new("resize-pads", G_TYPE_FROM_CLASS(effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBridgeClass, resize_pads), NULL, NULL, ags_cclosure_marshal_VOID__ULONG_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_ULONG, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBridge::map-recall: * @effect_bridge: the #AgsEffectBridge * * The ::map-recall should be used to add the effect_bridge's default recall. * * Since: 3.0.0 */ effect_bridge_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS (effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsEffectBridgeClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 0); /** * AgsEffectBridge::find-port: * @effect_bridge: the #AgsEffectBridge to resize * Returns: a #GList with associated ports * * The ::find-port as recall should be mapped * * Since: 3.0.0 */ effect_bridge_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(effect_bridge), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBridgeClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); } void ags_effect_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_effect_bridge_connect; connectable->disconnect = ags_effect_bridge_disconnect; } void ags_effect_bridge_init(AgsEffectBridge *effect_bridge) { effect_bridge->flags = 0; effect_bridge->name = NULL; effect_bridge->version = AGS_EFFECT_BRIDGE_DEFAULT_VERSION; effect_bridge->build_id = AGS_EFFECT_BRIDGE_DEFAULT_BUILD_ID; effect_bridge->audio = NULL; /* output */ effect_bridge->output_pad_type = G_TYPE_NONE; effect_bridge->output_line_type = G_TYPE_NONE; effect_bridge->bulk_output_type = G_TYPE_NONE; effect_bridge->bulk_output = NULL; effect_bridge->output = NULL; /* input */ effect_bridge->input_pad_type = G_TYPE_NONE; effect_bridge->input_line_type = G_TYPE_NONE; effect_bridge->bulk_input_type = G_TYPE_NONE; effect_bridge->bulk_input = NULL; effect_bridge->input = NULL; } void ags_effect_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEffectBridge *effect_bridge; effect_bridge = AGS_EFFECT_BRIDGE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { GList *start_list, *list; guint samplerate, old_samplerate; samplerate = g_value_get_uint(value); old_samplerate = effect_bridge->samplerate; if(samplerate == old_samplerate){ return; } effect_bridge->samplerate = samplerate; ags_effect_bridge_samplerate_changed(effect_bridge, samplerate, old_samplerate); if(effect_bridge->output != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bridge->output)); while(list != NULL){ if(AGS_IS_EFFECT_PAD(list->data)){ g_object_set(list->data, "samplerate", samplerate, NULL); } list = list->next; } g_list_free(start_list); } if(effect_bridge->input != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bridge->input)); while(list != NULL){ if(AGS_IS_EFFECT_PAD(list->data)){ g_object_set(list->data, "samplerate", samplerate, NULL); } list = list->next; } g_list_free(start_list); } } break; case PROP_BUFFER_SIZE: { GList *start_list, *list; guint buffer_size, old_buffer_size; buffer_size = g_value_get_uint(value); old_buffer_size = effect_bridge->buffer_size; if(buffer_size == old_buffer_size){ return; } effect_bridge->buffer_size = buffer_size; ags_effect_bridge_buffer_size_changed(effect_bridge, buffer_size, old_buffer_size); if(effect_bridge->output != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bridge->output)); while(list != NULL){ if(AGS_IS_EFFECT_PAD(list->data)){ g_object_set(list->data, "buffer-size", buffer_size, NULL); } list = list->next; } g_list_free(start_list); } if(effect_bridge->input != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bridge->input)); while(list != NULL){ if(AGS_IS_EFFECT_PAD(list->data)){ g_object_set(list->data, "buffer-size", buffer_size, NULL); } list = list->next; } g_list_free(start_list); } } break; case PROP_FORMAT: { GList *start_list, *list; guint format, old_format; format = g_value_get_uint(value); old_format = effect_bridge->format; if(format == old_format){ return; } effect_bridge->format = format; ags_effect_bridge_format_changed(effect_bridge, format, old_format); if(effect_bridge->output != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bridge->output)); while(list != NULL){ if(AGS_IS_EFFECT_PAD(list->data)){ g_object_set(list->data, "format", format, NULL); } list = list->next; } g_list_free(start_list); } if(effect_bridge->input != NULL){ list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bridge->input)); while(list != NULL){ if(AGS_IS_EFFECT_PAD(list->data)){ g_object_set(list->data, "format", format, NULL); } list = list->next; } g_list_free(start_list); } } break; case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(effect_bridge->audio == audio){ return; } if(effect_bridge->audio != NULL){ GList *effect_pad; g_object_unref(effect_bridge->audio); if(audio == NULL){ /* destroy pad */ effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->output); while(effect_pad != NULL){ gtk_widget_destroy(effect_pad->data); effect_pad = effect_pad->next; } effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->input); while(effect_pad != NULL){ gtk_widget_destroy(GTK_WIDGET(effect_pad->data)); effect_pad = effect_pad->next; } } } if(audio != NULL){ AgsChannel *input, *output; GList *start_effect_pad, *effect_pad; GList *start_effect_line, *effect_line; guint audio_channels; guint output_pads, input_pads; guint i; g_object_ref(audio); g_object_get(audio, "output", &output, "input", &input, "audio-channels", &audio_channels, "output-pads", &output_pads, "input-pads", &input_pads, NULL); effect_bridge->samplerate = audio->samplerate; effect_bridge->buffer_size = audio->buffer_size; effect_bridge->format = audio->format; if(output != NULL){ g_object_unref(output); } if(input != NULL){ g_object_unref(input); } /* set channel and resize for AgsOutput */ if(effect_bridge->output_pad_type != G_TYPE_NONE){ effect_pad = start_effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->output); /* reset */ i = 0; while(effect_pad != NULL && output != NULL){ effect_line = start_effect_line = gtk_container_get_children((GtkContainer *) AGS_EFFECT_PAD(effect_pad->data)->table); ags_effect_pad_resize_lines(AGS_EFFECT_PAD(effect_pad->data), effect_bridge->output_line_type, audio_channels, g_list_length(effect_line)); g_object_set(G_OBJECT(effect_pad->data), "channel", output, NULL); g_list_free(start_effect_line); /* iterate */ g_object_get(output, "next-pad", &output, NULL); if(output != NULL){ g_object_unref(output); } effect_pad = effect_pad->next; i++; } if(output != NULL){ AgsEffectPad *effect_pad; /* add effect pad */ for(; i < output_pads; i++){ effect_pad = g_object_new(effect_bridge->output_pad_type, "channel", output, NULL); gtk_container_add((GtkContainer *) effect_bridge->output, GTK_WIDGET(effect_pad)); ags_effect_pad_resize_lines(effect_pad, effect_bridge->output_line_type, audio_channels, 0); /* iterate */ g_object_get(output, "next-pad", &output, NULL); if(output != NULL){ g_object_unref(output); } } g_list_free(start_effect_pad); }else{ /* destroy effect pad */ effect_pad = start_effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->output); effect_pad = g_list_nth(effect_pad, output_pads); while(effect_pad != NULL){ gtk_widget_destroy(effect_pad->data); effect_pad = effect_pad->next; } g_list_free(start_effect_pad); } } /* set channel and resize for AgsInput */ if(effect_bridge->input_pad_type != G_TYPE_NONE){ effect_pad = start_effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->input); i = 0; while(effect_pad != NULL && input != NULL){ effect_line = start_effect_line = gtk_container_get_children((GtkContainer *) AGS_EFFECT_PAD(effect_pad->data)->table); ags_effect_pad_resize_lines(AGS_EFFECT_PAD(effect_pad->data), effect_bridge->input_line_type, audio_channels, g_list_length(effect_line)); g_object_set(G_OBJECT(effect_pad->data), "channel", input, NULL); g_list_free(start_effect_line); /* iterate */ g_object_get(input, "next-pad", &input, NULL); if(input != NULL){ g_object_unref(input); } effect_pad = effect_pad->next; i++; } if(input != NULL){ AgsEffectPad *effect_pad; /* add effect pad */ for(; i < input_pads; i++){ effect_pad = g_object_new(effect_bridge->input_pad_type, "channel", input, NULL); gtk_container_add((GtkContainer *) effect_bridge->input, GTK_WIDGET(effect_pad)); ags_effect_pad_resize_lines(effect_pad, effect_bridge->input_line_type, audio_channels, 0); /* iterate */ g_object_get(input, "next-pad", &input, NULL); if(input != NULL){ g_object_unref(input); } } g_list_free(start_effect_pad); }else{ /* destroy effect pad */ effect_pad = start_effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->input); effect_pad = g_list_nth(effect_pad, input_pads); while(effect_pad != NULL){ gtk_widget_destroy(effect_pad->data); effect_pad = effect_pad->next; } g_list_free(start_effect_pad); } } } effect_bridge->audio = audio; if(effect_bridge->bulk_output != NULL){ g_object_set(effect_bridge->bulk_output, "audio", audio, NULL); } if(effect_bridge->bulk_input != NULL){ g_object_set(effect_bridge->bulk_input, "audio", audio, NULL); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEffectBridge *effect_bridge; effect_bridge = AGS_EFFECT_BRIDGE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, effect_bridge->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, effect_bridge->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, effect_bridge->format); } break; case PROP_AUDIO: { g_value_set_object(value, effect_bridge->audio); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_bridge_connect(AgsConnectable *connectable) { AgsMachine *machine; AgsEffectBridge *effect_bridge; GList *effect_pad_list, *effect_pad_list_start; effect_bridge = AGS_EFFECT_BRIDGE(connectable); if((AGS_EFFECT_BRIDGE_CONNECTED & (effect_bridge->flags)) != 0){ return; } effect_bridge->flags |= AGS_EFFECT_BRIDGE_CONNECTED; machine = (AgsMachine *) gtk_widget_get_ancestor(GTK_WIDGET(effect_bridge), AGS_TYPE_MACHINE); g_signal_connect_after(machine, "resize-audio-channels", G_CALLBACK(ags_effect_bridge_resize_audio_channels_callback), effect_bridge); g_signal_connect_after(machine, "resize-pads", G_CALLBACK(ags_effect_bridge_resize_pads_callback), effect_bridge); /* AgsEffectBulk - input */ if(effect_bridge->bulk_input != NULL){ ags_connectable_connect(AGS_CONNECTABLE(effect_bridge->bulk_input)); } /* AgsEffectBulk - output */ if(effect_bridge->bulk_output != NULL){ ags_connectable_connect(AGS_CONNECTABLE(effect_bridge->bulk_output)); } /* AgsEffectPad - input */ if(effect_bridge->input != NULL){ effect_pad_list_start = effect_pad_list = gtk_container_get_children((GtkContainer *) effect_bridge->input); while(effect_pad_list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(effect_pad_list->data)); effect_pad_list = effect_pad_list->next; } g_list_free(effect_pad_list_start); } /* AgsEffectPad - output */ if(effect_bridge->output != NULL){ effect_pad_list_start = effect_pad_list = gtk_container_get_children((GtkContainer *) effect_bridge->output); while(effect_pad_list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(effect_pad_list->data)); effect_pad_list = effect_pad_list->next; } g_list_free(effect_pad_list_start); } } void ags_effect_bridge_disconnect(AgsConnectable *connectable) { AgsMachine *machine; AgsEffectBridge *effect_bridge; GList *effect_pad_list, *effect_pad_list_start; effect_bridge = AGS_EFFECT_BRIDGE(connectable); if((AGS_EFFECT_BRIDGE_CONNECTED & (effect_bridge->flags)) == 0){ return; } effect_bridge->flags &= (~AGS_EFFECT_BRIDGE_CONNECTED); machine = (AgsMachine *) gtk_widget_get_ancestor(GTK_WIDGET(effect_bridge), AGS_TYPE_MACHINE); g_object_disconnect(G_OBJECT(machine), "any_signal::resize-audio-channels", G_CALLBACK(ags_effect_bridge_resize_audio_channels_callback), effect_bridge, "any_signal::resize-pads", G_CALLBACK(ags_effect_bridge_resize_pads_callback), effect_bridge, NULL); /* AgsEffectBulk - input */ if(effect_bridge->bulk_input != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(effect_bridge->bulk_input)); } /* AgsEffectBulk - output */ if(effect_bridge->bulk_output != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(effect_bridge->bulk_output)); } /* AgsEffectPad - input */ if(effect_bridge->input != NULL){ effect_pad_list_start = effect_pad_list = gtk_container_get_children((GtkContainer *) effect_bridge->input); while(effect_pad_list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(effect_pad_list->data)); effect_pad_list = effect_pad_list->next; } g_list_free(effect_pad_list_start); } /* AgsEffectPad - output */ if(effect_bridge->output != NULL){ effect_pad_list_start = effect_pad_list = gtk_container_get_children((GtkContainer *) effect_bridge->output); while(effect_pad_list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(effect_pad_list->data)); effect_pad_list = effect_pad_list->next; } g_list_free(effect_pad_list_start); } } /** * ags_effect_bridge_samplerate_changed: * @effect_bridge: the #AgsEffectBridge * @samplerate: the samplerate * @old_samplerate: the old samplerate * * Notify about samplerate changed. * * Since: 3.0.0 */ void ags_effect_bridge_samplerate_changed(AgsEffectBridge *effect_bridge, guint samplerate, guint old_samplerate) { g_return_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge)); g_object_ref((GObject *) effect_bridge); g_signal_emit(G_OBJECT(effect_bridge), effect_bridge_signals[SAMPLERATE_CHANGED], 0, samplerate, old_samplerate); g_object_unref((GObject *) effect_bridge); } /** * ags_effect_bridge_buffer_size_changed: * @effect_bridge: the #AgsEffectBridge * @buffer_size: the buffer_size * @old_buffer_size: the old buffer_size * * Notify about buffer_size changed. * * Since: 3.0.0 */ void ags_effect_bridge_buffer_size_changed(AgsEffectBridge *effect_bridge, guint buffer_size, guint old_buffer_size) { g_return_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge)); g_object_ref((GObject *) effect_bridge); g_signal_emit(G_OBJECT(effect_bridge), effect_bridge_signals[BUFFER_SIZE_CHANGED], 0, buffer_size, old_buffer_size); g_object_unref((GObject *) effect_bridge); } /** * ags_effect_bridge_format_changed: * @effect_bridge: the #AgsEffectBridge * @format: the format * @old_format: the old format * * Notify about format changed. * * Since: 3.0.0 */ void ags_effect_bridge_format_changed(AgsEffectBridge *effect_bridge, guint format, guint old_format) { g_return_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge)); g_object_ref((GObject *) effect_bridge); g_signal_emit(G_OBJECT(effect_bridge), effect_bridge_signals[FORMAT_CHANGED], 0, format, old_format); g_object_unref((GObject *) effect_bridge); } void ags_effect_bridge_real_resize_audio_channels(AgsEffectBridge *effect_bridge, guint new_size, guint old_size) { GtkTable *table; AgsAudio *audio; AgsChannel *start, *current; GList *start_list, *list; audio = effect_bridge->audio; if(audio == NULL || new_size == old_size){ return; } /* output */ if(effect_bridge->output != NULL){ list = start_list = gtk_container_get_children((GtkContainer *) effect_bridge->output); while(list != NULL){ ags_effect_pad_resize_lines(AGS_EFFECT_PAD(list->data), effect_bridge->output_line_type, new_size, old_size); list = list->next; } g_list_free(start_list); } /* input */ if(effect_bridge->input != NULL){ list = start_list = gtk_container_get_children((GtkContainer *) effect_bridge->input); while(list != NULL){ ags_effect_pad_resize_lines(AGS_EFFECT_PAD(list->data), effect_bridge->input_line_type, new_size, old_size); list = list->next; } g_list_free(start_list); } } /** * ags_effect_bridge_resize_audio_channels: * @effect_bridge: the #AgsEffectBridge * @new_size: new allocation * @old_size: old allocation * * Resize audio channel allocation. * * Since: 3.0.0 */ void ags_effect_bridge_resize_audio_channels(AgsEffectBridge *effect_bridge, guint new_size, guint old_size) { g_return_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge)); g_object_ref((GObject *) effect_bridge); g_signal_emit(G_OBJECT(effect_bridge), effect_bridge_signals[RESIZE_AUDIO_CHANNELS], 0, new_size, old_size); g_object_unref((GObject *) effect_bridge); } void ags_effect_bridge_real_resize_pads(AgsEffectBridge *effect_bridge, GType channel_type, guint new_size, guint old_size) { AgsEffectPad *effect_pad; GtkTable *table; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *current, *next_pad, *nth_current; guint audio_channels; guint i; audio = effect_bridge->audio; if(audio == NULL){ return; } g_object_get(audio, "audio-channels", &audio_channels, "output", &start_output, "input", &start_input, NULL); if(new_size > old_size){ if(channel_type == AGS_TYPE_OUTPUT){ nth_current = ags_channel_nth(start_output, old_size * audio_channels); }else{ nth_current = ags_channel_nth(start_input, old_size * audio_channels); } current = nth_current; next_pad = NULL; for(i = 0; i < new_size - old_size && current != NULL; i++){ if(channel_type == AGS_TYPE_OUTPUT){ if(effect_bridge->output_pad_type != G_TYPE_NONE){ effect_pad = g_object_new(effect_bridge->output_pad_type, "channel", current, NULL); ags_effect_pad_resize_lines(effect_pad, effect_bridge->output_line_type, audio->audio_channels, 0); gtk_container_add((GtkContainer *) effect_bridge->output, GTK_WIDGET(effect_pad)); } }else{ if(effect_bridge->input_pad_type != G_TYPE_NONE){ effect_pad = g_object_new(effect_bridge->input_pad_type, "channel", current, NULL); ags_effect_pad_resize_lines(effect_pad, effect_bridge->input_line_type, audio->audio_channels, 0); gtk_container_add((GtkContainer *) effect_bridge->input, GTK_WIDGET(effect_pad)); } } /* iterate */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } /* connect and show */ if((AGS_EFFECT_BRIDGE_CONNECTED & (effect_bridge->flags)) != 0){ GtkContainer *container; GList *start_list, *list; container = (GtkContainer *) ((channel_type == AGS_TYPE_OUTPUT) ? effect_bridge->output: effect_bridge->input); if(container != NULL){ start_list = gtk_container_get_children(container); list = g_list_nth(start_list, old_size); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); gtk_widget_show_all(list->data); list = list->next; } g_list_free(start_list); } } }else{ GList *start_list, *list; list = start_list = NULL; if(channel_type == AGS_TYPE_OUTPUT){ if(effect_bridge->output != NULL){ start_list = gtk_container_get_children((GtkContainer *) effect_bridge->output); list = g_list_nth(start_list, new_size); } }else{ if(effect_bridge->input != NULL){ start_list = gtk_container_get_children((GtkContainer *) effect_bridge->input); list = g_list_nth(start_list, new_size); } } for(i = 0; list != NULL && i < new_size - old_size; i++){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(start_list); } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } /** * ags_effect_bridge_resize_pads: * @effect_bridge: the #AgsEffectBridge * @channel_type: the channel #GType * @new_size: new allocation * @old_size: old allocation * * Resize pad allocation. * * Since: 3.0.0 */ void ags_effect_bridge_resize_pads(AgsEffectBridge *effect_bridge, GType channel_type, guint new_size, guint old_size) { g_return_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge)); g_object_ref((GObject *) effect_bridge); g_signal_emit(G_OBJECT(effect_bridge), effect_bridge_signals[RESIZE_PADS], 0, channel_type, new_size, old_size); g_object_unref((GObject *) effect_bridge); } void ags_effect_bridge_real_map_recall(AgsEffectBridge *effect_bridge) { if((AGS_EFFECT_BRIDGE_MAPPED_RECALL & (effect_bridge->flags)) != 0){ return; } effect_bridge->flags |= AGS_EFFECT_BRIDGE_MAPPED_RECALL; ags_effect_bridge_find_port(effect_bridge); } /** * ags_effect_bridge_map_recall: * @effect_bridge: the #AgsEffectBridge to add its default recall. * * You may want the @effect_bridge to add its default recall. * * Since: 3.0.0 */ void ags_effect_bridge_map_recall(AgsEffectBridge *effect_bridge) { g_return_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge)); g_object_ref((GObject *) effect_bridge); g_signal_emit((GObject *) effect_bridge, effect_bridge_signals[MAP_RECALL], 0); g_object_unref((GObject *) effect_bridge); } GList* ags_effect_bridge_real_find_port(AgsEffectBridge *effect_bridge) { GList *bulk; GList *effect_pad, *effect_pad_start; GList *port, *tmp_port; port = NULL; /* find output ports */ if(effect_bridge->output != NULL){ effect_pad_start = effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->output); while(effect_pad != NULL){ tmp_port = ags_effect_pad_find_port(AGS_EFFECT_PAD(effect_pad->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } effect_pad = effect_pad->next; } g_list_free(effect_pad_start); } /* find input ports */ if(effect_bridge->input != NULL){ effect_pad_start = effect_pad = gtk_container_get_children((GtkContainer *) effect_bridge->input); while(effect_pad != NULL){ tmp_port = ags_effect_pad_find_port(AGS_EFFECT_PAD(effect_pad->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } effect_pad = effect_pad->next; } g_list_free(effect_pad_start); } /* find output bulk ports */ if(effect_bridge->bulk_output != NULL){ tmp_port = ags_effect_bulk_find_port((AgsEffectBulk *) effect_bridge->bulk_output); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } } /* find input bulk ports */ if(effect_bridge->bulk_output != NULL){ tmp_port = ags_effect_bulk_find_port((AgsEffectBulk *) effect_bridge->bulk_output); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } } return(port); } /** * ags_effect_bridge_find_port: * @effect_bridge: the #AgsEffectBridge * Returns: an #GList containing all related #AgsPort * * Lookup ports of associated recalls. * * Since: 3.0.0 */ GList* ags_effect_bridge_find_port(AgsEffectBridge *effect_bridge) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_EFFECT_BRIDGE(effect_bridge), NULL); g_object_ref((GObject *) effect_bridge); g_signal_emit((GObject *) effect_bridge, effect_bridge_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) effect_bridge); return(list); } /** * ags_effect_bridge_new: * @audio: the #AgsAudio to visualize * * Creates an #AgsEffectBridge * * Returns: a new #AgsEffectBridge * * Since: 3.0.0 */ AgsEffectBridge* ags_effect_bridge_new(AgsAudio *audio) { AgsEffectBridge *effect_bridge; effect_bridge = (AgsEffectBridge *) g_object_new(AGS_TYPE_EFFECT_BRIDGE, "audio", audio, NULL); return(effect_bridge); } gsequencer-3.1.3/ags/X/ags_effect_bulk.c0000644000175000017500000025203013616617253015044 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_effect_bulk_class_init(AgsEffectBulkClass *effect_bulk); void ags_effect_bulk_connectable_interface_init(AgsConnectableInterface *connectable); void ags_effect_bulk_init(AgsEffectBulk *effect_bulk); void ags_effect_bulk_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_effect_bulk_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_effect_bulk_dispose(GObject *gobject); void ags_effect_bulk_finalize(GObject *gobject); void ags_effect_bulk_connect(AgsConnectable *connectable); void ags_effect_bulk_disconnect(AgsConnectable *connectable); void ags_effect_bulk_show(GtkWidget *widget); GList* ags_effect_bulk_add_ladspa_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_effect_bulk_add_dssi_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_effect_bulk_add_lv2_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_effect_bulk_real_add_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect); void ags_effect_bulk_real_remove_effect(AgsEffectBulk *effect_bulk, guint nth); void ags_effect_bulk_real_resize_audio_channels(AgsEffectBulk *effect_bulk, guint new_size, guint old_size); void ags_effect_bulk_real_resize_pads(AgsEffectBulk *effect_bulk, guint new_size, guint old_size); void ags_effect_bulk_real_map_recall(AgsEffectBulk *effect_bulk); GList* ags_effect_bulk_real_find_port(AgsEffectBulk *effect_bulk); /** * SECTION:ags_effect_bulk * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsEffectBulk * @section_id: * @include: ags/X/ags_effect_bulk.h * * #AgsEffectBulk is a composite widget to visualize one #AgsChannel. It should be * packed by an #AgsEffectBulk. */ enum{ ADD_EFFECT, REMOVE_EFFECT, RESIZE_AUDIO_CHANNELS, RESIZE_PADS, MAP_RECALL, FIND_PORT, LAST_SIGNAL, }; enum{ PROP_0, PROP_AUDIO, PROP_CHANNEL_TYPE, }; static gpointer ags_effect_bulk_parent_class = NULL; static guint effect_bulk_signals[LAST_SIGNAL]; GHashTable *ags_effect_bulk_indicator_queue_draw = NULL; GType ags_effect_bulk_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_effect_bulk = 0; static const GTypeInfo ags_effect_bulk_info = { sizeof(AgsEffectBulkClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_effect_bulk_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEffectBulk), 0, /* n_preallocs */ (GInstanceInitFunc) ags_effect_bulk_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_effect_bulk_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_effect_bulk = g_type_register_static(GTK_TYPE_VBOX, "AgsEffectBulk", &ags_effect_bulk_info, 0); g_type_add_interface_static(ags_type_effect_bulk, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_effect_bulk); } return g_define_type_id__volatile; } void ags_effect_bulk_class_init(AgsEffectBulkClass *effect_bulk) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_effect_bulk_parent_class = g_type_class_peek_parent(effect_bulk); /* GObjectClass */ gobject = G_OBJECT_CLASS(effect_bulk); gobject->set_property = ags_effect_bulk_set_property; gobject->get_property = ags_effect_bulk_get_property; gobject->dispose = ags_effect_bulk_dispose; gobject->finalize = ags_effect_bulk_finalize; /* properties */ /** * AgsEffectBulk:audio: * * The #AgsAudio to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio it is assigned with"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsEffectBulk:channel-type: * * The target channel. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("channel-type", i18n_pspec("assigned channel type"), i18n_pspec("The channel type it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL_TYPE, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) effect_bulk; widget->show = ags_effect_bulk_show; /* AgsEffectBulkClass */ effect_bulk->add_effect = ags_effect_bulk_real_add_effect; effect_bulk->remove_effect = ags_effect_bulk_real_remove_effect; effect_bulk->resize_audio_channels = ags_effect_bulk_real_resize_audio_channels; effect_bulk->resize_pads = ags_effect_bulk_real_resize_pads; effect_bulk->map_recall = ags_effect_bulk_real_map_recall; effect_bulk->find_port = ags_effect_bulk_real_find_port; /* signals */ /** * AgsEffectBulk::add-effect: * @effect_bulk: the #AgsEffectBulk to modify * @effect: the effect's name * * The ::add-effect signal notifies about added effect. * * Since: 3.0.0 */ effect_bulk_signals[ADD_EFFECT] = g_signal_new("add-effect", G_TYPE_FROM_CLASS(effect_bulk), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBulkClass, add_effect), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER_STRING_STRING, G_TYPE_POINTER, 3, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING); /** * AgsEffectBulk::remove-effect: * @effect_bulk: the #AgsEffectBulk to modify * @nth: the nth effect * * The ::remove-effect signal notifies about removed effect. * * Since: 3.0.0 */ effect_bulk_signals[REMOVE_EFFECT] = g_signal_new("remove-effect", G_TYPE_FROM_CLASS(effect_bulk), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBulkClass, remove_effect), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsEffectBulk::resize-audio-channels: * @effect_bulk: the object to adjust the channels. * @new_size: new audio channel count * @old_size: old audio channel count * * The ::resize-audio-channels signal notifies about changes in channel * alignment. * * Since: 3.0.0 */ effect_bulk_signals[RESIZE_AUDIO_CHANNELS] = g_signal_new("resize-audio-channels", G_TYPE_FROM_CLASS(effect_bulk), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBulkClass, resize_audio_channels), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBulk::resize-pads: * @effect_bulk: the object to adjust the channels. * @new_size: new pad count * @old_size: old pad count * * The ::resize-pads signal notifies about changes in channel * alignment. * * Since: 3.0.0 */ effect_bulk_signals[RESIZE_PADS] = g_signal_new("resize_pads", G_TYPE_FROM_CLASS(effect_bulk), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBulkClass, resize_pads), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsEffectBulk::map-recall: * @effect_bulk: the #AgsEffectBulk * * The ::map-recall should be used to add the effect_bulk's default recall. * * Since: 3.0.0 */ effect_bulk_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS (effect_bulk), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsEffectBulkClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 0); /** * AgsEffectBulk::find-port: * @effect_bulk: the #AgsEffectBulk to resize * * The ::find-port as recall should be mapped * * Returns: a #GList-struct with associated ports * * Since: 3.0.0 */ effect_bulk_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(effect_bulk), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsEffectBulkClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); } void ags_effect_bulk_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_effect_bulk_connect; connectable->disconnect = ags_effect_bulk_disconnect; } void ags_effect_bulk_init(AgsEffectBulk *effect_bulk) { GtkAlignment *alignment; GtkHBox *hbox; if(ags_effect_bulk_indicator_queue_draw == NULL){ ags_effect_bulk_indicator_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } effect_bulk->flags = 0; effect_bulk->name = NULL; effect_bulk->version = AGS_EFFECT_BULK_DEFAULT_VERSION; effect_bulk->build_id = AGS_EFFECT_BULK_DEFAULT_BUILD_ID; effect_bulk->channel_type = G_TYPE_NONE; effect_bulk->audio = NULL; effect_bulk->plugin = NULL; alignment = (GtkAlignment *) g_object_new(GTK_TYPE_ALIGNMENT, "xalign", 1.0, NULL); gtk_box_pack_start((GtkBox *) effect_bulk, (GtkWidget *) alignment, FALSE, FALSE, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_widget_set_no_show_all((GtkWidget *) hbox, TRUE); gtk_container_add((GtkContainer *) alignment, (GtkWidget *) hbox); effect_bulk->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) effect_bulk->add, FALSE, FALSE, 0); gtk_widget_show((GtkWidget *) effect_bulk->add); effect_bulk->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) effect_bulk->remove, FALSE, FALSE, 0); gtk_widget_show((GtkWidget *) effect_bulk->remove); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) effect_bulk, (GtkWidget *) hbox, FALSE, FALSE, 0); effect_bulk->bulk_member = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_widget_set_no_show_all((GtkWidget *) effect_bulk->bulk_member, TRUE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) effect_bulk->bulk_member, FALSE, FALSE, 0); effect_bulk->table = (GtkTable *) gtk_table_new(1, AGS_EFFECT_BULK_COLUMNS_COUNT, FALSE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) effect_bulk->table, FALSE, FALSE, 0); effect_bulk->plugin_browser = (GtkDialog *) ags_plugin_browser_new((GtkWidget *) effect_bulk); effect_bulk->queued_drawing = NULL; } void ags_effect_bulk_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEffectBulk *effect_bulk; effect_bulk = AGS_EFFECT_BULK(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; guint output_pads, input_pads; audio = (AgsAudio *) g_value_get_object(value); if(effect_bulk->audio == audio){ return; } if(effect_bulk->audio != NULL){ if((AGS_EFFECT_BULK_CONNECTED & (effect_bulk->flags)) != 0){ //TODO:JK: implement me } if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output-pads", &output_pads, NULL); ags_effect_bulk_resize_pads(effect_bulk, 0, output_pads); }else{ g_object_get(effect_bulk->audio, "input-pads", &input_pads, NULL); ags_effect_bulk_resize_pads(effect_bulk, 0, input_pads); } g_object_unref(effect_bulk->audio); } if(audio != NULL){ g_object_ref(audio); } effect_bulk->audio = audio; if((AGS_EFFECT_BULK_CONNECTED & (effect_bulk->flags)) != 0){ if(audio != NULL){ if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(audio, "output-pads", &output_pads, NULL); ags_effect_bulk_resize_pads(effect_bulk, output_pads, 0); }else{ g_object_get(audio, "input-pads", &input_pads, NULL); ags_effect_bulk_resize_pads(effect_bulk, input_pads, 0); } } } } break; case PROP_CHANNEL_TYPE: { GType channel_type; channel_type = (GType) g_value_get_gtype(value); effect_bulk->channel_type = channel_type; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_bulk_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEffectBulk *effect_bulk; effect_bulk = AGS_EFFECT_BULK(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, effect_bulk->audio); } break; case PROP_CHANNEL_TYPE: { g_value_set_gtype(value, effect_bulk->channel_type); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_effect_bulk_dispose(GObject *gobject) { AgsEffectBulk *effect_bulk; GList *list; effect_bulk = (AgsEffectBulk *) gobject; /* unref audio */ if(effect_bulk->audio != NULL){ g_object_unref(effect_bulk->audio); effect_bulk->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_effect_bulk_parent_class)->dispose(gobject); } void ags_effect_bulk_finalize(GObject *gobject) { AgsEffectBulk *effect_bulk; GList *list; effect_bulk = (AgsEffectBulk *) gobject; /* unref audio */ if(effect_bulk->audio != NULL){ g_object_unref(effect_bulk->audio); } /* free plugin list */ g_list_free_full(effect_bulk->plugin, (GDestroyNotify) ags_effect_bulk_plugin_free); /* destroy plugin browser */ gtk_widget_destroy(GTK_WIDGET(effect_bulk->plugin_browser)); /* remove of the queued drawing hash */ list = effect_bulk->queued_drawing; while(list != NULL){ g_hash_table_remove(ags_effect_bulk_indicator_queue_draw, (GDestroyNotify) list->data); list = list->next; } /* call parent */ G_OBJECT_CLASS(ags_effect_bulk_parent_class)->finalize(gobject); } void ags_effect_bulk_connect(AgsConnectable *connectable) { AgsMachine *machine; AgsEffectBulk *effect_bulk; GList *list, *list_start; effect_bulk = AGS_EFFECT_BULK(connectable); if((AGS_EFFECT_BULK_CONNECTED & (effect_bulk->flags)) != 0){ return; } effect_bulk->flags |= AGS_EFFECT_BULK_CONNECTED; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) effect_bulk, AGS_TYPE_MACHINE); g_signal_connect_after(machine, "resize-audio-channels", G_CALLBACK(ags_effect_bulk_resize_audio_channels_callback), effect_bulk); g_signal_connect_after(machine, "resize-pads", G_CALLBACK(ags_effect_bulk_resize_pads_callback), effect_bulk); /* */ g_signal_connect(G_OBJECT(effect_bulk->add), "clicked", G_CALLBACK(ags_effect_bulk_add_callback), effect_bulk); g_signal_connect(G_OBJECT(effect_bulk->remove), "clicked", G_CALLBACK(ags_effect_bulk_remove_callback), effect_bulk); ags_connectable_connect(AGS_CONNECTABLE(effect_bulk->plugin_browser)); g_signal_connect(G_OBJECT(effect_bulk->plugin_browser), "response", G_CALLBACK(ags_effect_bulk_plugin_browser_response_callback), effect_bulk); list = list_start = gtk_container_get_children((GtkContainer *) effect_bulk->table); while(list != NULL){ if(AGS_IS_CONNECTABLE(list->data)){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); } list = list->next; } g_list_free(list_start); } void ags_effect_bulk_disconnect(AgsConnectable *connectable) { AgsMachine *machine; AgsEffectBulk *effect_bulk; GList *list, *list_start; effect_bulk = AGS_EFFECT_BULK(connectable); if((AGS_EFFECT_BULK_CONNECTED & (effect_bulk->flags)) == 0){ return; } effect_bulk->flags &= (~AGS_EFFECT_BULK_CONNECTED); machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) effect_bulk, AGS_TYPE_MACHINE); g_object_disconnect(G_OBJECT(machine), "any_signal::resize-audio-channels", G_CALLBACK(ags_effect_bulk_resize_audio_channels_callback), effect_bulk, "any_signal::resize-pads", G_CALLBACK(ags_effect_bulk_resize_pads_callback), effect_bulk, NULL); g_object_disconnect(G_OBJECT(effect_bulk->add), "any_signal::clicked", G_CALLBACK(ags_effect_bulk_add_callback), effect_bulk, NULL); g_object_disconnect(G_OBJECT(effect_bulk->remove), "any_signal::clicked", G_CALLBACK(ags_effect_bulk_remove_callback), effect_bulk, NULL); ags_connectable_disconnect(AGS_CONNECTABLE(effect_bulk->plugin_browser)); g_object_disconnect(G_OBJECT(effect_bulk->plugin_browser), "any_signal::response", G_CALLBACK(ags_effect_bulk_plugin_browser_response_callback), effect_bulk, NULL); list = list_start = gtk_container_get_children((GtkContainer *) effect_bulk->table); while(list != NULL){ if(AGS_IS_CONNECTABLE(list->data)){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); } list = list->next; } g_list_free(list_start); } void ags_effect_bulk_show(GtkWidget *widget) { AgsEffectBulk *effect_bulk; effect_bulk = AGS_EFFECT_BULK(widget); GTK_WIDGET_CLASS(ags_effect_bulk_parent_class)->show(widget); if((AGS_EFFECT_BULK_HIDE_BUTTONS & (effect_bulk->flags)) == 0){ gtk_widget_show(gtk_widget_get_parent(GTK_WIDGET(effect_bulk->add))); } if((AGS_EFFECT_BULK_HIDE_ENTRIES & (effect_bulk->flags)) == 0){ gtk_widget_show((GtkWidget *) effect_bulk->bulk_member); } } /** * ags_effect_bulk_plugin_alloc: * @filename: the filename as string * @effect: the effect as string * * Allocate #AgsEffectBulkPlugin-struct. * * Returns: the newly allocated #AgsEffectBulkPlugin-struct * * Since: 3.0.0 */ AgsEffectBulkPlugin* ags_effect_bulk_plugin_alloc(gchar *filename, gchar *effect) { AgsEffectBulkPlugin *effect_plugin; effect_plugin = (AgsEffectBulkPlugin *) malloc(sizeof(AgsEffectBulkPlugin)); effect_plugin->filename = g_strdup(filename); effect_plugin->effect = g_strdup(effect); effect_plugin->control_type_name = NULL; effect_plugin->control_count = 0; return(effect_plugin); } /** * ags_effect_bulk_plugin_free: * @effect_bulk_plugin: the #AgsEffectBulkPlugin-struct * * Free @effect_bulk_plugin. * * Since: 3.0.0 */ void ags_effect_bulk_plugin_free(AgsEffectBulkPlugin *effect_bulk_plugin) { if(effect_bulk_plugin == NULL){ return; } if(effect_bulk_plugin->filename != NULL){ free(effect_bulk_plugin->filename); } if(effect_bulk_plugin->effect != NULL){ free(effect_bulk_plugin->effect); } if(effect_bulk_plugin->control_type_name != NULL){ g_list_free(effect_bulk_plugin->control_type_name); } free(effect_bulk_plugin); } GList* ags_effect_bulk_add_ladspa_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect) { AgsWindow *window; AgsBulkMember *bulk_member; GtkAdjustment *adjustment; AgsEffectBulkPlugin *effect_bulk_plugin; AgsChannel *start_channel, *channel, *next_channel; AgsRecallContainer *recall_container; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsRecallLadspa *recall_ladspa; AgsRecallHandler *recall_handler; AgsLadspaPlugin *ladspa_plugin; AgsApplicationContext *application_context; GObject *output_soundcard; GList *retport; GList *port, *recall_port; GList *start_list, *list; GList *task; GList *start_plugin_port, *plugin_port; guint effect_index; guint pads, audio_channels; gdouble step; guint port_count; guint control_count; guint x, y; guint i, j; guint k; /* get window and application context */ window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget * )effect_bulk, AGS_TYPE_WINDOW); application_context = ags_application_context_get_instance(); /* alloc effect bulk plugin */ effect_bulk_plugin = ags_effect_bulk_plugin_alloc(filename, effect); effect_bulk_plugin->control_type_name = control_type_name; effect_bulk->plugin = g_list_append(effect_bulk->plugin, effect_bulk_plugin); /* get audio properties */ g_object_get(effect_bulk->audio, "output-soundcard", &output_soundcard, "audio-channels", &audio_channels, NULL); if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output", &start_channel, "output-pads", &pads, NULL); }else{ g_object_get(effect_bulk->audio, "input", &start_channel, "input-pads", &pads, NULL); } /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); g_object_get(ladspa_plugin, "effect-index", &effect_index, NULL); task = NULL; retport = NULL; if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); for(i = 0; i < pads; i++){ for(j = 0; j < audio_channels; j++){ /* ladspa play */ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(effect_bulk->audio, (GObject *) recall_container); recall_ladspa = ags_recall_ladspa_new(channel, filename, effect, effect_index); ags_recall_set_flags((AgsRecall *) recall_ladspa, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) recall_ladspa, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall_ladspa, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(recall_ladspa), "output-soundcard", output_soundcard, "recall-container", recall_container, NULL); ags_recall_ladspa_load(recall_ladspa); port = ags_recall_ladspa_load_ports(recall_ladspa); if(retport == NULL){ retport = port; }else{ retport = g_list_concat(retport, port); } ags_channel_add_recall(channel, (GObject *) recall_ladspa, TRUE); ags_connectable_connect(AGS_CONNECTABLE(recall_ladspa)); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LADSPA_RUN); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-channel", recall_ladspa, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* ladspa recall */ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(effect_bulk->audio, (GObject *) recall_container); recall_ladspa = ags_recall_ladspa_new(channel, filename, effect, effect_index); ags_recall_set_flags((AgsRecall *) recall_ladspa, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) recall_ladspa, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall_ladspa, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(recall_ladspa), "output-soundcard", output_soundcard, "recall-container", recall_container, NULL); ags_recall_ladspa_load(recall_ladspa); recall_port = ags_recall_ladspa_load_ports(recall_ladspa); if(retport == NULL){ retport = recall_port; }else{ retport = g_list_concat(retport, recall_port); } ags_channel_add_recall(channel, (GObject *) recall_ladspa, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_ladspa)); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LADSPA_RUN); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-channel", recall_ladspa, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } g_object_unref(start_channel); } /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bulk->table)); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_bulk->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* load ports */ g_object_get(ladspa_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(plugin_port); control_count = 0; k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLadspaConversion *ladspa_conversion; LADSPA_Data default_value; GType widget_type; gchar *plugin_name; gchar *control_port; gchar *port_name; guint unique_id; guint scale_precision; guint port_index; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; control_count++; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_BULK_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_bulk->table, y + 1, AGS_EFFECT_BULK_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); port_index = AGS_PLUGIN_PORT(plugin_port->data)->port_index; unique_id = ladspa_plugin->unique_id; g_rec_mutex_unlock(plugin_port_mutex); /* add bulk member */ plugin_name = g_strdup_printf("ladspa-%u", unique_id); control_port = g_strdup_printf("%u/%u", k + 1, port_count); bulk_member = (AgsBulkMember *) g_object_new(AGS_TYPE_BULK_MEMBER, "widget-type", widget_type, "widget-label", port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "port-index", port_index, "specifier", port_name, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_bulk_member_get_widget(bulk_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* ladspa conversion */ ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_SAMPLERATE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(bulk_member, "conversion", ladspa_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; LADSPA_Data lower_bound, upper_bound; gdouble lower, upper; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_bulk_indicator_queue_draw, child_widget, ags_effect_bulk_indicator_queue_draw_timeout); effect_bulk->queued_drawing = g_list_prepend(effect_bulk->queued_drawing, child_widget); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_effect_bulk_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("ladspa bounds: %f %f", lower, upper); #endif gtk_table_attach(effect_bulk->table, (GtkWidget *) bulk_member, x, x + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(bulk_member)); gtk_widget_show_all((GtkWidget *) effect_bulk->table); /* iterate */ x++; } /* iterate */ plugin_port = plugin_port->next; k++; } effect_bulk_plugin->control_count = control_count; if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_list_free_full(start_plugin_port, g_object_unref); /* launch tasks */ task = g_list_reverse(task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); return(retport); } GList* ags_effect_bulk_add_dssi_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect) { AgsWindow *window; AgsBulkMember *bulk_member; GtkAdjustment *adjustment; AgsEffectBulkPlugin *effect_bulk_plugin; AgsChannel *start_channel, *channel, *next_channel; AgsRecallContainer *recall_container; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsRecallDssi *recall_dssi; AgsRecallHandler *recall_handler; AgsDssiPlugin *dssi_plugin; AgsApplicationContext *application_context; GObject *output_soundcard; GList *retport; GList *port, *recall_port; GList *start_list, *list; GList *task; GList *start_plugin_port, *plugin_port; guint unique_id; guint effect_index; guint pads, audio_channels; gdouble step; guint port_count; guint control_count; guint x, y; guint i, j; guint k; /* get window and application context */ window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) effect_bulk, AGS_TYPE_WINDOW); application_context = ags_application_context_get_instance(); /* alloc effect bulk plugin */ effect_bulk_plugin = ags_effect_bulk_plugin_alloc(filename, effect); effect_bulk_plugin->control_type_name = control_type_name; effect_bulk->plugin = g_list_append(effect_bulk->plugin, effect_bulk_plugin); /* get audio properties */ g_object_get(effect_bulk->audio, "output-soundcard", &output_soundcard, "audio-channels", &audio_channels, NULL); if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output", &start_channel, "output-pads", &pads, NULL); }else{ g_object_get(effect_bulk->audio, "input", &start_channel, "input-pads", &pads, NULL); } /* load plugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); g_object_get(dssi_plugin, "effect-index", &effect_index, "unique-id", &unique_id, NULL); task = NULL; retport = NULL; if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); for(i = 0; i < pads; i++){ for(j = 0; j < audio_channels; j++){ /* dssi play */ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(effect_bulk->audio, (GObject *) recall_container); // add_recall_container = ags_add_recall_container_new(channel->audio, // recall_container); // task = g_list_prepend(task, // add_recall_container); recall_dssi = ags_recall_dssi_new(channel, filename, effect, effect_index); ags_recall_set_flags((AgsRecall *) recall_dssi, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) recall_dssi, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall_dssi, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(recall_dssi), "output-soundcard", output_soundcard, "recall-container", recall_container, NULL); ags_recall_dssi_load(recall_dssi); port = ags_recall_dssi_load_ports(recall_dssi); if(retport == NULL){ retport = port; }else{ retport = g_list_concat(retport, port); } ags_channel_add_recall(channel, (GObject *) recall_dssi, TRUE); ags_connectable_connect(AGS_CONNECTABLE(recall_dssi)); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_DSSI_RUN); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-channel", recall_dssi, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* dssi recall */ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(effect_bulk->audio, (GObject *) recall_container); recall_dssi = ags_recall_dssi_new(channel, filename, effect, effect_index); ags_recall_set_flags((AgsRecall *) recall_dssi, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) recall_dssi, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall_dssi, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(recall_dssi), "output-soundcard", output_soundcard, "recall-container", recall_container, NULL); ags_recall_dssi_load(recall_dssi); recall_port = ags_recall_dssi_load_ports(recall_dssi); if(retport == NULL){ retport = port; }else{ retport = g_list_concat(retport, recall_port); } ags_channel_add_recall(channel, (GObject *) recall_dssi, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_dssi)); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_DSSI_RUN); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-channel", recall_dssi, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } g_object_unref(start_channel); } /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bulk->table)); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_bulk->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* load ports */ g_object_get(dssi_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); control_count = 0; k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLadspaConversion *ladspa_conversion; GType widget_type; gchar *plugin_name; gchar *port_name; gchar *control_port; guint scale_precision; guint port_index; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; control_count++; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_BULK_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_bulk->table, y + 1, AGS_EFFECT_BULK_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); port_index = AGS_PLUGIN_PORT(plugin_port->data)->port_index; g_rec_mutex_unlock(plugin_port_mutex); /* add bulk member */ plugin_name = g_strdup_printf("dssi-%u", unique_id); control_port = g_strdup_printf("%u/%u", k + 1, port_count); bulk_member = (AgsBulkMember *) g_object_new(AGS_TYPE_BULK_MEMBER, "widget-type", widget_type, "widget-label", port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "port-index", port_index, "specifier", port_name, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_bulk_member_get_widget(bulk_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* ladspa conversion */ ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_SAMPLERATE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(bulk_member, "conversion", ladspa_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; LADSPA_Data lower_bound, upper_bound; gdouble lower, upper; LADSPA_Data default_value; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); g_rec_mutex_lock(plugin_port_mutex); default_value = (LADSPA_Data) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); #ifdef AGS_DEBUG g_message("dssi bounds: %f %f", lower, upper); #endif }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_bulk_indicator_queue_draw, child_widget, ags_effect_bulk_indicator_queue_draw_timeout); effect_bulk->queued_drawing = g_list_prepend(effect_bulk->queued_drawing, child_widget); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_effect_bulk_indicator_queue_draw_timeout, (gpointer) child_widget); } gtk_table_attach(effect_bulk->table, (GtkWidget *) bulk_member, x, x + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(bulk_member)); gtk_widget_show_all((GtkWidget *) effect_bulk->table); /* iterate */ x++; } /* iterate */ plugin_port = plugin_port->next; k++; } effect_bulk_plugin->control_count = control_count; g_list_free_full(start_plugin_port, g_object_unref); /* launch tasks */ task = g_list_reverse(task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); return(retport); } GList* ags_effect_bulk_add_lv2_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; AgsEffectBulkPlugin *effect_bulk_plugin; AgsChannel *start_channel, *channel, *next_channel; AgsRecallContainer *recall_container; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsRecallLv2 *recall_lv2; AgsRecallHandler *recall_handler; AgsLv2Plugin *lv2_plugin; GObject *output_soundcard; xmlNode *parent; GList *retport; GList *port, *recall_port; GList *start_list, *list; GList *task; GList *start_plugin_port, *plugin_port; gchar *uri; gchar *port_name; gchar *str; guint effect_index; gdouble step; guint pads, audio_channels; guint port_count; guint control_count; guint x, y; guint i, j; guint k; float lower_bound, upper_bound, default_bound; GRecMutex *base_plugin_mutex; /* alloc effect bulk plugin */ effect_bulk_plugin = ags_effect_bulk_plugin_alloc(filename, effect); effect_bulk_plugin->control_type_name = control_type_name; effect_bulk->plugin = g_list_append(effect_bulk->plugin, effect_bulk_plugin); /* get audio properties */ g_object_get(effect_bulk->audio, "output-soundcard", &output_soundcard, "audio-channels", &audio_channels, NULL); if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output", &start_channel, "output-pads", &pads, NULL); }else{ g_object_get(effect_bulk->audio, "input", &start_channel, "input-pads", &pads, NULL); } /* load plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); g_object_get(lv2_plugin, "effect-index", &effect_index, NULL); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* get uri */ g_rec_mutex_lock(base_plugin_mutex); uri = g_strdup(lv2_plugin->uri); g_rec_mutex_unlock(base_plugin_mutex); retport = NULL; if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); for(i = 0; i < pads; i++){ for(j = 0; j < audio_channels; j++){ /* lv2 play */ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(effect_bulk->audio, (GObject *) recall_container); recall_lv2 = ags_recall_lv2_new(channel, lv2_plugin->turtle, filename, effect, uri, effect_index); ags_recall_set_flags((AgsRecall *) recall_lv2, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) recall_lv2, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall_lv2, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(recall_lv2), "output-soundcard", output_soundcard, "recall-container", recall_container, NULL); ags_recall_lv2_load(recall_lv2); port = ags_recall_lv2_load_ports(recall_lv2); if(retport == NULL){ retport = port; }else{ retport = g_list_concat(retport, port); } ags_channel_add_recall(channel, (GObject *) recall_lv2, TRUE); ags_connectable_connect(AGS_CONNECTABLE(recall_lv2)); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LV2_RUN); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-channel", recall_lv2, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* lv2 recall */ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(effect_bulk->audio, (GObject *) recall_container); recall_lv2 = ags_recall_lv2_new(channel, lv2_plugin->turtle, filename, effect, uri, effect_index); ags_recall_set_flags((AgsRecall *) recall_lv2, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) recall_lv2, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall_lv2, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(recall_lv2), "output-soundcard", output_soundcard, "recall-container", recall_container, NULL); ags_recall_lv2_load(recall_lv2); recall_port = ags_recall_lv2_load_ports(recall_lv2); if(retport == NULL){ retport = port; }else{ retport = g_list_concat(retport, recall_port); } ags_channel_add_recall(channel, (GObject *) recall_lv2, FALSE); ags_connectable_connect(AGS_CONNECTABLE(recall_lv2)); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LV2_RUN); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, AGS_RECALL_TEMPLATE); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-channel", recall_lv2, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } g_object_unref(start_channel); } /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bulk->table)); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_bulk->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* load ports */ g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(plugin_port); control_count = 0; k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLv2Conversion *lv2_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; guint port_index; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; control_count++; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_BULK_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_bulk->table, y + 1, AGS_EFFECT_BULK_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT; if((AGS_PLUGIN_PORT_INTEGER & (AGS_PLUGIN_PORT(plugin_port->data)->flags)) != 0){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); port_index = AGS_PLUGIN_PORT(plugin_port->data)->port_index; g_rec_mutex_unlock(plugin_port_mutex); /* add bulk member */ plugin_name = g_strdup_printf("lv2-<%s>", uri); control_port = g_strdup_printf("%u/%u", k + 1, port_count); bulk_member = (AgsBulkMember *) g_object_new(AGS_TYPE_BULK_MEMBER, "widget-type", widget_type, "widget-label", port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "specifier", port_name, "port-index", port_index, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_bulk_member_get_widget(bulk_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* lv2 conversion */ lv2_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(lv2_conversion == NULL || !AGS_IS_LV2_CONVERSION(lv2_conversion)){ lv2_conversion = ags_lv2_conversion_new(); } lv2_conversion->flags |= AGS_LV2_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(bulk_member, "conversion", lv2_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_bulk_indicator_queue_draw, child_widget, ags_effect_bulk_indicator_queue_draw_timeout); effect_bulk->queued_drawing = g_list_prepend(effect_bulk->queued_drawing, child_widget); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_effect_bulk_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("lv2 bounds: %f %f", lower, upper); #endif gtk_table_attach(effect_bulk->table, (GtkWidget *) bulk_member, x, x + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(bulk_member)); gtk_widget_show_all((GtkWidget *) effect_bulk->table); /* iterate */ x++; } /* iterate */ plugin_port = plugin_port->next; k++; } effect_bulk_plugin->control_count = control_count; g_list_free_full(start_plugin_port, g_object_unref); g_free(uri); return(retport); } GList* ags_effect_bulk_real_add_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect) { AgsLadspaPlugin *ladspa_plugin; AgsDssiPlugin *dssi_plugin; AgsLv2Plugin *lv2_plugin; GList *port; /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); port = NULL; if(ladspa_plugin != NULL){ port = ags_effect_bulk_add_ladspa_effect(effect_bulk, control_type_name, filename, effect); } if(ladspa_plugin == NULL){ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); if(dssi_plugin != NULL){ port = ags_effect_bulk_add_dssi_effect(effect_bulk, control_type_name, filename, effect); } } if(ladspa_plugin == NULL && dssi_plugin == NULL){ GList *ui_node; gchar *str; lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL){ port = ags_effect_bulk_add_lv2_effect(effect_bulk, control_type_name, filename, effect); } } return(port); } /** * ags_effect_bulk_add_effect: * @effect_bulk: the #AgsEffectBulk to modify * @control_type_name: the #GList-struct containing string representation of a #GType * @filename: the effect's filename * @effect: the effect's name * * Add an effect by its filename and effect specifier. * * Returns: the #GList-struct containing the #AgsPort objects added * * Since: 3.0.0 */ GList* ags_effect_bulk_add_effect(AgsEffectBulk *effect_bulk, GList *control_type_name, gchar *filename, gchar *effect) { GList *list; g_return_val_if_fail(AGS_IS_EFFECT_BULK(effect_bulk), NULL); g_object_ref((GObject *) effect_bulk); g_signal_emit(G_OBJECT(effect_bulk), effect_bulk_signals[ADD_EFFECT], 0, control_type_name, filename, effect, &list); g_object_unref((GObject *) effect_bulk); return(list); } void ags_effect_bulk_real_remove_effect(AgsEffectBulk *effect_bulk, guint nth) { GtkAdjustment *adjustment; AgsChannel *start_channel, *channel, *next_channel; AgsEffectBulkPlugin *effect_bulk_plugin; GList *plugin; GList *start_list, *list; guint nth_effect, n_recall; guint control_count; guint pads, audio_channels; guint i, j; /* get audio properties */ g_object_get(effect_bulk->audio, "audio-channels", &audio_channels, NULL); if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output", &start_channel, "output-pads", &pads, NULL); }else{ g_object_get(effect_bulk->audio, "input", &start_channel, "input-pads", &pads, NULL); } nth_effect = 0; if(start_channel != NULL){ GList *start_play, *play; channel = start_channel; g_object_ref(channel); g_object_get(channel, "play", &start_play, NULL); /* get nth_effect */ play = start_play; n_recall = 0; while((play = ags_recall_template_find_all_type(play, AGS_TYPE_RECALL_LADSPA, AGS_TYPE_RECALL_DSSI, AGS_TYPE_RECALL_LV2, G_TYPE_NONE)) != NULL){ if(ags_recall_test_flags(play->data, AGS_RECALL_TEMPLATE)){ nth_effect++; } if(ags_recall_test_behaviour_flags(play->data, AGS_SOUND_BEHAVIOUR_BULK_MODE)){ n_recall++; } if(nth_effect - n_recall == nth){ break; } play = play->next; } g_object_unref(channel); g_list_free_full(start_play, g_object_unref); } if(nth_effect == 0){ if(start_channel != NULL){ g_object_unref(start_channel); } /* free plugin specification */ effect_bulk_plugin = g_list_nth_data(effect_bulk->plugin, nth); effect_bulk->plugin = g_list_remove(effect_bulk->plugin, effect_bulk_plugin); ags_effect_bulk_plugin_free(effect_bulk_plugin); return; } nth_effect--; /* destroy control */ start_list = gtk_container_get_children((GtkContainer *) effect_bulk->table); start_list = g_list_reverse(start_list); i = 0; j = 0; plugin = effect_bulk->plugin; effect_bulk_plugin = g_list_nth_data(effect_bulk->plugin, nth); control_count = 0; while(plugin != NULL && plugin->data != effect_bulk_plugin){ control_count += AGS_EFFECT_BULK_PLUGIN(plugin->data)->control_count; plugin = plugin->next; } list = g_list_nth(start_list, control_count); while(list != NULL && j < effect_bulk_plugin->control_count){ if(AGS_IS_BULK_MEMBER(list->data)){ GtkWidget *child_widget; child_widget = gtk_bin_get_child(list->data); if(AGS_IS_LED(child_widget) || AGS_IS_INDICATOR(child_widget)){ g_hash_table_remove(ags_effect_bulk_indicator_queue_draw, child_widget); } gtk_widget_destroy(GTK_WIDGET(list->data)); j++; } list = list->next; } /* free plugin specification */ effect_bulk->plugin = g_list_remove(effect_bulk->plugin, effect_bulk_plugin); ags_effect_bulk_plugin_free(effect_bulk_plugin); g_list_free(start_list); /* remove recalls */ if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); for(i = 0; i < pads; i++){ for(j = 0; j < audio_channels; j++){ /* remove effect */ ags_channel_remove_effect(channel, nth_effect); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } } if(start_channel != NULL){ g_object_unref(start_channel); } } /** * ags_effect_bulk_remove_effect: * @effect_bulk: the #AgsEffectBulk to modify * @nth: the nth effect to remove * * Remove an effect by its position. * * Since: 3.0.0 */ void ags_effect_bulk_remove_effect(AgsEffectBulk *effect_bulk, guint nth) { g_return_if_fail(AGS_IS_EFFECT_BULK(effect_bulk)); g_object_ref((GObject *) effect_bulk); g_signal_emit(G_OBJECT(effect_bulk), effect_bulk_signals[REMOVE_EFFECT], 0, nth); g_object_unref((GObject *) effect_bulk); } void ags_effect_bulk_real_resize_audio_channels(AgsEffectBulk *effect_bulk, guint new_size, guint old_size) { AgsChannel *start_channel; AgsChannel *current, *next_current, *nth_current; GList *start_list, *list; guint pads; guint i, j; /* retrieve channel */ if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output", &start_channel, "output-pads", &pads, NULL); }else{ g_object_get(effect_bulk->audio, "input", &start_channel, "input-pads", &pads, NULL); } if(pads == 0){ if(start_channel != NULL){ g_object_unref(start_channel); } return; } /* collect bulk member */ start_list = gtk_container_get_children((GtkContainer *) effect_bulk->table); if(new_size > old_size){ current = start_channel; if(current != NULL){ g_object_ref(current); } /* add effect */ next_current = NULL; for(i = 0; i < pads; i++){ nth_current = ags_channel_nth(current, old_size); g_object_unref(current); current = nth_current; /* */ for(j = old_size; j < new_size; j++){ GList *effect_bulk_plugin; /* add effect */ effect_bulk_plugin = effect_bulk->plugin; while(effect_bulk_plugin != NULL){ GList *recall_list; GList *start_play, *play; GList *start_recall, *recall; GList *start_port, *port; recall_list = ags_channel_add_effect(current, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect); g_list_free(recall_list); /* get play/recall */ g_object_get(current, "play", &start_play, "recall", &start_recall, NULL); /* get effect - play context */ play = ags_recall_find_recall_id_with_effect(start_play, NULL, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect); if(play != NULL){ ags_recall_set_ability_flags((AgsRecall *) play->data, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) play->data, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_get(play->data, "port", &start_port, NULL); port = start_port; while(port != NULL){ AgsBulkMember *bulk_member; AgsBulkPort *bulk_port; list = ags_bulk_member_find_effect_and_specifier(start_list, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect, AGS_PORT(port->data)->specifier); if(list != NULL){ bulk_member = list->data; bulk_port = ags_bulk_port_alloc(port->data, i, j); bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, bulk_port); } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); } g_list_free_full(start_play, g_object_unref); /* get effect - recall context */ recall = ags_recall_find_recall_id_with_effect(start_recall, NULL, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect); if(recall != NULL){ ags_recall_set_ability_flags((AgsRecall *) recall->data, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall->data, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_get(recall->data, "port", &start_port, NULL); port = start_port; while(port != NULL){ AgsBulkMember *bulk_member; AgsBulkPort *bulk_port; list = ags_bulk_member_find_effect_and_specifier(start_list, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect, AGS_PORT(port->data)->specifier); if(list != NULL){ bulk_member = list->data; bulk_port = ags_bulk_port_alloc(port->data, i, j); bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, bulk_port); } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); } g_list_free_full(start_recall, g_object_unref); /* iterate */ effect_bulk_plugin = effect_bulk_plugin->next; } /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } } if(next_current != NULL){ g_object_unref(next_current); } }else{ /* remove port */ list = start_list; while(list != NULL){ GList *start_bulk_port, *bulk_port; if(!AGS_IS_BULK_MEMBER(list->data)){ list = list->next; continue; } /* bulk port */ start_bulk_port = g_list_copy(AGS_BULK_MEMBER(list->data)->bulk_port); bulk_port = start_bulk_port; while(bulk_port != NULL){ if(AGS_BULK_PORT(bulk_port->data)->audio_channel >= new_size){ AGS_BULK_MEMBER(list->data)->bulk_port = g_list_remove(AGS_BULK_MEMBER(list->data)->bulk_port, bulk_port->data); } /* iterate */ bulk_port = bulk_port->next; } g_list_free(start_bulk_port); /* iterate */ list = list->next; } } if(start_channel != NULL){ g_object_unref(start_channel); } g_list_free(start_list); } void ags_effect_bulk_resize_audio_channels(AgsEffectBulk *effect_bulk, guint new_size, guint old_size) { g_return_if_fail(AGS_IS_EFFECT_BULK(effect_bulk)); g_object_ref((GObject *) effect_bulk); g_signal_emit(G_OBJECT(effect_bulk), effect_bulk_signals[RESIZE_AUDIO_CHANNELS], 0, new_size, old_size); g_object_unref((GObject *) effect_bulk); } void ags_effect_bulk_real_resize_pads(AgsEffectBulk *effect_bulk, guint new_size, guint old_size) { AgsChannel *start_channel; AgsChannel *current, *next_current, *nth_current; GList *start_list, *list; guint audio_channels; guint i, j; /* retrieve channel */ g_object_get(effect_bulk->audio, "audio-channels", &audio_channels, NULL); if(audio_channels == 0){ return; } if(effect_bulk->channel_type == AGS_TYPE_OUTPUT){ g_object_get(effect_bulk->audio, "output", &start_channel, NULL); }else{ g_object_get(effect_bulk->audio, "input", &start_channel, NULL); } /* collect bulk member */ start_list = gtk_container_get_children((GtkContainer *) effect_bulk->table); if(new_size > old_size){ /* add effect */ nth_current = ags_channel_pad_nth(start_channel, old_size); current = nth_current; /* */ next_current = NULL; for(i = old_size; i < new_size; i++){ for(j = 0; j < audio_channels; j++){ GList *effect_bulk_plugin; /* add effect */ effect_bulk_plugin = effect_bulk->plugin; while(effect_bulk_plugin != NULL){ GList *recall_list; GList *start_play, *play; GList *start_recall, *recall; GList *start_port, *port; recall_list = ags_channel_add_effect(current, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect); g_list_free(recall_list); /* get play/recall */ g_object_get(current, "play", &start_play, "recall", &start_recall, NULL); /* get effect - play context */ play = ags_recall_find_recall_id_with_effect(start_play, NULL, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect); if(play != NULL){ ags_recall_set_ability_flags((AgsRecall *) play->data, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) play->data, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_get(play->data, "port", &start_port, NULL); port = start_port; while(port != NULL){ AgsBulkMember *bulk_member; AgsBulkPort *bulk_port; list = ags_bulk_member_find_effect_and_specifier(start_list, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect, AGS_PORT(port->data)->specifier); if(list != NULL){ bulk_member = list->data; bulk_port = ags_bulk_port_alloc(port->data, i, j); bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, bulk_port); } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); } g_list_free_full(start_play, g_object_unref); /* get effect - recall context */ recall = ags_recall_find_recall_id_with_effect(start_recall, NULL, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect); if(recall != NULL){ ags_recall_set_ability_flags((AgsRecall *) recall->data, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) recall->data, (AGS_SOUND_BEHAVIOUR_BULK_MODE | AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); g_object_get(recall->data, "port", &start_port, NULL); port = start_port; while(port != NULL){ AgsBulkMember *bulk_member; AgsBulkPort *bulk_port; list = ags_bulk_member_find_effect_and_specifier(start_list, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->filename, AGS_EFFECT_BULK_PLUGIN(effect_bulk_plugin->data)->effect, AGS_PORT(port->data)->specifier); if(list != NULL){ bulk_member = list->data; bulk_port = ags_bulk_port_alloc(port->data, i, j); bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, bulk_port); } /* iterate */ port = port->next; } g_list_free_full(start_port, g_object_unref); } g_list_free_full(start_recall, g_object_unref); /* iterate */ effect_bulk_plugin = effect_bulk_plugin->next; } /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } } if(next_current != NULL){ g_object_unref(next_current); } }else{ /* remove port */ list = start_list; while(list != NULL){ GList *start_bulk_port, *bulk_port; if(!AGS_IS_BULK_MEMBER(list->data)){ list = list->next; continue; } /* bulk port */ start_bulk_port = g_list_copy(AGS_BULK_MEMBER(list->data)->bulk_port); bulk_port = start_bulk_port; while(bulk_port != NULL){ if(AGS_BULK_PORT(bulk_port->data)->pad >= new_size){ AGS_BULK_MEMBER(list->data)->bulk_port = g_list_remove(AGS_BULK_MEMBER(list->data)->bulk_port, bulk_port->data); } /* iterate */ bulk_port = bulk_port->next; } g_list_free(start_bulk_port); /* iterate */ list = list->next; } } g_object_unref(start_channel); g_list_free(start_list); } void ags_effect_bulk_resize_pads(AgsEffectBulk *effect_bulk, guint new_size, guint old_size) { g_return_if_fail(AGS_IS_EFFECT_BULK(effect_bulk)); g_object_ref((GObject *) effect_bulk); g_signal_emit(G_OBJECT(effect_bulk), effect_bulk_signals[RESIZE_PADS], 0, new_size, old_size); g_object_unref((GObject *) effect_bulk); } void ags_effect_bulk_real_map_recall(AgsEffectBulk *effect_bulk) { if((AGS_MACHINE_PREMAPPED_RECALL & (effect_bulk->flags)) == 0 || (AGS_EFFECT_BULK_MAPPED_RECALL & (effect_bulk->flags)) != 0){ return; } effect_bulk->flags |= AGS_EFFECT_BULK_MAPPED_RECALL; ags_effect_bulk_find_port(effect_bulk); } /** * ags_effect_bulk_map_recall: * @effect_bulk: the #AgsEffectBulk to add its default recall. * * You may want the @effect_bulk to add its default recall. */ void ags_effect_bulk_map_recall(AgsEffectBulk *effect_bulk) { g_return_if_fail(AGS_IS_EFFECT_BULK(effect_bulk)); g_object_ref((GObject *) effect_bulk); g_signal_emit((GObject *) effect_bulk, effect_bulk_signals[MAP_RECALL], 0); g_object_unref((GObject *) effect_bulk); } GList* ags_effect_bulk_real_find_port(AgsEffectBulk *effect_bulk) { GList *bulk_member, *bulk_member_start; GList *port, *tmp_port; port = NULL; /* find output ports */ bulk_member_start = bulk_member = gtk_container_get_children((GtkContainer *) effect_bulk->table); if(bulk_member != NULL){ while(bulk_member != NULL){ tmp_port = ags_bulk_member_find_port(AGS_BULK_MEMBER(bulk_member->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } bulk_member = bulk_member->next; } g_list_free(bulk_member_start); } return(port); } /** * ags_effect_bulk_find_port: * @effect_bulk: the #AgsEffectBulk * Returns: an #GList containing all related #AgsPort * * Lookup ports of associated recalls. * * Since: 3.0.0 */ GList* ags_effect_bulk_find_port(AgsEffectBulk *effect_bulk) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_EFFECT_BULK(effect_bulk), NULL); g_object_ref((GObject *) effect_bulk); g_signal_emit((GObject *) effect_bulk, effect_bulk_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) effect_bulk); return(list); } /** * ags_effect_bulk_indicator_queue_draw_timeout: * @widget: the indicator widgt * * Queue draw widget * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_effect_bulk_indicator_queue_draw_timeout(GtkWidget *widget) { if(g_hash_table_lookup(ags_effect_bulk_indicator_queue_draw, widget) != NULL){ AgsBulkMember *bulk_member; GList *list; gdouble val; bulk_member = gtk_widget_get_ancestor(widget, AGS_TYPE_BULK_MEMBER); list = bulk_member->bulk_port; val = 0.0; while(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(AGS_BULK_PORT(list->data)->port, &value); val += g_value_get_float(&value); list = list->next; } if(AGS_IS_LED(widget)){ if(val != 0.0){ ags_led_set_active(widget); }else{ ags_led_unset_active(widget); } }else if(AGS_IS_INDICATOR(widget)){ gtk_adjustment_set_value(AGS_INDICATOR(widget)->adjustment, val); } gtk_widget_queue_draw(widget); return(TRUE); }else{ return(FALSE); } } /** * ags_effect_bulk_new: * @audio: the #AgsAudio to visualize * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * * Creates an #AgsEffectBulk * * Returns: a new #AgsEffectBulk * * Since: 3.0.0 */ AgsEffectBulk* ags_effect_bulk_new(AgsAudio *audio, GType channel_type) { AgsEffectBulk *effect_bulk; effect_bulk = (AgsEffectBulk *) g_object_new(AGS_TYPE_EFFECT_BULK, "audio", audio, "channel-type", channel_type, NULL); return(effect_bulk); } gsequencer-3.1.3/ags/X/ags_input_editor_callbacks.c0000644000175000017500000000363613607210263017273 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_input_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsInputEditor *input_editor) { AgsMachine *machine; AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel; if(old_parent != NULL){ return; } //TODO:JK: missing mutex line_editor = (AgsLineEditor *) gtk_widget_get_ancestor(widget, AGS_TYPE_LINE_EDITOR); if(line_editor != NULL){ channel = line_editor->channel; if(channel != NULL){ GtkTreeIter iter; audio = AGS_AUDIO(channel->audio); if(audio != NULL){ machine = AGS_MACHINE(audio->machine_widget); gtk_combo_box_set_model(GTK_COMBO_BOX(input_editor->soundcard), GTK_TREE_MODEL(ags_machine_get_possible_audio_input_connections(machine))); ags_input_editor_check(input_editor); } } } } void ags_input_editor_soundcard_callback(GtkComboBoxText *combo_text, AgsInputEditor *input_editor) { ags_input_editor_check(input_editor); } gsequencer-3.1.3/ags/X/ags_animation_window.h0000644000175000017500000000452413607210263016137 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ANIMATION_WINDOW_H__ #define __AGS_ANIMATION_WINDOW_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ANIMATION_WINDOW (ags_animation_window_get_type()) #define AGS_ANIMATION_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ANIMATION_WINDOW, AgsAnimationWindow)) #define AGS_ANIMATION_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ANIMATION_WINDOW, AgsAnimationWindowClass)) #define AGS_IS_ANIMATION_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ANIMATION_WINDOW)) #define AGS_IS_ANIMATION_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ANIMATION_WINDOW)) #define AGS_ANIMATION_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ANIMATION_WINDOW, AgsAnimationWindowClass)) typedef struct _AgsAnimationWindow AgsAnimationWindow; typedef struct _AgsAnimationWindowClass AgsAnimationWindowClass; struct _AgsAnimationWindow { GtkWindow window; guint flags; guint message_count; gchar *filename; guint image_size; unsigned char *bg_data; unsigned char *cache_data; guint text_box_x0; guint text_box_y0; GdkRGBA *text_color; }; struct _AgsAnimationWindowClass { GtkWindowClass window; }; GType ags_animation_window_get_type(void); gboolean ags_animation_window_progress_timeout(AgsAnimationWindow *animation_window); AgsAnimationWindow* ags_animation_window_new(); G_END_DECLS #endif /*__AGS_ANIMATION_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_link_collection_editor_callbacks.h0000644000175000017500000000352413607210263021305 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINK_COLLECTION_EDITOR_CALLBACKS_H__ #define __AGS_LINK_COLLECTION_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_link_collection_editor_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLinkCollectionEditor *link_collection_editor); /* control widgets */ void ags_link_collection_editor_link_callback(GtkComboBox *combo, AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_first_line_callback(GtkSpinButton *spin_button, AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_first_link_callback(GtkSpinButton *spin_button, AgsLinkCollectionEditor *link_collection_editor); void ags_link_collection_editor_count_callback(GtkSpinButton *spin_button, AgsLinkCollectionEditor *link_collection_editor); G_END_DECLS #endif /*__AGS_LINK_COLLECTION_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/0000755000175000017500000000000013622252261013246 500000000000000gsequencer-3.1.3/ags/X/machine/ags_spectrometer.c0000644000175000017500000004645313607210264016714 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_spectrometer_class_init(AgsSpectrometerClass *spectrometer); void ags_spectrometer_connectable_interface_init(AgsConnectableInterface *connectable); void ags_spectrometer_init(AgsSpectrometer *spectrometer); void ags_spectrometer_finalize(GObject *gobject); void ags_spectrometer_map_recall(AgsMachine *machine); void ags_spectrometer_connect(AgsConnectable *connectable); void ags_spectrometer_disconnect(AgsConnectable *connectable); gdouble ags_spectrometer_x_small_scale_func(gdouble value, gpointer data); gdouble ags_spectrometer_x_big_scale_func(gdouble value, gpointer data); gchar* ags_spectrometer_x_label_func(gdouble value, gpointer data); gchar* ags_spectrometer_y_label_func(gdouble value, gpointer data); /** * SECTION:ags_spectrometer * @short_description: spectrometer sequencer * @title: AgsSpectrometer * @section_id: * @include: ags/X/machine/ags_spectrometer.h * * The #AgsSpectrometer is a composite widget to act as spectrometer sequencer. */ static gpointer ags_spectrometer_parent_class = NULL; static AgsConnectableInterface *ags_spectrometer_parent_connectable_interface; GHashTable *ags_spectrometer_cartesian_queue_draw = NULL; GType ags_spectrometer_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_spectrometer = 0; static const GTypeInfo ags_spectrometer_info = { sizeof(AgsSpectrometerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_spectrometer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSpectrometer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_spectrometer_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_spectrometer_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_spectrometer = g_type_register_static(AGS_TYPE_MACHINE, "AgsSpectrometer", &ags_spectrometer_info, 0); g_type_add_interface_static(ags_type_spectrometer, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_spectrometer); } return g_define_type_id__volatile; } void ags_spectrometer_class_init(AgsSpectrometerClass *spectrometer) { GObjectClass *gobject; AgsMachineClass *machine; ags_spectrometer_parent_class = g_type_class_peek_parent(spectrometer); /* GObjectClass */ gobject = (GObjectClass *) spectrometer; gobject->finalize = ags_spectrometer_finalize; /* */ machine = (AgsMachineClass *) spectrometer; machine->map_recall = ags_spectrometer_map_recall; } void ags_spectrometer_connectable_interface_init(AgsConnectableInterface *connectable) { ags_spectrometer_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_spectrometer_connect; connectable->disconnect = ags_spectrometer_disconnect; } void ags_spectrometer_init(AgsSpectrometer *spectrometer) { GtkVBox *vbox; AgsCartesian *cartesian; AgsConfig *config; gchar *str; guint buffer_size; gdouble width, height; gdouble default_width, default_height; gdouble offset; config = ags_config_get_instance(); g_signal_connect_after((GObject *) spectrometer, "parent_set", G_CALLBACK(ags_spectrometer_parent_set_callback), (gpointer) spectrometer); ags_audio_set_flags(AGS_MACHINE(spectrometer)->audio, (AGS_AUDIO_SYNC)); g_object_set(AGS_MACHINE(spectrometer)->audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, NULL); if(ags_spectrometer_cartesian_queue_draw == NULL){ ags_spectrometer_cartesian_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } spectrometer->name = NULL; spectrometer->xml_type = "ags-spectrometer"; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer*) gtk_bin_get_child((GtkBin *) spectrometer), (GtkWidget *) vbox); /* cartesian */ cartesian = spectrometer->cartesian = ags_cartesian_new(); cartesian->x_start = AGS_SPECTROMETER_DEFAULT_X_START; cartesian->x_end = AGS_SPECTROMETER_DEFAULT_X_END; cartesian->y_start = AGS_SPECTROMETER_DEFAULT_Y_START; cartesian->y_end = AGS_SPECTROMETER_DEFAULT_Y_END; cartesian->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, cartesian->x_end - cartesian->x_start, cartesian->y_end - cartesian->y_start); cartesian->x_small_scale_func = ags_spectrometer_x_small_scale_func; cartesian->x_big_scale_func = ags_spectrometer_x_big_scale_func; cartesian->x_label_func = ags_spectrometer_x_label_func; cartesian->y_label_func = ags_spectrometer_y_label_func; /* label */ cartesian->x_label_precision = 1.0; ags_cartesian_reallocate_label(cartesian, TRUE); ags_cartesian_reallocate_label(cartesian, FALSE); ags_cartesian_fill_label(cartesian, TRUE); ags_cartesian_fill_label(cartesian, FALSE); width = cartesian->x_end - cartesian->x_start; height = cartesian->y_end - cartesian->y_start; spectrometer->fg_plot = NULL; /* cartesian - size, pack and redraw */ gtk_widget_set_size_request((GtkWidget *) cartesian, (gint) (width + 2.0 * cartesian->x_margin), (gint) (height + 2.0 * cartesian->y_margin)); gtk_box_pack_start((GtkBox *) vbox, GTK_WIDGET(cartesian), FALSE, FALSE, 0); gtk_widget_queue_draw((GtkWidget *) cartesian); /* buffer-size */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "buffer-size"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "buffer-size"); } if(str != NULL){ buffer_size = g_ascii_strtoull(str, NULL, 10); free(str); }else{ buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; } /* port */ spectrometer->frequency_buffer_play_port = NULL; spectrometer->frequency_buffer_recall_port = NULL; spectrometer->magnitude_buffer_play_port = NULL; spectrometer->magnitude_buffer_recall_port = NULL; /* buffer */ spectrometer->buffer_size = ceil(buffer_size / 2.0); spectrometer->frequency_buffer = (double *) malloc(ceil(buffer_size / 2.0) * sizeof(double)); ags_audio_buffer_util_clear_double(spectrometer->frequency_buffer, 1, ceil(buffer_size / 2.0)); spectrometer->magnitude_buffer = (double *) malloc(ceil(buffer_size / 2.0) * sizeof(double)); ags_audio_buffer_util_clear_double(spectrometer->magnitude_buffer, 1, ceil(buffer_size / 2.0)); /* queue draw */ g_hash_table_insert(ags_spectrometer_cartesian_queue_draw, cartesian, ags_spectrometer_cartesian_queue_draw_timeout); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_spectrometer_cartesian_queue_draw_timeout, (gpointer) cartesian); } void ags_spectrometer_finalize(GObject *gobject) { AgsSpectrometer *spectrometer; spectrometer = (AgsSpectrometer *) gobject; g_hash_table_remove(ags_spectrometer_cartesian_queue_draw, spectrometer->cartesian); g_list_free_full(spectrometer->frequency_buffer_play_port, g_object_unref); g_list_free_full(spectrometer->frequency_buffer_recall_port, g_object_unref); g_list_free_full(spectrometer->magnitude_buffer_play_port, g_object_unref); g_list_free_full(spectrometer->magnitude_buffer_recall_port, g_object_unref); g_free(spectrometer->frequency_buffer); g_free(spectrometer->magnitude_buffer); /* call parent */ G_OBJECT_CLASS(ags_spectrometer_parent_class)->finalize(gobject); } void ags_spectrometer_connect(AgsConnectable *connectable) { AgsSpectrometer *spectrometer; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } spectrometer = AGS_SPECTROMETER(connectable); g_signal_connect_after(spectrometer, "resize-audio-channels", G_CALLBACK(ags_spectrometer_resize_audio_channels_callback), NULL); g_signal_connect_after(spectrometer, "resize-pads", G_CALLBACK(ags_spectrometer_resize_pads_callback), NULL); /* call parent */ ags_spectrometer_parent_connectable_interface->connect(connectable); } void ags_spectrometer_disconnect(AgsConnectable *connectable) { AgsSpectrometer *spectrometer; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } spectrometer = AGS_SPECTROMETER(connectable); g_object_disconnect(spectrometer, "any_signal::resize-audio-channels", G_CALLBACK(ags_spectrometer_resize_audio_channels_callback), NULL, NULL); g_object_disconnect(spectrometer, "any_signal::resize-pads", G_CALLBACK(ags_spectrometer_resize_pads_callback), NULL, NULL); /* call parent */ ags_spectrometer_parent_connectable_interface->disconnect(connectable); } void ags_spectrometer_map_recall(AgsMachine *machine) { AgsSpectrometer *spectrometer; AgsCartesian *cartesian; AgsPlot *fg_plot; AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; AgsPeakChannelRun *recall_peak_channel_run, *play_peak_channel_run; guint audio_channels; guint i; spectrometer = (AgsSpectrometer *) machine; cartesian = spectrometer->cartesian; audio = machine->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, "input", &start_channel, NULL); /* ags-analyse */ ags_recall_factory_create(audio, NULL, NULL, "ags-analyse", 0, audio_channels, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; i < audio_channels; i++){ AgsPort *port; GList *start_play; GList *start_recall; fg_plot = ags_spectrometer_fg_plot_alloc(spectrometer, 0.125, 0.5, 1.0); ags_cartesian_add_plot(cartesian, fg_plot); spectrometer->fg_plot = g_list_prepend(spectrometer->fg_plot, fg_plot); g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* frequency - find port */ port = ags_spectrometer_find_specifier(start_play, "./frequency-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->frequency_buffer_play_port = g_list_prepend(spectrometer->frequency_buffer_play_port, port); } port = ags_spectrometer_find_specifier(start_recall, "./frequency-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->frequency_buffer_recall_port = g_list_prepend(spectrometer->frequency_buffer_recall_port, port); } /* magnitude - find port */ port = ags_spectrometer_find_specifier(start_play, "./magnitude-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->magnitude_buffer_play_port = g_list_prepend(spectrometer->magnitude_buffer_play_port, port); } port = ags_spectrometer_find_specifier(start_recall, "./magnitude-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->magnitude_buffer_recall_port = g_list_prepend(spectrometer->magnitude_buffer_recall_port, port); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } /* call parent */ AGS_MACHINE_CLASS(ags_spectrometer_parent_class)->map_recall(machine); } gdouble ags_spectrometer_x_small_scale_func(gdouble value, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(value); } return(AGS_CARTESIAN(data)->x_small_scale_factor * value); } gdouble ags_spectrometer_x_big_scale_func(gdouble value, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(value); } return(AGS_CARTESIAN(data)->x_big_scale_factor * value); } gchar* ags_spectrometer_x_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; gdouble correction; correction = (44100.0 - AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) / (double) AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->x_label_precision)); str = g_strdup_printf(format, (correction / 2.0) * (exp(value / 12.0) - 1.0)); g_free(format); return(str); } gchar* ags_spectrometer_y_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value / 20.0); return(str); } AgsPort* ags_spectrometer_find_specifier(GList *recall, gchar *specifier) { GList *port; while(recall != NULL){ port = AGS_RECALL(recall->data)->port; #ifdef AGS_DEBUG g_message("search port in %s", G_OBJECT_TYPE_NAME(recall->data)); #endif while(port != NULL){ if(!g_strcmp0(AGS_PORT(port->data)->specifier, specifier)){ return(AGS_PORT(port->data)); } port = port->next; } recall = recall->next; } return(NULL); } AgsPlot* ags_spectrometer_fg_plot_alloc(AgsSpectrometer *spectrometer, gdouble color_r, gdouble color_g, double color_b) { AgsCartesian *cartesian; AgsPlot *plot; guint i, i_stop; cartesian = spectrometer->cartesian; i_stop = AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT + 1; plot = ags_plot_alloc(i_stop, 0, 0); plot->join_points = TRUE; for(i = 0; i < i_stop; i++){ plot->point_color[i][0] = color_r; plot->point_color[i][1] = color_g; plot->point_color[i][2] = color_b; plot->point[i][0] = ((gdouble) i / (gdouble) AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT) * ((double) cartesian->x_end); plot->point[i][1] = 0.0; } return(plot); } /** * ags_spectrometer_cartesian_queue_draw_timeout: * @widget: the widget * * Queue draw widget * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_spectrometer_cartesian_queue_draw_timeout(GtkWidget *widget) { AgsSpectrometer *spectrometer; if(g_hash_table_lookup(ags_spectrometer_cartesian_queue_draw, widget) != NULL){ AgsCartesian *cartesian; GList *fg_plot; GList *frequency_buffer_port; GList *magnitude_buffer_port; guint samplerate; gdouble nyquist; gdouble correction; gdouble frequency; gdouble gfrequency, gfrequency_next; double magnitude; guint i; guint j, j_stop; guint k, k_stop; guint nth; gboolean completed; GValue value = {0,}; spectrometer = (AgsSpectrometer *) gtk_widget_get_ancestor(widget, AGS_TYPE_SPECTROMETER); cartesian = spectrometer->cartesian; g_object_get(AGS_MACHINE(spectrometer)->audio, "samplerate", &samplerate, NULL); fg_plot = spectrometer->fg_plot; nyquist = ((gdouble) samplerate / 2.0); correction = (44100.0 - AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) / (double) AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; frequency_buffer_port = spectrometer->frequency_buffer_play_port; magnitude_buffer_port = spectrometer->magnitude_buffer_play_port; if(frequency_buffer_port == NULL || magnitude_buffer_port == NULL){ return(TRUE); } for(i = 0; fg_plot != NULL; i++){ g_value_init(&value, G_TYPE_POINTER); g_value_set_pointer(&value, spectrometer->frequency_buffer); ags_port_safe_read(frequency_buffer_port->data, &value); g_value_reset(&value); g_value_set_pointer(&value, spectrometer->magnitude_buffer); ags_port_safe_read(magnitude_buffer_port->data, &value); g_value_unset(&value); completed = FALSE; for(j = 1, nth = 1; j < AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT && !completed; j++){ magnitude = 0.0; k = 0; for(; nth < spectrometer->buffer_size; k++){ frequency = ((double) nth) / ((double) spectrometer->buffer_size) * (nyquist); if(AGS_SPECTROMETER_DEFAULT_X_END >= 0.0 && AGS_SPECTROMETER_DEFAULT_X_START < 0.0){ gfrequency = (correction / 2.0) * (exp((((double) j) / (gdouble) AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT * ((AGS_SPECTROMETER_DEFAULT_X_END + AGS_SPECTROMETER_DEFAULT_X_START) / AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH)) / 12.0) - 1.0); }else if(AGS_SPECTROMETER_DEFAULT_X_END >= 0.0 && AGS_SPECTROMETER_DEFAULT_X_START >= 0.0){ gfrequency = (correction / 2.0) * (exp((((double) j) / (gdouble) AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT * ((AGS_SPECTROMETER_DEFAULT_X_END - AGS_SPECTROMETER_DEFAULT_X_START) / AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH)) / 12.0) - 1.0); }else{ g_message("only positive frequencies allowed"); } // gfrequency_next = (correction / 2.0) * (exp((((double) j + 1.0)) / 12.0) - 1.0); #if 1 if(gfrequency > samplerate || frequency > samplerate){ completed = TRUE; break; } #endif #if 0 g_message("freq=%f", frequency); g_message("gfreq=%f", gfrequency); #endif if(frequency < gfrequency){ magnitude += spectrometer->magnitude_buffer[nth]; nth++; }else{ break; } } #if 0 g_message("j=%d", j); #endif if(k != 0){ AGS_PLOT(fg_plot->data)->point[j][1] = 20.0 * log10(((double) magnitude / (double) k) + 1.0) * AGS_SPECTROMETER_EXTRA_SCALE; }else{ AGS_PLOT(fg_plot->data)->point[j][1] = 0.0; } } /* iterate */ fg_plot = fg_plot->next; frequency_buffer_port = frequency_buffer_port->next; magnitude_buffer_port = magnitude_buffer_port->next; } /* queue draw */ gtk_widget_queue_draw(widget); return(TRUE); }else{ return(FALSE); } } /** * ags_spectrometer_new: * @soundcard: the assigned soundcard. * * Creates an #AgsSpectrometer * * Returns: a new #AgsSpectrometer * * Since: 3.0.0 */ AgsSpectrometer* ags_spectrometer_new(GObject *soundcard) { AgsSpectrometer *spectrometer; spectrometer = (AgsSpectrometer *) g_object_new(AGS_TYPE_SPECTROMETER, NULL); g_object_set(G_OBJECT(AGS_MACHINE(spectrometer)->audio), "output-soundcard", soundcard, NULL); return(spectrometer); } gsequencer-3.1.3/ags/X/machine/ags_cell_pattern_callbacks.h0000644000175000017500000000407513607210263020651 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CELL_PATTERN_CALLBACKS_H__ #define __AGS_CELL_PATTERN_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_cell_pattern_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsCellPattern *cell_pattern); /* controls */ gboolean ags_cell_pattern_focus_in_callback(GtkWidget *widget, GdkEvent *event, AgsCellPattern *cell_pattern); gboolean ags_cell_pattern_drawing_area_configure_callback(GtkWidget *widget, GdkEventConfigure *event, AgsCellPattern *cell_pattern); gboolean ags_cell_pattern_drawing_area_expose_callback(GtkWidget *widget, GdkEventExpose *event, AgsCellPattern *cell_pattern); gboolean ags_cell_pattern_drawing_area_button_press_callback(GtkWidget *widget, GdkEventButton *event, AgsCellPattern *cell_pattern); gboolean ags_cell_pattern_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsCellPattern *cell_pattern); gboolean ags_cell_pattern_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsCellPattern *cell_pattern); void ags_cell_pattern_adjustment_value_changed_callback(GtkWidget *widget, AgsCellPattern *cell_pattern); G_END_DECLS #endif /*__AGS_CELL_PATTERN_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ladspa_bridge_callbacks.c0000644000175000017500000000261313607210263020744 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_ladspa_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLadspaBridge *ladspa_bridge) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(widget)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_LADSPA_BRIDGE)->counter); g_object_set(AGS_MACHINE(ladspa_bridge), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_LADSPA_BRIDGE); g_free(str); } gsequencer-3.1.3/ags/X/machine/ags_drum_input_line_callbacks.c0000644000175000017500000000153713605312647021374 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include gsequencer-3.1.3/ags/X/machine/ags_synth_input_pad.c0000644000175000017500000001217113607210263017375 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_synth_input_pad_class_init(AgsSynthInputPadClass *synth_input_pad); void ags_synth_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_synth_input_pad_init(AgsSynthInputPad *synth_input_pad); void ags_synth_input_pad_connect(AgsConnectable *connectable); void ags_synth_input_pad_disconnect(AgsConnectable *connectable); void ags_synth_input_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_synth_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); /** * SECTION:ags_synth_input_pad * @short_description: synth input pad * @title: AgsSynthInputPad * @section_id: * @include: ags/X/machine/ags_synth_input_pad.h * * The #AgsSynthInputPad is a composite widget to act as synth input pad. */ static gpointer ags_synth_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_synth_input_pad_parent_connectable_interface; GType ags_synth_input_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_synth_input_pad = 0; static const GTypeInfo ags_synth_input_pad_info = { sizeof(AgsSynthInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_synth_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSynthInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_synth_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_synth_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_synth_input_pad = g_type_register_static(AGS_TYPE_PAD, "AgsSynthInputPad", &ags_synth_input_pad_info, 0); g_type_add_interface_static(ags_type_synth_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_synth_input_pad); } return g_define_type_id__volatile; } void ags_synth_input_pad_class_init(AgsSynthInputPadClass *synth_input_pad) { AgsPadClass *pad; ags_synth_input_pad_parent_class = g_type_class_peek_parent(synth_input_pad); pad = (AgsPadClass *) synth_input_pad; pad->set_channel = ags_synth_input_pad_set_channel; pad->resize_lines = ags_synth_input_pad_resize_lines; } void ags_synth_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_synth_input_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_synth_input_pad_connect; connectable->disconnect = ags_synth_input_pad_disconnect; } void ags_synth_input_pad_init(AgsSynthInputPad *synth_input_pad) { synth_input_pad->name = NULL; synth_input_pad->xml_type = "ags-synth-input-pad"; } void ags_synth_input_pad_connect(AgsConnectable *connectable) { AgsSynthInputPad *synth_input_pad; /* AgsSynthInputPad */ synth_input_pad = AGS_SYNTH_INPUT_PAD(connectable); if((AGS_PAD_CONNECTED & (AGS_PAD(synth_input_pad)->flags)) != 0){ return; } ags_synth_input_pad_parent_connectable_interface->connect(connectable); } void ags_synth_input_pad_disconnect(AgsConnectable *connectable) { ags_synth_input_pad_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_synth_input_pad_set_channel(AgsPad *pad, AgsChannel *channel) { AGS_PAD_CLASS(ags_synth_input_pad_parent_class)->set_channel(pad, channel); /* empty */ } void ags_synth_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AGS_PAD_CLASS(ags_synth_input_pad_parent_class)->resize_lines(pad, line_type, audio_channels, audio_channels_old); /* empty */ } /** * ags_synth_input_pad_new: * @channel: the assigned #AgsChannel * * Create a new instance of #AgsSynthInputPad * * Returns: the new #AgsSynthInputPad * * Since: 3.0.0 */ AgsSynthInputPad* ags_synth_input_pad_new(AgsChannel *channel) { AgsSynthInputPad *synth_input_pad; synth_input_pad = (AgsSynthInputPad *) g_object_new(AGS_TYPE_SYNTH_INPUT_PAD, "channel", channel, NULL); return(synth_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_mixer_input_pad.c0000644000175000017500000001216613607210263017360 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_mixer_input_pad_class_init(AgsMixerInputPadClass *mixer_input_pad); void ags_mixer_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_mixer_input_pad_init(AgsMixerInputPad *mixer_input_pad); void ags_mixer_input_pad_connect(AgsConnectable *connectable); void ags_mixer_input_pad_disconnect(AgsConnectable *connectable); void ags_mixer_input_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_mixer_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); /** * SECTION:ags_mixer_input_pad * @short_description: mixer input pad * @title: AgsMixerInputPad * @section_id: * @include: ags/X/machine/ags_mixer_input_pad.h * * The #AgsMixerInputPad is a composite widget to act as mixer input pad. */ static gpointer ags_mixer_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_mixer_input_pad_parent_connectable_interface; GType ags_mixer_input_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mixer_input_pad = 0; static const GTypeInfo ags_mixer_input_pad_info = { sizeof(AgsMixerInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mixer_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMixerInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mixer_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_mixer_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_mixer_input_pad = g_type_register_static(AGS_TYPE_PAD, "AgsMixerInputPad", &ags_mixer_input_pad_info, 0); g_type_add_interface_static(ags_type_mixer_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_mixer_input_pad); } return g_define_type_id__volatile; } void ags_mixer_input_pad_class_init(AgsMixerInputPadClass *mixer_input_pad) { AgsPadClass *pad; ags_mixer_input_pad_parent_class = g_type_class_peek_parent(mixer_input_pad); pad = (AgsPadClass *) mixer_input_pad; pad->set_channel = ags_mixer_input_pad_set_channel; pad->resize_lines = ags_mixer_input_pad_resize_lines; } void ags_mixer_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_mixer_input_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_mixer_input_pad_connect; connectable->disconnect = ags_mixer_input_pad_disconnect; } void ags_mixer_input_pad_init(AgsMixerInputPad *mixer_input_pad) { } void ags_mixer_input_pad_connect(AgsConnectable *connectable) { AgsMixerInputPad *mixer_input_pad; /* AgsMixerInputPad */ mixer_input_pad = AGS_MIXER_INPUT_PAD(connectable); if((AGS_PAD_CONNECTED & (AGS_PAD(mixer_input_pad)->flags)) != 0){ return; } ags_mixer_input_pad_parent_connectable_interface->connect(connectable); } void ags_mixer_input_pad_disconnect(AgsConnectable *connectable) { ags_mixer_input_pad_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_mixer_input_pad_set_channel(AgsPad *pad, AgsChannel *channel) { AGS_PAD_CLASS(ags_mixer_input_pad_parent_class)->set_channel(pad, channel); /* empty */ } void ags_mixer_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AGS_PAD_CLASS(ags_mixer_input_pad_parent_class)->resize_lines(pad, line_type, audio_channels, audio_channels_old); /* empty */ } /** * ags_mixer_input_pad_new: * @channel: the assigned #AgsChannel * * Create a new instance of #AgsMixerInputPad * * Returns: the new #AgsMixerInputPad * * Since: 3.0.0 */ AgsMixerInputPad* ags_mixer_input_pad_new(AgsChannel *channel) { AgsMixerInputPad *mixer_input_pad; mixer_input_pad = (AgsMixerInputPad *) g_object_new(AGS_TYPE_MIXER_INPUT_PAD, "channel", channel, NULL); return(mixer_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_ladspa_bridge.h0000644000175000017500000000525513607210263016757 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_BRIDGE_H__ #define __AGS_LADSPA_BRIDGE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LADSPA_BRIDGE (ags_ladspa_bridge_get_type()) #define AGS_LADSPA_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LADSPA_BRIDGE, AgsLadspaBridge)) #define AGS_LADSPA_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LADSPA_BRIDGE, AgsLadspaBridgeClass)) #define AGS_IS_LADSPA_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LADSPA_BRIDGE)) #define AGS_IS_LADSPA_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LADSPA_BRIDGE)) #define AGS_LADSPA_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LADSPA_BRIDGE, AgsLadspaBridgeClass)) #define AGS_LADSPA_BRIDGE_DEFAULT_VERSION "0.4.3" #define AGS_LADSPA_BRIDGE_DEFAULT_BUILD_ID "CEST 15-03-2015 13:40" typedef struct _AgsLadspaBridge AgsLadspaBridge; typedef struct _AgsLadspaBridgeClass AgsLadspaBridgeClass; typedef enum{ AGS_LADSPA_BRIDGE_DISPLAY_INPUT = 1, AGS_LADSPA_BRIDGE_BULK_OUTPUT = 1 << 1, AGS_LADSPA_BRIDGE_DISPLAY_OUTPUT = 1 << 2, AGS_LADSPA_BRIDGE_BULK_INPUT = 1 << 3, }AgsLadspaBridgeFlags; struct _AgsLadspaBridge { AgsMachine machine; guint flags; gchar *name; gchar *version; gchar *build_id; gchar *xml_type; guint mapped_output; guint mapped_input; gchar *filename; gchar *effect; unsigned long effect_index; }; struct _AgsLadspaBridgeClass { AgsMachineClass machine; }; GType ags_ladspa_bridge_get_type(void); void ags_ladspa_bridge_load(AgsLadspaBridge *ladspa_bridge); AgsLadspaBridge* ags_ladspa_bridge_new(GObject *soundcard, gchar *filename, gchar *effect); G_END_DECLS #endif /*__AGS_LADSPA_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum.c0000644000175000017500000005123613607210263015141 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_drum_class_init(AgsDrumClass *drum); void ags_drum_connectable_interface_init(AgsConnectableInterface *connectable); void ags_drum_init(AgsDrum *drum); void ags_drum_finalize(GObject *gobject); void ags_drum_connect(AgsConnectable *connectable); void ags_drum_disconnect(AgsConnectable *connectable); void ags_drum_show(GtkWidget *widget); void ags_drum_show_all(GtkWidget *widget); void ags_drum_map_recall(AgsMachine *machine); void ags_drum_resize_pads(AgsDrum *drum, GType gtype, guint pads, guint pads_old, gpointer data); /** * SECTION:ags_drum * @short_description: drum sequencer * @title: AgsDrum * @section_id: * @include: ags/X/machine/ags_drum.h * * The #AgsDrum is a composite widget to act as drum sequencer. */ static gpointer ags_drum_parent_class = NULL; static AgsConnectableInterface *ags_drum_parent_connectable_interface; GType ags_drum_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_drum = 0; static const GTypeInfo ags_drum_info = { sizeof(AgsDrumClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_drum_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDrum), 0, /* n_preallocs */ (GInstanceInitFunc) ags_drum_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_drum_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_drum = g_type_register_static(AGS_TYPE_MACHINE, "AgsDrum", &ags_drum_info, 0); g_type_add_interface_static(ags_type_drum, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_drum); } return g_define_type_id__volatile; } void ags_drum_class_init(AgsDrumClass *drum) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_drum_parent_class = g_type_class_peek_parent(drum); /* GObjectClass */ gobject = (GObjectClass *) drum; gobject->finalize = ags_drum_finalize; /* GtkWidget */ widget = (GtkWidgetClass *) drum; widget->show = ags_drum_show; widget->show_all = ags_drum_show_all; /* */ machine = (AgsMachineClass *) drum; machine->map_recall = ags_drum_map_recall; } void ags_drum_connectable_interface_init(AgsConnectableInterface *connectable) { ags_drum_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_drum_connect; connectable->disconnect = ags_drum_disconnect; } void ags_drum_init(AgsDrum *drum) { GtkVBox *vbox; GtkHBox *hbox; GtkToggleButton *toggle_button; GtkFrame *frame; GtkTable *table0, *table1; GtkRadioButton *radio_button; AgsAudio *audio; GList *list; gchar *str; guint stream_length; int i, j; g_signal_connect_after((GObject *) drum, "parent_set", G_CALLBACK(ags_drum_parent_set_callback), (gpointer) drum); audio = AGS_MACHINE(drum)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_FILE)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_PATTERN_MODE | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); audio->bank_dim[0] = 4; audio->bank_dim[1] = 12; audio->bank_dim[2] = 64; AGS_MACHINE(drum)->flags |= (AGS_MACHINE_IS_SEQUENCER | AGS_MACHINE_TAKES_FILE_INPUT); AGS_MACHINE(drum)->file_input_flags |= (AGS_MACHINE_ACCEPT_WAV); AGS_MACHINE(drum)->input_pad_type = AGS_TYPE_DRUM_INPUT_PAD; AGS_MACHINE(drum)->input_line_type = AGS_TYPE_DRUM_INPUT_LINE; AGS_MACHINE(drum)->output_pad_type = AGS_TYPE_DRUM_OUTPUT_PAD; AGS_MACHINE(drum)->output_line_type = AGS_TYPE_DRUM_OUTPUT_LINE; /* context menu */ ags_machine_popup_add_edit_options((AgsMachine *) drum, (AGS_MACHINE_POPUP_COPY_PATTERN | AGS_MACHINE_POPUP_ENVELOPE)); ags_machine_popup_add_connection_options((AgsMachine *) drum, (AGS_MACHINE_POPUP_MIDI_DIALOG)); /* audio resize */ g_signal_connect_after(G_OBJECT(drum), "resize-pads", G_CALLBACK(ags_drum_resize_pads), NULL); /* flags, name and xml type */ drum->flags = 0; drum->name = NULL; drum->xml_type = "ags-drum"; /* create widgets */ drum->vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer*) gtk_bin_get_child((GtkBin *) drum), (GtkWidget *) drum->vbox); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) drum->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); /* input pad */ drum->input_pad = (GtkHBox *) gtk_hbox_new(FALSE, 0); AGS_MACHINE(drum)->input = (GtkContainer *) drum->input_pad; gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) drum->input_pad, FALSE, FALSE, 0); /* output pad */ drum->output_pad = (GtkVBox *) gtk_vbox_new(FALSE, 0); AGS_MACHINE(drum)->output = (GtkContainer *) drum->output_pad; gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) drum->output_pad, FALSE, FALSE, 0); /* */ drum->selected_pad = NULL; drum->selected_edit_button = NULL; /* */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) drum->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); frame = (GtkFrame *) gtk_frame_new(i18n("kit")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) frame, FALSE, FALSE, 0); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer*) frame, (GtkWidget *) vbox); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) gtk_label_new(i18n("default")), FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) (drum->open = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OPEN)), FALSE, FALSE, 0); drum->open_dialog = NULL; /* sequencer */ frame = (GtkFrame *) gtk_frame_new(i18n("pattern")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) frame, FALSE, FALSE, 0); table0 = (GtkTable *) gtk_table_new(8, 4, FALSE); gtk_container_add((GtkContainer*) frame, (GtkWidget *) table0); drum->loop_button = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("loop")); gtk_table_attach_defaults(table0, (GtkWidget *) drum->loop_button, 0, 1, 2, 3); AGS_MACHINE(drum)->play = drum->run = (GtkToggleButton *) gtk_toggle_button_new_with_label(i18n("run")); gtk_table_attach_defaults(table0, (GtkWidget *) drum->run, 1, 2, 0, 3); /* bank 1 */ table1 = (GtkTable *) gtk_table_new(3, 5, TRUE); gtk_table_attach_defaults(table0, (GtkWidget *) table1, 2, 3, 0, 3); drum->selected1 = NULL; for(i = 0; i < 3; i++){ for(j = 0; j < 4; j++){ str = g_strdup_printf("%d", (4 * i) + (j + 1)); drum->index1[4 * i + j] = (GtkToggleButton *) gtk_toggle_button_new_with_label(str); gtk_table_attach_defaults(table1, (GtkWidget *) (drum->index1[4 * i + j]), j, j + 1, i, i + 1); g_free(str); } } /* bank 0 */ drum->selected1 = drum->index1[0]; gtk_toggle_button_set_active(drum->index1[0], TRUE); drum->selected0 = NULL; for(j = 0; j < 4; j++){ str = g_strdup_printf("%c", 'a' + j); drum->index0[j] = (GtkToggleButton *) gtk_toggle_button_new_with_label(str); gtk_table_attach_defaults(table1, (GtkWidget *) (drum->index0[j]), j, j + 1, 4, 5); g_free(str); } drum->selected0 = drum->index0[0]; gtk_toggle_button_set_active(drum->index0[0], TRUE); /* duration */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table0, (GtkWidget *) hbox, 6, 7, 0, 1, GTK_EXPAND, GTK_EXPAND, 0, 0); gtk_box_pack_start((GtkBox*) hbox, gtk_label_new(i18n("length")), FALSE, FALSE, 0); drum->length_spin = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 64.0, 1.0); gtk_spin_button_set_value(drum->length_spin, 16.0); gtk_box_pack_start((GtkBox*) hbox, (GtkWidget *) drum->length_spin, FALSE, FALSE, 0); /* pattern box */ drum->pattern_box = ags_pattern_box_new(); gtk_table_attach(table0, (GtkWidget *) drum->pattern_box, 7, 8, 0, 3, GTK_EXPAND, GTK_EXPAND, 0, 0); } void ags_drum_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_drum_parent_class)->finalize(gobject); } void ags_drum_connect(AgsConnectable *connectable) { AgsDrum *drum; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } drum = AGS_DRUM(connectable); /* call parent */ ags_drum_parent_connectable_interface->connect(connectable); /* GtkObject */ g_signal_connect((GObject *) drum, "destroy", G_CALLBACK(ags_drum_destroy_callback), (gpointer) drum); /* AgsDrum */ g_signal_connect((GObject *) drum->open, "clicked", G_CALLBACK(ags_drum_open_callback), (gpointer) drum); g_signal_connect((GObject *) drum->loop_button, "clicked", G_CALLBACK(ags_drum_loop_button_callback), (gpointer) drum); g_signal_connect_after((GObject *) drum->length_spin, "value-changed", G_CALLBACK(ags_drum_length_spin_callback), (gpointer) drum); for(i = 0; i < 12; i++){ g_signal_connect(G_OBJECT(drum->index1[i]), "clicked", G_CALLBACK(ags_drum_index1_callback), (gpointer) drum); } for(i = 0; i < 4; i++){ g_signal_connect(G_OBJECT(drum->index0[i]), "clicked", G_CALLBACK(ags_drum_index0_callback), (gpointer) drum); } ags_connectable_connect(AGS_CONNECTABLE(drum->pattern_box)); /* AgsMachine */ g_signal_connect_after(G_OBJECT(drum), "stop", G_CALLBACK(ags_drum_stop_callback), NULL); } void ags_drum_disconnect(AgsConnectable *connectable) { AgsDrum *drum; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } drum = AGS_DRUM(connectable); /* GtkObject */ g_object_disconnect((GObject *) drum, "any_signal::destroy", G_CALLBACK(ags_drum_destroy_callback), (gpointer) drum, NULL); /* AgsDrum */ g_object_disconnect((GObject *) drum->open, "any_signal::clicked", G_CALLBACK(ags_drum_open_callback), (gpointer) drum, NULL); g_object_disconnect((GObject *) drum->loop_button, "any_signal::clicked", G_CALLBACK(ags_drum_loop_button_callback), (gpointer) drum, NULL); g_object_disconnect((GObject *) drum->length_spin, "any_signal::value-changed", G_CALLBACK(ags_drum_length_spin_callback), (gpointer) drum, NULL); for(i = 0; i < 12; i++){ g_object_disconnect(G_OBJECT(drum->index1[i]), "any_signal::clicked", G_CALLBACK(ags_drum_index1_callback), (gpointer) drum, NULL); } for(i = 0; i < 4; i++){ g_object_disconnect(G_OBJECT(drum->index0[i]), "any_signal::clicked", G_CALLBACK(ags_drum_index0_callback), (gpointer) drum, NULL); } ags_connectable_disconnect(AGS_CONNECTABLE(drum->pattern_box)); /* AgsAudio */ g_object_disconnect(G_OBJECT(drum), "any_signal::stop", G_CALLBACK(ags_drum_stop_callback), NULL, NULL); /* call parent */ ags_drum_parent_connectable_interface->disconnect(connectable); } void ags_drum_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_drum_parent_class)->show(widget); ags_pattern_box_set_pattern(AGS_DRUM(widget)->pattern_box); } void ags_drum_show_all(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_drum_parent_class)->show_all(widget); ags_pattern_box_set_pattern(AGS_DRUM(widget)->pattern_box); } void ags_drum_map_recall(AgsMachine *machine) { AgsWindow *window; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsCopyPatternAudio *recall_copy_pattern_audio; AgsCopyPatternAudioRun *recall_copy_pattern_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-copy-pattern */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy-pattern", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_REMAP | AGS_RECALL_FACTORY_RECALL), 0); g_object_get(audio, "recall", &start_recall, NULL); recall = ags_recall_find_type(start_recall, AGS_TYPE_COPY_PATTERN_AUDIO_RUN); if(recall != NULL){ recall_copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(recall->data); /* set dependency */ g_object_set(G_OBJECT(recall_copy_pattern_audio_run), "delay-audio-run", play_delay_audio_run, "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_recall, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* call parent */ AGS_MACHINE_CLASS(ags_drum_parent_class)->map_recall(machine); } void ags_drum_resize_pads(AgsDrum *drum, GType gtype, guint pads, guint pads_old, gpointer data) { if(gtype == AGS_TYPE_INPUT){ AgsDrumInputPad *drum_input_pad; if(pads_old < pads){ /* reset edit button */ if(pads_old == 0){ GtkToggleButton *selected_edit_button; drum->selected_pad = AGS_DRUM_INPUT_PAD(gtk_container_get_children((GtkContainer *) drum->input_pad)->data); AGS_MACHINE(drum)->selected_input_pad = (GtkWidget *) drum->selected_pad; drum->selected_edit_button = drum->selected_pad->edit; gtk_toggle_button_set_active((GtkToggleButton *) drum->selected_edit_button, TRUE); } }else{ /* destroy AgsPad's */ if(pads == 0){ drum->selected_pad = NULL; drum->selected_edit_button = NULL; }else{ drum_input_pad = AGS_DRUM_INPUT_PAD(gtk_widget_get_ancestor(GTK_WIDGET(drum->selected_edit_button), AGS_TYPE_PAD)); if(drum_input_pad->pad.channel->pad > pads){ drum->selected_pad = AGS_DRUM_INPUT_PAD(gtk_container_get_children((GtkContainer *) drum->input_pad)->data); AGS_MACHINE(drum)->selected_input_pad = (GtkWidget *) drum->selected_pad; drum->selected_edit_button = drum->selected_pad->edit; gtk_toggle_button_set_active((GtkToggleButton *) drum->selected_edit_button, TRUE); } } } } } /** * ags_drum_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsDrum * * Returns: the new #AgsDrum * * Since: 3.0.0 */ AgsDrum* ags_drum_new(GObject *soundcard) { AgsDrum *drum; drum = (AgsDrum *) g_object_new(AGS_TYPE_DRUM, NULL); g_object_set(AGS_MACHINE(drum)->audio, "output-soundcard", soundcard, NULL); return(drum); } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bridge.c0000644000175000017500000001342713607210263017316 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_ffplayer_bridge_class_init(AgsFFPlayerBridgeClass *ffplayer_bridge); void ags_ffplayer_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ffplayer_bridge_init(AgsFFPlayerBridge *ffplayer_bridge); void ags_ffplayer_bridge_connect(AgsConnectable *connectable); void ags_ffplayer_bridge_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ffplayer_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsFFPlayerBridge * @section_id: * @include: ags/X/machine/ags_ffplayer_bridge.h * * #AgsFFPlayerBridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ static gpointer ags_ffplayer_bridge_parent_class = NULL; static AgsConnectableInterface *ags_ffplayer_bridge_parent_connectable_interface; GType ags_ffplayer_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ffplayer_bridge = 0; static const GTypeInfo ags_ffplayer_bridge_info = { sizeof(AgsFFPlayerBridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ffplayer_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFFPlayerBridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ffplayer_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ffplayer_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ffplayer_bridge = g_type_register_static(AGS_TYPE_EFFECT_BRIDGE, "AgsFFPlayerBridge", &ags_ffplayer_bridge_info, 0); g_type_add_interface_static(ags_type_ffplayer_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ffplayer_bridge); } return g_define_type_id__volatile; } void ags_ffplayer_bridge_class_init(AgsFFPlayerBridgeClass *ffplayer_bridge) { ags_ffplayer_bridge_parent_class = g_type_class_peek_parent(ffplayer_bridge); } void ags_ffplayer_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_ffplayer_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ffplayer_bridge_connect; connectable->disconnect = ags_ffplayer_bridge_disconnect; } void ags_ffplayer_bridge_init(AgsFFPlayerBridge *ffplayer_bridge) { GtkFrame *frame; GtkExpander *expander; GtkTable *table; AGS_EFFECT_BRIDGE(ffplayer_bridge)->input_pad_type = AGS_TYPE_FFPLAYER_INPUT_PAD; AGS_EFFECT_BRIDGE(ffplayer_bridge)->input_line_type = AGS_TYPE_FFPLAYER_INPUT_LINE; frame = (GtkFrame *) gtk_frame_new("input bridge"); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(ffplayer_bridge), (GtkWidget *) frame, FALSE, FALSE, 0); expander = (GtkExpander *) gtk_expander_new("show/hide"); gtk_container_add((GtkContainer *) frame, (GtkWidget *) expander); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_container_add((GtkContainer *) expander, (GtkWidget *) table); AGS_EFFECT_BRIDGE(ffplayer_bridge)->bulk_input = (GtkWidget *) g_object_new(AGS_TYPE_FFPLAYER_BULK_INPUT, NULL); gtk_table_attach(table, (GtkWidget *) AGS_EFFECT_BRIDGE(ffplayer_bridge)->bulk_input, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); AGS_EFFECT_BRIDGE(ffplayer_bridge)->input = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, (GtkWidget *) AGS_EFFECT_BRIDGE(ffplayer_bridge)->input, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); } void ags_ffplayer_bridge_connect(AgsConnectable *connectable) { if((AGS_EFFECT_BRIDGE_CONNECTED & (AGS_EFFECT_BRIDGE(connectable)->flags)) != 0){ return; } ags_ffplayer_bridge_parent_connectable_interface->connect(connectable); //TODO:JK: implement me } void ags_ffplayer_bridge_disconnect(AgsConnectable *connectable) { if((AGS_EFFECT_BRIDGE_CONNECTED & (AGS_EFFECT_BRIDGE(connectable)->flags)) == 0){ return; } ags_ffplayer_bridge_parent_connectable_interface->disconnect(connectable); //TODO:JK: implement me } /** * ags_ffplayer_bridge_new: * @audio: the #AgsAudio to visualize * * Creates an #AgsFFPlayerBridge * * Returns: a new #AgsFFPlayerBridge * * Since: 3.0.0 */ AgsFFPlayerBridge* ags_ffplayer_bridge_new(AgsAudio *audio) { AgsFFPlayerBridge *ffplayer_bridge; ffplayer_bridge = (AgsFFPlayerBridge *) g_object_new(AGS_TYPE_FFPLAYER_BRIDGE, "audio", audio, NULL); return(ffplayer_bridge); } gsequencer-3.1.3/ags/X/machine/ags_live_dssi_bridge_callbacks.c0000644000175000017500000001321313607210263021457 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_live_dssi_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLiveDssiBridge *live_dssi_bridge) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(widget)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_LIVE_DSSI_BRIDGE)->counter); g_object_set(AGS_MACHINE(live_dssi_bridge), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_LIVE_DSSI_BRIDGE); g_free(str); } void ags_live_dssi_bridge_program_changed_callback(GtkComboBox *combo_box, AgsLiveDssiBridge *live_dssi_bridge) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(combo_box, &iter)){ AgsLadspaConversion *ladspa_conversion; AgsChannel *channel; GList *bulk_member, *bulk_member_start; GList *recall; GList *port; gchar *name; gchar *specifier; LADSPA_PortDescriptor *port_descriptor; guint bank, program; unsigned long i; /* get program */ gtk_tree_model_get(gtk_combo_box_get_model(combo_box), &iter, 0, &name, 1, &bank, 2, &program, -1); live_dssi_bridge->dssi_descriptor->select_program(live_dssi_bridge->ladspa_handle, (unsigned long) bank, (unsigned long) program); #ifdef AGS_DEBUG g_message("%d %d", bank, program); #endif /* update ports */ channel = AGS_MACHINE(live_dssi_bridge)->audio->input; port_descriptor = live_dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortDescriptors; while(channel != NULL){ recall = channel->recall; while((recall = ags_recall_find_type(recall, AGS_TYPE_PLAY_DSSI_AUDIO)) != NULL){ AGS_PLAY_DSSI_AUDIO(recall->data)->bank = (unsigned long) bank; AGS_PLAY_DSSI_AUDIO(recall->data)->program = (unsigned long) program; for(i = 0; i < live_dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortCount; i++){ if(LADSPA_IS_PORT_CONTROL(port_descriptor[i])){ if(LADSPA_IS_PORT_INPUT(port_descriptor[i]) || LADSPA_IS_PORT_OUTPUT(port_descriptor[i])){ specifier = live_dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortNames[i]; port = AGS_RECALL(recall->data)->port; while(port != NULL){ if(!g_strcmp0(AGS_PORT(port->data)->specifier, specifier)){ GValue value = {0,}; #ifdef AGS_DEBUG g_message("%s %f", specifier, live_dssi_bridge->port_values[i]); #endif g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, live_dssi_bridge->port_values[i]); ags_port_safe_write_raw(port->data, &value); break; } port = port->next; } } } } recall = recall->next; } channel = channel->next; } /* update UI */ bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_dssi_bridge)->bridge)->bulk_output)->table); for(i = 0; i < live_dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortCount; i++){ /* find bulk member */ bulk_member = bulk_member_start; specifier = live_dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortNames[i]; #ifdef AGS_DEBUG g_message("%s", specifier); #endif while(bulk_member != NULL){ if(AGS_IS_BULK_MEMBER(bulk_member->data) && !g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->specifier, specifier)){ GtkWidget *child_widget; AGS_BULK_MEMBER(bulk_member->data)->flags |= AGS_BULK_MEMBER_NO_UPDATE; child_widget = gtk_bin_get_child((GtkBin *) AGS_BULK_MEMBER(bulk_member->data)); ladspa_conversion = (AgsLadspaConversion *) AGS_BULK_MEMBER(bulk_member->data)->conversion; if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(live_dssi_bridge->port_values[i] == 0.0){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, TRUE); } }else if(AGS_IS_DIAL(child_widget)){ gdouble val; val = live_dssi_bridge->port_values[i]; if(ladspa_conversion != NULL){ // val = ags_ladspa_conversion_convert(ladspa_conversion, // live_dssi_bridge->port_values[i], // TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, val); gtk_widget_queue_draw((AgsDial *) child_widget); #ifdef AGS_DEBUG g_message(" --- %f", live_dssi_bridge->port_values[i]); #endif } AGS_BULK_MEMBER(bulk_member->data)->flags &= (~AGS_BULK_MEMBER_NO_UPDATE); break; } bulk_member = bulk_member->next; } } g_list_free(bulk_member_start); } } gsequencer-3.1.3/ags/X/machine/ags_drum_output_line.c0000644000175000017500000002031213607210263017557 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_drum_output_line_class_init(AgsDrumOutputLineClass *drum_output_line); void ags_drum_output_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_drum_output_line_init(AgsDrumOutputLine *drum_output_line); void ags_drum_output_line_connect(AgsConnectable *connectable); void ags_drum_output_line_disconnect(AgsConnectable *connectable); void ags_drum_output_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_drum_output_line_map_recall(AgsLine *line, guint output_pad_start); /** * SECTION:ags_drum_output_line * @short_description: drum sequencer output line * @title: AgsDrumOutputLine * @section_id: * @include: ags/X/machine/ags_drum_output_line.h * * The #AgsDrumOutputLine is a composite widget to act as drum sequencer output line. */ static gpointer ags_drum_output_line_parent_class = NULL; static AgsConnectableInterface *ags_drum_output_line_parent_connectable_interface; GType ags_drum_output_line_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_drum_output_line = 0; static const GTypeInfo ags_drum_output_line_info = { sizeof(AgsDrumOutputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_drum_output_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDrumOutputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_drum_output_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_drum_output_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_drum_output_line = g_type_register_static(AGS_TYPE_LINE, "AgsDrumOutputLine", &ags_drum_output_line_info, 0); g_type_add_interface_static(ags_type_drum_output_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_drum_output_line); } return g_define_type_id__volatile; } void ags_drum_output_line_class_init(AgsDrumOutputLineClass *drum_output_line) { AgsLineClass *line; ags_drum_output_line_parent_class = g_type_class_peek_parent(drum_output_line); /* AgsLineClass */ line = AGS_LINE_CLASS(drum_output_line); line->set_channel = ags_drum_output_line_set_channel; line->map_recall = ags_drum_output_line_map_recall; } void ags_drum_output_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_drum_output_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_drum_output_line_connect; connectable->disconnect = ags_drum_output_line_disconnect; } void ags_drum_output_line_init(AgsDrumOutputLine *drum_output_line) { drum_output_line->xml_type = "ags-drum-output-line"; } void ags_drum_output_line_connect(AgsConnectable *connectable) { AgsDrum *drum; AgsDrumOutputLine *drum_output_line; drum_output_line = AGS_DRUM_OUTPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(drum_output_line)->flags)) != 0){ return; } ags_drum_output_line_parent_connectable_interface->connect(connectable); drum = (AgsDrum *) gtk_widget_get_ancestor((GtkWidget *) drum_output_line, AGS_TYPE_DRUM); g_signal_connect_after((GObject *) drum, "resize-pads", G_CALLBACK(ags_drum_output_line_resize_pads_callback), drum_output_line); } void ags_drum_output_line_disconnect(AgsConnectable *connectable) { AgsDrum *drum; AgsDrumOutputLine *drum_output_line; drum_output_line = AGS_DRUM_OUTPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(drum_output_line)->flags)) == 0){ return; } ags_drum_output_line_parent_connectable_interface->disconnect(connectable); drum = (AgsDrum *) gtk_widget_get_ancestor((GtkWidget *) drum_output_line, AGS_TYPE_DRUM); g_signal_handlers_disconnect_by_data(drum, drum_output_line); } void ags_drum_output_line_set_channel(AgsLine *line, AgsChannel *channel) { AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; /* call parent */ AGS_LINE_CLASS(ags_drum_output_line_parent_class)->set_channel(line, channel); if(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(first_recycling); } } void ags_drum_output_line_map_recall(AgsLine *line, guint output_pad_start) { AgsAudio *audio; AgsChannel *output; guint input_pads; guint audio_channels; if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 || (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){ return; } output = line->channel; /* get some fields */ g_object_get(output, "audio", &audio, NULL); /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ guint pad, audio_channel; /* get some fields */ g_object_get(output, "pad", &pad, "audio-channel", &audio_channel, NULL); /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } /* call parent */ AGS_LINE_CLASS(ags_drum_output_line_parent_class)->map_recall(line, output_pad_start); g_object_unref(audio); } /** * ags_drum_output_line_new: * @channel: the assigned channel * * Create a new instance of #AgsDrumOutputLine * * Returns: the new #AgsDrumOutputLine * * Since: 3.0.0 */ AgsDrumOutputLine* ags_drum_output_line_new(AgsChannel *channel) { AgsDrumOutputLine *drum_output_line; drum_output_line = (AgsDrumOutputLine *) g_object_new(AGS_TYPE_DRUM_OUTPUT_LINE, "channel", channel, NULL); return(drum_output_line); } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bulk_input.c0000644000175000017500000001146213607210264020234 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_ffplayer_bulk_input_class_init(AgsFFPlayerBulkInputClass *ffplayer_bulk_input); void ags_ffplayer_bulk_input_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ffplayer_bulk_input_init(AgsFFPlayerBulkInput *ffplayer_bulk_input); void ags_ffplayer_bulk_input_connect(AgsConnectable *connectable); void ags_ffplayer_bulk_input_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ffplayer_bulk_input * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsFFPlayerBulkInput * @section_id: * @include: ags/X/machine/gs_ffplayer_bulk_input.h * * #AgsFFPlayerBulkInput is a composite widget to visualize one #AgsChannel. It should be * packed by an #AgsFFPlayerBulkInput. */ static gpointer ags_ffplayer_bulk_input_parent_class = NULL; static AgsConnectableInterface *ags_ffplayer_bulk_input_parent_connectable_interface; GType ags_ffplayer_bulk_input_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ffplayer_bulk_input = 0; static const GTypeInfo ags_ffplayer_bulk_input_info = { sizeof(AgsFFPlayerBulkInputClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ffplayer_bulk_input_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFFPlayerBulkInput), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ffplayer_bulk_input_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ffplayer_bulk_input_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ffplayer_bulk_input = g_type_register_static(AGS_TYPE_EFFECT_BULK, "AgsFFPlayerBulkInput", &ags_ffplayer_bulk_input_info, 0); g_type_add_interface_static(ags_type_ffplayer_bulk_input, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ffplayer_bulk_input); } return g_define_type_id__volatile; } void ags_ffplayer_bulk_input_class_init(AgsFFPlayerBulkInputClass *ffplayer_bulk_input) { ags_ffplayer_bulk_input_parent_class = g_type_class_peek_parent(ffplayer_bulk_input); } void ags_ffplayer_bulk_input_connectable_interface_init(AgsConnectableInterface *connectable) { ags_ffplayer_bulk_input_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ffplayer_bulk_input_connect; connectable->disconnect = ags_ffplayer_bulk_input_disconnect; } void ags_ffplayer_bulk_input_init(AgsFFPlayerBulkInput *ffplayer_bulk_input) { AGS_EFFECT_BULK(ffplayer_bulk_input)->channel_type = AGS_TYPE_INPUT; } void ags_ffplayer_bulk_input_connect(AgsConnectable *connectable) { if((AGS_EFFECT_BULK_CONNECTED & (AGS_EFFECT_BULK(connectable)->flags)) != 0){ return; } ags_ffplayer_bulk_input_parent_connectable_interface->connect(connectable); //TODO:JK: implement me } void ags_ffplayer_bulk_input_disconnect(AgsConnectable *connectable) { if((AGS_EFFECT_BULK_CONNECTED & (AGS_EFFECT_BULK(connectable)->flags)) == 0){ return; } ags_ffplayer_bulk_input_parent_connectable_interface->disconnect(connectable); //TODO:JK: implement me } /** * ags_ffplayer_bulk_input_new: * @audio: the #AgsAudio to visualize * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * * Creates an #AgsFFPlayerBulkInput * * Returns: a new #AgsFFPlayerBulkInput * * Since: 3.0.0 */ AgsFFPlayerBulkInput* ags_ffplayer_bulk_input_new(AgsAudio *audio, GType channel_type) { AgsFFPlayerBulkInput *ffplayer_bulk_input; ffplayer_bulk_input = (AgsFFPlayerBulkInput *) g_object_new(AGS_TYPE_FFPLAYER_BULK_INPUT, "audio", audio, "channel-type", channel_type, NULL); return(ffplayer_bulk_input); } gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler_file_callbacks.h0000644000175000017500000000213613607210263022022 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PITCH_SAMPLER_FILE_CALLBACKS_H__ #define __AGS_PITCH_SAMPLER_FILE_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_PITCH_SAMPLER_FILE_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_fm_synth_input_pad.c0000644000175000017500000001250513607210263020060 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_fm_synth_input_pad_class_init(AgsFMSynthInputPadClass *fm_synth_input_pad); void ags_fm_synth_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_fm_synth_input_pad_init(AgsFMSynthInputPad *fm_synth_input_pad); void ags_fm_synth_input_pad_connect(AgsConnectable *connectable); void ags_fm_synth_input_pad_disconnect(AgsConnectable *connectable); void ags_fm_synth_input_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_fm_synth_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); /** * SECTION:ags_fm_synth_input_pad * @short_description: fm synth input pad * @title: AgsFMSynthInputPad * @section_id: * @include: ags/X/machine/ags_fm_synth_input_pad.h * * The #AgsFMSynthInputPad is a composite widget to act as fm synth input pad. */ static gpointer ags_fm_synth_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_fm_synth_input_pad_parent_connectable_interface; GType ags_fm_synth_input_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_fm_synth_input_pad = 0; static const GTypeInfo ags_fm_synth_input_pad_info = { sizeof(AgsFMSynthInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_fm_synth_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFMSynthInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_fm_synth_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_fm_synth_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_fm_synth_input_pad = g_type_register_static(AGS_TYPE_PAD, "AgsFMSynthInputPad", &ags_fm_synth_input_pad_info, 0); g_type_add_interface_static(ags_type_fm_synth_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_fm_synth_input_pad); } return g_define_type_id__volatile; } void ags_fm_synth_input_pad_class_init(AgsFMSynthInputPadClass *fm_synth_input_pad) { AgsPadClass *pad; ags_fm_synth_input_pad_parent_class = g_type_class_peek_parent(fm_synth_input_pad); pad = (AgsPadClass *) fm_synth_input_pad; pad->set_channel = ags_fm_synth_input_pad_set_channel; pad->resize_lines = ags_fm_synth_input_pad_resize_lines; } void ags_fm_synth_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_fm_synth_input_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_fm_synth_input_pad_connect; connectable->disconnect = ags_fm_synth_input_pad_disconnect; } void ags_fm_synth_input_pad_init(AgsFMSynthInputPad *fm_synth_input_pad) { fm_synth_input_pad->name = NULL; fm_synth_input_pad->xml_type = "ags-fm_synth-input-pad"; } void ags_fm_synth_input_pad_connect(AgsConnectable *connectable) { AgsFMSynthInputPad *fm_synth_input_pad; /* AgsFMSynthInputPad */ fm_synth_input_pad = AGS_FM_SYNTH_INPUT_PAD(connectable); if((AGS_PAD_CONNECTED & (AGS_PAD(fm_synth_input_pad)->flags)) != 0){ return; } ags_fm_synth_input_pad_parent_connectable_interface->connect(connectable); } void ags_fm_synth_input_pad_disconnect(AgsConnectable *connectable) { ags_fm_synth_input_pad_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_fm_synth_input_pad_set_channel(AgsPad *pad, AgsChannel *channel) { AGS_PAD_CLASS(ags_fm_synth_input_pad_parent_class)->set_channel(pad, channel); /* empty */ } void ags_fm_synth_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AGS_PAD_CLASS(ags_fm_synth_input_pad_parent_class)->resize_lines(pad, line_type, audio_channels, audio_channels_old); /* empty */ } /** * ags_fm_synth_input_pad_new: * @channel: the assigned #AgsChannel * * Create a new instance of #AgsFMSynthInputPad * * Returns: the new #AgsFMSynthInputPad * * Since: 3.0.0 */ AgsFMSynthInputPad* ags_fm_synth_input_pad_new(AgsChannel *channel) { AgsFMSynthInputPad *fm_synth_input_pad; fm_synth_input_pad = (AgsFMSynthInputPad *) g_object_new(AGS_TYPE_FM_SYNTH_INPUT_PAD, "channel", channel, NULL); return(fm_synth_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_fm_synth.h0000644000175000017500000000475313607210263016030 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNTH_H__ #define __AGS_FM_SYNTH_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FM_SYNTH (ags_fm_synth_get_type()) #define AGS_FM_SYNTH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FM_SYNTH, AgsFMSynth)) #define AGS_FM_SYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FM_SYNTH, AgsFMSynthClass)) #define AGS_IS_FM_SYNTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FM_SYNTH)) #define AGS_IS_FM_SYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FM_SYNTH)) #define AGS_FM_SYNTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FM_SYNTH, AgsFMSynthClass)) #define AGS_FM_SYNTH_BASE_NOTE_MAX (72.0) #define AGS_FM_SYNTH_BASE_NOTE_MIN (-72.0) typedef struct _AgsFMSynth AgsFMSynth; typedef struct _AgsFMSynthClass AgsFMSynthClass; typedef enum{ AGS_FM_SYNTH_AUTO_UPDATE = 1, }AgsFMSynthFlags; struct _AgsFMSynth { AgsMachine machine; guint flags; gchar *name; gchar *xml_type; guint mapped_input_pad; guint mapped_output_pad; GtkVBox *input_pad; GtkCheckButton *enable_lfo; GtkCheckButton *auto_update; GtkButton *update; GtkSpinButton *lower; // how many channels until to lowest freq GtkSpinButton *lfo_freq; GtkSpinButton *lfo_phase; GtkSpinButton *lfo_depth; GtkSpinButton *lfo_tuning; }; struct _AgsFMSynthClass { AgsMachineClass machine; }; GType ags_fm_synth_get_type(void); void ags_fm_synth_update(AgsFMSynth *fm_synth); AgsFMSynth* ags_fm_synth_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_FM_SYNTH_H__*/ gsequencer-3.1.3/ags/X/machine/ags_audiorec_callbacks.c0000644000175000017500000001402013607210263017752 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_audiorec_open_response_callback(GtkWidget *widget, gint response, AgsAudiorec *audiorec); void ags_audiorec_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsAudiorec *audiorec) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) audiorec, AGS_TYPE_WINDOW)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_AUDIOREC)->counter); g_object_set(AGS_MACHINE(audiorec), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_AUDIOREC); g_free(str); } void ags_audiorec_open_callback(GtkWidget *button, AgsAudiorec *audiorec) { GtkFileChooserDialog *dialog; if(audiorec->open_dialog != NULL){ return; } audiorec->open_dialog = dialog = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new(i18n("Open audio files"), (GtkWindow *) gtk_widget_get_toplevel((GtkWidget *) audiorec), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_audiorec_open_response_callback), audiorec); } void ags_audiorec_open_response_callback(GtkWidget *widget, gint response, AgsAudiorec *audiorec) { if(response == GTK_RESPONSE_ACCEPT){ gchar *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); gtk_entry_set_text(audiorec->filename, filename); ags_audiorec_open_filename(audiorec, filename); } audiorec->open_dialog = NULL; gtk_widget_destroy(widget); } void ags_audiorec_keep_data_callback(GtkWidget *button, AgsAudiorec *audiorec) { AgsPort *port; GList *start_recall, *recall; GValue playback_value = {0,}; GValue replace_value = {0,}; if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ g_value_init(&playback_value, G_TYPE_BOOLEAN); g_value_set_boolean(&playback_value, FALSE); g_value_init(&replace_value, G_TYPE_BOOLEAN); g_value_set_boolean(&replace_value, FALSE); g_object_get(AGS_MACHINE(audiorec)->audio, "play", &start_recall, NULL); recall = ags_recall_template_find_type(start_recall, AGS_TYPE_CAPTURE_WAVE_AUDIO); if(recall != NULL){ g_object_get(recall->data, "playback", &port, NULL); ags_port_safe_write(port, &playback_value); g_object_unref(port); g_object_get(recall->data, "replace", &port, NULL); ags_port_safe_write(port, &replace_value); g_object_unref(port); } g_value_unset(&playback_value); g_value_unset(&replace_value); g_list_free_full(start_recall, g_object_unref); } } void ags_audiorec_replace_data_callback(GtkWidget *button, AgsAudiorec *audiorec) { AgsPort *port; GList *start_recall, *recall; GValue playback_value = {0,}; GValue replace_value = {0,}; if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ g_value_init(&playback_value, G_TYPE_BOOLEAN); g_value_set_boolean(&playback_value, TRUE); g_value_init(&replace_value, G_TYPE_BOOLEAN); g_value_set_boolean(&replace_value, TRUE); g_object_get(AGS_MACHINE(audiorec)->audio, "play", &start_recall, NULL); recall = ags_recall_template_find_type(start_recall, AGS_TYPE_CAPTURE_WAVE_AUDIO); if(recall != NULL){ g_object_get(recall->data, "playback", &port, NULL); ags_port_safe_write(port, &playback_value); g_object_unref(port); g_object_get(recall->data, "replace", &port, NULL); ags_port_safe_write(port, &replace_value); g_object_unref(port); } g_value_unset(&playback_value); g_value_unset(&replace_value); g_list_free_full(start_recall, g_object_unref); } } void ags_audiorec_mix_data_callback(GtkWidget *button, AgsAudiorec *audiorec) { AgsPort *port; GList *start_recall, *recall; GValue playback_value = {0,}; GValue replace_value = {0,}; if(gtk_toggle_button_get_active((GtkToggleButton *) button)){ g_value_init(&playback_value, G_TYPE_BOOLEAN); g_value_set_boolean(&playback_value, TRUE); g_value_init(&replace_value, G_TYPE_BOOLEAN); g_value_set_boolean(&replace_value, FALSE); g_object_get(AGS_MACHINE(audiorec)->audio, "play", &start_recall, NULL); recall = ags_recall_template_find_type(start_recall, AGS_TYPE_CAPTURE_WAVE_AUDIO); if(recall != NULL){ g_object_get(recall->data, "playback", &port, NULL); ags_port_safe_write(port, &playback_value); g_object_unref(port); g_object_get(recall->data, "replace", &port, NULL); ags_port_safe_write(port, &replace_value); g_object_unref(port); } g_value_unset(&playback_value); g_value_unset(&replace_value); g_list_free_full(start_recall, g_object_unref); } } gsequencer-3.1.3/ags/X/machine/ags_desk_input_pad_callbacks.c0000644000175000017500000000147313605312647021167 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/machine/ags_matrix.c0000644000175000017500000007020113607210263015467 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_matrix_class_init(AgsMatrixClass *matrix); void ags_matrix_connectable_interface_init(AgsConnectableInterface *connectable); void ags_matrix_init(AgsMatrix *matrix); void ags_matrix_finalize(GObject *gobject); void ags_matrix_connect(AgsConnectable *connectable); void ags_matrix_disconnect(AgsConnectable *connectable); void ags_matrix_map_recall(AgsMachine *machine); void ags_matrix_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_matrix_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data); #define AGS_MATRIX_INPUT_LINE_MAPPED_KEY "AGS_MATRIX_INPUT_LINE_MAPPED_KEY" #define AGS_MATRIX_INPUT_LINE_MAPPED_DATA "AGS_MATRIX_INPUT_LINE_MAPPED_DATA" /** * SECTION:ags_matrix * @short_description: matrix sequencer * @title: AgsMatrix * @section_id: * @include: ags/X/machine/ags_matrix.h * * The #AgsMatrix is a composite widget to act as matrix sequencer. */ static gpointer ags_matrix_parent_class = NULL; static AgsConnectableInterface *ags_matrix_parent_connectable_interface; const char *AGS_MATRIX_INDEX = "AgsMatrixIndex"; GType ags_matrix_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_matrix = 0; static const GTypeInfo ags_matrix_info = { sizeof(AgsMatrixClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_matrix_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMatrix), 0, /* n_preallocs */ (GInstanceInitFunc) ags_matrix_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_matrix_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_matrix = g_type_register_static(AGS_TYPE_MACHINE, "AgsMatrix", &ags_matrix_info, 0); g_type_add_interface_static(ags_type_matrix, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_matrix); } return g_define_type_id__volatile; } void ags_matrix_class_init(AgsMatrixClass *matrix) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_matrix_parent_class = g_type_class_peek_parent(matrix); /* GObjectClass */ gobject = (GObjectClass *) matrix; gobject->finalize = ags_matrix_finalize; /* AgsMachine */ machine = (AgsMachineClass *) matrix; machine->map_recall = ags_matrix_map_recall; } void ags_matrix_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_matrix_connectable_parent_interface; ags_matrix_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_matrix_connect; connectable->disconnect = ags_matrix_disconnect; } void ags_matrix_init(AgsMatrix *matrix) { GtkFrame *frame; GtkTable *table; GtkToggleButton *button; GtkVBox *vbox; GtkHBox *hbox; AgsAudio *audio; GList *list; int i, j; g_signal_connect_after((GObject *) matrix, "parent_set", G_CALLBACK(ags_matrix_parent_set_callback), (gpointer) matrix); audio = AGS_MACHINE(matrix)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_PATTERN_MODE | AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); g_object_set(audio, "min-audio-channels", 1, "max-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); audio->bank_dim[0] = 1; audio->bank_dim[1] = 9; audio->bank_dim[2] = 32; AGS_MACHINE(matrix)->flags |= (AGS_MACHINE_REVERSE_NOTATION); ags_machine_popup_add_connection_options((AgsMachine *) matrix, (AGS_MACHINE_POPUP_MIDI_DIALOG)); AGS_MACHINE(matrix)->input_pad_type = G_TYPE_NONE; AGS_MACHINE(matrix)->input_line_type = G_TYPE_NONE; AGS_MACHINE(matrix)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(matrix)->output_line_type = G_TYPE_NONE; g_signal_connect_after(G_OBJECT(matrix), "resize-audio-channels", G_CALLBACK(ags_matrix_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(matrix), "resize-pads", G_CALLBACK(ags_matrix_resize_pads), NULL); /* */ AGS_MACHINE(matrix)->flags |= (AGS_MACHINE_IS_SEQUENCER | AGS_MACHINE_REVERSE_NOTATION); AGS_MACHINE(matrix)->mapping_flags |= AGS_MACHINE_MONO; matrix->flags = 0; matrix->name = NULL; matrix->xml_type = "ags-matrix"; matrix->mapped_input_pad = 0; matrix->mapped_output_pad = 0; ags_machine_popup_add_edit_options((AgsMachine *) matrix, (AGS_MACHINE_POPUP_COPY_PATTERN | AGS_MACHINE_POPUP_ENVELOPE)); /* create widgets */ frame = (GtkFrame *) (gtk_bin_get_child((GtkBin *) matrix)); matrix->table = (GtkTable *) gtk_table_new(4, 4, FALSE); gtk_container_add((GtkContainer *) frame, (GtkWidget *) matrix->table); AGS_MACHINE(matrix)->play = matrix->run = (GtkToggleButton *) gtk_toggle_button_new_with_label("run"); gtk_table_attach(matrix->table, (GtkWidget *) matrix->run, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); table = (GtkTable *) gtk_table_new(3, 3, FALSE); gtk_table_attach(matrix->table, (GtkWidget *) table, 1, 2, 0, 2, GTK_FILL, GTK_FILL, 0, 0); matrix->selected = NULL; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ //TODO:JK: verify leak of string matrix->index[i * 3 + j] = button = (GtkToggleButton *) gtk_toggle_button_new_with_label(g_strdup_printf("%d", i * 3 + j +1)); g_object_set_data((GObject *) button, AGS_MATRIX_INDEX, GUINT_TO_POINTER(i * 3 + j)); gtk_table_attach(table, (GtkWidget *) button, j, j +1, i, i +1, GTK_FILL, GTK_FILL, 0, 0); } } matrix->selected = matrix->index[0]; gtk_toggle_button_set_active(matrix->selected, TRUE); /* sequencer */ matrix->cell_pattern = ags_cell_pattern_new(); gtk_table_attach(matrix->table, (GtkWidget *) matrix->cell_pattern, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* length and loop */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_table_attach(matrix->table, (GtkWidget *) vbox, 3, 4, 0, 1, GTK_FILL, GTK_FILL, 0, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, gtk_label_new("length"), FALSE, FALSE, 0); matrix->length_spin = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 32.0, 1.0); gtk_spin_button_set_value(matrix->length_spin, 16.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) matrix->length_spin, FALSE, FALSE, 0); matrix->loop_button = (GtkCheckButton *) gtk_check_button_new_with_label("loop"); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) matrix->loop_button, FALSE, FALSE, 0); } void ags_matrix_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_matrix_parent_class)->finalize(gobject); } void ags_matrix_connect(AgsConnectable *connectable) { AgsMatrix *matrix; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } /* call parent */ ags_matrix_parent_connectable_interface->connect(connectable); /* AgsMatrix */ matrix = AGS_MATRIX(connectable); for(i = 0; i < 9; i++){ g_signal_connect(G_OBJECT (matrix->index[i]), "clicked", G_CALLBACK (ags_matrix_index_callback), (gpointer) matrix); } ags_connectable_connect(AGS_CONNECTABLE(matrix->cell_pattern)); g_signal_connect_after((GObject *) matrix->length_spin, "value-changed", G_CALLBACK(ags_matrix_length_spin_callback), (gpointer) matrix); g_signal_connect((GObject *) matrix->loop_button, "clicked", G_CALLBACK(ags_matrix_loop_button_callback), (gpointer) matrix); g_signal_connect_after(G_OBJECT(matrix), "stop", G_CALLBACK(ags_matrix_stop_callback), NULL); } void ags_matrix_disconnect(AgsConnectable *connectable) { AgsMatrix *matrix; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } /* AgsMatrix */ matrix = AGS_MATRIX(connectable); for(i = 0; i < 9; i++){ g_object_disconnect(G_OBJECT (matrix->index[i]), "any_signal::clicked", G_CALLBACK (ags_matrix_index_callback), (gpointer) matrix, NULL); } ags_connectable_disconnect(AGS_CONNECTABLE(matrix->cell_pattern)); g_object_disconnect((GObject *) matrix->length_spin, "any_signal::value-changed", G_CALLBACK(ags_matrix_length_spin_callback), (gpointer) matrix, NULL); g_object_disconnect((GObject *) matrix->loop_button, "any_signal::clicked", G_CALLBACK(ags_matrix_loop_button_callback), (gpointer) matrix, NULL); g_object_disconnect(G_OBJECT(matrix), "any_signal::stop", G_CALLBACK(ags_matrix_stop_callback), NULL, NULL); /* call parent */ ags_matrix_parent_connectable_interface->disconnect(connectable); } void ags_matrix_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { g_message("AgsMatrix only pads can be adjusted"); } void ags_matrix_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsMatrix *matrix; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsAudioSignal *audio_signal; guint i, j; gboolean grow; matrix = (AgsMatrix *) machine; audio = machine->audio; if(pads == pads_old){ return; } /* set size request if needed */ start_output = NULL; start_input = NULL; if(g_type_is_a(type, AGS_TYPE_INPUT)){ gtk_adjustment_set_upper(gtk_range_get_adjustment(GTK_RANGE(matrix->cell_pattern->vscrollbar)), (double) pads); if(pads < AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ // gtk_widget_set_size_request((GtkWidget *) matrix->cell_pattern, // -1, // pads * matrix->cell_pattern->cell_height + AGS_LED_DEFAULT_HEIGHT + 2); }else if(pads_old < AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ // gtk_widget_set_size_request((GtkWidget *) matrix->cell_pattern, // -1, // AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY * matrix->cell_pattern->cell_height + AGS_LED_DEFAULT_HEIGHT + 2); } } if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(g_type_is_a(type, AGS_TYPE_INPUT)){ g_object_get(audio, "input", &start_input, NULL); if(grow){ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_matrix_input_map_recall(matrix, pads_old); } }else{ matrix->mapped_input_pad = pads; } if(start_input != NULL){ g_object_unref(start_input); } }else{ if(grow){ g_object_get(audio, "output", &start_output, NULL); nth_channel = ags_channel_nth(start_output, pads_old); channel = nth_channel; while(channel != NULL){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_matrix_output_map_recall(matrix, pads_old); } }else{ matrix->mapped_output_pad = pads; } if(start_output != NULL){ g_object_unref(start_output); } } } void ags_matrix_map_recall(AgsMachine *machine) { AgsWindow *window; AgsMatrix *matrix; AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsCopyPatternAudio *recall_copy_pattern_audio; AgsCopyPatternAudioRun *recall_copy_pattern_audio_run; AgsPlayNotationAudio *play_notation; AgsCopyPatternChannel *copy_pattern_channel; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *start_play, *play; GList *start_recall, *recall; guint input_pads; guint audio_channels; guint i, j; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); matrix = AGS_MATRIX(machine); audio = machine->audio; /* get some fields */ g_object_get(audio, "input", &start_input, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-copy-pattern */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy-pattern", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_RECALL), 0); g_object_get(audio, "recall", &start_recall, NULL); recall = ags_recall_find_type(start_recall, AGS_TYPE_COPY_PATTERN_AUDIO_RUN); if(recall != NULL){ recall_copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(recall->data); /* set dependency */ g_object_set(G_OBJECT(recall_copy_pattern_audio_run), "delay-audio-run", play_delay_audio_run, "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_recall, g_object_unref); /* set pattern object on port */ nth_channel = ags_channel_pad_nth(start_input, 0); channel = nth_channel; for(i = 0; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPort *port; GList *start_list, *list; GList *pattern; GValue pattern_value = {0,}; g_object_get(channel, "recall", &start_list, NULL); /* ags-copy-pattern-channel */ list = ags_recall_template_find_type(start_list, AGS_TYPE_COPY_PATTERN_CHANNEL); if(list != NULL){ copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(list->data); g_object_get(copy_pattern_channel, "pattern", &port, NULL); g_object_get(channel, "pattern", &pattern, NULL); g_value_init(&pattern_value, G_TYPE_OBJECT); g_value_set_object(&pattern_value, pattern->data); ags_port_safe_write(port, &pattern_value); g_object_unref(port); g_list_free_full(pattern, g_object_unref); } g_list_free_full(start_list, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_matrix_input_map_recall(matrix, 0); /* depending on destination */ ags_matrix_output_map_recall(matrix, 0); AGS_MACHINE_CLASS(ags_matrix_parent_class)->map_recall(machine); if(start_input != NULL){ g_object_unref(start_input); } } void ags_matrix_input_map_recall(AgsMatrix *matrix, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsCopyPatternChannel *copy_pattern_channel; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(matrix->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(matrix)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); if(audio_channels == 0){ return; } /* ags-copy-pattern */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy-pattern", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_REMAP | AGS_RECALL_FACTORY_RECALL), 0); /* set pattern object on port */ nth_channel = ags_channel_pad_nth(start_input, input_pad_start); channel = nth_channel; for(i = 0; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPort *port; GList *start_list, *list; GList *pattern; GValue pattern_value = {0,}; g_object_get(channel, "recall", &start_list, NULL); /* ags-copy-pattern-channel */ list = ags_recall_template_find_type(start_list, AGS_TYPE_COPY_PATTERN_CHANNEL); if(list != NULL){ copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(list->data); g_object_get(copy_pattern_channel, "pattern", &port, NULL); g_object_get(channel, "pattern", &pattern, NULL); g_value_init(&pattern_value, G_TYPE_OBJECT); g_value_set_object(&pattern_value, pattern->data); ags_port_safe_write(port, &pattern_value); g_object_unref(port); g_list_free_full(pattern, g_object_unref); } g_list_free_full(start_list, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!ags_recall_global_get_rt_safe()){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } matrix->mapped_input_pad = input_pads; g_object_unref(start_input); } void ags_matrix_output_map_recall(AgsMatrix *matrix, guint output_pad_start) { AgsAudio *audio; guint input_pad_start; guint output_pads, input_pads; guint audio_channels; if(matrix->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(matrix)->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); input_pad_start = 0; if(audio_channels == 0){ return; } /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } matrix->mapped_output_pad = output_pads; } /** * ags_matrix_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsMatrix * * Returns: the new #AgsMatrix * * Since: 3.0.0 */ AgsMatrix* ags_matrix_new(GObject *soundcard) { AgsMatrix *matrix; matrix = (AgsMatrix *) g_object_new(AGS_TYPE_MATRIX, NULL); g_object_set(AGS_MACHINE(matrix)->audio, "output-soundcard", soundcard, NULL); return(matrix); } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_line_callbacks.c0000644000175000017500000000307213607210263022222 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_ffplayer_input_line_notify_channel_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsFFPlayerInputLine *ffplayer_input_line; AgsChannel *channel; gchar *str; guint pad, audio_channel; ffplayer_input_line = AGS_FFPLAYER_INPUT_LINE(gobject); if(AGS_EFFECT_LINE(ffplayer_input_line)->channel == NULL){ return; } channel = AGS_EFFECT_LINE(ffplayer_input_line)->channel; /* get channel properties */ g_object_get(channel, "pad", &pad, "audio-channel", &audio_channel, NULL); /* create label */ str = g_strdup_printf("in: %d, %d", pad + 1, audio_channel + 1); gtk_label_set_text(AGS_EFFECT_LINE(ffplayer_input_line)->label, str); g_free(str); } gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler_file_callbacks.c0000644000175000017500000000166513605312647022032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include gsequencer-3.1.3/ags/X/machine/ags_ffplayer_callbacks.h0000644000175000017500000000365013607210263020003 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_CALLBACKS_H__ #define __AGS_FFPLAYER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_ffplayer_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsFFPlayer *ffplayer); void ags_ffplayer_destroy_callback(GtkWidget *widget, AgsFFPlayer *ffplayer); void ags_ffplayer_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsFFPlayer *ffplayer); void ags_ffplayer_open_clicked_callback(GtkWidget *widget, AgsFFPlayer *ffplayer); void ags_ffplayer_open_dialog_response_callback(GtkWidget *widget, gint response, AgsMachine *machine); void ags_ffplayer_preset_changed_callback(GtkComboBox *preset, AgsFFPlayer *ffplayer); void ags_ffplayer_instrument_changed_callback(GtkComboBox *instrument, AgsFFPlayer *ffplayer); gboolean ags_ffplayer_drawing_area_button_press_callback(GtkWidget *widget, AgsFFPlayer *ffplayer); void ags_ffplayer_hscrollbar_value_changed(GtkAdjustment *adjustment, AgsFFPlayer *ffplayer); G_END_DECLS #endif /*__AGS_FFPLAYER_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_audiorec.c0000644000175000017500000007527513607210263015776 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_audiorec_class_init(AgsAudiorecClass *audiorec); void ags_audiorec_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audiorec_init(AgsAudiorec *audiorec); void ags_audiorec_finalize(GObject *gobject); void ags_audiorec_connect(AgsConnectable *connectable); void ags_audiorec_disconnect(AgsConnectable *connectable); void ags_audiorec_show(GtkWidget *widget); void ags_audiorec_show_all(GtkWidget *widget); void ags_audiorec_map_recall(AgsMachine *machine); void ags_audiorec_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_audiorec_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data); void ags_audiorec_output_map_recall(AgsAudiorec *audiorec, guint output_pad_start); void ags_audiorec_input_map_recall(AgsAudiorec *audiorec, guint input_pad_start); /** * SECTION:ags_audiorec * @short_description: record audio data * @title: AgsAudiorec * @section_id: * @include: ags/X/machine/ags_audiorec.h * * The #AgsAudiorec is a composite widget to act as capture source. */ static gpointer ags_audiorec_parent_class = NULL; static AgsConnectableInterface *ags_audiorec_parent_connectable_interface; GHashTable *ags_audiorec_wave_loader_completed = NULL; GHashTable *ags_audiorec_indicator_queue_draw = NULL; GType ags_audiorec_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audiorec = 0; static const GTypeInfo ags_audiorec_info = { sizeof(AgsAudiorecClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audiorec_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudiorec), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audiorec_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audiorec_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audiorec = g_type_register_static(AGS_TYPE_MACHINE, "AgsAudiorec", &ags_audiorec_info, 0); g_type_add_interface_static(ags_type_audiorec, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audiorec); } return g_define_type_id__volatile; } void ags_audiorec_class_init(AgsAudiorecClass *audiorec) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_audiorec_parent_class = g_type_class_peek_parent(audiorec); /* GObjectClass */ gobject = (GObjectClass *) audiorec; gobject->finalize = ags_audiorec_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) audiorec; widget->show = ags_audiorec_show; widget->show_all = ags_audiorec_show_all; /* AgsMachineClass */ machine = (AgsMachineClass *) audiorec; machine->map_recall = ags_audiorec_map_recall; } void ags_audiorec_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_audiorec_connectable_parent_interface; ags_audiorec_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_audiorec_connect; } void ags_audiorec_init(AgsAudiorec *audiorec) { GtkHBox *hbox; GtkHBox *vbox; GtkHBox *filename_hbox; GtkHBox *radio_hbox; GtkFrame *frame; GtkLabel *label; AgsAudio *audio; g_signal_connect_after((GObject *) audiorec, "parent_set", G_CALLBACK(ags_audiorec_parent_set_callback), (gpointer) audiorec); audio = AGS_MACHINE(audiorec)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_WAVE)); AGS_MACHINE(audiorec)->flags |= (AGS_MACHINE_IS_WAVE_PLAYER); /* audio resize */ g_signal_connect_after(G_OBJECT(audiorec), "resize-audio-channels", G_CALLBACK(ags_audiorec_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(audiorec), "resize-pads", G_CALLBACK(ags_audiorec_resize_pads), NULL); /* mapped IO */ audiorec->mapped_input_pad = 0; audiorec->mapped_output_pad = 0; /* name and xml type */ audiorec->name = NULL; audiorec->xml_type = "ags-audiorec"; /* context menu */ ags_machine_popup_add_connection_options((AgsMachine *) audiorec, (AGS_MACHINE_POPUP_CONNECTION_EDITOR)); AGS_MACHINE(audiorec)->connection_flags |= AGS_MACHINE_SHOW_AUDIO_INPUT_CONNECTION; ags_machine_popup_add_export_options((AgsMachine *) audiorec, (AGS_MACHINE_POPUP_WAVE_EXPORT)); /* hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) (gtk_bin_get_child((GtkBin *) audiorec)), (GtkWidget *) hbox); /* frame - filename and open */ frame = (GtkFrame *) gtk_frame_new(i18n("file")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) frame, FALSE, FALSE, 0); vbox = (GtkHBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) frame, (GtkWidget *) vbox); /* filename */ filename_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) filename_hbox, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("filename: ")); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) label, FALSE, FALSE, 0); audiorec->filename = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) audiorec->filename, FALSE, FALSE, 0); audiorec->open = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) audiorec->open, FALSE, FALSE, 0); audiorec->wave_loader = NULL; audiorec->position = -1; audiorec->loading = (GtkLabel *) gtk_label_new(i18n("loading ... ")); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) audiorec->loading, FALSE, FALSE, 0); gtk_widget_set_no_show_all((GtkWidget *) audiorec->loading, TRUE); gtk_widget_hide((GtkWidget *) audiorec->loading); /* radio */ radio_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) radio_hbox, FALSE, FALSE, 0); audiorec->keep_data = (GtkRadioButton *) gtk_radio_button_new_with_label_from_widget(NULL, "keep"); gtk_box_pack_start((GtkBox *) radio_hbox, (GtkWidget *) audiorec->keep_data, FALSE, FALSE, 0); audiorec->replace_data = (GtkRadioButton *) gtk_radio_button_new_with_label_from_widget(audiorec->keep_data, "replace"); gtk_box_pack_start((GtkBox *) radio_hbox, (GtkWidget *) audiorec->replace_data, FALSE, FALSE, 0); audiorec->mix_data = (GtkRadioButton *) gtk_radio_button_new_with_label_from_widget(audiorec->keep_data, "mix"); gtk_box_pack_start((GtkBox *) radio_hbox, (GtkWidget *) audiorec->mix_data, FALSE, FALSE, 0); /* frame - hindicator */ frame = (GtkFrame *) gtk_frame_new(i18n("input")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) frame, FALSE, FALSE, 0); audiorec->hindicator_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) frame, (GtkWidget *) audiorec->hindicator_vbox); /* dialog */ audiorec->open_dialog = NULL; /* wave_loader */ if(ags_audiorec_wave_loader_completed == NULL){ ags_audiorec_wave_loader_completed = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_audiorec_wave_loader_completed, audiorec, ags_audiorec_wave_loader_completed_timeout); g_timeout_add(1000 / 4, (GSourceFunc) ags_audiorec_wave_loader_completed_timeout, (gpointer) audiorec); /* indicator */ if(ags_audiorec_indicator_queue_draw == NULL){ ags_audiorec_indicator_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_audiorec_indicator_queue_draw, audiorec, ags_audiorec_indicator_queue_draw_timeout); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_audiorec_indicator_queue_draw_timeout, (gpointer) audiorec); } void ags_audiorec_finalize(GObject *gobject) { AgsAudiorec *audiorec; audiorec = (AgsAudiorec *) gobject; g_hash_table_remove(ags_audiorec_wave_loader_completed, audiorec); g_hash_table_remove(ags_audiorec_indicator_queue_draw, audiorec); /* call parent */ G_OBJECT_CLASS(ags_audiorec_parent_class)->finalize(gobject); } void ags_audiorec_connect(AgsConnectable *connectable) { AgsWindow *window; AgsAudiorec *audiorec; GList *list; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_audiorec_parent_connectable_interface->connect(connectable); audiorec = AGS_AUDIOREC(connectable); /* filename */ g_signal_connect(audiorec->open, "clicked", G_CALLBACK(ags_audiorec_open_callback), audiorec); /* mode */ g_signal_connect_after(audiorec->keep_data, "clicked", G_CALLBACK(ags_audiorec_keep_data_callback), audiorec); g_signal_connect_after(audiorec->mix_data, "clicked", G_CALLBACK(ags_audiorec_mix_data_callback), audiorec); g_signal_connect_after(audiorec->replace_data, "clicked", G_CALLBACK(ags_audiorec_replace_data_callback), audiorec); } void ags_audiorec_disconnect(AgsConnectable *connectable) { AgsAudiorec *audiorec; GList *list; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_audiorec_parent_connectable_interface->disconnect(connectable); audiorec = AGS_AUDIOREC(connectable); /* filename */ g_object_disconnect(audiorec->open, "any_signal::clicked", G_CALLBACK(ags_audiorec_open_callback), audiorec, NULL); /* mode */ g_object_disconnect(audiorec->keep_data, "any_signal::clicked", G_CALLBACK(ags_audiorec_keep_data_callback), audiorec, NULL); g_object_disconnect(audiorec->replace_data, "any_signal::clicked", G_CALLBACK(ags_audiorec_replace_data_callback), audiorec, NULL); g_object_disconnect(audiorec->mix_data, "any_signal::clicked", G_CALLBACK(ags_audiorec_mix_data_callback), audiorec, NULL); } void ags_audiorec_show(GtkWidget *widget) { /* call parent */ GTK_WIDGET_CLASS(ags_audiorec_parent_class)->show(widget); } void ags_audiorec_show_all(GtkWidget *widget) { /* call parent */ GTK_WIDGET_CLASS(ags_audiorec_parent_class)->show_all(widget); } void ags_audiorec_map_recall(AgsMachine *machine) { AgsWindow *window; AgsAudiorec *audiorec; AgsAudio *audio; AgsPlayWaveAudioRun *play_wave_audio_run; AgsCaptureWaveAudioRun *capture_wave_audio_run; GList *start_play, *play; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } audiorec = AGS_AUDIOREC(machine); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-play-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-wave", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_WAVE_AUDIO_RUN); if(play != NULL){ GValue value = {0,}; play_wave_audio_run = play->data; /* wave loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_PLAY_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(play_wave_audio_run)->recall_audio)->wave_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_PLAY_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(play_wave_audio_run)->recall_audio)->wave_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_PLAY_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(play_wave_audio_run)->recall_audio)->wave_loop_end, &value); } g_list_free_full(start_play, g_object_unref); /* ags-capture-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-capture-wave", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN); if(play != NULL){ GValue value = {0,}; capture_wave_audio_run = play->data; /* wave loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_CAPTURE_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(capture_wave_audio_run)->recall_audio)->wave_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_CAPTURE_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(capture_wave_audio_run)->recall_audio)->wave_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_CAPTURE_WAVE_AUDIO(AGS_RECALL_AUDIO_RUN(capture_wave_audio_run)->recall_audio)->wave_loop_end, &value); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_audiorec_input_map_recall(audiorec, 0); /* depending on destination */ ags_audiorec_output_map_recall(audiorec, 0); /* call parent */ AGS_MACHINE_CLASS(ags_audiorec_parent_class)->map_recall(machine); } void ags_audiorec_output_map_recall(AgsAudiorec *audiorec, guint output_pad_start) { AgsWindow *window; AgsAudio *audio; AgsChannel *start_output; AgsChannel *output, *next_output, *nth_output; guint output_pads; guint audio_channels; if(audiorec->mapped_output_pad > output_pad_start){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) audiorec, AGS_TYPE_WINDOW); audio = AGS_MACHINE(audiorec)->audio; g_object_get(audio, "output", &start_output, "output-pads", &output_pads, "audio-channels", &audio_channels, NULL); /* ags-peak */ ags_recall_factory_create(audio, NULL, NULL, "ags-peak", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-play-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-wave", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); nth_output = ags_channel_pad_nth(start_output, output_pad_start); output = nth_output; next_output = NULL; while(output != NULL){ GList *start_play, *play; g_object_get(output, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_WAVE_CHANNEL_RUN); if(play != NULL){ GValue value = {0,}; ags_seekable_seek(AGS_SEEKABLE(play->data), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); } g_list_free_full(start_play, g_object_unref); /* iterate */ next_output = ags_channel_next(output); g_object_unref(output); output = next_output; } if(next_output != NULL){ g_object_unref(next_output); } /* ags-capture-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-capture-wave", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); nth_output = ags_channel_pad_nth(start_output, output_pad_start); output = nth_output; next_output = NULL; while(output != NULL){ GList *start_play, *play; g_object_get(output, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN); if(play != NULL){ GValue value = {0,}; ags_seekable_seek(AGS_SEEKABLE(play->data), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); } g_list_free_full(start_play, g_object_unref); /* iterate */ next_output = ags_channel_next(output); g_object_unref(output); output = next_output; } if(next_output != NULL){ g_object_unref(next_output); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } audiorec->mapped_output_pad = output_pads; } void ags_audiorec_input_map_recall(AgsAudiorec *audiorec, guint input_pad_start) { AgsAudio *audio; AgsChannel *source, *current; GList *list; guint input_pads; guint audio_channels; if(audiorec->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(audiorec)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); } void ags_audiorec_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudiorec *audiorec; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; AgsConfig *config; gchar *str; gdouble gui_scale_factor; guint output_pads, input_pads; audiorec = AGS_AUDIOREC(machine); audio = AGS_MACHINE(audiorec)->audio; g_object_get(audio, "input-pads", &input_pads, "output-pads", &output_pads, "output", &start_output, NULL); config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } if(audio_channels > audio_channels_old){ AgsHIndicator *hindicator; guint i; /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_pad = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel), nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_WAVE)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } if(next_pad != NULL){ g_object_unref(next_pad); } if(input_pads > 0){ } if(output_pads > 0){ /* AgsOutput */ /* ags-play-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-wave", audio_channels_old, audio_channels, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-capture-wave */ ags_recall_factory_create(audio, NULL, NULL, "ags-capture-wave", audio_channels_old, audio_channels, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-peak */ ags_recall_factory_create(audio, NULL, NULL, "ags-peak", audio_channels, audio_channels_old, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } /* widgets */ for(i = audio_channels_old; i < audio_channels; i++){ hindicator = ags_hindicator_new(); g_object_set(hindicator, "segment-width", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH), "segment-height", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT), "segment-padding", (guint) (gui_scale_factor * AGS_INDICATOR_DEFAULT_SEGMENT_PADDING), NULL); gtk_box_pack_start((GtkBox *) audiorec->hindicator_vbox, (GtkWidget *) hindicator, FALSE, FALSE, 8); } gtk_widget_show_all((GtkWidget *) audiorec->hindicator_vbox); }else{ GList *list, *list_start; list_start = list = gtk_container_get_children((GtkContainer *) audiorec->hindicator_vbox); list = g_list_nth(list_start, audio_channels); while(list != NULL){ gtk_widget_destroy((GtkWidget *) list->data); list = list->next; } g_list_free(list_start); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } } void ags_audiorec_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsAudiorec *audiorec; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; AgsConfig *config; gchar *str; gdouble gui_scale_factor; guint audio_channels; audiorec = AGS_AUDIOREC(machine); audio = machine->audio; config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } if(type == AGS_TYPE_INPUT){ if(pads > pads_old){ AgsHIndicator *hindicator; guint audio_channels; guint i; /* get some fields */ g_object_get(audio, "output", &start_output, "audio-channels", &audio_channels, NULL); /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_WAVE)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } if(start_output != NULL){ g_object_unref(start_output); } for(i = 0; i < audio_channels; i++){ hindicator = ags_hindicator_new(); g_object_set(hindicator, "segment-width", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH), "segment-height", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT), "segment-padding", (guint) (gui_scale_factor * AGS_INDICATOR_DEFAULT_SEGMENT_PADDING), NULL); gtk_box_pack_start((GtkBox *) audiorec->hindicator_vbox, (GtkWidget *) hindicator, FALSE, FALSE, 8); } gtk_widget_show_all((GtkWidget *) audiorec->hindicator_vbox); /* depending on destination */ ags_audiorec_input_map_recall(audiorec, pads_old); }else{ GList *list, *list_start; list_start = list = gtk_container_get_children((GtkContainer *) audiorec->hindicator_vbox); while(list != NULL){ gtk_widget_destroy((GtkWidget *) list->data); list = list->next; } g_list_free(list_start); audiorec->mapped_input_pad = pads; } }else{ if(pads > pads_old){ /* depending on destination */ ags_audiorec_output_map_recall(audiorec, pads_old); }else{ audiorec->mapped_output_pad = pads; } } } void ags_audiorec_open_filename(AgsAudiorec *audiorec, gchar *filename) { AgsWaveLoader *wave_loader; if(!AGS_IS_AUDIOREC(audiorec) || filename == NULL){ return; } audiorec->wave_loader = wave_loader = ags_wave_loader_new(AGS_MACHINE(audiorec)->audio, filename, TRUE); ags_wave_loader_start(wave_loader); } /** * ags_audiorec_wave_loader_completed_timeout: * @audiorec: the #AgsAudiorec * * Queue draw widget * * Returns: %TRUE if proceed poll completed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audiorec_wave_loader_completed_timeout(AgsAudiorec *audiorec) { if(g_hash_table_lookup(ags_audiorec_wave_loader_completed, audiorec) != NULL){ if(audiorec->wave_loader != NULL){ if(ags_wave_loader_test_flags(audiorec->wave_loader, AGS_WAVE_LOADER_HAS_COMPLETED)){ g_object_run_dispose((GObject *) audiorec->wave_loader); g_object_unref(audiorec->wave_loader); audiorec->wave_loader = NULL; audiorec->position = -1; gtk_widget_hide((GtkWidget *) audiorec->loading); }else{ if(audiorec->position == -1){ audiorec->position = 0; gtk_widget_show((GtkWidget *) audiorec->loading); } switch(audiorec->position){ case 0: { audiorec->position = 1; gtk_label_set_label(audiorec->loading, "loading ... "); } break; case 1: { audiorec->position = 2; gtk_label_set_label(audiorec->loading, "loading ... "); } break; case 2: { audiorec->position = 0; gtk_label_set_label(audiorec->loading, "loading ..."); } break; } } } return(TRUE); }else{ return(FALSE); } } /** * ags_audiorec_indicator_queue_draw_timeout: * @audiorec: the #AgsAudiorec * * Queue draw widget * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audiorec_indicator_queue_draw_timeout(AgsAudiorec *audiorec) { if(g_hash_table_lookup(ags_audiorec_indicator_queue_draw, audiorec) != NULL){ AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; GList *list, *list_start; guint i; audio = AGS_MACHINE(audiorec)->audio; g_object_get(audio, "output", &start_channel, NULL); list_start = list = gtk_container_get_children((GtkContainer *) audiorec->hindicator_vbox); /* check members */ channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; list != NULL; i++){ GtkAdjustment *adjustment; GtkWidget *child; AgsPort *current; GList *start_port; gdouble average_peak; gdouble peak; GValue value = {0,}; child = list->data; average_peak = 0.0; start_port = ags_channel_collect_all_channel_ports_by_specifier_and_context(channel, "./peak[0]", TRUE); current = NULL; if(start_port != NULL){ current = start_port->data; } /* recall port - read value */ g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current, &value); peak = g_value_get_float(&value); g_value_unset(&value); /* calculate peak */ average_peak += ((1.0 / (1.0 / peak)) * 10.0); /* apply */ g_object_get(child, "adjustment", &adjustment, NULL); gtk_adjustment_set_value(adjustment, average_peak); /* queue draw */ gtk_widget_queue_draw(child); g_list_free_full(start_port, g_object_unref); /* iterate */ list = list->next; next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } g_list_free(list_start); return(TRUE); }else{ return(FALSE); } } /** * ags_audiorec_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsAudiorec * * Returns: the new #AgsAudiorec * * Since: 3.0.0 */ AgsAudiorec* ags_audiorec_new(GObject *soundcard) { AgsAudiorec *audiorec; audiorec = (AgsAudiorec *) g_object_new(AGS_TYPE_AUDIOREC, NULL); g_object_set(G_OBJECT(AGS_MACHINE(audiorec)->audio), "output-soundcard", soundcard, NULL); return(audiorec); } gsequencer-3.1.3/ags/X/machine/ags_syncsynth.c0000644000175000017500000012425313607262155016243 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_syncsynth_class_init(AgsSyncsynthClass *syncsynth); void ags_syncsynth_connectable_interface_init(AgsConnectableInterface *connectable); void ags_syncsynth_init(AgsSyncsynth *syncsynth); void ags_syncsynth_finalize(GObject *gobject); void ags_syncsynth_connect(AgsConnectable *connectable); void ags_syncsynth_disconnect(AgsConnectable *connectable); void ags_syncsynth_show(GtkWidget *widget); void ags_syncsynth_map_recall(AgsMachine *machine); void ags_syncsynth_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_syncsynth_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data); void ags_syncsynth_input_map_recall(AgsSyncsynth *syncsynth, guint input_pad_start); void ags_syncsynth_output_map_recall(AgsSyncsynth *syncsynth, guint output_pad_start); /** * SECTION:ags_syncsynth * @short_description: syncsynth * @title: AgsSyncsynth * @section_id: * @include: ags/X/machine/ags_syncsynth.h * * The #AgsSyncsynth is a composite widget to act as syncsynth. */ static gpointer ags_syncsynth_parent_class = NULL; static AgsConnectableInterface *ags_syncsynth_parent_connectable_interface; GType ags_syncsynth_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_syncsynth = 0; static const GTypeInfo ags_syncsynth_info = { sizeof(AgsSyncsynthClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_syncsynth_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSyncsynth), 0, /* n_preallocs */ (GInstanceInitFunc) ags_syncsynth_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_syncsynth_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_syncsynth = g_type_register_static(AGS_TYPE_MACHINE, "AgsSyncsynth", &ags_syncsynth_info, 0); g_type_add_interface_static(ags_type_syncsynth, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_syncsynth); } return g_define_type_id__volatile; } void ags_syncsynth_class_init(AgsSyncsynthClass *syncsynth) { GObjectClass *gobject; AgsMachineClass *machine; ags_syncsynth_parent_class = g_type_class_peek_parent(syncsynth); /* GObjectClass */ gobject = (GObjectClass *) syncsynth; gobject->finalize = ags_syncsynth_finalize; /* AgsMachineClass */ machine = (AgsMachineClass *) syncsynth; machine->map_recall = ags_syncsynth_map_recall; } void ags_syncsynth_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_syncsynth_connectable_parent_interface; ags_syncsynth_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_syncsynth_connect; connectable->disconnect = ags_syncsynth_disconnect; } void ags_syncsynth_init(AgsSyncsynth *syncsynth) { GtkHBox *hbox; GtkVBox *vbox; GtkTable *table; GtkLabel *label; AgsAudio *audio; g_signal_connect_after((GObject *) syncsynth, "parent_set", G_CALLBACK(ags_syncsynth_parent_set_callback), (gpointer) syncsynth); audio = AGS_MACHINE(syncsynth)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_SYNTH)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); g_object_set(audio, "min-audio-channels", 1, "max-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(syncsynth)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); AGS_MACHINE(syncsynth)->mapping_flags |= AGS_MACHINE_MONO; AGS_MACHINE(syncsynth)->input_pad_type = G_TYPE_NONE; AGS_MACHINE(syncsynth)->input_line_type = G_TYPE_NONE; AGS_MACHINE(syncsynth)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(syncsynth)->output_line_type = G_TYPE_NONE; /* context menu */ ags_machine_popup_add_connection_options((AgsMachine *) syncsynth, (AGS_MACHINE_POPUP_MIDI_DIALOG)); /* audio resize */ g_signal_connect(syncsynth, "samplerate-changed", G_CALLBACK(ags_syncsynth_samplerate_changed_callback), NULL); g_signal_connect_after(G_OBJECT(syncsynth), "resize-audio-channels", G_CALLBACK(ags_syncsynth_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(syncsynth), "resize-pads", G_CALLBACK(ags_syncsynth_resize_pads), NULL); /* create widgets */ syncsynth->flags = 0; /* mapped IO */ syncsynth->mapped_input_pad = 0; syncsynth->mapped_output_pad = 0; /* context menu */ ags_machine_popup_add_edit_options((AgsMachine *) syncsynth, (AGS_MACHINE_POPUP_ENVELOPE)); /* name and xml type */ syncsynth->name = NULL; syncsynth->xml_type = "ags-syncsynth"; /* create widgets */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer*) (gtk_bin_get_child((GtkBin *) syncsynth)), (GtkWidget *) hbox); syncsynth->oscillator = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) syncsynth->oscillator, FALSE, FALSE, 0); /* add 2 oscillators */ ags_syncsynth_add_oscillator(syncsynth, ags_oscillator_new()); ags_syncsynth_add_oscillator(syncsynth, ags_oscillator_new()); /* add and remove buttons */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) vbox, FALSE, FALSE, 0); syncsynth->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) syncsynth->add, FALSE, FALSE, 0); syncsynth->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) syncsynth->remove, FALSE, FALSE, 0); /* update */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) vbox, FALSE, FALSE, 0); syncsynth->auto_update = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("auto update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) syncsynth->auto_update, FALSE, FALSE, 0); syncsynth->update = (GtkButton *) gtk_button_new_with_label(i18n("update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) syncsynth->update, FALSE, FALSE, 0); /* table */ table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) table, FALSE, FALSE, 0); /* lower - frequency */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("lower"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); syncsynth->lower = (GtkSpinButton *) gtk_spin_button_new_with_range(AGS_SYNCSYNTH_BASE_NOTE_MIN, AGS_SYNCSYNTH_BASE_NOTE_MAX, 1.0); gtk_spin_button_set_digits(syncsynth->lower, 2); gtk_spin_button_set_value(syncsynth->lower, -48.0); gtk_spin_button_set_digits(syncsynth->lower, 2); gtk_table_attach(table, GTK_WIDGET(syncsynth->lower), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* loop start */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("loop start"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); syncsynth->loop_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_OSCILLATOR_DEFAULT_FRAME_COUNT, 1.0); gtk_table_attach(table, GTK_WIDGET(syncsynth->loop_start), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* loop end */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("loop end"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); syncsynth->loop_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_OSCILLATOR_DEFAULT_FRAME_COUNT, 1.0); gtk_table_attach(table, GTK_WIDGET(syncsynth->loop_end), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); } void ags_syncsynth_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_syncsynth_parent_class)->finalize(gobject); } void ags_syncsynth_connect(AgsConnectable *connectable) { AgsSyncsynth *syncsynth; GList *list_start, *list; GList *child_start; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_syncsynth_parent_connectable_interface->connect(connectable); /* AgsSyncsynth */ syncsynth = AGS_SYNCSYNTH(connectable); list = list_start = gtk_container_get_children(GTK_CONTAINER(syncsynth->oscillator)); while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_connect(AGS_CONNECTABLE(child_start->next->data)); g_signal_connect((GObject *) child_start->next->data, "control-changed", G_CALLBACK(ags_syncsynth_oscillator_control_changed_callback), (gpointer) syncsynth); g_list_free(child_start); list = list->next; } g_list_free(list_start); g_signal_connect((GObject *) syncsynth->add, "clicked", G_CALLBACK(ags_syncsynth_add_callback), (gpointer) syncsynth); g_signal_connect((GObject *) syncsynth->remove, "clicked", G_CALLBACK(ags_syncsynth_remove_callback), (gpointer) syncsynth); g_signal_connect((GObject *) syncsynth->auto_update, "toggled", G_CALLBACK(ags_syncsynth_auto_update_callback), syncsynth); g_signal_connect((GObject *) syncsynth->update, "clicked", G_CALLBACK(ags_syncsynth_update_callback), (gpointer) syncsynth); } void ags_syncsynth_disconnect(AgsConnectable *connectable) { AgsSyncsynth *syncsynth; GList *list_start, *list; GList *child_start; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_syncsynth_parent_connectable_interface->disconnect(connectable); /* AgsSyncsynth */ syncsynth = AGS_SYNCSYNTH(connectable); list = list_start = gtk_container_get_children(GTK_CONTAINER(syncsynth->oscillator)); while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_disconnect(AGS_CONNECTABLE(child_start->next->data)); g_object_disconnect((GObject *) child_start->next->data, "any_signal::control-changed", G_CALLBACK(ags_syncsynth_oscillator_control_changed_callback), (gpointer) syncsynth, NULL); g_list_free(child_start); list = list->next; } g_list_free(list_start); g_object_disconnect((GObject *) syncsynth->add, "any_signal::clicked", G_CALLBACK(ags_syncsynth_add_callback), (gpointer) syncsynth, NULL); g_object_disconnect((GObject *) syncsynth->remove, "any_signal::clicked", G_CALLBACK(ags_syncsynth_remove_callback), (gpointer) syncsynth, NULL); g_object_disconnect((GObject *) syncsynth->auto_update, "any_signal::toggled", G_CALLBACK(ags_syncsynth_auto_update_callback), syncsynth, NULL); g_object_disconnect((GObject *) syncsynth->update, "any_signal::clicked", G_CALLBACK(ags_syncsynth_update_callback), (gpointer) syncsynth, NULL); } void ags_syncsynth_map_recall(AgsMachine *machine) { AgsWindow *window; AgsSyncsynth *syncsynth; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *start_play, *play; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } syncsynth = AGS_SYNCSYNTH(machine); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ GValue value = {0,}; play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_syncsynth_input_map_recall(syncsynth, 0); /* depending on destination */ ags_syncsynth_output_map_recall(syncsynth, 0); /* call parent */ AGS_MACHINE_CLASS(ags_syncsynth_parent_class)->map_recall(machine); } void ags_syncsynth_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; GList *start_play, *play; guint output_pads, input_pads; guint i, j; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "output", &start_output, "input", &start_input, NULL); if(audio_channels > audio_channels_old){ /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } } /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* AgsInput */ channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } } if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = 0; i < input_pads; i++){ for(j = audio_channels_old; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!ags_recall_global_get_rt_safe()){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } /* AgsOutput */ /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channels_old, audio_channels, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_syncsynth_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsSyncsynth *syncsynth; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_channel, *nth_channel; AgsAudioSignal *audio_signal; guint i, j; gboolean grow; if(pads == pads_old){ return; } syncsynth = (AgsSyncsynth *) machine; audio = machine->audio; if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(type == AGS_TYPE_INPUT){ if(grow){ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ /* depending on destination */ ags_syncsynth_input_map_recall(syncsynth, pads_old); } }else{ syncsynth->mapped_input_pad = pads; } }else{ if(grow){ g_object_get(audio, "output", &start_output, NULL); nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_syncsynth_output_map_recall(syncsynth, pads_old); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ syncsynth->mapped_output_pad = pads; } } } void ags_syncsynth_input_map_recall(AgsSyncsynth *syncsynth, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(syncsynth->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(syncsynth)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = ags_channel_pad_nth(start_input, input_pad_start); while(channel != NULL){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-feed */ ags_recall_factory_create(audio, NULL, NULL, "ags-feed", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } syncsynth->mapped_input_pad = input_pads; if(start_input != NULL){ g_object_unref(start_input); } } void ags_syncsynth_output_map_recall(AgsSyncsynth *syncsynth, guint output_pad_start) { AgsAudio *audio; guint output_pads, input_pads; guint audio_channels; if(syncsynth->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(syncsynth)->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } syncsynth->mapped_output_pad = audio->output_pads; } /** * ags_syncsynth_add_oscillator: * @syncsynth: the #AgsSyncsynth * @oscillator: the #AgsOscillator * * Add @oscillator to @syncsynth. * * Since: 3.0.0 */ void ags_syncsynth_add_oscillator(AgsSyncsynth *syncsynth, AgsOscillator *oscillator) { AgsAudio *audio; GtkHBox *hbox; GtkCheckButton *check_button; audio = AGS_MACHINE(syncsynth)->audio; ags_audio_add_synth_generator(audio, (GObject *) ags_synth_generator_new()); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); check_button = (GtkCheckButton *) gtk_check_button_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) check_button, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) oscillator, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) syncsynth->oscillator, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) hbox); } /** * ags_syncsynth_remove_oscillator: * @syncsynth: the #AgsSyncsynth * @nth: the nth #AgsOscillator * * Remove nth oscillator. * * Since: 3.0.0 */ void ags_syncsynth_remove_oscillator(AgsSyncsynth *syncsynth, guint nth) { AgsAudio *audio; GList *list, *list_start; GList *start_synth_generator; audio = AGS_MACHINE(syncsynth)->audio; g_object_get(audio, "synth-generator", &start_synth_generator, NULL); start_synth_generator = g_list_reverse(start_synth_generator); ags_audio_remove_synth_generator(audio, g_list_nth_data(start_synth_generator, nth)); g_list_free_full(start_synth_generator, g_object_unref); list_start = gtk_container_get_children(GTK_CONTAINER(syncsynth->oscillator)); list = g_list_nth(list_start, nth); if(list != NULL){ gtk_widget_destroy(list->data); } g_list_free(list_start); } /** * ags_syncsynth_reset_loop: * @syncsynth: the #AgsSyncsynth * * Reset loop spin buttons. * * Since: 3.0.0 */ void ags_syncsynth_reset_loop(AgsSyncsynth *syncsynth) { GList *list, *list_start; GList *child_start; gdouble loop_upper, tmp0, tmp1; loop_upper = 0.0; list = list_start = gtk_container_get_children(GTK_CONTAINER(syncsynth->oscillator)); while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); tmp0 = gtk_spin_button_get_value(AGS_OSCILLATOR(child_start->next->data)->frame_count); tmp1 = gtk_spin_button_get_value(AGS_OSCILLATOR(child_start->next->data)->attack); if(tmp0 + tmp1 > loop_upper){ loop_upper = tmp0 + tmp1; } g_list_free(child_start); list = list->next; } g_list_free(list_start); gtk_spin_button_set_range(syncsynth->loop_start, 0.0, loop_upper); gtk_spin_button_set_range(syncsynth->loop_end, 0.0, loop_upper); } /** * ags_syncsynth_update: * @syncsynth: the #AgsSyncsynth * * Update audio data. * * Since: 3.0.0 */ void ags_syncsynth_update(AgsSyncsynth *syncsynth) { AgsWindow *window; AgsOscillator *oscillator; AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsClearAudioSignal *clear_audio_signal; AgsApplySynth *apply_synth; AgsApplicationContext *application_context; GList *list, *list_start; GList *start_synth_generator, *synth_generator; GList *child_start; GList *task; guint input_lines; guint buffer_size; guint format; guint attack, frame_count; guint loop_start, loop_end; gdouble frequency, phase, start_frequency; gdouble volume; AgsComplex **sync_point; guint sync_point_count; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) syncsynth); application_context = ags_application_context_get_instance(); audio = AGS_MACHINE(syncsynth)->audio; /* */ start_frequency = (gdouble) gtk_spin_button_get_value(syncsynth->lower); /* clear input */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; task = NULL; while(channel != NULL){ AgsRecycling *first_recycling; AgsAudioSignal *template; GList *start_list; g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_get(first_recycling, "audio-signal", &start_list, NULL); /* clear task */ template = ags_audio_signal_get_template(start_list); clear_audio_signal = ags_clear_audio_signal_new(template); task = g_list_prepend(task, clear_audio_signal); g_list_free_full(start_list, g_object_unref); g_object_unref(first_recycling); g_object_unref(template); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* write input */ list = list_start = gtk_container_get_children(GTK_CONTAINER(syncsynth->oscillator)); /* get some fields */ g_object_get(audio, "input-lines", &input_lines, "synth-generator", &start_synth_generator, NULL); g_object_get(start_input, "buffer-size", &buffer_size, "format", &format, NULL); loop_start = (guint) gtk_spin_button_get_value_as_int(syncsynth->loop_start); loop_end = (guint) gtk_spin_button_get_value_as_int(syncsynth->loop_end); synth_generator = start_synth_generator; while(list != NULL){ guint i; gboolean do_sync; /* do it so */ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); oscillator = AGS_OSCILLATOR(child_start->next->data); g_list_free(child_start); attack = (guint) gtk_spin_button_get_value_as_int(oscillator->attack); frame_count = (guint) gtk_spin_button_get_value_as_int(oscillator->frame_count); phase = (gdouble) gtk_spin_button_get_value(oscillator->phase); frequency = (gdouble) gtk_spin_button_get_value(oscillator->frequency); volume = (gdouble) gtk_spin_button_get_value(oscillator->volume); g_object_set(synth_generator->data, "format", format, "delay", (gdouble) attack / buffer_size, "attack", attack, "frame-count", frame_count, "loop-start", loop_start, "loop-end", loop_end, "oscillator", gtk_combo_box_get_active(oscillator->wave), "frequency", frequency, "phase", phase, "volume", volume, NULL); do_sync = gtk_toggle_button_get_active((GtkToggleButton *) oscillator->do_sync); if(do_sync){ sync_point_count = oscillator->sync_point_count; /* free previous sync point */ if(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point != NULL){ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); } /* set new sync point */ if(sync_point_count > 0){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = (AgsComplex **) malloc(sync_point_count * sizeof(AgsComplex *)); }else{ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; } AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = sync_point_count; for(i = 0; i < sync_point_count; i++){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i] = ags_complex_alloc(); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].real = gtk_spin_button_get_value(oscillator->sync_point[2 * i]); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].imag = gtk_spin_button_get_value(oscillator->sync_point[2 * i + 1]); } }else{ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = 0; } apply_synth = ags_apply_synth_new(synth_generator->data, start_input, start_frequency, input_lines); task = g_list_prepend(task, apply_synth); /* iterate */ synth_generator = synth_generator->next; list = list->next; } g_list_free_full(start_synth_generator, g_object_unref); g_list_free(list_start); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), g_list_reverse(task)); } /** * ags_syncsynth_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsSyncsynth * * Returns: the new #AgsSyncsynth * * Since: 3.0.0 */ AgsSyncsynth* ags_syncsynth_new(GObject *soundcard) { AgsSyncsynth *syncsynth; syncsynth = (AgsSyncsynth *) g_object_new(AGS_TYPE_SYNCSYNTH, NULL); g_object_set(AGS_MACHINE(syncsynth)->audio, "output-soundcard", soundcard, NULL); return(syncsynth); } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_pad.h0000644000175000017500000000424213607210263020045 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_INPUT_PAD_H__ #define __AGS_FFPLAYER_INPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FFPLAYER_INPUT_PAD (ags_ffplayer_input_pad_get_type()) #define AGS_FFPLAYER_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FFPLAYER_INPUT_PAD, AgsFFPlayerInputPad)) #define AGS_FFPLAYER_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FFPLAYER_INPUT_PAD, AgsFFPlayerInputPadClass)) #define AGS_IS_FFPLAYER_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FFPLAYER_INPUT_PAD)) #define AGS_IS_FFPLAYER_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FFPLAYER_INPUT_PAD)) #define AGS_FFPLAYER_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FFPLAYER_INPUT_PAD, AgsFFPlayerInputPadClass)) typedef struct _AgsFFPlayerInputPad AgsFFPlayerInputPad; typedef struct _AgsFFPlayerInputPadClass AgsFFPlayerInputPadClass; struct _AgsFFPlayerInputPad { AgsEffectPad effect_pad; }; struct _AgsFFPlayerInputPadClass { AgsEffectPadClass effect_pad; }; GType ags_ffplayer_input_pad_get_type(void); AgsFFPlayerInputPad* ags_ffplayer_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_FFPLAYER_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_input_line.h0000644000175000017500000000411713607210263017370 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_INPUT_LINE_H__ #define __AGS_DRUM_INPUT_LINE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DRUM_INPUT_LINE (ags_drum_input_line_get_type()) #define AGS_DRUM_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DRUM_INPUT_LINE, AgsDrumInputLine)) #define AGS_DRUM_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DRUM_INPUT_LINE, AgsDrumInputLineClass)) #define AGS_IS_DRUM_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DRUM_INPUT_LINE)) #define AGS_IS_DRUM_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DRUM_INPUT_LINE)) #define AGS_DRUM_INPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DRUM_INPUT_LINE, AgsDrumInputLineClass)) typedef struct _AgsDrumInputLine AgsDrumInputLine; typedef struct _AgsDrumInputLineClass AgsDrumInputLineClass; struct _AgsDrumInputLine { AgsLine line; gchar *name; gchar *xml_type; }; struct _AgsDrumInputLineClass { AgsLineClass line; }; GType ags_drum_input_line_get_type(); AgsDrumInputLine* ags_drum_input_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_DRUM_INPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_oscillator.h0000644000175000017500000000524013607210263017026 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_OSCILLATOR_H__ #define __AGS_FM_OSCILLATOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FM_OSCILLATOR (ags_fm_oscillator_get_type()) #define AGS_FM_OSCILLATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_FM_OSCILLATOR, AgsFMOscillator)) #define AGS_FM_OSCILLATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FM_OSCILLATOR, AgsFMOscillatorClass)) #define AGS_IS_FM_OSCILLATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FM_OSCILLATOR)) #define AGS_IS_FM_OSCILLATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FM_OSCILLATOR)) #define AGS_FM_OSCILLATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FM_OSCILLATOR, AgsFMOscillatorClass)) #define AGS_FM_OSCILLATOR_DEFAULT_FRAME_COUNT (44100.0 / 27.5) #define AGS_FM_OSCILLATOR_DEFAULT_SYNC_POINT_COUNT (3) typedef struct _AgsFMOscillator AgsFMOscillator; typedef struct _AgsFMOscillatorClass AgsFMOscillatorClass; typedef enum{ AGS_FM_OSCILLATOR_CONNECTED = 1, }AgsFMOscillatorFlags; struct _AgsFMOscillator { GtkFrame frame; guint flags; GtkComboBox *wave; GtkSpinButton *attack; GtkSpinButton *frame_count; GtkSpinButton *frequency; GtkSpinButton *phase; GtkSpinButton *volume; GtkCheckButton *do_sync; GtkSpinButton **sync_point; guint sync_point_count; GtkComboBox *fm_lfo_wave; GtkSpinButton *fm_lfo_frequency; GtkSpinButton *fm_lfo_depth; GtkSpinButton *fm_tuning; }; struct _AgsFMOscillatorClass { GtkFrameClass frame; void (*control_changed)(AgsFMOscillator *fm_oscillator); }; GType ags_fm_oscillator_get_type(void); void ags_fm_oscillator_control_changed(AgsFMOscillator *fm_oscillator); AgsFMOscillator* ags_fm_oscillator_new(); G_END_DECLS #endif /*__AGS_FM_OSCILLATOR_H__*/ gsequencer-3.1.3/ags/X/machine/ags_desk_input_pad_callbacks.h0000644000175000017500000000215713607210263021165 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DESK_INPUT_PAD_CALLBACKS_H__ #define __AGS_DESK_INPUT_PAD_CALLBACKS_H__ #include #include #include #include #include #include #include #include #endif /*__AGS_DESK_INPUT_PAD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_panel_input_line_callbacks.c0000644000175000017500000000161713605312647021523 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include gsequencer-3.1.3/ags/X/machine/ags_dssi_bridge_callbacks.h0000644000175000017500000000246013607210263020447 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DSSI_BRIDGE_CALLBACKS_H__ #define __AGS_DSSI_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_dssi_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsDssiBridge *dssi_bridge); void ags_dssi_bridge_program_changed_callback(GtkComboBox *combo_box, AgsDssiBridge *dssi_bridge); G_END_DECLS #endif /*__AGS_DSSI_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_syncsynth.c0000644000175000017500000012650713607210263016722 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_fm_syncsynth_class_init(AgsFMSyncsynthClass *fm_syncsynth); void ags_fm_syncsynth_connectable_interface_init(AgsConnectableInterface *connectable); void ags_fm_syncsynth_init(AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_finalize(GObject *gobject); void ags_fm_syncsynth_connect(AgsConnectable *connectable); void ags_fm_syncsynth_disconnect(AgsConnectable *connectable); void ags_fm_syncsynth_show(GtkWidget *widget); void ags_fm_syncsynth_map_recall(AgsMachine *machine); void ags_fm_syncsynth_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_fm_syncsynth_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data); void ags_fm_syncsynth_input_map_recall(AgsFMSyncsynth *fm_syncsynth, guint input_pad_start); void ags_fm_syncsynth_output_map_recall(AgsFMSyncsynth *fm_syncsynth, guint output_pad_start); /** * SECTION:ags_fm_syncsynth * @short_description: fm_syncsynth * @title: AgsFMSyncsynth * @section_id: * @include: ags/X/machine/ags_fm_syncsynth.h * * The #AgsFMSyncsynth is a composite widget to act as fm_syncsynth. */ static gpointer ags_fm_syncsynth_parent_class = NULL; static AgsConnectableInterface *ags_fm_syncsynth_parent_connectable_interface; GType ags_fm_syncsynth_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_fm_syncsynth = 0; static const GTypeInfo ags_fm_syncsynth_info = { sizeof(AgsFMSyncsynthClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_fm_syncsynth_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFMSyncsynth), 0, /* n_preallocs */ (GInstanceInitFunc) ags_fm_syncsynth_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_fm_syncsynth_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_fm_syncsynth = g_type_register_static(AGS_TYPE_MACHINE, "AgsFMSyncsynth", &ags_fm_syncsynth_info, 0); g_type_add_interface_static(ags_type_fm_syncsynth, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_fm_syncsynth); } return g_define_type_id__volatile; } void ags_fm_syncsynth_class_init(AgsFMSyncsynthClass *fm_syncsynth) { GObjectClass *gobject; AgsMachineClass *machine; ags_fm_syncsynth_parent_class = g_type_class_peek_parent(fm_syncsynth); /* GObjectClass */ gobject = (GObjectClass *) fm_syncsynth; gobject->finalize = ags_fm_syncsynth_finalize; /* AgsMachineClass */ machine = (AgsMachineClass *) fm_syncsynth; machine->map_recall = ags_fm_syncsynth_map_recall; } void ags_fm_syncsynth_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_fm_syncsynth_connectable_parent_interface; ags_fm_syncsynth_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_fm_syncsynth_connect; connectable->disconnect = ags_fm_syncsynth_disconnect; } void ags_fm_syncsynth_init(AgsFMSyncsynth *fm_syncsynth) { GtkHBox *hbox; GtkVBox *vbox; GtkTable *table; GtkLabel *label; AgsAudio *audio; g_signal_connect_after((GObject *) fm_syncsynth, "parent_set", G_CALLBACK(ags_fm_syncsynth_parent_set_callback), (gpointer) fm_syncsynth); audio = AGS_MACHINE(fm_syncsynth)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_SYNTH)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); g_object_set(audio, "min-audio-channels", 1, "max-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(fm_syncsynth)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); AGS_MACHINE(fm_syncsynth)->mapping_flags |= AGS_MACHINE_MONO; AGS_MACHINE(fm_syncsynth)->input_pad_type = G_TYPE_NONE; AGS_MACHINE(fm_syncsynth)->input_line_type = G_TYPE_NONE; AGS_MACHINE(fm_syncsynth)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(fm_syncsynth)->output_line_type = G_TYPE_NONE; /* context menu */ ags_machine_popup_add_connection_options((AgsMachine *) fm_syncsynth, (AGS_MACHINE_POPUP_MIDI_DIALOG)); /* audio resize */ g_signal_connect(fm_syncsynth, "samplerate-changed", G_CALLBACK(ags_fm_syncsynth_samplerate_changed_callback), NULL); g_signal_connect_after(G_OBJECT(fm_syncsynth), "resize-audio-channels", G_CALLBACK(ags_fm_syncsynth_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(fm_syncsynth), "resize-pads", G_CALLBACK(ags_fm_syncsynth_resize_pads), NULL); /* create widgets */ fm_syncsynth->flags = 0; /* mapped IO */ fm_syncsynth->mapped_input_pad = 0; fm_syncsynth->mapped_output_pad = 0; /* context menu */ ags_machine_popup_add_edit_options((AgsMachine *) fm_syncsynth, (AGS_MACHINE_POPUP_ENVELOPE)); /* name and xml type */ fm_syncsynth->name = NULL; fm_syncsynth->xml_type = "ags-fm_syncsynth"; /* create widgets */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer*) (gtk_bin_get_child((GtkBin *) fm_syncsynth)), (GtkWidget *) hbox); fm_syncsynth->fm_oscillator = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) fm_syncsynth->fm_oscillator, FALSE, FALSE, 0); /* add fm oscillator */ ags_fm_syncsynth_add_fm_oscillator(fm_syncsynth, ags_fm_oscillator_new()); /* add and remove buttons */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) vbox, FALSE, FALSE, 0); fm_syncsynth->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) fm_syncsynth->add, FALSE, FALSE, 0); fm_syncsynth->remove = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) fm_syncsynth->remove, FALSE, FALSE, 0); /* update */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) vbox, FALSE, FALSE, 0); fm_syncsynth->auto_update = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("auto update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) fm_syncsynth->auto_update, FALSE, FALSE, 0); fm_syncsynth->update = (GtkButton *) gtk_button_new_with_label(i18n("update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) fm_syncsynth->update, FALSE, FALSE, 0); /* table */ table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) table, FALSE, FALSE, 0); /* lower - frequency */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("lower"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); fm_syncsynth->lower = (GtkSpinButton *) gtk_spin_button_new_with_range(AGS_FM_SYNCSYNTH_BASE_NOTE_MIN, AGS_FM_SYNCSYNTH_BASE_NOTE_MAX, 1.0); gtk_spin_button_set_digits(fm_syncsynth->lower, 2); gtk_spin_button_set_value(fm_syncsynth->lower, -48.0); gtk_table_attach(table, GTK_WIDGET(fm_syncsynth->lower), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* loop start */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("loop start"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); fm_syncsynth->loop_start = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_FM_OSCILLATOR_DEFAULT_FRAME_COUNT, 1.0); gtk_table_attach(table, GTK_WIDGET(fm_syncsynth->loop_start), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* loop end */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("loop end"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); fm_syncsynth->loop_end = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_FM_OSCILLATOR_DEFAULT_FRAME_COUNT, 1.0); gtk_table_attach(table, GTK_WIDGET(fm_syncsynth->loop_end), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); } void ags_fm_syncsynth_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_fm_syncsynth_parent_class)->finalize(gobject); } void ags_fm_syncsynth_connect(AgsConnectable *connectable) { AgsFMSyncsynth *fm_syncsynth; GList *list_start, *list; GList *child_start; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_fm_syncsynth_parent_connectable_interface->connect(connectable); /* AgsFMSyncsynth */ fm_syncsynth = AGS_FM_SYNCSYNTH(connectable); list = list_start = gtk_container_get_children(GTK_CONTAINER(fm_syncsynth->fm_oscillator)); while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_connect(AGS_CONNECTABLE(child_start->next->data)); g_signal_connect((GObject *) child_start->next->data, "control-changed", G_CALLBACK(ags_fm_syncsynth_fm_oscillator_control_changed_callback), (gpointer) fm_syncsynth); g_list_free(child_start); list = list->next; } g_list_free(list_start); g_signal_connect((GObject *) fm_syncsynth->add, "clicked", G_CALLBACK(ags_fm_syncsynth_add_callback), (gpointer) fm_syncsynth); g_signal_connect((GObject *) fm_syncsynth->remove, "clicked", G_CALLBACK(ags_fm_syncsynth_remove_callback), (gpointer) fm_syncsynth); g_signal_connect((GObject *) fm_syncsynth->auto_update, "toggled", G_CALLBACK(ags_fm_syncsynth_auto_update_callback), fm_syncsynth); g_signal_connect((GObject *) fm_syncsynth->update, "clicked", G_CALLBACK(ags_fm_syncsynth_update_callback), (gpointer) fm_syncsynth); } void ags_fm_syncsynth_disconnect(AgsConnectable *connectable) { AgsFMSyncsynth *fm_syncsynth; GList *list_start, *list; GList *child_start; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_fm_syncsynth_parent_connectable_interface->disconnect(connectable); /* AgsFMSyncsynth */ fm_syncsynth = AGS_FM_SYNCSYNTH(connectable); list = list_start = gtk_container_get_children(GTK_CONTAINER(fm_syncsynth->fm_oscillator)); while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_disconnect(AGS_CONNECTABLE(child_start->next->data)); g_object_disconnect((GObject *) child_start->next->data, "any_signal::control-changed", G_CALLBACK(ags_fm_syncsynth_fm_oscillator_control_changed_callback), (gpointer) fm_syncsynth, NULL); g_list_free(child_start); list = list->next; } g_list_free(list_start); g_object_disconnect((GObject *) fm_syncsynth->add, "any_signal::clicked", G_CALLBACK(ags_fm_syncsynth_add_callback), (gpointer) fm_syncsynth, NULL); g_object_disconnect((GObject *) fm_syncsynth->remove, "any_signal::clicked", G_CALLBACK(ags_fm_syncsynth_remove_callback), (gpointer) fm_syncsynth, NULL); g_object_disconnect((GObject *) fm_syncsynth->auto_update, "any_signal::toggled", G_CALLBACK(ags_fm_syncsynth_auto_update_callback), fm_syncsynth, NULL); g_object_disconnect((GObject *) fm_syncsynth->update, "any_signal::clicked", G_CALLBACK(ags_fm_syncsynth_update_callback), (gpointer) fm_syncsynth, NULL); } void ags_fm_syncsynth_map_recall(AgsMachine *machine) { AgsWindow *window; AgsFMSyncsynth *fm_syncsynth; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *start_play, *play; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } fm_syncsynth = AGS_FM_SYNCSYNTH(machine); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ GValue value = {0,}; play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_fm_syncsynth_input_map_recall(fm_syncsynth, 0); /* depending on destination */ ags_fm_syncsynth_output_map_recall(fm_syncsynth, 0); /* call parent */ AGS_MACHINE_CLASS(ags_fm_syncsynth_parent_class)->map_recall(machine); } void ags_fm_syncsynth_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; GList *start_play, *play; guint output_pads, input_pads; guint i, j; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "output", &start_output, "input", &start_input, NULL); if(audio_channels > audio_channels_old){ /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } } /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* AgsInput */ channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_pad != NULL){ g_object_unref(next_pad); } if(next_channel != NULL){ g_object_unref(next_channel); } } if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = 0; i < input_pads; i++){ for(j = audio_channels_old; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!ags_recall_global_get_rt_safe()){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } /* AgsOutput */ /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channels_old, audio_channels, 0, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_fm_syncsynth_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsFMSyncsynth *fm_syncsynth; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_channel, *nth_channel; AgsAudioSignal *audio_signal; guint i, j; gboolean grow; if(pads == pads_old){ return; } fm_syncsynth = (AgsFMSyncsynth *) machine; audio = machine->audio; if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(type == AGS_TYPE_INPUT){ if(grow){ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ /* depending on destination */ ags_fm_syncsynth_input_map_recall(fm_syncsynth, pads_old); } }else{ fm_syncsynth->mapped_input_pad = pads; } }else{ if(grow){ g_object_get(audio, "output", &start_output, NULL); nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_fm_syncsynth_output_map_recall(fm_syncsynth, pads_old); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ fm_syncsynth->mapped_output_pad = pads; } } } void ags_fm_syncsynth_input_map_recall(AgsFMSyncsynth *fm_syncsynth, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(fm_syncsynth->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(fm_syncsynth)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = ags_channel_pad_nth(start_input, input_pad_start); while(channel != NULL){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-feed */ ags_recall_factory_create(audio, NULL, NULL, "ags-feed", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } fm_syncsynth->mapped_input_pad = input_pads; if(start_input != NULL){ g_object_unref(start_input); } } void ags_fm_syncsynth_output_map_recall(AgsFMSyncsynth *fm_syncsynth, guint output_pad_start) { AgsAudio *audio; guint output_pads, input_pads; guint audio_channels; if(fm_syncsynth->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(fm_syncsynth)->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } fm_syncsynth->mapped_output_pad = audio->output_pads; } /** * ags_fm_syncsynth_add_fm_oscillator: * @fm_syncsynth: the #AgsFMSyncsynth * @fm_oscillator: the #AgsFMOscillator * * Add @fm_oscillator to @fm_syncsynth. * * Since: 3.0.0 */ void ags_fm_syncsynth_add_fm_oscillator(AgsFMSyncsynth *fm_syncsynth, AgsFMOscillator *fm_oscillator) { AgsAudio *audio; GtkHBox *hbox; GtkCheckButton *check_button; audio = AGS_MACHINE(fm_syncsynth)->audio; ags_audio_add_synth_generator(audio, (GObject *) ags_synth_generator_new()); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); check_button = (GtkCheckButton *) gtk_check_button_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) check_button, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) fm_oscillator, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) fm_syncsynth->fm_oscillator, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) hbox); } /** * ags_fm_syncsynth_remove_fm_oscillator: * @fm_syncsynth: the #AgsFMSyncsynth * @nth: the nth #AgsFMOscillator * * Remove nth fm_oscillator. * * Since: 3.0.0 */ void ags_fm_syncsynth_remove_fm_oscillator(AgsFMSyncsynth *fm_syncsynth, guint nth) { AgsAudio *audio; GList *list, *list_start; GList *start_synth_generator; audio = AGS_MACHINE(fm_syncsynth)->audio; g_object_get(audio, "synth-generator", &start_synth_generator, NULL); start_synth_generator = g_list_reverse(start_synth_generator); ags_audio_remove_synth_generator(audio, g_list_nth_data(start_synth_generator, nth)); g_list_free_full(start_synth_generator, g_object_unref); list_start = gtk_container_get_children(GTK_CONTAINER(fm_syncsynth->fm_oscillator)); list = g_list_nth(list_start, nth); if(list != NULL){ gtk_widget_destroy(list->data); } g_list_free(list_start); } /** * ags_fm_syncsynth_reset_loop: * @fm_syncsynth: the #AgsFMSyncsynth * * Reset loop spin buttons. * * Since: 3.0.0 */ void ags_fm_syncsynth_reset_loop(AgsFMSyncsynth *fm_syncsynth) { GList *list, *list_start; GList *child_start; gdouble loop_upper, tmp0, tmp1; loop_upper = 0.0; list = list_start = gtk_container_get_children(GTK_CONTAINER(fm_syncsynth->fm_oscillator)); while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); tmp0 = gtk_spin_button_get_value(AGS_FM_OSCILLATOR(child_start->next->data)->frame_count); tmp1 = gtk_spin_button_get_value(AGS_FM_OSCILLATOR(child_start->next->data)->attack); if(tmp0 + tmp1 > loop_upper){ loop_upper = tmp0 + tmp1; } g_list_free(child_start); list = list->next; } g_list_free(list_start); gtk_spin_button_set_range(fm_syncsynth->loop_start, 0.0, loop_upper); gtk_spin_button_set_range(fm_syncsynth->loop_end, 0.0, loop_upper); } /** * ags_fm_syncsynth_update: * @fm_syncsynth: the #AgsFMSyncsynth * * Update audio data. * * Since: 3.0.0 */ void ags_fm_syncsynth_update(AgsFMSyncsynth *fm_syncsynth) { AgsWindow *window; AgsFMOscillator *fm_oscillator; AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsClearAudioSignal *clear_audio_signal; AgsApplySynth *apply_synth; AgsApplicationContext *application_context; GList *list, *list_start; GList *start_synth_generator, *synth_generator; GList *child_start; GList *task; guint input_lines; guint buffer_size; guint format; guint attack, frame_count; guint loop_start, loop_end; gdouble frequency, phase, start_frequency; gdouble volume; gdouble fm_lfo_frequency, fm_lfo_depth; gdouble fm_tuning; AgsComplex **sync_point; guint sync_point_count; application_context = ags_application_context_get_instance(); window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) fm_syncsynth); audio = AGS_MACHINE(fm_syncsynth)->audio; /* */ start_frequency = (gdouble) gtk_spin_button_get_value(fm_syncsynth->lower); /* clear input */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; task = NULL; while(channel != NULL){ AgsRecycling *first_recycling; AgsAudioSignal *template; GList *start_list; g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_get(first_recycling, "audio-signal", &start_list, NULL); /* clear task */ template = ags_audio_signal_get_template(start_list); clear_audio_signal = ags_clear_audio_signal_new(template); task = g_list_prepend(task, clear_audio_signal); g_list_free_full(start_list, g_object_unref); g_object_unref(first_recycling); g_object_unref(template); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* write input */ list = list_start = gtk_container_get_children(GTK_CONTAINER(fm_syncsynth->fm_oscillator)); /* get some fields */ g_object_get(audio, "input-lines", &input_lines, "synth-generator", &start_synth_generator, NULL); g_object_get(start_input, "buffer-size", &buffer_size, "format", &format, NULL); loop_start = (guint) gtk_spin_button_get_value_as_int(fm_syncsynth->loop_start); loop_end = (guint) gtk_spin_button_get_value_as_int(fm_syncsynth->loop_end); synth_generator = start_synth_generator; while(list != NULL){ guint i; gboolean do_sync; /* do it so */ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); fm_oscillator = AGS_FM_OSCILLATOR(child_start->next->data); g_list_free(child_start); attack = (guint) gtk_spin_button_get_value_as_int(fm_oscillator->attack); frame_count = (guint) gtk_spin_button_get_value_as_int(fm_oscillator->frame_count); phase = (gdouble) gtk_spin_button_get_value(fm_oscillator->phase); frequency = (gdouble) gtk_spin_button_get_value(fm_oscillator->frequency); volume = (gdouble) gtk_spin_button_get_value(fm_oscillator->volume); fm_lfo_frequency = gtk_spin_button_get_value(fm_oscillator->fm_lfo_frequency); fm_lfo_depth = gtk_spin_button_get_value(fm_oscillator->fm_lfo_depth); fm_tuning = gtk_spin_button_get_value(fm_oscillator->fm_tuning); g_object_set(synth_generator->data, "format", format, "delay", (gdouble) attack / buffer_size, "attack", attack, "frame-count", frame_count, "loop-start", loop_start, "loop-end", loop_end, "oscillator", gtk_combo_box_get_active(fm_oscillator->wave), "frequency", frequency, "phase", phase, "volume", volume, "do-fm-synth", TRUE, "fm-lfo-oscillator", gtk_combo_box_get_active(fm_oscillator->fm_lfo_wave), "fm-lfo-frequency", fm_lfo_frequency, "fm-lfo-depth", fm_lfo_depth, "fm-tuning", fm_tuning, NULL); do_sync = gtk_toggle_button_get_active((GtkToggleButton *) fm_oscillator->do_sync); if(do_sync){ sync_point_count = fm_oscillator->sync_point_count; /* free previous sync point */ if(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point != NULL){ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); } /* set new sync point */ if(sync_point_count > 0){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = (AgsComplex **) malloc(sync_point_count * sizeof(AgsComplex *)); }else{ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; } AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = sync_point_count; for(i = 0; i < sync_point_count; i++){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i] = ags_complex_alloc(); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].real = gtk_spin_button_get_value(fm_oscillator->sync_point[2 * i]); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].imag = gtk_spin_button_get_value(fm_oscillator->sync_point[2 * i + 1]); } }else{ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = 0; } apply_synth = ags_apply_synth_new(synth_generator->data, start_input, start_frequency, input_lines); task = g_list_prepend(task, apply_synth); /* iterate */ synth_generator = synth_generator->next; list = list->next; } g_list_free_full(start_synth_generator, g_object_unref); g_list_free(list_start); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), g_list_reverse(task)); } /** * ags_fm_syncsynth_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsFMSyncsynth * * Returns: the new #AgsFMSyncsynth * * Since: 3.0.0 */ AgsFMSyncsynth* ags_fm_syncsynth_new(GObject *soundcard) { AgsFMSyncsynth *fm_syncsynth; fm_syncsynth = (AgsFMSyncsynth *) g_object_new(AGS_TYPE_FM_SYNCSYNTH, NULL); g_object_set(AGS_MACHINE(fm_syncsynth)->audio, "output-soundcard", soundcard, NULL); return(fm_syncsynth); } gsequencer-3.1.3/ags/X/machine/ags_matrix_callbacks.c0000644000175000017500000001451313607210263017472 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_matrix_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsMatrix *matrix) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_MATRIX)->counter); g_object_set(AGS_MACHINE(matrix), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_MATRIX); g_free(str); } void ags_matrix_index_callback(GtkWidget *widget, AgsMatrix *matrix) { if(matrix->selected != NULL){ GtkToggleButton *toggle; if(GTK_TOGGLE_BUTTON(widget) != matrix->selected){ AgsPort *port; AgsCopyPatternAudio *recall_copy_pattern_audio, *play_copy_pattern_audio; GList *start_list, *list; gchar *str; guint64 index1; toggle = matrix->selected; matrix->selected = NULL; gtk_toggle_button_set_active(toggle, FALSE); matrix->selected = (GtkToggleButton*) widget; gtk_widget_queue_draw(matrix->cell_pattern->drawing_area); /* calculate index 1 */ str = gtk_button_get_label(matrix->selected); index1 = AGS_MACHINE(matrix)->bank_1 = ((guint) g_ascii_strtoull(str, NULL, 10)) - 1; /* play - set port */ g_object_get(AGS_MACHINE(matrix)->audio, "play", &start_list, NULL); list = ags_recall_find_type(start_list, AGS_TYPE_COPY_PATTERN_AUDIO); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gfloat) index1); play_copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_object_get(play_copy_pattern_audio, "bank-index-1", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); g_value_unset(&value); } g_list_free_full(start_list, g_object_unref); /* recall - set port */ g_object_get(AGS_MACHINE(matrix)->audio, "recall", &start_list, NULL); list = ags_recall_find_type(start_list, AGS_TYPE_COPY_PATTERN_AUDIO); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (float) index1); recall_copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_object_get(recall_copy_pattern_audio, "bank-index-1", &port, NULL); ags_port_safe_write(port, &value); g_object_unref(port); g_value_unset(&value); } g_list_free_full(start_list, g_object_unref); gtk_widget_queue_draw((GtkWidget *) matrix->cell_pattern->drawing_area); }else{ matrix->selected = NULL; gtk_toggle_button_set_active((GtkToggleButton *) widget, TRUE); matrix->selected = (GtkToggleButton *) widget; } } } void ags_matrix_length_spin_callback(GtkWidget *spin_button, AgsMatrix *matrix) { AgsWindow *window; AgsApplySequencerLength *apply_sequencer_length; AgsApplicationContext *application_context; gdouble length; application_context = ags_application_context_get_instance(); /* get window and application_context */ window = (AgsWindow *) gtk_widget_get_toplevel(GTK_WIDGET(matrix)); /* task - apply length */ length = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_button)); apply_sequencer_length = ags_apply_sequencer_length_new((GObject *) AGS_MACHINE(matrix)->audio, length); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (GObject *) apply_sequencer_length); } void ags_matrix_loop_button_callback(GtkWidget *button, AgsMatrix *matrix) { AgsPort *port; AgsCountBeatsAudio *count_beats_audio; GList *start_list, *list; gboolean loop; loop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); /* play - count beats audio */ g_object_get(AGS_MACHINE(matrix)->audio, "play", &start_list, NULL); list = start_list; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(list->data); g_object_get(count_beats_audio, "sequencer-loop", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, loop); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); /* recall - count beats audio */ g_object_get(AGS_MACHINE(matrix)->audio, "recall", &start_list, NULL); list = start_list; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(list->data); g_object_get(count_beats_audio, "sequencer-loop", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, loop); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); /* iterate */ list = list->next; } g_list_free(start_list); } void ags_matrix_stop_callback(AgsMatrix *matrix, GList *recall_id, gint sound_scope, gpointer data) { if(sound_scope != AGS_SOUND_SCOPE_SEQUENCER){ return; } ags_led_array_unset_all((AgsLedArray *) matrix->cell_pattern->hled_array); } gsequencer-3.1.3/ags/X/machine/ags_equalizer10_callbacks.h0000644000175000017500000000504413607210263020334 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EQUALIZER10_CALLBACKS_H__ #define __AGS_EQUALIZER10_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_equalizer10_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsEqualizer10 *equalizer10); void ags_equalizer10_resize_audio_channels_callback(AgsEqualizer10 *equalizer10, guint audio_channels, guint audio_channels_old, gpointer data); void ags_equalizer10_resize_pads_callback(AgsEqualizer10 *equalizer10, GType channel_type, guint pads, guint pads_old, gpointer data); void ags_equalizer10_peak_28hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_56hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_112hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_224hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_448hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_896hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_1792hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_3584hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_7168hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_peak_14336hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10); void ags_equalizer10_pressure_callback(GtkRange *range, AgsEqualizer10 *equalizer10); G_END_DECLS #endif /*__AGS_EQUALIZER10_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bulk_input_callbacks.h0000644000175000017500000000213713607210263022236 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_BULK_INPUT_CALLBACKS_H__ #define __AGS_FFPLAYER_BULK_INPUT_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_FFPLAYER_BULK_INPUT_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_equalizer10_callbacks.c0000644000175000017500000010316613607210263020333 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_equalizer10_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsEqualizer10 *equalizer10) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) equalizer10, AGS_TYPE_WINDOW)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_EQUALIZER10)->counter); g_object_set(AGS_MACHINE(equalizer10), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_EQUALIZER10); g_free(str); } void ags_equalizer10_resize_audio_channels_callback(AgsEqualizer10 *equalizer10, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudio *audio; guint i; audio = AGS_MACHINE(equalizer10)->audio; if(audio_channels > audio_channels_old){ if((AGS_MACHINE_MAPPED_RECALL & (AGS_MACHINE(equalizer10)->flags)) != 0){ AgsChannel *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsPort *port; guint i; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-analyse */ ags_recall_factory_create(audio, NULL, NULL, "ags-eq10", audio_channels_old, audio_channels, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); nth_channel = ags_channel_nth(start_input, audio_channels_old); channel = nth_channel; next_channel = NULL; for(i = audio_channels_old; i < audio_channels; i++){ GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* peak 28Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-28hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_28hz_play_port = g_list_prepend(equalizer10->peak_28hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-28hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_28hz_recall_port = g_list_prepend(equalizer10->peak_28hz_recall_port, port); } /* peak 56Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-56hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_56hz_play_port = g_list_prepend(equalizer10->peak_56hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-56hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_56hz_recall_port = g_list_prepend(equalizer10->peak_56hz_recall_port, port); } /* peak 112Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-112hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_112hz_play_port = g_list_prepend(equalizer10->peak_112hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-112hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_112hz_recall_port = g_list_prepend(equalizer10->peak_112hz_recall_port, port); } /* peak 224Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-224hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_224hz_play_port = g_list_prepend(equalizer10->peak_224hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-224hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_224hz_recall_port = g_list_prepend(equalizer10->peak_224hz_recall_port, port); } /* peak 448Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-448hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_448hz_play_port = g_list_prepend(equalizer10->peak_448hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-448hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_448hz_recall_port = g_list_prepend(equalizer10->peak_448hz_recall_port, port); } /* peak 896Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-896hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_896hz_play_port = g_list_prepend(equalizer10->peak_896hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-896hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_896hz_recall_port = g_list_prepend(equalizer10->peak_896hz_recall_port, port); } /* peak 1792Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-1792hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_1792hz_play_port = g_list_prepend(equalizer10->peak_1792hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-1792hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_1792hz_recall_port = g_list_prepend(equalizer10->peak_1792hz_recall_port, port); } /* peak 3584Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-3584hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_3584hz_play_port = g_list_prepend(equalizer10->peak_3584hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-3584hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_3584hz_recall_port = g_list_prepend(equalizer10->peak_3584hz_recall_port, port); } /* peak 7168Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-7168hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_7168hz_play_port = g_list_prepend(equalizer10->peak_7168hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-7168hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_7168hz_recall_port = g_list_prepend(equalizer10->peak_7168hz_recall_port, port); } /* peak 14336Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-14336hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_14336hz_play_port = g_list_prepend(equalizer10->peak_14336hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-14336hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_14336hz_recall_port = g_list_prepend(equalizer10->peak_14336hz_recall_port, port); } /* pressure - find port */ port = ags_equalizer10_find_specifier(start_play, "./pressure[0]"); if(port != NULL){ g_object_ref(port); equalizer10->pressure_play_port = g_list_prepend(equalizer10->pressure_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./pressure[0]"); if(port != NULL){ g_object_ref(port); equalizer10->pressure_recall_port = g_list_prepend(equalizer10->pressure_recall_port, port); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } if(next_channel != NULL){ g_object_unref(next_channel); } } }else{ GList *list_start, *list; /* peak 28Hz - port */ list = list_start = g_list_copy(equalizer10->peak_28hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_28hz_play_port = g_list_remove(equalizer10->peak_28hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_28hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_28hz_recall_port = g_list_remove(equalizer10->peak_28hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 56Hz - port */ list = list_start = g_list_copy(equalizer10->peak_56hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_56hz_play_port = g_list_remove(equalizer10->peak_56hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_56hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_56hz_recall_port = g_list_remove(equalizer10->peak_56hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 112Hz - port */ list = list_start = g_list_copy(equalizer10->peak_112hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_112hz_play_port = g_list_remove(equalizer10->peak_112hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_112hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_112hz_recall_port = g_list_remove(equalizer10->peak_112hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 224Hz - port */ list = list_start = g_list_copy(equalizer10->peak_224hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_224hz_play_port = g_list_remove(equalizer10->peak_224hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_224hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_224hz_recall_port = g_list_remove(equalizer10->peak_224hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 448Hz - port */ list = list_start = g_list_copy(equalizer10->peak_448hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_448hz_play_port = g_list_remove(equalizer10->peak_448hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_448hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_448hz_recall_port = g_list_remove(equalizer10->peak_448hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 896Hz - port */ list = list_start = g_list_copy(equalizer10->peak_896hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_896hz_play_port = g_list_remove(equalizer10->peak_896hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_896hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_896hz_recall_port = g_list_remove(equalizer10->peak_896hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 1792Hz - port */ list = list_start = g_list_copy(equalizer10->peak_1792hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_1792hz_play_port = g_list_remove(equalizer10->peak_1792hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_1792hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_1792hz_recall_port = g_list_remove(equalizer10->peak_1792hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 3584Hz - port */ list = list_start = g_list_copy(equalizer10->peak_3584hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_3584hz_play_port = g_list_remove(equalizer10->peak_3584hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_3584hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_3584hz_recall_port = g_list_remove(equalizer10->peak_3584hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 7168Hz - port */ list = list_start = g_list_copy(equalizer10->peak_7168hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_7168hz_play_port = g_list_remove(equalizer10->peak_7168hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_7168hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_7168hz_recall_port = g_list_remove(equalizer10->peak_7168hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* peak 14336Hz - port */ list = list_start = g_list_copy(equalizer10->peak_14336hz_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_14336hz_play_port = g_list_remove(equalizer10->peak_14336hz_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->peak_14336hz_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->peak_14336hz_recall_port = g_list_remove(equalizer10->peak_14336hz_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* pressure - port */ list = list_start = g_list_copy(equalizer10->pressure_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->pressure_play_port = g_list_remove(equalizer10->pressure_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(equalizer10->pressure_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ equalizer10->pressure_recall_port = g_list_remove(equalizer10->pressure_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); } } void ags_equalizer10_resize_pads_callback(AgsEqualizer10 *equalizer10, GType channel_type, guint pads, guint pads_old, gpointer data) { if(pads_old == 0 && channel_type == AGS_TYPE_INPUT){ if((AGS_MACHINE_MAPPED_RECALL & (AGS_MACHINE(equalizer10)->flags)) != 0){ AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; guint audio_channels; guint i; audio = AGS_MACHINE(equalizer10)->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-analyse */ ags_recall_factory_create(audio, NULL, NULL, "ags-eq10", 0, audio_channels, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; i < audio_channels; i++){ g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* peak 28Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-28hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_28hz_play_port = g_list_prepend(equalizer10->peak_28hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-28hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_28hz_recall_port = g_list_prepend(equalizer10->peak_28hz_recall_port, port); } /* peak 56Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-56hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_56hz_play_port = g_list_prepend(equalizer10->peak_56hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-56hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_56hz_recall_port = g_list_prepend(equalizer10->peak_56hz_recall_port, port); } /* peak 112Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-112hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_112hz_play_port = g_list_prepend(equalizer10->peak_112hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-112hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_112hz_recall_port = g_list_prepend(equalizer10->peak_112hz_recall_port, port); } /* peak 224Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-224hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_224hz_play_port = g_list_prepend(equalizer10->peak_224hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-224hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_224hz_recall_port = g_list_prepend(equalizer10->peak_224hz_recall_port, port); } /* peak 448Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-448hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_448hz_play_port = g_list_prepend(equalizer10->peak_448hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-448hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_448hz_recall_port = g_list_prepend(equalizer10->peak_448hz_recall_port, port); } /* peak 896Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-896hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_896hz_play_port = g_list_prepend(equalizer10->peak_896hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-896hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_896hz_recall_port = g_list_prepend(equalizer10->peak_896hz_recall_port, port); } /* peak 1792Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-1792hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_1792hz_play_port = g_list_prepend(equalizer10->peak_1792hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-1792hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_1792hz_recall_port = g_list_prepend(equalizer10->peak_1792hz_recall_port, port); } /* peak 3584Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-3584hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_3584hz_play_port = g_list_prepend(equalizer10->peak_3584hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-3584hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_3584hz_recall_port = g_list_prepend(equalizer10->peak_3584hz_recall_port, port); } /* peak 7168Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-7168hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_7168hz_play_port = g_list_prepend(equalizer10->peak_7168hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-7168hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_7168hz_recall_port = g_list_prepend(equalizer10->peak_7168hz_recall_port, port); } /* peak 14336Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-14336hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_14336hz_play_port = g_list_prepend(equalizer10->peak_14336hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-14336hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_14336hz_recall_port = g_list_prepend(equalizer10->peak_14336hz_recall_port, port); } /* pressure - find port */ port = ags_equalizer10_find_specifier(start_play, "./pressure[0]"); if(port != NULL){ g_object_ref(port); equalizer10->pressure_play_port = g_list_prepend(equalizer10->pressure_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./pressure[0]"); if(port != NULL){ g_object_ref(port); equalizer10->pressure_recall_port = g_list_prepend(equalizer10->pressure_recall_port, port); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_input != NULL){ g_object_unref(start_input); } if(next_channel != NULL){ g_object_unref(next_channel); } } } if(pads == 0 && channel_type == AGS_TYPE_INPUT){ /* peak 28Hz - ports */ g_list_free_full(equalizer10->peak_28hz_play_port, g_object_unref); equalizer10->peak_28hz_play_port = NULL; g_list_free_full(equalizer10->peak_28hz_recall_port, g_object_unref); equalizer10->peak_28hz_recall_port = NULL; /* peak 56Hz - ports */ g_list_free_full(equalizer10->peak_56hz_play_port, g_object_unref); equalizer10->peak_56hz_play_port = NULL; g_list_free_full(equalizer10->peak_56hz_recall_port, g_object_unref); equalizer10->peak_56hz_recall_port = NULL; /* peak 112Hz - ports */ g_list_free_full(equalizer10->peak_112hz_play_port, g_object_unref); equalizer10->peak_112hz_play_port = NULL; g_list_free_full(equalizer10->peak_112hz_recall_port, g_object_unref); equalizer10->peak_112hz_recall_port = NULL; /* peak 224Hz - ports */ g_list_free_full(equalizer10->peak_224hz_play_port, g_object_unref); equalizer10->peak_224hz_play_port = NULL; g_list_free_full(equalizer10->peak_224hz_recall_port, g_object_unref); equalizer10->peak_224hz_recall_port = NULL; /* peak 448Hz - ports */ g_list_free_full(equalizer10->peak_448hz_play_port, g_object_unref); equalizer10->peak_448hz_play_port = NULL; g_list_free_full(equalizer10->peak_448hz_recall_port, g_object_unref); equalizer10->peak_448hz_recall_port = NULL; /* peak 896Hz - ports */ g_list_free_full(equalizer10->peak_896hz_play_port, g_object_unref); equalizer10->peak_896hz_play_port = NULL; g_list_free_full(equalizer10->peak_896hz_recall_port, g_object_unref); equalizer10->peak_896hz_recall_port = NULL; /* peak 1792Hz - ports */ g_list_free_full(equalizer10->peak_1792hz_play_port, g_object_unref); equalizer10->peak_1792hz_play_port = NULL; g_list_free_full(equalizer10->peak_1792hz_recall_port, g_object_unref); equalizer10->peak_1792hz_recall_port = NULL; /* peak 3584Hz - ports */ g_list_free_full(equalizer10->peak_3584hz_play_port, g_object_unref); equalizer10->peak_3584hz_play_port = NULL; g_list_free_full(equalizer10->peak_3584hz_recall_port, g_object_unref); equalizer10->peak_3584hz_recall_port = NULL; /* peak 7168Hz - ports */ g_list_free_full(equalizer10->peak_7168hz_play_port, g_object_unref); equalizer10->peak_7168hz_play_port = NULL; g_list_free_full(equalizer10->peak_7168hz_recall_port, g_object_unref); equalizer10->peak_7168hz_recall_port = NULL; /* peak 14336Hz - ports */ g_list_free_full(equalizer10->peak_14336hz_play_port, g_object_unref); equalizer10->peak_14336hz_play_port = NULL; g_list_free_full(equalizer10->peak_14336hz_recall_port, g_object_unref); equalizer10->peak_14336hz_recall_port = NULL; /* pressure - ports */ g_list_free_full(equalizer10->pressure_play_port, g_object_unref); equalizer10->pressure_play_port = NULL; g_list_free_full(equalizer10->pressure_recall_port, g_object_unref); equalizer10->pressure_recall_port = NULL; } } void ags_equalizer10_peak_28hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_28hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_28hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_56hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_56hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_56hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_112hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_112hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_112hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_224hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_224hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_224hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_448hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_448hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_448hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_896hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_896hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_896hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_1792hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_1792hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_1792hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_3584hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_3584hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_3584hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_7168hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_7168hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_7168hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_peak_14336hz_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->peak_14336hz_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->peak_14336hz_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } void ags_equalizer10_pressure_callback(GtkRange *range, AgsEqualizer10 *equalizer10) { GList *list; GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_range_get_value(range)); /* play port */ list = equalizer10->pressure_play_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } /* recall port */ list = equalizer10->pressure_recall_port; while(list != NULL){ ags_port_safe_write(list->data, &value); list = list->next; } g_value_unset(&value); } gsequencer-3.1.3/ags/X/machine/ags_cell_pattern.c0000644000175000017500000007252013607331151016645 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include static GType ags_accessible_cell_pattern_get_type(void); void ags_cell_pattern_class_init(AgsCellPatternClass *cell_pattern); void ags_accessible_cell_pattern_class_init(AtkObject *object); void ags_accessible_cell_pattern_action_interface_init(AtkActionIface *action); void ags_cell_pattern_connectable_interface_init(AgsConnectableInterface *connectable); void ags_cell_pattern_init(AgsCellPattern *cell_pattern); void ags_cell_pattern_finalize(GObject *gobject); void ags_cell_pattern_connect(AgsConnectable *connectable); void ags_cell_pattern_disconnect(AgsConnectable *connectable); AtkObject* ags_cell_pattern_get_accessible(GtkWidget *widget); void ags_cell_pattern_realize(GtkWidget *widget); void ags_cell_pattern_show(GtkWidget *widget); void ags_cell_pattern_show_all(GtkWidget *widget); gboolean ags_accessible_cell_pattern_do_action(AtkAction *action, gint i); gint ags_accessible_cell_pattern_get_n_actions(AtkAction *action); const gchar* ags_accessible_cell_pattern_get_description(AtkAction *action, gint i); const gchar* ags_accessible_cell_pattern_get_name(AtkAction *action, gint i); const gchar* ags_accessible_cell_pattern_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_cell_pattern_set_description(AtkAction *action, gint i); gchar* ags_accessible_cell_pattern_get_localized_name(AtkAction *action, gint i); /** * SECTION:ags_cell_pattern * @short_description: cell pattern sequencer * @title: AgsCellPattern * @section_id: * @include: ags/X/machine/ags_cell_pattern.h * * The #AgsCellPattern is a composite widget to act as cell pattern sequencer. */ static gpointer ags_cell_pattern_parent_class = NULL; static GQuark quark_accessible_object = 0; GHashTable *ags_cell_pattern_led_queue_draw = NULL; GType ags_cell_pattern_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_cell_pattern = 0; static const GTypeInfo ags_cell_pattern_info = { sizeof(AgsCellPatternClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_cell_pattern_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCellPattern), 0, /* n_preallocs */ (GInstanceInitFunc) ags_cell_pattern_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_cell_pattern_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_cell_pattern = g_type_register_static(GTK_TYPE_TABLE, "AgsCellPattern", &ags_cell_pattern_info, 0); g_type_add_interface_static(ags_type_cell_pattern, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_cell_pattern); } return g_define_type_id__volatile; } static GType ags_accessible_cell_pattern_get_type(void) { static GType ags_type_accessible_cell_pattern = 0; if(!ags_type_accessible_cell_pattern){ const GTypeInfo ags_accesssible_cell_pattern_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_cell_pattern_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_cell_pattern_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_cell_pattern = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleCellPattern", &ags_accesssible_cell_pattern_info, 0); g_type_add_interface_static(ags_type_accessible_cell_pattern, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_cell_pattern); } void ags_cell_pattern_class_init(AgsCellPatternClass *cell_pattern) { GObjectClass *gobject; GtkWidgetClass *widget; ags_cell_pattern_parent_class = g_type_class_peek_parent(cell_pattern); quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); /* GObjectClass */ gobject = (GObjectClass *) cell_pattern; gobject->finalize = ags_cell_pattern_finalize; /* GtkWidget */ widget = (GtkWidgetClass *) cell_pattern; widget->realize = ags_cell_pattern_realize; widget->show = ags_cell_pattern_show; widget->show_all = ags_cell_pattern_show_all; } void ags_accessible_cell_pattern_class_init(AtkObject *object) { /* empty */ } void ags_accessible_cell_pattern_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_cell_pattern_do_action; action->get_n_actions = ags_accessible_cell_pattern_get_n_actions; action->get_description = ags_accessible_cell_pattern_get_description; action->get_name = ags_accessible_cell_pattern_get_name; action->get_keybinding = ags_accessible_cell_pattern_get_keybinding; action->set_description = ags_accessible_cell_pattern_set_description; action->get_localized_name = ags_accessible_cell_pattern_get_localized_name; } void ags_cell_pattern_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_cell_pattern_connectable_parent_interface; connectable->connect = ags_cell_pattern_connect; connectable->disconnect = ags_cell_pattern_disconnect; } void ags_cell_pattern_init(AgsCellPattern *cell_pattern) { GtkAdjustment *adjustment; AgsLed *led; AgsConfig *config; gchar *str; gdouble gui_scale_factor; guint i; g_object_set(cell_pattern, "can-focus", TRUE, "n-columns", 2, "n-rows", 2, "homogeneous", FALSE, NULL); cell_pattern->flags = 0; cell_pattern->key_mask = 0; config = ags_config_get_instance(); /* cell */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } cell_pattern->cell_width = (guint) (gui_scale_factor * AGS_CELL_PATTERN_DEFAULT_CELL_WIDTH); cell_pattern->cell_height = (guint) (gui_scale_factor * AGS_CELL_PATTERN_DEFAULT_CELL_HEIGHT); cell_pattern->n_cols = AGS_CELL_PATTERN_DEFAULT_CONTROLS_HORIZONTALLY; cell_pattern->n_rows = AGS_CELL_PATTERN_DEFAULT_CONTROLS_VERTICALLY; cell_pattern->cursor_x = 0; cell_pattern->cursor_y = 0; cell_pattern->drawing_area = (GtkDrawingArea *) gtk_drawing_area_new(); gtk_widget_set_size_request((GtkWidget *) cell_pattern->drawing_area, AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY * cell_pattern->cell_width + 1, AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY * cell_pattern->cell_height + 1); gtk_table_attach((GtkTable *) cell_pattern, (GtkWidget *) cell_pattern->drawing_area, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_set_events((GtkWidget *) cell_pattern->drawing_area, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_CONTROL_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, (double) AGS_CELL_PATTERN_DEFAULT_CONTROLS_VERTICALLY - 1.0, 1.0, 1.0, (gdouble) AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY); cell_pattern->vscrollbar = (GtkVScrollbar *) gtk_vscrollbar_new(adjustment); gtk_table_attach((GtkTable *) cell_pattern, (GtkWidget *) cell_pattern->vscrollbar, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); cell_pattern->hscrollbar = NULL; /* led */ cell_pattern->active_led = 0; cell_pattern->hled_array = ags_hled_array_new(); g_object_set(cell_pattern->hled_array, "led-width", cell_pattern->cell_width, "led-height", (guint) (gui_scale_factor * AGS_CELL_PATTERN_DEFAULT_CELL_HEIGHT), "led-count", cell_pattern->n_cols, NULL); gtk_table_attach((GtkTable *) cell_pattern, (GtkWidget *) cell_pattern->hled_array, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show_all((GtkWidget *) cell_pattern->hled_array); if(ags_cell_pattern_led_queue_draw == NULL){ ags_cell_pattern_led_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_cell_pattern_led_queue_draw, cell_pattern, ags_cell_pattern_led_queue_draw_timeout); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_cell_pattern_led_queue_draw_timeout, (gpointer) cell_pattern); } void ags_cell_pattern_finalize(GObject *gobject) { g_hash_table_remove(ags_cell_pattern_led_queue_draw, gobject); G_OBJECT_CLASS(ags_cell_pattern_parent_class)->finalize(gobject); } void ags_cell_pattern_connect(AgsConnectable *connectable) { AgsCellPattern *cell_pattern; if((AGS_CELL_PATTERN_CONNECTED & (AGS_CELL_PATTERN(connectable)->flags)) != 0){ return; } /* AgsCellPattern */ cell_pattern = AGS_CELL_PATTERN(connectable); cell_pattern->flags |= AGS_CELL_PATTERN_CONNECTED; g_signal_connect_after(G_OBJECT(cell_pattern), "focus_in_event", G_CALLBACK(ags_cell_pattern_focus_in_callback), (gpointer) cell_pattern); g_signal_connect(G_OBJECT(cell_pattern->drawing_area), "draw", G_CALLBACK(ags_cell_pattern_draw_callback), (gpointer) cell_pattern); g_signal_connect(G_OBJECT(cell_pattern->drawing_area), "key_press_event", G_CALLBACK(ags_cell_pattern_drawing_area_key_press_event), (gpointer) cell_pattern); g_signal_connect(G_OBJECT(cell_pattern->drawing_area), "key_release_event", G_CALLBACK(ags_cell_pattern_drawing_area_key_release_event), (gpointer) cell_pattern); g_signal_connect(G_OBJECT(cell_pattern->drawing_area), "button_press_event", G_CALLBACK(ags_cell_pattern_drawing_area_button_press_callback), (gpointer) cell_pattern); g_signal_connect(G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(cell_pattern->vscrollbar))), "value_changed", G_CALLBACK(ags_cell_pattern_adjustment_value_changed_callback), (gpointer) cell_pattern); } void ags_cell_pattern_disconnect(AgsConnectable *connectable) { AgsCellPattern *cell_pattern; if((AGS_CELL_PATTERN_CONNECTED & (AGS_CELL_PATTERN(connectable)->flags)) == 0){ return; } /* AgsCellPattern */ cell_pattern = AGS_CELL_PATTERN(connectable); cell_pattern->flags &= (~AGS_CELL_PATTERN_CONNECTED); g_object_disconnect(G_OBJECT(cell_pattern), "any_signal::focus_in_event", G_CALLBACK(ags_cell_pattern_focus_in_callback), (gpointer) cell_pattern, NULL); g_object_disconnect(G_OBJECT(cell_pattern->drawing_area), "any_signal::draw", G_CALLBACK(ags_cell_pattern_draw_callback), (gpointer) cell_pattern, "any_signal::key_press_event", G_CALLBACK(ags_cell_pattern_drawing_area_key_press_event), (gpointer) cell_pattern, "any_signal::key_release_event", G_CALLBACK(ags_cell_pattern_drawing_area_key_release_event), (gpointer) cell_pattern, "any_signal::button_press_event", G_CALLBACK(ags_cell_pattern_drawing_area_button_press_callback), (gpointer) cell_pattern, NULL); g_object_disconnect(G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(cell_pattern->vscrollbar))), "any_signal::value_changed", G_CALLBACK(ags_cell_pattern_adjustment_value_changed_callback), (gpointer) cell_pattern, NULL); } AtkObject* ags_cell_pattern_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_cell_pattern_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_cell_pattern_realize(GtkWidget *widget) { AgsCellPattern *cell_pattern; cell_pattern = (AgsCellPattern *) widget; /* call parent */ GTK_WIDGET_CLASS(ags_cell_pattern_parent_class)->realize(widget); } void ags_cell_pattern_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_cell_pattern_parent_class)->show(widget); // ags_cell_pattern_draw_matrix(AGS_CELL_PATTERN(widget)); } void ags_cell_pattern_show_all(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_cell_pattern_parent_class)->show_all(widget); // ags_cell_pattern_draw_matrix(AGS_CELL_PATTERN(widget)); } gboolean ags_accessible_cell_pattern_do_action(AtkAction *action, gint i) { AgsCellPattern *cell_pattern; GdkEventKey *key_press, *key_release; GdkEventKey *modifier_press, *modifier_release; if(!(i >= 0 && i < 6)){ return(FALSE); } cell_pattern = (AgsCellPattern *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); key_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); switch(i){ case AGS_CELL_PATTERN_MOVE_LEFT: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_release); } break; case AGS_CELL_PATTERN_MOVE_RIGHT: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_release); } break; case AGS_CELL_PATTERN_MOVE_UP: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_release); } break; case AGS_CELL_PATTERN_MOVE_DOWN: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_release); } break; case AGS_CELL_PATTERN_TOGGLE_PAD: { key_press->keyval = key_release->keyval = GDK_KEY_space; /* send event */ gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_release); } break; case AGS_CELL_PATTERN_COPY_PATTERN: { key_press->keyval = key_release->keyval = GDK_KEY_c; /* create modifier */ modifier_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); modifier_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); modifier_press->keyval = modifier_release->keyval = GDK_KEY_Control_R; /* send event */ gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) cell_pattern, (GdkEvent *) modifier_release); } break; } return(TRUE); } gint ags_accessible_cell_pattern_get_n_actions(AtkAction *action) { return(6); } const gchar* ags_accessible_cell_pattern_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move cursor left", "move cursor right", "move cursor up", "move cursor down", "toggle audio pattern" "copy pattern to clipboard", }; if(i >= 0 && i < 6){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_cell_pattern_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "toggle", "copy", }; if(i >= 0 && i < 6){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_cell_pattern_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "space", "Ctrl+c", }; if(i >= 0 && i < 6){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_cell_pattern_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_cell_pattern_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_cell_pattern_draw_grid(AgsCellPattern *cell_pattern, cairo_t *cr) { AgsMachine *machine; GtkStyleContext *cell_pattern_style_context; GdkRGBA *fg_color; GdkRGBA *bg_color; AgsChannel *start_channel, *nth_channel; AgsChannel *channel, *prev_pad; guint input_pads; guint gutter; guint current_gutter; int i, j; GValue value = {0,}; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); /* retrieve some audio fields */ g_object_get(machine->audio, "input-pads", &input_pads, "input", &start_channel, NULL); if(input_pads == 0){ if(start_channel != NULL){ g_object_unref(start_channel); } return; } /* style context */ cell_pattern_style_context = gtk_widget_get_style_context(GTK_WIDGET(cell_pattern->drawing_area)); gtk_style_context_get_property(cell_pattern_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(cell_pattern_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); if(input_pads > AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ gutter = AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY; }else{ gutter = input_pads; } current_gutter = (guint) gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)); /* clear bg */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, 0.0, (gdouble) cell_pattern->cell_width * AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY, (gdouble) gutter * cell_pattern->cell_height); cairo_fill(cr); if(input_pads - ((guint) current_gutter + AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY) > AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ nth_channel = ags_channel_nth(start_channel, input_pads - (current_gutter + AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY)); }else if(input_pads > AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ nth_channel = ags_channel_nth(start_channel, AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY); }else{ nth_channel = ags_channel_nth(start_channel, input_pads - 1); } if(nth_channel == NULL){ if(start_channel != NULL){ g_object_unref(start_channel); } g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); return; } channel = nth_channel; g_object_ref(channel); prev_pad = NULL; /* the grid */ cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); cairo_set_line_width(cr, 0.625); for(j = 0; j < AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY; j++){ cairo_move_to(cr, (double) j * (double) cell_pattern->cell_width, 0.0); cairo_line_to(cr, (double) j * (double) cell_pattern->cell_width, (double) gutter * (double) cell_pattern->cell_height); cairo_stroke(cr); } for (i = 0; channel != NULL && i < gutter; i++){ cairo_move_to(cr, 0.0, (double) i * (double) cell_pattern->cell_height); cairo_line_to(cr, (double) AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY * (double) cell_pattern->cell_width, (double) i * (double) cell_pattern->cell_height); cairo_stroke(cr); /* iterate */ prev_pad = ags_channel_prev_pad(channel); g_object_unref(channel); channel = prev_pad; } /* unref */ g_object_unref(start_channel); g_object_unref(nth_channel); if(prev_pad != NULL){ g_object_unref(prev_pad); } g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); } void ags_cell_pattern_draw_matrix(AgsCellPattern *cell_pattern, cairo_t *cr) { AgsMachine *machine; AgsChannel *start_channel, *nth_channel; AgsChannel *channel, *prev_pad; guint input_pads; guint gutter; guint current_gutter; int i, j; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); /* get some audio fields */ g_object_get(machine->audio, "input-pads", &input_pads, "input", &start_channel, NULL); if(input_pads > AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ gutter = AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY; }else{ gutter = input_pads; } current_gutter = (guint) gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)); nth_channel = ags_channel_nth(start_channel, input_pads - current_gutter - 1); if(nth_channel == NULL){ if(start_channel != NULL){ g_object_unref(start_channel); } return; } channel = nth_channel; g_object_ref(channel); prev_pad = NULL; for (i = 0; channel != NULL && i < gutter; i++){ for(j = 0; j < AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY; j++){ ags_cell_pattern_redraw_gutter_point(cell_pattern, cr, channel, j, i); } /* iterate */ prev_pad = ags_channel_prev_pad(channel); g_object_unref(channel); channel = prev_pad; } /* unref */ g_object_unref(start_channel); g_object_unref(nth_channel); if(prev_pad != NULL){ g_object_unref(prev_pad); } } void ags_cell_pattern_draw_cursor(AgsCellPattern *cell_pattern, cairo_t *cr) { guint i, j; if(cell_pattern->cursor_y >= gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)) && cell_pattern->cursor_y < gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)) + cell_pattern->n_rows){ i = cell_pattern->cursor_y - gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)); j = cell_pattern->cursor_x; if((AGS_CELL_PATTERN_CURSOR_ON & (cell_pattern->flags)) != 0){ ags_cell_pattern_highlight_gutter_point(cell_pattern, cr, j, i); }else{ ags_cell_pattern_unpaint_gutter_point(cell_pattern, cr, j, i); } } } void ags_cell_pattern_redraw_gutter_point(AgsCellPattern *cell_pattern, cairo_t *cr, AgsChannel *channel, guint j, guint i) { AgsMachine *machine; GList *start_pattern; gboolean do_highlight; if(channel == NULL || channel->pattern == NULL){ return; } machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); /* get channel fields */ g_object_get(channel, "pattern", &start_pattern, NULL); /* redraw */ do_highlight = ags_pattern_get_bit(start_pattern->data, machine->bank_0, machine->bank_1, j); if(do_highlight){ ags_cell_pattern_highlight_gutter_point(cell_pattern, cr, j, i); }else{ ags_cell_pattern_unpaint_gutter_point(cell_pattern, cr, j, i); } g_list_free_full(start_pattern, g_object_unref); } void ags_cell_pattern_highlight_gutter_point(AgsCellPattern *cell_pattern, cairo_t *cr, guint j, guint i) { GtkStyleContext *cell_pattern_style_context; GdkRGBA *fg_color; GValue value = {0,}; cell_pattern_style_context = gtk_widget_get_style_context(GTK_WIDGET(cell_pattern->drawing_area)); gtk_style_context_get_property(cell_pattern_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); cairo_rectangle(cr, (gdouble) j * (gdouble) cell_pattern->cell_width + 1.0, (gdouble) i * (gdouble) cell_pattern->cell_height + 1.0, (gdouble) cell_pattern->cell_width - 1.0, (gdouble) cell_pattern->cell_height - 1.0); cairo_fill(cr); g_boxed_free(GDK_TYPE_RGBA, fg_color); } void ags_cell_pattern_unpaint_gutter_point(AgsCellPattern *cell_pattern, cairo_t *cr, guint j, guint i) { GtkStyleContext *cell_pattern_style_context; GdkRGBA *bg_color; GValue value = {0,}; cell_pattern_style_context = gtk_widget_get_style_context(GTK_WIDGET(cell_pattern->drawing_area)); gtk_style_context_get_property(cell_pattern_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, (gdouble) j * (gdouble) cell_pattern->cell_width + 1.0, (gdouble) i * (gdouble) cell_pattern->cell_height + 1.0, (gdouble) cell_pattern->cell_width - 1.0, (gdouble) cell_pattern->cell_height - 1.0); cairo_fill(cr); g_boxed_free(GDK_TYPE_RGBA, bg_color); } /** * ags_cell_pattern_led_queue_draw_timeout: * @cell_pattern: the #AgsCellPattern * * Queue draw led. * * Returns: %TRUE if continue timeout, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_cell_pattern_led_queue_draw_timeout(AgsCellPattern *cell_pattern) { if(g_hash_table_lookup(ags_cell_pattern_led_queue_draw, cell_pattern) != NULL){ AgsMachine *machine; AgsAudio *audio; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; GList *list_start, *list; GList *start_recall, *recall; guint offset; guint64 active_led_new; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); if(machine == NULL){ return(TRUE); } audio = machine->audio; /* get some recalls */ recall_id = NULL; g_object_get(audio, "recall-id", &list_start, NULL); list = list_start; while(list != NULL){ AgsRecyclingContext *current; g_object_get(list->data, "recycling-context", ¤t, NULL); if(current != NULL){ g_object_unref(current); g_object_get(current, "parent", ¤t, NULL); if(current != NULL){ g_object_unref(current); } if(current == NULL && ags_recall_id_check_sound_scope(list->data, AGS_SOUND_SCOPE_SEQUENCER)){ recall_id = list->data; g_object_get(audio, "play", &start_recall, NULL); play_count_beats_audio = NULL; play_count_beats_audio_run = NULL; recall = ags_recall_find_type(start_recall, AGS_TYPE_COUNT_BEATS_AUDIO); if(recall != NULL){ play_count_beats_audio = AGS_COUNT_BEATS_AUDIO(recall->data); } recall = ags_recall_find_type_with_recycling_context(start_recall, AGS_TYPE_COUNT_BEATS_AUDIO_RUN, (GObject *) recall_id->recycling_context); if(recall != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall->data); } g_list_free_full(start_recall, g_object_unref); if(play_count_beats_audio == NULL || play_count_beats_audio_run == NULL){ recall_id = NULL; }else{ break; } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(recall_id == NULL){ return(TRUE); } /* active led */ g_object_get(play_count_beats_audio_run, "sequencer-counter", &active_led_new, NULL); cell_pattern->active_led = (guint) (active_led_new % cell_pattern->n_cols); ags_led_array_unset_all((AgsLedArray *) cell_pattern->hled_array); ags_led_array_set_nth((AgsLedArray *) cell_pattern->hled_array, cell_pattern->active_led); return(TRUE); }else{ return(FALSE); } } /** * ags_cell_pattern_new: * * Creates an #AgsCellPattern * * Returns: a new #AgsCellPattern * * Since: 3.0.0 */ AgsCellPattern* ags_cell_pattern_new() { AgsCellPattern *cell_pattern; cell_pattern = (AgsCellPattern *) g_object_new(AGS_TYPE_CELL_PATTERN, NULL); return(cell_pattern); } gsequencer-3.1.3/ags/X/machine/ags_spectrometer_callbacks.h0000644000175000017500000000304113607210263020701 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SPECTROMETER_CALLBACKS_H__ #define __AGS_SPECTROMETER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_spectrometer_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsSpectrometer *spectrometer); void ags_spectrometer_resize_audio_channels_callback(AgsSpectrometer *spectrometer, guint audio_channels, guint audio_channels_old, gpointer data); void ags_spectrometer_resize_pads_callback(AgsSpectrometer *spectrometer, GType channel_type, guint pads, guint pads_old, gpointer data); G_END_DECLS #endif /*__AGS_SPECTROMETER_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_live_lv2_bridge.c0000644000175000017500000014761013607210263017232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_live_lv2_bridge_class_init(AgsLiveLv2BridgeClass *live_lv2_bridge); void ags_live_lv2_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_live_lv2_bridge_init(AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_live_lv2_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_live_lv2_bridge_finalize(GObject *gobject); void ags_live_lv2_bridge_connect(AgsConnectable *connectable); void ags_live_lv2_bridge_disconnect(AgsConnectable *connectable); void ags_live_lv2_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_live_lv2_bridge_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data); void ags_live_lv2_bridge_map_recall(AgsMachine *machine); /** * SECTION:ags_live_lv2_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsLiveLv2Bridge * @section_id: * @include: ags/X/ags_live_lv2_bridge.h * * #AgsLiveLv2Bridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_URI, PROP_INDEX, PROP_HAS_MIDI, PROP_HAS_GUI, PROP_GUI_FILENAME, PROP_GUI_URI, }; static gpointer ags_live_lv2_bridge_parent_class = NULL; static AgsConnectableInterface* ags_live_lv2_bridge_parent_connectable_interface; extern GHashTable *ags_effect_bulk_indicator_queue_draw; GHashTable *ags_live_lv2_bridge_lv2ui_handle = NULL; GHashTable *ags_live_lv2_bridge_lv2ui_idle = NULL; GType ags_live_lv2_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_live_lv2_bridge = 0; static const GTypeInfo ags_live_lv2_bridge_info = { sizeof(AgsLiveLv2BridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_live_lv2_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLiveLv2Bridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_live_lv2_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_live_lv2_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_live_lv2_bridge = g_type_register_static(AGS_TYPE_MACHINE, "AgsLiveLv2Bridge", &ags_live_lv2_bridge_info, 0); g_type_add_interface_static(ags_type_live_lv2_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_live_lv2_bridge); } return g_define_type_id__volatile; } void ags_live_lv2_bridge_class_init(AgsLiveLv2BridgeClass *live_lv2_bridge) { AgsMachineClass *machine; GObjectClass *gobject; GParamSpec *param_spec; ags_live_lv2_bridge_parent_class = g_type_class_peek_parent(live_lv2_bridge); /* GObjectClass */ gobject = G_OBJECT_CLASS(live_lv2_bridge); gobject->set_property = ags_live_lv2_bridge_set_property; gobject->get_property = ags_live_lv2_bridge_get_property; gobject->finalize = ags_live_lv2_bridge_finalize; /* properties */ /** * AgsRecallLiveLv2:filename: * * The plugin's filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", "the object file", "The filename as string of object file", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecallLiveLv2:effect: * * The effect's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", "the effect", "The effect's string representation", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsRecallLiveLv2:uri: * * The uri's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("uri", "the uri", "The uri's string representation", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URI, param_spec); /** * AgsRecallLiveLv2:index: * * The uri's index. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("index", "index of uri", "The numerical index of uri", 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX, param_spec); /** * AgsRecallLiveLv2:has-midi: * * If has-midi is set to %TRUE appropriate flag is set * to audio in order to become a sequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("has-midi", "has-midi", "If effect has-midi", FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_HAS_MIDI, param_spec); /** * AgsRecallLiveLv2:has-gui: * * If has-gui is set to %TRUE 128 inputs are allocated and appropriate flag is set * to audio in order to become a sequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("has-gui", "has-gui", "If effect has-gui", FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_HAS_GUI, param_spec); /** * AgsRecallLiveLv2:gui-filename: * * The plugin's GUI filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("gui-filename", "the GUI object file", "The filename as string of GUI object file", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GUI_FILENAME, param_spec); /** * AgsRecallLiveLv2:gui-uri: * * The GUI's uri name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("gui-uri", "the gui-uri", "The gui-uri's string representation", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GUI_URI, param_spec); /* AgsMachine */ machine = (AgsMachineClass *) live_lv2_bridge; machine->map_recall = ags_live_lv2_bridge_map_recall; } void ags_live_lv2_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_live_lv2_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_live_lv2_bridge_connect; connectable->disconnect = ags_live_lv2_bridge_disconnect; } void ags_live_lv2_bridge_init(AgsLiveLv2Bridge *live_lv2_bridge) { GtkTable *table; GtkImageMenuItem *item; AgsAudio *audio; g_signal_connect_after((GObject *) live_lv2_bridge, "parent-set", G_CALLBACK(ags_live_lv2_bridge_parent_set_callback), (gpointer) live_lv2_bridge); if(ags_live_lv2_bridge_lv2ui_handle == NULL){ ags_live_lv2_bridge_lv2ui_handle = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } if(ags_live_lv2_bridge_lv2ui_idle == NULL){ ags_live_lv2_bridge_lv2ui_idle = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } audio = AGS_MACHINE(live_lv2_bridge)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SKIP_INPUT)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); // audio->flags &= (~AGS_AUDIO_NOTATION_DEFAULT); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); ags_machine_popup_add_connection_options((AgsMachine *) live_lv2_bridge, (AGS_MACHINE_POPUP_MIDI_DIALOG)); AGS_MACHINE(live_lv2_bridge)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); g_signal_connect_after(G_OBJECT(live_lv2_bridge), "resize-audio-channels", G_CALLBACK(ags_live_lv2_bridge_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(live_lv2_bridge), "resize-pads", G_CALLBACK(ags_live_lv2_bridge_resize_pads), NULL); live_lv2_bridge->flags = 0; live_lv2_bridge->name = NULL; live_lv2_bridge->version = AGS_LIVE_LV2_BRIDGE_DEFAULT_VERSION; live_lv2_bridge->build_id = AGS_LIVE_LV2_BRIDGE_DEFAULT_BUILD_ID; live_lv2_bridge->xml_type = "ags-live-lv2-bridge"; live_lv2_bridge->mapped_output_pad = 0; live_lv2_bridge->mapped_input_pad = 0; live_lv2_bridge->filename = NULL; live_lv2_bridge->effect = NULL; live_lv2_bridge->uri = NULL; live_lv2_bridge->uri_index = 0; live_lv2_bridge->has_midi = FALSE; live_lv2_bridge->lv2_plugin = NULL; live_lv2_bridge->lv2_descriptor = NULL; live_lv2_bridge->lv2_handle = NULL; live_lv2_bridge->port_value = NULL; live_lv2_bridge->has_gui = FALSE; live_lv2_bridge->gui_filename = NULL; live_lv2_bridge->gui_uri = NULL; live_lv2_bridge->lv2ui_plugin = NULL; live_lv2_bridge->ui_descriptor = NULL; live_lv2_bridge->ui_feature = (LV2_Feature **) malloc(3 * sizeof(LV2_Feature *)); live_lv2_bridge->ui_feature[0] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); live_lv2_bridge->ui_feature[0]->data = NULL; live_lv2_bridge->ui_feature[1] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); live_lv2_bridge->ui_feature[1]->data = NULL; live_lv2_bridge->ui_feature[2] = NULL; live_lv2_bridge->ui_handle = NULL; /**/ live_lv2_bridge->vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) gtk_bin_get_child((GtkBin *) live_lv2_bridge), (GtkWidget *) live_lv2_bridge->vbox); live_lv2_bridge->program = NULL; live_lv2_bridge->preset = NULL; /* effect bridge */ AGS_MACHINE(live_lv2_bridge)->bridge = (GtkContainer *) ags_effect_bridge_new(audio); gtk_box_pack_start((GtkBox *) live_lv2_bridge->vbox, (GtkWidget *) AGS_MACHINE(live_lv2_bridge)->bridge, FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge), (GtkWidget *) table, FALSE, FALSE, 0); AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge)->bulk_output = (GtkWidget *) ags_effect_bulk_new(audio, AGS_TYPE_OUTPUT); AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge)->bulk_output)->flags |= (AGS_EFFECT_BULK_HIDE_BUTTONS | AGS_EFFECT_BULK_HIDE_ENTRIES | AGS_EFFECT_BULK_SHOW_LABELS); gtk_table_attach(table, (GtkWidget *) AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge)->bulk_output, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* lv2 menu */ item = (GtkImageMenuItem *) gtk_image_menu_item_new_with_label("Lv2"); gtk_menu_shell_append((GtkMenuShell *) AGS_MACHINE(live_lv2_bridge)->popup, (GtkWidget *) item); gtk_widget_show((GtkWidget *) item); live_lv2_bridge->lv2_menu = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem *) item, (GtkWidget *) live_lv2_bridge->lv2_menu); item = (GtkImageMenuItem *) gtk_image_menu_item_new_with_label(i18n("show GUI")); gtk_menu_shell_append((GtkMenuShell *) live_lv2_bridge->lv2_menu, (GtkWidget *) item); gtk_widget_show_all((GtkWidget *) live_lv2_bridge->lv2_menu); /* plugin widget */ live_lv2_bridge->lv2_gui = NULL; live_lv2_bridge->ui_widget = NULL; live_lv2_bridge->lv2_window = NULL; } void ags_live_lv2_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLiveLv2Bridge *live_lv2_bridge; live_lv2_bridge = AGS_LIVE_LV2_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(filename == live_lv2_bridge->filename){ return; } if(live_lv2_bridge->filename != NULL){ g_free(live_lv2_bridge->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) live_lv2_bridge); ags_window_show_error(window, g_strdup_printf("Plugin file not present %s", filename)); } } live_lv2_bridge->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == live_lv2_bridge->effect){ return; } if(live_lv2_bridge->effect != NULL){ g_free(live_lv2_bridge->effect); } live_lv2_bridge->effect = g_strdup(effect); } break; case PROP_URI: { gchar *uri; uri = g_value_get_string(value); if(uri == live_lv2_bridge->uri){ return; } if(live_lv2_bridge->uri != NULL){ g_free(live_lv2_bridge->uri); } live_lv2_bridge->uri = g_strdup(uri); } break; case PROP_INDEX: { unsigned long uri_index; uri_index = g_value_get_ulong(value); if(uri_index == live_lv2_bridge->uri_index){ return; } live_lv2_bridge->uri_index = uri_index; } break; case PROP_HAS_MIDI: { gboolean has_midi; has_midi = g_value_get_boolean(value); if(live_lv2_bridge->has_midi == has_midi){ return; } live_lv2_bridge->has_midi = has_midi; } break; case PROP_HAS_GUI: { GtkWindow *window; gboolean has_gui; has_gui = g_value_get_boolean(value); if(live_lv2_bridge->has_gui == has_gui){ return; } live_lv2_bridge->has_gui = has_gui; } break; case PROP_GUI_FILENAME: { GtkWindow *window; gchar *gui_filename; gui_filename = g_value_get_string(value); if(live_lv2_bridge->gui_filename == gui_filename){ return; } live_lv2_bridge->gui_filename = g_strdup(gui_filename); } break; case PROP_GUI_URI: { gchar *gui_uri; gui_uri = g_value_get_string(value); if(gui_uri == live_lv2_bridge->gui_uri){ return; } if(live_lv2_bridge->gui_uri != NULL){ g_free(live_lv2_bridge->gui_uri); } live_lv2_bridge->gui_uri = g_strdup(gui_uri); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_live_lv2_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLiveLv2Bridge *live_lv2_bridge; live_lv2_bridge = AGS_LIVE_LV2_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, live_lv2_bridge->filename); } break; case PROP_EFFECT: { g_value_set_string(value, live_lv2_bridge->effect); } break; case PROP_URI: { g_value_set_string(value, live_lv2_bridge->uri); } break; case PROP_INDEX: { g_value_set_ulong(value, live_lv2_bridge->uri_index); } break; case PROP_HAS_MIDI: { g_value_set_boolean(value, live_lv2_bridge->has_midi); } break; case PROP_HAS_GUI: { g_value_set_boolean(value, live_lv2_bridge->has_gui); } break; case PROP_GUI_FILENAME: { g_value_set_string(value, live_lv2_bridge->gui_filename); } break; case PROP_GUI_URI: { g_value_set_string(value, live_lv2_bridge->gui_uri); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_live_lv2_bridge_finalize(GObject *gobject) { AgsLiveLv2Bridge *live_lv2_bridge; live_lv2_bridge = AGS_LIVE_LV2_BRIDGE(gobject); /* lv2 plugin */ if(live_lv2_bridge->lv2_plugin != NULL){ g_object_unref(live_lv2_bridge->lv2_plugin); } /* lv2ui plugin */ if(live_lv2_bridge->lv2ui_plugin != NULL){ g_object_unref(live_lv2_bridge->lv2ui_plugin); } /* plugin widget */ if(live_lv2_bridge->ui_handle != NULL){ live_lv2_bridge->ui_descriptor->cleanup(live_lv2_bridge->ui_handle[0]); g_hash_table_remove(ags_live_lv2_bridge_lv2ui_handle, live_lv2_bridge->ui_handle); g_hash_table_remove(ags_live_lv2_bridge_lv2ui_idle, live_lv2_bridge->ui_handle); } if(live_lv2_bridge->lv2_window != NULL){ gtk_widget_destroy(live_lv2_bridge->lv2_window); } /* call parent */ G_OBJECT_CLASS(ags_live_lv2_bridge_parent_class)->finalize(gobject); } void ags_live_lv2_bridge_connect(AgsConnectable *connectable) { AgsLiveLv2Bridge *live_lv2_bridge; AgsEffectBridge *effect_bridge; AgsBulkMember *bulk_member; GtkWidget *control; GList *list, *list_start; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_live_lv2_bridge_parent_connectable_interface->connect(connectable); live_lv2_bridge = AGS_LIVE_LV2_BRIDGE(connectable); /* menu */ list = list_start = gtk_container_get_children((GtkContainer *) live_lv2_bridge->lv2_menu); g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_live_lv2_bridge_show_gui_callback), live_lv2_bridge); g_list_free(list_start); /* program */ if(live_lv2_bridge->program != NULL){ g_signal_connect_after(G_OBJECT(live_lv2_bridge->program), "changed", G_CALLBACK(ags_live_lv2_bridge_program_changed_callback), live_lv2_bridge); } /* bulk member */ effect_bridge = AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge); list = list_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(effect_bridge->bulk_output)->table); while(list != NULL){ bulk_member = list->data; control = gtk_bin_get_child(GTK_BIN(bulk_member)); if(bulk_member->widget_type == AGS_TYPE_DIAL){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_live_lv2_bridge_dial_changed_callback), live_lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_VSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_live_lv2_bridge_vscale_changed_callback), live_lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_HSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_live_lv2_bridge_hscale_changed_callback), live_lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_SPIN_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_live_lv2_bridge_spin_button_changed_callback), live_lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_CHECK_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_live_lv2_bridge_check_button_clicked_callback), live_lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_TOGGLE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_live_lv2_bridge_toggle_button_clicked_callback), live_lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_live_lv2_bridge_button_clicked_callback), live_lv2_bridge); } list = list->next; } g_list_free(list_start); } void ags_live_lv2_bridge_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_live_lv2_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsLiveLv2Bridge *live_lv2_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint output_pads, input_pads; live_lv2_bridge = (AgsLiveLv2Bridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output", &start_output, "input", &start_input, "output-pads", &output_pads, "input-pads", &input_pads, NULL); if(input_pads == 0 && output_pads == 0){ return; } if(audio_channels > audio_channels_old){ /* AgsInput */ channel = start_input; if(channel != NULL){ g_object_ref(channel); } while(channel != NULL){ /* get next pad */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 1); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } while(channel != NULL){ /* get next pad */ next_pad = ags_channel_next_pad(channel); if(next_pad != NULL){ g_object_unref(next_pad); } nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_live_lv2_bridge_input_map_recall(live_lv2_bridge, audio_channels_old, 0); ags_live_lv2_bridge_output_map_recall(live_lv2_bridge, audio_channels_old, 0); } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_live_lv2_bridge_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data) { AgsLiveLv2Bridge *live_lv2_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint audio_channels; gboolean grow; live_lv2_bridge = (AgsLiveLv2Bridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output", &start_output, "input", &start_input, "audio-channels", &audio_channels, NULL); if(pads == pads_old || audio_channels == 0){ return; } if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ if(grow){ /* AgsInput */ nth_channel = ags_channel_pad_nth(start_input, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 1); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_live_lv2_bridge_input_map_recall(live_lv2_bridge, 0, pads_old); } }else{ live_lv2_bridge->mapped_input_pad = pads; } }else{ if(grow){ /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_live_lv2_bridge_output_map_recall(live_lv2_bridge, 0, pads_old); } }else{ live_lv2_bridge->mapped_output_pad = pads; } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_live_lv2_bridge_map_recall(AgsMachine *machine) { AgsWindow *window; AgsLiveLv2Bridge *live_lv2_bridge; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayLv2Audio *play_lv2_audio; AgsPlayLv2AudioRun *play_lv2_audio_run; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); live_lv2_bridge = (AgsLiveLv2Bridge *) machine; audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-lv2 */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-lv2", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_BULK), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_LV2_AUDIO); if(play != NULL){ play_lv2_audio = AGS_PLAY_LV2_AUDIO(play->data); g_object_set(play_lv2_audio, "filename", live_lv2_bridge->filename, "effect", live_lv2_bridge->effect, NULL); ags_play_lv2_audio_load(play_lv2_audio); ags_play_lv2_audio_load_ports(play_lv2_audio); } play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_LV2_AUDIO_RUN); if(play != NULL){ play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_lv2_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(play_lv2_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_live_lv2_bridge_input_map_recall(live_lv2_bridge, 0, 0); /* depending on destination */ ags_live_lv2_bridge_output_map_recall(live_lv2_bridge, 0, 0); /* call parent */ AGS_MACHINE_CLASS(ags_live_lv2_bridge_parent_class)->map_recall(machine); } void ags_live_lv2_bridge_input_map_recall(AgsLiveLv2Bridge *live_lv2_bridge, guint audio_channel_start, guint input_pad_start) { AgsAudio *audio; audio = AGS_MACHINE(live_lv2_bridge)->audio; if(live_lv2_bridge->mapped_input_pad > input_pad_start){ return; } live_lv2_bridge->mapped_input_pad = audio->input_pads; } void ags_live_lv2_bridge_output_map_recall(AgsLiveLv2Bridge *live_lv2_bridge, guint audio_channel_start, guint output_pad_start) { AgsAudio *audio; audio = AGS_MACHINE(live_lv2_bridge)->audio; if(live_lv2_bridge->mapped_output_pad > output_pad_start){ return; } live_lv2_bridge->mapped_output_pad = audio->output_pads; } void ags_live_lv2_bridge_load_program(AgsLiveLv2Bridge *live_lv2_bridge) { AgsLv2Plugin *lv2_plugin; LV2_Descriptor *plugin_descriptor; LV2_Programs_Interface *program_interface; /* retrieve lv2 plugin */ lv2_plugin = live_lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = live_lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), live_lv2_bridge->filename, live_lv2_bridge->effect); g_object_ref(lv2_plugin); live_lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } plugin_descriptor = live_lv2_bridge->lv2_descriptor; if(plugin_descriptor != NULL && plugin_descriptor->extension_data != NULL && (program_interface = plugin_descriptor->extension_data(LV2_PROGRAMS__Interface)) != NULL){ GtkListStore *model; GtkTreeIter iter; LV2_Program_Descriptor *program_descriptor; uint32_t i; if(live_lv2_bridge->lv2_handle == NULL){ guint samplerate; guint buffer_size; g_object_get(AGS_MACHINE(live_lv2_bridge)->audio, "samplerate", &samplerate, "buffer-size", &buffer_size, NULL); live_lv2_bridge->lv2_handle = (LV2_Handle *) ags_base_plugin_instantiate((AgsBasePlugin *) lv2_plugin, samplerate, buffer_size); } if(live_lv2_bridge->port_value == NULL){ GList *start_plugin_port, *plugin_port; guint port_count; port_count = g_list_length(AGS_BASE_PLUGIN(lv2_plugin)->plugin_port); if(port_count > 0){ live_lv2_bridge->port_value = (float *) malloc(port_count * sizeof(float)); } g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ plugin_descriptor->connect_port(live_lv2_bridge->lv2_handle[0], AGS_PLUGIN_PORT(plugin_port->data)->port_index, &(live_lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index])); } } plugin_port = plugin_port->next; } g_list_free_full(start_plugin_port, g_object_unref); } if(live_lv2_bridge->program == NULL){ GtkHBox *hbox; GtkLabel *label; /* program */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) live_lv2_bridge->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_box_reorder_child(GTK_BOX(live_lv2_bridge->vbox), GTK_WIDGET(hbox), 0); label = (GtkLabel *) gtk_label_new(i18n("program")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); live_lv2_bridge->program = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) live_lv2_bridge->program, FALSE, FALSE, 0); if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(live_lv2_bridge)->flags)) != 0){ g_signal_connect_after(G_OBJECT(live_lv2_bridge->program), "changed", G_CALLBACK(ags_live_lv2_bridge_program_changed_callback), live_lv2_bridge); } model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_ULONG); gtk_combo_box_set_model(GTK_COMBO_BOX(live_lv2_bridge->program), GTK_TREE_MODEL(model)); }else{ model = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(live_lv2_bridge->program))); gtk_list_store_clear(GTK_LIST_STORE(model)); } for(i = 0; (program_descriptor = program_interface->get_program(live_lv2_bridge->lv2_handle[0], i)) != NULL; i++){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, program_descriptor->name, 1, program_descriptor->bank, 2, program_descriptor->program, -1); } } } void ags_live_lv2_bridge_load_preset(AgsLiveLv2Bridge *live_lv2_bridge) { GtkHBox *hbox; GtkLabel *label; AgsLv2Plugin *lv2_plugin; GList *list; /* retrieve lv2 plugin */ lv2_plugin = live_lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = live_lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), live_lv2_bridge->filename, live_lv2_bridge->effect); g_object_ref(lv2_plugin); live_lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } /* preset */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) live_lv2_bridge->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_box_reorder_child(GTK_BOX(live_lv2_bridge->vbox), GTK_WIDGET(hbox), 0); label = (GtkLabel *) gtk_label_new(i18n("preset")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); live_lv2_bridge->preset = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) live_lv2_bridge->preset, FALSE, FALSE, 0); /* preset */ list = lv2_plugin->preset; while(list != NULL){ if(AGS_LV2_PRESET(list->data)->preset_label != NULL){ gtk_combo_box_text_append_text(live_lv2_bridge->preset, AGS_LV2_PRESET(list->data)->preset_label); } list = list->next; } gtk_widget_show_all((GtkWidget *) hbox); /* connect preset */ g_signal_connect_after(G_OBJECT(live_lv2_bridge->preset), "changed", G_CALLBACK(ags_live_lv2_bridge_preset_changed_callback), live_lv2_bridge); } void ags_live_lv2_bridge_load_midi(AgsLiveLv2Bridge *live_lv2_bridge) { //TODO:JK: implement me } void ags_live_lv2_bridge_load_gui(AgsLiveLv2Bridge *live_lv2_bridge) { AgsLv2Plugin *lv2_plugin; AgsLv2uiPlugin *lv2ui_plugin; GList *list; /* retrieve lv2 plugin */ lv2_plugin = live_lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = live_lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), live_lv2_bridge->filename, live_lv2_bridge->effect); g_object_ref(lv2_plugin); live_lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL || lv2_plugin->ui_uri == NULL){ return; } /* retrieve lv2ui plugin */ lv2ui_plugin = live_lv2_bridge->lv2ui_plugin; if(lv2ui_plugin == NULL){ list = ags_lv2ui_plugin_find_gui_uri(ags_lv2ui_manager_get_instance()->lv2ui_plugin, lv2_plugin->ui_uri); if(list == NULL){ return; } lv2ui_plugin = live_lv2_bridge->lv2ui_plugin = list->data; g_object_ref(lv2ui_plugin); live_lv2_bridge->ui_descriptor = AGS_BASE_PLUGIN(lv2ui_plugin)->ui_plugin_descriptor; } #ifdef AGS_DEBUG g_message("ui filename - %s, %s", AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, lv2_plugin->ui_uri); #endif /* apply ui */ g_object_set(live_lv2_bridge, "has-gui", TRUE, "gui-uri", lv2_plugin->ui_uri, "gui-filename", AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, NULL); } void ags_live_lv2_bridge_load(AgsLiveLv2Bridge *live_lv2_bridge) { AgsEffectBulk *effect_bulk; AgsBulkMember *bulk_member; GtkListStore *model; GtkTreeIter iter; AgsLv2Plugin *lv2_plugin; GList *start_list, *list; GList *start_plugin_port, *plugin_port; gchar *uri; gchar *port_name; guint samplerate; guint buffer_size; gdouble step; unsigned long port_count; gboolean has_output_port; guint x, y; unsigned long i, j; guint k; /* retrieve lv2 plugin */ lv2_plugin = live_lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = live_lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), live_lv2_bridge->filename, live_lv2_bridge->effect); g_object_ref(lv2_plugin); live_lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } /* get uri */ g_object_get(lv2_plugin, "uri", &uri, NULL); /* URI */ g_object_set(live_lv2_bridge, "uri", uri, NULL); /* samplerate and buffer size */ samplerate = ags_soundcard_helper_config_get_samplerate(ags_config_get_instance()); buffer_size = ags_soundcard_helper_config_get_buffer_size(ags_config_get_instance()); /* */ effect_bulk = AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge)->bulk_output); /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bulk->table)); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_bulk->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* load ports */ g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLv2Conversion *lv2_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; guint port_index; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_BULK_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_bulk->table, y + 1, AGS_EFFECT_BULK_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_TOGGLED)){ if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); port_index = AGS_PLUGIN_PORT(plugin_port->data)->port_index; g_rec_mutex_unlock(plugin_port_mutex); /* add bulk member */ plugin_name = g_strdup_printf("lv2-<%s>", uri); control_port = g_strdup_printf("%u/%u", k + 1, port_count); bulk_member = (AgsBulkMember *) g_object_new(AGS_TYPE_BULK_MEMBER, "widget-type", widget_type, "widget-label", AGS_PLUGIN_PORT(plugin_port->data)->port_name, "plugin-name", plugin_name, "filename", live_lv2_bridge->filename, "effect", live_lv2_bridge->effect, "specifier", AGS_PLUGIN_PORT(plugin_port->data)->port_name, "port-index", port_index, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_bulk_member_get_widget(bulk_member); g_free(plugin_name); g_free(control_port); /* lv2 conversion */ lv2_conversion = NULL; if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_LOGARITHMIC)){ if(lv2_conversion == NULL || !AGS_IS_LV2_CONVERSION(lv2_conversion)){ lv2_conversion = ags_lv2_conversion_new(); } lv2_conversion->flags |= AGS_LV2_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(bulk_member, "conversion", lv2_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_TOGGLED)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(AGS_PLUGIN_PORT(plugin_port->data), AGS_PLUGIN_PORT_INTEGER)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_bulk_indicator_queue_draw, child_widget, ags_effect_bulk_indicator_queue_draw_timeout); effect_bulk->queued_drawing = g_list_prepend(effect_bulk->queued_drawing, child_widget); g_timeout_add(1000 / 30, (GSourceFunc) ags_effect_bulk_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("lv2 bounds: %f %f", lower_bound, upper_bound); #endif gtk_table_attach(effect_bulk->table, (GtkWidget *) bulk_member, x, x + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(bulk_member)); gtk_widget_show_all((GtkWidget *) effect_bulk->table); x++; } plugin_port = plugin_port->next; k++; } g_list_free_full(start_plugin_port, g_object_unref); /* program */ live_lv2_bridge->lv2_handle = ags_base_plugin_instantiate((AgsBasePlugin *) lv2_plugin, samplerate, buffer_size); if((AGS_LV2_PLUGIN_HAS_PROGRAM_INTERFACE & (lv2_plugin->flags)) != 0){ ags_live_lv2_bridge_load_program(live_lv2_bridge); } /* preset */ if(lv2_plugin->preset != NULL){ ags_live_lv2_bridge_load_preset(live_lv2_bridge); } /* load gui */ ags_live_lv2_bridge_load_gui(live_lv2_bridge); } /** * ags_live_lv2_bridge_lv2ui_idle_timeout: * @widget: the LV2UI_Handle * * Idle lv2 ui. * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_live_lv2_bridge_lv2ui_idle_timeout(GtkWidget *widget) { AgsLiveLv2Bridge *live_lv2_bridge; AgsLv2uiPlugin *lv2ui_plugin; int retval; if((live_lv2_bridge = g_hash_table_lookup(ags_live_lv2_bridge_lv2ui_idle, widget)) != NULL){ lv2ui_plugin = live_lv2_bridge->lv2ui_plugin; if(lv2ui_plugin->feature != NULL && lv2ui_plugin->feature[0]->data != NULL){ retval = ((struct _LV2UI_Idle_Interface *) lv2ui_plugin->feature[0]->data)->idle(live_lv2_bridge->ui_handle[0]); if(retval != 0){ g_hash_table_remove(ags_live_lv2_bridge_lv2ui_handle, live_lv2_bridge->ui_handle); live_lv2_bridge->ui_handle = NULL; return(FALSE); } } return(TRUE); }else{ return(FALSE); } } /** * ags_live_lv2_bridge_new: * @soundcard: the assigned soundcard. * @filename: the plugin.so * @effect: the effect * * Create a new instance of #AgsLiveLv2Bridge * * Returns: the new #AgsLiveLv2Bridge * * Since: 3.0.0 */ AgsLiveLv2Bridge* ags_live_lv2_bridge_new(GObject *soundcard, gchar *filename, gchar *effect) { AgsLiveLv2Bridge *live_lv2_bridge; live_lv2_bridge = (AgsLiveLv2Bridge *) g_object_new(AGS_TYPE_LIVE_LV2_BRIDGE, NULL); g_object_set(AGS_MACHINE(live_lv2_bridge)->audio, "output-soundcard", soundcard, NULL); g_object_set(live_lv2_bridge, "filename", filename, "effect", effect, NULL); return(live_lv2_bridge); } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_pad.c0000644000175000017500000001207513607210263020043 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_ffplayer_input_pad_class_init(AgsFFPlayerInputPadClass *ffplayer_input_pad); void ags_ffplayer_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ffplayer_input_pad_init(AgsFFPlayerInputPad *ffplayer_input_pad); void ags_ffplayer_input_pad_finalize(GObject *gobject); void ags_ffplayer_input_pad_connect(AgsConnectable *connectable); void ags_ffplayer_input_pad_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ffplayer_input_pad * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsFFPlayerInputPad * @section_id: * @include: ags/X/machine/ags_ffplayer_input_pad.h * * #AgsFFPlayerInputPad is a composite widget to visualize one #AgsChannel. It should be * packed by an #AgsFFPlayerInputPad. */ static gpointer ags_ffplayer_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_ffplayer_input_pad_parent_connectable_interface; GType ags_ffplayer_input_pad_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ffplayer_input_pad = 0; static const GTypeInfo ags_ffplayer_input_pad_info = { sizeof(AgsFFPlayerInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ffplayer_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFFPlayerInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ffplayer_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ffplayer_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ffplayer_input_pad = g_type_register_static(AGS_TYPE_EFFECT_PAD, "AgsFFPlayerInputPad", &ags_ffplayer_input_pad_info, 0); g_type_add_interface_static(ags_type_ffplayer_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ffplayer_input_pad); } return g_define_type_id__volatile; } void ags_ffplayer_input_pad_class_init(AgsFFPlayerInputPadClass *ffplayer_input_pad) { GObjectClass *gobject; ags_ffplayer_input_pad_parent_class = g_type_class_peek_parent(ffplayer_input_pad); /* GObjectClass */ gobject = (GObjectClass *) ffplayer_input_pad; gobject->finalize = ags_ffplayer_input_pad_finalize; } void ags_ffplayer_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_ffplayer_input_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ffplayer_input_pad_connect; connectable->disconnect = ags_ffplayer_input_pad_disconnect; } void ags_ffplayer_input_pad_init(AgsFFPlayerInputPad *ffplayer_input_pad) { //TODO:JK: implement me } void ags_ffplayer_input_pad_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_ffplayer_input_pad_parent_class)->finalize(gobject); } void ags_ffplayer_input_pad_connect(AgsConnectable *connectable) { if((AGS_EFFECT_PAD_CONNECTED & (AGS_EFFECT_PAD(connectable)->flags)) != 0){ return; } ags_ffplayer_input_pad_parent_connectable_interface->connect(connectable); //TODO:JK: implement me } void ags_ffplayer_input_pad_disconnect(AgsConnectable *connectable) { if((AGS_EFFECT_PAD_CONNECTED & (AGS_EFFECT_PAD(connectable)->flags)) == 0){ return; } ags_ffplayer_input_pad_parent_connectable_interface->disconnect(connectable); //TODO:JK: implement me } /** * ags_ffplayer_input_pad_new: * @channel: the #AgsChannel to visualize * * Creates an #AgsFFPlayerInputPad * * Returns: a new #AgsFFPlayerInputPad * * Since: 3.0.0 */ AgsFFPlayerInputPad* ags_ffplayer_input_pad_new(AgsChannel *channel) { AgsFFPlayerInputPad *ffplayer_input_pad; ffplayer_input_pad = (AgsFFPlayerInputPad *) g_object_new(AGS_TYPE_FFPLAYER_INPUT_PAD, "channel", channel, NULL); return(ffplayer_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_lv2_bridge.h0000644000175000017500000000732313607210263016214 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_BRIDGE_H__ #define __AGS_LV2_BRIDGE_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_BRIDGE (ags_lv2_bridge_get_type()) #define AGS_LV2_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_BRIDGE, AgsLv2Bridge)) #define AGS_LV2_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_BRIDGE, AgsLv2BridgeClass)) #define AGS_IS_LV2_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LV2_BRIDGE)) #define AGS_IS_LV2_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LV2_BRIDGE)) #define AGS_LV2_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LV2_BRIDGE, AgsLv2BridgeClass)) #define AGS_LV2_BRIDGE_DEFAULT_VERSION "0.4.3" #define AGS_LV2_BRIDGE_DEFAULT_BUILD_ID "CEST 13-05-2015 13:40" typedef struct _AgsLv2Bridge AgsLv2Bridge; typedef struct _AgsLv2BridgeClass AgsLv2BridgeClass; typedef enum{ AGS_LV2_BRIDGE_DISPLAY_INPUT = 1, AGS_LV2_BRIDGE_BULK_OUTPUT = 1 << 1, AGS_LV2_BRIDGE_DISPLAY_OUTPUT = 1 << 2, AGS_LV2_BRIDGE_BULK_INPUT = 1 << 3, AGS_LV2_BRIDGE_NO_UPDATE = 1 << 4, }AgsLv2BridgeFlags; struct _AgsLv2Bridge { AgsMachine machine; guint flags; gchar *name; gchar *version; gchar *build_id; gchar *xml_type; guint mapped_output_pad; guint mapped_input_pad; gchar *filename; gchar *effect; gchar *uri; guint uri_index; gboolean has_midi; AgsLv2Plugin *lv2_plugin; LV2_Descriptor *lv2_descriptor; LV2_Handle *lv2_handle; float *port_value; gboolean has_gui; gchar *gui_filename; gchar *gui_uri; AgsLv2uiPlugin *lv2ui_plugin; LV2UI_Descriptor *ui_descriptor; LV2_Feature **ui_feature; LV2UI_Handle *ui_handle; GtkVBox *vbox; GtkComboBoxText *program; GtkComboBoxText *preset; GtkMenu *lv2_menu; GtkWidget *lv2_gui; GtkWidget *ui_widget; GtkWidget *lv2_window; }; struct _AgsLv2BridgeClass { AgsMachineClass machine; }; GType ags_lv2_bridge_get_type(void); void ags_lv2_bridge_input_map_recall(AgsLv2Bridge *lv2_bridge, guint audio_channel_start, guint input_pad_start); void ags_lv2_bridge_output_map_recall(AgsLv2Bridge *lv2_bridge, guint audio_channel_start, guint output_pad_start); void ags_lv2_bridge_load_program(AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_load_preset(AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_load_midi(AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_load_gui(AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_load(AgsLv2Bridge *lv2_bridge); gboolean ags_lv2_bridge_lv2ui_idle_timeout(GtkWidget *widget); AgsLv2Bridge* ags_lv2_bridge_new(GObject *soundcard, gchar *filename, gchar *effect); G_END_DECLS #endif /*__AGS_LV2_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_output_pad.h0000644000175000017500000000425213607210263017406 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_OUTPUT_PAD_H__ #define __AGS_DRUM_OUTPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DRUM_OUTPUT_PAD (ags_drum_output_pad_get_type()) #define AGS_DRUM_OUTPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DRUM_OUTPUT_PAD, AgsDrumOutputPad)) #define AGS_DRUM_OUTPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DRUM_OUTPUT_PAD, AgsDrumOutputPadClass)) #define AGS_IS_DRUM_OUTPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DRUM_OUTPUT_PAD)) #define AGS_IS_DRUM_OUTPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DRUM_OUTPUT_PAD)) #define AGS_DRUM_OUTPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DRUM_OUTPUT_PAD, AgsDrumOutputPadClass)) typedef struct _AgsDrumOutputPad AgsDrumOutputPad; typedef struct _AgsDrumOutputPadClass AgsDrumOutputPadClass; typedef enum{ AGS_DRUM_OUTPUT_PAD_PLAY_DONE = 1, }AgsDrumOutputPadFlags; struct _AgsDrumOutputPad { AgsPad pad; guint flags; gchar *name; gchar *xml_type; }; struct _AgsDrumOutputPadClass { AgsPadClass pad; }; GType ags_drum_output_pad_get_type(); AgsDrumOutputPad* ags_drum_output_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_DRUM_OUTPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_matrix.h0000644000175000017500000000454513607210263015504 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MATRIX_H__ #define __AGS_MATRIX_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MATRIX (ags_matrix_get_type()) #define AGS_MATRIX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MATRIX, AgsMatrix)) #define AGS_MATRIX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MATRIX, AgsMatrixClass)) #define AGS_IS_MATRIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MATRIX)) #define AGS_IS_MATRIX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MATRIX)) #define AGS_MATRIX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MATRIX, AgsMatrixClass)) typedef struct _AgsMatrix AgsMatrix; typedef struct _AgsMatrixClass AgsMatrixClass; struct _AgsMatrix { AgsMachine machine; guint flags; gchar *name; gchar *xml_type; guint mapped_output_pad; guint mapped_input_pad; GtkTable *table; GtkToggleButton *run; GtkToggleButton *selected; GtkToggleButton *index[9]; AgsCellPattern *cell_pattern; GtkSpinButton *length_spin; GtkCheckButton *loop_button; }; struct _AgsMatrixClass { AgsMachineClass machine; }; GType ags_matrix_get_type(void); void ags_matrix_input_map_recall(AgsMatrix *matrix, guint input_pad_start); void ags_matrix_output_map_recall(AgsMatrix *matrix, guint output_pad_start); AgsMatrix* ags_matrix_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_MATRIX_H__*/ gsequencer-3.1.3/ags/X/machine/ags_mixer.h0000644000175000017500000000357413607210263015325 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIXER_H__ #define __AGS_MIXER_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIXER (ags_mixer_get_type()) #define AGS_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_MIXER, AgsMixer)) #define AGS_MIXER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MIXER, AgsMixerClass)) #define AGS_IS_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, AGS_TYPE_MIXER)) #define AGS_IS_MIXER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MIXER)) #define AGS_MIXER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MIXER, AgsMixerClass)) typedef struct _AgsMixer AgsMixer; typedef struct _AgsMixerClass AgsMixerClass; struct _AgsMixer { AgsMachine machine; gchar *name; gchar *xml_type; GtkHBox *input_pad; }; struct _AgsMixerClass { AgsMachineClass machine; }; GType ags_mixer_get_type(void); AgsMixer* ags_mixer_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_MIXER_H__*/ gsequencer-3.1.3/ags/X/machine/ags_panel_input_pad.h0000644000175000017500000000411313607210263017331 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PANEL_INPUT_PAD_H__ #define __AGS_PANEL_INPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PANEL_INPUT_PAD (ags_panel_input_pad_get_type()) #define AGS_PANEL_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PANEL_INPUT_PAD, AgsPanelInputPad)) #define AGS_PANEL_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PANEL_INPUT_PAD, AgsPanelInputPadClass)) #define AGS_IS_PANEL_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PANEL_INPUT_PAD)) #define AGS_IS_PANEL_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PANEL_INPUT_PAD)) #define AGS_PANEL_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PANEL_INPUT_PAD, AgsPanelInputPadClass)) typedef struct _AgsPanelInputPad AgsPanelInputPad; typedef struct _AgsPanelInputPadClass AgsPanelInputPadClass; struct _AgsPanelInputPad { AgsPad pad; gchar *name; gchar *xml_type; }; struct _AgsPanelInputPadClass { AgsPadClass pad; }; GType ags_panel_input_pad_get_type(); AgsPanelInputPad* ags_panel_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_PANEL_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_matrix_bulk_input.c0000644000175000017500000001211113607210263017717 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_matrix_bulk_input_class_init(AgsMatrixBulkInputClass *matrix_bulk_input); void ags_matrix_bulk_input_connectable_interface_init(AgsConnectableInterface *connectable); void ags_matrix_bulk_input_init(AgsMatrixBulkInput *matrix_bulk_input); void ags_matrix_bulk_input_finalize(GObject *gobject); void ags_matrix_bulk_input_connect(AgsConnectable *connectable); void ags_matrix_bulk_input_disconnect(AgsConnectable *connectable); /** * SECTION:ags_matrix_bulk_input * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsMatrixBulkInput * @section_id: * @include: ags/X/machine/ags_matrix_bulk_input.h * * #AgsMatrixBulkInput is a composite widget to visualize one #AgsChannel. It should be * packed by an #AgsMatrixBulkInput. */ static gpointer ags_matrix_bulk_input_parent_class = NULL; static AgsConnectableInterface *ags_matrix_bulk_input_parent_connectable_interface; GType ags_matrix_bulk_input_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_matrix_bulk_input = 0; static const GTypeInfo ags_matrix_bulk_input_info = { sizeof(AgsMatrixBulkInputClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_matrix_bulk_input_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMatrixBulkInput), 0, /* n_preallocs */ (GInstanceInitFunc) ags_matrix_bulk_input_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_matrix_bulk_input_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_matrix_bulk_input = g_type_register_static(AGS_TYPE_EFFECT_BULK, "AgsMatrixBulkInput", &ags_matrix_bulk_input_info, 0); g_type_add_interface_static(ags_type_matrix_bulk_input, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_matrix_bulk_input); } return g_define_type_id__volatile; } void ags_matrix_bulk_input_class_init(AgsMatrixBulkInputClass *matrix_bulk_input) { GObjectClass *gobject; ags_matrix_bulk_input_parent_class = g_type_class_peek_parent(matrix_bulk_input); /* GObjectClass */ gobject = G_OBJECT_CLASS(matrix_bulk_input); gobject->finalize = ags_matrix_bulk_input_finalize; } void ags_matrix_bulk_input_connectable_interface_init(AgsConnectableInterface *connectable) { ags_matrix_bulk_input_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_matrix_bulk_input_connect; connectable->disconnect = ags_matrix_bulk_input_disconnect; } void ags_matrix_bulk_input_init(AgsMatrixBulkInput *matrix_bulk_input) { //TODO:JK: implement me } void ags_matrix_bulk_input_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_matrix_bulk_input_parent_class)->finalize(gobject); } void ags_matrix_bulk_input_connect(AgsConnectable *connectable) { if((AGS_EFFECT_BULK_CONNECTED & (AGS_EFFECT_BULK(connectable)->flags)) != 0){ return; } ags_matrix_bulk_input_parent_connectable_interface->connect(connectable); //TODO:JK: implement me } void ags_matrix_bulk_input_disconnect(AgsConnectable *connectable) { if((AGS_EFFECT_BULK_CONNECTED & (AGS_EFFECT_BULK(connectable)->flags)) == 0){ return; } ags_matrix_bulk_input_parent_connectable_interface->disconnect(connectable); //TODO:JK: implement me } /** * ags_matrix_bulk_input_new: * @audio: the #AgsAudio to visualize * @channel_type: either %AGS_TYPE_INPUT or %AGS_TYPE_OUTPUT * * Create a new instance of #AgsMatrixBulkInput * * Returns: the new #AgsMatrixBulkInput * * Since: 3.0.0 */ AgsMatrixBulkInput* ags_matrix_bulk_input_new(AgsAudio *audio, GType channel_type) { AgsMatrixBulkInput *matrix_bulk_input; matrix_bulk_input = (AgsMatrixBulkInput *) g_object_new(AGS_TYPE_MATRIX_BULK_INPUT, "audio", audio, "channel-type", channel_type, NULL); return(matrix_bulk_input); } gsequencer-3.1.3/ags/X/machine/ags_drum_output_line_callbacks.h0000644000175000017500000000247713607210263021577 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_OUTPUT_LINE_CALLBACKS_H__ #define __AGS_DRUM_OUTPUT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_drum_output_line_resize_pads_callback(AgsDrum *drum, GType channel_type, guint pads_new, guint pads_old, AgsDrumOutputLine *output_line); G_END_DECLS #endif /*__AGS_DRUM_OUTPUT_LINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_matrix_bridge.c0000644000175000017500000001270313607210263017006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_matrix_bridge_class_init(AgsMatrixBridgeClass *matrix_bridge); void ags_matrix_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_matrix_bridge_init(AgsMatrixBridge *matrix_bridge); void ags_matrix_bridge_finalize(GObject *gobject); void ags_matrix_bridge_connect(AgsConnectable *connectable); void ags_matrix_bridge_disconnect(AgsConnectable *connectable); /** * SECTION:ags_matrix_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsMatrixBridge * @section_id: * @include: ags/X/machine/ags_matrix_bridge.h * * #AgsMatrixBridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ static gpointer ags_matrix_bridge_parent_class = NULL; static AgsConnectableInterface *ags_matrix_bridge_parent_connectable_interface; GType ags_matrix_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_matrix_bridge = 0; static const GTypeInfo ags_matrix_bridge_info = { sizeof(AgsMatrixBridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_matrix_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMatrixBridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_matrix_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_matrix_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_matrix_bridge = g_type_register_static(AGS_TYPE_EFFECT_BRIDGE, "AgsMatrixBridge", &ags_matrix_bridge_info, 0); g_type_add_interface_static(ags_type_matrix_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_matrix_bridge); } return g_define_type_id__volatile; } void ags_matrix_bridge_class_init(AgsMatrixBridgeClass *matrix_bridge) { GObjectClass *gobject; ags_matrix_bridge_parent_class = g_type_class_peek_parent(matrix_bridge); /* GObjectClass */ gobject = G_OBJECT_CLASS(matrix_bridge); gobject->finalize = ags_matrix_bridge_finalize; } void ags_matrix_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_matrix_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_matrix_bridge_connect; connectable->disconnect = ags_matrix_bridge_disconnect; } void ags_matrix_bridge_init(AgsMatrixBridge *matrix_bridge) { GtkFrame *frame; GtkExpander *expander; GtkTable *table; frame = (GtkFrame *) gtk_frame_new("input bridge"); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(matrix_bridge), (GtkWidget *) frame, FALSE, FALSE, 0); expander = (GtkExpander *) gtk_expander_new("show/hide"); gtk_container_add((GtkContainer *) frame, (GtkWidget *) expander); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_container_add((GtkContainer *) expander, (GtkWidget *) table); AGS_EFFECT_BRIDGE(matrix_bridge)->bulk_input = (GtkWidget *) ags_matrix_bulk_input_new(NULL, AGS_TYPE_INPUT); gtk_table_attach(table, (GtkWidget *) AGS_EFFECT_BRIDGE(matrix_bridge)->bulk_input, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } void ags_matrix_bridge_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_matrix_bridge_parent_class)->finalize(gobject); } void ags_matrix_bridge_connect(AgsConnectable *connectable) { if((AGS_EFFECT_BRIDGE_CONNECTED & (AGS_EFFECT_BRIDGE(connectable)->flags)) != 0){ return; } ags_matrix_bridge_parent_connectable_interface->connect(connectable); //TODO:JK: implement me } void ags_matrix_bridge_disconnect(AgsConnectable *connectable) { if((AGS_EFFECT_BRIDGE_CONNECTED & (AGS_EFFECT_BRIDGE(connectable)->flags)) == 0){ return; } ags_matrix_bridge_parent_connectable_interface->connect(connectable); //TODO:JK: implement me } /** * ags_matrix_bridge_new: * @audio: the #AgsAudio to visualize * * Create a new instance of #AgsMatrixBridge * * Returns: the new #AgsMatrixBridge * * Since: 3.0.0 */ AgsMatrixBridge* ags_matrix_bridge_new(AgsAudio *audio) { AgsMatrixBridge *matrix_bridge; matrix_bridge = (AgsMatrixBridge *) g_object_new(AGS_TYPE_MATRIX_BRIDGE, "audio", audio, NULL); return(matrix_bridge); } gsequencer-3.1.3/ags/X/machine/ags_desk_input_pad.h0000644000175000017500000000451513607210263017166 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DESK_INPUT_PAD_H__ #define __AGS_DESK_INPUT_PAD_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DESK_INPUT_PAD (ags_desk_input_pad_get_type()) #define AGS_DESK_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DESK_INPUT_PAD, AgsDeskInputPad)) #define AGS_DESK_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DESK_INPUT_PAD, AgsDeskInputPadClass)) #define AGS_IS_DESK_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DESK_INPUT_PAD)) #define AGS_IS_DESK_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DESK_INPUT_PAD)) #define AGS_DESK_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_DESK_INPUT_PAD, AgsDeskInputPadClass)) typedef struct _AgsDeskInputPad AgsDeskInputPad; typedef struct _AgsDeskInputPadClass AgsDeskInputPadClass; typedef enum{ AGS_DESK_INPUT_PAD_CONNECTED = 1, }AgsDeskInputPadFlags; struct _AgsDeskInputPad { GtkVBox vbox; guint flags; gchar *name; gchar *xml_type; AgsChannel *channel; GtkLabel *position_time; GtkScale *position; GtkToggleButton *play; GtkEntry *filename; GtkButton *grab_filename; AgsIndicator *indicator; GtkScale *volume; }; struct _AgsDeskInputPadClass { GtkVBoxClass vbox; }; GType ags_desk_input_pad_get_type(void); AgsDeskInputPad* ags_desk_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_DESK_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_line_callbacks.h0000644000175000017500000000240113607210263022222 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_INPUT_LINE_CALLBACKS_H__ #define __AGS_FFPLAYER_INPUT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_ffplayer_input_line_notify_channel_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); G_END_DECLS #endif /*__AGS_FFPLAYER_INPUT_LINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_output_pad.c0000644000175000017500000001231713607210263017402 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_drum_output_pad_class_init(AgsDrumOutputPadClass *drum_output_pad); void ags_drum_output_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_drum_output_pad_init(AgsDrumOutputPad *drum_output_pad); void ags_drum_output_pad_connect(AgsConnectable *connectable); void ags_drum_output_pad_disconnect(AgsConnectable *connectable); void ags_drum_output_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_drum_output_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); /** * SECTION:ags_drum_output_pad * @short_description: drum sequencer output pad * @title: AgsDrumOutputPad * @section_id: * @include: ags/X/machine/ags_drum_output_pad.h * * The #AgsDrumOutputPad is a composite widget to act as drum sequencer output pad. */ static gpointer ags_drum_output_pad_parent_class = NULL; static AgsConnectableInterface *ags_drum_output_pad_parent_connectable_interface; GType ags_drum_output_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_drum_output_pad = 0; static const GTypeInfo ags_drum_output_pad_info = { sizeof(AgsDrumOutputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_drum_output_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDrumOutputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_drum_output_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_drum_output_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_drum_output_pad = g_type_register_static(AGS_TYPE_PAD, "AgsDrumOutputPad", &ags_drum_output_pad_info, 0); g_type_add_interface_static(ags_type_drum_output_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_drum_output_pad); } return g_define_type_id__volatile; } void ags_drum_output_pad_class_init(AgsDrumOutputPadClass *drum_output_pad) { GObjectClass *gobject; AgsPadClass *pad; ags_drum_output_pad_parent_class = g_type_class_peek_parent(drum_output_pad); /* AgsPadClass */ pad = (AgsPadClass *) drum_output_pad; pad->set_channel = ags_drum_output_pad_set_channel; pad->resize_lines = ags_drum_output_pad_resize_lines; } void ags_drum_output_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_drum_output_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_drum_output_pad_connect; connectable->disconnect = ags_drum_output_pad_disconnect; } void ags_drum_output_pad_init(AgsDrumOutputPad *drum_output_pad) { drum_output_pad->flags = 0; drum_output_pad->xml_type = "ags-drum-output-pad"; } void ags_drum_output_pad_connect(AgsConnectable *connectable) { AgsDrumOutputPad *drum_output_pad; drum_output_pad = AGS_DRUM_OUTPUT_PAD(connectable); if((AGS_PAD_CONNECTED & (AGS_PAD(drum_output_pad)->flags)) != 0){ return; } ags_drum_output_pad_parent_connectable_interface->connect(connectable); /* empty */ } void ags_drum_output_pad_disconnect(AgsConnectable *connectable) { ags_drum_output_pad_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_drum_output_pad_set_channel(AgsPad *pad, AgsChannel *channel) { AGS_PAD_CLASS(ags_drum_output_pad_parent_class)->set_channel(pad, channel); /* empty */ } void ags_drum_output_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AGS_PAD_CLASS(ags_drum_output_pad_parent_class)->resize_lines(pad, line_type, audio_channels, audio_channels_old); /* empty */ } /** * ags_drum_output_pad_new: * @channel: the assigned channel * * Create a new instance of #AgsDrumOutputPad * * Returns: the new #AgsDrumOutputPad * * Since: 3.0.0 */ AgsDrumOutputPad* ags_drum_output_pad_new(AgsChannel *channel) { AgsDrumOutputPad *drum_output_pad; drum_output_pad = (AgsDrumOutputPad *) g_object_new(AGS_TYPE_DRUM_OUTPUT_PAD, "channel", channel, NULL); return(drum_output_pad); } gsequencer-3.1.3/ags/X/machine/ags_spectrometer_callbacks.c0000644000175000017500000002462713607210263020711 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_spectrometer_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsSpectrometer *spectrometer) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) spectrometer, AGS_TYPE_WINDOW)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_SPECTROMETER)->counter); g_object_set(AGS_MACHINE(spectrometer), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_SPECTROMETER); g_free(str); } void ags_spectrometer_resize_audio_channels_callback(AgsSpectrometer *spectrometer, guint audio_channels, guint audio_channels_old, gpointer data) { AgsCartesian *cartesian; AgsPlot *fg_plot; AgsAudio *audio; guint i; cartesian = spectrometer->cartesian; audio = AGS_MACHINE(spectrometer)->audio; if(audio_channels > audio_channels_old){ if((AGS_MACHINE_MAPPED_RECALL & (AGS_MACHINE(spectrometer)->flags)) != 0){ AgsChannel *start_channel; AgsChannel *channel, *next_channel, *nth_channel; AgsPort *port; guint i; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, "input", &start_channel, NULL); /* ags-analyse */ ags_recall_factory_create(audio, NULL, NULL, "ags-analyse", audio_channels_old, audio_channels, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); nth_channel = ags_channel_nth(start_channel, audio_channels_old); channel = nth_channel; next_channel = NULL; for(i = audio_channels_old; i < audio_channels; i++){ GList *start_play; GList *start_recall; fg_plot = ags_spectrometer_fg_plot_alloc(spectrometer, 0.125, 0.5, 1.0); ags_cartesian_add_plot(cartesian, fg_plot); spectrometer->fg_plot = g_list_prepend(spectrometer->fg_plot, fg_plot); g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* frequency - find port */ port = ags_spectrometer_find_specifier(start_play, "./frequency-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->frequency_buffer_play_port = g_list_prepend(spectrometer->frequency_buffer_play_port, port); } port = ags_spectrometer_find_specifier(start_recall, "./frequency-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->frequency_buffer_recall_port = g_list_prepend(spectrometer->frequency_buffer_recall_port, port); } /* magnitude - find port */ port = ags_spectrometer_find_specifier(start_play, "./magnitude-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->magnitude_buffer_play_port = g_list_prepend(spectrometer->magnitude_buffer_play_port, port); } port = ags_spectrometer_find_specifier(start_recall, "./magnitude-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->magnitude_buffer_recall_port = g_list_prepend(spectrometer->magnitude_buffer_recall_port, port); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } } }else{ GList *list_start, *list; /* plot */ list = list_start = g_list_copy(spectrometer->fg_plot); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ spectrometer->fg_plot = g_list_remove(spectrometer->fg_plot, list->data); ags_cartesian_remove_plot(cartesian, list->data); ags_plot_free(list->data); list = list->next; } g_list_free(list_start); /* frequency - port */ list = list_start = g_list_copy(spectrometer->frequency_buffer_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ spectrometer->frequency_buffer_play_port = g_list_remove(spectrometer->frequency_buffer_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(spectrometer->frequency_buffer_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ spectrometer->frequency_buffer_recall_port = g_list_remove(spectrometer->frequency_buffer_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); /* magnitude - port */ list = list_start = g_list_copy(spectrometer->magnitude_buffer_play_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ spectrometer->magnitude_buffer_play_port = g_list_remove(spectrometer->magnitude_buffer_play_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); list = list_start = g_list_copy(spectrometer->magnitude_buffer_recall_port); for(i = audio_channels; i < audio_channels_old && list != NULL; i++){ spectrometer->magnitude_buffer_recall_port = g_list_remove(spectrometer->magnitude_buffer_recall_port, list->data); g_object_unref(list->data); list = list->next; } g_list_free(list_start); } } void ags_spectrometer_resize_pads_callback(AgsSpectrometer *spectrometer, GType channel_type, guint pads, guint pads_old, gpointer data) { AgsCartesian *cartesian; cartesian = spectrometer->cartesian; if(pads_old == 0 && channel_type == AGS_TYPE_INPUT){ if((AGS_MACHINE_MAPPED_RECALL & (AGS_MACHINE(spectrometer)->flags)) != 0){ AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; AgsPort *port; guint audio_channels; guint i; audio = AGS_MACHINE(spectrometer)->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, "input", &start_channel, NULL); /* ags-analyse */ ags_recall_factory_create(audio, NULL, NULL, "ags-analyse", 0, audio_channels, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; i < audio_channels; i++){ AgsPlot *fg_plot; GList *start_play; GList *start_recall; fg_plot = ags_spectrometer_fg_plot_alloc(spectrometer, 0.125, 0.5, 1.0); ags_cartesian_add_plot(cartesian, fg_plot); spectrometer->fg_plot = g_list_prepend(spectrometer->fg_plot, fg_plot); g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* frequency - find port */ port = ags_spectrometer_find_specifier(start_play, "./frequency-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->frequency_buffer_play_port = g_list_prepend(spectrometer->frequency_buffer_play_port, port); } port = ags_spectrometer_find_specifier(start_recall, "./frequency-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->frequency_buffer_recall_port = g_list_prepend(spectrometer->frequency_buffer_recall_port, port); } /* magnitude - find port */ port = ags_spectrometer_find_specifier(start_play, "./magnitude-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->magnitude_buffer_play_port = g_list_prepend(spectrometer->magnitude_buffer_play_port, port); } port = ags_spectrometer_find_specifier(start_recall, "./magnitude-buffer[0]"); if(port != NULL){ g_object_ref(port); spectrometer->magnitude_buffer_recall_port = g_list_prepend(spectrometer->magnitude_buffer_recall_port, port); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } } } if(pads == 0 && channel_type == AGS_TYPE_INPUT){ GList *list_start, *list; list = list_start = g_list_copy(spectrometer->fg_plot); while(list != NULL){ spectrometer->fg_plot = g_list_remove(spectrometer->fg_plot, list->data); ags_cartesian_remove_plot(cartesian, list->data); ags_plot_free(list->data); list = list->next; } g_list_free(list_start); /* frequency - ports */ g_list_free_full(spectrometer->frequency_buffer_play_port, g_object_unref); spectrometer->frequency_buffer_play_port = NULL; g_list_free_full(spectrometer->frequency_buffer_recall_port, g_object_unref); spectrometer->frequency_buffer_recall_port = NULL; /* magnitude - ports */ g_list_free_full(spectrometer->magnitude_buffer_play_port, g_object_unref); spectrometer->magnitude_buffer_play_port = NULL; g_list_free_full(spectrometer->magnitude_buffer_recall_port, g_object_unref); spectrometer->magnitude_buffer_recall_port = NULL; } } gsequencer-3.1.3/ags/X/machine/ags_mixer_input_line.h0000644000175000017500000000411013607210263017536 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIXER_INPUT_LINE_H__ #define __AGS_MIXER_INPUT_LINE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIXER_INPUT_LINE (ags_mixer_input_line_get_type()) #define AGS_MIXER_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIXER_INPUT_LINE, AgsMixerInputLine)) #define AGS_MIXER_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MIXER_INPUT_LINE, AgsMixerInputLineClass)) #define AGS_IS_MIXER_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MIXER_INPUT_LINE)) #define AGS_IS_MIXER_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MIXER_INPUT_LINE)) #define AGS_MIXER_INPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_MIXER_INPUT_LINE, AgsMixerInputLineClass)) typedef struct _AgsMixerInputLine AgsMixerInputLine; typedef struct _AgsMixerInputLineClass AgsMixerInputLineClass; struct _AgsMixerInputLine { AgsLine line; }; struct _AgsMixerInputLineClass { AgsLineClass line; }; GType ags_mixer_input_line_get_type(); AgsMixerInputLine* ags_mixer_input_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_MIXER_INPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_syncsynth_callbacks.c0000644000175000017500000001231413607210263020225 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_syncsynth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsSyncsynth *syncsynth) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_SYNCSYNTH)->counter); g_object_set(AGS_MACHINE(syncsynth), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_SYNCSYNTH); g_free(str); } void ags_syncsynth_samplerate_changed_callback(AgsMachine *machine, guint samplerate, guint old_samplerate, gpointer user_data) { GList *start_list, *list; list = start_list = gtk_container_get_children(AGS_SYNCSYNTH(machine)->oscillator); while(list != NULL){ AgsOscillator *oscillator; GList *start_child, *child; guint i; start_child = gtk_container_get_children(list->data); child = ags_list_util_find_type(start_child, AGS_TYPE_OSCILLATOR); if(child != NULL){ oscillator = child->data; gtk_spin_button_set_value(oscillator->attack, samplerate * (gtk_spin_button_get_value(oscillator->attack) / old_samplerate)); gtk_spin_button_set_value(oscillator->frame_count, samplerate * (gtk_spin_button_get_value(oscillator->frame_count) / old_samplerate)); gtk_spin_button_set_value(oscillator->phase, samplerate * (gtk_spin_button_get_value(oscillator->phase) / old_samplerate)); for(i = 0; i < oscillator->sync_point_count; i++){ gtk_spin_button_set_value(oscillator->sync_point[i * 2], samplerate * (gtk_spin_button_get_value(oscillator->sync_point[i * 2]) / old_samplerate)); gtk_spin_button_set_value(oscillator->sync_point[i * 2 + 1], samplerate * (gtk_spin_button_get_value(oscillator->sync_point[i * 2 + 1]) / old_samplerate)); } } g_list_free(start_child); list = list->next; } g_list_free(start_list); gtk_spin_button_set_value(AGS_SYNCSYNTH(machine)->loop_start, samplerate * (gtk_spin_button_get_value(AGS_SYNCSYNTH(machine)->loop_start) / old_samplerate)); gtk_spin_button_set_value(AGS_SYNCSYNTH(machine)->loop_end, samplerate * (gtk_spin_button_get_value(AGS_SYNCSYNTH(machine)->loop_end) / old_samplerate)); } void ags_syncsynth_auto_update_callback(GtkToggleButton *toggle, AgsSyncsynth *syncsynth) { if(gtk_toggle_button_get_active(toggle)){ syncsynth->flags |= AGS_SYNCSYNTH_AUTO_UPDATE; }else{ syncsynth->flags &= (~AGS_SYNCSYNTH_AUTO_UPDATE); } } void ags_syncsynth_add_callback(GtkButton *button, AgsSyncsynth *syncsynth) { AgsOscillator *oscillator; oscillator = ags_oscillator_new(); ags_syncsynth_add_oscillator(syncsynth, oscillator); ags_connectable_connect(AGS_CONNECTABLE(oscillator)); g_signal_connect((GObject *) oscillator, "control-changed", G_CALLBACK(ags_syncsynth_oscillator_control_changed_callback), (gpointer) syncsynth); } void ags_syncsynth_remove_callback(GtkButton *button, AgsSyncsynth *syncsynth) { GList *list, *list_start; GList *child_start; guint nth; list = list_start = gtk_container_get_children(GTK_CONTAINER(syncsynth->oscillator)); nth = 0; while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(child_start->data))){ ags_syncsynth_remove_oscillator(syncsynth, nth); }else{ nth++; } g_list_free(child_start); list = list->next; } g_list_free(list_start); } void ags_syncsynth_update_callback(GtkButton *button, AgsSyncsynth *syncsynth) { ags_syncsynth_update(syncsynth); } void ags_syncsynth_oscillator_control_changed_callback(AgsOscillator *oscillator, AgsSyncsynth *syncsynth) { ags_syncsynth_reset_loop(syncsynth); if((AGS_SYNCSYNTH_AUTO_UPDATE & (syncsynth->flags)) != 0){ ags_syncsynth_update(syncsynth); } } void ags_syncsynth_lower_callback(GtkSpinButton *spin_button, AgsSyncsynth *syncsynth) { //TODO:JK: implement me } void ags_syncsynth_loop_start_callback(GtkSpinButton *spin_button, AgsSyncsynth *syncsynth) { //TODO:JK: implement me } void ags_syncsynth_loop_end_callback(GtkSpinButton *spin_button, AgsSyncsynth *syncsynth) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bridge_callbacks.h0000644000175000017500000000211713607210263021314 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_BRIDGE_CALLBACKS_H__ #define __AGS_FFPLAYER_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_FFPLAYER_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_oscillator.h0000644000175000017500000000476513607210263016357 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSCILLATOR_H__ #define __AGS_OSCILLATOR_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSCILLATOR (ags_oscillator_get_type()) #define AGS_OSCILLATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_OSCILLATOR, AgsOscillator)) #define AGS_OSCILLATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSCILLATOR, AgsOscillatorClass)) #define AGS_IS_OSCILLATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OSCILLATOR)) #define AGS_IS_OSCILLATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OSCILLATOR)) #define AGS_OSCILLATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OSCILLATOR, AgsOscillatorClass)) #define AGS_OSCILLATOR_DEFAULT_FRAME_COUNT (44100.0 / 27.5) #define AGS_OSCILLATOR_DEFAULT_SYNC_POINT_COUNT (3) typedef struct _AgsOscillator AgsOscillator; typedef struct _AgsOscillatorClass AgsOscillatorClass; typedef enum{ AGS_OSCILLATOR_CONNECTED = 1, }AgsOscillatorFlags; struct _AgsOscillator { GtkFrame frame; guint flags; GtkComboBox *wave; gulong wave_handler; GtkSpinButton *attack; GtkSpinButton *frame_count; GtkSpinButton *frequency; GtkSpinButton *phase; GtkSpinButton *volume; GtkCheckButton *do_sync; GtkSpinButton **sync_point; guint sync_point_count; }; struct _AgsOscillatorClass { GtkFrameClass frame; void (*control_changed)(AgsOscillator *oscillator); }; GType ags_oscillator_get_type(void); void ags_oscillator_control_changed(AgsOscillator *oscillator); AgsOscillator* ags_oscillator_new(); G_END_DECLS #endif /*__AGS_OSCILLATOR_H__*/ gsequencer-3.1.3/ags/X/machine/ags_synth_callbacks.h0000644000175000017500000000260713607210263017341 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_CALLBACKS_H__ #define __AGS_SYNTH_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_synth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsSynth *synth); void ags_synth_auto_update_callback(GtkToggleButton *toggle, AgsSynth *synth); void ags_synth_update_callback(GtkButton *button, AgsSynth *synth); void ags_synth_lower_callback(GtkSpinButton *spin_button, AgsSynth *synth); G_END_DECLS #endif /*__AGS_SYNTH_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_cell_pattern.h0000644000175000017500000000737013607331151016653 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CELL_PATTERN_H__ #define __AGS_CELL_PATTERN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CELL_PATTERN (ags_cell_pattern_get_type()) #define AGS_CELL_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CELL_PATTERN, AgsCellPattern)) #define AGS_CELL_PATTERN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CELL_PATTERN, AgsCellPatternClass)) #define AGS_IS_CELL_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CELL_PATTERN)) #define AGS_IS_CELL_PATTERN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CELL_PATTERN)) #define AGS_CELL_PATTERN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CELL_PATTERN, AgsCellPatternClass)) #define AGS_CELL_PATTERN_DEFAULT_CELL_WIDTH (12) #define AGS_CELL_PATTERN_DEFAULT_CELL_HEIGHT (10) #define AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY (32) #define AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY (10) #define AGS_CELL_PATTERN_DEFAULT_CONTROLS_HORIZONTALLY (32) #define AGS_CELL_PATTERN_DEFAULT_CONTROLS_VERTICALLY (78) typedef struct _AgsCellPattern AgsCellPattern; typedef struct _AgsCellPatternClass AgsCellPatternClass; typedef enum{ AGS_CELL_PATTERN_CONNECTED = 1, AGS_CELL_PATTERN_CURSOR_ON = 1 << 1, }AgsCellPatternFlags; typedef enum{ AGS_CELL_PATTERN_KEY_L_CONTROL = 1, AGS_CELL_PATTERN_KEY_R_CONTROL = 1 << 1, }AgsCellPatternKeyMask; typedef enum{ AGS_CELL_PATTERN_MOVE_LEFT, AGS_CELL_PATTERN_MOVE_RIGHT, AGS_CELL_PATTERN_MOVE_UP, AGS_CELL_PATTERN_MOVE_DOWN, AGS_CELL_PATTERN_TOGGLE_PAD, AGS_CELL_PATTERN_COPY_PATTERN, }AgsCellPatternAction; struct _AgsCellPattern { GtkTable table; guint flags; guint key_mask; guint cell_width; guint cell_height; guint n_cols; guint n_rows; guint cursor_x; guint cursor_y; GtkDrawingArea *drawing_area; GtkVScrollbar *vscrollbar; GtkHScrollbar *hscrollbar; guint active_led; AgsHLedArray *hled_array; }; struct _AgsCellPatternClass { GtkTableClass table; }; GType ags_cell_pattern_get_type(void); void ags_cell_pattern_draw_grid(AgsCellPattern *cell_pattern, cairo_t *cr); void ags_cell_pattern_draw_matrix(AgsCellPattern *cell_pattern, cairo_t *cr); void ags_cell_pattern_draw_cursor(AgsCellPattern *cell_pattern, cairo_t *cr); void ags_cell_pattern_redraw_gutter_point(AgsCellPattern *cell_pattern, cairo_t *cr, AgsChannel *channel, guint j, guint i); void ags_cell_pattern_highlight_gutter_point(AgsCellPattern *cell_pattern, cairo_t *cr, guint j, guint i); void ags_cell_pattern_unpaint_gutter_point(AgsCellPattern *cell_pattern, cairo_t *cr, guint j, guint i); void* ags_cell_pattern_blink_worker(void *data); gboolean ags_cell_pattern_led_queue_draw_timeout(AgsCellPattern *cell_pattern); AgsCellPattern* ags_cell_pattern_new(); G_END_DECLS #endif /*__AGS_CELL_PATTERN_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_synth_input_pad.h0000644000175000017500000000422113607210263020061 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNTH_INPUT_PAD_H__ #define __AGS_FM_SYNTH_INPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FM_SYNTH_INPUT_PAD (ags_fm_synth_input_pad_get_type()) #define AGS_FM_SYNTH_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FM_SYNTH_INPUT_PAD, AgsFMSynthInputPad)) #define AGS_FM_SYNTH_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FM_SYNTH_INPUT_PAD, AgsFMSynthInputPadClass)) #define AGS_IS_FM_SYNTH_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FM_SYNTH_INPUT_PAD)) #define AGS_IS_FM_SYNTH_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FM_SYNTH_INPUT_PAD)) #define AGS_FM_SYNTH_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_FM_SYNTH_INPUT_PAD, AgsFMSynthInputPadClass)) typedef struct _AgsFMSynthInputPad AgsFMSynthInputPad; typedef struct _AgsFMSynthInputPadClass AgsFMSynthInputPadClass; struct _AgsFMSynthInputPad { AgsPad pad; gchar *name; gchar *xml_type; }; struct _AgsFMSynthInputPadClass { AgsPadClass pad; }; GType ags_fm_synth_input_pad_get_type(); AgsFMSynthInputPad* ags_fm_synth_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_FM_SYNTH_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_oscillator_callbacks.c0000644000175000017500000000343113605312647020345 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_oscillator_wave_callback(GtkComboBox *combo, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } void ags_oscillator_attack_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } void ags_oscillator_frame_count_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } void ags_oscillator_frequency_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } void ags_oscillator_phase_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } void ags_oscillator_volume_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } void ags_oscillator_sync_point_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator) { ags_oscillator_control_changed(oscillator); } gsequencer-3.1.3/ags/X/machine/ags_desk_callbacks.c0000644000175000017500000000417613607210263017120 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_desk_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsDesk *desk) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) desk, AGS_TYPE_WINDOW)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_DESK)->counter); g_object_set(AGS_MACHINE(desk), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_DESK); g_free(str); } void ags_desk_resize_audio_channels_callback(AgsDesk *desk, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudio *audio; audio = AGS_MACHINE(desk)->audio; if(audio_channels > audio_channels_old){ if((AGS_MACHINE_MAPPED_RECALL & (AGS_MACHINE(desk)->flags)) != 0){ //TODO:JK: implement me } }else{ //TODO:JK: implement me } } void ags_desk_resize_pads_callback(AgsDesk *desk, GType channel_type, guint pads, guint pads_old, gpointer data) { if(pads_old == 0 && channel_type == AGS_TYPE_INPUT){ if((AGS_MACHINE_MAPPED_RECALL & (AGS_MACHINE(desk)->flags)) != 0){ //TODO:JK: implement me } } if(pads == 0 && channel_type == AGS_TYPE_INPUT){ //TODO:JK: implement me } } gsequencer-3.1.3/ags/X/machine/ags_synth_input_line_callbacks.c0000644000175000017500000000435413605312647021572 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_synth_input_line_samplerate_changed_callback(AgsLine *line, guint samplerate, guint old_samplerate, gpointer user_data) { AgsOscillator *oscillator; guint i; oscillator = AGS_SYNTH_INPUT_LINE(line)->oscillator; gtk_spin_button_set_value(oscillator->attack, samplerate * (gtk_spin_button_get_value(oscillator->attack) / old_samplerate)); gtk_spin_button_set_value(oscillator->frame_count, samplerate * (gtk_spin_button_get_value(oscillator->frame_count) / old_samplerate)); gtk_spin_button_set_value(oscillator->phase, samplerate * (gtk_spin_button_get_value(oscillator->phase) / old_samplerate)); for(i = 0; i < oscillator->sync_point_count; i++){ gtk_spin_button_set_value(oscillator->sync_point[i * 2], samplerate * (gtk_spin_button_get_value(oscillator->sync_point[i * 2]) / old_samplerate)); gtk_spin_button_set_value(oscillator->sync_point[i * 2 + 1], samplerate * (gtk_spin_button_get_value(oscillator->sync_point[i * 2 + 1]) / old_samplerate)); } } void ags_synth_input_line_oscillator_control_changed_callback(AgsOscillator *oscillator, AgsSynthInputLine *synth_input_line) { AgsSynth *synth; synth = (AgsSynth *) gtk_widget_get_ancestor((GtkWidget *) synth_input_line, AGS_TYPE_SYNTH); if((AGS_SYNTH_AUTO_UPDATE & (synth->flags)) != 0){ ags_synth_update(synth); } } gsequencer-3.1.3/ags/X/machine/ags_desk_input_pad.c0000644000175000017500000001503513607210263017160 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_desk_input_pad_class_init(AgsDeskInputPadClass *desk_input_pad); void ags_desk_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_desk_input_pad_init(AgsDeskInputPad *desk_input_pad); static void ags_desk_input_pad_finalize(GObject *gobject); void ags_desk_input_pad_connect(AgsConnectable *connectable); void ags_desk_input_pad_disconnect(AgsConnectable *connectable); /** * SECTION:ags_desk_input_pad * @short_description: desk sequencer input pad * @title: AgsDeskInputPad * @section_id: * @include: ags/X/machine/ags_desk_input_pad.h * * The #AgsDeskInputPad is a composite widget to act as desk sequencer input pad. */ static gpointer ags_desk_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_desk_input_pad_parent_connectable_interface; GType ags_desk_input_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_desk_input_pad = 0; static const GTypeInfo ags_desk_input_pad_info = { sizeof(AgsDeskInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_desk_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDeskInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_desk_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_desk_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_desk_input_pad = g_type_register_static(GTK_TYPE_VBOX, "AgsDeskInputPad", &ags_desk_input_pad_info, 0); g_type_add_interface_static(ags_type_desk_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_desk_input_pad); } return g_define_type_id__volatile; } void ags_desk_input_pad_class_init(AgsDeskInputPadClass *desk_input_pad) { GObjectClass *gobject; ags_desk_input_pad_parent_class = g_type_class_peek_parent(desk_input_pad); /* */ gobject = (GObjectClass *) desk_input_pad; gobject->finalize = ags_desk_input_pad_finalize; } void ags_desk_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_desk_input_pad_connect; connectable->disconnect = ags_desk_input_pad_disconnect; } void ags_desk_input_pad_init(AgsDeskInputPad *desk_input_pad) { GtkHBox *hbox; desk_input_pad->name = NULL; desk_input_pad->xml_type = "ags-desk-input-pad"; /* position */ desk_input_pad->position_time = (GtkLabel *) gtk_label_new("00:00.000"); gtk_box_pack_start((GtkBox *) desk_input_pad, (GtkWidget *) desk_input_pad->position_time, FALSE, FALSE, 0); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) desk_input_pad, (GtkWidget *) hbox, FALSE, FALSE, 0); desk_input_pad->position = (GtkScale *) gtk_hscale_new_with_range(0.0, 1.0, 0.001); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk_input_pad->position, TRUE, TRUE, 0); /* filename */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) desk_input_pad, (GtkWidget *) hbox, FALSE, FALSE, 0); /* play */ desk_input_pad->play = (GtkToggleButton *) g_object_new(GTK_TYPE_TOGGLE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk_input_pad->play, FALSE, FALSE, 0); desk_input_pad->filename = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk_input_pad->filename, FALSE, FALSE, 0); desk_input_pad->grab_filename = (GtkButton *) gtk_button_new_with_label(i18n("grab")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk_input_pad->grab_filename, FALSE, FALSE, 0); /* controls */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) desk_input_pad, (GtkWidget *) hbox, FALSE, FALSE, 0); /* indicator */ desk_input_pad->indicator = (AgsIndicator *) ags_vindicator_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk_input_pad->indicator, FALSE, FALSE, 0); /* volume */ desk_input_pad->volume = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.1); gtk_range_set_inverted((GtkRange *) desk_input_pad->volume, TRUE); gtk_range_set_value((GtkRange *) desk_input_pad->volume, 1.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk_input_pad->volume, FALSE, FALSE, 0); } static void ags_desk_input_pad_finalize(GObject *gobject) { AgsDeskInputPad *desk_input_pad; desk_input_pad = AGS_DESK_INPUT_PAD(gobject); G_OBJECT_CLASS(ags_desk_input_pad_parent_class)->finalize(gobject); } void ags_desk_input_pad_connect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_desk_input_pad_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } /** * ags_desk_input_pad_new: * @channel: the assigned channel * * Creates an #AgsDeskInputPad * * Returns: a new #AgsDeskInputPad * * Since: 3.0.0 */ AgsDeskInputPad* ags_desk_input_pad_new(AgsChannel *channel) { AgsDeskInputPad *desk_input_pad; desk_input_pad = (AgsDeskInputPad *) g_object_new(AGS_TYPE_DESK_INPUT_PAD, "channel", channel, NULL); return(desk_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_live_lv2_bridge.h0000644000175000017500000000773013607210263017235 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LIVE_LV2_BRIDGE_H__ #define __AGS_LIVE_LV2_BRIDGE_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LIVE_LV2_BRIDGE (ags_live_lv2_bridge_get_type()) #define AGS_LIVE_LV2_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LIVE_LV2_BRIDGE, AgsLiveLv2Bridge)) #define AGS_LIVE_LV2_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LIVE_LV2_BRIDGE, AgsLiveLv2BridgeClass)) #define AGS_IS_LIVE_LV2_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LIVE_LV2_BRIDGE)) #define AGS_IS_LIVE_LV2_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LIVE_LV2_BRIDGE)) #define AGS_LIVE_LV2_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LIVE_LV2_BRIDGE, AgsLiveLv2BridgeClass)) #define AGS_LIVE_LV2_BRIDGE_DEFAULT_VERSION "0.4.3" #define AGS_LIVE_LV2_BRIDGE_DEFAULT_BUILD_ID "CEST 13-05-2015 13:40" typedef struct _AgsLiveLv2Bridge AgsLiveLv2Bridge; typedef struct _AgsLiveLv2BridgeClass AgsLiveLv2BridgeClass; typedef enum{ AGS_LIVE_LV2_BRIDGE_DISPLAY_INPUT = 1, AGS_LIVE_LV2_BRIDGE_BULK_OUTPUT = 1 << 1, AGS_LIVE_LV2_BRIDGE_DISPLAY_OUTPUT = 1 << 2, AGS_LIVE_LV2_BRIDGE_BULK_INPUT = 1 << 3, AGS_LIVE_LV2_BRIDGE_NO_UPDATE = 1 << 4, }AgsLiveLv2BridgeFlags; struct _AgsLiveLv2Bridge { AgsMachine machine; guint flags; gchar *name; gchar *version; gchar *build_id; gchar *xml_type; guint mapped_output_pad; guint mapped_input_pad; gchar *filename; gchar *effect; gchar *uri; guint uri_index; gboolean has_midi; AgsLv2Plugin *lv2_plugin; LV2_Descriptor *lv2_descriptor; LV2_Handle *lv2_handle; float *port_value; gboolean has_gui; gchar *gui_filename; gchar *gui_uri; AgsLv2uiPlugin *lv2ui_plugin; LV2UI_Descriptor *ui_descriptor; LV2_Feature **ui_feature; LV2UI_Handle *ui_handle; GtkVBox *vbox; GtkComboBoxText *program; GtkComboBoxText *preset; GtkMenu *lv2_menu; GtkWidget *lv2_gui; GtkWidget *ui_widget; GtkWidget *lv2_window; }; struct _AgsLiveLv2BridgeClass { AgsMachineClass machine; }; GType ags_live_lv2_bridge_get_type(void); void ags_live_lv2_bridge_input_map_recall(AgsLiveLv2Bridge *live_lv2_bridge, guint audio_channel_start, guint input_pad_start); void ags_live_lv2_bridge_output_map_recall(AgsLiveLv2Bridge *live_lv2_bridge, guint audio_channel_start, guint output_pad_start); void ags_live_lv2_bridge_load_program(AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_load_preset(AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_load_midi(AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_load_gui(AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_load(AgsLiveLv2Bridge *live_lv2_bridge); gboolean ags_live_lv2_bridge_lv2ui_idle_timeout(GtkWidget *widget); AgsLiveLv2Bridge* ags_live_lv2_bridge_new(GObject *soundcard, gchar *filename, gchar *effect); G_END_DECLS #endif /*__AGS_LIVE_LV2_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_synth_input_pad.h0000644000175000017500000000411213607210263017376 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_INPUT_PAD_H__ #define __AGS_SYNTH_INPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SYNTH_INPUT_PAD (ags_synth_input_pad_get_type()) #define AGS_SYNTH_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SYNTH_INPUT_PAD, AgsSynthInputPad)) #define AGS_SYNTH_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SYNTH_INPUT_PAD, AgsSynthInputPadClass)) #define AGS_IS_SYNTH_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SYNTH_INPUT_PAD)) #define AGS_IS_SYNTH_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SYNTH_INPUT_PAD)) #define AGS_SYNTH_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SYNTH_INPUT_PAD, AgsSynthInputPadClass)) typedef struct _AgsSynthInputPad AgsSynthInputPad; typedef struct _AgsSynthInputPadClass AgsSynthInputPadClass; struct _AgsSynthInputPad { AgsPad pad; gchar *name; gchar *xml_type; }; struct _AgsSynthInputPadClass { AgsPadClass pad; }; GType ags_synth_input_pad_get_type(); AgsSynthInputPad* ags_synth_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_SYNTH_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_line.h0000644000175000017500000000432613607210263020233 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_INPUT_LINE_H__ #define __AGS_FFPLAYER_INPUT_LINE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FFPLAYER_INPUT_LINE (ags_ffplayer_input_line_get_type()) #define AGS_FFPLAYER_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FFPLAYER_INPUT_LINE, AgsFFPlayerInputLine)) #define AGS_FFPLAYER_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FFPLAYER_INPUT_LINE, AgsFFPlayerInputLineClass)) #define AGS_IS_FFPLAYER_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FFPLAYER_INPUT_LINE)) #define AGS_IS_FFPLAYER_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FFPLAYER_INPUT_LINE)) #define AGS_FFPLAYER_INPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FFPLAYER_INPUT_LINE, AgsFFPlayerInputLineClass)) typedef struct _AgsFFPlayerInputLine AgsFFPlayerInputLine; typedef struct _AgsFFPlayerInputLineClass AgsFFPlayerInputLineClass; struct _AgsFFPlayerInputLine { AgsEffectLine effect_line; GtkLabel *label; }; struct _AgsFFPlayerInputLineClass { AgsEffectLineClass effect_line; }; GType ags_ffplayer_input_line_get_type(void); AgsFFPlayerInputLine* ags_ffplayer_input_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_FFPLAYER_INPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_matrix_bulk_input.h0000644000175000017500000000424613607210263017736 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MATRIX_BULK_INPUT_H__ #define __AGS_MATRIX_BULK_INPUT_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MATRIX_BULK_INPUT (ags_matrix_bulk_input_get_type()) #define AGS_MATRIX_BULK_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MATRIX_BULK_INPUT, AgsMatrixBulkInput)) #define AGS_MATRIX_BULK_INPUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MATRIX_BULK_INPUT, AgsMatrixBulkInputClass)) #define AGS_IS_MATRIX_BULK_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MATRIX_BULK_INPUT)) #define AGS_IS_MATRIX_BULK_INPUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MATRIX_BULK_INPUT)) #define AGS_MATRIX_BULK_INPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MATRIX_BULK_INPUT, AgsMatrixBulkInputClass)) typedef struct _AgsMatrixBulkInput AgsMatrixBulkInput; typedef struct _AgsMatrixBulkInputClass AgsMatrixBulkInputClass; struct _AgsMatrixBulkInput { AgsEffectBulk effect_bulk; }; struct _AgsMatrixBulkInputClass { AgsEffectBulkClass effect_bulk; }; GType ags_matrix_bulk_input_get_type(void); AgsMatrixBulkInput* ags_matrix_bulk_input_new(AgsAudio *audio, GType channel_type); G_END_DECLS #endif /*__AGS_MATRIX_BULK_INPUT_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_output_line_callbacks.c0000644000175000017500000000353313605312647021573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_drum_output_line_resize_pads_callback(AgsDrum *drum, GType channel_type, guint pads_new, guint pads_old, AgsDrumOutputLine *output_line) { AgsAudio *audio; audio = AGS_MACHINE(drum)->audio; if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ if(pads_new > pads_old){ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio->audio_channels, pads_old, pads_new, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio->audio_channels, pads_old, pads_new, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } } } } gsequencer-3.1.3/ags/X/machine/ags_fm_syncsynth.h0000644000175000017500000000602013607210263016712 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNCSYNTH_H__ #define __AGS_FM_SYNCSYNTH_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FM_SYNCSYNTH (ags_fm_syncsynth_get_type()) #define AGS_FM_SYNCSYNTH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FM_SYNCSYNTH, AgsFMSyncsynth)) #define AGS_FM_SYNCSYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FM_SYNCSYNTH, AgsFMSyncsynthClass)) #define AGS_IS_FM_SYNCSYNTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FM_SYNCSYNTH)) #define AGS_IS_FM_SYNCSYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FM_SYNCSYNTH)) #define AGS_FM_SYNCSYNTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FM_SYNCSYNTH, AgsFMSyncsynthClass)) #define AGS_FM_SYNCSYNTH_BASE_NOTE_MAX (72.0) #define AGS_FM_SYNCSYNTH_BASE_NOTE_MIN (-72.0) typedef struct _AgsFMSyncsynth AgsFMSyncsynth; typedef struct _AgsFMSyncsynthClass AgsFMSyncsynthClass; typedef enum{ AGS_FM_SYNCSYNTH_AUTO_UPDATE = 1, }AgsFMSyncsynthFlags; struct _AgsFMSyncsynth { AgsMachine machine; guint flags; gchar *name; gchar *xml_type; guint mapped_input_pad; guint mapped_output_pad; GtkVBox *fm_oscillator; GtkButton *add; GtkButton *remove; GtkCheckButton *auto_update; GtkButton *update; GtkCheckButton *enable_lfo; GtkSpinButton *lfo_freq; GtkSpinButton *lfo_phase; GtkSpinButton *lfo_depth; GtkSpinButton *lfo_tuning; GtkSpinButton *lower; // how many channels until to lowest freq GtkSpinButton *loop_start; GtkSpinButton *loop_end; }; struct _AgsFMSyncsynthClass { AgsMachineClass machine; }; GType ags_fm_syncsynth_get_type(void); void ags_fm_syncsynth_add_fm_oscillator(AgsFMSyncsynth *fm_syncsynth, AgsFMOscillator *fm_oscillator); void ags_fm_syncsynth_remove_fm_oscillator(AgsFMSyncsynth *fm_syncsynth, guint nth); void ags_fm_syncsynth_reset_loop(AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_update(AgsFMSyncsynth *fm_syncsynth); AgsFMSyncsynth* ags_fm_syncsynth_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_FM_SYNCSYNTH_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bulk_input_callbacks.c0000644000175000017500000000147713605312647022246 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/machine/ags_matrix_bridge_callbacks.c0000644000175000017500000000147113605312647021014 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/machine/ags_synth.c0000644000175000017500000003421313607210263015333 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_synth_class_init(AgsSynthClass *synth); void ags_synth_connectable_interface_init(AgsConnectableInterface *connectable); void ags_synth_init(AgsSynth *synth); void ags_synth_finalize(GObject *gobject); void ags_synth_connect(AgsConnectable *connectable); void ags_synth_disconnect(AgsConnectable *connectable); void ags_synth_show(GtkWidget *widget); void ags_synth_map_recall(AgsMachine *machine); /** * SECTION:ags_synth * @short_description: synth * @title: AgsSynth * @section_id: * @include: ags/X/machine/ags_synth.h * * The #AgsSynth is a composite widget to act as synth. */ static gpointer ags_synth_parent_class = NULL; static AgsConnectableInterface *ags_synth_parent_connectable_interface; GType ags_synth_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_synth = 0; static const GTypeInfo ags_synth_info = { sizeof(AgsSynthClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_synth_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSynth), 0, /* n_preallocs */ (GInstanceInitFunc) ags_synth_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_synth_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_synth = g_type_register_static(AGS_TYPE_MACHINE, "AgsSynth", &ags_synth_info, 0); g_type_add_interface_static(ags_type_synth, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_synth); } return g_define_type_id__volatile; } void ags_synth_class_init(AgsSynthClass *synth) { GObjectClass *gobject; AgsMachineClass *machine; ags_synth_parent_class = g_type_class_peek_parent(synth); /* GObjectClass */ gobject = (GObjectClass *) synth; gobject->finalize = ags_synth_finalize; /* AgsMachineClass */ machine = (AgsMachineClass *) synth; machine->map_recall = ags_synth_map_recall; } void ags_synth_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_synth_connectable_parent_interface; ags_synth_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_synth_connect; connectable->disconnect = ags_synth_disconnect; } void ags_synth_init(AgsSynth *synth) { AgsAudio *audio; GtkHBox *hbox; GtkVBox *vbox; GtkTable *table; GtkLabel *label; g_signal_connect_after((GObject *) synth, "parent_set", G_CALLBACK(ags_synth_parent_set_callback), (gpointer) synth); audio = AGS_MACHINE(synth)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_SYNTH)); g_object_set(audio, "min-audio-channels", 1, "max-audio-channels", 1, "min-output-pads", 1, "max-output-pads", 128, "min-input-pads", 1, NULL); AGS_MACHINE(synth)->input_pad_type = AGS_TYPE_SYNTH_INPUT_PAD; AGS_MACHINE(synth)->input_line_type = AGS_TYPE_SYNTH_INPUT_LINE; AGS_MACHINE(synth)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(synth)->output_line_type = G_TYPE_NONE; // AGS_MACHINE(synth)->flags |= AGS_MACHINE_IS_SYNTHESIZER; AGS_MACHINE(synth)->mapping_flags |= AGS_MACHINE_MONO; /* create widgets */ synth->flags = 0; synth->name = NULL; synth->xml_type = "ags-synth"; synth->mapped_input_pad = 0; synth->mapped_output_pad = 0; hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer*) (gtk_bin_get_child((GtkBin *) synth)), (GtkWidget *) hbox); synth->input_pad = (GtkVBox *) gtk_vbox_new(FALSE, 0); AGS_MACHINE(synth)->input = (GtkContainer *) synth->input_pad; gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) AGS_MACHINE(synth)->input, FALSE, FALSE, 0); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) vbox, FALSE, FALSE, 0); synth->auto_update = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("auto update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) synth->auto_update, FALSE, FALSE, 0); synth->update = (GtkButton *) gtk_button_new_with_label(i18n("update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) synth->update, FALSE, FALSE, 0); /* table */ table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) table, FALSE, FALSE, 0); /* frequency */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("lower"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); synth->lower = (GtkSpinButton *) gtk_spin_button_new_with_range(AGS_SYNTH_BASE_NOTE_MIN, AGS_SYNTH_BASE_NOTE_MAX, 1.0); gtk_spin_button_set_digits(synth->lower, 2); gtk_spin_button_set_value(synth->lower, -48.0); gtk_table_attach(table, GTK_WIDGET(synth->lower), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } void ags_synth_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_synth_parent_class)->finalize(gobject); } void ags_synth_connect(AgsConnectable *connectable) { AgsSynth *synth; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_synth_parent_connectable_interface->connect(connectable); /* AgsSynth */ synth = AGS_SYNTH(connectable); g_signal_connect((GObject *) synth->lower, "value-changed", G_CALLBACK(ags_synth_lower_callback), synth); g_signal_connect((GObject *) synth->auto_update, "toggled", G_CALLBACK(ags_synth_auto_update_callback), synth); g_signal_connect((GObject *) synth->update, "clicked", G_CALLBACK(ags_synth_update_callback), (gpointer) synth); } void ags_synth_disconnect(AgsConnectable *connectable) { AgsSynth *synth; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_synth_parent_connectable_interface->disconnect(connectable); /* AgsSynth */ synth = AGS_SYNTH(connectable); g_object_disconnect((GObject *) synth->lower, "any_signal::value-changed", G_CALLBACK(ags_synth_lower_callback), synth, NULL); g_object_disconnect((GObject *) synth->auto_update, "any_signal::toggled", G_CALLBACK(ags_synth_auto_update_callback), synth, NULL); g_object_disconnect((GObject *) synth->update, "any_signal::clicked", G_CALLBACK(ags_synth_update_callback), (gpointer) synth, NULL); } void ags_synth_map_recall(AgsMachine *machine) { AgsSynth *synth; AgsAudio *audio; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } AGS_MACHINE_CLASS(ags_synth_parent_class)->map_recall(machine); } void ags_synth_update(AgsSynth *synth) { AgsWindow *window; AgsOscillator *oscillator; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_channel; AgsRecycling *first_recycling; AgsClearAudioSignal *clear_audio_signal; AgsApplySynth *apply_synth; AgsApplicationContext *application_context; GList *input_pad, *input_pad_start; GList *input_line, *input_line_start; GList *rt_template; GList *task; guint output_lines; guint buffer_size; guint attack, frame_count; gdouble frequency, phase, start_frequency; gdouble volume; AgsComplex **sync_point; guint sync_point_count; application_context = ags_application_context_get_instance(); window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) synth); audio = AGS_MACHINE(synth)->audio; /* */ start_frequency = (gdouble) gtk_spin_button_get_value(synth->lower); /* clear output */ input_pad_start = input_pad = gtk_container_get_children((GtkContainer *) synth->input_pad); g_object_get(audio, "output", &start_output, "input", &start_input, "output-lines", &output_lines, "buffer-size", &buffer_size, NULL); task = NULL; channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ AgsAudioSignal *template; GList *start_list; g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_get(first_recycling, "audio-signal", &start_list, NULL); /* */ template = ags_audio_signal_get_template(start_list); clear_audio_signal = ags_clear_audio_signal_new(template); task = g_list_prepend(task, clear_audio_signal); g_list_free_full(start_list, g_object_unref); g_object_unref(first_recycling); g_object_unref(template); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* write output */ while(input_pad != NULL){ AgsChannel *input; GList *start_synth_generator, *synth_generator; guint format; guint i; gboolean do_sync; input_line = gtk_container_get_children((GtkContainer *) AGS_PAD(input_pad->data)->expander_set); oscillator = AGS_OSCILLATOR(gtk_container_get_children((GtkContainer *) AGS_LINE(input_line->data)->expander->table)->data); g_object_get(AGS_LINE(input_line->data), "channel", &input, NULL); g_object_get(input, "synth-generator", &start_synth_generator, "format", &format, NULL); synth_generator = start_synth_generator; /* do it so */ attack = (guint) gtk_spin_button_get_value_as_int(oscillator->attack); frame_count = (guint) gtk_spin_button_get_value_as_int(oscillator->frame_count); phase = gtk_spin_button_get_value(oscillator->phase); frequency = gtk_spin_button_get_value(oscillator->frequency); volume = gtk_spin_button_get_value(oscillator->volume); g_object_set(synth_generator->data, "format", format, "delay", (gdouble) attack / (gdouble) buffer_size, "attack", attack, "frame-count", frame_count, "oscillator", gtk_combo_box_get_active(oscillator->wave), "frequency", frequency, "phase", phase, "volume", volume, NULL); do_sync = gtk_toggle_button_get_active((GtkToggleButton *) oscillator->do_sync); if(do_sync){ sync_point_count = oscillator->sync_point_count; /* free previous sync point */ if(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point != NULL){ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); } /* set new sync point */ if(sync_point_count > 0){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = (AgsComplex **) malloc(sync_point_count * sizeof(AgsComplex *)); }else{ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; } AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = sync_point_count; for(i = 0; i < sync_point_count; i++){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i] = ags_complex_alloc(); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].real = gtk_spin_button_get_value(oscillator->sync_point[2 * i]); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].imag = gtk_spin_button_get_value(oscillator->sync_point[2 * i + 1]); } }else{ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = 0; } apply_synth = ags_apply_synth_new(synth_generator->data, start_output, start_frequency, output_lines); task = g_list_prepend(task, apply_synth); g_list_free_full(start_synth_generator, g_object_unref); /* iterate */ input_pad = input_pad->next; } if(start_output != NULL){ g_object_unref(start_output); } if(next_channel != NULL){ g_object_unref(next_channel); } g_list_free(input_pad_start); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), g_list_reverse(task)); } /** * ags_synth_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsSynth * * Returns: the new #AgsSynth * * Since: 3.0.0 */ AgsSynth* ags_synth_new(GObject *soundcard) { AgsSynth *synth; synth = (AgsSynth *) g_object_new(AGS_TYPE_SYNTH, NULL); g_object_set(G_OBJECT(AGS_MACHINE(synth)->audio), "output-soundcard", soundcard, NULL); return(synth); } gsequencer-3.1.3/ags/X/machine/ags_live_dssi_bridge.h0000644000175000017500000000632613607210263017474 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LIVE_DSSI_BRIDGE_H__ #define __AGS_LIVE_DSSI_BRIDGE_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LIVE_DSSI_BRIDGE (ags_live_dssi_bridge_get_type()) #define AGS_LIVE_DSSI_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LIVE_DSSI_BRIDGE, AgsLiveDssiBridge)) #define AGS_LIVE_DSSI_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LIVE_DSSI_BRIDGE, AgsLiveDssiBridgeClass)) #define AGS_IS_LIVE_DSSI_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LIVE_DSSI_BRIDGE)) #define AGS_IS_LIVE_DSSI_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LIVE_DSSI_BRIDGE)) #define AGS_LIVE_DSSI_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LIVE_DSSI_BRIDGE, AgsLiveDssiBridgeClass)) #define AGS_LIVE_DSSI_BRIDGE_DEFAULT_VERSION "0.7.134" #define AGS_LIVE_DSSI_BRIDGE_DEFAULT_BUILD_ID "CEST 14-04-2017 21:10" typedef struct _AgsLiveDssiBridge AgsLiveDssiBridge; typedef struct _AgsLiveDssiBridgeClass AgsLiveDssiBridgeClass; typedef enum{ AGS_LIVE_DSSI_BRIDGE_DISPLAY_INPUT = 1, AGS_LIVE_DSSI_BRIDGE_BULK_OUTPUT = 1 << 1, AGS_LIVE_DSSI_BRIDGE_DISPLAY_OUTPUT = 1 << 2, AGS_LIVE_DSSI_BRIDGE_BULK_INPUT = 1 << 3, }AgsLiveDssiBridgeFlags; struct _AgsLiveDssiBridge { AgsMachine machine; guint flags; gchar *name; gchar *version; gchar *build_id; gchar *xml_type; guint mapped_output_pad; guint mapped_input_pad; gchar *filename; gchar *effect; unsigned long effect_index; DSSI_Descriptor *dssi_descriptor; LADSPA_Handle ladspa_handle; LADSPA_Data *port_values; GtkComboBoxText *program; }; struct _AgsLiveDssiBridgeClass { AgsMachineClass machine; }; GType ags_live_dssi_bridge_get_type(void); void ags_live_dssi_bridge_input_map_recall(AgsLiveDssiBridge *live_dssi_bridge, guint audio_channel_start, guint input_pad_start); void ags_live_dssi_bridge_output_map_recall(AgsLiveDssiBridge *live_dssi_bridge, guint audio_channel_start, guint output_pad_start); void ags_live_dssi_bridge_load(AgsLiveDssiBridge *live_dssi_bridge); AgsLiveDssiBridge* ags_live_dssi_bridge_new(GObject *soundcard, gchar *filename, gchar *effect); G_END_DECLS #endif /*__AGS_LIVE_DSSI_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_live_dssi_bridge_callbacks.h0000644000175000017500000000254013607210263021465 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LIVE_DSSI_BRIDGE_CALLBACKS_H__ #define __AGS_LIVE_DSSI_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_live_dssi_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLiveDssiBridge *live_dssi_bridge); void ags_live_dssi_bridge_program_changed_callback(GtkComboBox *combo_box, AgsLiveDssiBridge *live_dssi_bridge); G_END_DECLS #endif /*__AGS_LIVE_DSSI_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_callbacks.c0000644000175000017500000002636113607210263017141 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #define AGS_AUDIO_FILE_DEVOUT "AgsAudioFileDevout" #define AGS_DRUM_PLAY_RECALL "AgsDrumPlayRecall" void ags_drum_open_response_callback(GtkDialog *dialog, gint response, AgsDrum *drum); void ags_drum_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsDrum *drum) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) drum, AGS_TYPE_WINDOW)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_DRUM)->counter); g_object_set(AGS_MACHINE(drum), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_DRUM); g_free(str); } void ags_drum_destroy_callback(GtkWidget *widget, AgsDrum *drum) { GList *list, *list_start; if(drum->open_dialog != NULL){ gtk_widget_destroy(drum->open_dialog); } list = list_start = gtk_container_get_children(AGS_MACHINE(drum)->input); while(list != NULL){ if(AGS_DRUM_INPUT_PAD(list->data)->file_chooser != NULL){ gtk_widget_destroy(GTK_WIDGET(AGS_DRUM_INPUT_PAD(list->data)->file_chooser)); } list = list->next; } } void ags_drum_open_callback(GtkWidget *toggle_button, AgsDrum *drum) { GtkFileChooserDialog *file_chooser; GtkCheckButton *check_button; if(drum->open_dialog != NULL){ return; } file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new(g_strdup("open audio files"), (GtkWindow *) gtk_widget_get_toplevel((GtkWidget *) drum), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_file_chooser_add_shortcut_folder_uri(GTK_FILE_CHOOSER(file_chooser), "file:///usr/share/hydrogen/data/drumkits", NULL); drum->open_dialog = (GtkWidget *) file_chooser; gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), TRUE); check_button = (GtkCheckButton *) gtk_check_button_new_with_label(g_strdup("open in new channel")); gtk_toggle_button_set_active((GtkToggleButton *) check_button, TRUE); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(file_chooser)), (GtkWidget *) check_button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(file_chooser), "create", (gpointer) check_button); check_button = (GtkCheckButton *) gtk_check_button_new_with_label(g_strdup("overwrite existing links")); gtk_toggle_button_set_active((GtkToggleButton *) check_button, TRUE); gtk_box_pack_start((GtkBox *) gtk_dialog_get_content_area(GTK_DIALOG(file_chooser)), (GtkWidget *) check_button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(file_chooser), "overwrite", (gpointer) check_button); gtk_widget_show_all(GTK_WIDGET(file_chooser)); g_signal_connect(G_OBJECT(file_chooser), "response", G_CALLBACK(ags_drum_open_response_callback), drum); g_signal_connect(G_OBJECT(file_chooser), "response", G_CALLBACK(ags_machine_open_response_callback), drum); } void ags_drum_open_response_callback(GtkDialog *dialog, gint response, AgsDrum *drum) { drum->open_dialog = NULL; } void ags_drum_loop_button_callback(GtkWidget *button, AgsDrum *drum) { AgsPort *port; AgsCountBeatsAudio *count_beats_audio; GList *start_list, *list; gboolean loop; loop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); /* play - count beats audio */ g_object_get(AGS_MACHINE(drum)->audio, "play", &start_list, NULL); list = start_list; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(list->data); g_object_get(count_beats_audio, "sequencer-loop", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, loop); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); /* recall - count beats audio */ g_object_get(AGS_MACHINE(drum)->audio, "recall", &start_list, NULL); list = start_list; while((list = ags_recall_find_type(list, AGS_TYPE_COUNT_BEATS_AUDIO)) != NULL){ GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(list->data); g_object_get(count_beats_audio, "sequencer-loop", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, loop); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_drum_length_spin_callback(GtkWidget *spin_button, AgsDrum *drum) { AgsWindow *window; AgsApplySequencerLength *apply_sequencer_length; AgsApplicationContext *application_context; gdouble length; /* get window and application_context */ window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) drum); application_context = ags_application_context_get_instance(); /* task - apply length */ length = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin_button)); apply_sequencer_length = ags_apply_sequencer_length_new((GObject *) AGS_MACHINE(drum)->audio, length); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) apply_sequencer_length); } void ags_drum_index0_callback(GtkWidget *widget, AgsDrum *drum) { if(drum->selected0 != NULL){ GtkToggleButton *toggle_button; if(GTK_TOGGLE_BUTTON(widget) != drum->selected0){ AgsPort *port; AgsCopyPatternAudio *copy_pattern_audio; GList *start_list, *list; gchar *str; guint64 index0; toggle_button = drum->selected0; drum->selected0 = NULL; gtk_toggle_button_set_active(toggle_button, FALSE); drum->selected0 = (GtkToggleButton*) widget; /* calculate index 0 */ str = gtk_button_get_label(drum->selected0); index0 = AGS_MACHINE(drum)->bank_0 = ((guint) str[0] - 'a'); /* play - set port */ g_object_get(AGS_MACHINE(drum)->audio, "play", &start_list, NULL); list = ags_recall_find_type(start_list, AGS_TYPE_COPY_PATTERN_AUDIO); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gfloat) index0); copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_object_get(copy_pattern_audio, "bank-index-0", &port, NULL); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } g_list_free_full(start_list, g_object_unref); /* recall - set port */ g_object_get(AGS_MACHINE(drum)->audio, "recall", &start_list, NULL); list = ags_recall_find_type(start_list, AGS_TYPE_COPY_PATTERN_AUDIO); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gfloat) index0); copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_object_get(copy_pattern_audio, "bank-index-0", &port, NULL); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } g_list_free_full(start_list, g_object_unref); }else if(! gtk_toggle_button_get_active(drum->selected0)){ drum->selected0 = NULL; gtk_toggle_button_set_active((GtkToggleButton *) widget, TRUE); drum->selected0 = (GtkToggleButton*) widget; } ags_pattern_box_set_pattern(drum->pattern_box); } } void ags_drum_index1_callback(GtkWidget *widget, AgsDrum *drum) { if(drum->selected1 != NULL){ GtkToggleButton *toggle_button; if(GTK_TOGGLE_BUTTON(widget) != drum->selected1){ AgsPort *port; AgsCopyPatternAudio *copy_pattern_audio; GList *start_list, *list; gchar *str; guint64 index1; toggle_button = drum->selected1; drum->selected1 = NULL; gtk_toggle_button_set_active(toggle_button, FALSE); drum->selected1 = (GtkToggleButton*) widget; /* calculate index 1 */ str = gtk_button_get_label(drum->selected1); index1 = AGS_MACHINE(drum)->bank_1 = ((guint) g_ascii_strtoull(str, NULL, 10)) - 1; /* play - set port */ g_object_get(AGS_MACHINE(drum)->audio, "play", &start_list, NULL); list = ags_recall_find_type(start_list, AGS_TYPE_COPY_PATTERN_AUDIO); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gfloat) index1); copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_object_get(copy_pattern_audio, "bank-index-1", &port, NULL); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } g_list_free_full(start_list, g_object_unref); /* recall - set port */ g_object_get(AGS_MACHINE(drum)->audio, "recall", &start_list, NULL); list = ags_recall_find_type(start_list, AGS_TYPE_COPY_PATTERN_AUDIO); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gfloat) index1); copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_object_get(copy_pattern_audio, "bank-index-1", &port, NULL); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } g_list_free_full(start_list, g_object_unref); }else if(!gtk_toggle_button_get_active(drum->selected1)){ drum->selected1 = NULL; gtk_toggle_button_set_active((GtkToggleButton *) widget, TRUE); drum->selected1 = (GtkToggleButton*) widget; } ags_pattern_box_set_pattern(drum->pattern_box); } } void ags_drum_stop_callback(AgsDrum *drum, GList *recall_id, gint sound_scope, gpointer data) { if(sound_scope != AGS_SOUND_SCOPE_SEQUENCER){ return; } /* all done */ ags_led_array_unset_all((AgsLedArray *) drum->pattern_box->hled_array); } gsequencer-3.1.3/ags/X/machine/ags_drum_output_line.h0000644000175000017500000000415213607210263017570 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_OUTPUT_LINE_H__ #define __AGS_DRUM_OUTPUT_LINE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DRUM_OUTPUT_LINE (ags_drum_output_line_get_type()) #define AGS_DRUM_OUTPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DRUM_OUTPUT_LINE, AgsDrumOutputLine)) #define AGS_DRUM_OUTPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DRUM_OUTPUT_LINE, AgsDrumOutputLineClass)) #define AGS_IS_DRUM_OUTPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DRUM_OUTPUT_LINE)) #define AGS_IS_DRUM_OUTPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DRUM_OUTPUT_LINE)) #define AGS_DRUM_OUTPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DRUM_OUTPUT_LINE, AgsDrumOutputLineClass)) typedef struct _AgsDrumOutputLine AgsDrumOutputLine; typedef struct _AgsDrumOutputLineClass AgsDrumOutputLineClass; struct _AgsDrumOutputLine { AgsLine line; gchar *name; gchar *xml_type; }; struct _AgsDrumOutputLineClass { AgsLineClass line; }; GType ags_drum_output_line_get_type(); AgsDrumOutputLine* ags_drum_output_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_DRUM_OUTPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_syncsynth_callbacks.h0000644000175000017500000000517313607210263020721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNCSYNTH_CALLBACKS_H__ #define __AGS_FM_SYNCSYNTH_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_fm_syncsynth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_samplerate_changed_callback(AgsMachine *machine, guint samplerate, guint old_samplerate, gpointer user_data); void ags_fm_syncsynth_fm_oscillator_control_changed_callback(AgsFMOscillator *fm_oscillator, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_add_callback(GtkButton *button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_remove_callback(GtkButton *button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_auto_update_callback(GtkToggleButton *toggle, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_update_callback(GtkButton *button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_lower_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_loop_start_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_loop_end_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_enable_lfo_callback(GtkToggleButton *toggle, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_lfo_freq_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_lfo_phase_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_lfo_depth_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); void ags_fm_syncsynth_lfo_tunint_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth); G_END_DECLS #endif /*__AGS_FM_SYNCSYNTH_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_matrix_bridge.h0000644000175000017500000000405713607210263017016 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MATRIX_BRIDGE_H__ #define __AGS_MATRIX_BRIDGE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MATRIX_BRIDGE (ags_matrix_bridge_get_type()) #define AGS_MATRIX_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MATRIX_BRIDGE, AgsMatrixBridge)) #define AGS_MATRIX_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MATRIX_BRIDGE, AgsMatrixBridgeClass)) #define AGS_IS_MATRIX_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MATRIX_BRIDGE)) #define AGS_IS_MATRIX_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MATRIX_BRIDGE)) #define AGS_MATRIX_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_MATRIX_BRIDGE, AgsMatrixBridgeClass)) typedef struct _AgsMatrixBridge AgsMatrixBridge; typedef struct _AgsMatrixBridgeClass AgsMatrixBridgeClass; struct _AgsMatrixBridge { AgsEffectBridge effect_bridge; }; struct _AgsMatrixBridgeClass { AgsEffectBridgeClass effect_bridge; }; GType ags_matrix_bridge_get_type(void); AgsMatrixBridge* ags_matrix_bridge_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_MATRIX_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_dssi_bridge_callbacks.c0000644000175000017500000001416013607210263020442 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_dssi_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsDssiBridge *dssi_bridge) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(widget)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_DSSI_BRIDGE)->counter); g_object_set(AGS_MACHINE(dssi_bridge), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_DSSI_BRIDGE); g_free(str); } void ags_dssi_bridge_program_changed_callback(GtkComboBox *combo_box, AgsDssiBridge *dssi_bridge) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(combo_box, &iter)){ AgsLadspaConversion *ladspa_conversion; AgsChannel *start_input; AgsChannel *channel, *next_channel; GList *bulk_member, *bulk_member_start; GList *start_recall, *recall; gchar *name; gchar *specifier; LADSPA_PortDescriptor *port_descriptor; guint bank, program; unsigned long i; /* get program */ gtk_tree_model_get(gtk_combo_box_get_model(combo_box), &iter, 0, &name, 1, &bank, 2, &program, -1); dssi_bridge->dssi_descriptor->select_program(dssi_bridge->ladspa_handle, (unsigned long) bank, (unsigned long) program); #ifdef AGS_DEBUG g_message("%d %d", bank, program); #endif /* update ports */ g_object_get(AGS_MACHINE(dssi_bridge)->audio, "input", &start_input, NULL); channel = start_input; if(channel != NULL){ g_object_ref(channel); } port_descriptor = dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortDescriptors; while(channel != NULL){ g_object_get(channel, "recall", &start_recall, NULL); recall = start_recall; while((recall = ags_recall_find_type(recall, AGS_TYPE_RECALL_DSSI)) != NULL){ GList *start_port, *port; g_object_set(recall->data, "bank", bank, "program", program, NULL); g_object_get(recall->data, "port", &start_port, NULL); for(i = 0; i < dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortCount; i++){ if(LADSPA_IS_PORT_CONTROL(port_descriptor[i])){ if(LADSPA_IS_PORT_INPUT(port_descriptor[i]) || LADSPA_IS_PORT_OUTPUT(port_descriptor[i])){ specifier = dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortNames[i]; port = start_port; while(port != NULL){ if(!g_strcmp0(AGS_PORT(port->data)->specifier, specifier)){ GValue value = {0,}; #ifdef AGS_DEBUG g_message("%s %f", specifier, dssi_bridge->port_values[i]); #endif g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, dssi_bridge->port_values[i]); ags_port_safe_write_raw(port->data, &value); break; } port = port->next; } } } } g_list_free_full(start_port, g_object_unref); /* iterate */ recall = recall->next; } g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* update UI */ bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(dssi_bridge)->bridge)->bulk_input)->table); for(i = 0; i < dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortCount; i++){ /* find bulk member */ bulk_member = bulk_member_start; specifier = dssi_bridge->dssi_descriptor->LADSPA_Plugin->PortNames[i]; #ifdef AGS_DEBUG g_message("%s", specifier); #endif while(bulk_member != NULL){ if(AGS_IS_BULK_MEMBER(bulk_member->data) && !g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->specifier, specifier)){ GtkWidget *child_widget; AGS_BULK_MEMBER(bulk_member->data)->flags |= AGS_BULK_MEMBER_NO_UPDATE; child_widget = gtk_bin_get_child((GtkBin *) AGS_BULK_MEMBER(bulk_member->data)); ladspa_conversion = (AgsLadspaConversion *) AGS_BULK_MEMBER(bulk_member->data)->conversion; if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(dssi_bridge->port_values[i] == 0.0){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, TRUE); } }else if(AGS_IS_DIAL(child_widget)){ gdouble val; val = dssi_bridge->port_values[i]; if(ladspa_conversion != NULL){ // val = ags_ladspa_conversion_convert(ladspa_conversion, // dssi_bridge->port_values[i], // TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget), val); gtk_widget_queue_draw((AgsDial *) child_widget); #ifdef AGS_DEBUG g_message(" --- %f", dssi_bridge->port_values[i]); #endif } AGS_BULK_MEMBER(bulk_member->data)->flags &= (~AGS_BULK_MEMBER_NO_UPDATE); break; } bulk_member = bulk_member->next; } } if(start_input != NULL){ g_object_unref(start_input); } g_list_free(bulk_member_start); } } gsequencer-3.1.3/ags/X/machine/ags_fm_synth.c0000644000175000017500000003602513607210263016020 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_fm_synth_class_init(AgsFMSynthClass *fm_synth); void ags_fm_synth_connectable_interface_init(AgsConnectableInterface *connectable); void ags_fm_synth_init(AgsFMSynth *fm_synth); void ags_fm_synth_finalize(GObject *gobject); void ags_fm_synth_connect(AgsConnectable *connectable); void ags_fm_synth_disconnect(AgsConnectable *connectable); void ags_fm_synth_show(GtkWidget *widget); void ags_fm_synth_map_recall(AgsMachine *machine); /** * SECTION:ags_fm_synth * @short_description: fm synth * @title: AgsFMSynth * @section_id: * @include: ags/X/machine/ags_fm_synth.h * * The #AgsFMSynth is a composite widget to act as fm synth. */ static gpointer ags_fm_synth_parent_class = NULL; static AgsConnectableInterface *ags_fm_synth_parent_connectable_interface; GType ags_fm_synth_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_fm_synth = 0; static const GTypeInfo ags_fm_synth_info = { sizeof(AgsFMSynthClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_fm_synth_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFMSynth), 0, /* n_preallocs */ (GInstanceInitFunc) ags_fm_synth_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_fm_synth_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_fm_synth = g_type_register_static(AGS_TYPE_MACHINE, "AgsFMSynth", &ags_fm_synth_info, 0); g_type_add_interface_static(ags_type_fm_synth, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_fm_synth); } return g_define_type_id__volatile; } void ags_fm_synth_class_init(AgsFMSynthClass *fm_synth) { GObjectClass *gobject; AgsMachineClass *machine; ags_fm_synth_parent_class = g_type_class_peek_parent(fm_synth); /* GObjectClass */ gobject = (GObjectClass *) fm_synth; gobject->finalize = ags_fm_synth_finalize; /* AgsMachineClass */ machine = (AgsMachineClass *) fm_synth; machine->map_recall = ags_fm_synth_map_recall; } void ags_fm_synth_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_fm_synth_connectable_parent_interface; ags_fm_synth_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_fm_synth_connect; connectable->disconnect = ags_fm_synth_disconnect; } void ags_fm_synth_init(AgsFMSynth *fm_synth) { AgsAudio *audio; GtkHBox *hbox; GtkVBox *vbox; GtkTable *table; GtkLabel *label; g_signal_connect_after((GObject *) fm_synth, "parent_set", G_CALLBACK(ags_fm_synth_parent_set_callback), (gpointer) fm_synth); audio = AGS_MACHINE(fm_synth)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_SYNTH)); g_object_set(audio, "min-audio-channels", 1, "max-audio-channels", 1, "min-output-pads", 1, "max-output-pads", 128, "min-input-pads", 1, NULL); AGS_MACHINE(fm_synth)->input_pad_type = AGS_TYPE_FM_SYNTH_INPUT_PAD; AGS_MACHINE(fm_synth)->input_line_type = AGS_TYPE_FM_SYNTH_INPUT_LINE; AGS_MACHINE(fm_synth)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(fm_synth)->output_line_type = G_TYPE_NONE; // AGS_MACHINE(fm_synth)->flags |= AGS_MACHINE_IS_SYNTHESIZER; AGS_MACHINE(fm_synth)->mapping_flags |= AGS_MACHINE_MONO; /* create widgets */ fm_synth->flags = 0; fm_synth->name = NULL; fm_synth->xml_type = "ags-fm-synth"; fm_synth->mapped_input_pad = 0; fm_synth->mapped_output_pad = 0; hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer*) (gtk_bin_get_child((GtkBin *) fm_synth)), (GtkWidget *) hbox); fm_synth->input_pad = (GtkVBox *) gtk_vbox_new(FALSE, 0); AGS_MACHINE(fm_synth)->input = (GtkContainer *) fm_synth->input_pad; gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) AGS_MACHINE(fm_synth)->input, FALSE, FALSE, 0); vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) vbox, FALSE, FALSE, 0); fm_synth->auto_update = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("auto update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) fm_synth->auto_update, FALSE, FALSE, 0); fm_synth->update = (GtkButton *) gtk_button_new_with_label(i18n("update")); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) fm_synth->update, FALSE, FALSE, 0); /* table */ table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) table, FALSE, FALSE, 0); /* frequency */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("lower"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); fm_synth->lower = (GtkSpinButton *) gtk_spin_button_new_with_range(AGS_FM_SYNTH_BASE_NOTE_MIN, AGS_FM_SYNTH_BASE_NOTE_MAX, 1.0); gtk_spin_button_set_value(fm_synth->lower, -48.0); gtk_table_attach(table, GTK_WIDGET(fm_synth->lower), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } void ags_fm_synth_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_fm_synth_parent_class)->finalize(gobject); } void ags_fm_synth_connect(AgsConnectable *connectable) { AgsFMSynth *fm_synth; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_fm_synth_parent_connectable_interface->connect(connectable); /* AgsFMSynth */ fm_synth = AGS_FM_SYNTH(connectable); g_signal_connect((GObject *) fm_synth->lower, "value-changed", G_CALLBACK(ags_fm_synth_lower_callback), fm_synth); g_signal_connect((GObject *) fm_synth->auto_update, "toggled", G_CALLBACK(ags_fm_synth_auto_update_callback), fm_synth); g_signal_connect((GObject *) fm_synth->update, "clicked", G_CALLBACK(ags_fm_synth_update_callback), (gpointer) fm_synth); } void ags_fm_synth_disconnect(AgsConnectable *connectable) { AgsFMSynth *fm_synth; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_fm_synth_parent_connectable_interface->disconnect(connectable); /* AgsFMSynth */ fm_synth = AGS_FM_SYNTH(connectable); g_object_disconnect((GObject *) fm_synth->lower, "any_signal::value-changed", G_CALLBACK(ags_fm_synth_lower_callback), fm_synth, NULL); g_object_disconnect((GObject *) fm_synth->auto_update, "any_signal::toggled", G_CALLBACK(ags_fm_synth_auto_update_callback), fm_synth, NULL); g_object_disconnect((GObject *) fm_synth->update, "any_signal::clicked", G_CALLBACK(ags_fm_synth_update_callback), (gpointer) fm_synth, NULL); } void ags_fm_synth_map_recall(AgsMachine *machine) { AgsFMSynth *fm_synth; AgsAudio *audio; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } AGS_MACHINE_CLASS(ags_fm_synth_parent_class)->map_recall(machine); } void ags_fm_synth_update(AgsFMSynth *fm_synth) { AgsWindow *window; AgsFMOscillator *fm_oscillator; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_channel; AgsRecycling *first_recycling; AgsClearAudioSignal *clear_audio_signal; AgsApplySynth *apply_synth; AgsApplicationContext *application_context; GList *input_pad, *input_pad_start; GList *input_line, *input_line_start; GList *rt_template; GList *task; guint output_lines; guint buffer_size; guint attack, frame_count; gdouble frequency, phase, start_frequency; gdouble volume; gdouble fm_lfo_frequency, fm_lfo_depth; gdouble fm_tuning; AgsComplex **sync_point; guint sync_point_count; application_context = ags_application_context_get_instance(); window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) fm_synth); audio = AGS_MACHINE(fm_synth)->audio; /* */ start_frequency = (gdouble) gtk_spin_button_get_value(fm_synth->lower); /* clear output */ input_pad_start = input_pad = gtk_container_get_children((GtkContainer *) fm_synth->input_pad); g_object_get(audio, "output", &start_output, "input", &start_input, "output-lines", &output_lines, "buffer-size", &buffer_size, NULL); task = NULL; channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ AgsAudioSignal *template; GList *start_list; g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_get(first_recycling, "audio-signal", &start_list, NULL); /* */ template = ags_audio_signal_get_template(start_list); clear_audio_signal = ags_clear_audio_signal_new(template); task = g_list_prepend(task, clear_audio_signal); g_list_free_full(start_list, g_object_unref); g_object_unref(first_recycling); g_object_unref(template); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* write output */ while(input_pad != NULL){ AgsChannel *input; GList *start_synth_generator, *synth_generator; guint format; guint i; gboolean do_sync; input_line = gtk_container_get_children((GtkContainer *) AGS_PAD(input_pad->data)->expander_set); fm_oscillator = AGS_FM_OSCILLATOR(gtk_container_get_children((GtkContainer *) AGS_LINE(input_line->data)->expander->table)->data); g_object_get(AGS_LINE(input_line->data), "channel", &input, NULL); g_object_get(input, "synth-generator", &start_synth_generator, "format", &format, NULL); synth_generator = start_synth_generator; /* do it so */ attack = (guint) gtk_spin_button_get_value_as_int(fm_oscillator->attack); frame_count = (guint) gtk_spin_button_get_value_as_int(fm_oscillator->frame_count); phase = gtk_spin_button_get_value(fm_oscillator->phase); frequency = gtk_spin_button_get_value(fm_oscillator->frequency); volume = gtk_spin_button_get_value(fm_oscillator->volume); fm_lfo_frequency = gtk_spin_button_get_value(fm_oscillator->fm_lfo_frequency); fm_lfo_depth = gtk_spin_button_get_value(fm_oscillator->fm_lfo_depth); fm_tuning = gtk_spin_button_get_value(fm_oscillator->fm_tuning); g_object_set(synth_generator->data, "format", format, "delay", (gdouble) attack / (gdouble) buffer_size, "attack", attack, "frame-count", frame_count, "oscillator", gtk_combo_box_get_active(fm_oscillator->wave), "frequency", frequency, "phase", phase, "volume", volume, "do-fm-synth", TRUE, "fm-lfo-oscillator", gtk_combo_box_get_active(fm_oscillator->fm_lfo_wave), "fm-lfo-frequency", fm_lfo_frequency, "fm-lfo-depth", fm_lfo_depth, "fm-tuning", fm_tuning, NULL); do_sync = gtk_toggle_button_get_active((GtkToggleButton *) fm_oscillator->do_sync); if(do_sync){ sync_point_count = fm_oscillator->sync_point_count; /* free previous sync point */ if(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point != NULL){ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); } /* set new sync point */ if(sync_point_count > 0){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = (AgsComplex **) malloc(sync_point_count * sizeof(AgsComplex *)); }else{ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; } AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = sync_point_count; for(i = 0; i < sync_point_count; i++){ AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i] = ags_complex_alloc(); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].real = gtk_spin_button_get_value(fm_oscillator->sync_point[2 * i]); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i][0].imag = gtk_spin_button_get_value(fm_oscillator->sync_point[2 * i + 1]); } }else{ for(i = 0; i < AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count; i++){ ags_complex_free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point[i]); } free(AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point); AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point = NULL; AGS_SYNTH_GENERATOR(synth_generator->data)->sync_point_count = 0; } apply_synth = ags_apply_synth_new(synth_generator->data, start_output, start_frequency, output_lines); task = g_list_prepend(task, apply_synth); g_list_free_full(start_synth_generator, g_object_unref); /* iterate */ input_pad = input_pad->next; } if(start_output != NULL){ g_object_unref(start_output); } if(next_channel != NULL){ g_object_unref(next_channel); } g_list_free(input_pad_start); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), g_list_reverse(task)); } /** * ags_fm_synth_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsFMSynth * * Returns: the new #AgsFMSynth * * Since: 3.0.0 */ AgsFMSynth* ags_fm_synth_new(GObject *soundcard) { AgsFMSynth *fm_synth; fm_synth = (AgsFMSynth *) g_object_new(AGS_TYPE_FM_SYNTH, NULL); g_object_set(G_OBJECT(AGS_MACHINE(fm_synth)->audio), "output-soundcard", soundcard, NULL); return(fm_synth); } gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler_callbacks.c0000644000175000017500000002566513607210263021032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_pitch_sampler_open_response_callback(GtkWidget *widget, gint response, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsPitchSampler *pitch_sampler) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_ancestor((GtkWidget *) pitch_sampler, AGS_TYPE_WINDOW)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_PITCH_SAMPLER)->counter); g_object_set(AGS_MACHINE(pitch_sampler), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_PITCH_SAMPLER); g_free(str); } void ags_pitch_sampler_open_callback(GtkButton *button, AgsPitchSampler *pitch_sampler) { GtkFileChooserDialog *dialog; if(pitch_sampler->open_dialog != NULL){ return; } pitch_sampler->open_dialog = dialog = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new(i18n("Open audio files"), (GtkWindow *) gtk_widget_get_toplevel((GtkWidget *) pitch_sampler), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), FALSE); gtk_widget_show_all((GtkWidget *) dialog); g_signal_connect((GObject *) dialog, "response", G_CALLBACK(ags_pitch_sampler_open_response_callback), pitch_sampler); } void ags_pitch_sampler_open_response_callback(GtkWidget *widget, gint response, AgsPitchSampler *pitch_sampler) { if(response == GTK_RESPONSE_ACCEPT){ gchar *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); gtk_entry_set_text(pitch_sampler->filename, filename); ags_pitch_sampler_open_filename(pitch_sampler, filename); } pitch_sampler->open_dialog = NULL; gtk_widget_destroy(widget); } void ags_pitch_sampler_file_control_changed_callback(AgsPitchSamplerFile *pitch_sampler_file, AgsPitchSampler *pitch_sampler) { if((AGS_PITCH_SAMPLER_AUTO_UPDATE & (pitch_sampler->flags)) != 0){ ags_pitch_sampler_update(pitch_sampler); } } void ags_pitch_sampler_enable_lfo_callback(GtkToggleButton *toggle, AgsPitchSampler *pitch_sampler) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; while(channel != NULL){ g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_LFO_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "enabled", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gtk_toggle_button_get_active(toggle) ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_LFO_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "enabled", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (gtk_toggle_button_get_active(toggle) ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } void ags_pitch_sampler_lfo_freq_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; while(channel != NULL){ g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_LFO_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "lfo-freq", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_LFO_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "lfo-freq", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } void ags_pitch_sampler_lfo_phase_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; while(channel != NULL){ g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_LFO_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "lfo-phase", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_LFO_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "lfo-phase", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } void ags_pitch_sampler_lfo_depth_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; while(channel != NULL){ g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_LFO_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "lfo-depth", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_LFO_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "lfo-depth", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } void ags_pitch_sampler_lfo_tuning_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, NULL); channel = start_input; while(channel != NULL){ g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_LFO_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "lfo-tuning", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_LFO_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "lfo-tuning", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, gtk_spin_button_get_value(spin_button)); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } gsequencer-3.1.3/ags/X/machine/ags_panel_input_pad.c0000644000175000017500000001413613607210263017332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_panel_input_pad_class_init(AgsPanelInputPadClass *panel_input_pad); void ags_panel_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_panel_input_pad_init(AgsPanelInputPad *panel_input_pad); void ags_panel_input_pad_finalize(GObject *gobject); void ags_panel_input_pad_connect(AgsConnectable *connectable); void ags_panel_input_pad_disconnect(AgsConnectable *connectable); void ags_panel_input_pad_show(GtkWidget *pad); void ags_panel_input_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_panel_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); /** * SECTION:ags_panel_input_pad * @short_description: panel input pad * @title: AgsPanelInputPad * @section_id: * @include: ags/X/machine/ags_panel_input_pad.h * * The #AgsPanelInputPad is a composite widget to act as panel input pad. */ static gpointer ags_panel_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_panel_input_pad_parent_connectable_interface; GType ags_panel_input_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_panel_input_pad = 0; static const GTypeInfo ags_panel_input_pad_info = { sizeof(AgsPanelInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_panel_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPanelInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_panel_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_panel_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_panel_input_pad = g_type_register_static(AGS_TYPE_PAD, "AgsPanelInputPad", &ags_panel_input_pad_info, 0); g_type_add_interface_static(ags_type_panel_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_panel_input_pad); } return g_define_type_id__volatile; } void ags_panel_input_pad_class_init(AgsPanelInputPadClass *panel_input_pad) { GObjectClass *gobject; GtkWidgetClass *widget; AgsPadClass *pad; ags_panel_input_pad_parent_class = g_type_class_peek_parent(panel_input_pad); /* GObjectClass */ gobject = (GObjectClass *) panel_input_pad; gobject->finalize = ags_panel_input_pad_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) panel_input_pad; widget->show = ags_panel_input_pad_show; /* AgsPadClass */ pad = (AgsPadClass *) panel_input_pad; pad->set_channel = ags_panel_input_pad_set_channel; pad->resize_lines = ags_panel_input_pad_resize_lines; } void ags_panel_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_panel_input_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_panel_input_pad_connect; connectable->disconnect = ags_panel_input_pad_disconnect; } void ags_panel_input_pad_init(AgsPanelInputPad *panel_input_pad) { AgsPad *pad; GtkVBox *vbox; pad = (AgsPad *) panel_input_pad; pad->cols = 1; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) pad, (GtkWidget *) vbox, FALSE, TRUE, 0); gtk_box_reorder_child((GtkBox *) pad, (GtkWidget *) vbox, 0); } void ags_panel_input_pad_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_panel_input_pad_parent_class)->finalize(gobject); /* empty */ } void ags_panel_input_pad_connect(AgsConnectable *connectable) { AgsPanelInputPad *panel_input_pad; panel_input_pad = AGS_PANEL_INPUT_PAD(connectable); if((AGS_PAD_CONNECTED & (AGS_PAD(panel_input_pad)->flags)) != 0){ return; } ags_panel_input_pad_parent_connectable_interface->connect(connectable); /* empty */ } void ags_panel_input_pad_disconnect(AgsConnectable *connectable) { ags_panel_input_pad_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_panel_input_pad_show(GtkWidget *pad) { GTK_WIDGET_CLASS(ags_panel_input_pad_parent_class)->show(pad); /* gtk_widget_hide(GTK_WIDGET(AGS_PAD(pad)->group)); gtk_widget_hide(GTK_WIDGET(AGS_PAD(pad)->mute)); gtk_widget_hide(GTK_WIDGET(AGS_PAD(pad)->solo)); */ } void ags_panel_input_pad_set_channel(AgsPad *pad, AgsChannel *channel) { AGS_PAD_CLASS(ags_panel_input_pad_parent_class)->set_channel(pad, channel); /* empty */ } void ags_panel_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AGS_PAD_CLASS(ags_panel_input_pad_parent_class)->resize_lines(pad, line_type, audio_channels, audio_channels_old); /* empty */ } /** * ags_panel_input_pad_new: * @channel: the assigned channel * * Create a new instance of #AgsPanelInputPad * * Returns: the new #AgsPanelInputPad * * Since: 3.0.0 */ AgsPanelInputPad* ags_panel_input_pad_new(AgsChannel *channel) { AgsPanelInputPad *panel_input_pad; panel_input_pad = (AgsPanelInputPad *) g_object_new(AGS_TYPE_PANEL_INPUT_PAD, "channel", channel, NULL); return(panel_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_synth_input_line_callbacks.h0000644000175000017500000000270413607210263021565 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_INPUT_LINE_CALLBACKS_H__ #define __AGS_SYNTH_INPUT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_synth_input_line_samplerate_changed_callback(AgsLine *line, guint samplerate, guint old_samplerate, gpointer user_data); void ags_synth_input_line_oscillator_control_changed_callback(AgsOscillator *oscillator, AgsSynthInputLine *synth_input_line); G_END_DECLS #endif /*__AGS_SYNTH_INPUT_LINE_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler.c0000644000175000017500000013076313607210264017030 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_pitch_sampler_class_init(AgsPitchSamplerClass *pitch_sampler); void ags_pitch_sampler_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pitch_sampler_init(AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_finalize(GObject *gobject); void ags_pitch_sampler_connect(AgsConnectable *connectable); void ags_pitch_sampler_disconnect(AgsConnectable *connectable); void ags_pitch_sampler_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_pitch_sampler_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data); void ags_pitch_sampler_map_recall(AgsMachine *machine); void ags_pitch_sampler_output_map_recall(AgsPitchSampler *pitch_sampler, guint output_pad_start); void ags_pitch_sampler_input_map_recall(AgsPitchSampler *pitch_sampler, guint input_pad_start); /** * SECTION:ags_pitch_sampler * @short_description: pitch_sampler notation * @title: AgsPitchSampler * @section_id: * @include: ags/X/machine/ags_pitch_sampler.h * * The #AgsPitchSampler is a composite widget to act as soundfont2 notation player. */ static gpointer ags_pitch_sampler_parent_class = NULL; static AgsConnectableInterface *ags_pitch_sampler_parent_connectable_interface; GHashTable *ags_pitch_sampler_sfz_loader_completed = NULL; GType ags_pitch_sampler_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pitch_sampler = 0; static const GTypeInfo ags_pitch_sampler_info = { sizeof(AgsPitchSamplerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pitch_sampler_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPitchSampler), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pitch_sampler_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pitch_sampler_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pitch_sampler = g_type_register_static(AGS_TYPE_MACHINE, "AgsPitchSampler", &ags_pitch_sampler_info, 0); g_type_add_interface_static(ags_type_pitch_sampler, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pitch_sampler); } return g_define_type_id__volatile; } void ags_pitch_sampler_class_init(AgsPitchSamplerClass *pitch_sampler) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_pitch_sampler_parent_class = g_type_class_peek_parent(pitch_sampler); /* GObjectClass */ gobject = (GObjectClass *) pitch_sampler; gobject->finalize = ags_pitch_sampler_finalize; /* AgsMachineClass */ machine = (AgsMachineClass *) pitch_sampler; machine->map_recall = ags_pitch_sampler_map_recall; } void ags_pitch_sampler_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_pitch_sampler_connectable_parent_interface; ags_pitch_sampler_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_pitch_sampler_connect; connectable->disconnect = ags_pitch_sampler_disconnect; } void ags_pitch_sampler_init(AgsPitchSampler *pitch_sampler) { GtkExpander *expander; GtkVBox *vbox; AgsPitchSamplerFile *file; GtkHBox *hbox; GtkVBox *control_vbox; GtkHBox *filename_hbox; GtkTable *lfo_table; GtkLabel *label; AgsAudio *audio; g_signal_connect_after((GObject *) pitch_sampler, "parent_set", G_CALLBACK(ags_pitch_sampler_parent_set_callback), (gpointer) pitch_sampler); audio = AGS_MACHINE(pitch_sampler)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_FILE)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(pitch_sampler)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); AGS_MACHINE(pitch_sampler)->file_input_flags |= AGS_MACHINE_ACCEPT_SFZ; AGS_MACHINE(pitch_sampler)->input_pad_type = G_TYPE_NONE; AGS_MACHINE(pitch_sampler)->input_line_type = G_TYPE_NONE; AGS_MACHINE(pitch_sampler)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(pitch_sampler)->output_line_type = G_TYPE_NONE; /* context menu */ ags_machine_popup_add_connection_options((AgsMachine *) pitch_sampler, (AGS_MACHINE_POPUP_MIDI_DIALOG)); /* audio resize */ g_signal_connect_after(G_OBJECT(pitch_sampler), "resize-audio-channels", G_CALLBACK(ags_pitch_sampler_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(pitch_sampler), "resize-pads", G_CALLBACK(ags_pitch_sampler_resize_pads), NULL); /* flags */ pitch_sampler->flags = 0; /* mapped IO */ pitch_sampler->mapped_input_pad = 0; pitch_sampler->mapped_output_pad = 0; /* context menu */ ags_machine_popup_add_edit_options((AgsMachine *) pitch_sampler, (AGS_MACHINE_POPUP_ENVELOPE)); /* name and xml type */ pitch_sampler->name = NULL; pitch_sampler->xml_type = "ags-pitch-sampler"; /* audio container */ pitch_sampler->audio_container = NULL; /* create widgets */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) (gtk_bin_get_child((GtkBin *) pitch_sampler)), (GtkWidget *) vbox); /* hbox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); /* file */ expander = gtk_expander_new(i18n("file")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) expander, FALSE, FALSE, 0); pitch_sampler->file = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) expander, (GtkWidget *) pitch_sampler->file); /* add 1 sample */ file = ags_pitch_sampler_file_new(); ags_pitch_sampler_add_file(pitch_sampler, file); /* control */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); /* filename */ filename_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) filename_hbox, FALSE, FALSE, 0); pitch_sampler->filename = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) pitch_sampler->filename, FALSE, FALSE, 0); pitch_sampler->open = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) pitch_sampler->open, FALSE, FALSE, 0); pitch_sampler->sfz_loader = NULL; pitch_sampler->position = -1; pitch_sampler->loading = (GtkLabel *) gtk_label_new(i18n("loading ... ")); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) pitch_sampler->loading, FALSE, FALSE, 0); gtk_widget_set_no_show_all((GtkWidget *) pitch_sampler->loading, TRUE); gtk_widget_hide((GtkWidget *) pitch_sampler->loading); /* other controls */ /* LFO table */ lfo_table = (GtkTable *) gtk_table_new(3, 4, FALSE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) lfo_table, FALSE, FALSE, 0); pitch_sampler->enable_lfo = gtk_check_button_new_with_label(i18n("enable LFO")); gtk_table_attach(lfo_table, (GtkWidget *) pitch_sampler->enable_lfo, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); label = gtk_label_new(i18n("LFO freq")); gtk_table_attach(lfo_table, (GtkWidget *) label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler->lfo_freq = (GtkSpinButton *) gtk_spin_button_new_with_range(AGS_PITCH_SAMPLER_LFO_FREQ_MIN, AGS_PITCH_SAMPLER_LFO_FREQ_MAX, 0.001); gtk_spin_button_set_digits(pitch_sampler->lfo_freq, 3); gtk_spin_button_set_value(pitch_sampler->lfo_freq, AGS_PITCH_SAMPLER_DEFAULT_LFO_FREQ); gtk_table_attach(lfo_table, (GtkWidget *) pitch_sampler->lfo_freq, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 0, 0); label = gtk_label_new(i18n("LFO phase")); gtk_table_attach(lfo_table, (GtkWidget *) label, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler->lfo_phase = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, G_MAXDOUBLE, 1.0); gtk_spin_button_set_value(pitch_sampler->lfo_phase, 0.0); gtk_table_attach(lfo_table, (GtkWidget *) pitch_sampler->lfo_phase, 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0); label = gtk_label_new(i18n("LFO depth")); gtk_table_attach(lfo_table, (GtkWidget *) label, 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler->lfo_depth = (GtkSpinButton *) gtk_spin_button_new_with_range(-1200.0, 1200.0, 1.0); gtk_spin_button_set_digits(pitch_sampler->lfo_depth, 3); gtk_spin_button_set_value(pitch_sampler->lfo_depth, 0.0); gtk_table_attach(lfo_table, (GtkWidget *) pitch_sampler->lfo_depth, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0); label = gtk_label_new(i18n("LFO tuning")); gtk_table_attach(lfo_table, (GtkWidget *) label, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler->lfo_tuning = (GtkSpinButton *) gtk_spin_button_new_with_range(-1200.0, 1200.0, 1.0); gtk_spin_button_set_digits(pitch_sampler->lfo_tuning, 2); gtk_spin_button_set_value(pitch_sampler->lfo_tuning, 0.0); gtk_table_attach(lfo_table, (GtkWidget *) pitch_sampler->lfo_tuning, 2, 3, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* dialog */ pitch_sampler->open_dialog = NULL; /* SFZ loader */ if(ags_pitch_sampler_sfz_loader_completed == NULL){ ags_pitch_sampler_sfz_loader_completed = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_pitch_sampler_sfz_loader_completed, pitch_sampler, ags_pitch_sampler_sfz_loader_completed_timeout); g_timeout_add(1000 / 4, (GSourceFunc) ags_pitch_sampler_sfz_loader_completed_timeout, (gpointer) pitch_sampler); } void ags_pitch_sampler_finalize(GObject *gobject) { g_hash_table_remove(ags_pitch_sampler_sfz_loader_completed, gobject); /* call parent */ G_OBJECT_CLASS(ags_pitch_sampler_parent_class)->finalize(gobject); } void ags_pitch_sampler_connect(AgsConnectable *connectable) { AgsWindow *window; AgsPitchSampler *pitch_sampler; GList *start_list, *list; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_pitch_sampler_parent_connectable_interface->connect(connectable); pitch_sampler = AGS_PITCH_SAMPLER(connectable); list = start_list = gtk_container_get_children(pitch_sampler->file); while(list != NULL){ GList *child_start; child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_connect(AGS_CONNECTABLE(child_start->next->data)); list = list->next; } g_list_free(start_list); /* filename */ g_signal_connect(pitch_sampler->open, "clicked", G_CALLBACK(ags_pitch_sampler_open_callback), pitch_sampler); /* LFO */ g_signal_connect_after((GObject *) pitch_sampler->enable_lfo, "toggled", G_CALLBACK(ags_pitch_sampler_enable_lfo_callback), pitch_sampler); g_signal_connect_after((GObject *) pitch_sampler->lfo_freq, "value-changed", G_CALLBACK(ags_pitch_sampler_lfo_freq_callback), (gpointer) pitch_sampler); g_signal_connect_after((GObject *) pitch_sampler->lfo_phase, "value-changed", G_CALLBACK(ags_pitch_sampler_lfo_phase_callback), (gpointer) pitch_sampler); g_signal_connect_after((GObject *) pitch_sampler->lfo_depth, "value-changed", G_CALLBACK(ags_pitch_sampler_lfo_depth_callback), (gpointer) pitch_sampler); g_signal_connect_after((GObject *) pitch_sampler->lfo_tuning, "value-changed", G_CALLBACK(ags_pitch_sampler_lfo_tuning_callback), (gpointer) pitch_sampler); } void ags_pitch_sampler_disconnect(AgsConnectable *connectable) { AgsPitchSampler *pitch_sampler; GList *start_list, *list; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_pitch_sampler_parent_connectable_interface->disconnect(connectable); pitch_sampler = AGS_PITCH_SAMPLER(connectable); list = start_list = gtk_container_get_children(pitch_sampler->file); while(list != NULL){ GList *child_start; child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_disconnect(AGS_CONNECTABLE(child_start->next->data)); g_list_free(child_start); list = list->next; } g_list_free(start_list); /* filename */ g_object_disconnect(pitch_sampler->open, "any_signal::clicked", G_CALLBACK(ags_pitch_sampler_open_callback), pitch_sampler, NULL); /* LFO */ g_object_disconnect((GObject *) pitch_sampler->enable_lfo, "any_signal::toggled", G_CALLBACK(ags_pitch_sampler_enable_lfo_callback), pitch_sampler, NULL); g_object_disconnect((GObject *) pitch_sampler->lfo_freq, "any_signal::value-changed", G_CALLBACK(ags_pitch_sampler_lfo_freq_callback), (gpointer) pitch_sampler, NULL); g_object_disconnect((GObject *) pitch_sampler->lfo_phase, "any_signal::value-changed", G_CALLBACK(ags_pitch_sampler_lfo_phase_callback), (gpointer) pitch_sampler, NULL); g_object_disconnect((GObject *) pitch_sampler->lfo_depth, "any_signal::value-changed", G_CALLBACK(ags_pitch_sampler_lfo_depth_callback), (gpointer) pitch_sampler, NULL); g_object_disconnect((GObject *) pitch_sampler->lfo_tuning, "any_signal::value-changed", G_CALLBACK(ags_pitch_sampler_lfo_tuning_callback), (gpointer) pitch_sampler, NULL); } void ags_pitch_sampler_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; GList *start_play, *play; guint output_pads, input_pads; guint i, j; audio = machine->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "output-pads", &output_pads, "output", &start_output, "input", &start_input, NULL); /* */ if(audio_channels > audio_channels_old){ /* AgsOutput */ channel = start_output; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-lfo */ ags_recall_factory_create(audio, NULL, NULL, "ags-lfo", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* AgsInput */ channel = start_input; g_object_ref(channel); while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; next_channel = NULL; while(channel != next_pad){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = 0; i < input_pads; i++){ for(j = audio_channels_old; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } /* AgsOutput */ /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channels_old, audio_channels, 0, audio->output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_pitch_sampler_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data) { AgsPitchSampler *pitch_sampler; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_channel, *nth_channel; guint output_pads, input_pads; gboolean grow; if(pads_old == pads){ return; } pitch_sampler = (AgsPitchSampler *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "output", &start_output, NULL); /* check grow */ if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(channel_type == AGS_TYPE_INPUT){ if(grow){ /* depending on destination */ ags_pitch_sampler_input_map_recall(pitch_sampler, pads_old); }else{ pitch_sampler->mapped_input_pad = pads; } }else if(channel_type == AGS_TYPE_OUTPUT){ if(grow){ /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* depending on destination */ ags_pitch_sampler_output_map_recall(pitch_sampler, pads_old); }else{ pitch_sampler->mapped_output_pad = pads; } }else{ g_critical("unknown channel type"); } if(start_output != NULL){ g_object_unref(start_output); } } void ags_pitch_sampler_map_recall(AgsMachine *machine) { AgsWindow *window; AgsPitchSampler *pitch_sampler; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } pitch_sampler = AGS_PITCH_SAMPLER(machine); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_pitch_sampler_input_map_recall(pitch_sampler, 0); /* depending on destination */ ags_pitch_sampler_output_map_recall(pitch_sampler, 0); /* call parent */ AGS_MACHINE_CLASS(ags_pitch_sampler_parent_class)->map_recall(machine); } void ags_pitch_sampler_input_map_recall(AgsPitchSampler *pitch_sampler, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel, *nth_channel; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(pitch_sampler->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-lfo */ ags_recall_factory_create(audio, NULL, NULL, "ags-lfo", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); nth_channel = ags_channel_pad_nth(start_input, input_pad_start); channel = nth_channel; next_channel = NULL; while(channel != NULL){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-feed */ ags_recall_factory_create(audio, NULL, NULL, "ags-feed", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } pitch_sampler->mapped_input_pad = input_pads; if(start_input != NULL){ g_object_unref(start_input); } } void ags_pitch_sampler_output_map_recall(AgsPitchSampler *pitch_sampler, guint output_pad_start) { AgsAudio *audio; guint output_pads, input_pads; guint audio_channels; if(pitch_sampler->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(pitch_sampler)->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } pitch_sampler->mapped_output_pad = output_pads; } /** * ags_pitch_sampler_add_file: * @pitch_sampler: the #AgsPitchSampler * @file: the #AgsPitchSamplerFile * * Add @file to @pitch_sampler. * * Since: 3.0.0 */ void ags_pitch_sampler_add_file(AgsPitchSampler *pitch_sampler, AgsPitchSamplerFile *file) { GtkHBox *hbox; GtkCheckButton *check_button; hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); check_button = (GtkCheckButton *) gtk_check_button_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) check_button, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) file, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox *) pitch_sampler->file, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) hbox); } /** * ags_pitch_sampler_remove_file: * @pitch_sampler: the #AgsPitchSampler * @nth: the nth #AgsPitchSamplerFile * * Remove nth file. * * Since: 3.0.0 */ void ags_pitch_sampler_remove_file(AgsPitchSampler *pitch_sampler, guint nth) { GList *list, *list_start; list_start = gtk_container_get_children(GTK_CONTAINER(pitch_sampler->file)); list = g_list_nth(list_start, nth); if(list != NULL){ gtk_widget_destroy(list->data); } g_list_free(list_start); } /** * ags_pitch_sampler_open_filename: * @pitch_sampler: the #AgsPitchSampler * @filename: the filename * * Open @filename. * * Since: 3.0.0 */ void ags_pitch_sampler_open_filename(AgsPitchSampler *pitch_sampler, gchar *filename) { AgsSFZLoader *sfz_loader; if(!AGS_IS_PITCH_SAMPLER(pitch_sampler) || filename == NULL){ return; } pitch_sampler->sfz_loader = sfz_loader = ags_sfz_loader_new(AGS_MACHINE(pitch_sampler)->audio, filename, TRUE); ags_sfz_loader_start(sfz_loader); } /** * ags_pitch_sampler_update: * @pitch_sampler: the #AgsPitchSampler * * Update @pitch_sampler. * * Since: 3.0.0 */ void ags_pitch_sampler_update(AgsPitchSampler *pitch_sampler) { //TODO:JK: implement me } /** * ags_pitch_sampler_sfz_loader_completed_timeout: * @pitch_sampler: the #AgsPitchSampler * * Queue draw widget * * Returns: %TRUE if proceed poll completed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_pitch_sampler_sfz_loader_completed_timeout(AgsPitchSampler *pitch_sampler) { if(g_hash_table_lookup(ags_pitch_sampler_sfz_loader_completed, pitch_sampler) != NULL){ if(pitch_sampler->sfz_loader != NULL){ if(ags_sfz_loader_test_flags(pitch_sampler->sfz_loader, AGS_SFZ_LOADER_HAS_COMPLETED)){ AgsPitchSamplerFile *file; GList *start_list, *list; /* file */ list = start_list = gtk_container_get_children(GTK_CONTAINER(pitch_sampler->file)); while(list != NULL){ gtk_widget_destroy(list->data); list = list->next; } g_list_free(start_list); /* reassign audio container */ pitch_sampler->audio_container = pitch_sampler->sfz_loader->audio_container; pitch_sampler->sfz_loader->audio_container = NULL; g_object_get(pitch_sampler->audio_container->sound_container, "sample", &start_list, NULL); list = start_list; while(list != NULL){ AgsSFZGroup *group; AgsSFZRegion *region; gchar *filename; gchar *str_key, *str_pitch_keycenter; gchar *str; glong current_key; glong pitch_keycenter, current_pitch_keycenter; guint loop_start, loop_end; int retval; file = ags_pitch_sampler_file_new(); ags_pitch_sampler_add_file(pitch_sampler, file); ags_connectable_connect(AGS_CONNECTABLE(file)); /* pitch keycenter */ g_object_get(list->data, "group", &group, "region", ®ion, "filename", &filename, NULL); pitch_keycenter = 49; /* group */ str_pitch_keycenter = ags_sfz_group_lookup_control(group, "pitch_keycenter"); str_key = ags_sfz_group_lookup_control(group, "key"); if(str_pitch_keycenter != NULL){ retval = sscanf(str_pitch_keycenter, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_pitch_keycenter; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_pitch_keycenter, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } }else if(str_key != NULL){ retval = sscanf(str_key, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_pitch_keycenter; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_key, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } } /* region */ str_pitch_keycenter = ags_sfz_region_lookup_control(region, "pitch_keycenter"); str_key = ags_sfz_region_lookup_control(region, "key"); if(str_pitch_keycenter != NULL){ retval = sscanf(str_pitch_keycenter, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_pitch_keycenter; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_pitch_keycenter, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } }else if(str_key != NULL){ retval = sscanf(str_key, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_pitch_keycenter; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_key, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } } /* set filename */ gtk_entry_set_text(file->filename, filename); g_free(filename); /* set pitch keycenter */ str = g_strdup_printf("%f", 27.5 * exp2((gdouble) pitch_keycenter / 12.0)); gtk_label_set_text(file->freq, str); g_free(str); str = g_strdup_printf("%d", pitch_keycenter); gtk_label_set_text(file->base_key, str); g_free(str); /* set loop start/end */ g_object_get(list->data, "loop-start", &loop_start, "loop-end", &loop_end, NULL); str = g_strdup_printf("%d", loop_start); gtk_label_set_text(file->loop_start, str); g_free(str); str = g_strdup_printf("%d", loop_end); gtk_label_set_text(file->loop_end, str); g_free(str); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); /* cleanup */ g_object_run_dispose((GObject *) pitch_sampler->sfz_loader); g_object_unref(pitch_sampler->sfz_loader); pitch_sampler->sfz_loader = NULL; pitch_sampler->position = -1; gtk_widget_hide((GtkWidget *) pitch_sampler->loading); }else{ if(pitch_sampler->position == -1){ pitch_sampler->position = 0; gtk_widget_show((GtkWidget *) pitch_sampler->loading); } switch(pitch_sampler->position){ case 0: { pitch_sampler->position = 1; gtk_label_set_label(pitch_sampler->loading, "loading ... "); } break; case 1: { pitch_sampler->position = 2; gtk_label_set_label(pitch_sampler->loading, "loading ... "); } break; case 2: { pitch_sampler->position = 0; gtk_label_set_label(pitch_sampler->loading, "loading ..."); } break; } } } return(TRUE); }else{ return(FALSE); } } /** * ags_pitch_sampler_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsPitchSampler * * Returns: the new #AgsPitchSampler * * Since: 3.0.0 */ AgsPitchSampler* ags_pitch_sampler_new(GObject *output_soundcard) { AgsPitchSampler *pitch_sampler; pitch_sampler = (AgsPitchSampler *) g_object_new(AGS_TYPE_PITCH_SAMPLER, NULL); if(output_soundcard != NULL){ g_object_set(AGS_MACHINE(pitch_sampler)->audio, "output-soundcard", output_soundcard, NULL); } return(pitch_sampler); } gsequencer-3.1.3/ags/X/machine/ags_panel_input_line.h0000644000175000017500000000421613607210263017520 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PANEL_INPUT_LINE_H__ #define __AGS_PANEL_INPUT_LINE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PANEL_INPUT_LINE (ags_panel_input_line_get_type()) #define AGS_PANEL_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PANEL_INPUT_LINE, AgsPanelInputLine)) #define AGS_PANEL_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PANEL_INPUT_LINE, AgsPanelInputLineClass)) #define AGS_IS_PANEL_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PANEL_INPUT_LINE)) #define AGS_IS_PANEL_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PANEL_INPUT_LINE)) #define AGS_PANEL_INPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PANEL_INPUT_LINE, AgsPanelInputLineClass)) typedef struct _AgsPanelInputLine AgsPanelInputLine; typedef struct _AgsPanelInputLineClass AgsPanelInputLineClass; struct _AgsPanelInputLine { AgsLine line; gchar *name; gchar *xml_type; GtkLabel *soundcard_connection; }; struct _AgsPanelInputLineClass { AgsLineClass line; }; GType ags_panel_input_line_get_type(); AgsPanelInputLine* ags_panel_input_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_PANEL_INPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_lv2_bridge_callbacks.c0000644000175000017500000006330713607210263020212 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include extern GHashTable *ags_lv2_bridge_lv2ui_handle; extern GHashTable *ags_lv2_bridge_lv2ui_idle; gboolean ags_lv2_bridge_delete_event_callback(GtkWidget *widget, GdkEvent *event, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLv2Bridge *lv2_bridge) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(widget)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_LV2_BRIDGE)->counter); g_object_set(AGS_MACHINE(lv2_bridge), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_LV2_BRIDGE); g_free(str); } gboolean ags_lv2_bridge_delete_event_callback(GtkWidget *widget, GdkEvent *event, AgsLv2Bridge *lv2_bridge) { gtk_widget_hide(widget); return(TRUE); } void ags_lv2_bridge_show_gui_callback(GtkMenuItem *item, AgsLv2Bridge *lv2_bridge) { AgsLv2Plugin *lv2_plugin; AgsLv2uiPlugin *lv2ui_plugin; lv2_plugin = lv2_bridge->lv2_plugin; lv2ui_plugin = lv2_bridge->lv2ui_plugin; if(lv2_plugin == NULL || lv2ui_plugin == NULL){ return; } if(lv2_bridge->ui_handle == NULL){ LV2UI_Descriptor *plugin_descriptor; GValue *value; gchar **parameter_name; guint local_n_params; guint n_params; guint i; local_n_params = 4; n_params = 4; parameter_name = (gchar **) malloc(5 * sizeof(gchar *)); value = g_new0(GValue, 4); parameter_name[0] = g_strdup("uri"); g_value_init(&(value[0]), G_TYPE_POINTER); g_value_set_pointer(&(value[0]), lv2_plugin->uri); parameter_name[1] = g_strdup("controller"); g_value_init(&(value[1]), G_TYPE_POINTER); g_value_set_pointer(&(value[1]), lv2_bridge); parameter_name[2] = g_strdup("write-function"); g_value_init(&(value[2]), G_TYPE_POINTER); g_value_set_pointer(&(value[2]), ags_lv2_bridge_lv2ui_write_function); parameter_name[3] = g_strdup("instance"); g_value_init(&(value[3]), G_TYPE_POINTER); g_value_set_pointer(&(value[3]), lv2_bridge->lv2_handle); parameter_name[4] = NULL; lv2_bridge->ui_handle = ags_base_plugin_instantiate_with_params(lv2ui_plugin, &n_params, ¶meter_name, &value); lv2_bridge->ui_descriptor = AGS_BASE_PLUGIN(lv2ui_plugin)->ui_plugin_descriptor; if(lv2_bridge->ui_handle != NULL){ if(n_params > local_n_params){ for(i = local_n_params; i < n_params; i++){ if(!g_ascii_strncasecmp(parameter_name[i], "widget", 7)){ lv2_bridge->ui_widget = g_value_get_pointer(&(value[i])); } } } g_hash_table_insert(ags_lv2_bridge_lv2ui_handle, lv2_bridge->ui_handle, lv2_bridge); plugin_descriptor = lv2_bridge->ui_descriptor; if(plugin_descriptor->extension_data != NULL){ lv2ui_plugin->feature[0]->data = plugin_descriptor->extension_data(LV2_UI__idleInterface); lv2ui_plugin->feature[1]->data = plugin_descriptor->extension_data(LV2_UI__showInterface); g_hash_table_insert(ags_lv2_bridge_lv2ui_idle, lv2_bridge->ui_handle, lv2_bridge); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_lv2_bridge_lv2ui_idle_timeout, (gpointer) lv2_bridge->ui_handle); } } #if 0 for(i = 0; i < n_params; i++){ g_value_unset(&(value[i])); } #endif g_free(value); g_strfreev(parameter_name); } if(lv2_bridge->ui_handle != NULL){ AgsEffectBridge *effect_bridge; GtkWidget *child_widget; GList *list_bulk_member, *list_bulk_member_start; gchar *str; /* set inital values */ effect_bridge = AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge); list_bulk_member = list_bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(effect_bridge->bulk_input)->table); lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; while(list_bulk_member != NULL){ uint32_t port_index; float val; child_widget = gtk_bin_get_child(GTK_BIN(AGS_BULK_MEMBER(list_bulk_member->data))); port_index = AGS_BULK_MEMBER(list_bulk_member->data)->port_index; if(AGS_IS_DIAL(child_widget)){ val = gtk_adjustment_get_value(AGS_DIAL(child_widget)->adjustment); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ val = gtk_spin_button_get_value(GTK_SPIN_BUTTON(child_widget)); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_SCALE(child_widget)){ val = gtk_range_get_value(GTK_RANGE(child_widget)); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ val = ((gtk_toggle_button_get_active(child_widget)) ? 1.0: 0.0); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_BUTTON(child_widget)){ val = 0.0; if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); } list_bulk_member = list_bulk_member->next; } lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); g_list_free(list_bulk_member_start); } if(lv2_bridge->ui_handle != NULL && lv2ui_plugin->feature != NULL && lv2ui_plugin->feature[1]->data != NULL){ ((struct _LV2UI_Show_Interface *) lv2ui_plugin->feature[1]->data)->show(lv2_bridge->ui_handle[0]); }else if(lv2_bridge->ui_widget != NULL){ GtkWindow *window; if(lv2_bridge->lv2_window == NULL){ lv2_bridge->lv2_window = window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(window, lv2_bridge->ui_widget); gtk_window_set_title(window, lv2_bridge->gui_uri); g_signal_connect(window, "delete-event", G_CALLBACK(ags_lv2_bridge_delete_event_callback), lv2_bridge); }else{ window = lv2_bridge->lv2_window; } gtk_widget_show_all(window); } } void ags_lv2_bridge_lv2ui_cleanup_function(LV2UI_Handle handle) { AgsLv2Bridge *lv2_bridge; AgsLv2uiPlugin *lv2ui_plugin; GList *list; lv2_bridge = g_hash_table_lookup(ags_lv2_bridge_lv2ui_handle, handle); if(lv2_bridge != NULL){ g_hash_table_remove(ags_lv2_bridge_lv2ui_handle, lv2_bridge->ui_handle); lv2_bridge->ui_handle = NULL; } } void ags_lv2_bridge_lv2ui_write_function(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t port_protocol, const void *buffer) { AgsLv2Bridge *lv2_bridge; AgsEffectBridge *effect_bridge; GtkWidget *child_widget; GList *list_bulk_member, *list_bulk_member_start; gfloat val; lv2_bridge = (AgsLv2Bridge *) controller; if(lv2_bridge == NULL){ g_warning("ags_lv2_bridge_lv2ui_write_function() - lv2_bridge == NULL"); return; } if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0){ return; } if(port_protocol != 0){ g_warning("ags_lv2_bridge_lv2ui_write_function() - unknown lv2 port protocol"); return; } effect_bridge = AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge); list_bulk_member = list_bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(effect_bridge->bulk_input)->table); while(list_bulk_member != NULL){ if(port_index == AGS_BULK_MEMBER(list_bulk_member->data)->port_index){ lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; child_widget = gtk_bin_get_child(GTK_BIN(AGS_BULK_MEMBER(list_bulk_member->data))); val = ((float *) buffer)[0]; if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, TRUE); } if(AGS_IS_DIAL(child_widget)){ ags_dial_set_value((AgsDial *) child_widget, val); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ gtk_spin_button_set_value((GtkSpinButton *) child_widget, val); }else if(GTK_IS_SCALE(child_widget)){ gtk_range_set_value((GtkRange *) child_widget, val); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, ((val != 0.0) ? TRUE: FALSE)); }else if(GTK_IS_BUTTON(child_widget)){ gtk_button_clicked((GtkButton *) child_widget); } lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); break; } list_bulk_member = list_bulk_member->next; } g_list_free(list_bulk_member_start); } void ags_lv2_bridge_program_changed_callback(GtkComboBox *combo_box, AgsLv2Bridge *lv2_bridge) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(combo_box, &iter)){ AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsLv2Plugin *lv2_plugin; LV2_Programs_Interface *program_interface; GList *start_plugin_port, *plugin_port; GList *bulk_member, *bulk_member_start; GList *start_recall, *recall; GList *start_port, *port; gchar *name; gchar *specifier; guint bank, program; lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), lv2_bridge->filename, lv2_bridge->effect); /* get program */ gtk_tree_model_get(gtk_combo_box_get_model(combo_box), &iter, 0, &name, 1, &bank, 2, &program, -1); #ifdef AGS_DEBUG g_message("%d %d", bank, program); #endif program_interface = lv2_bridge->lv2_descriptor->extension_data(LV2_PROGRAMS__Interface); program_interface->select_program(lv2_bridge->lv2_handle[0], bank, program); /* update ports */ g_object_get(AGS_MACHINE(lv2_bridge)->audio, "input", &start_input, NULL); channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); while(channel != NULL){ g_object_get(channel, "recall", &start_recall, NULL); recall = start_recall; while((recall = ags_recall_find_type(recall, AGS_TYPE_RECALL_LV2)) != NULL){ AGS_RECALL_LV2(recall->data)->bank = (uint32_t) bank; AGS_RECALL_LV2(recall->data)->program = (uint32_t) program; plugin_port = start_plugin_port; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ specifier = AGS_PLUGIN_PORT(plugin_port->data)->port_name; port = AGS_RECALL(recall->data)->port; while(port != NULL){ if(!g_strcmp0(AGS_PORT(port->data)->specifier, specifier)){ GValue value = {0,}; #ifdef AGS_DEBUG g_message("%s %f", specifier, lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]); #endif g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]); ags_port_safe_write_raw(port->data, &value); break; } port = port->next; } } } /* iterate */ plugin_port = plugin_port->next; } /* iterate */ recall = recall->next; } g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_channel != NULL){ g_object_unref(next_channel); } /* update UI */ bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge)->bulk_input)->table); plugin_port = start_plugin_port; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ /* find bulk member */ bulk_member = bulk_member_start; specifier = AGS_PLUGIN_PORT(plugin_port->data)->port_name; #ifdef AGS_DEBUG g_message("%s", specifier); #endif while(bulk_member != NULL){ if(AGS_IS_BULK_MEMBER(bulk_member->data) && !g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->specifier, specifier)){ GtkWidget *child_widget; AGS_BULK_MEMBER(bulk_member->data)->flags |= AGS_BULK_MEMBER_NO_UPDATE; child_widget = gtk_bin_get_child((GtkBin *) AGS_BULK_MEMBER(bulk_member->data)); if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index] == 0.0){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, TRUE); } }else if(AGS_IS_DIAL(child_widget)){ gfloat port_val; gdouble val; port_val = lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]; val = port_val; if(AGS_BULK_MEMBER(bulk_member->data)->conversion != NULL){ val = ags_conversion_convert(AGS_BULK_MEMBER(bulk_member->data)->conversion, port_val, TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, val); gtk_widget_queue_draw((AgsDial *) child_widget); #ifdef AGS_DEBUG g_message(" --- %f", lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]); #endif } AGS_BULK_MEMBER(bulk_member->data)->flags &= (~AGS_BULK_MEMBER_NO_UPDATE); break; } bulk_member = bulk_member->next; } } } /* iterate */ plugin_port = plugin_port->next; } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } g_list_free_full(start_plugin_port, g_object_unref); g_list_free(bulk_member_start); } } void ags_lv2_bridge_preset_changed_callback(GtkComboBox *combo_box, AgsLv2Bridge *lv2_bridge) { GtkContainer *container; AgsLv2Conversion *lv2_conversion; AgsLv2Plugin *lv2_plugin; AgsLv2Preset *lv2_preset; GList *list, *list_start; GList *start_port_preset, *port_preset; GList *start_plugin_port, *plugin_port; gchar *preset_label; /* retrieve lv2 plugin */ lv2_plugin = lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), lv2_bridge->filename, lv2_bridge->effect); g_object_ref(lv2_plugin); lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } /* preset label */ preset_label = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box)); /* preset */ lv2_preset = NULL; list = ags_lv2_preset_find_preset_label(lv2_plugin->preset, preset_label); if(list != NULL){ lv2_preset = list->data; } /* port preset */ if(lv2_preset == NULL){ return; } container = GTK_CONTAINER(AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge)->bulk_input)->table); g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); g_object_get(lv2_preset, "port-preset", &start_port_preset, NULL); port_preset = start_port_preset; while(port_preset != NULL){ plugin_port = ags_plugin_port_find_symbol(start_plugin_port, AGS_LV2_PORT_PRESET(port_preset->data)->port_symbol); if(plugin_port != NULL){ gfloat port_value; gdouble value; port_value = g_value_get_float(AGS_LV2_PORT_PRESET(port_preset->data)->port_value); value = port_value; list_start = list = gtk_container_get_children(container); while(list != NULL){ if(!g_strcmp0(AGS_BULK_MEMBER(list->data)->specifier, AGS_PLUGIN_PORT(plugin_port->data)->port_name)){ GtkWidget *child_widget; // AGS_BULK_MEMBER(list->data)->flags |= AGS_BULK_MEMBER_NO_UPDATE; child_widget = gtk_bin_get_child((GtkBin *) AGS_BULK_MEMBER(list->data)); lv2_conversion = (AgsLv2Conversion *) AGS_BULK_MEMBER(list->data)->conversion; if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(value == 0.0){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, TRUE); } }else if(AGS_IS_DIAL(child_widget)){ if(lv2_conversion != NULL){ value = ags_conversion_convert(lv2_conversion, port_value, TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, value); gtk_widget_queue_draw((AgsDial *) child_widget); } // AGS_BULK_MEMBER(list->data)->flags &= (~AGS_BULK_MEMBER_NO_UPDATE); break; } list = list->next; } g_list_free(list_start); } /* iterate */ port_preset = port_preset->next; } g_list_free_full(start_plugin_port, g_object_unref); g_list_free(start_port_preset); } void ags_lv2_bridge_dial_changed_callback(GtkWidget *dial, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(dial, AGS_TYPE_BULK_MEMBER); g_object_get(dial, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } void ags_lv2_bridge_vscale_changed_callback(GtkWidget *vscale, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(vscale, AGS_TYPE_BULK_MEMBER); g_object_get(vscale, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } void ags_lv2_bridge_hscale_changed_callback(GtkWidget *hscale, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(hscale, AGS_TYPE_BULK_MEMBER); g_object_get(hscale, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } void ags_lv2_bridge_spin_button_changed_callback(GtkWidget *spin_button, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(spin_button, AGS_TYPE_BULK_MEMBER); g_object_get(spin_button, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } void ags_lv2_bridge_check_button_clicked_callback(GtkWidget *check_button, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; gboolean is_active; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(check_button, AGS_TYPE_BULK_MEMBER); is_active = gtk_toggle_button_get_active((GtkToggleButton *) check_button); port_index = bulk_member->port_index; val = is_active ? 1.0: 0.0; if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } void ags_lv2_bridge_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; gboolean is_active; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(toggle_button, AGS_TYPE_BULK_MEMBER); is_active = gtk_toggle_button_get_active((GtkToggleButton *) toggle_button); port_index = bulk_member->port_index; val = is_active ? 1.0: 0.0; if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } void ags_lv2_bridge_button_clicked_callback(GtkWidget *button, AgsLv2Bridge *lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; gboolean is_active; uint32_t port_index; float val; if((AGS_LV2_BRIDGE_NO_UPDATE & (lv2_bridge->flags)) != 0 || lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(button, AGS_TYPE_BULK_MEMBER); port_index = bulk_member->port_index; val = 0.0; if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } lv2_bridge->flags |= AGS_LV2_BRIDGE_NO_UPDATE; lv2_bridge->ui_descriptor->port_event(lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); lv2_bridge->flags &= (~AGS_LV2_BRIDGE_NO_UPDATE); } gsequencer-3.1.3/ags/X/machine/ags_dssi_bridge.h0000644000175000017500000000601713607210263016452 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DSSI_BRIDGE_H__ #define __AGS_DSSI_BRIDGE_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DSSI_BRIDGE (ags_dssi_bridge_get_type()) #define AGS_DSSI_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DSSI_BRIDGE, AgsDssiBridge)) #define AGS_DSSI_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DSSI_BRIDGE, AgsDssiBridgeClass)) #define AGS_IS_DSSI_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DSSI_BRIDGE)) #define AGS_IS_DSSI_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DSSI_BRIDGE)) #define AGS_DSSI_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_DSSI_BRIDGE, AgsDssiBridgeClass)) #define AGS_DSSI_BRIDGE_DEFAULT_VERSION "0.7.4" #define AGS_DSSI_BRIDGE_DEFAULT_BUILD_ID "CEST 16-02-2016 23:36" typedef struct _AgsDssiBridge AgsDssiBridge; typedef struct _AgsDssiBridgeClass AgsDssiBridgeClass; typedef enum{ AGS_DSSI_BRIDGE_DISPLAY_INPUT = 1, AGS_DSSI_BRIDGE_BULK_OUTPUT = 1 << 1, AGS_DSSI_BRIDGE_DISPLAY_OUTPUT = 1 << 2, AGS_DSSI_BRIDGE_BULK_INPUT = 1 << 3, }AgsDssiBridgeFlags; struct _AgsDssiBridge { AgsMachine machine; guint flags; gchar *name; gchar *version; gchar *build_id; gchar *xml_type; guint mapped_output_pad; guint mapped_input_pad; gchar *filename; gchar *effect; unsigned long effect_index; DSSI_Descriptor *dssi_descriptor; LADSPA_Handle ladspa_handle; LADSPA_Data *port_values; GtkComboBoxText *program; }; struct _AgsDssiBridgeClass { AgsMachineClass machine; }; GType ags_dssi_bridge_get_type(void); void ags_dssi_bridge_input_map_recall(AgsDssiBridge *dssi_bridge, guint audio_channel_start, guint input_pad_start); void ags_dssi_bridge_output_map_recall(AgsDssiBridge *dssi_bridge, guint audio_channel_start, guint output_pad_start); void ags_dssi_bridge_load(AgsDssiBridge *dssi_bridge); AgsDssiBridge* ags_dssi_bridge_new(GObject *soundcard, gchar *filename, gchar *effect); G_END_DECLS #endif /*__AGS_DSSI_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_input_pad.c0000644000175000017500000001701113607210263017175 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_drum_input_pad_class_init(AgsDrumInputPadClass *drum_input_pad); void ags_drum_input_pad_connectable_interface_init(AgsConnectableInterface *connectable); void ags_drum_input_pad_init(AgsDrumInputPad *drum_input_pad); static void ags_drum_input_pad_finalize(GObject *gobject); void ags_drum_input_pad_connect(AgsConnectable *connectable); void ags_drum_input_pad_disconnect(AgsConnectable *connectable); void ags_drum_input_pad_set_channel(AgsPad *pad, AgsChannel *channel); void ags_drum_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old); /** * SECTION:ags_drum_input_pad * @short_description: drum sequencer input pad * @title: AgsDrumInputPad * @section_id: * @include: ags/X/machine/ags_drum_input_pad.h * * The #AgsDrumInputPad is a composite widget to act as drum sequencer input pad. */ static gpointer ags_drum_input_pad_parent_class = NULL; static AgsConnectableInterface *ags_drum_input_pad_parent_connectable_interface; GType ags_drum_input_pad_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_drum_input_pad = 0; static const GTypeInfo ags_drum_input_pad_info = { sizeof(AgsDrumInputPadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_drum_input_pad_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDrumInputPad), 0, /* n_preallocs */ (GInstanceInitFunc) ags_drum_input_pad_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_drum_input_pad_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_drum_input_pad = g_type_register_static(AGS_TYPE_PAD, "AgsDrumInputPad", &ags_drum_input_pad_info, 0); g_type_add_interface_static(ags_type_drum_input_pad, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_drum_input_pad); } return g_define_type_id__volatile; } void ags_drum_input_pad_class_init(AgsDrumInputPadClass *drum_input_pad) { AgsPadClass *pad; GObjectClass *gobject; ags_drum_input_pad_parent_class = g_type_class_peek_parent(drum_input_pad); /* */ gobject = (GObjectClass *) drum_input_pad; gobject->finalize = ags_drum_input_pad_finalize; /* */ pad = (AgsPadClass *) drum_input_pad; pad->set_channel = ags_drum_input_pad_set_channel; pad->resize_lines = ags_drum_input_pad_resize_lines; } void ags_drum_input_pad_connectable_interface_init(AgsConnectableInterface *connectable) { ags_drum_input_pad_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_drum_input_pad_connect; connectable->disconnect = ags_drum_input_pad_disconnect; } void ags_drum_input_pad_init(AgsDrumInputPad *drum_input_pad) { AgsPad *pad; GtkHBox *hbox; drum_input_pad->flags = 0; drum_input_pad->name = NULL; drum_input_pad->xml_type = "ags-drum-input-pad"; pad = (AgsPad *) drum_input_pad; /* toplevel functions */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) pad, (GtkWidget *) hbox, FALSE, TRUE, 0); gtk_box_reorder_child((GtkBox *) pad, (GtkWidget *) hbox, 0); /* open */ drum_input_pad->open = (GtkButton *) gtk_button_new(); gtk_container_add((GtkContainer *) drum_input_pad->open, (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON)); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) drum_input_pad->open, TRUE, TRUE, 0); /* play */ AGS_PAD(drum_input_pad)->play = drum_input_pad->play = (GtkToggleButton *) gtk_toggle_button_new(); gtk_container_add((GtkContainer *) drum_input_pad->play, (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON)); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) drum_input_pad->play, TRUE, TRUE, 0); /* bottom functions - edit */ drum_input_pad->edit = (GtkToggleButton *) gtk_toggle_button_new_with_label(i18n("edit")); gtk_box_pack_start((GtkBox *) pad, (GtkWidget *) drum_input_pad->edit, FALSE, FALSE, 0); /* recall specific */ drum_input_pad->pad_open_play_ref = 0; drum_input_pad->pad_open_recalls = NULL; drum_input_pad->file_chooser = NULL; drum_input_pad->pad_play_ref = 0; } static void ags_drum_input_pad_finalize(GObject *gobject) { AgsDrumInputPad *drum_input_pad; drum_input_pad = AGS_DRUM_INPUT_PAD(gobject); //FIXME:JK: won't be called //NOTE:JK: work-around in ags_drum.c if(drum_input_pad->file_chooser != NULL){ // gtk_widget_destroy(drum_input_pad->file_chooser); } G_OBJECT_CLASS(ags_drum_input_pad_parent_class)->finalize(gobject); } void ags_drum_input_pad_connect(AgsConnectable *connectable) { AgsDrumInputPad *drum_input_pad; drum_input_pad = AGS_DRUM_INPUT_PAD(connectable); if((AGS_PAD_CONNECTED & (AGS_PAD(drum_input_pad)->flags)) != 0){ return; } ags_drum_input_pad_parent_connectable_interface->connect(connectable); /* AgsDrumInputPad */ g_signal_connect(G_OBJECT(drum_input_pad->open), "clicked", G_CALLBACK(ags_drum_input_pad_open_callback), (gpointer) drum_input_pad); g_signal_connect_after(G_OBJECT(drum_input_pad->play), "toggled", G_CALLBACK(ags_drum_input_pad_play_callback), (gpointer) drum_input_pad); g_signal_connect(G_OBJECT(drum_input_pad->edit), "clicked", G_CALLBACK(ags_drum_input_pad_edit_callback), (gpointer) drum_input_pad); } void ags_drum_input_pad_disconnect(AgsConnectable *connectable) { ags_drum_input_pad_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_drum_input_pad_set_channel(AgsPad *pad, AgsChannel *channel) { AGS_PAD_CLASS(ags_drum_input_pad_parent_class)->set_channel(pad, channel); /* empty */ } void ags_drum_input_pad_resize_lines(AgsPad *pad, GType line_type, guint audio_channels, guint audio_channels_old) { AGS_PAD_CLASS(ags_drum_input_pad_parent_class)->resize_lines(pad, line_type, audio_channels, audio_channels_old); /* empty */ } /** * ags_drum_input_pad_new: * @channel: the assigned channel * * Creates an #AgsDrumInputPad * * Returns: a new #AgsDrumInputPad * * Since: 3.0.0 */ AgsDrumInputPad* ags_drum_input_pad_new(AgsChannel *channel) { AgsDrumInputPad *drum_input_pad; drum_input_pad = (AgsDrumInputPad *) g_object_new(AGS_TYPE_DRUM_INPUT_PAD, "channel", channel, NULL); return(drum_input_pad); } gsequencer-3.1.3/ags/X/machine/ags_desk.h0000644000175000017500000000413113607210263015115 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DESK_H__ #define __AGS_DESK_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DESK (ags_desk_get_type()) #define AGS_DESK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DESK, AgsDesk)) #define AGS_DESK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DESK, AgsDeskClass)) #define AGS_IS_DESK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DESK)) #define AGS_IS_DESK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DESK)) #define AGS_DESK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_DESK, AgsDeskClass)) typedef struct _AgsDesk AgsDesk; typedef struct _AgsDeskClass AgsDeskClass; struct _AgsDesk { AgsMachine machine; gchar *name; gchar *xml_type; GtkVBox *vbox; AgsDeskInputPad *left_pad; GtkVBox *console; GtkButton *move_left; GtkScale *balance; GtkButton *move_right; AgsDeskInputPad *right_pad; GtkFileChooserWidget *file_chooser; }; struct _AgsDeskClass { AgsMachineClass machine; }; GType ags_desk_get_type(void); AgsDesk* ags_desk_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_DESK_H__*/ gsequencer-3.1.3/ags/X/machine/ags_matrix_callbacks.h0000644000175000017500000000405313607210263017475 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MATRIX_CALLBACKS_H__ #define __AGS_MATRIX_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_matrix_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsMatrix *matrix); /* controls */ void ags_matrix_index_callback(GtkWidget *widget, AgsMatrix *matrix); gboolean ags_matrix_drawing_area_configure_callback(GtkWidget *widget, GdkEventConfigure *event, AgsMatrix *matrix); gboolean ags_matrix_drawing_area_expose_callback(GtkWidget *widget, GdkEventExpose *event, AgsMatrix *matrix); gboolean ags_matrix_drawing_area_button_press_callback(GtkWidget *widget, GdkEventButton *event, AgsMatrix *matrix); void ags_matrix_adjustment_value_changed_callback(GtkWidget *widget, AgsMatrix *matrix); void ags_matrix_bpm_callback(GtkWidget *spin_button, AgsMatrix *matrix); void ags_matrix_length_spin_callback(GtkWidget *spin_button, AgsMatrix *matrix); void ags_matrix_loop_button_callback(GtkWidget *button, AgsMatrix *matrix); /* forwarded callbacks */ void ags_matrix_stop_callback(AgsMatrix *matrix, GList *recall_id, gint sound_scope, gpointer data); G_END_DECLS #endif /*__AGS_MATRIX_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_callbacks.c0000644000175000017500000002603313607210263017776 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include void ags_ffplayer_open_dialog_response_callback(GtkWidget *widget, gint response, AgsMachine *machine); void ags_ffplayer_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsFFPlayer *ffplayer) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_FFPLAYER)->counter); g_object_set(AGS_MACHINE(ffplayer), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_FFPLAYER); g_free(str); } void ags_ffplayer_destroy_callback(GtkWidget *widget, AgsFFPlayer *ffplayer) { if(ffplayer->open_dialog != NULL){ gtk_widget_destroy(ffplayer->open_dialog); } } void ags_ffplayer_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsFFPlayer *ffplayer) { GtkWidget *widget; GtkStyleContext *ffplayer_style_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; double semi_key_height; guint bitmap; guint x[2]; guint i, i_stop, j, j0; GValue value = {0,}; widget = (GtkWidget *) ffplayer->drawing_area; gtk_widget_get_allocation(ffplayer->drawing_area, &allocation); /* style context */ ffplayer_style_context = gtk_widget_get_style_context(GTK_WIDGET(ffplayer->drawing_area)); gtk_style_context_get_property(ffplayer_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(ffplayer_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); semi_key_height = 2.0 / 3.0 * (double) ffplayer->control_height; bitmap = 0x52a52a; // description of the keyboard j = (guint) ceil(gtk_adjustment_get_value(ffplayer->hadjustment) / (double) ffplayer->control_width); j = j % 12; x[0] = (guint) round(gtk_adjustment_get_value(ffplayer->hadjustment)) % ffplayer->control_width; if(x[0] != 0){ x[0] = ffplayer->control_width - x[0]; } x[1] = ((guint) allocation.width - x[0]) % ffplayer->control_width; i_stop = (allocation.width - x[0] - x[1]) / ffplayer->control_width; /* clear with background color */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, 0.0, (double) allocation.width, (double) allocation.height); cairo_fill(cr); /* draw piano */ cairo_set_line_width(cr, 1.0); cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); if(x[0] != 0){ j0 = (j != 0) ? j -1: 11; if(((1 << j0) & bitmap) != 0){ cairo_rectangle(cr, 0.0, 0.0, x[0], (double) semi_key_height); cairo_fill(cr); if(x[0] > ffplayer->control_width / 2){ cairo_move_to(cr, (double) (x[0] - ffplayer->control_width / 2), semi_key_height); cairo_line_to(cr, (double) (x[0] - ffplayer->control_width / 2), (double) ffplayer->control_height); cairo_stroke(cr); } cairo_move_to(cr, 0.0, ffplayer->control_height); cairo_line_to(cr, (double) x[0], ffplayer->control_height); cairo_stroke(cr); }else{ if(((1 << (j0 + 1)) & bitmap) == 0){ cairo_move_to(cr, (double) x[0], 0.0); cairo_line_to(cr, (double) x[0], ffplayer->control_height); cairo_stroke(cr); } cairo_move_to(cr, 0.0, ffplayer->control_height); cairo_line_to(cr, (double) x[0], ffplayer->control_height); cairo_stroke(cr); } } for(i = 0; i < i_stop; i++){ if(((1 << j) & bitmap) != 0){ // draw semi tone key cairo_rectangle(cr, (double) (i * ffplayer->control_width + x[0]), 0.0, (double) ffplayer->control_width, semi_key_height); cairo_fill(cr); cairo_move_to(cr, (double) (i * ffplayer->control_width + x[0] + ffplayer->control_width / 2), semi_key_height); cairo_line_to(cr, (double) (i * ffplayer->control_width + x[0] + ffplayer->control_width / 2), ffplayer->control_height); cairo_stroke(cr); cairo_move_to(cr, (double) (i * ffplayer->control_width + x[0]), ffplayer->control_height); cairo_line_to(cr, (double) (i * ffplayer->control_width + x[0] + ffplayer->control_width), ffplayer->control_height); cairo_stroke(cr); }else{ // no semi tone key if(((1 << (j + 1)) & bitmap) == 0){ cairo_move_to(cr, (double) (i * ffplayer->control_width + x[0] + ffplayer->control_width), 0.0); cairo_line_to(cr, (double) (i * ffplayer->control_width + x[0] + ffplayer->control_width), ffplayer->control_height); cairo_stroke(cr); } cairo_move_to(cr, (double) (i * ffplayer->control_width + x[0]), ffplayer->control_height); cairo_line_to(cr, (double) (i * ffplayer->control_width + x[0] + ffplayer->control_width), ffplayer->control_height); cairo_stroke(cr); } if(j == 11) j = 0; else j++; } if(x[1] != 0){ j0 = j; if(((1 << j0) & bitmap) != 0){ cairo_rectangle(cr, (double) (allocation.width - x[1]), 0.0, (double) x[1], semi_key_height); cairo_fill(cr); if(x[1] > ffplayer->control_width / 2){ cairo_move_to(cr, (double) (allocation.width - x[1] + ffplayer->control_width / 2), semi_key_height); cairo_line_to(cr, (double) (allocation.width - x[1] + ffplayer->control_width / 2), ffplayer->control_height); cairo_stroke(cr); } cairo_move_to(cr, (double) (allocation.width - x[1]), ffplayer->control_height); cairo_line_to(cr, (double) allocation.width, ffplayer->control_height); cairo_stroke(cr); }else{ cairo_move_to(cr, (double) (allocation.width - x[1]), ffplayer->control_height); cairo_line_to(cr, (double) allocation.width, ffplayer->control_height); cairo_stroke(cr); } } g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); // cairo_surface_mark_dirty(cairo_get_target(cr)); } void ags_ffplayer_open_clicked_callback(GtkWidget *widget, AgsFFPlayer *ffplayer) { GtkFileChooserDialog *file_chooser; file_chooser = ags_machine_file_chooser_dialog_new(AGS_MACHINE(ffplayer)); gtk_file_chooser_add_shortcut_folder_uri(GTK_FILE_CHOOSER(file_chooser), "file:///usr/share/sounds/sf2", NULL); ffplayer->open_dialog = (GtkWidget *) file_chooser; gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), FALSE); g_signal_connect((GObject *) file_chooser, "response", G_CALLBACK(ags_ffplayer_open_dialog_response_callback), AGS_MACHINE(ffplayer)); gtk_widget_show_all((GtkWidget *) file_chooser); } void ags_ffplayer_open_dialog_response_callback(GtkWidget *widget, gint response, AgsMachine *machine) { AgsFFPlayer *ffplayer; ffplayer = AGS_FFPLAYER(machine); if(response == GTK_RESPONSE_ACCEPT){ gchar *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); ags_ffplayer_open_filename(ffplayer, filename); } ffplayer->open_dialog = NULL; gtk_widget_destroy(widget); gtk_combo_box_set_active(GTK_COMBO_BOX(ffplayer->preset), 0); } void ags_ffplayer_preset_changed_callback(GtkComboBox *preset, AgsFFPlayer *ffplayer) { AgsAudioContainer *audio_container; gint position; if((AGS_FFPLAYER_NO_LOAD & (ffplayer->flags)) != 0 || ffplayer->audio_container == NULL|| ffplayer->audio_container->sound_container == NULL){ return; } audio_container = ffplayer->audio_container; /* reset */ ags_sound_container_level_up(AGS_SOUND_CONTAINER(audio_container->sound_container), 3); /* load presets */ position = gtk_combo_box_get_active(GTK_COMBO_BOX(ffplayer->preset)); ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(audio_container->sound_container), position); AGS_IPATCH(audio_container->sound_container)->nesting_level += 1; /* select first instrument */ ags_ffplayer_load_instrument(ffplayer); gtk_combo_box_set_active(GTK_COMBO_BOX(ffplayer->instrument), 0); } void ags_ffplayer_instrument_changed_callback(GtkComboBox *instrument, AgsFFPlayer *ffplayer) { AgsWindow *window; AgsAudio *audio; AgsAudioContainer *audio_container; AgsOpenSf2Instrument *open_sf2_instrument; AgsApplicationContext *application_context; gint position; if((AGS_FFPLAYER_NO_LOAD & (ffplayer->flags)) != 0 || ffplayer->audio_container == NULL|| ffplayer->audio_container->sound_container == NULL){ return; } application_context = ags_application_context_get_instance(); window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) ffplayer); audio = AGS_MACHINE(ffplayer)->audio; /* */ audio_container = ffplayer->audio_container; /* reset */ ags_sound_container_level_up(AGS_SOUND_CONTAINER(audio_container->sound_container), 3); /* load presets */ position = gtk_combo_box_get_active(GTK_COMBO_BOX(ffplayer->preset)); if(position == -1){ position = 0; } ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(audio_container->sound_container), position); AGS_IPATCH(audio_container->sound_container)->nesting_level += 1; /* load instrument */ position = gtk_combo_box_get_active(GTK_COMBO_BOX(ffplayer->instrument)); if(position == -1){ position = 0; } ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(audio_container->sound_container), position); AGS_IPATCH(audio_container->sound_container)->nesting_level += 1; /* open sf2 instrument */ open_sf2_instrument = ags_open_sf2_instrument_new(audio, AGS_IPATCH(audio_container->sound_container), NULL, NULL, NULL, 0); /* append task */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) open_sf2_instrument); } gboolean ags_ffplayer_drawing_area_button_press_callback(GtkWidget *widget, AgsFFPlayer *ffplayer) { return(FALSE); } void ags_ffplayer_hscrollbar_value_changed(GtkAdjustment *adjustment, AgsFFPlayer *ffplayer) { gtk_widget_queue_draw(ffplayer); } gsequencer-3.1.3/ags/X/machine/ags_live_lv2_bridge_callbacks.h0000644000175000017500000000530613607210263021231 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LIVE_LV2_BRIDGE_CALLBACKS_H__ #define __AGS_LIVE_LV2_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_live_lv2_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_show_gui_callback(GtkMenuItem *item, AgsLiveLv2Bridge *live_lv2_bridge); gboolean ags_live_lv2_bridge_delete_event_callback(GtkWidget *widget, GdkEvent *event, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_lv2ui_cleanup_function(LV2UI_Handle handle); void ags_live_lv2_bridge_lv2ui_write_function(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t port_protocol, const void *buffer); void ags_live_lv2_bridge_program_changed_callback(GtkComboBox *combo_box, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_preset_changed_callback(GtkComboBox *combo_box, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_dial_changed_callback(GtkWidget *dial, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_vscale_changed_callback(GtkWidget *vscale, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_hscale_changed_callback(GtkWidget *hscale, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_spin_button_changed_callback(GtkWidget *spin_button, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_check_button_clicked_callback(GtkWidget *check_button, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_button_clicked_callback(GtkWidget *button, AgsLiveLv2Bridge *live_lv2_bridge); G_END_DECLS #endif /*__AGS_LIVE_LV2_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_output_pad_callbacks.h0000644000175000017500000000211713607210263021403 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_OUTPUT_PAD_CALLBACKS_H__ #define __AGS_DRUM_OUTPUT_PAD_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_DRUM_OUTPUT_PAD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_synth_callbacks.c0000644000175000017500000000350513607210263017332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_synth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsSynth *synth) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_SYNTH)->counter); g_object_set(AGS_MACHINE(synth), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_SYNTH); g_free(str); } void ags_synth_auto_update_callback(GtkToggleButton *toggle, AgsSynth *synth) { if(gtk_toggle_button_get_active(toggle)){ synth->flags |= AGS_SYNTH_AUTO_UPDATE; }else{ synth->flags &= (~AGS_SYNTH_AUTO_UPDATE); } } void ags_synth_update_callback(GtkButton *button, AgsSynth *synth) { ags_synth_update(synth); } void ags_synth_lower_callback(GtkSpinButton *spin_button, AgsSynth *synth) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/machine/ags_fm_oscillator.c0000644000175000017500000004202513607210263017023 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_fm_oscillator_class_init(AgsFMOscillatorClass *fm_oscillator); void ags_fm_oscillator_connectable_interface_init(AgsConnectableInterface *connectable); void ags_fm_oscillator_init(AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_connect(AgsConnectable *connectable); void ags_fm_oscillator_disconnect(AgsConnectable *connectable); /** * SECTION:ags_fm_oscillator * @short_description: fm oscillator * @title: AgsFMOscillator * @section_id: * @include: ags/X/machine/ags_fm_oscillator.h * * The #AgsFMOscillator is a composite widget to act as fm oscillator. */ enum{ CONTROL_CHANGED, LAST_SIGNAL, }; static gpointer ags_fm_oscillator_parent_class = NULL; static guint fm_oscillator_signals[LAST_SIGNAL]; static AgsConnectableInterface *ags_fm_oscillator_parent_connectable_interface; GType ags_fm_oscillator_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_fm_oscillator = 0; static const GTypeInfo ags_fm_oscillator_info = { sizeof(AgsFMOscillatorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_fm_oscillator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFMOscillator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_fm_oscillator_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_fm_oscillator_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_fm_oscillator = g_type_register_static(GTK_TYPE_FRAME, "AgsFMOscillator", &ags_fm_oscillator_info, 0); g_type_add_interface_static(ags_type_fm_oscillator, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_fm_oscillator); } return g_define_type_id__volatile; } void ags_fm_oscillator_class_init(AgsFMOscillatorClass *fm_oscillator) { GParamSpec *param_spec; ags_fm_oscillator_parent_class = g_type_class_peek_parent(fm_oscillator); /* signals */ /** * AgsFMOscillator::control-change: * @fm_oscillator: the #AgsFMOscillator * * The ::control-change signal notifies about controls modified. * * Since: 3.0.0 */ fm_oscillator_signals[CONTROL_CHANGED] = g_signal_new("control-changed", G_TYPE_FROM_CLASS(fm_oscillator), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFMOscillatorClass, control_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_fm_oscillator_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_fm_oscillator_connectable_parent_interface; ags_fm_oscillator_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_fm_oscillator_connect; connectable->disconnect = ags_fm_oscillator_disconnect; } void ags_fm_oscillator_init(AgsFMOscillator *fm_oscillator) { GtkTable *table; GtkHBox *hbox; GtkHBox *sync_box; GtkCellRenderer *cell_renderer; GtkListStore *model; GtkTreeIter iter; guint i; fm_oscillator->flags = 0; table = (GtkTable *) gtk_table_new(8, 4, FALSE); gtk_container_add((GtkContainer *) fm_oscillator, (GtkWidget *) table); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("wave")), 0, 1, 0, 1); /* wave */ fm_oscillator->wave = (GtkComboBox *) gtk_combo_box_text_new(); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->wave, 1, 2, 0, 1); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(fm_oscillator->wave), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(fm_oscillator->wave), cell_renderer, "text", 0, NULL); model = gtk_list_store_new(1, G_TYPE_STRING); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "sin", -1); /* gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "cos", -1); */ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("sawtooth"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("square"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("triangle"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("impulse"), -1); gtk_combo_box_set_model(fm_oscillator->wave, GTK_TREE_MODEL(model)); gtk_combo_box_set_active(fm_oscillator->wave, 0); /* other controls */ gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("attack")), 2, 3, 0, 1); fm_oscillator->attack = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_spin_button_set_value(fm_oscillator->attack, 0.0); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->attack, 3, 4, 0, 1); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("length")), 4, 5, 0, 1); fm_oscillator->frame_count = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_spin_button_set_value(fm_oscillator->frame_count, AGS_FM_OSCILLATOR_DEFAULT_FRAME_COUNT); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->frame_count, 5, 6, 0, 1); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("phase")), 0, 1, 1, 2); fm_oscillator->phase = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_spin_button_set_value(fm_oscillator->phase, 0.0); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->phase, 1, 2, 1, 2); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("frequency")), 2, 3, 1, 2); fm_oscillator->frequency = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 100000.0, 1.0); gtk_spin_button_set_digits(fm_oscillator->frequency, 3); gtk_spin_button_set_value(fm_oscillator->frequency, 27.5); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->frequency, 3, 4, 1, 2); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("volume")), 4, 5, 1, 2); fm_oscillator->volume = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.1); gtk_spin_button_set_digits(fm_oscillator->volume, 3); gtk_spin_button_set_value(fm_oscillator->volume, 0.2); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->volume, 5, 6, 1, 2); /* do sync */ fm_oscillator->do_sync = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("sync")); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->do_sync, 6, 7, 0, 1); hbox = (GtkHBox *) gtk_hbox_new(TRUE, 0); gtk_table_attach_defaults(table, (GtkWidget *) hbox, 6, 7, 1, 2); fm_oscillator->sync_point_count = AGS_FM_OSCILLATOR_DEFAULT_SYNC_POINT_COUNT; fm_oscillator->sync_point = (GtkSpinButton **) malloc(2 * fm_oscillator->sync_point_count * sizeof(GtkSpinButton *)); for(i = 0; i < fm_oscillator->sync_point_count; i++){ sync_box = (GtkHBox *) gtk_hbox_new(TRUE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) sync_box, FALSE, FALSE, 0); fm_oscillator->sync_point[2 * i] = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_box_pack_start((GtkBox *) sync_box, (GtkWidget *) fm_oscillator->sync_point[2 * i], FALSE, FALSE, 0); fm_oscillator->sync_point[2 * i + 1] = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_box_pack_start((GtkBox *) sync_box, (GtkWidget *) fm_oscillator->sync_point[2 * i + 1], FALSE, FALSE, 0); } /* LFO wave */ gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("LFO wave")), 0, 1, 2, 3); fm_oscillator->fm_lfo_wave = (GtkComboBox *) gtk_combo_box_text_new(); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->fm_lfo_wave, 1, 2, 2, 3); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(fm_oscillator->fm_lfo_wave), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(fm_oscillator->fm_lfo_wave), cell_renderer, "text", 0, NULL); model = gtk_list_store_new(1, G_TYPE_STRING); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "sin", -1); /* gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "cos", -1); */ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("sawtooth"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("square"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("triangle"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("impulse"), -1); gtk_combo_box_set_model(fm_oscillator->fm_lfo_wave, GTK_TREE_MODEL(model)); gtk_combo_box_set_active(fm_oscillator->fm_lfo_wave, 0); /* LFO controls */ gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("LFO frequency")), 2, 3, 2, 3); fm_oscillator->fm_lfo_frequency = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 24.0, 1.0); gtk_spin_button_set_digits(fm_oscillator->fm_lfo_frequency, 3); gtk_spin_button_set_value(fm_oscillator->fm_lfo_frequency, 12.0); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->fm_lfo_frequency, 3, 4, 2, 3); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("LFO depth")), 4, 5, 2, 3); fm_oscillator->fm_lfo_depth = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.01); gtk_spin_button_set_digits(fm_oscillator->fm_lfo_depth, 3); gtk_spin_button_set_value(fm_oscillator->fm_lfo_depth, 1.0); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->fm_lfo_depth, 5, 6, 2, 3); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("LFO tuning")), 2, 3, 3, 4); fm_oscillator->fm_tuning = (GtkSpinButton *) gtk_spin_button_new_with_range(-96.0, 96.0, 0.01); gtk_spin_button_set_digits(fm_oscillator->fm_tuning, 2); gtk_spin_button_set_value(fm_oscillator->fm_tuning, 0.0); gtk_table_attach_defaults(table, (GtkWidget *) fm_oscillator->fm_tuning, 3, 4, 3, 4); } void ags_fm_oscillator_connect(AgsConnectable *connectable) { AgsFMOscillator *fm_oscillator; guint i; fm_oscillator = AGS_FM_OSCILLATOR(connectable); if((AGS_FM_OSCILLATOR_CONNECTED & (fm_oscillator->flags)) != 0){ return; } fm_oscillator->flags |= AGS_FM_OSCILLATOR_CONNECTED; g_signal_connect(G_OBJECT(fm_oscillator->wave), "changed", G_CALLBACK(ags_fm_oscillator_wave_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->attack), "value-changed", G_CALLBACK(ags_fm_oscillator_attack_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->frame_count), "value-changed", G_CALLBACK(ags_fm_oscillator_frame_count_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->frequency), "value-changed", G_CALLBACK(ags_fm_oscillator_frequency_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->phase), "value-changed", G_CALLBACK(ags_fm_oscillator_phase_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->volume), "value-changed", G_CALLBACK(ags_fm_oscillator_volume_callback), fm_oscillator); for(i = 0; i < 2 * fm_oscillator->sync_point_count; i++){ g_signal_connect(G_OBJECT(fm_oscillator->sync_point[i]), "value-changed", G_CALLBACK(ags_fm_oscillator_sync_point_callback), fm_oscillator); } g_signal_connect(G_OBJECT(fm_oscillator->fm_lfo_wave), "changed", G_CALLBACK(ags_fm_oscillator_fm_lfo_wave_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->fm_lfo_frequency), "value-changed", G_CALLBACK(ags_fm_oscillator_fm_lfo_frequency_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->fm_lfo_depth), "value-changed", G_CALLBACK(ags_fm_oscillator_fm_lfo_depth_callback), fm_oscillator); g_signal_connect(G_OBJECT(fm_oscillator->fm_tuning), "value-changed", G_CALLBACK(ags_fm_oscillator_fm_tuning_callback), fm_oscillator); } void ags_fm_oscillator_disconnect(AgsConnectable *connectable) { AgsFMOscillator *fm_oscillator; guint i; fm_oscillator = AGS_FM_OSCILLATOR(connectable); if((AGS_FM_OSCILLATOR_CONNECTED & (fm_oscillator->flags)) == 0){ return; } fm_oscillator->flags &= (~AGS_FM_OSCILLATOR_CONNECTED); g_object_disconnect((GObject *) fm_oscillator->wave, "any_signal::changed", G_CALLBACK(ags_fm_oscillator_wave_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->frame_count, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_frame_count_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->attack, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_attack_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->frequency, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_frequency_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->phase, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_phase_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->volume, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_volume_callback), (gpointer) fm_oscillator, NULL); for(i = 0; i < 2 * fm_oscillator->sync_point_count; i++){ g_object_disconnect((GObject *) fm_oscillator->sync_point[i], "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_sync_point_callback), (gpointer) fm_oscillator, NULL); } g_object_disconnect((GObject *) fm_oscillator->fm_lfo_wave, "any_signal::changed", G_CALLBACK(ags_fm_oscillator_fm_lfo_wave_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->fm_lfo_frequency, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_fm_lfo_frequency_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->fm_lfo_depth, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_fm_lfo_depth_callback), (gpointer) fm_oscillator, NULL); g_object_disconnect((GObject *) fm_oscillator->fm_tuning, "any_signal::value-changed", G_CALLBACK(ags_fm_oscillator_fm_tuning_callback), (gpointer) fm_oscillator, NULL); } /** * ags_fm_oscillator_control_changed: * @fm_oscillator: the #AgsFMOscillator * * The control changed event notifies about changed controls. * * Since: 3.0.0 */ void ags_fm_oscillator_control_changed(AgsFMOscillator *fm_oscillator) { g_return_if_fail(AGS_IS_FM_OSCILLATOR(fm_oscillator)); g_object_ref((GObject *) fm_oscillator); g_signal_emit(G_OBJECT(fm_oscillator), fm_oscillator_signals[CONTROL_CHANGED], 0); g_object_unref((GObject *) fm_oscillator); } /** * ags_fm_oscillator_new: * * Create a new instance of #AgsFMOscillator * * Returns: the new #AgsFMOscillator * * Since: 3.0.0 */ AgsFMOscillator* ags_fm_oscillator_new() { AgsFMOscillator *fm_oscillator; fm_oscillator = (AgsFMOscillator *) g_object_new(AGS_TYPE_FM_OSCILLATOR, NULL); return(fm_oscillator); } gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler_file.c0000644000175000017500000001776113607210263020030 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_pitch_sampler_file_class_init(AgsPitchSamplerFileClass *pitch_sampler_file); void ags_pitch_sampler_file_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pitch_sampler_file_init(AgsPitchSamplerFile *pitch_sampler_file); void ags_pitch_sampler_file_connect(AgsConnectable *connectable); void ags_pitch_sampler_file_disconnect(AgsConnectable *connectable); /** * SECTION:ags_pitch_sampler_file * @short_description: pitch sampler file * @title: AgsPitchSamplerFile * @section_id: * @include: ags/X/machine/ags_pitch_sampler_file.h * * The #AgsPitchSamplerFile is a composite widget to act as pitch sampler file. */ enum{ CONTROL_CHANGED, LAST_SIGNAL, }; static gpointer ags_pitch_sampler_file_parent_class = NULL; static guint pitch_sampler_file_signals[LAST_SIGNAL]; static AgsConnectableInterface *ags_pitch_sampler_file_parent_connectable_interface; GType ags_pitch_sampler_file_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pitch_sampler_file = 0; static const GTypeInfo ags_pitch_sampler_file_info = { sizeof(AgsPitchSamplerFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pitch_sampler_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPitchSamplerFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pitch_sampler_file_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pitch_sampler_file_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pitch_sampler_file = g_type_register_static(GTK_TYPE_VBOX, "AgsPitchSamplerFile", &ags_pitch_sampler_file_info, 0); g_type_add_interface_static(ags_type_pitch_sampler_file, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pitch_sampler_file); } return g_define_type_id__volatile; } void ags_pitch_sampler_file_class_init(AgsPitchSamplerFileClass *pitch_sampler_file) { GParamSpec *param_spec; ags_pitch_sampler_file_parent_class = g_type_class_peek_parent(pitch_sampler_file); /* signals */ /** * AgsPitchSamplerFile::control-change: * @pitch_sampler_file: the #AgsPitchSamplerFile * * The ::control-change signal notifies about controls modified. * * Since: 3.0.0 */ pitch_sampler_file_signals[CONTROL_CHANGED] = g_signal_new("control-changed", G_TYPE_FROM_CLASS(pitch_sampler_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPitchSamplerFileClass, control_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_pitch_sampler_file_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_pitch_sampler_file_connectable_parent_interface; ags_pitch_sampler_file_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_pitch_sampler_file_connect; connectable->disconnect = ags_pitch_sampler_file_disconnect; } void ags_pitch_sampler_file_init(AgsPitchSamplerFile *pitch_sampler_file) { GtkTable *table; GtkHBox *filename_hbox; GtkLabel *label; table = (GtkTable *) gtk_table_new(2, 4, FALSE); gtk_box_pack_start((GtkBox *) pitch_sampler_file, (GtkWidget *) table, FALSE, FALSE, 0); /* filename */ filename_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, (GtkWidget *) filename_hbox, 0, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler_file->filename = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) pitch_sampler_file->filename, FALSE, FALSE, 0); /* */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("frequency"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler_file->freq = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", "440.0", "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(pitch_sampler_file->freq), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("base key"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler_file->base_key = g_object_new(GTK_TYPE_LABEL, "label", "48", "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(pitch_sampler_file->base_key), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* loop start */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("loop start"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler_file->loop_start = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", "0", "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(pitch_sampler_file->loop_start), 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0); /* loop end */ label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("loop end"), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0); pitch_sampler_file->loop_end = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", "0", "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(pitch_sampler_file->loop_end), 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0); } void ags_pitch_sampler_file_connect(AgsConnectable *connectable) { AgsPitchSamplerFile *pitch_sampler_file; guint i; pitch_sampler_file = AGS_PITCH_SAMPLER_FILE(connectable); if((AGS_PITCH_SAMPLER_FILE_CONNECTED & (pitch_sampler_file->flags)) != 0){ return; } pitch_sampler_file->flags |= AGS_PITCH_SAMPLER_FILE_CONNECTED; } void ags_pitch_sampler_file_disconnect(AgsConnectable *connectable) { AgsPitchSamplerFile *pitch_sampler_file; guint i; pitch_sampler_file = AGS_PITCH_SAMPLER_FILE(connectable); if((AGS_PITCH_SAMPLER_FILE_CONNECTED & (pitch_sampler_file->flags)) == 0){ return; } pitch_sampler_file->flags &= (~AGS_PITCH_SAMPLER_FILE_CONNECTED); } /** * ags_pitch_sampler_file_new: * * Create a new instance of #AgsPitchSamplerFile * * Returns: the new #AgsPitchSamplerFile * * Since: 3.0.0 */ AgsPitchSamplerFile* ags_pitch_sampler_file_new() { AgsPitchSamplerFile *pitch_sampler_file; pitch_sampler_file = (AgsPitchSamplerFile *) g_object_new(AGS_TYPE_PITCH_SAMPLER_FILE, NULL); return(pitch_sampler_file); } gsequencer-3.1.3/ags/X/machine/ags_drum_input_pad.h0000644000175000017500000000451313607210263017205 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_INPUT_PAD_H__ #define __AGS_DRUM_INPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DRUM_INPUT_PAD (ags_drum_input_pad_get_type()) #define AGS_DRUM_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DRUM_INPUT_PAD, AgsDrumInputPad)) #define AGS_DRUM_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DRUM_INPUT_PAD, AgsDrumInputPadClass)) #define AGS_IS_DRUM_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DRUM_INPUT_PAD)) #define AGS_IS_DRUM_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DRUM_INPUT_PAD)) #define AGS_DRUM_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DRUM_INPUT_PAD, AgsDrumInputPadClass)) typedef struct _AgsDrumInputPad AgsDrumInputPad; typedef struct _AgsDrumInputPadClass AgsDrumInputPadClass; typedef enum{ AGS_DRUM_INPUT_PAD_OPEN_PLAY_DONE = 1, }AgsDrumInputPadFlags; struct _AgsDrumInputPad { AgsPad pad; guint flags; gchar *name; gchar *xml_type; GtkButton *open; GtkToggleButton *play; GtkToggleButton *edit; GList *pad_open_recalls; guint pad_open_play_ref; GtkFileChooserDialog *file_chooser; guint pad_play_ref; }; struct _AgsDrumInputPadClass { AgsPadClass pad; }; GType ags_drum_input_pad_get_type(); AgsDrumInputPad* ags_drum_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_DRUM_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_lv2_bridge.c0000644000175000017500000014421713607210263016213 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_lv2_bridge_class_init(AgsLv2BridgeClass *lv2_bridge); void ags_lv2_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_lv2_bridge_init(AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_bridge_finalize(GObject *gobject); void ags_lv2_bridge_connect(AgsConnectable *connectable); void ags_lv2_bridge_disconnect(AgsConnectable *connectable); void ags_lv2_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_lv2_bridge_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data); void ags_lv2_bridge_map_recall(AgsMachine *machine); /** * SECTION:ags_lv2_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsLv2Bridge * @section_id: * @include: ags/X/ags_lv2_bridge.h * * #AgsLv2Bridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_URI, PROP_INDEX, PROP_HAS_MIDI, PROP_HAS_GUI, PROP_GUI_FILENAME, PROP_GUI_URI, }; static gpointer ags_lv2_bridge_parent_class = NULL; static AgsConnectableInterface* ags_lv2_bridge_parent_connectable_interface; GHashTable *ags_lv2_bridge_lv2ui_handle = NULL; GHashTable *ags_lv2_bridge_lv2ui_idle = NULL; GType ags_lv2_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_bridge = 0; static const GTypeInfo ags_lv2_bridge_info = { sizeof(AgsLv2BridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLv2Bridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_lv2_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_lv2_bridge = g_type_register_static(AGS_TYPE_MACHINE, "AgsLv2Bridge", &ags_lv2_bridge_info, 0); g_type_add_interface_static(ags_type_lv2_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_bridge); } return g_define_type_id__volatile; } void ags_lv2_bridge_class_init(AgsLv2BridgeClass *lv2_bridge) { AgsMachineClass *machine; GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_bridge_parent_class = g_type_class_peek_parent(lv2_bridge); /* GObjectClass */ gobject = G_OBJECT_CLASS(lv2_bridge); gobject->set_property = ags_lv2_bridge_set_property; gobject->get_property = ags_lv2_bridge_get_property; gobject->finalize = ags_lv2_bridge_finalize; /* properties */ /** * AgsRecallLv2:filename: * * The plugin's filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the object file"), i18n_pspec("The filename as string of object file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecallLv2:effect: * * The effect's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsRecallLv2:uri: * * The uri's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("uri", i18n_pspec("the uri"), i18n_pspec("The uri's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URI, param_spec); /** * AgsRecallLv2:index: * * The uri's index. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("index", i18n_pspec("index of uri"), i18n_pspec("The numerical index of uri"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX, param_spec); /** * AgsRecallLv2:has-midi: * * If has-midi is set to %TRUE appropriate flag is set * to audio in order to become a sequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("has-midi", i18n_pspec("has-midi"), i18n_pspec("If effect has-midi"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_HAS_MIDI, param_spec); /** * AgsRecallLv2:has-gui: * * If has-gui is set to %TRUE 128 inputs are allocated and appropriate flag is set * to audio in order to become a sequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("has-gui", i18n_pspec("has-gui"), i18n_pspec("If effect has-gui"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_HAS_GUI, param_spec); /** * AgsRecallLv2:gui-filename: * * The plugin's GUI filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("gui-filename", i18n_pspec("the GUI object file"), i18n_pspec("The filename as string of GUI object file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GUI_FILENAME, param_spec); /** * AgsRecallLv2:gui-uri: * * The GUI's uri name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("gui-uri", i18n_pspec("the gui-uri"), i18n_pspec("The gui-uri's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GUI_URI, param_spec); /* AgsMachine */ machine = (AgsMachineClass *) lv2_bridge; machine->map_recall = ags_lv2_bridge_map_recall; } void ags_lv2_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_lv2_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_lv2_bridge_connect; connectable->disconnect = ags_lv2_bridge_disconnect; } void ags_lv2_bridge_init(AgsLv2Bridge *lv2_bridge) { GtkTable *table; GtkImageMenuItem *item; AgsAudio *audio; g_signal_connect_after((GObject *) lv2_bridge, "parent-set", G_CALLBACK(ags_lv2_bridge_parent_set_callback), (gpointer) lv2_bridge); if(ags_lv2_bridge_lv2ui_handle == NULL){ ags_lv2_bridge_lv2ui_handle = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } if(ags_lv2_bridge_lv2ui_idle == NULL){ ags_lv2_bridge_lv2ui_idle = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } audio = AGS_MACHINE(lv2_bridge)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC)); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, NULL); g_signal_connect_after(G_OBJECT(lv2_bridge), "resize-audio-channels", G_CALLBACK(ags_lv2_bridge_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(lv2_bridge), "resize-pads", G_CALLBACK(ags_lv2_bridge_resize_pads), NULL); lv2_bridge->flags = 0; lv2_bridge->name = NULL; lv2_bridge->version = AGS_LV2_BRIDGE_DEFAULT_VERSION; lv2_bridge->build_id = AGS_LV2_BRIDGE_DEFAULT_BUILD_ID; lv2_bridge->xml_type = "ags-lv2-bridge"; lv2_bridge->mapped_output_pad = 0; lv2_bridge->mapped_input_pad = 0; lv2_bridge->filename = NULL; lv2_bridge->effect = NULL; lv2_bridge->uri = NULL; lv2_bridge->uri_index = 0; lv2_bridge->has_midi = FALSE; lv2_bridge->lv2_plugin = NULL; lv2_bridge->lv2_descriptor = NULL; lv2_bridge->lv2_handle = NULL; lv2_bridge->port_value = NULL; lv2_bridge->has_gui = FALSE; lv2_bridge->gui_filename = NULL; lv2_bridge->gui_uri = NULL; lv2_bridge->lv2ui_plugin = NULL; lv2_bridge->ui_descriptor = NULL; lv2_bridge->ui_feature = (LV2_Feature **) malloc(3 * sizeof(LV2_Feature *)); lv2_bridge->ui_feature[0] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); lv2_bridge->ui_feature[0]->data = NULL; lv2_bridge->ui_feature[1] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); lv2_bridge->ui_feature[1]->data = NULL; lv2_bridge->ui_feature[2] = NULL; lv2_bridge->ui_handle = NULL; /**/ lv2_bridge->vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) gtk_bin_get_child((GtkBin *) lv2_bridge), (GtkWidget *) lv2_bridge->vbox); lv2_bridge->program = NULL; lv2_bridge->preset = NULL; /* effect bridge */ AGS_MACHINE(lv2_bridge)->bridge = (GtkContainer *) ags_effect_bridge_new(audio); gtk_box_pack_start((GtkBox *) lv2_bridge->vbox, (GtkWidget *) AGS_MACHINE(lv2_bridge)->bridge, FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge), (GtkWidget *) table, FALSE, FALSE, 0); AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge)->bulk_input = (GtkWidget *) ags_effect_bulk_new(audio, AGS_TYPE_INPUT); AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge)->bulk_input)->flags |= (AGS_EFFECT_BULK_HIDE_BUTTONS | AGS_EFFECT_BULK_HIDE_ENTRIES | AGS_EFFECT_BULK_SHOW_LABELS); gtk_table_attach(table, (GtkWidget *) AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge)->bulk_input, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* lv2 menu */ item = (GtkImageMenuItem *) gtk_image_menu_item_new_with_label("Lv2"); gtk_menu_shell_append((GtkMenuShell *) AGS_MACHINE(lv2_bridge)->popup, (GtkWidget *) item); gtk_widget_show((GtkWidget *) item); lv2_bridge->lv2_menu = (GtkMenu *) gtk_menu_new(); gtk_menu_item_set_submenu((GtkMenuItem *) item, (GtkWidget *) lv2_bridge->lv2_menu); item = (GtkImageMenuItem *) gtk_image_menu_item_new_with_label(i18n("show GUI")); gtk_menu_shell_append((GtkMenuShell *) lv2_bridge->lv2_menu, (GtkWidget *) item); gtk_widget_show_all((GtkWidget *) lv2_bridge->lv2_menu); /* plugin widget */ lv2_bridge->lv2_gui = NULL; lv2_bridge->ui_widget = NULL; lv2_bridge->lv2_window = NULL; } void ags_lv2_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2Bridge *lv2_bridge; lv2_bridge = AGS_LV2_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(filename == lv2_bridge->filename){ return; } if(lv2_bridge->filename != NULL){ g_free(lv2_bridge->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) lv2_bridge); ags_window_show_error(window, g_strdup_printf("Plugin file not present %s", filename)); } } lv2_bridge->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == lv2_bridge->effect){ return; } if(lv2_bridge->effect != NULL){ g_free(lv2_bridge->effect); } lv2_bridge->effect = g_strdup(effect); } break; case PROP_URI: { gchar *uri; uri = g_value_get_string(value); if(uri == lv2_bridge->uri){ return; } if(lv2_bridge->uri != NULL){ g_free(lv2_bridge->uri); } lv2_bridge->uri = g_strdup(uri); } break; case PROP_INDEX: { unsigned long uri_index; uri_index = g_value_get_ulong(value); if(uri_index == lv2_bridge->uri_index){ return; } lv2_bridge->uri_index = uri_index; } break; case PROP_HAS_MIDI: { gboolean has_midi; has_midi = g_value_get_boolean(value); if(lv2_bridge->has_midi == has_midi){ return; } lv2_bridge->has_midi = has_midi; } break; case PROP_HAS_GUI: { GtkWindow *window; gboolean has_gui; has_gui = g_value_get_boolean(value); if(lv2_bridge->has_gui == has_gui){ return; } lv2_bridge->has_gui = has_gui; } break; case PROP_GUI_FILENAME: { GtkWindow *window; gchar *gui_filename; gui_filename = g_value_get_string(value); if(lv2_bridge->gui_filename == gui_filename){ return; } lv2_bridge->gui_filename = g_strdup(gui_filename); } break; case PROP_GUI_URI: { gchar *gui_uri; gui_uri = g_value_get_string(value); if(gui_uri == lv2_bridge->gui_uri){ return; } if(lv2_bridge->gui_uri != NULL){ g_free(lv2_bridge->gui_uri); } lv2_bridge->gui_uri = g_strdup(gui_uri); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2Bridge *lv2_bridge; lv2_bridge = AGS_LV2_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, lv2_bridge->filename); } break; case PROP_EFFECT: { g_value_set_string(value, lv2_bridge->effect); } break; case PROP_URI: { g_value_set_string(value, lv2_bridge->uri); } break; case PROP_INDEX: { g_value_set_ulong(value, lv2_bridge->uri_index); } break; case PROP_HAS_MIDI: { g_value_set_boolean(value, lv2_bridge->has_midi); } break; case PROP_HAS_GUI: { g_value_set_boolean(value, lv2_bridge->has_gui); } break; case PROP_GUI_FILENAME: { g_value_set_string(value, lv2_bridge->gui_filename); } break; case PROP_GUI_URI: { g_value_set_string(value, lv2_bridge->gui_uri); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_bridge_finalize(GObject *gobject) { AgsLv2Bridge *lv2_bridge; lv2_bridge = AGS_LV2_BRIDGE(gobject); /* lv2 plugin */ if(lv2_bridge->lv2_plugin != NULL){ g_object_unref(lv2_bridge->lv2_plugin); } /* lv2ui plugin */ if(lv2_bridge->lv2ui_plugin != NULL){ g_object_unref(lv2_bridge->lv2ui_plugin); } /* plugin widget */ if(lv2_bridge->ui_handle != NULL){ lv2_bridge->ui_descriptor->cleanup(lv2_bridge->ui_handle[0]); g_hash_table_remove(ags_lv2_bridge_lv2ui_handle, lv2_bridge->ui_handle); g_hash_table_remove(ags_lv2_bridge_lv2ui_idle, lv2_bridge->ui_handle); } if(lv2_bridge->lv2_window != NULL){ gtk_widget_destroy(lv2_bridge->lv2_window); } /* call parent */ G_OBJECT_CLASS(ags_lv2_bridge_parent_class)->finalize(gobject); } void ags_lv2_bridge_connect(AgsConnectable *connectable) { AgsLv2Bridge *lv2_bridge; AgsEffectBridge *effect_bridge; AgsBulkMember *bulk_member; GtkWidget *control; GList *list, *list_start; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_lv2_bridge_parent_connectable_interface->connect(connectable); lv2_bridge = AGS_LV2_BRIDGE(connectable); /* menu */ list = list_start = gtk_container_get_children((GtkContainer *) lv2_bridge->lv2_menu); g_signal_connect(G_OBJECT(list->data), "activate", G_CALLBACK(ags_lv2_bridge_show_gui_callback), lv2_bridge); g_list_free(list_start); /* program */ if(lv2_bridge->program != NULL){ g_signal_connect_after(G_OBJECT(lv2_bridge->program), "changed", G_CALLBACK(ags_lv2_bridge_program_changed_callback), lv2_bridge); } /* bulk member */ effect_bridge = AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge); list = list_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(effect_bridge->bulk_input)->table); while(list != NULL){ bulk_member = list->data; control = gtk_bin_get_child(GTK_BIN(bulk_member)); if(bulk_member->widget_type == AGS_TYPE_DIAL){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_lv2_bridge_dial_changed_callback), lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_VSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_lv2_bridge_vscale_changed_callback), lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_HSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_lv2_bridge_hscale_changed_callback), lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_SPIN_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_lv2_bridge_spin_button_changed_callback), lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_CHECK_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_lv2_bridge_check_button_clicked_callback), lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_TOGGLE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_lv2_bridge_toggle_button_clicked_callback), lv2_bridge); }else if(bulk_member->widget_type == GTK_TYPE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_lv2_bridge_button_clicked_callback), lv2_bridge); } list = list->next; } g_list_free(list_start); } void ags_lv2_bridge_disconnect(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_lv2_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsLv2Bridge *lv2_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint output_pads, input_pads; lv2_bridge = (AgsLv2Bridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, NULL); /* check available */ if(input_pads == 0 && output_pads == 0){ return; } g_object_get(audio, "output", &start_output, "input", &start_input, NULL); if(audio_channels > audio_channels_old){ /* AgsInput */ channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); if(first_recycling != NULL){ /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 1); ags_recycling_add_audio_signal(first_recycling, audio_signal); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); if(first_recycling != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION)); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_lv2_bridge_input_map_recall(lv2_bridge, audio_channels_old, 0); ags_lv2_bridge_output_map_recall(lv2_bridge, audio_channels_old, 0); } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_lv2_bridge_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data) { AgsLv2Bridge *lv2_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint audio_channels; gboolean grow; lv2_bridge = (AgsLv2Bridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, NULL); /* check available */ if(pads == pads_old || audio->audio_channels == 0){ return; } g_object_get(audio, "output", &start_output, "input", &start_input, NULL); if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ if(grow){ /* AgsInput */ nth_channel = ags_channel_pad_nth(start_input, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); if(first_recycling != NULL){ /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 1); ags_recycling_add_audio_signal(first_recycling, audio_signal); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_lv2_bridge_input_map_recall(lv2_bridge, 0, pads_old); } }else{ lv2_bridge->mapped_input_pad = pads; } }else{ if(grow){ /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); if(first_recycling != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(first_recycling != NULL){ g_object_unref(first_recycling); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_lv2_bridge_output_map_recall(lv2_bridge, 0, pads_old); } }else{ lv2_bridge->mapped_output_pad = pads; } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_lv2_bridge_map_recall(AgsMachine *machine) { AgsWindow *window; AgsLv2Bridge *lv2_bridge; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; AgsRouteLv2Audio *recall_route_lv2_audio; AgsRouteLv2AudioRun *recall_route_lv2_audio_run; GList *list; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); lv2_bridge = (AgsLv2Bridge *) machine; audio = machine->audio; /* ags-delay */ if((AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-route-lv2 */ ags_recall_factory_create(audio, NULL, NULL, "ags-route-lv2", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_ROUTE_LV2_AUDIO_RUN); if(play != NULL){ recall_route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_route_lv2_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_route_lv2_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); }else{ recall_route_lv2_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); } /* depending on destination */ ags_lv2_bridge_input_map_recall(lv2_bridge, 0, 0); /* add new controls */ ags_effect_bulk_add_effect((AgsEffectBulk *) AGS_EFFECT_BRIDGE(AGS_MACHINE(lv2_bridge)->bridge)->bulk_input, NULL, lv2_bridge->filename, lv2_bridge->effect); /* depending on destination */ ags_lv2_bridge_output_map_recall(lv2_bridge, 0, 0); /* call parent */ AGS_MACHINE_CLASS(ags_lv2_bridge_parent_class)->map_recall(machine); } void ags_lv2_bridge_input_map_recall(AgsLv2Bridge *lv2_bridge, guint audio_channel_start, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *current, *nth_current, *next_pad_current; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(lv2_bridge->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(lv2_bridge)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* source */ if((AGS_MACHINE_IS_SYNTHESIZER & (AGS_MACHINE(lv2_bridge)->flags)) != 0){ /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channel_start, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); nth_current = ags_channel_nth(start_input, audio_channel_start + input_pad_start * audio_channels); current = nth_current; next_pad_current = NULL; while(current != NULL){ AgsPort *port; GList *start_list, *list; /* play - use note length */ g_object_get(current, "play", &start_list, NULL); list = ags_recall_template_find_type(start_list, AGS_TYPE_ENVELOPE_CHANNEL); if(list != NULL){ GValue use_note_length_value = {0,}; g_value_init(&use_note_length_value, G_TYPE_BOOLEAN); g_value_set_boolean(&use_note_length_value, TRUE); g_object_get(list->data, "use-note-length", &port, NULL); ags_port_safe_write(port, &use_note_length_value); g_object_unref(port); g_value_unset(&use_note_length_value); } g_list_free_full(start_list, g_object_unref); /* recall - use note length */ g_object_get(current, "recall", &start_list, NULL); list = ags_recall_template_find_type(start_list, AGS_TYPE_ENVELOPE_CHANNEL); if(list != NULL){ GValue use_note_length_value = {0,}; g_value_init(&use_note_length_value, G_TYPE_BOOLEAN); g_value_set_boolean(&use_note_length_value, TRUE); g_object_get(list->data, "use-note-length", &port, NULL); ags_port_safe_write(port, &use_note_length_value); g_object_unref(port); g_value_unset(&use_note_length_value); } g_list_free_full(start_list, g_object_unref); /* iterate */ next_pad_current = ags_channel_next_pad(current); g_object_unref(current); current = next_pad_current; } if(next_pad_current != NULL){ g_object_unref(next_pad_current); } if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channel_start, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channel_start, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; current = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-feed */ ags_recall_factory_create(audio, NULL, NULL, "ags-feed", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(current, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } } } } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } lv2_bridge->mapped_input_pad = input_pads; } void ags_lv2_bridge_output_map_recall(AgsLv2Bridge *lv2_bridge, guint audio_channel_start, guint output_pad_start) { AgsAudio *audio; AgsChannel *input, *current; AgsDelayAudio *recall_delay_audio; AgsCountBeatsAudioRun *recall_count_beats_audio_run; guint output_pads, input_pads; guint audio_channels; if(lv2_bridge->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(lv2_bridge)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "output-pads", &output_pads, "audio-channels", &audio_channels, NULL); if((AGS_MACHINE_IS_SYNTHESIZER & (AGS_MACHINE(lv2_bridge)->flags)) != 0){ /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channel_start, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_REMAP), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channel_start, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_REMAP), 0); } /* */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channel_start, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } } lv2_bridge->mapped_output_pad = output_pads; } void ags_lv2_bridge_load_program(AgsLv2Bridge *lv2_bridge) { AgsLv2Plugin *lv2_plugin; LV2_Descriptor *plugin_descriptor; LV2_Programs_Interface *program_interface; /* retrieve lv2 plugin */ lv2_plugin = lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), lv2_bridge->filename, lv2_bridge->effect); g_object_ref(lv2_plugin); lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } plugin_descriptor = lv2_bridge->lv2_descriptor; if(plugin_descriptor != NULL && plugin_descriptor->extension_data != NULL && (program_interface = plugin_descriptor->extension_data(LV2_PROGRAMS__Interface)) != NULL){ GtkListStore *model; GtkTreeIter iter; LV2_Program_Descriptor *program_descriptor; uint32_t i; if(lv2_bridge->lv2_handle == NULL){ guint samplerate; guint buffer_size; g_object_get(AGS_MACHINE(lv2_bridge)->audio, "samplerate", &samplerate, "buffer-size", &buffer_size, NULL); lv2_bridge->lv2_handle = ags_base_plugin_instantiate((AgsBasePlugin *) lv2_plugin, samplerate, buffer_size); } if(lv2_bridge->port_value == NULL){ GList *start_plugin_port, *plugin_port; guint port_count; g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); if(port_count > 0){ lv2_bridge->port_value = (float *) malloc(port_count * sizeof(float)); } while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ plugin_descriptor->connect_port(lv2_bridge->lv2_handle[0], AGS_PLUGIN_PORT(plugin_port->data)->port_index, &(lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index])); } } /* iterate */ plugin_port = plugin_port->next; } g_list_free_full(start_plugin_port, g_object_unref); } if(lv2_bridge->program == NULL){ GtkHBox *hbox; GtkLabel *label; /* program */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) lv2_bridge->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_box_reorder_child(GTK_BOX(lv2_bridge->vbox), GTK_WIDGET(hbox), 0); label = (GtkLabel *) gtk_label_new(i18n("program")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); lv2_bridge->program = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) lv2_bridge->program, FALSE, FALSE, 0); if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(lv2_bridge)->flags)) != 0){ g_signal_connect_after(G_OBJECT(lv2_bridge->program), "changed", G_CALLBACK(ags_lv2_bridge_program_changed_callback), lv2_bridge); } model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_ULONG); gtk_combo_box_set_model(GTK_COMBO_BOX(lv2_bridge->program), GTK_TREE_MODEL(model)); }else{ model = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(lv2_bridge->program))); gtk_list_store_clear(GTK_LIST_STORE(model)); } for(i = 0; (program_descriptor = program_interface->get_program(lv2_bridge->lv2_handle[0], i)) != NULL; i++){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, program_descriptor->name, 1, program_descriptor->bank, 2, program_descriptor->program, -1); } } } void ags_lv2_bridge_load_preset(AgsLv2Bridge *lv2_bridge) { GtkHBox *hbox; GtkLabel *label; AgsLv2Plugin *lv2_plugin; GList *list; /* retrieve lv2 plugin */ lv2_plugin = lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), lv2_bridge->filename, lv2_bridge->effect); g_object_ref(lv2_plugin); lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } /* preset */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) lv2_bridge->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); gtk_box_reorder_child(GTK_BOX(lv2_bridge->vbox), GTK_WIDGET(hbox), 0); label = (GtkLabel *) gtk_label_new(i18n("preset")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); lv2_bridge->preset = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) lv2_bridge->preset, FALSE, FALSE, 0); /* preset */ list = lv2_plugin->preset; while(list != NULL){ if(AGS_LV2_PRESET(list->data)->preset_label != NULL){ gtk_combo_box_text_append_text(lv2_bridge->preset, AGS_LV2_PRESET(list->data)->preset_label); } list = list->next; } gtk_widget_show_all((GtkWidget *) hbox); /* connect preset */ g_signal_connect_after(G_OBJECT(lv2_bridge->preset), "changed", G_CALLBACK(ags_lv2_bridge_preset_changed_callback), lv2_bridge); } void ags_lv2_bridge_load_midi(AgsLv2Bridge *lv2_bridge) { //TODO:JK: implement me } void ags_lv2_bridge_load_gui(AgsLv2Bridge *lv2_bridge) { AgsLv2Plugin *lv2_plugin; AgsLv2uiPlugin *lv2ui_plugin; GList *list; /* retrieve lv2 plugin */ lv2_plugin = lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), lv2_bridge->filename, lv2_bridge->effect); g_object_ref(lv2_plugin); lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL || lv2_plugin->ui_uri == NULL){ return; } /* retrieve lv2ui plugin */ lv2ui_plugin = lv2_bridge->lv2ui_plugin; if(lv2ui_plugin == NULL){ list = ags_lv2ui_plugin_find_gui_uri(ags_lv2ui_manager_get_instance()->lv2ui_plugin, lv2_plugin->ui_uri); if(list == NULL){ return; } lv2ui_plugin = lv2_bridge->lv2ui_plugin = list->data; g_object_ref(lv2ui_plugin); lv2_bridge->ui_descriptor = AGS_BASE_PLUGIN(lv2ui_plugin)->ui_plugin_descriptor; } #ifdef AGS_DEBUG g_message("ui filename - %s, %s", AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, lv2_plugin->ui_uri); #endif /* apply ui */ g_object_set(lv2_bridge, "has-gui", TRUE, "gui-uri", lv2_plugin->ui_uri, "gui-filename", AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, NULL); } void ags_lv2_bridge_load(AgsLv2Bridge *lv2_bridge) { AgsLv2Plugin *lv2_plugin; guint samplerate; guint buffer_size; /* retrieve lv2 plugin */ lv2_plugin = lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), lv2_bridge->filename, lv2_bridge->effect); g_object_ref(lv2_plugin); lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } /* URI */ g_object_set(lv2_bridge, "uri", lv2_plugin->uri, NULL); /* samplerate and buffer size */ samplerate = ags_soundcard_helper_config_get_samplerate(ags_config_get_instance()); buffer_size = ags_soundcard_helper_config_get_buffer_size(ags_config_get_instance()); /* program */ lv2_bridge->lv2_handle = ags_base_plugin_instantiate((AgsBasePlugin *) lv2_plugin, samplerate, buffer_size); if((AGS_LV2_PLUGIN_HAS_PROGRAM_INTERFACE & (lv2_plugin->flags)) != 0){ ags_lv2_bridge_load_program(lv2_bridge); } /* preset */ if(lv2_plugin->preset != NULL){ ags_lv2_bridge_load_preset(lv2_bridge); } /* load gui */ ags_lv2_bridge_load_gui(lv2_bridge); } /** * ags_lv2_bridge_lv2ui_idle_timeout: * @widget: LV2UI_Handle * * Idle lv2 ui. * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_bridge_lv2ui_idle_timeout(GtkWidget *widget) { AgsLv2Bridge *lv2_bridge; AgsLv2uiPlugin *lv2ui_plugin; int retval; /* retrieve lv2ui plugin */ if((lv2_bridge = g_hash_table_lookup(ags_lv2_bridge_lv2ui_idle, widget)) != NULL){ lv2ui_plugin = lv2_bridge->lv2ui_plugin; if(lv2ui_plugin->feature != NULL && lv2ui_plugin->feature[0]->data != NULL){ retval = ((struct _LV2UI_Idle_Interface *) lv2ui_plugin->feature[0]->data)->idle(lv2_bridge->ui_handle[0]); if(retval != 0){ g_hash_table_remove(ags_lv2_bridge_lv2ui_handle, lv2_bridge->ui_handle); lv2_bridge->ui_handle = NULL; return(FALSE); } } return(TRUE); }else{ return(FALSE); } } /** * ags_lv2_bridge_new: * @soundcard: the assigned soundcard. * @filename: the plugin.so * @effect: the effect * * Create a new instance of #AgsLv2Bridge * * Returns: the new #AgsLv2Bridge * * Since: 3.0.0 */ AgsLv2Bridge* ags_lv2_bridge_new(GObject *soundcard, gchar *filename, gchar *effect) { AgsLv2Bridge *lv2_bridge; lv2_bridge = (AgsLv2Bridge *) g_object_new(AGS_TYPE_LV2_BRIDGE, NULL); g_object_set(AGS_MACHINE(lv2_bridge)->audio, "output-soundcard", soundcard, NULL); g_object_set(lv2_bridge, "filename", filename, "effect", effect, NULL); return(lv2_bridge); } gsequencer-3.1.3/ags/X/machine/ags_mixer_input_pad.h0000644000175000017500000000404713607210263017364 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIXER_INPUT_PAD_H__ #define __AGS_MIXER_INPUT_PAD_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIXER_INPUT_PAD (ags_mixer_input_pad_get_type()) #define AGS_MIXER_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIXER_INPUT_PAD, AgsMixerInputPad)) #define AGS_MIXER_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MIXER_INPUT_PAD, AgsMixerInputPadClass)) #define AGS_IS_MIXER_INPUT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MIXER_INPUT_PAD)) #define AGS_IS_MIXER_INPUT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MIXER_INPUT_PAD)) #define AGS_MIXER_INPUT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_MIXER_INPUT_PAD, AgsMixerInputPadClass)) typedef struct _AgsMixerInputPad AgsMixerInputPad; typedef struct _AgsMixerInputPadClass AgsMixerInputPadClass; struct _AgsMixerInputPad { AgsPad pad; }; struct _AgsMixerInputPadClass { AgsPadClass pad; }; GType ags_mixer_input_pad_get_type(); AgsMixerInputPad* ags_mixer_input_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_MIXER_INPUT_PAD_H__*/ gsequencer-3.1.3/ags/X/machine/ags_pattern_box.c0000644000175000017500000006006313607210263016515 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include static GType ags_accessible_pattern_box_get_type(void); void ags_pattern_box_class_init(AgsPatternBoxClass *pattern_box); void ags_accessible_pattern_box_class_init(AtkObject *object); void ags_accessible_pattern_box_action_interface_init(AtkActionIface *action); void ags_pattern_box_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pattern_box_init(AgsPatternBox *pattern_box); void ags_pattern_box_finalize(GObject *gobject); void ags_pattern_box_connect(AgsConnectable *connectable); void ags_pattern_box_disconnect(AgsConnectable *connectable); AtkObject* ags_pattern_box_get_accessible(GtkWidget *widget); void ags_pattern_box_realize(GtkWidget *widget); void ags_pattern_box_show(GtkWidget *widget); void ags_pattern_box_show_all(GtkWidget *widget); gboolean ags_accessible_pattern_box_do_action(AtkAction *action, gint i); gint ags_accessible_pattern_box_get_n_actions(AtkAction *action); const gchar* ags_accessible_pattern_box_get_description(AtkAction *action, gint i); const gchar* ags_accessible_pattern_box_get_name(AtkAction *action, gint i); const gchar* ags_accessible_pattern_box_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_pattern_box_set_description(AtkAction *action, gint i); gchar* ags_accessible_pattern_box_get_localized_name(AtkAction *action, gint i); /** * SECTION:ags_pattern_box * @short_description: pattern box sequencer * @title: AgsPatternBox * @section_id: * @include: ags/X/machine/ags_pattern_box.h * * The #AgsPatternBox is a composite widget to act as pattern box sequencer. */ static gpointer ags_pattern_box_parent_class = NULL; static GQuark quark_accessible_object = 0; GtkStyle *pattern_box_style = NULL; GHashTable *ags_pattern_box_led_queue_draw = NULL; GType ags_pattern_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pattern_box = 0; static const GTypeInfo ags_pattern_box_info = { sizeof(AgsPatternBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pattern_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPatternBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pattern_box_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pattern_box_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pattern_box = g_type_register_static(GTK_TYPE_TABLE, "AgsPatternBox", &ags_pattern_box_info, 0); g_type_add_interface_static(ags_type_pattern_box, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pattern_box); } return g_define_type_id__volatile; } static GType ags_accessible_pattern_box_get_type(void) { static GType ags_type_accessible_pattern_box = 0; if(!ags_type_accessible_pattern_box){ const GTypeInfo ags_accesssible_pattern_box_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_pattern_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_pattern_box_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_pattern_box = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessiblePatternBox", &ags_accesssible_pattern_box_info, 0); g_type_add_interface_static(ags_type_accessible_pattern_box, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_pattern_box); } void ags_pattern_box_class_init(AgsPatternBoxClass *pattern_box) { GObjectClass *gobject; GtkWidgetClass *widget; ags_pattern_box_parent_class = g_type_class_peek_parent(pattern_box); quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); /* GObjectClass */ gobject = (GObjectClass *) pattern_box; gobject->finalize = ags_pattern_box_finalize; /* GtkWidget */ widget = (GtkWidgetClass *) pattern_box; widget->realize = ags_pattern_box_realize; widget->show = ags_pattern_box_show; widget->show_all = ags_pattern_box_show_all; } void ags_accessible_pattern_box_class_init(AtkObject *object) { /* empty */ } void ags_accessible_pattern_box_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_pattern_box_do_action; action->get_n_actions = ags_accessible_pattern_box_get_n_actions; action->get_description = ags_accessible_pattern_box_get_description; action->get_name = ags_accessible_pattern_box_get_name; action->get_keybinding = ags_accessible_pattern_box_get_keybinding; action->set_description = ags_accessible_pattern_box_set_description; action->get_localized_name = ags_accessible_pattern_box_get_localized_name; } void ags_pattern_box_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_pattern_box_connectable_parent_interface; connectable->connect = ags_pattern_box_connect; connectable->disconnect = ags_pattern_box_disconnect; } void ags_pattern_box_init(AgsPatternBox *pattern_box) { AgsLed *led; GtkToggleButton *toggle_button; GtkRadioButton *radio_button; AgsApplicationContext *application_context; gchar *str; gdouble gui_scale_factor; guint i; application_context = ags_application_context_get_instance(); g_object_set(pattern_box, "can-focus", TRUE, "n-columns", 2, "n-rows", 2, "homogeneous", FALSE, NULL); gtk_widget_set_events((GtkWidget *) pattern_box, GDK_CONTROL_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); pattern_box->flags = 0; pattern_box->key_mask = 0; pattern_box->n_controls = AGS_PATTERN_BOX_N_CONTROLS; pattern_box->n_indices = AGS_PATTERN_BOX_N_INDICES; /* led */ gui_scale_factor = ags_ui_provider_get_gui_scale_factor(AGS_UI_PROVIDER(application_context)); pattern_box->active_led = 0; pattern_box->hled_array = (AgsHLedArray *) ags_hled_array_new(); g_object_set(pattern_box->hled_array, "led-count", pattern_box->n_controls, "led-width", (guint) (gui_scale_factor * AGS_PATTERN_BOX_LED_DEFAULT_WIDTH), "led-height", (guint) (gui_scale_factor * AGS_PATTERN_BOX_LED_DEFAULT_HEIGHT), NULL); gtk_widget_set_size_request((GtkWidget *) pattern_box->hled_array, (guint) (gui_scale_factor * pattern_box->n_controls * AGS_PATTERN_BOX_DEFAULT_PAD_WIDTH), (guint) (gui_scale_factor * AGS_PATTERN_BOX_LED_DEFAULT_HEIGHT)); gtk_table_attach((GtkTable *) pattern_box, (GtkWidget *) pattern_box->hled_array, 0, 1, 0, 1, GTK_FILL|GTK_EXPAND, 0, 0, 0); gtk_widget_show_all((GtkWidget *) pattern_box->hled_array); if(ags_pattern_box_led_queue_draw == NULL){ ags_pattern_box_led_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_pattern_box_led_queue_draw, pattern_box, ags_pattern_box_led_queue_draw_timeout); g_timeout_add((guint) floor(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0), (GSourceFunc) ags_pattern_box_led_queue_draw_timeout, (gpointer) pattern_box); /* pattern */ pattern_box->pattern = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach((GtkTable *) pattern_box, (GtkWidget *) pattern_box->pattern, 0, 1, 1, 2, 0, 0, 0, 0); for(i = 0; i < pattern_box->n_controls; i++){ toggle_button = (GtkToggleButton *) gtk_toggle_button_new(); gtk_widget_set_size_request((GtkWidget *) toggle_button, gui_scale_factor * AGS_PATTERN_BOX_DEFAULT_PAD_WIDTH, gui_scale_factor * AGS_PATTERN_BOX_DEFAULT_PAD_HEIGHT); gtk_box_pack_start((GtkBox *) pattern_box->pattern, (GtkWidget *) toggle_button, FALSE, FALSE, 0); } /* page / offset */ pattern_box->offset = (GtkVBox*) gtk_vbox_new(FALSE, 0); gtk_table_attach_defaults((GtkTable *) pattern_box, (GtkWidget *) pattern_box->offset, 1, 2, 0, 2); radio_button = NULL; for(i = 0; i < pattern_box->n_indices; i++){ if(radio_button == NULL){ str = g_strdup_printf("%d-%d", i * pattern_box->n_controls + 1, (i + 1) * pattern_box->n_controls); radio_button = (GtkRadioButton *) gtk_radio_button_new_with_label(NULL, str); gtk_box_pack_start((GtkBox*) pattern_box->offset, (GtkWidget *) radio_button, FALSE, FALSE, 0); g_free(str); }else{ str = g_strdup_printf("%d-%d", i * pattern_box->n_controls + 1, (i + 1) * pattern_box->n_controls); gtk_box_pack_start((GtkBox*) pattern_box->offset, (GtkWidget *) gtk_radio_button_new_with_label(gtk_radio_button_get_group(radio_button), str), FALSE, FALSE, 0); g_free(str); } } } void ags_pattern_box_finalize(GObject *gobject) { g_hash_table_remove(ags_pattern_box_led_queue_draw, gobject); G_OBJECT_CLASS(ags_pattern_box_parent_class)->finalize(gobject); } void ags_pattern_box_connect(AgsConnectable *connectable) { AgsPatternBox *pattern_box; GList *list, *list_start; if((AGS_PATTERN_BOX_CONNECTED & (AGS_PATTERN_BOX(connectable)->flags)) != 0){ return; } /* AgsPatternBox */ pattern_box = AGS_PATTERN_BOX(connectable); pattern_box->flags |= AGS_PATTERN_BOX_CONNECTED; g_signal_connect_after(G_OBJECT(pattern_box), "focus_in_event", G_CALLBACK(ags_pattern_box_focus_in_callback), (gpointer) pattern_box); g_signal_connect_after(G_OBJECT(pattern_box), "focus_out_event", G_CALLBACK(ags_pattern_box_focus_out_callback), (gpointer) pattern_box); g_signal_connect(G_OBJECT(pattern_box), "key_press_event", G_CALLBACK(ags_pattern_box_key_press_event), (gpointer) pattern_box); g_signal_connect(G_OBJECT(pattern_box), "key_release_event", G_CALLBACK(ags_pattern_box_key_release_event), (gpointer) pattern_box); /* connect pattern */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); while(list != NULL){ g_signal_connect(G_OBJECT(list->data), "clicked", G_CALLBACK(ags_pattern_box_pad_callback), (gpointer) pattern_box); list = list->next; } g_list_free(list_start); /* connect pattern offset range */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->offset); while(list != NULL){ g_signal_connect_after(G_OBJECT(list->data), "clicked", G_CALLBACK(ags_pattern_box_offset_callback), (gpointer) pattern_box); list = list->next; } g_list_free(list_start); } void ags_pattern_box_disconnect(AgsConnectable *connectable) { AgsPatternBox *pattern_box; GList *list, *list_start; if((AGS_PATTERN_BOX_CONNECTED & (AGS_PATTERN_BOX(connectable)->flags)) == 0){ return; } /* AgsPatternBox */ pattern_box = AGS_PATTERN_BOX(connectable); pattern_box->flags &= (~AGS_PATTERN_BOX_CONNECTED); g_object_disconnect(G_OBJECT(pattern_box), "any_signal::focus_in_event", G_CALLBACK(ags_pattern_box_focus_in_callback), (gpointer) pattern_box, "any_signal::focus_out_event", G_CALLBACK(ags_pattern_box_focus_out_callback), (gpointer) pattern_box, "any_signal::key_press_event", G_CALLBACK(ags_pattern_box_key_press_event), (gpointer) pattern_box, "any_signal::key_release_event", G_CALLBACK(ags_pattern_box_key_release_event), (gpointer) pattern_box, NULL); /* connect pattern */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); while(list != NULL){ g_object_disconnect(G_OBJECT(list->data), "any_signal::clicked", G_CALLBACK(ags_pattern_box_pad_callback), (gpointer) pattern_box, NULL); list = list->next; } g_list_free(list_start); /* connect pattern offset range */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->offset); while(list != NULL){ g_object_disconnect(G_OBJECT(list->data), "any_signal::clicked", G_CALLBACK(ags_pattern_box_offset_callback), (gpointer) pattern_box, NULL); list = list->next; } g_list_free(list_start); } AtkObject* ags_pattern_box_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_pattern_box_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_pattern_box_realize(GtkWidget *widget) { AgsPatternBox *pattern_box; pattern_box = (AgsPatternBox *) widget; /* call parent */ GTK_WIDGET_CLASS(ags_pattern_box_parent_class)->realize(widget); if(pattern_box_style == NULL){ pattern_box_style = gtk_style_copy(gtk_widget_get_style((GtkWidget *) pattern_box)); } gtk_widget_set_style((GtkWidget *) pattern_box, pattern_box_style); } void ags_pattern_box_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_pattern_box_parent_class)->show(widget); // ags_pattern_box_draw_matrix(AGS_PATTERN_BOX(widget)); } void ags_pattern_box_show_all(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_pattern_box_parent_class)->show_all(widget); // ags_pattern_box_draw_matrix(AGS_PATTERN_BOX(widget)); } gboolean ags_accessible_pattern_box_do_action(AtkAction *action, gint i) { AgsPatternBox *pattern_box; GdkEventKey *key_press, *key_release; GdkEventKey *modifier_press, *modifier_release; if(!(i >= 0 && i < 6)){ return(FALSE); } pattern_box = (AgsPatternBox *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); key_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); switch(i){ case AGS_PATTERN_BOX_MOVE_LEFT: { key_press->keyval = key_release->keyval = GDK_KEY_Left; /* send event */ gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_release); } break; case AGS_PATTERN_BOX_MOVE_RIGHT: { key_press->keyval = key_release->keyval = GDK_KEY_Right; /* send event */ gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_release); } break; case AGS_PATTERN_BOX_INDEX_DECREMENT: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_release); } break; case AGS_PATTERN_BOX_INDEX_INCREMENT: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_release); } break; case AGS_PATTERN_BOX_TOGGLE_PAD: { key_press->keyval = key_release->keyval = GDK_KEY_space; /* send event */ gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_release); } break; case AGS_PATTERN_BOX_COPY_PATTERN: { key_press->keyval = key_release->keyval = GDK_KEY_c; /* create modifier */ modifier_press = (GdkEventKey *) gdk_event_new(GDK_KEY_PRESS); modifier_release = (GdkEventKey *) gdk_event_new(GDK_KEY_RELEASE); modifier_press->keyval = modifier_release->keyval = GDK_KEY_Control_R; /* send event */ gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) modifier_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) key_release); gtk_widget_event((GtkWidget *) pattern_box, (GdkEvent *) modifier_release); } break; } return(TRUE); } gint ags_accessible_pattern_box_get_n_actions(AtkAction *action) { return(6); } const gchar* ags_accessible_pattern_box_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move cursor left", "move cursor right", "decrement pattern index", "increment pattern index", "toggle audio pattern" "copy pattern to clipboard", }; if(i >= 0 && i < 6){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_pattern_box_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "toggle", "copy", }; if(i >= 0 && i < 6){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_pattern_box_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "left", "right", "up", "down", "space", "Ctrl+c", }; if(i >= 0 && i < 6){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_pattern_box_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_pattern_box_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } /** * ags_pattern_box_set_pattern: * @pattern_box: the #AgsPatternBox * * Resets the pattern on @pattern_box. * * since: 2.0.0 */ void ags_pattern_box_set_pattern(AgsPatternBox *pattern_box) { AgsMachine *machine; AgsLine *selected_line; GList *list, *list_start; GList *line, *line_start; guint index0, index1, offset; gboolean is_active; gboolean set_active; guint i; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pattern_box, AGS_TYPE_MACHINE); if(machine->selected_input_pad == NULL){ return; } index0 = machine->bank_0; index1 = machine->bank_1; /* read boundaries */ list = gtk_container_get_children((GtkContainer *) pattern_box->offset); for(i = 0; i < pattern_box->n_indices && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->data)); i++){ list = list->next; } offset = i * pattern_box->n_controls; /* get pads */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); /* reset */ pattern_box->flags |= AGS_PATTERN_BOX_BLOCK_PATTERN; for(i = 0; i < pattern_box->n_controls; i++){ set_active = TRUE; line_start = line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(machine->selected_input_pad)->expander_set)); while((line = ags_line_find_next_grouped(line)) != NULL){ GList *start_pattern, *pattern; selected_line = AGS_LINE(line->data); g_object_get(selected_line->channel, "pattern", &start_pattern, NULL); /* check active */ pattern = start_pattern; is_active = ags_pattern_get_bit((AgsPattern *) pattern->data, index0, index1, offset + i); g_list_free_full(start_pattern, g_object_unref); if(!is_active){ set_active = FALSE; break; } /* iterate */ line = line->next; } g_list_free(line_start); gtk_toggle_button_set_active((GtkToggleButton *) list->data, set_active); list = list->next; } pattern_box->flags &= (~AGS_PATTERN_BOX_BLOCK_PATTERN); g_list_free(list_start); } /** * ags_pattern_box_led_queue_draw_timeout: * @pattern_box: the #AgsPatternBox * * Queue draw led. * * Returns: %TRUE if continue timeout, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_pattern_box_led_queue_draw_timeout(AgsPatternBox *pattern_box) { if(g_hash_table_lookup(ags_pattern_box_led_queue_draw, pattern_box) != NULL){ AgsMachine *machine; AgsAudio *audio; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; GList *start_list, *list; GList *start_recall, *recall; guint64 active_led_new; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pattern_box, AGS_TYPE_MACHINE); if(machine == NULL){ return(TRUE); } audio = machine->audio; /* get some recalls */ recall_id = NULL; g_object_get(audio, "recall-id", &start_list, NULL); list = start_list; while(list != NULL){ AgsRecyclingContext *current; g_object_get(list->data, "recycling-context", ¤t, NULL); g_object_unref(current); if(current != NULL){ g_object_get(current, "parent", ¤t, NULL); if(current != NULL){ g_object_unref(current); } if(current == NULL && ags_recall_id_check_sound_scope(list->data, AGS_SOUND_SCOPE_SEQUENCER)){ recall_id = list->data; g_object_get(audio, "play", &start_recall, NULL); play_count_beats_audio = NULL; play_count_beats_audio_run = NULL; recall = ags_recall_find_type(start_recall, AGS_TYPE_COUNT_BEATS_AUDIO); if(recall != NULL){ play_count_beats_audio = AGS_COUNT_BEATS_AUDIO(recall->data); } recall = ags_recall_find_type_with_recycling_context(start_recall, AGS_TYPE_COUNT_BEATS_AUDIO_RUN, (GObject *) recall_id->recycling_context); if(recall != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall->data); } g_list_free_full(start_recall, g_object_unref); if(play_count_beats_audio == NULL || play_count_beats_audio_run == NULL){ recall_id = NULL; }else{ break; } } } list = list->next; } g_list_free_full(start_list, g_object_unref); if(recall_id == NULL){ return(TRUE); } /* active led */ g_object_get(play_count_beats_audio_run, "sequencer-counter", &active_led_new, NULL); pattern_box->active_led = (guint) (active_led_new % pattern_box->n_controls); ags_led_array_unset_all((AgsLedArray *) pattern_box->hled_array); ags_led_array_set_nth((AgsLedArray *) pattern_box->hled_array, pattern_box->active_led); return(TRUE); }else{ return(FALSE); } } /** * ags_pattern_box_new: * * Create a new instance of #AgsPatternBox * * Returns: the new #AgsPatternBox * * Since: 3.0.0 */ AgsPatternBox* ags_pattern_box_new() { AgsPatternBox *pattern_box; pattern_box = (AgsPatternBox *) g_object_new(AGS_TYPE_PATTERN_BOX, NULL); return(pattern_box); } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bridge.h0000644000175000017500000000414613607210263017321 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_BRIDGE_H__ #define __AGS_FFPLAYER_BRIDGE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FFPLAYER_BRIDGE (ags_ffplayer_bridge_get_type()) #define AGS_FFPLAYER_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FFPLAYER_BRIDGE, AgsFFPlayerBridge)) #define AGS_FFPLAYER_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FFPLAYER_BRIDGE, AgsFFPlayerBridgeClass)) #define AGS_IS_FFPLAYER_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FFPLAYER_BRIDGE)) #define AGS_IS_FFPLAYER_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FFPLAYER_BRIDGE)) #define AGS_FFPLAYER_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_FFPLAYER_BRIDGE, AgsFFPlayerBridgeClass)) typedef struct _AgsFFPlayerBridge AgsFFPlayerBridge; typedef struct _AgsFFPlayerBridgeClass AgsFFPlayerBridgeClass; struct _AgsFFPlayerBridge { AgsEffectBridge effect_bridge; }; struct _AgsFFPlayerBridgeClass { AgsEffectBridgeClass effect_bridge; }; GType ags_ffplayer_bridge_get_type(void); AgsFFPlayerBridge* ags_ffplayer_bridge_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_FFPLAYER_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_syncsynth_callbacks.h0000644000175000017500000000406113607210263020232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNCSYNTH_CALLBACKS_H__ #define __AGS_SYNCSYNTH_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_syncsynth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsSyncsynth *syncsynth); void ags_syncsynth_samplerate_changed_callback(AgsMachine *machine, guint samplerate, guint old_samplerate, gpointer user_data); void ags_syncsynth_oscillator_control_changed_callback(AgsOscillator *oscillator, AgsSyncsynth *syncsynth); void ags_syncsynth_add_callback(GtkButton *button, AgsSyncsynth *syncsynth); void ags_syncsynth_remove_callback(GtkButton *button, AgsSyncsynth *syncsynth); void ags_syncsynth_auto_update_callback(GtkToggleButton *toggle, AgsSyncsynth *syncsynth); void ags_syncsynth_update_callback(GtkButton *button, AgsSyncsynth *syncsynth); void ags_syncsynth_lower_callback(GtkSpinButton *spin_button, AgsSyncsynth *syncsynth); void ags_syncsynth_loop_start_callback(GtkSpinButton *spin_button, AgsSyncsynth *syncsynth); void ags_syncsynth_loop_end_callback(GtkSpinButton *spin_button, AgsSyncsynth *syncsynth); G_END_DECLS #endif /*__AGS_SYNCSYNTH_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_matrix_bulk_input_callbacks.c0000644000175000017500000000147513605312647021740 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/machine/ags_syncsynth.h0000644000175000017500000000537413607210263016243 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNCSYNTH_H__ #define __AGS_SYNCSYNTH_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SYNCSYNTH (ags_syncsynth_get_type()) #define AGS_SYNCSYNTH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SYNCSYNTH, AgsSyncsynth)) #define AGS_SYNCSYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SYNCSYNTH, AgsSyncsynthClass)) #define AGS_IS_SYNCSYNTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SYNCSYNTH)) #define AGS_IS_SYNCSYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SYNCSYNTH)) #define AGS_SYNCSYNTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SYNCSYNTH, AgsSyncsynthClass)) #define AGS_SYNCSYNTH_BASE_NOTE_MAX (72.0) #define AGS_SYNCSYNTH_BASE_NOTE_MIN (-72.0) typedef struct _AgsSyncsynth AgsSyncsynth; typedef struct _AgsSyncsynthClass AgsSyncsynthClass; typedef enum{ AGS_SYNCSYNTH_AUTO_UPDATE = 1, }AgsSyncsynthFlags; struct _AgsSyncsynth { AgsMachine machine; guint flags; gchar *name; gchar *xml_type; guint mapped_input_pad; guint mapped_output_pad; GtkVBox *oscillator; GtkButton *add; GtkButton *remove; GtkCheckButton *auto_update; GtkButton *update; GtkSpinButton *lower; // how many channels until to lowest freq GtkSpinButton *loop_start; GtkSpinButton *loop_end; }; struct _AgsSyncsynthClass { AgsMachineClass machine; }; GType ags_syncsynth_get_type(void); void ags_syncsynth_add_oscillator(AgsSyncsynth *syncsynth, AgsOscillator *oscillator); void ags_syncsynth_remove_oscillator(AgsSyncsynth *syncsynth, guint nth); void ags_syncsynth_reset_loop(AgsSyncsynth *syncsynth); void ags_syncsynth_update(AgsSyncsynth *syncsynth); AgsSyncsynth* ags_syncsynth_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_SYNCSYNTH_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_output_pad_callbacks.c0000644000175000017500000000154013605312647021404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include gsequencer-3.1.3/ags/X/machine/ags_lv2_bridge_callbacks.h0000644000175000017500000000500013607210263020201 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_BRIDGE_CALLBACKS_H__ #define __AGS_LV2_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_lv2_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_show_gui_callback(GtkMenuItem *item, AgsLv2Bridge *lv2_bridge); gboolean ags_lv2_bridge_delete_event_callback(GtkWidget *widget, GdkEvent *event, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_lv2ui_cleanup_function(LV2UI_Handle handle); void ags_lv2_bridge_lv2ui_write_function(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t port_protocol, const void *buffer); void ags_lv2_bridge_program_changed_callback(GtkComboBox *combo_box, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_preset_changed_callback(GtkComboBox *combo_box, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_dial_changed_callback(GtkWidget *dial, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_vscale_changed_callback(GtkWidget *vscale, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_hscale_changed_callback(GtkWidget *hscale, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_spin_button_changed_callback(GtkWidget *spin_button, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_check_button_clicked_callback(GtkWidget *check_button, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsLv2Bridge *lv2_bridge); void ags_lv2_bridge_button_clicked_callback(GtkWidget *button, AgsLv2Bridge *lv2_bridge); G_END_DECLS #endif /*__AGS_LV2_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_synth_input_line.c0000644000175000017500000001670713607210263020253 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_fm_synth_input_line_class_init(AgsFMSynthInputLineClass *fm_synth_input_line); void ags_fm_synth_input_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_fm_synth_input_line_init(AgsFMSynthInputLine *fm_synth_input_line); void ags_fm_synth_input_line_connect(AgsConnectable *connectable); void ags_fm_synth_input_line_disconnect(AgsConnectable *connectable); void ags_fm_synth_input_line_show(GtkWidget *line); void ags_fm_synth_input_line_show_all(GtkWidget *line); void ags_fm_synth_input_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_fm_synth_input_line_map_recall(AgsLine *line, guint output_pad_start); /** * SECTION:ags_fm_synth_input_line * @short_description: fm synth input line * @title: AgsFMSynthInputLine * @section_id: * @include: ags/X/machine/ags_fm_synth_input_line.h * * The #AgsFMSynthInputLine is a composite widget to act as fm synth input line. */ static gpointer ags_fm_synth_input_line_parent_class = NULL; static AgsConnectableInterface *ags_fm_synth_input_line_parent_connectable_interface; GType ags_fm_synth_input_line_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_fm_synth_input_line = 0; static const GTypeInfo ags_fm_synth_input_line_info = { sizeof(AgsFMSynthInputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_fm_synth_input_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFMSynthInputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_fm_synth_input_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_fm_synth_input_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_fm_synth_input_line = g_type_register_static(AGS_TYPE_LINE, "AgsFMSynthInputLine", &ags_fm_synth_input_line_info, 0); g_type_add_interface_static(ags_type_fm_synth_input_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_fm_synth_input_line); } return g_define_type_id__volatile; } void ags_fm_synth_input_line_class_init(AgsFMSynthInputLineClass *fm_synth_input_line) { AgsLineClass *line; GtkWidgetClass *widget; ags_fm_synth_input_line_parent_class = g_type_class_peek_parent(fm_synth_input_line); /* GtkWidgetClass */ widget = (GtkWidgetClass *) fm_synth_input_line; widget->show = ags_fm_synth_input_line_show; widget->show_all = ags_fm_synth_input_line_show_all; /* AgsLineClass */ line = AGS_LINE_CLASS(fm_synth_input_line); line->set_channel = ags_fm_synth_input_line_set_channel; line->map_recall = ags_fm_synth_input_line_map_recall; } void ags_fm_synth_input_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_fm_synth_input_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_fm_synth_input_line_connect; connectable->disconnect = ags_fm_synth_input_line_disconnect; } void ags_fm_synth_input_line_init(AgsFMSynthInputLine *fm_synth_input_line) { AgsFMOscillator *fm_oscillator; fm_synth_input_line->name = NULL; fm_synth_input_line->xml_type = "ags-fm-synth-input-line"; /* fm_oscillator */ fm_oscillator = ags_fm_oscillator_new(); fm_synth_input_line->fm_oscillator = fm_oscillator; ags_expander_add(AGS_LINE(fm_synth_input_line)->expander, GTK_WIDGET(fm_oscillator), 0, 0, 1, 1); g_signal_connect((GObject *) fm_synth_input_line, "samplerate-changed", G_CALLBACK(ags_fm_synth_input_line_samplerate_changed_callback), NULL); } void ags_fm_synth_input_line_connect(AgsConnectable *connectable) { AgsFMSynthInputLine *fm_synth_input_line; fm_synth_input_line = AGS_FM_SYNTH_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(fm_synth_input_line)->flags)) != 0){ return; } ags_fm_synth_input_line_parent_connectable_interface->connect(connectable); ags_connectable_connect(AGS_CONNECTABLE(fm_synth_input_line->fm_oscillator)); g_signal_connect_after((GObject *) fm_synth_input_line->fm_oscillator, "control-changed", G_CALLBACK(ags_fm_synth_input_line_fm_oscillator_control_changed_callback), (gpointer) fm_synth_input_line); } void ags_fm_synth_input_line_disconnect(AgsConnectable *connectable) { AgsFMSynthInputLine *fm_synth_input_line; fm_synth_input_line = AGS_FM_SYNTH_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(fm_synth_input_line)->flags)) == 0){ return; } ags_fm_synth_input_line_parent_connectable_interface->disconnect(connectable); ags_connectable_disconnect(AGS_CONNECTABLE(fm_synth_input_line->fm_oscillator)); g_object_disconnect((GObject *) fm_synth_input_line->fm_oscillator, "any_signal::control-changed", G_CALLBACK(ags_fm_synth_input_line_fm_oscillator_control_changed_callback), (gpointer) fm_synth_input_line, NULL); } void ags_fm_synth_input_line_set_channel(AgsLine *line, AgsChannel *channel) { AGS_LINE_CLASS(ags_fm_synth_input_line_parent_class)->set_channel(line, channel); /* empty */ } void ags_fm_synth_input_line_map_recall(AgsLine *line, guint output_pad_start) { if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 || (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){ return; } /* empty */ /* call parent */ AGS_LINE_CLASS(ags_fm_synth_input_line_parent_class)->map_recall(line, output_pad_start); } void ags_fm_synth_input_line_show(GtkWidget *line) { GTK_WIDGET_CLASS(ags_fm_synth_input_line_parent_class)->show(line); gtk_widget_hide(GTK_WIDGET(AGS_LINE(line)->group)); } void ags_fm_synth_input_line_show_all(GtkWidget *line) { GTK_WIDGET_CLASS(ags_fm_synth_input_line_parent_class)->show_all(line); gtk_widget_hide(GTK_WIDGET(AGS_LINE(line)->group)); } /** * ags_fm_synth_input_line_new: * @channel: the assigned channel * * Create a new instance of #AgsFMSynthInputLine * * Returns: the new #AgsFMSynthInputLine * * Since: 3.0.0 */ AgsFMSynthInputLine* ags_fm_synth_input_line_new(AgsChannel *channel) { AgsFMSynthInputLine *fm_synth_input_line; fm_synth_input_line = (AgsFMSynthInputLine *) g_object_new(AGS_TYPE_FM_SYNTH_INPUT_LINE, "channel", channel, NULL); return(fm_synth_input_line); } gsequencer-3.1.3/ags/X/machine/ags_matrix_bulk_input_callbacks.h0000644000175000017500000000212713607210263021731 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MATRIX_BULK_INPUT_CALLBACKS_H__ #define __AGS_MATRIX_BULK_INPUT_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_MATRIX_BULK_INPUT_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_oscillator_callbacks.h0000644000175000017500000000430513607210263021026 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_OSCILLATOR_CALLBACKS_H__ #define __AGS_FM_OSCILLATOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_fm_oscillator_wave_callback(GtkComboBox *combo, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_attack_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_frame_count_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_frequency_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_phase_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_volume_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_sync_point_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_fm_lfo_wave_callback(GtkComboBox *combo, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_fm_lfo_frequency_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_fm_lfo_depth_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); void ags_fm_oscillator_fm_tuning_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator); G_END_DECLS #endif /*__AGS_FM_OSCILLATOR_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_ffplayer.c0000644000175000017500000011774413607331151016011 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_ffplayer_class_init(AgsFFPlayerClass *ffplayer); void ags_ffplayer_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ffplayer_init(AgsFFPlayer *ffplayer); void ags_ffplayer_finalize(GObject *gobject); void ags_ffplayer_connect(AgsConnectable *connectable); void ags_ffplayer_disconnect(AgsConnectable *connectable); void ags_ffplayer_realize(GtkWidget *widget); void ags_ffplayer_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_ffplayer_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data); void ags_ffplayer_map_recall(AgsMachine *machine); void ags_ffplayer_output_map_recall(AgsFFPlayer *ffplayer, guint output_pad_start); void ags_ffplayer_input_map_recall(AgsFFPlayer *ffplayer, guint input_pad_start); /** * SECTION:ags_ffplayer * @short_description: ffplayer notation * @title: AgsFFPlayer * @section_id: * @include: ags/X/machine/ags_ffplayer.h * * The #AgsFFPlayer is a composite widget to act as soundfont2 notation player. */ static gpointer ags_ffplayer_parent_class = NULL; static AgsConnectableInterface *ags_ffplayer_parent_connectable_interface; GHashTable *ags_ffplayer_sf2_loader_completed = NULL; GtkStyle *ffplayer_style = NULL; GType ags_ffplayer_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ffplayer = 0; static const GTypeInfo ags_ffplayer_info = { sizeof(AgsFFPlayerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ffplayer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFFPlayer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ffplayer_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ffplayer_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ffplayer = g_type_register_static(AGS_TYPE_MACHINE, "AgsFFPlayer", &ags_ffplayer_info, 0); g_type_add_interface_static(ags_type_ffplayer, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ffplayer); } return g_define_type_id__volatile; } void ags_ffplayer_class_init(AgsFFPlayerClass *ffplayer) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_ffplayer_parent_class = g_type_class_peek_parent(ffplayer); /* GObjectClass */ gobject = (GObjectClass *) ffplayer; gobject->finalize = ags_ffplayer_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) ffplayer; widget->realize = ags_ffplayer_realize; /* AgsMachineClass */ machine = (AgsMachineClass *) ffplayer; machine->map_recall = ags_ffplayer_map_recall; } void ags_ffplayer_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_ffplayer_connectable_parent_interface; ags_ffplayer_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_ffplayer_connect; connectable->disconnect = ags_ffplayer_disconnect; } void ags_ffplayer_init(AgsFFPlayer *ffplayer) { GtkVBox *vbox; GtkAlignment *alignment; GtkTable *table; GtkHBox *hbox; GtkHBox *filename_hbox; GtkVBox *piano_vbox; GtkLabel *label; PangoAttrList *attr_list; PangoAttribute *attr; GtkAllocation allocation; AgsAudio *audio; AgsConfig *config; gchar *str; gdouble gui_scale_factor; g_signal_connect_after((GObject *) ffplayer, "parent_set", G_CALLBACK(ags_ffplayer_parent_set_callback), (gpointer) ffplayer); audio = AGS_MACHINE(ffplayer)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_FILE)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); config = ags_config_get_instance(); /* scale factor */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(ffplayer)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); AGS_MACHINE(ffplayer)->file_input_flags |= AGS_MACHINE_ACCEPT_SOUNDFONT2; AGS_MACHINE(ffplayer)->input_pad_type = G_TYPE_NONE; AGS_MACHINE(ffplayer)->input_line_type = G_TYPE_NONE; AGS_MACHINE(ffplayer)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(ffplayer)->output_line_type = G_TYPE_NONE; /* context menu */ ags_machine_popup_add_connection_options((AgsMachine *) ffplayer, (AGS_MACHINE_POPUP_MIDI_DIALOG)); /* audio resize */ g_signal_connect_after(G_OBJECT(ffplayer), "resize-audio-channels", G_CALLBACK(ags_ffplayer_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(ffplayer), "resize-pads", G_CALLBACK(ags_ffplayer_resize_pads), NULL); /* flags */ ffplayer->flags = 0; /* mapped IO */ ffplayer->mapped_input_pad = 0; ffplayer->mapped_output_pad = 0; /* context menu */ ags_machine_popup_add_edit_options((AgsMachine *) ffplayer, (AGS_MACHINE_POPUP_ENVELOPE)); /* name and xml type */ ffplayer->name = NULL; ffplayer->xml_type = "ags-ffplayer"; /* audio container */ ffplayer->audio_container = NULL; /* create widgets */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) (gtk_bin_get_child((GtkBin *) ffplayer)), (GtkWidget *) vbox); alignment = (GtkAlignment *) g_object_new(GTK_TYPE_ALIGNMENT, "xalign", 0.0, NULL); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) alignment, FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(3, 2, FALSE); gtk_container_add((GtkContainer *) alignment, (GtkWidget *) table); /* preset and instrument */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(hbox), 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("preset"), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); ffplayer->preset = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ffplayer->preset), TRUE, FALSE, 0); label = (GtkLabel *) g_object_new(GTK_TYPE_LABEL, "label", i18n("instrument"), "xalign", 0.0, NULL); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); ffplayer->instrument = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(ffplayer->instrument), TRUE, FALSE, 0); /* filename */ filename_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(filename_hbox), FALSE, FALSE, 0); #if 0 ffplayer->filename = (GtkEntry *) gtk_entry_new(); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) ffplayer->filename, FALSE, FALSE, 0); #else ffplayer->filename = NULL; #endif ffplayer->open = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) ffplayer->open, FALSE, FALSE, 0); ffplayer->sf2_loader = NULL; ffplayer->position = -1; ffplayer->loading = (GtkLabel *) gtk_label_new(i18n("loading ... ")); gtk_box_pack_start((GtkBox *) filename_hbox, (GtkWidget *) ffplayer->loading, FALSE, FALSE, 0); gtk_widget_set_no_show_all((GtkWidget *) ffplayer->loading, TRUE); gtk_widget_hide((GtkWidget *) ffplayer->loading); /* piano */ piano_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 2); gtk_table_attach(table, (GtkWidget *) piano_vbox, 1, 2, 0, 3, GTK_FILL, GTK_FILL, 0, 0); ffplayer->control_width = (guint) (gui_scale_factor * AGS_FFPLAYER_DEFAULT_CONTROL_WIDTH); ffplayer->control_height = (guint) (gui_scale_factor * AGS_FFPLAYER_DEFAULT_CONTROL_HEIGHT); ffplayer->drawing_area = (GtkDrawingArea *) gtk_drawing_area_new(); gtk_widget_set_size_request((GtkWidget *) ffplayer->drawing_area, 16 * ffplayer->control_width, ffplayer->control_width * 8 + ffplayer->control_height); gtk_widget_set_events((GtkWidget *) ffplayer->drawing_area, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); gtk_box_pack_start((GtkBox *) piano_vbox, (GtkWidget *) ffplayer->drawing_area, FALSE, FALSE, 0); gtk_widget_get_allocation(GTK_WIDGET(ffplayer->drawing_area), &allocation); ffplayer->hadjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 76 * ffplayer->control_width - allocation.width, 1.0, (double) ffplayer->control_width, (double) (16 * ffplayer->control_width)); ffplayer->hscrollbar = (GtkHScrollbar *) gtk_hscrollbar_new(ffplayer->hadjustment); gtk_box_pack_start((GtkBox *) piano_vbox, (GtkWidget *) ffplayer->hscrollbar, FALSE, FALSE, 0); /* effect bridge */ AGS_MACHINE(ffplayer)->bridge = (GtkContainer *) ags_ffplayer_bridge_new(audio); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) AGS_MACHINE(ffplayer)->bridge, FALSE, FALSE, 0); /* dialog */ ffplayer->open_dialog = NULL; /* SF2 loader */ if(ags_ffplayer_sf2_loader_completed == NULL){ ags_ffplayer_sf2_loader_completed = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } g_hash_table_insert(ags_ffplayer_sf2_loader_completed, ffplayer, ags_ffplayer_sf2_loader_completed_timeout); g_timeout_add(1000 / 4, (GSourceFunc) ags_ffplayer_sf2_loader_completed_timeout, (gpointer) ffplayer); } void ags_ffplayer_finalize(GObject *gobject) { g_hash_table_remove(ags_ffplayer_sf2_loader_completed, gobject); /* call parent */ G_OBJECT_CLASS(ags_ffplayer_parent_class)->finalize(gobject); } void ags_ffplayer_connect(AgsConnectable *connectable) { AgsWindow *window; AgsFFPlayer *ffplayer; GList *list; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_ffplayer_parent_connectable_interface->connect(connectable); ffplayer = AGS_FFPLAYER(connectable); window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) ffplayer); g_signal_connect((GObject *) ffplayer, "destroy", G_CALLBACK(ags_ffplayer_destroy_callback), (gpointer) ffplayer); /* AgsFFPlayer */ g_signal_connect((GObject *) ffplayer->open, "clicked", G_CALLBACK(ags_ffplayer_open_clicked_callback), (gpointer) ffplayer); g_signal_connect_after((GObject *) ffplayer->preset, "changed", G_CALLBACK(ags_ffplayer_preset_changed_callback), (gpointer) ffplayer); g_signal_connect_after((GObject *) ffplayer->instrument, "changed", G_CALLBACK(ags_ffplayer_instrument_changed_callback), (gpointer) ffplayer); g_signal_connect((GObject *) ffplayer->drawing_area, "draw", G_CALLBACK(ags_ffplayer_draw_callback), (gpointer) ffplayer); g_signal_connect((GObject *) ffplayer->drawing_area, "button_press_event", G_CALLBACK(ags_ffplayer_drawing_area_button_press_callback), (gpointer) ffplayer); g_signal_connect((GObject *) ffplayer->hadjustment, "value_changed", G_CALLBACK(ags_ffplayer_hscrollbar_value_changed), (gpointer) ffplayer); } void ags_ffplayer_disconnect(AgsConnectable *connectable) { AgsFFPlayer *ffplayer; GList *list; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_ffplayer_parent_connectable_interface->disconnect(connectable); ffplayer = AGS_FFPLAYER(connectable); g_object_disconnect((GObject *) ffplayer, "any_signal::destroy", G_CALLBACK(ags_ffplayer_destroy_callback), (gpointer) ffplayer, NULL); /* AgsFFPlayer */ g_object_disconnect((GObject *) ffplayer->open, "any_signal::clicked", G_CALLBACK(ags_ffplayer_open_clicked_callback), (gpointer) ffplayer, NULL); g_object_disconnect((GObject *) ffplayer->preset, "any_signal::changed", G_CALLBACK(ags_ffplayer_preset_changed_callback), (gpointer) ffplayer, NULL); g_object_disconnect((GObject *) ffplayer->instrument, "any_signal::changed", G_CALLBACK(ags_ffplayer_instrument_changed_callback), (gpointer) ffplayer, NULL); g_object_disconnect((GObject *) ffplayer->drawing_area, "any_signal::button_press_event", G_CALLBACK(ags_ffplayer_drawing_area_button_press_callback), (gpointer) ffplayer, NULL); g_object_disconnect((GObject *) ffplayer->hadjustment, "any_signal::value_changed", G_CALLBACK(ags_ffplayer_hscrollbar_value_changed), (gpointer) ffplayer, NULL); } void ags_ffplayer_realize(GtkWidget *widget) { AgsFFPlayer *ffplayer; ffplayer = (AgsFFPlayer *) widget; /* call parent */ GTK_WIDGET_CLASS(ags_ffplayer_parent_class)->realize(widget); if(ffplayer_style == NULL){ ffplayer_style = gtk_style_copy(gtk_widget_get_style((GtkWidget *) ffplayer)); } gtk_widget_set_style((GtkWidget *) ffplayer->drawing_area, NULL); gtk_widget_set_style((GtkWidget *) ffplayer->hscrollbar, NULL); } void ags_ffplayer_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; GList *start_play, *play; guint output_pads, input_pads; guint i, j; audio = machine->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "output-pads", &output_pads, "output", &start_output, "input", &start_input, NULL); /* */ if(audio_channels > audio_channels_old){ /* AgsOutput */ channel = start_output; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* AgsInput */ channel = start_input; g_object_ref(channel); while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; next_channel = NULL; while(channel != next_pad){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channels_old, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = 0; i < input_pads; i++){ for(j = audio_channels_old; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } /* AgsOutput */ /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channels_old, audio_channels, 0, audio->output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_ffplayer_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data) { AgsFFPlayer *ffplayer; AgsAudio *audio; AgsChannel *start_output; AgsChannel *channel, *next_channel, *nth_channel; guint output_pads, input_pads; gboolean grow; if(pads_old == pads){ return; } ffplayer = (AgsFFPlayer *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "output", &start_output, NULL); /* check grow */ if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(channel_type == AGS_TYPE_INPUT){ if(grow){ /* depending on destination */ ags_ffplayer_input_map_recall(ffplayer, pads_old); }else{ ffplayer->mapped_input_pad = pads; } }else if(channel_type == AGS_TYPE_OUTPUT){ if(grow){ /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); /* get recycling */ g_object_get(channel, "first-recycling", &recycling, NULL); /* instantiate template audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* depending on destination */ ags_ffplayer_output_map_recall(ffplayer, pads_old); }else{ ffplayer->mapped_output_pad = pads; } }else{ g_critical("unknown channel type"); } if(start_output != NULL){ g_object_unref(start_output); } } void ags_ffplayer_map_recall(AgsMachine *machine) { AgsWindow *window; AgsFFPlayer *ffplayer; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } ffplayer = AGS_FFPLAYER(machine); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_ffplayer_input_map_recall(ffplayer, 0); /* depending on destination */ ags_ffplayer_output_map_recall(ffplayer, 0); /* call parent */ AGS_MACHINE_CLASS(ags_ffplayer_parent_class)->map_recall(machine); } void ags_ffplayer_input_map_recall(AgsFFPlayer *ffplayer, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel, *nth_channel; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(ffplayer->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(ffplayer)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); nth_channel = ags_channel_pad_nth(start_input, input_pad_start); channel = nth_channel; next_channel = NULL; while(channel != NULL){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* play */ play = ags_recall_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue value = {0}; g_object_get(play->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_play); /* recall */ recall = ags_recall_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue value = {0}; g_object_get(recall->data, "use-note-length", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(port, &value); g_object_unref(port); } g_list_free(start_recall); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; channel = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-feed */ ags_recall_factory_create(audio, NULL, NULL, "ags-feed", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(channel, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(channel); } } ffplayer->mapped_input_pad = input_pads; if(start_input != NULL){ g_object_unref(start_input); } } void ags_ffplayer_output_map_recall(AgsFFPlayer *ffplayer, guint output_pad_start) { AgsAudio *audio; guint output_pads, input_pads; guint audio_channels; if(ffplayer->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(ffplayer)->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", 0, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", 0, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); } ffplayer->mapped_output_pad = output_pads; } void ags_ffplayer_open_filename(AgsFFPlayer *ffplayer, gchar *filename) { AgsSF2Loader *sf2_loader; if(!AGS_IS_FFPLAYER(ffplayer) || filename == NULL){ return; } ffplayer->sf2_loader = sf2_loader = ags_sf2_loader_new(AGS_MACHINE(ffplayer)->audio, filename, NULL, NULL); ags_sf2_loader_start(sf2_loader); } void ags_ffplayer_load_preset(AgsFFPlayer *ffplayer) { AgsAudioContainer *audio_container; gchar **preset; if(!AGS_IS_FFPLAYER(ffplayer) || ffplayer->audio_container == NULL || ffplayer->audio_container->sound_container == NULL){ return; } audio_container = ffplayer->audio_container; /* select first preset */ preset = ags_ipatch_sf2_reader_get_preset_all(AGS_IPATCH_SF2_READER(AGS_IPATCH(audio_container->sound_container)->reader)); /* fill ffplayer->preset */ while(preset != NULL && preset[0] != NULL){ gtk_combo_box_text_append_text(ffplayer->preset, preset[0]); preset++; } ags_ffplayer_load_instrument(ffplayer); } void ags_ffplayer_load_instrument(AgsFFPlayer *ffplayer) { AgsAudioContainer *audio_container; gchar **instrument; gint position; if(!AGS_IS_FFPLAYER(ffplayer) || ffplayer->audio_container == NULL || ffplayer->audio_container->sound_container == NULL){ return; } audio_container = ffplayer->audio_container; gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(ffplayer->instrument)))); position = gtk_combo_box_get_active(GTK_COMBO_BOX(ffplayer->preset)); if(position != -1){ instrument = ags_ipatch_sf2_reader_get_instrument_by_preset_index(AGS_IPATCH_SF2_READER(AGS_IPATCH(audio_container->sound_container)->reader), position); }else{ instrument = NULL; } /* fill ffplayer->instrument */ while(instrument != NULL && instrument[0] != NULL){ gtk_combo_box_text_append_text(ffplayer->instrument, instrument[0]); instrument++; } } /** * ags_ffplayer_sf2_loader_completed_timeout: * @ffplayer: the #AgsFFPlayer * * Queue draw widget * * Returns: %TRUE if proceed poll completed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_ffplayer_sf2_loader_completed_timeout(AgsFFPlayer *ffplayer) { if(g_hash_table_lookup(ags_ffplayer_sf2_loader_completed, ffplayer) != NULL){ if(ffplayer->sf2_loader != NULL){ if(ags_sf2_loader_test_flags(ffplayer->sf2_loader, AGS_SF2_LOADER_HAS_COMPLETED)){ /* reassign audio container */ ffplayer->audio_container = ffplayer->sf2_loader->audio_container; ffplayer->sf2_loader->audio_container = NULL; /* clear preset and instrument */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(ffplayer->preset)))); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(ffplayer->instrument)))); /* level select */ if(ffplayer->audio_container->sound_container != NULL){ ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(ffplayer->audio_container->sound_container), 0); AGS_IPATCH(ffplayer->audio_container->sound_container)->nesting_level += 1; ags_ffplayer_load_preset(ffplayer); } /* cleanup */ g_object_run_dispose((GObject *) ffplayer->sf2_loader); g_object_unref(ffplayer->sf2_loader); ffplayer->sf2_loader = NULL; ffplayer->position = -1; gtk_widget_hide((GtkWidget *) ffplayer->loading); }else{ if(ffplayer->position == -1){ ffplayer->position = 0; gtk_widget_show((GtkWidget *) ffplayer->loading); } switch(ffplayer->position){ case 0: { ffplayer->position = 1; gtk_label_set_label(ffplayer->loading, "loading ... "); } break; case 1: { ffplayer->position = 2; gtk_label_set_label(ffplayer->loading, "loading ... "); } break; case 2: { ffplayer->position = 0; gtk_label_set_label(ffplayer->loading, "loading ..."); } break; } } } return(TRUE); }else{ return(FALSE); } } /** * ags_ffplayer_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsFFPlayer * * Returns: the new #AgsFFPlayer * * Since: 3.0.0 */ AgsFFPlayer* ags_ffplayer_new(GObject *output_soundcard) { AgsFFPlayer *ffplayer; ffplayer = (AgsFFPlayer *) g_object_new(AGS_TYPE_FFPLAYER, NULL); if(output_soundcard != NULL){ g_object_set(AGS_MACHINE(ffplayer)->audio, "output-soundcard", output_soundcard, NULL); } return(ffplayer); } gsequencer-3.1.3/ags/X/machine/ags_drum_input_pad_callbacks.h0000644000175000017500000000260513607210263021204 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_INPUT_PAD_CALLBACKS_H__ #define __AGS_DRUM_INPUT_PAD_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_drum_input_pad_open_callback(GtkWidget *button, AgsDrumInputPad *drum_input_pad); void ags_drum_input_pad_play_callback(GtkToggleButton *button, AgsDrumInputPad *drum_input_pad); void ags_drum_input_pad_edit_callback(GtkWidget *toggle_button, AgsDrumInputPad *drum_input_pad); G_END_DECLS #endif /*__AGS_DRUM_INPUT_PAD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_desk_callbacks.h0000644000175000017500000000266413607210263017125 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DESK_CALLBACKS_H__ #define __AGS_DESK_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_desk_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsDesk *desk); void ags_desk_resize_audio_channels_callback(AgsDesk *desk, guint audio_channels, guint audio_channels_old, gpointer data); void ags_desk_resize_pads_callback(AgsDesk *desk, GType channel_type, guint pads, guint pads_old, gpointer data); G_END_DECLS #endif /*__AGS_DESK_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_mixer_callbacks.c0000644000175000017500000000253013607210263017306 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_mixer_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsMixer *mixer) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_MIXER)->counter); g_object_set(AGS_MACHINE(mixer), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_MIXER); g_free(str); } gsequencer-3.1.3/ags/X/machine/ags_synth_input_line.c0000644000175000017500000001616213607210263017564 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_synth_input_line_class_init(AgsSynthInputLineClass *synth_input_line); void ags_synth_input_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_synth_input_line_init(AgsSynthInputLine *synth_input_line); void ags_synth_input_line_connect(AgsConnectable *connectable); void ags_synth_input_line_disconnect(AgsConnectable *connectable); void ags_synth_input_line_show(GtkWidget *line); void ags_synth_input_line_show_all(GtkWidget *line); void ags_synth_input_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_synth_input_line_map_recall(AgsLine *line, guint output_pad_start); /** * SECTION:ags_synth_input_line * @short_description: synth input line * @title: AgsSynthInputLine * @section_id: * @include: ags/X/machine/ags_synth_input_line.h * * The #AgsSynthInputLine is a composite widget to act as synth input line. */ static gpointer ags_synth_input_line_parent_class = NULL; static AgsConnectableInterface *ags_synth_input_line_parent_connectable_interface; GType ags_synth_input_line_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_synth_input_line = 0; static const GTypeInfo ags_synth_input_line_info = { sizeof(AgsSynthInputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_synth_input_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSynthInputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_synth_input_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_synth_input_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_synth_input_line = g_type_register_static(AGS_TYPE_LINE, "AgsSynthInputLine", &ags_synth_input_line_info, 0); g_type_add_interface_static(ags_type_synth_input_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_synth_input_line); } return g_define_type_id__volatile; } void ags_synth_input_line_class_init(AgsSynthInputLineClass *synth_input_line) { AgsLineClass *line; GtkWidgetClass *widget; ags_synth_input_line_parent_class = g_type_class_peek_parent(synth_input_line); /* GtkWidgetClass */ widget = (GtkWidgetClass *) synth_input_line; widget->show = ags_synth_input_line_show; widget->show_all = ags_synth_input_line_show_all; /* AgsLineClass */ line = AGS_LINE_CLASS(synth_input_line); line->set_channel = ags_synth_input_line_set_channel; line->map_recall = ags_synth_input_line_map_recall; } void ags_synth_input_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_synth_input_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_synth_input_line_connect; connectable->disconnect = ags_synth_input_line_disconnect; } void ags_synth_input_line_init(AgsSynthInputLine *synth_input_line) { AgsOscillator *oscillator; synth_input_line->name = NULL; synth_input_line->xml_type = "ags-synth-input-line"; /* oscillator */ oscillator = ags_oscillator_new(); synth_input_line->oscillator = oscillator; ags_expander_add(AGS_LINE(synth_input_line)->expander, GTK_WIDGET(oscillator), 0, 0, 1, 1); g_signal_connect((GObject *) synth_input_line, "samplerate-changed", G_CALLBACK(ags_synth_input_line_samplerate_changed_callback), NULL); } void ags_synth_input_line_connect(AgsConnectable *connectable) { AgsSynthInputLine *synth_input_line; synth_input_line = AGS_SYNTH_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(synth_input_line)->flags)) != 0){ return; } ags_synth_input_line_parent_connectable_interface->connect(connectable); ags_connectable_connect(AGS_CONNECTABLE(synth_input_line->oscillator)); g_signal_connect_after((GObject *) synth_input_line->oscillator, "control-changed", G_CALLBACK(ags_synth_input_line_oscillator_control_changed_callback), (gpointer) synth_input_line); } void ags_synth_input_line_disconnect(AgsConnectable *connectable) { AgsSynthInputLine *synth_input_line; synth_input_line = AGS_SYNTH_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(synth_input_line)->flags)) == 0){ return; } ags_synth_input_line_parent_connectable_interface->disconnect(connectable); ags_connectable_disconnect(AGS_CONNECTABLE(synth_input_line->oscillator)); g_object_disconnect((GObject *) synth_input_line->oscillator, "any_signal::control-changed", G_CALLBACK(ags_synth_input_line_oscillator_control_changed_callback), (gpointer) synth_input_line, NULL); } void ags_synth_input_line_set_channel(AgsLine *line, AgsChannel *channel) { AGS_LINE_CLASS(ags_synth_input_line_parent_class)->set_channel(line, channel); /* empty */ } void ags_synth_input_line_map_recall(AgsLine *line, guint output_pad_start) { if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 || (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){ return; } /* empty */ /* call parent */ AGS_LINE_CLASS(ags_synth_input_line_parent_class)->map_recall(line, output_pad_start); } void ags_synth_input_line_show(GtkWidget *line) { GTK_WIDGET_CLASS(ags_synth_input_line_parent_class)->show(line); gtk_widget_hide(GTK_WIDGET(AGS_LINE(line)->group)); } void ags_synth_input_line_show_all(GtkWidget *line) { GTK_WIDGET_CLASS(ags_synth_input_line_parent_class)->show_all(line); gtk_widget_hide(GTK_WIDGET(AGS_LINE(line)->group)); } /** * ags_synth_input_line_new: * @channel: the assigned channel * * Create a new instance of #AgsSynthInputLine * * Returns: the new #AgsSynthInputLine * * Since: 3.0.0 */ AgsSynthInputLine* ags_synth_input_line_new(AgsChannel *channel) { AgsSynthInputLine *synth_input_line; synth_input_line = (AgsSynthInputLine *) g_object_new(AGS_TYPE_SYNTH_INPUT_LINE, "channel", channel, NULL); return(synth_input_line); } gsequencer-3.1.3/ags/X/machine/ags_audiorec_callbacks.h0000644000175000017500000000276713607210263017776 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIOREC_CALLBACKS_H__ #define __AGS_AUDIOREC_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_audiorec_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsAudiorec *audiorec); void ags_audiorec_open_callback(GtkWidget *button, AgsAudiorec *audiorec); void ags_audiorec_keep_data_callback(GtkWidget *button, AgsAudiorec *audiorec); void ags_audiorec_replace_data_callback(GtkWidget *button, AgsAudiorec *audiorec); void ags_audiorec_mix_data_callback(GtkWidget *button, AgsAudiorec *audiorec); G_END_DECLS #endif /*__AGS_AUDIOREC_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_cell_pattern_callbacks.c0000644000175000017500000003311713607331151020643 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_cell_pattern_start_channel_launch_callback(AgsTask *task, AgsNote *note); void ags_cell_pattern_draw_callback(GtkWidget *drawing_area, cairo_t *cr, AgsCellPattern *cell_pattern) { // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* the grid */ ags_cell_pattern_draw_grid(cell_pattern, cr); /* the pattern */ ags_cell_pattern_draw_matrix(cell_pattern, cr); ags_cell_pattern_draw_cursor(cell_pattern, cr); /* paint */ cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); } gboolean ags_cell_pattern_focus_in_callback(GtkWidget *widget, GdkEvent *event, AgsCellPattern *cell_pattern) { //TODO:JK: implement me, blink cursor return(TRUE); } gboolean ags_cell_pattern_drawing_area_button_press_callback(GtkWidget *widget, GdkEventButton *event, AgsCellPattern *cell_pattern) { if(event->button == 1){ AgsMachine *machine; AgsAudio *audio; AgsChannel *start_input, *nth_channel; GList *start_pattern; guint input_lines; guint i, j; guint index1; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); audio = machine->audio; /* get some audio fields */ g_object_get(audio, "input-lines", &input_lines, "input", &start_input, NULL); /* get pattern position */ i = (guint) floor((double) event->y / (double) cell_pattern->cell_height); j = (guint) floor((double) event->x / (double) cell_pattern->cell_width); index1 = machine->bank_1; nth_channel = ags_channel_nth(start_input, input_lines - ((guint) gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)) + i) - 1); if(nth_channel != NULL){ /* toggle pattern */ g_object_get(nth_channel, "pattern", &start_pattern, NULL); ags_pattern_toggle_bit(start_pattern->data, 0, index1, j); g_object_unref(nth_channel); g_list_free_full(start_pattern, g_object_unref); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) cell_pattern->drawing_area); } return(FALSE); } gboolean ags_cell_pattern_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsCellPattern *cell_pattern) { if(event->keyval == GDK_KEY_Tab){ return(FALSE); } switch(event->keyval){ case GDK_KEY_Control_L: { cell_pattern->key_mask |= AGS_CELL_PATTERN_KEY_L_CONTROL; } break; case GDK_KEY_Control_R: { cell_pattern->key_mask |= AGS_CELL_PATTERN_KEY_R_CONTROL; } break; case GDK_KEY_c: { /* copy notes */ if((AGS_CELL_PATTERN_KEY_L_CONTROL & (cell_pattern->key_mask)) != 0 || (AGS_CELL_PATTERN_KEY_R_CONTROL & (cell_pattern->key_mask)) != 0){ AgsMachine *machine; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); ags_machine_copy_pattern(machine); } } break; } return(TRUE); } gboolean ags_cell_pattern_drawing_area_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsCellPattern *cell_pattern) { AgsWindow *window; AgsMachine *machine; AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *nth_channel; guint input_lines; if(event->keyval == GDK_KEY_Tab){ return(FALSE); } machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_MACHINE); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) cell_pattern, AGS_TYPE_WINDOW); audio = machine->audio; /* get some fields */ g_object_get(audio, "input", &start_input, "input-lines", &input_lines, NULL); switch(event->keyval){ case GDK_KEY_Control_L: { cell_pattern->key_mask &= (~AGS_CELL_PATTERN_KEY_L_CONTROL); } break; case GDK_KEY_Control_R: { cell_pattern->key_mask &= (~AGS_CELL_PATTERN_KEY_R_CONTROL); } break; case GDK_KEY_Left: case GDK_KEY_leftarrow: { if(cell_pattern->cursor_x > 0){ GList *start_pattern; gboolean bit_is_on; cell_pattern->cursor_x -= 1; /* audible feedback */ nth_channel = ags_channel_nth(start_input, input_lines - cell_pattern->cursor_y - 1); channel = nth_channel; if(channel != NULL){ /* check bit */ g_object_get(channel, "pattern", &start_pattern, NULL); bit_is_on = (ags_pattern_get_bit(start_pattern->data, 0, machine->bank_1, cell_pattern->cursor_x)) ? TRUE: FALSE; if(bit_is_on){ AgsPlayback *playback; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); } /* unref */ g_object_unref(channel); g_list_free_full(start_pattern, g_object_unref); } } } break; case GDK_KEY_Right: case GDK_KEY_rightarrow: { if(cell_pattern->cursor_x < cell_pattern->n_cols){ GList *start_pattern; gboolean bit_is_on; cell_pattern->cursor_x += 1; /* audible feedback */ nth_channel = ags_channel_nth(start_input, input_lines - cell_pattern->cursor_y - 1); channel = nth_channel; if(channel != NULL){ /* check bit */ g_object_get(channel, "pattern", &start_pattern, NULL); bit_is_on = ags_pattern_get_bit(start_pattern->data, 0, machine->bank_1, cell_pattern->cursor_x); if(bit_is_on){ AgsPlayback *playback; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); } /* unref */ g_object_unref(channel); g_list_free_full(start_pattern, g_object_unref); } } } break; case GDK_KEY_Up: case GDK_KEY_uparrow: { if(cell_pattern->cursor_y > 0){ GList *start_pattern; gboolean bit_is_on; cell_pattern->cursor_y -= 1; /* audible feedback */ nth_channel = ags_channel_nth(start_input, input_lines - cell_pattern->cursor_y - 1); channel = nth_channel; if(channel != NULL){ /* check bit */ g_object_get(channel, "pattern", &start_pattern, NULL); bit_is_on = (ags_pattern_get_bit(start_pattern->data, 0, machine->bank_1, cell_pattern->cursor_x)) ? TRUE: FALSE; if(bit_is_on){ AgsPlayback *playback; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); } /* unref */ g_object_unref(channel); g_list_free_full(start_pattern, g_object_unref); } } if(cell_pattern->cursor_y < gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar))){ gtk_range_set_value(GTK_RANGE(cell_pattern->vscrollbar), gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)) - 1.0); } } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { if(cell_pattern->cursor_y < cell_pattern->n_rows){ GList *start_pattern; gboolean bit_is_on; cell_pattern->cursor_y += 1; /* audible feedback */ nth_channel = ags_channel_nth(start_input, input_lines - cell_pattern->cursor_y - 1); channel = nth_channel; if(channel != NULL){ /* check bit */ g_object_get(channel, "pattern", &start_pattern, NULL); bit_is_on = ags_pattern_get_bit(start_pattern->data, 0, machine->bank_1, cell_pattern->cursor_x); if(bit_is_on){ AgsPlayback *playback; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); } /* unref */ g_object_unref(channel); g_list_free_full(start_pattern, g_object_unref); } } if(cell_pattern->cursor_y >= gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)) + AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY){ gtk_range_set_value(GTK_RANGE(cell_pattern->vscrollbar), gtk_range_get_value(GTK_RANGE(cell_pattern->vscrollbar)) + 1.0); } } break; case GDK_KEY_space: { GList *start_pattern; guint i, j; guint index1; i = cell_pattern->cursor_y; j = cell_pattern->cursor_x; index1 = machine->bank_1; nth_channel = ags_channel_nth(start_input, input_lines - i - 1); channel = nth_channel; if(channel != NULL){ /* toggle pattern */ g_object_get(channel, "pattern", &start_pattern, NULL); ags_pattern_toggle_bit(start_pattern->data, 0, index1, j); /* play pattern */ if(ags_pattern_get_bit(start_pattern->data, 0, index1, j)){ AgsPlayback *playback; g_object_get(channel, "playback", &playback, NULL); ags_machine_playback_set_active(machine, playback, TRUE); g_object_unref(playback); } /* unref */ g_object_unref(channel); g_list_free_full(start_pattern, g_object_unref); } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) cell_pattern->drawing_area); } break; } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } return(TRUE); } void ags_cell_pattern_adjustment_value_changed_callback(GtkWidget *widget, AgsCellPattern *cell_pattern) { gtk_widget_queue_draw(cell_pattern->drawing_area); } void ags_cell_pattern_start_channel_launch_callback(AgsTask *task, AgsNote *note) { AgsAudio *audio; AgsChannel *channel; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; AgsAudioSignal *audio_signal; AgsPlayback *playback; AgsRecallID *recall_id; GObject *output_soundcard; gdouble delay; guint samplerate; GValue value = {0,}; channel = AGS_START_CHANNEL(task)->channel; /* get some fields */ g_object_get(channel, "audio", &audio, "output-soundcard", &output_soundcard, "playback", &playback, NULL); g_object_unref(audio); g_object_unref(output_soundcard); if(playback != NULL){ g_object_unref(playback); } recall_id = ags_playback_get_recall_id(playback, AGS_SOUND_SCOPE_PLAYBACK); #ifdef AGS_DEBUG g_message("launch"); #endif if(playback == NULL || recall_id == NULL){ return; } /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, &samplerate, NULL, NULL); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* get some fields */ g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); end_recycling = ags_recycling_next(last_recycling); /* add audio signal */ recycling = first_recycling; g_object_ref(recycling); next_recycling = NULL; while(recycling != end_recycling){ if(!ags_recall_global_get_rt_safe()){ guint note_x0, note_x1; audio_signal = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) recall_id); g_object_set(audio_signal, "note", note, NULL); /* add audio signal */ g_object_get(note, "x0", ¬e_x0, "x1", ¬e_x1, NULL); ags_recycling_create_audio_signal_with_frame_count(recycling, audio_signal, (note_x1 - note_x0) * ((gdouble) samplerate / delay), 0.0, 0); audio_signal->stream_current = audio_signal->stream; ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); /* * emit add_audio_signal on AgsRecycling */ ags_recycling_add_audio_signal(recycling, audio_signal); }else{ GList *start_list, *list; g_object_get(recycling, "audio-signal", &start_list, NULL); audio_signal = NULL; list = ags_audio_signal_find_by_recall_id(start_list, (GObject *) recall_id); if(list != NULL){ audio_signal = list->data; g_object_set(audio_signal, "note", note, NULL); } g_list_free_full(start_list, g_object_unref); g_object_set(note, "rt-offset", 0, NULL); } /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } } gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bulk_input.h0000644000175000017500000000466613607210263020250 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_BULK_INPUT_H__ #define __AGS_FFPLAYER_BULK_INPUT_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FFPLAYER_BULK_INPUT (ags_ffplayer_bulk_input_get_type()) #define AGS_FFPLAYER_BULK_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FFPLAYER_BULK_INPUT, AgsFFPlayerBulkInput)) #define AGS_FFPLAYER_BULK_INPUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FFPLAYER_BULK_INPUT, AgsFFPlayerBulkInputClass)) #define AGS_IS_FFPLAYER_BULK_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FFPLAYER_BULK_INPUT)) #define AGS_IS_FFPLAYER_BULK_INPUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FFPLAYER_BULK_INPUT)) #define AGS_FFPLAYER_BULK_INPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FFPLAYER_BULK_INPUT, AgsFFPlayerBulkInputClass)) #define AGS_FFPLAYER_BULK_INPUT_DEFAULT_VERSION "0.4.3" #define AGS_FFPLAYER_BULK_INPUT_DEFAULT_BUILD_ID "CEST 20-03-2015 08:24" typedef struct _AgsFFPlayerBulkInput AgsFFPlayerBulkInput; typedef struct _AgsFFPlayerBulkInputClass AgsFFPlayerBulkInputClass; typedef enum{ AGS_FFPLAYER_BULK_INPUT_CONNECTED = 1, }AgsFFPlayerBulkInputFlags; struct _AgsFFPlayerBulkInput { AgsEffectBulk effect_bulk; }; struct _AgsFFPlayerBulkInputClass { AgsEffectBulkClass effect_bulk; }; GType ags_ffplayer_bulk_input_get_type(void); AgsFFPlayerBulkInput* ags_ffplayer_bulk_input_new(AgsAudio *audio, GType channel_type); G_END_DECLS #endif /*__AGS_FFPLAYER_BULK_INPUT_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_input_pad_callbacks.c0000644000175000017500000001757313607210263021211 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_drum_input_pad_open_response_callback(GtkWidget *widget, gint response, AgsDrumInputPad *pad); #define AGS_DRUM_INPUT_PAD_OPEN_AUDIO_FILE_NAME "AgsDrumInputPadOpenAudioFileName" #define AGS_DRUM_INPUT_PAD_OPEN_SPIN_BUTTON "AgsDrumInputPadOpenSpinButton" void ags_drum_input_pad_open_callback(GtkWidget *widget, AgsDrumInputPad *drum_input_pad) { GtkFileChooserDialog *file_chooser; GtkHBox *hbox; GtkLabel *label; GtkSpinButton *spin_button; GtkToggleButton *play; if(drum_input_pad->file_chooser != NULL) return; drum_input_pad->file_chooser = file_chooser = (GtkFileChooserDialog *) gtk_file_chooser_dialog_new(i18n("Open File"), (GtkWindow *) gtk_widget_get_toplevel((GtkWidget *) drum_input_pad), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_shortcut_folder_uri(GTK_FILE_CHOOSER(file_chooser), "file:///usr/share/hydrogen/data/drumkits", NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), FALSE); g_object_set_data((GObject *) file_chooser, (char *) g_type_name(AGS_TYPE_AUDIO_FILE), NULL); g_object_set_data((GObject *) file_chooser, AGS_DRUM_INPUT_PAD_OPEN_AUDIO_FILE_NAME, NULL); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_file_chooser_set_extra_widget((GtkFileChooser *) file_chooser, (GtkWidget *) hbox); label = (GtkLabel *) gtk_label_new(i18n("channel: ")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); spin_button = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_AUDIO(AGS_PAD(drum_input_pad)->channel->audio)->audio_channels - 1, 1.0); g_object_set_data((GObject *) file_chooser, AGS_DRUM_INPUT_PAD_OPEN_SPIN_BUTTON, spin_button); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) spin_button, FALSE, FALSE, 0); if(gtk_toggle_button_get_active(AGS_PAD(drum_input_pad)->group)){ gtk_widget_set_sensitive((GtkWidget *) spin_button, FALSE); } #if 0 play = (GtkToggleButton *) g_object_new(GTK_TYPE_TOGGLE_BUTTON, "label", GTK_STOCK_MEDIA_PLAY, "use-stock", TRUE, "use-underline", TRUE, NULL); gtk_box_pack_start((GtkBox *) GTK_DIALOG(file_chooser)->action_area, (GtkWidget *) play, FALSE, FALSE, 0); gtk_box_reorder_child((GtkBox *) GTK_DIALOG(file_chooser)->action_area, (GtkWidget *) play, 0); #endif gtk_widget_show_all((GtkWidget *) file_chooser); g_signal_connect((GObject *) file_chooser, "response", G_CALLBACK(ags_drum_input_pad_open_response_callback), (gpointer) drum_input_pad); } void ags_drum_input_pad_open_response_callback(GtkWidget *widget, gint response, AgsDrumInputPad *drum_input_pad) { AgsWindow *window; GtkFileChooserDialog *file_chooser; GtkSpinButton *spin_button; AgsAudioFile *audio_file; AgsOpenSingleFile *open_single_file; AgsApplicationContext *application_context; GList *task; char *name0, *name1; application_context = ags_application_context_get_instance(); window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) drum_input_pad, AGS_TYPE_WINDOW); file_chooser = drum_input_pad->file_chooser; if(response == GTK_RESPONSE_ACCEPT){ name0 = gtk_file_chooser_get_filename((GtkFileChooser *) file_chooser); name1 = (char *) g_object_get_data((GObject *) file_chooser, AGS_DRUM_INPUT_PAD_OPEN_AUDIO_FILE_NAME); spin_button = (GtkSpinButton *) g_object_get_data((GObject *) file_chooser, AGS_DRUM_INPUT_PAD_OPEN_SPIN_BUTTON); /* open audio file and read audio signal */ if(g_strcmp0(name0, name1)){ if(name1 != NULL){ audio_file = (AgsAudioFile *) g_object_get_data((GObject *) file_chooser, g_type_name(AGS_TYPE_AUDIO_FILE)); g_object_unref(G_OBJECT(audio_file)); } } /* task */ task = NULL; if(gtk_toggle_button_get_active(AGS_PAD(drum_input_pad))){ AgsChannel *current, *next_pad, *next_current; guint i; current = AGS_PAD(drum_input_pad)->channel; if(current != NULL) { g_object_ref(current); } next_pad = ags_channel_next_pad(current); next_current = NULL; for(i = 0; current != next_pad; i++){ open_single_file = ags_open_single_file_new(current, name0, i); task = g_list_prepend(task, open_single_file); /* iterate */ next_current = ags_channel_next(current); g_object_unref(current); current = next_current; } if(next_pad != NULL){ g_object_unref(next_pad); } if(next_current != NULL){ g_object_unref(next_current); } }else{ AgsLine *line; GList *list; list = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(drum_input_pad)->expander_set)); line = AGS_LINE(ags_line_find_next_grouped(list)->data); open_single_file = ags_open_single_file_new(line->channel, name0, (guint) gtk_spin_button_get_value(spin_button)); task = g_list_prepend(task, open_single_file); g_list_free(list); } ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); gtk_widget_destroy((GtkWidget *) file_chooser); }else if(response == GTK_RESPONSE_CANCEL){ audio_file = (AgsAudioFile *) g_object_get_data((GObject *) file_chooser, g_type_name(AGS_TYPE_AUDIO_FILE)); if(audio_file != NULL){ g_object_unref(G_OBJECT(audio_file)); } gtk_widget_destroy((GtkWidget *) file_chooser); } drum_input_pad->file_chooser = NULL; } void ags_drum_input_pad_play_callback(GtkToggleButton *toggle_button, AgsDrumInputPad *drum_input_pad) { ags_pad_play(AGS_PAD(drum_input_pad)); } void ags_drum_input_pad_edit_callback(GtkWidget *toggle_button, AgsDrumInputPad *drum_input_pad) { GtkToggleButton *toggle; AgsDrum *drum; drum = (AgsDrum *) gtk_widget_get_ancestor((GtkWidget *) drum_input_pad, AGS_TYPE_DRUM); if(drum->selected_edit_button != NULL){ if(GTK_TOGGLE_BUTTON(toggle_button) != drum->selected_edit_button){ /* unset old */ toggle = drum->selected_edit_button; drum->selected_edit_button = NULL; gtk_toggle_button_set_active((GtkToggleButton *) toggle, FALSE); /* apply new */ drum->selected_edit_button = (GtkToggleButton *) toggle_button; drum->selected_pad = (AgsDrumInputPad *) gtk_widget_get_ancestor((GtkWidget *) toggle_button, AGS_TYPE_DRUM_INPUT_PAD); AGS_MACHINE(drum)->selected_input_pad = (GtkWidget *) drum->selected_pad; ags_pattern_box_set_pattern(drum->pattern_box); }else{ /* chain up */ toggle = drum->selected_edit_button; drum->selected_edit_button = NULL; gtk_toggle_button_set_active((GtkToggleButton *) toggle, TRUE); /* reset */ drum->selected_edit_button = toggle; } } } gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler_callbacks.h0000644000175000017500000000370513607210263021026 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PITCH_SAMPLER_CALLBACKS_H__ #define __AGS_PITCH_SAMPLER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_pitch_sampler_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_open_callback(GtkButton *button, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_file_control_changed_callback(AgsPitchSamplerFile *pitch_sampler_file, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_enable_lfo_callback(GtkToggleButton *toggle, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_lfo_freq_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_lfo_phase_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_lfo_depth_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler); void ags_pitch_sampler_lfo_tuning_callback(GtkSpinButton *spin_button, AgsPitchSampler *pitch_sampler); G_END_DECLS #endif /*__AGS_PITCH_SAMPLER_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_panel_input_line.c0000644000175000017500000002303213607210263017510 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_panel_input_line_class_init(AgsPanelInputLineClass *panel_input_line); void ags_panel_input_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_panel_input_line_init(AgsPanelInputLine *panel_input_line); void ags_panel_input_line_finalize(GObject *gobject); void ags_panel_input_line_connect(AgsConnectable *connectable); void ags_panel_input_line_disconnect(AgsConnectable *connectable); void ags_panel_input_line_show(GtkWidget *line); void ags_panel_input_line_show_all(GtkWidget *line); void ags_panel_input_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_panel_input_line_group_changed(AgsLine *line); void ags_panel_input_line_map_recall(AgsLine *line, guint output_pad_start); /** * SECTION:ags_panel_input_line * @short_description: panel input line * @title: AgsPanelInputLine * @section_id: * @include: ags/X/machine/ags_panel_input_line.h * * The #AgsPanelInputLine is a composite widget to act as panel input line. */ static gpointer ags_panel_input_line_parent_class = NULL; static AgsConnectableInterface *ags_panel_input_line_parent_connectable_interface; GType ags_panel_input_line_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_panel_input_line = 0; static const GTypeInfo ags_panel_input_line_info = { sizeof(AgsPanelInputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_panel_input_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPanelInputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_panel_input_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_panel_input_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_panel_input_line = g_type_register_static(AGS_TYPE_LINE, "AgsPanelInputLine", &ags_panel_input_line_info, 0); g_type_add_interface_static(ags_type_panel_input_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_panel_input_line); } return g_define_type_id__volatile; } void ags_panel_input_line_class_init(AgsPanelInputLineClass *panel_input_line) { GObjectClass *gobject; GtkWidgetClass *widget; AgsLineClass *line; ags_panel_input_line_parent_class = g_type_class_peek_parent(panel_input_line); /* GObjectClass */ gobject = (GObjectClass *) panel_input_line; gobject->finalize = ags_panel_input_line_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) panel_input_line; widget->show = ags_panel_input_line_show; widget->show_all = ags_panel_input_line_show_all; /* AgsLineClass */ line = AGS_LINE_CLASS(panel_input_line); line->set_channel = ags_panel_input_line_set_channel; line->map_recall = ags_panel_input_line_map_recall; } void ags_panel_input_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_panel_input_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_panel_input_line_connect; connectable->disconnect = ags_panel_input_line_disconnect; } void ags_panel_input_line_init(AgsPanelInputLine *panel_input_line) { AgsLineMember *line_member; /* mute line member */ panel_input_line->soundcard_connection = (GtkLabel *) gtk_label_new("(null)"); ags_expander_add(AGS_LINE(panel_input_line)->expander, GTK_WIDGET(panel_input_line->soundcard_connection), 0, 0, 1, 1); line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", GTK_TYPE_CHECK_BUTTON, "widget-label", "mute", "plugin-name", "ags-play", "specifier", "./muted[0]", "control-port", "2/2", NULL); ags_expander_add(AGS_LINE(panel_input_line)->expander, GTK_WIDGET(line_member), 1, 0, 1, 1); } void ags_panel_input_line_finalize(GObject *gobject) { /* empty */ G_OBJECT_CLASS(ags_panel_input_line_parent_class)->finalize(gobject); } void ags_panel_input_line_connect(AgsConnectable *connectable) { AgsPanelInputLine *panel_input_line; panel_input_line = AGS_PANEL_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(panel_input_line)->flags)) != 0){ return; } ags_panel_input_line_parent_connectable_interface->connect(connectable); /* empty */ } void ags_panel_input_line_disconnect(AgsConnectable *connectable) { AgsPanelInputLine *panel_input_line; panel_input_line = AGS_PANEL_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(panel_input_line)->flags)) == 0){ return; } ags_panel_input_line_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_panel_input_line_show(GtkWidget *line) { GTK_WIDGET_CLASS(ags_panel_input_line_parent_class)->show(line); // gtk_widget_hide(GTK_WIDGET(AGS_LINE(line)->group)); } void ags_panel_input_line_show_all(GtkWidget *line) { GTK_WIDGET_CLASS(ags_panel_input_line_parent_class)->show_all(line); // gtk_widget_hide(GTK_WIDGET(AGS_LINE(line)->group)); } void ags_panel_input_line_set_channel(AgsLine *line, AgsChannel *channel) { AgsPanelInputLine *panel_input_line; AgsAudio *audio; GObject *output_soundcard; GList *list; gchar *device; gchar *str; gint output_soundcard_channel; panel_input_line = AGS_PANEL_INPUT_LINE(line); /* call parent */ AGS_LINE_CLASS(ags_panel_input_line_parent_class)->set_channel(line, channel); /* update label */ g_object_get(channel, "output-soundcard", &output_soundcard, "output-soundcard-channel", &output_soundcard_channel, NULL); if(output_soundcard_channel == -1){ g_object_get(channel, "line", &output_soundcard_channel, NULL); g_object_set(channel, "output-soundcard-channel", output_soundcard_channel, NULL); } if(AGS_IS_SOUNDCARD(output_soundcard)){ device = ags_soundcard_get_device(AGS_SOUNDCARD(output_soundcard)); /* label */ str = g_strdup_printf("%s:%s[%d]", G_OBJECT_TYPE_NAME(output_soundcard), device, output_soundcard_channel); gtk_label_set_label(panel_input_line->soundcard_connection, str); g_free(str); g_object_unref(output_soundcard); } #ifdef AGS_DEBUG g_message("ags_panel_input_line_set_channel - channel: %u", channel->line); #endif } void ags_panel_input_line_map_recall(AgsLine *line, guint output_pad_start) { AgsAudio *audio; AgsChannel *source; AgsPlayChannel *play_channel; AgsPlayChannelRunMaster *play_channel_run; GList *start_play, *play; guint pad, audio_channel; if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 || (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){ return; } source = line->channel; /* get some fields */ g_object_get(source, "audio", &audio, "pad", &pad, "audio-channel", &audio_channel, NULL); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-master", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* get some fields */ g_object_get(source, "play", &start_play, NULL); /* set audio channel */ play = start_play; while((play = ags_recall_template_find_type(play, AGS_TYPE_PLAY_CHANNEL)) != NULL){ GValue audio_channel_value = {0,}; play_channel = AGS_PLAY_CHANNEL(play->data); g_value_init(&audio_channel_value, G_TYPE_UINT64); g_value_set_uint64(&audio_channel_value, audio_channel); ags_port_safe_write(play_channel->audio_channel, &audio_channel_value); g_value_unset(&audio_channel_value); /* iterate */ play = play->next; } g_list_free_full(start_play, g_object_unref); /* call parent */ AGS_LINE_CLASS(ags_panel_input_line_parent_class)->map_recall(line, output_pad_start); g_object_unref(audio); } /** * ags_panel_input_line_new: * @channel: the assigned channel * * Create a new instance of #AgsPanelInputLine * * Returns: the new #AgsPanelInputLine * * Since: 3.0.0 */ AgsPanelInputLine* ags_panel_input_line_new(AgsChannel *channel) { AgsPanelInputLine *panel_input_line; panel_input_line = (AgsPanelInputLine *) g_object_new(AGS_TYPE_PANEL_INPUT_LINE, "channel", channel, NULL); return(panel_input_line); } gsequencer-3.1.3/ags/X/machine/ags_oscillator_callbacks.h0000644000175000017500000000334013607210263020342 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSCILLATOR_CALLBACKS_H__ #define __AGS_OSCILLATOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_oscillator_wave_callback(GtkComboBox *combo, AgsOscillator *oscillator); void ags_oscillator_attack_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator); void ags_oscillator_frame_count_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator); void ags_oscillator_frequency_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator); void ags_oscillator_phase_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator); void ags_oscillator_volume_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator); void ags_oscillator_sync_point_callback(GtkSpinButton *spin_button, AgsOscillator *oscillator); G_END_DECLS #endif /*__AGS_OSCILLATOR_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_matrix_bridge_callbacks.h0000644000175000017500000000210713607210263021007 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MATRIX_BRIDGE_CALLBACKS_H__ #define __AGS_MATRIX_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_MATRIX_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_pattern_box_callbacks.h0000644000175000017500000000332013607210263020512 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PATTERN_BOX_CALLBACKS_H__ #define __AGS_PATTERN_BOX_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS /* controls */ gboolean ags_pattern_box_focus_in_callback(GtkWidget *widget, GdkEvent *event, AgsPatternBox *pattern_box); gboolean ags_pattern_box_focus_out_callback(GtkWidget *widget, GdkEvent *event, AgsPatternBox *pattern_box); gboolean ags_pattern_box_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsPatternBox *pattern_box); gboolean ags_pattern_box_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsPatternBox *pattern_box); void ags_pattern_box_pad_callback(GtkWidget *toggle_button, AgsPatternBox *pattern_box); void ags_pattern_box_offset_callback(GtkWidget *widget, AgsPatternBox *pattern_box); G_END_DECLS #endif /*__AGS_PATTERN_BOX_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_line.c0000644000175000017500000001234313607210263020224 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_ffplayer_input_line_class_init(AgsFFPlayerInputLineClass *ffplayer_input_line); void ags_ffplayer_input_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ffplayer_input_line_init(AgsFFPlayerInputLine *ffplayer_input_line); void ags_ffplayer_input_line_finalize(GObject *gobject); void ags_ffplayer_input_line_connect(AgsConnectable *connectable); void ags_ffplayer_input_line_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ffplayer_input_line * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsFFPlayerInputLine * @section_id: * @include: ags/X/machine/ags_ffplayer_input_line.h * * #AgsFFPlayerInputLine is a composite widget to visualize one #AgsChannel. It should be * packed by an #AgsFFPlayerInputLine. */ enum{ RESIZE_LINES, LAST_SIGNAL, }; static gpointer ags_ffplayer_input_line_parent_class = NULL; static AgsConnectableInterface *ags_ffplayer_input_line_parent_connectable_interface; static guint ffplayer_input_line_signals[LAST_SIGNAL]; GType ags_ffplayer_input_line_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ffplayer_input_line = 0; static const GTypeInfo ags_ffplayer_input_line_info = { sizeof(AgsFFPlayerInputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ffplayer_input_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFFPlayerInputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ffplayer_input_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ffplayer_input_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ffplayer_input_line = g_type_register_static(AGS_TYPE_EFFECT_LINE, "AgsFFPlayerInputLine", &ags_ffplayer_input_line_info, 0); g_type_add_interface_static(ags_type_ffplayer_input_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ffplayer_input_line); } return g_define_type_id__volatile; } void ags_ffplayer_input_line_class_init(AgsFFPlayerInputLineClass *ffplayer_input_line) { GObjectClass *gobject; ags_ffplayer_input_line_parent_class = g_type_class_peek_parent(ffplayer_input_line); /* GObjectClass */ gobject = G_OBJECT_CLASS(ffplayer_input_line); gobject->finalize = ags_ffplayer_input_line_finalize; } void ags_ffplayer_input_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_ffplayer_input_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ffplayer_input_line_connect; connectable->disconnect = ags_ffplayer_input_line_disconnect; } void ags_ffplayer_input_line_init(AgsFFPlayerInputLine *ffplayer_input_line) { g_signal_connect_after(ffplayer_input_line, "notify::channel", G_CALLBACK(ags_ffplayer_input_line_notify_channel_callback), NULL); } void ags_ffplayer_input_line_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_ffplayer_input_line_parent_class)->finalize(gobject); } void ags_ffplayer_input_line_connect(AgsConnectable *connectable) { if((AGS_EFFECT_LINE_CONNECTED & (AGS_EFFECT_LINE(connectable)->flags)) != 0){ return; } ags_ffplayer_input_line_parent_connectable_interface->connect(connectable); } void ags_ffplayer_input_line_disconnect(AgsConnectable *connectable) { if((AGS_EFFECT_LINE_CONNECTED & (AGS_EFFECT_LINE(connectable)->flags)) == 0){ return; } ags_ffplayer_input_line_parent_connectable_interface->disconnect(connectable); } /** * ags_ffplayer_input_line_new: * @channel: the #AgsChannel to visualize * * Creates an #AgsFFPlayerInputLine * * Returns: a new #AgsFFPlayerInputLine * * Since: 3.0.0 */ AgsFFPlayerInputLine* ags_ffplayer_input_line_new(AgsChannel *channel) { AgsFFPlayerInputLine *ffplayer_input_line; ffplayer_input_line = (AgsFFPlayerInputLine *) g_object_new(AGS_TYPE_FFPLAYER_INPUT_LINE, "channel", channel, NULL); return(ffplayer_input_line); } gsequencer-3.1.3/ags/X/machine/ags_fm_synth_input_line_callbacks.c0000644000175000017500000000453213605312647022252 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_fm_synth_input_line_samplerate_changed_callback(AgsLine *line, guint samplerate, guint old_samplerate, gpointer user_data) { AgsFMOscillator *fm_oscillator; guint i; fm_oscillator = AGS_FM_SYNTH_INPUT_LINE(line)->fm_oscillator; gtk_spin_button_set_value(fm_oscillator->attack, samplerate * (gtk_spin_button_get_value(fm_oscillator->attack) / old_samplerate)); gtk_spin_button_set_value(fm_oscillator->frame_count, samplerate * (gtk_spin_button_get_value(fm_oscillator->frame_count) / old_samplerate)); gtk_spin_button_set_value(fm_oscillator->phase, samplerate * (gtk_spin_button_get_value(fm_oscillator->phase) / old_samplerate)); for(i = 0; i < fm_oscillator->sync_point_count; i++){ gtk_spin_button_set_value(fm_oscillator->sync_point[i * 2], samplerate * (gtk_spin_button_get_value(fm_oscillator->sync_point[i * 2]) / old_samplerate)); gtk_spin_button_set_value(fm_oscillator->sync_point[i * 2 + 1], samplerate * (gtk_spin_button_get_value(fm_oscillator->sync_point[i * 2 + 1]) / old_samplerate)); } } void ags_fm_synth_input_line_fm_oscillator_control_changed_callback(AgsFMOscillator *fm_oscillator, AgsFMSynthInputLine *fm_synth_input_line) { AgsFMSynth *fm_synth; fm_synth = (AgsFMSynth *) gtk_widget_get_ancestor((GtkWidget *) fm_synth_input_line, AGS_TYPE_FM_SYNTH); if((AGS_FM_SYNTH_AUTO_UPDATE & (fm_synth->flags)) != 0){ ags_fm_synth_update(fm_synth); } } gsequencer-3.1.3/ags/X/machine/ags_ffplayer.h0000644000175000017500000000561213607210263016004 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_H__ #define __AGS_FFPLAYER_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FFPLAYER (ags_ffplayer_get_type()) #define AGS_FFPLAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FFPLAYER, AgsFFPlayer)) #define AGS_FFPLAYER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FFPLAYER, AgsFFPlayerClass)) #define AGS_IS_FFPLAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FFPLAYER)) #define AGS_IS_FFPLAYER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FFPLAYER)) #define AGS_FFPLAYER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_FFPLAYER, AgsFFPlayerClass)) #define AGS_FFPLAYER_DEFAULT_CONTROL_WIDTH (12) #define AGS_FFPLAYER_DEFAULT_CONTROL_HEIGHT (40) typedef struct _AgsFFPlayer AgsFFPlayer; typedef struct _AgsFFPlayerClass AgsFFPlayerClass; typedef enum{ AGS_FFPLAYER_NO_LOAD = 1, }AgsFFPlayerFlags; struct _AgsFFPlayer { AgsMachine machine; guint flags; guint mapped_output_pad; guint mapped_input_pad; gchar *name; gchar *xml_type; AgsAudioContainer *audio_container; GtkEntry *filename; GtkButton *open; AgsSF2Loader *sf2_loader; gint position; GtkLabel *loading; guint control_width; guint control_height; GtkDrawingArea *drawing_area; GtkHScrollbar *hscrollbar; GtkAdjustment *hadjustment; GtkComboBoxText *preset; GtkComboBoxText *instrument; GtkWidget *open_dialog; }; struct _AgsFFPlayerClass { AgsMachineClass machine; }; GType ags_ffplayer_get_type(void); void ags_ffplayer_paint(AgsFFPlayer *ffplayer); // char* ags_ffplayer_sound_string(); void ags_ffplayer_open_filename(AgsFFPlayer *ffplayer, gchar *filename); void ags_ffplayer_load_preset(AgsFFPlayer *ffplayer); void ags_ffplayer_load_instrument(AgsFFPlayer *ffplayer); gboolean ags_ffplayer_sf2_loader_completed_timeout(AgsFFPlayer *ffplayer); AgsFFPlayer* ags_ffplayer_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_FFPLAYER_H__*/ gsequencer-3.1.3/ags/X/machine/ags_pattern_box.h0000644000175000017500000000576313607210263016530 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PATTERN_BOX_H__ #define __AGS_PATTERN_BOX_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PATTERN_BOX (ags_pattern_box_get_type()) #define AGS_PATTERN_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PATTERN_BOX, AgsPatternBox)) #define AGS_PATTERN_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PATTERN_BOX, AgsPatternBoxClass)) #define AGS_IS_PATTERN_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PATTERN_BOX)) #define AGS_IS_PATTERN_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PATTERN_BOX)) #define AGS_PATTERN_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PATTERN_BOX, AgsPatternBoxClass)) #define AGS_PATTERN_BOX_DEFAULT_PAD_WIDTH (24) #define AGS_PATTERN_BOX_DEFAULT_PAD_HEIGHT (24) #define AGS_PATTERN_BOX_LED_DEFAULT_WIDTH (10) #define AGS_PATTERN_BOX_LED_DEFAULT_HEIGHT (10) #define AGS_PATTERN_BOX_N_CONTROLS (16) #define AGS_PATTERN_BOX_N_INDICES (4) typedef struct _AgsPatternBox AgsPatternBox; typedef struct _AgsPatternBoxClass AgsPatternBoxClass; typedef enum{ AGS_PATTERN_BOX_BLOCK_PATTERN = 1, AGS_PATTERN_BOX_CONNECTED = 1 << 1, }AgsPatternBoxFlags; typedef enum{ AGS_PATTERN_BOX_KEY_L_CONTROL = 1, AGS_PATTERN_BOX_KEY_R_CONTROL = 1 << 1, }AgsPatternBoxKeyMask; typedef enum{ AGS_PATTERN_BOX_MOVE_LEFT, AGS_PATTERN_BOX_MOVE_RIGHT, AGS_PATTERN_BOX_INDEX_DECREMENT, AGS_PATTERN_BOX_INDEX_INCREMENT, AGS_PATTERN_BOX_TOGGLE_PAD, AGS_PATTERN_BOX_COPY_PATTERN, }AgsPatternBoxAction; struct _AgsPatternBox { GtkTable table; guint flags; guint key_mask; guint n_controls; guint n_indices; guint cursor_x; guint cursor_y; guint active_led; AgsHLedArray *hled_array; GtkHBox *pattern; GtkVBox *offset; }; struct _AgsPatternBoxClass { GtkTableClass table; }; GType ags_pattern_box_get_type(void); gboolean ags_pattern_box_led_queue_draw_timeout(AgsPatternBox *pattern_box); void ags_pattern_box_set_pattern(AgsPatternBox *pattern_box); AgsPatternBox* ags_pattern_box_new(); G_END_DECLS #endif /*__AGS_PATTERN_BOX_H__*/ gsequencer-3.1.3/ags/X/machine/ags_synth_input_line.h0000644000175000017500000000426313607210263017570 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_INPUT_LINE_H__ #define __AGS_SYNTH_INPUT_LINE_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SYNTH_INPUT_LINE (ags_synth_input_line_get_type()) #define AGS_SYNTH_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SYNTH_INPUT_LINE, AgsSynthInputLine)) #define AGS_SYNTH_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SYNTH_INPUT_LINE, AgsSynthInputLineClass)) #define AGS_IS_SYNTH_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SYNTH_INPUT_LINE)) #define AGS_IS_SYNTH_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SYNTH_INPUT_LINE)) #define AGS_SYNTH_INPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SYNTH_INPUT_LINE, AgsSynthInputLineClass)) typedef struct _AgsSynthInputLine AgsSynthInputLine; typedef struct _AgsSynthInputLineClass AgsSynthInputLineClass; struct _AgsSynthInputLine { AgsLine line; gchar *name; gchar *xml_type; AgsOscillator *oscillator; }; struct _AgsSynthInputLineClass { AgsLineClass line; }; GType ags_synth_input_line_get_type(); AgsSynthInputLine* ags_synth_input_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_SYNTH_INPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_pattern_box_callbacks.c0000644000175000017500000002352413607210263020515 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include gboolean ags_pattern_box_focus_in_callback(GtkWidget *widget, GdkEvent *event, AgsPatternBox *pattern_box) { GList *list; list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x), GTK_STATE_PRELIGHT); g_list_free(list); return(TRUE); } gboolean ags_pattern_box_focus_out_callback(GtkWidget *widget, GdkEvent *event, AgsPatternBox *pattern_box) { GList *list; list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); if(!gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(list, pattern_box->cursor_x - 1))){ gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x), GTK_STATE_NORMAL); }else{ gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x), GTK_STATE_ACTIVE); } g_list_free(list); return(TRUE); } void ags_pattern_box_pad_callback(GtkWidget *toggle_button, AgsPatternBox *pattern_box) { AgsMachine *machine; AgsLine *selected_line; AgsPattern *pattern; GList *list, *list_start; GList *line, *line_start; GList *tasks; guint i, index0, index1, offset; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pattern_box, AGS_TYPE_MACHINE); if(machine->selected_input_pad == NULL){ return; } /* */ if((AGS_PATTERN_BOX_BLOCK_PATTERN & (pattern_box->flags)) != 0){ #ifdef AGS_DEBUG g_message("AgsPatternBox pattern is blocked\n"); #endif return; } /* calculate offset */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); for(i = 0; i < pattern_box->n_controls && toggle_button != list->data; i++){ list = list->next; } offset = i; g_list_free(list_start); /* retrieve indices */ index0 = machine->bank_0; index1 = machine->bank_1; /* calculate offset / page */ list_start = list = gtk_container_get_children((GtkContainer *) pattern_box->offset); for(i = 0; i < 4 && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(list->data)); i++){ list = list->next; } offset += (i * pattern_box->n_controls); g_list_free(list_start); /**/ line_start = line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(machine->selected_input_pad)->expander_set)); tasks = NULL; while((line = ags_line_find_next_grouped(line)) != NULL){ GList *start_pattern, *pattern; selected_line = AGS_LINE(line->data); g_object_get(selected_line->channel, "pattern", &start_pattern, NULL); /* toggle */ pattern = start_pattern; ags_pattern_toggle_bit(pattern->data, index0, index1, offset); g_list_free_full(start_pattern, g_object_unref); /* iterate */ line = line->next; } g_list_free(line_start); } void ags_pattern_box_offset_callback(GtkWidget *widget, AgsPatternBox *pattern_box) { ags_pattern_box_set_pattern(pattern_box); } gboolean ags_pattern_box_key_press_event(GtkWidget *widget, GdkEventKey *event, AgsPatternBox *pattern_box) { if(event->keyval == GDK_KEY_Tab){ return(FALSE); } switch(event->keyval){ case GDK_KEY_Control_L: { pattern_box->key_mask |= AGS_PATTERN_BOX_KEY_L_CONTROL; } break; case GDK_KEY_Control_R: { pattern_box->key_mask |= AGS_PATTERN_BOX_KEY_R_CONTROL; } break; case GDK_KEY_c: { /* copy notes */ if((AGS_PATTERN_BOX_KEY_L_CONTROL & (pattern_box->key_mask)) != 0 || (AGS_PATTERN_BOX_KEY_R_CONTROL & (pattern_box->key_mask)) != 0){ AgsMachine *machine; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pattern_box, AGS_TYPE_MACHINE); ags_machine_copy_pattern(machine); } } break; } return(TRUE); } gboolean ags_pattern_box_key_release_event(GtkWidget *widget, GdkEventKey *event, AgsPatternBox *pattern_box) { AgsMachine *machine; if(event->keyval == GDK_KEY_Tab){ return(FALSE); } machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) pattern_box, AGS_TYPE_MACHINE); switch(event->keyval){ case GDK_KEY_Control_L: { pattern_box->key_mask &= (~AGS_PATTERN_BOX_KEY_L_CONTROL); } break; case GDK_KEY_Control_R: { pattern_box->key_mask &= (~AGS_PATTERN_BOX_KEY_R_CONTROL); } break; case GDK_KEY_Left: case GDK_KEY_leftarrow: { if(pattern_box->cursor_x > 0){ GList *list; pattern_box->cursor_x -= 1; list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x), GTK_STATE_PRELIGHT); if(!gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(list, pattern_box->cursor_x + 1))){ gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x + 1), GTK_STATE_NORMAL); }else{ gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x + 1), GTK_STATE_ACTIVE); } if(gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(list, pattern_box->cursor_y * pattern_box->n_controls + pattern_box->cursor_x))){ /* give audible feedback */ ags_pad_play((AgsPad *) machine->selected_input_pad); } g_list_free(list); } } break; case GDK_KEY_Right: case GDK_KEY_rightarrow: { if(pattern_box->cursor_x + 1 < pattern_box->n_controls){ GList *list; pattern_box->cursor_x += 1; list = gtk_container_get_children((GtkContainer *) pattern_box->pattern); gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x), GTK_STATE_PRELIGHT); if(!gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(list, pattern_box->cursor_x - 1))){ gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x - 1), GTK_STATE_NORMAL); }else{ gtk_widget_set_state((GtkWidget *) g_list_nth_data(list, pattern_box->cursor_x - 1), GTK_STATE_ACTIVE); } if(gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(list, pattern_box->cursor_y * pattern_box->n_controls + pattern_box->cursor_x))){ /* give audible feedback */ ags_pad_play((AgsPad *) machine->selected_input_pad); } g_list_free(list); } } break; case GDK_KEY_Up: case GDK_KEY_uparrow: { if(pattern_box->cursor_y > 0){ GList *list, *pad; pattern_box->cursor_y -= 1; list = gtk_container_get_children((GtkContainer *) pattern_box->offset); gtk_button_clicked(g_list_nth_data(list, pattern_box->cursor_y)); g_list_free(list); /* give audible feedback */ pad = gtk_container_get_children((GtkContainer *) pattern_box->pattern); if(gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(pad, pattern_box->cursor_y * pattern_box->n_controls + pattern_box->cursor_x))){ ags_pad_play((AgsPad *) machine->selected_input_pad); } } } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { if(pattern_box->cursor_y + 1 < pattern_box->n_indices){ GList *list, *pad; list = gtk_container_get_children((GtkContainer *) pattern_box->offset); pattern_box->cursor_y += 1; gtk_button_clicked(g_list_nth_data(list, pattern_box->cursor_y)); g_list_free(list); /* give audible feedback */ pad = gtk_container_get_children((GtkContainer *) pattern_box->pattern); if(gtk_toggle_button_get_active((GtkToggleButton *) g_list_nth_data(pad, pattern_box->cursor_y * pattern_box->n_controls + pattern_box->cursor_x))){ ags_pad_play((AgsPad *) machine->selected_input_pad); } } } break; case GDK_KEY_space: { AgsLine *selected_line; AgsChannel *channel; GList *line, *line_start; GList *tasks; guint i, j; guint offset; guint index0, index1; i = pattern_box->cursor_y; j = pattern_box->cursor_x; offset = (i * pattern_box->n_controls) + j; index0 = machine->bank_0; index1 = machine->bank_1; line_start = line = gtk_container_get_children(GTK_CONTAINER(AGS_PAD(machine->selected_input_pad)->expander_set)); tasks = NULL; while((line = ags_line_find_next_grouped(line)) != NULL){ GList *start_pattern, *pattern; selected_line = AGS_LINE(line->data); channel = selected_line->channel; g_object_get(channel, "pattern", &start_pattern, NULL); /* toggle pattern */ pattern = start_pattern; ags_pattern_toggle_bit(pattern->data, index0, index1, offset); g_list_free_full(start_pattern, g_object_unref); /* iterate */ line = line->next; } g_list_free(line_start); /* give audible feedback */ ags_pad_play((AgsPad *) machine->selected_input_pad); } break; } return(TRUE); } gsequencer-3.1.3/ags/X/machine/ags_fm_synth_callbacks.h0000644000175000017500000000266313607210263020025 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNTH_CALLBACKS_H__ #define __AGS_FM_SYNTH_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_fm_synth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsFMSynth *fm_synth); void ags_fm_synth_auto_update_callback(GtkToggleButton *toggle, AgsFMSynth *fm_synth); void ags_fm_synth_update_callback(GtkButton *button, AgsFMSynth *fm_synth); void ags_fm_synth_lower_callback(GtkSpinButton *spin_button, AgsFMSynth *fm_synth); G_END_DECLS #endif /*__AGS_FM_SYNTH_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_fm_oscillator_callbacks.c0000644000175000017500000000477713605312647021045 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_fm_oscillator_wave_callback(GtkComboBox *combo, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_attack_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_frame_count_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_frequency_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_phase_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_volume_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_sync_point_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_fm_lfo_wave_callback(GtkComboBox *combo, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_fm_lfo_frequency_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_fm_lfo_depth_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } void ags_fm_oscillator_fm_tuning_callback(GtkSpinButton *spin_button, AgsFMOscillator *fm_oscillator) { ags_fm_oscillator_control_changed(fm_oscillator); } gsequencer-3.1.3/ags/X/machine/ags_equalizer10.h0000644000175000017500000000606013607210263016334 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EQUALIZER10_H__ #define __AGS_EQUALIZER10_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EQUALIZER10 (ags_equalizer10_get_type()) #define AGS_EQUALIZER10(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EQUALIZER10, AgsEqualizer10)) #define AGS_EQUALIZER10_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EQUALIZER10, AgsEqualizer10Class)) #define AGS_IS_EQUALIZER10(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EQUALIZER10)) #define AGS_IS_EQUALIZER10_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EQUALIZER10)) #define AGS_EQUALIZER10_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_EQUALIZER10, AgsEqualizer10Class)) typedef struct _AgsEqualizer10 AgsEqualizer10; typedef struct _AgsEqualizer10Class AgsEqualizer10Class; struct _AgsEqualizer10 { AgsMachine machine; gchar *name; gchar *xml_type; GtkScale *peak_28hz; GtkScale *peak_56hz; GtkScale *peak_112hz; GtkScale *peak_224hz; GtkScale *peak_448hz; GtkScale *peak_896hz; GtkScale *peak_1792hz; GtkScale *peak_3584hz; GtkScale *peak_7168hz; GtkScale *peak_14336hz; GtkScale *pressure; GList *peak_28hz_play_port; GList *peak_28hz_recall_port; GList *peak_56hz_play_port; GList *peak_56hz_recall_port; GList *peak_112hz_play_port; GList *peak_112hz_recall_port; GList *peak_224hz_play_port; GList *peak_224hz_recall_port; GList *peak_448hz_play_port; GList *peak_448hz_recall_port; GList *peak_896hz_play_port; GList *peak_896hz_recall_port; GList *peak_1792hz_play_port; GList *peak_1792hz_recall_port; GList *peak_3584hz_play_port; GList *peak_3584hz_recall_port; GList *peak_7168hz_play_port; GList *peak_7168hz_recall_port; GList *peak_14336hz_play_port; GList *peak_14336hz_recall_port; GList *pressure_play_port; GList *pressure_recall_port; }; struct _AgsEqualizer10Class { AgsMachineClass machine; }; GType ags_equalizer10_get_type(void); AgsPort* ags_equalizer10_find_specifier(GList *recall, gchar *specifier); AgsEqualizer10* ags_equalizer10_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_EQUALIZER10_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_input_line.c0000644000175000017500000003464513607210263017374 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_drum_input_line_class_init(AgsDrumInputLineClass *drum_input_line); void ags_drum_input_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_drum_input_line_init(AgsDrumInputLine *drum_input_line); void ags_drum_input_line_connect(AgsConnectable *connectable); void ags_drum_input_line_disconnect(AgsConnectable *connectable); void ags_drum_input_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_drum_input_line_group_changed(AgsLine *line); void ags_drum_input_line_map_recall(AgsLine *line, guint output_pad_start); /** * SECTION:ags_drum_input_line * @short_description: drum sequencer input line * @title: AgsDrumInputLine * @section_id: * @include: ags/X/machine/ags_drum_input_line.h * * The #AgsDrumInputLine is a composite widget to act as drum sequencer input line. */ static gpointer ags_drum_input_line_parent_class = NULL; static AgsConnectableInterface *ags_drum_input_line_parent_connectable_interface; extern GHashTable *ags_line_indicator_queue_draw; GType ags_drum_input_line_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_drum_input_line = 0; static const GTypeInfo ags_drum_input_line_info = { sizeof(AgsDrumInputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_drum_input_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDrumInputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_drum_input_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_drum_input_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_drum_input_line = g_type_register_static(AGS_TYPE_LINE, "AgsDrumInputLine", &ags_drum_input_line_info, 0); g_type_add_interface_static(ags_type_drum_input_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_drum_input_line); } return g_define_type_id__volatile; } void ags_drum_input_line_class_init(AgsDrumInputLineClass *drum_input_line) { AgsLineClass *line; ags_drum_input_line_parent_class = g_type_class_peek_parent(drum_input_line); /* AgsLineClass */ line = AGS_LINE_CLASS(drum_input_line); line->set_channel = ags_drum_input_line_set_channel; line->group_changed = ags_drum_input_line_group_changed; line->map_recall = ags_drum_input_line_map_recall; } void ags_drum_input_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_drum_input_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_drum_input_line_connect; connectable->disconnect = ags_drum_input_line_disconnect; } void ags_drum_input_line_init(AgsDrumInputLine *drum_input_line) { AgsLineMember *line_member; GtkWidget *widget; /* volume indicator */ line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", AGS_TYPE_VINDICATOR, "plugin-name", "ags-peak", "specifier", "./peak[0]", "control-port", "1/1", NULL); line_member->flags |= (AGS_LINE_MEMBER_PLAY_CALLBACK_WRITE | AGS_LINE_MEMBER_RECALL_CALLBACK_WRITE); ags_expander_add(AGS_LINE(drum_input_line)->expander, GTK_WIDGET(line_member), 0, 0, 1, 1); widget = gtk_bin_get_child(GTK_BIN(line_member)); AGS_LINE(drum_input_line)->indicator = widget; g_hash_table_insert(ags_line_indicator_queue_draw, widget, ags_line_indicator_queue_draw_timeout); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_line_indicator_queue_draw_timeout, (gpointer) widget); //TODO:JK: fix me // g_object_set(G_OBJECT(line_member), // "port-data", (gpointer) &(adjustment->value), // NULL); /* volume control */ line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", GTK_TYPE_VSCALE, "plugin-name", "ags-volume", "specifier", "./volume[0]", "control-port", "1/1", NULL); ags_expander_add(AGS_LINE(drum_input_line)->expander, GTK_WIDGET(line_member), 1, 0, 1, 1); widget = gtk_bin_get_child(GTK_BIN(line_member)); gtk_scale_set_digits(GTK_SCALE(widget), 3); gtk_range_set_range(GTK_RANGE(widget), 0.0, 2.00); gtk_range_set_increments(GTK_RANGE(widget), 0.025, 0.1); gtk_range_set_value(GTK_RANGE(widget), 1.0); gtk_range_set_inverted(GTK_RANGE(widget), TRUE); // g_object_set(G_OBJECT(line_member), // "port-data", (gpointer) &(GTK_RANGE(widget)->adjustment->value), // NULL); } void ags_drum_input_line_connect(AgsConnectable *connectable) { AgsDrumInputLine *drum_input_line; drum_input_line = AGS_DRUM_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(drum_input_line)->flags)) != 0){ return; } ags_drum_input_line_parent_connectable_interface->connect(connectable); /* empty */ } void ags_drum_input_line_disconnect(AgsConnectable *connectable) { AgsDrumInputLine *drum_input_line; drum_input_line = AGS_DRUM_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(drum_input_line)->flags)) != 0){ return; } ags_drum_input_line_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_drum_input_line_set_channel(AgsLine *line, AgsChannel *channel) { AgsChannel *old_channel; AgsRecycling *first_recycling; AgsAudioSignal *template; GObject *output_soundcard; GList *start_list; guint nth_line; if(line->channel != NULL){ old_channel = line->channel; }else{ old_channel = NULL; } /* call parent */ AGS_LINE_CLASS(ags_drum_input_line_parent_class)->set_channel(line, channel); if(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_PLAYBACK)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, "line", &nth_line, NULL); if(first_recycling != NULL){ g_object_unref(first_recycling); } #ifdef AGS_DEBUG g_message("ags_drum_input_line_set_channel - channel: %u", nth_line); #endif /* get some fields */ g_object_get(first_recycling, "audio-signal", &start_list, NULL); template = ags_audio_signal_get_template(start_list); /* create audio signal */ if(output_soundcard != NULL && template == NULL){ AgsAudioSignal *audio_signal; audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(first_recycling, audio_signal); }else{ g_object_unref(template); } /* reset edit button */ if(old_channel == NULL && nth_line == 0){ AgsDrum *drum; GtkToggleButton *selected_edit_button; GList *list; drum = (AgsDrum *) gtk_widget_get_ancestor(GTK_WIDGET(line), AGS_TYPE_DRUM); if(drum != NULL){ list = gtk_container_get_children((GtkContainer *) drum->input_pad); drum->selected_pad = AGS_DRUM_INPUT_PAD(list->data); drum->selected_edit_button = drum->selected_pad->edit; gtk_toggle_button_set_active((GtkToggleButton *) drum->selected_edit_button, TRUE); g_list_free(list); } } g_list_free_full(start_list, g_object_unref); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } } } void ags_drum_input_line_group_changed(AgsLine *line) { AgsDrum *drum; drum = (AgsDrum *) gtk_widget_get_ancestor(GTK_WIDGET(line), AGS_TYPE_DRUM); ags_pattern_box_set_pattern(drum->pattern_box); } void ags_drum_input_line_map_recall(AgsLine *line, guint output_pad_start) { AgsLineMember *line_member; AgsAudio *audio; AgsChannel *source; AgsChannel *current; AgsPort *port; AgsRecallHandler *recall_handler; AgsCopyPatternChannel *copy_pattern_channel; AgsPlayChannel *play_channel; AgsPlayChannelRun *play_channel_run; AgsPeakChannelRun *recall_peak_channel_run, *play_peak_channel_run; AgsStreamChannelRun *stream_channel_run; GList *start_play, *play; GList *start_recall, *recall; guint pad, audio_channel; guint i; if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 || (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){ return; } source = line->channel; /* get some fields */ g_object_get(source, "audio", &audio, "pad", &pad, "audio-channel", &audio_channel, NULL); /* ags-peak */ ags_recall_factory_create(audio, NULL, NULL, "ags-peak", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-copy-pattern */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy-pattern", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_REMAP | AGS_RECALL_FACTORY_RECALL), 0); /* set pattern object on port */ g_object_get(source, "recall", &start_recall, NULL); recall = ags_recall_template_find_type(start_recall, AGS_TYPE_COPY_PATTERN_CHANNEL); if(recall != NULL){ GList *pattern; GValue pattern_value = {0,}; copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(recall->data); g_object_get(copy_pattern_channel, "pattern", &port, NULL); g_object_get(source, "pattern", &pattern, NULL); g_value_init(&pattern_value, G_TYPE_OBJECT); g_value_set_object(&pattern_value, pattern->data); ags_port_safe_write(port, &pattern_value); g_object_unref(port); g_list_free_full(pattern, g_object_unref); } g_list_free_full(start_recall, g_object_unref); if(ags_recall_global_get_rt_safe()){ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); g_object_get(source, "play", &start_play, NULL); play = start_play; while((play = ags_recall_find_type(play, AGS_TYPE_PLAY_CHANNEL)) != NULL){ GValue audio_channel_value = {0,}; play_channel = AGS_PLAY_CHANNEL(play->data); g_object_get(play_channel, "audio-channel", &port, NULL); g_value_init(&audio_channel_value, G_TYPE_UINT64); g_value_set_uint64(&audio_channel_value, audio_channel); ags_port_safe_write(port, &audio_channel_value); g_object_unref(port); play = play->next; } g_list_free_full(start_play, g_object_unref); /* ags-volume */ ags_recall_factory_create(audio, NULL, NULL, "ags-volume", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!ags_recall_global_get_rt_safe()){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(source, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); } g_object_unref(audio); /* call parent */ AGS_LINE_CLASS(ags_drum_input_line_parent_class)->map_recall(line, output_pad_start); } /** * ags_drum_input_line_new: * @channel: the assigned channel * * Creates an #AgsDrumInputLine * * Returns: a new #AgsDrumInputLine * * Since: 3.0.0 */ AgsDrumInputLine* ags_drum_input_line_new(AgsChannel *channel) { AgsDrumInputLine *drum_input_line; drum_input_line = (AgsDrumInputLine *) g_object_new(AGS_TYPE_DRUM_INPUT_LINE, "channel", channel, NULL); return(drum_input_line); } gsequencer-3.1.3/ags/X/machine/ags_drum.h0000644000175000017500000000460313607210263015142 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_H__ #define __AGS_DRUM_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DRUM (ags_drum_get_type()) #define AGS_DRUM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DRUM, AgsDrum)) #define AGS_DRUM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DRUM, AgsDrumClass)) #define AGS_IS_DRUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DRUM)) #define AGS_IS_DRUM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DRUM)) #define AGS_DRUM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_DRUM, AgsDrumClass)) typedef struct _AgsDrum AgsDrum; typedef struct _AgsDrumClass AgsDrumClass; struct _AgsDrum { AgsMachine machine; guint flags; gchar *name; gchar *xml_type; GtkButton *open; GtkWidget *open_dialog; GtkCheckButton *loop_button; GtkSpinButton *length_spin; GtkToggleButton *run; GtkVBox *vbox; GtkHBox *input_pad; GtkVBox *output_pad; GtkToggleButton *selected_edit_button; AgsDrumInputPad *selected_pad; AgsLine *selected_line; GtkToggleButton *index0[4]; GtkToggleButton *selected0; GtkToggleButton *index1[12]; GtkToggleButton *selected1; AgsPatternBox *pattern_box; }; struct _AgsDrumClass { AgsMachineClass machine; }; GType ags_drum_get_type(void); AgsDrum* ags_drum_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_DRUM_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_synth_callbacks.c0000644000175000017500000000373113607210263020015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_fm_synth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsFMSynth *fm_synth) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_FM_SYNTH)->counter); g_object_set(AGS_MACHINE(fm_synth), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_FM_SYNTH); g_free(str); } void ags_fm_synth_auto_update_callback(GtkToggleButton *toggle, AgsFMSynth *fm_synth) { if(gtk_toggle_button_get_active(toggle)){ fm_synth->flags |= AGS_FM_SYNTH_AUTO_UPDATE; }else{ fm_synth->flags &= (~AGS_FM_SYNTH_AUTO_UPDATE); } } void ags_fm_synth_update_callback(GtkButton *button, AgsFMSynth *fm_synth) { ags_fm_synth_update(fm_synth); } void ags_fm_synth_lower_callback(GtkSpinButton *spin_button, AgsFMSynth *fm_synth) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/machine/ags_panel_input_line_callbacks.h0000644000175000017500000000212313607210263021512 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PANEL_INPUT_LINE_CALLBACKS_H__ #define __AGS_PANEL_INPUT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_PANEL_INPUT_LINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_mixer_callbacks.h0000644000175000017500000000224613607210263017317 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIXER_CALLBACKS_H__ #define __AGS_MIXER_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_mixer_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsMixer *mixer); G_END_DECLS #endif /*__AGS_MIXER_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler.h0000644000175000017500000000625013607210263017025 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PITCH_SAMPLER_H__ #define __AGS_PITCH_SAMPLER_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PITCH_SAMPLER (ags_pitch_sampler_get_type()) #define AGS_PITCH_SAMPLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PITCH_SAMPLER, AgsPitchSampler)) #define AGS_PITCH_SAMPLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PITCH_SAMPLER, AgsPitchSamplerClass)) #define AGS_IS_PITCH_SAMPLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PITCH_SAMPLER)) #define AGS_IS_PITCH_SAMPLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PITCH_SAMPLER)) #define AGS_PITCH_SAMPLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_PITCH_SAMPLER, AgsPitchSamplerClass)) #define AGS_PITCH_SAMPLER_LFO_FREQ_MIN (0.0) #define AGS_PITCH_SAMPLER_LFO_FREQ_MAX (20.0) #define AGS_PITCH_SAMPLER_DEFAULT_LFO_FREQ (6.0) typedef struct _AgsPitchSampler AgsPitchSampler; typedef struct _AgsPitchSamplerClass AgsPitchSamplerClass; typedef enum{ AGS_PITCH_SAMPLER_AUTO_UPDATE = 1, }AgsPitch_SamplerFlags; struct _AgsPitchSampler { AgsMachine machine; guint flags; guint mapped_output_pad; guint mapped_input_pad; gchar *name; gchar *xml_type; AgsAudioContainer *audio_container; GtkVBox *file; GtkEntry *filename; GtkButton *open; AgsSFZLoader *sfz_loader; gint position; GtkLabel *loading; GtkCheckButton *enable_lfo; GtkSpinButton *lfo_freq; GtkSpinButton *lfo_phase; GtkSpinButton *lfo_depth; GtkSpinButton *lfo_tuning; GtkFileChooserDialog *open_dialog; }; struct _AgsPitchSamplerClass { AgsMachineClass machine; }; GType ags_pitch_sampler_get_type(void); void ags_pitch_sampler_add_file(AgsPitchSampler *pitch_sampler, AgsPitchSamplerFile *file); void ags_pitch_sampler_remove_file(AgsPitchSampler *pitch_sampler, guint nth); void ags_pitch_sampler_open_filename(AgsPitchSampler *pitch_sampler, gchar *filename); void ags_pitch_sampler_update(AgsPitchSampler *pitch_sampler); gboolean ags_pitch_sampler_sfz_loader_completed_timeout(AgsPitchSampler *pitch_sampler); AgsPitchSampler* ags_pitch_sampler_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_PITCH_SAMPLER_H__*/ gsequencer-3.1.3/ags/X/machine/ags_audiorec.h0000644000175000017500000000474713607210263015777 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIOREC_H__ #define __AGS_AUDIOREC_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIOREC (ags_audiorec_get_type()) #define AGS_AUDIOREC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIOREC, AgsAudiorec)) #define AGS_AUDIOREC_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIOREC, AgsAudiorecClass)) #define AGS_IS_AUDIOREC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUDIOREC)) #define AGS_IS_AUDIOREC_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIOREC)) #define AGS_AUDIOREC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUDIOREC, AgsAudiorecClass)) typedef struct _AgsAudiorec AgsAudiorec; typedef struct _AgsAudiorecClass AgsAudiorecClass; struct _AgsAudiorec { AgsMachine machine; guint mapped_output_pad; guint mapped_input_pad; gchar *name; gchar *xml_type; GtkEntry *filename; GtkButton *open; AgsWaveLoader *wave_loader; gint position; GtkLabel *loading; GtkRadioButton *keep_data; GtkRadioButton *mix_data; GtkRadioButton *replace_data; GtkVBox *hindicator_vbox; GtkFileChooserDialog *open_dialog; }; struct _AgsAudiorecClass { AgsMachineClass machine; }; GType ags_audiorec_get_type(void); void ags_audiorec_open_filename(AgsAudiorec *audiorec, gchar *filename); gboolean ags_audiorec_wave_loader_completed_timeout(AgsAudiorec *audiorec); gboolean ags_audiorec_indicator_queue_draw_timeout(AgsAudiorec *audiorec); AgsAudiorec* ags_audiorec_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_AUDIOREC_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_bridge_callbacks.c0000644000175000017500000000147313605312647021322 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/machine/ags_mixer_input_line.c0000644000175000017500000002062013607210263017535 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_mixer_input_line_class_init(AgsMixerInputLineClass *mixer_input_line); void ags_mixer_input_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_mixer_input_line_init(AgsMixerInputLine *mixer_input_line); void ags_mixer_input_line_connect(AgsConnectable *connectable); void ags_mixer_input_line_disconnect(AgsConnectable *connectable); void ags_mixer_input_line_set_channel(AgsLine *line, AgsChannel *channel); void ags_mixer_input_line_map_recall(AgsLine *line, guint output_pad_start); /** * SECTION:ags_mixer_input_line * @short_description: mixer input line * @title: AgsMixerInputLine * @section_id: * @include: ags/X/machine/ags_mixer_input_line.h * * The #AgsMixerInputLine is a composite widget to act as mixer input line. */ static gpointer ags_mixer_input_line_parent_class = NULL; static AgsConnectableInterface *ags_mixer_input_line_parent_connectable_interface; extern GHashTable *ags_line_indicator_queue_draw; GType ags_mixer_input_line_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mixer_input_line = 0; static const GTypeInfo ags_mixer_input_line_info = { sizeof(AgsMixerInputLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mixer_input_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMixerInputLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mixer_input_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_mixer_input_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_mixer_input_line = g_type_register_static(AGS_TYPE_LINE, "AgsMixerInputLine", &ags_mixer_input_line_info, 0); g_type_add_interface_static(ags_type_mixer_input_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_mixer_input_line); } return g_define_type_id__volatile; } void ags_mixer_input_line_class_init(AgsMixerInputLineClass *mixer_input_line) { AgsLineClass *line; ags_mixer_input_line_parent_class = g_type_class_peek_parent(mixer_input_line); /* AgsLineClass */ line = AGS_LINE_CLASS(mixer_input_line); line->set_channel = ags_mixer_input_line_set_channel; line->map_recall = ags_mixer_input_line_map_recall; } void ags_mixer_input_line_connectable_interface_init(AgsConnectableInterface *connectable) { ags_mixer_input_line_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_mixer_input_line_connect; connectable->disconnect = ags_mixer_input_line_disconnect; } void ags_mixer_input_line_init(AgsMixerInputLine *mixer_input_line) { AgsLineMember *line_member; GtkWidget *widget; GtkAdjustment *adjustment; /* volume indicator */ line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", AGS_TYPE_VINDICATOR, "plugin-name", "ags-peak", "specifier", "./peak[0]", "control-port", "1/1", NULL); line_member->flags |= (AGS_LINE_MEMBER_PLAY_CALLBACK_WRITE | AGS_LINE_MEMBER_RECALL_CALLBACK_WRITE); ags_expander_add(AGS_LINE(mixer_input_line)->expander, GTK_WIDGET(line_member), 0, 0, 1, 1); widget = gtk_bin_get_child(GTK_BIN(line_member)); AGS_LINE(mixer_input_line)->indicator = widget; g_hash_table_insert(ags_line_indicator_queue_draw, widget, ags_line_indicator_queue_draw_timeout); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_line_indicator_queue_draw_timeout, (gpointer) widget); /* volume */ line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", GTK_TYPE_VSCALE, "plugin-name", "ags-volume", "specifier", "./volume[0]", "control-port", "1/1", NULL); ags_expander_add(AGS_LINE(mixer_input_line)->expander, GTK_WIDGET(line_member), 1, 0, 1, 1); widget = gtk_bin_get_child(GTK_BIN(line_member)); gtk_scale_set_digits(GTK_SCALE(widget), 3); gtk_range_set_range(GTK_RANGE(widget), 0.0, 2.00); gtk_range_set_increments(GTK_RANGE(widget), 0.025, 0.1); gtk_range_set_value(GTK_RANGE(widget), 1.0); gtk_range_set_inverted(GTK_RANGE(widget), TRUE); } void ags_mixer_input_line_connect(AgsConnectable *connectable) { AgsMixerInputLine *mixer_input_line; mixer_input_line = AGS_MIXER_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(mixer_input_line)->flags)) != 0){ return; } ags_mixer_input_line_parent_connectable_interface->connect(connectable); } void ags_mixer_input_line_disconnect(AgsConnectable *connectable) { AgsMixerInputLine *mixer_input_line; mixer_input_line = AGS_MIXER_INPUT_LINE(connectable); if((AGS_LINE_CONNECTED & (AGS_LINE(mixer_input_line)->flags)) == 0){ return; } ags_mixer_input_line_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_mixer_input_line_set_channel(AgsLine *line, AgsChannel *channel) { AGS_LINE_CLASS(ags_mixer_input_line_parent_class)->set_channel(line, channel); /* empty */ } void ags_mixer_input_line_map_recall(AgsLine *line, guint output_pad_start) { AgsAudio *audio; AgsChannel *source; AgsRecallHandler *recall_handler; AgsPeakChannelRun *recall_peak_channel_run, *play_peak_channel_run; GList *list; guint pad, audio_channel; if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0 || (AGS_LINE_PREMAPPED_RECALL & (line->flags)) != 0){ return; } source = line->channel; /* get some fields */ g_object_get(source, "audio", &audio, "pad", &pad, "audio-channel", &audio_channel, NULL); /* ags-peak */ ags_recall_factory_create(audio, NULL, NULL, "ags-peak", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-mute */ ags_recall_factory_create(audio, NULL, NULL, "ags-mute", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-volume */ ags_recall_factory_create(audio, NULL, NULL, "ags-volume", audio_channel, audio_channel + 1, pad, pad + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* call parent */ AGS_LINE_CLASS(ags_mixer_input_line_parent_class)->map_recall(line, output_pad_start); g_object_unref(audio); } /** * ags_mixer_input_line_new: * @channel: the assigned channel * * Create a new instance of #AgsMixerInputLine * * Returns: the new #AgsMixerInputLine * * Since: 3.0.0 */ AgsMixerInputLine* ags_mixer_input_line_new(AgsChannel *channel) { AgsMixerInputLine *mixer_input_line; mixer_input_line = (AgsMixerInputLine *) g_object_new(AGS_TYPE_MIXER_INPUT_LINE, "channel", channel, NULL); return(mixer_input_line); } gsequencer-3.1.3/ags/X/machine/ags_pitch_sampler_file.h0000644000175000017500000000461713607210263020031 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PITCH_SAMPLER_FILE_H__ #define __AGS_PITCH_SAMPLER_FILE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PITCH_SAMPLER_FILE (ags_pitch_sampler_file_get_type()) #define AGS_PITCH_SAMPLER_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PITCH_SAMPLER_FILE, AgsPitchSamplerFile)) #define AGS_PITCH_SAMPLER_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PITCH_SAMPLER_FILE, AgsPitchSamplerFileClass)) #define AGS_IS_PITCH_SAMPLER_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PITCH_SAMPLER_FILE)) #define AGS_IS_PITCH_SAMPLER_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PITCH_SAMPLER_FILE)) #define AGS_PITCH_SAMPLER_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_PITCH_SAMPLER_FILE, AgsPitchSamplerFileClass)) typedef struct _AgsPitchSamplerFile AgsPitchSamplerFile; typedef struct _AgsPitchSamplerFileClass AgsPitchSamplerFileClass; typedef enum{ AGS_PITCH_SAMPLER_FILE_CONNECTED = 1, }AgsPitchSamplerFileFlags; struct _AgsPitchSamplerFile { GtkVBox vbox; guint flags; GtkEntry *filename; GtkLabel *freq; GtkLabel *base_key; GtkLabel *loop_start; GtkLabel *loop_end; }; struct _AgsPitchSamplerFileClass { GtkVBoxClass vbox; void (*control_changed)(AgsPitchSamplerFile *pitch_sampler_file); }; GType ags_pitch_sampler_file_get_type(void); AgsPitchSamplerFile* ags_pitch_sampler_file_new(); G_END_DECLS #endif /*__AGS_PITCH_SAMPLER_FILE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_pad_callbacks.h0000644000175000017500000000213313607210263022041 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FFPLAYER_INPUT_PAD_CALLBACKS_H__ #define __AGS_FFPLAYER_INPUT_PAD_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_FFPLAYER_INPUT_PAD_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_drum_callbacks.h0000644000175000017500000000332213607210263017136 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_CALLBACKS_H__ #define __AGS_DRUM_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_drum_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsDrum *drum); void ags_drum_destroy_callback(GtkWidget *widget, AgsDrum *drum); /* controls */ void ags_drum_open_callback(GtkWidget *toggle_button, AgsDrum *drum); void ags_drum_loop_button_callback(GtkWidget *button, AgsDrum *drum); void ags_drum_length_spin_callback(GtkWidget *spin_button, AgsDrum *drum); void ags_drum_index0_callback(GtkWidget *toggle_button, AgsDrum *drum); void ags_drum_index1_callback(GtkWidget *toggle_button, AgsDrum *drum); /* audio */ void ags_drum_stop_callback(AgsDrum *drum, GList *recall_id, gint sound_scope, gpointer data); G_END_DECLS #endif /*__AGS_DRUM_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_fm_synth_input_line_callbacks.h0000644000175000017500000000273513607210263022253 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNTH_INPUT_LINE_CALLBACKS_H__ #define __AGS_FM_SYNTH_INPUT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_fm_synth_input_line_samplerate_changed_callback(AgsLine *line, guint samplerate, guint old_samplerate, gpointer user_data); void ags_fm_synth_input_line_fm_oscillator_control_changed_callback(AgsFMOscillator *fm_oscillator, AgsFMSynthInputLine *fm_synth_input_line); G_END_DECLS #endif /*__AGS_FM_SYNTH_INPUT_LINE_CALLBACKS_H__ */ gsequencer-3.1.3/ags/X/machine/ags_equalizer10.c0000644000175000017500000007062513607210263016337 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_equalizer10_class_init(AgsEqualizer10Class *equalizer10); void ags_equalizer10_connectable_interface_init(AgsConnectableInterface *connectable); void ags_equalizer10_init(AgsEqualizer10 *equalizer10); void ags_equalizer10_finalize(GObject *gobject); void ags_equalizer10_map_recall(AgsMachine *machine); void ags_equalizer10_connect(AgsConnectable *connectable); void ags_equalizer10_disconnect(AgsConnectable *connectable); /** * SECTION:ags_equalizer10 * @short_description: equalizer10 sequencer * @title: AgsEqualizer10 * @section_id: * @include: ags/X/machine/ags_equalizer10.h * * The #AgsEqualizer10 is a composite widget to act as equalizer10 sequencer. */ static gpointer ags_equalizer10_parent_class = NULL; static AgsConnectableInterface *ags_equalizer10_parent_connectable_interface; GType ags_equalizer10_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_equalizer10 = 0; static const GTypeInfo ags_equalizer10_info = { sizeof(AgsEqualizer10Class), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_equalizer10_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEqualizer10), 0, /* n_preallocs */ (GInstanceInitFunc) ags_equalizer10_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_equalizer10_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_equalizer10 = g_type_register_static(AGS_TYPE_MACHINE, "AgsEqualizer10", &ags_equalizer10_info, 0); g_type_add_interface_static(ags_type_equalizer10, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_equalizer10); } return g_define_type_id__volatile; } void ags_equalizer10_class_init(AgsEqualizer10Class *equalizer10) { GObjectClass *gobject; AgsMachineClass *machine; ags_equalizer10_parent_class = g_type_class_peek_parent(equalizer10); /* GObjectClass */ gobject = (GObjectClass *) equalizer10; gobject->finalize = ags_equalizer10_finalize; /* */ machine = (AgsMachineClass *) equalizer10; machine->map_recall = ags_equalizer10_map_recall; } void ags_equalizer10_connectable_interface_init(AgsConnectableInterface *connectable) { ags_equalizer10_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_equalizer10_connect; connectable->disconnect = ags_equalizer10_disconnect; } void ags_equalizer10_init(AgsEqualizer10 *equalizer10) { GtkVBox *vbox; GtkHBox *hbox; GtkVBox *control_vbox; GtkLabel *label; g_signal_connect_after((GObject *) equalizer10, "parent_set", G_CALLBACK(ags_equalizer10_parent_set_callback), (gpointer) equalizer10); ags_audio_set_flags(AGS_MACHINE(equalizer10)->audio, (AGS_AUDIO_SYNC)); g_object_set(AGS_MACHINE(equalizer10)->audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, NULL); equalizer10->name = NULL; equalizer10->xml_type = "ags-equalizer10"; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer*) gtk_bin_get_child((GtkBin *) equalizer10), (GtkWidget *) vbox); /* controls */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 4); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); /* peak 28 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_28hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_28hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_28hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_28hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_28hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("28Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 56 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_56hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_56hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_56hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_56hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_56hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("56Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 112 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_112hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_112hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_112hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_112hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_112hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("112Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 224 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_224hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_224hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_224hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_224hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_224hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("224Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 448 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_448hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_448hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_448hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_448hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_448hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("448Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 896 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_896hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_896hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_896hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_896hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_896hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("896Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 1792 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_1792hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_1792hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_1792hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_1792hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_1792hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("1792Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 3584 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_3584hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_3584hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_3584hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_3584hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_3584hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("3584Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 7168 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_7168hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_7168hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_7168hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_7168hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_7168hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("7168Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* peak 14336 hz */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->peak_14336hz = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->peak_14336hz, TRUE); gtk_range_set_value((GtkRange *) equalizer10->peak_14336hz, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->peak_14336hz, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->peak_14336hz, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("14336Hz")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); /* pressure */ control_vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) control_vbox, FALSE, FALSE, 0); equalizer10->pressure = (GtkScale *) gtk_vscale_new_with_range(0.0, 2.0, 0.01); gtk_range_set_inverted((GtkRange *) equalizer10->pressure, TRUE); gtk_range_set_value((GtkRange *) equalizer10->pressure, 1.0); gtk_widget_set_size_request((GtkWidget *) equalizer10->pressure, -1, 100); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) equalizer10->pressure, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("pressure")); gtk_box_pack_start((GtkBox *) control_vbox, (GtkWidget *) label, FALSE, FALSE, 0); equalizer10->peak_28hz_play_port = NULL; equalizer10->peak_28hz_recall_port = NULL; equalizer10->peak_56hz_play_port = NULL; equalizer10->peak_56hz_recall_port = NULL; equalizer10->peak_112hz_play_port = NULL; equalizer10->peak_112hz_recall_port = NULL; equalizer10->peak_224hz_play_port = NULL; equalizer10->peak_224hz_recall_port = NULL; equalizer10->peak_448hz_play_port = NULL; equalizer10->peak_448hz_recall_port = NULL; equalizer10->peak_896hz_play_port = NULL; equalizer10->peak_896hz_recall_port = NULL; equalizer10->peak_1792hz_play_port = NULL; equalizer10->peak_1792hz_recall_port = NULL; equalizer10->peak_3584hz_play_port = NULL; equalizer10->peak_3584hz_recall_port = NULL; equalizer10->peak_7168hz_play_port = NULL; equalizer10->peak_7168hz_recall_port = NULL; equalizer10->peak_14336hz_play_port = NULL; equalizer10->peak_14336hz_recall_port = NULL; equalizer10->pressure_play_port = NULL; equalizer10->pressure_recall_port = NULL; } void ags_equalizer10_finalize(GObject *gobject) { AgsEqualizer10 *equalizer10; equalizer10 = (AgsEqualizer10 *) gobject; g_list_free_full(equalizer10->peak_28hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_28hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_56hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_56hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_112hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_112hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_224hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_224hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_448hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_448hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_896hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_896hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_1792hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_1792hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_3584hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_3584hz_recall_port, g_object_unref); g_list_free_full(equalizer10->peak_14336hz_play_port, g_object_unref); g_list_free_full(equalizer10->peak_14336hz_recall_port, g_object_unref); g_list_free_full(equalizer10->pressure_play_port, g_object_unref); g_list_free_full(equalizer10->pressure_recall_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_equalizer10_parent_class)->finalize(gobject); } void ags_equalizer10_connect(AgsConnectable *connectable) { AgsEqualizer10 *equalizer10; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } /* call parent */ ags_equalizer10_parent_connectable_interface->connect(connectable); equalizer10 = AGS_EQUALIZER10(connectable); g_signal_connect_after(equalizer10, "resize-audio-channels", G_CALLBACK(ags_equalizer10_resize_audio_channels_callback), NULL); g_signal_connect_after(equalizer10, "resize-pads", G_CALLBACK(ags_equalizer10_resize_pads_callback), NULL); /* controls */ g_signal_connect_after(equalizer10->peak_28hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_28hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_56hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_56hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_112hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_112hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_224hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_224hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_448hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_448hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_896hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_896hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_1792hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_1792hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_3584hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_3584hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_7168hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_7168hz_callback), equalizer10); g_signal_connect_after(equalizer10->peak_14336hz, "value-changed", G_CALLBACK(ags_equalizer10_peak_14336hz_callback), equalizer10); g_signal_connect_after(equalizer10->pressure, "value-changed", G_CALLBACK(ags_equalizer10_pressure_callback), equalizer10); } void ags_equalizer10_disconnect(AgsConnectable *connectable) { AgsEqualizer10 *equalizer10; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } equalizer10 = AGS_EQUALIZER10(connectable); g_object_disconnect(equalizer10, "any_signal::resize-audio-channels", G_CALLBACK(ags_equalizer10_resize_audio_channels_callback), NULL, NULL); g_object_disconnect(equalizer10, "any_signal::resize-pads", G_CALLBACK(ags_equalizer10_resize_pads_callback), NULL, NULL); /* controls */ g_object_disconnect(equalizer10->peak_28hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_28hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_56hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_56hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_112hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_112hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_224hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_224hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_448hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_448hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_896hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_896hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_1792hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_1792hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_3584hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_3584hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_7168hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_7168hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->peak_14336hz, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_peak_14336hz_callback), equalizer10, NULL); g_object_disconnect(equalizer10->pressure, "any_signal::value-changed", G_CALLBACK(ags_equalizer10_pressure_callback), equalizer10, NULL); /* call parent */ ags_equalizer10_parent_connectable_interface->disconnect(connectable); } void ags_equalizer10_map_recall(AgsMachine *machine) { AgsEqualizer10 *equalizer10; AgsAudio *audio; AgsChannel *start_input; AgsChannel *channel, *next_channel; guint audio_channels; guint i; equalizer10 = (AgsEqualizer10 *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, "input", &start_input, NULL); /* ags-eq10 */ ags_recall_factory_create(audio, NULL, NULL, "ags-eq10", 0, audio_channels, 0, 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; i < audio_channels && channel != NULL; i++){ AgsPort *port; GList *start_play, *play; GList *start_recall, *recall; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); /* peak 28Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-28hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_28hz_play_port = g_list_prepend(equalizer10->peak_28hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-28hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_28hz_recall_port = g_list_prepend(equalizer10->peak_28hz_recall_port, port); } /* peak 56Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-56hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_56hz_play_port = g_list_prepend(equalizer10->peak_56hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-56hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_56hz_recall_port = g_list_prepend(equalizer10->peak_56hz_recall_port, port); } /* peak 112Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-112hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_112hz_play_port = g_list_prepend(equalizer10->peak_112hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-112hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_112hz_recall_port = g_list_prepend(equalizer10->peak_112hz_recall_port, port); } /* peak 224Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-224hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_224hz_play_port = g_list_prepend(equalizer10->peak_224hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-224hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_224hz_recall_port = g_list_prepend(equalizer10->peak_224hz_recall_port, port); } /* peak 448Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-448hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_448hz_play_port = g_list_prepend(equalizer10->peak_448hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-448hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_448hz_recall_port = g_list_prepend(equalizer10->peak_448hz_recall_port, port); } /* peak 896Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-896hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_896hz_play_port = g_list_prepend(equalizer10->peak_896hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-896hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_896hz_recall_port = g_list_prepend(equalizer10->peak_896hz_recall_port, port); } /* peak 1792Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-1792hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_1792hz_play_port = g_list_prepend(equalizer10->peak_1792hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-1792hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_1792hz_recall_port = g_list_prepend(equalizer10->peak_1792hz_recall_port, port); } /* peak 3584Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-3584hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_3584hz_play_port = g_list_prepend(equalizer10->peak_3584hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-3584hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_3584hz_recall_port = g_list_prepend(equalizer10->peak_3584hz_recall_port, port); } /* peak 7168Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-7168hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_7168hz_play_port = g_list_prepend(equalizer10->peak_7168hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-7168hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_7168hz_recall_port = g_list_prepend(equalizer10->peak_7168hz_recall_port, port); } /* peak 14336Hz - find port */ port = ags_equalizer10_find_specifier(start_play, "./peak-14336hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_14336hz_play_port = g_list_prepend(equalizer10->peak_14336hz_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./peak-14336hz[0]"); if(port != NULL){ g_object_ref(port); equalizer10->peak_14336hz_recall_port = g_list_prepend(equalizer10->peak_14336hz_recall_port, port); } /* pressure - find port */ port = ags_equalizer10_find_specifier(start_play, "./pressure[0]"); if(port != NULL){ g_object_ref(port); equalizer10->pressure_play_port = g_list_prepend(equalizer10->pressure_play_port, port); } port = ags_equalizer10_find_specifier(start_recall, "./pressure[0]"); if(port != NULL){ g_object_ref(port); equalizer10->pressure_recall_port = g_list_prepend(equalizer10->pressure_recall_port, port); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_input != NULL){ g_object_unref(start_input); } if(next_channel != NULL){ g_object_unref(next_channel); } /* call parent */ AGS_MACHINE_CLASS(ags_equalizer10_parent_class)->map_recall(machine); } AgsPort* ags_equalizer10_find_specifier(GList *recall, gchar *specifier) { GList *port; while(recall != NULL){ port = AGS_RECALL(recall->data)->port; #ifdef AGS_DEBUG g_message("search port in %s", G_OBJECT_TYPE_NAME(recall->data)); #endif while(port != NULL){ if(!g_strcmp0(AGS_PORT(port->data)->specifier, specifier)){ return(AGS_PORT(port->data)); } port = port->next; } recall = recall->next; } return(NULL); } /** * ags_equalizer10_new: * @soundcard: the assigned soundcard. * * Creates an #AgsEqualizer10 * * Returns: a new #AgsEqualizer10 * * Since: 3.0.0 */ AgsEqualizer10* ags_equalizer10_new(GObject *soundcard) { AgsEqualizer10 *equalizer10; equalizer10 = (AgsEqualizer10 *) g_object_new(AGS_TYPE_EQUALIZER10, NULL); g_object_set(G_OBJECT(AGS_MACHINE(equalizer10)->audio), "output-soundcard", soundcard, NULL); return(equalizer10); } gsequencer-3.1.3/ags/X/machine/ags_dssi_bridge.c0000644000175000017500000011335313616617253016461 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #if defined AGS_W32API #include #else #include #endif #include #include #include #include #include #include void ags_dssi_bridge_class_init(AgsDssiBridgeClass *dssi_bridge); void ags_dssi_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_dssi_bridge_init(AgsDssiBridge *dssi_bridge); void ags_dssi_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_dssi_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_dssi_bridge_finalize(GObject *gobject); void ags_dssi_bridge_connect(AgsConnectable *connectable); void ags_dssi_bridge_disconnect(AgsConnectable *connectable); void ags_dssi_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_dssi_bridge_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data); void ags_dssi_bridge_map_recall(AgsMachine *machine); /** * SECTION:ags_dssi_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsDssiBridge * @section_id: * @include: ags/X/ags_dssi_bridge.h * * #AgsDssiBridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_INDEX, }; static gpointer ags_dssi_bridge_parent_class = NULL; static AgsConnectableInterface* ags_dssi_bridge_parent_connectable_interface; GType ags_dssi_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_dssi_bridge = 0; static const GTypeInfo ags_dssi_bridge_info = { sizeof(AgsDssiBridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_dssi_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDssiBridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_dssi_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_dssi_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_dssi_bridge = g_type_register_static(AGS_TYPE_MACHINE, "AgsDssiBridge", &ags_dssi_bridge_info, 0); g_type_add_interface_static(ags_type_dssi_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_dssi_bridge); } return g_define_type_id__volatile; } void ags_dssi_bridge_class_init(AgsDssiBridgeClass *dssi_bridge) { AgsMachineClass *machine; GObjectClass *gobject; GParamSpec *param_spec; ags_dssi_bridge_parent_class = g_type_class_peek_parent(dssi_bridge); /* GObjectClass */ gobject = G_OBJECT_CLASS(dssi_bridge); gobject->set_property = ags_dssi_bridge_set_property; gobject->get_property = ags_dssi_bridge_get_property; gobject->finalize = ags_dssi_bridge_finalize; /* properties */ /** * AgsRecallDssi:filename: * * The plugins filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the object file"), i18n_pspec("The filename as string of object file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecallDssi:effect: * * The effect's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsRecallDssi:index: * * The effect's index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("index", i18n_pspec("index of effect"), i18n_pspec("The numerical index of effect"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX, param_spec); /* AgsMachine */ machine = (AgsMachineClass *) dssi_bridge; machine->map_recall = ags_dssi_bridge_map_recall; } void ags_dssi_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_dssi_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_dssi_bridge_connect; connectable->disconnect = ags_dssi_bridge_disconnect; } void ags_dssi_bridge_init(AgsDssiBridge *dssi_bridge) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; GtkTable *table; AgsAudio *audio; g_signal_connect_after((GObject *) dssi_bridge, "parent-set", G_CALLBACK(ags_dssi_bridge_parent_set_callback), (gpointer) dssi_bridge); audio = AGS_MACHINE(dssi_bridge)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(dssi_bridge)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); ags_machine_popup_add_connection_options((AgsMachine *) dssi_bridge, (AGS_MACHINE_POPUP_MIDI_DIALOG)); g_signal_connect_after(G_OBJECT(dssi_bridge), "resize-audio-channels", G_CALLBACK(ags_dssi_bridge_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(dssi_bridge), "resize-pads", G_CALLBACK(ags_dssi_bridge_resize_pads), NULL); dssi_bridge->flags = 0; dssi_bridge->name = NULL; dssi_bridge->version = AGS_DSSI_BRIDGE_DEFAULT_VERSION; dssi_bridge->build_id = AGS_DSSI_BRIDGE_DEFAULT_BUILD_ID; dssi_bridge->xml_type = "ags-dssi-bridge"; dssi_bridge->mapped_output_pad = 0; dssi_bridge->mapped_input_pad = 0; ags_machine_popup_add_edit_options((AgsMachine *) dssi_bridge, (AGS_MACHINE_POPUP_ENVELOPE)); dssi_bridge->filename = NULL; dssi_bridge->effect = NULL; dssi_bridge->effect_index = 0; dssi_bridge->port_values = NULL; dssi_bridge->dssi_descriptor = NULL; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) gtk_bin_get_child((GtkBin *) dssi_bridge), (GtkWidget *) vbox); /* program */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("program")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); dssi_bridge->program = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) dssi_bridge->program, FALSE, FALSE, 0); /* effect bridge */ AGS_MACHINE(dssi_bridge)->bridge = (GtkContainer *) ags_effect_bridge_new(audio); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) AGS_MACHINE(dssi_bridge)->bridge, FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(AGS_MACHINE(dssi_bridge)->bridge), (GtkWidget *) table, FALSE, FALSE, 0); AGS_EFFECT_BRIDGE(AGS_MACHINE(dssi_bridge)->bridge)->bulk_input = (GtkWidget *) ags_effect_bulk_new(audio, AGS_TYPE_INPUT); AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(dssi_bridge)->bridge)->bulk_input)->flags |= (AGS_EFFECT_BULK_HIDE_BUTTONS | AGS_EFFECT_BULK_HIDE_ENTRIES | AGS_EFFECT_BULK_SHOW_LABELS); gtk_table_attach(table, AGS_EFFECT_BRIDGE(AGS_MACHINE(dssi_bridge)->bridge)->bulk_input, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } void ags_dssi_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsDssiBridge *dssi_bridge; dssi_bridge = AGS_DSSI_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *str; gchar *filename; filename = g_value_get_string(value); if(filename == dssi_bridge->filename){ return; } if(dssi_bridge->filename != NULL){ g_free(dssi_bridge->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) dssi_bridge); str = g_strdup_printf("%s %s", i18n("Plugin file not present"), filename); ags_window_show_error(window, str); g_free(str); } } dssi_bridge->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == dssi_bridge->effect){ return; } if(dssi_bridge->effect != NULL){ g_free(dssi_bridge->effect); } dssi_bridge->effect = g_strdup(effect); } break; case PROP_INDEX: { unsigned long effect_index; effect_index = (unsigned long) g_value_get_uint(value); if(effect_index == dssi_bridge->effect_index){ return; } dssi_bridge->effect_index = effect_index; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_dssi_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsDssiBridge *dssi_bridge; dssi_bridge = AGS_DSSI_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, dssi_bridge->filename); } break; case PROP_EFFECT: { g_value_set_string(value, dssi_bridge->effect); } break; case PROP_INDEX: { g_value_set_uint(value, (guint) dssi_bridge->effect_index); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_dssi_bridge_finalize(GObject *gobject) { AgsDssiBridge *dssi_bridge; dssi_bridge = (AgsDssiBridge *) gobject; g_object_disconnect(G_OBJECT(dssi_bridge), "any_signal::resize-audio-channels", G_CALLBACK(ags_dssi_bridge_resize_audio_channels), NULL, "any_signal::resize-pads", G_CALLBACK(ags_dssi_bridge_resize_pads), NULL, NULL); g_free(dssi_bridge->filename); g_free(dssi_bridge->effect); /* call parent */ G_OBJECT_CLASS(ags_dssi_bridge_parent_class)->finalize(gobject); } void ags_dssi_bridge_connect(AgsConnectable *connectable) { AgsDssiBridge *dssi_bridge; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_dssi_bridge_parent_connectable_interface->connect(connectable); dssi_bridge = AGS_DSSI_BRIDGE(connectable); g_signal_connect_after(G_OBJECT(dssi_bridge->program), "changed", G_CALLBACK(ags_dssi_bridge_program_changed_callback), dssi_bridge); } void ags_dssi_bridge_disconnect(AgsConnectable *connectable) { AgsDssiBridge *dssi_bridge; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_dssi_bridge_parent_connectable_interface->connect(connectable); dssi_bridge = AGS_DSSI_BRIDGE(connectable); g_object_disconnect(G_OBJECT(dssi_bridge->program), "any_signal::changed", G_CALLBACK(ags_dssi_bridge_program_changed_callback), dssi_bridge, NULL); } void ags_dssi_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsDssiBridge *dssi_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint output_pads, input_pads; dssi_bridge = (AgsDssiBridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, NULL); /* check available */ if(input_pads == 0 && output_pads == 0){ return; } g_object_get(audio, "output", &start_output, "input", &start_input, NULL); if(audio_channels > audio_channels_old){ /* AgsInput */ channel = start_input; if(channel != NULL){ g_object_ref(channel); } /* resize audio signal */ next_channel = NULL; while(channel != NULL){ /* get next pad */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 25); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } /* resize audio signal */ next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_dssi_bridge_input_map_recall(dssi_bridge, audio_channels_old, 0); ags_dssi_bridge_output_map_recall(dssi_bridge, audio_channels_old, 0); } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_dssi_bridge_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsDssiBridge *dssi_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint audio_channels; gboolean grow; dssi_bridge = (AgsDssiBridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels, NULL); /* check available */ if(pads == pads_old || audio_channels == 0){ return; } g_object_get(audio, "output", &start_output, "input", &start_input, NULL); if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(g_type_is_a(type, AGS_TYPE_INPUT)){ if(grow){ /* AgsInput */ nth_channel = ags_channel_pad_nth(start_input, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 25); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_dssi_bridge_input_map_recall(dssi_bridge, 0, pads_old); } }else{ dssi_bridge->mapped_input_pad = pads; } }else{ if(grow){ /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_dssi_bridge_output_map_recall(dssi_bridge, 0, pads_old); } }else{ dssi_bridge->mapped_output_pad = pads; } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_dssi_bridge_map_recall(AgsMachine *machine) { AgsWindow *window; AgsDssiBridge *dssi_bridge; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayNotationAudio *recall_notation_audio; AgsPlayNotationAudioRun *recall_notation_audio_run; AgsRouteDssiAudio *recall_route_dssi_audio; AgsRouteDssiAudioRun *recall_route_dssi_audio_run; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); dssi_bridge = (AgsDssiBridge *) machine; audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-notation */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-notation", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_NOTATION_AUDIO_RUN); if(play != NULL){ recall_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_notation_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-route-dssi */ ags_recall_factory_create(audio, NULL, NULL, "ags-route-dssi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_ROUTE_DSSI_AUDIO_RUN); if(play != NULL){ recall_route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_route_dssi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_route_dssi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); }else{ recall_route_dssi_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_dssi_bridge_input_map_recall(dssi_bridge, 0, 0); /* add to effect bridge */ ags_effect_bulk_add_effect((AgsEffectBulk *) AGS_EFFECT_BRIDGE(AGS_MACHINE(dssi_bridge)->bridge)->bulk_input, NULL, dssi_bridge->filename, dssi_bridge->effect); /* depending on destination */ ags_dssi_bridge_output_map_recall(dssi_bridge, 0, 0); /* call parent */ AGS_MACHINE_CLASS(ags_dssi_bridge_parent_class)->map_recall(machine); } void ags_dssi_bridge_input_map_recall(AgsDssiBridge *dssi_bridge, guint audio_channel_start, guint input_pad_start) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *current, *next_pad, *next_current, *nth_current; GList *start_play, *play; guint input_pads; guint audio_channels; guint i, j; if(dssi_bridge->mapped_input_pad > input_pad_start){ return; } audio = AGS_MACHINE(dssi_bridge)->audio; /* get some fields */ g_object_get(audio, "input", &start_input, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); /* source */ nth_current = ags_channel_nth(start_input, audio_channel_start + input_pad_start * audio_channels); /* ags-envelope */ ags_recall_factory_create(audio, NULL, NULL, "ags-envelope", audio_channel_start, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); current = nth_current; next_pad = NULL; while(current != NULL){ GList *start_play, *play; GList *start_recall, *recall; g_object_get(current, "play", &start_play, "recall", &start_recall, NULL); /* play - use note length */ play = ags_recall_template_find_type(start_play, AGS_TYPE_ENVELOPE_CHANNEL); if(play != NULL){ GValue use_note_length_value = {0,}; g_value_init(&use_note_length_value, G_TYPE_BOOLEAN); g_value_set_boolean(&use_note_length_value, TRUE); ags_port_safe_write(AGS_ENVELOPE_CHANNEL(play->data)->use_note_length, &use_note_length_value); } /* recall - use note length */ recall = ags_recall_template_find_type(start_recall, AGS_TYPE_ENVELOPE_CHANNEL); if(recall != NULL){ GValue use_note_length_value = {0,}; g_value_init(&use_note_length_value, G_TYPE_BOOLEAN); g_value_set_boolean(&use_note_length_value, TRUE); ags_port_safe_write(AGS_ENVELOPE_CHANNEL(recall->data)->use_note_length, &use_note_length_value); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); /* iterate */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } /* map dependending on output */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channel_start, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channel_start, audio_channels, input_pad_start, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } for(i = input_pad_start; i < input_pads; i++){ for(j = 0; j < audio_channels; j++){ AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; current = ags_channel_nth(start_input, i * audio_channels + j); /* ags-play */ ags_recall_factory_create(audio, NULL, NULL, "ags-play", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* ags-feed */ ags_recall_factory_create(audio, NULL, NULL, "ags-feed", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* ags-stream */ if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); /* set up dependencies */ g_object_get(current, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_CHANNEL_RUN); play_channel_run = AGS_PLAY_CHANNEL_RUN(play->data); play = ags_recall_find_type(start_play, AGS_TYPE_STREAM_CHANNEL_RUN); stream_channel_run = AGS_STREAM_CHANNEL_RUN(play->data); g_object_set(G_OBJECT(play_channel_run), "stream-channel-run", stream_channel_run, NULL); g_list_free_full(start_play, g_object_unref); }else{ ags_recall_factory_create(audio, NULL, NULL, "ags-rt-stream", j, j + 1, i, i + 1, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } g_object_unref(current); } } if(start_input != NULL){ g_object_unref(start_input); } dssi_bridge->mapped_input_pad = input_pads; } void ags_dssi_bridge_output_map_recall(AgsDssiBridge *dssi_bridge, guint audio_channel_start, guint output_pad_start) { AgsAudio *audio; AgsDelayAudio *recall_delay_audio; AgsCountBeatsAudioRun *recall_count_beats_audio_run; guint output_pads, input_pads; guint audio_channels; if(dssi_bridge->mapped_output_pad > output_pad_start){ return; } audio = AGS_MACHINE(dssi_bridge)->audio; /* get some fields */ g_object_get(audio, "input-pads", &input_pads, "output-pads", &output_pads, "audio-channels", &audio_channels, NULL); /* remap for input */ if(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode()){ /* ags-copy */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy", audio_channel_start, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_REMAP), 0); }else{ /* ags-buffer */ ags_recall_factory_create(audio, NULL, NULL, "ags-buffer", audio_channel_start, audio_channels, 0, input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_REMAP), 0); } if(!(ags_recall_global_get_rt_safe() || ags_recall_global_get_performance_mode())){ /* ags-stream */ ags_recall_factory_create(audio, NULL, NULL, "ags-stream", audio_channel_start, audio_channels, output_pad_start, output_pads, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_RECALL | AGS_RECALL_FACTORY_ADD), 0); } dssi_bridge->mapped_output_pad = output_pads; } void ags_dssi_bridge_load(AgsDssiBridge *dssi_bridge) { GtkListStore *model; GtkTreeIter iter; AgsDssiPlugin *dssi_plugin; GList *start_plugin_port, *plugin_port; void *plugin_so; DSSI_Descriptor_Function dssi_descriptor; DSSI_Descriptor *plugin_descriptor; DSSI_Program_Descriptor *program_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortRangeHintDescriptor hint_descriptor; unsigned long samplerate; unsigned long effect_index; unsigned long port_count; unsigned long i; samplerate = ags_soundcard_helper_config_get_samplerate(ags_config_get_instance()); g_message("ags_dssi_bridge.c - load %s %s",dssi_bridge->filename, dssi_bridge->effect); /* load plugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), dssi_bridge->filename, dssi_bridge->effect); plugin_so = AGS_BASE_PLUGIN(dssi_plugin)->plugin_so; /* */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dssi_bridge->program)))); /* */ effect_index = AGS_BASE_PLUGIN(dssi_plugin)->effect_index; /* load ports */ model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_ULONG); if(effect_index != -1 && plugin_so){ gboolean success; success = FALSE; #ifdef AGS_W32API dssi_descriptor = (DSSI_Descriptor_Function) GetProcAddress(plugin_so, "dssi_descriptor"); success = (!dssi_descriptor) ? FALSE: TRUE; #else dssi_descriptor = (DSSI_Descriptor_Function) dlsym(plugin_so, "dssi_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && dssi_descriptor){ dssi_bridge->dssi_descriptor = plugin_descriptor = dssi_descriptor(effect_index); dssi_bridge->ladspa_handle = plugin_descriptor->LADSPA_Plugin->instantiate(plugin_descriptor->LADSPA_Plugin, samplerate); port_count = plugin_descriptor->LADSPA_Plugin->PortCount; port_descriptor = plugin_descriptor->LADSPA_Plugin->PortDescriptors; g_object_get(dssi_plugin, "plugin-port", &start_plugin_port, NULL); dssi_bridge->port_values = (LADSPA_Data *) malloc(plugin_descriptor->LADSPA_Plugin->PortCount * sizeof(LADSPA_Data)); for(i = 0; i < port_count; i++){ if(LADSPA_IS_PORT_CONTROL(port_descriptor[i])){ if(LADSPA_IS_PORT_INPUT(port_descriptor[i]) || LADSPA_IS_PORT_OUTPUT(port_descriptor[i])){ gchar *specifier; plugin_port = start_plugin_port; specifier = plugin_descriptor->LADSPA_Plugin->PortNames[i]; while(plugin_port != NULL){ if(!g_strcmp0(specifier, AGS_PLUGIN_PORT(plugin_port->data)->port_name)){ dssi_bridge->port_values[i] = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); break; } plugin_port = plugin_port->next; } plugin_descriptor->LADSPA_Plugin->connect_port(dssi_bridge->ladspa_handle, i, &(dssi_bridge->port_values[i])); } } } if(plugin_descriptor->get_program != NULL){ for(i = 0; (program_descriptor = plugin_descriptor->get_program(dssi_bridge->ladspa_handle, i)) != NULL; i++){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, program_descriptor->Name, 1, program_descriptor->Bank, 2, program_descriptor->Program, -1); } } g_list_free_full(start_plugin_port, g_object_unref); } } gtk_combo_box_set_model(GTK_COMBO_BOX(dssi_bridge->program), GTK_TREE_MODEL(model)); } /** * ags_dssi_bridge_new: * @soundcard: the assigned soundcard. * @filename: the plugin.so * @effect: the effect * * Create a new instance of #AgsDssiBridge * * Returns: the new #AgsDssiBridge * * Since: 3.0.0 */ AgsDssiBridge* ags_dssi_bridge_new(GObject *soundcard, gchar *filename, gchar *effect) { AgsDssiBridge *dssi_bridge; dssi_bridge = (AgsDssiBridge *) g_object_new(AGS_TYPE_DSSI_BRIDGE, NULL); if(soundcard != NULL){ g_object_set(G_OBJECT(AGS_MACHINE(dssi_bridge)->audio), "output-soundcard", soundcard, NULL); } g_object_set(dssi_bridge, "filename", filename, "effect", effect, NULL); return(dssi_bridge); } gsequencer-3.1.3/ags/X/machine/ags_live_lv2_bridge_callbacks.c0000644000175000017500000006544513607210263021236 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include extern GHashTable *ags_live_lv2_bridge_lv2ui_handle; extern GHashTable *ags_live_lv2_bridge_lv2ui_idle; gboolean ags_live_lv2_bridge_delete_event_callback(GtkWidget *widget, GdkEvent *event, AgsLiveLv2Bridge *live_lv2_bridge); void ags_live_lv2_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLiveLv2Bridge *live_lv2_bridge) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(widget)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_LIVE_LV2_BRIDGE)->counter); g_object_set(AGS_MACHINE(live_lv2_bridge), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_LIVE_LV2_BRIDGE); g_free(str); } gboolean ags_live_lv2_bridge_delete_event_callback(GtkWidget *widget, GdkEvent *event, AgsLiveLv2Bridge *live_lv2_bridge) { gtk_widget_hide(widget); return(TRUE); } void ags_live_lv2_bridge_show_gui_callback(GtkMenuItem *item, AgsLiveLv2Bridge *live_lv2_bridge) { AgsLv2Plugin *lv2_plugin; AgsLv2uiPlugin *lv2ui_plugin; lv2_plugin = live_lv2_bridge->lv2_plugin; lv2ui_plugin = live_lv2_bridge->lv2ui_plugin; if(lv2_plugin == NULL || lv2ui_plugin == NULL){ return; } if(live_lv2_bridge->ui_handle == NULL){ LV2UI_Descriptor *plugin_descriptor; GValue *value; gchar **parameter_name; guint local_n_params; guint n_params; guint i; local_n_params = 4; n_params = 4; parameter_name = (gchar **) malloc(5 * sizeof(gchar *)); value = g_new0(GValue, 4); parameter_name[0] = g_strdup("uri"); g_value_init(&(value[0]), G_TYPE_POINTER); g_value_set_pointer(&(value[0]), lv2_plugin->uri); parameter_name[1] = g_strdup("controller"); g_value_init(&(value[1]), G_TYPE_POINTER); g_value_set_pointer(&(value[1]), live_lv2_bridge); parameter_name[2] = g_strdup("write-function"); g_value_init(&(value[2]), G_TYPE_POINTER); g_value_set_pointer(&(value[2]), ags_live_lv2_bridge_lv2ui_write_function); parameter_name[3] = g_strdup("instance"); g_value_init(&(value[3]), G_TYPE_POINTER); g_value_set_pointer(&(value[3]), live_lv2_bridge->lv2_handle); parameter_name[4] = NULL; live_lv2_bridge->ui_handle = ags_base_plugin_instantiate_with_params(lv2ui_plugin, &n_params, ¶meter_name, &value); live_lv2_bridge->ui_descriptor = AGS_BASE_PLUGIN(lv2ui_plugin)->ui_plugin_descriptor; if(live_lv2_bridge->ui_handle != NULL){ if(n_params > local_n_params){ for(i = local_n_params; i < n_params; i++){ if(!g_ascii_strncasecmp(parameter_name[i], "widget", 7)){ live_lv2_bridge->ui_widget = g_value_get_pointer(&(value[i])); } } } g_hash_table_insert(ags_live_lv2_bridge_lv2ui_handle, live_lv2_bridge->ui_handle, live_lv2_bridge); plugin_descriptor = live_lv2_bridge->ui_descriptor; if(plugin_descriptor->extension_data != NULL){ lv2ui_plugin->feature[0]->data = plugin_descriptor->extension_data(LV2_UI__idleInterface); lv2ui_plugin->feature[1]->data = plugin_descriptor->extension_data(LV2_UI__showInterface); g_hash_table_insert(ags_live_lv2_bridge_lv2ui_idle, live_lv2_bridge->ui_handle, live_lv2_bridge); g_timeout_add(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0, (GSourceFunc) ags_live_lv2_bridge_lv2ui_idle_timeout, (gpointer) live_lv2_bridge->ui_handle); } } #if 0 for(i = 0; i < n_params; i++){ g_value_unset(&(value[i])); } #endif g_free(value); g_strfreev(parameter_name); } if(live_lv2_bridge->ui_handle != NULL){ AgsEffectBridge *effect_bridge; GtkWidget *child_widget; GList *list_bulk_member, *list_bulk_member_start; gchar *str; /* set inital values */ effect_bridge = AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge); list_bulk_member = list_bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(effect_bridge->bulk_output)->table); live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; while(list_bulk_member != NULL){ uint32_t port_index; float val; child_widget = gtk_bin_get_child(GTK_BIN(AGS_BULK_MEMBER(list_bulk_member->data))); port_index = AGS_BULK_MEMBER(list_bulk_member->data)->port_index; if(AGS_IS_DIAL(child_widget)){ val = gtk_adjustment_get_value(AGS_DIAL(child_widget)->adjustment); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ val = gtk_spin_button_get_value(GTK_SPIN_BUTTON(child_widget)); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_SCALE(child_widget)){ val = gtk_range_get_value(GTK_RANGE(child_widget)); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ val = ((gtk_toggle_button_get_active(child_widget)) ? 1.0: 0.0); if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); }else if(GTK_IS_BUTTON(child_widget)){ val = 0.0; if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, FALSE); } live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); } list_bulk_member = list_bulk_member->next; } live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); g_list_free(list_bulk_member_start); } if(live_lv2_bridge->ui_handle != NULL && live_lv2_bridge->ui_feature != NULL && live_lv2_bridge->ui_feature[1] != NULL && live_lv2_bridge->ui_feature[1]->data != NULL){ ((struct _LV2UI_Show_Interface *) live_lv2_bridge->ui_feature[1]->data)->show(live_lv2_bridge->ui_handle[0]); }else if(live_lv2_bridge->ui_widget != NULL){ GtkWindow *window; if(live_lv2_bridge->lv2_window == NULL){ live_lv2_bridge->lv2_window = window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(window, live_lv2_bridge->ui_widget); gtk_window_set_title(window, live_lv2_bridge->gui_uri); g_signal_connect(window, "delete-event", G_CALLBACK(ags_live_lv2_bridge_delete_event_callback), live_lv2_bridge); }else{ window = live_lv2_bridge->lv2_window; } gtk_widget_show_all(window); } } void ags_live_lv2_bridge_lv2ui_cleanup_function(LV2UI_Handle handle) { AgsLiveLv2Bridge *live_lv2_bridge; AgsLv2uiPlugin *lv2ui_plugin; GList *list; live_lv2_bridge = g_hash_table_lookup(ags_live_lv2_bridge_lv2ui_handle, handle); if(live_lv2_bridge != NULL){ g_hash_table_remove(ags_live_lv2_bridge_lv2ui_handle, live_lv2_bridge->ui_handle); live_lv2_bridge->ui_handle = NULL; } } void ags_live_lv2_bridge_lv2ui_write_function(LV2UI_Controller controller, uint32_t port_index, uint32_t buffer_size, uint32_t port_protocol, const void *buffer) { AgsLiveLv2Bridge *live_lv2_bridge; AgsEffectBridge *effect_bridge; GtkWidget *child_widget; GList *list_bulk_member, *list_bulk_member_start; gfloat val; live_lv2_bridge = (AgsLiveLv2Bridge *) controller; if(live_lv2_bridge == NULL){ g_warning("ags_live_lv2_bridge_lv2ui_write_function() - live_lv2_bridge == NULL"); return; } if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0){ return; } if(port_protocol != 0){ g_warning("ags_live_lv2_bridge_lv2ui_write_function() - unknown lv2 port protocol"); return; } effect_bridge = AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge); list_bulk_member = list_bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(effect_bridge->bulk_output)->table); while(list_bulk_member != NULL){ if(port_index == AGS_BULK_MEMBER(list_bulk_member->data)->port_index){ live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; child_widget = gtk_bin_get_child(GTK_BIN(AGS_BULK_MEMBER(list_bulk_member->data))); val = ((float *) buffer)[0]; if(AGS_BULK_MEMBER(list_bulk_member->data)->conversion != NULL){ val = (gfloat) ags_conversion_convert(AGS_BULK_MEMBER(list_bulk_member->data)->conversion, val, TRUE); } if(AGS_IS_DIAL(child_widget)){ ags_dial_set_value((AgsDial *) child_widget, val); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ gtk_spin_button_set_value((GtkSpinButton *) child_widget, val); }else if(GTK_IS_SCALE(child_widget)){ gtk_range_set_value((GtkRange *) child_widget, val); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, ((val != 0.0) ? TRUE: FALSE)); }else if(GTK_IS_BUTTON(child_widget)){ gtk_button_clicked((GtkButton *) child_widget); } live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); break; } list_bulk_member = list_bulk_member->next; } g_list_free(list_bulk_member_start); } void ags_live_lv2_bridge_program_changed_callback(GtkComboBox *combo_box, AgsLiveLv2Bridge *live_lv2_bridge) { GtkTreeIter iter; if(gtk_combo_box_get_active_iter(combo_box, &iter)){ AgsChannel *start_input; AgsChannel *channel, *next_channel; AgsLv2Plugin *lv2_plugin; LV2_Programs_Interface *program_interface; GList *start_plugin_port, *plugin_port; GList *bulk_member, *bulk_member_start; GList *start_recall, *recall; GList *start_port, *port; gchar *name; gchar *specifier; guint bank, program; lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), live_lv2_bridge->filename, live_lv2_bridge->effect); /* get program */ gtk_tree_model_get(gtk_combo_box_get_model(combo_box), &iter, 0, &name, 1, &bank, 2, &program, -1); #ifdef AGS_DEBUG g_message("%d %d", bank, program); #endif program_interface = live_lv2_bridge->lv2_descriptor->extension_data(LV2_PROGRAMS__Interface); program_interface->select_program(live_lv2_bridge->lv2_handle[0], bank, program); /* update ports */ g_object_get(AGS_MACHINE(live_lv2_bridge)->audio, "input", &start_input, NULL); channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); while(channel != NULL){ g_object_get(channel, "recall", &start_recall, NULL); recall = start_recall; while((recall = ags_recall_find_type(recall, AGS_TYPE_RECALL_LV2)) != NULL){ AGS_RECALL_LV2(recall->data)->bank = (uint32_t) bank; AGS_RECALL_LV2(recall->data)->program = (uint32_t) program; plugin_port = start_plugin_port; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ specifier = AGS_PLUGIN_PORT(plugin_port->data)->port_name; port = AGS_RECALL(recall->data)->port; while(port != NULL){ if(!g_strcmp0(AGS_PORT(port->data)->specifier, specifier)){ GValue value = {0,}; #ifdef AGS_DEBUG g_message("%s %f", specifier, live_lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]); #endif g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, live_lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]); ags_port_safe_write_raw(port->data, &value); break; } port = port->next; } } } /* iterate */ plugin_port = plugin_port->next; } /* iterate */ recall = recall->next; } g_list_free_full(start_recall, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(next_channel != NULL){ g_object_unref(next_channel); } /* update UI */ bulk_member_start = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge)->bulk_output)->table); plugin_port = start_plugin_port; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ /* find bulk member */ bulk_member = bulk_member_start; specifier = AGS_PLUGIN_PORT(plugin_port->data)->port_name; #ifdef AGS_DEBUG g_message("%s", specifier); #endif while(bulk_member != NULL){ if(AGS_IS_BULK_MEMBER(bulk_member->data) && !g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->specifier, specifier)){ GtkWidget *child_widget; AGS_BULK_MEMBER(bulk_member->data)->flags |= AGS_BULK_MEMBER_NO_UPDATE; child_widget = gtk_bin_get_child((GtkBin *) AGS_BULK_MEMBER(bulk_member->data)); if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(live_lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index] == 0.0){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, TRUE); } }else if(AGS_IS_DIAL(child_widget)){ gfloat port_val; gdouble val; port_val = live_lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]; val = port_val; if(AGS_BULK_MEMBER(bulk_member->data)->conversion != NULL){ val = ags_conversion_convert(AGS_BULK_MEMBER(bulk_member->data)->conversion, port_val, TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, val); gtk_widget_queue_draw((AgsDial *) child_widget); #ifdef AGS_DEBUG g_message(" --- %f", live_lv2_bridge->port_value[AGS_PLUGIN_PORT(plugin_port->data)->port_index]); #endif } AGS_BULK_MEMBER(bulk_member->data)->flags &= (~AGS_BULK_MEMBER_NO_UPDATE); break; } bulk_member = bulk_member->next; } } } /* iterate */ plugin_port = plugin_port->next; } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } g_list_free_full(start_plugin_port, g_object_unref); g_list_free(bulk_member_start); } } void ags_live_lv2_bridge_preset_changed_callback(GtkComboBox *combo_box, AgsLiveLv2Bridge *live_lv2_bridge) { GtkContainer *container; AgsLv2Conversion *lv2_conversion; AgsLv2Plugin *lv2_plugin; AgsLv2Preset *lv2_preset; GList *list, *list_start; GList *start_port_preset, *port_preset; GList *start_plugin_port, *plugin_port; gchar *preset_label; /* retrieve lv2 plugin */ lv2_plugin = live_lv2_bridge->lv2_plugin; if(lv2_plugin == NULL){ lv2_plugin = live_lv2_bridge->lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), live_lv2_bridge->filename, live_lv2_bridge->effect); g_object_ref(lv2_plugin); live_lv2_bridge->lv2_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; } if(lv2_plugin == NULL){ return; } /* preset label */ preset_label = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box)); /* preset */ lv2_preset = NULL; list = ags_lv2_preset_find_preset_label(lv2_plugin->preset, preset_label); if(list != NULL){ lv2_preset = list->data; } /* port preset */ if(lv2_preset == NULL){ return; } container = GTK_CONTAINER(AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_lv2_bridge)->bridge)->bulk_output)->table); g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); g_object_get(lv2_preset, "port-preset", &start_port_preset, NULL); port_preset = start_port_preset; while(port_preset != NULL){ plugin_port = ags_plugin_port_find_symbol(start_plugin_port, AGS_LV2_PORT_PRESET(port_preset->data)->port_symbol); if(plugin_port != NULL){ gfloat port_value; gdouble value; port_value = g_value_get_float(AGS_LV2_PORT_PRESET(port_preset->data)->port_value); value = port_value; list_start = list = gtk_container_get_children(container); while(list != NULL){ if(!g_strcmp0(AGS_BULK_MEMBER(list->data)->specifier, AGS_PLUGIN_PORT(plugin_port->data)->port_name)){ GtkWidget *child_widget; // AGS_BULK_MEMBER(list->data)->flags |= AGS_BULK_MEMBER_NO_UPDATE; child_widget = gtk_bin_get_child((GtkBin *) AGS_BULK_MEMBER(list->data)); lv2_conversion = (AgsLv2Conversion *) AGS_BULK_MEMBER(list->data)->conversion; if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(value == 0.0){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, TRUE); } }else if(AGS_IS_DIAL(child_widget)){ if(lv2_conversion != NULL){ value = ags_conversion_convert(lv2_conversion, port_value, TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, value); gtk_widget_queue_draw((AgsDial *) child_widget); } // AGS_BULK_MEMBER(list->data)->flags &= (~AGS_BULK_MEMBER_NO_UPDATE); break; } list = list->next; } g_list_free(list_start); } /* iterate */ port_preset = port_preset->next; } g_list_free_full(start_plugin_port, g_object_unref); g_list_free(start_port_preset); } void ags_live_lv2_bridge_dial_changed_callback(GtkWidget *dial, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(dial, AGS_TYPE_BULK_MEMBER); g_object_get(dial, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } void ags_live_lv2_bridge_vscale_changed_callback(GtkWidget *vscale, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(vscale, AGS_TYPE_BULK_MEMBER); g_object_get(vscale, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } void ags_live_lv2_bridge_hscale_changed_callback(GtkWidget *hscale, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(hscale, AGS_TYPE_BULK_MEMBER); g_object_get(hscale, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } void ags_live_lv2_bridge_spin_button_changed_callback(GtkWidget *spin_button, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(spin_button, AGS_TYPE_BULK_MEMBER); g_object_get(spin_button, "adjustment", &adjustment, NULL); port_index = bulk_member->port_index; val = gtk_adjustment_get_value(adjustment); if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } void ags_live_lv2_bridge_check_button_clicked_callback(GtkWidget *check_button, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; gboolean is_active; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(check_button, AGS_TYPE_BULK_MEMBER); is_active = gtk_toggle_button_get_active((GtkToggleButton *) check_button); port_index = bulk_member->port_index; val = is_active ? 1.0: 0.0; if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } void ags_live_lv2_bridge_toggle_button_clicked_callback(GtkWidget *toggle_button, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; gboolean is_active; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(toggle_button, AGS_TYPE_BULK_MEMBER); is_active = gtk_toggle_button_get_active((GtkToggleButton *) toggle_button); port_index = bulk_member->port_index; val = is_active ? 1.0: 0.0; if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } void ags_live_lv2_bridge_button_clicked_callback(GtkWidget *button, AgsLiveLv2Bridge *live_lv2_bridge) { AgsBulkMember *bulk_member; GtkAdjustment *adjustment; gboolean is_active; uint32_t port_index; float val; if((AGS_LIVE_LV2_BRIDGE_NO_UPDATE & (live_lv2_bridge->flags)) != 0 || live_lv2_bridge->ui_handle == NULL){ return; } bulk_member = (AgsBulkMember *) gtk_widget_get_ancestor(button, AGS_TYPE_BULK_MEMBER); port_index = bulk_member->port_index; val = 0.0; if(bulk_member->conversion != NULL){ val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } live_lv2_bridge->flags |= AGS_LIVE_LV2_BRIDGE_NO_UPDATE; live_lv2_bridge->ui_descriptor->port_event(live_lv2_bridge->ui_handle[0], port_index, sizeof(float), 0, &val); live_lv2_bridge->flags &= (~AGS_LIVE_LV2_BRIDGE_NO_UPDATE); } gsequencer-3.1.3/ags/X/machine/ags_live_dssi_bridge.c0000644000175000017500000011720513607210263017466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #if defined AGS_W32API #include #else #include #endif #include #include #include #include #include #include #include #include void ags_live_dssi_bridge_class_init(AgsLiveDssiBridgeClass *live_dssi_bridge); void ags_live_dssi_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_live_dssi_bridge_init(AgsLiveDssiBridge *live_dssi_bridge); void ags_live_dssi_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_live_dssi_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_live_dssi_bridge_finalize(GObject *gobject); void ags_live_dssi_bridge_connect(AgsConnectable *connectable); void ags_live_dssi_bridge_disconnect(AgsConnectable *connectable); void ags_live_dssi_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_live_dssi_bridge_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data); void ags_live_dssi_bridge_map_recall(AgsMachine *machine); /** * SECTION:ags_live_dssi_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsLiveDssiBridge * @section_id: * @include: ags/X/machine/ags_live_dssi_bridge.h * * #AgsLiveDssiBridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_INDEX, }; static gpointer ags_live_dssi_bridge_parent_class = NULL; static AgsConnectableInterface* ags_live_dssi_bridge_parent_connectable_interface; extern GHashTable *ags_effect_bulk_indicator_queue_draw; GType ags_live_dssi_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_live_dssi_bridge = 0; static const GTypeInfo ags_live_dssi_bridge_info = { sizeof(AgsLiveDssiBridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_live_dssi_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLiveDssiBridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_live_dssi_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_live_dssi_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_live_dssi_bridge = g_type_register_static(AGS_TYPE_MACHINE, "AgsLiveDssiBridge", &ags_live_dssi_bridge_info, 0); g_type_add_interface_static(ags_type_live_dssi_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_live_dssi_bridge); } return g_define_type_id__volatile; } void ags_live_dssi_bridge_class_init(AgsLiveDssiBridgeClass *live_dssi_bridge) { AgsMachineClass *machine; GObjectClass *gobject; GParamSpec *param_spec; ags_live_dssi_bridge_parent_class = g_type_class_peek_parent(live_dssi_bridge); /* GObjectClass */ gobject = G_OBJECT_CLASS(live_dssi_bridge); gobject->set_property = ags_live_dssi_bridge_set_property; gobject->get_property = ags_live_dssi_bridge_get_property; gobject->finalize = ags_live_dssi_bridge_finalize; /* properties */ /** * AgsRecallLiveDssi:filename: * * The plugins filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the object file"), i18n_pspec("The filename as string of object file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecallLiveDssi:effect: * * The effect's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsRecallLiveDssi:index: * * The effect's index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("index", i18n_pspec("index of effect"), i18n_pspec("The numerical index of effect"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX, param_spec); /* AgsMachine */ machine = (AgsMachineClass *) live_dssi_bridge; machine->map_recall = ags_live_dssi_bridge_map_recall; } void ags_live_dssi_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_live_dssi_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_live_dssi_bridge_connect; connectable->disconnect = ags_live_dssi_bridge_disconnect; } void ags_live_dssi_bridge_init(AgsLiveDssiBridge *live_dssi_bridge) { GtkVBox *vbox; GtkHBox *hbox; GtkLabel *label; GtkTable *table; AgsAudio *audio; g_signal_connect_after((GObject *) live_dssi_bridge, "parent-set", G_CALLBACK(ags_live_dssi_bridge_parent_set_callback), (gpointer) live_dssi_bridge); audio = AGS_MACHINE(live_dssi_bridge)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SKIP_INPUT)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); // audio->flags &= (~AGS_AUDIO_NOTATION_DEFAULT); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, "max-input-pads", 128, "audio-start-mapping", 0, "audio-end-mapping", 128, "midi-start-mapping", 0, "midi-end-mapping", 128, NULL); AGS_MACHINE(live_dssi_bridge)->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); ags_machine_popup_add_connection_options((AgsMachine *) live_dssi_bridge, (AGS_MACHINE_POPUP_MIDI_DIALOG)); g_signal_connect_after(G_OBJECT(live_dssi_bridge), "resize-audio-channels", G_CALLBACK(ags_live_dssi_bridge_resize_audio_channels), NULL); g_signal_connect_after(G_OBJECT(live_dssi_bridge), "resize-pads", G_CALLBACK(ags_live_dssi_bridge_resize_pads), NULL); live_dssi_bridge->flags = 0; live_dssi_bridge->name = NULL; live_dssi_bridge->version = AGS_LIVE_DSSI_BRIDGE_DEFAULT_VERSION; live_dssi_bridge->build_id = AGS_LIVE_DSSI_BRIDGE_DEFAULT_BUILD_ID; live_dssi_bridge->xml_type = "ags-live-dssi-bridge"; live_dssi_bridge->mapped_output_pad = 0; live_dssi_bridge->mapped_input_pad = 0; live_dssi_bridge->filename = NULL; live_dssi_bridge->effect = NULL; live_dssi_bridge->effect_index = 0; live_dssi_bridge->port_values = NULL; live_dssi_bridge->dssi_descriptor = NULL; vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) gtk_bin_get_child((GtkBin *) live_dssi_bridge), (GtkWidget *) vbox); /* program */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); label = (GtkLabel *) gtk_label_new(i18n("program")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 0); live_dssi_bridge->program = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) live_dssi_bridge->program, FALSE, FALSE, 0); /* effect bridge */ AGS_MACHINE(live_dssi_bridge)->bridge = (GtkContainer *) ags_effect_bridge_new(audio); gtk_box_pack_start((GtkBox *) vbox, (GtkWidget *) AGS_MACHINE(live_dssi_bridge)->bridge, FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(AGS_MACHINE(live_dssi_bridge)->bridge), (GtkWidget *) table, FALSE, FALSE, 0); AGS_EFFECT_BRIDGE(AGS_MACHINE(live_dssi_bridge)->bridge)->bulk_output = (GtkWidget *) ags_effect_bulk_new(audio, AGS_TYPE_OUTPUT); AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_dssi_bridge)->bridge)->bulk_output)->flags |= (AGS_EFFECT_BULK_HIDE_BUTTONS | AGS_EFFECT_BULK_HIDE_ENTRIES | AGS_EFFECT_BULK_SHOW_LABELS); gtk_table_attach(table, AGS_EFFECT_BRIDGE(AGS_MACHINE(live_dssi_bridge)->bridge)->bulk_output, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } void ags_live_dssi_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLiveDssiBridge *live_dssi_bridge; live_dssi_bridge = AGS_LIVE_DSSI_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *str; gchar *filename; filename = g_value_get_string(value); if(filename == live_dssi_bridge->filename){ return; } if(live_dssi_bridge->filename != NULL){ g_free(live_dssi_bridge->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) live_dssi_bridge); str = g_strdup_printf("%s %s", i18n("Plugin file not present"), filename); ags_window_show_error(window, str); g_free(str); } } live_dssi_bridge->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == live_dssi_bridge->effect){ return; } if(live_dssi_bridge->effect != NULL){ g_free(live_dssi_bridge->effect); } live_dssi_bridge->effect = g_strdup(effect); } break; case PROP_INDEX: { unsigned long effect_index; effect_index = (unsigned long) g_value_get_uint(value); if(effect_index == live_dssi_bridge->effect_index){ return; } live_dssi_bridge->effect_index = effect_index; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_live_dssi_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLiveDssiBridge *live_dssi_bridge; live_dssi_bridge = AGS_LIVE_DSSI_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, live_dssi_bridge->filename); } break; case PROP_EFFECT: { g_value_set_string(value, live_dssi_bridge->effect); } break; case PROP_INDEX: { g_value_set_uint(value, (guint) live_dssi_bridge->effect_index); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_live_dssi_bridge_finalize(GObject *gobject) { AgsLiveDssiBridge *live_dssi_bridge; live_dssi_bridge = (AgsLiveDssiBridge *) gobject; g_object_disconnect(G_OBJECT(live_dssi_bridge), "any_signal::resize-audio-channels", G_CALLBACK(ags_live_dssi_bridge_resize_audio_channels), NULL, "any_signal::resize-pads", G_CALLBACK(ags_live_dssi_bridge_resize_pads), NULL, NULL); g_free(live_dssi_bridge->filename); g_free(live_dssi_bridge->effect); /* call parent */ G_OBJECT_CLASS(ags_live_dssi_bridge_parent_class)->finalize(gobject); } void ags_live_dssi_bridge_connect(AgsConnectable *connectable) { AgsLiveDssiBridge *live_dssi_bridge; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_live_dssi_bridge_parent_connectable_interface->connect(connectable); live_dssi_bridge = AGS_LIVE_DSSI_BRIDGE(connectable); g_signal_connect_after(G_OBJECT(live_dssi_bridge->program), "changed", G_CALLBACK(ags_live_dssi_bridge_program_changed_callback), live_dssi_bridge); } void ags_live_dssi_bridge_disconnect(AgsConnectable *connectable) { AgsLiveDssiBridge *live_dssi_bridge; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_live_dssi_bridge_parent_connectable_interface->connect(connectable); live_dssi_bridge = AGS_LIVE_DSSI_BRIDGE(connectable); g_object_disconnect(G_OBJECT(live_dssi_bridge->program), "any_signal::changed", G_CALLBACK(ags_live_dssi_bridge_program_changed_callback), live_dssi_bridge, NULL); } void ags_live_dssi_bridge_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { AgsLiveDssiBridge *live_dssi_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_pad, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint output_pads, input_pads; live_dssi_bridge = (AgsLiveDssiBridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, NULL); if(input_pads == 0 && output_pads == 0){ return; } g_object_get(audio, "output", &start_output, "input", &start_input, NULL); if(audio_channels > audio_channels_old){ /* AgsInput */ channel = start_input; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 1); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } if(next_channel != NULL){ g_object_unref(next_channel); } /* AgsOutput */ channel = start_output; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; while(channel != NULL){ /* get some fields */ next_pad = ags_channel_next_pad(channel); nth_channel = ags_channel_pad_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; while(channel != next_pad){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_pad != NULL){ g_object_unref(next_pad); } } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_live_dssi_bridge_input_map_recall(live_dssi_bridge, audio_channels_old, 0); ags_live_dssi_bridge_output_map_recall(live_dssi_bridge, audio_channels_old, 0); } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_live_dssi_bridge_resize_pads(AgsMachine *machine, GType type, guint pads, guint pads_old, gpointer data) { AgsLiveDssiBridge *live_dssi_bridge; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *next_channel, *nth_channel; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; GObject *output_soundcard; guint audio_channels; gboolean grow; live_dssi_bridge = (AgsLiveDssiBridge *) machine; audio = machine->audio; /* get some fields */ g_object_get(audio, "output", &start_output, "input", &start_input, "audio-channels", &audio_channels, NULL); if(pads == pads_old || audio_channels == 0){ return; } g_object_get(audio, "output", &start_output, "input", &start_input, NULL); if(pads_old < pads){ grow = TRUE; }else{ grow = FALSE; } if(g_type_is_a(type, AGS_TYPE_INPUT)){ if(grow){ /* AgsInput */ nth_channel = ags_channel_pad_nth(start_input, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 1); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_live_dssi_bridge_input_map_recall(live_dssi_bridge, 0, pads_old); } }else{ live_dssi_bridge->mapped_input_pad = pads; } }else{ if(grow){ /* AgsOutput */ nth_channel = ags_channel_pad_nth(start_output, pads_old); channel = nth_channel; next_channel = NULL; while(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_NOTATION)); /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &first_recycling, NULL); /* audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_audio_signal_stream_resize(audio_signal, 3); ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_unref(output_soundcard); g_object_unref(first_recycling); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(next_channel != NULL){ g_object_unref(next_channel); } /* recall */ if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0){ ags_live_dssi_bridge_output_map_recall(live_dssi_bridge, 0, pads_old); } }else{ live_dssi_bridge->mapped_output_pad = pads; } } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_live_dssi_bridge_map_recall(AgsMachine *machine) { AgsWindow *window; AgsLiveDssiBridge *live_dssi_bridge; AgsAudio *audio; AgsDelayAudio *play_delay_audio; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudio *play_count_beats_audio; AgsCountBeatsAudioRun *play_count_beats_audio_run; AgsRecordMidiAudio *recall_record_midi_audio; AgsRecordMidiAudioRun *recall_record_midi_audio_run; AgsPlayDssiAudio *play_dssi_audio; AgsPlayDssiAudioRun *play_dssi_audio_run; GList *start_play, *play; GList *start_recall, *recall; GValue value = {0,}; if((AGS_MACHINE_MAPPED_RECALL & (machine->flags)) != 0 || (AGS_MACHINE_PREMAPPED_RECALL & (machine->flags)) != 0){ return; } window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) machine, AGS_TYPE_WINDOW); live_dssi_bridge = (AgsLiveDssiBridge *) machine; audio = machine->audio; /* ags-delay */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_DELAY_AUDIO_RUN); if(play != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(play->data); // AGS_RECALL(play_delay_audio_run)->flags |= AGS_RECALL_PERSISTENT; }else{ play_delay_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(play != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); ags_seekable_seek(AGS_SEEKABLE(play_count_beats_audio_run), (gint64) 16 * gtk_spin_button_get_value(window->navigation->position_tact), AGS_SEEK_SET); /* notation loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_left_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_start, &value); g_value_reset(&value); g_value_set_uint64(&value, 16 * gtk_spin_button_get_value(window->navigation->loop_right_tact)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop_end, &value); }else{ play_count_beats_audio_run = NULL; } g_list_free_full(start_play, g_object_unref); /* ags-record-midi */ ags_recall_factory_create(audio, NULL, NULL, "ags-record-midi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_RECORD_MIDI_AUDIO_RUN); if(play != NULL){ recall_record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(recall_record_midi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* ags-play-dssi */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-dssi", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_BULK), 0); g_object_get(audio, "play", &start_play, NULL); play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_DSSI_AUDIO); if(play != NULL){ play_dssi_audio = AGS_PLAY_DSSI_AUDIO(play->data); g_object_set(play_dssi_audio, "filename", live_dssi_bridge->filename, "effect", live_dssi_bridge->effect, NULL); ags_play_dssi_audio_load(play_dssi_audio); ags_play_dssi_audio_load_ports(play_dssi_audio); } play = ags_recall_find_type(start_play, AGS_TYPE_PLAY_DSSI_AUDIO_RUN); if(play != NULL){ play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(play->data); /* set dependency */ g_object_set(G_OBJECT(play_dssi_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* set dependency */ g_object_set(G_OBJECT(play_dssi_audio_run), "count-beats-audio-run", play_count_beats_audio_run, NULL); } g_list_free_full(start_play, g_object_unref); /* depending on destination */ ags_live_dssi_bridge_input_map_recall(live_dssi_bridge, 0, 0); /* depending on destination */ ags_live_dssi_bridge_output_map_recall(live_dssi_bridge, 0, 0); /* call parent */ AGS_MACHINE_CLASS(ags_live_dssi_bridge_parent_class)->map_recall(machine); } void ags_live_dssi_bridge_input_map_recall(AgsLiveDssiBridge *live_dssi_bridge, guint audio_channel_start, guint input_pad_start) { AgsAudio *audio; audio = AGS_MACHINE(live_dssi_bridge)->audio; if(live_dssi_bridge->mapped_input_pad > input_pad_start){ return; } live_dssi_bridge->mapped_input_pad = audio->input_pads; } void ags_live_dssi_bridge_output_map_recall(AgsLiveDssiBridge *live_dssi_bridge, guint audio_channel_start, guint output_pad_start) { AgsAudio *audio; audio = AGS_MACHINE(live_dssi_bridge)->audio; if(live_dssi_bridge->mapped_output_pad > output_pad_start){ return; } live_dssi_bridge->mapped_output_pad = audio->output_pads; } void ags_live_dssi_bridge_load(AgsLiveDssiBridge *live_dssi_bridge) { AgsEffectBulk *effect_bulk; AgsBulkMember *bulk_member; GtkListStore *model; GtkTreeIter iter; AgsDssiPlugin *dssi_plugin; void *plugin_so; DSSI_Descriptor_Function dssi_descriptor; DSSI_Descriptor *plugin_descriptor; DSSI_Program_Descriptor *program_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortRangeHintDescriptor hint_descriptor; GList *start_list, *list; GList *start_plugin_port, *plugin_port; gchar *port_name; unsigned long samplerate; unsigned long effect_index; gdouble step; unsigned long port_count; gboolean has_output_port; guint x, y; unsigned long i, j; guint k; samplerate = ags_soundcard_helper_config_get_samplerate(ags_config_get_instance()); g_message("ags_live_dssi_bridge.c - load %s %s", live_dssi_bridge->filename, live_dssi_bridge->effect); /* load plugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), live_dssi_bridge->filename, live_dssi_bridge->effect); plugin_so = AGS_BASE_PLUGIN(dssi_plugin)->plugin_so; /* */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(live_dssi_bridge->program)))); /* */ effect_index = AGS_BASE_PLUGIN(dssi_plugin)->effect_index; /* load ports */ model = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_ULONG); if(effect_index != -1 && plugin_so){ gboolean success; success = FALSE; #ifdef AGS_W32API dssi_descriptor = (DSSI_Descriptor_Function) GetProcAddress(plugin_so, "dssi_descriptor"); success = (!dssi_descriptor) ? FALSE: TRUE; #else dssi_descriptor = (DSSI_Descriptor_Function) dlsym(plugin_so, "dssi_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && dssi_descriptor){ live_dssi_bridge->dssi_descriptor = plugin_descriptor = dssi_descriptor(effect_index); live_dssi_bridge->ladspa_handle = plugin_descriptor->LADSPA_Plugin->instantiate(plugin_descriptor->LADSPA_Plugin, samplerate); port_count = plugin_descriptor->LADSPA_Plugin->PortCount; port_descriptor = plugin_descriptor->LADSPA_Plugin->PortDescriptors; g_object_get(dssi_plugin, "plugin-port", &start_plugin_port, NULL); live_dssi_bridge->port_values = (LADSPA_Data *) malloc(plugin_descriptor->LADSPA_Plugin->PortCount * sizeof(LADSPA_Data)); for(i = 0; i < port_count; i++){ if(LADSPA_IS_PORT_CONTROL(port_descriptor[i])){ if(LADSPA_IS_PORT_INPUT(port_descriptor[i]) || LADSPA_IS_PORT_OUTPUT(port_descriptor[i])){ gchar *specifier; plugin_port = start_plugin_port; specifier = plugin_descriptor->LADSPA_Plugin->PortNames[i]; while(plugin_port != NULL){ if(!g_strcmp0(specifier, AGS_PLUGIN_PORT(plugin_port->data)->port_name)){ live_dssi_bridge->port_values[i] = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); break; } plugin_port = plugin_port->next; } plugin_descriptor->LADSPA_Plugin->connect_port(live_dssi_bridge->ladspa_handle, i, &(live_dssi_bridge->port_values[i])); } } } if(plugin_descriptor->get_program != NULL){ for(i = 0; (program_descriptor = plugin_descriptor->get_program(live_dssi_bridge->ladspa_handle, i)) != NULL; i++){ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, program_descriptor->Name, 1, program_descriptor->Bank, 2, program_descriptor->Program, -1); } } g_list_free_full(start_plugin_port, g_object_unref); } } gtk_combo_box_set_model(GTK_COMBO_BOX(live_dssi_bridge->program), GTK_TREE_MODEL(model)); effect_bulk = AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(live_dssi_bridge)->bridge)->bulk_output); /* retrieve position within table */ x = 0; y = 0; list = start_list = gtk_container_get_children(GTK_CONTAINER(effect_bulk->table)); while(list != NULL){ guint top_attach; gtk_container_child_get(GTK_CONTAINER(effect_bulk->table), list->data, "top-attach", &top_attach, NULL); if(y <= top_attach){ y = top_attach + 1; } list = list->next; } g_list_free(start_list); /* load ports */ g_object_get(dssi_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLadspaConversion *ladspa_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; guint port_index; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; disable_seemless = FALSE; do_step_conversion = FALSE; if(x == AGS_EFFECT_BULK_COLUMNS_COUNT){ x = 0; y++; gtk_table_resize(effect_bulk->table, y + 1, AGS_EFFECT_BULK_COLUMNS_COUNT); } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); port_index = AGS_PLUGIN_PORT(plugin_port->data)->port_index; g_rec_mutex_unlock(plugin_port_mutex); /* add bulk member */ plugin_name = g_strdup_printf("dssi-%u", dssi_plugin->unique_id); control_port = g_strdup_printf("%u/%u", k + 1, port_count); bulk_member = (AgsBulkMember *) g_object_new(AGS_TYPE_BULK_MEMBER, "widget-type", widget_type, "widget-label", AGS_PLUGIN_PORT(plugin_port->data)->port_name, "plugin-name", plugin_name, "filename", live_dssi_bridge->filename, "effect", live_dssi_bridge->effect, "specifier", AGS_PLUGIN_PORT(plugin_port->data)->port_name, "control-port", control_port, "port-index", port_index, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_bulk_member_get_widget(bulk_member); g_free(plugin_name); g_free(control_port); /* ladspa conversion */ ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_SAMPLERATE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } bulk_member->conversion = (AgsConversion *) ladspa_conversion; /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ bulk_member->port_flags = AGS_BULK_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; LADSPA_Data lower_bound, upper_bound; gdouble lower, upper; LADSPA_Data default_value; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_effect_bulk_indicator_queue_draw, child_widget, ags_effect_bulk_indicator_queue_draw_timeout); effect_bulk->queued_drawing = g_list_prepend(effect_bulk->queued_drawing, child_widget); g_timeout_add(1000 / 30, (GSourceFunc) ags_effect_bulk_indicator_queue_draw_timeout, (gpointer) child_widget); } gtk_table_attach(effect_bulk->table, (GtkWidget *) bulk_member, x, x + 1, y, y + 1, GTK_FILL, GTK_FILL, 0, 0); ags_connectable_connect(AGS_CONNECTABLE(bulk_member)); gtk_widget_show_all((GtkWidget *) effect_bulk->table); x++; } plugin_port = plugin_port->next; k++; } g_list_free_full(start_plugin_port, g_object_unref); } /** * ags_live_dssi_bridge_new: * @soundcard: the assigned soundcard. * @filename: the plugin.so * @effect: the effect * * Create a new instance of #AgsLiveDssiBridge * * Returns: the new #AgsLiveDssiBridge * * Since: 3.0.0 */ AgsLiveDssiBridge* ags_live_dssi_bridge_new(GObject *soundcard, gchar *filename, gchar *effect) { AgsLiveDssiBridge *live_dssi_bridge; live_dssi_bridge = (AgsLiveDssiBridge *) g_object_new(AGS_TYPE_LIVE_DSSI_BRIDGE, NULL); if(soundcard != NULL){ g_object_set(G_OBJECT(AGS_MACHINE(live_dssi_bridge)->audio), "output-soundcard", soundcard, NULL); } g_object_set(live_dssi_bridge, "filename", filename, "effect", effect, NULL); return(live_dssi_bridge); } gsequencer-3.1.3/ags/X/machine/ags_fm_synth_input_line.h0000644000175000017500000000440213607210263020245 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNTH_INPUT_LINE_H__ #define __AGS_FM_SYNTH_INPUT_LINE_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FM_SYNTH_INPUT_LINE (ags_fm_synth_input_line_get_type()) #define AGS_FM_SYNTH_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FM_SYNTH_INPUT_LINE, AgsFMSynthInputLine)) #define AGS_FM_SYNTH_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FM_SYNTH_INPUT_LINE, AgsFMSynthInputLineClass)) #define AGS_IS_FM_SYNTH_INPUT_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FM_SYNTH_INPUT_LINE)) #define AGS_IS_FM_SYNTH_INPUT_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FM_SYNTH_INPUT_LINE)) #define AGS_FM_SYNTH_INPUT_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_FM_SYNTH_INPUT_LINE, AgsFMSynthInputLineClass)) typedef struct _AgsFMSynthInputLine AgsFMSynthInputLine; typedef struct _AgsFMSynthInputLineClass AgsFMSynthInputLineClass; struct _AgsFMSynthInputLine { AgsLine line; gchar *name; gchar *xml_type; AgsFMOscillator *fm_oscillator; }; struct _AgsFMSynthInputLineClass { AgsLineClass line; }; GType ags_fm_synth_input_line_get_type(); AgsFMSynthInputLine* ags_fm_synth_input_line_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_FM_SYNTH_INPUT_LINE_H__*/ gsequencer-3.1.3/ags/X/machine/ags_panel.h0000644000175000017500000000362413607210263015274 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PANEL_H__ #define __AGS_PANEL_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PANEL (ags_panel_get_type()) #define AGS_PANEL(obj) ((AgsPanel*) G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_PANEL, AgsPanel)) #define AGS_PANEL_CLASS(class) ((AgsPanelClass*) G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PANEL, AgsPanelClass)) #define AGS_IS_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE(obj, AGS_TYPE_PANEL)) #define AGS_IS_PANEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PANEL)) #define AGS_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PANEL, AgsPanelClass)) typedef struct _AgsPanel AgsPanel; typedef struct _AgsPanelClass AgsPanelClass; struct _AgsPanel { AgsMachine machine; gchar *name; gchar *xml_type; GtkVBox *vbox; }; struct _AgsPanelClass { AgsMachineClass machine; }; GType ags_panel_get_type(void); AgsPanel* ags_panel_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_PANEL_H__*/ gsequencer-3.1.3/ags/X/machine/ags_mixer.c0000644000175000017500000001274113607210263015314 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_mixer_class_init(AgsMixerClass *mixer); void ags_mixer_connectable_interface_init(AgsConnectableInterface *connectable); void ags_mixer_init(AgsMixer *mixer); void ags_mixer_finalize(GObject *gobject); void ags_mixer_connect(AgsConnectable *connectable); void ags_mixer_disconnect(AgsConnectable *connectable); void ags_mixer_map_recall(AgsMachine *machine); /** * SECTION:ags_mixer * @short_description: mixer * @title: AgsMixer * @section_id: * @include: ags/X/machine/ags_mixer.h * * The #AgsMixer is a composite widget to act as mixer. */ static gpointer ags_mixer_parent_class = NULL; static AgsConnectableInterface *ags_mixer_parent_connectable_interface; GType ags_mixer_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mixer = 0; static const GTypeInfo ags_mixer_info = { sizeof(AgsMixerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mixer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMixer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mixer_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_mixer_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_mixer = g_type_register_static(AGS_TYPE_MACHINE, "AgsMixer", &ags_mixer_info, 0); g_type_add_interface_static(ags_type_mixer, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_mixer); } return g_define_type_id__volatile; } void ags_mixer_class_init(AgsMixerClass *mixer) { GObjectClass *gobject; AgsMachineClass *machine; ags_mixer_parent_class = g_type_class_peek_parent(mixer); /* GObjectClass */ gobject = (GObjectClass *) mixer; gobject->finalize = ags_mixer_finalize; /* AgsMachine */ machine = (AgsMachineClass *) mixer; machine->map_recall = ags_mixer_map_recall; } void ags_mixer_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_mixer_connectable_parent_interface; ags_mixer_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_mixer_connect; connectable->disconnect = ags_mixer_disconnect; } void ags_mixer_init(AgsMixer *mixer) { g_signal_connect_after((GObject *) mixer, "parent_set", G_CALLBACK(ags_mixer_parent_set_callback), (gpointer) mixer); ags_audio_set_flags(AGS_MACHINE(mixer)->audio, (AGS_AUDIO_ASYNC)); g_object_set(AGS_MACHINE(mixer)->audio, "min-audio-channels", 1, "max-output-pads", 1, "min-output-pads", 1, "min-input-pads", 1, NULL); AGS_MACHINE(mixer)->input_pad_type = AGS_TYPE_MIXER_INPUT_PAD; AGS_MACHINE(mixer)->input_line_type = AGS_TYPE_MIXER_INPUT_LINE; AGS_MACHINE(mixer)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(mixer)->output_line_type = G_TYPE_NONE; /* */ mixer->name = NULL; mixer->xml_type = "ags-mixer"; /* input */ mixer->input_pad = (GtkHBox *) gtk_hbox_new(FALSE, 0); AGS_MACHINE(mixer)->input = (GtkContainer *) mixer->input_pad; gtk_container_add((GtkContainer*) (gtk_container_get_children((GtkContainer *) mixer))->data, (GtkWidget *) mixer->input_pad); } void ags_mixer_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_mixer_parent_class)->finalize(gobject); } void ags_mixer_connect(AgsConnectable *connectable) { if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_mixer_parent_connectable_interface->connect(connectable); } void ags_mixer_disconnect(AgsConnectable *connectable) { if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_mixer_parent_connectable_interface->disconnect(connectable); } void ags_mixer_map_recall(AgsMachine *machine) { AGS_MACHINE_CLASS(ags_mixer_parent_class)->map_recall(machine); /* empty */ } /** * ags_mixer_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsMixer * * Returns: the new #AgsMixer * * Since: 3.0.0 */ AgsMixer* ags_mixer_new(GObject *soundcard) { AgsMixer *mixer; mixer = (AgsMixer *) g_object_new(AGS_TYPE_MIXER, NULL); g_object_set(AGS_MACHINE(mixer)->audio, "output-soundcard", soundcard, NULL); return(mixer); } gsequencer-3.1.3/ags/X/machine/ags_panel_callbacks.c0000644000175000017500000000252413607210263017264 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_panel_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsPanel *panel) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = AGS_WINDOW(gtk_widget_get_toplevel(widget)); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_PANEL)->counter); g_object_set(AGS_MACHINE(panel), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_PANEL); g_free(str); } gsequencer-3.1.3/ags/X/machine/ags_synth.h0000644000175000017500000000446613607210263015347 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_H__ #define __AGS_SYNTH_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SYNTH (ags_synth_get_type()) #define AGS_SYNTH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SYNTH, AgsSynth)) #define AGS_SYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SYNTH, AgsSynthClass)) #define AGS_IS_SYNTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SYNTH)) #define AGS_IS_SYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SYNTH)) #define AGS_SYNTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SYNTH, AgsSynthClass)) #define AGS_SYNTH_BASE_NOTE_MAX (72.0) #define AGS_SYNTH_BASE_NOTE_MIN (-72.0) typedef struct _AgsSynth AgsSynth; typedef struct _AgsSynthClass AgsSynthClass; typedef enum{ AGS_SYNTH_AUTO_UPDATE = 1, }AgsSynthFlags; struct _AgsSynth { AgsMachine machine; guint flags; gchar *name; gchar *xml_type; guint mapped_input_pad; guint mapped_output_pad; GtkVBox *input_pad; GtkSpinButton *lower; // how many channels until to lowest freq GtkSpinButton *loop_start; GtkSpinButton *loop_end; GtkCheckButton *auto_update; GtkButton *update; }; struct _AgsSynthClass { AgsMachineClass machine; }; GType ags_synth_get_type(void); void ags_synth_update(AgsSynth *synth); AgsSynth* ags_synth_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_SYNTH_H__*/ gsequencer-3.1.3/ags/X/machine/ags_spectrometer.h0000644000175000017500000000565713607210263016721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SPECTROMETER_H__ #define __AGS_SPECTROMETER_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SPECTROMETER (ags_spectrometer_get_type()) #define AGS_SPECTROMETER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SPECTROMETER, AgsSpectrometer)) #define AGS_SPECTROMETER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SPECTROMETER, AgsSpectrometerClass)) #define AGS_IS_SPECTROMETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SPECTROMETER)) #define AGS_IS_SPECTROMETER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SPECTROMETER)) #define AGS_SPECTROMETER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SPECTROMETER, AgsSpectrometerClass)) #define AGS_SPECTROMETER_DEFAULT_X_START (AGS_CARTESIAN_DEFAULT_X_START) #define AGS_SPECTROMETER_DEFAULT_X_END (859.0) #define AGS_SPECTROMETER_DEFAULT_Y_START (AGS_CARTESIAN_DEFAULT_Y_START) #define AGS_SPECTROMETER_DEFAULT_Y_END (239.0) #define AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT (192) #define AGS_SPECTROMETER_EXTRA_SCALE (5.0) typedef struct _AgsSpectrometer AgsSpectrometer; typedef struct _AgsSpectrometerClass AgsSpectrometerClass; struct _AgsSpectrometer { AgsMachine machine; gchar *name; gchar *xml_type; AgsCartesian *cartesian; GList *fg_plot; GList *frequency_buffer_play_port; GList *frequency_buffer_recall_port; GList *magnitude_buffer_play_port; GList *magnitude_buffer_recall_port; guint buffer_size; double *frequency_buffer; double *magnitude_buffer; }; struct _AgsSpectrometerClass { AgsMachineClass machine; }; GType ags_spectrometer_get_type(void); AgsPort* ags_spectrometer_find_specifier(GList *recall, gchar *specifier); AgsPlot* ags_spectrometer_fg_plot_alloc(AgsSpectrometer *spectrometer, gdouble color_r, gdouble color_g, double color_b); gboolean ags_spectrometer_cartesian_queue_draw_timeout(GtkWidget *widget); AgsSpectrometer* ags_spectrometer_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_SPECTROMETER_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ffplayer_input_pad_callbacks.c0000644000175000017500000000147613605312647022054 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include gsequencer-3.1.3/ags/X/machine/ags_panel.c0000644000175000017500000001544113607210263015267 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_panel_class_init(AgsPanelClass *panel); void ags_panel_connectable_interface_init(AgsConnectableInterface *connectable); void ags_panel_init(AgsPanel *panel); static void ags_panel_finalize(GObject *gobject); void ags_panel_connect(AgsConnectable *connectable); void ags_panel_disconnect(AgsConnectable *connectable); void ags_panel_map_recall(AgsMachine *machine); void ags_file_read_panel(AgsFile *file, xmlNode *node, AgsMachine *panel); xmlNode* ags_file_write_panel(AgsFile *file, xmlNode *parent, AgsMachine *panel); void ags_panel_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data); void ags_panel_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data); /** * SECTION:ags_panel * @short_description: panel * @title: AgsPanel * @section_id: * @include: ags/X/machine/ags_panel.h * * The #AgsPanel is a composite widget to act as panel. */ static gpointer ags_panel_parent_class = NULL; static AgsConnectableInterface *ags_panel_parent_connectable_interface; GType ags_panel_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_panel = 0; static const GTypeInfo ags_panel_info = { sizeof(AgsPanelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_panel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPanel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_panel_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_panel_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_panel = g_type_register_static(AGS_TYPE_MACHINE, "AgsPanel", &ags_panel_info, 0); g_type_add_interface_static(ags_type_panel, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_panel); } return g_define_type_id__volatile; } void ags_panel_class_init(AgsPanelClass *panel) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_panel_parent_class = g_type_class_peek_parent(panel); /* GtkObjectClass */ gobject = (GObjectClass *) panel; gobject->finalize = ags_panel_finalize; /* GtkWidgetClass */ widget = (GtkWidgetClass *) panel; /* AgsMachine */ machine = (AgsMachineClass *) panel; machine->map_recall = ags_panel_map_recall; } void ags_panel_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_panel_connectable_parent_interface; ags_panel_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_panel_connect; connectable->disconnect = ags_panel_disconnect; } void ags_panel_init(AgsPanel *panel) { g_signal_connect_after((GObject *) panel, "parent-set", G_CALLBACK(ags_panel_parent_set_callback), (gpointer) panel); ags_machine_popup_add_connection_options((AgsMachine *) panel, (AGS_MACHINE_POPUP_CONNECTION_EDITOR)); AGS_MACHINE(panel)->connection_flags |= AGS_MACHINE_SHOW_AUDIO_OUTPUT_CONNECTION; ags_audio_set_flags(AGS_MACHINE(panel)->audio, (AGS_AUDIO_SYNC)); g_object_set(AGS_MACHINE(panel)->audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, NULL); AGS_MACHINE(panel)->input_pad_type = AGS_TYPE_PANEL_INPUT_PAD; AGS_MACHINE(panel)->input_pad_type = AGS_TYPE_PANEL_INPUT_PAD; AGS_MACHINE(panel)->input_line_type = AGS_TYPE_PANEL_INPUT_LINE; AGS_MACHINE(panel)->output_pad_type = G_TYPE_NONE; AGS_MACHINE(panel)->output_line_type = G_TYPE_NONE; g_signal_connect(G_OBJECT(panel), "resize-audio-channels", G_CALLBACK(ags_panel_resize_audio_channels), NULL); g_signal_connect(G_OBJECT(panel), "resize-pads", G_CALLBACK(ags_panel_resize_pads), NULL); /* */ panel->name = NULL; panel->xml_type = "ags-panel"; panel->vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer*) (gtk_bin_get_child((GtkBin *) panel)), (GtkWidget *) panel->vbox); /* input */ AGS_MACHINE(panel)->input = (GtkContainer *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) panel->vbox, (GtkWidget *) AGS_MACHINE(panel)->input, FALSE, FALSE, 0); } static void ags_panel_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_panel_parent_class)->finalize(gobject); } void ags_panel_connect(AgsConnectable *connectable) { if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_panel_parent_connectable_interface->connect(connectable); /* empty */ } void ags_panel_disconnect(AgsConnectable *connectable) { if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_panel_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_panel_map_recall(AgsMachine *machine) { AGS_MACHINE_CLASS(ags_panel_parent_class)->map_recall(machine); /* empty */ } void ags_panel_resize_audio_channels(AgsMachine *machine, guint audio_channels, guint audio_channels_old, gpointer data) { //empty } void ags_panel_resize_pads(AgsMachine *machine, GType channel_type, guint pads, guint pads_old, gpointer data) { //empty } /** * ags_panel_new: * @soundcard: the assigned soundcard. * * Create a new instance of #AgsPanel * * Returns: the new #AgsPanel * * Since: 3.0.0 */ AgsPanel* ags_panel_new(GObject *soundcard) { AgsPanel *panel; panel = (AgsPanel *) g_object_new(AGS_TYPE_PANEL, NULL); g_object_set(AGS_MACHINE(panel)->audio, "output-soundcard", soundcard, NULL); return(panel); } gsequencer-3.1.3/ags/X/machine/ags_panel_callbacks.h0000644000175000017500000000224313607210263017267 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PANEL_CALLBACKS_H__ #define __AGS_PANEL_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_panel_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsPanel *panel); G_END_DECLS #endif /*__AGS_PANEL_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_ladspa_bridge.c0000644000175000017500000002574413607210263016757 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_ladspa_bridge_class_init(AgsLadspaBridgeClass *ladspa_bridge); void ags_ladspa_bridge_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ladspa_bridge_init(AgsLadspaBridge *ladspa_bridge); void ags_ladspa_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ladspa_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ladspa_bridge_finalize(GObject *gobject); void ags_ladspa_bridge_connect(AgsConnectable *connectable); void ags_ladspa_bridge_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ladspa_bridge * @short_description: A composite widget to visualize a bunch of #AgsChannel * @title: AgsLadspaBridge * @section_id: * @include: ags/X/machine/ags_ladspa_bridge.h * * #AgsLadspaBridge is a composite widget to visualize all #AgsChannel. It should be * packed by an #AgsMachine. */ enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_INDEX, }; static gpointer ags_ladspa_bridge_parent_class = NULL; static AgsConnectableInterface* ags_ladspa_bridge_parent_connectable_interface; GType ags_ladspa_bridge_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ladspa_bridge = 0; static const GTypeInfo ags_ladspa_bridge_info = { sizeof(AgsLadspaBridgeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ladspa_bridge_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLadspaBridge), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ladspa_bridge_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ladspa_bridge_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ladspa_bridge = g_type_register_static(AGS_TYPE_MACHINE, "AgsLadspaBridge", &ags_ladspa_bridge_info, 0); g_type_add_interface_static(ags_type_ladspa_bridge, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ladspa_bridge); } return g_define_type_id__volatile; } void ags_ladspa_bridge_class_init(AgsLadspaBridgeClass *ladspa_bridge) { GObjectClass *gobject; GParamSpec *param_spec; ags_ladspa_bridge_parent_class = g_type_class_peek_parent(ladspa_bridge); /* GObjectClass */ gobject = G_OBJECT_CLASS(ladspa_bridge); gobject->set_property = ags_ladspa_bridge_set_property; gobject->get_property = ags_ladspa_bridge_get_property; gobject->finalize = ags_ladspa_bridge_finalize; /* properties */ /** * AgsRecallLadspa:filename: * * The plugins filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the object file"), i18n_pspec("The filename as string of object file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecallLadspa:effect: * * The effect's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsRecallLadspa:index: * * The effect's index. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("index", i18n_pspec("index of effect"), i18n_pspec("The numerical index of effect"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX, param_spec); } void ags_ladspa_bridge_connectable_interface_init(AgsConnectableInterface *connectable) { ags_ladspa_bridge_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_ladspa_bridge_connect; connectable->disconnect = ags_ladspa_bridge_disconnect; } void ags_ladspa_bridge_init(AgsLadspaBridge *ladspa_bridge) { GtkTable *table; AgsAudio *audio; g_signal_connect_after((GObject *) ladspa_bridge, "parent-set", G_CALLBACK(ags_ladspa_bridge_parent_set_callback), (gpointer) ladspa_bridge); audio = AGS_MACHINE(ladspa_bridge)->audio; ags_audio_set_flags(audio, (AGS_AUDIO_SYNC)); g_object_set(audio, "min-audio-channels", 1, "min-output-pads", 1, "min-input-pads", 1, NULL); ladspa_bridge->flags = 0; ladspa_bridge->name = NULL; ladspa_bridge->version = AGS_LADSPA_BRIDGE_DEFAULT_VERSION; ladspa_bridge->build_id = AGS_LADSPA_BRIDGE_DEFAULT_BUILD_ID; ladspa_bridge->xml_type = "ags-ladspa-bridge"; ladspa_bridge->mapped_output = 0; ladspa_bridge->mapped_input = 0; ladspa_bridge->filename = NULL; ladspa_bridge->effect = NULL; ladspa_bridge->effect_index = 0; AGS_MACHINE(ladspa_bridge)->bridge = (GtkContainer *) ags_effect_bridge_new(audio); gtk_container_add((GtkContainer *) gtk_bin_get_child((GtkBin *) ladspa_bridge), (GtkWidget *) AGS_MACHINE(ladspa_bridge)->bridge); table = (GtkTable *) gtk_table_new(1, 2, FALSE); gtk_box_pack_start((GtkBox *) AGS_EFFECT_BRIDGE(AGS_MACHINE(ladspa_bridge)->bridge), (GtkWidget *) table, FALSE, FALSE, 0); AGS_EFFECT_BRIDGE(AGS_MACHINE(ladspa_bridge)->bridge)->bulk_input = (GtkWidget *) ags_effect_bulk_new(audio, AGS_TYPE_INPUT); AGS_EFFECT_BULK(AGS_EFFECT_BRIDGE(AGS_MACHINE(ladspa_bridge)->bridge)->bulk_input)->flags |= (AGS_EFFECT_BULK_HIDE_BUTTONS | AGS_EFFECT_BULK_HIDE_ENTRIES | AGS_EFFECT_BULK_SHOW_LABELS); gtk_table_attach(table, (GtkWidget *) AGS_EFFECT_BRIDGE(AGS_MACHINE(ladspa_bridge)->bridge)->bulk_input, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } void ags_ladspa_bridge_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLadspaBridge *ladspa_bridge; ladspa_bridge = AGS_LADSPA_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(filename == ladspa_bridge->filename){ return; } if(ladspa_bridge->filename != NULL){ g_free(ladspa_bridge->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) ladspa_bridge); ags_window_show_error(window, g_strdup_printf("Plugin file not present %s", filename)); } } ladspa_bridge->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == ladspa_bridge->effect){ return; } if(ladspa_bridge->effect != NULL){ g_free(ladspa_bridge->effect); } ladspa_bridge->effect = g_strdup(effect); } break; case PROP_INDEX: { unsigned long effect_index; effect_index = g_value_get_ulong(value); if(effect_index == ladspa_bridge->effect_index){ return; } ladspa_bridge->effect_index = effect_index; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ladspa_bridge_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLadspaBridge *ladspa_bridge; ladspa_bridge = AGS_LADSPA_BRIDGE(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, ladspa_bridge->filename); } break; case PROP_EFFECT: { g_value_set_string(value, ladspa_bridge->effect); } break; case PROP_INDEX: { g_value_set_ulong(value, ladspa_bridge->effect_index); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ladspa_bridge_finalize(GObject *gobject) { AgsLadspaBridge *ladspa_bridge; ladspa_bridge = (AgsLadspaBridge *) gobject; g_free(ladspa_bridge->filename); g_free(ladspa_bridge->effect); /* call parent */ G_OBJECT_CLASS(ags_ladspa_bridge_parent_class)->finalize(gobject); } void ags_ladspa_bridge_connect(AgsConnectable *connectable) { if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } ags_ladspa_bridge_parent_connectable_interface->connect(connectable); } void ags_ladspa_bridge_disconnect(AgsConnectable *connectable) { if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } ags_ladspa_bridge_parent_connectable_interface->disconnect(connectable); } void ags_ladspa_bridge_load(AgsLadspaBridge *ladspa_bridge) { /* empty */ #ifdef AGS_DEBUG g_message("%s %s",ladspa_bridge->filename, ladspa_bridge->effect); #endif ags_effect_bulk_add_effect((AgsEffectBulk *) AGS_EFFECT_BRIDGE(AGS_MACHINE(ladspa_bridge)->bridge)->bulk_input, NULL, ladspa_bridge->filename, ladspa_bridge->effect); } /** * ags_ladspa_bridge_new: * @soundcard: the assigned soundcard. * @filename: the plugin.so * @effect: the effect * * Creates an #AgsLadspaBridge * * Returns: a new #AgsLadspaBridge * * Since: 3.0.0 */ AgsLadspaBridge* ags_ladspa_bridge_new(GObject *soundcard, gchar *filename, gchar *effect) { AgsLadspaBridge *ladspa_bridge; ladspa_bridge = (AgsLadspaBridge *) g_object_new(AGS_TYPE_LADSPA_BRIDGE, NULL); g_object_set(AGS_MACHINE(ladspa_bridge)->audio, "output-soundcard", soundcard, NULL); g_object_set(ladspa_bridge, "filename", filename, "effect", effect, NULL); return(ladspa_bridge); } gsequencer-3.1.3/ags/X/machine/ags_desk.c0000644000175000017500000001521713607210263015117 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_desk_class_init(AgsDeskClass *desk); void ags_desk_connectable_interface_init(AgsConnectableInterface *connectable); void ags_desk_init(AgsDesk *desk); void ags_desk_finalize(GObject *gobject); void ags_desk_map_recall(AgsMachine *machine); void ags_desk_connect(AgsConnectable *connectable); void ags_desk_disconnect(AgsConnectable *connectable); /** * SECTION:ags_desk * @short_description: desk sequencer * @title: AgsDesk * @section_id: * @include: ags/X/machine/ags_desk.h * * The #AgsDesk is a composite widget to act as desk sequencer. */ static gpointer ags_desk_parent_class = NULL; static AgsConnectableInterface *ags_desk_parent_connectable_interface; GType ags_desk_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_desk = 0; static const GTypeInfo ags_desk_info = { sizeof(AgsDeskClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_desk_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDesk), 0, /* n_preallocs */ (GInstanceInitFunc) ags_desk_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_desk_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_desk = g_type_register_static(AGS_TYPE_MACHINE, "AgsDesk", &ags_desk_info, 0); g_type_add_interface_static(ags_type_desk, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_desk); } return g_define_type_id__volatile; } void ags_desk_class_init(AgsDeskClass *desk) { GObjectClass *gobject; GtkWidgetClass *widget; AgsMachineClass *machine; ags_desk_parent_class = g_type_class_peek_parent(desk); /* GObjectClass */ gobject = (GObjectClass *) desk; gobject->finalize = ags_desk_finalize; /* */ machine = (AgsMachineClass *) desk; machine->map_recall = ags_desk_map_recall; } void ags_desk_connectable_interface_init(AgsConnectableInterface *connectable) { ags_desk_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_desk_connect; connectable->disconnect = ags_desk_disconnect; } void ags_desk_init(AgsDesk *desk) { GtkHBox *hbox; GtkAlignment *alignment; GtkHBox *balance_hbox; desk->name = NULL; desk->xml_type = "ags-desk"; /* create widgets */ desk->vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer*) gtk_bin_get_child((GtkBin *) desk), (GtkWidget *) desk->vbox); hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) desk->vbox, (GtkWidget *) hbox, FALSE, FALSE, 0); /* left pad */ desk->left_pad = ags_desk_input_pad_new(NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk->left_pad, FALSE, FALSE, 0); /* console */ alignment = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) alignment, FALSE, FALSE, 0); desk->console = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) alignment, (GtkWidget *) desk->console); balance_hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) desk->console, (GtkWidget *) balance_hbox, FALSE, FALSE, 0); desk->move_left = (GtkButton *) gtk_button_new_with_label(i18n("left")); gtk_box_pack_start((GtkBox *) balance_hbox, (GtkWidget *) desk->move_left, FALSE, FALSE, 0); desk->balance = (GtkScale *) gtk_hscale_new_with_range(-1.0, 1.0, 0.1); gtk_widget_set_size_request((GtkWidget *) desk->balance, 200, -1); gtk_box_pack_start((GtkBox *) balance_hbox, (GtkWidget *) desk->balance, FALSE, FALSE, 0); desk->move_right = (GtkButton *) gtk_button_new_with_label(i18n("right")); gtk_box_pack_start((GtkBox *) balance_hbox, (GtkWidget *) desk->move_right, FALSE, FALSE, 0); /* left pad */ desk->right_pad = ags_desk_input_pad_new(NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) desk->right_pad, FALSE, FALSE, 0); /* file chooser */ desk->file_chooser = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN); gtk_widget_set_size_request((GtkWidget *) desk->file_chooser, -1, 400); gtk_box_pack_start((GtkBox *) desk->vbox, (GtkWidget *) desk->file_chooser, FALSE, FALSE, 0); } void ags_desk_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_desk_parent_class)->finalize(gobject); } void ags_desk_connect(AgsConnectable *connectable) { AgsDesk *desk; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) != 0){ return; } desk = AGS_DESK(connectable); /* call parent */ ags_desk_parent_connectable_interface->connect(connectable); } void ags_desk_disconnect(AgsConnectable *connectable) { AgsDesk *desk; int i; if((AGS_MACHINE_CONNECTED & (AGS_MACHINE(connectable)->flags)) == 0){ return; } desk = AGS_DESK(connectable); /* call parent */ ags_desk_parent_connectable_interface->disconnect(connectable); } void ags_desk_map_recall(AgsMachine *machine) { /* call parent */ AGS_MACHINE_CLASS(ags_desk_parent_class)->map_recall(machine); } /** * ags_desk_new: * @soundcard: the assigned soundcard. * * Creates an #AgsDesk * * Returns: a new #AgsDesk * * Since: 3.0.0 */ AgsDesk* ags_desk_new(GObject *soundcard) { AgsDesk *desk; desk = (AgsDesk *) g_object_new(AGS_TYPE_DESK, NULL); g_object_set(G_OBJECT(AGS_MACHINE(desk)->audio), "soundcard", soundcard, NULL); return(desk); } gsequencer-3.1.3/ags/X/machine/ags_fm_syncsynth_callbacks.c0000644000175000017500000001271013607210263020707 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_fm_syncsynth_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsFMSyncsynth *fm_syncsynth) { AgsWindow *window; gchar *str; if(old_parent != NULL){ return; } window = (AgsWindow *) gtk_widget_get_toplevel(widget); str = g_strdup_printf("Default %d", ags_window_find_machine_counter(window, AGS_TYPE_FM_SYNCSYNTH)->counter); g_object_set(AGS_MACHINE(fm_syncsynth), "machine-name", str, NULL); ags_window_increment_machine_counter(window, AGS_TYPE_FM_SYNCSYNTH); g_free(str); } void ags_fm_syncsynth_samplerate_changed_callback(AgsMachine *machine, guint samplerate, guint old_samplerate, gpointer user_data) { GList *start_list, *list; list = start_list = gtk_container_get_children(AGS_FM_SYNCSYNTH(machine)->fm_oscillator); while(list != NULL){ AgsFMOscillator *fm_oscillator; GList *start_child, *child; guint i; start_child = gtk_container_get_children(list->data); child = ags_list_util_find_type(start_child, AGS_TYPE_FM_OSCILLATOR); if(child != NULL){ fm_oscillator = child->data; gtk_spin_button_set_value(fm_oscillator->attack, samplerate * (gtk_spin_button_get_value(fm_oscillator->attack) / old_samplerate)); gtk_spin_button_set_value(fm_oscillator->frame_count, samplerate * (gtk_spin_button_get_value(fm_oscillator->frame_count) / old_samplerate)); gtk_spin_button_set_value(fm_oscillator->phase, samplerate * (gtk_spin_button_get_value(fm_oscillator->phase) / old_samplerate)); for(i = 0; i < fm_oscillator->sync_point_count; i++){ gtk_spin_button_set_value(fm_oscillator->sync_point[i * 2], samplerate * (gtk_spin_button_get_value(fm_oscillator->sync_point[i * 2]) / old_samplerate)); gtk_spin_button_set_value(fm_oscillator->sync_point[i * 2 + 1], samplerate * (gtk_spin_button_get_value(fm_oscillator->sync_point[i * 2 + 1]) / old_samplerate)); } } g_list_free(start_child); list = list->next; } g_list_free(start_list); gtk_spin_button_set_value(AGS_FM_SYNCSYNTH(machine)->loop_start, samplerate * (gtk_spin_button_get_value(AGS_FM_SYNCSYNTH(machine)->loop_start) / old_samplerate)); gtk_spin_button_set_value(AGS_FM_SYNCSYNTH(machine)->loop_end, samplerate * (gtk_spin_button_get_value(AGS_FM_SYNCSYNTH(machine)->loop_end) / old_samplerate)); } void ags_fm_syncsynth_auto_update_callback(GtkToggleButton *toggle, AgsFMSyncsynth *fm_syncsynth) { if(gtk_toggle_button_get_active(toggle)){ fm_syncsynth->flags |= AGS_FM_SYNCSYNTH_AUTO_UPDATE; }else{ fm_syncsynth->flags &= (~AGS_FM_SYNCSYNTH_AUTO_UPDATE); } } void ags_fm_syncsynth_add_callback(GtkButton *button, AgsFMSyncsynth *fm_syncsynth) { AgsFMOscillator *fm_oscillator; fm_oscillator = ags_fm_oscillator_new(); ags_fm_syncsynth_add_fm_oscillator(fm_syncsynth, fm_oscillator); ags_connectable_connect(AGS_CONNECTABLE(fm_oscillator)); g_signal_connect((GObject *) fm_oscillator, "control-changed", G_CALLBACK(ags_fm_syncsynth_fm_oscillator_control_changed_callback), (gpointer) fm_syncsynth); } void ags_fm_syncsynth_remove_callback(GtkButton *button, AgsFMSyncsynth *fm_syncsynth) { GList *list, *list_start; GList *child_start; guint nth; list = list_start = gtk_container_get_children(GTK_CONTAINER(fm_syncsynth->fm_oscillator)); nth = 0; while(list != NULL){ child_start = gtk_container_get_children(GTK_CONTAINER(list->data)); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(child_start->data))){ ags_fm_syncsynth_remove_fm_oscillator(fm_syncsynth, nth); }else{ nth++; } g_list_free(child_start); list = list->next; } g_list_free(list_start); } void ags_fm_syncsynth_update_callback(GtkButton *button, AgsFMSyncsynth *fm_syncsynth) { ags_fm_syncsynth_update(fm_syncsynth); } void ags_fm_syncsynth_fm_oscillator_control_changed_callback(AgsFMOscillator *fm_oscillator, AgsFMSyncsynth *fm_syncsynth) { ags_fm_syncsynth_reset_loop(fm_syncsynth); if((AGS_FM_SYNCSYNTH_AUTO_UPDATE & (fm_syncsynth->flags)) != 0){ ags_fm_syncsynth_update(fm_syncsynth); } } void ags_fm_syncsynth_lower_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth) { //TODO:JK: implement me } void ags_fm_syncsynth_loop_start_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth) { //TODO:JK: implement me } void ags_fm_syncsynth_loop_end_callback(GtkSpinButton *spin_button, AgsFMSyncsynth *fm_syncsynth) { //TODO:JK: implement me } gsequencer-3.1.3/ags/X/machine/ags_ladspa_bridge_callbacks.h0000644000175000017500000000233213607210263020747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_BRIDGE_CALLBACKS_H__ #define __AGS_LADSPA_BRIDGE_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_ladspa_bridge_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsLadspaBridge *ladspa_bridge); G_END_DECLS #endif /*__AGS_LADSPA_BRIDGE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/machine/ags_oscillator.c0000644000175000017500000003024413607210263016341 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_oscillator_class_init(AgsOscillatorClass *oscillator); void ags_oscillator_connectable_interface_init(AgsConnectableInterface *connectable); void ags_oscillator_init(AgsOscillator *oscillator); void ags_oscillator_connect(AgsConnectable *connectable); void ags_oscillator_disconnect(AgsConnectable *connectable); /** * SECTION:ags_oscillator * @short_description: oscillator * @title: AgsOscillator * @section_id: * @include: ags/X/machine/ags_oscillator.h * * The #AgsOscillator is a composite widget to act as oscillator. */ enum{ CONTROL_CHANGED, LAST_SIGNAL, }; static gpointer ags_oscillator_parent_class = NULL; static guint oscillator_signals[LAST_SIGNAL]; static AgsConnectableInterface *ags_oscillator_parent_connectable_interface; GType ags_oscillator_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_oscillator = 0; static const GTypeInfo ags_oscillator_info = { sizeof(AgsOscillatorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_oscillator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsOscillator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_oscillator_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_oscillator_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_oscillator = g_type_register_static(GTK_TYPE_FRAME, "AgsOscillator", &ags_oscillator_info, 0); g_type_add_interface_static(ags_type_oscillator, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_oscillator); } return g_define_type_id__volatile; } void ags_oscillator_class_init(AgsOscillatorClass *oscillator) { GParamSpec *param_spec; ags_oscillator_parent_class = g_type_class_peek_parent(oscillator); /* signals */ /** * AgsOscillator::control-change: * @oscillator: the #AgsOscillator * * The ::control-change signal notifies about controls modified. * * Since: 3.0.0 */ oscillator_signals[CONTROL_CHANGED] = g_signal_new("control-changed", G_TYPE_FROM_CLASS(oscillator), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscillatorClass, control_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_oscillator_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_oscillator_connectable_parent_interface; ags_oscillator_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_oscillator_connect; connectable->disconnect = ags_oscillator_disconnect; } void ags_oscillator_init(AgsOscillator *oscillator) { GtkTable *table; GtkHBox *hbox; GtkHBox *sync_box; GtkCellRenderer *cell_renderer; GtkListStore *model; GtkTreeIter iter; guint i; oscillator->flags = 0; table = (GtkTable *) gtk_table_new(8, 2, FALSE); gtk_container_add((GtkContainer *) oscillator, (GtkWidget *) table); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("wave")), 0, 1, 0, 1); /* wave */ oscillator->wave = (GtkComboBox *) gtk_combo_box_text_new(); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->wave, 1, 2, 0, 1); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(oscillator->wave), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(oscillator->wave), cell_renderer, "text", 0, NULL); model = gtk_list_store_new(1, G_TYPE_STRING); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "sin", -1); /* gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, "cos", -1); */ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("sawtooth"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("square"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("triangle"), -1); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, i18n("impulse"), -1); gtk_combo_box_set_model(oscillator->wave, GTK_TREE_MODEL(model)); gtk_combo_box_set_active(oscillator->wave, 0); /* other controls */ gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("attack")), 2, 3, 0, 1); oscillator->attack = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_spin_button_set_value(oscillator->attack, 0.0); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->attack, 3, 4, 0, 1); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("length")), 4, 5, 0, 1); oscillator->frame_count = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_spin_button_set_value(oscillator->frame_count, AGS_OSCILLATOR_DEFAULT_FRAME_COUNT); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->frame_count, 5, 6, 0, 1); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("phase")), 0, 1, 1, 2); oscillator->phase = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_spin_button_set_value(oscillator->phase, 0.0); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->phase, 1, 2, 1, 2); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("frequency")), 2, 3, 1, 2); oscillator->frequency = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 100000.0, 1.0); gtk_spin_button_set_digits(oscillator->frequency, 3); gtk_spin_button_set_value(oscillator->frequency, 27.5); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->frequency, 3, 4, 1, 2); gtk_table_attach_defaults(table, (GtkWidget *) gtk_label_new(i18n("volume")), 4, 5, 1, 2); oscillator->volume = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 1.0, 0.1); gtk_spin_button_set_digits(oscillator->volume, 3); gtk_spin_button_set_value(oscillator->volume, 0.2); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->volume, 5, 6, 1, 2); /* do sync */ oscillator->do_sync = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("sync")); gtk_table_attach_defaults(table, (GtkWidget *) oscillator->do_sync, 6, 7, 0, 1); hbox = (GtkHBox *) gtk_hbox_new(TRUE, 0); gtk_table_attach_defaults(table, (GtkWidget *) hbox, 6, 7, 1, 2); oscillator->sync_point_count = AGS_OSCILLATOR_DEFAULT_SYNC_POINT_COUNT; oscillator->sync_point = (GtkSpinButton **) malloc(2 * oscillator->sync_point_count * sizeof(GtkSpinButton *)); for(i = 0; i < oscillator->sync_point_count; i++){ sync_box = (GtkHBox *) gtk_hbox_new(TRUE, 0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) sync_box, FALSE, FALSE, 0); oscillator->sync_point[2 * i] = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_box_pack_start((GtkBox *) sync_box, (GtkWidget *) oscillator->sync_point[2 * i], FALSE, FALSE, 0); oscillator->sync_point[2 * i + 1] = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 100000.0, 1.0); gtk_box_pack_start((GtkBox *) sync_box, (GtkWidget *) oscillator->sync_point[2 * i + 1], FALSE, FALSE, 0); } } void ags_oscillator_connect(AgsConnectable *connectable) { AgsOscillator *oscillator; guint i; oscillator = AGS_OSCILLATOR(connectable); if((AGS_OSCILLATOR_CONNECTED & (oscillator->flags)) != 0){ return; } oscillator->flags |= AGS_OSCILLATOR_CONNECTED; g_signal_connect(G_OBJECT(oscillator->wave), "changed", G_CALLBACK(ags_oscillator_wave_callback), oscillator); g_signal_connect(G_OBJECT(oscillator->attack), "value-changed", G_CALLBACK(ags_oscillator_attack_callback), oscillator); g_signal_connect(G_OBJECT(oscillator->frame_count), "value-changed", G_CALLBACK(ags_oscillator_frame_count_callback), oscillator); g_signal_connect(G_OBJECT(oscillator->frequency), "value-changed", G_CALLBACK(ags_oscillator_frequency_callback), oscillator); g_signal_connect(G_OBJECT(oscillator->phase), "value-changed", G_CALLBACK(ags_oscillator_phase_callback), oscillator); g_signal_connect(G_OBJECT(oscillator->volume), "value-changed", G_CALLBACK(ags_oscillator_volume_callback), oscillator); for(i = 0; i < 2 * oscillator->sync_point_count; i++){ g_signal_connect(G_OBJECT(oscillator->sync_point[i]), "value-changed", G_CALLBACK(ags_oscillator_sync_point_callback), oscillator); } } void ags_oscillator_disconnect(AgsConnectable *connectable) { AgsOscillator *oscillator; guint i; oscillator = AGS_OSCILLATOR(connectable); if((AGS_OSCILLATOR_CONNECTED & (oscillator->flags)) == 0){ return; } oscillator->flags &= (~AGS_OSCILLATOR_CONNECTED); g_object_disconnect((GObject *) oscillator->wave, "any_signal::changed", G_CALLBACK(ags_oscillator_wave_callback), (gpointer) oscillator, NULL); g_object_disconnect((GObject *) oscillator->frame_count, "any_signal::value-changed", G_CALLBACK(ags_oscillator_frame_count_callback), (gpointer) oscillator, NULL); g_object_disconnect((GObject *) oscillator->attack, "any_signal::value-changed", G_CALLBACK(ags_oscillator_attack_callback), (gpointer) oscillator, NULL); g_object_disconnect((GObject *) oscillator->frequency, "any_signal::value-changed", G_CALLBACK(ags_oscillator_frequency_callback), (gpointer) oscillator, NULL); g_object_disconnect((GObject *) oscillator->phase, "any_signal::value-changed", G_CALLBACK(ags_oscillator_phase_callback), (gpointer) oscillator, NULL); g_object_disconnect((GObject *) oscillator->volume, "any_signal::value-changed", G_CALLBACK(ags_oscillator_volume_callback), (gpointer) oscillator, NULL); for(i = 0; i < 2 * oscillator->sync_point_count; i++){ g_object_disconnect((GObject *) oscillator->sync_point[i], "any_signal::value-changed", G_CALLBACK(ags_oscillator_sync_point_callback), (gpointer) oscillator, NULL); } } /** * ags_oscillator_control_changed: * @oscillator: the #AgsOscillator * * The control changed event notifies about changed controls. * * Since: 3.0.0 */ void ags_oscillator_control_changed(AgsOscillator *oscillator) { g_return_if_fail(AGS_IS_OSCILLATOR(oscillator)); g_object_ref((GObject *) oscillator); g_signal_emit(G_OBJECT(oscillator), oscillator_signals[CONTROL_CHANGED], 0); g_object_unref((GObject *) oscillator); } /** * ags_oscillator_new: * * Create a new instance of #AgsOscillator * * Returns: the new #AgsOscillator * * Since: 3.0.0 */ AgsOscillator* ags_oscillator_new() { AgsOscillator *oscillator; oscillator = (AgsOscillator *) g_object_new(AGS_TYPE_OSCILLATOR, NULL); return(oscillator); } gsequencer-3.1.3/ags/X/machine/ags_drum_input_line_callbacks.h0000644000175000017500000000211713607210263021365 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DRUM_INPUT_LINE_CALLBACKS_H__ #define __AGS_DRUM_INPUT_LINE_CALLBACKS_H__ #include #include #include #include #include #include #include #endif /*__AGS_DRUM_INPUT_LINE_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_bulk_member.c0000644000175000017500000012073313607210264015052 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_bulk_member_class_init(AgsBulkMemberClass *bulk_member); void ags_bulk_member_connectable_interface_init(AgsConnectableInterface *connectable); void ags_bulk_member_init(AgsBulkMember *bulk_member); void ags_bulk_member_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_bulk_member_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_bulk_member_finalize(GObject *gobject); void ags_bulk_member_connect(AgsConnectable *connectable); void ags_bulk_member_disconnect(AgsConnectable *connectable); void ags_bulk_member_change_port_all(AgsBulkMember *bulk_member, GList *list, gpointer port_data); void ags_bulk_member_real_change_port(AgsBulkMember *bulk_member, gpointer port_data); AgsPort* ags_bulk_member_find_specifier(GList *recall, gchar *specifier); GList* ags_bulk_member_real_find_port(AgsBulkMember *bulk_member); /** * SECTION:ags_bulk_member * @short_description: Modify assigned recall's port * @title: AgsBulkMember * @section_id: * @include: ags/X/ags_bulk_member.h * * #AgsBulkMember is a composite widget to modify ports of recalls. A bulk member * controls only one specific port of a recall but distinguishes between simple/complex * recall. It is generally packed into a #AgsBulk. */ enum{ CHANGE_PORT, FIND_PORT, LAST_SIGNAL, }; enum{ PROP_0, PROP_WIDGET_TYPE, PROP_WIDGET_LABEL, PROP_PLUGIN_NAME, PROP_FILENAME, PROP_EFFECT, PROP_SPECIFIER, PROP_PORT_INDEX, PROP_CONTROL_PORT, PROP_SCALE_PRECISION, PROP_STEP_COUNT, PROP_CONVERSION, PROP_TASK_TYPE, PROP_BULK_PORT, PROP_RECALL_BULK_PORT, }; static gpointer ags_bulk_member_parent_class = NULL; static guint bulk_member_signals[LAST_SIGNAL]; GType ags_bulk_member_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_bulk_member = 0; static const GTypeInfo ags_bulk_member_info = { sizeof(AgsBulkMemberClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_bulk_member_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsBulkMember), 0, /* n_preallocs */ (GInstanceInitFunc) ags_bulk_member_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_bulk_member_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_bulk_member = g_type_register_static(GTK_TYPE_FRAME, "AgsBulkMember", &ags_bulk_member_info, 0); g_type_add_interface_static(ags_type_bulk_member, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_bulk_member); } return g_define_type_id__volatile; } void ags_bulk_member_class_init(AgsBulkMemberClass *bulk_member) { GObjectClass *gobject; GParamSpec *param_spec; ags_bulk_member_parent_class = g_type_class_peek_parent(bulk_member); /* GObjectClass */ gobject = G_OBJECT_CLASS(bulk_member); gobject->set_property = ags_bulk_member_set_property; gobject->get_property = ags_bulk_member_get_property; gobject->finalize = ags_bulk_member_finalize; /* properties */ /** * AgsBulkMember:widget-type: * * The widget type to instantiate and use as control. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("widget-type", i18n_pspec("widget type of bulk member"), i18n_pspec("The widget type this bulk member packs"), 0, G_MAXULONG, G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WIDGET_TYPE, param_spec); /** * AgsBulkMember:widget-label: * * The widget's label to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("widget-label", i18n_pspec("label to display"), i18n_pspec("The label to display"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WIDGET_LABEL, param_spec); /** * AgsBulkMember:plugin-name: * * The plugin name of the recall to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("plugin-name", i18n_pspec("plugin name to control"), i18n_pspec("The plugin's name to control"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN_NAME, param_spec); /** * AgsBulkMember:specifier: * * The plugin specifier of the recall to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_string("specifier", i18n_pspec("port specifier"), i18n_pspec("The specifier of the port"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SPECIFIER, param_spec); /** * AgsBulkMember:filename: * * The plugin filename of the recall to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename of the plugin"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsBulkMember:effect: * * The plugin effect of the recall to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect of the plugin"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsBulkMember:port-index: * * The port index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("port-index", i18n_pspec("port index"), i18n_pspec("The port's index"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_INDEX, param_spec); /** * AgsBulkMember:control-port: * * The control port of the recall. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-port", i18n_pspec("control port index"), i18n_pspec("The index of the port to control"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_PORT, param_spec); /** * AgsBulkMember:scale-precision: * * If bulk member has integer ports, this is the number of steps. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("scale-precision", i18n_pspec("scale precision of bulk members port"), i18n_pspec("The scale precision this bulk members port has"), 0, G_MAXUINT, (guint) AGS_DIAL_DEFAULT_PRECISION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_PRECISION, param_spec); /** * AgsBulkMember:step-count: * * If bulk member has logarithmic ports, this is the number of step count. * * Since: 3.0.0 */ param_spec = g_param_spec_double("step-count", i18n_pspec("step count of bulk members port"), i18n_pspec("The step count this bulk members port has"), 0.0, G_MAXDOUBLE, AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STEP_COUNT, param_spec); /** * AgsBulkMember:conversion: * * The conversion of the plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("conversion", i18n_pspec("conversion"), i18n_pspec("The conversion of the plugin"), AGS_TYPE_CONVERSION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONVERSION, param_spec); /** * AgsBulkMember:bulk-port: * * The playback bulk port to be added. * * Since: 3.0.0 */ param_spec = g_param_spec_object("bulk-port", i18n_pspec("a bulk port"), i18n_pspec("The bulk port to add"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BULK_PORT, param_spec); /** * AgsBulkMember:recall-bulk-port: * * The recall bulk port to be added. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-bulk-port", i18n_pspec("a recall bulk port"), i18n_pspec("The bulk port to add"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_BULK_PORT, param_spec); /** * AgsBulkMember:task-type: * * The task type to apply the ports. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("task-type", i18n_pspec("task type to apply"), i18n_pspec("The task type to apply the ports"), 0, G_MAXULONG, G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TASK_TYPE, param_spec); /* AgsBulkMember */ bulk_member->change_port = ags_bulk_member_real_change_port; bulk_member->find_port = ags_bulk_member_real_find_port; /* signals */ /** * AgsBulkMember::change-port: * @bulk_member: the #AgsBulkMember * @port_data: the port's data * * The ::change-port signal notifies modified port. * * Since: 3.0.0 */ bulk_member_signals[CHANGE_PORT] = g_signal_new("change-port", G_TYPE_FROM_CLASS(bulk_member), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsBulkMemberClass, change_port), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsBulkMember::find-port: * @bulk_member: the #AgsBulkMember to resize * * The ::find-port as recall should be mapped * * Returns: a #GList with associated ports * * Since: 3.0.0 */ bulk_member_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(bulk_member), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsBulkMemberClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); } void ags_bulk_member_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_bulk_member_connect; connectable->disconnect = ags_bulk_member_disconnect; } void ags_bulk_member_init(AgsBulkMember *bulk_member) { AgsDial *dial; AgsConfig *config; gchar *str; g_signal_connect_after((GObject *) bulk_member, "parent_set", G_CALLBACK(ags_bulk_member_parent_set_callback), (gpointer) bulk_member); bulk_member->flags = (AGS_BULK_MEMBER_RESET_BY_ATOMIC | AGS_BULK_MEMBER_APPLY_RECALL); bulk_member->port_flags = 0; config = ags_config_get_instance(); bulk_member->widget_type = AGS_TYPE_DIAL; dial = (AgsDial *) g_object_new(AGS_TYPE_DIAL, "adjustment", gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0), NULL); str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gdouble gui_scale_factor; gui_scale_factor = g_ascii_strtod(str, NULL); g_object_set(dial, "radius", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_RADIUS), "font-size", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_FONT_SIZE), "button-width", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_WIDTH), "button-height", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_HEIGHT), NULL); g_free(str); } gtk_container_add(GTK_CONTAINER(bulk_member), (GtkWidget *) dial); bulk_member->widget_label = NULL; bulk_member->plugin_name = NULL; bulk_member->filename = NULL; bulk_member->effect = NULL; bulk_member->specifier = NULL; bulk_member->port_index = 0; bulk_member->control_port = NULL; bulk_member->scale_precision = AGS_DIAL_DEFAULT_PRECISION; bulk_member->step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; bulk_member->conversion = NULL; bulk_member->bulk_port = NULL; bulk_member->recall_bulk_port = NULL; bulk_member->task_type = G_TYPE_NONE; } void ags_bulk_member_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsBulkMember *bulk_member; bulk_member = AGS_BULK_MEMBER(gobject); switch(prop_id){ case PROP_WIDGET_TYPE: { GtkWidget *child, *new_child; AgsConfig *config; GType widget_type; gchar *str; widget_type = g_value_get_ulong(value); if(widget_type == bulk_member->widget_type){ return; } child = gtk_bin_get_child(GTK_BIN(bulk_member)); if(child != NULL){ gtk_widget_destroy(child); } bulk_member->widget_type = widget_type; new_child = (GtkWidget *) g_object_new(widget_type, NULL); config = ags_config_get_instance(); str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gdouble gui_scale_factor; gui_scale_factor = g_ascii_strtod(str, NULL); if(AGS_IS_DIAL(new_child)){ g_object_set(new_child, "radius", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_RADIUS), "font-size", (guint) (gui_scale_factor * AGS_DIAL_DEFAULT_FONT_SIZE), "button-width", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_WIDTH), "button-height", (gint) (gui_scale_factor * AGS_DIAL_DEFAULT_BUTTON_HEIGHT), NULL); }else if(GTK_IS_VSCALE(new_child)){ gtk_widget_set_size_request(new_child, gui_scale_factor * 16, gui_scale_factor * 100); }else if(GTK_IS_HSCALE(new_child)){ gtk_widget_set_size_request(new_child, gui_scale_factor * 100, gui_scale_factor * 16); }else if(AGS_IS_VINDICATOR(new_child)){ g_object_set(new_child, "segment-width", (guint) (gui_scale_factor * AGS_VINDICATOR_DEFAULT_SEGMENT_WIDTH), "segment-height", (guint) (gui_scale_factor * AGS_VINDICATOR_DEFAULT_SEGMENT_HEIGHT), "segment-padding", (guint) (gui_scale_factor * AGS_INDICATOR_DEFAULT_SEGMENT_PADDING), NULL); }else if(AGS_IS_HINDICATOR(new_child)){ g_object_set(new_child, "segment-width", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH), "segment-height", (guint) (gui_scale_factor * AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT), "segment-padding", (guint) (gui_scale_factor * AGS_INDICATOR_DEFAULT_SEGMENT_PADDING), NULL); } gtk_widget_queue_resize_no_redraw(new_child); gtk_widget_queue_draw(new_child); g_free(str); } gtk_container_add(GTK_CONTAINER(bulk_member), new_child); } break; case PROP_WIDGET_LABEL: { gchar *label; label = g_value_get_string(value); if(label == bulk_member->widget_label){ return; } if(bulk_member->widget_label != NULL){ g_free(bulk_member->widget_label); } bulk_member->widget_label = g_strdup(label); ags_bulk_member_set_label(bulk_member, label); } break; case PROP_PLUGIN_NAME: { gchar *plugin_name; plugin_name = g_value_get_string(value); if(plugin_name == bulk_member->plugin_name){ return; } if(bulk_member->plugin_name != NULL){ g_free(bulk_member->plugin_name); } bulk_member->plugin_name = g_strdup(plugin_name); } break; case PROP_FILENAME: { gchar *str; gchar *filename; filename = g_value_get_string(value); if(filename == bulk_member->filename){ return; } if(bulk_member->filename != NULL){ g_free(bulk_member->filename); } if(filename != NULL){ if(!g_file_test(filename, G_FILE_TEST_EXISTS)){ AgsWindow *window; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) bulk_member); str = g_strdup_printf("%s %s", i18n("Plugin file not present"), filename); ags_window_show_error(window, str); g_free(str); } } bulk_member->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(effect == bulk_member->effect){ return; } if(bulk_member->effect != NULL){ g_free(bulk_member->effect); } bulk_member->effect = g_strdup(effect); } break; case PROP_SPECIFIER: { gchar *specifier; specifier = g_value_get_string(value); if(specifier == bulk_member->specifier){ return; } if(bulk_member->specifier != NULL){ g_free(bulk_member->specifier); } bulk_member->specifier = g_strdup(specifier); } break; case PROP_PORT_INDEX: { guint port_index; port_index = g_value_get_uint(value); bulk_member->port_index = port_index; } break; case PROP_CONTROL_PORT: { gchar *control_port; control_port = g_value_get_string(value); if(control_port == bulk_member->control_port){ return; } if(bulk_member->control_port != NULL){ g_free(bulk_member->control_port); } bulk_member->control_port = g_strdup(control_port); } break; case PROP_SCALE_PRECISION: { GtkWidget *child; guint scale_precision; scale_precision = g_value_get_uint(value); bulk_member->scale_precision = scale_precision; child = gtk_bin_get_child(GTK_BIN(bulk_member)); if(AGS_IS_DIAL(child)){ g_object_set(child, "scale-precision", scale_precision, NULL); } } break; case PROP_STEP_COUNT: { GtkWidget *child; gdouble step_count; step_count = g_value_get_double(value); bulk_member->step_count = step_count; } break; case PROP_CONVERSION: { AgsConversion *conversion; conversion = g_value_get_object(value); if(conversion == bulk_member->conversion){ return; } if(bulk_member->conversion != NULL){ g_object_unref(bulk_member->conversion); } if(conversion != NULL){ g_object_ref(conversion); } bulk_member->conversion = conversion; } break; case PROP_BULK_PORT: { AgsPort *port; AgsBulkPort *bulk_port; port = (AgsPort *) g_value_get_object(value); if(port == NULL){ return; } if(ags_bulk_port_find(bulk_member->bulk_port, port) != NULL){ return; } if((AGS_PORT_INFINITE_RANGE & (port->flags)) != 0){ GtkWidget *child; child = gtk_bin_get_child(GTK_BIN(bulk_member)); //TODO:JK: add more types if(AGS_IS_DIAL(child)){ AGS_DIAL(child)->flags |= AGS_DIAL_SEEMLESS_MODE; } } bulk_port = ags_bulk_port_alloc(port, 0, 0); bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, bulk_port); } break; case PROP_RECALL_BULK_PORT: { AgsPort *port; AgsBulkPort *bulk_port; port = (AgsPort *) g_value_get_object(value); if(port == NULL){ return; } if(ags_bulk_port_find(bulk_member->recall_bulk_port, port) != NULL){ return; } bulk_port = ags_bulk_port_alloc(port, 0, 0); bulk_member->recall_bulk_port = g_list_prepend(bulk_member->recall_bulk_port, bulk_port); } break; case PROP_TASK_TYPE: { GType type; type = g_value_get_ulong(value); if(bulk_member->task_type == type){ return; } bulk_member->task_type = type; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_bulk_member_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsBulkMember *bulk_member; bulk_member = AGS_BULK_MEMBER(gobject); switch(prop_id){ case PROP_WIDGET_TYPE: { g_value_set_ulong(value, bulk_member->widget_type); } break; case PROP_WIDGET_LABEL: { g_value_set_string(value, bulk_member->widget_label); } break; case PROP_PLUGIN_NAME: { g_value_set_string(value, bulk_member->plugin_name); } break; case PROP_FILENAME: { g_value_set_string(value, bulk_member->filename); } break; case PROP_EFFECT: { g_value_set_string(value, bulk_member->effect); } break; case PROP_SPECIFIER: { g_value_set_string(value, bulk_member->specifier); } break; case PROP_PORT_INDEX: { g_value_set_uint(value, bulk_member->port_index); } break; case PROP_CONTROL_PORT: { g_value_set_string(value, bulk_member->control_port); } break; case PROP_SCALE_PRECISION: { g_value_set_uint(value, bulk_member->scale_precision); } break; case PROP_STEP_COUNT: { g_value_set_double(value, bulk_member->step_count); } break; case PROP_CONVERSION: { g_value_set_object(value, bulk_member->conversion); } break; case PROP_TASK_TYPE: { g_value_set_ulong(value, bulk_member->task_type); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_bulk_member_finalize(GObject *gobject) { AgsBulkMember *bulk_member; bulk_member = (AgsBulkMember *) gobject; g_free(bulk_member->widget_label); g_free(bulk_member->filename); g_free(bulk_member->effect); g_free(bulk_member->plugin_name); g_free(bulk_member->control_port); if(bulk_member->conversion != NULL){ g_object_unref(bulk_member->conversion); } /* bulk port */ g_list_free_full(bulk_member->bulk_port, (GDestroyNotify) ags_bulk_port_free); g_list_free_full(bulk_member->recall_bulk_port, (GDestroyNotify) ags_bulk_port_free); /* call parent */ G_OBJECT_CLASS(ags_bulk_member_parent_class)->finalize(gobject); } void ags_bulk_member_connect(AgsConnectable *connectable) { AgsBulkMember *bulk_member; GtkWidget *control; bulk_member = AGS_BULK_MEMBER(connectable); if((AGS_BULK_MEMBER_CONNECTED & (bulk_member->flags)) != 0){ return; } bulk_member->flags |= AGS_BULK_MEMBER_CONNECTED; ags_bulk_member_find_port(bulk_member); control = gtk_bin_get_child(GTK_BIN(bulk_member)); if((AGS_BULK_MEMBER_APPLY_INITIAL & (bulk_member->flags)) != 0){ GtkAdjustment *adjustment; gboolean active; gboolean is_toggled; adjustment = NULL; is_toggled = FALSE; if(AGS_IS_DIAL(control)){ adjustment = AGS_DIAL(control)->adjustment; }else if(GTK_IS_RANGE(control)){ adjustment = gtk_range_get_adjustment(GTK_RANGE(control)); }else if(GTK_IS_SPIN_BUTTON(control)){ adjustment = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(control)); }else if(GTK_IS_TOGGLE_BUTTON(control)){ active = gtk_toggle_button_get_active((GtkToggleButton *) control); is_toggled = TRUE; } if(is_toggled){ ags_bulk_member_change_port(bulk_member, &(active)); }else if(adjustment != NULL){ gdouble value; value = gtk_adjustment_get_value(adjustment); ags_bulk_member_change_port(bulk_member, &value); } bulk_member->flags &= (~AGS_BULK_MEMBER_APPLY_INITIAL); } /* widget callback */ if(bulk_member->widget_type == AGS_TYPE_DIAL){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_bulk_member_dial_changed_callback), bulk_member); }else if(bulk_member->widget_type == GTK_TYPE_VSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_bulk_member_vscale_changed_callback), bulk_member); }else if(bulk_member->widget_type == GTK_TYPE_HSCALE){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_bulk_member_hscale_changed_callback), bulk_member); }else if(bulk_member->widget_type == GTK_TYPE_SPIN_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "value-changed", G_CALLBACK(ags_bulk_member_spin_button_changed_callback), bulk_member); }else if(bulk_member->widget_type == GTK_TYPE_CHECK_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_bulk_member_check_button_clicked_callback), bulk_member); }else if(bulk_member->widget_type == GTK_TYPE_TOGGLE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_bulk_member_toggle_button_clicked_callback), bulk_member); }else if(bulk_member->widget_type == GTK_TYPE_BUTTON){ g_signal_connect_after(GTK_WIDGET(control), "clicked", G_CALLBACK(ags_bulk_member_button_clicked_callback), bulk_member); } } void ags_bulk_member_disconnect(AgsConnectable *connectable) { AgsBulkMember *bulk_member; GtkWidget *control; bulk_member = AGS_BULK_MEMBER(connectable); if((AGS_BULK_MEMBER_CONNECTED & (bulk_member->flags)) == 0){ return; } bulk_member->flags &= (~AGS_BULK_MEMBER_CONNECTED); control = gtk_bin_get_child(GTK_BIN(bulk_member)); /* widget callback */ if(bulk_member->widget_type == AGS_TYPE_DIAL){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_bulk_member_dial_changed_callback), bulk_member, NULL); }else if(bulk_member->widget_type == GTK_TYPE_VSCALE){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_bulk_member_vscale_changed_callback), bulk_member, NULL); }else if(bulk_member->widget_type == GTK_TYPE_HSCALE){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_bulk_member_hscale_changed_callback), bulk_member, NULL); }else if(bulk_member->widget_type == GTK_TYPE_SPIN_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::value-changed", G_CALLBACK(ags_bulk_member_spin_button_changed_callback), bulk_member, NULL); }else if(bulk_member->widget_type == GTK_TYPE_CHECK_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::clicked", G_CALLBACK(ags_bulk_member_check_button_clicked_callback), bulk_member, NULL); }else if(bulk_member->widget_type == GTK_TYPE_TOGGLE_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::clicked", G_CALLBACK(ags_bulk_member_toggle_button_clicked_callback), bulk_member, NULL); }else if(bulk_member->widget_type == GTK_TYPE_BUTTON){ g_object_disconnect(GTK_WIDGET(control), "any_signal::clicked", G_CALLBACK(ags_bulk_member_button_clicked_callback), bulk_member, NULL); } } GtkWidget* ags_bulk_member_get_widget(AgsBulkMember *bulk_member) { return(gtk_bin_get_child(GTK_BIN(bulk_member))); } /** * ags_bulk_port_alloc: * @port: the #AgsPort to set * @pad: the pad * @audio_channel: the audio channel * * Allocate #AgsBulkPort-struct. * * Returns: the newly allocated #AgsBulkPort-struct * * Since: 3.0.0 */ AgsBulkPort* ags_bulk_port_alloc(AgsPort *port, guint pad, guint audio_channel) { AgsBulkPort *bulk_port; bulk_port = (AgsBulkPort *) malloc(sizeof(AgsBulkPort)); bulk_port->port = port; g_object_ref(port); bulk_port->pad = pad; bulk_port->audio_channel = audio_channel; bulk_port->port_data = &(port->port_value); bulk_port->active = FALSE; return(bulk_port); } /** * ags_bulk_port_free: * @bulk_port: the #AgsBulkPort-struct * * Free @bulk_port. * * Since: 3.0.0 */ void ags_bulk_port_free(AgsBulkPort *bulk_port) { g_object_unref(bulk_port->port); g_free(bulk_port); } /** * ags_bulk_port_find: * @list: the #GList-struct to search * @port: the #AgsPort to find * * Find port within @list. * * Returns: the #GList-struct containing port if found otherwise %NULL * * Since: 3.0.0 */ GList* ags_bulk_port_find(GList *list, AgsPort *port) { while(list != NULL){ if(AGS_BULK_PORT(list->data)->port == port){ break; } list = list->next; } return(list); } /** * ags_bulk_member_set_label: * @bulk_member: an #AgsBulkMember * @label: the label of the control * * Modify the label of the bulk member. */ void ags_bulk_member_set_label(AgsBulkMember *bulk_member, gchar *label) { GtkWidget *child_widget; if(g_type_is_a(bulk_member->widget_type, GTK_TYPE_BUTTON)){ child_widget = gtk_bin_get_child(GTK_BIN(bulk_member)); g_object_set(G_OBJECT(child_widget), "label", label, NULL); }else{ gtk_frame_set_label_widget((GtkFrame *) bulk_member, (GtkWidget *) g_object_new(GTK_TYPE_LABEL, "wrap", FALSE, "use-markup", TRUE, "label", g_markup_printf_escaped("%s", label), NULL)); } bulk_member->widget_label = g_strdup(label); } void ags_bulk_member_change_port_all(AgsBulkMember *bulk_member, GList *list, gpointer port_data) { AgsPort *port; GRecMutex *port_mutex; while(list != NULL){ GValue value = {0,}; port = AGS_BULK_PORT(list->data)->port; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* change */ g_rec_mutex_lock(port_mutex); if(!port->port_value_is_pointer){ if(port->port_value_type == G_TYPE_BOOLEAN){ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, ((gboolean *) port_data)[0]); }else if(port->port_value_type == G_TYPE_INT64){ g_value_init(&value, G_TYPE_INT64); g_value_set_int64(&value, ((gint *) port_data)[0]); }else if(port->port_value_type == G_TYPE_UINT64){ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, ((guint *) port_data)[0]); }else if(port->port_value_type == G_TYPE_FLOAT){ gdouble val; gfloat port_val; if(GTK_IS_TOGGLE_BUTTON(gtk_bin_get_child((GtkBin *) bulk_member))){ if(((gboolean *) port_data)[0]){ val = 1.0; }else{ val = 0.0; } }else{ val = ((gdouble *) port_data)[0]; } port_val = (gfloat) val; if(bulk_member->conversion != NULL){ gboolean success; success = FALSE; if(AGS_IS_DIAL(gtk_bin_get_child(GTK_BIN(bulk_member)))){ AgsDial *dial; dial = (AgsDial *) gtk_bin_get_child(GTK_BIN(bulk_member)); success = TRUE; }else{ g_warning("unsupported child type in conversion"); } if(success){ port_val = (gfloat) ags_conversion_convert(bulk_member->conversion, val, FALSE); } } g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, port_val); }else if(port->port_value_type == G_TYPE_DOUBLE){ gdouble val; gdouble port_val; if(GTK_IS_TOGGLE_BUTTON(gtk_bin_get_child((GtkBin *) bulk_member))){ if(((gboolean *) port_data)[0]){ val = 1.0; }else{ val = 0.0; } }else{ val = ((gdouble *) port_data)[0]; } port_val = val; if(bulk_member->conversion != NULL){ gboolean success; success = FALSE; if(AGS_IS_DIAL(gtk_bin_get_child(GTK_BIN(bulk_member)))){ AgsDial *dial; dial = (AgsDial *) gtk_bin_get_child(GTK_BIN(bulk_member)); success = TRUE; }else{ g_warning("unsupported child type in conversion"); } if(success){ port_val = ags_conversion_convert(bulk_member->conversion, val, TRUE); } } g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, port_val); } }else{ if(port->port_value_type == G_TYPE_OBJECT){ g_value_init(&value, G_TYPE_OBJECT); g_value_set_object(&value, port_data); }else{ if(port->port_value_type == G_TYPE_BOOLEAN || port->port_value_type == G_TYPE_INT64 || port->port_value_type == G_TYPE_UINT64 || port->port_value_type == G_TYPE_FLOAT || port->port_value_type == G_TYPE_DOUBLE || port->port_value_type == G_TYPE_POINTER){ g_value_init(&value, G_TYPE_POINTER); g_value_set_pointer(&value, port_data); } } } g_rec_mutex_unlock(port_mutex); // g_message("change %f", g_value_get_float(&value)); ags_port_safe_write(port, &value); list = list->next; } } void ags_bulk_member_real_change_port(AgsBulkMember *bulk_member, gpointer port_data) { AgsWindow *window; AgsApplicationContext *application_context; window = (AgsWindow *) gtk_widget_get_ancestor((GtkWidget *) bulk_member, AGS_TYPE_WINDOW); application_context = ags_application_context_get_instance(); if((AGS_BULK_MEMBER_RESET_BY_ATOMIC & (bulk_member->flags)) != 0){ ags_bulk_member_change_port_all(bulk_member, bulk_member->bulk_port, port_data); if((AGS_BULK_MEMBER_APPLY_RECALL & (bulk_member->flags)) != 0){ ags_bulk_member_change_port_all(bulk_member, bulk_member->recall_bulk_port, port_data); } } if((AGS_BULK_MEMBER_RESET_BY_TASK & (bulk_member->flags)) != 0){ AgsEffectBulk *effect_bulk; AgsTask *task; effect_bulk = (AgsEffectBulk *) gtk_widget_get_ancestor(GTK_WIDGET(bulk_member), AGS_TYPE_EFFECT_BULK); task = (AgsTask *) g_object_new(bulk_member->task_type, bulk_member->control_port, port_data, NULL); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), task); } } /** * ags_bulk_change_port: * @bulk_member: an #AgsBulkMember * @port_data: the port's value * * Is emitted as port's value is modified. * * Since: 3.0.0 */ void ags_bulk_member_change_port(AgsBulkMember *bulk_member, gpointer port_data) { g_return_if_fail(AGS_IS_BULK_MEMBER(bulk_member)); g_object_ref((GObject *) bulk_member); g_signal_emit(G_OBJECT(bulk_member), bulk_member_signals[CHANGE_PORT], 0, port_data); g_object_unref((GObject *) bulk_member); } AgsPort* ags_bulk_member_find_specifier(GList *recall, gchar *specifier){ AgsPort *current_port; GList *start_port, *port; current_port = NULL; while(recall != NULL){ if(!ags_recall_test_behaviour_flags(recall->data, AGS_SOUND_BEHAVIOUR_BULK_MODE)){ recall = recall->next; continue; } g_object_get(recall->data, "port", &start_port, NULL); port = ags_port_find_specifier(start_port, specifier); #ifdef AGS_DEBUG g_message("search port in %s", G_OBJECT_TYPE_NAME(recall->data)); #endif if(port != NULL){ current_port = port->data; } g_list_free_full(start_port, g_object_unref); if(current_port != NULL){ break; } /* iterate */ recall = recall->next; } return(current_port); } GList* ags_bulk_member_real_find_port(AgsBulkMember *bulk_member) { GtkWidget *effect_bulk; AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next_channel; AgsPort *audio_port, *channel_port; AgsPort *recall_audio_port, *recall_channel_port; gchar *specifier; if(!AGS_IS_BULK_MEMBER(bulk_member)){ return(NULL); } specifier = bulk_member->specifier; if(specifier == NULL){ return(NULL); } effect_bulk = gtk_widget_get_ancestor(GTK_WIDGET(bulk_member), AGS_TYPE_EFFECT_BULK); audio = AGS_EFFECT_BULK(effect_bulk)->audio; audio_port = NULL; channel_port = NULL; recall_audio_port = NULL; recall_channel_port = NULL; /* search channels */ channel = start_channel = NULL; if(AGS_EFFECT_BULK(effect_bulk)->channel_type == AGS_TYPE_OUTPUT){ g_object_get(audio, "output", &start_channel, NULL); }else if(AGS_EFFECT_BULK(effect_bulk)->channel_type == AGS_TYPE_INPUT){ g_object_get(audio, "input", &start_channel, NULL); } next_channel = NULL; while(channel != NULL){ GList *list_start; guint pad, audio_channel; /* play context */ g_object_get(channel, "pad", &pad, "audio-channel", &audio_channel, "play", &list_start, NULL); channel_port = ags_bulk_member_find_specifier(list_start, specifier); if(channel_port != NULL && ags_bulk_port_find(bulk_member->bulk_port, channel_port) == NULL){ bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, ags_bulk_port_alloc(channel_port, pad, audio_channel)); } g_list_free_full(list_start, g_object_unref); /* recall context */ g_object_get(channel, "recall", &list_start, NULL); recall_channel_port = ags_bulk_member_find_specifier(list_start, specifier); if(recall_channel_port != NULL && ags_bulk_port_find(bulk_member->recall_bulk_port, recall_channel_port) == NULL){ bulk_member->recall_bulk_port = g_list_prepend(bulk_member->recall_bulk_port, ags_bulk_port_alloc(recall_channel_port, pad, audio_channel)); } g_list_free_full(list_start, g_object_unref); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } /* search audio */ if(channel_port == NULL && recall_channel_port == NULL){ GList *list_start; /* play context */ g_object_get(audio, "play", &list_start, NULL); audio_port = ags_bulk_member_find_specifier(list_start, specifier); if(audio_port != NULL && ags_bulk_port_find(bulk_member->bulk_port, audio_port) == NULL){ bulk_member->bulk_port = g_list_prepend(bulk_member->bulk_port, ags_bulk_port_alloc(audio_port, 0, 0)); } g_list_free_full(list_start, g_object_unref); /* recall context */ g_object_get(audio, "recall", &list_start, NULL); recall_audio_port = ags_bulk_member_find_specifier(list_start, specifier); if(recall_audio_port != NULL && ags_bulk_port_find(bulk_member->recall_bulk_port, recall_audio_port) == NULL){ bulk_member->recall_bulk_port = g_list_prepend(bulk_member->recall_bulk_port, ags_bulk_port_alloc(recall_audio_port, 0, 0)); } g_list_free_full(list_start, g_object_unref); } return(g_list_copy(bulk_member->bulk_port)); } /** * ags_bulk_member_find_port: * @bulk_member: an #AgsBulkMember * * Lookup ports of assigned recalls. * * Returns: a #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ GList* ags_bulk_member_find_port(AgsBulkMember *bulk_member) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_BULK_MEMBER(bulk_member), NULL); g_object_ref((GObject *) bulk_member); g_signal_emit((GObject *) bulk_member, bulk_member_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) bulk_member); return(list); } /** * ags_bulk_member_find_effect_and_specifier: * @bulk_member: the #GList-struct containing #AgsBulkMember * @filename: the filename * @effect: the effect * @specifier: the specifier * * Find next matching bulk member by effect and specifier. * * Returns: the next matching #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_bulk_member_find_effect_and_specifier(GList *bulk_member, gchar *filename, gchar *effect, gchar *specifier) { if(filename == NULL || effect == NULL || specifier == NULL){ return(NULL); } while(bulk_member != NULL){ if(!AGS_IS_BULK_MEMBER(bulk_member->data)){ bulk_member = bulk_member->next; continue; } if(!g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->filename, filename) && !g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->effect, effect) && !g_strcmp0(AGS_BULK_MEMBER(bulk_member->data)->specifier, specifier)){ break; } /* iterate */ bulk_member = bulk_member->next; } return(bulk_member); } /** * ags_bulk_member_new: * * Creates an #AgsBulkMember * * Returns: a new #AgsBulkMember * * Since: 3.0.0 */ AgsBulkMember* ags_bulk_member_new() { AgsBulkMember *bulk_member; bulk_member = (AgsBulkMember *) g_object_new(AGS_TYPE_BULK_MEMBER, NULL); return(bulk_member); } gsequencer-3.1.3/ags/X/ags_effect_pad.h0000644000175000017500000000743613607210263014656 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_PAD_H__ #define __AGS_EFFECT_PAD_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EFFECT_PAD (ags_effect_pad_get_type()) #define AGS_EFFECT_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EFFECT_PAD, AgsEffectPad)) #define AGS_EFFECT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EFFECT_PAD, AgsEffectPadClass)) #define AGS_IS_EFFECT_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EFFECT_PAD)) #define AGS_IS_EFFECT_PAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EFFECT_PAD)) #define AGS_EFFECT_PAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EFFECT_PAD, AgsEffectPadClass)) #define AGS_EFFECT_PAD_DEFAULT_VERSION "0.7.8" #define AGS_EFFECT_PAD_DEFAULT_BUILD_ID "CEST 01-03-2016 00:23" #define AGS_EFFECT_PAD_COLUMNS_COUNT (2) typedef struct _AgsEffectPad AgsEffectPad; typedef struct _AgsEffectPadClass AgsEffectPadClass; typedef enum{ AGS_EFFECT_PAD_MAPPED_RECALL = 1, AGS_EFFECT_PAD_PREMAPPED_RECALL = 1 << 1, AGS_EFFECT_PAD_CONNECTED = 1 << 2, AGS_EFFECT_PAD_SHOW_GROUPING = 1 << 3, AGS_EFFECT_PAD_GROUP_ALL = 1 << 4, AGS_EFFECT_PAD_GROUP_LINE = 1 << 5, }AgsEffectPadFlags; struct _AgsEffectPad { GtkVBox vbox; guint flags; gchar *name; gchar *version; gchar *build_id; guint samplerate; guint buffer_size; guint format; AgsChannel *channel; guint cols; GtkTable *table; }; struct _AgsEffectPadClass { GtkVBoxClass vbox; void (*samplerate_changed)(AgsEffectPad *effect_pad, guint samplerate, guint old_samplerate); void (*buffer_size_changed)(AgsEffectPad *effect_pad, guint buffer_size, guint old_buffer_size); void (*format_changed)(AgsEffectPad *effect_pad, guint format, guint old_format); void (*set_channel)(AgsEffectPad *effect_pad, AgsChannel *channel); void (*resize_lines)(AgsEffectPad *effect_pad, GType line_type, guint audio_channels, guint audio_channels_old); void (*map_recall)(AgsEffectPad *effect_pad); GList* (*find_port)(AgsEffectPad *effect_pad); }; GType ags_effect_pad_get_type(void); void ags_effect_pad_samplerate_changed(AgsEffectPad *effect_pad, guint samplerate, guint old_samplerate); void ags_effect_pad_buffer_size_changed(AgsEffectPad *effect_pad, guint buffer_size, guint old_buffer_size); void ags_effect_pad_format_changed(AgsEffectPad *effect_pad, guint format, guint old_format); void ags_effect_pad_set_channel(AgsEffectPad *effect_pad, AgsChannel *channel); void ags_effect_pad_resize_lines(AgsEffectPad *effect_pad, GType line_type, guint audio_channels, guint audio_channels_old); void ags_effect_pad_map_recall(AgsEffectPad *effect_pad); GList* ags_effect_pad_find_port(AgsEffectPad *effect_pad); AgsEffectPad* ags_effect_pad_new(AgsChannel *channel); G_END_DECLS #endif /*__AGS_EFFECT_PAD_H__*/ gsequencer-3.1.3/ags/X/ags_preferences_callbacks.h0000644000175000017500000000271613607210263017072 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PREFERENCES_CALLBACKS_H__ #define __AGS_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS gboolean ags_preferences_delete_event_callback(GtkWidget *widget, GdkEventAny *event, gpointer user_data); void ags_preferences_response_callback(GtkDialog *dialog, gint response_id, gpointer user_data); void ags_preferences_notebook_switch_page_callback(GtkNotebook *notebook, gpointer page, guint page_n, AgsPreferences *preferences); G_END_DECLS #endif /*__AGS_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/osc/0000755000175000017500000000000013622252250012424 500000000000000gsequencer-3.1.3/ags/X/osc/controller/0000755000175000017500000000000013622252261014611 500000000000000gsequencer-3.1.3/ags/X/osc/controller/ags_ui_osc_renew_controller.c0000644000175000017500000011217013607210263022454 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_ui_osc_renew_controller_class_init(AgsUiOscRenewControllerClass *ui_osc_renew_controller); void ags_ui_osc_renew_controller_osc_plugin_controller_interface_init(AgsOscPluginControllerInterface *osc_plugin_controller); void ags_ui_osc_renew_controller_init(AgsUiOscRenewController *ui_osc_renew_controller); void ags_ui_osc_renew_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ui_osc_renew_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ui_osc_renew_controller_dispose(GObject *gobject); void ags_ui_osc_renew_controller_finalize(GObject *gobject); gpointer ags_ui_osc_renew_controller_do_request(AgsOscPluginController *osc_plugin_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); gpointer ags_ui_osc_renew_controller_set_data_machine(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsMachine *machine, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_effect_bridge(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsEffectBridge *effect_bridge, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_pad(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsPad *pad, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_line(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsLine *line, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_effect_pad(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsEffectPad *effect_pad, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_effect_line(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsEffectLine *effect_line, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_bulk_member(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsBulkMember *bulk_member, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_set_data_line_member(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsLineMember *line_member, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_ui_osc_renew_controller_real_set_data(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); /** * SECTION:ags_ui_osc_renew_controller * @short_description: UI OSC renew controller * @title: AgsUiOscRenewController * @section_id: * @include: ags/X/osc/controller/ags_ui_osc_renew_controller.h * * The #AgsUiOscRenewController implements the UI OSC renew controller. */ enum{ PROP_0, }; enum{ SET_DATA, LAST_SIGNAL, }; static gpointer ags_ui_osc_renew_controller_parent_class = NULL; static guint ui_osc_renew_controller_signals[LAST_SIGNAL]; static GMutex regex_mutex; GType ags_ui_osc_renew_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ui_osc_renew_controller = 0; static const GTypeInfo ags_ui_osc_renew_controller_info = { sizeof (AgsUiOscRenewControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ui_osc_renew_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsUiOscRenewController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ui_osc_renew_controller_init, }; static const GInterfaceInfo ags_osc_plugin_controller_interface_info = { (GInterfaceInitFunc) ags_ui_osc_renew_controller_osc_plugin_controller_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ui_osc_renew_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsUiOscRenewController", &ags_ui_osc_renew_controller_info, 0); g_type_add_interface_static(ags_type_ui_osc_renew_controller, AGS_TYPE_OSC_PLUGIN_CONTROLLER, &ags_osc_plugin_controller_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ui_osc_renew_controller); } return g_define_type_id__volatile; } void ags_ui_osc_renew_controller_class_init(AgsUiOscRenewControllerClass *ui_osc_renew_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_ui_osc_renew_controller_parent_class = g_type_class_peek_parent(ui_osc_renew_controller); /* GObjectClass */ gobject = (GObjectClass *) ui_osc_renew_controller; gobject->set_property = ags_ui_osc_renew_controller_set_property; gobject->get_property = ags_ui_osc_renew_controller_get_property; gobject->dispose = ags_ui_osc_renew_controller_dispose; gobject->finalize = ags_ui_osc_renew_controller_finalize; /* properties */ /* AgsUiOscRenewControllerClass */ ui_osc_renew_controller->set_data = ags_ui_osc_renew_controller_real_set_data; /* signals */ /** * AgsUiOscRenewController::set-data: * @ui_osc_renew_controller: the #AgsUiOscRenewController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::set-data signal is emited during get data of renew controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ ui_osc_renew_controller_signals[SET_DATA] = g_signal_new("set-data", G_TYPE_FROM_CLASS(ui_osc_renew_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsUiOscRenewControllerClass, set_data), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_ui_osc_renew_controller_osc_plugin_controller_interface_init(AgsOscPluginControllerInterface *osc_plugin_controller) { osc_plugin_controller->do_request = ags_ui_osc_renew_controller_do_request; } void ags_ui_osc_renew_controller_init(AgsUiOscRenewController *ui_osc_renew_controller) { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); g_signal_connect(application_context, "check-message", G_CALLBACK(ags_ui_osc_renew_controller_check_message_callback), ui_osc_renew_controller); g_object_set(ui_osc_renew_controller, "context-path", "/ui-renew", NULL); } void ags_ui_osc_renew_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsUiOscRenewController *ui_osc_renew_controller; GRecMutex *osc_controller_mutex; ui_osc_renew_controller = AGS_UI_OSC_RENEW_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(ui_osc_renew_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ui_osc_renew_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsUiOscRenewController *ui_osc_renew_controller; GRecMutex *osc_controller_mutex; ui_osc_renew_controller = AGS_UI_OSC_RENEW_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(ui_osc_renew_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ui_osc_renew_controller_dispose(GObject *gobject) { AgsUiOscRenewController *ui_osc_renew_controller; ui_osc_renew_controller = AGS_UI_OSC_RENEW_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_ui_osc_renew_controller_parent_class)->dispose(gobject); } void ags_ui_osc_renew_controller_finalize(GObject *gobject) { AgsUiOscRenewController *ui_osc_renew_controller; AgsApplicationContext *application_context; ui_osc_renew_controller = AGS_UI_OSC_RENEW_CONTROLLER(gobject); application_context = ags_application_context_get_instance(); g_object_disconnect(application_context, "any_signal::check-message", G_CALLBACK(ags_ui_osc_renew_controller_check_message_callback), ui_osc_renew_controller, NULL); /* call parent */ G_OBJECT_CLASS(ags_ui_osc_renew_controller_parent_class)->finalize(gobject); } gpointer ags_ui_osc_renew_controller_do_request(AgsOscPluginController *osc_plugin_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer response; response = ags_ui_osc_renew_controller_set_data(AGS_UI_OSC_RENEW_CONTROLLER(osc_plugin_controller), osc_connection, message, message_size); return(response); } gpointer ags_ui_osc_renew_controller_set_data_machine(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsMachine *machine, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsMessageDelivery *message_delivery; AgsMessageQueue *message_queue; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_MACHINE(machine)){ return(NULL); } start_response = NULL; message_delivery = ags_message_delivery_get_instance(); message_queue = (AgsMessageQueue *) ags_message_delivery_find_sender_namespace(message_delivery, "libgsequencer"); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, "/GtkButton", 10)){ path_offset += 10; if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ gchar *button_specifier; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } length = offset - (path + path_offset + 2); button_specifier = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(button_specifier, path + path_offset + 2, (length) * sizeof(gchar)); button_specifier[length] = '\0'; if(!strncmp(button_specifier, "play", 5)){ path_offset += length; if(!strncmp(path + path_offset, "::", 2)){ path_offset += 2; if(!strncmp(path + path_offset, "clicked", 7)){ /* emit message */ if(message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsMachine:run::clicked"); /* add message */ message = ags_message_envelope_new((GObject *) machine, NULL, doc); /* set parameter */ message->n_params = 0; message->parameter_name = NULL; message->value = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libgsequencer", message); } } } } free(button_specifier); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); return(start_response); } }else{ if(AGS_IS_PANEL(machine)){ //TODO:JK: implement me }else if(AGS_IS_SPECTROMETER(machine)){ //TODO:JK: implement me }else if(AGS_IS_EQUALIZER10(machine)){ //TODO:JK: implement me }else if(AGS_IS_MIXER(machine)){ //TODO:JK: implement me }else if(AGS_IS_DRUM(machine)){ //TODO:JK: implement me }else if(AGS_IS_MATRIX(machine)){ //TODO:JK: implement me }else if(AGS_IS_SYNTH(machine)){ //TODO:JK: implement me }else if(AGS_IS_FM_SYNTH(machine)){ //TODO:JK: implement me }else if(AGS_IS_SYNCSYNTH(machine)){ //TODO:JK: implement me }else if(AGS_IS_FM_SYNCSYNTH(machine)){ //TODO:JK: implement me }else if(AGS_IS_FFPLAYER(machine)){ //TODO:JK: implement me }else if(AGS_IS_PITCH_SAMPLER(machine)){ //TODO:JK: implement me }else if(AGS_IS_AUDIOREC(machine)){ //TODO:JK: implement me }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); return(start_response); } } return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_effect_bridge(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsEffectBridge *effect_bridge, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_EFFECT_BRIDGE(effect_bridge)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_pad(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsPad *pad, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_PAD(pad)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_line(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsLine *line, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_LINE(line)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_effect_pad(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsEffectPad *effect_pad, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_EFFECT_PAD(effect_pad)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_effect_line(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsEffectLine *effect_line, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_EFFECT_LINE(effect_line)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_bulk_member(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsBulkMember *bulk_member, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_BULK_MEMBER(bulk_member)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_set_data_line_member(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, AgsLineMember *line_member, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_LINE_MEMBER(line_member)){ return(NULL); } start_response = NULL; real_packet_size = 0; packet_size = 0; //TODO:JK: implement me return(start_response); } gpointer ags_ui_osc_renew_controller_real_set_data(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; gchar *type_tag; gchar *path; guint path_offset; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",s", 2)) ? TRUE: FALSE; if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read argument */ ags_osc_buffer_util_get_string(message + 8 + (4 * (guint) ceil((gdouble) (strlen(type_tag) + 1) / 4.0)), &path, NULL); if(path == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } /* create packet */ application_context = ags_application_context_get_instance(); path_offset = 0; if(!strncmp(path, "/AgsUiProvider", 14)){ AgsMessageDelivery *message_delivery; AgsMessageQueue *message_queue; unsigned char *duplicated_message; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); /* emit message */ message_delivery = ags_message_delivery_get_instance(); message_queue = (AgsMessageQueue *) ags_message_delivery_find_sender_namespace(message_delivery, "libgsequencer"); if(message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsUiOscRenewController::set-data"); /* add message */ message = ags_message_envelope_new((GObject *) ui_osc_renew_controller, NULL, doc); /* set parameter */ message->n_params = 3; message->parameter_name = (gchar **) malloc(4 * sizeof(gchar *)); message->value = g_new0(GValue, 3); /* osc-connection */ message->parameter_name[0] = "osc-connection"; g_value_init(&(message->value[0]), G_TYPE_OBJECT); g_value_set_object(&(message->value[0]), osc_connection); /* message */ message->parameter_name[1] = "message"; duplicated_message = (unsigned char *) malloc(message_size * sizeof(unsigned char)); memcpy(duplicated_message, message, message_size * sizeof(unsigned char)); g_value_init(&(message->value[1]), G_TYPE_POINTER); g_value_set_pointer(&(message->value[1]), duplicated_message); /* audio channels */ message->parameter_name[2] = "message-size"; g_value_init(&(message->value[2]), G_TYPE_UINT); g_value_set_uint(&(message->value[2]), message_size); /* terminate string vector */ message->parameter_name[3] = NULL; } } if(start_response == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } free(type_tag); free(path); return(start_response); } /** * ags_ui_osc_renew_controller_set_data: * @ui_osc_renew_controller: the #AgsUiOscRenewController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Renew data. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_ui_osc_renew_controller_set_data(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_UI_OSC_RENEW_CONTROLLER(ui_osc_renew_controller), NULL); g_object_ref((GObject *) ui_osc_renew_controller); g_signal_emit(G_OBJECT(ui_osc_renew_controller), ui_osc_renew_controller_signals[SET_DATA], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) ui_osc_renew_controller); return(osc_response); } void ags_ui_osc_renew_controller_check_message_callback(GObject *application_context, AgsUiOscRenewController *ui_osc_renew_controller) { AgsChannel *channel; AgsMessageDelivery *message_delivery; GList *start_message_envelope, *message_envelope; /* retrieve message */ message_delivery = ags_message_delivery_get_instance(); message_envelope = start_message_envelope = ags_message_delivery_find_sender(message_delivery, "libgsequencer", (GObject *) ui_osc_renew_controller); while(message_envelope != NULL){ xmlNode *root_node; root_node = xmlDocGetRootElement(AGS_MESSAGE_ENVELOPE(message_envelope->data)->doc); if(!xmlStrncmp(root_node->name, "ags-command", 12)){ if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsUiOscRenewController::set-data", 34)){ AgsOscConnection *osc_connection; AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; unsigned char *duplicated_message; gchar *type_tag; gchar *path; guint message_size; guint path_offset; gint position; gboolean success; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "osc-connection"); osc_connection = g_value_get_object(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "message"); duplicated_message = g_value_get_pointer(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "message-size"); message_size = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(duplicated_message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",s", 2)) ? TRUE: FALSE; if(!success){ goto ags_ui_osc_renew_controller_message_monitor_timeout_NEXT; } /* read argument */ ags_osc_buffer_util_get_string(duplicated_message + 8 + (4 * (guint) ceil((gdouble) (strlen(type_tag) + 1) / 4.0)), &path, NULL); if(path == NULL){ goto ags_ui_osc_renew_controller_message_monitor_timeout_NEXT; } /* create packet */ application_context = ags_application_context_get_instance(); path_offset = 0; if(!strncmp(path, "/AgsUiProvider", 14)){ GType machine_type; GList *start_machine, *machine; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset = 14; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); machine_type = G_TYPE_NONE; if(!strncmp(path + path_offset, "/AgsPanel", 9)){ path_offset += 9; machine_type = AGS_TYPE_PANEL; }else if(!strncmp(path + path_offset, "/AgsSpectrometer", 16)){ path_offset += 16; machine_type = AGS_TYPE_SPECTROMETER; }else if(!strncmp(path + path_offset, "/AgsEqualizer10", 15)){ path_offset += 15; machine_type = AGS_TYPE_EQUALIZER10; }else if(!strncmp(path + path_offset, "/AgsMixer", 9)){ path_offset += 9; machine_type = AGS_TYPE_MIXER; }else if(!strncmp(path + path_offset, "/AgsDrum", 8)){ path_offset += 8; machine_type = AGS_TYPE_DRUM; }else if(!strncmp(path + path_offset, "/AgsMatrix", 10)){ path_offset += 10; machine_type = AGS_TYPE_MATRIX; }else if(!strncmp(path + path_offset, "/AgsSynth", 9)){ path_offset += 9; machine_type = AGS_TYPE_SYNTH; }else if(!strncmp(path + path_offset, "/AgsFMSynth", 11)){ path_offset += 11; machine_type = AGS_TYPE_FM_SYNTH; }else if(!strncmp(path + path_offset, "/AgsSyncsynth", 13)){ path_offset += 13; machine_type = AGS_TYPE_SYNCSYNTH; }else if(!strncmp(path + path_offset, "/AgsFMSyncsynth", 15)){ path_offset += 15; machine_type = AGS_TYPE_FM_SYNCSYNTH; }else if(!strncmp(path + path_offset, "/AgsFFPlayer", 11)){ path_offset += 11; machine_type = AGS_TYPE_FFPLAYER; }else if(!strncmp(path + path_offset, "/AgsPitchSampler", 16)){ path_offset += 16; machine_type = AGS_TYPE_PITCH_SAMPLER; }else if(!strncmp(path + path_offset, "/AgsAudiorec", 12)){ path_offset += 12; machine_type = AGS_TYPE_AUDIOREC; } if(machine_type != G_TYPE_NONE){ machine = start_machine = ags_ui_provider_get_machine(AGS_UI_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsMachine *current; gchar *endptr; guint i; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = NULL; for(i = 0; machine != NULL; ){ if(G_OBJECT_TYPE(machine->data) == machine_type){ i++; if(i > i_stop){ current = machine->data; break; } } machine = machine->next; } g_list_free(start_machine); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_ui_osc_renew_controller_set_data_machine(ui_osc_renew_controller, osc_connection, current, duplicated_message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ AgsMachine *current; gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); for(i = 0; machine != NULL; ){ GList *retval; if(G_OBJECT_TYPE(machine->data) == machine_type){ i++; if(i > i_start){ current = machine->data; retval = ags_ui_osc_renew_controller_set_data_machine(ui_osc_renew_controller, osc_connection, current, duplicated_message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(i > i_stop){ current = machine->data; break; } } machine = machine->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; while(machine != NULL){ if(G_OBJECT_TYPE(machine->data) == machine_type){ start_response = ags_ui_osc_renew_controller_set_data_machine(ui_osc_renew_controller, osc_connection, start_machine->data, duplicated_message, message_size, type_tag, path, path_offset); break; } machine = machine->next; } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_machine == NULL){ goto ags_ui_osc_renew_controller_message_monitor_timeout_NEXT; } while(machine != NULL){ if(G_OBJECT_TYPE(machine->data) == machine_type){ GList *retval; retval = ags_ui_osc_renew_controller_set_data_machine(ui_osc_renew_controller, osc_connection, machine->data, duplicated_message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } machine = machine->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_machine == NULL){ goto ags_ui_osc_renew_controller_message_monitor_timeout_NEXT; } while(machine != NULL){ if(G_OBJECT_TYPE(machine->data) == machine_type){ GList *retval; retval = ags_ui_osc_renew_controller_set_data_machine(ui_osc_renew_controller, osc_connection, machine->data, duplicated_message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } machine = machine->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ gchar *machine_name; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ goto ags_ui_osc_renew_controller_message_monitor_timeout_NEXT; } length = offset - (path + path_offset + 2); machine_name = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(machine_name, path + path_offset + 2, (length) * sizeof(gchar)); machine_name[length] = '\0'; while(machine != NULL){ if(G_OBJECT_TYPE(machine->data) == machine_type && !g_ascii_strcasecmp(AGS_MACHINE(machine->data)->machine_name, machine_name)){ GList *retval; retval = ags_ui_osc_renew_controller_set_data_machine(ui_osc_renew_controller, osc_connection, machine->data, duplicated_message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } machine = machine->next; } } } }else{ goto ags_ui_osc_renew_controller_message_monitor_timeout_NEXT; } ags_ui_osc_renew_controller_message_monitor_timeout_NEXT: if(duplicated_message != NULL){ free(duplicated_message); } } } message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, (GDestroyNotify) g_object_unref); } /** * ags_ui_osc_renew_controller_new: * * Instantiate new #AgsUiOscRenewController. * * Returns: the #AgsUiOscRenewController * * Since: 3.0.0 */ AgsUiOscRenewController* ags_ui_osc_renew_controller_new() { AgsUiOscRenewController *ui_osc_renew_controller; ui_osc_renew_controller = (AgsUiOscRenewController *) g_object_new(AGS_TYPE_UI_OSC_RENEW_CONTROLLER, NULL); return(ui_osc_renew_controller); } gsequencer-3.1.3/ags/X/osc/controller/ags_ui_osc_renew_controller.h0000644000175000017500000000550013607210263022457 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_UI_OSC_RENEW_CONTROLLER_H__ #define __AGS_UI_OSC_RENEW_CONTROLLER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_UI_OSC_RENEW_CONTROLLER (ags_ui_osc_renew_controller_get_type()) #define AGS_UI_OSC_RENEW_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_UI_OSC_RENEW_CONTROLLER, AgsUiOscRenewController)) #define AGS_UI_OSC_RENEW_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_UI_OSC_RENEW_CONTROLLER, AgsUiOscRenewControllerClass)) #define AGS_IS_UI_OSC_RENEW_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_UI_OSC_RENEW_CONTROLLER)) #define AGS_IS_UI_OSC_RENEW_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_UI_OSC_RENEW_CONTROLLER)) #define AGS_UI_OSC_RENEW_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_UI_OSC_RENEW_CONTROLLER, AgsUiOscRenewControllerClass)) #define AGS_UI_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH (12) typedef struct _AgsUiOscRenewController AgsUiOscRenewController; typedef struct _AgsUiOscRenewControllerClass AgsUiOscRenewControllerClass; struct _AgsUiOscRenewController { AgsOscController osc_controller; }; struct _AgsUiOscRenewControllerClass { AgsOscControllerClass osc_controller; gpointer (*set_data)(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_ui_osc_renew_controller_get_type(); gpointer ags_ui_osc_renew_controller_set_data(AgsUiOscRenewController *ui_osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); void ags_ui_osc_renew_controller_check_message_callback(GObject *application_context, AgsUiOscRenewController *ui_osc_renew_controller); AgsUiOscRenewController* ags_ui_osc_renew_controller_new(); G_END_DECLS #endif /*__AGS_UI_OSC_RENEW_CONTROLLER_H__*/ gsequencer-3.1.3/ags/X/ags_export_window.c0000644000175000017500000004124613607210263015476 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_export_window_class_init(AgsExportWindowClass *export_window); void ags_export_window_connectable_interface_init(AgsConnectableInterface *connectable); void ags_export_window_init(AgsExportWindow *export_window); void ags_export_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_export_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_export_window_finalize(GObject *gobject); void ags_export_window_connect(AgsConnectable *connectable); void ags_export_window_disconnect(AgsConnectable *connectable); void ags_export_window_show(GtkWidget *widget); gboolean ags_export_window_delete_event(GtkWidget *widget, GdkEventAny *event); /** * SECTION:ags_export_window * @short_description: The export dialog * @title: AgsExportWindow * @section_id: * @include: ags/X/ags_export_window.h * * #AgsExportWindow lets you export to audio files. This widget * can contain mulitple #AgsExportSoundcard widgets. */ enum{ PROP_0, PROP_MAIN_WINDOW, }; static gpointer ags_export_window_parent_class = NULL; GType ags_export_window_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_export_window = 0; static const GTypeInfo ags_export_window_info = { sizeof (AgsExportWindowClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_export_window_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsExportWindow), 0, /* n_preallocs */ (GInstanceInitFunc) ags_export_window_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_export_window_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_export_window = g_type_register_static(GTK_TYPE_WINDOW, "AgsExportWindow", &ags_export_window_info, 0); g_type_add_interface_static(ags_type_export_window, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_export_window); } return g_define_type_id__volatile; } void ags_export_window_class_init(AgsExportWindowClass *export_window) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_export_window_parent_class = g_type_class_peek_parent(export_window); /* GObjectClass */ gobject = (GObjectClass *) export_window; gobject->set_property = ags_export_window_set_property; gobject->get_property = ags_export_window_get_property; gobject->finalize = ags_export_window_finalize; /* properties */ /** * AgsExportWindow:main-window: * * The assigned #AgsWindow. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-window", i18n_pspec("assigned main window"), i18n_pspec("The assigned main window"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_WINDOW, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) export_window; widget->show = ags_export_window_show; widget->delete_event = ags_export_window_delete_event; } void ags_export_window_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_export_window_connect; connectable->disconnect = ags_export_window_disconnect; } void ags_export_window_init(AgsExportWindow *export_window) { GtkVBox *vbox; GtkHBox *hbox; GtkTable *table; GtkLabel *label; GtkAlignment *alignment; gchar *str; export_window->flags = 0; g_object_set(export_window, "title", i18n("export to audio data"), NULL); export_window->main_window = NULL; /* pack */ vbox = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(export_window), GTK_WIDGET(vbox)); /* live export */ str = ags_config_get_value(ags_config_get_instance(), AGS_CONFIG_GENERIC, "disable-feature"); if(str == NULL || !g_ascii_strncasecmp(str, "experimental", 13)){ export_window->live_export = NULL; }else{ export_window->live_export = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("live export")); gtk_toggle_button_set_active((GtkToggleButton *) export_window->live_export, TRUE); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(export_window->live_export), FALSE, FALSE, 0); } g_free(str); /* exclude sequencer */ export_window->exclude_sequencer = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("exclude sequencers")); gtk_toggle_button_set_active((GtkToggleButton *) export_window->exclude_sequencer, TRUE); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(export_window->exclude_sequencer), FALSE, FALSE, 0); table = (GtkTable *) gtk_table_new(5, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, FALSE, 0); /* mode */ label = (GtkLabel *) gtk_label_new(i18n("mode")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); export_window->mode = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_combo_box_text_append_text(export_window->mode, "tact"); //TODO:JK: uncomment me // gtk_combo_box_text_append_text(export_window->mode, // "time"); gtk_combo_box_set_active((GtkComboBox *) export_window->mode, 0); gtk_table_attach(table, GTK_WIDGET(export_window->mode), 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /* tact */ label = (GtkLabel *) gtk_label_new(i18n("tact")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); export_window->tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_NOTATION_DEFAULT_LENGTH, 0.25); gtk_spin_button_set_digits(export_window->tact, 2); gtk_table_attach(table, GTK_WIDGET(export_window->tact), 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); /* time */ label = (GtkLabel *) gtk_label_new(i18n("time")); g_object_set(G_OBJECT(label), "xalign", 0.0, NULL); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); /* duration */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_table_attach(table, GTK_WIDGET(hbox), 1, 2, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 0, 0); export_window->duration = (GtkLabel *) gtk_label_new(ags_navigation_tact_to_time_string(0.0, AGS_SOUNDCARD_DEFAULT_BPM, 1.0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(export_window->duration), FALSE, FALSE, 0); /* export soundcard */ export_window->export_soundcard = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(export_window->export_soundcard), FALSE, FALSE, 0); /* add */ alignment = (GtkAlignment *) gtk_alignment_new(1.0, 0.5, 0.0, 0.0); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(alignment), FALSE, FALSE, 0); export_window->add = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(export_window->add)); /* export */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hbox), FALSE, FALSE, 0); export_window->export = (GtkToggleButton *) gtk_toggle_button_new_with_label(i18n("export")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(export_window->export), FALSE, FALSE, 0); } void ags_export_window_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsExportWindow *export_window; export_window = AGS_EXPORT_WINDOW(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { AgsWindow *main_window; main_window = (AgsWindow *) g_value_get_object(value); if((AgsWindow *) export_window->main_window == main_window){ return; } if(export_window->main_window != NULL){ g_object_unref(export_window->main_window); } if(main_window != NULL){ g_object_ref(main_window); } export_window->main_window = (GtkWidget *) main_window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_window_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsExportWindow *export_window; export_window = AGS_EXPORT_WINDOW(gobject); switch(prop_id){ case PROP_MAIN_WINDOW: { g_value_set_object(value, export_window->main_window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_window_connect(AgsConnectable *connectable) { AgsExportWindow *export_window; GList *list, *list_start; export_window = AGS_EXPORT_WINDOW(connectable); if((AGS_EXPORT_WINDOW_CONNECTED & (export_window->flags)) != 0){ return; } export_window->flags |= AGS_EXPORT_WINDOW_CONNECTED; g_signal_connect(G_OBJECT(export_window->add), "clicked", G_CALLBACK(ags_export_window_add_export_soundcard_callback), export_window); g_signal_connect_after(G_OBJECT(export_window->tact), "value-changed", G_CALLBACK(ags_export_window_tact_callback), export_window); g_signal_connect_after(G_OBJECT(export_window->export), "clicked", G_CALLBACK(ags_export_window_export_callback), export_window); /* export soundcard */ list_start = list = gtk_container_get_children(GTK_CONTAINER(export_window->export_soundcard)); while(list != NULL){ GList *child; child = gtk_container_get_children(GTK_CONTAINER(list->data)); ags_connectable_connect(AGS_CONNECTABLE(child->data)); g_list_free(child); /* iterate */ list = list->next; } g_list_free(list_start); } void ags_export_window_disconnect(AgsConnectable *connectable) { AgsExportWindow *export_window; GList *list, *list_start; export_window = AGS_EXPORT_WINDOW(connectable); if((AGS_EXPORT_WINDOW_CONNECTED & (export_window->flags)) == 0){ return; } export_window->flags &= (~AGS_EXPORT_WINDOW_CONNECTED); g_object_disconnect(G_OBJECT(export_window->add), "any_signal::add", G_CALLBACK(ags_export_window_add_export_soundcard_callback), export_window, NULL); g_object_disconnect(G_OBJECT(export_window->tact), "any_signal::value-changed", G_CALLBACK(ags_export_window_tact_callback), export_window, NULL); g_object_disconnect(G_OBJECT(export_window->export), "any_signal::clicked", G_CALLBACK(ags_export_window_export_callback), export_window, NULL); /* export soundcard */ list_start = list = gtk_container_get_children(GTK_CONTAINER(export_window->export_soundcard)); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_export_window_finalize(GObject *gobject) { AgsExportWindow *export_window; export_window = (AgsExportWindow *) gobject; G_OBJECT_CLASS(ags_export_window_parent_class)->finalize(gobject); } void ags_export_window_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_export_window_parent_class)->show(widget); } gboolean ags_export_window_delete_event(GtkWidget *widget, GdkEventAny *event) { gtk_widget_hide(widget); // GTK_WIDGET_CLASS(ags_export_window_parent_class)->delete_event(widget, event); return(TRUE); } /** * ags_export_window_reload_soundcard_editor: * @export_window: the #AgsExportWindow * * Reload soundcard editor. * * Since: 3.0.0 */ void ags_export_window_reload_soundcard_editor(AgsExportWindow *export_window) { AgsExportSoundcard *export_soundcard; GtkHBox *hbox; GtkAlignment *alignment; GtkButton *remove_button; AgsApplicationContext *application_context; GList *start_list, *list; gchar *backend; gchar *str; guint i; /* retrieve main window and application context */ application_context = ags_application_context_get_instance(); list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create export soundcard */ for(i = 0; list != NULL; i++){ guint soundcard_capability; soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(list->data)); if(soundcard_capability == AGS_SOUNDCARD_CAPABILITY_PLAYBACK){ /* create GtkHBox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) export_window->export_soundcard, (GtkWidget *) hbox, FALSE, FALSE, 0); /* instantiate export soundcard */ export_soundcard = (AgsExportSoundcard *) g_object_new(AGS_TYPE_EXPORT_SOUNDCARD, "soundcard", list->data, NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) export_soundcard, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(export_soundcard)); /* remove button */ alignment = (GtkAlignment *) gtk_alignment_new(0.5, 1.0, 0.0, 0.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) alignment, FALSE, FALSE, 0); remove_button = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_container_add((GtkContainer *) alignment, (GtkWidget *) remove_button); g_signal_connect(G_OBJECT(remove_button), "clicked", G_CALLBACK(ags_export_window_remove_export_soundcard_callback), export_window); /* set backend */ backend = NULL; if(AGS_IS_WASAPI_DEVOUT(list->data)){ backend = "wasapi"; }else if(AGS_IS_DEVOUT(list->data)){ if(ags_devout_test_flags(AGS_DEVOUT(list->data), AGS_DEVOUT_ALSA)){ backend = "alsa"; }else if(ags_devout_test_flags(AGS_DEVOUT(list->data), AGS_DEVOUT_OSS)){ backend = "oss"; } }else if(AGS_IS_JACK_DEVOUT(list->data)){ backend = "jack"; }else if(AGS_IS_PULSE_DEVOUT(list->data)){ backend = "pulse"; }else if(AGS_IS_CORE_AUDIO_DEVOUT(list->data)){ backend = "core-audio"; } ags_export_soundcard_set_backend(export_soundcard, backend); ags_export_soundcard_refresh_card(export_soundcard); /* set card */ str = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); ags_export_soundcard_set_card(export_soundcard, str); /* filename */ str = g_strdup_printf("out-%d.wav", i); ags_export_soundcard_set_filename(export_soundcard, str); g_free(str); /* set format */ ags_export_soundcard_set_format(export_soundcard, AGS_EXPORT_SOUNDCARD_FORMAT_WAV); /* show all */ gtk_widget_show_all((GtkWidget *) hbox); } /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_export_window_new: * * Create a new instance of #AgsExportWindow * * Returns: the #AgsExportWindow * * Since: 3.0.0 */ AgsExportWindow* ags_export_window_new() { AgsExportWindow *export_window; export_window = (AgsExportWindow *) g_object_new(AGS_TYPE_EXPORT_WINDOW, NULL); return(export_window); } gsequencer-3.1.3/ags/X/ags_sheet_window.h0000644000175000017500000000427013607210263015266 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SHEET_WINDOW_H__ #define __AGS_SHEET_WINDOW_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SHEET_WINDOW (ags_sheet_window_get_type()) #define AGS_SHEET_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SHEET_WINDOW, AgsSheetWindow)) #define AGS_SHEET_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SHEET_WINDOW, AgsSheetWindowClass)) #define AGS_IS_SHEET_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SHEET_WINDOW)) #define AGS_IS_SHEET_WINDOW_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SHEET_WINDOW)) #define AGS_SHEET_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SHEET_WINDOW, AgsSheetWindowClass)) typedef struct _AgsSheetWindow AgsSheetWindow; typedef struct _AgsSheetWindowClass AgsSheetWindowClass; typedef enum{ AGS_SHEET_WINDOW_CONNECTED = 1, }AgsSheetWindowFlags; struct _AgsSheetWindow { GtkWindow window; guint flags; GObject *soundcard; GtkWidget *parent_window; AgsSheetEditor *sheet_editor; }; struct _AgsSheetWindowClass { GtkWindowClass window; }; GType ags_sheet_window_get_type(void); AgsSheetWindow* ags_sheet_window_new(GtkWidget *parent_window); G_END_DECLS #endif /*__AGS_SHEET_WINDOW_H__*/ gsequencer-3.1.3/ags/X/ags_audio_preferences_callbacks.h0000644000175000017500000000351213607210263020246 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_PREFERENCES_CALLBACKS_H__ #define __AGS_AUDIO_PREFERENCES_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_audio_preferences_parent_set_callback(GtkWidget *widget, GtkWidget *old_parent, AgsAudioPreferences *audio_preferences); void ags_audio_preferences_add_callback(GtkWidget *widget, AgsAudioPreferences *audio_preferences); void ags_audio_preferences_remove_soundcard_editor_callback(GtkWidget *soundcard_editor, AgsAudioPreferences *audio_preferences); void ags_audio_preferences_enable_jack_callback(GtkCheckButton *check_button, AgsAudioPreferences *audio_preferences); void ags_audio_preferences_start_jack_callback(GtkButton *button, AgsAudioPreferences *audio_preferences); void ags_audio_preferences_stop_jack_callback(GtkButton *button, AgsAudioPreferences *audio_preferences); G_END_DECLS #endif /*__AGS_AUDIO_PREFERENCES_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_effect_separator.h0000644000175000017500000000414613607210263016105 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_SEPARATOR_H__ #define __AGS_EFFECT_SEPARATOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EFFECT_SEPARATOR (ags_effect_separator_get_type()) #define AGS_EFFECT_SEPARATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EFFECT_SEPARATOR, AgsEffectSeparator)) #define AGS_EFFECT_SEPARATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EFFECT_SEPARATOR, AgsEffectSeparatorClass)) #define AGS_IS_EFFECT_SEPARATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_EFFECT_SEPARATOR)) #define AGS_IS_EFFECT_SEPARATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EFFECT_SEPARATOR)) #define AGS_EFFECT_SEPARATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_EFFECT_SEPARATOR, AgsEffectSeparatorClass)) typedef struct _AgsEffectSeparator AgsEffectSeparator; typedef struct _AgsEffectSeparatorClass AgsEffectSeparatorClass; struct _AgsEffectSeparator { GtkHBox hbox; gchar *filename; gchar *effect; GtkLabel *label; }; struct _AgsEffectSeparatorClass { GtkHBoxClass hbox; }; GType ags_effect_separator_get_type(void); AgsEffectSeparator* ags_effect_separator_new(); G_END_DECLS #endif /*__AGS_EFFECT_SEPARATOR_H__*/ gsequencer-3.1.3/ags/X/ags_input_collection_editor.h0000644000175000017500000000511413607210263017505 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_COLLECTION_EDITOR_H__ #define __AGS_INPUT_COLLECTION_EDITOR_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_INPUT_COLLECTION_EDITOR (ags_input_collection_editor_get_type()) #define AGS_INPUT_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_INPUT_COLLECTION_EDITOR, AgsInputCollectionEditor)) #define AGS_INPUT_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_INPUT_COLLECTION_EDITOR, AgsInputCollectionEditorClass)) #define AGS_IS_INPUT_COLLECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_INPUT_COLLECTION_EDITOR)) #define AGS_IS_INPUT_COLLECTION_EDITOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_INPUT_COLLECTION_EDITOR)) #define AGS_INPUT_COLLECTION_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_INPUT_COLLECTION_EDITOR, AgsInputCollectionEditorClass)) typedef struct _AgsInputCollectionEditor AgsInputCollectionEditor; typedef struct _AgsInputCollectionEditorClass AgsInputCollectionEditorClass; typedef enum{ AGS_INPUT_COLLECTION_EDITOR_CONNECTED = 1, }AgsInputCollectionEditorFlags; struct _AgsInputCollectionEditor { GtkTable table; guint flags; GType channel_type; GtkSpinButton *first_line; GtkSpinButton *count; GtkComboBoxText *soundcard; GtkSpinButton *audio_channel; }; struct _AgsInputCollectionEditorClass { GtkTableClass table; }; GType ags_input_collection_editor_get_type(); void ags_input_collection_editor_check(AgsInputCollectionEditor *input_collection_editor); AgsInputCollectionEditor* ags_input_collection_editor_new(GType channel_type); G_END_DECLS #endif /*__AGS_INPUT_COLLECTION_EDITOR_H__*/ gsequencer-3.1.3/ags/X/ags_property_collection_editor_callbacks.h0000644000175000017500000000262113607210263022231 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PROPERTY_COLLECTION_EDITOR_CALLBACKS__ #define __AGS_PROPERTY_COLLECTION_EDITOR_CALLBACKS__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_property_collection_editor_add_collection_callback(GtkButton *button, AgsPropertyCollectionEditor *property_collection_editor); void ags_property_collection_editor_remove_collection_callback(GtkButton *button, GtkTable *table); G_END_DECLS #endif /*__AGS_PROPERTY_COLLECTION_EDITOR_CALLBACKS__*/ gsequencer-3.1.3/ags/X/ags_navigation.c0000644000175000017500000006136313607210263014727 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_navigation_class_init(AgsNavigationClass *navigation); void ags_navigation_connectable_interface_init(AgsConnectableInterface *connectable); void ags_navigation_init(AgsNavigation *navigation); void ags_navigation_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_navigation_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_navigation_finalize(GObject *gobject); void ags_navigation_connect(AgsConnectable *connectable); void ags_navigation_disconnect(AgsConnectable *connectable); void ags_navigation_real_change_position(AgsNavigation *navigation, gdouble tact); /** * SECTION:ags_navigation * @short_description: control audio object's playback. * @title: AgsNavigation * @section_id: * @include: ags/X/ags_navigation.h * * #AgsNavigation is a composite widget to control playback of #AgsAudio objects. * It can start #AgsMachine in bulk mode or position the stream. */ enum{ PROP_0, PROP_SOUNDCARD, }; enum{ CHANGE_POSITION, LAST_SIGNAL, }; static gpointer ags_navigation_parent_class = NULL; static guint navigation_signals[LAST_SIGNAL]; GType ags_navigation_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_navigation = 0; static const GTypeInfo ags_navigation_info = { sizeof (AgsNavigationClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_navigation_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsNavigation), 0, /* n_preallocs */ (GInstanceInitFunc) ags_navigation_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_navigation_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_navigation = g_type_register_static(GTK_TYPE_VBOX, "AgsNavigation", &ags_navigation_info, 0); g_type_add_interface_static(ags_type_navigation, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_navigation); } return g_define_type_id__volatile; } void ags_navigation_class_init(AgsNavigationClass *navigation) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_navigation_parent_class = g_type_class_peek_parent(navigation); /* GObjectClass */ gobject = (GObjectClass *) navigation; gobject->set_property = ags_navigation_set_property; gobject->get_property = ags_navigation_get_property; gobject->finalize = ags_navigation_finalize; /* properties */ /** * AgsNavigation:soundcard: * * The assigned #AgsSoundcard to use as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("assigned soundcard"), i18n_pspec("The soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /* AgsNavigationClass */ navigation->change_position = ags_navigation_real_change_position; /* signals */ /** * AgsNavigation::change-position: * @navigation: the #AgsNavigation * @tact: the new position * * The ::change-position seeks the stream. * * Since: 3.0.0 */ navigation_signals[CHANGE_POSITION] = g_signal_new("change-position", G_TYPE_FROM_CLASS (navigation), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsNavigationClass, change_position), NULL, NULL, g_cclosure_marshal_VOID__DOUBLE, G_TYPE_NONE, 1, G_TYPE_DOUBLE); } void ags_navigation_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_navigation_connect; connectable->disconnect = ags_navigation_disconnect; } void ags_navigation_init(AgsNavigation *navigation) { GtkHBox *hbox; GtkLabel *label; navigation->flags = AGS_NAVIGATION_BLOCK_TIC; navigation->soundcard = NULL; navigation->start_tact = 0.0; navigation->note_offset = 0.0; /* GtkWidget */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) navigation, (GtkWidget *) hbox, FALSE, FALSE, 2); navigation->expander = (GtkToggleButton *) gtk_toggle_button_new(); gtk_widget_set_name((GtkWidget *) navigation->expander, "ags-navigation-expander"); gtk_box_pack_start((GtkBox*) hbox, (GtkWidget *) navigation->expander, FALSE, FALSE, 2); gtk_container_add((GtkContainer *) navigation->expander, (GtkWidget *) gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE)); label = (GtkLabel *) gtk_label_new(i18n("bpm")); gtk_box_pack_start((GtkBox*) hbox, (GtkWidget *) label, FALSE, FALSE, 2); navigation->bpm = (GtkSpinButton *) gtk_spin_button_new_with_range(1.0, 1000.0, 1.0); gtk_spin_button_set_value(navigation->bpm, 120.0); gtk_box_pack_start((GtkBox*) hbox, (GtkWidget *) navigation->bpm, FALSE, FALSE, 2); navigation->current_bpm = 120.0; navigation->rewind = (GtkToggleButton *) g_object_new(GTK_TYPE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_REWIND, GTK_ICON_SIZE_LARGE_TOOLBAR), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->rewind, FALSE, FALSE, 0); navigation->previous = (GtkButton *) g_object_new(GTK_TYPE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_LARGE_TOOLBAR), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->previous, FALSE, FALSE, 0); navigation->play = (GtkToggleButton *) g_object_new(GTK_TYPE_TOGGLE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_LARGE_TOOLBAR), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->play, FALSE, FALSE, 0); navigation->stop = (GtkButton *) g_object_new(GTK_TYPE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_LARGE_TOOLBAR), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->stop, FALSE, FALSE, 0); navigation->next = (GtkButton *) g_object_new(GTK_TYPE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_NEXT, GTK_ICON_SIZE_LARGE_TOOLBAR), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->next, FALSE, FALSE, 0); navigation->forward = (GtkToggleButton *) g_object_new(GTK_TYPE_BUTTON, "image", (GtkWidget *) gtk_image_new_from_stock(GTK_STOCK_MEDIA_FORWARD, GTK_ICON_SIZE_LARGE_TOOLBAR), NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->forward, FALSE, FALSE, 0); navigation->loop = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("loop")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->loop, FALSE, FALSE, 2); label = (GtkLabel *) gtk_label_new("position"); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 2); navigation->position_time = (GtkLabel *) gtk_label_new("00:00.000"); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->position_time, FALSE, FALSE, 2); navigation->position_tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_NOTATION_EDITOR_MAX_CONTROLS, 1.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->position_tact, FALSE, FALSE, 2); label = (GtkLabel *) gtk_label_new("duration"); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 2); navigation->duration_time = (GtkLabel *) gtk_label_new(NULL); g_object_set(navigation->duration_time, "label", "0000:00.000", NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->duration_time, FALSE, FALSE, 2); g_timeout_add((guint) floor(AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0), (GSourceFunc) ags_navigation_duration_time_queue_draw, (gpointer) navigation); navigation->duration_tact = NULL; // navigation->duration_tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, AGS_NOTATION_EDITOR_MAX_CONTROLS, 1.0); // gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->duration_tact, FALSE, FALSE, 2); /* expansion */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); // GTK_WIDGET_SET_FLAGS((GtkWidget *) hbox, GTK_NO_SHOW_ALL); gtk_box_pack_start((GtkBox *) navigation, (GtkWidget *) hbox, FALSE, FALSE, 2); label = (GtkLabel *) gtk_label_new(i18n("loop L")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 2); navigation->loop_left_tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65000.0, 1.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->loop_left_tact, FALSE, FALSE, 2); label = (GtkLabel *) gtk_label_new(i18n("loop R")); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) label, FALSE, FALSE, 2); navigation->loop_right_tact = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 65000.0, 1.0); gtk_spin_button_set_value(navigation->loop_right_tact, 4.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->loop_right_tact, FALSE, FALSE, 2); navigation->scroll = NULL; /* navigation->scroll = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("auto-scroll")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(navigation->scroll), FALSE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->scroll, FALSE, FALSE, 2); */ navigation->exclude_sequencer = (GtkCheckButton *) gtk_check_button_new_with_label(i18n("exclude sequencers")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(navigation->exclude_sequencer), TRUE); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) navigation->exclude_sequencer, FALSE, FALSE, 2); } void ags_navigation_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsNavigation *navigation; navigation = AGS_NAVIGATION(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); if(navigation->soundcard == soundcard){ return; } if(navigation->soundcard != NULL){ g_object_unref(navigation->soundcard); } if(soundcard != NULL){ //FIXME:JK: no direct callback g_signal_connect_after(soundcard, "stop", G_CALLBACK(ags_navigation_soundcard_stop_callback), (gpointer) navigation); g_object_ref(soundcard); } navigation->soundcard = soundcard; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_navigation_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsNavigation *navigation; navigation = AGS_NAVIGATION(gobject); switch(prop_id){ case PROP_SOUNDCARD: g_value_set_object(value, navigation->soundcard); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_navigation_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_navigation_parent_class)->finalize(gobject); } void ags_navigation_connect(AgsConnectable *connectable) { AgsNavigation *navigation; navigation = AGS_NAVIGATION(connectable); if((AGS_NAVIGATION_CONNECTED & (navigation->flags)) != 0){ return; } navigation->flags |= AGS_NAVIGATION_CONNECTED; g_signal_connect((GObject *) navigation->expander, "clicked", G_CALLBACK(ags_navigation_expander_callback), (gpointer) navigation); g_signal_connect_after((GObject *) navigation->bpm, "value-changed", G_CALLBACK(ags_navigation_bpm_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->rewind, "clicked", G_CALLBACK(ags_navigation_rewind_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->previous, "clicked", G_CALLBACK(ags_navigation_prev_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->play, "clicked", G_CALLBACK(ags_navigation_play_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->stop, "clicked", G_CALLBACK(ags_navigation_stop_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->next, "clicked", G_CALLBACK(ags_navigation_next_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->forward, "clicked", G_CALLBACK(ags_navigation_forward_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->loop, "clicked", G_CALLBACK(ags_navigation_loop_callback), (gpointer) navigation); g_signal_connect_after((GObject *) navigation->position_tact, "value-changed", G_CALLBACK(ags_navigation_position_tact_callback), (gpointer) navigation); // g_signal_connect((GObject *) navigation->duration_tact, "value-changed", // G_CALLBACK(ags_navigation_duration_tact_callback), (gpointer) navigation); /* soundcard */ // g_signal_connect_after((GObject *) navigation->soundcard, "tic", // G_CALLBACK(ags_navigation_tic_callback), (gpointer) navigation); if(navigation->soundcard != NULL){ g_signal_connect_after(navigation->soundcard, "stop", G_CALLBACK(ags_navigation_soundcard_stop_callback), (gpointer) navigation); } /* expansion */ g_signal_connect((GObject *) navigation->loop_left_tact, "value-changed", G_CALLBACK(ags_navigation_loop_left_tact_callback), (gpointer) navigation); g_signal_connect((GObject *) navigation->loop_right_tact, "value-changed", G_CALLBACK(ags_navigation_loop_right_tact_callback), (gpointer) navigation); } void ags_navigation_disconnect(AgsConnectable *connectable) { AgsNavigation *navigation; navigation = AGS_NAVIGATION(connectable); if((AGS_NAVIGATION_CONNECTED & (navigation->flags)) == 0){ return; } navigation->flags &= (~AGS_NAVIGATION_CONNECTED); g_object_disconnect((GObject *) navigation->expander, "clicked", G_CALLBACK(ags_navigation_expander_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->bpm, "value-changed", G_CALLBACK(ags_navigation_bpm_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->rewind, "clicked", G_CALLBACK(ags_navigation_rewind_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->previous, "clicked", G_CALLBACK(ags_navigation_prev_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->play, "clicked", G_CALLBACK(ags_navigation_play_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->stop, "clicked", G_CALLBACK(ags_navigation_stop_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->next, "clicked", G_CALLBACK(ags_navigation_next_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->forward, "clicked", G_CALLBACK(ags_navigation_forward_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->loop, "clicked", G_CALLBACK(ags_navigation_loop_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->position_tact, "value-changed", G_CALLBACK(ags_navigation_position_tact_callback), (gpointer) navigation, NULL); if(navigation->soundcard != NULL){ g_object_disconnect(navigation->soundcard, "stop", G_CALLBACK(ags_navigation_soundcard_stop_callback), (gpointer) navigation, NULL); } /* expansion */ g_object_disconnect((GObject *) navigation->loop_left_tact, "value-changed", G_CALLBACK(ags_navigation_loop_left_tact_callback), (gpointer) navigation, NULL); g_object_disconnect((GObject *) navigation->loop_right_tact, "value-changed", G_CALLBACK(ags_navigation_loop_right_tact_callback), (gpointer) navigation, NULL); } void ags_navigation_real_change_position(AgsNavigation *navigation, gdouble tact_counter) { AgsSeekSoundcard *seek_soundcard; AgsApplicationContext *application_context; GObject *default_soundcard; GList *start_list, *list; gchar *timestr; gdouble delay; gdouble delay_factor; double tact_factor; gint64 new_offset; guint note_offset; application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* seek soundcard */ note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard)); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(default_soundcard)); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(default_soundcard)); new_offset = (16 * tact_counter); seek_soundcard = ags_seek_soundcard_new(default_soundcard, new_offset, AGS_SEEK_SET); ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) seek_soundcard); /* soundcard - start offset */ list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_soundcard_set_start_note_offset(AGS_SOUNDCARD(list->data), new_offset); list = list->next; } g_list_free_full(start_list, g_object_unref); /* sequencer - start offset */ list = start_list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_sequencer_set_start_note_offset(AGS_SEQUENCER(list->data), new_offset); list = list->next; } g_list_free_full(start_list, g_object_unref); //TODO:JK: implement me /* update */ timestr = ags_time_get_uptime_from_offset(16.0 * tact_counter, gtk_spin_button_get_value(navigation->bpm), delay, delay_factor); gtk_label_set_text(navigation->position_time, timestr); g_free(timestr); } /** * ags_navigation_change_position: * @navigation: the #AgsNavigation * @tact: the new position * * Change tact position of editor. The scrollbar is adjustet * and its playback position seeked. * * Since: 3.0.0 */ void ags_navigation_change_position(AgsNavigation *navigation, gdouble tact) { g_return_if_fail(AGS_IS_NAVIGATION(navigation)); g_object_ref(G_OBJECT(navigation)); g_signal_emit(G_OBJECT(navigation), navigation_signals[CHANGE_POSITION], 0, tact); g_object_unref(G_OBJECT(navigation)); } /** * ags_navigation_tact_to_time_string: * @tact: the new position * @bpm: the BPM * @delay_factor: the delay factor * * Convert tact unit to time. * * Returns: tact as time string * * Since: 3.0.0 */ gchar* ags_navigation_tact_to_time_string(gdouble tact, gdouble bpm, gdouble delay_factor) { gdouble delay_min, delay_sec, delay_msec; gchar *timestr; gdouble tact_redux; guint min, sec, msec; delay_min = bpm / delay_factor; delay_sec = delay_min / 60.0; delay_msec = delay_sec / 1000.0; tact_redux = (tact + (tact / 16.0)) * 16.0; min = (guint) floor(tact_redux / delay_min); if(min > 0){ tact_redux = tact_redux - (min * delay_min); } sec = (guint) floor(tact_redux / delay_sec); if(sec > 0){ tact_redux = tact_redux - (sec * delay_sec); } msec = (guint) floor(tact_redux / delay_msec); timestr = g_strdup_printf("%.4d:%.2d.%.3d", min, sec, msec); return(timestr); } /** * ags_navigation_update_time_string: * @tact: the new position * @bpm: the BPM * @delay_factor: the delay factor * @time_string: the pointer location to set * * Updates time as string. * * Since: 3.0.0 */ void ags_navigation_update_time_string(double tact, gdouble bpm, gdouble delay_factor, gchar *time_string) { gdouble delay_min, delay_sec, delay_msec; gchar *timestr; gdouble tact_redux; guint min, sec, msec; delay_min = bpm * (60.0 / bpm) * (60.0 / bpm) * delay_factor; delay_sec = delay_min / 60.0; delay_msec = delay_sec / 1000.0; tact_redux = 1.0 / 16.0; min = (guint) floor(tact_redux / delay_min); if(min > 0){ tact_redux = tact_redux - (min * delay_min); } sec = (guint) floor(tact_redux / delay_sec); if(sec > 0){ tact_redux = tact_redux - (sec * delay_sec); } msec = (guint) floor(tact_redux / delay_msec); sprintf(time_string, "%.4d:%.2d.%.3d", min, sec, msec); } gchar* ags_navigation_relative_tact_to_time_string(gchar *timestr, gdouble delay, gdouble bpm, gdouble delay_factor) { guint min, sec, msec; guint prev_min, prev_sec, prev_msec; gdouble sec_value; sscanf(timestr, "%d:%d.%d", &prev_min, &prev_sec, &prev_msec); sec_value = prev_min * 60.0; sec_value += prev_sec; sec_value += (1.0 / (16.0 * delay_factor) * (60.0 / bpm) + (1.0 / delay)) / 2.0; if(prev_msec != 0){ sec_value += (prev_msec / 1000.0); } // sec_value += (1.0 / delay); min = (guint) floor(sec_value / 60.0); sec = sec_value - 60 * min; msec = (sec_value - sec - min * 60) * 1000; timestr = g_strdup_printf("%.4d:%.2d.%.3d", min, sec, msec); return(timestr); } gchar* ags_navigation_absolute_tact_to_time_string(gdouble tact, gdouble bpm, gdouble delay_factor) { AgsConfig *config; gchar *timestr; gdouble delay_min, delay_sec, delay_msec; gdouble tact_redux; guint min, sec, msec; /* calculate delays */ delay_sec = ((bpm / delay_factor) / 60.0); delay_min = delay_sec * 60.0; delay_msec = delay_sec / 1000.0; /* translate to time string */ tact_redux = tact; min = (guint) floor(tact_redux / delay_min); if(min > 0){ tact_redux = tact_redux - (min * delay_min); } sec = (guint) floor(tact_redux / delay_sec); if(sec > 0){ tact_redux = tact_redux - (sec * delay_sec); } msec = (guint) floor(tact_redux / delay_msec); timestr = g_strdup_printf("%.4d:%.2d.%.3d", min, sec, msec); return(timestr); } /** * ags_navigation_set_seeking_sensitive_new: * @navigation: the #AgsNavigation * @enabled: if %TRUE then sensitive, otherwise insensitive. * * Enables/Disables the #AgsNavigation to control the tree. * * Since: 3.0.0 */ void ags_navigation_set_seeking_sensitive(AgsNavigation *navigation, gboolean enabled) { gtk_widget_set_sensitive((GtkWidget *) navigation->rewind, enabled); gtk_widget_set_sensitive((GtkWidget *) navigation->previous, enabled); gtk_widget_set_sensitive((GtkWidget *) navigation->play, enabled); gtk_widget_set_sensitive((GtkWidget *) navigation->stop, enabled); gtk_widget_set_sensitive((GtkWidget *) navigation->next, enabled); gtk_widget_set_sensitive((GtkWidget *) navigation->forward, enabled); } gboolean ags_navigation_duration_time_queue_draw(GtkWidget *widget) { AgsNavigation *navigation; AgsApplicationContext *application_context; GObject *default_soundcard; gchar *str; navigation = AGS_NAVIGATION(widget); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); if(default_soundcard != NULL){ str = ags_soundcard_get_uptime(AGS_SOUNDCARD(default_soundcard)); g_object_set(navigation->duration_time, "label", str, NULL); g_free(str); gtk_widget_queue_draw((GtkWidget *) navigation->duration_time); } return(TRUE); } /** * ags_navigation_new: * * Create a new instance of #AgsNavigation to control the tree. * * Returns: the new #AgsNavigation * * Since: 3.0.0 */ AgsNavigation* ags_navigation_new() { AgsNavigation *navigation; navigation = (AgsNavigation *) g_object_new(AGS_TYPE_NAVIGATION, NULL); return(navigation); } gsequencer-3.1.3/ags/X/ags_effect_bridge.h0000644000175000017500000001042313607210263015334 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EFFECT_BRIDGE_H__ #define __AGS_EFFECT_BRIDGE_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EFFECT_BRIDGE (ags_effect_bridge_get_type()) #define AGS_EFFECT_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EFFECT_BRIDGE, AgsEffectBridge)) #define AGS_EFFECT_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EFFECT_BRIDGE, AgsEffectBridgeClass)) #define AGS_IS_EFFECT_BRIDGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EFFECT_BRIDGE)) #define AGS_IS_EFFECT_BRIDGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EFFECT_BRIDGE)) #define AGS_EFFECT_BRIDGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EFFECT_BRIDGE, AgsEffectBridgeClass)) #define AGS_EFFECT_BRIDGE_DEFAULT_VERSION "0.7.8" #define AGS_EFFECT_BRIDGE_DEFAULT_BUILD_ID "CEST 01-03-2016 00:23" #define AGS_EFFECT_BRIDGE_MAX_COLUMNS (2) typedef struct _AgsEffectBridge AgsEffectBridge; typedef struct _AgsEffectBridgeClass AgsEffectBridgeClass; typedef enum{ AGS_EFFECT_BRIDGE_MAPPED_RECALL = 1, AGS_EFFECT_BRIDGE_PREMAPPED_RECALL = 1 << 1, AGS_EFFECT_BRIDGE_CONNECTED = 1 << 2, AGS_EFFECT_BRIDGE_DISPLAY_INPUT = 1 << 3, AGS_EFFECT_BRIDGE_BULK_OUTPUT = 1 << 4, AGS_EFFECT_BRIDGE_DISPLAY_OUTPUT = 1 << 5, AGS_EFFECT_BRIDGE_BULK_INPUT = 1 << 6, }AgsEffectBridgeFlags; struct _AgsEffectBridge { GtkVBox vbox; guint flags; gchar *name; gchar *version; gchar *build_id; guint samplerate; guint buffer_size; guint format; AgsAudio *audio; GType bulk_output_type; GtkWidget *bulk_output; GType output_pad_type; GType output_line_type; GtkHBox *output; GType bulk_input_type; GtkWidget *bulk_input; GType input_pad_type; GType input_line_type; GtkHBox *input; }; struct _AgsEffectBridgeClass { GtkVBoxClass vbox; void (*samplerate_changed)(AgsEffectBridge *effect_bridge, guint samplerate, guint old_samplerate); void (*buffer_size_changed)(AgsEffectBridge *effect_bridge, guint buffer_size, guint old_buffer_size); void (*format_changed)(AgsEffectBridge *effect_bridge, guint format, guint old_format); void (*resize_audio_channels)(AgsEffectBridge *effect_bridge, guint new_size, guint old_size); void (*resize_pads)(AgsEffectBridge *effect_bridge, GType channel_type, guint new_size, guint old_size); void (*map_recall)(AgsEffectBridge *effect_bridge); GList* (*find_port)(AgsEffectBridge *effect_bridge); }; GType ags_effect_bridge_get_type(void); void ags_effect_bridge_samplerate_changed(AgsEffectBridge *effect_bridge, guint samplerate, guint old_samplerate); void ags_effect_bridge_buffer_size_changed(AgsEffectBridge *effect_bridge, guint buffer_size, guint old_buffer_size); void ags_effect_bridge_format_changed(AgsEffectBridge *effect_bridge, guint format, guint old_format); void ags_effect_bridge_resize_audio_channels(AgsEffectBridge *effect_bridge, guint new_size, guint old_size); void ags_effect_bridge_resize_pads(AgsEffectBridge *effect_bridge, GType channel_type, guint new_size, guint old_size); void ags_effect_bridge_map_recall(AgsEffectBridge *effect_bridge); GList* ags_effect_bridge_find_port(AgsEffectBridge *effect_bridge); AgsEffectBridge* ags_effect_bridge_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_EFFECT_BRIDGE_H__*/ gsequencer-3.1.3/ags/X/ags_line_member_editor_callbacks.h0000644000175000017500000000276013607210263020414 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINE_MEMBER_EDITOR_CALLBACKS_H__ #define __AGS_LINE_MEMBER_EDITOR_CALLBACKS_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS void ags_line_member_editor_add_callback(GtkWidget *button, AgsLineMemberEditor *line_member_editor); void ags_line_member_editor_remove_callback(GtkWidget *button, AgsLineMemberEditor *line_member_editor); void ags_line_member_editor_plugin_browser_response_callback(GtkDialog *dialog, gint response, AgsLineMemberEditor *line_member_editor); G_END_DECLS #endif /*__AGS_LINE_MEMBER_EDITOR_CALLBACKS_H__*/ gsequencer-3.1.3/ags/X/ags_audio_preferences.c0000644000175000017500000003064313607210263016247 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_audio_preferences_class_init(AgsAudioPreferencesClass *audio_preferences); void ags_audio_preferences_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_preferences_applicable_interface_init(AgsApplicableInterface *applicable); void ags_audio_preferences_init(AgsAudioPreferences *audio_preferences); static void ags_audio_preferences_finalize(GObject *gobject); void ags_audio_preferences_connect(AgsConnectable *connectable); void ags_audio_preferences_disconnect(AgsConnectable *connectable); void ags_audio_preferences_set_update(AgsApplicable *applicable, gboolean update); void ags_audio_preferences_apply(AgsApplicable *applicable); void ags_audio_preferences_reset(AgsApplicable *applicable); /** * SECTION:ags_audio_preferences * @short_description: A composite widget to do audio related preferences * @title: AgsAudioPreferences * @section_id: * @include: ags/X/ags_audio_preferences.h * * #AgsAudioPreferences enables you to make preferences of soundcard, audio channels, * samplerate and buffer size. */ static gpointer ags_audio_preferences_parent_class = NULL; GType ags_audio_preferences_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_preferences = 0; static const GTypeInfo ags_audio_preferences_info = { sizeof (AgsAudioPreferencesClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_preferences_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioPreferences), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_preferences_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_preferences_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_audio_preferences_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_preferences = g_type_register_static(GTK_TYPE_VBOX, "AgsAudioPreferences", &ags_audio_preferences_info, 0); g_type_add_interface_static(ags_type_audio_preferences, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_audio_preferences, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_preferences); } return g_define_type_id__volatile; } void ags_audio_preferences_class_init(AgsAudioPreferencesClass *audio_preferences) { GObjectClass *gobject; GtkWidgetClass *widget; ags_audio_preferences_parent_class = g_type_class_peek_parent(audio_preferences); /* GtkObjectClass */ gobject = (GObjectClass *) audio_preferences; gobject->finalize = ags_audio_preferences_finalize; } void ags_audio_preferences_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_audio_preferences_connect; connectable->disconnect = ags_audio_preferences_disconnect; } void ags_audio_preferences_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_audio_preferences_set_update; applicable->apply = ags_audio_preferences_apply; applicable->reset = ags_audio_preferences_reset; } void ags_audio_preferences_init(AgsAudioPreferences *audio_preferences) { GtkScrolledWindow *scrolled_window; GtkTable *table; GtkHBox *hbox; GtkLabel *label; gchar *str; g_signal_connect_after((GObject *) audio_preferences, "parent-set", G_CALLBACK(ags_audio_preferences_parent_set_callback), (gpointer) audio_preferences); audio_preferences->flags = 0; /* scrolled window */ scrolled_window = (GtkScrolledWindow *) gtk_scrolled_window_new(NULL, NULL); gtk_box_pack_start((GtkBox *) audio_preferences, (GtkWidget *) scrolled_window, TRUE, TRUE, 0); audio_preferences->soundcard_editor = (GtkVBox *) gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport(scrolled_window, (GtkWidget *) audio_preferences->soundcard_editor); /* */ audio_preferences->add = NULL; /* */ table = (GtkTable *) gtk_table_new(2, 9, FALSE); gtk_box_pack_start(GTK_BOX(audio_preferences), GTK_WIDGET(table), FALSE, FALSE, 2); str = ags_config_get_value(ags_config_get_instance(), AGS_CONFIG_GENERIC, "disable-feature"); /* JACK */ if(str == NULL || !g_ascii_strncasecmp(str, "experimental", 13)){ audio_preferences->jack_driver = NULL; audio_preferences->start_jack = NULL; audio_preferences->stop_jack = NULL; }else{ label = (GtkLabel *) gtk_label_new(i18n("JACK driver")); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 7, 8, GTK_FILL, GTK_FILL, 0, 0); audio_preferences->jack_driver = (GtkComboBoxText *) gtk_combo_box_text_new(); gtk_table_attach(table, GTK_WIDGET(audio_preferences->jack_driver), 1, 2, 7, 8, GTK_FILL, GTK_FILL, 0, 0); label = (GtkLabel *) gtk_label_new(i18n("JACK server")); gtk_table_attach(table, GTK_WIDGET(label), 0, 1, 7, 8, GTK_FILL, GTK_FILL, 0, 0); hbox = (GtkHBox *) gtk_hbox_new(TRUE, 0); gtk_table_attach(table, GTK_WIDGET(hbox), 1, 2, 8, 9, GTK_FILL, GTK_FILL, 0, 0); audio_preferences->start_jack = (GtkButton *) gtk_button_new_with_label(i18n("start")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(audio_preferences->start_jack), FALSE, FALSE, 0); audio_preferences->stop_jack = (GtkButton *) gtk_button_new_with_label(i18n("stop")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(audio_preferences->stop_jack), FALSE, FALSE, 0); /* set default insensitive */ gtk_widget_set_sensitive((GtkWidget *) audio_preferences->jack_driver, FALSE); gtk_widget_set_sensitive((GtkWidget *) audio_preferences->start_jack, FALSE); gtk_widget_set_sensitive((GtkWidget *) audio_preferences->stop_jack, FALSE); } g_free(str); } static void ags_audio_preferences_finalize(GObject *gobject) { //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_audio_preferences_parent_class)->finalize(gobject); } void ags_audio_preferences_connect(AgsConnectable *connectable) { AgsAudioPreferences *audio_preferences; audio_preferences = AGS_AUDIO_PREFERENCES(connectable); if((AGS_AUDIO_PREFERENCES_CONNECTED & (audio_preferences->flags)) != 0){ return; } audio_preferences->flags |= AGS_AUDIO_PREFERENCES_CONNECTED; if(audio_preferences->add != NULL){ g_signal_connect(G_OBJECT(audio_preferences->add), "clicked", G_CALLBACK(ags_audio_preferences_add_callback), audio_preferences); } /* experimental */ if(audio_preferences->start_jack != NULL){ g_signal_connect(G_OBJECT(audio_preferences->start_jack), "clicked", G_CALLBACK(ags_audio_preferences_start_jack_callback), audio_preferences); } if(audio_preferences->stop_jack != NULL){ g_signal_connect(G_OBJECT(audio_preferences->stop_jack), "clicked", G_CALLBACK(ags_audio_preferences_stop_jack_callback), audio_preferences); } } void ags_audio_preferences_disconnect(AgsConnectable *connectable) { AgsAudioPreferences *audio_preferences; gchar *str; audio_preferences = AGS_AUDIO_PREFERENCES(connectable); if((AGS_AUDIO_PREFERENCES_CONNECTED & (audio_preferences->flags)) == 0){ return; } audio_preferences->flags &= (~AGS_AUDIO_PREFERENCES_CONNECTED); if(audio_preferences->add != NULL){ g_object_disconnect(G_OBJECT(audio_preferences->add), "any_signal::clicked", G_CALLBACK(ags_audio_preferences_add_callback), audio_preferences, NULL); } /* experimental */ if(audio_preferences->start_jack != NULL){ g_object_disconnect(G_OBJECT(audio_preferences->start_jack), "any_signal::clicked", G_CALLBACK(ags_audio_preferences_start_jack_callback), audio_preferences, NULL); } if(audio_preferences->stop_jack != NULL){ g_object_disconnect(G_OBJECT(audio_preferences->stop_jack), "any_signal::clicked", G_CALLBACK(ags_audio_preferences_stop_jack_callback), audio_preferences, NULL); } } void ags_audio_preferences_set_update(AgsApplicable *applicable, gboolean update) { //TODO:JK: implement me } void ags_audio_preferences_apply(AgsApplicable *applicable) { AgsAudioPreferences *audio_preferences; GList *list_start, *list; audio_preferences = AGS_AUDIO_PREFERENCES(applicable); list = list_start = gtk_container_get_children((GtkContainer *) audio_preferences->soundcard_editor); while(list != NULL){ ags_applicable_apply(AGS_APPLICABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_audio_preferences_reset(AgsApplicable *applicable) { AgsPreferences *preferences; AgsAudioPreferences *audio_preferences; AgsSoundcardEditor *soundcard_editor; AgsThread *main_loop; AgsThread *soundcard_thread; AgsApplicationContext *application_context; GObject *soundcard; GList *list_start, *list; audio_preferences = AGS_AUDIO_PREFERENCES(applicable); preferences = (AgsPreferences *) gtk_widget_get_ancestor(GTK_WIDGET(audio_preferences), AGS_TYPE_PREFERENCES); application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); soundcard_thread = ags_thread_find_type((AgsThread *) main_loop, AGS_TYPE_SOUNDCARD_THREAD); /* clear */ list = list_start = gtk_container_get_children((GtkContainer *) audio_preferences->soundcard_editor); while(list != NULL){ gtk_widget_destroy(GTK_WIDGET(list->data)); list = list->next; } g_list_free(list_start); /* reset */ list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ soundcard_editor = ags_soundcard_editor_new(); soundcard_editor->soundcard = list->data; soundcard_editor->soundcard_thread = (GObject *) ags_soundcard_thread_find_soundcard((AgsSoundcardThread *) soundcard_thread, list->data); gtk_box_pack_start((GtkBox *) audio_preferences->soundcard_editor, (GtkWidget *) soundcard_editor, FALSE, FALSE, 0); ags_applicable_reset(AGS_APPLICABLE(soundcard_editor)); ags_connectable_connect(AGS_CONNECTABLE(soundcard_editor)); g_signal_connect(soundcard_editor->remove, "clicked", G_CALLBACK(ags_audio_preferences_remove_soundcard_editor_callback), audio_preferences); list = list->next; } g_list_free_full(list_start, g_object_unref); gtk_widget_show_all((GtkWidget *) audio_preferences->soundcard_editor); /* unref */ g_object_unref(main_loop); } /** * ags_audio_preferences_new: * * Create a new instance of #AgsAudioPreferences * * Returns: the new #AgsAudioPreferences * * Since: 3.0.0 */ AgsAudioPreferences* ags_audio_preferences_new() { AgsAudioPreferences *audio_preferences; audio_preferences = (AgsAudioPreferences *) g_object_new(AGS_TYPE_AUDIO_PREFERENCES, NULL); return(audio_preferences); } gsequencer-3.1.3/ags/X/ags_line.c0000644000175000017500000021203513607210263013511 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_line_class_init(AgsLineClass *line); void ags_line_connectable_interface_init(AgsConnectableInterface *connectable); void ags_line_init(AgsLine *line); void ags_line_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_line_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_line_dispose(GObject *gobject); void ags_line_finalize(GObject *gobject); void ags_line_connect(AgsConnectable *connectable); void ags_line_disconnect(AgsConnectable *connectable); void ags_line_real_set_channel(AgsLine *line, AgsChannel *channel); GList* ags_line_add_ladspa_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_line_add_lv2_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect); GList* ags_line_real_add_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect); void ags_line_real_remove_effect(AgsLine *line, guint nth); void ags_line_real_map_recall(AgsLine *line, guint output_pad_start); GList* ags_line_real_find_port(AgsLine *line); /** * SECTION:ags_line * @short_description: A composite widget to visualize #AgsChannel * @title: AgsLine * @section_id: * @include: ags/X/ags_line.h * * #AgsLine is a composite widget to visualize #AgsChannel. It should be * packed by an #AgsPad. It may contain #AgsLineMember to modify ports of * #AgsRecall. */ enum{ SAMPLERATE_CHANGED, BUFFER_SIZE_CHANGED, FORMAT_CHANGED, SET_CHANNEL, GROUP_CHANGED, ADD_EFFECT, REMOVE_EFFECT, MAP_RECALL, FIND_PORT, STOP, LAST_SIGNAL, }; enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_PAD, PROP_CHANNEL, }; static gpointer ags_line_parent_class = NULL; static guint line_signals[LAST_SIGNAL]; GHashTable *ags_line_indicator_queue_draw = NULL; GType ags_line_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_line = 0; static const GTypeInfo ags_line_info = { sizeof(AgsLineClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_line_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLine), 0, /* n_preallocs */ (GInstanceInitFunc) ags_line_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_line_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_line = g_type_register_static(GTK_TYPE_VBOX, "AgsLine", &ags_line_info, 0); g_type_add_interface_static(ags_type_line, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_line); } return g_define_type_id__volatile; } void ags_line_class_init(AgsLineClass *line) { GObjectClass *gobject; GParamSpec *param_spec; ags_line_parent_class = g_type_class_peek_parent(line); /* GObjectClass */ gobject = G_OBJECT_CLASS(line); gobject->set_property = ags_line_set_property; gobject->get_property = ags_line_get_property; gobject->dispose = ags_line_dispose; gobject->finalize = ags_line_finalize; /* properties */ /** * AgsLine:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsLine:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsLine:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsLine:pad: * * The assigned #AgsPad. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pad", i18n_pspec("parent pad"), i18n_pspec("The pad which is its parent"), AGS_TYPE_PAD, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PAD, param_spec); /** * AgsLine:channel: * * The assigned #AgsChannel to visualize. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /* AgsLineClass */ line->samplerate_changed = NULL; line->buffer_size_changed = NULL; line->format_changed = NULL; line->set_channel = ags_line_real_set_channel; line->group_changed = NULL; line->add_effect = ags_line_real_add_effect; line->remove_effect = ags_line_real_remove_effect; line->map_recall = ags_line_real_map_recall; line->find_port = ags_line_real_find_port; line->stop = NULL; /* signals */ /** * AgsLine::samplerate-changed: * @line: the #AgsLine * @samplerate: the samplerate * @old_samplerate: the old samplerate * * The ::samplerate-changed signal notifies about changed samplerate. * * Since: 3.0.0 */ line_signals[SAMPLERATE_CHANGED] = g_signal_new("samplerate-changed", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, samplerate_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsLine::buffer-size-changed: * @line: the #AgsLine * @buffer_size: the buffer size * @old_buffer_size: the old buffer size * * The ::buffer-size-changed signal notifies about changed buffer size. * * Since: 3.0.0 */ line_signals[BUFFER_SIZE_CHANGED] = g_signal_new("buffer-size-changed", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, buffer_size_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsLine::format-changed: * @line: the #AgsLine * @format: the format * @old_format: the old format * * The ::format-changed signal notifies about changed format. * * Since: 3.0.0 */ line_signals[FORMAT_CHANGED] = g_signal_new("format-changed", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, format_changed), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsLine::set-channel: * @line: the #AgsLine to modify * @channel: the #AgsChannel to set * * The ::set-channel signal notifies about changed channel. * * Since: 3.0.0 */ line_signals[SET_CHANNEL] = g_signal_new("set-channel", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, set_channel), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsLine::group-changed: * @line: the object group changed * * The ::group-changed signal notifies about changed grouping. This * normally happens as toggling group button in #AgsPad or #AgsLine. * * Since: 3.0.0 */ line_signals[GROUP_CHANGED] = g_signal_new("group-changed", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, group_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsLine::add-effect: * @line: the #AgsLine to modify * @control_type_name: the control #GType string representation * @filename: the effect's filename * @effect: the effect's name * * The ::add-effect signal notifies about added effect. * * Returns: a #GList-struct containing new #AgsPort objects * * Since: 3.0.0 */ line_signals[ADD_EFFECT] = g_signal_new("add-effect", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, add_effect), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER_STRING_STRING, G_TYPE_POINTER, 3, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING); /** * AgsLine::remove-effect: * @line: the #AgsLine to modify * @nth: the nth effect * * The ::remove-effect signal notifies about removed effect. * * Since: 3.0.0 */ line_signals[REMOVE_EFFECT] = g_signal_new("remove-effect", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, remove_effect), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsLine::map-recall: * @line: the #AgsLine * @output_pad_start: the channels start pad * * The ::map-recall as recalls should be mapped. * * Since: 3.0.0 */ line_signals[MAP_RECALL] = g_signal_new("map-recall", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, map_recall), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsLine::find-port: * @line: the #AgsLine * * The ::find-port retrieves all associated ports. * * Returns: an #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ line_signals[FIND_PORT] = g_signal_new("find-port", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, find_port), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsLine::stop: * @line: the #AgsLine * @recall_id: the #GList-struct containing #AgsRecallID * @sound_scope: the sound scope * * The ::stop signal gets emited as audio stops playback. * * Since: 3.0.0 */ line_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS(line), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLineClass, stop), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_INT, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT); } void ags_line_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_line_connect; connectable->disconnect = ags_line_disconnect; } void ags_line_init(AgsLine *line) { AgsApplicationContext *application_context; AgsConfig *config; application_context = ags_application_context_get_instance(); g_signal_connect(application_context, "check-message", G_CALLBACK(ags_line_check_message_callback), line); if(ags_line_indicator_queue_draw == NULL){ ags_line_indicator_queue_draw = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); } line->flags = 0; line->version = AGS_VERSION; line->build_id = AGS_BUILD_ID; config = ags_config_get_instance(); line->samplerate = ags_soundcard_helper_config_get_samplerate(config); line->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); line->format = ags_soundcard_helper_config_get_format(config); line->channel = NULL; // gtk_widget_set_can_focus(line, // TRUE); line->pad = NULL; line->label = (GtkLabel *) gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(line), GTK_WIDGET(line->label), FALSE, FALSE, 0); line->group = (GtkToggleButton *) gtk_toggle_button_new_with_label(i18n("group")); gtk_toggle_button_set_active(line->group, TRUE); gtk_box_pack_start(GTK_BOX(line), GTK_WIDGET(line->group), FALSE, FALSE, 0); line->expander = ags_expander_new(1, 1); gtk_table_set_row_spacings(line->expander->table, 2); gtk_table_set_col_spacings(line->expander->table, 2); gtk_box_pack_start(GTK_BOX(line), GTK_WIDGET(line->expander), TRUE, TRUE, 0); line->indicator = NULL; /* forwarded callbacks */ g_signal_connect_after(line, "stop", G_CALLBACK(ags_line_stop_callback), NULL); } void ags_line_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLine *line; line = AGS_LINE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { guint samplerate, old_samplerate; samplerate = g_value_get_uint(value); old_samplerate = line->samplerate; if(samplerate == old_samplerate){ return; } line->samplerate = samplerate; ags_line_samplerate_changed(line, samplerate, old_samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size, old_buffer_size; buffer_size = g_value_get_uint(value); old_buffer_size = line->buffer_size; if(buffer_size == old_buffer_size){ return; } line->buffer_size = buffer_size; ags_line_buffer_size_changed(line, buffer_size, old_buffer_size); } break; case PROP_FORMAT: { guint format, old_format; format = g_value_get_uint(value); old_format = line->format; if(format == old_format){ return; } line->format = format; ags_line_format_changed(line, format, old_format); } break; case PROP_PAD: { GtkWidget *pad; pad = (GtkWidget *) g_value_get_object(value); if(line->pad == pad){ return; } if(line->pad != NULL){ g_object_unref(G_OBJECT(line->pad)); } if(pad != NULL){ g_object_ref(G_OBJECT(pad)); } line->pad = pad; } break; case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); ags_line_set_channel(line, channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_line_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLine *line; line = AGS_LINE(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, line->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, line->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, line->format); } break; case PROP_PAD: { g_value_set_object(value, line->pad); } break; case PROP_CHANNEL: { g_value_set_object(value, line->channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_line_dispose(GObject *gobject) { AgsLine *line; line = AGS_LINE(gobject); /* channel */ if(line->channel != NULL){ g_object_unref(line->channel); line->channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_line_parent_class)->dispose(gobject); } void ags_line_finalize(GObject *gobject) { AgsLine *line; AgsApplicationContext *application_context; GList *list; line = AGS_LINE(gobject); application_context = ags_application_context_get_instance(); g_object_disconnect(application_context, "any_signal::check-message", G_CALLBACK(ags_line_check_message_callback), line, NULL); /* remove indicator widget */ if(line->indicator != NULL){ g_hash_table_remove(ags_line_indicator_queue_draw, line->indicator); } /* remove of the queued drawing hash */ list = line->queued_drawing; while(list != NULL){ g_hash_table_remove(ags_line_indicator_queue_draw, list->data); list = list->next; } /* channel */ if(line->channel != NULL){ g_object_unref(line->channel); } /* call parent */ G_OBJECT_CLASS(ags_line_parent_class)->finalize(gobject); } void ags_line_connect(AgsConnectable *connectable) { AgsLine *line; GList *list, *list_start; line = AGS_LINE(connectable); if((AGS_LINE_CONNECTED & (line->flags)) != 0){ return; } /* set connected flag */ line->flags |= AGS_LINE_CONNECTED; #ifdef AGS_DEBUG g_message("line connect"); #endif if((AGS_LINE_PREMAPPED_RECALL & (line->flags)) == 0){ if((AGS_LINE_MAPPED_RECALL & (line->flags)) == 0){ ags_line_map_recall(line, 0); } }else{ ags_line_find_port(line); } /* connect group button */ g_signal_connect_after((GObject *) line->group, "clicked", G_CALLBACK(ags_line_group_clicked_callback), (gpointer) line); /* connect line members */ list_start = list = gtk_container_get_children(GTK_CONTAINER(line->expander->table)); while(list != NULL){ if(AGS_IS_CONNECTABLE(list->data)){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); } list = list->next; } g_list_free(list_start); } void ags_line_disconnect(AgsConnectable *connectable) { AgsLine *line; GList *list, *list_start; line = AGS_LINE(connectable); if((AGS_LINE_CONNECTED & (line->flags)) == 0){ return; } /* unset connected flag */ line->flags &= (~AGS_LINE_CONNECTED); #ifdef AGS_DEBUG g_message("line disconnect"); #endif /* disconnect group button */ if(line->group != NULL && GTK_IS_BUTTON(line->group)){ g_object_disconnect(line->group, "any_signal::clicked", G_CALLBACK(ags_line_group_clicked_callback), (gpointer) line, NULL); } /* disconnect line members */ list_start = list = gtk_container_get_children(GTK_CONTAINER(line->expander->table)); while(list != NULL){ if(AGS_IS_CONNECTABLE(list->data)){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); } list = list->next; } g_list_free(list_start); } /** * ags_line_samplerate_changed: * @line: the #AgsLine * @samplerate: the samplerate * @old_samplerate: the old samplerate * * Notify about samplerate changed. * * Since: 3.0.0 */ void ags_line_samplerate_changed(AgsLine *line, guint samplerate, guint old_samplerate) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[SAMPLERATE_CHANGED], 0, samplerate, old_samplerate); g_object_unref((GObject *) line); } /** * ags_line_buffer_size_changed: * @line: the #AgsLine * @buffer_size: the buffer_size * @old_buffer_size: the old buffer_size * * Notify about buffer_size changed. * * Since: 3.0.0 */ void ags_line_buffer_size_changed(AgsLine *line, guint buffer_size, guint old_buffer_size) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[BUFFER_SIZE_CHANGED], 0, buffer_size, old_buffer_size); g_object_unref((GObject *) line); } /** * ags_line_format_changed: * @line: the #AgsLine * @format: the format * @old_format: the old format * * Notify about format changed. * * Since: 3.0.0 */ void ags_line_format_changed(AgsLine *line, guint format, guint old_format) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[FORMAT_CHANGED], 0, format, old_format); g_object_unref((GObject *) line); } void ags_line_real_set_channel(AgsLine *line, AgsChannel *channel) { gchar *str; if(line->channel == channel){ return; } if(line->channel != NULL){ g_object_unref(G_OBJECT(line->channel)); } if(channel != NULL){ g_object_ref(G_OBJECT(channel)); } if(line->channel != NULL){ line->flags &= (~AGS_LINE_PREMAPPED_RECALL); } if(channel != NULL){ line->samplerate = channel->samplerate; line->buffer_size = channel->buffer_size; line->format = channel->format; } line->channel = channel; if(channel != NULL){ guint audio_channel; /* get audio channel */ g_object_get(channel, "audio-channel", &audio_channel, NULL); /* set label */ str = g_strdup_printf("%s %d", i18n("channel"), audio_channel + 1); gtk_label_set_label(line->label, str); g_free(str); }else{ str = g_strdup_printf("%s (null)", i18n("channel")); gtk_label_set_label(line->label, str); g_free(str); } } /** * ags_line_set_channel: * @line: the #AgsLine * @channel: the #AgsChannel to set * * Is emitted as channel gets modified. * * Since: 3.0.0 */ void ags_line_set_channel(AgsLine *line, AgsChannel *channel) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[SET_CHANNEL], 0, channel); g_object_unref((GObject *) line); } /** * ags_line_group_changed: * @line: an #AgsLine * * Is emitted as group is changed. * * Since: 3.0.0 */ void ags_line_group_changed(AgsLine *line) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[GROUP_CHANGED], 0); g_object_unref((GObject *) line); } GList* ags_line_add_ladspa_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect) { AgsLineMember *line_member; AgsEffectSeparator *separator; GtkAdjustment *adjustment; AgsLadspaPlugin *ladspa_plugin; GList *list; GList *start_recall, *recall; GList *play_port, *recall_port; GList *start_plugin_port, *plugin_port; gdouble step; guint port_count; guint x, y; guint k; /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); play_port = NULL; recall_port = NULL; /* retrieve position within table */ x = 0; y = 0; list = line->expander->children; while(list != NULL){ if(y <= AGS_EXPANDER_CHILD(list->data)->y){ y = AGS_EXPANDER_CHILD(list->data)->y + 1; } list = list->next; } /* play - find ports */ g_object_get(line->channel, "play", &start_recall, NULL); /* get by effect */ recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(start_recall, g_object_unref); start_recall = recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &play_port, NULL); g_list_foreach(play_port, (GFunc) g_object_unref, NULL); /* check has output port */ g_list_free_full(start_recall, g_object_unref); /* recall - find ports */ g_object_get(line->channel, "recall", &start_recall, NULL); /* get by effect */ recall = start_recall; start_recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(recall, g_object_unref); recall = start_recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &recall_port, NULL); g_list_foreach(recall_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* add separator */ separator = ags_effect_separator_new(); g_object_set(separator, "text", effect, "filename", filename, "effect", effect, NULL); ags_expander_add(line->expander, (GtkWidget *) separator, 0, y, AGS_LINE_COLUMNS_COUNT, 1); gtk_widget_show_all(GTK_WIDGET(separator)); y++; /* load ports */ g_object_get(ladspa_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLadspaConversion *ladspa_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; gchar *port_name; guint unique_id; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; disable_seemless = FALSE; do_step_conversion = FALSE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } if(control_type_name != NULL){ widget_type = g_type_from_name(control_type_name->data); control_type_name = control_type_name->next; } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); /* add line member */ g_object_get(ladspa_plugin, "unique-id", &unique_id, NULL); plugin_name = g_strdup_printf("ladspa-%u", unique_id); control_port = g_strdup_printf("%u/%u", k + 1, port_count); line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", widget_type, "widget-label", port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "specifier", port_name, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_line_member_get_widget(line_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* ladspa conversion */ ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_SAMPLERATE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(line_member, "conversion", ladspa_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; float lower_bound, upper_bound; float default_value; gdouble lower, upper; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_RANGE(child_widget)){ GtkRange *range; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; range = (GtkRange *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(range, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ GtkSpinButton *spin_button; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; spin_button = (GtkSpinButton *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(ladspa_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(ladspa_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(spin_button, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(ladspa_conversion != NULL){ control_value = ags_conversion_convert(ladspa_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget) || AGS_IS_LED(child_widget)){ g_hash_table_insert(ags_line_indicator_queue_draw, child_widget, ags_line_indicator_queue_draw_timeout); line->queued_drawing = g_list_prepend(line->queued_drawing, child_widget); g_timeout_add(1000 / 30, (GSourceFunc) ags_line_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("ladspa bounds: %f %f", lower, upper); #endif ags_expander_add(line->expander, (GtkWidget *) line_member, x % AGS_LINE_COLUMNS_COUNT, y, 1, 1); ags_connectable_connect(AGS_CONNECTABLE(line_member)); gtk_widget_show_all((GtkWidget *) line_member); /* iterate */ x++; if(x % AGS_LINE_COLUMNS_COUNT == 0){ y++; } } /* iterate */ plugin_port = plugin_port->next; k++; } g_list_free_full(start_plugin_port, g_object_unref); return(g_list_concat(play_port, recall_port)); } GList* ags_line_add_lv2_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect) { AgsLineMember *line_member; AgsEffectSeparator *separator; GtkAdjustment *adjustment; AgsLv2Plugin *lv2_plugin; GList *list; GList *start_recall, *recall; GList *play_port, *recall_port; GList *start_plugin_port, *plugin_port; gchar *uri; gchar *port_type_0, *port_type_1; gchar *plugin_name; gchar *control_port; gdouble step; guint port_count; guint x, y; guint k; GRecMutex *base_plugin_mutex; /* load plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); play_port = NULL; recall_port = NULL; /* retrieve position within table */ x = 0; y = 0; list = line->expander->children; while(list != NULL){ if(y <= AGS_EXPANDER_CHILD(list->data)->y){ y = AGS_EXPANDER_CHILD(list->data)->y + 1; } list = list->next; } /* play - find ports */ g_object_get(line->channel, "play", &start_recall, NULL); /* get by effect */ recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(start_recall, g_object_unref); start_recall = recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &play_port, NULL); g_list_foreach(play_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* recall - find ports */ g_object_get(line->channel, "recall", &start_recall, NULL); /* get by effect */ recall = start_recall; start_recall = ags_recall_get_by_effect(start_recall, filename, effect); g_list_free_full(recall, g_object_unref); recall = start_recall; if(recall == NULL){ return(NULL); } recall = g_list_last(start_recall); g_object_get((GObject *) recall->data, "port", &recall_port, NULL); g_list_foreach(recall_port, (GFunc) g_object_unref, NULL); g_list_free_full(start_recall, g_object_unref); /* add separator */ separator = ags_effect_separator_new(); g_object_set(separator, "text", effect, "filename", filename, "effect", effect, NULL); ags_expander_add(line->expander, (GtkWidget *) separator, 0, y, AGS_LINE_COLUMNS_COUNT, 1); gtk_widget_show_all(GTK_WIDGET(separator)); y++; /* get uri */ g_rec_mutex_lock(base_plugin_mutex); uri = g_strdup(lv2_plugin->uri); g_rec_mutex_unlock(base_plugin_mutex); /* load ports */ g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); plugin_port = start_plugin_port; port_count = g_list_length(start_plugin_port); k = 0; while(plugin_port != NULL){ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ GtkWidget *child_widget; AgsLv2Conversion *lv2_conversion; GType widget_type; gchar *plugin_name; gchar *control_port; gchar *port_name; guint scale_precision; gdouble step_count; gboolean disable_seemless; gboolean do_step_conversion; GRecMutex *plugin_port_mutex; disable_seemless = FALSE; do_step_conversion = FALSE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ disable_seemless = TRUE; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_LED; }else{ widget_type = GTK_TYPE_TOGGLE_BUTTON; } }else{ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ widget_type = AGS_TYPE_HINDICATOR; }else{ widget_type = AGS_TYPE_DIAL; } } if(control_type_name != NULL){ widget_type = g_type_from_name(control_type_name->data); control_type_name = control_type_name->next; } scale_precision = AGS_DIAL_DEFAULT_PRECISION; step_count = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ guint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); step_count = scale_precision = (gdouble) scale_steps; disable_seemless = TRUE; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get port name */ g_rec_mutex_lock(plugin_port_mutex); port_name = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); /* add line member */ plugin_name = g_strdup_printf("lv2-<%s>", uri); control_port = g_strdup_printf("%d/%d", k + 1, port_count); line_member = (AgsLineMember *) g_object_new(AGS_TYPE_LINE_MEMBER, "widget-type", widget_type, "widget-label", port_name, "plugin-name", plugin_name, "filename", filename, "effect", effect, "specifier", port_name, "control-port", control_port, "scale-precision", scale_precision, "step-count", step_count, NULL); child_widget = ags_line_member_get_widget(line_member); g_free(plugin_name); g_free(control_port); g_free(port_name); /* lv2 conversion */ lv2_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(lv2_conversion == NULL || !AGS_IS_LV2_CONVERSION(lv2_conversion)){ lv2_conversion = ags_lv2_conversion_new(); } lv2_conversion->flags |= AGS_LV2_CONVERSION_LOGARITHMIC; do_step_conversion = TRUE; } g_object_set(line_member, "conversion", lv2_conversion, NULL); /* child widget */ if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_BOOLEAN; } if(ags_plugin_port_test_flags(plugin_port->data, AGS_PLUGIN_PORT_INTEGER)){ line_member->port_flags = AGS_LINE_MEMBER_PORT_INTEGER; } if(AGS_IS_DIAL(child_widget)){ AgsDial *dial; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; dial = (AgsDial *) child_widget; if(disable_seemless){ dial->flags &= (~AGS_DIAL_SEEMLESS_MODE); } /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); g_object_set(dial, "adjustment", adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_RANGE(child_widget)){ GtkRange *range; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; range = (GtkRange *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(range, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ GtkSpinButton *spin_button; GtkAdjustment *adjustment; float lower_bound, upper_bound; gdouble lower, upper; float default_value; gdouble control_value; spin_button = (GtkSpinButton *) child_widget; /* add controls of ports and apply range */ g_rec_mutex_lock(plugin_port_mutex); lower_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->lower_value); upper_bound = g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->upper_value); g_rec_mutex_unlock(plugin_port_mutex); if(do_step_conversion){ g_object_set(lv2_conversion, "lower", lower_bound, "upper", upper_bound, NULL); lower = 0.0; upper = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT - 1.0; #if 0 if(!disable_seemless){ g_object_get(lv2_conversion, "step-count", &step_count, NULL); } #endif }else{ lower = lower_bound; upper = upper_bound; } g_object_get(spin_button, "adjustment", &adjustment, NULL); if(upper >= 0.0 && lower >= 0.0){ step = (upper - lower) / step_count; }else if(upper < 0.0 && lower < 0.0){ step = -1.0 * (lower - upper) / step_count; }else{ step = (upper - lower) / step_count; } gtk_adjustment_set_step_increment(adjustment, step); gtk_adjustment_set_lower(adjustment, lower); gtk_adjustment_set_upper(adjustment, upper); /* get/set default value */ g_rec_mutex_lock(plugin_port_mutex); default_value = (float) g_value_get_float(AGS_PLUGIN_PORT(plugin_port->data)->default_value); g_rec_mutex_unlock(plugin_port_mutex); control_value = default_value; if(lv2_conversion != NULL){ control_value = ags_conversion_convert(lv2_conversion, default_value, TRUE); } gtk_adjustment_set_value(adjustment, control_value); }else if(AGS_IS_INDICATOR(child_widget)){ g_hash_table_insert(ags_line_indicator_queue_draw, child_widget, ags_line_indicator_queue_draw_timeout); line->queued_drawing = g_list_prepend(line->queued_drawing, child_widget); g_timeout_add(1000 / 30, (GSourceFunc) ags_line_indicator_queue_draw_timeout, (gpointer) child_widget); } #ifdef AGS_DEBUG g_message("lv2 bounds: %f %f", lower, upper); #endif ags_expander_add(line->expander, (GtkWidget *) line_member, x % AGS_LINE_COLUMNS_COUNT, y, 1, 1); ags_connectable_connect(AGS_CONNECTABLE(line_member)); gtk_widget_show_all((GtkWidget *) line_member); /* iterate */ x++; if(x % AGS_LINE_COLUMNS_COUNT == 0){ y++; } } /* iterate */ plugin_port = plugin_port->next; k++; } g_list_free_full(start_plugin_port, g_object_unref); g_free(uri); return(g_list_concat(play_port, recall_port)); } GList* ags_line_real_add_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect) { AgsWindow *window; AgsLadspaPlugin *ladspa_plugin; AgsLv2Plugin *lv2_plugin; GList *port; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) line); /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); port = NULL; if(ladspa_plugin != NULL){ port = ags_line_add_ladspa_effect(line, control_type_name, filename, effect); }else{ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL){ port = ags_line_add_lv2_effect(line, control_type_name, filename, effect); } } /* */ ags_automation_toolbar_load_port(window->automation_window->automation_editor->automation_toolbar); return(port); } /** * ags_line_add_effect: * @line: the #AgsLine * @control_type_name: the control #GType string representation * @filename: the filename of the plugin * @effect: the effect's name * * Add a line member. * * Returns: a #GList-struct containing new #AgsPort objects * * Since: 3.0.0 */ GList* ags_line_add_effect(AgsLine *line, GList *control_type_name, gchar *filename, gchar *effect) { GList *port; g_return_val_if_fail(AGS_IS_LINE(line), NULL); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[ADD_EFFECT], 0, control_type_name, filename, effect, &port); g_object_unref((GObject *) line); return(port); } void ags_line_real_remove_effect(AgsLine *line, guint nth) { AgsWindow *window; GList *control, *control_start; GList *start_recall, *recall; GList *start_port, *port; gchar *filename, *effect; guint nth_effect, n_bulk; guint i; GRecMutex *recall_mutex; window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) line); /* get nth_effect */ g_object_get(line->channel, "play", &start_recall, NULL); recall = start_recall; nth_effect = 0; n_bulk = 0; while((recall = ags_recall_template_find_all_type(recall, AGS_TYPE_RECALL_LADSPA, AGS_TYPE_RECALL_LV2, G_TYPE_NONE)) != NULL){ if(ags_recall_test_flags(recall->data, AGS_RECALL_TEMPLATE)){ nth_effect++; } if(ags_recall_test_behaviour_flags(recall->data, AGS_SOUND_BEHAVIOUR_BULK_MODE)){ n_bulk++; } if(nth_effect - n_bulk == nth + 1){ break; } recall = recall->next; } if(recall == NULL){ g_list_free_full(start_recall, g_object_unref); return; } nth_effect--; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall->data); /* get filename and effect */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall->data)->filename); effect = g_strdup(AGS_RECALL(recall->data)->effect); g_rec_mutex_unlock(recall_mutex); /* destroy separator */ control_start = control = gtk_container_get_children((GtkContainer *) line->expander->table); while(control != NULL){ gchar *separator_filename; gchar *separator_effect; if(AGS_IS_EFFECT_SEPARATOR(control->data)){ g_object_get(control->data, "filename", &separator_filename, "effect", &separator_effect, NULL); if(separator_filename != NULL && separator_effect != NULL && !g_strcmp0(filename, separator_filename) && !g_strcmp0(effect, separator_effect)){ gtk_widget_destroy(control->data); break; } } control = control->next; } g_list_free(control_start); /* destroy controls */ g_object_get(recall->data, "port", &start_port, NULL); port = start_port; i = 0; while(port != NULL){ control_start = control = gtk_container_get_children((GtkContainer *) line->expander->table); while(control != NULL){ if(AGS_IS_LINE_MEMBER(control->data) && AGS_LINE_MEMBER(control->data)->port == port->data){ GtkWidget *child_widget; child_widget = gtk_bin_get_child(control->data); /* collect specifier */ i++; /* remove widget */ if(AGS_IS_LED(child_widget) || AGS_IS_INDICATOR(child_widget)){ g_hash_table_remove(ags_line_indicator_queue_draw, child_widget); } ags_expander_remove(line->expander, control->data); break; } /* iterate */ control = control->next; } g_list_free(control_start); /* iterate */ port = port->next; } g_list_free_full(start_recall, g_object_unref); g_list_free_full(start_port, g_object_unref); /* remove recalls */ ags_channel_remove_effect(line->channel, nth_effect); /* reset automation editor */ ags_automation_toolbar_load_port(window->automation_window->automation_editor->automation_toolbar); } /** * ags_line_remove_effect: * @line: the #AgsLine * @nth: nth effect to remove * * Remove a line member. * * Since: 3.0.0 */ void ags_line_remove_effect(AgsLine *line, guint nth) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[REMOVE_EFFECT], 0, nth); g_object_unref((GObject *) line); } void ags_line_real_map_recall(AgsLine *line, guint output_pad_start) { if((AGS_LINE_MAPPED_RECALL & (line->flags)) != 0){ return; } line->flags |= AGS_LINE_MAPPED_RECALL; ags_line_find_port(line); } /** * ags_line_map_recall: * @line: an #AgsLine * @output_pad_start: the start pad * * Is emitted as group is changed. * * Since: 3.0.0 */ void ags_line_map_recall(AgsLine *line, guint output_pad_start) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit(G_OBJECT(line), line_signals[MAP_RECALL], 0, output_pad_start); g_object_unref((GObject *) line); } GList* ags_line_real_find_port(AgsLine *line) { GList *port, *tmp_port; GList *line_member, *line_member_start; if(line == NULL || line->expander == NULL){ return(NULL); } line_member_start = line_member = gtk_container_get_children(GTK_CONTAINER(line->expander->table)); port = NULL; if(line_member != NULL){ while(line_member != NULL){ if(AGS_IS_LINE_MEMBER(line_member->data)){ tmp_port = ags_line_member_find_port(AGS_LINE_MEMBER(line_member->data)); if(port != NULL){ port = g_list_concat(port, tmp_port); }else{ port = tmp_port; } } line_member = line_member->next; } g_list_free(line_member_start); } return(port); } /** * ags_line_find_port: * @line: the #AgsLine * * Lookup ports of assigned recalls. * * Returns: a #GList-struct containing all related #AgsPort * * Since: 3.0.0 */ GList* ags_line_find_port(AgsLine *line) { GList *list; list = NULL; g_return_val_if_fail(AGS_IS_LINE(line), NULL); g_object_ref((GObject *) line); g_signal_emit((GObject *) line, line_signals[FIND_PORT], 0, &list); g_object_unref((GObject *) line); return(list); } /** * ags_line_stop: * @line: the #AgsLine * @recall_id: the #GList-struct containing #AgsRecallID * @sound_scope: the sound scope * * Notify about to stop playback of @recall_id. * * Since: 3.0.0 */ void ags_line_stop(AgsLine *line, GList *recall_id, gint sound_scope) { g_return_if_fail(AGS_IS_LINE(line)); g_object_ref((GObject *) line); g_signal_emit((GObject *) line, line_signals[STOP], 0, recall_id, sound_scope); g_object_unref((GObject *) line); } /** * ags_line_find_next_grouped: * @line: a #GList-struct of #AgsLine objects * * Retrieve next grouped line. * * Returns: next matching #GList-struct containing #AgsLine * * Since: 3.0.0 */ GList* ags_line_find_next_grouped(GList *line) { while(line != NULL && !gtk_toggle_button_get_active(AGS_LINE(line->data)->group)){ line = line->next; } return(line); } /** * ags_line_check_message: * @line: the #AgsLine * * Check message queue for message envelopes. * * Since: 3.0.0 */ void ags_line_check_message(AgsLine *line) { AgsChannel *channel; AgsMessageDelivery *message_delivery; GList *start_message_envelope, *message_envelope; if(!AGS_LINE(line)){ return; } /* retrieve message delivery */ message_delivery = ags_message_delivery_get_instance(); channel = line->channel; message_envelope = start_message_envelope = ags_message_delivery_find_sender(message_delivery, "libgsequencer", (GObject *) channel); while(message_envelope != NULL){ xmlNode *root_node; root_node = xmlDocGetRootElement(AGS_MESSAGE_ENVELOPE(message_envelope->data)->doc); if(!xmlStrncmp(root_node->name, "ags-command", 12)){ if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::set-samplerate", 27)){ guint samplerate; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "samplerate"); samplerate = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set samplerate */ g_object_set(line, "samplerate", samplerate, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::set-buffer-size", 28)){ guint buffer_size; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "buffer-size"); buffer_size = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set buffer size */ g_object_set(line, "buffer-size", buffer_size, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::set-format", 23)){ guint format; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "format"); format = g_value_get_uint(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* set format */ g_object_set(line, "format", format, NULL); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::add-effect", 22)){ AgsMachine *machine; AgsMachineEditor *machine_editor; AgsLineMemberEditor *line_member_editor; AgsPluginBrowser *plugin_browser; GList *pad_editor, *pad_editor_start; GList *line_editor, *line_editor_start; GList *control_type_name; gchar *filename, *effect; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "filename"); filename = g_value_get_string(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "effect"); effect = g_value_get_string(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* get machine and machine editor */ machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) line, AGS_TYPE_MACHINE); machine_editor = (AgsMachineEditor *) machine->properties; /* get control type */ control_type_name = NULL; pad_editor_start = NULL; line_editor_start = NULL; if(machine_editor != NULL){ pad_editor_start = pad_editor = gtk_container_get_children((GtkContainer *) machine_editor->input_editor->child); pad_editor = g_list_nth(pad_editor, channel->pad); if(pad_editor != NULL){ line_editor_start = line_editor = gtk_container_get_children((GtkContainer *) AGS_PAD_EDITOR(pad_editor->data)->line_editor); line_editor = g_list_nth(line_editor, channel->audio_channel); }else{ line_editor = NULL; } if(line_editor != NULL){ line_member_editor = AGS_LINE_EDITOR(line_editor->data)->member_editor; plugin_browser = line_member_editor->plugin_browser; if(plugin_browser != NULL && plugin_browser->active_browser != NULL){ GList *description, *description_start; GList *port_control, *port_control_start; gchar *controls; /* get plugin browser */ description = description_start = NULL; port_control_start = NULL; if(AGS_IS_LADSPA_BROWSER(plugin_browser->active_browser)){ description_start = description = gtk_container_get_children((GtkContainer *) AGS_LADSPA_BROWSER(plugin_browser->active_browser)->description); }else if(AGS_IS_DSSI_BROWSER(plugin_browser->active_browser)){ description_start = description = gtk_container_get_children((GtkContainer *) AGS_DSSI_BROWSER(plugin_browser->active_browser)->description); }else if(AGS_IS_LV2_BROWSER(plugin_browser->active_browser)){ description_start = description = gtk_container_get_children((GtkContainer *) AGS_LV2_BROWSER(plugin_browser->active_browser)->description); }else{ g_message("ags_line_callbacks.c unsupported plugin browser"); } /* get port description */ if(description != NULL){ description = g_list_last(description); port_control_start = port_control = gtk_container_get_children(GTK_CONTAINER(description->data)); if(port_control != NULL){ while(port_control != NULL){ controls = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(port_control->data)); if(!g_ascii_strncasecmp(controls, "led", 4)){ control_type_name = g_list_prepend(control_type_name, "AgsLed"); }else if(!g_ascii_strncasecmp(controls, "vertical indicator", 19)){ control_type_name = g_list_prepend(control_type_name, "AgsVIndicator"); }else if(!g_ascii_strncasecmp(controls, "horizontal indicator", 19)){ control_type_name = g_list_prepend(control_type_name, "AgsHIndicator"); }else if(!g_ascii_strncasecmp(controls, "spin button", 12)){ control_type_name = g_list_prepend(control_type_name, "GtkSpinButton"); }else if(!g_ascii_strncasecmp(controls, "dial", 5)){ control_type_name = g_list_prepend(control_type_name, "AgsDial"); }else if(!g_ascii_strncasecmp(controls, "vertical scale", 15)){ control_type_name = g_list_prepend(control_type_name, "GtkVScale"); }else if(!g_ascii_strncasecmp(controls, "horizontal scale", 17)){ control_type_name = g_list_prepend(control_type_name, "GtkHScale"); }else if(!g_ascii_strncasecmp(controls, "check-button", 13)){ control_type_name = g_list_prepend(control_type_name, "GtkCheckButton"); }else if(!g_ascii_strncasecmp(controls, "toggle button", 14)){ control_type_name = g_list_prepend(control_type_name, "GtkToggleButton"); } port_control = port_control->next; port_control = port_control->next; } } /* free lists */ g_list_free(description_start); g_list_free(port_control_start); } } // line_member_editor->plugin_browser; } }else{ control_type_name = NULL; } /* free lists */ g_list_free(pad_editor_start); g_list_free(line_editor_start); /* add effect */ ags_line_add_effect(line, control_type_name, filename, effect); }else if(!xmlStrncmp(xmlGetProp(root_node, "method"), "AgsChannel::stop", 18)){ GList *recall_id; gint sound_scope; gint position; position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "recall-id"); recall_id = g_value_get_pointer(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); position = ags_strv_index(AGS_MESSAGE_ENVELOPE(message_envelope->data)->parameter_name, "sound-scope"); sound_scope = g_value_get_int(&(AGS_MESSAGE_ENVELOPE(message_envelope->data)->value[position])); /* stop */ ags_line_stop(line, recall_id, sound_scope); } } message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, (GDestroyNotify) g_object_unref); } /** * ags_line_indicator_queue_draw_timeout: * @widget: the widget * * Queue draw widget * * Returns: %TRUE if proceed with redraw, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_line_indicator_queue_draw_timeout(GtkWidget *widget) { AgsLine *line; if(g_hash_table_lookup(ags_line_indicator_queue_draw, widget) != NULL){ GList *list, *list_start; line = (AgsLine *) gtk_widget_get_ancestor(widget, AGS_TYPE_LINE); list_start = list = gtk_container_get_children((GtkContainer *) AGS_LINE(line)->expander->table); /* check members */ while(list != NULL){ if(AGS_IS_LINE_MEMBER(list->data) && (AGS_LINE_MEMBER(list->data)->widget_type == AGS_TYPE_VINDICATOR || AGS_LINE_MEMBER(list->data)->widget_type == AGS_TYPE_HINDICATOR || AGS_LINE_MEMBER(list->data)->widget_type == AGS_TYPE_LED)){ AgsLineMember *line_member; GtkAdjustment *adjustment; GtkWidget *child; AgsPort *current; AgsPluginPort *plugin_port; gdouble average_peak; gdouble lower, upper; gdouble range; gdouble peak; gboolean success; GValue value = {0,}; GRecMutex *port_mutex; GRecMutex *plugin_port_mutex; line_member = AGS_LINE_MEMBER(list->data); child = gtk_bin_get_child(GTK_BIN(line_member)); average_peak = 0.0; /* play port */ current = line_member->port; if(current == NULL){ list = list->next; continue; } /* check if output port and specifier matches */ if(!ags_port_test_flags(current, AGS_PORT_IS_OUTPUT)){ list = list->next; continue; } g_object_get(current, "plugin-port", &plugin_port, NULL); g_object_unref(plugin_port); if(plugin_port == NULL){ list = list->next; continue; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current); /* match specifier */ g_rec_mutex_lock(port_mutex); success = (!g_ascii_strcasecmp(current->specifier, line_member->specifier)) ? TRUE: FALSE; g_rec_mutex_unlock(port_mutex); if(!success){ list = list->next; continue; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); /* lower and upper */ g_rec_mutex_lock(plugin_port_mutex); lower = g_value_get_float(plugin_port->lower_value); upper = g_value_get_float(plugin_port->upper_value); g_rec_mutex_unlock(plugin_port_mutex); /* get range */ if(line_member->conversion != NULL){ lower = ags_conversion_convert(line_member->conversion, lower, TRUE); upper = ags_conversion_convert(line_member->conversion, upper, TRUE); } range = upper - lower; /* play port - read value */ g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current, &value); peak = g_value_get_float(&value); g_value_unset(&value); if(line_member->conversion != NULL){ peak = ags_conversion_convert(line_member->conversion, peak, TRUE); } /* calculate peak */ if(range == 0.0 || current->port_value_type == G_TYPE_BOOLEAN){ if(peak != 0.0){ average_peak = 10.0; } }else{ average_peak += ((1.0 / (range / peak)) * 10.0); } /* recall port */ current = line_member->recall_port; /* recall port - read value */ g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current, &value); peak = g_value_get_float(&value); g_value_unset(&value); if(line_member->conversion != NULL){ peak = ags_conversion_convert(line_member->conversion, peak, TRUE); } /* calculate peak */ if(range == 0.0 || current->port_value_type == G_TYPE_BOOLEAN){ if(peak != 0.0){ average_peak = 10.0; } }else{ average_peak += ((1.0 / (range / peak)) * 10.0); } /* apply */ if(AGS_IS_LED(child)){ if(average_peak != 0.0){ ags_led_set_active(AGS_LED(child)); } }else{ g_object_get(child, "adjustment", &adjustment, NULL); gtk_adjustment_set_value(adjustment, average_peak); } } list = list->next; } g_list_free(list_start); /* queue draw */ gtk_widget_queue_draw(widget); return(TRUE); }else{ return(FALSE); } } /** * ags_line_new: * @pad: the parent pad * @channel: the #AgsChannel to visualize * * Create a new instance of #AgsLine * * Returns: the new #AgsLine * * Since: 3.0.0 */ AgsLine* ags_line_new(GtkWidget *pad, AgsChannel *channel) { AgsLine *line; line = (AgsLine *) g_object_new(AGS_TYPE_LINE, "pad", pad, "channel", channel, NULL); return(line); } gsequencer-3.1.3/ags/X/ags_export_window_callbacks.c0000644000175000017500000002701313607210263017471 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_export_window_stop_callback(AgsThread *thread, AgsExportWindow *export_window); void ags_export_window_add_export_soundcard_callback(GtkWidget *button, AgsExportWindow *export_window) { AgsExportSoundcard *export_soundcard; GtkHBox *hbox; GtkAlignment *alignment; GtkButton *remove_button; /* create GtkHBox */ hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start((GtkBox *) export_window->export_soundcard, (GtkWidget *) hbox, FALSE, FALSE, 0); /* instantiate export soundcard */ export_soundcard = (AgsExportSoundcard *) g_object_new(AGS_TYPE_EXPORT_SOUNDCARD, NULL); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) export_soundcard, FALSE, FALSE, 0); ags_connectable_connect(AGS_CONNECTABLE(export_soundcard)); /* remove button */ alignment = (GtkAlignment *) gtk_alignment_new(0.5, 1.0, 0.0, 0.0); gtk_box_pack_start((GtkBox *) hbox, (GtkWidget *) alignment, FALSE, FALSE, 0); remove_button = (GtkButton *) gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_container_add((GtkContainer *) alignment, (GtkWidget *) remove_button); g_signal_connect(G_OBJECT(remove_button), "clicked", G_CALLBACK(ags_export_window_remove_export_soundcard_callback), export_window); /* show all */ gtk_widget_show_all(GTK_WIDGET(hbox)); } void ags_export_window_remove_export_soundcard_callback(GtkWidget *button, AgsExportWindow *export_window) { GtkHBox *hbox; hbox = (GtkHBox *) gtk_widget_get_ancestor(button, GTK_TYPE_HBOX); gtk_widget_destroy(GTK_WIDGET(hbox)); } void ags_export_window_tact_callback(GtkWidget *spin_button, AgsExportWindow *export_window) { AgsWindow *window; AgsApplicationContext *application_context; GObject *default_soundcard; gchar *str; gdouble delay_factor; gdouble delay; /* retrieve window */ window = AGS_WINDOW(export_window->main_window); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* get some properties */ delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(default_soundcard)); delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(default_soundcard)); /* update duration */ str = ags_time_get_uptime_from_offset(gtk_spin_button_get_value(export_window->tact) * 16.0, gtk_spin_button_get_value(window->navigation->bpm), delay, delay_factor); gtk_label_set_text(export_window->duration, str); g_free(str); } void ags_export_window_export_callback(GtkWidget *toggle_button, AgsExportWindow *export_window) { AgsWindow *window; AgsMachine *machine; AgsThread *main_loop; AgsApplicationContext *application_context; GObject *default_soundcard; GList *machines_start; gboolean success; application_context = ags_application_context_get_instance(); window = ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); /* collect */ machines_start = NULL; success = FALSE; if(gtk_toggle_button_get_active((GtkToggleButton *) toggle_button)){ AgsExportOutput *export_output; AgsExportThread *export_thread, *current_export_thread; GList *export_soundcard, *export_soundcard_start; GList *child, *child_start; GList *machines; GList *all_filename; GList *remove_filename; GList *task; GList *list; gchar *filename; gboolean file_exists; gboolean live_performance; export_thread = (AgsExportThread *) ags_thread_find_type(main_loop, AGS_TYPE_EXPORT_THREAD); export_soundcard = export_soundcard_start = gtk_container_get_children(GTK_CONTAINER(export_window->export_soundcard)); all_filename = NULL; remove_filename = NULL; file_exists = FALSE; while(export_soundcard != NULL){ child = child_start = gtk_container_get_children(GTK_CONTAINER(export_soundcard->data)); while(child != NULL){ if(AGS_IS_EXPORT_SOUNDCARD(child->data)){ break; } child = child->next; } if(child == NULL || !AGS_IS_EXPORT_SOUNDCARD(child->data)){ export_soundcard = export_soundcard->next; g_list_free(child_start); continue; } filename = gtk_entry_get_text(AGS_EXPORT_SOUNDCARD(child->data)->filename); all_filename = g_list_prepend(all_filename, filename); /* test filename */ if(filename == NULL || strlen(filename) == 0){ export_soundcard = export_soundcard->next; g_list_free(child_start); continue; } if(g_file_test(filename, G_FILE_TEST_EXISTS)){ if(g_file_test(filename, (G_FILE_TEST_IS_DIR | G_FILE_TEST_IS_SYMLINK))){ export_soundcard = export_soundcard->next; g_list_free(child_start); continue; } remove_filename = g_list_prepend(remove_filename, filename); file_exists = TRUE; } g_list_free(child_start); export_soundcard = export_soundcard->next; } if(file_exists){ GtkDialog *dialog; gint response; dialog = (GtkDialog *) gtk_message_dialog_new((GtkWindow *) export_window, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, "Replace existing file(s)?"); response = gtk_dialog_run(dialog); gtk_widget_destroy((GtkWidget *) dialog); if(response == GTK_RESPONSE_REJECT || response == GTK_RESPONSE_CANCEL){ goto ags_export_window_export_callback_END; } /* remove files */ list = remove_filename; while(list != NULL){ g_remove(list->data); list = list->next; } g_list_free(remove_filename); } /* get some preferences */ if(export_window->live_export != NULL){ live_performance = gtk_toggle_button_get_active((GtkToggleButton *) export_window->live_export); }else{ live_performance = TRUE; } machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); /* start machines */ while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) != 0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ g_message("found machine to play!"); ags_machine_set_run_extended(machine, TRUE, !gtk_toggle_button_get_active((GtkToggleButton *) export_window->exclude_sequencer), TRUE, FALSE, FALSE); success = TRUE; }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ g_message("found machine to play!"); ags_machine_set_run_extended(machine, TRUE, FALSE, FALSE, TRUE, FALSE); success = TRUE; } machines = machines->next; } /* start export thread */ if(success){ gchar *str; guint tic; guint format; gdouble delay; gdouble delay_factor; /* create task */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(default_soundcard)); delay_factor = ags_soundcard_get_delay_factor(AGS_SOUNDCARD(default_soundcard)); /* */ tic = (gtk_spin_button_get_value(export_window->tact) + 1) * (16.0 * delay); export_soundcard = export_soundcard_start; task = NULL; while(export_soundcard != NULL){ child = child_start = gtk_container_get_children(GTK_CONTAINER(export_soundcard->data)); while(child != NULL){ if(AGS_IS_EXPORT_SOUNDCARD(child->data)){ break; } child = child->next; } if(child == NULL || !AGS_IS_EXPORT_SOUNDCARD(child->data)){ export_soundcard = export_soundcard->next; g_list_free(child_start); continue; } current_export_thread = ags_export_thread_find_soundcard(export_thread, AGS_EXPORT_SOUNDCARD(child->data)->soundcard); filename = gtk_entry_get_text(AGS_EXPORT_SOUNDCARD(child->data)->filename); export_output = ags_export_output_new(current_export_thread, AGS_EXPORT_SOUNDCARD(child->data)->soundcard, filename, tic, live_performance); str = gtk_combo_box_text_get_active_text(AGS_EXPORT_SOUNDCARD(child->data)->output_format); format = 0; if(!g_ascii_strncasecmp(str, "wav", 4)){ format = AGS_EXPORT_OUTPUT_FORMAT_WAV; }else if(!g_ascii_strncasecmp(str, "flac", 5)){ format = AGS_EXPORT_OUTPUT_FORMAT_FLAC; }else if(!g_ascii_strncasecmp(str, "ogg", 4)){ format = AGS_EXPORT_OUTPUT_FORMAT_OGG; } g_object_set(G_OBJECT(export_output), "format", format, NULL); task = g_list_prepend(task, export_output); if(AGS_EXPORT_SOUNDCARD(child->data)->soundcard == default_soundcard){ g_signal_connect(current_export_thread, "stop", G_CALLBACK(ags_export_window_stop_callback), export_window); } g_list_free(child_start); export_soundcard = export_soundcard->next; } /* append AgsStartSoundcard */ task = g_list_reverse(task); ags_ui_provider_schedule_task_all(AGS_UI_PROVIDER(application_context), task); ags_navigation_set_seeking_sensitive(window->navigation, FALSE); } g_list_free(export_soundcard_start); }else{ GList *machines; machines_start = machines = gtk_container_get_children(GTK_CONTAINER(window->machines)); /* stop machines */ while(machines != NULL){ machine = AGS_MACHINE(machines->data); if((AGS_MACHINE_IS_SEQUENCER & (machine->flags)) !=0 || (AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ g_message("found machine to stop!"); ags_machine_set_run_extended(machine, FALSE, TRUE, TRUE, FALSE, FALSE); success = TRUE; }else if((AGS_MACHINE_IS_WAVE_PLAYER & (machine->flags)) != 0){ g_message("found machine to stop!"); ags_machine_set_run_extended(machine, FALSE, FALSE, FALSE, TRUE, FALSE); success = TRUE; } machines = machines->next; } /* disable auto-seeking */ if(success){ ags_navigation_set_seeking_sensitive(window->navigation, TRUE); } } ags_export_window_export_callback_END: /* free machine list */ g_list_free(machines_start); g_object_unref(main_loop); } void ags_export_window_stop_callback(AgsThread *thread, AgsExportWindow *export_window) { gtk_toggle_button_set_active(export_window->export, FALSE); } gsequencer-3.1.3/ags/X/ags_xorg_application_context.c0000644000175000017500000036211113614062654017700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include "config.h" #ifdef AGS_WITH_QUARTZ #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include #include #include #include #include #ifndef __APPLE__ #include #endif #include #ifndef AGS_W32API #include #endif #include #include #include #include #include void ags_xorg_application_context_signal_handler(int signr); static void ags_xorg_application_context_signal_cleanup(); void ags_xorg_application_context_class_init(AgsXorgApplicationContextClass *xorg_application_context); void ags_xorg_application_context_connectable_interface_init(AgsConnectableInterface *connectable); void ags_xorg_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider); void ags_xorg_application_context_service_provider_interface_init(AgsServiceProviderInterface *service_provider); void ags_xorg_application_context_sound_provider_interface_init(AgsSoundProviderInterface *sound_provider); void ags_xorg_application_context_ui_provider_interface_init(AgsUiProviderInterface *ui_provider); void ags_xorg_application_context_init(AgsXorgApplicationContext *xorg_application_context); void ags_xorg_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_xorg_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_xorg_application_context_dispose(GObject *gobject); void ags_xorg_application_context_finalize(GObject *gobject); void ags_xorg_application_context_connect(AgsConnectable *connectable); void ags_xorg_application_context_disconnect(AgsConnectable *connectable); AgsThread* ags_xorg_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider); void ags_xorg_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop); AgsTaskLauncher* ags_xorg_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider); void ags_xorg_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher); AgsThreadPool* ags_xorg_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider); void ags_xorg_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool); GList* ags_xorg_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider); void ags_xorg_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker); gboolean ags_xorg_application_context_is_operating(AgsServiceProvider *service_provider); AgsServerStatus* ags_xorg_application_context_server_status(AgsServiceProvider *service_provider); void ags_xorg_application_context_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry); AgsRegistry* ags_xorg_application_context_get_registry(AgsServiceProvider *service_provider); void ags_xorg_application_context_set_server(AgsServiceProvider *service_provider, GList *server); GList* ags_xorg_application_context_get_server(AgsServiceProvider *service_provider); GObject* ags_xorg_application_context_get_default_soundcard(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_default_soundcard(AgsSoundProvider *sound_provider, GObject *soundcard); GObject* ags_xorg_application_context_get_default_soundcard_thread(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_default_soundcard_thread(AgsSoundProvider *sound_provider, GObject *soundcard_thread); GList* ags_xorg_application_context_get_soundcard(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_soundcard(AgsSoundProvider *sound_provider, GList *soundcard); GList* ags_xorg_application_context_get_sequencer(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_sequencer(AgsSoundProvider *sound_provider, GList *sequencer); GList* ags_xorg_application_context_get_audio(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_audio(AgsSoundProvider *sound_provider, GList *audio); GList* ags_xorg_application_context_get_sound_server(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_sound_server(AgsSoundProvider *sound_provider, GList *sound_server); GList* ags_xorg_application_context_get_osc_server(AgsSoundProvider *sound_provider); void ags_xorg_application_context_set_osc_server(AgsSoundProvider *sound_provider, GList *osc_server); gboolean ags_xorg_application_context_get_show_animation(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_show_animation(AgsUiProvider *ui_provider, gboolean show_animation); gboolean ags_xorg_application_context_get_gui_ready(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_gui_ready(AgsUiProvider *ui_provider, gboolean gui_ready); gboolean ags_xorg_application_context_get_file_ready(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_file_ready(AgsUiProvider *ui_provider, gboolean file_ready); gdouble ags_xorg_application_context_get_gui_scale_factor(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_gui_scale_factor(AgsUiProvider *ui_provider, gdouble gui_scale_factor); void ags_xorg_application_context_schedule_task(AgsUiProvider *ui_provider, AgsTask *task); void ags_xorg_application_context_schedule_task_all(AgsUiProvider *ui_provider, GList *task); void ags_xorg_application_context_clean_message(AgsUiProvider *ui_provider); GtkWidget* ags_xorg_application_context_get_animation_window(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_animation_window(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_window(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_window(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_automation_window(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_automation_window(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_wave_window(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_wave_window(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_sheet_window(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_sheet_window(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_export_window(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_export_window(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_preferences(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_preferences(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_history_browser(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_history_browser(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_midi_browser(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_midi_browser(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_sample_browser(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_sample_browser(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_midi_import_wizard(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_midi_import_wizard(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_midi_export_wizard(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_midi_export_wizard(AgsUiProvider *ui_provider, GtkWidget *widget); GList* ags_xorg_application_context_get_machine(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_machine(AgsUiProvider *ui_provider, GList *machine); GtkWidget* ags_xorg_application_context_get_composite_editor(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_composite_editor(AgsUiProvider *ui_provider, GtkWidget *widget); GtkWidget* ags_xorg_application_context_get_navigation(AgsUiProvider *ui_provider); void ags_xorg_application_context_set_navigation(AgsUiProvider *ui_provider, GtkWidget *widget); void ags_xorg_application_context_prepare(AgsApplicationContext *application_context); void ags_xorg_application_context_setup(AgsApplicationContext *application_context); void ags_xorg_application_context_register_types(AgsApplicationContext *application_context); void ags_xorg_application_context_quit(AgsApplicationContext *application_context); void ags_xorg_application_context_read(AgsFile *file, xmlNode *node, GObject **application_context); xmlNode* ags_xorg_application_context_write(AgsFile *file, xmlNode *parent, GObject *application_context); void* ags_xorg_application_context_server_main_loop_thread(GMainLoop *main_loop); void* ags_xorg_application_context_audio_main_loop_thread(GMainLoop *main_loop); /** * SECTION:ags_xorg_application_context * @short_description: The xorg application context * @title: AgsXorgApplicationContext * @section_id: * @include: ags/X/ags_xorg_application_context.h * * #AgsXorgApplicationContext is a application context providing * the main window and sets up a functional audio layer. */ enum{ PROP_0, PROP_WINDOW, }; static gpointer ags_xorg_application_context_parent_class = NULL; static AgsConnectableInterface* ags_xorg_application_context_parent_connectable_interface; extern AgsApplicationContext *ags_application_context; //TODO:JK: implement get functions #ifndef AGS_W32API struct sigaction ags_sigact; #endif GType ags_xorg_application_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_xorg_application_context = 0; static const GTypeInfo ags_xorg_application_context_info = { sizeof (AgsXorgApplicationContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_xorg_application_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsXorgApplicationContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_xorg_application_context_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_xorg_application_context_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_concurrency_provider_interface_info = { (GInterfaceInitFunc) ags_xorg_application_context_concurrency_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_service_provider_interface_info = { (GInterfaceInitFunc) ags_xorg_application_context_service_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_provider_interface_info = { (GInterfaceInitFunc) ags_xorg_application_context_sound_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_ui_provider_interface_info = { (GInterfaceInitFunc) ags_xorg_application_context_ui_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_xorg_application_context = g_type_register_static(AGS_TYPE_APPLICATION_CONTEXT, "AgsXorgApplicationContext", &ags_xorg_application_context_info, 0); g_type_add_interface_static(ags_type_xorg_application_context, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_xorg_application_context, AGS_TYPE_CONCURRENCY_PROVIDER, &ags_concurrency_provider_interface_info); g_type_add_interface_static(ags_type_xorg_application_context, AGS_TYPE_SERVICE_PROVIDER, &ags_service_provider_interface_info); g_type_add_interface_static(ags_type_xorg_application_context, AGS_TYPE_SOUND_PROVIDER, &ags_sound_provider_interface_info); g_type_add_interface_static(ags_type_xorg_application_context, AGS_TYPE_UI_PROVIDER, &ags_ui_provider_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_xorg_application_context); } return g_define_type_id__volatile; } void ags_xorg_application_context_signal_handler(int signr) { #ifndef AGS_W32API if(signr == SIGINT){ //TODO:JK: do backup exit(-1); }else{ sigemptyset(&(ags_sigact.sa_mask)); // if(signr == AGS_ASYNC_QUEUE_SIGNAL_HIGH){ // } } #endif } static void ags_xorg_application_context_signal_cleanup() { #ifndef AGS_W32API sigemptyset(&(ags_sigact.sa_mask)); #endif } void ags_xorg_application_context_class_init(AgsXorgApplicationContextClass *xorg_application_context) { GObjectClass *gobject; AgsApplicationContextClass *application_context; GParamSpec *param_spec; ags_xorg_application_context_parent_class = g_type_class_peek_parent(xorg_application_context); /* GObjectClass */ gobject = (GObjectClass *) xorg_application_context; gobject->set_property = ags_xorg_application_context_set_property; gobject->get_property = ags_xorg_application_context_get_property; gobject->dispose = ags_xorg_application_context_dispose; gobject->finalize = ags_xorg_application_context_finalize; /* properties */ /** * AgsXorgApplicationContext:window: * * The assigned window. * * Since: 3.0.0 */ param_spec = g_param_spec_object("window", i18n_pspec("window of xorg application context"), i18n_pspec("The window which this xorg application context assigned to"), AGS_TYPE_WINDOW, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WINDOW, param_spec); /* AgsXorgApplicationContextClass */ application_context = (AgsApplicationContextClass *) xorg_application_context; application_context->prepare = ags_xorg_application_context_prepare; application_context->setup = ags_xorg_application_context_setup; application_context->register_types = ags_xorg_application_context_register_types; application_context->quit = ags_xorg_application_context_quit; application_context->write = ags_xorg_application_context_write; application_context->read = ags_xorg_application_context_read; } void ags_xorg_application_context_connectable_interface_init(AgsConnectableInterface *connectable) { ags_xorg_application_context_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_xorg_application_context_connect; connectable->disconnect = ags_xorg_application_context_disconnect; } void ags_xorg_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider) { concurrency_provider->get_main_loop = ags_xorg_application_context_get_main_loop; concurrency_provider->set_main_loop = ags_xorg_application_context_set_main_loop; concurrency_provider->get_task_launcher = ags_xorg_application_context_get_task_launcher; concurrency_provider->set_task_launcher = ags_xorg_application_context_set_task_launcher; concurrency_provider->get_thread_pool = ags_xorg_application_context_get_thread_pool; concurrency_provider->set_thread_pool = ags_xorg_application_context_set_thread_pool; concurrency_provider->get_worker = ags_xorg_application_context_get_worker; concurrency_provider->set_worker = ags_xorg_application_context_set_worker; } void ags_xorg_application_context_service_provider_interface_init(AgsServiceProviderInterface *service_provider) { service_provider->is_operating = ags_xorg_application_context_is_operating; service_provider->server_status = ags_xorg_application_context_server_status; service_provider->set_registry = ags_xorg_application_context_set_registry; service_provider->get_registry = ags_xorg_application_context_get_registry; service_provider->set_server = ags_xorg_application_context_set_server; service_provider->get_server = ags_xorg_application_context_get_server; } void ags_xorg_application_context_sound_provider_interface_init(AgsSoundProviderInterface *sound_provider) { sound_provider->get_default_soundcard = ags_xorg_application_context_get_default_soundcard; sound_provider->set_default_soundcard = ags_xorg_application_context_set_default_soundcard; sound_provider->get_default_soundcard_thread = ags_xorg_application_context_get_default_soundcard_thread; sound_provider->set_default_soundcard_thread = ags_xorg_application_context_set_default_soundcard_thread; sound_provider->get_soundcard = ags_xorg_application_context_get_soundcard; sound_provider->set_soundcard = ags_xorg_application_context_set_soundcard; sound_provider->get_sequencer = ags_xorg_application_context_get_sequencer; sound_provider->set_sequencer = ags_xorg_application_context_set_sequencer; sound_provider->get_sound_server = ags_xorg_application_context_get_sound_server; sound_provider->set_sound_server = ags_xorg_application_context_set_sound_server; sound_provider->get_audio = ags_xorg_application_context_get_audio; sound_provider->set_audio = ags_xorg_application_context_set_audio; sound_provider->get_osc_server = ags_xorg_application_context_get_osc_server; sound_provider->set_osc_server = ags_xorg_application_context_set_osc_server; } void ags_xorg_application_context_ui_provider_interface_init(AgsUiProviderInterface *ui_provider) { ui_provider->get_show_animation = ags_xorg_application_context_get_show_animation; ui_provider->set_show_animation = ags_xorg_application_context_set_show_animation; ui_provider->get_gui_ready = ags_xorg_application_context_get_gui_ready; ui_provider->set_gui_ready = ags_xorg_application_context_set_gui_ready; ui_provider->get_file_ready = ags_xorg_application_context_get_file_ready; ui_provider->set_file_ready = ags_xorg_application_context_set_file_ready; ui_provider->get_gui_scale_factor = ags_xorg_application_context_get_gui_scale_factor; ui_provider->set_gui_scale_factor = ags_xorg_application_context_set_gui_scale_factor; ui_provider->schedule_task = ags_xorg_application_context_schedule_task; ui_provider->schedule_task_all = ags_xorg_application_context_schedule_task_all; ui_provider->clean_message = ags_xorg_application_context_clean_message; ui_provider->get_animation_window = ags_xorg_application_context_get_animation_window; ui_provider->set_animation_window = ags_xorg_application_context_set_animation_window; ui_provider->get_window = ags_xorg_application_context_get_window; ui_provider->set_window = ags_xorg_application_context_set_window; ui_provider->get_automation_window = ags_xorg_application_context_get_automation_window; ui_provider->set_automation_window = ags_xorg_application_context_set_automation_window; ui_provider->get_wave_window = ags_xorg_application_context_get_wave_window; ui_provider->set_wave_window = ags_xorg_application_context_set_wave_window; ui_provider->get_sheet_window = ags_xorg_application_context_get_sheet_window; ui_provider->set_sheet_window = ags_xorg_application_context_set_sheet_window; ui_provider->get_export_window = ags_xorg_application_context_get_export_window; ui_provider->set_export_window = ags_xorg_application_context_set_export_window; ui_provider->get_preferences = ags_xorg_application_context_get_preferences; ui_provider->set_preferences = ags_xorg_application_context_set_preferences; ui_provider->get_history_browser = ags_xorg_application_context_get_history_browser; ui_provider->set_history_browser = ags_xorg_application_context_set_history_browser; ui_provider->get_midi_browser = ags_xorg_application_context_get_midi_browser; ui_provider->set_midi_browser = ags_xorg_application_context_set_midi_browser; ui_provider->get_sample_browser = ags_xorg_application_context_get_sample_browser; ui_provider->set_sample_browser = ags_xorg_application_context_set_sample_browser; ui_provider->get_midi_import_wizard = ags_xorg_application_context_get_midi_import_wizard; ui_provider->set_midi_import_wizard = ags_xorg_application_context_set_midi_import_wizard; ui_provider->get_midi_export_wizard = ags_xorg_application_context_get_midi_export_wizard; ui_provider->set_midi_export_wizard = ags_xorg_application_context_set_midi_export_wizard; ui_provider->get_machine = ags_xorg_application_context_get_machine; ui_provider->set_machine = ags_xorg_application_context_set_machine; ui_provider->get_composite_editor = ags_xorg_application_context_get_composite_editor; ui_provider->set_composite_editor = ags_xorg_application_context_set_composite_editor; ui_provider->get_navigation = ags_xorg_application_context_get_navigation; ui_provider->set_navigation = ags_xorg_application_context_set_navigation; } void ags_xorg_application_context_init(AgsXorgApplicationContext *xorg_application_context) { AgsConfig *config; AgsLog *log; if(ags_application_context == NULL){ ags_application_context = (AgsApplicationContext *) xorg_application_context; } /* fundamental instances */ config = ags_config_get_instance(); AGS_APPLICATION_CONTEXT(xorg_application_context)->config = config; g_object_ref(config); log = (GObject *) ags_log_get_instance(); AGS_APPLICATION_CONTEXT(xorg_application_context)->log = log; g_object_ref(log); /* Xorg application context */ xorg_application_context->thread_pool = NULL; xorg_application_context->worker = NULL; xorg_application_context->is_operating = FALSE; xorg_application_context->server_status = NULL; xorg_application_context->registry = NULL; xorg_application_context->server = NULL; xorg_application_context->default_soundcard = NULL; xorg_application_context->default_soundcard_thread = NULL; xorg_application_context->default_export_thread = NULL; xorg_application_context->soundcard = NULL; xorg_application_context->sequencer = NULL; xorg_application_context->sound_server = NULL; xorg_application_context->audio = NULL; xorg_application_context->osc_server = NULL; xorg_application_context->gui_ready = FALSE; xorg_application_context->show_animation = TRUE; xorg_application_context->file_ready = FALSE; xorg_application_context->gui_scale_factor = 1.0; xorg_application_context->task = NULL; xorg_application_context->animation_window = NULL; xorg_application_context->window = NULL; xorg_application_context->automation_window = NULL; xorg_application_context->wave_window = NULL; xorg_application_context->sheet_window = NULL; xorg_application_context->export_window = NULL; xorg_application_context->preferences = NULL; xorg_application_context->history_browser = NULL; xorg_application_context->midi_browser = NULL; xorg_application_context->sample_browser = NULL; xorg_application_context->midi_import_wizard = NULL; xorg_application_context->midi_export_wizard = NULL; xorg_application_context->machine = NULL; xorg_application_context->composite_editor = NULL; xorg_application_context->navigation = NULL; } void ags_xorg_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(gobject); switch(prop_id){ case PROP_WINDOW: { AgsWindow *window; window = (AgsWindow *) g_value_get_object(value); if(window == xorg_application_context->window){ return; } if(xorg_application_context->window != NULL){ g_object_unref(xorg_application_context->window); } if(window != NULL){ g_object_ref(G_OBJECT(window)); } xorg_application_context->window = window; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_xorg_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(gobject); switch(prop_id){ case PROP_WINDOW: { g_value_set_object(value, xorg_application_context->window); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_xorg_application_context_dispose(GObject *gobject) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(gobject); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); g_rec_mutex_lock(application_context_mutex); /* thread pool */ if(xorg_application_context->thread_pool != NULL){ g_object_unref(xorg_application_context->thread_pool); xorg_application_context->thread_pool = NULL; } /* worker thread */ if(xorg_application_context->worker != NULL){ g_list_free_full(xorg_application_context->worker, g_object_unref); xorg_application_context->worker = NULL; } /* server status */ if(xorg_application_context->server_status != NULL){ g_object_unref(xorg_application_context->server_status); xorg_application_context->server_status = NULL; } /* server thread */ if(xorg_application_context->server != NULL){ g_list_free_full(xorg_application_context->server, g_object_unref); xorg_application_context->server = NULL; } /* default soundcard */ if(xorg_application_context->default_soundcard != NULL){ g_object_unref(xorg_application_context->default_soundcard); xorg_application_context->default_soundcard = NULL; } /* soundcard and export thread */ if(xorg_application_context->default_soundcard_thread != NULL){ g_object_unref(xorg_application_context->default_soundcard_thread); xorg_application_context->default_soundcard_thread = NULL; } if(xorg_application_context->default_export_thread != NULL){ g_object_unref(xorg_application_context->default_export_thread); xorg_application_context->default_export_thread = NULL; } /* soundcard and sequencer */ if(xorg_application_context->soundcard != NULL){ g_list_free_full(xorg_application_context->soundcard, g_object_unref); xorg_application_context->soundcard = NULL; } if(xorg_application_context->sequencer != NULL){ g_list_free_full(xorg_application_context->sequencer, g_object_unref); xorg_application_context->sequencer = NULL; } /* audio */ if(xorg_application_context->audio != NULL){ g_list_free_full(xorg_application_context->audio, g_object_unref); xorg_application_context->audio = NULL; } /* sound server */ if(xorg_application_context->sound_server != NULL){ g_list_free_full(xorg_application_context->sound_server, g_object_unref); xorg_application_context->sound_server = NULL; } /* osc server */ if(xorg_application_context->osc_server != NULL){ g_list_free_full(xorg_application_context->osc_server, g_object_unref); xorg_application_context->osc_server = NULL; } /* window */ if(xorg_application_context->window != NULL){ gtk_widget_destroy(GTK_WIDGET(xorg_application_context->window)); xorg_application_context->window = NULL; } g_rec_mutex_unlock(application_context_mutex); /* call parent */ G_OBJECT_CLASS(ags_xorg_application_context_parent_class)->dispose(gobject); } void ags_xorg_application_context_finalize(GObject *gobject) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(gobject); /* thread pool */ if(xorg_application_context->thread_pool != NULL){ g_object_unref(xorg_application_context->thread_pool); } /* worker thread */ if(xorg_application_context->worker != NULL){ g_list_free_full(xorg_application_context->worker, g_object_unref); } /* server status */ if(xorg_application_context->server_status != NULL){ g_object_unref(xorg_application_context->server_status); } /* server thread */ if(xorg_application_context->server != NULL){ g_list_free_full(xorg_application_context->server, g_object_unref); } /* default soundcard */ if(xorg_application_context->default_soundcard != NULL){ g_object_unref(xorg_application_context->default_soundcard); } /* soundcard and export thread */ if(xorg_application_context->default_soundcard_thread != NULL){ g_object_unref(xorg_application_context->default_soundcard_thread); } if(xorg_application_context->default_export_thread != NULL){ g_object_unref(xorg_application_context->default_export_thread); } /* soundcard and sequencer */ if(xorg_application_context->soundcard != NULL){ g_list_free_full(xorg_application_context->soundcard, g_object_unref); } if(xorg_application_context->sequencer != NULL){ g_list_free_full(xorg_application_context->sequencer, g_object_unref); } /* audio */ if(xorg_application_context->audio != NULL){ g_list_free_full(xorg_application_context->audio, g_object_unref); } /* sound server */ if(xorg_application_context->sound_server != NULL){ g_list_free_full(xorg_application_context->sound_server, g_object_unref); } /* osc server */ if(xorg_application_context->osc_server != NULL){ g_list_free_full(xorg_application_context->osc_server, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_xorg_application_context_parent_class)->finalize(gobject); } void ags_xorg_application_context_connect(AgsConnectable *connectable) { AgsXorgApplicationContext *xorg_application_context; GList *start_soundcard, *soundcard; GList *start_sequencer, *sequencer; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(connectable); if(ags_application_context_test_flags(AGS_APPLICATION_CONTEXT(xorg_application_context), AGS_APPLICATION_CONTEXT_CONNECTED)){ return; } ags_xorg_application_context_parent_connectable_interface->connect(connectable); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* soundcard */ soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(xorg_application_context)); while(soundcard != NULL){ ags_connectable_connect(AGS_CONNECTABLE(soundcard->data)); soundcard = soundcard->next; } g_list_free_full(start_soundcard, g_object_unref); /* sequencer */ sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(xorg_application_context)); while(sequencer != NULL){ ags_connectable_connect(AGS_CONNECTABLE(sequencer->data)); sequencer = sequencer->next; } g_list_free_full(start_sequencer, g_object_unref); } void ags_xorg_application_context_disconnect(AgsConnectable *connectable) { AgsXorgApplicationContext *xorg_application_context; GList *start_soundcard, *soundcard; GList *start_sequencer, *sequencer; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(connectable); if(!ags_application_context_test_flags(AGS_APPLICATION_CONTEXT(xorg_application_context), AGS_APPLICATION_CONTEXT_CONNECTED)){ return; } ags_xorg_application_context_parent_connectable_interface->disconnect(connectable); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* soundcard */ soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(xorg_application_context)); while(soundcard != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(soundcard->data)); soundcard = soundcard->next; } g_list_free_full(start_soundcard, g_object_unref); /* sequencer */ sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(xorg_application_context->sequencer)); while(sequencer != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(sequencer->data)); sequencer = sequencer->next; } g_list_free_full(start_sequencer, g_object_unref); /* window */ ags_connectable_disconnect(AGS_CONNECTABLE(xorg_application_context->window)); } AgsThread* ags_xorg_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider) { AgsThread *main_loop; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); main_loop = (AgsThread *) application_context->main_loop; if(main_loop != NULL){ g_object_ref(main_loop); } g_rec_mutex_unlock(application_context_mutex); return(main_loop); } void ags_xorg_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->main_loop == main_loop){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); } if(main_loop != NULL){ g_object_ref(main_loop); } application_context->main_loop = (GObject *) main_loop; g_rec_mutex_unlock(application_context_mutex); } AgsTaskLauncher* ags_xorg_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider) { AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); task_launcher = (AgsThread *) application_context->task_launcher; if(task_launcher != NULL){ g_object_ref(task_launcher); } g_rec_mutex_unlock(application_context_mutex); return(task_launcher); } void ags_xorg_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->task_launcher == task_launcher){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); } if(task_launcher != NULL){ g_object_ref(task_launcher); } application_context->task_launcher = (GObject *) task_launcher; g_rec_mutex_unlock(application_context_mutex); } AgsThreadPool* ags_xorg_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider) { AgsThreadPool *thread_pool; AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); thread_pool = xorg_application_context->thread_pool; if(thread_pool != NULL){ g_object_ref(thread_pool); } g_rec_mutex_unlock(application_context_mutex); return(thread_pool); } void ags_xorg_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(xorg_application_context->thread_pool == thread_pool){ g_rec_mutex_unlock(application_context_mutex); return; } if(xorg_application_context->thread_pool != NULL){ g_object_unref(xorg_application_context->thread_pool); } if(thread_pool != NULL){ g_object_ref(thread_pool); } xorg_application_context->thread_pool = (GObject *) thread_pool; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider) { AgsXorgApplicationContext *xorg_application_context; GList *worker; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get worker */ g_rec_mutex_lock(application_context_mutex); worker = g_list_copy_deep(xorg_application_context->worker, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(worker); } void ags_xorg_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* set worker */ g_rec_mutex_lock(application_context_mutex); if(xorg_application_context->worker == worker){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(xorg_application_context->worker, g_object_unref); xorg_application_context->worker = worker; g_rec_mutex_unlock(application_context_mutex); } gboolean ags_xorg_application_context_is_operating(AgsServiceProvider *service_provider) { AgsXorgApplicationContext *xorg_application_context; gboolean is_operating; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get gui ready */ g_rec_mutex_lock(application_context_mutex); is_operating = xorg_application_context->is_operating; g_rec_mutex_unlock(application_context_mutex); return(is_operating); } AgsServerStatus* ags_xorg_application_context_server_status(AgsServiceProvider *service_provider) { AgsServerStatus *server_status; AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); server_status = xorg_application_context->server_status; if(server_status != NULL){ g_object_ref(server_status); } g_rec_mutex_unlock(application_context_mutex); return(server_status); } AgsRegistry* ags_xorg_application_context_get_registry(AgsServiceProvider *service_provider) { AgsRegistry *registry; AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); registry = xorg_application_context->registry; if(registry != NULL){ g_object_ref(registry); } g_rec_mutex_unlock(application_context_mutex); return(registry); } void ags_xorg_application_context_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(xorg_application_context->registry == registry){ g_rec_mutex_unlock(application_context_mutex); return; } if(xorg_application_context->registry != NULL){ g_object_unref(xorg_application_context->registry); } if(registry != NULL){ g_object_ref(registry); } xorg_application_context->registry = (GObject *) registry; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_server(AgsServiceProvider *service_provider) { AgsXorgApplicationContext *xorg_application_context; GList *server; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get server */ g_rec_mutex_lock(application_context_mutex); server = g_list_copy_deep(xorg_application_context->server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(server); } void ags_xorg_application_context_set_server(AgsServiceProvider *service_provider, GList *server) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* set server */ g_rec_mutex_lock(application_context_mutex); if(xorg_application_context->server == server){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(xorg_application_context->server, g_object_unref); xorg_application_context->server = server; g_rec_mutex_unlock(application_context_mutex); } GObject* ags_xorg_application_context_get_default_soundcard_thread(AgsSoundProvider *sound_provider) { GObject *soundcard_thread; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get default soundcard thread */ g_rec_mutex_lock(application_context_mutex); soundcard_thread = (GObject *) AGS_XORG_APPLICATION_CONTEXT(sound_provider)->default_soundcard_thread; if(soundcard_thread != NULL){ g_object_ref(soundcard_thread); } g_rec_mutex_unlock(application_context_mutex); return(soundcard_thread); } void ags_xorg_application_context_set_default_soundcard(AgsSoundProvider *sound_provider, GObject *soundcard) { AgsMessageDelivery *message_delivery; GList *start_message_queue; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set default soundcard */ g_rec_mutex_lock(application_context_mutex); if(AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard == soundcard){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard != NULL){ g_object_unref(AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard = (GObject *) soundcard; g_rec_mutex_unlock(application_context_mutex); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsSoundProvider::set-default-soundcard"); /* add message */ message = ags_message_envelope_new(G_OBJECT(sound_provider), NULL, doc); /* set parameter */ message->n_params = 1; message->parameter_name = (gchar **) malloc(2 * sizeof(gchar *)); message->value = g_new0(GValue, 1); /* audio channels */ message->parameter_name[0] = "default-soundcard"; g_value_init(&(message->value[0]), G_TYPE_OBJECT); g_value_set_object(&(message->value[0]), soundcard); /* terminate string vector */ message->parameter_name[1] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } GObject* ags_xorg_application_context_get_default_soundcard(AgsSoundProvider *sound_provider) { GObject *soundcard; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get default soundcard */ g_rec_mutex_lock(application_context_mutex); soundcard = (GObject *) AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard; if(soundcard != NULL){ g_object_ref(soundcard); } g_rec_mutex_unlock(application_context_mutex); return(soundcard); } void ags_xorg_application_context_set_default_soundcard_thread(AgsSoundProvider *sound_provider, GObject *soundcard_thread) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set default soundcard thread */ g_rec_mutex_lock(application_context_mutex); if(AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard_thread == (AgsThread *) soundcard_thread){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard_thread != NULL){ g_object_unref(AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard_thread); } if(soundcard_thread != NULL){ g_object_ref(soundcard_thread); } AGS_XORG_APPLICATION_CONTEXT(application_context)->default_soundcard_thread = (AgsThread *) soundcard_thread; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_soundcard(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *soundcard; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get soundcard */ g_rec_mutex_lock(application_context_mutex); soundcard = g_list_copy_deep(AGS_XORG_APPLICATION_CONTEXT(application_context)->soundcard, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(soundcard); } void ags_xorg_application_context_set_soundcard(AgsSoundProvider *sound_provider, GList *soundcard) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set soundcard */ g_rec_mutex_lock(application_context_mutex); if(AGS_XORG_APPLICATION_CONTEXT(application_context)->soundcard == soundcard){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_XORG_APPLICATION_CONTEXT(application_context)->soundcard != NULL){ g_list_free(AGS_XORG_APPLICATION_CONTEXT(application_context)->soundcard); } AGS_XORG_APPLICATION_CONTEXT(application_context)->soundcard = soundcard; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_sequencer(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *sequencer; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get sequencer */ g_rec_mutex_lock(application_context_mutex); sequencer = g_list_copy_deep(AGS_XORG_APPLICATION_CONTEXT(application_context)->sequencer, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(sequencer); } void ags_xorg_application_context_set_sequencer(AgsSoundProvider *sound_provider, GList *sequencer) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set sequencer */ g_rec_mutex_lock(application_context_mutex); if(AGS_XORG_APPLICATION_CONTEXT(application_context)->sequencer == sequencer){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_XORG_APPLICATION_CONTEXT(application_context)->sequencer != NULL){ g_list_free(AGS_XORG_APPLICATION_CONTEXT(application_context)->sequencer); } AGS_XORG_APPLICATION_CONTEXT(application_context)->sequencer = sequencer; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_sound_server(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *sound_server; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get sound server */ g_rec_mutex_lock(application_context_mutex); sound_server = g_list_copy_deep(AGS_XORG_APPLICATION_CONTEXT(application_context)->sound_server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(sound_server); } void ags_xorg_application_context_set_sound_server(AgsSoundProvider *concurrency_provider, GList *sound_server) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* set sound_server */ g_rec_mutex_lock(application_context_mutex); if(xorg_application_context->sound_server == sound_server){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(xorg_application_context->sound_server, g_object_unref); xorg_application_context->sound_server = sound_server; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_audio(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *audio; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get audio */ g_rec_mutex_lock(application_context_mutex); audio = g_list_copy_deep(AGS_XORG_APPLICATION_CONTEXT(application_context)->audio, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(audio); } void ags_xorg_application_context_set_audio(AgsSoundProvider *sound_provider, GList *audio) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set audio */ g_rec_mutex_lock(application_context_mutex); if(AGS_XORG_APPLICATION_CONTEXT(application_context)->audio == audio){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_XORG_APPLICATION_CONTEXT(application_context)->audio != NULL){ g_list_free(AGS_XORG_APPLICATION_CONTEXT(application_context)->audio); } AGS_XORG_APPLICATION_CONTEXT(application_context)->audio = audio; g_rec_mutex_unlock(application_context_mutex); } GList* ags_xorg_application_context_get_osc_server(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *osc_server; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get osc_server */ g_rec_mutex_lock(application_context_mutex); osc_server = g_list_copy_deep(AGS_XORG_APPLICATION_CONTEXT(application_context)->osc_server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(osc_server); } void ags_xorg_application_context_set_osc_server(AgsSoundProvider *sound_provider, GList *osc_server) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set osc_server */ g_rec_mutex_lock(application_context_mutex); if(AGS_XORG_APPLICATION_CONTEXT(application_context)->osc_server == osc_server){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_XORG_APPLICATION_CONTEXT(application_context)->osc_server != NULL){ g_list_free(AGS_XORG_APPLICATION_CONTEXT(application_context)->osc_server); } AGS_XORG_APPLICATION_CONTEXT(application_context)->osc_server = osc_server; g_rec_mutex_unlock(application_context_mutex); } gboolean ags_xorg_application_context_get_show_animation(AgsUiProvider *ui_provider) { AgsXorgApplicationContext *xorg_application_context; gboolean show_animation; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get show animation */ g_rec_mutex_lock(application_context_mutex); show_animation = xorg_application_context->show_animation; g_rec_mutex_unlock(application_context_mutex); return(show_animation); } void ags_xorg_application_context_set_show_animation(AgsUiProvider *ui_provider, gboolean show_animation) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* set show animation */ g_rec_mutex_lock(application_context_mutex); xorg_application_context->show_animation = show_animation; g_rec_mutex_unlock(application_context_mutex); } gboolean ags_xorg_application_context_get_gui_ready(AgsUiProvider *ui_provider) { AgsXorgApplicationContext *xorg_application_context; gboolean gui_ready; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get gui ready */ g_rec_mutex_lock(application_context_mutex); gui_ready = xorg_application_context->gui_ready; g_rec_mutex_unlock(application_context_mutex); return(gui_ready); } void ags_xorg_application_context_set_gui_ready(AgsUiProvider *ui_provider, gboolean gui_ready) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* set gui ready */ g_rec_mutex_lock(application_context_mutex); xorg_application_context->gui_ready = gui_ready; g_rec_mutex_unlock(application_context_mutex); } gboolean ags_xorg_application_context_get_file_ready(AgsUiProvider *ui_provider) { AgsXorgApplicationContext *xorg_application_context; gboolean file_ready; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* get file ready */ g_rec_mutex_lock(application_context_mutex); file_ready = xorg_application_context->file_ready; g_rec_mutex_unlock(application_context_mutex); return(file_ready); } void ags_xorg_application_context_set_file_ready(AgsUiProvider *ui_provider, gboolean file_ready) { AgsXorgApplicationContext *xorg_application_context; GRecMutex *application_context_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(xorg_application_context); /* set file ready */ g_rec_mutex_lock(application_context_mutex); xorg_application_context->file_ready = file_ready; g_rec_mutex_unlock(application_context_mutex); } gdouble ags_xorg_application_context_get_gui_scale_factor(AgsUiProvider *ui_provider) { AgsXorgApplicationContext *xorg_application_context; gdouble gui_scale_factor; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get gui scale facotr */ gui_scale_factor = xorg_application_context->gui_scale_factor; return(gui_scale_factor); } void ags_xorg_application_context_set_gui_scale_factor(AgsUiProvider *ui_provider, gdouble gui_scale_factor) { AgsXorgApplicationContext *xorg_application_context; GParamSpec *param_spec; gchar *str; gint default_slider_width; gint default_stepper_size; guint i; GValue *value; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); xorg_application_context->gui_scale_factor = gui_scale_factor; /* horizontal scrollbar */ default_slider_width = 14; default_stepper_size = 14; param_spec = gtk_widget_class_find_style_property(g_type_class_ref(GTK_TYPE_VSCROLLBAR), "slider-width"); value = g_param_spec_get_default_value(param_spec); if(value != NULL){ default_slider_width = g_value_get_int(value); } param_spec = gtk_widget_class_find_style_property(g_type_class_ref(GTK_TYPE_VSCROLLBAR), "stepper-size"); value = g_param_spec_get_default_value(param_spec); if(value != NULL){ default_stepper_size = g_value_get_int(value); } str = g_strdup_printf("style \"ags-default-vscrollbar-style\"\n{\n\tGtkVScrollbar::slider-width = %d\nGtkVScrollbar::stepper-size = %d\n}\n\nwidget_class \"*GtkVScrollbar*\" style \"ags-default-vscrollbar-style\"\n", (gint) (gui_scale_factor * default_slider_width), (gint) (gui_scale_factor * default_stepper_size)); gtk_rc_parse_string(str); g_free(str); /* vertical scrollbar */ default_slider_width = 14; default_stepper_size = 14; param_spec = gtk_widget_class_find_style_property(g_type_class_ref(GTK_TYPE_HSCROLLBAR), "slider-width"); value = g_param_spec_get_default_value(param_spec); if(value != NULL){ default_slider_width = g_value_get_int(value); } param_spec = gtk_widget_class_find_style_property(g_type_class_ref(GTK_TYPE_HSCROLLBAR), "stepper-size"); value = g_param_spec_get_default_value(param_spec); if(value != NULL){ default_stepper_size = g_value_get_int(value); } str = g_strdup_printf("style \"ags-default-hscrollbar-style\"\n{\n\tGtkHScrollbar::slider-width = %d\nGtkHScrollbar::stepper-size = %d\n}\n\nwidget_class \"*GtkHScrollbar*\" style \"ags-default-hscrollbar-style\"\n", (gint) (gui_scale_factor * default_slider_width), (gint) (gui_scale_factor * default_stepper_size)); gtk_rc_parse_string(str); g_free(str); /* horizontal scale */ default_slider_width = 14; param_spec = gtk_widget_class_find_style_property(g_type_class_ref(GTK_TYPE_HSCALE), "slider-width"); value = g_param_spec_get_default_value(param_spec); if(value != NULL){ default_slider_width = g_value_get_int(value); } str = g_strdup_printf("style \"ags-default-vscale-style\"\n{\n\tGtkVScale::slider-width = %d\n}\n\nwidget_class \"**\" style \"ags-default-vscale-style\"\n", (gint) (gui_scale_factor * default_slider_width)); gtk_rc_parse_string(str); g_free(str); /* vertical scale */ default_slider_width = 14; param_spec = gtk_widget_class_find_style_property(g_type_class_ref(GTK_TYPE_VSCALE), "slider-width"); value = g_param_spec_get_default_value(param_spec); if(value != NULL){ default_slider_width = g_value_get_int(value); } str = g_strdup_printf("style \"ags-default-hscale-style\"\n{\n\tGtkHScale::slider-width = %d\n}\n\nwidget_class \"**\" style \"ags-default-hscale-style\"\n", (gint) (gui_scale_factor * default_slider_width)); gtk_rc_parse_string(str); g_free(str); } void ags_xorg_application_context_schedule_task(AgsUiProvider *ui_provider, AgsTask *task) { AgsXorgApplicationContext *xorg_application_context; AgsTaskLauncher *task_launcher; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(xorg_application_context)); if(!AGS_IS_TASK_LAUNCHER(task_launcher) || !AGS_IS_TASK(task)){ return; } xorg_application_context->task = g_list_prepend(xorg_application_context->task, task); /* unref */ g_object_unref(task_launcher); } void ags_xorg_application_context_schedule_task_all(AgsUiProvider *ui_provider, GList *task) { AgsXorgApplicationContext *xorg_application_context; AgsTaskLauncher *task_launcher; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(xorg_application_context)); if(!AGS_IS_TASK_LAUNCHER(task_launcher) || task == NULL){ return; } if(xorg_application_context->task != NULL){ xorg_application_context->task = g_list_concat(g_list_reverse(task), xorg_application_context->task); }else{ xorg_application_context->task = g_list_reverse(task); } /* unref */ g_object_unref(task_launcher); } void ags_xorg_application_context_clean_message(AgsUiProvider *ui_provider) { AgsXorgApplicationContext *xorg_application_context; AgsMessageDelivery *message_delivery; GList *start_message_queue, *message_queue; GList *start_message_envelope, *message_envelope; GRecMutex *message_queue_mutex; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); message_delivery = ags_message_delivery_get_instance(); message_queue = start_message_queue = ags_message_delivery_find_recipient_namespace(message_delivery, "libgsequencer"); while(message_queue != NULL){ message_queue_mutex = AGS_MESSAGE_QUEUE_GET_OBJ_MUTEX(message_queue->data); g_rec_mutex_lock(message_queue_mutex); message_envelope = start_message_envelope = g_list_copy_deep(AGS_MESSAGE_QUEUE(message_queue->data)->message_envelope, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(message_queue_mutex); while(message_envelope != NULL){ ags_message_queue_remove_message_envelope(message_queue->data, message_envelope->data); /* iterate */ message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, g_object_unref); /* iterate */ message_queue = message_queue->next; } g_list_free_full(start_message_queue, g_object_unref); } GtkWidget* ags_xorg_application_context_get_animation_window(AgsUiProvider *ui_provider) { GtkWidget *animation_window; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get animation window */ animation_window = xorg_application_context->animation_window; return(animation_window); } void ags_xorg_application_context_set_animation_window(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set animation window */ xorg_application_context->animation_window = widget; } GtkWidget* ags_xorg_application_context_get_window(AgsUiProvider *ui_provider) { GtkWidget *window; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get window */ window = xorg_application_context->window; return(window); } void ags_xorg_application_context_set_window(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_APPLICATION_CONTEXT(ui_provider); /* set window */ xorg_application_context->window = (AgsWindow *) widget; } GtkWidget* ags_xorg_application_context_get_automation_window(AgsUiProvider *ui_provider) { GtkWidget *automation_window; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get automation window */ automation_window = xorg_application_context->automation_window; return(automation_window); } void ags_xorg_application_context_set_automation_window(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set automation window */ xorg_application_context->automation_window = widget; } GtkWidget* ags_xorg_application_context_get_wave_window(AgsUiProvider *ui_provider) { GtkWidget *wave_window; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get wave window */ wave_window = xorg_application_context->wave_window; return(wave_window); } void ags_xorg_application_context_set_wave_window(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set wave window */ xorg_application_context->wave_window = widget; } GtkWidget* ags_xorg_application_context_get_sheet_window(AgsUiProvider *ui_provider) { GtkWidget *sheet_window; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get sheet window */ sheet_window = xorg_application_context->sheet_window; return(sheet_window); } void ags_xorg_application_context_set_sheet_window(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set sheet window */ xorg_application_context->sheet_window = widget; } GtkWidget* ags_xorg_application_context_get_export_window(AgsUiProvider *ui_provider) { GtkWidget *export_window; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get export window */ export_window = xorg_application_context->export_window; return(export_window); } void ags_xorg_application_context_set_export_window(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set export window */ xorg_application_context->export_window = widget; } GtkWidget* ags_xorg_application_context_get_preferences(AgsUiProvider *ui_provider) { GtkWidget *preferences; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get preferences */ preferences = xorg_application_context->preferences; return(preferences); } void ags_xorg_application_context_set_preferences(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set preferences */ xorg_application_context->preferences = widget; } GtkWidget* ags_xorg_application_context_get_history_browser(AgsUiProvider *ui_provider) { GtkWidget *history_browser; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get history browser */ history_browser = xorg_application_context->history_browser; return(history_browser); } void ags_xorg_application_context_set_history_browser(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set history browser */ xorg_application_context->history_browser = widget; } GtkWidget* ags_xorg_application_context_get_midi_browser(AgsUiProvider *ui_provider) { GtkWidget *midi_browser; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get midi browser */ midi_browser = xorg_application_context->midi_browser; return(midi_browser); } void ags_xorg_application_context_set_midi_browser(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set midi browser */ xorg_application_context->midi_browser = widget; } GtkWidget* ags_xorg_application_context_get_sample_browser(AgsUiProvider *ui_provider) { GtkWidget *sample_browser; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get sample browser */ sample_browser = xorg_application_context->sample_browser; return(sample_browser); } void ags_xorg_application_context_set_sample_browser(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set sample browser */ xorg_application_context->sample_browser = widget; } GtkWidget* ags_xorg_application_context_get_midi_import_wizard(AgsUiProvider *ui_provider) { GtkWidget *midi_import_wizard; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get midi import wizard */ midi_import_wizard = xorg_application_context->midi_import_wizard; return(midi_import_wizard); } void ags_xorg_application_context_set_midi_import_wizard(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set midi import wizard */ xorg_application_context->midi_import_wizard = widget; } GtkWidget* ags_xorg_application_context_get_midi_export_wizard(AgsUiProvider *ui_provider) { GtkWidget *midi_export_wizard; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get midi export wizard */ midi_export_wizard = xorg_application_context->midi_export_wizard; return(midi_export_wizard); } void ags_xorg_application_context_set_midi_export_wizard(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set midi export wizard */ xorg_application_context->midi_export_wizard = widget; } GList* ags_xorg_application_context_get_machine(AgsUiProvider *ui_provider) { GList *machine; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get machine */ machine = g_list_copy(xorg_application_context->machine); return(machine); } void ags_xorg_application_context_set_machine(AgsUiProvider *ui_provider, GList *machine) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set machine */ g_list_free(xorg_application_context->machine); xorg_application_context->machine = machine; } GtkWidget* ags_xorg_application_context_get_composite_editor(AgsUiProvider *ui_provider) { GtkWidget *composite_editor; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get composite editor */ composite_editor = xorg_application_context->composite_editor; return(composite_editor); } void ags_xorg_application_context_set_composite_editor(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set composite editor */ xorg_application_context->composite_editor = widget; } GtkWidget* ags_xorg_application_context_get_navigation(AgsUiProvider *ui_provider) { GtkWidget *navigation; AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* get navigation */ navigation = xorg_application_context->navigation; return(navigation); } void ags_xorg_application_context_set_navigation(AgsUiProvider *ui_provider, GtkWidget *widget) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = AGS_XORG_APPLICATION_CONTEXT(ui_provider); /* set navigation */ xorg_application_context->navigation = widget; } void ags_xorg_application_context_prepare(AgsApplicationContext *application_context) { AgsXorgApplicationContext *xorg_application_context; GtkWidget *widget; AgsWindow *window; #ifdef AGS_WITH_QUARTZ GtkosxApplication *app; #endif AgsThread *audio_loop; AgsTaskLauncher *task_launcher; AgsMessageDelivery *message_delivery; AgsMessageQueue *message_queue; AgsMessageQueue *audio_message_queue; GMainContext *server_main_context; GMainContext *audio_main_context; GMainContext *osc_server_main_context; GMainLoop *main_loop; GThread *main_loop_thread; GList *start_queue; gchar *filename; guint i; xorg_application_context = (AgsXorgApplicationContext *) application_context; /* check filename */ filename = NULL; for(i = 0; i < AGS_APPLICATION_CONTEXT(xorg_application_context)->argc; i++){ if(!strncmp(AGS_APPLICATION_CONTEXT(xorg_application_context)->argv[i], "--filename", 11) && i + 1 < AGS_APPLICATION_CONTEXT(xorg_application_context)->argc && AGS_APPLICATION_CONTEXT(xorg_application_context)->argv[i + 1] != NULL){ filename = AGS_APPLICATION_CONTEXT(xorg_application_context)->argv[i + 1]; break; } } /* call parent */ // AGS_APPLICATION_CONTEXT_CLASS(ags_xorg_application_context_parent_class)->prepare(application_context); /* register types */ ags_application_context_register_types(application_context); /* * fundamental thread setup */ /* server main context and main loop */ server_main_context = g_main_context_new(); g_main_context_ref(server_main_context); xorg_application_context->server_main_context = server_main_context; main_loop = g_main_loop_new(server_main_context, TRUE); g_thread_new("Advanced Gtk+ Sequencer - server main loop", ags_xorg_application_context_server_main_loop_thread, main_loop); /* audio main context and main loop */ audio_main_context = g_main_context_new(); g_main_context_ref(audio_main_context); xorg_application_context->audio_main_context = audio_main_context; main_loop = g_main_loop_new(audio_main_context, TRUE); g_thread_new("Advanced Gtk+ Sequencer - audio main loop", ags_xorg_application_context_audio_main_loop_thread, main_loop); /* message delivery */ message_delivery = ags_message_delivery_get_instance(); message_queue = ags_message_queue_new("libags"); g_object_set(message_queue, "recipient-namespace", "libgsequencer", NULL); ags_message_delivery_add_message_queue(message_delivery, (GObject *) message_queue); audio_message_queue = ags_message_queue_new("libags-audio"); g_object_set(audio_message_queue, "recipient-namespace", "libgsequencer", NULL); ags_message_delivery_add_message_queue(message_delivery, (GObject *) audio_message_queue); /* OSC server main context and main loop */ osc_server_main_context = g_main_context_new(); g_main_context_ref(osc_server_main_context); xorg_application_context->osc_server_main_context = osc_server_main_context; g_main_loop_new(osc_server_main_context, TRUE); /* AgsAudioLoop */ audio_loop = (AgsThread *) ags_audio_loop_new(); g_object_ref(audio_loop); application_context->main_loop = (GObject *) audio_loop; ags_connectable_connect(AGS_CONNECTABLE(audio_loop)); /* AgsTaskLauncher */ task_launcher = ags_task_launcher_new(); g_object_ref(task_launcher); application_context->task_launcher = (GObject *) task_launcher; ags_connectable_connect(AGS_CONNECTABLE(task_launcher)); ags_task_launcher_attach(task_launcher, audio_main_context); /* start audio loop and thread pool*/ ags_thread_start(audio_loop); /* wait for audio loop */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(audio_loop)); if(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT)){ ags_thread_unset_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE); while(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(AGS_THREAD_GET_START_COND(audio_loop), AGS_THREAD_GET_START_MUTEX(audio_loop)); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(audio_loop)); /* start gui */ g_timeout_add((guint) (AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0), (GSourceFunc) ags_xorg_application_context_message_monitor_timeout, (gpointer) xorg_application_context); g_timeout_add((guint) (AGS_UI_PROVIDER_DEFAULT_TIMEOUT * 1000.0), (GSourceFunc) ags_xorg_application_context_task_timeout, (gpointer) xorg_application_context); /* show animation */ ags_ui_provider_set_gui_ready(AGS_UI_PROVIDER(application_context), TRUE); widget = ags_animation_window_new(); ags_ui_provider_set_animation_window(AGS_UI_PROVIDER(application_context), widget); gtk_widget_show(widget); /* AgsWindow */ window = xorg_application_context->window = g_object_new(AGS_TYPE_WINDOW, NULL); #ifdef AGS_WITH_QUARTZ app = gtkosx_application_get(); gtk_widget_hide((GtkWidget *) window->menu_bar); gtkosx_application_set_menu_bar(app, window->menu_bar); gtkosx_application_ready(app); #endif gtk_window_set_default_size((GtkWindow *) window, 500, 500); gtk_paned_set_position((GtkPaned *) window->paned, 300); if(filename != NULL){ window->filename = filename; } /* gtk main */ gtk_main(); } void ags_xorg_application_context_setup(AgsApplicationContext *application_context) { AgsXorgApplicationContext *xorg_application_context; GObject *soundcard; GObject *sequencer; AgsJackServer *jack_server; AgsPulseServer *pulse_server; AgsCoreAudioServer *core_audio_server; AgsOscServer *osc_server; AgsLadspaManager *ladspa_manager; AgsDssiManager *dssi_manager; AgsLv2Manager *lv2_manager; AgsLv2uiManager *lv2ui_manager; AgsLv2WorkerManager *lv2_worker_manager; AgsServer *server; AgsThread *main_loop; AgsThread *soundcard_thread; AgsThread *export_thread; AgsThread *sequencer_thread; AgsDestroyWorker *destroy_worker; AgsTaskLauncher *task_launcher; AgsLog *log; AgsConfig *config; GList *list; #ifndef AGS_W32API struct passwd *pw; uid_t uid; #endif gchar *blacklist_path; gchar *blacklist_filename; gchar *filename; gchar *server_group; gchar *soundcard_group; gchar *sequencer_group; gchar *osc_server_group; gchar *str; gchar *capability; #if defined AGS_W32API gchar *app_dir; #endif guint i, j; gboolean has_core_audio; gboolean has_pulse; gboolean has_jack; gboolean is_output; xorg_application_context = (AgsXorgApplicationContext *) application_context; while(!ags_ui_provider_get_gui_ready(AGS_UI_PROVIDER(application_context))){ usleep(4); } /* call parent */ // AGS_APPLICATION_CONTEXT_CLASS(ags_xorg_application_context_parent_class)->setup(application_context); /* config and log */ config = ags_config_get_instance(); log = ags_log_get_instance(); /* main loop and task launcher */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); /* signals */ atexit(ags_xorg_application_context_signal_cleanup); /* Ignore interactive and job-control signals. */ #ifndef AGS_W32API signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGCHLD, SIG_IGN); #ifndef AGS_W32API ags_sigact.sa_handler = ags_xorg_application_context_signal_handler; sigemptyset(&ags_sigact.sa_mask); ags_sigact.sa_flags = 0; sigaction(SIGINT, &ags_sigact, (struct sigaction *) NULL); sigaction(SA_RESTART, &ags_sigact, (struct sigaction *) NULL); #endif #endif /* check filename */ filename = NULL; for(i = 0; i < AGS_APPLICATION_CONTEXT(xorg_application_context)->argc; i++){ if(!strncmp(AGS_APPLICATION_CONTEXT(xorg_application_context)->argv[i], "--filename", 11) && i + 1 < AGS_APPLICATION_CONTEXT(xorg_application_context)->argc && AGS_APPLICATION_CONTEXT(xorg_application_context)->argv[i + 1] != NULL){ AgsSimpleFile *simple_file; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlChar *xpath; gchar *buffer; guint buffer_length; filename = AGS_APPLICATION_CONTEXT(xorg_application_context)->argv[i + 1]; if(!g_file_test(filename, G_FILE_TEST_EXISTS) || !g_file_test(filename, G_FILE_TEST_IS_REGULAR)){ i += 2; break; } simple_file = ags_simple_file_new(); g_object_set(simple_file, "filename", filename, NULL); ags_simple_file_open(simple_file, NULL); str = g_strdup_printf("* Read config from file: %s", filename); ags_log_add_message(log, str); xpath = "/ags-simple-file/ags-sf-config"; /* Create xpath evaluation context */ xpath_context = xmlXPathNewContext(simple_file->doc); if(xpath_context == NULL) { g_warning("Error: unable to create new XPath context"); break; } /* Evaluate xpath expression */ xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object == NULL) { g_warning("Error: unable to evaluate xpath expression \"%s\"", xpath); xmlXPathFreeContext(xpath_context); break; } node = xpath_object->nodesetval->nodeTab; buffer = NULL; for(j = 0; j < xpath_object->nodesetval->nodeNr; j++){ if(node[j]->type == XML_ELEMENT_NODE){ ags_config_clear(config); ags_simple_file_read_config(simple_file, node[j], &config); #if 0 buffer = xmlNodeGetContent(node[j]); buffer_length = strlen(buffer); #endif break; } } #if 0 if(buffer != NULL){ // ags_config_clear(ags_config_get_instance()); ags_config_load_from_data(ags_config_get_instance(), buffer, buffer_length); } #endif i++; break; } } /* get user information */ #if defined AGS_W32API application_context = ags_application_context_get_instance(); if(strlen(application_context->argv[0]) > strlen("gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("gsequencer.exe")); }else{ app_dir = NULL; } blacklist_path = g_strdup_printf("%s\\%s", g_get_current_dir(), app_dir); g_free(app_dir); #else uid = getuid(); pw = getpwuid(uid); blacklist_path = g_strdup_printf("%s/%s", pw->pw_dir, AGS_DEFAULT_DIRECTORY); #endif /* load ladspa manager */ ladspa_manager = ags_ladspa_manager_get_instance(); blacklist_filename = g_strdup_printf("%s%c%s", blacklist_path, G_DIR_SEPARATOR, "ladspa_plugin.blacklist"); ags_ladspa_manager_load_blacklist(ladspa_manager, blacklist_filename); ags_log_add_message(log, "* Loading LADSPA plugins"); ags_ladspa_manager_load_default_directory(ladspa_manager); /* load dssi manager */ dssi_manager = ags_dssi_manager_get_instance(); blacklist_filename = g_strdup_printf("%s%c%s", blacklist_path, G_DIR_SEPARATOR, "dssi_plugin.blacklist"); ags_dssi_manager_load_blacklist(dssi_manager, blacklist_filename); ags_log_add_message(log, "* Loading DSSI plugins"); ags_dssi_manager_load_default_directory(dssi_manager); /* load lv2 manager */ lv2_manager = ags_lv2_manager_get_instance(); lv2_worker_manager = ags_lv2_worker_manager_get_instance(); blacklist_filename = g_strdup_printf("%s%c%s", blacklist_path, G_DIR_SEPARATOR, "lv2_plugin.blacklist"); ags_lv2_manager_load_blacklist(lv2_manager, blacklist_filename); ags_log_add_message(log, "* Loading Lv2 plugins"); ags_lv2_manager_load_default_directory(lv2_manager); /* load lv2ui manager */ lv2ui_manager = ags_lv2ui_manager_get_instance(); blacklist_filename = g_strdup_printf("%s/lv2ui_plugin.blacklist", blacklist_path); ags_lv2ui_manager_load_blacklist(lv2ui_manager, blacklist_filename); ags_log_add_message(log, "* Loading Lv2ui plugins"); ags_lv2ui_manager_load_default_directory(lv2ui_manager); /* launch GUI */ ags_log_add_message(log, "* Launch user interface"); /* sound server */ xorg_application_context->sound_server = NULL; /* core audio server */ core_audio_server = ags_core_audio_server_new(NULL); xorg_application_context->sound_server = g_list_append(xorg_application_context->sound_server, core_audio_server); g_object_ref(G_OBJECT(core_audio_server)); has_core_audio = FALSE; /* pulse server */ pulse_server = ags_pulse_server_new(NULL); xorg_application_context->sound_server = g_list_append(xorg_application_context->sound_server, pulse_server); g_object_ref(G_OBJECT(pulse_server)); has_pulse = FALSE; /* jack server */ jack_server = ags_jack_server_new(NULL); xorg_application_context->sound_server = g_list_append(xorg_application_context->sound_server, jack_server); g_object_ref(G_OBJECT(jack_server)); has_jack = FALSE; /* AgsSoundcard */ xorg_application_context->soundcard = NULL; soundcard = NULL; soundcard_group = g_strdup("soundcard"); for(i = 0; ; i++){ guint pcm_channels, buffer_size, samplerate, format; guint cache_buffer_size; gboolean use_cache; if(!g_key_file_has_group(config->key_file, soundcard_group)){ if(i == 0){ g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; }else{ break; } } str = ags_config_get_value(config, soundcard_group, "backend"); capability = ags_config_get_value(config, soundcard_group, "capability"); is_output = TRUE; if(capability != NULL && !g_ascii_strncasecmp(capability, "capture", 8)){ is_output = FALSE; } /* change soundcard */ if(str != NULL){ if(!g_ascii_strncasecmp(str, "core-audio", 11)){ soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(core_audio_server), is_output); has_core_audio = TRUE; }else if(!g_ascii_strncasecmp(str, "pulse", 6)){ soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(pulse_server), is_output); has_pulse = TRUE; }else if(!g_ascii_strncasecmp(str, "jack", 5)){ if(!is_output){ AgsJackClient *input_client; g_object_get(jack_server, "input-jack-client", &input_client, NULL); if(input_client == NULL){ input_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "input-jack-client", input_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) input_client); ags_jack_client_open((AgsJackClient *) input_client, "ags-input-client"); }else{ g_object_unref(input_client); } } soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(jack_server), is_output); has_jack = TRUE; }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ if(is_output){ soundcard = (GObject *) ags_devout_new((GObject *) xorg_application_context); AGS_DEVOUT(soundcard)->flags &= (~AGS_DEVOUT_OSS); AGS_DEVOUT(soundcard)->flags |= AGS_DEVOUT_ALSA; }else{ soundcard = (GObject *) ags_devin_new((GObject *) xorg_application_context); AGS_DEVIN(soundcard)->flags &= (~AGS_DEVIN_OSS); AGS_DEVIN(soundcard)->flags |= AGS_DEVIN_ALSA; } }else if(!g_ascii_strncasecmp(str, "wasapi", 7)){ gchar *str; if(is_output){ soundcard = (GObject *) ags_wasapi_devout_new((GObject *) xorg_application_context); str = ags_config_get_value(config, soundcard_group, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ ags_wasapi_devout_set_flags(AGS_WASAPI_DEVOUT(soundcard), AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE); }else{ ags_wasapi_devout_unset_flags(AGS_WASAPI_DEVOUT(soundcard), AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE); } g_free(str); str = ags_config_get_value(config, soundcard_group, "wasapi-buffer-size"); if(str != NULL){ AGS_WASAPI_DEVOUT(soundcard)->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } }else{ soundcard = (GObject *) ags_wasapi_devin_new((GObject *) xorg_application_context); str = ags_config_get_value(config, soundcard_group, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ ags_wasapi_devin_set_flags(AGS_WASAPI_DEVIN(soundcard), AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE); }else{ ags_wasapi_devin_unset_flags(AGS_WASAPI_DEVIN(soundcard), AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE); } g_free(str); str = ags_config_get_value(config, soundcard_group, "wasapi-buffer-size"); if(str != NULL){ AGS_WASAPI_DEVIN(soundcard)->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } } }else if(!g_ascii_strncasecmp(str, "oss", 4)){ if(is_output){ soundcard = (GObject *) ags_devout_new((GObject *) xorg_application_context); AGS_DEVOUT(soundcard)->flags &= (~AGS_DEVOUT_ALSA); AGS_DEVOUT(soundcard)->flags |= AGS_DEVOUT_OSS; }else{ soundcard = (GObject *) ags_devin_new((GObject *) xorg_application_context); AGS_DEVIN(soundcard)->flags &= (~AGS_DEVIN_ALSA); AGS_DEVIN(soundcard)->flags |= AGS_DEVIN_OSS; } }else{ g_warning(i18n("unknown soundcard backend - %s"), str); g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; } }else{ g_warning(i18n("unknown soundcard backend - NULL")); g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; } xorg_application_context->soundcard = g_list_append(xorg_application_context->soundcard, soundcard); g_object_ref(soundcard); /* device */ str = ags_config_get_value(config, soundcard_group, "device"); if(str != NULL){ ags_soundcard_set_device(AGS_SOUNDCARD(soundcard), str); g_free(str); } /* presets */ pcm_channels = AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS; buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; format = AGS_SOUNDCARD_DEFAULT_FORMAT; str = ags_config_get_value(config, soundcard_group, "pcm-channels"); if(str != NULL){ pcm_channels = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "buffer-size"); if(str != NULL){ buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "samplerate"); if(str != NULL){ samplerate = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "format"); if(str != NULL){ format = g_ascii_strtoull(str, NULL, 10); g_free(str); } ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), pcm_channels, samplerate, buffer_size, format); use_cache = TRUE; str = ags_config_get_value(config, soundcard_group, "use-cache"); if(str != NULL && !g_strncasecmp(str, "false", 5)){ use_cache = FALSE; } cache_buffer_size = 4096; str = ags_config_get_value(config, soundcard_group, "cache-buffer-size"); if(str != NULL){ cache_buffer_size = g_ascii_strtoull(str, NULL, 10); } if(AGS_IS_PULSE_DEVOUT(soundcard)){ GList *start_port, *port; g_object_get(soundcard, "pulse-port", &start_port, NULL); port = start_port; while(port != NULL){ ags_pulse_port_set_samplerate(port->data, samplerate); ags_pulse_port_set_pcm_channels(port->data, pcm_channels); ags_pulse_port_set_buffer_size(port->data, buffer_size); ags_pulse_port_set_format(port->data, format); ags_pulse_port_set_cache_buffer_size(port->data, buffer_size * ceil(cache_buffer_size / buffer_size)); port = port->next; } g_list_free_full(start_port, g_object_unref); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ GList *start_port, *port; g_object_get(soundcard, "core_audio-port", &start_port, NULL); port = start_port; while(port != NULL){ ags_core_audio_port_set_samplerate(port->data, samplerate); ags_core_audio_port_set_pcm_channels(port->data, pcm_channels); ags_core_audio_port_set_buffer_size(port->data, buffer_size); ags_core_audio_port_set_format(port->data, format); ags_core_audio_port_set_cache_buffer_size(port->data, buffer_size * ceil(cache_buffer_size / buffer_size)); port = port->next; } g_list_free_full(start_port, g_object_unref); } g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); } if(xorg_application_context->soundcard != NULL){ soundcard = xorg_application_context->soundcard->data; } g_free(soundcard_group); ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(xorg_application_context), soundcard); /* AgsSequencer */ xorg_application_context->sequencer = NULL; sequencer = NULL; sequencer_group = g_strdup("sequencer"); for(i = 0; ; i++){ guint pcm_channels, buffer_size, samplerate, format; if(!g_key_file_has_group(config->key_file, sequencer_group)){ if(i == 0){ g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; }else{ break; } } str = ags_config_get_value(config, sequencer_group, "backend"); /* change sequencer */ if(str != NULL){ if(!g_ascii_strncasecmp(str, "jack", 5)){ AgsJackClient *input_client; g_object_get(jack_server, "input-jack-client", &input_client, NULL); if(input_client == NULL){ input_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "input-jack-client", input_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) input_client); ags_jack_client_open((AgsJackClient *) input_client, "ags-input-client"); }else{ g_object_unref(input_client); } sequencer = ags_sound_server_register_sequencer(AGS_SOUND_SERVER(jack_server), FALSE); has_jack = TRUE; }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ sequencer = (GObject *) ags_midiin_new((GObject *) xorg_application_context); AGS_MIDIIN(sequencer)->flags &= (~AGS_MIDIIN_OSS); AGS_MIDIIN(sequencer)->flags |= AGS_MIDIIN_ALSA; }else if(!g_ascii_strncasecmp(str, "oss", 4)){ sequencer = (GObject *) ags_midiin_new((GObject *) xorg_application_context); AGS_MIDIIN(sequencer)->flags &= (~AGS_MIDIIN_ALSA); AGS_MIDIIN(sequencer)->flags |= AGS_MIDIIN_OSS; }else{ g_warning(i18n("unknown sequencer backend - %s"), str); g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; } }else{ g_warning(i18n("unknown sequencer backend - NULL")); g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; } xorg_application_context->sequencer = g_list_append(xorg_application_context->sequencer, sequencer); g_object_ref(sequencer); /* device */ str = ags_config_get_value(config, sequencer_group, "device"); if(str != NULL){ ags_sequencer_set_device(AGS_SEQUENCER(sequencer), str); g_free(str); } g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); } g_free(sequencer_group); /* AgsServer */ xorg_application_context->server = NULL; server = NULL; server_group = g_strdup("server"); for(i = 0; ; i++){ gchar *ip4, *ip6; guint server_port; gboolean auto_start; gboolean any_address; gboolean enable_ip4, enable_ip6; if(!g_key_file_has_group(config->key_file, server_group)){ if(i == 0){ g_free(server_group); server_group = g_strdup_printf("%s-%d", AGS_CONFIG_SERVER, i); continue; }else{ break; } } server = ags_server_new(); xorg_application_context->server = g_list_append(xorg_application_context->server, server); g_object_ref(server); /* realm */ str = ags_config_get_value(config, server_group, "realm"); if(str != NULL){ g_object_set(server, "realm", str, NULL); g_free(str); } /* any address */ any_address = FALSE; str = ags_config_get_value(config, server_group, "any-address"); if(str != NULL){ any_address = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(any_address){ ags_server_set_flags(server, (AGS_SERVER_ANY_ADDRESS)); } /* enable ip4 and ip6 */ enable_ip4 = FALSE; enable_ip6 = FALSE; str = ags_config_get_value(config, server_group, "enable-ip4"); if(str != NULL){ enable_ip4 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } str = ags_config_get_value(config, server_group, "enable-ip6"); if(str != NULL){ enable_ip6 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(enable_ip4){ ags_server_set_flags(server, (AGS_SERVER_INET4)); } if(enable_ip6){ ags_server_set_flags(server, (AGS_SERVER_INET6)); } /* ip4 and ip6 address */ str = ags_config_get_value(config, server_group, "ip4-address"); if(str != NULL){ g_object_set(server, "ip4", str, NULL); g_free(str); } str = ags_config_get_value(config, server_group, "ip6-address"); if(str != NULL){ g_object_set(server, "ip6", str, NULL); g_free(str); } /* server port */ str = ags_config_get_value(config, server_group, "server-port"); if(str != NULL){ server_port = (guint) g_ascii_strtoull(str, NULL, 10); g_object_set(server, "server-port", server_port, NULL); } /* auto-start */ auto_start = FALSE; str = ags_config_get_value(config, server_group, "auto-start"); if(str != NULL){ auto_start = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(auto_start){ ags_server_set_flags(server, AGS_SERVER_AUTO_START); } g_free(server_group); server_group = g_strdup_printf("%s-%d", AGS_CONFIG_SERVER, i); } if(server == NULL){ server = ags_server_new(); ags_server_set_flags(server, (AGS_SERVER_INET4)); xorg_application_context->server = g_list_append(xorg_application_context->server, server); g_object_ref(server); } /* AgsSoundcardThread and AgsExportThread */ xorg_application_context->default_soundcard_thread = NULL; list = xorg_application_context->soundcard; while(list != NULL){ guint soundcard_capability; soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(list->data)); soundcard_thread = (AgsThread *) ags_soundcard_thread_new(list->data, soundcard_capability); ags_thread_add_child_extended(main_loop, soundcard_thread, TRUE, TRUE); /* export thread */ export_thread = NULL; /* export thread */ if(AGS_IS_DEVOUT(list->data) || AGS_IS_WASAPI_DEVOUT(list->data) || AGS_IS_JACK_DEVOUT(list->data) || AGS_IS_PULSE_DEVOUT(list->data) || AGS_IS_CORE_AUDIO_DEVOUT(list->data)){ export_thread = (AgsThread *) ags_export_thread_new(list->data, NULL); ags_thread_add_child_extended(main_loop, (AgsThread *) export_thread, TRUE, TRUE); } /* default soundcard thread */ if(xorg_application_context->default_soundcard_thread == NULL){ ags_sound_provider_set_default_soundcard_thread(AGS_SOUND_PROVIDER(xorg_application_context), (GObject *) soundcard_thread); } /* default export thread */ if(export_thread != NULL){ if(xorg_application_context->default_export_thread == NULL){ xorg_application_context->default_export_thread = export_thread; }else{ g_object_unref(export_thread); } } /* iterate */ list = list->next; } /* AgsSequencerThread */ list = xorg_application_context->sequencer; while(list != NULL){ sequencer_thread = (AgsThread *) ags_sequencer_thread_new(list->data); ags_thread_add_child_extended(main_loop, (AgsThread *) sequencer_thread, TRUE, TRUE); list = list->next; } /* AgsOscServer */ xorg_application_context->osc_server = NULL; osc_server = NULL; osc_server_group = g_strdup("osc-server"); for(i = 0; ; i++){ gchar *ip4, *ip6; guint server_port; gboolean auto_start; gboolean any_address; gboolean enable_ip4, enable_ip6; if(!g_key_file_has_group(config->key_file, osc_server_group)){ if(i == 0){ g_free(osc_server_group); osc_server_group = g_strdup_printf("%s-%d", AGS_CONFIG_OSC_SERVER, i); continue; }else{ break; } } osc_server = ags_osc_server_new(); ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_TCP)); xorg_application_context->osc_server = g_list_append(xorg_application_context->osc_server, osc_server); g_object_ref(osc_server); /* any address */ any_address = FALSE; str = ags_config_get_value(config, osc_server_group, "any-address"); if(str != NULL){ any_address = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(any_address){ ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_ANY_ADDRESS)); } /* enable ip4 and ip6 */ enable_ip4 = FALSE; enable_ip6 = FALSE; str = ags_config_get_value(config, osc_server_group, "enable-ip4"); if(str != NULL){ enable_ip4 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } str = ags_config_get_value(config, osc_server_group, "enable-ip6"); if(str != NULL){ enable_ip6 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(enable_ip4){ ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET4)); } if(enable_ip6){ ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET6)); } ags_osc_server_add_default_controller(osc_server); /* ip4 and ip6 address */ str = ags_config_get_value(config, osc_server_group, "ip4-address"); if(str != NULL){ g_object_set(osc_server, "ip4", str, NULL); g_free(str); } str = ags_config_get_value(config, osc_server_group, "ip6-address"); if(str != NULL){ g_object_set(osc_server, "ip6", str, NULL); g_free(str); } /* server port */ str = ags_config_get_value(config, osc_server_group, "server-port"); if(str != NULL){ server_port = (guint) g_ascii_strtoull(str, NULL, 10); g_object_set(osc_server, "server-port", server_port, NULL); } /* auto-start */ auto_start = FALSE; str = ags_config_get_value(config, osc_server_group, "auto-start"); if(str != NULL){ auto_start = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(auto_start){ ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_AUTO_START); } g_free(osc_server_group); osc_server_group = g_strdup_printf("%s-%d", AGS_CONFIG_OSC_SERVER, i); } if(osc_server == NULL){ osc_server = ags_osc_server_new(); ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET4 | AGS_OSC_SERVER_TCP)); ags_osc_server_add_default_controller(osc_server); xorg_application_context->osc_server = g_list_append(xorg_application_context->osc_server, osc_server); g_object_ref(osc_server); } /* AgsWorkerThread */ xorg_application_context->worker = NULL; /* AgsDestroyWorker */ destroy_worker = ags_destroy_worker_get_instance(); ags_thread_add_child_extended(main_loop, (AgsThread *) destroy_worker, TRUE, TRUE); xorg_application_context->worker = g_list_prepend(xorg_application_context->worker, destroy_worker); ags_thread_start((AgsThread *) destroy_worker); /* AgsThreadPool */ xorg_application_context->thread_pool = NULL; /* launch */ if(has_core_audio){ ags_core_audio_server_connect_client(core_audio_server); } if(has_pulse){ ags_pulse_server_connect_client(pulse_server); ags_pulse_server_start_poll(pulse_server); } if(has_jack){ ags_jack_server_connect_client(jack_server); } /* stop animation */ ags_ui_provider_set_show_animation(AGS_UI_PROVIDER(xorg_application_context), FALSE); /* unref */ g_object_unref(main_loop); g_object_unref(task_launcher); } void ags_xorg_application_context_register_types(AgsApplicationContext *application_context) { ags_complex_get_type(); /* */ ags_connectable_get_type(); /* */ ags_lv2_manager_get_type(); ags_lv2_urid_manager_get_type(); ags_lv2_worker_manager_get_type(); ags_lv2_worker_get_type(); /* */ ags_audio_loop_get_type(); ags_soundcard_thread_get_type(); ags_export_thread_get_type(); /* */ ags_audio_file_get_type(); ags_audio_file_link_get_type(); /* register tasks */ ags_cancel_audio_get_type(); ags_cancel_channel_get_type(); /* register backend */ ags_core_audio_server_get_type(); ags_pulse_server_get_type(); ags_jack_server_get_type(); //TODO:JK: extend me /* register recalls */ ags_generic_recall_channel_run_get_type(); ags_play_audio_get_type(); ags_play_channel_get_type(); ags_play_channel_run_get_type(); ags_play_channel_run_master_get_type(); ags_stream_channel_get_type(); ags_stream_channel_run_get_type(); ags_loop_channel_get_type(); ags_loop_channel_run_get_type(); ags_copy_channel_get_type(); ags_copy_channel_run_get_type(); ags_volume_channel_get_type(); ags_volume_channel_run_get_type(); ags_peak_channel_get_type(); ags_peak_channel_run_get_type(); ags_recall_ladspa_get_type(); ags_recall_ladspa_run_get_type(); ags_recall_dssi_get_type(); ags_recall_dssi_run_get_type(); ags_recall_lv2_get_type(); ags_recall_lv2_run_get_type(); ags_delay_audio_get_type(); ags_delay_audio_run_get_type(); ags_count_beats_audio_get_type(); ags_count_beats_audio_run_get_type(); ags_copy_pattern_audio_get_type(); ags_copy_pattern_audio_run_get_type(); ags_copy_pattern_channel_get_type(); ags_copy_pattern_channel_run_get_type(); ags_buffer_channel_get_type(); ags_buffer_channel_run_get_type(); ags_play_notation_audio_get_type(); ags_play_notation_audio_run_get_type(); ags_route_dssi_audio_get_type(); ags_route_dssi_audio_run_get_type(); ags_route_lv2_audio_get_type(); ags_route_lv2_audio_run_get_type(); /* gui */ //TODO:JK: move me ags_led_get_type(); ags_indicator_get_type(); ags_vindicator_get_type(); ags_hindicator_get_type(); ags_dial_get_type(); ags_notebook_get_type(); ags_piano_get_type(); /* register machine */ ags_effect_bridge_get_type(); ags_effect_bulk_get_type(); ags_effect_pad_get_type(); ags_effect_line_get_type(); ags_effect_separator_get_type(); ags_bulk_member_get_type(); ags_line_member_get_type(); ags_panel_get_type(); ags_panel_input_pad_get_type(); ags_panel_input_line_get_type(); ags_mixer_get_type(); ags_mixer_input_pad_get_type(); ags_mixer_input_line_get_type(); ags_drum_get_type(); ags_drum_output_pad_get_type(); ags_drum_output_line_get_type(); ags_drum_input_pad_get_type(); ags_drum_input_line_get_type(); ags_matrix_get_type(); ags_synth_get_type(); ags_synth_input_pad_get_type(); ags_synth_input_line_get_type(); #ifdef AGS_WITH_LIBINSTPATCH ags_ffplayer_get_type(); #endif ags_ladspa_bridge_get_type(); ags_lv2_bridge_get_type(); ags_dssi_bridge_get_type(); } void ags_xorg_application_context_quit(AgsApplicationContext *application_context) { AgsLadspaManager *ladspa_manager; AgsDssiManager *dssi_manager; AgsLv2Manager *lv2_manager; AgsCoreAudioServer *core_audio_server; AgsPulseServer *pulse_server; AgsJackServer *jack_server; AgsConfig *config; GList *core_audio_client; GList *jack_client; GList *start_list, *list; gchar *filename; gchar *str; config = application_context->config; /* free managers */ ladspa_manager = ags_ladspa_manager_get_instance(); g_object_unref(ladspa_manager); dssi_manager = ags_dssi_manager_get_instance(); g_object_unref(dssi_manager); lv2_manager = ags_lv2_manager_get_instance(); g_object_unref(lv2_manager); /* retrieve core audio server */ start_list = list = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); while((list = ags_list_util_find_type(list, AGS_TYPE_CORE_AUDIO_SERVER)) != NULL){ core_audio_server = list->data; /* close client */ core_audio_client = core_audio_server->client; while(core_audio_client != NULL){ #ifdef AGS_WITH_CORE_AUDIO AUGraphStop(AGS_CORE_AUDIO_CLIENT(core_audio_client->data)->graph); #endif core_audio_client = core_audio_client->next; } list = list->next; } g_list_free_full(start_list, g_object_unref); /* retrieve pulseaudio server */ start_list = list = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); while((list = ags_list_util_find_type(list, AGS_TYPE_PULSE_SERVER)) != NULL){ pulse_server = list->data; #ifdef AGS_WITH_PULSE if(pulse_server->main_loop != NULL){ pa_mainloop_quit(pulse_server->main_loop, 0); } #endif list = list->next; } g_list_free_full(start_list, g_object_unref); /* retrieve JACK server */ start_list = list = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((list = ags_list_util_find_type(list, AGS_TYPE_JACK_SERVER)) != NULL){ jack_server = list->data; /* close client */ jack_client = jack_server->client; while(jack_client != NULL){ #ifdef AGS_WITH_JACK jack_client_close(AGS_JACK_CLIENT(jack_client->data)->client); #endif jack_client = jack_client->next; } list = list->next; } g_list_free_full(start_list, g_object_unref); gtk_main_quit(); } void ags_xorg_application_context_read(AgsFile *file, xmlNode *node, GObject **application_context) { //TODO:JK: implement me } xmlNode* ags_xorg_application_context_write(AgsFile *file, xmlNode *parent, GObject *application_context) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void* ags_xorg_application_context_server_main_loop_thread(GMainLoop *main_loop) { AgsApplicationContext *application_context; GList *start_list, *list; g_main_context_push_thread_default(g_main_loop_get_context(main_loop)); application_context = ags_application_context_get_instance(); while(ags_ui_provider_get_show_animation(AGS_UI_PROVIDER(application_context))){ g_usleep(G_USEC_PER_SEC / 30); } list = start_list = ags_service_provider_get_server(AGS_SERVICE_PROVIDER(application_context)); while(list != NULL){ if(ags_server_test_flags(list->data, AGS_SERVER_AUTO_START)){ ags_server_start(AGS_SERVER(list->data)); } list = list->next; } g_list_free_full(start_list, g_object_unref); g_main_loop_run(main_loop); g_thread_exit(NULL); return(NULL); } void* ags_xorg_application_context_audio_main_loop_thread(GMainLoop *main_loop) { AgsApplicationContext *application_context; GList *start_list, *list; #ifdef AGS_WITH_RT AgsPriority *priority; struct sched_param param; gchar *str; #endif g_main_context_push_thread_default(g_main_loop_get_context(main_loop)); application_context = ags_application_context_get_instance(); while(ags_ui_provider_get_show_animation(AGS_UI_PROVIDER(application_context))){ g_usleep(G_USEC_PER_SEC / 30); } /* real-time setup */ #ifdef AGS_WITH_RT priority = ags_priority_get_instance(); param.sched_priority = 95; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO_MAIN_LOOP); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); #endif list = start_list = ags_sound_provider_get_osc_server(AGS_SERVICE_PROVIDER(application_context)); while(list != NULL){ if(ags_osc_server_test_flags(list->data, AGS_OSC_SERVER_AUTO_START)){ ags_osc_server_start(AGS_OSC_SERVER(list->data)); } list = list->next; } g_list_free_full(start_list, g_object_unref); g_main_loop_run(main_loop); g_thread_exit(NULL); return(NULL); } gboolean ags_xorg_application_context_message_monitor_timeout(AgsXorgApplicationContext *xorg_application_context) { ags_ui_provider_check_message(AGS_UI_PROVIDER(xorg_application_context)); ags_ui_provider_clean_message(AGS_UI_PROVIDER(xorg_application_context)); return(TRUE); } gboolean ags_xorg_application_context_task_timeout(AgsXorgApplicationContext *xorg_application_context) { AgsTaskLauncher *task_launcher; if(xorg_application_context->task == NULL){ return(TRUE); } task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(xorg_application_context)); ags_task_launcher_add_task_all(task_launcher, g_list_reverse(xorg_application_context->task)); g_list_free_full(xorg_application_context->task, g_object_unref); xorg_application_context->task = NULL; g_object_unref(task_launcher); return(TRUE); } AgsXorgApplicationContext* ags_xorg_application_context_new() { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = (AgsXorgApplicationContext *) g_object_new(AGS_TYPE_XORG_APPLICATION_CONTEXT, NULL); return(xorg_application_context); } gsequencer-3.1.3/ags/X/file/0000755000175000017500000000000013622252264012564 500000000000000gsequencer-3.1.3/ags/X/file/ags_simple_file.dtd0000644000175000017500000002012113561317052016316 00000000000000 gsequencer-3.1.3/ags/X/file/ags_simple_file.c0000644000175000017500000067520113607210263016001 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include void ags_simple_file_class_init(AgsSimpleFileClass *simple_file); void ags_simple_file_init(AgsSimpleFile *simple_file); void ags_simple_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_simple_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_simple_file_finalize(GObject *gobject); void ags_simple_file_real_open(AgsSimpleFile *simple_file, GError **error); void ags_simple_file_real_open_from_data(AgsSimpleFile *simple_file, gchar *data, guint length, GError **error); void ags_simple_file_real_rw_open(AgsSimpleFile *simple_file, gboolean create, GError **error); void ags_simple_file_real_write(AgsSimpleFile *simple_file); void ags_simple_file_real_write_resolve(AgsSimpleFile *simple_file); void ags_simple_file_real_read(AgsSimpleFile *simple_file); void ags_simple_file_real_read_resolve(AgsSimpleFile *simple_file); void ags_simple_file_real_read_start(AgsSimpleFile *simple_file); void ags_simple_file_read_change_max_precision(AgsThread *thread, gdouble max_precision); void ags_simple_file_read_config(AgsSimpleFile *simple_file, xmlNode *node, AgsConfig **config); void ags_simple_file_read_property_list(AgsSimpleFile *simple_file, xmlNode *node, GList **property); void ags_simple_file_read_property(AgsSimpleFile *simple_file, xmlNode *node, GParameter **property); void ags_simple_file_read_strv(AgsSimpleFile *simple_file, xmlNode *node, gchar ***strv); void ags_simple_file_read_value(AgsSimpleFile *simple_file, xmlNode *node, GValue **value); void ags_simple_file_read_window(AgsSimpleFile *simple_file, xmlNode *node, AgsWindow **window); void ags_simple_file_read_window_launch(AgsFileLaunch *file_launch, AgsWindow *window); void ags_simple_file_read_machine_list(AgsSimpleFile *simple_file, xmlNode *node, GList **machine); void ags_simple_file_read_machine(AgsSimpleFile *simple_file, xmlNode *node, AgsMachine **machine); void ags_simple_file_read_machine_resize_pads(AgsMachine *machine, GType channel_type, guint new_size, guint old_size, gpointer data); void ags_simple_file_read_equalizer10_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsEqualizer10 *equalizer10); void ags_simple_file_read_drum_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsDrum *drum); void ags_simple_file_read_matrix_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsMatrix *matrix); void ags_simple_file_read_syncsynth_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsSyncsynth *syncsynth); void ags_simple_file_read_pitch_sampler_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsPitchSampler *pitch_sampler); #ifdef AGS_WITH_LIBINSTPATCH void ags_simple_file_read_ffplayer_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsFFPlayer *ffplayer); #endif void ags_simple_file_read_audiorec_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsAudiorec *audiorec); void ags_simple_file_read_dssi_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsDssiBridge *dssi_bridge); void ags_simple_file_read_live_dssi_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsLiveDssiBridge *live_dssi_bridge); void ags_simple_file_read_lv2_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsLv2Bridge *lv2_bridge); void ags_simple_file_read_live_lv2_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsLiveLv2Bridge *live_lv2_bridge); void ags_simple_file_read_effect_bridge_launch(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectBridge *effect_bridge); void ags_simple_file_read_effect_bulk_launch(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectBulk *effect_bulk); void ags_simple_file_read_bulk_member_launch(AgsSimpleFile *simple_file, xmlNode *node, AgsBulkMember *bulk_member); void ags_simple_file_read_machine_launch(AgsFileLaunch *file_launch, AgsMachine *machine); void ags_simple_file_read_pad_list(AgsSimpleFile *simple_file, xmlNode *node, GList **pad); void ags_simple_file_read_pad(AgsSimpleFile *simple_file, xmlNode *node, AgsPad **pad); void ags_simple_file_read_pad_launch(AgsFileLaunch *file_launch, AgsPad *pad); void ags_simple_file_read_line_list(AgsSimpleFile *simple_file, xmlNode *node, GList **line); void ags_simple_file_read_line_member(AgsSimpleFile *simple_file, xmlNode *node, AgsLineMember *line_member); void ags_simple_file_read_line(AgsSimpleFile *simple_file, xmlNode *node, AgsLine **line); void ags_simple_file_read_line_launch(AgsFileLaunch *file_launch, AgsLine *line); void ags_simple_file_read_channel_line_launch(AgsFileLaunch *file_launch, AgsChannel *channel); void ags_simple_file_read_effect_pad_list(AgsSimpleFile *simple_file, xmlNode *node, GList **effect_pad); void ags_simple_file_read_effect_pad(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectPad **effect_pad); void ags_simple_file_read_effect_pad_launch(AgsFileLaunch *file_launch, AgsEffectPad *effect_pad); void ags_simple_file_read_effect_line_list(AgsSimpleFile *simple_file, xmlNode *node, GList **effect_line); void ags_simple_file_read_effect_line(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectLine **effect_line); void ags_simple_file_read_effect_line_launch(AgsFileLaunch *file_launch, AgsEffectLine *effect_line); void ags_simple_file_read_oscillator_list(AgsSimpleFile *simple_file, xmlNode *node, GList **oscillator); void ags_simple_file_read_oscillator(AgsSimpleFile *simple_file, xmlNode *node, AgsOscillator **oscillator); void ags_simple_file_read_fm_oscillator_list(AgsSimpleFile *simple_file, xmlNode *node, GList **fm_oscillator); void ags_simple_file_read_fm_oscillator(AgsSimpleFile *simple_file, xmlNode *node, AgsFMOscillator **fm_oscillator); void ags_simple_file_read_notation_editor(AgsSimpleFile *simple_file, xmlNode *node, AgsNotationEditor **notation_editor); void ags_simple_file_read_notation_editor_launch(AgsFileLaunch *file_launch, AgsNotationEditor *notation_editor); void ags_simple_file_read_automation_editor(AgsSimpleFile *simple_file, xmlNode *node, AgsAutomationEditor **automation_editor); void ags_simple_file_read_automation_editor_launch(AgsFileLaunch *file_launch, AgsAutomationEditor *automation_editor); void ags_simple_file_read_wave_editor(AgsSimpleFile *simple_file, xmlNode *node, AgsWaveEditor **wave_editor); void ags_simple_file_read_wave_editor_launch(AgsFileLaunch *file_launch, AgsWaveEditor *wave_editor); void ags_simple_file_read_notation_list(AgsSimpleFile *simple_file, xmlNode *node, GList **notation); void ags_simple_file_read_notation(AgsSimpleFile *simple_file, xmlNode *node, AgsNotation **notation); void ags_simple_file_read_notation_fixup_1_0_to_1_2(AgsSimpleFile *simple_file, xmlNode *node, GList **notation); void ags_simple_file_read_notation_list_fixup_1_0_to_1_2(AgsSimpleFile *simple_file, xmlNode *node, GList **notation); void ags_simple_file_read_automation_list(AgsSimpleFile *simple_file, xmlNode *node, GList **automation); void ags_simple_file_read_automation(AgsSimpleFile *simple_file, xmlNode *node, AgsAutomation **automation); void ags_simple_file_read_automation_fixup_1_0_to_1_3(AgsSimpleFile *simple_file, xmlNode *node, GList **automation); void ags_simple_file_read_automation_list_fixup_1_0_to_1_3(AgsSimpleFile *simple_file, xmlNode *node, GList **automation); void ags_simple_file_read_preset_list(AgsSimpleFile *simple_file, xmlNode *node, GList **preset); void ags_simple_file_read_preset(AgsSimpleFile *simple_file, xmlNode *node, AgsPreset **preset); xmlNode* ags_simple_file_write_config(AgsSimpleFile *simple_file, xmlNode *parent, AgsConfig *config); xmlNode* ags_simple_file_write_window(AgsSimpleFile *simple_file, xmlNode *parent, AgsWindow *window); xmlNode* ags_simple_file_write_property_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *property); xmlNode* ags_simple_file_write_property(AgsSimpleFile *simple_file, xmlNode *parent, GParameter *property); xmlNode* ags_simple_file_write_strv(AgsSimpleFile *simple_file, xmlNode *parent, gchar **strv); xmlNode* ags_simple_file_write_value(AgsSimpleFile *simple_file, xmlNode *parent, GValue *value); xmlNode* ags_simple_file_write_window(AgsSimpleFile *simple_file, xmlNode *parent, AgsWindow *window); xmlNode* ags_simple_file_write_machine_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *machine); gboolean ags_simple_file_write_machine_inline_pad(AgsSimpleFile *simple_file, xmlNode *parent, AgsChannel *channel); xmlNode* ags_simple_file_write_control(AgsSimpleFile *simple_file, xmlNode *parent, AgsBulkMember *bulk_member); xmlNode* ags_simple_file_write_effect_list(AgsSimpleFile *simple_file, xmlNode *parent, AgsEffectBulk *effect_bulk); xmlNode* ags_simple_file_write_automation_port(AgsSimpleFile *simple_file, xmlNode *parent, GList *automation_port); xmlNode* ags_simple_file_write_machine(AgsSimpleFile *simple_file, xmlNode *parent, AgsMachine *machine); xmlNode* ags_simple_file_write_pad_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *pad); xmlNode* ags_simple_file_write_pad(AgsSimpleFile *simple_file, xmlNode *parent, AgsPad *pad); xmlNode* ags_simple_file_write_line_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *line); void ags_simple_file_write_line_member_control(AgsSimpleFile *simple_file, xmlNode *parent, AgsLineMember *line_member); xmlNode* ags_simple_file_write_line(AgsSimpleFile *simple_file, xmlNode *parent, AgsLine *line); void ags_simple_file_write_line_resolve_link(AgsFileLookup *file_lookup, AgsChannel *channel); xmlNode* ags_simple_file_write_effect_pad_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *effect_pad); xmlNode* ags_simple_file_write_effect_pad(AgsSimpleFile *simple_file, xmlNode *parent, AgsEffectPad *effect_pad); xmlNode* ags_simple_file_write_effect_line_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *effect_line); void ags_simple_file_write_effect_line_control(AgsSimpleFile *simple_file, xmlNode *parent, AgsLineMember *line_member); xmlNode* ags_simple_file_write_effect_line(AgsSimpleFile *simple_file, xmlNode *parent, AgsEffectLine *effect_line); xmlNode* ags_simple_file_write_oscillator_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *oscillator); xmlNode* ags_simple_file_write_oscillator(AgsSimpleFile *simple_file, xmlNode *parent, AgsOscillator *oscillator); xmlNode* ags_simple_file_write_fm_oscillator_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *fm_oscillator); xmlNode* ags_simple_file_write_fm_oscillator(AgsSimpleFile *simple_file, xmlNode *parent, AgsFMOscillator *fm_oscillator); xmlNode* ags_simple_file_write_notation_editor(AgsSimpleFile *simple_file, xmlNode *parent, AgsNotationEditor *notation_editor); void ags_simple_file_write_notation_editor_resolve_machine(AgsFileLookup *file_lookup, AgsNotationEditor *notation_editor); xmlNode* ags_simple_file_write_automation_editor(AgsSimpleFile *simple_file, xmlNode *parent, AgsAutomationEditor *automation_editor); void ags_simple_file_write_automation_editor_resolve_machine(AgsFileLookup *file_lookup, AgsAutomationEditor *automation_editor); xmlNode* ags_simple_file_write_wave_editor(AgsSimpleFile *simple_file, xmlNode *parent, AgsWaveEditor *wave_editor); void ags_simple_file_write_wave_editor_resolve_machine(AgsFileLookup *file_lookup, AgsWaveEditor *wave_editor); xmlNode* ags_simple_file_write_notation_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *notation); xmlNode* ags_simple_file_write_notation(AgsSimpleFile *simple_file, xmlNode *parent, AgsNotation *notation); xmlNode* ags_simple_file_write_automation_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *automation); xmlNode* ags_simple_file_write_automation(AgsSimpleFile *simple_file, xmlNode *parent, AgsAutomation *automation); xmlNode* ags_simple_file_write_preset_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *preset); xmlNode* ags_simple_file_write_preset(AgsSimpleFile *simple_file, xmlNode *parent, AgsPreset *preset); /** * SECTION:ags_file * @short_description: read/write XML file * @title: AgsSimpleFile * @section_id: * @include: ags/file/ags_file.h * * The #AgsSimpleFile is an object to read or write files using XML. It * is the persisting layer of Advanced Gtk+ Sequencer. */ enum{ PROP_0, PROP_FILENAME, PROP_ENCODING, PROP_AUDIO_FORMAT, PROP_AUDIO_ENCODING, PROP_XML_DOC, }; enum{ OPEN, OPEN_FROM_DATA, RW_OPEN, WRITE, WRITE_RESOLVE, READ, READ_RESOLVE, READ_START, LAST_SIGNAL, }; static gpointer ags_simple_file_parent_class = NULL; static guint simple_file_signals[LAST_SIGNAL] = { 0 }; GType ags_simple_file_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_simple_file = 0; static const GTypeInfo ags_simple_file_info = { sizeof (AgsSimpleFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_simple_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSimpleFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_simple_file_init, }; ags_type_simple_file = g_type_register_static(G_TYPE_OBJECT, "AgsSimpleFile", &ags_simple_file_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_simple_file); } return g_define_type_id__volatile; } void ags_simple_file_class_init(AgsSimpleFileClass *simple_file) { GObjectClass *gobject; GParamSpec *param_spec; ags_simple_file_parent_class = g_type_class_peek_parent(simple_file); /* GObjectClass */ gobject = (GObjectClass *) simple_file; gobject->get_property = ags_simple_file_get_property; gobject->set_property = ags_simple_file_set_property; gobject->finalize = ags_simple_file_finalize; /* properties */ /** * AgsSimpleFile:filename: * * The assigned filename to open and read from. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", "filename to read or write", "The filename to read or write to.", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsSimpleFile:encoding: * * The charset encoding to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("encoding", "encoding to use", "The encoding of the XML document.", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ENCODING, param_spec); /** * AgsSimpleFile:audio-format: * * The format of embedded audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_string("audio-format", "audio format to use", "The audio format used to embedded audio.", AGS_SIMPLE_FILE_DEFAULT_AUDIO_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_FORMAT, param_spec); /** * AgsSimpleFile:audio-encoding: * * The encoding to use for embedding audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_string("audio-encoding", "audio encoding to use", "The audio encoding used to embedded audio.", AGS_SIMPLE_FILE_DEFAULT_AUDIO_ENCODING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_ENCODING, param_spec); /** * AgsSimpleFile:xml-doc: * * The assigned xml-doc. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("xml-doc", "xml document of file", "The xml document assigned with file", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_XML_DOC, param_spec); /* AgsSimpleFileClass */ simple_file->open = ags_simple_file_real_open; simple_file->rw_open = ags_simple_file_real_rw_open; simple_file->open_from_data = ags_simple_file_real_open_from_data; simple_file->write = ags_simple_file_real_write; simple_file->write_resolve = ags_simple_file_real_write_resolve; simple_file->read = ags_simple_file_real_read; simple_file->read_resolve = ags_simple_file_real_read_resolve; simple_file->read_start = ags_simple_file_real_read_start; /* signals */ /** * AgsSimpleFile::open: * @simple_file: the #AgsSimpleFile * @error: a #GError-struct pointer to return error * * Open @simple_file with appropriate filename. * * Since: 3.0.0 */ simple_file_signals[OPEN] = g_signal_new("open", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, open), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsSimpleFile::open-from-data: * @simple_file: the #AgsSimpleFile * @buffer: the buffer containing the file * @length: the buffer length * @error: a #GError-struct pointer to return error * * Open @simple_file from a buffer containing the file. * * Since: 3.0.0 */ simple_file_signals[OPEN_FROM_DATA] = g_signal_new("open-from-data", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, open_from_data), NULL, NULL, ags_cclosure_marshal_VOID__STRING_UINT_POINTER, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_POINTER); /** * AgsSimpleFile::open-from-data: * @simple_file: the #AgsSimpleFile * @create: if %TRUE the file will be created if not exists * @error: a #GError-struct pointer to return error * * Open @simple_file in read-write mode. * * Since: 3.0.0 */ simple_file_signals[RW_OPEN] = g_signal_new("rw-open", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, rw_open), NULL, NULL, ags_cclosure_marshal_VOID__BOOLEAN_POINTER, G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_POINTER); /** * AgsSimpleFile::write: * @simple_file: the #AgsSimpleFile * * Write XML Document to disk. * * Since: 3.0.0 */ simple_file_signals[WRITE] = g_signal_new("write", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, write), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsSimpleFile::write-resolve: * @simple_file: the #AgsSimpleFile * * Resolve references and generate thus XPath expressions just * before writing to disk. * * Since: 3.0.0 */ simple_file_signals[WRITE_RESOLVE] = g_signal_new("write-resolve", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, write_resolve), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsSimpleFile::read: * @simple_file: the #AgsSimpleFile * * Read a XML document from disk with specified simple_filename. * * Since: 3.0.0 */ simple_file_signals[READ] = g_signal_new("read", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, read), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsSimpleFile::read-resolve: * @simple_file: the #AgsSimpleFile * * Resolve XPath expressions to their counterpart the newly created * instances refering to. * * Since: 3.0.0 */ simple_file_signals[READ_RESOLVE] = g_signal_new("read-resolve", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, read_resolve), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsSimpleFile::read-start: * @simple_file: the #AgsSimpleFile * * Start assigning resources. * * Since: 3.0.0 */ simple_file_signals[READ_START] = g_signal_new("read-start", G_TYPE_FROM_CLASS(simple_file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSimpleFileClass, read_start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } GQuark ags_simple_file_error_quark() { return(g_quark_from_static_string("ags-simple-file-error-quark")); } void ags_simple_file_init(AgsSimpleFile *simple_file) { simple_file->flags = 0; simple_file->out = NULL; simple_file->buffer = NULL; simple_file->filename = NULL; simple_file->encoding = AGS_SIMPLE_FILE_DEFAULT_ENCODING; simple_file->dtd = AGS_SIMPLE_FILE_DEFAULT_DTD; simple_file->audio_format = AGS_SIMPLE_FILE_DEFAULT_AUDIO_FORMAT; simple_file->audio_encoding = AGS_SIMPLE_FILE_DEFAULT_AUDIO_ENCODING; simple_file->doc = NULL; simple_file->id_ref = NULL; simple_file->lookup = NULL; simple_file->launch = NULL; } void ags_simple_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSimpleFile *simple_file; simple_file = AGS_SIMPLE_FILE(gobject); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(simple_file->filename == filename){ return; } if(simple_file->filename != NULL){ g_free(simple_file->filename); } simple_file->filename = g_strdup(filename); } break; case PROP_ENCODING: { gchar *encoding; encoding = g_value_get_string(value); simple_file->encoding = encoding; } break; case PROP_AUDIO_FORMAT: { gchar *audio_format; audio_format = g_value_get_string(value); simple_file->audio_format = audio_format; } break; case PROP_AUDIO_ENCODING: { gchar *audio_encoding; audio_encoding = g_value_get_string(value); simple_file->audio_encoding = audio_encoding; } break; case PROP_XML_DOC: { xmlDoc *doc; doc = (xmlDoc *) g_value_get_pointer(value); simple_file->doc = doc; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_simple_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSimpleFile *simple_file; simple_file = AGS_SIMPLE_FILE(gobject); switch(prop_id){ case PROP_FILENAME: { g_value_set_string(value, simple_file->filename); } break; case PROP_ENCODING: { g_value_set_string(value, simple_file->encoding); } break; case PROP_AUDIO_FORMAT: { g_value_set_string(value, simple_file->audio_format); } break; case PROP_AUDIO_ENCODING: { g_value_set_string(value, simple_file->audio_encoding); } break; case PROP_XML_DOC: { g_value_set_pointer(value, simple_file->doc); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_simple_file_finalize(GObject *gobject) { //TODO:JK: implement me } gchar* ags_simple_file_str2md5(gchar *content, guint content_length) { GChecksum *checksum; gchar *str; str = g_compute_checksum_for_string(G_CHECKSUM_MD5, content, content_length); return(str); } void ags_simple_file_add_id_ref(AgsSimpleFile *simple_file, GObject *id_ref) { if(simple_file == NULL || id_ref == NULL){ return; } g_object_ref(id_ref); simple_file->id_ref = g_list_prepend(simple_file->id_ref, id_ref); } GObject* ags_simple_file_find_id_ref_by_node(AgsSimpleFile *simple_file, xmlNode *node) { AgsFileIdRef *file_id_ref; GList *list; if(simple_file == NULL || node == NULL){ return(NULL); } list = simple_file->id_ref; while(list != NULL){ file_id_ref = AGS_FILE_ID_REF(list->data); if(file_id_ref->node == node){ return((GObject *) file_id_ref); } list = list->next; } return(NULL); } GList* ags_simple_file_find_id_ref_by_xpath(AgsSimpleFile *simple_file, gchar *xpath) { AgsFileIdRef *file_id_ref; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; GList *list; gboolean success; guint i; if(simple_file == NULL || xpath == NULL || !g_str_has_prefix(xpath, "xpath=")){ g_message("invalid xpath: %s", xpath); return(NULL); } xpath = &(xpath[6]); /* Create xpath evaluation context */ xpath_context = xmlXPathNewContext(simple_file->doc); if(xpath_context == NULL) { g_warning("Error: unable to create new XPath context"); return(NULL); } xpath_context->node = simple_file->root_node; /* Evaluate xpath expression */ xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object == NULL) { g_warning("Error: unable to evaluate xpath expression \"%s\"", xpath); xmlXPathFreeContext(xpath_context); return(NULL); } node = xpath_object->nodesetval->nodeTab; list = NULL; success = FALSE; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ GObject *gobject; success = TRUE; gobject = ags_simple_file_find_id_ref_by_node(simple_file, node[i]); if(gobject != NULL){ list = g_list_prepend(list, gobject); } } } if(!success){ g_message("no xpath match [%d]: %s", xpath_object->nodesetval->nodeNr, xpath); } return(list); } GList* ags_simple_file_find_id_ref_by_reference(AgsSimpleFile *simple_file, gpointer ref) { AgsFileIdRef *file_id_ref; GList *list; GList *ref_list; if(simple_file == NULL || ref == NULL){ return(NULL); } list = simple_file->id_ref; ref_list = NULL; while(list != NULL){ file_id_ref = AGS_FILE_ID_REF(list->data); if(file_id_ref->ref == ref){ ref_list = g_list_prepend(ref_list, file_id_ref); } list = list->next; } return(ref_list); } void ags_simple_file_add_lookup(AgsSimpleFile *simple_file, GObject *file_lookup) { if(simple_file == NULL || file_lookup == NULL){ return; } g_object_ref(G_OBJECT(file_lookup)); simple_file->lookup = g_list_prepend(simple_file->lookup, file_lookup); } void ags_simple_file_add_launch(AgsSimpleFile *simple_file, GObject *file_launch) { if(simple_file == NULL || file_launch == NULL){ return; } g_object_ref(G_OBJECT(file_launch)); simple_file->launch = g_list_prepend(simple_file->launch, file_launch); } void ags_simple_file_real_open(AgsSimpleFile *simple_file, GError **error) { xmlInitParser(); /* parse the file and get the DOM */ simple_file->doc = xmlReadFile(simple_file->filename, NULL, XML_PARSE_HUGE); if(simple_file->doc == NULL){ g_warning("ags_simple_file.c - failed to read XML document %s", simple_file->filename); if(error != NULL){ g_set_error(error, AGS_SIMPLE_FILE_ERROR, AGS_SIMPLE_FILE_ERROR_PARSER_FAILURE, "unable to parse document: %s\n", simple_file->filename); } }else{ /* Get the root element node */ simple_file->root_node = xmlDocGetRootElement(simple_file->doc); } } void ags_simple_file_open(AgsSimpleFile *simple_file, GError **error) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[OPEN], 0, error); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_real_open_from_data(AgsSimpleFile *simple_file, gchar *data, guint length, GError **error) { xmlInitParser(); simple_file->doc = xmlReadMemory(data, length, simple_file->filename, NULL, 0); if(simple_file->doc == NULL){ g_warning("ags_simple_file.c - failed to read XML document %s", simple_file->filename); if(error != NULL){ g_set_error(error, AGS_SIMPLE_FILE_ERROR, AGS_SIMPLE_FILE_ERROR_PARSER_FAILURE, "unable to parse document from data: %s\n", simple_file->filename); } }else{ /* Get the root element node */ simple_file->root_node = xmlDocGetRootElement(simple_file->doc); } } void ags_simple_file_open_from_data(AgsSimpleFile *simple_file, gchar *data, guint length, GError **error) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[OPEN_FROM_DATA], 0, data, length, error); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_real_rw_open(AgsSimpleFile *simple_file, gboolean create, GError **error) { xmlInitParser(); simple_file->out = fopen(simple_file->filename, "w+"); simple_file->doc = xmlNewDoc("1.0"); simple_file->root_node = xmlNewNode(NULL, "ags-simple-file"); xmlNewProp(simple_file->root_node, "xmlns:agssf", "http://nongnu.org/gsequencer/ns/ags-simple-file"); xmlDocSetRootElement(simple_file->doc, simple_file->root_node); } void ags_simple_file_rw_open(AgsSimpleFile *simple_file, gboolean create, GError **error) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[RW_OPEN], 0, create, error); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_open_filename(AgsSimpleFile *simple_file, gchar *filename) { GError *error; if(simple_file == NULL){ return; } if(simple_file->filename != NULL){ ags_simple_file_close(simple_file); } error = NULL; g_object_set(simple_file, "filename", filename, NULL); ags_simple_file_open(simple_file, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } void ags_simple_file_close(AgsSimpleFile *simple_file) { if(simple_file == NULL){ return; } if(simple_file->out != NULL){ fclose(simple_file->out); } /* free the document */ xmlFreeDoc(simple_file->doc); /* * Free the global variables that may * have been allocated by the parser. */ // xmlCleanupParser(); /* * this is to debug memory for regression tests */ // xmlMemoryDump(); simple_file->filename = NULL; } void ags_simple_file_real_write(AgsSimpleFile *simple_file) { AgsApplicationContext *application_context; AgsConfig *config; xmlNode *node, *child; gchar *id; guint size; if(simple_file == NULL || simple_file->root_node == NULL){ return; } application_context = ags_application_context_get_instance(); config = ags_config_get_instance(); id = ags_id_generator_create_uuid(); node = simple_file->root_node; xmlNewProp(node, AGS_SIMPLE_FILE_ID_PROP, id); xmlNewProp(node, AGS_SIMPLE_FILE_VERSION_PROP, AGS_APPLICATION_CONTEXT(application_context)->version); xmlNewProp(node, AGS_SIMPLE_FILE_BUILD_ID_PROP, AGS_APPLICATION_CONTEXT(application_context)->build_id); /* add to parent */ ags_simple_file_write_config(simple_file, node, config); ags_simple_file_write_window(simple_file, node, ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context))); /* resolve */ ags_simple_file_write_resolve(simple_file); /* * Dumping document to file */ // xmlSaveFormatFileEnc(simple_file->filename, simple_file->doc, "UTF-8", 1); xmlDocDumpFormatMemoryEnc(simple_file->doc, &(simple_file->buffer), &size, simple_file->encoding, TRUE); fwrite(simple_file->buffer, size, sizeof(xmlChar), simple_file->out); fflush(simple_file->out); } void ags_simple_file_write(AgsSimpleFile *simple_file) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[WRITE], 0); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_real_write_resolve(AgsSimpleFile *simple_file) { GList *list; list = simple_file->lookup; while(list != NULL){ ags_file_lookup_resolve(AGS_FILE_LOOKUP(list->data)); list = list->next; } } void ags_simple_file_write_resolve(AgsSimpleFile *simple_file) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[WRITE_RESOLVE], 0); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_real_read(AgsSimpleFile *simple_file) { AgsApplicationContext *application_context; xmlNode *root_node, *child; application_context = ags_application_context_get_instance(); root_node = simple_file->root_node; if(root_node == NULL){ return; } /* child elements */ child = root_node->children; /* read config then window */ ags_application_context_register_types(application_context); #if 0 while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("ags-sf-config", child->name, 13)){ //NOTE:JK: no redundant code here } } child = child->next; } #endif while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("ags-sf-window", child->name, 14)){ AgsWindow *orig_window, *window; window = orig_window = ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); ags_simple_file_read_window(simple_file, child, (AgsWindow **) &window); if(orig_window != window){ ags_ui_provider_set_window(AGS_UI_PROVIDER(application_context), window); } } } child = child->next; } /* resolve */ ags_simple_file_read_resolve(simple_file); g_message("XML simple file resolved"); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(application_context)); gtk_widget_show_all(ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context))); g_message("XML simple file connected"); /* start */ ags_simple_file_read_start(simple_file); /* set file ready */ ags_ui_provider_set_file_ready(AGS_UI_PROVIDER(application_context), TRUE); } void ags_simple_file_read(AgsSimpleFile *simple_file) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[READ], 0); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_real_read_resolve(AgsSimpleFile *simple_file) { GList *list; list = g_list_reverse(simple_file->lookup); while(list != NULL){ ags_file_lookup_resolve(AGS_FILE_LOOKUP(list->data)); list = list->next; } } void ags_simple_file_read_resolve(AgsSimpleFile *simple_file) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[READ_RESOLVE], 0); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_real_read_start(AgsSimpleFile *simple_file) { GList *list; list = g_list_reverse(simple_file->launch); while(list != NULL){ ags_file_launch_start(AGS_FILE_LAUNCH(list->data)); list = list->next; } } void ags_simple_file_read_start(AgsSimpleFile *simple_file) { g_return_if_fail(AGS_IS_SIMPLE_FILE(simple_file)); g_object_ref(G_OBJECT(simple_file)); g_signal_emit(G_OBJECT(simple_file), simple_file_signals[READ_START], 0); g_object_unref(G_OBJECT(simple_file)); } void ags_simple_file_read_change_max_precision(AgsThread *thread, gdouble max_precision) { AgsThread *child, *next_child; g_object_set(thread, "max-precision", max_precision, NULL); child = ags_thread_children(thread); while(child != NULL){ ags_simple_file_read_change_max_precision(child, max_precision); /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } } void ags_simple_file_read_config(AgsSimpleFile *simple_file, xmlNode *node, AgsConfig **ags_config) { AgsThread *main_loop; AgsApplicationContext *application_context; AgsConfig *config; char *buffer; gchar *id; gchar *str; gsize buffer_length; gdouble samplerate; guint buffer_size; gdouble frequency; gdouble gui_scale_factor; config = *ags_config; config->version = xmlGetProp(node, AGS_SIMPLE_FILE_VERSION_PROP); config->build_id = xmlGetProp(node, AGS_SIMPLE_FILE_BUILD_ID_PROP); application_context = ags_application_context_get_instance(); buffer = xmlNodeGetContent(node); buffer_length = xmlStrlen(buffer); g_message("%s", buffer); ags_config_load_from_data(config, buffer, buffer_length); /* max-precision */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); str = ags_config_get_value(config, AGS_CONFIG_THREAD, "max-precision"); if(str != NULL){ gdouble max_precision; /* change max precision */ max_precision = g_ascii_strtod(str, NULL); ags_simple_file_read_change_max_precision(main_loop, max_precision); } samplerate = ags_soundcard_helper_config_get_samplerate(config); buffer_size = ags_soundcard_helper_config_get_buffer_size(config); frequency = ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; ags_main_loop_change_frequency(AGS_MAIN_LOOP(main_loop), frequency); g_object_unref(main_loop); /* some GUI scaling */ gui_scale_factor = 1.0; str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "gui-scale"); if(str != NULL){ gui_scale_factor = g_ascii_strtod(str, NULL); g_free(str); } ags_ui_provider_set_gui_scale_factor(AGS_UI_PROVIDER(application_context), gui_scale_factor); } void ags_simple_file_read_property_list(AgsSimpleFile *simple_file, xmlNode *node, GList **property) { GParameter *current; GList *list; xmlNode *child; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property", 11)){ current = NULL; if(*property != NULL){ GList *iter; iter = g_list_nth(*property, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_property(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *property = list; } void ags_simple_file_read_property(AgsSimpleFile *simple_file, xmlNode *node, GParameter **property) { GParameter *pointer; xmlChar *str; xmlChar *type; if(*property != NULL){ pointer = *property; }else{ pointer = (GParameter *) g_new0(GParameter, 1); pointer->name = NULL; *property = pointer; } str = xmlGetProp(node, "name"); if(str != NULL){ pointer->name = str; } str = xmlGetProp(node, "value"); type = xmlGetProp(node, "type"); if(str != NULL){ if(!g_strcmp0(type, "gboolean")){ g_value_init(&(pointer->value), G_TYPE_BOOLEAN); if(!g_ascii_strcasecmp(str, "false")){ g_value_set_boolean(&(pointer->value), FALSE); }else{ g_value_set_boolean(&(pointer->value), TRUE); } }else if(!g_strcmp0(type, "guint")){ guint val; g_value_init(&(pointer->value), G_TYPE_UINT); val = g_ascii_strtoull(str, NULL, 10); g_value_set_uint(&(pointer->value), val); }else if(!g_strcmp0(type, "gint")){ gint val; g_value_init(&(pointer->value), G_TYPE_UINT); val = g_ascii_strtoll(str, NULL, 10); g_value_set_int(&(pointer->value), val); }else if(!g_strcmp0(type, "gdouble")){ gdouble val; g_value_init(&(pointer->value), G_TYPE_DOUBLE); val = g_ascii_strtod(str, NULL); g_value_set_double(&(pointer->value), val); }else if(!g_strcmp0(type, "AgsComplex")){ AgsComplex z; g_value_init(&(pointer->value), AGS_TYPE_COMPLEX); sscanf(str, "%Lf %Lf", &(z.real), &(z.imag)); g_value_set_boxed(&(pointer->value), &z); }else{ g_value_init(&(pointer->value), G_TYPE_STRING); g_value_set_string(&(pointer->value), g_strdup(str)); } } if(type != NULL){ xmlFree(type); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_strv(AgsSimpleFile *simple_file, xmlNode *node, gchar ***strv) { xmlNode *child; gchar **current; guint i; current = NULL; child = node->children; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-str", 11)){ if(current == NULL){ current = malloc(2 * sizeof(gchar *)); }else{ current = realloc(current, (i + 2) * sizeof(gchar *)); } current[i] = xmlNodeGetContent(child); i++; } } child = child->next; } /* set return value */ strv[0] = current; } void ags_simple_file_read_value(AgsSimpleFile *simple_file, xmlNode *node, GValue **value) { GValue *current; gchar *str, *type; current = value[0]; str = xmlGetProp(node, "value"); type = xmlGetProp(node, "type"); if(str != NULL){ if(!g_strcmp0(type, "gboolean")){ g_value_init(current, G_TYPE_BOOLEAN); if(!g_ascii_strcasecmp(str, "false")){ g_value_set_boolean(current, FALSE); }else{ g_value_set_boolean(current, TRUE); } }else if(!g_strcmp0(type, "guint")){ guint val; g_value_init(current, G_TYPE_UINT); val = g_ascii_strtoull(str, NULL, 10); g_value_set_uint(current, val); }else if(!g_strcmp0(type, "gint")){ gint val; g_value_init(current, G_TYPE_UINT); val = g_ascii_strtoll(str, NULL, 10); g_value_set_int(current, val); }else if(!g_strcmp0(type, "gdouble")){ gdouble val; g_value_init(current, G_TYPE_DOUBLE); val = g_ascii_strtod(str, NULL); g_value_set_double(current, val); }else if(!g_strcmp0(type, "AgsComplex")){ AgsComplex z; g_value_init(current, AGS_TYPE_COMPLEX); sscanf(str, "%Lf %Lf", &(z.real), &(z.imag)); g_value_set_boxed(current, &z); }else{ g_value_init(current, G_TYPE_STRING); g_value_set_string(current, g_strdup(str)); } } if(type != NULL){ xmlFree(type); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_window(AgsSimpleFile *simple_file, xmlNode *node, AgsWindow **window) { AgsWindow *gobject; AgsFileLaunch *file_launch; AgsApplicationContext *application_context; AgsConfig *config; xmlNode *child; GList *list; xmlChar *str; guint pcm_channels; guint samplerate; guint buffer_size; guint format; application_context = ags_application_context_get_instance(); if(*window != NULL){ gobject = *window; }else{ gobject = ags_window_new(); ags_ui_provider_set_window(AGS_UI_PROVIDER(application_context), gobject); *window = gobject; } str = xmlGetProp(node, "filename"); if(str != NULL){ gobject->name = str; gtk_window_set_title((GtkWindow *) gobject, g_strconcat("GSequencer - ", gobject->name, NULL)); } /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-machine-list", 20)){ GList *machine_start; machine_start = NULL; ags_simple_file_read_machine_list(simple_file, child, &machine_start); g_list_free(machine_start); } } child = child->next; } /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-notation-editor", 23)){ ags_simple_file_read_notation_editor(simple_file, child, &(gobject->notation_editor)); }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-automation-editor", 25)){ ags_simple_file_read_automation_editor(simple_file, child, &(AGS_AUTOMATION_WINDOW(gobject->automation_window)->automation_editor)); }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-wave-editor", 19)){ ags_simple_file_read_wave_editor(simple_file, child, &(AGS_WAVE_WINDOW(gobject->wave_window)->wave_editor)); } } child = child->next; } config = ags_config_get_instance(); /* presets */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "pcm-channels"); if(str != NULL){ pcm_channels = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "samplerate"); if(str != NULL){ samplerate = g_ascii_strtoull(str, NULL, 10); free(str); } str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "buffer-size"); if(str != NULL){ buffer_size = g_ascii_strtoull(str, NULL, 10); free(str); } str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "format"); if(str != NULL){ format = g_ascii_strtoull(str, NULL, 10); free(str); } /* launch settings */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_window_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_window_launch(AgsFileLaunch *file_launch, AgsWindow *window) { xmlChar *str; gdouble bpm; gdouble loop_start, loop_end; gboolean loop; /* bpm */ str = xmlGetProp(file_launch->node, "bpm"); if(str != NULL){ bpm = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(window->navigation->bpm, bpm); xmlFree(str); } /* loop */ str = xmlGetProp(file_launch->node, "loop"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ gtk_toggle_button_set_active((GtkToggleButton *) window->navigation->loop, FALSE); }else{ gtk_toggle_button_set_active((GtkToggleButton *) window->navigation->loop, TRUE); } xmlFree(str); } /* loop start */ str = xmlGetProp(file_launch->node, "loop-start"); if(str != NULL){ loop_start = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(window->navigation->loop_left_tact, loop_start); xmlFree(str); } /* loop end */ str = xmlGetProp(file_launch->node, "loop-end"); if(str != NULL){ loop_end = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(window->navigation->loop_right_tact, loop_end); xmlFree(str); } } void ags_simple_file_read_machine_list(AgsSimpleFile *simple_file, xmlNode *node, GList **machine) { AgsMachine *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-machine", 11)){ current = NULL; if(*machine != NULL){ GList *iter; iter = g_list_nth(*machine, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_machine(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *machine = list; } void ags_simple_file_read_machine_resize_pads(AgsMachine *machine, GType channel_type, guint new_size, guint old_size, gpointer data) { gboolean *resized; resized = data; if(channel_type == AGS_TYPE_OUTPUT){ resized[0] = TRUE; }else{ resized[1] = TRUE; } } void ags_simple_file_read_machine(AgsSimpleFile *simple_file, xmlNode *node, AgsMachine **machine) { AgsWindow *window; AgsMachine *gobject; AgsConfig *config; AgsFileLaunch *file_launch; AgsApplicationContext *application_context; GObject *soundcard; xmlNode *child; GList *start_list, *list; GList *output_pad; GList *input_pad; xmlChar *device; xmlChar *type_name; xmlChar *audio_name; xmlChar *str; guint audio_channels; guint output_pads, input_pads; gboolean wait_data[2]; gboolean wait_output, wait_input; guint i; gobject = NULL; type_name = NULL; if(*machine != NULL){ gobject = *machine; }else{ type_name = xmlGetProp(node, AGS_SIMPLE_FILE_TYPE_PROP); if(type_name != NULL){ gobject = g_object_new(g_type_from_name(type_name), NULL); xmlFree(type_name); } *machine = gobject; } if(gobject == NULL || !AGS_IS_MACHINE(gobject)){ return; } application_context = ags_application_context_get_instance(); ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", node, "reference", gobject, NULL)); /* retrieve window */ window = ags_ui_provider_get_window(AGS_UI_PROVIDER(application_context)); config = ags_config_get_instance(); /* find soundcard */ soundcard = NULL; device = xmlGetProp(node, "soundcard-device"); start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(device != NULL){ list = start_list; for(i = 0; list != NULL; i++){ str = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(str != NULL){ if(!g_ascii_strcasecmp(str, device)){ soundcard = list->data; break; } } /* iterate soundcard */ list = list->next; } xmlFree(device); } if(soundcard == NULL && start_list != NULL){ soundcard = start_list->data; } g_list_free_full(start_list, g_object_unref); g_object_set(gobject->audio, "output-soundcard", soundcard, NULL); /* audio name */ audio_name = xmlGetProp(node, "audio-name"); if(audio_name != NULL){ g_object_set(gobject->audio, "audio-name", audio_name, NULL); xmlFree(audio_name); } /* machine specific */ if(AGS_IS_LADSPA_BRIDGE(gobject)){ xmlChar *filename, *effect; filename = xmlGetProp(node, "plugin-file"); effect = xmlGetProp(node, "effect"); g_object_set(gobject, "filename", filename, "effect", effect, NULL); if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } }else if(AGS_IS_DSSI_BRIDGE(gobject)){ xmlChar *filename, *effect; filename = xmlGetProp(node, "plugin-file"); effect = xmlGetProp(node, "effect"); g_object_set(gobject, "filename", filename, "effect", effect, NULL); if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } }else if(AGS_IS_LIVE_DSSI_BRIDGE(gobject)){ xmlChar *filename, *effect; filename = xmlGetProp(node, "plugin-file"); effect = xmlGetProp(node, "effect"); g_object_set(gobject, "filename", filename, "effect", effect, NULL); if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } }else if(AGS_IS_LV2_BRIDGE(gobject)){ AgsLv2Plugin *lv2_plugin; xmlChar *filename, *effect; filename = xmlGetProp(node, "plugin-file"); effect = xmlGetProp(node, "effect"); lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL && AGS_BASE_PLUGIN(lv2_plugin)->plugin_port == NULL){ AgsLv2TurtleParser *lv2_turtle_parser; AgsTurtle *manifest; AgsTurtle **turtle; guint n_turtle; g_object_get(lv2_plugin, "manifest", &manifest, NULL); lv2_turtle_parser = ags_lv2_turtle_parser_new(manifest); n_turtle = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); g_object_run_dispose(lv2_turtle_parser); g_object_unref(lv2_turtle_parser); g_object_unref(manifest); free(turtle); } if(lv2_plugin != NULL && (AGS_LV2_PLUGIN_IS_SYNTHESIZER & (lv2_plugin->flags)) != 0){ ags_audio_set_flags(gobject->audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(gobject->audio, (AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(gobject->audio, (AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); gobject->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); ags_machine_popup_add_connection_options((AgsMachine *) gobject, (AGS_MACHINE_POPUP_MIDI_DIALOG)); ags_machine_popup_add_edit_options((AgsMachine *) gobject, (AGS_MACHINE_POPUP_ENVELOPE)); } g_object_set(gobject, "filename", filename, "effect", effect, NULL); if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } }else if(AGS_IS_LIVE_LV2_BRIDGE(gobject)){ AgsLv2Plugin *lv2_plugin; xmlChar *filename, *effect; filename = xmlGetProp(node, "plugin-file"); effect = xmlGetProp(node, "effect"); lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL && AGS_BASE_PLUGIN(lv2_plugin)->plugin_port == NULL){ AgsLv2TurtleParser *lv2_turtle_parser; AgsTurtle *manifest; AgsTurtle **turtle; guint n_turtle; g_object_get(lv2_plugin, "manifest", &manifest, NULL); lv2_turtle_parser = ags_lv2_turtle_parser_new(manifest); n_turtle = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); g_object_run_dispose(lv2_turtle_parser); g_object_unref(lv2_turtle_parser); g_object_unref(manifest); free(turtle); } if(lv2_plugin != NULL && (AGS_LV2_PLUGIN_IS_SYNTHESIZER & (lv2_plugin->flags)) != 0){ ags_audio_set_flags(gobject->audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING | AGS_AUDIO_SYNC | AGS_AUDIO_ASYNC)); ags_audio_set_ability_flags(gobject->audio, (AGS_SOUND_ABILITY_NOTATION)); ags_audio_set_behaviour_flags(gobject->audio, (AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); gobject->flags |= (AGS_MACHINE_IS_SYNTHESIZER | AGS_MACHINE_REVERSE_NOTATION); ags_machine_popup_add_connection_options((AgsMachine *) gobject, (AGS_MACHINE_POPUP_MIDI_DIALOG)); ags_machine_popup_add_edit_options((AgsMachine *) gobject, (AGS_MACHINE_POPUP_ENVELOPE)); } g_object_set(gobject, "filename", filename, "effect", effect, NULL); if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } } gtk_box_pack_start((GtkBox *) window->machines, GTK_WIDGET(gobject), FALSE, FALSE, 0); /* set name if available */ str = xmlGetProp(node, "name"); if(str != NULL){ g_object_set(gobject, "machine-name", str, NULL); xmlFree(str); } /* reverse mapping */ str = xmlGetProp(node, "reverse-mapping"); if(str != NULL && !g_ascii_strncasecmp(str, "true", 5)){ ags_audio_set_behaviour_flags(gobject->audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)); }else{ ags_audio_unset_behaviour_flags(gobject->audio, (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)); } if(str != NULL){ xmlFree(str); } /* connect AgsMachine */ ags_connectable_connect(AGS_CONNECTABLE(gobject)); /* retrieve channel allocation */ output_pads = gobject->audio->output_pads; input_pads = gobject->audio->input_pads; audio_channels = gobject->audio->audio_channels; wait_output = FALSE; wait_input = FALSE; wait_data[0] = FALSE; wait_data[1] = FALSE; g_signal_connect_after(gobject, "resize-pads", G_CALLBACK(ags_simple_file_read_machine_resize_pads), wait_data); str = xmlGetProp(node, "channels"); if(str != NULL){ audio_channels = g_ascii_strtoull(str, NULL, 10); gobject->audio->audio_channels = audio_channels; xmlFree(str); } str = xmlGetProp(node, "input-pads"); if(str != NULL){ input_pads = g_ascii_strtoull(str, NULL, 10); ags_audio_set_pads(gobject->audio, AGS_TYPE_INPUT, input_pads, 0); wait_input = TRUE; xmlFree(str); } str = xmlGetProp(node, "output-pads"); if(str != NULL){ output_pads = g_ascii_strtoull(str, NULL, 10); ags_audio_set_pads(gobject->audio, AGS_TYPE_OUTPUT, output_pads, 0); wait_output = TRUE; xmlFree(str); } /* dispatch */ while((wait_output && !wait_data[0]) || (wait_input && !wait_data[1])){ usleep(AGS_USEC_PER_SEC / 30); g_main_context_iteration(NULL, FALSE); } g_object_disconnect(gobject, "any_signal::resize-pads", G_CALLBACK(ags_simple_file_read_machine_resize_pads), wait_data, NULL); /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-pad-list", 16)){ GList *pad; pad = NULL; ags_simple_file_read_pad_list(simple_file, child, &pad); g_list_free(pad); }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-pad-list", 23)){ GList *effect_pad; effect_pad = NULL; ags_simple_file_read_effect_pad_list(simple_file, child, &effect_pad); g_list_free(effect_pad); }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-list", 19)){ AgsEffectBulk *effect_bulk; xmlNode *effect_list_child; xmlChar *filename, *effect; gboolean is_output; if(AGS_IS_LADSPA_BRIDGE(gobject) || AGS_IS_DSSI_BRIDGE(gobject) || AGS_IS_LIVE_DSSI_BRIDGE(gobject) || AGS_IS_LV2_BRIDGE(gobject) || AGS_IS_LIVE_LV2_BRIDGE(gobject)){ child = child->next; continue; } is_output = TRUE; str = xmlGetProp(child, "is-output"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ is_output = FALSE; } xmlFree(str); } if(is_output){ effect_bulk = (AgsEffectBulk *) AGS_EFFECT_BRIDGE(gobject->bridge)->bulk_output; }else{ effect_bulk = (AgsEffectBulk *) AGS_EFFECT_BRIDGE(gobject->bridge)->bulk_input; } filename = xmlGetProp(child, "filename"); effect = xmlGetProp(child, "effect"); ags_effect_bulk_add_effect(effect_bulk, NULL, filename, effect); if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-oscillator-list", 19)){ if(AGS_IS_SYNCSYNTH(gobject)){ GList *oscillator; GList *start_list, *list; guint count; guint i; start_list = gtk_container_get_children(GTK_CONTAINER(AGS_SYNCSYNTH(gobject)->oscillator)); count = g_list_length(start_list); for(i = 0; i < count; i++){ ags_syncsynth_remove_oscillator((AgsSyncsynth *) gobject, 0); } g_list_free(start_list); oscillator = NULL; ags_simple_file_read_oscillator_list(simple_file, child, &oscillator); list = start_list = g_list_reverse(oscillator); while(list != NULL){ ags_syncsynth_add_oscillator((AgsSyncsynth *) gobject, list->data); list = list->next; } g_list_free(start_list); } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-fm-oscillator-list", 21)){ if(AGS_IS_FM_SYNCSYNTH(gobject)){ GList *fm_oscillator; GList *start_list, *list; guint count; guint i; start_list = gtk_container_get_children(GTK_CONTAINER(AGS_FM_SYNCSYNTH(gobject)->fm_oscillator)); count = g_list_length(start_list); for(i = 0; i < count; i++){ ags_fm_syncsynth_remove_fm_oscillator((AgsFMSyncsynth *) gobject, 0); } g_list_free(start_list); fm_oscillator = NULL; ags_simple_file_read_fm_oscillator_list(simple_file, child, &fm_oscillator); list = start_list = g_list_reverse(fm_oscillator); while(list != NULL){ ags_fm_syncsynth_add_fm_oscillator((AgsFMSyncsynth *) gobject, list->data); list = list->next; } g_list_free(start_list); } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-pattern-list", 20)){ xmlNode *pattern_list_child; /* pattern list children */ pattern_list_child = child->children; while(pattern_list_child != NULL){ if(pattern_list_child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(pattern_list_child->name, (xmlChar *) "ags-sf-pattern", 15)){ AgsChannel *channel; AgsPattern *pattern; GList *list; xmlChar *content; guint line; guint bank_0, bank_1; guint i; /* retrieve channel */ line = 0; str = xmlGetProp(pattern_list_child, "nth-line"); if(str != NULL){ line = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } channel = ags_channel_nth(gobject->audio->input, line); /* retrieve bank */ bank_0 = bank_1 = 0; str = xmlGetProp(pattern_list_child, "bank-0"); if(str != NULL){ bank_0 = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(pattern_list_child, "bank-1"); if(str != NULL){ bank_1 = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* toggle pattern */ pattern = channel->pattern->data; content = xmlNodeGetContent(pattern_list_child); i = 0; if(content != NULL){ for(i = 0; i < pattern->dim[2]; i++){ if(content[i] == '\0'){ break; } if(content[i] == '1'){ ags_pattern_toggle_bit(pattern, bank_0, bank_1, i); } } } if(channel != NULL){ g_object_unref(channel); } } } pattern_list_child = pattern_list_child->next; } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-notation-list", 21)){ gchar *version; guint major, minor; version = xmlGetProp(simple_file->root_node, "version"); major = 0; minor = 0; if(version != NULL){ sscanf(version, "%d.%d", &major, &minor); xmlFree(version); } if(major == 0 || (major == 1 && minor < 2)){ ags_simple_file_read_notation_list_fixup_1_0_to_1_2(simple_file, child, &(gobject->audio->notation)); }else{ ags_simple_file_read_notation_list(simple_file, child, &(gobject->audio->notation)); } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-preset-list", 21)){ GList *preset; preset = NULL; ags_simple_file_read_preset_list(simple_file, child, &preset); g_list_free_full(gobject->audio->preset, g_object_unref); gobject->audio->preset = preset; } } child = child->next; } if(AGS_IS_LADSPA_BRIDGE(gobject)){ ags_ladspa_bridge_load((AgsLadspaBridge *) gobject); }else if(AGS_IS_DSSI_BRIDGE(gobject)){ ags_dssi_bridge_load((AgsDssiBridge *) gobject); }else if(AGS_IS_LIVE_DSSI_BRIDGE(gobject)){ ags_live_dssi_bridge_load((AgsLiveDssiBridge *) gobject); }else if(AGS_IS_LV2_BRIDGE(gobject)){ ags_lv2_bridge_load((AgsLv2Bridge *) gobject); }else if(AGS_IS_LIVE_LV2_BRIDGE(gobject)){ ags_live_lv2_bridge_load((AgsLiveLv2Bridge *) gobject); } /* retrieve midi mapping */ str = xmlGetProp(node, "audio-start-mapping"); if(str != NULL){ g_object_set(gobject->audio, "audio-start-mapping", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } str = xmlGetProp(node, "audio-end-mapping"); if(str != NULL){ g_object_set(gobject->audio, "audio-end-mapping", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } str = xmlGetProp(node, "midi-start-mapping"); if(str != NULL){ g_object_set(gobject->audio, "midi-start-mapping", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } str = xmlGetProp(node, "midi-end-mapping"); if(str != NULL){ g_object_set(gobject->audio, "midi-end-mapping", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } gtk_widget_show_all((GtkWidget *) gobject); /* add audio to soundcard */ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); g_object_ref(G_OBJECT(gobject->audio)); list = g_list_append(start_list, gobject->audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), list); /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-automation-list", 23)){ GList *automation; gchar *version; guint major, minor; version = xmlGetProp(simple_file->root_node, "version"); major = 0; minor = 0; if(version != NULL){ sscanf(version, "%d.%d", &major, &minor); xmlFree(version); } if(major == 0 || (major == 1 && minor < 3)){ ags_simple_file_read_automation_list_fixup_1_0_to_1_3(simple_file, child, &(gobject->audio->automation)); }else{ ags_simple_file_read_automation_list(simple_file, child, &(gobject->audio->automation)); } } } child = child->next; } /* launch AgsMachine */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "file", simple_file, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_machine_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_equalizer10_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsEqualizer10 *equalizer10) { xmlNode *child; child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-equalizer10", 19)){ xmlNode *control_node; control_node = child->children; while(control_node != NULL){ if(control_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(control_node->name, "ags-sf-control", 15)){ xmlChar *specifier; xmlChar *value; gdouble val; specifier = xmlGetProp(control_node, "specifier"); value = xmlGetProp(control_node, "value"); val = 0.0; if(value != NULL){ val = g_strtod(value, NULL); xmlFree(value); if(!xmlStrncmp(specifier, "28 [Hz]", 8)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_28hz), val); }else if(!xmlStrncmp(specifier, "56 [Hz]", 8)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_56hz), val); }else if(!xmlStrncmp(specifier, "112 [Hz]", 9)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_112hz), val); }else if(!xmlStrncmp(specifier, "224 [Hz]", 9)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_224hz), val); }else if(!xmlStrncmp(specifier, "448 [Hz]", 9)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_448hz), val); }else if(!xmlStrncmp(specifier, "896 [Hz]", 9)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_896hz), val); }else if(!xmlStrncmp(specifier, "1792 [Hz]", 10)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_1792hz), val); }else if(!xmlStrncmp(specifier, "3584 [Hz]", 10)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_3584hz), val); }else if(!xmlStrncmp(specifier, "7168 [Hz]", 10)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_7168hz), val); }else if(!xmlStrncmp(specifier, "14336 [Hz]", 11)){ gtk_range_set_value(GTK_RANGE(equalizer10->peak_14336hz), val); }else if(!xmlStrncmp(specifier, "pressure", 9)){ gtk_range_set_value(GTK_RANGE(equalizer10->pressure), val); } } if(specifier != NULL){ xmlFree(specifier); } } } control_node = control_node->next; } break; } } child = child->next; } } void ags_simple_file_read_drum_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsDrum *drum) { xmlChar *str; guint bank_0, bank_1; /* bank 0 */ bank_0 = 0; str = xmlGetProp(node, "bank-0"); if(str != NULL){ bank_0 = g_ascii_strtod(str, NULL); if(bank_0 < 4){ gtk_toggle_button_set_active(drum->index0[bank_0], TRUE); } xmlFree(str); } /* bank 1 */ bank_1 = 0; str = xmlGetProp(node, "bank-1"); if(str != NULL){ bank_1 = g_ascii_strtod(str, NULL); if(bank_1 < 12){ gtk_toggle_button_set_active(drum->index1[bank_1], TRUE); } xmlFree(str); } /* loop */ str = xmlGetProp(node, "loop"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "true")){ gtk_toggle_button_set_active((GtkToggleButton *) drum->loop_button, TRUE); } xmlFree(str); } /* length */ str = xmlGetProp(node, "length"); if(str != NULL){ guint length; length = g_ascii_strtoull(str, NULL, 10); gtk_spin_button_set_value(drum->length_spin, (gdouble) length); xmlFree(str); } } void ags_simple_file_read_matrix_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsMatrix *matrix) { xmlChar *str; guint bank_0, bank_1; /* bank 1 */ bank_1 = 0; str = xmlGetProp(node, "bank-1"); if(str != NULL){ bank_1 = g_ascii_strtod(str, NULL); if(bank_1 < 9){ gtk_toggle_button_set_active(matrix->index[bank_1], TRUE); } xmlFree(str); } /* loop */ str = xmlGetProp(node, "loop"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "true")){ gtk_toggle_button_set_active((GtkToggleButton *) matrix->loop_button, TRUE); } xmlFree(str); } /* length */ str = xmlGetProp(node, "length"); if(str != NULL){ guint length; length = g_ascii_strtoull(str, NULL, 10); gtk_spin_button_set_value(matrix->length_spin, (gdouble) length); xmlFree(str); } } void ags_simple_file_read_synth_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsSynth *synth) { xmlChar *str; /* base note */ str = xmlGetProp(node, "base-note"); if(str != NULL){ gdouble base_note; base_note = g_ascii_strtod(str, NULL); if(base_note > AGS_SYNTH_BASE_NOTE_MIN && base_note < AGS_SYNTH_BASE_NOTE_MAX){ gtk_spin_button_set_value(synth->lower, (gdouble) base_note); } xmlFree(str); } } void ags_simple_file_read_syncsynth_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsSyncsynth *syncsynth) { GList *list, *list_start; GList *child_start; xmlChar *str; gdouble tmp0, tmp1; gdouble loop_upper; /* base note */ str = xmlGetProp(node, "base-note"); if(str != NULL){ gdouble base_note; base_note = g_ascii_strtod(str, NULL); if(base_note > AGS_SYNCSYNTH_BASE_NOTE_MIN && base_note < AGS_SYNCSYNTH_BASE_NOTE_MAX){ gtk_spin_button_set_value(syncsynth->lower, (gdouble) base_note); } xmlFree(str); } /* set range of loop start and loop end */ ags_syncsynth_reset_loop(syncsynth); /* audio loop start */ str = xmlGetProp(node, "audio-loop-start"); if(str != NULL){ guint audio_loop_start; audio_loop_start = g_ascii_strtoull(str, NULL, 10); gtk_spin_button_set_value(syncsynth->loop_start, (gdouble) audio_loop_start); xmlFree(str); } /* audio loop end */ str = xmlGetProp(node, "audio-loop-end"); if(str != NULL){ guint audio_loop_end; audio_loop_end = g_ascii_strtoull(str, NULL, 10); gtk_spin_button_set_value(syncsynth->loop_end, (gdouble) audio_loop_end); xmlFree(str); } } void ags_simple_file_read_pitch_sampler_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsPitchSampler *pitch_sampler) { GtkTreeModel *model; GtkTreeIter iter; xmlChar *str; gchar *value; str = xmlGetProp(node, "filename"); gtk_entry_set_text(pitch_sampler->filename, str); ags_pitch_sampler_open_filename(pitch_sampler, str); if(str != NULL){ xmlFree(str); } str = xmlGetProp(node, "lfo-freq"); if(str != NULL){ gtk_spin_button_set_value(pitch_sampler->lfo_freq, g_ascii_strtod(str, NULL)); xmlFree(str); } str = xmlGetProp(node, "lfo-phase"); if(str != NULL){ gtk_spin_button_set_value(pitch_sampler->lfo_phase, g_ascii_strtod(str, NULL)); xmlFree(str); } str = xmlGetProp(node, "lfo-depth"); if(str != NULL){ gtk_spin_button_set_value(pitch_sampler->lfo_depth, g_ascii_strtod(str, NULL)); xmlFree(str); } str = xmlGetProp(node, "lfo-tuning"); if(str != NULL){ gtk_spin_button_set_value(pitch_sampler->lfo_tuning, g_ascii_strtod(str, NULL)); xmlFree(str); } if(pitch_sampler->audio_container == NULL){ return; } } #ifdef AGS_WITH_LIBINSTPATCH void ags_simple_file_read_ffplayer_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsFFPlayer *ffplayer) { GtkTreeModel *model; GtkTreeIter iter; xmlChar *str; gchar *value; str = xmlGetProp(node, "filename"); ags_ffplayer_open_filename(ffplayer, str); if(str != NULL){ xmlFree(str); } if(ffplayer->audio_container == NULL){ return; } /* preset */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(ffplayer->preset)); str = xmlGetProp(node, "preset"); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) ffplayer->preset, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(str != NULL){ xmlFree(str); } /* instrument */ model = gtk_combo_box_get_model(GTK_COMBO_BOX(ffplayer->instrument)); str = xmlGetProp(node, "instrument"); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) ffplayer->instrument, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(str != NULL){ xmlFree(str); } } #endif void ags_simple_file_read_audiorec_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsAudiorec *audiorec) { xmlChar *str; gchar *value; str = xmlGetProp(node, "filename"); ags_audiorec_open_filename(audiorec, str); if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_dssi_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsDssiBridge *dssi_bridge) { GtkTreeModel *model; GtkTreeIter iter; xmlChar *str; gchar *value; /* program */ //NOTE:JK: work-around gtk_combo_box_set_active((GtkComboBox *) dssi_bridge->program, 0); model = gtk_combo_box_get_model((GtkComboBox *) dssi_bridge->program); str = xmlGetProp(node, "program"); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) dssi_bridge->program, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_live_dssi_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsLiveDssiBridge *live_dssi_bridge) { GtkTreeModel *model; GtkTreeIter iter; xmlChar *str; gchar *value; /* program */ //NOTE:JK: work-around gtk_combo_box_set_active((GtkComboBox *) live_dssi_bridge->program, 0); model = gtk_combo_box_get_model((GtkComboBox *) live_dssi_bridge->program); str = xmlGetProp(node, "program"); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) live_dssi_bridge->program, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_lv2_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsLv2Bridge *lv2_bridge) { GtkTreeModel *model; GtkTreeIter iter; xmlChar *str; gchar *value; if(lv2_bridge->preset == NULL){ return; } /* program */ //NOTE:JK: work-around gtk_combo_box_set_active((GtkComboBox *) lv2_bridge->preset, 0); model = gtk_combo_box_get_model((GtkComboBox *) lv2_bridge->preset); str = xmlGetProp(node, "preset"); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) lv2_bridge->preset, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_live_lv2_bridge_launch(AgsSimpleFile *simpleFile, xmlNode *node, AgsLiveLv2Bridge *live_lv2_bridge) { GtkTreeModel *model; GtkTreeIter iter; xmlChar *str; gchar *value; if(live_lv2_bridge->preset == NULL){ return; } /* program */ //NOTE:JK: work-around gtk_combo_box_set_active((GtkComboBox *) live_lv2_bridge->preset, 0); model = gtk_combo_box_get_model((GtkComboBox *) live_lv2_bridge->preset); str = xmlGetProp(node, "preset"); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) live_lv2_bridge->preset, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_effect_bridge_launch(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectBridge *effect_bridge) { AgsMachine *machine; AgsEffectBulk *effect_bulk; xmlNode *child; xmlChar *str; gboolean is_output; machine = gtk_widget_get_ancestor(effect_bridge, AGS_TYPE_MACHINE); is_output = TRUE; str = xmlGetProp(node, "is-output"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ is_output = FALSE; } xmlFree(str); } if(is_output){ effect_bulk = (AgsEffectBulk *) AGS_EFFECT_BRIDGE(machine->bridge)->bulk_output; }else{ effect_bulk = (AgsEffectBulk *) AGS_EFFECT_BRIDGE(machine->bridge)->bulk_input; } /* effect list children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect", 14)){ ags_simple_file_read_effect_bulk_launch(simple_file, child, effect_bulk); } } child = child->next; } } void ags_simple_file_read_effect_bulk_launch(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectBulk *effect_bulk) { xmlNode *child; xmlChar *filename, *effect; filename = xmlGetProp(node, "filename"); effect = xmlGetProp(node, "effect"); /* effect list children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-control", 15)){ GList *list_start, *list; xmlChar *specifier; specifier = xmlGetProp(child, "specifier"); list_start = gtk_container_get_children(GTK_CONTAINER(effect_bulk->table)); list = list_start; while(list != NULL){ if(AGS_IS_BULK_MEMBER(list->data)){ AgsBulkMember *bulk_member; bulk_member = AGS_BULK_MEMBER(list->data); if(!g_strcmp0(bulk_member->filename, filename) && !g_strcmp0(bulk_member->effect, effect) && !g_strcmp0(bulk_member->specifier, specifier)){ ags_simple_file_read_bulk_member_launch(simple_file, child, bulk_member); break; } } list = list->next; } if(specifier != NULL){ xmlFree(specifier); } g_list_free(list_start); } } child = child->next; } if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } } void ags_simple_file_read_bulk_member_launch(AgsSimpleFile *simple_file, xmlNode *node, AgsBulkMember *bulk_member) { GtkWidget *child_widget; xmlChar *str; gchar *version; gdouble val; guint major, minor, micro; /* logarithmic port fixup */ version = xmlGetProp(simple_file->root_node, "version"); major = 0; minor = 0; micro = 0; if(version != NULL){ sscanf(version, "%d.%d.%d", &major, &minor, µ); xmlFree(version); } str = xmlGetProp(node, "value"); child_widget = gtk_bin_get_child((GtkBin *) bulk_member); if(GTK_IS_RANGE(child_widget)){ if(str != NULL){ val = g_ascii_strtod(str, NULL); if(bulk_member->conversion != NULL && major == 1 || (major == 2 && minor < 2 || (minor == 2 && micro <= 8))){ val = ags_conversion_convert(bulk_member->conversion, val, TRUE); } gtk_range_set_value(GTK_RANGE(child_widget), val); } }else if(GTK_IS_SPIN_BUTTON(child_widget)){ if(str != NULL){ val = g_ascii_strtod(str, NULL); if(bulk_member->conversion != NULL && major == 1 || (major == 2 && minor < 2 || (minor == 2 && micro <= 8))){ val = ags_conversion_convert(bulk_member->conversion, val, TRUE); } gtk_spin_button_set_value(GTK_SPIN_BUTTON(child_widget), val); } }else if(AGS_IS_DIAL(child_widget)){ if(str != NULL){ val = g_ascii_strtod(str, NULL); if(bulk_member->conversion != NULL && major == 1 || (major == 2 && minor < 2 || (minor == 2 && micro <= 8))){ val = ags_conversion_convert(bulk_member->conversion, val, TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, val); gtk_widget_queue_draw((AgsDial *) child_widget); } }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ if(str != NULL){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, ((!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE)); } }else{ g_warning("ags_simple_file_read_bulk_member_launch() - unknown bulk member type"); } if(str != NULL){ xmlFree(str); } } void ags_simple_file_read_machine_launch(AgsFileLaunch *file_launch, AgsMachine *machine) { xmlNode *child; xmlChar *str; if(AGS_IS_EQUALIZER10(machine)){ ags_simple_file_read_equalizer10_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsEqualizer10 *) machine); }else if(AGS_IS_DRUM(machine)){ ags_simple_file_read_drum_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsDrum *) machine); }else if(AGS_IS_MATRIX(machine)){ ags_simple_file_read_matrix_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsMatrix *) machine); }else if(AGS_IS_SYNTH(machine)){ ags_simple_file_read_synth_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsSynth *) machine); }else if(AGS_IS_SYNCSYNTH(machine)){ ags_simple_file_read_syncsynth_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsSyncsynth *) machine); }else if(AGS_IS_PITCH_SAMPLER(machine)){ ags_simple_file_read_pitch_sampler_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsPitchSampler *) machine); #ifdef AGS_WITH_LIBINSTPATCH }else if(AGS_IS_FFPLAYER(machine)){ ags_simple_file_read_ffplayer_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsFFPlayer *) machine); #endif }else if(AGS_IS_AUDIOREC(machine)){ ags_simple_file_read_audiorec_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsAudiorec *) machine); }else if(AGS_IS_DSSI_BRIDGE(machine)){ ags_simple_file_read_dssi_bridge_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsDssiBridge *) machine); }else if(AGS_IS_DSSI_BRIDGE(machine)){ ags_simple_file_read_live_dssi_bridge_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsLiveDssiBridge *) machine); }else if(AGS_IS_LV2_BRIDGE(machine)){ ags_simple_file_read_lv2_bridge_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsLv2Bridge *) machine); }else if(AGS_IS_LV2_BRIDGE(machine)){ ags_simple_file_read_live_lv2_bridge_launch((AgsSimpleFile *) file_launch->file, file_launch->node, (AgsLiveLv2Bridge *) machine); } /* children */ child = file_launch->node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 21)){ GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) file_launch->file, child, &property_start); property = property_start; while(property != NULL){ g_object_set_property((GObject *) machine, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); property = property->next; } g_list_free_full(property_start, g_free); }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-list", 19)){ ags_simple_file_read_effect_bridge_launch((AgsSimpleFile *) file_launch->file, child, (AgsEffectBridge *) machine->bridge); } } child = child->next; } } void ags_simple_file_read_pad_list(AgsSimpleFile *simple_file, xmlNode *node, GList **pad) { AgsPad *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-pad", 11)){ current = NULL; if(*pad != NULL){ GList *iter; iter = g_list_nth(*pad, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_pad(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *pad = list; } void ags_simple_file_read_pad(AgsSimpleFile *simple_file, xmlNode *node, AgsPad **pad) { AgsMachine *machine; AgsPad *gobject; AgsFileLaunch *file_launch; AgsFileIdRef *file_id_ref; xmlNode *child; GList *list, *list_start; xmlChar *str; guint nth_pad; gboolean is_output; if(pad != NULL && pad[0] != NULL){ gobject = pad[0]; nth_pad = gobject->channel->pad; }else{ file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); machine = file_id_ref->ref; if(!AGS_IS_MACHINE(machine)){ return; } /* get nth pad */ nth_pad = 0; str = xmlGetProp(node, "nth-pad"); if(str != NULL){ nth_pad = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* retrieve pad */ gobject = NULL; str = xmlGetProp(node->parent, "is-output"); is_output = TRUE; if(!g_ascii_strcasecmp(str, "false")){ is_output = FALSE; } if(str != NULL){ xmlFree(str); } list_start = NULL; if(!is_output){ if(machine->input != NULL){ list_start = gtk_container_get_children((GtkContainer *) machine->input); } }else{ if(machine->output != NULL){ list_start = gtk_container_get_children((GtkContainer *) machine->output); } } list = g_list_nth(list_start, nth_pad); if(list != NULL){ gobject = AGS_PAD(list->data); } g_list_free(list_start); } ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", node, "reference", gobject, NULL)); /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-line-list", 17)){ GList *line; line = NULL; ags_simple_file_read_line_list(simple_file, child, &line); g_list_free(line); } } child = child->next; } if(AGS_IS_CONNECTABLE(gobject)){ ags_connectable_connect(AGS_CONNECTABLE(gobject)); } /* launch AgsPad */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_pad_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_pad_launch(AgsFileLaunch *file_launch, AgsPad *pad) { xmlNode *child; xmlChar *str; if(AGS_IS_PAD(pad)){ str = xmlGetProp(file_launch->node, "group"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ gtk_toggle_button_set_active(pad->group, FALSE); } xmlFree(str); } str = xmlGetProp(file_launch->node, "mute"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "true")){ gtk_toggle_button_set_active(pad->mute, TRUE); } xmlFree(str); } str = xmlGetProp(file_launch->node, "solo"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "true")){ gtk_toggle_button_set_active(pad->solo, TRUE); } xmlFree(str); } } /* children */ child = file_launch->node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 21)){ GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) file_launch->file, child, &property_start); property = property_start; while(property != NULL){ g_object_set_property((GObject *) pad, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); property = property->next; } g_list_free_full(property_start, g_free); } } child = child->next; } } void ags_simple_file_read_line_list(AgsSimpleFile *simple_file, xmlNode *node, GList **line) { AgsLine *current; GList *list; xmlNode *child; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-line", 12)){ current = NULL; if(line[0] != NULL){ GList *iter; iter = g_list_nth(line[0], i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_line(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *line = list; } void ags_simple_file_read_line_member(AgsSimpleFile *simple_file, xmlNode *node, AgsLineMember *line_member) { GtkWidget *child_widget; xmlChar *str; gdouble val; line_member->flags |= AGS_LINE_MEMBER_APPLY_INITIAL; str = xmlGetProp(node, "control-type"); if(str != NULL){ g_object_set(line_member, "widget-type", g_type_from_name(str), NULL); xmlFree(str); } child_widget = gtk_bin_get_child((GtkBin *) line_member); /* apply value */ str = xmlGetProp(node, "value"); if(str != NULL){ gchar *version; guint major, minor, micro; /* logarithmic port fixup */ version = xmlGetProp(simple_file->root_node, "version"); major = 0; minor = 0; micro = 0; if(version != NULL){ sscanf(version, "%d.%d.%d", &major, &minor, µ); xmlFree(version); } if(AGS_IS_DIAL(child_widget)){ val = g_ascii_strtod(str, NULL); if(line_member->conversion != NULL && major == 1 || (major == 2 && minor < 2 || (minor == 2 && micro <= 8))){ val = ags_conversion_convert(line_member->conversion, val, TRUE); } gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, val); }else if(GTK_IS_RANGE(child_widget)){ val = g_ascii_strtod(str, NULL); if(line_member->conversion != NULL && major == 1 || (major == 2 && minor < 2 || (minor == 2 && micro <= 8))){ val = ags_conversion_convert(line_member->conversion, val, TRUE); } gtk_range_set_value(GTK_RANGE(child_widget), val); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ val = g_ascii_strtod(str, NULL); if(line_member->conversion != NULL && major == 1 || (major == 2 && minor < 2 || (minor == 2 && micro <= 8))){ val = ags_conversion_convert(line_member->conversion, val, TRUE); } gtk_spin_button_set_value(GTK_SPIN_BUTTON(child_widget), val); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, ((!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE)); }else{ g_warning("ags_simple_file_read_line() - unknown line member type"); } xmlFree(str); } } void ags_simple_file_read_line(AgsSimpleFile *simple_file, xmlNode *node, AgsLine **line) { AgsPad *pad; GObject *gobject; AgsFileLaunch *file_launch; AgsFileIdRef *file_id_ref; AgsApplicationContext *application_context; AgsConfig *config; GObject *soundcard; xmlNode *child; GList *start_list, *list; xmlChar *device; xmlChar *str; guint nth_line; guint i; pad = NULL; if(line != NULL && line[0] != NULL){ gobject = G_OBJECT(line[0]); nth_line = AGS_LINE(gobject)->channel->line; }else{ GList *list_start, *list; file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); if(!AGS_IS_PAD(file_id_ref->ref)){ pad = NULL; }else{ pad = file_id_ref->ref; } /* get nth-line */ nth_line = 0; str = xmlGetProp(node, "nth-line"); if(str != NULL){ nth_line = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* retrieve line or channel */ gobject = NULL; if(pad != NULL){ list_start = gtk_container_get_children((GtkContainer *) pad->expander_set); list = list_start; while(list != NULL){ if(AGS_IS_LINE(list->data) && AGS_LINE(list->data)->channel->line == nth_line){ gobject = list->data; break; } list = list->next; } if(list_start != NULL){ g_list_free(list_start); } }else{ AgsMachine *machine; gboolean is_output; // "./ancestor::*[self::ags-sf-machine][1]" file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent->parent->parent); machine = file_id_ref->ref; if(!AGS_IS_MACHINE(machine)){ return; } is_output = TRUE; str = xmlGetProp(node->parent->parent->parent, "is-output"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ is_output = FALSE; } xmlFree(str); } if(is_output){ gobject = (GObject *) ags_channel_nth(machine->audio->output, nth_line); if(gobject != NULL){ g_object_unref(gobject); } }else{ gobject = (GObject *) ags_channel_nth(machine->audio->input, nth_line); if(gobject != NULL){ g_object_unref(gobject); } } } } ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", node, "reference", gobject, NULL)); /* device */ application_context = ags_application_context_get_instance(); config = ags_config_get_instance(); /* find soundcard */ start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); soundcard = NULL; device = xmlGetProp(node, "soundcard-device"); if(device != NULL){ list = start_list; for(i = 0; list != NULL; i++){ str = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(str != NULL && !g_ascii_strcasecmp(str, device)){ soundcard = list->data; break; } /* iterate soundcard */ list = list->next; } xmlFree(device); } if(soundcard == NULL && start_list != NULL){ soundcard = start_list->data; } g_list_free_full(start_list, g_object_unref); if(AGS_IS_LINE(gobject)){ g_object_set(AGS_LINE(gobject)->channel, "output-soundcard", soundcard, NULL); }else if(AGS_IS_CHANNEL(gobject)){ g_object_set(AGS_CHANNEL(gobject), "output-soundcard", soundcard, NULL); } /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-list", 19) && AGS_IS_LINE(gobject)){ xmlNode *effect_list_child; GList *mapped_filename, *mapped_effect; /* effect list children */ effect_list_child = child->children; mapped_filename = NULL; mapped_effect = NULL; while(effect_list_child != NULL){ if(effect_list_child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(effect_list_child->name, (xmlChar *) "ags-sf-effect", 14)){ xmlNode *effect_child; xmlChar *filename, *effect; filename = xmlGetProp(effect_list_child, "filename"); effect = xmlGetProp(effect_list_child, "effect"); if(filename != NULL && effect != NULL){ if(g_list_find_custom(mapped_filename, filename, (GCompareFunc) g_strcmp0) == NULL || g_list_find_custom(mapped_effect, effect, (GCompareFunc) g_strcmp0) == NULL){ mapped_filename = g_list_prepend(mapped_filename, filename); mapped_effect = g_list_prepend(mapped_effect, effect); if(AGS_IS_LINE(gobject)){ GList *recall_list; recall_list = ags_channel_add_effect(AGS_LINE(gobject)->channel, filename, effect); g_list_free(recall_list); }else if(AGS_IS_CHANNEL(gobject)){ GList *recall_list; recall_list = ags_channel_add_effect((AgsChannel *) gobject, filename, effect); g_list_free(recall_list); } } } /* effect list children */ effect_child = effect_list_child->children; while(effect_child != NULL){ if(effect_child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(effect_child->name, (xmlChar *) "ags-sf-control", 15)){ AgsLineMember *line_member; GList *list_start, *list; xmlChar *specifier; specifier = xmlGetProp(effect_child, "specifier"); list = list_start = gtk_container_get_children((GtkContainer *) AGS_LINE(gobject)->expander->table); while(list != NULL){ if(AGS_IS_LINE_MEMBER(list->data)){ line_member = AGS_LINE_MEMBER(list->data); if(((filename == NULL && effect == NULL) || (strlen(filename) == 0 && strlen(effect) == 0) || (!g_strcmp0(line_member->filename, filename) && !g_strcmp0(line_member->effect, effect))) && !g_strcmp0(line_member->specifier, specifier)){ ags_simple_file_read_line_member(simple_file, effect_child, line_member); break; } } list = list->next; } if(specifier != NULL){ xmlFree(specifier); } if(list_start != NULL){ g_list_free(list_start); } } } effect_child = effect_child->next; } if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } } } effect_list_child = effect_list_child->next; } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-oscillator", 15)){ if(AGS_IS_SYNTH_INPUT_LINE(gobject)){ ags_simple_file_read_oscillator(simple_file, child, &(AGS_SYNTH_INPUT_LINE(gobject)->oscillator)); } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-fm-oscillator", 17)){ if(AGS_IS_FM_SYNTH_INPUT_LINE(gobject)){ ags_simple_file_read_fm_oscillator(simple_file, child, &(AGS_FM_SYNTH_INPUT_LINE(gobject)->fm_oscillator)); } }else if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 14)){ GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) simple_file, child, &property_start); property = property_start; while(property != NULL){ g_object_set_property((GObject *) pad, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); property = property->next; } g_list_free_full(property_start, g_free); } } child = child->next; } // ags_connectable_connect(AGS_CONNECTABLE(gobject)); /* launch AgsLine */ if(AGS_IS_LINE(gobject)){ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "file", simple_file, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_line_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); }else if(AGS_IS_CHANNEL(gobject)){ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "file", simple_file, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_channel_line_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); }else{ g_warning("ags_simple_file_read_line() - failed"); } } void ags_simple_file_read_line_launch(AgsFileLaunch *file_launch, AgsLine *line) { AgsMachine *machine; AgsChannel *channel, *link; xmlNode *child; GList *xpath_result; xmlChar *str; guint nth_line; gboolean is_output; machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) line, AGS_TYPE_MACHINE); /* link or file */ is_output = TRUE; str = xmlGetProp(file_launch->node->parent->parent->parent, "is-output"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ is_output = FALSE; } xmlFree(str); } nth_line = 0; str = xmlGetProp(file_launch->node, "nth-line"); if(str != NULL){ nth_line = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } if(is_output){ channel = ags_channel_nth(machine->audio->output, nth_line); }else{ channel = ags_channel_nth(machine->audio->input, nth_line); } str = xmlGetProp(file_launch->node, "filename"); if(str != NULL && !g_ascii_strncasecmp(str, "file://", 7)){ AgsAudioFile *audio_file; AgsAudioFileLink *file_link; GList *audio_signal_list; gchar *filename; guint file_channel; /* filename */ filename = g_strdup(&(str[7])); xmlFree(str); /* audio channel to read */ file_channel = 0; str = xmlGetProp(file_launch->node, "file-channel"); if(str != NULL){ file_channel = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* read audio signal */ audio_file = ags_audio_file_new(filename, machine->audio->output_soundcard, file_channel); ags_audio_file_open(audio_file); ags_audio_file_read_audio_signal(audio_file); /* add audio signal */ audio_signal_list = audio_file->audio_signal; file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, "filename", filename, "audio-channel", file_channel, NULL); g_object_set(G_OBJECT(channel), "file-link", file_link, NULL); g_object_unref(file_link); if(audio_signal_list != NULL){ AGS_AUDIO_SIGNAL(audio_signal_list->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(channel->first_recycling, audio_signal_list->data); } }else{ if(str != NULL){ xmlFree(str); } str = xmlGetProp(file_launch->node, "link"); xpath_result = NULL; if(str != NULL){ xpath_result = ags_simple_file_find_id_ref_by_xpath((AgsSimpleFile *) file_launch->file, str); xmlFree(str); } while(xpath_result != NULL){ AgsFileIdRef *file_id_ref; file_id_ref = xpath_result->data; if(AGS_IS_CHANNEL(file_id_ref->ref)){ GError *error; link = file_id_ref->ref; error = NULL; ags_channel_set_link(channel, link, &error); if(error != NULL){ g_warning("ags_simple_file_read_line_launch() - %s", error->message); g_error_free(error); } break; }else if(AGS_IS_LINE(file_id_ref->ref)){ GError *error; link = AGS_LINE(file_id_ref->ref)->channel; error = NULL; ags_channel_set_link(channel, link, &error); if(error != NULL){ g_warning("ags_simple_file_read_line_launch() - %s", error->message); g_error_free(error); } break; } xpath_result = xpath_result->next; } } /* is-grouped */ if(AGS_IS_LINE(line)){ str = xmlGetProp(file_launch->node, "group"); if(str != NULL){ if(!g_ascii_strcasecmp(str, "false")){ gtk_toggle_button_set_active(line->group, FALSE); } xmlFree(str); } } /* children */ child = file_launch->node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 21)){ GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) file_launch->file, child, &property_start); property = property_start; while(property != NULL){ g_object_set_property((GObject *) line, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); property = property->next; } g_list_free_full(property_start, g_free); } } child = child->next; } if(channel != NULL){ g_object_unref(channel); } } void ags_simple_file_read_channel_line_launch(AgsFileLaunch *file_launch, AgsChannel *channel) { AgsChannel *link; xmlNode *child; GList *xpath_result; xmlChar *str; str = xmlGetProp(file_launch->node, "filename"); if(str != NULL && !g_ascii_strncasecmp(str, "file://", 7)){ AgsAudioFile *audio_file; AgsAudioFileLink *file_link; GList *audio_signal_list; gchar *filename; guint file_channel; /* filename */ filename = g_strdup(&(str[7])); xmlFree(str); /* audio channel to read */ file_channel = 0; str = xmlGetProp(file_launch->node, "file-channel"); if(str != NULL){ file_channel = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* read audio signal */ audio_file = ags_audio_file_new(filename, channel->output_soundcard, file_channel); ags_audio_file_open(audio_file); ags_audio_file_read_audio_signal(audio_file); /* add audio signal */ audio_signal_list = audio_file->audio_signal; file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, "filename", filename, "audio-channel", file_channel, NULL); g_object_set(G_OBJECT(channel), "file-link", file_link, NULL); g_object_unref(file_link); if(audio_signal_list != NULL){ AGS_AUDIO_SIGNAL(audio_signal_list->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(channel->first_recycling, audio_signal_list->data); } }else{ if(str != NULL){ xmlFree(str); } str = xmlGetProp(file_launch->node, "link"); xpath_result = NULL; if(str != NULL){ xpath_result = ags_simple_file_find_id_ref_by_xpath((AgsSimpleFile *) file_launch->file, str); xmlFree(str); } while(xpath_result != NULL){ AgsFileIdRef *file_id_ref; file_id_ref = xpath_result->data; if(AGS_IS_CHANNEL(file_id_ref->ref)){ GError *error; link = file_id_ref->ref; error = NULL; ags_channel_set_link(channel, link, &error); if(error != NULL){ g_warning("ags_simple_file_read_line_launch() - %s", error->message); g_error_free(error); } break; }else if(AGS_IS_LINE(file_id_ref->ref)){ GError *error; link = AGS_LINE(file_id_ref->ref)->channel; error = NULL; ags_channel_set_link(channel, link, &error); if(error != NULL){ g_warning("ags_simple_file_read_line_launch() - %s", error->message); g_error_free(error); } break; } xpath_result = xpath_result->next; } } } void ags_simple_file_read_effect_pad_list(AgsSimpleFile *simple_file, xmlNode *node, GList **effect_pad) { AgsEffectPad *current; GList *list; xmlNode *child; child = node->children; list = NULL; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-pad", 11)){ current = NULL; ags_simple_file_read_effect_pad(simple_file, child, ¤t); list = g_list_prepend(list, current); } } child = child->next; } list = g_list_reverse(list); *effect_pad = list; } void ags_simple_file_read_effect_pad(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectPad **effect_pad) { AgsEffectPad *gobject; AgsFileLaunch *file_launch; xmlNode *child; if(*effect_pad != NULL){ gobject = *effect_pad; }else{ return; } /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-line-list", 24)){ GList *list; list = NULL; ags_simple_file_read_effect_line_list(simple_file, child, &list); g_list_free(list); } } child = child->next; } /* launch AgsEffectPad */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_effect_pad_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_effect_pad_launch(AgsFileLaunch *file_launch, AgsEffectPad *effect_pad) { /* empty */ } void ags_simple_file_read_effect_line_list(AgsSimpleFile *simple_file, xmlNode *node, GList **effect_line) { AgsEffectLine *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-line", 11)){ current = NULL; if(*effect_line != NULL){ GList *iter; iter = g_list_nth(*effect_line, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_effect_line(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *effect_line = list; } void ags_simple_file_read_effect_line(AgsSimpleFile *simple_file, xmlNode *node, AgsEffectLine **effect_line) { AgsEffectLine *gobject; AgsFileLaunch *file_launch; xmlNode *child; xmlChar *str; if(*effect_line != NULL){ gobject = *effect_line; }else{ return; } /* children */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-effect-list", 19)){ xmlNode *effect_list_child; /* effect list children */ effect_list_child = child->children; while(effect_list_child != NULL){ if(effect_list_child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(effect_list_child->name, (xmlChar *) "ags-sf-effect", 14)){ xmlNode *effect_child; xmlChar *filename, *effect; filename = xmlGetProp(effect_list_child, "filename"); effect = xmlGetProp(effect_list_child, "effect"); /* effect list children */ effect_child = child->children; while(effect_child != NULL){ if(effect_child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(effect_child->name, (xmlChar *) "ags-sf-control", 15)){ AgsLineMember *line_member; GtkWidget *child_widget; GList *list_start, *list; xmlChar *specifier; gdouble val; specifier = xmlGetProp(effect_child, "specifier"); str = xmlGetProp(effect_child, "value"); if(str != NULL){ val = g_ascii_strtod(str, NULL); xmlFree(str); list = list_start = gtk_container_get_children((GtkContainer *) gobject->table); while(list != NULL){ if(AGS_IS_LINE_MEMBER(list->data)){ line_member = AGS_LINE_MEMBER(list->data); if(!g_strcmp0(line_member->filename, filename) && !g_strcmp0(line_member->effect, effect) && !g_strcmp0(line_member->specifier, specifier)){ child_widget = gtk_bin_get_child((GtkBin *) line_member); if(GTK_IS_RANGE(child_widget)){ gtk_range_set_value(GTK_RANGE(child_widget), val); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ gtk_spin_button_set_value(GTK_SPIN_BUTTON(child_widget), val); }else if(AGS_IS_DIAL(child_widget)){ gtk_adjustment_set_value(AGS_DIAL(child_widget)->adjustment, val); gtk_widget_queue_draw((AgsDial *) child_widget); }else if(GTK_IS_TOGGLE_BUTTON(child_widget)){ gtk_toggle_button_set_active((GtkToggleButton *) child_widget, ((val != 0.0) ? TRUE: FALSE)); }else{ g_warning("ags_simple_file_read_effect_line() - unknown line member type"); } break; } } list = list->next; } g_list_free(list_start); } } } effect_child = effect_child->next; } if(filename != NULL){ xmlFree(filename); } if(effect != NULL){ xmlFree(effect); } } } effect_list_child = effect_list_child->next; } } } child = child->next; } /* launch AgsEffectLine */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_effect_line_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_effect_line_launch(AgsFileLaunch *file_launch, AgsEffectLine *effect_line) { /* empty */ } void ags_simple_file_read_oscillator_list(AgsSimpleFile *simple_file, xmlNode *node, GList **oscillator) { AgsOscillator *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-oscillator", 14)){ current = NULL; if(*oscillator != NULL){ GList *iter; iter = g_list_nth(*oscillator, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_oscillator(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *oscillator = list; } void ags_simple_file_read_oscillator(AgsSimpleFile *simple_file, xmlNode *node, AgsOscillator **oscillator) { AgsOscillator *gobject; xmlChar *str; gdouble val; guint nth; if(*oscillator != NULL){ gobject = AGS_OSCILLATOR(oscillator[0]); }else{ gobject = ags_oscillator_new(); *oscillator = gobject; } str = xmlGetProp(node, "wave"); if(str != NULL){ nth = g_ascii_strtoull(str, NULL, 10); gtk_combo_box_set_active(gobject->wave, nth); xmlFree(str); } str = xmlGetProp(node, "attack"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->attack, val); xmlFree(str); } str = xmlGetProp(node, "frequency"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->frequency, val); xmlFree(str); } str = xmlGetProp(node, "length"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->frame_count, val); xmlFree(str); } str = xmlGetProp(node, "phase"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->phase, val); xmlFree(str); } str = xmlGetProp(node, "volume"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->volume, val); xmlFree(str); } str = xmlGetProp(node, "sync"); if(str != NULL && !xmlStrncmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) gobject->do_sync, TRUE); xmlFree(str); } str = xmlGetProp(node, "sync-point"); if(str != NULL){ gchar *endptr; gdouble current; guint i; endptr = str; for(i = 0; endptr[0] != '\0' && i < 2 * gobject->sync_point_count; i++){ current = g_strtod(endptr, &endptr); gtk_spin_button_set_value(gobject->sync_point[i], current); if(endptr[0] != '\0'){ endptr++; } } xmlFree(str); } } void ags_simple_file_read_fm_oscillator_list(AgsSimpleFile *simple_file, xmlNode *node, GList **fm_oscillator) { AgsFMOscillator *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-fm-oscillator", 14)){ current = NULL; if(*fm_oscillator != NULL){ GList *iter; iter = g_list_nth(*fm_oscillator, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_fm_oscillator(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *fm_oscillator = list; } void ags_simple_file_read_fm_oscillator(AgsSimpleFile *simple_file, xmlNode *node, AgsFMOscillator **fm_oscillator) { AgsFMOscillator *gobject; xmlChar *str; gdouble val; guint nth; if(*fm_oscillator != NULL){ gobject = AGS_FM_OSCILLATOR(fm_oscillator[0]); }else{ gobject = ags_fm_oscillator_new(); *fm_oscillator = gobject; } str = xmlGetProp(node, "wave"); if(str != NULL){ nth = g_ascii_strtoull(str, NULL, 10); gtk_combo_box_set_active(gobject->wave, nth); xmlFree(str); } str = xmlGetProp(node, "attack"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->attack, val); xmlFree(str); } str = xmlGetProp(node, "frequency"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->frequency, val); xmlFree(str); } str = xmlGetProp(node, "length"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->frame_count, val); xmlFree(str); } str = xmlGetProp(node, "phase"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->phase, val); xmlFree(str); } str = xmlGetProp(node, "volume"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->volume, val); xmlFree(str); } str = xmlGetProp(node, "sync"); if(str != NULL && !xmlStrncmp(str, "true", 5)){ gtk_toggle_button_set_active((GtkToggleButton *) gobject->do_sync, TRUE); xmlFree(str); } str = xmlGetProp(node, "sync-point"); if(str != NULL){ gchar *endptr; gdouble current; guint i; endptr = str; for(i = 0; endptr[0] != '\0' && i < 2 * gobject->sync_point_count; i++){ current = g_strtod(endptr, &endptr); gtk_spin_button_set_value(gobject->sync_point[i], current); if(endptr[0] != '\0'){ endptr++; } } xmlFree(str); } /* FM LFO */ str = xmlGetProp(node, "fm-lfo-wave"); if(str != NULL){ nth = g_ascii_strtoull(str, NULL, 10); gtk_combo_box_set_active(gobject->fm_lfo_wave, nth); xmlFree(str); } str = xmlGetProp(node, "fm-lfo-frequency"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->fm_lfo_frequency, val); xmlFree(str); } str = xmlGetProp(node, "fm-lfo-depth"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->fm_lfo_depth, val); xmlFree(str); } str = xmlGetProp(node, "fm-tuning"); if(str != NULL){ val = g_ascii_strtod(str, NULL); gtk_spin_button_set_value(gobject->fm_tuning, val); xmlFree(str); } } void ags_simple_file_read_notation_editor(AgsSimpleFile *simple_file, xmlNode *node, AgsNotationEditor **notation_editor) { AgsNotationEditor *gobject; AgsFileLaunch *file_launch; if(*notation_editor != NULL){ gobject = *notation_editor; }else{ return; } /* launch AgsLine */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "file", simple_file, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_notation_editor_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_notation_editor_launch(AgsFileLaunch *file_launch, AgsNotationEditor *notation_editor) { xmlNode *child; xmlChar *str; str = xmlGetProp(file_launch->node, "zoom"); if(str != NULL){ GtkTreeModel *model; GtkTreeIter iter; gchar *value; model = gtk_combo_box_get_model(GTK_COMBO_BOX(notation_editor->notation_toolbar->zoom)); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) notation_editor->notation_toolbar->zoom, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } xmlFree(str); } /* children */ child = file_launch->node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 21)){ GList *list_start, *list; GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) file_launch->file, child, &property_start); property = property_start; while(property != NULL){ if(!g_strcmp0(((GParameter *) property->data)->name, "machine")){ AgsMachine *machine; GList *file_id_ref; GList *list_start, *list; str = g_value_get_string(&(((GParameter *) property->data)->value)); if(str != NULL){ ags_machine_selector_add_index(notation_editor->machine_selector); file_id_ref = ags_simple_file_find_id_ref_by_xpath((AgsSimpleFile *) file_launch->file, str); if(file_id_ref != NULL && file_id_ref->data != NULL && AGS_FILE_ID_REF(file_id_ref->data)->ref != NULL){ machine = AGS_FILE_ID_REF(file_id_ref->data)->ref; list_start = gtk_container_get_children((GtkContainer *) notation_editor->machine_selector); list = g_list_last(list_start); gtk_button_clicked(list->data); ags_machine_selector_link_index(notation_editor->machine_selector, machine); g_list_free(list_start); } } }else{ g_object_set_property((GObject *) notation_editor, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); } property = property->next; } list_start = gtk_container_get_children((GtkContainer *) notation_editor->machine_selector); list = list_start->next; if(list != NULL){ gtk_button_clicked(list->data); } g_list_free(list_start); g_list_free_full(property_start, g_free); } } child = child->next; } } void ags_simple_file_read_automation_editor(AgsSimpleFile *simple_file, xmlNode *node, AgsAutomationEditor **automation_editor) { AgsAutomationEditor *gobject; AgsFileLaunch *file_launch; if(*automation_editor != NULL){ gobject = *automation_editor; }else{ return; } /* launch AgsLine */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "file", simple_file, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_automation_editor_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_automation_editor_launch(AgsFileLaunch *file_launch, AgsAutomationEditor *automation_editor) { xmlNode *child; xmlChar *str; str = xmlGetProp(file_launch->node, "zoom"); if(str != NULL){ GtkTreeModel *model; GtkTreeIter iter; gchar *value; model = gtk_combo_box_get_model(GTK_COMBO_BOX(automation_editor->automation_toolbar->zoom)); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) automation_editor->automation_toolbar->zoom, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } xmlFree(str); } /* children */ child = file_launch->node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 21)){ GList *list_start, *list; GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) file_launch->file, child, &property_start); property = property_start; while(property != NULL){ if(!g_strcmp0(((GParameter *) property->data)->name, "machine")){ AgsMachine *machine; xmlNode *machine_child; GList *file_id_ref; GList *list_start, *list; gchar *str; str = g_value_get_string(&(((GParameter *) property->data)->value)); if(str != NULL){ ags_machine_selector_add_index(automation_editor->machine_selector); file_id_ref = ags_simple_file_find_id_ref_by_xpath((AgsSimpleFile *) file_launch->file, str); if(file_id_ref != NULL && file_id_ref->data != NULL && AGS_FILE_ID_REF(file_id_ref->data)->ref != NULL){ machine = AGS_FILE_ID_REF(file_id_ref->data)->ref; list_start = gtk_container_get_children((GtkContainer *) automation_editor->machine_selector); list = g_list_last(list_start); gtk_button_clicked(list->data); ags_machine_selector_link_index(automation_editor->machine_selector, machine); /* apply automation ports */ machine_child = AGS_FILE_ID_REF(file_id_ref->data)->node->children; while(machine_child != NULL){ if(machine_child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(machine_child->name, "ags-sf-automation-port-list", 27)){ xmlNode *automation_port; automation_port = machine_child->children; while(automation_port != NULL){ if(automation_port->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(automation_port->name, "ags-sf-automation-port", 22)){ gchar *scope; gchar *specifier; specifier = xmlGetProp(automation_port, "specifier"); scope = xmlGetProp(automation_port, "scope"); if(specifier != NULL){ GtkTreeModel *model; GtkTreeIter iter; gchar *value0, *value1; model = gtk_combo_box_get_model(GTK_COMBO_BOX(automation_editor->automation_toolbar->port)); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 1, &value0, 2, &value1, -1); if((scope == NULL || !g_ascii_strcasecmp(scope, value0)) && !g_ascii_strcasecmp(specifier, value1)){ gtk_combo_box_set_active_iter(automation_editor->automation_toolbar->port, &iter); } }while(gtk_tree_model_iter_next(model, &iter)); } } if(specifier != NULL){ xmlFree(specifier); } if(scope != NULL){ xmlFree(scope); } } } automation_port = automation_port->next; } } } machine_child = machine_child->next; } g_list_free(list_start); } } }else{ g_object_set_property((GObject *) automation_editor, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); } property = property->next; } list_start = gtk_container_get_children((GtkContainer *) automation_editor->machine_selector); list = list_start->next; if(list != NULL){ gtk_button_clicked(list->data); } g_list_free(list_start); g_list_free_full(property_start, g_free); } } child = child->next; } } void ags_simple_file_read_wave_editor(AgsSimpleFile *simple_file, xmlNode *node, AgsWaveEditor **wave_editor) { AgsWaveEditor *gobject; AgsFileLaunch *file_launch; if(*wave_editor != NULL){ gobject = *wave_editor; }else{ return; } /* launch AgsLine */ file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, "file", simple_file, "node", node, NULL); g_signal_connect(G_OBJECT(file_launch), "start", G_CALLBACK(ags_simple_file_read_wave_editor_launch), gobject); ags_simple_file_add_launch(simple_file, (GObject *) file_launch); } void ags_simple_file_read_wave_editor_launch(AgsFileLaunch *file_launch, AgsWaveEditor *wave_editor) { xmlNode *child; xmlChar *str; str = xmlGetProp(file_launch->node, "zoom"); if(str != NULL){ GtkTreeModel *model; GtkTreeIter iter; gchar *value; model = gtk_combo_box_get_model(GTK_COMBO_BOX(wave_editor->wave_toolbar->zoom)); if(gtk_tree_model_get_iter_first(model, &iter)){ do{ gtk_tree_model_get(model, &iter, 0, &value, -1); if(!g_strcmp0(str, value)){ gtk_combo_box_set_active_iter((GtkComboBox *) wave_editor->wave_toolbar->zoom, &iter); break; } }while(gtk_tree_model_iter_next(model, &iter)); } xmlFree(str); } /* children */ child = file_launch->node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-property-list", 21)){ GList *list_start, *list; GList *property_start, *property; property_start = NULL; ags_simple_file_read_property_list((AgsSimpleFile *) file_launch->file, child, &property_start); property = property_start; while(property != NULL){ if(!g_strcmp0(((GParameter *) property->data)->name, "machine")){ AgsMachine *machine; xmlNode *machine_child; GList *file_id_ref; GList *list_start, *list; gchar *str; str = g_value_get_string(&(((GParameter *) property->data)->value)); if(str != NULL){ ags_machine_selector_add_index(wave_editor->machine_selector); file_id_ref = ags_simple_file_find_id_ref_by_xpath((AgsSimpleFile *) file_launch->file, str); if(file_id_ref != NULL && file_id_ref->data != NULL && AGS_FILE_ID_REF(file_id_ref->data)->ref != NULL){ machine = AGS_FILE_ID_REF(file_id_ref->data)->ref; list_start = gtk_container_get_children((GtkContainer *) wave_editor->machine_selector); list = g_list_last(list_start); gtk_button_clicked(list->data); ags_machine_selector_link_index(wave_editor->machine_selector, machine); g_list_free(list_start); } } }else{ g_object_set_property((GObject *) wave_editor, ((GParameter *) property->data)->name, &(((GParameter *) property->data)->value)); } property = property->next; } list_start = gtk_container_get_children((GtkContainer *) wave_editor->machine_selector); list = list_start->next; if(list != NULL){ gtk_button_clicked(list->data); } g_list_free(list_start); g_list_free_full(property_start, g_free); } } child = child->next; } } void ags_simple_file_read_notation_list(AgsSimpleFile *simple_file, xmlNode *node, GList **notation) { AgsNotation *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-notation", 11)){ current = NULL; if(*notation != NULL){ GList *iter; iter = g_list_nth(*notation, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_notation(simple_file, child, ¤t); list = ags_notation_add(list, current); i++; } } child = child->next; } *notation = list; } void ags_simple_file_read_notation_fixup_1_0_to_1_2(AgsSimpleFile *simple_file, xmlNode *node, GList **notation) { AgsMachine *machine; AgsNotation *gobject; AgsNote *note; AgsTimestamp *timestamp; AgsFileIdRef *file_id_ref; xmlNode *child; GList *notation_list; xmlChar *str; guint audio_channel; gboolean found_timestamp; file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); machine = file_id_ref->ref; audio_channel = 0; str = xmlGetProp(node, "channel"); if(str != NULL){ audio_channel = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* children */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = 0; child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-note", 12)){ note = ags_note_new(); /* position and offset */ str = xmlGetProp(child, "x0"); if(str != NULL){ note->x[0] = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(child, "x1"); if(str != NULL){ note->x[1] = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(child, "y"); if(str != NULL){ note->y = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* envelope */ str = xmlGetProp(child, "envelope"); if(str != NULL){ if(!g_ascii_strncasecmp(str, "true", 5)){ note->flags |= AGS_NOTE_ENVELOPE; } xmlFree(str); } str = xmlGetProp(child, "attack"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->attack.real), &(note->attack.imag)); xmlFree(str); } str = xmlGetProp(child, "decay"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->decay.real), &(note->decay.imag)); xmlFree(str); } str = xmlGetProp(child, "sustain"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->sustain.real), &(note->sustain.imag)); xmlFree(str); } str = xmlGetProp(child, "release"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->release.real), &(note->release.imag)); xmlFree(str); } str = xmlGetProp(child, "ratio"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->ratio.real), &(note->ratio.imag)); xmlFree(str); } timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(note->x[0] / AGS_NOTATION_DEFAULT_OFFSET); notation_list = ags_notation_find_near_timestamp(notation[0], audio_channel, timestamp); if(notation_list != NULL){ gobject = notation_list->data; }else{ gobject = g_object_new(AGS_TYPE_NOTATION, "audio", machine->audio, "audio-channel", audio_channel, NULL); gobject->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; notation[0] = ags_notation_add(notation[0], gobject); } /* add */ ags_notation_add_note(gobject, note, FALSE); } } child = child->next; } g_object_unref(timestamp); } void ags_simple_file_read_notation_list_fixup_1_0_to_1_2(AgsSimpleFile *simple_file, xmlNode *node, GList **notation) { AgsNotation *current; xmlNode *child; GList *list; guint i; if(notation == NULL){ return; } child = node->children; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-notation", 11)){ ags_simple_file_read_notation_fixup_1_0_to_1_2(simple_file, child, notation); i++; } } child = child->next; } } void ags_simple_file_read_notation(AgsSimpleFile *simple_file, xmlNode *node, AgsNotation **notation) { AgsNotation *gobject; AgsNote *note; xmlNode *child; xmlChar *str; guint audio_channel; gboolean found_timestamp; if(*notation != NULL){ gobject = *notation; audio_channel = gobject->audio_channel; }else{ AgsMachine *machine; AgsFileIdRef *file_id_ref; file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); machine = file_id_ref->ref; if(!AGS_IS_MACHINE(machine)){ return; } audio_channel = 0; str = xmlGetProp(node, "channel"); if(str != NULL){ audio_channel = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } gobject = g_object_new(AGS_TYPE_NOTATION, "audio", machine->audio, "audio-channel", audio_channel, NULL); *notation = gobject; } /* children */ child = node->children; found_timestamp = FALSE; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-timestamp", 17)){ found_timestamp = TRUE; /* offset */ str = xmlGetProp(child, "offset"); if(str != NULL){ gobject->timestamp->timer.ags_offset.offset = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } } } child = child->next; } child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-note", 12)){ note = ags_note_new(); /* position and offset */ str = xmlGetProp(child, "x0"); if(str != NULL){ note->x[0] = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(child, "x1"); if(str != NULL){ note->x[1] = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(child, "y"); if(str != NULL){ note->y = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* envelope */ str = xmlGetProp(child, "envelope"); if(str != NULL){ if(!g_ascii_strncasecmp(str, "true", 5)){ note->flags |= AGS_NOTE_ENVELOPE; } xmlFree(str); } str = xmlGetProp(child, "attack"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->attack.real), &(note->attack.imag)); xmlFree(str); } str = xmlGetProp(child, "decay"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->decay.real), &(note->decay.imag)); xmlFree(str); } str = xmlGetProp(child, "sustain"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->sustain.real), &(note->sustain.imag)); xmlFree(str); } str = xmlGetProp(child, "release"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->release.real), &(note->release.imag)); xmlFree(str); } str = xmlGetProp(child, "ratio"); if(str != NULL){ sscanf(str, "%Lf %Lf", &(note->ratio.real), &(note->ratio.imag)); xmlFree(str); } /* add */ ags_notation_add_note(gobject, note, FALSE); } } child = child->next; } } void ags_simple_file_read_automation_list(AgsSimpleFile *simple_file, xmlNode *node, GList **automation) { AgsAutomation *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-automation", 11)){ current = NULL; if(*automation != NULL){ GList *iter; iter = g_list_nth(*automation, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_automation(simple_file, child, ¤t); list = ags_automation_add(list, current); i++; } } child = child->next; } *automation = list; } void ags_simple_file_read_automation_fixup_1_0_to_1_3(AgsSimpleFile *simple_file, xmlNode *node, GList **automation) { AgsMachine *machine; AgsAutomation *gobject; AgsAcceleration *acceleration; AgsTimestamp *timestamp; AgsFileIdRef *file_id_ref; xmlNode *child; GList *automation_list; xmlChar *str; gchar *control_name; GType channel_type; guint line; gboolean found_timestamp; file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); machine = file_id_ref->ref; line = 0; str = xmlGetProp(node, "line"); if(str != NULL){ line = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } channel_type = G_TYPE_NONE; str = xmlGetProp(node, "channel-type"); if(str != NULL){ channel_type = g_type_from_name(str); xmlFree(str); } control_name = xmlGetProp(node, "control-name"); /* children */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = 0; child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-acceleration", 12)){ acceleration = ags_acceleration_new(); /* position and offset */ str = xmlGetProp(child, "x"); if(str != NULL){ acceleration->x = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(child, "y"); if(str != NULL){ acceleration->y = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } timestamp->timer.ags_offset.offset = AGS_AUTOMATION_DEFAULT_OFFSET * floor(acceleration->x / AGS_AUTOMATION_DEFAULT_OFFSET); automation_list = ags_automation_find_near_timestamp_extended(automation[0], line, channel_type, control_name, timestamp); if(automation_list != NULL){ gobject = automation_list->data; channel_type = gobject->channel_type; control_name = gobject->control_name; }else{ gobject = g_object_new(AGS_TYPE_AUTOMATION, "audio", machine->audio, "line", line, "channel-type", channel_type, "control-name", control_name, NULL); gobject->timestamp->timer.ags_offset.offset = timestamp->timer.ags_offset.offset; automation[0] = ags_automation_add(automation[0], gobject); } /* add */ ags_automation_add_acceleration(gobject, acceleration, FALSE); } } child = child->next; } g_object_unref(timestamp); } void ags_simple_file_read_automation_list_fixup_1_0_to_1_3(AgsSimpleFile *simple_file, xmlNode *node, GList **automation) { AgsAutomation *current; xmlNode *child; GList *list; guint i; if(automation == NULL){ return; } child = node->children; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-automation", 11)){ ags_simple_file_read_automation_fixup_1_0_to_1_3(simple_file, child, automation); i++; } } child = child->next; } } void ags_simple_file_read_automation(AgsSimpleFile *simple_file, xmlNode *node, AgsAutomation **automation) { AgsAutomation *gobject; AgsAcceleration *acceleration; xmlNode *child; xmlChar *str; gchar *control_name; GType channel_type; guint line; gboolean found_timestamp; if(*automation != NULL){ gobject = *automation; line = gobject->line; channel_type = gobject->channel_type; control_name = gobject->control_name; }else{ AgsMachine *machine; AgsFileIdRef *file_id_ref; file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); machine = file_id_ref->ref; if(!AGS_IS_MACHINE(machine)){ return; } line = 0; str = xmlGetProp(node, "line"); if(str != NULL){ line = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } channel_type = G_TYPE_NONE; str = xmlGetProp(node, "channel-type"); if(str != NULL){ channel_type = g_type_from_name(str); xmlFree(str); } control_name = xmlGetProp(node, "control-name"); gobject = g_object_new(AGS_TYPE_AUTOMATION, "audio", machine->audio, "line", line, "channel-type", channel_type, "control-name", control_name, NULL); *automation = gobject; } /* children */ child = node->children; found_timestamp = FALSE; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-timestamp", 17)){ found_timestamp = TRUE; /* offset */ str = xmlGetProp(child, "offset"); if(str != NULL){ gobject->timestamp->timer.ags_offset.offset = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } } } child = child->next; } child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-acceleration", 12)){ acceleration = ags_acceleration_new(); /* position and offset */ str = xmlGetProp(child, "x"); if(str != NULL){ acceleration->x = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } str = xmlGetProp(child, "y"); if(str != NULL){ acceleration->y = g_ascii_strtoull(str, NULL, 10); xmlFree(str); } /* add */ ags_automation_add_acceleration(gobject, acceleration, FALSE); } } child = child->next; } } void ags_simple_file_read_preset_list(AgsSimpleFile *simple_file, xmlNode *node, GList **preset) { AgsPreset *current; xmlNode *child; GList *list; guint i; child = node->children; list = NULL; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "ags-sf-preset", 11)){ current = NULL; if(*preset != NULL){ GList *iter; iter = g_list_nth(*preset, i); if(iter != NULL){ current = iter->data; } } ags_simple_file_read_preset(simple_file, child, ¤t); list = g_list_prepend(list, current); i++; } } child = child->next; } list = g_list_reverse(list); *preset = list; } void ags_simple_file_read_preset(AgsSimpleFile *simple_file, xmlNode *node, AgsPreset **preset) { AgsMachine *machine; AgsPreset *gobject; AgsFileIdRef *file_id_ref; xmlNode *child; xmlChar *str; guint i; file_id_ref = (AgsFileIdRef *) ags_simple_file_find_id_ref_by_node(simple_file, node->parent->parent); machine = file_id_ref->ref; if(*preset != NULL){ gobject = *preset; }else{ gobject = ags_preset_new(); *preset = gobject; } /* scope */ str = xmlGetProp(node, "scope"); if(str != NULL){ g_object_set(gobject, "scope", str, NULL); xmlFree(str); } /* preset name */ str = xmlGetProp(node, "preset-name"); if(str != NULL){ g_object_set(gobject, "preset-name", str, NULL); xmlFree(str); } /* audio channel start */ str = xmlGetProp(node, "audio-channel-start"); if(str != NULL){ g_object_set(gobject, "audio-channel-start", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } /* audio channel end */ str = xmlGetProp(node, "audio-channel-end"); if(str != NULL){ g_object_set(gobject, "audio-channel-end", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } /* pad start */ str = xmlGetProp(node, "pad-start"); if(str != NULL){ g_object_set(gobject, "pad-start", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } /* pad end */ str = xmlGetProp(node, "pad-end"); if(str != NULL){ g_object_set(gobject, "pad-end", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } /* x start */ str = xmlGetProp(node, "x-start"); if(str != NULL){ g_object_set(gobject, "x-start", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } /* x end */ str = xmlGetProp(node, "x-end"); if(str != NULL){ g_object_set(gobject, "x-end", g_ascii_strtoull(str, NULL, 10), NULL); xmlFree(str); } /* children */ child = node->children; i = 0; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, "ags-sf-strv", 12)){ ags_simple_file_read_strv(simple_file, child, &(gobject->parameter_name)); }else if(!xmlStrncmp(child->name, "ags-sf-value", 13)){ GValue *value; if(gobject->value == NULL){ gobject->value = g_new0(GValue, 1); }else{ gobject->value = g_renew(GValue, gobject->value, i + 1); memset(&(gobject->value[i]), 0, sizeof(GValue)); } //NOTE:JK: pay attention value = &(gobject->value[i]); ags_simple_file_read_value(simple_file, child, &value); i++; } } child = child->next; } } xmlNode* ags_simple_file_write_config(AgsSimpleFile *simple_file, xmlNode *parent, AgsConfig *ags_config) { xmlNode *node; xmlNode *cdata; gchar *str; gchar *id; char *buffer; gsize buffer_length; id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-sf-config"); /* ID reference */ str = g_strdup_printf("xpath=//*[@id='%s']", id); ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", node, "xpath", str, "reference", ags_config, NULL)); g_free(str); /* properties */ xmlNewProp(node, AGS_SIMPLE_FILE_ID_PROP, id); xmlNewProp(node, AGS_SIMPLE_FILE_VERSION_PROP, AGS_CONFIG(ags_config)->version); xmlNewProp(node, AGS_SIMPLE_FILE_BUILD_ID_PROP, AGS_CONFIG(ags_config)->build_id); xmlAddChild(parent, node); /* cdata */ ags_config_to_data(ags_config, &buffer, &buffer_length); cdata = xmlNewCDataBlock(simple_file->doc, buffer, buffer_length); g_free(buffer); /* add to parent */ xmlAddChild(node, cdata); return(node); } xmlNode* ags_simple_file_write_property_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *property) { xmlNode *node; xmlNode *child; node = xmlNewNode(NULL, "ags-sf-property-list"); while(property != NULL){ ags_simple_file_write_property(simple_file, node, property->data); property = property->next; } /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_property(AgsSimpleFile *simple_file, xmlNode *parent, GParameter *property) { xmlNode *node; xmlChar *type_name; xmlChar *val; if(G_VALUE_HOLDS_BOOLEAN(&(property->value))){ type_name = g_type_name(G_TYPE_BOOLEAN); if(g_value_get_boolean(&(property->value))){ val = g_strdup("true"); }else{ val = g_strdup("false"); } }else if(G_VALUE_HOLDS_UINT(&(property->value))){ type_name = g_type_name(G_TYPE_UINT); val = g_strdup_printf("%u", g_value_get_uint(&(property->value))); }else if(G_VALUE_HOLDS_INT(&(property->value))){ type_name = g_type_name(G_TYPE_INT); val = g_strdup_printf("%d", g_value_get_int(&(property->value))); }else if(G_VALUE_HOLDS_DOUBLE(&(property->value))){ type_name = g_type_name(G_TYPE_DOUBLE); val = g_strdup_printf("%f", g_value_get_double(&(property->value))); }else if(G_VALUE_HOLDS(&(property->value), AGS_TYPE_COMPLEX)){ AgsComplex *z; type_name = g_type_name(AGS_TYPE_COMPLEX); z = g_value_get_boxed(&(property->value)); val = g_strdup_printf("%Lf %Lf", z[0].real, z[0].imag); }else{ g_warning("ags_simple_file_write_property() - unsupported type"); return(NULL); } node = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(node, "type", type_name); xmlNewProp(node, "name", property->name); xmlNewProp(node, "value", val); g_free(val); /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_strv(AgsSimpleFile *simple_file, xmlNode *parent, gchar **strv) { xmlNode *node; xmlNode *child; gchar **current; if(strv == NULL){ return(NULL); } node = xmlNewNode(NULL, "ags-sf-strv"); /* add to parent */ xmlAddChild(parent, node); current = strv; while(*current != NULL){ child = xmlNewNode(NULL, "ags-sf-str"); xmlNodeAddContent(child, *current); /* add to parent */ xmlAddChild(node, child); current++; } return(node); } xmlNode* ags_simple_file_write_value(AgsSimpleFile *simple_file, xmlNode *parent, GValue *value) { xmlNode *node; xmlChar *type_name; xmlChar *val; if(G_VALUE_HOLDS_BOOLEAN(value)){ type_name = g_type_name(G_TYPE_BOOLEAN); if(g_value_get_boolean(value)){ val = g_strdup("true"); }else{ val = g_strdup("false"); } }else if(G_VALUE_HOLDS_UINT(value)){ type_name = g_type_name(G_TYPE_UINT); val = g_strdup_printf("%u", g_value_get_uint(value)); }else if(G_VALUE_HOLDS_INT(value)){ type_name = g_type_name(G_TYPE_INT); val = g_strdup_printf("%d", g_value_get_int(value)); }else if(G_VALUE_HOLDS_DOUBLE(value)){ type_name = g_type_name(G_TYPE_DOUBLE); val = g_strdup_printf("%f", g_value_get_double(value)); }else if(G_VALUE_HOLDS(value, AGS_TYPE_COMPLEX)){ AgsComplex *z; type_name = g_type_name(AGS_TYPE_COMPLEX); z = g_value_get_boxed(value); val = g_strdup_printf("%Lf %Lf", z[0].real, z[0].imag); }else{ g_warning("ags_simple_file_write_property() - unsupported type"); return(NULL); } node = xmlNewNode(NULL, "ags-sf-value"); xmlNewProp(node, "type", type_name); xmlNewProp(node, "value", val); g_free(val); /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_window(AgsSimpleFile *simple_file, xmlNode *parent, AgsWindow *window) { xmlNode *node; GList *list; gchar *str; node = xmlNewNode(NULL, "ags-sf-window"); /* properties */ xmlNewProp(node, "filename", simple_file->filename); str = g_strdup_printf("%f", gtk_spin_button_get_value(window->navigation->bpm)); xmlNewProp(node, "bpm", str); g_free(str); xmlNewProp(node, "loop", ((gtk_toggle_button_get_active((GtkToggleButton *) window->navigation->loop)) ? AGS_SIMPLE_FILE_TRUE: AGS_SIMPLE_FILE_FALSE)); str = g_strdup_printf("%f", gtk_spin_button_get_value(window->navigation->loop_left_tact)); xmlNewProp(node, "loop-start", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(window->navigation->loop_right_tact)); xmlNewProp(node, "loop-end", str); g_free(str); /* children */ list = gtk_container_get_children((GtkContainer *) window->machines); ags_simple_file_write_machine_list(simple_file, node, list); g_list_free(list); ags_simple_file_write_notation_editor(simple_file, node, window->notation_editor); ags_simple_file_write_automation_editor(simple_file, node, window->automation_window->automation_editor); ags_simple_file_write_wave_editor(simple_file, node, window->wave_window->wave_editor); /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_machine_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *machine) { xmlNode *node; node = xmlNewNode(NULL, "ags-sf-machine-list"); while(machine != NULL){ ags_simple_file_write_machine(simple_file, node, machine->data); machine = machine->next; } /* add to parent */ xmlAddChild(parent, node); return(node); } gboolean ags_simple_file_write_machine_inline_pad(AgsSimpleFile *simple_file, xmlNode *parent, AgsChannel *channel) { AgsChannel *next_pad; xmlNode *pad; xmlNode *line_list; xmlNode *line; gchar *str; gboolean found_pad_content, found_line_content; if(channel == NULL){ return(FALSE); } found_pad_content = FALSE; while(channel != NULL){ next_pad = channel->next_pad; pad = xmlNewNode(NULL, "ags-sf-pad"); /* properties */ str = g_strdup_printf("%d", channel->pad); xmlNewProp(pad, "nth-pad", str); g_free(str); line_list = xmlNewNode(NULL, "ags-sf-line-list"); found_line_content = FALSE; while(channel != next_pad){ gchar *id; line = xmlNewNode(NULL, "ags-sf-line"); /* properties */ id = ags_id_generator_create_uuid(); xmlNewProp(line, "id", id); if(id != NULL){ free(id); } if(channel->link != NULL){ ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", line, "reference", channel, NULL)); found_line_content = TRUE; } str = g_strdup_printf("%d", channel->line); xmlNewProp(line, "nth-line", str); g_free(str); /* device */ if(channel != NULL && channel->output_soundcard != NULL){ gchar *device; device = ags_soundcard_get_device(AGS_SOUNDCARD(channel->output_soundcard)); if(device != NULL){ xmlNewProp(line, (xmlChar *) "soundcard-device", (xmlChar *) device); g_free(device); } } /* link */ if(channel->link != NULL){ AgsFileLookup *file_lookup; file_lookup = (AgsFileLookup *) g_object_new(AGS_TYPE_FILE_LOOKUP, "file", simple_file, "node", line, "reference", channel, NULL); ags_simple_file_add_lookup(simple_file, (GObject *) file_lookup); g_signal_connect(G_OBJECT(file_lookup), "resolve", G_CALLBACK(ags_simple_file_write_line_resolve_link), channel); } /* add to parent */ xmlAddChild(line_list, line); /* iterate */ channel = channel->next; } if(found_line_content){ found_pad_content = TRUE; /* add to parent */ xmlAddChild(pad, line_list); /* add to parent */ xmlAddChild(parent, pad); }else{ xmlFreeNode(line_list); xmlFreeNode(pad); } } if(found_pad_content){ return(TRUE); }else{ return(FALSE); } } xmlNode* ags_simple_file_write_control(AgsSimpleFile *simple_file, xmlNode *parent, AgsBulkMember *bulk_member) { GtkWidget *child_widget; xmlNode *control_node; gchar *str; /* control node */ child_widget = gtk_bin_get_child((GtkBin *) bulk_member); if(GTK_IS_TOGGLE_BUTTON(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "control-type", G_OBJECT_TYPE_NAME(child_widget)); xmlNewProp(control_node, "value", ((gtk_toggle_button_get_active((GtkToggleButton *) child_widget)) ? AGS_SIMPLE_FILE_TRUE: AGS_SIMPLE_FILE_FALSE)); }else if(AGS_IS_DIAL(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "control-type", G_OBJECT_TYPE_NAME(child_widget)); str = g_strdup_printf("%f", gtk_adjustment_get_value(AGS_DIAL(child_widget)->adjustment)); xmlNewProp(control_node, "value", str); g_free(str); }else{ g_warning("ags_file_write_effect_list() - unknown child of AgsBulkMember type"); return(NULL); } xmlNewProp(control_node, "specifier", bulk_member->specifier); xmlAddChild(parent, control_node); return(control_node); } xmlNode* ags_simple_file_write_effect_list(AgsSimpleFile *simple_file, xmlNode *parent, AgsEffectBulk *effect_bulk) { xmlNode *effect_list_node; xmlNode *effect_node; GList *filename; GList *effect; GList *list_start, *list; effect_list_node = NULL; effect_node = NULL; filename = NULL; effect = NULL; list = list_start = gtk_container_get_children((GtkContainer *) effect_bulk->table); while(list != NULL){ if(AGS_IS_BULK_MEMBER(list->data)){ if(g_list_find_custom(filename, AGS_BULK_MEMBER(list->data)->filename, (GCompareFunc) g_strcmp0) == NULL || g_list_find_custom(effect, AGS_BULK_MEMBER(list->data)->effect, (GCompareFunc) g_strcmp0) == NULL){ GtkWidget *child_widget; if(effect_list_node == NULL){ effect_list_node = xmlNewNode(NULL, "ags-sf-effect-list"); } effect_node = xmlNewNode(NULL, "ags-sf-effect"); xmlNewProp(effect_node, "filename", AGS_BULK_MEMBER(list->data)->filename); filename = g_list_prepend(filename, AGS_BULK_MEMBER(list->data)->filename); xmlNewProp(effect_node, "effect", AGS_BULK_MEMBER(list->data)->effect); effect = g_list_prepend(effect, AGS_BULK_MEMBER(list->data)->effect); ags_simple_file_write_control(simple_file, effect_node, list->data); /* add to parent */ xmlAddChild(effect_list_node, effect_node); }else{ ags_simple_file_write_control(simple_file, effect_node, list->data); } } list = list->next; } g_list_free(list_start); g_list_free(filename); g_list_free(effect); /* add to parent */ if(effect_list_node != NULL){ xmlAddChild(parent, effect_list_node); } return(effect_list_node); } xmlNode* ags_simple_file_write_automation_port(AgsSimpleFile *simple_file, xmlNode *parent, GList *automation_port) { xmlNode *node, *child; node = NULL; if(automation_port != NULL){ node = xmlNewNode(NULL, "ags-sf-automation-port-list"); while(automation_port != NULL){ gchar *scope; child = xmlNewNode(NULL, "ags-sf-automation-port"); scope = NULL; if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == G_TYPE_NONE){ scope = "audio"; }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_OUTPUT){ scope = "output"; }else if(AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->channel_type == AGS_TYPE_INPUT){ scope = "input"; } xmlNewProp(child, "scope", scope); xmlNewProp(child, "specifier", AGS_MACHINE_AUTOMATION_PORT(automation_port->data)->control_name); xmlAddChild(node, child); automation_port = automation_port->next; } } /* add to parent */ if(node != NULL){ xmlAddChild(parent, node); } return(node); } xmlNode* ags_simple_file_write_machine(AgsSimpleFile *simple_file, xmlNode *parent, AgsMachine *machine) { xmlNode *node; xmlNode *pad_list; GList *list; gchar *id; xmlChar *str; /* node and uuid */ id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-sf-machine"); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_ID_PROP, (xmlChar *) id); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_TYPE_PROP, (xmlChar *) G_OBJECT_TYPE_NAME(machine)); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_NAME_PROP, (xmlChar *) machine->machine_name); ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", node, "reference", machine, NULL)); /* device */ if(machine->audio != NULL && machine->audio->output_soundcard != NULL){ gchar *device; device = ags_soundcard_get_device(AGS_SOUNDCARD(machine->audio->output_soundcard)); if(device != NULL){ xmlNewProp(node, (xmlChar *) "soundcard-device", (xmlChar *) device); g_free(device); } } /* audio name */ if(machine->audio != NULL){ gchar *audio_name; g_object_get(machine->audio, "audio-name", &audio_name, NULL); if(audio_name != NULL){ xmlNewProp(node, (xmlChar *) "audio-name", (xmlChar *) audio_name); g_free(audio_name); } } /* bank and mapping */ str = (xmlChar *) g_strdup_printf("%d", machine->bank_0); xmlNewProp(node, (xmlChar *) "bank_0", str); g_free(str); str = (xmlChar *) g_strdup_printf("%d", machine->bank_1); xmlNewProp(node, (xmlChar *) "bank_1", str); g_free(str); if(ags_audio_test_behaviour_flags(machine->audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ xmlNewProp(node, "reverse-mapping", "true"); } /* channels and pads */ str = (xmlChar *) g_strdup_printf("%d", machine->audio->audio_channels); xmlNewProp(node, (xmlChar *) "channels", str); g_free(str); str = (xmlChar *) g_strdup_printf("%d", machine->audio->output_pads); xmlNewProp(node, (xmlChar *) "output-pads", str); g_free(str); str = (xmlChar *) g_strdup_printf("%d", machine->audio->input_pads); xmlNewProp(node, (xmlChar *) "input-pads", str); g_free(str); /* midi mapping */ if((AGS_MACHINE_IS_SYNTHESIZER & (machine->flags)) != 0){ guint audio_start_mapping, audio_end_mapping; guint midi_start_mapping, midi_end_mapping; g_object_get(machine->audio, "audio-start-mapping", &audio_start_mapping, "audio-end-mapping", &audio_end_mapping, "midi-start-mapping", &midi_start_mapping, "midi-start-mapping", &midi_end_mapping, NULL); str = g_strdup_printf("%d", audio_start_mapping); xmlNewProp(node, "audio-start-mapping", str); g_free(str); str = g_strdup_printf("%d", audio_end_mapping); xmlNewProp(node, "audio-end-mapping", str); g_free(str); str = g_strdup_printf("%d", midi_start_mapping); xmlNewProp(node, "midi-start-mapping", str); str = g_strdup_printf("%d", midi_end_mapping); xmlNewProp(node, "midi-end-mapping", str); g_free(str); } /* machine specific */ if(AGS_IS_EQUALIZER10(machine)){ AgsEqualizer10 *equalizer10; xmlNode *child; xmlNode *control_node; equalizer10 = (AgsEqualizer10 *) machine; child = xmlNewNode(NULL, "ags-sf-equalizer10"); xmlAddChild(node, child); /* peak 28hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "28 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_28hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 56hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "56 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_56hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 112hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "112 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_112hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 224hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "224 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_224hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 448hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "448 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_448hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 896hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "896 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_896hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 1792hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "1792 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_1792hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 3584hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "3584 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_3584hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 7168hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "7168 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_7168hz))); xmlNewProp(control_node, "value", str); g_free(str); /* peak 14336hz */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "14336 [Hz]"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->peak_14336hz))); xmlNewProp(control_node, "value", str); g_free(str); /* pressure */ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlAddChild(child, control_node); xmlNewProp(control_node, "specifier", "pressure"); xmlNewProp(control_node, "control-type", "GtkScale"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(equalizer10->pressure))); xmlNewProp(control_node, "value", str); g_free(str); }else if(AGS_IS_DRUM(machine)){ AgsDrum *drum; drum = (AgsDrum *) machine; if(gtk_toggle_button_get_active((GtkToggleButton *) drum->loop_button)){ xmlNewProp(node, "loop", "true"); } str = g_strdup_printf("%u", (guint) gtk_spin_button_get_value(drum->length_spin)); xmlNewProp(node, "length", str); g_free(str); }else if(AGS_IS_MATRIX(machine)){ AgsMatrix *matrix; matrix = (AgsMatrix *) machine; if(gtk_toggle_button_get_active((GtkToggleButton *) matrix->loop_button)){ xmlNewProp(node, "loop", "true"); } str = g_strdup_printf("%u", (guint) gtk_spin_button_get_value(matrix->length_spin)); xmlNewProp(node, "length", str); g_free(str); }else if(AGS_IS_SYNTH(machine)){ AgsSynth *synth; synth = (AgsSynth *) machine; str = g_strdup_printf("%f", gtk_spin_button_get_value(synth->lower)); xmlNewProp(node, "base-note", str); g_free(str); }else if(AGS_IS_FM_SYNTH(machine)){ AgsFMSynth *fm_synth; fm_synth = (AgsFMSynth *) machine; str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_synth->lower)); xmlNewProp(node, "base-note", str); g_free(str); }else if(AGS_IS_SYNCSYNTH(machine)){ AgsSyncsynth *syncsynth; syncsynth = (AgsSyncsynth *) machine; xmlNewProp(node, "base-note", g_strdup_printf("%f", gtk_spin_button_get_value(syncsynth->lower))); str = g_strdup_printf("%u", (guint) round(gtk_spin_button_get_value(syncsynth->loop_start))); xmlNewProp(node, "audio-loop-start", str); g_free(str); str = g_strdup_printf("%u", (guint) round(gtk_spin_button_get_value(syncsynth->loop_end))); xmlNewProp(node, "audio-loop-end", str); g_free(str); }else if(AGS_IS_FM_SYNCSYNTH(machine)){ AgsFMSyncsynth *fm_syncsynth; fm_syncsynth = (AgsFMSyncsynth *) machine; str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_syncsynth->lower)); xmlNewProp(node, "base-note", str); g_free(str); str = g_strdup_printf("%u", (guint) round(gtk_spin_button_get_value(fm_syncsynth->loop_start))); xmlNewProp(node, "audio-loop-start", str); g_free(str); str = g_strdup_printf("%u", (guint) round(gtk_spin_button_get_value(fm_syncsynth->loop_end))); xmlNewProp(node, "audio-loop-end", str); g_free(str); }else if(AGS_IS_PITCH_SAMPLER(machine)){ AgsPitchSampler *pitch_sampler; pitch_sampler = (AgsPitchSampler *) machine; if(pitch_sampler->audio_container != NULL && pitch_sampler->audio_container->filename != NULL){ xmlNewProp(node, "filename", pitch_sampler->audio_container->filename); } str = g_strdup_printf("%f", gtk_spin_button_get_value(pitch_sampler->lfo_freq)); xmlNewProp(node, "lfo-freq", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(pitch_sampler->lfo_phase)); xmlNewProp(node, "lfo-phase", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(pitch_sampler->lfo_depth)); xmlNewProp(node, "lfo-depth", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(pitch_sampler->lfo_tuning)); xmlNewProp(node, "lfo-tuning", str); g_free(str); #ifdef AGS_WITH_LIBINSTPATCH }else if(AGS_IS_FFPLAYER(machine)){ AgsFFPlayer *ffplayer; ffplayer = (AgsFFPlayer *) machine; if(ffplayer->audio_container != NULL && ffplayer->audio_container->filename != NULL){ xmlNewProp(node, "filename", ffplayer->audio_container->filename); str = gtk_combo_box_text_get_active_text(ffplayer->preset); xmlNewProp(node, "preset", str); g_free(str); str = gtk_combo_box_text_get_active_text(ffplayer->instrument); xmlNewProp(node, "instrument", str); g_free(str); } #endif }else if(AGS_IS_AUDIOREC(machine)){ AgsAudiorec *audiorec; audiorec = (AgsAudiorec *) machine; xmlNewProp(node, "filename", gtk_entry_get_text(audiorec->filename)); }else if(AGS_IS_LADSPA_BRIDGE(machine)){ AgsLadspaBridge *ladspa_bridge; ladspa_bridge = (AgsLadspaBridge *) machine; xmlNewProp(node, "plugin-file", ladspa_bridge->filename); xmlNewProp(node, "effect", ladspa_bridge->effect); }else if(AGS_IS_DSSI_BRIDGE(machine)){ AgsDssiBridge *dssi_bridge; dssi_bridge = (AgsDssiBridge *) machine; xmlNewProp(node, "plugin-file", dssi_bridge->filename); xmlNewProp(node, "effect", dssi_bridge->effect); str = gtk_combo_box_text_get_active_text(dssi_bridge->program); xmlNewProp(node, "program", str); g_free(str); }else if(AGS_IS_LIVE_DSSI_BRIDGE(machine)){ AgsLiveDssiBridge *live_dssi_bridge; live_dssi_bridge = (AgsLiveDssiBridge *) machine; xmlNewProp(node, "plugin-file", live_dssi_bridge->filename); xmlNewProp(node, "effect", live_dssi_bridge->effect); str = gtk_combo_box_text_get_active_text(live_dssi_bridge->program); xmlNewProp(node, "program", str); g_free(str); }else if(AGS_IS_LV2_BRIDGE(machine)){ AgsLv2Bridge *lv2_bridge; lv2_bridge = (AgsLv2Bridge *) machine; xmlNewProp(node, "plugin-file", lv2_bridge->filename); xmlNewProp(node, "effect", lv2_bridge->effect); if(lv2_bridge->preset != NULL){ str = gtk_combo_box_text_get_active_text(lv2_bridge->preset); xmlNewProp(node, "preset", str); g_free(str); } }else if(AGS_IS_LIVE_LV2_BRIDGE(machine)){ AgsLiveLv2Bridge *live_lv2_bridge; live_lv2_bridge = (AgsLiveLv2Bridge *) machine; xmlNewProp(node, "plugin-file", live_lv2_bridge->filename); xmlNewProp(node, "effect", live_lv2_bridge->effect); if(live_lv2_bridge->preset != NULL){ str = gtk_combo_box_text_get_active_text(live_lv2_bridge->preset); xmlNewProp(node, "preset", str); g_free(str); } } /* input */ if(machine->input != NULL){ list = gtk_container_get_children((GtkContainer *) machine->input); pad_list = ags_simple_file_write_pad_list(simple_file, node, list); xmlNewProp(pad_list, "is-output", "false"); g_list_free(list); }else{ AgsChannel *channel; channel = machine->audio->input; if(channel != NULL){ pad_list = xmlNewNode(NULL, "ags-sf-pad-list"); xmlNewProp(pad_list, "is-output", "false"); if(ags_simple_file_write_machine_inline_pad(simple_file, pad_list, channel)){ /* add to parent */ xmlAddChild(node, pad_list); }else{ xmlFreeNode(pad_list); } } } /* output */ if(machine->output != NULL){ list = gtk_container_get_children((GtkContainer *) machine->output); pad_list = ags_simple_file_write_pad_list(simple_file, node, list); xmlNewProp(pad_list, "is-output", "true"); g_list_free(list); }else{ AgsChannel *channel; channel = machine->audio->output; if(channel != NULL){ pad_list = xmlNewNode(NULL, "ags-sf-pad-list"); xmlNewProp(pad_list, "is-output", "true"); if(ags_simple_file_write_machine_inline_pad(simple_file, pad_list, channel)){ /* add to parent */ xmlAddChild(node, pad_list); }else{ xmlFreeNode(pad_list); } } } /* effect list */ if(machine->bridge != NULL){ if(AGS_EFFECT_BRIDGE(machine->bridge)->bulk_input != NULL){ xmlNode *child; child = ags_simple_file_write_effect_list(simple_file, node, (AgsEffectBulk *) AGS_EFFECT_BRIDGE(machine->bridge)->bulk_input); if(child != NULL){ xmlNewProp(child, "is-output", "false"); } } if(AGS_EFFECT_BRIDGE(machine->bridge)->bulk_output != NULL){ xmlNode *child; child = ags_simple_file_write_effect_list(simple_file, node, (AgsEffectBulk *) AGS_EFFECT_BRIDGE(machine->bridge)->bulk_output); if(child != NULL){ xmlNewProp(child, "is-output", "true"); } } if(AGS_EFFECT_BRIDGE(machine->bridge)->input != NULL){ xmlNode *child; GList *list; list = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BRIDGE(machine->bridge)->input); child = ags_simple_file_write_effect_pad_list(simple_file, node, list); xmlNewProp(child, "is-output", "false"); g_list_free(list); } if(AGS_EFFECT_BRIDGE(machine->bridge)->output != NULL){ xmlNode *child; GList *list; list = gtk_container_get_children((GtkContainer *) AGS_EFFECT_BRIDGE(machine->bridge)->output); child = ags_simple_file_write_effect_pad_list(simple_file, node, list); xmlNewProp(child, "is-output", "true"); g_list_free(list); } } /* oscillator list */ if(AGS_IS_SYNCSYNTH(machine)){ xmlNode *child; GList *list, *list_start, *next, *oscillator; list_start = list = gtk_container_get_children((GtkContainer *) AGS_SYNCSYNTH(machine)->oscillator); oscillator = NULL; while(list != NULL){ next = gtk_container_get_children(list->data); oscillator = g_list_prepend(oscillator, next->next->data); g_list_free(next); list = list->next; } child = ags_simple_file_write_oscillator_list(simple_file, node, oscillator); g_list_free(list_start); g_list_free(oscillator); }else if(AGS_IS_FM_SYNCSYNTH(machine)){ xmlNode *child; GList *list, *list_start, *next, *fm_oscillator; list_start = list = gtk_container_get_children((GtkContainer *) AGS_FM_SYNCSYNTH(machine)->fm_oscillator); fm_oscillator = NULL; while(list != NULL){ next = gtk_container_get_children(list->data); fm_oscillator = g_list_prepend(fm_oscillator, next->next->data); g_list_free(next); list = list->next; } child = ags_simple_file_write_fm_oscillator_list(simple_file, node, fm_oscillator); g_list_free(list_start); g_list_free(fm_oscillator); } /* pattern list */ if(machine->audio->input != NULL){ AgsChannel *channel; xmlNode *pattern_list_node; channel = machine->audio->input; pattern_list_node = NULL; while(channel != NULL){ if(channel->pattern != NULL){ AgsPattern *pattern; guint i, j, k; pattern = channel->pattern->data; for(i = 0; i < pattern->dim[0]; i++){ for(j = 0; j < pattern->dim[1]; j++){ if(!ags_pattern_is_empty(pattern, i, j)){ xmlNode *pattern_node; xmlChar *content; if(pattern_list_node == NULL){ pattern_list_node = xmlNewNode(NULL, "ags-sf-pattern-list"); } pattern_node = xmlNewNode(NULL, "ags-sf-pattern"); /* content */ content = malloc((pattern->dim[2] + 1) * sizeof(xmlChar)); content[pattern->dim[2]] = '\0'; for(k = 0; k < pattern->dim[2]; k++){ if(ags_pattern_get_bit(pattern, i, j, k)){ content[k] = '1'; }else{ content[k] = '0'; } } xmlNodeAddContent(pattern_node, content); free(content); /* attributes */ str = g_strdup_printf("%d", channel->line); xmlNewProp(pattern_node, "nth-line", str); g_free(str); str = g_strdup_printf("%d", i); xmlNewProp(pattern_node, "bank-0", str); str = g_strdup_printf("%d", j); xmlNewProp(pattern_node, "bank-1", str); g_free(str); /* add child */ xmlAddChild(pattern_list_node, pattern_node); } } } } channel = channel->next; } if(pattern_list_node != NULL){ xmlAddChild(node, pattern_list_node); } } /* notation and automation list */ if(machine->enabled_automation_port != NULL){ ags_simple_file_write_automation_port(simple_file, node, machine->enabled_automation_port); } if(machine->audio->notation != NULL){ ags_simple_file_write_notation_list(simple_file, node, machine->audio->notation); } if(machine->audio->automation != NULL){ ags_simple_file_write_automation_list(simple_file, node, machine->audio->automation); } if(machine->audio->preset != NULL){ ags_simple_file_write_preset_list(simple_file, node, machine->audio->preset); } /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_pad_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *pad) { xmlNode *node; gboolean found_content; found_content = FALSE; node = xmlNewNode(NULL, "ags-sf-pad-list"); while(pad != NULL){ if(ags_simple_file_write_pad(simple_file, node, pad->data) != NULL){ found_content = TRUE; } pad = pad->next; } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } xmlNode* ags_simple_file_write_pad(AgsSimpleFile *simple_file, xmlNode *parent, AgsPad *pad) { xmlNode *node; GList *list; gchar *id; gchar *str; gboolean found_content; found_content = FALSE; id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-sf-pad"); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_ID_PROP, (xmlChar *) id); str = g_strdup_printf("%d", pad->channel->pad); xmlNewProp(node, "nth-pad", str); g_free(str); /* group */ if(!gtk_toggle_button_get_active(pad->group)){ xmlNewProp(node, "group", "false"); found_content = TRUE; }else{ xmlNewProp(node, "group", "true"); } /* mute */ if(!gtk_toggle_button_get_active(pad->mute)){ xmlNewProp(node, "mute", "false"); }else{ xmlNewProp(node, "mute", "true"); found_content = TRUE; } /* solo */ if(!gtk_toggle_button_get_active(pad->solo)){ xmlNewProp(node, "solo", "false"); }else{ xmlNewProp(node, "solo", "true"); found_content = TRUE; } /* children */ if(pad->expander_set != NULL){ list = gtk_container_get_children((GtkContainer *) pad->expander_set); if(ags_simple_file_write_line_list(simple_file, node, g_list_reverse(list)) != NULL){ found_content = TRUE; } g_list_free(list); } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } xmlNode* ags_simple_file_write_line_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *line) { xmlNode *node; gboolean found_content; node = xmlNewNode(NULL, "ags-sf-line-list"); found_content = FALSE; while(line != NULL){ if(ags_simple_file_write_line(simple_file, node, line->data) != NULL){ found_content = TRUE; } line = line->next; } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } void ags_simple_file_write_line_member_control(AgsSimpleFile *simple_file, xmlNode *parent, AgsLineMember *line_member) { GtkWidget *child_widget; xmlNode *control_node; gchar *str; /* control node */ child_widget = gtk_bin_get_child((GtkBin *) line_member); if(GTK_IS_TOGGLE_BUTTON(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "control-type", G_OBJECT_TYPE_NAME(child_widget)); xmlNewProp(control_node, "value", ((gtk_toggle_button_get_active((GtkToggleButton *) child_widget)) ? "true": "false")); }else if(AGS_IS_DIAL(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "control-type", G_OBJECT_TYPE_NAME(child_widget)); str = g_strdup_printf("%f", gtk_adjustment_get_value(AGS_DIAL(child_widget)->adjustment)); xmlNewProp(control_node, "value", str); g_free(str); }else if(GTK_IS_RANGE(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "control-type", G_OBJECT_TYPE_NAME(child_widget)); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(child_widget))); xmlNewProp(control_node, "value", str); g_free(str); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "control-type", G_OBJECT_TYPE_NAME(child_widget)); str = g_strdup_printf("%f", gtk_spin_button_get_value(GTK_SPIN_BUTTON(child_widget))); xmlNewProp(control_node, "value", str); g_free(str); }else{ g_warning("ags_file_write_effect_list() - unknown child of AgsLineMember type"); return; } xmlNewProp(control_node, "specifier", line_member->specifier); xmlAddChild(parent, control_node); } xmlNode* ags_simple_file_write_line(AgsSimpleFile *simple_file, xmlNode *parent, AgsLine *line) { xmlNode *node; xmlNode *effect_list_node; xmlNode *effect_node; GList *filename; GList *effect; GList *list_start, *list; gchar *id; gchar *str; gboolean found_content; id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-sf-line"); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_ID_PROP, (xmlChar *) id); found_content = FALSE; if(line->channel->link != NULL){ ags_simple_file_add_id_ref(simple_file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", simple_file, "node", node, "reference", line->channel, NULL)); found_content = TRUE; } str = g_strdup_printf("%d", line->channel->line); xmlNewProp(node, "nth-line", str); g_free(str); /* device */ if(line->channel != NULL && line->channel->output_soundcard != NULL){ gchar *device; device = ags_soundcard_get_device(AGS_SOUNDCARD(line->channel->output_soundcard)); if(device != NULL){ xmlNewProp(node, (xmlChar *) "soundcard-device", (xmlChar *) device); g_free(device); } } /* group */ if(!gtk_toggle_button_get_active(line->group)){ xmlNewProp(node, "is-grouped", "false"); found_content = TRUE; }else{ xmlNewProp(node, "is-grouped", "true"); } /* link or file */ if(line->channel->link != NULL){ AgsFileLookup *file_lookup; file_lookup = (AgsFileLookup *) g_object_new(AGS_TYPE_FILE_LOOKUP, "file", simple_file, "node", node, "reference", line, NULL); ags_simple_file_add_lookup(simple_file, (GObject *) file_lookup); g_signal_connect(G_OBJECT(file_lookup), "resolve", G_CALLBACK(ags_simple_file_write_line_resolve_link), line->channel); }else if(AGS_IS_INPUT(line->channel)){ AgsFileLink *file_link; g_object_get(line->channel, "file-link", &file_link, NULL); if(file_link != NULL){ gchar *filename; guint audio_channel; g_object_get(file_link, "filename", &filename, "audio-channel", &audio_channel, NULL); if(ags_audio_file_check_suffix(filename)){ str = g_strdup_printf("file://%s", filename); xmlNewProp(node, "filename", str); g_free(str); str = g_strdup_printf("%d", audio_channel); xmlNewProp(node, "file-channel", str); g_free(str); found_content = TRUE; } g_free(filename); } } /* machine specific */ if(AGS_IS_SYNTH_INPUT_LINE(line)){ ags_simple_file_write_oscillator(simple_file, node, AGS_SYNTH_INPUT_LINE(line)->oscillator); found_content = TRUE; }else if(AGS_IS_FM_SYNTH_INPUT_LINE(line)){ ags_simple_file_write_fm_oscillator(simple_file, node, AGS_FM_SYNTH_INPUT_LINE(line)->fm_oscillator); found_content = TRUE; } /* effect list */ effect_list_node = NULL; effect_node = NULL; filename = NULL; effect = NULL; list_start = list = g_list_reverse(gtk_container_get_children((GtkContainer *) line->expander->table)); while(list != NULL){ if(AGS_IS_LINE_MEMBER(list->data)){ AgsLineMember *line_member; line_member = list->data; if(g_list_find(filename, AGS_LINE_MEMBER(list->data)->filename) == NULL || g_list_find(effect, AGS_LINE_MEMBER(list->data)->effect) == NULL){ GtkWidget *child_widget; if(effect_list_node == NULL){ effect_list_node = xmlNewNode(NULL, "ags-sf-effect-list"); } effect_node = xmlNewNode(NULL, "ags-sf-effect"); filename = g_list_prepend(filename, AGS_LINE_MEMBER(list->data)->filename); effect = g_list_prepend(effect, AGS_LINE_MEMBER(list->data)->effect); xmlNewProp(effect_node, "filename", AGS_LINE_MEMBER(list->data)->filename); xmlNewProp(effect_node, "effect", AGS_LINE_MEMBER(list->data)->effect); ags_simple_file_write_line_member_control(simple_file, effect_node, list->data); /* add to parent */ xmlAddChild(effect_list_node, effect_node); }else{ ags_simple_file_write_line_member_control(simple_file, effect_node, list->data); } found_content = TRUE; } list = list->next; } g_list_free(list_start); g_list_free(filename); g_list_free(effect); /* add to parent */ if(effect_list_node != NULL){ xmlAddChild(node, effect_list_node); } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } void ags_simple_file_write_line_resolve_link(AgsFileLookup *file_lookup, AgsChannel *channel) { GList *list; xmlChar *xpath; xmlChar *str; list = ags_simple_file_find_id_ref_by_reference((AgsSimpleFile *) file_lookup->file, channel->link); if(list != NULL){ str = xmlGetProp(AGS_FILE_ID_REF(list->data)->node, "id"); xpath = g_strdup_printf("xpath=//ags-sf-line[@id='%s']", str); xmlNewProp(file_lookup->node, "link", xpath); g_free(xpath); if(str != NULL){ xmlFree(str); } } } xmlNode* ags_simple_file_write_effect_pad_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *effect_pad) { xmlNode *node; gboolean found_content; found_content = FALSE; node = xmlNewNode(NULL, "ags-sf-effect-pad-list"); while(effect_pad != NULL){ if(ags_simple_file_write_effect_pad(simple_file, node, effect_pad->data) != NULL){ found_content = TRUE; } effect_pad = effect_pad->next; } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } xmlNode* ags_simple_file_write_effect_pad(AgsSimpleFile *simple_file, xmlNode *parent, AgsEffectPad *effect_pad) { xmlNode *node; GList *list; gchar *id; gboolean found_content; found_content = FALSE; id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-sf-effect-pad"); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_ID_PROP, (xmlChar *) id); /* children */ if(effect_pad->table != NULL){ list = gtk_container_get_children((GtkContainer *) effect_pad->table); if(ags_simple_file_write_effect_line_list(simple_file, node, list) != NULL){ found_content = TRUE; } g_list_free(list); } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } xmlNode* ags_simple_file_write_effect_line_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *effect_line) { xmlNode *node; gboolean found_content; found_content = FALSE; node = xmlNewNode(NULL, "ags-sf-effect-line-list"); while(effect_line != NULL){ if(ags_simple_file_write_effect_line(simple_file, node, effect_line->data) != NULL){ found_content = TRUE; } effect_line = effect_line->next; } if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } void ags_simple_file_write_effect_line_control(AgsSimpleFile *simple_file, xmlNode *parent, AgsLineMember *line_member) { GtkWidget *child_widget; xmlNode *control_node; gchar *str; /* control node */ child_widget = gtk_bin_get_child((GtkBin *) line_member); if(GTK_IS_TOGGLE_BUTTON(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); xmlNewProp(control_node, "value", ((gtk_toggle_button_get_active((GtkToggleButton *) child_widget)) ? "true": "false")); }else if(AGS_IS_DIAL(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); str = g_strdup_printf("%f", gtk_adjustment_get_value(AGS_DIAL(child_widget)->adjustment)); xmlNewProp(control_node, "value", str); g_free(str); }else if(GTK_IS_RANGE(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); str = g_strdup_printf("%f", gtk_range_get_value(GTK_RANGE(child_widget))); xmlNewProp(control_node, "value", str); g_free(str); }else if(GTK_IS_SPIN_BUTTON(child_widget)){ control_node = xmlNewNode(NULL, "ags-sf-control"); str = g_strdup_printf("%f", gtk_spin_button_get_value(GTK_SPIN_BUTTON(child_widget))); xmlNewProp(control_node, "value", str); g_free(str); }else{ g_warning("ags_file_write_effect_list() - unknown child of AgsLineMember type"); return; } xmlNewProp(control_node, "specifier", line_member->specifier); xmlAddChild(parent, control_node); } xmlNode* ags_simple_file_write_effect_line(AgsSimpleFile *simple_file, xmlNode *parent, AgsEffectLine *effect_line) { xmlNode *node; xmlNode *effect_list_node; xmlNode *effect_node; GList *filename; GList *effect; GList *list_start, *list; gchar *id; gboolean found_content; found_content = FALSE; id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-sf-effect-line"); xmlNewProp(node, (xmlChar *) AGS_SIMPLE_FILE_ID_PROP, (xmlChar *) id); /* effect list */ effect_list_node = NULL; effect_node = NULL; filename = NULL; effect = NULL; list_start = list = gtk_container_get_children((GtkContainer *) effect_line->table); while(list != NULL){ if(AGS_IS_LINE_MEMBER(list->data)){ AgsLineMember *line_member; line_member = list->data; if(g_list_find(filename, AGS_LINE_MEMBER(list->data)->filename) == NULL || g_list_find(effect, AGS_LINE_MEMBER(list->data)->effect) == NULL){ GtkWidget *child_widget; if(effect_list_node == NULL){ effect_list_node = xmlNewNode(NULL, "ags-sf-effect-list"); } effect_node = xmlNewNode(NULL, "ags-sf-effect"); filename = g_list_prepend(filename, AGS_LINE_MEMBER(list->data)->filename); effect = g_list_prepend(effect, AGS_LINE_MEMBER(list->data)->effect); ags_simple_file_write_effect_line_control(simple_file, effect_node, list->data); /* add to parent */ xmlAddChild(effect_list_node, effect_node); }else{ ags_simple_file_write_effect_line_control(simple_file, effect_node, list->data); } found_content = TRUE; } list = list->next; } g_list_free(list_start); g_list_free(filename); g_list_free(effect); /* add to parent */ if(effect_list_node != NULL){ xmlAddChild(node, effect_list_node); } g_list_free(list_start); if(found_content){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } xmlNode* ags_simple_file_write_oscillator_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *oscillator) { xmlNode *node; node = xmlNewNode(NULL, "ags-oscillator-list"); while(oscillator != NULL){ ags_simple_file_write_oscillator(simple_file, node, oscillator->data); oscillator = oscillator->next; } xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_oscillator(AgsSimpleFile *simple_file, xmlNode *parent, AgsOscillator *oscillator) { xmlNode *node; xmlChar *str, *tmp; guint i; node = xmlNewNode(NULL, "ags-oscillator"); str = g_strdup_printf("%d", gtk_combo_box_get_active(oscillator->wave)); xmlNewProp(node, "wave", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(oscillator->attack)); xmlNewProp(node, "attack", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(oscillator->frame_count)); xmlNewProp(node, "length", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(oscillator->frequency)); xmlNewProp(node, "frequency", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(oscillator->phase)); xmlNewProp(node, "phase", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(oscillator->volume)); xmlNewProp(node, "volume", str); g_free(str); xmlNewProp(node, "sync", (gtk_toggle_button_get_active((GtkToggleButton *) oscillator->do_sync) ? "true": "false")); str = NULL; for(i = 0; i < 2 * oscillator->sync_point_count; i++){ tmp = str; if(str != NULL){ str = g_strdup_printf("%s %f", str, gtk_spin_button_get_value(oscillator->sync_point[i])); }else{ str = g_strdup_printf("%f", gtk_spin_button_get_value(oscillator->sync_point[2 * i])); } g_free(tmp); } xmlNewProp(node, "sync-point", str); g_free(str); xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_fm_oscillator_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *fm_oscillator) { xmlNode *node; node = xmlNewNode(NULL, "ags-fm-oscillator-list"); while(fm_oscillator != NULL){ ags_simple_file_write_fm_oscillator(simple_file, node, fm_oscillator->data); fm_oscillator = fm_oscillator->next; } xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_fm_oscillator(AgsSimpleFile *simple_file, xmlNode *parent, AgsFMOscillator *fm_oscillator) { xmlNode *node; xmlChar *str, *tmp; guint i; node = xmlNewNode(NULL, "ags-fm-oscillator"); str = g_strdup_printf("%d", gtk_combo_box_get_active(fm_oscillator->wave)); xmlNewProp(node, "wave", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->attack)); xmlNewProp(node, "attack", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->frame_count)); xmlNewProp(node, "length", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->frequency)); xmlNewProp(node, "frequency", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->phase)); xmlNewProp(node, "phase", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->volume)); xmlNewProp(node, "volume", str); g_free(str); xmlNewProp(node, "sync", (gtk_toggle_button_get_active((GtkToggleButton *) fm_oscillator->do_sync) ? "true": "false")); str = NULL; for(i = 0; i < 2 * fm_oscillator->sync_point_count; i++){ tmp = str; if(str != NULL){ str = g_strdup_printf("%s %f", str, gtk_spin_button_get_value(fm_oscillator->sync_point[i])); }else{ str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->sync_point[2 * i])); } g_free(tmp); } xmlNewProp(node, "sync-point", str); g_free(str); str = g_strdup_printf("%d", gtk_combo_box_get_active(fm_oscillator->fm_lfo_wave)); xmlNewProp(node, "fm-lfo-wave", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->fm_lfo_frequency)); xmlNewProp(node, "fm-lfo-frequency", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->fm_lfo_depth)); xmlNewProp(node, "fm-lfo-depth", str); g_free(str); str = g_strdup_printf("%f", gtk_spin_button_get_value(fm_oscillator->fm_tuning)); xmlNewProp(node, "fm-tuning", str); g_free(str); xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_notation_editor(AgsSimpleFile *simple_file, xmlNode *parent, AgsNotationEditor *notation_editor) { AgsFileLookup *file_lookup; xmlNode *node; node = xmlNewNode(NULL, "ags-sf-notation-editor"); xmlNewProp(node, "zoom", gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(notation_editor->notation_toolbar->zoom))); file_lookup = (AgsFileLookup *) g_object_new(AGS_TYPE_FILE_LOOKUP, "file", simple_file, "node", node, "reference", notation_editor, NULL); ags_simple_file_add_lookup(simple_file, (GObject *) file_lookup); g_signal_connect(G_OBJECT(file_lookup), "resolve", G_CALLBACK(ags_simple_file_write_notation_editor_resolve_machine), notation_editor); /* add to parent */ xmlAddChild(parent, node); return(node); } void ags_simple_file_write_notation_editor_resolve_machine(AgsFileLookup *file_lookup, AgsNotationEditor *notation_editor) { xmlNode *node; xmlNode *property_list; xmlNode *property; GList *list_start, *list; GList *file_id_ref; xmlChar *xpath; xmlChar *str; node = file_lookup->node; property_list = NULL; list_start = gtk_container_get_children((GtkContainer *) notation_editor->machine_selector); list = list_start->next; if(list != NULL){ property_list = xmlNewNode(NULL, "ags-sf-property-list"); } while(list != NULL){ if(AGS_MACHINE_RADIO_BUTTON(list->data)->machine != NULL){ property = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(property, "name", "machine"); file_id_ref = ags_simple_file_find_id_ref_by_reference((AgsSimpleFile *) file_lookup->file, AGS_MACHINE_RADIO_BUTTON(list->data)->machine); if(file_id_ref != NULL){ str = xmlGetProp(AGS_FILE_ID_REF(file_id_ref->data)->node, "id"); xpath = g_strdup_printf("xpath=//ags-sf-machine[@id='%s']", str); if(str != NULL){ xmlFree(str); } }else{ xpath = g_strdup("(null)"); } xmlNewProp(property, "value", xpath); /* add to parent */ xmlAddChild(property_list, property); }else{ property = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(property, "name", "machine"); xmlNewProp(property, "value", "(null)"); /* add to parent */ xmlAddChild(property_list, property); } list = list->next; } /* add to parent */ xmlAddChild(node, property_list); g_list_free(list_start); } xmlNode* ags_simple_file_write_automation_editor(AgsSimpleFile *simple_file, xmlNode *parent, AgsAutomationEditor *automation_editor) { AgsFileLookup *file_lookup; xmlNode *node; node = xmlNewNode(NULL, "ags-sf-automation-editor"); xmlNewProp(node, "zoom", gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(automation_editor->automation_toolbar->zoom))); file_lookup = (AgsFileLookup *) g_object_new(AGS_TYPE_FILE_LOOKUP, "file", simple_file, "node", node, "reference", automation_editor, NULL); ags_simple_file_add_lookup(simple_file, (GObject *) file_lookup); g_signal_connect(G_OBJECT(file_lookup), "resolve", G_CALLBACK(ags_simple_file_write_automation_editor_resolve_machine), automation_editor); /* add to parent */ xmlAddChild(parent, node); return(node); } void ags_simple_file_write_automation_editor_resolve_machine(AgsFileLookup *file_lookup, AgsAutomationEditor *automation_editor) { xmlNode *node; xmlNode *property_list; xmlNode *property; GList *list_start, *list; GList *file_id_ref; xmlChar *xpath; xmlChar *str; node = file_lookup->node; property_list = NULL; list_start = gtk_container_get_children((GtkContainer *) automation_editor->machine_selector); list = list_start->next; if(list != NULL){ property_list = xmlNewNode(NULL, "ags-sf-property-list"); } while(list != NULL){ if(AGS_MACHINE_RADIO_BUTTON(list->data)->machine != NULL){ property = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(property, "name", "machine"); file_id_ref = ags_simple_file_find_id_ref_by_reference((AgsSimpleFile *) file_lookup->file, AGS_MACHINE_RADIO_BUTTON(list->data)->machine); if(file_id_ref != NULL){ str = xmlGetProp(AGS_FILE_ID_REF(file_id_ref->data)->node, "id"); xpath = g_strdup_printf("xpath=//ags-sf-machine[@id='%s']", str); if(str != NULL){ xmlFree(str); } }else{ xpath = g_strdup("(null)"); } xmlNewProp(property, "value", xpath); /* add to parent */ xmlAddChild(property_list, property); }else{ property = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(property, "name", "machine"); xmlNewProp(property, "value", "(null)"); /* add to parent */ xmlAddChild(property_list, property); } list = list->next; } /* add to parent */ xmlAddChild(node, property_list); g_list_free(list_start); } xmlNode* ags_simple_file_write_wave_editor(AgsSimpleFile *simple_file, xmlNode *parent, AgsWaveEditor *wave_editor) { AgsFileLookup *file_lookup; xmlNode *node; node = xmlNewNode(NULL, "ags-sf-wave-editor"); xmlNewProp(node, "zoom", gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(wave_editor->wave_toolbar->zoom))); file_lookup = (AgsFileLookup *) g_object_new(AGS_TYPE_FILE_LOOKUP, "file", simple_file, "node", node, "reference", wave_editor, NULL); ags_simple_file_add_lookup(simple_file, (GObject *) file_lookup); g_signal_connect(G_OBJECT(file_lookup), "resolve", G_CALLBACK(ags_simple_file_write_wave_editor_resolve_machine), wave_editor); /* add to parent */ xmlAddChild(parent, node); return(node); } void ags_simple_file_write_wave_editor_resolve_machine(AgsFileLookup *file_lookup, AgsWaveEditor *wave_editor) { xmlNode *node; xmlNode *property_list; xmlNode *property; GList *list_start, *list; GList *file_id_ref; xmlChar *xpath; xmlChar *str; node = file_lookup->node; property_list = NULL; list_start = gtk_container_get_children((GtkContainer *) wave_editor->machine_selector); list = list_start->next; if(list != NULL){ property_list = xmlNewNode(NULL, "ags-sf-property-list"); } while(list != NULL){ if(AGS_MACHINE_RADIO_BUTTON(list->data)->machine != NULL){ property = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(property, "name", "machine"); file_id_ref = ags_simple_file_find_id_ref_by_reference((AgsSimpleFile *) file_lookup->file, AGS_MACHINE_RADIO_BUTTON(list->data)->machine); if(file_id_ref != NULL){ str = xmlGetProp(AGS_FILE_ID_REF(file_id_ref->data)->node, "id"); xpath = g_strdup_printf("xpath=//ags-sf-machine[@id='%s']", str); if(str != NULL){ xmlFree(str); } }else{ xpath = g_strdup("(null)"); } xmlNewProp(property, "value", xpath); /* add to parent */ xmlAddChild(property_list, property); }else{ property = xmlNewNode(NULL, "ags-sf-property"); xmlNewProp(property, "name", "machine"); xmlNewProp(property, "value", "(null)"); /* add to parent */ xmlAddChild(property_list, property); } list = list->next; } /* add to parent */ xmlAddChild(node, property_list); g_list_free(list_start); } xmlNode* ags_simple_file_write_notation_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *notation) { xmlNode *node; node = xmlNewNode(NULL, "ags-sf-notation-list"); while(notation != NULL){ ags_simple_file_write_notation(simple_file, node, notation->data); notation = notation->next; } /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_notation(AgsSimpleFile *simple_file, xmlNode *parent, AgsNotation *notation) { xmlNode *node; xmlNode *child; GList *list; gchar *str; node = xmlNewNode(NULL, "ags-sf-notation"); xmlNewProp(node, "channel", g_strdup_printf("%d", notation->audio_channel)); /* timestamp */ child = xmlNewNode(NULL, "ags-sf-timestamp"); str = g_strdup_printf("%lu", notation->timestamp->timer.ags_offset.offset); xmlNewProp(child, "offset", str); g_free(str); /* add to parent */ xmlAddChild(node, child); /* note */ list = notation->note; while(list != NULL){ child = xmlNewNode(NULL, "ags-sf-note"); str = g_strdup_printf("%d", AGS_NOTE(list->data)->x[0]); xmlNewProp(child, "x0", str); g_free(str); str = g_strdup_printf("%d", AGS_NOTE(list->data)->x[1]); xmlNewProp(child, "x1", str); g_free(str); str = g_strdup_printf("%d", AGS_NOTE(list->data)->y); xmlNewProp(child, "y", str); g_free(str); if((AGS_NOTE_ENVELOPE & (AGS_NOTE(list->data)->flags)) != 0){ xmlNewProp(child, "envelope", "true"); } str = g_strdup_printf("%Lf %Lf", AGS_NOTE(list->data)->attack.real, AGS_NOTE(list->data)->attack.imag); xmlNewProp(child, "attack", str); g_free(str); str = g_strdup_printf("%Lf %Lf", AGS_NOTE(list->data)->decay.real, AGS_NOTE(list->data)->decay.imag); xmlNewProp(child, "decay", str); g_free(str); str = g_strdup_printf("%Lf %Lf", AGS_NOTE(list->data)->sustain.real, AGS_NOTE(list->data)->sustain.imag); xmlNewProp(child, "sustain", str); g_free(str); str = g_strdup_printf("%Lf %Lf", AGS_NOTE(list->data)->release.real, AGS_NOTE(list->data)->release.imag); xmlNewProp(child, "release", str); g_free(str); str = g_strdup_printf("%Lf %Lf", AGS_NOTE(list->data)->ratio.real, AGS_NOTE(list->data)->ratio.imag); xmlNewProp(child, "ratio", str); g_free(str); /* add to parent */ xmlAddChild(node, child); list = list->next; } /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_automation_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *automation) { xmlNode *node; node = xmlNewNode(NULL, "ags-sf-automation-list"); while(automation != NULL){ ags_simple_file_write_automation(simple_file, node, automation->data); automation = automation->next; } /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_automation(AgsSimpleFile *simple_file, xmlNode *parent, AgsAutomation *automation) { xmlNode *node; xmlNode *child; GList *list; gchar *str; node = xmlNewNode(NULL, "ags-sf-automation"); xmlNewProp(node, "line", g_strdup_printf("%d", automation->line)); /* timestamp */ child = xmlNewNode(NULL, "ags-sf-timestamp"); xmlNewProp(child, "offset", g_strdup_printf("%lu", automation->timestamp->timer.ags_offset.offset)); /* add to parent */ xmlAddChild(node, child); /* acceleration */ list = automation->acceleration; while(list != NULL){ child = xmlNewNode(NULL, "ags-sf-acceleration"); str = g_strdup_printf("%d", AGS_ACCELERATION(list->data)->x); xmlNewProp(child, "x", str); g_free(str); str = g_strdup_printf("%f", AGS_ACCELERATION(list->data)->y); xmlNewProp(child, "y", str); g_free(str); /* add to parent */ xmlAddChild(node, child); list = list->next; } /* add to parent */ xmlAddChild(parent, node); return(node); } xmlNode* ags_simple_file_write_preset_list(AgsSimpleFile *simple_file, xmlNode *parent, GList *preset) { xmlNode *node; gboolean found_node; node = xmlNewNode(NULL, "ags-sf-preset-list"); found_node = FALSE; while(preset != NULL){ if(ags_simple_file_write_preset(simple_file, node, preset->data) != NULL){ found_node = TRUE; } preset = preset->next; } if(found_node){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } xmlNode* ags_simple_file_write_preset(AgsSimpleFile *simple_file, xmlNode *parent, AgsPreset *preset) { xmlNode *node; xmlNode *child; gchar *str; guint i; node = xmlNewNode(NULL, "ags-sf-preset"); /* scope and preset name */ xmlNewProp(node, "scope", g_strdup(preset->scope)); xmlNewProp(node, "preset-name", g_strdup(preset->preset_name)); /* mapping */ str = g_strdup_printf("%d", preset->audio_channel_start); xmlNewProp(node, "audio-channel-start", str); g_free(str); str = g_strdup_printf("%d", preset->audio_channel_end); xmlNewProp(node, "audio-channel-end", str); g_free(str); str = g_strdup_printf("%d", preset->pad_start); xmlNewProp(node, "pad-start", str); g_free(str); str = g_strdup_printf("%d", preset->pad_end); xmlNewProp(node, "pad-end", str); g_free(str); str = g_strdup_printf("%d", preset->x_start); xmlNewProp(node, "x-start", str); g_free(str); str = g_strdup_printf("%d", preset->x_end); xmlNewProp(node, "x-end", str); g_free(str); /* parameter */ ags_simple_file_write_strv(simple_file, node, preset->parameter_name); for(i = 0; i < preset->n_params; i++){ ags_simple_file_write_value(simple_file, node, &(preset->value[i])); } if(preset->n_params > 0){ /* add to parent */ xmlAddChild(parent, node); return(node); }else{ xmlFreeNode(node); return(NULL); } } AgsSimpleFile* ags_simple_file_new() { AgsSimpleFile *simple_file; simple_file = (AgsSimpleFile *) g_object_new(AGS_TYPE_SIMPLE_FILE, NULL); return(simple_file); } gsequencer-3.1.3/ags/X/file/ags_simple_file.h0000644000175000017500000001223313613101102015760 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SIMPLE_FILE_H__ #define __AGS_SIMPLE_FILE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SIMPLE_FILE (ags_simple_file_get_type()) #define AGS_SIMPLE_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SIMPLE_FILE, AgsSimpleFile)) #define AGS_SIMPLE_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SIMPLE_FILE, AgsSimpleFileClass)) #define AGS_IS_SIMPLE_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SIMPLE_FILE)) #define AGS_IS_SIMPLE_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SIMPLE_FILE)) #define AGS_SIMPLE_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SIMPLE_FILE, AgsSimpleFileClass)) #define AGS_SIMPLE_FILE_DEFAULT_ENCODING "UTF-8" #define AGS_SIMPLE_FILE_DEFAULT_DTD "ags_simple_file.dtd" #define AGS_SIMPLE_FILE_CHECKSUM_LENGTH (g_checksum_type_get_length(G_CHECKSUM_MD5)) #define AGS_SIMPLE_FILE_DEFAULT_AUDIO_FORMAT "raw" #define AGS_SIMPLE_FILE_DEFAULT_AUDIO_ENCODING "base64" #define AGS_SIMPLE_FILE_ID_PROP "id" #define AGS_SIMPLE_FILE_NAME_PROP "name" #define AGS_SIMPLE_FILE_TYPE_PROP "type" #define AGS_SIMPLE_FILE_VERSION_PROP "version" #define AGS_SIMPLE_FILE_BUILD_ID_PROP "build-id" #define AGS_SIMPLE_FILE_TRUE "true" #define AGS_SIMPLE_FILE_FALSE "false" typedef struct _AgsSimpleFile AgsSimpleFile; typedef struct _AgsSimpleFileClass AgsSimpleFileClass; typedef enum{ AGS_SIMPLE_FILE_READ_BASIC = 1, AGS_SIMPLE_FILE_READ_AUDIO_SIGNAL = 1 << 1, AGS_SIMPLE_FILE_READ_EMBEDDED_AUDIO = 1 << 2, AGS_SIMPLE_FILE_WRITE_BASIC = 1 << 3, AGS_SIMPLE_FILE_WRITE_AUDIO_SIGNAL = 1 << 4, AGS_SIMPLE_FILE_WRITE_EMBEDDED_AUDIO = 1 << 5, }AgsSimpleFileFlags; #define AGS_SIMPLE_FILE_ERROR (ags_simple_file_error_quark()) typedef enum{ AGS_SIMPLE_FILE_ERROR_PARSER_FAILURE, }AgsSimpleFileError; struct _AgsSimpleFile { GObject gobject; guint flags; FILE *out; xmlChar *buffer; gchar *filename; gchar *encoding; gchar *dtd; gchar *audio_format; gchar *audio_encoding; xmlDoc *doc; xmlNode *root_node; GList *id_ref; GList *lookup; GList *launch; }; struct _AgsSimpleFileClass { GObjectClass gobject; void (*open)(AgsSimpleFile *simple_file, GError **error); void (*open_from_data)(AgsSimpleFile *simple_file, gchar *data, guint length, GError **error); void (*rw_open)(AgsSimpleFile *simple_file, gboolean create, GError **error); void (*write)(AgsSimpleFile *simple_file); void (*write_resolve)(AgsSimpleFile *simple_file); void (*read)(AgsSimpleFile *simple_file); void (*read_resolve)(AgsSimpleFile *simple_file); void (*read_start)(AgsSimpleFile *simple_file); }; GType ags_simple_file_get_type(void); gchar* ags_simple_file_str2md5(gchar *content, guint content_length); void ags_simple_file_add_id_ref(AgsSimpleFile *simple_file, GObject *id_ref); GObject* ags_simple_file_find_id_ref_by_node(AgsSimpleFile *simple_file, xmlNode *node); GList* ags_simple_file_find_id_ref_by_xpath(AgsSimpleFile *simple_file, gchar *xpath); GList* ags_simple_file_find_id_ref_by_reference(AgsSimpleFile *simple_file, gpointer ref); void ags_simple_file_add_lookup(AgsSimpleFile *simple_file, GObject *file_lookup); void ags_simple_file_add_launch(AgsSimpleFile *simple_file, GObject *file_launch); /* */ void ags_simple_file_open(AgsSimpleFile *simple_file, GError **error); void ags_simple_file_open_from_data(AgsSimpleFile *simple_file, gchar *data, guint length, GError **error); void ags_simple_file_rw_open(AgsSimpleFile *simple_file, gboolean create, GError **error); void ags_simple_file_open_filename(AgsSimpleFile *simple_file, gchar *filename); void ags_simple_file_close(AgsSimpleFile *simple_file); /* */ void ags_simple_file_write(AgsSimpleFile *simple_file); void ags_simple_file_write_resolve(AgsSimpleFile *simple_file); void ags_simple_file_read(AgsSimpleFile *simple_file); void ags_simple_file_read_resolve(AgsSimpleFile *simple_file); void ags_simple_file_read_start(AgsSimpleFile *simple_file); void ags_simple_file_read_config(AgsSimpleFile *simple_file, xmlNode *node, AgsConfig **ags_config); /* */ AgsSimpleFile* ags_simple_file_new(); G_END_DECLS #endif /*__AGS_SIMPLE_FILE_H__*/ gsequencer-3.1.3/ags/X/ags_link_editor.c0000644000175000017500000003253213607210263015067 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_link_editor_class_init(AgsLinkEditorClass *link_editor); void ags_link_editor_connectable_interface_init(AgsConnectableInterface *connectable); void ags_link_editor_applicable_interface_init(AgsApplicableInterface *applicable); void ags_link_editor_init(AgsLinkEditor *link_editor); void ags_link_editor_connect(AgsConnectable *connectable); void ags_link_editor_disconnect(AgsConnectable *connectable); void ags_link_editor_set_update(AgsApplicable *applicable, gboolean update); void ags_link_editor_apply(AgsApplicable *applicable); void ags_link_editor_reset(AgsApplicable *applicable); /** * SECTION:ags_link_editor * @short_description: Edit links. * @title: AgsLinkEditor * @section_id: * @include: ags/X/ags_link_editor.h * * #AgsLinkEditor is a composite widget to modify links. A link editor * should be packed by a #AgsLineEditor. */ static gpointer ags_link_editor_parent_class = NULL; GType ags_link_editor_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_link_editor = 0; static const GTypeInfo ags_link_editor_info = { sizeof (AgsLinkEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_link_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLinkEditor), 0, /* n_preallocs */ (GInstanceInitFunc) ags_link_editor_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_link_editor_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_applicable_interface_info = { (GInterfaceInitFunc) ags_link_editor_applicable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_link_editor = g_type_register_static(GTK_TYPE_HBOX, "AgsLinkEditor", &ags_link_editor_info, 0); g_type_add_interface_static(ags_type_link_editor, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_link_editor, AGS_TYPE_APPLICABLE, &ags_applicable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_link_editor); } return g_define_type_id__volatile; } void ags_link_editor_class_init(AgsLinkEditorClass *link_editor) { ags_link_editor_parent_class = g_type_class_peek_parent(link_editor); } void ags_link_editor_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->is_ready = NULL; connectable->is_connected = NULL; connectable->connect = ags_link_editor_connect; connectable->disconnect = ags_link_editor_disconnect; } void ags_link_editor_applicable_interface_init(AgsApplicableInterface *applicable) { applicable->set_update = ags_link_editor_set_update; applicable->apply = ags_link_editor_apply; applicable->reset = ags_link_editor_reset; } void ags_link_editor_init(AgsLinkEditor *link_editor) { GtkCellRenderer *cell_renderer; g_signal_connect_after((GObject *) link_editor, "parent_set", G_CALLBACK(ags_link_editor_parent_set_callback), (gpointer) link_editor); link_editor->flags = 0; /* linking machine */ link_editor->combo = (GtkComboBox *) gtk_combo_box_new(); gtk_box_pack_start(GTK_BOX(link_editor), GTK_WIDGET(link_editor->combo), FALSE, FALSE, 0); cell_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(link_editor->combo), cell_renderer, FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(link_editor->combo), cell_renderer, "text", 0, NULL); /* link with line */ link_editor->spin_button = (GtkSpinButton *) gtk_spin_button_new_with_range(0.0, 0.0, 1.0); gtk_box_pack_start(GTK_BOX(link_editor), GTK_WIDGET(link_editor->spin_button), FALSE, FALSE, 0); link_editor->audio_file = NULL; link_editor->file_chooser = NULL; } void ags_link_editor_connect(AgsConnectable *connectable) { AgsLinkEditor *link_editor; link_editor = AGS_LINK_EDITOR(connectable); if((AGS_LINK_EDITOR_CONNECTED & (link_editor->flags)) != 0){ return; } link_editor->flags |= AGS_LINK_EDITOR_CONNECTED; /* GtkComboBox */ g_signal_connect(G_OBJECT(link_editor->combo), "changed", G_CALLBACK(ags_link_editor_combo_callback), link_editor); } void ags_link_editor_disconnect(AgsConnectable *connectable) { AgsLinkEditor *link_editor; link_editor = AGS_LINK_EDITOR(connectable); if((AGS_LINK_EDITOR_CONNECTED & (link_editor->flags)) == 0){ return; } link_editor->flags &= (~AGS_LINK_EDITOR_CONNECTED); /* GtkComboBox */ g_object_disconnect(G_OBJECT(link_editor->combo), "any_signal::changed", G_CALLBACK(ags_link_editor_combo_callback), link_editor, NULL); } void ags_link_editor_set_update(AgsApplicable *applicable, gboolean update) { /* empty */ } void ags_link_editor_apply(AgsApplicable *applicable) { AgsLinkEditor *link_editor; GtkTreeIter iter; link_editor = AGS_LINK_EDITOR(applicable); /* reset */ if(gtk_combo_box_get_active_iter(link_editor->combo, &iter)){ AgsWindow *window; AgsMachine *link_machine, *machine; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; GtkTreeModel *model; AgsAudio *audio; AgsChannel *start_link; AgsChannel *channel, *link; AgsLinkChannel *link_channel; GObject *output_soundcard; AgsApplicationContext *application_context; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(link_editor), AGS_TYPE_LINE_EDITOR)); machine_editor = AGS_MACHINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(line_editor), AGS_TYPE_MACHINE_EDITOR)); machine = machine_editor->machine; window = AGS_WINDOW(gtk_widget_get_ancestor(GTK_WIDGET(machine), AGS_TYPE_WINDOW)); /* get channel */ channel = line_editor->channel; /* get audio */ g_object_get(channel, "audio", &audio, "output-soundcard", &output_soundcard, NULL); /* application context */ application_context = ags_application_context_get_instance(); /* get model */ model = gtk_combo_box_get_model(link_editor->combo); gtk_tree_model_get(model, &iter, 1, &link_machine, -1); if(link_machine == NULL){ if((AGS_MACHINE_TAKES_FILE_INPUT & (machine->flags)) != 0 && ((AGS_MACHINE_ACCEPT_WAV & (machine->file_input_flags)) != 0 || ((AGS_MACHINE_ACCEPT_OGG & (machine->file_input_flags)) != 0)) && gtk_combo_box_get_active(link_editor->combo) + 1 == gtk_tree_model_iter_n_children(model, NULL)){ AgsOpenSingleFile *open_single_file; gchar *str, *filename; gtk_tree_model_get(model, &iter, 0, &str, -1); filename = g_strdup(str + 7); if(g_strcmp0(filename, "")){ open_single_file = ags_open_single_file_new(channel, filename, (guint) gtk_spin_button_get_value_as_int(link_editor->spin_button)); /* append AgsLinkChannel */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) open_single_file); } }else{ /* create task */ link_channel = ags_link_channel_new(channel, NULL); /* append AgsLinkChannel */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) link_channel); } }else{ guint link_line; gboolean is_output; link_line = (guint) gtk_spin_button_get_value_as_int(link_editor->spin_button); is_output = (AGS_IS_OUTPUT(channel)) ? TRUE: FALSE; /* get link */ if(!is_output){ g_object_get(link_machine->audio, "output", &start_link, NULL); }else{ g_object_get(link_machine->audio, "input", &start_link, NULL); } link = ags_channel_nth(start_link, link_line); /* create task */ link_channel = ags_link_channel_new(channel, link); if(link != NULL){ g_object_unref(link); } /* unref */ if(start_link != NULL){ g_object_unref(start_link); } /* append AgsLinkChannel */ ags_ui_provider_schedule_task(AGS_UI_PROVIDER(application_context), (AgsTask *) link_channel); } g_object_unref(audio); g_object_unref(output_soundcard); } } void ags_link_editor_reset(AgsApplicable *applicable) { AgsLinkEditor *link_editor; GtkTreeModel *model; GtkTreeIter iter; link_editor = AGS_LINK_EDITOR(applicable); model = gtk_combo_box_get_model(link_editor->combo); if(gtk_tree_model_get_iter_first(model, &iter)){ AgsMachine *machine, *link_machine, *link; AgsMachineEditor *machine_editor; AgsLineEditor *line_editor; AgsAudio *audio; AgsChannel *channel, *link_channel; gint i; gboolean found; line_editor = AGS_LINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(link_editor), AGS_TYPE_LINE_EDITOR)); machine_editor = AGS_MACHINE_EDITOR(gtk_widget_get_ancestor(GTK_WIDGET(line_editor), AGS_TYPE_MACHINE_EDITOR)); machine = machine_editor->machine; channel = line_editor->channel; /* get audio and channel's link */ g_object_get(channel, "audio", &audio, "link", &link_channel, NULL); g_object_unref(audio); if(link_channel != NULL){ g_object_unref(link_channel); } /* */ if(link_channel != NULL){ AgsAudio *link_audio; /* get audio */ g_object_get(link_channel, "audio", &link_audio, NULL); g_object_unref(link_audio); /* get machine */ //FIXME:JK: don't access AgsAudio to obtain widget link_machine = (AgsMachine *) link_audio->machine_widget; }else{ link_machine = NULL; } i = 0; found = FALSE; if(link_machine != NULL){ do{ gtk_tree_model_get(model, &iter, 1, &link, -1); if(link_machine == link){ found = TRUE; break; } i++; }while(gtk_tree_model_iter_next(model, &iter)); } gtk_widget_set_sensitive((GtkWidget *) link_editor->spin_button, FALSE); if(found){ /* set channel link */ gtk_combo_box_set_active(link_editor->combo, i); if(link_channel == NULL){ gtk_spin_button_set_value(link_editor->spin_button, 0); }else{ gtk_spin_button_set_value(link_editor->spin_button, link_channel->line); } }else{ gtk_combo_box_set_active(link_editor->combo, 0); } /* set file link */ if((AGS_MACHINE_TAKES_FILE_INPUT & (machine->flags)) != 0 && ((AGS_MACHINE_ACCEPT_WAV & (machine->file_input_flags)) != 0 || (AGS_MACHINE_ACCEPT_OGG & (machine->file_input_flags)) != 0) && AGS_IS_INPUT(channel)){ AgsFileLink *file_link; gtk_tree_model_iter_nth_child(model, &iter, NULL, gtk_tree_model_iter_n_children(model, NULL) - 1); g_object_get(channel, "file-link", &file_link, NULL); if(file_link != NULL){ gchar *filename; guint audio_channel; /* get some fields */ g_object_get(file_link, "filename", &filename, "audio-channel", &audio_channel, NULL); /* add file link */ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, g_strdup_printf("file://%s", filename), 1, NULL, -1); /* file link set active */ link_editor->flags |= AGS_LINK_EDITOR_BLOCK_FILE_CHOOSER; gtk_combo_box_set_active(link_editor->combo, gtk_tree_model_iter_n_children(model, NULL) - 1); /* set spin button insensitive */ gtk_spin_button_set_range(link_editor->spin_button, 0.0, 256.0); gtk_spin_button_set_value(link_editor->spin_button, audio_channel); gtk_widget_set_sensitive((GtkWidget *) link_editor->spin_button, FALSE); /* re-enable file chooser */ link_editor->flags &= (~AGS_LINK_EDITOR_BLOCK_FILE_CHOOSER); g_free(filename); g_object_unref(file_link); }else{ gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, "file://", 1, NULL, -1); } } } } /** * ags_link_editor_new: * * Create a new instance of #AgsLinkEditor * * Returns: the new #AgsLinkEditor * * Since: 3.0.0 */ AgsLinkEditor* ags_link_editor_new() { AgsLinkEditor *link_editor; link_editor = (AgsLinkEditor *) g_object_new(AGS_TYPE_LINK_EDITOR, NULL); return(link_editor); } gsequencer-3.1.3/ags/gsequencer_main.c0000644000175000017500000002507313614062654014701 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "config.h" #include #include #include #include #include #ifdef AGS_WITH_QUARTZ #include #endif #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include #include #include #include #include #include #include #define _GNU_SOURCE #include #include #ifndef AGS_W32API #include #include #endif #include #include "gsequencer_main.h" #include void* ags_setup_thread(void *ptr); void ags_setup(int argc, char **argv); extern AgsApplicationContext *ags_application_context; void* ags_setup_thread(void *ptr) { AgsXorgApplicationContext *xorg_application_context; xorg_application_context = (AgsXorgApplicationContext *) ptr; while(g_atomic_int_get(&(xorg_application_context->gui_ready)) == 0){ usleep(500000); } ags_application_context_setup(AGS_APPLICATION_CONTEXT(xorg_application_context)); g_thread_exit(NULL); return(NULL); } void ags_setup(int argc, char **argv) { AgsApplicationContext *application_context; AgsLog *log; /* application context */ application_context = ags_application_context = (AgsApplicationContext *) ags_xorg_application_context_new(); g_object_ref(application_context); application_context->argc = argc; application_context->argv = argv; log = ags_log_get_instance(); ags_log_add_message(log, "Welcome to Advanced Gtk+ Sequencer"); /* application context */ g_thread_new("Advanced Gtk+ Sequencer - setup", ags_setup_thread, application_context); ags_application_context_prepare(application_context); } int main(int argc, char **argv) { GtkCssProvider *css_provider; AgsConfig *config; AgsPriority *priority; gchar *filename; #if defined AGS_W32API gchar *app_dir; gchar *path; #endif gboolean builtin_theme_disabled; guint i; #ifdef AGS_WITH_RT struct sched_param param; struct rlimit rl; #endif #ifndef AGS_W32API struct passwd *pw; uid_t uid; #endif gchar *wdir; gchar *config_filename; gchar *priority_filename; gchar *css_filename; gchar *str; gboolean has_file; int result; #ifdef AGS_WITH_RT const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb #endif setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); builtin_theme_disabled = FALSE; config = NULL; priority = ags_priority_get_instance(); ags_priority_load_defaults(priority); // mtrace(); #if defined (AGS_W32API) app_dir = NULL; if(strlen(argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(argv[0], strlen(argv[0]) - strlen("\\gsequencer.exe")); } putenv(g_strdup_printf("XDG_DATA_DIRS=%s\\share", app_dir)); putenv(g_strdup_printf("XDG_CONFIG_HOME=%s\\etc", app_dir)); putenv(g_strdup_printf("GDK_PIXBUF_MODULE_FILE=%s\\lib\\gdk-pixbuf-2.0\\2.10.0\\loaders.cache", app_dir)); putenv(g_strdup_printf("GTK_EXE_PREFIX=%s", app_dir)); putenv(g_strdup_printf("GTK_DATA_PREFIX=%s\\share", app_dir)); putenv(g_strdup_printf("GTK_PATH=%s", app_dir)); putenv(g_strdup_printf("GTK_IM_MODULE_FILE=%s\\lib\\gtk-3.0\\3.0.0\\immodules.cache", app_dir)); if(getenv("GTK_THEME") == NULL){ putenv(g_strdup("GTK_THEME=BlueMenta")); } #else uid = getuid(); pw = getpwuid(uid); wdir = g_strdup_printf("%s/%s", pw->pw_dir, AGS_DEFAULT_DIRECTORY); priority_filename = g_strdup_printf("%s/priority.conf", wdir); ags_priority_load_from_file(priority, priority_filename); g_free(priority_filename); g_free(wdir); #endif /* real-time setup */ #ifdef AGS_WITH_RT result = getrlimit(RLIMIT_STACK, &rl); /* set stack size 64M */ if(result == 0){ if(rl.rlim_cur < kStackSize){ rl.rlim_cur = kStackSize; result = setrlimit(RLIMIT_STACK, &rl); if(result != 0){ //TODO:JK } } } param.sched_priority = 15; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_GUI_MAIN_LOOP); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); #endif /* parse command line parameter */ filename = NULL; has_file = FALSE; for(i = 0; i < argc; i++){ if(!strncmp(argv[i], "--help", 7)){ printf("GSequencer is an audio sequencer and notation editor\n\n"); printf("Usage:\n\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n\n", "Report bugs to \n", "--filename file open file", "--no-builtin-theme disable built-in theme", "--help display this help and exit", "--version output version information and exit"); exit(0); }else if(!strncmp(argv[i], "--version", 10)){ printf("GSequencer %s\n\n", AGS_VERSION); printf("%s\n%s\n%s\n\n", "Copyright (C) 2005-2020 Joël Krähemann", "This is free software; see the source for copying conditions. There is NO", "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); printf("Written by Joël Krähemann\n"); exit(0); }else if(!strncmp(argv[i], "--no-builtin-theme", 19)){ builtin_theme_disabled = TRUE; }else if(!strncmp(argv[i], "--filename", 11)){ filename = argv[i + 1]; i++; if(g_file_test(filename, G_FILE_TEST_EXISTS) && g_file_test(filename, G_FILE_TEST_IS_REGULAR)){ has_file = TRUE; } } } css_filename = NULL; #ifdef AGS_W32API if(!builtin_theme_disabled){ app_dir = NULL; if(strlen(argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(argv[0], strlen(argv[0]) - strlen("\\gsequencer.exe")); } if((css_filename = getenv("AGS_CSS_FILENAME")) == NULL){ css_filename = g_strdup_printf("%s\\share\\gsequencer\\styles\\ags.css", g_get_current_dir()); if(!g_file_test(css_filename, G_FILE_TEST_IS_REGULAR)){ g_free(css_filename); if(g_path_is_absolute(app_dir)){ css_filename = g_strdup_printf("%s\\%s", app_dir, "\\share\\gsequencer\\styles\\ags.css"); }else{ css_filename = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\share\\gsequencer\\styles\\ags.css"); } } }else{ css_filename = g_strdup(css_filename); } g_free(app_dir); } #else uid = getuid(); pw = getpwuid(uid); /* parse rc file */ if(!builtin_theme_disabled){ css_filename = g_strdup_printf("%s/%s/ags.css", pw->pw_dir, AGS_DEFAULT_DIRECTORY); if(!g_file_test(css_filename, G_FILE_TEST_IS_REGULAR)){ g_free(css_filename); #ifdef AGS_CSS_FILENAME css_filename = g_strdup(AGS_CSS_FILENAME); #else if((css_filename = getenv("AGS_CSS_FILENAME")) == NULL){ css_filename = g_strdup_printf("%s%s", DESTDIR, "/gsequencer/styles/ags.css"); }else{ css_filename = g_strdup(css_filename); } #endif } } #endif /**/ LIBXML_TEST_VERSION; xmlInitParser(); //ao_initialize(); // gdk_threads_enter(); // g_thread_init(NULL); gtk_init(&argc, &argv); #ifdef AGS_WITH_QUARTZ g_object_new(GTKOSX_TYPE_APPLICATION, NULL); #endif #ifdef AGS_WITH_LIBINSTPATCH ipatch_init(); #endif #if 0 g_log_set_fatal_mask("GLib", G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("libInstPatch", G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("GLib-GObject", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask(NULL, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); g_log_set_fatal_mask("Gtk", G_LOG_LEVEL_CRITICAL); #endif g_set_application_name(i18n("Advanced Gtk+ Sequencer")); gtk_window_set_default_icon_name("gsequencer"); g_setenv("PULSE_PROP_media.role", "production", TRUE); css_provider = gtk_css_provider_new(); gtk_css_provider_load_from_path(css_provider, css_filename, NULL); gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), GTK_STYLE_PROVIDER(css_provider), GTK_STYLE_PROVIDER_PRIORITY_USER); g_free(css_filename); /* setup */ if(!has_file){ #ifdef AGS_W32API app_dir = NULL; if(strlen(argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(argv[0], strlen(argv[0]) - strlen("\\gsequencer.exe")); } path = g_strdup_printf("%s\\etc\\gsequencer", g_get_current_dir()); if(!g_file_test(path, G_FILE_TEST_IS_DIR)){ g_free(path); if(g_path_is_absolute(app_dir)){ path = g_strdup_printf("%s\\%s", app_dir, "\\etc\\gsequencer"); }else{ path = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\etc\\gsequencer"); } } config_filename = g_strdup_printf("%s\\%s", path, AGS_DEFAULT_CONFIG); g_free(path); #else wdir = g_strdup_printf("%s/%s", pw->pw_dir, AGS_DEFAULT_DIRECTORY); config_filename = g_strdup_printf("%s/%s", wdir, AGS_DEFAULT_CONFIG); g_free(wdir); #endif config = ags_config_get_instance(); ags_config_load_from_file(config, config_filename); g_free(config_filename); } /* some GUI scaling */ if(!builtin_theme_disabled && !has_file){ // ags_xorg_application_context_load_gui_scale(ags_application_context_get_instance()); } ags_setup(argc, argv); // muntrace(); return(0); } gsequencer-3.1.3/ags/libags.h0000644000175000017500000001003513607210263012763 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __LIBAGS_H__ #define __LIBAGS_H__ #include #include #include #include /* library */ #include #include #include #include #include #include #include #include #include #include #include #include /* object */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* file */ #include #include #include #include #include /* thread */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* server */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /*__LIBAGS_H__*/ gsequencer-3.1.3/ags/audio/0000755000175000017500000000000013622252263012536 500000000000000gsequencer-3.1.3/ags/audio/ags_playback_domain.c0000644000175000017500000004362413613101164016573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_playback_domain_class_init(AgsPlaybackDomainClass *playback_domain); void ags_playback_domain_init(AgsPlaybackDomain *playback_domain); void ags_playback_domain_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_playback_domain_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_playback_domain_dispose(GObject *gobject); void ags_playback_domain_finalize(GObject *gobject); /** * SECTION:ags_playback_domain * @short_description: Outputting to soundcard domain * @title: AgsPlaybackDomain * @section_id: * @include: ags/audio/ags_playback_domain.h * * #AgsPlaybackDomain represents a domain to output. */ static gpointer ags_playback_domain_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_OUTPUT_PLAYBACK, PROP_INPUT_PLAYBACK, }; GType ags_playback_domain_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_playback_domain = 0; static const GTypeInfo ags_playback_domain_info = { sizeof(AgsPlaybackDomainClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_playback_domain_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPlaybackDomain), 0, /* n_preallocs */ (GInstanceInitFunc) ags_playback_domain_init, }; ags_type_playback_domain = g_type_register_static(G_TYPE_OBJECT, "AgsPlaybackDomain", &ags_playback_domain_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_playback_domain); } return g_define_type_id__volatile; } void ags_playback_domain_class_init(AgsPlaybackDomainClass *playback_domain) { GObjectClass *gobject; GParamSpec *param_spec; ags_playback_domain_parent_class = g_type_class_peek_parent(playback_domain); /* GObjectClass */ gobject = (GObjectClass *) playback_domain; gobject->set_property = ags_playback_domain_set_property; gobject->get_property = ags_playback_domain_get_property; gobject->dispose = ags_playback_domain_dispose; gobject->finalize = ags_playback_domain_finalize; /* properties */ /** * AgsPlaybackDomain:audio: * * The assigned #AgsAudio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsPlaybackDomain:output-playback: (type GList(AgsPlayback)) (transfer full) * * The assigned output playback. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("output-playback", i18n_pspec("assigned output playback"), i18n_pspec("The output playback it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_PLAYBACK, param_spec); /** * AgsPlaybackDomain:input-playback: (type GList(AgsPlayback)) (transfer full) * * The assigned input playback. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("input-playback", i18n_pspec("assigned input playback"), i18n_pspec("The input playback it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_PLAYBACK, param_spec); } void ags_playback_domain_init(AgsPlaybackDomain *playback_domain) { AgsConfig *config; gchar *thread_model, *super_threaded_scope; gboolean super_threaded_audio; guint i; playback_domain->flags = 0; /* playback domain mutex */ g_rec_mutex_init(&(playback_domain->obj_mutex)); /* config */ config = ags_config_get_instance(); /* thread model */ super_threaded_audio = FALSE; thread_model = ags_config_get_value(config, AGS_CONFIG_THREAD, "model"); if(thread_model != NULL && !g_ascii_strncasecmp(thread_model, "super-threaded", 15)){ super_threaded_scope = ags_config_get_value(config, AGS_CONFIG_THREAD, "super-threaded-scope"); if(super_threaded_scope != NULL && (!g_ascii_strncasecmp(super_threaded_scope, "audio", 6) || !g_ascii_strncasecmp(super_threaded_scope, "channel", 8))){ super_threaded_audio = TRUE; } g_free(super_threaded_scope); } g_free(thread_model); /* default flags */ if(super_threaded_audio){ playback_domain->flags |= AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO; } /* domain */ playback_domain->audio = NULL; /* super threaded audio */ playback_domain->audio_thread = (AgsThread **) malloc(AGS_SOUND_SCOPE_LAST * sizeof(AgsThread *)); for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ playback_domain->audio_thread[i] = NULL; } /* playback */ playback_domain->output_playback = NULL; playback_domain->input_playback = NULL; } void ags_playback_domain_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlaybackDomain *playback_domain; GRecMutex *playback_domain_mutex; playback_domain = AGS_PLAYBACK_DOMAIN(gobject); /* get playback_domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); switch(prop_id){ case PROP_AUDIO: { GObject *audio; audio = (GObject *) g_value_get_object(value); g_rec_mutex_lock(playback_domain_mutex); if((GObject *) playback_domain->audio == audio){ g_rec_mutex_unlock(playback_domain_mutex); return; } if(playback_domain->audio != NULL){ g_object_unref(G_OBJECT(playback_domain->audio)); } if(audio != NULL){ g_object_ref(G_OBJECT(audio)); } playback_domain->audio = (GObject *) audio; g_rec_mutex_unlock(playback_domain_mutex); } break; case PROP_OUTPUT_PLAYBACK: { AgsPlayback *output_playback; output_playback = (AgsPlayback *) g_value_get_pointer(value); ags_playback_domain_add_playback(playback_domain, (GObject *) output_playback, AGS_TYPE_OUTPUT); } break; case PROP_INPUT_PLAYBACK: { AgsPlayback *input_playback; input_playback = (AgsPlayback *) g_value_get_pointer(value); ags_playback_domain_add_playback(playback_domain, (GObject *) input_playback, AGS_TYPE_INPUT); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_playback_domain_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlaybackDomain *playback_domain; GRecMutex *playback_domain_mutex; playback_domain = AGS_PLAYBACK_DOMAIN(gobject); /* get playback_domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(playback_domain_mutex); g_value_set_object(value, playback_domain->audio); g_rec_mutex_unlock(playback_domain_mutex); } break; case PROP_OUTPUT_PLAYBACK: { g_rec_mutex_lock(playback_domain_mutex); g_value_set_pointer(value, g_list_copy_deep(playback_domain->output_playback, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(playback_domain_mutex); } break; case PROP_INPUT_PLAYBACK: { g_rec_mutex_lock(playback_domain_mutex); g_value_set_pointer(value, g_list_copy_deep(playback_domain->input_playback, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(playback_domain_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_playback_domain_dispose(GObject *gobject) { AgsPlaybackDomain *playback_domain; guint i; playback_domain = AGS_PLAYBACK_DOMAIN(gobject); if(playback_domain->audio_thread != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ if(playback_domain->audio_thread[i] != NULL){ g_object_run_dispose((GObject *) playback_domain->audio_thread[i]); g_object_unref((GObject *) playback_domain->audio_thread[i]); playback_domain->audio_thread[i] = NULL; } } } /* domain */ if(playback_domain->audio != NULL){ g_object_unref(playback_domain->audio); playback_domain->audio = NULL; } /* output playback */ if(playback_domain->output_playback != NULL){ g_list_free_full(playback_domain->output_playback, g_object_unref); playback_domain->output_playback = NULL; } /* input playback */ if(playback_domain->input_playback != NULL){ g_list_free_full(playback_domain->input_playback, g_object_unref); playback_domain->input_playback = NULL; } /* call parent */ G_OBJECT_CLASS(ags_playback_domain_parent_class)->dispose(gobject); } void ags_playback_domain_finalize(GObject *gobject) { AgsPlaybackDomain *playback_domain; guint i; playback_domain = AGS_PLAYBACK_DOMAIN(gobject); /* audio thread */ if(playback_domain->audio_thread != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ if(playback_domain->audio_thread[i] != NULL){ g_object_run_dispose((GObject *) playback_domain->audio_thread[i]); g_object_unref((GObject *) playback_domain->audio_thread[i]); } } free(playback_domain->audio_thread); } /* domain */ if(playback_domain->audio != NULL){ g_object_unref(playback_domain->audio); } /* output playback */ g_list_free_full(playback_domain->output_playback, g_object_unref); /* input playback */ g_list_free_full(playback_domain->input_playback, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_playback_domain_parent_class)->finalize(gobject); } /** * ags_playback_domain_test_flags: * @playback_domain: the #AgsPlaybackDomain * @flags: the flags * * Test @flags to be set on @playback_domain. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_playback_domain_test_flags(AgsPlaybackDomain *playback_domain, guint flags) { gboolean retval; GRecMutex *playback_domain_mutex; if(!AGS_IS_PLAYBACK_DOMAIN(playback_domain)){ return(FALSE); } /* get playback_domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* test */ g_rec_mutex_lock(playback_domain_mutex); retval = (flags & (playback_domain->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(playback_domain_mutex); return(retval); } /** * ags_playback_domain_set_flags: * @playback_domain: the #AgsPlaybackDomain * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_playback_domain_set_flags(AgsPlaybackDomain *playback_domain, guint flags) { GRecMutex *playback_domain_mutex; if(!AGS_IS_PLAYBACK_DOMAIN(playback_domain)){ return; } /* get playback_domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* set flags */ g_rec_mutex_lock(playback_domain_mutex); playback_domain->flags |= flags; g_rec_mutex_unlock(playback_domain_mutex); } /** * ags_playback_domain_unset_flags: * @playback_domain: the #AgsPlaybackDomain * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_playback_domain_unset_flags(AgsPlaybackDomain *playback_domain, guint flags) { GRecMutex *playback_domain_mutex; if(!AGS_IS_PLAYBACK_DOMAIN(playback_domain)){ return; } /* get playback_domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* set flags */ g_rec_mutex_lock(playback_domain_mutex); playback_domain->flags &= (~flags); g_rec_mutex_unlock(playback_domain_mutex); } /** * ags_playback_domain_set_audio_thread: * @playback_domain: the #AgsPlaybackDomain * @thread: the #AgsThread * @sound_scope: the thread's scope * * Set audio thread to specified scope. * * Since: 3.0.0 */ void ags_playback_domain_set_audio_thread(AgsPlaybackDomain *playback_domain, AgsThread *thread, gint sound_scope) { GRecMutex *playback_domain_mutex; if(!AGS_PLAYBACK_DOMAIN(playback_domain) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return; } /* get playback domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* set */ g_rec_mutex_lock(playback_domain_mutex); if(playback_domain->audio_thread[sound_scope] != NULL){ if(ags_thread_test_status_flags(playback_domain->audio_thread[sound_scope], AGS_THREAD_STATUS_RUNNING)){ ags_thread_stop(playback_domain->audio_thread[sound_scope]); } g_object_run_dispose((GObject *) playback_domain->audio_thread[sound_scope]); g_object_unref((GObject *) playback_domain->audio_thread[sound_scope]); } if(thread != NULL){ g_object_ref(thread); } playback_domain->audio_thread[sound_scope] = thread; g_rec_mutex_unlock(playback_domain_mutex); } /** * ags_playback_domain_get_audio_thread: * @playback_domain: the #AgsPlaybackDomain * @sound_scope: the thread's scope * * Get audio thread of specified scope. * * Returns: (transfer full): the matching #AgsThread or %NULL * * Since: 3.0.0 */ AgsThread* ags_playback_domain_get_audio_thread(AgsPlaybackDomain *playback_domain, gint sound_scope) { AgsThread *audio_thread; GRecMutex *playback_domain_mutex; if(!AGS_PLAYBACK_DOMAIN(playback_domain) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return(NULL); } /* get playback domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* get */ g_rec_mutex_lock(playback_domain_mutex); audio_thread = (playback_domain->audio_thread != NULL) ? playback_domain->audio_thread[sound_scope]: NULL; if(audio_thread != NULL){ g_object_ref(audio_thread); } g_rec_mutex_unlock(playback_domain_mutex); return(audio_thread); } /** * ags_playback_domain_add_playback: * @playback_domain: the #AgsPlaybackDomain * @playback: the #AgsPlayback * @channel_type: either an AGS_TYPE_OUTPUT or AGS_TYPE_INPUT * * Add @playback for @channel_type to @playback_domain. * * Since: 3.0.0 */ void ags_playback_domain_add_playback(AgsPlaybackDomain *playback_domain, GObject *playback, GType channel_type) { GRecMutex *playback_domain_mutex; if(!AGS_IS_PLAYBACK_DOMAIN(playback_domain) || !AGS_IS_PLAYBACK(playback)){ return; } /* get playback domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* append */ g_rec_mutex_lock(playback_domain_mutex); //TODO:JK: rather use prepend but needs refactoring if(g_type_is_a(channel_type, AGS_TYPE_OUTPUT)){ if(g_list_find(playback_domain->output_playback, playback) == NULL){ g_object_ref(playback); playback_domain->output_playback = g_list_append(playback_domain->output_playback, playback); } }else if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ if(g_list_find(playback_domain->input_playback, playback) == NULL){ g_object_ref(playback); playback_domain->input_playback = g_list_append(playback_domain->input_playback, playback); } } g_rec_mutex_unlock(playback_domain_mutex); } /** * ags_playback_domain_remove_playback: * @playback_domain: the #AgsPlaybackDomain * @playback: the #AgsPlayback * @channel_type: either an AGS_TYPE_OUTPUT or AGS_TYPE_INPUT * * Remove @playback for @channel_type of @playback_domain. * * Since: 3.0.0 */ void ags_playback_domain_remove_playback(AgsPlaybackDomain *playback_domain, GObject *playback, GType channel_type) { GRecMutex *playback_domain_mutex; if(!AGS_IS_PLAYBACK_DOMAIN(playback_domain) || !AGS_IS_PLAYBACK(playback)){ return; } /* get playback domain mutex */ playback_domain_mutex = AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(playback_domain); /* remove */ g_rec_mutex_lock(playback_domain_mutex); if(g_type_is_a(channel_type, AGS_TYPE_OUTPUT)){ playback_domain->output_playback = g_list_remove(playback_domain->output_playback, playback); g_object_unref(playback); }else if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ playback_domain->input_playback = g_list_remove(playback_domain->input_playback, playback); g_object_unref(playback); } g_rec_mutex_unlock(playback_domain_mutex); } /** * ags_playback_domain_new: * @audio: the #AgsAudio * * Creates an #AgsPlaybackDomain, refering to @application_context. * * Returns: a new #AgsPlaybackDomain * * Since: 3.0.0 */ AgsPlaybackDomain* ags_playback_domain_new(GObject *audio) { AgsPlaybackDomain *playback_domain; playback_domain = (AgsPlaybackDomain *) g_object_new(AGS_TYPE_PLAYBACK_DOMAIN, "audio", audio, NULL); return(playback_domain); } gsequencer-3.1.3/ags/audio/wasapi/0000755000175000017500000000000013622252254014022 500000000000000gsequencer-3.1.3/ags/audio/wasapi/ags_wasapi_devout.h0000644000175000017500000001461413607210263017622 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WASAPI_DEVOUT_H__ #define __AGS_WASAPI_DEVOUT_H__ #include #include #include #ifdef AGS_WITH_WASAPI #include #include #include #include #include #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_WASAPI_DEVOUT (ags_wasapi_devout_get_type()) #define AGS_WASAPI_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WASAPI_DEVOUT, AgsWasapiDevout)) #define AGS_WASAPI_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_WASAPI_DEVOUT, AgsWasapiDevout)) #define AGS_IS_WASAPI_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WASAPI_DEVOUT)) #define AGS_IS_WASAPI_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WASAPI_DEVOUT)) #define AGS_WASAPI_DEVOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_WASAPI_DEVOUT, AgsWasapiDevoutClass)) #define AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(obj) (&(((AgsWasapiDevout *) obj)->obj_mutex)) #define AGS_WASAPI_DEVOUT_DEFAULT_WASAPI_BUFFER_SIZE (8192) typedef struct _AgsWasapiDevout AgsWasapiDevout; typedef struct _AgsWasapiDevoutClass AgsWasapiDevoutClass; /** * AgsWasapiDevoutFlags: * @AGS_WASAPI_DEVOUT_ADDED_TO_REGISTRY: the core-audio devout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_WASAPI_DEVOUT_CONNECTED: indicates the core-audio devout was connected by calling #AgsConnectable::connect() * @AGS_WASAPI_DEVOUT_BUFFER0: ring-buffer 0 * @AGS_WASAPI_DEVOUT_BUFFER1: ring-buffer 1 * @AGS_WASAPI_DEVOUT_BUFFER2: ring-buffer 2 * @AGS_WASAPI_DEVOUT_BUFFER3: ring-buffer 3 * @AGS_WASAPI_DEVOUT_BUFFER4: ring-buffer 4 * @AGS_WASAPI_DEVOUT_BUFFER5: ring-buffer 5 * @AGS_WASAPI_DEVOUT_BUFFER6: ring-buffer 6 * @AGS_WASAPI_DEVOUT_BUFFER7: ring-buffer 7 * @AGS_WASAPI_DEVOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_WASAPI_DEVOUT_PLAY: do playback * @AGS_WASAPI_DEVOUT_SHUTDOWN: stop playback * @AGS_WASAPI_DEVOUT_START_PLAY: playback starting * @AGS_WASAPI_DEVOUT_NONBLOCKING: do non-blocking calls * @AGS_WASAPI_DEVOUT_INITIALIZED: the soundcard was initialized * @AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE: share mode exclusive * * Enum values to control the behavior or indicate internal state of #AgsWasapiDevout by * enable/disable as flags. */ typedef enum{ AGS_WASAPI_DEVOUT_ADDED_TO_REGISTRY = 1, AGS_WASAPI_DEVOUT_CONNECTED = 1 << 1, AGS_WASAPI_DEVOUT_BUFFER0 = 1 << 2, AGS_WASAPI_DEVOUT_BUFFER1 = 1 << 3, AGS_WASAPI_DEVOUT_BUFFER2 = 1 << 4, AGS_WASAPI_DEVOUT_BUFFER3 = 1 << 5, AGS_WASAPI_DEVOUT_BUFFER4 = 1 << 6, AGS_WASAPI_DEVOUT_BUFFER5 = 1 << 7, AGS_WASAPI_DEVOUT_BUFFER6 = 1 << 8, AGS_WASAPI_DEVOUT_BUFFER7 = 1 << 9, AGS_WASAPI_DEVOUT_ATTACK_FIRST = 1 << 10, AGS_WASAPI_DEVOUT_PLAY = 1 << 11, AGS_WASAPI_DEVOUT_SHUTDOWN = 1 << 12, AGS_WASAPI_DEVOUT_START_PLAY = 1 << 13, AGS_WASAPI_DEVOUT_NONBLOCKING = 1 << 14, AGS_WASAPI_DEVOUT_INITIALIZED = 1 << 15, AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE = 1 << 16, }AgsWasapiDevoutFlags; #define AGS_WASAPI_DEVOUT_ERROR (ags_wasapi_devout_error_quark()) typedef enum{ AGS_WASAPI_DEVOUT_ERROR_LOCKED_SOUNDCARD, AGS_WASAPI_DEVOUT_ERROR_BROKEN_CONFIGURATION, }AgsWasapiDevoutError; struct _AgsWasapiDevout { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void** buffer; gboolean use_cache; guint cache_buffer_size; guint current_cache; guint completed_cache; guint cache_offset; void **cache; guint wasapi_buffer_size; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *device; #ifdef AGS_WITH_WASAPI IMMDevice *mm_device; IAudioClient *audio_client; #else gpointer mm_device; gpointer audio_client; #endif GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsWasapiDevoutClass { GObjectClass gobject; }; GType ags_wasapi_devout_get_type(); GQuark ags_wasapi_devout_error_quark(); gboolean ags_wasapi_devout_test_flags(AgsWasapiDevout *wasapi_devout, guint flags); void ags_wasapi_devout_set_flags(AgsWasapiDevout *wasapi_devout, guint flags); void ags_wasapi_devout_unset_flags(AgsWasapiDevout *wasapi_devout, guint flags); void ags_wasapi_devout_switch_buffer_flag(AgsWasapiDevout *wasapi_devout); void ags_wasapi_devout_adjust_delay_and_attack(AgsWasapiDevout *wasapi_devout); void ags_wasapi_devout_realloc_buffer(AgsWasapiDevout *wasapi_devout); AgsWasapiDevout* ags_wasapi_devout_new(); G_END_DECLS #endif /*__AGS_WASAPI_DEVOUT_H__*/ gsequencer-3.1.3/ags/audio/wasapi/ags_wasapi_devin.c0000644000175000017500000023431713613101102017404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_WASAPI #include #include #include #include #endif #include #include void ags_wasapi_devin_class_init(AgsWasapiDevinClass *wasapi_devin); void ags_wasapi_devin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wasapi_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_wasapi_devin_init(AgsWasapiDevin *wasapi_devin); void ags_wasapi_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wasapi_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wasapi_devin_dispose(GObject *gobject); void ags_wasapi_devin_finalize(GObject *gobject); AgsUUID* ags_wasapi_devin_get_uuid(AgsConnectable *connectable); gboolean ags_wasapi_devin_has_resource(AgsConnectable *connectable); gboolean ags_wasapi_devin_is_ready(AgsConnectable *connectable); void ags_wasapi_devin_add_to_registry(AgsConnectable *connectable); void ags_wasapi_devin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_wasapi_devin_list_resource(AgsConnectable *connectable); xmlNode* ags_wasapi_devin_xml_compose(AgsConnectable *connectable); void ags_wasapi_devin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_wasapi_devin_is_connected(AgsConnectable *connectable); void ags_wasapi_devin_connect(AgsConnectable *connectable); void ags_wasapi_devin_disconnect(AgsConnectable *connectable); void ags_wasapi_devin_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_wasapi_devin_get_device(AgsSoundcard *soundcard); void ags_wasapi_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_wasapi_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_wasapi_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_wasapi_devin_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_wasapi_devin_get_capability(AgsSoundcard *soundcard); gboolean ags_wasapi_devin_is_starting(AgsSoundcard *soundcard); gboolean ags_wasapi_devin_is_recording(AgsSoundcard *soundcard); gchar* ags_wasapi_devin_get_uptime(AgsSoundcard *soundcard); void ags_wasapi_devin_client_init(AgsSoundcard *soundcard, GError **error); void ags_wasapi_devin_client_record(AgsSoundcard *soundcard, GError **error); void ags_wasapi_devin_client_free(AgsSoundcard *soundcard); void ags_wasapi_devin_tic(AgsSoundcard *soundcard); void ags_wasapi_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_wasapi_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_wasapi_devin_get_bpm(AgsSoundcard *soundcard); void ags_wasapi_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_wasapi_devin_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_wasapi_devin_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_wasapi_devin_get_delay(AgsSoundcard *soundcard); guint ags_wasapi_devin_get_attack(AgsSoundcard *soundcard); void* ags_wasapi_devin_get_buffer(AgsSoundcard *soundcard); void* ags_wasapi_devin_get_next_buffer(AgsSoundcard *soundcard); void* ags_wasapi_devin_get_prev_buffer(AgsSoundcard *soundcard); void ags_wasapi_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_wasapi_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_wasapi_devin_get_delay_counter(AgsSoundcard *soundcard); void ags_wasapi_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_wasapi_devin_get_start_note_offset(AgsSoundcard *soundcard); void ags_wasapi_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_wasapi_devin_get_note_offset(AgsSoundcard *soundcard); void ags_wasapi_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_wasapi_devin_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_wasapi_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_wasapi_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_wasapi_devin_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_wasapi_devin * @short_description: Output to soundcard * @title: AgsWasapiDevin * @section_id: * @include: ags/audio/wasapi/ags_wasapi_devin.h * * #AgsWasapiDevin represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_CHANNEL, }; static gpointer ags_wasapi_devin_parent_class = NULL; #ifdef AGS_W32API static const GUID ags_wasapi_clsid_mm_device_enumerator_guid = {0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}; static const GUID ags_wasapi_iid_mm_device_enumerator_guid = {0xA95664D2, 0x9614, 0x4F35, 0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6}; static const GUID ags_wasapi_iid_audio_client_guid = {0x1CB9AD4C, 0xDBFA, 0x4c32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2}; static const GUID ags_wasapi_iid_audio_capture_client_guid = {0xc8adbd64, 0xe71e, 0x48a0, 0xa4,0xde, 0x18,0x5c,0x39,0x5c,0xd3,0x17}; static const GUID ags_wasapi_pcm_subformat_guid = {0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; static const GUID ags_wasapi_pkey_device_friendly_name_guid = {0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0}; struct _PROPERTYKEY{ GUID fmtid; DWORD id; }; static struct _PROPERTYKEY ags_wasapi_pkey_device_friendly_name_key = {ags_wasapi_pkey_device_friendly_name_guid, 14}; #endif GType ags_wasapi_devin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wasapi_devin = 0; static const GTypeInfo ags_wasapi_devin_info = { sizeof(AgsWasapiDevinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wasapi_devin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsWasapiDevin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wasapi_devin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wasapi_devin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_wasapi_devin_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wasapi_devin = g_type_register_static(G_TYPE_OBJECT, "AgsWasapiDevin", &ags_wasapi_devin_info, 0); g_type_add_interface_static(ags_type_wasapi_devin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_wasapi_devin, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wasapi_devin); } return g_define_type_id__volatile; } void ags_wasapi_devin_class_init(AgsWasapiDevinClass *wasapi_devin) { GObjectClass *gobject; GParamSpec *param_spec; ags_wasapi_devin_parent_class = g_type_class_peek_parent(wasapi_devin); /* GObjectClass */ gobject = (GObjectClass *) wasapi_devin; gobject->set_property = ags_wasapi_devin_set_property; gobject->get_property = ags_wasapi_devin_get_property; gobject->dispose = ags_wasapi_devin_dispose; gobject->finalize = ags_wasapi_devin_finalize; /* properties */ /** * AgsWasapiDevin:device: * * The core audio soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-wasapi-devin-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsWasapiDevin:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsWasapiDevin:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsWasapiDevin:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsWasapiDevin:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsWasapiDevin:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsWasapiDevin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsWasapiDevin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsWasapiDevin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsWasapiDevin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); } GQuark ags_wasapi_devin_error_quark() { return(g_quark_from_static_string("ags-wasapi_devin-error-quark")); } void ags_wasapi_devin_connectable_interface_init(AgsConnectableInterface *connectable) { //TODO:JK: implement me } void ags_wasapi_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_wasapi_devin_set_device; soundcard->get_device = ags_wasapi_devin_get_device; soundcard->set_presets = ags_wasapi_devin_set_presets; soundcard->get_presets = ags_wasapi_devin_get_presets; soundcard->list_cards = ags_wasapi_devin_list_cards; soundcard->pcm_info = ags_wasapi_devin_pcm_info; soundcard->get_capability = ags_wasapi_devin_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_wasapi_devin_is_starting; soundcard->is_playing = NULL; soundcard->is_recording = ags_wasapi_devin_is_recording; soundcard->get_uptime = ags_wasapi_devin_get_uptime; soundcard->play_init = NULL; soundcard->play = NULL; soundcard->record_init = ags_wasapi_devin_client_init; soundcard->record = ags_wasapi_devin_client_record; soundcard->stop = ags_wasapi_devin_client_free; soundcard->tic = ags_wasapi_devin_tic; soundcard->offset_changed = ags_wasapi_devin_offset_changed; soundcard->set_bpm = ags_wasapi_devin_set_bpm; soundcard->get_bpm = ags_wasapi_devin_get_bpm; soundcard->set_delay_factor = ags_wasapi_devin_set_delay_factor; soundcard->get_delay_factor = ags_wasapi_devin_get_delay_factor; soundcard->get_absolute_delay = ags_wasapi_devin_get_absolute_delay; soundcard->get_delay = ags_wasapi_devin_get_delay; soundcard->get_attack = ags_wasapi_devin_get_attack; soundcard->get_buffer = ags_wasapi_devin_get_buffer; soundcard->get_next_buffer = ags_wasapi_devin_get_next_buffer; soundcard->get_prev_buffer = ags_wasapi_devin_get_prev_buffer; soundcard->lock_buffer = ags_wasapi_devin_lock_buffer; soundcard->unlock_buffer = ags_wasapi_devin_unlock_buffer; soundcard->get_delay_counter = ags_wasapi_devin_get_delay_counter; soundcard->set_start_note_offset = ags_wasapi_devin_set_start_note_offset; soundcard->get_start_note_offset = ags_wasapi_devin_get_start_note_offset; soundcard->set_note_offset = ags_wasapi_devin_set_note_offset; soundcard->get_note_offset = ags_wasapi_devin_get_note_offset; soundcard->set_note_offset_absolute = ags_wasapi_devin_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_wasapi_devin_get_note_offset_absolute; soundcard->set_loop = ags_wasapi_devin_set_loop; soundcard->get_loop = ags_wasapi_devin_get_loop; soundcard->get_loop_offset = ags_wasapi_devin_get_loop_offset; } void ags_wasapi_devin_init(AgsWasapiDevin *wasapi_devin) { AgsConfig *config; gchar *str; gchar *segmentation; guint denumerator, numerator; guint i; /* flags */ wasapi_devin->flags = 0; /* devin mutex */ g_rec_mutex_init(&(wasapi_devin->obj_mutex)); /* uuid */ wasapi_devin->uuid = ags_uuid_alloc(); ags_uuid_generate(wasapi_devin->uuid); /* presets */ config = ags_config_get_instance(); wasapi_devin->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); wasapi_devin->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); wasapi_devin->samplerate = ags_soundcard_helper_config_get_samplerate(config); wasapi_devin->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); wasapi_devin->format = ags_soundcard_helper_config_get_format(config); str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "wasapi-buffer-size"); if(str != NULL){ wasapi_devin->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); }else{ wasapi_devin->wasapi_buffer_size = AGS_WASAPI_DEVIN_DEFAULT_WASAPI_BUFFER_SIZE; } g_free(str); str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ wasapi_devin->flags |= AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE; } g_free(str); /* device */ wasapi_devin->device = NULL; /* buffer */ wasapi_devin->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ wasapi_devin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(wasapi_devin->buffer_mutex[i]); } wasapi_devin->buffer = (void **) malloc(8 * sizeof(void*)); wasapi_devin->buffer[0] = NULL; wasapi_devin->buffer[1] = NULL; wasapi_devin->buffer[2] = NULL; wasapi_devin->buffer[3] = NULL; wasapi_devin->buffer[4] = NULL; wasapi_devin->buffer[5] = NULL; wasapi_devin->buffer[6] = NULL; wasapi_devin->buffer[7] = NULL; ags_wasapi_devin_realloc_buffer(wasapi_devin); /* bpm */ wasapi_devin->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ wasapi_devin->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denumerator, &numerator); wasapi_devin->delay_factor = 1.0 / numerator * (numerator / denumerator); g_free(segmentation); } /* delay and attack */ wasapi_devin->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); wasapi_devin->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); /* counters */ wasapi_devin->tact_counter = 0.0; wasapi_devin->delay_counter = 0.0; wasapi_devin->tic_counter = 0; wasapi_devin->start_note_offset = 0; wasapi_devin->note_offset = 0; wasapi_devin->note_offset_absolute = 0; wasapi_devin->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; wasapi_devin->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; wasapi_devin->do_loop = FALSE; wasapi_devin->loop_offset = 0; /* callback mutex */ g_mutex_init(&(wasapi_devin->callback_mutex)); g_cond_init(&(wasapi_devin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(wasapi_devin->callback_finish_mutex)); g_cond_init(&(wasapi_devin->callback_finish_cond)); } void ags_wasapi_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(gobject); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->device = g_strdup(device); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devin_mutex); if(dsp_channels == wasapi_devin->dsp_channels){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } wasapi_devin->dsp_channels = dsp_channels; g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devin_mutex); if(pcm_channels == wasapi_devin->pcm_channels){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } wasapi_devin->pcm_channels = pcm_channels; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_realloc_buffer(wasapi_devin); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devin_mutex); if(format == wasapi_devin->format){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } wasapi_devin->format = format; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_realloc_buffer(wasapi_devin); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devin_mutex); if(buffer_size == wasapi_devin->buffer_size){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } wasapi_devin->buffer_size = buffer_size; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_realloc_buffer(wasapi_devin); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devin_mutex); if(samplerate == wasapi_devin->samplerate){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } wasapi_devin->samplerate = samplerate; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_realloc_buffer(wasapi_devin); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->bpm = bpm; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->delay_factor = delay_factor; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wasapi_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(gobject); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_string(value, wasapi_devin->device); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_uint(value, wasapi_devin->dsp_channels); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_uint(value, wasapi_devin->pcm_channels); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_uint(value, wasapi_devin->format); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_uint(value, wasapi_devin->buffer_size); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_uint(value, wasapi_devin->samplerate); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_pointer(value, wasapi_devin->buffer); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_double(value, wasapi_devin->bpm); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_double(value, wasapi_devin->delay_factor); g_rec_mutex_unlock(wasapi_devin_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(wasapi_devin_mutex); g_value_set_pointer(value, wasapi_devin->attack); g_rec_mutex_unlock(wasapi_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wasapi_devin_dispose(GObject *gobject) { AgsWasapiDevin *wasapi_devin; GList *list; wasapi_devin = AGS_WASAPI_DEVIN(gobject); //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_wasapi_devin_parent_class)->dispose(gobject); } void ags_wasapi_devin_finalize(GObject *gobject) { AgsWasapiDevin *wasapi_devin; wasapi_devin = AGS_WASAPI_DEVIN(gobject); //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_wasapi_devin_parent_class)->finalize(gobject); } /** * ags_wasapi_devin_test_flags: * @wasapi_devin: the #AgsWasapiDevin * @flags: the flags * * Test @flags to be set on @wasapi_devin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_wasapi_devin_test_flags(AgsWasapiDevin *wasapi_devin, guint flags) { gboolean retval; GRecMutex *wasapi_devin_mutex; if(!AGS_IS_WASAPI_DEVIN(wasapi_devin)){ return(FALSE); } /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* test */ g_rec_mutex_lock(wasapi_devin_mutex); retval = (flags & (wasapi_devin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(wasapi_devin_mutex); return(retval); } /** * ags_wasapi_devin_set_flags: * @wasapi_devin: the #AgsWasapiDevin * @flags: see #AgsWasapiDevinFlags-enum * * Enable a feature of @wasapi_devin. * * Since: 3.0.0 */ void ags_wasapi_devin_set_flags(AgsWasapiDevin *wasapi_devin, guint flags) { GRecMutex *wasapi_devin_mutex; if(!AGS_IS_WASAPI_DEVIN(wasapi_devin)){ return; } /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->flags |= flags; g_rec_mutex_unlock(wasapi_devin_mutex); } /** * ags_wasapi_devin_unset_flags: * @wasapi_devin: the #AgsWasapiDevin * @flags: see #AgsWasapiDevinFlags-enum * * Disable a feature of @wasapi_devin. * * Since: 3.0.0 */ void ags_wasapi_devin_unset_flags(AgsWasapiDevin *wasapi_devin, guint flags) { GRecMutex *wasapi_devin_mutex; if(!AGS_IS_WASAPI_DEVIN(wasapi_devin)){ return; } /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->flags &= (~flags); g_rec_mutex_unlock(wasapi_devin_mutex); } void ags_wasapi_devin_set_device(AgsSoundcard *soundcard, gchar *device) { AgsWasapiDevin *wasapi_devin; GList *card_id, *card_id_start, *card_name, *card_name_start; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi_devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* list cards */ card_id = NULL; card_name = NULL; ags_soundcard_list_cards(soundcard, &card_id, &card_name); card_id_start = card_id; card_name_start = card_name; /* check card */ g_rec_mutex_lock(wasapi_devin_mutex); while(card_id != NULL){ if(!g_ascii_strncasecmp(card_id->data, device, strlen(card_id->data))){ wasapi_devin->device = g_strdup(device); break; } card_id = card_id->next; } g_rec_mutex_unlock(wasapi_devin_mutex); /* free card id and name */ g_list_free_full(card_id_start, g_free); g_list_free_full(card_name_start, g_free); } gchar* ags_wasapi_devin_get_device(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gchar *device; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); device = NULL; /* get device */ g_rec_mutex_lock(wasapi_devin_mutex); device = g_strdup(wasapi_devin->device); g_rec_mutex_unlock(wasapi_devin_mutex); return(device); } void ags_wasapi_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsWasapiDevin *wasapi_devin; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); g_object_set(wasapi_devin, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_wasapi_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get presets */ g_rec_mutex_lock(wasapi_devin_mutex); if(channels != NULL){ *channels = wasapi_devin->pcm_channels; } if(rate != NULL){ *rate = wasapi_devin->samplerate; } if(buffer_size != NULL){ *buffer_size = wasapi_devin->buffer_size; } if(format != NULL){ *format = wasapi_devin->format; } g_rec_mutex_unlock(wasapi_devin_mutex); } /** * ags_wasapi_devin_list_cards: * @soundcard: the #AgsSoundcard * @card_id: WASAPI identifier * @card_name: card name * * List available soundcards. * * Since: 3.0.0 */ void ags_wasapi_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsWasapiDevin *wasapi_devin; AgsApplicationContext *application_context; #ifdef AGS_WITH_WASAPI IMMDeviceEnumerator *dev_enumerator; IMMDeviceCollection *dev_collection; UINT i, i_stop; #endif wasapi_devin = AGS_WASAPI_DEVIN(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } #ifdef AGS_WITH_WASAPI CoInitialize(0); CoCreateInstance(&ags_wasapi_clsid_mm_device_enumerator_guid, 0, CLSCTX_ALL, &ags_wasapi_iid_mm_device_enumerator_guid, &dev_enumerator); dev_enumerator->lpVtbl->EnumAudioEndpoints(dev_enumerator, eCapture, DEVICE_STATE_ACTIVE, &dev_collection); dev_collection->lpVtbl->GetCount(dev_collection, &i_stop); for(i = 0; i < i_stop; i++){ IMMDevice *device; IPropertyStore *prop_store; LPWSTR dev_id = NULL; PROPVARIANT var_name; gchar *str; dev_collection->lpVtbl->Item(dev_collection, i, &device); device->lpVtbl->GetId(device, &dev_id); device->lpVtbl->OpenPropertyStore(device, STGM_READ, &prop_store); PropVariantInit(&var_name); prop_store->lpVtbl->GetValue(prop_store, &ags_wasapi_pkey_device_friendly_name_key, &var_name); g_message("%S %S", dev_id, var_name.pwszVal); if(card_id != NULL){ str = g_strdup_printf("%S", dev_id); *card_id = g_list_prepend(*card_id, str); } if(card_name != NULL){ str = g_strdup_printf("%S", var_name.pwszVal); *card_name = g_list_prepend(*card_name, str); } CoTaskMemFree(dev_id); PropVariantClear(&var_name); prop_store->lpVtbl->Release(prop_store); device->lpVtbl->Release(device); } dev_collection->lpVtbl->Release(dev_collection); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); #endif if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_wasapi_devin_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_wasapi_devin_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_CAPTURE); } gboolean ags_wasapi_devin_is_starting(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gboolean is_starting; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* check is starting */ g_rec_mutex_lock(wasapi_devin_mutex); is_starting = ((AGS_WASAPI_DEVIN_START_RECORD & (wasapi_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(wasapi_devin_mutex); return(is_starting); } gboolean ags_wasapi_devin_is_recording(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gboolean is_playing; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* check is starting */ g_rec_mutex_lock(wasapi_devin_mutex); is_playing = ((AGS_WASAPI_DEVIN_RECORD & (wasapi_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(wasapi_devin_mutex); return(is_playing); } gchar* ags_wasapi_devin_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_wasapi_devin_client_init(AgsSoundcard *soundcard, GError **error) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; if(ags_soundcard_is_recording(soundcard)){ return; } wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); g_rec_mutex_lock(wasapi_devin_mutex); #ifdef AGS_WITH_WASAPI #endif wasapi_devin->tact_counter = 0.0; wasapi_devin->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(wasapi_devin))); wasapi_devin->tic_counter = 0; #ifdef AGS_WITH_WASAPI wasapi_devin->flags |= AGS_WASAPI_DEVIN_INITIALIZED; #endif wasapi_devin->flags |= (AGS_WASAPI_DEVIN_BUFFER0 | AGS_WASAPI_DEVIN_START_RECORD | AGS_WASAPI_DEVIN_RECORD | AGS_WASAPI_DEVIN_NONBLOCKING); wasapi_devin->flags &= (~(AGS_WASAPI_DEVIN_BUFFER1 | AGS_WASAPI_DEVIN_BUFFER2 | AGS_WASAPI_DEVIN_BUFFER3 | AGS_WASAPI_DEVIN_BUFFER4 | AGS_WASAPI_DEVIN_BUFFER5 | AGS_WASAPI_DEVIN_BUFFER6 | AGS_WASAPI_DEVIN_BUFFER7)); g_rec_mutex_unlock(wasapi_devin_mutex); } void ags_wasapi_devin_client_record(AgsSoundcard *soundcard, GError **error) { AgsWasapiDevin *wasapi_devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; GList *list; gchar *str; #ifdef AGS_WITH_WASAPI IAudioClient *audio_client; IAudioCaptureClient *audio_capture_client; BYTE *data; UINT32 buffer_frame_count; UINT32 num_frames_available; DWORD pdw_flags; #endif guint word_size; guint nth_buffer; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get wasapi_devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* lock */ g_rec_mutex_lock(wasapi_devin_mutex); /* retrieve word size */ switch(wasapi_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(wasapi_devin_mutex); g_warning("ags_wasapi_devin_client_record(): unsupported word size"); return; } #ifdef AGS_WITH_WASAPI if((AGS_WASAPI_DEVIN_START_RECORD & (wasapi_devin->flags)) != 0){ IMMDeviceEnumerator *dev_enumerator; IMMDevice *mm_device; WAVEFORMATEXTENSIBLE wave_format; WAVEFORMATEX *desired_format, *internal_format; wchar_t dev_id[1024]; REFERENCE_TIME min_duration; register HRESULT hr; unsigned char bit_resolution; g_message("WASAPI initialize"); CoInitialize(0); if(CoCreateInstance(&ags_wasapi_clsid_mm_device_enumerator_guid, 0, CLSCTX_ALL, &ags_wasapi_iid_mm_device_enumerator_guid, (void **) &dev_enumerator)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVIN_ERROR, AGS_WASAPI_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IMMDeviceEnumerator."); } CoUninitialize(); g_rec_mutex_unlock(wasapi_devin_mutex); return; } if(wasapi_devin->device != NULL){ memset(dev_id, 0, 1024 * sizeof(WCHAR)); swprintf(dev_id, 1024, L"%S", wasapi_devin->device); if(dev_enumerator->lpVtbl->GetDevice(dev_enumerator, dev_id, &mm_device)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVIN_ERROR, AGS_WASAPI_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IMMDevice."); } dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); g_rec_mutex_unlock(wasapi_devin_mutex); return; } }else{ if(dev_enumerator->lpVtbl->GetDefaultAudioEndpoint(dev_enumerator, eCapture, eMultimedia, &mm_device)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVIN_ERROR, AGS_WASAPI_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IAudioClient."); } dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_START_RECORD); g_rec_mutex_unlock(wasapi_devin_mutex); g_message("WASAPI failed - get device"); return; } } wasapi_devin->mm_device = mm_device; // Get its IAudioClient (used to set audio format, latency, and start/stop) if(mm_device->lpVtbl->Activate(mm_device, &ags_wasapi_iid_audio_client_guid, CLSCTX_ALL, 0, (void **) &audio_client)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVIN_ERROR, AGS_WASAPI_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IAudioClient."); } mm_device->lpVtbl->Release(mm_device); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); g_rec_mutex_unlock(wasapi_devin_mutex); g_message("WASAPI failed - get audio client"); return; } wasapi_devin->audio_client = audio_client; if((AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE & (wasapi_devin->flags)) != 0){ wave_format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wave_format.Format.nSamplesPerSec = wasapi_devin->samplerate; // necessary wave_format.Format.nChannels = wasapi_devin->pcm_channels; // presumed bit_resolution = 16; switch(wasapi_devin->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { bit_resolution = 16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { bit_resolution = 24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { bit_resolution = 32; } break; } if(bit_resolution == 24){ wave_format.Format.wBitsPerSample = 32; wave_format.Format.nBlockAlign = 2 * (32 / 8); wave_format.Samples.wValidBitsPerSample = 24; }else{ wave_format.Format.wBitsPerSample = wave_format.Samples.wValidBitsPerSample = bit_resolution; wave_format.Format.nBlockAlign = 2 * (bit_resolution / 8); } wave_format.Format.nBlockAlign = wave_format.Format.nChannels * wave_format.Format.wBitsPerSample / 8; wave_format.Format.nAvgBytesPerSec = wave_format.Format.nSamplesPerSec * wave_format.Format.nBlockAlign; wave_format.Format.cbSize = 22; wave_format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; wave_format.SubFormat = ags_wasapi_pcm_subformat_guid; if((hr = audio_client->lpVtbl->GetMixFormat(audio_client, &internal_format))){ g_message("get mix format"); } desired_format = &(wave_format.Format); desired_format->wFormatTag = 0xFFFE; desired_format->cbSize = 22; if((hr = audio_client->lpVtbl->IsFormatSupported(audio_client, AUDCLNT_SHAREMODE_EXCLUSIVE, desired_format, NULL))){ ags_wasapi_devin_client_init_EXCLUSIVE_BROKEN_CONFIGURATION: mm_device->lpVtbl->Release(mm_device); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_START_RECORD); g_rec_mutex_unlock(wasapi_devin_mutex); g_message("WASAPI failed - broken configuration"); return; } audio_client->lpVtbl->GetDevicePeriod(audio_client, NULL, &min_duration); min_duration = (AGS_NSEC_PER_SEC / 100) / wasapi_devin->samplerate * wasapi_devin->wasapi_buffer_size; if((hr = audio_client->lpVtbl->Initialize(audio_client, AUDCLNT_SHAREMODE_EXCLUSIVE, 0, min_duration, min_duration, desired_format, NULL))){ audio_client->lpVtbl->Release(audio_client); goto ags_wasapi_devin_client_init_EXCLUSIVE_BROKEN_CONFIGURATION; } }else{ wave_format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wave_format.Format.nSamplesPerSec = wasapi_devin->samplerate; // necessary wave_format.Format.nChannels = wasapi_devin->pcm_channels; // presumed bit_resolution = 16; switch(wasapi_devin->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { bit_resolution = 16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { bit_resolution = 24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { bit_resolution = 32; } break; } if(bit_resolution == 24){ wave_format.Format.wBitsPerSample = 32; wave_format.Format.nBlockAlign = 2 * (32 / 8); wave_format.Samples.wValidBitsPerSample = 24; }else{ wave_format.Format.wBitsPerSample = wave_format.Samples.wValidBitsPerSample = bit_resolution; wave_format.Format.nBlockAlign = 2 * (bit_resolution / 8); } wave_format.Format.nBlockAlign = wave_format.Format.nChannels * wave_format.Format.wBitsPerSample / 8; wave_format.Format.nAvgBytesPerSec = wave_format.Format.nSamplesPerSec * wave_format.Format.nBlockAlign; wave_format.Format.cbSize = 22; wave_format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; wave_format.SubFormat = ags_wasapi_pcm_subformat_guid; if((hr = audio_client->lpVtbl->GetMixFormat(audio_client, &internal_format))){ g_message("get mix format"); ags_wasapi_devin_client_init_SHARED_BROKEN_CONFIGURATION: mm_device->lpVtbl->Release(mm_device); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_START_RECORD); g_rec_mutex_unlock(wasapi_devin_mutex); g_message("WASAPI failed - broken configuration"); return; } desired_format = internal_format; if((hr = audio_client->lpVtbl->IsFormatSupported(audio_client, AUDCLNT_SHAREMODE_SHARED, desired_format, &desired_format))){ goto ags_wasapi_devin_client_init_SHARED_BROKEN_CONFIGURATION; } desired_format = internal_format; audio_client->lpVtbl->GetDevicePeriod(audio_client, NULL, &min_duration); min_duration = (AGS_NSEC_PER_SEC / 100) / wasapi_devin->samplerate * wasapi_devin->buffer_size; min_duration = (AGS_NSEC_PER_SEC / 100) / wasapi_devin->samplerate * wasapi_devin->wasapi_buffer_size; if((hr = audio_client->lpVtbl->Initialize(audio_client, AUDCLNT_SHAREMODE_SHARED, 0, min_duration, 0, desired_format, NULL))){ audio_client->lpVtbl->Release(audio_client); goto ags_wasapi_devin_client_init_SHARED_BROKEN_CONFIGURATION; } } // Start audio capture audio_client->lpVtbl->Start(audio_client); } audio_client = wasapi_devin->audio_client; #endif /* do capture */ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_START_RECORD); if((AGS_WASAPI_DEVIN_INITIALIZED & (wasapi_devin->flags)) == 0){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } // g_message("record - 0x%0x", ((AGS_WASAPI_DEVIN_BUFFER0 | // AGS_WASAPI_DEVIN_BUFFER1 | // AGS_WASAPI_DEVIN_BUFFER2 | // AGS_WASAPI_DEVIN_BUFFER3) & (wasapi_devin->flags))); /* check buffer flag */ if((AGS_WASAPI_DEVIN_SHUTDOWN & (wasapi_devin->flags)) == 0){ /* check buffer flag */ nth_buffer = 0; if((AGS_WASAPI_DEVIN_BUFFER0 & (wasapi_devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_WASAPI_DEVIN_BUFFER1 & (wasapi_devin->flags)) != 0){ nth_buffer = 1; }else if((AGS_WASAPI_DEVIN_BUFFER2 & (wasapi_devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_WASAPI_DEVIN_BUFFER3 & (wasapi_devin->flags)) != 0){ nth_buffer = 3; }else if((AGS_WASAPI_DEVIN_BUFFER4 & (wasapi_devin->flags)) != 0){ nth_buffer = 4; }else if((AGS_WASAPI_DEVIN_BUFFER5 & (wasapi_devin->flags)) != 0){ nth_buffer = 5; }else if((AGS_WASAPI_DEVIN_BUFFER6 & (wasapi_devin->flags)) != 0){ nth_buffer = 6; }else if((AGS_WASAPI_DEVIN_BUFFER7 & (wasapi_devin->flags)) != 0){ nth_buffer = 7; } #ifdef AGS_WITH_WASAPI /* wait until available */ audio_client = wasapi_devin->audio_client; audio_client->lpVtbl->GetBufferSize(audio_client, &buffer_frame_count); { HRESULT res; res = audio_client->lpVtbl->GetService(audio_client, &ags_wasapi_iid_audio_capture_client_guid, (void **) &audio_capture_client); switch(res){ case E_POINTER: { g_message("pointer"); } break; case E_NOINTERFACE: { g_message("no interface"); } break; case AUDCLNT_E_NOT_INITIALIZED: { g_message("not initialized"); } break; case AUDCLNT_E_WRONG_ENDPOINT_TYPE: { g_message("wrong endpoint"); } break; case AUDCLNT_E_DEVICE_INVALIDATED: { g_message("device invalidated"); } break; case AUDCLNT_E_SERVICE_NOT_RUNNING: { g_message("no service"); } break; } } if(audio_capture_client == NULL){ g_rec_mutex_unlock(wasapi_devin_mutex); g_message("audio_capture_client = NULL"); return; } { UINT32 padding_frames; static const struct timespec poll_delay = { 0, 400, }; audio_client->lpVtbl->GetCurrentPadding(audio_client, &padding_frames); while(buffer_frame_count - padding_frames < wasapi_devin->buffer_size && padding_frames != 0){ nanosleep(&poll_delay, NULL); audio_client->lpVtbl->GetCurrentPadding(audio_client, &padding_frames); } } { HRESULT res; res = audio_capture_client->lpVtbl->GetBuffer(audio_capture_client, &data, &num_frames_available, &pdw_flags, NULL, NULL); switch(res){ case AUDCLNT_E_BUFFER_ERROR: { g_message("buffer error"); } break; case AUDCLNT_E_BUFFER_TOO_LARGE: { g_message("buffer too large"); } break; case AUDCLNT_E_BUFFER_SIZE_ERROR: { g_message("buffer size error"); } break; case AUDCLNT_E_OUT_OF_ORDER: { g_message("out of order"); } break; case AUDCLNT_E_DEVICE_INVALIDATED: { g_message("invalidated"); } break; case AUDCLNT_E_BUFFER_OPERATION_PENDING: { g_message("operation pending"); } break; case AUDCLNT_E_SERVICE_NOT_RUNNING: { g_message("no service"); } break; case E_POINTER: { g_message("pointer"); } break; } } /* retrieve word size */ if(data != NULL){ switch(wasapi_devin->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { ags_audio_buffer_util_copy_s16_to_s16(wasapi_devin->buffer[nth_buffer], 1, data, 1, wasapi_devin->pcm_channels * wasapi_devin->buffer_size); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ags_audio_buffer_util_copy_s24_to_s24(wasapi_devin->buffer[nth_buffer], 1, data, 1, wasapi_devin->pcm_channels * wasapi_devin->buffer_size); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ags_audio_buffer_util_copy_s32_to_s32(wasapi_devin->buffer[nth_buffer], 1, data, 1, wasapi_devin->pcm_channels * wasapi_devin->buffer_size); } break; } }else{ g_message("data = NULL"); } audio_capture_client->lpVtbl->ReleaseBuffer(audio_capture_client, wasapi_devin->buffer_size); audio_capture_client->lpVtbl->Release(audio_capture_client); #endif } if((AGS_WASAPI_DEVIN_SHUTDOWN & (wasapi_devin->flags)) != 0){ AgsThread *audio_loop; AgsThread *soundcard_thread; AgsApplicationContext *application_context; #ifdef AGS_WITH_WASAPI IMMDevice *mm_device; HRESULT hr; g_message("wasapi shutdown"); audio_client = wasapi_devin->audio_client; audio_client->lpVtbl->GetService(audio_client, &ags_wasapi_iid_audio_capture_client_guid, (void **) &audio_capture_client); mm_device = wasapi_devin->mm_device; hr = audio_client->lpVtbl->Stop(audio_client); if(FAILED(hr)){ g_message("failed to stop WASAPI"); } audio_client->lpVtbl->Reset(audio_client); if(audio_capture_client != NULL){ audio_capture_client->lpVtbl->Release(audio_capture_client); } audio_client->lpVtbl->Release(audio_client); mm_device->lpVtbl->Release(mm_device); wasapi_devin->audio_client = NULL; wasapi_devin->mm_device = NULL; CoUninitialize(); #endif application_context = ags_application_context_get_instance(); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); soundcard_thread = ags_soundcard_thread_find_soundcard(soundcard_thread, AGS_WASAPI_DEVIN(soundcard)); ags_thread_stop(soundcard_thread); } g_rec_mutex_unlock(wasapi_devin_mutex); if((AGS_WASAPI_DEVIN_SHUTDOWN & (wasapi_devin->flags)) == 0){ /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) wasapi_devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) wasapi_devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) wasapi_devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } } void ags_wasapi_devin_client_free(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; AgsApplicationContext *application_context; guint i; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* lock */ g_rec_mutex_lock(wasapi_devin_mutex); if((AGS_WASAPI_DEVIN_INITIALIZED & (wasapi_devin->flags)) == 0){ g_rec_mutex_unlock(wasapi_devin_mutex); return; } wasapi_devin->flags |= (AGS_WASAPI_DEVIN_SHUTDOWN); g_rec_mutex_unlock(wasapi_devin_mutex); g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->note_offset = wasapi_devin->start_note_offset; wasapi_devin->note_offset_absolute = wasapi_devin->start_note_offset; g_rec_mutex_unlock(wasapi_devin_mutex); } void ags_wasapi_devin_tic(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* determine if attack should be switched */ g_rec_mutex_lock(wasapi_devin_mutex); delay = wasapi_devin->delay[wasapi_devin->tic_counter]; delay_counter = wasapi_devin->delay_counter; note_offset = wasapi_devin->note_offset; note_offset_absolute = wasapi_devin->note_offset_absolute; loop_left = wasapi_devin->loop_left; loop_right = wasapi_devin->loop_right; do_loop = wasapi_devin->do_loop; g_rec_mutex_unlock(wasapi_devin_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->delay_counter = delay_counter + 1.0 - delay; wasapi_devin->tact_counter += 1.0; g_rec_mutex_unlock(wasapi_devin_mutex); }else{ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->delay_counter += 1.0; g_rec_mutex_unlock(wasapi_devin_mutex); } } void ags_wasapi_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* offset changed */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->tic_counter += 1; if(wasapi_devin->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ wasapi_devin->tic_counter = 0; } g_rec_mutex_unlock(wasapi_devin_mutex); } void ags_wasapi_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set bpm */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->bpm = bpm; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); } gdouble ags_wasapi_devin_get_bpm(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gdouble bpm; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get bpm */ g_rec_mutex_lock(wasapi_devin_mutex); bpm = wasapi_devin->bpm; g_rec_mutex_unlock(wasapi_devin_mutex); return(bpm); } void ags_wasapi_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set delay factor */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->delay_factor = delay_factor; g_rec_mutex_unlock(wasapi_devin_mutex); ags_wasapi_devin_adjust_delay_and_attack(wasapi_devin); } gdouble ags_wasapi_devin_get_delay_factor(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gdouble delay_factor; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get delay factor */ g_rec_mutex_lock(wasapi_devin_mutex); delay_factor = wasapi_devin->delay_factor; g_rec_mutex_unlock(wasapi_devin_mutex); return(delay_factor); } gdouble ags_wasapi_devin_get_delay(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint delay_index; gdouble delay; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get delay */ g_rec_mutex_lock(wasapi_devin_mutex); delay_index = wasapi_devin->tic_counter; delay = wasapi_devin->delay[delay_index]; g_rec_mutex_unlock(wasapi_devin_mutex); return(delay); } gdouble ags_wasapi_devin_get_absolute_delay(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; gdouble absolute_delay; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get absolute delay */ g_rec_mutex_lock(wasapi_devin_mutex); absolute_delay = (60.0 * (((gdouble) wasapi_devin->samplerate / (gdouble) wasapi_devin->buffer_size) / (gdouble) wasapi_devin->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) wasapi_devin->delay_factor))); g_rec_mutex_unlock(wasapi_devin_mutex); return(absolute_delay); } guint ags_wasapi_devin_get_attack(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint attack_index; guint attack; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get attack */ g_rec_mutex_lock(wasapi_devin_mutex); attack_index = wasapi_devin->tic_counter; attack = wasapi_devin->attack[attack_index]; g_rec_mutex_unlock(wasapi_devin_mutex); return(attack); } void* ags_wasapi_devin_get_buffer(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; void *buffer; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER0)){ buffer = wasapi_devin->buffer[0]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER1)){ buffer = wasapi_devin->buffer[1]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER2)){ buffer = wasapi_devin->buffer[2]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER3)){ buffer = wasapi_devin->buffer[3]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER4)){ buffer = wasapi_devin->buffer[4]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER5)){ buffer = wasapi_devin->buffer[5]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER6)){ buffer = wasapi_devin->buffer[6]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER7)){ buffer = wasapi_devin->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_wasapi_devin_get_next_buffer(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; void *buffer; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); // g_message("next - 0x%0x", ((AGS_WASAPI_DEVIN_BUFFER0 | // AGS_WASAPI_DEVIN_BUFFER1 | // AGS_WASAPI_DEVIN_BUFFER2 | // AGS_WASAPI_DEVIN_BUFFER3) & (wasapi_devin->flags))); if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER0)){ buffer = wasapi_devin->buffer[1]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER1)){ buffer = wasapi_devin->buffer[2]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER2)){ buffer = wasapi_devin->buffer[3]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER3)){ buffer = wasapi_devin->buffer[4]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER4)){ buffer = wasapi_devin->buffer[5]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER5)){ buffer = wasapi_devin->buffer[6]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER6)){ buffer = wasapi_devin->buffer[7]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER7)){ buffer = wasapi_devin->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_wasapi_devin_get_prev_buffer(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; void *buffer; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER0)){ buffer = wasapi_devin->buffer[7]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER1)){ buffer = wasapi_devin->buffer[0]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER2)){ buffer = wasapi_devin->buffer[1]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER3)){ buffer = wasapi_devin->buffer[2]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER4)){ buffer = wasapi_devin->buffer[3]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER5)){ buffer = wasapi_devin->buffer[4]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER6)){ buffer = wasapi_devin->buffer[5]; }else if(ags_wasapi_devin_test_flags(wasapi_devin, AGS_WASAPI_DEVIN_BUFFER7)){ buffer = wasapi_devin->buffer[6]; }else{ buffer = NULL; } return(buffer); } void ags_wasapi_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsWasapiDevin *wasapi_devin; GRecMutex *buffer_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); buffer_mutex = NULL; if(wasapi_devin->buffer != NULL){ if(buffer == wasapi_devin->buffer[0]){ buffer_mutex = wasapi_devin->buffer_mutex[0]; }else if(buffer == wasapi_devin->buffer[1]){ buffer_mutex = wasapi_devin->buffer_mutex[1]; }else if(buffer == wasapi_devin->buffer[2]){ buffer_mutex = wasapi_devin->buffer_mutex[2]; }else if(buffer == wasapi_devin->buffer[3]){ buffer_mutex = wasapi_devin->buffer_mutex[3]; }else if(buffer == wasapi_devin->buffer[4]){ buffer_mutex = wasapi_devin->buffer_mutex[4]; }else if(buffer == wasapi_devin->buffer[5]){ buffer_mutex = wasapi_devin->buffer_mutex[5]; }else if(buffer == wasapi_devin->buffer[6]){ buffer_mutex = wasapi_devin->buffer_mutex[6]; }else if(buffer == wasapi_devin->buffer[7]){ buffer_mutex = wasapi_devin->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_wasapi_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsWasapiDevin *wasapi_devin; GRecMutex *buffer_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); buffer_mutex = NULL; if(wasapi_devin->buffer != NULL){ if(buffer == wasapi_devin->buffer[0]){ buffer_mutex = wasapi_devin->buffer_mutex[0]; }else if(buffer == wasapi_devin->buffer[1]){ buffer_mutex = wasapi_devin->buffer_mutex[1]; }else if(buffer == wasapi_devin->buffer[2]){ buffer_mutex = wasapi_devin->buffer_mutex[2]; }else if(buffer == wasapi_devin->buffer[3]){ buffer_mutex = wasapi_devin->buffer_mutex[3]; }else if(buffer == wasapi_devin->buffer[4]){ buffer_mutex = wasapi_devin->buffer_mutex[4]; }else if(buffer == wasapi_devin->buffer[5]){ buffer_mutex = wasapi_devin->buffer_mutex[5]; }else if(buffer == wasapi_devin->buffer[6]){ buffer_mutex = wasapi_devin->buffer_mutex[6]; }else if(buffer == wasapi_devin->buffer[7]){ buffer_mutex = wasapi_devin->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_wasapi_devin_get_delay_counter(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint delay_counter; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* delay counter */ g_rec_mutex_lock(wasapi_devin_mutex); delay_counter = wasapi_devin->delay_counter; g_rec_mutex_unlock(wasapi_devin_mutex); return(delay_counter); } void ags_wasapi_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set note offset */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->note_offset = note_offset; g_rec_mutex_unlock(wasapi_devin_mutex); } guint ags_wasapi_devin_get_start_note_offset(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint start_note_offset; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set note offset */ g_rec_mutex_lock(wasapi_devin_mutex); start_note_offset = wasapi_devin->start_note_offset; g_rec_mutex_unlock(wasapi_devin_mutex); return(start_note_offset); } void ags_wasapi_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set note offset */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->start_note_offset = start_note_offset; g_rec_mutex_unlock(wasapi_devin_mutex); } guint ags_wasapi_devin_get_note_offset(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint note_offset; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set note offset */ g_rec_mutex_lock(wasapi_devin_mutex); note_offset = wasapi_devin->note_offset; g_rec_mutex_unlock(wasapi_devin_mutex); return(note_offset); } void ags_wasapi_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set note offset */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(wasapi_devin_mutex); } guint ags_wasapi_devin_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint note_offset_absolute; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set note offset */ g_rec_mutex_lock(wasapi_devin_mutex); note_offset_absolute = wasapi_devin->note_offset_absolute; g_rec_mutex_unlock(wasapi_devin_mutex); return(note_offset_absolute); } void ags_wasapi_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* set loop */ g_rec_mutex_lock(wasapi_devin_mutex); wasapi_devin->loop_left = loop_left; wasapi_devin->loop_right = loop_right; wasapi_devin->do_loop = do_loop; if(do_loop){ wasapi_devin->loop_offset = wasapi_devin->note_offset; } g_rec_mutex_unlock(wasapi_devin_mutex); } void ags_wasapi_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsWasapiDevin *wasapi_devin; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get loop */ g_rec_mutex_lock(wasapi_devin_mutex); if(loop_left != NULL){ *loop_left = wasapi_devin->loop_left; } if(loop_right != NULL){ *loop_right = wasapi_devin->loop_right; } if(do_loop != NULL){ *do_loop = wasapi_devin->do_loop; } g_rec_mutex_unlock(wasapi_devin_mutex); } guint ags_wasapi_devin_get_loop_offset(AgsSoundcard *soundcard) { AgsWasapiDevin *wasapi_devin; guint loop_offset; GRecMutex *wasapi_devin_mutex; wasapi_devin = AGS_WASAPI_DEVIN(soundcard); /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get loop offset */ g_rec_mutex_lock(wasapi_devin_mutex); loop_offset = wasapi_devin->loop_offset; g_rec_mutex_unlock(wasapi_devin_mutex); return(loop_offset); } /** * ags_wasapi_devin_switch_buffer_flag: * @wasapi_devin: an #AgsWasapiDevin * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_wasapi_devin_switch_buffer_flag(AgsWasapiDevin *wasapi_devin) { GRecMutex *wasapi_devin_mutex; if(!AGS_IS_WASAPI_DEVIN(wasapi_devin)){ return; } /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* switch buffer flag */ g_rec_mutex_lock(wasapi_devin_mutex); if((AGS_WASAPI_DEVIN_BUFFER0 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER0); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER1; }else if((AGS_WASAPI_DEVIN_BUFFER1 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER1); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER2; }else if((AGS_WASAPI_DEVIN_BUFFER2 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER2); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER3; }else if((AGS_WASAPI_DEVIN_BUFFER3 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER3); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER4; }else if((AGS_WASAPI_DEVIN_BUFFER4 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER4); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER5; }else if((AGS_WASAPI_DEVIN_BUFFER5 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER5); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER6; }else if((AGS_WASAPI_DEVIN_BUFFER6 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER6); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER7; }else if((AGS_WASAPI_DEVIN_BUFFER7 & (wasapi_devin->flags)) != 0){ wasapi_devin->flags &= (~AGS_WASAPI_DEVIN_BUFFER7); wasapi_devin->flags |= AGS_WASAPI_DEVIN_BUFFER0; } g_rec_mutex_unlock(wasapi_devin_mutex); } /** * ags_wasapi_devin_adjust_delay_and_attack: * @wasapi_devin: the #AgsWasapiDevin * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_wasapi_devin_adjust_delay_and_attack(AgsWasapiDevin *wasapi_devin) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *wasapi_devin_mutex; if(!AGS_IS_WASAPI_DEVIN(wasapi_devin)){ return; } /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get some initial values */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(wasapi_devin)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(wasapi_devin_mutex); default_tact_frames = (guint) (delay * wasapi_devin->buffer_size); delay_tact_frames = (guint) (floor(delay) * wasapi_devin->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; wasapi_devin->attack[0] = (guint) floor(0.25 * wasapi_devin->buffer_size); next_attack = (((wasapi_devin->attack[i] + default_tact_frames) / wasapi_devin->buffer_size) - delay) * wasapi_devin->buffer_size; if(next_attack < 0){ next_attack = 0; } if(next_attack >= wasapi_devin->buffer_size){ next_attack = wasapi_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ wasapi_devin->attack[i] = wasapi_devin->attack[i] - ((gdouble) next_attack / 2.0); if(wasapi_devin->attack[i] < 0){ wasapi_devin->attack[i] = 0; } if(wasapi_devin->attack[i] >= wasapi_devin->buffer_size){ wasapi_devin->attack[i] = wasapi_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= wasapi_devin->buffer_size){ next_attack = wasapi_devin->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ wasapi_devin->attack[i] = next_attack; next_attack = (((wasapi_devin->attack[i] + default_tact_frames) / wasapi_devin->buffer_size) - delay) * wasapi_devin->buffer_size; if(next_attack >= wasapi_devin->buffer_size){ next_attack = wasapi_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ wasapi_devin->attack[i] = wasapi_devin->attack[i] - ((gdouble) next_attack / 2.0); if(wasapi_devin->attack[i] < 0){ wasapi_devin->attack[i] = 0; } if(wasapi_devin->attack[i] >= wasapi_devin->buffer_size){ wasapi_devin->attack[i] = wasapi_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= wasapi_devin->buffer_size){ next_attack = wasapi_devin->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", wasapi_devin->attack[i]); #endif } wasapi_devin->attack[0] = wasapi_devin->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ wasapi_devin->delay[i] = ((gdouble) (default_tact_frames + wasapi_devin->attack[i] - wasapi_devin->attack[i + 1])) / (gdouble) wasapi_devin->buffer_size; #ifdef AGS_DEBUG g_message("%f", wasapi_devin->delay[i]); #endif } wasapi_devin->delay[i] = ((gdouble) (default_tact_frames + wasapi_devin->attack[i] - wasapi_devin->attack[0])) / (gdouble) wasapi_devin->buffer_size; g_rec_mutex_unlock(wasapi_devin_mutex); } /** * ags_wasapi_devin_realloc_buffer: * @wasapi_devin: the #AgsWasapiDevin * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_wasapi_devin_realloc_buffer(AgsWasapiDevin *wasapi_devin) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *wasapi_devin_mutex; if(!AGS_IS_WASAPI_DEVIN(wasapi_devin)){ return; } /* get wasapi devin mutex */ wasapi_devin_mutex = AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(wasapi_devin); /* get word size */ g_rec_mutex_lock(wasapi_devin_mutex); pcm_channels = wasapi_devin->pcm_channels; buffer_size = wasapi_devin->buffer_size; format = wasapi_devin->format; g_rec_mutex_unlock(wasapi_devin_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_wasapi_devin_realloc_buffer(): unsupported word size"); return; } /* AGS_WASAPI_DEVIN_BUFFER_0 */ if(wasapi_devin->buffer[0] != NULL){ free(wasapi_devin->buffer[0]); } wasapi_devin->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_1 */ if(wasapi_devin->buffer[1] != NULL){ free(wasapi_devin->buffer[1]); } wasapi_devin->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_2 */ if(wasapi_devin->buffer[2] != NULL){ free(wasapi_devin->buffer[2]); } wasapi_devin->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_3 */ if(wasapi_devin->buffer[3] != NULL){ free(wasapi_devin->buffer[3]); } wasapi_devin->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_4 */ if(wasapi_devin->buffer[4] != NULL){ free(wasapi_devin->buffer[4]); } wasapi_devin->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_5 */ if(wasapi_devin->buffer[5] != NULL){ free(wasapi_devin->buffer[5]); } wasapi_devin->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_6 */ if(wasapi_devin->buffer[6] != NULL){ free(wasapi_devin->buffer[6]); } wasapi_devin->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVIN_BUFFER_7 */ if(wasapi_devin->buffer[7] != NULL){ free(wasapi_devin->buffer[7]); } wasapi_devin->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_wasapi_devin_new: * * Creates a new instance of #AgsWasapiDevin. * * Returns: a new #AgsWasapiDevin * * Since: 3.0.0 */ AgsWasapiDevin* ags_wasapi_devin_new() { AgsWasapiDevin *wasapi_devin; wasapi_devin = (AgsWasapiDevin *) g_object_new(AGS_TYPE_WASAPI_DEVIN, NULL); return(wasapi_devin); } gsequencer-3.1.3/ags/audio/wasapi/ags_wasapi_devout.c0000644000175000017500000026447513613101102017615 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_WASAPI #include #include #include #include #endif #include #include void ags_wasapi_devout_class_init(AgsWasapiDevoutClass *wasapi_devout); void ags_wasapi_devout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_wasapi_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_wasapi_devout_init(AgsWasapiDevout *wasapi_devout); void ags_wasapi_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wasapi_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wasapi_devout_dispose(GObject *gobject); void ags_wasapi_devout_finalize(GObject *gobject); AgsUUID* ags_wasapi_devout_get_uuid(AgsConnectable *connectable); gboolean ags_wasapi_devout_has_resource(AgsConnectable *connectable); gboolean ags_wasapi_devout_is_ready(AgsConnectable *connectable); void ags_wasapi_devout_add_to_registry(AgsConnectable *connectable); void ags_wasapi_devout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_wasapi_devout_list_resource(AgsConnectable *connectable); xmlNode* ags_wasapi_devout_xml_compose(AgsConnectable *connectable); void ags_wasapi_devout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_wasapi_devout_is_connected(AgsConnectable *connectable); void ags_wasapi_devout_connect(AgsConnectable *connectable); void ags_wasapi_devout_disconnect(AgsConnectable *connectable); void ags_wasapi_devout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_wasapi_devout_get_device(AgsSoundcard *soundcard); void ags_wasapi_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_wasapi_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_wasapi_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_wasapi_devout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_wasapi_devout_get_capability(AgsSoundcard *soundcard); gboolean ags_wasapi_devout_is_starting(AgsSoundcard *soundcard); gboolean ags_wasapi_devout_is_playing(AgsSoundcard *soundcard); gchar* ags_wasapi_devout_get_uptime(AgsSoundcard *soundcard); void ags_wasapi_devout_client_init(AgsSoundcard *soundcard, GError **error); void ags_wasapi_devout_client_play(AgsSoundcard *soundcard, GError **error); void ags_wasapi_devout_client_free(AgsSoundcard *soundcard); void ags_wasapi_devout_tic(AgsSoundcard *soundcard); void ags_wasapi_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_wasapi_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_wasapi_devout_get_bpm(AgsSoundcard *soundcard); void ags_wasapi_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_wasapi_devout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_wasapi_devout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_wasapi_devout_get_delay(AgsSoundcard *soundcard); guint ags_wasapi_devout_get_attack(AgsSoundcard *soundcard); void* ags_wasapi_devout_get_buffer(AgsSoundcard *soundcard); void* ags_wasapi_devout_get_next_buffer(AgsSoundcard *soundcard); void* ags_wasapi_devout_get_prev_buffer(AgsSoundcard *soundcard); void ags_wasapi_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_wasapi_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_wasapi_devout_get_delay_counter(AgsSoundcard *soundcard); void ags_wasapi_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_wasapi_devout_get_start_note_offset(AgsSoundcard *soundcard); void ags_wasapi_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_wasapi_devout_get_note_offset(AgsSoundcard *soundcard); void ags_wasapi_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_wasapi_devout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_wasapi_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_wasapi_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_wasapi_devout_get_loop_offset(AgsSoundcard *soundcard); guint ags_wasapi_devout_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_wasapi_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_wasapi_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); /** * SECTION:ags_wasapi_devout * @short_description: Output to soundcard * @title: AgsWasapiDevout * @section_id: * @include: ags/audio/wasapi/ags_wasapi_devout.h * * #AgsWasapiDevout represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_CHANNEL, }; static gpointer ags_wasapi_devout_parent_class = NULL; #ifdef AGS_W32API static const GUID ags_wasapi_clsid_mm_device_enumerator_guid = {0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}; static const GUID ags_wasapi_iid_mm_device_enumerator_guid = {0xA95664D2, 0x9614, 0x4F35, 0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6}; static const GUID ags_wasapi_iid_audio_client_guid = {0x1CB9AD4C, 0xDBFA, 0x4c32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2}; static const GUID ags_wasapi_iid_audio_render_client_guid = {0xF294ACFC, 0x3146, 0x4483, 0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2}; static const GUID ags_wasapi_pcm_subformat_guid = {0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}; static const GUID ags_wasapi_pkey_device_friendly_name_guid = {0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0}; struct _PROPERTYKEY{ GUID fmtid; DWORD id; }; static struct _PROPERTYKEY ags_wasapi_pkey_device_friendly_name_key = {ags_wasapi_pkey_device_friendly_name_guid, 14}; #endif GType ags_wasapi_devout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wasapi_devout = 0; static const GTypeInfo ags_wasapi_devout_info = { sizeof(AgsWasapiDevoutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wasapi_devout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsWasapiDevout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wasapi_devout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_wasapi_devout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_wasapi_devout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_wasapi_devout = g_type_register_static(G_TYPE_OBJECT, "AgsWasapiDevout", &ags_wasapi_devout_info, 0); g_type_add_interface_static(ags_type_wasapi_devout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_wasapi_devout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_wasapi_devout); } return g_define_type_id__volatile; } void ags_wasapi_devout_class_init(AgsWasapiDevoutClass *wasapi_devout) { GObjectClass *gobject; GParamSpec *param_spec; ags_wasapi_devout_parent_class = g_type_class_peek_parent(wasapi_devout); /* GObjectClass */ gobject = (GObjectClass *) wasapi_devout; gobject->set_property = ags_wasapi_devout_set_property; gobject->get_property = ags_wasapi_devout_get_property; gobject->dispose = ags_wasapi_devout_dispose; gobject->finalize = ags_wasapi_devout_finalize; /* properties */ /** * AgsWasapiDevout:device: * * The core audio soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-wasapi-devout-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsWasapiDevout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsWasapiDevout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsWasapiDevout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsWasapiDevout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsWasapiDevout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsWasapiDevout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsWasapiDevout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsWasapiDevout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsWasapiDevout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); } GQuark ags_wasapi_devout_error_quark() { return(g_quark_from_static_string("ags-wasapi_devout-error-quark")); } void ags_wasapi_devout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_wasapi_devout_get_uuid; connectable->has_resource = ags_wasapi_devout_has_resource; connectable->is_ready = ags_wasapi_devout_is_ready; connectable->add_to_registry = ags_wasapi_devout_add_to_registry; connectable->remove_from_registry = ags_wasapi_devout_remove_from_registry; connectable->list_resource = ags_wasapi_devout_list_resource; connectable->xml_compose = ags_wasapi_devout_xml_compose; connectable->xml_parse = ags_wasapi_devout_xml_parse; connectable->is_connected = ags_wasapi_devout_is_connected; connectable->connect = ags_wasapi_devout_connect; connectable->disconnect = ags_wasapi_devout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_wasapi_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_wasapi_devout_set_device; soundcard->get_device = ags_wasapi_devout_get_device; soundcard->set_presets = ags_wasapi_devout_set_presets; soundcard->get_presets = ags_wasapi_devout_get_presets; soundcard->list_cards = ags_wasapi_devout_list_cards; soundcard->pcm_info = ags_wasapi_devout_pcm_info; soundcard->get_capability = ags_wasapi_devout_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_wasapi_devout_is_starting; soundcard->is_playing = ags_wasapi_devout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_wasapi_devout_get_uptime; soundcard->play_init = ags_wasapi_devout_client_init; soundcard->play = ags_wasapi_devout_client_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_wasapi_devout_client_free; soundcard->tic = ags_wasapi_devout_tic; soundcard->offset_changed = ags_wasapi_devout_offset_changed; soundcard->set_bpm = ags_wasapi_devout_set_bpm; soundcard->get_bpm = ags_wasapi_devout_get_bpm; soundcard->set_delay_factor = ags_wasapi_devout_set_delay_factor; soundcard->get_delay_factor = ags_wasapi_devout_get_delay_factor; soundcard->get_absolute_delay = ags_wasapi_devout_get_absolute_delay; soundcard->get_delay = ags_wasapi_devout_get_delay; soundcard->get_attack = ags_wasapi_devout_get_attack; soundcard->get_buffer = ags_wasapi_devout_get_buffer; soundcard->get_next_buffer = ags_wasapi_devout_get_next_buffer; soundcard->get_prev_buffer = ags_wasapi_devout_get_prev_buffer; soundcard->lock_buffer = ags_wasapi_devout_lock_buffer; soundcard->unlock_buffer = ags_wasapi_devout_unlock_buffer; soundcard->get_delay_counter = ags_wasapi_devout_get_delay_counter; soundcard->set_start_note_offset = ags_wasapi_devout_set_start_note_offset; soundcard->get_start_note_offset = ags_wasapi_devout_get_start_note_offset; soundcard->set_note_offset = ags_wasapi_devout_set_note_offset; soundcard->get_note_offset = ags_wasapi_devout_get_note_offset; soundcard->set_note_offset_absolute = ags_wasapi_devout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_wasapi_devout_get_note_offset_absolute; soundcard->set_loop = ags_wasapi_devout_set_loop; soundcard->get_loop = ags_wasapi_devout_get_loop; soundcard->get_loop_offset = ags_wasapi_devout_get_loop_offset; soundcard->get_sub_block_count = ags_wasapi_devout_get_sub_block_count; soundcard->trylock_sub_block = ags_wasapi_devout_trylock_sub_block; soundcard->unlock_sub_block = ags_wasapi_devout_unlock_sub_block; } void ags_wasapi_devout_init(AgsWasapiDevout *wasapi_devout) { AgsConfig *config; gchar *str; gchar *segmentation; guint denumerator, numerator; guint i; /* flags */ wasapi_devout->flags = 0; /* devout mutex */ g_rec_mutex_init(&(wasapi_devout->obj_mutex)); /* uuid */ wasapi_devout->uuid = ags_uuid_alloc(); ags_uuid_generate(wasapi_devout->uuid); /* presets */ config = ags_config_get_instance(); wasapi_devout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); wasapi_devout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); wasapi_devout->samplerate = ags_soundcard_helper_config_get_samplerate(config); wasapi_devout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); wasapi_devout->format = ags_soundcard_helper_config_get_format(config); str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "wasapi-buffer-size"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "wasapi-buffer-size"); } if(str != NULL){ wasapi_devout->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); }else{ wasapi_devout->wasapi_buffer_size = AGS_WASAPI_DEVOUT_DEFAULT_WASAPI_BUFFER_SIZE; } g_free(str); str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "wasapi-share-mode"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "wasapi-share-mode"); } if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ wasapi_devout->flags |= AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE; } g_free(str); /* device */ wasapi_devout->device = NULL; /* buffer */ wasapi_devout->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ wasapi_devout->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(wasapi_devout->buffer_mutex[i]); } wasapi_devout->sub_block_count = AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT; wasapi_devout->sub_block_mutex = (GRecMutex **) malloc(8 * wasapi_devout->sub_block_count * wasapi_devout->pcm_channels * sizeof(GRecMutex *)); for(i = 0; i < 8 * wasapi_devout->sub_block_count * wasapi_devout->pcm_channels; i++){ wasapi_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(wasapi_devout->sub_block_mutex[i]); } wasapi_devout->buffer = (void **) malloc(8 * sizeof(void*)); wasapi_devout->buffer[0] = NULL; wasapi_devout->buffer[1] = NULL; wasapi_devout->buffer[2] = NULL; wasapi_devout->buffer[3] = NULL; wasapi_devout->buffer[4] = NULL; wasapi_devout->buffer[5] = NULL; wasapi_devout->buffer[6] = NULL; wasapi_devout->buffer[7] = NULL; ags_wasapi_devout_realloc_buffer(wasapi_devout); /* bpm */ wasapi_devout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ wasapi_devout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denumerator, &numerator); wasapi_devout->delay_factor = 1.0 / numerator * (numerator / denumerator); g_free(segmentation); } /* delay and attack */ wasapi_devout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); wasapi_devout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); /* counters */ wasapi_devout->tact_counter = 0.0; wasapi_devout->delay_counter = 0.0; wasapi_devout->tic_counter = 0; wasapi_devout->start_note_offset = 0; wasapi_devout->note_offset = 0; wasapi_devout->note_offset_absolute = 0; wasapi_devout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; wasapi_devout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; wasapi_devout->do_loop = FALSE; wasapi_devout->loop_offset = 0; /* callback mutex */ g_mutex_init(&(wasapi_devout->callback_mutex)); g_cond_init(&(wasapi_devout->callback_cond)); /* callback finish mutex */ g_mutex_init(&(wasapi_devout->callback_finish_mutex)); g_cond_init(&(wasapi_devout->callback_finish_cond)); } void ags_wasapi_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(gobject); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->device = g_strdup(device); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devout_mutex); if(dsp_channels == wasapi_devout->dsp_channels){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } wasapi_devout->dsp_channels = dsp_channels; g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels, old_pcm_channels; guint i; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devout_mutex); if(pcm_channels == wasapi_devout->pcm_channels){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } old_pcm_channels = wasapi_devout->pcm_channels; /* destroy if less pcm-channels */ for(i = 8 * wasapi_devout->sub_block_count * pcm_channels; i < 8 * wasapi_devout->sub_block_count * old_pcm_channels; i++){ g_rec_mutex_clear(wasapi_devout->sub_block_mutex[i]); free(wasapi_devout->sub_block_mutex[i]); } wasapi_devout->sub_block_mutex = (GRecMutex **) realloc(wasapi_devout->sub_block_mutex, 8 * wasapi_devout->sub_block_count * pcm_channels * sizeof(GRecMutex *)); /* create if more pcm-channels */ for(i = 8 * wasapi_devout->sub_block_count * old_pcm_channels; i < 8 * wasapi_devout->sub_block_count * pcm_channels; i++){ wasapi_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(wasapi_devout->sub_block_mutex[i]); } wasapi_devout->pcm_channels = pcm_channels; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_realloc_buffer(wasapi_devout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devout_mutex); if(format == wasapi_devout->format){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } wasapi_devout->format = format; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_realloc_buffer(wasapi_devout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devout_mutex); if(buffer_size == wasapi_devout->buffer_size){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } wasapi_devout->buffer_size = buffer_size; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_realloc_buffer(wasapi_devout); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(wasapi_devout_mutex); if(samplerate == wasapi_devout->samplerate){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } wasapi_devout->samplerate = samplerate; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_realloc_buffer(wasapi_devout); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->bpm = bpm; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->delay_factor = delay_factor; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wasapi_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(gobject); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_string(value, wasapi_devout->device); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_uint(value, wasapi_devout->dsp_channels); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_uint(value, wasapi_devout->pcm_channels); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_uint(value, wasapi_devout->format); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_uint(value, wasapi_devout->buffer_size); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_uint(value, wasapi_devout->samplerate); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_pointer(value, wasapi_devout->buffer); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_double(value, wasapi_devout->bpm); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_double(value, wasapi_devout->delay_factor); g_rec_mutex_unlock(wasapi_devout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(wasapi_devout_mutex); g_value_set_pointer(value, wasapi_devout->attack); g_rec_mutex_unlock(wasapi_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wasapi_devout_dispose(GObject *gobject) { AgsWasapiDevout *wasapi_devout; GList *list; wasapi_devout = AGS_WASAPI_DEVOUT(gobject); /* call parent */ G_OBJECT_CLASS(ags_wasapi_devout_parent_class)->dispose(gobject); } void ags_wasapi_devout_finalize(GObject *gobject) { AgsWasapiDevout *wasapi_devout; wasapi_devout = AGS_WASAPI_DEVOUT(gobject); /* free output buffer */ free(wasapi_devout->buffer[0]); free(wasapi_devout->buffer[1]); free(wasapi_devout->buffer[2]); free(wasapi_devout->buffer[3]); free(wasapi_devout->buffer[4]); free(wasapi_devout->buffer[5]); free(wasapi_devout->buffer[6]); free(wasapi_devout->buffer[7]); /* free buffer array */ free(wasapi_devout->buffer); /* free AgsAttack */ free(wasapi_devout->attack); /* call parent */ G_OBJECT_CLASS(ags_wasapi_devout_parent_class)->finalize(gobject); } AgsUUID* ags_wasapi_devout_get_uuid(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; AgsUUID *ptr; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(connectable); /* get wasapi devout signal mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get UUID */ g_rec_mutex_lock(wasapi_devout_mutex); ptr = wasapi_devout->uuid; g_rec_mutex_unlock(wasapi_devout_mutex); return(ptr); } gboolean ags_wasapi_devout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_wasapi_devout_is_ready(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; gboolean is_ready; wasapi_devout = AGS_WASAPI_DEVOUT(connectable); /* check is added */ is_ready = ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_wasapi_devout_add_to_registry(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; if(ags_connectable_is_ready(connectable)){ return; } wasapi_devout = AGS_WASAPI_DEVOUT(connectable); ags_wasapi_devout_set_flags(wasapi_devout, AGS_WASAPI_DEVOUT_ADDED_TO_REGISTRY); } void ags_wasapi_devout_remove_from_registry(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; if(!ags_connectable_is_ready(connectable)){ return; } wasapi_devout = AGS_WASAPI_DEVOUT(connectable); ags_wasapi_devout_unset_flags(wasapi_devout, AGS_WASAPI_DEVOUT_ADDED_TO_REGISTRY); } xmlNode* ags_wasapi_devout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_wasapi_devout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_wasapi_devout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_wasapi_devout_is_connected(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; gboolean is_connected; wasapi_devout = AGS_WASAPI_DEVOUT(connectable); /* check is connected */ is_connected = ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_CONNECTED); return(is_connected); } void ags_wasapi_devout_connect(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; if(ags_connectable_is_connected(connectable)){ return; } wasapi_devout = AGS_WASAPI_DEVOUT(connectable); ags_wasapi_devout_set_flags(wasapi_devout, AGS_WASAPI_DEVOUT_CONNECTED); } void ags_wasapi_devout_disconnect(AgsConnectable *connectable) { AgsWasapiDevout *wasapi_devout; if(!ags_connectable_is_connected(connectable)){ return; } wasapi_devout = AGS_WASAPI_DEVOUT(connectable); ags_wasapi_devout_unset_flags(wasapi_devout, AGS_WASAPI_DEVOUT_CONNECTED); } /** * ags_wasapi_devout_test_flags: * @wasapi_devout: the #AgsWasapiDevout * @flags: the flags * * Test @flags to be set on @wasapi_devout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_wasapi_devout_test_flags(AgsWasapiDevout *wasapi_devout, guint flags) { gboolean retval; GRecMutex *wasapi_devout_mutex; if(!AGS_IS_WASAPI_DEVOUT(wasapi_devout)){ return(FALSE); } /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* test */ g_rec_mutex_lock(wasapi_devout_mutex); retval = (flags & (wasapi_devout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(wasapi_devout_mutex); return(retval); } /** * ags_wasapi_devout_set_flags: * @wasapi_devout: the #AgsWasapiDevout * @flags: see #AgsWasapiDevoutFlags-enum * * Enable a feature of @wasapi_devout. * * Since: 3.0.0 */ void ags_wasapi_devout_set_flags(AgsWasapiDevout *wasapi_devout, guint flags) { GRecMutex *wasapi_devout_mutex; if(!AGS_IS_WASAPI_DEVOUT(wasapi_devout)){ return; } /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->flags |= flags; g_rec_mutex_unlock(wasapi_devout_mutex); } /** * ags_wasapi_devout_unset_flags: * @wasapi_devout: the #AgsWasapiDevout * @flags: see #AgsWasapiDevoutFlags-enum * * Disable a feature of @wasapi_devout. * * Since: 3.0.0 */ void ags_wasapi_devout_unset_flags(AgsWasapiDevout *wasapi_devout, guint flags) { GRecMutex *wasapi_devout_mutex; if(!AGS_IS_WASAPI_DEVOUT(wasapi_devout)){ return; } /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->flags &= (~flags); g_rec_mutex_unlock(wasapi_devout_mutex); } void ags_wasapi_devout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsWasapiDevout *wasapi_devout; GList *card_id, *card_id_start, *card_name, *card_name_start; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi_devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* list cards */ card_id = NULL; card_name = NULL; ags_soundcard_list_cards(soundcard, &card_id, &card_name); card_id_start = card_id; card_name_start = card_name; /* check card */ g_rec_mutex_lock(wasapi_devout_mutex); while(card_id != NULL){ if(!g_ascii_strncasecmp(card_id->data, device, strlen(card_id->data))){ wasapi_devout->device = g_strdup(device); break; } card_id = card_id->next; } g_rec_mutex_unlock(wasapi_devout_mutex); /* free card id and name */ g_list_free_full(card_id_start, g_free); g_list_free_full(card_name_start, g_free); } gchar* ags_wasapi_devout_get_device(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gchar *device; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); device = NULL; /* get device */ g_rec_mutex_lock(wasapi_devout_mutex); device = g_strdup(wasapi_devout->device); g_rec_mutex_unlock(wasapi_devout_mutex); return(device); } void ags_wasapi_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsWasapiDevout *wasapi_devout; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); g_object_set(wasapi_devout, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_wasapi_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get presets */ g_rec_mutex_lock(wasapi_devout_mutex); if(channels != NULL){ *channels = wasapi_devout->pcm_channels; } if(rate != NULL){ *rate = wasapi_devout->samplerate; } if(buffer_size != NULL){ *buffer_size = wasapi_devout->buffer_size; } if(format != NULL){ *format = wasapi_devout->format; } g_rec_mutex_unlock(wasapi_devout_mutex); } void ags_wasapi_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsWasapiDevout *wasapi_devout; AgsApplicationContext *application_context; #ifdef AGS_WITH_WASAPI IMMDeviceEnumerator *dev_enumerator; IMMDeviceCollection *dev_collection; UINT i, i_stop; #endif wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } #ifdef AGS_WITH_WASAPI CoInitialize(0); CoCreateInstance(&ags_wasapi_clsid_mm_device_enumerator_guid, 0, CLSCTX_ALL, &ags_wasapi_iid_mm_device_enumerator_guid, &dev_enumerator); dev_enumerator->lpVtbl->EnumAudioEndpoints(dev_enumerator, eRender, DEVICE_STATE_ACTIVE, &dev_collection); dev_collection->lpVtbl->GetCount(dev_collection, &i_stop); for(i = 0; i < i_stop; i++){ IMMDevice *device; IPropertyStore *prop_store; LPWSTR dev_id = NULL; PROPVARIANT var_name; gchar *str; dev_collection->lpVtbl->Item(dev_collection, i, &device); device->lpVtbl->GetId(device, &dev_id); device->lpVtbl->OpenPropertyStore(device, STGM_READ, &prop_store); PropVariantInit(&var_name); prop_store->lpVtbl->GetValue(prop_store, &ags_wasapi_pkey_device_friendly_name_key, &var_name); g_message("%S %S", dev_id, var_name.pwszVal); if(card_id != NULL){ str = g_strdup_printf("%S", dev_id); *card_id = g_list_prepend(*card_id, str); } if(card_name != NULL){ str = g_strdup_printf("%S", var_name.pwszVal); *card_name = g_list_prepend(*card_name, str); } CoTaskMemFree(dev_id); PropVariantClear(&var_name); prop_store->lpVtbl->Release(prop_store); device->lpVtbl->Release(device); } dev_collection->lpVtbl->Release(dev_collection); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); #endif if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_wasapi_devout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_wasapi_devout_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_PLAYBACK); } gboolean ags_wasapi_devout_is_starting(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gboolean is_starting; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* check is starting */ g_rec_mutex_lock(wasapi_devout_mutex); is_starting = ((AGS_WASAPI_DEVOUT_START_PLAY & (wasapi_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(wasapi_devout_mutex); return(is_starting); } gboolean ags_wasapi_devout_is_playing(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gboolean is_playing; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* check is starting */ g_rec_mutex_lock(wasapi_devout_mutex); is_playing = ((AGS_WASAPI_DEVOUT_PLAY & (wasapi_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(wasapi_devout_mutex); return(is_playing); } gchar* ags_wasapi_devout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_wasapi_devout_client_init(AgsSoundcard *soundcard, GError **error) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; if(ags_soundcard_is_playing(soundcard)){ return; } wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->tact_counter = 0.0; wasapi_devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(wasapi_devout))); wasapi_devout->tic_counter = 0; #ifdef AGS_WITH_WASAPI wasapi_devout->flags |= AGS_WASAPI_DEVOUT_INITIALIZED; #endif wasapi_devout->flags |= (AGS_WASAPI_DEVOUT_BUFFER0 | AGS_WASAPI_DEVOUT_START_PLAY | AGS_WASAPI_DEVOUT_PLAY | AGS_WASAPI_DEVOUT_NONBLOCKING); wasapi_devout->flags &= (~(AGS_WASAPI_DEVOUT_BUFFER1 | AGS_WASAPI_DEVOUT_BUFFER2 | AGS_WASAPI_DEVOUT_BUFFER3 | AGS_WASAPI_DEVOUT_BUFFER4 | AGS_WASAPI_DEVOUT_BUFFER5 | AGS_WASAPI_DEVOUT_BUFFER6 | AGS_WASAPI_DEVOUT_BUFFER7)); g_rec_mutex_unlock(wasapi_devout_mutex); } void ags_wasapi_devout_client_play(AgsSoundcard *soundcard, GError **error) { AgsWasapiDevout *wasapi_devout; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; GList *list; gchar *str; #ifdef AGS_WITH_WASAPI IAudioClient *audio_client; IAudioRenderClient *audio_render_client; BYTE *data; UINT32 buffer_frame_count; UINT32 num_frames_available; #endif guint word_size; guint nth_buffer; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* lock */ g_rec_mutex_lock(wasapi_devout_mutex); /* retrieve word size */ switch(wasapi_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(wasapi_devout_mutex); g_warning("ags_wasapi_devout_alsa_play(): unsupported word size"); return; } /* do playback */ #ifdef AGS_WITH_WASAPI if((AGS_WASAPI_DEVOUT_START_PLAY & (wasapi_devout->flags)) != 0){ IMMDeviceEnumerator *dev_enumerator; IMMDevice *mm_device; WAVEFORMATEXTENSIBLE wave_format; WAVEFORMATEX *desired_format, *internal_format; wchar_t dev_id[1024]; REFERENCE_TIME min_duration; register HRESULT hr; unsigned char bit_resolution; g_message("WASAPI initialize"); CoInitialize(0); if(CoCreateInstance(&ags_wasapi_clsid_mm_device_enumerator_guid, 0, CLSCTX_ALL, &ags_wasapi_iid_mm_device_enumerator_guid, (void **) &dev_enumerator)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVOUT_ERROR, AGS_WASAPI_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IMMDeviceEnumerator."); } CoUninitialize(); g_rec_mutex_unlock(wasapi_devout_mutex); g_message("WASAPI failed - device enumerator"); wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); return; } if(wasapi_devout->device != NULL){ memset(dev_id, 0, 1024 * sizeof(WCHAR)); swprintf(dev_id, 1024, L"%S", wasapi_devout->device); if(dev_enumerator->lpVtbl->GetDevice(dev_enumerator, dev_id, &mm_device)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVOUT_ERROR, AGS_WASAPI_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IAudioClient."); } dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); g_rec_mutex_unlock(wasapi_devout_mutex); g_message("WASAPI failed - get device"); return; } }else{ if(dev_enumerator->lpVtbl->GetDefaultAudioEndpoint(dev_enumerator, eRender, eMultimedia, &mm_device)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVOUT_ERROR, AGS_WASAPI_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IAudioClient."); } dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); g_rec_mutex_unlock(wasapi_devout_mutex); g_message("WASAPI failed - get device"); return; } } wasapi_devout->mm_device = mm_device; // Get its IAudioClient (used to set audio format, latency, and start/stop) if(mm_device->lpVtbl->Activate(mm_device, &ags_wasapi_iid_audio_client_guid, CLSCTX_ALL, 0, (void **) &audio_client)){ if(error != NULL){ g_set_error(error, AGS_WASAPI_DEVOUT_ERROR, AGS_WASAPI_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: Can't get IAudioClient."); } mm_device->lpVtbl->Release(mm_device); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); g_rec_mutex_unlock(wasapi_devout_mutex); g_message("WASAPI failed - get audio client"); return; } wasapi_devout->audio_client = audio_client; if((AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE & (wasapi_devout->flags)) != 0){ wave_format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wave_format.Format.nSamplesPerSec = wasapi_devout->samplerate; // necessary wave_format.Format.nChannels = wasapi_devout->pcm_channels; // presumed bit_resolution = 16; switch(wasapi_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { bit_resolution = 16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { bit_resolution = 24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { bit_resolution = 32; } break; } if(bit_resolution == 24){ wave_format.Format.wBitsPerSample = 32; wave_format.Format.nBlockAlign = 2 * (32 / 8); wave_format.Samples.wValidBitsPerSample = 24; }else{ wave_format.Format.wBitsPerSample = wave_format.Samples.wValidBitsPerSample = bit_resolution; wave_format.Format.nBlockAlign = 2 * (bit_resolution / 8); } wave_format.Format.nBlockAlign = wave_format.Format.nChannels * wave_format.Format.wBitsPerSample / 8; wave_format.Format.nAvgBytesPerSec = wave_format.Format.nSamplesPerSec * wave_format.Format.nBlockAlign; wave_format.Format.cbSize = 22; wave_format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; wave_format.SubFormat = ags_wasapi_pcm_subformat_guid; if((hr = audio_client->lpVtbl->GetMixFormat(audio_client, &internal_format))){ g_message("get mix format"); } desired_format = &(wave_format.Format); desired_format->wFormatTag = 0xFFFE; desired_format->cbSize = 22; if((hr = audio_client->lpVtbl->IsFormatSupported(audio_client, AUDCLNT_SHAREMODE_EXCLUSIVE, desired_format, NULL))){ ags_wasapi_devout_client_init_EXCLUSIVE_BROKEN_CONFIGURATION: mm_device->lpVtbl->Release(mm_device); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); g_rec_mutex_unlock(wasapi_devout_mutex); g_message("WASAPI failed - broken configuration"); return; } audio_client->lpVtbl->GetDevicePeriod(audio_client, NULL, &min_duration); min_duration = (AGS_NSEC_PER_SEC / 100) / wasapi_devout->samplerate * wasapi_devout->wasapi_buffer_size; if((hr = audio_client->lpVtbl->Initialize(audio_client, AUDCLNT_SHAREMODE_EXCLUSIVE, 0, min_duration, min_duration, desired_format, NULL))){ audio_client->lpVtbl->Release(audio_client); goto ags_wasapi_devout_client_init_EXCLUSIVE_BROKEN_CONFIGURATION; } }else{ wave_format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; wave_format.Format.nSamplesPerSec = wasapi_devout->samplerate; // necessary wave_format.Format.nChannels = wasapi_devout->pcm_channels; // presumed bit_resolution = 16; switch(wasapi_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { bit_resolution = 16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { bit_resolution = 24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { bit_resolution = 32; } break; } if(bit_resolution == 24){ wave_format.Format.wBitsPerSample = 32; wave_format.Format.nBlockAlign = 2 * (32 / 8); wave_format.Samples.wValidBitsPerSample = 24; }else{ wave_format.Format.wBitsPerSample = wave_format.Samples.wValidBitsPerSample = bit_resolution; wave_format.Format.nBlockAlign = 2 * (bit_resolution / 8); } wave_format.Format.nBlockAlign = wave_format.Format.nChannels * wave_format.Format.wBitsPerSample / 8; wave_format.Format.nAvgBytesPerSec = wave_format.Format.nSamplesPerSec * wave_format.Format.nBlockAlign; wave_format.Format.cbSize = 22; wave_format.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; wave_format.SubFormat = ags_wasapi_pcm_subformat_guid; if((hr = audio_client->lpVtbl->GetMixFormat(audio_client, &internal_format))){ g_message("get mix format"); ags_wasapi_devout_client_init_SHARED_BROKEN_CONFIGURATION: mm_device->lpVtbl->Release(mm_device); dev_enumerator->lpVtbl->Release(dev_enumerator); CoUninitialize(); wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); g_rec_mutex_unlock(wasapi_devout_mutex); g_message("WASAPI failed - broken configuration"); return; } desired_format = internal_format; if((hr = audio_client->lpVtbl->IsFormatSupported(audio_client, AUDCLNT_SHAREMODE_SHARED, desired_format, &desired_format))){ goto ags_wasapi_devout_client_init_SHARED_BROKEN_CONFIGURATION; } desired_format = internal_format; audio_client->lpVtbl->GetDevicePeriod(audio_client, NULL, &min_duration); min_duration = (AGS_NSEC_PER_SEC / 100) / wasapi_devout->samplerate * wasapi_devout->wasapi_buffer_size; if((hr = audio_client->lpVtbl->Initialize(audio_client, AUDCLNT_SHAREMODE_SHARED, 0, min_duration, 0, desired_format, NULL))){ audio_client->lpVtbl->Release(audio_client); goto ags_wasapi_devout_client_init_SHARED_BROKEN_CONFIGURATION; } } // Start audio playback audio_client->lpVtbl->Start(audio_client); } audio_client = wasapi_devout->audio_client; #endif wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_START_PLAY); if((AGS_WASAPI_DEVOUT_INITIALIZED & (wasapi_devout->flags)) == 0){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } // g_message("play - 0x%0x", ((AGS_WASAPI_DEVOUT_BUFFER0 | // AGS_WASAPI_DEVOUT_BUFFER1 | // AGS_WASAPI_DEVOUT_BUFFER2 | // AGS_WASAPI_DEVOUT_BUFFER3) & (wasapi_devout->flags))); if((AGS_WASAPI_DEVOUT_SHUTDOWN & (wasapi_devout->flags)) == 0){ /* check buffer flag */ nth_buffer = 0; if((AGS_WASAPI_DEVOUT_BUFFER0 & (wasapi_devout->flags)) != 0){ nth_buffer = 0; }else if((AGS_WASAPI_DEVOUT_BUFFER1 & (wasapi_devout->flags)) != 0){ nth_buffer = 1; }else if((AGS_WASAPI_DEVOUT_BUFFER2 & (wasapi_devout->flags)) != 0){ nth_buffer = 2; }else if((AGS_WASAPI_DEVOUT_BUFFER3 & (wasapi_devout->flags)) != 0){ nth_buffer = 3; }else if((AGS_WASAPI_DEVOUT_BUFFER4 & (wasapi_devout->flags)) != 0){ nth_buffer = 4; }else if((AGS_WASAPI_DEVOUT_BUFFER5 & (wasapi_devout->flags)) != 0){ nth_buffer = 5; }else if((AGS_WASAPI_DEVOUT_BUFFER6 & (wasapi_devout->flags)) != 0){ nth_buffer = 6; }else if((AGS_WASAPI_DEVOUT_BUFFER7 & (wasapi_devout->flags)) != 0){ nth_buffer = 7; } #ifdef AGS_WITH_WASAPI audio_client->lpVtbl->GetBufferSize(audio_client, &buffer_frame_count); { HRESULT res; res = audio_client->lpVtbl->GetService(audio_client, &ags_wasapi_iid_audio_render_client_guid, (void **) &audio_render_client); switch(res){ case E_POINTER: { g_message("pointer"); } break; case E_NOINTERFACE: { g_message("no interface"); } break; case AUDCLNT_E_NOT_INITIALIZED: { g_message("not initialized"); } break; case AUDCLNT_E_WRONG_ENDPOINT_TYPE: { g_message("wrong endpoint"); } break; case AUDCLNT_E_DEVICE_INVALIDATED: { g_message("device invalidated"); } break; case AUDCLNT_E_SERVICE_NOT_RUNNING: { g_message("no service"); } break; } } if(audio_render_client == NULL){ g_rec_mutex_unlock(wasapi_devout_mutex); g_message("audio_render_client = NULL"); return; } { UINT32 padding_frames; static const struct timespec poll_delay = { 0, 400, }; audio_client->lpVtbl->GetCurrentPadding(audio_client, &padding_frames); while(buffer_frame_count - padding_frames < wasapi_devout->buffer_size && padding_frames != 0){ nanosleep(&poll_delay, NULL); audio_client->lpVtbl->GetCurrentPadding(audio_client, &padding_frames); } } { HRESULT res; res = audio_render_client->lpVtbl->GetBuffer(audio_render_client, wasapi_devout->buffer_size, &data); switch(res){ case AUDCLNT_E_BUFFER_ERROR: { g_message("buffer error"); } break; case AUDCLNT_E_BUFFER_TOO_LARGE: { g_message("buffer too large"); } break; case AUDCLNT_E_BUFFER_SIZE_ERROR: { g_message("buffer size error"); } break; case AUDCLNT_E_OUT_OF_ORDER: { g_message("out of order"); } break; case AUDCLNT_E_DEVICE_INVALIDATED: { g_message("invalidated"); } break; case AUDCLNT_E_BUFFER_OPERATION_PENDING: { g_message("operation pending"); } break; case AUDCLNT_E_SERVICE_NOT_RUNNING: { g_message("no service"); } break; case E_POINTER: { g_message("pointer"); } break; } } /* retrieve word size */ if(data != NULL){ ags_soundcard_lock_buffer(soundcard, wasapi_devout->buffer[nth_buffer]); switch(wasapi_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { memset(data, 0, wasapi_devout->pcm_channels * wasapi_devout->buffer_size * sizeof(gint16)); ags_audio_buffer_util_copy_s16_to_s16((gint16 *) data, 1, (gint16 *) wasapi_devout->buffer[nth_buffer], 1, wasapi_devout->pcm_channels * wasapi_devout->buffer_size); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { memset(data, 0, wasapi_devout->pcm_channels * wasapi_devout->buffer_size * sizeof(gint32)); ags_audio_buffer_util_copy_s24_to_s24((gint32 *) data, 1, (gint32 *) wasapi_devout->buffer[nth_buffer], 1, wasapi_devout->pcm_channels * wasapi_devout->buffer_size); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { memset(data, 0, wasapi_devout->pcm_channels * wasapi_devout->buffer_size * sizeof(gint32)); ags_audio_buffer_util_copy_s32_to_s32((gint32 *) data, 1, (gint32 *) wasapi_devout->buffer[nth_buffer], 1, wasapi_devout->pcm_channels * wasapi_devout->buffer_size); } break; } ags_soundcard_unlock_buffer(soundcard, wasapi_devout->buffer[nth_buffer]); }else{ g_message("data = NULL"); } audio_render_client->lpVtbl->ReleaseBuffer(audio_render_client, wasapi_devout->buffer_size, 0); audio_render_client->lpVtbl->Release(audio_render_client); #endif } if((AGS_WASAPI_DEVOUT_SHUTDOWN & (wasapi_devout->flags)) != 0){ AgsThread *audio_loop; AgsThread *soundcard_thread; AgsApplicationContext *application_context; #ifdef AGS_WITH_WASAPI IMMDevice *mm_device; HRESULT hr; g_message("wasapi shutdown"); audio_client = wasapi_devout->audio_client; audio_client->lpVtbl->GetService(audio_client, &ags_wasapi_iid_audio_render_client_guid, (void **) &audio_render_client); mm_device = wasapi_devout->mm_device; hr = audio_client->lpVtbl->Stop(audio_client); if(FAILED(hr)){ g_message("failed to stop WASAPI"); } audio_client->lpVtbl->Reset(audio_client); if(audio_render_client != NULL){ audio_render_client->lpVtbl->Release(audio_render_client); } audio_client->lpVtbl->Release(audio_client); mm_device->lpVtbl->Release(mm_device); wasapi_devout->audio_client = NULL; wasapi_devout->mm_device = NULL; CoUninitialize(); #endif application_context = ags_application_context_get_instance(); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); soundcard_thread = ags_soundcard_thread_find_soundcard(soundcard_thread, AGS_WASAPI_DEVOUT(soundcard)); ags_thread_stop(soundcard_thread); g_object_unref(soundcard_thread); } g_rec_mutex_unlock(wasapi_devout_mutex); if((AGS_WASAPI_DEVOUT_SHUTDOWN & (wasapi_devout->flags)) == 0){ /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) wasapi_devout); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) wasapi_devout); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) wasapi_devout); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } } void ags_wasapi_devout_client_free(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint i; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* lock */ g_rec_mutex_lock(wasapi_devout_mutex); if((AGS_WASAPI_DEVOUT_INITIALIZED & (wasapi_devout->flags)) == 0){ g_rec_mutex_unlock(wasapi_devout_mutex); return; } wasapi_devout->flags |= (AGS_WASAPI_DEVOUT_SHUTDOWN); g_rec_mutex_unlock(wasapi_devout_mutex); g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->note_offset = wasapi_devout->start_note_offset; wasapi_devout->note_offset_absolute = wasapi_devout->start_note_offset; g_rec_mutex_unlock(wasapi_devout_mutex); } void ags_wasapi_devout_tic(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* determine if attack should be switched */ g_rec_mutex_lock(wasapi_devout_mutex); delay = wasapi_devout->delay[wasapi_devout->tic_counter]; delay_counter = wasapi_devout->delay_counter; note_offset = wasapi_devout->note_offset; note_offset_absolute = wasapi_devout->note_offset_absolute; loop_left = wasapi_devout->loop_left; loop_right = wasapi_devout->loop_right; do_loop = wasapi_devout->do_loop; g_rec_mutex_unlock(wasapi_devout_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->delay_counter = delay_counter + 1.0 - delay; wasapi_devout->tact_counter += 1.0; g_rec_mutex_unlock(wasapi_devout_mutex); }else{ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->delay_counter += 1.0; g_rec_mutex_unlock(wasapi_devout_mutex); } } void ags_wasapi_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* offset changed */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->tic_counter += 1; if(wasapi_devout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ wasapi_devout->tic_counter = 0; } g_rec_mutex_unlock(wasapi_devout_mutex); } void ags_wasapi_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set bpm */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->bpm = bpm; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); } gdouble ags_wasapi_devout_get_bpm(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gdouble bpm; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get bpm */ g_rec_mutex_lock(wasapi_devout_mutex); bpm = wasapi_devout->bpm; g_rec_mutex_unlock(wasapi_devout_mutex); return(bpm); } void ags_wasapi_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set delay factor */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->delay_factor = delay_factor; g_rec_mutex_unlock(wasapi_devout_mutex); ags_wasapi_devout_adjust_delay_and_attack(wasapi_devout); } gdouble ags_wasapi_devout_get_delay_factor(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gdouble delay_factor; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get delay factor */ g_rec_mutex_lock(wasapi_devout_mutex); delay_factor = wasapi_devout->delay_factor; g_rec_mutex_unlock(wasapi_devout_mutex); return(delay_factor); } gdouble ags_wasapi_devout_get_delay(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint delay_index; gdouble delay; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get delay */ g_rec_mutex_lock(wasapi_devout_mutex); delay_index = wasapi_devout->tic_counter; delay = wasapi_devout->delay[delay_index]; g_rec_mutex_unlock(wasapi_devout_mutex); return(delay); } gdouble ags_wasapi_devout_get_absolute_delay(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; gdouble absolute_delay; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get absolute delay */ g_rec_mutex_lock(wasapi_devout_mutex); absolute_delay = (60.0 * (((gdouble) wasapi_devout->samplerate / (gdouble) wasapi_devout->buffer_size) / (gdouble) wasapi_devout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) wasapi_devout->delay_factor))); g_rec_mutex_unlock(wasapi_devout_mutex); return(absolute_delay); } guint ags_wasapi_devout_get_attack(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint attack_index; guint attack; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get attack */ g_rec_mutex_lock(wasapi_devout_mutex); attack_index = wasapi_devout->tic_counter; attack = wasapi_devout->attack[attack_index]; g_rec_mutex_unlock(wasapi_devout_mutex); return(attack); } void* ags_wasapi_devout_get_buffer(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; void *buffer; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER0)){ buffer = wasapi_devout->buffer[0]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER1)){ buffer = wasapi_devout->buffer[1]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER2)){ buffer = wasapi_devout->buffer[2]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER3)){ buffer = wasapi_devout->buffer[3]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER4)){ buffer = wasapi_devout->buffer[4]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER5)){ buffer = wasapi_devout->buffer[5]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER6)){ buffer = wasapi_devout->buffer[6]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER7)){ buffer = wasapi_devout->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_wasapi_devout_get_next_buffer(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; void *buffer; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); g_rec_mutex_lock(wasapi_devout_mutex); if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER0)){ buffer = wasapi_devout->buffer[1]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER1)){ buffer = wasapi_devout->buffer[2]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER2)){ buffer = wasapi_devout->buffer[3]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER3)){ buffer = wasapi_devout->buffer[4]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER4)){ buffer = wasapi_devout->buffer[5]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER5)){ buffer = wasapi_devout->buffer[6]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER6)){ buffer = wasapi_devout->buffer[7]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER7)){ buffer = wasapi_devout->buffer[0]; }else{ buffer = NULL; } g_rec_mutex_unlock(wasapi_devout_mutex); return(buffer); } void* ags_wasapi_devout_get_prev_buffer(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; void *buffer; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); g_rec_mutex_lock(wasapi_devout_mutex); if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER0)){ buffer = wasapi_devout->buffer[7]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER1)){ buffer = wasapi_devout->buffer[0]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER2)){ buffer = wasapi_devout->buffer[1]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER3)){ buffer = wasapi_devout->buffer[2]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER4)){ buffer = wasapi_devout->buffer[3]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER5)){ buffer = wasapi_devout->buffer[4]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER6)){ buffer = wasapi_devout->buffer[5]; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER7)){ buffer = wasapi_devout->buffer[6]; }else{ buffer = NULL; } g_rec_mutex_unlock(wasapi_devout_mutex); return(buffer); } void ags_wasapi_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsWasapiDevout *wasapi_devout; GRecMutex *buffer_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); buffer_mutex = NULL; if(wasapi_devout->buffer != NULL){ if(buffer == wasapi_devout->buffer[0]){ buffer_mutex = wasapi_devout->buffer_mutex[0]; }else if(buffer == wasapi_devout->buffer[1]){ buffer_mutex = wasapi_devout->buffer_mutex[1]; }else if(buffer == wasapi_devout->buffer[2]){ buffer_mutex = wasapi_devout->buffer_mutex[2]; }else if(buffer == wasapi_devout->buffer[3]){ buffer_mutex = wasapi_devout->buffer_mutex[3]; }else if(buffer == wasapi_devout->buffer[4]){ buffer_mutex = wasapi_devout->buffer_mutex[4]; }else if(buffer == wasapi_devout->buffer[5]){ buffer_mutex = wasapi_devout->buffer_mutex[5]; }else if(buffer == wasapi_devout->buffer[6]){ buffer_mutex = wasapi_devout->buffer_mutex[6]; }else if(buffer == wasapi_devout->buffer[7]){ buffer_mutex = wasapi_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_wasapi_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsWasapiDevout *wasapi_devout; GRecMutex *buffer_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); buffer_mutex = NULL; if(wasapi_devout->buffer != NULL){ if(buffer == wasapi_devout->buffer[0]){ buffer_mutex = wasapi_devout->buffer_mutex[0]; }else if(buffer == wasapi_devout->buffer[1]){ buffer_mutex = wasapi_devout->buffer_mutex[1]; }else if(buffer == wasapi_devout->buffer[2]){ buffer_mutex = wasapi_devout->buffer_mutex[2]; }else if(buffer == wasapi_devout->buffer[3]){ buffer_mutex = wasapi_devout->buffer_mutex[3]; }else if(buffer == wasapi_devout->buffer[4]){ buffer_mutex = wasapi_devout->buffer_mutex[4]; }else if(buffer == wasapi_devout->buffer[5]){ buffer_mutex = wasapi_devout->buffer_mutex[5]; }else if(buffer == wasapi_devout->buffer[6]){ buffer_mutex = wasapi_devout->buffer_mutex[6]; }else if(buffer == wasapi_devout->buffer[7]){ buffer_mutex = wasapi_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_wasapi_devout_get_delay_counter(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint delay_counter; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* delay counter */ g_rec_mutex_lock(wasapi_devout_mutex); delay_counter = wasapi_devout->delay_counter; g_rec_mutex_unlock(wasapi_devout_mutex); return(delay_counter); } void ags_wasapi_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set note offset */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->start_note_offset = start_note_offset; g_rec_mutex_unlock(wasapi_devout_mutex); } guint ags_wasapi_devout_get_start_note_offset(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint start_note_offset; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set note offset */ g_rec_mutex_lock(wasapi_devout_mutex); start_note_offset = wasapi_devout->start_note_offset; g_rec_mutex_unlock(wasapi_devout_mutex); return(start_note_offset); } void ags_wasapi_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set note offset */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->note_offset = note_offset; g_rec_mutex_unlock(wasapi_devout_mutex); } guint ags_wasapi_devout_get_note_offset(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint note_offset; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set note offset */ g_rec_mutex_lock(wasapi_devout_mutex); note_offset = wasapi_devout->note_offset; g_rec_mutex_unlock(wasapi_devout_mutex); return(note_offset); } void ags_wasapi_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set note offset */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(wasapi_devout_mutex); } guint ags_wasapi_devout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint note_offset_absolute; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set note offset */ g_rec_mutex_lock(wasapi_devout_mutex); note_offset_absolute = wasapi_devout->note_offset_absolute; g_rec_mutex_unlock(wasapi_devout_mutex); return(note_offset_absolute); } void ags_wasapi_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* set loop */ g_rec_mutex_lock(wasapi_devout_mutex); wasapi_devout->loop_left = loop_left; wasapi_devout->loop_right = loop_right; wasapi_devout->do_loop = do_loop; if(do_loop){ wasapi_devout->loop_offset = wasapi_devout->note_offset; } g_rec_mutex_unlock(wasapi_devout_mutex); } void ags_wasapi_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsWasapiDevout *wasapi_devout; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get loop */ g_rec_mutex_lock(wasapi_devout_mutex); if(loop_left != NULL){ *loop_left = wasapi_devout->loop_left; } if(loop_right != NULL){ *loop_right = wasapi_devout->loop_right; } if(do_loop != NULL){ *do_loop = wasapi_devout->do_loop; } g_rec_mutex_unlock(wasapi_devout_mutex); } guint ags_wasapi_devout_get_loop_offset(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint loop_offset; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get loop offset */ g_rec_mutex_lock(wasapi_devout_mutex); loop_offset = wasapi_devout->loop_offset; g_rec_mutex_unlock(wasapi_devout_mutex); return(loop_offset); } guint ags_wasapi_devout_get_sub_block_count(AgsSoundcard *soundcard) { AgsWasapiDevout *wasapi_devout; guint sub_block_count; GRecMutex *wasapi_devout_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get loop offset */ g_rec_mutex_lock(wasapi_devout_mutex); sub_block_count = wasapi_devout->sub_block_count; g_rec_mutex_unlock(wasapi_devout_mutex); return(sub_block_count); } gboolean ags_wasapi_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsWasapiDevout *wasapi_devout; guint pcm_channels; guint sub_block_count; gboolean success; GRecMutex *wasapi_devout_mutex; GRecMutex *sub_block_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get loop offset */ g_rec_mutex_lock(wasapi_devout_mutex); pcm_channels = wasapi_devout->pcm_channels; sub_block_count = wasapi_devout->sub_block_count; g_rec_mutex_unlock(wasapi_devout_mutex); sub_block_mutex = NULL; success = FALSE; if(wasapi_devout->buffer != NULL){ if(buffer == wasapi_devout->buffer[0]){ sub_block_mutex = wasapi_devout->sub_block_mutex[sub_block]; }else if(buffer == wasapi_devout->buffer[1]){ sub_block_mutex = wasapi_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[2]){ sub_block_mutex = wasapi_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[3]){ sub_block_mutex = wasapi_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[4]){ sub_block_mutex = wasapi_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[5]){ sub_block_mutex = wasapi_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[6]){ sub_block_mutex = wasapi_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[7]){ sub_block_mutex = wasapi_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ if(g_rec_mutex_trylock(sub_block_mutex) == 0){ success = TRUE; } } return(success); } void ags_wasapi_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsWasapiDevout *wasapi_devout; guint pcm_channels; guint sub_block_count; GRecMutex *wasapi_devout_mutex; GRecMutex *sub_block_mutex; wasapi_devout = AGS_WASAPI_DEVOUT(soundcard); /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get loop offset */ g_rec_mutex_lock(wasapi_devout_mutex); pcm_channels = wasapi_devout->pcm_channels; sub_block_count = wasapi_devout->sub_block_count; g_rec_mutex_unlock(wasapi_devout_mutex); sub_block_mutex = NULL; if(wasapi_devout->buffer != NULL){ if(buffer == wasapi_devout->buffer[0]){ sub_block_mutex = wasapi_devout->sub_block_mutex[sub_block]; }else if(buffer == wasapi_devout->buffer[1]){ sub_block_mutex = wasapi_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[2]){ sub_block_mutex = wasapi_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[3]){ sub_block_mutex = wasapi_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[4]){ sub_block_mutex = wasapi_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[5]){ sub_block_mutex = wasapi_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[6]){ sub_block_mutex = wasapi_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == wasapi_devout->buffer[7]){ sub_block_mutex = wasapi_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ g_rec_mutex_unlock(sub_block_mutex); } } /** * ags_wasapi_devout_switch_buffer_flag: * @wasapi_devout: an #AgsWasapiDevout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_wasapi_devout_switch_buffer_flag(AgsWasapiDevout *wasapi_devout) { GRecMutex *wasapi_devout_mutex; if(!AGS_IS_WASAPI_DEVOUT(wasapi_devout)){ return; } /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* switch buffer flag */ g_rec_mutex_lock(wasapi_devout_mutex); if((AGS_WASAPI_DEVOUT_BUFFER0 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER0); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER1; }else if((AGS_WASAPI_DEVOUT_BUFFER1 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER1); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER2; }else if((AGS_WASAPI_DEVOUT_BUFFER2 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER2); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER3; }else if((AGS_WASAPI_DEVOUT_BUFFER3 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER3); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER4; }else if((AGS_WASAPI_DEVOUT_BUFFER4 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER4); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER5; }else if((AGS_WASAPI_DEVOUT_BUFFER5 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER5); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER6; }else if((AGS_WASAPI_DEVOUT_BUFFER6 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER6); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER7; }else if((AGS_WASAPI_DEVOUT_BUFFER7 & (wasapi_devout->flags)) != 0){ wasapi_devout->flags &= (~AGS_WASAPI_DEVOUT_BUFFER7); wasapi_devout->flags |= AGS_WASAPI_DEVOUT_BUFFER0; } g_rec_mutex_unlock(wasapi_devout_mutex); } /** * ags_wasapi_devout_adjust_delay_and_attack: * @wasapi_devout: the #AgsWasapiDevout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_wasapi_devout_adjust_delay_and_attack(AgsWasapiDevout *wasapi_devout) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *wasapi_devout_mutex; if(!AGS_IS_WASAPI_DEVOUT(wasapi_devout)){ return; } /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get some initial values */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(wasapi_devout)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(wasapi_devout_mutex); default_tact_frames = (guint) (delay * wasapi_devout->buffer_size); delay_tact_frames = (guint) (floor(delay) * wasapi_devout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; wasapi_devout->attack[0] = (guint) floor(0.25 * wasapi_devout->buffer_size); next_attack = (((wasapi_devout->attack[i] + default_tact_frames) / wasapi_devout->buffer_size) - delay) * wasapi_devout->buffer_size; if(next_attack < 0){ next_attack = 0; } if(next_attack >= wasapi_devout->buffer_size){ next_attack = wasapi_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ wasapi_devout->attack[i] = wasapi_devout->attack[i] - ((gdouble) next_attack / 2.0); if(wasapi_devout->attack[i] < 0){ wasapi_devout->attack[i] = 0; } if(wasapi_devout->attack[i] >= wasapi_devout->buffer_size){ wasapi_devout->attack[i] = wasapi_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= wasapi_devout->buffer_size){ next_attack = wasapi_devout->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ wasapi_devout->attack[i] = next_attack; next_attack = (((wasapi_devout->attack[i] + default_tact_frames) / wasapi_devout->buffer_size) - delay) * wasapi_devout->buffer_size; if(next_attack >= wasapi_devout->buffer_size){ next_attack = wasapi_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ wasapi_devout->attack[i] = wasapi_devout->attack[i] - ((gdouble) next_attack / 2.0); if(wasapi_devout->attack[i] < 0){ wasapi_devout->attack[i] = 0; } if(wasapi_devout->attack[i] >= wasapi_devout->buffer_size){ wasapi_devout->attack[i] = wasapi_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= wasapi_devout->buffer_size){ next_attack = wasapi_devout->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", wasapi_devout->attack[i]); #endif } wasapi_devout->attack[0] = wasapi_devout->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ wasapi_devout->delay[i] = ((gdouble) (default_tact_frames + wasapi_devout->attack[i] - wasapi_devout->attack[i + 1])) / (gdouble) wasapi_devout->buffer_size; #ifdef AGS_DEBUG g_message("%f", wasapi_devout->delay[i]); #endif } wasapi_devout->delay[i] = ((gdouble) (default_tact_frames + wasapi_devout->attack[i] - wasapi_devout->attack[0])) / (gdouble) wasapi_devout->buffer_size; g_rec_mutex_unlock(wasapi_devout_mutex); } /** * ags_wasapi_devout_realloc_buffer: * @wasapi_devout: the #AgsWasapiDevout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_wasapi_devout_realloc_buffer(AgsWasapiDevout *wasapi_devout) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *wasapi_devout_mutex; if(!AGS_IS_WASAPI_DEVOUT(wasapi_devout)){ return; } /* get wasapi devout mutex */ wasapi_devout_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(wasapi_devout); /* get word size */ g_rec_mutex_lock(wasapi_devout_mutex); pcm_channels = wasapi_devout->pcm_channels; buffer_size = wasapi_devout->buffer_size; format = wasapi_devout->format; g_rec_mutex_unlock(wasapi_devout_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_wasapi_devout_realloc_buffer(): unsupported word size"); return; } /* AGS_WASAPI_DEVOUT_BUFFER_0 */ if(wasapi_devout->buffer[0] != NULL){ free(wasapi_devout->buffer[0]); } wasapi_devout->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_1 */ if(wasapi_devout->buffer[1] != NULL){ free(wasapi_devout->buffer[1]); } wasapi_devout->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_2 */ if(wasapi_devout->buffer[2] != NULL){ free(wasapi_devout->buffer[2]); } wasapi_devout->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_3 */ if(wasapi_devout->buffer[3] != NULL){ free(wasapi_devout->buffer[3]); } wasapi_devout->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_4 */ if(wasapi_devout->buffer[4] != NULL){ free(wasapi_devout->buffer[4]); } wasapi_devout->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_5 */ if(wasapi_devout->buffer[5] != NULL){ free(wasapi_devout->buffer[5]); } wasapi_devout->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_6 */ if(wasapi_devout->buffer[6] != NULL){ free(wasapi_devout->buffer[6]); } wasapi_devout->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_WASAPI_DEVOUT_BUFFER_7 */ if(wasapi_devout->buffer[7] != NULL){ free(wasapi_devout->buffer[7]); } wasapi_devout->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_wasapi_devout_new: * * Creates a new instance of #AgsWasapiDevout. * * Returns: a new #AgsWasapiDevout * * Since: 3.0.0 */ AgsWasapiDevout* ags_wasapi_devout_new() { AgsWasapiDevout *wasapi_devout; wasapi_devout = (AgsWasapiDevout *) g_object_new(AGS_TYPE_WASAPI_DEVOUT, NULL); return(wasapi_devout); } gsequencer-3.1.3/ags/audio/wasapi/ags_wasapi_devin.h0000644000175000017500000001421113607210263017412 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WASAPI_DEVIN_H__ #define __AGS_WASAPI_DEVIN_H__ #include #include #include #ifdef AGS_WITH_WASAPI #include #include #include #include #include #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_WASAPI_DEVIN (ags_wasapi_devin_get_type()) #define AGS_WASAPI_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WASAPI_DEVIN, AgsWasapiDevin)) #define AGS_WASAPI_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_WASAPI_DEVIN, AgsWasapiDevin)) #define AGS_IS_WASAPI_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WASAPI_DEVIN)) #define AGS_IS_WASAPI_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WASAPI_DEVIN)) #define AGS_WASAPI_DEVIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_WASAPI_DEVIN, AgsWasapiDevinClass)) #define AGS_WASAPI_DEVIN_GET_OBJ_MUTEX(obj) (&(((AgsWasapiDevin *) obj)->obj_mutex)) #define AGS_WASAPI_DEVIN_DEFAULT_WASAPI_BUFFER_SIZE (8192) typedef struct _AgsWasapiDevin AgsWasapiDevin; typedef struct _AgsWasapiDevinClass AgsWasapiDevinClass; /** * AgsWasapiDevinFlags: * @AGS_WASAPI_DEVIN_ADDED_TO_REGISTRY: the core-audio devin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_WASAPI_DEVIN_CONNECTED: indicates the core-audio devin was connected by calling #AgsConnectable::connect() * @AGS_WASAPI_DEVIN_BUFFER0: ring-buffer 0 * @AGS_WASAPI_DEVIN_BUFFER1: ring-buffer 1 * @AGS_WASAPI_DEVIN_BUFFER2: ring-buffer 2 * @AGS_WASAPI_DEVIN_BUFFER3: ring-buffer 3 * @AGS_WASAPI_DEVIN_BUFFER4: ring-buffer 4 * @AGS_WASAPI_DEVIN_BUFFER5: ring-buffer 5 * @AGS_WASAPI_DEVIN_BUFFER6: ring-buffer 6 * @AGS_WASAPI_DEVIN_BUFFER7: ring-buffer 7 * @AGS_WASAPI_DEVIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_WASAPI_DEVIN_RECORD: do capture * @AGS_WASAPI_DEVIN_SHUTDOWN: stop capture * @AGS_WASAPI_DEVIN_START_RECORD: capture starting * @AGS_WASAPI_DEVIN_NONBLOCKING: do non-blocking calls * @AGS_WASAPI_DEVIN_INITIALIZED: the soundcard was initialized * @AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE: share mode exclusive * * Enum values to control the behavior or indicate internal state of #AgsWasapiDevin by * enable/disable as flags. */ typedef enum{ AGS_WASAPI_DEVIN_ADDED_TO_REGISTRY = 1, AGS_WASAPI_DEVIN_CONNECTED = 1 << 1, AGS_WASAPI_DEVIN_BUFFER0 = 1 << 2, AGS_WASAPI_DEVIN_BUFFER1 = 1 << 3, AGS_WASAPI_DEVIN_BUFFER2 = 1 << 4, AGS_WASAPI_DEVIN_BUFFER3 = 1 << 5, AGS_WASAPI_DEVIN_BUFFER4 = 1 << 6, AGS_WASAPI_DEVIN_BUFFER5 = 1 << 7, AGS_WASAPI_DEVIN_BUFFER6 = 1 << 8, AGS_WASAPI_DEVIN_BUFFER7 = 1 << 9, AGS_WASAPI_DEVIN_ATTACK_FIRST = 1 << 10, AGS_WASAPI_DEVIN_RECORD = 1 << 11, AGS_WASAPI_DEVIN_SHUTDOWN = 1 << 12, AGS_WASAPI_DEVIN_START_RECORD = 1 << 13, AGS_WASAPI_DEVIN_NONBLOCKING = 1 << 14, AGS_WASAPI_DEVIN_INITIALIZED = 1 << 15, AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE = 1 << 16, }AgsWasapiDevinFlags; #define AGS_WASAPI_DEVIN_ERROR (ags_wasapi_devin_error_quark()) typedef enum{ AGS_WASAPI_DEVIN_ERROR_LOCKED_SOUNDCARD, AGS_WASAPI_DEVIN_ERROR_BROKEN_CONFIGURATION, }AgsWasapiDevinError; struct _AgsWasapiDevin { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; void** buffer; guint wasapi_buffer_size; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *device; #ifdef AGS_WITH_WASAPI IMMDevice *mm_device; IAudioClient *audio_client; #else gpointer mm_device; gpointer audio_client; #endif GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; GObject *notify_soundcard; }; struct _AgsWasapiDevinClass { GObjectClass gobject; }; GType ags_wasapi_devin_get_type(); GQuark ags_wasapi_devin_error_quark(); gboolean ags_wasapi_devin_test_flags(AgsWasapiDevin *wasapi_devin, guint flags); void ags_wasapi_devin_set_flags(AgsWasapiDevin *wasapi_devin, guint flags); void ags_wasapi_devin_unset_flags(AgsWasapiDevin *wasapi_devin, guint flags); void ags_wasapi_devin_switch_buffer_flag(AgsWasapiDevin *wasapi_devin); void ags_wasapi_devin_adjust_delay_and_attack(AgsWasapiDevin *wasapi_devin); void ags_wasapi_devin_realloc_buffer(AgsWasapiDevin *wasapi_devin); AgsWasapiDevin* ags_wasapi_devin_new(); G_END_DECLS #endif /*__AGS_WASAPI_DEVIN_H__*/ gsequencer-3.1.3/ags/audio/ags_recycling.c0000644000175000017500000016327513616617253015460 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_recycling_class_init(AgsRecyclingClass *recycling_class); void ags_recycling_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recycling_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recycling_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recycling_init(AgsRecycling *recycling); void ags_recycling_dispose(GObject *gobject); void ags_recycling_finalize(GObject *gobject); AgsUUID* ags_recycling_get_uuid(AgsConnectable *connectable); gboolean ags_recycling_has_resource(AgsConnectable *connectable); gboolean ags_recycling_is_ready(AgsConnectable *connectable); void ags_recycling_add_to_registry(AgsConnectable *connectable); void ags_recycling_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_recycling_list_resource(AgsConnectable *connectable); xmlNode* ags_recycling_xml_compose(AgsConnectable *connectable); void ags_recycling_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_recycling_is_connected(AgsConnectable *connectable); void ags_recycling_connect(AgsConnectable *connectable); void ags_recycling_disconnect(AgsConnectable *connectable); void ags_recycling_real_add_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal); void ags_recycling_real_remove_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal); /** * SECTION:ags_recycling * @short_description: recycling container of audio signals * @title: AgsRecycling * @section_id: * @include: ags/audio/ags_recycling.h * * #AgsRecycling forms the nested tree of AgsChannel. Every channel * owning audio signal contains therefor an #AgsRecycling. */ enum{ PROP_0, PROP_CHANNEL, PROP_OUTPUT_SOUNDCARD, PROP_OUTPUT_SOUNDCARD_CHANNEL, PROP_INPUT_SOUNDCARD, PROP_INPUT_SOUNDCARD_CHANNEL, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_PARENT, PROP_NEXT, PROP_PREV, PROP_AUDIO_SIGNAL, }; enum{ ADD_AUDIO_SIGNAL, REMOVE_AUDIO_SIGNAL, DATA_REQUEST, LAST_SIGNAL, }; static gpointer ags_recycling_parent_class = NULL; static guint recycling_signals[LAST_SIGNAL]; GType ags_recycling_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recycling = 0; static const GTypeInfo ags_recycling_info = { sizeof (AgsRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recycling_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recycling_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recycling = g_type_register_static(G_TYPE_OBJECT, "AgsRecycling", &ags_recycling_info, 0); g_type_add_interface_static(ags_type_recycling, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recycling); } return g_define_type_id__volatile; } void ags_recycling_class_init(AgsRecyclingClass *recycling) { GObjectClass *gobject; GParamSpec *param_spec; ags_recycling_parent_class = g_type_class_peek_parent(recycling); /* GObjectClass */ gobject = (GObjectClass *) recycling; gobject->set_property = ags_recycling_set_property; gobject->get_property = ags_recycling_get_property; gobject->dispose = ags_recycling_dispose; gobject->finalize = ags_recycling_finalize; /* properties */ /** * AgsRecycling:channel: * * The assigned #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", "assigned channel", "The channel it is assigned with", AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsRecycling:output-soundcard: * * The assigned output soundcard acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-soundcard", "assigned output soundcard", "The output soundcard it is assigned with", G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD, param_spec); /** * AgsRecycling:output-soundcard-channel: * * The output soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("output-soundcard-channel", i18n_pspec("output soundcard channel"), i18n_pspec("The output soundcard channel"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsRecycling:input-soundcard: * * The assigned input soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-soundcard", "assigned input soundcard", "The input soundcard it is assigned with", G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD, param_spec); /** * AgsRecycling:input-soundcard-channel: * * The input soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("input-soundcard-channel", i18n_pspec("input soundcard channel"), i18n_pspec("The input soundcard channel"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsRecycling:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsRecycling:buffer-size: * * The buffer size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsRecycling:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsRecycling:parent: * * The assigned parent #AgsRecycling. * * Since: 3.0.0 */ param_spec = g_param_spec_object("parent", "assigned parent", "The parent it is assigned with", AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PARENT, param_spec); /** * AgsRecycling:prev: * * The assigned prev #AgsRecycling. * * Since: 3.0.0 */ param_spec = g_param_spec_object("prev", "assigned prev", "The prev it is assigned with", AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PREV, param_spec); /** * AgsRecycling:next: * * The assigned next #AgsRecycling. * * Since: 3.0.0 */ param_spec = g_param_spec_object("next", "assigned next", "The next it is assigned with", AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NEXT, param_spec); /** * AgsRecycling:audio-signal: (type GList(AgsAudioSignal)) (transfer full) * * The containing #AgsAudioSignal. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("audio-signal", "containing audio signal", "The audio signal it contains", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL, param_spec); /* */ recycling->add_audio_signal = ags_recycling_real_add_audio_signal; recycling->remove_audio_signal = ags_recycling_real_remove_audio_signal; /** * AgsRecycling::add-audio-signal * @recycling: an #AgsRecycling * @audio_signal: the #AgsAudioSignal to add * * The ::add-audio-signal signal is emited as adding #AgsAudioSignal. * * Since: 3.0.0 */ recycling_signals[ADD_AUDIO_SIGNAL] = g_signal_new("add-audio-signal", G_TYPE_FROM_CLASS(recycling), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecyclingClass, add_audio_signal), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsRecycling::remove-audio-signal: * @recycling: an #AgsRecycling * @audio_signal: the #AgsAudioSignal to remove * * The ::remove-audio-signal signal is emited as removing #AgsAudioSignal. * * Since: 3.0.0 */ recycling_signals[REMOVE_AUDIO_SIGNAL] = g_signal_new("remove-audio-signal", G_TYPE_FROM_CLASS(recycling), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecyclingClass, remove_audio_signal), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsRecycling::data-request * @recycling: an #AgsRecycling * @audio_signal: the #AgsAudioSignal to request * * The ::data-request signal is emited as requesting data for @audio_signal. * * Since: 3.0.0 */ recycling_signals[DATA_REQUEST] = g_signal_new("data-request", G_TYPE_FROM_CLASS(recycling), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecyclingClass, data_request), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_recycling_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_recycling_get_uuid; connectable->has_resource = ags_recycling_has_resource; connectable->is_ready = ags_recycling_is_ready; connectable->add_to_registry = ags_recycling_add_to_registry; connectable->remove_from_registry = ags_recycling_remove_from_registry; connectable->list_resource = ags_recycling_list_resource; connectable->xml_compose = ags_recycling_xml_compose; connectable->xml_parse = ags_recycling_xml_parse; connectable->is_connected = ags_recycling_is_connected; connectable->connect = ags_recycling_connect; connectable->disconnect = ags_recycling_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_recycling_init(AgsRecycling *recycling) { AgsAudioSignal *audio_signal; AgsConfig *config; gchar *str; gchar *str0, *str1; recycling->flags = 0; /* add recycling mutex */ g_rec_mutex_init(&(recycling->obj_mutex)); /* uuid */ recycling->uuid = ags_uuid_alloc(); ags_uuid_generate(recycling->uuid); /* config */ config = ags_config_get_instance(); /* base init */ recycling->channel = NULL; recycling->output_soundcard = NULL; recycling->output_soundcard_channel = 0; recycling->input_soundcard = NULL; recycling->input_soundcard_channel = 0; /* presets */ recycling->samplerate = ags_soundcard_helper_config_get_samplerate(config); recycling->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); recycling->format = ags_soundcard_helper_config_get_format(config); /* nested tree */ recycling->parent = NULL; recycling->next = NULL; recycling->prev = NULL; /* audio signal */ audio_signal = ags_audio_signal_new(NULL, (GObject *) recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; recycling->audio_signal = g_list_alloc(); recycling->audio_signal->data = audio_signal; } void ags_recycling_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecycling *recycling; GRecMutex *recycling_mutex; recycling = AGS_RECYCLING(gobject); /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(recycling_mutex); if(recycling->channel == (GObject *) channel){ g_rec_mutex_unlock(recycling_mutex); return; } if(recycling->channel != NULL){ g_object_unref(recycling->channel); } if(channel != NULL){ g_object_ref(channel); } recycling->channel = (GObject *) channel; g_rec_mutex_unlock(recycling_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); ags_recycling_set_output_soundcard(recycling, (GObject *) soundcard); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recycling_mutex); recycling->output_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_INPUT_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); ags_recycling_set_input_soundcard(recycling, (GObject *) soundcard); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recycling_mutex); recycling->input_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_recycling_set_samplerate(recycling, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_recycling_set_buffer_size(recycling, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_recycling_set_format(recycling, format); } break; case PROP_PARENT: { AgsRecycling *parent; parent = (AgsRecycling *) g_value_get_object(value); g_rec_mutex_lock(recycling_mutex); if(recycling->parent == parent){ g_rec_mutex_unlock(recycling_mutex); return; } if(recycling->parent != NULL){ g_object_unref(recycling->parent); } if(parent != NULL){ g_object_ref(parent); } recycling->parent = parent; g_rec_mutex_unlock(recycling_mutex); } break; case PROP_NEXT: { AgsRecycling *next; next = (AgsRecycling *) g_value_get_object(value); g_rec_mutex_lock(recycling_mutex); if(recycling->next == next){ g_rec_mutex_unlock(recycling_mutex); return; } if(recycling->next != NULL){ g_object_unref(recycling->next); } if(next != NULL){ g_object_ref(next); } recycling->next = next; g_rec_mutex_unlock(recycling_mutex); } break; case PROP_PREV: { AgsRecycling *prev; prev = (AgsRecycling *) g_value_get_object(value); g_rec_mutex_lock(recycling_mutex); if(recycling->prev == prev){ g_rec_mutex_unlock(recycling_mutex); return; } if(recycling->prev != NULL){ g_object_unref(recycling->prev); } if(prev != NULL){ g_object_ref(prev); } recycling->prev = prev; g_rec_mutex_unlock(recycling_mutex); } break; case PROP_AUDIO_SIGNAL: { AgsAudioSignal *audio_signal; audio_signal = g_value_get_pointer(value); ags_recycling_add_audio_signal(recycling, audio_signal); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recycling_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecycling *recycling; GRecMutex *recycling_mutex; recycling = AGS_RECYCLING(gobject); /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); switch(prop_id){ case PROP_CHANNEL: { g_rec_mutex_lock(recycling_mutex); g_value_set_object(value, recycling->channel); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(recycling_mutex); g_value_set_object(value, recycling->output_soundcard); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recycling_mutex); g_value_set_int(value, recycling->output_soundcard_channel); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_INPUT_SOUNDCARD: { g_rec_mutex_lock(recycling_mutex); g_value_set_object(value, recycling->input_soundcard); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recycling_mutex); g_value_set_int(value, recycling->input_soundcard_channel); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(recycling_mutex); g_value_set_uint(value, recycling->samplerate); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(recycling_mutex); g_value_set_uint(value, recycling->buffer_size); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(recycling_mutex); g_value_set_uint(value, recycling->format); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_PARENT: { g_rec_mutex_lock(recycling_mutex); g_value_set_object(value, recycling->parent); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_NEXT: { g_rec_mutex_lock(recycling_mutex); g_value_set_object(value, recycling->next); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_PREV: { g_rec_mutex_lock(recycling_mutex); g_value_set_object(value, recycling->prev); g_rec_mutex_unlock(recycling_mutex); } break; case PROP_AUDIO_SIGNAL: { g_rec_mutex_lock(recycling_mutex); g_value_set_pointer(value, g_list_copy_deep(recycling->audio_signal, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recycling_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recycling_dispose(GObject *gobject) { AgsRecycling *recycling; GList *start_list, *list; GRecMutex *recycling_mutex; recycling = AGS_RECYCLING(gobject); /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); g_rec_mutex_lock(recycling_mutex); /* channel */ if(recycling->channel != NULL){ g_object_unref(recycling->channel); recycling->channel = NULL; } /* output soundcard */ if(recycling->output_soundcard != NULL){ g_object_unref(recycling->output_soundcard); recycling->output_soundcard = NULL; } /* input soundcard */ if(recycling->input_soundcard != NULL){ g_object_unref(recycling->input_soundcard); recycling->input_soundcard = NULL; } /* parent */ if(recycling->parent != NULL){ g_object_unref(recycling->parent); recycling->parent = NULL; } /* next and prev */ if(recycling->next != NULL){ g_object_unref(recycling->next); recycling->next = NULL; } if(recycling->prev != NULL){ g_object_unref(recycling->prev); recycling->prev = NULL; } g_rec_mutex_unlock(recycling_mutex); /* AgsAudioSignal */ g_rec_mutex_lock(recycling_mutex); list = start_list = recycling->audio_signal; recycling->audio_signal = NULL; g_rec_mutex_unlock(recycling_mutex); while(list != NULL){ g_object_run_dispose(list->data); list = list->next; } g_list_free_full(recycling->audio_signal, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recycling_parent_class)->dispose(gobject); } void ags_recycling_finalize(GObject *gobject) { AgsRecycling *recycling; GList *start_list, *list; recycling = AGS_RECYCLING(gobject); ags_uuid_free(recycling->uuid); /* channel */ if(recycling->channel != NULL){ g_object_unref(recycling->channel); } /* output soundcard */ if(recycling->output_soundcard != NULL){ g_object_unref(recycling->output_soundcard); } /* input soundcard */ if(recycling->input_soundcard != NULL){ g_object_unref(recycling->input_soundcard); } /* parent */ if(recycling->parent != NULL){ g_object_unref(recycling->parent); } /* next and prev */ if(recycling->next != NULL){ g_object_unref(recycling->next); } if(recycling->prev != NULL){ g_object_unref(recycling->prev); } /* AgsAudioSignal */ list = start_list = recycling->audio_signal; while(list != NULL){ g_object_run_dispose(list->data); list = list->next; } g_list_free_full(start_list, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recycling_parent_class)->finalize(gobject); } AgsUUID* ags_recycling_get_uuid(AgsConnectable *connectable) { AgsRecycling *recycling; AgsUUID *ptr; GRecMutex *recycling_mutex; recycling = AGS_RECYCLING(connectable); /* get recycling signal mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get UUID */ g_rec_mutex_lock(recycling_mutex); ptr = recycling->uuid; g_rec_mutex_unlock(recycling_mutex); return(ptr); } gboolean ags_recycling_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_recycling_is_ready(AgsConnectable *connectable) { AgsRecycling *recycling; gboolean is_ready; recycling = AGS_RECYCLING(connectable); is_ready = ags_recycling_test_flags(recycling, AGS_RECYCLING_ADDED_TO_REGISTRY); return(is_ready); } void ags_recycling_add_to_registry(AgsConnectable *connectable) { AgsRecycling *recycling; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *start_list, *list; if(ags_connectable_is_ready(connectable)){ return; } recycling = AGS_RECYCLING(connectable); application_context = ags_application_context_get_instance(); ags_recycling_set_flags(recycling, AGS_RECYCLING_ADDED_TO_REGISTRY); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) recycling); ags_registry_add_entry(registry, entry); } /* add audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_recycling_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_recycling_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_recycling_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_recycling_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_recycling_is_connected(AgsConnectable *connectable) { AgsRecycling *recycling; gboolean is_connected; recycling = AGS_RECYCLING(connectable); is_connected = ags_recycling_test_flags(recycling, AGS_RECYCLING_CONNECTED); return(is_connected); } void ags_recycling_connect(AgsConnectable *connectable) { AgsRecycling *recycling; GList *start_list, *list; if(ags_connectable_is_connected(connectable)){ return; } recycling = AGS_RECYCLING(connectable); ags_recycling_set_flags(recycling, AGS_RECYCLING_CONNECTED); #ifdef AGS_DEBUG g_message("connecting recycling"); #endif /* audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_recycling_disconnect(AgsConnectable *connectable) { AgsRecycling *recycling; GList *start_list, *list; if(!ags_connectable_is_connected(connectable)){ return; } recycling = AGS_RECYCLING(connectable); ags_recycling_unset_flags(recycling, AGS_RECYCLING_CONNECTED); #ifdef AGS_DEBUG g_message("disconnecting recycling"); #endif /* audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_recycling_get_obj_mutex: * @recycling: the #AgsRecycling * * Get object mutex. * * Returns: the #GRecMutex to lock @recycling * * Since: 3.1.0 */ GRecMutex* ags_recycling_get_obj_mutex(AgsRecycling *recycling) { if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } return(AGS_RECYCLING_GET_OBJ_MUTEX(recycling)); } /** * ags_recycling_test_flags: * @recycling: the #AgsRecycling * @flags: the flags * * Test @flags to be set on @recycling. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recycling_test_flags(AgsRecycling *recycling, guint flags) { gboolean retval; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return(FALSE); } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* test */ g_rec_mutex_lock(recycling_mutex); retval = (flags & (recycling->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(recycling_mutex); return(retval); } /** * ags_recycling_set_flags: * @recycling: the #AgsRecycling * @flags: see #AgsRecyclingFlags-enum * * Enable a feature of @recycling. * * Since: 3.0.0 */ void ags_recycling_set_flags(AgsRecycling *recycling, guint flags) { GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(recycling_mutex); recycling->flags |= flags; g_rec_mutex_unlock(recycling_mutex); } /** * ags_recycling_unset_flags: * @recycling: the #AgsRecycling * @flags: see #AgsRecyclingFlags-enum * * Disable a feature of @recycling. * * Since: 3.0.0 */ void ags_recycling_unset_flags(AgsRecycling *recycling, guint flags) { GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(recycling_mutex); recycling->flags &= (~flags); g_rec_mutex_unlock(recycling_mutex); } /** * ags_recycling_get_channel: * @recycling: the #AgsRecycling * * Get channel. * * Returns: (transfer full): the #AgsChannel * * Since: 3.1.0 */ GObject* ags_recycling_get_channel(AgsRecycling *recycling) { GObject *channel; if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } g_object_get(recycling, "channel", &channel, NULL); return(channel); } /** * ags_recycling_set_channel: * @recycling: the #AgsRecycling * @channel: the #AgsChannel * * Set channel. * * Since: 3.1.0 */ void ags_recycling_set_channel(AgsRecycling *recycling, GObject *channel) { if(!AGS_IS_RECYCLING(recycling)){ return; } g_object_set(recycling, "channel", channel, NULL); } /** * ags_recycling_next: * @recycling: the #AgsRecycling * * Iterate @recycling. * * Returns: (transfer full): the next of #AgsRecycling if available, otherwise %NULL * * Since: 3.0.0 */ AgsRecycling* ags_recycling_next(AgsRecycling *recycling) { AgsRecycling *next; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* next */ g_rec_mutex_lock(recycling_mutex); next = recycling->next; if(next != NULL){ g_object_ref(next); } g_rec_mutex_unlock(recycling_mutex); return(next); } /** * ags_recycling_prev: * @recycling: the #AgsRecycling * * Iterate @recycling. * * Returns: (transfer full): the prev of #AgsRecycling if available, otherwise %NULL * * Since: 3.0.0 */ AgsRecycling* ags_recycling_prev(AgsRecycling *recycling) { AgsRecycling *prev; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* prev */ g_rec_mutex_lock(recycling_mutex); prev = recycling->prev; if(prev != NULL){ g_object_ref(prev); } g_rec_mutex_unlock(recycling_mutex); return(prev); } /** * ags_recycling_get_output_soundcard: * @recycling: the #AgsRecycling * * Get the output soundcard object of @recycling. * * Returns: (transfer full): the output soundcard * * Since: 3.1.0 */ GObject* ags_recycling_get_output_soundcard(AgsRecycling *recycling) { GObject *output_soundcard; if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } g_object_get(recycling, "output-soundcard", &output_soundcard, NULL); return(output_soundcard); } /** * ags_recycling_set_output_soundcard: * @recycling: the #AgsRecycling * @output_soundcard: the #GObject to set * * Set @output_soundcard of @recycling. * * Since: 3.0.0 */ void ags_recycling_set_output_soundcard(AgsRecycling *recycling, GObject *output_soundcard) { GList *start_list, *list; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* recycling */ g_rec_mutex_lock(recycling_mutex); if(recycling->output_soundcard == output_soundcard){ g_rec_mutex_unlock(recycling_mutex); return; } if(recycling->output_soundcard != NULL){ g_object_unref(recycling->output_soundcard); } if(output_soundcard != NULL){ g_object_ref(output_soundcard); } recycling->output_soundcard = (GObject *) output_soundcard; g_rec_mutex_unlock(recycling_mutex); /* audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); list = start_list; while(list != NULL){ g_object_set(list->data, "output-soundcard", output_soundcard, NULL); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_recycling_get_input_soundcard: * @recycling: the #AgsRecycling * * Get the input soundcard object of @recycling. * * Returns: (transfer full): the input soundcard * * Since: 3.1.0 */ GObject* ags_recycling_get_input_soundcard(AgsRecycling *recycling) { GObject *input_soundcard; if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } g_object_get(recycling, "input-soundcard", &input_soundcard, NULL); return(input_soundcard); } /** * ags_recycling_set_input_soundcard: * @recycling: the #AgsRecycling * @input_soundcard: the #GObject to set * * Set @input_soundcard of @recycling. * * Since: 3.0.0 */ void ags_recycling_set_input_soundcard(AgsRecycling *recycling, GObject *input_soundcard) { GList *start_list, *list; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* recycling */ g_rec_mutex_lock(recycling_mutex); if(recycling->input_soundcard == input_soundcard){ g_rec_mutex_unlock(recycling_mutex); return; } if(recycling->input_soundcard != NULL){ g_object_unref(recycling->input_soundcard); } if(input_soundcard != NULL){ g_object_ref(input_soundcard); } recycling->input_soundcard = (GObject *) input_soundcard; g_rec_mutex_unlock(recycling_mutex); /* audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); list = start_list; while(list != NULL){ g_object_set(list->data, "input-soundcard", input_soundcard, NULL); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_recycling_get_samplerate: * @recycling: the #AgsRecycling * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_recycling_get_samplerate(AgsRecycling *recycling) { guint samplerate; if(!AGS_IS_RECYCLING(recycling)){ return(0); } g_object_get(recycling, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_recycling_set_samplerate: * @recycling: the #AgsRecycling * @samplerate: the samplerate * * Sets samplerate. * * Since: 3.0.0 */ void ags_recycling_set_samplerate(AgsRecycling *recycling, guint samplerate) { AgsAudioSignal *template; GList *audio_signal; GList *start_rt_template, *rt_template; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get audio signal */ g_object_get(recycling, "audio-signal", &audio_signal, NULL); /* get template */ template = ags_audio_signal_get_template(audio_signal); if(template != NULL){ g_object_set(template, "samplerate", samplerate, NULL); } g_object_unref(template); /* get rt-template */ rt_template = start_rt_template = ags_audio_signal_get_rt_template(audio_signal); while(rt_template != NULL){ g_object_set(rt_template->data, "samplerate", samplerate, NULL); rt_template = rt_template->next; } g_list_free_full(start_rt_template, g_object_unref); /* free list */ g_list_free_full(audio_signal, g_object_unref); } /** * ags_recycling_get_buffer_size: * @recycling: the #AgsRecycling * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_recycling_get_buffer_size(AgsRecycling *recycling) { guint buffer_size; if(!AGS_IS_RECYCLING(recycling)){ return(0); } g_object_get(recycling, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_recycling_set_buffer_size: * @recycling: the #AgsRecycling * @buffer_size: the buffer size * * Set buffer size. * * Since: 3.0.0 */ void ags_recycling_set_buffer_size(AgsRecycling *recycling, guint buffer_size) { AgsAudioSignal *template; GList *audio_signal; GList *start_rt_template, *rt_template; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get audio signal */ g_object_get(recycling, "audio-signal", &audio_signal, NULL); /* get template */ template = ags_audio_signal_get_template(audio_signal); if(template != NULL){ g_object_set(template, "buffer-size", buffer_size, NULL); } g_object_unref(template); /* get rt-template */ rt_template = start_rt_template = ags_audio_signal_get_rt_template(audio_signal); while(rt_template != NULL){ g_object_set(rt_template->data, "buffer-size", buffer_size, NULL); rt_template = rt_template->next; } g_list_free_full(start_rt_template, g_object_unref); /* free list */ g_list_free_full(audio_signal, g_object_unref); } /** * ags_recycling_get_format: * @recycling: the #AgsRecycling * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_recycling_get_format(AgsRecycling *recycling) { guint format; if(!AGS_IS_RECYCLING(recycling)){ return(0); } g_object_get(recycling, "format", &format, NULL); return(format); } /** * ags_recycling_set_format: * @recycling: the #AgsRecycling * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_recycling_set_format(AgsRecycling *recycling, guint format) { AgsAudioSignal *template; GList *audio_signal; GList *start_rt_template, *rt_template; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get audio signal */ g_object_get(recycling, "audio-signal", &audio_signal, NULL); /* get template */ template = ags_audio_signal_get_template(audio_signal); if(template != NULL){ g_object_set(template, "format", format, NULL); } g_object_unref(template); /* get rt-template */ rt_template = start_rt_template = ags_audio_signal_get_rt_template(audio_signal); while(rt_template != NULL){ g_object_set(rt_template->data, "format", format, NULL); rt_template = rt_template->next; } g_list_free_full(start_rt_template, g_object_unref); /* free list */ g_list_free_full(audio_signal, g_object_unref); } /** * ags_recycling_get_audio_signal: * @recycling: the #AgsRecycling * * Get recall id. * * Returns: (element-type AgsAudio.AudioSignal) (transfer full): the #GList-struct containig #AgsAudioSignal * * Since: 3.1.0 */ GList* ags_recycling_get_audio_signal(AgsRecycling *recycling) { GList *audio_signal; if(!AGS_IS_RECYCLING(recycling)){ return(NULL); } g_object_get(recycling, "audio-signal", &audio_signal, NULL); return(audio_signal); } /** * ags_recycling_set_audio_signal: * @recycling: the #AgsRecycling * @audio_signal: (element-type AgsAudio.AudioSignal) (transfer full): the #GList-struct containing #AgsAudioSignal * * Set recall id by replacing existing. * * Since: 3.1.0 */ void ags_recycling_set_audio_signal(AgsRecycling *recycling, GList *audio_signal) { GList *start_audio_signal; GRecMutex *recycling_mutex; if(!AGS_IS_RECYCLING(recycling)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); g_rec_mutex_lock(recycling_mutex); start_audio_signal = recycling->audio_signal; recycling->audio_signal = audio_signal; g_rec_mutex_unlock(recycling_mutex); g_list_free_full(start_audio_signal, (GDestroyNotify) g_object_unref); } void ags_recycling_real_add_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal) { AgsAudioSignal *old_template; GObject *output_soundcard; GHashTable *hash_table; GList *start_list, *list; GRecMutex *recycling_mutex; /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get audio signal */ g_rec_mutex_lock(recycling_mutex); if(g_list_find(recycling->audio_signal, audio_signal) != NULL){ g_rec_mutex_unlock(recycling_mutex); return; } output_soundcard = recycling->output_soundcard; g_rec_mutex_unlock(recycling_mutex); g_object_get(recycling, "audio-signal", &start_list, NULL); /* get some fields */ if(ags_audio_signal_test_flags(audio_signal, AGS_AUDIO_SIGNAL_TEMPLATE)){ /* old template */ old_template = ags_audio_signal_get_template(start_list); /* remove old template */ ags_recycling_remove_audio_signal(recycling, old_template); g_object_unref(old_template); /* add new template */ g_rec_mutex_lock(recycling_mutex); recycling->audio_signal = g_list_prepend(recycling->audio_signal, audio_signal); g_object_ref(audio_signal); g_rec_mutex_unlock(recycling_mutex); /* add/remove */ list = start_list; hash_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, NULL); while(list != NULL){ AgsAudioSignal *current_audio_signal; AgsAudioSignal *rt_template, *old_rt_template; AgsRecallID *current_recall_id; current_audio_signal = list->data; /* get some fields */ if(ags_audio_signal_test_flags(current_audio_signal, AGS_AUDIO_SIGNAL_RT_TEMPLATE)){ current_recall_id = (AgsRecallID *) current_audio_signal->recall_id; /* create rt-template */ rt_template = ags_audio_signal_new(output_soundcard, (GObject *) recycling, (GObject *) current_recall_id); ags_audio_signal_set_flags(rt_template, AGS_AUDIO_SIGNAL_RT_TEMPLATE); g_hash_table_insert(hash_table, current_audio_signal, rt_template); /* remove old rt-template */ ags_recycling_remove_audio_signal(recycling, current_audio_signal); /* add new rt-template */ ags_recycling_add_audio_signal(recycling, rt_template); } list = list->next; } /* update */ list = start_list; while(list != NULL){ AgsAudioSignal *current_audio_signal; AgsAudioSignal *rt_template; current_audio_signal = list->data; /* get some fields */ g_object_get(current_audio_signal, "rt-template", &rt_template, NULL); if(rt_template != NULL){ g_object_set(list->data, "rt-template", g_hash_table_lookup(hash_table, rt_template), NULL); g_object_unref(rt_template); } list = list->next; } g_hash_table_destroy(hash_table); }else{ /* add new audio signal */ g_rec_mutex_lock(recycling_mutex); recycling->audio_signal = g_list_prepend(recycling->audio_signal, audio_signal); g_object_ref(audio_signal); g_rec_mutex_unlock(recycling_mutex); } g_list_free_full(start_list, g_object_unref); g_object_set(audio_signal, "recycling", recycling, NULL); } /** * ags_recycling_add_audio_signal: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal to add * * Add @audio_signal to @recycling. * * Since: 3.0.0 */ void ags_recycling_add_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal) { g_return_if_fail(AGS_IS_RECYCLING(recycling) && AGS_IS_AUDIO_SIGNAL(audio_signal)); /* emit signal */ g_object_ref(G_OBJECT(recycling)); g_object_ref(G_OBJECT(audio_signal)); g_signal_emit(G_OBJECT(recycling), recycling_signals[ADD_AUDIO_SIGNAL], 0, audio_signal); g_object_unref(G_OBJECT(audio_signal)); g_object_unref(G_OBJECT(recycling)); } void ags_recycling_real_remove_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal) { GRecMutex *recycling_mutex; /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* check audio signal */ g_rec_mutex_lock(recycling_mutex); if(g_list_find(recycling->audio_signal, audio_signal) == NULL){ g_rec_mutex_unlock(recycling_mutex); return; } recycling->audio_signal = g_list_remove(recycling->audio_signal, audio_signal); g_rec_mutex_unlock(recycling_mutex); g_object_set(audio_signal, "recycling", NULL, NULL); g_object_unref(audio_signal); } /** * ags_recycling_remove_audio_signal: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal to remove * * Remove @audio_signal of @recycling. * * Since: 3.0.0 */ void ags_recycling_remove_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal) { g_return_if_fail(AGS_IS_RECYCLING(recycling) && AGS_IS_AUDIO_SIGNAL(audio_signal)); /* emit signal */ g_object_ref((GObject *) recycling); g_object_ref((GObject *) audio_signal); g_signal_emit(G_OBJECT(recycling), recycling_signals[REMOVE_AUDIO_SIGNAL], 0, audio_signal); g_object_unref((GObject *) audio_signal); g_object_unref((GObject *) recycling); } /** * ags_recycling_data_request: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal * * Request data of @audio_signal. * * Since: 3.0.0 */ void ags_recycling_data_request(AgsRecycling *recycling, AgsAudioSignal *audio_signal) { g_return_if_fail(AGS_IS_RECYCLING(recycling)); /* emit signal */ g_object_ref((GObject *) recycling); g_signal_emit(G_OBJECT(recycling), recycling_signals[DATA_REQUEST], 0, audio_signal); g_object_unref((GObject *) recycling); } /** * ags_recycling_create_audio_signal_with_defaults: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal to apply defaults * @delay: the delay * @attack: the attack * * Create audio signal with defaults. * * Since: 3.0.0 */ void ags_recycling_create_audio_signal_with_defaults(AgsRecycling *recycling, AgsAudioSignal *audio_signal, gdouble delay, guint attack) { AgsAudioSignal *template; GObject *output_soundcard; GList *start_list, *list; guint samplerate; guint buffer_size; guint format; guint last_frame; guint loop_start, loop_end; guint length; guint frame_count; GRecMutex *recycling_mutex; GRecMutex *audio_signal_mutex; GRecMutex *template_mutex; if(!AGS_IS_RECYCLING(recycling) || !AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); /* get audio signal list */ g_object_get(recycling, "audio-signal", &start_list, NULL); /* get template */ template = ags_audio_signal_get_template(start_list); g_list_free_full(start_list, g_object_unref); /* set delay and attack */ g_object_set(audio_signal, "delay", delay, "attack", attack, NULL); if(template == NULL){ ags_audio_signal_stream_resize(audio_signal, 0); return; } /* get template mutex */ template_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(template); /* get some fields */ g_rec_mutex_lock(template_mutex); output_soundcard = template->output_soundcard; samplerate = template->samplerate; buffer_size = template->buffer_size; format = template->format; length = template->length; frame_count = template->frame_count; last_frame = template->last_frame; loop_start = template->loop_start; loop_end = template->loop_end; g_rec_mutex_unlock(template_mutex); /* apply delay and attack */ last_frame = (((guint)(delay * buffer_size) + attack + last_frame) % buffer_size); loop_start = (((guint) (delay * buffer_size) + attack + loop_start) % buffer_size); loop_end = (((guint)(delay * buffer_size) + attack + loop_end) % buffer_size); /* apply defaults */ g_object_set(audio_signal, "recycling", recycling, "output-soundcard", output_soundcard, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, "frame-count", frame_count, "last-frame", last_frame, "loop-start", loop_start, "loop-end", loop_end, NULL); /* resize and duplicate */ ags_audio_signal_stream_resize(audio_signal, length); ags_audio_signal_duplicate_stream(audio_signal, template); g_object_unref(template); } /** * ags_recycling_create_audio_signal_with_frame_count: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal to apply defaults * @frame_count: the audio data size * @delay: the delay * @attack: the attack * * Create audio signal with frame count. * * Since: 3.0.0 */ void ags_recycling_create_audio_signal_with_frame_count(AgsRecycling *recycling, AgsAudioSignal *audio_signal, guint frame_count, gdouble delay, guint attack) { AgsAudioSignal *template; GObject *output_soundcard; GList *start_list, *list; GList *stream, *template_stream; guint samplerate; guint buffer_size; guint format; guint last_frame; guint loop_start, loop_end; guint new_last_frame; guint new_loop_start, new_loop_end; guint template_length; guint loop_length; guint loop_frame_count; guint n_frames; guint copy_n_frames; guint nth_loop; guint i, j; guint copy_mode; GRecMutex *recycling_mutex; GRecMutex *audio_signal_mutex; GRecMutex *template_mutex; GRecMutex *template_stream_mutex; if(!AGS_IS_RECYCLING(recycling) || !AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); /* get audio signal list */ g_object_get(recycling, "audio-signal", &start_list, NULL); /* get template */ template = ags_audio_signal_get_template(start_list); g_list_free_full(start_list, g_object_unref); /* set delay and attack */ g_object_set(audio_signal, "delay", delay, "attack", attack, NULL); if(template == NULL){ g_rec_mutex_lock(audio_signal_mutex); buffer_size = audio_signal->buffer_size; g_rec_mutex_unlock(audio_signal_mutex); ags_audio_signal_stream_resize(audio_signal, (guint) ceil((attack + frame_count) / buffer_size) + 1); return; } /* get template mutex */ template_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(template); /* get some fields */ g_rec_mutex_lock(template_mutex); output_soundcard = template->output_soundcard; samplerate = template->samplerate; buffer_size = template->buffer_size; format = template->format; last_frame = template->last_frame; loop_start = template->loop_start; loop_end = template->loop_end; template_length = template->length; g_rec_mutex_unlock(template_mutex); /* apply delay and attack */ new_last_frame = (((guint)(delay * buffer_size) + attack + last_frame) % buffer_size); new_loop_start = ((guint) (delay * buffer_size) + attack + loop_start); new_loop_end = ((guint)(delay * buffer_size) + attack + loop_end); /* apply defaults */ g_object_set(audio_signal, "recycling", recycling, "output-soundcard", output_soundcard, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); /* resize */ if(loop_end > loop_start){ loop_length = loop_end - loop_start; if((frame_count - loop_start) > (last_frame - loop_end) && last_frame >= loop_end){ loop_frame_count = (frame_count - loop_start) - (last_frame - loop_end); }else{ loop_frame_count = loop_length; } ags_audio_signal_stream_resize(audio_signal, (guint) ceil(frame_count / buffer_size) + 1); }else{ ags_audio_signal_duplicate_stream(audio_signal, template); ags_audio_signal_stream_resize(audio_signal, (guint) ceil(frame_count / buffer_size) + 1); return; } new_last_frame = ((guint) (delay * buffer_size) + frame_count + attack) % buffer_size; g_object_set(audio_signal, "last-frame", new_last_frame, NULL); if(template_length == 0){ g_object_unref(template); return; } /* get template stream mutex */ template_stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(template); /* loop related copying */ copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(format)); /* generic copying */ stream = g_list_nth(audio_signal->stream, (guint) ((delay * buffer_size) + attack) / buffer_size); g_rec_mutex_lock(template_stream_mutex); template_stream = template->stream; for(i = 0, j = attack, nth_loop = 0; i < frame_count && stream != NULL && template_stream != NULL;){ /* compute count of frames to copy */ copy_n_frames = buffer_size; if(loop_start < loop_end && i + copy_n_frames < loop_start + loop_frame_count){ if(j + copy_n_frames > loop_end){ copy_n_frames = loop_end - j; } } if((i % buffer_size) + copy_n_frames > buffer_size){ copy_n_frames = buffer_size - (i % buffer_size); } if((j % buffer_size) + copy_n_frames > buffer_size){ copy_n_frames = buffer_size - (j % buffer_size); } if(i + copy_n_frames > frame_count){ copy_n_frames = frame_count - i; } /* copy */ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, i % buffer_size, template_stream->data, 1, j % buffer_size, copy_n_frames, copy_mode); if((i + copy_n_frames) % buffer_size == 0){ stream = stream->next; } if((j + copy_n_frames) % buffer_size == 0){ template_stream = template_stream->next; } i += copy_n_frames; if(loop_start < loop_end){ if(j + copy_n_frames == loop_end && i + copy_n_frames < loop_start + loop_frame_count){ template_stream = g_list_nth(template->stream, floor(loop_start / buffer_size)); j = loop_start; nth_loop++; }else{ j += copy_n_frames; } }else{ j += copy_n_frames; } } g_rec_mutex_unlock(template_stream_mutex); g_object_unref(template); } /** * ags_recycling_find_next_channel: * @start_region: boundary start * @end_region: boundary end * @prev_channel: previous channel * * Retrieve next recycling with different channel. * * Returns: (transfer full): Matching recycling. * * Since: 3.0.0 */ AgsRecycling* ags_recycling_find_next_channel(AgsRecycling *start_region, AgsRecycling *end_region, GObject *prev_channel) { AgsRecycling *recycling, *next_recycling; /* verify objects and get pointer for safe access */ if(!AGS_IS_RECYCLING(start_region)){ return(NULL); } /* find */ recycling = start_region; if(recycling != NULL){ g_object_ref(recycling); } while(recycling != NULL && recycling != end_region){ GObject *current_channel; gboolean success; g_object_get(recycling, "channel", ¤t_channel, NULL); /* check if new match */ success = (current_channel != prev_channel) ? TRUE: FALSE; g_object_unref(current_channel); if(success){ return(recycling); } /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } if(recycling != NULL){ g_object_unref(recycling); } /* no new channel within region */ return(NULL); } /** * ags_recycling_position: * @start_region: boundary start * @end_region: boundary end * @recycling: matching recycling * * Retrieve position of recycling. * * Returns: position within boundary. * * Since: 3.0.0 */ gint ags_recycling_position(AgsRecycling *start_region, AgsRecycling *end_region, AgsRecycling *recycling) { AgsRecycling *current, *next; gint position; if(!AGS_IS_RECYCLING(start_region)){ return(-1); } /* determine position */ current = start_region; g_object_ref(current); position = -1; while(current != NULL && current != end_region){ position++; /* check if new match */ if(current == recycling){ break; } /* iterate */ next = ags_recycling_next(current); g_object_unref(next); current = next; } if(current != NULL){ g_object_unref(current); } return(position); } /** * ags_recycling_is_active: * @start_region: boundary start * @end_region: boundary end * @recall_id: the #AgsRecallID * * Check if is active. * * Returns: %TRUE if related audio signal to recall id is available, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recycling_is_active(AgsRecycling *start_region, AgsRecycling *end_region, GObject *recall_id) { AgsRecycling *current, *next; AgsRecyclingContext *recycling_context; GList *start_list, *list; gboolean is_active; gboolean success; if(!AGS_IS_RECYCLING(start_region) || !AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } current = start_region; g_object_ref(current); success = FALSE; while(current != end_region){ /* get audio signal */ g_object_get(current, "audio-signal", &start_list, NULL); /* is active */ is_active = (ags_audio_signal_is_active(start_list, recall_id)) ? TRUE: FALSE; g_list_free_full(start_list, g_object_unref); if(is_active){ success = TRUE; break; } /* iterate */ next = ags_recycling_next(current); g_object_unref(next); current = next; } if(current != NULL){ g_object_unref(current); } return(success); } /** * ags_recycling_new: * @output_soundcard: the #GObject implementing #AgsSoundcard * * Creates a #AgsRecycling, with defaults of @soundcard. * * Returns: a new #AgsRecycling * * Since: 3.0.0 */ AgsRecycling* ags_recycling_new(GObject *output_soundcard) { AgsRecycling *recycling; recycling = (AgsRecycling *) g_object_new(AGS_TYPE_RECYCLING, "output-soundcard", output_soundcard, NULL); return(recycling); } gsequencer-3.1.3/ags/audio/ags_recall_recycling.h0000644000175000017500000000564013607210263016764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_RECYCLING_H__ #define __AGS_RECALL_RECYCLING_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_RECYCLING (ags_recall_recycling_get_type()) #define AGS_RECALL_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_RECYCLING, AgsRecallRecycling)) #define AGS_RECALL_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_RECYCLING, AgsRecallRecyclingClass)) #define AGS_IS_RECALL_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_RECYCLING)) #define AGS_IS_RECALL_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_RECYCLING)) #define AGS_RECALL_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_RECYCLING, AgsRecallRecyclingClass)) typedef struct _AgsRecallRecycling AgsRecallRecycling; typedef struct _AgsRecallRecyclingClass AgsRecallRecyclingClass; /** * AgsRecallRecyclingFlags: * @AGS_RECALL_RECYCLING_GARBAGE_COLLECTOR: not used * @AGS_RECALL_RECYCLING_MAP_CHILD_DESTINATION: not used * @AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE: not used * @AGS_RECALL_RECYCLING_CREATE_DESTINATION_ON_MAP_SOURCE: not used * * Enum values to control the behavior or indicate internal state of #AgsRecallRecycling by * enable/disable as flags. */ typedef enum{ AGS_RECALL_RECYCLING_GARBAGE_COLLECTOR = 1, AGS_RECALL_RECYCLING_MAP_CHILD_DESTINATION = 1 << 1, AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE = 1 << 2, AGS_RECALL_RECYCLING_CREATE_DESTINATION_ON_MAP_SOURCE = 1 << 3, }AgsRecallRecyclingFlags; struct _AgsRecallRecycling { AgsRecall recall; guint flags; guint audio_channel; AgsRecycling *destination; AgsRecycling *source; AgsAudioSignal *child_destination; GList *child_source; }; struct _AgsRecallRecyclingClass { AgsRecallClass recall; }; GType ags_recall_recycling_get_type(); AgsRecallRecycling* ags_recall_recycling_new(); G_END_DECLS #endif /*__AGS_RECALL_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_dssi.c0000644000175000017500000004563313607210263015750 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . * * Yuri Victorovich (tiny change) - provided FreeBSD and * DragonFly macros. */ #include #include #include #include #include #include #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) #include #else #ifndef AGS_W32API #include #endif #endif #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include void ags_recall_dssi_class_init(AgsRecallDssiClass *recall_dssi_class); void ags_recall_dssi_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_dssi_init(AgsRecallDssi *recall_dssi); void ags_recall_dssi_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_dssi_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_dssi_finalize(GObject *gobject); /** * SECTION:ags_recall_dssi * @short_description: The object interfacing with DSSI * @title: AgsRecallDssi * @section_id: * @include: ags/audio/ags_recall_dssi.h * * #AgsRecallDssi provides DSSI support. */ enum{ PROP_0, PROP_PLUGIN, PROP_BANK, PROP_PROGRAM, }; static gpointer ags_recall_dssi_parent_class = NULL; static AgsConnectableInterface* ags_recall_dssi_parent_connectable_interface; GType ags_recall_dssi_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_dssi = 0; static const GTypeInfo ags_recall_dssi_info = { sizeof (AgsRecallDssiClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_dssi_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallDssi), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_dssi_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_dssi_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_dssi = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsRecallDssi", &ags_recall_dssi_info, 0); g_type_add_interface_static(ags_type_recall_dssi, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_dssi); } return g_define_type_id__volatile; } void ags_recall_dssi_class_init(AgsRecallDssiClass *recall_dssi) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_dssi_parent_class = g_type_class_peek_parent(recall_dssi); /* GObjectClass */ gobject = (GObjectClass *) recall_dssi; gobject->set_property = ags_recall_dssi_set_property; gobject->get_property = ags_recall_dssi_get_property; gobject->finalize = ags_recall_dssi_finalize; /* properties */ /** * AgsRecallDssi:plugin: * * The assigned plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("plugin", i18n_pspec("plugin of recall dssi"), i18n_pspec("The plugin which this recall dssi does run"), AGS_TYPE_DSSI_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN, param_spec); /** * AgsRecallDssi:bank: * * The selected bank. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("bank", i18n_pspec("bank"), i18n_pspec("The selected bank"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BANK, param_spec); /** * AgsRecallDssi:program: * * The selected program. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("program", i18n_pspec("program"), i18n_pspec("The selected program"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PROGRAM, param_spec); } void ags_recall_dssi_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_dssi_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_dssi_init(AgsRecallDssi *recall_dssi) { AGS_RECALL(recall_dssi)->name = "ags-dssi"; AGS_RECALL(recall_dssi)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(recall_dssi)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(recall_dssi)->xml_type = "ags-recall-dssi"; AGS_RECALL(recall_dssi)->port = NULL; recall_dssi->bank = 0; recall_dssi->program = 0; recall_dssi->plugin = NULL; recall_dssi->plugin_descriptor = NULL; recall_dssi->input_port = NULL; recall_dssi->input_lines = 0; recall_dssi->output_port = NULL; recall_dssi->output_lines = 0; } void ags_recall_dssi_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallDssi *recall_dssi; GRecMutex *recall_mutex; recall_dssi = AGS_RECALL_DSSI(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); switch(prop_id){ case PROP_PLUGIN: { AgsDssiPlugin *plugin; plugin = (AgsDssiPlugin *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_dssi->plugin == plugin){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_dssi->plugin != NULL){ g_object_unref(recall_dssi->plugin); } if(plugin != NULL){ g_object_ref(plugin); } recall_dssi->plugin = plugin; g_rec_mutex_unlock(recall_mutex); } break; case PROP_BANK: { g_rec_mutex_lock(recall_mutex); recall_dssi->bank = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(recall_mutex); recall_dssi->program = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_dssi_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallDssi *recall_dssi; GRecMutex *recall_mutex; recall_dssi = AGS_RECALL_DSSI(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); switch(prop_id){ case PROP_PLUGIN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_dssi->plugin); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BANK: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_dssi->bank); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_dssi->program); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_dssi_finalize(GObject *gobject) { AgsRecallDssi *recall_dssi; recall_dssi = AGS_RECALL_DSSI(gobject); if(recall_dssi->input_port != NULL){ free(recall_dssi->input_port); } if(recall_dssi->output_port != NULL){ free(recall_dssi->output_port); } /* call parent */ G_OBJECT_CLASS(ags_recall_dssi_parent_class)->finalize(gobject); } /** * ags_recall_dssi_load: * @recall_dssi: the #AgsRecallDssi * * Set up DSSI handle. * * Since: 3.0.0 */ void ags_recall_dssi_load(AgsRecallDssi *recall_dssi) { AgsDssiPlugin *dssi_plugin; gchar *filename; gchar *effect; guint effect_index; void *plugin_so; DSSI_Descriptor_Function dssi_descriptor; DSSI_Descriptor *plugin_descriptor; GRecMutex *recall_mutex; if(!AGS_IS_RECALL_DSSI(recall_dssi)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); /* get some fields */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall_dssi)->filename); effect = g_strdup(AGS_RECALL(recall_dssi)->effect); effect_index = AGS_RECALL(recall_dssi)->effect_index; g_rec_mutex_unlock(recall_mutex); /* find dssi plugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); g_free(filename); g_free(effect); g_object_get(dssi_plugin, "plugin-so", &plugin_so, NULL); if(plugin_so){ gboolean success; success = FALSE; #ifdef AGS_W32API dssi_descriptor = (DSSI_Descriptor_Function) GetProcAddress(plugin_so, "dssi_descriptor"); success = (!dssi_descriptor) ? FALSE: TRUE; #else dssi_descriptor = (DSSI_Descriptor_Function) dlsym(plugin_so, "dssi_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && dssi_descriptor){ g_rec_mutex_lock(recall_mutex); recall_dssi->plugin_descriptor = plugin_descriptor = dssi_descriptor((unsigned long) effect_index); g_rec_mutex_unlock(recall_mutex); } } } /** * ags_recall_dssi_load_ports: * @recall_dssi: the #AgsRecallDssi * * Set up DSSI ports. * * Returns: (element-type AgsAudio.Port) (transfer full): the #GList-struct containing #AgsPort * * Since: 3.0.0 */ GList* ags_recall_dssi_load_ports(AgsRecallDssi *recall_dssi) { AgsPort *current_port; AgsDssiPlugin *dssi_plugin; GList *port, *retval; GList *plugin_port_start, *plugin_port; gchar *filename; gchar *effect; guint effect_index; guint port_count; guint i; GRecMutex *recall_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_RECALL_DSSI(recall_dssi)){ return(NULL); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); /* get some fields */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall_dssi)->filename); effect = g_strdup(AGS_RECALL(recall_dssi)->effect); effect_index = AGS_RECALL(recall_dssi)->effect_index; g_rec_mutex_unlock(recall_mutex); /* find dssi plugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); g_free(filename); g_free(effect); /* set dssi plugin */ g_rec_mutex_lock(recall_mutex); recall_dssi->plugin = dssi_plugin; g_rec_mutex_unlock(recall_mutex); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* get port descriptor */ g_rec_mutex_lock(base_plugin_mutex); plugin_port = plugin_port_start = g_list_copy(AGS_BASE_PLUGIN(dssi_plugin)->plugin_port); g_rec_mutex_unlock(base_plugin_mutex); port = NULL; retval = NULL; if(plugin_port != NULL){ port_count = g_list_length(plugin_port_start); for(i = 0; i < port_count; i++){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_CONTROL)){ gchar *plugin_name; gchar *specifier; GValue *default_value; plugin_name = g_strdup_printf("dssi-%u", dssi_plugin->unique_id); default_value = g_new0(GValue, 1); g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_value_init(default_value, G_TYPE_FLOAT); g_value_copy(current_plugin_port->default_value, default_value); g_rec_mutex_unlock(plugin_port_mutex); current_port = g_object_new(AGS_TYPE_PORT, "plugin-name", plugin_name, "specifier", specifier, "control-port", g_strdup_printf("%u/%u", i, port_count), "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, NULL); current_port->flags |= AGS_PORT_USE_LADSPA_FLOAT; g_object_ref(current_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT)){ current_port->flags |= AGS_PORT_IS_OUTPUT; ags_recall_set_flags((AgsRecall *) recall_dssi, AGS_RECALL_HAS_OUTPUT_PORT); }else{ if(!ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INTEGER) && !ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_TOGGLED)){ current_port->flags |= AGS_PORT_INFINITE_RANGE; } } g_object_set(current_port, "plugin-port", current_plugin_port, NULL); ags_recall_dssi_load_conversion(recall_dssi, (GObject *) current_port, current_plugin_port); ags_port_safe_write_raw(current_port, default_value); port = g_list_prepend(port, current_port); g_value_unset(default_value); g_free(default_value); g_free(plugin_name); g_free(specifier); }else if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_AUDIO)){ g_rec_mutex_lock(recall_mutex); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INPUT)){ if(recall_dssi->input_port == NULL){ recall_dssi->input_port = (guint *) malloc(sizeof(guint)); recall_dssi->input_port[0] = i; }else{ recall_dssi->input_port = (guint *) realloc(recall_dssi->input_port, (recall_dssi->input_lines + 1) * sizeof(guint)); recall_dssi->input_port[recall_dssi->input_lines] = i; } recall_dssi->input_lines += 1; }else if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT)){ if(recall_dssi->output_port == NULL){ recall_dssi->output_port = (guint *) malloc(sizeof(guint)); recall_dssi->output_port[0] = i; }else{ recall_dssi->output_port = (guint *) realloc(recall_dssi->output_port, (recall_dssi->output_lines + 1) * sizeof(guint)); recall_dssi->output_port[recall_dssi->output_lines] = i; } recall_dssi->output_lines += 1; } g_rec_mutex_unlock(recall_mutex); } /* iterate plugin port */ plugin_port = plugin_port->next; } /* reverse port */ g_rec_mutex_lock(recall_mutex); AGS_RECALL(recall_dssi)->port = g_list_reverse(port); retval = g_list_copy(AGS_RECALL(recall_dssi)->port); g_rec_mutex_unlock(recall_mutex); } g_list_free(plugin_port_start); return(retval); } /** * ags_recall_dssi_load_conversion: * @recall_dssi: the #AgsRecallDssi * @port: the #AgsPort * @plugin_port: the #AgsPluginPort * * Loads conversion object by using @plugin_port and sets in on @port. * * Since: 3.0.0 */ void ags_recall_dssi_load_conversion(AgsRecallDssi *recall_dssi, GObject *port, gpointer plugin_port) { AgsLadspaConversion *ladspa_conversion; if(!AGS_IS_RECALL_DSSI(recall_dssi) || !AGS_IS_PORT(port) || !AGS_IS_PLUGIN_PORT(plugin_port)){ return; } ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_SAMPLERATE)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; } if(ladspa_conversion != NULL){ g_object_set(port, "conversion", ladspa_conversion, NULL); } } /** * ags_recall_dssi_find: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @filename: plugin filename * @effect: effect's name * * Retrieve DSSI recall. * * Returns: (element-type AgsAudio.Recall) (transfer none): Next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_recall_dssi_find(GList *recall, gchar *filename, gchar *effect) { gboolean success; GRecMutex *recall_mutex; while(recall != NULL){ if(AGS_IS_RECALL_DSSI(recall->data)){ /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall->data); /* check filename and effect */ g_rec_mutex_lock(recall_mutex); success = (!g_strcmp0(AGS_RECALL(recall->data)->filename, filename) && !g_strcmp0(AGS_RECALL(recall->data)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); if(success){ return(recall); } } recall = recall->next; } return(NULL); } /** * ags_recall_dssi_new: * @source: the #AgsChannel as source * @filename: the DSSI plugin filename * @effect: effect's name * @effect_index: effect's index * * Creates a new instance of #AgsRecallDssi * * Returns: the new #AgsRecallDssi * * Since: 3.0.0 */ AgsRecallDssi* ags_recall_dssi_new(AgsChannel *source, gchar *filename, gchar *effect, guint effect_index) { AgsRecallDssi *recall_dssi; GObject *output_soundcard; output_soundcard = NULL; if(source != NULL){ g_object_get(source, "output-soundcard", &output_soundcard, NULL); } recall_dssi = (AgsRecallDssi *) g_object_new(AGS_TYPE_RECALL_DSSI, "output-soundcard", output_soundcard, "source", source, "filename", filename, "effect", effect, "effect-index", effect_index, NULL); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } return(recall_dssi); } gsequencer-3.1.3/ags/audio/ags_recall_channel.c0000644000175000017500000004341213616617253016421 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_recall_channel_class_init(AgsRecallChannelClass *recall_channel); void ags_recall_channel_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_channel_init(AgsRecallChannel *recall_channel); void ags_recall_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_channel_dispose(GObject *gobject); void ags_recall_channel_finalize(GObject *gobject); void ags_recall_channel_notify_recall_container_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_recall_channel_automate(AgsRecall *recall); AgsRecall* ags_recall_channel_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); /** * SECTION:ags_recall_channel * @short_description: channel context of recall * @title: AgsRecallChannel * @section_id: * @include: ags/audio/ags_recall_channel.h * * #AgsRecallChannel acts as channel recall. */ enum{ PROP_0, PROP_RECALL_AUDIO, PROP_DESTINATION, PROP_SOURCE, }; static gpointer ags_recall_channel_parent_class = NULL; static AgsConnectableInterface* ags_recall_channel_parent_connectable_interface; GType ags_recall_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_channel = 0; static const GTypeInfo ags_recall_channel_info = { sizeof (AgsRecallChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_channel_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_channel_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_channel = g_type_register_static(AGS_TYPE_RECALL, "AgsRecallChannel", &ags_recall_channel_info, 0); g_type_add_interface_static(ags_type_recall_channel, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_channel); } return g_define_type_id__volatile; } void ags_recall_channel_class_init(AgsRecallChannelClass *recall_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_channel_parent_class = g_type_class_peek_parent(recall_channel); /* GObjectClass */ gobject = (GObjectClass *) recall_channel; gobject->set_property = ags_recall_channel_set_property; gobject->get_property = ags_recall_channel_get_property; gobject->dispose = ags_recall_channel_dispose; gobject->finalize = ags_recall_channel_finalize; /* properties */ /** * AgsRecallChannel:recall-audio: * * The associated recall within audio context. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-audio", i18n_pspec("audio level recall"), i18n_pspec("The recall which this recall channel has on audio level"), AGS_TYPE_RECALL_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO, param_spec); /** * AgsRecallChannel:destination: * * The assigned destination channel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("destination", i18n_pspec("assigned destination channel"), i18n_pspec("The destination channel object it is assigned to"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESTINATION, param_spec); /** * AgsRecallChannel:source: * * The assigned source channel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("source", i18n_pspec("assigned source channel"), i18n_pspec("The source channel object it is assigned to"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOURCE, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_channel; recall->automate = ags_recall_channel_automate; recall->duplicate = ags_recall_channel_duplicate; } void ags_recall_channel_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_channel_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_channel_init(AgsRecallChannel *recall_channel) { g_signal_connect_after(recall_channel, "notify::recall-container", G_CALLBACK(ags_recall_channel_notify_recall_container_callback), NULL); recall_channel->destination = NULL; recall_channel->source = NULL; } void ags_recall_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallChannel *recall_channel; GRecMutex *recall_mutex; recall_channel = AGS_RECALL_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel); switch(prop_id){ case PROP_RECALL_AUDIO: { AgsRecallAudio *recall_audio; GList *list_start, *list; recall_audio = (AgsRecallAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel->recall_audio == recall_audio){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_channel->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_channel->recall_audio)); } if(recall_audio != NULL){ g_object_ref(G_OBJECT(recall_audio)); } recall_channel->recall_audio = recall_audio; g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { AgsChannel *destination; destination = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel->destination == destination){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_channel->destination != NULL){ g_object_unref(recall_channel->destination); } if(destination != NULL){ g_object_ref(destination); } recall_channel->destination = destination; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { AgsChannel *source; source = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel->source == source){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_channel->source != NULL){ g_object_unref(recall_channel->source); } if(source != NULL){ g_object_ref(source); } recall_channel->source = source; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallChannel *recall_channel; GRecMutex *recall_mutex; recall_channel = AGS_RECALL_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel); switch(prop_id){ case PROP_RECALL_AUDIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel->recall_audio); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel->destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel->source); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_channel_dispose(GObject *gobject) { AgsRecallChannel *recall_channel; recall_channel = AGS_RECALL_CHANNEL(gobject); /* source */ if(recall_channel->source != NULL){ g_object_unref(recall_channel->source); recall_channel->source = NULL; } /* destination */ if(recall_channel->destination != NULL){ g_object_unref(G_OBJECT(recall_channel->destination)); recall_channel->destination = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_channel_parent_class)->dispose(gobject); } void ags_recall_channel_finalize(GObject *gobject) { AgsRecallChannel *recall_channel; recall_channel = AGS_RECALL_CHANNEL(gobject); /* source */ if(recall_channel->source != NULL){ g_object_unref(recall_channel->source); } /* destination */ if(recall_channel->destination != NULL){ g_object_unref(G_OBJECT(recall_channel->destination)); } /* call parent */ G_OBJECT_CLASS(ags_recall_channel_parent_class)->finalize(gobject); } void ags_recall_channel_notify_recall_container_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsRecallContainer *recall_container; AgsRecallChannel *recall_channel; recall_channel = AGS_RECALL_CHANNEL(gobject); /* get some fields */ g_object_get(recall_channel, "recall-container", &recall_container, NULL); if(recall_container != NULL){ AgsRecallAudio *recall_audio; GList *list_start, *list; /* recall audio */ g_object_get(recall_container, "recall-audio", &recall_audio, NULL); g_object_set(recall_channel, "recall-audio", recall_audio, NULL); if(recall_audio != NULL){ g_object_unref(recall_audio); } g_object_unref(recall_container); }else{ g_object_set(recall_channel, "recall-audio", NULL, NULL); } } void ags_recall_channel_automate(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; GObject *soundcard; GList *automation_start, *automation; GList *port_start, *port; gdouble delay; guint note_offset, delay_counter; guint loop_left, loop_right; gboolean do_loop; double x, step; guint ret_x; gboolean return_prev_on_failure; GRecMutex *audio_mutex; g_object_get(recall, "source", &channel, NULL); g_object_get(channel, "audio", &audio, NULL); audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); if(audio->automation_port == NULL){ g_rec_mutex_unlock(audio_mutex); return; } g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output-soundcard", &soundcard, NULL); g_object_get(recall, "port", &port_start, NULL); /* retrieve position */ note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(soundcard)); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(soundcard)); delay_counter = ags_soundcard_get_delay_counter(AGS_SOUNDCARD(soundcard)); /* retrieve loop information */ ags_soundcard_get_loop(AGS_SOUNDCARD(soundcard), &loop_left, &loop_right, &do_loop); return_prev_on_failure = TRUE; if(do_loop && loop_left <= note_offset){ if(note_offset == loop_left){ return_prev_on_failure = TRUE; } } /* apply automation */ port = port_start; x = ((double) note_offset + (delay_counter / delay)) * ((1.0 / AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH) * AGS_NOTATION_MINIMUM_NOTE_LENGTH); step = ((1.0 / AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH) * AGS_NOTATION_MINIMUM_NOTE_LENGTH); while(port != NULL){ gchar *specifier; gboolean success; g_object_get(AGS_PORT(port->data), "specifier", &specifier, NULL); g_rec_mutex_lock(audio_mutex); success = g_strv_contains(audio->automation_port, specifier); g_rec_mutex_unlock(audio_mutex); g_free(specifier); if(!success){ /* iterate */ port = port->next; continue; } g_object_get(AGS_PORT(port->data), "automation", &automation_start, NULL); /* find offset */ automation = automation_start; while(automation != NULL){ AgsAutomation *current_automation; AgsTimestamp *timestamp; current_automation = automation->data; /* get some fields */ g_object_get(current_automation, "timestamp", ×tamp, NULL); if(ags_timestamp_get_ags_offset(timestamp) + AGS_AUTOMATION_DEFAULT_OFFSET < x){ automation = automation->next; g_object_unref(timestamp); continue; } if(!ags_automation_test_flags(current_automation, AGS_AUTOMATION_BYPASS)){ GValue value = {0,}; ret_x = ags_automation_get_value(current_automation, floor(x), ceil(x + step), return_prev_on_failure, &value); if(ret_x != G_MAXUINT){ ags_port_safe_write(port->data, &value); } } if(ags_timestamp_get_ags_offset(timestamp) > ceil(x + step)){ g_object_unref(timestamp); break; } /* unref */ g_object_unref(timestamp); /* iterate */ automation = automation->next; } g_list_free_full(automation_start, g_object_unref); /* iterate */ port = port->next; } g_object_unref(channel); g_object_unref(audio); g_object_unref(soundcard); g_list_free_full(port_start, g_object_unref); } AgsRecall* ags_recall_channel_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsRecallChannel *copy_recall_channel; copy_recall_channel = AGS_RECALL_CHANNEL(AGS_RECALL_CLASS(ags_recall_channel_parent_class)->duplicate(recall, recall_id, n_params, parameter_name, value)); g_message("ags warning - ags_recall_channel_duplicate: you shouldn't do this %s", G_OBJECT_TYPE_NAME(recall)); return((AgsRecall *) copy_recall_channel); } /** * ags_recall_channel_get_destination: * @recall_channel: the #AgsRecallDestination * * Get destination. * * Returns: (transfer full): the #AgsDestination * * Since: 3.1.0 */ AgsChannel* ags_recall_channel_get_destination(AgsRecallChannel *recall_channel) { AgsChannel *destination; if(!AGS_IS_RECALL_CHANNEL(recall_channel)){ return(NULL); } g_object_get(recall_channel, "destination", &destination, NULL); return(destination); } /** * ags_recall_channel_set_destination: * @recall_channel: the #AgsRecallChannel * @destination: the #AgsChannel * * Set destination. * * Since: 3.1.0 */ void ags_recall_channel_set_destination(AgsRecallChannel *recall_channel, AgsChannel *destination) { if(!AGS_IS_RECALL_CHANNEL(recall_channel)){ return; } g_object_set(recall_channel, "destination", destination, NULL); } /** * ags_recall_channel_get_source: * @recall_channel: the #AgsRecallSource * * Get source. * * Returns: (transfer full): the #AgsSource * * Since: 3.1.0 */ AgsChannel* ags_recall_channel_get_source(AgsRecallChannel *recall_channel) { AgsChannel *source; if(!AGS_IS_RECALL_CHANNEL(recall_channel)){ return(NULL); } g_object_get(recall_channel, "source", &source, NULL); return(source); } /** * ags_recall_channel_set_source: * @recall_channel: the #AgsRecallChannel * @source: the #AgsChannel * * Set source. * * Since: 3.1.0 */ void ags_recall_channel_set_source(AgsRecallChannel *recall_channel, AgsChannel *source) { if(!AGS_IS_RECALL_CHANNEL(recall_channel)){ return; } g_object_set(recall_channel, "source", source, NULL); } /** * ags_recall_channel_find_channel: * @recall_channel: (element-type AgsAudio.RecallChannel) (transfer none): the #GList-struct containing #AgsRecallChannel * @source: the #AgsChannel to find * * Retrieve next recall assigned to channel. * * Returns: (element-type AgsAudio.RecallChannel) (transfer none): next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_recall_channel_find_channel(GList *recall_channel, AgsChannel *source) { AgsChannel *current_source; AgsRecallChannel *current_recall_channel; while(recall_channel != NULL){ current_recall_channel = AGS_RECALL_CHANNEL(recall_channel->data); g_object_get(current_recall_channel, "source", ¤t_source, NULL); if(current_source == source){ return(recall_channel); } recall_channel = recall_channel->next; } return(NULL); } /** * ags_recall_channel_new: * * Creates an #AgsRecallChannel. * * Returns: a new #AgsRecallChannel. * * Since: 3.0.0 */ AgsRecallChannel* ags_recall_channel_new() { AgsRecallChannel *recall_channel; recall_channel = (AgsRecallChannel *) g_object_new(AGS_TYPE_RECALL_CHANNEL, NULL); return(recall_channel); } gsequencer-3.1.3/ags/audio/ags_audio_application_context.c0000644000175000017500000025733513614062654020727 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef AGS_W32API #include #endif #include #include #include void ags_audio_application_context_signal_handler(int signr); static void ags_audio_application_context_signal_cleanup(); void ags_audio_application_context_class_init(AgsAudioApplicationContextClass *audio_application_context); void ags_audio_application_context_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider); void ags_audio_application_context_service_provider_interface_init(AgsServiceProviderInterface *service_provider); void ags_audio_application_context_sound_provider_interface_init(AgsSoundProviderInterface *sound_provider); void ags_audio_application_context_init(AgsAudioApplicationContext *audio_application_context); void ags_audio_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_application_context_dispose(GObject *gobject); void ags_audio_application_context_finalize(GObject *gobject); void ags_audio_application_context_connect(AgsConnectable *connectable); void ags_audio_application_context_disconnect(AgsConnectable *connectable); AgsThread* ags_audio_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider); void ags_audio_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop); AgsTaskLauncher* ags_audio_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider); void ags_audio_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher); AgsThreadPool* ags_audio_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider); void ags_audio_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool); GList* ags_audio_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider); void ags_audio_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker); gboolean ags_audio_application_context_is_operating(AgsServiceProvider *service_provider); AgsServerStatus* ags_audio_application_context_server_status(AgsServiceProvider *service_provider); void ags_audio_application_context_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry); AgsRegistry* ags_audio_application_context_get_registry(AgsServiceProvider *service_provider); void ags_audio_application_context_set_server(AgsServiceProvider *service_provider, GList *server); GList* ags_audio_application_context_get_server(AgsServiceProvider *service_provider); GObject* ags_audio_application_context_get_default_soundcard(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_default_soundcard(AgsSoundProvider *sound_provider, GObject *soundcard); GObject* ags_audio_application_context_get_default_soundcard_thread(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_default_soundcard_thread(AgsSoundProvider *sound_provider, GObject *soundcard_thread); GList* ags_audio_application_context_get_soundcard(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_soundcard(AgsSoundProvider *sound_provider, GList *soundcard); GList* ags_audio_application_context_get_sequencer(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_sequencer(AgsSoundProvider *sound_provider, GList *sequencer); GList* ags_audio_application_context_get_audio(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_audio(AgsSoundProvider *sound_provider, GList *audio); GList* ags_audio_application_context_get_sound_server(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_sound_server(AgsSoundProvider *sound_provider, GList *sound_server); GList* ags_audio_application_context_get_osc_server(AgsSoundProvider *sound_provider); void ags_audio_application_context_set_osc_server(AgsSoundProvider *sound_provider, GList *osc_server); void ags_audio_application_context_prepare(AgsApplicationContext *application_context); void ags_audio_application_context_setup(AgsApplicationContext *application_context); void ags_audio_application_context_register_types(AgsApplicationContext *application_context); void ags_audio_application_context_read(AgsFile *file, xmlNode *node, GObject **application_context); xmlNode* ags_audio_application_context_write(AgsFile *file, xmlNode *parent, GObject *application_context); void ags_audio_application_context_quit(AgsApplicationContext *application_context); void ags_audio_application_context_set_value_callback(AgsConfig *config, gchar *group, gchar *key, gchar *value, AgsAudioApplicationContext *audio_application_context); void* ags_audio_application_context_server_main_loop_thread(GMainLoop *main_loop); void* ags_audio_application_context_audio_main_loop_thread(GMainLoop *main_loop); /** * SECTION:ags_audio_application_context * @short_description: audio application context * @title: AgsAudioApplicationContext * @section_id: * @include: ags/audio/ags_audio_application_context.h * * The #AgsAudioApplicationContext provides you sound processing, output and capturing. */ enum{ PROP_0, }; static gpointer ags_audio_application_context_parent_class = NULL; static AgsConnectableInterface* ags_audio_application_context_parent_connectable_interface; extern AgsApplicationContext *ags_application_context; //TODO:JK: implement get functions #ifndef AGS_W32API struct sigaction ags_sigact; #endif GType ags_audio_application_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_application_context = 0; static const GTypeInfo ags_audio_application_context_info = { sizeof (AgsAudioApplicationContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_application_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioApplicationContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_application_context_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_application_context_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_concurrency_provider_interface_info = { (GInterfaceInitFunc) ags_audio_application_context_concurrency_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_service_provider_interface_info = { (GInterfaceInitFunc) ags_audio_application_context_service_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_provider_interface_info = { (GInterfaceInitFunc) ags_audio_application_context_sound_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_application_context = g_type_register_static(AGS_TYPE_APPLICATION_CONTEXT, "AgsAudioApplicationContext", &ags_audio_application_context_info, 0); g_type_add_interface_static(ags_type_audio_application_context, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_audio_application_context, AGS_TYPE_CONCURRENCY_PROVIDER, &ags_concurrency_provider_interface_info); g_type_add_interface_static(ags_type_audio_application_context, AGS_TYPE_SERVICE_PROVIDER, &ags_service_provider_interface_info); g_type_add_interface_static(ags_type_audio_application_context, AGS_TYPE_SOUND_PROVIDER, &ags_sound_provider_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_application_context); } return g_define_type_id__volatile; } void ags_audio_application_context_signal_handler(int signr) { #ifndef AGS_W32API if(signr == SIGINT){ //TODO:JK: do backup exit(-1); }else{ sigemptyset(&(ags_sigact.sa_mask)); } #endif } static void ags_audio_application_context_signal_cleanup() { #ifndef AGS_W32API sigemptyset(&(ags_sigact.sa_mask)); #endif } void ags_audio_application_context_class_init(AgsAudioApplicationContextClass *audio_application_context) { GObjectClass *gobject; AgsApplicationContextClass *application_context; GParamSpec *param_spec; ags_audio_application_context_parent_class = g_type_class_peek_parent(audio_application_context); /* GObjectClass */ gobject = (GObjectClass *) audio_application_context; gobject->set_property = ags_audio_application_context_set_property; gobject->get_property = ags_audio_application_context_get_property; gobject->dispose = ags_audio_application_context_dispose; gobject->finalize = ags_audio_application_context_finalize; /* AgsApplicationContextClass */ application_context = (AgsApplicationContextClass *) audio_application_context; application_context->prepare = ags_audio_application_context_prepare; application_context->setup = ags_audio_application_context_setup; application_context->register_types = ags_audio_application_context_register_types; application_context->quit = ags_audio_application_context_quit; application_context->read = ags_audio_application_context_read; application_context->write = ags_audio_application_context_write; } void ags_audio_application_context_connectable_interface_init(AgsConnectableInterface *connectable) { ags_audio_application_context_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_audio_application_context_connect; connectable->disconnect = ags_audio_application_context_disconnect; } void ags_audio_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider) { concurrency_provider->get_main_loop = ags_audio_application_context_get_main_loop; concurrency_provider->set_main_loop = ags_audio_application_context_set_main_loop; concurrency_provider->get_task_launcher = ags_audio_application_context_get_task_launcher; concurrency_provider->set_task_launcher = ags_audio_application_context_set_task_launcher; concurrency_provider->get_thread_pool = ags_audio_application_context_get_thread_pool; concurrency_provider->set_thread_pool = ags_audio_application_context_set_thread_pool; concurrency_provider->get_worker = ags_audio_application_context_get_worker; concurrency_provider->set_worker = ags_audio_application_context_set_worker; } void ags_audio_application_context_service_provider_interface_init(AgsServiceProviderInterface *service_provider) { service_provider->is_operating = ags_audio_application_context_is_operating; service_provider->server_status = ags_audio_application_context_server_status; service_provider->set_registry = ags_audio_application_context_set_registry; service_provider->get_registry = ags_audio_application_context_get_registry; service_provider->set_server = ags_audio_application_context_set_server; service_provider->get_server = ags_audio_application_context_get_server; } void ags_audio_application_context_sound_provider_interface_init(AgsSoundProviderInterface *sound_provider) { sound_provider->get_default_soundcard = ags_audio_application_context_get_default_soundcard; sound_provider->set_default_soundcard = ags_audio_application_context_set_default_soundcard; sound_provider->get_default_soundcard_thread = ags_audio_application_context_get_default_soundcard_thread; sound_provider->set_default_soundcard_thread = ags_audio_application_context_set_default_soundcard_thread; sound_provider->get_soundcard = ags_audio_application_context_get_soundcard; sound_provider->set_soundcard = ags_audio_application_context_set_soundcard; sound_provider->get_sequencer = ags_audio_application_context_get_sequencer; sound_provider->set_sequencer = ags_audio_application_context_set_sequencer; sound_provider->get_sound_server = ags_audio_application_context_get_sound_server; sound_provider->set_sound_server = ags_audio_application_context_set_sound_server; sound_provider->get_audio = ags_audio_application_context_get_audio; sound_provider->set_audio = ags_audio_application_context_set_audio; sound_provider->get_osc_server = ags_audio_application_context_get_osc_server; sound_provider->set_osc_server = ags_audio_application_context_set_osc_server; } void ags_audio_application_context_init(AgsAudioApplicationContext *audio_application_context) { AgsConfig *config; AgsLog *log; if(ags_application_context == NULL){ ags_application_context = (AgsApplicationContext *) audio_application_context; } /* fundamental instances */ config = ags_config_get_instance(); AGS_APPLICATION_CONTEXT(audio_application_context)->config = config; g_object_ref(config); log = (GObject *) ags_log_get_instance(); AGS_APPLICATION_CONTEXT(audio_application_context)->log = log; g_object_ref(log); /* Audio application context */ audio_application_context->thread_pool = NULL; audio_application_context->worker = NULL; audio_application_context->is_operating = FALSE; audio_application_context->server_status = NULL; audio_application_context->registry = NULL; audio_application_context->server = NULL; audio_application_context->default_soundcard = NULL; audio_application_context->default_soundcard_thread = NULL; audio_application_context->default_export_thread = NULL; audio_application_context->soundcard = NULL; audio_application_context->sequencer = NULL; audio_application_context->sound_server = NULL; audio_application_context->audio = NULL; audio_application_context->osc_server = NULL; } void ags_audio_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioApplicationContext *audio_application_context; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioApplicationContext *audio_application_context; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_application_context_dispose(GObject *gobject) { AgsAudioApplicationContext *audio_application_context; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(gobject); /* thread pool */ if(audio_application_context->thread_pool != NULL){ g_object_unref(audio_application_context->thread_pool); audio_application_context->thread_pool = NULL; } /* worker thread */ if(audio_application_context->worker != NULL){ g_list_free_full(audio_application_context->worker, g_object_unref); audio_application_context->worker = NULL; } /* server status */ if(audio_application_context->server_status != NULL){ g_object_unref(audio_application_context->server_status); audio_application_context->server_status = NULL; } /* server thread */ if(audio_application_context->server != NULL){ g_list_free_full(audio_application_context->server, g_object_unref); audio_application_context->server = NULL; } /* default soundcard */ if(audio_application_context->default_soundcard != NULL){ g_object_unref(audio_application_context->default_soundcard); audio_application_context->default_soundcard = NULL; } /* soundcard and export thread */ if(audio_application_context->default_soundcard_thread != NULL){ g_object_unref(audio_application_context->default_soundcard_thread); audio_application_context->default_soundcard_thread = NULL; } if(audio_application_context->default_export_thread != NULL){ g_object_unref(audio_application_context->default_export_thread); audio_application_context->default_export_thread = NULL; } /* soundcard and sequencer */ if(audio_application_context->soundcard != NULL){ g_list_free_full(audio_application_context->soundcard, g_object_unref); audio_application_context->soundcard = NULL; } if(audio_application_context->sequencer != NULL){ g_list_free_full(audio_application_context->sequencer, g_object_unref); audio_application_context->sequencer = NULL; } /* audio */ if(audio_application_context->audio != NULL){ g_list_free_full(audio_application_context->audio, g_object_unref); audio_application_context->audio = NULL; } /* sound server */ if(audio_application_context->sound_server != NULL){ g_list_free_full(audio_application_context->sound_server, g_object_unref); audio_application_context->sound_server = NULL; } /* osc server */ if(audio_application_context->osc_server != NULL){ g_list_free_full(audio_application_context->osc_server, g_object_unref); audio_application_context->osc_server = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_application_context_parent_class)->dispose(gobject); } void ags_audio_application_context_finalize(GObject *gobject) { AgsAudioApplicationContext *audio_application_context; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(gobject); /* thread pool */ if(audio_application_context->thread_pool != NULL){ g_object_unref(audio_application_context->thread_pool); } /* worker thread */ if(audio_application_context->worker != NULL){ g_list_free_full(audio_application_context->worker, g_object_unref); } /* server status */ if(audio_application_context->server_status != NULL){ g_object_unref(audio_application_context->server_status); } /* server thread */ if(audio_application_context->server != NULL){ g_list_free_full(audio_application_context->server, g_object_unref); } /* default soundcard */ if(audio_application_context->default_soundcard != NULL){ g_object_unref(audio_application_context->default_soundcard); } /* soundcard and export thread */ if(audio_application_context->default_soundcard_thread != NULL){ g_object_unref(audio_application_context->default_soundcard_thread); } if(audio_application_context->default_export_thread != NULL){ g_object_unref(audio_application_context->default_export_thread); } /* soundcard and sequencer */ if(audio_application_context->soundcard != NULL){ g_list_free_full(audio_application_context->soundcard, g_object_unref); } if(audio_application_context->sequencer != NULL){ g_list_free_full(audio_application_context->sequencer, g_object_unref); } /* audio */ if(audio_application_context->audio != NULL){ g_list_free_full(audio_application_context->audio, g_object_unref); } /* sound server */ if(audio_application_context->sound_server != NULL){ g_list_free_full(audio_application_context->sound_server, g_object_unref); } /* osc server */ if(audio_application_context->osc_server != NULL){ g_list_free_full(audio_application_context->osc_server, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_audio_application_context_parent_class)->finalize(gobject); } void ags_audio_application_context_connect(AgsConnectable *connectable) { AgsAudioApplicationContext *audio_application_context; GList *start_soundcard, *soundcard; GList *start_sequencer, *sequencer; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(connectable); if(ags_application_context_test_flags(AGS_APPLICATION_CONTEXT(audio_application_context), AGS_APPLICATION_CONTEXT_CONNECTED)){ return; } ags_audio_application_context_parent_connectable_interface->connect(connectable); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* soundcard */ soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(audio_application_context)); while(soundcard != NULL){ ags_connectable_connect(AGS_CONNECTABLE(soundcard->data)); soundcard = soundcard->next; } g_list_free_full(start_soundcard, g_object_unref); /* sequencer */ sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(audio_application_context->sequencer)); while(sequencer != NULL){ ags_connectable_connect(AGS_CONNECTABLE(sequencer->data)); sequencer = sequencer->next; } g_list_free_full(start_sequencer, g_object_unref); } void ags_audio_application_context_disconnect(AgsConnectable *connectable) { AgsAudioApplicationContext *audio_application_context; GList *start_soundcard, *soundcard; GList *start_sequencer, *sequencer; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(connectable); if(!ags_application_context_test_flags(AGS_APPLICATION_CONTEXT(audio_application_context), AGS_APPLICATION_CONTEXT_CONNECTED)){ return; } ags_audio_application_context_parent_connectable_interface->disconnect(connectable); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* soundcard */ soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(audio_application_context)); while(soundcard != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(soundcard->data)); soundcard = soundcard->next; } g_list_free_full(start_soundcard, g_object_unref); /* sequencer */ sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(audio_application_context->sequencer)); while(sequencer != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(sequencer->data)); sequencer = sequencer->next; } g_list_free_full(start_sequencer, g_object_unref); } AgsThread* ags_audio_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider) { AgsThread *main_loop; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); main_loop = (AgsThread *) application_context->main_loop; if(main_loop != NULL){ g_object_ref(main_loop); } g_rec_mutex_unlock(application_context_mutex); return(main_loop); } void ags_audio_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->main_loop == main_loop){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); } if(main_loop != NULL){ g_object_ref(main_loop); } application_context->main_loop = (GObject *) main_loop; g_rec_mutex_unlock(application_context_mutex); } AgsTaskLauncher* ags_audio_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider) { AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); task_launcher = (AgsThread *) application_context->task_launcher; if(task_launcher != NULL){ g_object_ref(task_launcher); } g_rec_mutex_unlock(application_context_mutex); return(task_launcher); } void ags_audio_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->task_launcher == task_launcher){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); } if(task_launcher != NULL){ g_object_ref(task_launcher); } application_context->task_launcher = (GObject *) task_launcher; g_rec_mutex_unlock(application_context_mutex); } AgsThreadPool* ags_audio_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider) { AgsThreadPool *thread_pool; AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); thread_pool = audio_application_context->thread_pool; if(thread_pool != NULL){ g_object_ref(thread_pool); } g_rec_mutex_unlock(application_context_mutex); return(thread_pool); } void ags_audio_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool) { AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(audio_application_context->thread_pool == thread_pool){ g_rec_mutex_unlock(application_context_mutex); return; } if(audio_application_context->thread_pool != NULL){ g_object_unref(audio_application_context->thread_pool); } if(thread_pool != NULL){ g_object_ref(thread_pool); } audio_application_context->thread_pool = (GObject *) thread_pool; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider) { AgsAudioApplicationContext *audio_application_context; GList *worker; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get worker */ g_rec_mutex_lock(application_context_mutex); worker = g_list_copy_deep(audio_application_context->worker, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(worker); } void ags_audio_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker) { AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* set worker */ g_rec_mutex_lock(application_context_mutex); if(audio_application_context->worker == worker){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(audio_application_context->worker, g_object_unref); audio_application_context->worker = worker; g_rec_mutex_unlock(application_context_mutex); } gboolean ags_audio_application_context_is_operating(AgsServiceProvider *service_provider) { AgsAudioApplicationContext *audio_application_context; gboolean is_operating; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get gui ready */ g_rec_mutex_lock(application_context_mutex); is_operating = audio_application_context->is_operating; g_rec_mutex_unlock(application_context_mutex); return(is_operating); } AgsServerStatus* ags_audio_application_context_server_status(AgsServiceProvider *service_provider) { AgsServerStatus *server_status; AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); server_status = audio_application_context->server_status; if(server_status != NULL){ g_object_ref(server_status); } g_rec_mutex_unlock(application_context_mutex); return(server_status); } AgsRegistry* ags_audio_application_context_get_registry(AgsServiceProvider *service_provider) { AgsRegistry *registry; AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); registry = audio_application_context->registry; if(registry != NULL){ g_object_ref(registry); } g_rec_mutex_unlock(application_context_mutex); return(registry); } void ags_audio_application_context_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry) { AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(audio_application_context->registry == registry){ g_rec_mutex_unlock(application_context_mutex); return; } if(audio_application_context->registry != NULL){ g_object_unref(audio_application_context->registry); } if(registry != NULL){ g_object_ref(registry); } audio_application_context->registry = (GObject *) registry; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_server(AgsServiceProvider *service_provider) { AgsAudioApplicationContext *audio_application_context; GList *server; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* get server */ g_rec_mutex_lock(application_context_mutex); server = g_list_copy_deep(audio_application_context->server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(server); } void ags_audio_application_context_set_server(AgsServiceProvider *service_provider, GList *server) { AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* set server */ g_rec_mutex_lock(application_context_mutex); if(audio_application_context->server == server){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(audio_application_context->server, g_object_unref); audio_application_context->server = server; g_rec_mutex_unlock(application_context_mutex); } GObject* ags_audio_application_context_get_default_soundcard_thread(AgsSoundProvider *sound_provider) { GObject *soundcard_thread; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get default soundcard thread */ g_rec_mutex_lock(application_context_mutex); soundcard_thread = (GObject *) AGS_AUDIO_APPLICATION_CONTEXT(sound_provider)->default_soundcard_thread; if(soundcard_thread != NULL){ g_object_ref(soundcard_thread); } g_rec_mutex_unlock(application_context_mutex); return(soundcard_thread); } void ags_audio_application_context_set_default_soundcard(AgsSoundProvider *sound_provider, GObject *soundcard) { AgsMessageDelivery *message_delivery; AgsApplicationContext *application_context; GList *start_message_queue; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set default soundcard */ g_rec_mutex_lock(application_context_mutex); if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard == soundcard){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard != NULL){ g_object_unref(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard = (GObject *) soundcard; g_rec_mutex_unlock(application_context_mutex); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsSoundProvider::set-default-soundcard"); /* add message */ message = ags_message_envelope_new(G_OBJECT(sound_provider), NULL, doc); /* set parameter */ message->n_params = 1; message->parameter_name = (gchar **) malloc(2 * sizeof(gchar *)); message->value = g_new0(GValue, 1); /* audio channels */ message->parameter_name[0] = "default-soundcard"; g_value_init(&(message->value[0]), G_TYPE_OBJECT); g_value_set_object(&(message->value[0]), soundcard); /* terminate string vector */ message->parameter_name[1] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } GObject* ags_audio_application_context_get_default_soundcard(AgsSoundProvider *sound_provider) { GObject *soundcard; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get default soundcard */ g_rec_mutex_lock(application_context_mutex); soundcard = (GObject *) AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard; if(soundcard != NULL){ g_object_ref(soundcard); } g_rec_mutex_unlock(application_context_mutex); return(soundcard); } void ags_audio_application_context_set_default_soundcard_thread(AgsSoundProvider *sound_provider, GObject *soundcard_thread) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set default soundcard thread */ g_rec_mutex_lock(application_context_mutex); if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard_thread == (AgsThread *) soundcard_thread){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard_thread != NULL){ g_object_unref(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard_thread); } if(soundcard_thread != NULL){ g_object_ref(soundcard_thread); } AGS_AUDIO_APPLICATION_CONTEXT(application_context)->default_soundcard_thread = (AgsThread *) soundcard_thread; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_soundcard(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *soundcard; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get soundcard */ g_rec_mutex_lock(application_context_mutex); soundcard = g_list_copy_deep(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->soundcard, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(soundcard); } void ags_audio_application_context_set_soundcard(AgsSoundProvider *sound_provider, GList *soundcard) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set soundcard */ g_rec_mutex_lock(application_context_mutex); if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->soundcard == soundcard){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->soundcard != NULL){ g_list_free(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->soundcard); } AGS_AUDIO_APPLICATION_CONTEXT(application_context)->soundcard = soundcard; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_sequencer(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *sequencer; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get sequencer */ g_rec_mutex_lock(application_context_mutex); sequencer = g_list_copy_deep(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->sequencer, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(sequencer); } void ags_audio_application_context_set_sequencer(AgsSoundProvider *sound_provider, GList *sequencer) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set sequencer */ g_rec_mutex_lock(application_context_mutex); if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->sequencer == sequencer){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->sequencer != NULL){ g_list_free(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->sequencer); } AGS_AUDIO_APPLICATION_CONTEXT(application_context)->sequencer = sequencer; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_sound_server(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *sound_server; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get sound server */ g_rec_mutex_lock(application_context_mutex); sound_server = g_list_copy_deep(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->sound_server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(sound_server); } void ags_audio_application_context_set_sound_server(AgsSoundProvider *concurrency_provider, GList *sound_server) { AgsAudioApplicationContext *audio_application_context; GRecMutex *application_context_mutex; audio_application_context = AGS_AUDIO_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* set sound_server */ g_rec_mutex_lock(application_context_mutex); if(audio_application_context->sound_server == sound_server){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(audio_application_context->sound_server, g_object_unref); audio_application_context->sound_server = sound_server; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_audio(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *audio; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get audio */ g_rec_mutex_lock(application_context_mutex); audio = g_list_copy_deep(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->audio, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(audio); } void ags_audio_application_context_set_audio(AgsSoundProvider *sound_provider, GList *audio) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set audio */ g_rec_mutex_lock(application_context_mutex); if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->audio == audio){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->audio != NULL){ g_list_free(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->audio); } AGS_AUDIO_APPLICATION_CONTEXT(application_context)->audio = audio; g_rec_mutex_unlock(application_context_mutex); } GList* ags_audio_application_context_get_osc_server(AgsSoundProvider *sound_provider) { AgsApplicationContext *application_context; GList *osc_server; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get osc_server */ g_rec_mutex_lock(application_context_mutex); osc_server = g_list_copy_deep(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->osc_server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(osc_server); } void ags_audio_application_context_set_osc_server(AgsSoundProvider *sound_provider, GList *osc_server) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(sound_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set osc_server */ g_rec_mutex_lock(application_context_mutex); if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->osc_server == osc_server){ g_rec_mutex_unlock(application_context_mutex); return; } if(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->osc_server != NULL){ g_list_free(AGS_AUDIO_APPLICATION_CONTEXT(application_context)->osc_server); } AGS_AUDIO_APPLICATION_CONTEXT(application_context)->osc_server = osc_server; g_rec_mutex_unlock(application_context_mutex); } void ags_audio_application_context_prepare(AgsApplicationContext *application_context) { AgsAudioApplicationContext *audio_application_context; AgsThread *audio_loop; AgsTaskLauncher *task_launcher; GMainContext *server_main_context; GMainContext *audio_main_context; GMainContext *osc_server_main_context; GMainLoop *main_loop; GThread *main_loop_thread; GList *start_queue; audio_application_context = (AgsAudioApplicationContext *) application_context; /* call parent */ // AGS_APPLICATION_CONTEXT_CLASS(ags_audio_application_context_parent_class)->prepare(application_context); /* register types */ ags_application_context_register_types(application_context); /* * fundamental thread setup */ /* server main context and main loop */ server_main_context = g_main_context_new(); g_main_context_ref(server_main_context); audio_application_context->server_main_context = server_main_context; main_loop = g_main_loop_new(server_main_context, TRUE); g_thread_new("Advanced Gtk+ Sequencer - server main loop", ags_audio_application_context_server_main_loop_thread, main_loop); /* audio main context and main loop */ audio_main_context = g_main_context_new(); g_main_context_ref(audio_main_context); audio_application_context->audio_main_context = audio_main_context; main_loop = g_main_loop_new(audio_main_context, TRUE); g_thread_new("Advanced Gtk+ Sequencer - audio main loop", ags_audio_application_context_audio_main_loop_thread, main_loop); /* OSC server main context and main loop */ osc_server_main_context = g_main_context_new(); g_main_context_ref(osc_server_main_context); audio_application_context->osc_server_main_context = osc_server_main_context; g_main_loop_new(osc_server_main_context, TRUE); /* AgsAudioLoop */ audio_loop = (AgsThread *) ags_audio_loop_new(); g_object_ref(audio_loop); application_context->main_loop = (GObject *) audio_loop; ags_connectable_connect(AGS_CONNECTABLE(audio_loop)); /* AgsTaskLauncher */ task_launcher = ags_task_launcher_new(); g_object_ref(task_launcher); application_context->task_launcher = (GObject *) task_launcher; ags_connectable_connect(AGS_CONNECTABLE(task_launcher)); ags_task_launcher_attach(task_launcher, audio_main_context); /* start audio loop and thread pool*/ ags_thread_start(audio_loop); /* wait for audio loop */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(audio_loop)); if(!ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE)){ ags_thread_set_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT); while(ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(audio_loop, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(AGS_THREAD_GET_START_COND(audio_loop), AGS_THREAD_GET_START_MUTEX(audio_loop)); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(audio_loop)); } void ags_audio_application_context_setup(AgsApplicationContext *application_context) { AgsAudioApplicationContext *audio_application_context; AgsJackServer *jack_server; AgsPulseServer *pulse_server; AgsCoreAudioServer *core_audio_server; AgsOscServer *osc_server; AgsLadspaManager *ladspa_manager; AgsDssiManager *dssi_manager; AgsLv2Manager *lv2_manager; AgsLv2uiManager *lv2ui_manager; AgsLv2WorkerManager *lv2_worker_manager; AgsServer *server; AgsThread *main_loop; AgsThread *soundcard_thread; AgsThread *export_thread; AgsThread *sequencer_thread; AgsDestroyWorker *destroy_worker; AgsTaskLauncher *task_launcher; AgsMessageDelivery *message_delivery; AgsMessageQueue *message_queue; AgsMessageQueue *audio_message_queue; AgsLog *log; AgsConfig *config; GObject *soundcard; GObject *sequencer; GList *list; #ifndef AGS_W32API struct passwd *pw; uid_t uid; #endif gchar *blacklist_path; gchar *blacklist_filename; gchar *server_group; gchar *soundcard_group; gchar *sequencer_group; gchar *osc_server_group; gchar *str; gchar *capability; #if defined AGS_W32API gchar *app_dir; #endif guint i; gboolean has_core_audio; gboolean has_pulse; gboolean has_jack; gboolean is_output; GRecMutex *application_context_mutex; audio_application_context = (AgsAudioApplicationContext *) application_context; /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(audio_application_context); /* config and log */ config = ags_config_get_instance(); log = ags_log_get_instance(); /* main loop and task launcher */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); atexit(ags_audio_application_context_signal_cleanup); /* Ignore interactive and job-control signals. */ #ifndef AGS_W32API signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTTOU, SIG_IGN); signal(SIGCHLD, SIG_IGN); #ifndef AGS_W32API ags_sigact.sa_handler = ags_audio_application_context_signal_handler; sigemptyset(&ags_sigact.sa_mask); ags_sigact.sa_flags = 0; sigaction(SIGINT, &ags_sigact, (struct sigaction *) NULL); sigaction(SA_RESTART, &ags_sigact, (struct sigaction *) NULL); #endif #endif /* get user information */ #if defined AGS_W32API application_context = ags_application_context_get_instance(); if(strlen(application_context->argv[0]) > strlen("gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("gsequencer.exe")); }else{ app_dir = NULL; } blacklist_path = g_strdup_printf("%s\\%s", g_get_current_dir(), app_dir); g_free(app_dir); #else uid = getuid(); pw = getpwuid(uid); blacklist_path = g_strdup_printf("%s/%s", pw->pw_dir, AGS_DEFAULT_DIRECTORY); #endif /* message delivery */ message_delivery = ags_message_delivery_get_instance(); message_queue = ags_message_queue_new("libags"); ags_message_delivery_add_message_queue(message_delivery, (GObject *) message_queue); /* load ladspa manager */ ladspa_manager = ags_ladspa_manager_get_instance(); blacklist_filename = g_strdup_printf("%s%c%s", blacklist_path, G_DIR_SEPARATOR, "ladspa_plugin.blacklist"); ags_ladspa_manager_load_blacklist(ladspa_manager, blacklist_filename); ags_log_add_message(log, "* Loading LADSPA plugins"); ags_ladspa_manager_load_default_directory(ladspa_manager); /* load dssi manager */ dssi_manager = ags_dssi_manager_get_instance(); blacklist_filename = g_strdup_printf("%s%c%s", blacklist_path, G_DIR_SEPARATOR, "dssi_plugin.blacklist"); ags_dssi_manager_load_blacklist(dssi_manager, blacklist_filename); ags_log_add_message(log, "* Loading DSSI plugins"); ags_dssi_manager_load_default_directory(dssi_manager); /* load lv2 manager */ lv2_manager = ags_lv2_manager_get_instance(); lv2_worker_manager = ags_lv2_worker_manager_get_instance(); blacklist_filename = g_strdup_printf("%s%c%s", blacklist_path, G_DIR_SEPARATOR, "lv2_plugin.blacklist"); ags_lv2_manager_load_blacklist(lv2_manager, blacklist_filename); ags_log_add_message(log, "* Loading Lv2 plugins"); ags_lv2_manager_load_default_directory(lv2_manager); /* launch audio */ ags_log_add_message(log, "* Launch audio"); /* sound server */ audio_application_context->sound_server = NULL; /* core audio server */ core_audio_server = ags_core_audio_server_new(NULL); audio_application_context->sound_server = g_list_append(audio_application_context->sound_server, core_audio_server); g_object_ref(G_OBJECT(core_audio_server)); has_core_audio = FALSE; /* pulse server */ pulse_server = ags_pulse_server_new(NULL); audio_application_context->sound_server = g_list_append(audio_application_context->sound_server, pulse_server); g_object_ref(G_OBJECT(pulse_server)); has_pulse = FALSE; /* jack server */ jack_server = ags_jack_server_new(NULL); audio_application_context->sound_server = g_list_append(audio_application_context->sound_server, jack_server); g_object_ref(G_OBJECT(jack_server)); has_jack = FALSE; /* AgsSoundcard */ audio_application_context->soundcard = NULL; soundcard = NULL; soundcard_group = g_strdup("soundcard"); for(i = 0; ; i++){ guint pcm_channels, buffer_size, samplerate, format; guint cache_buffer_size; gboolean use_cache; if(!g_key_file_has_group(config->key_file, soundcard_group)){ if(i == 0){ g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; }else{ break; } } str = ags_config_get_value(config, soundcard_group, "backend"); capability = ags_config_get_value(config, soundcard_group, "capability"); is_output = TRUE; if(capability != NULL && !g_ascii_strncasecmp(capability, "capture", 8)){ is_output = FALSE; } /* change soundcard */ if(str != NULL){ if(!g_ascii_strncasecmp(str, "core-audio", 11)){ soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(core_audio_server), is_output); has_core_audio = TRUE; }else if(!g_ascii_strncasecmp(str, "pulse", 6)){ soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(pulse_server), is_output); has_pulse = TRUE; }else if(!g_ascii_strncasecmp(str, "jack", 5)){ if(!is_output){ AgsJackClient *input_client; g_object_get(jack_server, "input-jack-client", &input_client, NULL); if(input_client == NULL){ input_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "input-jack-client", input_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) input_client); ags_jack_client_open((AgsJackClient *) input_client, "ags-input-client"); }else{ g_object_unref(input_client); } } soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(jack_server), is_output); has_jack = TRUE; }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ if(is_output){ soundcard = (GObject *) ags_devout_new((GObject *) audio_application_context); AGS_DEVOUT(soundcard)->flags &= (~AGS_DEVOUT_OSS); AGS_DEVOUT(soundcard)->flags |= AGS_DEVOUT_ALSA; }else{ soundcard = (GObject *) ags_devin_new((GObject *) audio_application_context); AGS_DEVIN(soundcard)->flags &= (~AGS_DEVIN_OSS); AGS_DEVIN(soundcard)->flags |= AGS_DEVIN_ALSA; } }else if(!g_ascii_strncasecmp(str, "wasapi", 7)){ gchar *str; if(is_output){ soundcard = (GObject *) ags_wasapi_devout_new((GObject *) audio_application_context); str = ags_config_get_value(config, soundcard_group, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ ags_wasapi_devout_set_flags(AGS_WASAPI_DEVOUT(soundcard), AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE); }else{ ags_wasapi_devout_unset_flags(AGS_WASAPI_DEVOUT(soundcard), AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE); } g_free(str); str = ags_config_get_value(config, soundcard_group, "wasapi-buffer-size"); if(str != NULL){ AGS_WASAPI_DEVOUT(soundcard)->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } }else{ soundcard = (GObject *) ags_wasapi_devin_new((GObject *) audio_application_context); str = ags_config_get_value(config, soundcard_group, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ ags_wasapi_devin_set_flags(AGS_WASAPI_DEVIN(soundcard), AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE); }else{ ags_wasapi_devin_unset_flags(AGS_WASAPI_DEVIN(soundcard), AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE); } g_free(str); str = ags_config_get_value(config, soundcard_group, "wasapi-buffer-size"); if(str != NULL){ AGS_WASAPI_DEVIN(soundcard)->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } } }else if(!g_ascii_strncasecmp(str, "oss", 4)){ if(is_output){ soundcard = (GObject *) ags_devout_new((GObject *) audio_application_context); AGS_DEVOUT(soundcard)->flags &= (~AGS_DEVOUT_ALSA); AGS_DEVOUT(soundcard)->flags |= AGS_DEVOUT_OSS; }else{ soundcard = (GObject *) ags_devin_new((GObject *) audio_application_context); AGS_DEVIN(soundcard)->flags &= (~AGS_DEVIN_ALSA); AGS_DEVIN(soundcard)->flags |= AGS_DEVIN_OSS; } }else{ g_warning(i18n("unknown soundcard backend - %s"), str); g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; } }else{ g_warning(i18n("unknown soundcard backend - NULL")); g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; } audio_application_context->soundcard = g_list_append(audio_application_context->soundcard, soundcard); g_object_ref(soundcard); /* device */ str = ags_config_get_value(config, soundcard_group, "device"); if(str != NULL){ ags_soundcard_set_device(AGS_SOUNDCARD(soundcard), str); g_free(str); } /* presets */ pcm_channels = AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS; buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; format = AGS_SOUNDCARD_DEFAULT_FORMAT; str = ags_config_get_value(config, soundcard_group, "pcm-channels"); if(str != NULL){ pcm_channels = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "buffer-size"); if(str != NULL){ buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "samplerate"); if(str != NULL){ samplerate = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "format"); if(str != NULL){ format = g_ascii_strtoull(str, NULL, 10); g_free(str); } ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), pcm_channels, samplerate, buffer_size, format); use_cache = TRUE; str = ags_config_get_value(config, soundcard_group, "use-cache"); if(str != NULL && !g_strncasecmp(str, "false", 5)){ use_cache = FALSE; } cache_buffer_size = 4096; str = ags_config_get_value(config, soundcard_group, "cache-buffer-size"); if(str != NULL){ cache_buffer_size = g_ascii_strtoull(str, NULL, 10); } if(AGS_IS_PULSE_DEVOUT(soundcard)){ GList *start_port, *port; g_object_get(soundcard, "pulse-port", &start_port, NULL); port = start_port; while(port != NULL){ ags_pulse_port_set_samplerate(port->data, samplerate); ags_pulse_port_set_pcm_channels(port->data, pcm_channels); ags_pulse_port_set_buffer_size(port->data, buffer_size); ags_pulse_port_set_format(port->data, format); ags_pulse_port_set_cache_buffer_size(port->data, buffer_size * ceil(cache_buffer_size / buffer_size)); port = port->next; } g_list_free_full(start_port, g_object_unref); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ GList *start_port, *port; g_object_get(soundcard, "core_audio-port", &start_port, NULL); port = start_port; while(port != NULL){ ags_core_audio_port_set_samplerate(port->data, samplerate); ags_core_audio_port_set_pcm_channels(port->data, pcm_channels); ags_core_audio_port_set_buffer_size(port->data, buffer_size); ags_core_audio_port_set_format(port->data, format); ags_core_audio_port_set_cache_buffer_size(port->data, buffer_size * ceil(cache_buffer_size / buffer_size)); port = port->next; } g_list_free_full(start_port, g_object_unref); } g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); } if(audio_application_context->soundcard != NULL){ soundcard = audio_application_context->soundcard->data; } g_free(soundcard_group); ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(audio_application_context), soundcard); /* AgsSequencer */ audio_application_context->sequencer = NULL; sequencer = NULL; sequencer_group = g_strdup("sequencer"); for(i = 0; ; i++){ guint pcm_channels, buffer_size, samplerate, format; if(!g_key_file_has_group(config->key_file, sequencer_group)){ if(i == 0){ g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; }else{ break; } } str = ags_config_get_value(config, sequencer_group, "backend"); /* change sequencer */ if(str != NULL){ if(!g_ascii_strncasecmp(str, "jack", 5)){ AgsJackClient *input_client; g_object_get(jack_server, "input-jack-client", &input_client, NULL); if(input_client == NULL){ input_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "input-jack-client", input_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) input_client); ags_jack_client_open((AgsJackClient *) input_client, "ags-input-client"); }else{ g_object_unref(input_client); } sequencer = ags_sound_server_register_sequencer(AGS_SOUND_SERVER(jack_server), FALSE); has_jack = TRUE; }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ sequencer = (GObject *) ags_midiin_new((GObject *) audio_application_context); AGS_MIDIIN(sequencer)->flags &= (~AGS_MIDIIN_OSS); AGS_MIDIIN(sequencer)->flags |= AGS_MIDIIN_ALSA; }else if(!g_ascii_strncasecmp(str, "oss", 4)){ sequencer = (GObject *) ags_midiin_new((GObject *) audio_application_context); AGS_MIDIIN(sequencer)->flags &= (~AGS_MIDIIN_ALSA); AGS_MIDIIN(sequencer)->flags |= AGS_MIDIIN_OSS; }else{ g_warning(i18n("unknown sequencer backend - %s"), str); g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; } }else{ g_warning(i18n("unknown sequencer backend - NULL")); g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; } audio_application_context->sequencer = g_list_append(audio_application_context->sequencer, sequencer); g_object_ref(sequencer); /* device */ str = ags_config_get_value(config, sequencer_group, "device"); if(str != NULL){ ags_sequencer_set_device(AGS_SEQUENCER(sequencer), str); g_free(str); } g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); } g_free(sequencer_group); /* AgsServer */ audio_application_context->server = NULL; server = NULL; server_group = g_strdup("server"); for(i = 0; ; i++){ gchar *ip4, *ip6; guint server_port; gboolean auto_start; gboolean any_address; gboolean enable_ip4, enable_ip6; if(!g_key_file_has_group(config->key_file, server_group)){ if(i == 0){ g_free(server_group); server_group = g_strdup_printf("%s-%d", AGS_CONFIG_SERVER, i); continue; }else{ break; } } server = ags_server_new(); audio_application_context->server = g_list_append(audio_application_context->server, server); g_object_ref(server); /* realm */ str = ags_config_get_value(config, server_group, "realm"); if(str != NULL){ g_object_set(server, "realm", str, NULL); g_free(str); } /* any address */ any_address = FALSE; str = ags_config_get_value(config, server_group, "any-address"); if(str != NULL){ any_address = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(any_address){ ags_server_set_flags(server, (AGS_SERVER_ANY_ADDRESS)); } /* enable ip4 and ip6 */ enable_ip4 = FALSE; enable_ip6 = FALSE; str = ags_config_get_value(config, server_group, "enable-ip4"); if(str != NULL){ enable_ip4 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } str = ags_config_get_value(config, server_group, "enable-ip6"); if(str != NULL){ enable_ip6 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(enable_ip4){ ags_server_set_flags(server, (AGS_SERVER_INET4)); } if(enable_ip6){ ags_server_set_flags(server, (AGS_SERVER_INET6)); } /* ip4 and ip6 address */ str = ags_config_get_value(config, server_group, "ip4-address"); if(str != NULL){ g_object_set(server, "ip4", str, NULL); g_free(str); } str = ags_config_get_value(config, server_group, "ip6-address"); if(str != NULL){ g_object_set(server, "ip6", str, NULL); g_free(str); } /* server port */ str = ags_config_get_value(config, server_group, "server-port"); if(str != NULL){ server_port = (guint) g_ascii_strtoull(str, NULL, 10); g_object_set(server, "server-port", server_port, NULL); } /* auto-start */ auto_start = FALSE; str = ags_config_get_value(config, server_group, "auto-start"); if(str != NULL){ auto_start = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(auto_start){ ags_server_set_flags(server, AGS_SERVER_AUTO_START); } g_free(server_group); server_group = g_strdup_printf("%s-%d", AGS_CONFIG_SERVER, i); } if(server == NULL){ server = ags_server_new(); ags_server_set_flags(server, (AGS_SERVER_INET4)); audio_application_context->server = g_list_append(audio_application_context->server, server); g_object_ref(server); } /* AgsSoundcardThread and AgsExportThread */ audio_application_context->default_soundcard_thread = NULL; list = audio_application_context->soundcard; while(list != NULL){ guint soundcard_capability; soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(list->data)); soundcard_thread = (AgsThread *) ags_soundcard_thread_new(list->data, soundcard_capability); ags_thread_add_child_extended(main_loop, (AgsThread *) soundcard_thread, TRUE, TRUE); /* export thread */ export_thread = NULL; /* export thread */ if(AGS_IS_DEVOUT(list->data) || AGS_IS_WASAPI_DEVOUT(list->data) || AGS_IS_JACK_DEVOUT(list->data) || AGS_IS_PULSE_DEVOUT(list->data) || AGS_IS_CORE_AUDIO_DEVOUT(list->data)){ export_thread = (AgsThread *) ags_export_thread_new(list->data, NULL); ags_thread_add_child_extended(main_loop, (AgsThread *) export_thread, TRUE, TRUE); } /* default soundcard thread */ if(audio_application_context->default_soundcard_thread == NULL){ ags_sound_provider_set_default_soundcard_thread(AGS_SOUND_PROVIDER(audio_application_context), (GObject *) soundcard_thread); } /* default export thread */ if(export_thread != NULL){ if(audio_application_context->default_export_thread == NULL){ audio_application_context->default_export_thread = export_thread; }else{ g_object_unref(export_thread); } } /* iterate */ list = list->next; } /* AgsSequencerThread */ list = audio_application_context->sequencer; while(list != NULL){ sequencer_thread = (AgsThread *) ags_sequencer_thread_new(list->data); ags_thread_add_child_extended(main_loop, (AgsThread *) sequencer_thread, TRUE, TRUE); list = list->next; } /* AgsOscServer */ audio_application_context->osc_server = NULL; osc_server = NULL; osc_server_group = g_strdup("osc-server"); for(i = 0; ; i++){ gchar *ip4, *ip6; guint server_port; gboolean auto_start; gboolean any_address; gboolean enable_ip4, enable_ip6; if(!g_key_file_has_group(config->key_file, osc_server_group)){ if(i == 0){ g_free(osc_server_group); osc_server_group = g_strdup_printf("%s-%d", AGS_CONFIG_OSC_SERVER, i); continue; }else{ break; } } osc_server = ags_osc_server_new(); ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_TCP)); audio_application_context->osc_server = g_list_append(audio_application_context->osc_server, osc_server); g_object_ref(osc_server); /* any address */ any_address = FALSE; str = ags_config_get_value(config, osc_server_group, "any-address"); if(str != NULL){ any_address = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(any_address){ ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_ANY_ADDRESS)); } /* enable ip4 and ip6 */ enable_ip4 = FALSE; enable_ip6 = FALSE; str = ags_config_get_value(config, osc_server_group, "enable-ip4"); if(str != NULL){ enable_ip4 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } str = ags_config_get_value(config, osc_server_group, "enable-ip6"); if(str != NULL){ enable_ip6 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(enable_ip4){ ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET4)); } if(enable_ip6){ ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET6)); } ags_osc_server_add_default_controller(osc_server); /* ip4 and ip6 address */ str = ags_config_get_value(config, osc_server_group, "ip4-address"); if(str != NULL){ g_object_set(osc_server, "ip4", str, NULL); g_free(str); } str = ags_config_get_value(config, osc_server_group, "ip6-address"); if(str != NULL){ g_object_set(osc_server, "ip6", str, NULL); g_free(str); } /* server port */ str = ags_config_get_value(config, osc_server_group, "server-port"); if(str != NULL){ server_port = (guint) g_ascii_strtoull(str, NULL, 10); g_object_set(osc_server, "server-port", server_port, NULL); } /* auto-start */ auto_start = FALSE; str = ags_config_get_value(config, osc_server_group, "auto-start"); if(str != NULL){ auto_start = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(auto_start){ ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_AUTO_START); } g_free(osc_server_group); osc_server_group = g_strdup_printf("%s-%d", AGS_CONFIG_OSC_SERVER, i); } if(osc_server == NULL){ osc_server = ags_osc_server_new(); ags_osc_server_set_flags(osc_server, (AGS_OSC_SERVER_INET4 | AGS_OSC_SERVER_TCP)); ags_osc_server_add_default_controller(osc_server); audio_application_context->osc_server = g_list_append(audio_application_context->osc_server, osc_server); g_object_ref(osc_server); } /* AgsWorkerThread */ audio_application_context->worker = NULL; /* AgsDestroyWorker */ destroy_worker = ags_destroy_worker_get_instance(); ags_thread_add_child_extended(main_loop, (AgsThread *) destroy_worker, TRUE, TRUE); audio_application_context->worker = g_list_prepend(audio_application_context->worker, destroy_worker); ags_thread_start((AgsThread *) destroy_worker); /* AgsThreadPool */ audio_application_context->thread_pool = NULL; /* launch */ if(has_core_audio){ ags_core_audio_server_connect_client(core_audio_server); } if(has_pulse){ ags_pulse_server_connect_client(pulse_server); ags_pulse_server_start_poll(pulse_server); } if(has_jack){ ags_jack_server_connect_client(jack_server); } /* set operating */ g_rec_mutex_lock(application_context_mutex); audio_application_context->is_operating = TRUE; g_rec_mutex_unlock(application_context_mutex); /* unref */ g_object_unref(main_loop); g_object_unref(task_launcher); } void ags_audio_application_context_set_value_callback(AgsConfig *config, gchar *group, gchar *key, gchar *value, AgsAudioApplicationContext *audio_application_context) { if(!strncmp(group, AGS_CONFIG_SOUNDCARD, 7)){ AgsSoundcard *soundcard; if(audio_application_context == NULL || audio_application_context->soundcard == NULL){ return; } soundcard = audio_application_context->soundcard->data; if(!strncmp(key, "samplerate", 10)){ guint samplerate; samplerate = strtoul(value, NULL, 10); g_object_set(G_OBJECT(soundcard), "frequency", samplerate, NULL); }else if(!strncmp(key, "buffer-size", 11)){ guint buffer_size; buffer_size = strtoul(value, NULL, 10); g_object_set(G_OBJECT(soundcard), "buffer-size", buffer_size, NULL); }else if(!strncmp(key, "pcm-channels", 12)){ guint pcm_channels; pcm_channels = strtoul(value, NULL, 10); g_object_set(G_OBJECT(soundcard), "pcm-channels", pcm_channels, NULL); }else if(!strncmp(key, "dsp-channels", 12)){ guint dsp_channels; dsp_channels = strtoul(value, NULL, 10); g_object_set(G_OBJECT(soundcard), "dsp-channels", dsp_channels, NULL); }else if(!strncmp(key, "alsa-handle", 11)){ gchar *alsa_handle; alsa_handle = value; g_object_set(G_OBJECT(soundcard), "device", alsa_handle, NULL); } } } void ags_audio_application_context_register_types(AgsApplicationContext *application_context) { ags_audio_loop_get_type(); ags_soundcard_thread_get_type(); ags_export_thread_get_type(); /* register recalls */ ags_play_audio_get_type(); ags_play_channel_get_type(); ags_play_channel_run_get_type(); ags_play_channel_run_master_get_type(); ags_stream_channel_get_type(); ags_stream_channel_run_get_type(); ags_loop_channel_get_type(); ags_loop_channel_run_get_type(); ags_copy_channel_get_type(); ags_copy_channel_run_get_type(); ags_volume_channel_get_type(); ags_volume_channel_run_get_type(); ags_peak_channel_get_type(); ags_peak_channel_run_get_type(); ags_recall_ladspa_get_type(); ags_generic_recall_channel_run_get_type(); ags_recall_ladspa_run_get_type(); ags_delay_audio_get_type(); ags_delay_audio_run_get_type(); ags_count_beats_audio_get_type(); ags_count_beats_audio_run_get_type(); ags_copy_pattern_audio_get_type(); ags_copy_pattern_audio_run_get_type(); ags_copy_pattern_channel_get_type(); ags_copy_pattern_channel_run_get_type(); ags_buffer_channel_get_type(); ags_buffer_channel_run_get_type(); ags_play_notation_audio_get_type(); ags_play_notation_audio_run_get_type(); } void ags_audio_application_context_quit(AgsApplicationContext *application_context) { AgsLadspaManager *ladspa_manager; AgsDssiManager *dssi_manager; AgsLv2Manager *lv2_manager; AgsCoreAudioServer *core_audio_server; AgsPulseServer *pulse_server; AgsJackServer *jack_server; AgsConfig *config; GList *core_audio_client; GList *jack_client; GList *start_list, *list; gchar *filename; gchar *str; gboolean autosave_thread_enabled; config = application_context->config; /* autosave thread */ str = ags_config_get_value(config, AGS_CONFIG_GENERIC, "autosave-thread"); autosave_thread_enabled = (str != NULL && !g_ascii_strncasecmp(str, "true", 8)) ? TRUE: FALSE; /* free managers */ ladspa_manager = ags_ladspa_manager_get_instance(); g_object_unref(ladspa_manager); dssi_manager = ags_dssi_manager_get_instance(); g_object_unref(dssi_manager); lv2_manager = ags_lv2_manager_get_instance(); g_object_unref(lv2_manager); /* retrieve core audio server */ list = start_list = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); while((list = ags_list_util_find_type(list, AGS_TYPE_CORE_AUDIO_SERVER)) != NULL){ core_audio_server = list->data; /* close client */ core_audio_client = core_audio_server->client; while(core_audio_client != NULL){ #ifdef AGS_WITH_CORE_AUDIO AUGraphStop(AGS_CORE_AUDIO_CLIENT(core_audio_client->data)->graph); #endif core_audio_client = core_audio_client->next; } list = list->next; } g_list_free_full(start_list, g_object_unref); /* retrieve pulseaudio server */ list = start_list = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); while((list = ags_list_util_find_type(list, AGS_TYPE_PULSE_SERVER)) != NULL){ pulse_server = list->data; #ifdef AGS_WITH_PULSE pa_mainloop_quit(pulse_server->main_loop, 0); #endif list = list->next; } g_list_free_full(start_list, g_object_unref); /* retrieve JACK server */ list = start_list = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); if((list = ags_list_util_find_type(list, AGS_TYPE_JACK_SERVER)) != NULL){ jack_server = list->data; /* close client */ jack_client = jack_server->client; while(jack_client != NULL){ #ifdef AGS_WITH_JACK jack_client_close(AGS_JACK_CLIENT(jack_client->data)->client); #endif jack_client = jack_client->next; } list = list->next; } g_list_free_full(start_list, g_object_unref); exit(0); } void ags_audio_application_context_read(AgsFile *file, xmlNode *node, GObject **application_context) { //TODO:JK: implement me } xmlNode* ags_audio_application_context_write(AgsFile *file, xmlNode *parent, GObject *application_context) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void* ags_audio_application_context_server_main_loop_thread(GMainLoop *main_loop) { AgsApplicationContext *application_context; GList *start_list, *list; #ifdef AGS_WITH_RT AgsPriority *priority; struct sched_param param; gchar *str; #endif g_main_context_push_thread_default(g_main_loop_get_context(main_loop)); application_context = ags_application_context_get_instance(); while(!ags_service_provider_is_operating(AGS_SERVICE_PROVIDER(application_context))){ g_usleep(G_USEC_PER_SEC / 30); } /* real-time setup */ #ifdef AGS_WITH_RT priority = ags_priority_get_instance(); param.sched_priority = 15; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_SERVER_MAIN_LOOP); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); #endif list = start_list = ags_service_provider_get_server(AGS_SERVICE_PROVIDER(application_context)); while(list != NULL){ if(ags_server_test_flags(list->data, AGS_SERVER_AUTO_START)){ ags_server_start(AGS_SERVER(list->data)); } list = list->next; } g_list_free_full(start_list, g_object_unref); g_main_loop_run(main_loop); g_thread_exit(NULL); return(NULL); } void* ags_audio_application_context_audio_main_loop_thread(GMainLoop *main_loop) { AgsApplicationContext *application_context; GList *start_list, *list; #ifdef AGS_WITH_RT AgsPriority *priority; struct sched_param param; gchar *str; #endif g_main_context_push_thread_default(g_main_loop_get_context(main_loop)); application_context = ags_application_context_get_instance(); while(!ags_service_provider_is_operating(AGS_SERVICE_PROVIDER(application_context))){ g_usleep(G_USEC_PER_SEC / 30); } /* real-time setup */ #ifdef AGS_WITH_RT priority = ags_priority_get_instance(); param.sched_priority = 95; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO_MAIN_LOOP); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); #endif list = start_list = ags_sound_provider_get_osc_server(AGS_SERVICE_PROVIDER(application_context)); while(list != NULL){ if(ags_osc_server_test_flags(list->data, AGS_OSC_SERVER_AUTO_START)){ ags_osc_server_start(AGS_OSC_SERVER(list->data)); } list = list->next; } g_list_free_full(start_list, g_object_unref); g_main_loop_run(main_loop); g_thread_exit(NULL); return(NULL); } AgsAudioApplicationContext* ags_audio_application_context_new() { AgsAudioApplicationContext *audio_application_context; audio_application_context = (AgsAudioApplicationContext *) g_object_new(AGS_TYPE_AUDIO_APPLICATION_CONTEXT, NULL); return(audio_application_context); } gsequencer-3.1.3/ags/audio/ags_recall.c0000644000175000017500000044643613616617253014746 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_class_init(AgsRecallClass *recall_class); void ags_recall_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_init(AgsRecall *recall); void ags_recall_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_dispose(GObject *gobject); void ags_recall_finalize(GObject *gobject); AgsUUID* ags_recall_get_uuid(AgsConnectable *connectable); gboolean ags_recall_has_resource(AgsConnectable *connectable); gboolean ags_recall_is_ready(AgsConnectable *connectable); void ags_recall_add_to_registry(AgsConnectable *connectable); void ags_recall_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_recall_list_resource(AgsConnectable *connectable); xmlNode* ags_recall_xml_compose(AgsConnectable *connectable); void ags_recall_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_recall_is_connected(AgsConnectable *connectable); void ags_recall_connect(AgsConnectable *connectable); void ags_recall_disconnect(AgsConnectable *connectable); void ags_recall_real_resolve_dependency(AgsRecall *recall); void ags_recall_real_check_rt_data(AgsRecall *recall); void ags_recall_real_run_init_pre(AgsRecall *recall); void ags_recall_real_run_init_inter(AgsRecall *recall); void ags_recall_real_run_init_post(AgsRecall *recall); void ags_recall_real_feed_input_queue(AgsRecall *recall); void ags_recall_real_automate(AgsRecall *recall); void ags_recall_real_run_pre(AgsRecall *recall); void ags_recall_real_run_inter(AgsRecall *recall); void ags_recall_real_run_post(AgsRecall *recall); void ags_recall_real_do_feedback(AgsRecall *recall); void ags_recall_real_feed_output_queue(AgsRecall *recall); void ags_recall_real_stop_persistent(AgsRecall *recall); void ags_recall_real_cancel(AgsRecall *recall); void ags_recall_real_done(AgsRecall *recall); AgsRecall* ags_recall_real_duplicate(AgsRecall *reall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); void ags_recall_child_done(AgsRecall *child, AgsRecall *parent); /** * SECTION:ags_recall * @short_description: The recall base class * @title: AgsRecall * @section_id: * @include: ags/audio/ags_recall.h * * #AgsRecall acts as effect processor. */ enum{ PLAY_RESOLVE_DEPENDENCY, PLAY_CHECK_RT_DATA, PLAY_RUN_INIT_PRE, PLAY_RUN_INIT_INTER, PLAY_RUN_INIT_POST, PLAY_FEED_INPUT_QUEUE, PLAY_AUTOMATE, PLAY_RUN_PRE, PLAY_RUN_INTER, PLAY_RUN_POST, PLAY_DO_FEEDBACK, PLAY_FEED_OUTPUT_QUEUE, PLAY_STOP_PERSISTENT, PLAY_CANCEL, PLAY_DONE, PLAY_DUPLICATE, PLAY_NOTIFY_DEPENDENCY, CHILD_ADDED, LAST_SIGNAL, }; enum{ PROP_0, PROP_FILENAME, PROP_EFFECT, PROP_EFFECT_INDEX, PROP_RECALL_CONTAINER, PROP_OUTPUT_SOUNDCARD, PROP_OUTPUT_SOUNDCARD_CHANNEL, PROP_INPUT_SOUNDCARD, PROP_INPUT_SOUNDCARD_CHANNEL, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_PAD, PROP_AUDIO_CHANNEL, PROP_LINE, PROP_PORT, PROP_AUTOMATION_PORT, PROP_RECALL_ID, PROP_RECALL_DEPENDENCY, PROP_PARENT, PROP_CHILD_TYPE, PROP_CHILD, }; static gpointer ags_recall_parent_class = NULL; static guint recall_signals[LAST_SIGNAL]; static gboolean ags_recall_global_children_lock_free = FALSE; static gboolean ags_recall_global_omit_event = TRUE; static gboolean ags_recall_global_performance_mode = FALSE; static gboolean ags_recall_global_rt_safe = FALSE; GType ags_recall_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall = 0; static const GTypeInfo ags_recall_info = { sizeof (AgsRecallClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecall), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall = g_type_register_static(G_TYPE_OBJECT, "AgsRecall", &ags_recall_info, 0); g_type_add_interface_static(ags_type_recall, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall); } return g_define_type_id__volatile; } void ags_recall_class_init(AgsRecallClass *recall) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_parent_class = g_type_class_peek_parent(recall); /* GObjectClass */ gobject = (GObjectClass *) recall; gobject->set_property = ags_recall_set_property; gobject->get_property = ags_recall_get_property; gobject->dispose = ags_recall_dispose; gobject->finalize = ags_recall_finalize; /* properties */ /** * AgsRecall:filename: * * The plugin's filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the object file"), i18n_pspec("The filename as string of object file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecall:effect: * * The plugin's effect. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsRecall:effect-index: * * The effect's index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("effect-index", i18n_pspec("index of effect"), i18n_pspec("The numerical index of effect"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT_INDEX, param_spec); /** * AgsRecall:recall-container: * * The #AgsRecallContainer packed into. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-container", i18n_pspec("container of recall"), i18n_pspec("The container which this recall is packed into"), AGS_TYPE_RECALL_CONTAINER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CONTAINER, param_spec); /** * AgsRecall:output-soundcard: * * The assigned soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-soundcard", i18n_pspec("output soundcard"), i18n_pspec("The output soundcard which this recall is packed into"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD, param_spec); /** * AgsRecall:output-soundcard-channel: * * The output soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("output-soundcard-channel", i18n_pspec("output soundcard channel"), i18n_pspec("The output soundcard channel"), -1, G_MAXINT32, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsRecall:input-soundcard: * * The assigned soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-soundcard", i18n_pspec("input soundcard"), i18n_pspec("The input soundcard which this recall is packed into"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD, param_spec); /** * AgsRecall:input-soundcard-channel: * * The input soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("input-soundcard-channel", i18n_pspec("input soundcard channel"), i18n_pspec("The input soundcard channel"), -1, G_MAXINT32, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsRecall:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsRecall:buffer-size: * * The buffer size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsRecall:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsRecall:pad: * * The nth pad. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pad", i18n_pspec("nth pad"), i18n_pspec("The nth pad"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PAD, param_spec); /** * AgsRecall:audio-channel: * * The nth audio channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("nth audio channel"), i18n_pspec("The nth audio channel"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsRecall:line: * * The nth line. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("line", i18n_pspec("nth line"), i18n_pspec("The nth line"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINE, param_spec); /** * AgsRecall:port: (type GList(AgsPort)) (transfer full) * * The assigned #AgsPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port", i18n_pspec("port of recall"), i18n_pspec("The port of recall"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); /** * AgsRecall:automation-port: (type GList(AgsPort)) (transfer full) * * The #AgsPort doing automation. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("autamation-port", i18n_pspec("automation port"), i18n_pspec("The port doing automation"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUTOMATION_PORT, param_spec); /** * AgsRecall:recall-id: * * The #AgsRecallID running in. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-id", i18n_pspec("run id of recall"), i18n_pspec("The recall id of the recall"), AGS_TYPE_RECALL_ID, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_ID, param_spec); /** * AgsRecall:recall-dependency: (type GList(AgsRecallDependency)) (transfer full) * * The #AgsRecallDependency. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-dependency", i18n_pspec("recall dependency"), i18n_pspec("The assigned recall dependency"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_DEPENDENCY, param_spec); /** * AgsRecall:parent: * * The parent #AgsRecall. * * Since: 3.0.0 */ param_spec = g_param_spec_object("parent", i18n_pspec("parent recall of this recall"), i18n_pspec("The recall should be the parent instance of this recall"), AGS_TYPE_RECALL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PARENT, param_spec); /** * AgsRecall:child-type: * * The type of child #AgsRecall. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("child-type", i18n_pspec("child type"), i18n_pspec("The type of child that can be added"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHILD_TYPE, param_spec); /** * AgsRecall:child: (type GList(AgsRecall)) (transfer full) * * The child #AgsRecall. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("child", i18n_pspec("child of recall"), i18n_pspec("The child that can be added"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHILD, param_spec); /* AgsRecallClass */ recall->resolve_dependency = ags_recall_real_resolve_dependency; recall->check_rt_data = ags_recall_real_check_rt_data; recall->run_init_pre = ags_recall_real_run_init_pre; recall->run_init_inter = ags_recall_real_run_init_inter; recall->run_init_post = ags_recall_real_run_init_post; recall->feed_input_queue = ags_recall_real_feed_input_queue; recall->automate = ags_recall_real_automate; recall->run_pre = ags_recall_real_run_pre; recall->run_inter = ags_recall_real_run_inter; recall->run_post = ags_recall_real_run_post; recall->do_feedback = ags_recall_real_do_feedback; recall->feed_output_queue = ags_recall_real_feed_output_queue; recall->stop_persistent = ags_recall_real_stop_persistent; recall->cancel = ags_recall_real_cancel; recall->done = ags_recall_real_done; recall->duplicate = ags_recall_real_duplicate; recall->notify_dependency = NULL; recall->child_added = NULL; /* signals */ /** * AgsRecall::resolve-dependency: * @recall: the #AgsRecall to resolve * * The ::resolve-dependency signal notifies about resolving * dependency. * * Since: 3.0.0 */ recall_signals[PLAY_RESOLVE_DEPENDENCY] = g_signal_new("resolve-dependency", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, resolve_dependency), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::check-rt-data: * @recall: the #AgsRecall to initialize * * The ::check-rt-data signal notifies about initializing * stage 0. * * Since: 3.0.0 */ recall_signals[PLAY_CHECK_RT_DATA] = g_signal_new("check-rt-data", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, check_rt_data), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::run-init-pre: * @recall: the #AgsRecall to initialize * * The ::run-init-pre signal notifies about initializing * stage 0. * * Since: 3.0.0 */ recall_signals[PLAY_RUN_INIT_PRE] = g_signal_new("run-init-pre", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, run_init_pre), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::run-init-inter: * @recall: the #AgsRecall to initialize * * The ::run-init-inter signal notifies about initializing * stage 1. * * Since: 3.0.0 */ recall_signals[PLAY_RUN_INIT_INTER] = g_signal_new("run-init-inter", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, run_init_inter), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::run-init-post: * @recall: the #AgsRecall to initialize * * The ::run-init-post signal notifies about initializing * stage 2. * * Since: 3.0.0 */ recall_signals[PLAY_RUN_INIT_POST] = g_signal_new("run-init-post", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, run_init_post), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::feed-input-queue: * @recall: the #AgsRecall to play * * The ::feed-input-queue signal notifies about running * feed input queue. * * Since: 3.0.0 */ recall_signals[PLAY_FEED_INPUT_QUEUE] = g_signal_new("feed-input-queue", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, feed_input_queue), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::automate: * @recall: the #AgsRecall to play * * The ::automate signal notifies about running * automation and is normally called during ::run-pre. * * Since: 3.0.0 */ recall_signals[PLAY_AUTOMATE] = g_signal_new("automate", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, automate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::run-pre: * @recall: the #AgsRecall to play * * The ::run-pre signal notifies about running * stage 0. * * Since: 3.0.0 */ recall_signals[PLAY_RUN_PRE] = g_signal_new("run-pre", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, run_pre), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::run-inter: * @recall: the #AgsRecall to play * * The ::run-inter signal notifies about running * stage 1. * * Since: 3.0.0 */ recall_signals[PLAY_RUN_INTER] = g_signal_new("run-inter", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, run_inter), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::run-post: * @recall: the #AgsRecall to play * * The ::run-post signal notifies about running * stage 2. * * Since: 3.0.0 */ recall_signals[PLAY_RUN_POST] = g_signal_new("run-post", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, run_post), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::do-feedback: * @recall: the #AgsRecall to play * * The ::do-feedback signal notifies about running * stage 2. * * Since: 3.0.0 */ recall_signals[PLAY_DO_FEEDBACK] = g_signal_new("do-feedback", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, do_feedback), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::feed-output-queue: * @recall: the #AgsRecall to play * * The ::feed-output-queue signal notifies about running * feed output queue. * * Since: 3.0.0 */ recall_signals[PLAY_FEED_OUTPUT_QUEUE] = g_signal_new("feed-output-queue", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, feed_output_queue), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::stop-persistent: * @recall: the #AgsRecall stop playback * * The ::stop-persistent signal notifies about definitively * stopping playback. * * Since: 3.0.0 */ recall_signals[PLAY_STOP_PERSISTENT] = g_signal_new("stop_persistent", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, stop_persistent), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::cancel: * @recall: the #AgsRecall to cancel playback * * The ::cancel signal notifies about cancelling playback. * * Since: 3.0.0 */ recall_signals[PLAY_CANCEL] = g_signal_new("cancel", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, cancel), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::done: * @recall: the #AgsRecall to finish playback * * The ::done signal notifies about stopping playback. * * Since: 3.0.0 */ recall_signals[PLAY_DONE] = g_signal_new("done", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, done), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsRecall::duplicate: * @recall: the #AgsRecall to duplicate * @recall_id: the assigned #AgsRecallID * @n_params: pointer to array length * @parameter_name: parameter name string vector * @value: the #GValue-struct array * * The ::duplicate signal notifies about instantiating. * * Returns: (transfer full): the new #AgsRecall instance * * Since: 3.0.0 */ recall_signals[PLAY_DUPLICATE] = g_signal_new("duplicate", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, duplicate), NULL, NULL, ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER, G_TYPE_OBJECT, 4, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); /** * AgsRecall::notify-dependency: * @recall: the #AgsRecall to notify * @dependency: the kind of dependency * @increase: if %TRUE increase dependency count, else if %FALSE decrease * * The ::notify-dependency signal notifies about dependency * added. * * Since: 3.0.0 */ recall_signals[PLAY_NOTIFY_DEPENDENCY] = g_signal_new("notify-dependency", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, notify_dependency), NULL, NULL, ags_cclosure_marshal_VOID__UINT_BOOLEAN, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_BOOLEAN); /** * AgsRecall::child-added: * @recall: the #AgsRecall to add the child * @child: the #AgsRecall to add * * The ::child-added signal notifies about children * added. * * Since: 3.0.0 */ recall_signals[CHILD_ADDED] = g_signal_new("child-added", G_TYPE_FROM_CLASS(recall), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsRecallClass, child_added), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } void ags_recall_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_recall_get_uuid; connectable->has_resource = ags_recall_has_resource; connectable->is_ready = ags_recall_is_ready; connectable->add_to_registry = ags_recall_add_to_registry; connectable->remove_from_registry = ags_recall_remove_from_registry; connectable->list_resource = ags_recall_list_resource; connectable->xml_compose = ags_recall_xml_compose; connectable->xml_parse = ags_recall_xml_parse; connectable->is_connected = ags_recall_is_connected; connectable->connect = ags_recall_connect; connectable->disconnect = ags_recall_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_recall_init(AgsRecall *recall) { recall->flags = 0; recall->ability_flags = 0; recall->behaviour_flags = 0; recall->sound_scope = -1; recall->staging_flags = 0; recall->state_flags = 0; /* add recall mutex */ g_rec_mutex_init(&(recall->obj_mutex)); /* uuid */ #if 0 recall->uuid = ags_uuid_alloc(); ags_uuid_generate(recall->uuid); #else recall->uuid = NULL; #endif /* version and build id */ recall->version = NULL; recall->build_id = NULL; /* name */ recall->name = NULL; /* filename and effect */ recall->filename = NULL; recall->effect = NULL; recall->effect_index = 0; /* xml type */ recall->xml_type = NULL; /* base init */ recall->recall_container = NULL; recall->output_soundcard = NULL; recall->output_soundcard_channel = 0; recall->input_soundcard = NULL; recall->input_soundcard_channel = 0; #if 0 /* config */ config = ags_config_get_instance(); /* presets */ recall->samplerate = ags_soundcard_helper_config_get_samplerate(config); recall->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); recall->format = ags_soundcard_helper_config_get_format(config); #else /* presets */ recall->samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; recall->buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; recall->format = AGS_SOUNDCARD_DEFAULT_FORMAT; #endif recall->pad = 0; recall->audio_channel = 0; recall->line = 0; /* port and automation port */ recall->port = NULL; recall->automation_port = NULL; /* recall id */ recall->recall_id = NULL; /* recall dependency */ recall->recall_dependency = NULL; /* recall handler */ recall->recall_handler = NULL; /* nested recall */ recall->parent = NULL; recall->child_type = G_TYPE_NONE; recall->n_child_params = 0; recall->child_parameter_name = NULL; recall->child_value = NULL; recall->children = NULL; } void ags_recall_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecall *recall; GRecMutex *recall_mutex; recall = AGS_RECALL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(recall_mutex); if(filename == recall->filename){ g_rec_mutex_unlock(recall_mutex); return; } if(recall->filename != NULL){ g_free(recall->filename); } recall->filename = g_strdup(filename); g_rec_mutex_unlock(recall_mutex); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); g_rec_mutex_lock(recall_mutex); if(effect == recall->effect){ g_rec_mutex_unlock(recall_mutex); return; } if(recall->effect != NULL){ g_free(recall->effect); } recall->effect = g_strdup(effect); g_rec_mutex_unlock(recall_mutex); } break; case PROP_EFFECT_INDEX: { g_rec_mutex_lock(recall_mutex); recall->effect_index = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_CONTAINER: { AgsRecallContainer *recall_container; recall_container = (AgsRecallContainer *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall->recall_container == (GObject *) recall_container){ g_rec_mutex_unlock(recall_mutex); return; } if(recall->recall_container != NULL){ g_object_unref(G_OBJECT(recall->recall_container)); recall->recall_container = NULL; } if(recall_container != NULL){ g_object_ref(recall_container); } recall->recall_container = (GObject *) recall_container; g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { GObject *output_soundcard; output_soundcard = (GObject *) g_value_get_object(value); ags_recall_set_output_soundcard(recall, output_soundcard); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recall_mutex); recall->output_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_SOUNDCARD: { GObject *input_soundcard; input_soundcard = (GObject *) g_value_get_object(value); ags_recall_set_input_soundcard(recall, input_soundcard); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recall_mutex); recall->input_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_recall_set_samplerate(recall, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_recall_set_buffer_size(recall, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_recall_set_format(recall, format); } break; case PROP_PAD: { g_rec_mutex_lock(recall_mutex); recall->pad = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(recall_mutex); recall->audio_channel = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LINE: { g_rec_mutex_lock(recall_mutex); recall->line = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PORT: { AgsPort *port; port = (AgsPort *) g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_PORT(port) || g_list_find(recall->port, port) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } g_object_ref(port); recall->port = g_list_prepend(recall->port, port); g_rec_mutex_unlock(recall_mutex); } break; case PROP_AUTOMATION_PORT: { AgsPort *automation_port; automation_port = (AgsPort *) g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_PORT(automation_port) || g_list_find(recall->automation_port, automation_port) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } g_object_ref(automation_port); recall->port = g_list_prepend(recall->automation_port, automation_port); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_ID: { AgsRecallID *recall_id; recall_id = (AgsRecallID *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall->recall_id == recall_id){ g_rec_mutex_unlock(recall_mutex); return; } g_rec_mutex_unlock(recall_mutex); ags_recall_set_recall_id(recall, recall_id); } break; case PROP_RECALL_DEPENDENCY: { AgsRecallDependency *recall_dependency; recall_dependency = (AgsRecallDependency *) g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_RECALL_DEPENDENCY(recall_dependency) || g_list_find(recall->recall_dependency, recall_dependency) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } g_rec_mutex_unlock(recall_mutex); ags_recall_add_recall_dependency(recall, recall_dependency); } break; case PROP_PARENT: { AgsRecall *parent; parent = (AgsRecall *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall->parent == parent){ g_rec_mutex_unlock(recall_mutex); return; } if(recall->parent != NULL){ g_object_unref(recall->parent); } if(parent != NULL){ g_object_ref(parent); } recall->parent = parent; g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD_TYPE: { g_rec_mutex_lock(recall_mutex); recall->child_type = g_value_get_gtype(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD: { AgsRecall *child; child = (AgsRecall *) g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_RECALL(child) || g_list_find(recall->children, child) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } g_rec_mutex_unlock(recall_mutex); ags_recall_add_child(recall, child); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecall *recall; GRecMutex *recall_mutex; recall = AGS_RECALL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); switch(prop_id){ case PROP_FILENAME: { g_rec_mutex_lock(recall_mutex); g_value_set_string(value, recall->filename); g_rec_mutex_unlock(recall_mutex); } break; case PROP_EFFECT: { g_rec_mutex_lock(recall_mutex); g_value_set_string(value, recall->effect); g_rec_mutex_unlock(recall_mutex); } break; case PROP_EFFECT_INDEX: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->effect_index); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_CONTAINER: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall->recall_container); g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall->output_soundcard); g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recall_mutex); g_value_set_int(value, recall->output_soundcard_channel); g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_SOUNDCARD: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall->input_soundcard); g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(recall_mutex); g_value_set_int(value, recall->input_soundcard_channel); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->samplerate); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->buffer_size); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->format); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PAD: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->pad); g_rec_mutex_unlock(recall_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->audio_channel); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LINE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall->line); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PORT: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(recall->port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_AUTOMATION_PORT: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(recall->automation_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_ID: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall->recall_id); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_DEPENDENCY: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(recall->recall_dependency, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PARENT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall->parent); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD_TYPE: { g_rec_mutex_lock(recall_mutex); g_value_set_gtype(value, recall->child_type); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_dispose(GObject *gobject) { AgsRecall *recall; GList *list_start, *list; recall = AGS_RECALL(gobject); ags_connectable_disconnect(AGS_CONNECTABLE(recall)); /* recall container */ if(recall->recall_container != NULL){ g_object_set(recall, "recall-container", NULL, NULL); } /* output/input soundcard */ if(recall->output_soundcard != NULL){ g_object_unref(recall->output_soundcard); recall->output_soundcard = NULL; } if(recall->input_soundcard != NULL){ g_object_unref(recall->input_soundcard); recall->input_soundcard = NULL; } /* port */ if(recall->port != NULL){ g_list_free_full(recall->port, (GDestroyNotify) g_object_unref); recall->port = NULL; } /* automation port */ if(recall->automation_port != NULL){ g_list_free_full(recall->automation_port, g_object_unref); recall->automation_port = NULL; } /* recall id */ if(recall->recall_id != NULL){ g_object_unref(recall->recall_id); recall->recall_id = NULL; } /* recall dependency */ if(recall->recall_dependency != NULL){ g_list_free_full(recall->recall_dependency, g_object_unref); recall->recall_dependency = NULL; } /* parent */ if(recall->parent != NULL){ ags_recall_remove_child(recall->parent, recall); recall->parent = NULL; } /* children */ if(recall->children != NULL){ list = list_start = g_list_copy(recall->children); while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free(list_start); g_list_free_full(recall->children, g_object_unref); recall->children = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_parent_class)->dispose(gobject); } void ags_recall_finalize(GObject *gobject) { AgsRecall *recall; guint i; recall = AGS_RECALL(gobject); #ifdef AGS_DEBUG g_message("finalize %s", G_OBJECT_TYPE_NAME(gobject)); #endif ags_uuid_free(recall->uuid); //TODO:JK: check removal #if 0 guint *ids; guint i, n_ids; ids = g_signal_list_ids(AGS_TYPE_RECALL, &n_ids); for(i = 0; i < n_ids; i++){ g_signal_handlers_disconnect_matched(gobject, G_SIGNAL_MATCH_ID, ids[i], 0, NULL, NULL, NULL); } g_free(ids); #endif g_free(recall->filename); g_free(recall->effect); /* recall container */ if(recall->recall_container != NULL){ g_object_set(recall, "recall-container", NULL, NULL); } /* output/input soundcard */ if(recall->output_soundcard != NULL){ g_object_unref(recall->output_soundcard); } if(recall->input_soundcard != NULL){ g_object_unref(recall->input_soundcard); } /* port */ g_list_free_full(recall->port, g_object_unref); /* automation port */ g_list_free_full(recall->automation_port, g_object_unref); /* recall id */ if(recall->recall_id != NULL){ g_object_unref(recall->recall_id); } /* recall dependency */ g_list_free_full(recall->recall_dependency, g_object_unref); /* recall handler */ g_list_free_full(recall->recall_handler, (GDestroyNotify) ags_recall_handler_free); /* parent */ if(recall->parent != NULL){ g_object_unref(recall->parent); } /* children */ if(recall->child_parameter_name != NULL){ g_strfreev(recall->child_parameter_name); } if(recall->child_value != NULL){ for(i = 0; i < recall->n_child_params; i++){ g_value_unset(&(recall->child_value[i])); } g_free(recall->child_value); } g_list_free_full(recall->children, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recall_parent_class)->finalize(gobject); } AgsUUID* ags_recall_get_uuid(AgsConnectable *connectable) { AgsRecall *recall; AgsUUID *ptr; GRecMutex *recall_mutex; recall = AGS_RECALL(connectable); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get UUID */ g_rec_mutex_lock(recall_mutex); ptr = recall->uuid; g_rec_mutex_unlock(recall_mutex); return(ptr); } gboolean ags_recall_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_recall_is_ready(AgsConnectable *connectable) { AgsRecall *recall; gboolean is_ready; recall = AGS_RECALL(connectable); /* check is added */ is_ready = ags_recall_test_flags(recall, AGS_RECALL_ADDED_TO_REGISTRY); return(is_ready); } void ags_recall_add_to_registry(AgsConnectable *connectable) { AgsRecall *recall; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *list; if(ags_connectable_is_ready(connectable)){ return; } recall = AGS_RECALL(connectable); ags_recall_set_flags(recall, AGS_RECALL_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) recall); ags_registry_add_entry(registry, entry); } //TODO:JK: implement me } void ags_recall_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_recall_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_recall_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_recall_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_recall_is_connected(AgsConnectable *connectable) { AgsRecall *recall; gboolean is_connected; recall = AGS_RECALL(connectable); /* check is connected */ is_connected = ags_recall_test_flags(recall, AGS_RECALL_CONNECTED); return(is_connected); } void ags_recall_connect(AgsConnectable *connectable) { AgsRecall *recall; GList *list_start, *list, *next; gboolean children_lock_free; GRecMutex *recall_mutex; if(ags_connectable_is_connected(connectable)){ return; } recall = AGS_RECALL(connectable); ags_recall_set_flags(recall, AGS_RECALL_CONNECTED); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* connect children */ if(!children_lock_free){ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy(recall->children); g_rec_mutex_unlock(recall_mutex); }else{ list = list_start = recall->children; } while(list != NULL){ next = list->next; ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = next; } if(!children_lock_free){ g_list_free(list_start); } /* recall handler */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy(recall->recall_handler); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ AgsRecallHandler *recall_handler; recall_handler = AGS_RECALL_HANDLER(list->data); g_signal_connect_after(G_OBJECT(recall), recall_handler->signal_name, G_CALLBACK(recall_handler->callback), recall_handler->data); list = list->next; } g_list_free(list_start); } void ags_recall_disconnect(AgsConnectable *connectable) { AgsRecall *recall; GList *list_start, *list, *next; gboolean children_lock_free; GRecMutex *recall_mutex; if(!ags_connectable_is_connected(connectable)){ return; } recall = AGS_RECALL(connectable); ags_recall_unset_flags(recall, AGS_RECALL_CONNECTED); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* connect children */ if(!children_lock_free){ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy(recall->children); g_rec_mutex_unlock(recall_mutex); }else{ list = list_start = recall->children; } while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } if(!children_lock_free){ g_list_free(list_start); } /* recall handler */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy(recall->recall_handler); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ AgsRecallHandler *recall_handler; gchar *signal_name; next = list->next; recall_handler = AGS_RECALL_HANDLER(list->data); signal_name = g_strdup_printf("any_signal::%s", recall_handler->signal_name); g_object_disconnect(G_OBJECT(recall), signal_name, G_CALLBACK(recall_handler->callback), recall_handler->data, NULL); g_free(signal_name); list = next; } g_list_free(list_start); } /** * ags_recall_global_set_omit_event: * @omit_event: %TRUE if omit event, otherwise %FALSE * * Set global config value omit event. * * Since: 3.0.0 */ void ags_recall_global_set_omit_event(gboolean omit_event) { ags_recall_global_omit_event = omit_event; } /** * ags_recall_global_get_children_lock_free: * * Get global config value lock free children. * * Returns: if %TRUE does lock free children, else not * * Since: 3.0.0 */ gboolean ags_recall_global_get_children_lock_free() { gboolean children_lock_free; children_lock_free = ags_recall_global_children_lock_free; return(children_lock_free); } /** * ags_recall_global_get_omit_event: * * Get global config value omit event. * * Returns: if %TRUE does omit events, else not * * Since: 3.0.0 */ gboolean ags_recall_global_get_omit_event() { gboolean omit_event; omit_event = ags_recall_global_omit_event; return(omit_event); } /** * ags_recall_global_get_performance_mode: * * Get global config value performance mode. * * Returns: if %TRUE does performance mode, else not * * Since: 3.0.0 */ gboolean ags_recall_global_get_performance_mode() { gboolean performance_mode; performance_mode = ags_recall_global_performance_mode; return(performance_mode); } /** * ags_recall_global_get_rt_safe: * * Get global config value rt-safe. * * Returns: if %TRUE does rt-safe strategy, else not * * Since: 3.0.0 */ gboolean ags_recall_global_get_rt_safe() { gboolean rt_safe; rt_safe = ags_recall_global_rt_safe; return(rt_safe); } /** * ags_recall_get_obj_mutex: * @recall: the #AgsRecall * * Get object mutex. * * Returns: the #GRecMutex to lock @recall * * Since: 3.1.0 */ GRecMutex* ags_recall_get_obj_mutex(AgsRecall *recall) { if(!AGS_IS_RECALL(recall)){ return(NULL); } return(AGS_RECALL_GET_OBJ_MUTEX(recall)); } /** * ags_recall_test_flags: * @recall: the #AgsRecall * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_test_flags(AgsRecall *recall, guint flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* test */ g_rec_mutex_lock(recall_mutex); retval = ((flags & (recall->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_recall_set_flags: * @recall: the #AgsRecall * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_recall_set_flags(AgsRecall *recall, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set flags */ g_rec_mutex_lock(recall_mutex); recall->flags |= flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_unset_flags: * @recall: the #AgsRecall * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_recall_unset_flags(AgsRecall *recall, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set flags */ g_rec_mutex_lock(recall_mutex); recall->flags &= (~flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_test_ability_flags: * @recall: the #AgsRecall * @ability_flags: the ability flags * * Test @ability_flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_test_ability_flags(AgsRecall *recall, guint ability_flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* test */ g_rec_mutex_lock(recall_mutex); retval = ((ability_flags & (recall->ability_flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_recall_set_ability_flags: * @recall: the #AgsRecall * @ability_flags: ability flags * * Set ability flags recursively. * * Since: 3.0.0 */ void ags_recall_set_ability_flags(AgsRecall *recall, guint ability_flags) { GList *child_start, *child, *next; gboolean children_lock_free; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* set ability flags */ g_rec_mutex_lock(recall_mutex); recall->ability_flags |= ability_flags; /* apply recursivly */ if(!children_lock_free){ child = child_start = g_list_copy(recall->children); }else{ child = child_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(child != NULL){ next = child->next; ags_recall_set_ability_flags(AGS_RECALL(child->data), ability_flags); child = next; } if(!children_lock_free){ g_list_free(child_start); } } /** * ags_recall_unset_ability_flags: * @recall: the #AgsRecall * @ability_flags: ability flags * * Unset ability flags recursively. * * Since: 3.0.0 */ void ags_recall_unset_ability_flags(AgsRecall *recall, guint ability_flags) { GList *child_start, *child, *next; gboolean children_lock_free; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* unset ability flags */ g_rec_mutex_lock(recall_mutex); recall->ability_flags &= (~ability_flags); /* apply recursivly */ if(!children_lock_free){ child = child_start = g_list_copy(recall->children); }else{ child = child_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(child != NULL){ next = child->next; ags_recall_set_ability_flags(AGS_RECALL(child->data), ability_flags); child = next; } if(!children_lock_free){ g_list_free(child_start); } } /** * ags_recall_check_ability_flags: * @recall: the #AgsRecall * @ability_flags: the ability flags * * Check if @ability_flags is set for @recall. * * Returns: %TRUE flags are set, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_check_ability_flags(AgsRecall *recall, guint ability_flags) { guint recall_ability_flags; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get ability flags */ g_rec_mutex_lock(recall_mutex); recall_ability_flags = recall->ability_flags; g_rec_mutex_unlock(recall_mutex); if((AGS_SOUND_ABILITY_PLAYBACK & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_PLAYBACK & (recall_ability_flags)) == 0){ return(FALSE); } if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_NOTATION & (recall_ability_flags)) == 0){ return(FALSE); } if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_SEQUENCER & (recall_ability_flags)) == 0){ return(FALSE); } if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_WAVE & (recall_ability_flags)) == 0){ return(FALSE); } if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_MIDI & (recall_ability_flags)) == 0){ return(FALSE); } return(TRUE); } /** * ags_recall_match_ability_flags_to_scope: * @recall: the #AgsRecall * @sound_scope: the sound scope * * Check if @sound_scope related ability flag is set. * * Returns: %TRUE if sound scope is available, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_match_ability_flags_to_scope(AgsRecall *recall, gint sound_scope) { guint recall_ability_flags; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get ability flags */ g_rec_mutex_lock(recall_mutex); recall_ability_flags = recall->ability_flags; g_rec_mutex_unlock(recall_mutex); switch(sound_scope){ case AGS_SOUND_SCOPE_PLAYBACK: { if((AGS_SOUND_ABILITY_PLAYBACK & (recall_ability_flags)) != 0){ return(TRUE); }else{ return(FALSE); } } case AGS_SOUND_SCOPE_NOTATION: { if((AGS_SOUND_ABILITY_NOTATION & (recall_ability_flags)) != 0){ return(TRUE); }else{ return(FALSE); } } case AGS_SOUND_SCOPE_SEQUENCER: { if((AGS_SOUND_ABILITY_SEQUENCER & (recall_ability_flags)) != 0){ return(TRUE); }else{ return(FALSE); } } case AGS_SOUND_SCOPE_WAVE: { if((AGS_SOUND_ABILITY_WAVE & (recall_ability_flags)) != 0){ return(TRUE); }else{ return(FALSE); } } case AGS_SOUND_SCOPE_MIDI: { if((AGS_SOUND_ABILITY_MIDI & (recall_ability_flags)) != 0){ return(TRUE); }else{ return(FALSE); } } default: return(FALSE); } } /** * ags_recall_test_behaviour_flags: * @recall: the #AgsRecall * @behaviour_flags: the behaviour flags * * Test @behaviour_flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_test_behaviour_flags(AgsRecall *recall, guint behaviour_flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* test */ g_rec_mutex_lock(recall_mutex); retval = ((behaviour_flags & (recall->behaviour_flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_recall_set_behaviour_flags: * @recall: the #AgsRecall * @behaviour_flags: the behaviour flags * * Set behaviour flags of @recall. * * Since: 3.0.0 */ void ags_recall_set_behaviour_flags(AgsRecall *recall, guint behaviour_flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set behaviour flags */ g_rec_mutex_lock(recall_mutex); recall->behaviour_flags |= behaviour_flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_unset_behaviour_flags: * @recall: the #AgsRecall * @behaviour_flags: the behaviour flags * * Unset behaviour flags of @recall. * * Since: 3.0.0 */ void ags_recall_unset_behaviour_flags(AgsRecall *recall, guint behaviour_flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* unset behaviour flags */ g_rec_mutex_lock(recall_mutex); recall->behaviour_flags &= (~behaviour_flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_check_behaviour_flags: * @recall: the #AgsRecall * @behaviour_flags: the behaviour flags * * Check if @behaviour_flags is set for @recall. * * Returns: %TRUE flags are set, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_check_behaviour_flags(AgsRecall *recall, guint behaviour_flags) { guint recall_behaviour_flags; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get behaviour flags */ g_rec_mutex_lock(recall_mutex); recall_behaviour_flags = recall->behaviour_flags; g_rec_mutex_unlock(recall_mutex); if((AGS_SOUND_BEHAVIOUR_PATTERN_MODE & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PATTERN_MODE & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_BULK_MODE & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_BULK_MODE & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PERSISTENT & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PERSISTENT & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PERSISTENT_WAVE & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PERSISTENT_WAVE & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PERSISTENT_MIDI & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PERSISTENT_MIDI & (recall_behaviour_flags)) == 0){ return(FALSE); } if((AGS_SOUND_BEHAVIOUR_PROPAGATE_DONE & (behaviour_flags)) != 0 && (AGS_SOUND_BEHAVIOUR_PROPAGATE_DONE & (recall_behaviour_flags)) == 0){ return(FALSE); } return(TRUE); } /** * ags_recall_set_sound_scope: * @recall: the #AgsRecall * @sound_scope: the sound scope * * Set @sound_scope for @recall. * * Since: 3.0.0 */ void ags_recall_set_sound_scope(AgsRecall *recall, gint sound_scope) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall) && ags_recall_check_sound_scope(recall, -1)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set sound scope */ g_rec_mutex_lock(recall_mutex); recall->sound_scope = sound_scope; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_sound_scope: * @recall: the #AgsRecall * * Get sound scope for @recall. * * Returns: the used sound scope * * Since: 3.0.0 */ gint ags_recall_get_sound_scope(AgsRecall *recall) { gint sound_scope; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(-1); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set sound scope */ g_rec_mutex_lock(recall_mutex); sound_scope = recall->sound_scope; g_rec_mutex_unlock(recall_mutex); return(sound_scope); } /** * ags_recall_check_sound_scope: * @recall: the #AgsRecall * @sound_scope: the sound scope to check or -1 to check all * * Check if @sound_scope is set for @recall. * * Returns: %TRUE if sound scope matches, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_check_sound_scope(AgsRecall *recall, gint sound_scope) { gint recall_sound_scope; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get sound scope */ g_rec_mutex_lock(recall_mutex); recall_sound_scope = recall->sound_scope; g_rec_mutex_unlock(recall_mutex); if(sound_scope < 0){ switch(recall_sound_scope){ case AGS_SOUND_SCOPE_PLAYBACK: case AGS_SOUND_SCOPE_NOTATION: case AGS_SOUND_SCOPE_SEQUENCER: case AGS_SOUND_SCOPE_WAVE: case AGS_SOUND_SCOPE_MIDI: return(TRUE); default: return(FALSE); } }else{ if(sound_scope < AGS_SOUND_SCOPE_LAST && sound_scope == recall_sound_scope){ return(TRUE); }else{ return(FALSE); } } } /** * ags_recall_test_staging_flags: * @recall: the #AgsRecall * @staging_flags: the staging flags * * Test @staging_flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_test_staging_flags(AgsRecall *recall, guint staging_flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* test */ g_rec_mutex_lock(recall_mutex); retval = ((staging_flags & (recall->staging_flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_recall_set_staging_flags: * @recall: the #AgsRecall * @staging_flags: staging flags to set * * Set staging flags. * * Since: 3.0.0 */ void ags_recall_set_staging_flags(AgsRecall *recall, guint staging_flags) { guint recall_staging_flags; guint recall_state_flags; gboolean omit_event; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); omit_event = ags_recall_global_get_omit_event(); /* get staging flags */ g_rec_mutex_lock(recall_mutex); recall_staging_flags = recall->staging_flags; recall_state_flags = recall->state_flags; g_rec_mutex_unlock(recall_mutex); /* invoke appropriate staging */ if((AGS_SOUND_STAGING_FINI & (recall_staging_flags)) == 0 && (AGS_SOUND_STATE_IS_TERMINATING & (recall_state_flags)) == 0){ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 && (AGS_SOUND_STAGING_CHECK_RT_DATA & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->check_rt_data(recall); }else{ ags_recall_check_rt_data(recall); } } if((AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_PRE & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->run_init_pre(recall); }else{ ags_recall_run_init_pre(recall); } } if((AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_INTER & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->run_init_inter(recall); }else{ ags_recall_run_init_inter(recall); } } if((AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_POST & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->run_init_post(recall); }else{ ags_recall_run_init_post(recall); } } if((AGS_SOUND_STAGING_FEED_INPUT_QUEUE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FEED_INPUT_QUEUE & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->feed_input_queue(recall); }else{ ags_recall_feed_input_queue(recall); } } if((AGS_SOUND_STAGING_AUTOMATE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_AUTOMATE & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->automate(recall); }else{ ags_recall_automate(recall); } } if((AGS_SOUND_STAGING_RUN_PRE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_PRE & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->run_pre(recall); }else{ ags_recall_run_pre(recall); } } if((AGS_SOUND_STAGING_RUN_INTER & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INTER & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->run_inter(recall); }else{ ags_recall_run_inter(recall); } } if((AGS_SOUND_STAGING_RUN_POST & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_POST & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->run_post(recall); }else{ ags_recall_run_post(recall); } } if((AGS_SOUND_STAGING_DO_FEEDBACK & (staging_flags)) != 0 && (AGS_SOUND_STAGING_DO_FEEDBACK & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->do_feedback(recall); }else{ ags_recall_do_feedback(recall); } } if((AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE & (recall_staging_flags)) == 0){ if(omit_event){ AGS_RECALL_GET_CLASS(recall)->feed_output_queue(recall); }else{ ags_recall_feed_output_queue(recall); } } } if((AGS_SOUND_STAGING_FINI & (staging_flags)) != 0){ ags_recall_unset_staging_flags(recall, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); } if((AGS_SOUND_STAGING_CANCEL & (staging_flags)) != 0 && (AGS_SOUND_STAGING_CANCEL & (recall_staging_flags)) == 0){ ags_recall_set_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING); ags_recall_cancel(recall); } if((AGS_SOUND_STAGING_DONE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_DONE & (recall_staging_flags)) == 0){ ags_recall_done(recall); } #if 0 if((AGS_SOUND_STAGING_REMOVE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_REMOVE & (recall_staging_flags)) == 0){ ags_recall_remove(recall); } #endif /* apply flags */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= staging_flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_unset_staging_flags: * @recall: the #AgsRecall * @staging_flags: staging flags to unset * * Unset staging flags. * * Since: 3.0.0 */ void ags_recall_unset_staging_flags(AgsRecall *recall, guint staging_flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* unset staging flags */ g_rec_mutex_lock(recall_mutex); recall->staging_flags &= (~staging_flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_check_staging_flags: * @recall: the #AgsRecall * @staging_flags: staging flags to check * * Check the occurence of @staging_flags in @recall. * * Returns: %TRUE if all flags matched, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_check_staging_flags(AgsRecall *recall, guint staging_flags) { guint recall_staging_flags; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get staging flags */ g_rec_mutex_lock(recall_mutex); recall_staging_flags = recall->staging_flags; g_rec_mutex_unlock(recall_mutex); /* check staging flags */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 && (AGS_SOUND_STAGING_CHECK_RT_DATA & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_PRE & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_INTER & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_POST & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_FEED_INPUT_QUEUE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FEED_INPUT_QUEUE & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_AUTOMATE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_AUTOMATE & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_PRE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_PRE & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INTER & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INTER & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_POST & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_POST & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_DO_FEEDBACK & (staging_flags)) != 0 && (AGS_SOUND_STAGING_DO_FEEDBACK & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_FINI & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FINI & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_CANCEL & (staging_flags)) != 0 && (AGS_SOUND_STAGING_CANCEL & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_DONE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_DONE & (recall_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_REMOVE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_REMOVE & (recall_staging_flags)) == 0){ return(FALSE); } return(TRUE); } /** * ags_recall_test_state_flags: * @recall: the #AgsRecall * @state_flags: the state flags * * Test @state_flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_test_state_flags(AgsRecall *recall, guint state_flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* test */ g_rec_mutex_lock(recall_mutex); retval = ((state_flags & (recall->state_flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_recall_set_state_flags: * @recall: the #AgsRecall * @state_flags: state flags to set * * Set state flags. * * Since: 3.0.0 */ void ags_recall_set_state_flags(AgsRecall *recall, guint state_flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set state flags */ g_rec_mutex_lock(recall_mutex); recall->state_flags |= state_flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_unset_state_flags: * @recall: the #AgsRecall * @state_flags: state flags to unset * * Unset state flags. * * Since: 3.0.0 */ void ags_recall_unset_state_flags(AgsRecall *recall, guint state_flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* unset state flags */ g_rec_mutex_lock(recall_mutex); recall->state_flags &= (~state_flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_check_state_flags: * @recall: the #AgsRecall * @state_flags: state flags to check * * Check the occurence of @state_flags in @recall. * * Returns: %TRUE if all flags matched, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_check_state_flags(AgsRecall *recall, guint state_flags) { guint recall_state_flags; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get state flags */ g_rec_mutex_lock(recall_mutex); recall_state_flags = recall->state_flags; g_rec_mutex_unlock(recall_mutex); /* check state flags */ if((AGS_SOUND_STATE_IS_WAITING & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_WAITING & (recall_state_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STATE_IS_ACTIVE & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_ACTIVE & (recall_state_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STATE_IS_PROCESSING & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_PROCESSING & (recall_state_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STATE_IS_TERMINATING & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_TERMINATING & (recall_state_flags)) == 0){ return(FALSE); } return(TRUE); } /** * ags_recall_get_filename: * @recall: the #AgsRecall * * Get filename. * * Returns: the filename * * Since: 3.1.0 */ gchar* ags_recall_get_filename(AgsRecall *recall) { gchar *filename; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "filename", &filename, NULL); return(filename); } /** * ags_recall_set_filename: * @recall: the #AgsRecall * @filename: the filename * * Set filename. * * Since: 3.1.0 */ void ags_recall_set_filename(AgsRecall *recall, gchar *filename) { if(!AGS_IS_RECALL(recall)){ return; } g_object_set(recall, "filename", filename, NULL); } /** * ags_recall_get_effect: * @recall: the #AgsRecall * * Get effect. * * Returns: the effect * * Since: 3.1.0 */ gchar* ags_recall_get_effect(AgsRecall *recall) { gchar *effect; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "effect", &effect, NULL); return(effect); } /** * ags_recall_set_effect: * @recall: the #AgsRecall * @effect: the effect * * Set effect. * * Since: 3.1.0 */ void ags_recall_set_effect(AgsRecall *recall, gchar *effect) { if(!AGS_IS_RECALL(recall)){ return; } g_object_set(recall, "effect", effect, NULL); } /** * ags_recall_get_effect_index: * @recall: the #AgsRecall * * Get effect index. * * Returns: the effect index * * Since: 3.1.0 */ guint ags_recall_get_effect_index(AgsRecall *recall) { guint effect_index; if(!AGS_IS_RECALL(recall)){ return(0); } g_object_get(recall, "effect-index", &effect_index, NULL); return(effect_index); } /** * ags_recall_set_effect_index: * @recall: the #AgsRecall * @effect_index: the effect index * * Set effect index. * * Since: 3.1.0 */ void ags_recall_set_effect_index(AgsRecall *recall, guint effect_index) { if(!AGS_IS_RECALL(recall)){ return; } g_object_set(recall, "effect-index", effect_index, NULL); } /** * ags_recall_get_recall_container: * @recall: the #AgsRecall * * Get recall container of @recall. * * Returns: the #AgsRecallContainer * * Since: 3.1.0 */ GObject* ags_recall_get_recall_container(AgsRecall *recall) { GObject *recall_container; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "recall-container", &recall_container, NULL); return(recall_container); } /** * ags_recall_set_recall_container: * @recall: the #AgsRecall * @recall_container: the #AgsRecallContainer * * Set @recall_container of @recall. * * Since: 3.1.0 */ void ags_recall_set_recall_container(AgsRecall *recall, GObject *recall_container) { if(!AGS_IS_RECALL(recall)){ return; } g_object_set(recall, "recall-container", recall_container, NULL); } /** * ags_recall_get_recall_id: * @recall: the #AgsRecall * * Get recall id of @recall. * * Returns: the #AgsRecallID * * Since: 3.1.0 */ AgsRecallID* ags_recall_get_recall_id(AgsRecall *recall) { AgsRecallID *recall_id; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "recall-id", &recall_id, NULL); return(recall_id); } /** * ags_recall_set_recall_id: * @recall: the #AgsRecall * @recall_id: the #AgsRecallID to set * * Set @recall_id of @recall and all its children. * * Since: 3.0.0 */ void ags_recall_set_recall_id(AgsRecall *recall, AgsRecallID *recall_id) { GList *list_start, *list, *next; gboolean children_lock_free; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* set recall id - children */ g_rec_mutex_lock(recall_mutex); if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("set recall id on template"); } if(!children_lock_free){ list = list_start = g_list_copy(recall->children); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; ags_recall_set_recall_id(AGS_RECALL(list->data), recall_id); list = next; } if(!children_lock_free){ g_list_free(list_start); } /* set recall id */ g_rec_mutex_lock(recall_mutex); recall->recall_id = recall_id; g_object_ref(recall_id); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_recall_dependency: * @recall: the #AgsRecall * * Get recall dependency. * * Returns: (element-type AgsAudio.RecallDependency) (transfer full): the #GList-struct containig #AgsRecallDependency * * Since: 3.1.0 */ GList* ags_recall_get_recall_dependency(AgsRecall *recall) { GList *recall_dependency; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "recall-dependency", &recall_dependency, NULL); return(recall_dependency); } /** * ags_recall_set_recall_dependency: * @recall: the #AgsRecall * @recall_dependency: (element-type AgsAudio.RecallDependency) (transfer full): the #GList-struct containing #AgsRecallDependency * * Set recall dependency by replacing existing. * * Since: 3.1.0 */ void ags_recall_set_recall_dependency(AgsRecall *recall, GList *recall_dependency) { GList *start_recall_dependency; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); g_rec_mutex_lock(recall_mutex); start_recall_dependency = recall->recall_dependency; recall->recall_dependency = recall_dependency; g_rec_mutex_unlock(recall_mutex); g_list_free_full(start_recall_dependency, (GDestroyNotify) g_object_unref); } /** * ags_recall_add_recall_dependency: * @recall: the #AgsRecall * @recall_dependency: the #AgsRecallDependency * * Associate a new dependency for this recall. * * Since: 3.0.0 */ void ags_recall_add_recall_dependency(AgsRecall *recall, AgsRecallDependency *recall_dependency) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall) || !AGS_IS_RECALL_DEPENDENCY(recall_dependency)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* add recall dependency */ g_rec_mutex_lock(recall_mutex); g_object_ref(recall_dependency); recall->recall_dependency = g_list_prepend(recall->recall_dependency, recall_dependency); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_remove_recall_dependency: * @recall: the #AgsRecall * @recall_dependency: the #AgsRecallDependency * * Remove a prior associated dependency. * * Since: 3.0.0 */ void ags_recall_remove_recall_dependency(AgsRecall *recall, AgsRecallDependency *recall_dependency) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall) || !AGS_IS_RECALL_DEPENDENCY(recall_dependency)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* remove recall dependency */ g_rec_mutex_lock(recall_mutex); if(g_list_find(recall->recall_dependency, recall_dependency) != NULL){ recall->recall_dependency = g_list_remove(recall->recall_dependency, recall_dependency); g_object_unref(G_OBJECT(recall_dependency)); } g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_children: * @recall: the #AgsRecall * * Get recall children. * * Returns: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containig #AgsRecall * * Since: 3.1.0 */ GList* ags_recall_get_children(AgsRecall *recall) { GList *children; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "child", &children, NULL); return(children); } /** * ags_recall_set_children: * @recall: the #AgsRecall * @children: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containing #AgsRecall * * Set recall children by replacing existing. * * Since: 3.1.0 */ void ags_recall_set_children(AgsRecall *recall, GList *children) { GList *start_children; GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); g_rec_mutex_lock(recall_mutex); start_children = recall->children; recall->children = children; g_rec_mutex_unlock(recall_mutex); g_list_free_full(start_children, (GDestroyNotify) g_object_unref); } /** * ags_recall_add_child: * @recall: the #AgsRecall * @child: the child #AgsRecall * * Add @child to @recall. * * Since: 3.0.0 */ void ags_recall_add_child(AgsRecall *recall, AgsRecall *child) { AgsRecall *old_parent; AgsRecallID *recall_id; GObject *output_soundcard; GObject *input_soundcard; gint output_soundcard_channel; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; guint recall_ability_flags; guint recall_behaviour_flags; gint recall_sound_scope; guint staging_flags; GRecMutex *recall_mutex, *child_mutex; if(!AGS_IS_RECALL(child) || !AGS_IS_RECALL(recall)){ return; } /* get recall mutex - recall and child */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); child_mutex = AGS_RECALL_GET_OBJ_MUTEX(child); /* check if already set */ g_rec_mutex_lock(child_mutex); if(child->parent == recall){ g_rec_mutex_unlock(child_mutex); return; } old_parent = child->parent; g_rec_mutex_unlock(child_mutex); /* */ g_object_ref(recall); g_object_ref(child); /* remove old */ if(old_parent != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(child)); ags_recall_remove_child(old_parent, child); } /* add child */ g_rec_mutex_lock(recall_mutex); recall_ability_flags = recall->ability_flags; recall_behaviour_flags = recall->behaviour_flags; recall_sound_scope = recall->sound_scope; output_soundcard = recall->output_soundcard; output_soundcard_channel = recall->output_soundcard_channel; input_soundcard = recall->input_soundcard; input_soundcard_channel = recall->input_soundcard_channel; samplerate = recall->samplerate; buffer_size = recall->buffer_size; format = recall->format; recall->children = g_list_prepend(recall->children, child); g_rec_mutex_unlock(recall_mutex); g_object_get(recall, "recall-id", &recall_id, NULL); /* ref new */ ags_recall_set_ability_flags(child, recall_ability_flags); ags_recall_set_behaviour_flags(child, recall_behaviour_flags); ags_recall_set_sound_scope(child, recall_sound_scope); g_rec_mutex_lock(child_mutex); child->parent = recall; g_rec_mutex_unlock(child_mutex); g_object_set(G_OBJECT(child), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, "recall-id", recall_id, NULL); g_signal_connect_after(G_OBJECT(child), "done", G_CALLBACK(ags_recall_child_done), recall); ags_recall_child_added(recall, child); if(ags_connectable_is_connected(AGS_CONNECTABLE(recall))){ ags_connectable_connect(AGS_CONNECTABLE(child)); } /* get mask */ if(recall_id != NULL){ staging_flags = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); //FIXME:JK: this doesn't work #if 0 g_message("staging + 0x%x", staging_flags); g_rec_mutex_lock(recall_mutex); staging_flags = (staging_flags & (recall->staging_flags)); g_rec_mutex_unlock(recall_mutex); g_message("staging - 0x%x", staging_flags); #endif /* set staging flags */ ags_recall_set_staging_flags(child, staging_flags); g_object_unref(recall_id); } } /** * ags_recall_remove_child: * @recall: the #AgsRecall * @child: the child #AgsRecall * * Remove @child from @recall. * * Since: 3.0.0 */ void ags_recall_remove_child(AgsRecall *recall, AgsRecall *child) { GRecMutex *recall_mutex, *child_mutex; if(!AGS_IS_RECALL(child) || !AGS_IS_RECALL(recall)){ return; } /* get recall mutex - recall and child */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); child_mutex = AGS_RECALL_GET_OBJ_MUTEX(child); /* check if not set */ g_rec_mutex_lock(child_mutex); if(child->parent != recall){ g_rec_mutex_unlock(child_mutex); return; } g_rec_mutex_unlock(child_mutex); /* remove from recall */ g_rec_mutex_lock(recall_mutex); if(g_list_find(recall->children, child) != NULL){ recall->children = g_list_remove(recall->children, child); g_object_unref(child); } g_rec_mutex_unlock(recall_mutex); /* unref recall */ child->parent = NULL; g_object_unref(recall); } /** * ags_recall_handler_free: * @recall_handler: (type gpointer) (transfer none): the #AgsRecallHandler-struct * * Free @recall_hanlder. * * Since: 3.0.0 */ void ags_recall_handler_free(AgsRecallHandler *recall_handler) { if(recall_handler == NULL){ return; } g_free(recall_handler->signal_name); free(recall_handler); } /** * ags_recall_handler_alloc: * @signal_name: signal's name to connect * @callback: (scope call): the #GCallback function * @data: the data to pass the callback * * Allocates #AgsRecallHandler-struct. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsRecallHandler-struct * * Since: 3.0.0 */ AgsRecallHandler* ags_recall_handler_alloc(const gchar *signal_name, GCallback callback, GObject *data) { AgsRecallHandler *recall_handler; recall_handler = (AgsRecallHandler *) malloc(sizeof(AgsRecallHandler)); recall_handler->signal_name = g_strdup(signal_name); recall_handler->callback = callback; recall_handler->data = data; return(recall_handler); } /** * ags_recall_add_recall_handler: * @recall: the #AgsRecall to connect * @recall_handler: (type gpointer) (transfer none): the signal specs * * Connect callback to @recall specified by @recall_handler. * * Since: 3.0.0 */ void ags_recall_add_recall_handler(AgsRecall *recall, AgsRecallHandler *recall_handler) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall) || recall_handler == NULL){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* add handler */ g_rec_mutex_lock(recall_mutex); recall->recall_handler = g_list_prepend(recall->recall_handler, recall_handler); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_remove_recall_handler: * @recall: the #AgsRecall to connect * @recall_handler: (type gpointer) (transfer none): the signal specs * * Remove a #AgsRecallHandler-struct from @recall. * * Since: 3.0.0 */ void ags_recall_remove_recall_handler(AgsRecall *recall, AgsRecallHandler *recall_handler) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall) || recall_handler == NULL){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* remove handler */ g_rec_mutex_lock(recall_mutex); recall->recall_handler = g_list_remove(recall->recall_handler, recall_handler); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_output_soundcard: * @recall: the #AgsRecall * * Get the output soundcard object of @recall. * * Returns: (transfer full): the output soundcard * * Since: 3.1.0 */ GObject* ags_recall_get_output_soundcard(AgsRecall *recall) { GObject *output_soundcard; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "output-soundcard", &output_soundcard, NULL); return(output_soundcard); } /** * ags_recall_set_output_soundcard: * @recall: the #AgsRecall * @output_soundcard: the #GObject implementing #AgsSoundcard * * Set output soundcard of @recall. * * Since: 3.0.0 */ void ags_recall_set_output_soundcard(AgsRecall *recall, GObject *output_soundcard) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* unref of old soundcard */ g_rec_mutex_lock(recall_mutex); if(recall->output_soundcard != NULL){ g_signal_handlers_disconnect_by_data(recall->output_soundcard, recall); g_object_unref(recall->output_soundcard); } /* ref and set output soundcard */ if(output_soundcard != NULL){ g_object_ref(output_soundcard); } recall->output_soundcard = output_soundcard; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_input_soundcard: * @recall: the #AgsRecall * * Get the input soundcard object of @recall. * * Returns: (transfer full): the input soundcard * * Since: 3.1.0 */ GObject* ags_recall_get_input_soundcard(AgsRecall *recall) { GObject *input_soundcard; if(!AGS_IS_RECALL(recall)){ return(NULL); } g_object_get(recall, "input-soundcard", &input_soundcard, NULL); return(input_soundcard); } /** * ags_recall_set_input_soundcard: * @recall: the #AgsRecall * @input_soundcard: the #GObject implementing #AgsSoundcard * * Set input soundcard of @recall. * * Since: 3.0.0 */ void ags_recall_set_input_soundcard(AgsRecall *recall, GObject *input_soundcard) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* unref of old soundcard */ g_rec_mutex_lock(recall_mutex); if(recall->input_soundcard != NULL){ g_signal_handlers_disconnect_by_data(recall->input_soundcard, recall); g_object_unref(recall->input_soundcard); } /* ref and set input soundcard */ if(input_soundcard != NULL){ g_object_ref(input_soundcard); } recall->input_soundcard = input_soundcard; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_samplerate: * @recall: the #AgsRecall * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_recall_get_samplerate(AgsRecall *recall) { guint samplerate; if(!AGS_IS_RECALL(recall)){ return(0); } g_object_get(recall, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_recall_set_samplerate: * @recall: the #AgsRecall * @samplerate: the samplerate * * Set samplerate of @recall. * * Since: 3.0.0 */ void ags_recall_set_samplerate(AgsRecall *recall, guint samplerate) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set samplerate */ g_rec_mutex_lock(recall_mutex); recall->samplerate = samplerate; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_buffer_size: * @recall: the #AgsRecall * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_recall_get_buffer_size(AgsRecall *recall) { guint buffer_size; if(!AGS_IS_RECALL(recall)){ return(0); } g_object_get(recall, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_recall_set_buffer_size: * @recall: the #AgsRecall * @buffer_size: the buffer size * * Set buffer size of @recall. * * Since: 3.0.0 */ void ags_recall_set_buffer_size(AgsRecall *recall, guint buffer_size) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set buffer size */ g_rec_mutex_lock(recall_mutex); recall->buffer_size = buffer_size; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_get_format: * @recall: the #AgsRecall * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_recall_get_format(AgsRecall *recall) { guint format; if(!AGS_IS_RECALL(recall)){ return(0); } g_object_get(recall, "format", &format, NULL); return(format); } /** * ags_recall_set_format: * @recall: the #AgsRecall * @format: the format * * Set format of @recall. * * Since: 3.0.0 */ void ags_recall_set_format(AgsRecall *recall, guint format) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* set format */ g_rec_mutex_lock(recall_mutex); recall->format = format; g_rec_mutex_unlock(recall_mutex); } void ags_recall_real_resolve_dependency(AgsRecall *recall) { GList *list_start, *list, *next; gboolean children_lock_free; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* resolve dependency */ g_rec_mutex_lock(recall_mutex); if((AGS_RECALL_TEMPLATE & (AGS_RECALL(recall)->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy(recall->children); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; ags_recall_resolve_dependency(AGS_RECALL(list->data)); list = next; } if(!children_lock_free){ g_list_free(list_start); } } /** * ags_recall_resolve_dependency: * @recall: the #AgsRecall * * A signal indicating that the inheriting object should resolve * it's dependency. * * Since: 3.0.0 */ void ags_recall_resolve_dependency(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); #ifdef AGS_DEBUG g_message("resolving %s", G_OBJECT_TYPE_NAME(recall)); #endif g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RESOLVE_DEPENDENCY], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_check_rt_data(AgsRecall *recall) { GList *list_start, *list, *next; gboolean children_lock_free; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); /* check rt data */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_CHECK_RT_DATA; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy(recall->children); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; ags_recall_check_rt_data(AGS_RECALL(list->data)); list = next; } if(!children_lock_free){ g_list_free(list_start); } /* set is waiting */ g_rec_mutex_lock(recall_mutex); recall->state_flags |= (AGS_SOUND_STATE_IS_WAITING); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_check_rt_data: * @recall: the #AgsRecall * * Prepare for run, this is the pre stage within the preparation. * * Since: 3.0.0 */ void ags_recall_check_rt_data(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_CHECK_RT_DATA], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_run_init_pre(AgsRecall *recall) { GList *list_start, *list, *next; gboolean children_lock_free; gboolean omit_event; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* run init pre */ g_rec_mutex_lock(recall_mutex); recall->flags |= AGS_RECALL_INITIAL_RUN; recall->staging_flags |= AGS_SOUND_STAGING_RUN_INIT_PRE; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->run_init_pre(AGS_RECALL(list->data)); }else{ ags_recall_run_init_pre(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_run_init_pre: * @recall: the #AgsRecall * * Prepare for run, this is the pre stage within the preparation. * * Since: 3.0.0 */ void ags_recall_run_init_pre(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RUN_INIT_PRE], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_run_init_inter(AgsRecall *recall) { GList *list_start, *list, *next; gboolean children_lock_free; gboolean omit_event; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* run init inter */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_RUN_INIT_INTER; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->run_init_inter(AGS_RECALL(list->data)); }else{ ags_recall_run_init_inter(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_run_init_inter: * @recall: the #AgsRecall * * Prepare for run, this is the inter stage within the preparation. * * Since: 3.0.0 */ void ags_recall_run_init_inter(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RUN_INIT_INTER], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_run_init_post(AgsRecall *recall) { GList *list_start, *list, *next; gboolean children_lock_free; gboolean omit_event; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* run init post */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_RUN_INIT_POST; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->run_init_post(AGS_RECALL(list->data)); }else{ ags_recall_run_init_post(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } /* set active */ g_rec_mutex_lock(recall_mutex); recall->state_flags &= (~AGS_SOUND_STATE_IS_WAITING); recall->state_flags |= (AGS_SOUND_STATE_IS_ACTIVE); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_run_init_post: * @recall: the #AgsRecall * * Prepare for run, this is the post stage within the preparation. * * Since: 3.0.0 */ void ags_recall_run_init_post(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RUN_INIT_POST], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_feed_input_queue(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* feed input queue */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_FEED_INPUT_QUEUE; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->feed_input_queue(AGS_RECALL(list->data)); }else{ ags_recall_feed_input_queue(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_feed_input_queue: * @recall: the #AgsRecall * * Feed input queue of @recall. * * Since: 3.0.0 */ void ags_recall_feed_input_queue(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_FEED_INPUT_QUEUE], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_automate(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* automate */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_AUTOMATE; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->automate(AGS_RECALL(list->data)); }else{ ags_recall_automate(AGS_RECALL(list->data)); } list = next; } g_list_free_full(list_start, g_object_unref); } /** * ags_recall_automate: * @recall: the #AgsRecall * * Automate port of @recall. * * Since: 3.0.0 */ void ags_recall_automate(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_AUTOMATE], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_run_pre(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; #if 0 if(AGS_IS_RECALL_AUDIO_SIGNAL(recall)){ g_message("%s::run-pre()", G_OBJECT_TYPE_NAME(recall)); } #endif /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* run pre */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_RUN_PRE; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->run_pre(AGS_RECALL(list->data)); }else{ ags_recall_run_pre(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_run_pre: * @recall: the #AgsRecall * * This is the pre stage within a run. * * Since: 3.0.0 */ void ags_recall_run_pre(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RUN_PRE], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_run_inter(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; #if 0 if(AGS_IS_RECALL_AUDIO_SIGNAL(recall)){ g_message("%s::run-inter()", G_OBJECT_TYPE_NAME(recall)); } #endif /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* run inter */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_RUN_INTER; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->run_inter(AGS_RECALL(list->data)); }else{ ags_recall_run_inter(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_run_inter: * @recall: the #AgsRecall * * This is the inter stage within a run. * * Since: 3.0.0 */ void ags_recall_run_inter(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RUN_INTER], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_run_post(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; #if 0 if(AGS_IS_RECALL_AUDIO_SIGNAL(recall)){ g_message("%s::run-post()", G_OBJECT_TYPE_NAME(recall)); } #endif /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* run post */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_RUN_POST; recall->flags &= (~AGS_RECALL_INITIAL_RUN); if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->run_post(AGS_RECALL(list->data)); }else{ ags_recall_run_post(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_run_post: * @recall: the #AgsRecall * * This is the post stage within a run. * * Since: 3.0.0 */ void ags_recall_run_post(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_RUN_POST], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_do_feedback(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* do feedback */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_DO_FEEDBACK; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->do_feedback(AGS_RECALL(list->data)); }else{ ags_recall_do_feedback(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_do_feedback: * @recall: the #AgsRecall * * Do feedback of @recall. * * Since: 3.0.0 */ void ags_recall_do_feedback(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_DO_FEEDBACK], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_feed_output_queue(AgsRecall *recall) { GList *list_start, *list, *next; GRecMutex *recall_mutex; gboolean children_lock_free; gboolean omit_event; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); children_lock_free = ags_recall_global_get_children_lock_free(); omit_event = ags_recall_global_get_omit_event(); /* feed output queue */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } if(!children_lock_free){ list = list_start = g_list_copy_deep(recall->children, (GCopyFunc) g_object_ref, NULL); }else{ list = list_start = recall->children; } g_rec_mutex_unlock(recall_mutex); while(list != NULL){ next = list->next; if(omit_event){ AGS_RECALL_GET_CLASS(AGS_RECALL(list->data))->feed_output_queue(AGS_RECALL(list->data)); }else{ ags_recall_feed_output_queue(AGS_RECALL(list->data)); } list = next; } if(!children_lock_free){ g_list_free_full(list_start, g_object_unref); } } /** * ags_recall_feed_output_queue: * @recall: the #AgsRecall * * Feed output queue of @recall. * * Since: 3.0.0 */ void ags_recall_feed_output_queue(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_return_if_fail(!ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_FEED_OUTPUT_QUEUE], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_stop_persistent(AgsRecall *recall) { GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* check state and staging */ g_rec_mutex_lock(recall_mutex); if((AGS_SOUND_STATE_IS_TERMINATING & (recall->state_flags)) != 0 || (AGS_SOUND_STAGING_DONE & (recall->staging_flags)) != 0){ g_rec_mutex_unlock(recall_mutex); return; } recall->behaviour_flags &= (~(AGS_SOUND_BEHAVIOUR_PERSISTENT | AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK | AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION | AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER | AGS_SOUND_BEHAVIOUR_PERSISTENT_WAVE | AGS_SOUND_BEHAVIOUR_PERSISTENT_MIDI)); g_rec_mutex_unlock(recall_mutex); /* emit done */ ags_recall_done(recall); } /** * ags_recall_stop_persistent: * @recall: the #AgsRecall * * Unsets the %AGS_SOUND_BEHAVIOUR_PERSISTENT and related behaviour flags and * invokes ags_recall_done(). * * Since: 3.0.0 */ void ags_recall_stop_persistent(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_STOP_PERSISTENT], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_cancel(AgsRecall *recall) { GList *list_start, *list; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* cancel */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_CANCEL; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } list = list_start = g_list_copy(recall->children); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ ags_recall_cancel(AGS_RECALL(list->data)); list = list->next; } g_list_free(list_start); /* stop any recall */ ags_recall_stop_persistent(recall); } /** * ags_recall_cancel: * @recall: the #AgsRecall * * The #AgsRecall doesn't want to run anymore, it aborts further execution. * * Since: 3.0.0 */ void ags_recall_cancel(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_CANCEL], 0); g_object_unref(G_OBJECT(recall)); } void ags_recall_real_done(AgsRecall *recall) { GList *list_start, *list; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); #ifdef AGS_DEBUG if(AGS_IS_RECALL_AUDIO_SIGNAL(recall)){ g_message("done - %s", G_OBJECT_TYPE_NAME(recall)); } #endif /* do feedback */ g_rec_mutex_lock(recall_mutex); recall->staging_flags |= AGS_SOUND_STAGING_DONE; if((AGS_RECALL_TEMPLATE & (recall->flags)) != 0){ g_warning("running on template"); } list = list_start = g_list_copy(recall->children); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ ags_recall_done(AGS_RECALL(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_recall_done: * @recall: the #AgsRecall * * The #AgsRecall doesn't want to run anymore, it has been done its * work. * * Since: 3.0.0 */ void ags_recall_done(AgsRecall *recall) { g_return_if_fail(AGS_IS_RECALL(recall)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_DONE], 0); g_object_unref(G_OBJECT(recall)); } AgsRecall* ags_recall_real_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsRecall *copy_recall; AgsRecallClass *recall_class, *copy_class; AgsRecallContainer *recall_container; GObject *output_soundcard; GObject *input_soundcard; GType child_type; GList *list, *child; guint recall_flags; guint ability_flags; guint behaviour_flags; gint output_soundcard_channel; gint input_soundcard_channel; guint local_n_params; guint i; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get some fields */ g_rec_mutex_lock(recall_mutex); recall_flags = recall->flags; ability_flags = recall->ability_flags; behaviour_flags = recall->behaviour_flags; recall_container = (AgsRecallContainer *) recall->recall_container; output_soundcard = recall->output_soundcard; output_soundcard_channel = recall->output_soundcard_channel; input_soundcard = recall->input_soundcard; input_soundcard_channel = recall->input_soundcard_channel; child_type = recall->child_type; g_rec_mutex_unlock(recall_mutex); /* grow parameter name and value */ local_n_params = 0; if(n_params == NULL){ n_params = &local_n_params; } if(n_params[0] == 0){ parameter_name = (gchar **) malloc(8 * sizeof(gchar *)); value = g_new0(GValue, 7); }else{ parameter_name = (gchar **) realloc(parameter_name, (n_params[0] + 8) * sizeof(gchar *)); value = g_renew(GValue, value, n_params[0] + 7); } /* set parameter name and value */ parameter_name[n_params[0]] = "output-soundcard"; memset(&(value[n_params[0]]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0]]), G_TYPE_OBJECT); g_value_set_object(&(value[n_params[0]]), output_soundcard); parameter_name[n_params[0] + 1] = "output-soundcard-channel"; memset(&(value[n_params[0] + 1]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0] + 1]), G_TYPE_INT); g_value_set_int(&(value[n_params[0] + 1]), output_soundcard_channel); parameter_name[n_params[0] + 2] = "input-soundcard"; memset(&(value[n_params[0] + 2]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0] + 2]), G_TYPE_OBJECT); g_value_set_object(&(value[n_params[0] + 2]), input_soundcard); parameter_name[n_params[0] + 3] = "input-soundcard-channel"; memset(&(value[n_params[0] + 3]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0] + 3]), G_TYPE_INT); g_value_set_int(&(value[n_params[0] + 3]), input_soundcard_channel); parameter_name[n_params[0] + 4] = "recall-id"; memset(&(value[n_params[0] + 4]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0] + 4]), G_TYPE_OBJECT); g_value_set_object(&(value[n_params[0] + 4]), recall_id); parameter_name[n_params[0] + 5] = "recall-container"; memset(&(value[n_params[0] + 5]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0] + 5]), G_TYPE_OBJECT); g_value_set_object(&(value[n_params[0] + 5]), recall_container); parameter_name[n_params[0] + 6] = "child-type"; memset(&(value[n_params[0] + 6]), 0, sizeof(GValue)); g_value_init(&(value[n_params[0] + 6]), G_TYPE_GTYPE); g_value_set_gtype(&(value[n_params[0] + 6]), child_type); parameter_name[n_params[0] + 7] = NULL; n_params[0] += 7; #if HAVE_GLIB_2_54 copy_recall = g_object_new_with_properties(G_OBJECT_TYPE(recall), n_params[0], parameter_name, value); #else copy_recall = g_object_new(G_OBJECT_TYPE(recall), NULL); { guint i; for(i = 0; i < n_params[0]; i++){ g_object_set_property((GObject *) copy_recall, parameter_name[i], &(value[i])); } } #endif /* free parameter name and value */ g_free(parameter_name); for(i = 0; i < n_params[0]; i++){ g_value_unset(&(value[i])); } g_free(value); /* apply flags */ ags_recall_set_flags(copy_recall, (recall_flags & (~ (AGS_RECALL_ADDED_TO_REGISTRY | AGS_RECALL_CONNECTED | AGS_RECALL_TEMPLATE)))); ags_recall_set_ability_flags(copy_recall, ability_flags); ags_recall_set_behaviour_flags(copy_recall, behaviour_flags); // ags_recall_set_sound_scope(copy_recall, sound_scope); /* duplicate handlers */ g_rec_mutex_lock(recall_mutex); list = recall->recall_handler; while(list != NULL){ AgsRecallHandler *recall_handler, *copy_recall_handler; recall_handler = AGS_RECALL_HANDLER(list->data); copy_recall_handler = ags_recall_handler_alloc(recall_handler->signal_name, recall_handler->callback, recall_handler->data); ags_recall_add_recall_handler(copy_recall, copy_recall_handler); list = list->next; } g_rec_mutex_unlock(recall_mutex); /* recall container */ if(recall_container != NULL){ if(AGS_IS_RECALL_AUDIO(copy_recall)){ g_object_set(recall_container, "recall-audio", copy_recall, NULL); }else if(AGS_IS_RECALL_AUDIO_RUN(copy_recall)){ g_object_set(recall_container, "recall-audio-run", copy_recall, NULL); }else if(AGS_IS_RECALL_CHANNEL(copy_recall)){ g_object_set(recall_container, "recall-channel", copy_recall, NULL); }else if(AGS_IS_RECALL_CHANNEL_RUN(copy_recall)){ g_object_set(recall_container, "recall-channel-run", copy_recall, NULL); } } return(copy_recall); } /** * ags_recall_duplicate: * @recall: the template #AgsRecAll * @recall_id: the #AgsRecallID * @n_params: guint pointer to parameter count * @parameter_name: string vector containing parameter names * @value: the #GValue-struct array * * Should duplicate an #AgsRecall, so it can pass the run stages. Mainly used for * creating duplicates of templates, see %AGS_RECALL_TEMPLATE. * * Returns: (transfer full): the duplicated #AgsRecall * * Since: 3.0.0 */ AgsRecall* ags_recall_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsRecall *recall_copy; g_return_val_if_fail(AGS_IS_RECALL(recall), NULL); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_DUPLICATE], 0, recall_id, n_params, parameter_name, value, &recall_copy); g_object_unref(G_OBJECT(recall)); return(recall_copy); } /** * ags_recall_notify_dependency: * @recall: the #AgsRecall * @dependency: the dependency to notify for, see #AgsRecallNotifyDependencyMode-enum * @increase: if %TRUE increase, else if %FALSE decrease * * Notifies a recall that an other depends on it. * * Since: 3.0.0 */ void ags_recall_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase) { g_return_if_fail(AGS_IS_RECALL(recall)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[PLAY_NOTIFY_DEPENDENCY], 0, dependency, increase); g_object_unref(G_OBJECT(recall)); } /** * ags_recall_child_added: * @recall: the #AgsRecall * @child: the child #AgsRecall * * A signal indicating that the a child has been added. * * Since: 3.0.0 */ void ags_recall_child_added(AgsRecall *recall, AgsRecall *child) { g_return_if_fail(AGS_IS_RECALL(recall)); g_object_ref(G_OBJECT(recall)); g_signal_emit(G_OBJECT(recall), recall_signals[CHILD_ADDED], 0, child); g_object_unref(G_OBJECT(recall)); } /** * ags_recall_is_done: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @recycling_context: the #AgsRecyclingContext * * Check if recall is over. * * Returns: %TRUE if recall is done, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_is_done(GList *recall, GObject *recycling_context) { AgsRecall *current_recall; AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; guint current_recall_flags; guint current_staging_flags; GRecMutex *current_recall_mutex; GRecMutex *current_recall_id_mutex; if(recall == NULL || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return(FALSE); } while(recall != NULL){ current_recall = AGS_RECALL(recall->data); /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_recall_flags = current_recall->flags; current_staging_flags = current_recall->staging_flags; current_recall_id = current_recall->recall_id; g_rec_mutex_unlock(current_recall_mutex); if(current_recall_id != NULL){ /* get recall id mutex */ current_recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* get some fields */ g_rec_mutex_lock(current_recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(current_recall_id_mutex); }else{ current_recycling_context = NULL; } if((AGS_RECALL_TEMPLATE & (current_recall_flags)) == 0 && !AGS_IS_RECALL_AUDIO(current_recall) && !AGS_IS_RECALL_CHANNEL(current_recall) && current_recycling_context == (AgsRecyclingContext *) recycling_context){ if((AGS_SOUND_STAGING_DONE & (current_staging_flags)) == 0){ //FIXME:JK: replacement // current_recall->flags &= (~AGS_RECALL_RUN_INITIALIZED); // g_message("done: %s", G_OBJECT_TYPE_NAME(recall)); return(FALSE); } } /* iterate */ recall = recall->next; } return(TRUE); } /** * ags_recall_get_by_effect: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @filename: the filename containing @effect or %NULL * @effect: the effect name * * Finds all recalls matching @filename and @effect. * * Returns: (element-type AgsAudio.Recall) (transfer full): a #GList-struct containing #AgsRecall, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_get_by_effect(GList *recall, gchar *filename, gchar *effect) { GList *list; gchar *current_filename, *current_effect; if(recall == NULL || effect == NULL){ return(NULL); } list = NULL; while(recall != NULL){ /* get some fields */ current_filename = NULL; current_effect = NULL; g_object_get(recall->data, "filename", ¤t_filename, "effect", ¤t_effect, NULL); /* check filename and effect */ if(filename == NULL){ if(current_filename == NULL && current_effect != NULL && !g_strcmp0(current_effect, effect)){ g_object_ref(recall->data); list = g_list_prepend(list, recall->data); } }else{ if(current_filename != NULL && !g_strcmp0(current_filename, filename) && current_effect != NULL && !g_strcmp0(current_effect, effect)){ g_object_ref(recall->data); list = g_list_prepend(list, recall->data); } } g_free(current_filename); g_free(current_effect); /* iterate */ recall = recall->next; } list = g_list_reverse(list); return(list); } /** * ags_recall_find_recall_id_with_effect: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @recall_id: the #AgsRecallID, may be %NULL * @filename: the filename or %NULL * @effect: the effect name * * Finds next matching effect name. Intended to be used as * iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_recall_id_with_effect(GList *recall, AgsRecallID *recall_id, gchar *filename, gchar *effect) { AgsRecall *current_recall; AgsRecallID *current_recall_id; AgsRecyclingContext *recycling_context; AgsRecyclingContext *current_recycling_context; gchar *current_filename, *current_effect; GRecMutex *current_recall_mutex; GRecMutex *recall_id_mutex; GRecMutex *current_recall_id_mutex; if(recall == NULL || effect == NULL){ return(NULL); } /* get recycling context */ recycling_context = NULL; if(recall_id != NULL){ /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* recycling context */ g_rec_mutex_lock(recall_id_mutex); recycling_context = recall_id->recycling_context; g_rec_mutex_unlock(recall_id_mutex); } while(recall != NULL){ current_recall = AGS_RECALL(recall->data); /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_filename = current_recall->filename; current_effect = current_recall->effect; current_recall_id = current_recall->recall_id; g_rec_mutex_unlock(current_recall_mutex); /* get recycling context */ current_recycling_context = NULL; if(current_recall_id != NULL){ /* get recall id mutex */ current_recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* recycling context */ g_rec_mutex_lock(current_recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(current_recall_id_mutex); } /* check recall id, filename and effect */ if(filename == NULL){ if(current_filename == NULL && current_effect != NULL && !g_strcmp0(current_effect, effect)){ if(recall_id == NULL){ if(current_recall_id == NULL){ return(recall); } }else{ if(recycling_context == current_recycling_context){ return(recall); } } } }else{ if(current_filename != NULL && !g_strcmp0(current_filename, filename) && current_effect != NULL && !g_strcmp0(current_effect, effect)){ if(recall_id == NULL){ if(current_recall_id == NULL){ return(recall); } }else{ if(recycling_context == current_recycling_context){ return(recall); } } } } /* iterate */ recall = recall->next; } return(NULL); } /** * ags_recall_find_type: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @type: the #GType * * Finds next matching recall for type. Intended to be used as * iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_type(GList *recall, GType gtype) { AgsRecall *current_recall; while(recall != NULL){ GType current_gtype; current_recall = AGS_RECALL(recall->data); current_gtype = G_OBJECT_TYPE(current_recall); if(g_type_is_a(current_gtype, gtype)){ break; } /* iterate */ recall = recall->next; } return(recall); } /** * ags_recall_find_template: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * * Finds next template, see #AGS_RECALL_TEMPLATE flag. Intended to be used as * iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_template(GList *recall) { AgsRecall *current_recall; guint current_recall_flags; GRecMutex *current_recall_mutex; while(recall != NULL){ current_recall = AGS_RECALL(recall->data); /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_recall_flags = current_recall->flags; g_rec_mutex_unlock(current_recall_mutex); /* check recall flags */ if((AGS_RECALL_TEMPLATE & (current_recall_flags)) != 0){ return(recall); } /* iterate */ recall = recall->next; } return(NULL); } /** * ags_recall_template_find_type: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @type: a #GType * * Finds next matching recall for type which is a template, see #AGS_RECALL_TEMPLATE flag. * Intended to be used as iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_template_find_type(GList *recall, GType gtype) { AgsRecall *current_recall; while(recall != NULL){ current_recall = (AgsRecall *) recall->data; if(AGS_IS_RECALL(current_recall) && (AGS_RECALL_TEMPLATE & (current_recall->flags)) != 0 && g_type_is_a(G_OBJECT_TYPE(current_recall), gtype)){ break; } recall = recall->next; } return(recall); } /** * ags_recall_template_find_all_type: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @...: a #GType * * Finds next matching recall for type which is a template, see #AGS_RECALL_TEMPLATE flag. * Intended to be used as iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_template_find_all_type(GList *recall, ...) { AgsRecall *current_recall; GType *recall_type, *offset; GType current; guint current_recall_flags; guint i; va_list ap; GRecMutex *current_recall_mutex; /* read all types */ va_start(ap, recall); recall_type = (GType *) malloc(sizeof(GType)); i = 0; while(TRUE){ current = va_arg(ap, GType); if(current == G_TYPE_NONE){ break; } recall_type = (GType *) realloc(recall_type, (i + 2) * sizeof(GType)); recall_type[i] = current; i++; } recall_type[i] = G_TYPE_NONE; va_end(ap); /* find all types */ while(recall != NULL){ current_recall = (AgsRecall *) recall->data; if(AGS_IS_RECALL(current_recall)){ /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_recall_flags = current_recall->flags; g_rec_mutex_unlock(current_recall_mutex); /**/ if((AGS_RECALL_TEMPLATE & (current_recall_flags)) != 0){ offset = recall_type; while(offset[0] != G_TYPE_NONE){ if(g_type_is_a(G_OBJECT_TYPE(current_recall), offset[0])){ free(recall_type); return(recall); } offset++; } } } /* iterate */ recall = recall->next; } free(recall_type); return(NULL); } /** * ags_recall_find_type_with_recycling_context: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @type: the #GType * @recycling_context: the #AgsRecyclingContext * * Finds next matching recall for type which has @recycling_context, see #AgsRecallId for further * details about #AgsRecyclingContext. Intended to be used as iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_type_with_recycling_context(GList *recall, GType gtype, GObject *recycling_context) { AgsRecall *current_recall; AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; GRecMutex *current_recall_mutex; GRecMutex *current_recall_id_mutex; while(recall != NULL){ current_recall = AGS_RECALL(recall->data); /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_recall_id = current_recall->recall_id; g_rec_mutex_unlock(current_recall_mutex); /* get recycling context */ current_recycling_context = NULL; if(current_recall_id != NULL){ /* get recall id mutex */ current_recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* recycling context */ g_rec_mutex_lock(current_recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(current_recall_id_mutex); } if(g_type_is_a(G_OBJECT_TYPE(current_recall), gtype) && current_recycling_context == (AgsRecyclingContext *) recycling_context){ return(recall); } /* iterate */ recall = recall->next; } return(NULL); } /** * ags_recall_find_recycling_context: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @recycling_context: the #AgsRecyclingContext * * Finds next matching recall which has @recycling_context, see #AgsRecallId for further * details about #AgsRecyclingContext. Intended to be used as iteration function. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_recycling_context(GList *recall, GObject *recycling_context) { AgsRecall *current_recall; AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; while(recall != NULL){ current_recall = AGS_RECALL(recall->data); /* get some fields */ current_recall_id = NULL; current_recycling_context = NULL; g_object_get(current_recall, "recall-id", ¤t_recall_id, NULL); /* get recycling context */ if(current_recall_id != NULL){ g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); } if(current_recall_id != NULL){ g_object_unref(current_recall_id); } if(current_recycling_context != NULL){ g_object_unref(current_recycling_context); } /* check recycling context */ if(current_recycling_context == (AgsRecyclingContext *) recycling_context){ return(recall); } /* iterate */ recall = recall->next; } return(NULL); } /** * ags_recall_find_provider: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @provider: the #GObject, either #AgsAudio, #AgsChannel, #AgsRecycling or #AgsAudioSignal * * Finds next matching recall for type which has @provider. The @provider may be either an #AgsChannel * or an #AgsAudio object. This function tries to find the corresponding #AgsRecallChannel and #AgsRecallAudio * objects of a #AgsRecall to find. If these recalls contains the @provider, the function will return. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_provider(GList *recall, GObject *provider) { AgsAudio *current_audio; AgsChannel *current_channel; AgsRecycling *current_recycling; AgsAudioSignal *current_audio_signal; AgsRecall *current_recall; gboolean success; while(recall != NULL){ current_recall = AGS_RECALL(recall->data); if(AGS_IS_AUDIO(provider)){ if(AGS_IS_RECALL_AUDIO(current_recall)){ g_object_get(current_recall, "audio", ¤t_audio, NULL); success = ((GObject *) current_audio == provider) ? TRUE: FALSE; g_object_unref(current_audio); if(success){ return(recall); } }else if(AGS_IS_RECALL_AUDIO_RUN(current_recall)){ g_object_get(current_recall, "audio", ¤t_audio, NULL); success = ((GObject *) current_audio == provider) ? TRUE: FALSE; g_object_unref(current_audio); if(success){ return(recall); } } }else if(AGS_IS_CHANNEL(provider)){ if(AGS_IS_RECALL_CHANNEL(current_recall)){ g_object_get(current_recall, "source", ¤t_channel, NULL); success = ((GObject *) current_channel == provider) ? TRUE: FALSE; g_object_unref(current_channel); if(success){ return(recall); } }else if(AGS_IS_RECALL_CHANNEL_RUN(current_recall)){ g_object_get(current_recall, "source", ¤t_channel, NULL); success = ((GObject *) current_channel == provider) ? TRUE: FALSE; g_object_unref(current_channel); if(success){ return(recall); } } }else if(AGS_IS_RECYCLING(provider)){ if(AGS_IS_RECALL_RECYCLING(current_recall)){ g_object_get(current_recall, "source", ¤t_recycling, NULL); success = ((GObject *) current_recycling == provider) ? TRUE: FALSE; g_object_unref(current_recycling); if(success){ return(recall); } } }else if(AGS_IS_AUDIO_SIGNAL(provider)){ if(AGS_IS_RECALL_AUDIO_SIGNAL(current_recall)){ g_object_get(current_recall, "source", ¤t_audio_signal, NULL); success = ((GObject *) current_audio_signal == provider) ? TRUE: FALSE; g_object_unref(current_audio_signal); if(success){ return(recall); } } } /* iterate */ recall = recall->next; } return(NULL); } /** * ags_recall_template_find_provider: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @provider: the #GObject as provider * * Finds provider eg. #AgsAudio or #AgsChannel within @recall containig #AgsRecall. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_template_find_provider(GList *recall, GObject *provider) { AgsRecall *current_recall; guint current_recall_flags; GRecMutex *current_recall_mutex; while((recall = (ags_recall_find_provider(recall, provider))) != NULL){ current_recall = AGS_RECALL(recall->data); /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_recall_flags = current_recall->flags; g_rec_mutex_unlock(current_recall_mutex); /* check template */ if((AGS_RECALL_TEMPLATE & (current_recall_flags)) != 0){ return(recall); } /* iterate */ recall = recall->next; } return(NULL); } /** * ags_recall_find_provider_with_recycling_context: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @provider: the #GObject as provider * @recycling_context: the #AgsRecyclingContext * * Like ags_recall_template_find_provider() but given additionally @recycling_context as search parameter. * * Returns: (element-type AgsAudio.Recall) (transfer none): next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_recall_find_provider_with_recycling_context(GList *recall, GObject *provider, GObject *recycling_context) { AgsRecall *current_recall; AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; GRecMutex *current_recall_mutex; GRecMutex *current_recall_id_mutex; while((recall = ags_recall_find_provider(recall, provider)) != NULL){ current_recall = AGS_RECALL(recall->data); /* get recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(current_recall); /* get some fields */ g_rec_mutex_lock(current_recall_mutex); current_recall_id = current_recall->recall_id; g_rec_mutex_unlock(current_recall_mutex); /* get recycling context */ current_recycling_context = NULL; if(current_recall_id != NULL){ /* get recall id mutex */ current_recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* recycling context */ g_rec_mutex_lock(current_recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(current_recall_id_mutex); } if(current_recycling_context == (AgsRecyclingContext *) recycling_context){ return(recall); } /* iterate */ recall = recall->next; } return(NULL); } void ags_recall_child_done(AgsRecall *child, AgsRecall *parent) { GList *children; guint parent_behaviour_flags; /* remove child */ ags_connectable_disconnect(AGS_CONNECTABLE(child)); ags_recall_remove_child(parent, child); if(TRUE){ AgsDestroyWorker *destroy_worker; destroy_worker = ags_destroy_worker_get_instance(); ags_destroy_worker_add(destroy_worker, child, ags_destroy_util_dispose_and_unref); }else{ g_object_run_dispose((GObject *) child); g_object_unref((GObject *) child); } g_object_get(parent, "child", &children, NULL); if(ags_recall_test_behaviour_flags(parent, AGS_SOUND_BEHAVIOUR_PROPAGATE_DONE) && !ags_recall_test_behaviour_flags(parent, AGS_SOUND_BEHAVIOUR_PERSISTENT) && children == NULL){ ags_recall_done(parent); } g_list_free_full(children, g_object_unref); } /** * ags_recall_lock_port: * @recall: the #AgsRecall * * Locks the ports. * * Since: 3.0.0 */ void ags_recall_lock_port(AgsRecall *recall) { AgsPort *port; GList *list_start, *list; GRecMutex *recall_mutex; GRecMutex *port_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get some fields */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy(recall->port); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* lock port mutex */ g_rec_mutex_lock(port_mutex); /* iterate */ list = list->next; } g_list_free(list_start); } /** * ags_recall_unlock_port: * @recall: the #AgsRecall * * Unlocks the ports. * * Since: 3.0.0 */ void ags_recall_unlock_port(AgsRecall *recall) { AgsPort *port; GList *list_start, *list; GRecMutex *recall_mutex; GRecMutex *port_mutex; if(!AGS_IS_RECALL(recall)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get some fields */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy(recall->port); g_rec_mutex_unlock(recall_mutex); while(list != NULL){ port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* lock port mutex */ g_rec_mutex_unlock(port_mutex); /* iterate */ list = list->next; } g_list_free(list_start); } /** * ags_recall_new: * * Instantiate #AgsRecall. * * Returns: the new instance of #AgsRecall. * * Since: 3.0.0 */ AgsRecall* ags_recall_new() { AgsRecall *recall; recall = (AgsRecall *) g_object_new(AGS_TYPE_RECALL, NULL); return(recall); } gsequencer-3.1.3/ags/audio/ags_devin.h0000644000175000017500000001267213607210263014573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DEVIN_H__ #define __AGS_DEVIN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DEVIN (ags_devin_get_type()) #define AGS_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DEVIN, AgsDevin)) #define AGS_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DEVIN, AgsDevin)) #define AGS_IS_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DEVIN)) #define AGS_IS_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DEVIN)) #define AGS_DEVIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DEVIN, AgsDevinClass)) #define AGS_DEVIN_GET_OBJ_MUTEX(obj) (&(((AgsDevin *) obj)->obj_mutex)) #define AGS_DEVIN_DEFAULT_ALSA_DEVICE "hw:0,0" #define AGS_DEVIN_DEFAULT_OSS_DEVICE "/dev/dsp" #define AGS_DEVIN_DEFAULT_RING_BUFFER_SIZE (8) typedef struct _AgsDevin AgsDevin; typedef struct _AgsDevinClass AgsDevinClass; /** * AgsDevinFlags: * @AGS_DEVIN_ADDED_TO_REGISTRY: the devin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_DEVIN_CONNECTED: indicates the devin was connected by calling #AgsConnectable::connect() * @AGS_DEVIN_BUFFER0: ring-buffer 0 * @AGS_DEVIN_BUFFER1: ring-buffer 1 * @AGS_DEVIN_BUFFER2: ring-buffer 2 * @AGS_DEVIN_BUFFER3: ring-buffer 3 * @AGS_DEVIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_DEVIN_RECORD: do capture * @AGS_DEVIN_OSS: use OSS4 backend * @AGS_DEVIN_ALSA: use ALSA backend * @AGS_DEVIN_SHUTDOWN: stop capture * @AGS_DEVIN_START_RECORD: capture starting * @AGS_DEVIN_NONBLOCKING: do non-blocking calls * @AGS_DEVIN_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsDevin by * enable/disable as flags. */ typedef enum { AGS_DEVIN_ADDED_TO_REGISTRY = 1, AGS_DEVIN_CONNECTED = 1 << 1, AGS_DEVIN_BUFFER0 = 1 << 2, AGS_DEVIN_BUFFER1 = 1 << 3, AGS_DEVIN_BUFFER2 = 1 << 4, AGS_DEVIN_BUFFER3 = 1 << 5, AGS_DEVIN_ATTACK_FIRST = 1 << 6, AGS_DEVIN_RECORD = 1 << 7, AGS_DEVIN_OSS = 1 << 8, AGS_DEVIN_ALSA = 1 << 9, AGS_DEVIN_SHUTDOWN = 1 << 10, AGS_DEVIN_START_RECORD = 1 << 11, AGS_DEVIN_NONBLOCKING = 1 << 12, AGS_DEVIN_INITIALIZED = 1 << 13, }AgsDevinFlags; #define AGS_DEVIN_ERROR (ags_devin_error_quark()) typedef enum{ AGS_DEVIN_ERROR_LOCKED_SOUNDCARD, AGS_DEVIN_ERROR_BROKEN_CONFIGURATION, AGS_DEVIN_ERROR_ACCESS_TYPE_NOT_AVAILABLE, AGS_DEVIN_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, AGS_DEVIN_ERROR_CHANNELS_NOT_AVAILABLE, AGS_DEVIN_ERROR_SAMPLERATE_NOT_AVAILABLE, AGS_DEVIN_ERROR_BUFFER_SIZE_NOT_AVAILABLE, AGS_DEVIN_ERROR_HW_PARAMETERS_NOT_AVAILABLE, }AgsDevinError; struct _AgsDevin { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; // sample_rate GRecMutex **buffer_mutex; void **buffer; volatile gboolean available; guint ring_buffer_size; guint nth_ring_buffer; unsigned char **ring_buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; union{ struct _AgsOssIn{ int device_fd; char *device; }oss; #ifdef AGS_WITH_ALSA struct _AgsAlsaIn{ char *device; int rc; snd_pcm_t *handle; snd_async_handler_t *ahandler; snd_pcm_hw_params_t *params; }alsa; #else struct _AgsAlsaDummyIn{ char *device; int rc; void *handle; void *ahandler; void *params; }alsa; #endif }out; }; struct _AgsDevinClass { GObjectClass gobject; }; GType ags_devin_get_type(); GQuark ags_devin_error_quark(); gboolean ags_devin_test_flags(AgsDevin *devin, guint flags); void ags_devin_set_flags(AgsDevin *devin, guint flags); void ags_devin_unset_flags(AgsDevin *devin, guint flags); void ags_devin_switch_buffer_flag(AgsDevin *devin); void ags_devin_adjust_delay_and_attack(AgsDevin *devin); void ags_devin_realloc_buffer(AgsDevin *devin); AgsDevin* ags_devin_new(); G_END_DECLS #endif /*__AGS_DEVIN_H__*/ gsequencer-3.1.3/ags/audio/ags_fifoout.h0000644000175000017500000001135213607210263015133 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FIFOOUT_H__ #define __AGS_FIFOOUT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FIFOOUT (ags_fifoout_get_type()) #define AGS_FIFOOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FIFOOUT, AgsFifoout)) #define AGS_FIFOOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FIFOOUT, AgsFifoout)) #define AGS_IS_FIFOOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FIFOOUT)) #define AGS_IS_FIFOOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FIFOOUT)) #define AGS_FIFOOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_FIFOOUT, AgsFifooutClass)) #define AGS_FIFOOUT_GET_OBJ_MUTEX(obj) (&(((AgsFifoout *) obj)->obj_mutex)) #define AGS_FIFOOUT_DEFAULT_DEVICE "/dev/null" #define AGS_FIFOOUT_DEFAULT_RING_BUFFER_SIZE (8) typedef struct _AgsFifoout AgsFifoout; typedef struct _AgsFifooutClass AgsFifooutClass; /** * AgsFifooutFlags: * @AGS_FIFOOUT_ADDED_TO_REGISTRY: the fifoout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_FIFOOUT_CONNECTED: indicates the fifoout was connected by calling #AgsConnectable::connect() * @AGS_FIFOOUT_BUFFER0: ring-buffer 0 * @AGS_FIFOOUT_BUFFER1: ring-buffer 1 * @AGS_FIFOOUT_BUFFER2: ring-buffer 2 * @AGS_FIFOOUT_BUFFER3: ring-buffer 3 * @AGS_FIFOOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_FIFOOUT_PLAY: use first attack, instead of second one * @AGS_FIFOOUT_SHUTDOWN: stop playback * @AGS_FIFOOUT_START_PLAY: playback starting * @AGS_FIFOOUT_NONBLOCKING: do non-blocking calls * @AGS_FIFOOUT_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsFifoout by * enable/disable as flags. */ typedef enum { AGS_FIFOOUT_ADDED_TO_REGISTRY = 1, AGS_FIFOOUT_CONNECTED = 1 << 1, AGS_FIFOOUT_BUFFER0 = 1 << 2, AGS_FIFOOUT_BUFFER1 = 1 << 3, AGS_FIFOOUT_BUFFER2 = 1 << 4, AGS_FIFOOUT_BUFFER3 = 1 << 5, AGS_FIFOOUT_ATTACK_FIRST = 1 << 6, AGS_FIFOOUT_PLAY = 1 << 7, AGS_FIFOOUT_SHUTDOWN = 1 << 8, AGS_FIFOOUT_START_PLAY = 1 << 9, AGS_FIFOOUT_NONBLOCKING = 1 << 10, AGS_FIFOOUT_INITIALIZED = 1 << 11, }AgsFifooutFlags; #define AGS_FIFOOUT_ERROR (ags_fifoout_error_quark()) typedef enum{ AGS_FIFOOUT_ERROR_LOCKED_SOUNDCARD, }AgsFifooutError; struct _AgsFifoout { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; // sample_rate GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void** buffer; volatile gboolean available; guint ring_buffer_size; guint nth_ring_buffer; unsigned char **ring_buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *device; int fifo_fd; }; struct _AgsFifooutClass { GObjectClass gobject; }; GType ags_fifoout_get_type(); GQuark ags_fifoout_error_quark(); gboolean ags_fifoout_test_flags(AgsFifoout *fifoout, guint flags); void ags_fifoout_set_flags(AgsFifoout *fifoout, guint flags); void ags_fifoout_unset_flags(AgsFifoout *fifoout, guint flags); void ags_fifoout_switch_buffer_flag(AgsFifoout *fifoout); void ags_fifoout_adjust_delay_and_attack(AgsFifoout *fifoout); void ags_fifoout_realloc_buffer(AgsFifoout *fifoout); AgsFifoout* ags_fifoout_new(); G_END_DECLS #endif /*__AGS_FIFOOUT_H__*/ gsequencer-3.1.3/ags/audio/ags_synth_util.c0000644000175000017500000015273113607210263015664 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include /** * ags_synth_util_get_xcross_count_s8: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_s8(gint8 *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_s16: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_s16(gint16 *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_s24: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_s24(gint32 *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_s32: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_s32(gint32 *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_s64: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_s64(gint64 *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_float: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_float(float *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0.0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0.0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0.0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_double: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_double(double *buffer, guint buffer_size) { guint count; guint i; gboolean negative; count = 0; if(buffer[0] > 0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ if(negative && buffer[i] > 0.0){ count++; negative = FALSE; }else if(!negative && buffer[i] < 0.0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count_complex: * @buffer: the buffer containing audio data * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count_complex(AgsComplex *buffer, guint buffer_size) { gfloat **ptr_ptr; gfloat *ptr; gfloat value; guint count; complex z; guint i; gboolean negative; count = 0; ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_FLOAT_FRAME(buffer, 1, 0, buffer_size, ptr_ptr); if(value > 0.0){ negative = FALSE; }else{ negative = TRUE; } for(i = 1; i < buffer_size; i++){ AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_FLOAT_FRAME(buffer + i, 1, i, buffer_size, ptr_ptr); if(negative && value > 0.0){ count++; negative = FALSE; }else if(!negative && value < 0.0){ count++; negative = TRUE; } } return(count); } /** * ags_synth_util_get_xcross_count: * @buffer: the buffer containing audio data * @audio_buffer_util_format: the audio buffer util format * @buffer_size: the buffer size * * Get zero-cross count. * * Returns: the count of zero-crossings * * Since: 3.0.0 */ guint ags_synth_util_get_xcross_count(void *buffer, guint audio_buffer_util_format, guint buffer_size) { guint count; count = 0; switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { count = ags_synth_util_get_xcross_count_s8((gint8 *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { count = ags_synth_util_get_xcross_count_s16((gint16 *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { count = ags_synth_util_get_xcross_count_s24((gint32 *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { count = ags_synth_util_get_xcross_count_s32((gint32 *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { count = ags_synth_util_get_xcross_count_s64((gint64 *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { count = ags_synth_util_get_xcross_count_float((float *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { count = ags_synth_util_get_xcross_count_double((double *) buffer, buffer_size); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { count = ags_synth_util_get_xcross_count_complex((AgsComplex *) buffer, buffer_size); } break; default: { g_warning("ags_synth_util_get_xcross_count() - unsupported format"); } } return(count); } /** * ags_synth_util_sin_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 127.0; guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * scale * volume))); } } /** * ags_synth_util_sin_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 32767.0; guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * scale * volume))); } } /** * ags_synth_util_sin_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 8388607.0; guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * scale * volume))); } } /** * ags_synth_util_sin_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 214748363.0; guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * scale * volume))); } } /** * ags_synth_util_sin_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 9223372036854775807.0; guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * scale * volume))); } } /** * ags_synth_util_sin_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * volume)); } } /** * ags_synth_util_sin_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * volume)); } } /** * ags_synth_util_sin_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sinus wave. * * Since: 3.0.0 */ void ags_synth_util_sin_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ y = (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_synth_util_sawtooth_s8: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 127.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * scale * volume))); } } /** * ags_synth_util_sawtooth_s16: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 32767.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * scale * volume))); } } /** * ags_synth_util_sawtooth_s24: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 8388607.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * scale * volume))); } } /** * ags_synth_util_sawtooth_s32: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 214748363.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * scale * volume))); } } /** * ags_synth_util_sawtooth_s64: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 9223372036854775807.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * scale * volume))); } } /** * ags_synth_util_sawtooth_float: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * volume)); } } /** * ags_synth_util_sawtooth_double: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * volume)); } } /** * ags_synth_util_sawtooth_complex: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ y = (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_synth_util_triangle_s8: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 127.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } /** * ags_synth_util_triangle_s16: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 32767.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } /** * ags_synth_util_triangle_s24: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 8388607.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } /** * ags_synth_util_triangle_s32: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 214748363.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } /** * ags_synth_util_triangle_s64: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 9223372036854775807.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } /** * ags_synth_util_triangle_float: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } /** * ags_synth_util_triangle_double: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } /** * ags_synth_util_triangle_complex: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ y = (double) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_synth_util_square_s8: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 127.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } /** * ags_synth_util_square_s16: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 32767.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } /** * ags_synth_util_square_s24: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 8388607.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } /** * ags_synth_util_square_s32: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 214748363.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } /** * ags_synth_util_square_s64: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 9223372036854775807.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } /** * ags_synth_util_square_float: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } /** * ags_synth_util_square_double: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } /** * ags_synth_util_square_complex: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_synth_util_impulse_s8: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 127.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } /** * ags_synth_util_impulse_s16: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 32767.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } /** * ags_synth_util_impulse_s24: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 8388607.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } /** * ags_synth_util_impulse_s32: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 214748363.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } /** * ags_synth_util_impulse_s64: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { static const gdouble scale = 9223372036854775807.0; guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } /** * ags_synth_util_impulse_float: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } /** * ags_synth_util_impulse_double: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } /** * ags_synth_util_impulse_complex: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_synth_util_sin: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * Generate sin wave. * * Since: 3.0.0 */ void ags_synth_util_sin(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_synth_util_sin_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_synth_util_sin_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_synth_util_sin_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_synth_util_sin_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_synth_util_sin_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_synth_util_sin_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_synth_util_sin_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_synth_util_sin_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; default: { g_warning("ags_synth_util_sin() - unsupported format"); } } } /** * ags_synth_util_sawtooth: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @volume: the volume of the sawtooth wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * Generate sawtooth wave. * * Since: 3.0.0 */ void ags_synth_util_sawtooth(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_synth_util_sawtooth_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_synth_util_sawtooth_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_synth_util_sawtooth_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_synth_util_sawtooth_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_synth_util_sawtooth_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_synth_util_sawtooth_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_synth_util_sawtooth_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_synth_util_sawtooth_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; default: { g_warning("ags_synth_util_sawtooth() - unsupported format"); } } } /** * ags_synth_util_triangle: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @volume: the volume of the triangle wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * Generate triangle wave. * * Since: 3.0.0 */ void ags_synth_util_triangle(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_synth_util_triangle_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_synth_util_triangle_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_synth_util_triangle_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_synth_util_triangle_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_synth_util_triangle_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_synth_util_triangle_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_synth_util_triangle_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_synth_util_triangle_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; default: { g_warning("ags_synth_util_triangle() - unsupported format"); } } } /** * ags_synth_util_square: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @volume: the volume of the square wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * Generate square wave. * * Since: 3.0.0 */ void ags_synth_util_square(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_synth_util_square_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_synth_util_square_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_synth_util_square_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_synth_util_square_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_synth_util_square_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_synth_util_square_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_synth_util_square_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_synth_util_square_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; default: { g_warning("ags_synth_util_square() - unsupported format"); } } } /** * ags_synth_util_impulse: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @volume: the volume of the impulse wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * Generate impulse wave. * * Since: 3.0.0 */ void ags_synth_util_impulse(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_synth_util_impulse_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_synth_util_impulse_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_synth_util_impulse_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_synth_util_impulse_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_synth_util_impulse_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_synth_util_impulse_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_synth_util_impulse_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_synth_util_impulse_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames); } break; default: { g_warning("ags_synth_util_impulse() - unsupported format"); } } } gsequencer-3.1.3/ags/audio/ags_synth_util.h0000644000175000017500000002226013607210263015662 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_UTIL_H__ #define __AGS_SYNTH_UTIL_H__ #include #include #include G_BEGIN_DECLS /* zero-crossing */ guint ags_synth_util_get_xcross_count_s8(gint8 *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_s16(gint16 *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_s24(gint32 *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_s32(gint32 *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_s64(gint64 *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_float(float *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_double(double *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count_complex(AgsComplex *buffer, guint buffer_size); guint ags_synth_util_get_xcross_count(void *buffer, guint audio_buffer_util_format, guint buffer_size); /* sin oscillator */ void ags_synth_util_sin_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sin_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); /* sawtooth oscillator */ void ags_synth_util_sawtooth_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_sawtooth_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); /* triangle oscillator */ void ags_synth_util_triangle_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_triangle_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); /* square oscillator */ void ags_synth_util_square_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_square_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); /* impulse oscillator */ void ags_synth_util_impulse_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); void ags_synth_util_impulse_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames); /* oscillators */ void ags_synth_util_sin(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_synth_util_sawtooth(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_synth_util_triangle(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_synth_util_square(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_synth_util_impulse(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); G_END_DECLS #endif /*__AGS_SYNTH_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_notation.h0000644000175000017500000001575213616617253015335 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTATION_H__ #define __AGS_NOTATION_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NOTATION (ags_notation_get_type()) #define AGS_NOTATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTATION, AgsNotation)) #define AGS_NOTATION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTATION, AgsNotationClass)) #define AGS_IS_NOTATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_NOTATION)) #define AGS_IS_NOTATION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_NOTATION)) #define AGS_NOTATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_NOTATION, AgsNotationClass)) #define AGS_NOTATION_GET_OBJ_MUTEX(obj) (&(((AgsNotation *) obj)->obj_mutex)) #define AGS_NOTATION_DEFAULT_BPM (120.0) #define AGS_NOTATION_TICS_PER_BEAT (1.0) #define AGS_NOTATION_MINIMUM_NOTE_LENGTH (1.0 / 16.0) #define AGS_NOTATION_MAXIMUM_NOTE_LENGTH (16.0) #define AGS_NOTATION_DEFAULT_LENGTH (65535.0 / AGS_NOTATION_TICS_PER_BEAT - AGS_NOTATION_MAXIMUM_NOTE_LENGTH) #define AGS_NOTATION_DEFAULT_JIFFIE (60.0 / AGS_NOTATION_DEFAULT_BPM / AGS_NOTATION_TICS_PER_BEAT) #define AGS_NOTATION_DEFAULT_DURATION (AGS_NOTATION_DEFAULT_LENGTH * AGS_NOTATION_DEFAULT_JIFFIE * AGS_USEC_PER_SEC) #define AGS_NOTATION_DEFAULT_OFFSET (64 * (1 / AGS_NOTATION_MINIMUM_NOTE_LENGTH)) #define AGS_NOTATION_DEFAULT_END (64 * 64 * 1200) #define AGS_NOTATION_CLIPBOARD_VERSION "1.2.0" #define AGS_NOTATION_CLIPBOARD_TYPE "AgsNotationClipboardXml" #define AGS_NOTATION_CLIPBOARD_FORMAT "AgsNotationNativePiano" typedef struct _AgsNotation AgsNotation; typedef struct _AgsNotationClass AgsNotationClass; /** * AgsNotationFlags: * @AGS_NOTATION_PATTERN_MODE: pattern mode * @AGS_NOTATION_BYPASS: ignore any notation data * * Enum values to control the behavior or indicate internal state of #AgsNotation by * enable/disable as flags. */ typedef enum{ AGS_NOTATION_PATTERN_MODE = 1, AGS_NOTATION_BYPASS = 1 << 1, }AgsNotationFlags; struct _AgsNotation { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio; guint audio_channel; gboolean is_minor; guint sharp_flats; AgsTimestamp *timestamp; gdouble maximum_note_length; GList *note; GList *selection; }; struct _AgsNotationClass { GObjectClass gobject; }; GType ags_notation_get_type(); GRecMutex* ags_notation_get_obj_mutex(AgsNotation *notation); gboolean ags_notation_test_flags(AgsNotation *notation, guint flags); void ags_notation_set_flags(AgsNotation *notation, guint flags); void ags_notation_unset_flags(AgsNotation *notation, guint flags); GList* ags_notation_find_near_timestamp(GList *notation, guint audio_channel, AgsTimestamp *timestamp); GList* ags_notation_add(GList *notation, AgsNotation *new_notation); gint ags_notation_sort_func(gconstpointer a, gconstpointer b); GObject* ags_notation_get_audio(AgsNotation *notation); void ags_notation_set_audio(AgsNotation *notation, GObject *audio); guint ags_notation_get_audio_channel(AgsNotation *notation); void ags_notation_set_audio_channel(AgsNotation *notation, guint audio_channel); gboolean ags_notation_get_is_minor(AgsNotation *notation); void ags_notation_set_is_minor(AgsNotation *notation, gboolean is_minor); guint ags_notation_get_sharp_flats(AgsNotation *notation); void ags_notation_set_sharp_flats(AgsNotation *notation, guint sharp_flats); AgsTimestamp* ags_notation_get_timestamp(AgsNotation *notation); void ags_notation_set_timestamp(AgsNotation *notation, AgsTimestamp *timestamp); GList* ags_notation_get_note(AgsNotation *notation); void ags_notation_set_note(AgsNotation *notation, GList *note); void ags_notation_add_note(AgsNotation *notation, AgsNote *note, gboolean use_selection_list); void ags_notation_remove_note(AgsNotation *notation, AgsNote *note, gboolean use_selection_list); gboolean ags_notation_remove_note_at_position(AgsNotation *notation, guint x, guint y); GList* ags_notation_get_selection(AgsNotation *notation); gboolean ags_notation_is_note_selected(AgsNotation *notation, AgsNote *note); AgsNote* ags_notation_find_point(AgsNotation *notation, guint x, guint y, gboolean use_selection_list); GList* ags_notation_find_region(AgsNotation *notation, guint x0, guint y0, guint x1, guint y1, gboolean use_selection_list); GList* ags_notation_find_offset(AgsNotation *notation, guint x, gboolean use_selection_list); void ags_notation_free_selection(AgsNotation *notation); void ags_notation_add_point_to_selection(AgsNotation *notation, guint x, guint y, gboolean replace_current_selection); void ags_notation_remove_point_from_selection(AgsNotation *notation, guint x, guint y); void ags_notation_add_region_to_selection(AgsNotation *notation, guint x0, guint y0, guint x1, guint y1, gboolean replace_current_selection); void ags_notation_remove_region_from_selection(AgsNotation *notation, guint x0, guint y0, guint x1, guint y1); void ags_notation_add_all_to_selection(AgsNotation *notation); xmlNode* ags_notation_copy_selection(AgsNotation *notation); xmlNode* ags_notation_cut_selection(AgsNotation *notation); void ags_notation_insert_from_clipboard(AgsNotation *notation, xmlNode *notation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset); void ags_notation_insert_from_clipboard_extended(AgsNotation *notation, xmlNode *notation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset, gboolean match_channel, gboolean no_duplicates); guchar* ags_notation_to_raw_midi(AgsNotation *notation, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo, guint *buffer_length); AgsNotation* ags_notation_from_raw_midi(guchar *raw_midi, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor, guint buffer_length); AgsNotation* ags_notation_new(GObject *audio, guint audio_channel); G_END_DECLS #endif /*__AGS_NOTATION_H__*/ gsequencer-3.1.3/ags/audio/ags_fm_synth_util.h0000644000175000017500000003161313607210263016346 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FM_SYNTH_UTIL_H__ #define __AGS_FM_SYNTH_UTIL_H__ #include #include #include G_BEGIN_DECLS /* fm sin oscillator */ void ags_fm_synth_util_sin_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sin_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); /* fm sawtooth oscillator */ void ags_fm_synth_util_sawtooth_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); /* fm triangle oscillator */ void ags_fm_synth_util_triangle_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); /* fm square oscillator */ void ags_fm_synth_util_square_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); /* fm impulse oscillator */ void ags_fm_synth_util_impulse_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); /* oscillators */ void ags_fm_synth_util_sin(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_sawtooth(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_triangle(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_square(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); void ags_fm_synth_util_impulse(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning); G_END_DECLS #endif /*__AGS_FM_SYNTH_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_filter_util.h0000644000175000017500000000433213607210263016002 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FILTER_UTIL_H__ #define __AGS_FILTER_UTIL_H__ #include #include #include G_BEGIN_DECLS #define AGS_FILTER_UTIL_DEFAULT_TMP_BUFFER_SIZE (8192) void ags_filter_util_pitch_s8(gint8 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_s16(gint16 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_s24(gint32 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_s32(gint32 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_s64(gint64 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_float(gfloat *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_double(gdouble *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); void ags_filter_util_pitch_complex(AgsComplex *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning); G_END_DECLS #endif /*__AGS_FILTER_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_ladspa_run.h0000644000175000017500000000446013607210263017134 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_LADSPA_RUN_H__ #define __AGS_RECALL_LADSPA_RUN_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_LADSPA_RUN (ags_recall_ladspa_run_get_type()) #define AGS_RECALL_LADSPA_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_LADSPA_RUN, AgsRecallLadspaRun)) #define AGS_RECALL_LADSPA_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_LADSPA_RUN, AgsRecallLadspaRunClass)) #define AGS_IS_RECALL_LADSPA_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_LADSPA_RUN)) #define AGS_IS_RECALL_LADSPA_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_LADSPA_RUN)) #define AGS_RECALL_LADSPA_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_LADSPA_RUN, AgsRecallLadspaRunClass)) typedef struct _AgsRecallLadspaRun AgsRecallLadspaRun; typedef struct _AgsRecallLadspaRunClass AgsRecallLadspaRunClass; struct _AgsRecallLadspaRun { AgsRecallAudioSignal recall_audio_signal; guint audio_channels; LADSPA_Handle *ladspa_handle; LADSPA_Data *input; LADSPA_Data *output; }; struct _AgsRecallLadspaRunClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_recall_ladspa_run_get_type(); AgsRecallLadspaRun* ags_recall_ladspa_run_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_RECALL_LADSPA_RUN_H__*/ gsequencer-3.1.3/ags/audio/ags_recycling.h0000644000175000017500000001317513616617253015456 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECYCLING_H__ #define __AGS_RECYCLING_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECYCLING (ags_recycling_get_type()) #define AGS_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECYCLING, AgsRecycling)) #define AGS_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECYCLING, AgsRecyclingClass)) #define AGS_IS_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECYCLING)) #define AGS_IS_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECYCLING)) #define AGS_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECYCLING, AgsRecyclingClass)) #define AGS_RECYCLING_GET_OBJ_MUTEX(obj) (&(((AgsRecycling *) obj)->obj_mutex)) typedef struct _AgsRecycling AgsRecycling; typedef struct _AgsRecyclingClass AgsRecyclingClass; /** * AgsRecyclingFlags: * @AGS_RECYCLING_ADDED_TO_REGISTRY: the recycling was added to registry, see #AgsConnectable::add_to_registry() * @AGS_RECYCLING_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_RECYCLING_MUTED: recycling is muted * * Enum values to control the behavior or indicate internal state of #AgsRecycling by * enable/disable as flags. */ typedef enum{ AGS_RECYCLING_ADDED_TO_REGISTRY = 1, AGS_RECYCLING_CONNECTED = 1 << 1, AGS_RECYCLING_MUTED = 1 << 2, }AgsRecyclingFlags; struct _AgsRecycling { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *channel; GObject *output_soundcard; gint output_soundcard_channel; GObject *input_soundcard; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; AgsRecycling *parent; AgsRecycling *next; AgsRecycling *prev; GList *audio_signal; }; struct _AgsRecyclingClass { GObjectClass gobject; void (*add_audio_signal)(AgsRecycling *recycling, AgsAudioSignal *audio_signal); void (*remove_audio_signal)(AgsRecycling *recycling, AgsAudioSignal *audio_signal); void (*data_request)(AgsRecycling *recycling, AgsAudioSignal *audio_signal); }; GType ags_recycling_get_type(void); GRecMutex* ags_recycling_get_obj_mutex(AgsRecycling *recycling); gboolean ags_recycling_test_flags(AgsRecycling *recycling, guint flags); void ags_recycling_set_flags(AgsRecycling *recycling, guint flags); void ags_recycling_unset_flags(AgsRecycling *recycling, guint flags); /* parent */ GObject* ags_recycling_get_channel(AgsRecycling *recycling); void ags_recycling_set_channel(AgsRecycling *recycling, GObject *channel); /* recycling */ AgsRecycling* ags_recycling_next(AgsRecycling *recycling); AgsRecycling* ags_recycling_prev(AgsRecycling *recycling); /* soundcard */ GObject* ags_recycling_get_output_soundcard(AgsRecycling *recycling); void ags_recycling_set_output_soundcard(AgsRecycling *recycling, GObject *output_soundcard); GObject* ags_recycling_get_input_soundcard(AgsRecycling *recycling); void ags_recycling_set_input_soundcard(AgsRecycling *recycling, GObject *input_soundcard); /* presets */ guint ags_recycling_get_samplerate(AgsRecycling *recycling); void ags_recycling_set_samplerate(AgsRecycling *recycling, guint samplerate); guint ags_recycling_get_buffer_size(AgsRecycling *recycling); void ags_recycling_set_buffer_size(AgsRecycling *recycling, guint buffer_size); guint ags_recycling_get_format(AgsRecycling *recycling); void ags_recycling_set_format(AgsRecycling *recycling, guint format); /* children */ GList* ags_recycling_get_audio_signal(AgsRecycling *recycling); void ags_recycling_set_audio_signal(AgsRecycling *recycling, GList *audio_signal); void ags_recycling_add_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal); void ags_recycling_remove_audio_signal(AgsRecycling *recycling, AgsAudioSignal *audio_signal); /* refresh data */ void ags_recycling_data_request(AgsRecycling *recycling, AgsAudioSignal *audio_signal); /* query */ gint ags_recycling_position(AgsRecycling *start_region, AgsRecycling *end_region, AgsRecycling *recycling); AgsRecycling* ags_recycling_find_next_channel(AgsRecycling *start_region, AgsRecycling *end_region, GObject *prev_channel); gboolean ags_recycling_is_active(AgsRecycling *start_region, AgsRecycling *end_region, GObject *recall_id); /* sample creation */ void ags_recycling_create_audio_signal_with_defaults(AgsRecycling *recycling, AgsAudioSignal *audio_signal, gdouble delay, guint attack); void ags_recycling_create_audio_signal_with_frame_count(AgsRecycling *recycling, AgsAudioSignal *audio_signal, guint frame_count, gdouble delay, guint attack); /* instantiate */ AgsRecycling* ags_recycling_new(GObject *output_soundcard); G_END_DECLS #endif /*__AGS_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_dssi_run.c0000644000175000017500000007360513616617253016646 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_dssi_run_class_init(AgsRecallDssiRunClass *recall_dssi_run_class); void ags_recall_dssi_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_dssi_run_init(AgsRecallDssiRun *recall_dssi_run); void ags_recall_dssi_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_dssi_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_dssi_run_finalize(GObject *gobject); void ags_recall_dssi_run_run_init_pre(AgsRecall *recall); void ags_recall_dssi_run_run_pre(AgsRecall *recall); void ags_recall_dssi_run_load_ports(AgsRecallDssiRun *recall_dssi_run); /** * SECTION:ags_recall_dssi_run * @Short_description: The object interfacing with DSSI * @Title: AgsRecallDssiRun * * #AgsRecallDssiRun provides DSSI support. */ enum{ PROP_0, PROP_NOTE, PROP_ROUTE_DSSI_AUDIO_RUN, }; static gpointer ags_recall_dssi_run_parent_class = NULL; static AgsConnectableInterface* ags_recall_dssi_run_parent_connectable_interface; GType ags_recall_dssi_run_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_dssi_run = 0; static const GTypeInfo ags_recall_dssi_run_info = { sizeof (AgsRecallDssiRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_dssi_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallDssiRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_dssi_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_dssi_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_dssi_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsRecallDssiRun", &ags_recall_dssi_run_info, 0); g_type_add_interface_static(ags_type_recall_dssi_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_dssi_run); } return g_define_type_id__volatile; } void ags_recall_dssi_run_class_init(AgsRecallDssiRunClass *recall_dssi_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_dssi_run_parent_class = g_type_class_peek_parent(recall_dssi_run); /* GObjectClass */ gobject = (GObjectClass *) recall_dssi_run; gobject->set_property = ags_recall_dssi_run_set_property; gobject->get_property = ags_recall_dssi_run_get_property; gobject->finalize = ags_recall_dssi_run_finalize; /* properties */ /** * AgsRecallDssiRun:route-dssi-audio-run: * * The route dssi audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("route-dssi-audio-run", i18n_pspec("assigned AgsRouteDssiAudioRun"), i18n_pspec("the AgsRouteDssiAudioRun"), AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ROUTE_DSSI_AUDIO_RUN, param_spec); /** * AgsRecallDssiRun:note: (type GList(AgsNote)) (transfer full) * * The assigned #AgsNote. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("note", i18n_pspec("assigned note"), i18n_pspec("The note it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_dssi_run; recall->run_init_pre = ags_recall_dssi_run_run_init_pre; recall->run_pre = ags_recall_dssi_run_run_pre; } void ags_recall_dssi_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_dssi_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_dssi_run_init(AgsRecallDssiRun *recall_dssi_run) { recall_dssi_run->ladspa_handle = NULL; recall_dssi_run->audio_channels = 0; recall_dssi_run->input = NULL; recall_dssi_run->output = NULL; recall_dssi_run->port_data = NULL; recall_dssi_run->delta_time = 0; recall_dssi_run->event_buffer = (snd_seq_event_t **) malloc(2 * sizeof(snd_seq_event_t *)); recall_dssi_run->event_buffer[0] = (snd_seq_event_t *) malloc(sizeof(snd_seq_event_t)); memset(recall_dssi_run->event_buffer[0], 0, sizeof(snd_seq_event_t)); recall_dssi_run->event_buffer[1] = NULL; recall_dssi_run->event_count = (unsigned long *) malloc(2 * sizeof(unsigned long)); recall_dssi_run->event_count[0] = 0; recall_dssi_run->event_count[1] = 0; recall_dssi_run->route_dssi_audio_run = NULL; recall_dssi_run->note = NULL; } void ags_recall_dssi_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallDssiRun *recall_dssi_run; GRecMutex *recall_mutex; recall_dssi_run = AGS_RECALL_DSSI_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi_run); switch(prop_id){ case PROP_ROUTE_DSSI_AUDIO_RUN: { AgsDelayAudioRun *route_dssi_audio_run; route_dssi_audio_run = g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if((GObject *) route_dssi_audio_run == recall_dssi_run->route_dssi_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_dssi_run->route_dssi_audio_run != NULL){ g_object_unref(G_OBJECT(recall_dssi_run->route_dssi_audio_run)); } if(route_dssi_audio_run != NULL){ g_object_ref(route_dssi_audio_run); } recall_dssi_run->route_dssi_audio_run = (GObject *) route_dssi_audio_run; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTE: { GObject *note; note = g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_NOTE(note) || g_list_find(recall_dssi_run->note, note) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } recall_dssi_run->note = g_list_prepend(recall_dssi_run->note, note); g_object_ref(note); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_dssi_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallDssiRun *recall_dssi_run; GRecMutex *recall_mutex; recall_dssi_run = AGS_RECALL_DSSI_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi_run); switch(prop_id){ case PROP_ROUTE_DSSI_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_dssi_run->route_dssi_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTE: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(recall_dssi_run->note, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_dssi_run_finalize(GObject *gobject) { AgsRecallDssi *recall_dssi; AgsRecallDssiRun *recall_dssi_run; recall_dssi_run = AGS_RECALL_DSSI_RUN(gobject); g_free(recall_dssi_run->ladspa_handle); g_free(recall_dssi_run->output); g_free(recall_dssi_run->input); if(recall_dssi_run->port_data != NULL){ free(recall_dssi_run->port_data); } if(recall_dssi_run->event_buffer != NULL){ if(recall_dssi_run->event_buffer[0] != NULL){ free(recall_dssi_run->event_buffer[0]); } free(recall_dssi_run->event_buffer); } if(recall_dssi_run->event_count != NULL){ free(recall_dssi_run->event_count); } if(recall_dssi_run->route_dssi_audio_run != NULL){ g_object_unref(recall_dssi_run->route_dssi_audio_run); } g_list_free_full(recall_dssi_run->note, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recall_dssi_run_parent_class)->finalize(gobject); } void ags_recall_dssi_run_run_init_pre(AgsRecall *recall) { AgsRecallDssi *recall_dssi; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallDssiRun *recall_dssi_run; AgsAudioSignal *audio_signal; LADSPA_Handle *ladspa_handle; LADSPA_Data *output, *input; LADSPA_Data *port_data; guint output_lines, input_lines; guint samplerate; guint buffer_size; guint port_count; guint i, i_stop; void (*parent_class_run_init_pre)(AgsRecall *recall); LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, unsigned long SampleRate); void (*activate)(LADSPA_Handle Instance); GRecMutex *recall_dssi_mutex; /* get recall mutex */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_recall_dssi_run_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); recall_dssi_run = AGS_RECALL_DSSI_RUN(recall); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_dssi, NULL); /* set up buffer */ g_object_get(recall_dssi_run, "source", &audio_signal, NULL); g_object_get(audio_signal, "samplerate", &samplerate, "buffer-size", &buffer_size, NULL); /* get recall dssi mutex */ recall_dssi_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); /* get some fields */ g_rec_mutex_lock(recall_dssi_mutex); output_lines = recall_dssi->output_lines; input_lines = recall_dssi->input_lines; port_count = recall_dssi->plugin_descriptor->LADSPA_Plugin->PortCount; instantiate = recall_dssi->plugin_descriptor->LADSPA_Plugin->instantiate; activate = recall_dssi->plugin_descriptor->LADSPA_Plugin->activate; g_rec_mutex_unlock(recall_dssi_mutex); /* set up buffer */ output = NULL; input = NULL; if(input_lines > 0){ input = (LADSPA_Data *) malloc(input_lines * buffer_size * sizeof(LADSPA_Data)); } output = (LADSPA_Data *) malloc(output_lines * buffer_size * sizeof(LADSPA_Data)); recall_dssi_run->output = output; recall_dssi_run->input = input; if(input_lines < output_lines){ i_stop = output_lines; }else{ i_stop = input_lines; } ladspa_handle = NULL; if(i_stop > 0){ ladspa_handle = (LADSPA_Handle *) malloc(i_stop * sizeof(LADSPA_Handle)); } recall_dssi_run->audio_channels = i_stop; /* instantiate dssi */ g_rec_mutex_lock(recall_dssi_mutex); for(i = 0; i < i_stop; i++){ ladspa_handle[i] = instantiate(recall_dssi->plugin_descriptor->LADSPA_Plugin, (unsigned long) samplerate); #ifdef AGS_DEBUG g_message("instantiated DSSI handle %d %d", recall_dssi->bank, recall_dssi->program); #endif } g_rec_mutex_unlock(recall_dssi_mutex); port_data = NULL; if(port_count > 0){ port_data = (LADSPA_Data *) malloc(port_count * sizeof(LADSPA_Data)); } /* */ recall_dssi_run->ladspa_handle = ladspa_handle; recall_dssi_run->port_data = port_data; /* */ ags_recall_dssi_run_load_ports(recall_dssi_run); for(i = 0; i < i_stop; i++){ if(activate != NULL){ activate(recall_dssi_run->ladspa_handle[i]); } #ifdef AGS_DEBUG g_message("activated DSSI handle"); #endif } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_dssi); g_object_unref(audio_signal); } void ags_recall_dssi_run_run_pre(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; AgsRecallDssi *recall_dssi; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallDssiRun *recall_dssi_run; AgsAudioSignal *audio_signal; AgsPort *current_port; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsCountBeatsAudioRun *count_beats_audio_run; AgsRouteDssiAudioRun *route_dssi_audio_run; GList *list_start, *list; GList *port; GList *note_start, *note; snd_seq_event_t **event_buffer; unsigned long *event_count; gchar *specifier, *current_specifier; LADSPA_Data port_data; guint bank, program; guint output_lines, input_lines; guint notation_counter; guint x0, x1; guint port_count; guint copy_mode_in, copy_mode_out; guint buffer_size; guint i, i_stop; void (*parent_class_run_pre)(AgsRecall *recall); void (*select_program)(LADSPA_Handle Instance, unsigned long Bank, unsigned long Program); void (*run_synth)(LADSPA_Handle Instance, unsigned long SampleCount, snd_seq_event_t *Events, unsigned long EventCount); void (*run)(LADSPA_Handle Instance, unsigned long SampleCount); void (*deactivate)(LADSPA_Handle Instance); void (*cleanup)(LADSPA_Handle Instance); GRecMutex *recall_dssi_mutex; GRecMutex *port_mutex; /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_recall_dssi_run_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); g_object_get(recall, "recall-id", &recall_id, "source", &audio_signal, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && note_start == NULL){ g_object_unref(recall_id); g_object_unref(audio_signal); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } return; } g_list_free_full(note_start, g_object_unref); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "source", &channel, "recall-channel", &recall_dssi, NULL); g_object_get(channel, "audio", &audio, NULL); recall_dssi_run = AGS_RECALL_DSSI_RUN(recall); g_object_get(recall_dssi_run, "route-dssi-audio-run", &route_dssi_audio_run, NULL); count_beats_audio_run = NULL; if(route_dssi_audio_run != NULL){ g_object_get(route_dssi_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); } /* get recall dssi mutex */ recall_dssi_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); g_object_get(audio_signal, "buffer-size", &buffer_size, NULL); /* get some fields */ g_rec_mutex_lock(recall_dssi_mutex); output_lines = recall_dssi->output_lines; input_lines = recall_dssi->input_lines; g_rec_mutex_unlock(recall_dssi_mutex); if(input_lines < output_lines){ i_stop = output_lines; }else{ i_stop = input_lines; } /* check completed */ if(count_beats_audio_run != NULL){ g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); if(ags_recall_global_get_rt_safe()){ g_object_get(recall_dssi_run, "note", ¬e_start, NULL); note = note_start; while(note != NULL){ g_object_get(note->data, "x0", &x0, "x1", &x1, NULL); if((x1 + 1 <= notation_counter && !ags_note_test_flags(note->data, AGS_NOTE_FEED)) || x0 > notation_counter){ recall_dssi_run->note = g_list_remove(recall_dssi_run->note, note->data); g_object_unref(note->data); } note = note->next; } if(note_start == NULL){ memset(recall_dssi_run->event_buffer[0], 0, sizeof(snd_seq_event_t)); } g_list_free_full(note_start, g_object_unref); }else{ g_object_get(recall_dssi_run, "note", ¬e_start, NULL); g_object_get(note_start->data, "x0", &x0, "x1", &x1, NULL); if(audio_signal->stream_current == NULL || (x1 + 1 <= notation_counter && !ags_note_test_flags(note_start->data, AGS_NOTE_FEED)) || x0 > notation_counter){ // g_message("done"); g_rec_mutex_lock(recall_dssi_mutex); deactivate = recall_dssi->plugin_descriptor->LADSPA_Plugin->deactivate; cleanup = recall_dssi->plugin_descriptor->LADSPA_Plugin->cleanup; g_rec_mutex_unlock(recall_dssi_mutex); for(i = 0; i < i_stop; i++){ /* deactivate */ //TODO:JK: fix-me if(deactivate != NULL){ deactivate(recall_dssi_run->ladspa_handle[i]); } cleanup(recall_dssi_run->ladspa_handle[i]); } ags_recall_done(recall); g_list_free_full(note_start, g_object_unref); goto ags_recall_dssi_run_run_pre_END; } } }else{ if(parent_recycling_context == NULL && audio_signal->stream_current == NULL){ #if 0 g_rec_mutex_lock(recall_dssi_mutex); deactivate = recall_dssi->plugin_descriptor->LADSPA_Plugin->deactivate; cleanup = recall_dssi->plugin_descriptor->LADSPA_Plugin->cleanup; g_rec_mutex_unlock(recall_dssi_mutex); for(i = 0; i < i_stop; i++){ /* deactivate */ //TODO:JK: fix-me if(deactivate != NULL){ deactivate(recall_dssi_run->ladspa_handle[i]); } cleanup(recall_dssi_run->ladspa_handle[i]); } ags_recall_done(recall); goto ags_recall_dssi_run_run_pre_END; #else ags_audio_signal_add_stream(audio_signal); audio_signal->stream_current = audio_signal->stream_end; ags_audio_signal_stream_safe_resize(audio_signal, audio_signal->length + 2); // ags_audio_signal_add_stream(audio_signal); #endif } } /* get copy mode and clear buffer */ copy_mode_in = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); copy_mode_out = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(audio_signal->format), AGS_AUDIO_BUFFER_UTIL_FLOAT); if(recall_dssi_run->output != NULL){ ags_audio_buffer_util_clear_float(recall_dssi_run->output, output_lines, buffer_size); } if(recall_dssi_run->input != NULL){ ags_audio_buffer_util_clear_float(recall_dssi_run->input, input_lines, buffer_size); } /* copy data */ if(recall_dssi_run->input != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(recall_dssi_run->input, input_lines, 0, audio_signal->stream_current->data, 1, 0, buffer_size, copy_mode_in); } /* select program */ g_rec_mutex_lock(recall_dssi_mutex); port_count = recall_dssi->plugin_descriptor->LADSPA_Plugin->PortCount; select_program = recall_dssi->plugin_descriptor->select_program; g_rec_mutex_unlock(recall_dssi_mutex); /* cache port data */ g_object_get(recall_dssi, "port", &list_start, NULL); for(i = 0; i < port_count; i++){ g_rec_mutex_lock(recall_dssi_mutex); specifier = g_strdup(recall_dssi->plugin_descriptor->LADSPA_Plugin->PortNames[i]); g_rec_mutex_unlock(recall_dssi_mutex); list = list_start; while(list != NULL){ gboolean success; current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* check specifier */ g_rec_mutex_lock(port_mutex); current_specifier = g_strdup(current_port->specifier); g_rec_mutex_unlock(port_mutex); success = (!g_strcmp0(specifier, current_specifier)) ? TRUE: FALSE; g_free(current_specifier); if(success){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current_port, &value); recall_dssi_run->port_data[i] = g_value_get_float(&value); g_value_unset(&value); break; } list = list->next; } g_free(specifier); } g_object_get(recall_dssi, "bank", &bank, "program", &program, NULL); if(select_program != NULL){ for(i = 0; i < i_stop; i++){ select_program(recall_dssi_run->ladspa_handle[i], (unsigned long) bank, (unsigned long) program); // g_message("b p %u %u", bank, program); } } /* reset port data */ for(i = 0; i < port_count; i++){ g_rec_mutex_lock(recall_dssi_mutex); specifier = g_strdup(recall_dssi->plugin_descriptor->LADSPA_Plugin->PortNames[i]); g_rec_mutex_unlock(recall_dssi_mutex); list = list_start; current_port = NULL; while(list != NULL){ gboolean success; current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* check specifier */ g_rec_mutex_lock(port_mutex); current_specifier = g_strdup(current_port->specifier); g_rec_mutex_unlock(port_mutex); success = (!g_strcmp0(specifier, current_specifier)) ? TRUE: FALSE; g_free(current_specifier); if(success){ break; } list = list->next; } g_free(specifier); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); port_data = recall_dssi_run->port_data[i]; g_value_set_float(&value, port_data); ags_port_safe_write(current_port, &value); g_value_unset(&value); } } g_list_free_full(list_start, g_object_unref); /* process data */ g_rec_mutex_lock(recall_dssi_mutex); run_synth = recall_dssi->plugin_descriptor->run_synth; run = recall_dssi->plugin_descriptor->LADSPA_Plugin->run; g_rec_mutex_unlock(recall_dssi_mutex); if(parent_recycling_context == NULL){ snd_seq_event_t *seq_event; guint audio_start_mapping; guint midi_start_mapping; guint pad; seq_event = recall_dssi_run->event_buffer[0]; if(recall_dssi_run->event_count[0] == 0){ g_object_get(audio, "audio-start-mapping", &audio_start_mapping, "midi-start-mapping", &midi_start_mapping, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); g_object_get(channel, "pad", &pad, NULL); /* key on */ seq_event->type = SND_SEQ_EVENT_NOTEON; seq_event->data.note.channel = 0; seq_event->data.note.note = 0x7f & (pad - audio_start_mapping + midi_start_mapping); seq_event->data.note.velocity = 127; recall_dssi_run->event_count[0] = 1; } }else{ g_object_get(recall_dssi_run, "note", ¬e_start, NULL); } note = note_start; while(note != NULL){ if(run_synth != NULL){ if(recall_dssi_run->event_buffer != NULL){ event_buffer = recall_dssi_run->event_buffer; event_count = recall_dssi_run->event_count; while(event_buffer[0] != NULL){ if(event_buffer[0]->type == SND_SEQ_EVENT_NOTEON){ run_synth(recall_dssi_run->ladspa_handle[0], (unsigned long) (output_lines * buffer_size), event_buffer[0], event_count[0]); } event_buffer++; event_count++; } } }else if(run != NULL){ run(recall_dssi_run->ladspa_handle[0], (unsigned long) buffer_size); } note = note->next; } g_list_free_full(note_start, g_object_unref); /* copy data */ if(recall_dssi_run->output != NULL){ ags_audio_buffer_util_clear_buffer(audio_signal->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); ags_audio_buffer_util_copy_buffer_to_buffer(audio_signal->stream_current->data, 1, 0, recall_dssi_run->output, output_lines, 0, buffer_size, copy_mode_out); } ags_recall_dssi_run_run_pre_END: g_object_unref(audio); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_dssi); if(route_dssi_audio_run != NULL){ g_object_unref(route_dssi_audio_run); } if(count_beats_audio_run != NULL){ g_object_unref(count_beats_audio_run); } } /** * ags_recall_dssi_run_load_ports: * @recall_dssi_run: the #AgsRecallDssiRun * * Set up DSSI ports. * * Since: 3.0.0 */ void ags_recall_dssi_run_load_ports(AgsRecallDssiRun *recall_dssi_run) { AgsRecallDssi *recall_dssi; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsPort *current_port; AgsDssiPlugin *dssi_plugin; GList *list_start, *list; gchar *specifier, *current_specifier; guint output_lines, input_lines; guint port_count; guint i, j, j_stop; DSSI_Descriptor *plugin_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortDescriptor current_port_descriptor; void (*connect_port)(LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation); GRecMutex *recall_dssi_mutex; GRecMutex *base_plugin_mutex; GRecMutex *port_mutex; if(!AGS_IS_RECALL_DSSI_RUN(recall_dssi_run)){ return; } g_object_get(recall_dssi_run, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_dssi, NULL); /* get recall dssi mutex */ recall_dssi_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_dssi); /* get some fields */ g_rec_mutex_lock(recall_dssi_mutex); output_lines = recall_dssi->output_lines; input_lines = recall_dssi->input_lines; list_start = g_list_copy(AGS_RECALL(recall_dssi)->port); dssi_plugin = recall_dssi->plugin; plugin_descriptor = recall_dssi->plugin_descriptor; g_rec_mutex_unlock(recall_dssi_mutex); /* base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); port_count = plugin_descriptor->LADSPA_Plugin->PortCount; port_descriptor = plugin_descriptor->LADSPA_Plugin->PortDescriptors; connect_port = plugin_descriptor->LADSPA_Plugin->connect_port; g_rec_mutex_unlock(base_plugin_mutex); /* match port */ if(input_lines < output_lines){ j_stop = output_lines; }else{ j_stop = input_lines; } for(i = 0; i < port_count; i++){ g_rec_mutex_lock(base_plugin_mutex); current_port_descriptor = port_descriptor[i]; g_rec_mutex_unlock(base_plugin_mutex); if(LADSPA_IS_PORT_CONTROL(current_port_descriptor)){ if(LADSPA_IS_PORT_INPUT(current_port_descriptor) || LADSPA_IS_PORT_OUTPUT(current_port_descriptor)){ LADSPA_Data *port_pointer; g_rec_mutex_lock(base_plugin_mutex); specifier = g_strdup(plugin_descriptor->LADSPA_Plugin->PortNames[i]); g_rec_mutex_unlock(base_plugin_mutex); list = ags_port_find_specifier(list_start, specifier); g_free(specifier); if(list != NULL){ current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* get port pointer */ g_rec_mutex_lock(port_mutex); port_pointer = (LADSPA_Data *) &(current_port->port_value.ags_port_ladspa); g_rec_mutex_unlock(port_mutex); for(j = 0; j < j_stop; j++){ #ifdef AGS_DEBUG g_message("connecting port[%d]: %d/%d - %f", j, i, port_count, current->port_value.ags_port_ladspa); #endif connect_port(recall_dssi_run->ladspa_handle[j], (unsigned long) i, port_pointer); } } } } } g_list_free(list_start); /* connect audio port */ for(j = 0; j < input_lines; j++){ connect_port(recall_dssi_run->ladspa_handle[j], (unsigned long) (recall_dssi->input_port[j]), &(recall_dssi_run->input[j])); } for(j = 0; j < recall_dssi->output_lines; j++){ connect_port(recall_dssi_run->ladspa_handle[j], (unsigned long) (recall_dssi->output_port[j]), &(recall_dssi_run->output[j])); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_dssi); } /** * ags_recall_dssi_run_new: * @source: the #AgsAudioSignal as source * * Creates a new instance of #AgsRecallDssiRun * * Returns: the new #AgsRecallDssiRun * * Since: 3.0.0 */ AgsRecallDssiRun* ags_recall_dssi_run_new(AgsAudioSignal *source) { AgsRecallDssiRun *recall_dssi_run; recall_dssi_run = (AgsRecallDssiRun *) g_object_new(AGS_TYPE_RECALL_DSSI_RUN, "source", source, NULL); return(recall_dssi_run); } gsequencer-3.1.3/ags/audio/ags_sound_provider.h0000644000175000017500000001024613607210263016523 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUND_PROVIDER_H__ #define __AGS_SOUND_PROVIDER_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUND_PROVIDER (ags_sound_provider_get_type()) #define AGS_SOUND_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUND_PROVIDER, AgsSoundProvider)) #define AGS_SOUND_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SOUND_PROVIDER, AgsSoundProviderInterface)) #define AGS_IS_SOUND_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SOUND_PROVIDER)) #define AGS_IS_SOUND_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SOUND_PROVIDER)) #define AGS_SOUND_PROVIDER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SOUND_PROVIDER, AgsSoundProviderInterface)) typedef struct _AgsSoundProvider AgsSoundProvider; typedef struct _AgsSoundProviderInterface AgsSoundProviderInterface; struct _AgsSoundProviderInterface { GTypeInterface ginterface; void (*set_default_soundcard)(AgsSoundProvider *sound_provider, GObject *soundcard); GObject* (*get_default_soundcard)(AgsSoundProvider *sound_provider); void (*set_default_soundcard_thread)(AgsSoundProvider *sound_provider, GObject *soundcard_thread); GObject* (*get_default_soundcard_thread)(AgsSoundProvider *sound_provider); void (*set_soundcard)(AgsSoundProvider *sound_provider, GList *soundcard); GList* (*get_soundcard)(AgsSoundProvider *sound_provider); void (*set_sequencer)(AgsSoundProvider *sound_provider, GList *sequencer); GList* (*get_sequencer)(AgsSoundProvider *sound_provider); void (*set_audio)(AgsSoundProvider *sound_provider, GList *audio); GList* (*get_audio)(AgsSoundProvider *sound_provider); void (*set_sound_server)(AgsSoundProvider *sound_provider, GList *sound_server); GList* (*get_sound_server)(AgsSoundProvider *sound_provider); void (*set_osc_server)(AgsSoundProvider *sound_provider, GList *osc_server); GList* (*get_osc_server)(AgsSoundProvider *sound_provider); }; GType ags_sound_provider_get_type(); void ags_sound_provider_set_default_soundcard(AgsSoundProvider *sound_provider, GObject *soundcard); GObject* ags_sound_provider_get_default_soundcard(AgsSoundProvider *sound_provider); void ags_sound_provider_set_default_soundcard_thread(AgsSoundProvider *sound_provider, GObject *soundcard_thread); GObject* ags_sound_provider_get_default_soundcard_thread(AgsSoundProvider *sound_provider); void ags_sound_provider_set_soundcard(AgsSoundProvider *sound_provider, GList *soundcard); GList* ags_sound_provider_get_soundcard(AgsSoundProvider *sound_provider); void ags_sound_provider_set_sequencer(AgsSoundProvider *sound_provider, GList *sequencer); GList* ags_sound_provider_get_sequencer(AgsSoundProvider *sound_provider); void ags_sound_provider_set_audio(AgsSoundProvider *sound_provider, GList *audio); GList* ags_sound_provider_get_audio(AgsSoundProvider *sound_provider); void ags_sound_provider_set_sound_server(AgsSoundProvider *sound_provider, GList *sound_server); GList* ags_sound_provider_get_sound_server(AgsSoundProvider *sound_provider); void ags_sound_provider_set_osc_server(AgsSoundProvider *sound_provider, GList *osc_server); GList* ags_sound_provider_get_osc_server(AgsSoundProvider *sound_provider); G_END_DECLS #endif /*__AGS_SOUND_PROVIDER_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_channel_run.h0000644000175000017500000000664313616617253017317 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_CHANNEL_RUN_H__ #define __AGS_RECALL_CHANNEL_RUN_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_CHANNEL_RUN (ags_recall_channel_run_get_type()) #define AGS_RECALL_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_CHANNEL_RUN, AgsRecallChannelRun)) #define AGS_RECALL_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_CHANNEL_RUN, AgsRecallChannelRunClass)) #define AGS_IS_RECALL_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_CHANNEL_RUN)) #define AGS_IS_RECALL_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_CHANNEL_RUN)) #define AGS_RECALL_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_CHANNEL_RUN, AgsRecallChannelRunClass)) typedef struct _AgsRecallChannelRun AgsRecallChannelRun; typedef struct _AgsRecallChannelRunClass AgsRecallChannelRunClass; struct _AgsRecallChannelRun { AgsRecall recall; AgsRecallAudio *recall_audio; AgsRecallAudioRun *recall_audio_run; AgsRecallChannel *recall_channel; AgsChannel *destination; AgsChannel *source; }; struct _AgsRecallChannelRunClass { AgsRecallClass recall; }; GType ags_recall_channel_run_get_type(); AgsRecallAudio* ags_recall_channel_run_get_recall_audio(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_set_recall_audio(AgsRecallChannelRun *recall_channel_run, AgsRecallAudio *recall_audio); AgsRecallAudioRun* ags_recall_channel_run_get_recall_audio_run(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_set_recall_audio_run(AgsRecallChannelRun *recall_channel_run, AgsRecallAudioRun *recall_audio_run); AgsRecallChannel* ags_recall_channel_run_get_recall_channel(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_set_recall_channel(AgsRecallChannelRun *recall_channel_run, AgsRecallChannel *recall_channel); AgsChannel* ags_recall_channel_run_get_destination(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_set_destination(AgsRecallChannelRun *recall_channel_run, AgsChannel *destination); AgsChannel* ags_recall_channel_run_get_source(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_set_source(AgsRecallChannelRun *recall_channel_run, AgsChannel *source); AgsRecallChannelRun* ags_recall_channel_run_new(); G_END_DECLS #endif /*__AGS_RECALL_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_channel_run.c0000644000175000017500000013740313616617253017311 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_channel_run_class_init(AgsRecallChannelRunClass *recall_channel_run); void ags_recall_channel_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_channel_run_init(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_channel_run_dispose(GObject *gobject); void ags_recall_channel_run_finalize(GObject *gobject); void ags_recall_channel_run_notify_recall_container_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_recall_channel_run_connect(AgsConnectable *connectable); void ags_recall_channel_run_disconnect(AgsConnectable *connectable); AgsRecall* ags_recall_channel_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); void ags_recall_channel_run_map_recall_recycling(AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_remap_child_source(AgsRecallChannelRun *recall_channel_run, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region); void ags_recall_channel_run_remap_child_destination(AgsRecallChannelRun *recall_channel_run, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region); void ags_recall_channel_run_source_recycling_changed_callback(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region, AgsRecallChannelRun *recall_channel_run); void ags_recall_channel_run_destination_recycling_changed_callback(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region, AgsRecallChannelRun *recall_channel_run); /** * SECTION:ags_recall_channel_run * @short_description: dynamic channel context of recall * @title: AgsRecallChannelRun * @section_id: * @include: ags/audio/ags_recall_channel_run.h * * #AgsRecallChannelRun acts as channel recall run. */ enum{ PROP_0, PROP_RECALL_AUDIO, PROP_RECALL_AUDIO_RUN, PROP_RECALL_CHANNEL, PROP_DESTINATION, PROP_SOURCE, }; static gpointer ags_recall_channel_run_parent_class = NULL; static AgsConnectableInterface* ags_recall_channel_run_parent_connectable_interface; GType ags_recall_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_channel_run = 0; static const GTypeInfo ags_recall_channel_run_info = { sizeof (AgsRecallChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_channel_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_channel_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_channel_run = g_type_register_static(AGS_TYPE_RECALL, "AgsRecallChannelRun", &ags_recall_channel_run_info, 0); g_type_add_interface_static(ags_type_recall_channel_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_channel_run); } return g_define_type_id__volatile; } void ags_recall_channel_run_class_init(AgsRecallChannelRunClass *recall_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_channel_run_parent_class = g_type_class_peek_parent(recall_channel_run); /* GObjectClass */ gobject = (GObjectClass *) recall_channel_run; gobject->set_property = ags_recall_channel_run_set_property; gobject->get_property = ags_recall_channel_run_get_property; gobject->dispose = ags_recall_channel_run_dispose; gobject->finalize = ags_recall_channel_run_finalize; /* properties */ /** * AgsRecallChannelRun:recall-audio: * * The audio context of this recall. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-audio", i18n_pspec("AgsRecallAudio of this recall"), i18n_pspec("The AgsRecallAudio which this recall needs"), AGS_TYPE_RECALL_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO, param_spec); /** * AgsRecallChannelRun:recall-audio-run: * * The audio run context of this recall. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-audio-run", i18n_pspec("AgsRecallAudioRun of this recall"), i18n_pspec("The AgsRecallAudioRun which this recall needs"), AGS_TYPE_RECALL_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO_RUN, param_spec); /** * AgsRecallChannelRun:recall-channel: * * The channel context of this recall. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-channel", i18n_pspec("AsgRecallChannel of this recall"), i18n_pspec("The AgsRecallChannel which this recall needs"), AGS_TYPE_RECALL_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CHANNEL, param_spec); /** * AgsRecallChannelRun:destination: * * The channel to do output to. * * Since: 3.0.0 */ param_spec = g_param_spec_object("destination", i18n_pspec("destination of output"), i18n_pspec("The destination AgsChannel where it will output to"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESTINATION, param_spec); /** * AgsRecallChannelRun:source: * * The channel to do input from. * * Since: 3.0.0 */ param_spec = g_param_spec_object("source", i18n_pspec("source of input"), i18n_pspec("The source AgsChannel where it will take the input from"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOURCE, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_channel_run; recall->duplicate = ags_recall_channel_run_duplicate; } void ags_recall_channel_run_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_recall_channel_run_connectable_parent_interface; ags_recall_channel_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_recall_channel_run_connect; connectable->disconnect = ags_recall_channel_run_disconnect; } void ags_recall_channel_run_init(AgsRecallChannelRun *recall_channel_run) { g_signal_connect_after(recall_channel_run, "notify::recall-container", G_CALLBACK(ags_recall_channel_run_notify_recall_container_callback), NULL); recall_channel_run->recall_audio = NULL; recall_channel_run->recall_audio_run = NULL; recall_channel_run->recall_channel = NULL; recall_channel_run->source = NULL; recall_channel_run->destination = NULL; } void ags_recall_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallChannelRun *recall_channel_run; GRecMutex *recall_mutex; recall_channel_run = AGS_RECALL_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel_run); switch(prop_id){ case PROP_RECALL_AUDIO: { AgsRecallAudio *recall_audio; recall_audio = (AgsRecallAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel_run->recall_audio == recall_audio){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_channel_run->recall_audio != NULL){ g_object_unref(recall_channel_run->recall_audio); } if(recall_audio != NULL){ g_object_ref(G_OBJECT(recall_audio)); } recall_channel_run->recall_audio = recall_audio; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_AUDIO_RUN: { AgsRecallAudioRun *recall_audio_run; recall_audio_run = (AgsRecallAudioRun *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel_run->recall_audio_run == recall_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_channel_run->recall_audio_run != NULL){ g_object_unref(recall_channel_run->recall_audio_run); } if(recall_audio_run != NULL){ g_object_ref(G_OBJECT(recall_audio_run)); } recall_channel_run->recall_audio_run = recall_audio_run; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_CHANNEL: { AgsRecallChannel *recall_channel; recall_channel = (AgsRecallChannel *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel_run->recall_channel == recall_channel){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_channel_run->recall_channel != NULL){ g_object_unref(recall_channel_run->recall_channel); } if(recall_channel != NULL){ g_object_ref(G_OBJECT(recall_channel)); } recall_channel_run->recall_channel = recall_channel; g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { AgsChannel *destination; AgsChannel *old_destination; destination = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel_run->destination == destination){ g_rec_mutex_unlock(recall_mutex); return; } old_destination = recall_channel_run->destination; if(destination != NULL){ g_object_ref(G_OBJECT(destination)); } recall_channel_run->destination = destination; /* child destination */ #if 0 if(destination == recall_channel_run->source){ g_warning("destination == recall_channel_run->source"); } #endif if(old_destination != NULL){ g_object_unref(G_OBJECT(old_destination)); } g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { AgsChannel *source; AgsChannel *old_source; source = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_channel_run->source == source){ g_rec_mutex_unlock(recall_mutex); return; } old_source = recall_channel_run->source; if(source != NULL){ g_object_ref(G_OBJECT(source)); } recall_channel_run->source = source; #if 0 if(source == recall_channel_run->destination){ g_warning("source == recall_channel_run->destination"); } #endif if(old_source != NULL){ g_object_unref(G_OBJECT(old_source)); } g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallChannelRun *recall_channel_run; GRecMutex *recall_mutex; recall_channel_run = AGS_RECALL_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel_run); switch(prop_id){ case PROP_RECALL_AUDIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel_run->recall_audio); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel_run->recall_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_CHANNEL: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel_run->recall_channel); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel_run->destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_channel_run->source); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_channel_run_dispose(GObject *gobject) { AgsRecallChannelRun *recall_channel_run; recall_channel_run = AGS_RECALL_CHANNEL_RUN(gobject); /* recall audio */ if(recall_channel_run->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_channel_run->recall_audio)); recall_channel_run->recall_audio = NULL; } /* recall audio run */ if(recall_channel_run->recall_audio_run != NULL){ g_object_unref(G_OBJECT(recall_channel_run->recall_audio_run)); recall_channel_run->recall_audio_run = NULL; } /* recall channel */ if(recall_channel_run->recall_channel != NULL){ g_object_unref(G_OBJECT(recall_channel_run->recall_channel)); recall_channel_run->recall_channel = NULL; } /* destination */ if(recall_channel_run->destination != NULL){ g_object_unref(recall_channel_run->destination); recall_channel_run->destination = NULL; } /* source */ if(recall_channel_run->source != NULL){ g_object_unref(recall_channel_run->source); recall_channel_run->source = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_channel_run_parent_class)->dispose(gobject); } void ags_recall_channel_run_finalize(GObject *gobject) { AgsRecallChannelRun *recall_channel_run; recall_channel_run = AGS_RECALL_CHANNEL_RUN(gobject); /* recall audio */ if(recall_channel_run->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_channel_run->recall_audio)); } /* recall audio run */ if(recall_channel_run->recall_audio_run != NULL){ g_object_unref(G_OBJECT(recall_channel_run->recall_audio_run)); } /* recall channel */ if(recall_channel_run->recall_channel != NULL){ g_object_unref(G_OBJECT(recall_channel_run->recall_channel)); } /* destination */ if(recall_channel_run->destination != NULL){ g_object_unref(recall_channel_run->destination); } /* source */ if(recall_channel_run->source != NULL){ g_object_unref(recall_channel_run->source); } /* call parent */ G_OBJECT_CLASS(ags_recall_channel_run_parent_class)->finalize(gobject); } void ags_recall_channel_run_notify_recall_container_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsChannel *source; AgsRecallContainer *recall_container; AgsRecallChannelRun *recall_channel_run; recall_channel_run = AGS_RECALL_CHANNEL_RUN(gobject); /* get some fields */ g_object_get(recall_channel_run, "recall-container", &recall_container, NULL); if(recall_container != NULL){ AgsRecallAudio *recall_audio; AgsRecallID *recall_id; GList *list_start, *list; g_object_get(recall_channel_run, "source", &source, "recall-id", &recall_id, NULL); /* recall audio */ g_object_get(recall_container, "recall-audio", &recall_audio, NULL); g_object_set(recall_channel_run, "recall-audio", recall_audio, NULL); /* recall audio run */ g_object_get(recall_container, "recall-audio-run", &list_start, NULL); if(recall_id != NULL){ AgsRecyclingContext *recycling_context; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); if((list = ags_recall_find_recycling_context(list_start, (GObject *) recycling_context)) != NULL){ g_object_set(recall_channel_run, "recall-audio-run", list->data, NULL); } g_object_unref(recycling_context); }else if(ags_recall_test_flags(recall_channel_run, AGS_RECALL_TEMPLATE)){ if((list = ags_recall_find_template(list_start)) != NULL){ g_object_set(recall_channel_run, "recall-audio-run", list->data, NULL); } } g_list_free_full(list_start, g_object_unref); /* recall channel */ g_object_get(recall_container, "recall-channel", &list_start, NULL); if((list = ags_recall_find_provider(list_start, (GObject *) source)) != NULL){ g_object_set(recall_channel_run, "recall-channel", list->data, NULL); } g_list_free_full(list_start, g_object_unref); if(recall_audio != NULL){ g_object_unref(recall_audio); } /* unref */ if(source != NULL){ g_object_unref(source); } g_object_unref(recall_container); if(recall_id != NULL){ g_object_unref(recall_id); } }else{ g_object_set(recall_channel_run, "recall-audio", NULL, "recall-audio-run", NULL, "recall-channel", NULL, NULL); } } void ags_recall_channel_run_connect(AgsConnectable *connectable) { AgsChannel *destination, *source; AgsRecallChannelRun *recall_channel_run; if(ags_connectable_is_connected(connectable)){ return; } ags_recall_channel_run_parent_connectable_interface->connect(connectable); /* recall channel run */ recall_channel_run = AGS_RECALL_CHANNEL_RUN(connectable); /* get some fields */ g_object_get(recall_channel_run, "destination", &destination, "source", &source, NULL); /* destination */ if(destination != NULL){ g_signal_connect(destination, "recycling-changed", G_CALLBACK(ags_recall_channel_run_destination_recycling_changed_callback), recall_channel_run); g_object_unref(destination); } /* source */ if(source != NULL){ g_signal_connect(source, "recycling-changed", G_CALLBACK(ags_recall_channel_run_source_recycling_changed_callback), recall_channel_run); g_object_unref(source); } } void ags_recall_channel_run_disconnect(AgsConnectable *connectable) { AgsChannel *destination, *source; AgsRecallChannelRun *recall_channel_run; if(!ags_connectable_is_connected(connectable)){ return; } ags_recall_channel_run_parent_connectable_interface->disconnect(connectable); /* recall channel run */ recall_channel_run = AGS_RECALL_CHANNEL_RUN(connectable); /* get some fields */ g_object_get(recall_channel_run, "destination", &destination, "source", &source, NULL); /* destination */ if(destination != NULL){ g_object_disconnect(destination, "any_signal::recycling-changed", G_CALLBACK(ags_recall_channel_run_destination_recycling_changed_callback), recall_channel_run, NULL); g_object_unref(destination); } /* source */ if(source != NULL){ g_object_disconnect(source, "any_signal::recycling-changed", G_CALLBACK(ags_recall_channel_run_source_recycling_changed_callback), recall_channel_run, NULL); g_object_unref(source); } } AgsRecall* ags_recall_channel_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsChannel *destination, *source; AgsRecallAudio *recall_audio; AgsRecallAudioRun *recall_audio_run; AgsRecallChannel *recall_channel; AgsRecallChannelRun *recall_channel_run, *copy_recall_channel_run; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsRecyclingContext *next_recycling_context; GList *list_start, *list; GRecMutex *recall_mutex; recall_channel_run = AGS_RECALL_CHANNEL_RUN(recall); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get some fields */ g_rec_mutex_lock(recall_mutex); recall_audio = recall_channel_run->recall_audio; // recall_audio_run = recall_channel_run->recall_audio_run; recall_channel = recall_channel_run->recall_channel; destination = recall_channel_run->destination; source = recall_channel_run->source; g_rec_mutex_unlock(recall_mutex); next_recycling_context = NULL; if(destination != NULL){ g_object_get(destination, "recall-id", &list_start, NULL); next_recycling_context = (AgsRecyclingContext *) ags_recall_id_find_recycling_context(list_start, recall_id->recycling_context->parent); g_list_free_full(list_start, g_object_unref); } if(destination != NULL && next_recycling_context == NULL){ return(NULL); } /* duplicate */ copy_recall_channel_run = (AgsRecallChannelRun *) AGS_RECALL_CLASS(ags_recall_channel_run_parent_class)->duplicate(recall, recall_id, n_params, parameter_name, value); g_object_set(copy_recall_channel_run, "recall-audio", recall_audio, // "recall-audio-run", recall_audio_run, "recall-channel", recall_channel, "source", source, "destination", destination, NULL); /* remap */ if(destination != NULL){ AgsRecycling *first_recycling, *last_recycling; /* get some fields */ g_object_get(destination, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); ags_recall_channel_run_remap_child_destination(copy_recall_channel_run, NULL, NULL, first_recycling, last_recycling); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } }else if(source != NULL){ AgsRecycling *first_recycling, *last_recycling; /* get some fields */ g_object_get(source, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); ags_recall_channel_run_remap_child_source(copy_recall_channel_run, NULL, NULL, first_recycling, last_recycling); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } } return((AgsRecall *) copy_recall_channel_run); } void ags_recall_channel_run_map_recall_recycling(AgsRecallChannelRun *recall_channel_run) { AgsChannel *destination, *source; AgsRecycling *destination_first_recycling, *destination_last_recycling; AgsRecycling *destination_recycling, *destination_next_recycling, *destination_end_recycling; AgsRecycling *source_first_recycling, *source_last_recycling; AgsRecycling *source_recycling, *source_next_recycling, *source_end_recycling; AgsRecallID *recall_id; GObject *output_soundcard, *input_soundcard; GType child_type; guint recall_flags; guint ability_flags; guint behaviour_flags; gint sound_scope; gint output_soundcard_channel, input_soundcard_channel; guint samplerate; guint buffer_size; guint format; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel_run); /* get some fields */ g_object_get(recall_channel_run, "destination", &destination, "source", &source, NULL); g_rec_mutex_lock(recall_mutex); child_type = AGS_RECALL(recall_channel_run)->child_type; g_rec_mutex_unlock(recall_mutex); /* check instantiable child */ if(source == NULL || child_type == G_TYPE_NONE || ags_recall_test_flags(recall_channel_run, AGS_RECALL_TEMPLATE)){ if(destination != NULL){ g_object_unref(destination); } if(source != NULL){ g_object_unref(source); } return; } /* AgsRecycling - source */ g_object_get(source, "first-recycling", &source_first_recycling, "last-recycling", &source_last_recycling, NULL); /* AgsRecycling - destination*/ destination_first_recycling = NULL; destination_last_recycling = NULL; if(destination != NULL){ g_object_get(destination, "first-recycling", &destination_first_recycling, "last-recycling", &destination_last_recycling, NULL); } /* map */ if(source_first_recycling != NULL){ /* get some fields */ g_object_get(source_first_recycling, "recall-id", &recall_id, "output-soundcard", &output_soundcard, "input-soundcard", &input_soundcard, NULL); g_rec_mutex_lock(recall_mutex); ability_flags = AGS_RECALL(recall_channel_run)->ability_flags; behaviour_flags = AGS_RECALL(recall_channel_run)->behaviour_flags; sound_scope = AGS_RECALL(recall_channel_run)->sound_scope; output_soundcard_channel = AGS_RECALL(recall_channel_run)->output_soundcard_channel; input_soundcard_channel = AGS_RECALL(recall_channel_run)->input_soundcard_channel; samplerate = AGS_RECALL(recall_channel_run)->samplerate; buffer_size = AGS_RECALL(recall_channel_run)->buffer_size; format = AGS_RECALL(recall_channel_run)->format; g_rec_mutex_unlock(recall_mutex); /* get end recycling */ source_end_recycling = ags_recycling_next(source_last_recycling); /* */ source_recycling = source_first_recycling; g_object_ref(source_recycling); while(source_recycling != source_end_recycling){ #ifdef AGS_DEBUG g_message("ags_recall_channel_run_map_recall_recycling %d", source->line); #endif /* */ destination_recycling = destination_first_recycling; if(destination_first_recycling != NULL){ g_object_ref(destination_recycling); /* get end recycling */ destination_end_recycling = ags_recycling_next(destination_last_recycling); }else{ destination_end_recycling = NULL; } do{ AgsRecallRecycling *recall_recycling; /* instantiate */ recall_recycling = g_object_new(child_type, "recall-id", recall_id, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, "source", source_recycling, "destination", destination_recycling, NULL); ags_recall_set_ability_flags((AgsRecall *) recall_recycling, ability_flags); ags_recall_set_behaviour_flags((AgsRecall *) recall_recycling, behaviour_flags); ags_recall_set_sound_scope((AgsRecall *) recall_recycling, sound_scope); ags_recall_add_child((AgsRecall *) recall_channel_run, (AgsRecall *) recall_recycling); if(destination_recycling != NULL){ /* iterate */ destination_next_recycling = ags_recycling_next(destination_recycling); g_object_unref(destination_recycling); destination_recycling = destination_next_recycling; } }while(destination_recycling != destination_end_recycling); if(destination_recycling != NULL){ g_object_unref(destination_recycling); } if(destination_end_recycling != NULL){ g_object_unref(destination_end_recycling); } /* iterate */ source_next_recycling = ags_recycling_next(source_recycling); g_object_unref(source_recycling); source_recycling = source_next_recycling; } /* unref */ if(recall_id != NULL){ g_object_unref(recall_id); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(input_soundcard != NULL){ g_object_unref(input_soundcard); } if(source_recycling != NULL){ g_object_unref(source_recycling); } if(source_end_recycling != NULL){ g_object_unref(source_end_recycling); } } /* unref */ if(destination != NULL){ g_object_unref(destination); } if(source != NULL){ g_object_unref(source); } if(destination_first_recycling != NULL){ g_object_unref(destination_first_recycling); g_object_unref(destination_last_recycling); } if(source_first_recycling != NULL){ g_object_unref(source_first_recycling); g_object_unref(source_last_recycling); } } void ags_recall_channel_run_remap_child_source(AgsRecallChannelRun *recall_channel_run, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region) { AgsChannel *destination, *source; AgsRecycling *destination_first_recycling; AgsRecycling *source_recycling, *source_next_recycling, *source_end_recycling; AgsRecallID *recall_id; GObject *output_soundcard, *input_soundcard; GList *list_start, *list; GType child_type; gint output_soundcard_channel, input_soundcard_channel; guint samplerate; guint buffer_size; guint format; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel_run); /* get some fields */ g_object_get(recall_channel_run, "destination", &destination, "source", &source, NULL); g_rec_mutex_lock(recall_mutex); child_type = AGS_RECALL(recall_channel_run)->child_type; g_rec_mutex_unlock(recall_mutex); /* check instantiable child */ if(source == NULL || child_type == G_TYPE_NONE || ags_recall_test_flags(recall_channel_run, AGS_RECALL_TEMPLATE)){ if(destination != NULL){ g_object_unref(destination); } if(source != NULL){ g_object_unref(source); } return; } /* remove old */ if(old_start_changed_region != NULL){ /* get end recycling */ source_end_recycling = ags_recycling_next(old_end_changed_region); /* */ source_recycling = old_start_changed_region; g_object_ref(source_recycling); while(source_recycling != source_end_recycling){ /* get children */ g_object_get(recall_channel_run, "child", &list_start, NULL); list = list_start; while(list != NULL){ AgsRecycling *current_source; AgsRecall *current_recall; current_recall = AGS_RECALL(list->data); g_object_get(current_recall, "source", ¤t_source, NULL); if(current_source == source_recycling){ ags_recall_cancel(current_recall); ags_recall_remove_child((AgsRecall *) recall_channel_run, (AgsRecall *) current_recall); ags_connectable_disconnect(AGS_CONNECTABLE(current_recall)); g_object_run_dispose((GObject *) current_recall); g_object_unref((GObject *) current_recall); } list = list->next; } g_list_free_full(list_start, g_object_unref); /* iterate */ source_next_recycling = ags_recycling_next(source_recycling); g_object_unref(source_recycling); source_recycling = source_next_recycling; } /* unref */ if(source_recycling != NULL){ g_object_unref(source_recycling); } if(source_end_recycling != NULL){ g_object_unref(source_end_recycling); } } /* add new */ if(new_start_changed_region != NULL){ /* get some fields */ g_object_get(new_start_changed_region, "output-soundcard", &output_soundcard, "input-soundcard", &input_soundcard, NULL); g_object_get(recall_channel_run, "recall-id", &recall_id, NULL); g_rec_mutex_lock(recall_mutex); output_soundcard_channel = AGS_RECALL(recall_channel_run)->output_soundcard_channel; input_soundcard_channel = AGS_RECALL(recall_channel_run)->input_soundcard_channel; samplerate = AGS_RECALL(recall_channel_run)->samplerate; buffer_size = AGS_RECALL(recall_channel_run)->buffer_size; format = AGS_RECALL(recall_channel_run)->format; g_rec_mutex_unlock(recall_mutex); if(destination != NULL){ g_object_get(destination, "first-recycling", &destination_first_recycling, NULL); }else{ destination_first_recycling = NULL; } /* get end recycling */ source_end_recycling = ags_recycling_next(new_end_changed_region); /* */ source_recycling = new_start_changed_region; g_object_ref(source_recycling); while(source_recycling != source_end_recycling){ AgsRecallRecycling *recall_recycling; // g_message("%s[%d]", G_OBJECT_TYPE_NAME(recall_channel_run), recall_channel_run->source->line); recall_recycling = g_object_new(child_type, "recall-id", recall_id, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, "source", source_recycling, "destination", destination_first_recycling, NULL); ags_recall_add_child((AgsRecall *) recall_channel_run, (AgsRecall *) recall_recycling); ags_connectable_connect(AGS_CONNECTABLE(recall_recycling)); /* iterate */ source_next_recycling = ags_recycling_next(source_recycling); g_object_unref(source_recycling); source_recycling = source_next_recycling; } /* unref */ if(recall_id != NULL){ g_object_unref(recall_id); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(input_soundcard != NULL){ g_object_unref(input_soundcard); } if(source_recycling != NULL){ g_object_unref(source_recycling); } if(source_end_recycling != NULL){ g_object_unref(source_end_recycling); } } /* unref */ if(destination != NULL){ g_object_unref(destination); } if(source != NULL){ g_object_unref(source); } } void ags_recall_channel_run_remap_child_destination(AgsRecallChannelRun *recall_channel_run, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region) { AgsChannel *source; AgsRecycling *destination_first_recycling, *destination_last_recycling; AgsRecycling *destination_recycling, *destination_next_recycling, *destination_end_recycling; AgsRecycling *source_first_recycling, *source_last_recycling; AgsRecycling *source_recycling, *source_next_recycling, *source_end_recycling; AgsRecallID *recall_id; GObject *output_soundcard, *input_soundcard; GType child_type; gint output_soundcard_channel, input_soundcard_channel; guint samplerate; guint buffer_size; guint format; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel_run); /* get some fields */ g_object_get(recall_channel_run, "source", &source, NULL); g_rec_mutex_lock(recall_mutex); child_type = AGS_RECALL(recall_channel_run)->child_type; g_rec_mutex_unlock(recall_mutex); /* check instantiable child */ if(source == NULL || child_type == G_TYPE_NONE || ags_recall_test_flags(recall_channel_run, AGS_RECALL_TEMPLATE)){ if(source != NULL){ g_object_unref(source); } return; } /* remove old */ if(old_start_changed_region != NULL){ /* get end recycling */ destination_end_recycling = ags_recycling_next(old_end_changed_region); /* */ destination_recycling = old_start_changed_region; g_object_ref(destination_recycling); while(destination_recycling != destination_end_recycling){ GList *list_start, *list; /* get children */ g_object_get(recall_channel_run, "child", &list_start, NULL); list = list_start; while(list != NULL){ AgsRecycling *current_destination; AgsRecall *current_recall; current_recall = AGS_RECALL(list->data); g_object_get(current_recall, "destination", ¤t_destination, NULL); if(current_destination == destination_recycling){ ags_recall_cancel(current_recall); ags_recall_remove_child((AgsRecall *) recall_channel_run, (AgsRecall *) current_recall); ags_connectable_disconnect(AGS_CONNECTABLE(current_recall)); g_object_run_dispose((GObject *) current_recall); g_object_unref((GObject *) current_recall); } list = list->next; } g_list_free_full(list_start, g_object_unref); /* iterate */ destination_next_recycling = ags_recycling_next(destination_recycling); g_object_unref(destination_recycling); destination_recycling = destination_next_recycling; } if(destination_recycling != NULL){ g_object_unref(destination_recycling); } if(destination_end_recycling != NULL){ g_object_unref(destination_end_recycling); } } /* add new */ if(new_start_changed_region == NULL || source == NULL){ return; } g_object_get(source, "first-recycling", &source_first_recycling, "last-recycling", &source_last_recycling, NULL); if(source_first_recycling != NULL){ /* get some fields */ g_rec_mutex_lock(recall_mutex); recall_id = AGS_RECALL(recall_channel_run)->recall_id; output_soundcard = AGS_RECALL(recall_channel_run)->output_soundcard; output_soundcard_channel = AGS_RECALL(recall_channel_run)->output_soundcard_channel; input_soundcard = AGS_RECALL(recall_channel_run)->input_soundcard; input_soundcard_channel = AGS_RECALL(recall_channel_run)->input_soundcard_channel; samplerate = AGS_RECALL(recall_channel_run)->samplerate; buffer_size = AGS_RECALL(recall_channel_run)->buffer_size; format = AGS_RECALL(recall_channel_run)->format; g_rec_mutex_unlock(recall_mutex); /* get end recycling */ destination_end_recycling = ags_recycling_next(new_end_changed_region); /* */ destination_recycling = new_start_changed_region; g_object_ref(destination_recycling); while(destination_recycling != destination_end_recycling){ /* get end recycling */ source_end_recycling = ags_recycling_next(source_last_recycling); /* */ source_recycling = source_first_recycling; g_object_ref(source_recycling); while(source_recycling != source_end_recycling){ AgsRecallRecycling *recall_recycling; recall_recycling = g_object_new(child_type, "recall-id", recall_id, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, "source", source_recycling, "destination", destination_recycling, NULL); ags_recall_add_child(AGS_RECALL(recall_channel_run), AGS_RECALL(recall_recycling)); ags_connectable_connect(AGS_CONNECTABLE(recall_recycling)); /* iterate */ source_next_recycling = ags_recycling_next(source_recycling); g_object_unref(source_recycling); source_recycling = source_next_recycling; } if(source_recycling != NULL){ g_object_unref(source_recycling); } /* iterate */ destination_next_recycling = ags_recycling_next(destination_recycling); g_object_unref(destination_recycling); destination_recycling = destination_next_recycling; } if(destination_recycling != NULL){ g_object_unref(destination_recycling); } if(destination_end_recycling != NULL){ g_object_unref(destination_end_recycling); } } if(source != NULL){ g_object_unref(source); } } void ags_recall_channel_run_source_recycling_changed_callback(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region, AgsRecallChannelRun *recall_channel_run) { AgsChannel *destination; g_object_get(recall_channel_run, "destination", &destination, NULL); if(destination != NULL){ AgsRecycling *first_recycling, *last_recycling; g_object_get(destination, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); ags_recall_channel_run_remap_child_source(recall_channel_run, NULL, NULL, NULL, NULL); ags_recall_channel_run_remap_child_destination(recall_channel_run, NULL, NULL, first_recycling, last_recycling); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } }else{ ags_recall_channel_run_remap_child_source(recall_channel_run, old_start_changed_region, old_end_changed_region, new_start_changed_region, new_end_changed_region); } } void ags_recall_channel_run_destination_recycling_changed_callback(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region, AgsRecallChannelRun *recall_channel_run) { /* empty */ } /** * ags_recall_channel_run_get_recall_audio: * @recall_channel_run: the #AgsRecallChannelRun * * Get recall audio. * * Returns: (transfer full): the #AgsRecallAudio * * Since: 3.1.0 */ AgsRecallAudio* ags_recall_channel_run_get_recall_audio(AgsRecallChannelRun *recall_channel_run) { AgsRecallAudio *recall_audio; if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return(NULL); } g_object_get(recall_channel_run, "recall-audio", &recall_audio, NULL); return(recall_audio); } /** * ags_recall_channel_run_set_recall_audio: * @recall_channel_run: the #AgsRecallChannelRun * @recall_audio: the #AgsRecallAudio * * Set recall audio. * * Since: 3.1.0 */ void ags_recall_channel_run_set_recall_audio(AgsRecallChannelRun *recall_channel_run, AgsRecallAudio *recall_audio) { if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return; } g_object_set(recall_channel_run, "recall-audio", recall_audio, NULL); } /** * ags_recall_channel_run_get_recall_audio_run: * @recall_channel_run: the #AgsRecallChannelRun * * Get recall audio. * * Returns: (transfer full): the #AgsRecallAudioRun * * Since: 3.1.0 */ AgsRecallAudioRun* ags_recall_channel_run_get_recall_audio_run(AgsRecallChannelRun *recall_channel_run) { AgsRecallAudioRun *recall_audio_run; if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return(NULL); } g_object_get(recall_channel_run, "recall-audio-run", &recall_audio_run, NULL); return(recall_audio_run); } /** * ags_recall_channel_run_set_recall_audio_run: * @recall_channel_run: the #AgsRecallChannelRun * @recall_audio_run: the #AgsRecallAudioRun * * Set recall audio. * * Since: 3.1.0 */ void ags_recall_channel_run_set_recall_audio_run(AgsRecallChannelRun *recall_channel_run, AgsRecallAudioRun *recall_audio_run) { if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return; } g_object_set(recall_channel_run, "recall-audio-run", recall_audio_run, NULL); } /** * ags_recall_channel_run_get_recall_channel: * @recall_channel_run: the #AgsRecallChannelRun * * Get recall audio. * * Returns: (transfer full): the #AgsRecallChannel * * Since: 3.1.0 */ AgsRecallChannel* ags_recall_channel_run_get_recall_channel(AgsRecallChannelRun *recall_channel_run) { AgsRecallChannel *recall_channel; if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return(NULL); } g_object_get(recall_channel_run, "recall-channel", &recall_channel, NULL); return(recall_channel); } /** * ags_recall_channel_run_set_recall_channel: * @recall_channel_run: the #AgsRecallChannelRun * @recall_channel: the #AgsRecallChannel * * Set recall audio. * * Since: 3.1.0 */ void ags_recall_channel_run_set_recall_channel(AgsRecallChannelRun *recall_channel_run, AgsRecallChannel *recall_channel) { if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return; } g_object_set(recall_channel_run, "recall-channel", recall_channel, NULL); } /** * ags_recall_channel_run_get_destination: * @recall_channel_run: the #AgsRecallDestination * * Get destination. * * Returns: (transfer full): the #AgsDestination * * Since: 3.1.0 */ AgsChannel* ags_recall_channel_run_get_destination(AgsRecallChannelRun *recall_channel_run) { AgsChannel *destination; if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return(NULL); } g_object_get(recall_channel_run, "destination", &destination, NULL); return(destination); } /** * ags_recall_channel_run_set_destination: * @recall_channel_run: the #AgsRecallChannelRun * @destination: the #AgsChannel * * Set destination. * * Since: 3.1.0 */ void ags_recall_channel_run_set_destination(AgsRecallChannelRun *recall_channel_run, AgsChannel *destination) { if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return; } g_object_set(recall_channel_run, "destination", destination, NULL); } /** * ags_recall_channel_run_get_source: * @recall_channel_run: the #AgsRecallSource * * Get source. * * Returns: (transfer full): the #AgsSource * * Since: 3.1.0 */ AgsChannel* ags_recall_channel_run_get_source(AgsRecallChannelRun *recall_channel_run) { AgsChannel *source; if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return(NULL); } g_object_get(recall_channel_run, "source", &source, NULL); return(source); } /** * ags_recall_channel_run_set_source: * @recall_channel_run: the #AgsRecallChannelRun * @source: the #AgsChannel * * Set source. * * Since: 3.1.0 */ void ags_recall_channel_run_set_source(AgsRecallChannelRun *recall_channel_run, AgsChannel *source) { if(!AGS_IS_RECALL_CHANNEL_RUN(recall_channel_run)){ return; } g_object_set(recall_channel_run, "source", source, NULL); } /** * ags_recall_channel_run_new: * * Creates an #AgsRecallChannelRun * * Returns: a new #AgsRecallChannelRun * * Since: 3.0.0 */ AgsRecallChannelRun* ags_recall_channel_run_new() { AgsRecallChannelRun *recall_channel_run; recall_channel_run = (AgsRecallChannelRun *) g_object_new(AGS_TYPE_RECALL_CHANNEL_RUN, NULL); return(recall_channel_run); } gsequencer-3.1.3/ags/audio/ags_soundcard_util.h0000644000175000017500000000201413607210263016472 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNDCARD_UTIL_H__ #define __AGS_SOUNDCARD_UTIL_H__ #include #include #include G_BEGIN_DECLS GRecMutex* ags_soundcard_util_get_obj_mutex(GObject *soundcard); G_END_DECLS #endif /*__AGS_SOUNDCARD_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_port.c0000644000175000017500000011613513613101164014440 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_port_class_init(AgsPortClass *port_class); void ags_port_connectable_interface_init(AgsConnectableInterface *connectable); void ags_port_init(AgsPort *port); void ags_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_port_dispose(GObject *gobject); void ags_port_finalize(GObject *gobject); AgsUUID* ags_port_get_uuid(AgsConnectable *connectable); gboolean ags_port_has_resource(AgsConnectable *connectable); gboolean ags_port_is_ready(AgsConnectable *connectable); void ags_port_add_to_registry(AgsConnectable *connectable); void ags_port_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_port_list_resource(AgsConnectable *connectable); xmlNode* ags_port_xml_compose(AgsConnectable *connectable); void ags_port_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_port_is_connected(AgsConnectable *connectable); void ags_port_connect(AgsConnectable *connectable); void ags_port_disconnect(AgsConnectable *connectable); void ags_port_real_safe_read(AgsPort *port, GValue *value); void ags_port_real_safe_write(AgsPort *port, GValue *value); void ags_port_real_safe_get_property(AgsPort *port, gchar *property_name, GValue *value); void ags_port_real_safe_set_property(AgsPort *port, gchar *property_name, GValue *value); /** * SECTION:ags_port * @short_description: Perform thread-safe operations * @title: AgsPort * @section_id: * @include: ags/audio/ags_port.h * * #AgsPort provides a thread-safe way to access or change values or properties. */ enum{ SAFE_READ, SAFE_WRITE, SAFE_GET_PROPERTY, SAFE_SET_PROPERTY, LAST_SIGNAL, }; enum{ PROP_0, PROP_PLUGIN_NAME, PROP_SPECIFIER, PROP_CONTROL_PORT, PROP_PORT_VALUE_IS_POINTER, PROP_PORT_VALUE_TYPE, PROP_PORT_VALUE_SIZE, PROP_PORT_VALUE_LENGTH, PROP_PLUGIN_PORT, PROP_CONVERSION, PROP_AUTOMATION, PROP_PORT_VALUE, }; static gpointer ags_port_parent_class = NULL; static guint port_signals[LAST_SIGNAL]; GType ags_port_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_port = 0; static const GTypeInfo ags_port_info = { sizeof (AgsPortClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_port_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPort), 0, /* n_preallocs */ (GInstanceInitFunc) ags_port_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_port_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_port = g_type_register_static(G_TYPE_OBJECT, "AgsPort", &ags_port_info, 0); g_type_add_interface_static(ags_type_port, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_port); } return g_define_type_id__volatile; } void ags_port_class_init(AgsPortClass *port) { GObjectClass *gobject; GParamSpec *param_spec; ags_port_parent_class = g_type_class_peek_parent(port); /* GObjectClass */ gobject = (GObjectClass *) port; gobject->set_property = ags_port_set_property; gobject->get_property = ags_port_get_property; gobject->dispose = ags_port_dispose; gobject->finalize = ags_port_finalize; /* properties */ /** * AgsPort:plugin-name: * * The assigned plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_string("plugin-name", i18n_pspec("plugin-name of port"), i18n_pspec("The plugin-name this port belongs to"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN_NAME, param_spec); /** * AgsPort:specifier: * * The assigned plugin identifier. * * Since: 3.0.0 */ param_spec = g_param_spec_string("specifier", i18n_pspec("specifier of port"), i18n_pspec("The specifier this port is identified by"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SPECIFIER, param_spec); /** * AgsPort:control-port: * * The assigned plugin control port. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-port", i18n_pspec("control-port of port"), i18n_pspec("The control-port this port is numbered"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_PORT, param_spec); /** * AgsPort:port-value-is-pointer: * * Specify port data as pointer. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("port-value-is-pointer", i18n_pspec("port-value-is-pointer indicates if value is a pointer"), i18n_pspec("The port-value-is-pointer indicates if value is a pointer"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_VALUE_IS_POINTER, param_spec); /** * AgsPort:port-value-type: * * The port's data type. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("port-value-type", i18n_pspec("port-value-type tells you the type of the values"), i18n_pspec("The port-value-type tells you the type of the values"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_VALUE_TYPE, param_spec); /** * AgsPort:port-value-size: * * The port's data type size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("port-value-size", i18n_pspec("port-value-size is the size of a single entry"), i18n_pspec("The port-value-size is the size of a single entry"), 1, 8, sizeof(gdouble), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_VALUE_SIZE, param_spec); /** * AgsPort:port-value-length: * * The port's data array length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("port-value-length", i18n_pspec("port-value-length is the array size"), i18n_pspec("The port-value-length is the array size"), 0, G_MAXUINT32, 1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_VALUE_LENGTH, param_spec); /** * AgsPort:plugin-port: * * The plugin-port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("plugin-port", i18n_pspec("plugin port"), i18n_pspec("The plugin port"), AGS_TYPE_PLUGIN_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN_PORT, param_spec); /** * AgsPort:conversion: * * The port's conversion object. * * Since: 3.0.0 */ param_spec = g_param_spec_object("conversion", i18n_pspec("conversion converts values"), i18n_pspec("The conversion is able to translate values"), AGS_TYPE_CONVERSION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONVERSION, param_spec); /** * AgsPort:automation: (type GList(AgsAutomation)) (transfer full) * * The port's automation. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("automation", i18n_pspec("automation"), i18n_pspec("The automation to apply"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUTOMATION, param_spec); /* AgsPortClass */ port->safe_read = ags_port_real_safe_read; port->safe_write = ags_port_real_safe_write; port->safe_get_property = ags_port_real_safe_get_property; port->safe_set_property = ags_port_real_safe_set_property; /* signals */ /** * AgsPort::safe-read: * @port: the object providing safe read * @value: the #GValue-struct * * The ::safe-read signal is emited while doing safe read operation. * * Since: 3.0.0 */ port_signals[SAFE_READ] = g_signal_new("safe-read", G_TYPE_FROM_CLASS (port), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPortClass, safe_read), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsPort::safe-write: * @port: the object providing safe write * @value: the #GValue-struct * * The ::safe-write signal is emited while doing safe write operation. * * Since: 3.0.0 */ port_signals[SAFE_WRITE] = g_signal_new("safe-write", G_TYPE_FROM_CLASS (port), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPortClass, safe_write), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsPort::safe-get-property: * @port: the object providing safe get property * @property_name: the property name * @value: the #GValue-struct * * The ::safe-get-property signal is emited while safe get property. * * Since: 3.0.0 */ port_signals[SAFE_GET_PROPERTY] = g_signal_new("safe-get-property", G_TYPE_FROM_CLASS (port), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPortClass, safe_get_property), NULL, NULL, ags_cclosure_marshal_VOID__STRING_POINTER, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_POINTER); /** * AgsPort::safe-set-property: * @port: the object providing safe set property * @property_name: the property name * @value: the #GValue-struct * * The ::safe-set-property signal is emited while safe set property. * * Since: 3.0.0 */ port_signals[SAFE_SET_PROPERTY] = g_signal_new("safe-set-property", G_TYPE_FROM_CLASS (port), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPortClass, safe_set_property), NULL, NULL, ags_cclosure_marshal_VOID__STRING_POINTER, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_POINTER); } void ags_port_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_port_get_uuid; connectable->has_resource = ags_port_has_resource; connectable->is_ready = ags_port_is_ready; connectable->add_to_registry = ags_port_add_to_registry; connectable->remove_from_registry = ags_port_remove_from_registry; connectable->list_resource = ags_port_list_resource; connectable->xml_compose = ags_port_xml_compose; connectable->xml_parse = ags_port_xml_parse; connectable->is_connected = ags_port_is_connected; connectable->connect = ags_port_connect; connectable->disconnect = ags_port_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_port_init(AgsPort *port) { port->flags = 0; // AGS_PORT_CONVERT_ALWAYS; /* port mutex */ g_rec_mutex_init(&(port->obj_mutex)); /* common fields */ port->plugin_name = NULL; port->specifier = NULL; port->control_port = NULL; port->port_value_is_pointer = FALSE; port->port_value_type = G_TYPE_DOUBLE; port->port_value_size = sizeof(gdouble); port->port_value_length = 1; port->plugin_port = NULL; port->conversion = ags_conversion_new(); g_object_ref(port->conversion); port->automation = NULL; port->port_value.ags_port_double = 0.0; } void ags_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPort *port; GRecMutex *port_mutex; port = AGS_PORT(gobject); /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); switch(prop_id){ case PROP_PLUGIN_NAME: { gchar *plugin_name; plugin_name = (gchar *) g_value_get_string(value); g_rec_mutex_lock(port_mutex); if(port->plugin_name == plugin_name){ g_rec_mutex_unlock(port_mutex); return; } if(port->plugin_name != NULL){ g_free(port->plugin_name); } port->plugin_name = g_strdup(plugin_name); g_rec_mutex_unlock(port_mutex); } break; case PROP_SPECIFIER: { gchar *specifier; specifier = (gchar *) g_value_get_string(value); g_rec_mutex_lock(port_mutex); if(port->specifier == specifier){ g_rec_mutex_unlock(port_mutex); return; } if(port->specifier != NULL){ g_free(port->specifier); } port->specifier = g_strdup(specifier); g_rec_mutex_unlock(port_mutex); } break; case PROP_CONTROL_PORT: { gchar *control_port; control_port = (gchar *) g_value_get_string(value); g_rec_mutex_lock(port_mutex); if(port->control_port == control_port){ g_rec_mutex_unlock(port_mutex); return; } if(port->control_port != NULL){ g_free(port->control_port); } port->control_port = g_strdup(control_port); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_IS_POINTER: { g_rec_mutex_lock(port_mutex); port->port_value_is_pointer = g_value_get_boolean(value); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_TYPE: { g_rec_mutex_lock(port_mutex); port->port_value_type = g_value_get_gtype(value); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_SIZE: { g_rec_mutex_lock(port_mutex); port->port_value_size = g_value_get_uint(value); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_LENGTH: { g_rec_mutex_lock(port_mutex); port->port_value_length = g_value_get_uint(value); g_rec_mutex_unlock(port_mutex); } break; case PROP_PLUGIN_PORT: { AgsPluginPort *plugin_port; plugin_port = g_value_get_object(value); g_rec_mutex_lock(port_mutex); if(plugin_port == (AgsPluginPort *) port->plugin_port){ g_rec_mutex_unlock(port_mutex); return; } if(port->plugin_port != NULL){ g_object_unref(port->plugin_port); } if(plugin_port != NULL){ g_object_ref(plugin_port); } port->plugin_port = (GObject *) plugin_port; g_rec_mutex_unlock(port_mutex); } break; case PROP_CONVERSION: { AgsConversion *conversion; conversion = g_value_get_object(value); g_rec_mutex_lock(port_mutex); if(conversion == port->conversion){ g_rec_mutex_unlock(port_mutex); return; } if(port->conversion != NULL){ g_object_unref(port->conversion); } if(conversion != NULL){ g_object_ref(conversion); } port->conversion = conversion; g_rec_mutex_unlock(port_mutex); } break; case PROP_AUTOMATION: { AgsAutomation *automation; automation = g_value_get_pointer(value); if(g_list_find(port->automation, automation) != NULL){ g_rec_mutex_unlock(port_mutex); return; } if(automation != NULL){ g_object_ref(automation); } port->automation = ags_automation_add(port->automation, automation); g_rec_mutex_unlock(port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPort *port; GRecMutex *port_mutex; port = AGS_PORT(gobject); /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); switch(prop_id){ case PROP_PLUGIN_NAME: { g_rec_mutex_lock(port_mutex); g_value_set_string(value, port->plugin_name); g_rec_mutex_unlock(port_mutex); } break; case PROP_SPECIFIER: { g_rec_mutex_lock(port_mutex); g_value_set_string(value, port->specifier); g_rec_mutex_unlock(port_mutex); } break; case PROP_CONTROL_PORT: { g_rec_mutex_lock(port_mutex); g_value_set_string(value, port->control_port); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_IS_POINTER: { g_rec_mutex_lock(port_mutex); g_value_set_boolean(value, port->port_value_is_pointer); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_TYPE: { g_rec_mutex_lock(port_mutex); g_value_set_gtype(value, port->port_value_type); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_SIZE: { g_rec_mutex_lock(port_mutex); g_value_set_uint(value, port->port_value_size); g_rec_mutex_unlock(port_mutex); } break; case PROP_PORT_VALUE_LENGTH: { g_rec_mutex_lock(port_mutex); g_value_set_uint(value, port->port_value_length); g_rec_mutex_unlock(port_mutex); } break; case PROP_PLUGIN_PORT: { g_rec_mutex_lock(port_mutex); g_value_set_object(value, port->plugin_port); g_rec_mutex_unlock(port_mutex); } break; case PROP_CONVERSION: { g_rec_mutex_lock(port_mutex); g_value_set_object(value, port->conversion); g_rec_mutex_unlock(port_mutex); } break; case PROP_AUTOMATION: { g_rec_mutex_lock(port_mutex); g_value_set_pointer(value, g_list_copy_deep(port->automation, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_port_dispose(GObject *gobject) { AgsPort *port; port = AGS_PORT(gobject); if(port->plugin_port != NULL){ g_object_unref(port->plugin_port); port->plugin_port = NULL; } if(port->conversion != NULL){ g_object_unref(port->conversion); port->conversion = NULL; } if(port->automation != NULL){ g_list_free_full(port->automation, g_object_unref); port->automation = NULL; } /* call parent */ G_OBJECT_CLASS(ags_port_parent_class)->dispose(gobject); } void ags_port_finalize(GObject *gobject) { AgsPort *port; port = AGS_PORT(gobject); g_free(port->plugin_name); g_free(port->specifier); g_free(port->control_port); if(port->plugin_port != NULL){ g_object_unref(port->plugin_port); } if(port->conversion != NULL){ g_object_unref(port->conversion); } if(port->automation != NULL){ g_list_free_full(port->automation, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_port_parent_class)->finalize(gobject); } AgsUUID* ags_port_get_uuid(AgsConnectable *connectable) { AgsPort *port; AgsUUID *ptr; GRecMutex *port_mutex; port = AGS_PORT(connectable); /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* get UUID */ g_rec_mutex_lock(port_mutex); ptr = port->uuid; g_rec_mutex_unlock(port_mutex); return(ptr); } gboolean ags_port_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_port_is_ready(AgsConnectable *connectable) { AgsPort *port; gboolean is_ready; port = AGS_PORT(connectable); /* check is added */ is_ready = ags_port_test_flags(port, AGS_PORT_ADDED_TO_REGISTRY); return(is_ready); } void ags_port_add_to_registry(AgsConnectable *connectable) { AgsPort *port; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *list; if(ags_connectable_is_ready(connectable)){ return; } port = AGS_PORT(connectable); ags_port_set_flags(port, AGS_PORT_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) port); ags_registry_add_entry(registry, entry); } //TODO:JK: implement me } void ags_port_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_port_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_port_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_port_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_port_is_connected(AgsConnectable *connectable) { AgsPort *port; gboolean is_connected; port = AGS_PORT(connectable); /* check is connected */ is_connected = ags_port_test_flags(port, AGS_PORT_CONNECTED); return(is_connected); } void ags_port_connect(AgsConnectable *connectable) { AgsPort *port; GList *list_start, *list; GRecMutex *port_mutex; if(ags_connectable_is_connected(connectable)){ return; } port = AGS_PORT(connectable); ags_port_set_flags(port, AGS_PORT_CONNECTED); } void ags_port_disconnect(AgsConnectable *connectable) { AgsPort *port; GList *list_start, *list; GRecMutex *port_mutex; if(!ags_connectable_is_connected(connectable)){ return; } port = AGS_PORT(connectable); ags_port_unset_flags(port, AGS_PORT_CONNECTED); } /** * ags_port_test_flags: * @port: the #AgsPort * @flags: the flags * * Test @flags to be set on @port. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_port_test_flags(AgsPort *port, guint flags) { gboolean retval; GRecMutex *port_mutex; if(!AGS_IS_PORT(port)){ return(FALSE); } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* test */ g_rec_mutex_lock(port_mutex); retval = (flags & (port->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(port_mutex); return(retval); } /** * ags_port_set_flags: * @port: the #AgsPort * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_port_set_flags(AgsPort *port, guint flags) { GRecMutex *port_mutex; if(!AGS_IS_PORT(port)){ return; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* set flags */ g_rec_mutex_lock(port_mutex); port->flags |= flags; g_rec_mutex_unlock(port_mutex); } /** * ags_port_unset_flags: * @port: the #AgsPort * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_port_unset_flags(AgsPort *port, guint flags) { GRecMutex *port_mutex; if(!AGS_IS_PORT(port)){ return; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* set flags */ g_rec_mutex_lock(port_mutex); port->flags &= (~flags); g_rec_mutex_unlock(port_mutex); } void ags_port_real_safe_read(AgsPort *port, GValue *value) { guint overall_size; gpointer data; GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* safe read */ g_rec_mutex_lock(port_mutex); overall_size = port->port_value_length * port->port_value_size; if(!port->port_value_is_pointer){ if(port->port_value_type == G_TYPE_BOOLEAN){ g_value_set_boolean(value, port->port_value.ags_port_boolean); }else if(port->port_value_type == G_TYPE_INT64){ g_value_set_int64(value, port->port_value.ags_port_int); }else if(port->port_value_type == G_TYPE_UINT64){ g_value_set_uint64(value, port->port_value.ags_port_uint); }else if(port->port_value_type == G_TYPE_FLOAT){ gfloat new_value; if((AGS_PORT_CONVERT_ALWAYS & (port->flags)) != 0){ new_value = (gfloat) ags_conversion_convert(port->conversion, (double) port->port_value.ags_port_float, TRUE); }else{ new_value = port->port_value.ags_port_float; } g_value_set_float(value, new_value); }else if(port->port_value_type == G_TYPE_DOUBLE){ gdouble new_value; if((AGS_PORT_CONVERT_ALWAYS & (port->flags)) != 0){ new_value = ags_conversion_convert(port->conversion, port->port_value.ags_port_double, TRUE); }else{ new_value = port->port_value.ags_port_double; } g_value_set_double(value, new_value); }else{ data = NULL; if(port->port_value_type == G_TYPE_POINTER){ data = port->port_value.ags_port_pointer; }else if(port->port_value_type == G_TYPE_OBJECT){ data = port->port_value.ags_port_object; } g_value_set_pointer(value, data); } }else{ data = NULL; if(port->port_value_type == G_TYPE_STRING){ data = g_strdup(port->port_value.ags_port_string); }else if(port->port_value_type == G_TYPE_POINTER){ data = port->port_value.ags_port_pointer; }else if(port->port_value_type == G_TYPE_OBJECT){ data = port->port_value.ags_port_object; }else{ data = (gpointer) g_value_get_pointer(value); if(port->port_value_type == G_TYPE_BOOLEAN){ memcpy(data, port->port_value.ags_port_boolean_ptr, overall_size); }else if(port->port_value_type == G_TYPE_INT64){ memcpy(data, port->port_value.ags_port_int_ptr, overall_size); }else if(port->port_value_type == G_TYPE_UINT64){ memcpy(data, port->port_value.ags_port_uint_ptr, overall_size); }else if(port->port_value_type == G_TYPE_FLOAT){ guint i; for(i = 0; i < port->port_value_length; i++){ // g_message("port[0x%x]: %f", port, port->port_value.ags_port_float_ptr[i]); ((gfloat *) data)[i] = port->port_value.ags_port_float_ptr[i]; } }else if(port->port_value_type == G_TYPE_DOUBLE){ guint i; for(i = 0; i < port->port_value_length; i++){ // g_message("port[0x%x]: %f", port, port->port_value.ags_port_double_ptr[i]); ((gdouble *) data)[i] = port->port_value.ags_port_double_ptr[i]; } } } g_value_set_pointer(value, data); } g_rec_mutex_unlock(port_mutex); } /** * ags_port_safe_read: * @port: an #AgsPort * @value: the #GValue to store result * * Perform safe read. * * Since: 3.0.0 */ void ags_port_safe_read(AgsPort *port, GValue *value) { g_return_if_fail(AGS_IS_PORT(port)); g_object_ref(G_OBJECT(port)); g_signal_emit(G_OBJECT(port), port_signals[SAFE_READ], 0, value); g_object_unref(G_OBJECT(port)); } /** * ags_port_safe_read_raw: * @port: an #AgsPort * @value: the #GValue to store result * * Perform safe read. * * Since: 3.0.0 */ void ags_port_safe_read_raw(AgsPort *port, GValue *value) { guint overall_size; gpointer data; GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* safe read */ g_rec_mutex_lock(port_mutex); overall_size = port->port_value_length * port->port_value_size; if(!port->port_value_is_pointer){ if(port->port_value_type == G_TYPE_BOOLEAN){ g_value_set_boolean(value, port->port_value.ags_port_boolean); }else if(port->port_value_type == G_TYPE_INT64){ g_value_set_int64(value, port->port_value.ags_port_int); }else if(port->port_value_type == G_TYPE_UINT64){ g_value_set_uint64(value, port->port_value.ags_port_uint); }else if(port->port_value_type == G_TYPE_FLOAT){ gfloat new_value; new_value = port->port_value.ags_port_float; g_value_set_float(value, new_value); }else if(port->port_value_type == G_TYPE_DOUBLE){ gdouble new_value; new_value = port->port_value.ags_port_double; g_value_set_double(value, new_value); }else{ data = NULL; if(port->port_value_type == G_TYPE_POINTER){ data = port->port_value.ags_port_pointer; }else if(port->port_value_type == G_TYPE_OBJECT){ data = port->port_value.ags_port_object; } g_value_set_pointer(value, data); } }else{ data = NULL; if(port->port_value_type == G_TYPE_POINTER){ data = port->port_value.ags_port_pointer; }else if(port->port_value_type == G_TYPE_OBJECT){ data = port->port_value.ags_port_object; }else{ data = (gpointer) malloc(overall_size); if(port->port_value_type == G_TYPE_BOOLEAN){ memcpy(data, port->port_value.ags_port_boolean_ptr, overall_size); }else if(port->port_value_type == G_TYPE_INT64){ memcpy(data, port->port_value.ags_port_int_ptr, overall_size); }else if(port->port_value_type == G_TYPE_UINT64){ memcpy(data, port->port_value.ags_port_uint_ptr, overall_size); }else if(port->port_value_type == G_TYPE_FLOAT){ guint i; for(i = 0; i < port->port_value_length; i++){ ((gfloat *) data)[i] = port->port_value.ags_port_float_ptr[i]; } }else if(port->port_value_type == G_TYPE_DOUBLE){ guint i; for(i = 0; i < port->port_value_length; i++){ ((gdouble *) data)[i] = port->port_value.ags_port_double_ptr[i]; } } } g_value_set_pointer(value, data); } g_rec_mutex_unlock(port_mutex); } void ags_port_real_safe_write(AgsPort *port, GValue *value) { guint overall_size; gpointer data; GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* write */ g_rec_mutex_lock(port_mutex); overall_size = port->port_value_length * port->port_value_size; if(!port->port_value_is_pointer){ if(port->port_value_type == G_TYPE_BOOLEAN){ port->port_value.ags_port_boolean = g_value_get_boolean(value); }else if(port->port_value_type == G_TYPE_INT64){ port->port_value.ags_port_int = g_value_get_int64(value); }else if(port->port_value_type == G_TYPE_UINT64){ port->port_value.ags_port_uint = g_value_get_uint64(value); }else if(port->port_value_type == G_TYPE_FLOAT){ if((AGS_PORT_CONVERT_ALWAYS & (port->flags)) != 0 && port->conversion != NULL){ if((AGS_PORT_USE_LADSPA_FLOAT & (port->flags)) == 0){ port->port_value.ags_port_float = (gfloat) ags_conversion_convert(port->conversion, (double) g_value_get_float(value), FALSE); }else{ LADSPA_Data val; val = g_value_get_float(value); port->port_value.ags_port_ladspa = (LADSPA_Data) ags_conversion_convert(port->conversion, (double) val, FALSE); } }else{ if((AGS_PORT_USE_LADSPA_FLOAT & (port->flags)) == 0){ port->port_value.ags_port_float = (gfloat) g_value_get_float(value); }else{ port->port_value.ags_port_ladspa = (LADSPA_Data) g_value_get_float(value); } } }else if(port->port_value_type == G_TYPE_DOUBLE){ if((AGS_PORT_CONVERT_ALWAYS & (port->flags)) != 0 && port->conversion != NULL){ port->port_value.ags_port_double = ags_conversion_convert(port->conversion, g_value_get_double(value), FALSE); }else{ port->port_value.ags_port_double = g_value_get_double(value); } }else if(port->port_value_type == G_TYPE_POINTER){ port->port_value.ags_port_pointer = g_value_get_pointer(value); }else if(port->port_value_type == G_TYPE_OBJECT){ port->port_value.ags_port_object = g_value_get_object(value); }else{ g_warning("ags_port.c: unknown type"); } }else{ data = g_value_get_pointer(value); if(port->port_value_type == G_TYPE_BOOLEAN){ memcpy(port->port_value.ags_port_boolean_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_INT64){ memcpy(port->port_value.ags_port_int_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_UINT64){ memcpy(port->port_value.ags_port_uint_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_DOUBLE){ memcpy(port->port_value.ags_port_double_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_POINTER){ port->port_value.ags_port_pointer = data; }else{ data = g_value_get_object(value); if(port->port_value_type == G_TYPE_OBJECT){ port->port_value.ags_port_object = data; }else{ g_warning("ags_port.c: unknown type"); } } } g_rec_mutex_unlock(port_mutex); } /** * ags_port_safe_write: * @port: an #AgsPort * @value: the #GValue containing data * * Perform safe write. * * Since: 3.0.0 */ void ags_port_safe_write(AgsPort *port, GValue *value) { g_return_if_fail(AGS_IS_PORT(port)); g_object_ref(G_OBJECT(port)); g_signal_emit(G_OBJECT(port), port_signals[SAFE_WRITE], 0, value); g_object_unref(G_OBJECT(port)); } void ags_port_safe_write_raw(AgsPort *port, GValue *value) { guint overall_size; gpointer data; GRecMutex *port_mutex; if(!AGS_IS_PORT(port)){ return; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* write raw */ g_rec_mutex_lock(port_mutex); overall_size = port->port_value_length * port->port_value_size; if(!port->port_value_is_pointer){ if(port->port_value_type == G_TYPE_BOOLEAN){ port->port_value.ags_port_boolean = g_value_get_boolean(value); }else if(port->port_value_type == G_TYPE_INT64){ port->port_value.ags_port_int = g_value_get_int64(value); }else if(port->port_value_type == G_TYPE_UINT64){ port->port_value.ags_port_uint = g_value_get_uint64(value); }else if(port->port_value_type == G_TYPE_FLOAT){ if((AGS_PORT_USE_LADSPA_FLOAT & (port->flags)) == 0){ port->port_value.ags_port_float = (gfloat) g_value_get_float(value); }else{ port->port_value.ags_port_ladspa = (LADSPA_Data) g_value_get_float(value); } }else if(port->port_value_type == G_TYPE_DOUBLE){ port->port_value.ags_port_double = g_value_get_double(value); }else if(port->port_value_type == G_TYPE_POINTER){ port->port_value.ags_port_pointer = g_value_get_pointer(value); }else if(port->port_value_type == G_TYPE_OBJECT){ port->port_value.ags_port_object = g_value_get_object(value); }else{ g_warning("ags_port.c: unknown type"); } }else{ data = g_value_get_pointer(value); if(port->port_value_type == G_TYPE_BOOLEAN){ memcpy(port->port_value.ags_port_boolean_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_INT64){ memcpy(port->port_value.ags_port_int_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_UINT64){ memcpy(port->port_value.ags_port_uint_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_DOUBLE){ memcpy(port->port_value.ags_port_double_ptr, data, overall_size); }else if(port->port_value_type == G_TYPE_POINTER){ port->port_value.ags_port_pointer = data; }else{ data = g_value_get_object(value); if(port->port_value_type == G_TYPE_OBJECT){ port->port_value.ags_port_object = data; }else{ g_warning("ags_port.c: unknown type"); } } } g_rec_mutex_unlock(port_mutex); } void ags_port_real_safe_get_property(AgsPort *port, gchar *property_name, GValue *value) { GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* get property */ g_rec_mutex_lock(port_mutex); g_object_get_property(port->port_value.ags_port_object, property_name, value); g_rec_mutex_unlock(port_mutex); } /** * ags_port_safe_get_property: * @port: an #AgsPort * @property_name: the property's name * @value: the #GValue to store the result * * Perform safe get property. * * Since: 3.0.0 */ void ags_port_safe_get_property(AgsPort *port, gchar *property_name, GValue *value) { g_return_if_fail(AGS_IS_PORT(port)); g_object_ref(G_OBJECT(port)); g_signal_emit(G_OBJECT(port), port_signals[SAFE_GET_PROPERTY], 0, property_name, value); g_object_unref(G_OBJECT(port)); } void ags_port_real_safe_set_property(AgsPort *port, gchar *property_name, GValue *value) { GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* set property */ g_rec_mutex_lock(port_mutex); g_object_set_property(port->port_value.ags_port_object, property_name, value); g_rec_mutex_unlock(port_mutex); } /** * ags_port_safe_set_property: * @port: an #AgsPort * @property_name: the property's name * @value: the #GValue containing data * * Perform safe set property. * * Since: 3.0.0 */ void ags_port_safe_set_property(AgsPort *port, gchar *property_name, GValue *value) { g_return_if_fail(AGS_IS_PORT(port)); g_object_ref(G_OBJECT(port)); g_signal_emit(G_OBJECT(port), port_signals[SAFE_SET_PROPERTY], 0, property_name, value); g_object_unref(G_OBJECT(port)); } /** * ags_port_find_specifier: * @port: (element-type AgsAudio.Port) (transfer none): the #GList-struct containing #AgsPort * @specifier: the recall specifier to match * * Retrieve port by specifier. * * Returns: (element-type AgsAudio.Port) (transfer none): Next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_port_find_specifier(GList *port, gchar *specifier) { AgsPort *current_port; gboolean success; GRecMutex *port_mutex; while(port != NULL){ current_port = port->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* check specifier */ g_rec_mutex_lock(port_mutex); success = (!g_strcmp0(current_port->specifier, specifier)) ? TRUE: FALSE; g_rec_mutex_unlock(port_mutex); if(success){ return(port); } port = port->next; } return(NULL); } /** * ags_port_add_automation: * @port: the #AgsPort * @automation: the #AgsAutomation * * Adds an automation. * * Since: 3.0.0 */ void ags_port_add_automation(AgsPort *port, GObject *automation) { GRecMutex *port_mutex; if(!AGS_IS_PORT(port) || !AGS_IS_AUTOMATION(automation)){ return; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* add recall id */ g_rec_mutex_lock(port_mutex); if(g_list_find(port->automation, automation) == NULL){ g_object_ref(automation); port->automation = ags_automation_add(port->automation, (AgsAutomation *) automation); g_object_set(automation, "port", port, NULL); } g_rec_mutex_unlock(port_mutex); } /** * ags_port_remove_automation: * @port: the #AgsPort * @automation: the #AgsAutomation * * Removes an automation. * * Since: 3.0.0 */ void ags_port_remove_automation(AgsPort *port, GObject *automation) { GRecMutex *port_mutex; if(!AGS_IS_PORT(port) || !AGS_IS_AUTOMATION(automation)){ return; } /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* remove automation */ g_rec_mutex_lock(port_mutex); if(g_list_find(port->automation, automation) != NULL){ port->automation = g_list_remove(port->automation, automation); g_object_set(automation, "port", NULL, NULL); g_object_unref(automation); } g_rec_mutex_unlock(port_mutex); } /** * ags_port_new: * * Creates an #AgsPort. * * Returns: a new #AgsPort. * * Since: 3.0.0 */ AgsPort* ags_port_new() { AgsPort *port; port = (AgsPort *) g_object_new(AGS_TYPE_PORT, NULL); return(port); } gsequencer-3.1.3/ags/audio/ags_notation.c0000644000175000017500000016151113616617253015323 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_notation_class_init(AgsNotationClass *notation); void ags_notation_init(AgsNotation *notation); void ags_notation_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_notation_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_notation_dispose(GObject *gobject); void ags_notation_finalize(GObject *gobject); void ags_notation_insert_native_piano_from_clipboard_version_0_3_12(AgsNotation *notation, xmlNode *root_node, char *version, char *base_frequency, char *x_boundary, char *y_boundary, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset, gboolean match_channel, gboolean no_duplicates, guint current_audio_channel, gboolean match_timestamp); void ags_notation_insert_native_piano_from_clipboard(AgsNotation *notation, xmlNode *root_node, char *version, char *base_frequency, char *x_boundary, char *y_boundary, gboolean from_x_offset, guint x_offset, gboolean from_y_offset, guint y_offset, gboolean match_channel, gboolean no_duplicates); /** * SECTION:ags_notation * @short_description: Notation class supporting selection and clipboard. * @title: AgsNotation * @section_id: * @include: ags/audio/ags_notation.h * * #AgsNotation acts as a container of #AgsNote. */ enum{ PROP_0, PROP_AUDIO, PROP_AUDIO_CHANNEL, PROP_TIMESTAMP, PROP_NOTE, }; static gpointer ags_notation_parent_class = NULL; GType ags_notation_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_notation = 0; static const GTypeInfo ags_notation_info = { sizeof(AgsNotationClass), NULL, NULL, (GClassInitFunc) ags_notation_class_init, NULL, NULL, sizeof(AgsNotation), 0, (GInstanceInitFunc) ags_notation_init, }; ags_type_notation = g_type_register_static(G_TYPE_OBJECT, "AgsNotation", &ags_notation_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_notation); } return g_define_type_id__volatile; } void ags_notation_class_init(AgsNotationClass *notation) { GObjectClass *gobject; GParamSpec *param_spec; ags_notation_parent_class = g_type_class_peek_parent(notation); gobject = (GObjectClass *) notation; gobject->set_property = ags_notation_set_property; gobject->get_property = ags_notation_get_property; gobject->dispose = ags_notation_dispose; gobject->finalize = ags_notation_finalize; /* properties */ /** * AgsNotation:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of notation"), i18n_pspec("The audio of notation"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsNotation:audio-channel: * * The effect's audio-channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("audio-channel of effect"), i18n_pspec("The numerical audio-channel of effect"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsNotation:timestamp: * * The notation's timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("timestamp of notation"), i18n_pspec("The timestamp of notation"), AGS_TYPE_TIMESTAMP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); /** * AgsNotation:note: (type GList(AgsNote)) (transfer full) * * The assigned #AgsNote * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("note", i18n_pspec("note of notation"), i18n_pspec("The note of notation"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE, param_spec); } void ags_notation_init(AgsNotation *notation) { notation->flags = 0; /* add notation mutex */ g_rec_mutex_init(&(notation->obj_mutex)); /* fields */ notation->audio = NULL; notation->audio_channel = 0; notation->timestamp = ags_timestamp_new(); notation->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); notation->timestamp->flags |= AGS_TIMESTAMP_OFFSET; notation->timestamp->timer.ags_offset.offset = 0; g_object_ref(notation->timestamp); notation->maximum_note_length = AGS_NOTATION_MAXIMUM_NOTE_LENGTH; notation->note = NULL; notation->selection = NULL; } void ags_notation_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsNotation *notation; GRecMutex *notation_mutex; notation = AGS_NOTATION(gobject); /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(notation_mutex); if(notation->audio == (GObject *) audio){ g_rec_mutex_unlock(notation_mutex); return; } if(notation->audio != NULL){ g_object_unref(notation->audio); } if(audio != NULL){ g_object_ref(audio); } notation->audio = (GObject *) audio; g_rec_mutex_unlock(notation_mutex); } break; case PROP_AUDIO_CHANNEL: { guint audio_channel; audio_channel = g_value_get_uint(value); g_rec_mutex_lock(notation_mutex); notation->audio_channel = audio_channel; g_rec_mutex_unlock(notation_mutex); } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_value_get_object(value); g_rec_mutex_lock(notation_mutex); if(timestamp == notation->timestamp){ g_rec_mutex_unlock(notation_mutex); return; } if(notation->timestamp != NULL){ g_object_unref(G_OBJECT(notation->timestamp)); } if(timestamp != NULL){ g_object_ref(G_OBJECT(timestamp)); } notation->timestamp = timestamp; g_rec_mutex_unlock(notation_mutex); } break; case PROP_NOTE: { AgsNote *note; note = (AgsNote *) g_value_get_object(value); g_rec_mutex_lock(notation_mutex); if(note == NULL || g_list_find(notation->note, note) != NULL){ g_rec_mutex_unlock(notation_mutex); return; } g_rec_mutex_unlock(notation_mutex); ags_notation_add_note(notation, note, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_notation_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsNotation *notation; GRecMutex *notation_mutex; notation = AGS_NOTATION(gobject); /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(notation_mutex); g_value_set_object(value, notation->audio); g_rec_mutex_unlock(notation_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(notation_mutex); g_value_set_uint(value, notation->audio_channel); g_rec_mutex_unlock(notation_mutex); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(notation_mutex); g_value_set_object(value, notation->timestamp); g_rec_mutex_unlock(notation_mutex); } break; case PROP_NOTE: { g_rec_mutex_lock(notation_mutex); g_value_set_pointer(value, g_list_copy_deep(notation->note, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(notation_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_notation_dispose(GObject *gobject) { AgsNotation *notation; GList *list; notation = AGS_NOTATION(gobject); /* audio */ if(notation->audio != NULL){ g_object_unref(notation->audio); notation->audio = NULL; } /* timestamp */ if(notation->timestamp != NULL){ g_object_unref(notation->timestamp); notation->timestamp = NULL; } /* note and selection */ list = notation->note; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(notation->note, g_object_unref); g_list_free_full(notation->selection, g_object_unref); notation->note = NULL; notation->selection = NULL; /* call parent */ G_OBJECT_CLASS(ags_notation_parent_class)->dispose(gobject); } void ags_notation_finalize(GObject *gobject) { AgsNotation *notation; notation = AGS_NOTATION(gobject); /* audio */ if(notation->audio != NULL){ g_object_unref(notation->audio); } /* timestamp */ if(notation->timestamp != NULL){ g_object_unref(notation->timestamp); } /* note and selection */ g_list_free_full(notation->note, g_object_unref); g_list_free_full(notation->selection, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_notation_parent_class)->finalize(gobject); } /** * ags_notation_get_obj_mutex: * @notation: the #AgsNotation * * Get object mutex. * * Returns: the #GRecMutex to lock @notation * * Since: 3.1.0 */ GRecMutex* ags_notation_get_obj_mutex(AgsNotation *notation) { if(!AGS_IS_NOTATION(notation)){ return(NULL); } return(AGS_NOTATION_GET_OBJ_MUTEX(notation)); } /** * ags_notation_test_flags: * @notation: the #AgsNotation * @flags: the flags * * Test @flags to be set on @notation. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_notation_test_flags(AgsNotation *notation, guint flags) { gboolean retval; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(FALSE); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* test */ g_rec_mutex_lock(notation_mutex); retval = (flags & (notation->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(notation_mutex); return(retval); } /** * ags_notation_set_flags: * @notation: the #AgsNotation * @flags: the flags * * Set @flags on @notation. * * Since: 3.0.0 */ void ags_notation_set_flags(AgsNotation *notation, guint flags) { GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* set */ g_rec_mutex_lock(notation_mutex); notation->flags |= flags; g_rec_mutex_unlock(notation_mutex); } /** * ags_notation_unset_flags: * @notation: the #AgsNotation * @flags: the flags * * Unset @flags on @notation. * * Since: 3.0.0 */ void ags_notation_unset_flags(AgsNotation *notation, guint flags) { GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* set */ g_rec_mutex_lock(notation_mutex); notation->flags &= (~flags); g_rec_mutex_unlock(notation_mutex); } /** * ags_notation_find_near_timestamp: * @notation: (element-type AgsAudio.Notation) (transfer none): the #GList-struct containing #AgsNotation * @audio_channel: the matching audio channel * @timestamp: (allow-none): the matching timestamp, or %NULL to match any timestamp * * Retrieve appropriate notation for timestamp. * * Returns: (element-type AgsAudio.Notation) (transfer none): Next matching #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_notation_find_near_timestamp(GList *notation, guint audio_channel, AgsTimestamp *timestamp) { AgsTimestamp *current_timestamp; GList *retval; GList *current_start, *current_end, *current; guint current_audio_channel; guint64 current_x, x; guint length, position; gboolean use_ags_offset; gboolean success; if(notation == NULL){ return(NULL); } current_start = notation; current_end = g_list_last(notation); length = g_list_length(notation); position = (length - 1) / 2; current = g_list_nth(current_start, position); if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_OFFSET)){ x = ags_timestamp_get_ags_offset(timestamp); use_ags_offset = TRUE; }else if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_UNIX)){ x = ags_timestamp_get_unix_time(timestamp); use_ags_offset = FALSE; }else{ return(NULL); } retval = NULL; success = FALSE; while(!success && current != NULL){ current_x = 0; /* check current - start */ g_object_get(current_start->data, "audio-channel", ¤t_audio_channel, NULL); if(current_audio_channel == audio_channel){ if(timestamp == NULL){ retval = current_start; break; } g_object_get(current_start->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_NOTATION_DEFAULT_OFFSET){ retval = current_start; break; } }else{ if(current_x >= x && current_x < x + AGS_NOTATION_DEFAULT_DURATION){ retval = current_start; break; } } }else{ g_warning("inconsistent data"); } } /* check current - end */ g_object_get(current_end->data, "audio-channel", ¤t_audio_channel, NULL); if(current_audio_channel == audio_channel){ if(timestamp == NULL){ retval = current_end; break; } g_object_get(current_end->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_NOTATION_DEFAULT_OFFSET){ retval = current_end; break; } }else{ if(current_x >= x && current_x < x + AGS_NOTATION_DEFAULT_DURATION){ retval = current_end; break; } } }else{ g_warning("inconsistent data"); } } /* check current - center */ g_object_get(current->data, "audio-channel", ¤t_audio_channel, NULL); if(current_audio_channel == audio_channel){ if(timestamp == NULL){ retval = current; break; } } g_object_get(current->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_NOTATION_DEFAULT_OFFSET && current_audio_channel == audio_channel){ retval = current; break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_NOTATION_DEFAULT_DURATION && current_audio_channel == audio_channel){ retval = current; break; } } }else{ g_warning("inconsistent data"); } if(length <= 3){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } return(retval); } /** * ags_notation_sort_func: * @a: the #AgsNotation * @b: another #AgsNotation * * Compare @a and @b. * * Returns: 0 if equal, -1 if smaller and 1 if bigger timestamp * * Since: 3.0.0 */ gint ags_notation_sort_func(gconstpointer a, gconstpointer b) { AgsTimestamp *timestamp_a, *timestamp_b; guint64 offset_a, offset_b; g_object_get(a, "timestamp", ×tamp_a, NULL); g_object_get(b, "timestamp", ×tamp_b, NULL); offset_a = ags_timestamp_get_ags_offset(timestamp_a); offset_b = ags_timestamp_get_ags_offset(timestamp_b); g_object_unref(timestamp_a); g_object_unref(timestamp_b); if(offset_a == offset_b){ return(0); }else if(offset_a < offset_b){ return(-1); }else if(offset_a > offset_b){ return(1); } return(0); } /** * ags_notation_get_audio: * @notation: the #AgsNotation * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ GObject* ags_notation_get_audio(AgsNotation *notation) { GObject *audio; if(!AGS_IS_NOTATION(notation)){ return(NULL); } g_object_get(notation, "audio", &audio, NULL); return(audio); } /** * ags_notation_set_audio: * @notation: the #AgsNotation * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_notation_set_audio(AgsNotation *notation, GObject *audio) { if(!AGS_IS_NOTATION(notation)){ return; } g_object_set(notation, "audio", audio, NULL); } /** * ags_notation_get_audio_channel: * @notation: the #AgsNotation * * Gets audio channel. * * Returns: the audio channel * * Since: 3.1.0 */ guint ags_notation_get_audio_channel(AgsNotation *notation) { guint audio_channel; if(!AGS_IS_NOTATION(notation)){ return(0); } g_object_get(notation, "audio-channel", &audio_channel, NULL); return(audio_channel); } /** * ags_notation_set_audio_channel: * @notation: the #AgsNotation * @audio_channel: the audio channel * * Sets audio channel. * * Since: 3.1.0 */ void ags_notation_set_audio_channel(AgsNotation *notation, guint audio_channel) { if(!AGS_IS_NOTATION(notation)){ return; } g_object_set(notation, "audio-channel", audio_channel, NULL); } /** * ags_notation_get_is_minor: * @notation: the #AgsNotation * * Gets is minor. * * Returns: is minor * * Since: 3.1.0 */ gboolean ags_notation_get_is_minor(AgsNotation *notation) { gboolean is_minor; if(!AGS_IS_NOTATION(notation)){ return(FALSE); } g_object_get(notation, "is-minor", &is_minor, NULL); return(is_minor); } /** * ags_notation_set_is_minor: * @notation: the #AgsNotation * @is_minor: is minor * * Sets is minor. * * Since: 3.1.0 */ void ags_notation_set_is_minor(AgsNotation *notation, gboolean is_minor) { if(!AGS_IS_NOTATION(notation)){ return; } g_object_set(notation, "is-minor", is_minor, NULL); } /** * ags_notation_get_sharp_flats: * @notation: the #AgsNotation * * Gets sharp flats. * * Returns: the sharp flats * * Since: 3.1.0 */ guint ags_notation_get_sharp_flats(AgsNotation *notation) { guint sharp_flats; if(!AGS_IS_NOTATION(notation)){ return(0); } g_object_get(notation, "sharp-flats", &sharp_flats, NULL); return(sharp_flats); } /** * ags_notation_set_sharp_flats: * @notation: the #AgsNotation * @sharp_flats: the sharp flats * * Sets sharp flats. * * Since: 3.1.0 */ void ags_notation_set_sharp_flats(AgsNotation *notation, guint sharp_flats) { if(!AGS_IS_NOTATION(notation)){ return; } g_object_set(notation, "sharp-flats", sharp_flats, NULL); } /** * ags_notation_get_timestamp: * @notation: the #AgsNotation * * Get timestamp. * * Returns: (transfer full): the #AgsTimestamp * * Since: 3.1.0 */ AgsTimestamp* ags_notation_get_timestamp(AgsNotation *notation) { AgsTimestamp *timestamp; if(!AGS_IS_NOTATION(notation)){ return(NULL); } g_object_get(notation, "timestamp", ×tamp, NULL); return(timestamp); } /** * ags_notation_set_timestamp: * @notation: the #AgsNotation * @timestamp: the #AgsTimestamp * * Set timestamp. * * Since: 3.1.0 */ void ags_notation_set_timestamp(AgsNotation *notation, AgsTimestamp *timestamp) { if(!AGS_IS_NOTATION(notation)){ return; } g_object_set(notation, "timestamp", timestamp, NULL); } /** * ags_notation_get_note: * @notation: the #AgsNotation * * Get note. * * Returns: (element-type AgsAudio.Note) (transfer full): the #GList-struct containig #AgsNote * * Since: 3.1.0 */ GList* ags_notation_get_note(AgsNotation *notation) { GList *note; if(!AGS_IS_NOTATION(notation)){ return(NULL); } g_object_get(notation, "note", ¬e, NULL); return(note); } /** * ags_notation_set_note: * @notation: the #AgsNotation * @note: (element-type AgsAudio.Note) (transfer full): the #GList-struct containing #AgsNote * * Set note by replacing existing. * * Since: 3.1.0 */ void ags_notation_set_note(AgsNotation *notation, GList *note) { GList *start_note; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); g_rec_mutex_lock(notation_mutex); start_note = notation->note; notation->note = note; g_rec_mutex_unlock(notation_mutex); g_list_free_full(start_note, (GDestroyNotify) g_object_unref); } /** * ags_notation_add: * @notation: (element-type AgsAudio.Notation) (transfer none): the #GList-struct containing #AgsNotation * @new_notation: the #AgsNotation to add * * Add @new_notation sorted to @notation * * Returns: (element-type AgsAudio.Notation) (transfer none): the new beginning of @notation * * Since: 3.0.0 */ GList* ags_notation_add(GList *notation, AgsNotation *new_notation) { AgsTimestamp *timestamp; GList *list; guint audio_channel; if(!AGS_IS_NOTATION(new_notation)){ return(notation); } g_object_get(new_notation, "timestamp", ×tamp, "audio-channel", &audio_channel, NULL); list = ags_notation_find_near_timestamp(notation, audio_channel, timestamp); g_object_unref(timestamp); if(list != NULL){ g_critical("timestamp already preset"); return(notation); } notation = g_list_insert_sorted(notation, new_notation, ags_notation_sort_func); return(notation); } /** * ags_notation_add_note: * @notation: the #AgsNotation * @note: the #AgsNote to add * @use_selection_list: if %TRUE add to selection, else to default notation * * Adds @note to @notation. * * Since: 3.0.0 */ void ags_notation_add_note(AgsNotation *notation, AgsNote *note, gboolean use_selection_list) { AgsTimestamp *timestamp; guint64 timestamp_x; guint x0; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation) || !AGS_IS_NOTE(note)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); g_object_get(notation, "timestamp", ×tamp, NULL); timestamp_x = ags_timestamp_get_ags_offset(timestamp); g_object_unref(timestamp); g_object_get(note, "x0", &x0, NULL); if(x0 < timestamp_x || x0 >= timestamp_x + AGS_NOTATION_DEFAULT_OFFSET){ g_critical("timestamp not matching note:x0"); return; } /* insert sorted */ g_object_ref(note); #ifdef AGS_DEBUG g_message("add note[%d,%d|%d]", note->x[0], note->x[1], note->y); #endif g_rec_mutex_lock(notation_mutex); if(use_selection_list){ notation->selection = g_list_insert_sorted(notation->selection, note, (GCompareFunc) ags_note_sort_func); ags_note_set_flags(note, AGS_NOTE_IS_SELECTED); }else{ notation->note = g_list_insert_sorted(notation->note, note, (GCompareFunc) ags_note_sort_func); } g_rec_mutex_unlock(notation_mutex); } /** * ags_notation_remove_note: * @notation: the #AgsNotation * @note: the #AgsNote to remove * @use_selection_list: if %TRUE remove from selection, else from default notation * * Removes @note from @notation. * * Since: 3.0.0 */ void ags_notation_remove_note(AgsNotation *notation, AgsNote *note, gboolean use_selection_list) { GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation) || !AGS_IS_NOTE(note)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* remove if found */ g_rec_mutex_lock(notation_mutex); if(!use_selection_list){ if(g_list_find(notation->note, note) != NULL){ notation->note = g_list_remove(notation->note, note); g_object_unref(note); } }else{ if(g_list_find(notation->selection, note) != NULL){ notation->selection = g_list_remove(notation->selection, note); g_object_unref(note); } } g_rec_mutex_unlock(notation_mutex); } /** * ags_notation_remove_note_at_position: * @notation: the #AgsNotation * @x: offset * @y: note * * Removes one #AgsNote of notation. * * Returns: %TRUE if successfully removed note. * * Since: 3.0.0 */ gboolean ags_notation_remove_note_at_position(AgsNotation *notation, guint x, guint y) { AgsNote *note; GList *start_list, *list; guint current_x0, current_y; gboolean retval; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(FALSE); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find note */ g_rec_mutex_lock(notation_mutex); list = start_list = g_list_copy_deep(notation->note, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(notation_mutex); note = NULL; retval = FALSE; while(list != NULL){ g_object_get(list->data, "x0", ¤t_x0, "y", ¤t_y, NULL); if(current_x0 == x && current_y == y){ note = list->data; retval = TRUE; break; } if(current_x0 > x){ break; } list = list->next; } /* delete link and unref */ if(retval){ g_rec_mutex_lock(notation_mutex); notation->note = g_list_remove(notation->note, note); g_object_unref(note); g_rec_mutex_unlock(notation_mutex); } g_list_free_full(start_list, g_object_unref); return(retval); } /** * ags_notation_get_selection: * @notation: the #AgsNotation * * Retrieve selection. * * Returns: (element-type AgsAudio.Note) (transfer none): the selection. * * Since: 3.0.0 */ GList* ags_notation_get_selection(AgsNotation *notation) { GList *selection; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(NULL); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* selection */ g_rec_mutex_lock(notation_mutex); selection = notation->selection; g_rec_mutex_unlock(notation_mutex); return(selection); } /** * ags_notation_is_note_selected: * @notation: the #AgsNotation * @note: the #AgsNote to check for * * Check selection for note. * * Returns: %TRUE if selected otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_notation_is_note_selected(AgsNotation *notation, AgsNote *note) { GList *selection; guint x0; guint current_x0; gboolean retval; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation) || !AGS_IS_NOTE(note)){ return(FALSE); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* get x */ g_object_get(note, "x0", &x0, NULL); /* match note */ g_rec_mutex_lock(notation_mutex); selection = notation->selection; retval = FALSE; while(selection != NULL){ /* get current x */ g_object_get(selection->data, "x0", ¤t_x0, NULL); if(current_x0 > x0){ break; } if(selection->data == note){ retval = TRUE; break; } selection = selection->next; } g_rec_mutex_unlock(notation_mutex); return(retval); } /** * ags_notation_find_point: * @notation: the #AgsNotation * @x: offset * @y: note * @use_selection_list: if %TRUE selection is searched * * Find note by offset and tone. * * Returns: (transfer none): the matching note. * * Since: 3.0.0 */ AgsNote* ags_notation_find_point(AgsNotation *notation, guint x, guint y, gboolean use_selection_list) { AgsNote *retval; GList *note; guint current_x0, current_x1, current_y; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(NULL); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find note */ g_rec_mutex_lock(notation_mutex); if(use_selection_list){ note = notation->selection; }else{ note = notation->note; } retval = NULL; while(note != NULL){ g_object_get(note->data, "x0", ¤t_x0, "x1", ¤t_x1, "y", ¤t_y, NULL); if(current_x0 > x){ break; } if(x >= current_x0 && x < current_x1 && current_y == y){ retval = note->data; break; } note = note->next; } g_rec_mutex_unlock(notation_mutex); return(retval); } /** * ags_notation_find_region: * @notation: the #AgsNotation * @x0: start offset * @y0: start tone * @x1: end offset * @y1: end tone * @use_selection_list: if %TRUE selection is searched * * Find note by offset and tone region. * * Returns: (element-type AgsAudio.Note) (transfer container): the matching notes as #GList-struct * * Since: 3.0.0 */ GList* ags_notation_find_region(AgsNotation *notation, guint x0, guint y0, guint x1, guint y1, gboolean use_selection_list) { GList *note; GList *region; guint current_x0, current_y; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(NULL); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); if(x0 > x1){ guint tmp; tmp = x1; x1 = x0; x0 = x1; } if(y0 > y1){ gdouble tmp_y; tmp_y = y0; y0 = y1; y1 = tmp_y; } /* find note */ g_rec_mutex_lock(notation_mutex); if(use_selection_list){ note = notation->selection; }else{ note = notation->note; } while(note != NULL){ g_object_get(note->data, "x0", ¤t_x0, NULL); if(current_x0 >= x0){ break; } note = note->next; } region = NULL; while(note != NULL){ g_object_get(note->data, "x0", ¤t_x0, "y", ¤t_y, NULL); if(current_x0 > x1){ break; } if(current_y >= y0 && current_y < y1){ region = g_list_prepend(region, note->data); } note = note->next; } g_rec_mutex_unlock(notation_mutex); region = g_list_reverse(region); return(region); } /** * ags_notation_find_offset: * @notation: the #AgsNotation * @x: offset * @use_selection_list: if %TRUE selection is searched * * Find all notes by offset @x. * * Returns: (element-type AgsAudio.Note) (transfer full): the #GList-struct containing matching #AgsNote * * Since: 3.0.0 */ GList* ags_notation_find_offset(AgsNotation *notation, guint x, gboolean use_selection_list) { GList *retval; GList *note; GList *next, *prev; GList *current_start, *current_end, *current; guint current_start_x, current_end_x, current_x; guint length, position; gboolean success; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(NULL); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find note */ g_rec_mutex_lock(notation_mutex); if(use_selection_list){ note = notation->selection; }else{ note = notation->note; } current_start = note; current_end = g_list_last(note); length = g_list_length(note); position = (length - 1) / 2; current = g_list_nth(current_start, position); retval = NULL; success = FALSE; while(!success && current != NULL){ g_object_get(current_start->data, "x0", ¤t_start_x, NULL); if(current_start_x > x){ break; } if(current_start_x == x){ retval = g_list_prepend(retval, current_start->data); g_object_ref(current_start->data); break; } g_object_get(current_end->data, "x0", ¤t_end_x, NULL); if(current_end_x < x){ break; } if(current_end_x == x){ retval = g_list_prepend(retval, current_end->data); g_object_ref(current_end->data); break; } g_object_get(current->data, "x0", ¤t_x, NULL); if(current_x == x){ retval = g_list_prepend(retval, current->data); g_object_ref(current->data); break; } if(length <= 3){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } if(retval != NULL){ next = NULL; prev = NULL; if(current_start->data == retval->data){ next = current_start->next; prev = current_start->prev; }else if(current_end->data == retval->data){ next = current_end->next; prev = current_end->prev; }else if(current->data == retval->data){ next = current->next; prev = current->prev; } /* check next */ current = next; while(current != NULL){ g_object_get(current->data, "x0", ¤t_x, NULL); if(current_x == x){ retval = g_list_prepend(retval, current->data); g_object_ref(current->data); }else{ break; } current = current->next; } retval = g_list_reverse(retval); /* check prev */ current = prev; while(current != NULL){ g_object_get(current->data, "x0", ¤t_x, NULL); if(current_x == x){ retval = g_list_prepend(retval, current->data); g_object_ref(current->data); }else{ break; } current = current->prev; } } g_rec_mutex_unlock(notation_mutex); return(retval); } /** * ags_notation_free_selection: * @notation: the #AgsNotation * * Clear selection. * * Since: 3.0.0 */ void ags_notation_free_selection(AgsNotation *notation) { AgsNote *note; GList *list_start, *list; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* free selection */ g_rec_mutex_lock(notation_mutex); list = list_start = notation->selection; while(list != NULL){ ags_note_unset_flags(list->data, AGS_NOTE_IS_SELECTED); list = list->next; } notation->selection = NULL; g_rec_mutex_unlock(notation_mutex); g_list_free_full(list_start, g_object_unref); } /** * ags_notation_add_point_to_selection: * @notation: the #AgsNotation * @x: x offset * @y: y note tone * @replace_current_selection: if %TRUE selection is replaced * * Select notes at position. * * Since: 3.0.0 */ void ags_notation_add_point_to_selection(AgsNotation *notation, guint x, guint y, gboolean replace_current_selection) { AgsNote *note; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find note */ note = ags_notation_find_point(notation, x, y, FALSE); if(note == NULL){ /* there is nothing to be selected */ if(replace_current_selection){ ags_notation_free_selection(notation); } }else{ /* add to or replace selection */ ags_note_set_flags(note, AGS_NOTE_IS_SELECTED); if(replace_current_selection){ GList *list; list = g_list_alloc(); list->data = note; g_object_ref(note); ags_notation_free_selection(notation); /* replace */ g_rec_mutex_lock(notation_mutex); notation->selection = list; g_rec_mutex_unlock(notation_mutex); }else{ if(!ags_notation_is_note_selected(notation, note)){ /* add */ ags_notation_add_note(notation, note, TRUE); } } } } /** * ags_notation_remove_point_from_selection: * @notation: the #AgsNotation * @x: x offset * @y: y note tone * * Remove notes at position of selection. * * Since: 3.0.0 */ void ags_notation_remove_point_from_selection(AgsNotation *notation, guint x, guint y) { AgsNote *note; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find point */ note = ags_notation_find_point(notation, x, y, TRUE); if(note != NULL){ ags_note_unset_flags(note, AGS_NOTE_IS_SELECTED); /* remove note from selection */ g_rec_mutex_lock(notation_mutex); notation->selection = g_list_remove(notation->selection, note); g_object_unref(note); g_rec_mutex_unlock(notation_mutex); } } /** * ags_notation_add_region_to_selection: * @notation: the #AgsNotation * @x0: x start offset * @y0: y start tone * @x1: x end offset * @y1: y end tone * @replace_current_selection: if %TRUE selection is replaced * * Add note within region to selection. * * Since: 3.0.0 */ void ags_notation_add_region_to_selection(AgsNotation *notation, guint x0, guint y0, guint x1, guint y1, gboolean replace_current_selection) { AgsNote *note; GList *region, *list; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find region */ region = ags_notation_find_region(notation, x0, y0, x1, y1, FALSE); if(replace_current_selection){ ags_notation_free_selection(notation); list = region; while(list != NULL){ ags_note_set_flags(list->data, AGS_NOTE_IS_SELECTED); g_object_ref(list->data); list = list->next; } /* replace */ g_rec_mutex_lock(notation_mutex); notation->selection = region; g_rec_mutex_unlock(notation_mutex); }else{ list = region; while(list != NULL){ if(!ags_notation_is_note_selected(notation, list->data)){ /* add */ ags_notation_add_note(notation, list->data, TRUE); } list = list->next; } g_list_free(region); } } /** * ags_notation_remove_region_from_selection: * @notation: the #AgsNotation * @x0: x start offset * @y0: y start tone * @x1: x end offset * @y1: y end tone * * Remove note within region of selection. * * Since: 3.0.0 */ void ags_notation_remove_region_from_selection(AgsNotation *notation, guint x0, guint y0, guint x1, guint y1) { AgsNote *note; GList *region; GList *list; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* find region */ region = ags_notation_find_region(notation, x0, y0, x1, y1, TRUE); list = region; while(list != NULL){ ags_note_unset_flags(list->data, AGS_NOTE_IS_SELECTED); /* remove */ g_rec_mutex_lock(notation_mutex); notation->selection = g_list_remove(notation->selection, list->data); g_rec_mutex_unlock(notation_mutex); g_object_unref(list->data); /* iterate */ list = list->next; } g_list_free(region); } /** * ags_notation_add_all_to_selection: * @notation: the #AgsNotation * * Add all note to selection. * * Since: 3.0.0 */ void ags_notation_add_all_to_selection(AgsNotation *notation) { GList *list; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return; } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* select all */ g_rec_mutex_lock(notation_mutex); list = notation->note; while(list != NULL){ ags_notation_add_note(notation, list->data, TRUE); list = list->next; } g_rec_mutex_unlock(notation_mutex); } /** * ags_notation_copy_selection: * @notation: the #AgsNotation * * Copy selection to clipboard. * * Returns: (transfer none): the selection as XML. * * Since: 3.0.0 */ xmlNode* ags_notation_copy_selection(AgsNotation *notation) { AgsTimestamp *timestamp; xmlNode *notation_node, *current_note; xmlNode *timestamp_node; GList *selection; guint current_x0, current_x1, current_y; guint x_boundary, y_boundary; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(NULL); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* create root node */ g_rec_mutex_lock(notation_mutex); notation_node = xmlNewNode(NULL, BAD_CAST "notation"); xmlNewProp(notation_node, BAD_CAST "program", BAD_CAST "ags"); xmlNewProp(notation_node, BAD_CAST "type", BAD_CAST (AGS_NOTATION_CLIPBOARD_TYPE)); xmlNewProp(notation_node, BAD_CAST "version", BAD_CAST (AGS_NOTATION_CLIPBOARD_VERSION)); xmlNewProp(notation_node, BAD_CAST "format", BAD_CAST (AGS_NOTATION_CLIPBOARD_FORMAT)); xmlNewProp(notation_node, BAD_CAST "audio-channel", BAD_CAST (g_strdup_printf("%u", notation->audio_channel))); /* timestamp */ timestamp = notation->timestamp; if(timestamp != NULL){ timestamp_node = xmlNewNode(NULL, BAD_CAST "timestamp"); xmlAddChild(notation_node, timestamp_node); xmlNewProp(timestamp_node, BAD_CAST "offset", BAD_CAST (g_strdup_printf("%lu", ags_timestamp_get_ags_offset(timestamp)))); } /* selection */ selection = notation->selection; if(selection != NULL){ g_object_get(selection->data, "x0", ¤t_x0, NULL); x_boundary = current_x0; y_boundary = G_MAXUINT; }else{ x_boundary = 0; y_boundary = 0; } while(selection != NULL){ g_object_get(selection->data, "x0", ¤t_x0, "x1", ¤t_x1, "y", ¤t_y, NULL); current_note = xmlNewChild(notation_node, NULL, BAD_CAST "note", NULL); xmlNewProp(current_note, BAD_CAST "x", BAD_CAST (g_strdup_printf("%u", current_x0))); xmlNewProp(current_note, BAD_CAST "x1", BAD_CAST (g_strdup_printf("%u", current_x1))); xmlNewProp(current_note, BAD_CAST "y", BAD_CAST (g_strdup_printf("%u", current_y))); if(y_boundary > current_y){ y_boundary = current_y; } selection = selection->next; } g_rec_mutex_unlock(notation_mutex); xmlNewProp(notation_node, BAD_CAST "x_boundary", BAD_CAST (g_strdup_printf("%u", x_boundary))); xmlNewProp(notation_node, BAD_CAST "y_boundary", BAD_CAST (g_strdup_printf("%u", y_boundary))); return(notation_node); } /** * ags_notation_cut_selection: * @notation: the #AgsNotation * * Cut selection to clipboard. * * Returns: (transfer none): the selection as xmlNode * * Since: 3.0.0 */ xmlNode* ags_notation_cut_selection(AgsNotation *notation) { xmlNode *notation_node; GList *selection, *note; GRecMutex *notation_mutex; if(!AGS_IS_NOTATION(notation)){ return(NULL); } /* get notation mutex */ notation_mutex = AGS_NOTATION_GET_OBJ_MUTEX(notation); /* copy selection */ notation_node = ags_notation_copy_selection(notation); /* cut */ g_rec_mutex_lock(notation_mutex); selection = notation->selection; while(selection != NULL){ notation->note = g_list_remove(notation->note, selection->data); g_object_unref(selection->data); selection = selection->next; } g_rec_mutex_unlock(notation_mutex); /* free selection */ ags_notation_free_selection(notation); return(notation_node); } void ags_notation_insert_native_piano_from_clipboard_version_0_3_12(AgsNotation *notation, xmlNode *root_node, char *version, char *base_frequency, char *x_boundary, char *y_boundary, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset, gboolean match_channel, gboolean no_duplicates, guint current_audio_channel, gboolean match_timestamp) { AgsNote *note; AgsTimestamp *timestamp; xmlNode *node; char *x0, *x1, *y; gchar *offset; char *endptr; guint64 timestamp_offset; guint x_boundary_val, y_boundary_val; guint x0_val, x1_val, y_val; guint base_x_difference, base_y_difference; gboolean subtract_x, subtract_y; node = root_node->children; /* retrieve x values for resetting */ base_x_difference = 0; subtract_x = FALSE; if(reset_x_offset){ if(x_boundary != NULL){ errno = 0; x_boundary_val = strtoul(x_boundary, &endptr, 10); if(errno == ERANGE){ goto dont_reset_x_offset; } if(x_boundary == endptr){ goto dont_reset_x_offset; } if(x_boundary_val < x_offset){ base_x_difference = x_offset - x_boundary_val; subtract_x = FALSE; }else{ base_x_difference = x_boundary_val - x_offset; subtract_x = TRUE; } }else{ dont_reset_x_offset: reset_x_offset = FALSE; } } /* retrieve y values for resetting */ base_y_difference = 0; subtract_y = FALSE; if(reset_y_offset){ if(y_boundary != NULL){ errno = 0; y_boundary_val = strtoul(y_boundary, &endptr, 10); if(errno == ERANGE){ goto dont_reset_y_offset; } if(y_boundary == endptr){ goto dont_reset_y_offset; } if(y_boundary_val < y_offset){ base_y_difference = y_offset - y_boundary_val; subtract_y = FALSE; }else{ base_y_difference = y_boundary_val - y_offset; subtract_y = TRUE; } }else{ dont_reset_y_offset: reset_y_offset = FALSE; } } /* parse */ for(; node != NULL; ){ if(node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("note", node->name, 5)){ /* retrieve x0 offset */ x0 = xmlGetProp(node, "x"); if(x0 == NULL){ node = node->next; continue; } errno = 0; x0_val = strtoul(x0, &endptr, 10); if(errno == ERANGE){ node = node->next; continue; } if(x0 == endptr){ node = node->next; continue; } /* retrieve x1 offset */ x1 = xmlGetProp(node, "x1"); if(x1 == NULL){ node = node->next; continue; } errno = 0; x1_val = strtoul(x1, &endptr, 10); if(errno == ERANGE){ node = node->next; continue; } if(x1 == endptr){ node = node->next; continue; } /* retrieve y offset */ y = xmlGetProp(node, "y"); if(y == NULL){ node = node->next; continue; } errno = 0; y_val = strtoul(y, &endptr, 10); if(errno == ERANGE){ node = node->next; continue; } if(y == endptr){ node = node->next; continue; } /* switch x values if necessary */ if(x0_val > x1_val){ guint tmp; tmp = x0_val; x0_val = x1_val; x1_val = tmp; } /* calculate new offset */ if(reset_x_offset){ errno = 0; if(subtract_x){ x0_val -= base_x_difference; if(errno != 0){ node = node->next; continue; } x1_val -= base_x_difference; }else{ x0_val += base_x_difference; x1_val += base_x_difference; if(errno != 0){ node = node->next; continue; } } } if(reset_y_offset){ errno = 0; if(subtract_y){ y_val -= base_y_difference; }else{ y_val += base_y_difference; } if(errno != 0){ node = node->next; continue; } } /* check if max length wasn't exceeded */ if(x1_val - x0_val > notation->maximum_note_length){ node = node->next; continue; } /* check duplicate */ if(no_duplicates && ags_notation_find_point(notation, x0_val, y_val, FALSE) != NULL){ node = node->next; continue; } /* add note */ g_object_get(notation, "timestamp", ×tamp, NULL); timestamp_offset = ags_timestamp_get_ags_offset(timestamp); g_object_unref(timestamp); if(!match_timestamp || (x0_val >= timestamp_offset && x0_val < timestamp_offset + AGS_NOTATION_DEFAULT_OFFSET)){ note = ags_note_new(); note->x[0] = x0_val; note->x[1] = x1_val; note->y = y_val; #ifdef AGS_DEBUG g_message("adding note at: [%u,%u|%u]\n", x0_val, x1_val, y_val); #endif ags_notation_add_note(notation, note, FALSE); } } } node = node->next; } } /** * ags_notation_insert_native_piano_from_clipboard: * @notation: the #AgsNotation * @notation_node: the clipboard XML data * @version: clipboard version * @base_frequency: lowest frequency of notation * @x_boundary: region start offset * @y_boundary: region start tone * @reset_x_offset: if %TRUE @x_offset used as cursor * @x_offset: region start cursor offset * @reset_y_offset: if %TRUE @y_offset used as cursor * @y_offset: region start cursor tone * @match_channel: only paste if channel matches * @no_duplicates: only paste if current note doesn't exist * * Paste previously copied notes. * * Since: 3.0.0 */ void ags_notation_insert_native_piano_from_clipboard(AgsNotation *notation, xmlNode *root_node, char *version, char *base_frequency, char *x_boundary, char *y_boundary, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset, gboolean match_channel, gboolean no_duplicates) { guint current_audio_channel; gboolean match_timestamp; if(!AGS_IS_NOTATION(notation)){ return; } g_object_get(notation, "audio-channel", ¤t_audio_channel, NULL); match_timestamp = TRUE; if(!xmlStrncmp("0.3.12", version, 7)){ ags_notation_insert_native_piano_from_clipboard_version_0_3_12(notation, root_node, version, base_frequency, x_boundary, y_boundary, reset_x_offset, x_offset, reset_y_offset, y_offset, match_channel, no_duplicates, current_audio_channel, match_timestamp); }else if(!xmlStrncmp("0.4.2", version, 6)){ /* changes contain only for UI relevant new informations */ ags_notation_insert_native_piano_from_clipboard_version_0_3_12(notation, root_node, version, base_frequency, x_boundary, y_boundary, reset_x_offset, x_offset, reset_y_offset, y_offset, match_channel, no_duplicates, current_audio_channel, match_timestamp); }else if(!xmlStrncmp("1.2.0", version, 6)){ /* changes contain only optional informations */ match_timestamp = TRUE; if(match_channel && current_audio_channel != g_ascii_strtoull(xmlGetProp(root_node, "audio-channel"), NULL, 10)){ return; } ags_notation_insert_native_piano_from_clipboard_version_0_3_12(notation, root_node, version, base_frequency, x_boundary, y_boundary, reset_x_offset, x_offset, reset_y_offset, y_offset, match_channel, no_duplicates, current_audio_channel, match_timestamp); } } /** * ags_notation_insert_from_clipboard: * @notation: the #AgsNotation * @notation_node: the clipboard XML data * @reset_x_offset: if %TRUE @x_offset used as cursor * @x_offset: region start cursor offset * @reset_y_offset: if %TRUE @y_offset used as cursor * @y_offset: region start cursor tone * * Paste previously copied notes. * * Since: 3.0.0 */ void ags_notation_insert_from_clipboard(AgsNotation *notation, xmlNode *notation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset) { ags_notation_insert_from_clipboard_extended(notation, notation_node, reset_x_offset, x_offset, reset_y_offset, y_offset, FALSE, FALSE); } /** * ags_notation_insert_from_clipboard_extended: * @notation: the #AgsNotation * @notation_node: the clipboard XML data * @reset_x_offset: if %TRUE @x_offset used as cursor * @x_offset: region start cursor offset * @reset_y_offset: if %TRUE @y_offset used as cursor * @y_offset: region start cursor tone * @match_channel: only paste if channel matches * @no_duplicates: only paste if current note doesn't exist * * Paste previously copied notes. * * Since: 3.0.0 */ void ags_notation_insert_from_clipboard_extended(AgsNotation *notation, xmlNode *notation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, guint y_offset, gboolean match_channel, gboolean no_duplicates) { char *program, *version, *type, *format; char *base_frequency; char *x_boundary, *y_boundary; if(!AGS_IS_NOTATION(notation)){ return; } while(notation_node != NULL){ if(notation_node->type == XML_ELEMENT_NODE && !xmlStrncmp("notation", notation_node->name, 9)){ break; } notation_node = notation_node->next; } if(notation_node != NULL){ program = xmlGetProp(notation_node, "program"); if(!xmlStrncmp("ags", program, 4)){ version = xmlGetProp(notation_node, "version"); type = xmlGetProp(notation_node, "type"); format = xmlGetProp(notation_node, "format"); if(!xmlStrcmp(AGS_NOTATION_CLIPBOARD_FORMAT, format)){ base_frequency = xmlGetProp(notation_node, "base_frequency"); x_boundary = xmlGetProp(notation_node, "x_boundary"); y_boundary = xmlGetProp(notation_node, "y_boundary"); ags_notation_insert_native_piano_from_clipboard(notation, notation_node, version, base_frequency, x_boundary, y_boundary, reset_x_offset, x_offset, reset_y_offset, y_offset, match_channel, no_duplicates); } } } } /** * ags_notation_to_raw_midi: * @notation: the #AgsNotation * @bpm: the source bpm * @delay_factor: the source delay factor * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @buffer_length: the return location of buffer length * * Convert @notation to raw-midi. * * Returns: the raw-midi buffer * * Since: 3.0.0 */ guchar* ags_notation_to_raw_midi(AgsNotation *notation, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo, guint *buffer_length) { //TODO:JK: implement me return(NULL); } /** * ags_notation_from_raw_midi: * @raw_midi: the data array * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @buffer_length: the buffer length * * Parse @raw_midi data and convert to #AgsNotation. * * Returns: (transfer full): the #AgsNotation * * Since: 3.0.0 */ AgsNotation* ags_notation_from_raw_midi(guchar *raw_midi, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor, guint buffer_length) { //TODO:JK: implement me return(NULL); } /** * ags_notation_new: * @audio: the assigned #AgsAudio * @audio_channel: the audio channel to apply * * Creates a new instance of #AgsNotation. * * Returns: the new #AgsNotation * * Since: 3.0.0 */ AgsNotation* ags_notation_new(GObject *audio, guint audio_channel) { AgsNotation *notation; notation = (AgsNotation *) g_object_new(AGS_TYPE_NOTATION, "audio", audio, "audio-channel", audio_channel, NULL); return(notation); } gsequencer-3.1.3/ags/audio/ags_frequency_map_manager.c0000644000175000017500000003722113607210263020006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_frequency_map_manager_class_init(AgsFrequencyMapManagerClass *frequency_map_manager); void ags_frequency_map_manager_init (AgsFrequencyMapManager *frequency_map_manager); void ags_frequency_map_manager_dispose(GObject *gobject); void ags_frequency_map_manager_finalize(GObject *gobject); /** * SECTION:ags_frequency_map_manager * @short_description: frequency map manager * @title: AgsFrequencyMapManager * @section_id: * @include: ags/audio/ags_frequency_map_manager.h * * #AgsFrequencyMapManager is a singleton that organizes your frequency maps. */ static gpointer ags_frequency_map_manager_parent_class = NULL; AgsFrequencyMapManager *ags_frequency_map_manager = NULL; guint ags_frequency_map_manager_default_samplerate_count = 4; guint ags_frequency_map_manager_default_samplerate[] = { 44100, 48000, 96000, 192000, }; guint ags_frequency_map_manager_default_buffer_size_count = 6; guint ags_frequency_map_manager_default_buffer_size[] = { 128, 256, 512, 1024, 2048, 4096, }; GType ags_frequency_map_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_frequency_map_manager = 0; static const GTypeInfo ags_frequency_map_manager_info = { sizeof (AgsFrequencyMapManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_frequency_map_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFrequencyMapManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_frequency_map_manager_init, }; ags_type_frequency_map_manager = g_type_register_static(G_TYPE_OBJECT, "AgsFrequencyMapManager", &ags_frequency_map_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_frequency_map_manager); } return g_define_type_id__volatile; } void ags_frequency_map_manager_class_init(AgsFrequencyMapManagerClass *frequency_map_manager) { GObjectClass *gobject; ags_frequency_map_manager_parent_class = g_type_class_peek_parent(frequency_map_manager); /* GObjectClass */ gobject = (GObjectClass *) frequency_map_manager; gobject->dispose = ags_frequency_map_manager_dispose; gobject->finalize = ags_frequency_map_manager_finalize; } void ags_frequency_map_manager_init(AgsFrequencyMapManager *frequency_map_manager) { frequency_map_manager->flags = 0; /* frequency_map manager mutex */ g_rec_mutex_init(&(frequency_map_manager->obj_mutex)); /* frequency map */ frequency_map_manager->frequency_map = NULL; frequency_map_manager->factorized_frequency_map = NULL; } void ags_frequency_map_manager_dispose(GObject *gobject) { AgsFrequencyMapManager *frequency_map_manager; frequency_map_manager = AGS_FREQUENCY_MAP_MANAGER(gobject); /* frequency map */ if(frequency_map_manager->frequency_map != NULL){ g_list_free_full(frequency_map_manager->frequency_map, (GDestroyNotify) g_object_unref); frequency_map_manager->frequency_map = NULL; } /* factorized frequency map */ if(frequency_map_manager->factorized_frequency_map != NULL){ g_list_free_full(frequency_map_manager->factorized_frequency_map, (GDestroyNotify) g_object_unref); frequency_map_manager->factorized_frequency_map = NULL; } /* call parent */ G_OBJECT_CLASS(ags_frequency_map_manager_parent_class)->dispose(gobject); } void ags_frequency_map_manager_finalize(GObject *gobject) { AgsFrequencyMapManager *frequency_map_manager; frequency_map_manager = AGS_FREQUENCY_MAP_MANAGER(gobject); /* frequency map */ g_list_free_full(frequency_map_manager->frequency_map, (GDestroyNotify) g_object_unref); /* factorized frequency map */ g_list_free_full(frequency_map_manager->factorized_frequency_map, (GDestroyNotify) g_object_unref); /* singleton */ if(frequency_map_manager == ags_frequency_map_manager){ ags_frequency_map_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_frequency_map_manager_parent_class)->finalize(gobject); } /** * ags_frequency_map_manager_test_flags: * @frequency_map_manager: the #AgsFrequencyMapManager * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_frequency_map_manager_test_flags(AgsFrequencyMapManager *frequency_map_manager, guint flags) { gboolean retval; GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager)){ return(FALSE); } /* get base plugin mutex */ frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); /* test flags */ g_rec_mutex_lock(frequency_map_manager_mutex); retval = ((flags & (frequency_map_manager->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(frequency_map_manager_mutex); return(retval); } /** * ags_frequency_map_manager_set_flags: * @frequency_map_manager: the #AgsFrequencyMapManager * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_frequency_map_manager_set_flags(AgsFrequencyMapManager *frequency_map_manager, guint flags) { GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager)){ return; } /* get base plugin mutex */ frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); /* set flags */ g_rec_mutex_lock(frequency_map_manager_mutex); frequency_map_manager->flags |= flags; g_rec_mutex_unlock(frequency_map_manager_mutex); } /** * ags_frequency_map_manager_unset_flags: * @frequency_map_manager: the #AgsFrequencyMapManager * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_frequency_map_manager_unset_flags(AgsFrequencyMapManager *frequency_map_manager, guint flags) { GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager)){ return; } /* get base plugin mutex */ frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); /* unset flags */ g_rec_mutex_lock(frequency_map_manager_mutex); frequency_map_manager->flags &= (~flags); g_rec_mutex_unlock(frequency_map_manager_mutex); } /** * ags_frequency_map_manager_add_frequency_map: * @frequency_map_manager: the #AgsFrequencyMapManager * @frequency_map: the #AgsFrequencyMap * * Add @frequency_map to @frequency_map_manager. * * Since: 3.0.0 */ void ags_frequency_map_manager_add_frequency_map(AgsFrequencyMapManager *frequency_map_manager, AgsFrequencyMap *frequency_map) { GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager) || !AGS_IS_FREQUENCY_MAP(frequency_map)){ return; } frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); g_rec_mutex_lock(frequency_map_manager_mutex); if(g_list_find(frequency_map_manager->frequency_map, frequency_map) == NULL){ g_object_ref(frequency_map); frequency_map_manager->frequency_map = g_list_insert_sorted(frequency_map_manager->frequency_map, frequency_map, (GCompareFunc) ags_frequency_map_sort_func); } g_rec_mutex_unlock(frequency_map_manager_mutex); } /** * ags_frequency_map_manager_add_factorized_frequency_map: * @frequency_map_manager: the #AgsFrequencyMapManager * @frequency_map: the #AgsFrequencyMap * * Add @frequency_map to @frequency_map_manager. * * Since: 3.0.0 */ void ags_frequency_map_manager_add_factorized_frequency_map(AgsFrequencyMapManager *frequency_map_manager, AgsFrequencyMap *frequency_map) { GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager) || !AGS_IS_FREQUENCY_MAP(frequency_map)){ return; } frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); g_rec_mutex_lock(frequency_map_manager_mutex); if(g_list_find(frequency_map_manager->factorized_frequency_map, frequency_map) == NULL){ g_object_ref(frequency_map); frequency_map_manager->factorized_frequency_map = g_list_prepend(frequency_map_manager->factorized_frequency_map, frequency_map); } g_rec_mutex_unlock(frequency_map_manager_mutex); } /** * ags_frequency_map_manager_find_frequency_map: * @frequency_map_manager: the #AgsFrequencyMapManager * @samplerate: the samplerate to match * @buffer_size: the buffer size to match * @freq: the frequency to match * * Find #AgsFrequencyMap by @samplerate, @buffer_size and @freq. * * Returns: (transfer full): the matching #AgsFrequencyMap if found, otherwise %NULL * * Since: 3.0.0 */ AgsFrequencyMap* ags_frequency_map_manager_find_frequency_map(AgsFrequencyMapManager *frequency_map_manager, guint samplerate, guint buffer_size, gdouble freq) { AgsFrequencyMap *frequency_map; GList *start_list, *list; GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager)){ return(NULL); } frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); g_rec_mutex_lock(frequency_map_manager_mutex); list = start_list = g_list_copy_deep(frequency_map_manager->frequency_map, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(frequency_map_manager_mutex); frequency_map = NULL; while(list != NULL){ guint current_samplerate; guint current_buffer_size; gdouble current_freq; g_object_get(list->data, "samplerate", ¤t_samplerate, "buffer-size", ¤t_buffer_size, NULL); if(current_samplerate != samplerate){ list = g_list_nth(list, current_buffer_size); continue; } if(current_buffer_size != buffer_size){ list = g_list_nth(list, current_buffer_size); continue; } g_object_get(list->data, "freq", ¤t_freq, NULL); if(current_freq == freq){ frequency_map = list->data; g_object_ref(frequency_map); break; } list = list->next; } g_list_free_full(start_list, g_object_unref); return(frequency_map); } /** * ags_frequency_map_manager_find_factorized_frequency_map: * @frequency_map_manager: the #AgsFrequencyMapManager * @samplerate: the samplerate to match * @buffer_size: the buffer size to match * * Find #AgsFrequencyMap by @samplerate and @buffer_size. * * Returns: (transfer full): the matching #AgsFrequencyMap if found, otherwise %NULL * * Since: 3.0.0 */ AgsFrequencyMap* ags_frequency_map_manager_find_factorized_frequency_map(AgsFrequencyMapManager *frequency_map_manager, guint samplerate, guint buffer_size) { AgsFrequencyMap *frequency_map; GList *start_list, *list; GRecMutex *frequency_map_manager_mutex; if(!AGS_IS_FREQUENCY_MAP_MANAGER(frequency_map_manager)){ return(NULL); } frequency_map_manager_mutex = AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(frequency_map_manager); g_rec_mutex_lock(frequency_map_manager_mutex); list = start_list = g_list_copy_deep(frequency_map_manager->frequency_map, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(frequency_map_manager_mutex); frequency_map = NULL; while(list != NULL){ guint current_samplerate; guint current_buffer_size; g_object_get(list->data, "samplerate", ¤t_samplerate, "buffer-size", ¤t_buffer_size, NULL); if(current_samplerate == samplerate && current_buffer_size == buffer_size){ frequency_map = list->data; g_object_ref(frequency_map); break; } list = list->next; } g_list_free_full(start_list, g_object_unref); return(frequency_map); } /** * ags_frequency_map_manager_load_default: * @frequency_map_manager: the #AgsFrequencyMapManager * * Load default #AgsFrequencyMap. * * Since: 3.0.0 */ void ags_frequency_map_manager_load_default(AgsFrequencyMapManager *frequency_map_manager) { guint samplerate; guint buffer_size; guint i_stop, j_stop, k_stop; guint i, j, k; i_stop = ags_frequency_map_manager_default_samplerate_count; j_stop = ags_frequency_map_manager_default_buffer_size_count; for(i = 0; i < i_stop; i++){ samplerate = ags_frequency_map_manager_default_samplerate[i]; for(j = 0; j < j_stop; j++){ AgsFrequencyMap *factorized_frequency_map; buffer_size = ags_frequency_map_manager_default_buffer_size[j]; factorized_frequency_map = (AgsFrequencyMap *) g_object_new(AGS_TYPE_FREQUENCY_MAP, "z-index", 0, "window-count", buffer_size, "samplerate", samplerate, "buffer-size", buffer_size, "freq", -1.0, "frame-count", buffer_size, "attack", 0, NULL); ags_frequency_map_manager_add_factorized_frequency_map(frequency_map_manager, factorized_frequency_map); k_stop = buffer_size; for(k = 0; k < k_stop; k++){ static const complex z = 1.0 + I * 0.0; ags_complex_set(&(factorized_frequency_map->buffer[k]), z); } for(k = 0; k < k_stop; k++){ AgsFrequencyMap *frequency_map; gdouble freq; guint frame_count; guint attack; freq = (gdouble) AGS_FREQUENCY_MAP_MANAGER_EQUINOX * ((gdouble) k / (gdouble) buffer_size); frame_count = buffer_size / 2; attack = k; frequency_map = (AgsFrequencyMap *) g_object_new(AGS_TYPE_FREQUENCY_MAP, "z-index", k, "window-count", buffer_size, "samplerate", samplerate, "buffer-size", buffer_size, "freq", freq, "frame-count", frame_count, "attack", attack, NULL); ags_frequency_map_process(frequency_map); ags_frequency_map_factorize(frequency_map, factorized_frequency_map); if(ags_frequency_map_manager_test_flags(frequency_map_manager, AGS_FREQUENCY_MAP_MANAGER_PRESERVE_FREQUENCY_MAP)){ ags_frequency_map_manager_add_frequency_map(frequency_map_manager, frequency_map); }else{ g_object_unref(frequency_map); } } } } } /** * ags_frequency_map_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsFrequencyMapManager * * Since: 3.0.0 */ AgsFrequencyMapManager* ags_frequency_map_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_frequency_map_manager == NULL){ ags_frequency_map_manager = ags_frequency_map_manager_new(); } g_mutex_unlock(&mutex); return(ags_frequency_map_manager); } /** * ags_frequency_map_manager_new: * * Create a new instance of #AgsFrequencyMapManager * * Returns: the new #AgsFrequencyMapManager * * Since: 3.0.0 */ AgsFrequencyMapManager* ags_frequency_map_manager_new() { AgsFrequencyMapManager *frequency_map_manager; frequency_map_manager = (AgsFrequencyMapManager *) g_object_new(AGS_TYPE_FREQUENCY_MAP_MANAGER, NULL); return(frequency_map_manager); } gsequencer-3.1.3/ags/audio/ags_recall_audio_run.h0000644000175000017500000000500213616617253016774 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_AUDIO_RUN_H__ #define __AGS_RECALL_AUDIO_RUN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_AUDIO_RUN (ags_recall_audio_run_get_type()) #define AGS_RECALL_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_AUDIO_RUN, AgsRecallAudioRun)) #define AGS_RECALL_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_AUDIO_RUN, AgsRecallAudioRunClass)) #define AGS_IS_RECALL_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_AUDIO_RUN)) #define AGS_IS_RECALL_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_AUDIO_RUN)) #define AGS_RECALL_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_AUDIO_RUN, AgsRecallAudioRunClass)) typedef struct _AgsRecallAudioRun AgsRecallAudioRun; typedef struct _AgsRecallAudioRunClass AgsRecallAudioRunClass; struct _AgsRecallAudioRun { AgsRecall recall; AgsAudio *audio; AgsRecallAudio *recall_audio; }; struct _AgsRecallAudioRunClass { AgsRecallClass recall; }; GType ags_recall_audio_run_get_type(); AgsAudio* ags_recall_audio_run_get_audio(AgsRecallAudioRun *recall_audio_run); void ags_recall_audio_run_set_audio(AgsRecallAudioRun *recall_audio_run, AgsAudio *audio); AgsRecallAudio* ags_recall_audio_run_get_recall_audio(AgsRecallAudioRun *recall_audio_run); void ags_recall_audio_run_set_recall_audio(AgsRecallAudioRun *recall_audio_run, AgsRecallAudio *recall_audio); AgsRecallAudioRun* ags_recall_audio_run_new(); G_END_DECLS #endif /*__AGS_RECALL_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/ags_pattern.c0000644000175000017500000007526413616617253015156 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_pattern_class_init(AgsPatternClass *pattern_class); void ags_pattern_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pattern_tactable_interface_init(AgsTactableInterface *tactable); void ags_pattern_init(AgsPattern *pattern); void ags_pattern_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pattern_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pattern_dispose(GObject *gobject); void ags_pattern_finalize(GObject *gobject); AgsUUID* ags_pattern_get_uuid(AgsConnectable *connectable); gboolean ags_pattern_has_resource(AgsConnectable *connectable); gboolean ags_pattern_is_ready(AgsConnectable *connectable); void ags_pattern_add_to_registry(AgsConnectable *connectable); void ags_pattern_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_pattern_list_resource(AgsConnectable *connectable); xmlNode* ags_pattern_xml_compose(AgsConnectable *connectable); void ags_pattern_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_pattern_is_connected(AgsConnectable *connectable); void ags_pattern_connect(AgsConnectable *connectable); void ags_pattern_disconnect(AgsConnectable *connectable); void ags_pattern_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm); /** * SECTION:ags_pattern * @short_description: Pattern representing tones * @title: AgsPattern * @section_id: * @include: ags/audio/ags_pattern.h * * #AgsPattern represents an audio pattern of tones. */ enum{ PROP_0, PROP_PORT, PROP_FIRST_INDEX, PROP_SECOND_INDEX, PROP_OFFSET, PROP_CURRENT_BIT, PROP_TIMESTAMP, }; static gpointer ags_pattern_parent_class = NULL; GType ags_pattern_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pattern = 0; static const GTypeInfo ags_pattern_info = { sizeof (AgsPatternClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pattern_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPattern), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pattern_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pattern_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_tactable_interface_info = { (GInterfaceInitFunc) ags_pattern_tactable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pattern = g_type_register_static(G_TYPE_OBJECT, "AgsPattern", &ags_pattern_info, 0); g_type_add_interface_static(ags_type_pattern, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_pattern, AGS_TYPE_TACTABLE, &ags_tactable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pattern); } return g_define_type_id__volatile; } void ags_pattern_class_init(AgsPatternClass *pattern) { GObjectClass *gobject; GParamSpec *param_spec; ags_pattern_parent_class = g_type_class_peek_parent(pattern); gobject = (GObjectClass *) pattern; gobject->set_property = ags_pattern_set_property; gobject->get_property = ags_pattern_get_property; gobject->dispose = ags_pattern_dispose; gobject->finalize = ags_pattern_finalize; /* properties */ /** * AgsPattern:port: * * The pattern's port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("port", "port of pattern", "The port of pattern", AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); /** * AgsPattern:first-index: * * Selected bank 0. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("first-index", "the first index", "The first index to select pattern", 0, 256, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIRST_INDEX, param_spec); /** * AgsPattern:second-index: * * Selected bank 1. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("second-index", "the second index", "The second index to select pattern", 0, 256, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SECOND_INDEX, param_spec); /** * AgsPattern:offset: * * Position of pattern. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("offset", "the offset", "The offset within the pattern", 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OFFSET, param_spec); /** * AgsPattern:current-bit: * * Offset of current position. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("current-bit", "current bit for offset", "The current bit for offset", FALSE, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_CURRENT_BIT, param_spec); /** * AgsPattern:timestamp: * * The pattern's timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", "timestamp of pattern", "The timestamp of pattern", AGS_TYPE_TIMESTAMP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); } void ags_pattern_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_pattern_get_uuid; connectable->has_resource = ags_pattern_has_resource; connectable->is_ready = ags_pattern_is_ready; connectable->add_to_registry = ags_pattern_add_to_registry; connectable->remove_from_registry = ags_pattern_remove_from_registry; connectable->list_resource = ags_pattern_list_resource; connectable->xml_compose = ags_pattern_xml_compose; connectable->xml_parse = ags_pattern_xml_parse; connectable->is_connected = ags_pattern_is_connected; connectable->connect = ags_pattern_connect; connectable->disconnect = ags_pattern_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_pattern_tactable_interface_init(AgsTactableInterface *tactable) { tactable->change_bpm = ags_pattern_change_bpm; } void ags_pattern_init(AgsPattern *pattern) { /* base initialization */ pattern->flags = 0; /* pattern mutex */ g_rec_mutex_init(&(pattern->obj_mutex)); /* timestamp */ pattern->timestamp = NULL; /* dimension and pattern */ pattern->dim[0] = 0; pattern->dim[1] = 0; pattern->dim[2] = 0; pattern->pattern = NULL; /* port */ pattern->port = NULL; /* indices */ pattern->i = 0; pattern->j = 0; pattern->bit = 0; } void ags_pattern_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPattern *pattern; GRecMutex *pattern_mutex; pattern = AGS_PATTERN(gobject); /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); switch(prop_id){ case PROP_FIRST_INDEX: { guint i; i = g_value_get_uint(value); g_rec_mutex_lock(pattern_mutex); pattern->i = i; g_rec_mutex_unlock(pattern_mutex); } break; case PROP_SECOND_INDEX: { guint j; j = g_value_get_uint(value); g_rec_mutex_lock(pattern_mutex); pattern->j = j; g_rec_mutex_unlock(pattern_mutex); } break; case PROP_OFFSET: { guint bit; bit = g_value_get_uint(value); g_rec_mutex_lock(pattern_mutex); pattern->bit = bit; g_rec_mutex_unlock(pattern_mutex); } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_value_get_object(value); g_rec_mutex_lock(pattern_mutex); if(timestamp == pattern->timestamp){ g_rec_mutex_unlock(pattern_mutex); return; } if(pattern->timestamp != NULL){ g_object_unref(G_OBJECT(pattern->timestamp)); } if(timestamp != NULL){ g_object_ref(G_OBJECT(timestamp)); } pattern->timestamp = timestamp; g_rec_mutex_unlock(pattern_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pattern_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPattern *pattern; GRecMutex *pattern_mutex; pattern = AGS_PATTERN(gobject); /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); switch(prop_id){ case PROP_PORT: { g_rec_mutex_lock(pattern_mutex); g_value_set_object(value, pattern->port); g_rec_mutex_unlock(pattern_mutex); } break; case PROP_FIRST_INDEX: { g_rec_mutex_lock(pattern_mutex); g_value_set_uint(value, pattern->i); g_rec_mutex_unlock(pattern_mutex); } break; case PROP_SECOND_INDEX: { g_rec_mutex_lock(pattern_mutex); g_value_set_uint(value, pattern->j); g_rec_mutex_unlock(pattern_mutex); } break; case PROP_OFFSET: { g_rec_mutex_lock(pattern_mutex); g_value_set_uint(value, pattern->bit); g_rec_mutex_unlock(pattern_mutex); } break; case PROP_CURRENT_BIT: { guint i, j; guint bit; g_rec_mutex_lock(pattern_mutex); i = pattern->i; j = pattern->j; bit = pattern->bit; g_rec_mutex_unlock(pattern_mutex); g_value_set_boolean(value, ags_pattern_get_bit(pattern, i, j, bit)); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(pattern_mutex); g_value_set_object(value, pattern->timestamp); g_rec_mutex_unlock(pattern_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pattern_dispose(GObject *gobject) { AgsPattern *pattern; pattern = AGS_PATTERN(gobject); /* timestamp */ if(pattern->timestamp != NULL){ g_object_run_dispose(G_OBJECT(pattern->timestamp)); g_object_unref(G_OBJECT(pattern->timestamp)); } /* port */ if(pattern->port != NULL){ g_object_unref(G_OBJECT(pattern->port)); pattern->port = NULL; } /* call parent */ G_OBJECT_CLASS(ags_pattern_parent_class)->dispose(gobject); } void ags_pattern_finalize(GObject *gobject) { AgsPattern *pattern; guint i, j; pattern = AGS_PATTERN(gobject); /* timestamp */ if(pattern->timestamp != NULL){ g_object_unref(G_OBJECT(pattern->timestamp)); } /* pattern */ if(pattern->pattern != NULL){ for(i = 0; i < pattern->dim[0]; i++){ if(pattern->pattern[i] != NULL){ for(j = 0; j < pattern->dim[1]; j++){ if(pattern->pattern[i][j] != NULL){ free(pattern->pattern[i][j]); } } free(pattern->pattern[i]); } } free(pattern->pattern); } /* port */ if(pattern->port != NULL){ g_object_unref(G_OBJECT(pattern->port)); } /* call parent */ G_OBJECT_CLASS(ags_pattern_parent_class)->finalize(gobject); } AgsUUID* ags_pattern_get_uuid(AgsConnectable *connectable) { AgsPattern *pattern; AgsUUID *ptr; GRecMutex *pattern_mutex; pattern = AGS_PATTERN(connectable); /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* get UUID */ g_rec_mutex_lock(pattern_mutex); ptr = pattern->uuid; g_rec_mutex_unlock(pattern_mutex); return(ptr); } gboolean ags_pattern_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_pattern_is_ready(AgsConnectable *connectable) { AgsPattern *pattern; gboolean is_ready; pattern = AGS_PATTERN(connectable); /* check is added */ is_ready = ags_pattern_test_flags(pattern, AGS_PATTERN_ADDED_TO_REGISTRY); return(is_ready); } void ags_pattern_add_to_registry(AgsConnectable *connectable) { AgsPattern *pattern; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *list; if(ags_connectable_is_ready(connectable)){ return; } pattern = AGS_PATTERN(connectable); ags_pattern_set_flags(pattern, AGS_PATTERN_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) pattern); ags_registry_add_entry(registry, entry); } //TODO:JK: implement me } void ags_pattern_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_pattern_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_pattern_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_pattern_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_pattern_is_connected(AgsConnectable *connectable) { AgsPattern *pattern; gboolean is_connected; pattern = AGS_PATTERN(connectable); /* check is connected */ is_connected = ags_pattern_test_flags(pattern, AGS_PATTERN_CONNECTED); return(is_connected); } void ags_pattern_connect(AgsConnectable *connectable) { AgsPattern *pattern; GList *list_start, *list; GRecMutex *pattern_mutex; if(ags_connectable_is_connected(connectable)){ return; } pattern = AGS_PATTERN(connectable); ags_pattern_set_flags(pattern, AGS_PATTERN_CONNECTED); } void ags_pattern_disconnect(AgsConnectable *connectable) { AgsPattern *pattern; GList *list_start, *list; GRecMutex *pattern_mutex; if(!ags_connectable_is_connected(connectable)){ return; } pattern = AGS_PATTERN(connectable); ags_pattern_unset_flags(pattern, AGS_PATTERN_CONNECTED); } /** * ags_pattern_get_obj_mutex: * @pattern: the #AgsPattern * * Get object mutex. * * Returns: the #GRecMutex to lock @pattern * * Since: 3.1.0 */ GRecMutex* ags_pattern_get_obj_mutex(AgsPattern *pattern) { if(!AGS_IS_PATTERN(pattern)){ return(NULL); } return(AGS_PATTERN_GET_OBJ_MUTEX(pattern)); } /** * ags_pattern_test_flags: * @pattern: the #AgsPattern * @flags: the flags * * Test @flags to be set on @pattern. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_pattern_test_flags(AgsPattern *pattern, guint flags) { gboolean retval; GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return(FALSE); } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* test */ g_rec_mutex_lock(pattern_mutex); retval = (flags & (pattern->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(pattern_mutex); return(retval); } /** * ags_pattern_set_flags: * @pattern: the #AgsPattern * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_pattern_set_flags(AgsPattern *pattern, guint flags) { GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return; } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* set flags */ g_rec_mutex_lock(pattern_mutex); pattern->flags |= flags; g_rec_mutex_unlock(pattern_mutex); } /** * ags_pattern_unset_flags: * @pattern: the #AgsPattern * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_pattern_unset_flags(AgsPattern *pattern, guint flags) { GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return; } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* set flags */ g_rec_mutex_lock(pattern_mutex); pattern->flags &= (~flags); g_rec_mutex_unlock(pattern_mutex); } void ags_pattern_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm) { //TODO:JK: implement me } /** * ags_pattern_find_near_timestamp: * @pattern: (element-type AgsAudio.Pattern) (transfer none): the #GList-struct containing #AgsPattern * @timestamp: the matching #AgsTimestamp * * Retrieve appropriate pattern for timestamp. * * Returns: (element-type AgsAudio.Pattern) (transfer none): Next match. * * Since: 3.0.0 */ GList* ags_pattern_find_near_timestamp(GList *pattern, AgsTimestamp *timestamp) { AgsTimestamp *current_timestamp; GList *retval; GList *current_start, *current_end, *current; guint64 current_x, x; guint length, position; gboolean use_ags_offset; gboolean success; if(pattern == NULL){ return(NULL); } current_start = pattern; current_end = g_list_last(pattern); length = g_list_length(pattern); position = length / 2; current = g_list_nth(current_start, position); if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_OFFSET)){ x = ags_timestamp_get_ags_offset(timestamp); use_ags_offset = TRUE; }else if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_UNIX)){ x = ags_timestamp_get_unix_time(timestamp); use_ags_offset = FALSE; }else{ return(NULL); } retval = NULL; success = FALSE; while(!success && current != NULL){ current_x = 0; /* check current - start */ if(timestamp == NULL){ retval = current_start; break; } g_object_get(current_start->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_PATTERN_DEFAULT_OFFSET){ retval = current_start; break; } }else{ if(current_x >= x && current_x < x + AGS_PATTERN_DEFAULT_DURATION){ retval = current_start; break; } } }else{ g_warning("inconsistent data"); } /* check current - end */ if(timestamp == NULL){ retval = current_end; break; } g_object_get(current_end->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_PATTERN_DEFAULT_OFFSET){ retval = current_end; break; } }else{ if(current_x >= x && current_x < x + AGS_PATTERN_DEFAULT_DURATION){ retval = current_end; break; } } }else{ g_warning("inconsistent data"); } /* check current - center */ if(timestamp == NULL){ retval = current; break; } g_object_get(current->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_PATTERN_DEFAULT_OFFSET){ retval = current; break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_PATTERN_DEFAULT_DURATION){ retval = current; break; } } }else{ g_warning("inconsistent data"); } if(position == 0){ break; } position = position / 2; if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else{ current_start = current_start->next; current_end = current->prev; } current = g_list_nth(current_start, position); } return(retval); } /** * ags_pattern_get_channel: * @pattern: the #AgsPattern * * Get channel. * * Returns: (transfer full): the #AgsChannel * * Since: 3.1.0 */ GObject* ags_pattern_get_channel(AgsPattern *pattern) { GObject *channel; if(!AGS_IS_PATTERN(pattern)){ return(NULL); } g_object_get(pattern, "channel", &channel, NULL); return(channel); } /** * ags_pattern_set_channel: * @pattern: the #AgsPattern * @channel: the #AgsChannel * * Set channel. * * Since: 3.1.0 */ void ags_pattern_set_channel(AgsPattern *pattern, GObject *channel) { if(!AGS_IS_PATTERN(pattern)){ return; } g_object_set(pattern, "channel", channel, NULL); } /** * ags_pattern_get_timestamp: * @pattern: the #AgsPattern * * Get timestamp. * * Returns: (transfer full): the #AgsTimestamp * * Since: 3.1.0 */ AgsTimestamp* ags_pattern_get_timestamp(AgsPattern *pattern) { AgsTimestamp *timestamp; if(!AGS_IS_PATTERN(pattern)){ return(NULL); } g_object_get(pattern, "timestamp", ×tamp, NULL); return(timestamp); } /** * ags_pattern_set_timestamp: * @pattern: the #AgsPattern * @timestamp: the #AgsTimestamp * * Set timestamp. * * Since: 3.1.0 */ void ags_pattern_set_timestamp(AgsPattern *pattern, AgsTimestamp *timestamp) { if(!AGS_IS_PATTERN(pattern)){ return; } g_object_set(pattern, "timestamp", timestamp, NULL); } /** * ags_pattern_get_dim: * @pattern: an #AgsPattern * @dim0: (out): bank 0 size * @dim1: (out): bank 1 size * @length: (out): amount of beats * * Get the pattern's dimensions. * * Since: 3.1.0 */ void ags_pattern_get_dim(AgsPattern *pattern, guint *dim0, guint *dim1, guint *length) { GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return; } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* get dim */ g_rec_mutex_lock(pattern_mutex); if(dim0 != NULL){ dim0[0] = pattern->dim[0]; } if(dim1 != NULL){ dim1[0] = pattern->dim[1]; } if(length != NULL){ length[0] = pattern->dim[2]; } g_rec_mutex_unlock(pattern_mutex); } /** * ags_pattern_set_dim: * @pattern: an #AgsPattern * @dim0: bank 0 size * @dim1: bank 1 size * @length: amount of beats * * Reallocates the pattern's dimensions. * * Since: 3.0.0 */ void ags_pattern_set_dim(AgsPattern *pattern, guint dim0, guint dim1, guint length) { guint ***index0, **index1, *bitmap; guint i, j, k, j_set, k_set; guint bitmap_size; GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return; } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* set dim */ g_rec_mutex_lock(pattern_mutex); if(dim0 == 0 && pattern->pattern == NULL){ g_rec_mutex_unlock(pattern_mutex); return; } // shrink if(pattern->dim[0] > dim0){ for(i = dim0; i < pattern->dim[0]; i++){ for(j = 0; j < pattern->dim[1]; j++){ free(pattern->pattern[i][j]); } free(pattern->pattern[i]); pattern->pattern[i] = NULL; } if(dim0 == 0){ free(pattern->pattern); pattern->pattern = NULL; pattern->dim[0] = 0; g_rec_mutex_unlock(pattern_mutex); return; }else{ pattern->pattern = (guint ***) realloc(pattern->pattern, (int) dim0 * sizeof(guint **)); pattern->dim[0] = dim0; } } if(pattern->dim[1] > dim1){ if(dim1 == 0){ for(i = 0; i < pattern->dim[0]; i++){ for(j = dim1; j < pattern->dim[1]; j++){ free(pattern->pattern[i][j]); } pattern->pattern[i] = NULL; } pattern->dim[1] = 0; g_rec_mutex_unlock(pattern_mutex); return; }else{ for(i = 0; i < pattern->dim[0]; i++){ for(j = dim1; j < pattern->dim[1]; j++){ free(pattern->pattern[i][j]); } } for(i = 0; pattern->dim[0]; i++){ pattern->pattern[i] = (guint **) realloc(pattern->pattern[i], dim1 * sizeof(guint *)); } pattern->dim[1] = dim1; } } if(pattern->dim[2] > length){ if(length == 0){ for(i = 0; i < pattern->dim[0]; i++){ for(j = 0; j < pattern->dim[1]; j++){ free(pattern->pattern[i][j]); pattern->pattern[i][j] = NULL; } } pattern->dim[2] = 0; }else{ for(i = 0; i < pattern->dim[0]; i++){ for(j = 0; j < pattern->dim[1]; j++){ pattern->pattern[i][j] = (guint *) realloc(pattern->pattern[i][j], (guint) ceil((double) length / (double) (sizeof(guint) * 8)) * sizeof(guint)); } } pattern->dim[2] = length; } } // grow bitmap_size = (guint) ceil((double) pattern->dim[2] / (double) (sizeof(guint) * 8)) * sizeof(guint); if(pattern->dim[0] < dim0){ if(pattern->pattern == NULL){ pattern->pattern = (guint ***) malloc(dim0 * sizeof(guint **)); }else{ pattern->pattern = (guint ***) realloc(pattern->pattern, dim0 * sizeof(guint **)); } for(i = pattern->dim[0]; i < dim0; i++){ pattern->pattern[i] = (guint **) malloc(pattern->dim[1] * sizeof(guint *)); for(j = 0; j < pattern->dim[1]; j++){ if(bitmap_size == 0){ pattern->pattern[i][j] = NULL; }else{ pattern->pattern[i][j] = (guint *) malloc(bitmap_size); memset(pattern->pattern[i][j], 0, bitmap_size); } } } pattern->dim[0] = dim0; } if(pattern->dim[1] < dim1){ for(i = 0; i < pattern->dim[0]; i++){ if(pattern->pattern[i] == NULL){ pattern->pattern[i] = (guint **) malloc(dim1 * sizeof(guint *)); }else{ pattern->pattern[i] = (guint **) realloc(pattern->pattern[i], dim1 * sizeof(guint *)); } for(j = pattern->dim[1]; j < dim1; j++){ if(bitmap_size == 0){ pattern->pattern[i][j] = NULL; }else{ pattern->pattern[i][j] = (guint *) malloc(bitmap_size); memset(pattern->pattern[i][j], 0, bitmap_size); } } } pattern->dim[1] = dim1; } if(pattern->dim[2] < length){ guint new_bitmap_size; new_bitmap_size = (guint) ceil((double) length / (double) (sizeof(guint) * 8)) * sizeof(guint); for(i = 0; i < pattern->dim[0]; i++){ for(j = 0; j < pattern->dim[1]; j++){ if(pattern->pattern[i][j] == NULL){ pattern->pattern[i][j] = (guint *) malloc(new_bitmap_size); memset(pattern->pattern[i][j], 0, new_bitmap_size); }else{ pattern->pattern[i][j] =(guint *) realloc(pattern->pattern[i][j], new_bitmap_size); memset(pattern->pattern[i][j] + bitmap_size, 0, new_bitmap_size - bitmap_size); } } } pattern->dim[2] = length; } g_rec_mutex_unlock(pattern_mutex); } gboolean ags_pattern_is_empty(AgsPattern *pattern, guint i, guint j) { guint bitmap_length; guint n; GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return(TRUE); } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); if(!(i < pattern->dim[0] || j < pattern->dim[1])){ g_rec_mutex_unlock(pattern_mutex); return(FALSE); } /* check */ g_rec_mutex_lock(pattern_mutex); bitmap_length = (guint) ceil((double) pattern->dim[2] / (double) (sizeof(guint) * 8)); for(n = 0; n < bitmap_length; n++){ if(pattern->pattern[i][j][n] != 0){ g_rec_mutex_unlock(pattern_mutex); return(FALSE); } } g_rec_mutex_unlock(pattern_mutex); return(TRUE); } /** * ags_pattern_get_bit: * @pattern: an #AgsPattern * @i: bank index 0 * @j: bank index 1 * @bit: the tic to check * * Check for tic to be played. * * Returns: %TRUE if tone is enabled. * * Since: 3.0.0 */ gboolean ags_pattern_get_bit(AgsPattern *pattern, guint i, guint j, guint bit) { guint k, value; GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return(FALSE); } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* get bit */ g_rec_mutex_lock(pattern_mutex); if(!(i < pattern->dim[0] || j < pattern->dim[1] || bit < pattern->dim[2])){ g_rec_mutex_unlock(pattern_mutex); return(FALSE); } k = (guint) floor((double) bit / (double) (sizeof(guint) * 8)); value = 1 << (bit % (sizeof(guint) * 8)); #ifdef AGS_DEBUG g_message("i,j,bit = %d,%d,%d", i, j, bit); g_message("k = %d; value = %x", k, value); #endif //((1 << (bit % (sizeof(guint) *8))) & (pattern->pattern[i][j][(guint) floor((double) bit / (double) (sizeof(guint) * 8))])) != 0 if((value & (pattern->pattern[i][j][k])) != 0){ g_rec_mutex_unlock(pattern_mutex); return(TRUE); }else{ g_rec_mutex_unlock(pattern_mutex); return(FALSE); } } /** * ags_pattern_toggle_bit: * @pattern: an #AgsPattern * @i: bank index 0 * @j: bank index 1 * @bit: the tic to toggle * * Toggle tone. * * Since: 3.0.0 */ void ags_pattern_toggle_bit(AgsPattern *pattern, guint i, guint j, guint bit) { guint k, value; GRecMutex *pattern_mutex; if(!AGS_IS_PATTERN(pattern)){ return; } /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* toggle */ g_rec_mutex_lock(pattern_mutex); if(!(i < pattern->dim[0] || j < pattern->dim[1] || bit < pattern->dim[2])){ g_rec_mutex_unlock(pattern_mutex); return; } k = (guint) floor((double) bit / (double) (sizeof(guint) * 8)); value = 1 << (bit % (sizeof(guint) * 8)); if((value & (pattern->pattern[i][j][k])) != 0){ pattern->pattern[i][j][k] &= (~value); }else{ pattern->pattern[i][j][k] |= value; } g_rec_mutex_unlock(pattern_mutex); } /** * ags_pattern_new: * * Creates a new instance of #AgsPattern * * Returns: the new #AgsPattern * * Since: 3.0.0 */ AgsPattern* ags_pattern_new() { AgsPattern *pattern; pattern = (AgsPattern *) g_object_new(AGS_TYPE_PATTERN, NULL); return(pattern); } gsequencer-3.1.3/ags/audio/ags_devout.h0000644000175000017500000001320113607210263014761 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DEVOUT_H__ #define __AGS_DEVOUT_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DEVOUT (ags_devout_get_type()) #define AGS_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DEVOUT, AgsDevout)) #define AGS_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DEVOUT, AgsDevout)) #define AGS_IS_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DEVOUT)) #define AGS_IS_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DEVOUT)) #define AGS_DEVOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DEVOUT, AgsDevoutClass)) #define AGS_DEVOUT_GET_OBJ_MUTEX(obj) (&(((AgsDevout *) obj)->obj_mutex)) #define AGS_DEVOUT_DEFAULT_ALSA_DEVICE "hw:0,0" #define AGS_DEVOUT_DEFAULT_OSS_DEVICE "/dev/dsp" #define AGS_DEVOUT_DEFAULT_RING_BUFFER_SIZE (8) typedef struct _AgsDevout AgsDevout; typedef struct _AgsDevoutClass AgsDevoutClass; /** * AgsDevoutFlags: * @AGS_DEVOUT_ADDED_TO_REGISTRY: the devout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_DEVOUT_CONNECTED: indicates the devout was connected by calling #AgsConnectable::connect() * @AGS_DEVOUT_BUFFER0: ring-buffer 0 * @AGS_DEVOUT_BUFFER1: ring-buffer 1 * @AGS_DEVOUT_BUFFER2: ring-buffer 2 * @AGS_DEVOUT_BUFFER3: ring-buffer 3 * @AGS_DEVOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_DEVOUT_PLAY: devout is running * @AGS_DEVOUT_OSS: use OSS4 backend * @AGS_DEVOUT_ALSA: use ALSA backend * @AGS_DEVOUT_SHUTDOWN: stop playback * @AGS_DEVOUT_START_PLAY: playback starting * @AGS_DEVOUT_NONBLOCKING: do non-blocking calls * @AGS_DEVOUT_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsDevout by * enable/disable as flags. */ typedef enum { AGS_DEVOUT_ADDED_TO_REGISTRY = 1, AGS_DEVOUT_CONNECTED = 1 << 1, AGS_DEVOUT_BUFFER0 = 1 << 2, AGS_DEVOUT_BUFFER1 = 1 << 3, AGS_DEVOUT_BUFFER2 = 1 << 4, AGS_DEVOUT_BUFFER3 = 1 << 5, AGS_DEVOUT_ATTACK_FIRST = 1 << 6, AGS_DEVOUT_PLAY = 1 << 7, AGS_DEVOUT_OSS = 1 << 8, AGS_DEVOUT_ALSA = 1 << 9, AGS_DEVOUT_SHUTDOWN = 1 << 10, AGS_DEVOUT_START_PLAY = 1 << 11, AGS_DEVOUT_NONBLOCKING = 1 << 12, AGS_DEVOUT_INITIALIZED = 1 << 13, }AgsDevoutFlags; #define AGS_DEVOUT_ERROR (ags_devout_error_quark()) typedef enum{ AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, AGS_DEVOUT_ERROR_BROKEN_CONFIGURATION, AGS_DEVOUT_ERROR_ACCESS_TYPE_NOT_AVAILABLE, AGS_DEVOUT_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, AGS_DEVOUT_ERROR_CHANNELS_NOT_AVAILABLE, AGS_DEVOUT_ERROR_SAMPLERATE_NOT_AVAILABLE, AGS_DEVOUT_ERROR_BUFFER_SIZE_NOT_AVAILABLE, AGS_DEVOUT_ERROR_HW_PARAMETERS_NOT_AVAILABLE, }AgsDevoutError; struct _AgsDevout { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; // sample_rate GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void **buffer; volatile gboolean available; guint ring_buffer_size; guint nth_ring_buffer; unsigned char **ring_buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; union{ struct _AgsOssOut{ int device_fd; char *device; }oss; #ifdef AGS_WITH_ALSA struct _AgsAlsaOut{ char *device; int rc; snd_pcm_t *handle; snd_async_handler_t *ahandler; snd_pcm_hw_params_t *params; }alsa; #else struct _AgsAlsaDummyOut{ char *device; int rc; void *handle; void *ahandler; void *params; }alsa; #endif }out; GList *io_channel; GList *tag; }; struct _AgsDevoutClass { GObjectClass gobject; }; GType ags_devout_get_type(); GQuark ags_devout_error_quark(); gboolean ags_devout_test_flags(AgsDevout *devout, guint flags); void ags_devout_set_flags(AgsDevout *devout, guint flags); void ags_devout_unset_flags(AgsDevout *devout, guint flags); void ags_devout_switch_buffer_flag(AgsDevout *devout); void ags_devout_adjust_delay_and_attack(AgsDevout *devout); void ags_devout_realloc_buffer(AgsDevout *devout); AgsDevout* ags_devout_new(); G_END_DECLS #endif /*__AGS_DEVOUT_H__*/ gsequencer-3.1.3/ags/audio/ags_generic_recall_channel_run.c0000644000175000017500000002540113607210263020765 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_generic_recall_channel_run_class_init(AgsGenericRecallChannelRunClass *generic_recall_channel_run); void ags_generic_recall_channel_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_generic_recall_channel_run_init(AgsGenericRecallChannelRun *generic_recall_channel_run); void ags_generic_recall_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_generic_recall_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_generic_recall_channel_run_finalize(GObject *gobject); void ags_generic_recall_channel_run_connect(AgsConnectable *connectable); void ags_generic_recall_channel_run_disconnect(AgsConnectable *connectable); AgsRecall* ags_generic_recall_channel_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); /** * SECTION:ags_generic_recall_channel_run * @short_description: generic channel context of recall * @title: AgsGenericRecallChannelRun * @section_id: * @include: ags/audio/ags_generic_recall_channel_run.h * * #AgsGenericRecallChannelRun acts as generic channel recall. */ static gpointer ags_generic_recall_channel_run_parent_class = NULL; static AgsConnectableInterface *ags_generic_recall_channel_run_parent_connectable_interface; enum{ PROP_0, PROP_GENERIC_RECALL_RECYCLING_CHILD_TYPE, }; GType ags_generic_recall_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_generic_recall_channel_run = 0; static const GTypeInfo ags_generic_recall_channel_run_info = { sizeof (AgsGenericRecallChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_generic_recall_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsGenericRecallChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_generic_recall_channel_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_generic_recall_channel_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_generic_recall_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsGenericRecallChannelRun", &ags_generic_recall_channel_run_info, 0); g_type_add_interface_static(ags_type_generic_recall_channel_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_generic_recall_channel_run); } return g_define_type_id__volatile; } void ags_generic_recall_channel_run_class_init(AgsGenericRecallChannelRunClass *generic_recall_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_generic_recall_channel_run_parent_class = g_type_class_peek_parent(generic_recall_channel_run); /* GObjectClass */ gobject = (GObjectClass *) generic_recall_channel_run; gobject->set_property = ags_generic_recall_channel_run_set_property; gobject->get_property = ags_generic_recall_channel_run_get_property; gobject->finalize = ags_generic_recall_channel_run_finalize; /* properties */ /** * AgsGenericRecallChannelRun:generic-recall-recycling-child-type: * * The type of child #AgsRecall. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("generic-recall-recycling-child-type", i18n_pspec("generic recall recycling child type"), i18n_pspec("The generic recall recycling type of child that will be added"), AGS_TYPE_RECALL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GENERIC_RECALL_RECYCLING_CHILD_TYPE, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) generic_recall_channel_run; recall->duplicate = ags_generic_recall_channel_run_duplicate; } void ags_generic_recall_channel_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_generic_recall_channel_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_generic_recall_channel_run_connect; connectable->disconnect = ags_generic_recall_channel_run_disconnect; } void ags_generic_recall_channel_run_init(AgsGenericRecallChannelRun *generic_recall_channel_run) { AGS_RECALL(generic_recall_channel_run)->name = "ags-generic"; AGS_RECALL(generic_recall_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(generic_recall_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(generic_recall_channel_run)->xml_type = "ags-generic-recall-channel-run"; AGS_RECALL(generic_recall_channel_run)->port = NULL; AGS_RECALL(generic_recall_channel_run)->ability_flags |= (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI); AGS_RECALL(generic_recall_channel_run)->child_type = AGS_TYPE_GENERIC_RECALL_RECYCLING; generic_recall_channel_run->generic_recall_recycling_child_type = G_TYPE_NONE; } void ags_generic_recall_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsGenericRecallChannelRun *generic_recall_channel_run; GRecMutex *recall_mutex; generic_recall_channel_run = AGS_GENERIC_RECALL_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(generic_recall_channel_run); switch(prop_id){ case PROP_GENERIC_RECALL_RECYCLING_CHILD_TYPE: { g_rec_mutex_lock(recall_mutex); generic_recall_channel_run->generic_recall_recycling_child_type = g_value_get_gtype(value); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_generic_recall_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsGenericRecallChannelRun *generic_recall_channel_run; GRecMutex *recall_mutex; generic_recall_channel_run = AGS_GENERIC_RECALL_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(generic_recall_channel_run); switch(prop_id){ case PROP_GENERIC_RECALL_RECYCLING_CHILD_TYPE: { g_rec_mutex_lock(recall_mutex); g_value_set_gtype(value, generic_recall_channel_run->generic_recall_recycling_child_type); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_generic_recall_channel_run_finalize(GObject *gobject) { /* empty */ /* call parent */ G_OBJECT_CLASS(ags_generic_recall_channel_run_parent_class)->finalize(gobject); } void ags_generic_recall_channel_run_connect(AgsConnectable *connectable) { AgsRecallChannelRun *recall_channel_run; GObject *gobject; /* call parent */ ags_generic_recall_channel_run_parent_connectable_interface->connect(connectable); /* empty */ } void ags_generic_recall_channel_run_disconnect(AgsConnectable *connectable) { /* call parent */ ags_generic_recall_channel_run_parent_connectable_interface->disconnect(connectable); /* empty */ } AgsRecall* ags_generic_recall_channel_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsGenericRecallChannelRun *generic_recall_channel_run, *copy_generic_recall_channel_run; GList *list_start, *list; GType generic_recall_recycling_child_type; GRecMutex *recall_mutex; generic_recall_channel_run = (AgsGenericRecallChannelRun *) recall; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(generic_recall_channel_run); /* get some fields */ g_rec_mutex_lock(recall_mutex); generic_recall_recycling_child_type = generic_recall_channel_run->generic_recall_recycling_child_type; g_rec_mutex_unlock(recall_mutex); /* duplicate */ copy_generic_recall_channel_run = AGS_RECALL_CLASS(ags_generic_recall_channel_run_parent_class)->duplicate(recall, recall_id, n_params, parameter_name, value); g_object_set(copy_generic_recall_channel_run, "generic-recall-recycling-child-type", generic_recall_recycling_child_type, NULL); /* set child type on AgsRecallRecycling */ g_object_get(copy_generic_recall_channel_run, "child", &list_start, NULL); list = list_start; while(list != NULL){ g_object_set(list->data, "child-type", generic_recall_recycling_child_type, NULL); list = list->next; } g_list_free_full(list_start, g_object_unref); return((AgsRecall *) copy_generic_recall_channel_run); } /** * ags_generic_recall_channel_run_new: * @source: the source #AgsChannel * @child_type: child type * @generic_recall_recycling_child_type: recycling child type * * Creates an #AgsGenericRecallChannelRun. * * Returns: a new #AgsGenericRecallChannelRun. * * Since: 3.0.0 */ AgsGenericRecallChannelRun* ags_generic_recall_channel_run_new(AgsChannel *source, GType child_type, GType generic_recall_recycling_child_type) { AgsGenericRecallChannelRun *generic_recall_channel_run; generic_recall_channel_run = (AgsGenericRecallChannelRun *) g_object_new(AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN, "source", source, "child-type", child_type, "generic-recall-recycling-child-type", generic_recall_recycling_child_type, NULL); return(generic_recall_channel_run); } gsequencer-3.1.3/ags/audio/ags_char_buffer_util.c0000644000175000017500000013316413607210263016764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include /** * SECTION:ags_char_buffer_util * @short_description: util functions to handle char buffer * @title: AgsCharBufferUtil * @section_id: * @include: ags/audio/ags_char_buffer_util.h * * These utility functions allow you to store/restore PCM data from * char buffer. */ /** * ags_char_buffer_util_copy_s8_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy gint8 to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_s8_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint8 *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1) / G_MAXINT8; swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, source[0], AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, source[0], AGS_BYTE_ORDER_BE); } } break; case 2: { gint16 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_BE); } } break; case 3: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_BE); } } break; case 4: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_BE); } } break; case 8: { gint64 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_s16_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy gint16 to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_s16_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint16 *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1) / G_MAXINT16; swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_BE); } } break; case 2: { if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, source[0], AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, source[0], AGS_BYTE_ORDER_BE); } } break; case 3: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_BE); } } break; case 4: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_BE); } } break; case 8: { gint64 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_s24_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy gint32 to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_s24_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint32 *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1) / ((1 << 23) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_BE); } } break; case 2: { gint16 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_BE); } } break; case 3: { if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, source[0], AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, source[0], AGS_BYTE_ORDER_BE); } } break; case 4: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_BE); } } break; case 8: { gint64 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_s32_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy gint32 to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_s32_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint32 *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1) / G_MAXINT32; swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_BE); } } break; case 2: { gint16 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_BE); } } break; case 3: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_BE); } } break; case 4: { if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, source[0], AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, source[0], AGS_BYTE_ORDER_BE); } } break; case 8: { gint64 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_s64_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy gint64 to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_s64_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint64 *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1) / G_MAXINT64; swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_BE); } } break; case 2: { gint16 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_BE); } } break; case 3: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_BE); } } break; case 4: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_BE); } } break; case 8: { if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, source[0], AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, source[0], AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_float_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy float to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_float_to_cbuffer(guchar *destination, guint word_size, guint dchannels, float *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_BE); } } break; case 2: { gint16 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_BE); } } break; case 3: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_BE); } } break; case 4: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_BE); } } break; case 8: { gint64 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_double_to_cbuffer: * @destination: destination buffer * @word_size: word size * @dchannels: destination channels * @source: source buffer * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy double to char buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_double_to_cbuffer(guchar *destination, guint word_size, guint dchannels, double *source, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s8(destination, res, AGS_BYTE_ORDER_BE); } } break; case 2: { gint16 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s16(destination, res, AGS_BYTE_ORDER_BE); } } break; case 3: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s24(destination, res, AGS_BYTE_ORDER_BE); } } break; case 4: { gint32 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s32(destination, res, AGS_BYTE_ORDER_BE); } } break; case 8: { gint64 res; res = scale_factor * source[0]; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_LE); }else{ ags_buffer_util_char_buffer_write_s64(destination, res, AGS_BYTE_ORDER_BE); } } break; } destination += (dchannels * word_size); source += schannels; } } /** * ags_char_buffer_util_copy_cbuffer_to_s8: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to gint8 buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_s8(gint8 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = G_MAXINT8 / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_s16: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to gint16 buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_s16(gint16 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = G_MAXINT16 / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_s24: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to gint32 buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_s24(gint32 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = ((1 << 23) - 1) / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_s32: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to gint32 buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_s32(gint32 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = G_MAXINT32 / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_s64: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to gint64 buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_s64(gint64 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = G_MAXINT64 / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_float: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to float buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_float(float *destination, guint dchannels, gint8 *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = 1.0 / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_double: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * * Copy char to double buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_cbuffer_to_double(double *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order) { gdouble scale_factor; guint i; gboolean swap_bytes; scale_factor = 1.0 / (((guint64) 1 << (word_size * 8 - 1)) - 1); swap_bytes = FALSE; if(ags_endian_host_is_le() && byte_order == AGS_BYTE_ORDER_BE){ swap_bytes = TRUE; }else if(ags_endian_host_is_be() && byte_order == AGS_BYTE_ORDER_LE){ swap_bytes = TRUE; } for(i = 0; i < frame_count; i++){ switch(word_size){ case 1: { gint8 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s8(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 2: { gint16 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s16(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 3: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s24(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 4: { gint32 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s32(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; case 8: { gint64 res; if((ags_endian_host_is_le() && !swap_bytes) || (ags_endian_host_is_be() && swap_bytes)){ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_LE); }else{ res = ags_buffer_util_char_buffer_read_s64(source, AGS_BYTE_ORDER_BE); } destination[0] += (scale_factor * res); } break; } destination += dchannels; source += (schannels * word_size); } } /** * ags_char_buffer_util_copy_cbuffer_to_buffer: * @destination: destination buffer * @dchannels: destination channels * @source: source buffer * @word_size: word size * @schannels: source channels * @frame_count: frame count * @byte_order: the byte-order * @mode: the copy mode * * Copy char buffer to buffer. * * Since: 3.0.0 */ void ags_char_buffer_util_copy_buffer_to_buffer(void *destination, guint dchannels, guint doffset, void *source, guint schannels, guint soffset, guint frame_count, guint byte_order, guint word_size, guint mode) { switch(mode){ case AGS_CHAR_BUFFER_UTIL_COPY_S8_TO_CBUFFER: { ags_char_buffer_util_copy_s8_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((gint8 *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_S16_TO_CBUFFER: { ags_char_buffer_util_copy_s16_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((gint16 *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_S24_TO_CBUFFER: { ags_char_buffer_util_copy_s24_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((gint32 *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_S32_TO_CBUFFER: { ags_char_buffer_util_copy_s32_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((gint32 *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_S64_TO_CBUFFER: { ags_char_buffer_util_copy_s64_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((gint64 *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_FLOAT_TO_CBUFFER: { ags_char_buffer_util_copy_float_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((float *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_DOUBLE_TO_CBUFFER: { ags_char_buffer_util_copy_double_to_cbuffer(((guchar *) destination) + (doffset * word_size), word_size, dchannels, ((double *) source) + soffset, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S8: { ags_char_buffer_util_copy_cbuffer_to_s8(((gint8 *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S16: { ags_char_buffer_util_copy_cbuffer_to_s16(((gint16 *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S24: { ags_char_buffer_util_copy_cbuffer_to_s24(((gint32 *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S32: { ags_char_buffer_util_copy_cbuffer_to_s32(((gint32 *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S64: { ags_char_buffer_util_copy_cbuffer_to_s64(((gint64 *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_FLOAT: { ags_char_buffer_util_copy_cbuffer_to_float(((float *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; case AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_DOUBLE: { ags_char_buffer_util_copy_cbuffer_to_double(((double *) destination) + doffset, dchannels, ((guchar *) source) + (soffset * word_size), word_size, schannels, frame_count, byte_order); } break; default: g_warning("unknown copy mode"); } } gsequencer-3.1.3/ags/audio/pulse/0000755000175000017500000000000013622252254013666 500000000000000gsequencer-3.1.3/ags/audio/pulse/ags_pulse_port.h0000644000175000017500000001146213607210263017006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PULSE_PORT_H__ #define __AGS_PULSE_PORT_H__ #include #include #include #ifdef AGS_WITH_PULSE #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_PULSE_PORT (ags_pulse_port_get_type()) #define AGS_PULSE_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PULSE_PORT, AgsPulsePort)) #define AGS_PULSE_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PULSE_PORT, AgsPulsePort)) #define AGS_IS_PULSE_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PULSE_PORT)) #define AGS_IS_PULSE_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PULSE_PORT)) #define AGS_PULSE_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PULSE_PORT, AgsPulsePortClass)) #define AGS_PULSE_PORT_GET_OBJ_MUTEX(obj) (&(((AgsPulsePort *) obj)->obj_mutex)) #define AGS_PULSE_PORT_DEFAULT_CACHE_BUFFER_SIZE (4096) typedef struct _AgsPulsePort AgsPulsePort; typedef struct _AgsPulsePortClass AgsPulsePortClass; /** * AgsPulsePortFlags: * @AGS_PULSE_PORT_ADDED_TO_REGISTRY: the PULSE port was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PULSE_PORT_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_PULSE_PORT_REGISTERED: the port was registered * @AGS_PULSE_PORT_IS_AUDIO: the port provides audio data * @AGS_PULSE_PORT_IS_MIDI: the port provides midi data * @AGS_PULSE_PORT_IS_OUTPUT: the port does output * @AGS_PULSE_PORT_IS_INPUT: the port does input * * Enum values to control the behavior or indicate internal state of #AgsPulsePort by * enable/disable as flags. */ typedef enum{ AGS_PULSE_PORT_ADDED_TO_REGISTRY = 1, AGS_PULSE_PORT_CONNECTED = 1 << 1, AGS_PULSE_PORT_REGISTERED = 1 << 2, AGS_PULSE_PORT_IS_AUDIO = 1 << 3, AGS_PULSE_PORT_IS_MIDI = 1 << 4, AGS_PULSE_PORT_IS_OUTPUT = 1 << 5, AGS_PULSE_PORT_IS_INPUT = 1 << 6, }AgsPulsePortFlags; struct _AgsPulsePort { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *pulse_client; AgsUUID *uuid; GObject *pulse_devout; GObject *pulse_devin; gchar *port_uuid; gchar *port_name; guint pcm_channels; guint samplerate; guint buffer_size; guint format; gboolean use_cache; guint cache_buffer_size; guint current_cache; guint completed_cache; guint cache_offset; void **cache; #ifdef AGS_WITH_PULSE pa_stream *stream; pa_sample_spec *sample_spec; pa_buffer_attr *buffer_attr; #else gpointer stream; gpointer sample_spec; gpointer buffer_attr; #endif void *empty_buffer; volatile gboolean is_empty; volatile gint underflow; volatile gboolean restart; guint nth_empty_buffer; volatile guint queued; }; struct _AgsPulsePortClass { GObjectClass gobject; }; GType ags_pulse_port_get_type(); gboolean ags_pulse_port_test_flags(AgsPulsePort *pulse_port, guint flags); void ags_pulse_port_set_flags(AgsPulsePort *pulse_port, guint flags); void ags_pulse_port_unset_flags(AgsPulsePort *pulse_port, guint flags); GList* ags_pulse_port_find(GList *pulse_port, gchar *port_name); void ags_pulse_port_register(AgsPulsePort *pulse_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output); void ags_pulse_port_unregister(AgsPulsePort *pulse_port); guint ags_pulse_port_get_fixed_size(AgsPulsePort *pulse_port); void ags_pulse_port_set_samplerate(AgsPulsePort *pulse_port, guint samplerate); void ags_pulse_port_set_pcm_channels(AgsPulsePort *pulse_port, guint pcm_channels); void ags_pulse_port_set_buffer_size(AgsPulsePort *pulse_port, guint buffer_size); void ags_pulse_port_set_format(AgsPulsePort *pulse_port, guint format); void ags_pulse_port_set_cache_buffer_size(AgsPulsePort *pulse_port, guint cache_buffer_size); guint ags_pulse_port_get_latency(AgsPulsePort *pulse_port); AgsPulsePort* ags_pulse_port_new(GObject *pulse_client); G_END_DECLS #endif /*__AGS_PULSE_PORT_H__*/ gsequencer-3.1.3/ags/audio/pulse/ags_pulse_port.c0000644000175000017500000015770413607210263017013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_pulse_port_class_init(AgsPulsePortClass *pulse_port); void ags_pulse_port_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pulse_port_init(AgsPulsePort *pulse_port); void ags_pulse_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pulse_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pulse_port_dispose(GObject *gobject); void ags_pulse_port_finalize(GObject *gobject); AgsUUID* ags_pulse_port_get_uuid(AgsConnectable *connectable); gboolean ags_pulse_port_has_resource(AgsConnectable *connectable); gboolean ags_pulse_port_is_ready(AgsConnectable *connectable); void ags_pulse_port_add_to_registry(AgsConnectable *connectable); void ags_pulse_port_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_pulse_port_list_resource(AgsConnectable *connectable); xmlNode* ags_pulse_port_xml_compose(AgsConnectable *connectable); void ags_pulse_port_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_pulse_port_is_connected(AgsConnectable *connectable); void ags_pulse_port_connect(AgsConnectable *connectable); void ags_pulse_port_disconnect(AgsConnectable *connectable); #ifdef AGS_WITH_PULSE void ags_pulse_port_cached_stream_request_callback(pa_stream *stream, size_t length, AgsPulsePort *pulse_port); void ags_pulse_port_stream_request_callback(pa_stream *stream, size_t length, AgsPulsePort *pulse_port); void ags_pulse_port_stream_underflow_callback(pa_stream *stream, AgsPulsePort *pulse_port); #endif /** * SECTION:ags_pulse_port * @short_description: pulseaudio resource. * @title: AgsPulsePort * @section_id: * @include: ags/audio/pulse/ags_pulse_port.h * * The #AgsPulsePort represents either a pulseaudio sequencer or soundcard to communicate * with. */ enum{ PROP_0, PROP_PULSE_CLIENT, PROP_PULSE_DEVOUT, PROP_PULSE_DEVIN, PROP_PORT_NAME, }; static gpointer ags_pulse_port_parent_class = NULL; GType ags_pulse_port_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pulse_port = 0; static const GTypeInfo ags_pulse_port_info = { sizeof(AgsPulsePortClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pulse_port_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPulsePort), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pulse_port_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pulse_port_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pulse_port = g_type_register_static(G_TYPE_OBJECT, "AgsPulsePort", &ags_pulse_port_info, 0); g_type_add_interface_static(ags_type_pulse_port, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pulse_port); } return g_define_type_id__volatile; } void ags_pulse_port_class_init(AgsPulsePortClass *pulse_port) { GObjectClass *gobject; GParamSpec *param_spec; ags_pulse_port_parent_class = g_type_class_peek_parent(pulse_port); /* GObjectClass */ gobject = (GObjectClass *) pulse_port; gobject->set_property = ags_pulse_port_set_property; gobject->get_property = ags_pulse_port_get_property; gobject->dispose = ags_pulse_port_dispose; gobject->finalize = ags_pulse_port_finalize; /* properties */ /** * AgsPulsePort:pulse-client: * * The assigned #AgsPulseClient. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pulse-client", i18n_pspec("assigned pulseaudio client"), i18n_pspec("The assigned pulseaudio client"), AGS_TYPE_PULSE_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_CLIENT, param_spec); /** * AgsPulsePort:pulse-devout: * * The assigned #AgsPulseDevout. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pulse-devout", i18n_pspec("assigned pulseaudio devout"), i18n_pspec("The assigned pulseaudio devout"), AGS_TYPE_PULSE_DEVOUT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_DEVOUT, param_spec); /** * AgsPulsePort:pulse-devin: * * The assigned #AgsPulseDevout. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pulse-devin", i18n_pspec("assigned pulseaudio devin"), i18n_pspec("The assigned pulseaudio devin"), AGS_TYPE_PULSE_DEVIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_DEVIN, param_spec); /** * AgsPulsePort:port-name: * * The pulse soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("port-name", i18n_pspec("port name"), i18n_pspec("The port name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_NAME, param_spec); } void ags_pulse_port_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_pulse_port_get_uuid; connectable->has_resource = ags_pulse_port_has_resource; connectable->is_ready = ags_pulse_port_is_ready; connectable->add_to_registry = ags_pulse_port_add_to_registry; connectable->remove_from_registry = ags_pulse_port_remove_from_registry; connectable->list_resource = ags_pulse_port_list_resource; connectable->xml_compose = ags_pulse_port_xml_compose; connectable->xml_parse = ags_pulse_port_xml_parse; connectable->is_connected = ags_pulse_port_is_connected; connectable->connect = ags_pulse_port_connect; connectable->disconnect = ags_pulse_port_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_pulse_port_init(AgsPulsePort *pulse_port) { AgsConfig *config; gchar *str; guint word_size; guint fixed_size; /* flags */ pulse_port->flags = 0; /* port mutex */ g_rec_mutex_init(&(pulse_port->obj_mutex)); /* parent */ pulse_port->pulse_client = NULL; /* uuid */ pulse_port->uuid = ags_uuid_alloc(); ags_uuid_generate(pulse_port->uuid); /* */ pulse_port->pulse_devout = NULL; pulse_port->pulse_devin = NULL; pulse_port->port_uuid = ags_id_generator_create_uuid(); pulse_port->port_name = NULL; pulse_port->stream = NULL; /* presets */ config = ags_config_get_instance(); pulse_port->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); pulse_port->samplerate = ags_soundcard_helper_config_get_samplerate(config); pulse_port->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); pulse_port->format = ags_soundcard_helper_config_get_format(config); pulse_port->use_cache = TRUE; pulse_port->cache_buffer_size = AGS_PULSE_PORT_DEFAULT_CACHE_BUFFER_SIZE; pulse_port->current_cache = 0; pulse_port->completed_cache = 0; pulse_port->cache_offset = 0; pulse_port->cache = (void **) malloc(4 * sizeof(void *)); #ifdef AGS_WITH_PULSE pulse_port->sample_spec = (pa_sample_spec *) malloc(sizeof(pa_sample_spec)); pulse_port->sample_spec->rate = pulse_port->samplerate; pulse_port->sample_spec->channels = pulse_port->pcm_channels; #else pulse_port->sample_spec = NULL; #endif word_size = 0; switch(pulse_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { #ifdef AGS_WITH_PULSE if(ags_endian_host_is_be()){ pulse_port->sample_spec->format = PA_SAMPLE_S16BE; }else{ pulse_port->sample_spec->format = PA_SAMPLE_S16LE; } #endif pulse_port->cache[0] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint16)); pulse_port->cache[1] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint16)); pulse_port->cache[2] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint16)); pulse_port->cache[3] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint16)); word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { #ifdef AGS_WITH_PULSE if(ags_endian_host_is_be()){ pulse_port->sample_spec->format = PA_SAMPLE_S24_32BE; }else{ pulse_port->sample_spec->format = PA_SAMPLE_S24_32LE; } #endif pulse_port->cache[0] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { #ifdef AGS_WITH_PULSE if(ags_endian_host_is_be()){ pulse_port->sample_spec->format = PA_SAMPLE_S32BE; }else{ pulse_port->sample_spec->format = PA_SAMPLE_S32LE; } #endif pulse_port->cache[0] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) malloc(pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); word_size = sizeof(gint32); } break; default: g_warning("pulse devout/devin - unsupported format"); } fixed_size = pulse_port->pcm_channels * pulse_port->cache_buffer_size * word_size; memset(pulse_port->cache[0], 0, pulse_port->pcm_channels * pulse_port->cache_buffer_size * word_size); memset(pulse_port->cache[1], 0, pulse_port->pcm_channels * pulse_port->cache_buffer_size * word_size); memset(pulse_port->cache[2], 0, pulse_port->pcm_channels * pulse_port->cache_buffer_size * word_size); memset(pulse_port->cache[3], 0, pulse_port->pcm_channels * pulse_port->cache_buffer_size * word_size); #ifdef AGS_WITH_PULSE pulse_port->buffer_attr = (pa_buffer_attr *) malloc(sizeof(pa_buffer_attr)); pulse_port->buffer_attr->fragsize = (uint32_t) -1; pulse_port->buffer_attr->maxlength = (uint32_t) -1; pulse_port->buffer_attr->minreq = (uint32_t) fixed_size; pulse_port->buffer_attr->prebuf = (uint32_t) 0; pulse_port->buffer_attr->tlength = (uint32_t) fixed_size; #else pulse_port->buffer_attr = NULL; #endif pulse_port->empty_buffer = ags_stream_alloc(8 * pulse_port->pcm_channels * pulse_port->buffer_size, AGS_SOUNDCARD_DEFAULT_FORMAT); g_atomic_int_set(&(pulse_port->is_empty), TRUE); g_atomic_int_set(&(pulse_port->underflow), 0); g_atomic_int_set(&(pulse_port->restart), FALSE); pulse_port->nth_empty_buffer = 0; g_atomic_int_set(&(pulse_port->queued), 0); } void ags_pulse_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPulsePort *pulse_port; GRecMutex *pulse_port_mutex; pulse_port = AGS_PULSE_PORT(gobject); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); switch(prop_id){ case PROP_PULSE_CLIENT: { AgsPulseClient *pulse_client; pulse_client = (AgsPulseClient *) g_value_get_object(value); g_rec_mutex_lock(pulse_port_mutex); if(pulse_port->pulse_client == (GObject *) pulse_client){ g_rec_mutex_unlock(pulse_port_mutex); return; } if(pulse_port->pulse_client != NULL){ g_object_unref(pulse_port->pulse_client); } if(pulse_client != NULL){ g_object_ref(pulse_client); } pulse_port->pulse_client = (GObject *) pulse_client; g_rec_mutex_unlock(pulse_port_mutex); } break; case PROP_PULSE_DEVOUT: { AgsPulseDevout *pulse_devout; pulse_devout = (AgsPulseDevout *) g_value_get_object(value); g_rec_mutex_lock(pulse_port_mutex); if(pulse_port->pulse_devout == (GObject *) pulse_devout){ g_rec_mutex_unlock(pulse_port_mutex); return; } if(pulse_port->pulse_devout != NULL){ g_object_unref(pulse_port->pulse_devout); } if(pulse_devout != NULL){ g_object_ref(pulse_devout); } pulse_port->pulse_devout = (GObject *) pulse_devout; g_rec_mutex_unlock(pulse_port_mutex); } break; case PROP_PULSE_DEVIN: { AgsPulseDevin *pulse_devin; pulse_devin = (AgsPulseDevin *) g_value_get_object(value); g_rec_mutex_lock(pulse_port_mutex); if(pulse_port->pulse_devin == (GObject *) pulse_devin){ g_rec_mutex_unlock(pulse_port_mutex); return; } if(pulse_port->pulse_devin != NULL){ g_object_unref(pulse_port->pulse_devin); } if(pulse_devin != NULL){ g_object_ref(pulse_devin); } pulse_port->pulse_devin = (GObject *) pulse_devin; g_rec_mutex_unlock(pulse_port_mutex); } break; case PROP_PORT_NAME: { gchar *port_name; port_name = g_value_get_string(value); g_rec_mutex_lock(pulse_port_mutex); if(pulse_port->port_name == port_name || !g_ascii_strcasecmp(pulse_port->port_name, port_name)){ g_rec_mutex_unlock(pulse_port_mutex); return; } if(pulse_port->port_name != NULL){ g_free(pulse_port->port_name); } pulse_port->port_name = port_name; g_rec_mutex_unlock(pulse_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPulsePort *pulse_port; GRecMutex *pulse_port_mutex; pulse_port = AGS_PULSE_PORT(gobject); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); switch(prop_id){ case PROP_PULSE_CLIENT: { g_rec_mutex_lock(pulse_port_mutex); g_value_set_object(value, pulse_port->pulse_client); g_rec_mutex_unlock(pulse_port_mutex); } break; case PROP_PULSE_DEVOUT: { g_rec_mutex_lock(pulse_port_mutex); g_value_set_object(value, pulse_port->pulse_devout); g_rec_mutex_unlock(pulse_port_mutex); } break; case PROP_PULSE_DEVIN: { g_rec_mutex_lock(pulse_port_mutex); g_value_set_object(value, pulse_port->pulse_devin); g_rec_mutex_unlock(pulse_port_mutex); } break; case PROP_PORT_NAME: { g_rec_mutex_lock(pulse_port_mutex); g_value_set_string(value, pulse_port->port_name); g_rec_mutex_unlock(pulse_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_port_dispose(GObject *gobject) { AgsPulsePort *pulse_port; pulse_port = AGS_PULSE_PORT(gobject); /* pulse client */ if(pulse_port->pulse_client != NULL){ g_object_unref(pulse_port->pulse_client); pulse_port->pulse_client = NULL; } /* pulse devout */ if(pulse_port->pulse_devout != NULL){ g_object_unref(pulse_port->pulse_devout); pulse_port->pulse_devout = NULL; } /* pulse devin */ if(pulse_port->pulse_devin != NULL){ g_object_unref(pulse_port->pulse_devin); pulse_port->pulse_devin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_pulse_port_parent_class)->dispose(gobject); } void ags_pulse_port_finalize(GObject *gobject) { AgsPulsePort *pulse_port; pulse_port = AGS_PULSE_PORT(gobject); /* pulse client */ if(pulse_port->pulse_client != NULL){ g_object_unref(pulse_port->pulse_client); } /* pulse devout */ if(pulse_port->pulse_devout != NULL){ g_object_unref(pulse_port->pulse_devout); } /* pulse devin */ if(pulse_port->pulse_devin != NULL){ g_object_unref(pulse_port->pulse_devin); } /* name */ g_free(pulse_port->port_name); if(pulse_port->sample_spec != NULL){ free(pulse_port->sample_spec); } if(pulse_port->buffer_attr != NULL){ free(pulse_port->buffer_attr); } /* call parent */ G_OBJECT_CLASS(ags_pulse_port_parent_class)->finalize(gobject); } AgsUUID* ags_pulse_port_get_uuid(AgsConnectable *connectable) { AgsPulsePort *pulse_port; AgsUUID *ptr; GRecMutex *pulse_port_mutex; pulse_port = AGS_PULSE_PORT(connectable); /* get pulse port signal mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* get UUID */ g_rec_mutex_lock(pulse_port_mutex); ptr = pulse_port->uuid; g_rec_mutex_unlock(pulse_port_mutex); return(ptr); } gboolean ags_pulse_port_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_pulse_port_is_ready(AgsConnectable *connectable) { AgsPulsePort *pulse_port; gboolean is_ready; pulse_port = AGS_PULSE_PORT(connectable); /* check is added */ is_ready = ags_pulse_port_test_flags(pulse_port, AGS_PULSE_PORT_ADDED_TO_REGISTRY); return(is_ready); } void ags_pulse_port_add_to_registry(AgsConnectable *connectable) { AgsPulsePort *pulse_port; if(ags_connectable_is_ready(connectable)){ return; } pulse_port = AGS_PULSE_PORT(connectable); ags_pulse_port_set_flags(pulse_port, AGS_PULSE_PORT_ADDED_TO_REGISTRY); } void ags_pulse_port_remove_from_registry(AgsConnectable *connectable) { AgsPulsePort *pulse_port; if(!ags_connectable_is_ready(connectable)){ return; } pulse_port = AGS_PULSE_PORT(connectable); ags_pulse_port_unset_flags(pulse_port, AGS_PULSE_PORT_ADDED_TO_REGISTRY); } xmlNode* ags_pulse_port_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_pulse_port_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_pulse_port_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_pulse_port_is_connected(AgsConnectable *connectable) { AgsPulsePort *pulse_port; gboolean is_connected; pulse_port = AGS_PULSE_PORT(connectable); /* check is connected */ is_connected = ags_pulse_port_test_flags(pulse_port, AGS_PULSE_PORT_CONNECTED); return(is_connected); } void ags_pulse_port_connect(AgsConnectable *connectable) { AgsPulsePort *pulse_port; if(ags_connectable_is_connected(connectable)){ return; } pulse_port = AGS_PULSE_PORT(connectable); ags_pulse_port_set_flags(pulse_port, AGS_PULSE_PORT_CONNECTED); } void ags_pulse_port_disconnect(AgsConnectable *connectable) { AgsPulsePort *pulse_port; if(!ags_connectable_is_connected(connectable)){ return; } pulse_port = AGS_PULSE_PORT(connectable); ags_pulse_port_unset_flags(pulse_port, AGS_PULSE_PORT_CONNECTED); } /** * ags_pulse_port_test_flags: * @pulse_port: the #AgsPulsePort * @flags: the flags * * Test @flags to be set on @pulse_port. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_pulse_port_test_flags(AgsPulsePort *pulse_port, guint flags) { gboolean retval; GRecMutex *pulse_port_mutex; if(!AGS_IS_PULSE_PORT(pulse_port)){ return(FALSE); } /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* test */ g_rec_mutex_lock(pulse_port_mutex); retval = (flags & (pulse_port->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_port_mutex); return(retval); } /** * ags_pulse_port_set_flags: * @pulse_port: the #AgsPulsePort * @flags: see #AgsPulsePortFlags-enum * * Enable a feature of @pulse_port. * * Since: 3.0.0 */ void ags_pulse_port_set_flags(AgsPulsePort *pulse_port, guint flags) { GRecMutex *pulse_port_mutex; if(!AGS_IS_PULSE_PORT(pulse_port)){ return; } /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(pulse_port_mutex); pulse_port->flags |= flags; g_rec_mutex_unlock(pulse_port_mutex); } /** * ags_pulse_port_unset_flags: * @pulse_port: the #AgsPulsePort * @flags: see #AgsPulsePortFlags-enum * * Disable a feature of @pulse_port. * * Since: 3.0.0 */ void ags_pulse_port_unset_flags(AgsPulsePort *pulse_port, guint flags) { GRecMutex *pulse_port_mutex; if(!AGS_IS_PULSE_PORT(pulse_port)){ return; } /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(pulse_port_mutex); pulse_port->flags &= (~flags); g_rec_mutex_unlock(pulse_port_mutex); } /** * ags_pulse_port_find: * @pulse_port: (element-type AgsAudio.PulsePort) (transfer none): the #GList-struct containig #AgsPulsePort * @port_name: the port name to find * * Finds next match of @port_name in @pulse_port. * * Returns: (element-type AgsAudio.PulsePort) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_pulse_port_find(GList *pulse_port, gchar *port_name) { gboolean success; GRecMutex *pulse_port_mutex; while(pulse_port != NULL){ /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port->data); /* check port name */ g_rec_mutex_lock(pulse_port_mutex); success = (!g_ascii_strcasecmp(AGS_PULSE_PORT(pulse_port->data)->port_name, port_name)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_port_mutex); if(success){ return(pulse_port); } } return(NULL); } /** * ags_pulse_port_register: * @pulse_port: the #AgsPulsePort * @port_name: the name as string * @is_audio: if %TRUE interpreted as audio port * @is_midi: if %TRUE interpreted as midi port * @is_output: if %TRUE port is acting as output, otherwise as input * * Register a new pulseaudio port and read uuid. Creates a new AgsSequencer or AgsSoundcard * object. * * Since: 3.0.0 */ void ags_pulse_port_register(AgsPulsePort *pulse_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output) { AgsPulseServer *pulse_server; AgsPulseClient *pulse_client; #ifdef AGS_WITH_PULSE pa_context *context; pa_stream *stream; pa_sample_spec *sample_spec; pa_buffer_attr *buffer_attr; #else gpointer context; gpointer stream; gpointer sample_spec; gpointer buffer_attr; #endif GList *list; int r; gboolean use_cache; GRecMutex *pulse_client_mutex; GRecMutex *pulse_port_mutex; if(!AGS_IS_PULSE_PORT(pulse_port) || port_name == NULL){ return; } g_object_get(pulse_port, "pulse-client", &pulse_client, NULL); if(pulse_client == NULL){ g_warning("ags_pulse_port.c - no assigned AgsPulseClient"); return; } if(ags_pulse_port_test_flags(pulse_port, AGS_PULSE_PORT_REGISTERED)){ g_object_unref(pulse_client); return; } /* get pulse server and application context */ g_object_get(pulse_client, "pulse-server", &pulse_server, NULL); if(pulse_server == NULL){ g_object_unref(pulse_client); return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* get context */ g_rec_mutex_lock(pulse_client_mutex); context = pulse_client->context; g_rec_mutex_unlock(pulse_client_mutex); if(context == NULL){ g_object_unref(pulse_client); g_object_unref(pulse_server); return; } /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* get port name */ //FIXME:JK: memory leak? g_rec_mutex_lock(pulse_port_mutex); sample_spec = pulse_port->sample_spec; buffer_attr = pulse_port->buffer_attr; port_name = g_strdup(pulse_port->port_name); use_cache = pulse_port->use_cache; g_rec_mutex_unlock(pulse_port_mutex); /* create sequencer or soundcard */ if(is_output){ ags_pulse_port_set_flags(pulse_port, AGS_PULSE_PORT_IS_OUTPUT); } #ifdef AGS_WITH_PULSE stream = pa_stream_new(context, "Playback", sample_spec, NULL); #else stream = NULL; #endif g_rec_mutex_lock(pulse_port_mutex); pulse_port->stream = stream; g_rec_mutex_unlock(pulse_port_mutex); if(stream == NULL){ return; } #ifdef AGS_WITH_PULSE if(is_audio){ ags_pulse_port_set_flags(pulse_port, AGS_PULSE_PORT_IS_AUDIO); if(use_cache){ pa_stream_set_write_callback(stream, ags_pulse_port_cached_stream_request_callback, pulse_port); }else{ pa_stream_set_write_callback(stream, ags_pulse_port_stream_request_callback, pulse_port); } pa_stream_set_underflow_callback(stream, ags_pulse_port_stream_underflow_callback, pulse_port); r = pa_stream_connect_playback(stream, NULL, buffer_attr, (PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_ADJUST_LATENCY | PA_STREAM_AUTO_TIMING_UPDATE), NULL, NULL); if(r < 0){ // Old pulse audio servers don't like the ADJUST_LATENCY flag, so retry without that r = pa_stream_connect_playback(stream, NULL, buffer_attr, (PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE), NULL, NULL); } if(r < 0){ return; } }else if(is_midi){ ags_pulse_port_set_flags(pulse_port, AGS_PULSE_PORT_IS_MIDI); //NOTE:JK: not implemented } if(stream != NULL){ ags_pulse_port_set_flags(pulse_port, AGS_PULSE_PORT_REGISTERED); } #endif g_object_unref(pulse_client); g_object_unref(pulse_server); } void ags_pulse_port_unregister(AgsPulsePort *pulse_port) { #ifdef AGS_WITH_PULSE pa_stream *stream; #else gpointer stream; #endif GRecMutex *pulse_port_mutex; if(!AGS_IS_PULSE_PORT(pulse_port)){ return; } /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* get port */ g_rec_mutex_lock(pulse_port_mutex); stream = pulse_port->stream; g_rec_mutex_unlock(pulse_port_mutex); #ifdef AGS_WITH_PULSE if(stream != NULL){ pa_stream_disconnect(stream); /* unset port and flags */ g_rec_mutex_lock(pulse_port_mutex); pulse_port->stream = NULL; g_rec_mutex_unlock(pulse_port_mutex); ags_pulse_port_unset_flags(pulse_port, AGS_PULSE_PORT_REGISTERED); } #endif } #ifdef AGS_WITH_PULSE void ags_pulse_port_cached_stream_request_callback(pa_stream *stream, size_t length, AgsPulsePort *pulse_port) { AgsPulseDevout *pulse_devout; AgsPulseDevin *pulse_devin; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; GObject *soundcard; guint current_cache; guint next_cache, completed_cache; guint played_cache; guint word_size; guint frame_size; GRecMutex *pulse_port_mutex; if(pulse_port == NULL){ return; } application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); ags_thread_unset_flags(audio_loop, AGS_THREAD_TIME_ACCOUNTING); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* */ g_rec_mutex_lock(pulse_port_mutex); pulse_devout = (AgsPulseDevout *) pulse_port->pulse_devout; pulse_devin = (AgsPulseDevin *) pulse_port->pulse_devin; current_cache = pulse_port->current_cache; word_size = 0; switch(pulse_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; } frame_size = pulse_port->sample_spec->channels * pulse_port->cache_buffer_size * word_size; g_rec_mutex_unlock(pulse_port_mutex); soundcard = NULL; if(pulse_devout != NULL){ soundcard = (GObject *) pulse_devout; }else if(pulse_devin != NULL){ soundcard = (GObject *) pulse_devin; } if(ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard))){ if(current_cache == 3){ next_cache = 0; }else{ next_cache = current_cache + 1; } }else{ next_cache = 0; } /* wait until cache ready */ g_rec_mutex_lock(pulse_port_mutex); completed_cache = pulse_port->completed_cache; g_rec_mutex_unlock(pulse_port_mutex); if(AGS_IS_PULSE_DEVOUT(soundcard)){ size_t n_bytes; struct timespec idle_time = { 0, 0, }; if(ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard))){ idle_time.tv_nsec = ags_pulse_port_get_latency(pulse_port) / 8; while(next_cache == completed_cache && ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard))){ nanosleep(&idle_time, NULL); g_rec_mutex_lock(pulse_port_mutex); completed_cache = pulse_port->completed_cache; g_rec_mutex_unlock(pulse_port_mutex); } if(current_cache == 0){ played_cache = 3; }else{ played_cache = current_cache - 1; } }else{ played_cache = 0; } n_bytes = 0; pa_stream_begin_write(stream, &(pulse_port->cache[played_cache]), &n_bytes); pa_stream_write(stream, pulse_port->cache[played_cache], frame_size, NULL, 0, PA_SEEK_RELATIVE); }else{ if(current_cache == 3){ played_cache = 0; }else{ played_cache = current_cache + 1; } pa_stream_peek(stream, &(pulse_port->cache[played_cache]), &frame_size); g_rec_mutex_lock(pulse_port_mutex); } /* seek current cache */ g_rec_mutex_lock(pulse_port_mutex); pulse_port->current_cache = next_cache; g_rec_mutex_unlock(pulse_port_mutex); /* unref */ g_object_unref(audio_loop); } void ags_pulse_port_stream_request_callback(pa_stream *stream, size_t length, AgsPulsePort *pulse_port) { AgsPulseDevout *pulse_devout; AgsPulseDevin *pulse_devin; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; GObject *soundcard; guint word_size; size_t count; guint nth_buffer; guint nth_empty_buffer, next_nth_empty_buffer; size_t n_bytes; gint remaining; guint i; gboolean no_event; gboolean empty_run; GRecMutex *pulse_port_mutex; GRecMutex *device_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; if(pulse_port == NULL){ return; } /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); if(g_atomic_int_get(&(pulse_port->queued)) > 0){ g_warning("drop pulseaudio callback"); return; }else{ g_atomic_int_inc(&(pulse_port->queued)); } /* * process audio */ /* */ application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); ags_thread_unset_flags(audio_loop, AGS_THREAD_TIME_ACCOUNTING); /* */ g_rec_mutex_lock(pulse_port_mutex); pulse_devout = (AgsPulseDevout *) pulse_port->pulse_devout; pulse_devin = (AgsPulseDevin *) pulse_port->pulse_devin; soundcard = NULL; if(pulse_devout != NULL){ soundcard = (GObject *) pulse_devout; }else if(pulse_devin != NULL){ soundcard = (GObject *) pulse_devin; } stream = pulse_port->stream; nth_empty_buffer = pulse_port->nth_empty_buffer; if(nth_empty_buffer >= 7){ next_nth_empty_buffer = 0; }else{ next_nth_empty_buffer = nth_empty_buffer + 1; } g_rec_mutex_unlock(pulse_port_mutex); /* get device mutex */ if(AGS_IS_PULSE_DEVOUT(soundcard)){ device_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(soundcard); }else if(AGS_IS_PULSE_DEVIN(soundcard)){ device_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(soundcard); }else{ g_object_unref(audio_loop); return; } /* */ g_rec_mutex_lock(device_mutex); empty_run = FALSE; if((pulse_devout == NULL || !ags_soundcard_is_playing(AGS_SOUNDCARD(pulse_devout))) && (pulse_devin == NULL || !ags_soundcard_is_recording(AGS_SOUNDCARD(pulse_devin)))){ empty_run = TRUE; } g_rec_mutex_unlock(device_mutex); /* check buffer flag */ g_rec_mutex_lock(pulse_port_mutex); word_size = 0; switch(pulse_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; } count = pulse_port->sample_spec->channels * pulse_port->buffer_size * word_size; g_rec_mutex_unlock(pulse_port_mutex); remaining = length; if(empty_run){ void *empty_buffer; void *next_empty_buffer; n_bytes = 0; empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); pa_stream_begin_write(stream, &empty_buffer, &n_bytes); // remaining = n_bytes; remaining = length; /* iterate */ for(i = 0; remaining > 0; i++){ g_rec_mutex_lock(pulse_port_mutex); empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); next_empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[next_nth_empty_buffer * count]); nth_empty_buffer = next_nth_empty_buffer; if(nth_empty_buffer >= 7){ next_nth_empty_buffer = 0; }else{ next_nth_empty_buffer = nth_empty_buffer + 1; } pulse_port->nth_empty_buffer = nth_empty_buffer; pa_stream_write(stream, empty_buffer, count, NULL, 0, PA_SEEK_RELATIVE); g_rec_mutex_unlock(pulse_port_mutex); memset(next_empty_buffer, 0, count * sizeof(unsigned char)); remaining -= count; } g_atomic_int_set(&(pulse_port->is_empty), TRUE); } g_rec_mutex_lock(device_mutex); /* wait callback */ nth_buffer = 0; no_event = TRUE; if(pulse_devout != NULL){ if((AGS_PULSE_DEVOUT_PASS_THROUGH & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0){ callback_mutex = &(pulse_devout->callback_mutex); g_rec_mutex_unlock(device_mutex); /* give back computing time until ready */ g_mutex_lock(callback_mutex); if((AGS_PULSE_DEVOUT_CALLBACK_DONE & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0){ gint64 timeout; guint latency; timeout = 0; g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_CALLBACK_WAIT); g_mutex_lock(pulse_port_mutex); latency = ags_pulse_port_get_latency(pulse_port); g_mutex_unlock(pulse_port_mutex); latency /= 8; timeout += latency; while((AGS_PULSE_DEVOUT_CALLBACK_DONE & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0 && (AGS_PULSE_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(pulse_devout->sync_flags)))) != 0){ void *empty_buffer; void *next_empty_buffer; g_cond_wait_until(&(pulse_devout->callback_cond), callback_mutex, timeout); g_mutex_unlock(callback_mutex); if(g_atomic_int_get(&(pulse_port->underflow)) > 0){ n_bytes = 0; empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); #if 0 pa_stream_begin_write(stream, &empty_buffer, &n_bytes); #endif remaining = length; } /* feed */ for(i = 0; g_atomic_int_get(&(pulse_port->underflow)) > 0 || remaining > 0; i++){ g_rec_mutex_lock(pulse_port_mutex); empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); next_empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[next_nth_empty_buffer * count]); nth_empty_buffer = next_nth_empty_buffer; if(nth_empty_buffer >= 7){ next_nth_empty_buffer = 0; }else{ next_nth_empty_buffer = nth_empty_buffer + 1; } pulse_port->nth_empty_buffer = nth_empty_buffer; #if 0 pa_stream_write(stream, empty_buffer, count, NULL, 0, PA_SEEK_RELATIVE); #endif g_rec_mutex_unlock(pulse_port_mutex); memset(next_empty_buffer, 0, count * sizeof(unsigned char)); if(g_atomic_int_get(&(pulse_port->underflow)) > 0){ g_atomic_int_dec_and_test(&(pulse_port->underflow)); } remaining -= count; } g_rec_mutex_lock(pulse_port_mutex); latency = ags_pulse_port_get_latency(pulse_port); g_rec_mutex_unlock(pulse_port_mutex); latency /= 8; timeout = g_get_monotonic_time() + latency; g_mutex_lock(callback_mutex); } } g_atomic_int_and(&(pulse_devout->sync_flags), (~(AGS_PULSE_DEVOUT_CALLBACK_WAIT | AGS_PULSE_DEVOUT_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; g_rec_mutex_lock(device_mutex); } /* get buffer */ if((AGS_PULSE_DEVOUT_BUFFER0 & (pulse_devout->flags)) != 0){ nth_buffer = 7; }else if((AGS_PULSE_DEVOUT_BUFFER1 & (pulse_devout->flags)) != 0){ nth_buffer = 0; }else if((AGS_PULSE_DEVOUT_BUFFER2 & (pulse_devout->flags)) != 0){ nth_buffer = 1; }else if((AGS_PULSE_DEVOUT_BUFFER3 & (pulse_devout->flags)) != 0){ nth_buffer = 2; }else if((AGS_PULSE_DEVOUT_BUFFER4 & (pulse_devout->flags)) != 0){ nth_buffer = 3; }else if((AGS_PULSE_DEVOUT_BUFFER5 & (pulse_devout->flags)) != 0){ nth_buffer = 4; }else if((AGS_PULSE_DEVOUT_BUFFER6 & (pulse_devout->flags)) != 0){ nth_buffer = 5; }else if((AGS_PULSE_DEVOUT_BUFFER7 & (pulse_devout->flags)) != 0){ nth_buffer = 6; }else{ empty_run = TRUE; } }else if(pulse_devin != NULL){ if((AGS_PULSE_DEVIN_PASS_THROUGH & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0){ callback_mutex = &(pulse_devin->callback_mutex); g_rec_mutex_unlock(device_mutex); /* give back computing time until ready */ g_mutex_lock(callback_mutex); if((AGS_PULSE_DEVIN_CALLBACK_DONE & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0){ g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_CALLBACK_WAIT); while((AGS_PULSE_DEVIN_CALLBACK_DONE & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0 && (AGS_PULSE_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(pulse_devin->sync_flags)))) != 0){ g_cond_wait(&(pulse_devin->callback_cond), callback_mutex); } g_atomic_int_and(&(pulse_devin->sync_flags), (~(AGS_PULSE_DEVIN_CALLBACK_WAIT | AGS_PULSE_DEVIN_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; g_rec_mutex_lock(device_mutex); } } /* get buffer */ if((AGS_PULSE_DEVIN_BUFFER0 & (pulse_devin->flags)) != 0){ nth_buffer = 7; }else if((AGS_PULSE_DEVIN_BUFFER1 & (pulse_devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_PULSE_DEVIN_BUFFER2 & (pulse_devin->flags)) != 0){ nth_buffer = 1; }else if((AGS_PULSE_DEVIN_BUFFER3 & (pulse_devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_PULSE_DEVIN_BUFFER4 & (pulse_devin->flags)) != 0){ nth_buffer = 3; }else if((AGS_PULSE_DEVIN_BUFFER5 & (pulse_devin->flags)) != 0){ nth_buffer = 4; }else if((AGS_PULSE_DEVIN_BUFFER6 & (pulse_devin->flags)) != 0){ nth_buffer = 5; }else if((AGS_PULSE_DEVIN_BUFFER7 & (pulse_devin->flags)) != 0){ nth_buffer = 6; }else{ empty_run = TRUE; } } switch(pulse_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: empty_run = TRUE; } /* write */ count = pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size; if(pulse_devout != NULL){ if(!empty_run){ n_bytes = 0; pa_stream_begin_write(stream, &(pulse_devout->buffer[nth_buffer]), &n_bytes); // g_message("%d", ags_synth_util_get_xcross_count_s16(pulse_devout->buffer[nth_buffer], // pulse_devout->pcm_channels * pulse_devout->buffer_size)); ags_soundcard_lock_buffer(AGS_SOUNDCARD(pulse_devout), pulse_devout->buffer[nth_buffer]); pa_stream_write(stream, pulse_devout->buffer[nth_buffer], count, NULL, 0, PA_SEEK_RELATIVE); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(pulse_devout), pulse_devout->buffer[nth_buffer]); g_atomic_int_set(&(pulse_port->is_empty), FALSE); } /* signal finish */ if(!no_event){ callback_finish_mutex = &(pulse_devout->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(pulse_devout->sync_flags)))) != 0){ g_cond_signal(&(pulse_devout->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } g_rec_mutex_unlock(device_mutex); if(empty_run){ void *empty_buffer; void *next_empty_buffer; empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); n_bytes = 0; pa_stream_begin_write(stream, &empty_buffer, &n_bytes); remaining = length; for(i = 0; remaining > 0; i++){ /* feed */ g_rec_mutex_lock(pulse_port_mutex); empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); next_empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[next_nth_empty_buffer * count]); nth_empty_buffer = next_nth_empty_buffer; if(nth_empty_buffer >= 7){ next_nth_empty_buffer = 0; }else{ next_nth_empty_buffer = nth_empty_buffer + 1; } pulse_port->nth_empty_buffer = nth_empty_buffer; pa_stream_write(stream, empty_buffer, count, NULL, 0, PA_SEEK_RELATIVE); g_rec_mutex_unlock(pulse_port_mutex); memset(next_empty_buffer, 0, count * sizeof(unsigned char)); remaining -= count; } } }else if(pulse_devin != NULL){ if(!empty_run){ pa_stream_peek(stream, &(pulse_devin->buffer[nth_buffer]), &count); g_atomic_int_set(&(pulse_port->is_empty), FALSE); } /* signal finish */ if(!no_event){ callback_finish_mutex = &(pulse_devin->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE); if((AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(pulse_devin->sync_flags)))) != 0){ g_cond_signal(&(pulse_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } g_rec_mutex_unlock(device_mutex); if(empty_run){ void *empty_buffer; void *next_empty_buffer; remaining = pa_stream_readable_size(stream); for(i = 0; remaining > 0; i++){ /* feed */ g_rec_mutex_lock(pulse_port_mutex); empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[nth_empty_buffer * count]); next_empty_buffer = &(((unsigned char *) pulse_port->empty_buffer)[next_nth_empty_buffer * count]); nth_empty_buffer = next_nth_empty_buffer; if(nth_empty_buffer >= 7){ next_nth_empty_buffer = 0; }else{ next_nth_empty_buffer = nth_empty_buffer + 1; } pulse_port->nth_empty_buffer = nth_empty_buffer; pa_stream_peek(stream, &empty_buffer, &count); g_rec_mutex_unlock(pulse_port_mutex); memset(next_empty_buffer, 0, count * sizeof(unsigned char)); remaining -= count; } } } g_atomic_int_dec_and_test(&(pulse_port->queued)); /* unref */ g_object_unref(audio_loop); } void ags_pulse_port_stream_underflow_callback(pa_stream *stream, AgsPulsePort *pulse_port) { AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; guint time_spent; GRecMutex *audio_loop_mutex; application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* get audio loop mutex */ audio_loop_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); /* increase time spent */ g_atomic_int_add(&(pulse_port->underflow), 1); /* unref */ g_object_unref(audio_loop); } #endif guint ags_pulse_port_get_fixed_size(AgsPulsePort *pulse_port) { AgsPulseDevout *pulse_devout; guint pcm_channels; guint buffer_size; guint format; guint word_size; guint fixed_size; GRecMutex *pulse_port_mutex; GRecMutex *pulse_devout_mutex; /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* get pulse devout */ g_rec_mutex_lock(pulse_port_mutex); pulse_devout = (AgsPulseDevout *) pulse_port->pulse_devout; if(pulse_port->use_cache){ buffer_size = pulse_port->cache_buffer_size; }else{ buffer_size = pulse_port->buffer_size; } g_rec_mutex_unlock(pulse_port_mutex); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* */ g_rec_mutex_lock(pulse_devout_mutex); pcm_channels = pulse_devout->pcm_channels; format = pulse_devout->format; g_rec_mutex_unlock(pulse_devout_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("pulse devout - unsupported format"); return(0); } fixed_size = pcm_channels * buffer_size * word_size; return(fixed_size); } void ags_pulse_port_set_samplerate(AgsPulsePort *pulse_port, guint samplerate) { guint fixed_size; GRecMutex *pulse_port_mutex; fixed_size = ags_pulse_port_get_fixed_size(pulse_port); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* lock pulse port */ g_rec_mutex_lock(pulse_port_mutex); #ifdef AGS_WITH_PULSE pulse_port->sample_spec->rate = samplerate; pulse_port->buffer_attr->fragsize = -1; pulse_port->buffer_attr->maxlength = -1; pulse_port->buffer_attr->minreq = fixed_size; pulse_port->buffer_attr->tlength = fixed_size; #endif g_rec_mutex_unlock(pulse_port_mutex); } void ags_pulse_port_set_buffer_size(AgsPulsePort *pulse_port, guint buffer_size) { guint fixed_size; GRecMutex *pulse_port_mutex; fixed_size = ags_pulse_port_get_fixed_size(pulse_port); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* lock pulse port */ g_rec_mutex_lock(pulse_port_mutex); #ifdef AGS_WITH_PULSE pulse_port->buffer_attr->fragsize = -1; pulse_port->buffer_attr->maxlength = -1; pulse_port->buffer_attr->minreq = fixed_size; pulse_port->buffer_attr->tlength = fixed_size; #endif pulse_port->buffer_size = buffer_size; if(pulse_port->empty_buffer != NULL){ free(pulse_port->empty_buffer); } pulse_port->empty_buffer = ags_stream_alloc(pulse_port->pcm_channels * buffer_size, pulse_port->format); g_rec_mutex_unlock(pulse_port_mutex); } void ags_pulse_port_set_pcm_channels(AgsPulsePort *pulse_port, guint pcm_channels) { guint fixed_size; GRecMutex *pulse_port_mutex; fixed_size = ags_pulse_port_get_fixed_size(pulse_port); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* lock pulse port */ g_rec_mutex_lock(pulse_port_mutex); pulse_port->pcm_channels = pcm_channels; #ifdef AGS_WITH_PULSE pulse_port->sample_spec->channels = pcm_channels; pulse_port->buffer_attr->fragsize = -1; pulse_port->buffer_attr->maxlength = -1; pulse_port->buffer_attr->minreq = fixed_size; pulse_port->buffer_attr->tlength = fixed_size; #endif if(pulse_port->empty_buffer != NULL){ free(pulse_port->empty_buffer); } pulse_port->empty_buffer = ags_stream_alloc(pcm_channels * pulse_port->buffer_size, pulse_port->format); g_rec_mutex_unlock(pulse_port_mutex); } void ags_pulse_port_set_format(AgsPulsePort *pulse_port, guint format) { guint fixed_size; GRecMutex *pulse_port_mutex; fixed_size = ags_pulse_port_get_fixed_size(pulse_port); /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* lock pulse port */ g_rec_mutex_lock(pulse_port_mutex); #ifdef AGS_WITH_PULSE switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { if(ags_endian_host_is_be()){ pulse_port->sample_spec->format = PA_SAMPLE_S16BE; }else{ pulse_port->sample_spec->format = PA_SAMPLE_S16LE; } pulse_port->cache[0] = (void *) realloc(pulse_port->cache[0], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) realloc(pulse_port->cache[1], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) realloc(pulse_port->cache[2], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) realloc(pulse_port->cache[3], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { if(ags_endian_host_is_be()){ pulse_port->sample_spec->format = PA_SAMPLE_S24_32BE; }else{ pulse_port->sample_spec->format = PA_SAMPLE_S24_32LE; } pulse_port->cache[0] = (void *) realloc(pulse_port->cache[0], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) realloc(pulse_port->cache[1], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) realloc(pulse_port->cache[2], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) realloc(pulse_port->cache[3], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { if(ags_endian_host_is_be()){ pulse_port->sample_spec->format = PA_SAMPLE_S32BE; }else{ pulse_port->sample_spec->format = PA_SAMPLE_S32LE; } pulse_port->cache[0] = (void *) realloc(pulse_port->cache[0], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) realloc(pulse_port->cache[1], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) realloc(pulse_port->cache[2], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) realloc(pulse_port->cache[3], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); } break; default: g_warning("pulse devout - unsupported format"); } pulse_port->buffer_attr->fragsize = -1; pulse_port->buffer_attr->maxlength = -1; pulse_port->buffer_attr->minreq = fixed_size; pulse_port->buffer_attr->tlength = fixed_size; #endif pulse_port->format = format; if(pulse_port->empty_buffer != NULL){ free(pulse_port->empty_buffer); } pulse_port->empty_buffer = ags_stream_alloc(pulse_port->pcm_channels * pulse_port->buffer_size, format); g_rec_mutex_unlock(pulse_port_mutex); } void ags_pulse_port_set_cache_buffer_size(AgsPulsePort *pulse_port, guint cache_buffer_size) { GRecMutex *pulse_port_mutex; /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* lock pulse port */ g_rec_mutex_lock(pulse_port_mutex); switch(pulse_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { pulse_port->cache[0] = (void *) realloc(pulse_port->cache[0], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) realloc(pulse_port->cache[1], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) realloc(pulse_port->cache[2], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) realloc(pulse_port->cache[3], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { pulse_port->cache[0] = (void *) realloc(pulse_port->cache[0], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) realloc(pulse_port->cache[1], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) realloc(pulse_port->cache[2], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) realloc(pulse_port->cache[3], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { pulse_port->cache[0] = (void *) realloc(pulse_port->cache[0], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[1] = (void *) realloc(pulse_port->cache[1], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[2] = (void *) realloc(pulse_port->cache[2], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); pulse_port->cache[3] = (void *) realloc(pulse_port->cache[3], pulse_port->pcm_channels * pulse_port->cache_buffer_size * sizeof(gint32)); } break; default: g_warning("pulse devout - unsupported format"); } g_rec_mutex_unlock(pulse_port_mutex); } /** * ags_pulse_port_get_latency: * @pulse_port: the #AgsPulsePort * * Gets latency. * * Since: 3.0.0 */ guint ags_pulse_port_get_latency(AgsPulsePort *pulse_port) { guint latency; GRecMutex *pulse_port_mutex; /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* lock pulse port */ g_rec_mutex_lock(pulse_port_mutex); latency = 0; #ifdef AGS_WITH_PULSE if(pulse_port->use_cache){ latency = (guint) floor((gdouble) G_TIME_SPAN_SECOND / (gdouble) pulse_port->sample_spec->rate * (gdouble) pulse_port->cache_buffer_size); }else{ latency = (guint) floor((gdouble) G_TIME_SPAN_SECOND / (gdouble) pulse_port->sample_spec->rate * (gdouble) pulse_port->buffer_size); } #endif g_rec_mutex_unlock(pulse_port_mutex); return(latency); } /** * ags_pulse_port_new: * @pulse_client: the #AgsPulseClient assigned to * * Create a new instance of #AgsPulsePort. * * Returns: the new #AgsPulsePort * * Since: 3.0.0 */ AgsPulsePort* ags_pulse_port_new(GObject *pulse_client) { AgsPulsePort *pulse_port; pulse_port = (AgsPulsePort *) g_object_new(AGS_TYPE_PULSE_PORT, "pulse-client", pulse_client, NULL); return(pulse_port); } gsequencer-3.1.3/ags/audio/pulse/ags_pulse_server.h0000644000175000017500000000773613607210263017341 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PULSE_SERVER_H__ #define __AGS_PULSE_SERVER_H__ #include #include #include #ifdef AGS_WITH_PULSE #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_PULSE_SERVER (ags_pulse_server_get_type()) #define AGS_PULSE_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PULSE_SERVER, AgsPulseServer)) #define AGS_PULSE_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PULSE_SERVER, AgsPulseServer)) #define AGS_IS_PULSE_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PULSE_SERVER)) #define AGS_IS_PULSE_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PULSE_SERVER)) #define AGS_PULSE_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PULSE_SERVER, AgsPulseServerClass)) #define AGS_PULSE_SERVER_GET_OBJ_MUTEX(obj) (&(((AgsPulseServer *) obj)->obj_mutex)) typedef struct _AgsPulseServer AgsPulseServer; typedef struct _AgsPulseServerClass AgsPulseServerClass; /** * AgsPulseServerFlags: * @AGS_PULSE_SERVER_ADDED_TO_REGISTRY: the pulseaudio server was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PULSE_SERVER_CONNECTED: indicates the server was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsPulseServer by * enable/disable as flags. */ typedef enum{ AGS_PULSE_SERVER_ADDED_TO_REGISTRY = 1, AGS_PULSE_SERVER_CONNECTED = 1 << 1, }AgsPulseServerFlags; struct _AgsPulseServer { GObject gobject; guint flags; pthread_mutex_t *obj_mutex; pthread_mutexattr_t *obj_mutexattr; volatile gboolean running; pthread_t *thread; AgsApplicationContext *application_context; AgsUUID *uuid; #ifdef AGS_WITH_PULSE pa_mainloop *main_loop; pa_mainloop_api *main_loop_api; #else gpointer main_loop; gpointer main_loop_api; #endif gchar *url; guint *port; guint port_count; guint n_soundcards; guint n_sequencers; GObject *default_soundcard; GObject *default_client; GList *client; }; struct _AgsPulseServerClass { GObjectClass gobject; }; GType ags_pulse_server_get_type(); gboolean ags_pulse_server_test_flags(AgsPulseServer *pulse_server, guint flags); void ags_pulse_server_set_flags(AgsPulseServer *pulse_server, guint flags); void ags_pulse_server_unset_flags(AgsPulseServer *pulse_server, guint flags); GList* ags_pulse_server_find_url(GList *pulse_server, gchar *url); GObject* ags_pulse_server_find_client(AgsPulseServer *pulse_server, gchar *client_uuid); GObject* ags_pulse_server_find_port(AgsPulseServer *pulse_server, gchar *port_uuid); void ags_pulse_server_add_client(AgsPulseServer *pulse_server, GObject *pulse_client); void ags_pulse_server_remove_client(AgsPulseServer *pulse_server, GObject *pulse_client); void ags_pulse_server_connect_client(AgsPulseServer *pulse_server); void ags_pulse_server_disconnect_client(AgsPulseServer *pulse_server); void ags_pulse_server_start_poll(AgsPulseServer *pulse_server); AgsPulseServer* ags_pulse_server_new(gchar *url); G_END_DECLS #endif /*__AGS_PULSE_SERVER_H__*/ gsequencer-3.1.3/ags/audio/pulse/ags_pulse_client.h0000644000175000017500000001005013607210263017270 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PULSE_CLIENT_H__ #define __AGS_PULSE_CLIENT_H__ #include #include #include #ifdef AGS_WITH_PULSE #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_PULSE_CLIENT (ags_pulse_client_get_type()) #define AGS_PULSE_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PULSE_CLIENT, AgsPulseClient)) #define AGS_PULSE_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PULSE_CLIENT, AgsPulseClient)) #define AGS_IS_PULSE_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PULSE_CLIENT)) #define AGS_IS_PULSE_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PULSE_CLIENT)) #define AGS_PULSE_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PULSE_CLIENT, AgsPulseClientClass)) #define AGS_PULSE_CLIENT_GET_OBJ_MUTEX(obj) (&(((AgsPulseClient *) obj)->obj_mutex)) typedef struct _AgsPulseClient AgsPulseClient; typedef struct _AgsPulseClientClass AgsPulseClientClass; /** * AgsPulseClientFlags: * @AGS_PULSE_CLIENT_ADDED_TO_REGISTRY: the PULSE client was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PULSE_CLIENT_CONNECTED: indicates the client was connected by calling #AgsConnectable::connect() * @AGS_PULSE_CLIENT_ACTIVATED: the client was activated * @AGS_PULSE_CLIENT_READY: the client is ready * * Enum values to control the behavior or indicate internal state of #AgsPulseClient by * enable/disable as flags. */ typedef enum{ AGS_PULSE_CLIENT_ADDED_TO_REGISTRY = 1, AGS_PULSE_CLIENT_CONNECTED = 1 << 1, AGS_PULSE_CLIENT_ACTIVATED = 1 << 2, AGS_PULSE_CLIENT_READY = 1 << 3, }AgsPulseClientFlags; struct _AgsPulseClient { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *pulse_server; AgsUUID *uuid; gchar *client_uuid; gchar *client_name; #ifdef AGS_WITH_PULSE pa_context *context; #else gpointer context; #endif GList *device; GList *port; }; struct _AgsPulseClientClass { GObjectClass gobject; }; GType ags_pulse_client_get_type(); gboolean ags_pulse_client_test_flags(AgsPulseClient *pulse_client, guint flags); void ags_pulse_client_set_flags(AgsPulseClient *pulse_client, guint flags); void ags_pulse_client_unset_flags(AgsPulseClient *pulse_client, guint flags); GList* ags_pulse_client_find_uuid(GList *pulse_client, gchar *client_uuid); GList* ags_pulse_client_find(GList *pulse_client, gchar *client_name); void ags_pulse_client_open(AgsPulseClient *pulse_client, gchar *client_name); void ags_pulse_client_close(AgsPulseClient *pulse_client); void ags_pulse_client_add_device(AgsPulseClient *pulse_client, GObject *pulse_device); void ags_pulse_client_remove_device(AgsPulseClient *pulse_client, GObject *pulse_device); void ags_pulse_client_add_port(AgsPulseClient *pulse_client, GObject *pulse_port); void ags_pulse_client_remove_port(AgsPulseClient *pulse_client, GObject *pulse_port); void ags_pulse_client_activate(AgsPulseClient *pulse_client); void ags_pulse_client_deactivate(AgsPulseClient *pulse_client); AgsPulseClient* ags_pulse_client_new(GObject *pulse_server); G_END_DECLS #endif /*__AGS_PULSE_CLIENT_H__*/ gsequencer-3.1.3/ags/audio/pulse/ags_pulse_devin.h0000644000175000017500000001455313607210263017133 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PULSE_DEVIN_H__ #define __AGS_PULSE_DEVIN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PULSE_DEVIN (ags_pulse_devin_get_type()) #define AGS_PULSE_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PULSE_DEVIN, AgsPulseDevin)) #define AGS_PULSE_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PULSE_DEVIN, AgsPulseDevin)) #define AGS_IS_PULSE_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PULSE_DEVIN)) #define AGS_IS_PULSE_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PULSE_DEVIN)) #define AGS_PULSE_DEVIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PULSE_DEVIN, AgsPulseDevinClass)) #define AGS_PULSE_DEVIN_GET_OBJ_MUTEX(obj) (&(((AgsPulseDevin *) obj)->obj_mutex)) typedef struct _AgsPulseDevin AgsPulseDevin; typedef struct _AgsPulseDevinClass AgsPulseDevinClass; /** * AgsPulseDevinFlags: * @AGS_PULSE_DEVIN_ADDED_TO_REGISTRY: the pulseaudio devin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PULSE_DEVIN_CONNECTED: indicates the pulseaudio devin was connected by calling #AgsConnectable::connect() * @AGS_PULSE_DEVIN_BUFFER0: ring-buffer 0 * @AGS_PULSE_DEVIN_BUFFER1: ring-buffer 1 * @AGS_PULSE_DEVIN_BUFFER2: ring-buffer 2 * @AGS_PULSE_DEVIN_BUFFER3: ring-buffer 3 * @AGS_PULSE_DEVIN_BUFFER4: ring-buffer 4 * @AGS_PULSE_DEVIN_BUFFER5: ring-buffer 5 * @AGS_PULSE_DEVIN_BUFFER6: ring-buffer 6 * @AGS_PULSE_DEVIN_BUFFER7: ring-buffer 7 * @AGS_PULSE_DEVIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_PULSE_DEVIN_RECORD: do capture * @AGS_PULSE_DEVIN_SHUTDOWN: stop capture * @AGS_PULSE_DEVIN_START_RECORD: capture starting * @AGS_PULSE_DEVIN_NONBLOCKING: do non-blocking calls * @AGS_PULSE_DEVIN_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsPulseDevin by * enable/disable as flags. */ typedef enum{ AGS_PULSE_DEVIN_ADDED_TO_REGISTRY = 1, AGS_PULSE_DEVIN_CONNECTED = 1 << 1, AGS_PULSE_DEVIN_BUFFER0 = 1 << 2, AGS_PULSE_DEVIN_BUFFER1 = 1 << 3, AGS_PULSE_DEVIN_BUFFER2 = 1 << 4, AGS_PULSE_DEVIN_BUFFER3 = 1 << 5, AGS_PULSE_DEVIN_BUFFER4 = 1 << 6, AGS_PULSE_DEVIN_BUFFER5 = 1 << 7, AGS_PULSE_DEVIN_BUFFER6 = 1 << 8, AGS_PULSE_DEVIN_BUFFER7 = 1 << 9, AGS_PULSE_DEVIN_ATTACK_FIRST = 1 << 10, AGS_PULSE_DEVIN_RECORD = 1 << 11, AGS_PULSE_DEVIN_SHUTDOWN = 1 << 12, AGS_PULSE_DEVIN_START_RECORD = 1 << 13, AGS_PULSE_DEVIN_NONBLOCKING = 1 << 14, AGS_PULSE_DEVIN_INITIALIZED = 1 << 15, }AgsPulseDevinFlags; /** * AgsPulseDevinSyncFlags: * @AGS_PULSE_DEVIN_PASS_THROUGH: do not sync * @AGS_PULSE_DEVIN_INITIAL_CALLBACK: initial callback * @AGS_PULSE_DEVIN_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_PULSE_DEVIN_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_PULSE_DEVIN_PASS_THROUGH = 1, AGS_PULSE_DEVIN_INITIAL_CALLBACK = 1 << 1, AGS_PULSE_DEVIN_CALLBACK_WAIT = 1 << 2, AGS_PULSE_DEVIN_CALLBACK_DONE = 1 << 3, AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT = 1 << 4, AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE = 1 << 5, }AgsPulseDevinSyncFlags; #define AGS_PULSE_DEVIN_ERROR (ags_pulse_devin_error_quark()) typedef enum{ AGS_PULSE_DEVIN_ERROR_LOCKED_SOUNDCARD, }AgsPulseDevinError; struct _AgsPulseDevin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; void **buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *pulse_client; gchar **port_name; GList *pulse_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; GObject *notify_soundcard; }; struct _AgsPulseDevinClass { GObjectClass gobject; }; GType ags_pulse_devin_get_type(); GQuark ags_pulse_devin_error_quark(); gboolean ags_pulse_devin_test_flags(AgsPulseDevin *pulse_devin, guint flags); void ags_pulse_devin_set_flags(AgsPulseDevin *pulse_devin, guint flags); void ags_pulse_devin_unset_flags(AgsPulseDevin *pulse_devin, guint flags); void ags_pulse_devin_switch_buffer_flag(AgsPulseDevin *pulse_devin); void ags_pulse_devin_adjust_delay_and_attack(AgsPulseDevin *pulse_devin); void ags_pulse_devin_realloc_buffer(AgsPulseDevin *pulse_devin); AgsPulseDevin* ags_pulse_devin_new(); G_END_DECLS #endif /*__AGS_PULSE_DEVIN_H__*/ gsequencer-3.1.3/ags/audio/pulse/ags_pulse_client.c0000644000175000017500000007602013613101164017270 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_pulse_client_class_init(AgsPulseClientClass *pulse_client); void ags_pulse_client_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pulse_client_init(AgsPulseClient *pulse_client); void ags_pulse_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pulse_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pulse_client_dispose(GObject *gobject); void ags_pulse_client_finalize(GObject *gobject); AgsUUID* ags_pulse_client_get_uuid(AgsConnectable *connectable); gboolean ags_pulse_client_has_resource(AgsConnectable *connectable); gboolean ags_pulse_client_is_ready(AgsConnectable *connectable); void ags_pulse_client_add_to_registry(AgsConnectable *connectable); void ags_pulse_client_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_pulse_client_list_resource(AgsConnectable *connectable); xmlNode* ags_pulse_client_xml_compose(AgsConnectable *connectable); void ags_pulse_client_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_pulse_client_is_connected(AgsConnectable *connectable); void ags_pulse_client_connect(AgsConnectable *connectable); void ags_pulse_client_disconnect(AgsConnectable *connectable); #ifdef AGS_WITH_PULSE void ags_pulse_client_state_callback(pa_context *c, AgsPulseClient *pulse_client); #endif /** * SECTION:ags_pulse_client * @short_description: pulseaudio connection * @title: AgsPulseClient * @section_id: * @include: ags/audio/pulse/ags_pulse_client.h * * The #AgsPulseClient communicates with a pulseaudio instance. */ enum{ PROP_0, PROP_PULSE_SERVER, PROP_CLIENT_NAME, PROP_DEVICE, PROP_PORT, }; static gpointer ags_pulse_client_parent_class = NULL; GType ags_pulse_client_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pulse_client = 0; static const GTypeInfo ags_pulse_client_info = { sizeof(AgsPulseClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pulse_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPulseClient), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pulse_client_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pulse_client_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pulse_client = g_type_register_static(G_TYPE_OBJECT, "AgsPulseClient", &ags_pulse_client_info, 0); g_type_add_interface_static(ags_type_pulse_client, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pulse_client); } return g_define_type_id__volatile; } void ags_pulse_client_class_init(AgsPulseClientClass *pulse_client) { GObjectClass *gobject; GParamSpec *param_spec; ags_pulse_client_parent_class = g_type_class_peek_parent(pulse_client); /* GObjectClass */ gobject = (GObjectClass *) pulse_client; gobject->set_property = ags_pulse_client_set_property; gobject->get_property = ags_pulse_client_get_property; gobject->dispose = ags_pulse_client_dispose; gobject->finalize = ags_pulse_client_finalize; /* properties */ /** * AgsPulseClient:pulse-server: * * The assigned #AgsPulseServer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pulse-server", i18n_pspec("assigned pulseaudio server"), i18n_pspec("The assigned pulseaudio server"), AGS_TYPE_PULSE_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_SERVER, param_spec); /** * AgsPulseClient:client-name: * * The pulseaudio client name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("client-name", i18n_pspec("the client name"), i18n_pspec("The client name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CLIENT_NAME, param_spec); /** * AgsPulseClient:device: (type GList(GObject)) (transfer full) * * The assigned devices. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("device", i18n_pspec("assigned device"), i18n_pspec("The assigned device"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsPulseClient:port: (type GList(AgsPulsePort)) (transfer full) * * The assigned ports. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port", i18n_pspec("assigned port"), i18n_pspec("The assigned port"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); } void ags_pulse_client_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_pulse_client_get_uuid; connectable->has_resource = ags_pulse_client_has_resource; connectable->is_ready = ags_pulse_client_is_ready; connectable->add_to_registry = ags_pulse_client_add_to_registry; connectable->remove_from_registry = ags_pulse_client_remove_from_registry; connectable->list_resource = ags_pulse_client_list_resource; connectable->xml_compose = ags_pulse_client_xml_compose; connectable->xml_parse = ags_pulse_client_xml_parse; connectable->is_connected = ags_pulse_client_is_connected; connectable->connect = ags_pulse_client_connect; connectable->disconnect = ags_pulse_client_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_pulse_client_init(AgsPulseClient *pulse_client) { /* flags */ pulse_client->flags = 0; /* client mutex */ g_rec_mutex_init(&(pulse_client->obj_mutex)); /* server */ pulse_client->pulse_server = NULL; /* uuid */ pulse_client->uuid = ags_uuid_alloc(); ags_uuid_generate(pulse_client->uuid); /* client name and uuid */ pulse_client->client_uuid = ags_id_generator_create_uuid(); pulse_client->client_name = NULL; /* client */ pulse_client->context = NULL; /* device */ pulse_client->device = NULL; pulse_client->port = NULL; } void ags_pulse_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPulseClient *pulse_client; GRecMutex *pulse_client_mutex; pulse_client = AGS_PULSE_CLIENT(gobject); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); switch(prop_id){ case PROP_PULSE_SERVER: { AgsPulseServer *pulse_server; pulse_server = (AgsPulseServer *) g_value_get_object(value); g_rec_mutex_lock(pulse_client_mutex); if(pulse_client->pulse_server == (GObject *) pulse_server){ g_rec_mutex_unlock(pulse_client_mutex); return; } if(pulse_client->pulse_server != NULL){ g_object_unref(pulse_client->pulse_server); } if(pulse_server != NULL){ g_object_ref(pulse_server); } pulse_client->pulse_server = (GObject *) pulse_server; g_rec_mutex_unlock(pulse_client_mutex); } break; case PROP_CLIENT_NAME: { char *client_name; client_name = (char *) g_value_get_string(value); g_rec_mutex_lock(pulse_client_mutex); g_free(pulse_client->client_name); pulse_client->client_name = g_strdup(client_name); g_rec_mutex_unlock(pulse_client_mutex); } break; case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(pulse_client_mutex); if(device == NULL || g_list_find(pulse_client->device, device) != NULL){ g_rec_mutex_unlock(pulse_client_mutex); return; } g_object_ref(device); pulse_client->device = g_list_prepend(pulse_client->device, device); g_rec_mutex_unlock(pulse_client_mutex); } break; case PROP_PORT: { GObject *port; port = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(pulse_client_mutex); if(!AGS_IS_PULSE_PORT(port) || g_list_find(pulse_client->port, port) != NULL){ g_rec_mutex_unlock(pulse_client_mutex); return; } g_object_ref(port); pulse_client->port = g_list_prepend(pulse_client->port, port); g_rec_mutex_unlock(pulse_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPulseClient *pulse_client; GRecMutex *pulse_client_mutex; pulse_client = AGS_PULSE_CLIENT(gobject); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); switch(prop_id){ case PROP_PULSE_SERVER: { g_rec_mutex_lock(pulse_client_mutex); g_value_set_object(value, pulse_client->pulse_server); g_rec_mutex_unlock(pulse_client_mutex); } break; case PROP_CLIENT_NAME: { g_rec_mutex_lock(pulse_client_mutex); g_value_set_string(value, pulse_client->client_name); g_rec_mutex_unlock(pulse_client_mutex); } break; case PROP_DEVICE: { g_rec_mutex_lock(pulse_client_mutex); g_value_set_pointer(value, g_list_copy_deep(pulse_client->device, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(pulse_client_mutex); } break; case PROP_PORT: { g_rec_mutex_lock(pulse_client_mutex); g_value_set_pointer(value, g_list_copy_deep(pulse_client->port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(pulse_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_client_dispose(GObject *gobject) { AgsPulseClient *pulse_client; GList *list; pulse_client = AGS_PULSE_CLIENT(gobject); /* pulse server */ if(pulse_client->pulse_server != NULL){ g_object_unref(pulse_client->pulse_server); pulse_client->pulse_server = NULL; } /* device */ if(pulse_client->device != NULL){ list = pulse_client->device; while(list != NULL){ g_object_set(G_OBJECT(list->data), "pulse-client", NULL, NULL); list = list->next; } g_list_free_full(pulse_client->device, g_object_unref); pulse_client->device = NULL; } /* port */ if(pulse_client->port != NULL){ list = pulse_client->port; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(pulse_client->port, g_object_unref); pulse_client->port = NULL; } /* call parent */ G_OBJECT_CLASS(ags_pulse_client_parent_class)->dispose(gobject); } void ags_pulse_client_finalize(GObject *gobject) { AgsPulseClient *pulse_client; pulse_client = AGS_PULSE_CLIENT(gobject); /* pulse server */ if(pulse_client->pulse_server != NULL){ g_object_unref(pulse_client->pulse_server); } /* device */ if(pulse_client->device != NULL){ g_list_free_full(pulse_client->device, g_object_unref); } /* port */ if(pulse_client->port != NULL){ g_list_free_full(pulse_client->port, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_pulse_client_parent_class)->finalize(gobject); } AgsUUID* ags_pulse_client_get_uuid(AgsConnectable *connectable) { AgsPulseClient *pulse_client; AgsUUID *ptr; GRecMutex *pulse_client_mutex; pulse_client = AGS_PULSE_CLIENT(connectable); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* get UUID */ g_rec_mutex_lock(pulse_client_mutex); ptr = pulse_client->uuid; g_rec_mutex_unlock(pulse_client_mutex); return(ptr); } gboolean ags_pulse_client_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_pulse_client_is_ready(AgsConnectable *connectable) { AgsPulseClient *pulse_client; gboolean is_ready; pulse_client = AGS_PULSE_CLIENT(connectable); /* check is added */ is_ready = ags_pulse_client_test_flags(pulse_client, AGS_PULSE_CLIENT_ADDED_TO_REGISTRY); return(is_ready); } void ags_pulse_client_add_to_registry(AgsConnectable *connectable) { AgsPulseClient *pulse_client; if(ags_connectable_is_ready(connectable)){ return; } pulse_client = AGS_PULSE_CLIENT(connectable); ags_pulse_client_set_flags(pulse_client, AGS_PULSE_CLIENT_ADDED_TO_REGISTRY); } void ags_pulse_client_remove_from_registry(AgsConnectable *connectable) { AgsPulseClient *pulse_client; if(!ags_connectable_is_ready(connectable)){ return; } pulse_client = AGS_PULSE_CLIENT(connectable); ags_pulse_client_unset_flags(pulse_client, AGS_PULSE_CLIENT_ADDED_TO_REGISTRY); } xmlNode* ags_pulse_client_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_pulse_client_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_pulse_client_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_pulse_client_is_connected(AgsConnectable *connectable) { AgsPulseClient *pulse_client; gboolean is_connected; pulse_client = AGS_PULSE_CLIENT(connectable); /* check is connected */ is_connected = ags_pulse_client_test_flags(pulse_client, AGS_PULSE_CLIENT_CONNECTED); return(is_connected); } void ags_pulse_client_connect(AgsConnectable *connectable) { AgsPulseClient *pulse_client; GList *list_start, *list; GRecMutex *pulse_client_mutex; if(ags_connectable_is_connected(connectable)){ return; } pulse_client = AGS_PULSE_CLIENT(connectable); ags_pulse_client_set_flags(pulse_client, AGS_PULSE_CLIENT_CONNECTED); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* port */ g_rec_mutex_lock(pulse_client_mutex); list = list_start = g_list_copy(pulse_client->port); g_rec_mutex_unlock(pulse_client_mutex); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_pulse_client_disconnect(AgsConnectable *connectable) { AgsPulseClient *pulse_client; GList *list_start, *list; GRecMutex *pulse_client_mutex; if(!ags_connectable_is_connected(connectable)){ return; } pulse_client = AGS_PULSE_CLIENT(connectable); ags_pulse_client_unset_flags(pulse_client, AGS_PULSE_CLIENT_CONNECTED); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* port */ g_rec_mutex_lock(pulse_client_mutex); list = list_start = g_list_copy(pulse_client->port); g_rec_mutex_unlock(pulse_client_mutex); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_pulse_client_test_flags: * @pulse_client: the #AgsPulseClient * @flags: the flags * * Test @flags to be set on @pulse_client. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_pulse_client_test_flags(AgsPulseClient *pulse_client, guint flags) { gboolean retval; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return(FALSE); } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* test */ g_rec_mutex_lock(pulse_client_mutex); retval = (flags & (pulse_client->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_client_mutex); return(retval); } /** * ags_pulse_client_set_flags: * @pulse_client: the #AgsPulseClient * @flags: see #AgsPulseClientFlags-enum * * Enable a feature of @pulse_client. * * Since: 3.0.0 */ void ags_pulse_client_set_flags(AgsPulseClient *pulse_client, guint flags) { GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(pulse_client_mutex); pulse_client->flags |= flags; g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_unset_flags: * @pulse_client: the #AgsPulseClient * @flags: see #AgsPulseClientFlags-enum * * Disable a feature of @pulse_client. * * Since: 3.0.0 */ void ags_pulse_client_unset_flags(AgsPulseClient *pulse_client, guint flags) { GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(pulse_client_mutex); pulse_client->flags &= (~flags); g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_find_uuid: * @pulse_client: (element-type AgsAudio.PulseClient) (transfer none): the #GList-struct containing #AgsPulseClient * @client_uuid: the client uuid to find * * Finds next match of @client_uuid in @pulse_client. * * Returns: (element-type AgsAudio.PulseClient) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_pulse_client_find_uuid(GList *pulse_client, gchar *client_uuid) { AgsPulseClient *current_pulse_client; gboolean success; GRecMutex *pulse_client_mutex; while(pulse_client != NULL){ current_pulse_client = AGS_PULSE_CLIENT(pulse_client->data); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(current_pulse_client); /* check uuid */ g_rec_mutex_lock(pulse_client_mutex); success = (current_pulse_client->context != NULL && !g_ascii_strcasecmp(current_pulse_client->client_uuid, client_uuid)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_client_mutex); if(success){ return(pulse_client); } pulse_client = pulse_client->next; } return(NULL); } /** * ags_pulse_client_find: * @pulse_client: (element-type AgsAudio.PulseClient) (transfer none): the #GList-struct containing #AgsPulseClient * @client_name: the client name to find * * Finds next match of @client_name in @pulse_client. * * Returns: (element-type AgsAudio.PulseClient) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_pulse_client_find(GList *pulse_client, gchar *client_name) { AgsPulseClient *current_pulse_client; gboolean success; GRecMutex *pulse_client_mutex; while(pulse_client != NULL){ current_pulse_client = AGS_PULSE_CLIENT(pulse_client->data); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(current_pulse_client); /* check client name */ g_rec_mutex_lock(pulse_client_mutex); success = (current_pulse_client->context != NULL && !g_ascii_strcasecmp(current_pulse_client->client_name, client_name)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_client_mutex); if(success){ return(pulse_client); } pulse_client = pulse_client->next; } return(NULL); } #ifdef AGS_WITH_PULSE void ags_pulse_client_state_callback(pa_context *c, AgsPulseClient *pulse_client) { pa_context_state_t state; GRecMutex *pulse_client_mutex; state = pa_context_get_state(c); /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); switch(state){ case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_FAILED: case PA_CONTEXT_TERMINATED: g_warning("pulseaudio not running"); break; case PA_CONTEXT_READY: g_rec_mutex_lock(pulse_client_mutex); pulse_client->flags |= AGS_PULSE_CLIENT_READY; g_rec_mutex_unlock(pulse_client_mutex); break; } } #endif /** * ags_pulse_client_open: * @pulse_client: the #AgsPulseClient * @client_name: the client's name * * Open the pulseaudio client's connection and read uuid. * * Since: 3.0.0 */ void ags_pulse_client_open(AgsPulseClient *pulse_client, gchar *client_name) { AgsPulseServer *pulse_server; #ifdef AGS_WITH_PULSE pa_context *context; pa_mainloop *main_loop; pa_mainloop_api *main_loop_api; #else gpointer context; gpointer main_loop; gpointer main_loop_api; #endif gchar *client_uuid; GRecMutex *pulse_server_mutex; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client) || client_name == NULL){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* check already open */ g_rec_mutex_lock(pulse_client_mutex); if(pulse_client->context != NULL){ g_rec_mutex_unlock(pulse_client_mutex); g_message("Advanced Gtk+ Sequencer pulseaudio client already open"); return; } pulse_server = (AgsPulseServer *) pulse_client->pulse_server; g_rec_mutex_unlock(pulse_client_mutex); g_message("Advanced Gtk+ Sequencer open pulseaudio client"); g_object_set(pulse_client, "client-name", client_name, NULL); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get main loop API */ g_rec_mutex_lock(pulse_server_mutex); main_loop = pulse_server->main_loop; main_loop_api = pulse_server->main_loop_api; g_rec_mutex_unlock(pulse_server_mutex); /* new context */ g_rec_mutex_lock(pulse_client_mutex); #ifdef AGS_WITH_PULSE context = pulse_client->context = pa_context_new(main_loop_api, client_name); #else context = pulse_client->context = NULL; #endif g_rec_mutex_unlock(pulse_client_mutex); if(context != NULL){ #ifdef AGS_WITH_PULSE AgsLog *log; gint64 ready_timeout; pa_context_connect(context, NULL, 0, NULL); pa_context_set_state_callback(context, ags_pulse_client_state_callback, pulse_client); log = (GObject *) ags_log_get_instance(); ags_log_add_message(log, g_strdup("* start pulseaudio")); ready_timeout = g_get_monotonic_time() + 20 * G_USEC_PER_SEC; while(!ags_pulse_client_test_flags(pulse_client, AGS_PULSE_CLIENT_READY)){ if(g_get_monotonic_time() > ready_timeout){ g_critical("Advanced Gtk+ Sequencer open pulseaudio client - timeout"); break; } if(!ags_pulse_client_test_flags(pulse_client, AGS_PULSE_CLIENT_READY)){ pa_mainloop_iterate(main_loop, FALSE, NULL); g_usleep(125); } } #endif } } /** * ags_pulse_client_close: * @pulse_client: the #AgsPulseClient * * Close the pulseaudio client's connection. * * Since: 3.0.0 */ void ags_pulse_client_close(AgsPulseClient *pulse_client) { AgsPulseServer *pulse_server; #ifdef AGS_WITH_PULSE pa_context *context; #else gpointer context; #endif GList *start_device; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* check already closed */ g_rec_mutex_lock(pulse_client_mutex); if(pulse_client->context == NULL){ g_rec_mutex_unlock(pulse_client_mutex); g_message("Advanced Gtk+ Sequencer pulseaudio client already closed"); return; } pulse_server = (AgsPulseServer *) pulse_client->pulse_server; g_rec_mutex_unlock(pulse_client_mutex); g_message("Advanced Gtk+ Sequencer close pulseaudio client"); /* unset context */ #ifdef AGS_WITH_PULSE g_rec_mutex_lock(pulse_client_mutex); context = pulse_client->context; g_rec_mutex_unlock(pulse_client_mutex); pa_context_disconnect(context); g_rec_mutex_lock(pulse_client_mutex); pulse_client->context = NULL; g_rec_mutex_unlock(pulse_client_mutex); #endif g_rec_mutex_lock(pulse_client_mutex); g_list_free_full(pulse_client->device, g_object_unref); pulse_client->device = NULL; g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_activate: * @pulse_client: the #AgsPulseClient * * Activate client. * * Since: 3.0.0 */ void ags_pulse_client_activate(AgsPulseClient *pulse_client) { #ifdef AGS_WITH_PULSE pa_context *context; #else gpointer context; #endif GList *port_start, *port; int ret; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* get context */ g_rec_mutex_lock(pulse_client_mutex); context = pulse_client->context; g_rec_mutex_unlock(pulse_client_mutex); if(ags_pulse_client_test_flags(pulse_client, AGS_PULSE_CLIENT_ACTIVATED) || context == NULL){ return; } g_rec_mutex_lock(pulse_client_mutex); port = port_start = g_list_copy(pulse_client->port); g_rec_mutex_unlock(pulse_client_mutex); while(port != NULL){ gchar *port_name; //TODO:JK: make thread-safe g_object_get(port->data, "port-name", &port_name, NULL); ags_pulse_port_register(port->data, port_name, (ags_pulse_port_test_flags(port->data, AGS_PULSE_PORT_IS_AUDIO) ? TRUE: FALSE), (ags_pulse_port_test_flags(port->data, AGS_PULSE_PORT_IS_MIDI) ? TRUE: FALSE), (ags_pulse_port_test_flags(port->data, AGS_PULSE_PORT_IS_OUTPUT) ? TRUE: FALSE)); g_free(port_name); port = port->next; } ags_pulse_client_set_flags(pulse_client, AGS_PULSE_CLIENT_ACTIVATED); g_list_free(port_start); } /** * ags_pulse_client_deactivate: * @pulse_client: the #AgsPulseClient * * Deactivate client. * * Since: 3.0.0 */ void ags_pulse_client_deactivate(AgsPulseClient *pulse_client) { #ifdef AGS_WITH_PULSE pa_context *context; #else gpointer context; #endif GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* get context */ g_rec_mutex_lock(pulse_client_mutex); context = pulse_client->context; g_rec_mutex_unlock(pulse_client_mutex); if(context == NULL){ return; } ags_pulse_client_unset_flags(pulse_client, (AGS_PULSE_CLIENT_ACTIVATED | AGS_PULSE_CLIENT_READY)); } /** * ags_pulse_client_add_device: * @pulse_client: the #AgsPulseClient * @pulse_device: an #AgsPulseDevout or #AgsPulseDevin * * Add @pulse_device to @pulse_client. * * Since: 3.0.0 */ void ags_pulse_client_add_device(AgsPulseClient *pulse_client, GObject *pulse_device) { GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client) || (!AGS_IS_PULSE_DEVOUT(pulse_device) && !AGS_IS_PULSE_DEVIN(pulse_device))){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* add device */ g_rec_mutex_lock(pulse_client_mutex); if(g_list_find(pulse_client->device, pulse_device) == NULL){ g_object_ref(pulse_device); pulse_client->device = g_list_prepend(pulse_client->device, pulse_device); } g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_remove_device: * @pulse_client: the #AgsPulseClient * @pulse_device: an #AgsPulseDevout or #AgsPulseDevin * * Remove @pulse_device from @pulse_client. * * Since: 3.0.0 */ void ags_pulse_client_remove_device(AgsPulseClient *pulse_client, GObject *pulse_device) { GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* remove */ g_rec_mutex_lock(pulse_client_mutex); if(g_list_find(pulse_client->device, pulse_device) != NULL){ pulse_client->device = g_list_remove(pulse_client->device, pulse_device); g_object_unref(pulse_device); } g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_add_port: * @pulse_client: the #AgsPulseClient * @pulse_port: an #AgsPulsePort * * Add @pulse_port to @pulse_client. * * Since: 3.0.0 */ void ags_pulse_client_add_port(AgsPulseClient *pulse_client, GObject *pulse_port) { GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client) || !AGS_IS_PULSE_PORT(pulse_port)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* add port */ g_rec_mutex_lock(pulse_client_mutex); if(g_list_find(pulse_client->port, pulse_port) == NULL){ g_object_ref(pulse_port); pulse_client->port = g_list_prepend(pulse_client->port, pulse_port); } g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_remove_port: * @pulse_client: the #AgsPulseClient * @pulse_port: an #AgsPulsePort * * Remove @pulse_port from @pulse_client. * * Since: 3.0.0 */ void ags_pulse_client_remove_port(AgsPulseClient *pulse_client, GObject *pulse_port) { GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* remove port */ g_rec_mutex_lock(pulse_client_mutex); if(g_list_find(pulse_client->port, pulse_port) != NULL){ pulse_client->port = g_list_remove(pulse_client->port, pulse_port); g_object_unref(pulse_port); } g_rec_mutex_unlock(pulse_client_mutex); } /** * ags_pulse_client_new: * @pulse_server: the assigned #AgsPulseServer * * Create a new instance of #AgsPulseClient. * * Returns: the new #AgsPulseClient * * Since: 3.0.0 */ AgsPulseClient* ags_pulse_client_new(GObject *pulse_server) { AgsPulseClient *pulse_client; pulse_client = (AgsPulseClient *) g_object_new(AGS_TYPE_PULSE_CLIENT, "pulse-server", pulse_server, NULL); return(pulse_client); } gsequencer-3.1.3/ags/audio/pulse/ags_pulse_server.c0000644000175000017500000012670713614062654017343 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_pulse_server_class_init(AgsPulseServerClass *pulse_server); void ags_pulse_server_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pulse_server_sound_server_interface_init(AgsSoundServerInterface *sound_server); void ags_pulse_server_init(AgsPulseServer *pulse_server); void ags_pulse_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pulse_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pulse_server_dispose(GObject *gobject); void ags_pulse_server_finalize(GObject *gobject); AgsUUID* ags_pulse_server_get_uuid(AgsConnectable *connectable); gboolean ags_pulse_server_has_resource(AgsConnectable *connectable); gboolean ags_pulse_server_is_ready(AgsConnectable *connectable); void ags_pulse_server_add_to_registry(AgsConnectable *connectable); void ags_pulse_server_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_pulse_server_list_resource(AgsConnectable *connectable); xmlNode* ags_pulse_server_xml_compose(AgsConnectable *connectable); void ags_pulse_server_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_pulse_server_is_connected(AgsConnectable *connectable); void ags_pulse_server_connect(AgsConnectable *connectable); void ags_pulse_server_disconnect(AgsConnectable *connectable); void ags_pulse_server_set_url(AgsSoundServer *sound_server, gchar *url); gchar* ags_pulse_server_get_url(AgsSoundServer *sound_server); void ags_pulse_server_set_ports(AgsSoundServer *sound_server, guint *ports, guint port_count); guint* ags_pulse_server_get_ports(AgsSoundServer *sound_server, guint *port_count); void ags_pulse_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard); GList* ags_pulse_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid); void ags_pulse_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer); GList* ags_pulse_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid); GObject* ags_pulse_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output); void ags_pulse_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard); GObject* ags_pulse_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output); void ags_pulse_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer); void* ags_pulse_server_do_poll_loop(void *ptr); /** * SECTION:ags_pulse_server * @short_description: pulseaudio instance * @title: AgsPulseServer * @section_id: * @include: ags/audio/pulse/ags_pulse_server.h * * The #AgsPulseServer is an object to represent a running pulseaudio instance. */ enum{ PROP_0, PROP_URL, PROP_DEFAULT_SOUNDCARD, PROP_DEFAULT_PULSE_CLIENT, PROP_PULSE_CLIENT, }; static gpointer ags_pulse_server_parent_class = NULL; GType ags_pulse_server_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pulse_server = 0; static const GTypeInfo ags_pulse_server_info = { sizeof(AgsPulseServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pulse_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPulseServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pulse_server_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pulse_server_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_server_interface_info = { (GInterfaceInitFunc) ags_pulse_server_sound_server_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pulse_server = g_type_register_static(G_TYPE_OBJECT, "AgsPulseServer", &ags_pulse_server_info, 0); g_type_add_interface_static(ags_type_pulse_server, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_pulse_server, AGS_TYPE_SOUND_SERVER, &ags_sound_server_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pulse_server); } return g_define_type_id__volatile; } void ags_pulse_server_class_init(AgsPulseServerClass *pulse_server) { GObjectClass *gobject; GParamSpec *param_spec; ags_pulse_server_parent_class = g_type_class_peek_parent(pulse_server); /* GObjectClass */ gobject = (GObjectClass *) pulse_server; gobject->set_property = ags_pulse_server_set_property; gobject->get_property = ags_pulse_server_get_property; gobject->dispose = ags_pulse_server_dispose; gobject->finalize = ags_pulse_server_finalize; /* properties */ /** * AgsPulseServer:url: * * The assigned URL. * * Since: 3.0.0 */ param_spec = g_param_spec_string("url", i18n_pspec("the URL"), i18n_pspec("The URL"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URL, param_spec); /** * AgsPulseServer:default-soundcard: * * The default soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-soundcard", i18n_pspec("default soundcard"), i18n_pspec("The default soundcard"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_SOUNDCARD, param_spec); /** * AgsPulseServer:default-pulse-client: * * The default pulse client. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-pulse-client", i18n_pspec("default pulse client"), i18n_pspec("The default pulse client"), AGS_TYPE_PULSE_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_PULSE_CLIENT, param_spec); /** * AgsPulseServer:pulse-client: (type GList(AgsPulseClient)) (transfer full) * * The pulse client list. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("pulse-client", i18n_pspec("pulse client list"), i18n_pspec("The pulse client list"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_CLIENT, param_spec); } void ags_pulse_server_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_pulse_server_get_uuid; connectable->has_resource = ags_pulse_server_has_resource; connectable->is_ready = ags_pulse_server_is_ready; connectable->add_to_registry = ags_pulse_server_add_to_registry; connectable->remove_from_registry = ags_pulse_server_remove_from_registry; connectable->list_resource = ags_pulse_server_list_resource; connectable->xml_compose = ags_pulse_server_xml_compose; connectable->xml_parse = ags_pulse_server_xml_parse; connectable->is_connected = ags_pulse_server_is_connected; connectable->connect = ags_pulse_server_connect; connectable->disconnect = ags_pulse_server_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_pulse_server_sound_server_interface_init(AgsSoundServerInterface *sound_server) { sound_server->set_url = ags_pulse_server_set_url; sound_server->get_url = ags_pulse_server_get_url; sound_server->set_ports = ags_pulse_server_set_ports; sound_server->get_ports = ags_pulse_server_get_ports; sound_server->set_soundcard = ags_pulse_server_set_soundcard; sound_server->get_soundcard = ags_pulse_server_get_soundcard; sound_server->set_sequencer = ags_pulse_server_set_sequencer; sound_server->get_sequencer = ags_pulse_server_get_sequencer; sound_server->register_soundcard = ags_pulse_server_register_soundcard; sound_server->unregister_soundcard = ags_pulse_server_unregister_soundcard; sound_server->register_sequencer = ags_pulse_server_register_sequencer; sound_server->unregister_sequencer = ags_pulse_server_unregister_sequencer; } void ags_pulse_server_init(AgsPulseServer *pulse_server) { /* flags */ pulse_server->flags = 0; /* server mutex */ g_rec_mutex_init(&(pulse_server->obj_mutex)); g_atomic_int_set(&(pulse_server->running), TRUE); pulse_server->thread = NULL; /* uuid */ pulse_server->uuid = ags_uuid_alloc(); ags_uuid_generate(pulse_server->uuid); #ifdef AGS_WITH_PULSE pulse_server->main_loop = NULL; pulse_server->main_loop_api = NULL; #else pulse_server->main_loop = NULL; pulse_server->main_loop_api = NULL; #endif pulse_server->url = NULL; pulse_server->port = NULL; pulse_server->port_count = 0; pulse_server->n_soundcards = 0; pulse_server->n_sequencers = 0; pulse_server->default_soundcard = NULL; pulse_server->default_client = NULL; pulse_server->client = NULL; } void ags_pulse_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPulseServer *pulse_server; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(gobject); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); switch(prop_id){ case PROP_URL: { gchar *url; url = g_value_get_string(value); g_rec_mutex_lock(pulse_server_mutex); if(pulse_server->url == url){ g_rec_mutex_unlock(pulse_server_mutex); return; } if(pulse_server->url != NULL){ g_free(pulse_server->url); } pulse_server->url = g_strdup(url); g_rec_mutex_unlock(pulse_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { GObject *default_soundcard; default_soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(pulse_server_mutex); if(pulse_server->default_soundcard == (GObject *) default_soundcard){ g_rec_mutex_unlock(pulse_server_mutex); return; } if(pulse_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(pulse_server->default_soundcard)); } if(default_soundcard != NULL){ g_object_ref(G_OBJECT(default_soundcard)); } pulse_server->default_soundcard = (GObject *) default_soundcard; g_rec_mutex_unlock(pulse_server_mutex); } break; case PROP_DEFAULT_PULSE_CLIENT: { AgsPulseClient *default_client; default_client = (AgsPulseClient *) g_value_get_object(value); g_rec_mutex_lock(pulse_server_mutex); if(pulse_server->default_client == (GObject *) default_client){ g_rec_mutex_unlock(pulse_server_mutex); return; } if(pulse_server->default_client != NULL){ g_object_unref(G_OBJECT(pulse_server->default_client)); } if(default_client != NULL){ g_object_ref(G_OBJECT(default_client)); } pulse_server->default_client = (GObject *) default_client; g_rec_mutex_unlock(pulse_server_mutex); } break; case PROP_PULSE_CLIENT: { GObject *client; client = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(pulse_server_mutex); if(!AGS_IS_PULSE_CLIENT(client) || g_list_find(pulse_server->client, client) != NULL){ g_rec_mutex_unlock(pulse_server_mutex); return; } g_object_ref(G_OBJECT(client)); pulse_server->client = g_list_prepend(pulse_server->client, client); g_rec_mutex_unlock(pulse_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPulseServer *pulse_server; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(gobject); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); switch(prop_id){ case PROP_URL: { g_rec_mutex_lock(pulse_server_mutex); g_value_set_string(value, pulse_server->url); g_rec_mutex_unlock(pulse_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { g_rec_mutex_lock(pulse_server_mutex); g_value_set_object(value, pulse_server->default_soundcard); g_rec_mutex_unlock(pulse_server_mutex); } break; case PROP_DEFAULT_PULSE_CLIENT: { g_rec_mutex_lock(pulse_server_mutex); g_value_set_object(value, pulse_server->default_client); g_rec_mutex_unlock(pulse_server_mutex); } break; case PROP_PULSE_CLIENT: { g_rec_mutex_lock(pulse_server_mutex); g_value_set_pointer(value, g_list_copy_deep(pulse_server->client, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(pulse_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_server_dispose(GObject *gobject) { AgsPulseServer *pulse_server; GList *list; pulse_server = AGS_PULSE_SERVER(gobject); /* default soundcard */ if(pulse_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(pulse_server->default_soundcard)); pulse_server->default_soundcard = NULL; } /* default client */ if(pulse_server->default_client != NULL){ g_object_unref(G_OBJECT(pulse_server->default_client)); pulse_server->default_client = NULL; } /* client */ if(pulse_server->client != NULL){ list = pulse_server->client; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(pulse_server->client, g_object_unref); pulse_server->client = NULL; } /* call parent */ G_OBJECT_CLASS(ags_pulse_server_parent_class)->dispose(gobject); } void ags_pulse_server_finalize(GObject *gobject) { AgsPulseServer *pulse_server; pulse_server = AGS_PULSE_SERVER(gobject); /* url */ g_free(pulse_server->url); /* default soundcard */ if(pulse_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(pulse_server->default_soundcard)); } /* default client */ if(pulse_server->default_client != NULL){ g_object_unref(G_OBJECT(pulse_server->default_client)); } /* client */ if(pulse_server->client != NULL){ g_list_free_full(pulse_server->client, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_pulse_server_parent_class)->finalize(gobject); } AgsUUID* ags_pulse_server_get_uuid(AgsConnectable *connectable) { AgsPulseServer *pulse_server; AgsUUID *ptr; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(connectable); /* get pulse server signal mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get UUID */ g_rec_mutex_lock(pulse_server_mutex); ptr = pulse_server->uuid; g_rec_mutex_unlock(pulse_server_mutex); return(ptr); } gboolean ags_pulse_server_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_pulse_server_is_ready(AgsConnectable *connectable) { AgsPulseServer *pulse_server; gboolean is_ready; pulse_server = AGS_PULSE_SERVER(connectable); /* check is added */ is_ready = ags_pulse_server_test_flags(pulse_server, AGS_PULSE_SERVER_ADDED_TO_REGISTRY); return(is_ready); } void ags_pulse_server_add_to_registry(AgsConnectable *connectable) { AgsPulseServer *pulse_server; if(ags_connectable_is_ready(connectable)){ return; } pulse_server = AGS_PULSE_SERVER(connectable); ags_pulse_server_set_flags(pulse_server, AGS_PULSE_SERVER_ADDED_TO_REGISTRY); } void ags_pulse_server_remove_from_registry(AgsConnectable *connectable) { AgsPulseServer *pulse_server; if(!ags_connectable_is_ready(connectable)){ return; } pulse_server = AGS_PULSE_SERVER(connectable); ags_pulse_server_unset_flags(pulse_server, AGS_PULSE_SERVER_ADDED_TO_REGISTRY); } xmlNode* ags_pulse_server_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_pulse_server_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_pulse_server_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_pulse_server_is_connected(AgsConnectable *connectable) { AgsPulseServer *pulse_server; gboolean is_connected; pulse_server = AGS_PULSE_SERVER(connectable); /* check is connected */ is_connected = ags_pulse_server_test_flags(pulse_server, AGS_PULSE_SERVER_CONNECTED); return(is_connected); } void ags_pulse_server_connect(AgsConnectable *connectable) { AgsPulseServer *pulse_server; GList *list_start, *list; GRecMutex *pulse_server_mutex; if(ags_connectable_is_connected(connectable)){ return; } pulse_server = AGS_PULSE_SERVER(connectable); ags_pulse_server_set_flags(pulse_server, AGS_PULSE_SERVER_CONNECTED); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); list = list_start = g_list_copy(pulse_server->client); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_pulse_server_disconnect(AgsConnectable *connectable) { AgsPulseServer *pulse_server; GList *list_start, *list; GRecMutex *pulse_server_mutex; if(!ags_connectable_is_connected(connectable)){ return; } pulse_server = AGS_PULSE_SERVER(connectable); ags_pulse_server_unset_flags(pulse_server, AGS_PULSE_SERVER_CONNECTED); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* client */ list = list_start = g_list_copy(pulse_server->client); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_pulse_server_test_flags: * @pulse_server: the #AgsPulseServer * @flags: the flags * * Test @flags to be set on @pulse_server. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_pulse_server_test_flags(AgsPulseServer *pulse_server, guint flags) { gboolean retval; GRecMutex *pulse_server_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return(FALSE); } /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* test */ g_rec_mutex_lock(pulse_server_mutex); retval = (flags & (pulse_server->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_server_mutex); return(retval); } /** * ags_pulse_server_set_flags: * @pulse_server: the #AgsPulseServer * @flags: see #AgsPulseServerFlags-enum * * Enable a feature of @pulse_server. * * Since: 3.0.0 */ void ags_pulse_server_set_flags(AgsPulseServer *pulse_server, guint flags) { GRecMutex *pulse_server_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return; } /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->flags |= flags; g_rec_mutex_unlock(pulse_server_mutex); } /** * ags_pulse_server_unset_flags: * @pulse_server: the #AgsPulseServer * @flags: see #AgsPulseServerFlags-enum * * Disable a feature of @pulse_server. * * Since: 3.0.0 */ void ags_pulse_server_unset_flags(AgsPulseServer *pulse_server, guint flags) { GRecMutex *pulse_server_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return; } /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->flags &= (~flags); g_rec_mutex_unlock(pulse_server_mutex); } void ags_pulse_server_set_url(AgsSoundServer *sound_server, gchar *url) { AgsPulseServer *pulse_server; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(sound_server); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* set URL */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->url = g_strdup(url); g_rec_mutex_unlock(pulse_server_mutex); } gchar* ags_pulse_server_get_url(AgsSoundServer *sound_server) { AgsPulseServer *pulse_server; gchar *url; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(sound_server); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* set URL */ g_rec_mutex_lock(pulse_server_mutex); url = pulse_server->url; g_rec_mutex_unlock(pulse_server_mutex); return(url); } void ags_pulse_server_set_ports(AgsSoundServer *sound_server, guint *port, guint port_count) { AgsPulseServer *pulse_server; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(sound_server); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* set ports */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->port = port; pulse_server->port_count = port_count; g_rec_mutex_unlock(pulse_server_mutex); } guint* ags_pulse_server_get_ports(AgsSoundServer *sound_server, guint *port_count) { AgsPulseServer *pulse_server; guint *port; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(sound_server); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get ports */ g_rec_mutex_lock(pulse_server_mutex); if(port_count != NULL){ *port_count = AGS_PULSE_SERVER(sound_server)->port_count; } port = pulse_server->port; g_rec_mutex_unlock(pulse_server_mutex); return(port); } void ags_pulse_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard) { AgsPulseServer *pulse_server; AgsPulseClient *pulse_client; GList *list; pulse_server = AGS_PULSE_SERVER(sound_server); pulse_client = (AgsPulseClient *) ags_pulse_server_find_client(pulse_server, client_uuid); if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } //NOTE:JK: soundcard won't removed list = soundcard; while(list != NULL){ ags_pulse_client_add_device(pulse_client, (GObject *) list->data); list = list->next; } } GList* ags_pulse_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid) { AgsPulseServer *pulse_server; AgsPulseClient *pulse_client; GList *device_start, *device; GList *list; pulse_server = AGS_PULSE_SERVER(sound_server); pulse_client = (AgsPulseClient *) ags_pulse_server_find_client(pulse_server, client_uuid); if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return(NULL); } g_object_get(pulse_client, "device", &device_start, NULL); device = device_start; list = NULL; while(device != NULL){ if(AGS_IS_PULSE_DEVOUT(device->data) || AGS_IS_PULSE_DEVIN(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } g_list_free_full(device_start, g_object_unref); return(g_list_reverse(list)); } void ags_pulse_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer) { AgsPulseServer *pulse_server; AgsPulseClient *pulse_client; GList *list; pulse_server = AGS_PULSE_SERVER(sound_server); pulse_client = (AgsPulseClient *) ags_pulse_server_find_client(pulse_server, client_uuid); if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return; } //NOTE:JK: sequencer won't removed list = sequencer; while(list != NULL){ ags_pulse_client_add_device(pulse_client, (GObject *) list->data); list = list->next; } } GList* ags_pulse_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid) { AgsPulseServer *pulse_server; AgsPulseClient *pulse_client; GList *device_start, *device; GList *list; pulse_server = AGS_PULSE_SERVER(sound_server); pulse_client = (AgsPulseClient *) ags_pulse_server_find_client(pulse_server, client_uuid); if(!AGS_IS_PULSE_CLIENT(pulse_client)){ return(NULL); } g_object_get(pulse_client, "device", &device_start, NULL); device = device_start; list = NULL; #if 0 while(device != NULL){ if(AGS_IS_PULSE_MIDIIN(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } #endif g_list_free_full(device_start, g_object_unref); return(g_list_reverse(list)); } GObject* ags_pulse_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output) { AgsPulseServer *pulse_server; AgsPulseClient *default_client; AgsPulsePort *pulse_port; AgsPulseDevout *pulse_devout; AgsPulseDevin *pulse_devin; AgsApplicationContext *application_context; GObject *soundcard; #ifdef AGS_WITH_PULSE pa_context *context; #else gpointer context; #endif gchar *str; guint n_soundcards; gboolean initial_set; guint i; GRecMutex *pulse_server_mutex; GRecMutex *pulse_client_mutex; pulse_server = AGS_PULSE_SERVER(sound_server); application_context= ags_application_context_get_instance(); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* the default client */ initial_set = FALSE; /* get some fields */ g_rec_mutex_lock(pulse_server_mutex); if(pulse_server->main_loop == NULL){ #ifdef AGS_WITH_PULSE pulse_server->main_loop = pa_mainloop_new(); pulse_server->main_loop_api = pa_mainloop_get_api(pulse_server->main_loop); #else pulse_server->main_loop = NULL; pulse_server->main_loop_api = NULL; #endif } default_client = (AgsPulseClient *) pulse_server->default_client; n_soundcards = pulse_server->n_soundcards; g_rec_mutex_unlock(pulse_server_mutex); /* the default client */ if(default_client == NULL){ default_client = ags_pulse_client_new((GObject *) pulse_server); g_object_set(pulse_server, "default-pulse-client", default_client, NULL); ags_pulse_server_add_client(pulse_server, (GObject *) default_client); ags_pulse_client_open((AgsPulseClient *) default_client, "ags-default-client"); initial_set = TRUE; } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(default_client); /* get context */ g_rec_mutex_lock(pulse_client_mutex); context = default_client->context; g_rec_mutex_unlock(pulse_client_mutex); if(context == NULL){ g_warning("ags_pulse_server.c - can't open pulseaudio client"); } /* the soundcard */ soundcard = NULL; /* the soundcard */ if(is_output){ pulse_devout = ags_pulse_devout_new(); soundcard = (GObject *) pulse_devout; str = g_strdup_printf("ags-pulse-devout-%d", n_soundcards); g_object_set(AGS_PULSE_DEVOUT(pulse_devout), "pulse-client", default_client, "device", str, NULL); g_free(str); /* register ports */ pulse_port = ags_pulse_port_new((GObject *) default_client); str = g_strdup_printf("ags-soundcard%d", n_soundcards); g_object_set(pulse_port, "pulse-devout", pulse_devout, NULL); ags_pulse_client_add_port(default_client, (GObject *) pulse_port); g_object_set(pulse_devout, "pulse-port", pulse_port, NULL); pulse_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); pulse_devout->port_name[0] = g_strdup(str); pulse_devout->port_name[1] = NULL; ags_pulse_port_register(pulse_port, str, TRUE, FALSE, TRUE); ags_pulse_devout_realloc_buffer(pulse_devout); g_object_set(default_client, "device", pulse_devout, NULL); /* increment n-soundcards */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->n_soundcards += 1; g_rec_mutex_unlock(pulse_server_mutex); }else{ pulse_devin = ags_pulse_devin_new(); soundcard = (GObject *) pulse_devin; str = g_strdup_printf("ags-pulse-devin-%d", pulse_server->n_soundcards); g_object_set(AGS_PULSE_DEVIN(pulse_devin), "pulse-client", default_client, "device", str, NULL); g_free(str); /* register ports */ str = g_strdup_printf("ags-soundcard%d", n_soundcards); #ifdef AGS_DEBUG g_message("%s", str); #endif pulse_port = ags_pulse_port_new((GObject *) default_client); g_object_set(pulse_port, "pulse-devin", pulse_devin, NULL); ags_pulse_client_add_port(default_client, (GObject *) pulse_port); g_object_set(pulse_devin, "pulse-port", pulse_port, NULL); pulse_devin->port_name = (gchar **) malloc(2 * sizeof(gchar *)); pulse_devin->port_name[0] = g_strdup(str); pulse_devin->port_name[1] = NULL; ags_pulse_port_register(pulse_port, str, TRUE, FALSE, TRUE); ags_pulse_devin_realloc_buffer(pulse_devin); g_object_set(default_client, "device", pulse_devin, NULL); /* increment n-soundcards */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->n_soundcards += 1; g_rec_mutex_unlock(pulse_server_mutex); } return((GObject *) soundcard); } void ags_pulse_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard) { AgsPulseServer *pulse_server; AgsPulseClient *default_client; GList *list_start, *list; GList *port; GRecMutex *pulse_server_mutex; pulse_server = AGS_PULSE_SERVER(sound_server); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* the default client */ g_object_get(pulse_server, "default-pulse-client", &default_client, NULL); if(default_client == NULL){ g_warning("GSequencer - no pulse client"); return; } if(AGS_IS_PULSE_DEVOUT(soundcard)){ g_object_get(soundcard, "pulse-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_pulse_port_unregister(list->data); ags_pulse_client_remove_port(default_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if(AGS_IS_PULSE_DEVIN(soundcard)){ g_object_get(soundcard, "pulse-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_pulse_port_unregister(list->data); ags_pulse_client_remove_port(default_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); } ags_pulse_client_remove_device(default_client, soundcard); g_object_get(default_client, "port", &port, NULL); if(port == NULL){ /* reset n-soundcards */ g_rec_mutex_lock(pulse_server_mutex); pulse_server->n_soundcards = 0; g_rec_mutex_unlock(pulse_server_mutex); } g_object_unref(default_client); g_list_free_full(port, g_object_unref); } GObject* ags_pulse_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output) { g_message("GSequencer - can't register pulseaudio sequencer"); return(NULL); } void ags_pulse_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer) { g_message("GSequencer - can't unregister pulseaudio sequencer"); } /** * ags_pulse_server_register_default_soundcard: * @pulse_server: the #AgsPulseServer * * Register default soundcard. * * Returns: the instantiated #AgsPulseDevout * * Since: 3.0.0 */ GObject* ags_pulse_server_register_default_soundcard(AgsPulseServer *pulse_server) { AgsPulseClient *default_client; AgsPulseDevout *pulse_devout; AgsPulsePort *pulse_port; AgsApplicationContext *application_context; #ifdef AGS_WITH_PULSE pa_context *context; #else gpointer context; #endif gchar *str; guint i; GRecMutex *pulse_server_mutex; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return(NULL); } application_context = ags_application_context_get_instance(); /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get some fields */ g_rec_mutex_lock(pulse_server_mutex); default_client = (AgsPulseClient *) pulse_server->default_client; g_rec_mutex_unlock(pulse_server_mutex); /* the default client */ if(default_client == NULL){ default_client = ags_pulse_client_new((GObject *) pulse_server); g_object_set(pulse_server, "default-pulse-client", default_client, NULL); ags_pulse_server_add_client(pulse_server, (GObject *) default_client); ags_pulse_client_open((AgsPulseClient *) default_client, "ags-default-client"); } /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(default_client); /* get context */ g_rec_mutex_lock(pulse_client_mutex); context = default_client->context; g_rec_mutex_unlock(pulse_client_mutex); if(context == NULL){ g_warning("ags_pulse_server.c - can't open pulseaudio client"); } /* the soundcard */ pulse_devout = ags_pulse_devout_new(); g_object_set(AGS_PULSE_DEVOUT(pulse_devout), "pulse-client", default_client, "device", "ags-default-devout", NULL); /* register ports */ str = g_strdup_printf("ags-default-soundcard"); #ifdef AGS_DEBUG g_message("%s", str); #endif pulse_port = ags_pulse_port_new((GObject *) default_client); g_object_set(pulse_port, "pulse-devout", pulse_devout, NULL); ags_pulse_client_add_port(default_client, (GObject *) pulse_port); g_object_set(pulse_devout, "pulse-port", pulse_port, NULL); pulse_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); pulse_devout->port_name[0] = g_strdup(str); pulse_devout->port_name[1] = NULL; ags_pulse_port_register(pulse_port, str, TRUE, FALSE, TRUE); g_free(str); g_object_set(default_client, "device", pulse_devout, NULL); return((GObject *) pulse_devout); } /** * ags_pulse_server_find_url: * @pulse_server: (element-type AgsAudio.PulseServer) (transfer none): the #GList-struct containing #AgsPulseServer * @url: the url to find * * Find #AgsPulseServer by url. * * Returns: (element-type AgsAudio.PulseServer) (transfer none): the #GList-struct containing a #AgsPulseServer matching @url or %NULL * * Since: 3.0.0 */ GList* ags_pulse_server_find_url(GList *pulse_server, gchar *url) { GList *retval; GRecMutex *pulse_server_mutex; retval = NULL; while(pulse_server != NULL){ /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server->data); /* check URL */ g_rec_mutex_lock(pulse_server_mutex); if(!g_ascii_strcasecmp(AGS_PULSE_SERVER(pulse_server->data)->url, url)){ retval = pulse_server; g_rec_mutex_unlock(pulse_server_mutex); break; } g_rec_mutex_unlock(pulse_server_mutex); pulse_server = pulse_server->next; } return(retval); } /** * ags_pulse_server_find_client: * @pulse_server: the #AgsPulseServer * @client_uuid: the uuid to find * * Find #AgsPulseClient by uuid. * * Returns: (transfer none): the #AgsPulseClient found or %NULL * * Since: 3.0.0 */ GObject* ags_pulse_server_find_client(AgsPulseServer *pulse_server, gchar *client_uuid) { AgsPulseClient *retval; GList *list_start, *list; GRecMutex *pulse_server_mutex; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return(NULL); } /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get some fields */ g_rec_mutex_lock(pulse_server_mutex); list = list_start = g_list_copy(pulse_server->client); g_rec_mutex_unlock(pulse_server_mutex); retval = NULL; while(list != NULL){ /* get pulse client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(list->data); /* check client UUID */ g_rec_mutex_lock(pulse_client_mutex); if(!g_ascii_strcasecmp(AGS_PULSE_CLIENT(list->data)->client_uuid, client_uuid)){ retval = list->data; g_rec_mutex_unlock(pulse_client_mutex); break; } g_rec_mutex_unlock(pulse_client_mutex); list = list->next; } g_list_free(list_start); return((GObject *) retval); } /** * ags_pulse_server_find_port: * @pulse_server: the #AgsPulseServer * @port_uuid: the uuid to find * * Find #AgsPulsePort by uuid. * * Returns: (transfer none): the #AgsPulsePort found or %NULL * * Since: 3.0.0 */ GObject* ags_pulse_server_find_port(AgsPulseServer *pulse_server, gchar *port_uuid) { GList *client_start, *client; GList *port_start, *port; gboolean success; GRecMutex *pulse_port_mutex; g_object_get(pulse_server, "pulse-client", &client_start, NULL); client = client_start; while(client != NULL){ g_object_get(pulse_server, "pulse-port", &port_start, NULL); port = port_start; while(port != NULL){ /* get pulse port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(port->data); /* check port UUID */ g_rec_mutex_lock(pulse_port_mutex); success = (!g_ascii_strcasecmp(AGS_PULSE_PORT(port->data)->port_uuid, port_uuid)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_port_mutex); if(success){ AgsPulsePort *retval; retval = port->data; g_list_free_full(client_start, g_object_unref); g_list_free_full(port_start, g_object_unref); return(retval); } /* iterate */ port = port->next; } g_list_free_full(port_start, g_object_unref); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); return(NULL); } /** * ags_pulse_server_add_client: * @pulse_server: the #AgsPulseServer * @pulse_client: the #AgsPulseClient to add * * Add @pulse_client to @pulse_server * * Since: 3.0.0 */ void ags_pulse_server_add_client(AgsPulseServer *pulse_server, GObject *pulse_client) { GRecMutex *pulse_server_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server) || !AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get some fields */ g_rec_mutex_lock(pulse_server_mutex); if(g_list_find(pulse_server->client, pulse_client) == NULL){ g_object_ref(pulse_client); pulse_server->client = g_list_prepend(pulse_server->client, pulse_client); } g_rec_mutex_unlock(pulse_server_mutex); } /** * ags_pulse_server_remove_client: * @pulse_server: the #AgsPulseServer * @pulse_client: the #AgsPulseClient to remove * * Remove @pulse_client to @pulse_server * * Since: 3.0.0 */ void ags_pulse_server_remove_client(AgsPulseServer *pulse_server, GObject *pulse_client) { GRecMutex *pulse_server_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server) || !AGS_IS_PULSE_CLIENT(pulse_client)){ return; } /* get pulse server mutex */ pulse_server_mutex = AGS_PULSE_SERVER_GET_OBJ_MUTEX(pulse_server); /* get some fields */ g_rec_mutex_lock(pulse_server_mutex); if(g_list_find(pulse_server->client, pulse_client) != NULL){ pulse_server->client = g_list_remove(pulse_server->client, pulse_client); g_object_unref(pulse_client); } g_rec_mutex_unlock(pulse_server_mutex); } /** * ags_pulse_server_connect_client: * @pulse_server: the #AgsPulseServer * * Connect all clients. * * Since: 3.0.0 */ void ags_pulse_server_connect_client(AgsPulseServer *pulse_server) { GList *client_start, *client; gchar *client_name; GRecMutex *pulse_client_mutex; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return; } g_object_get(pulse_server, "pulse-client", &client_start, NULL); client = client_start; while(client != NULL){ /* client name */ g_object_get(client->data, "client-name", &client_name, NULL); /* open */ ags_pulse_client_open((AgsPulseClient *) client->data, client_name); ags_pulse_client_activate(client->data); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); } /** * ags_pulse_server_disconnect_client: * @pulse_server: the #AgsPulseServer * * Disconnect all clients. * * Since: 3.0.0 */ void ags_pulse_server_disconnect_client(AgsPulseServer *pulse_server) { GList *client_start, *client; if(!AGS_IS_PULSE_SERVER(pulse_server)){ return; } g_object_get(pulse_server, "pulse-client", &client_start, NULL); client = client_start; while(client != NULL){ /* close */ ags_pulse_client_deactivate(client->data); ags_pulse_client_close((AgsPulseClient *) client->data); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); } void* ags_pulse_server_do_poll_loop(void *ptr) { AgsPulseServer *pulse_server; #ifdef AGS_WITH_RT AgsPriority *priority; struct sched_param param; gchar *str; #endif pulse_server = (AgsPulseServer *) ptr; /* Declare ourself as a real time task */ #ifdef AGS_WITH_RT priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); #endif #ifdef AGS_WITH_PULSE pa_mainloop_run(pulse_server->main_loop, NULL); #endif g_thread_exit(NULL); return(NULL); } void ags_pulse_server_start_poll(AgsPulseServer *pulse_server) { pulse_server->thread = g_thread_new("Advanced Gtk+ Sequencer - pulseaudio server", ags_pulse_server_do_poll_loop, pulse_server); } /** * ags_pulse_server_new: * @url: the URL as string * * Create a new instance of #AgsPulseServer. * * Returns: the new #AgsPulseServer * * Since: 3.0.0 */ AgsPulseServer* ags_pulse_server_new(gchar *url) { AgsPulseServer *pulse_server; pulse_server = (AgsPulseServer *) g_object_new(AGS_TYPE_PULSE_SERVER, "url", url, NULL); return(pulse_server); } gsequencer-3.1.3/ags/audio/pulse/ags_pulse_devin.c0000644000175000017500000022021413607210263017117 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_pulse_devin_class_init(AgsPulseDevinClass *pulse_devin); void ags_pulse_devin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pulse_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_pulse_devin_init(AgsPulseDevin *pulse_devin); void ags_pulse_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pulse_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pulse_devin_dispose(GObject *gobject); void ags_pulse_devin_finalize(GObject *gobject); AgsUUID* ags_pulse_devin_get_uuid(AgsConnectable *connectable); gboolean ags_pulse_devin_has_resource(AgsConnectable *connectable); gboolean ags_pulse_devin_is_ready(AgsConnectable *connectable); void ags_pulse_devin_add_to_registry(AgsConnectable *connectable); void ags_pulse_devin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_pulse_devin_list_resource(AgsConnectable *connectable); xmlNode* ags_pulse_devin_xml_compose(AgsConnectable *connectable); void ags_pulse_devin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_pulse_devin_is_connected(AgsConnectable *connectable); void ags_pulse_devin_connect(AgsConnectable *connectable); void ags_pulse_devin_disconnect(AgsConnectable *connectable); void ags_pulse_devin_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_pulse_devin_get_device(AgsSoundcard *soundcard); void ags_pulse_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_pulse_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_pulse_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_pulse_devin_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_pulse_devin_get_capability(AgsSoundcard *soundcard); gboolean ags_pulse_devin_is_starting(AgsSoundcard *soundcard); gboolean ags_pulse_devin_is_recording(AgsSoundcard *soundcard); gchar* ags_pulse_devin_get_uptime(AgsSoundcard *soundcard); void ags_pulse_devin_port_init(AgsSoundcard *soundcard, GError **error); void ags_pulse_devin_port_record(AgsSoundcard *soundcard, GError **error); void ags_pulse_devin_port_free(AgsSoundcard *soundcard); void ags_pulse_devin_tic(AgsSoundcard *soundcard); void ags_pulse_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_pulse_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_pulse_devin_get_bpm(AgsSoundcard *soundcard); void ags_pulse_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_pulse_devin_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_pulse_devin_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_pulse_devin_get_delay(AgsSoundcard *soundcard); guint ags_pulse_devin_get_attack(AgsSoundcard *soundcard); void* ags_pulse_devin_get_buffer(AgsSoundcard *soundcard); void* ags_pulse_devin_get_next_buffer(AgsSoundcard *soundcard); void* ags_pulse_devin_get_prev_buffer(AgsSoundcard *soundcard); guint ags_pulse_devin_get_delay_counter(AgsSoundcard *soundcard); void ags_pulse_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_pulse_devin_get_start_note_offset(AgsSoundcard *soundcard); void ags_pulse_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_pulse_devin_get_note_offset(AgsSoundcard *soundcard); void ags_pulse_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_pulse_devin_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_pulse_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_pulse_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_pulse_devin_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_pulse_devin * @short_description: Input from soundcard * @title: AgsPulseDevin * @section_id: * @include: ags/audio/pulse/ags_pulse_devin.h * * #AgsPulseDevin represents a soundcard and supports input. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_PULSE_CLIENT, PROP_PULSE_PORT, }; static gpointer ags_pulse_devin_parent_class = NULL; GType ags_pulse_devin_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pulse_devin = 0; static const GTypeInfo ags_pulse_devin_info = { sizeof(AgsPulseDevinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pulse_devin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPulseDevin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pulse_devin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pulse_devin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_pulse_devin_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pulse_devin = g_type_register_static(G_TYPE_OBJECT, "AgsPulseDevin", &ags_pulse_devin_info, 0); g_type_add_interface_static(ags_type_pulse_devin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_pulse_devin, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pulse_devin); } return g_define_type_id__volatile; } void ags_pulse_devin_class_init(AgsPulseDevinClass *pulse_devin) { GObjectClass *gobject; GParamSpec *param_spec; ags_pulse_devin_parent_class = g_type_class_peek_parent(pulse_devin); /* GObjectClass */ gobject = (GObjectClass *) pulse_devin; gobject->set_property = ags_pulse_devin_set_property; gobject->get_property = ags_pulse_devin_get_property; gobject->dispose = ags_pulse_devin_dispose; gobject->finalize = ags_pulse_devin_finalize; /* properties */ /** * AgsPulseDevin:device: * * The pulse soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-pulse-devin-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsPulseDevin:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), AGS_SOUNDCARD_MIN_DSP_CHANNELS, AGS_SOUNDCARD_MAX_DSP_CHANNELS, AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsPulseDevin:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), AGS_SOUNDCARD_MIN_PCM_CHANNELS, AGS_SOUNDCARD_MAX_PCM_CHANNELS, AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsPulseDevin:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsPulseDevin:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), AGS_SOUNDCARD_MIN_BUFFER_SIZE, AGS_SOUNDCARD_MAX_BUFFER_SIZE, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsPulseDevin:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count recorded during a second"), AGS_SOUNDCARD_MIN_SAMPLERATE, AGS_SOUNDCARD_MAX_SAMPLERATE, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsPulseDevin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to record"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsPulseDevin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsPulseDevin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsPulseDevin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsPulseDevin:pulse-client: * * The assigned #AgsPulseClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("pulse-client", i18n_pspec("pulse client object"), i18n_pspec("The pulse client object"), AGS_TYPE_PULSE_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_CLIENT, param_spec); /** * AgsPulseDevin:pulse-port: * * The assigned #AgsPulsePort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("pulse-port", i18n_pspec("pulse port object"), i18n_pspec("The pulse port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_PORT, param_spec); } GQuark ags_pulse_devin_error_quark() { return(g_quark_from_static_string("ags-pulse_devin-error-quark")); } void ags_pulse_devin_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_pulse_devin_get_uuid; connectable->has_resource = ags_pulse_devin_has_resource; connectable->is_ready = ags_pulse_devin_is_ready; connectable->add_to_registry = ags_pulse_devin_add_to_registry; connectable->remove_from_registry = ags_pulse_devin_remove_from_registry; connectable->list_resource = ags_pulse_devin_list_resource; connectable->xml_compose = ags_pulse_devin_xml_compose; connectable->xml_parse = ags_pulse_devin_xml_parse; connectable->is_connected = ags_pulse_devin_is_connected; connectable->connect = ags_pulse_devin_connect; connectable->disconnect = ags_pulse_devin_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_pulse_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_pulse_devin_set_device; soundcard->get_device = ags_pulse_devin_get_device; soundcard->set_presets = ags_pulse_devin_set_presets; soundcard->get_presets = ags_pulse_devin_get_presets; soundcard->list_cards = ags_pulse_devin_list_cards; soundcard->pcm_info = ags_pulse_devin_pcm_info; soundcard->get_capability = ags_pulse_devin_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_pulse_devin_is_starting; soundcard->is_playing = NULL; soundcard->is_recording = ags_pulse_devin_is_recording; soundcard->get_uptime = ags_pulse_devin_get_uptime; soundcard->play_init = NULL; soundcard->play = NULL; soundcard->record_init = ags_pulse_devin_port_init; soundcard->record = ags_pulse_devin_port_record; soundcard->stop = ags_pulse_devin_port_free; soundcard->tic = ags_pulse_devin_tic; soundcard->offset_changed = ags_pulse_devin_offset_changed; soundcard->set_bpm = ags_pulse_devin_set_bpm; soundcard->get_bpm = ags_pulse_devin_get_bpm; soundcard->set_delay_factor = ags_pulse_devin_set_delay_factor; soundcard->get_delay_factor = ags_pulse_devin_get_delay_factor; soundcard->get_absolute_delay = ags_pulse_devin_get_absolute_delay; soundcard->get_delay = ags_pulse_devin_get_delay; soundcard->get_attack = ags_pulse_devin_get_attack; soundcard->get_buffer = ags_pulse_devin_get_buffer; soundcard->get_next_buffer = ags_pulse_devin_get_next_buffer; soundcard->get_prev_buffer = ags_pulse_devin_get_prev_buffer; soundcard->get_delay_counter = ags_pulse_devin_get_delay_counter; soundcard->set_start_note_offset = ags_pulse_devin_set_start_note_offset; soundcard->get_start_note_offset = ags_pulse_devin_get_start_note_offset; soundcard->set_note_offset = ags_pulse_devin_set_note_offset; soundcard->get_note_offset = ags_pulse_devin_get_note_offset; soundcard->set_note_offset_absolute = ags_pulse_devin_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_pulse_devin_get_note_offset_absolute; soundcard->set_loop = ags_pulse_devin_set_loop; soundcard->get_loop = ags_pulse_devin_get_loop; soundcard->get_loop_offset = ags_pulse_devin_get_loop_offset; } void ags_pulse_devin_init(AgsPulseDevin *pulse_devin) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; /* flags */ pulse_devin->flags = 0; g_atomic_int_set(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_PASS_THROUGH); /* insert devin mutex */ g_rec_mutex_init(&(pulse_devin->obj_mutex)); /* uuid */ pulse_devin->uuid = ags_uuid_alloc(); ags_uuid_generate(pulse_devin->uuid); /* presets */ config = ags_config_get_instance(); pulse_devin->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); pulse_devin->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); pulse_devin->samplerate = ags_soundcard_helper_config_get_samplerate(config); pulse_devin->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); pulse_devin->format = ags_soundcard_helper_config_get_format(config); /* */ pulse_devin->card_uri = NULL; pulse_devin->pulse_client = NULL; pulse_devin->port_name = NULL; pulse_devin->pulse_port = NULL; /* buffer */ pulse_devin->buffer = (void **) malloc(8 * sizeof(void*)); pulse_devin->buffer[0] = NULL; pulse_devin->buffer[1] = NULL; pulse_devin->buffer[2] = NULL; pulse_devin->buffer[3] = NULL; pulse_devin->buffer[4] = NULL; pulse_devin->buffer[5] = NULL; pulse_devin->buffer[6] = NULL; pulse_devin->buffer[7] = NULL; ags_pulse_devin_realloc_buffer(pulse_devin); /* bpm */ pulse_devin->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ pulse_devin->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); pulse_devin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ pulse_devin->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); pulse_devin->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); /* counters */ pulse_devin->tact_counter = 0.0; pulse_devin->delay_counter = 0; pulse_devin->tic_counter = 0; pulse_devin->start_note_offset = 0; pulse_devin->note_offset = 0; pulse_devin->note_offset_absolute = 0; pulse_devin->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; pulse_devin->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; pulse_devin->do_loop = FALSE; pulse_devin->loop_offset = 0; /* callback mutex */ g_mutex_init(&(pulse_devin->callback_mutex)); g_cond_init(&(pulse_devin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(pulse_devin->callback_finish_mutex)); g_cond_init(&(pulse_devin->callback_finish_cond)); } void ags_pulse_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(gobject); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->card_uri = g_strdup(device); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(pulse_devin_mutex); if(dsp_channels == pulse_devin->dsp_channels){ g_rec_mutex_unlock(pulse_devin_mutex); return; } pulse_devin->dsp_channels = dsp_channels; g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(pulse_devin_mutex); if(pcm_channels == pulse_devin->pcm_channels){ g_rec_mutex_unlock(pulse_devin_mutex); return; } pulse_devin->pcm_channels = pcm_channels; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_realloc_buffer(pulse_devin); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(pulse_devin_mutex); if(format == pulse_devin->format){ g_rec_mutex_unlock(pulse_devin_mutex); return; } pulse_devin->format = format; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_realloc_buffer(pulse_devin); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(pulse_devin_mutex); if(buffer_size == pulse_devin->buffer_size){ g_rec_mutex_unlock(pulse_devin_mutex); return; } pulse_devin->buffer_size = buffer_size; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_realloc_buffer(pulse_devin); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(pulse_devin_mutex); if(samplerate == pulse_devin->samplerate){ g_rec_mutex_unlock(pulse_devin_mutex); return; } pulse_devin->samplerate = samplerate; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_realloc_buffer(pulse_devin); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->bpm = bpm; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->delay_factor = delay_factor; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); } break; case PROP_PULSE_CLIENT: { AgsPulseClient *pulse_client; pulse_client = (AgsPulseClient *) g_value_get_object(value); g_rec_mutex_lock(pulse_devin_mutex); if(pulse_devin->pulse_client == (GObject *) pulse_client){ g_rec_mutex_unlock(pulse_devin_mutex); return; } if(pulse_devin->pulse_client != NULL){ g_object_unref(G_OBJECT(pulse_devin->pulse_client)); } if(pulse_client != NULL){ g_object_ref(pulse_client); } pulse_devin->pulse_client = (GObject *) pulse_client; g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_PULSE_PORT: { AgsPulsePort *pulse_port; pulse_port = (AgsPulsePort *) g_value_get_pointer(value); g_rec_mutex_lock(pulse_devin_mutex); if(!AGS_IS_PULSE_PORT(pulse_port) || g_list_find(pulse_devin->pulse_port, pulse_port) != NULL){ g_rec_mutex_unlock(pulse_devin_mutex); return; } g_object_ref(pulse_port); pulse_devin->pulse_port = g_list_append(pulse_devin->pulse_port, pulse_port); g_rec_mutex_unlock(pulse_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(gobject); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_string(value, pulse_devin->card_uri); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_uint(value, pulse_devin->dsp_channels); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_uint(value, pulse_devin->pcm_channels); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_uint(value, pulse_devin->format); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_uint(value, pulse_devin->buffer_size); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_uint(value, pulse_devin->samplerate); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_pointer(value, pulse_devin->buffer); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_double(value, pulse_devin->bpm); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_double(value, pulse_devin->delay_factor); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_pointer(value, pulse_devin->attack); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_PULSE_CLIENT: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_object(value, pulse_devin->pulse_client); g_rec_mutex_unlock(pulse_devin_mutex); } break; case PROP_PULSE_PORT: { g_rec_mutex_lock(pulse_devin_mutex); g_value_set_pointer(value, g_list_copy_deep(pulse_devin->pulse_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(pulse_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_devin_dispose(GObject *gobject) { AgsPulseDevin *pulse_devin; pulse_devin = AGS_PULSE_DEVIN(gobject); /* pulse client */ if(pulse_devin->pulse_client != NULL){ g_object_unref(pulse_devin->pulse_client); pulse_devin->pulse_client = NULL; } /* pulse port */ g_list_free_full(pulse_devin->pulse_port, g_object_unref); pulse_devin->pulse_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_pulse_devin_parent_class)->dispose(gobject); } void ags_pulse_devin_finalize(GObject *gobject) { AgsPulseDevin *pulse_devin; pulse_devin = AGS_PULSE_DEVIN(gobject); /* free output buffer */ free(pulse_devin->buffer[0]); free(pulse_devin->buffer[1]); free(pulse_devin->buffer[2]); free(pulse_devin->buffer[3]); free(pulse_devin->buffer[4]); free(pulse_devin->buffer[5]); free(pulse_devin->buffer[6]); free(pulse_devin->buffer[7]); /* free buffer array */ free(pulse_devin->buffer); /* free AgsAttack */ free(pulse_devin->attack); /* pulse client */ if(pulse_devin->pulse_client != NULL){ g_object_unref(pulse_devin->pulse_client); } /* pulse port */ g_list_free_full(pulse_devin->pulse_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_pulse_devin_parent_class)->finalize(gobject); } AgsUUID* ags_pulse_devin_get_uuid(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; AgsUUID *ptr; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(connectable); /* get pulse devin signal mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get UUID */ g_rec_mutex_lock(pulse_devin_mutex); ptr = pulse_devin->uuid; g_rec_mutex_unlock(pulse_devin_mutex); return(ptr); } gboolean ags_pulse_devin_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_pulse_devin_is_ready(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; gboolean is_ready; pulse_devin = AGS_PULSE_DEVIN(connectable); /* check is added */ is_ready = ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_ADDED_TO_REGISTRY); return(is_ready); } void ags_pulse_devin_add_to_registry(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; if(ags_connectable_is_ready(connectable)){ return; } pulse_devin = AGS_PULSE_DEVIN(connectable); ags_pulse_devin_set_flags(pulse_devin, AGS_PULSE_DEVIN_ADDED_TO_REGISTRY); } void ags_pulse_devin_remove_from_registry(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; if(!ags_connectable_is_ready(connectable)){ return; } pulse_devin = AGS_PULSE_DEVIN(connectable); ags_pulse_devin_unset_flags(pulse_devin, AGS_PULSE_DEVIN_ADDED_TO_REGISTRY); } xmlNode* ags_pulse_devin_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_pulse_devin_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_pulse_devin_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_pulse_devin_is_connected(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; gboolean is_connected; pulse_devin = AGS_PULSE_DEVIN(connectable); /* check is connected */ is_connected = ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_CONNECTED); return(is_connected); } void ags_pulse_devin_connect(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; if(ags_connectable_is_connected(connectable)){ return; } pulse_devin = AGS_PULSE_DEVIN(connectable); ags_pulse_devin_set_flags(pulse_devin, AGS_PULSE_DEVIN_CONNECTED); } void ags_pulse_devin_disconnect(AgsConnectable *connectable) { AgsPulseDevin *pulse_devin; if(!ags_connectable_is_connected(connectable)){ return; } pulse_devin = AGS_PULSE_DEVIN(connectable); ags_pulse_devin_unset_flags(pulse_devin, AGS_PULSE_DEVIN_CONNECTED); } /** * ags_pulse_devin_test_flags: * @pulse_devin: the #AgsPulseDevin * @flags: the flags * * Test @flags to be set on @pulse_devin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_pulse_devin_test_flags(AgsPulseDevin *pulse_devin, guint flags) { gboolean retval; GRecMutex *pulse_devin_mutex; if(!AGS_IS_PULSE_DEVIN(pulse_devin)){ return(FALSE); } /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* test */ g_rec_mutex_lock(pulse_devin_mutex); retval = (flags & (pulse_devin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_devin_mutex); return(retval); } /** * ags_pulse_devin_set_flags: * @pulse_devin: the #AgsPulseDevin * @flags: see #AgsPulseDevinFlags-enum * * Enable a feature of @pulse_devin. * * Since: 3.0.0 */ void ags_pulse_devin_set_flags(AgsPulseDevin *pulse_devin, guint flags) { GRecMutex *pulse_devin_mutex; if(!AGS_IS_PULSE_DEVIN(pulse_devin)){ return; } /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->flags |= flags; g_rec_mutex_unlock(pulse_devin_mutex); } /** * ags_pulse_devin_unset_flags: * @pulse_devin: the #AgsPulseDevin * @flags: see #AgsPulseDevinFlags-enum * * Disable a feature of @pulse_devin. * * Since: 3.0.0 */ void ags_pulse_devin_unset_flags(AgsPulseDevin *pulse_devin, guint flags) { GRecMutex *pulse_devin_mutex; if(!AGS_IS_PULSE_DEVIN(pulse_devin)){ return; } /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->flags &= (~flags); g_rec_mutex_unlock(pulse_devin_mutex); } void ags_pulse_devin_set_device(AgsSoundcard *soundcard, gchar *device) { AgsPulseDevin *pulse_devin; GList *pulse_port, *pulse_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* check device */ g_rec_mutex_lock(pulse_devin_mutex); if(pulse_devin->card_uri == device || !g_ascii_strcasecmp(pulse_devin->card_uri, device)){ g_rec_mutex_unlock(pulse_devin_mutex); return; } if(!g_str_has_prefix(device, "ags-pulse-devin-")){ g_rec_mutex_unlock(pulse_devin_mutex); g_warning("invalid pulseaudio device prefix"); return; } ret = sscanf(device, "ags-pulse-devin-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(pulse_devin_mutex); g_warning("invalid pulseaudio device specifier"); return; } g_free(pulse_devin->card_uri); pulse_devin->card_uri = g_strdup(device); /* apply name to port */ pcm_channels = pulse_devin->pcm_channels; pulse_port_start = pulse_port = g_list_copy(pulse_devin->pulse_port); g_rec_mutex_unlock(pulse_devin_mutex); for(i = 0; i < pcm_channels; i++){ str = g_strdup_printf("ags-soundcard%d-%04d", nth_card, i); g_object_set(pulse_port->data, "port-name", str, NULL); g_free(str); pulse_port = pulse_port->next; } g_list_free(pulse_port_start); } gchar* ags_pulse_devin_get_device(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gchar *device; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); device = NULL; /* get device */ g_rec_mutex_lock(pulse_devin_mutex); device = g_strdup(pulse_devin->card_uri); g_rec_mutex_unlock(pulse_devin_mutex); return(device); } void ags_pulse_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsPulseDevin *pulse_devin; pulse_devin = AGS_PULSE_DEVIN(soundcard); g_object_set(pulse_devin, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_pulse_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get presets */ g_rec_mutex_lock(pulse_devin_mutex); if(channels != NULL){ *channels = pulse_devin->pcm_channels; } if(rate != NULL){ *rate = pulse_devin->samplerate; } if(buffer_size != NULL){ *buffer_size = pulse_devin->buffer_size; } if(format != NULL){ *format = pulse_devin->format; } g_rec_mutex_unlock(pulse_devin_mutex); } void ags_pulse_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsPulseClient *pulse_client; AgsPulseDevin *pulse_devin; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; pulse_devin = AGS_PULSE_DEVIN(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_PULSE_DEVIN(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_PULSE_DEVIN(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_pulse_devin_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "pulse-client", &pulse_client, NULL); if(pulse_client != NULL){ /* get client name */ g_object_get(pulse_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(pulse_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_pulse_devin_list_cards() - pulseaudio client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_pulse_devin_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_pulse_devin_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_CAPTURE); } gboolean ags_pulse_devin_is_starting(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gboolean is_starting; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* check is starting */ g_rec_mutex_lock(pulse_devin_mutex); is_starting = ((AGS_PULSE_DEVIN_START_RECORD & (pulse_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_devin_mutex); return(is_starting); } gboolean ags_pulse_devin_is_recording(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gboolean is_recording; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* check is starting */ g_rec_mutex_lock(pulse_devin_mutex); is_recording = ((AGS_PULSE_DEVIN_RECORD & (pulse_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_devin_mutex); return(is_recording); } gchar* ags_pulse_devin_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_recording(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_pulse_devin_port_init(AgsSoundcard *soundcard, GError **error) { AgsPulseDevin *pulse_devin; guint format, word_size; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* retrieve word size */ g_rec_mutex_lock(pulse_devin_mutex); switch(pulse_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(pulse_devin_mutex); g_warning("ags_pulse_devin_port_init(): unsupported word size"); return; } /* prepare for playback */ pulse_devin->flags |= (AGS_PULSE_DEVIN_BUFFER7 | AGS_PULSE_DEVIN_START_RECORD | AGS_PULSE_DEVIN_RECORD | AGS_PULSE_DEVIN_NONBLOCKING); memset(pulse_devin->buffer[0], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[1], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[2], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[3], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[4], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[5], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[6], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[7], 0, pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); /* */ pulse_devin->tact_counter = 0.0; pulse_devin->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(pulse_devin))); pulse_devin->tic_counter = 0; pulse_devin->flags |= (AGS_PULSE_DEVIN_INITIALIZED | AGS_PULSE_DEVIN_START_RECORD | AGS_PULSE_DEVIN_RECORD); g_atomic_int_and(&(pulse_devin->sync_flags), (~(AGS_PULSE_DEVIN_PASS_THROUGH))); g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_INITIAL_CALLBACK); g_rec_mutex_unlock(pulse_devin_mutex); } void ags_pulse_devin_port_record(AgsSoundcard *soundcard, GError **error) { AgsPulseClient *pulse_client; AgsPulseDevin *pulse_devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean pulse_client_activated; GRecMutex *pulse_devin_mutex; GRecMutex *pulse_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* client */ g_rec_mutex_lock(pulse_devin_mutex); pulse_client = (AgsPulseClient *) pulse_devin->pulse_client; callback_mutex = &(pulse_devin->callback_mutex); callback_finish_mutex = &(pulse_devin->callback_finish_mutex); /* do playback */ pulse_devin->flags &= (~AGS_PULSE_DEVIN_START_RECORD); if((AGS_PULSE_DEVIN_INITIALIZED & (pulse_devin->flags)) == 0){ g_rec_mutex_unlock(pulse_devin_mutex); return; } switch(pulse_devin->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(pulse_devin_mutex); g_warning("ags_pulse_devin_port_record(): unsupported word size"); return; } g_rec_mutex_unlock(pulse_devin_mutex); /* get client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* get activated */ g_rec_mutex_lock(pulse_client_mutex); pulse_client_activated = ((AGS_PULSE_CLIENT_ACTIVATED & (pulse_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_client_mutex); if(pulse_client_activated){ /* signal */ if((AGS_PULSE_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_CALLBACK_DONE); if((AGS_PULSE_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(pulse_devin->sync_flags)))) != 0){ g_cond_signal(&(pulse_devin->callback_cond)); } g_mutex_unlock(callback_mutex); } /* wait callback */ if((AGS_PULSE_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0){ g_mutex_lock(callback_finish_mutex); if((AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0){ g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT); while((AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(pulse_devin->sync_flags)))) == 0 && (AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(pulse_devin->sync_flags)))) != 0){ g_cond_wait(&(pulse_devin->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(pulse_devin->sync_flags), (~(AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT | AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(pulse_devin->sync_flags), (~AGS_PULSE_DEVIN_INITIAL_CALLBACK)); } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) pulse_devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) pulse_devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) pulse_devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_pulse_devin_port_free(AgsSoundcard *soundcard) { AgsPulsePort *pulse_port; AgsPulseDevin *pulse_devin; guint word_size; GRecMutex *pulse_devin_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* */ g_rec_mutex_lock(pulse_devin_mutex); if((AGS_PULSE_DEVIN_INITIALIZED & (pulse_devin->flags)) == 0){ g_rec_mutex_unlock(pulse_devin_mutex); return; } callback_mutex = &(pulse_devin->callback_mutex); callback_finish_mutex = &(pulse_devin->callback_finish_mutex); // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); pulse_devin->flags &= (~(AGS_PULSE_DEVIN_BUFFER0 | AGS_PULSE_DEVIN_BUFFER1 | AGS_PULSE_DEVIN_BUFFER2 | AGS_PULSE_DEVIN_BUFFER3 | AGS_PULSE_DEVIN_BUFFER4 | AGS_PULSE_DEVIN_BUFFER5 | AGS_PULSE_DEVIN_BUFFER6 | AGS_PULSE_DEVIN_BUFFER7 | AGS_PULSE_DEVIN_RECORD)); g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_PASS_THROUGH); g_atomic_int_and(&(pulse_devin->sync_flags), (~AGS_PULSE_DEVIN_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_CALLBACK_DONE); if((AGS_PULSE_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(pulse_devin->sync_flags)))) != 0){ g_cond_signal(&(pulse_devin->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(pulse_devin->sync_flags), AGS_PULSE_DEVIN_CALLBACK_FINISH_DONE); if((AGS_PULSE_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(pulse_devin->sync_flags)))) != 0){ g_cond_signal(&(pulse_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ pulse_devin->note_offset = pulse_devin->start_note_offset; pulse_devin->note_offset_absolute = pulse_devin->start_note_offset; switch(pulse_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_pulse_devin_free(): unsupported word size"); } g_rec_mutex_unlock(pulse_devin_mutex); if(pulse_devin->pulse_port != NULL){ pulse_port = pulse_devin->pulse_port->data; while(!g_atomic_int_get(&(pulse_port->is_empty))) usleep(500000); } g_rec_mutex_lock(pulse_devin_mutex); memset(pulse_devin->buffer[0], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[1], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[2], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[3], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[4], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[5], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[6], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); memset(pulse_devin->buffer[7], 0, (size_t) pulse_devin->pcm_channels * pulse_devin->buffer_size * word_size); g_rec_mutex_unlock(pulse_devin_mutex); } void ags_pulse_devin_tic(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* determine if attack should be switched */ g_rec_mutex_lock(pulse_devin_mutex); delay = pulse_devin->delay[pulse_devin->tic_counter]; delay_counter = pulse_devin->delay_counter; note_offset = pulse_devin->note_offset; note_offset_absolute = pulse_devin->note_offset_absolute; loop_left = pulse_devin->loop_left; loop_right = pulse_devin->loop_right; do_loop = pulse_devin->do_loop; g_rec_mutex_unlock(pulse_devin_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->delay_counter = delay_counter + 1.0 - delay; pulse_devin->tact_counter += 1.0; g_rec_mutex_unlock(pulse_devin_mutex); }else{ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->delay_counter += 1.0; g_rec_mutex_unlock(pulse_devin_mutex); } } void ags_pulse_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* offset changed */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->tic_counter += 1; if(pulse_devin->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ pulse_devin->tic_counter = 0; } g_rec_mutex_unlock(pulse_devin_mutex); } void ags_pulse_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set bpm */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->bpm = bpm; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); } gdouble ags_pulse_devin_get_bpm(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gdouble bpm; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get bpm */ g_rec_mutex_lock(pulse_devin_mutex); bpm = pulse_devin->bpm; g_rec_mutex_unlock(pulse_devin_mutex); return(bpm); } void ags_pulse_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set delay factor */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->delay_factor = delay_factor; g_rec_mutex_unlock(pulse_devin_mutex); ags_pulse_devin_adjust_delay_and_attack(pulse_devin); } gdouble ags_pulse_devin_get_delay_factor(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gdouble delay_factor; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get delay factor */ g_rec_mutex_lock(pulse_devin_mutex); delay_factor = pulse_devin->delay_factor; g_rec_mutex_unlock(pulse_devin_mutex); return(delay_factor); } gdouble ags_pulse_devin_get_delay(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint delay_index; gdouble delay; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get delay */ g_rec_mutex_lock(pulse_devin_mutex); delay_index = pulse_devin->tic_counter; delay = pulse_devin->delay[delay_index]; g_rec_mutex_unlock(pulse_devin_mutex); return(delay); } gdouble ags_pulse_devin_get_absolute_delay(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; gdouble absolute_delay; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get absolute delay */ g_rec_mutex_lock(pulse_devin_mutex); absolute_delay = (60.0 * (((gdouble) pulse_devin->samplerate / (gdouble) pulse_devin->buffer_size) / (gdouble) pulse_devin->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) pulse_devin->delay_factor))); g_rec_mutex_unlock(pulse_devin_mutex); return(absolute_delay); } guint ags_pulse_devin_get_attack(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint attack_index; guint attack; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get attack */ g_rec_mutex_lock(pulse_devin_mutex); attack_index = pulse_devin->tic_counter; attack = pulse_devin->attack[attack_index]; g_rec_mutex_unlock(pulse_devin_mutex); return(attack); } void* ags_pulse_devin_get_buffer(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; void *buffer; pulse_devin = AGS_PULSE_DEVIN(soundcard); if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER0)){ buffer = pulse_devin->buffer[0]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER1)){ buffer = pulse_devin->buffer[1]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER2)){ buffer = pulse_devin->buffer[2]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER3)){ buffer = pulse_devin->buffer[3]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER4)){ buffer = pulse_devin->buffer[4]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER5)){ buffer = pulse_devin->buffer[5]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER6)){ buffer = pulse_devin->buffer[6]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER7)){ buffer = pulse_devin->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_pulse_devin_get_next_buffer(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; void *buffer; pulse_devin = AGS_PULSE_DEVIN(soundcard); if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER0)){ buffer = pulse_devin->buffer[1]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER1)){ buffer = pulse_devin->buffer[2]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER2)){ buffer = pulse_devin->buffer[3]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER3)){ buffer = pulse_devin->buffer[4]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER4)){ buffer = pulse_devin->buffer[5]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER5)){ buffer = pulse_devin->buffer[6]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER6)){ buffer = pulse_devin->buffer[7]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER7)){ buffer = pulse_devin->buffer[8]; }else{ buffer = NULL; } return(buffer); } void* ags_pulse_devin_get_prev_buffer(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; void *buffer; pulse_devin = AGS_PULSE_DEVIN(soundcard); if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER0)){ buffer = pulse_devin->buffer[7]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER1)){ buffer = pulse_devin->buffer[0]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER2)){ buffer = pulse_devin->buffer[1]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER3)){ buffer = pulse_devin->buffer[2]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER4)){ buffer = pulse_devin->buffer[3]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER5)){ buffer = pulse_devin->buffer[4]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER6)){ buffer = pulse_devin->buffer[5]; }else if(ags_pulse_devin_test_flags(pulse_devin, AGS_PULSE_DEVIN_BUFFER7)){ buffer = pulse_devin->buffer[6]; }else{ buffer = NULL; } return(buffer); } guint ags_pulse_devin_get_delay_counter(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint delay_counter; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* delay counter */ g_rec_mutex_lock(pulse_devin_mutex); delay_counter = pulse_devin->delay_counter; g_rec_mutex_unlock(pulse_devin_mutex); return(delay_counter); } void ags_pulse_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set note offset */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->start_note_offset = start_note_offset; g_rec_mutex_unlock(pulse_devin_mutex); } guint ags_pulse_devin_get_start_note_offset(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint start_note_offset; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set note offset */ g_rec_mutex_lock(pulse_devin_mutex); start_note_offset = pulse_devin->start_note_offset; g_rec_mutex_unlock(pulse_devin_mutex); return(start_note_offset); } void ags_pulse_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set note offset */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->note_offset = note_offset; g_rec_mutex_unlock(pulse_devin_mutex); } guint ags_pulse_devin_get_note_offset(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint note_offset; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set note offset */ g_rec_mutex_lock(pulse_devin_mutex); note_offset = pulse_devin->note_offset; g_rec_mutex_unlock(pulse_devin_mutex); return(note_offset); } void ags_pulse_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set note offset */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(pulse_devin_mutex); } guint ags_pulse_devin_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint note_offset_absolute; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set note offset */ g_rec_mutex_lock(pulse_devin_mutex); note_offset_absolute = pulse_devin->note_offset_absolute; g_rec_mutex_unlock(pulse_devin_mutex); return(note_offset_absolute); } void ags_pulse_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* set loop */ g_rec_mutex_lock(pulse_devin_mutex); pulse_devin->loop_left = loop_left; pulse_devin->loop_right = loop_right; pulse_devin->do_loop = do_loop; if(do_loop){ pulse_devin->loop_offset = pulse_devin->note_offset; } g_rec_mutex_unlock(pulse_devin_mutex); } void ags_pulse_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsPulseDevin *pulse_devin; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get loop */ g_rec_mutex_lock(pulse_devin_mutex); if(loop_left != NULL){ *loop_left = pulse_devin->loop_left; } if(loop_right != NULL){ *loop_right = pulse_devin->loop_right; } if(do_loop != NULL){ *do_loop = pulse_devin->do_loop; } g_rec_mutex_unlock(pulse_devin_mutex); } guint ags_pulse_devin_get_loop_offset(AgsSoundcard *soundcard) { AgsPulseDevin *pulse_devin; guint loop_offset; GRecMutex *pulse_devin_mutex; pulse_devin = AGS_PULSE_DEVIN(soundcard); /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get loop offset */ g_rec_mutex_lock(pulse_devin_mutex); loop_offset = pulse_devin->loop_offset; g_rec_mutex_unlock(pulse_devin_mutex); return(loop_offset); } /** * ags_pulse_devin_switch_buffer_flag: * @pulse_devin: an #AgsPulseDevin * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_pulse_devin_switch_buffer_flag(AgsPulseDevin *pulse_devin) { GRecMutex *pulse_devin_mutex; if(!AGS_IS_PULSE_DEVIN(pulse_devin)){ return; } /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* switch buffer flag */ g_rec_mutex_lock(pulse_devin_mutex); if((AGS_PULSE_DEVIN_BUFFER0 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER0); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER1; }else if((AGS_PULSE_DEVIN_BUFFER1 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER1); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER2; }else if((AGS_PULSE_DEVIN_BUFFER2 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER2); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER3; }else if((AGS_PULSE_DEVIN_BUFFER3 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER3); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER4; }else if((AGS_PULSE_DEVIN_BUFFER4 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER4); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER5; }else if((AGS_PULSE_DEVIN_BUFFER5 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER5); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER6; }else if((AGS_PULSE_DEVIN_BUFFER6 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER6); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER7; }else if((AGS_PULSE_DEVIN_BUFFER7 & (pulse_devin->flags)) != 0){ pulse_devin->flags &= (~AGS_PULSE_DEVIN_BUFFER7); pulse_devin->flags |= AGS_PULSE_DEVIN_BUFFER0; } g_rec_mutex_unlock(pulse_devin_mutex); } /** * ags_pulse_devin_adjust_delay_and_attack: * @pulse_devin: the #AgsPulseDevin * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_pulse_devin_adjust_delay_and_attack(AgsPulseDevin *pulse_devin) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *pulse_devin_mutex; if(!AGS_IS_PULSE_DEVIN(pulse_devin)){ return; } /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get some initial values */ delay = ags_pulse_devin_get_absolute_delay(AGS_SOUNDCARD(pulse_devin)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(pulse_devin_mutex); default_tact_frames = (guint) (delay * pulse_devin->buffer_size); delay_tact_frames = (guint) (floor(delay) * pulse_devin->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; pulse_devin->attack[0] = (guint) floor(0.25 * pulse_devin->buffer_size); next_attack = (((pulse_devin->attack[i] + default_tact_frames) / pulse_devin->buffer_size) - delay) * pulse_devin->buffer_size; if(next_attack >= pulse_devin->buffer_size){ next_attack = pulse_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ pulse_devin->attack[i] = pulse_devin->attack[i] - ((gdouble) next_attack / 2.0); if(pulse_devin->attack[i] < 0){ pulse_devin->attack[i] = 0; } if(pulse_devin->attack[i] >= pulse_devin->buffer_size){ pulse_devin->attack[i] = pulse_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= pulse_devin->buffer_size){ next_attack = pulse_devin->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ pulse_devin->attack[i] = next_attack; next_attack = (((pulse_devin->attack[i] + default_tact_frames) / pulse_devin->buffer_size) - delay) * pulse_devin->buffer_size; if(next_attack >= pulse_devin->buffer_size){ next_attack = pulse_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ pulse_devin->attack[i] = pulse_devin->attack[i] - ((gdouble) next_attack / 2.0); if(pulse_devin->attack[i] < 0){ pulse_devin->attack[i] = 0; } if(pulse_devin->attack[i] >= pulse_devin->buffer_size){ pulse_devin->attack[i] = pulse_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= pulse_devin->buffer_size){ next_attack = pulse_devin->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", pulse_devin->attack[i]); #endif } pulse_devin->attack[0] = pulse_devin->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ pulse_devin->delay[i] = ((gdouble) (default_tact_frames + pulse_devin->attack[i] - pulse_devin->attack[i + 1])) / (gdouble) pulse_devin->buffer_size; #ifdef AGS_DEBUG g_message("%f", pulse_devin->delay[i]); #endif } pulse_devin->delay[i] = ((gdouble) (default_tact_frames + pulse_devin->attack[i] - pulse_devin->attack[0])) / (gdouble) pulse_devin->buffer_size; g_rec_mutex_unlock(pulse_devin_mutex); } /** * ags_pulse_devin_realloc_buffer: * @pulse_devin: the #AgsPulseDevin * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_pulse_devin_realloc_buffer(AgsPulseDevin *pulse_devin) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *pulse_devin_mutex; if(!AGS_IS_PULSE_DEVIN(pulse_devin)){ return; } /* get pulse devin mutex */ pulse_devin_mutex = AGS_PULSE_DEVIN_GET_OBJ_MUTEX(pulse_devin); /* get word size */ g_rec_mutex_lock(pulse_devin_mutex); pcm_channels = pulse_devin->pcm_channels; buffer_size = pulse_devin->buffer_size; format = pulse_devin->format; g_rec_mutex_unlock(pulse_devin_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_pulse_devin_realloc_buffer(): unsupported word size"); return; } /* AGS_PULSE_DEVIN_BUFFER_0 */ if(pulse_devin->buffer[0] != NULL){ free(pulse_devin->buffer[0]); } pulse_devin->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_1 */ if(pulse_devin->buffer[1] != NULL){ free(pulse_devin->buffer[1]); } pulse_devin->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_2 */ if(pulse_devin->buffer[2] != NULL){ free(pulse_devin->buffer[2]); } pulse_devin->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_3 */ if(pulse_devin->buffer[3] != NULL){ free(pulse_devin->buffer[3]); } pulse_devin->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_4 */ if(pulse_devin->buffer[4] != NULL){ free(pulse_devin->buffer[4]); } pulse_devin->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_5 */ if(pulse_devin->buffer[5] != NULL){ free(pulse_devin->buffer[5]); } pulse_devin->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_6 */ if(pulse_devin->buffer[6] != NULL){ free(pulse_devin->buffer[6]); } pulse_devin->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVIN_BUFFER_7 */ if(pulse_devin->buffer[7] != NULL){ free(pulse_devin->buffer[7]); } pulse_devin->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_pulse_devin_new: * * Creates a new instance of #AgsPulseDevin. * * Returns: the new #AgsPulseDevin * * Since: 3.0.0 */ AgsPulseDevin* ags_pulse_devin_new() { AgsPulseDevin *pulse_devin; pulse_devin = (AgsPulseDevin *) g_object_new(AGS_TYPE_PULSE_DEVIN, NULL); return(pulse_devin); } gsequencer-3.1.3/ags/audio/pulse/ags_pulse_devout.h0000644000175000017500000001504713607210263017333 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PULSE_DEVOUT_H__ #define __AGS_PULSE_DEVOUT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PULSE_DEVOUT (ags_pulse_devout_get_type()) #define AGS_PULSE_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PULSE_DEVOUT, AgsPulseDevout)) #define AGS_PULSE_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PULSE_DEVOUT, AgsPulseDevout)) #define AGS_IS_PULSE_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PULSE_DEVOUT)) #define AGS_IS_PULSE_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PULSE_DEVOUT)) #define AGS_PULSE_DEVOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PULSE_DEVOUT, AgsPulseDevoutClass)) #define AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(obj) (&(((AgsPulseDevout *) obj)->obj_mutex)) typedef struct _AgsPulseDevout AgsPulseDevout; typedef struct _AgsPulseDevoutClass AgsPulseDevoutClass; /** * AgsPulseDevoutFlags: * @AGS_PULSE_DEVOUT_ADDED_TO_REGISTRY: the pulseaudio devout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PULSE_DEVOUT_CONNECTED: indicates the pulseaudio devout was connected by calling #AgsConnectable::connect() * @AGS_PULSE_DEVOUT_BUFFER0: ring-buffer 0 * @AGS_PULSE_DEVOUT_BUFFER1: ring-buffer 1 * @AGS_PULSE_DEVOUT_BUFFER2: ring-buffer 2 * @AGS_PULSE_DEVOUT_BUFFER3: ring-buffer 3 * @AGS_PULSE_DEVOUT_BUFFER4: ring-buffer 4 * @AGS_PULSE_DEVOUT_BUFFER5: ring-buffer 5 * @AGS_PULSE_DEVOUT_BUFFER6: ring-buffer 6 * @AGS_PULSE_DEVOUT_BUFFER7: ring-buffer 7 * @AGS_PULSE_DEVOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_PULSE_DEVOUT_PLAY: do playback * @AGS_PULSE_DEVOUT_SHUTDOWN: stop playback * @AGS_PULSE_DEVOUT_START_PLAY: playback starting * @AGS_PULSE_DEVOUT_NONBLOCKING: do non-blocking calls * @AGS_PULSE_DEVOUT_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsPulseDevout by * enable/disable as flags. */ typedef enum{ AGS_PULSE_DEVOUT_ADDED_TO_REGISTRY = 1, AGS_PULSE_DEVOUT_CONNECTED = 1 << 1, AGS_PULSE_DEVOUT_BUFFER0 = 1 << 2, AGS_PULSE_DEVOUT_BUFFER1 = 1 << 3, AGS_PULSE_DEVOUT_BUFFER2 = 1 << 4, AGS_PULSE_DEVOUT_BUFFER3 = 1 << 5, AGS_PULSE_DEVOUT_BUFFER4 = 1 << 6, AGS_PULSE_DEVOUT_BUFFER5 = 1 << 7, AGS_PULSE_DEVOUT_BUFFER6 = 1 << 8, AGS_PULSE_DEVOUT_BUFFER7 = 1 << 9, AGS_PULSE_DEVOUT_ATTACK_FIRST = 1 << 10, AGS_PULSE_DEVOUT_PLAY = 1 << 11, AGS_PULSE_DEVOUT_SHUTDOWN = 1 << 12, AGS_PULSE_DEVOUT_START_PLAY = 1 << 13, AGS_PULSE_DEVOUT_NONBLOCKING = 1 << 14, AGS_PULSE_DEVOUT_INITIALIZED = 1 << 15, }AgsPulseDevoutFlags; /** * AgsPulseDevoutSyncFlags: * @AGS_PULSE_DEVOUT_PASS_THROUGH: do not sync * @AGS_PULSE_DEVOUT_INITIAL_CALLBACK: initial callback * @AGS_PULSE_DEVOUT_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_PULSE_DEVOUT_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_PULSE_DEVOUT_PASS_THROUGH = 1, AGS_PULSE_DEVOUT_INITIAL_CALLBACK = 1 << 1, AGS_PULSE_DEVOUT_CALLBACK_WAIT = 1 << 2, AGS_PULSE_DEVOUT_CALLBACK_DONE = 1 << 3, AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT = 1 << 4, AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE = 1 << 5, }AgsPulseDevoutSyncFlags; #define AGS_PULSE_DEVOUT_ERROR (ags_pulse_devout_error_quark()) typedef enum{ AGS_PULSE_DEVOUT_ERROR_LOCKED_SOUNDCARD, }AgsPulseDevoutError; struct _AgsPulseDevout { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void **buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *pulse_client; gchar **port_name; GList *pulse_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; GObject *notify_soundcard; }; struct _AgsPulseDevoutClass { GObjectClass gobject; }; GType ags_pulse_devout_get_type(); GQuark ags_pulse_devout_error_quark(); gboolean ags_pulse_devout_test_flags(AgsPulseDevout *pulse_devout, guint flags); void ags_pulse_devout_set_flags(AgsPulseDevout *pulse_devout, guint flags); void ags_pulse_devout_unset_flags(AgsPulseDevout *pulse_devout, guint flags); void ags_pulse_devout_switch_buffer_flag(AgsPulseDevout *pulse_devout); void ags_pulse_devout_adjust_delay_and_attack(AgsPulseDevout *pulse_devout); void ags_pulse_devout_realloc_buffer(AgsPulseDevout *pulse_devout); AgsPulseDevout* ags_pulse_devout_new(); G_END_DECLS #endif /*__AGS_PULSE_DEVOUT_H__*/ gsequencer-3.1.3/ags/audio/pulse/ags_pulse_devout.c0000644000175000017500000026205613607210263017332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_pulse_devout_class_init(AgsPulseDevoutClass *pulse_devout); void ags_pulse_devout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_pulse_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_pulse_devout_init(AgsPulseDevout *pulse_devout); void ags_pulse_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_pulse_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_pulse_devout_dispose(GObject *gobject); void ags_pulse_devout_finalize(GObject *gobject); AgsUUID* ags_pulse_devout_get_uuid(AgsConnectable *connectable); gboolean ags_pulse_devout_has_resource(AgsConnectable *connectable); gboolean ags_pulse_devout_is_ready(AgsConnectable *connectable); void ags_pulse_devout_add_to_registry(AgsConnectable *connectable); void ags_pulse_devout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_pulse_devout_list_resource(AgsConnectable *connectable); xmlNode* ags_pulse_devout_xml_compose(AgsConnectable *connectable); void ags_pulse_devout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_pulse_devout_is_connected(AgsConnectable *connectable); void ags_pulse_devout_connect(AgsConnectable *connectable); void ags_pulse_devout_disconnect(AgsConnectable *connectable); void ags_pulse_devout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_pulse_devout_get_device(AgsSoundcard *soundcard); void ags_pulse_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_pulse_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_pulse_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_pulse_devout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_pulse_devout_get_capability(AgsSoundcard *soundcard); gboolean ags_pulse_devout_is_starting(AgsSoundcard *soundcard); gboolean ags_pulse_devout_is_playing(AgsSoundcard *soundcard); gchar* ags_pulse_devout_get_uptime(AgsSoundcard *soundcard); void ags_pulse_devout_port_init(AgsSoundcard *soundcard, GError **error); void ags_pulse_devout_port_play(AgsSoundcard *soundcard, GError **error); void ags_pulse_devout_port_free(AgsSoundcard *soundcard); void ags_pulse_devout_tic(AgsSoundcard *soundcard); void ags_pulse_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_pulse_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_pulse_devout_get_bpm(AgsSoundcard *soundcard); void ags_pulse_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_pulse_devout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_pulse_devout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_pulse_devout_get_delay(AgsSoundcard *soundcard); guint ags_pulse_devout_get_attack(AgsSoundcard *soundcard); void* ags_pulse_devout_get_buffer(AgsSoundcard *soundcard); void* ags_pulse_devout_get_next_buffer(AgsSoundcard *soundcard); void* ags_pulse_devout_get_prev_buffer(AgsSoundcard *soundcard); void ags_pulse_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_pulse_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_pulse_devout_get_delay_counter(AgsSoundcard *soundcard); void ags_pulse_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_pulse_devout_get_start_note_offset(AgsSoundcard *soundcard); void ags_pulse_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_pulse_devout_get_note_offset(AgsSoundcard *soundcard); void ags_pulse_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_pulse_devout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_pulse_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_pulse_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_pulse_devout_get_loop_offset(AgsSoundcard *soundcard); guint ags_pulse_devout_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_pulse_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_pulse_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); /** * SECTION:ags_pulse_devout * @short_description: Output to soundcard * @title: AgsPulseDevout * @section_id: * @include: ags/audio/pulse/ags_pulse_devout.h * * #AgsPulseDevout represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_PULSE_CLIENT, PROP_PULSE_PORT, }; static gpointer ags_pulse_devout_parent_class = NULL; GType ags_pulse_devout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_pulse_devout = 0; static const GTypeInfo ags_pulse_devout_info = { sizeof(AgsPulseDevoutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_pulse_devout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPulseDevout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_pulse_devout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_pulse_devout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_pulse_devout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_pulse_devout = g_type_register_static(G_TYPE_OBJECT, "AgsPulseDevout", &ags_pulse_devout_info, 0); g_type_add_interface_static(ags_type_pulse_devout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_pulse_devout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_pulse_devout); } return g_define_type_id__volatile; } void ags_pulse_devout_class_init(AgsPulseDevoutClass *pulse_devout) { GObjectClass *gobject; GParamSpec *param_spec; ags_pulse_devout_parent_class = g_type_class_peek_parent(pulse_devout); /* GObjectClass */ gobject = (GObjectClass *) pulse_devout; gobject->set_property = ags_pulse_devout_set_property; gobject->get_property = ags_pulse_devout_get_property; gobject->dispose = ags_pulse_devout_dispose; gobject->finalize = ags_pulse_devout_finalize; /* properties */ /** * AgsPulseDevout:device: * * The pulse soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-pulse-devout-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsPulseDevout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), AGS_SOUNDCARD_MIN_DSP_CHANNELS, AGS_SOUNDCARD_MAX_DSP_CHANNELS, AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsPulseDevout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), AGS_SOUNDCARD_MIN_PCM_CHANNELS, AGS_SOUNDCARD_MAX_PCM_CHANNELS, AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsPulseDevout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsPulseDevout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), AGS_SOUNDCARD_MIN_BUFFER_SIZE, AGS_SOUNDCARD_MAX_BUFFER_SIZE, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsPulseDevout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), AGS_SOUNDCARD_MIN_SAMPLERATE, AGS_SOUNDCARD_MAX_SAMPLERATE, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsPulseDevout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsPulseDevout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, AGS_SOUNDCARD_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsPulseDevout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsPulseDevout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsPulseDevout:pulse-client: * * The assigned #AgsPulseClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("pulse-client", i18n_pspec("pulse client object"), i18n_pspec("The pulse client object"), AGS_TYPE_PULSE_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_CLIENT, param_spec); /** * AgsPulseDevout:pulse-port: * * The assigned #AgsPulsePort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("pulse-port", i18n_pspec("pulse port object"), i18n_pspec("The pulse port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PULSE_PORT, param_spec); } GQuark ags_pulse_devout_error_quark() { return(g_quark_from_static_string("ags-pulse_devout-error-quark")); } void ags_pulse_devout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_pulse_devout_get_uuid; connectable->has_resource = ags_pulse_devout_has_resource; connectable->is_ready = ags_pulse_devout_is_ready; connectable->add_to_registry = ags_pulse_devout_add_to_registry; connectable->remove_from_registry = ags_pulse_devout_remove_from_registry; connectable->list_resource = ags_pulse_devout_list_resource; connectable->xml_compose = ags_pulse_devout_xml_compose; connectable->xml_parse = ags_pulse_devout_xml_parse; connectable->is_connected = ags_pulse_devout_is_connected; connectable->connect = ags_pulse_devout_connect; connectable->disconnect = ags_pulse_devout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_pulse_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_pulse_devout_set_device; soundcard->get_device = ags_pulse_devout_get_device; soundcard->set_presets = ags_pulse_devout_set_presets; soundcard->get_presets = ags_pulse_devout_get_presets; soundcard->list_cards = ags_pulse_devout_list_cards; soundcard->pcm_info = ags_pulse_devout_pcm_info; soundcard->get_capability = ags_pulse_devout_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_pulse_devout_is_starting; soundcard->is_playing = ags_pulse_devout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_pulse_devout_get_uptime; soundcard->play_init = ags_pulse_devout_port_init; soundcard->play = ags_pulse_devout_port_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_pulse_devout_port_free; soundcard->tic = ags_pulse_devout_tic; soundcard->offset_changed = ags_pulse_devout_offset_changed; soundcard->set_bpm = ags_pulse_devout_set_bpm; soundcard->get_bpm = ags_pulse_devout_get_bpm; soundcard->set_delay_factor = ags_pulse_devout_set_delay_factor; soundcard->get_delay_factor = ags_pulse_devout_get_delay_factor; soundcard->get_absolute_delay = ags_pulse_devout_get_absolute_delay; soundcard->get_delay = ags_pulse_devout_get_delay; soundcard->get_attack = ags_pulse_devout_get_attack; soundcard->get_buffer = ags_pulse_devout_get_buffer; soundcard->get_next_buffer = ags_pulse_devout_get_next_buffer; soundcard->get_prev_buffer = ags_pulse_devout_get_prev_buffer; soundcard->lock_buffer = ags_pulse_devout_lock_buffer; soundcard->unlock_buffer = ags_pulse_devout_unlock_buffer; soundcard->get_delay_counter = ags_pulse_devout_get_delay_counter; soundcard->set_start_note_offset = ags_pulse_devout_set_start_note_offset; soundcard->get_start_note_offset = ags_pulse_devout_get_start_note_offset; soundcard->set_note_offset = ags_pulse_devout_set_note_offset; soundcard->get_note_offset = ags_pulse_devout_get_note_offset; soundcard->set_note_offset_absolute = ags_pulse_devout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_pulse_devout_get_note_offset_absolute; soundcard->set_loop = ags_pulse_devout_set_loop; soundcard->get_loop = ags_pulse_devout_get_loop; soundcard->get_loop_offset = ags_pulse_devout_get_loop_offset; soundcard->get_sub_block_count = ags_pulse_devout_get_sub_block_count; soundcard->trylock_sub_block = ags_pulse_devout_trylock_sub_block; soundcard->unlock_sub_block = ags_pulse_devout_unlock_sub_block; } void ags_pulse_devout_init(AgsPulseDevout *pulse_devout) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ pulse_devout->flags = 0; g_atomic_int_set(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_PASS_THROUGH); /* devout mutex */ g_rec_mutex_init(&(pulse_devout->obj_mutex)); /* uuid */ pulse_devout->uuid = ags_uuid_alloc(); ags_uuid_generate(pulse_devout->uuid); /* presets */ config = ags_config_get_instance(); pulse_devout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); pulse_devout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); pulse_devout->samplerate = ags_soundcard_helper_config_get_samplerate(config); pulse_devout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); pulse_devout->format = ags_soundcard_helper_config_get_format(config); /* */ pulse_devout->card_uri = NULL; pulse_devout->pulse_client = NULL; pulse_devout->port_name = NULL; pulse_devout->pulse_port = NULL; /* buffer */ pulse_devout->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ pulse_devout->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(pulse_devout->buffer_mutex[i]); } pulse_devout->sub_block_count = AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT; pulse_devout->sub_block_mutex = (GRecMutex **) malloc(8 * pulse_devout->sub_block_count * pulse_devout->pcm_channels * sizeof(GRecMutex *)); for(i = 0; i < 8 * pulse_devout->sub_block_count * pulse_devout->pcm_channels; i++){ pulse_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(pulse_devout->sub_block_mutex[i]); } pulse_devout->buffer = (void **) malloc(8 * sizeof(void*)); pulse_devout->buffer[0] = NULL; pulse_devout->buffer[1] = NULL; pulse_devout->buffer[2] = NULL; pulse_devout->buffer[3] = NULL; pulse_devout->buffer[4] = NULL; pulse_devout->buffer[5] = NULL; pulse_devout->buffer[6] = NULL; pulse_devout->buffer[7] = NULL; ags_pulse_devout_realloc_buffer(pulse_devout); /* bpm */ pulse_devout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ pulse_devout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); pulse_devout->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ pulse_devout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); pulse_devout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); /* counters */ pulse_devout->tact_counter = 0.0; pulse_devout->delay_counter = 0; pulse_devout->tic_counter = 0; pulse_devout->start_note_offset = 0; pulse_devout->note_offset = 0; pulse_devout->note_offset_absolute = 0; pulse_devout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; pulse_devout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; pulse_devout->do_loop = FALSE; pulse_devout->loop_offset = 0; /* callback mutex */ g_mutex_init(&(pulse_devout->callback_mutex)); g_cond_init(&(pulse_devout->callback_cond)); /* callback finish mutex */ g_mutex_init(&(pulse_devout->callback_finish_mutex)); g_cond_init(&(pulse_devout->callback_finish_cond)); } void ags_pulse_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(gobject); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->card_uri = g_strdup(device); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(pulse_devout_mutex); if(dsp_channels == pulse_devout->dsp_channels){ g_rec_mutex_unlock(pulse_devout_mutex); return; } pulse_devout->dsp_channels = dsp_channels; g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels, old_pcm_channels; guint i; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(pulse_devout_mutex); if(pcm_channels == pulse_devout->pcm_channels){ g_rec_mutex_unlock(pulse_devout_mutex); return; } old_pcm_channels = pulse_devout->pcm_channels; /* destroy if less pcm-channels */ for(i = 8 * pulse_devout->sub_block_count * pcm_channels; i < 8 * pulse_devout->sub_block_count * old_pcm_channels; i++){ g_rec_mutex_clear(pulse_devout->sub_block_mutex[i]); free(pulse_devout->sub_block_mutex[i]); } pulse_devout->sub_block_mutex = (GRecMutex **) realloc(pulse_devout->sub_block_mutex, 8 * pulse_devout->sub_block_count * pcm_channels * sizeof(GRecMutex *)); /* create if more pcm-channels */ for(i = 8 * pulse_devout->sub_block_count * old_pcm_channels; i < 8 * pulse_devout->sub_block_count * pcm_channels; i++){ pulse_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(pulse_devout->sub_block_mutex[i]); } pulse_devout->pcm_channels = pcm_channels; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_realloc_buffer(pulse_devout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(pulse_devout_mutex); if(format == pulse_devout->format){ g_rec_mutex_unlock(pulse_devout_mutex); return; } pulse_devout->format = format; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_realloc_buffer(pulse_devout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(pulse_devout_mutex); if(buffer_size == pulse_devout->buffer_size){ g_rec_mutex_unlock(pulse_devout_mutex); return; } pulse_devout->buffer_size = buffer_size; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_realloc_buffer(pulse_devout); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(pulse_devout_mutex); if(samplerate == pulse_devout->samplerate){ g_rec_mutex_unlock(pulse_devout_mutex); return; } pulse_devout->samplerate = samplerate; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_realloc_buffer(pulse_devout); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(pulse_devout_mutex); if(bpm == pulse_devout->bpm){ g_rec_mutex_unlock(pulse_devout_mutex); return; } pulse_devout->bpm = bpm; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->delay_factor = delay_factor; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); } break; case PROP_PULSE_CLIENT: { AgsPulseClient *pulse_client; pulse_client = (AgsPulseClient *) g_value_get_object(value); g_rec_mutex_lock(pulse_devout_mutex); if(pulse_devout->pulse_client == (GObject *) pulse_client){ g_rec_mutex_unlock(pulse_devout_mutex); return; } if(pulse_devout->pulse_client != NULL){ g_object_unref(G_OBJECT(pulse_devout->pulse_client)); } if(pulse_client != NULL){ g_object_ref(pulse_client); } pulse_devout->pulse_client = (GObject *) pulse_client; g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_PULSE_PORT: { AgsPulsePort *pulse_port; pulse_port = (AgsPulsePort *) g_value_get_pointer(value); g_rec_mutex_lock(pulse_devout_mutex); if(!AGS_IS_PULSE_PORT(pulse_port) || g_list_find(pulse_devout->pulse_port, pulse_port) != NULL){ g_rec_mutex_unlock(pulse_devout_mutex); return; } g_object_ref(pulse_port); pulse_devout->pulse_port = g_list_append(pulse_devout->pulse_port, pulse_port); g_rec_mutex_unlock(pulse_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(gobject); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_string(value, pulse_devout->card_uri); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_uint(value, pulse_devout->dsp_channels); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_uint(value, pulse_devout->pcm_channels); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_uint(value, pulse_devout->format); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_uint(value, pulse_devout->buffer_size); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_uint(value, pulse_devout->samplerate); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_pointer(value, pulse_devout->buffer); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_double(value, pulse_devout->bpm); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_double(value, pulse_devout->delay_factor); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_pointer(value, pulse_devout->attack); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_PULSE_CLIENT: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_object(value, pulse_devout->pulse_client); g_rec_mutex_unlock(pulse_devout_mutex); } break; case PROP_PULSE_PORT: { g_rec_mutex_lock(pulse_devout_mutex); g_value_set_pointer(value, g_list_copy_deep(pulse_devout->pulse_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(pulse_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_pulse_devout_dispose(GObject *gobject) { AgsPulseDevout *pulse_devout; pulse_devout = AGS_PULSE_DEVOUT(gobject); /* pulse client */ if(pulse_devout->pulse_client != NULL){ g_object_unref(pulse_devout->pulse_client); pulse_devout->pulse_client = NULL; } /* pulse port */ g_list_free_full(pulse_devout->pulse_port, g_object_unref); pulse_devout->pulse_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_pulse_devout_parent_class)->dispose(gobject); } void ags_pulse_devout_finalize(GObject *gobject) { AgsPulseDevout *pulse_devout; pulse_devout = AGS_PULSE_DEVOUT(gobject); /* free output buffer */ free(pulse_devout->buffer[0]); free(pulse_devout->buffer[1]); free(pulse_devout->buffer[2]); free(pulse_devout->buffer[3]); free(pulse_devout->buffer[4]); free(pulse_devout->buffer[5]); free(pulse_devout->buffer[6]); free(pulse_devout->buffer[7]); /* free buffer array */ free(pulse_devout->buffer); /* free AgsAttack */ free(pulse_devout->attack); /* pulse client */ if(pulse_devout->pulse_client != NULL){ g_object_unref(pulse_devout->pulse_client); } /* pulse port */ g_list_free_full(pulse_devout->pulse_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_pulse_devout_parent_class)->finalize(gobject); } AgsUUID* ags_pulse_devout_get_uuid(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; AgsUUID *ptr; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(connectable); /* get pulse devout signal mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get UUID */ g_rec_mutex_lock(pulse_devout_mutex); ptr = pulse_devout->uuid; g_rec_mutex_unlock(pulse_devout_mutex); return(ptr); } gboolean ags_pulse_devout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_pulse_devout_is_ready(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; gboolean is_ready; pulse_devout = AGS_PULSE_DEVOUT(connectable); /* check is added */ is_ready = ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_pulse_devout_add_to_registry(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; if(ags_connectable_is_ready(connectable)){ return; } pulse_devout = AGS_PULSE_DEVOUT(connectable); ags_pulse_devout_set_flags(pulse_devout, AGS_PULSE_DEVOUT_ADDED_TO_REGISTRY); } void ags_pulse_devout_remove_from_registry(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; if(!ags_connectable_is_ready(connectable)){ return; } pulse_devout = AGS_PULSE_DEVOUT(connectable); ags_pulse_devout_unset_flags(pulse_devout, AGS_PULSE_DEVOUT_ADDED_TO_REGISTRY); } xmlNode* ags_pulse_devout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_pulse_devout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_pulse_devout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_pulse_devout_is_connected(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; gboolean is_connected; pulse_devout = AGS_PULSE_DEVOUT(connectable); /* check is connected */ is_connected = ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_CONNECTED); return(is_connected); } void ags_pulse_devout_connect(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; if(ags_connectable_is_connected(connectable)){ return; } pulse_devout = AGS_PULSE_DEVOUT(connectable); ags_pulse_devout_set_flags(pulse_devout, AGS_PULSE_DEVOUT_CONNECTED); } void ags_pulse_devout_disconnect(AgsConnectable *connectable) { AgsPulseDevout *pulse_devout; if(!ags_connectable_is_connected(connectable)){ return; } pulse_devout = AGS_PULSE_DEVOUT(connectable); ags_pulse_devout_unset_flags(pulse_devout, AGS_PULSE_DEVOUT_CONNECTED); } /** * ags_pulse_devout_test_flags: * @pulse_devout: the #AgsPulseDevout * @flags: the flags * * Test @flags to be set on @pulse_devout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_pulse_devout_test_flags(AgsPulseDevout *pulse_devout, guint flags) { gboolean retval; GRecMutex *pulse_devout_mutex; if(!AGS_IS_PULSE_DEVOUT(pulse_devout)){ return(FALSE); } /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* test */ g_rec_mutex_lock(pulse_devout_mutex); retval = (flags & (pulse_devout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_devout_mutex); return(retval); } /** * ags_pulse_devout_set_flags: * @pulse_devout: the #AgsPulseDevout * @flags: see #AgsPulseDevoutFlags-enum * * Enable a feature of @pulse_devout. * * Since: 3.0.0 */ void ags_pulse_devout_set_flags(AgsPulseDevout *pulse_devout, guint flags) { GRecMutex *pulse_devout_mutex; if(!AGS_IS_PULSE_DEVOUT(pulse_devout)){ return; } /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->flags |= flags; g_rec_mutex_unlock(pulse_devout_mutex); } /** * ags_pulse_devout_unset_flags: * @pulse_devout: the #AgsPulseDevout * @flags: see #AgsPulseDevoutFlags-enum * * Disable a feature of @pulse_devout. * * Since: 3.0.0 */ void ags_pulse_devout_unset_flags(AgsPulseDevout *pulse_devout, guint flags) { GRecMutex *pulse_devout_mutex; if(!AGS_IS_PULSE_DEVOUT(pulse_devout)){ return; } /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->flags &= (~flags); g_rec_mutex_unlock(pulse_devout_mutex); } void ags_pulse_devout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsPulseDevout *pulse_devout; GList *pulse_port, *pulse_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* check device */ g_rec_mutex_lock(pulse_devout_mutex); if(pulse_devout->card_uri == device || !g_ascii_strcasecmp(pulse_devout->card_uri, device)){ g_rec_mutex_unlock(pulse_devout_mutex); return; } if(!g_str_has_prefix(device, "ags-pulse-devout-")){ g_rec_mutex_unlock(pulse_devout_mutex); g_warning("invalid pulseaudio device prefix"); return; } ret = sscanf(device, "ags-pulse-devout-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(pulse_devout_mutex); g_warning("invalid pulseaudio device specifier"); return; } g_free(pulse_devout->card_uri); pulse_devout->card_uri = g_strdup(device); /* apply name to port */ pcm_channels = pulse_devout->pcm_channels; pulse_port_start = pulse_port = g_list_copy(pulse_devout->pulse_port); g_rec_mutex_unlock(pulse_devout_mutex); for(i = 0; i < pcm_channels; i++){ str = g_strdup_printf("ags-soundcard%d-%04d", nth_card, i); g_object_set(pulse_port->data, "port-name", str, NULL); g_free(str); pulse_port = pulse_port->next; } g_list_free(pulse_port_start); } gchar* ags_pulse_devout_get_device(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gchar *device; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); device = NULL; /* get device */ g_rec_mutex_lock(pulse_devout_mutex); device = g_strdup(pulse_devout->card_uri); g_rec_mutex_unlock(pulse_devout_mutex); return(device); } void ags_pulse_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsPulseDevout *pulse_devout; pulse_devout = AGS_PULSE_DEVOUT(soundcard); g_object_set(pulse_devout, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_pulse_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get presets */ g_rec_mutex_lock(pulse_devout_mutex); if(channels != NULL){ *channels = pulse_devout->pcm_channels; } if(rate != NULL){ *rate = pulse_devout->samplerate; } if(buffer_size != NULL){ *buffer_size = pulse_devout->buffer_size; } if(format != NULL){ *format = pulse_devout->format; } g_rec_mutex_unlock(pulse_devout_mutex); } void ags_pulse_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsPulseClient *pulse_client; AgsPulseDevout *pulse_devout; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; pulse_devout = AGS_PULSE_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_PULSE_DEVOUT(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_PULSE_DEVOUT(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_pulse_devout_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "pulse-client", &pulse_client, NULL); if(pulse_client != NULL){ /* get client name */ g_object_get(pulse_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(pulse_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_pulse_devout_list_cards() - pulseaudio client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_pulse_devout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_pulse_devout_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_PLAYBACK); } gboolean ags_pulse_devout_is_starting(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gboolean is_starting; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* check is starting */ g_rec_mutex_lock(pulse_devout_mutex); is_starting = ((AGS_PULSE_DEVOUT_START_PLAY & (pulse_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_devout_mutex); return(is_starting); } gboolean ags_pulse_devout_is_playing(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gboolean is_playing; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* check is starting */ g_rec_mutex_lock(pulse_devout_mutex); is_playing = ((AGS_PULSE_DEVOUT_PLAY & (pulse_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_devout_mutex); return(is_playing); } gchar* ags_pulse_devout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_pulse_devout_port_init(AgsSoundcard *soundcard, GError **error) { AgsPulsePort *pulse_port; AgsPulseDevout *pulse_devout; guint format, word_size; gboolean use_cache; GRecMutex *pulse_port_mutex; GRecMutex *pulse_devout_mutex; if(ags_soundcard_is_playing(soundcard)){ return; } pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* port */ g_rec_mutex_lock(pulse_devout_mutex); pulse_port = (AgsPulsePort *) pulse_devout->pulse_port->data; g_rec_mutex_unlock(pulse_devout_mutex); /* get port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* check use cache */ g_rec_mutex_lock(pulse_port_mutex); use_cache = pulse_port->use_cache; if(use_cache){ pulse_port->completed_cache = 0; pulse_port->current_cache = 1; } g_rec_mutex_unlock(pulse_port_mutex); /* retrieve word size */ g_rec_mutex_lock(pulse_devout_mutex); pulse_port = (AgsPulsePort *) pulse_devout->pulse_port->data; switch(pulse_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(pulse_devout_mutex); g_warning("ags_pulse_devout_port_init(): unsupported word size"); return; } /* prepare for playback */ pulse_devout->flags |= (AGS_PULSE_DEVOUT_BUFFER7 | AGS_PULSE_DEVOUT_START_PLAY | AGS_PULSE_DEVOUT_PLAY | AGS_PULSE_DEVOUT_NONBLOCKING); memset(pulse_devout->buffer[0], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[1], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[2], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[3], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[4], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[5], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[6], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[7], 0, pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); /* */ pulse_devout->tact_counter = 0.0; pulse_devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(pulse_devout))); pulse_devout->tic_counter = 0; pulse_devout->flags |= (AGS_PULSE_DEVOUT_INITIALIZED | AGS_PULSE_DEVOUT_START_PLAY | AGS_PULSE_DEVOUT_PLAY); g_atomic_int_and(&(pulse_devout->sync_flags), (~(AGS_PULSE_DEVOUT_PASS_THROUGH))); g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_INITIAL_CALLBACK); g_rec_mutex_unlock(pulse_devout_mutex); } void ags_pulse_devout_port_play(AgsSoundcard *soundcard, GError **error) { AgsPulseClient *pulse_client; AgsPulseDevout *pulse_devout; AgsPulsePort *pulse_port; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean use_cache; gboolean pulse_client_activated; GRecMutex *pulse_devout_mutex; GRecMutex *pulse_client_mutex; GRecMutex *pulse_port_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* client */ g_rec_mutex_lock(pulse_devout_mutex); pulse_client = (AgsPulseClient *) pulse_devout->pulse_client; pulse_port = (AgsPulsePort *) pulse_devout->pulse_port->data; callback_mutex = &(pulse_devout->callback_mutex); callback_finish_mutex = &(pulse_devout->callback_finish_mutex); /* do playback */ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_START_PLAY); if((AGS_PULSE_DEVOUT_INITIALIZED & (pulse_devout->flags)) == 0){ g_rec_mutex_unlock(pulse_devout_mutex); return; } switch(pulse_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(pulse_devout_mutex); g_warning("ags_pulse_devout_port_play(): unsupported word size"); return; } g_rec_mutex_unlock(pulse_devout_mutex); /* get port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* check use cache */ g_rec_mutex_lock(pulse_port_mutex); use_cache = pulse_port->use_cache; g_rec_mutex_unlock(pulse_port_mutex); if(use_cache){ void *buffer; guint current_cache; guint completed_cache; guint write_cache; guint cache_buffer_size; guint cache_offset; guint pcm_channels; guint buffer_size; guint format; struct timespec idle_time = { 0, 0, }; idle_time.tv_nsec = ags_pulse_port_get_latency(pulse_port) / 8; g_rec_mutex_lock(pulse_port_mutex); completed_cache = pulse_port->completed_cache; cache_buffer_size = pulse_port->cache_buffer_size; cache_offset = pulse_port->cache_offset; g_rec_mutex_unlock(pulse_port_mutex); if(completed_cache == 3){ write_cache = 0; }else{ write_cache = completed_cache + 1; } /* wait until ready */ g_rec_mutex_lock(pulse_port_mutex); current_cache = pulse_port->current_cache; g_rec_mutex_unlock(pulse_port_mutex); while(write_cache == current_cache){ nanosleep(&idle_time, NULL); g_rec_mutex_lock(pulse_port_mutex); current_cache = pulse_port->current_cache; g_rec_mutex_unlock(pulse_port_mutex); } /* fill cache */ g_rec_mutex_lock(pulse_devout_mutex); pcm_channels = pulse_devout->pcm_channels; buffer_size = pulse_devout->buffer_size; format = pulse_devout->format; g_rec_mutex_unlock(pulse_devout_mutex); buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(pulse_devout)); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { if(cache_offset == 0){ ags_audio_buffer_util_clear_buffer(pulse_port->cache[write_cache], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); } if(buffer != NULL){ ags_audio_buffer_util_copy_s16_to_s16((gint16 *) pulse_port->cache[write_cache] + (pcm_channels * cache_offset), 1, (gint16 *) buffer, 1, pcm_channels * buffer_size); } } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { if(cache_offset == 0){ ags_audio_buffer_util_clear_buffer(pulse_port->cache[write_cache], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } if(buffer != NULL){ ags_audio_buffer_util_copy_s24_to_s24((gint32 *) pulse_port->cache[write_cache] + (pcm_channels * cache_offset), 1, (gint32 *) buffer, 1, pcm_channels * buffer_size); } } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { if(cache_offset == 0){ ags_audio_buffer_util_clear_buffer(pulse_port->cache[write_cache], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } if(buffer != NULL){ ags_audio_buffer_util_copy_s32_to_s32((gint32 *) pulse_port->cache[write_cache] + (pcm_channels * cache_offset), 1, (gint32 *) buffer, 1, pcm_channels * buffer_size); } } break; } /* seek cache */ if(cache_offset + buffer_size >= cache_buffer_size){ g_rec_mutex_lock(pulse_port_mutex); pulse_port->completed_cache = write_cache; pulse_port->cache_offset = 0; g_rec_mutex_unlock(pulse_port_mutex); }else{ g_rec_mutex_lock(pulse_port_mutex); pulse_port->cache_offset += buffer_size; g_rec_mutex_unlock(pulse_port_mutex); } }else{ /* get client mutex */ pulse_client_mutex = AGS_PULSE_CLIENT_GET_OBJ_MUTEX(pulse_client); /* get activated */ g_rec_mutex_lock(pulse_client_mutex); pulse_client_activated = ((AGS_PULSE_CLIENT_ACTIVATED & (pulse_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(pulse_client_mutex); if(pulse_client_activated){ /* signal */ if((AGS_PULSE_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_CALLBACK_DONE); if((AGS_PULSE_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(pulse_devout->sync_flags)))) != 0){ g_cond_signal(&(pulse_devout->callback_cond)); } g_mutex_unlock(callback_mutex); } /* wait callback */ if((AGS_PULSE_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0){ g_mutex_lock(callback_finish_mutex); if((AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0){ g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT); while((AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(pulse_devout->sync_flags)))) == 0 && (AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(pulse_devout->sync_flags)))) != 0){ g_cond_wait(&(pulse_devout->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(pulse_devout->sync_flags), (~(AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT | AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(pulse_devout->sync_flags), (~AGS_PULSE_DEVOUT_INITIAL_CALLBACK)); } } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) pulse_devout); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) pulse_devout); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) pulse_devout); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_pulse_devout_port_free(AgsSoundcard *soundcard) { AgsPulsePort *pulse_port; AgsPulseDevout *pulse_devout; guint pcm_channels; guint cache_buffer_size; guint word_size; gboolean use_cache; GRecMutex *pulse_port_mutex; GRecMutex *pulse_devout_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* port */ g_rec_mutex_lock(pulse_devout_mutex); pulse_port = (AgsPulsePort *) pulse_devout->pulse_port->data; pcm_channels = pulse_devout->pcm_channels; g_rec_mutex_unlock(pulse_devout_mutex); /* get port mutex */ pulse_port_mutex = AGS_PULSE_PORT_GET_OBJ_MUTEX(pulse_port); /* check use cache */ g_rec_mutex_lock(pulse_port_mutex); cache_buffer_size = pulse_port->cache_buffer_size; use_cache = pulse_port->use_cache; if(use_cache){ pulse_port->completed_cache = 0; pulse_port->current_cache = 0; pulse_port->cache_offset = 0; } switch(pulse_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { ags_audio_buffer_util_clear_buffer(pulse_port->cache[0], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_clear_buffer(pulse_port->cache[1], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_clear_buffer(pulse_port->cache[2], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_clear_buffer(pulse_port->cache[3], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ags_audio_buffer_util_clear_buffer(pulse_port->cache[0], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(pulse_port->cache[1], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(pulse_port->cache[2], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(pulse_port->cache[3], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ags_audio_buffer_util_clear_buffer(pulse_port->cache[0], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(pulse_port->cache[1], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(pulse_port->cache[2], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(pulse_port->cache[3], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } break; } g_rec_mutex_unlock(pulse_port_mutex); /* */ g_rec_mutex_lock(pulse_devout_mutex); if((AGS_PULSE_DEVOUT_INITIALIZED & (pulse_devout->flags)) == 0){ g_rec_mutex_unlock(pulse_devout_mutex); return; } callback_mutex = &(pulse_devout->callback_mutex); callback_finish_mutex = &(pulse_devout->callback_finish_mutex); // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); pulse_devout->flags &= (~(AGS_PULSE_DEVOUT_BUFFER0 | AGS_PULSE_DEVOUT_BUFFER1 | AGS_PULSE_DEVOUT_BUFFER2 | AGS_PULSE_DEVOUT_BUFFER3 | AGS_PULSE_DEVOUT_BUFFER4 | AGS_PULSE_DEVOUT_BUFFER5 | AGS_PULSE_DEVOUT_BUFFER6 | AGS_PULSE_DEVOUT_BUFFER7 | AGS_PULSE_DEVOUT_PLAY)); g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_PASS_THROUGH); g_atomic_int_and(&(pulse_devout->sync_flags), (~AGS_PULSE_DEVOUT_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_CALLBACK_DONE); if((AGS_PULSE_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(pulse_devout->sync_flags)))) != 0){ g_cond_signal(&(pulse_devout->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(pulse_devout->sync_flags), AGS_PULSE_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_PULSE_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(pulse_devout->sync_flags)))) != 0){ g_cond_signal(&(pulse_devout->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ pulse_devout->note_offset = pulse_devout->start_note_offset; pulse_devout->note_offset_absolute = pulse_devout->start_note_offset; switch(pulse_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_pulse_devout_free(): unsupported word size"); } g_rec_mutex_unlock(pulse_devout_mutex); if(pulse_devout->pulse_port != NULL){ pulse_port = pulse_devout->pulse_port->data; while(!g_atomic_int_get(&(pulse_port->is_empty))) usleep(500000); } g_rec_mutex_lock(pulse_devout_mutex); memset(pulse_devout->buffer[0], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[1], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[2], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[3], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[4], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[5], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[6], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); memset(pulse_devout->buffer[7], 0, (size_t) pulse_devout->pcm_channels * pulse_devout->buffer_size * word_size); g_rec_mutex_unlock(pulse_devout_mutex); } void ags_pulse_devout_tic(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* determine if attack should be switched */ g_rec_mutex_lock(pulse_devout_mutex); delay = pulse_devout->delay[pulse_devout->tic_counter]; delay_counter = pulse_devout->delay_counter; note_offset = pulse_devout->note_offset; note_offset_absolute = pulse_devout->note_offset_absolute; loop_left = pulse_devout->loop_left; loop_right = pulse_devout->loop_right; do_loop = pulse_devout->do_loop; g_rec_mutex_unlock(pulse_devout_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->delay_counter = delay_counter + 1.0 - delay; pulse_devout->tact_counter += 1.0; g_rec_mutex_unlock(pulse_devout_mutex); }else{ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->delay_counter += 1.0; g_rec_mutex_unlock(pulse_devout_mutex); } } void ags_pulse_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* offset changed */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->tic_counter += 1; if(pulse_devout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ pulse_devout->tic_counter = 0; } g_rec_mutex_unlock(pulse_devout_mutex); } void ags_pulse_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set bpm */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->bpm = bpm; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); } gdouble ags_pulse_devout_get_bpm(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gdouble bpm; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get bpm */ g_rec_mutex_lock(pulse_devout_mutex); bpm = pulse_devout->bpm; g_rec_mutex_unlock(pulse_devout_mutex); return(bpm); } void ags_pulse_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set delay factor */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->delay_factor = delay_factor; g_rec_mutex_unlock(pulse_devout_mutex); ags_pulse_devout_adjust_delay_and_attack(pulse_devout); } gdouble ags_pulse_devout_get_delay_factor(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gdouble delay_factor; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get delay factor */ g_rec_mutex_lock(pulse_devout_mutex); delay_factor = pulse_devout->delay_factor; g_rec_mutex_unlock(pulse_devout_mutex); return(delay_factor); } gdouble ags_pulse_devout_get_delay(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint delay_index; gdouble delay; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get delay */ g_rec_mutex_lock(pulse_devout_mutex); delay_index = pulse_devout->tic_counter; delay = pulse_devout->delay[delay_index]; g_rec_mutex_unlock(pulse_devout_mutex); return(delay); } gdouble ags_pulse_devout_get_absolute_delay(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; gdouble absolute_delay; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get absolute delay */ g_rec_mutex_lock(pulse_devout_mutex); absolute_delay = (60.0 * (((gdouble) pulse_devout->samplerate / (gdouble) pulse_devout->buffer_size) / (gdouble) pulse_devout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) pulse_devout->delay_factor))); g_rec_mutex_unlock(pulse_devout_mutex); return(absolute_delay); } guint ags_pulse_devout_get_attack(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint attack_index; guint attack; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get attack */ g_rec_mutex_lock(pulse_devout_mutex); attack_index = pulse_devout->tic_counter; attack = pulse_devout->attack[attack_index]; g_rec_mutex_unlock(pulse_devout_mutex); return(attack); } void* ags_pulse_devout_get_buffer(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; void *buffer; pulse_devout = AGS_PULSE_DEVOUT(soundcard); if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER0)){ buffer = pulse_devout->buffer[0]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER1)){ buffer = pulse_devout->buffer[1]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER2)){ buffer = pulse_devout->buffer[2]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER3)){ buffer = pulse_devout->buffer[3]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER4)){ buffer = pulse_devout->buffer[4]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER5)){ buffer = pulse_devout->buffer[5]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER6)){ buffer = pulse_devout->buffer[6]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER7)){ buffer = pulse_devout->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_pulse_devout_get_next_buffer(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; void *buffer; pulse_devout = AGS_PULSE_DEVOUT(soundcard); if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER0)){ buffer = pulse_devout->buffer[1]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER1)){ buffer = pulse_devout->buffer[2]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER2)){ buffer = pulse_devout->buffer[3]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER3)){ buffer = pulse_devout->buffer[4]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER4)){ buffer = pulse_devout->buffer[5]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER5)){ buffer = pulse_devout->buffer[6]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER6)){ buffer = pulse_devout->buffer[7]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER7)){ buffer = pulse_devout->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_pulse_devout_get_prev_buffer(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; void *buffer; pulse_devout = AGS_PULSE_DEVOUT(soundcard); if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER0)){ buffer = pulse_devout->buffer[7]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER1)){ buffer = pulse_devout->buffer[0]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER2)){ buffer = pulse_devout->buffer[1]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER3)){ buffer = pulse_devout->buffer[2]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER4)){ buffer = pulse_devout->buffer[3]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER5)){ buffer = pulse_devout->buffer[4]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER6)){ buffer = pulse_devout->buffer[5]; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER7)){ buffer = pulse_devout->buffer[6]; }else{ buffer = NULL; } return(buffer); } void ags_pulse_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsPulseDevout *pulse_devout; GRecMutex *buffer_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); buffer_mutex = NULL; if(pulse_devout->buffer != NULL){ if(buffer == pulse_devout->buffer[0]){ buffer_mutex = pulse_devout->buffer_mutex[0]; }else if(buffer == pulse_devout->buffer[1]){ buffer_mutex = pulse_devout->buffer_mutex[1]; }else if(buffer == pulse_devout->buffer[2]){ buffer_mutex = pulse_devout->buffer_mutex[2]; }else if(buffer == pulse_devout->buffer[3]){ buffer_mutex = pulse_devout->buffer_mutex[3]; }else if(buffer == pulse_devout->buffer[4]){ buffer_mutex = pulse_devout->buffer_mutex[4]; }else if(buffer == pulse_devout->buffer[5]){ buffer_mutex = pulse_devout->buffer_mutex[5]; }else if(buffer == pulse_devout->buffer[6]){ buffer_mutex = pulse_devout->buffer_mutex[6]; }else if(buffer == pulse_devout->buffer[7]){ buffer_mutex = pulse_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_pulse_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsPulseDevout *pulse_devout; GRecMutex *buffer_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); buffer_mutex = NULL; if(pulse_devout->buffer != NULL){ if(buffer == pulse_devout->buffer[0]){ buffer_mutex = pulse_devout->buffer_mutex[0]; }else if(buffer == pulse_devout->buffer[1]){ buffer_mutex = pulse_devout->buffer_mutex[1]; }else if(buffer == pulse_devout->buffer[2]){ buffer_mutex = pulse_devout->buffer_mutex[2]; }else if(buffer == pulse_devout->buffer[3]){ buffer_mutex = pulse_devout->buffer_mutex[3]; }else if(buffer == pulse_devout->buffer[4]){ buffer_mutex = pulse_devout->buffer_mutex[4]; }else if(buffer == pulse_devout->buffer[5]){ buffer_mutex = pulse_devout->buffer_mutex[5]; }else if(buffer == pulse_devout->buffer[6]){ buffer_mutex = pulse_devout->buffer_mutex[6]; }else if(buffer == pulse_devout->buffer[7]){ buffer_mutex = pulse_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_pulse_devout_get_delay_counter(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint delay_counter; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* delay counter */ g_rec_mutex_lock(pulse_devout_mutex); delay_counter = pulse_devout->delay_counter; g_rec_mutex_unlock(pulse_devout_mutex); return(delay_counter); } void ags_pulse_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set note offset */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->start_note_offset = start_note_offset; g_rec_mutex_unlock(pulse_devout_mutex); } guint ags_pulse_devout_get_start_note_offset(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint start_note_offset; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set note offset */ g_rec_mutex_lock(pulse_devout_mutex); start_note_offset = pulse_devout->start_note_offset; g_rec_mutex_unlock(pulse_devout_mutex); return(start_note_offset); } void ags_pulse_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set note offset */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->note_offset = note_offset; g_rec_mutex_unlock(pulse_devout_mutex); } guint ags_pulse_devout_get_note_offset(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint note_offset; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set note offset */ g_rec_mutex_lock(pulse_devout_mutex); note_offset = pulse_devout->note_offset; g_rec_mutex_unlock(pulse_devout_mutex); return(note_offset); } void ags_pulse_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set note offset */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(pulse_devout_mutex); } guint ags_pulse_devout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint note_offset_absolute; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set note offset */ g_rec_mutex_lock(pulse_devout_mutex); note_offset_absolute = pulse_devout->note_offset_absolute; g_rec_mutex_unlock(pulse_devout_mutex); return(note_offset_absolute); } void ags_pulse_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* set loop */ g_rec_mutex_lock(pulse_devout_mutex); pulse_devout->loop_left = loop_left; pulse_devout->loop_right = loop_right; pulse_devout->do_loop = do_loop; if(do_loop){ pulse_devout->loop_offset = pulse_devout->note_offset; } g_rec_mutex_unlock(pulse_devout_mutex); } void ags_pulse_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsPulseDevout *pulse_devout; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get loop */ g_rec_mutex_lock(pulse_devout_mutex); if(loop_left != NULL){ *loop_left = pulse_devout->loop_left; } if(loop_right != NULL){ *loop_right = pulse_devout->loop_right; } if(do_loop != NULL){ *do_loop = pulse_devout->do_loop; } g_rec_mutex_unlock(pulse_devout_mutex); } guint ags_pulse_devout_get_loop_offset(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint loop_offset; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get loop offset */ g_rec_mutex_lock(pulse_devout_mutex); loop_offset = pulse_devout->loop_offset; g_rec_mutex_unlock(pulse_devout_mutex); return(loop_offset); } guint ags_pulse_devout_get_sub_block_count(AgsSoundcard *soundcard) { AgsPulseDevout *pulse_devout; guint sub_block_count; GRecMutex *pulse_devout_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get loop offset */ g_rec_mutex_lock(pulse_devout_mutex); sub_block_count = pulse_devout->sub_block_count; g_rec_mutex_unlock(pulse_devout_mutex); return(sub_block_count); } gboolean ags_pulse_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsPulseDevout *pulse_devout; guint pcm_channels; guint sub_block_count; gboolean success; GRecMutex *pulse_devout_mutex; GRecMutex *sub_block_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get loop offset */ g_rec_mutex_lock(pulse_devout_mutex); pcm_channels = pulse_devout->pcm_channels; sub_block_count = pulse_devout->sub_block_count; g_rec_mutex_unlock(pulse_devout_mutex); sub_block_mutex = NULL; success = FALSE; if(pulse_devout->buffer != NULL){ if(buffer == pulse_devout->buffer[0]){ sub_block_mutex = pulse_devout->sub_block_mutex[sub_block]; }else if(buffer == pulse_devout->buffer[1]){ sub_block_mutex = pulse_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[2]){ sub_block_mutex = pulse_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[3]){ sub_block_mutex = pulse_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[4]){ sub_block_mutex = pulse_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[5]){ sub_block_mutex = pulse_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[6]){ sub_block_mutex = pulse_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[7]){ sub_block_mutex = pulse_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ if(g_rec_mutex_trylock(sub_block_mutex) == 0){ success = TRUE; } } return(success); } void ags_pulse_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsPulseDevout *pulse_devout; guint pcm_channels; guint sub_block_count; GRecMutex *pulse_devout_mutex; GRecMutex *sub_block_mutex; pulse_devout = AGS_PULSE_DEVOUT(soundcard); /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get loop offset */ g_rec_mutex_lock(pulse_devout_mutex); pcm_channels = pulse_devout->pcm_channels; sub_block_count = pulse_devout->sub_block_count; g_rec_mutex_unlock(pulse_devout_mutex); sub_block_mutex = NULL; if(pulse_devout->buffer != NULL){ if(buffer == pulse_devout->buffer[0]){ sub_block_mutex = pulse_devout->sub_block_mutex[sub_block]; }else if(buffer == pulse_devout->buffer[1]){ sub_block_mutex = pulse_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[2]){ sub_block_mutex = pulse_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[3]){ sub_block_mutex = pulse_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[4]){ sub_block_mutex = pulse_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[5]){ sub_block_mutex = pulse_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[6]){ sub_block_mutex = pulse_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == pulse_devout->buffer[7]){ sub_block_mutex = pulse_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ g_rec_mutex_unlock(sub_block_mutex); } } /** * ags_pulse_devout_switch_buffer_flag: * @pulse_devout: an #AgsPulseDevout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_pulse_devout_switch_buffer_flag(AgsPulseDevout *pulse_devout) { GRecMutex *pulse_devout_mutex; if(!AGS_IS_PULSE_DEVOUT(pulse_devout)){ return; } /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* switch buffer flag */ g_rec_mutex_lock(pulse_devout_mutex); if((AGS_PULSE_DEVOUT_BUFFER0 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER0); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER1; }else if((AGS_PULSE_DEVOUT_BUFFER1 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER1); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER2; }else if((AGS_PULSE_DEVOUT_BUFFER2 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER2); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER3; }else if((AGS_PULSE_DEVOUT_BUFFER3 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER3); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER4; }else if((AGS_PULSE_DEVOUT_BUFFER4 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER4); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER5; }else if((AGS_PULSE_DEVOUT_BUFFER5 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER5); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER6; }else if((AGS_PULSE_DEVOUT_BUFFER6 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER6); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER7; }else if((AGS_PULSE_DEVOUT_BUFFER7 & (pulse_devout->flags)) != 0){ pulse_devout->flags &= (~AGS_PULSE_DEVOUT_BUFFER7); pulse_devout->flags |= AGS_PULSE_DEVOUT_BUFFER0; } g_rec_mutex_unlock(pulse_devout_mutex); } /** * ags_pulse_devout_adjust_delay_and_attack: * @pulse_devout: the #AgsPulseDevout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_pulse_devout_adjust_delay_and_attack(AgsPulseDevout *pulse_devout) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *pulse_devout_mutex; if(!AGS_IS_PULSE_DEVOUT(pulse_devout)){ return; } /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get some initial values */ delay = ags_pulse_devout_get_absolute_delay(AGS_SOUNDCARD(pulse_devout)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(pulse_devout_mutex); default_tact_frames = (guint) (delay * pulse_devout->buffer_size); delay_tact_frames = (guint) (floor(delay) * pulse_devout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; pulse_devout->attack[0] = (guint) floor(0.25 * pulse_devout->buffer_size); next_attack = (((pulse_devout->attack[i] + default_tact_frames) / pulse_devout->buffer_size) - delay) * pulse_devout->buffer_size; if(next_attack >= pulse_devout->buffer_size){ next_attack = pulse_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ pulse_devout->attack[i] = pulse_devout->attack[i] - ((gdouble) next_attack / 2.0); if(pulse_devout->attack[i] < 0){ pulse_devout->attack[i] = 0; } if(pulse_devout->attack[i] >= pulse_devout->buffer_size){ pulse_devout->attack[i] = pulse_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= pulse_devout->buffer_size){ next_attack = pulse_devout->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ pulse_devout->attack[i] = next_attack; next_attack = (((pulse_devout->attack[i] + default_tact_frames) / pulse_devout->buffer_size) - delay) * pulse_devout->buffer_size; if(next_attack >= pulse_devout->buffer_size){ next_attack = pulse_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ pulse_devout->attack[i] = pulse_devout->attack[i] - ((gdouble) next_attack / 2.0); if(pulse_devout->attack[i] < 0){ pulse_devout->attack[i] = 0; } if(pulse_devout->attack[i] >= pulse_devout->buffer_size){ pulse_devout->attack[i] = pulse_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= pulse_devout->buffer_size){ next_attack = pulse_devout->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", pulse_devout->attack[i]); #endif } pulse_devout->attack[0] = pulse_devout->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ pulse_devout->delay[i] = ((gdouble) (default_tact_frames + pulse_devout->attack[i] - pulse_devout->attack[i + 1])) / (gdouble) pulse_devout->buffer_size; #ifdef AGS_DEBUG g_message("%f", pulse_devout->delay[i]); #endif } pulse_devout->delay[i] = ((gdouble) (default_tact_frames + pulse_devout->attack[i] - pulse_devout->attack[0])) / (gdouble) pulse_devout->buffer_size; g_rec_mutex_unlock(pulse_devout_mutex); } /** * ags_pulse_devout_realloc_buffer: * @pulse_devout: the #AgsPulseDevout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_pulse_devout_realloc_buffer(AgsPulseDevout *pulse_devout) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *pulse_devout_mutex; if(!AGS_IS_PULSE_DEVOUT(pulse_devout)){ return; } /* get pulse devout mutex */ pulse_devout_mutex = AGS_PULSE_DEVOUT_GET_OBJ_MUTEX(pulse_devout); /* get word size */ g_rec_mutex_lock(pulse_devout_mutex); pcm_channels = pulse_devout->pcm_channels; buffer_size = pulse_devout->buffer_size; format = pulse_devout->format; g_rec_mutex_unlock(pulse_devout_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_pulse_devout_realloc_buffer(): unsupported word size"); return; } /* AGS_PULSE_DEVOUT_BUFFER_0 */ if(pulse_devout->buffer[0] != NULL){ free(pulse_devout->buffer[0]); } pulse_devout->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_1 */ if(pulse_devout->buffer[1] != NULL){ free(pulse_devout->buffer[1]); } pulse_devout->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_2 */ if(pulse_devout->buffer[2] != NULL){ free(pulse_devout->buffer[2]); } pulse_devout->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_3 */ if(pulse_devout->buffer[3] != NULL){ free(pulse_devout->buffer[3]); } pulse_devout->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_4 */ if(pulse_devout->buffer[4] != NULL){ free(pulse_devout->buffer[4]); } pulse_devout->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_5 */ if(pulse_devout->buffer[5] != NULL){ free(pulse_devout->buffer[5]); } pulse_devout->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_6 */ if(pulse_devout->buffer[6] != NULL){ free(pulse_devout->buffer[6]); } pulse_devout->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_PULSE_DEVOUT_BUFFER_7 */ if(pulse_devout->buffer[7] != NULL){ free(pulse_devout->buffer[7]); } pulse_devout->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_pulse_devout_new: * * Creates a new instance of #AgsPulseDevout. * * Returns: the new #AgsPulseDevout * * Since: 3.0.0 */ AgsPulseDevout* ags_pulse_devout_new() { AgsPulseDevout *pulse_devout; pulse_devout = (AgsPulseDevout *) g_object_new(AGS_TYPE_PULSE_DEVOUT, NULL); return(pulse_devout); } gsequencer-3.1.3/ags/audio/AUTHORS0000644000175000017500000000013313461636432013530 00000000000000Joël Krähemann Yuri Victorovich (tiny change) gsequencer-3.1.3/ags/audio/ags_wave.c0000644000175000017500000022064613616617253014437 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_wave_class_init(AgsWaveClass *wave); void ags_wave_init(AgsWave *wave); void ags_wave_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_dispose(GObject *gobject); void ags_wave_finalize(GObject *gobject); void ags_wave_insert_native_level_from_clipboard_version_1_4_0(AgsWave *wave, xmlNode *root_node, char *version, char *x_boundary, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack, gboolean match_line, gboolean do_replace, guint current_line, guint64 relative_offset, guint wave_samplerate, guint wave_buffer_size, guint wave_format, gboolean match_timestamp); void ags_wave_insert_native_level_from_clipboard(AgsWave *wave, xmlNode *root_node, char *version, char *x_boundary, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack, gboolean match_line, gboolean do_replace); /** * SECTION:ags_wave * @short_description: Wave class supporting selection and clipboard. * @title: AgsWave * @section_id: * @include: ags/audio/ags_wave.h * * #AgsWave acts as a container of #AgsBuffer. */ enum{ PROP_0, PROP_AUDIO, PROP_LINE, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_TIMESTAMP, PROP_BUFFER, }; static gpointer ags_wave_parent_class = NULL; GType ags_wave_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave = 0; static const GTypeInfo ags_wave_info = { sizeof(AgsWaveClass), NULL, NULL, (GClassInitFunc) ags_wave_class_init, NULL, NULL, sizeof(AgsWave), 0, (GInstanceInitFunc) ags_wave_init, }; ags_type_wave = g_type_register_static(G_TYPE_OBJECT, "AgsWave", &ags_wave_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave); } return g_define_type_id__volatile; } void ags_wave_class_init(AgsWaveClass *wave) { GObjectClass *gobject; GParamSpec *param_spec; ags_wave_parent_class = g_type_class_peek_parent(wave); gobject = (GObjectClass *) wave; gobject->set_property = ags_wave_set_property; gobject->get_property = ags_wave_get_property; gobject->dispose = ags_wave_dispose; gobject->finalize = ags_wave_finalize; /* properties */ /** * AgsWave:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of wave"), i18n_pspec("The audio of wave"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsWave:line: * * The wave's line. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("line", i18n_pspec("line of wave"), i18n_pspec("The numerical line of wave"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINE, param_spec); /** * AgsWave:samplerate: * * The audio buffer's samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate of audio buffer"), i18n_pspec("The samplerate of audio buffer"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsWave:buffer-size: * * The audio buffer's buffer size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size of audio buffer"), i18n_pspec("The buffer size of audio buffer"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsWave:format: * * The audio buffer's format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format of audio buffer"), i18n_pspec("The format of audio buffer"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsWave:timestamp: * * The pattern's timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("timestamp of pattern"), i18n_pspec("The timestamp of pattern"), AGS_TYPE_TIMESTAMP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); /** * AgsWave:buffer: (type GList(AgsBuffer)) (transfer full) * * The assigned #AgsBuffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("buffer of wave"), i18n_pspec("The buffer of wave"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); } void ags_wave_init(AgsWave *wave) { AgsConfig *config; wave->flags = 0; /* wave mutex */ g_rec_mutex_init(&(wave->obj_mutex)); /* config */ config = ags_config_get_instance(); /* fields */ wave->audio = NULL; wave->line = 0; wave->samplerate = (guint) ags_soundcard_helper_config_get_samplerate(config); wave->buffer_size = (guint) ags_soundcard_helper_config_get_buffer_size(config); wave->format = (guint) ags_soundcard_helper_config_get_format(config); wave->timestamp = ags_timestamp_new(); wave->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); wave->timestamp->flags |= AGS_TIMESTAMP_OFFSET; wave->timestamp->timer.ags_offset.offset = 0; g_object_ref(wave->timestamp); wave->buffer = NULL; wave->selection = NULL; } void ags_wave_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWave *wave; GRecMutex *wave_mutex; wave = AGS_WAVE(gobject); /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(wave_mutex); if(wave->audio == (GObject *) audio){ g_rec_mutex_unlock(wave_mutex); return; } if(wave->audio != NULL){ g_object_unref(wave->audio); } if(audio != NULL){ g_object_ref(audio); } wave->audio = (GObject *) audio; g_rec_mutex_unlock(wave_mutex); } break; case PROP_LINE: { guint line; line = g_value_get_uint(value); g_rec_mutex_lock(wave_mutex); wave->line = line; g_rec_mutex_unlock(wave_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_wave_set_samplerate(wave, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_wave_set_buffer_size(wave, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_wave_set_format(wave, format); } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_value_get_object(value); g_rec_mutex_lock(wave_mutex); if(timestamp == wave->timestamp){ g_rec_mutex_unlock(wave_mutex); return; } if(wave->timestamp != NULL){ g_object_unref(G_OBJECT(wave->timestamp)); } if(timestamp != NULL){ g_object_ref(G_OBJECT(timestamp)); } wave->timestamp = timestamp; g_rec_mutex_unlock(wave_mutex); } break; case PROP_BUFFER: { AgsBuffer *buffer; buffer = (AgsBuffer *) g_value_get_pointer(value); g_rec_mutex_lock(wave_mutex); if(buffer == NULL || g_list_find(wave->buffer, buffer) != NULL){ g_rec_mutex_unlock(wave_mutex); return; } g_rec_mutex_unlock(wave_mutex); ags_wave_add_buffer(wave, buffer, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWave *wave; GRecMutex *wave_mutex; wave = AGS_WAVE(gobject); /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(wave_mutex); g_value_set_object(value, wave->audio); g_rec_mutex_unlock(wave_mutex); } break; case PROP_LINE: { g_rec_mutex_lock(wave_mutex); g_value_set_uint(value, wave->line); g_rec_mutex_unlock(wave_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(wave_mutex); g_value_set_uint(value, wave->samplerate); g_rec_mutex_unlock(wave_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(wave_mutex); g_value_set_uint(value, wave->buffer_size); g_rec_mutex_unlock(wave_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(wave_mutex); g_value_set_uint(value, wave->format); g_rec_mutex_unlock(wave_mutex); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(wave_mutex); g_value_set_object(value, wave->timestamp); g_rec_mutex_unlock(wave_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(wave_mutex); g_value_set_pointer(value, g_list_copy_deep(wave->buffer, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(wave_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_dispose(GObject *gobject) { AgsWave *wave; GList *list; wave = AGS_WAVE(gobject); /* audio */ if(wave->audio != NULL){ g_object_unref(wave->audio); wave->audio = NULL; } /* timestamp */ if(wave->timestamp != NULL){ g_object_unref(wave->timestamp); wave->timestamp = NULL; } /* buffer and selection */ list = wave->buffer; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(wave->buffer, g_object_unref); g_list_free_full(wave->selection, g_object_unref); wave->buffer = NULL; wave->selection = NULL; /* call parent */ G_OBJECT_CLASS(ags_wave_parent_class)->dispose(gobject); } void ags_wave_finalize(GObject *gobject) { AgsWave *wave; wave = AGS_WAVE(gobject); /* audio */ if(wave->audio != NULL){ g_object_unref(wave->audio); } /* timestamp */ if(wave->timestamp != NULL){ g_object_unref(wave->timestamp); } /* buffer and selection */ g_list_free_full(wave->buffer, g_object_unref); g_list_free_full(wave->selection, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_wave_parent_class)->finalize(gobject); } /** * ags_wave_get_obj_mutex: * @wave: the #AgsWave * * Get object mutex. * * Returns: the #GRecMutex to lock @wave * * Since: 3.1.0 */ GRecMutex* ags_wave_get_obj_mutex(AgsWave *wave) { if(!AGS_IS_WAVE(wave)){ return(NULL); } return(AGS_WAVE_GET_OBJ_MUTEX(wave)); } /** * ags_wave_test_flags: * @wave: the #AgsWave * @flags: the flags * * Test @flags to be set on @wave. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_wave_test_flags(AgsWave *wave, guint flags) { gboolean retval; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return(FALSE); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* test */ g_rec_mutex_lock(wave_mutex); retval = (flags & (wave->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(wave_mutex); return(retval); } /** * ags_wave_set_flags: * @wave: the #AgsWave * @flags: the flags * * Set @flags on @wave. * * Since: 3.0.0 */ void ags_wave_set_flags(AgsWave *wave, guint flags) { GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* set */ g_rec_mutex_lock(wave_mutex); wave->flags |= flags; g_rec_mutex_unlock(wave_mutex); } /** * ags_wave_unset_flags: * @wave: the #AgsWave * @flags: the flags * * Unset @flags on @wave. * * Since: 3.0.0 */ void ags_wave_unset_flags(AgsWave *wave, guint flags) { GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* set */ g_rec_mutex_lock(wave_mutex); wave->flags &= (~flags); g_rec_mutex_unlock(wave_mutex); } /** * ags_wave_find_near_timestamp: * @wave: (element-type AgsAudio.Wave) (transfer none): the #GList-struct containing #AgsWave * @line: the matching audio channel * @timestamp: the matching #AgsTimestamp, or %NULL to match any timestamp * * Retrieve appropriate wave for timestamp. * * Returns: (element-type AgsAudio.Wave) (transfer none): Next matching #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_wave_find_near_timestamp(GList *wave, guint line, AgsTimestamp *timestamp) { AgsTimestamp *current_timestamp; GList *retval; GList *current_start, *current_end, *current; guint current_line; guint64 current_x, x; guint length, position; gboolean use_ags_offset; gboolean success; if(wave == NULL){ return(NULL); } current_start = wave; current_end = g_list_last(wave); length = g_list_length(wave); position = (length - 1) / 2; current = g_list_nth(current_start, position); if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_OFFSET)){ x = ags_timestamp_get_ags_offset(timestamp); use_ags_offset = TRUE; }else if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_UNIX)){ x = ags_timestamp_get_unix_time(timestamp); use_ags_offset = FALSE; }else{ return(NULL); } current_x = 0; retval = NULL; success = FALSE; while(!success && current != NULL){ guint64 relative_offset; guint samplerate; /* check current - start */ g_object_get(current_start->data, "line", ¤t_line, NULL); if(current_line == line){ if(timestamp == NULL){ retval = current_start; break; } g_object_get(current_start->data, "samplerate", &samplerate, "timestamp", ¤t_timestamp, NULL); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x > x + relative_offset){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + relative_offset){ retval = current_start; break; } }else{ if(current_x >= x && current_x < x + AGS_WAVE_DEFAULT_DURATION){ retval = current_start; break; } } }else{ g_warning("inconsistent data"); } } /* check current - end */ g_object_get(current_end->data, "line", ¤t_line, NULL); if(current_line == line){ if(timestamp == NULL){ retval = current_end; break; } g_object_get(current_end->data, "samplerate", &samplerate, "timestamp", ¤t_timestamp, NULL); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + relative_offset){ retval = current_end; break; } }else{ if(current_x >= x && current_x < x + AGS_WAVE_DEFAULT_DURATION){ retval = current_end; break; } } }else{ g_warning("inconsistent data"); } } /* check current - center */ g_object_get(current->data, "line", ¤t_line, NULL); if(current_line == line){ if(timestamp == NULL){ retval = current; break; } } g_object_get(current->data, "samplerate", &samplerate, "timestamp", ¤t_timestamp, NULL); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + relative_offset && current_line == line){ retval = current; break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_WAVE_DEFAULT_DURATION && current_line == line){ retval = current; break; } } }else{ g_warning("inconsistent data"); } if(length <= 3){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } return(retval); } /** * ags_wave_sort_func: * @a: the #AgsWave * @b: another #AgsWave * * Compare @a and @b. * * Returns: 0 if equal, -1 if smaller and 1 if bigger timestamp * * Since: 3.0.0 */ gint ags_wave_sort_func(gconstpointer a, gconstpointer b) { AgsTimestamp *timestamp_a, *timestamp_b; guint64 offset_a, offset_b; g_object_get(a, "timestamp", ×tamp_a, NULL); g_object_get(b, "timestamp", ×tamp_b, NULL); offset_a = ags_timestamp_get_ags_offset(timestamp_a); offset_b = ags_timestamp_get_ags_offset(timestamp_b); g_object_unref(timestamp_a); g_object_unref(timestamp_b); if(offset_a == offset_b){ return(0); }else if(offset_a < offset_b){ return(-1); }else if(offset_a > offset_b){ return(1); } return(0); } /** * ags_wave_get_audio: * @wave: the #AgsWave * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ GObject* ags_wave_get_audio(AgsWave *wave) { GObject *audio; if(!AGS_IS_WAVE(wave)){ return(NULL); } g_object_get(wave, "audio", &audio, NULL); return(audio); } /** * ags_wave_set_audio: * @wave: the #AgsWave * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_wave_set_audio(AgsWave *wave, GObject *audio) { if(!AGS_IS_WAVE(wave)){ return; } g_object_set(wave, "audio", audio, NULL); } /** * ags_wave_get_line: * @wave: the #AgsWave * * Gets line. * * Returns: the line * * Since: 3.1.0 */ guint ags_wave_get_line(AgsWave *wave) { guint line; if(!AGS_IS_WAVE(wave)){ return(0); } g_object_get(wave, "line", &line, NULL); return(line); } /** * ags_wave_set_line: * @wave: the #AgsWave * @line: the line * * Sets line. * * Since: 3.1.0 */ void ags_wave_set_line(AgsWave *wave, guint line) { if(!AGS_IS_WAVE(wave)){ return; } g_object_set(wave, "line", line, NULL); } /** * ags_wave_get_samplerate: * @wave: the #AgsWave * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_wave_get_samplerate(AgsWave *wave) { guint samplerate; if(!AGS_IS_WAVE(wave)){ return(0); } g_object_get(wave, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_wave_set_samplerate: * @wave: the #AgsWave * @samplerate: the samplerate * * Set samplerate. * * Since: 3.0.0 */ void ags_wave_set_samplerate(AgsWave *wave, guint samplerate) { GList *start_list, *list; void *data, *resampled_data; guint64 x; guint end_offset; guint buffer_length; guint new_buffer_length; guint buffer_size; guint old_samplerate; guint format; guint offset; guint copy_mode; guint i; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* check resample */ g_rec_mutex_lock(wave_mutex); old_samplerate = wave->samplerate; g_rec_mutex_unlock(wave_mutex); if(old_samplerate == samplerate){ return; } /* apply samplerate */ g_rec_mutex_lock(wave_mutex); x = ags_timestamp_get_ags_offset(wave->timestamp); buffer_size = wave->buffer_size; format = wave->format; wave->samplerate = samplerate; start_list = g_list_copy(wave->buffer); g_rec_mutex_unlock(wave_mutex); data = NULL; buffer_length = g_list_length(start_list); new_buffer_length = (guint) ceil((samplerate * (buffer_length * buffer_size / old_samplerate)) / buffer_size); copy_mode = G_MAXUINT; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { data = (gint8 *) malloc(buffer_length * buffer_size * sizeof(gint8)); memset(data, 0, buffer_length * buffer_size * sizeof(gint8)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { data = (gint16 *) malloc(buffer_length * buffer_size * sizeof(gint16)); memset(data, 0, buffer_length * buffer_size * sizeof(gint16)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { data = (gint32 *) malloc(buffer_length * buffer_size * sizeof(gint32)); memset(data, 0, buffer_length * buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { data = (gint32 *) malloc(buffer_length * buffer_size * sizeof(gint32)); memset(data, 0, buffer_length * buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { data = (gint64 *) malloc(buffer_length * buffer_size * sizeof(gint64)); memset(data, 0, buffer_length * buffer_size * sizeof(gint64)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64; } break; case AGS_SOUNDCARD_FLOAT: { data = (gfloat *) malloc(buffer_length * buffer_size * sizeof(gfloat)); memset(data, 0, buffer_length * buffer_size * sizeof(gfloat)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT; } break; case AGS_SOUNDCARD_DOUBLE: { data = (gdouble *) malloc(buffer_length * buffer_size * sizeof(gdouble)); memset(data, 0, buffer_length * buffer_size * sizeof(gdouble)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE; } break; default: g_warning("ags_audio_signal_set_buffer_samplerate() - unsupported format"); } list = start_list; offset = 0; while(list != NULL){ GRecMutex *buffer_mutex; /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(list->data); /* */ g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_copy_buffer_to_buffer(data, 1, offset, AGS_BUFFER(list->data)->data, 1, 0, buffer_size, copy_mode); g_rec_mutex_unlock(buffer_mutex); /* iterate */ list = list->next; offset += buffer_size; } resampled_data = ags_stream_alloc(new_buffer_length * buffer_size, format); ags_audio_buffer_util_resample_with_buffer(data, 1, ags_audio_buffer_util_format_from_soundcard(format), old_samplerate, buffer_length * buffer_size, samplerate, new_buffer_length * buffer_size, resampled_data); if(data != NULL){ free(data); } if(samplerate < old_samplerate){ list = g_list_nth(start_list, new_buffer_length); for(i = 0; i < buffer_length - new_buffer_length && list != NULL; i++){ ags_wave_remove_buffer(wave, list->data, FALSE); list = list->next; } }else{ for(i = 0; i < new_buffer_length - buffer_length; i++){ AgsBuffer *current; current = ags_buffer_new(); g_object_set(current, "x", x + i * buffer_size, NULL); ags_buffer_set_buffer_size(current, buffer_size); ags_wave_add_buffer(wave, current, FALSE); } } g_list_free(start_list); g_object_get(wave, "buffer", &start_list, NULL); list = start_list; offset = 0; end_offset = (buffer_length * buffer_size); while(list != NULL && offset < buffer_length * buffer_size){ GRecMutex *buffer_mutex; /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(list->data); /* */ ags_buffer_set_samplerate(list->data, samplerate); g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_clear_buffer(AGS_BUFFER(list->data)->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); if(offset + buffer_size < buffer_length * buffer_size){ ags_audio_buffer_util_copy_buffer_to_buffer(AGS_BUFFER(list->data)->data, 1, 0, resampled_data, 1, offset, buffer_size, copy_mode); }else{ if(end_offset > offset){ ags_audio_buffer_util_copy_buffer_to_buffer(AGS_BUFFER(list->data)->data, 1, 0, resampled_data, 1, offset, end_offset - offset, copy_mode); ags_audio_buffer_util_clear_buffer(AGS_BUFFER(list->data)->data + (end_offset - offset), 1, buffer_size - (end_offset - offset), ags_audio_buffer_util_format_from_soundcard(format)); } } g_rec_mutex_unlock(buffer_mutex); /* iterate */ list = list->next; offset += buffer_size; } g_list_free_full(start_list, g_object_unref); if(resampled_data != NULL){ free(resampled_data); } } /** * ags_wave_get_buffer_size: * @wave: the #AgsWave * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_wave_get_buffer_size(AgsWave *wave) { guint buffer_size; if(!AGS_IS_WAVE(wave)){ return(0); } g_object_get(wave, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_wave_set_buffer_size: * @wave: the #AgsWave * @buffer_size: the buffer size * * Set buffer size. * * Since: 3.0.0 */ void ags_wave_set_buffer_size(AgsWave *wave, guint buffer_size) { GList *start_list, *list; void *data; guint64 x; guint end_offset; guint buffer_length; guint new_buffer_length; guint offset; guint format; guint old_buffer_size; guint word_size; guint copy_mode; guint i; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); g_rec_mutex_lock(wave_mutex); old_buffer_size = wave->buffer_size; g_rec_mutex_unlock(wave_mutex); if(buffer_size == old_buffer_size){ return; } /* apply buffer size */ g_rec_mutex_lock(wave_mutex); x = ags_timestamp_get_ags_offset(wave->timestamp); format = wave->format; wave->buffer_size = buffer_size; start_list = g_list_copy(wave->buffer); g_rec_mutex_unlock(wave_mutex); /* resize buffer */ data = NULL; buffer_length = g_list_length(start_list); word_size = 1; copy_mode = G_MAXUINT; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { data = (gint8 *) malloc(buffer_length * old_buffer_size * sizeof(gint8)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gint8)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { data = (gint16 *) malloc(buffer_length * old_buffer_size * sizeof(gint16)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gint16)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { data = (gint32 *) malloc(buffer_length * old_buffer_size * sizeof(gint32)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { data = (gint32 *) malloc(buffer_length * old_buffer_size * sizeof(gint32)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { data = (gint64 *) malloc(buffer_length * old_buffer_size * sizeof(gint64)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gint64)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64; } break; case AGS_SOUNDCARD_FLOAT: { data = (gfloat *) malloc(buffer_length * old_buffer_size * sizeof(gfloat)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gfloat)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT; } break; case AGS_SOUNDCARD_DOUBLE: { data = (gdouble *) malloc(buffer_length * old_buffer_size * sizeof(gdouble)); memset(data, 0, buffer_length * old_buffer_size * sizeof(gdouble)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE; } break; default: g_warning("ags_wave_set_buffer_size() - unsupported format"); } list = start_list; offset = 0; while(list != NULL){ GRecMutex *buffer_mutex; /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(list->data); /* */ g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_copy_buffer_to_buffer(data, 1, offset, AGS_BUFFER(list->data)->data, 1, 0, old_buffer_size, copy_mode); g_rec_mutex_unlock(buffer_mutex); /* iterate */ list = list->next; offset += old_buffer_size; } new_buffer_length = (guint) ceil((buffer_length * old_buffer_size) / buffer_size); if(old_buffer_size < buffer_size){ list = g_list_nth(start_list, new_buffer_length); for(i = 0; i < buffer_length - new_buffer_length && list != NULL; i++){ ags_wave_remove_buffer(wave, list->data, FALSE); list = list->next; } }else{ for(i = 0; i < new_buffer_length - buffer_length; i++){ AgsBuffer *current; current = ags_buffer_new(); g_object_set(current, "x", x + i * buffer_size, NULL); ags_buffer_set_buffer_size(current, buffer_size); ags_wave_add_buffer(wave, current, FALSE); } } g_list_free(start_list); g_object_get(wave, "buffer", &start_list, NULL); list = start_list; offset = 0; end_offset = (buffer_length * buffer_size); while(list != NULL){ GRecMutex *buffer_mutex; /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(list->data); /* */ g_object_set(list->data, "x", x + offset, NULL); ags_buffer_set_buffer_size(list->data, buffer_size); g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_clear_buffer(AGS_BUFFER(list->data)->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); if(offset + buffer_size < buffer_length * buffer_size){ ags_audio_buffer_util_copy_buffer_to_buffer(AGS_BUFFER(list->data)->data, 1, 0, data, 1, offset, buffer_size, copy_mode); }else{ if(end_offset > offset){ ags_audio_buffer_util_copy_buffer_to_buffer(AGS_BUFFER(list->data)->data, 1, 0, data, 1, offset, end_offset - offset, copy_mode); } } g_rec_mutex_unlock(buffer_mutex); /* iterate */ list = list->next; offset += buffer_size; } g_list_free_full(start_list, g_object_unref); if(data != NULL){ free(data); } } /** * ags_wave_get_format: * @wave: the #AgsWave * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_wave_get_format(AgsWave *wave) { guint format; if(!AGS_IS_WAVE(wave)){ return(0); } g_object_get(wave, "format", &format, NULL); return(format); } /** * ags_wave_set_format: * @wave: the #AgsWave * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_wave_set_format(AgsWave *wave, guint format) { GList *list_start, *list; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* apply format */ g_rec_mutex_lock(wave_mutex); wave->format = format; list = list_start = g_list_copy(wave->buffer); g_rec_mutex_unlock(wave_mutex); while(list != NULL){ ags_buffer_set_format(list->data, format); list = list->next; } g_list_free(list_start); } /** * ags_wave_get_timestamp: * @wave: the #AgsWave * * Get timestamp. * * Returns: (transfer full): the #AgsTimestamp * * Since: 3.1.0 */ AgsTimestamp* ags_wave_get_timestamp(AgsWave *wave) { AgsTimestamp *timestamp; if(!AGS_IS_WAVE(wave)){ return(NULL); } g_object_get(wave, "timestamp", ×tamp, NULL); return(timestamp); } /** * ags_wave_set_timestamp: * @wave: the #AgsWave * @timestamp: the #AgsTimestamp * * Set timestamp. * * Since: 3.1.0 */ void ags_wave_set_timestamp(AgsWave *wave, AgsTimestamp *timestamp) { if(!AGS_IS_WAVE(wave)){ return; } g_object_set(wave, "timestamp", timestamp, NULL); } /** * ags_wave_get_buffer: * @wave: the #AgsWave * * Get buffer. * * Returns: (element-type AgsAudio.Buffer) (transfer full): the #GList-struct containig #AgsBuffer * * Since: 3.1.0 */ GList* ags_wave_get_buffer(AgsWave *wave) { GList *buffer; if(!AGS_IS_WAVE(wave)){ return(NULL); } g_object_get(wave, "buffer", &buffer, NULL); return(buffer); } /** * ags_wave_set_buffer: * @wave: the #AgsWave * @buffer: (element-type AgsAudio.Buffer) (transfer full): the #GList-struct containing #AgsBuffer * * Set buffer by replacing existing. * * Since: 3.1.0 */ void ags_wave_set_buffer(AgsWave *wave, GList *buffer) { GList *start_buffer; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); g_rec_mutex_lock(wave_mutex); start_buffer = wave->buffer; wave->buffer = buffer; g_rec_mutex_unlock(wave_mutex); g_list_free_full(start_buffer, (GDestroyNotify) g_object_unref); } /** * ags_wave_add: * @wave: (element-type AgsAudio.Wave) (transfer none): the #GList-struct containing #AgsWave * @new_wave: the #AgsWave to add * * Add @new_wave sorted to @wave * * Returns: (element-type AgsAudio.Wave) (transfer none): the new beginning of @wave * * Since: 3.0.0 */ GList* ags_wave_add(GList *wave, AgsWave *new_wave) { if(!AGS_IS_WAVE(new_wave)){ return(wave); } wave = g_list_insert_sorted(wave, new_wave, ags_wave_sort_func); return(wave); } /** * ags_wave_add_buffer: * @wave: the #AgsWave * @buffer: the #AgsBuffer to add * @use_selection_list: if %TRUE add to selection, else to default wave * * Add @buffer to @wave. * * Since: 3.0.0 */ void ags_wave_add_buffer(AgsWave *wave, AgsBuffer *buffer, gboolean use_selection_list) { GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave) || !AGS_IS_BUFFER(buffer)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* insert sorted */ g_object_ref(buffer); g_rec_mutex_lock(wave_mutex); if(use_selection_list){ wave->selection = g_list_insert_sorted(wave->selection, buffer, (GCompareFunc) ags_buffer_sort_func); ags_buffer_set_flags(buffer, AGS_BUFFER_IS_SELECTED); }else{ wave->buffer = g_list_insert_sorted(wave->buffer, buffer, (GCompareFunc) ags_buffer_sort_func); } g_rec_mutex_unlock(wave_mutex); } /** * ags_wave_remove_buffer: * @wave: the #AgsWave * @buffer: the #AgsBuffer to remove * @use_selection_list: if %TRUE remove from selection, else from default wave * * Removes @buffer from @wave. * * Since: 3.0.0 */ void ags_wave_remove_buffer(AgsWave *wave, AgsBuffer *buffer, gboolean use_selection_list) { GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave) || !AGS_IS_BUFFER(buffer)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* remove if found */ g_rec_mutex_lock(wave_mutex); if(!use_selection_list){ if(g_list_find(wave->buffer, buffer) != NULL){ wave->buffer = g_list_remove(wave->buffer, buffer); g_object_unref(buffer); } }else{ if(g_list_find(wave->selection, buffer) != NULL){ wave->selection = g_list_remove(wave->selection, buffer); g_object_unref(buffer); } } g_rec_mutex_unlock(wave_mutex); } /** * ags_wave_get_selection: * @wave: the #AgsWave * * Retrieve selection. * * Returns: (element-type AgsAudio.Buffer) (transfer none): the selection. * * Since: 3.0.0 */ GList* ags_wave_get_selection(AgsWave *wave) { GList *selection; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return(NULL); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* selection */ g_rec_mutex_lock(wave_mutex); selection = wave->selection; g_rec_mutex_unlock(wave_mutex); return(selection); } /** * ags_wave_is_buffer_selected: * @wave: the #AgsWave * @buffer: the #AgsBuffer to check for * * Check selection for buffer. * * Returns: %TRUE if selected otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_wave_is_buffer_selected(AgsWave *wave, AgsBuffer *buffer) { GList *selection; guint64 x; guint64 current_x; gboolean retval; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave) || !AGS_IS_BUFFER(buffer)){ return(FALSE); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* get x */ g_object_get(buffer, "x", &x, NULL); /* match buffer */ g_rec_mutex_lock(wave_mutex); selection = wave->selection; retval = FALSE; while(selection != NULL){ /* get current x */ g_object_get(selection->data, "x", ¤t_x, NULL); if(current_x > x){ break; } if(selection->data == buffer){ retval = TRUE; break; } selection = selection->next; } g_rec_mutex_unlock(wave_mutex); return(retval); } /** * ags_wave_find_point: * @wave: the #AgsWave * @x: offset * @use_selection_list: if %TRUE selection is searched * * Find buffers by offset. * * Returns: (transfer none): the matching buffer as #AgsBuffer. * * Since: 3.0.0 */ AgsBuffer* ags_wave_find_point(AgsWave *wave, guint64 x, gboolean use_selection_list) { AgsBuffer *retval; GList *buffer; GList *current_start, *current_end, *current; guint buffer_size; guint64 current_start_x, current_end_x, current_x; guint length, position; gboolean success; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return(NULL); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* find buffer */ g_rec_mutex_lock(wave_mutex); buffer_size = wave->buffer_size; if(use_selection_list){ buffer = wave->selection; }else{ buffer = wave->buffer; } current_start = buffer; current_end = g_list_last(buffer); length = g_list_length(buffer); position = (length - 1) / 2; current = g_list_nth(current_start, position); retval = NULL; success = FALSE; while(!success && current != NULL){ g_object_get(current_start->data, "x", ¤t_start_x, NULL); if(current_start_x > x){ break; } if(current_start_x <= x && current_start_x + buffer_size > x){ retval = current_start->data; break; } g_object_get(current_end->data, "x", ¤t_end_x, NULL); if(current_end_x + buffer_size < x){ break; } if(current_end_x <= x && current_end_x + buffer_size > x){ retval = current_end->data; break; } g_object_get(current->data, "x", ¤t_x, NULL); if(current_x <= x && current_x + buffer_size > x){ retval = current->data; break; } if(length <= 3){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } g_rec_mutex_unlock(wave_mutex); return(retval); } /** * ags_wave_find_region: * @wave: the #AgsWave * @x0: x start offset * @x1: x end offset * @use_selection_list: if %TRUE selection is searched * * Find buffers by offset and region. * * Returns: (element-type AgsAudio.Buffer) (transfer container): the matching buffers as #GList. * * Since: 3.0.0 */ GList* ags_wave_find_region(AgsWave *wave, guint64 x0, guint64 x1, gboolean use_selection_list) { GList *buffer; GList *region; guint buffer_size; guint64 current_x; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return(NULL); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); if(x0 > x1){ guint tmp; tmp = x1; x1 = x0; x0 = x1; } /* find buffer */ g_rec_mutex_lock(wave_mutex); if(use_selection_list){ buffer = wave->selection; }else{ buffer = wave->buffer; } while(buffer != NULL){ g_object_get(buffer->data, "buffer-size", &buffer_size, "x", ¤t_x, NULL); if(current_x + buffer_size > x0){ break; } buffer = buffer->next; } region = NULL; while(buffer != NULL){ g_object_get(buffer->data, "x", ¤t_x, NULL); if(current_x > x1){ break; } region = g_list_prepend(region, buffer->data); buffer = buffer->next; } g_rec_mutex_unlock(wave_mutex); region = g_list_reverse(region); return(region); } /** * ags_wave_free_selection: * @wave: the #AgsWave * * Clear selection. * * Since: 3.0.0 */ void ags_wave_free_selection(AgsWave *wave) { AgsBuffer *buffer; GList *list_start, *list; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* free selection */ g_rec_mutex_lock(wave_mutex); list = list_start = wave->selection; while(list != NULL){ ags_buffer_unset_flags(list->data, AGS_BUFFER_IS_SELECTED); list = list->next; } wave->selection = NULL; g_rec_mutex_unlock(wave_mutex); g_list_free_full(list_start, g_object_unref); } /** * ags_wave_add_region_to_selection: * @wave: the #AgsWave * @x0: x start offset * @x1: x end offset * @replace_current_selection: if %TRUE selection is replaced * * Add buffer within region to selection. * * Since: 3.0.0 */ void ags_wave_add_region_to_selection(AgsWave *wave, guint64 x0, guint64 x1, gboolean replace_current_selection) { AgsBuffer *buffer; GList *region, *list; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* find region */ region = ags_wave_find_region(wave, x0, x1, FALSE); if(replace_current_selection){ ags_wave_free_selection(wave); list = region; while(list != NULL){ guint buffer_size; guint64 current_x; guint64 selection_x0, selection_x1; g_object_get(list->data, "buffer-size", &buffer_size, "x", ¤t_x, NULL); if(current_x + buffer_size > x0){ selection_x0 = current_x; }else{ selection_x0 = x0; } if(current_x + buffer_size < x1){ selection_x1 = current_x + buffer_size; }else{ selection_x1 = current_x + ((current_x + buffer_size) - x1); } ags_buffer_set_flags(list->data, AGS_BUFFER_IS_SELECTED); g_object_ref(list->data); g_object_set(list->data, "selection-x0", selection_x0, "selection-x1", selection_x1, NULL); list = list->next; } /* replace */ g_rec_mutex_lock(wave_mutex); wave->selection = region; g_rec_mutex_unlock(wave_mutex); }else{ list = region; while(list != NULL){ guint buffer_size; guint64 current_x; guint64 selection_x0, selection_x1; g_object_get(list->data, "buffer-size", &buffer_size, "x", ¤t_x, NULL); if(current_x + buffer_size > x0){ selection_x0 = current_x; }else{ selection_x0 = x0; } if(current_x + buffer_size < x1){ selection_x1 = current_x + buffer_size; }else{ selection_x1 = current_x + ((current_x + buffer_size) - x1); } if(!ags_wave_is_buffer_selected(wave, list->data)){ /* add */ ags_wave_add_buffer(wave, list->data, TRUE); g_object_set(list->data, "selection-x0", selection_x0, "selection-x1", selection_x1, NULL); }else{ guint64 current_selection_x0, current_selection_x1; g_object_get(list->data, "selection-x0", ¤t_selection_x0, "selection-x1", ¤t_selection_x1, NULL); if(selection_x0 < current_selection_x0){ g_object_set(list->data, "selection-x0", selection_x0, NULL); } if(selection_x1 > current_selection_x1){ g_object_set(list->data, "selection-x1", selection_x1, NULL); } } list = list->next; } g_list_free(region); } } /** * ags_wave_remove_region_from_selection: * @wave: the #AgsWave * @x0: x start offset * @x1: x end offset * * Remove buffers within region of selection. * * Since: 3.0.0 */ void ags_wave_remove_region_from_selection(AgsWave *wave, guint64 x0, guint64 x1) { AgsBuffer *buffer; GList *region; GList *list; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* find region */ region = ags_wave_find_region(wave, x0, x1, TRUE); list = region; while(list != NULL){ ags_buffer_unset_flags(list->data, AGS_BUFFER_IS_SELECTED); /* remove */ g_rec_mutex_lock(wave_mutex); wave->selection = g_list_remove(wave->selection, list->data); g_rec_mutex_unlock(wave_mutex); g_object_unref(list->data); /* iterate */ list = list->next; } g_list_free(region); } /** * ags_wave_add_all_to_selection: * @wave: the #AgsWave * * Select all buffer to selection. * * Since: 3.0.0 */ void ags_wave_add_all_to_selection(AgsWave *wave) { GList *list; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return; } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* select all */ g_rec_mutex_lock(wave_mutex); list = wave->buffer; while(list != NULL){ guint buffer_size; guint64 current_x; g_object_get(list->data, "buffer-size", &buffer_size, "x", ¤t_x, NULL); ags_wave_add_buffer(wave, list->data, TRUE); g_object_set(list->data, "selection-x0", current_x, "selection-x1", current_x + buffer_size, NULL); list = list->next; } g_rec_mutex_unlock(wave_mutex); } /** * ags_wave_copy_selection: * @wave: the #AgsWave * * Copy selection to clipboard. * * Returns: (transfer none): the selection as XML. * * Since: 3.0.0 */ xmlNode* ags_wave_copy_selection(AgsWave *wave) { AgsBuffer *buffer; AgsTimestamp *timestamp; xmlNode *wave_node, *current_buffer; xmlNode *timestamp_node; GList *start_selection, *selection; xmlChar *str; guint format; guint64 x_boundary; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return(NULL); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* create root node */ wave_node = xmlNewNode(NULL, BAD_CAST "wave"); xmlNewProp(wave_node, BAD_CAST "program", BAD_CAST "ags"); xmlNewProp(wave_node, BAD_CAST "type", BAD_CAST (AGS_WAVE_CLIPBOARD_TYPE)); xmlNewProp(wave_node, BAD_CAST "version", BAD_CAST (AGS_WAVE_CLIPBOARD_VERSION)); xmlNewProp(wave_node, BAD_CAST "format", BAD_CAST (AGS_WAVE_CLIPBOARD_FORMAT)); xmlNewProp(wave_node, BAD_CAST "line", BAD_CAST (g_strdup_printf("%u", wave->line))); /* buffer format */ g_object_get(wave, "format", &format, NULL); str = NULL; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { str = "s8"; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { str = "s16"; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { str = "s24"; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { str = "s32"; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { str = "s64"; } break; case AGS_SOUNDCARD_FLOAT: { str = "float"; } break; case AGS_SOUNDCARD_DOUBLE: { str = "double"; } break; } xmlNewProp(wave_node, BAD_CAST "buffer-format", BAD_CAST (str)); /* timestamp */ g_object_get(wave, "timestamp", ×tamp, NULL); if(timestamp != NULL){ timestamp_node = xmlNewNode(NULL, BAD_CAST "timestamp"); xmlAddChild(wave_node, timestamp_node); xmlNewProp(timestamp_node, BAD_CAST "offset", BAD_CAST (g_strdup_printf("%lu", ags_timestamp_get_ags_offset(timestamp)))); g_object_unref(timestamp); } /* selection */ g_rec_mutex_lock(wave_mutex); selection = start_selection = g_list_copy(wave->selection); g_rec_mutex_unlock(wave_mutex); if(selection != NULL){ g_object_get(selection->data, "selection-x0", &x_boundary, NULL); x_boundary = AGS_BUFFER(selection->data)->selection_x0; }else{ x_boundary = 0; } while(selection != NULL){ xmlChar *content; guchar *cbuffer; guint buffer_size; GRecMutex *buffer_mutex; buffer = AGS_BUFFER(selection->data); buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); current_buffer = xmlNewChild(wave_node, NULL, BAD_CAST "buffer", NULL); g_rec_mutex_lock(buffer_mutex); xmlNewProp(current_buffer, BAD_CAST "samplerate", BAD_CAST (g_strdup_printf("%u", buffer->samplerate))); xmlNewProp(current_buffer, BAD_CAST "buffer-size", BAD_CAST (g_strdup_printf("%u", buffer->buffer_size))); switch(buffer->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { str = "s8"; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { str = "s16"; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { str = "s24"; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { str = "s32"; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { str = "s64"; } break; case AGS_SOUNDCARD_FLOAT: { str = "float"; } break; case AGS_SOUNDCARD_DOUBLE: { str = "double"; } break; } xmlNewProp(current_buffer, BAD_CAST "format", BAD_CAST (str)); // g_message("copy - buffer->x = %lu", buffer->x); xmlNewProp(current_buffer, BAD_CAST "x", BAD_CAST (g_strdup_printf("%lu", buffer->x))); xmlNewProp(current_buffer, BAD_CAST "selection-x0", BAD_CAST (g_strdup_printf("%lu", buffer->selection_x0))); xmlNewProp(current_buffer, BAD_CAST "selection-x1", BAD_CAST (g_strdup_printf("%lu", buffer->selection_x1))); cbuffer = NULL; buffer_size = 0; switch(buffer->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { cbuffer = ags_buffer_util_s8_to_char_buffer((gint8 *) buffer->data, buffer->buffer_size); buffer_size = buffer->buffer_size * sizeof(guchar); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { cbuffer = ags_buffer_util_s16_to_char_buffer((gint16 *) buffer->data, buffer->buffer_size); buffer_size = 2 * buffer->buffer_size * sizeof(guchar); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { cbuffer = ags_buffer_util_s24_to_char_buffer((gint32 *) buffer->data, buffer->buffer_size); buffer_size = 4 * buffer->buffer_size * sizeof(guchar); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { cbuffer = ags_buffer_util_s32_to_char_buffer((gint32 *) buffer->data, buffer->buffer_size); buffer_size = 4 * buffer->buffer_size * sizeof(guchar); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { cbuffer = ags_buffer_util_s64_to_char_buffer((gint64 *) buffer->data, buffer->buffer_size); buffer_size = 8 * buffer->buffer_size * sizeof(guchar); } break; } g_rec_mutex_unlock(buffer_mutex); // current_buffer->content = g_base64_encode(cbuffer, // buffer_size); xmlNodeSetContent(current_buffer, g_base64_encode(cbuffer, buffer_size)); g_free(cbuffer); selection = selection->next; } g_list_free(start_selection); xmlNewProp(wave_node, BAD_CAST "x-boundary", BAD_CAST (g_strdup_printf("%lu", x_boundary))); return(wave_node); } /** * ags_wave_cut_selection: * @wave: the #AgsWave * * Cut selection to clipboard. * * Returns: (transfer none): the selection as xmlNode * * Since: 3.0.0 */ xmlNode* ags_wave_cut_selection(AgsWave *wave) { xmlNode *wave_node; GList *selection, *buffer; GRecMutex *wave_mutex; if(!AGS_IS_WAVE(wave)){ return(NULL); } /* get wave mutex */ wave_mutex = AGS_WAVE_GET_OBJ_MUTEX(wave); /* copy selection */ wave_node = ags_wave_copy_selection(wave); /* cut */ g_rec_mutex_lock(wave_mutex); selection = wave->selection; while(selection != NULL){ wave->buffer = g_list_remove(wave->buffer, selection->data); g_object_unref(selection->data); selection = selection->next; } g_rec_mutex_unlock(wave_mutex); /* free selection */ ags_wave_free_selection(wave); return(wave_node); } void ags_wave_insert_native_level_from_clipboard_version_1_4_0(AgsWave *wave, xmlNode *root_node, char *version, char *x_boundary, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack, gboolean match_line, gboolean do_replace, guint current_line, guint64 relative_offset, guint wave_samplerate, guint wave_buffer_size, guint wave_format, gboolean match_timestamp) { AgsBuffer *buffer; AgsTimestamp *timestamp; xmlNode *node; void *clipboard_data; unsigned char *clipboard_cdata; xmlChar *samplerate; xmlChar *buffer_size; xmlChar *format; xmlChar *x; xmlChar *selection_x0, *selection_x1; xmlChar *content; gchar *offset; char *endptr; guint64 timestamp_offset; guint samplerate_val; guint buffer_size_val; guint format_val; guint64 x_boundary_val; guint64 x_val; guint64 base_x_difference; guint64 selection_x0_val, selection_x1_val; guint target_frame_count, frame_count; guint word_size; gsize clipboard_length; gboolean subtract_x; node = root_node->children; /* retrieve x values for resetting */ base_x_difference = 0; subtract_x = FALSE; x_boundary_val = 0; if(reset_x_offset){ if(x_boundary != NULL){ errno = 0; x_boundary_val = strtoul(x_boundary, &endptr, 10); if(errno == ERANGE){ goto dont_reset_x_offset; } if(x_boundary == endptr){ goto dont_reset_x_offset; } if(x_boundary_val < x_offset){ base_x_difference = x_offset - x_boundary_val; subtract_x = FALSE; }else{ base_x_difference = x_boundary_val - x_offset; subtract_x = TRUE; } }else{ dont_reset_x_offset: reset_x_offset = FALSE; } } /* parse */ while(node != NULL){ if(node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("buffer", node->name, 7)){ void *target_data; samplerate_val = 0; samplerate = xmlGetProp(node, "samplerate"); if(samplerate != NULL){ samplerate_val = g_ascii_strtoull(samplerate, NULL, 10); } buffer_size_val = 0; buffer_size = xmlGetProp(node, "buffer-size"); if(buffer_size != NULL){ buffer_size_val = g_ascii_strtoull(buffer_size, NULL, 10); } /* retrieve format */ format = xmlGetProp(node, "format"); if(!g_ascii_strncasecmp("s8", format, 3)){ format_val = AGS_SOUNDCARD_SIGNED_8_BIT; }else if(!g_ascii_strncasecmp("s16", format, 4)){ format_val = AGS_SOUNDCARD_SIGNED_16_BIT; }else if(!g_ascii_strncasecmp("s24", format, 4)){ format_val = AGS_SOUNDCARD_SIGNED_24_BIT; }else if(!g_ascii_strncasecmp("s32", format, 4)){ format_val = AGS_SOUNDCARD_SIGNED_32_BIT; }else if(!g_ascii_strncasecmp("s64", format, 4)){ format_val = AGS_SOUNDCARD_SIGNED_64_BIT; }else if(!g_ascii_strncasecmp("float", format, 4)){ format_val = AGS_SOUNDCARD_FLOAT; }else if(!g_ascii_strncasecmp("double", format, 4)){ format_val = AGS_SOUNDCARD_DOUBLE; }else{ node = node->next; continue; } /* retrieve x offset */ x = xmlGetProp(node, "x"); if(x == NULL){ node = node->next; continue; } errno = 0; x_val = g_ascii_strtoull(x, &endptr, 10); if(errno == ERANGE){ node = node->next; continue; } if(x == endptr){ node = node->next; continue; } /* calculate new offset */ if(reset_x_offset){ errno = 0; if(subtract_x){ x_val -= base_x_difference; if(errno != 0){ node = node->next; continue; } }else{ x_val += base_x_difference; if(errno != 0){ node = node->next; continue; } } } /* selection x0 and x1 */ selection_x0_val = 0; selection_x1_val = wave_buffer_size; selection_x0 = xmlGetProp(node, "selection-x0"); if(selection_x0 != NULL){ guint64 tmp; endptr = NULL; errno = 0; tmp = g_ascii_strtoull(selection_x0, &endptr, 10); if(errno != ERANGE && endptr != selection_x0 && tmp < wave_buffer_size){ selection_x0_val = tmp; } } selection_x1 = xmlGetProp(node, "selection-x1"); if(selection_x1 != NULL){ guint64 tmp; endptr = NULL; errno = 0; tmp = g_ascii_strtoull(selection_x1, &endptr, 10); if(errno != ERANGE && endptr != selection_x1 && selection_x0_val <= tmp && tmp <= wave_buffer_size){ selection_x1_val = tmp; } } frame_count = selection_x1_val - selection_x0_val; if(frame_count == 0){ node = node->next; continue; } content = xmlNodeGetContent(node); //content = node->content; if(content == NULL){ node = node->next; continue; } clipboard_cdata = g_base64_decode(content, &clipboard_length); switch(format_val){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = 1; clipboard_data = ags_buffer_util_char_buffer_to_s8(clipboard_cdata, clipboard_length); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = 2; clipboard_data = ags_buffer_util_char_buffer_to_s16(clipboard_cdata, clipboard_length); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = 4; clipboard_data = ags_buffer_util_char_buffer_to_s32(clipboard_cdata, clipboard_length); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = 4; clipboard_data = ags_buffer_util_char_buffer_to_s32(clipboard_cdata, clipboard_length); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = 8; clipboard_data = ags_buffer_util_char_buffer_to_s64(clipboard_cdata, clipboard_length); } break; case AGS_SOUNDCARD_FLOAT: { word_size = sizeof(gfloat); clipboard_data = ags_buffer_util_char_buffer_to_float(clipboard_cdata, clipboard_length); } break; case AGS_SOUNDCARD_DOUBLE: { word_size = sizeof(gdouble); clipboard_data = ags_buffer_util_char_buffer_to_double(clipboard_cdata, clipboard_length); } break; default: node = node->next; continue; } if(clipboard_length % word_size != 0 || clipboard_length / word_size != frame_count){ g_warning("malformed clipboard"); node = node->next; continue; } /* add buffer */ g_object_get(wave, "timestamp", ×tamp, NULL); timestamp_offset = ags_timestamp_get_ags_offset(timestamp); g_object_unref(timestamp); if(!match_timestamp || x_val < timestamp_offset + relative_offset){ guint copy_mode; /* find first */ buffer = ags_wave_find_point(wave, wave_buffer_size * floor(x_val / wave_buffer_size), FALSE); if(buffer != NULL && do_replace){ void *data; // g_message("found %d", x_val); data = buffer->data; if(attack != 0){ switch(wave_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { data = ((gint8 *) data) + attack; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { data = ((gint16 *) data) + attack; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { data = ((gint32 *) data) + attack; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { data = ((gint32 *) data) + attack; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { data = ((gint64 *) data) + attack; } break; case AGS_SOUNDCARD_FLOAT: { data = ((gfloat *) data) + attack; } break; case AGS_SOUNDCARD_DOUBLE: { data = ((gdouble *) data) + attack; } break; default: g_warning("unknown soundcard format"); node = node->next; continue; } } if(attack + frame_count <= wave_buffer_size){ if(wave_format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(data, 1, frame_count); }else if(wave_format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(data, 1, frame_count); }else{ ags_audio_buffer_util_clear_buffer(data, 1, frame_count, ags_audio_buffer_util_format_from_soundcard(wave_format)); } }else{ if(wave_format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(data, 1, wave_buffer_size); }else if(wave_format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(data, 1, wave_buffer_size); }else{ ags_audio_buffer_util_clear_buffer(data, 1, wave_buffer_size - attack, ags_audio_buffer_util_format_from_soundcard(wave_format)); } } } if(buffer == NULL){ buffer = ags_buffer_new(); g_object_set(buffer, "samplerate", wave_samplerate, "buffer-size", wave_buffer_size, "format", wave_format, NULL); buffer->x = x_val; // g_message("created %d", x_val); ags_wave_add_buffer(wave, buffer, FALSE); } // g_message("insert - buffer->x = %lu", buffer->x); // g_message("%d %d", wave_format, format_val); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(wave_format), ags_audio_buffer_util_format_from_soundcard(format_val)); if(samplerate_val != wave_samplerate){ target_frame_count = ceil((double) frame_count / (double) samplerate_val * (double) wave_samplerate); target_data = ags_stream_alloc(target_frame_count, format_val); ags_audio_buffer_util_resample_with_buffer(clipboard_data, 1, ags_audio_buffer_util_format_from_soundcard(format_val), samplerate_val, buffer_size_val, wave_samplerate, target_frame_count, target_data); if(attack + target_frame_count <= wave_buffer_size){ ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, attack, target_data, 1, 0, target_frame_count, copy_mode); }else{ ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, attack, target_data, 1, 0, wave_buffer_size - attack, copy_mode); } free(target_data); }else{ if(attack + frame_count <= wave_buffer_size){ ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, attack, clipboard_data, 1, 0, frame_count, copy_mode); }else{ ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, attack, clipboard_data, 1, 0, wave_buffer_size - attack, copy_mode); } } /* find next */ if(attack + frame_count > wave_buffer_size){ buffer = ags_wave_find_point(wave, x_val + 1, FALSE); if(buffer != NULL && do_replace){ void *data; data = buffer->data; if(wave_format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(data, 1, attack); }else if(wave_format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(data, 1, attack); }else{ ags_audio_buffer_util_clear_buffer(data, 1, attack, ags_audio_buffer_util_format_from_soundcard(wave_format)); } } if(buffer == NULL){ buffer = ags_buffer_new(); g_object_set(buffer, "samplerate", wave_samplerate, "buffer-size", wave_buffer_size, "format", wave_format, NULL); buffer->x = x_val + 1; ags_wave_add_buffer(wave, buffer, FALSE); } // g_message("insert - buffer->x = %lu", buffer->x); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(wave_format), ags_audio_buffer_util_format_from_soundcard(format_val)); if(samplerate_val != wave_samplerate){ target_data = ags_stream_alloc(wave_buffer_size, format_val); ags_audio_buffer_util_resample_with_buffer(clipboard_data, 1, ags_audio_buffer_util_format_from_soundcard(format_val), samplerate_val, buffer_size_val, wave_samplerate, wave_buffer_size, target_data); ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, 0, target_data, 1, wave_buffer_size - attack, attack, copy_mode); free(target_data); }else{ ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, 0, clipboard_data, 1, wave_buffer_size - attack, attack, copy_mode); } } } } } node = node->next; } } /** * ags_wave_insert_native_level_from_clipboard: * @wave: the #AgsWave * @wave_node: the clipboard XML data * @version: clipboard version * @x_boundary: region start offset * @reset_x_offset: if %TRUE @x_offset used as cursor * @x_offset: region start cursor offset * @delay: the delay to be used * @attack: the attack to be used * @match_line: only paste if channel matches * @do_replace: if %TRUE current data is replaced, otherwise additive mixing is performed * * Paste previously copied buffers. * * Since: 3.0.0 */ void ags_wave_insert_native_level_from_clipboard(AgsWave *wave, xmlNode *root_node, char *version, char *x_boundary, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack, gboolean match_line, gboolean do_replace) { guint current_line; guint64 relative_offset; guint wave_samplerate; guint wave_buffer_size; guint wave_format; gboolean match_timestamp; if(!AGS_IS_WAVE(wave)){ return; } match_timestamp = TRUE; if(!xmlStrncmp("1.4.0", version, 6)){ /* changes contain only optional informations */ g_object_get(wave, "line", ¤t_line, "samplerate", &wave_samplerate, "buffer-size", &wave_buffer_size, "format", &wave_format, NULL); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * wave_samplerate; if(match_line && current_line != g_ascii_strtoull(xmlGetProp(root_node, "line"), NULL, 10)){ // g_message("line %d", current_line); return; } ags_wave_insert_native_level_from_clipboard_version_1_4_0(wave, root_node, version, x_boundary, reset_x_offset, x_offset, delay, attack, match_line, do_replace, current_line, relative_offset, wave_samplerate, wave_buffer_size, wave_format, match_timestamp); } } /** * ags_wave_insert_from_clipboard: * @wave: the #AgsWave * @wave_node: the clipboard XML data * @reset_x_offset: if %TRUE @x_offset used as cursor * @x_offset: region start cursor offset * @delay: the delay to be used * @attack: the attack to be used * * Paste previously copied buffers. * * Since: 3.0.0 */ void ags_wave_insert_from_clipboard(AgsWave *wave, xmlNode *wave_node, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack) { ags_wave_insert_from_clipboard_extended(wave, wave_node, reset_x_offset, x_offset, delay, attack, FALSE, FALSE); } /** * ags_wave_insert_from_clipboard_extended: * @wave: the #AgsWave * @wave_node: the clipboard XML data * @reset_x_offset: if %TRUE @x_offset used as cursor * @x_offset: region start cursor offset * @delay: the delay to be used * @attack: the attack to be used * @match_line: only paste if channel matches * @do_replace: if %TRUE current data is replaced, otherwise additive mixing is performed * * Paste previously copied buffers. * * Since: 3.0.0 */ void ags_wave_insert_from_clipboard_extended(AgsWave *wave, xmlNode *wave_node, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack, gboolean match_line, gboolean do_replace) { char *program, *version, *type, *format; char *x_boundary; if(!AGS_IS_WAVE(wave)){ return; } while(wave_node != NULL){ if(wave_node->type == XML_ELEMENT_NODE && !xmlStrncmp("wave", wave_node->name, 9)){ break; } wave_node = wave_node->next; } if(wave_node != NULL){ program = xmlGetProp(wave_node, "program"); if(!xmlStrncmp("ags", program, 4)){ version = xmlGetProp(wave_node, "version"); type = xmlGetProp(wave_node, "type"); format = xmlGetProp(wave_node, "format"); if(!xmlStrcmp(AGS_WAVE_CLIPBOARD_FORMAT, format)){ x_boundary = xmlGetProp(wave_node, "x-boundary"); ags_wave_insert_native_level_from_clipboard(wave, wave_node, version, x_boundary, reset_x_offset, x_offset, delay, attack, match_line, do_replace); } } } } /** * ags_wave_new: * @audio: the assigned #AgsAudio * @line: the line to be used * * Creates a new instance of #AgsWave. * * Returns: a new #AgsWave * * Since: 3.0.0 */ AgsWave* ags_wave_new(GObject *audio, guint line) { AgsWave *wave; wave = (AgsWave *) g_object_new(AGS_TYPE_WAVE, "audio", audio, "line", line, NULL); return(wave); } gsequencer-3.1.3/ags/audio/ags_note.c0000644000175000017500000011406713616617253014441 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_note_class_init(AgsNoteClass *note); void ags_note_init(AgsNote *note); void ags_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_note_finalize(GObject *gobject); /** * SECTION:ags_note * @short_description: note class * @title: AgsNote * @section_id: * @include: ags/audio/ags_note.h * * #AgsNote represents a tone. */ enum{ PROP_0, PROP_X0, PROP_X1, PROP_Y, PROP_RT_OFFSET, PROP_RT_ATTACK, PROP_STREAM_DELAY, PROP_STREAM_ATTACK, PROP_STREAM_FRAME_COUNT, PROP_ATTACK, PROP_DECAY, PROP_SUSTAIN, PROP_RELEASE, PROP_RATIO, PROP_NOTE_NAME, PROP_FREQUENCY, }; static gpointer ags_note_parent_class = NULL; GType ags_note_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_note = 0; static const GTypeInfo ags_note_info = { sizeof(AgsNoteClass), NULL, NULL, (GClassInitFunc) ags_note_class_init, NULL, NULL, sizeof(AgsNote), 0, (GInstanceInitFunc) ags_note_init, }; ags_type_note = g_type_register_static(G_TYPE_OBJECT, "AgsNote", &ags_note_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_note); } return g_define_type_id__volatile; } void ags_note_class_init(AgsNoteClass *note) { GObjectClass *gobject; GParamSpec *param_spec; ags_note_parent_class = g_type_class_peek_parent(note); gobject = (GObjectClass *) note; gobject->set_property = ags_note_set_property; gobject->get_property = ags_note_get_property; gobject->finalize = ags_note_finalize; /* properties */ /** * AgsNote:x0: * * Note offset x0. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("x0", i18n_pspec("offset x0"), i18n_pspec("The first x offset"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X0, param_spec); /** * AgsNote:x1: * * Note offset x1. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("x1", i18n_pspec("offset x1"), i18n_pspec("The last x offset"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X1, param_spec); /** * AgsNote:y: * * Note offset y. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("y", i18n_pspec("offset y"), i18n_pspec("The y offset"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y, param_spec); /** * AgsNote:rt-offset: * * Note realtime offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("rt-offset", i18n_pspec("realtime offset"), i18n_pspec("The realtime offset"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RT_OFFSET, param_spec); /** * AgsNote:rt-attack: * * Note realtime attack. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("rt-attack", i18n_pspec("realtime attack"), i18n_pspec("The realtime attack"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RT_ATTACK, param_spec); /** * AgsNote:stream-delay: * * The stream's delay. * * Since: 3.0.0 */ param_spec = g_param_spec_double("stream-delay", i18n_pspec("delay of stream"), i18n_pspec("The delay of the stream"), 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STREAM_DELAY, param_spec); /** * AgsNote:stream-attack: * * The stream's attack. * * Since: 3.0.0 */ param_spec = g_param_spec_double("stream-attack", i18n_pspec("stream attack offset"), i18n_pspec("The first x offset"), 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STREAM_ATTACK, param_spec); /** * AgsNote:stream-frame-count: * * The stream's frame count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("stream-frame-count", i18n_pspec("stream frame count"), i18n_pspec("The stream frame count"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STREAM_FRAME_COUNT, param_spec); /** * AgsNote:attack: * * Envelope attack. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("attack", i18n_pspec("envelope's attack"), i18n_pspec("The envelope's attack"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsNote:decay: * * Envelope decay. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("decay", i18n_pspec("envelope's decay"), i18n_pspec("The envelope's decay"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DECAY, param_spec); /** * AgsNote:sustain: * * Envelope sustain. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("sustain", i18n_pspec("envelope's sustain"), i18n_pspec("The envelope's sustain"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SUSTAIN, param_spec); /** * AgsNote:release: * * Envelope release. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("release", i18n_pspec("envelope's release"), i18n_pspec("The envelope's release"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RELEASE, param_spec); /** * AgsNote:ratio: * * Envelope ratio. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("ratio", i18n_pspec("envelope's ratio"), i18n_pspec("The envelope's ratio"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RATIO, param_spec); /** * AgsNote:note-name: * * The note's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("note-name", i18n_pspec("note name"), i18n_pspec("The note's name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE_NAME, param_spec); /** * AgsNote:frequency: * * The note's frequency. * * Since: 3.0.0 */ param_spec = g_param_spec_double("frequency", i18n_pspec("frequency"), i18n_pspec("The note's frequency"), 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FREQUENCY, param_spec); } void ags_note_init(AgsNote *note) { complex z; note->flags = 0; /* note mutex */ g_rec_mutex_init(&(note->obj_mutex)); /* fields */ note->x[0] = 0; note->x[1] = 1; note->y = 0; note->rt_offset = 0; note->rt_attack = 0; note->stream_delay = 0.0; note->stream_attack = 0; z = 0.25 + I * 1.0; ags_complex_set(&(note->attack), z); z = 0.25 + I * 1.0; ags_complex_set(&(note->decay), z); z = 0.25 + I * 1.0; ags_complex_set(&(note->sustain), z); z = 0.25 + I * 1.0; ags_complex_set(&(note->release), z); z = I * 1.0; ags_complex_set(&(note->ratio), z); note->note_name = NULL; note->frequency = 440.0; } void ags_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsNote *note; GRecMutex *note_mutex; note = AGS_NOTE(gobject); /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); switch(prop_id){ case PROP_X0: { g_rec_mutex_lock(note_mutex); note->x[0] = g_value_get_uint(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_X1: { g_rec_mutex_lock(note_mutex); note->x[1] = g_value_get_uint(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_Y: { g_rec_mutex_lock(note_mutex); note->y = g_value_get_uint(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_RT_OFFSET: { g_rec_mutex_lock(note_mutex); note->rt_offset = g_value_get_uint64(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_RT_ATTACK: { g_rec_mutex_lock(note_mutex); note->rt_attack = g_value_get_uint(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_STREAM_DELAY: { g_rec_mutex_lock(note_mutex); note->stream_delay = g_value_get_double(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_STREAM_ATTACK: { g_rec_mutex_lock(note_mutex); note->stream_attack = g_value_get_double(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_STREAM_FRAME_COUNT: { g_rec_mutex_lock(note_mutex); note->stream_frame_count = g_value_get_uint64(value); g_rec_mutex_unlock(note_mutex); } break; case PROP_ATTACK: { AgsComplex *attack; attack = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(note_mutex); ags_complex_set(&(note->attack), ags_complex_get(attack)); g_rec_mutex_unlock(note_mutex); } break; case PROP_SUSTAIN: { AgsComplex *sustain; sustain = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(note_mutex); ags_complex_set(&(note->sustain), ags_complex_get(sustain)); g_rec_mutex_unlock(note_mutex); } break; case PROP_DECAY: { AgsComplex *decay; decay = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(note_mutex); ags_complex_set(&(note->decay), ags_complex_get(decay)); g_rec_mutex_unlock(note_mutex); } break; case PROP_RELEASE: { AgsComplex *release; release = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(note_mutex); ags_complex_set(&(note->release), ags_complex_get(release)); g_rec_mutex_unlock(note_mutex); } break; case PROP_RATIO: { AgsComplex *ratio; ratio = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(note_mutex); ags_complex_set(&(note->ratio), ags_complex_get(ratio)); g_rec_mutex_unlock(note_mutex); } break; case PROP_NOTE_NAME: { gchar *note_name; note_name = g_value_get_string(value); g_rec_mutex_lock(note_mutex); if(note_name == note->note_name){ g_rec_mutex_unlock(note_mutex); return; } if(note->note_name != NULL){ g_free(note->note_name); } note->note_name = g_strdup(note_name); g_rec_mutex_unlock(note_mutex); } break; case PROP_FREQUENCY: { g_rec_mutex_lock(note_mutex); note->frequency = g_value_get_double(value); g_rec_mutex_unlock(note_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsNote *note; GRecMutex *note_mutex; note = AGS_NOTE(gobject); /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); switch(prop_id){ case PROP_X0: { g_rec_mutex_lock(note_mutex); g_value_set_uint(value, note->x[0]); g_rec_mutex_unlock(note_mutex); } break; case PROP_X1: { g_rec_mutex_lock(note_mutex); g_value_set_uint(value, note->x[1]); g_rec_mutex_unlock(note_mutex); } break; case PROP_Y: { g_rec_mutex_lock(note_mutex); g_value_set_uint(value, note->y); g_rec_mutex_unlock(note_mutex); } break; case PROP_RT_OFFSET: { g_rec_mutex_lock(note_mutex); g_value_set_uint64(value, note->rt_offset); g_rec_mutex_unlock(note_mutex); } break; case PROP_RT_ATTACK: { g_rec_mutex_lock(note_mutex); g_value_set_uint(value, note->rt_attack); g_rec_mutex_unlock(note_mutex); } break; case PROP_STREAM_DELAY: { g_rec_mutex_lock(note_mutex); g_value_set_double(value, note->stream_delay); g_rec_mutex_unlock(note_mutex); } break; case PROP_STREAM_ATTACK: { g_rec_mutex_lock(note_mutex); g_value_set_double(value, note->stream_attack); g_rec_mutex_unlock(note_mutex); } break; case PROP_STREAM_FRAME_COUNT: { g_rec_mutex_lock(note_mutex); g_value_set_uint64(value, note->stream_frame_count); g_rec_mutex_unlock(note_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(note_mutex); g_value_set_boxed(value, &(note->attack)); g_rec_mutex_unlock(note_mutex); } break; case PROP_SUSTAIN: { g_rec_mutex_lock(note_mutex); g_value_set_boxed(value, &(note->sustain)); g_rec_mutex_unlock(note_mutex); } break; case PROP_DECAY: { g_rec_mutex_lock(note_mutex); g_value_set_boxed(value, &(note->decay)); g_rec_mutex_unlock(note_mutex); } break; case PROP_RELEASE: { g_rec_mutex_lock(note_mutex); g_value_set_boxed(value, &(note->release)); g_rec_mutex_unlock(note_mutex); } break; case PROP_RATIO: { g_rec_mutex_lock(note_mutex); g_value_set_boxed(value, &(note->ratio)); g_rec_mutex_unlock(note_mutex); } break; case PROP_NOTE_NAME: { g_rec_mutex_lock(note_mutex); g_value_set_string(value, note->note_name); g_rec_mutex_unlock(note_mutex); } break; case PROP_FREQUENCY: { g_rec_mutex_lock(note_mutex); g_value_set_double(value, note->frequency); g_rec_mutex_unlock(note_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_note_finalize(GObject *gobject) { AgsNote *note; note = AGS_NOTE(gobject); /* note name */ if(note->note_name != NULL){ free(note->note_name); } /* call parent */ G_OBJECT_CLASS(ags_note_parent_class)->finalize(gobject); } /** * ags_note_get_obj_mutex: * @note: the #AgsNote * * Get object mutex. * * Returns: the #GRecMutex to lock @note * * Since: 3.1.0 */ GRecMutex* ags_note_get_obj_mutex(AgsNote *note) { if(!AGS_IS_NOTE(note)){ return(NULL); } return(AGS_NOTE_GET_OBJ_MUTEX(note)); } /** * ags_note_test_flags: * @note: the #AgsNote * @flags: the flags * * Test @flags to be set on @note. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_note_test_flags(AgsNote *note, guint flags) { gboolean retval; GRecMutex *note_mutex; if(!AGS_IS_NOTE(note)){ return(FALSE); } /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); /* test */ g_rec_mutex_lock(note_mutex); retval = (flags & (note->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(note_mutex); return(retval); } /** * ags_note_set_flags: * @note: the #AgsNote * @flags: the flags * * Set @flags on @note. * * Since: 3.0.0 */ void ags_note_set_flags(AgsNote *note, guint flags) { GRecMutex *note_mutex; if(!AGS_IS_NOTE(note)){ return; } /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); /* set */ g_rec_mutex_lock(note_mutex); note->flags |= flags; g_rec_mutex_unlock(note_mutex); } /** * ags_note_unset_flags: * @note: the #AgsNote * @flags: the flags * * Unset @flags on @note. * * Since: 3.0.0 */ void ags_note_unset_flags(AgsNote *note, guint flags) { GRecMutex *note_mutex; if(!AGS_IS_NOTE(note)){ return; } /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); /* unset */ g_rec_mutex_lock(note_mutex); note->flags &= (~flags); g_rec_mutex_unlock(note_mutex); } /** * ags_note_sort_func: * @a: the #AgsNote * @b: another #AgsNote * * Sort notes. * * Returns: 0 if equal, -1 if smaller and 1 if bigger offset * * Since: 3.0.0 */ gint ags_note_sort_func(gconstpointer a, gconstpointer b) { guint a_x0, b_x0; guint a_y, b_y; if(a == NULL || b == NULL){ return(0); } g_object_get(a, "x0", &a_x0, "y", &a_y, NULL); g_object_get(b, "x0", &b_x0, "y", &b_y, NULL); if(a_x0 == b_x0){ if(a_y == b_y){ return(0); } if(a_y < b_y){ return(-1); }else{ return(1); } } if(a_x0 < b_x0){ return(-1); }else{ return(1); } } /** * ags_note_get_is_minor: * @note: the #AgsNote * * Gets is minor. * * Returns: is minor * * Since: 3.1.0 */ gboolean ags_note_get_is_minor(AgsNote *note) { gboolean is_minor; if(!AGS_IS_NOTE(note)){ return(FALSE); } g_object_get(note, "is-minor", &is_minor, NULL); return(is_minor); } /** * ags_note_set_is_minor: * @note: the #AgsNote * @is_minor: is minor * * Sets is minor. * * Since: 3.1.0 */ void ags_note_set_is_minor(AgsNote *note, gboolean is_minor) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "is-minor", is_minor, NULL); } /** * ags_note_get_sharp_flats: * @note: the #AgsNote * * Gets sharp flats. * * Returns: the sharp flats * * Since: 3.1.0 */ guint ags_note_get_sharp_flats(AgsNote *note) { guint sharp_flats; if(!AGS_IS_NOTE(note)){ return(0); } g_object_get(note, "sharp-flats", &sharp_flats, NULL); return(sharp_flats); } /** * ags_note_set_sharp_flats: * @note: the #AgsNote * @sharp_flats: the sharp flats * * Sets sharp flats. * * Since: 3.1.0 */ void ags_note_set_sharp_flats(AgsNote *note, guint sharp_flats) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "sharp-flats", sharp_flats, NULL); } /** * ags_note_get_x0: * @note: the #AgsNote * * Gets x0. * * Returns: the sharp flats * * Since: 3.1.0 */ guint ags_note_get_x0(AgsNote *note) { guint x0; if(!AGS_IS_NOTE(note)){ return(0); } g_object_get(note, "x0", &x0, NULL); return(x0); } /** * ags_note_set_x0: * @note: the #AgsNote * @x0: the x0 * * Sets x0. * * Since: 3.1.0 */ void ags_note_set_x0(AgsNote *note, guint x0) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "x0", x0, NULL); } /** * ags_note_get_x1: * @note: the #AgsNote * * Gets x1. * * Returns: the x1 * * Since: 3.1.0 */ guint ags_note_get_x1(AgsNote *note) { guint x1; if(!AGS_IS_NOTE(note)){ return(0); } g_object_get(note, "x1", &x1, NULL); return(x1); } /** * ags_note_set_x1: * @note: the #AgsNote * @x1: the x1 * * Sets x1. * * Since: 3.1.0 */ void ags_note_set_x1(AgsNote *note, guint x1) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "x1", x1, NULL); } /** * ags_note_get_y: * @note: the #AgsNote * * Gets y. * * Returns: the y * * Since: 3.1.0 */ guint ags_note_get_y(AgsNote *note) { guint y; if(!AGS_IS_NOTE(note)){ return(0); } g_object_get(note, "y", &y, NULL); return(y); } /** * ags_note_set_y: * @note: the #AgsNote * @y: the y * * Sets y. * * Since: 3.1.0 */ void ags_note_set_y(AgsNote *note, guint y) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "y", y, NULL); } /** * ags_note_get_rt_offset: * @note: the #AgsNote * * Gets rt-offset. * * Returns: the rt-offset * * Since: 3.1.0 */ guint64 ags_note_get_rt_offset(AgsNote *note) { guint64 rt_offset; if(!AGS_IS_NOTE(note)){ return(0); } g_object_get(note, "rt-offset", &rt_offset, NULL); return(rt_offset); } /** * ags_note_set_rt_offset: * @note: the #AgsNote * @rt_offset: the rt-offset * * Sets rt-offset. * * Since: 3.1.0 */ void ags_note_set_rt_offset(AgsNote *note, guint64 rt_offset) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "rt-offset", rt_offset, NULL); } /** * ags_note_get_rt_attack: * @note: the #AgsNote * * Gets rt-attack. * * Returns: the rt-attack * * Since: 3.1.0 */ guint ags_note_get_rt_attack(AgsNote *note) { guint rt_attack; if(!AGS_IS_NOTE(note)){ return(0); } g_object_get(note, "rt-attack", &rt_attack, NULL); return(rt_attack); } /** * ags_note_set_rt_attack: * @note: the #AgsNote * @rt_attack: the rt-attack * * Sets rt-attack. * * Since: 3.1.0 */ void ags_note_set_rt_attack(AgsNote *note, guint rt_attack) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "rt-attack", rt_attack, NULL); } /** * ags_note_get_attack: * @note: the #AgsNote * * Gets attack. * * Returns: the attack * * Since: 3.1.0 */ AgsComplex* ags_note_get_attack(AgsNote *note) { AgsComplex *attack; if(!AGS_IS_NOTE(note)){ return(NULL); } g_object_get(note, "attack", &attack, NULL); return(attack); } /** * ags_note_set_attack: * @note: the #AgsNote * @attack: the attack * * Sets attack. * * Since: 3.1.0 */ void ags_note_set_attack(AgsNote *note, AgsComplex *attack) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "attack", attack, NULL); } /** * ags_note_get_sustain: * @note: the #AgsNote * * Gets sustain. * * Returns: the sustain * * Since: 3.1.0 */ AgsComplex* ags_note_get_sustain(AgsNote *note) { AgsComplex *sustain; if(!AGS_IS_NOTE(note)){ return(NULL); } g_object_get(note, "sustain", &sustain, NULL); return(sustain); } /** * ags_note_set_sustain: * @note: the #AgsNote * @sustain: the sustain * * Sets sustain. * * Since: 3.1.0 */ void ags_note_set_sustain(AgsNote *note, AgsComplex *sustain) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "sustain", sustain, NULL); } /** * ags_note_get_decay: * @note: the #AgsNote * * Gets decay. * * Returns: the decay * * Since: 3.1.0 */ AgsComplex* ags_note_get_decay(AgsNote *note) { AgsComplex *decay; if(!AGS_IS_NOTE(note)){ return(NULL); } g_object_get(note, "decay", &decay, NULL); return(decay); } /** * ags_note_set_decay: * @note: the #AgsNote * @decay: the decay * * Sets decay. * * Since: 3.1.0 */ void ags_note_set_decay(AgsNote *note, AgsComplex *decay) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "decay", decay, NULL); } /** * ags_note_get_release: * @note: the #AgsNote * * Gets release. * * Returns: the release * * Since: 3.1.0 */ AgsComplex* ags_note_get_release(AgsNote *note) { AgsComplex *release; if(!AGS_IS_NOTE(note)){ return(NULL); } g_object_get(note, "release", &release, NULL); return(release); } /** * ags_note_set_release: * @note: the #AgsNote * @release: the release * * Sets release. * * Since: 3.1.0 */ void ags_note_set_release(AgsNote *note, AgsComplex *release) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "release", release, NULL); } /** * ags_note_get_ratio: * @note: the #AgsNote * * Gets ratio. * * Returns: the ratio * * Since: 3.1.0 */ AgsComplex* ags_note_get_ratio(AgsNote *note) { AgsComplex *ratio; if(!AGS_IS_NOTE(note)){ return(NULL); } g_object_get(note, "ratio", &ratio, NULL); return(ratio); } /** * ags_note_set_ratio: * @note: the #AgsNote * @ratio: the ratio * * Sets ratio. * * Since: 3.1.0 */ void ags_note_set_ratio(AgsNote *note, AgsComplex *ratio) { if(!AGS_IS_NOTE(note)){ return; } g_object_set(note, "ratio", ratio, NULL); } /** * ags_note_find_prev: * @note: (element-type AgsAudio.Note) (transfer none): the #GList-struct containing #AgsNote * @x0: x offset * @y: y offset * * Find prev note having the same y offset. * * Returns: (element-type AgsAudio.Note) (transfer none): the matching entry as #GList-struct if first entry's x offset bigger than @x0, else %NULL * * Since: 3.0.0 */ GList* ags_note_find_prev(GList *note, guint x0, guint y) { GList *current_match; guint current_x0, current_y; if(note == NULL){ return(NULL); } g_object_get(note->data, "x0", ¤t_x0, NULL); if(current_x0 > x0){ return(NULL); } current_match = NULL; while(note != NULL){ g_object_get(note->data, "y", ¤t_y, NULL); if(current_y == y){ current_match = note; note = note->next; continue; } g_object_get(note->data, "x0", ¤t_x0, NULL); if(current_x0 > x0){ return(current_match); } note = note->next; } return(current_match); } /** * ags_note_find_next: * @note: (element-type AgsAudio.Note) (transfer none): the #GList-struct containing #AgsNote * @x0: x offset * @y: y offset * * Find next note having the same y offset. * * Returns: (element-type AgsAudio.Note) (transfer none): the matching entry as #GList-struct if last entry's x offset smaller than @x0, else %NULL * * Since: 3.0.0 */ GList* ags_note_find_next(GList *note, guint x0, guint y) { GList *current_match; guint current_x0, current_y; if(note == NULL){ return(NULL); } g_object_get(note->data, "x0", ¤t_x0, NULL); if(current_x0 < x0){ return(NULL); } current_match = NULL; while(note != NULL){ g_object_get(note->data, "y", ¤t_y, NULL); if(current_y == y){ current_match = note; note = note->prev; continue; } g_object_get(note->data, "x0", ¤t_x0, NULL); if(current_x0 < x0){ return(current_match); } note = note->prev; } return(current_match); } /** * ags_note_length_to_smf_delta_time: * @note_length: the note length to convert * @bpm: the source bpm * @delay_factor: the source delay factor * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * * Convert note length to SMF delta-time. * * Returns: the delta-time * * Since: 3.0.0 */ glong ags_note_length_to_smf_delta_time(guint note_length, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo) { //TODO:JK: implement me return(0); } /** * ags_note_smf_delta_time_to_length: * @delta_time: delta-time * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @bpm: the target bpm * @delay_factor: the target delay factor * * Convert SMF delta-time to note length. * * Returns: the note length * * Since: 3.0.0 */ guint ags_note_smf_delta_time_to_length(glong delta_time, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor) { //TODO:JK: implement me return(0); } /** * ags_note_to_raw_midi: * @note: the #AgsNote * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @buffer_length: the length of the returned buffer * * Convert @note to raw MIDI and set the buffer length of returned bytes * in the array as @buffer_length. * * Returns: The sequencer raw midi as array. * * Since: 3.0.0 */ guchar* ags_note_to_raw_midi(AgsNote *note, gdouble bpm, gdouble delay_factor, guint *buffer_length) { guchar *raw_midi; guint length; guint current_length; long delta_time; guint delta_time_length; guchar status; int channel; int key; int velocity; int pressure; gdouble ticks_per_beat; guint i, i_stop; guint j; guint k; if(note == NULL){ if(buffer_length != NULL){ *buffer_length = 0; } return(NULL); } length = 0; /* key-on */ k = 0; /* delta-time */ delta_time = note->x[0] / 16.0 / bpm * 60.0 / ((AGS_USEC_PER_SEC * bpm / 4.0) / (4.0 * bpm) / AGS_USEC_PER_SEC); delta_time_length = current_length = ags_midi_buffer_util_get_varlength_size(delta_time); /* status and channel */ channel = 0; status = (0x90 | (0x7f & channel)); current_length++; /* note / key */ key = (0x7f & (note->y)); current_length++; /* velocity */ velocity = (0x7f & (guchar) (128 * (ags_complex_get(&(note->attack))))); current_length++; /* prepare buffer */ raw_midi = (guchar *) malloc(current_length * sizeof(guchar)); length += current_length; ags_midi_buffer_util_put_varlength(raw_midi, delta_time); k += delta_time_length; raw_midi[k] = status; raw_midi[k + 1] = key; raw_midi[k + 2] = velocity; k += 3; /* key-pressure */ ticks_per_beat = AGS_NOTE_DEFAULT_TICKS_PER_QUARTER_NOTE / 4.0 / delay_factor; if(ticks_per_beat > 2.0){ i_stop = (note->x[1] - note->x[0]) * (ticks_per_beat - 2.0); for(i = 1; i <= i_stop; i++){ /* delta-time */ delta_time = (note->x[0] + i + 1) / 16.0 / bpm * 60.0 / ((AGS_USEC_PER_SEC * bpm / 4.0) / (4.0 * bpm) / AGS_USEC_PER_SEC); delta_time_length = current_length = ags_midi_buffer_util_get_varlength_size(delta_time); /* status and channel */ channel = 0; status = (0x90 | (0x7f & channel)); current_length++; /* note / key */ key = (0x7f & (note->y)); current_length++; /* pressure */ //TODO:JK: verify pressure = (0x7f & (guchar) (128 * (((ags_complex_get(&(note->decay)) / i) - (i * ags_complex_get(&(note->sustain))))))); current_length++; /* prepare buffer */ raw_midi = (guchar *) realloc(raw_midi, current_length * sizeof(guchar)); length += current_length; ags_midi_buffer_util_put_varlength(raw_midi, delta_time); k += delta_time_length; raw_midi[k] = status; raw_midi[k + 1] = key; raw_midi[k + 2] = pressure; k += 3; } } /* key-off */ /* delta-time */ delta_time = note->x[1] / 16.0 / bpm * 60.0 / ((AGS_USEC_PER_SEC * bpm / 4.0) / (4.0 * bpm) / AGS_USEC_PER_SEC); delta_time_length = current_length = ags_midi_buffer_util_get_varlength_size(delta_time); /* status and channel */ channel = 0; status = (0x90 | (0x7f & channel)); current_length++; /* note / key */ key = (0x7f & (note->y)); current_length++; /* velocity */ velocity = (0x7f & (guchar) (128 * (ags_complex_get(&(note->attack))))); current_length++; /* prepare buffer */ raw_midi = (guchar *) realloc(raw_midi, current_length * sizeof(guchar)); length += current_length; ags_midi_buffer_util_put_varlength(raw_midi, delta_time); k += delta_time_length; raw_midi[k] = status; raw_midi[k + 1] = key; raw_midi[k + 2] = velocity; /* return value */ if(buffer_length != NULL){ *buffer_length = length; } return(raw_midi); } /** * ags_note_to_raw_midi_extended: * @note: the #AgsNote * @bpm: the source bpm * @delay_factor: the source delay factor * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @buffer_length: the return location of buffer length * * Convert @note to raw-midi. * * Returns: the raw-midi buffer * * Since: 3.0.0 */ guchar* ags_note_to_raw_midi_extended(AgsNote *note, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo, guint *buffer_length) { //TODO:JK: implement me return(NULL); } /** * ags_note_to_seq_event: * @note: the #AgsNote * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @n_events: the count of events * * Convert @note to ALSA sequencer events and set the number of events * in the array as @n_events. * * Returns: (type gpointer) (transfer none): The sequencer events as array. * * Since: 3.0.0 */ snd_seq_event_t* ags_note_to_seq_event(AgsNote *note, gdouble bpm, gdouble delay_factor, guint *n_events) { snd_seq_event_t *event; event = NULL; //TODO:JK: implement me return(event); } /** * ags_note_to_seq_event_extended: * @note: the #AgsNote * @bpm: the source bpm * @delay_factor: the source delay factor * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @n_events: the return location of event count * * Convert @note to raw-midi. * * Returns: (type gpointer) (transfer none): an array of snd_seq_event_t structs * * Since: 3.0.0 */ snd_seq_event_t* ags_note_to_seq_event_extended(AgsNote *note, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo, guint *n_events) { snd_seq_event_t *event; event = NULL; //TODO:JK: implement me return(event); } /** * ags_note_from_raw_midi: * @raw_midi: the data array * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @length: the length of the array * * Parse @raw_midi data and convert to #AgsNote. * * Returns: (element-type AgsAudio.Note) (transfer full): a #GList-struct containing the notes * * Since: 3.0.0 */ GList* ags_note_from_raw_midi(guchar *raw_midi, gdouble bpm, gdouble delay_factor, guint length) { GList *list; list = NULL; //TODO:JK: implement me return(list); } /** * ags_note_from_raw_midi_extended: * @raw_midi: the data array * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @length: the length of the array * * Parse @raw_midi data and convert to #AgsNote. * * Returns: (element-type AgsAudio.Note) (transfer full): a #GList-struct containing the notes * * Since: 3.0.0 */ GList* ags_note_from_raw_midi_extended(guchar *raw_midi, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor, guint length) { GList *list; list = NULL; //TODO:JK: implement me return(list); } /** * ags_note_from_seq_event: * @event: (type gpointer) (transfer none): ALSA sequencer events as array * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @n_events: the arrays length * * Convert ALSA sequencer data @event to #AgsNote. * * Returns: (element-type AgsAudio.Note) (transfer full): a #GList-struct containing the notes * * Since: 3.0.0 */ GList* ags_note_from_seq_event(snd_seq_event_t *event, gdouble bpm, gdouble delay_factor, guint n_events) { GList *list; list = NULL; //TODO:JK: implement me return(list); } /** * ags_note_from_seq_event_extended: * @event: (type gpointer) (transfer none): the snd_seq_event_t struct array * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * @tempo: tempo * @bpm: the bpm to use * @delay_factor: the segmentation delay factor * @n_events: the count snd_seq_event_t structs * * Parse @raw_midi data and convert to #AgsNote. * * Returns: (element-type AgsAudio.Note) (transfer full): a #GList-struct containing the notes * * Since: 3.0.0 */ GList* ags_note_from_seq_event_extended(snd_seq_event_t *event, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor, guint n_events) { GList *list; list = NULL; //TODO:JK: implement me return(list); } /** * ags_note_duplicate: * @note: the #AgsNote * * Duplicate a note. * * Returns: (transfer full): the duplicated #AgsNote. * * Since: 3.0.0 */ AgsNote* ags_note_duplicate(AgsNote *note) { AgsNote *note_copy; GRecMutex *note_mutex; if(!AGS_IS_NOTE(note)){ return(NULL); } /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(note); /* instantiate note */ note_copy = ags_note_new(); note_copy->flags = 0; g_rec_mutex_lock(note_mutex); note_copy->note_name = g_strdup(note->note_name); if(note->x[0] < note->x[1]){ note_copy->x[0] = note->x[0]; note_copy->x[1] = note->x[1]; }else{ note_copy->x[0] = note->x[1]; note_copy->x[1] = note->x[0]; } note_copy->y = note->y; note_copy->stream_delay = note->stream_delay; note_copy->stream_attack = note->stream_attack; note_copy->attack.real = note->attack.real; note_copy->attack.imag = note->attack.imag; note_copy->decay.real = note->decay.real; note_copy->decay.imag = note->decay.imag; note_copy->sustain.real = note->sustain.real; note_copy->sustain.imag = note->sustain.imag; note_copy->release.real = note->release.real; note_copy->release.imag = note->release.imag; note_copy->ratio.real = note->ratio.real; note_copy->ratio.imag = note->ratio.imag; g_rec_mutex_unlock(note_mutex); return(note_copy); } /** * ags_note_new: * * Creates a new instance of #AgsNote * * Returns: the new #AgsNote * * Since: 3.0.0 */ AgsNote* ags_note_new() { AgsNote *note; note = (AgsNote *) g_object_new(AGS_TYPE_NOTE, NULL); return(note); } /** * ags_note_new_with_offset: * @x0: x0 * @x1: x1 * @y: y * @stream_delay: delay * @stream_attack: attack * * Creates a new instance of #AgsNote * * Returns: the new #AgsNote * * Since: 3.0.0 */ AgsNote* ags_note_new_with_offset(guint x0, guint x1, guint y, gdouble stream_delay, gdouble stream_attack) { AgsNote *note; note = (AgsNote *) g_object_new(AGS_TYPE_NOTE, "x0", x0, "x1", x1, "y", y, "stream-delay", stream_delay, "stream-attack", stream_attack, NULL); return(note); } gsequencer-3.1.3/ags/audio/ags_sound_provider.c0000644000175000017500000002547713607210263016532 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_sound_provider_class_init(AgsSoundProviderInterface *ginterface); /** * SECTION:ags_sound_provider * @short_description: provide accoustics * @title: AgsSoundProvider * @section_id: AgsSoundProvider * @include: ags/audio/ags_sound_provider.h * * The #AgsSoundProvider provides you the advanced audio capabilities. */ GType ags_sound_provider_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sound_provider = 0; ags_type_sound_provider = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsSoundProvider", sizeof(AgsSoundProviderInterface), (GClassInitFunc) ags_sound_provider_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sound_provider); } return g_define_type_id__volatile; } void ags_sound_provider_class_init(AgsSoundProviderInterface *ginterface) { /* empty */ } /** * ags_sound_provider_set_default_soundcard: * @sound_provider: the #AgsSoundProvider * @soundcard: the #GObject implementing #AgsSoundcard * * Set default soundcard. * * Since: 3.0.0 */ void ags_sound_provider_set_default_soundcard(AgsSoundProvider *sound_provider, GObject *soundcard) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_default_soundcard); sound_provider_interface->set_default_soundcard(sound_provider, soundcard); } /** * ags_sound_provider_get_default_soundcard: * @sound_provider: the #AgsSoundProvider * * Get default soundcard thread. * * Returns: (transfer full): the #GObject implementing #AgsSoundcard * * Since: 3.0.0 */ GObject* ags_sound_provider_get_default_soundcard(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_default_soundcard, NULL); return(sound_provider_interface->get_default_soundcard(sound_provider)); } /** * ags_sound_provider_set_default_soundcard_thread: * @sound_provider: the #AgsSoundProvider * @soundcard_thread: the default #AgsThread * * Set default soundcard thread. * * Since: 3.0.0 */ void ags_sound_provider_set_default_soundcard_thread(AgsSoundProvider *sound_provider, GObject *soundcard_thread) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_default_soundcard_thread); sound_provider_interface->set_default_soundcard_thread(sound_provider, soundcard_thread); } /** * ags_sound_provider_get_default_soundcard_thread: * @sound_provider: the #AgsSoundProvider * * Get default soundcard thread. * * Returns: (transfer full): the #AgsThread * * Since: 3.0.0 */ GObject* ags_sound_provider_get_default_soundcard_thread(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_default_soundcard_thread, NULL); return(sound_provider_interface->get_default_soundcard_thread(sound_provider)); } /** * ags_sound_provider_set_soundcard: * @sound_provider: the #AgsSoundProvider * @soundcard: (element-type GObject) (transfer full): a #GList-struct containing #AgsSoundcard * * Set soundcards. * * Since: 3.0.0 */ void ags_sound_provider_set_soundcard(AgsSoundProvider *sound_provider, GList *soundcard) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_soundcard); sound_provider_interface->set_soundcard(sound_provider, soundcard); } /** * ags_sound_provider_get_soundcard: * @sound_provider: the #AgsSoundProvider * * Get soundcards. * * Returns: (element-type GObject) (transfer full): a #GList-struct containing #AgsSoundcard * * Since: 3.0.0 */ GList* ags_sound_provider_get_soundcard(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_soundcard, NULL); return(sound_provider_interface->get_soundcard(sound_provider)); } /** * ags_sound_provider_set_sequencer: * @sound_provider: the #AgsSoundProvider * @sequencer: (element-type GObject) (transfer full): a #GList-struct containing #AgsSequencer * * Set sequencers. * * Since: 3.0.0 */ void ags_sound_provider_set_sequencer(AgsSoundProvider *sound_provider, GList *sequencer) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_sequencer); sound_provider_interface->set_sequencer(sound_provider, sequencer); } /** * ags_sound_provider_get_sequencer: * @sound_provider: the #AgsSoundProvider * * Get sequencers. * * Returns: (element-type GObject) (transfer full): a #GList-struct containing #AgsSequencer * * Since: 3.0.0 */ GList* ags_sound_provider_get_sequencer(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_sequencer, NULL); return(sound_provider_interface->get_sequencer(sound_provider)); } /** * ags_sound_provider_set_audio: * @sound_provider: the #AgsSoundProvider * @audio: (element-type AgsAudio.Audio) (transfer full): a #GList-struct containing #AgsAudio * * Set audio objects. * * Since: 3.0.0 */ void ags_sound_provider_set_audio(AgsSoundProvider *sound_provider, GList *audio) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_audio); sound_provider_interface->set_audio(sound_provider, audio); } /** * ags_sound_provider_get_audio: * @sound_provider: the #AgsSoundProvider * * Get audio objects. * * Returns: (element-type AgsAudio.Audio) (transfer full): a #GList-struct containing #AgsAudio * * Since: 3.0.0 */ GList* ags_sound_provider_get_audio(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_audio, NULL); return(sound_provider_interface->get_audio(sound_provider)); } /** * ags_sound_provider_set_sound_server: * @sound_provider: the #AgsSoundProvider * @sound_server: (element-type GObject) (transfer full): a #GList-struct containing #AgsSoundServer * * Get sound server. * * Since: 3.0.0 */ void ags_sound_provider_set_sound_server(AgsSoundProvider *sound_provider, GList *sound_server) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_sound_server); sound_provider_interface->set_sound_server(sound_provider, sound_server); } /** * ags_sound_provider_get_sound_server: * @sound_provider: the #AgsSoundProvider * * Set sound server. * * Returns: (element-type GObject) (transfer full): a #GList-struct containing #AgsSoundServer * * Since: 3.0.0 */ GList* ags_sound_provider_get_sound_server(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_sound_server, NULL); return(sound_provider_interface->get_sound_server(sound_provider)); } /** * ags_sound_provider_set_osc_server: * @sound_provider: the #AgsSoundProvider * @osc_server: (element-type GObject) (transfer full): a #GList-struct containing #AgsOscServer * * Set OSC server. * * Since: 3.0.0 */ void ags_sound_provider_set_osc_server(AgsSoundProvider *sound_provider, GList *osc_server) { AgsSoundProviderInterface *sound_provider_interface; g_return_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider)); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_if_fail(sound_provider_interface->set_osc_server); sound_provider_interface->set_osc_server(sound_provider, osc_server); } /** * ags_sound_provider_get_osc_server: * @sound_provider: the #AgsSoundProvider * * Set distributed manager. * * Returns: (element-type GObject) (transfer full): a #GList-struct containing #AgsOscServer * * Since: 3.0.0 */ GList* ags_sound_provider_get_osc_server(AgsSoundProvider *sound_provider) { AgsSoundProviderInterface *sound_provider_interface; g_return_val_if_fail(AGS_IS_SOUND_PROVIDER(sound_provider), NULL); sound_provider_interface = AGS_SOUND_PROVIDER_GET_INTERFACE(sound_provider); g_return_val_if_fail(sound_provider_interface->get_osc_server, NULL); return(sound_provider_interface->get_osc_server(sound_provider)); } gsequencer-3.1.3/ags/audio/ags_audio.h0000644000175000017500000004331313616617253014575 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_H__ #define __AGS_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO (ags_audio_get_type ()) #define AGS_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO, AgsAudio)) #define AGS_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIO, AgsAudioClass)) #define AGS_IS_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUDIO)) #define AGS_IS_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_AUDIO)) #define AGS_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_AUDIO, AgsAudioClass)) #define AGS_AUDIO_GET_OBJ_MUTEX(obj) (&(((AgsAudio *) obj)->obj_mutex)) #define AGS_AUDIO_GET_PLAY_MUTEX(obj) (&(((AgsAudio *) obj)->play_mutex)) #define AGS_AUDIO_GET_RECALL_MUTEX(obj) (&(((AgsAudio *) obj)->recall_mutex)) typedef struct _AgsAudio AgsAudio; typedef struct _AgsAudioClass AgsAudioClass; /** * AgsAudioFlags: * @AGS_AUDIO_ADDED_TO_REGISTRY: the audio was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_CONNECTED: the audio was connected by #AgsConnectable::connect() * @AGS_AUDIO_NO_OUTPUT: no output provided * @AGS_AUDIO_NO_INPUT: no input provided * @AGS_AUDIO_SYNC: input/output is mapped synchronously * @AGS_AUDIO_ASYNC: input/output is mapped asynchronously * @AGS_AUDIO_OUTPUT_HAS_RECYCLING: output has recycling * @AGS_AUDIO_OUTPUT_HAS_SYNTH: output has synth * @AGS_AUDIO_INPUT_HAS_RECYCLING: input has recycling * @AGS_AUDIO_INPUT_HAS_SYNTH: input has synth * @AGS_AUDIO_INPUT_HAS_FILE: input takes file * @AGS_AUDIO_CAN_NEXT_ACTIVE: dispatch can next active * @AGS_AUDIO_SKIP_OUTPUT: skip output as processing audio data * @AGS_AUDIO_SKIP_INPUT: skip input as processing audio data * @AGS_AUDIO_BYPASS: don't apply any data * * Enum values to control the behavior or indicate internal state of #AgsAudio by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_ADDED_TO_REGISTRY = 1, AGS_AUDIO_CONNECTED = 1 << 1, AGS_AUDIO_NO_OUTPUT = 1 << 2, AGS_AUDIO_NO_INPUT = 1 << 3, AGS_AUDIO_SYNC = 1 << 4, // can be combined with below AGS_AUDIO_ASYNC = 1 << 5, AGS_AUDIO_OUTPUT_HAS_RECYCLING = 1 << 6, AGS_AUDIO_OUTPUT_HAS_SYNTH = 1 << 7, AGS_AUDIO_INPUT_HAS_RECYCLING = 1 << 8, AGS_AUDIO_INPUT_HAS_SYNTH = 1 << 9, AGS_AUDIO_INPUT_HAS_FILE = 1 << 10, AGS_AUDIO_CAN_NEXT_ACTIVE = 1 << 11, AGS_AUDIO_SKIP_OUTPUT = 1 << 12, AGS_AUDIO_SKIP_INPUT = 1 << 13, AGS_AUDIO_BYPASS = 1 << 14, }AgsAudioFlags; struct _AgsAudio { GObject gobject; guint flags; guint ability_flags; guint behaviour_flags; guint staging_flags[AGS_SOUND_SCOPE_LAST]; GRecMutex obj_mutex; AgsUUID *uuid; gchar *audio_name; GObject *output_soundcard; gint *output_soundcard_channel_map; GObject *input_soundcard; gint *input_soundcard_channel_map; GObject *output_sequencer; GObject *input_sequencer; guint samplerate; guint buffer_size; guint format; gdouble bpm; guint bank_dim[3]; guint min_audio_channels; guint max_audio_channels; guint min_output_pads; guint max_output_pads; guint min_input_pads; guint max_input_pads; guint audio_channels; guint output_pads; guint output_lines; guint input_pads; guint input_lines; guint audio_start_mapping; guint audio_end_mapping; guint midi_start_mapping; guint midi_end_mapping; guint midi_channel; guint numerator; guint denominator; gchar *time_signature; gboolean is_minor; guint sharp_flats; gint octave; guint key; gint absolute_key; guint64 loop_start; guint64 loop_end; guint64 offset; AgsChannel *output; AgsChannel *input; GList *preset; GObject *playback_domain; GList *synth_generator; GList *cursor; GList *notation; gchar **automation_port; GList *automation; GList *wave; GObject *output_audio_file; GObject *input_audio_file; gchar *instrument_name; gchar *track_name; GList *midi; GObject *output_midi_file; GObject *input_midi_file; GList *recall_id; GList *recycling_context; GList *recall_container; GRecMutex play_mutex; GList *play; GRecMutex recall_mutex; GList *recall; gpointer machine_widget; gpointer file_data; }; struct _AgsAudioClass { GObjectClass gobject; void (*set_audio_channels)(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void (*set_pads)(AgsAudio *audio, GType channel_type, guint pads, guint pads_old); void (*duplicate_recall)(AgsAudio *audio, AgsRecallID *recall_id, guint pad, guint audio_channel, guint line); void (*resolve_recall)(AgsAudio *audio, AgsRecallID *recall_id); void (*init_recall)(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags); void (*play_recall)(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags); void (*done_recall)(AgsAudio *audio, AgsRecallID *recall_id); void (*cancel_recall)(AgsAudio *audio, AgsRecallID *recall_id); void (*cleanup_recall)(AgsAudio *audio, AgsRecallID *recall_id); GList* (*start)(AgsAudio *audio, gint sound_scope); void (*stop)(AgsAudio *audio, GList *recall_id, gint sound_scope); GList* (*check_scope)(AgsAudio *audio, gint sound_scope); void (*recursive_run_stage)(AgsAudio *audio, gint sound_scope, guint staging_flags); }; GType ags_audio_get_type(); GRecMutex* ags_audio_get_obj_mutex(AgsAudio *audio); GRecMutex* ags_audio_get_play_mutex(AgsAudio *audio); GRecMutex* ags_audio_get_recall_mutex(AgsAudio *audio); gboolean ags_audio_test_flags(AgsAudio *audio, guint flags); void ags_audio_set_flags(AgsAudio *audio, guint flags); void ags_audio_unset_flags(AgsAudio *audio, guint flags); gboolean ags_audio_test_ability_flags(AgsAudio *audio, guint ability_flags); void ags_audio_set_ability_flags(AgsAudio *audio, guint ability_flags); void ags_audio_unset_ability_flags(AgsAudio *audio, guint ability_flags); gboolean ags_audio_test_behaviour_flags(AgsAudio *audio, guint behaviour_flags); void ags_audio_set_behaviour_flags(AgsAudio *audio, guint behaviour_flags); void ags_audio_unset_behaviour_flags(AgsAudio *audio, guint behaviour_flags); gboolean ags_audio_test_staging_flags(AgsAudio *audio, gint sound_scope, guint staging_flags); void ags_audio_set_staging_flags(AgsAudio *audio, gint sound_scope, guint staging_flags); void ags_audio_unset_staging_flags(AgsAudio *audio, gint sound_scope, guint staging_flags); /* audio name */ gchar* ags_audio_get_audio_name(AgsAudio *audio); void ags_audio_set_audio_name(AgsAudio *audio, gchar *audio_name); GList* ags_audio_find_name(GList *audio, gchar *audio_name); /* channel alignment */ guint ags_audio_get_max_audio_channels(AgsAudio *audio); void ags_audio_set_max_audio_channels(AgsAudio *audio, guint max_audio_channels); guint ags_audio_get_max_output_pads(AgsAudio *audio); void ags_audio_set_max_output_pads(AgsAudio *audio, guint max_output_pads); guint ags_audio_get_max_input_pads(AgsAudio *audio); void ags_audio_set_max_input_pads(AgsAudio *audio, guint max_input_pads); void ags_audio_set_max_pads(AgsAudio *audio, GType channel_type, guint max_pads); guint ags_audio_get_audio_channels(AgsAudio *audio); void ags_audio_set_audio_channels(AgsAudio *audio, guint audio_channels, guint audio_channels_old); guint ags_audio_get_output_pads(AgsAudio *audio); void ags_audio_set_output_pads(AgsAudio *audio, guint output_pads); guint ags_audio_get_input_pads(AgsAudio *audio); void ags_audio_set_input_pads(AgsAudio *audio, guint input_pads); void ags_audio_set_pads(AgsAudio *audio, GType channel_type, guint pads, guint pads_old); guint ags_audio_get_output_lines(AgsAudio *audio); guint ags_audio_get_input_lines(AgsAudio *audio); AgsChannel* ags_audio_get_output(AgsAudio *audio); AgsChannel* ags_audio_get_input(AgsAudio *audio); /* soundcard */ GObject* ags_audio_get_output_soundcard(AgsAudio *audio); void ags_audio_set_output_soundcard(AgsAudio *audio, GObject *output_soundcard); GObject* ags_audio_get_input_soundcard(AgsAudio *audio); void ags_audio_set_input_soundcard(AgsAudio *audio, GObject *input_soundcard); /* sequencer */ GObject* ags_audio_get_output_sequencer(AgsAudio *audio); void ags_audio_set_output_sequencer(AgsAudio *audio, GObject *sequencer); GObject* ags_audio_get_input_sequencer(AgsAudio *audio); void ags_audio_set_input_sequencer(AgsAudio *audio, GObject *sequencer); /* presets */ guint ags_audio_get_samplerate(AgsAudio *audio); void ags_audio_set_samplerate(AgsAudio *audio, guint samplerate); guint ags_audio_get_buffer_size(AgsAudio *audio); void ags_audio_set_buffer_size(AgsAudio *audio, guint buffer_size); guint ags_audio_get_format(AgsAudio *audio); void ags_audio_set_format(AgsAudio *audio, guint format); /* bpm */ gdouble ags_audio_get_bpm(AgsAudio *audio); void ags_audio_set_bpm(AgsAudio *audio, gdouble bpm); /* mapping */ guint ags_audio_get_audio_start_mapping(AgsAudio *audio); void ags_audio_set_audio_start_mapping(AgsAudio *audio, guint audio_start_mapping); guint ags_audio_get_midi_start_mapping(AgsAudio *audio); void ags_audio_set_midi_start_mapping(AgsAudio *audio, guint midi_start_mapping); guint ags_audio_get_midi_channel(AgsAudio *audio); void ags_audio_set_midi_channel(AgsAudio *audio, guint midi_channel); /* time signature */ guint ags_audio_get_numerator(AgsAudio *audio); void ags_audio_set_numerator(AgsAudio *audio, guint numerator); guint ags_audio_get_denominator(AgsAudio *audio); void ags_audio_set_denominator(AgsAudio *audio, guint denominator); gchar* ags_audio_get_time_signature(AgsAudio *audio); void ags_audio_set_time_signature(AgsAudio *audio, gchar *time_signature); /* key */ gboolean ags_audio_get_is_minor(AgsAudio *audio); void ags_audio_set_is_minor(AgsAudio *audio, gboolean is_minor); guint ags_audio_get_sharp_flats(AgsAudio *audio); void ags_audio_set_sharp_flats(AgsAudio *audio, guint sharp_flats); gint ags_audio_get_octave(AgsAudio *audio); void ags_audio_set_octave(AgsAudio *audio, gint octave); guint ags_audio_get_key(AgsAudio *audio); void ags_audio_set_key(AgsAudio *audio, guint key); gint ags_audio_get_absolute_key(AgsAudio *audio); void ags_audio_set_absolute_key(AgsAudio *audio, gint absolute_key); /* children */ GList* ags_audio_get_preset(AgsAudio *audio); void ags_audio_set_preset(AgsAudio *audio, GList *preset); void ags_audio_add_preset(AgsAudio *audio, GObject *preset); void ags_audio_remove_preset(AgsAudio *audio, GObject *preset); GObject* ags_audio_get_playback_domain(AgsAudio *audio); void ags_audio_set_playback_domain(AgsAudio *audio, GObject *playback_domain); GList* ags_audio_get_synth_generator(AgsAudio *audio); void ags_audio_set_synth_generator(AgsAudio *audio, GList *synth_generator); void ags_audio_add_synth_generator(AgsAudio *audio, GObject *synth_generator); void ags_audio_remove_synth_generator(AgsAudio *audio, GObject *synth_generator); GList* ags_audio_get_cursor(AgsAudio *audio); void ags_audio_set_cursor(AgsAudio *audio, GList *cursor); void ags_audio_add_cursor(AgsAudio *audio, GObject *cursor); void ags_audio_remove_cursor(AgsAudio *audio, GObject *cursor); GList* ags_audio_get_notation(AgsAudio *audio); void ags_audio_set_notation(AgsAudio *audio, GList *notation); void ags_audio_add_notation(AgsAudio *audio, GObject *notation); void ags_audio_remove_notation(AgsAudio *audio, GObject *notation); gchar** ags_audio_get_automation_port(AgsAudio *audio); void ags_audio_set_automation_port(AgsAudio *audio, gchar **automation_port); void ags_audio_add_automation_port(AgsAudio *audio, gchar *control_name); void ags_audio_remove_automation_port(AgsAudio *audio, gchar *control_name); GList* ags_audio_get_automation(AgsAudio *audio); void ags_audio_set_automation(AgsAudio *audio, GList *automation); void ags_audio_add_automation(AgsAudio *audio, GObject *automation); void ags_audio_remove_automation(AgsAudio *audio, GObject *automation); GList* ags_audio_get_wave(AgsAudio *audio); void ags_audio_set_wave(AgsAudio *audio, GList *wave); void ags_audio_add_wave(AgsAudio *audio, GObject *wave); void ags_audio_remove_wave(AgsAudio *audio, GObject *wave); GObject* ags_audio_get_output_audio_file(AgsAudio *audio); void ags_audio_set_output_audio_file(AgsAudio *audio, GObject *output_audio_file); GObject* ags_audio_get_input_audio_file(AgsAudio *audio); void ags_audio_set_input_audio_file(AgsAudio *audio, GObject *input_audio_file); gchar* ags_audio_get_instrument_name(AgsAudio *audio); void ags_audio_set_instrument_name(AgsAudio *audio, gchar *instrument_name); gchar* ags_audio_get_track_name(AgsAudio *audio); void ags_audio_set_track_name(AgsAudio *audio, gchar *track_name); GList* ags_audio_get_midi(AgsAudio *audio); void ags_audio_set_midi(AgsAudio *audio, GList *midi); void ags_audio_add_midi(AgsAudio *audio, GObject *midi); void ags_audio_remove_midi(AgsAudio *audio, GObject *midi); GObject* ags_audio_get_output_midi_file(AgsAudio *audio); void ags_audio_set_output_midi_file(AgsAudio *audio, GObject *output_midi_file); GObject* ags_audio_get_input_midi_file(AgsAudio *audio); void ags_audio_set_input_midi_file(AgsAudio *audio, GObject *input_midi_file); /* recall related */ GList* ags_audio_get_recall_id(AgsAudio *audio); void ags_audio_set_recall_id(AgsAudio *audio, GList *recall_id); void ags_audio_add_recall_id(AgsAudio *audio, GObject *recall_id); void ags_audio_remove_recall_id(AgsAudio *audio, GObject *recall_id); GList* ags_audio_get_recycling_context(AgsAudio *audio); void ags_audio_set_recycling_context(AgsAudio *audio, GList *recycling_context); void ags_audio_add_recycling_context(AgsAudio *audio, GObject *recycling_context); void ags_audio_remove_recycling_context(AgsAudio *audio, GObject *recycling_context); GList* ags_audio_get_recall_container(AgsAudio *audio); void ags_audio_set_recall_container(AgsAudio *audio, GList *recall_container); void ags_audio_add_recall_container(AgsAudio *audio, GObject *recall_container); void ags_audio_remove_recall_container(AgsAudio *audio, GObject *recall_container); GList* ags_audio_get_play(AgsAudio *audio); void ags_audio_set_play(AgsAudio *audio, GList *play); GList* ags_audio_get_recall(AgsAudio *audio); void ags_audio_set_recall(AgsAudio *audio, GList *recall); void ags_audio_add_recall(AgsAudio *audio, GObject *recall, gboolean play_context); void ags_audio_remove_recall(AgsAudio *audio, GObject *recall, gboolean play_context); /* stages */ void ags_audio_duplicate_recall(AgsAudio *audio, AgsRecallID *recall_id, guint pad, guint audio_channel, guint line); void ags_audio_resolve_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_init_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags); void ags_audio_play_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags); void ags_audio_done_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_cancel_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_cleanup_recall(AgsAudio *audio, AgsRecallID *recall_id); /* control */ GList* ags_audio_start(AgsAudio *audio, gint sound_scope); void ags_audio_stop(AgsAudio *audio, GList *recall_id, gint sound_scope); /* query */ GList* ags_audio_check_scope(AgsAudio *audio, gint sound_scope); GList* ags_audio_collect_all_audio_ports(AgsAudio *audio); GList* ags_audio_collect_all_audio_ports_by_specifier_and_context(AgsAudio *audio, gchar *specifier, gboolean play_context); /* file IO */ void ags_audio_open_audio_file_as_channel(AgsAudio *audio, GSList *filename, gboolean overwrite_channels, gboolean create_channels); void ags_audio_open_audio_file_as_wave(AgsAudio *audio, const gchar *filename, gboolean overwrite_channels, gboolean create_channels); void ags_audio_open_midi_file_as_midi(AgsAudio *audio, const gchar *filename, const gchar *instrument, const gchar *track_name, guint midi_channel); void ags_audio_open_midi_file_as_notation(AgsAudio *audio, const gchar *filename, const gchar *instrument, const gchar *track_name, guint midi_channel); /* recursive functions */ void ags_audio_recursive_set_property(AgsAudio *audio, gint n_params, const gchar *parameter_name[], const GValue value[]); void ags_audio_recursive_run_stage(AgsAudio *audio, gint sound_scope, guint staging_flags); /* instantiate */ AgsAudio* ags_audio_new(GObject *output_soundcard); G_END_DECLS #endif /*__AGS_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/ags_fm_synth_util.c0000644000175000017500000045073013607210263016346 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include /** * SECTION:ags_fm_synth_util * @short_description: frequency modulation synth util * @title: AgsFMSynthUtil * @section_id: * @include: ags/audio/ags_fm_synth_util.h * * Utility functions to compute FM synths. */ /** * ags_fm_synth_util_sin_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 127.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sin_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 32767.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sin_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 8388607.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sin_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 214748363.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sin_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 9223372036854775807.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sin_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; } } /** * ags_fm_synth_util_sin_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] + (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * volume)); } } break; } } /** * ags_fm_synth_util_sin_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < i_stop; i++){ y = (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, (creal(z0) + creal(z1)) + I * (cimag(z0) + cimag(z1))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < i_stop; i++){ y = (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < i_stop; i++){ y = (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < i_stop; i++){ y = (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < i_stop; i++){ y = (gdouble) (sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; } } /** * ags_fm_synth_util_sawtooth_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 127.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sawtooth_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 32767.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sawtooth_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 8388607.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sawtooth_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 214748363.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sawtooth_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 9223372036854775807.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_sawtooth_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; } } /** * ags_fm_synth_util_sawtooth_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * volume)); } } break; } } /** * ags_fm_synth_util_sawtooth_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ y = (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ y = (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ y = (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ y = (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ y = (double) (((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; } } /** * ags_fm_synth_util_triangle_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 127.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_triangle_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 32767.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_triangle_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 8388607.0; gdouble current_freq; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_triangle_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 214748363.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_triangle_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 9223372036854775807.0; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * scale * volume))); } } break; } } /** * ags_fm_synth_util_triangle_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; } } /** * ags_fm_synth_util_triangle_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] + (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume)); } } break; } } /** * ags_fm_synth_util_triangle_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ y = (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ y = (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ y = (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ y = (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ y = (double) ((((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / samplerate)) / 2.0) * 2) - 1.0) * volume); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; } } /** * ags_fm_synth_util_square_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 127.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_square_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 32767.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_square_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 8388607.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_square_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 214748363.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_square_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 9223372036854775807.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_square_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; } } /** * ags_fm_synth_util_square_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; } } /** * ags_fm_synth_util_square_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= 0.0){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, n_frames, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; } } /** * ags_fm_synth_util_impulse_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 127.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (1.0 * scale * volume))); }else{ buffer[i] = (gint8) (0xff & ((gint16) buffer[i] + (gint16) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_impulse_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 32767.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint16) (0xffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_impulse_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 8388607.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint32) buffer[i] + (gint32) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_impulse_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 214748363.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint32) (0xffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_impulse_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { static const gdouble scale = 9223372036854775807.0; guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (1.0 * scale * volume))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & ((gint64) buffer[i] + (gint64) (-1.0 * scale * volume))); } } } break; } } /** * ags_fm_synth_util_impulse_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_float(float *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; } } /** * ags_fm_synth_util_impulse_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_double(double *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { guint i; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] + (1.0 * volume)); }else{ buffer[i] = (buffer[i] + (-1.0 * volume)); } } } break; } } /** * ags_fm_synth_util_impulse_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; switch(lfo_osc_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + sin(i * 2.0 * M_PI * lfo_freq / samplerate) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((((int) ceil(i) % (int) ceil(samplerate / lfo_freq)) * 2.0 * lfo_freq / samplerate) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + (((i) * lfo_freq / samplerate * 2.0) - ((int) ((double) ((int) ((i) * lfo_freq / samplerate)) / 2.0) * 2) - 1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= 0.0) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * (freq * exp2(tuning / 1200.0 + ((sin((gdouble) (i) * 2.0 * M_PI * lfo_freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)) ? 1.0: -1.0) * lfo_depth)) / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (1.0 * volume); }else{ y = (-1.0 * volume); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } break; } } /** * ags_fm_synth_util_sin: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sin wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sin(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_fm_synth_util_sin_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_fm_synth_util_sin_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_fm_synth_util_sin_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_fm_synth_util_sin_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_fm_synth_util_sin_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_fm_synth_util_sin_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_fm_synth_util_sin_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_fm_synth_util_sin_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; default: { g_warning("ags_fm_synth_util_sin() - unsupported format"); } } } /** * ags_fm_synth_util_sawtooth: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate sawtooth wave. * * Since: 3.0.0 */ void ags_fm_synth_util_sawtooth(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_fm_synth_util_sawtooth_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_fm_synth_util_sawtooth_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_fm_synth_util_sawtooth_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_fm_synth_util_sawtooth_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_fm_synth_util_sawtooth_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_fm_synth_util_sawtooth_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_fm_synth_util_sawtooth_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_fm_synth_util_sawtooth_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; default: { g_warning("ags_fm_synth_util_sawtooth() - unsupported format"); } } } /** * ags_fm_synth_util_triangle: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate triangle wave. * * Since: 3.0.0 */ void ags_fm_synth_util_triangle(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_fm_synth_util_triangle_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_fm_synth_util_triangle_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_fm_synth_util_triangle_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_fm_synth_util_triangle_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_fm_synth_util_triangle_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_fm_synth_util_triangle_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_fm_synth_util_triangle_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_fm_synth_util_triangle_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; default: { g_warning("ags_fm_synth_util_triangle() - unsupported format"); } } } /** * ags_fm_synth_util_square: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate square wave. * * Since: 3.0.0 */ void ags_fm_synth_util_square(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_fm_synth_util_square_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_fm_synth_util_square_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_fm_synth_util_square_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_fm_synth_util_square_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_fm_synth_util_square_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_fm_synth_util_square_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_fm_synth_util_square_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_fm_synth_util_square_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; default: { g_warning("ags_fm_synth_util_square() - unsupported format"); } } } /** * ags_fm_synth_util_impulse: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @volume: the volume of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * @lfo_osc_mode: the LFO's oscillator mode * @lfo_freq: the LFO's frequency * @lfo_depth: the LFO's depth * @tuning: the tuninig * * Generate frequency modulate impulse wave. * * Since: 3.0.0 */ void ags_fm_synth_util_impulse(void *buffer, gdouble freq, gdouble phase, gdouble volume, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames, guint lfo_osc_mode, gdouble lfo_freq, gdouble lfo_depth, gdouble tuning) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_fm_synth_util_impulse_s8((gint8 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_fm_synth_util_impulse_s16((gint16 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_fm_synth_util_impulse_s24((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_fm_synth_util_impulse_s32((gint32 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_fm_synth_util_impulse_s64((gint64 *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_fm_synth_util_impulse_float((float *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_fm_synth_util_impulse_double((double *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_fm_synth_util_impulse_complex((AgsComplex *) buffer, freq, phase, volume, samplerate, offset, n_frames, lfo_osc_mode, lfo_freq, lfo_depth, tuning); } break; default: { g_warning("ags_fm_synth_util_impulse() - unsupported format"); } } } gsequencer-3.1.3/ags/audio/ags_recall_dssi_run.h0000644000175000017500000000457313607210263016637 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_DSSI_RUN_H__ #define __AGS_RECALL_DSSI_RUN_H__ #include #include #include #include #include #include #include #define AGS_TYPE_RECALL_DSSI_RUN (ags_recall_dssi_run_get_type()) #define AGS_RECALL_DSSI_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_DSSI_RUN, AgsRecallDssiRun)) #define AGS_RECALL_DSSI_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_DSSI_RUN, AgsRecallDssiRunClass)) #define AGS_IS_RECALL_DSSI_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_DSSI_RUN)) #define AGS_IS_RECALL_DSSI_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_DSSI_RUN)) #define AGS_RECALL_DSSI_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_DSSI_RUN, AgsRecallDssiRunClass)) typedef struct _AgsRecallDssiRun AgsRecallDssiRun; typedef struct _AgsRecallDssiRunClass AgsRecallDssiRunClass; struct _AgsRecallDssiRun { AgsRecallAudioSignal recall_audio_signal; LADSPA_Handle *ladspa_handle; guint audio_channels; LADSPA_Data *input; LADSPA_Data *output; LADSPA_Data *port_data; long delta_time; snd_seq_event_t **event_buffer; unsigned long *event_count; GObject *route_dssi_audio_run; GList *note; }; struct _AgsRecallDssiRunClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_recall_dssi_run_get_type(); AgsRecallDssiRun* ags_recall_dssi_run_new(AgsAudioSignal *source); #endif /*__AGS_RECALL_DSSI_RUN_H__*/ gsequencer-3.1.3/ags/audio/ags_audio_buffer_util.h0000644000175000017500000011205613607210263017152 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_BUFFER_UTIL_H__ #define __AGS_AUDIO_BUFFER_UTIL_H__ #include #include #include #ifdef __APPLE__ #include #endif #define AGS_AUDIO_BUFFER_S8(ptr) ((gint8 *)(ptr)) #define AGS_AUDIO_BUFFER_S16(ptr) ((gint16 *)(ptr)) #define AGS_AUDIO_BUFFER_S24(ptr) ((gint32 *)(ptr)) #define AGS_AUDIO_BUFFER_S32(ptr) ((gint32 *)(ptr)) #define AGS_AUDIO_BUFFER_S64(ptr) ((gint64 *)(ptr)) #define AGS_AUDIO_BUFFER_FLOAT(ptr) ((gfloat *)(ptr)) #define AGS_AUDIO_BUFFER_DOUBLE(ptr) ((gdouble *)(ptr)) #define AGS_AUDIO_BUFFER_COMPLEX(ptr) ((AgsComplex *)(ptr)) /** * AgsAudioBufferUtilFormat: * @AGS_AUDIO_BUFFER_UTIL_S8: signed 8 bit raw pcm * @AGS_AUDIO_BUFFER_UTIL_S16: signed 16 bit raw pcm * @AGS_AUDIO_BUFFER_UTIL_S24: signed 24 bit raw pcm * @AGS_AUDIO_BUFFER_UTIL_S32: signed 32 bit raw pcm * @AGS_AUDIO_BUFFER_UTIL_S64: signed 64 bit raw pcm * @AGS_AUDIO_BUFFER_UTIL_FLOAT: signed float raw pcm * @AGS_AUDIO_BUFFER_UTIL_DOUBLE: signed double raw pcm * @AGS_AUDIO_BUFFER_UTIL_FLOAT32: signed float32 raw pcm * @AGS_AUDIO_BUFFER_UTIL_COMPLEX: complex data type * * #AgsAudioBufferUtilFormat specifies the audio data representation. */ typedef enum{ AGS_AUDIO_BUFFER_UTIL_S8, AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S24, AGS_AUDIO_BUFFER_UTIL_S32, AGS_AUDIO_BUFFER_UTIL_S64, AGS_AUDIO_BUFFER_UTIL_FLOAT, AGS_AUDIO_BUFFER_UTIL_DOUBLE, AGS_AUDIO_BUFFER_UTIL_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COMPLEX, }AgsAudioBufferUtilFormat; /** * AgsAudioBufferUtilSamplerate: * @AGS_AUDIO_BUFFER_UTIL_8000HZ: 8000 Hz * @AGS_AUDIO_BUFFER_UTIL_44100HZ: 44100 Hz * @AGS_AUDIO_BUFFER_UTIL_48000HZ: 48000 Hz * @AGS_AUDIO_BUFFER_UTIL_96000HZ: 96000 Hz * @AGS_AUDIO_BUFFER_UTIL_176400HZ: 176400 Hz * @AGS_AUDIO_BUFFER_UTIL_192000HZ: 192000 Hz * @AGS_AUDIO_BUFFER_UTIL_352800HZ: 352800 Hz * @AGS_AUDIO_BUFFER_UTIL_2822400HZ: 2822400 Hz * @AGS_AUDIO_BUFFER_UTIL_5644800HZ: 5644800 Hz * * Some common samplerates in Hertz. */ typedef enum{ AGS_AUDIO_BUFFER_UTIL_8000HZ, AGS_AUDIO_BUFFER_UTIL_44100HZ, AGS_AUDIO_BUFFER_UTIL_48000HZ, AGS_AUDIO_BUFFER_UTIL_96000HZ, AGS_AUDIO_BUFFER_UTIL_176400HZ, AGS_AUDIO_BUFFER_UTIL_192000HZ, AGS_AUDIO_BUFFER_UTIL_352800HZ, AGS_AUDIO_BUFFER_UTIL_2822400HZ, AGS_AUDIO_BUFFER_UTIL_5644800HZ, }AgsAudioBufferUtilSamplerate; /** * AgsAudioBufferUtilCopyMode: * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_S8 to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_S16 to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_S24 to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_S32 to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_S64 to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_FLOAT to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_DOUBLE to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_FLOAT32 to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_COMPLEX: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_COMPLEX * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S8: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_S8 * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S16: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_S16 * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S24: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_S24 * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S32: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_S32 * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S64: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_S64 * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_FLOAT: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_FLOAT * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_DOUBLE: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_DOUBLE * @AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_FLOAT32: copy AGS_AUDIO_BUFFER_UTIL_COMPLEX to AGS_AUDIO_BUFFER_UTIL_FLOAT32 * * Copy modes. */ typedef enum{ /* signed 8 bit source*/ AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_DOUBLE, /* signed 16 bit source */ AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_DOUBLE, /* signed 24 bit source */ AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_DOUBLE, /* signed 32 bit source */ AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_DOUBLE, /* signed 64 bit source */ AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_DOUBLE, /* float source */ AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_DOUBLE, /* double source */ AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE, /* Float32 */ AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT32, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_DOUBLE, /* AgsComplex */ AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_COMPLEX, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S8, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S16, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S24, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S32, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S64, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_FLOAT, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_DOUBLE, AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_FLOAT32, }AgsAudioBufferUtilCopyMode; typedef gint8 ags_v8s8 __attribute__ ((vector_size(8 * sizeof(gint8)))); typedef gint16 ags_v8s16 __attribute__ ((vector_size(8 * sizeof(gint16)))); typedef gint32 ags_v8s32 __attribute__ ((vector_size(8 * sizeof(gint32)))); typedef gint64 ags_v8s64 __attribute__ ((vector_size(8 * sizeof(gint64)))); typedef gfloat ags_v8float __attribute__ ((vector_size(8 * sizeof(gfloat)))); typedef gdouble ags_v8double __attribute__ ((vector_size(8 * sizeof(gdouble)))); guint ags_audio_buffer_util_format_from_soundcard(guint soundcard_format); guint ags_audio_buffer_util_get_copy_mode(guint destination_format, guint source_format); /* clear */ void ags_audio_buffer_util_clear_float(gfloat *buffer, guint channels, guint count); #ifdef __APPLE__ void ags_audio_buffer_util_clear_float32(Float32 *buffer, guint channels, guint count); #endif void ags_audio_buffer_util_clear_double(gdouble *buffer, guint channels, guint count); void ags_audio_buffer_util_clear_complex(AgsComplex *buffer, guint channels, guint count); void ags_audio_buffer_util_clear_buffer(void *buffer, guint channels, guint count, guint format); /* envelope */ gdouble ags_audio_buffer_util_envelope_s8(gint8 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_s16(gint16 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_s24(gint32 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_s32(gint32 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_s64(gint64 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_float(gfloat *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_double(gdouble *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope_complex(AgsComplex *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio); gdouble ags_audio_buffer_util_envelope(void *buffer, guint channels, guint format, guint buffer_length, gdouble current_volume, gdouble ratio); /* volume */ void ags_audio_buffer_util_volume_s8(gint8 *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_s16(gint16 *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_s24(gint32 *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_s32(gint32 *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_s64(gint64 *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_float(gfloat *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_double(gdouble *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume_complex(AgsComplex *buffer, guint channels, guint buffer_length, gdouble volume); void ags_audio_buffer_util_volume(void *buffer, guint channels, guint format, guint buffer_length, gdouble volume); /* peak */ gdouble ags_audio_buffer_util_peak_s8(gint8 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_s16(gint16 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_s24(gint32 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_s32(gint32 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_s64(gint64 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_float(gfloat *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_double(gdouble *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak_complex(AgsComplex *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); gdouble ags_audio_buffer_util_peak(void *buffer, guint channels, guint format, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor); /* resample */ gint8* ags_audio_buffer_util_resample_s8(gint8 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); gint16* ags_audio_buffer_util_resample_s16(gint16 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); gint32* ags_audio_buffer_util_resample_s24(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); gint32* ags_audio_buffer_util_resample_s32(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); gint64* ags_audio_buffer_util_resample_s64(gint64 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); gfloat* ags_audio_buffer_util_resample_float(gfloat *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); gdouble* ags_audio_buffer_util_resample_double(gdouble *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); AgsComplex* ags_audio_buffer_util_resample_complex(AgsComplex *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate); void* ags_audio_buffer_util_resample(void *buffer, guint channels, guint format, guint samplerate, guint buffer_length, guint target_samplerate); /* resample with buffer */ void ags_audio_buffer_util_resample_s8_with_buffer(gint8 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint8 *target_buffer); void ags_audio_buffer_util_resample_s16_with_buffer(gint16 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint16 *target_buffer); void ags_audio_buffer_util_resample_s24_with_buffer(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint32 *target_buffer); void ags_audio_buffer_util_resample_s32_with_buffer(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint32 *target_buffer); void ags_audio_buffer_util_resample_s64_with_buffer(gint64 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint64 *target_buffer); void ags_audio_buffer_util_resample_float_with_buffer(gfloat *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gfloat *target_buffer); void ags_audio_buffer_util_resample_double_with_buffer(gdouble *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gdouble *target_buffer); void ags_audio_buffer_util_resample_complex_with_buffer(AgsComplex *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, AgsComplex *target_buffer); void ags_audio_buffer_util_resample_with_buffer(void *buffer, guint channels, guint format, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, void *target_buffer); /* copy 8 bit */ void ags_audio_buffer_util_copy_s8_to_s8(gint8 *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s8_to_s16(gint16 *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s8_to_s24(gint32 *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s8_to_s32(gint32 *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s8_to_s64(gint64 *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s8_to_float(gfloat *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s8_to_double(gdouble *destination, guint dchannels, gint8 *source, guint schannels, guint count); /* copy 16 bit */ void ags_audio_buffer_util_copy_s16_to_s8(gint8 *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_s16(gint16 *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_s24(gint32 *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_s32(gint32 *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_s64(gint64 *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_float(gfloat *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_double(gdouble *destination, guint dchannels, gint16 *source, guint schannels, guint count); /* copy 24 bit */ void ags_audio_buffer_util_copy_s24_to_s8(gint8 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_s16(gint16 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_s24(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_s32(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_s64(gint64 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_float(gfloat *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_double(gdouble *destination, guint dchannels, gint32 *source, guint schannels, guint count); /* copy 32 bit */ void ags_audio_buffer_util_copy_s32_to_s8(gint8 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_s16(gint16 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_s24(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_s32(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_s64(gint64 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_float(gfloat *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_double(gdouble *destination, guint dchannels, gint32 *source, guint schannels, guint count); /* copy 64 bit */ void ags_audio_buffer_util_copy_s64_to_s8(gint8 *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_s16(gint16 *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_s24(gint32 *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_s32(gint32 *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_s64(gint64 *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_float(gfloat *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_double(gdouble *destination, guint dchannels, gint64 *source, guint schannels, guint count); /* copy float */ void ags_audio_buffer_util_copy_float_to_s8(gint8 *destination, guint dchannels, gfloat *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_s16(gint16 *destination, guint dchannels, gfloat *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_s24(gint32 *destination, guint dchannels, gfloat *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_s32(gint32 *destination, guint dchannels, gfloat *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_s64(gint64 *destination, guint dchannels, gfloat *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_float(gfloat *destination, guint dchannels, gfloat *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_double(gdouble *destination, guint dchannels, gfloat *source, guint schannels, guint count); /* copy double */ void ags_audio_buffer_util_copy_double_to_s8(gint8 *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_s16(gint16 *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_s24(gint32 *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_s32(gint32 *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_s64(gint64 *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_float(gfloat *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_double(gdouble *destination, guint dchannels, gdouble *source, guint schannels, guint count); #ifdef __APPLE__ /* Float32 */ void ags_audio_buffer_util_copy_s8_to_float32(Float32 *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_float32(Float32 *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_float32(Float32 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_float32(Float32 *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_float32(Float32 *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_float32(Float32 *destination, guint dchannels, float *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_float32(Float32 *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_float32(Float32 *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_s8(gint8 *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_s16(gint16 *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_s24(gint32 *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_s32(gint32 *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_s64(gint64 *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_float(gfloat *destination, guint dchannels, Float32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float32_to_double(gdouble *destination, guint dchannels, Float32 *source, guint schannels, guint count); #endif /* AgsComplex */ void ags_audio_buffer_util_copy_s8_to_complex(AgsComplex *destination, guint dchannels, gint8 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s16_to_complex(AgsComplex *destination, guint dchannels, gint16 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s24_to_complex(AgsComplex *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s32_to_complex(AgsComplex *destination, guint dchannels, gint32 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_s64_to_complex(AgsComplex *destination, guint dchannels, gint64 *source, guint schannels, guint count); void ags_audio_buffer_util_copy_float_to_complex(AgsComplex *destination, guint dchannels, gdouble *source, guint schannels, guint count); void ags_audio_buffer_util_copy_double_to_complex(AgsComplex *destination, guint dchannels, gdouble *source, guint schannels, guint count); #ifdef __APPLE__ void ags_audio_buffer_util_copy_float32_to_complex(AgsComplex *destination, guint dchannels, Float32 *source, guint schannels, guint count); #endif void ags_audio_buffer_util_copy_complex_to_complex(AgsComplex *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_s8(gint8 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_s16(gint16 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_s24(gint32 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_s32(gint32 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_s64(gint64 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_float(gfloat *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); void ags_audio_buffer_util_copy_complex_to_double(gdouble *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); #ifdef __APPLE__ void ags_audio_buffer_util_copy_complex_to_float32(Float32 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count); #endif /* copy */ void ags_audio_buffer_util_copy_buffer_to_buffer(void *destination, guint dchannels, guint doffset, void *source, guint schannels, guint soffset, guint count, guint mode); #endif /*__AGS_AUDIO_BUFFER_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_acceleration.c0000644000175000017500000003001713616617253016115 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_acceleration_class_init(AgsAccelerationClass *acceleration); void ags_acceleration_init(AgsAcceleration *acceleration); void ags_acceleration_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_acceleration_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_acceleration_finalize(GObject *gobject); /** * SECTION:ags_acceleration * @short_description: Acceleration class * @title: AgsAcceleration * @section_id: * @include: ags/audio/ags_acceleration.h * * #AgsAcceleration represents a downhill-grade. */ enum{ PROP_0, PROP_X, PROP_Y, PROP_ACCELERATION_NAME, }; static gpointer ags_acceleration_parent_class = NULL; GType ags_acceleration_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_acceleration = 0; static const GTypeInfo ags_acceleration_info = { sizeof(AgsAccelerationClass), NULL, NULL, (GClassInitFunc) ags_acceleration_class_init, NULL, NULL, sizeof(AgsAcceleration), 0, (GInstanceInitFunc) ags_acceleration_init, }; ags_type_acceleration = g_type_register_static(G_TYPE_OBJECT, "AgsAcceleration", &ags_acceleration_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_acceleration); } return g_define_type_id__volatile; } void ags_acceleration_class_init(AgsAccelerationClass *acceleration) { GObjectClass *gobject; GParamSpec *param_spec; ags_acceleration_parent_class = g_type_class_peek_parent(acceleration); gobject = (GObjectClass *) acceleration; gobject->set_property = ags_acceleration_set_property; gobject->get_property = ags_acceleration_get_property; gobject->finalize = ags_acceleration_finalize; /* properties */ /** * AgsAcceleration:x: * * Acceleration offset x. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("x", i18n_pspec("offset x"), i18n_pspec("The x offset"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X, param_spec); /** * AgsAcceleration:y: * * Acceleration value y. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y", i18n_pspec("offset y"), i18n_pspec("The y offset"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y, param_spec); /** * AgsAcceleration:acceleration-name: * * The acceleration's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("acceleration-name", i18n_pspec("acceleration name"), i18n_pspec("The acceleration's name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ACCELERATION_NAME, param_spec); } void ags_acceleration_init(AgsAcceleration *acceleration) { acceleration->flags = 0; /* acceleration mutex */ g_rec_mutex_init(&(acceleration->obj_mutex)); /* fields */ acceleration->x = 0; acceleration->y = 0.0; acceleration->acceleration_name = NULL; } void ags_acceleration_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAcceleration *acceleration; GRecMutex *acceleration_mutex; acceleration = AGS_ACCELERATION(gobject); /* get acceleration mutex */ acceleration_mutex = AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration); switch(prop_id){ case PROP_X: { g_rec_mutex_lock(acceleration_mutex); acceleration->x = g_value_get_uint(value); g_rec_mutex_unlock(acceleration_mutex); } break; case PROP_Y: { g_rec_mutex_lock(acceleration_mutex); acceleration->y = g_value_get_double(value); g_rec_mutex_unlock(acceleration_mutex); } break; case PROP_ACCELERATION_NAME: { gchar *acceleration_name; acceleration_name = g_value_get_string(value); g_rec_mutex_lock(acceleration_mutex); if(acceleration_name == acceleration->acceleration_name){ g_rec_mutex_unlock(acceleration_mutex); return; } if(acceleration->acceleration_name != NULL){ g_free(acceleration->acceleration_name); } acceleration->acceleration_name = g_strdup(acceleration_name); g_rec_mutex_unlock(acceleration_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_acceleration_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAcceleration *acceleration; GRecMutex *acceleration_mutex; acceleration = AGS_ACCELERATION(gobject); /* get acceleration mutex */ acceleration_mutex = AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration); switch(prop_id){ case PROP_X: { g_rec_mutex_lock(acceleration_mutex); g_value_set_uint(value, acceleration->x); g_rec_mutex_unlock(acceleration_mutex); } break; case PROP_Y: { g_rec_mutex_lock(acceleration_mutex); g_value_set_double(value, acceleration->y); g_rec_mutex_unlock(acceleration_mutex); } break; case PROP_ACCELERATION_NAME: { g_rec_mutex_lock(acceleration_mutex); g_value_set_string(value, acceleration->acceleration_name); g_rec_mutex_unlock(acceleration_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_acceleration_finalize(GObject *gobject) { AgsAcceleration *acceleration; acceleration = AGS_ACCELERATION(gobject); if(acceleration->acceleration_name != NULL){ free(acceleration->acceleration_name); } /* call parent */ G_OBJECT_CLASS(ags_acceleration_parent_class)->finalize(gobject); } /** * ags_acceleration_get_obj_mutex: * @acceleration: the #AgsAcceleration * * Get object mutex. * * Returns: the #GRecMutex to lock @acceleration * * Since: 3.1.0 */ GRecMutex* ags_acceleration_get_obj_mutex(AgsAcceleration *acceleration) { if(!AGS_IS_ACCELERATION(acceleration)){ return(NULL); } return(AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration)); } /** * ags_acceleration_test_flags: * @acceleration: the #AgsAcceleration * @flags: the flags * * Test @flags to be set on @acceleration. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_acceleration_test_flags(AgsAcceleration *acceleration, guint flags) { gboolean retval; GRecMutex *acceleration_mutex; if(!AGS_IS_ACCELERATION(acceleration)){ return(FALSE); } /* get acceleration mutex */ acceleration_mutex = AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration); /* test */ g_rec_mutex_lock(acceleration_mutex); retval = (flags & (acceleration->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(acceleration_mutex); return(retval); } /** * ags_acceleration_set_flags: * @acceleration: the #AgsAcceleration * @flags: the flags * * Set @flags on @acceleration. * * Since: 3.0.0 */ void ags_acceleration_set_flags(AgsAcceleration *acceleration, guint flags) { GRecMutex *acceleration_mutex; if(!AGS_IS_ACCELERATION(acceleration)){ return; } /* get acceleration mutex */ acceleration_mutex = AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration); /* set */ g_rec_mutex_lock(acceleration_mutex); acceleration->flags |= flags; g_rec_mutex_unlock(acceleration_mutex); } /** * ags_acceleration_unset_flags: * @acceleration: the #AgsAcceleration * @flags: the flags * * Unset @flags on @acceleration. * * Since: 3.0.0 */ void ags_acceleration_unset_flags(AgsAcceleration *acceleration, guint flags) { GRecMutex *acceleration_mutex; if(!AGS_IS_ACCELERATION(acceleration)){ return; } /* get acceleration mutex */ acceleration_mutex = AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration); /* unset */ g_rec_mutex_lock(acceleration_mutex); acceleration->flags &= (~flags); g_rec_mutex_unlock(acceleration_mutex); } /** * ags_acceleration_sort_func: * @a: an #AgsAcceleration * @b: an other #AgsAcceleration * * Sort accelerations. * * Returns: 0 if equal, -1 if smaller and 1 if bigger offset * * Since: 3.0.0 */ gint ags_acceleration_sort_func(gconstpointer a, gconstpointer b) { guint a_x, b_x; if(a == NULL || b == NULL){ return(0); } g_object_get(a, "x", &a_x, NULL); g_object_get(b, "x", &b_x, NULL); if(a_x == b_x){ return(0); } if(a_x < b_x){ return(-1); }else{ return(1); } } /** * ags_acceleration_get_x: * @acceleration: the #AgsAcceleration * * Gets x. * * Returns: the x * * Since: 3.1.0 */ guint ags_acceleration_get_x(AgsAcceleration *acceleration) { guint x; if(!AGS_IS_ACCELERATION(acceleration)){ return(0); } g_object_get(acceleration, "x", &x, NULL); return(x); } /** * ags_acceleration_set_x: * @acceleration: the #AgsAcceleration * @x: the x * * Sets x. * * Since: 3.1.0 */ void ags_acceleration_set_x(AgsAcceleration *acceleration, guint x) { if(!AGS_IS_ACCELERATION(acceleration)){ return; } g_object_set(acceleration, "x", x, NULL); } /** * ags_acceleration_get_y: * @acceleration: the #AgsAcceleration * * Gets y. * * Returns: the y * * Since: 3.1.0 */ gdouble ags_acceleration_get_y(AgsAcceleration *acceleration) { gdouble y; if(!AGS_IS_ACCELERATION(acceleration)){ return(0); } g_object_get(acceleration, "y", &y, NULL); return(y); } /** * ags_acceleration_set_y: * @acceleration: the #AgsAcceleration * @y: the y * * Sets y. * * Since: 3.1.0 */ void ags_acceleration_set_y(AgsAcceleration *acceleration, gdouble y) { if(!AGS_IS_ACCELERATION(acceleration)){ return; } g_object_set(acceleration, "y", y, NULL); } /** * ags_acceleration_duplicate: * @acceleration: an #AgsAcceleration * * Duplicate a acceleration. * * Returns: (transfer full): the duplicated #AgsAcceleration. * * Since: 3.0.0 */ AgsAcceleration* ags_acceleration_duplicate(AgsAcceleration *acceleration) { AgsAcceleration *acceleration_copy; GRecMutex *acceleration_mutex; if(!AGS_IS_ACCELERATION(acceleration)){ return(NULL); } /* get acceleration mutex */ acceleration_mutex = AGS_ACCELERATION_GET_OBJ_MUTEX(acceleration); /* instantiate acceleration */ acceleration_copy = ags_acceleration_new(); acceleration_copy->flags = 0; g_rec_mutex_lock(acceleration_mutex); acceleration_copy->x = acceleration->x; acceleration_copy->y = acceleration->y; acceleration_copy->acceleration_name = g_strdup(acceleration->acceleration_name); g_rec_mutex_unlock(acceleration_mutex); return(acceleration_copy); } /** * ags_acceleration_new: * * Creates a new instance of #AgsAcceleration * * Returns: the new #AgsAcceleration * * Since: 3.0.0 */ AgsAcceleration* ags_acceleration_new() { AgsAcceleration *acceleration; acceleration = (AgsAcceleration *) g_object_new(AGS_TYPE_ACCELERATION, NULL); return(acceleration); } gsequencer-3.1.3/ags/audio/ags_recycling_context.h0000644000175000017500000001037413607210263017206 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECYCLING_CONTEXT_H__ #define __AGS_RECYCLING_CONTEXT_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECYCLING_CONTEXT (ags_recycling_context_get_type()) #define AGS_RECYCLING_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECYCLING_CONTEXT, AgsRecyclingContext)) #define AGS_RECYCLING_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECYCLING_CONTEXT, AgsRecyclingContextClass)) #define AGS_IS_RECYCLING_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECYCLING_CONTEXT)) #define AGS_IS_RECYCLING_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECYCLING_CONTEXT)) #define AGS_RECYCLING_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECYCLING_CONTEXT, AgsRecyclingContextClass)) #define AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(obj) (&(((AgsRecyclingContext *) obj)->obj_mutex)) typedef struct _AgsRecyclingContext AgsRecyclingContext; typedef struct _AgsRecyclingContextClass AgsRecyclingContextClass; typedef enum{ AGS_RECYCLING_CONTEXT_CONNECTED = 1, AGS_RECYCLING_CONTEXT_CHAINED_TO_OUTPUT = 1 << 1, AGS_RECYCLING_CONTEXT_CHAINED_TO_INPUT = 1 << 2, }AgsRecyclingContextFlags; struct _AgsRecyclingContext { GObject gobject; guint flags; gint sound_scope; GRecMutex obj_mutex; GObject *recall_id; AgsRecyclingContext *parent; GList *children; AgsRecycling **recycling; guint64 length; }; struct _AgsRecyclingContextClass { GObjectClass gobject; }; GType ags_recycling_context_get_type(); GList* ags_recycling_context_find_scope(GList *recycling_context, gint sound_scope); /* replace, add, remove and insert */ void ags_recycling_context_replace(AgsRecyclingContext *recycling_context, AgsRecycling *recycling, gint position); void ags_recycling_context_add(AgsRecyclingContext *recycling_context, AgsRecycling *recycling); void ags_recycling_context_remove(AgsRecyclingContext *recycling_context, AgsRecycling *recycling); void ags_recycling_context_insert(AgsRecyclingContext *recycling_context, AgsRecycling *recycling, gint position); /* tolevel, find, find child and find parent */ AgsRecyclingContext* ags_recycling_context_get_toplevel(AgsRecyclingContext *recycling_context); gint ags_recycling_context_find(AgsRecyclingContext *recycling_context, AgsRecycling *recycling); gint ags_recycling_context_find_child(AgsRecyclingContext *recycling_context, AgsRecycling *recycling); gint ags_recycling_context_find_parent(AgsRecyclingContext *recycling_context, AgsRecycling *recycling); /* add and remove child */ void ags_recycling_context_add_child(AgsRecyclingContext *parent, AgsRecyclingContext *child); void ags_recycling_context_remove_child(AgsRecyclingContext *parent, AgsRecyclingContext *child); /* child recall id */ GList* ags_recycling_context_get_child_recall_id(AgsRecyclingContext *recycling_context); /* instantiate - reset recycling */ AgsRecyclingContext* ags_recycling_context_reset_recycling(AgsRecyclingContext *recycling_context, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *new_first_recycling, AgsRecycling *new_last_recycling); /* instantiate */ AgsRecyclingContext* ags_recycling_context_new(guint64 length); G_END_DECLS #endif /*__AGS_RECYCLING_CONTEXT_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_audio.h0000644000175000017500000000420413616617253016113 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_AUDIO_H__ #define __AGS_RECALL_AUDIO_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_AUDIO (ags_recall_audio_get_type()) #define AGS_RECALL_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_AUDIO, AgsRecallAudio)) #define AGS_RECALL_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_AUDIO, AgsRecallAudioClass)) #define AGS_IS_RECALL_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_AUDIO)) #define AGS_IS_RECALL_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_AUDIO)) #define AGS_RECALL_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_AUDIO, AgsRecallAudioClass)) typedef struct _AgsRecallAudio AgsRecallAudio; typedef struct _AgsRecallAudioClass AgsRecallAudioClass; struct _AgsRecallAudio { AgsRecall recall; guint flags; AgsAudio *audio; }; struct _AgsRecallAudioClass { AgsRecallClass recall; }; GType ags_recall_audio_get_type(); AgsAudio* ags_recall_audio_get_audio(AgsRecallAudio *recall_audio); void ags_recall_audio_set_audio(AgsRecallAudio *recall_audio, AgsAudio *audio); AgsRecallAudio* ags_recall_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_RECALL_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/ags_generic_recall_recycling.c0000644000175000017500000001076413607210263020456 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_generic_recall_recycling_class_init(AgsGenericRecallRecyclingClass *generic_recall_recycling); void ags_generic_recall_recycling_connectable_interface_init(AgsConnectableInterface *connectable); void ags_generic_recall_recycling_init(AgsGenericRecallRecycling *generic_recall_recycling); /** * SECTION:ags_generic_recall_recycling * @short_description: generic recycling context of recall * @title: AgsGenericRecallRecycling * @section_id: * @include: ags/audio/ags_generic_recall_recycling.h * * #AgsGenericRecallRecycling acts as generic recycling recall. */ static gpointer ags_generic_recall_recycling_parent_class = NULL; static AgsConnectableInterface *ags_generic_recall_recycling_parent_connectable_interface; GType ags_generic_recall_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_generic_recall_recycling = 0; static const GTypeInfo ags_generic_recall_recycling_info = { sizeof (AgsGenericRecallRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_generic_recall_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsGenericRecallRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_generic_recall_recycling_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_generic_recall_recycling_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_generic_recall_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsGenericRecallRecycling", &ags_generic_recall_recycling_info, 0); g_type_add_interface_static(ags_type_generic_recall_recycling, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_generic_recall_recycling); } return g_define_type_id__volatile; } void ags_generic_recall_recycling_class_init(AgsGenericRecallRecyclingClass *generic_recall_recycling) { ags_generic_recall_recycling_parent_class = g_type_class_peek_parent(generic_recall_recycling); } void ags_generic_recall_recycling_connectable_interface_init(AgsConnectableInterface *connectable) { ags_generic_recall_recycling_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_generic_recall_recycling_init(AgsGenericRecallRecycling *generic_recall_recycling) { AGS_RECALL(generic_recall_recycling)->name = "ags-recall"; AGS_RECALL(generic_recall_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(generic_recall_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(generic_recall_recycling)->xml_type = "ags-generic-recall-recycling"; AGS_RECALL(generic_recall_recycling)->port = NULL; AGS_RECALL(generic_recall_recycling)->behaviour_flags |= AGS_SOUND_BEHAVIOUR_PERSISTENT; AGS_RECALL(generic_recall_recycling)->child_type = G_TYPE_NONE; } /** * ags_generic_recall_recycling_new: * @recycling: the source #AgsRecycling * @child_type: child type * * Creates an #AgsGenericRecallRecycling. * * Returns: a new #AgsGenericRecallRecycling. * * Since: 3.0.0 */ AgsGenericRecallRecycling* ags_generic_recall_recycling_new(AgsRecycling *recycling, GType child_type) { AgsGenericRecallRecycling *generic_recall_recycling; generic_recall_recycling = (AgsGenericRecallRecycling *) g_object_new(AGS_TYPE_GENERIC_RECALL_RECYCLING, "source", recycling, "child-type", child_type, NULL); return(generic_recall_recycling); } gsequencer-3.1.3/ags/audio/ags_recall_audio_signal.h0000644000175000017500000000425513607210263017444 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_AUDIO_SIGNAL_H__ #define __AGS_RECALL_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_AUDIO_SIGNAL (ags_recall_audio_signal_get_type()) #define AGS_RECALL_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_AUDIO_SIGNAL, AgsRecallAudioSignal)) #define AGS_RECALL_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_AUDIO_SIGNAL, AgsRecallAudioSignalClass)) #define AGS_IS_RECALL_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_AUDIO_SIGNAL)) #define AGS_IS_RECALL_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_AUDIO_SIGNAL)) #define AGS_RECALL_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_AUDIO_SIGNAL, AgsRecallAudioSignalClass)) typedef struct _AgsRecallAudioSignal AgsRecallAudioSignal; typedef struct _AgsRecallAudioSignalClass AgsRecallAudioSignalClass; struct _AgsRecallAudioSignal { AgsRecall recall; AgsAudioSignal *destination; AgsAudioSignal *source; }; struct _AgsRecallAudioSignalClass { AgsRecallClass recall; }; GType ags_recall_audio_signal_get_type(); AgsRecallAudioSignal* ags_recall_audio_signal_new(); G_END_DECLS #endif /*__AGS_RECALL_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_audio_run.c0000644000175000017500000003311213616617253016772 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_recall_audio_run_class_init(AgsRecallAudioRunClass *recall_audio_run); void ags_recall_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_audio_run_init(AgsRecallAudioRun *recall_audio_run); void ags_recall_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_audio_run_dispose(GObject *gobject); void ags_recall_audio_run_finalize(GObject *gobject); void ags_recall_audio_run_notify_recall_container_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); AgsRecall* ags_recall_audio_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); /** * SECTION:ags_recall_audio_run * @short_description: audio context of dynamic recall * @title: AgsRecallAudioRun * @section_id: * @include: ags/audio/ags_recall_audio_run.h * * #AgsRecallAudioRun acts as dynamic audio recall. */ enum{ PROP_0, PROP_AUDIO, PROP_RECALL_AUDIO, }; static gpointer ags_recall_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_recall_audio_run_parent_connectable_interface; GType ags_recall_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_audio_run = 0; static const GTypeInfo ags_recall_audio_run_info = { sizeof (AgsRecallAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_audio_run = g_type_register_static(AGS_TYPE_RECALL, "AgsRecallAudioRun", &ags_recall_audio_run_info, 0); g_type_add_interface_static(ags_type_recall_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_audio_run); } return g_define_type_id__volatile; } void ags_recall_audio_run_class_init(AgsRecallAudioRunClass *recall_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_audio_run_parent_class = g_type_class_peek_parent(recall_audio_run); /* GObjectClass */ gobject = (GObjectClass *) recall_audio_run; gobject->set_property = ags_recall_audio_run_set_property; gobject->get_property = ags_recall_audio_run_get_property; gobject->dispose = ags_recall_audio_run_dispose; gobject->finalize = ags_recall_audio_run_finalize; /* properties */ /** * AgsRecallAudioRun:audio: * * The assigned audio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio object it is assigned to"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsRecallAudioRun:recall-audio: * * The recall audio belonging to. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-audio", i18n_pspec("AgsRecallAudio of this recall"), i18n_pspec("The AgsRecallAudio which this recall needs"), AGS_TYPE_RECALL_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_audio_run; recall->duplicate = ags_recall_audio_run_duplicate; } void ags_recall_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_audio_run_init(AgsRecallAudioRun *recall_audio_run) { g_signal_connect_after(recall_audio_run, "notify::recall-container", G_CALLBACK(ags_recall_audio_run_notify_recall_container_callback), NULL); recall_audio_run->audio = NULL; recall_audio_run->recall_audio = NULL; } void ags_recall_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallAudioRun *recall_audio_run; GRecMutex *recall_mutex; recall_audio_run = AGS_RECALL_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_audio_run); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsRecallAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_audio_run->audio == audio){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_audio_run->audio != NULL){ g_object_unref(G_OBJECT(recall_audio_run->audio)); } if(audio != NULL){ g_object_ref(G_OBJECT(audio)); } recall_audio_run->audio = audio; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_AUDIO: { AgsRecallAudio *recall_audio; recall_audio = (AgsRecallAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_audio_run->recall_audio == recall_audio){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_audio_run->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_audio_run->recall_audio)); } if(recall_audio != NULL){ g_object_ref(G_OBJECT(recall_audio)); } recall_audio_run->recall_audio = recall_audio; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallAudioRun *recall_audio_run; GRecMutex *recall_mutex; recall_audio_run = AGS_RECALL_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_audio_run); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_audio_run->audio); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECALL_AUDIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_audio_run->recall_audio); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_audio_run_dispose(GObject *gobject) { AgsRecallAudioRun *recall_audio_run; recall_audio_run = AGS_RECALL_AUDIO_RUN(gobject); /* unpack */ if(AGS_RECALL(gobject)->recall_container != NULL){ AgsRecallContainer *recall_container; recall_container = (AgsRecallContainer *) AGS_RECALL(gobject)->recall_container; recall_container->recall_audio_run = g_list_remove(recall_container->recall_audio_run, gobject); g_object_unref(gobject); g_object_unref(AGS_RECALL(gobject)->recall_container); AGS_RECALL(gobject)->recall_container = NULL; } /* audio */ if(recall_audio_run->audio != NULL){ g_object_unref(G_OBJECT(recall_audio_run->audio)); recall_audio_run->audio = NULL; } /* recall audio */ if(recall_audio_run->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_audio_run->recall_audio)); recall_audio_run->recall_audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_audio_run_parent_class)->dispose(gobject); } void ags_recall_audio_run_finalize(GObject *gobject) { AgsRecallAudioRun *recall_audio_run; recall_audio_run = AGS_RECALL_AUDIO_RUN(gobject); if(AGS_RECALL(gobject)->recall_container != NULL){ AgsRecallContainer *recall_container; recall_container = (AgsRecallContainer *) AGS_RECALL(gobject)->recall_container; recall_container->recall_audio_run = g_list_remove(recall_container->recall_audio_run, gobject); g_object_unref(AGS_RECALL(gobject)->recall_container); } /* audio */ if(recall_audio_run->audio != NULL){ g_object_unref(G_OBJECT(recall_audio_run->audio)); } /* recall audio */ if(recall_audio_run->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_audio_run->recall_audio)); } /* call parent */ G_OBJECT_CLASS(ags_recall_audio_run_parent_class)->finalize(gobject); } void ags_recall_audio_run_notify_recall_container_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsRecallContainer *recall_container; AgsRecallAudioRun *recall_audio_run; recall_audio_run = AGS_RECALL_AUDIO_RUN(gobject); /* get some fields */ g_object_get(recall_audio_run, "recall-container", &recall_container, NULL); if(recall_container != NULL){ AgsRecallAudio *recall_audio; /* recall audio */ g_object_get(recall_container, "recall-audio", &recall_audio, NULL); if(recall_audio != NULL){ g_object_set(recall_audio_run, "recall-audio", recall_audio, NULL); g_object_unref(recall_audio); } g_object_unref(recall_container); }else{ g_object_set(recall_audio_run, "recall-audio", NULL, NULL); } } AgsRecall* ags_recall_audio_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsAudio *audio; AgsRecallAudio *recall_audio; AgsRecallAudioRun *recall_audio_run, *copy_recall_audio_run; recall_audio_run = AGS_RECALL_AUDIO_RUN(recall); /* get some fields */ g_object_get(recall_audio_run, "audio", &audio, "recall-audio", &recall_audio, NULL); /* duplicate */ copy_recall_audio_run = (AgsRecallAudioRun *) AGS_RECALL_CLASS(ags_recall_audio_run_parent_class)->duplicate(recall, recall_id, n_params, parameter_name, value); g_object_set(copy_recall_audio_run, "audio", audio, "recall-audio", recall_audio, NULL); /* unref */ if(audio != NULL){ g_object_unref(audio); } if(recall_audio != NULL){ g_object_unref(recall_audio); } return((AgsRecall *) copy_recall_audio_run); } /** * ags_recall_audio_run_get_audio: * @recall_audio_run: the #AgsRecallAudioRun * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ AgsAudio* ags_recall_audio_run_get_audio(AgsRecallAudioRun *recall_audio_run) { AgsAudio *audio; if(!AGS_IS_RECALL_AUDIO_RUN(recall_audio_run)){ return(NULL); } g_object_get(recall_audio_run, "audio", &audio, NULL); return(audio); } /** * ags_recall_audio_run_set_audio: * @recall_audio_run: the #AgsRecallAudioRun * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_recall_audio_run_set_audio(AgsRecallAudioRun *recall_audio_run, AgsAudio *audio) { if(!AGS_IS_RECALL_AUDIO_RUN(recall_audio_run)){ return; } g_object_set(recall_audio_run, "audio", audio, NULL); } /** * ags_recall_audio_run_get_recall_audio: * @recall_audio_run: the #AgsRecallAudioRun * * Get recall audio. * * Returns: (transfer full): the #AgsRecallAudio * * Since: 3.1.0 */ AgsRecallAudio* ags_recall_audio_run_get_recall_audio(AgsRecallAudioRun *recall_audio_run) { AgsRecallAudio *recall_audio; if(!AGS_IS_RECALL_AUDIO_RUN(recall_audio_run)){ return(NULL); } g_object_get(recall_audio_run, "recall-audio", &recall_audio, NULL); return(recall_audio); } /** * ags_recall_audio_run_set_recall_audio: * @recall_audio_run: the #AgsRecallAudioRun * @recall_audio: the #AgsRecallAudio * * Set recall audio. * * Since: 3.1.0 */ void ags_recall_audio_run_set_recall_audio(AgsRecallAudioRun *recall_audio_run, AgsRecallAudio *recall_audio) { if(!AGS_IS_RECALL_AUDIO_RUN(recall_audio_run)){ return; } g_object_set(recall_audio_run, "recall-audio", recall_audio, NULL); } /** * ags_recall_audio_run_new: * * Creates an #AgsRecallAudioRun. * * Returns: a new #AgsRecallAudioRun. * * Since: 3.0.0 */ AgsRecallAudioRun* ags_recall_audio_run_new() { AgsRecallAudioRun *recall_audio_run; recall_audio_run = (AgsRecallAudioRun *) g_object_new(AGS_TYPE_RECALL_AUDIO_RUN, NULL); return(recall_audio_run); } gsequencer-3.1.3/ags/audio/ags_devout.c0000644000175000017500000032275113616617253015003 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #ifndef AGS_W32API #include #include #ifndef __APPLE__ #include #endif #endif #include #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include void ags_devout_class_init(AgsDevoutClass *devout); void ags_devout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_devout_init(AgsDevout *devout); void ags_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_devout_dispose(GObject *gobject); void ags_devout_finalize(GObject *gobject); AgsUUID* ags_devout_get_uuid(AgsConnectable *connectable); gboolean ags_devout_has_resource(AgsConnectable *connectable); gboolean ags_devout_is_ready(AgsConnectable *connectable); void ags_devout_add_to_registry(AgsConnectable *connectable); void ags_devout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_devout_list_resource(AgsConnectable *connectable); xmlNode* ags_devout_xml_compose(AgsConnectable *connectable); void ags_devout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_devout_is_connected(AgsConnectable *connectable); void ags_devout_connect(AgsConnectable *connectable); void ags_devout_disconnect(AgsConnectable *connectable); void ags_devout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_devout_get_device(AgsSoundcard *soundcard); void ags_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_devout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_devout_get_capability(AgsSoundcard *soundcard); gboolean ags_devout_is_available(AgsSoundcard *soundcard); gboolean ags_devout_is_starting(AgsSoundcard *soundcard); gboolean ags_devout_is_playing(AgsSoundcard *soundcard); gchar* ags_devout_get_uptime(AgsSoundcard *soundcard); void ags_devout_delegate_play_init(AgsSoundcard *soundcard, GError **error); void ags_devout_delegate_play(AgsSoundcard *soundcard, GError **error); void ags_devout_delegate_stop(AgsSoundcard *soundcard); void ags_devout_oss_init(AgsSoundcard *soundcard, GError **error); void ags_devout_oss_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size); gboolean ags_devout_oss_io_func(GIOChannel *source, GIOCondition condition, AgsDevout *devout); void ags_devout_oss_play(AgsSoundcard *soundcard, GError **error); void ags_devout_oss_free(AgsSoundcard *soundcard); gboolean ags_devout_alsa_io_func(GIOChannel *source, GIOCondition condition, AgsDevout *devout); void ags_devout_alsa_init(AgsSoundcard *soundcard, GError **error); void ags_devout_alsa_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size); void ags_devout_alsa_play(AgsSoundcard *soundcard, GError **error); void ags_devout_alsa_free(AgsSoundcard *soundcard); void ags_devout_tic(AgsSoundcard *soundcard); void ags_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_devout_get_bpm(AgsSoundcard *soundcard); void ags_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_devout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_devout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_devout_get_delay(AgsSoundcard *soundcard); guint ags_devout_get_attack(AgsSoundcard *soundcard); void* ags_devout_get_buffer(AgsSoundcard *soundcard); void* ags_devout_get_next_buffer(AgsSoundcard *soundcard); void* ags_devout_get_prev_buffer(AgsSoundcard *soundcard); void ags_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_devout_get_delay_counter(AgsSoundcard *soundcard); void ags_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_devout_get_start_note_offset(AgsSoundcard *soundcard); void ags_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_devout_get_note_offset(AgsSoundcard *soundcard); void ags_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_devout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_devout_get_loop_offset(AgsSoundcard *soundcard); guint ags_devout_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); /** * SECTION:ags_devout * @short_description: Output to soundcard * @title: AgsDevout * @section_id: * @include: ags/audio/ags_devout.h * * #AgsDevout represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, }; static gpointer ags_devout_parent_class = NULL; GType ags_devout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_devout = 0; static const GTypeInfo ags_devout_info = { sizeof(AgsDevoutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_devout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDevout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_devout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_devout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_devout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_devout = g_type_register_static(G_TYPE_OBJECT, "AgsDevout", &ags_devout_info, 0); g_type_add_interface_static(ags_type_devout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_devout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_devout); } return g_define_type_id__volatile; } void ags_devout_class_init(AgsDevoutClass *devout) { GObjectClass *gobject; GParamSpec *param_spec; ags_devout_parent_class = g_type_class_peek_parent(devout); /* GObjectClass */ gobject = (GObjectClass *) devout; gobject->set_property = ags_devout_set_property; gobject->get_property = ags_devout_get_property; gobject->dispose = ags_devout_dispose; gobject->finalize = ags_devout_finalize; /* properties */ /** * AgsDevout:device: * * The alsa soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), AGS_DEVOUT_DEFAULT_ALSA_DEVICE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsDevout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), AGS_SOUNDCARD_MIN_DSP_CHANNELS, AGS_SOUNDCARD_MAX_DSP_CHANNELS, AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsDevout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), AGS_SOUNDCARD_MIN_PCM_CHANNELS, AGS_SOUNDCARD_MAX_PCM_CHANNELS, AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsDevout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsDevout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), AGS_SOUNDCARD_MIN_BUFFER_SIZE, AGS_SOUNDCARD_MAX_BUFFER_SIZE, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsDevout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), (guint) AGS_SOUNDCARD_MIN_SAMPLERATE, (guint) AGS_SOUNDCARD_MAX_SAMPLERATE, (guint) AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsDevout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsDevout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, AGS_SOUNDCARD_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsDevout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsDevout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /* AgsDevoutClass */ } GQuark ags_devout_error_quark() { return(g_quark_from_static_string("ags-devout-error-quark")); } void ags_devout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_devout_get_uuid; connectable->has_resource = ags_devout_has_resource; connectable->is_ready = ags_devout_is_ready; connectable->add_to_registry = ags_devout_add_to_registry; connectable->remove_from_registry = ags_devout_remove_from_registry; connectable->list_resource = ags_devout_list_resource; connectable->xml_compose = ags_devout_xml_compose; connectable->xml_parse = ags_devout_xml_parse; connectable->is_connected = ags_devout_is_connected; connectable->connect = ags_devout_connect; connectable->disconnect = ags_devout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_devout_set_device; soundcard->get_device = ags_devout_get_device; soundcard->set_presets = ags_devout_set_presets; soundcard->get_presets = ags_devout_get_presets; soundcard->list_cards = ags_devout_list_cards; soundcard->pcm_info = ags_devout_pcm_info; soundcard->get_capability = ags_devout_get_capability; soundcard->is_available = ags_devout_is_available; soundcard->is_starting = ags_devout_is_starting; soundcard->is_playing = ags_devout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_devout_get_uptime; soundcard->play_init = ags_devout_delegate_play_init; soundcard->play = ags_devout_delegate_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_devout_delegate_stop; soundcard->tic = ags_devout_tic; soundcard->offset_changed = ags_devout_offset_changed; soundcard->set_bpm = ags_devout_set_bpm; soundcard->get_bpm = ags_devout_get_bpm; soundcard->set_delay_factor = ags_devout_set_delay_factor; soundcard->get_delay_factor = ags_devout_get_delay_factor; soundcard->get_absolute_delay = ags_devout_get_absolute_delay; soundcard->get_delay = ags_devout_get_delay; soundcard->get_attack = ags_devout_get_attack; soundcard->get_buffer = ags_devout_get_buffer; soundcard->get_next_buffer = ags_devout_get_next_buffer; soundcard->get_prev_buffer = ags_devout_get_prev_buffer; soundcard->lock_buffer = ags_devout_lock_buffer; soundcard->unlock_buffer = ags_devout_unlock_buffer; soundcard->get_delay_counter = ags_devout_get_delay_counter; soundcard->set_start_note_offset = ags_devout_set_start_note_offset; soundcard->get_start_note_offset = ags_devout_get_start_note_offset; soundcard->set_note_offset = ags_devout_set_note_offset; soundcard->get_note_offset = ags_devout_get_note_offset; soundcard->set_note_offset_absolute = ags_devout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_devout_get_note_offset_absolute; soundcard->set_loop = ags_devout_set_loop; soundcard->get_loop = ags_devout_get_loop; soundcard->get_loop_offset = ags_devout_get_loop_offset; soundcard->get_sub_block_count = ags_devout_get_sub_block_count; soundcard->trylock_sub_block = ags_devout_trylock_sub_block; soundcard->unlock_sub_block = ags_devout_unlock_sub_block; } void ags_devout_init(AgsDevout *devout) { AgsConfig *config; gchar *str; gchar *segmentation; guint i; guint denominator, numerator; gboolean use_alsa; devout->flags = 0; /* insert devout mutex */ g_rec_mutex_init(&(devout->obj_mutex)); /* uuid */ devout->uuid = ags_uuid_alloc(); ags_uuid_generate(devout->uuid); /* flags */ config = ags_config_get_instance(); #ifdef AGS_WITH_ALSA use_alsa = TRUE; #else use_alsa = FALSE; #endif str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "backend"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "backend"); } if(str != NULL && !g_ascii_strncasecmp(str, "oss", 4)){ use_alsa = FALSE; } if(use_alsa){ devout->flags |= (AGS_DEVOUT_ALSA); }else{ devout->flags |= (AGS_DEVOUT_OSS); } g_free(str); /* presets */ devout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); devout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); devout->samplerate = ags_soundcard_helper_config_get_samplerate(config); devout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); devout->format = ags_soundcard_helper_config_get_format(config); /* device */ if(use_alsa){ devout->out.alsa.handle = NULL; devout->out.alsa.device = AGS_DEVOUT_DEFAULT_ALSA_DEVICE; }else{ devout->out.oss.device_fd = -1; devout->out.oss.device = AGS_DEVOUT_DEFAULT_OSS_DEVICE; } /* buffer */ devout->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ devout->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(devout->buffer_mutex[i]); } devout->sub_block_count = AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT; devout->sub_block_mutex = (GRecMutex **) malloc(4 * devout->sub_block_count * devout->pcm_channels * sizeof(GRecMutex *)); for(i = 0; i < 4 * devout->sub_block_count * devout->pcm_channels; i++){ devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(devout->sub_block_mutex[i]); } devout->buffer = (void **) malloc(4 * sizeof(void *)); devout->buffer[0] = NULL; devout->buffer[1] = NULL; devout->buffer[2] = NULL; devout->buffer[3] = NULL; g_atomic_int_set(&(devout->available), TRUE); devout->ring_buffer_size = AGS_DEVOUT_DEFAULT_RING_BUFFER_SIZE; devout->nth_ring_buffer = 0; devout->ring_buffer = NULL; ags_devout_realloc_buffer(devout); /* bpm */ devout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ devout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); devout->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ devout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); devout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_devout_adjust_delay_and_attack(devout); /* counters */ devout->tact_counter = 0.0; devout->delay_counter = 0; devout->tic_counter = 0; devout->start_note_offset = 0; devout->note_offset = 0; devout->note_offset_absolute = 0; devout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; devout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; devout->do_loop = FALSE; devout->loop_offset = 0; devout->io_channel = NULL; devout->tag = NULL; } void ags_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(gobject); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_OSS & (devout->flags)) != 0){ devout->out.oss.device = g_strdup(device); }else if((AGS_DEVOUT_ALSA & (devout->flags)) != 0){ devout->out.alsa.device = g_strdup(device); } g_rec_mutex_unlock(devout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(devout_mutex); if(dsp_channels == devout->dsp_channels){ g_rec_mutex_unlock(devout_mutex); return; } devout->dsp_channels = dsp_channels; g_rec_mutex_unlock(devout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels, old_pcm_channels; guint i; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(devout_mutex); if(pcm_channels == devout->pcm_channels){ g_rec_mutex_unlock(devout_mutex); return; } old_pcm_channels = devout->pcm_channels; /* destroy if less pcm-channels */ for(i = 4 * devout->sub_block_count * pcm_channels; i < 4 * devout->sub_block_count * old_pcm_channels; i++){ g_rec_mutex_clear(devout->sub_block_mutex[i]); free(devout->sub_block_mutex[i]); } devout->sub_block_mutex = (GRecMutex **) realloc(devout->sub_block_mutex, 4 * devout->sub_block_count * pcm_channels * sizeof(GRecMutex *)); /* create if more pcm-channels */ for(i = 4 * devout->sub_block_count * old_pcm_channels; i < 4 * devout->sub_block_count * pcm_channels; i++){ devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(devout->sub_block_mutex[i]); } devout->pcm_channels = pcm_channels; g_rec_mutex_unlock(devout_mutex); ags_devout_realloc_buffer(devout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(devout_mutex); if(format == devout->format){ g_rec_mutex_unlock(devout_mutex); return; } devout->format = format; g_rec_mutex_unlock(devout_mutex); ags_devout_realloc_buffer(devout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(devout_mutex); if(buffer_size == devout->buffer_size){ g_rec_mutex_unlock(devout_mutex); return; } devout->buffer_size = buffer_size; g_rec_mutex_unlock(devout_mutex); ags_devout_realloc_buffer(devout); ags_devout_adjust_delay_and_attack(devout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(devout_mutex); if(samplerate == devout->samplerate){ g_rec_mutex_unlock(devout_mutex); return; } devout->samplerate = samplerate; g_rec_mutex_unlock(devout_mutex); ags_devout_adjust_delay_and_attack(devout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(devout_mutex); if(bpm == devout->bpm){ g_rec_mutex_unlock(devout_mutex); return; } devout->bpm = bpm; g_rec_mutex_unlock(devout_mutex); ags_devout_adjust_delay_and_attack(devout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(devout_mutex); if(delay_factor == devout->delay_factor){ g_rec_mutex_unlock(devout_mutex); return; } devout->delay_factor = delay_factor; g_rec_mutex_unlock(devout_mutex); ags_devout_adjust_delay_and_attack(devout); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(gobject); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_OSS & (devout->flags)) != 0){ g_value_set_string(value, devout->out.oss.device); }else if((AGS_DEVOUT_ALSA & (devout->flags)) != 0){ g_value_set_string(value, devout->out.alsa.device); } g_rec_mutex_unlock(devout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(devout_mutex); g_value_set_uint(value, devout->dsp_channels); g_rec_mutex_unlock(devout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(devout_mutex); g_value_set_uint(value, devout->pcm_channels); g_rec_mutex_unlock(devout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(devout_mutex); g_value_set_uint(value, devout->format); g_rec_mutex_unlock(devout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(devout_mutex); g_value_set_uint(value, devout->buffer_size); g_rec_mutex_unlock(devout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(devout_mutex); g_value_set_uint(value, devout->samplerate); g_rec_mutex_unlock(devout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(devout_mutex); g_value_set_pointer(value, devout->buffer); g_rec_mutex_unlock(devout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(devout_mutex); g_value_set_double(value, devout->bpm); g_rec_mutex_unlock(devout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(devout_mutex); g_value_set_double(value, devout->delay_factor); g_rec_mutex_unlock(devout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(devout_mutex); g_value_set_pointer(value, devout->attack); g_rec_mutex_unlock(devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_devout_dispose(GObject *gobject) { AgsDevout *devout; devout = AGS_DEVOUT(gobject); /* call parent */ G_OBJECT_CLASS(ags_devout_parent_class)->dispose(gobject); } void ags_devout_finalize(GObject *gobject) { AgsDevout *devout; devout = AGS_DEVOUT(gobject); ags_uuid_free(devout->uuid); /* free output buffer */ free(devout->buffer[0]); free(devout->buffer[1]); free(devout->buffer[2]); free(devout->buffer[3]); /* free buffer array */ free(devout->buffer); /* free AgsAttack */ free(devout->attack); /* call parent */ G_OBJECT_CLASS(ags_devout_parent_class)->finalize(gobject); } AgsUUID* ags_devout_get_uuid(AgsConnectable *connectable) { AgsDevout *devout; AgsUUID *ptr; GRecMutex *devout_mutex; devout = AGS_DEVOUT(connectable); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get UUID */ g_rec_mutex_lock(devout_mutex); ptr = devout->uuid; g_rec_mutex_unlock(devout_mutex); return(ptr); } gboolean ags_devout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_devout_is_ready(AgsConnectable *connectable) { AgsDevout *devout; gboolean is_ready; devout = AGS_DEVOUT(connectable); /* check is added */ is_ready = ags_devout_test_flags(devout, AGS_DEVOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_devout_add_to_registry(AgsConnectable *connectable) { AgsDevout *devout; if(ags_connectable_is_ready(connectable)){ return; } devout = AGS_DEVOUT(connectable); ags_devout_set_flags(devout, AGS_DEVOUT_ADDED_TO_REGISTRY); } void ags_devout_remove_from_registry(AgsConnectable *connectable) { AgsDevout *devout; if(!ags_connectable_is_ready(connectable)){ return; } devout = AGS_DEVOUT(connectable); ags_devout_unset_flags(devout, AGS_DEVOUT_ADDED_TO_REGISTRY); } xmlNode* ags_devout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_devout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_devout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_devout_is_connected(AgsConnectable *connectable) { AgsDevout *devout; gboolean is_connected; devout = AGS_DEVOUT(connectable); /* check is connected */ is_connected = ags_devout_test_flags(devout, AGS_DEVOUT_CONNECTED); return(is_connected); } void ags_devout_connect(AgsConnectable *connectable) { AgsDevout *devout; if(ags_connectable_is_connected(connectable)){ return; } devout = AGS_DEVOUT(connectable); ags_devout_set_flags(devout, AGS_DEVOUT_CONNECTED); } void ags_devout_disconnect(AgsConnectable *connectable) { AgsDevout *devout; if(!ags_connectable_is_connected(connectable)){ return; } devout = AGS_DEVOUT(connectable); ags_devout_unset_flags(devout, AGS_DEVOUT_CONNECTED); } /** * ags_devout_test_flags: * @devout: the #AgsDevout * @flags: the flags * * Test @flags to be set on @devout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_devout_test_flags(AgsDevout *devout, guint flags) { gboolean retval; GRecMutex *devout_mutex; if(!AGS_IS_DEVOUT(devout)){ return(FALSE); } /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* test */ g_rec_mutex_lock(devout_mutex); retval = (flags & (devout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(devout_mutex); return(retval); } /** * ags_devout_set_flags: * @devout: the #AgsDevout * @flags: see #AgsDevoutFlags-enum * * Enable a feature of @devout. * * Since: 3.0.0 */ void ags_devout_set_flags(AgsDevout *devout, guint flags) { GRecMutex *devout_mutex; if(!AGS_IS_DEVOUT(devout)){ return; } /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(devout_mutex); devout->flags |= flags; g_rec_mutex_unlock(devout_mutex); } /** * ags_devout_unset_flags: * @devout: the #AgsDevout * @flags: see #AgsDevoutFlags-enum * * Disable a feature of @devout. * * Since: 3.0.0 */ void ags_devout_unset_flags(AgsDevout *devout, guint flags) { GRecMutex *devout_mutex; if(!AGS_IS_DEVOUT(devout)){ return; } /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(devout_mutex); devout->flags &= (~flags); g_rec_mutex_unlock(devout_mutex); } void ags_devout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsDevout *devout; GList *card_id, *card_id_start, *card_name, *card_name_start; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* list cards */ card_id = NULL; card_name = NULL; ags_soundcard_list_cards(soundcard, &card_id, &card_name); card_id_start = card_id; card_name_start = card_name; /* check card */ g_rec_mutex_lock(devout_mutex); while(card_id != NULL){ if(!g_ascii_strncasecmp(card_id->data, device, strlen(card_id->data))){ if((AGS_DEVOUT_ALSA & (devout->flags)) != 0){ devout->out.alsa.device = g_strdup(device); }else if((AGS_DEVOUT_OSS & (devout->flags)) != 0){ devout->out.oss.device = g_strdup(device); } break; } card_id = card_id->next; } g_rec_mutex_unlock(devout_mutex); /* free card id and name */ g_list_free_full(card_id_start, g_free); g_list_free_full(card_name_start, g_free); } gchar* ags_devout_get_device(AgsSoundcard *soundcard) { AgsDevout *devout; gchar *device; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); device = NULL; g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_ALSA & (devout->flags)) != 0){ device = g_strdup(devout->out.alsa.device); }else if((AGS_DEVOUT_OSS & (devout->flags)) != 0){ device = g_strdup(devout->out.oss.device); } g_rec_mutex_unlock(devout_mutex); return(device); } void ags_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint samplerate, guint buffer_size, guint format) { AgsDevout *devout; devout = AGS_DEVOUT(soundcard); g_object_set(devout, "pcm-channels", channels, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); } void ags_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *samplerate, guint *buffer_size, guint *format) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get presets */ g_rec_mutex_lock(devout_mutex); if(channels != NULL){ *channels = devout->pcm_channels; } if(samplerate != NULL){ *samplerate = devout->samplerate; } if(buffer_size != NULL){ *buffer_size = devout->buffer_size; } if(format != NULL){ *format = devout->format; } g_rec_mutex_unlock(devout_mutex); } void ags_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_ALSA & (devout->flags)) != 0){ #ifdef AGS_WITH_ALSA snd_ctl_t *card_handle; snd_ctl_card_info_t *card_info; char *name; gchar *str; gchar *str_err; int card_num; int device; int error; /* the default device */ str = g_strdup("default"); error = snd_ctl_open(&card_handle, str, 0); if(error < 0){ g_free(str); goto ags_devout_list_cards_NO_DEFAULT_0; } snd_ctl_card_info_alloca(&card_info); error = snd_ctl_card_info(card_handle, card_info); if(error < 0){ g_free(str); goto ags_devout_list_cards_NO_DEFAULT_0; } if(card_id != NULL){ *card_id = g_list_prepend(*card_id, str); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(snd_ctl_card_info_get_name(card_info))); } snd_ctl_close(card_handle); ags_devout_list_cards_NO_DEFAULT_0: /* enumerated devices */ card_num = -1; while(TRUE){ char *iface; char **hints, **iter; error = snd_card_next(&card_num); if(card_num < 0 || error < 0){ str_err = snd_strerror(error); g_message("Can't get the next card number: %s", str_err); //free(str_err); break; } str = g_strdup_printf("hw:%d", card_num); #ifdef AGS_DEBUG g_message("found soundcard - %s", str); #endif error = snd_ctl_open(&card_handle, str, 0); if(error < 0){ g_free(str); continue; } snd_ctl_card_info_alloca(&card_info); error = snd_ctl_card_info(card_handle, card_info); if(error < 0){ snd_ctl_close(card_handle); g_free(str); continue; } device = -1; error = snd_ctl_pcm_next_device(card_handle, &device); if(error < 0){ snd_ctl_close(card_handle); g_free(str); continue; } iface = "pcm"; hints = NULL; error = snd_device_name_hint(card_num, iface, &hints); if(hints != NULL){ for(iter = hints; iter[0] != NULL; iter++){ if(card_id != NULL){ *card_id = g_list_prepend(*card_id, g_strdup(snd_device_name_get_hint(iter[0], "NAME"))); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(snd_ctl_card_info_get_name(card_info))); } } snd_device_name_free_hint(hints); } snd_ctl_close(card_handle); g_free(str); } snd_config_update_free_global(); #endif }else{ #ifdef AGS_WITH_OSS oss_sysinfo sysinfo; oss_audioinfo ai; char *mixer_device; int mixerfd = -1; int next, n; int i; if((mixer_device = getenv("OSS_MIXERDEV")) == NULL){ mixer_device = "/dev/mixer"; } if((mixerfd = open(mixer_device, O_RDONLY, 0)) == -1){ int e = errno; switch(e){ case ENXIO: case ENODEV: { g_warning("Open Sound System is not running in your system."); } break; case ENOENT: { g_warning("No %s device available in your system.\nPerhaps Open Sound System is not installed or running.", mixer_device); } break; default: g_warning("%s", strerror(e)); } } if(ioctl(mixerfd, SNDCTL_SYSINFO, &sysinfo) == -1){ if(errno == ENXIO){ g_warning("OSS has not detected any supported sound hardware in your system."); }else{ g_warning("SNDCTL_SYSINFO"); if(errno == EINVAL){ g_warning("Error: OSS version 4.0 or later is required"); } } n = 0; }else{ n = sysinfo.numaudios; } memset(&ai, 0, sizeof(oss_audioinfo)); ioctl(mixerfd, SNDCTL_AUDIOINFO_EX, &ai); for(i = 0; i < n; i++){ ai.dev = i; if(ioctl(mixerfd, SNDCTL_ENGINEINFO, &ai) == -1){ int e = errno; g_warning("Can't get device info for /dev/dsp%d (SNDCTL_AUDIOINFO)\nerrno = %d: %s", i, e, strerror(e)); continue; } if((DSP_CAP_OUTPUT & (ai.caps)) != 0){ if(card_id != NULL){ *card_id = g_list_prepend(*card_id, g_strdup_printf("/dev/dsp%i", i)); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(ai.name)); } } next = ai.next_play_engine; if(next <= 0){ break; } } #endif } g_rec_mutex_unlock(devout_mutex); if(card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_devout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { AgsDevout *devout; GRecMutex *devout_mutex; if(card_id == NULL){ return; } devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* pcm info */ g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_ALSA & (devout->flags)) != 0){ #ifdef AGS_WITH_ALSA snd_pcm_t *handle; snd_pcm_hw_params_t *params; gchar *str; unsigned int val; int dir; snd_pcm_uframes_t frames; int rc; int err; /* Open PCM device for playback. */ handle = NULL; rc = snd_pcm_open(&handle, card_id, SND_PCM_STREAM_PLAYBACK, 0); if(rc < 0){ str = snd_strerror(rc); g_message("unable to open pcm device (attempting fixup): %s", str); if(index(card_id, ',') != NULL){ gchar *device_fixup; device_fixup = g_strndup(card_id, index(card_id, ',') - card_id); handle = NULL; rc = snd_pcm_open(&handle, device_fixup, SND_PCM_STREAM_PLAYBACK, 0); if(rc < 0){ if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s\n", str); } // free(str); goto ags_devout_pcm_info_ERR; } }else{ if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s\n", str); } goto ags_devout_pcm_info_ERR; } } /* Allocate a hardware parameters object. */ snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */ snd_pcm_hw_params_any(handle, params); /* channels */ snd_pcm_hw_params_get_channels_min(params, &val); *channels_min = val; snd_pcm_hw_params_get_channels_max(params, &val); *channels_max = val; /* samplerate */ dir = 0; snd_pcm_hw_params_get_rate_min(params, &val, &dir); *rate_min = val; dir = 0; snd_pcm_hw_params_get_rate_max(params, &val, &dir); *rate_max = val; /* buffer size */ dir = 0; snd_pcm_hw_params_get_buffer_size_min(params, &frames); *buffer_size_min = frames; dir = 0; snd_pcm_hw_params_get_buffer_size_max(params, &frames); *buffer_size_max = frames; snd_pcm_close(handle); #endif }else{ #ifdef AGS_WITH_OSS oss_audioinfo ainfo; gchar *str; int mixerfd; int acc; unsigned int cmd; mixerfd = open(card_id, O_RDWR, 0); if(mixerfd == -1){ int e = errno; str = strerror(e); g_message("unable to open pcm device: %s\n", str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s\n", str); } goto ags_devout_pcm_info_ERR; } memset(&ainfo, 0, sizeof (ainfo)); cmd = SNDCTL_AUDIOINFO; if(card_id != NULL && !g_ascii_strncasecmp(card_id, "/dev/dsp", 8)){ if(strlen(card_id) > 8){ sscanf(card_id, "/dev/dsp%d", &(ainfo.dev)); }else{ ainfo.dev = 0; } }else{ goto ags_devout_pcm_info_ERR; } if(ioctl(mixerfd, cmd, &ainfo) == -1){ int e = errno; str = strerror(e); g_message("unable to retrieve audio info: %s\n", str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to retrieve audio info: %s\n", str); } return; } *channels_min = ainfo.min_channels; *channels_max = ainfo.max_channels; *rate_min = ainfo.min_rate; *rate_max = ainfo.max_rate; *buffer_size_min = 64; *buffer_size_max = 8192; #endif } ags_devout_pcm_info_ERR: g_rec_mutex_unlock(devout_mutex); } guint ags_devout_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_PLAYBACK); } gboolean ags_devout_is_available(AgsSoundcard *soundcard) { AgsDevout *devout; gboolean is_available; devout = AGS_DEVOUT(soundcard); /* check available */ is_available = g_atomic_int_get(&(devout->available)); return(is_available); } gboolean ags_devout_is_starting(AgsSoundcard *soundcard) { AgsDevout *devout; gboolean is_starting; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* check is starting */ g_rec_mutex_lock(devout_mutex); is_starting = ((AGS_DEVOUT_START_PLAY & (devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(devout_mutex); return(is_starting); } gboolean ags_devout_is_playing(AgsSoundcard *soundcard) { AgsDevout *devout; gboolean is_playing; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* check is starting */ g_rec_mutex_lock(devout_mutex); is_playing = ((AGS_DEVOUT_PLAY & (devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(devout_mutex); return(is_playing); } gchar* ags_devout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_devout_delegate_play_init(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; devout = AGS_DEVOUT(soundcard); if(ags_devout_test_flags(devout, AGS_DEVOUT_ALSA)){ ags_devout_alsa_init(soundcard, error); }else if(ags_devout_test_flags(devout, AGS_DEVOUT_OSS)){ ags_devout_oss_init(soundcard, error); } } void ags_devout_delegate_play(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; devout = AGS_DEVOUT(soundcard); if(ags_devout_test_flags(devout, AGS_DEVOUT_ALSA)){ ags_devout_alsa_play(soundcard, error); }else if(ags_devout_test_flags(devout, AGS_DEVOUT_OSS)){ ags_devout_oss_play(soundcard, error); } } void ags_devout_delegate_stop(AgsSoundcard *soundcard) { AgsDevout *devout; devout = AGS_DEVOUT(soundcard); if(ags_devout_test_flags(devout, AGS_DEVOUT_ALSA)){ ags_devout_alsa_free(soundcard); }else if(ags_devout_test_flags(devout, AGS_DEVOUT_OSS)){ ags_devout_oss_free(soundcard); } } void ags_devout_oss_init(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; GIOChannel *io_channel; guint tag; gchar *str; guint word_size; int format; int tmp; guint i; GRecMutex *devout_mutex; if(ags_soundcard_is_playing(soundcard)){ return; } devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* retrieve word size */ g_rec_mutex_lock(devout_mutex); switch(devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { #ifdef AGS_WITH_OSS format = AFMT_U8; #endif word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { #ifdef AGS_WITH_OSS format = AFMT_S16_NE; #endif word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { #ifdef AGS_WITH_OSS format = AFMT_S24_NE; #endif word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { #ifdef AGS_WITH_OSS format = AFMT_S32_NE; #endif word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } default: g_warning("ags_devout_oss_init(): unsupported word size"); return; } /* prepare for playback */ devout->flags |= (AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING); memset(devout->buffer[0], 0, devout->pcm_channels * devout->buffer_size * word_size); memset(devout->buffer[1], 0, devout->pcm_channels * devout->buffer_size * word_size); memset(devout->buffer[2], 0, devout->pcm_channels * devout->buffer_size * word_size); memset(devout->buffer[3], 0, devout->pcm_channels * devout->buffer_size * word_size); /* allocate ring buffer */ g_atomic_int_set(&(devout->available), FALSE); devout->ring_buffer = (unsigned char **) malloc(devout->ring_buffer_size * sizeof(unsigned char *)); for(i = 0; i < devout->ring_buffer_size; i++){ devout->ring_buffer[i] = (unsigned char *) malloc(devout->pcm_channels * devout->buffer_size * word_size * sizeof(unsigned char)); } #ifdef AGS_WITH_OSS /* open device fd */ str = devout->out.oss.device; devout->out.oss.device_fd = open(str, O_WRONLY, 0); if(devout->out.oss.device_fd == -1){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); g_warning("couldn't open device %s", devout->out.oss.device); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open dsp device: %s\n", str); } return; } //NOTE:JK: unsupported on kfreebsd 9.0 // tmp = APF_NORMAL; // ioctl(devout->out.oss.device_fd, SNDCTL_DSP_PROFILE, &tmp); tmp = format; if(ioctl(devout->out.oss.device_fd, SNDCTL_DSP_SETFMT, &tmp) == -1){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = strerror(errno); g_warning("failed to select bits/sample"); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, "unable to open dsp device: %s", str); } devout->out.oss.device_fd = -1; return; } if(tmp != format){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = strerror(errno); g_warning("failed to select bits/sample"); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, "unable to open dsp device: %s", str); } devout->out.oss.device_fd = -1; return; } tmp = devout->dsp_channels; if(ioctl(devout->out.oss.device_fd, SNDCTL_DSP_CHANNELS, &tmp) == -1){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = strerror(errno); g_warning("Channels count (%i) not available for playbacks: %s", devout->dsp_channels, str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_CHANNELS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.oss.device_fd = -1; return; } if(tmp != devout->dsp_channels){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = strerror(errno); g_warning("Channels count (%i) not available for playbacks: %s", devout->dsp_channels, str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_CHANNELS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.oss.device_fd = -1; return; } tmp = devout->samplerate; if(ioctl(devout->out.oss.device_fd, SNDCTL_DSP_SPEED, &tmp) == -1){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = strerror(errno); g_warning("Rate %iHz not available for playback: %s", devout->samplerate, str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_SAMPLERATE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.oss.device_fd = -1; return; } if(tmp != devout->samplerate){ g_warning("Warning: Playback using %d Hz (file %d Hz)", tmp, devout->samplerate); } io_channel = g_io_channel_unix_new(devout->out.oss.device_fd); tag = g_io_add_watch(io_channel, G_IO_OUT, (GIOFunc) ags_devout_oss_io_func, devout); devout->io_channel = g_list_prepend(devout->io_channel, io_channel); devout->tag = g_list_prepend(devout->tag, GUINT_TO_POINTER(tag)); #endif devout->tact_counter = 0.0; devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(devout))); devout->tic_counter = 0; devout->nth_ring_buffer = 0; #ifdef AGS_WITH_OSS devout->flags |= AGS_DEVOUT_INITIALIZED; #endif devout->flags |= AGS_DEVOUT_BUFFER0; devout->flags &= (~(AGS_DEVOUT_BUFFER1 | AGS_DEVOUT_BUFFER2 | AGS_DEVOUT_BUFFER3)); g_rec_mutex_unlock(devout_mutex); } void ags_devout_oss_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size) { int format_bits; guint word_size; int bps; int res; guint chn; guint count, i; switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(char); bps = 1; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(short); bps = 2; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(long); bps = 3; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(long); bps = 4; } break; default: g_warning("ags_devout_oss_play(): unsupported word size"); return; } /* fill the channel areas */ for(count = 0; count < buffer_size; count++){ for(chn = 0; chn < channels; chn++){ res = 0; switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { res = (int) ((gint8 *) buffer)[count * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { res = (int) ((gint16 *) buffer)[count * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { res = (int) ((gint32 *) buffer)[count * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { res = (int) ((gint32 *) buffer)[count * channels + chn]; } break; } /* Generate data in native endian format */ if(ags_endian_host_is_be()){ for(i = 0; i < bps; i++){ *(ring_buffer + chn * bps + word_size - 1 - i) = (res >> i * 8) & 0xff; } }else{ for(i = 0; i < bps; i++){ *(ring_buffer + chn * bps + i) = (res >> i * 8) & 0xff; } } } ring_buffer += channels * bps; } } gboolean ags_devout_oss_io_func(GIOChannel *source, GIOCondition condition, AgsDevout *devout) { g_atomic_int_set(&(devout->available), TRUE); return(TRUE); } void ags_devout_oss_play(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; GList *list; gchar *str; gint64 poll_timeout; guint word_size; guint nth_buffer; int n_write; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* lock */ g_rec_mutex_lock(devout_mutex); /* retrieve word size */ switch(devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } //NOTE:JK: not available break; default: g_warning("ags_devout_oss_play(): unsupported word size"); return; } /* do playback */ devout->flags &= (~AGS_DEVOUT_START_PLAY); if((AGS_DEVOUT_INITIALIZED & (devout->flags)) == 0){ g_rec_mutex_unlock(devout_mutex); return; } /* check buffer flag */ nth_buffer = 0; if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){ nth_buffer = 0; }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){ nth_buffer = 1; }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){ nth_buffer = 2; }else if((AGS_DEVOUT_BUFFER3 & (devout->flags)) != 0){ nth_buffer = 3; } #ifdef AGS_WITH_OSS /* fill ring buffer */ ags_devout_oss_play_fill_ring_buffer(devout->buffer[nth_buffer], devout->format, devout->ring_buffer[devout->nth_ring_buffer], devout->pcm_channels, devout->buffer_size); /* wait until available */ poll_timeout = g_get_monotonic_time() + (G_USEC_PER_SEC * (1.0 / (gdouble) devout->samplerate * (gdouble) devout->buffer_size)); g_rec_mutex_unlock(devout_mutex); //TODO:JK: implement me while(!ags_soundcard_is_available(AGS_SOUNDCARD(devout))){ g_usleep(1); if(g_get_monotonic_time() > poll_timeout){ break; } } g_atomic_int_set(&(devout->available), FALSE); g_rec_mutex_lock(devout_mutex); /* write ring buffer */ n_write = write(devout->out.oss.device_fd, devout->ring_buffer[devout->nth_ring_buffer], devout->pcm_channels * devout->buffer_size * word_size * sizeof (char)); if(n_write != devout->pcm_channels * devout->buffer_size * word_size * sizeof (char)){ g_critical("write() return doesn't match written bytes"); } #endif /* increment nth ring-buffer */ if(devout->nth_ring_buffer + 1 >= devout->ring_buffer_size){ devout->nth_ring_buffer = 0; }else{ devout->nth_ring_buffer += 1; } g_rec_mutex_unlock(devout_mutex); /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) devout); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) devout); task = g_list_append(task, clear_buffer); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) devout); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) devout); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_devout_oss_free(AgsSoundcard *soundcard) { AgsDevout *devout; guint i; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* */ g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_INITIALIZED & (devout->flags)) == 0){ g_rec_mutex_unlock(devout_mutex); return; } close(devout->out.oss.device_fd); devout->out.oss.device_fd = -1; /* free ring-buffer */ g_atomic_int_set(&(devout->available), TRUE); if(devout->ring_buffer != NULL){ for(i = 0; i < devout->ring_buffer_size; i++){ free(devout->ring_buffer[i]); } free(devout->ring_buffer); } devout->ring_buffer = NULL; /* reset flags */ devout->flags &= (~(AGS_DEVOUT_BUFFER0 | AGS_DEVOUT_BUFFER1 | AGS_DEVOUT_BUFFER2 | AGS_DEVOUT_BUFFER3 | AGS_DEVOUT_PLAY | AGS_DEVOUT_INITIALIZED)); devout->note_offset = devout->start_note_offset; devout->note_offset_absolute = devout->start_note_offset; g_rec_mutex_unlock(devout_mutex); } gboolean ags_devout_alsa_io_func(GIOChannel *source, GIOCondition condition, AgsDevout *devout) { g_atomic_int_set(&(devout->available), TRUE); return(TRUE); } void ags_devout_alsa_init(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; #ifdef AGS_WITH_ALSA snd_pcm_t *handle; snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams; gchar *str; int rc; unsigned int val; snd_pcm_uframes_t frames; unsigned int rate; unsigned int rrate; unsigned int channels; snd_pcm_uframes_t size; snd_pcm_sframes_t buffer_size; snd_pcm_sframes_t period_size; snd_pcm_format_t format; int period_event; int err, dir; #endif guint word_size; guint i, i_stop; GRecMutex *devout_mutex; static unsigned int period_time = 100000; static unsigned int buffer_time = 100000; if(ags_soundcard_is_playing(soundcard)){ return; } devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* retrieve word size */ g_rec_mutex_lock(devout_mutex); if(devout->out.alsa.device == NULL){ g_rec_mutex_unlock(devout_mutex); return; } #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S16; #endif switch(devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S8; #endif word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S16; #endif word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S24; #endif //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S32; #endif word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(devout_mutex); g_warning("ags_devout_alsa_init(): unsupported word size"); return; } /* prepare for playback */ devout->flags |= (AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING); memset(devout->buffer[0], 0, devout->pcm_channels * devout->buffer_size * word_size); memset(devout->buffer[1], 0, devout->pcm_channels * devout->buffer_size * word_size); memset(devout->buffer[2], 0, devout->pcm_channels * devout->buffer_size * word_size); memset(devout->buffer[3], 0, devout->pcm_channels * devout->buffer_size * word_size); /* allocate ring buffer */ #ifdef AGS_WITH_ALSA devout->ring_buffer = (unsigned char **) malloc(devout->ring_buffer_size * sizeof(unsigned char *)); for(i = 0; i < devout->ring_buffer_size; i++){ devout->ring_buffer[i] = (unsigned char *) malloc(devout->pcm_channels * devout->buffer_size * (snd_pcm_format_physical_width(format) / 8) * sizeof(unsigned char)); } /* */ period_event = 0; /* Open PCM device for playback. */ handle = NULL; if((err = snd_pcm_open(&handle, devout->out.alsa.device, SND_PCM_STREAM_PLAYBACK, 0)) < 0){ gchar *device_fixup; str = snd_strerror(err); g_warning("Playback open error (attempting fixup): %s", str); device_fixup = g_strdup_printf("%s,0", devout->out.alsa.device); handle = NULL; if((err = snd_pcm_open(&handle, device_fixup, SND_PCM_STREAM_PLAYBACK, 0)) < 0){ devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s", str); } return; } } snd_pcm_hw_params_alloca(&hwparams); snd_pcm_sw_params_alloca(&swparams); /* choose all parameters */ err = snd_pcm_hw_params_any(handle, hwparams); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Broken configuration for playback: no configurations available: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_BROKEN_CONFIGURATION, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } /* set hardware resampling * / err = snd_pcm_hw_params_set_rate_resample(handle, hwparams, 0); if (err < 0) { g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Resampling setup failed for playback: %s\n", str); // free(str); return; } */ /* set the interleaved read/write format */ err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Access type not available for playback: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_ACCESS_TYPE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } /* set the sample format */ err = snd_pcm_hw_params_set_format(handle, hwparams, format); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Sample format not available for playback: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } /* set the count of channels */ channels = devout->pcm_channels; err = snd_pcm_hw_params_set_channels(handle, hwparams, channels); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Channels count (%i) not available for playbacks: %s", channels, str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_CHANNELS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } /* set the stream rate */ rate = devout->samplerate; rrate = rate; err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &rrate, 0); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Rate %iHz not available for playback: %s", rate, str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_SAMPLERATE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } if (rrate != rate) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); g_warning("Rate doesn't match (requested %iHz, get %iHz)", rate, err); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_SAMPLERATE_NOT_AVAILABLE, "unable to open pcm device"); } devout->out.alsa.handle = NULL; return; } /* set the buffer size */ size = 2 * devout->buffer_size; err = snd_pcm_hw_params_set_buffer_size(handle, hwparams, size); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to set buffer size %lu for playback: %s", size, str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_BUFFER_SIZE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } /* set the period size * / period_size = devout->buffer_size; err = snd_pcm_hw_params_set_period_size_near(handle, hwparams, period_size, dir); if (err < 0) { g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to get period size for playback: %s\n", str); // free(str); return; } */ /* write the parameters to device */ err = snd_pcm_hw_params(handle, hwparams); if (err < 0) { devout->flags &= (~(AGS_DEVOUT_START_PLAY | AGS_DEVOUT_PLAY | AGS_DEVOUT_NONBLOCKING)); g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to set hw params for playback: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVOUT_ERROR, AGS_DEVOUT_ERROR_HW_PARAMETERS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devout->out.alsa.handle = NULL; // free(str); return; } /* get the current swparams * / err = snd_pcm_sw_params_current(handle, swparams); if (err < 0) { g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to determine current swparams for playback: %s\n", str); // free(str); return; } */ /* start the transfer when the buffer is almost full: */ /* (buffer_size / avail_min) * avail_min * / err = snd_pcm_sw_params_set_start_threshold(handle, swparams, (buffer_size / period_size) * period_size); if (err < 0) { g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to set start threshold mode for playback: %s\n", str); // free(str); return; } */ /* allow the transfer when at least period_size samples can be processed */ /* or disable this mechanism when period event is enabled (aka interrupt like style processing) * / err = snd_pcm_sw_params_set_avail_min(handle, swparams, period_event ? buffer_size : period_size); if (err < 0) { g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to set avail min for playback: %s\n", str); // free(str); return; } /* write the parameters to the playback device * / err = snd_pcm_sw_params(handle, swparams); if (err < 0) { g_rec_mutex_unlock(devout_mutex); str = snd_strerror(err); g_warning("Unable to set sw params for playback: %s\n", str); // free(str); return; } */ /* */ devout->out.alsa.handle = handle; i_stop = snd_pcm_poll_descriptors_count(devout->out.alsa.handle); if(i_stop > 0){ struct pollfd *fds; fds = (struct pollfd *) malloc(i_stop * sizeof(struct pollfd)); snd_pcm_poll_descriptors(devout->out.alsa.handle, fds, i_stop); for(i = 0; i < i_stop; i++){ GIOChannel *io_channel; guint tag; io_channel = g_io_channel_unix_new(fds[i].fd); tag = g_io_add_watch(io_channel, G_IO_OUT, (GIOFunc) ags_devout_alsa_io_func, devout); devout->io_channel = g_list_prepend(devout->io_channel, io_channel); devout->tag = g_list_prepend(devout->tag, GUINT_TO_POINTER(tag)); } } #endif devout->tact_counter = 0.0; devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(devout))); devout->tic_counter = 0; devout->nth_ring_buffer = 0; #ifdef AGS_WITH_ALSA devout->flags |= AGS_DEVOUT_INITIALIZED; #endif devout->flags |= AGS_DEVOUT_BUFFER0; devout->flags &= (~(AGS_DEVOUT_BUFFER1 | AGS_DEVOUT_BUFFER2 | AGS_DEVOUT_BUFFER3)); g_rec_mutex_unlock(devout_mutex); } void ags_devout_alsa_play_fill_ring_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size) { #ifdef AGS_WITH_ALSA snd_pcm_format_t format; int format_bits; unsigned int max_val; int bps; /* bytes per sample */ int phys_bps; int big_endian; int to_unsigned; int res[8]; gint count; guint i, chn; format = SND_PCM_FORMAT_S16; switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { format = SND_PCM_FORMAT_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { format = SND_PCM_FORMAT_S16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { format = SND_PCM_FORMAT_S24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { format = SND_PCM_FORMAT_S32; } break; default: g_warning("ags_devout_alsa_play(): unsupported word size"); return; } count = buffer_size; format_bits = snd_pcm_format_width(format); max_val = (1 << (format_bits - 1)) - 1; bps = format_bits / 8; phys_bps = snd_pcm_format_physical_width(format) / 8; big_endian = snd_pcm_format_big_endian(format) == 1; to_unsigned = snd_pcm_format_unsigned(format) == 1; /* fill the channel areas */ for(count = 0; count < buffer_size - (buffer_size % 8);){ for(chn = 0; chn < channels; chn++){ switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { res[0] = (int) ((gint8 *) buffer)[count * channels + chn]; res[1] = (int) ((gint8 *) buffer)[(count + 1) * channels + chn]; res[2] = (int) ((gint8 *) buffer)[(count + 2) * channels + chn]; res[3] = (int) ((gint8 *) buffer)[(count + 3) * channels + chn]; res[4] = (int) ((gint8 *) buffer)[(count + 4) * channels + chn]; res[5] = (int) ((gint8 *) buffer)[(count + 5) * channels + chn]; res[6] = (int) ((gint8 *) buffer)[(count + 6) * channels + chn]; res[7] = (int) ((gint8 *) buffer)[(count + 7) * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { res[0] = (int) ((gint16 *) buffer)[count * channels + chn]; res[1] = (int) ((gint16 *) buffer)[(count + 1) * channels + chn]; res[2] = (int) ((gint16 *) buffer)[(count + 2) * channels + chn]; res[3] = (int) ((gint16 *) buffer)[(count + 3) * channels + chn]; res[4] = (int) ((gint16 *) buffer)[(count + 4) * channels + chn]; res[5] = (int) ((gint16 *) buffer)[(count + 5) * channels + chn]; res[6] = (int) ((gint16 *) buffer)[(count + 6) * channels + chn]; res[7] = (int) ((gint16 *) buffer)[(count + 7) * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { res[0] = (int) ((gint32 *) buffer)[count * channels + chn]; res[1] = (int) ((gint32 *) buffer)[(count + 1) * channels + chn]; res[2] = (int) ((gint32 *) buffer)[(count + 2) * channels + chn]; res[3] = (int) ((gint32 *) buffer)[(count + 3) * channels + chn]; res[4] = (int) ((gint32 *) buffer)[(count + 4) * channels + chn]; res[5] = (int) ((gint32 *) buffer)[(count + 5) * channels + chn]; res[6] = (int) ((gint32 *) buffer)[(count + 6) * channels + chn]; res[7] = (int) ((gint32 *) buffer)[(count + 7) * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { res[0] = (int) ((gint32 *) buffer)[count * channels + chn]; res[1] = (int) ((gint32 *) buffer)[(count + 1) * channels + chn]; res[2] = (int) ((gint32 *) buffer)[(count + 2) * channels + chn]; res[3] = (int) ((gint32 *) buffer)[(count + 3) * channels + chn]; res[4] = (int) ((gint32 *) buffer)[(count + 4) * channels + chn]; res[5] = (int) ((gint32 *) buffer)[(count + 5) * channels + chn]; res[6] = (int) ((gint32 *) buffer)[(count + 6) * channels + chn]; res[7] = (int) ((gint32 *) buffer)[(count + 7) * channels + chn]; } break; default: res[0] = 0; res[1] = 0; res[2] = 0; res[3] = 0; res[4] = 0; res[5] = 0; res[6] = 0; res[7] = 0; } if(to_unsigned){ res[0] ^= 1U << (format_bits - 1); res[1] ^= 1U << (format_bits - 1); res[2] ^= 1U << (format_bits - 1); res[3] ^= 1U << (format_bits - 1); res[4] ^= 1U << (format_bits - 1); res[5] ^= 1U << (format_bits - 1); res[6] ^= 1U << (format_bits - 1); res[7] ^= 1U << (format_bits - 1); } /* Generate data in native endian format */ if(big_endian){ for(i = 0; i < bps; i++){ *(ring_buffer + chn * bps + phys_bps - 1 - i) = (res[0] >> i * 8) & 0xff; *(ring_buffer + channels * bps + chn * bps + phys_bps - 1 - i) = (res[1] >> i * 8) & 0xff; *(ring_buffer + 2 * channels * bps + chn * bps + phys_bps - 1 - i) = (res[2] >> i * 8) & 0xff; *(ring_buffer + 3 * channels * bps + chn * bps + phys_bps - 1 - i) = (res[3] >> i * 8) & 0xff; *(ring_buffer + 4 * channels * bps + chn * bps + phys_bps - 1 - i) = (res[4] >> i * 8) & 0xff; *(ring_buffer + 5 * channels * bps + chn * bps + phys_bps - 1 - i) = (res[5] >> i * 8) & 0xff; *(ring_buffer + 6 * channels * bps + chn * bps + phys_bps - 1 - i) = (res[6] >> i * 8) & 0xff; *(ring_buffer + 7 * channels * bps + chn * bps + phys_bps - 1 - i) = (res[7] >> i * 8) & 0xff; } }else{ for(i = 0; i < bps; i++){ *(ring_buffer + chn * bps + i) = (res[0] >> i * 8) & 0xff; *(ring_buffer + channels * bps + chn * bps + i) = (res[1] >> i * 8) & 0xff; *(ring_buffer + 2 * channels * bps + chn * bps + i) = (res[2] >> i * 8) & 0xff; *(ring_buffer + 3 * channels * bps + chn * bps + i) = (res[3] >> i * 8) & 0xff; *(ring_buffer + 4 * channels * bps + chn * bps + i) = (res[4] >> i * 8) & 0xff; *(ring_buffer + 5 * channels * bps + chn * bps + i) = (res[5] >> i * 8) & 0xff; *(ring_buffer + 6 * channels * bps + chn * bps + i) = (res[6] >> i * 8) & 0xff; *(ring_buffer + 7 * channels * bps + chn * bps + i) = (res[7] >> i * 8) & 0xff; } } } ring_buffer += 8 * channels * bps; count += 8; } for(; count < buffer_size; count++){ for(chn = 0; chn < channels; chn++){ switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { res[0] = (int) ((gint8 *) buffer)[count * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { res[0] = (int) ((gint16 *) buffer)[count * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { res[0] = (int) ((gint32 *) buffer)[count * channels + chn]; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { res[0] = (int) ((gint32 *) buffer)[count * channels + chn]; } break; default: res[0] = 0; } if(to_unsigned){ res[0] ^= 1U << (format_bits - 1); } /* Generate data in native endian format */ if(big_endian){ for(i = 0; i < bps; i++){ *(ring_buffer + chn * bps + phys_bps - 1 - i) = (res[0] >> i * 8) & 0xff; } }else{ for(i = 0; i < bps; i++){ *(ring_buffer + chn * bps + i) = (res[0] >> i * 8) & 0xff; } } } ring_buffer += channels * bps; } #endif } void ags_devout_alsa_play(AgsSoundcard *soundcard, GError **error) { AgsDevout *devout; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; GList *list; gchar *str; gint64 poll_timeout; guint word_size; guint nth_buffer; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* lock */ g_rec_mutex_lock(devout_mutex); /* retrieve word size */ switch(devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(devout_mutex); g_warning("ags_devout_alsa_play(): unsupported word size"); return; } /* do playback */ devout->flags &= (~AGS_DEVOUT_START_PLAY); if((AGS_DEVOUT_INITIALIZED & (devout->flags)) == 0){ g_rec_mutex_unlock(devout_mutex); return; } // g_message("play - 0x%0x", ((AGS_DEVOUT_BUFFER0 | // AGS_DEVOUT_BUFFER1 | // AGS_DEVOUT_BUFFER2 | // AGS_DEVOUT_BUFFER3) & (devout->flags))); /* check buffer flag */ nth_buffer = 0; if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){ nth_buffer = 0; }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){ nth_buffer = 1; }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){ nth_buffer = 2; }else if((AGS_DEVOUT_BUFFER3 & (devout->flags)) != 0){ nth_buffer = 3; } #ifdef AGS_WITH_ALSA /* fill ring buffer */ ags_devout_alsa_play_fill_ring_buffer(devout->buffer[nth_buffer], devout->format, devout->ring_buffer[devout->nth_ring_buffer], devout->pcm_channels, devout->buffer_size); /* wait until available */ poll_timeout = g_get_monotonic_time() + (G_USEC_PER_SEC * (1.0 / (gdouble) devout->samplerate * (gdouble) devout->buffer_size)); g_rec_mutex_unlock(devout_mutex); //TODO:JK: implement me while(!ags_soundcard_is_available(AGS_SOUNDCARD(devout))){ g_usleep(1); if(g_get_monotonic_time() > poll_timeout){ break; } } g_atomic_int_set(&(devout->available), FALSE); g_rec_mutex_lock(devout_mutex); /* write ring buffer */ devout->out.alsa.rc = snd_pcm_writei(devout->out.alsa.handle, devout->ring_buffer[devout->nth_ring_buffer], (snd_pcm_uframes_t) (devout->buffer_size)); /* check error flag */ if((AGS_DEVOUT_NONBLOCKING & (devout->flags)) == 0){ if(devout->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devout->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred"); #endif }else if(devout->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devout->out.alsa.handle)) < 0){ // == -EAGAIN nanosleep(&idle, NULL); /* wait until the suspend flag is released */ } if(err < 0){ err = snd_pcm_prepare(devout->out.alsa.handle); } }else if(devout->out.alsa.rc < 0){ str = snd_strerror(devout->out.alsa.rc); g_message("error from writei: %s", str); }else if(devout->out.alsa.rc != (int) devout->buffer_size) { g_message("short write, write %d frames", devout->out.alsa.rc); } } #endif /* increment nth ring-buffer */ if(devout->nth_ring_buffer + 1 >= devout->ring_buffer_size){ devout->nth_ring_buffer = 0; }else{ devout->nth_ring_buffer += 1; } g_rec_mutex_unlock(devout_mutex); /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) devout); task = g_list_prepend(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) devout); task = g_list_prepend(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) devout); task = g_list_prepend(task, switch_buffer_flag); /* append tasks */ task = g_list_reverse(task); ags_task_launcher_add_task_all(task_launcher, task); g_list_free_full(task, g_object_unref); #ifdef AGS_WITH_ALSA snd_pcm_prepare(devout->out.alsa.handle); #endif /* unref */ g_object_unref(task_launcher); } void ags_devout_alsa_free(AgsSoundcard *soundcard) { AgsDevout *devout; GList *start_list, *list; guint i; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* lock */ g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_INITIALIZED & (devout->flags)) == 0){ g_rec_mutex_unlock(devout_mutex); return; } g_rec_mutex_unlock(devout_mutex); #ifdef AGS_WITH_ALSA // snd_pcm_drain(devout->out.alsa.handle); snd_pcm_close(devout->out.alsa.handle); devout->out.alsa.handle = NULL; #endif /* free ring-buffer */ g_rec_mutex_lock(devout_mutex); if(devout->ring_buffer != NULL){ for(i = 0; i < devout->ring_buffer_size; i++){ free(devout->ring_buffer[i]); } free(devout->ring_buffer); } devout->ring_buffer = NULL; /* reset flags */ devout->flags &= (~(AGS_DEVOUT_BUFFER0 | AGS_DEVOUT_BUFFER1 | AGS_DEVOUT_BUFFER2 | AGS_DEVOUT_BUFFER3 | AGS_DEVOUT_PLAY | AGS_DEVOUT_INITIALIZED)); g_rec_mutex_unlock(devout_mutex); g_rec_mutex_lock(devout_mutex); devout->note_offset = devout->start_note_offset; devout->note_offset_absolute = devout->start_note_offset; list = devout->tag; while(list != NULL){ g_source_remove(GPOINTER_TO_UINT(list->data)); list = list->next; } g_list_free(devout->tag); devout->tag = NULL; g_list_free_full(devout->io_channel, g_io_channel_unref); devout->io_channel = NULL; g_atomic_int_set(&(devout->available), TRUE); g_rec_mutex_unlock(devout_mutex); } void ags_devout_tic(AgsSoundcard *soundcard) { AgsDevout *devout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* determine if attack should be switched */ g_rec_mutex_lock(devout_mutex); delay = devout->delay[devout->tic_counter]; delay_counter = devout->delay_counter; note_offset = devout->note_offset; note_offset_absolute = devout->note_offset_absolute; loop_left = devout->loop_left; loop_right = devout->loop_right; do_loop = devout->do_loop; g_rec_mutex_unlock(devout_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(devout_mutex); devout->delay_counter = delay_counter + 1.0 - delay; devout->tact_counter += 1.0; g_rec_mutex_unlock(devout_mutex); }else{ g_rec_mutex_lock(devout_mutex); devout->delay_counter += 1.0; g_rec_mutex_unlock(devout_mutex); } } void ags_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* offset changed */ g_rec_mutex_lock(devout_mutex); devout->tic_counter += 1; if(devout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ devout->tic_counter = 0; } g_rec_mutex_unlock(devout_mutex); } void ags_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set bpm */ g_rec_mutex_lock(devout_mutex); devout->bpm = bpm; g_rec_mutex_unlock(devout_mutex); ags_devout_adjust_delay_and_attack(devout); } gdouble ags_devout_get_bpm(AgsSoundcard *soundcard) { AgsDevout *devout; gdouble bpm; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get bpm */ g_rec_mutex_lock(devout_mutex); bpm = devout->bpm; g_rec_mutex_unlock(devout_mutex); return(bpm); } void ags_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set delay factor */ g_rec_mutex_lock(devout_mutex); devout->delay_factor = delay_factor; g_rec_mutex_unlock(devout_mutex); ags_devout_adjust_delay_and_attack(devout); } gdouble ags_devout_get_delay_factor(AgsSoundcard *soundcard) { AgsDevout *devout; gdouble delay_factor; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get delay factor */ g_rec_mutex_lock(devout_mutex); delay_factor = devout->delay_factor; g_rec_mutex_unlock(devout_mutex); return(delay_factor); } gdouble ags_devout_get_delay(AgsSoundcard *soundcard) { AgsDevout *devout; guint delay_index; gdouble delay; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get delay */ g_rec_mutex_lock(devout_mutex); delay_index = devout->tic_counter; delay = devout->delay[delay_index]; g_rec_mutex_unlock(devout_mutex); return(delay); } gdouble ags_devout_get_absolute_delay(AgsSoundcard *soundcard) { AgsDevout *devout; gdouble absolute_delay; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get absolute delay */ g_rec_mutex_lock(devout_mutex); absolute_delay = (60.0 * (((gdouble) devout->samplerate / (gdouble) devout->buffer_size) / (gdouble) devout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) devout->delay_factor))); g_rec_mutex_unlock(devout_mutex); return(absolute_delay); } guint ags_devout_get_attack(AgsSoundcard *soundcard) { AgsDevout *devout; guint attack_index; guint attack; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get attack */ g_rec_mutex_lock(devout_mutex); attack_index = devout->tic_counter; attack = devout->attack[attack_index]; g_rec_mutex_unlock(devout_mutex); return(attack); } void* ags_devout_get_buffer(AgsSoundcard *soundcard) { AgsDevout *devout; void *buffer; devout = AGS_DEVOUT(soundcard); if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER0)){ buffer = devout->buffer[0]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER1)){ buffer = devout->buffer[1]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER2)){ buffer = devout->buffer[2]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER3)){ buffer = devout->buffer[3]; }else{ buffer = NULL; } return(buffer); } void* ags_devout_get_next_buffer(AgsSoundcard *soundcard) { AgsDevout *devout; void *buffer; devout = AGS_DEVOUT(soundcard); // g_message("next - 0x%0x", ((AGS_DEVOUT_BUFFER0 | // AGS_DEVOUT_BUFFER1 | // AGS_DEVOUT_BUFFER2 | // AGS_DEVOUT_BUFFER3) & (devout->flags))); if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER0)){ buffer = devout->buffer[1]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER1)){ buffer = devout->buffer[2]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER2)){ buffer = devout->buffer[3]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER3)){ buffer = devout->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_devout_get_prev_buffer(AgsSoundcard *soundcard) { AgsDevout *devout; void *buffer; devout = AGS_DEVOUT(soundcard); if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER0)){ buffer = devout->buffer[3]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER1)){ buffer = devout->buffer[0]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER2)){ buffer = devout->buffer[1]; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER3)){ buffer = devout->buffer[2]; }else{ buffer = NULL; } return(buffer); } void ags_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsDevout *devout; GRecMutex *buffer_mutex; devout = AGS_DEVOUT(soundcard); buffer_mutex = NULL; if(devout->buffer != NULL){ if(buffer == devout->buffer[0]){ buffer_mutex = devout->buffer_mutex[0]; }else if(buffer == devout->buffer[1]){ buffer_mutex = devout->buffer_mutex[1]; }else if(buffer == devout->buffer[2]){ buffer_mutex = devout->buffer_mutex[2]; }else if(buffer == devout->buffer[3]){ buffer_mutex = devout->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsDevout *devout; GRecMutex *buffer_mutex; devout = AGS_DEVOUT(soundcard); buffer_mutex = NULL; if(devout->buffer != NULL){ if(buffer == devout->buffer[0]){ buffer_mutex = devout->buffer_mutex[0]; }else if(buffer == devout->buffer[1]){ buffer_mutex = devout->buffer_mutex[1]; }else if(buffer == devout->buffer[2]){ buffer_mutex = devout->buffer_mutex[2]; }else if(buffer == devout->buffer[3]){ buffer_mutex = devout->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_devout_get_delay_counter(AgsSoundcard *soundcard) { AgsDevout *devout; guint delay_counter; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* delay counter */ g_rec_mutex_lock(devout_mutex); delay_counter = devout->delay_counter; g_rec_mutex_unlock(devout_mutex); return(delay_counter); } void ags_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set note offset */ g_rec_mutex_lock(devout_mutex); devout->start_note_offset = start_note_offset; g_rec_mutex_unlock(devout_mutex); } guint ags_devout_get_start_note_offset(AgsSoundcard *soundcard) { AgsDevout *devout; guint start_note_offset; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set note offset */ g_rec_mutex_lock(devout_mutex); start_note_offset = devout->start_note_offset; g_rec_mutex_unlock(devout_mutex); return(start_note_offset); } void ags_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set note offset */ g_rec_mutex_lock(devout_mutex); devout->note_offset = note_offset; g_rec_mutex_unlock(devout_mutex); } guint ags_devout_get_note_offset(AgsSoundcard *soundcard) { AgsDevout *devout; guint note_offset; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set note offset */ g_rec_mutex_lock(devout_mutex); note_offset = devout->note_offset; g_rec_mutex_unlock(devout_mutex); return(note_offset); } void ags_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set note offset */ g_rec_mutex_lock(devout_mutex); devout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(devout_mutex); } guint ags_devout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsDevout *devout; guint note_offset_absolute; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set note offset */ g_rec_mutex_lock(devout_mutex); note_offset_absolute = devout->note_offset_absolute; g_rec_mutex_unlock(devout_mutex); return(note_offset_absolute); } void ags_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* set loop */ g_rec_mutex_lock(devout_mutex); devout->loop_left = loop_left; devout->loop_right = loop_right; devout->do_loop = do_loop; if(do_loop){ devout->loop_offset = devout->note_offset; } g_rec_mutex_unlock(devout_mutex); } void ags_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsDevout *devout; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get loop */ g_rec_mutex_lock(devout_mutex); if(loop_left != NULL){ *loop_left = devout->loop_left; } if(loop_right != NULL){ *loop_right = devout->loop_right; } if(do_loop != NULL){ *do_loop = devout->do_loop; } g_rec_mutex_unlock(devout_mutex); } guint ags_devout_get_loop_offset(AgsSoundcard *soundcard) { AgsDevout *devout; guint loop_offset; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get loop offset */ g_rec_mutex_lock(devout_mutex); loop_offset = devout->loop_offset; g_rec_mutex_unlock(devout_mutex); return(loop_offset); } guint ags_devout_get_sub_block_count(AgsSoundcard *soundcard) { AgsDevout *devout; guint sub_block_count; GRecMutex *devout_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get loop offset */ g_rec_mutex_lock(devout_mutex); sub_block_count = devout->sub_block_count; g_rec_mutex_unlock(devout_mutex); return(sub_block_count); } gboolean ags_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsDevout *devout; guint pcm_channels; guint sub_block_count; gboolean success; GRecMutex *devout_mutex; GRecMutex *sub_block_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get loop offset */ g_rec_mutex_lock(devout_mutex); pcm_channels = devout->pcm_channels; sub_block_count = devout->sub_block_count; g_rec_mutex_unlock(devout_mutex); sub_block_mutex = NULL; success = FALSE; if(devout->buffer != NULL){ if(buffer == devout->buffer[0]){ sub_block_mutex = devout->sub_block_mutex[sub_block]; }else if(buffer == devout->buffer[1]){ sub_block_mutex = devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == devout->buffer[2]){ sub_block_mutex = devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == devout->buffer[3]){ sub_block_mutex = devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ if(g_rec_mutex_trylock(sub_block_mutex) == 0){ success = TRUE; } } return(success); } void ags_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsDevout *devout; guint pcm_channels; guint sub_block_count; GRecMutex *devout_mutex; GRecMutex *sub_block_mutex; devout = AGS_DEVOUT(soundcard); /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get loop offset */ g_rec_mutex_lock(devout_mutex); pcm_channels = devout->pcm_channels; sub_block_count = devout->sub_block_count; g_rec_mutex_unlock(devout_mutex); sub_block_mutex = NULL; if(devout->buffer != NULL){ if(buffer == devout->buffer[0]){ sub_block_mutex = devout->sub_block_mutex[sub_block]; }else if(buffer == devout->buffer[1]){ sub_block_mutex = devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == devout->buffer[2]){ sub_block_mutex = devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == devout->buffer[3]){ sub_block_mutex = devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ g_rec_mutex_unlock(sub_block_mutex); } } /** * ags_devout_switch_buffer_flag: * @devout: the #AgsDevout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_devout_switch_buffer_flag(AgsDevout *devout) { GRecMutex *devout_mutex; if(!AGS_IS_DEVOUT(devout)){ return; } /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* switch buffer flag */ g_rec_mutex_lock(devout_mutex); if((AGS_DEVOUT_BUFFER0 & (devout->flags)) != 0){ devout->flags &= (~AGS_DEVOUT_BUFFER0); devout->flags |= AGS_DEVOUT_BUFFER1; }else if((AGS_DEVOUT_BUFFER1 & (devout->flags)) != 0){ devout->flags &= (~AGS_DEVOUT_BUFFER1); devout->flags |= AGS_DEVOUT_BUFFER2; }else if((AGS_DEVOUT_BUFFER2 & (devout->flags)) != 0){ devout->flags &= (~AGS_DEVOUT_BUFFER2); devout->flags |= AGS_DEVOUT_BUFFER3; }else if((AGS_DEVOUT_BUFFER3 & (devout->flags)) != 0){ devout->flags &= (~AGS_DEVOUT_BUFFER3); devout->flags |= AGS_DEVOUT_BUFFER0; } g_rec_mutex_unlock(devout_mutex); } /** * ags_devout_adjust_delay_and_attack: * @devout: the #AgsDevout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_devout_adjust_delay_and_attack(AgsDevout *devout) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *devout_mutex; if(!AGS_IS_DEVOUT(devout)){ return; } /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get some initial values */ delay = ags_devout_get_absolute_delay(AGS_SOUNDCARD(devout)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(devout_mutex); default_tact_frames = (guint) (delay * devout->buffer_size); delay_tact_frames = (guint) (floor(delay) * devout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; devout->attack[0] = (guint) floor(0.25 * devout->buffer_size); next_attack = (((devout->attack[i] + default_tact_frames) / devout->buffer_size) - delay) * devout->buffer_size; if(next_attack >= devout->buffer_size){ next_attack = devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ devout->attack[i] = devout->attack[i] - ((gdouble) next_attack / 2.0); if(devout->attack[i] < 0){ devout->attack[i] = 0; } if(devout->attack[i] >= devout->buffer_size){ devout->attack[i] = devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= devout->buffer_size){ next_attack = devout->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ devout->attack[i] = next_attack; next_attack = (((devout->attack[i] + default_tact_frames) / devout->buffer_size) - delay) * devout->buffer_size; if(next_attack >= devout->buffer_size){ next_attack = devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ devout->attack[i] = devout->attack[i] - ((gdouble) next_attack / 2.0); if(devout->attack[i] < 0){ devout->attack[i] = 0; } if(devout->attack[i] >= devout->buffer_size){ devout->attack[i] = devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= devout->buffer_size){ next_attack = devout->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", devout->attack[i]); #endif } devout->attack[0] = devout->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ devout->delay[i] = ((gdouble) (default_tact_frames + devout->attack[i] - devout->attack[i + 1])) / (gdouble) devout->buffer_size; #ifdef AGS_DEBUG g_message("%f", devout->delay[i]); #endif } devout->delay[i] = ((gdouble) (default_tact_frames + devout->attack[i] - devout->attack[0])) / (gdouble) devout->buffer_size; g_rec_mutex_unlock(devout_mutex); } /** * ags_devout_realloc_buffer: * @devout: the #AgsDevout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_devout_realloc_buffer(AgsDevout *devout) { guint pcm_channels; guint buffer_size; guint word_size; GRecMutex *devout_mutex; if(!AGS_IS_DEVOUT(devout)){ return; } /* get devout mutex */ devout_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(devout); /* get word size */ g_rec_mutex_lock(devout_mutex); pcm_channels = devout->pcm_channels; buffer_size = devout->buffer_size; switch(devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_warning("ags_devout_realloc_buffer(): unsupported word size"); return; } g_rec_mutex_unlock(devout_mutex); //NOTE:JK: there is no lock applicable to buffer /* AGS_DEVOUT_BUFFER_0 */ if(devout->buffer[0] != NULL){ free(devout->buffer[0]); } devout->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_DEVOUT_BUFFER_1 */ if(devout->buffer[1] != NULL){ free(devout->buffer[1]); } devout->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_DEVOUT_BUFFER_2 */ if(devout->buffer[2] != NULL){ free(devout->buffer[2]); } devout->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_DEVOUT_BUFFER_3 */ if(devout->buffer[3] != NULL){ free(devout->buffer[3]); } devout->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_devout_new: * * Creates a new instance of #AgsDevout. * * Returns: the new #AgsDevout * * Since: 3.0.0 */ AgsDevout* ags_devout_new() { AgsDevout *devout; devout = (AgsDevout *) g_object_new(AGS_TYPE_DEVOUT, NULL); return(devout); } gsequencer-3.1.3/ags/audio/ags_audio_signal.c0000644000175000017500000025612513616617253016134 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_audio_signal_class_init(AgsAudioSignalClass *audio_signal_class); void ags_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_signal_init(AgsAudioSignal *audio_signal); void ags_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_signal_dispose(GObject *gobject); void ags_audio_signal_finalize(GObject *gobject); AgsUUID* ags_audio_signal_get_uuid(AgsConnectable *connectable); gboolean ags_audio_signal_has_resource(AgsConnectable *connectable); gboolean ags_audio_signal_is_ready(AgsConnectable *connectable); void ags_audio_signal_add_to_registry(AgsConnectable *connectable); void ags_audio_signal_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_signal_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_signal_xml_compose(AgsConnectable *connectable); void ags_audio_signal_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_signal_is_connected(AgsConnectable *connectable); void ags_audio_signal_connect(AgsConnectable *connectable); void ags_audio_signal_disconnect(AgsConnectable *connectable); void ags_audio_signal_real_add_note(AgsAudioSignal *audio_signal, GObject *note); void ags_audio_signal_real_remove_note(AgsAudioSignal *audio_signal, GObject *note); /** * SECTION:ags_audio_signal * @short_description: Contains the audio data and its alignment * @title: AgsAudioSignal * @section_id: * @include: ags/audio/ags_audio_signal.h * * #AgsAudioSignal organizes audio data within a #GList-struct whereby data * pointing to the buffer. */ enum{ PROP_0, PROP_RECYCLING, PROP_OUTPUT_SOUNDCARD, PROP_OUTPUT_SOUNDCARD_CHANNEL, PROP_INPUT_SOUNDCARD, PROP_INPUT_SOUNDCARD_CHANNEL, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_WORD_SIZE, PROP_LENGTH, PROP_FIRST_FRAME, PROP_LAST_FRAME, PROP_FRAME_COUNT, PROP_LOOP_START, PROP_LOOP_END, PROP_DELAY, PROP_ATTACK, PROP_DAMPING, PROP_VIBRATION, PROP_TIMBRE_START, PROP_TIMBRE_END, PROP_TEMPLATE, PROP_RT_TEMPLATE, PROP_NOTE, PROP_RECALL_ID, PROP_STREAM, PROP_STREAM_END, PROP_STREAM_CURRENT, }; enum{ ADD_NOTE, REMOVE_NOTE, REFRESH_DATA, LAST_SIGNAL, }; static gpointer ags_audio_signal_parent_class = NULL; static guint audio_signal_signals[LAST_SIGNAL]; GType ags_audio_signal_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_signal = 0; static const GTypeInfo ags_audio_signal_info = { sizeof (AgsAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_signal_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_signal_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_signal = g_type_register_static(G_TYPE_OBJECT, "AgsAudioSignal", &ags_audio_signal_info, 0); g_type_add_interface_static(ags_type_audio_signal, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_signal); } return g_define_type_id__volatile; } void ags_audio_signal_class_init(AgsAudioSignalClass *audio_signal) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_signal_parent_class = g_type_class_peek_parent(audio_signal); /* GObjectClass */ gobject = (GObjectClass *) audio_signal; gobject->set_property = ags_audio_signal_set_property; gobject->get_property = ags_audio_signal_get_property; gobject->dispose = ags_audio_signal_dispose; gobject->finalize = ags_audio_signal_finalize; /* properties */ /** * AgsAudioSignal:recycling: * * The assigned #AgsRecycling linking tree. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recycling", i18n_pspec("assigned recycling"), i18n_pspec("The recycling it is assigned with"), AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECYCLING, param_spec); /** * AgsAudioSignal:output-soundcard: * * The assigned output #AgsSoundcard providing default settings. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-soundcard", i18n_pspec("assigned output soundcard"), i18n_pspec("The output soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD, param_spec); /** * AgsAudioSignal:output-soundcard-channel: * * The output soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("output-soundcard-channel", i18n_pspec("output soundcard channel"), i18n_pspec("The output soundcard channel"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsAudioSignal:input-soundcard: * * The assigned input #AgsSoundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-soundcard", i18n_pspec("assigned input soundcard"), i18n_pspec("The input soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD, param_spec); /** * AgsAudioSignal:input-soundcard-channel: * * The input soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("input-soundcard-channel", i18n_pspec("input soundcard channel"), i18n_pspec("The input soundcard channel"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsAudioSignal:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsAudioSignal:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsAudioSignal:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsAudioSignal:word-size: * * The word size of frame. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("word-size", i18n_pspec("frame word size"), i18n_pspec("The word size of a frame"), 0, G_MAXUINT32, 0, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_WORD_SIZE, param_spec); /** * AgsAudioSignal:length: * * The length of the stream. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("length", i18n_pspec("stream length"), i18n_pspec("The length of the stream"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LENGTH, param_spec); /** * AgsAudioSignal:first-frame: * * The first frame of stream. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("first-frame", i18n_pspec("stream's first frame"), i18n_pspec("The first frame of the stream"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIRST_FRAME, param_spec); /** * AgsAudioSignal:last-frame: * * The last frame of stream. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("last-frame", i18n_pspec("stream's last frame"), i18n_pspec("The last frame of the stream"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LAST_FRAME, param_spec); /** * AgsAudioSignal:frame-count: * * The initial size of audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("frame-count", i18n_pspec("frame count of audio data"), i18n_pspec("The initial frame count of audio data"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FRAME_COUNT, param_spec); /** * AgsAudioSignal:loop-start: * * The loop start of stream. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("loop-start", i18n_pspec("stream's loop start"), i18n_pspec("The loop start of the stream"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_START, param_spec); /** * AgsAudioSignal:loop-end: * * The loop end of stream. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("loop-end", i18n_pspec("stream's loop end"), i18n_pspec("The loop end of the stream"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_END, param_spec); /** * AgsAudioSignal:delay: * * The delay to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay", i18n_pspec("using delay"), i18n_pspec("The delay to be used"), 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY, param_spec); /** * AgsAudioSignal:attack: * * The attack to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("attack", i18n_pspec("using attack"), i18n_pspec("The attack to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsAudioSignal:damping: * * Damping of timbre. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("damping", i18n_pspec("damping"), i18n_pspec("The timbre's damping"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DAMPING, param_spec); /** * AgsAudioSignal:vibration: * * Vibration of timbre. * * Since: 3.0.0 */ param_spec = g_param_spec_boxed("vibration", i18n_pspec("vibration"), i18n_pspec("The timbre's vibration"), AGS_TYPE_COMPLEX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_VIBRATION, param_spec); /** * AgsAudioSignal:timbre-start: * * The timbre's start frame. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("timbre-start", i18n_pspec("timbre's start"), i18n_pspec("The timbre's start frame"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMBRE_START, param_spec); /** * AgsAudioSignal:timbre-end: * * The timbre's end frame. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("timbre-end", i18n_pspec("timbre's end"), i18n_pspec("The timbre's end frame"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMBRE_END, param_spec); /** * AgsAudioSignal:template: * * The assigned #AgsAudioSignal template. * * Since: 3.0.0 */ param_spec = g_param_spec_object("template", i18n_pspec("assigned template"), i18n_pspec("The assigend template"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TEMPLATE, param_spec); /** * AgsAudioSignal:rt-template: * * The assigned #AgsAudioSignal realtime template. * * Since: 3.0.0 */ param_spec = g_param_spec_object("rt-template", i18n_pspec("assigned realtime template"), i18n_pspec("The assigend realtime template"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RT_TEMPLATE, param_spec); /** * AgsAudioSignal:note: (type GList(AgsNote)) (transfer full) * * The assigned #AgsNote providing default settings. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("note", i18n_pspec("assigned note"), i18n_pspec("The note it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE, param_spec); /** * AgsAudioSignal:recall-id: * * The assigned #AgsRecallID providing context. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-id", i18n_pspec("assigned recall id"), i18n_pspec("The recall id it is assigned with"), AGS_TYPE_RECALL_ID, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_ID, param_spec); /** * AgsAudioSignal:stream: * * The stream it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("stream", i18n_pspec("containing stream"), i18n_pspec("The stream it contains"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_STREAM, param_spec); /** * AgsAudioSignal:stream-end: * * The end of stream. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("stream-end", i18n_pspec("end of stream"), i18n_pspec("The stream's end"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_STREAM_END, param_spec); /** * AgsAudioSignal:stream-current: * * The current stream. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("stream-current", i18n_pspec("current stream"), i18n_pspec("The current stream"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_STREAM_CURRENT, param_spec); /* AgsAudioSignalClass */ audio_signal->add_note = ags_audio_signal_real_add_note; audio_signal->remove_note = ags_audio_signal_real_remove_note; /* signals */ /** * AgsAudioSignal::add-note: * @audio_signal: the #AgsAudioSignal * @note: the #AgsNote * * The ::add-note signal notifies about adding @note. * * Since: 3.0.0 */ audio_signal_signals[ADD_NOTE] = g_signal_new("add-note", G_TYPE_FROM_CLASS(audio_signal), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioSignalClass, add_note), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsAudioSignal::remove-note: * @audio_signal: the #AgsAudioSignal * @note: the #AgsNote * * The ::remove-note signal notifies about removing @note. * * Since: 3.0.0 */ audio_signal_signals[REMOVE_NOTE] = g_signal_new("remove-note", G_TYPE_FROM_CLASS(audio_signal), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioSignalClass, remove_note), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsAudioSignal::refresh-data: * @audio_signal: the #AgsAudioSignal * * The ::refresh-data signal notifies about requesting to refresh data. * * Since: 3.0.0 */ audio_signal_signals[REFRESH_DATA] = g_signal_new("refresh-data", G_TYPE_FROM_CLASS(audio_signal), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioSignalClass, refresh_data), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_signal_get_uuid; connectable->has_resource = ags_audio_signal_has_resource; connectable->is_ready = ags_audio_signal_is_ready; connectable->add_to_registry = ags_audio_signal_add_to_registry; connectable->remove_from_registry = ags_audio_signal_remove_from_registry; connectable->list_resource = ags_audio_signal_list_resource; connectable->xml_compose = ags_audio_signal_xml_compose; connectable->xml_parse = ags_audio_signal_xml_parse; connectable->is_connected = ags_audio_signal_is_connected; connectable->connect = ags_audio_signal_connect; connectable->disconnect = ags_audio_signal_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_signal_init(AgsAudioSignal *audio_signal) { AgsConfig *config; complex z; audio_signal->flags = 0; /* audio signal mutex */ g_rec_mutex_init(&(audio_signal->obj_mutex)); /* uuid */ #if 0 audio_signal->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_signal->uuid); #else audio_signal->uuid = NULL; #endif /* recycling */ audio_signal->recycling = NULL; /* base init */ audio_signal->output_soundcard = NULL; audio_signal->output_soundcard_channel = 0; audio_signal->input_soundcard = NULL; audio_signal->input_soundcard_channel = 0; #if 0 /* config */ config = ags_config_get_instance(); /* presets */ audio_signal->samplerate = (guint) ags_soundcard_helper_config_get_samplerate(config); audio_signal->buffer_size = (guint) ags_soundcard_helper_config_get_buffer_size(config); audio_signal->format = (guint) ags_soundcard_helper_config_get_format(config); #else /* presets */ audio_signal->samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; audio_signal->buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; audio_signal->format = AGS_SOUNDCARD_DEFAULT_FORMAT; #endif audio_signal->word_size = sizeof(gint16); /* format */ switch(audio_signal->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { audio_signal->word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { audio_signal->word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { audio_signal->word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { audio_signal->word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { audio_signal->word_size = sizeof(gint64); } break; case AGS_SOUNDCARD_FLOAT: { audio_signal->word_size = sizeof(gfloat); } break; case AGS_SOUNDCARD_DOUBLE: { audio_signal->word_size = sizeof(gdouble); } break; } /* duration */ audio_signal->length = 0; audio_signal->first_frame = 0; audio_signal->last_frame = 0; audio_signal->frame_count = 0; audio_signal->loop_start = 0; audio_signal->loop_end = 0; /* offset */ audio_signal->delay = 0.0; audio_signal->attack = 0; /* timbre */ z = 0.0 + I * 1.0; ags_complex_set(&(audio_signal->damping), z); z = 0.0 + I * 1.0; ags_complex_set(&(audio_signal->vibration), z); audio_signal->timbre_start = 0; audio_signal->timbre_end = 0; /* template */ audio_signal->template = NULL; /* realtime fields */ audio_signal->rt_template = NULL; audio_signal->note = NULL; /* recall id */ audio_signal->recall_id = NULL; /* stream */ g_rec_mutex_init(&(audio_signal->stream_mutex)); audio_signal->stream = NULL; audio_signal->stream_current = NULL; audio_signal->stream_end = NULL; } void ags_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioSignal *audio_signal; GRecMutex *audio_signal_mutex; audio_signal = AGS_AUDIO_SIGNAL(gobject); /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); switch(prop_id){ case PROP_RECYCLING: { GObject *recycling; recycling = g_value_get_object(value); g_rec_mutex_lock(audio_signal_mutex); if(audio_signal->recycling == recycling){ g_rec_mutex_unlock(audio_signal_mutex); return; } if(audio_signal->recycling != NULL){ g_object_unref(audio_signal->recycling); } if(recycling != NULL){ g_object_ref(recycling); } audio_signal->recycling = recycling; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { GObject *output_soundcard; output_soundcard = g_value_get_object(value); ags_audio_signal_set_output_soundcard(audio_signal, output_soundcard); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(audio_signal_mutex); audio_signal->output_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_INPUT_SOUNDCARD: { GObject *input_soundcard; input_soundcard = g_value_get_object(value); ags_audio_signal_set_input_soundcard(audio_signal, input_soundcard); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(audio_signal_mutex); audio_signal->input_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_audio_signal_set_samplerate(audio_signal, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_audio_signal_set_buffer_size(audio_signal, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_audio_signal_set_format(audio_signal, format); } break; case PROP_LENGTH: { guint length; length = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->length = length; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_FIRST_FRAME: { guint first_frame; first_frame = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->first_frame = first_frame; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LAST_FRAME: { guint last_frame; last_frame = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->last_frame = last_frame; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_FRAME_COUNT: { guint frame_count; frame_count = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->frame_count = frame_count; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LOOP_START: { guint loop_start; loop_start = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->loop_start = loop_start; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LOOP_END: { guint loop_end; loop_end = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->loop_end = loop_end; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_DELAY: { gdouble delay; delay = g_value_get_double(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->delay = delay; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_ATTACK: { guint attack; attack = g_value_get_uint(value); g_rec_mutex_lock(audio_signal_mutex); audio_signal->attack = attack; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_DAMPING: { AgsComplex *damping; damping = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(audio_signal_mutex); ags_complex_set(&(audio_signal->damping), ags_complex_get(damping)); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_VIBRATION: { AgsComplex *vibration; vibration = (AgsComplex *) g_value_get_boxed(value); g_rec_mutex_lock(audio_signal_mutex); ags_complex_set(&(audio_signal->vibration), ags_complex_get(vibration)); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_TIMBRE_START: { g_rec_mutex_lock(audio_signal_mutex); audio_signal->timbre_start = g_value_get_uint(value); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_TIMBRE_END: { g_rec_mutex_lock(audio_signal_mutex); audio_signal->timbre_end = g_value_get_uint(value); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_TEMPLATE: { GObject *template; template = g_value_get_object(value); g_rec_mutex_lock(audio_signal_mutex); if(audio_signal->template == template){ g_rec_mutex_unlock(audio_signal_mutex); return; } if(audio_signal->template != NULL){ g_object_unref(audio_signal->template); } if(template != NULL){ g_object_ref(template); } audio_signal->template = template; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_RT_TEMPLATE: { GObject *rt_template; rt_template = g_value_get_object(value); g_rec_mutex_lock(audio_signal_mutex); if(audio_signal->rt_template == rt_template){ g_rec_mutex_unlock(audio_signal_mutex); return; } if(audio_signal->rt_template != NULL){ g_object_unref(audio_signal->rt_template); } if(rt_template != NULL){ g_object_ref(rt_template); } audio_signal->rt_template = rt_template; g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_NOTE: { GObject *note; note = g_value_get_pointer(value); g_rec_mutex_lock(audio_signal_mutex); if(g_list_find(audio_signal->note, note) != NULL){ g_rec_mutex_unlock(audio_signal_mutex); return; } g_rec_mutex_unlock(audio_signal_mutex); ags_audio_signal_add_note(audio_signal, note); } break; case PROP_RECALL_ID: { GObject *recall_id; recall_id = g_value_get_object(value); g_rec_mutex_lock(audio_signal_mutex); if(audio_signal->recall_id == recall_id){ g_rec_mutex_unlock(audio_signal_mutex); return; } if(audio_signal->recall_id != NULL){ g_object_unref(audio_signal->recall_id); } if(recall_id != NULL){ g_object_ref(recall_id); } audio_signal->recall_id = recall_id; g_rec_mutex_unlock(audio_signal_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioSignal *audio_signal; GRecMutex *audio_signal_mutex; GRecMutex *stream_mutex; audio_signal = AGS_AUDIO_SIGNAL(gobject); /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); switch(prop_id){ case PROP_RECYCLING: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_object(value, audio_signal->recycling); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_object(value, audio_signal->output_soundcard); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_int(value, audio_signal->output_soundcard_channel); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_INPUT_SOUNDCARD: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_object(value, audio_signal->input_soundcard); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_int(value, audio_signal->input_soundcard_channel); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->samplerate); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->buffer_size); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->format); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_WORD_SIZE: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->word_size); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LENGTH: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->length); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_FIRST_FRAME: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->first_frame); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LAST_FRAME: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->last_frame); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_FRAME_COUNT: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->frame_count); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LOOP_START: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->loop_start); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_LOOP_END: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->loop_end); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_DELAY: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_double(value, audio_signal->delay); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->attack); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_DAMPING: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_boxed(value, &(audio_signal->damping)); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_VIBRATION: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_boxed(value, &(audio_signal->vibration)); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_TIMBRE_START: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->timbre_start); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_TIMBRE_END: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_uint(value, audio_signal->timbre_end); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_TEMPLATE: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_object(value, audio_signal->template); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_RT_TEMPLATE: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_object(value, audio_signal->rt_template); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_NOTE: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_signal->note, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_RECALL_ID: { g_rec_mutex_lock(audio_signal_mutex); g_value_set_object(value, audio_signal->recall_id); g_rec_mutex_unlock(audio_signal_mutex); } break; case PROP_STREAM: { g_rec_mutex_lock(stream_mutex); g_value_set_pointer(value, audio_signal->stream); g_rec_mutex_unlock(stream_mutex); } break; case PROP_STREAM_END: { g_rec_mutex_lock(stream_mutex); g_value_set_pointer(value, audio_signal->stream_end); g_rec_mutex_unlock(stream_mutex); } break; case PROP_STREAM_CURRENT: { g_rec_mutex_lock(stream_mutex); g_value_set_pointer(value, audio_signal->stream_current); g_rec_mutex_unlock(stream_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_signal_dispose(GObject *gobject) { AgsAudioSignal *audio_signal; audio_signal = AGS_AUDIO_SIGNAL(gobject); /* recycling */ if(audio_signal->recycling != NULL){ g_object_unref(audio_signal->recycling); audio_signal->recycling = NULL; } /* output soundcard */ if(audio_signal->output_soundcard != NULL){ g_object_unref(audio_signal->output_soundcard); audio_signal->output_soundcard = NULL; } /* input soundcard */ if(audio_signal->input_soundcard != NULL){ g_object_unref(audio_signal->input_soundcard); audio_signal->input_soundcard = NULL; } /* template */ if(audio_signal->template != NULL){ g_object_unref(audio_signal->template); audio_signal->template = NULL; } /* rt-template */ if(audio_signal->rt_template != NULL){ g_object_unref(audio_signal->rt_template); audio_signal->rt_template = NULL; } /* note */ if(audio_signal->note != NULL){ g_list_free_full(audio_signal->note, g_object_unref); audio_signal->note = NULL; } /* recall id */ if(audio_signal->recall_id != NULL){ g_object_unref(audio_signal->recall_id); audio_signal->recall_id = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_signal_parent_class)->dispose(gobject); } void ags_audio_signal_finalize(GObject *gobject) { AgsAudioSignal *audio_signal; guint *ids; guint i, n_ids; audio_signal = AGS_AUDIO_SIGNAL(gobject); #ifdef AGS_DEBUG g_message("fin %x", audio_signal); if((AGS_AUDIO_SIGNAL_TEMPLATE & (audio_signal->flags)) != 0){ g_warning("AGS_AUDIO_SIGNAL_TEMPLATE: destroying\n"); } #endif ags_uuid_free(audio_signal->uuid); /* disconnect */ #if 0 ids = g_signal_list_ids(AGS_TYPE_AUDIO_SIGNAL, &n_ids); for(i = 0; i < n_ids; i++){ g_signal_handlers_disconnect_matched(gobject, G_SIGNAL_MATCH_ID, ids[i], 0, NULL, NULL, NULL); } g_free(ids); #endif /* recycling */ if(audio_signal->recycling != NULL){ g_object_unref(audio_signal->recycling); } /* output soundcard */ if(audio_signal->output_soundcard != NULL){ g_object_unref(audio_signal->output_soundcard); } /* input soundcard */ if(audio_signal->input_soundcard != NULL){ g_object_unref(audio_signal->input_soundcard); } /* template */ if(audio_signal->template != NULL){ g_object_unref(audio_signal->template); } /* rt-template */ if(audio_signal->rt_template != NULL){ g_object_unref(audio_signal->rt_template); } /* note */ if(audio_signal->note != NULL){ g_list_free_full(audio_signal->note, g_object_unref); } /* recall id */ if(audio_signal->recall_id != NULL){ g_object_unref(audio_signal->recall_id); } /* audio data */ g_list_free_full(audio_signal->stream, (GDestroyNotify) ags_stream_free); /* call parent */ G_OBJECT_CLASS(ags_audio_signal_parent_class)->finalize(gobject); } AgsUUID* ags_audio_signal_get_uuid(AgsConnectable *connectable) { AgsAudioSignal *audio_signal; AgsUUID *ptr; GRecMutex *audio_signal_mutex; audio_signal = AGS_AUDIO_SIGNAL(connectable); /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); /* get UUID */ g_rec_mutex_lock(audio_signal_mutex); ptr = audio_signal->uuid; g_rec_mutex_unlock(audio_signal_mutex); return(ptr); } gboolean ags_audio_signal_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_audio_signal_is_ready(AgsConnectable *connectable) { AgsAudioSignal *audio_signal; gboolean is_ready; audio_signal = AGS_AUDIO_SIGNAL(connectable); is_ready = ags_audio_signal_test_flags(audio_signal, AGS_AUDIO_SIGNAL_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_signal_add_to_registry(AgsConnectable *connectable) { AgsAudioSignal *audio_signal; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } audio_signal = AGS_AUDIO_SIGNAL(connectable); ags_audio_signal_set_flags(audio_signal, AGS_AUDIO_SIGNAL_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) audio_signal); ags_registry_add_entry(registry, entry); } } void ags_audio_signal_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_audio_signal_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_signal_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_signal_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_signal_is_connected(AgsConnectable *connectable) { AgsAudioSignal *audio_signal; gboolean is_connected; audio_signal = AGS_AUDIO_SIGNAL(connectable); is_connected = ags_audio_signal_test_flags(audio_signal, AGS_AUDIO_SIGNAL_CONNECTED); return(is_connected); } void ags_audio_signal_connect(AgsConnectable *connectable) { AgsAudioSignal *audio_signal; if(ags_connectable_is_connected(connectable)){ return; } audio_signal = AGS_AUDIO_SIGNAL(connectable); ags_audio_signal_set_flags(audio_signal, AGS_AUDIO_SIGNAL_CONNECTED); } void ags_audio_signal_disconnect(AgsConnectable *connectable) { AgsAudioSignal *audio_signal; if(!ags_connectable_is_connected(connectable)){ return; } audio_signal = AGS_AUDIO_SIGNAL(connectable); ags_audio_signal_unset_flags(audio_signal, AGS_AUDIO_SIGNAL_CONNECTED); } /** * ags_audio_signal_get_obj_mutex: * @audio_signal: the #AgsAudioSignal * * Get object mutex. * * Returns: the #GRecMutex to lock @audio_signal * * Since: 3.1.0 */ GRecMutex* ags_audio_signal_get_obj_mutex(AgsAudioSignal *audio_signal) { if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(NULL); } return(AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal)); } /** * ags_audio_signal_stream_lock: * @audio_signal: the #AgsAudioSignal * * Lock stream mutex. * * Since: 3.1.0 */ void ags_audio_signal_stream_lock(AgsAudioSignal *audio_signal) { if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } g_rec_mutex_lock(AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal)); } /** * ags_audio_signal_stream_unlock: * @audio_signal: the #AgsAudioSignal * * Unlock stream mutex. * * Since: 3.1.0 */ void ags_audio_signal_stream_unlock(AgsAudioSignal *audio_signal) { if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } g_rec_mutex_unlock(AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal)); } /** * ags_audio_signal_test_flags: * @audio_signal: the #AgsAudioSignal * @flags: the flags * * Test @flags to be set on @audio_signal. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_signal_test_flags(AgsAudioSignal *audio_signal, guint flags) { gboolean retval; GRecMutex *audio_signal_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(FALSE); } /* get audio_signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); /* test */ g_rec_mutex_lock(audio_signal_mutex); retval = (flags & (audio_signal->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_signal_mutex); return(retval); } /** * ags_audio_signal_set_flags: * @audio_signal: the #AgsAudioSignal * @flags: see #AgsAudioSignalFlags-enum * * Enable a feature of @audio_signal. * * Since: 3.0.0 */ void ags_audio_signal_set_flags(AgsAudioSignal *audio_signal, guint flags) { GRecMutex *audio_signal_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio_signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_signal_mutex); audio_signal->flags |= flags; g_rec_mutex_unlock(audio_signal_mutex); } /** * ags_audio_signal_unset_flags: * @audio_signal: the #AgsAudioSignal * @flags: see #AgsAudioSignalFlags-enum * * Disable a feature of @audio_signal. * * Since: 3.0.0 */ void ags_audio_signal_unset_flags(AgsAudioSignal *audio_signal, guint flags) { GRecMutex *audio_signal_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio_signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_signal_mutex); audio_signal->flags &= (~flags); g_rec_mutex_unlock(audio_signal_mutex); } /** * ags_stream_alloc: * @buffer_size: the buffer size * @format: the format * * Allocs an audio buffer. * * Returns: the audio data array * * Since: 3.0.0 */ void* ags_stream_alloc(guint buffer_size, guint format) { void *buffer; guint word_size; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { buffer = (gint8 *) malloc(buffer_size * sizeof(gint8)); word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { buffer = (gint16 *) malloc(buffer_size * sizeof(gint16)); word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { buffer = (gint32 *) malloc(buffer_size * sizeof(gint32)); //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { buffer = (gint32 *) malloc(buffer_size * sizeof(gint32)); word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { buffer = (gint64 *) malloc(buffer_size * sizeof(gint64)); word_size = sizeof(gint64); } break; case AGS_SOUNDCARD_FLOAT: { buffer = (gfloat *) malloc(buffer_size * sizeof(gfloat)); word_size = sizeof(gfloat); } break; case AGS_SOUNDCARD_DOUBLE: { buffer = (gdouble *) malloc(buffer_size * sizeof(gdouble)); word_size = sizeof(gdouble); } break; case AGS_SOUNDCARD_COMPLEX: { guint i; buffer = (AgsComplex *) malloc(buffer_size * sizeof(AgsComplex)); for(i = 0; i < buffer_size; i++){ ((AgsComplex *) buffer)[i].real = 0.0; ((AgsComplex *) buffer)[i].imag = 0.0; } return(buffer); } break; default: g_warning("ags_stream_alloc(): unsupported word size"); return(NULL); } memset(buffer, 0, buffer_size * word_size); return(buffer); } /** * ags_stream_free: * @buffer: the buffer * * Frees an audio buffer. * * Since: 3.0.0 */ void ags_stream_free(void *buffer) { if(buffer == NULL){ return; } free(buffer); } /** * ags_audio_signal_get_recycling: * @audio_signal: the #AgsAudioSignal * * Get recycling. * * Returns: (transfer full): the #AgsRecycling * * Since: 3.1.0 */ GObject* ags_audio_signal_get_recycling(AgsAudioSignal *audio_signal) { GObject *recycling; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(NULL); } g_object_get(audio_signal, "recycling", &recycling, NULL); return(recycling); } /** * ags_audio_signal_set_recycling: * @audio_signal: the #AgsAudioSignal * @recycling: the #AgsRecycling * * Set recycling. * * Since: 3.1.0 */ void ags_audio_signal_set_recycling(AgsAudioSignal *audio_signal, GObject *recycling) { if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } g_object_set(audio_signal, "recycling", recycling, NULL); } /** * ags_audio_signal_get_output_soundcard: * @audio_signal: the #AgsAudioSignal * * Get the output soundcard object of @audio_signal. * * Returns: (transfer full): the output soundcard * * Since: 3.1.0 */ GObject* ags_audio_signal_get_output_soundcard(AgsAudioSignal *audio_signal) { GObject *output_soundcard; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(NULL); } g_object_get(audio_signal, "output-soundcard", &output_soundcard, NULL); return(output_soundcard); } /** * ags_audio_signal_set_output_soundcard: * @audio_signal: the #AgsAudioSignal * @output_soundcard: the #GObject implementing #AgsSoundcard * * Set output soundcarod of @audio_signal. * * Since: 3.0.0 */ void ags_audio_signal_set_output_soundcard(AgsAudioSignal *audio_signal, GObject *output_soundcard) { guint samplerate; guint buffer_size; guint format; GRecMutex *audio_signal_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal) || !AGS_IS_SOUNDCARD(output_soundcard)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); /* set output soundcard */ g_rec_mutex_lock(audio_signal_mutex); if(audio_signal->output_soundcard == output_soundcard){ g_rec_mutex_unlock(audio_signal_mutex); return; } if(audio_signal->output_soundcard != NULL){ g_object_unref(audio_signal->output_soundcard); } if(output_soundcard != NULL){ g_object_ref(output_soundcard); } audio_signal->output_soundcard = output_soundcard; g_rec_mutex_unlock(audio_signal_mutex); /* apply presets */ if(output_soundcard != NULL){ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, &samplerate, &buffer_size, &format); g_object_set(audio_signal, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); } } /** * ags_audio_signal_get_input_soundcard: * @audio_signal: the #AgsAudioSignal * * Get the input soundcard object of @audio_signal. * * Returns: (transfer full): the input soundcard * * Since: 3.1.0 */ GObject* ags_audio_signal_get_input_soundcard(AgsAudioSignal *audio_signal) { GObject *input_soundcard; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(NULL); } g_object_get(audio_signal, "input-soundcard", &input_soundcard, NULL); return(input_soundcard); } /** * ags_audio_signal_set_input_soundcard: * @audio_signal: the #AgsAudioSignal * @input_soundcard: the #GObject implementing #AgsSoundcard * * Set input soundcarod of @audio_signal. * * Since: 3.0.0 */ void ags_audio_signal_set_input_soundcard(AgsAudioSignal *audio_signal, GObject *input_soundcard) { GRecMutex *audio_signal_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal) || !AGS_IS_SOUNDCARD(input_soundcard)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); /* set input soundcard */ g_rec_mutex_lock(audio_signal_mutex); if(audio_signal->input_soundcard == input_soundcard){ g_rec_mutex_unlock(audio_signal_mutex); return; } if(audio_signal->input_soundcard != NULL){ g_object_unref(audio_signal->input_soundcard); } if(input_soundcard != NULL){ g_object_ref(input_soundcard); } audio_signal->input_soundcard = input_soundcard; g_rec_mutex_unlock(audio_signal_mutex); } /** * ags_audio_signal_get_samplerate: * @audio_signal: the #AgsAudioSignal * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_audio_signal_get_samplerate(AgsAudioSignal *audio_signal) { guint samplerate; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(0); } g_object_get(audio_signal, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_audio_signal_set_samplerate: * @audio_signal: the #AgsAudioSignal * @samplerate: the samplerate * * Set samplerate. * * Since: 3.0.0 */ void ags_audio_signal_set_samplerate(AgsAudioSignal *audio_signal, guint samplerate) { GList *stream; void *data, *resampled_data; guint stream_length; guint end_offset; guint buffer_size; guint old_samplerate; guint format; guint offset; guint copy_mode; GRecMutex *audio_signal_mutex; GRecMutex *stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); /* check resample */ g_rec_mutex_lock(audio_signal_mutex); old_samplerate = audio_signal->samplerate; g_rec_mutex_unlock(audio_signal_mutex); if(old_samplerate == samplerate){ return; } /* set samplerate */ g_rec_mutex_lock(audio_signal_mutex); buffer_size = audio_signal->buffer_size; format = audio_signal->format; audio_signal->samplerate = samplerate; audio_signal->loop_start = (guint) floor((double) samplerate * ((double) audio_signal->loop_start / (double) old_samplerate)); audio_signal->loop_end = (guint) floor((double) samplerate * ((double) audio_signal->loop_end / (double) old_samplerate)); g_rec_mutex_unlock(audio_signal_mutex); /* resample buffer */ g_rec_mutex_lock(stream_mutex); data = NULL; stream_length = g_list_length(audio_signal->stream); copy_mode = G_MAXUINT; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { data = (gint8 *) malloc(stream_length * buffer_size * sizeof(gint8)); memset(data, 0, stream_length * buffer_size * sizeof(gint8)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { data = (gint16 *) malloc(stream_length * buffer_size * sizeof(gint16)); memset(data, 0, stream_length * buffer_size * sizeof(gint16)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { data = (gint32 *) malloc(stream_length * buffer_size * sizeof(gint32)); memset(data, 0, stream_length * buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { data = (gint32 *) malloc(stream_length * buffer_size * sizeof(gint32)); memset(data, 0, stream_length * buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { data = (gint64 *) malloc(stream_length * buffer_size * sizeof(gint64)); memset(data, 0, stream_length * buffer_size * sizeof(gint64)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64; } break; case AGS_SOUNDCARD_FLOAT: { data = (gfloat *) malloc(stream_length * buffer_size * sizeof(gfloat)); memset(data, 0, stream_length * buffer_size * sizeof(gfloat)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT; } break; case AGS_SOUNDCARD_DOUBLE: { data = (gdouble *) malloc(stream_length * buffer_size * sizeof(gdouble)); memset(data, 0, stream_length * buffer_size * sizeof(gdouble)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE; } break; default: g_warning("ags_audio_signal_set_samplerate() - unsupported format"); } stream = audio_signal->stream; offset = 0; while(stream != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(data, 1, offset, stream->data, 1, 0, buffer_size, copy_mode); /* iterate */ stream = stream->next; offset += buffer_size; } g_rec_mutex_unlock(stream_mutex); resampled_data = ags_stream_alloc((guint) (samplerate * (stream_length * buffer_size / old_samplerate)), format); ags_audio_buffer_util_resample_with_buffer(data, 1, ags_audio_buffer_util_format_from_soundcard(format), old_samplerate, stream_length * buffer_size, samplerate, (guint) (samplerate * (stream_length * buffer_size / old_samplerate)), resampled_data); if(data != NULL){ free(data); } ags_audio_signal_stream_resize(audio_signal, (guint) ceil((samplerate * (stream_length * buffer_size / old_samplerate)) / buffer_size)); g_rec_mutex_lock(stream_mutex); stream = audio_signal->stream; stream_length = g_list_length(audio_signal->stream); end_offset = stream_length * buffer_size; offset = 0; while(stream != NULL && offset < stream_length * buffer_size){ ags_audio_buffer_util_clear_buffer(stream->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); if(offset + buffer_size < stream_length * buffer_size){ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, 0, resampled_data, 1, offset, buffer_size, copy_mode); }else{ if(end_offset > offset){ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, 0, resampled_data, 1, offset, end_offset - offset, copy_mode); } } /* iterate */ stream = stream->next; offset += buffer_size; } g_rec_mutex_unlock(stream_mutex); if(resampled_data != NULL){ free(resampled_data); } } /** * ags_audio_signal_get_buffer_size: * @audio_signal: the #AgsAudioSignal * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_audio_signal_get_buffer_size(AgsAudioSignal *audio_signal) { guint buffer_size; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(0); } g_object_get(audio_signal, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_audio_signal_set_buffer_size: * @audio_signal: the #AgsAudioSignal * @buffer_size: the buffer size * * Set buffer size. * * Since: 3.0.0 */ void ags_audio_signal_set_buffer_size(AgsAudioSignal *audio_signal, guint buffer_size) { GList *stream; void *data; guint stream_length; guint end_offset; guint offset; guint format; guint old_buffer_size; guint word_size; guint copy_mode; GRecMutex *audio_signal_mutex; GRecMutex *stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); /* check buffer size */ g_rec_mutex_lock(audio_signal_mutex); old_buffer_size = audio_signal->buffer_size; g_rec_mutex_unlock(audio_signal_mutex); if(old_buffer_size == buffer_size){ return; } /* get some fields and set buffer size */ g_rec_mutex_lock(audio_signal_mutex); format = audio_signal->format; audio_signal->buffer_size = buffer_size; g_rec_mutex_unlock(audio_signal_mutex); /* resize buffer */ g_rec_mutex_lock(stream_mutex); data = NULL; stream_length = g_list_length(audio_signal->stream); word_size = 1; copy_mode = G_MAXUINT; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { data = (gint8 *) malloc(stream_length * old_buffer_size * sizeof(gint8)); memset(data, 0, stream_length * old_buffer_size * sizeof(gint8)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8; word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { data = (gint16 *) malloc(stream_length * old_buffer_size * sizeof(gint16)); memset(data, 0, stream_length * old_buffer_size * sizeof(gint16)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16; word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { data = (gint32 *) malloc(stream_length * old_buffer_size * sizeof(gint32)); memset(data, 0, stream_length * old_buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { data = (gint32 *) malloc(stream_length * old_buffer_size * sizeof(gint32)); memset(data, 0, stream_length * old_buffer_size * sizeof(gint32)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { data = (gint64 *) malloc(stream_length * old_buffer_size * sizeof(gint64)); memset(data, 0, stream_length * old_buffer_size * sizeof(gint64)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64; word_size = sizeof(gint64); } break; case AGS_SOUNDCARD_FLOAT: { data = (gfloat *) malloc(stream_length * old_buffer_size * sizeof(gfloat)); memset(data, 0, stream_length * old_buffer_size * sizeof(gfloat)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT; word_size = sizeof(gfloat); } break; case AGS_SOUNDCARD_DOUBLE: { data = (gdouble *) malloc(stream_length * old_buffer_size * sizeof(gdouble)); memset(data, 0, stream_length * old_buffer_size * sizeof(gdouble)); copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE; word_size = sizeof(gdouble); } break; default: g_warning("ags_audio_signal_set_buffer_size() - unsupported format"); } stream = audio_signal->stream; offset = 0; while(stream != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(data, 1, offset, stream->data, 1, 0, old_buffer_size, copy_mode); /* iterate */ stream = stream->next; offset += old_buffer_size; } g_rec_mutex_unlock(stream_mutex); ags_audio_signal_stream_resize(audio_signal, (guint) ceil(((double) stream_length * (double) old_buffer_size) / buffer_size)); g_rec_mutex_lock(stream_mutex); stream = audio_signal->stream; stream_length = g_list_length(audio_signal->stream); end_offset = stream_length * old_buffer_size; offset = 0; while(stream != NULL && offset < stream_length * buffer_size){ switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { stream->data = (gint8 *) realloc(stream->data, buffer_size * sizeof(gint8)); memset(stream->data, 0, buffer_size * sizeof(gint8)); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { stream->data = (gint16 *) realloc(stream->data, buffer_size * sizeof(gint16)); memset(stream->data, 0, buffer_size * sizeof(gint16)); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { stream->data = (gint32 *) realloc(stream->data, buffer_size * sizeof(gint32)); memset(stream->data, 0, buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { stream->data = (gint32 *) realloc(stream->data, buffer_size * sizeof(gint32)); memset(stream->data, 0, buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { stream->data = (gint64 *) realloc(stream->data, buffer_size * sizeof(gint64)); memset(stream->data, 0, buffer_size * sizeof(gint64)); } break; case AGS_SOUNDCARD_FLOAT: { stream->data = (gfloat *) realloc(stream->data, buffer_size * sizeof(gfloat)); memset(stream->data, 0, buffer_size * sizeof(gfloat)); } break; case AGS_SOUNDCARD_DOUBLE: { stream->data = (gdouble *) realloc(stream->data, buffer_size * sizeof(gdouble)); memset(stream->data, 0, buffer_size * sizeof(gdouble)); } break; default: g_warning("ags_audio_signal_set_buffer_size() - unsupported format"); } ags_audio_buffer_util_clear_buffer(stream->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); if(offset + buffer_size < end_offset){ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, 0, data, 1, offset, buffer_size, copy_mode); }else{ if(end_offset > offset){ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, 0, data, 1, offset, end_offset - offset, copy_mode); } } /* iterate */ stream = stream->next; offset += buffer_size; } g_rec_mutex_unlock(stream_mutex); if(data != NULL){ free(data); } } /** * ags_audio_signal_get_format: * @audio_signal: the #AgsAudioSignal * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_audio_signal_get_format(AgsAudioSignal *audio_signal) { guint format; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(0); } g_object_get(audio_signal, "format", &format, NULL); return(format); } /** * ags_audio_signal_set_format: * @audio_signal: the #AgsAudioSignal * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_audio_signal_set_format(AgsAudioSignal *audio_signal, guint format) { GList *stream; void *data; guint buffer_size; guint old_format; guint copy_mode; GRecMutex *audio_signal_mutex; GRecMutex *stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); /* get some fields and set format */ g_rec_mutex_lock(audio_signal_mutex); buffer_size = audio_signal->buffer_size; old_format = audio_signal->format; audio_signal->format = format; /* set word size */ switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { audio_signal->word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { audio_signal->word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { audio_signal->word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { audio_signal->word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { audio_signal->word_size = sizeof(gint64); } break; case AGS_SOUNDCARD_FLOAT: { audio_signal->word_size = sizeof(gfloat); } break; case AGS_SOUNDCARD_DOUBLE: { audio_signal->word_size = sizeof(gdouble); } break; } g_rec_mutex_unlock(audio_signal_mutex); if(old_format == 0){ return; } /* resize buffer */ g_rec_mutex_lock(stream_mutex); stream = audio_signal->stream; copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(old_format)); while(stream != NULL){ data = ags_stream_alloc(audio_signal->buffer_size, format); ags_audio_buffer_util_copy_buffer_to_buffer(data, 1, 0, stream->data, 1, 0, buffer_size, copy_mode); free(stream->data); stream->data = data; /* iterate */ stream = stream->next; } g_rec_mutex_unlock(stream_mutex); } /** * ags_audio_signal_get_length_till_current: * @audio_signal: the #AgsAudioSignal * * Counts the buffers from :stream upto :stream-current. * * Returns: the counted length. * * Since: 3.0.0 */ guint ags_audio_signal_get_length_till_current(AgsAudioSignal *audio_signal) { GList *list, *stop; guint length; GRecMutex *stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(0); } /* get stream mutex */ stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); /* count entries */ g_rec_mutex_lock(stream_mutex); list = audio_signal->stream; length = 0; if(audio_signal->stream_current != NULL){ stop = audio_signal->stream_current->next; while(list != stop){ length++; list = list->next; } } g_rec_mutex_unlock(stream_mutex); return(length); } /** * ags_audio_signal_add_stream: * @audio_signal: the #AgsAudioSignal * * Adds a buffer at the end of the stream. * * Since: 3.0.0 */ void ags_audio_signal_add_stream(AgsAudioSignal *audio_signal) { GList *stream, *end_old; void *buffer; guint buffer_size; guint format; GRecMutex *audio_signal_mutex; GRecMutex *stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); /* get some fields and increment length */ g_rec_mutex_lock(audio_signal_mutex); buffer_size = audio_signal->buffer_size; format = audio_signal->format; audio_signal->length += 1; g_rec_mutex_unlock(audio_signal_mutex); /* allocate stream and buffer */ g_rec_mutex_lock(stream_mutex); stream = g_list_alloc(); buffer = ags_stream_alloc(buffer_size, format); stream->data = buffer; if(audio_signal->stream_end != NULL){ end_old = audio_signal->stream_end; stream->prev = end_old; end_old->next = stream; }else{ audio_signal->stream = stream; audio_signal->stream_current = stream; } audio_signal->stream_end = stream; g_rec_mutex_unlock(stream_mutex); } /** * ags_audio_signal_stream_resize: * @audio_signal: the #AgsAudioSignal * @length: the new length * * Resize stream of @audio_signal to @length number of buffers. * * Since: 3.0.0 */ void ags_audio_signal_stream_resize(AgsAudioSignal *audio_signal, guint length) { guint buffer_size; guint format; guint old_length; guint i; GRecMutex *audio_signal_mutex; GRecMutex *stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(audio_signal); /* get some fields and set length */ g_rec_mutex_lock(audio_signal_mutex); buffer_size = audio_signal->buffer_size; format = audio_signal->format; old_length = audio_signal->length; audio_signal->length = length; g_rec_mutex_unlock(audio_signal_mutex); /* resize stream */ if(old_length < length){ GList *stream, *end_old; void *buffer; stream = NULL; for(i = old_length; i < length; i++){ buffer = ags_stream_alloc(buffer_size, format); stream = g_list_prepend(stream, buffer); } stream = g_list_reverse(stream); /* concat */ g_rec_mutex_lock(stream_mutex); if(audio_signal->stream_end != NULL){ end_old = audio_signal->stream_end; audio_signal->stream_end = g_list_last(stream); stream->prev = end_old; end_old->next = stream; }else{ audio_signal->stream = stream; audio_signal->stream_end = g_list_last(stream); audio_signal->stream_current = stream; } g_rec_mutex_unlock(stream_mutex); }else if(old_length > length){ GList *stream, *stream_end, *stream_next; gboolean check_current; g_rec_mutex_lock(stream_mutex); stream = audio_signal->stream; check_current = TRUE; for(i = 0; i < length; i++){ if(check_current && stream == audio_signal->stream_current){ audio_signal->stream_current = NULL; check_current = FALSE; } stream = stream->next; } if(length != 0){ stream_end = stream->prev; stream_end->next = NULL; audio_signal->stream_end = stream_end; }else{ audio_signal->stream = NULL; audio_signal->stream_current = NULL; audio_signal->stream_end = NULL; } g_rec_mutex_unlock(stream_mutex); stream->prev = NULL; g_list_free_full(stream, ags_stream_free); } } /** * ags_audio_signal_stream_safe_resize: * @audio_signal: the #AgsAudioSignal * @length: the new length * * Resize stream of @audio_signal to @length number of buffers. But doesn't shrink * more than the current stream position. * * Since: 3.0.0 */ void ags_audio_signal_stream_safe_resize(AgsAudioSignal *audio_signal, guint length) { guint length_till_current; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } length_till_current = ags_audio_signal_get_length_till_current(audio_signal); if(length_till_current < length){ ags_audio_signal_stream_resize(audio_signal, length); }else{ ags_audio_signal_stream_resize(audio_signal, length_till_current); } } /** * ags_audio_signal_duplicate_stream: * @audio_signal: the #AgsAudioSignal * @template: the template #AgsAudioSignal * * Apply @template audio data to @audio_signal. Note should only be invoked * by proper recall context because only the stream of @template is locked. * * Since: 3.0.0 */ void ags_audio_signal_duplicate_stream(AgsAudioSignal *audio_signal, AgsAudioSignal *template) { GList *template_stream, *stream; guint samplerate; guint buffer_size; guint template_format, format; guint length; guint copy_mode; GRecMutex *template_mutex; GRecMutex *audio_signal_mutex; GRecMutex *template_stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(template)){ if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; }else{ ags_audio_signal_stream_resize(audio_signal, 0); return; } } /* get audio signal mutex */ template_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(template); audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); template_stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(template); /* check stream presence */ g_rec_mutex_lock(template_stream_mutex); if(template->stream == NULL){ g_rec_mutex_unlock(template_stream_mutex); ags_audio_signal_stream_resize(audio_signal, 0); return; } g_rec_mutex_unlock(template_stream_mutex); /* get some fields */ g_rec_mutex_lock(template_mutex); samplerate = template->samplerate; buffer_size = template->buffer_size; template_format = template->format; length = template->length; g_rec_mutex_unlock(template_mutex); /* get some fields */ g_rec_mutex_lock(audio_signal_mutex); format = audio_signal->format; g_rec_mutex_unlock(audio_signal_mutex); /* */ g_object_set(audio_signal, "samplerate", samplerate, "buffer-size", buffer_size, NULL); ags_audio_signal_stream_resize(audio_signal, length); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(template_format)); //NOTE:JK: lock only template g_rec_mutex_lock(template_stream_mutex); template_stream = template->stream; stream = audio_signal->stream; while(template_stream != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, 0, template_stream->data, 1, 0, buffer_size, copy_mode); /* iterate */ stream = stream->next; template_stream = template_stream->next; } g_rec_mutex_unlock(template_stream_mutex); } /** * ags_audio_signal_feed: * @audio_signal: the #AgsAudioSignal * @template: the template #AgsAudioSignal * @frame_count: the new frame count * * Feed audio signal to grow upto frame count. * * Since: 3.0.0 */ void ags_audio_signal_feed(AgsAudioSignal *audio_signal, AgsAudioSignal *template, guint frame_count) { GObject *output_soundcard; GList *list_start, *list; GList *stream, *template_stream; guint template_samplerate, samplerate; guint template_buffer_size, buffer_size; guint template_format, format; gdouble delay; guint attack; guint old_length; guint old_frame_count; guint last_frame, old_last_frame; guint loop_start, loop_end; guint new_last_frame; guint new_loop_start, new_loop_end; guint template_length; guint loop_length; guint loop_frame_count; guint n_frames; guint copy_n_frames; guint nth_loop; guint i, j; guint copy_mode; gboolean initial_reset; GRecMutex *audio_signal_mutex; GRecMutex *template_mutex; GRecMutex *template_stream_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal) || !AGS_IS_AUDIO_SIGNAL(template)){ return; } /* get audio signal mutex */ template_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(template); audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); template_stream_mutex = AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(template); /* get some fields */ g_rec_mutex_lock(template_mutex); output_soundcard = template->output_soundcard; template_samplerate = template->samplerate; template_buffer_size = template->buffer_size; template_format = template->format; last_frame = template->last_frame; loop_start = template->loop_start; loop_end = template->loop_end; template_length = template->length; g_rec_mutex_unlock(template_mutex); /* get some fields */ g_rec_mutex_lock(audio_signal_mutex); buffer_size = audio_signal->buffer_size; format = audio_signal->format; samplerate = audio_signal->samplerate; delay = audio_signal->delay; attack = audio_signal->attack; old_length = audio_signal->length; old_last_frame = audio_signal->last_frame; old_frame_count = old_last_frame + (old_length * audio_signal->buffer_size) - audio_signal->first_frame; g_rec_mutex_unlock(audio_signal_mutex); /* resize */ if(loop_end > loop_start){ loop_length = loop_end - loop_start; if((frame_count - loop_start) > (last_frame - loop_end) && last_frame >= loop_end){ loop_frame_count = (frame_count - loop_start) - (last_frame - loop_end); }else{ loop_frame_count = loop_length; } ags_audio_signal_stream_safe_resize(audio_signal, (guint) ceil(frame_count / buffer_size)); }else{ loop_frame_count = 0; ags_audio_signal_stream_safe_resize(audio_signal, (guint) ceil(frame_count / buffer_size)); } if(template_buffer_size != buffer_size || template_samplerate != samplerate){ g_warning("can't resample"); return; } /* apply delay and attack */ new_last_frame = (((guint)(delay * buffer_size) + attack + last_frame) % buffer_size); new_loop_start = ((guint) (delay * buffer_size) + attack + loop_start); new_loop_end = ((guint)(delay * buffer_size) + attack + loop_end); new_last_frame = ((guint) (delay * buffer_size) + frame_count + attack) % buffer_size; g_object_set(audio_signal, "last-frame", new_last_frame, NULL); if(template_length == 0){ return; } /* loop related copying */ copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(template_format)); /* generic copying */ stream = g_list_nth(audio_signal->stream, (guint) ((delay * buffer_size) + attack) / buffer_size); g_rec_mutex_lock(template_stream_mutex); template_stream = template->stream; initial_reset = TRUE; for(i = 0, j = attack, nth_loop = 0; i < frame_count && stream != NULL && template_stream != NULL;){ /* compute count of frames to copy */ copy_n_frames = buffer_size; if(loop_start < loop_end && i + copy_n_frames < loop_start + loop_frame_count){ if(j + copy_n_frames > loop_end){ copy_n_frames = loop_end - j; } } if((i % buffer_size) + copy_n_frames > buffer_size){ copy_n_frames = buffer_size - (i % buffer_size); } if((j % buffer_size) + copy_n_frames > buffer_size){ copy_n_frames = buffer_size - (j % buffer_size); } if(i + copy_n_frames > frame_count){ copy_n_frames = frame_count - i; } if(initial_reset && i + copy_n_frames >= old_frame_count){ copy_n_frames = old_frame_count - i; initial_reset = FALSE; } /* copy */ if(i >= old_frame_count){ ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, i % buffer_size, template_stream->data, 1, j % buffer_size, copy_n_frames, copy_mode); } if((i + copy_n_frames) % buffer_size == 0){ stream = stream->next; } if((j + copy_n_frames) % buffer_size == 0){ template_stream = template_stream->next; } i += copy_n_frames; if(loop_start < loop_end){ if(j + copy_n_frames == loop_end && i + copy_n_frames < loop_start + loop_frame_count){ template_stream = g_list_nth(template->stream, floor(loop_start / buffer_size)); j = loop_start; nth_loop++; }else{ j += copy_n_frames; } }else{ j += copy_n_frames; } } g_rec_mutex_unlock(template_stream_mutex); } /** * ags_audio_signal_get_note: * @audio_signal: the #AgsAudioSignal * * Get note. * * Returns: (element-type AgsAudio.Note) (transfer full): the #GList-struct containig #AgsNote * * Since: 3.1.0 */ GList* ags_audio_signal_get_note(AgsAudioSignal *audio_signal) { GList *note; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return(NULL); } g_object_get(audio_signal, "note", ¬e, NULL); return(note); } /** * ags_audio_signal_set_note: * @audio_signal: the #AgsAudioSignal * @note: (element-type AgsAudio.Note) (transfer full): the #GList-struct containing #AgsNote * * Set note by replacing existing. * * Since: 3.1.0 */ void ags_audio_signal_set_note(AgsAudioSignal *audio_signal, GList *note) { GList *start_note; GRecMutex *audio_signal_mutex; if(!AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio_signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(audio_signal); g_rec_mutex_lock(audio_signal_mutex); start_note = audio_signal->note; audio_signal->note = note; g_rec_mutex_unlock(audio_signal_mutex); g_list_free_full(start_note, (GDestroyNotify) g_object_unref); } void ags_audio_signal_real_add_note(AgsAudioSignal *audio_signal, GObject *note) { if(g_list_find(audio_signal->note, note) == NULL){ g_object_ref(note); audio_signal->note = g_list_prepend(audio_signal->note, note); } } /** * ags_audio_signal_add_note: * @audio_signal: the #AgsAudioSignal * @note: the #AgsNote * * Add note to @audio_signal. * * Since: 3.0.0 */ void ags_audio_signal_add_note(AgsAudioSignal *audio_signal, GObject *note) { g_return_if_fail(AGS_IS_AUDIO_SIGNAL(audio_signal)); g_object_ref(G_OBJECT(audio_signal)); g_signal_emit(G_OBJECT(audio_signal), audio_signal_signals[ADD_NOTE], 0, note); g_object_unref(G_OBJECT(audio_signal)); } void ags_audio_signal_real_remove_note(AgsAudioSignal *audio_signal, GObject *note) { if(g_list_find(audio_signal->note, note) != NULL){ audio_signal->note = g_list_remove(audio_signal->note, note); g_object_unref(note); } } /** * ags_audio_signal_remove_note: * @audio_signal: the #AgsAudioSignal * @note: the #AgsNote * * Remove note from @audio_signal. * * Since: 3.0.0 */ void ags_audio_signal_remove_note(AgsAudioSignal *audio_signal, GObject *note) { g_return_if_fail(AGS_IS_AUDIO_SIGNAL(audio_signal)); g_object_ref(G_OBJECT(audio_signal)); g_signal_emit(G_OBJECT(audio_signal), audio_signal_signals[REMOVE_NOTE], 0, note); g_object_unref(G_OBJECT(audio_signal)); } /** * ags_audio_signal_get_template: * @audio_signal: (element-type AgsAudio.AudioSignal) (transfer none): the #GList-struct containing #AgsAudioSignal * * Retrieve the template audio signal. * * Returns: (transfer full): the template #AgsAudioSignal or %NULL if not found * * Since: 3.0.0 */ AgsAudioSignal* ags_audio_signal_get_template(GList *audio_signal) { while(audio_signal != NULL){ /* check flags */ if(ags_audio_signal_test_flags(audio_signal->data, AGS_AUDIO_SIGNAL_TEMPLATE)){ g_object_ref(audio_signal->data); return(audio_signal->data); } /* iterate */ audio_signal = audio_signal->next; } return(NULL); } /** * ags_audio_signal_get_rt_template: * @audio_signal: (element-type AgsAudio.AudioSignal) (transfer none): a #GList-struct containing #AgsAudioSignal * * Retrieve the realtime template audio signal. * * Returns: (element-type AgsAudio.AudioSignal) (transfer full): the rt-templates as #GList-struct containing #AgsAudioSignal * * Since: 3.0.0 */ GList* ags_audio_signal_get_rt_template(GList *audio_signal) { GList *rt_template; rt_template = NULL; while(audio_signal != NULL){ /* check flags */ if(ags_audio_signal_test_flags(audio_signal->data, AGS_AUDIO_SIGNAL_RT_TEMPLATE)){ g_object_ref(audio_signal->data); rt_template = g_list_prepend(rt_template, audio_signal->data); } /* iterate */ audio_signal = audio_signal->next; } rt_template = g_list_reverse(rt_template); return(rt_template); } /** * ags_audio_signal_find_by_recall_id: * @audio_signal: (element-type AgsAudio.AudioSignal) (transfer none): a #GList-struct containing #AgsAudioSignal * @recall_id: matching #AgsRecallID * * Retrieve next audio signal refering to @recall_id * * Returns: (element-type AgsAudio.AudioSignal) (transfer none): matching #GList-struct containing #AgsAudioSignal * * Since: 3.0.0 */ GList* ags_audio_signal_find_by_recall_id(GList *audio_signal, GObject *recall_id) { AgsAudioSignal *current_audio_signal; AgsRecallID *current_recall_id; GRecMutex *audio_signal_mutex; while(audio_signal != NULL){ current_audio_signal = audio_signal->data; /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(current_audio_signal); /* get some fields */ g_rec_mutex_lock(audio_signal_mutex); current_recall_id = (AgsRecallID *) current_audio_signal->recall_id; g_rec_mutex_unlock(audio_signal_mutex); /* check recall id */ if(current_recall_id == (AgsRecallID *) recall_id){ return(audio_signal); } /* iterate */ audio_signal = audio_signal->next; } return(NULL); } /** * ags_audio_signal_find_stream_current: * @audio_signal: (element-type AgsAudio.AudioSignal) (transfer none): the #GList-struct containing #AgsAudioSignal * @recall_id: the matching #AgsRecallID * * Retrieve next current stream of #AgsAudioSignal list. Warning this function does not * lock the stream mutex. * * Returns: (element-type AgsAudio.AudioSignal) (transfer none): next #GList-struct matching #AgsRecallID * * Since: 3.0.0 */ GList* ags_audio_signal_find_stream_current(GList *audio_signal, GObject *recall_id) { AgsAudioSignal *current_audio_signal; AgsRecallID *current_recall_id; GList *stream_current; while((audio_signal = ags_audio_signal_find_by_recall_id(audio_signal, recall_id)) != NULL){ current_audio_signal = audio_signal->data; /* get some fields */ stream_current = current_audio_signal->stream_current; if(stream_current != NULL){ return(audio_signal); } /* iterate */ audio_signal = audio_signal->next; } return(NULL); } /** * ags_audio_signal_is_active: * @audio_signal: (element-type AgsAudio.AudioSignal) (transfer none): the #GList-struct containing #AgsAudioSignal * @recall_id: the #AgsRecallID * * Check if is active. * * Returns: %TRUE if related audio signal to recall id is available, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audio_signal_is_active(GList *audio_signal, GObject *recall_id) { AgsAudioSignal *current_audio_signal; AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context, *recycling_context; GRecMutex *audio_signal_mutex; GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } /* get audio signal mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get recycling context */ g_rec_mutex_lock(recall_id_mutex); recycling_context = AGS_RECALL_ID(recall_id)->recycling_context; g_rec_mutex_unlock(recall_id_mutex); while(audio_signal != NULL){ current_audio_signal = audio_signal->data; /* get audio signal mutex */ audio_signal_mutex = AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(current_audio_signal); /* get some fields */ g_rec_mutex_lock(audio_signal_mutex); current_recall_id = (AgsRecallID *) current_audio_signal->recall_id; g_rec_mutex_unlock(audio_signal_mutex); /* get current recycling context */ current_recycling_context = NULL; if(current_recall_id != NULL){ /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(recall_id_mutex); } if(current_recycling_context == recycling_context){ return(TRUE); } /* iterate */ audio_signal = audio_signal->next; } return(FALSE); } /** * ags_audio_signal_new: * @output_soundcard: the assigned output #AgsSoundcard * @recycling: the #AgsRecycling * @recall_id: the #AgsRecallID, it can be NULL if %AGS_AUDIO_SIGNAL_TEMPLATE is set * * Creates a #AgsAudioSignal, with defaults of @output_soundcard, linking @recycling tree * and refering to @recall_id. * * Returns: a new #AgsAudioSignal * * Since: 3.0.0 */ AgsAudioSignal* ags_audio_signal_new(GObject *output_soundcard, GObject *recycling, GObject *recall_id) { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) g_object_new(AGS_TYPE_AUDIO_SIGNAL, "output-soundcard", output_soundcard, "recycling", recycling, "recall-id", recall_id, NULL); return(audio_signal); } /** * ags_audio_signal_new_with_length: * @output_soundcard: the assigned output #AgsSoundcard * @recycling: the #AgsRecycling * @recall_id: the #AgsRecallID, it can be NULL if %AGS_AUDIO_SIGNAL_TEMPLATE is set * @length: audio data frame count * * Creates a #AgsAudioSignal, with defaults of @soundcard, linking @recycling tree * and refering to @recall_id. * The audio data is tiled to @length frame count. * * Returns: a new #AgsAudioSignal * * Since: 3.0.0 */ AgsAudioSignal* ags_audio_signal_new_with_length(GObject *output_soundcard, GObject *recycling, GObject *recall_id, guint length) { AgsAudioSignal *audio_signal, *template; audio_signal = (AgsAudioSignal *) g_object_new(AGS_TYPE_AUDIO_SIGNAL, "output-soundcard", output_soundcard, "recycling", recycling, "recall-id", recall_id, NULL); ags_audio_signal_stream_resize(audio_signal, length); return(audio_signal); } gsequencer-3.1.3/ags/audio/ags_recall_dependency.c0000644000175000017500000003135113607210263017114 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_recall_dependency_class_init(AgsRecallDependencyClass *recall_dependency); void ags_recall_dependency_init(AgsRecallDependency *recall_dependency); void ags_recall_dependency_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_dependency_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_dependency_dispose(GObject *gobject); void ags_recall_dependency_finalize(GObject *gobject); /** * SECTION:ags_recall_dependency * @short_description: recall dependency * @title: AgsRecallDependency * @section_id: * @include: ags/audio/ags_recall_dependency.h * * #AgsRecallDependency specifies dependencies on other recalls. Dependencies * are resolved during initialization. */ enum{ PROP_0, PROP_DEPENDENCY, }; static gpointer ags_recall_dependency_parent_class = NULL; GType ags_recall_dependency_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_dependency = 0; static const GTypeInfo ags_recall_dependency_info = { sizeof(AgsRecallDependencyClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_dependency_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRecallDependency), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_dependency_init, }; ags_type_recall_dependency = g_type_register_static(G_TYPE_OBJECT, "AgsRecallDependency", &ags_recall_dependency_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_dependency); } return g_define_type_id__volatile; } void ags_recall_dependency_class_init(AgsRecallDependencyClass *recall_dependency) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_dependency_parent_class = g_type_class_peek_parent(recall_dependency); gobject = (GObjectClass *) recall_dependency; gobject->set_property = ags_recall_dependency_set_property; gobject->get_property = ags_recall_dependency_get_property; gobject->dispose = ags_recall_dependency_dispose; gobject->finalize = ags_recall_dependency_finalize; /* properties */ /** * AgsRecallDependency:dependency: * * The dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("dependency", i18n_pspec("dependency of recall"), i18n_pspec("A dependency of the recall"), AGS_TYPE_RECALL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEPENDENCY, param_spec); } void ags_recall_dependency_init(AgsRecallDependency *recall_dependency) { recall_dependency->flags = 0; /* recall dependency mutex */ g_rec_mutex_init(&(recall_dependency->obj_mutex)); /* dependency */ recall_dependency->dependency = NULL; } void ags_recall_dependency_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallDependency *recall_dependency; GRecMutex *recall_dependency_mutex; recall_dependency = AGS_RECALL_DEPENDENCY(gobject); /* get recall dependency mutex */ recall_dependency_mutex = AGS_RECALL_DEPENDENCY_GET_OBJ_MUTEX(recall_dependency); switch(prop_id){ case PROP_DEPENDENCY: { AgsRecall *dependency; dependency = (AgsRecall *) g_value_get_object(value); g_rec_mutex_lock(recall_dependency_mutex); if(recall_dependency->dependency == (GObject *) dependency){ g_rec_mutex_unlock(recall_dependency_mutex); return; } if(recall_dependency->dependency != NULL){ g_object_unref(G_OBJECT(recall_dependency->dependency)); } if(dependency != NULL){ g_object_ref(G_OBJECT(dependency)); } recall_dependency->dependency = (GObject *) dependency; g_rec_mutex_unlock(recall_dependency_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_dependency_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallDependency *recall_dependency; GRecMutex *recall_dependency_mutex; recall_dependency = AGS_RECALL_DEPENDENCY(gobject); /* get recall dependency mutex */ recall_dependency_mutex = AGS_RECALL_DEPENDENCY_GET_OBJ_MUTEX(recall_dependency); switch(prop_id){ case PROP_DEPENDENCY: { g_rec_mutex_lock(recall_dependency_mutex); g_value_set_object(value, recall_dependency->dependency); g_rec_mutex_unlock(recall_dependency_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_dependency_dispose(GObject *gobject) { AgsRecallDependency *recall_dependency; recall_dependency = AGS_RECALL_DEPENDENCY(gobject); /* dependency */ if(recall_dependency->dependency != NULL){ g_object_unref(recall_dependency->dependency); recall_dependency->dependency = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_dependency_parent_class)->dispose(gobject); } void ags_recall_dependency_finalize(GObject *gobject) { AgsRecallDependency *recall_dependency; recall_dependency = AGS_RECALL_DEPENDENCY(gobject); /* dependency */ if(recall_dependency->dependency != NULL){ g_object_unref(recall_dependency->dependency); } /* call parent */ G_OBJECT_CLASS(ags_recall_dependency_parent_class)->finalize(gobject); } /** * ags_recall_dependency_find_dependency: * @recall_dependency: (element-type AgsAudio.RecallDependency) (transfer none): the #GList-struct containing #AgsRecallDependency * @dependency: the #AgsRecall depending on * * Retrieve dependency. * * Returns: (element-type AgsAudio.RecallDependency) (transfer none): next matching #GList-struct or %NULL. * * Since: 3.0.0 */ GList* ags_recall_dependency_find_dependency(GList *recall_dependency, GObject *dependency) { while(recall_dependency != NULL){ GObject *current_dependency; gboolean success; g_object_get(recall_dependency->data, "dependency", ¤t_dependency, NULL); success = (current_dependency == dependency) ? TRUE: FALSE; g_object_unref(current_dependency); if(success){ return(recall_dependency); } recall_dependency = recall_dependency->next; } return(NULL); } /** * ags_recall_dependency_find_dependency_by_provider: * @recall_dependency: (element-type AgsAudio.RecallDependency) (transfer none): the #GList-struct containing #AgsRecallDependency * @provider: the object providing recall, like #AgsAudio or #AgsChannel * * Retrieve dependency by provider. * * Returns: (element-type AgsAudio.RecallDependency) (transfer none): next matching #GList-struct or %NULL. * * Since: 3.0.0 */ GList* ags_recall_dependency_find_dependency_by_provider(GList *recall_dependency, GObject *provider) { while(recall_dependency != NULL){ GObject *current_dependency; gboolean success; g_object_get(recall_dependency->data, "dependency", ¤t_dependency, NULL); if(AGS_IS_CHANNEL(provider) && AGS_IS_RECALL_CHANNEL_RUN(current_dependency)){ AgsChannel *channel; g_object_get(current_dependency, "source", &channel, NULL); success = (channel == AGS_CHANNEL(provider)) ? TRUE: FALSE; g_object_unref(channel); if(success){ g_object_unref(current_dependency); return(recall_dependency); } } if(AGS_IS_AUDIO(provider) && AGS_IS_RECALL_AUDIO_RUN(current_dependency)){ AgsAudio *audio; g_object_get(current_dependency, "audio", &audio, NULL); success = (audio == AGS_AUDIO(provider)) ? TRUE: FALSE; g_object_unref(audio); if(success){ g_object_unref(current_dependency); return(recall_dependency); } } g_object_unref(current_dependency); recall_dependency = recall_dependency->next; } return(NULL); } /** * ags_recall_dependency_resolve: * @recall_dependency: an #AgsRecallDependency * @recall_id: the #AgsRecallID refering to * * Resolve dependency. * * Returns: (transfer none): the #AgsRecall dependency. * * Since: 3.0.0 */ GObject* ags_recall_dependency_resolve(AgsRecallDependency *recall_dependency, AgsRecallID *recall_id) { AgsRecallContainer *recall_container; AgsRecall *dependency; GObject *retval; g_object_get(recall_dependency, "dependency", &dependency, NULL); if(dependency == NULL){ return(NULL); } g_object_get(dependency, "recall-container", &recall_container, NULL); if(recall_container == NULL){ g_object_unref(dependency); return(NULL); } retval = NULL; if(AGS_IS_RECALL_AUDIO(dependency)){ GObject *recall_audio; g_object_get(recall_container, "recall-audio", &recall_audio, NULL); retval = recall_audio; g_object_unref(recall_audio); }else if(AGS_IS_RECALL_AUDIO_RUN(dependency)){ AgsRecyclingContext *recycling_context; GObject *recall_audio_run; GList *list_start, *list; if(recall_id == NULL){ g_message("dependency resolve: recall_id == NULL"); goto ags_recall_dependency_resolve_END; } g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); list = ags_recall_find_recycling_context(list_start, (GObject *) recycling_context); if(list != NULL){ recall_audio_run = list->data; retval = recall_audio_run; } g_object_unref(recycling_context); g_list_free_full(list_start, g_object_unref); }else if(AGS_IS_RECALL_CHANNEL(dependency)){ AgsChannel *source; GObject *recall_channel; GList *list_start, *list; g_object_get(recall_container, "recall-channel", &list_start, NULL); g_object_get(dependency, "source", &source, NULL); list = ags_recall_find_provider(list_start, (GObject *) source); if(list != NULL){ recall_channel = list->data; retval = recall_channel; } g_object_unref(source); g_list_free_full(list_start, g_object_unref); }else if(AGS_IS_RECALL_CHANNEL_RUN(dependency)){ AgsRecyclingContext *recycling_context; GObject *recall_channel_run; GList *list_start, *list; if(recall_id == NULL){ g_message("dependency resolve: recall_id == NULL"); goto ags_recall_dependency_resolve_END; } g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recall_container, "recall-channel-run", &list_start, NULL); list = ags_recall_find_recycling_context(list_start, (GObject *) recycling_context); if(list != NULL){ recall_channel_run = list->data; retval = recall_channel_run; } g_object_unref(recycling_context); g_list_free_full(list_start, g_object_unref); } ags_recall_dependency_resolve_END: g_object_unref(dependency); g_object_unref(recall_container); if(retval == NULL){ g_warning("dependency not found!"); } return(retval); } /** * ags_recall_dependency_new: * @dependency: the #AgsRecall depending on * * Creates an #AgsRecallDependency * * Returns: the new #AgsRecallDependency * * Since: 3.0.0 */ AgsRecallDependency* ags_recall_dependency_new(GObject *dependency) { AgsRecallDependency *recall_dependency; recall_dependency = (AgsRecallDependency *) g_object_new(AGS_TYPE_RECALL_DEPENDENCY, "dependency", dependency, NULL); return(recall_dependency); } gsequencer-3.1.3/ags/audio/recall/0000755000175000017500000000000013622252263014000 500000000000000gsequencer-3.1.3/ags/audio/recall/ags_mute_channel_run.c0000644000175000017500000000726213607210263020250 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_mute_channel_run_class_init(AgsMuteChannelRunClass *mute_channel_run); void ags_mute_channel_run_init(AgsMuteChannelRun *mute_channel_run); void ags_mute_channel_run_finalize(GObject *gobject); /** * SECTION:ags_mute_channel_run * @short_description: mutes channel * @title: AgsMuteChannelRun * @section_id: * @include: ags/audio/recall/ags_mute_channel_run.h * * The #AgsMuteChannelRun class mutes the channel. */ static gpointer ags_mute_channel_run_parent_class = NULL; GType ags_mute_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mute_channel_run = 0; static const GTypeInfo ags_mute_channel_run_info = { sizeof (AgsMuteChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mute_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMuteChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mute_channel_run_init, }; ags_type_mute_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsMuteChannelRun", &ags_mute_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_mute_channel_run); } return g_define_type_id__volatile; } void ags_mute_channel_run_class_init(AgsMuteChannelRunClass *mute_channel_run) { GObjectClass *gobject; ags_mute_channel_run_parent_class = g_type_class_peek_parent(mute_channel_run); /* GObjectClass */ gobject = (GObjectClass *) mute_channel_run; gobject->finalize = ags_mute_channel_run_finalize; } void ags_mute_channel_run_init(AgsMuteChannelRun *mute_channel_run) { ags_recall_set_ability_flags((AgsRecall *) mute_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(mute_channel_run)->name = "ags-mute"; AGS_RECALL(mute_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(mute_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(mute_channel_run)->xml_type = "ags-mute-channel-run"; AGS_RECALL(mute_channel_run)->child_type = AGS_TYPE_MUTE_RECYCLING; } void ags_mute_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_mute_channel_run_parent_class)->finalize(gobject); } /** * ags_mute_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsMuteChannelRun * * Returns: the new #AgsMuteChannelRun * * Since: 3.0.0 */ AgsMuteChannelRun* ags_mute_channel_run_new(AgsChannel *source) { AgsMuteChannelRun *mute_channel_run; mute_channel_run = (AgsMuteChannelRun *) g_object_new(AGS_TYPE_MUTE_CHANNEL_RUN, "source", source, NULL); return(mute_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_audio.c0000644000175000017500000007264513607210263020577 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_capture_wave_audio_class_init(AgsCaptureWaveAudioClass *capture_wave_audio); void ags_capture_wave_audio_init(AgsCaptureWaveAudio *capture_wave_audio); void ags_capture_wave_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_capture_wave_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_capture_wave_audio_finalize(GObject *gobject); /** * SECTION:ags_capture_wave_audio * @short_description: capture audio wave * @title: AgsCaptureWaveAudio * @section_id: * @include: ags/audio/recall/ags_capture_wave_audio.h * * The #AgsCaptureWaveAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_PLAYBACK, PROP_REPLACE, PROP_RECORD, PROP_FILENAME, PROP_FILE_AUDIO_CHANNELS, PROP_FILE_SAMPLERATE, PROP_FILE_BUFFER_SIZE, PROP_FILE_FORMAT, PROP_WAVE_LOOP, PROP_WAVE_LOOP_START, PROP_WAVE_LOOP_END, }; static gpointer ags_capture_wave_audio_parent_class = NULL; static const gchar *ags_capture_wave_audio_plugin_name = "ags-capture-wave"; static const gchar *ags_capture_wave_audio_specifier[] = { "./playback[0]", "./replace[0]", "./record[0]", "./filename[0]", "./file-audio-channels[0]", "./file-samplerate[0]", "./file-buffer-size[0]", "./file-format[0]", "./wave_loop[0]", "./wave_loop_start[0]", "./wave_loop_end[0]", }; static const gchar *ags_capture_wave_audio_control_port[] = { "1/11", "2/11", "3/11", "4/11", "5/11", "6/11", "7/11", "8/11", "9/11", "10/11", "11/11", }; GType ags_capture_wave_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_capture_wave_audio = 0; static const GTypeInfo ags_capture_wave_audio_info = { sizeof(AgsCaptureWaveAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_capture_wave_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof(AgsCaptureWaveAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_capture_wave_audio_init, }; ags_type_capture_wave_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsCaptureWaveAudio", &ags_capture_wave_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_capture_wave_audio); } return g_define_type_id__volatile; } void ags_capture_wave_audio_class_init(AgsCaptureWaveAudioClass *capture_wave_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_capture_wave_audio_parent_class = g_type_class_peek_parent(capture_wave_audio); /* GObjectClass */ gobject = (GObjectClass *) capture_wave_audio; gobject->set_property = ags_capture_wave_audio_set_property; gobject->get_property = ags_capture_wave_audio_get_property; gobject->finalize = ags_capture_wave_audio_finalize; /* properties */ /** * AgsCaptureWaveAudio:playback: * * The playback port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("playback", i18n_pspec("if do playback"), i18n_pspec("If playback should be performed"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAYBACK, param_spec); /** * AgsCaptureWaveAudio:replace: * * The replace port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("replace", i18n_pspec("if do replace"), i18n_pspec("If audio data should be replaced"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REPLACE, param_spec); /** * AgsCaptureWaveAudio:record: * * The record port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("record", i18n_pspec("if do record"), i18n_pspec("If record data for later use should be done"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECORD, param_spec); /** * AgsCaptureWaveAudio:filename: * * The filename port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("filename", i18n_pspec("filename of record"), i18n_pspec("The filename of record"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsCaptureWaveAudio:file-audio-channels: * * The file's audio channels port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file-audio-channels", i18n_pspec("file audio channels"), i18n_pspec("Audio channels count of file"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_AUDIO_CHANNELS, param_spec); /** * AgsCaptureWaveAudio:file-samplerate: * * The file's samplerate port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file-samplerate", i18n_pspec("file samplerate"), i18n_pspec("Samplerate to use of file"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_SAMPLERATE, param_spec); /** * AgsCaptureWaveAudio:file-buffer-size: * * The file's buffer size port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file-buffer-size", i18n_pspec("files buffer size"), i18n_pspec("Buffer size to use of file"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_BUFFER_SIZE, param_spec); /** * AgsCaptureWaveAudio:format: * * The file's format port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file-format", i18n_pspec("file format"), i18n_pspec("Format to use of file"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_FORMAT, param_spec); /** * AgsCaptureWaveAudio:wave-loop: * * Count until loop-end and start at loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-loop", i18n_pspec("wave loop capturing"), i18n_pspec("Capture wave in a endless loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP, param_spec); /** * AgsCaptureWaveAudio:wave-loop-start: * * The wave's loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave_loop_start", i18n_pspec("start beat of loop"), i18n_pspec("The start beat of the wave loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP_START, param_spec); /** * AgsCaptureWaveAudio:wave-loop-end: * * The wave's loop-end. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-loop-end", i18n_pspec("end beat of wave loop"), i18n_pspec("The end beat of the wave loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP_END, param_spec); } void ags_capture_wave_audio_init(AgsCaptureWaveAudio *capture_wave_audio) { GList *port; guint i; AGS_RECALL(capture_wave_audio)->name = "ags-capture-wave"; AGS_RECALL(capture_wave_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(capture_wave_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(capture_wave_audio)->xml_type = "ags-capture-wave-audio"; port = NULL; i = 0; /* playback */ capture_wave_audio->playback = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, NULL); g_object_ref(capture_wave_audio->playback); capture_wave_audio->playback->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, capture_wave_audio->playback); g_object_ref(capture_wave_audio->playback); i++; /* replace */ capture_wave_audio->replace = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, NULL); g_object_ref(capture_wave_audio->replace); capture_wave_audio->replace->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, capture_wave_audio->replace); g_object_ref(capture_wave_audio->replace); i++; /* record */ capture_wave_audio->record = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, NULL); g_object_ref(capture_wave_audio->record); capture_wave_audio->record->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, capture_wave_audio->record); g_object_ref(capture_wave_audio->record); i++; /* filename */ capture_wave_audio->filename = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_POINTER, NULL); g_object_ref(capture_wave_audio->filename); capture_wave_audio->filename->port_value.ags_port_pointer = NULL; /* add to port */ port = g_list_prepend(port, capture_wave_audio->filename); g_object_ref(capture_wave_audio->filename); i++; /* audio channels */ capture_wave_audio->file_audio_channels = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, NULL); g_object_ref(capture_wave_audio->file_audio_channels); capture_wave_audio->file_audio_channels->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS; /* add to port */ port = g_list_prepend(port, capture_wave_audio->file_audio_channels); g_object_ref(capture_wave_audio->file_audio_channels); i++; /* samplerate */ capture_wave_audio->file_samplerate = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, NULL); g_object_ref(capture_wave_audio->file_samplerate); capture_wave_audio->file_samplerate->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; /* add to port */ port = g_list_prepend(port, capture_wave_audio->file_samplerate); g_object_ref(capture_wave_audio->file_samplerate); i++; /* buffer size */ capture_wave_audio->file_buffer_size = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, NULL); g_object_ref(capture_wave_audio->file_buffer_size); capture_wave_audio->file_buffer_size->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; /* add to port */ port = g_list_prepend(port, capture_wave_audio->file_buffer_size); g_object_ref(capture_wave_audio->file_buffer_size); i++; /* format */ capture_wave_audio->file_format = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, NULL); g_object_ref(capture_wave_audio->file_format); capture_wave_audio->file_format->port_value.ags_port_uint = AGS_SOUNDCARD_DEFAULT_FORMAT; /* add to port */ port = g_list_prepend(port, capture_wave_audio->file_format); g_object_ref(capture_wave_audio->file_format); i++; /* wave loop */ capture_wave_audio->wave_loop = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(capture_wave_audio->wave_loop); capture_wave_audio->wave_loop->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, capture_wave_audio->wave_loop); g_object_ref(capture_wave_audio->wave_loop); i++; /* wave-loop-start */ capture_wave_audio->wave_loop_start = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(capture_wave_audio->wave_loop_start); capture_wave_audio->wave_loop_start->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, capture_wave_audio->wave_loop_start); g_object_ref(capture_wave_audio->wave_loop_start); i++; /* wave-loop-end */ capture_wave_audio->wave_loop_end = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_audio_plugin_name, "specifier", ags_capture_wave_audio_specifier[i], "control-port", ags_capture_wave_audio_control_port[i], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(capture_wave_audio->wave_loop_end); capture_wave_audio->wave_loop_end->port_value.ags_port_uint = 64; /* add to port */ port = g_list_prepend(port, capture_wave_audio->wave_loop_end); g_object_ref(capture_wave_audio->wave_loop_end); i++; /* set port */ AGS_RECALL(capture_wave_audio)->port = port; /* the audio file */ g_rec_mutex_init(&(capture_wave_audio->audio_file_mutex)); capture_wave_audio->audio_file = NULL; } void ags_capture_wave_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCaptureWaveAudio *capture_wave_audio; GRecMutex *recall_mutex; capture_wave_audio = AGS_CAPTURE_WAVE_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(capture_wave_audio); switch(prop_id){ case PROP_PLAYBACK: { AgsPort *playback; playback = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->playback == playback){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->playback != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->playback)); } if(playback != NULL){ g_object_ref(G_OBJECT(playback)); } capture_wave_audio->playback = playback; g_rec_mutex_unlock(recall_mutex); } break; case PROP_REPLACE: { AgsPort *replace; replace = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->replace == replace){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->replace != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->replace)); } if(replace != NULL){ g_object_ref(G_OBJECT(replace)); } capture_wave_audio->replace = replace; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECORD: { AgsPort *record; record = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->record == record){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->record != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->record)); } if(record != NULL){ g_object_ref(G_OBJECT(record)); } capture_wave_audio->record = record; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILENAME: { AgsPort *filename; filename = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->filename == filename){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->filename != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->filename)); } if(filename != NULL){ g_object_ref(G_OBJECT(filename)); } capture_wave_audio->filename = filename; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_AUDIO_CHANNELS: { AgsPort *file_audio_channels; file_audio_channels = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->file_audio_channels == file_audio_channels){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->file_audio_channels != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->file_audio_channels)); } if(file_audio_channels != NULL){ g_object_ref(G_OBJECT(file_audio_channels)); } capture_wave_audio->file_audio_channels = file_audio_channels; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_SAMPLERATE: { AgsPort *file_samplerate; file_samplerate = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->file_samplerate == file_samplerate){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->file_samplerate != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->file_samplerate)); } if(file_samplerate != NULL){ g_object_ref(G_OBJECT(file_samplerate)); } capture_wave_audio->file_samplerate = file_samplerate; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_BUFFER_SIZE: { AgsPort *file_buffer_size; file_buffer_size = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->file_buffer_size == file_buffer_size){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->file_buffer_size != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->file_buffer_size)); } if(file_buffer_size != NULL){ g_object_ref(G_OBJECT(file_buffer_size)); } capture_wave_audio->file_buffer_size = file_buffer_size; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_FORMAT: { AgsPort *file_format; file_format = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_audio->file_format == file_format){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->file_format != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->file_format)); } if(file_format != NULL){ g_object_ref(G_OBJECT(file_format)); } capture_wave_audio->file_format = file_format; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == capture_wave_audio->wave_loop){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } capture_wave_audio->wave_loop = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_START: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == capture_wave_audio->wave_loop_start){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop_start)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } capture_wave_audio->wave_loop_start = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_END: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == capture_wave_audio->wave_loop_end){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop_end)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } capture_wave_audio->wave_loop_end = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_capture_wave_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCaptureWaveAudio *capture_wave_audio; GRecMutex *recall_mutex; capture_wave_audio = AGS_CAPTURE_WAVE_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(capture_wave_audio); switch(prop_id){ case PROP_PLAYBACK: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->playback); g_rec_mutex_unlock(recall_mutex); } break; case PROP_REPLACE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->replace); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECORD: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->record); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->filename); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_AUDIO_CHANNELS: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->file_audio_channels); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_SAMPLERATE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->file_samplerate); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_BUFFER_SIZE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->file_buffer_size); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILE_FORMAT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->file_format); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->wave_loop); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_START: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->wave_loop_start); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_END: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_audio->wave_loop_end); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_capture_wave_audio_dispose(GObject *gobject) { AgsCaptureWaveAudio *capture_wave_audio; capture_wave_audio = AGS_CAPTURE_WAVE_AUDIO(gobject); /* playback */ if(capture_wave_audio->playback != NULL){ g_object_unref(capture_wave_audio->playback); capture_wave_audio->playback = NULL; } /* replace */ if(capture_wave_audio->replace != NULL){ g_object_unref(capture_wave_audio->replace); capture_wave_audio->replace = NULL; } /* record */ if(capture_wave_audio->record != NULL){ g_object_unref(capture_wave_audio->record); capture_wave_audio->record = NULL; } /* filename */ if(capture_wave_audio->filename != NULL){ g_object_unref(capture_wave_audio->filename); capture_wave_audio->filename = NULL; } /* audio channels */ if(capture_wave_audio->file_audio_channels != NULL){ g_object_unref(capture_wave_audio->file_audio_channels); capture_wave_audio->file_audio_channels = NULL; } /* samplerate */ if(capture_wave_audio->file_samplerate != NULL){ g_object_unref(capture_wave_audio->file_samplerate); capture_wave_audio->file_samplerate = NULL; } /* buffer size */ if(capture_wave_audio->file_buffer_size != NULL){ g_object_unref(capture_wave_audio->file_buffer_size); capture_wave_audio->file_buffer_size = NULL; } /* format */ if(capture_wave_audio->file_format != NULL){ g_object_unref(capture_wave_audio->file_format); capture_wave_audio->file_format = NULL; } /* wave */ if(capture_wave_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop)); capture_wave_audio->wave_loop = NULL; } if(capture_wave_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop_start)); capture_wave_audio->wave_loop_start = NULL; } if(capture_wave_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop_end)); capture_wave_audio->wave_loop_end = NULL; } /* call parent */ G_OBJECT_CLASS(ags_capture_wave_audio_parent_class)->dispose(gobject); } void ags_capture_wave_audio_finalize(GObject *gobject) { AgsCaptureWaveAudio *capture_wave_audio; capture_wave_audio = AGS_CAPTURE_WAVE_AUDIO(gobject); /* playback */ if(capture_wave_audio->playback != NULL){ g_object_unref(capture_wave_audio->playback); } /* replace */ if(capture_wave_audio->replace != NULL){ g_object_unref(capture_wave_audio->replace); } /* record */ if(capture_wave_audio->record != NULL){ g_object_unref(capture_wave_audio->record); } /* filename */ if(capture_wave_audio->filename != NULL){ g_object_unref(capture_wave_audio->filename); } /* audio channels */ if(capture_wave_audio->file_audio_channels != NULL){ g_object_unref(capture_wave_audio->file_audio_channels); } /* samplerate */ if(capture_wave_audio->file_samplerate != NULL){ g_object_unref(capture_wave_audio->file_samplerate); } /* buffer size */ if(capture_wave_audio->file_buffer_size != NULL){ g_object_unref(capture_wave_audio->file_buffer_size); } /* format */ if(capture_wave_audio->file_format != NULL){ g_object_unref(capture_wave_audio->file_format); } /* wave */ if(capture_wave_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop)); } if(capture_wave_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop_start)); } if(capture_wave_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(capture_wave_audio->wave_loop_end)); } if(capture_wave_audio->audio_file != NULL){ g_object_unref(capture_wave_audio->audio_file); } /* call parent */ G_OBJECT_CLASS(ags_capture_wave_audio_parent_class)->finalize(gobject); } /** * ags_capture_wave_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsCaptureWaveAudio * * Returns: the new #AgsCaptureWaveAudio * * Since: 3.0.0 */ AgsCaptureWaveAudio* ags_capture_wave_audio_new(AgsAudio *audio) { AgsCaptureWaveAudio *capture_wave_audio; capture_wave_audio = (AgsCaptureWaveAudio *) g_object_new(AGS_TYPE_CAPTURE_WAVE_AUDIO, "audio", audio, NULL); return(capture_wave_audio); } gsequencer-3.1.3/ags/audio/recall/ags_loop_channel.h0000644000175000017500000000410213607210263017356 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LOOP_CHANNEL_H__ #define __AGS_LOOP_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LOOP_CHANNEL (ags_loop_channel_get_type()) #define AGS_LOOP_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LOOP_CHANNEL, AgsLoopChannel)) #define AGS_LOOP_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LOOP_CHANNEL, AgsLoopChannelClass)) #define AGS_IS_LOOP_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LOOP_CHANNEL)) #define AGS_IS_LOOP_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LOOP_CHANNEL)) #define AGS_LOOP_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LOOP_CHANNEL, AgsLoopChannelClass)) typedef struct _AgsLoopChannel AgsLoopChannel; typedef struct _AgsLoopChannelClass AgsLoopChannelClass; struct _AgsLoopChannel { AgsRecallChannel recall_channel; AgsDelayAudio *delay_audio; }; struct _AgsLoopChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_loop_channel_get_type(); AgsLoopChannel* ags_loop_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_LOOP_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_mute_audio_run.h0000644000175000017500000000403413607210263017740 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTE_AUDIO_RUN_H__ #define __AGS_MUTE_AUDIO_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTE_AUDIO_RUN (ags_mute_audio_run_get_type()) #define AGS_MUTE_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTE_AUDIO_RUN, AgsMuteAudioRun)) #define AGS_MUTE_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MUTE_AUDIO_RUN, AgsMuteAudioRun)) #define AGS_IS_MUTE_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MUTE_AUDIO_RUN)) #define AGS_IS_MUTE_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MUTE_AUDIO_RUN)) #define AGS_MUTE_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MUTE_AUDIO_RUN, AgsMuteAudioRunClass)) typedef struct _AgsMuteAudioRun AgsMuteAudioRun; typedef struct _AgsMuteAudioRunClass AgsMuteAudioRunClass; struct _AgsMuteAudioRun { AgsRecallAudioRun recall_audio_run; }; struct _AgsMuteAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_mute_audio_run_get_type(); AgsMuteAudioRun* ags_mute_audio_run_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_MUTE_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_volume_recycling.h0000644000175000017500000000415413607210263020272 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VOLUME_RECYCLING_H__ #define __AGS_VOLUME_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_VOLUME_RECYCLING (ags_volume_recycling_get_type()) #define AGS_VOLUME_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VOLUME_RECYCLING, AgsVolumeRecycling)) #define AGS_VOLUME_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VOLUME_RECYCLING, AgsVolumeRecyclingClass)) #define AGS_IS_VOLUME_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VOLUME_RECYCLING)) #define AGS_IS_VOLUME_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VOLUME_RECYCLING)) #define AGS_VOLUME_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_VOLUME_RECYCLING, AgsVolumeRecyclingClass)) typedef struct _AgsVolumeRecycling AgsVolumeRecycling; typedef struct _AgsVolumeRecyclingClass AgsVolumeRecyclingClass; struct _AgsVolumeRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsVolumeRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_volume_recycling_get_type(); AgsVolumeRecycling* ags_volume_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_VOLUME_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_volume_channel.h0000644000175000017500000000413413607210263017721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VOLUME_CHANNEL_H__ #define __AGS_VOLUME_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_VOLUME_CHANNEL (ags_volume_channel_get_type()) #define AGS_VOLUME_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VOLUME_CHANNEL, AgsVolumeChannel)) #define AGS_VOLUME_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VOLUME_CHANNEL, AgsVolumeChannelClass)) #define AGS_IS_VOLUME_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VOLUME_CHANNEL)) #define AGS_IS_VOLUME_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VOLUME_CHANNEL)) #define AGS_VOLUME_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_VOLUME_CHANNEL, AgsVolumeChannelClass)) typedef struct _AgsVolumeChannel AgsVolumeChannel; typedef struct _AgsVolumeChannelClass AgsVolumeChannelClass; struct _AgsVolumeChannel { AgsRecallChannel recall_channel; AgsPort *volume; }; struct _AgsVolumeChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_volume_channel_get_type(); AgsVolumeChannel* ags_volume_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_VOLUME_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_peak_channel.h0000644000175000017500000000466713607210263017345 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PEAK_CHANNEL_H__ #define __AGS_PEAK_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PEAK_CHANNEL (ags_peak_channel_get_type()) #define AGS_PEAK_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PEAK_CHANNEL, AgsPeakChannel)) #define AGS_PEAK_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PEAK_CHANNEL, AgsPeakChannel)) #define AGS_IS_PEAK_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PEAK_CHANNEL)) #define AGS_IS_PEAK_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PEAK_CHANNEL)) #define AGS_PEAK_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PEAK_CHANNEL, AgsPeakChannelClass)) typedef struct _AgsPeakChannel AgsPeakChannel; typedef struct _AgsPeakChannelClass AgsPeakChannelClass; struct _AgsPeakChannel { AgsRecallChannel recall_channel; GRecMutex buffer_mutex; guint samplerate; guint buffer_size; guint format; void *buffer; AgsPort *buffer_cleared; AgsPort *buffer_computed; AgsPort *scale_precision; AgsPort *peak; }; struct _AgsPeakChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_peak_channel_get_type(); void ags_peak_channel_buffer_add(AgsPeakChannel *peak_channel, void *buffer, guint samplerate, guint buffer_size, guint format); void ags_peak_channel_retrieve_peak_internal(AgsPeakChannel *peak_channel); AgsPeakChannel* ags_peak_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PEAK_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_prepare_audio_signal.c0000644000175000017500000001745713607210263021105 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_prepare_audio_signal_class_init(AgsPrepareAudioSignalClass *prepare_audio_signal); void ags_prepare_audio_signal_init(AgsPrepareAudioSignal *prepare_audio_signal); void ags_prepare_audio_signal_finalize(GObject *gobject); void ags_prepare_audio_signal_run_init_pre(AgsRecall *recall); void ags_prepare_audio_signal_run_pre(AgsRecall *recall); /** * SECTION:ags_prepare_audio_signal * @short_description: prepares audio signal * @title: AgsPrepareAudioSignal * @section_id: * @include: ags/audio/recall/ags_prepare_audio_signal.h * * The #AgsPrepareAudioSignal class prepares the audio signal. */ static gpointer ags_prepare_audio_signal_parent_class = NULL; GType ags_prepare_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_prepare_audio_signal = 0; static const GTypeInfo ags_prepare_audio_signal_info = { sizeof (AgsPrepareAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_prepare_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPrepareAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_prepare_audio_signal_init, }; ags_type_prepare_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsPrepareAudioSignal", &ags_prepare_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_prepare_audio_signal); } return g_define_type_id__volatile; } void ags_prepare_audio_signal_class_init(AgsPrepareAudioSignalClass *prepare_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_prepare_audio_signal_parent_class = g_type_class_peek_parent(prepare_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) prepare_audio_signal; gobject->finalize = ags_prepare_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) prepare_audio_signal; recall->run_init_pre = ags_prepare_audio_signal_run_init_pre; recall->run_pre = ags_prepare_audio_signal_run_pre; } void ags_prepare_audio_signal_init(AgsPrepareAudioSignal *prepare_audio_signal) { AGS_RECALL(prepare_audio_signal)->name = "ags-prepare"; AGS_RECALL(prepare_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(prepare_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(prepare_audio_signal)->xml_type = "ags-prepare-audio-signal"; AGS_RECALL(prepare_audio_signal)->port = NULL; } void ags_prepare_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_prepare_audio_signal_parent_class)->finalize(gobject); } void ags_prepare_audio_signal_run_init_pre(AgsRecall *recall) { AgsChannel *channel; AgsRecycling *recycling; AgsAudioSignal *destination; AgsRecallID *recall_id, *parent_recall_id; AgsRecyclingContext *recycling_context, *parent_recycling_context; AgsPrepareChannelRun *prepare_channel_run; AgsPrepareRecycling *prepare_recycling; AgsPrepareAudioSignal *prepare_audio_signal; GObject *output_soundcard; GList *start_list, *list; GList *stream; gdouble delay; guint attack; guint length; void (*parent_class_run_init_pre)(AgsRecall *recall); prepare_audio_signal = (AgsPrepareAudioSignal *) recall; /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_prepare_audio_signal_parent_class)->run_init_pre; /* get some fields */ ags_recall_unset_behaviour_flags(recall, AGS_SOUND_BEHAVIOUR_PERSISTENT); g_object_get(prepare_audio_signal, "parent", &prepare_recycling, "output-soundcard", &output_soundcard, "recall-id", &recall_id, NULL); g_object_get(prepare_recycling, "parent", &prepare_channel_run, NULL); g_object_get(prepare_recycling, "destination", &recycling, NULL); g_object_get(prepare_channel_run, "destination", &channel, NULL); /* recycling context */ g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(channel, "recall-id", &start_list, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); parent_recall_id = ags_recall_id_find_recycling_context(start_list, parent_recycling_context); //TODO:JK: unclear attack = 0; delay = 0.0; /* create new audio signal */ destination = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) parent_recall_id); g_object_set(prepare_audio_signal, "destination", destination, NULL); ags_recycling_create_audio_signal_with_defaults(recycling, destination, delay, attack); length = 1; // (guint) (2.0 * soundcard->delay[soundcard->tic_counter]) + 1; ags_audio_signal_stream_resize(destination, length); ags_connectable_connect(AGS_CONNECTABLE(destination)); destination->stream_current = destination->stream; ags_recycling_add_audio_signal(recycling, destination); #ifdef AGS_DEBUG g_message("prepare %x to %x", destination, parent_recall_id); g_message("creating destination"); #endif /* call parent */ parent_class_run_init_pre(recall); } void ags_prepare_audio_signal_run_pre(AgsRecall *recall) { AgsAudioSignal *destination, *source; void (*parent_class_run_pre)(AgsRecall *recall); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_prepare_audio_signal_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); /* get some fields */ g_object_get(recall, "destination", &destination, "source", &source, NULL); if(source->stream_current != NULL){ void *buffer; guint buffer_size; guint format; buffer = destination->stream_current->data; g_object_get(destination, "buffer-size", &buffer_size, "format", &format, NULL); ags_audio_buffer_util_clear_buffer(buffer, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); }else{ ags_recall_done(recall); } } /** * ags_prepare_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsPrepareAudioSignal * * Returns: thde new #AgsPrepareAudioSignal * * Since: 3.0.0 */ AgsPrepareAudioSignal* ags_prepare_audio_signal_new(AgsAudioSignal *source) { AgsPrepareAudioSignal *prepare_audio_signal; prepare_audio_signal = (AgsPrepareAudioSignal *) g_object_new(AGS_TYPE_PREPARE_AUDIO_SIGNAL, "source", source, NULL); return(prepare_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_volume_recycling.c0000644000175000017500000000723413607210263020267 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_volume_recycling_class_init(AgsVolumeRecyclingClass *volume_recycling); void ags_volume_recycling_init(AgsVolumeRecycling *volume_recycling); void ags_volume_recycling_finalize(GObject *gobject); /** * SECTION:ags_volume_recycling * @short_description: volumes recycling * @title: AgsVolumeRecycling * @section_id: * @include: ags/audio/recall/ags_volume_recycling.h * * The #AgsVolumeRecycling class volumes the recycling. */ static gpointer ags_volume_recycling_parent_class = NULL; GType ags_volume_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_volume_recycling = 0; static const GTypeInfo ags_volume_recycling_info = { sizeof (AgsVolumeRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_volume_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVolumeRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_volume_recycling_init, }; ags_type_volume_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsVolumeRecycling", &ags_volume_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_volume_recycling); } return g_define_type_id__volatile; } void ags_volume_recycling_class_init(AgsVolumeRecyclingClass *volume_recycling) { GObjectClass *gobject; ags_volume_recycling_parent_class = g_type_class_peek_parent(volume_recycling); /* GObjectClass */ gobject = (GObjectClass *) volume_recycling; gobject->finalize = ags_volume_recycling_finalize; } void ags_volume_recycling_init(AgsVolumeRecycling *volume_recycling) { AGS_RECALL(volume_recycling)->name = "ags-volume"; AGS_RECALL(volume_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(volume_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(volume_recycling)->xml_type = "ags-volume-recycling"; AGS_RECALL(volume_recycling)->port = NULL; AGS_RECALL(volume_recycling)->child_type = AGS_TYPE_VOLUME_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(volume_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_volume_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_volume_recycling_parent_class)->finalize(gobject); } /** * ags_volume_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsVolumeRecycling * * Returns: the new #AgsVolumeRecycling * * Since: 3.0.0 */ AgsVolumeRecycling* ags_volume_recycling_new(AgsRecycling *source) { AgsVolumeRecycling *volume_recycling; volume_recycling = (AgsVolumeRecycling *) g_object_new(AGS_TYPE_VOLUME_RECYCLING, "source", source, NULL); return(volume_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_play_recycling.h0000644000175000017500000000406613607210263017732 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_RECYCLING_H__ #define __AGS_PLAY_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_RECYCLING (ags_play_recycling_get_type()) #define AGS_PLAY_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_RECYCLING, AgsPlayRecycling)) #define AGS_PLAY_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_RECYCLING, AgsPlayRecyclingClass)) #define AGS_IS_PLAY_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_RECYCLING)) #define AGS_IS_PLAY_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_RECYCLING)) #define AGS_PLAY_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_RECYCLING, AgsPlayRecyclingClass)) typedef struct _AgsPlayRecycling AgsPlayRecycling; typedef struct _AgsPlayRecyclingClass AgsPlayRecyclingClass; struct _AgsPlayRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsPlayRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_play_recycling_get_type(); AgsPlayRecycling* ags_play_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_PLAY_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_record_midi_audio_run.h0000644000175000017500000000511413607210263021246 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECORD_MIDI_AUDIO_RUN_H__ #define __AGS_RECORD_MIDI_AUDIO_RUN_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECORD_MIDI_AUDIO_RUN (ags_record_midi_audio_run_get_type()) #define AGS_RECORD_MIDI_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECORD_MIDI_AUDIO_RUN, AgsRecordMidiAudioRun)) #define AGS_RECORD_MIDI_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECORD_MIDI_AUDIO_RUN, AgsRecordMidiAudioRun)) #define AGS_IS_RECORD_MIDI_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECORD_MIDI_AUDIO_RUN)) #define AGS_IS_RECORD_MIDI_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECORD_MIDI_AUDIO_RUN)) #define AGS_RECORD_MIDI_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECORD_MIDI_AUDIO_RUN, AgsRecordMidiAudioRunClass)) typedef struct _AgsRecordMidiAudioRun AgsRecordMidiAudioRun; typedef struct _AgsRecordMidiAudioRunClass AgsRecordMidiAudioRunClass; struct _AgsRecordMidiAudioRun { AgsRecallAudioRun recall_audio_run; guint flags; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *note; AgsTimestamp *timestamp; GObject *midi_file; }; struct _AgsRecordMidiAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_record_midi_audio_run_get_type(); AgsRecordMidiAudioRun* ags_record_midi_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run); G_END_DECLS #endif /*__AGS_RECORD_MIDI_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_eq10_audio_signal.c0000644000175000017500000016274513607210263020216 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . * * Introduction to Digital Filters with Audio Applications * Copyright (C) 2007-2018 Julius O. Smith III * * License: STK-4.3 * * See COPYING.stk-4.3 for further deatails * * https://ccrma.stanford.edu/~jos * * provided the foundation of the modified equalizer algorithm, this * recall is based on frequency response filter. */ #include #include #include #include #include #include #include #include #include void ags_eq10_audio_signal_class_init(AgsEq10AudioSignalClass *eq10_audio_signal); void ags_eq10_audio_signal_init(AgsEq10AudioSignal *eq10_audio_signal); void ags_eq10_audio_signal_finalize(GObject *gobject); void ags_eq10_audio_signal_run_init_pre(AgsRecall *recall); void ags_eq10_audio_signal_run_inter(AgsRecall *recall); AgsRecall* ags_eq10_audio_signal_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, GParameter *parameter); /** * SECTION:ags_eq10_audio_signal * @short_description: 10 band equalizer audio signal * @title: AgsEq10AudioSignal * @section_id: * @include: ags/audio/recall/ags_eq10_audio_signal.h * * The #AgsEq10AudioSignal class eq10s the audio signal. */ static gpointer ags_eq10_audio_signal_parent_class = NULL; GType ags_eq10_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_eq10_audio_signal = 0; static const GTypeInfo ags_eq10_audio_signal_info = { sizeof (AgsEq10AudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_eq10_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEq10AudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_eq10_audio_signal_init, }; ags_type_eq10_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsEq10AudioSignal", &ags_eq10_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_eq10_audio_signal); } return g_define_type_id__volatile; } void ags_eq10_audio_signal_class_init(AgsEq10AudioSignalClass *eq10_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_eq10_audio_signal_parent_class = g_type_class_peek_parent(eq10_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) eq10_audio_signal; gobject->finalize = ags_eq10_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) eq10_audio_signal; recall->run_init_pre = ags_eq10_audio_signal_run_init_pre; recall->run_inter = ags_eq10_audio_signal_run_inter; } void ags_eq10_audio_signal_init(AgsEq10AudioSignal *eq10_audio_signal) { AGS_RECALL(eq10_audio_signal)->name = "ags-eq10"; AGS_RECALL(eq10_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(eq10_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(eq10_audio_signal)->xml_type = "ags-eq10-audio-signal"; AGS_RECALL(eq10_audio_signal)->port = NULL; eq10_audio_signal->output_buffer = NULL; eq10_audio_signal->input_buffer = NULL; } void ags_eq10_audio_signal_finalize(GObject *gobject) { AgsEq10AudioSignal *eq10_audio_signal; eq10_audio_signal = (AgsEq10AudioSignal *) gobject; g_free(eq10_audio_signal->output_buffer); g_free(eq10_audio_signal->input_buffer); /* call parent */ G_OBJECT_CLASS(ags_eq10_audio_signal_parent_class)->finalize(gobject); } void ags_eq10_audio_signal_run_init_pre(AgsRecall *recall) { AgsAudioSignal *source; AgsEq10AudioSignal *eq10_audio_signal; guint buffer_size; void (*parent_class_run_init_pre)(AgsRecall *recall); eq10_audio_signal = (AgsEq10AudioSignal *) recall; /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_eq10_audio_signal_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); /* get some fields */ g_object_get(eq10_audio_signal, "source", &source, NULL); g_object_get(source, "buffer-size", &buffer_size, NULL); //FIXME:JK: memory leak eq10_audio_signal->output_buffer = (double *) malloc(buffer_size * sizeof(double)); eq10_audio_signal->input_buffer = (double *) malloc(buffer_size * sizeof(double)); /* initially empty */ ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_28hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_56hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_112hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_224hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_448hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_896hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_1792hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_3584hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_7168hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_clear_double(eq10_audio_signal->cache_14336hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); g_object_unref(source); } void ags_eq10_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsPort *port; AgsEq10Channel *eq10_channel; AgsEq10ChannelRun *eq10_channel_run; AgsEq10Recycling *eq10_recycling; AgsEq10AudioSignal *eq10_audio_signal; GList *note; GList *stream_source; double *output_buffer; double *input_buffer; double *cache_28hz; double *cache_56hz; double *cache_112hz; double *cache_224hz; double *cache_448hz; double *cache_896hz; double *cache_1792hz; double *cache_3584hz; double *cache_7168hz; double *cache_14336hz; gfloat pressure; gfloat peak_28hz; gfloat peak_56hz; gfloat peak_112hz; gfloat peak_224hz; gfloat peak_448hz; gfloat peak_896hz; gfloat peak_1792hz; gfloat peak_3584hz; gfloat peak_7168hz; gfloat peak_14336hz; guint output_copy_mode; guint input_copy_mode; guint buffer_size; guint samplerate; guint format; guint i; GValue value = {0,}; void (*parent_class_run_inter)(AgsRecall *recall); eq10_audio_signal = (AgsEq10AudioSignal *) recall; /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_eq10_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); /* get some fields */ g_object_get(eq10_audio_signal, "source", &source, "recall-id", &recall_id, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(source, "note", ¬e, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && note == NULL){ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } stream_source = source->stream_current; if(stream_source == NULL){ ags_recall_done(recall); g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_list_free_full(note, g_object_unref); return; } g_object_get(source, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); g_object_get(eq10_audio_signal, "parent", &eq10_recycling, NULL); g_object_get(eq10_recycling, "parent", &eq10_channel_run, NULL); g_object_get(eq10_channel_run, "recall-channel", &eq10_channel, NULL); /* copy mode */ output_copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), AGS_AUDIO_BUFFER_UTIL_DOUBLE); input_copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_DOUBLE, ags_audio_buffer_util_format_from_soundcard(format)); output_buffer = eq10_audio_signal->output_buffer; input_buffer = eq10_audio_signal->input_buffer; cache_28hz = eq10_audio_signal->cache_28hz; cache_56hz = eq10_audio_signal->cache_56hz; cache_112hz = eq10_audio_signal->cache_112hz; cache_224hz = eq10_audio_signal->cache_224hz; cache_448hz = eq10_audio_signal->cache_448hz; cache_896hz = eq10_audio_signal->cache_896hz; cache_1792hz = eq10_audio_signal->cache_1792hz; cache_3584hz = eq10_audio_signal->cache_3584hz; cache_7168hz = eq10_audio_signal->cache_7168hz; cache_14336hz = eq10_audio_signal->cache_14336hz; /* retrieve port values */ g_value_init(&value, G_TYPE_FLOAT); g_object_get(eq10_channel, "pressure", &port, NULL); ags_port_safe_read(port, &value); pressure = g_value_get_float(&value) / 10.0; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-28hz", &port, NULL); ags_port_safe_read(port, &value); peak_28hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-56hz", &port, NULL); ags_port_safe_read(port, &value); peak_56hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-112hz", &port, NULL); ags_port_safe_read(port, &value); peak_112hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-224hz", &port, NULL); ags_port_safe_read(port, &value); peak_224hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-448hz", &port, NULL); ags_port_safe_read(port, &value); peak_448hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-896hz", &port, NULL); ags_port_safe_read(port, &value); peak_896hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-1792hz", &port, NULL); ags_port_safe_read(port, &value); peak_1792hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-3584hz", &port, NULL); ags_port_safe_read(port, &value); peak_3584hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-7168hz", &port, NULL); ags_port_safe_read(port, &value); peak_7168hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_reset(&value); g_object_unref(port); g_object_get(eq10_channel, "peak-14336hz", &port, NULL); ags_port_safe_read(port, &value); peak_14336hz = g_value_get_float(&value) / 2.0 - 0.01; g_value_unset(&value); g_object_unref(port); /* clear/copy - preserve trailing */ if(buffer_size > 8){ /* clear buffer */ ags_audio_buffer_util_clear_double(input_buffer, 1, buffer_size - 2); /* copy input */ ags_audio_buffer_util_copy_buffer_to_buffer(input_buffer, 1, 0, stream_source->data, 1, 0, buffer_size - 2, input_copy_mode); } /* equalizer */ for(i = 0; i + 8 < buffer_size; i += 8){ gdouble resonator; gdouble frequency; /* 28Hz */ resonator = peak_28hz; frequency = 2.0 * M_PI * 28.0 / (gdouble) samplerate; if(i == 0){ cache_28hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_28hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_28hz[0] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_28hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_28hz[1] - (resonator * resonator) * cache_28hz[0]; cache_28hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_28hz[2] - (resonator * resonator) * cache_28hz[1]; cache_28hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_28hz[3] - (resonator * resonator) * cache_28hz[2]; cache_28hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_28hz[4] - (resonator * resonator) * cache_28hz[3]; cache_28hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_28hz[5] - (resonator * resonator) * cache_28hz[4]; cache_28hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_28hz[6] - (resonator * resonator) * cache_28hz[5]; }else{ cache_28hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_28hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_28hz[0] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_28hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_28hz[1] - (resonator * resonator) * cache_28hz[0]; cache_28hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_28hz[2] - (resonator * resonator) * cache_28hz[1]; cache_28hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_28hz[3] - (resonator * resonator) * cache_28hz[2]; cache_28hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_28hz[4] - (resonator * resonator) * cache_28hz[3]; cache_28hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_28hz[5] - (resonator * resonator) * cache_28hz[4]; cache_28hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_28hz[6] - (resonator * resonator) * cache_28hz[5]; } /* 56Hz */ resonator = peak_56hz; frequency = 2.0 * M_PI * 56.0 / (gdouble) samplerate; if(i == 0){ cache_56hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_56hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_56hz[0] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_56hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_56hz[1] - (resonator * resonator) * cache_56hz[0]; cache_56hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_56hz[2] - (resonator * resonator) * cache_56hz[1]; cache_56hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_56hz[3] - (resonator * resonator) * cache_56hz[2]; cache_56hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_56hz[4] - (resonator * resonator) * cache_56hz[3]; cache_56hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_56hz[5] - (resonator * resonator) * cache_56hz[4]; cache_56hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_56hz[6] - (resonator * resonator) * cache_56hz[5]; }else{ cache_56hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_56hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_56hz[0] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_56hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_56hz[1] - (resonator * resonator) * cache_56hz[0]; cache_56hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_56hz[2] - (resonator * resonator) * cache_56hz[1]; cache_56hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_56hz[3] - (resonator * resonator) * cache_56hz[2]; cache_56hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_56hz[4] - (resonator * resonator) * cache_56hz[3]; cache_56hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_56hz[5] - (resonator * resonator) * cache_56hz[4]; cache_56hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_56hz[6] - (resonator * resonator) * cache_56hz[5]; } /* 112Hz */ resonator = peak_112hz; frequency = 2.0 * M_PI * 112.0 / (gdouble) samplerate; if(i == 0){ cache_112hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_112hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_112hz[0] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_112hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_112hz[1] - (resonator * resonator) * cache_112hz[0]; cache_112hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_112hz[2] - (resonator * resonator) * cache_112hz[1]; cache_112hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_112hz[3] - (resonator * resonator) * cache_112hz[2]; cache_112hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_112hz[4] - (resonator * resonator) * cache_112hz[3]; cache_112hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_112hz[5] - (resonator * resonator) * cache_112hz[4]; cache_112hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_112hz[6] - (resonator * resonator) * cache_112hz[5]; }else{ cache_112hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_112hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_112hz[0] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_112hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_112hz[1] - (resonator * resonator) * cache_112hz[0]; cache_112hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_112hz[2] - (resonator * resonator) * cache_112hz[1]; cache_112hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_112hz[3] - (resonator * resonator) * cache_112hz[2]; cache_112hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_112hz[4] - (resonator * resonator) * cache_112hz[3]; cache_112hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_112hz[5] - (resonator * resonator) * cache_112hz[4]; cache_112hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_112hz[6] - (resonator * resonator) * cache_112hz[5]; } /* 224Hz */ resonator = peak_224hz; frequency = 2.0 * M_PI * 224.0 / (gdouble) samplerate; if(i == 0){ cache_224hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_224hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_224hz[0] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_224hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_224hz[1] - (resonator * resonator) * cache_224hz[0]; cache_224hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_224hz[2] - (resonator * resonator) * cache_224hz[1]; cache_224hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_224hz[3] - (resonator * resonator) * cache_224hz[2]; cache_224hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_224hz[4] - (resonator * resonator) * cache_224hz[3]; cache_224hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_224hz[5] - (resonator * resonator) * cache_224hz[4]; cache_224hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_224hz[6] - (resonator * resonator) * cache_224hz[5]; }else{ cache_224hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_224hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_224hz[0] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_224hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_224hz[1] - (resonator * resonator) * cache_224hz[0]; cache_224hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_224hz[2] - (resonator * resonator) * cache_224hz[1]; cache_224hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_224hz[3] - (resonator * resonator) * cache_224hz[2]; cache_224hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_224hz[4] - (resonator * resonator) * cache_224hz[3]; cache_224hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_224hz[5] - (resonator * resonator) * cache_224hz[4]; cache_224hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_224hz[6] - (resonator * resonator) * cache_224hz[5]; } /* 448Hz */ resonator = peak_448hz; frequency = 2.0 * M_PI * 448.0 / (gdouble) samplerate; if(i == 0){ cache_448hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_448hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_448hz[0] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_448hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_448hz[1] - (resonator * resonator) * cache_448hz[0]; cache_448hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_448hz[2] - (resonator * resonator) * cache_448hz[1]; cache_448hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_448hz[3] - (resonator * resonator) * cache_448hz[2]; cache_448hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_448hz[4] - (resonator * resonator) * cache_448hz[3]; cache_448hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_448hz[5] - (resonator * resonator) * cache_448hz[4]; cache_448hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_448hz[6] - (resonator * resonator) * cache_448hz[5]; }else{ cache_448hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_448hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_448hz[0] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_448hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_448hz[1] - (resonator * resonator) * cache_448hz[0]; cache_448hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_448hz[2] - (resonator * resonator) * cache_448hz[1]; cache_448hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_448hz[3] - (resonator * resonator) * cache_448hz[2]; cache_448hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_448hz[4] - (resonator * resonator) * cache_448hz[3]; cache_448hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_448hz[5] - (resonator * resonator) * cache_448hz[4]; cache_448hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_448hz[6] - (resonator * resonator) * cache_448hz[5]; } /* 896Hz */ resonator = peak_896hz; frequency = 2.0 * M_PI * 896.0 / (gdouble) samplerate; if(i == 0){ cache_896hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_896hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_896hz[0] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_896hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_896hz[1] - (resonator * resonator) * cache_896hz[0]; cache_896hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_896hz[2] - (resonator * resonator) * cache_896hz[1]; cache_896hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_896hz[3] - (resonator * resonator) * cache_896hz[2]; cache_896hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_896hz[4] - (resonator * resonator) * cache_896hz[3]; cache_896hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_896hz[5] - (resonator * resonator) * cache_896hz[4]; cache_896hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_896hz[6] - (resonator * resonator) * cache_896hz[5]; }else{ cache_896hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_896hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_896hz[0] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_896hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_896hz[1] - (resonator * resonator) * cache_896hz[0]; cache_896hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_896hz[2] - (resonator * resonator) * cache_896hz[1]; cache_896hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_896hz[3] - (resonator * resonator) * cache_896hz[2]; cache_896hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_896hz[4] - (resonator * resonator) * cache_896hz[3]; cache_896hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_896hz[5] - (resonator * resonator) * cache_896hz[4]; cache_896hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_896hz[6] - (resonator * resonator) * cache_896hz[5]; } /* 1792Hz */ resonator = peak_1792hz; frequency = 2.0 * M_PI * 1792.0 / (gdouble) samplerate; if(i == 0){ cache_1792hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_1792hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[0] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_1792hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[1] - (resonator * resonator) * cache_1792hz[0]; cache_1792hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[2] - (resonator * resonator) * cache_1792hz[1]; cache_1792hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[3] - (resonator * resonator) * cache_1792hz[2]; cache_1792hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[4] - (resonator * resonator) * cache_1792hz[3]; cache_1792hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[5] - (resonator * resonator) * cache_1792hz[4]; cache_1792hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[6] - (resonator * resonator) * cache_1792hz[5]; }else{ cache_1792hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_1792hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[0] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_1792hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[1] - (resonator * resonator) * cache_1792hz[0]; cache_1792hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[2] - (resonator * resonator) * cache_1792hz[1]; cache_1792hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[3] - (resonator * resonator) * cache_1792hz[2]; cache_1792hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[4] - (resonator * resonator) * cache_1792hz[3]; cache_1792hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[5] - (resonator * resonator) * cache_1792hz[4]; cache_1792hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[6] - (resonator * resonator) * cache_1792hz[5]; } /* 3584Hz */ resonator = peak_3584hz; frequency = 2.0 * M_PI * 3584.0 / (gdouble) samplerate; if(i == 0){ cache_3584hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_3584hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[0] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_3584hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[1] - (resonator * resonator) * cache_3584hz[0]; cache_3584hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[2] - (resonator * resonator) * cache_3584hz[1]; cache_3584hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[3] - (resonator * resonator) * cache_3584hz[2]; cache_3584hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[4] - (resonator * resonator) * cache_3584hz[3]; cache_3584hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[5] - (resonator * resonator) * cache_3584hz[4]; cache_3584hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[6] - (resonator * resonator) * cache_3584hz[5]; }else{ cache_3584hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_3584hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[0] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_3584hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[1] - (resonator * resonator) * cache_3584hz[0]; cache_3584hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[2] - (resonator * resonator) * cache_3584hz[1]; cache_3584hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[3] - (resonator * resonator) * cache_3584hz[2]; cache_3584hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[4] - (resonator * resonator) * cache_3584hz[3]; cache_3584hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[5] - (resonator * resonator) * cache_3584hz[4]; cache_3584hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[6] - (resonator * resonator) * cache_3584hz[5]; } /* 7168Hz */ resonator = peak_7168hz; frequency = 2.0 * M_PI * 7168.0 / (gdouble) samplerate; if(i == 0){ cache_7168hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_7168hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[0] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_7168hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[1] - (resonator * resonator) * cache_7168hz[0]; cache_7168hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[2] - (resonator * resonator) * cache_7168hz[1]; cache_7168hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[3] - (resonator * resonator) * cache_7168hz[2]; cache_7168hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[4] - (resonator * resonator) * cache_7168hz[3]; cache_7168hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[5] - (resonator * resonator) * cache_7168hz[4]; cache_7168hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[6] - (resonator * resonator) * cache_7168hz[5]; }else{ cache_7168hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_7168hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[0] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_7168hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[1] - (resonator * resonator) * cache_7168hz[0]; cache_7168hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[2] - (resonator * resonator) * cache_7168hz[1]; cache_7168hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[3] - (resonator * resonator) * cache_7168hz[2]; cache_7168hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[4] - (resonator * resonator) * cache_7168hz[3]; cache_7168hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[5] - (resonator * resonator) * cache_7168hz[4]; cache_7168hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[6] - (resonator * resonator) * cache_7168hz[5]; } /* 14336Hz */ resonator = peak_14336hz; frequency = 2.0 * M_PI * 14336.0 / (gdouble) samplerate; if(i == 0){ cache_14336hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_14336hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[0] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_14336hz[2] = input_buffer[2] - (resonator * input_buffer[0]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[1] - (resonator * resonator) * cache_14336hz[0]; cache_14336hz[3] = input_buffer[3] - (resonator * input_buffer[1]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[2] - (resonator * resonator) * cache_14336hz[1]; cache_14336hz[4] = input_buffer[4] - (resonator * input_buffer[2]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[3] - (resonator * resonator) * cache_14336hz[2]; cache_14336hz[5] = input_buffer[5] - (resonator * input_buffer[3]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[4] - (resonator * resonator) * cache_14336hz[3]; cache_14336hz[6] = input_buffer[6] - (resonator * input_buffer[4]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[5] - (resonator * resonator) * cache_14336hz[4]; cache_14336hz[7] = input_buffer[7] - (resonator * input_buffer[5]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[6] - (resonator * resonator) * cache_14336hz[5]; }else{ cache_14336hz[0] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; cache_14336hz[1] = input_buffer[i + 1] - (resonator * input_buffer[i - 1]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[0] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; cache_14336hz[2] = input_buffer[i + 2] - (resonator * input_buffer[i]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[1] - (resonator * resonator) * cache_14336hz[0]; cache_14336hz[3] = input_buffer[i + 3] - (resonator * input_buffer[i + 1]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[2] - (resonator * resonator) * cache_14336hz[1]; cache_14336hz[4] = input_buffer[i + 4] - (resonator * input_buffer[i + 2]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[3] - (resonator * resonator) * cache_14336hz[2]; cache_14336hz[5] = input_buffer[i + 5] - (resonator * input_buffer[i + 3]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[4] - (resonator * resonator) * cache_14336hz[3]; cache_14336hz[6] = input_buffer[i + 6] - (resonator * input_buffer[i + 4]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[5] - (resonator * resonator) * cache_14336hz[4]; cache_14336hz[7] = input_buffer[i + 7] - (resonator * input_buffer[i + 5]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[6] - (resonator * resonator) * cache_14336hz[5]; } /* clear/copy - handle trailing */ if(i == 0){ /* clear buffer */ ags_audio_buffer_util_clear_double(input_buffer + (buffer_size - 3), 1, 2); /* copy input */ ags_audio_buffer_util_copy_buffer_to_buffer(input_buffer, 1, buffer_size - 3, stream_source->data, 1, buffer_size - 3, 2, input_copy_mode); } /* fill output */ ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_28hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_56hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_112hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_224hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_448hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_896hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_1792hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_3584hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_7168hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_14336hz, 1, AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE); } if(buffer_size >= 4){ for(; i < buffer_size; i++){ gdouble resonator; gdouble frequency; /* clear buffer */ ags_audio_buffer_util_clear_double(input_buffer + i, 1, 1); /* copy input */ ags_audio_buffer_util_copy_buffer_to_buffer(input_buffer, 1, i, stream_source->data, 1, i, 1, input_copy_mode); if(i == 0){ resonator = peak_28hz; frequency = 2.0 * M_PI * 28.0 / (gdouble) samplerate; cache_28hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_56hz; frequency = 2.0 * M_PI * 56.0 / (gdouble) samplerate; cache_56hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_112hz; frequency = 2.0 * M_PI * 112.0 / (gdouble) samplerate; cache_112hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_224hz; frequency = 2.0 * M_PI * 224.0 / (gdouble) samplerate; cache_224hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_448hz; frequency = 2.0 * M_PI * 448.0 / (gdouble) samplerate; cache_448hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_896hz; frequency = 2.0 * M_PI * 896.0 / (gdouble) samplerate; cache_896hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_1792hz; frequency = 2.0 * M_PI * 1792.0 / (gdouble) samplerate; cache_1792hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_3584hz; frequency = 2.0 * M_PI * 3584.0 / (gdouble) samplerate; cache_3584hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_7168hz; frequency = 2.0 * M_PI * 7168.0 / (gdouble) samplerate; cache_7168hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_14336hz; frequency = 2.0 * M_PI * 14336.0 / (gdouble) samplerate; cache_14336hz[0] = input_buffer[0] - (resonator * input_buffer[buffer_size - 2]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; }else if(i == 1){ resonator = peak_28hz; frequency = 2.0 * M_PI * 28.0 / (gdouble) samplerate; cache_28hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_28hz[0] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_56hz; frequency = 2.0 * M_PI * 56.0 / (gdouble) samplerate; cache_56hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_56hz[0] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_112hz; frequency = 2.0 * M_PI * 112.0 / (gdouble) samplerate; cache_112hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_112hz[0] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_224hz; frequency = 2.0 * M_PI * 224.0 / (gdouble) samplerate; cache_224hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_224hz[0] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_448hz; frequency = 2.0 * M_PI * 448.0 / (gdouble) samplerate; cache_448hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_448hz[0] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_896hz; frequency = 2.0 * M_PI * 896.0 / (gdouble) samplerate; cache_896hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_896hz[0] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_1792hz; frequency = 2.0 * M_PI * 1792.0 / (gdouble) samplerate; cache_1792hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[0] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_3584hz; frequency = 2.0 * M_PI * 3584.0 / (gdouble) samplerate; cache_3584hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[0] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_7168hz; frequency = 2.0 * M_PI * 7168.0 / (gdouble) samplerate; cache_7168hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[0] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; resonator = peak_14336hz; frequency = 2.0 * M_PI * 14336.0 / (gdouble) samplerate; cache_14336hz[1] = input_buffer[1] - (resonator * input_buffer[buffer_size - 1]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[0] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1]; }else{ resonator = peak_28hz; frequency = 2.0 * M_PI * 28.0 / (gdouble) samplerate; cache_28hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_56hz; frequency = 2.0 * M_PI * 56.0 / (gdouble) samplerate; cache_56hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_112hz; frequency = 2.0 * M_PI * 112.0 / (gdouble) samplerate; cache_112hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_224hz; frequency = 2.0 * M_PI * 224.0 / (gdouble) samplerate; cache_224hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_448hz; frequency = 2.0 * M_PI * 448.0 / (gdouble) samplerate; cache_448hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_896hz; frequency = 2.0 * M_PI * 896.0 / (gdouble) samplerate; cache_896hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_1792hz; frequency = 2.0 * M_PI * 1792.0 / (gdouble) samplerate; cache_1792hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_3584hz; frequency = 2.0 * M_PI * 3584.0 / (gdouble) samplerate; cache_3584hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_7168hz; frequency = 2.0 * M_PI * 7168.0 / (gdouble) samplerate; cache_7168hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; resonator = peak_14336hz; frequency = 2.0 * M_PI * 14336.0 / (gdouble) samplerate; cache_14336hz[i % 8] = input_buffer[i] - (resonator * input_buffer[i - 2]) + (2.0 * resonator * cos(frequency)) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 1] - (resonator * resonator) * cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE - 2]; } } /* fill output */ ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_28hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_56hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_112hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_224hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_448hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_896hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_1792hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_3584hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_7168hz + (i % 8), 1, 1); ags_audio_buffer_util_copy_double_to_double(output_buffer + i, 1, cache_14336hz + (i % 8), 1, 1); } /* apply boost */ ags_audio_buffer_util_volume_double(output_buffer, 1, buffer_size, pressure); /* copy output */ ags_audio_buffer_util_copy_buffer_to_buffer(stream_source->data, 1, 0, output_buffer, 1, 0, buffer_size, output_copy_mode); /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_list_free_full(note, g_object_unref); g_object_unref(eq10_recycling); g_object_unref(eq10_channel); g_object_unref(eq10_channel_run); } /** * ags_eq10_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsEq10AudioSignal * * Returns: the new #AgsEq10AudioSignal * * Since: 3.0.0 */ AgsEq10AudioSignal* ags_eq10_audio_signal_new(AgsAudioSignal *source) { AgsEq10AudioSignal *eq10_audio_signal; eq10_audio_signal = (AgsEq10AudioSignal *) g_object_new(AGS_TYPE_EQ10_AUDIO_SIGNAL, "source", source, NULL); return(eq10_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_audio_run.h0000644000175000017500000000510313607210263021473 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_PATTERN_AUDIO_RUN_H__ #define __AGS_COPY_PATTERN_AUDIO_RUN_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_PATTERN_AUDIO_RUN (ags_copy_pattern_audio_run_get_type()) #define AGS_COPY_PATTERN_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_PATTERN_AUDIO_RUN, AgsCopyPatternAudioRun)) #define AGS_COPY_PATTERN_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_PATTERN_AUDIO_RUN, AgsCopyPatternAudioRun)) #define AGS_IS_COPY_PATTERN_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_PATTERN_AUDIO_RUN)) #define AGS_IS_COPY_PATTERN_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_PATTERN_AUDIO_RUN)) #define AGS_COPY_PATTERN_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_PATTERN_AUDIO_RUN, AgsCopyPatternAudioRunClass)) typedef struct _AgsCopyPatternAudioRun AgsCopyPatternAudioRun; typedef struct _AgsCopyPatternAudioRunClass AgsCopyPatternAudioRunClass; struct _AgsCopyPatternAudioRun { AgsRecallAudioRun recall_audio_run; guint hide_ref; guint hide_ref_counter; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; }; struct _AgsCopyPatternAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_copy_pattern_audio_run_get_type(); AgsCopyPatternAudioRun* ags_copy_pattern_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run); G_END_DECLS #endif /*__AGS_COPY_PATTERN_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_stream_recycling.h0000644000175000017500000000415413607210263020256 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STREAM_RECYCLING_H__ #define __AGS_STREAM_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_STREAM_RECYCLING (ags_stream_recycling_get_type()) #define AGS_STREAM_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_STREAM_RECYCLING, AgsStreamRecycling)) #define AGS_STREAM_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_STREAM_RECYCLING, AgsStreamRecyclingClass)) #define AGS_IS_STREAM_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_STREAM_RECYCLING)) #define AGS_IS_STREAM_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_STREAM_RECYCLING)) #define AGS_STREAM_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_STREAM_RECYCLING, AgsStreamRecyclingClass)) typedef struct _AgsStreamRecycling AgsStreamRecycling; typedef struct _AgsStreamRecyclingClass AgsStreamRecyclingClass; struct _AgsStreamRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsStreamRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_stream_recycling_get_type(); AgsStreamRecycling* ags_stream_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_STREAM_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_buffer_audio_signal.c0000644000175000017500000003122613607210263020706 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_buffer_audio_signal_class_init(AgsBufferAudioSignalClass *buffer_audio_signal); void ags_buffer_audio_signal_init(AgsBufferAudioSignal *buffer_audio_signal); void ags_buffer_audio_signal_finalize(GObject *gobject); void ags_buffer_audio_signal_run_init_pre(AgsRecall *recall); void ags_buffer_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_buffer_audio_signal * @short_description: buffer audio signal * @title: AgsBufferAudioSignal * @section_id: * @include: ags/audio/recall/ags_buffer_audio_signal.h * * The #AgsBufferAudioSignal class buffers the audio signal. */ static gpointer ags_buffer_audio_signal_parent_class = NULL; GType ags_buffer_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_buffer_audio_signal = 0; static const GTypeInfo ags_buffer_audio_signal_info = { sizeof(AgsBufferAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_buffer_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsBufferAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_buffer_audio_signal_init, }; ags_type_buffer_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsBufferAudioSignal", &ags_buffer_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_buffer_audio_signal); } return g_define_type_id__volatile; } void ags_buffer_audio_signal_class_init(AgsBufferAudioSignalClass *buffer_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_buffer_audio_signal_parent_class = g_type_class_peek_parent(buffer_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) buffer_audio_signal; gobject->finalize = ags_buffer_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) buffer_audio_signal; recall->run_init_pre = ags_buffer_audio_signal_run_init_pre; recall->run_inter = ags_buffer_audio_signal_run_inter; } void ags_buffer_audio_signal_init(AgsBufferAudioSignal *buffer_audio_signal) { AGS_RECALL(buffer_audio_signal)->child_type = G_TYPE_NONE; } void ags_buffer_audio_signal_finalize(GObject *gobject) { #if 0 /* destination */ if(AGS_RECALL_AUDIO_SIGNAL(gobject)->destination != NULL){ g_object_unref(AGS_RECALL_AUDIO_SIGNAL(gobject)->destination); } /* source */ if(AGS_RECALL_AUDIO_SIGNAL(gobject)->source != NULL){ g_object_unref(AGS_RECALL_AUDIO_SIGNAL(gobject)->source); } #endif /* call parent */ G_OBJECT_CLASS(ags_buffer_audio_signal_parent_class)->finalize(gobject); } void ags_buffer_audio_signal_run_init_pre(AgsRecall *recall) { AgsChannel *output; AgsRecycling *recycling; AgsAudioSignal *destination, *source; AgsRecallID *recall_id; AgsRecallID *parent_recall_id; AgsRecyclingContext *recycling_context; AgsRecyclingContext *parent_recycling_context; AgsBufferChannelRun *buffer_channel_run; AgsBufferRecycling *buffer_recycling; AgsBufferAudioSignal *buffer_audio_signal; GObject *output_soundcard; GList *list_start, *list; GList *stream; gdouble delay; guint attack; guint length; void (*parent_class_run_init_pre)(AgsRecall *recall); buffer_audio_signal = AGS_BUFFER_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_buffer_audio_signal_parent_class)->run_init_pre; /* get some fields */ g_object_get(buffer_audio_signal, "output-soundcard", &output_soundcard, "source", &source, NULL); g_object_get(buffer_audio_signal, "parent", &buffer_recycling, NULL); g_object_get(buffer_recycling, "parent", &buffer_channel_run, NULL); g_object_get(buffer_channel_run, "destination", &output, NULL); /* recycling */ ags_recall_unset_behaviour_flags(recall, AGS_SOUND_BEHAVIOUR_PERSISTENT); g_object_get(buffer_recycling, "destination", &recycling, NULL); /* recall id */ g_object_get(recall, "recall-id", &recall_id, NULL); /* recycling context */ g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* parent recycling context */ g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /**/ g_object_get(output, "recall-id", &list_start, NULL); list = list_start; parent_recall_id = ags_recall_id_find_recycling_context(list, parent_recycling_context); g_list_free_full(list_start, g_object_unref); //TODO:JK: unclear attack = 0; delay = 0.0; /* create new audio signal */ destination = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) parent_recall_id); g_object_set(buffer_audio_signal, "destination", destination, NULL); ags_recycling_create_audio_signal_with_defaults(recycling, destination, delay, attack); length = 3; // (guint) (2.0 * soundcard->delay[soundcard->tic_counter]) + 1; // g_object_get(source, // "length", &length, // NULL); ags_audio_signal_stream_resize(destination, length); ags_connectable_connect(AGS_CONNECTABLE(destination)); destination->stream_current = destination->stream; ags_recycling_add_audio_signal(recycling, destination); #ifdef AGS_DEBUG g_message("buffer %x to %x", destination, parent_recall_id); g_message("creating destination"); #endif /* call parent */ parent_class_run_init_pre(recall); //g_object_unref(destination); g_object_unref(output_soundcard); g_object_unref(source); g_object_unref(buffer_recycling); g_object_unref(buffer_channel_run); g_object_unref(output); g_object_unref(recycling); g_object_unref(recall_id); g_object_unref(recycling_context); } void ags_buffer_audio_signal_run_inter(AgsRecall *recall) { AgsRecycling *recycling; AgsAudioSignal *destination, *source; AgsPort *muted; AgsBufferChannel *buffer_channel; AgsBufferChannelRun *buffer_channel_run; AgsBufferRecycling *buffer_recycling; AgsBufferAudioSignal *buffer_audio_signal; GList *stream_destination, *stream_source; guint destination_buffer_size, source_buffer_size; guint destination_samplerate, source_samplerate; guint destination_format, source_format; guint copy_mode; guint attack; gboolean is_muted; GValue value = {0,}; void (*parent_class_run_inter)(AgsRecall *recall); buffer_audio_signal = AGS_BUFFER_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_buffer_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); g_object_get(buffer_audio_signal, "source", &source, NULL); stream_source = source->stream_current; if(stream_source == NULL){ ags_recall_done(recall); g_object_unref(source); return; } g_object_get(buffer_audio_signal, "destination", &destination, NULL); /* initialize some variables */ g_object_get(recall, "parent", &buffer_recycling, NULL); g_object_get(buffer_recycling, "parent", &buffer_channel_run, NULL); g_object_get(buffer_channel_run, "recall-channel", &buffer_channel, NULL); /* check muted */ g_object_get(buffer_channel, "muted", &muted, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(muted, &value); is_muted = (g_value_get_float(&value) == 1.0) ? TRUE: FALSE; g_value_unset(&value); if(is_muted){ goto ags_buffer_audio_signal_run_inter_END; } stream_destination = destination->stream_current; g_object_get(destination, "buffer-size", &destination_buffer_size, "samplerate", &destination_samplerate, "format", &destination_format, NULL); g_object_get(source, "buffer-size", &source_buffer_size, "attack", &attack, "samplerate", &source_samplerate, "format", &source_format, NULL); if(stream_destination != NULL){ void *buffer_source; gboolean resample; copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(destination_format), ags_audio_buffer_util_format_from_soundcard(source_format)); resample = FALSE; if(stream_destination->next == NULL){ ags_audio_signal_add_stream(destination); } /* check if resample */ buffer_source = stream_source->data; attack = (destination_samplerate / source_samplerate) * attack; if(source_samplerate != destination_samplerate){ void *tmp_buffer_source; tmp_buffer_source = ags_stream_alloc(destination_buffer_size, source_format); ags_audio_buffer_util_resample_with_buffer(buffer_source, 1, ags_audio_buffer_util_format_from_soundcard(source_format), source_samplerate, source_buffer_size, destination_samplerate, destination_buffer_size, tmp_buffer_source); buffer_source = tmp_buffer_source; resample = TRUE; } /* copy */ if(ags_recall_test_flags(recall, AGS_RECALL_INITIAL_RUN)){ ags_audio_buffer_util_copy_buffer_to_buffer(stream_destination->data, 1, attack, buffer_source, 1, 0, destination_buffer_size - attack, copy_mode); ags_recall_unset_flags(recall, AGS_RECALL_INITIAL_RUN); }else{ if(attack != 0 && stream_source->prev != NULL){ void *buffer_source_prev; buffer_source_prev = stream_source->prev->data; if(resample){ void *tmp_buffer_source_prev; tmp_buffer_source_prev = ags_stream_alloc(destination_buffer_size, source_format); ags_audio_buffer_util_resample_with_buffer(buffer_source_prev, 1, ags_audio_buffer_util_format_from_soundcard(source_format), source_samplerate, source_buffer_size, destination_samplerate, destination_buffer_size, tmp_buffer_source_prev); buffer_source_prev = tmp_buffer_source_prev; } ags_audio_buffer_util_copy_buffer_to_buffer(stream_destination->data, 1, 0, buffer_source_prev, 1, destination_buffer_size - attack, attack, copy_mode); if(resample){ free(buffer_source_prev); } } ags_audio_buffer_util_copy_buffer_to_buffer(stream_destination->data, 1, attack, buffer_source, 1, 0, destination_buffer_size - attack, copy_mode); } if(resample){ free(buffer_source); } } ags_buffer_audio_signal_run_inter_END: /* unref */ g_object_unref(source); g_object_unref(destination); g_object_unref(buffer_recycling); g_object_unref(buffer_channel_run); g_object_unref(buffer_channel); g_object_unref(muted); } /** * ags_buffer_audio_signal_new: * @destination: the destination #AgsAudioSignal * @source: the source #AgsAudioSignal * * Create a new instance of #AgsBufferAudioSignal * * Returns: the new #AgsBufferAudioSignal * * Since: 3.0.0 */ AgsBufferAudioSignal* ags_buffer_audio_signal_new(AgsAudioSignal *destination, AgsAudioSignal *source) { AgsBufferAudioSignal *buffer_audio_signal; buffer_audio_signal = (AgsBufferAudioSignal *) g_object_new(AGS_TYPE_BUFFER_AUDIO_SIGNAL, "destination", destination, "source", source, NULL); return(buffer_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_play_dssi_audio_run.c0000644000175000017500000013734613607210263020765 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_play_dssi_audio_run_class_init(AgsPlayDssiAudioRunClass *play_dssi_audio_run); void ags_play_dssi_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_play_dssi_audio_run_init(AgsPlayDssiAudioRun *play_dssi_audio_run); void ags_play_dssi_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_dssi_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_dssi_audio_run_dispose(GObject *gobject); void ags_play_dssi_audio_run_finalize(GObject *gobject); void ags_play_dssi_audio_run_connect(AgsConnectable *connectable); void ags_play_dssi_audio_run_disconnect(AgsConnectable *connectable); void ags_play_dssi_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_dssi_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_dssi_audio_run_read(AgsFile *file, xmlNode *node, AgsPlugin *plugin); xmlNode* ags_play_dssi_audio_run_write(AgsFile *file, xmlNode *parent, AgsPlugin *plugin); void ags_play_dssi_audio_run_run_init_pre(AgsRecall *recall); void ags_play_dssi_audio_run_run_pre(AgsRecall *recall); void ags_play_dssi_audio_run_resolve_dependency(AgsRecall *recall); void ags_play_dssi_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsPlayDssiAudioRun *play_dssi_audio_run); /** * SECTION:ags_play_dssi_audio_run * @short_description: play dssi * @title: AgsPlayDssiAudioRun * @section_id: * @include: ags/audio/recall/ags_play_dssi_audio_run.h * * The #AgsPlayDssiAudioRun class play dssi. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, PROP_DESTINATION, PROP_NOTATION, }; static gpointer ags_play_dssi_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_play_dssi_audio_run_parent_connectable_interface; GType ags_play_dssi_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_dssi_audio_run; static const GTypeInfo ags_play_dssi_audio_run_info = { sizeof (AgsPlayDssiAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_dssi_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayDssiAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_dssi_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_play_dssi_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_dssi_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsPlayDssiAudioRun", &ags_play_dssi_audio_run_info, 0); g_type_add_interface_static(ags_type_play_dssi_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave (&g_define_type_id__volatile, ags_type_play_dssi_audio_run); } return g_define_type_id__volatile; } void ags_play_dssi_audio_run_class_init(AgsPlayDssiAudioRunClass *play_dssi_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_dssi_audio_run_parent_class = g_type_class_peek_parent(play_dssi_audio_run); /* GObjectClass */ gobject = (GObjectClass *) play_dssi_audio_run; gobject->set_property = ags_play_dssi_audio_run_set_property; gobject->get_property = ags_play_dssi_audio_run_get_property; gobject->dispose = ags_play_dssi_audio_run_dispose; gobject->finalize = ags_play_dssi_audio_run_finalize; /* properties */ /** * AgsPlayDssiAudioRun:delay-audio-run: * * The delay audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits ::notation-alloc-input() signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsPlayDssiAudioRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which just counts"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /** * AgsPlayDssiAudioRun:destination: * * The destination's audio signal. * * Since: 3.0.0 */ param_spec = g_param_spec_object("destination", i18n_pspec("destination"), i18n_pspec("The destination audio signal"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESTINATION, param_spec); /** * AgsPlayDssiAudioRun:notation: * * The notation containing the notes. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation", i18n_pspec("assigned AgsNotation"), i18n_pspec("The AgsNotation containing notes"), AGS_TYPE_NOTATION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) play_dssi_audio_run; recall->resolve_dependency = ags_play_dssi_audio_run_resolve_dependency; recall->run_init_pre = ags_play_dssi_audio_run_run_init_pre; recall->run_pre = ags_play_dssi_audio_run_run_pre; } void ags_play_dssi_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_play_dssi_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_play_dssi_audio_run_connect; connectable->disconnect = ags_play_dssi_audio_run_disconnect; connectable->connect_connection = ags_play_dssi_audio_run_connect_connection; connectable->disconnect_connection = ags_play_dssi_audio_run_disconnect_connection; } void ags_play_dssi_audio_run_init(AgsPlayDssiAudioRun *play_dssi_audio_run) { guint i; ags_recall_set_ability_flags((AgsRecall *) play_dssi_audio_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(play_dssi_audio_run)->name = "ags-play-dssi"; AGS_RECALL(play_dssi_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_dssi_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_dssi_audio_run)->xml_type = "ags-play-dssi-audio-run"; AGS_RECALL(play_dssi_audio_run)->port = NULL; play_dssi_audio_run->audio_channels = 0; play_dssi_audio_run->ladspa_handle = NULL; play_dssi_audio_run->port_data = NULL; play_dssi_audio_run->input = NULL; play_dssi_audio_run->output = NULL; play_dssi_audio_run->delta_time = 0; play_dssi_audio_run->event_buffer = (snd_seq_event_t **) malloc(AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT * sizeof(snd_seq_event_t *)); for(i = 0; i < AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT; i++){ play_dssi_audio_run->event_buffer[i] = NULL; } play_dssi_audio_run->event_count = (unsigned long *) malloc(AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT * sizeof(unsigned long)); for(i = 0; i < AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT; i++){ play_dssi_audio_run->event_count[i] = 0; } play_dssi_audio_run->key_on = 0; play_dssi_audio_run->delay_audio_run = NULL; play_dssi_audio_run->count_beats_audio_run = NULL; play_dssi_audio_run->destination = NULL; play_dssi_audio_run->notation = NULL; play_dssi_audio_run->timestamp = ags_timestamp_new(); g_object_ref(play_dssi_audio_run->timestamp); play_dssi_audio_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); play_dssi_audio_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; play_dssi_audio_run->timestamp->timer.ags_offset.offset = 0; } void ags_play_dssi_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayDssiAudioRun *play_dssi_audio_run; GRecMutex *recall_mutex; play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(gobject); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(delay_audio_run == play_dssi_audio_run->delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(play_dssi_audio_run->delay_audio_run != NULL){ old_delay_audio_run = play_dssi_audio_run->delay_audio_run; g_object_unref(G_OBJECT(play_dssi_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(delay_audio_run); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) play_dssi_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_dssi_audio_run)->recall_dependency, old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_dssi_audio_run), (GObject *) recall_dependency); } }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_dssi_audio_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(play_dssi_audio_run), (GObject *) old_delay_audio_run); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); play_dssi_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(play_dssi_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_dssi_audio_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(play_dssi_audio_run), (GObject *) delay_audio_run); } } } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run == play_dssi_audio_run->count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if((AGS_RECALL_TEMPLATE & (AGS_RECALL(play_dssi_audio_run)->flags)) != 0){ is_template = TRUE; }else{ is_template = FALSE; } if(play_dssi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } play_dssi_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) play_dssi_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_dssi_audio_run)->recall_dependency, old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_dssi_audio_run), (GObject *) recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(play_dssi_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; case PROP_DESTINATION: { AgsAudioSignal *destination; destination = (AgsAudioSignal *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_dssi_audio_run->destination == (GObject *) destination){ g_rec_mutex_unlock(recall_mutex); return; } if(play_dssi_audio_run->destination != NULL){ g_object_unref(play_dssi_audio_run->destination); } if(destination != NULL){ g_object_ref(destination); } play_dssi_audio_run->destination = (GObject *) destination; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_dssi_audio_run->notation == notation){ g_rec_mutex_unlock(recall_mutex); return; } if(play_dssi_audio_run->notation != NULL){ g_object_unref(play_dssi_audio_run->notation); } if(notation != NULL){ g_object_ref(notation); } play_dssi_audio_run->notation = notation; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_dssi_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayDssiAudioRun *play_dssi_audio_run; GRecMutex *recall_mutex; play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(gobject); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(play_dssi_audio_run->delay_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(play_dssi_audio_run->count_beats_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_dssi_audio_run->destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_dssi_audio_run->notation); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_dssi_audio_run_dispose(GObject *gobject) { AgsPlayDssiAudioRun *play_dssi_audio_run; play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(gobject); /* delay audio run */ if(play_dssi_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->delay_audio_run)); play_dssi_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(play_dssi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->count_beats_audio_run)); play_dssi_audio_run->count_beats_audio_run = NULL; } /* notation */ if(play_dssi_audio_run->notation != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->notation)); play_dssi_audio_run->notation = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_dssi_audio_run_parent_class)->dispose(gobject); } void ags_play_dssi_audio_run_finalize(GObject *gobject) { AgsPlayDssiAudioRun *play_dssi_audio_run; play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(gobject); g_free(play_dssi_audio_run->port_data); g_free(play_dssi_audio_run->input); g_free(play_dssi_audio_run->output); //FIXME:JK: memory leak g_free(play_dssi_audio_run->event_buffer); g_free(play_dssi_audio_run->event_count); /* delay audio run */ if(play_dssi_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->delay_audio_run)); } /* count beats audio run */ if(play_dssi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->count_beats_audio_run)); } /* notation */ if(play_dssi_audio_run->notation != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->notation)); } /* timestamp */ if(play_dssi_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(play_dssi_audio_run->timestamp)); } /* call parent */ G_OBJECT_CLASS(ags_play_dssi_audio_run_parent_class)->finalize(gobject); } void ags_play_dssi_audio_run_connect(AgsConnectable *connectable) { AgsPlayDssiAudioRun *play_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(ags_connectable_is_connected(connectable)){ return; } /* call parent */ ags_play_dssi_audio_run_parent_connectable_interface->connect(connectable); play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(connectable); g_object_get(play_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_dssi_audio_run_disconnect(AgsConnectable *connectable) { AgsPlayDssiAudioRun *play_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(!ags_connectable_is_connected(connectable)){ return; } play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(connectable); g_object_get(play_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_play_dssi_audio_run_parent_connectable_interface->disconnect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_dssi_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayDssiAudioRun *play_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(connectable); g_object_get(play_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_signal_connect(G_OBJECT(delay_audio_run), "notation-alloc-input", G_CALLBACK(ags_play_dssi_audio_run_alloc_input_callback), play_dssi_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_dssi_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayDssiAudioRun *play_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(connectable); g_object_get(play_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_object_disconnect(G_OBJECT(delay_audio_run), "any_signal::notation-alloc-input", G_CALLBACK(ags_play_dssi_audio_run_alloc_input_callback), play_dssi_audio_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_dssi_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallID *recall_id; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); list = list_start; delay_audio_run = NULL; count_beats_audio_run = NULL; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); g_object_unref(recall_id); g_object_unref(recall_container); } void ags_play_dssi_audio_run_run_init_pre(AgsRecall *recall) { AgsPlayDssiAudio *play_dssi_audio; AgsPlayDssiAudioRun *play_dssi_audio_run; AgsDssiPlugin *dssi_plugin; GObject *output_soundcard; LADSPA_Handle *ladspa_handle; LADSPA_Data *output, *input; LADSPA_Data *port_data; guint port_count; guint output_lines, input_lines; guint samplerate; guint buffer_size; unsigned long i, i_stop; void (*parent_class_run_init_pre)(AgsRecall *recall); LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, unsigned long SampleRate); void (*activate)(LADSPA_Handle Instance); GRecMutex *play_dssi_audio_mutex; /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_play_dssi_audio_run_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); /* get some fields */ play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(recall); g_object_get(recall, "output-soundcard", &output_soundcard, "recall-audio", &play_dssi_audio, NULL); /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, &samplerate, &buffer_size, NULL); /* recall mutex */ play_dssi_audio_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); /* get some fields */ g_rec_mutex_lock(play_dssi_audio_mutex); dssi_plugin = play_dssi_audio->plugin; output_lines = play_dssi_audio->output_lines; input_lines = play_dssi_audio->input_lines; port_count = play_dssi_audio->plugin_descriptor->LADSPA_Plugin->PortCount; instantiate = play_dssi_audio->plugin_descriptor->LADSPA_Plugin->instantiate; activate = play_dssi_audio->plugin_descriptor->LADSPA_Plugin->activate; g_rec_mutex_unlock(play_dssi_audio_mutex); play_dssi_audio_run->port_data = (LADSPA_Data *) malloc(port_count * sizeof(LADSPA_Data)); output = NULL; input = NULL; if(input_lines > 0){ input = (LADSPA_Data *) malloc(input_lines * buffer_size * sizeof(LADSPA_Data)); } output = (LADSPA_Data *) malloc(output_lines * buffer_size * sizeof(LADSPA_Data)); play_dssi_audio_run->output = output; play_dssi_audio_run->input = input; if(input_lines < output_lines){ i_stop = output_lines; }else{ i_stop = input_lines; } ladspa_handle = NULL; if(i_stop > 0){ ladspa_handle = (LADSPA_Handle *) malloc(i_stop * sizeof(LADSPA_Handle)); } play_dssi_audio_run->audio_channels = i_stop; /* instantiate dssi */ g_rec_mutex_lock(play_dssi_audio_mutex); for(i = 0; i < i_stop; i++){ /* instantiate dssi */ ladspa_handle[i] = instantiate(play_dssi_audio->plugin_descriptor->LADSPA_Plugin, (unsigned long) samplerate); #ifdef AGS_DEBUG g_message("instantiate DSSI handle %d %d", play_dssi_audio->bank, play_dssi_audio->program); #endif } g_rec_mutex_unlock(play_dssi_audio_mutex); port_data = NULL; if(port_count > 0){ port_data = (LADSPA_Data *) malloc(port_count * sizeof(LADSPA_Data)); } /* */ play_dssi_audio_run->ladspa_handle = ladspa_handle; play_dssi_audio_run->port_data = port_data; /* */ ags_play_dssi_audio_run_load_ports(play_dssi_audio_run); for(i = 0; i < i_stop; i++){ if(activate != NULL){ activate(play_dssi_audio_run->ladspa_handle[i]); } #ifdef AGS_DEBUG g_message("instantiate DSSI handle"); #endif } g_object_unref(output_soundcard); g_object_unref(play_dssi_audio); } void ags_play_dssi_audio_run_run_pre(AgsRecall *recall) { AgsPlayDssiAudio *play_dssi_audio; AgsPlayDssiAudioRun *play_dssi_audio_run; AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel; AgsChannel *selected_channel; AgsRecycling *recycling; AgsRecyclingContext *recycling_context; AgsAudioSignal *destination; AgsPort *current_port; AgsRecallID *recall_id; AgsDssiPlugin *dssi_plugin; GObject *output_soundcard; GList *list_start, *list; GList *port; snd_seq_event_t *seq_event; snd_seq_event_t **event_buffer; unsigned long *event_count; gchar *specifier, *current_specifier; LADSPA_Data port_data; guint bank, program; guint output_lines, input_lines; guint port_count; guint audio_channel; guint samplerate; guint buffer_size; guint format; guint copy_mode_in, copy_mode_out; unsigned long i, i_stop; void (*parent_class_run_pre)(AgsRecall *recall); void (*select_program)(LADSPA_Handle Instance, unsigned long Bank, unsigned long Program); void (*run_synth)(LADSPA_Handle Instance, unsigned long SampleCount, snd_seq_event_t *Events, unsigned long EventCount); void (*run)(LADSPA_Handle Instance, unsigned long SampleCount); GRecMutex *audio_mutex; GRecMutex *play_dssi_audio_mutex; GRecMutex *port_mutex; /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_play_dssi_audio_run_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); /* get some fields */ play_dssi_audio_run = AGS_PLAY_DSSI_AUDIO_RUN(recall); g_object_get(recall, "output-soundcard", &output_soundcard, "audio-channel", &audio_channel, "recall-id", &recall_id, "audio", &audio, "recall-audio", &play_dssi_audio, "destination", &destination, NULL); /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, NULL, &buffer_size, NULL); /* recall mutex */ play_dssi_audio_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); /* get some fields */ g_rec_mutex_lock(play_dssi_audio_mutex); dssi_plugin = play_dssi_audio->plugin; input_lines = play_dssi_audio->input_lines; output_lines = play_dssi_audio->output_lines; g_rec_mutex_unlock(play_dssi_audio_mutex); /* audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ selected_channel = ags_channel_nth(start_output, audio_channel); #if 0 if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ selected_channel = ags_channel_nth(start_input, audio_channel); }else{ selected_channel = ags_channel_nth(start_output, audio_channel); } #endif /* recycling */ g_object_get(selected_channel, "first-recycling", &recycling, NULL); ags_recall_unset_behaviour_flags((AgsRecall *) recall, AGS_SOUND_BEHAVIOUR_PERSISTENT); if(destination == NULL){ gdouble delay; guint attack; guint length; //TODO:JK: unclear attack = 0; delay = 0.0; /* create new audio signal */ destination = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) recall_id); g_object_set(play_dssi_audio_run, "destination", destination, NULL); ags_recycling_create_audio_signal_with_defaults(recycling, destination, delay, attack); length = 1; // (guint) (2.0 * soundcard->delay[soundcard->tic_counter]) + 1; ags_audio_signal_stream_resize(destination, length); ags_connectable_connect(AGS_CONNECTABLE(destination)); destination->stream_current = destination->stream; ags_recycling_add_audio_signal(recycling, destination); #ifdef AGS_DEBUG g_message("play %x to %x", destination, recall_id); g_message("creating destination"); #endif } g_object_get(destination, "buffer-size", &buffer_size, "format", &format, NULL); /* select program */ copy_mode_in = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(format)); if(play_dssi_audio_run->input != NULL){ ags_audio_buffer_util_clear_float(play_dssi_audio_run->input, input_lines, buffer_size); } /* copy data */ if(play_dssi_audio_run->input != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(play_dssi_audio_run->input, (guint) input_lines, 0, destination->stream_current->data, 1, 0, (guint) buffer_size, copy_mode_in); } if(play_dssi_audio_run->output != NULL){ ags_audio_buffer_util_clear_float(play_dssi_audio_run->output, output_lines, buffer_size); } /* select program */ g_rec_mutex_lock(play_dssi_audio_mutex); port_count = play_dssi_audio->plugin_descriptor->LADSPA_Plugin->PortCount; select_program = play_dssi_audio->plugin_descriptor->select_program; g_rec_mutex_unlock(play_dssi_audio_mutex); /* retrieve port data */ g_object_get(play_dssi_audio, "port", &list_start, NULL); for(i = 0; i < port_count; i++){ g_rec_mutex_lock(play_dssi_audio_mutex); specifier = g_strdup(play_dssi_audio->plugin_descriptor->LADSPA_Plugin->PortNames[i]); g_rec_mutex_unlock(play_dssi_audio_mutex); list = list_start; while(list != NULL){ gboolean success; current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* check specifier */ g_rec_mutex_lock(port_mutex); current_specifier = g_strdup(current_port->specifier); g_rec_mutex_unlock(port_mutex); success = (!g_strcmp0(specifier, current_specifier)) ? TRUE: FALSE; g_free(current_specifier); if(success){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current_port, &value); play_dssi_audio_run->port_data[i] = g_value_get_float(&value); g_value_unset(&value); break; } list = list->next; } g_free(specifier); } g_object_get(play_dssi_audio, "bank", &bank, "program", &program, NULL); if(select_program != NULL){ if(input_lines < output_lines){ i_stop = output_lines; }else{ i_stop = input_lines; } for(i = 0; i < i_stop; i++){ select_program(play_dssi_audio_run->ladspa_handle[i], (unsigned long) bank, (unsigned long) program); // g_message("b p %u %u", bank, program); } } /* reset port data */ for(i = 0; i < port_count; i++){ g_rec_mutex_lock(play_dssi_audio_mutex); specifier = g_strdup(play_dssi_audio->plugin_descriptor->LADSPA_Plugin->PortNames[i]); g_rec_mutex_unlock(play_dssi_audio_mutex); list = list_start; current_port = NULL; while(list != NULL){ gboolean success; current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* check specifier */ g_rec_mutex_lock(port_mutex); current_specifier = g_strdup(current_port->specifier); g_rec_mutex_unlock(port_mutex); success = (!g_strcmp0(specifier, current_specifier)) ? TRUE: FALSE; g_free(current_specifier); if(success){ break; } list = list->next; } g_free(specifier); if(list != NULL){ GValue value = {0,}; g_value_init(&value, G_TYPE_FLOAT); port_data = play_dssi_audio_run->port_data[i]; g_value_set_float(&value, port_data); ags_port_safe_write(current_port, &value); g_value_unset(&value); } } g_list_free_full(list_start, g_object_unref); /* process data */ g_rec_mutex_lock(play_dssi_audio_mutex); run_synth = play_dssi_audio->plugin_descriptor->run_synth; run = play_dssi_audio->plugin_descriptor->LADSPA_Plugin->run; g_rec_mutex_unlock(play_dssi_audio_mutex); if(play_dssi_audio_run->event_buffer != NULL && play_dssi_audio_run->key_on != 0){ event_buffer = play_dssi_audio_run->event_buffer; event_count = play_dssi_audio_run->event_count; while(event_buffer[0] != NULL){ seq_event = event_buffer[0]; if(run_synth != NULL){ if(event_buffer[0]->type == SND_SEQ_EVENT_NOTEON){ run_synth(play_dssi_audio_run->ladspa_handle[0], (unsigned long) (output_lines * buffer_size), event_buffer[0], event_count[0]); } }else if(run != NULL){ run(play_dssi_audio_run->ladspa_handle[0], (unsigned long) buffer_size); } event_buffer++; event_count++; } } /* create audio data */ ags_audio_buffer_util_clear_buffer(destination->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); /* get copy mode and clear buffer */ copy_mode_out = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), AGS_AUDIO_BUFFER_UTIL_FLOAT); /* copy data */ if(play_dssi_audio_run->output != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(destination->stream_current->data, 1, 0, play_dssi_audio_run->output, (guint) output_lines, 0, (guint) buffer_size, copy_mode_out); } /* unref */ g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(audio); g_object_unref(play_dssi_audio); g_object_unref(destination); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(selected_channel != NULL){ g_object_unref(selected_channel); } if(recycling != NULL){ g_object_unref(recycling); } } void ags_play_dssi_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsPlayDssiAudioRun *play_dssi_audio_run) { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsPlayDssiAudio *play_dssi_audio; AgsDelayAudio *delay_audio; GObject *output_soundcard; snd_seq_event_t *seq_event; snd_seq_event_t **event_buffer; unsigned long *event_count; GList *start_list, *list; GList *start_current_position, *current_position; GList *start_append_note, *append_note; GList *start_remove_note, *remove_note; guint audio_start_mapping; guint midi_start_mapping, midi_end_mapping; guint notation_counter; guint note_x0, note_x1; guint note_y; guint input_pads; guint selected_key; guint audio_channel; guint i; GRecMutex *audio_mutex; if(delay != 0.0){ return; } g_object_get(play_dssi_audio_run, "audio", &audio, "audio-channel", &audio_channel, "output-soundcard", &output_soundcard, "recall-audio", &play_dssi_audio, NULL); g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); /* audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio fields */ g_rec_mutex_lock(audio_mutex); start_list = g_list_copy_deep(audio->notation, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(audio_mutex); if(start_list == NULL){ g_object_unref(audio); g_object_unref(output_soundcard); g_object_unref(play_dssi_audio); g_object_unref(delay_audio); return; } /* get notation */ notation = NULL; current_position = NULL; start_append_note = NULL; start_remove_note = NULL; /* get some fields */ g_rec_mutex_lock(audio_mutex); notation_counter = play_dssi_audio_run->count_beats_audio_run->notation_counter; input_pads = audio->input_pads; audio_start_mapping = audio->audio_start_mapping; midi_start_mapping = audio->midi_start_mapping; midi_end_mapping = audio->midi_end_mapping; g_rec_mutex_unlock(audio_mutex); /* */ play_dssi_audio_run->timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_counter / AGS_NOTATION_DEFAULT_OFFSET); list = ags_notation_find_near_timestamp(start_list, audio_channel, play_dssi_audio_run->timestamp); start_current_position = NULL; if(list != NULL){ notation = list->data; g_object_get(notation, "note", &start_current_position, NULL); current_position = start_current_position; } /* * feed midi */ while(current_position != NULL){ gboolean do_feed; gboolean success; note = AGS_NOTE(current_position->data); do_feed = ags_note_test_flags(note, AGS_NOTE_FEED); g_object_get(note, "x0", ¬e_x0, "x1", ¬e_x1, "y", ¬e_y, NULL); if(note_x0 == notation_counter){ start_append_note = g_list_prepend(start_append_note, note); g_object_ref(note); }else if(do_feed && notation_counter != 0 && (note_x1 == notation_counter || note_x1 == notation_counter - 1)){ //feed }else if((do_feed && notation_counter > 1 && note_x1 == notation_counter - 2) || (!do_feed && note_x1 <= notation_counter)){ start_remove_note = g_list_prepend(start_remove_note, note); g_object_ref(note); }else if(note_x0 > notation_counter){ break; } /* iterate */ current_position = current_position->next; } append_note = start_append_note = g_list_reverse(start_append_note); remove_note = start_remove_note = g_list_reverse(start_remove_note); /* append */ while(append_note != NULL){ note = append_note->data; g_object_get(note, "y", ¬e_y, NULL); /* send key-on */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ selected_key = input_pads - note_y - 1; }else{ selected_key = note_y; } /* key on */ seq_event = (snd_seq_event_t *) malloc(sizeof(snd_seq_event_t)); memset(seq_event, 0, sizeof(snd_seq_event_t)); //memset(seq_event, 0, sizeof(snd_seq_event_t)); seq_event->type = SND_SEQ_EVENT_NOTEON; seq_event->data.note.channel = 0; seq_event->data.note.note = 0x7f & (selected_key - audio_start_mapping + midi_start_mapping); seq_event->data.note.velocity = 127; /* find end */ event_count = 0; i = 0; if(play_dssi_audio_run->event_buffer != NULL){ event_buffer = play_dssi_audio_run->event_buffer; while(event_buffer[0] != NULL){ event_buffer++; event_count++; i++; } if(i + 1 < AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT){ play_dssi_audio_run->event_buffer[i] = seq_event; play_dssi_audio_run->event_buffer[i + 1] = NULL; play_dssi_audio_run->event_count[i] = 1; play_dssi_audio_run->event_count[i + 1] = 0; play_dssi_audio_run->key_on += 1; } } //FIXME:JK: check memory leak // free(seq_event); /* iterate */ g_object_unref(append_note->data); append_note = append_note->next; } /* remove */ while(remove_note != NULL){ gint match_index; gboolean success; note = remove_note->data; g_object_get(note, "y", ¬e_y, NULL); /* send key-on */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ selected_key = input_pads - note_y - 1; }else{ selected_key = note_y; } /* find end */ i = 0; match_index = -1; if(play_dssi_audio_run->event_buffer != NULL){ event_buffer = play_dssi_audio_run->event_buffer; event_count = play_dssi_audio_run->event_count; while(event_buffer[0] != NULL){ if(event_buffer[0]->data.note.note == (0x7f & (selected_key - audio_start_mapping + midi_start_mapping))){ match_index = i; // free(event_buffer[0]); } event_buffer++; event_count++; i++; } } /* clear note */ if(i > 0 && match_index != -1){ if(match_index + 1 != i){ memmove(&(play_dssi_audio_run->event_buffer[match_index]), &(play_dssi_audio_run->event_buffer[match_index + 1]), i - 1); } play_dssi_audio_run->event_buffer[i - 1] = NULL; play_dssi_audio_run->event_count[i - 1] = 0; play_dssi_audio_run->event_buffer[i] = NULL; play_dssi_audio_run->event_count[i] = 0; if(play_dssi_audio_run->key_on > 0){ play_dssi_audio_run->key_on -= 1; } } /* iterate */ g_object_unref(remove_note->data); remove_note = remove_note->next; } g_list_free_full(start_list, g_object_unref); g_list_free_full(start_current_position, g_object_unref); g_list_free(start_append_note); g_list_free(start_remove_note); /* unref */ g_object_unref(audio); g_object_unref(output_soundcard); g_object_unref(play_dssi_audio); g_object_unref(delay_audio); } /** * ags_play_dssi_audio_run_load_ports: * @play_dssi_audio_run: the #AgsPlayDssiAudioRun * * Set up DSSI ports. * * Since: 3.0.0 */ void ags_play_dssi_audio_run_load_ports(AgsPlayDssiAudioRun *play_dssi_audio_run) { AgsPlayDssiAudio *play_dssi_audio; AgsPort *current_port; AgsDssiPlugin *dssi_plugin; GList *list_start, *list; gchar *plugin_name; gchar *specifier; gchar *path; guint output_lines, input_lines; unsigned long port_count; unsigned long i, j, j_stop; DSSI_Descriptor *plugin_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortDescriptor current_port_descriptor; void (*connect_port)(LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation); GRecMutex *play_dssi_audio_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_PLAY_DSSI_AUDIO_RUN(play_dssi_audio_run)){ return; } g_object_get(play_dssi_audio_run, "recall-audio", &play_dssi_audio, NULL); /* recall mutex */ play_dssi_audio_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); /* get some fields */ g_rec_mutex_lock(play_dssi_audio_mutex); list_start = g_list_copy(AGS_RECALL(play_dssi_audio)->port); dssi_plugin = play_dssi_audio->plugin; plugin_descriptor = play_dssi_audio->plugin_descriptor; input_lines = play_dssi_audio->input_lines; output_lines = play_dssi_audio->output_lines; g_rec_mutex_unlock(play_dssi_audio_mutex); /* base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); port_count = plugin_descriptor->LADSPA_Plugin->PortCount; port_descriptor = plugin_descriptor->LADSPA_Plugin->PortDescriptors; connect_port = plugin_descriptor->LADSPA_Plugin->connect_port; g_rec_mutex_unlock(base_plugin_mutex); if(input_lines < output_lines){ j_stop = output_lines; }else{ j_stop = input_lines; } for(i = 0; i < port_count; i++){ AgsPluginPort *plugin_port; GRecMutex *port_mutex; g_rec_mutex_lock(base_plugin_mutex); current_port_descriptor = port_descriptor[i]; g_rec_mutex_unlock(base_plugin_mutex); if(LADSPA_IS_PORT_CONTROL(current_port_descriptor)){ if(LADSPA_IS_PORT_INPUT(current_port_descriptor) || LADSPA_IS_PORT_OUTPUT(current_port_descriptor)){ LADSPA_Data *port_pointer; g_rec_mutex_lock(base_plugin_mutex); specifier = g_strdup(plugin_descriptor->LADSPA_Plugin->PortNames[i]); g_rec_mutex_unlock(base_plugin_mutex); list = ags_port_find_specifier(list_start, specifier); g_free(specifier); if(list != NULL){ current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* get port pointer */ g_rec_mutex_lock(port_mutex); port_pointer = (LADSPA_Data *) &(current_port->port_value.ags_port_ladspa); g_rec_mutex_unlock(port_mutex); for(j = 0; j < j_stop; j++){ #ifdef AGS_DEBUG g_message("connecting port[%d]: %d/%d - %f", j, i, port_count, current->port_value.ags_port_ladspa); #endif connect_port(play_dssi_audio_run->ladspa_handle[j], (unsigned long) i, port_pointer); } } } } } g_list_free(list_start); /* connect audio port */ for(j = 0; j < input_lines; j++){ connect_port(play_dssi_audio_run->ladspa_handle[j], (unsigned long) (play_dssi_audio->input_port[j]), &(play_dssi_audio_run->input[j])); } for(j = 0; j < play_dssi_audio->output_lines; j++){ connect_port(play_dssi_audio_run->ladspa_handle[j], (unsigned long) (play_dssi_audio->output_port[j]), &(play_dssi_audio_run->output[j])); } g_object_unref(play_dssi_audio); } /** * ags_play_dssi_audio_run_new: * @audio: the #AgsAudio * @delay_audio_run: the #AgsDelayAudioRun dependency * @count_beats_audio_run: the #AgsCountBeatsAudioRun dependency * * Create a new instance of #AgsPlayDssiAudioRun * * Returns: the new #AgsPlayDssiAudioRun * * Since: 3.0.0 */ AgsPlayDssiAudioRun* ags_play_dssi_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsPlayDssiAudioRun *play_dssi_audio_run; play_dssi_audio_run = (AgsPlayDssiAudioRun *) g_object_new(AGS_TYPE_PLAY_DSSI_AUDIO_RUN, "audio", audio, "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); return(play_dssi_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_eq10_channel_run.c0000644000175000017500000000764113607210263020045 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_eq10_channel_run_class_init(AgsEq10ChannelRunClass *eq10_channel_run); void ags_eq10_channel_run_init(AgsEq10ChannelRun *eq10_channel_run); void ags_eq10_channel_run_finalize(GObject *gobject); /** * SECTION:ags_eq10_channel_run * @short_description: 10 band equalizer on channel * @title: AgsEq10ChannelRun * @section_id: * @include: ags/audio/recall/ags_eq10_channel_run.h * * The #AgsEq10ChannelRun class does a 10 band equalizer on the channel. */ static gpointer ags_eq10_channel_run_parent_class = NULL; GType ags_eq10_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_eq10_channel_run = 0; static const GTypeInfo ags_eq10_channel_run_info = { sizeof(AgsEq10ChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_eq10_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEq10ChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_eq10_channel_run_init, }; ags_type_eq10_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsEq10ChannelRun", &ags_eq10_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_eq10_channel_run); } return g_define_type_id__volatile; } void ags_eq10_channel_run_class_init(AgsEq10ChannelRunClass *eq10_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_eq10_channel_run_parent_class = g_type_class_peek_parent(eq10_channel_run); /* GObjectClass */ gobject = (GObjectClass *) eq10_channel_run; gobject->finalize = ags_eq10_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) eq10_channel_run; } void ags_eq10_channel_run_init(AgsEq10ChannelRun *eq10_channel_run) { ags_recall_set_ability_flags((AgsRecall *) eq10_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(eq10_channel_run)->name = "ags-eq10"; AGS_RECALL(eq10_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(eq10_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(eq10_channel_run)->xml_type = "ags-eq10-channel-run"; AGS_RECALL(eq10_channel_run)->port = NULL; AGS_RECALL(eq10_channel_run)->child_type = AGS_TYPE_EQ10_RECYCLING; } void ags_eq10_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_eq10_channel_run_parent_class)->finalize(gobject); } /** * ags_eq10_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsEq10ChannelRun * * Returns: the new #AgsEq10ChannelRun * * Since: 3.0.0 */ AgsEq10ChannelRun* ags_eq10_channel_run_new(AgsChannel *source) { AgsEq10ChannelRun *eq10_channel_run; eq10_channel_run = (AgsEq10ChannelRun *) g_object_new(AGS_TYPE_EQ10_CHANNEL_RUN, "source", source, NULL); return(eq10_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_feed_audio_signal.h0000644000175000017500000000421713607210263020345 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FEED_AUDIO_SIGNAL_H__ #define __AGS_FEED_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FEED_AUDIO_SIGNAL (ags_feed_audio_signal_get_type()) #define AGS_FEED_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FEED_AUDIO_SIGNAL, AgsFeedAudioSignal)) #define AGS_FEED_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FEED_AUDIO_SIGNAL, AgsFeedAudioSignalClass)) #define AGS_IS_FEED_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FEED_AUDIO_SIGNAL)) #define AGS_IS_FEED_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FEED_AUDIO_SIGNAL)) #define AGS_FEED_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FEED_AUDIO_SIGNAL, AgsFeedAudioSignalClass)) typedef struct _AgsFeedAudioSignal AgsFeedAudioSignal; typedef struct _AgsFeedAudioSignalClass AgsFeedAudioSignalClass; struct _AgsFeedAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsFeedAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_feed_audio_signal_get_type(); AgsFeedAudioSignal* ags_feed_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_FEED_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_envelope_channel_run.h0000644000175000017500000000431713607210263021116 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_CHANNEL_RUN_H__ #define __AGS_ENVELOPE_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_CHANNEL_RUN (ags_envelope_channel_run_get_type()) #define AGS_ENVELOPE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_CHANNEL_RUN, AgsEnvelopeChannelRun)) #define AGS_ENVELOPE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_CHANNEL_RUN, AgsEnvelopeChannelRunClass)) #define AGS_IS_ENVELOPE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ENVELOPE_CHANNEL_RUN)) #define AGS_IS_ENVELOPE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ENVELOPE_CHANNEL_RUN)) #define AGS_ENVELOPE_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ENVELOPE_CHANNEL_RUN, AgsEnvelopeChannelRunClass)) typedef struct _AgsEnvelopeChannelRun AgsEnvelopeChannelRun; typedef struct _AgsEnvelopeChannelRunClass AgsEnvelopeChannelRunClass; struct _AgsEnvelopeChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsEnvelopeChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_envelope_channel_run_get_type(); AgsEnvelopeChannelRun* ags_envelope_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_ENVELOPE_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_peak_channel.c0000644000175000017500000005273613607210263017340 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_peak_channel_class_init(AgsPeakChannelClass *peak_channel); void ags_peak_channel_init(AgsPeakChannel *peak_channel); void ags_peak_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_peak_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_peak_channel_dispose(GObject *gobject); void ags_peak_channel_finalize(GObject *gobject); static AgsPluginPort* ags_peak_channel_get_peak_plugin_port(); /** * SECTION:ags_peak_channel * @short_description: peaks channel * @title: AgsPeakChannel * @section_id: * @include: ags/audio/recall/ags_peak_channel.h * * The #AgsPeakChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_BUFFER_CLEARED, PROP_BUFFER_COMPUTED, PROP_SCALE_PRECISION, PROP_PEAK, }; static gpointer ags_peak_channel_parent_class = NULL; static AgsPluginInterface *ags_peak_channel_parent_plugin_interface; static const gchar *ags_peak_channel_plugin_name = "ags-peak"; static const gchar *ags_peak_channel_plugin_specifier[] = { "./buffer-cleared[0]", "./buffer-computed[0]", "./scale-precision[0]", "./peak[0]", }; static const gchar *ags_peak_channel_plugin_control_port[] = { "1/4", "2/4", "3/4", "4/4", }; GType ags_peak_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_peak_channel = 0; static const GTypeInfo ags_peak_channel_info = { sizeof (AgsPeakChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_peak_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPeakChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_peak_channel_init, }; ags_type_peak_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsPeakChannel", &ags_peak_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_peak_channel); } return g_define_type_id__volatile; } void ags_peak_channel_class_init(AgsPeakChannelClass *peak_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_peak_channel_parent_class = g_type_class_peek_parent(peak_channel); /* GObjectClass */ gobject = (GObjectClass *) peak_channel; gobject->set_property = ags_peak_channel_set_property; gobject->get_property = ags_peak_channel_get_property; gobject->dispose = ags_peak_channel_dispose; gobject->finalize = ags_peak_channel_finalize; /* properties */ /** * AgsPeakChannel:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsPeakChannel:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsPeakChannel:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsPeakChannel:buffer-cleared: * * The property indicating if buffer was cleared. * * Since: 3.0.0 */ param_spec = g_param_spec_object("buffer-cleared", i18n_pspec("if buffer was cleared"), i18n_pspec("The buffer was cleared during this run"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_CLEARED, param_spec); /** * AgsPeakChannel:buffer-computed: * * The property indicating if buffer was computed. * * Since: 3.0.0 */ param_spec = g_param_spec_object("buffer-computed", i18n_pspec("if buffer was computed"), i18n_pspec("The buffer was computed during this run"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_COMPUTED, param_spec); /** * AgsPeakChannel:scale-precision: * * The property indicating if scale was precision. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scale-precision", i18n_pspec("scale precision"), i18n_pspec("The scale precision to multiply the peak"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_PRECISION, param_spec); /** * AgsPeakChannel:peak: * * The peak of the channel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak", i18n_pspec("peak of channel"), i18n_pspec("The peak of channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK, param_spec); } void ags_peak_channel_init(AgsPeakChannel *peak_channel) { AgsResetPeak *reset_peak; AgsConfig *config; GList *port; gchar *str; AGS_RECALL(peak_channel)->flags |= AGS_RECALL_HAS_OUTPUT_PORT; AGS_RECALL(peak_channel)->name = "ags-peak"; AGS_RECALL(peak_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(peak_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(peak_channel)->xml_type = "ags-peak-channel"; /* buffer field */ g_mutex_init(&(peak_channel->buffer_mutex)); /* read config */ config = ags_config_get_instance(); peak_channel->samplerate = ags_soundcard_helper_config_get_samplerate(config); peak_channel->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); peak_channel->format = ags_soundcard_helper_config_get_format(config); /* allocate internal buffer */ peak_channel->buffer = ags_stream_alloc(peak_channel->buffer_size, peak_channel->format); /* ports */ port = NULL; /* buffer cleared */ peak_channel->buffer_cleared = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_peak_channel_plugin_name, "specifier", ags_peak_channel_plugin_specifier[0], "control-port", ags_peak_channel_plugin_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(peak_channel->buffer_cleared); peak_channel->buffer_cleared->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, peak_channel->buffer_cleared); g_object_ref(peak_channel->buffer_cleared); /* buffer computed */ peak_channel->buffer_computed = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_peak_channel_plugin_name, "specifier", ags_peak_channel_plugin_specifier[1], "control-port", ags_peak_channel_plugin_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(peak_channel->buffer_computed); peak_channel->buffer_computed->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, peak_channel->buffer_computed); g_object_ref(peak_channel->buffer_computed); /* peak */ peak_channel->scale_precision = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_peak_channel_plugin_name, "specifier", ags_peak_channel_plugin_specifier[2], "control-port", ags_peak_channel_plugin_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(peak_channel->scale_precision); peak_channel->scale_precision->port_value.ags_port_float = 10.0; /* add to port */ port = g_list_prepend(port, peak_channel->scale_precision); g_object_ref(peak_channel->scale_precision); /* peak */ peak_channel->peak = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_peak_channel_plugin_name, "specifier", ags_peak_channel_plugin_specifier[3], "control-port", ags_peak_channel_plugin_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(peak_channel->peak); peak_channel->peak->flags |= AGS_PORT_IS_OUTPUT; peak_channel->peak->port_value.ags_port_float = 0.0; /* plugin port */ g_object_set(peak_channel->peak, "plugin-port", ags_peak_channel_get_peak_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, peak_channel->peak); g_object_ref(peak_channel->peak); /* set port */ AGS_RECALL(peak_channel)->port = port; /* add to reset peak task */ reset_peak = ags_reset_peak_get_instance(); ags_reset_peak_add(reset_peak, peak_channel); } void ags_peak_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPeakChannel *peak_channel; GRecMutex *recall_mutex; peak_channel = AGS_PEAK_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(peak_channel); switch(prop_id){ case PROP_SAMPLERATE: { g_rec_mutex_lock(recall_mutex); peak_channel->samplerate = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(recall_mutex); peak_channel->buffer_size = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(recall_mutex); peak_channel->format = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_CLEARED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == peak_channel->buffer_cleared){ g_rec_mutex_unlock(recall_mutex); return; } if(peak_channel->buffer_cleared != NULL){ g_object_unref(G_OBJECT(peak_channel->buffer_cleared)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } peak_channel->buffer_cleared = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_COMPUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == peak_channel->buffer_computed){ g_rec_mutex_unlock(recall_mutex); return; } if(peak_channel->buffer_computed != NULL){ g_object_unref(G_OBJECT(peak_channel->buffer_computed)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } peak_channel->buffer_computed = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SCALE_PRECISION: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == peak_channel->scale_precision){ g_rec_mutex_unlock(recall_mutex); return; } if(peak_channel->scale_precision != NULL){ g_object_unref(G_OBJECT(peak_channel->scale_precision)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } peak_channel->scale_precision = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == peak_channel->peak){ g_rec_mutex_unlock(recall_mutex); return; } if(peak_channel->peak != NULL){ g_object_unref(G_OBJECT(peak_channel->peak)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } peak_channel->peak = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_peak_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPeakChannel *peak_channel; GRecMutex *recall_mutex; peak_channel = AGS_PEAK_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(peak_channel); switch(prop_id){ case PROP_SAMPLERATE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, peak_channel->samplerate); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, peak_channel->buffer_size); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, peak_channel->format); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_CLEARED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, peak_channel->buffer_cleared); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_COMPUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, peak_channel->buffer_computed); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SCALE_PRECISION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, peak_channel->scale_precision); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, peak_channel->peak); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_peak_channel_dispose(GObject *gobject) { AgsPeakChannel *peak_channel; AgsResetPeak *reset_peak; peak_channel = AGS_PEAK_CHANNEL(gobject); /* buffer cleared */ if(peak_channel->buffer_cleared != NULL){ g_object_unref(G_OBJECT(peak_channel->buffer_cleared)); peak_channel->buffer_cleared = NULL; } /* buffer computed */ if(peak_channel->buffer_computed != NULL){ g_object_unref(G_OBJECT(peak_channel->buffer_computed)); peak_channel->buffer_computed = NULL; } /* scale precision */ if(peak_channel->scale_precision != NULL){ g_object_unref(G_OBJECT(peak_channel->scale_precision)); peak_channel->scale_precision = NULL; } /* peak */ if(peak_channel->peak != NULL){ g_object_unref(G_OBJECT(peak_channel->peak)); peak_channel->peak = NULL; } /* reset peak task */ reset_peak = ags_reset_peak_get_instance(); ags_reset_peak_remove(reset_peak, peak_channel); /* call parent */ G_OBJECT_CLASS(ags_peak_channel_parent_class)->dispose(gobject); } void ags_peak_channel_finalize(GObject *gobject) { AgsPeakChannel *peak_channel; AgsResetPeak *reset_peak; peak_channel = AGS_PEAK_CHANNEL(gobject); /* buffer field */ free(peak_channel->buffer); /* buffer cleared */ if(peak_channel->buffer_cleared != NULL){ g_object_unref(G_OBJECT(peak_channel->buffer_cleared)); } /* buffer computed */ if(peak_channel->buffer_computed != NULL){ g_object_unref(G_OBJECT(peak_channel->buffer_computed)); } /* scale precision */ if(peak_channel->scale_precision != NULL){ g_object_unref(G_OBJECT(peak_channel->scale_precision)); } /* peak */ if(peak_channel->peak != NULL){ g_object_unref(G_OBJECT(peak_channel->peak)); } /* reset peak task */ reset_peak = ags_reset_peak_get_instance(); ags_reset_peak_remove(reset_peak, peak_channel); /* call parent */ G_OBJECT_CLASS(ags_peak_channel_parent_class)->finalize(gobject); } static AgsPluginPort* ags_peak_channel_get_peak_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 10.0); } g_mutex_unlock(&mutex); return(plugin_port); } void ags_peak_channel_buffer_add(AgsPeakChannel *peak_channel, void *buffer, guint samplerate, guint buffer_size, guint format) { void *buffer_source; guint copy_mode; guint target_samplerate; guint target_buffer_size; guint target_format; gboolean resample; GRecMutex *buffer_mutex; if(!AGS_IS_PEAK_CHANNEL(peak_channel)){ return; } /* get buffer mutex */ buffer_mutex = &(peak_channel->buffer_mutex); g_object_get(peak_channel, "samplerate", &target_samplerate, "buffer-size", &target_buffer_size, "format", &target_format, NULL); resample = FALSE; g_rec_mutex_lock(buffer_mutex); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(target_format), ags_audio_buffer_util_format_from_soundcard(format)); if(samplerate != target_samplerate){ void *tmp_buffer_source; tmp_buffer_source = ags_stream_alloc(target_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(buffer, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, target_samplerate, target_buffer_size, tmp_buffer_source); buffer_source = tmp_buffer_source; resample = TRUE; }else{ buffer_source = buffer; } ags_audio_buffer_util_copy_buffer_to_buffer(peak_channel->buffer, 1, 0, buffer_source, 1, 0, target_buffer_size, copy_mode); g_rec_mutex_unlock(buffer_mutex); if(resample){ free(buffer_source); } } void ags_peak_channel_retrieve_peak_internal(AgsPeakChannel *peak_channel) { AgsPort *scale_precision; AgsPort *peak; void *buffer; gdouble current_scale_precision; gdouble current_value; guint target_format; GValue value = {0,}; GRecMutex *buffer_mutex; if(!AGS_IS_PEAK_CHANNEL(peak_channel)){ return; } /* get buffer mutex */ buffer_mutex = &(peak_channel->buffer_mutex); /* calculate average value */ g_object_get(peak_channel, "format", &target_format, NULL); g_rec_mutex_lock(buffer_mutex); current_value = ags_audio_buffer_util_peak(peak_channel->buffer, 1, ags_audio_buffer_util_format_from_soundcard(target_format), peak_channel->buffer_size, 440.0, 22000.0, 1.0); g_rec_mutex_unlock(buffer_mutex); g_object_get(peak_channel, "scale-precision", &scale_precision, "peak", &peak, NULL); /* break down to scale */ g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(scale_precision, &value); current_scale_precision = g_value_get_float(&value); current_value = current_scale_precision * current_value; if(current_value < 0.0){ current_value *= -1.0; } /* set peak */ g_value_set_float(&value, current_value); ags_port_safe_write(peak, &value); g_value_unset(&value); } /** * ags_peak_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsPeakChannel * * Returns: the new #AgsPeakChannel * * Since: 3.0.0 */ AgsPeakChannel* ags_peak_channel_new(AgsChannel *source) { AgsPeakChannel *peak_channel; peak_channel = (AgsPeakChannel *) g_object_new(AGS_TYPE_PEAK_CHANNEL, "source", source, NULL); return(peak_channel); } gsequencer-3.1.3/ags/audio/recall/ags_prepare_audio_signal.h0000644000175000017500000000434013607210263021075 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PREPARE_AUDIO_SIGNAL_H__ #define __AGS_PREPARE_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PREPARE_AUDIO_SIGNAL (ags_prepare_audio_signal_get_type()) #define AGS_PREPARE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PREPARE_AUDIO_SIGNAL, AgsPrepareAudioSignal)) #define AGS_PREPARE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PREPARE_AUDIO_SIGNAL, AgsPrepareAudioSignalClass)) #define AGS_IS_PREPARE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PREPARE_AUDIO_SIGNAL)) #define AGS_IS_PREPARE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PREPARE_AUDIO_SIGNAL)) #define AGS_PREPARE_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PREPARE_AUDIO_SIGNAL, AgsPrepareAudioSignalClass)) typedef struct _AgsPrepareAudioSignal AgsPrepareAudioSignal; typedef struct _AgsPrepareAudioSignalClass AgsPrepareAudioSignalClass; struct _AgsPrepareAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsPrepareAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_prepare_audio_signal_get_type(); AgsPrepareAudioSignal* ags_prepare_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_PREPARE_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_lfo_channel_run.c0000644000175000017500000000733713607210263020061 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_lfo_channel_run_class_init(AgsLfoChannelRunClass *lfo_channel_run); void ags_lfo_channel_run_init(AgsLfoChannelRun *lfo_channel_run); void ags_lfo_channel_run_finalize(GObject *gobject); /** * SECTION:ags_lfo_channel_run * @short_description: LFO channel * @title: AgsLfoChannelRun * @section_id: * @include: ags/audio/recall/ags_lfo_channel_run.h * * The #AgsLfoChannelRun LFO the channel. */ static gpointer ags_lfo_channel_run_parent_class = NULL; GType ags_lfo_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lfo_channel_run = 0; static const GTypeInfo ags_lfo_channel_run_info = { sizeof (AgsLfoChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lfo_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLfoChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lfo_channel_run_init, }; ags_type_lfo_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsLfoChannelRun", &ags_lfo_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lfo_channel_run); } return g_define_type_id__volatile; } void ags_lfo_channel_run_class_init(AgsLfoChannelRunClass *lfo_channel_run) { GObjectClass *gobject; ags_lfo_channel_run_parent_class = g_type_class_peek_parent(lfo_channel_run); /* GObjectClass */ gobject = (GObjectClass *) lfo_channel_run; gobject->finalize = ags_lfo_channel_run_finalize; } void ags_lfo_channel_run_init(AgsLfoChannelRun *lfo_channel_run) { ags_recall_set_ability_flags((AgsRecall *) lfo_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(lfo_channel_run)->name = "ags-lfo"; AGS_RECALL(lfo_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(lfo_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(lfo_channel_run)->xml_type = "ags-lfo-channel-run"; AGS_RECALL(lfo_channel_run)->port = NULL; AGS_RECALL(lfo_channel_run)->child_type = AGS_TYPE_LFO_RECYCLING; } void ags_lfo_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_lfo_channel_run_parent_class)->finalize(gobject); } /** * ags_lfo_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsLfoChannelRun * * Returns: the new #AgsLfoChannelRun * * Since: 3.0.0 */ AgsLfoChannelRun* ags_lfo_channel_run_new(AgsChannel *source) { AgsLfoChannelRun *lfo_channel_run; lfo_channel_run = (AgsLfoChannelRun *) g_object_new(AGS_TYPE_LFO_CHANNEL_RUN, "source", source, NULL); return(lfo_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_lfo_recycling.h0000644000175000017500000000403313607210263017537 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LFO_RECYCLING_H__ #define __AGS_LFO_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LFO_RECYCLING (ags_lfo_recycling_get_type()) #define AGS_LFO_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LFO_RECYCLING, AgsLfoRecycling)) #define AGS_LFO_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LFO_RECYCLING, AgsLfoRecyclingClass)) #define AGS_IS_LFO_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LFO_RECYCLING)) #define AGS_IS_LFO_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LFO_RECYCLING)) #define AGS_LFO_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LFO_RECYCLING, AgsLfoRecyclingClass)) typedef struct _AgsLfoRecycling AgsLfoRecycling; typedef struct _AgsLfoRecyclingClass AgsLfoRecyclingClass; struct _AgsLfoRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsLfoRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_lfo_recycling_get_type(); AgsLfoRecycling* ags_lfo_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_LFO_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_channel.h0000644000175000017500000000407513607210263017363 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_CHANNEL_H__ #define __AGS_PLAY_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_CHANNEL (ags_play_channel_get_type()) #define AGS_PLAY_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_CHANNEL, AgsPlayChannel)) #define AGS_PLAY_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_CHANNEL, AgsPlayChannelClass)) #define AGS_IS_PLAY_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLAY_CHANNEL)) #define AGS_IS_PLAY_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PLAY_CHANNEL)) #define AGS_PLAY_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PLAY_CHANNEL, AgsPlayChannelClass)) typedef struct _AgsPlayChannel AgsPlayChannel; typedef struct _AgsPlayChannelClass AgsPlayChannelClass; struct _AgsPlayChannel { AgsRecallChannel recall_channel; AgsPort *audio_channel; AgsPort *muted; }; struct _AgsPlayChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_play_channel_get_type(); AgsPlayChannel* ags_play_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PLAY_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_mute_audio_signal.h0000644000175000017500000000423213607210263020411 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTE_AUDIO_SIGNAL_H__ #define __AGS_MUTE_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTE_AUDIO_SIGNAL (ags_mute_audio_signal_get_type()) #define AGS_MUTE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTE_AUDIO_SIGNAL, AgsMuteAudioSignal)) #define AGS_MUTE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MUTE_AUDIO_SIGNAL, AgsMuteAudioSignalClass)) #define AGS_IS_MUTE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MUTE_AUDIO_SIGNAL)) #define AGS_IS_MUTE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MUTE_AUDIO_SIGNAL)) #define AGS_MUTE_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MUTE_AUDIO_SIGNAL, AgsMuteAudioSignalClass)) typedef struct _AgsMuteAudioSignal AgsMuteAudioSignal; typedef struct _AgsMuteAudioSignalClass AgsMuteAudioSignalClass; struct _AgsMuteAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsMuteAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_mute_audio_signal_get_type(); AgsMuteAudioSignal* ags_mute_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_MUTE_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_audio.c0000644000175000017500000003241013607210263020603 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_copy_pattern_audio_class_init(AgsCopyPatternAudioClass *copy_pattern_audio); void ags_copy_pattern_audio_init(AgsCopyPatternAudio *copy_pattern_audio); void ags_copy_pattern_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_copy_pattern_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_copy_pattern_audio_dispose(GObject *gobject); void ags_copy_pattern_audio_finalize(GObject *gobject); static AgsPluginPort* ags_copy_pattern_audio_get_bank_index_0_plugin_port(); static AgsPluginPort* ags_copy_pattern_audio_get_bank_index_1_plugin_port(); /** * SECTION:ags_copy_pattern_audio * @short_description: copy audio pattern * @title: AgsCopyPatternAudio * @section_id: * @include: ags/audio/recall/ags_copy_pattern_audio.h * * The #AgsCopyPatternAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_BANK_INDEX_0, PROP_BANK_INDEX_1, }; static gpointer ags_copy_pattern_audio_parent_class = NULL; static AgsPluginInterface *ags_copy_pattern_audio_parent_plugin_interface; static const gchar *ags_copy_pattern_audio_plugin_name = "ags-copy-pattern"; static const gchar *ags_copy_pattern_audio_specifier[] = { "./bank-index-0[0]", "./bank-index-1[0]" }; static const gchar *ags_copy_pattern_audio_control_port[] = { "1/2", "2/2" }; GType ags_copy_pattern_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_pattern_audio = 0; static const GTypeInfo ags_copy_pattern_audio_info = { sizeof(AgsCopyPatternAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_pattern_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCopyPatternAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_pattern_audio_init, }; ags_type_copy_pattern_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsCopyPatternAudio", &ags_copy_pattern_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_pattern_audio); } return g_define_type_id__volatile; } void ags_copy_pattern_audio_class_init(AgsCopyPatternAudioClass *copy_pattern_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_copy_pattern_audio_parent_class = g_type_class_peek_parent(copy_pattern_audio); /* GObjectClass */ gobject = (GObjectClass *) copy_pattern_audio; gobject->set_property = ags_copy_pattern_audio_set_property; gobject->get_property = ags_copy_pattern_audio_get_property; gobject->dispose = ags_copy_pattern_audio_dispose; gobject->finalize = ags_copy_pattern_audio_finalize; /* properties */ /** * AgsCopyPatternAudio:bank-index-0: * * The bank index 0 port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("bank-index-0", i18n_pspec("current bank index 0"), i18n_pspec("The current bank index 0 of the AgsPattern"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BANK_INDEX_0, param_spec); /** * AgsCopyPatternAudio:bank-index-1: * * The bank index 1 port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("bank-index-1", i18n_pspec("current bank index 1"), i18n_pspec("The current bank index 1 of the AgsPattern"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BANK_INDEX_1, param_spec); } void ags_copy_pattern_audio_init(AgsCopyPatternAudio *copy_pattern_audio) { GList *port; AGS_RECALL(copy_pattern_audio)->name = "ags-copy-pattern"; AGS_RECALL(copy_pattern_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_pattern_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_pattern_audio)->xml_type = "ags-copy-pattern-audio"; port = NULL; /* bank index 0 */ copy_pattern_audio->bank_index_0 = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_copy_pattern_audio_plugin_name, "specifier", ags_copy_pattern_audio_specifier[0], "control-port", ags_copy_pattern_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(copy_pattern_audio->bank_index_0); copy_pattern_audio->bank_index_0->port_value.ags_port_float = 0.0; /* plugin port */ #if 0 g_object_set(copy_pattern_audio->bank_index_0, "plugin-port", ags_copy_pattern_audio_get_bank_index_0_plugin_port(), NULL); #endif /* add to port */ port = g_list_prepend(port, copy_pattern_audio->bank_index_0); g_object_ref(copy_pattern_audio->bank_index_0); /* bank index 1 */ copy_pattern_audio->bank_index_1 = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_copy_pattern_audio_plugin_name, "specifier", ags_copy_pattern_audio_specifier[1], "control-port", ags_copy_pattern_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(copy_pattern_audio->bank_index_1); copy_pattern_audio->bank_index_1->port_value.ags_port_float = 0.0; /* plugin port */ #if 0 g_object_set(copy_pattern_audio->bank_index_1, "plugin-port", ags_copy_pattern_audio_get_bank_index_1_plugin_port(), NULL); #endif /* add to port */ port = g_list_prepend(port, copy_pattern_audio->bank_index_1); g_object_ref(copy_pattern_audio->bank_index_1); /* set port */ AGS_RECALL(copy_pattern_audio)->port = port; } void ags_copy_pattern_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCopyPatternAudio *copy_pattern_audio; GRecMutex *recall_mutex; copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_audio); switch(prop_id){ case PROP_BANK_INDEX_0: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == copy_pattern_audio->bank_index_0){ g_rec_mutex_unlock(recall_mutex); return; } if(copy_pattern_audio->bank_index_0 != NULL){ g_object_unref(G_OBJECT(copy_pattern_audio->bank_index_0)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } copy_pattern_audio->bank_index_0 = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_BANK_INDEX_1: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == copy_pattern_audio->bank_index_1){ g_rec_mutex_unlock(recall_mutex); return; } if(copy_pattern_audio->bank_index_1 != NULL){ g_object_unref(G_OBJECT(copy_pattern_audio->bank_index_1)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } copy_pattern_audio->bank_index_1 = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_copy_pattern_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCopyPatternAudio *copy_pattern_audio; GRecMutex *recall_mutex; copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_audio); switch(prop_id){ case PROP_BANK_INDEX_0: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, copy_pattern_audio->bank_index_0); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BANK_INDEX_1: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, copy_pattern_audio->bank_index_1); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_copy_pattern_audio_dispose(GObject *gobject) { AgsCopyPatternAudio *copy_pattern_audio; copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(gobject); /* bank index 0 */ if(copy_pattern_audio->bank_index_0 != NULL){ g_object_unref(copy_pattern_audio->bank_index_0); copy_pattern_audio->bank_index_0 = NULL; } /* bank index 1 */ if(copy_pattern_audio->bank_index_1 != NULL){ g_object_unref(copy_pattern_audio->bank_index_1); copy_pattern_audio->bank_index_1 = NULL; } /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_audio_parent_class)->dispose(gobject); } void ags_copy_pattern_audio_finalize(GObject *gobject) { AgsCopyPatternAudio *copy_pattern_audio; copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(gobject); /* bank index 0 */ if(copy_pattern_audio->bank_index_0 != NULL){ g_object_unref(copy_pattern_audio->bank_index_0); } /* bank index 1 */ if(copy_pattern_audio->bank_index_1 != NULL){ g_object_unref(copy_pattern_audio->bank_index_1); } /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_audio_parent_class)->finalize(gobject); } static AgsPluginPort* ags_copy_pattern_audio_get_bank_index_0_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_INTEGER); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_0); } g_mutex_unlock(&mutex); return(plugin_port); } static AgsPluginPort* ags_copy_pattern_audio_get_bank_index_1_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_INTEGER); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_1); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_copy_pattern_audio_new: * @audio: the #AgsAudio * @bank_index_0: bank index 0 * @bank_index_1: bank index 1 * * Create a new instance of #AgsCopyPatternAudio * * Returns: the new #AgsCopyPatternAudio * * Since: 3.0.0 */ AgsCopyPatternAudio* ags_copy_pattern_audio_new(AgsAudio *audio, guint bank_index_0, guint bank_index_1) { AgsCopyPatternAudio *copy_pattern_audio; AgsPort *port; GValue *value; copy_pattern_audio = (AgsCopyPatternAudio *) g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO, "audio", audio, NULL); /* apply bank index */ value = g_new0(GValue, 1); g_value_init(value, G_TYPE_FLOAT); g_object_get(copy_pattern_audio, "bank-index-0" , &port, NULL); g_value_set_float(value, bank_index_0); ags_port_safe_write(port, value); g_object_unref(port); g_object_get(copy_pattern_audio, "bank-index-1" , &port, NULL); g_value_reset(value); g_value_set_float(value, bank_index_1); ags_port_safe_write(copy_pattern_audio->bank_index_1, value); g_object_unref(port); g_value_unset(value); g_free(value); return(copy_pattern_audio); } gsequencer-3.1.3/ags/audio/recall/ags_route_dssi_audio.c0000644000175000017500000002373413607210263020265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_route_dssi_audio_class_init(AgsRouteDssiAudioClass *route_dssi_audio); void ags_route_dssi_audio_init(AgsRouteDssiAudio *route_dssi_audio); void ags_route_dssi_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_route_dssi_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_route_dssi_audio_dispose(GObject *gobject); void ags_route_dssi_audio_finalize(GObject *gobject); /** * SECTION:ags_route_dssi_audio * @short_description: route MIDI to DSSI * @title: AgsRouteDssiAudio * @section_id: * @include: ags/audio/recall/ags_route_dssi_audio.h * * The #AgsRouteDssiAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_NOTATION_INPUT, PROP_SEQUENCER_INPUT, }; static gpointer ags_route_dssi_audio_parent_class = NULL; static const gchar *ags_route_dssi_audio_plugin_name = "ags-route-dssi"; static const gchar *ags_route_dssi_audio_specifier[] = { "./notation-input[0]", "./sequencer-input[0]", }; static const gchar *ags_route_dssi_audio_control_port[] = { "1/2", "2/2", }; GType ags_route_dssi_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_route_dssi_audio; static const GTypeInfo ags_route_dssi_audio_info = { sizeof (AgsRouteDssiAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_route_dssi_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRouteDssiAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_route_dssi_audio_init, }; ags_type_route_dssi_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsRouteDssiAudio", &ags_route_dssi_audio_info, 0); g_once_init_leave (&g_define_type_id__volatile, ags_type_route_dssi_audio); } return g_define_type_id__volatile; } void ags_route_dssi_audio_class_init(AgsRouteDssiAudioClass *route_dssi_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_route_dssi_audio_parent_class = g_type_class_peek_parent(route_dssi_audio); gobject = (GObjectClass *) route_dssi_audio; gobject->set_property = ags_route_dssi_audio_set_property; gobject->get_property = ags_route_dssi_audio_get_property; gobject->dispose = ags_route_dssi_audio_dispose; gobject->finalize = ags_route_dssi_audio_finalize; /* properties */ /** * AgsRouteDssiAudio:notation-input: * * If enabled input is taken of #AgsNotation. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-input", i18n_pspec("route notation input"), i18n_pspec("Route notation as input to the DSSI recall."), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_INPUT, param_spec); /** * AgsRouteDssiAudio:sequencer-input: * * If enabled input is taken of #AgsSequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer-input", i18n_pspec("route sequencer input"), i18n_pspec("Route sequencer as input to the DSSI recall."), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_INPUT, param_spec); } void ags_route_dssi_audio_init(AgsRouteDssiAudio *route_dssi_audio) { GList *port; AGS_RECALL(route_dssi_audio)->name = "ags-count-beats"; AGS_RECALL(route_dssi_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(route_dssi_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(route_dssi_audio)->xml_type = "ags-count-beats-audio"; port = NULL; /* notation input */ route_dssi_audio->notation_input = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_route_dssi_audio_plugin_name, "specifier", ags_route_dssi_audio_specifier[0], "control-port", ags_route_dssi_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(route_dssi_audio->notation_input); route_dssi_audio->notation_input->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, route_dssi_audio->notation_input); g_object_ref(route_dssi_audio->notation_input); /* sequencer input */ route_dssi_audio->sequencer_input = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_route_dssi_audio_plugin_name, "specifier", ags_route_dssi_audio_specifier[1], "control-port", ags_route_dssi_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(route_dssi_audio->sequencer_input); route_dssi_audio->sequencer_input->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, route_dssi_audio->sequencer_input); g_object_ref(route_dssi_audio->sequencer_input); /* port */ AGS_RECALL(route_dssi_audio)->port = port; } void ags_route_dssi_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRouteDssiAudio *route_dssi_audio; GRecMutex *recall_mutex; route_dssi_audio = AGS_ROUTE_DSSI_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_dssi_audio); switch(prop_id){ case PROP_NOTATION_INPUT: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == route_dssi_audio->notation_input){ g_rec_mutex_unlock(recall_mutex); return; } if(route_dssi_audio->notation_input != NULL){ g_object_unref(G_OBJECT(route_dssi_audio->notation_input)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } route_dssi_audio->notation_input = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_INPUT: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == route_dssi_audio->sequencer_input){ g_rec_mutex_unlock(recall_mutex); return; } if(route_dssi_audio->sequencer_input != NULL){ g_object_unref(G_OBJECT(route_dssi_audio->sequencer_input)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } route_dssi_audio->sequencer_input = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_dssi_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRouteDssiAudio *route_dssi_audio; GRecMutex *recall_mutex; route_dssi_audio = AGS_ROUTE_DSSI_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_dssi_audio); switch(prop_id){ case PROP_NOTATION_INPUT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, route_dssi_audio->notation_input); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_INPUT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, route_dssi_audio->sequencer_input); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_dssi_audio_dispose(GObject *gobject) { AgsRouteDssiAudio *route_dssi_audio; route_dssi_audio = AGS_ROUTE_DSSI_AUDIO(gobject); /* notation input */ if(route_dssi_audio->notation_input != NULL){ g_object_unref(G_OBJECT(route_dssi_audio->notation_input)); route_dssi_audio->notation_input = NULL; } /* sequencer input */ if(route_dssi_audio->sequencer_input != NULL){ g_object_unref(G_OBJECT(route_dssi_audio->sequencer_input)); route_dssi_audio->sequencer_input = NULL; } /* call parent */ G_OBJECT_CLASS(ags_route_dssi_audio_parent_class)->dispose(gobject); } void ags_route_dssi_audio_finalize(GObject *gobject) { AgsRouteDssiAudio *route_dssi_audio; route_dssi_audio = AGS_ROUTE_DSSI_AUDIO(gobject); if(route_dssi_audio->notation_input != NULL){ g_object_unref(G_OBJECT(route_dssi_audio->notation_input)); } if(route_dssi_audio->sequencer_input != NULL){ g_object_unref(G_OBJECT(route_dssi_audio->sequencer_input)); } /* call parent */ G_OBJECT_CLASS(ags_route_dssi_audio_parent_class)->finalize(gobject); } /** * ags_route_dssi_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsRouteDssiAudio * * Returns: the new #AgsRouteDssiAudio * * Since: 3.0.0 */ AgsRouteDssiAudio* ags_route_dssi_audio_new(AgsAudio *audio) { AgsRouteDssiAudio *route_dssi_audio; route_dssi_audio = (AgsRouteDssiAudio *) g_object_new(AGS_TYPE_ROUTE_DSSI_AUDIO, "audio", audio, NULL); return(route_dssi_audio); } gsequencer-3.1.3/ags/audio/recall/ags_volume_channel.c0000644000175000017500000002045313607210263017716 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_volume_channel_class_init(AgsVolumeChannelClass *volume_channel); void ags_volume_channel_init(AgsVolumeChannel *volume_channel); void ags_volume_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_volume_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_volume_channel_dispose(GObject *gobject); void ags_volume_channel_finalize(GObject *gobject); static AgsPluginPort* ags_volume_channel_get_volume_plugin_port(); /** * SECTION:ags_volume_channel * @short_description: volumes channel * @title: AgsVolumeChannel * @section_id: * @include: ags/audio/recall/ags_volume_channel.h * * The #AgsVolumeChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_VOLUME, }; static gpointer ags_volume_channel_parent_class = NULL; static const gchar *ags_volume_channel_plugin_name = "ags-volume"; static const gchar *ags_volume_channel_specifier[] = { "./volume[0]" }; static const gchar *ags_volume_channel_control_port[] = { "1/1" }; GType ags_volume_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_volume_channel = 0; static const GTypeInfo ags_volume_channel_info = { sizeof (AgsVolumeChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_volume_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVolumeChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_volume_channel_init, }; ags_type_volume_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsVolumeChannel", &ags_volume_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_volume_channel); } return g_define_type_id__volatile; } void ags_volume_channel_class_init(AgsVolumeChannelClass *volume_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_volume_channel_parent_class = g_type_class_peek_parent(volume_channel); /* GObjectClass */ gobject = (GObjectClass *) volume_channel; gobject->set_property = ags_volume_channel_set_property; gobject->get_property = ags_volume_channel_get_property; gobject->dispose = ags_volume_channel_dispose; gobject->finalize = ags_volume_channel_finalize; /* properties */ /** * AgsVolumeChannel:volume: * * The volume port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("volume", i18n_pspec("volume to apply"), i18n_pspec("The volume to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_VOLUME, param_spec); } void ags_volume_channel_init(AgsVolumeChannel *volume_channel) { GList *port; AGS_RECALL(volume_channel)->name = "ags-volume"; AGS_RECALL(volume_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(volume_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(volume_channel)->xml_type = "ags-volume-channel"; /* initialize the port */ port = NULL; /* volume */ volume_channel->volume = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-volume", "specifier", "./volume[0]", "control-port", "1/1", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(volume_channel->volume); volume_channel->volume->port_value.ags_port_float = 1.0; /* port descriptor */ g_object_set(volume_channel->volume, "plugin-port", ags_volume_channel_get_volume_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, volume_channel->volume); g_object_ref(volume_channel->volume); /* set port */ AGS_RECALL(volume_channel)->port = port; } void ags_volume_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsVolumeChannel *volume_channel; GRecMutex *recall_mutex; volume_channel = AGS_VOLUME_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(volume_channel); switch(prop_id){ case PROP_VOLUME: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == volume_channel->volume){ g_rec_mutex_unlock(recall_mutex); return; } if(volume_channel->volume != NULL){ g_object_unref(G_OBJECT(volume_channel->volume)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } volume_channel->volume = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_volume_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsVolumeChannel *volume_channel; GRecMutex *recall_mutex; volume_channel = AGS_VOLUME_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(volume_channel); switch(prop_id){ case PROP_VOLUME: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, volume_channel->volume); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_volume_channel_dispose(GObject *gobject) { AgsVolumeChannel *volume_channel; volume_channel = AGS_VOLUME_CHANNEL(gobject); /* volume */ if(volume_channel->volume != NULL){ g_object_unref(G_OBJECT(volume_channel->volume)); } /* call parent */ G_OBJECT_CLASS(ags_volume_channel_parent_class)->dispose(gobject); } void ags_volume_channel_finalize(GObject *gobject) { AgsVolumeChannel *volume_channel; volume_channel = AGS_VOLUME_CHANNEL(gobject); /* volume */ if(volume_channel->volume != NULL){ g_object_unref(G_OBJECT(volume_channel->volume)); } /* call parent */ G_OBJECT_CLASS(ags_volume_channel_parent_class)->finalize(gobject); } static AgsPluginPort* ags_volume_channel_get_volume_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 1.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 2.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_volume_channel_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsVolumeChannel * * Returns: the new #AgsVolumeChannel * * Since: 3.0.0 */ AgsVolumeChannel* ags_volume_channel_new(AgsChannel *source) { AgsVolumeChannel *volume_channel; volume_channel = (AgsVolumeChannel *) g_object_new(AGS_TYPE_VOLUME_CHANNEL, "source", source, NULL); return(volume_channel); } gsequencer-3.1.3/ags/audio/recall/ags_lfo_channel.h0000644000175000017500000000417613607210263017200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LFO_CHANNEL_H__ #define __AGS_LFO_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LFO_CHANNEL (ags_lfo_channel_get_type()) #define AGS_LFO_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LFO_CHANNEL, AgsLfoChannel)) #define AGS_LFO_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LFO_CHANNEL, AgsLfoChannelClass)) #define AGS_IS_LFO_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LFO_CHANNEL)) #define AGS_IS_LFO_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LFO_CHANNEL)) #define AGS_LFO_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LFO_CHANNEL, AgsLfoChannelClass)) typedef struct _AgsLfoChannel AgsLfoChannel; typedef struct _AgsLfoChannelClass AgsLfoChannelClass; struct _AgsLfoChannel { AgsRecallChannel recall_channel; AgsPort *enabled; AgsPort *lfo_wave; AgsPort *lfo_freq; AgsPort *lfo_phase; AgsPort *lfo_depth; AgsPort *lfo_tuning; }; struct _AgsLfoChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_lfo_channel_get_type(); AgsLfoChannel* ags_lfo_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_LFO_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_count_beats_audio_run.h0000644000175000017500000001210013607210263021265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COUNT_BEATS_AUDIO_RUN_H__ #define __AGS_COUNT_BEATS_AUDIO_RUN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COUNT_BEATS_AUDIO_RUN (ags_count_beats_audio_run_get_type()) #define AGS_COUNT_BEATS_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, AgsCountBeatsAudioRun)) #define AGS_COUNT_BEATS_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, AgsCountBeatsAudioRun)) #define AGS_IS_COUNT_BEATS_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COUNT_BEATS_AUDIO_RUN)) #define AGS_IS_COUNT_BEATS_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COUNT_BEATS_AUDIO_RUN)) #define AGS_COUNT_BEATS_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, AgsCountBeatsAudioRunClass)) typedef struct _AgsCountBeatsAudioRun AgsCountBeatsAudioRun; typedef struct _AgsCountBeatsAudioRunClass AgsCountBeatsAudioRunClass; struct _AgsCountBeatsAudioRun { AgsRecallAudioRun recall_audio_run; gboolean first_run; gdouble bpm; gdouble tact; guint64 sequencer_counter; guint64 notation_counter; guint64 wave_counter; guint64 midi_counter; guint recall_ref; guint hide_ref; guint sequencer_hide_ref_counter; guint notation_hide_ref_counter; guint wave_hide_ref_counter; guint midi_hide_ref_counter; AgsDelayAudioRun *delay_audio_run; }; struct _AgsCountBeatsAudioRunClass { AgsRecallAudioRunClass recall_audio_run; void (*sequencer_start)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*sequencer_loop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*sequencer_stop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*notation_start)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*notation_loop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*notation_stop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*wave_start)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*wave_loop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*wave_stop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*midi_start)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*midi_loop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void (*midi_stop)(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); }; GType ags_count_beats_audio_run_get_type(); void ags_count_beats_audio_run_sequencer_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_sequencer_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_sequencer_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_notation_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_notation_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_notation_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_wave_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_wave_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_wave_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_midi_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_midi_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); void ags_count_beats_audio_run_midi_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run); AgsCountBeatsAudioRun* ags_count_beats_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run); G_END_DECLS #endif /*__AGS_COUNT_BEATS_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_channel_run.c0000644000175000017500000004302713616617253020254 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_play_channel_run_class_init(AgsPlayChannelRunClass *play_channel_run); void ags_play_channel_run_init(AgsPlayChannelRun *play_channel_run); void ags_play_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_channel_run_dispose(GObject *gobject); void ags_play_channel_run_finalize(GObject *gobject); void ags_play_channel_run_run_init_inter(AgsRecall *recall); void ags_play_channel_run_run_post(AgsRecall *recall); void ags_play_channel_run_resolve_dependency(AgsRecall *recall); /** * SECTION:ags_play_channel_run * @short_description: plays channel * @title: AgsPlayChannelRun * @section_id: * @include: ags/audio/recall/ags_play_channel_run.h * * The #AgsPlayChannelRun class plays the channel. */ enum{ PROP_0, PROP_STREAM_CHANNEL_RUN, }; static gpointer ags_play_channel_run_parent_class = NULL; static const gchar *ags_play_channel_run_plugin_name = "ags-play"; GType ags_play_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_channel_run = 0; static const GTypeInfo ags_play_channel_run_info = { sizeof (AgsPlayChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_channel_run_init, }; ags_type_play_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsPlayChannelRun", &ags_play_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_channel_run); } return g_define_type_id__volatile; } void ags_play_channel_run_class_init(AgsPlayChannelRunClass *play_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_channel_run_parent_class = g_type_class_peek_parent(play_channel_run); /* GObjectClass */ gobject = (GObjectClass *) play_channel_run; gobject->set_property = ags_play_channel_run_set_property; gobject->get_property = ags_play_channel_run_get_property; gobject->dispose = ags_play_channel_run_dispose; gobject->finalize = ags_play_channel_run_finalize; /* properties */ /** * AgsPlayChannelRun:stream-channel-run: * * The stream channel run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("stream-channel-run", i18n_pspec("assigned AgsStreamChannelRun"), i18n_pspec("the assigned AgsStreamChannelRun"), AGS_TYPE_STREAM_CHANNEL_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STREAM_CHANNEL_RUN, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) play_channel_run; recall->run_init_inter = ags_play_channel_run_run_init_inter; recall->run_post = ags_play_channel_run_run_post; recall->resolve_dependency = ags_play_channel_run_resolve_dependency; } void ags_play_channel_run_init(AgsPlayChannelRun *play_channel_run) { ags_recall_set_ability_flags((AgsRecall *) play_channel_run, (AGS_SOUND_ABILITY_PLAYBACK)); AGS_RECALL(play_channel_run)->name = "ags-play"; AGS_RECALL(play_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_channel_run)->xml_type = "ags-play-channel-run"; AGS_RECALL(play_channel_run)->port = NULL; AGS_RECALL(play_channel_run)->child_type = AGS_TYPE_PLAY_RECYCLING; play_channel_run->flags = 0; play_channel_run->stream_channel_run = NULL; } void ags_play_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayChannelRun *play_channel_run; GRecMutex *recall_mutex; play_channel_run = AGS_PLAY_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run); switch(prop_id){ case PROP_STREAM_CHANNEL_RUN: { AgsStreamChannelRun *stream_channel_run, *old_stream_channel_run; gboolean is_template; stream_channel_run = (AgsStreamChannelRun *) g_value_get_object(value); old_stream_channel_run = NULL; g_rec_mutex_lock(recall_mutex); if((GObject *) stream_channel_run == play_channel_run->stream_channel_run){ g_rec_mutex_unlock(recall_mutex); return; } if(play_channel_run->stream_channel_run != NULL){ old_stream_channel_run = play_channel_run->stream_channel_run; g_object_unref(G_OBJECT(play_channel_run->stream_channel_run)); } if(stream_channel_run != NULL){ g_object_ref(G_OBJECT(stream_channel_run)); } play_channel_run->stream_channel_run = (GObject *) stream_channel_run; g_rec_mutex_unlock(recall_mutex); /* dependency */ if(ags_recall_test_flags((AgsRecall *) play_channel_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } if(is_template){ if(old_stream_channel_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_channel_run)->recall_dependency, (GObject *) old_stream_channel_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_channel_run), recall_dependency); } } if(is_template && stream_channel_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(play_channel_run), ags_recall_dependency_new((GObject *) stream_channel_run)); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayChannelRun *play_channel_run; GRecMutex *recall_mutex; play_channel_run = AGS_PLAY_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run); switch(prop_id){ case PROP_STREAM_CHANNEL_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(play_channel_run->stream_channel_run)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_channel_run_dispose(GObject *gobject) { AgsPlayChannelRun *play_channel_run; play_channel_run = AGS_PLAY_CHANNEL_RUN(gobject); /* stream channel run */ if(play_channel_run->stream_channel_run != NULL){ g_object_unref(G_OBJECT(play_channel_run->stream_channel_run)); play_channel_run->stream_channel_run = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_channel_run_parent_class)->dispose(gobject); } void ags_play_channel_run_finalize(GObject *gobject) { AgsPlayChannelRun *play_channel_run; play_channel_run = AGS_PLAY_CHANNEL_RUN(gobject); /* stream channel run */ if(play_channel_run->stream_channel_run != NULL){ g_object_unref(G_OBJECT(play_channel_run->stream_channel_run)); } /* call parent */ G_OBJECT_CLASS(ags_play_channel_run_parent_class)->finalize(gobject); } void ags_play_channel_run_run_init_inter(AgsRecall *recall) { AgsPlayChannelRun *play_channel_run; void (*parent_class_run_init_inter)(AgsRecall *recall); play_channel_run = (AgsPlayChannelRun *) recall; /* get parent class */ parent_class_run_init_inter = AGS_RECALL_CLASS(ags_play_channel_run_parent_class)->run_init_inter; /* set flags */ ags_play_channel_run_set_flags(play_channel_run, AGS_PLAY_CHANNEL_RUN_INITIAL_RUN); /* call parent */ parent_class_run_init_inter(recall); } void ags_play_channel_run_run_post(AgsRecall *recall) { AgsChannel *source; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context; AgsPlayChannelRun *play_channel_run; AgsStreamChannelRun *stream_channel_run; AgsRtStreamChannelRun *rt_stream_channel_run; GList *list_start, *list; GList *recall_recycling_list, *start_recall_recycling_list; GList *recall_audio_signal_list, *start_recall_audio_signal_list; gboolean found; void (*parent_class_run_post)(AgsRecall *recall); play_channel_run = (AgsPlayChannelRun *) recall; /* get parent class and mutex */ parent_class_run_post = AGS_RECALL_CLASS(ags_play_channel_run_parent_class)->run_post; /* call parent */ parent_class_run_post(recall); /* get some fields */ g_object_get(recall, "source", &source, "recall-id", &recall_id, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); found = FALSE; if(ags_recall_global_get_rt_safe()){ /* connect done */ g_object_get(source, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type_with_recycling_context(list, AGS_TYPE_RT_STREAM_CHANNEL_RUN, (GObject *) recycling_context)) != NULL && !found){ rt_stream_channel_run = AGS_RT_STREAM_CHANNEL_RUN(list->data); if(ags_recall_test_flags((AgsRecall *) rt_stream_channel_run, AGS_RECALL_TEMPLATE)){ list = list->next; continue; } g_object_get(rt_stream_channel_run, "child", &start_recall_recycling_list, NULL); recall_recycling_list = start_recall_recycling_list; while(recall_recycling_list != NULL && !found){ recall_audio_signal_list = AGS_RECALL(recall_recycling_list->data)->children; while(recall_audio_signal_list != NULL){ if(!ags_recall_test_staging_flags((AgsRecall *) recall_audio_signal_list->data, AGS_SOUND_STAGING_DONE) && !ags_recall_test_flags((AgsRecall *) recall_audio_signal_list->data, AGS_RECALL_TEMPLATE)){ found = TRUE; break; } /* iterate */ recall_audio_signal_list = recall_audio_signal_list->next; } // g_list_free(start_recall_audio_signal_list); /* iterate */ recall_recycling_list = recall_recycling_list->next; } // g_list_free(start_recall_recycling_list); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); }else{ /* connect done */ g_object_get(source, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type_with_recycling_context(list, AGS_TYPE_STREAM_CHANNEL_RUN, (GObject *) recycling_context)) != NULL && !found){ stream_channel_run = AGS_STREAM_CHANNEL_RUN(list->data); if(ags_recall_test_flags((AgsRecall *) stream_channel_run, AGS_RECALL_TEMPLATE)){ list = list->next; continue; } recall_recycling_list = AGS_RECALL(stream_channel_run)->children; while(recall_recycling_list != NULL && !found){ recall_audio_signal_list = AGS_RECALL(recall_recycling_list->data)->children; while(recall_audio_signal_list != NULL){ if(!ags_recall_test_staging_flags((AgsRecall *) recall_audio_signal_list->data, AGS_SOUND_STAGING_DONE) && !ags_recall_test_flags((AgsRecall *) recall_audio_signal_list->data, AGS_RECALL_TEMPLATE)){ found = TRUE; break; } /* iterate */ recall_audio_signal_list = recall_audio_signal_list->next; } // g_list_free(start_recall_audio_signal_list); /* iterate */ recall_recycling_list = recall_recycling_list->next; } // g_list_free(start_recall_recycling_list); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); } if(!found && !ags_recall_id_test_state_flags(recall_id, AGS_SOUND_STATE_IS_WAITING)){ ags_recall_done(recall); } /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); } void ags_play_channel_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallContainer *recall_container; AgsRecallID *recall_id; AgsRecallDependency *recall_dependency; AgsStreamChannelRun *stream_channel_run; GList *list_start, *list; guint i, i_stop; /* get template */ g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-channel-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); /* check recall dependency */ list_start = NULL; g_object_get(template, "recall-dependency", &list_start, NULL); stream_channel_run = NULL; list = list_start; i_stop = 1; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_STREAM_CHANNEL_RUN(dependency)){ stream_channel_run = (AgsStreamChannelRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); list = list->next; } g_list_free_full(list_start, g_object_unref); g_object_set(G_OBJECT(recall), "stream_channel_run", stream_channel_run, NULL); g_object_unref(recall_id); g_object_unref(recall_container); } /** * ags_play_channel_run_test_flags: * @play_channel_run: the #AgsPlayChannelRun * @flags: the flags * * Test @flags to be set on @play_channel_run. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_play_channel_run_test_flags(AgsPlayChannelRun *play_channel_run, guint flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_PLAY_CHANNEL_RUN(play_channel_run)){ return(FALSE); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run); /* test */ g_rec_mutex_lock(recall_mutex); retval = (flags & (play_channel_run->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_play_channel_run_set_flags: * @play_channel_run: the #AgsPlayChannelRun * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_play_channel_run_set_flags(AgsPlayChannelRun *play_channel_run, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_PLAY_CHANNEL_RUN(play_channel_run)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run); /* set flags */ g_rec_mutex_lock(recall_mutex); play_channel_run->flags |= flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_play_channel_run_unset_flags: * @play_channel_run: the #AgsPlayChannelRun * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_play_channel_run_unset_flags(AgsPlayChannelRun *play_channel_run, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_PLAY_CHANNEL_RUN(play_channel_run)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run); /* set flags */ g_rec_mutex_lock(recall_mutex); play_channel_run->flags &= (~flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_play_channel_run_new: * @source: the #AgsChannel * @stream_channel_run: the #AgsStreamChannelRun dependency * * Create a new instance of #AgsPlayChannelRun * * Returns: the new #AgsPlayChannelRun * * Since: 3.0.0 */ AgsPlayChannelRun* ags_play_channel_run_new(AgsChannel *source, GObject *stream_channel_run) { AgsPlayChannelRun *play_channel_run; play_channel_run = (AgsPlayChannelRun *) g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN, "source", source, "stream-channel-run", stream_channel_run, NULL); return(play_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_eq10_recycling.c0000644000175000017500000000721113607210263017521 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_eq10_recycling_class_init(AgsEq10RecyclingClass *eq10_recycling); void ags_eq10_recycling_init(AgsEq10Recycling *eq10_recycling); void ags_eq10_recycling_connect(AgsConnectable *connectable); void ags_eq10_recycling_finalize(GObject *gobject); /** * SECTION:ags_eq10_recycling * @short_description: 10 band equalizer on recycling * @title: AgsEq10Recycling * @section_id: * @include: ags/audio/recall/ags_eq10_recycling.h * * The #AgsEq10Recycling class does a 10 band equalizer on the recycling. */ static gpointer ags_eq10_recycling_parent_class = NULL; GType ags_eq10_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_eq10_recycling = 0; static const GTypeInfo ags_eq10_recycling_info = { sizeof(AgsEq10RecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_eq10_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEq10Recycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_eq10_recycling_init, }; ags_type_eq10_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsEq10Recycling", &ags_eq10_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_eq10_recycling); } return g_define_type_id__volatile; } void ags_eq10_recycling_class_init(AgsEq10RecyclingClass *eq10_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_eq10_recycling_parent_class = g_type_class_peek_parent(eq10_recycling); /* GObjectClass */ gobject = (GObjectClass *) eq10_recycling; gobject->finalize = ags_eq10_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) eq10_recycling; } void ags_eq10_recycling_init(AgsEq10Recycling *eq10_recycling) { AGS_RECALL(eq10_recycling)->name = "ags-eq10"; AGS_RECALL(eq10_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(eq10_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(eq10_recycling)->xml_type = "ags-eq10-recycling"; AGS_RECALL(eq10_recycling)->port = NULL; AGS_RECALL(eq10_recycling)->child_type = AGS_TYPE_EQ10_AUDIO_SIGNAL; } void ags_eq10_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_eq10_recycling_parent_class)->finalize(gobject); } /** * ags_eq10_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsEq10Recycling * * Returns: the new #AgsEq10Recycling * * Since: 3.0.0 */ AgsEq10Recycling* ags_eq10_recycling_new(AgsRecycling *source) { AgsEq10Recycling *eq10_recycling; eq10_recycling = (AgsEq10Recycling *) g_object_new(AGS_TYPE_EQ10_RECYCLING, "source", source, NULL); return(eq10_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_play_channel_run_master.h0000644000175000017500000000622313607210263021617 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_CHANNEL_RUN_MASTER_H__ #define __AGS_PLAY_CHANNEL_RUN_MASTER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_CHANNEL_RUN_MASTER (ags_play_channel_run_master_get_type()) #define AGS_PLAY_CHANNEL_RUN_MASTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_CHANNEL_RUN_MASTER, AgsPlayChannelRunMaster)) #define AGS_PLAY_CHANNEL_RUN_MASTER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_CHANNEL_RUN_MASTER, AgsPlayChannelRunMasterClass)) #define AGS_IS_PLAY_CHANNEL_RUN_MASTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLAY_CHANNEL_RUN_MASTER)) #define AGS_IS_PLAY_CHANNEL_RUN_MASTER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PLAY_CHANNEL_RUN_MASTER)) #define AGS_PLAY_CHANNEL_RUN_MASTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PLAY_CHANNEL_RUN_MASTER, AgsPlayChannelRunMasterClass)) #define AGS_PLAY_CHANNEL_RUN_MASTER_STREAMER(strct) ((AgsPlayChannelRunMasterStreamer *)(strct)) typedef struct _AgsPlayChannelRunMaster AgsPlayChannelRunMaster; typedef struct _AgsPlayChannelRunMasterClass AgsPlayChannelRunMasterClass; typedef struct _AgsPlayChannelRunMasterStreamer AgsPlayChannelRunMasterStreamer; /** * AgsPlayChannelRunMasterFlags: * @AGS_PLAY_CHANNEL_RUN_MASTER_TERMINATING: recall is terminating * * Enum values to control the behavior or indicate internal state of #AgsPlayChannelRunMaster by * enable/disable as flags. */ typedef enum{ AGS_PLAY_CHANNEL_RUN_MASTER_TERMINATING = 1, }AgsPlayChannelRunMasterFlags; struct _AgsPlayChannelRunMaster { AgsRecallChannelRun recall_channel_run; guint flags; GList *stream_channel_run; }; struct _AgsPlayChannelRunMasterClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_play_channel_run_master_get_type(); gboolean ags_play_channel_run_master_test_flags(AgsPlayChannelRunMaster *play_channel_run_master, guint flags); void ags_play_channel_run_master_set_flags(AgsPlayChannelRunMaster *play_channel_run_master, guint flags); void ags_play_channel_run_master_unset_flags(AgsPlayChannelRunMaster *play_channel_run_master, guint flags); AgsPlayChannelRunMaster* ags_play_channel_run_master_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PLAY_CHANNEL_RUN_MASTER_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_wave_audio_run.h0000644000175000017500000000425113607210263020756 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_WAVE_AUDIO_RUN_H__ #define __AGS_PLAY_WAVE_AUDIO_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_WAVE_AUDIO_RUN (ags_play_wave_audio_run_get_type()) #define AGS_PLAY_WAVE_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_WAVE_AUDIO_RUN, AgsPlayWaveAudioRun)) #define AGS_PLAY_WAVE_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_WAVE_AUDIO_RUN, AgsPlayWaveAudioRun)) #define AGS_IS_PLAY_WAVE_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_WAVE_AUDIO_RUN)) #define AGS_IS_PLAY_WAVE_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_WAVE_AUDIO_RUN)) #define AGS_PLAY_WAVE_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_WAVE_AUDIO_RUN, AgsPlayWaveAudioRunClass)) typedef struct _AgsPlayWaveAudioRun AgsPlayWaveAudioRun; typedef struct _AgsPlayWaveAudioRunClass AgsPlayWaveAudioRunClass; struct _AgsPlayWaveAudioRun { AgsRecallAudioRun recall_audio_run; guint flags; }; struct _AgsPlayWaveAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_play_wave_audio_run_get_type(); AgsPlayWaveAudioRun* ags_play_wave_audio_run_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_PLAY_WAVE_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_copy_recycling.h0000644000175000017500000000412713607210263017735 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_RECYCLING_H__ #define __AGS_COPY_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_RECYCLING (ags_copy_recycling_get_type()) #define AGS_COPY_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_RECYCLING, AgsCopyRecycling)) #define AGS_COPY_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_RECYCLING, AgsCopyRecyclingClass)) #define AGS_IS_COPY_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_RECYCLING)) #define AGS_IS_COPY_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_RECYCLING)) #define AGS_COPY_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_RECYCLING, AgsCopyRecyclingClass)) typedef struct _AgsCopyRecycling AgsCopyRecycling; typedef struct _AgsCopyRecyclingClass AgsCopyRecyclingClass; struct _AgsCopyRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsCopyRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_copy_recycling_get_type(); AgsCopyRecycling* ags_copy_recycling_new(AgsRecycling *destination, AgsRecycling *source); G_END_DECLS #endif /*__AGS_COPY_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_route_lv2_audio_run.c0000644000175000017500000010327313616617253020721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_route_lv2_audio_run_class_init(AgsRouteLv2AudioRunClass *route_lv2_audio_run); void ags_route_lv2_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_route_lv2_audio_run_init(AgsRouteLv2AudioRun *route_lv2_audio_run); void ags_route_lv2_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_route_lv2_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_route_lv2_audio_run_dispose(GObject *gobject); void ags_route_lv2_audio_run_finalize(GObject *gobject); void ags_route_lv2_audio_run_connect(AgsConnectable *connectable); void ags_route_lv2_audio_run_disconnect(AgsConnectable *connectable); void ags_route_lv2_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_route_lv2_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_route_lv2_audio_run_resolve_dependency(AgsRecall *recall); void ags_route_lv2_audio_run_run_post(AgsRecall *recall); void ags_route_lv2_audio_run_alloc_input_callback_feed_note(AgsRouteLv2AudioRun *route_lv2_audio_run, AgsNotation *notation, guint audio_start_mapping, guint audio_end_mapping, guint64 notation_counter); void ags_route_lv2_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsRouteLv2AudioRun *route_lv2_audio_run); void ags_route_lv2_audio_run_feed_midi(AgsRecall *recall, AgsNote *note); /** * SECTION:ags_route_lv2_audio_run * @short_description: route MIDI * @title: AgsRouteLv2AudioRun * @section_id: * @include: ags/audio/recall/ags_route_lv2_audio_run.h * * The #AgsRouteLv2AudioRun routes MIDI to LV2 recall. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, }; static gpointer ags_route_lv2_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_route_lv2_audio_run_parent_connectable_interface; GType ags_route_lv2_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_route_lv2_audio_run; static const GTypeInfo ags_route_lv2_audio_run_info = { sizeof (AgsRouteLv2AudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_route_lv2_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRouteLv2AudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_route_lv2_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_route_lv2_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_route_lv2_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsRouteLv2AudioRun", &ags_route_lv2_audio_run_info, 0); g_type_add_interface_static(ags_type_route_lv2_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave (&g_define_type_id__volatile, ags_type_route_lv2_audio_run); } return g_define_type_id__volatile; } void ags_route_lv2_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_route_lv2_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_route_lv2_audio_run_connect; connectable->disconnect = ags_route_lv2_audio_run_disconnect; connectable->connect_connection = ags_route_lv2_audio_run_connect_connection; connectable->disconnect_connection = ags_route_lv2_audio_run_disconnect_connection; } void ags_route_lv2_audio_run_class_init(AgsRouteLv2AudioRunClass *route_lv2_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_route_lv2_audio_run_parent_class = g_type_class_peek_parent(route_lv2_audio_run); /* GObjectClass */ gobject = (GObjectClass *) route_lv2_audio_run; gobject->set_property = ags_route_lv2_audio_run_set_property; gobject->get_property = ags_route_lv2_audio_run_get_property; gobject->dispose = ags_route_lv2_audio_run_dispose; gobject->finalize = ags_route_lv2_audio_run_finalize; /* properties */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits notation_alloc_input signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which just counts"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) route_lv2_audio_run; recall->resolve_dependency = ags_route_lv2_audio_run_resolve_dependency; recall->run_post = ags_route_lv2_audio_run_run_post; } void ags_route_lv2_audio_run_init(AgsRouteLv2AudioRun *route_lv2_audio_run) { ags_recall_set_ability_flags((AgsRecall *) route_lv2_audio_run, (AGS_SOUND_ABILITY_NOTATION)); AGS_RECALL(route_lv2_audio_run)->name = "ags-route-lv2"; AGS_RECALL(route_lv2_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(route_lv2_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(route_lv2_audio_run)->xml_type = "ags-route-lv2-audio-run"; AGS_RECALL(route_lv2_audio_run)->port = NULL; route_lv2_audio_run->delay_audio_run = NULL; route_lv2_audio_run->count_beats_audio_run = NULL; route_lv2_audio_run->notation = NULL; route_lv2_audio_run->timestamp = ags_timestamp_new(); route_lv2_audio_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); route_lv2_audio_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; route_lv2_audio_run->timestamp->timer.ags_offset.offset = 0; route_lv2_audio_run->sequencer = NULL; route_lv2_audio_run->feed_midi = NULL; route_lv2_audio_run->delta_time = 0; } void ags_route_lv2_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRouteLv2AudioRun *route_lv2_audio_run; GRecMutex *recall_mutex; route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_lv2_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(delay_audio_run == route_lv2_audio_run->delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(route_lv2_audio_run->delay_audio_run != NULL){ old_delay_audio_run = route_lv2_audio_run->delay_audio_run; g_object_unref(G_OBJECT(route_lv2_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(delay_audio_run); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) route_lv2_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(route_lv2_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(route_lv2_audio_run), recall_dependency); } }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(route_lv2_audio_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(route_lv2_audio_run), (GObject *) old_delay_audio_run); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); route_lv2_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(route_lv2_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(route_lv2_audio_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(route_lv2_audio_run), (GObject *) delay_audio_run); } } } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run == route_lv2_audio_run->count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if((AGS_RECALL_TEMPLATE & (AGS_RECALL(route_lv2_audio_run)->flags)) != 0){ is_template = TRUE; }else{ is_template = FALSE; } if(route_lv2_audio_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = route_lv2_audio_run->count_beats_audio_run; g_object_unref(G_OBJECT(route_lv2_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } route_lv2_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) route_lv2_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(route_lv2_audio_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(route_lv2_audio_run), recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(route_lv2_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_lv2_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRouteLv2AudioRun *route_lv2_audio_run; GRecMutex *recall_mutex; route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_lv2_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(route_lv2_audio_run->delay_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(route_lv2_audio_run->count_beats_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_lv2_audio_run_dispose(GObject *gobject) { AgsRouteLv2AudioRun *route_lv2_audio_run; route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(gobject); /* delay audio run */ if(route_lv2_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(route_lv2_audio_run->delay_audio_run)); route_lv2_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(route_lv2_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(route_lv2_audio_run->count_beats_audio_run)); route_lv2_audio_run->count_beats_audio_run = NULL; } /* feed midi */ g_list_free_full(route_lv2_audio_run->feed_midi, g_object_unref); route_lv2_audio_run->feed_midi = NULL; /* call parent */ G_OBJECT_CLASS(ags_route_lv2_audio_run_parent_class)->dispose(gobject); } void ags_route_lv2_audio_run_finalize(GObject *gobject) { AgsRouteLv2AudioRun *route_lv2_audio_run; GList *note; route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(gobject); /* delay audio run */ if(route_lv2_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(route_lv2_audio_run->delay_audio_run)); } /* count beats audio run */ if(route_lv2_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(route_lv2_audio_run->count_beats_audio_run)); } /* timestamp */ if(route_lv2_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(route_lv2_audio_run->timestamp)); } g_list_free_full(route_lv2_audio_run->feed_midi, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_route_lv2_audio_run_parent_class)->finalize(gobject); } void ags_route_lv2_audio_run_connect(AgsConnectable *connectable) { AgsRouteLv2AudioRun *route_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(ags_connectable_is_connected(connectable)){ return; } route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(connectable); g_object_get(route_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_route_lv2_audio_run_parent_connectable_interface->connect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_lv2_audio_run_disconnect(AgsConnectable *connectable) { AgsRouteLv2AudioRun *route_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(!ags_connectable_is_connected(connectable)){ return; } route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(connectable); g_object_get(route_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_route_lv2_audio_run_parent_connectable_interface->disconnect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_lv2_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsRouteLv2AudioRun *route_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(connectable); g_object_get(route_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_signal_connect(G_OBJECT(delay_audio_run), "notation-alloc-input", G_CALLBACK(ags_route_lv2_audio_run_alloc_input_callback), route_lv2_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_lv2_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsRouteLv2AudioRun *route_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(connectable); g_object_get(route_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_object_disconnect(G_OBJECT(delay_audio_run), "any_signal::notation-alloc-input", G_CALLBACK(ags_route_lv2_audio_run_alloc_input_callback), route_lv2_audio_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_lv2_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallID *recall_id; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); list = list_start; delay_audio_run = NULL; count_beats_audio_run = NULL; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); /* unref */ g_object_unref(recall_id); g_object_unref(recall_container); } void ags_route_lv2_audio_run_feed_midi(AgsRecall *recall, AgsNote *note) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *selected_channel, *nth_channel; AgsRecallLv2 *recall_lv2; AgsRecallLv2Run *recall_lv2_run; AgsRecallID *recall_id; AgsRecallID *child_recall_id; AgsRecyclingContext *recycling_context; AgsRecyclingContext *child_recycling_context; AgsDelayAudioRun *delay_audio_run; AgsRouteLv2AudioRun *route_lv2_audio_run; GList *start_generic_channel_recall, *generic_channel_recall; GList *start_generic_recycling_recall, *generic_recycling_recall; GList *start_lv2_run, *lv2_run; GList *start_list_recall, *list_recall; GList *start_list, *list; snd_seq_event_t *seq_event; gchar *str; char *buffer; guint audio_start_mapping; guint midi_start_mapping, midi_end_mapping; guint audio_channel; guint pads; guint output_pads, input_pads; guint selected_pad; guint start_frame, end_frame; guint note_y; GRecMutex *audio_mutex; route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(recall); g_object_get(route_lv2_audio_run, "audio", &audio, "audio-channel", &audio_channel, "recall-id", &recall_id, "delay-audio-run", &delay_audio_run, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio fields */ g_rec_mutex_lock(audio_mutex); audio_start_mapping = audio->audio_start_mapping; midi_start_mapping = audio->midi_start_mapping; midi_end_mapping = audio->midi_end_mapping; output_pads = audio->output_pads; input_pads = audio->input_pads; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* note */ g_object_get(note, "y", ¬e_y, NULL); /* get channel */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ selected_channel = ags_channel_nth(start_input, audio_channel); pads = input_pads; }else{ selected_channel = ags_channel_nth(start_output, audio_channel); pads = output_pads; } if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_channel = ags_channel_pad_nth(selected_channel, audio_start_mapping + pads - note_y - 1); if(selected_channel != NULL){ g_object_unref(selected_channel); } selected_channel = nth_channel; }else{ nth_channel = ags_channel_pad_nth(selected_channel, audio_start_mapping + note_y); if(selected_channel != NULL){ g_object_unref(selected_channel); } selected_channel = nth_channel; } /* check within mapping */ g_object_get(selected_channel, "pad", &selected_pad, NULL); if(selected_pad - audio_start_mapping + midi_start_mapping < midi_start_mapping || selected_pad - audio_start_mapping + midi_start_mapping >= midi_end_mapping){ g_object_unref(audio); g_object_unref(recall_id); g_object_unref(delay_audio_run); g_object_unref(recycling_context); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(selected_channel != NULL){ g_object_unref(selected_channel); } return; } /* get recall id */ if(selected_channel != NULL){ g_object_get(selected_channel, "recall-id", &start_list, NULL); child_recall_id = NULL; list = start_list; while(list != NULL){ AgsRecyclingContext *parent_current_recycling_context, *current_recycling_context; if(AGS_RECALL_ID(list->data)->recycling_context->parent == recycling_context){ child_recall_id = (AgsRecallID *) list->data; break; } list = list->next; } g_list_free_full(start_list, g_object_unref); /* get lv2 run */ if(child_recall_id != NULL){ g_object_get(child_recall_id, "recycling-context", &child_recycling_context, NULL); g_object_get(selected_channel, "recall", &start_list_recall, NULL); //FIXME:JK: use filename and effect to identify start_generic_channel_recall = NULL; list_recall = ags_recall_template_find_type(start_list_recall, AGS_TYPE_RECALL_LV2); if(list_recall != NULL){ AgsRecallContainer *recall_container; g_object_get(list_recall->data, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-channel-run", &start_generic_channel_recall, NULL); g_object_unref(recall_container); } generic_channel_recall = start_generic_channel_recall; while(generic_channel_recall != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; g_object_get(generic_channel_recall->data, "recall-id", ¤t_recall_id, NULL); if(current_recall_id == NULL){ generic_channel_recall = generic_channel_recall->next; continue; } g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); if(current_recycling_context != child_recycling_context){ generic_channel_recall = generic_channel_recall->next; g_object_unref(current_recall_id); continue; } g_object_get(generic_channel_recall->data, "recall-channel", &recall_lv2, NULL); g_object_get(generic_channel_recall->data, "child", &start_generic_recycling_recall, NULL); generic_recycling_recall = start_generic_recycling_recall; while(generic_recycling_recall != NULL){ g_object_get(generic_recycling_recall->data, "child", &start_lv2_run, NULL); lv2_run = start_lv2_run; while(lv2_run != NULL){ recall_lv2_run = AGS_RECALL_LV2_RUN(lv2_run->data); if(ags_recall_global_get_rt_safe() || recall_lv2_run->note == NULL){ /* prepend note */ // route_lv2_audio_run->feed_midi = g_list_prepend(route_lv2_audio_run->feed_midi, // note); g_object_set(recall_lv2_run, "route-lv2-audio-run", route_lv2_audio_run, NULL); /* key on */ seq_event = recall_lv2_run->event_buffer[0]; seq_event->type = SND_SEQ_EVENT_NOTEON; seq_event->data.note.channel = 0; seq_event->data.note.note = 0x7f & (selected_channel->pad - audio_start_mapping + midi_start_mapping); seq_event->data.note.velocity = 127; recall_lv2_run->event_count[0] = 1; g_object_set(recall_lv2_run, "audio-channel", audio_channel, NULL); recall_lv2_run->note = g_list_prepend(recall_lv2_run->note, (GObject *) note); g_object_ref(note); /* write to port */ if(ags_recall_lv2_test_flags(recall_lv2, AGS_RECALL_LV2_HAS_ATOM_PORT)){ ags_lv2_plugin_atom_sequence_append_midi(recall_lv2_run->atom_port, AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT, seq_event, 1); }else if(ags_recall_lv2_test_flags(recall_lv2, AGS_RECALL_LV2_HAS_EVENT_PORT)){ ags_lv2_plugin_event_buffer_append_midi(recall_lv2_run->event_port, AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT, seq_event, 1); } } //fixme:jk: remove notes lv2_run = lv2_run->next; } /* unref */ g_list_free_full(start_lv2_run, g_object_unref); generic_recycling_recall = generic_recycling_recall->next; } /* unref */ g_list_free_full(start_generic_recycling_recall, g_object_unref); g_object_unref(current_recall_id); g_object_unref(current_recycling_context); generic_channel_recall = generic_channel_recall->next; } g_object_unref(child_recycling_context); g_list_free_full(start_generic_channel_recall, g_object_unref); } } /* unref */ g_object_unref(audio); g_object_unref(recall_id); g_object_unref(delay_audio_run); g_object_unref(recycling_context); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(selected_channel != NULL){ g_object_unref(selected_channel); } } void ags_route_lv2_audio_run_alloc_input_callback_feed_note(AgsRouteLv2AudioRun *route_lv2_audio_run, AgsNotation *notation, guint audio_start_mapping, guint audio_end_mapping, guint64 notation_counter) { AgsNote *current_note; GList *start_note, *note; GList *start_list, *list; guint note_y; guint note_x0; if(!AGS_IS_NOTATION(notation)){ return; } start_list = NULL; g_object_get(notation, "note", &start_note, NULL); note = start_note; while(note != NULL){ current_note = AGS_NOTE(note->data); g_object_get(current_note, "x0", ¬e_x0, "y", ¬e_y, NULL); #if 0 g_message("--- %f %f ; %d %d", current_note->stream_delay, delay, note_x0, route_lv2_audio_run->count_beats_audio_run->notation_counter); #endif //FIXME:JK: should consider delay if(note_y >= audio_start_mapping && note_y < audio_end_mapping && note_x0 == notation_counter){ // && floor(note->stream_delay) == floor(delay) start_list = g_list_prepend(start_list, current_note); g_object_ref(current_note); }else if(note_x0 > notation_counter){ break; } /* iterate */ note = note->next; } start_list = g_list_reverse(start_list); /* feed midi */ list = start_list; while(list != NULL){ ags_route_lv2_audio_run_feed_midi((AgsRecall *) route_lv2_audio_run, list->data); g_object_unref(list->data); list = list->next; } g_list_free_full(start_note, g_object_unref); g_list_free(start_list); } void ags_route_lv2_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsRouteLv2AudioRun *route_lv2_audio_run) { AgsAudio *audio; AgsNotation *notation; AgsCountBeatsAudioRun *count_beats_audio_run; AgsRouteLv2Audio *route_lv2_audio; AgsTimestamp *timestamp; GObject *output_soundcard; GList *start_list, *list; guint audio_channel; guint64 notation_counter; guint audio_start_mapping, audio_end_mapping; if((guint) floor(delay) != 0){ // g_message("d %f", delay); return; } g_object_get(route_lv2_audio_run, "audio", &audio, "audio-channel", &audio_channel, "recall-audio", &route_lv2_audio, "count-beats-audio-run", &count_beats_audio_run, NULL); /* feed note - first attempt */ g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); route_lv2_audio_run->timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_counter / AGS_NOTATION_DEFAULT_OFFSET); g_object_get(audio, "audio-start-mapping", &audio_start_mapping, "audio-end-mapping", &audio_end_mapping, "notation", &start_list, NULL); notation = NULL; list = ags_notation_find_near_timestamp(start_list, audio_channel, route_lv2_audio_run->timestamp); if(list != NULL){ notation = list->data; } ags_route_lv2_audio_run_alloc_input_callback_feed_note(route_lv2_audio_run, notation, audio_start_mapping, audio_end_mapping, notation_counter); /* feed note - second attempt */ if(route_lv2_audio_run->timestamp->timer.ags_offset.offset != 0){ route_lv2_audio_run->timestamp->timer.ags_offset.offset -= AGS_NOTATION_DEFAULT_OFFSET; notation = NULL; list = ags_notation_find_near_timestamp(start_list, audio_channel, route_lv2_audio_run->timestamp); if(list != NULL){ notation = list->data; } ags_route_lv2_audio_run_alloc_input_callback_feed_note(route_lv2_audio_run, notation, audio_start_mapping, audio_end_mapping, notation_counter); } /* unref */ g_object_unref(audio); g_object_unref(route_lv2_audio); g_object_unref(count_beats_audio_run); g_list_free_full(start_list, g_object_unref); } void ags_route_lv2_audio_run_run_post(AgsRecall *recall) { AgsAudio *audio; AgsPort *port; AgsDelayAudio *delay_audio; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsRouteLv2AudioRun *route_lv2_audio_run; GObject *output_soundcard; gdouble bpm; guint64 notation_counter; gdouble notation_delay; guint buffer_size; gdouble x; GValue value = {0,}; route_lv2_audio_run = AGS_ROUTE_LV2_AUDIO_RUN(recall); g_object_get(route_lv2_audio_run, "audio", &audio, "delay-audio-run", &delay_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); g_object_get(delay_audio, "buffer-size", &buffer_size, "notation-delay", &port, NULL); g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); /* get notation delay */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(port, &value); notation_delay = g_value_get_double(&value); g_value_unset(&value); /* get bpm */ g_object_get(delay_audio, "bpm", &port, NULL); g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(port, &value); bpm = g_value_get_double(&value); g_value_unset(&value); /* */ x = (((notation_counter * notation_delay) + notation_counter) * buffer_size); route_lv2_audio_run->delta_time = x / 16.0 / bpm * 60.0 / ((AGS_USEC_PER_SEC * bpm / 4.0) / (4.0 * bpm) / AGS_USEC_PER_SEC); /* unref */ g_object_unref(audio); g_object_unref(count_beats_audio_run); g_object_unref(delay_audio_run); g_object_unref(delay_audio); g_object_unref(output_soundcard); } /** * ags_route_lv2_audio_run_new: * @audio: the #AgsAudio * * Create a new instance of #AgsRouteLv2AudioRun * * Returns: the new #AgsRouteLv2AudioRun * * Since: 3.0.0 */ AgsRouteLv2AudioRun* ags_route_lv2_audio_run_new(AgsAudio *audio) { AgsRouteLv2AudioRun *route_lv2_audio_run; route_lv2_audio_run = (AgsRouteLv2AudioRun *) g_object_new(AGS_TYPE_ROUTE_LV2_AUDIO_RUN, "audio", audio, NULL); return(route_lv2_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_play_notation_audio.c0000644000175000017500000000756213607210263020766 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_play_notation_audio_class_init(AgsPlayNotationAudioClass *play_notation_audio); void ags_play_notation_audio_init(AgsPlayNotationAudio *play_notation_audio); void ags_play_notation_audio_finalize(GObject *gobject); /** * SECTION:ags_play_notation_audio * @short_description: play audio notation * @title: AgsPlayNotationAudio * @section_id: * @include: ags/audio/recall/ags_play_notation_audio.h * * The #AgsPlayNotationAudio class provides ports to the effect processor. */ static gpointer ags_play_notation_audio_parent_class = NULL; static const gchar *ags_play_notation_audio_plugin_name = "ags-play-notation"; static const gchar *ags_play_notation_audio_specifier[] = { }; static const gchar *ags_play_notation_audio_control_port[] = { }; GType ags_play_notation_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_notation_audio = 0; static const GTypeInfo ags_play_notation_audio_info = { sizeof (AgsPlayNotationAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_notation_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsPlayNotationAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_notation_audio_init, }; ags_type_play_notation_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsPlayNotationAudio", &ags_play_notation_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_notation_audio); } return g_define_type_id__volatile; } void ags_play_notation_audio_class_init(AgsPlayNotationAudioClass *play_notation_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_play_notation_audio_parent_class = g_type_class_peek_parent(play_notation_audio); /* GObjectClass */ gobject = (GObjectClass *) play_notation_audio; gobject->finalize = ags_play_notation_audio_finalize; } void ags_play_notation_audio_init(AgsPlayNotationAudio *play_notation_audio) { GList *port; AGS_RECALL(play_notation_audio)->name = "ags-play-notation"; AGS_RECALL(play_notation_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_notation_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_notation_audio)->xml_type = "ags-play-notation-audio"; port = NULL; /* set port */ AGS_RECALL(play_notation_audio)->port = port; } void ags_play_notation_audio_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_play_notation_audio_parent_class)->finalize(gobject); } /** * ags_play_notation_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsPlayNotationAudio * * Returns: the new #AgsPlayNotationAudio * * Since: 3.0.0 */ AgsPlayNotationAudio* ags_play_notation_audio_new(AgsAudio *audio) { AgsPlayNotationAudio *play_notation_audio; play_notation_audio = (AgsPlayNotationAudio *) g_object_new(AGS_TYPE_PLAY_NOTATION_AUDIO, "audio", audio, NULL); return(play_notation_audio); } gsequencer-3.1.3/ags/audio/recall/ags_prepare_channel_run.h0000644000175000017500000000426413607210263020740 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PREPARE_CHANNEL_RUN_H__ #define __AGS_PREPARE_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PREPARE_CHANNEL_RUN (ags_prepare_channel_run_get_type()) #define AGS_PREPARE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PREPARE_CHANNEL_RUN, AgsPrepareChannelRun)) #define AGS_PREPARE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PREPARE_CHANNEL_RUN, AgsPrepareChannelRunClass)) #define AGS_IS_PREPARE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PREPARE_CHANNEL_RUN)) #define AGS_IS_PREPARE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PREPARE_CHANNEL_RUN)) #define AGS_PREPARE_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PREPARE_CHANNEL_RUN, AgsPrepareChannelRunClass)) typedef struct _AgsPrepareChannelRun AgsPrepareChannelRun; typedef struct _AgsPrepareChannelRunClass AgsPrepareChannelRunClass; struct _AgsPrepareChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsPrepareChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_prepare_channel_run_get_type(); AgsPrepareChannelRun* ags_prepare_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PREPARE_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_dssi_audio_run.h0000644000175000017500000000604013607210263020754 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_DSSI_AUDIO_RUN_H__ #define __AGS_PLAY_DSSI_AUDIO_RUN_H__ #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_DSSI_AUDIO_RUN (ags_play_dssi_audio_run_get_type()) #define AGS_PLAY_DSSI_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_DSSI_AUDIO_RUN, AgsPlayDssiAudioRun)) #define AGS_PLAY_DSSI_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_DSSI_AUDIO_RUN, AgsPlayDssiAudioRun)) #define AGS_IS_PLAY_DSSI_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_DSSI_AUDIO_RUN)) #define AGS_IS_PLAY_DSSI_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_DSSI_AUDIO_RUN)) #define AGS_PLAY_DSSI_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_DSSI_AUDIO_RUN, AgsPlayDssiAudioRunClass)) #define AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT (8 * 256) typedef struct _AgsPlayDssiAudioRun AgsPlayDssiAudioRun; typedef struct _AgsPlayDssiAudioRunClass AgsPlayDssiAudioRunClass; struct _AgsPlayDssiAudioRun { AgsRecallAudioRun recall_audio_run; guint flags; LADSPA_Handle *ladspa_handle; unsigned long audio_channels; LADSPA_Data *port_data; LADSPA_Data *input; LADSPA_Data *output; long delta_time; snd_seq_event_t **event_buffer; unsigned long *event_count; guint key_on; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GObject *destination; AgsNotation *notation; AgsTimestamp *timestamp; }; struct _AgsPlayDssiAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_play_dssi_audio_run_get_type(); void ags_play_dssi_audio_run_load_ports(AgsPlayDssiAudioRun *play_dssi_audio_run); AgsPlayDssiAudioRun* ags_play_dssi_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run); G_END_DECLS #endif /*__AGS_PLAY_DSSI_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_eq10_channel.h0000644000175000017500000000442213607210263017160 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EQ10_CHANNEL_H__ #define __AGS_EQ10_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EQ10_CHANNEL (ags_eq10_channel_get_type()) #define AGS_EQ10_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EQ10_CHANNEL, AgsEq10Channel)) #define AGS_EQ10_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EQ10_CHANNEL, AgsEq10ChannelClass)) #define AGS_IS_EQ10_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_EQ10_CHANNEL)) #define AGS_IS_EQ10_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EQ10_CHANNEL)) #define AGS_EQ10_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_EQ10_CHANNEL, AgsEq10ChannelClass)) typedef struct _AgsEq10Channel AgsEq10Channel; typedef struct _AgsEq10ChannelClass AgsEq10ChannelClass; struct _AgsEq10Channel { AgsRecallChannel recall_channel; AgsPort *peak_28hz; AgsPort *peak_56hz; AgsPort *peak_112hz; AgsPort *peak_224hz; AgsPort *peak_448hz; AgsPort *peak_896hz; AgsPort *peak_1792hz; AgsPort *peak_3584hz; AgsPort *peak_7168hz; AgsPort *peak_14336hz; AgsPort *pressure; }; struct _AgsEq10ChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_eq10_channel_get_type(); AgsEq10Channel* ags_eq10_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_EQ10_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/AUTHORS0000644000175000017500000000021013461636433014767 00000000000000Joël Krähemann Julius O. Smith III Yuri Victorovich (tiny change) gsequencer-3.1.3/ags/audio/recall/ags_play_recycling.c0000644000175000017500000000640213607210263017721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_play_recycling_class_init(AgsPlayRecyclingClass *play_recycling); void ags_play_recycling_init(AgsPlayRecycling *play_recycling); void ags_play_recycling_finalize(GObject *gobject); /** * SECTION:ags_play_recycling * @short_description: plays recycling * @title: AgsPlayRecycling * @section_id: * @include: ags/audio/recall/ags_play_recycling.h * * The #AgsPlayRecycling class plays the recycling. */ static gpointer ags_play_recycling_parent_class = NULL; GType ags_play_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_recycling = 0; static const GTypeInfo ags_play_recycling_info = { sizeof (AgsPlayRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_recycling_init, }; ags_type_play_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsPlayRecycling", &ags_play_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_recycling); } return g_define_type_id__volatile; } void ags_play_recycling_class_init(AgsPlayRecyclingClass *play_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_play_recycling_parent_class = g_type_class_peek_parent(play_recycling); /* GObjectClass */ gobject = (GObjectClass *) play_recycling; gobject->finalize = ags_play_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) play_recycling; } void ags_play_recycling_init(AgsPlayRecycling *play_recycling) { AGS_RECALL(play_recycling)->child_type = AGS_TYPE_PLAY_AUDIO_SIGNAL; } void ags_play_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_play_recycling_parent_class)->finalize(gobject); } /** * ags_play_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsPlayRecycling * * Returns: the new #AgsPlayRecycling * * Since: 3.0.0 */ AgsPlayRecycling* ags_play_recycling_new(AgsRecycling *source) { AgsPlayRecycling *play_recycling; play_recycling = (AgsPlayRecycling *) g_object_new(AGS_TYPE_PLAY_RECYCLING, "source", source, NULL); return(play_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_analyse_channel_run.h0000644000175000017500000000424713607210263020737 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ANALYSE_CHANNEL_RUN_H__ #define __AGS_ANALYSE_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ANALYSE_CHANNEL_RUN (ags_analyse_channel_run_get_type()) #define AGS_ANALYSE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_ANALYSE_CHANNEL_RUN, AgsAnalyseChannelRun)) #define AGS_ANALYSE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_INSTANCE_CAST(class, AGS_TYPE_ANALYSE_CHANNEL_RUN, AgsAnalyseChannelRunClass)) #define AGS_IS_ANALYSE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ANALYSE_CHANNEL_RUN)) #define AGS_IS_ANALYSE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ANALYSE_CHANNEL_RUN)) #define AGS_ANALYSE_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ANALYSE_CHANNEL_RUN, AgsAnalyseChannelRunClass)) typedef struct _AgsAnalyseChannelRun AgsAnalyseChannelRun; typedef struct _AgsAnalyseChannelRunClass AgsAnalyseChannelRunClass; struct _AgsAnalyseChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsAnalyseChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_analyse_channel_run_get_type(); AgsAnalyseChannelRun* ags_analyse_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_ANALYSE_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_mute_recycling.c0000644000175000017500000000705013607210263017726 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_mute_recycling_class_init(AgsMuteRecyclingClass *mute_recycling); void ags_mute_recycling_init(AgsMuteRecycling *mute_recycling); void ags_mute_recycling_finalize(GObject *gobject); /** * SECTION:ags_mute_recycling * @short_description: mutes recycling * @title: AgsMuteRecycling * @section_id: * @include: ags/audio/recall/ags_mute_recycling.h * * The #AgsMuteRecycling class mutes the recycling. */ static gpointer ags_mute_recycling_parent_class = NULL; GType ags_mute_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mute_recycling = 0; static const GTypeInfo ags_mute_recycling_info = { sizeof (AgsMuteRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mute_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMuteRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mute_recycling_init, }; ags_type_mute_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsMuteRecycling", &ags_mute_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_mute_recycling); } return g_define_type_id__volatile; } void ags_mute_recycling_class_init(AgsMuteRecyclingClass *mute_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_mute_recycling_parent_class = g_type_class_peek_parent(mute_recycling); /* GObjectClass */ gobject = (GObjectClass *) mute_recycling; gobject->finalize = ags_mute_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) mute_recycling; } void ags_mute_recycling_init(AgsMuteRecycling *mute_recycling) { AGS_RECALL(mute_recycling)->name = "ags-mute"; AGS_RECALL(mute_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(mute_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(mute_recycling)->xml_type = "ags-mute-recycling"; AGS_RECALL(mute_recycling)->port = NULL; AGS_RECALL(mute_recycling)->child_type = AGS_TYPE_MUTE_AUDIO_SIGNAL; } void ags_mute_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_mute_recycling_parent_class)->finalize(gobject); } /** * ags_mute_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsMuteRecycling * * Returns: the new #AgsMuteRecycling * * Since: 3.0.0 */ AgsMuteRecycling* ags_mute_recycling_new(AgsRecycling *source) { AgsMuteRecycling *mute_recycling; mute_recycling = (AgsMuteRecycling *) g_object_new(AGS_TYPE_MUTE_RECYCLING, "source", source, NULL); return(mute_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_play_lv2_audio_run.c0000644000175000017500000013200213607210263020506 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_play_lv2_audio_run_class_init(AgsPlayLv2AudioRunClass *play_lv2_audio_run); void ags_play_lv2_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_play_lv2_audio_run_init(AgsPlayLv2AudioRun *play_lv2_audio_run); void ags_play_lv2_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_lv2_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_lv2_audio_run_dispose(GObject *gobject); void ags_play_lv2_audio_run_finalize(GObject *gobject); void ags_play_lv2_audio_run_connect(AgsConnectable *connectable); void ags_play_lv2_audio_run_disconnect(AgsConnectable *connectable); void ags_play_lv2_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_lv2_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_lv2_audio_run_run_init_pre(AgsRecall *recall); void ags_play_lv2_audio_run_run_pre(AgsRecall *recall); void ags_play_lv2_audio_run_resolve_dependency(AgsRecall *recall); void ags_play_lv2_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsPlayLv2AudioRun *play_lv2_audio_run); /** * SECTION:ags_play_lv2_audio_run * @short_description: play lv2 * @title: AgsPlayLv2AudioRun * @section_id: * @include: ags/audio/recall/ags_play_lv2_audio_run.h * * The #AgsPlayLv2AudioRun class play lv2. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, PROP_DESTINATION, PROP_NOTATION, }; static gpointer ags_play_lv2_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_play_lv2_audio_run_parent_connectable_interface; GType ags_play_lv2_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_lv2_audio_run; static const GTypeInfo ags_play_lv2_audio_run_info = { sizeof (AgsPlayLv2AudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_lv2_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayLv2AudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_lv2_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_play_lv2_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_lv2_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsPlayLv2AudioRun", &ags_play_lv2_audio_run_info, 0); g_type_add_interface_static(ags_type_play_lv2_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave (&g_define_type_id__volatile, ags_type_play_lv2_audio_run); } return g_define_type_id__volatile; } void ags_play_lv2_audio_run_class_init(AgsPlayLv2AudioRunClass *play_lv2_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_lv2_audio_run_parent_class = g_type_class_peek_parent(play_lv2_audio_run); /* GObjectClass */ gobject = (GObjectClass *) play_lv2_audio_run; gobject->set_property = ags_play_lv2_audio_run_set_property; gobject->get_property = ags_play_lv2_audio_run_get_property; gobject->dispose = ags_play_lv2_audio_run_dispose; gobject->finalize = ags_play_lv2_audio_run_finalize; /* properties */ /** * AgsPlayLv2AudioRun:delay-audio-run: * * The delay audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits lv2_alloc_input signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsPlayLv2AudioRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which just counts"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /** * AgsPlayLv2AudioRun:destination: * * The destination's audio signal. * * Since: 3.0.0 */ param_spec = g_param_spec_object("destination", i18n_pspec("destination"), i18n_pspec("The destination audio signal"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESTINATION, param_spec); /** * AgsPlayLv2AudioRun:notation: * * The notation containing the notes. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation", i18n_pspec("assigned AgsNotation"), i18n_pspec("The AgsNotation containing notes"), AGS_TYPE_NOTATION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) play_lv2_audio_run; recall->resolve_dependency = ags_play_lv2_audio_run_resolve_dependency; recall->run_init_pre = ags_play_lv2_audio_run_run_init_pre; recall->run_pre = ags_play_lv2_audio_run_run_pre; } void ags_play_lv2_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_play_lv2_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_play_lv2_audio_run_connect; connectable->disconnect = ags_play_lv2_audio_run_disconnect; connectable->connect_connection = ags_play_lv2_audio_run_connect_connection; connectable->disconnect_connection = ags_play_lv2_audio_run_disconnect_connection; } void ags_play_lv2_audio_run_init(AgsPlayLv2AudioRun *play_lv2_audio_run) { ags_recall_set_ability_flags((AgsRecall *) play_lv2_audio_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(play_lv2_audio_run)->name = "ags-play-lv2"; AGS_RECALL(play_lv2_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_lv2_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_lv2_audio_run)->xml_type = "ags-play-lv2-audio-run"; AGS_RECALL(play_lv2_audio_run)->port = NULL; play_lv2_audio_run->lv2_handle = NULL; play_lv2_audio_run->port_data = NULL; play_lv2_audio_run->input = NULL; play_lv2_audio_run->output = NULL; play_lv2_audio_run->event_port = NULL; play_lv2_audio_run->atom_port = NULL; play_lv2_audio_run->delta_time = 0; play_lv2_audio_run->event_buffer = NULL; play_lv2_audio_run->event_count = NULL; play_lv2_audio_run->key_on = 0; play_lv2_audio_run->worker_handle = NULL; play_lv2_audio_run->delay_audio_run = NULL; play_lv2_audio_run->count_beats_audio_run = NULL; play_lv2_audio_run->destination = NULL; play_lv2_audio_run->notation = NULL; play_lv2_audio_run->timestamp = ags_timestamp_new(); g_object_ref(play_lv2_audio_run->timestamp); play_lv2_audio_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); play_lv2_audio_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; play_lv2_audio_run->timestamp->timer.ags_offset.offset = 0; } void ags_play_lv2_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayLv2AudioRun *play_lv2_audio_run; GRecMutex *recall_mutex; play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(delay_audio_run == play_lv2_audio_run->delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(play_lv2_audio_run->delay_audio_run != NULL){ old_delay_audio_run = play_lv2_audio_run->delay_audio_run; g_object_unref(G_OBJECT(play_lv2_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(delay_audio_run); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) play_lv2_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_lv2_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_lv2_audio_run), recall_dependency); } }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_lv2_audio_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(play_lv2_audio_run), (GObject *) old_delay_audio_run); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); play_lv2_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(play_lv2_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_lv2_audio_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(play_lv2_audio_run), (GObject *) delay_audio_run); } } } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run == play_lv2_audio_run->count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if((AGS_RECALL_TEMPLATE & (AGS_RECALL(play_lv2_audio_run)->flags)) != 0){ is_template = TRUE; }else{ is_template = FALSE; } if(play_lv2_audio_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = play_lv2_audio_run->count_beats_audio_run; g_object_unref(G_OBJECT(play_lv2_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } play_lv2_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) play_lv2_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_lv2_audio_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_lv2_audio_run), recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(play_lv2_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; case PROP_DESTINATION: { AgsAudioSignal *destination; destination = (AgsAudioSignal *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_lv2_audio_run->destination == (GObject *) destination){ g_rec_mutex_unlock(recall_mutex); return; } if(play_lv2_audio_run->destination != NULL){ g_object_unref(play_lv2_audio_run->destination); } if(destination != NULL){ g_object_ref(destination); } play_lv2_audio_run->destination = (GObject *) destination; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_lv2_audio_run->notation == notation){ g_rec_mutex_unlock(recall_mutex); return; } if(play_lv2_audio_run->notation != NULL){ g_object_unref(play_lv2_audio_run->notation); } if(notation != NULL){ g_object_ref(notation); } play_lv2_audio_run->notation = notation; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_lv2_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayLv2AudioRun *play_lv2_audio_run; GRecMutex *recall_mutex; play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(play_lv2_audio_run->delay_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(play_lv2_audio_run->count_beats_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_lv2_audio_run->destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_lv2_audio_run->notation); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_lv2_audio_run_dispose(GObject *gobject) { AgsPlayLv2AudioRun *play_lv2_audio_run; play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(gobject); /* delay audio run */ if(play_lv2_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->delay_audio_run)); play_lv2_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(play_lv2_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->count_beats_audio_run)); play_lv2_audio_run->count_beats_audio_run = NULL; } /* notation */ if(play_lv2_audio_run->notation != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->notation)); play_lv2_audio_run->notation = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_lv2_audio_run_parent_class)->dispose(gobject); } void ags_play_lv2_audio_run_finalize(GObject *gobject) { AgsPlayLv2AudioRun *play_lv2_audio_run; play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(gobject); g_free(play_lv2_audio_run->port_data); g_free(play_lv2_audio_run->input); g_free(play_lv2_audio_run->output); //FIXME:JK: memory leak g_free(play_lv2_audio_run->event_port); g_free(play_lv2_audio_run->atom_port); /* delay audio run */ if(play_lv2_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->delay_audio_run)); } /* count beats audio run */ if(play_lv2_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->count_beats_audio_run)); } /* notation */ if(play_lv2_audio_run->notation != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->notation)); } /* timestamp */ if(play_lv2_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(play_lv2_audio_run->timestamp)); } /* call parent */ G_OBJECT_CLASS(ags_play_lv2_audio_run_parent_class)->finalize(gobject); } void ags_play_lv2_audio_run_connect(AgsConnectable *connectable) { AgsPlayLv2AudioRun *play_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(ags_connectable_is_connected(connectable)){ return; } play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(connectable); g_object_get(play_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_play_lv2_audio_run_parent_connectable_interface->connect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_lv2_audio_run_disconnect(AgsConnectable *connectable) { AgsPlayLv2AudioRun *play_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(!ags_connectable_is_connected(connectable)){ return; } play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(connectable); g_object_get(play_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_play_lv2_audio_run_parent_connectable_interface->disconnect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_lv2_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayLv2AudioRun *play_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(connectable); g_object_get(play_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_signal_connect(G_OBJECT(delay_audio_run), "notation-alloc-input", G_CALLBACK(ags_play_lv2_audio_run_alloc_input_callback), play_lv2_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_lv2_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayLv2AudioRun *play_lv2_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(connectable); g_object_get(play_lv2_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_object_disconnect(G_OBJECT(delay_audio_run), "any_signal::notation-alloc-input", G_CALLBACK(ags_play_lv2_audio_run_alloc_input_callback), play_lv2_audio_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_lv2_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallID *recall_id; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); list = list_start; delay_audio_run = NULL; count_beats_audio_run = NULL; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); list = list->next; } g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); /* unref */ g_object_unref(recall_id); g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); } void ags_play_lv2_audio_run_run_init_pre(AgsRecall *recall) { AgsPlayLv2Audio *play_lv2_audio; AgsPlayLv2AudioRun *play_lv2_audio_run; AgsLv2Plugin *lv2_plugin; GObject *output_soundcard; LV2_Handle *lv2_handle; gchar *path; float *output, *input; guint output_lines, input_lines; guint audio_channel; guint samplerate; guint buffer_size; guint port_count; uint32_t i; GRecMutex *play_lv2_audio_mutex; void (*parent_class_run_init_pre)(AgsRecall *recall); void (*connect_port)(LV2_Handle instance, uint32_t port, void *data_location); void (*activate)(LV2_Handle instance); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_play_lv2_audio_run_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(recall); /* get some fields */ g_object_get(play_lv2_audio_run, "output-soundcard", &output_soundcard, "recall-audio", &play_lv2_audio, NULL); /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, &samplerate, &buffer_size, NULL); /* recall mutex */ play_lv2_audio_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* get some fields */ g_rec_mutex_lock(play_lv2_audio_mutex); lv2_plugin = play_lv2_audio->plugin; input_lines = play_lv2_audio->input_lines; output_lines = play_lv2_audio->output_lines; connect_port = play_lv2_audio->plugin_descriptor->connect_port; activate = play_lv2_audio->plugin_descriptor->activate; g_rec_mutex_unlock(play_lv2_audio_mutex); /* set up buffer */ input = NULL; output = NULL; if(input_lines > 0){ input = (float *) malloc(input_lines * buffer_size * sizeof(float)); } output = (float *) malloc(output_lines * buffer_size * sizeof(float)); play_lv2_audio_run->output = output; play_lv2_audio_run->input = input; /* instantiate lv2 */ lv2_handle = (LV2_Handle *) ags_base_plugin_instantiate((AgsBasePlugin *) lv2_plugin, samplerate, buffer_size); play_lv2_audio_run->lv2_handle = lv2_handle; #ifdef AGS_DEBUG g_message("instantiate LV2 handle"); #endif ags_play_lv2_audio_run_load_ports(play_lv2_audio_run); /* can't be done in ags_play_lv2_audio_run_run_init_inter since possebility of overlapping buffers */ g_rec_mutex_lock(play_lv2_audio_mutex); /* connect audio port */ for(i = 0; i < input_lines; i++){ #ifdef AGS_DEBUG g_message("connect port: %d", play_lv2_audio->input_port[i]); #endif connect_port(play_lv2_audio_run->lv2_handle[0], play_lv2_audio->input_port[i], play_lv2_audio_run->input); } for(i = 0; i < output_lines; i++){ #ifdef AGS_DEBUG g_message("connect port: %d", play_lv2_audio->output_port[i]); #endif connect_port(play_lv2_audio_run->lv2_handle[0], play_lv2_audio->output_port[i], play_lv2_audio_run->output); } /* connect event port */ if(ags_play_lv2_audio_test_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_EVENT_PORT)){ play_lv2_audio_run->event_port = ags_lv2_plugin_event_buffer_alloc(AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT); connect_port(play_lv2_audio_run->lv2_handle[0], play_lv2_audio->event_port, play_lv2_audio_run->event_port); } /* connect atom port */ if(ags_play_lv2_audio_test_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_ATOM_PORT)){ play_lv2_audio_run->atom_port = ags_lv2_plugin_alloc_atom_sequence(AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT); connect_port(play_lv2_audio_run->lv2_handle[0], play_lv2_audio->atom_port, play_lv2_audio_run->atom_port); } /* activate */ if(activate != NULL){ activate(play_lv2_audio_run->lv2_handle[0]); } g_rec_mutex_unlock(play_lv2_audio_mutex); /* set program */ if(ags_lv2_plugin_test_flags(lv2_plugin, AGS_LV2_PLUGIN_HAS_PROGRAM_INTERFACE)){ AgsPort *current_port; GList *plugin_port_start, *plugin_port; GList *port; GList *list; gchar *specifier, *current_specifier; float *port_data; guint bank, program; guint port_count; GRecMutex *base_plugin_mutex; g_rec_mutex_lock(play_lv2_audio_mutex); port = g_list_copy(AGS_RECALL(play_lv2_audio)->port); bank = play_lv2_audio->bank; program = play_lv2_audio->program; g_rec_mutex_unlock(play_lv2_audio_mutex); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* get plugin port */ g_rec_mutex_lock(base_plugin_mutex); plugin_port = plugin_port_start = g_list_copy(AGS_BASE_PLUGIN(lv2_plugin)->plugin_port); g_rec_mutex_unlock(base_plugin_mutex); /* create port data */ port_count = g_list_length(plugin_port_start); port_data = (float *) malloc(port_count * sizeof(float)); plugin_port = plugin_port_start; for(i = 0; i < port_count && plugin_port != NULL; ){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_rec_mutex_unlock(plugin_port_mutex); list = ags_port_find_specifier(port, specifier); port_data[i] = 0.0; if(list != NULL){ GValue value = {0,}; current_port = list->data; g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current_port, &value); port_data[i] = g_value_get_float(&value); g_value_unset(&value); } g_free(specifier); /* iterate plugin port */ plugin_port = plugin_port->next; } ags_lv2_plugin_change_program(lv2_plugin, play_lv2_audio_run->lv2_handle[0], bank, program); /* reset port data */ plugin_port = plugin_port_start; for(i = 0; i < port_count && plugin_port != NULL;){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_rec_mutex_unlock(plugin_port_mutex); list = ags_port_find_specifier(port, specifier); if(list != NULL){ GValue value = {0,}; current_port = list->data; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, port_data[i]); ags_port_safe_write_raw(current_port, &value); g_value_unset(&value); } /* iterate plugin port */ plugin_port = plugin_port->next; } g_free(port_data); g_list_free(port); g_list_free(plugin_port_start); } /* unref */ g_object_unref(output_soundcard); g_object_unref(play_lv2_audio); } void ags_play_lv2_audio_run_run_pre(AgsRecall *recall) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel; AgsChannel *selected_channel; AgsRecycling *recycling; AgsAudioSignal *destination; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context; AgsPlayLv2Audio *play_lv2_audio; AgsPlayLv2AudioRun *play_lv2_audio_run; AgsLv2Plugin *lv2_plugin; GObject *output_soundcard; float *output_buffer, *input_buffer; guint output_lines, input_lines; guint audio_channel; guint samplerate; guint buffer_size; guint format; guint copy_mode_in, copy_mode_out; uint32_t i; void (*parent_class_run_pre)(AgsRecall *recall); void (*run)(LV2_Handle instance, uint32_t sample_count); void (*deactivate)(LV2_Handle instance); void (*cleanup)(LV2_Handle instance); GRecMutex *play_lv2_audio_mutex; /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_play_lv2_audio_run_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); play_lv2_audio_run = AGS_PLAY_LV2_AUDIO_RUN(recall); /* get some fields */ g_object_get(play_lv2_audio_run, "output-soundcard", &output_soundcard, "audio-channel", &audio_channel, "recall-id", &recall_id, "audio", &audio, "recall-audio", &play_lv2_audio, "destination", &destination, NULL); /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, NULL, &buffer_size, NULL); /* recall mutex */ play_lv2_audio_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* get some fields */ g_rec_mutex_lock(play_lv2_audio_mutex); lv2_plugin = play_lv2_audio->plugin; input_lines = play_lv2_audio->input_lines; output_lines = play_lv2_audio->output_lines; g_rec_mutex_unlock(play_lv2_audio_mutex); /* get some fields */ g_object_get(audio, "output", &start_output, "input", &start_input, NULL); /* get channel */ selected_channel = ags_channel_nth(start_output, audio_channel); #if 0 if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ selected_channel = ags_channel_nth(start_input, audio_channel); }else{ selected_channel = ags_channel_nth(start_output, audio_channel); } #endif /* recycling */ g_object_get(selected_channel, "first-recycling", &recycling, NULL); ags_recall_unset_behaviour_flags((AgsRecall *) recall, AGS_SOUND_BEHAVIOUR_PERSISTENT); if(destination == NULL){ gdouble delay; guint attack; guint length; //TODO:JK: unclear attack = 0; delay = 0.0; /* create new audio signal */ destination = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) recall_id); g_object_set(play_lv2_audio_run, "destination", destination, NULL); ags_recycling_create_audio_signal_with_defaults(recycling, destination, delay, attack); length = 1; // (guint) (2.0 * soundcard->delay[soundcard->tic_counter]) + 1; ags_audio_signal_stream_resize(destination, length); ags_connectable_connect(AGS_CONNECTABLE(destination)); destination->stream_current = destination->stream; ags_recycling_add_audio_signal(recycling, destination); #ifdef AGS_DEBUG g_message("play %x to %x", destination, recall_id); g_message("creating destination"); #endif } /* * process data */ /* create audio data */ g_object_get(destination, "buffer-size", &buffer_size, "format", &format, NULL); ags_audio_buffer_util_clear_buffer(destination->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); /* get copy mode and clear buffer */ copy_mode_in = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(format)); copy_mode_out = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), AGS_AUDIO_BUFFER_UTIL_FLOAT); if(play_lv2_audio_run->output != NULL){ ags_audio_buffer_util_clear_float(play_lv2_audio_run->output, output_lines, buffer_size); } if(play_lv2_audio_run->input != NULL){ ags_audio_buffer_util_clear_float(play_lv2_audio_run->input, input_lines, buffer_size); } /* copy data */ if(play_lv2_audio_run->input != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(play_lv2_audio_run->input, (guint) input_lines, 0, destination->stream_current->data, 1, 0, (guint) buffer_size, copy_mode_in); } /* process data */ g_rec_mutex_lock(play_lv2_audio_mutex); run = play_lv2_audio->plugin_descriptor->run; g_rec_mutex_unlock(play_lv2_audio_mutex); if(play_lv2_audio_run->key_on != 0 && play_lv2_audio_run->lv2_handle != NULL){ run(play_lv2_audio_run->lv2_handle[0], (uint32_t) buffer_size); } /* copy data */ if(play_lv2_audio_run->output != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(destination->stream_current->data, 1, 0, play_lv2_audio_run->output, (guint) output_lines, 0, (guint) buffer_size, copy_mode_out); } /* unref */ g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(audio); g_object_unref(play_lv2_audio); g_object_unref(destination); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(selected_channel != NULL){ g_object_unref(selected_channel); } if(recycling != NULL){ g_object_unref(recycling); } } void ags_play_lv2_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsPlayLv2AudioRun *play_lv2_audio_run) { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsPlayLv2Audio *play_lv2_audio; AgsDelayAudio *delay_audio; GObject *output_soundcard; snd_seq_event_t *seq_event; snd_seq_event_t **event_buffer; unsigned long *event_count; GList *start_list, *list; GList *start_current_position, *current_position; GList *start_append_note, *append_note; GList *start_remove_note, *remove_note; guint audio_start_mapping; guint midi_start_mapping, midi_end_mapping; guint notation_counter; guint note_x0, note_x1; guint note_y; guint input_pads; guint selected_key; guint audio_channel; guint i; GRecMutex *audio_mutex; if(delay != 0.0){ return; } g_object_get(play_lv2_audio_run, "audio", &audio, "audio-channel", &audio_channel, "output-soundcard", &output_soundcard, "recall-audio", &play_lv2_audio, NULL); g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); /* audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio fields */ g_rec_mutex_lock(audio_mutex); start_list = g_list_copy_deep(audio->notation, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(audio_mutex); if(start_list == NULL){ g_object_unref(audio); g_object_unref(output_soundcard); g_object_unref(play_lv2_audio); g_object_unref(delay_audio); return; } /* get notation */ notation = NULL; current_position = NULL; start_append_note = NULL; start_remove_note = NULL; /* get some fields */ g_rec_mutex_lock(audio_mutex); notation_counter = play_lv2_audio_run->count_beats_audio_run->notation_counter; input_pads = audio->input_pads; audio_start_mapping = audio->audio_start_mapping; midi_start_mapping = audio->midi_start_mapping; midi_end_mapping = audio->midi_end_mapping; g_rec_mutex_unlock(audio_mutex); /* */ play_lv2_audio_run->timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_counter / AGS_NOTATION_DEFAULT_OFFSET); list = ags_notation_find_near_timestamp(start_list, audio_channel, play_lv2_audio_run->timestamp); start_current_position = NULL; if(list != NULL){ notation = list->data; g_object_get(notation, "note", &start_current_position, NULL); current_position = start_current_position; } /* * feed midi */ while(current_position != NULL){ gboolean do_feed; gboolean success; note = AGS_NOTE(current_position->data); do_feed = ags_note_test_flags(note, AGS_NOTE_FEED); g_object_get(note, "x0", ¬e_x0, "x1", ¬e_x1, "y", ¬e_y, NULL); if(note_x0 == notation_counter){ start_append_note = g_list_prepend(start_append_note, note); g_object_ref(note); }else if(do_feed && notation_counter != 0 && (note_x1 == notation_counter || note_x1 == notation_counter - 1)){ //feed }else if((do_feed && notation_counter > 1 && note_x1 == notation_counter - 2) || (!do_feed && note_x1 <= notation_counter)){ start_remove_note = g_list_prepend(start_remove_note, note); g_object_ref(note); }else if(note_x0 > notation_counter){ break; } /* iterate */ current_position = current_position->next; } append_note = start_append_note = g_list_reverse(start_append_note); remove_note = start_remove_note = g_list_reverse(start_remove_note); /* append */ while(append_note != NULL){ gboolean success; note = append_note->data; g_object_get(note, "y", ¬e_y, NULL); /* send key-on */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ selected_key = input_pads - note_y - 1; }else{ selected_key = note_y; } /* key on */ seq_event = (snd_seq_event_t *) malloc(sizeof(snd_seq_event_t)); memset(seq_event, 0, sizeof(snd_seq_event_t)); seq_event->type = SND_SEQ_EVENT_NOTEON; seq_event->data.note.channel = 0; seq_event->data.note.note = 0x7f & (selected_key - audio_start_mapping + midi_start_mapping); seq_event->data.note.velocity = 127; /* write to port */ success = FALSE; if(ags_play_lv2_audio_test_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_ATOM_PORT)){ success = ags_lv2_plugin_atom_sequence_append_midi(play_lv2_audio_run->atom_port, AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT, seq_event, 1); }else if(ags_play_lv2_audio_test_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_EVENT_PORT)){ success = ags_lv2_plugin_event_buffer_append_midi(play_lv2_audio_run->event_port, AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT, seq_event, 1); } if(success){ play_lv2_audio_run->key_on += 1; } free(seq_event); /* iterate */ g_object_unref(append_note->data); append_note = append_note->next; } /* remove */ while(remove_note != NULL){ gint match_index; gboolean success; note = remove_note->data; g_object_get(note, "y", ¬e_y, NULL); /* send key-on */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ selected_key = input_pads - note_y - 1; }else{ selected_key = note_y; } /* remove key-on */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ selected_key = input_pads - note_y - 1; }else{ selected_key = note_y; } /* write to port */ success = FALSE; if(ags_play_lv2_audio_test_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_ATOM_PORT)){ success = ags_lv2_plugin_atom_sequence_remove_midi(play_lv2_audio_run->atom_port, AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT, (0x7f & (selected_key - audio_start_mapping + midi_start_mapping))); }else if(ags_play_lv2_audio_test_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_EVENT_PORT)){ success = ags_lv2_plugin_event_buffer_remove_midi(play_lv2_audio_run->event_port, AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT, (0x7f & (selected_key - audio_start_mapping + midi_start_mapping))); } if(success && play_lv2_audio_run->key_on != 0){ play_lv2_audio_run->key_on -= 1; } /* iterate */ g_object_unref(remove_note->data); remove_note = remove_note->next; } g_list_free_full(start_list, g_object_unref); g_list_free_full(start_current_position, g_object_unref); g_list_free(start_append_note); g_list_free(start_remove_note); /* unref */ g_object_unref(audio); g_object_unref(output_soundcard); g_object_unref(play_lv2_audio); g_object_unref(delay_audio); } /** * ags_play_lv2_audio_run_load_ports: * @play_lv2_audio_run: the #AgsRecallLv2Run * * Set up LV2 ports. * * Since: 3.0.0 */ void ags_play_lv2_audio_run_load_ports(AgsPlayLv2AudioRun *play_lv2_audio_run) { AgsPlayLv2Audio *play_lv2_audio; AgsPort *current; AgsLv2Plugin *lv2_plugin; GList *start_port, *port; GList *start_list, *list; gchar *plugin_name; gchar *specifier; uint32_t port_count; uint32_t i, j; GRecMutex *play_lv2_audio_mutex; g_object_get(play_lv2_audio_run, "recall-audio", &play_lv2_audio, NULL); /* recall mutex */ play_lv2_audio_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* get some fields */ g_rec_mutex_lock(play_lv2_audio_mutex); start_port = g_list_copy(AGS_RECALL(play_lv2_audio)->port); lv2_plugin = play_lv2_audio->plugin; g_rec_mutex_unlock(play_lv2_audio_mutex); /* get some fields */ port_count = g_list_length(start_port); g_object_get(lv2_plugin, "plugin-port", &start_list, NULL); list = start_list; for(i = 0; list != NULL; i++){ guint port_index; GRecMutex *plugin_port_mutex; g_object_get(list->data, "port-index", &port_index, NULL); if(ags_plugin_port_test_flags(list->data, AGS_PLUGIN_PORT_CONTROL)){ /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(list->data); /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(AGS_PLUGIN_PORT(list->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); port = start_port; current = NULL; while(port != NULL){ gboolean success; GRecMutex *port_mutex; port_mutex = AGS_PORT_GET_OBJ_MUTEX(port->data); /* check success */ g_rec_mutex_lock(port_mutex); success = (!g_strcmp0(specifier, AGS_PORT(port->data)->specifier)) ? TRUE: FALSE; g_rec_mutex_unlock(port_mutex); if(success){ current = port->data; break; } /* iterate */ port = port->next; } #ifdef AGS_DEBUG g_message("connect port: %d", AGS_PLUGIN_PORT(list->data)->port_index); #endif if(current != NULL){ ags_base_plugin_connect_port(AGS_BASE_PLUGIN(lv2_plugin), play_lv2_audio_run->lv2_handle[0], port_index, (float *) &(current->port_value.ags_port_float)); } } list = list->next; } /* unref */ g_list_free_full(start_list, g_object_unref); g_object_unref(play_lv2_audio); } /** * ags_play_lv2_audio_run_new: * @audio: the #AgsAudio * @delay_audio_run: the #AgsDelayAudioRun dependency * @count_beats_audio_run: the #AgsCountBeatsAudioRun dependency * * Create a new instance of #AgsPlayLv2AudioRun * * Returns: the new #AgsPlayLv2AudioRun * * Since: 3.0.0 */ AgsPlayLv2AudioRun* ags_play_lv2_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsPlayLv2AudioRun *play_lv2_audio_run; play_lv2_audio_run = (AgsPlayLv2AudioRun *) g_object_new(AGS_TYPE_PLAY_LV2_AUDIO_RUN, "audio", audio, "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); return(play_lv2_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_peak_audio_signal.h0000644000175000017500000000424013607210263020356 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PEAK_AUDIO_SIGNAL_H__ #define __AGS_PEAK_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PEAK_AUDIO_SIGNAL (ags_peak_audio_signal_get_type()) #define AGS_PEAK_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PEAK_AUDIO_SIGNAL, AgsPeakAudioSignal)) #define AGS_PEAK_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PEAK_AUDIO_SIGNAL, AgsPeakAudioSignalClass)) #define AGS_IS_PEAK_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PEAK_AUDIO_SIGNAL)) #define AGS_IS_PEAK_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PEAK_AUDIO_SIGNAL)) #define AGS_PEAK_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PEAK_AUDIO_SIGNAL, AgsPeakAudioSignalClass)) typedef struct _AgsPeakAudioSignal AgsPeakAudioSignal; typedef struct _AgsPeakAudioSignalClass AgsPeakAudioSignalClass; struct _AgsPeakAudioSignal { AgsRecallAudioSignal recall_audio_signal; gdouble peak; }; struct _AgsPeakAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_peak_audio_signal_get_type(); AgsPeakAudioSignal* ags_peak_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_PEAK_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_recycling.c0000644000175000017500000000751513607210263020416 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_analyse_recycling_class_init(AgsAnalyseRecyclingClass *analyse_recycling); void ags_analyse_recycling_init(AgsAnalyseRecycling *analyse_recycling); void ags_analyse_recycling_finalize(GObject *gobject); /** * SECTION:ags_analyse_recycling * @short_description: analyses recycling * @title: AgsAnalyseRecycling * @section_id: * @include: ags/audio/recall/ags_analyse_recycling.h * * The #AgsAnalyseRecycling class analyses the recycling. */ static gpointer ags_analyse_recycling_parent_class = NULL; GType ags_analyse_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_analyse_recycling = 0; static const GTypeInfo ags_analyse_recycling_info = { sizeof (AgsAnalyseRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_analyse_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAnalyseRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_analyse_recycling_init, }; ags_type_analyse_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsAnalyseRecycling", &ags_analyse_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_analyse_recycling); } return g_define_type_id__volatile; } void ags_analyse_recycling_class_init(AgsAnalyseRecyclingClass *analyse_recycling) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_analyse_recycling_parent_class = g_type_class_peek_parent(analyse_recycling); /* GObjectClass */ gobject = (GObjectClass *) analyse_recycling; gobject->finalize = ags_analyse_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) analyse_recycling; } void ags_analyse_recycling_init(AgsAnalyseRecycling *analyse_recycling) { AGS_RECALL(analyse_recycling)->name = "ags-analyse"; AGS_RECALL(analyse_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(analyse_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(analyse_recycling)->xml_type = "ags-analyse-recycling"; AGS_RECALL(analyse_recycling)->port = NULL; AGS_RECALL(analyse_recycling)->child_type = AGS_TYPE_ANALYSE_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(analyse_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_analyse_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_analyse_recycling_parent_class)->finalize(gobject); } /** * ags_analyse_recycling_new: * @source: the source #AgsRecycling * * Create a new instance of #AgsAnalyseRecycling * * Returns: the new #AgsAnalyseRecycling * * Since: 3.0.0 */ AgsAnalyseRecycling* ags_analyse_recycling_new(AgsRecycling *source) { AgsAnalyseRecycling *analyse_recycling; analyse_recycling = (AgsAnalyseRecycling *) g_object_new(AGS_TYPE_ANALYSE_RECYCLING, "source", source, NULL); return(analyse_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_prepare_recycling.h0000644000175000017500000000420713607210263020420 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PREPARE_RECYCLING_H__ #define __AGS_PREPARE_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PREPARE_RECYCLING (ags_prepare_recycling_get_type()) #define AGS_PREPARE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PREPARE_RECYCLING, AgsPrepareRecycling)) #define AGS_PREPARE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PREPARE_RECYCLING, AgsPrepareRecyclingClass)) #define AGS_IS_PREPARE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PREPARE_RECYCLING)) #define AGS_IS_PREPARE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PREPARE_RECYCLING)) #define AGS_PREPARE_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PREPARE_RECYCLING, AgsPrepareRecyclingClass)) typedef struct _AgsPrepareRecycling AgsPrepareRecycling; typedef struct _AgsPrepareRecyclingClass AgsPrepareRecyclingClass; struct _AgsPrepareRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsPrepareRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_prepare_recycling_get_type(); AgsPrepareRecycling* ags_prepare_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_PREPARE_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_eq10_channel.c0000644000175000017500000007433113607210263017161 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_eq10_channel_class_init(AgsEq10ChannelClass *eq10_channel); void ags_eq10_channel_init(AgsEq10Channel *eq10_channel); void ags_eq10_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_eq10_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_eq10_channel_dispose(GObject *gobject); void ags_eq10_channel_finalize(GObject *gobject); static AgsPluginPort* ags_eq10_channel_get_peak_generic_plugin_port(); /** * SECTION:ags_eq10_channel * @short_description: 10 band equalizer channel * @title: AgsEq10Channel * @section_id: * @include: ags/audio/recall/ags_eq10_channel.h * * The #AgsEq10Channel class provides ports to the effect processor. */ enum{ PROP_0, PROP_PEAK_28HZ, PROP_PEAK_56HZ, PROP_PEAK_112HZ, PROP_PEAK_224HZ, PROP_PEAK_448HZ, PROP_PEAK_896HZ, PROP_PEAK_1792HZ, PROP_PEAK_3584HZ, PROP_PEAK_7168HZ, PROP_PEAK_14336HZ, PROP_PRESSURE, }; static gpointer ags_eq10_channel_parent_class = NULL; static AgsPluginInterface *ags_eq10_channel_parent_plugin_interface; static const gchar *ags_eq10_channel_plugin_name = "ags-eq10"; static const gchar *ags_eq10_channel_specifier[] = { "./peak-28hz[0]", "./peak-56hz[0]", "./peak-112hz[0]", "./peak-224hz[0]", "./peak-448hz[0]", "./peak-896hz[0]", "./peak-1792hz[0]", "./peak-3584hz[0]", "./peak-7168hz[0]", "./peak-14336hz[0]", "./pressure[0]", }; static const gchar *ags_eq10_channel_control_port[] = { "1/11", "2/11", "3/11", "4/11", "5/11", "6/11", "7/11", "8/11", "9/11", "10/11", "11/11", }; GType ags_eq10_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_eq10_channel = 0; static const GTypeInfo ags_eq10_channel_info = { sizeof(AgsEq10ChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_eq10_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsEq10Channel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_eq10_channel_init, }; ags_type_eq10_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsEq10Channel", &ags_eq10_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_eq10_channel); } return g_define_type_id__volatile; } void ags_eq10_channel_class_init(AgsEq10ChannelClass *eq10_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_eq10_channel_parent_class = g_type_class_peek_parent(eq10_channel); /* GObjectClass */ gobject = (GObjectClass *) eq10_channel; gobject->set_property = ags_eq10_channel_set_property; gobject->get_property = ags_eq10_channel_get_property; gobject->dispose = ags_eq10_channel_dispose; gobject->finalize = ags_eq10_channel_finalize; /* properties */ /** * AgsEq10Channel:peak-28hz: * * The peak 28Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-28hz", i18n_pspec("28Hz peak to apply"), i18n_pspec("The 28Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_28HZ, param_spec); /** * AgsEq10Channel:peak-56hz: * * The peak 56Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-56hz", i18n_pspec("56Hz peak to apply"), i18n_pspec("The 56Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_56HZ, param_spec); /** * AgsEq10Channel:peak-112hz: * * The peak 112Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-112hz", i18n_pspec("112Hz peak to apply"), i18n_pspec("The 112Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_112HZ, param_spec); /** * AgsEq10Channel:peak-224hz: * * The peak 224Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-224hz", i18n_pspec("224Hz peak to apply"), i18n_pspec("The 224Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_224HZ, param_spec); /** * AgsEq10Channel:peak-448hz: * * The peak 448Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-448hz", i18n_pspec("448Hz peak to apply"), i18n_pspec("The 448Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_448HZ, param_spec); /** * AgsEq10Channel:peak-896hz: * * The peak 896Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-896hz", i18n_pspec("896Hz peak to apply"), i18n_pspec("The 896Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_896HZ, param_spec); /** * AgsEq10Channel:peak-1792hz: * * The peak 1792Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-1792hz", i18n_pspec("1792Hz peak to apply"), i18n_pspec("The 1792Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_1792HZ, param_spec); /** * AgsEq10Channel:peak-3584hz: * * The peak 3584Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-3584hz", i18n_pspec("3584Hz peak to apply"), i18n_pspec("The 3584Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_3584HZ, param_spec); /** * AgsEq10Channel:peak-7168hz: * * The peak 7168Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-7168hz", i18n_pspec("7168Hz peak to apply"), i18n_pspec("The 7168Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_7168HZ, param_spec); /** * AgsEq10Channel:peak-14336hz: * * The peak 14336Hz port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("peak-14336hz", i18n_pspec("14336Hz peak to apply"), i18n_pspec("The 14336Hz peak to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK_14336HZ, param_spec); /** * AgsEq10Channel:pressure: * * The pressure port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pressure", i18n_pspec("pressure to apply"), i18n_pspec("The pressure to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESSURE, param_spec); } void ags_eq10_channel_init(AgsEq10Channel *eq10_channel) { GList *port; AGS_RECALL(eq10_channel)->name = "ags-eq10"; AGS_RECALL(eq10_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(eq10_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(eq10_channel)->xml_type = "ags-eq10-channel"; /* initialize the port */ port = NULL; /* peak 28hz */ eq10_channel->peak_28hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[0], "control-port", ags_eq10_channel_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_28hz); eq10_channel->peak_28hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_28hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_28hz); g_object_ref(eq10_channel->peak_28hz); /* peak 56hz */ eq10_channel->peak_56hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[1], "control-port", ags_eq10_channel_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_56hz); eq10_channel->peak_56hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_56hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_56hz); g_object_ref(eq10_channel->peak_56hz); /* peak 112hz */ eq10_channel->peak_112hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[2], "control-port", ags_eq10_channel_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_112hz); eq10_channel->peak_112hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_112hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_112hz); g_object_ref(eq10_channel->peak_112hz); /* peak 224hz */ eq10_channel->peak_224hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[3], "control-port", ags_eq10_channel_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_224hz); eq10_channel->peak_224hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_224hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_224hz); g_object_ref(eq10_channel->peak_224hz); /* peak 448hz */ eq10_channel->peak_448hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[4], "control-port", ags_eq10_channel_control_port[4], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_448hz); eq10_channel->peak_448hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_448hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_448hz); g_object_ref(eq10_channel->peak_448hz); /* peak 896hz */ eq10_channel->peak_896hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[5], "control-port", ags_eq10_channel_control_port[5], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_896hz); eq10_channel->peak_896hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_896hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_896hz); g_object_ref(eq10_channel->peak_896hz); /* peak 1792hz */ eq10_channel->peak_1792hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[6], "control-port", ags_eq10_channel_control_port[6], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_1792hz); eq10_channel->peak_1792hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_1792hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_1792hz); g_object_ref(eq10_channel->peak_1792hz); /* peak 3584hz */ eq10_channel->peak_3584hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[7], "control-port", ags_eq10_channel_control_port[7], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_3584hz); eq10_channel->peak_3584hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_3584hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_3584hz); g_object_ref(eq10_channel->peak_3584hz); /* peak 7168hz */ eq10_channel->peak_7168hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[8], "control-port", ags_eq10_channel_control_port[8], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_7168hz); eq10_channel->peak_7168hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_7168hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_7168hz); g_object_ref(eq10_channel->peak_7168hz); /* peak 14336hz */ eq10_channel->peak_14336hz = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[9], "control-port", ags_eq10_channel_control_port[9], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->peak_14336hz); eq10_channel->peak_14336hz->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->peak_14336hz, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->peak_14336hz); g_object_ref(eq10_channel->peak_14336hz); /* pressure */ eq10_channel->pressure = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_eq10_channel_plugin_name, "specifier", ags_eq10_channel_specifier[10], "control-port", ags_eq10_channel_control_port[10], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(eq10_channel->pressure); eq10_channel->pressure->port_value.ags_port_float = 1.0; /* plugin port */ g_object_set(eq10_channel->pressure, "plugin-port", ags_eq10_channel_get_peak_generic_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, eq10_channel->pressure); g_object_ref(eq10_channel->pressure); /* set port */ AGS_RECALL(eq10_channel)->port = port; } void ags_eq10_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEq10Channel *eq10_channel; GRecMutex *recall_mutex; eq10_channel = AGS_EQ10_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(eq10_channel); switch(prop_id){ case PROP_PEAK_28HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_28hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_28hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_28hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_28hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_56HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_56hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_56hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_56hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_56hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_112HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_112hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_112hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_112hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_112hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_224HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_224hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_224hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_224hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_224hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_448HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_448hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_448hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_448hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_448hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_896HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_896hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_896hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_896hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_896hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_1792HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_1792hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_1792hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_1792hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_1792hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_3584HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_3584hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_3584hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_3584hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_3584hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_7168HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_7168hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_7168hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_7168hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_7168hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_14336HZ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->peak_14336hz){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->peak_14336hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_14336hz)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->peak_14336hz = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PRESSURE: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == eq10_channel->pressure){ g_rec_mutex_unlock(recall_mutex); return; } if(eq10_channel->pressure != NULL){ g_object_unref(G_OBJECT(eq10_channel->pressure)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } eq10_channel->pressure = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_eq10_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEq10Channel *eq10_channel; GRecMutex *recall_mutex; eq10_channel = AGS_EQ10_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(eq10_channel); switch(prop_id){ case PROP_PEAK_28HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_28hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_56HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_56hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_112HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_112hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_224HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_224hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_448HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_448hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_896HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_896hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_1792HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_1792hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_3584HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_3584hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_7168HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_7168hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PEAK_14336HZ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->peak_14336hz); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PRESSURE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, eq10_channel->pressure); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_eq10_channel_dispose(GObject *gobject) { AgsEq10Channel *eq10_channel; eq10_channel = AGS_EQ10_CHANNEL(gobject); /* peak 28hz */ if(eq10_channel->peak_28hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_28hz)); eq10_channel->peak_28hz = NULL; } /* peak 56hz */ if(eq10_channel->peak_56hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_56hz)); eq10_channel->peak_56hz = NULL; } /* peak 112hz */ if(eq10_channel->peak_112hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_112hz)); eq10_channel->peak_112hz = NULL; } /* peak 224hz */ if(eq10_channel->peak_224hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_224hz)); eq10_channel->peak_224hz = NULL; } /* peak 448hz */ if(eq10_channel->peak_448hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_448hz)); eq10_channel->peak_448hz = NULL; } /* peak 896hz */ if(eq10_channel->peak_896hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_896hz)); eq10_channel->peak_896hz = NULL; } /* peak 1792hz */ if(eq10_channel->peak_1792hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_1792hz)); eq10_channel->peak_1792hz = NULL; } /* peak 3584hz */ if(eq10_channel->peak_3584hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_3584hz)); eq10_channel->peak_3584hz = NULL; } /* peak 7168hz */ if(eq10_channel->peak_7168hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_7168hz)); eq10_channel->peak_7168hz = NULL; } /* peak 14336hz */ if(eq10_channel->peak_14336hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_14336hz)); eq10_channel->peak_14336hz = NULL; } /* pressure */ if(eq10_channel->pressure != NULL){ g_object_unref(G_OBJECT(eq10_channel->pressure)); eq10_channel->pressure = NULL; } /* call parent */ G_OBJECT_CLASS(ags_eq10_channel_parent_class)->dispose(gobject); } void ags_eq10_channel_finalize(GObject *gobject) { AgsEq10Channel *eq10_channel; eq10_channel = AGS_EQ10_CHANNEL(gobject); /* peak 28hz */ if(eq10_channel->peak_28hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_28hz)); } /* peak 56hz */ if(eq10_channel->peak_56hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_56hz)); } /* peak 112hz */ if(eq10_channel->peak_112hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_112hz)); } /* peak 224hz */ if(eq10_channel->peak_224hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_224hz)); } /* peak 448hz */ if(eq10_channel->peak_448hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_448hz)); } /* peak 896hz */ if(eq10_channel->peak_896hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_896hz)); } /* peak 1792hz */ if(eq10_channel->peak_1792hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_1792hz)); } /* peak 3584hz */ if(eq10_channel->peak_3584hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_3584hz)); } /* peak 7168hz */ if(eq10_channel->peak_7168hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_7168hz)); } /* peak 14336hz */ if(eq10_channel->peak_14336hz != NULL){ g_object_unref(G_OBJECT(eq10_channel->peak_14336hz)); } /* pressure */ if(eq10_channel->pressure != NULL){ g_object_unref(G_OBJECT(eq10_channel->pressure)); } /* call parent */ G_OBJECT_CLASS(ags_eq10_channel_parent_class)->finalize(gobject); } static AgsPluginPort* ags_eq10_channel_get_peak_generic_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 1.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 2.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_eq10_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsEq10Channel * * Returns: the new #AgsEq10Channel * * Since: 3.0.0 */ AgsEq10Channel* ags_eq10_channel_new(AgsChannel *source) { AgsEq10Channel *eq10_channel; eq10_channel = (AgsEq10Channel *) g_object_new(AGS_TYPE_EQ10_CHANNEL, "source", source, NULL); return(eq10_channel); } gsequencer-3.1.3/ags/audio/recall/ags_buffer_channel_run.c0000644000175000017500000001035413607210263020543 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_buffer_channel_run_class_init(AgsBufferChannelRunClass *buffer_channel_run); void ags_buffer_channel_run_init(AgsBufferChannelRun *buffer_channel_run); void ags_buffer_channel_run_finalize(GObject *gobject); /** * SECTION:ags_buffer_channel_run * @short_description: buffer channel * @title: AgsBufferChannelRun * @section_id: * @include: ags/audio/recall/ags_buffer_channel_run.h * * The #AgsBufferChannelRun class buffers the channel. */ static gpointer ags_buffer_channel_run_parent_class = NULL; GType ags_buffer_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_buffer_channel_run = 0; static const GTypeInfo ags_buffer_channel_run_info = { sizeof (AgsBufferChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_buffer_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsBufferChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_buffer_channel_run_init, }; ags_type_buffer_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsBufferChannelRun", &ags_buffer_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_buffer_channel_run); } return g_define_type_id__volatile; } void ags_buffer_channel_run_class_init(AgsBufferChannelRunClass *buffer_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_buffer_channel_run_parent_class = g_type_class_peek_parent(buffer_channel_run); /* GObjectClass */ gobject = (GObjectClass *) buffer_channel_run; gobject->finalize = ags_buffer_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) buffer_channel_run; } void ags_buffer_channel_run_init(AgsBufferChannelRun *buffer_channel_run) { ags_recall_set_ability_flags((AgsRecall *) buffer_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(buffer_channel_run)->name = "ags-buffer"; AGS_RECALL(buffer_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(buffer_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(buffer_channel_run)->xml_type = "ags-buffer-channel-run"; AGS_RECALL(buffer_channel_run)->port = NULL; AGS_RECALL(buffer_channel_run)->behaviour_flags |= AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT; AGS_RECALL(buffer_channel_run)->child_type = AGS_TYPE_BUFFER_RECYCLING; } void ags_buffer_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_buffer_channel_run_parent_class)->finalize(gobject); } /** * ags_buffer_channel_run_new: * @destination: the destination #AgsChannel * @source: the source #AgsChannel * * Create a new instance of #AgsBufferChannelRun * * Returns: the new #AgsBufferChannelRun * * Since: 3.0.0 */ AgsBufferChannelRun* ags_buffer_channel_run_new(AgsChannel *destination, AgsChannel *source) { AgsBufferChannelRun *buffer_channel_run; buffer_channel_run = (AgsBufferChannelRun *) g_object_new(AGS_TYPE_BUFFER_CHANNEL_RUN, "destination", destination, "source", source, NULL); return(buffer_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_stream_channel_run.h0000644000175000017500000000423113607210263020567 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STREAM_CHANNEL_RUN_H__ #define __AGS_STREAM_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_STREAM_CHANNEL_RUN (ags_stream_channel_run_get_type()) #define AGS_STREAM_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_STREAM_CHANNEL_RUN, AgsStreamChannelRun)) #define AGS_STREAM_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_STREAM_CHANNEL_RUN, AgsStreamChannelRunClass)) #define AGS_IS_STREAM_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_STREAM_CHANNEL_RUN)) #define AGS_IS_STREAM_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_STREAM_CHANNEL_RUN)) #define AGS_STREAM_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_STREAM_CHANNEL_RUN, AgsStreamChannelRunClass)) typedef struct _AgsStreamChannelRun AgsStreamChannelRun; typedef struct _AgsStreamChannelRunClass AgsStreamChannelRunClass; struct _AgsStreamChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsStreamChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_stream_channel_run_get_type(); AgsStreamChannelRun* ags_stream_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_STREAM_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_channel_run.h0000644000175000017500000000465113607210263021767 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CAPTURE_WAVE_CHANNEL_RUN_H__ #define __AGS_CAPTURE_WAVE_CHANNEL_RUN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN (ags_capture_wave_channel_run_get_type()) #define AGS_CAPTURE_WAVE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN, AgsCaptureWaveChannelRun)) #define AGS_CAPTURE_WAVE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN, AgsCaptureWaveChannelRun)) #define AGS_IS_CAPTURE_WAVE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN)) #define AGS_IS_CAPTURE_WAVE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN)) #define AGS_CAPTURE_WAVE_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN, AgsCaptureWaveChannelRunClass)) typedef struct _AgsCaptureWaveChannelRun AgsCaptureWaveChannelRun; typedef struct _AgsCaptureWaveChannelRunClass AgsCaptureWaveChannelRunClass; struct _AgsCaptureWaveChannelRun { AgsRecallChannelRun recall_channel_run; AgsTimestamp *timestamp; AgsAudioSignal *audio_signal; guint64 x_offset; }; struct _AgsCaptureWaveChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_capture_wave_channel_run_get_type(); AgsCaptureWaveChannelRun* ags_capture_wave_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_CAPTURE_WAVE_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_lfo_recycling.c0000644000175000017500000000674013607210263017541 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_lfo_recycling_class_init(AgsLfoRecyclingClass *lfo_recycling); void ags_lfo_recycling_init(AgsLfoRecycling *lfo_recycling); void ags_lfo_recycling_finalize(GObject *gobject); /** * SECTION:ags_lfo_recycling * @short_description: lfos recycling * @title: AgsLfoRecycling * @section_id: * @include: ags/audio/recall/ags_lfo_recycling.h * * The #AgsLfoRecycling class lfos the recycling. */ static gpointer ags_lfo_recycling_parent_class = NULL; GType ags_lfo_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lfo_recycling = 0; static const GTypeInfo ags_lfo_recycling_info = { sizeof (AgsLfoRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lfo_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLfoRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lfo_recycling_init, }; ags_type_lfo_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsLfoRecycling", &ags_lfo_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lfo_recycling); } return g_define_type_id__volatile; } void ags_lfo_recycling_class_init(AgsLfoRecyclingClass *lfo_recycling) { GObjectClass *gobject; ags_lfo_recycling_parent_class = g_type_class_peek_parent(lfo_recycling); /* GObjectClass */ gobject = (GObjectClass *) lfo_recycling; gobject->finalize = ags_lfo_recycling_finalize; } void ags_lfo_recycling_init(AgsLfoRecycling *lfo_recycling) { AGS_RECALL(lfo_recycling)->name = "ags-lfo"; AGS_RECALL(lfo_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(lfo_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(lfo_recycling)->xml_type = "ags-lfo-recycling"; AGS_RECALL(lfo_recycling)->port = NULL; AGS_RECALL(lfo_recycling)->child_type = AGS_TYPE_LFO_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(lfo_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_lfo_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_lfo_recycling_parent_class)->finalize(gobject); } /** * ags_lfo_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsLfoRecycling * * Returns: the new #AgsLfoRecycling * * Since: 3.0.0 */ AgsLfoRecycling* ags_lfo_recycling_new(AgsRecycling *source) { AgsLfoRecycling *lfo_recycling; lfo_recycling = (AgsLfoRecycling *) g_object_new(AGS_TYPE_LFO_RECYCLING, "source", source, NULL); return(lfo_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_route_lv2_audio_run.h0000644000175000017500000000476413607210263020721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ROUTE_LV2_AUDIO_RUN_H__ #define __AGS_ROUTE_LV2_AUDIO_RUN_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ROUTE_LV2_AUDIO_RUN (ags_route_lv2_audio_run_get_type()) #define AGS_ROUTE_LV2_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ROUTE_LV2_AUDIO_RUN, AgsRouteLv2AudioRun)) #define AGS_ROUTE_LV2_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ROUTE_LV2_AUDIO_RUN, AgsRouteLv2AudioRun)) #define AGS_IS_ROUTE_LV2_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ROUTE_LV2_AUDIO_RUN)) #define AGS_IS_ROUTE_LV2_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ROUTE_LV2_AUDIO_RUN)) #define AGS_ROUTE_LV2_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ROUTE_LV2_AUDIO_RUN, AgsRouteLv2AudioRunClass)) typedef struct _AgsRouteLv2AudioRun AgsRouteLv2AudioRun; typedef struct _AgsRouteLv2AudioRunClass AgsRouteLv2AudioRunClass; struct _AgsRouteLv2AudioRun { AgsRecallAudioRun recall_audio_run; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsNotation *notation; AgsTimestamp *timestamp; GObject *sequencer; GList *feed_midi; long delta_time; }; struct _AgsRouteLv2AudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_route_lv2_audio_run_get_type(); AgsRouteLv2AudioRun* ags_route_lv2_audio_run_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_ROUTE_LV2_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_wave_audio.h0000644000175000017500000000422213607210263020070 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_WAVE_AUDIO_H__ #define __AGS_PLAY_WAVE_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_WAVE_AUDIO (ags_play_wave_audio_get_type()) #define AGS_PLAY_WAVE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_WAVE_AUDIO, AgsPlayWaveAudio)) #define AGS_PLAY_WAVE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_WAVE_AUDIO, AgsPlayWaveAudio)) #define AGS_IS_PLAY_WAVE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_WAVE_AUDIO)) #define AGS_IS_PLAY_WAVE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_WAVE_AUDIO)) #define AGS_PLAY_WAVE_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_WAVE_AUDIO, AgsPlayWaveAudioClass)) typedef struct _AgsPlayWaveAudio AgsPlayWaveAudio; typedef struct _AgsPlayWaveAudioClass AgsPlayWaveAudioClass; struct _AgsPlayWaveAudio { AgsRecallAudio recall_audio; AgsPort *wave_loop; AgsPort *wave_loop_start; AgsPort *wave_loop_end; }; struct _AgsPlayWaveAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_play_wave_audio_get_type(); AgsPlayWaveAudio* ags_play_wave_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_PLAY_WAVE_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_mute_channel_run.h0000644000175000017500000000414313607210263020250 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTE_CHANNEL_RUN_H__ #define __AGS_MUTE_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTE_CHANNEL_RUN (ags_mute_channel_run_get_type()) #define AGS_MUTE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTE_CHANNEL_RUN, AgsMuteChannelRun)) #define AGS_MUTE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MUTE_CHANNEL_RUN, AgsMuteChannelRunClass)) #define AGS_IS_MUTE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MUTE_CHANNEL_RUN)) #define AGS_IS_MUTE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MUTE_CHANNEL_RUN)) #define AGS_MUTE_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MUTE_CHANNEL_RUN, AgsMuteChannelRunClass)) typedef struct _AgsMuteChannelRun AgsMuteChannelRun; typedef struct _AgsMuteChannelRunClass AgsMuteChannelRunClass; struct _AgsMuteChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsMuteChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_mute_channel_run_get_type(); AgsMuteChannelRun* ags_mute_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_MUTE_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_feed_recycling.h0000644000175000017500000000406613607210263017670 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FEED_RECYCLING_H__ #define __AGS_FEED_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FEED_RECYCLING (ags_feed_recycling_get_type()) #define AGS_FEED_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FEED_RECYCLING, AgsFeedRecycling)) #define AGS_FEED_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FEED_RECYCLING, AgsFeedRecyclingClass)) #define AGS_IS_FEED_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FEED_RECYCLING)) #define AGS_IS_FEED_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FEED_RECYCLING)) #define AGS_FEED_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FEED_RECYCLING, AgsFeedRecyclingClass)) typedef struct _AgsFeedRecycling AgsFeedRecycling; typedef struct _AgsFeedRecyclingClass AgsFeedRecyclingClass; struct _AgsFeedRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsFeedRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_feed_recycling_get_type(); AgsFeedRecycling* ags_feed_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_FEED_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_envelope_audio_signal.h0000644000175000017500000000442213607210263021255 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_AUDIO_SIGNAL_H__ #define __AGS_ENVELOPE_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_AUDIO_SIGNAL (ags_envelope_audio_signal_get_type()) #define AGS_ENVELOPE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_AUDIO_SIGNAL, AgsEnvelopeAudioSignal)) #define AGS_ENVELOPE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_AUDIO_SIGNAL, AgsEnvelopeAudioSignalClass)) #define AGS_IS_ENVELOPE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ENVELOPE_AUDIO_SIGNAL)) #define AGS_IS_ENVELOPE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ENVELOPE_AUDIO_SIGNAL)) #define AGS_ENVELOPE_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ENVELOPE_AUDIO_SIGNAL, AgsEnvelopeAudioSignalClass)) typedef struct _AgsEnvelopeAudioSignal AgsEnvelopeAudioSignal; typedef struct _AgsEnvelopeAudioSignalClass AgsEnvelopeAudioSignalClass; struct _AgsEnvelopeAudioSignal { AgsRecallAudioSignal recall_audio_signal; guint frame_count; }; struct _AgsEnvelopeAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_envelope_audio_signal_get_type(); AgsEnvelopeAudioSignal* ags_envelope_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_ENVELOPE_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_route_dssi_audio_run.h0000644000175000017500000000501713607210263021150 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ROUTE_DSSI_AUDIO_RUN_H__ #define __AGS_ROUTE_DSSI_AUDIO_RUN_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ROUTE_DSSI_AUDIO_RUN (ags_route_dssi_audio_run_get_type()) #define AGS_ROUTE_DSSI_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, AgsRouteDssiAudioRun)) #define AGS_ROUTE_DSSI_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, AgsRouteDssiAudioRun)) #define AGS_IS_ROUTE_DSSI_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ROUTE_DSSI_AUDIO_RUN)) #define AGS_IS_ROUTE_DSSI_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ROUTE_DSSI_AUDIO_RUN)) #define AGS_ROUTE_DSSI_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, AgsRouteDssiAudioRunClass)) typedef struct _AgsRouteDssiAudioRun AgsRouteDssiAudioRun; typedef struct _AgsRouteDssiAudioRunClass AgsRouteDssiAudioRunClass; struct _AgsRouteDssiAudioRun { AgsRecallAudioRun recall_audio_run; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsNotation *notation; AgsTimestamp *timestamp; GObject *sequencer; GList *feed_midi; long delta_time; }; struct _AgsRouteDssiAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_route_dssi_audio_run_get_type(); AgsRouteDssiAudioRun* ags_route_dssi_audio_run_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_ROUTE_DSSI_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_channel.h0000644000175000017500000000551213607210263020047 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ANALYSE_CHANNEL_H__ #define __AGS_ANALYSE_CHANNEL_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ANALYSE_CHANNEL (ags_analyse_channel_get_type()) #define AGS_ANALYSE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ANALYSE_CHANNEL, AgsAnalyseChannel)) #define AGS_ANALYSE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ANALYSE_CHANNEL, AgsAnalyseChannel)) #define AGS_IS_ANALYSE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ANALYSE_CHANNEL)) #define AGS_IS_ANALYSE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ANALYSE_CHANNEL)) #define AGS_ANALYSE_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ANALYSE_CHANNEL, AgsAnalyseChannelClass)) #define AGS_ANALYSE_CHANNEL_GET_BUFFER_MUTEX(obj) (&(((AgsAnalyseChannel *) obj)->buffer_mutex)) typedef struct _AgsAnalyseChannel AgsAnalyseChannel; typedef struct _AgsAnalyseChannelClass AgsAnalyseChannelClass; struct _AgsAnalyseChannel { AgsRecallChannel recall_channel; GRecMutex buffer_mutex; guint cache_samplerate; guint cache_buffer_size; guint cache_format; fftw_plan plan; fftw_complex *comout; double *in; double *out; double *frequency_pre_buffer; double *magnitude_pre_buffer; AgsPort *buffer_cleared; AgsPort *buffer_computed; AgsPort *frequency_buffer; AgsPort *magnitude_buffer; }; struct _AgsAnalyseChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_analyse_channel_get_type(); void ags_analyse_channel_buffer_add(AgsAnalyseChannel *analyse_channel, void *buffer, guint samplerate, guint buffer_size, guint format); void ags_analyse_channel_retrieve_frequency_and_magnitude(AgsAnalyseChannel *analyse_channel); AgsAnalyseChannel* ags_analyse_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_ANALYSE_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_audio_run.c0000644000175000017500000003765313607210263021505 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_copy_pattern_audio_run_class_init(AgsCopyPatternAudioRunClass *copy_pattern_audio_run); void ags_copy_pattern_audio_run_init(AgsCopyPatternAudioRun *copy_pattern_audio_run); void ags_copy_pattern_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_copy_pattern_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_copy_pattern_audio_run_dispose(GObject *gobject); void ags_copy_pattern_audio_run_finalize(GObject *gobject); void ags_copy_pattern_audio_run_resolve_dependency(AgsRecall *recall); void ags_copy_pattern_audio_run_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase); /** * SECTION:ags_copy_pattern_audio_run * @short_description: copy pattern * @title: AgsCopyPatternAudioRun * @section_id: * @include: ags/audio/recall/ags_copy_pattern_audio_run.h * * The #AgsCopyPatternAudioRun class copy pattern. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, }; static gpointer ags_copy_pattern_audio_run_parent_class = NULL; GType ags_copy_pattern_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_pattern_audio_run = 0; static const GTypeInfo ags_copy_pattern_audio_run_info = { sizeof(AgsCopyPatternAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_pattern_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCopyPatternAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_pattern_audio_run_init, }; ags_type_copy_pattern_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsCopyPatternAudioRun", &ags_copy_pattern_audio_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_pattern_audio_run); } return g_define_type_id__volatile; } void ags_copy_pattern_audio_run_class_init(AgsCopyPatternAudioRunClass *copy_pattern_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_copy_pattern_audio_run_parent_class = g_type_class_peek_parent(copy_pattern_audio_run); /* GObjectClass */ gobject = (GObjectClass *) copy_pattern_audio_run; gobject->set_property = ags_copy_pattern_audio_run_set_property; gobject->get_property = ags_copy_pattern_audio_run_get_property; gobject->dispose = ags_copy_pattern_audio_run_dispose; gobject->finalize = ags_copy_pattern_audio_run_finalize; /* properties */ /** * AgsCopyPatternAudioRun:delay-audio-run: * * The delay audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits alloc signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsCopyPatternAudioRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which emits beat signal"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) copy_pattern_audio_run; recall->resolve_dependency = ags_copy_pattern_audio_run_resolve_dependency; recall->notify_dependency = ags_copy_pattern_audio_run_notify_dependency; } void ags_copy_pattern_audio_run_init(AgsCopyPatternAudioRun *copy_pattern_audio_run) { ags_recall_set_ability_flags((AgsRecall *) copy_pattern_audio_run, (AGS_SOUND_ABILITY_SEQUENCER)); AGS_RECALL(copy_pattern_audio_run)->name = "ags-copy-pattern"; AGS_RECALL(copy_pattern_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_pattern_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_pattern_audio_run)->xml_type = "ags-copy-pattern-audio-run"; AGS_RECALL(copy_pattern_audio_run)->port = NULL; copy_pattern_audio_run->hide_ref = 0; copy_pattern_audio_run->hide_ref_counter = 0; copy_pattern_audio_run->delay_audio_run = NULL; copy_pattern_audio_run->count_beats_audio_run = NULL; } void ags_copy_pattern_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCopyPatternAudioRun *copy_pattern_audio_run; GRecMutex *recall_mutex; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = (AgsDelayAudioRun *) g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(copy_pattern_audio_run->delay_audio_run == delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(copy_pattern_audio_run->delay_audio_run != NULL){ old_delay_audio_run = copy_pattern_audio_run->delay_audio_run; g_object_unref(G_OBJECT(copy_pattern_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(G_OBJECT(delay_audio_run)); } copy_pattern_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); /* dependency */ if(ags_recall_test_flags((AgsRecall *) delay_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(copy_pattern_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(copy_pattern_audio_run), recall_dependency); } } if(is_template && delay_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(copy_pattern_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = (AgsCountBeatsAudioRun *) g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(copy_pattern_audio_run->count_beats_audio_run == count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(copy_pattern_audio_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = copy_pattern_audio_run->count_beats_audio_run; g_object_unref(G_OBJECT(copy_pattern_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(G_OBJECT(count_beats_audio_run)); } copy_pattern_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) count_beats_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(copy_pattern_audio_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(copy_pattern_audio_run), recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(copy_pattern_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_copy_pattern_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCopyPatternAudioRun *copy_pattern_audio_run; GRecMutex *recall_mutex; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, copy_pattern_audio_run->delay_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, copy_pattern_audio_run->count_beats_audio_run); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_copy_pattern_audio_run_dispose(GObject *gobject) { AgsCopyPatternAudioRun *copy_pattern_audio_run; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(gobject); /* delay audio run */ if(copy_pattern_audio_run->delay_audio_run != NULL){ g_object_unref(copy_pattern_audio_run->delay_audio_run); copy_pattern_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(copy_pattern_audio_run->count_beats_audio_run != NULL){ g_object_unref(copy_pattern_audio_run->count_beats_audio_run); copy_pattern_audio_run->count_beats_audio_run = NULL; } /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_audio_run_parent_class)->dispose(gobject); } void ags_copy_pattern_audio_run_finalize(GObject *gobject) { AgsCopyPatternAudioRun *copy_pattern_audio_run; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(gobject); /* delay audio run */ if(copy_pattern_audio_run->delay_audio_run != NULL){ g_object_unref(copy_pattern_audio_run->delay_audio_run); } /* count beats audio run */ if(copy_pattern_audio_run->count_beats_audio_run != NULL){ g_object_unref(copy_pattern_audio_run->count_beats_audio_run); } /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_audio_run_parent_class)->finalize(gobject); } void ags_copy_pattern_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallContainer *recall_container; AgsRecallID *parent_recall_id; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context; AgsRecyclingContext *recycling_context; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); list = ags_recall_find_template(list_start); if(list == NULL){ g_warning("AgsRecallClass::resolve - missing dependency"); g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); return; } template = AGS_RECALL(list->data); g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); g_object_get(recall, "recall-id", &recall_id, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(parent_recycling_context, "recall-id", &parent_recall_id, NULL); /* prepare to resolve */ delay_audio_run = NULL; count_beats_audio_run = NULL; list = list_start; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, parent_recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, parent_recall_id); i++; } g_object_unref(dependency); list = list->next; } g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); g_object_unref(parent_recall_id); } void ags_copy_pattern_audio_run_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase) { AgsCopyPatternAudioRun *copy_pattern_audio_run; GRecMutex *recall_mutex; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(recall); /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_audio_run); /* notify */ g_rec_mutex_lock(recall_mutex); switch(dependency){ case AGS_RECALL_NOTIFY_RUN: break; case AGS_RECALL_NOTIFY_AUDIO: break; case AGS_RECALL_NOTIFY_AUDIO_RUN: break; case AGS_RECALL_NOTIFY_CHANNEL: break; case AGS_RECALL_NOTIFY_CHANNEL_RUN: if(increase){ copy_pattern_audio_run->hide_ref += 1; }else{ copy_pattern_audio_run->hide_ref -= 1; } break; default: g_message("ags_copy_pattern_audio_run.c - ags_copy_pattern_audio_run_notify: unknown notify"); } g_rec_mutex_unlock(recall_mutex); } /** * ags_copy_pattern_audio_run_new: * @audio: the #AgsAudio * @delay_audio_run: the #AgsDelayAudioRun dependency * @count_beats_audio_run: the #AgsCountBeatsAudioRun dependency * * Create a new instance of #AgsCopyPatternAudioRun * * Returns: the new #AgsCopyPatternAudioRun * * Since: 3.0.0 */ AgsCopyPatternAudioRun* ags_copy_pattern_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsCopyPatternAudioRun *copy_pattern_audio_run; copy_pattern_audio_run = (AgsCopyPatternAudioRun *) g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO_RUN, "audio", audio, "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); return(copy_pattern_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_stream_audio_signal.h0000644000175000017500000000434113607210263020733 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STREAM_AUDIO_SIGNAL_H__ #define __AGS_STREAM_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_STREAM_AUDIO_SIGNAL (ags_stream_audio_signal_get_type()) #define AGS_STREAM_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_STREAM_AUDIO_SIGNAL, AgsStreamAudioSignal)) #define AGS_STREAM_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_STREAM_AUDIO_SIGNAL, AgsStreamAudioSignalClass)) #define AGS_IS_STREAM_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_STREAM_AUDIO_SIGNAL)) #define AGS_IS_STREAM_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_STREAM_AUDIO_SIGNAL)) #define AGS_STREAM_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_STREAM_AUDIO_SIGNAL, AgsStreamAudioSignalClass)) typedef struct _AgsStreamAudioSignal AgsStreamAudioSignal; typedef struct _AgsStreamAudioSignalClass AgsStreamAudioSignalClass; struct _AgsStreamAudioSignal { AgsRecallAudioSignal recall_audio_signal; GObject *dispose_source; }; struct _AgsStreamAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_stream_audio_signal_get_type(); AgsStreamAudioSignal* ags_stream_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_STREAM_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_channel_run_master.c0000644000175000017500000006037113613101164021612 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_play_channel_run_master_class_init(AgsPlayChannelRunMasterClass *play_channel_run_master); void ags_play_channel_run_master_connectable_interface_init(AgsConnectableInterface *connectable); void ags_play_channel_run_master_init(AgsPlayChannelRunMaster *play_channel_run_master); void ags_play_channel_run_master_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_channel_run_master_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_channel_run_master_dispose(GObject *gobject); void ags_play_channel_run_master_finalize(GObject *gobject); void ags_play_channel_run_master_connect(AgsConnectable *connectable); void ags_play_channel_run_master_disconnect(AgsConnectable *connectable); void ags_play_channel_run_master_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_channel_run_master_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_channel_run_master_run_init_pre(AgsRecall *recall); void ags_play_channel_run_master_resolve_dependency(AgsRecall *recall); void ags_play_channel_run_master_remap_child_source(AgsPlayChannelRunMaster *play_channel_run_master, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region); void ags_play_channel_run_master_remap_dependencies(AgsPlayChannelRunMaster *play_channel_run_master, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region); void ags_play_channel_run_master_source_recycling_changed_callback(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region, AgsPlayChannelRunMaster *play_channel_run_master); void ags_play_channel_run_master_stream_channel_done_callback(AgsRecall *recall, AgsPlayChannelRunMaster *play_channel_run_master); /** * SECTION:ags_play_channel_run_master * @short_description: plays channel as toplevel * @title: AgsPlayChannelRunMaster * @section_id: * @include: ags/audio/recall/ags_play_channel_master.h * * The #AgsPlayChannelRunMaster class plays the channel within toplevel context. */ enum{ PROP_0, PROP_STREAM_CHANNEL_RUN, }; static gpointer ags_play_channel_run_master_parent_class = NULL; static AgsConnectableInterface *ags_play_channel_run_master_parent_connectable_interface; GType ags_play_channel_run_master_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_channel_run_master = 0; static const GTypeInfo ags_play_channel_run_master_info = { sizeof (AgsPlayChannelRunMasterClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_channel_run_master_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayChannelRunMaster), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_channel_run_master_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_play_channel_run_master_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_channel_run_master = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsPlayChannelRunMaster", &ags_play_channel_run_master_info, 0); g_type_add_interface_static(ags_type_play_channel_run_master, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_channel_run_master); } return g_define_type_id__volatile; } void ags_play_channel_run_master_class_init(AgsPlayChannelRunMasterClass *play_channel_run_master) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_channel_run_master_parent_class = g_type_class_peek_parent(play_channel_run_master); /* GObjectClass */ gobject = (GObjectClass *) play_channel_run_master; gobject->set_property = ags_play_channel_run_master_set_property; gobject->get_property = ags_play_channel_run_master_get_property; gobject->dispose = ags_play_channel_run_master_dispose; gobject->finalize = ags_play_channel_run_master_finalize; /* properties */ /** * AgsPlayChannelRunMaster:stream-channel-run: (type GList(AgsStreamChannelRun)) (transfer full) * * The assigned stream channel run. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("stream-channel-run", i18n_pspec("assigned AgsStreamChannelRun"), i18n_pspec("an assigned AgsStreamChannelRun"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STREAM_CHANNEL_RUN, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) play_channel_run_master; recall->run_init_pre = ags_play_channel_run_master_run_init_pre; recall->resolve_dependency = ags_play_channel_run_master_resolve_dependency; } void ags_play_channel_run_master_connectable_interface_init(AgsConnectableInterface *connectable) { ags_play_channel_run_master_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_play_channel_run_master_connect; connectable->disconnect = ags_play_channel_run_master_disconnect; connectable->connect_connection = ags_play_channel_run_master_connect_connection; connectable->disconnect_connection = ags_play_channel_run_master_disconnect_connection; } void ags_play_channel_run_master_init(AgsPlayChannelRunMaster *play_channel_run_master) { AGS_RECALL(play_channel_run_master)->name = "ags-play"; AGS_RECALL(play_channel_run_master)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_channel_run_master)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_channel_run_master)->xml_type = "ags-play-channel-run-master"; AGS_RECALL(play_channel_run_master)->port = NULL; AGS_RECALL(play_channel_run_master)->behaviour_flags |= (AGS_SOUND_BEHAVIOUR_PERSISTENT); AGS_RECALL(play_channel_run_master)->child_type = AGS_TYPE_PLAY_RECYCLING; play_channel_run_master->flags = 0; play_channel_run_master->stream_channel_run = NULL; } void ags_play_channel_run_master_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayChannelRunMaster *play_channel_run_master; GRecMutex *recall_mutex; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run_master); switch(prop_id){ case PROP_STREAM_CHANNEL_RUN: { AgsStreamChannelRun *stream_channel_run; gboolean is_template; stream_channel_run = (AgsStreamChannelRun *) g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(stream_channel_run == NULL || g_list_find(play_channel_run_master->stream_channel_run, stream_channel_run) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } if(stream_channel_run != NULL){ g_object_ref(G_OBJECT(stream_channel_run)); } play_channel_run_master->stream_channel_run = g_list_prepend(play_channel_run_master->stream_channel_run, stream_channel_run); g_rec_mutex_unlock(recall_mutex); if(ags_recall_test_flags((AgsRecall *) stream_channel_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } if(is_template){ ags_recall_add_recall_dependency((AgsRecall *) play_channel_run_master, ags_recall_dependency_new((GObject *) stream_channel_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_channel_run_master))){ ags_connectable_connect_connection(AGS_CONNECTABLE(play_channel_run_master), (GObject *) stream_channel_run); } } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_channel_run_master_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayChannelRunMaster *play_channel_run_master; GRecMutex *recall_mutex; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run_master); switch(prop_id){ case PROP_STREAM_CHANNEL_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(play_channel_run_master->stream_channel_run, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_channel_run_master_dispose(GObject *gobject) { AgsPlayChannelRunMaster *play_channel_run_master; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(gobject); /* stream channel run */ if(play_channel_run_master->stream_channel_run != NULL){ g_list_free_full(play_channel_run_master->stream_channel_run, g_object_unref); play_channel_run_master->stream_channel_run = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_channel_run_master_parent_class)->dispose(gobject); } void ags_play_channel_run_master_finalize(GObject *gobject) { AgsPlayChannelRunMaster *play_channel_run_master; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(gobject); /* stream channel run */ if(play_channel_run_master->stream_channel_run != NULL){ g_list_free_full(play_channel_run_master->stream_channel_run, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_play_channel_run_master_parent_class)->finalize(gobject); } void ags_play_channel_run_master_connect(AgsConnectable *connectable) { AgsChannel *channel; AgsPlayChannelRunMaster *play_channel_run_master; GList *list_start, *list; if(ags_connectable_is_connected(connectable)){ return; } play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(connectable); /* call parent */ ags_play_channel_run_master_parent_connectable_interface->connect(connectable); /* source */ g_object_get(play_channel_run_master, "source", &channel, NULL); g_signal_connect(channel, "recycling-changed", G_CALLBACK(ags_play_channel_run_master_source_recycling_changed_callback), play_channel_run_master); /* connection */ g_object_get(play_channel_run_master, "stream-channel-run", &list_start, NULL); list = list_start; while(list != NULL){ ags_connectable_connect_connection(connectable, (GObject *) list->data); list = list->next; } /* unref */ g_object_unref(channel); g_list_free_full(list_start, g_object_unref); } void ags_play_channel_run_master_disconnect(AgsConnectable *connectable) { AgsChannel *channel; AgsPlayChannelRunMaster *play_channel_run_master; GList *list_start, *list; if(!ags_connectable_is_connected(connectable)){ return; } play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(connectable); ags_play_channel_run_master_parent_connectable_interface->disconnect(connectable); /* source */ g_object_get(play_channel_run_master, "source", &channel, NULL); g_object_disconnect(channel, "any_signal::recycling-changed", G_CALLBACK(ags_play_channel_run_master_source_recycling_changed_callback), play_channel_run_master, NULL); /* connection */ g_object_get(play_channel_run_master, "stream-channel-run", &list_start, NULL); list = list_start; while(list != NULL){ ags_connectable_disconnect_connection(connectable, (GObject *) list->data); list = list->next; } /* unref */ g_object_unref(channel); g_list_free_full(list_start, g_object_unref); } void ags_play_channel_run_master_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayChannelRunMaster *play_channel_run_master; GList *list_start; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(connectable); if(connection == NULL){ return; } g_object_get(play_channel_run_master, "stream-channel-run", &list_start, NULL); if(g_list_find(list_start, connection) != NULL){ g_signal_connect(connection, "done", G_CALLBACK(ags_play_channel_run_master_stream_channel_done_callback), play_channel_run_master); } g_list_free_full(list_start, g_object_unref); } void ags_play_channel_run_master_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayChannelRunMaster *play_channel_run_master; GList *list_start; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(connectable); if(connection == NULL){ return; } g_object_get(play_channel_run_master, "stream-channel-run", &list_start, NULL); if(g_list_find(list_start, connection) != NULL){ g_object_disconnect(connection, "any_signal::done", G_CALLBACK(ags_play_channel_run_master_stream_channel_done_callback), play_channel_run_master, NULL); } g_list_free_full(list_start, g_object_unref); } void ags_play_channel_run_master_run_init_pre(AgsRecall *recall) { AgsChannel *channel; AgsRecycling *first_recycling, *last_recycling; AgsPlayChannelRunMaster *play_channel_run_master; void (*parent_class_run_init_pre)(AgsRecall *recall); GRecMutex *recall_mutex; play_channel_run_master = AGS_PLAY_CHANNEL_RUN_MASTER(recall); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_play_channel_run_master_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); /* remap */ g_object_get(play_channel_run_master, "source", &channel, NULL); g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); ags_play_channel_run_master_remap_dependencies(play_channel_run_master, NULL, NULL, first_recycling, last_recycling); g_object_unref(channel); g_object_unref(first_recycling); g_object_unref(last_recycling); } void ags_play_channel_run_master_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallContainer *recall_container; AgsRecallID *recall_id; AgsRecallDependency *recall_dependency; AgsStreamChannelRun *stream_channel_run; GObject *dependency; GList *list_start, *list; guint i, i_stop; /* get some fields */ g_object_get(recall, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-channel-run", &list_start, NULL); list = ags_recall_find_template(list_start); if(list == NULL){ g_warning("AgsRecallClass::resolve - missing dependency"); g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); return; } template = AGS_RECALL(list->data); g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); g_object_get(recall, "recall-id", &recall_id, NULL); /* prepare to resolve */ stream_channel_run = NULL; list = list_start; for(i = 0; list != NULL;){ recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_STREAM_CHANNEL_RUN(dependency)){ stream_channel_run = (AgsStreamChannelRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); g_object_set(G_OBJECT(recall), "stream-channel-run", stream_channel_run, NULL); i++; } g_object_unref(dependency); list = list->next; } /* unref */ g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); g_object_unref(recall_id); } void ags_play_channel_run_master_remap_dependencies(AgsPlayChannelRunMaster *play_channel_run_master, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region) { AgsChannel *current; AgsRecycling *recycling, *next_recycling; AgsRecycling *end_recycling; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context; GRecMutex *recall_mutex; if(!AGS_IS_PLAY_CHANNEL_RUN_MASTER(play_channel_run_master)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run_master); /* get recycling context */ g_object_get(play_channel_run_master, "recall-id", &recall_id, NULL); recycling_context = NULL; if(recall_id != NULL){ g_object_get(recall_id, "recycling-context", &recycling_context, NULL); } /* remove old */ if(old_start_region != NULL){ GList *list_start, *list; current = NULL; recycling = old_start_region; g_object_ref(recycling); end_recycling = ags_recycling_next(old_end_region); next_recycling = NULL; while(recycling != end_recycling){ AgsChannel *tmp_channel; g_object_get(recycling, "channel", &tmp_channel, NULL); if(current != tmp_channel){ current = tmp_channel; g_object_get(play_channel_run_master, "recall-dependency", &list_start, NULL); list = list_start; while((list = ags_recall_dependency_find_dependency_by_provider(list, (GObject *) current)) != NULL){ GObject *dependency; GList *start_stream_channel_run; g_object_get(list->data, "dependency", &dependency, NULL); /* remove dependency */ ags_recall_remove_recall_dependency((AgsRecall *) play_channel_run_master, list->data); /* remove stream channel run */ g_object_get(play_channel_run_master, "stream-channel-run", &start_stream_channel_run, NULL); if(g_list_find(start_stream_channel_run, dependency) != NULL){ g_rec_mutex_lock(recall_mutex); play_channel_run_master->stream_channel_run = g_list_remove(play_channel_run_master->stream_channel_run, dependency); g_rec_mutex_unlock(recall_mutex); g_object_unref(dependency); } g_list_free_full(start_stream_channel_run, g_object_unref); g_object_unref(dependency); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); } /* unref */ g_object_unref(tmp_channel); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* unref */ if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } } /* add new */ if(new_start_region != NULL){ AgsRecallContainer *recall_container; AgsPlayChannelRunMaster *current_master; GList *list_start, *list; GList *master_start, *master; current = NULL; recycling = new_start_region; g_object_ref(recycling); end_recycling = ags_recycling_next(new_end_region); next_recycling = NULL; while(recycling != end_recycling){ AgsChannel *tmp_channel; g_object_get(recycling, "channel", &tmp_channel, NULL); if(current != tmp_channel){ current = tmp_channel; g_object_get(current, "play", &list_start, NULL); list = list_start; while((list = ags_recall_find_type_with_recycling_context(list, AGS_TYPE_STREAM_CHANNEL_RUN, (GObject *) recycling_context)) != NULL){ g_object_set(play_channel_run_master, "stream-channel-run", list->data, NULL); g_object_get(play_channel_run_master, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-channel-run", &master_start, NULL); master = master_start; while(master != NULL){ current_master = AGS_PLAY_CHANNEL_RUN_MASTER(master->data); if(!ags_recall_test_flags((AgsRecall *) current_master, AGS_RECALL_TEMPLATE)){ g_object_set(G_OBJECT(current_master), "stream-channel-run", AGS_STREAM_CHANNEL_RUN(list->data), NULL); } /* iterate */ master = master->next; } g_object_unref(recall_container); g_list_free_full(master_start, g_object_unref); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); } /* unref */ g_object_unref(tmp_channel); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* unref */ if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } } /* unref */ if(recall_id != NULL){ g_object_unref(recall_id); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } void ags_play_channel_run_master_source_recycling_changed_callback(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region, AgsPlayChannelRunMaster *play_channel_run_master) { if(ags_recall_test_flags((AgsRecall *) play_channel_run_master, AGS_RECALL_TEMPLATE)){ ags_play_channel_run_master_remap_dependencies(play_channel_run_master, old_start_changed_region, old_end_changed_region, new_start_changed_region, new_end_changed_region); } } void ags_play_channel_run_master_stream_channel_done_callback(AgsRecall *recall, AgsPlayChannelRunMaster *play_channel_run_master) { GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel_run_master); /* remove stream channel run */ g_rec_mutex_lock(recall_mutex); play_channel_run_master->stream_channel_run = g_list_remove(play_channel_run_master->stream_channel_run, recall); g_object_unref(recall); g_rec_mutex_unlock(recall_mutex); } /** * ags_play_channel_master_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsPlayChannelRunMaster * * Returns: the new #AgsPlayChannelRunMaster * * Since: 3.0.0 */ AgsPlayChannelRunMaster* ags_play_channel_run_master_new(AgsChannel *source) { AgsPlayChannelRunMaster *play_channel_run_master; play_channel_run_master = (AgsPlayChannelRunMaster *) g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN_MASTER, "source", source, NULL); return(play_channel_run_master); } gsequencer-3.1.3/ags/audio/recall/ags_play_wave_audio.c0000644000175000017500000002731613607210263020074 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_play_wave_audio_class_init(AgsPlayWaveAudioClass *play_wave_audio); void ags_play_wave_audio_init(AgsPlayWaveAudio *play_wave_audio); void ags_play_wave_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_wave_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_wave_audio_dispose(GObject *gobject); void ags_play_wave_audio_finalize(GObject *gobject); /** * SECTION:ags_play_wave_audio * @short_description: play audio wave * @title: AgsPlayWaveAudio * @section_id: * @include: ags/audio/recall/ags_play_wave_audio.h * * The #AgsPlayWaveAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_WAVE_LOOP, PROP_WAVE_LOOP_START, PROP_WAVE_LOOP_END, }; static gpointer ags_play_wave_audio_parent_class = NULL; static const gchar *ags_play_wave_audio_plugin_name = "ags-play-wave"; static const gchar *ags_play_wave_audio_specifier[] = { "./wave_loop[0]", "./wave_loop_start[0]", "./wave_loop_end[0]", }; static const gchar *ags_play_wave_audio_control_port[] = { "1/3", "2/3", "3/3", }; GType ags_play_wave_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_wave_audio = 0; static const GTypeInfo ags_play_wave_audio_info = { sizeof (AgsPlayWaveAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_wave_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsPlayWaveAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_wave_audio_init, }; ags_type_play_wave_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsPlayWaveAudio", &ags_play_wave_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_wave_audio); } return g_define_type_id__volatile; } void ags_play_wave_audio_class_init(AgsPlayWaveAudioClass *play_wave_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_play_wave_audio_parent_class = g_type_class_peek_parent(play_wave_audio); /* GObjectClass */ gobject = (GObjectClass *) play_wave_audio; gobject->set_property = ags_play_wave_audio_set_property; gobject->get_property = ags_play_wave_audio_get_property; gobject->dispose = ags_play_wave_audio_dispose; gobject->finalize = ags_play_wave_audio_finalize; /* properties */ /** * AgsPlayWaveAudio:wave-loop: * * Count until loop-end and start at loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-loop", i18n_pspec("wave loop playing"), i18n_pspec("Play wave in a endless loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP, param_spec); /** * AgsPlayWaveAudio:wave-loop-start: * * The wave's loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave_loop_start", i18n_pspec("start beat of loop"), i18n_pspec("The start beat of the wave loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP_START, param_spec); /** * AgsPlayWaveAudio:wave-loop-end: * * The wave's loop-end. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-loop-end", i18n_pspec("end beat of wave loop"), i18n_pspec("The end beat of the wave loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP_END, param_spec); } void ags_play_wave_audio_init(AgsPlayWaveAudio *play_wave_audio) { GList *port; AGS_RECALL(play_wave_audio)->name = "ags-play-wave"; AGS_RECALL(play_wave_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_wave_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_wave_audio)->xml_type = "ags-play-wave-audio"; port = NULL; /* wave loop */ play_wave_audio->wave_loop = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_wave_audio_plugin_name, "specifier", ags_play_wave_audio_specifier[0], "control-port", ags_play_wave_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(play_wave_audio->wave_loop); play_wave_audio->wave_loop->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, play_wave_audio->wave_loop); g_object_ref(play_wave_audio->wave_loop); /* wave-loop-start */ play_wave_audio->wave_loop_start = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_wave_audio_plugin_name, "specifier", ags_play_wave_audio_specifier[1], "control-port", ags_play_wave_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(play_wave_audio->wave_loop_start); play_wave_audio->wave_loop_start->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, play_wave_audio->wave_loop_start); g_object_ref(play_wave_audio->wave_loop_start); /* wave-loop-end */ play_wave_audio->wave_loop_end = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_wave_audio_plugin_name, "specifier", ags_play_wave_audio_specifier[2], "control-port", ags_play_wave_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(play_wave_audio->wave_loop_end); play_wave_audio->wave_loop_end->port_value.ags_port_uint = 64; /* add to port */ port = g_list_prepend(port, play_wave_audio->wave_loop_end); g_object_ref(play_wave_audio->wave_loop_end); /* set port */ AGS_RECALL(play_wave_audio)->port = port; } void ags_play_wave_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayWaveAudio *play_wave_audio; GRecMutex *recall_mutex; play_wave_audio = AGS_PLAY_WAVE_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_wave_audio); switch(prop_id){ case PROP_WAVE_LOOP: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == play_wave_audio->wave_loop){ g_rec_mutex_unlock(recall_mutex); return; } if(play_wave_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } play_wave_audio->wave_loop = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_START: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == play_wave_audio->wave_loop_start){ g_rec_mutex_unlock(recall_mutex); return; } if(play_wave_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop_start)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } play_wave_audio->wave_loop_start = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_END: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == play_wave_audio->wave_loop_end){ g_rec_mutex_unlock(recall_mutex); return; } if(play_wave_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop_end)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } play_wave_audio->wave_loop_end = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_wave_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayWaveAudio *play_wave_audio; GRecMutex *recall_mutex; play_wave_audio = AGS_PLAY_WAVE_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_wave_audio); switch(prop_id){ case PROP_WAVE_LOOP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_wave_audio->wave_loop); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_START: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_wave_audio->wave_loop_start); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_END: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_wave_audio->wave_loop_end); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_wave_audio_dispose(GObject *gobject) { AgsPlayWaveAudio *play_wave_audio; play_wave_audio = AGS_PLAY_WAVE_AUDIO(gobject); /* wave */ if(play_wave_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop)); play_wave_audio->wave_loop = NULL; } if(play_wave_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop_start)); play_wave_audio->wave_loop_start = NULL; } if(play_wave_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop_end)); play_wave_audio->wave_loop_end = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_wave_audio_parent_class)->dispose(gobject); } void ags_play_wave_audio_finalize(GObject *gobject) { AgsPlayWaveAudio *play_wave_audio; play_wave_audio = AGS_PLAY_WAVE_AUDIO(gobject); /* wave */ if(play_wave_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop)); } if(play_wave_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop_start)); } if(play_wave_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(play_wave_audio->wave_loop_end)); } /* call parent */ G_OBJECT_CLASS(ags_play_wave_audio_parent_class)->finalize(gobject); } /** * ags_play_wave_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsPlayWaveAudio * * Returns: the new #AgsPlayWaveAudio * * Since: 3.0.0 */ AgsPlayWaveAudio* ags_play_wave_audio_new(AgsAudio *audio) { AgsPlayWaveAudio *play_wave_audio; play_wave_audio = (AgsPlayWaveAudio *) g_object_new(AGS_TYPE_PLAY_WAVE_AUDIO, "audio", audio, NULL); return(play_wave_audio); } gsequencer-3.1.3/ags/audio/recall/ags_play_dssi_audio.h0000644000175000017500000000517413607210263020077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_DSSI_AUDIO_H__ #define __AGS_PLAY_DSSI_AUDIO_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_DSSI_AUDIO (ags_play_dssi_audio_get_type()) #define AGS_PLAY_DSSI_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_DSSI_AUDIO, AgsPlayDssiAudio)) #define AGS_PLAY_DSSI_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_DSSI_AUDIO, AgsPlayDssiAudio)) #define AGS_IS_PLAY_DSSI_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_DSSI_AUDIO)) #define AGS_IS_PLAY_DSSI_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_DSSI_AUDIO)) #define AGS_PLAY_DSSI_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_DSSI_AUDIO, AgsPlayDssiAudioClass)) typedef struct _AgsPlayDssiAudio AgsPlayDssiAudio; typedef struct _AgsPlayDssiAudioClass AgsPlayDssiAudioClass; struct _AgsPlayDssiAudio { AgsRecallAudio recall_audio; guint bank; guint program; AgsDssiPlugin *plugin; DSSI_Descriptor *plugin_descriptor; guint *input_port; guint input_lines; guint *output_port; guint output_lines; }; struct _AgsPlayDssiAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_play_dssi_audio_get_type(); void ags_play_dssi_audio_load(AgsPlayDssiAudio *play_dssi_audio); GList* ags_play_dssi_audio_load_ports(AgsPlayDssiAudio *play_dssi_audio); void ags_play_dssi_audio_load_conversion(AgsPlayDssiAudio *play_dssi_audio, GObject *port, GObject *plugin_port); GList* ags_play_dssi_audio_find(GList *recall, gchar *filename, gchar *effect); AgsPlayDssiAudio* ags_play_dssi_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_PLAY_DSSI_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_record_midi_audio.c0000644000175000017500000004217413607210263020364 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_record_midi_audio_class_init(AgsRecordMidiAudioClass *record_midi_audio); void ags_record_midi_audio_init(AgsRecordMidiAudio *record_midi_audio); void ags_record_midi_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_record_midi_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_record_midi_audio_dispose(GObject *gobject); void ags_record_midi_audio_finalize(GObject *gobject); /** * SECTION:ags_record_midi_audio * @short_description: record audio midi * @title: AgsRecordMidiAudio * @section_id: * @include: ags/audio/recall/ags_record_midi_audio.h * * The #AgsRecordMidiAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_PLAYBACK, PROP_RECORD, PROP_FILENAME, PROP_DIVISION, PROP_TEMPO, PROP_BPM, }; static gpointer ags_record_midi_audio_parent_class = NULL; static const gchar *ags_record_midi_audio_plugin_name = "ags-record-midi"; static const gchar *ags_record_midi_audio_specifier[] = { "./playback[0]" "./record[0]", "./filename[0]", "./division[0]", "./tempo[0]", "./bpm[0]", }; static const gchar *ags_record_midi_audio_control_port[] = { "1/6", "2/6", "3/6", "4/6", "5/6", "6/6", }; GType ags_record_midi_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_record_midi_audio = 0; static const GTypeInfo ags_record_midi_audio_info = { sizeof (AgsRecordMidiAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_record_midi_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsRecordMidiAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_record_midi_audio_init, }; ags_type_record_midi_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsRecordMidiAudio", &ags_record_midi_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_record_midi_audio); } return g_define_type_id__volatile; } void ags_record_midi_audio_class_init(AgsRecordMidiAudioClass *record_midi_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_record_midi_audio_parent_class = g_type_class_peek_parent(record_midi_audio); /* GObjectClass */ gobject = (GObjectClass *) record_midi_audio; gobject->set_property = ags_record_midi_audio_set_property; gobject->get_property = ags_record_midi_audio_get_property; gobject->dispose = ags_record_midi_audio_dispose; gobject->finalize = ags_record_midi_audio_finalize; /* properties */ /** * AgsRecordMidiAudio:playback: * * The playback port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("playback", i18n_pspec("if do playback"), i18n_pspec("If playback should be performed"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAYBACK, param_spec); /** * AgsRecordMidiAudio:record: * * The record port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("record", i18n_pspec("if do record"), i18n_pspec("If record data for later use should be done"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECORD, param_spec); /** * AgsRecordMidiAudio:filename: * * The filename port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("filename", i18n_pspec("filename of record"), i18n_pspec("The filename of record"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsRecordMidiAudio:division: * * The division port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("division", i18n_pspec("division of record"), i18n_pspec("The division of record"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DIVISION, param_spec); /** * AgsRecordMidiAudio:tempo: * * The tempo port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("tempo", i18n_pspec("tempo of record"), i18n_pspec("The tempo of record"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TEMPO, param_spec); /** * AgsRecordMidiAudio:bpm: * * The bpm port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("bpm", i18n_pspec("bpm of record"), i18n_pspec("The bpm of record"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); } void ags_record_midi_audio_init(AgsRecordMidiAudio *record_midi_audio) { GList *port; AGS_RECALL(record_midi_audio)->name = "ags-record-midi"; AGS_RECALL(record_midi_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(record_midi_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(record_midi_audio)->xml_type = "ags-record-midi-audio"; port = NULL; /* playback */ record_midi_audio->playback = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_record_midi_audio_plugin_name, "specifier", ags_record_midi_audio_specifier[0], "control-port", ags_record_midi_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, NULL); g_object_ref(record_midi_audio->playback); record_midi_audio->playback->port_value.ags_port_boolean = TRUE; /* add to port */ port = g_list_prepend(port, record_midi_audio->playback); g_object_ref(record_midi_audio->playback); /* record */ record_midi_audio->record = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_record_midi_audio_plugin_name, "specifier", ags_record_midi_audio_specifier[1], "control-port", ags_record_midi_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, NULL); g_object_ref(record_midi_audio->record); record_midi_audio->record->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, record_midi_audio->record); g_object_ref(record_midi_audio->record); /* filename */ record_midi_audio->filename = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_record_midi_audio_plugin_name, "specifier", ags_record_midi_audio_specifier[2], "control-port", ags_record_midi_audio_control_port[2], "port-value-is-pointer", TRUE, "port-value-type", G_TYPE_STRING, NULL); g_object_ref(record_midi_audio->filename); record_midi_audio->filename->port_value.ags_port_string = NULL; /* add to port */ port = g_list_prepend(port, record_midi_audio->filename); g_object_ref(record_midi_audio->filename); /* division */ record_midi_audio->division = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_record_midi_audio_plugin_name, "specifier", ags_record_midi_audio_specifier[2], "control-port", ags_record_midi_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_INT64, NULL); g_object_ref(record_midi_audio->division); record_midi_audio->division->port_value.ags_port_int = 0; /* add to port */ port = g_list_prepend(port, record_midi_audio->division); g_object_ref(record_midi_audio->division); /* tempo */ record_midi_audio->tempo = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_record_midi_audio_plugin_name, "specifier", ags_record_midi_audio_specifier[2], "control-port", ags_record_midi_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_INT64, NULL); g_object_ref(record_midi_audio->tempo); record_midi_audio->tempo->port_value.ags_port_int = 0; /* add to port */ port = g_list_prepend(port, record_midi_audio->tempo); g_object_ref(record_midi_audio->tempo); /* bpm */ record_midi_audio->bpm = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_record_midi_audio_plugin_name, "specifier", ags_record_midi_audio_specifier[2], "control-port", ags_record_midi_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_INT64, NULL); g_object_ref(record_midi_audio->bpm); record_midi_audio->bpm->port_value.ags_port_int = 120; /* add to port */ port = g_list_prepend(port, record_midi_audio->bpm); g_object_ref(record_midi_audio->bpm); /* set port */ AGS_RECALL(record_midi_audio)->port = port; } void ags_record_midi_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecordMidiAudio *record_midi_audio; GRecMutex *recall_mutex; record_midi_audio = AGS_RECORD_MIDI_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(record_midi_audio); switch(prop_id){ case PROP_PLAYBACK: { AgsPort *playback; playback = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(record_midi_audio->playback == playback){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio->playback != NULL){ g_object_unref(G_OBJECT(record_midi_audio->playback)); } if(playback != NULL){ g_object_ref(G_OBJECT(playback)); } record_midi_audio->playback = playback; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECORD: { AgsPort *record; record = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(record_midi_audio->record == record){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio->record != NULL){ g_object_unref(G_OBJECT(record_midi_audio->record)); } if(record != NULL){ g_object_ref(G_OBJECT(record)); } record_midi_audio->record = record; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILENAME: { AgsPort *filename; filename = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(record_midi_audio->filename == filename){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio->filename != NULL){ g_object_unref(G_OBJECT(record_midi_audio->filename)); } if(filename != NULL){ g_object_ref(G_OBJECT(filename)); } record_midi_audio->filename = filename; g_rec_mutex_unlock(recall_mutex); } break; case PROP_DIVISION: { AgsPort *division; division = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(record_midi_audio->division == division){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio->division != NULL){ g_object_unref(G_OBJECT(record_midi_audio->division)); } if(division != NULL){ g_object_ref(G_OBJECT(division)); } record_midi_audio->division = division; g_rec_mutex_unlock(recall_mutex); } break; case PROP_TEMPO: { AgsPort *tempo; tempo = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(record_midi_audio->tempo == tempo){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio->tempo != NULL){ g_object_unref(G_OBJECT(record_midi_audio->tempo)); } if(tempo != NULL){ g_object_ref(G_OBJECT(tempo)); } record_midi_audio->tempo = tempo; g_rec_mutex_unlock(recall_mutex); } break; case PROP_BPM: { AgsPort *bpm; bpm = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(record_midi_audio->bpm == bpm){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio->bpm != NULL){ g_object_unref(G_OBJECT(record_midi_audio->bpm)); } if(bpm != NULL){ g_object_ref(G_OBJECT(bpm)); } record_midi_audio->bpm = bpm; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_record_midi_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecordMidiAudio *record_midi_audio; GRecMutex *recall_mutex; record_midi_audio = AGS_RECORD_MIDI_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(record_midi_audio); switch(prop_id){ case PROP_PLAYBACK: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, record_midi_audio->playback); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RECORD: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, record_midi_audio->record); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, record_midi_audio->filename); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DIVISION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, record_midi_audio->division); g_rec_mutex_unlock(recall_mutex); } break; case PROP_TEMPO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, record_midi_audio->tempo); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, record_midi_audio->bpm); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_record_midi_audio_dispose(GObject *gobject) { AgsRecordMidiAudio *record_midi_audio; record_midi_audio = AGS_RECORD_MIDI_AUDIO(gobject); /* playback */ if(record_midi_audio->playback != NULL){ g_object_unref(record_midi_audio->playback); record_midi_audio->playback = NULL; } /* record */ if(record_midi_audio->record != NULL){ g_object_unref(record_midi_audio->record); record_midi_audio->record = NULL; } /* filename */ if(record_midi_audio->filename != NULL){ g_object_unref(record_midi_audio->filename); record_midi_audio->filename = NULL; } /* division */ if(record_midi_audio->division != NULL){ g_object_unref(record_midi_audio->division); record_midi_audio->division = NULL; } /* tempo */ if(record_midi_audio->tempo != NULL){ g_object_unref(record_midi_audio->tempo); record_midi_audio->tempo = NULL; } /* bpm */ if(record_midi_audio->bpm != NULL){ g_object_unref(record_midi_audio->bpm); record_midi_audio->bpm = NULL; } /* call parent */ G_OBJECT_CLASS(ags_record_midi_audio_parent_class)->dispose(gobject); } void ags_record_midi_audio_finalize(GObject *gobject) { AgsRecordMidiAudio *record_midi_audio; record_midi_audio = AGS_RECORD_MIDI_AUDIO(gobject); /* playback */ if(record_midi_audio->playback != NULL){ g_object_unref(record_midi_audio->playback); } /* record */ if(record_midi_audio->record != NULL){ g_object_unref(record_midi_audio->record); } /* filename */ if(record_midi_audio->filename != NULL){ g_object_unref(record_midi_audio->filename); } /* division */ if(record_midi_audio->division != NULL){ g_object_unref(record_midi_audio->division); } /* tempo */ if(record_midi_audio->tempo != NULL){ g_object_unref(record_midi_audio->tempo); } /* bpm */ if(record_midi_audio->bpm != NULL){ g_object_unref(record_midi_audio->bpm); } /* call parent */ G_OBJECT_CLASS(ags_record_midi_audio_parent_class)->finalize(gobject); } /** * ags_record_midi_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsRecordMidiAudio * * Returns: the new #AgsRecordMidiAudio * * Since: 3.0.0 */ AgsRecordMidiAudio* ags_record_midi_audio_new(AgsAudio *audio) { AgsRecordMidiAudio *record_midi_audio; record_midi_audio = (AgsRecordMidiAudio *) g_object_new(AGS_TYPE_RECORD_MIDI_AUDIO, "audio", audio, NULL); return(record_midi_audio); } gsequencer-3.1.3/ags/audio/recall/ags_volume_audio_signal.h0000644000175000017500000000430513607210263020747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VOLUME_AUDIO_SIGNAL_H__ #define __AGS_VOLUME_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_VOLUME_AUDIO_SIGNAL (ags_volume_audio_signal_get_type()) #define AGS_VOLUME_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VOLUME_AUDIO_SIGNAL, AgsVolumeAudioSignal)) #define AGS_VOLUME_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VOLUME_AUDIO_SIGNAL, AgsVolumeAudioSignalClass)) #define AGS_IS_VOLUME_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VOLUME_AUDIO_SIGNAL)) #define AGS_IS_VOLUME_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VOLUME_AUDIO_SIGNAL)) #define AGS_VOLUME_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_VOLUME_AUDIO_SIGNAL, AgsVolumeAudioSignalClass)) typedef struct _AgsVolumeAudioSignal AgsVolumeAudioSignal; typedef struct _AgsVolumeAudioSignalClass AgsVolumeAudioSignalClass; struct _AgsVolumeAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsVolumeAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_volume_audio_signal_get_type(); AgsVolumeAudioSignal* ags_volume_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_VOLUME_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_channel.c0000644000175000017500000006004413607210263020043 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_analyse_channel_class_init(AgsAnalyseChannelClass *analyse_channel); void ags_analyse_channel_connectable_interface_init(AgsConnectableInterface *connectable); void ags_analyse_channel_init(AgsAnalyseChannel *analyse_channel); void ags_analyse_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_analyse_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_analyse_channel_dispose(GObject *gobject); void ags_analyse_channel_finalize(GObject *gobject); /** * SECTION:ags_analyse_channel * @short_description: analyses channel * @title: AgsAnalyseChannel * @section_id: * @include: ags/audio/recall/ags_analyse_channel.h * * The #AgsAnalyseChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_CACHE_SAMPLERATE, PROP_CACHE_BUFFER_SIZE, PROP_CACHE_FORMAT, PROP_BUFFER_CLEARED, PROP_BUFFER_COMPUTED, PROP_FREQUENCY_BUFFER, PROP_MAGNITUDE_BUFFER, }; static gpointer ags_analyse_channel_parent_class = NULL; static AgsConnectableInterface *ags_analyse_channel_parent_connectable_interface; static const gchar *ags_analyse_channel_plugin_name = "ags-analyse"; static const gchar *ags_analyse_channel_plugin_specifier[] = { "./buffer-cleared[0]", "./buffer-computed[0]", "./frequency-buffer[0]", "./magnitude-buffer[0]", }; static const gchar *ags_analyse_channel_plugin_control_port[] = { "1/4", "2/4", "3/4", "4/4", }; GType ags_analyse_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_analyse_channel = 0; static const GTypeInfo ags_analyse_channel_info = { sizeof (AgsAnalyseChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_analyse_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAnalyseChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_analyse_channel_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_analyse_channel_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_analyse_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsAnalyseChannel", &ags_analyse_channel_info, 0); g_type_add_interface_static(ags_type_analyse_channel, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_analyse_channel); } return g_define_type_id__volatile; } void ags_analyse_channel_connectable_interface_init(AgsConnectableInterface *connectable) { ags_analyse_channel_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_analyse_channel_class_init(AgsAnalyseChannelClass *analyse_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_analyse_channel_parent_class = g_type_class_peek_parent(analyse_channel); /* GObjectClass */ gobject = (GObjectClass *) analyse_channel; gobject->set_property = ags_analyse_channel_set_property; gobject->get_property = ags_analyse_channel_get_property; gobject->dispose = ags_analyse_channel_dispose; gobject->finalize = ags_analyse_channel_finalize; /* properties */ /** * AgsAnalyseChannel:cache-samplerate: * * The cache's samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("cache-samplerate", i18n_pspec("cache samplerate"), i18n_pspec("The samplerate of the cache"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CACHE_SAMPLERATE, param_spec); /** * AgsAnalyseChannel:cache-buffer-size: * * The cache's buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("cache-buffer-size", i18n_pspec("cache buffer size"), i18n_pspec("The buffer size of the cache"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CACHE_BUFFER_SIZE, param_spec); /** * AgsAnalyseChannel:cache-format: * * The cache's format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("cache-format", i18n_pspec("cache format"), i18n_pspec("The format of the cache"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CACHE_FORMAT, param_spec); /** * AgsAnalyseChannel:buffer-cleared: * * The property indicating if buffer was cleared. * * Since: 3.0.0 */ param_spec = g_param_spec_object("buffer-cleared", i18n_pspec("if buffer was cleared"), i18n_pspec("The buffer was cleared during this run"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_CLEARED, param_spec); /** * AgsAnalyseChannel:buffer-computed: * * The property indicating if buffer was computed. * * Since: 3.0.0 */ param_spec = g_param_spec_object("buffer-computed", i18n_pspec("if buffer was computed"), i18n_pspec("The buffer was computed during this run"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_COMPUTED, param_spec); /** * AgsAnalyseChannel:frequency-buffer: * * The frequency buffer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("frequency-buffer", i18n_pspec("frequency buffer"), i18n_pspec("The frequency buffer"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FREQUENCY_BUFFER, param_spec); /** * AgsAnalyseChannel:magnitude-buffer: * * The magnitude buffer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("magnitude-buffer", i18n_pspec("magnitude buffer"), i18n_pspec("The magnitude buffer"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAGNITUDE_BUFFER, param_spec); } void ags_analyse_channel_init(AgsAnalyseChannel *analyse_channel) { AgsResetAmplitude *reset_amplitude; AgsConfig *config; GList *port; gchar *str; AGS_RECALL(analyse_channel)->flags |= AGS_RECALL_HAS_OUTPUT_PORT; AGS_RECALL(analyse_channel)->name = "ags-analyse"; AGS_RECALL(analyse_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(analyse_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(analyse_channel)->xml_type = "ags-analyse-channel"; /* buffer field */ g_rec_mutex_init(&(analyse_channel->buffer_mutex)); /* config */ config = ags_config_get_instance(); analyse_channel->cache_samplerate = ags_soundcard_helper_config_get_samplerate(config); analyse_channel->cache_buffer_size = ags_soundcard_helper_config_get_buffer_size(config); analyse_channel->cache_format = AGS_AUDIO_BUFFER_UTIL_DOUBLE; /* FFTW */ analyse_channel->in = (double *) fftw_malloc(analyse_channel->cache_buffer_size * sizeof(double)); analyse_channel->out = (double *) fftw_malloc(analyse_channel->cache_buffer_size * sizeof(double)); analyse_channel->comout = (fftw_complex *) fftw_malloc(analyse_channel->cache_buffer_size * sizeof(fftw_complex)); analyse_channel->plan = fftw_plan_r2r_1d(analyse_channel->cache_buffer_size, analyse_channel->in, analyse_channel->out, FFTW_R2HC, FFTW_ESTIMATE); /* pre buffer */ analyse_channel->frequency_pre_buffer = (double *) malloc(ceil(analyse_channel->cache_buffer_size / 2.0) * sizeof(double)); analyse_channel->magnitude_pre_buffer = (double *) malloc(ceil(analyse_channel->cache_buffer_size / 2.0) * sizeof(double)); /* ports */ port = NULL; /* buffer cleared */ analyse_channel->buffer_cleared = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_analyse_channel_plugin_name, "specifier", ags_analyse_channel_plugin_specifier[0], "control-port", ags_analyse_channel_plugin_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(analyse_channel->buffer_cleared); analyse_channel->buffer_cleared->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, analyse_channel->buffer_cleared); g_object_ref(analyse_channel->buffer_cleared); /* buffer computed */ analyse_channel->buffer_computed = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_analyse_channel_plugin_name, "specifier", ags_analyse_channel_plugin_specifier[1], "control-port", ags_analyse_channel_plugin_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(analyse_channel->buffer_computed); analyse_channel->buffer_computed->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, analyse_channel->buffer_computed); g_object_ref(analyse_channel->buffer_computed); /* frequency buffer */ analyse_channel->frequency_buffer = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_analyse_channel_plugin_name, "specifier", ags_analyse_channel_plugin_specifier[2], "control-port", ags_analyse_channel_plugin_control_port[2], "port-value-is-pointer", TRUE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", (guint) ceil(analyse_channel->cache_buffer_size / 2.0), NULL); g_object_ref(analyse_channel->frequency_buffer); analyse_channel->frequency_buffer->port_value.ags_port_double_ptr = (double *) malloc(analyse_channel->cache_buffer_size * sizeof(double)); ags_audio_buffer_util_clear_double(analyse_channel->frequency_buffer->port_value.ags_port_double_ptr, 1, analyse_channel->cache_buffer_size); /* add to port */ port = g_list_prepend(port, analyse_channel->frequency_buffer); g_object_ref(analyse_channel->frequency_buffer); /* magnitude buffer */ analyse_channel->magnitude_buffer = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_analyse_channel_plugin_name, "specifier", ags_analyse_channel_plugin_specifier[3], "control-port", ags_analyse_channel_plugin_control_port[3], "port-value-is-pointer", TRUE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", (guint) ceil(analyse_channel->cache_buffer_size / 2.0), NULL); g_object_ref(analyse_channel->magnitude_buffer); analyse_channel->magnitude_buffer->port_value.ags_port_double_ptr = (double *) malloc(analyse_channel->cache_buffer_size * sizeof(double)); ags_audio_buffer_util_clear_double(analyse_channel->magnitude_buffer->port_value.ags_port_double_ptr, 1, analyse_channel->cache_buffer_size); /* add to port */ port = g_list_prepend(port, analyse_channel->magnitude_buffer); g_object_ref(analyse_channel->magnitude_buffer); /* set port */ AGS_RECALL(analyse_channel)->port = port; /* add to reset amplitude task */ reset_amplitude = ags_reset_amplitude_get_instance(); ags_reset_amplitude_add(reset_amplitude, analyse_channel); } void ags_analyse_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAnalyseChannel *analyse_channel; GRecMutex *recall_mutex; analyse_channel = AGS_ANALYSE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(analyse_channel); switch(prop_id){ case PROP_CACHE_SAMPLERATE: { g_rec_mutex_lock(recall_mutex); analyse_channel->cache_samplerate = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CACHE_BUFFER_SIZE: { g_rec_mutex_lock(recall_mutex); analyse_channel->cache_buffer_size = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CACHE_FORMAT: { g_rec_mutex_lock(recall_mutex); analyse_channel->cache_format = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_CLEARED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == analyse_channel->buffer_cleared){ g_rec_mutex_unlock(recall_mutex); return; } if(analyse_channel->buffer_cleared != NULL){ g_object_unref(G_OBJECT(analyse_channel->buffer_cleared)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } analyse_channel->buffer_cleared = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_COMPUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == analyse_channel->buffer_computed){ g_rec_mutex_unlock(recall_mutex); return; } if(analyse_channel->buffer_computed != NULL){ g_object_unref(G_OBJECT(analyse_channel->buffer_computed)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } analyse_channel->buffer_computed = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FREQUENCY_BUFFER: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == analyse_channel->frequency_buffer){ g_rec_mutex_unlock(recall_mutex); return; } if(analyse_channel->frequency_buffer != NULL){ g_object_unref(G_OBJECT(analyse_channel->frequency_buffer)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } analyse_channel->frequency_buffer = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MAGNITUDE_BUFFER: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == analyse_channel->magnitude_buffer){ g_rec_mutex_unlock(recall_mutex); return; } if(analyse_channel->magnitude_buffer != NULL){ g_object_unref(G_OBJECT(analyse_channel->magnitude_buffer)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } analyse_channel->magnitude_buffer = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_analyse_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAnalyseChannel *analyse_channel; GRecMutex *recall_mutex; analyse_channel = AGS_ANALYSE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(analyse_channel); switch(prop_id){ case PROP_CACHE_SAMPLERATE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, analyse_channel->cache_samplerate); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CACHE_BUFFER_SIZE: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, analyse_channel->cache_buffer_size); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CACHE_FORMAT: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, analyse_channel->cache_format); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_CLEARED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, analyse_channel->buffer_cleared); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BUFFER_COMPUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, analyse_channel->buffer_computed); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FREQUENCY_BUFFER: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, analyse_channel->frequency_buffer); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MAGNITUDE_BUFFER: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, analyse_channel->magnitude_buffer); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_analyse_channel_dispose(GObject *gobject) { AgsAnalyseChannel *analyse_channel; AgsResetAmplitude *reset_amplitude; analyse_channel = AGS_ANALYSE_CHANNEL(gobject); /* buffer cleared */ if(analyse_channel->buffer_cleared != NULL){ g_object_unref(G_OBJECT(analyse_channel->buffer_cleared)); analyse_channel->buffer_cleared = NULL; } /* buffer computed */ if(analyse_channel->buffer_computed != NULL){ g_object_unref(G_OBJECT(analyse_channel->buffer_computed)); analyse_channel->buffer_computed = NULL; } /* frequency buffer */ if(analyse_channel->frequency_buffer != NULL){ g_object_unref(G_OBJECT(analyse_channel->frequency_buffer)); analyse_channel->frequency_buffer = NULL; } /* magnitude buffer */ if(analyse_channel->magnitude_buffer != NULL){ g_object_unref(G_OBJECT(analyse_channel->magnitude_buffer)); analyse_channel->magnitude_buffer = NULL; } /* reset amplitude task */ reset_amplitude = ags_reset_amplitude_get_instance(); ags_reset_amplitude_remove(reset_amplitude, analyse_channel); /* call parent */ G_OBJECT_CLASS(ags_analyse_channel_parent_class)->dispose(gobject); } void ags_analyse_channel_finalize(GObject *gobject) { AgsAnalyseChannel *analyse_channel; AgsResetAmplitude *reset_amplitude; analyse_channel = AGS_ANALYSE_CHANNEL(gobject); /* buffer field */ fftw_destroy_plan(analyse_channel->plan); fftw_free(analyse_channel->in); fftw_free(analyse_channel->out); /* buffer cleared */ if(analyse_channel->buffer_cleared != NULL){ g_object_unref(G_OBJECT(analyse_channel->buffer_cleared)); } /* buffer computed */ if(analyse_channel->buffer_computed != NULL){ g_object_unref(G_OBJECT(analyse_channel->buffer_computed)); } /* frequency buffer */ if(analyse_channel->frequency_buffer != NULL){ g_object_unref(G_OBJECT(analyse_channel->frequency_buffer)); } /* magnitude buffer */ if(analyse_channel->magnitude_buffer != NULL){ g_object_unref(G_OBJECT(analyse_channel->magnitude_buffer)); } /* reset amplitude task */ reset_amplitude = ags_reset_amplitude_get_instance(); ags_reset_amplitude_remove(reset_amplitude, analyse_channel); /* call parent */ G_OBJECT_CLASS(ags_analyse_channel_parent_class)->finalize(gobject); } void ags_analyse_channel_buffer_add(AgsAnalyseChannel *analyse_channel, void *buffer, guint samplerate, guint buffer_size, guint format) { void *buffer_source; guint copy_mode; guint cache_samplerate; guint cache_buffer_size; guint cache_format; gboolean resample; GRecMutex *buffer_mutex; if(!AGS_IS_ANALYSE_CHANNEL(analyse_channel)){ return; } /* get buffer mutex */ buffer_mutex = AGS_ANALYSE_CHANNEL_GET_BUFFER_MUTEX(analyse_channel); /* get some fields */ g_object_get(analyse_channel, "cache-samplerate", &cache_samplerate, "cache-buffer-size", &cache_buffer_size, "cache-format", &cache_format, NULL); resample = FALSE; copy_mode = ags_audio_buffer_util_get_copy_mode(cache_format, ags_audio_buffer_util_format_from_soundcard(format)); if(samplerate != cache_samplerate){ void *tmp_buffer_source; tmp_buffer_source = ags_stream_alloc(cache_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(buffer, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, cache_samplerate, cache_buffer_size, tmp_buffer_source); buffer_source = tmp_buffer_source; resample = TRUE; }else{ buffer_source = buffer; } g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_copy_buffer_to_buffer(analyse_channel->in, 1, 0, buffer_source, 1, 0, cache_buffer_size, copy_mode); g_rec_mutex_unlock(buffer_mutex); if(resample){ free(buffer_source); } } void ags_analyse_channel_retrieve_frequency_and_magnitude(AgsAnalyseChannel *analyse_channel) { double *out; double *frequency_pre_buffer; double *magnitude_pre_buffer; guint cache_samplerate; guint cache_buffer_size; guint cache_format; double frequency, magnitude; double correction; guint i; GValue value = {0,}; GRecMutex *buffer_mutex; if(!AGS_IS_ANALYSE_CHANNEL(analyse_channel)){ return; } /* get buffer mutex */ buffer_mutex = AGS_ANALYSE_CHANNEL_GET_BUFFER_MUTEX(analyse_channel); /* get some fields */ g_object_get(analyse_channel, "cache-samplerate", &cache_samplerate, "cache-buffer-size", &cache_buffer_size, "cache-format", &cache_format, NULL); /* get output buffer */ g_rec_mutex_lock(buffer_mutex); out = analyse_channel->out; /* execute plan */ memset((void *) out, 0, cache_buffer_size * sizeof(double)); fftw_execute(analyse_channel->plan); /* retrieve frequency and magnitude */ correction = (double) cache_samplerate / (double) cache_buffer_size; for(i = 0; i < cache_buffer_size / 2; i++){ frequency = i * correction; magnitude = sqrt(out[i] * out[i] + out[(cache_buffer_size / 2) + 1 - i] * out[(cache_buffer_size / 2) + 1 - i]); // g_message("analyse[%d]: %f %f", i, frequency, magnitude); analyse_channel->frequency_pre_buffer[i] = frequency; analyse_channel->magnitude_pre_buffer[i] = magnitude; } frequency_pre_buffer = analyse_channel->frequency_pre_buffer; magnitude_pre_buffer = analyse_channel->magnitude_pre_buffer; g_rec_mutex_unlock(buffer_mutex); /* frequency - write array position */ g_value_init(&value, G_TYPE_POINTER); g_value_set_pointer(&value, frequency_pre_buffer); ags_port_safe_write(analyse_channel->frequency_buffer, &value); /* magnitude - write array position */ g_value_reset(&value); g_value_set_pointer(&value, analyse_channel->magnitude_pre_buffer); ags_port_safe_write(analyse_channel->magnitude_buffer, &value); g_value_unset(&value); } /** * ags_analyse_channel_new: * @source: the source #AgsChannel * * Create a new instance of #AgsAnalyseChannel * * Returns: the new #AgsAnalyseChannel * * Since: 3.0.0 */ AgsAnalyseChannel* ags_analyse_channel_new(AgsChannel *source) { AgsAnalyseChannel *analyse_channel; analyse_channel = (AgsAnalyseChannel *) g_object_new(AGS_TYPE_ANALYSE_CHANNEL, "source", source, NULL); return(analyse_channel); } gsequencer-3.1.3/ags/audio/recall/ags_play_lv2_audio.c0000644000175000017500000005764013607210264017641 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include void ags_play_lv2_audio_class_init(AgsPlayLv2AudioClass *play_lv2_audio); void ags_play_lv2_audio_init(AgsPlayLv2Audio *play_lv2_audio); void ags_play_lv2_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_lv2_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_lv2_audio_dispose(GObject *gobject); void ags_play_lv2_audio_finalize(GObject *gobject); /** * SECTION:ags_play_lv2_audio * @short_description: play audio lv2 * @title: AgsPlayLv2Audio * @section_id: * @include: ags/audio/recall/ags_play_lv2_audio.h * * The #AgsPlayLv2Audio class provides ports to the effect processor. */ enum{ PROP_0, PROP_TURTLE, PROP_URI, PROP_PLUGIN, PROP_INPUT_LINES, PROP_OUTPUT_LINES, }; static gpointer ags_play_lv2_audio_parent_class = NULL; static const gchar *ags_play_lv2_audio_plugin_name = "ags-play-lv2"; static const gchar *ags_play_lv2_audio_specifier[] = { }; static const gchar *ags_play_lv2_audio_control_port[] = { }; GType ags_play_lv2_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_lv2_audio; static const GTypeInfo ags_play_lv2_audio_info = { sizeof (AgsPlayLv2AudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_lv2_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsPlayLv2Audio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_lv2_audio_init, }; ags_type_play_lv2_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsPlayLv2Audio", &ags_play_lv2_audio_info, 0); g_once_init_leave (&g_define_type_id__volatile, ags_type_play_lv2_audio); } return g_define_type_id__volatile; } void ags_play_lv2_audio_class_init(AgsPlayLv2AudioClass *play_lv2_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_play_lv2_audio_parent_class = g_type_class_peek_parent(play_lv2_audio); /* GObjectClass */ gobject = (GObjectClass *) play_lv2_audio; gobject->set_property = ags_play_lv2_audio_set_property; gobject->get_property = ags_play_lv2_audio_get_property; gobject->dispose = ags_play_lv2_audio_dispose; gobject->finalize = ags_play_lv2_audio_finalize; /* properties */ /** * AgsPlayLv2Audio:turtle: * * The assigned turtle. * * Since: 3.0.0 */ param_spec = g_param_spec_object("turtle", i18n_pspec("turtle of recall lv2"), i18n_pspec("The turtle which this recall lv2 is described by"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TURTLE, param_spec); /** * AgsPlayLv2Audio:uri: * * The uri's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("uri", i18n_pspec("the uri"), i18n_pspec("The uri's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URI, param_spec); /** * AgsPlayLv2Audio:plugin: * * The plugin's plugin object. * * Since: 3.0.0 */ param_spec = g_param_spec_object("plugin", i18n_pspec("the plugin"), i18n_pspec("The plugin as plugin object"), AGS_TYPE_LV2_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN, param_spec); /** * AgsPlayLv2Audio:input-lines: * * The effect's input lines count. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("input-lines", i18n_pspec("input lines of effect"), i18n_pspec("The effect's count of input lines"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_LINES, param_spec); /** * AgsPlayLv2Audio:output-lines: * * The effect's output lines count. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("output-lines", i18n_pspec("output lines of effect"), i18n_pspec("The effect's count of output lines"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_LINES, param_spec); } void ags_play_lv2_audio_init(AgsPlayLv2Audio *play_lv2_audio) { GList *port; AGS_RECALL(play_lv2_audio)->name = "ags-play-lv2"; AGS_RECALL(play_lv2_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_lv2_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_lv2_audio)->xml_type = "ags-play-lv2-audio"; play_lv2_audio->turtle = NULL; play_lv2_audio->uri = NULL; play_lv2_audio->plugin = NULL; play_lv2_audio->plugin_descriptor = NULL; play_lv2_audio->input_port = NULL; play_lv2_audio->input_lines = 0; play_lv2_audio->output_port = NULL; play_lv2_audio->output_lines = 0; play_lv2_audio->event_port = 0; play_lv2_audio->atom_port = 0; play_lv2_audio->bank = 0; play_lv2_audio->program = 0; } void ags_play_lv2_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayLv2Audio *play_lv2_audio; GRecMutex *recall_mutex; play_lv2_audio = AGS_PLAY_LV2_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); switch(prop_id){ case PROP_TURTLE: { AgsTurtle *turtle; turtle = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_lv2_audio->turtle == turtle){ g_rec_mutex_unlock(recall_mutex); return; } if(play_lv2_audio->turtle != NULL){ g_object_unref(play_lv2_audio->turtle); } if(turtle != NULL){ g_object_ref(turtle); } play_lv2_audio->turtle = turtle; g_rec_mutex_unlock(recall_mutex); } break; case PROP_URI: { gchar *uri; uri = g_value_get_string(value); g_rec_mutex_lock(recall_mutex); if(uri == play_lv2_audio->uri){ g_rec_mutex_unlock(recall_mutex); return; } if(play_lv2_audio->uri != NULL){ g_free(play_lv2_audio->uri); } play_lv2_audio->uri = g_strdup(uri); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PLUGIN: { AgsLv2Plugin *lv2_plugin; lv2_plugin = g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_lv2_audio->plugin == lv2_plugin){ g_rec_mutex_unlock(recall_mutex); return; } if(play_lv2_audio->plugin != NULL){ g_object_unref(play_lv2_audio->plugin); } if(lv2_plugin != NULL){ g_object_ref(lv2_plugin); } play_lv2_audio->plugin = lv2_plugin; g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_LINES: { unsigned long effect_input_lines; effect_input_lines = g_value_get_ulong(value); g_rec_mutex_lock(recall_mutex); if(effect_input_lines == play_lv2_audio->input_lines){ g_rec_mutex_unlock(recall_mutex); return; } play_lv2_audio->input_lines = effect_input_lines; g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_LINES: { unsigned long effect_output_lines; effect_output_lines = g_value_get_ulong(value); g_rec_mutex_lock(recall_mutex); if(effect_output_lines == play_lv2_audio->output_lines){ g_rec_mutex_unlock(recall_mutex); return; } play_lv2_audio->output_lines = effect_output_lines; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_lv2_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayLv2Audio *play_lv2_audio; GRecMutex *recall_mutex; play_lv2_audio = AGS_PLAY_LV2_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); switch(prop_id){ case PROP_TURTLE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_lv2_audio->turtle); g_rec_mutex_unlock(recall_mutex); } break; case PROP_URI: { g_rec_mutex_lock(recall_mutex); g_value_set_string(value, play_lv2_audio->uri); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PLUGIN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_lv2_audio->plugin); g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_LINES: { g_rec_mutex_lock(recall_mutex); g_value_set_ulong(value, play_lv2_audio->input_lines); g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_LINES: { g_rec_mutex_lock(recall_mutex); g_value_set_ulong(value, play_lv2_audio->output_lines); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_lv2_audio_dispose(GObject *gobject) { AgsPlayLv2Audio *play_lv2_audio; play_lv2_audio = AGS_PLAY_LV2_AUDIO(gobject); /* turtle */ if(play_lv2_audio->turtle != NULL){ g_object_unref(play_lv2_audio->turtle); play_lv2_audio->turtle = NULL; } /* plugin */ if(play_lv2_audio->plugin != NULL){ g_object_unref(play_lv2_audio->plugin); play_lv2_audio->plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_lv2_audio_parent_class)->dispose(gobject); } void ags_play_lv2_audio_finalize(GObject *gobject) { AgsPlayLv2Audio *play_lv2_audio; play_lv2_audio = AGS_PLAY_LV2_AUDIO(gobject); /* turtle */ if(play_lv2_audio->turtle != NULL){ g_object_unref(play_lv2_audio->turtle); } /* plugin */ if(play_lv2_audio->plugin != NULL){ g_object_unref(play_lv2_audio->plugin); } /* filename, effect and uri */ g_free(play_lv2_audio->uri); /* call parent */ G_OBJECT_CLASS(ags_play_lv2_audio_parent_class)->finalize(gobject); } /** * ags_play_lv2_audio_test_flags: * @play_lv2_audio: the #AgsPlayLv2Audio * @flags: the flags * * Test @flags to be set on @play_lv2_audio. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_play_lv2_audio_test_flags(AgsPlayLv2Audio *play_lv2_audio, guint flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_PLAY_LV2_AUDIO(play_lv2_audio)){ return(FALSE); } /* get play_lv2_audio mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* test */ g_rec_mutex_lock(recall_mutex); retval = (flags & (play_lv2_audio->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_play_lv2_audio_set_flags: * @play_lv2_audio: the #AgsPlayLv2Audio * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_play_lv2_audio_set_flags(AgsPlayLv2Audio *play_lv2_audio, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_PLAY_LV2_AUDIO(play_lv2_audio)){ return; } /* get play_lv2_audio mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* set flags */ g_rec_mutex_lock(recall_mutex); play_lv2_audio->flags |= flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_play_lv2_audio_unset_flags: * @play_lv2_audio: the #AgsPlayLv2Audio * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_play_lv2_audio_unset_flags(AgsPlayLv2Audio *play_lv2_audio, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_PLAY_LV2_AUDIO(play_lv2_audio)){ return; } /* get play_lv2_audio mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* set flags */ g_rec_mutex_lock(recall_mutex); play_lv2_audio->flags &= (~flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_play_lv2_audio_load: * @play_lv2_audio: the #AgsPlayLv2Audio * * Set up LV2 handle. * * Since: 3.0.0 */ void ags_play_lv2_audio_load(AgsPlayLv2Audio *play_lv2_audio) { AgsLv2Plugin *lv2_plugin; gchar *filename, *effect; guint effect_index; guint i; void *plugin_so; LV2_Descriptor_Function lv2_descriptor; LV2_Descriptor *plugin_descriptor; GRecMutex *recall_mutex; if(!AGS_IS_PLAY_LV2_AUDIO(play_lv2_audio)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* get filename and effect */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(play_lv2_audio)->filename); effect = g_strdup(AGS_RECALL(play_lv2_audio)->effect); g_rec_mutex_unlock(recall_mutex); /* find AgsLv2Plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); g_object_get(lv2_plugin, "plugin-so", &plugin_so, NULL); if(plugin_so == NULL){ g_message("open %s", filename); #ifdef AGS_W32API plugin_so = LoadLibrary(filename); #else plugin_so = dlopen(filename, RTLD_NOW); #endif g_object_set(lv2_plugin, "plugin-so", plugin_so, NULL); } /* get some fields */ play_lv2_audio->plugin = lv2_plugin; if(plugin_so != NULL){ gboolean success; success = FALSE; #ifdef AGS_W32API lv2_descriptor = (LV2_Descriptor_Function) GetProcAddress(plugin_so, "lv2_descriptor"); success = (!lv2_descriptor) ? FALSE: TRUE; #else lv2_descriptor = (LV2_Descriptor_Function) dlsym(plugin_so, "lv2_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && lv2_descriptor){ effect_index = 0; for(i = 0; (plugin_descriptor = lv2_descriptor((unsigned long) i)) != NULL; i++){ if(!g_ascii_strcasecmp(plugin_descriptor->URI, lv2_plugin->uri)){ effect_index = i; g_object_set(lv2_plugin, "effect-index", effect_index, NULL); break; } } g_rec_mutex_lock(recall_mutex); play_lv2_audio->plugin_descriptor = plugin_descriptor; g_rec_mutex_unlock(recall_mutex); if(ags_lv2_plugin_test_flags(lv2_plugin, AGS_LV2_PLUGIN_NEEDS_WORKER)){ ags_play_lv2_audio_set_flags(play_lv2_audio, AGS_PLAY_LV2_AUDIO_HAS_WORKER); } } } /* free */ g_free(filename); g_free(effect); } /** * ags_play_lv2_audio_load_ports: * @play_lv2_audio: the #AgsPlayLv2Audio * * Set up LV2 ports. * * Returns: (element-type AgsAudio.Port) (transfer full): the #GList-struct containing #AgsPort * * Since: 3.0.0 */ GList* ags_play_lv2_audio_load_ports(AgsPlayLv2Audio *play_lv2_audio) { AgsPort *current; AgsLv2Plugin *lv2_plugin; GList *start_port; GList *start_plugin_port, *plugin_port; gchar *filename, *effect; gchar *plugin_name; uint32_t port_count; uint32_t i; GRecMutex *recall_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_PLAY_LV2_AUDIO(play_lv2_audio)){ return(NULL); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_lv2_audio); /* get filename and effect */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(play_lv2_audio)->filename); effect = g_strdup(AGS_RECALL(play_lv2_audio)->effect); g_rec_mutex_unlock(recall_mutex); /* find AgsLv2Plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); play_lv2_audio->plugin = lv2_plugin; /* get plugin port */ g_object_get(lv2_plugin, "plugin-port", &start_plugin_port, NULL); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* get plugin name */ g_rec_mutex_lock(base_plugin_mutex); plugin_name = g_strdup_printf("lv2-<%s>", lv2_plugin->uri); g_rec_mutex_unlock(base_plugin_mutex); plugin_port = start_plugin_port; start_port = NULL; if(plugin_port != NULL){ port_count = g_list_length(plugin_port); for(i = 0; i < port_count; i++){ gchar *specifier; GValue *value; GRecMutex *plugin_port_mutex; /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_EVENT)){ play_lv2_audio->flags |= AGS_PLAY_LV2_AUDIO_HAS_EVENT_PORT; play_lv2_audio->event_port = AGS_PLUGIN_PORT(plugin_port->data)->port_index; } if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_ATOM)){ play_lv2_audio->flags |= AGS_PLAY_LV2_AUDIO_HAS_ATOM_PORT; play_lv2_audio->atom_port = AGS_PLUGIN_PORT(plugin_port->data)->port_index; } } if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_CONTROL) && (ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_INPUT) || ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_OUTPUT))){ gchar *specifier; /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); if(specifier == NULL){ plugin_port = plugin_port->next; continue; } current = g_object_new(AGS_TYPE_PORT, "plugin-name", plugin_name, "specifier", specifier, "control-port", g_strdup_printf("%u/%u", i, port_count), "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, NULL); g_object_ref(current); if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ ags_recall_set_flags((AgsRecall *) play_lv2_audio, AGS_RECALL_HAS_OUTPUT_PORT); ags_port_set_flags((AgsPort *) current, AGS_PORT_IS_OUTPUT); }else{ gint scale_steps; g_object_get(plugin_port->data, "scale-steps", &scale_steps, NULL); if(!ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_INTEGER) && !ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_TOGGLED) && scale_steps == -1){ ags_port_set_flags((AgsPort *) current, AGS_PORT_INFINITE_RANGE); } } g_object_set(current, "plugin-port", plugin_port->data, NULL); ags_play_lv2_audio_load_conversion(play_lv2_audio, (GObject *) current, (GObject *) plugin_port->data); g_object_get(plugin_port->data, "default-value", &value, NULL); current->port_value.ags_port_ladspa = g_value_get_float(value); #ifdef AGS_DEBUG g_message("connecting port: %s %d/%d", specifier, i, port_count); #endif start_port = g_list_prepend(start_port, current); }else if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_AUDIO)){ guint port_index; g_object_get(plugin_port->data, "port-index", &port_index, NULL); if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ g_rec_mutex_lock(recall_mutex); if(play_lv2_audio->input_port == NULL){ play_lv2_audio->input_port = (uint32_t *) malloc(sizeof(uint32_t)); play_lv2_audio->input_port[0] = port_index; }else{ play_lv2_audio->input_port = (uint32_t *) realloc(play_lv2_audio->input_port, (play_lv2_audio->input_lines + 1) * sizeof(uint32_t)); play_lv2_audio->input_port[play_lv2_audio->input_lines] = port_index; } play_lv2_audio->input_lines += 1; g_rec_mutex_unlock(recall_mutex); }else if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ g_rec_mutex_lock(recall_mutex); if(play_lv2_audio->output_port == NULL){ play_lv2_audio->output_port = (uint32_t *) malloc(sizeof(uint32_t)); play_lv2_audio->output_port[0] = port_index; }else{ play_lv2_audio->output_port = (uint32_t *) realloc(play_lv2_audio->output_port, (play_lv2_audio->output_lines + 1) * sizeof(uint32_t)); play_lv2_audio->output_port[play_lv2_audio->output_lines] = port_index; } play_lv2_audio->output_lines += 1; g_rec_mutex_unlock(recall_mutex); } } /* iterate */ plugin_port = plugin_port->next; } start_port = g_list_reverse(start_port); AGS_RECALL(play_lv2_audio)->port = g_list_copy(start_port); } /* unref/free */ g_list_free_full(start_plugin_port, g_object_unref); g_free(filename); g_free(effect); g_free(plugin_name); #ifdef AGS_DEBUG g_message("output lines: %d", play_lv2_audio->output_lines); #endif return(start_port); } /** * ags_play_lv2_audio_load_conversion: * @play_lv2_audio: the #AgsPlayLv2Audio * @port: the #AgsPort * @plugin_port: the #AgsPluginPort * * Loads conversion object by using @plugin_port and sets in on @port. * * Since: 3.0.0 */ void ags_play_lv2_audio_load_conversion(AgsPlayLv2Audio *play_lv2_audio, GObject *port, GObject *plugin_port) { AgsLv2Conversion *lv2_conversion; if(!AGS_IS_PLAY_LV2_AUDIO(play_lv2_audio) || !AGS_IS_PORT(port) || !AGS_PLUGIN_PORT(plugin_port)){ return; } lv2_conversion = NULL; if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)){ lv2_conversion = ags_lv2_conversion_new(); lv2_conversion->flags |= AGS_LV2_CONVERSION_LOGARITHMIC; g_object_set(port, "conversion", lv2_conversion, NULL); } } /** * ags_play_lv2_audio_find: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @filename: plugin's filename * @uri: plugin's uri * * Retrieve LV2 recall. * * Returns: (element-type AgsAudio.Recall) (transfer none): Next match. * * Since: 3.0.0 */ GList* ags_play_lv2_audio_find(GList *recall, gchar *filename, gchar *uri) { while(recall != NULL){ if(AGS_IS_PLAY_LV2_AUDIO(recall->data)){ gboolean success; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall->data); /* check current filename and effect */ g_rec_mutex_lock(recall_mutex); success = (!g_strcmp0(AGS_RECALL(recall->data)->filename, filename) && !g_strcmp0(AGS_PLAY_LV2_AUDIO(recall->data)->uri, uri)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); if(success){ break; } } /* iterate */ recall = recall->next; } return(recall); } /** * ags_play_lv2_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsPlayLv2Audio * * Returns: the new #AgsPlayLv2Audio * * Since: 3.0.0 */ AgsPlayLv2Audio* ags_play_lv2_audio_new(AgsAudio *audio) { AgsPlayLv2Audio *play_lv2_audio; play_lv2_audio = (AgsPlayLv2Audio *) g_object_new(AGS_TYPE_PLAY_LV2_AUDIO, "audio", audio, NULL); return(play_lv2_audio); } gsequencer-3.1.3/ags/audio/recall/ags_peak_recycling.h0000644000175000017500000000406613607210263017705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PEAK_RECYCLING_H__ #define __AGS_PEAK_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PEAK_RECYCLING (ags_peak_recycling_get_type()) #define AGS_PEAK_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PEAK_RECYCLING, AgsPeakRecycling)) #define AGS_PEAK_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PEAK_RECYCLING, AgsPeakRecyclingClass)) #define AGS_IS_PEAK_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PEAK_RECYCLING)) #define AGS_IS_PEAK_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PEAK_RECYCLING)) #define AGS_PEAK_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PEAK_RECYCLING, AgsPeakRecyclingClass)) typedef struct _AgsPeakRecycling AgsPeakRecycling; typedef struct _AgsPeakRecyclingClass AgsPeakRecyclingClass; struct _AgsPeakRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsPeakRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_peak_recycling_get_type(); AgsPeakRecycling* ags_peak_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_PEAK_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_channel.h0000644000175000017500000000415713607210263020417 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RT_STREAM_CHANNEL_H__ #define __AGS_RT_STREAM_CHANNEL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RT_STREAM_CHANNEL (ags_rt_stream_channel_get_type()) #define AGS_RT_STREAM_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RT_STREAM_CHANNEL, AgsRtStreamChannel)) #define AGS_RT_STREAM_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RT_STREAM_CHANNEL, AgsRtStreamChannelClass)) #define AGS_IS_RT_STREAM_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RT_STREAM_CHANNEL)) #define AGS_IS_RT_STREAM_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RT_STREAM_CHANNEL)) #define AGS_RT_STREAM_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RT_STREAM_CHANNEL, AgsRtStreamChannelClass)) typedef struct _AgsRtStreamChannel AgsRtStreamChannel; typedef struct _AgsRtStreamChannelClass AgsRtStreamChannelClass; struct _AgsRtStreamChannel { AgsRecallChannel recall_channel; }; struct _AgsRtStreamChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_rt_stream_channel_get_type(); AgsRtStreamChannel* ags_rt_stream_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_RT_STREAM_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_notation_audio.h0000644000175000017500000000417013607210263020763 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_NOTATION_AUDIO_H__ #define __AGS_PLAY_NOTATION_AUDIO_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_NOTATION_AUDIO (ags_play_notation_audio_get_type()) #define AGS_PLAY_NOTATION_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_NOTATION_AUDIO, AgsPlayNotationAudio)) #define AGS_PLAY_NOTATION_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_NOTATION_AUDIO, AgsPlayNotationAudio)) #define AGS_IS_PLAY_NOTATION_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_NOTATION_AUDIO)) #define AGS_IS_PLAY_NOTATION_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_NOTATION_AUDIO)) #define AGS_PLAY_NOTATION_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_NOTATION_AUDIO, AgsPlayNotationAudioClass)) typedef struct _AgsPlayNotationAudio AgsPlayNotationAudio; typedef struct _AgsPlayNotationAudioClass AgsPlayNotationAudioClass; struct _AgsPlayNotationAudio { AgsRecallAudio recall_audio; }; struct _AgsPlayNotationAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_play_notation_audio_get_type(); AgsPlayNotationAudio* ags_play_notation_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_PLAY_NOTATION_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_envelope_channel.h0000644000175000017500000000445713607210263020237 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_CHANNEL_H__ #define __AGS_ENVELOPE_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_CHANNEL (ags_envelope_channel_get_type()) #define AGS_ENVELOPE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_CHANNEL, AgsEnvelopeChannel)) #define AGS_ENVELOPE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_CHANNEL, AgsEnvelopeChannel)) #define AGS_IS_ENVELOPE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ENVELOPE_CHANNEL)) #define AGS_IS_ENVELOPE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ENVELOPE_CHANNEL)) #define AGS_ENVELOPE_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ENVELOPE_CHANNEL, AgsEnvelopeChannelClass)) typedef struct _AgsEnvelopeChannel AgsEnvelopeChannel; typedef struct _AgsEnvelopeChannelClass AgsEnvelopeChannelClass; struct _AgsEnvelopeChannel { AgsRecallChannel recall_channel; AgsPort *use_note_length; AgsPort *use_fixed_length; AgsPort *fixed_length; AgsPort *attack; AgsPort *decay; AgsPort *sustain; AgsPort *release; AgsPort *ratio; }; struct _AgsEnvelopeChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_envelope_channel_get_type(); AgsEnvelopeChannel* ags_envelope_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_ENVELOPE_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_envelope_audio_signal.c0000644000175000017500000004354713607210263021263 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_envelope_audio_signal_class_init(AgsEnvelopeAudioSignalClass *envelope_audio_signal); void ags_envelope_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable); void ags_envelope_audio_signal_init(AgsEnvelopeAudioSignal *envelope_audio_signal); void ags_envelope_audio_signal_finalize(GObject *gobject); gdouble ags_envelope_audio_signal_run_inter_get_ratio(guint x0, gdouble y0, guint x1, gdouble y1); gdouble ags_envelope_audio_signal_run_inter_get_volume(gdouble volume, gdouble ratio, guint start_x, guint current_x, guint length); void ags_envelope_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_envelope_audio_signal * @short_description: envelopes audio signal * @title: AgsEnvelopeAudioSignal * @section_id: * @include: ags/audio/recall/ags_envelope_audio_signal.h * * The #AgsEnvelopeAudioSignal class envelopes the audio signal. */ static gpointer ags_envelope_audio_signal_parent_class = NULL; static AgsConnectableInterface *ags_envelope_audio_signal_parent_connectable_interface; GType ags_envelope_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_audio_signal = 0; static const GTypeInfo ags_envelope_audio_signal_info = { sizeof (AgsEnvelopeAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_audio_signal_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_envelope_audio_signal_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_envelope_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsEnvelopeAudioSignal", &ags_envelope_audio_signal_info, 0); g_type_add_interface_static(ags_type_envelope_audio_signal, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_audio_signal); } return g_define_type_id__volatile; } void ags_envelope_audio_signal_class_init(AgsEnvelopeAudioSignalClass *envelope_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_envelope_audio_signal_parent_class = g_type_class_peek_parent(envelope_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) envelope_audio_signal; gobject->finalize = ags_envelope_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) envelope_audio_signal; recall->run_inter = ags_envelope_audio_signal_run_inter; } void ags_envelope_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable) { ags_envelope_audio_signal_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_envelope_audio_signal_init(AgsEnvelopeAudioSignal *envelope_audio_signal) { AGS_RECALL(envelope_audio_signal)->name = "ags-envelope"; AGS_RECALL(envelope_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(envelope_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(envelope_audio_signal)->xml_type = "ags-envelope-audio-signal"; AGS_RECALL(envelope_audio_signal)->port = NULL; AGS_RECALL(envelope_audio_signal)->child_type = G_TYPE_NONE; envelope_audio_signal->frame_count = 0; } void ags_envelope_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_envelope_audio_signal_parent_class)->finalize(gobject); } gdouble ags_envelope_audio_signal_run_inter_get_ratio(guint x0, gdouble y0, guint x1, gdouble y1) { if(x1 - x0 == 0){ return(0.0); }else{ return((y1 - y0) / (x1 - x0)); } } gdouble ags_envelope_audio_signal_run_inter_get_volume(gdouble volume, gdouble ratio, guint start_x, guint current_x, guint length) { gdouble current_volume; if(length == 0){ return(volume); }else{ current_volume = volume + (ratio * (current_x - start_x)); #if 0 g_message("envelope get volume %f %f -> %f", volume, ratio, current_volume); #endif return(current_volume); } } void ags_envelope_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source, *rt_template; AgsPort *use_note_length; AgsPort *use_fixed_length; AgsPort *fixed_length; AgsEnvelopeChannel *envelope_channel; AgsEnvelopeChannelRun *envelope_channel_run; AgsEnvelopeRecycling *envelope_recycling; AgsEnvelopeAudioSignal *envelope_audio_signal; GObject *output_soundcard; GList *note_start, *note; GList *stream_source; guint length; guint frame_count; guint buffer_size; guint format; guint note_offset, delay_counter; gdouble delay; gdouble current_fixed_length; guint i, j; gboolean do_use_note_length, do_use_fixed_length; GValue audio_value = {0,}; GValue channel_value = {0,}; GValue value = {0,}; void (*parent_class_run_inter)(AgsRecall *recall); envelope_audio_signal = AGS_ENVELOPE_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_envelope_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); /* get some fields */ g_object_get(envelope_audio_signal, "source", &source, NULL); stream_source = source->stream_current; if(stream_source == NULL){ ags_recall_done(recall); g_object_unref(source); return; } g_object_get(envelope_audio_signal, "parent", &envelope_recycling, NULL); g_object_get(envelope_recycling, "parent", &envelope_channel_run, NULL); g_object_get(envelope_channel_run, "recall-channel", &envelope_channel, NULL); /* get ports */ g_object_get(envelope_channel, "use-note-length", &use_note_length, "use-fixed-length", &use_fixed_length, "fixed-length", &fixed_length, NULL); /* get use note length port */ g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(use_note_length, &value); do_use_note_length = g_value_get_boolean(&value); g_object_unref(use_note_length); /* get use fixed length port */ g_value_reset(&value); ags_port_safe_read(use_fixed_length, &value); do_use_fixed_length = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(use_fixed_length); /* get fixed length */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(fixed_length, &value); current_fixed_length = g_value_get_double(&value); g_value_unset(&value); g_object_unref(fixed_length); /* initialize some control values */ g_object_get(source, "output-soundcard", &output_soundcard, "rt-template", &rt_template, "note", ¬e_start, "buffer-size", &buffer_size, "format", &format, "length", &length, NULL); if(ags_recall_global_get_rt_safe() && rt_template != NULL){ g_object_get(rt_template, "length", &length, NULL); } note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); delay_counter = ags_soundcard_get_delay_counter(AGS_SOUNDCARD(output_soundcard)); delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(output_soundcard)); note = note_start; while(note != NULL){ if(ags_note_test_flags(AGS_NOTE(note->data), AGS_NOTE_ENVELOPE)){ AgsNote *current; AgsComplex attack; AgsComplex decay; AgsComplex sustain; AgsComplex release; AgsComplex ratio; gdouble x0, y0; gdouble x1, y1; gdouble current_x; guint key_x0, key_x1; guint offset; guint current_frame; guint start_frame, end_frame; guint current_frame_count, trailing_frame_count; gdouble current_volume, current_ratio; GRecMutex *note_mutex; current = note->data; g_object_get(current, "x0", &key_x0, "x1", &key_x1, NULL); /* get note mutex */ note_mutex = AGS_NOTE_GET_OBJ_MUTEX(current); /* */ g_rec_mutex_lock(note_mutex); attack.real = current->attack.real; attack.imag = current->attack.imag; decay.real = current->decay.real; decay.imag = current->decay.imag; sustain.real = current->sustain.real; sustain.imag = current->sustain.imag; release.real = current->release.real; release.imag = current->release.imag; ratio.real = current->ratio.real; ratio.imag = current->ratio.imag; g_rec_mutex_unlock(note_mutex); /* set frame count */ frame_count = (key_x1 - key_x0) * (delay * buffer_size); if(do_use_note_length){ frame_count = (key_x1 - key_x0) * (delay * buffer_size); }else if(do_use_fixed_length){ /* calculuate frame count */ frame_count = current_fixed_length * (delay * buffer_size); }else{ frame_count = length * buffer_size; } offset = 0; current_frame = ((note_offset - key_x0 - 1) * delay + delay_counter) * buffer_size; #if 0 g_message("note@%x[%d] -- %d", note->data, frame_count, current_frame); #endif /* special case release - #0 key offset bigger than note offset */ if(key_x1 < note_offset){ current_x = attack.real + decay.real; x0 = sustain.real; y0 = sustain.imag + ratio.imag; x1 = release.real; y1 = release.imag + ratio.imag; start_frame = (current_x + x0) * frame_count; end_frame = (current_x + x0 + x1) * frame_count; current_ratio = ags_envelope_audio_signal_run_inter_get_ratio(0, y0, end_frame - start_frame, y1); current_volume = ags_envelope_audio_signal_run_inter_get_volume(y0, current_ratio, 0, end_frame - start_frame, end_frame - start_frame); ags_audio_buffer_util_volume(stream_source->data, 1, ags_audio_buffer_util_format_from_soundcard(format), buffer_size, current_volume); /* iterate */ note = note->next; continue; } /* special case not applicable - #0 key offset lower than note offset */ if(key_x0 > note_offset){ /* iterate */ note = note->next; continue; } current_x = 0.0; /* attack */ x0 = 0.0; y0 = ratio.imag; x1 = attack.real; y1 = attack.imag + ratio.imag; start_frame = (current_x + x0) * frame_count; end_frame = (current_x + x0 + x1) * frame_count; #if 0 g_message("attack - first-frame: %d -> %d::%d", offset, start_frame, end_frame); #endif if(start_frame <= current_frame && end_frame > current_frame){ if(end_frame - current_frame < buffer_size){ current_frame_count = end_frame - current_frame; }else{ current_frame_count = buffer_size; } current_ratio = ags_envelope_audio_signal_run_inter_get_ratio(0, y0, end_frame - start_frame, y1); current_volume = ags_envelope_audio_signal_run_inter_get_volume(y0, current_ratio, 0, current_frame - start_frame, end_frame - start_frame); ags_audio_buffer_util_envelope(stream_source->data + offset, 1, ags_audio_buffer_util_format_from_soundcard(format), current_frame_count, current_volume, current_ratio); current_frame += current_frame_count; offset += current_frame_count; } if(offset >= buffer_size){ /* iterate */ note = note->next; continue; } current_x = 0.0; /* decay */ x0 = attack.real; y0 = attack.imag + ratio.imag; x1 = decay.real; y1 = decay.imag + ratio.imag; start_frame = (current_x + x0) * frame_count; end_frame = (current_x + x0 + x1) * frame_count; #if 0 g_message("decay - first-frame: %d -> %d::%d", offset, start_frame, end_frame); #endif if(start_frame <= current_frame && end_frame > current_frame){ if(end_frame - current_frame < buffer_size){ current_frame_count = end_frame - current_frame; }else{ current_frame_count = buffer_size - offset; } current_ratio = ags_envelope_audio_signal_run_inter_get_ratio(0, y0, end_frame - start_frame, y1); current_volume = ags_envelope_audio_signal_run_inter_get_volume(y0, current_ratio, 0, current_frame - start_frame, end_frame - start_frame); ags_audio_buffer_util_envelope(stream_source->data + offset, 1, ags_audio_buffer_util_format_from_soundcard(format), current_frame_count, current_volume, current_ratio); current_frame += current_frame_count; offset += current_frame_count; } if(offset >= buffer_size){ /* iterate */ note = note->next; continue; } current_x = attack.real; /* sustain */ x0 = decay.real; y0 = decay.imag + ratio.imag; x1 = sustain.real; y1 = sustain.imag + ratio.imag; start_frame = (current_x + x0) * frame_count; end_frame = (current_x + x0 + x1) * frame_count; #if 0 g_message("sustain - first-frame: %d -> %d::%d", offset, start_frame, end_frame); #endif if(start_frame <= current_frame && end_frame > current_frame){ if(end_frame - current_frame < buffer_size){ current_frame_count = end_frame - current_frame; }else{ current_frame_count = buffer_size - offset; } current_ratio = ags_envelope_audio_signal_run_inter_get_ratio(0, y0, end_frame - start_frame, y1); current_volume = ags_envelope_audio_signal_run_inter_get_volume(y0, current_ratio, 0, current_frame - start_frame, end_frame - start_frame); ags_audio_buffer_util_envelope(stream_source->data + offset, 1, ags_audio_buffer_util_format_from_soundcard(format), current_frame_count, current_volume, current_ratio); current_frame += current_frame_count; offset += current_frame_count; } if(offset >= buffer_size){ /* iterate */ note = note->next; continue; } current_x = decay.real + sustain.real; /* release */ x0 = sustain.real; y0 = sustain.imag + ratio.imag; x1 = release.real; y1 = release.imag + ratio.imag; start_frame = (current_x + x0) * frame_count; end_frame = (current_x + x0 + x1) * frame_count; #if 0 g_message("release - first-frame: %d -> %d::%d", offset, start_frame, end_frame); #endif if(start_frame <= current_frame && end_frame > current_frame){ trailing_frame_count = 0; if(end_frame - current_frame < buffer_size){ current_frame_count = end_frame - current_frame; trailing_frame_count = buffer_size - current_frame_count; }else{ current_frame_count = buffer_size - offset; } current_ratio = ags_envelope_audio_signal_run_inter_get_ratio(0, y0, end_frame - start_frame, y1); current_volume = ags_envelope_audio_signal_run_inter_get_volume(y0, current_ratio, 0, current_frame - start_frame, end_frame - start_frame); ags_audio_buffer_util_envelope(stream_source->data + offset, 1, ags_audio_buffer_util_format_from_soundcard(format), current_frame_count, current_volume, current_ratio); offset += current_frame_count; if(trailing_frame_count != 0){ current_volume = ags_envelope_audio_signal_run_inter_get_volume(y0, current_ratio, 0, end_frame - start_frame, end_frame); ags_audio_buffer_util_volume(stream_source->data + offset, 1, ags_audio_buffer_util_format_from_soundcard(format), trailing_frame_count, current_volume); } } } note = note->next; } /* unref */ g_object_unref(source); if(rt_template != NULL){ g_object_unref(rt_template); } g_object_unref(envelope_recycling); g_object_unref(envelope_channel_run); g_object_unref(envelope_channel); g_object_unref(output_soundcard); g_list_free_full(note_start, g_object_unref); } /** * ags_envelope_audio_signal_new: * @source: the source #AgsAudioSignal * * Create a new instance of #AgsEnvelopeAudioSignal * * Returns: the new #AgsEnvelopeAudioSignal * * Since: 3.0.0 */ AgsEnvelopeAudioSignal* ags_envelope_audio_signal_new(AgsAudioSignal *source) { AgsEnvelopeAudioSignal *envelope_audio_signal; envelope_audio_signal = (AgsEnvelopeAudioSignal *) g_object_new(AGS_TYPE_ENVELOPE_AUDIO_SIGNAL, "source", source, NULL); return(envelope_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_stream_recycling.c0000644000175000017500000000726313607210263020255 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_stream_recycling_class_init(AgsStreamRecyclingClass *stream_recycling); void ags_stream_recycling_init(AgsStreamRecycling *stream_recycling); void ags_stream_recycling_finalize(GObject *gobject); /** * SECTION:ags_stream_recycling * @short_description: streams recycling * @title: AgsStreamRecycling * @section_id: * @include: ags/audio/recall/ags_stream_recycling.h * * The #AgsStreamRecycling streams the recycling with appropriate #AgsRecallID. */ static gpointer ags_stream_recycling_parent_class = NULL; GType ags_stream_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_stream_recycling = 0; static const GTypeInfo ags_stream_recycling_info = { sizeof (AgsStreamRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_stream_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsStreamRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_stream_recycling_init, }; ags_type_stream_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsStreamRecycling", &ags_stream_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_stream_recycling); } return g_define_type_id__volatile; } void ags_stream_recycling_class_init(AgsStreamRecyclingClass *stream_recycling) { GObjectClass *gobject; ags_stream_recycling_parent_class = g_type_class_peek_parent(stream_recycling); /* GObjectClass */ gobject = (GObjectClass *) stream_recycling; gobject->finalize = ags_stream_recycling_finalize; } void ags_stream_recycling_init(AgsStreamRecycling *stream_recycling) { AGS_RECALL(stream_recycling)->name = "ags-stream"; AGS_RECALL(stream_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(stream_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(stream_recycling)->xml_type = "ags-stream-recycling"; AGS_RECALL(stream_recycling)->port = NULL; AGS_RECALL(stream_recycling)->child_type = AGS_TYPE_STREAM_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(stream_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_stream_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_stream_recycling_parent_class)->finalize(gobject); } /** * ags_stream_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsStreamRecycling * * Returns: the new #AgsStreamRecycling * * Since: 3.0.0 */ AgsStreamRecycling* ags_stream_recycling_new(AgsRecycling *source) { AgsStreamRecycling *stream_recycling; stream_recycling = (AgsStreamRecycling *) g_object_new(AGS_TYPE_STREAM_RECYCLING, "source", source, NULL); return(stream_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_play_audio_signal.c0000644000175000017500000003074313616617253020417 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_play_audio_signal_class_init(AgsPlayAudioSignalClass *play_audio_signal); void ags_play_audio_signal_init(AgsPlayAudioSignal *play_audio_signal); void ags_play_audio_signal_finalize(GObject *gobject); void ags_play_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_play_audio_signal * @short_description: plays audio signal * @title: AgsPlayAudioSignal * @section_id: * @include: ags/audio/recall/ags_play_audio_signal.h * * The #AgsPlayAudioSignal class plays the audio signal. */ static gpointer ags_play_audio_signal_parent_class = NULL; GType ags_play_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_audio_signal = 0; static const GTypeInfo ags_play_audio_signal_info = { sizeof (AgsPlayAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_audio_signal_init, }; ags_type_play_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsPlayAudioSignal", &ags_play_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_audio_signal); } return g_define_type_id__volatile; } void ags_play_audio_signal_class_init(AgsPlayAudioSignalClass *play_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_audio_signal_parent_class = g_type_class_peek_parent(play_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) play_audio_signal; gobject->finalize = ags_play_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) play_audio_signal; recall->run_inter = ags_play_audio_signal_run_inter; } void ags_play_audio_signal_init(AgsPlayAudioSignal *play_audio_signal) { AGS_RECALL(play_audio_signal)->child_type = G_TYPE_NONE; } void ags_play_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_play_audio_signal_parent_class)->finalize(gobject); } void ags_play_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsAudioSignal *rt_template; AgsPort *muted; AgsRecallID *recall_id; AgsPlayChannel *play_channel; AgsPlayChannelRun *play_channel_run; AgsPlayRecycling *play_recycling; AgsPlayAudioSignal *play_audio_signal; GObject *output_soundcard; GList *note_start, *note; GList *stream; void *buffer_source; void *buffer0, *buffer1; gboolean current_muted; gint audio_channel; guint pcm_channels; guint samplerate, soundcard_samplerate; guint buffer_size, soundcard_buffer_size; guint format, soundcard_format; guint attack; guint copy_mode; gboolean resample; GValue muted_value = {0,}; GValue audio_channel_value = {0,}; void (*parent_class_run_inter)(AgsRecall *recall); play_audio_signal = AGS_PLAY_AUDIO_SIGNAL(recall); /* get mutex */ parent_class_run_inter = AGS_RECALL_CLASS(ags_play_audio_signal_parent_class)->run_inter; g_object_get(play_audio_signal, "output-soundcard", &output_soundcard, "source", &source, "recall-id", &recall_id, NULL); ags_recall_id_unset_state_flags(recall_id, AGS_SOUND_STATE_IS_WAITING); g_object_unref(recall_id); if(output_soundcard == NULL){ #ifdef AGS_DEBUG g_warning("no soundcard"); #endif if(source != NULL){ g_object_unref(source); } return; } /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), &pcm_channels, &soundcard_samplerate, &soundcard_buffer_size, &soundcard_format); buffer0 = ags_soundcard_get_buffer(AGS_SOUNDCARD(output_soundcard)); if(buffer0 == NULL){ #ifdef AGS_DEBUG g_warning("no output buffer"); #endif g_object_unref(output_soundcard); g_object_unref(source); return; } play_channel = NULL; play_channel_run = NULL; play_recycling = NULL; g_object_get(play_audio_signal, "parent", &play_recycling, NULL); if(play_recycling != NULL){ g_object_get(play_recycling, "parent", &play_channel_run, NULL); } current_muted = FALSE; if(play_recycling == NULL || play_channel_run == NULL){ g_object_get(play_audio_signal, "output-soundcard-channel", &audio_channel, NULL); }else{ AgsChannel *channel; g_object_get(play_channel_run, "recall-channel", &play_channel, NULL); g_object_get(play_channel, "muted", &muted, NULL); g_value_init(&muted_value, G_TYPE_FLOAT); ags_port_safe_read(muted, &muted_value); current_muted = (g_value_get_float(&muted_value) == 1.0) ? TRUE: FALSE; g_value_unset(&muted_value); g_object_unref(muted); g_object_get(play_channel, "source", &channel, NULL); g_object_get(channel, "output-soundcard-channel", &audio_channel, NULL); if(audio_channel == -1){ g_value_init(&audio_channel_value, G_TYPE_UINT64); ags_port_safe_read(play_channel->audio_channel, &audio_channel_value); audio_channel = g_value_get_uint64(&audio_channel_value); g_value_unset(&audio_channel_value); } g_object_unref(channel); } buffer_size = source->buffer_size; copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(soundcard_format), ags_audio_buffer_util_format_from_soundcard(source->format)); /* get template */ g_object_get(source, "rt-template", &rt_template, "note", ¬e_start, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, "attack", &attack, NULL); if(current_muted){ goto ags_play_audio_signal_run_inter_END; } #ifdef AGS_DEBUG g_message("- play 0x%x", source); #endif if(samplerate != soundcard_samplerate){ attack = soundcard_samplerate * (attack / samplerate); } if(rt_template != NULL){ note = note_start; while(note != NULL){ AgsNote *current; guint rt_attack; guint64 rt_offset; current = note->data; g_object_get(current, "rt-attack", &rt_attack, "rt-offset", &rt_offset, NULL); stream = source->stream; if(stream == NULL){ note = note->next; continue; } /* check if resample */ buffer_source = stream->data; resample = FALSE; if(samplerate != soundcard_samplerate){ void *tmp_buffer_source; tmp_buffer_source = ags_stream_alloc(soundcard_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(buffer_source, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, soundcard_samplerate, soundcard_buffer_size, tmp_buffer_source); buffer_source = tmp_buffer_source; resample = TRUE; } /* copy */ ags_soundcard_lock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, audio_channel, buffer_source, 1, 0, buffer_size, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); if(resample){ free(buffer_source); } note = note->next; } }else{ stream = source->stream_current; if(stream == NULL){ AgsRecycling *recycling; ags_recall_done(recall); #if 0 if(play_recycling != NULL){ g_object_get(play_recycling, "source", &recycling, NULL); ags_recycling_remove_audio_signal(recycling, source); g_object_unref(source); } #endif goto ags_play_audio_signal_run_inter_END; } /* check if resample */ buffer_source = stream->data; resample = FALSE; if(samplerate != soundcard_samplerate){ void *tmp_buffer_source; tmp_buffer_source = ags_stream_alloc(soundcard_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(buffer_source, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, soundcard_samplerate, soundcard_buffer_size, tmp_buffer_source); buffer_source = tmp_buffer_source; resample = TRUE; } if(ags_recall_test_flags(recall, AGS_RECALL_INITIAL_RUN)){ /* copy */ ags_soundcard_lock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, audio_channel + attack * pcm_channels, buffer_source, 1, 0, soundcard_buffer_size - attack, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); }else{ if(source->attack != 0 && stream->prev != NULL){ void *buffer_source_prev; buffer_source_prev = stream->prev->data; if(resample){ void *tmp_buffer_source_prev; tmp_buffer_source_prev = ags_stream_alloc(soundcard_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(buffer_source_prev, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, soundcard_samplerate, soundcard_buffer_size, tmp_buffer_source_prev); buffer_source_prev = tmp_buffer_source_prev; } /* copy */ ags_soundcard_lock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, audio_channel, buffer_source_prev, 1, soundcard_buffer_size - source->attack, attack, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); if(resample){ free(buffer_source_prev); } } /* copy */ ags_soundcard_lock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); ags_audio_buffer_util_copy_buffer_to_buffer(buffer0, pcm_channels, audio_channel + attack * pcm_channels, buffer_source, 1, 0, soundcard_buffer_size - attack, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(output_soundcard), buffer0); } if(resample){ free(buffer_source); } } /* call parent */ ags_play_audio_signal_run_inter_END: parent_class_run_inter(recall); /* unref */ g_object_unref(output_soundcard); g_object_unref(source); g_object_unref(play_recycling); g_object_unref(play_channel); g_object_unref(play_channel_run); if(rt_template != NULL){ g_object_unref(rt_template); } g_list_free_full(note_start, g_object_unref); } /** * ags_play_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsPlayAudioSignal * * Returns: the new #AgsPlayAudioSignal * * Since: 3.0.0 */ AgsPlayAudioSignal* ags_play_audio_signal_new(AgsAudioSignal *source) { AgsPlayAudioSignal *play_audio_signal; play_audio_signal = (AgsPlayAudioSignal *) g_object_new(AGS_TYPE_PLAY_AUDIO_SIGNAL, "source", source, NULL); return(play_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_feed_channel.c0000644000175000017500000000655413607210263017320 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_feed_channel_class_init(AgsFeedChannelClass *feed_channel); void ags_feed_channel_init(AgsFeedChannel *feed_channel); void ags_feed_channel_finalize(GObject *gobject); /** * SECTION:ags_feed_channel * @short_description: feeds channel * @title: AgsFeedChannel * @section_id: * @include: ags/audio/recall/ags_feed_channel.h * * The #AgsFeedChannel is responsible to provide enough audio data * for real-time MIDI. */ static gpointer ags_feed_channel_parent_class = NULL; static const gchar *ags_feed_channel_plugin_name = "ags-feed"; GType ags_feed_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_feed_channel = 0; static const GTypeInfo ags_feed_channel_info = { sizeof (AgsFeedChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_feed_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFeedChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_feed_channel_init, }; ags_type_feed_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsFeedChannel", &ags_feed_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_feed_channel); } return g_define_type_id__volatile; } void ags_feed_channel_class_init(AgsFeedChannelClass *feed_channel) { GObjectClass *gobject; AgsRecallClass *recall; ags_feed_channel_parent_class = g_type_class_peek_parent(feed_channel); /* GObjectClass */ gobject = (GObjectClass *) feed_channel; gobject->finalize = ags_feed_channel_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) feed_channel; } void ags_feed_channel_init(AgsFeedChannel *feed_channel) { AGS_RECALL(feed_channel)->name = "ags-feed"; AGS_RECALL(feed_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(feed_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(feed_channel)->xml_type = "ags-feed-channel"; } void ags_feed_channel_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_feed_channel_parent_class)->finalize(gobject); } /** * ags_feed_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsFeedChannel * * Returns: the new #AgsFeedChannel * * Since: 3.0.0 */ AgsFeedChannel* ags_feed_channel_new(AgsChannel *source) { AgsFeedChannel *feed_channel; feed_channel = (AgsFeedChannel *) g_object_new(AGS_TYPE_FEED_CHANNEL, "source", source, NULL); return(feed_channel); } gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_channel.c0000644000175000017500000000775613607210263020422 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_rt_stream_channel_class_init(AgsRtStreamChannelClass *rt_stream_channel); void ags_rt_stream_channel_init(AgsRtStreamChannel *rt_stream_channel); void ags_rt_stream_channel_dispose(GObject *gobject); void ags_rt_stream_channel_finalize(GObject *gobject); /** * SECTION:ags_rt_stream_channel * @short_description: rt streams channel * @title: AgsRtStreamChannel * @section_id: * @include: ags/audio/recall/ags_rt_stream_channel.h * * The #AgsRtStreamChannel class provides ports to the effect processor. */ static gpointer ags_rt_stream_channel_parent_class = NULL; static const gchar *ags_rt_stream_channel_plugin_name = "ags-rt-stream"; GType ags_rt_stream_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_rt_stream_channel = 0; static const GTypeInfo ags_rt_stream_channel_info = { sizeof (AgsRtStreamChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_rt_stream_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRtStreamChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_rt_stream_channel_init, }; ags_type_rt_stream_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsRtStreamChannel", &ags_rt_stream_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_rt_stream_channel); } return g_define_type_id__volatile; } void ags_rt_stream_channel_class_init(AgsRtStreamChannelClass *rt_stream_channel) { GObjectClass *gobject; ags_rt_stream_channel_parent_class = g_type_class_peek_parent(rt_stream_channel); /* GObjectClass */ gobject = (GObjectClass *) rt_stream_channel; gobject->dispose = ags_rt_stream_channel_dispose; gobject->finalize = ags_rt_stream_channel_finalize; } void ags_rt_stream_channel_init(AgsRtStreamChannel *rt_stream_channel) { AgsConfig *config; AGS_RECALL(rt_stream_channel)->name = "ags-rt-stream"; AGS_RECALL(rt_stream_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(rt_stream_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(rt_stream_channel)->xml_type = "ags-rt-stream-channel"; } void ags_rt_stream_channel_dispose(GObject *gobject) { AgsRtStreamChannel *rt_stream_channel; rt_stream_channel = AGS_RT_STREAM_CHANNEL(gobject); /* call parent */ G_OBJECT_CLASS(ags_rt_stream_channel_parent_class)->dispose(gobject); } void ags_rt_stream_channel_finalize(GObject *gobject) { AgsRtStreamChannel *rt_stream_channel; rt_stream_channel = AGS_RT_STREAM_CHANNEL(gobject); /* call parent */ G_OBJECT_CLASS(ags_rt_stream_channel_parent_class)->finalize(gobject); } /** * ags_rt_stream_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsRtStreamChannel * * Returns: the new #AgsRtStreamChannel * * Since: 3.0.0 */ AgsRtStreamChannel* ags_rt_stream_channel_new(AgsChannel *source) { AgsRtStreamChannel *rt_stream_channel; rt_stream_channel = (AgsRtStreamChannel *) g_object_new(AGS_TYPE_RT_STREAM_CHANNEL, "source", source, NULL); return(rt_stream_channel); } gsequencer-3.1.3/ags/audio/recall/ags_play_channel_run.h0000644000175000017500000000555113607210263020247 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_CHANNEL_RUN_H__ #define __AGS_PLAY_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_CHANNEL_RUN (ags_play_channel_run_get_type()) #define AGS_PLAY_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_CHANNEL_RUN, AgsPlayChannelRun)) #define AGS_PLAY_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_CHANNEL_RUN, AgsPlayChannelRunClass)) #define AGS_IS_PLAY_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLAY_CHANNEL_RUN)) #define AGS_IS_PLAY_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PLAY_CHANNEL_RUN)) #define AGS_PLAY_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PLAY_CHANNEL_RUN, AgsPlayChannelRunClass)) typedef struct _AgsPlayChannelRun AgsPlayChannelRun; typedef struct _AgsPlayChannelRunClass AgsPlayChannelRunClass; /** * AgsPlayChannelRunFlags: * @AGS_PLAY_CHANNEL_RUN_TERMINATING: recall is terminating * @AGS_PLAY_CHANNEL_RUN_INITIAL_RUN: recall does initial run * * Enum values to control the behavior or indicate internal state of #AgsPlayChannelRun by * enable/disable as flags. */ typedef enum{ AGS_PLAY_CHANNEL_RUN_TERMINATING = 1, AGS_PLAY_CHANNEL_RUN_INITIAL_RUN = 1 << 1, }AgsPlayChannelRunFlags; struct _AgsPlayChannelRun { AgsRecallChannelRun recall_channel_run; guint flags; GObject *stream_channel_run; }; struct _AgsPlayChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_play_channel_run_get_type(); gboolean ags_play_channel_run_test_flags(AgsPlayChannelRun *play_channel_run, guint flags); void ags_play_channel_run_set_flags(AgsPlayChannelRun *play_channel_run, guint flags); void ags_play_channel_run_unset_flags(AgsPlayChannelRun *play_channel_run, guint flags); AgsPlayChannelRun* ags_play_channel_run_new(AgsChannel *source, GObject *stream_channel_run); G_END_DECLS #endif /*__AGS_PLAY_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_count_beats_audio.h0000644000175000017500000000471213607210263020413 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COUNT_BEATS_AUDIO_H__ #define __AGS_COUNT_BEATS_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COUNT_BEATS_AUDIO (ags_count_beats_audio_get_type()) #define AGS_COUNT_BEATS_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COUNT_BEATS_AUDIO, AgsCountBeatsAudio)) #define AGS_COUNT_BEATS_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COUNT_BEATS_AUDIO, AgsCountBeatsAudio)) #define AGS_IS_COUNT_BEATS_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COUNT_BEATS_AUDIO)) #define AGS_IS_COUNT_BEATS_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COUNT_BEATS_AUDIO)) #define AGS_COUNT_BEATS_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COUNT_BEATS_AUDIO, AgsCountBeatsAudioClass)) typedef struct _AgsCountBeatsAudio AgsCountBeatsAudio; typedef struct _AgsCountBeatsAudioClass AgsCountBeatsAudioClass; struct _AgsCountBeatsAudio { AgsRecallAudio recall_audio; AgsPort *sequencer_loop; AgsPort *sequencer_loop_start; AgsPort *sequencer_loop_end; AgsPort *notation_loop; AgsPort *notation_loop_start; AgsPort *notation_loop_end; AgsPort *wave_loop; AgsPort *wave_loop_start; AgsPort *wave_loop_end; AgsPort *midi_loop; AgsPort *midi_loop_start; AgsPort *midi_loop_end; }; struct _AgsCountBeatsAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_count_beats_audio_get_type(); AgsCountBeatsAudio* ags_count_beats_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_COUNT_BEATS_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_envelope_recycling.h0000644000175000017500000000424213607210263020576 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENVELOPE_RECYCLING_H__ #define __AGS_ENVELOPE_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ENVELOPE_RECYCLING (ags_envelope_recycling_get_type()) #define AGS_ENVELOPE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ENVELOPE_RECYCLING, AgsEnvelopeRecycling)) #define AGS_ENVELOPE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ENVELOPE_RECYCLING, AgsEnvelopeRecyclingClass)) #define AGS_IS_ENVELOPE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ENVELOPE_RECYCLING)) #define AGS_IS_ENVELOPE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ENVELOPE_RECYCLING)) #define AGS_ENVELOPE_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ENVELOPE_RECYCLING, AgsEnvelopeRecyclingClass)) typedef struct _AgsEnvelopeRecycling AgsEnvelopeRecycling; typedef struct _AgsEnvelopeRecyclingClass AgsEnvelopeRecyclingClass; struct _AgsEnvelopeRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsEnvelopeRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_envelope_recycling_get_type(); AgsEnvelopeRecycling* ags_envelope_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_ENVELOPE_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_channel_run.c0000644000175000017500000001446013607210263020730 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_analyse_channel_run_class_init(AgsAnalyseChannelRunClass *analyse_channel_run); void ags_analyse_channel_run_init(AgsAnalyseChannelRun *analyse_channel_run); void ags_analyse_channel_run_finalize(GObject *gobject); void ags_analyse_channel_run_run_pre(AgsRecall *recall); /** * SECTION:ags_analyse_channel_run * @short_description: analyse channel * @title: AgsAnalyseChannelRun * @section_id: * @include: ags/audio/recall/ags_analyse_channel_run.h * * The #AgsAnalyseChannelRun class analyses the channel. */ static gpointer ags_analyse_channel_run_parent_class = NULL; GType ags_analyse_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_analyse_channel_run = 0; static const GTypeInfo ags_analyse_channel_run_info = { sizeof (AgsAnalyseChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_analyse_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAnalyseChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_analyse_channel_run_init, }; ags_type_analyse_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsAnalyseChannelRun", &ags_analyse_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_analyse_channel_run); } return g_define_type_id__volatile; } void ags_analyse_channel_run_class_init(AgsAnalyseChannelRunClass *analyse_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_analyse_channel_run_parent_class = g_type_class_peek_parent(analyse_channel_run); /* GObjectClass */ gobject = (GObjectClass *) analyse_channel_run; gobject->finalize = ags_analyse_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) analyse_channel_run; recall->run_pre = ags_analyse_channel_run_run_pre; } void ags_analyse_channel_run_init(AgsAnalyseChannelRun *analyse_channel_run) { ags_recall_set_ability_flags((AgsRecall *) analyse_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(analyse_channel_run)->name = "ags-analyse"; AGS_RECALL(analyse_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(analyse_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(analyse_channel_run)->xml_type = "ags-analyse-channel-run"; AGS_RECALL(analyse_channel_run)->port = NULL; AGS_RECALL(analyse_channel_run)->child_type = AGS_TYPE_ANALYSE_RECYCLING; } void ags_analyse_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_analyse_channel_run_parent_class)->finalize(gobject); } void ags_analyse_channel_run_run_pre(AgsRecall *recall) { AgsPort *buffer_computed; AgsAnalyseChannel *analyse_channel; AgsAnalyseChannelRun *analyse_channel_run; guint cache_buffer_size; guint cache_format; gboolean current_buffer_computed; GValue value = {0,}; void (*parent_class_run_pre)(AgsRecall *recall); GRecMutex *recall_mutex; GRecMutex *buffer_mutex; analyse_channel_run = AGS_ANALYSE_CHANNEL_RUN(recall); g_object_get(recall, "recall-channel", &analyse_channel, NULL); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_analyse_channel_run_parent_class)->run_pre; /* get mutex and buffer mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); buffer_mutex = AGS_ANALYSE_CHANNEL_GET_BUFFER_MUTEX(analyse_channel); /* call parent */ parent_class_run_pre(recall); /* get some fields */ g_object_get(analyse_channel, "buffer-computed", &buffer_computed, "cache-buffer-size", &cache_buffer_size, "cache-format", &cache_format, NULL); /* calculate of previous run */ g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(analyse_channel->buffer_computed, &value); current_buffer_computed = g_value_get_boolean(&value); if(!current_buffer_computed){ /* set buffer-computed port to TRUE */ g_value_reset(&value); g_value_set_boolean(&value, TRUE); ags_port_safe_write(buffer_computed, &value); } g_value_unset(&value); /* lock free - buffer-computed reset by cyclic-task AgsResetAnalyse */ if(!current_buffer_computed){ /* retrieve analyse */ ags_analyse_channel_retrieve_frequency_and_magnitude(analyse_channel); /* clear buffer */ g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_clear_buffer(analyse_channel->in, 1, cache_buffer_size, cache_format); g_rec_mutex_unlock(buffer_mutex); } g_object_unref(analyse_channel); } /** * ags_analyse_channel_run_new: * @source: the source #AgsChannel * * Create a new instance of #AgsAnalyseChannelRun * * Returns: the new #AgsAnalyseChannelRun * * Since: 3.0.0 */ AgsAnalyseChannelRun* ags_analyse_channel_run_new(AgsChannel *source) { AgsAnalyseChannelRun *analyse_channel_run; analyse_channel_run = (AgsAnalyseChannelRun *) g_object_new(AGS_TYPE_ANALYSE_CHANNEL_RUN, "source", source, NULL); return(analyse_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_play_lv2_audio_run.h0000644000175000017500000000571513607210263020525 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_LV2_AUDIO_RUN_H__ #define __AGS_PLAY_LV2_AUDIO_RUN_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_LV2_AUDIO_RUN (ags_play_lv2_audio_run_get_type()) #define AGS_PLAY_LV2_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_LV2_AUDIO_RUN, AgsPlayLv2AudioRun)) #define AGS_PLAY_LV2_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_LV2_AUDIO_RUN, AgsPlayLv2AudioRun)) #define AGS_IS_PLAY_LV2_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_LV2_AUDIO_RUN)) #define AGS_IS_PLAY_LV2_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_LV2_AUDIO_RUN)) #define AGS_PLAY_LV2_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_LV2_AUDIO_RUN, AgsPlayLv2AudioRunClass)) #define AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT (8 * 256) typedef struct _AgsPlayLv2AudioRun AgsPlayLv2AudioRun; typedef struct _AgsPlayLv2AudioRunClass AgsPlayLv2AudioRunClass; struct _AgsPlayLv2AudioRun { AgsRecallAudioRun recall_audio_run; guint flags; LV2_Handle *lv2_handle; float *port_data; float *input; float *output; void *event_port; void *atom_port; guint key_on; long delta_time; snd_seq_event_t **event_buffer; unsigned long *event_count; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GObject *destination; AgsNotation *notation; AgsTimestamp *timestamp; GObject *worker_handle; }; struct _AgsPlayLv2AudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_play_lv2_audio_run_get_type(); void ags_play_lv2_audio_run_load_ports(AgsPlayLv2AudioRun *play_lv2_audio_run); AgsPlayLv2AudioRun* ags_play_lv2_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run); G_END_DECLS #endif /*__AGS_PLAY_LV2_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_recycling.h0000644000175000017500000000420713607210263020416 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ANALYSE_RECYCLING_H__ #define __AGS_ANALYSE_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ANALYSE_RECYCLING (ags_analyse_recycling_get_type()) #define AGS_ANALYSE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ANALYSE_RECYCLING, AgsAnalyseRecycling)) #define AGS_ANALYSE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ANALYSE_RECYCLING, AgsAnalyseRecyclingClass)) #define AGS_IS_ANALYSE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ANALYSE_RECYCLING)) #define AGS_IS_ANALYSE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ANALYSE_RECYCLING)) #define AGS_ANALYSE_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ANALYSE_RECYCLING, AgsAnalyseRecyclingClass)) typedef struct _AgsAnalyseRecycling AgsAnalyseRecycling; typedef struct _AgsAnalyseRecyclingClass AgsAnalyseRecyclingClass; struct _AgsAnalyseRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsAnalyseRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_analyse_recycling_get_type(); AgsAnalyseRecycling* ags_analyse_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_ANALYSE_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_buffer_recycling.h0000644000175000017500000000422113607210263020227 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUFFER_RECYCLING_H__ #define __AGS_BUFFER_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BUFFER_RECYCLING (ags_buffer_recycling_get_type()) #define AGS_BUFFER_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUFFER_RECYCLING, AgsBufferRecycling)) #define AGS_BUFFER_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BUFFER_RECYCLING, AgsBufferRecyclingClass)) #define AGS_IS_BUFFER_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_BUFFER_RECYCLING)) #define AGS_IS_BUFFER_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_BUFFER_RECYCLING)) #define AGS_BUFFER_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_BUFFER_RECYCLING, AgsBufferRecyclingClass)) typedef struct _AgsBufferRecycling AgsBufferRecycling; typedef struct _AgsBufferRecyclingClass AgsBufferRecyclingClass; struct _AgsBufferRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsBufferRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_buffer_recycling_get_type(); AgsBufferRecycling* ags_buffer_recycling_new(AgsRecycling *destination, AgsRecycling *source); G_END_DECLS #endif /*__AGS_BUFFER_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_mute_channel.c0000644000175000017500000002224013607210263017355 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_mute_channel_class_init(AgsMuteChannelClass *mute_channel); void ags_mute_channel_mutable_interface_init(AgsMutableInterface *mutable); void ags_mute_channel_init(AgsMuteChannel *mute_channel); void ags_mute_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_mute_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_mute_channel_dispose(GObject *gobject); void ags_mute_channel_finalize(GObject *gobject); void ags_mute_channel_set_muted(AgsMutable *mutable, gboolean muted); static AgsPluginPort* ags_mute_channel_get_muted_plugin_port(); /** * SECTION:ags_mute_channel * @short_description: mutes channel * @title: AgsMuteChannel * @section_id: * @include: ags/audio/recall/ags_mute_channel.h * * The #AgsMuteChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_MUTED, }; static gpointer ags_mute_channel_parent_class = NULL; static AgsPluginInterface *ags_mute_channel_parent_plugin_interface; static const gchar *ags_mute_channel_plugin_name = "ags-mute"; static const gchar *ags_mute_channel_specifier[] = { "./muted[0]", }; static const gchar *ags_mute_channel_control_port[] = { "1/1", }; GType ags_mute_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mute_channel = 0; static const GTypeInfo ags_mute_channel_info = { sizeof (AgsMuteChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mute_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMuteChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mute_channel_init, }; static const GInterfaceInfo ags_mutable_interface_info = { (GInterfaceInitFunc) ags_mute_channel_mutable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_mute_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsMuteChannel", &ags_mute_channel_info, 0); g_type_add_interface_static(ags_type_mute_channel, AGS_TYPE_MUTABLE, &ags_mutable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_mute_channel); } return g_define_type_id__volatile; } void ags_mute_channel_mutable_interface_init(AgsMutableInterface *mutable) { mutable->set_muted = ags_mute_channel_set_muted; } void ags_mute_channel_class_init(AgsMuteChannelClass *mute_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_mute_channel_parent_class = g_type_class_peek_parent(mute_channel); /* GObjectClass */ gobject = (GObjectClass *) mute_channel; gobject->set_property = ags_mute_channel_set_property; gobject->get_property = ags_mute_channel_get_property; gobject->dispose = ags_mute_channel_dispose; gobject->finalize = ags_mute_channel_finalize; /* properties */ /** * AgsMuteChannel:muted: * * The mute port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("muted", i18n_pspec("mute channel"), i18n_pspec("Mute the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); } void ags_mute_channel_init(AgsMuteChannel *mute_channel) { GList *port; AGS_RECALL(mute_channel)->name = "ags-mute"; AGS_RECALL(mute_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(mute_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(mute_channel)->xml_type = "ags-mute-channel"; port = NULL; /* muted */ mute_channel->muted = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_mute_channel_plugin_name, "specifier", ags_mute_channel_specifier[0], "control-port", ags_mute_channel_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(mute_channel->muted); mute_channel->muted->port_value.ags_port_float = 0.0; /* plugin port */ g_object_set(mute_channel->muted, "plugin-port", ags_mute_channel_get_muted_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, mute_channel->muted); g_object_ref(mute_channel->muted); /* set port */ AGS_RECALL(mute_channel)->port = port; } void ags_mute_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMuteChannel *mute_channel; GRecMutex *recall_mutex; mute_channel = AGS_MUTE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(mute_channel); switch(prop_id){ case PROP_MUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == mute_channel->muted){ g_rec_mutex_unlock(recall_mutex); return; } if(mute_channel->muted != NULL){ g_object_unref(G_OBJECT(mute_channel->muted)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } mute_channel->muted = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_mute_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMuteChannel *mute_channel; GRecMutex *recall_mutex; mute_channel = AGS_MUTE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(mute_channel); switch(prop_id){ case PROP_MUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, mute_channel->muted); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_mute_channel_dispose(GObject *gobject) { AgsMuteChannel *mute_channel; mute_channel = AGS_MUTE_CHANNEL(gobject); /* muted */ if(mute_channel->muted != NULL){ g_object_unref(G_OBJECT(mute_channel->muted)); mute_channel->muted = NULL; } /* call parent */ G_OBJECT_CLASS(ags_mute_channel_parent_class)->dispose(gobject); } void ags_mute_channel_finalize(GObject *gobject) { AgsMuteChannel *mute_channel; mute_channel = AGS_MUTE_CHANNEL(gobject); /* muted */ if(mute_channel->muted != NULL){ g_object_unref(G_OBJECT(mute_channel->muted)); } /* call parent */ G_OBJECT_CLASS(ags_mute_channel_parent_class)->finalize(gobject); } void ags_mute_channel_set_muted(AgsMutable *mutable, gboolean muted) { AgsPort *port; GValue value = {0,}; g_object_get(G_OBJECT(mutable), "muted", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (muted ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } static AgsPluginPort* ags_mute_channel_get_muted_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_TOGGLED); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_mute_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsMuteChannel * * Returns: the new #AgsMuteChannel * * Since: 3.0.0 */ AgsMuteChannel* ags_mute_channel_new(AgsChannel *source) { AgsMuteChannel *mute_channel; mute_channel = (AgsMuteChannel *) g_object_new(AGS_TYPE_MUTE_CHANNEL, "source", source, NULL); return(mute_channel); } gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_channel_run.c0000644000175000017500000006063713607210263021770 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_capture_wave_channel_run_class_init(AgsCaptureWaveChannelRunClass *capture_wave_channel_run); void ags_capture_wave_channel_run_seekable_interface_init(AgsSeekableInterface *seekable); void ags_capture_wave_channel_run_init(AgsCaptureWaveChannelRun *capture_wave_channel_run); void ags_capture_wave_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_capture_wave_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_capture_wave_channel_run_dispose(GObject *gobject); void ags_capture_wave_channel_run_finalize(GObject *gobject); void ags_capture_wave_channel_run_seek(AgsSeekable *seekable, gint64 offset, guint whence); void ags_capture_wave_channel_run_run_pre(AgsRecall *recall); /** * SECTION:ags_capture_wave_channel_run * @short_description: capture wave * @title: AgsCaptureWaveChannelRun * @section_id: * @include: ags/channel/recall/ags_capture_wave_channel_run.h * * The #AgsCaptureWaveChannelRun class capture wave. */ enum{ PROP_0, PROP_X_OFFSET, }; static gpointer ags_capture_wave_channel_run_parent_class = NULL; GType ags_capture_wave_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_capture_wave_channel_run = 0; static const GTypeInfo ags_capture_wave_channel_run_info = { sizeof (AgsCaptureWaveChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_capture_wave_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCaptureWaveChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_capture_wave_channel_run_init, }; static const GInterfaceInfo ags_seekable_interface_info = { (GInterfaceInitFunc) ags_capture_wave_channel_run_seekable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_capture_wave_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsCaptureWaveChannelRun", &ags_capture_wave_channel_run_info, 0); g_type_add_interface_static(ags_type_capture_wave_channel_run, AGS_TYPE_SEEKABLE, &ags_seekable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_capture_wave_channel_run); } return g_define_type_id__volatile; } void ags_capture_wave_channel_run_class_init(AgsCaptureWaveChannelRunClass *capture_wave_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_capture_wave_channel_run_parent_class = g_type_class_peek_parent(capture_wave_channel_run); /* GObjectClass */ gobject = (GObjectClass *) capture_wave_channel_run; gobject->set_property = ags_capture_wave_channel_run_set_property; gobject->get_property = ags_capture_wave_channel_run_get_property; gobject->dispose = ags_capture_wave_channel_run_dispose; gobject->finalize = ags_capture_wave_channel_run_finalize; /* properties */ /** * AgsCaptureWaveChannelRun:x-offset: * * The x offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("x-offset", i18n_pspec("x offset"), i18n_pspec("The x offset in the wave"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_OFFSET, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) capture_wave_channel_run; recall->run_pre = ags_capture_wave_channel_run_run_pre; } void ags_capture_wave_channel_run_seekable_interface_init(AgsSeekableInterface *seekable) { seekable->seek = ags_capture_wave_channel_run_seek; } void ags_capture_wave_channel_run_init(AgsCaptureWaveChannelRun *capture_wave_channel_run) { ags_recall_set_ability_flags((AgsRecall *) capture_wave_channel_run, (AGS_SOUND_ABILITY_WAVE)); AGS_RECALL(capture_wave_channel_run)->name = "ags-capture-wave"; AGS_RECALL(capture_wave_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(capture_wave_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(capture_wave_channel_run)->xml_type = "ags-capture-wave-channel-run"; AGS_RECALL(capture_wave_channel_run)->port = NULL; capture_wave_channel_run->timestamp = ags_timestamp_new(); g_object_ref(capture_wave_channel_run->timestamp); capture_wave_channel_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); capture_wave_channel_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; capture_wave_channel_run->timestamp->timer.ags_offset.offset = 0; capture_wave_channel_run->audio_signal = NULL; capture_wave_channel_run->x_offset = 0; } void ags_capture_wave_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCaptureWaveChannelRun *capture_wave_channel_run; GRecMutex *recall_mutex; capture_wave_channel_run = AGS_CAPTURE_WAVE_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(capture_wave_channel_run); switch(prop_id){ case PROP_X_OFFSET: { guint64 x_offset; x_offset = g_value_get_uint64(value); g_rec_mutex_lock(recall_mutex); capture_wave_channel_run->x_offset = x_offset; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_capture_wave_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCaptureWaveChannelRun *capture_wave_channel_run; GRecMutex *recall_mutex; capture_wave_channel_run = AGS_CAPTURE_WAVE_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(capture_wave_channel_run); switch(prop_id){ case PROP_X_OFFSET: { g_rec_mutex_lock(recall_mutex); g_value_set_uint64(value, capture_wave_channel_run->x_offset); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_capture_wave_channel_run_dispose(GObject *gobject) { AgsCaptureWaveChannelRun *capture_wave_channel_run; capture_wave_channel_run = AGS_CAPTURE_WAVE_CHANNEL_RUN(gobject); /* call parent */ G_OBJECT_CLASS(ags_capture_wave_channel_run_parent_class)->dispose(gobject); } void ags_capture_wave_channel_run_finalize(GObject *gobject) { AgsCaptureWaveChannelRun *capture_wave_channel_run; capture_wave_channel_run = AGS_CAPTURE_WAVE_CHANNEL_RUN(gobject); /* timestamp */ if(capture_wave_channel_run->timestamp != NULL){ g_object_unref(G_OBJECT(capture_wave_channel_run->timestamp)); } /* call parent */ G_OBJECT_CLASS(ags_capture_wave_channel_run_parent_class)->finalize(gobject); } void ags_capture_wave_channel_run_seek(AgsSeekable *seekable, gint64 offset, guint whence) { AgsCaptureWaveChannelRun *capture_wave_channel_run; GObject *soundcard; gdouble absolute_delay; guint buffer_size; guint64 x_offset; capture_wave_channel_run = AGS_CAPTURE_WAVE_CHANNEL_RUN(seekable); g_object_get(capture_wave_channel_run, "output-soundcard", &soundcard, "buffer-size", &buffer_size, NULL); absolute_delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(soundcard)); switch(whence){ case AGS_SEEK_CUR: { g_object_get(capture_wave_channel_run, "x-offset", &x_offset, NULL); if(x_offset + (offset * absolute_delay * buffer_size) < 0){ x_offset = 0; }else{ x_offset = x_offset + (offset * absolute_delay * buffer_size); } g_object_set(capture_wave_channel_run, "x-offset", x_offset, NULL); } break; case AGS_SEEK_END: { g_warning("seek from end not implemented"); } break; case AGS_SEEK_SET: { x_offset = offset * absolute_delay * buffer_size; g_object_set(capture_wave_channel_run, "x-offset", x_offset, NULL); } break; } g_object_unref(soundcard); } void ags_capture_wave_channel_run_run_pre(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; AgsChannel *start_input; AgsChannel *input; AgsPort *port; AgsWave *wave; AgsBuffer *buffer; AgsCaptureWaveAudio *capture_wave_audio; AgsCaptureWaveAudioRun *capture_wave_audio_run; AgsCaptureWaveChannel *capture_wave_channel; AgsCaptureWaveChannelRun *capture_wave_channel_run; AgsTimestamp *timestamp; GObject *output_soundcard, *input_soundcard; GList *list_start, *list; void *data, *file_data; gint input_soundcard_channel; guint line; guint64 relative_offset; guint note_offset; gdouble delay; guint delay_counter; gboolean do_loop; guint64 x_offset; guint64 x_point_offset; guint target_copy_mode, file_copy_mode; guint audio_channels, target_audio_channels, file_audio_channels; guint samplerate, target_samplerate, file_samplerate; guint format, target_format, file_format; guint buffer_size, target_buffer_size, file_buffer_size; guint frame_count; guint attack; gboolean do_playback, do_replace, is_new_buffer; gboolean do_record; gboolean resample_target, resample_file; gboolean create_wave; GValue value = {0,}; GValue do_loop_value = {0,}; GValue x_offset_value = {0,}; void (*parent_class_run_pre)(AgsRecall *recall); GRecMutex *audio_mutex; GRecMutex *buffer_mutex; GRecMutex *recall_mutex; capture_wave_channel_run = AGS_CAPTURE_WAVE_CHANNEL_RUN(recall); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_capture_wave_channel_run_parent_class)->run_pre; /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get some fields */ g_object_get(capture_wave_channel_run, "recall-audio", &capture_wave_audio, "recall-audio-run", &capture_wave_audio_run, "recall-channel", &capture_wave_channel, NULL); timestamp = capture_wave_channel_run->timestamp; g_object_get(capture_wave_channel_run, "source", &channel, NULL); g_object_get(channel, "line", &line, "input-soundcard-channel", &input_soundcard_channel, NULL); if(input_soundcard_channel == -1){ input_soundcard_channel = line; } /* get audio and mutex */ g_object_get(capture_wave_audio, "audio", &audio, NULL); audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_object_get(audio, "input", &start_input, "buffer-size", &target_buffer_size, NULL); /* get soundcard */ input = ags_channel_nth(start_input, line); g_object_get(input, "output-soundcard", &output_soundcard, "input-soundcard", &input_soundcard, NULL); if(input_soundcard == NULL){ /* call parent */ parent_class_run_pre(recall); /* unref */ g_object_unref(capture_wave_audio); g_object_unref(capture_wave_audio_run); g_object_unref(capture_wave_channel); g_object_unref(channel); g_object_unref(audio); if(start_input != NULL){ g_object_unref(start_input); } if(input != NULL){ g_object_unref(input); } return; } data = ags_soundcard_get_prev_buffer(AGS_SOUNDCARD(input_soundcard)); ags_soundcard_get_presets(AGS_SOUNDCARD(input_soundcard), &audio_channels, &samplerate, &buffer_size, &format); frame_count = buffer_size; note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); delay_counter = ags_soundcard_get_delay_counter(AGS_SOUNDCARD(output_soundcard)); x_offset = capture_wave_channel_run->x_offset; relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; /* read playback */ g_object_get(capture_wave_audio, "playback", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); do_playback = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(port); if(do_playback){ /* read replace */ g_object_get(capture_wave_audio, "replace", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); do_replace = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(port); /* get target presets */ g_rec_mutex_lock(audio_mutex); target_audio_channels = audio->audio_channels; target_samplerate = audio->samplerate; target_buffer_size = audio->buffer_size; target_format = audio->format; list_start = g_list_copy(audio->wave); g_rec_mutex_unlock(audio_mutex); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * target_samplerate; attack = (x_offset % relative_offset) % target_buffer_size; frame_count = target_buffer_size - attack; create_wave = FALSE; if(x_offset + frame_count > relative_offset * floor(x_offset / relative_offset) + relative_offset){ frame_count = relative_offset * floor((x_offset + frame_count) / relative_offset) - x_offset; create_wave = TRUE; }else if(x_offset + frame_count == relative_offset * floor(x_offset / relative_offset) + relative_offset){ create_wave = TRUE; } /* check resample */ resample_target = FALSE; if(target_samplerate != samplerate){ void *tmp_data; tmp_data = ags_stream_alloc(target_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(data, audio_channels, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, target_samplerate, target_buffer_size, tmp_data); data = tmp_data; resample_target = TRUE; } target_copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(target_format), ags_audio_buffer_util_format_from_soundcard(format)); ags_timestamp_set_ags_offset(timestamp, relative_offset * floor(x_offset / relative_offset)); /* play */ list = ags_wave_find_near_timestamp(list_start, line, timestamp); if(list != NULL){ wave = list->data; }else{ AgsTimestamp *current_timestamp; wave = ags_wave_new((GObject *) audio, line); g_object_get(wave, "timestamp", ¤t_timestamp, NULL); ags_timestamp_set_ags_offset(current_timestamp, relative_offset * floor(x_offset / relative_offset)); ags_audio_add_wave(audio, (GObject *) wave); g_object_unref(current_timestamp); } x_point_offset = x_offset - attack; buffer = ags_wave_find_point(wave, x_point_offset, FALSE); is_new_buffer = FALSE; if(buffer == NULL){ buffer = ags_buffer_new(); buffer->x = x_point_offset; ags_wave_add_buffer(wave, buffer, FALSE); is_new_buffer = TRUE; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); if(!is_new_buffer && do_replace){ void *data; data = NULL; switch(target_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { data = ((gint8 *) buffer->data) + attack; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { data = ((gint16 *) buffer->data) + attack; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { data = ((gint32 *) buffer->data) + attack; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { data = ((gint32 *) buffer->data) + attack; } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { data = ((gint64 *) buffer->data) + attack; } break; } g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_clear_buffer(data, 1, target_buffer_size - attack, ags_audio_buffer_util_format_from_soundcard(target_format)); g_rec_mutex_unlock(buffer_mutex); } /* copy to buffer */ g_rec_mutex_lock(buffer_mutex); ags_soundcard_lock_buffer(AGS_SOUNDCARD(input_soundcard), data); ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, attack, data, audio_channels, input_soundcard_channel, frame_count, target_copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(input_soundcard), data); g_rec_mutex_unlock(buffer_mutex); g_list_free(list_start); /* 2nd attempt */ g_rec_mutex_lock(audio_mutex); list_start = g_list_copy(audio->wave); g_rec_mutex_unlock(audio_mutex); if(create_wave){ ags_timestamp_set_ags_offset(timestamp, relative_offset * floor((x_offset + frame_count) / relative_offset)); /* play */ list = ags_wave_find_near_timestamp(list_start, line, timestamp); if(list != NULL){ wave = list->data; }else{ AgsTimestamp *current_timestamp; wave = ags_wave_new((GObject *) audio, line); g_object_get(wave, "timestamp", ¤t_timestamp, NULL); ags_timestamp_set_ags_offset(current_timestamp, relative_offset * floor((x_offset + frame_count) / relative_offset)); ags_audio_add_wave(audio, (GObject *) wave); g_object_unref(current_timestamp); } } g_list_free(list_start); if(attack != 0 || target_buffer_size != frame_count){ x_point_offset = x_offset + frame_count; buffer = ags_wave_find_point(wave, x_point_offset, FALSE); is_new_buffer = FALSE; if(buffer == NULL){ buffer = ags_buffer_new(); buffer->x = x_point_offset; ags_wave_add_buffer(wave, buffer, FALSE); is_new_buffer = TRUE; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); if(!is_new_buffer && do_replace){ g_rec_mutex_lock(buffer_mutex); ags_audio_buffer_util_clear_buffer(buffer->data, 1, target_buffer_size - frame_count, ags_audio_buffer_util_format_from_soundcard(target_format)); g_rec_mutex_unlock(buffer_mutex); } /* copy to buffer */ g_rec_mutex_lock(buffer_mutex); ags_soundcard_lock_buffer(AGS_SOUNDCARD(input_soundcard), data); ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, 0, data, audio_channels, (frame_count * audio_channels) + input_soundcard_channel, target_buffer_size - frame_count, target_copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(input_soundcard), data); g_rec_mutex_unlock(buffer_mutex); } if(resample_target){ g_free(data); } } /* read record */ g_object_get(capture_wave_audio, "record", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); do_record = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(port); if(do_record){ AgsAudioFile *audio_file; g_rec_mutex_lock(&(capture_wave_audio->audio_file_mutex)); audio_file = capture_wave_audio->audio_file; g_rec_mutex_unlock(&(capture_wave_audio->audio_file_mutex)); /* get presets */ g_object_get(audio_file, "file-audio-channels", &file_audio_channels, "samplerate", &file_samplerate, "buffer-size", &file_buffer_size, "format", &file_format, NULL); ags_audio_buffer_util_clear_buffer(capture_wave_audio_run->file_buffer, 1, file_audio_channels * file_buffer_size, file_format); if(file_samplerate != samplerate){ void *tmp_data; tmp_data = ags_stream_alloc(file_buffer_size, format); ags_audio_buffer_util_resample_with_buffer(data, audio_channels, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, file_samplerate, file_buffer_size, tmp_data); data = tmp_data; resample_file = TRUE; } file_copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(file_format), ags_audio_buffer_util_format_from_soundcard(format)); //TODO:JK: implement me #if 0 ags_soundcard_lock_buffer(AGS_SOUNDCARD(input_soundcard), data); ags_audio_buffer_util_copy_buffer_to_buffer(file_data, file_audio_channels, line, data, audio_channels, input_soundcard_channel, file_buffer_size, file_copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(input_soundcard), data); if(resample_file){ g_free(data); } /* file */ g_rec_mutex_lock(&(capture_wave_audio->audio_file_mutex)); ags_audio_file_write(audio_file, capture_wave_audio_run->file_buffer, file_buffer_size, file_format); g_rec_mutex_unlock(&(capture_wave_audio->audio_file_mutex)); #endif } /* check loop */ x_offset += target_buffer_size; g_object_get(capture_wave_audio, "wave-loop", &port, NULL); g_value_init(&do_loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &do_loop_value); do_loop = g_value_get_boolean(&do_loop_value); g_value_unset(&do_loop_value); g_object_unref(port); if(do_loop){ guint64 loop_start, loop_end; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; g_object_get(capture_wave_audio, "wave-loop-end", &port, NULL); g_value_init(&loop_end_value, G_TYPE_UINT64); ags_port_safe_read(port, &loop_end_value); loop_end = g_value_get_uint64(&loop_end_value); g_value_unset(&loop_end_value); g_object_unref(port); if(x_offset / buffer_size / delay >= loop_end){ g_object_get(capture_wave_audio, "wave-loop-start", &port, NULL); g_value_init(&loop_start_value, G_TYPE_UINT64); ags_port_safe_read(port, &loop_start_value); loop_start = g_value_get_uint64(&loop_start_value); g_value_unset(&loop_start_value); g_object_unref(port); x_offset = (relative_offset * floor((delay * buffer_size * loop_start) / relative_offset)) + ((guint64) (delay * buffer_size * loop_start) % relative_offset); } } /* new x offset */ capture_wave_channel_run->x_offset = x_offset; g_object_get(capture_wave_channel, "x-offset", &port, NULL); g_value_init(&x_offset_value, G_TYPE_UINT64); g_value_set_uint64(&x_offset_value, x_offset); ags_port_safe_write(port, &x_offset_value); g_value_unset(&x_offset_value); g_object_unref(port); /* call parent */ parent_class_run_pre(recall); /* unref */ g_object_unref(capture_wave_audio); g_object_unref(capture_wave_audio_run); g_object_unref(capture_wave_channel); g_object_unref(channel); g_object_unref(audio); g_object_unref(output_soundcard); g_object_unref(input_soundcard); if(start_input != NULL){ g_object_unref(start_input); } if(input != NULL){ g_object_unref(input); } } /** * ags_capture_wave_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsCaptureWaveChannelRun * * Returns: the new #AgsCaptureWaveChannelRun * * Since: 3.0.0 */ AgsCaptureWaveChannelRun* ags_capture_wave_channel_run_new(AgsChannel *source) { AgsCaptureWaveChannelRun *capture_wave_channel_run; capture_wave_channel_run = (AgsCaptureWaveChannelRun *) g_object_new(AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN, "source", source, NULL); return(capture_wave_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_stream_audio_signal.c0000644000175000017500000002155413607210263020733 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_stream_audio_signal_class_init(AgsStreamAudioSignalClass *stream_audio_signal); void ags_stream_audio_signal_init(AgsStreamAudioSignal *stream_audio_signal); void ags_stream_audio_signal_dispose(GObject *gobject); void ags_stream_audio_signal_finalize(GObject *gobject); void ags_stream_audio_signal_run_init_pre(AgsRecall *recall); void ags_stream_audio_signal_run_post(AgsRecall *recall); /** * SECTION:ags_stream_audio_signal * @short_description: streams audio signal * @title: AgsStreamAudioSignal * @section_id: * @include: ags/audio/recall/ags_stream_audio_signal.h * * The #AgsStreamAudioSignal class streams the audio signal. */ static gpointer ags_stream_audio_signal_parent_class = NULL; GType ags_stream_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_stream_audio_signal = 0; static const GTypeInfo ags_stream_audio_signal_info = { sizeof (AgsStreamAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_stream_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsStreamAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_stream_audio_signal_init, }; ags_type_stream_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsStreamAudioSignal", &ags_stream_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_stream_audio_signal); } return g_define_type_id__volatile; } void ags_stream_audio_signal_class_init(AgsStreamAudioSignalClass *stream_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_stream_audio_signal_parent_class = g_type_class_peek_parent(stream_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) stream_audio_signal; gobject->dispose = ags_stream_audio_signal_dispose; gobject->finalize = ags_stream_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) stream_audio_signal; recall->run_init_pre = ags_stream_audio_signal_run_init_pre; recall->run_post = ags_stream_audio_signal_run_post; } void ags_stream_audio_signal_init(AgsStreamAudioSignal *stream_audio_signal) { AGS_RECALL(stream_audio_signal)->name = "ags-stream"; AGS_RECALL(stream_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(stream_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(stream_audio_signal)->xml_type = "ags-stream-audio-signal"; AGS_RECALL(stream_audio_signal)->port = NULL; AGS_RECALL(stream_audio_signal)->child_type = G_TYPE_NONE; stream_audio_signal->dispose_source = NULL; } void ags_stream_audio_signal_dispose(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_stream_audio_signal_parent_class)->dispose(gobject); } void ags_stream_audio_signal_finalize(GObject *gobject) { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) AGS_STREAM_AUDIO_SIGNAL(gobject)->dispose_source; if(audio_signal != NULL){ AgsRecycling *recycling; AgsDestroyWorker *destroy_worker; recycling = (AgsRecycling *) audio_signal->recycling; #ifdef AGS_DEBUG g_message("%d %x -> %x", g_atomic_int_get(&(G_OBJECT(audio_signal)->ref_count)), audio_signal, AGS_RECALL_ID(audio_signal->recall_id)->recycling_context->parent); #endif if(recycling != NULL){ ags_recycling_remove_audio_signal(recycling, audio_signal); } if(TRUE){ destroy_worker = ags_destroy_worker_get_instance(); ags_destroy_worker_add(destroy_worker, audio_signal, ags_destroy_util_dispose_and_unref); }else{ g_object_run_dispose(audio_signal); g_object_unref(audio_signal); } } /* call parent */ G_OBJECT_CLASS(ags_stream_audio_signal_parent_class)->finalize(gobject); } void ags_stream_audio_signal_run_init_pre(AgsRecall *recall) { void (*parent_class_run_init_pre)(AgsRecall *recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_stream_audio_signal_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); AGS_STREAM_AUDIO_SIGNAL(recall)->dispose_source = (GObject *) AGS_RECALL_AUDIO_SIGNAL(recall)->source; } void ags_stream_audio_signal_run_post(AgsRecall *recall) { AgsAudioSignal *source; AgsStreamChannel *stream_channel; AgsStreamChannelRun *stream_channel_run; AgsStreamRecycling *stream_recycling; AgsStreamAudioSignal *stream_audio_signal; void (*parent_class_run_post)(AgsRecall *recall); stream_audio_signal = (AgsStreamAudioSignal *) recall; /* get parent class */ parent_class_run_post = AGS_RECALL_CLASS(ags_stream_audio_signal_parent_class)->run_post; g_object_get(stream_audio_signal, "parent", &stream_recycling, "source", &source, NULL); g_object_get(stream_recycling, "parent", &stream_channel_run, NULL); g_object_get(stream_channel_run, "recall-channel", &stream_channel, NULL); #ifdef AGS_DEBUG g_message("stream[%d] %x %d: %d", AGS_RECALL_CHANNEL(stream_channel)->source->line, source, g_list_length(source->stream), g_list_length(source->stream_current)); #endif if(source->stream_current != NULL){ if(source->stream_current->next == NULL){ AgsPort *port; gboolean auto_sense; GValue value = {0,}; g_object_get(stream_channel, "auto-sense", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); auto_sense = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(port); if(auto_sense){ void *buffer; guint buffer_size; guint format; guint i; gboolean add_stream; buffer = source->stream_current->data; g_object_get(source, "buffer-size", &buffer_size, "format", &format, NULL); add_stream = FALSE; for(i = buffer_size - 1; i > buffer_size / 2 && !add_stream; i--){ switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { if(((gint8 *) buffer)[i] != 0){ add_stream = TRUE; } } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { if(((gint16 *) buffer)[i] != 0){ add_stream = TRUE; } } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { if(((gint32 *) buffer)[i] != 0){ add_stream = TRUE; } } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { if(((gint32 *) buffer)[i] != 0){ add_stream = TRUE; } } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { if(((gint64 *) buffer)[i] != 0){ add_stream = TRUE; } } break; case AGS_SOUNDCARD_FLOAT: { if(((gfloat *) buffer)[i] != 0.0){ add_stream = TRUE; } } break; case AGS_SOUNDCARD_DOUBLE: { if(((gdouble *) buffer)[i] != 0.0){ add_stream = TRUE; } } break; default: g_critical("unsupported soundcard format"); } } if(add_stream){ ags_audio_signal_add_stream(source); } } g_value_unset(&value); } source->stream_current = source->stream_current->next; /* call parent */ parent_class_run_post(recall); }else{ /* call parent */ parent_class_run_post(recall); ags_recall_done(recall); } g_object_unref(stream_recycling); g_object_unref(source); g_object_unref(stream_channel_run); g_object_unref(stream_channel); } /** * ags_stream_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsStreamAudioSignal * * Returns: the new #AgsStreamAudioSignal * * Since: 3.0.0 */ AgsStreamAudioSignal* ags_stream_audio_signal_new(AgsAudioSignal *source) { AgsStreamAudioSignal *stream_audio_signal; stream_audio_signal = (AgsStreamAudioSignal *) g_object_new(AGS_TYPE_STREAM_AUDIO_SIGNAL, "source", source, NULL); return(stream_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_mute_audio.c0000644000175000017500000002161513607210263017053 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_mute_audio_class_init(AgsMuteAudioClass *mute_audio); void ags_mute_audio_mutable_interface_init(AgsMutableInterface *mutable); void ags_mute_audio_init(AgsMuteAudio *mute_audio); void ags_mute_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_mute_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_mute_audio_dispose(GObject *gobject); void ags_mute_audio_finalize(GObject *gobject); void ags_mute_audio_set_muted(AgsMutable *mutable, gboolean muted); static AgsPluginPort* ags_mute_audio_get_muted_plugin_port(); /** * SECTION:ags_mute_audio * @short_description: mute audio * @title: AgsMuteAudio * @section_id: * @include: ags/audio/recall/ags_mute_audio.h * * The #AgsMuteAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_MUTED, }; static gpointer ags_mute_audio_parent_class = NULL; static AgsPluginInterface *ags_mute_audio_parent_plugin_interface; static const gchar *ags_mute_audio_plugin_name = "ags-mute"; static const gchar *ags_mute_audio_specifier[] = { "./muted[0]", }; static const gchar *ags_mute_audio_control_port[] = { "1/1", }; GType ags_mute_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mute_audio = 0; static const GTypeInfo ags_mute_audio_info = { sizeof (AgsMuteAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mute_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsMuteAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mute_audio_init, }; static const GInterfaceInfo ags_mutable_interface_info = { (GInterfaceInitFunc) ags_mute_audio_mutable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_mute_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsMuteAudio", &ags_mute_audio_info, 0); g_type_add_interface_static(ags_type_mute_audio, AGS_TYPE_MUTABLE, &ags_mutable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_mute_audio); } return g_define_type_id__volatile; } void ags_mute_audio_class_init(AgsMuteAudioClass *mute_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_mute_audio_parent_class = g_type_class_peek_parent(mute_audio); /* GObjectClass */ gobject = (GObjectClass *) mute_audio; gobject->set_property = ags_mute_audio_set_property; gobject->get_property = ags_mute_audio_get_property; gobject->dispose = ags_mute_audio_dispose; gobject->finalize = ags_mute_audio_finalize; /* properties */ /** * AgsMuteAudio:muted: * * The mute port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("muted", i18n_pspec("mute audio"), i18n_pspec("Mute the audio"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); } void ags_mute_audio_mutable_interface_init(AgsMutableInterface *mutable) { mutable->set_muted = ags_mute_audio_set_muted; } void ags_mute_audio_init(AgsMuteAudio *mute_audio) { GList *port; AGS_RECALL(mute_audio)->name = "ags-mute"; AGS_RECALL(mute_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(mute_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(mute_audio)->xml_type = "ags-mute-audio"; port = NULL; /* muted */ mute_audio->muted = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_mute_audio_plugin_name, "specifier", ags_mute_audio_specifier[0], "control-port", ags_mute_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(mute_audio->muted); mute_audio->muted->port_value.ags_port_float = (float) FALSE; /* plugin port */ g_object_set(mute_audio->muted, "plugin-port", ags_mute_audio_get_muted_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, mute_audio->muted); g_object_ref(mute_audio->muted); /* set port */ AGS_RECALL(mute_audio)->port = port; } void ags_mute_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMuteAudio *mute_audio; GRecMutex *recall_mutex; mute_audio = AGS_MUTE_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(mute_audio); switch(prop_id){ case PROP_MUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == mute_audio->muted){ g_rec_mutex_unlock(recall_mutex); return; } if(mute_audio->muted != NULL){ g_object_unref(G_OBJECT(mute_audio->muted)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } mute_audio->muted = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_mute_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMuteAudio *mute_audio; GRecMutex *recall_mutex; mute_audio = AGS_MUTE_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(mute_audio); switch(prop_id){ case PROP_MUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, mute_audio->muted); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_mute_audio_dispose(GObject *gobject) { AgsMuteAudio *mute_audio; mute_audio = AGS_MUTE_AUDIO(gobject); /* muted */ if(mute_audio->muted != NULL){ g_object_unref(G_OBJECT(mute_audio->muted)); mute_audio->muted = NULL; } /* call parent */ G_OBJECT_CLASS(ags_mute_audio_parent_class)->dispose(gobject); } void ags_mute_audio_finalize(GObject *gobject) { AgsMuteAudio *mute_audio; mute_audio = AGS_MUTE_AUDIO(gobject); /* muted */ if(mute_audio->muted != NULL){ g_object_unref(G_OBJECT(mute_audio->muted)); } /* call parent */ G_OBJECT_CLASS(ags_mute_audio_parent_class)->finalize(gobject); } void ags_mute_audio_set_muted(AgsMutable *mutable, gboolean muted) { AgsPort *port; GValue value = {0,}; g_object_get(G_OBJECT(mutable), "muted", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (muted ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } static AgsPluginPort* ags_mute_audio_get_muted_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_TOGGLED); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_mute_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsMuteAudio * * Returns: the new #AgsMuteAudio * * Since: 3.0.0 */ AgsMuteAudio* ags_mute_audio_new(AgsAudio *audio) { AgsMuteAudio *mute_audio; mute_audio = (AgsMuteAudio *) g_object_new(AGS_TYPE_MUTE_AUDIO, "audio", audio, NULL); return(mute_audio); } gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_audio_signal.h0000644000175000017500000000445013607210263021441 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RT_STREAM_AUDIO_SIGNAL_H__ #define __AGS_RT_STREAM_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RT_STREAM_AUDIO_SIGNAL (ags_rt_stream_audio_signal_get_type()) #define AGS_RT_STREAM_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RT_STREAM_AUDIO_SIGNAL, AgsRtStreamAudioSignal)) #define AGS_RT_STREAM_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RT_STREAM_AUDIO_SIGNAL, AgsRtStreamAudioSignalClass)) #define AGS_IS_RT_STREAM_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RT_STREAM_AUDIO_SIGNAL)) #define AGS_IS_RT_STREAM_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RT_STREAM_AUDIO_SIGNAL)) #define AGS_RT_STREAM_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RT_STREAM_AUDIO_SIGNAL, AgsRtStreamAudioSignalClass)) typedef struct _AgsRtStreamAudioSignal AgsRtStreamAudioSignal; typedef struct _AgsRtStreamAudioSignalClass AgsRtStreamAudioSignalClass; struct _AgsRtStreamAudioSignal { AgsRecallAudioSignal recall_audio_signal; GObject *dispose_source; }; struct _AgsRtStreamAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_rt_stream_audio_signal_get_type(); AgsRtStreamAudioSignal* ags_rt_stream_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_RT_STREAM_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_envelope_recycling.c0000644000175000017500000000747113607210263020600 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_envelope_recycling_class_init(AgsEnvelopeRecyclingClass *envelope_recycling); void ags_envelope_recycling_init(AgsEnvelopeRecycling *envelope_recycling); void ags_envelope_recycling_finalize(GObject *gobject); /** * SECTION:ags_envelope_recycling * @short_description: envelopes recycling * @title: AgsEnvelopeRecycling * @section_id: * @include: ags/audio/recall/ags_envelope_recycling.h * * The #AgsEnvelopeRecycling class envelopes the recycling. */ static gpointer ags_envelope_recycling_parent_class = NULL; GType ags_envelope_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_recycling = 0; static const GTypeInfo ags_envelope_recycling_info = { sizeof (AgsEnvelopeRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_recycling_init, }; ags_type_envelope_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsEnvelopeRecycling", &ags_envelope_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_recycling); } return g_define_type_id__volatile; } void ags_envelope_recycling_class_init(AgsEnvelopeRecyclingClass *envelope_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_envelope_recycling_parent_class = g_type_class_peek_parent(envelope_recycling); /* GObjectClass */ gobject = (GObjectClass *) envelope_recycling; gobject->finalize = ags_envelope_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) envelope_recycling; } void ags_envelope_recycling_init(AgsEnvelopeRecycling *envelope_recycling) { AGS_RECALL(envelope_recycling)->name = "ags-envelope"; AGS_RECALL(envelope_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(envelope_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(envelope_recycling)->xml_type = "ags-envelope-recycling"; AGS_RECALL(envelope_recycling)->port = NULL; AGS_RECALL(envelope_recycling)->child_type = AGS_TYPE_ENVELOPE_AUDIO_SIGNAL; } void ags_envelope_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_envelope_recycling_parent_class)->finalize(gobject); } /** * ags_envelope_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsEnvelopeRecycling * * Returns: the new #AgsEnvelopeRecycling * * Since: 3.0.0 */ AgsEnvelopeRecycling* ags_envelope_recycling_new(AgsRecycling *source) { AgsEnvelopeRecycling *envelope_recycling; envelope_recycling = (AgsEnvelopeRecycling *) g_object_new(AGS_TYPE_ENVELOPE_RECYCLING, "source", source, NULL); return(envelope_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_buffer_audio_signal.h0000644000175000017500000000435213607210263020713 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUFFER_AUDIO_SIGNAL_H__ #define __AGS_BUFFER_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BUFFER_AUDIO_SIGNAL (ags_buffer_audio_signal_get_type()) #define AGS_BUFFER_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUFFER_AUDIO_SIGNAL, AgsBufferAudioSignal)) #define AGS_BUFFER_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BUFFER_AUDIO_SIGNAL, AgsBufferAudioSignalClass)) #define AGS_IS_BUFFER_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_BUFFER_AUDIO_SIGNAL)) #define AGS_IS_BUFFER_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_BUFFER_AUDIO_SIGNAL)) #define AGS_BUFFER_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_BUFFER_AUDIO_SIGNAL, AgsBufferAudioSignalClass)) typedef struct _AgsBufferAudioSignal AgsBufferAudioSignal; typedef struct _AgsBufferAudioSignalClass AgsBufferAudioSignalClass; struct _AgsBufferAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsBufferAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_buffer_audio_signal_get_type(); AgsBufferAudioSignal* ags_buffer_audio_signal_new(AgsAudioSignal *destination, AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_BUFFER_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_stream_channel.h0000644000175000017500000000414013607210263017702 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STREAM_CHANNEL_H__ #define __AGS_STREAM_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_STREAM_CHANNEL (ags_stream_channel_get_type()) #define AGS_STREAM_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_STREAM_CHANNEL, AgsStreamChannel)) #define AGS_STREAM_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_STREAM_CHANNEL, AgsStreamChannelClass)) #define AGS_IS_STREAM_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_STREAM_CHANNEL)) #define AGS_IS_STREAM_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_STREAM_CHANNEL)) #define AGS_STREAM_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_STREAM_CHANNEL, AgsStreamChannelClass)) typedef struct _AgsStreamChannel AgsStreamChannel; typedef struct _AgsStreamChannelClass AgsStreamChannelClass; struct _AgsStreamChannel { AgsRecallChannel recall_channel; AgsPort *auto_sense; }; struct _AgsStreamChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_stream_channel_get_type(); AgsStreamChannel* ags_stream_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_STREAM_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_record_midi_audio.h0000644000175000017500000000436213607210263020366 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECORD_MIDI_AUDIO_H__ #define __AGS_RECORD_MIDI_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECORD_MIDI_AUDIO (ags_record_midi_audio_get_type()) #define AGS_RECORD_MIDI_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECORD_MIDI_AUDIO, AgsRecordMidiAudio)) #define AGS_RECORD_MIDI_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECORD_MIDI_AUDIO, AgsRecordMidiAudio)) #define AGS_IS_RECORD_MIDI_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECORD_MIDI_AUDIO)) #define AGS_IS_RECORD_MIDI_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECORD_MIDI_AUDIO)) #define AGS_RECORD_MIDI_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECORD_MIDI_AUDIO, AgsRecordMidiAudioClass)) typedef struct _AgsRecordMidiAudio AgsRecordMidiAudio; typedef struct _AgsRecordMidiAudioClass AgsRecordMidiAudioClass; struct _AgsRecordMidiAudio { AgsRecallAudio recall_audio; AgsPort *playback; AgsPort *record; AgsPort *filename; AgsPort *division; AgsPort *tempo; AgsPort *bpm; }; struct _AgsRecordMidiAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_record_midi_audio_get_type(); AgsRecordMidiAudio* ags_record_midi_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_RECORD_MIDI_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_volume_channel_run.h0000644000175000017500000000421413607210263020604 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VOLUME_CHANNEL_RUN_H__ #define __AGS_VOLUME_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_VOLUME_CHANNEL_RUN (ags_volume_channel_run_get_type()) #define AGS_VOLUME_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_VOLUME_CHANNEL_RUN, AgsVolumeChannelRun)) #define AGS_VOLUME_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_INSTANCE_CAST(class, AGS_TYPE_VOLUME_CHANNEL_RUN, AgsVolumeChannelRunClass)) #define AGS_IS_VOLUME_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_VOLUME_CHANNEL_RUN)) #define AGS_IS_VOLUME_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_VOLUME_CHANNEL_RUN)) #define AGS_VOLUME_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_VOLUME_CHANNEL_RUN, AgsVolumeChannelRunClass)) typedef struct _AgsVolumeChannelRun AgsVolumeChannelRun; typedef struct _AgsVolumeChannelRunClass AgsVolumeChannelRunClass; struct _AgsVolumeChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsVolumeChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_volume_channel_run_get_type(); AgsVolumeChannelRun* ags_volume_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_VOLUME_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_audio_signal.h0000644000175000017500000000431713607210263020410 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_AUDIO_SIGNAL_H__ #define __AGS_PLAY_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_AUDIO_SIGNAL (ags_play_audio_signal_get_type()) #define AGS_PLAY_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_AUDIO_SIGNAL, AgsPlayAudioSignal)) #define AGS_PLAY_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_AUDIO_SIGNAL, AgsPlayAudioSignalClass)) #define AGS_IS_PLAY_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_AUDIO_SIGNAL)) #define AGS_IS_PLAY_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_AUDIO_SIGNAL)) #define AGS_PLAY_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_AUDIO_SIGNAL, AgsPlayAudioSignalClass)) typedef struct _AgsPlayAudioSignal AgsPlayAudioSignal; typedef struct _AgsPlayAudioSignalClass AgsPlayAudioSignalClass; struct _AgsPlayAudioSignal { AgsRecallAudioSignal recall_audio_signal; guint sub_block_count; gboolean *completed_sub_block; }; struct _AgsPlayAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_play_audio_signal_get_type(); AgsPlayAudioSignal* ags_play_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_PLAY_AUDIO_SIGNAL__H__*/ gsequencer-3.1.3/ags/audio/recall/ags_feed_recycling.c0000644000175000017500000000711013607210263017654 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_feed_recycling_class_init(AgsFeedRecyclingClass *feed_recycling); void ags_feed_recycling_init(AgsFeedRecycling *feed_recycling); void ags_feed_recycling_finalize(GObject *gobject); /** * SECTION:ags_feed_recycling * @short_description: feeds recycling * @title: AgsFeedRecycling * @section_id: * @include: ags/audio/recall/ags_feed_recycling.h * * The #AgsFeedRecycling class feeds the recycling. */ static gpointer ags_feed_recycling_parent_class = NULL; GType ags_feed_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_feed_recycling = 0; static const GTypeInfo ags_feed_recycling_info = { sizeof (AgsFeedRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_feed_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFeedRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_feed_recycling_init, }; ags_type_feed_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsFeedRecycling", &ags_feed_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_feed_recycling); } return g_define_type_id__volatile; } void ags_feed_recycling_class_init(AgsFeedRecyclingClass *feed_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_feed_recycling_parent_class = g_type_class_peek_parent(feed_recycling); /* GObjectClass */ gobject = (GObjectClass *) feed_recycling; gobject->finalize = ags_feed_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) feed_recycling; } void ags_feed_recycling_init(AgsFeedRecycling *feed_recycling) { AGS_RECALL(feed_recycling)->name = "ags-feed"; AGS_RECALL(feed_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(feed_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(feed_recycling)->xml_type = "ags-feed-recycling"; AGS_RECALL(feed_recycling)->child_type = AGS_TYPE_FEED_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(feed_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_feed_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_feed_recycling_parent_class)->finalize(gobject); } /** * ags_feed_recycling_new: * @source: the #AgsRecycling * * Creates an #AgsFeedRecycling * * Returns: a new #AgsFeedRecycling * * Since: 3.0.0 */ AgsFeedRecycling* ags_feed_recycling_new(AgsRecycling *source) { AgsFeedRecycling *feed_recycling; feed_recycling = (AgsFeedRecycling *) g_object_new(AGS_TYPE_FEED_RECYCLING, "source", source, NULL); return(feed_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_feed_channel.h0000644000175000017500000000376213607210263017323 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FEED_CHANNEL_H__ #define __AGS_FEED_CHANNEL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FEED_CHANNEL (ags_feed_channel_get_type()) #define AGS_FEED_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FEED_CHANNEL, AgsFeedChannel)) #define AGS_FEED_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FEED_CHANNEL, AgsFeedChannelClass)) #define AGS_IS_FEED_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FEED_CHANNEL)) #define AGS_IS_FEED_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FEED_CHANNEL)) #define AGS_FEED_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FEED_CHANNEL, AgsFeedChannelClass)) typedef struct _AgsFeedChannel AgsFeedChannel; typedef struct _AgsFeedChannelClass AgsFeedChannelClass; struct _AgsFeedChannel { AgsRecallChannel recall_channel; }; struct _AgsFeedChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_feed_channel_get_type(); AgsFeedChannel* ags_feed_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_FEED_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_audio.c0000644000175000017500000002150213607210263017041 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_play_audio_class_init(AgsPlayAudioClass *play_audio); void ags_play_audio_mutable_interface_init(AgsMutableInterface *mutable); void ags_play_audio_init(AgsPlayAudio *play_audio); void ags_play_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_audio_dispose(GObject *gobject); void ags_play_audio_finalize(GObject *gobject); void ags_play_audio_set_muted(AgsMutable *mutable, gboolean muted); static AgsPluginPort* ags_play_audio_get_muted_plugin_port(); /** * SECTION:ags_play_audio * @short_description: play audio * @title: AgsPlayAudio * @section_id: * @include: ags/audio/recall/ags_play_audio.h * * The #AgsPlayAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_MUTED, }; static gpointer ags_play_audio_parent_class = NULL; static const gchar *ags_play_audio_plugin_name = "ags-play"; static const gchar *ags_play_audio_specifier[] = { "./muted[0]", }; static const gchar *ags_play_audio_control_port[] = { "1/1", }; GType ags_play_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_audio = 0; static const GTypeInfo ags_play_audio_info = { sizeof (AgsPlayAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsPlayAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_audio_init, }; static const GInterfaceInfo ags_mutable_interface_info = { (GInterfaceInitFunc) ags_play_audio_mutable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsPlayAudio", &ags_play_audio_info, 0); g_type_add_interface_static(ags_type_play_audio, AGS_TYPE_MUTABLE, &ags_mutable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_audio); } return g_define_type_id__volatile; } void ags_play_audio_mutable_interface_init(AgsMutableInterface *mutable) { mutable->set_muted = ags_play_audio_set_muted; } void ags_play_audio_class_init(AgsPlayAudioClass *play_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_play_audio_parent_class = g_type_class_peek_parent(play_audio); /* GObjectClass */ gobject = (GObjectClass *) play_audio; gobject->set_property = ags_play_audio_set_property; gobject->get_property = ags_play_audio_get_property; gobject->dispose = ags_play_audio_dispose; gobject->finalize = ags_play_audio_finalize; /* properties */ /** * AgsPlayAudio:muted: * * The mute port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("muted", i18n_pspec("mute audio"), i18n_pspec("Mute the audio"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); } void ags_play_audio_init(AgsPlayAudio *play_audio) { GList *port; AGS_RECALL(play_audio)->name = "ags-play"; AGS_RECALL(play_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_audio)->xml_type = "ags-play-audio"; port = NULL; /* muted */ play_audio->muted = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_audio_plugin_name, "specifier", ags_play_audio_specifier[0], "control-port", ags_play_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(play_audio->muted); play_audio->muted->port_value.ags_port_float = (float) 0.0; /* plugin port */ g_object_set(play_audio->muted, "plugin-port", ags_play_audio_get_muted_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, play_audio->muted); g_object_ref(play_audio->muted); /* set port */ AGS_RECALL(play_audio)->port = port; } void ags_play_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayAudio *play_audio; GRecMutex *recall_mutex; play_audio = AGS_PLAY_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_audio); switch(prop_id){ case PROP_MUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == play_audio->muted){ g_rec_mutex_unlock(recall_mutex); return; } if(play_audio->muted != NULL){ g_object_unref(G_OBJECT(play_audio->muted)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } play_audio->muted = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayAudio *play_audio; GRecMutex *recall_mutex; play_audio = AGS_PLAY_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_audio); switch(prop_id){ case PROP_MUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_audio->muted); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_audio_dispose(GObject *gobject) { AgsPlayAudio *play_audio; play_audio = AGS_PLAY_AUDIO(gobject); /* muted */ if(play_audio->muted != NULL){ g_object_unref(G_OBJECT(play_audio->muted)); play_audio->muted = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_audio_parent_class)->dispose(gobject); } void ags_play_audio_finalize(GObject *gobject) { AgsPlayAudio *play_audio; play_audio = AGS_PLAY_AUDIO(gobject); /* muted */ if(play_audio->muted != NULL){ g_object_unref(G_OBJECT(play_audio->muted)); } /* call parent */ G_OBJECT_CLASS(ags_play_audio_parent_class)->finalize(gobject); } void ags_play_audio_set_muted(AgsMutable *mutable, gboolean muted) { AgsPort *port; GValue value = {0,}; g_object_get(G_OBJECT(mutable), "muted", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (muted ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } static AgsPluginPort* ags_play_audio_get_muted_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_TOGGLED); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_play_audio_new: * @audio: the #AgsAudio * * Creates an #AgsPlayAudio * * Returns: a new #AgsPlayAudio * * Since: 3.0.0 */ AgsPlayAudio* ags_play_audio_new(AgsAudio *audio) { AgsPlayAudio *play_audio; play_audio = (AgsPlayAudio *) g_object_new(AGS_TYPE_PLAY_AUDIO, "audio", audio, NULL); return(play_audio); } gsequencer-3.1.3/ags/audio/recall/ags_mute_audio.h0000644000175000017500000000373313607210263017061 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTE_AUDIO_H__ #define __AGS_MUTE_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTE_AUDIO (ags_mute_audio_get_type()) #define AGS_MUTE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTE_AUDIO, AgsMuteAudio)) #define AGS_MUTE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MUTE_AUDIO, AgsMuteAudio)) #define AGS_IS_MUTE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MUTE_AUDIO)) #define AGS_IS_MUTE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MUTE_AUDIO)) #define AGS_MUTE_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MUTE_AUDIO, AgsMuteAudioClass)) typedef struct _AgsMuteAudio AgsMuteAudio; typedef struct _AgsMuteAudioClass AgsMuteAudioClass; struct _AgsMuteAudio { AgsRecallAudio recall_audio; AgsPort *muted; }; struct _AgsMuteAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_mute_audio_get_type(); AgsMuteAudio* ags_mute_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_MUTE_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_lfo_channel.c0000644000175000017500000005530713607210263017175 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_lfo_channel_class_init(AgsLfoChannelClass *lfo_channel); void ags_lfo_channel_init(AgsLfoChannel *lfo_channel); void ags_lfo_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lfo_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lfo_channel_dispose(GObject *gobject); void ags_lfo_channel_finalize(GObject *gobject); static AgsPluginPort* ags_lfo_channel_get_enabled_plugin_port(); static AgsPluginPort* ags_lfo_channel_get_lfo_wave_plugin_port(); static AgsPluginPort* ags_lfo_channel_get_lfo_freq_plugin_port(); static AgsPluginPort* ags_lfo_channel_get_lfo_phase_plugin_port(); static AgsPluginPort* ags_lfo_channel_get_lfo_depth_plugin_port(); static AgsPluginPort* ags_lfo_channel_get_lfo_tuning_plugin_port(); /** * SECTION:ags_lfo_channel * @short_description: lfos channel * @title: AgsLfoChannel * @section_id: * @include: ags/audio/recall/ags_lfo_channel.h * * The #AgsLfoChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_ENABLED, PROP_LFO_WAVE, PROP_LFO_FREQ, PROP_LFO_PHASE, PROP_LFO_DEPTH, PROP_LFO_TUNING, }; static gpointer ags_lfo_channel_parent_class = NULL; static const gchar *ags_lfo_channel_plugin_name = "ags-lfo"; static const gchar *ags_lfo_channel_specifier[] = { "./enabled[0]", "./lfo-wave[0]", "./lfo-freq[0]", "./lfo-phase[0]", "./lfo-depth[0]", "./lfo-tuning[0]" }; static const gchar *ags_lfo_channel_control_port[] = { "1/6", "2/6", "3/6", "4/6", "5/6", "6/6" }; GType ags_lfo_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lfo_channel = 0; static const GTypeInfo ags_lfo_channel_info = { sizeof (AgsLfoChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lfo_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLfoChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lfo_channel_init, }; ags_type_lfo_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsLfoChannel", &ags_lfo_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lfo_channel); } return g_define_type_id__volatile; } void ags_lfo_channel_class_init(AgsLfoChannelClass *lfo_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_lfo_channel_parent_class = g_type_class_peek_parent(lfo_channel); /* GObjectClass */ gobject = (GObjectClass *) lfo_channel; gobject->set_property = ags_lfo_channel_set_property; gobject->get_property = ags_lfo_channel_get_property; gobject->dispose = ags_lfo_channel_dispose; gobject->finalize = ags_lfo_channel_finalize; /* properties */ /** * AgsLfoChannel:enabled: * * The enabled port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("enabled", i18n_pspec("enabled"), i18n_pspec("If LFO is enabled"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ENABLED, param_spec); /** * AgsLfoChannel:lfo-wave: * * The lfo-wave port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lfo-wave", i18n_pspec("lfo wave to apply"), i18n_pspec("The lfo wave to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LFO_WAVE, param_spec); /** * AgsLfoChannel:lfo-freq: * * The lfo-freq port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lfo-freq", i18n_pspec("lfo frequency to apply"), i18n_pspec("The lfo frequency to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LFO_FREQ, param_spec); /** * AgsLfoChannel:lfo-phase: * * The lfo-phase port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lfo-phase", i18n_pspec("lfo phase to apply"), i18n_pspec("The lfo phase to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LFO_PHASE, param_spec); /** * AgsLfoChannel:lfo-depth: * * The lfo-depth port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lfo-depth", i18n_pspec("lfo depth to apply"), i18n_pspec("The lfo depth to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LFO_DEPTH, param_spec); /** * AgsLfoChannel:lfo-tuning: * * The lfo-tuning port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lfo-tuning", i18n_pspec("lfo tuning to apply"), i18n_pspec("The lfo tuning to apply on the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LFO_TUNING, param_spec); } void ags_lfo_channel_init(AgsLfoChannel *lfo_channel) { GList *port; AGS_RECALL(lfo_channel)->name = "ags-lfo"; AGS_RECALL(lfo_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(lfo_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(lfo_channel)->xml_type = "ags-lfo-channel"; /* initialize the port */ port = NULL; /* enabled */ lfo_channel->enabled = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-lfo", "specifier", "./enabled[0]", "control-port", "1/5", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(lfo_channel->enabled); lfo_channel->enabled->port_value.ags_port_float = 0.0; /* port descriptor */ g_object_set(lfo_channel->enabled, "plugin-port", ags_lfo_channel_get_enabled_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, lfo_channel->enabled); g_object_ref(lfo_channel->enabled); /* lfo wave */ lfo_channel->lfo_wave = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-lfo", "specifier", "./lfo-wave[0]", "control-port", "4/5", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(lfo_channel->lfo_wave); lfo_channel->lfo_wave->port_value.ags_port_float = 0.0; /* port descriptor */ g_object_set(lfo_channel->lfo_wave, "plugin-port", ags_lfo_channel_get_lfo_wave_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, lfo_channel->lfo_wave); g_object_ref(lfo_channel->lfo_wave); /* lfo-freq */ lfo_channel->lfo_freq = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-lfo", "specifier", "./lfo-freq[0]", "control-port", "2/5", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(lfo_channel->lfo_freq); lfo_channel->lfo_freq->port_value.ags_port_float = 0.0; /* port descriptor */ g_object_set(lfo_channel->lfo_freq, "plugin-port", ags_lfo_channel_get_lfo_freq_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, lfo_channel->lfo_freq); g_object_ref(lfo_channel->lfo_freq); /* lfo phase */ lfo_channel->lfo_phase = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-lfo", "specifier", "./lfo-phase[0]", "control-port", "3/5", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(lfo_channel->lfo_phase); lfo_channel->lfo_phase->port_value.ags_port_float = 0.0; /* port descriptor */ g_object_set(lfo_channel->lfo_phase, "plugin-port", ags_lfo_channel_get_lfo_phase_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, lfo_channel->lfo_phase); g_object_ref(lfo_channel->lfo_phase); /* lfo depth */ lfo_channel->lfo_depth = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-lfo", "specifier", "./lfo-depth[0]", "control-port", "4/5", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(lfo_channel->lfo_depth); lfo_channel->lfo_depth->port_value.ags_port_float = 0.0; /* port descriptor */ g_object_set(lfo_channel->lfo_depth, "plugin-port", ags_lfo_channel_get_lfo_depth_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, lfo_channel->lfo_depth); g_object_ref(lfo_channel->lfo_depth); /* lfo tuning */ lfo_channel->lfo_tuning = g_object_new(AGS_TYPE_PORT, "plugin-name", "ags-lfo", "specifier", "./lfo-tuning[0]", "control-port", "5/5", "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(lfo_channel->lfo_tuning); lfo_channel->lfo_tuning->port_value.ags_port_float = 0.0; /* port descriptor */ g_object_set(lfo_channel->lfo_tuning, "plugin-port", ags_lfo_channel_get_lfo_tuning_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, lfo_channel->lfo_tuning); g_object_ref(lfo_channel->lfo_tuning); /* set port */ AGS_RECALL(lfo_channel)->port = port; } void ags_lfo_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLfoChannel *lfo_channel; GRecMutex *recall_mutex; lfo_channel = AGS_LFO_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(lfo_channel); switch(prop_id){ case PROP_ENABLED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == lfo_channel->enabled){ g_rec_mutex_unlock(recall_mutex); return; } if(lfo_channel->enabled != NULL){ g_object_unref(G_OBJECT(lfo_channel->enabled)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } lfo_channel->enabled = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_WAVE: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == lfo_channel->lfo_wave){ g_rec_mutex_unlock(recall_mutex); return; } if(lfo_channel->lfo_wave != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_wave)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } lfo_channel->lfo_wave = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_FREQ: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == lfo_channel->lfo_freq){ g_rec_mutex_unlock(recall_mutex); return; } if(lfo_channel->lfo_freq != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_freq)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } lfo_channel->lfo_freq = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_PHASE: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == lfo_channel->lfo_phase){ g_rec_mutex_unlock(recall_mutex); return; } if(lfo_channel->lfo_phase != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_phase)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } lfo_channel->lfo_phase = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_DEPTH: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == lfo_channel->lfo_depth){ g_rec_mutex_unlock(recall_mutex); return; } if(lfo_channel->lfo_depth != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_depth)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } lfo_channel->lfo_depth = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_TUNING: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == lfo_channel->lfo_tuning){ g_rec_mutex_unlock(recall_mutex); return; } if(lfo_channel->lfo_tuning != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_tuning)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } lfo_channel->lfo_tuning = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lfo_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLfoChannel *lfo_channel; GRecMutex *recall_mutex; lfo_channel = AGS_LFO_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(lfo_channel); switch(prop_id){ case PROP_ENABLED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, lfo_channel->enabled); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_WAVE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, lfo_channel->lfo_wave); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_FREQ: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, lfo_channel->lfo_freq); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_PHASE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, lfo_channel->lfo_phase); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_DEPTH: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, lfo_channel->lfo_depth); g_rec_mutex_unlock(recall_mutex); } break; case PROP_LFO_TUNING: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, lfo_channel->lfo_tuning); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lfo_channel_dispose(GObject *gobject) { AgsLfoChannel *lfo_channel; lfo_channel = AGS_LFO_CHANNEL(gobject); /* enabled */ if(lfo_channel->enabled != NULL){ g_object_unref(G_OBJECT(lfo_channel->enabled)); } /* lfo wave */ if(lfo_channel->lfo_wave != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_wave)); } /* lfo freq */ if(lfo_channel->lfo_freq != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_freq)); } /* lfo phase */ if(lfo_channel->lfo_phase != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_phase)); } /* lfo depth */ if(lfo_channel->lfo_depth != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_depth)); } /* lfo tuning */ if(lfo_channel->lfo_tuning != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_tuning)); } /* call parent */ G_OBJECT_CLASS(ags_lfo_channel_parent_class)->dispose(gobject); } void ags_lfo_channel_finalize(GObject *gobject) { AgsLfoChannel *lfo_channel; lfo_channel = AGS_LFO_CHANNEL(gobject); /* enabled */ if(lfo_channel->enabled != NULL){ g_object_unref(G_OBJECT(lfo_channel->enabled)); } /* lfo wave */ if(lfo_channel->lfo_wave != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_wave)); } /* lfo freq */ if(lfo_channel->lfo_freq != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_freq)); } /* lfo phase */ if(lfo_channel->lfo_phase != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_phase)); } /* lfo depth */ if(lfo_channel->lfo_depth != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_depth)); } /* lfo tuning */ if(lfo_channel->lfo_tuning != NULL){ g_object_unref(G_OBJECT(lfo_channel->lfo_tuning)); } /* call parent */ G_OBJECT_CLASS(ags_lfo_channel_parent_class)->finalize(gobject); } static AgsPluginPort* ags_lfo_channel_get_enabled_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_TOGGLED); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 1.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } static AgsPluginPort* ags_lfo_channel_get_lfo_wave_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_ENUMERATION); plugin_port->port_index = 1; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, (gdouble) AGS_SYNTH_OSCILLATOR_LAST - 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } static AgsPluginPort* ags_lfo_channel_get_lfo_freq_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 2; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 6.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 20.0); } g_mutex_unlock(&mutex); return(plugin_port); } static AgsPluginPort* ags_lfo_channel_get_lfo_phase_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 3; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, G_MAXDOUBLE); } g_mutex_unlock(&mutex); return(plugin_port); } static AgsPluginPort* ags_lfo_channel_get_lfo_depth_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 4; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, -1200.0); g_value_set_float(plugin_port->upper_value, 1200.0); } g_mutex_unlock(&mutex); return(plugin_port); } static AgsPluginPort* ags_lfo_channel_get_lfo_tuning_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL); plugin_port->port_index = 5; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, -1200.0); g_value_set_float(plugin_port->upper_value, -1200.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_lfo_channel_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsLfoChannel * * Returns: the new #AgsLfoChannel * * Since: 3.0.0 */ AgsLfoChannel* ags_lfo_channel_new(AgsChannel *source) { AgsLfoChannel *lfo_channel; lfo_channel = (AgsLfoChannel *) g_object_new(AGS_TYPE_LFO_CHANNEL, "source", source, NULL); return(lfo_channel); } gsequencer-3.1.3/ags/audio/recall/ags_mute_audio_run.c0000644000175000017500000000713013607210263017733 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_mute_audio_run_class_init(AgsMuteAudioRunClass *mute_audio_run); void ags_mute_audio_run_init(AgsMuteAudioRun *mute_audio_run); void ags_mute_audio_run_finalize(GObject *gobject); /** * SECTION:ags_mute_audio_run * @short_description: copy pattern * @title: AgsMuteAudioRun * @section_id: * @include: ags/audio/recall/ags_mute_audio_run.h * * The #AgsMuteAudioRun class copy pattern. */ static gpointer ags_mute_audio_run_parent_class = NULL; GType ags_mute_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mute_audio_run = 0; static const GTypeInfo ags_mute_audio_run_info = { sizeof (AgsMuteAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mute_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMuteAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mute_audio_run_init, }; ags_type_mute_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsMuteAudioRun", &ags_mute_audio_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_mute_audio_run); } return g_define_type_id__volatile; } void ags_mute_audio_run_class_init(AgsMuteAudioRunClass *mute_audio_run) { GObjectClass *gobject; ags_mute_audio_run_parent_class = g_type_class_peek_parent(mute_audio_run); /* GObjectClass */ gobject = (GObjectClass *) mute_audio_run; gobject->finalize = ags_mute_audio_run_finalize; } void ags_mute_audio_run_init(AgsMuteAudioRun *mute_audio_run) { ags_recall_set_ability_flags((AgsRecall *) mute_audio_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(mute_audio_run)->name = "ags-mute"; AGS_RECALL(mute_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(mute_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(mute_audio_run)->xml_type = "ags-mute-audio-run"; AGS_RECALL(mute_audio_run)->port = NULL; } void ags_mute_audio_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_mute_audio_run_parent_class)->finalize(gobject); } /** * ags_mute_audio_run_new: * @audio: the #AgsAudio * * Create a new instance of #AgsMuteAudioRun * * Returns: the new #AgsMuteAudioRun * * Since: 3.0.0 */ AgsMuteAudioRun* ags_mute_audio_run_new(AgsAudio *audio) { AgsMuteAudioRun *mute_audio_run; mute_audio_run = (AgsMuteAudioRun *) g_object_new(AGS_TYPE_MUTE_AUDIO_RUN, "audio", audio, NULL); return(mute_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_volume_channel_run.c0000644000175000017500000000757513607210263020614 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_volume_channel_run_class_init(AgsVolumeChannelRunClass *volume_channel_run); void ags_volume_channel_run_init(AgsVolumeChannelRun *volume_channel_run); void ags_volume_channel_run_finalize(GObject *gobject); /** * SECTION:ags_volume_channel_run * @short_description: volumes channel * @title: AgsVolumeChannelRun * @section_id: * @include: ags/audio/recall/ags_volume_channel_run.h * * The #AgsVolumeChannelRun class volumes the channel. */ static gpointer ags_volume_channel_run_parent_class = NULL; GType ags_volume_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_volume_channel_run = 0; static const GTypeInfo ags_volume_channel_run_info = { sizeof (AgsVolumeChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_volume_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVolumeChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_volume_channel_run_init, }; ags_type_volume_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsVolumeChannelRun", &ags_volume_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_volume_channel_run); } return g_define_type_id__volatile; } void ags_volume_channel_run_class_init(AgsVolumeChannelRunClass *volume_channel_run) { GObjectClass *gobject; ags_volume_channel_run_parent_class = g_type_class_peek_parent(volume_channel_run); /* GObjectClass */ gobject = (GObjectClass *) volume_channel_run; gobject->finalize = ags_volume_channel_run_finalize; } void ags_volume_channel_run_init(AgsVolumeChannelRun *volume_channel_run) { ags_recall_set_ability_flags((AgsRecall *) volume_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(volume_channel_run)->name = "ags-volume"; AGS_RECALL(volume_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(volume_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(volume_channel_run)->xml_type = "ags-volume-channel-run"; AGS_RECALL(volume_channel_run)->port = NULL; AGS_RECALL(volume_channel_run)->child_type = AGS_TYPE_VOLUME_RECYCLING; } void ags_volume_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_volume_channel_run_parent_class)->finalize(gobject); } /** * ags_volume_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsVolumeChannelRun * * Returns: the new #AgsVolumeChannelRun * * Since: 3.0.0 */ AgsVolumeChannelRun* ags_volume_channel_run_new(AgsChannel *source) { AgsVolumeChannelRun *volume_channel_run; volume_channel_run = (AgsVolumeChannelRun *) g_object_new(AGS_TYPE_VOLUME_CHANNEL_RUN, "source", source, NULL); return(volume_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_route_dssi_audio_run.c0000644000175000017500000010377613616617253021170 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_route_dssi_audio_run_class_init(AgsRouteDssiAudioRunClass *route_dssi_audio_run); void ags_route_dssi_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_route_dssi_audio_run_init(AgsRouteDssiAudioRun *route_dssi_audio_run); void ags_route_dssi_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_route_dssi_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_route_dssi_audio_run_dispose(GObject *gobject); void ags_route_dssi_audio_run_finalize(GObject *gobject); void ags_route_dssi_audio_run_connect(AgsConnectable *connectable); void ags_route_dssi_audio_run_disconnect(AgsConnectable *connectable); void ags_route_dssi_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_route_dssi_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_route_dssi_audio_run_resolve_dependency(AgsRecall *recall); void ags_route_dssi_audio_run_run_post(AgsRecall *recall); void ags_route_dssi_audio_run_alloc_input_callback_feed_note(AgsRouteDssiAudioRun *route_dssi_audio_run, AgsNotation *notation, guint audio_start_mapping, guint audio_end_mapping, guint64 notation_counter); void ags_route_dssi_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsRouteDssiAudioRun *route_dssi_audio_run); void ags_route_dssi_audio_run_feed_midi(AgsRecall *recall, AgsNote *note); /** * SECTION:ags_route_dssi_audio_run * @short_description: route MIDI * @title: AgsRouteDssiAudioRun * @section_id: * @include: ags/audio/recall/ags_route_dssi_audio_run.h * * The #AgsRouteDssiAudioRun routes MIDI to DSSI recall. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, }; static gpointer ags_route_dssi_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_route_dssi_audio_run_parent_connectable_interface; GType ags_route_dssi_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_route_dssi_audio_run; static const GTypeInfo ags_route_dssi_audio_run_info = { sizeof (AgsRouteDssiAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_route_dssi_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRouteDssiAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_route_dssi_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_route_dssi_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_route_dssi_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsRouteDssiAudioRun", &ags_route_dssi_audio_run_info, 0); g_type_add_interface_static(ags_type_route_dssi_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave (&g_define_type_id__volatile, ags_type_route_dssi_audio_run); } return g_define_type_id__volatile; } void ags_route_dssi_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_route_dssi_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_route_dssi_audio_run_connect; connectable->disconnect = ags_route_dssi_audio_run_disconnect; connectable->connect_connection = ags_route_dssi_audio_run_connect_connection; connectable->disconnect_connection = ags_route_dssi_audio_run_disconnect_connection; } void ags_route_dssi_audio_run_class_init(AgsRouteDssiAudioRunClass *route_dssi_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_route_dssi_audio_run_parent_class = g_type_class_peek_parent(route_dssi_audio_run); /* GObjectClass */ gobject = (GObjectClass *) route_dssi_audio_run; gobject->set_property = ags_route_dssi_audio_run_set_property; gobject->get_property = ags_route_dssi_audio_run_get_property; gobject->dispose = ags_route_dssi_audio_run_dispose; gobject->finalize = ags_route_dssi_audio_run_finalize; /* properties */ /** * AgsRouteDssiAudioRun:delay-audio-run: * * The delay audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits notation_alloc_input signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsRouteDssiAudioRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which just counts"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) route_dssi_audio_run; recall->resolve_dependency = ags_route_dssi_audio_run_resolve_dependency; recall->run_post = ags_route_dssi_audio_run_run_post; } void ags_route_dssi_audio_run_init(AgsRouteDssiAudioRun *route_dssi_audio_run) { ags_recall_set_ability_flags((AgsRecall *) route_dssi_audio_run, (AGS_SOUND_ABILITY_NOTATION)); AGS_RECALL(route_dssi_audio_run)->name = "ags-route-dssi"; AGS_RECALL(route_dssi_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(route_dssi_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(route_dssi_audio_run)->xml_type = "ags-route-dssi-audio-run"; AGS_RECALL(route_dssi_audio_run)->port = NULL; route_dssi_audio_run->delay_audio_run = NULL; route_dssi_audio_run->count_beats_audio_run = NULL; route_dssi_audio_run->notation = NULL; route_dssi_audio_run->timestamp = ags_timestamp_new(); route_dssi_audio_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); route_dssi_audio_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; route_dssi_audio_run->timestamp->timer.ags_offset.offset = 0; route_dssi_audio_run->sequencer = NULL; route_dssi_audio_run->feed_midi = NULL; } void ags_route_dssi_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRouteDssiAudioRun *route_dssi_audio_run; GRecMutex *recall_mutex; route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_dssi_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(delay_audio_run == route_dssi_audio_run->delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(route_dssi_audio_run->delay_audio_run != NULL){ old_delay_audio_run = route_dssi_audio_run->delay_audio_run; g_object_unref(G_OBJECT(route_dssi_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(delay_audio_run); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) route_dssi_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(route_dssi_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(route_dssi_audio_run), recall_dependency); } }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(route_dssi_audio_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(route_dssi_audio_run), (GObject *) old_delay_audio_run); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); route_dssi_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(route_dssi_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(route_dssi_audio_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(route_dssi_audio_run), (GObject *) delay_audio_run); } } } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run == route_dssi_audio_run->count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if((AGS_RECALL_TEMPLATE & (AGS_RECALL(route_dssi_audio_run)->flags)) != 0){ is_template = TRUE; }else{ is_template = FALSE; } if(route_dssi_audio_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = route_dssi_audio_run->count_beats_audio_run; g_object_unref(G_OBJECT(route_dssi_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } route_dssi_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) route_dssi_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(route_dssi_audio_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(route_dssi_audio_run), recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(route_dssi_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_dssi_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRouteDssiAudioRun *route_dssi_audio_run; GRecMutex *recall_mutex; route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_dssi_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(route_dssi_audio_run->delay_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, route_dssi_audio_run->count_beats_audio_run); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_dssi_audio_run_dispose(GObject *gobject) { AgsRouteDssiAudioRun *route_dssi_audio_run; route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(gobject); /* delay audio run */ if(route_dssi_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(route_dssi_audio_run->delay_audio_run)); route_dssi_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(route_dssi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(route_dssi_audio_run->count_beats_audio_run)); route_dssi_audio_run->count_beats_audio_run = NULL; } /* feed midi */ g_list_free_full(route_dssi_audio_run->feed_midi, g_object_unref); route_dssi_audio_run->feed_midi = NULL; /* call parent */ G_OBJECT_CLASS(ags_route_dssi_audio_run_parent_class)->dispose(gobject); } void ags_route_dssi_audio_run_finalize(GObject *gobject) { AgsRouteDssiAudioRun *route_dssi_audio_run; route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(gobject); /* delay audio run */ if(route_dssi_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(route_dssi_audio_run->delay_audio_run)); } /* count beats audio run */ if(route_dssi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(route_dssi_audio_run->count_beats_audio_run)); } /* timestamp */ if(route_dssi_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(route_dssi_audio_run->timestamp)); } g_list_free_full(route_dssi_audio_run->feed_midi, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_route_dssi_audio_run_parent_class)->finalize(gobject); } void ags_route_dssi_audio_run_connect(AgsConnectable *connectable) { AgsRouteDssiAudioRun *route_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(ags_connectable_is_connected(connectable)){ return; } route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(connectable); g_object_get(route_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_route_dssi_audio_run_parent_connectable_interface->connect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_dssi_audio_run_disconnect(AgsConnectable *connectable) { AgsRouteDssiAudioRun *route_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(!ags_connectable_is_connected(connectable)){ return; } route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(connectable); g_object_get(route_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_route_dssi_audio_run_parent_connectable_interface->disconnect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_dssi_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsRouteDssiAudioRun *route_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(connectable); g_object_get(route_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_signal_connect(G_OBJECT(delay_audio_run), "notation-alloc-input", G_CALLBACK(ags_route_dssi_audio_run_alloc_input_callback), route_dssi_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_dssi_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsRouteDssiAudioRun *route_dssi_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(connectable); g_object_get(route_dssi_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_object_disconnect(G_OBJECT(delay_audio_run), "any_signal::notation-alloc-input", G_CALLBACK(ags_route_dssi_audio_run_alloc_input_callback), route_dssi_audio_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_route_dssi_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallID *recall_id; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); list = list_start; delay_audio_run = NULL; count_beats_audio_run = NULL; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); /* unref */ g_object_unref(recall_id); g_object_unref(recall_container); } void ags_route_dssi_audio_run_feed_midi(AgsRecall *recall, AgsNote *note) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *channel, *selected_channel, *nth_channel; AgsRecallDssiRun *recall_dssi_run; AgsRecallID *recall_id; AgsRecallID *child_recall_id; AgsRecyclingContext *recycling_context; AgsRecyclingContext *child_recycling_context; AgsDelayAudioRun *delay_audio_run; AgsRouteDssiAudioRun *route_dssi_audio_run; GList *start_generic_channel_recall, *generic_channel_recall; GList *start_generic_recycling_recall, *generic_recycling_recall; GList *start_dssi_run, *dssi_run; GList *start_list_recall, *list_recall; GList *start_list, *list; snd_seq_event_t *seq_event; gchar *str; guint audio_start_mapping; guint midi_start_mapping, midi_end_mapping; guint audio_channel; guint pads; guint output_pads, input_pads; guint selected_pad; guint start_frame, end_frame; guint note_y; GRecMutex *audio_mutex; route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(recall); audio = NULL; recall_id = NULL; recycling_context = NULL; delay_audio_run = NULL; g_object_get(route_dssi_audio_run, "audio", &audio, "audio-channel", &audio_channel, "recall-id", &recall_id, "delay-audio-run", &delay_audio_run, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio fields */ g_rec_mutex_lock(audio_mutex); audio_start_mapping = audio->audio_start_mapping; midi_start_mapping = audio->midi_start_mapping; midi_end_mapping = audio->midi_end_mapping; output_pads = audio->output_pads; input_pads = audio->input_pads; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* note */ g_object_get(note, "y", ¬e_y, NULL); /* get channel */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ selected_channel = ags_channel_nth(start_input, audio_channel); pads = input_pads; }else{ selected_channel = ags_channel_nth(start_output, audio_channel); pads = output_pads; } if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ nth_channel = ags_channel_pad_nth(selected_channel, audio_start_mapping + pads - note_y - 1); g_object_unref(selected_channel); selected_channel = nth_channel; }else{ nth_channel = ags_channel_pad_nth(selected_channel, audio_start_mapping + note_y); g_object_unref(selected_channel); selected_channel = nth_channel; } /* check within mapping */ g_object_get(selected_channel, "pad", &selected_pad, NULL); if(selected_pad - audio_start_mapping + midi_start_mapping < midi_start_mapping || selected_pad - audio_start_mapping + midi_start_mapping >= midi_end_mapping){ g_object_unref(audio); g_object_unref(recall_id); g_object_unref(delay_audio_run); g_object_unref(recycling_context); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(selected_channel != NULL){ g_object_unref(selected_channel); } return; } /* get recall id */ if(selected_channel != NULL){ g_object_get(selected_channel, "recall-id", &start_list, NULL); child_recall_id = NULL; list = start_list; while(list != NULL){ AgsRecyclingContext *parent_current_recycling_context, *current_recycling_context; if(AGS_RECALL_ID(list->data)->recycling_context->parent == recycling_context){ child_recall_id = (AgsRecallID *) list->data; break; } list = list->next; } g_list_free_full(start_list, g_object_unref); /* get dssi run */ if(child_recall_id != NULL){ g_object_get(child_recall_id, "recycling-context", &child_recycling_context, NULL); g_object_get(selected_channel, "recall", &start_list_recall, NULL); //FIXME:JK: use filename and effect to identify start_generic_channel_recall = NULL; list_recall = ags_recall_template_find_type(start_list_recall, AGS_TYPE_RECALL_DSSI); if(list_recall != NULL){ AgsRecallContainer *recall_container; g_object_get(list_recall->data, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-channel-run", &start_generic_channel_recall, NULL); g_object_unref(recall_container); } g_list_free_full(start_list_recall, g_object_unref); generic_channel_recall = start_generic_channel_recall; while(generic_channel_recall != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; g_object_get(generic_channel_recall->data, "recall-id", ¤t_recall_id, NULL); if(current_recall_id == NULL){ generic_channel_recall = generic_channel_recall->next; continue; } g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); if(current_recycling_context != child_recycling_context){ generic_channel_recall = generic_channel_recall->next; g_object_unref(current_recall_id); continue; } g_object_get(generic_channel_recall->data, "child", &start_generic_recycling_recall, NULL); generic_recycling_recall = start_generic_recycling_recall; while(generic_recycling_recall != NULL){ g_object_get(generic_recycling_recall->data, "child", &start_dssi_run, NULL); dssi_run = start_dssi_run; while(dssi_run != NULL){ recall_dssi_run = AGS_RECALL_DSSI_RUN(dssi_run->data); if(ags_recall_global_get_rt_safe() || recall_dssi_run->note == NULL){ /* prepend note */ // route_dssi_audio_run->feed_midi = g_list_prepend(route_dssi_audio_run->feed_midi, // note); g_object_set(recall_dssi_run, "route-dssi-audio-run", route_dssi_audio_run, NULL); /* key on */ seq_event = recall_dssi_run->event_buffer[0]; seq_event->type = SND_SEQ_EVENT_NOTEON; seq_event->data.note.channel = 0; seq_event->data.note.note = 0x7f & (selected_channel->pad - audio_start_mapping + midi_start_mapping); seq_event->data.note.velocity = 127; recall_dssi_run->event_count[0] = 1; g_object_set(recall_dssi_run, "audio-channel", audio_channel, NULL); recall_dssi_run->note = g_list_prepend(recall_dssi_run->note, (GObject *) note); g_object_ref(note); } //fixme:jk: remove notes dssi_run = dssi_run->next; } /* unref */ g_list_free_full(start_dssi_run, g_object_unref); generic_recycling_recall = generic_recycling_recall->next; } /* unref */ g_object_unref(current_recall_id); g_object_unref(current_recycling_context); g_list_free_full(start_generic_recycling_recall, g_object_unref); generic_channel_recall = generic_channel_recall->next; } g_object_unref(child_recycling_context); g_list_free_full(start_generic_channel_recall, g_object_unref); } } /* unref */ if(audio != NULL){ g_object_unref(audio); } if(recall_id != NULL){ g_object_unref(recall_id); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } if(recycling_context != NULL){ g_object_unref(recycling_context); } if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(selected_channel != NULL){ g_object_unref(selected_channel); } } void ags_route_dssi_audio_run_alloc_input_callback_feed_note(AgsRouteDssiAudioRun *route_dssi_audio_run, AgsNotation *notation, guint audio_start_mapping, guint audio_end_mapping, guint64 notation_counter) { AgsNote *current_note; GList *start_note, *note; GList *start_list, *list; guint note_y; guint note_x0; if(!AGS_IS_NOTATION(notation)){ return; } start_list = NULL; g_object_get(notation, "note", &start_note, NULL); note = start_note; while(note != NULL){ current_note = AGS_NOTE(note->data); g_object_get(current_note, "x0", ¬e_x0, "y", ¬e_y, NULL); #if 0 g_message("--- %f %f ; %d %d", current_note->stream_delay, delay, note_x0, route_dssi_audio_run->count_beats_audio_run->notation_counter); #endif //FIXME:JK: should consider delay if(note_y >= audio_start_mapping && note_y < audio_end_mapping && note_x0 == notation_counter){ // && floor(note->stream_delay) == floor(delay) start_list = g_list_prepend(start_list, current_note); g_object_ref(current_note); }else if(note_x0 > notation_counter){ break; } /* iterate */ note = note->next; } start_list = g_list_reverse(start_list); /* feed midi */ list = start_list; while(list != NULL){ ags_route_dssi_audio_run_feed_midi((AgsRecall *) route_dssi_audio_run, list->data); g_object_unref(list->data); list = list->next; } g_list_free_full(start_note, g_object_unref); g_list_free(start_list); } void ags_route_dssi_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsRouteDssiAudioRun *route_dssi_audio_run) { AgsAudio *audio; AgsNotation *notation; AgsCountBeatsAudioRun *count_beats_audio_run; AgsRouteDssiAudio *route_dssi_audio; AgsTimestamp *timestamp; GObject *output_soundcard; GList *start_list, *list; guint audio_channel; guint64 notation_counter; guint audio_start_mapping, audio_end_mapping; if((guint) floor(delay) != 0){ // g_message("d %f", delay); return; } audio = NULL; route_dssi_audio = NULL; count_beats_audio_run = NULL; g_object_get(route_dssi_audio_run, "audio", &audio, "audio-channel", &audio_channel, "recall-audio", &route_dssi_audio, "count-beats-audio-run", &count_beats_audio_run, NULL); /* feed note - first attempt */ g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); route_dssi_audio_run->timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(notation_counter / AGS_NOTATION_DEFAULT_OFFSET); g_object_get(audio, "audio-start-mapping", &audio_start_mapping, "audio-end-mapping", &audio_end_mapping, "notation", &start_list, NULL); notation = NULL; list = ags_notation_find_near_timestamp(start_list, audio_channel, route_dssi_audio_run->timestamp); if(list != NULL){ notation = list->data; } ags_route_dssi_audio_run_alloc_input_callback_feed_note(route_dssi_audio_run, notation, audio_start_mapping, audio_end_mapping, notation_counter); /* feed note - second attempt */ if(route_dssi_audio_run->timestamp->timer.ags_offset.offset != 0){ route_dssi_audio_run->timestamp->timer.ags_offset.offset -= AGS_NOTATION_DEFAULT_OFFSET; notation = NULL; list = ags_notation_find_near_timestamp(start_list, audio_channel, route_dssi_audio_run->timestamp); if(list != NULL){ notation = list->data; } ags_route_dssi_audio_run_alloc_input_callback_feed_note(route_dssi_audio_run, notation, audio_start_mapping, audio_end_mapping, notation_counter); } /* unref */ if(audio != NULL){ g_object_unref(audio); } if(route_dssi_audio != NULL){ g_object_unref(route_dssi_audio); } if(count_beats_audio_run != NULL){ g_object_unref(count_beats_audio_run); } g_list_free_full(start_list, g_object_unref); } void ags_route_dssi_audio_run_run_post(AgsRecall *recall) { AgsAudio *audio; AgsPort *port; AgsDelayAudio *delay_audio; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsRouteDssiAudioRun *route_dssi_audio_run; GObject *output_soundcard; gdouble bpm; guint64 notation_counter; gdouble notation_delay; guint buffer_size; gdouble x; GValue value = {0,}; route_dssi_audio_run = AGS_ROUTE_DSSI_AUDIO_RUN(recall); audio = NULL; output_soundcard = NULL; delay_audio = NULL; delay_audio_run = NULL; count_beats_audio_run = NULL; g_object_get(route_dssi_audio_run, "audio", &audio, "delay-audio-run", &delay_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); g_object_get(audio, "output-soundcard", &output_soundcard, NULL); g_object_get(delay_audio, "buffer-size", &buffer_size, "notation-delay", &port, NULL); g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); /* get notation delay */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(port, &value); notation_delay = g_value_get_double(&value); g_value_unset(&value); g_object_unref(port); /* get bpm */ g_object_get(delay_audio, "bpm", &port, NULL); g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(port, &value); bpm = g_value_get_double(&value); g_value_unset(&value); g_object_unref(port); /* */ x = (((notation_counter * notation_delay) + notation_counter) * buffer_size); route_dssi_audio_run->delta_time = x / 16.0 / bpm * 60.0 / ((AGS_USEC_PER_SEC * bpm / 4.0) / (4.0 * bpm) / AGS_USEC_PER_SEC); /* unref */ if(audio != NULL){ g_object_unref(audio); } if(count_beats_audio_run != NULL){ g_object_unref(count_beats_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } if(delay_audio != NULL){ g_object_unref(delay_audio); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } } /** * ags_route_dssi_audio_run_new: * @audio: the #AgsAudio * * Create a new instance of #AgsRouteDssiAudioRun * * Returns: the new #AgsRouteDssiAudioRun * * Since: 3.0.0 */ AgsRouteDssiAudioRun* ags_route_dssi_audio_run_new(AgsAudio *audio) { AgsRouteDssiAudioRun *route_dssi_audio_run; route_dssi_audio_run = (AgsRouteDssiAudioRun *) g_object_new(AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, "audio", audio, NULL); return(route_dssi_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_peak_channel_run.h0000644000175000017500000000412613607210263020217 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PEAK_CHANNEL_RUN_H__ #define __AGS_PEAK_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PEAK_CHANNEL_RUN (ags_peak_channel_run_get_type()) #define AGS_PEAK_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_PEAK_CHANNEL_RUN, AgsPeakChannelRun)) #define AGS_PEAK_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_INSTANCE_CAST(class, AGS_TYPE_PEAK_CHANNEL_RUN, AgsPeakChannelRunClass)) #define AGS_IS_PEAK_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PEAK_CHANNEL_RUN)) #define AGS_IS_PEAK_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PEAK_CHANNEL_RUN)) #define AGS_PEAK_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PEAK_CHANNEL_RUN, AgsPeakChannelRunClass)) typedef struct _AgsPeakChannelRun AgsPeakChannelRun; typedef struct _AgsPeakChannelRunClass AgsPeakChannelRunClass; struct _AgsPeakChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsPeakChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_peak_channel_run_get_type(); AgsPeakChannelRun* ags_peak_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PEAK_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_notation_audio_run.c0000644000175000017500000007410613616617253021662 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_play_notation_audio_run_class_init(AgsPlayNotationAudioRunClass *play_notation_audio_run); void ags_play_notation_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_play_notation_audio_run_init(AgsPlayNotationAudioRun *play_notation_audio_run); void ags_play_notation_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_notation_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_notation_audio_run_dispose(GObject *gobject); void ags_play_notation_audio_run_finalize(GObject *gobject); void ags_play_notation_audio_run_connect(AgsConnectable *connectable); void ags_play_notation_audio_run_disconnect(AgsConnectable *connectable); void ags_play_notation_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_notation_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_play_notation_audio_run_resolve_dependency(AgsRecall *recall); void ags_play_notation_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsPlayNotationAudioRun *play_notation_audio_run); /** * SECTION:ags_play_notation_audio_run * @short_description: play notation * @title: AgsPlayNotationAudioRun * @section_id: * @include: ags/audio/recall/ags_play_notation_audio_run.h * * The #AgsPlayNotationAudioRun class play notation. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, PROP_NOTATION, }; static gpointer ags_play_notation_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_play_notation_audio_run_parent_connectable_interface; GType ags_play_notation_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_notation_audio_run = 0; static const GTypeInfo ags_play_notation_audio_run_info = { sizeof (AgsPlayNotationAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_notation_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayNotationAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_notation_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_play_notation_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_notation_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsPlayNotationAudioRun", &ags_play_notation_audio_run_info, 0); g_type_add_interface_static(ags_type_play_notation_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_notation_audio_run); } return g_define_type_id__volatile; } void ags_play_notation_audio_run_class_init(AgsPlayNotationAudioRunClass *play_notation_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_notation_audio_run_parent_class = g_type_class_peek_parent(play_notation_audio_run); /* GObjectClass */ gobject = (GObjectClass *) play_notation_audio_run; gobject->set_property = ags_play_notation_audio_run_set_property; gobject->get_property = ags_play_notation_audio_run_get_property; gobject->dispose = ags_play_notation_audio_run_dispose; gobject->finalize = ags_play_notation_audio_run_finalize; /* properties */ /** * AgsPlayNotationAudioRun:delay-audio-run: * * The delay audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits notation_alloc_input signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsPlayNotationAudioRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which just counts"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /** * AgsPlayNotationAudioRun:notation: * * The notation containing the notes. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation", i18n_pspec("assigned AgsNotation"), i18n_pspec("The AgsNotation containing notes"), AGS_TYPE_NOTATION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) play_notation_audio_run; recall->resolve_dependency = ags_play_notation_audio_run_resolve_dependency; } void ags_play_notation_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_play_notation_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_play_notation_audio_run_connect; connectable->disconnect = ags_play_notation_audio_run_disconnect; connectable->connect_connection = ags_play_notation_audio_run_connect_connection; connectable->disconnect_connection = ags_play_notation_audio_run_disconnect_connection; } void ags_play_notation_audio_run_init(AgsPlayNotationAudioRun *play_notation_audio_run) { ags_recall_set_ability_flags((AgsRecall *) play_notation_audio_run, (AGS_SOUND_ABILITY_NOTATION)); AGS_RECALL(play_notation_audio_run)->name = "ags-play-notation"; AGS_RECALL(play_notation_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_notation_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_notation_audio_run)->xml_type = "ags-play-notation-audio-run"; AGS_RECALL(play_notation_audio_run)->port = NULL; play_notation_audio_run->delay_audio_run = NULL; play_notation_audio_run->count_beats_audio_run = NULL; play_notation_audio_run->notation = NULL; play_notation_audio_run->timestamp = ags_timestamp_new(); g_object_ref(play_notation_audio_run->timestamp); play_notation_audio_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); play_notation_audio_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; play_notation_audio_run->timestamp->timer.ags_offset.offset = 0; } void ags_play_notation_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayNotationAudioRun *play_notation_audio_run; GRecMutex *recall_mutex; play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_notation_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(delay_audio_run == play_notation_audio_run->delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(play_notation_audio_run->delay_audio_run != NULL){ old_delay_audio_run = play_notation_audio_run->delay_audio_run; g_object_unref(G_OBJECT(play_notation_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(delay_audio_run); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) play_notation_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_notation_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_notation_audio_run), recall_dependency); } }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_notation_audio_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(play_notation_audio_run), (GObject *) old_delay_audio_run); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); play_notation_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(play_notation_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(play_notation_audio_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(play_notation_audio_run), (GObject *) delay_audio_run); } } } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run == play_notation_audio_run->count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if((AGS_RECALL_TEMPLATE & (AGS_RECALL(play_notation_audio_run)->flags)) != 0){ is_template = TRUE; }else{ is_template = FALSE; } if(play_notation_audio_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = play_notation_audio_run->count_beats_audio_run; g_object_unref(G_OBJECT(play_notation_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } play_notation_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) play_notation_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(play_notation_audio_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(play_notation_audio_run), recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(play_notation_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_notation_audio_run->notation == notation){ g_rec_mutex_unlock(recall_mutex); return; } if(play_notation_audio_run->notation != NULL){ g_object_unref(play_notation_audio_run->notation); } if(notation != NULL){ g_object_ref(notation); } play_notation_audio_run->notation = notation; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_notation_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayNotationAudioRun *play_notation_audio_run; GRecMutex *recall_mutex; play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_notation_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_notation_audio_run->delay_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_notation_audio_run->count_beats_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_notation_audio_run->notation); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_notation_audio_run_dispose(GObject *gobject) { AgsPlayNotationAudioRun *play_notation_audio_run; play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(gobject); /* delay audio run */ if(play_notation_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->delay_audio_run)); play_notation_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(play_notation_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->count_beats_audio_run)); play_notation_audio_run->count_beats_audio_run = NULL; } /* notation */ if(play_notation_audio_run->notation != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->notation)); play_notation_audio_run->notation = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_notation_audio_run_parent_class)->dispose(gobject); } void ags_play_notation_audio_run_finalize(GObject *gobject) { AgsPlayNotationAudioRun *play_notation_audio_run; play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(gobject); /* delay audio run */ if(play_notation_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->delay_audio_run)); } /* count beats audio run */ if(play_notation_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->count_beats_audio_run)); } /* notation */ if(play_notation_audio_run->notation != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->notation)); } /* timestamp */ if(play_notation_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(play_notation_audio_run->timestamp)); } /* call parent */ G_OBJECT_CLASS(ags_play_notation_audio_run_parent_class)->finalize(gobject); } void ags_play_notation_audio_run_connect(AgsConnectable *connectable) { AgsPlayNotationAudioRun *play_notation_audio_run; AgsDelayAudioRun *delay_audio_run; if(ags_connectable_is_connected(connectable)){ return; } play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(connectable); g_object_get(play_notation_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_play_notation_audio_run_parent_connectable_interface->connect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_notation_audio_run_disconnect(AgsConnectable *connectable) { AgsPlayNotationAudioRun *play_notation_audio_run; AgsDelayAudioRun *delay_audio_run; if(!ags_connectable_is_connected(connectable)){ return; } play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(connectable); g_object_get(play_notation_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); /* call parent */ ags_play_notation_audio_run_parent_connectable_interface->disconnect(connectable); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_notation_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayNotationAudioRun *play_notation_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(connectable); g_object_get(play_notation_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_signal_connect(G_OBJECT(delay_audio_run), "notation-alloc-input", G_CALLBACK(ags_play_notation_audio_run_alloc_input_callback), play_notation_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_notation_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsPlayNotationAudioRun *play_notation_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } play_notation_audio_run = AGS_PLAY_NOTATION_AUDIO_RUN(connectable); g_object_get(play_notation_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(connection == (GObject *) delay_audio_run){ g_object_disconnect(G_OBJECT(delay_audio_run), "any_signal::notation-alloc-input", G_CALLBACK(ags_play_notation_audio_run_alloc_input_callback), play_notation_audio_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_play_notation_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallID *recall_id; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); list = list_start; delay_audio_run = NULL; count_beats_audio_run = NULL; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); /* unref */ g_object_unref(recall_id); g_object_unref(recall_container); } void ags_play_notation_audio_run_alloc_input_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsPlayNotationAudioRun *play_notation_audio_run) { AgsAudio *audio; AgsChannel *start_output, *start_input; AgsChannel *selected_channel, *channel, *next_pad; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling; AgsRecycling *end_recycling; AgsAudioSignal *audio_signal; AgsNotation *notation; AgsNote *note; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context; AgsPlayNotationAudio *play_notation_audio; AgsDelayAudio *delay_audio; AgsCountBeatsAudioRun *count_beats_audio_run; AgsTimestamp *timestamp; GObject *output_soundcard; GList *start_current_position, *current_position; GList *start_list, *list; gchar *str; guint audio_flags; guint pads; guint64 notation_counter; guint output_pads, input_pads; guint audio_channel; guint samplerate; guint i; GRecMutex *audio_mutex; GRecMutex *channel_mutex; GRecMutex *recycling_mutex; if(delay != 0.0){ // g_message("d %f", delay); return; } audio = NULL; g_object_get(play_notation_audio_run, "audio", &audio, NULL); g_object_get(audio, "notation", &start_list, NULL); if(start_list == NULL){ g_object_unref(audio); return; } /* get some fields */ recall_id = NULL; recycling_context = NULL; play_notation_audio = NULL; output_soundcard = NULL; delay_audio = NULL; delay_audio_run = NULL; count_beats_audio_run = NULL; g_object_get(play_notation_audio_run, "recall-id", &recall_id, "recall-audio", &play_notation_audio, "output-soundcard", &output_soundcard, "audio-channel", &audio_channel, "samplerate", &samplerate, "delay-audio-run", &delay_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); timestamp = play_notation_audio_run->timestamp; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); /* audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio channel */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; input_pads = audio->input_pads; output_pads = audio->output_pads; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)){ channel = ags_channel_nth(start_input, audio_channel); pads = input_pads; }else{ channel = ags_channel_nth(start_output, audio_channel); pads = output_pads; } /* play notation */ notation = NULL; g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); ags_timestamp_set_ags_offset(timestamp, AGS_NOTATION_DEFAULT_OFFSET * floor(notation_counter / AGS_NOTATION_DEFAULT_OFFSET)); list = ags_notation_find_near_timestamp(start_list, audio_channel, timestamp); if(list != NULL){ notation = list->data; } if(notation != NULL){ AgsPort *port; gdouble notation_delay; GValue value = {0,}; /* get notation delay */ g_object_get(delay_audio, "notation-delay", &port, NULL); g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(port, &value); notation_delay = g_value_get_double(&value); g_value_unset(&value); g_object_unref(port); /* */ start_current_position = ags_notation_find_offset(notation, notation_counter, FALSE); current_position = start_current_position; while(current_position != NULL){ AgsRecallID *child_recall_id; GList *start_list, *list; guint y; note = AGS_NOTE(current_position->data); g_object_get(note, "y", &y, NULL); if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING)){ selected_channel = ags_channel_pad_nth(channel, pads - y - 1); }else{ selected_channel = ags_channel_pad_nth(channel, y); } if(selected_channel == NULL){ current_position = current_position->next; continue; } /* get child recall id */ g_object_get(selected_channel, "recall-id", &start_list, NULL); list = start_list; child_recall_id = NULL; while(list != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context, *current_parent_recycling_context; g_object_get(list->data, "recycling-context", ¤t_recycling_context, NULL); g_object_get(current_recycling_context, "parent", ¤t_parent_recycling_context, NULL); if(current_parent_recycling_context == recycling_context){ child_recall_id = (AgsRecallID *) list->data; break; } /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); /* recycling */ g_object_get(selected_channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); recycling = first_recycling; g_object_ref(recycling); end_recycling = ags_recycling_next(last_recycling); g_object_set(note, "rt-attack", attack, NULL); #ifdef AGS_DEBUG g_message("playing[%u|%u]: %u | %u\n", audio_channel, selected_channel->pad, note->x[0], note->y); #endif next_recycling = NULL; while(recycling != end_recycling){ g_object_set(note, "rt-offset", 0, NULL); if(!ags_recall_global_get_rt_safe()){ /* create audio signal */ audio_signal = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) child_recall_id); g_object_set(audio_signal, "note", note, NULL); if(ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_PATTERN_MODE)){ ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, 0.0, 0); }else{ guint note_x0, note_x1; note_x0 = notation_counter; g_object_get(note, "x1", ¬e_x1, NULL); /* create audio signal with frame count */ ags_recycling_create_audio_signal_with_frame_count(recycling, audio_signal, (guint) (((gdouble) audio_signal->buffer_size * notation_delay) * (gdouble) (note_x1 - note_x0)), 0.0, 0); } audio_signal->stream_current = audio_signal->stream; ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); /* lock and add */ ags_recycling_add_audio_signal(recycling, audio_signal); //g_object_unref(audio_signal); }else{ GList *start_list, *list; g_object_get(recycling, "audio-signal", &start_list, NULL); audio_signal = NULL; list = ags_audio_signal_find_by_recall_id(start_list, (GObject *) child_recall_id); if(list != NULL){ audio_signal = list->data; g_object_set(audio_signal, "delay", notation_delay, "note", note, NULL); } g_list_free_full(start_list, g_object_unref); } /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* unref */ g_object_unref(selected_channel); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } /* iterate */ current_position = current_position->next; } g_list_free_full(start_current_position, g_object_unref); } /* unref */ if(audio != NULL){ g_object_unref(audio); } if(play_notation_audio != NULL){ g_object_unref(play_notation_audio); } if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(recall_id != NULL){ g_object_unref(recall_id); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } if(count_beats_audio_run != NULL){ g_object_unref(count_beats_audio_run); } g_list_free_full(start_list, g_object_unref); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(channel != NULL){ g_object_unref(channel); } } /** * ags_play_notation_audio_run_new: * @audio: the #AgsAudio * @delay_audio_run: the #AgsDelayAudioRun dependency * @count_beats_audio_run: the #AgsCountBeatsAudioRun dependency * * Create a new instance of #AgsPlayNotationAudioRun * * Returns: the new #AgsPlayNotationAudioRun * * Since: 3.0.0 */ AgsPlayNotationAudioRun* ags_play_notation_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsPlayNotationAudioRun *play_notation_audio_run; play_notation_audio_run = (AgsPlayNotationAudioRun *) g_object_new(AGS_TYPE_PLAY_NOTATION_AUDIO_RUN, "audio", audio, "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); return(play_notation_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_copy_audio_signal.h0000644000175000017500000000427013607210263020413 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_AUDIO_SIGNAL_H__ #define __AGS_COPY_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_AUDIO_SIGNAL (ags_copy_audio_signal_get_type()) #define AGS_COPY_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_AUDIO_SIGNAL, AgsCopyAudioSignal)) #define AGS_COPY_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_AUDIO_SIGNAL, AgsCopyAudioSignalClass)) #define AGS_IS_COPY_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_AUDIO_SIGNAL)) #define AGS_IS_COPY_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_AUDIO_SIGNAL)) #define AGS_COPY_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_AUDIO_SIGNAL, AgsCopyAudioSignalClass)) typedef struct _AgsCopyAudioSignal AgsCopyAudioSignal; typedef struct _AgsCopyAudioSignalClass AgsCopyAudioSignalClass; struct _AgsCopyAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsCopyAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_copy_audio_signal_get_type(); AgsCopyAudioSignal* ags_copy_audio_signal_new(AgsAudioSignal *destination, AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_COPY_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_notation_audio_run.h0000644000175000017500000000522113607210263021645 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_NOTATION_AUDIO_RUN_H__ #define __AGS_PLAY_NOTATION_AUDIO_RUN_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_NOTATION_AUDIO_RUN (ags_play_notation_audio_run_get_type()) #define AGS_PLAY_NOTATION_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_NOTATION_AUDIO_RUN, AgsPlayNotationAudioRun)) #define AGS_PLAY_NOTATION_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_NOTATION_AUDIO_RUN, AgsPlayNotationAudioRun)) #define AGS_IS_PLAY_NOTATION_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_NOTATION_AUDIO_RUN)) #define AGS_IS_PLAY_NOTATION_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_NOTATION_AUDIO_RUN)) #define AGS_PLAY_NOTATION_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_NOTATION_AUDIO_RUN, AgsPlayNotationAudioRunClass)) typedef struct _AgsPlayNotationAudioRun AgsPlayNotationAudioRun; typedef struct _AgsPlayNotationAudioRunClass AgsPlayNotationAudioRunClass; struct _AgsPlayNotationAudioRun { AgsRecallAudioRun recall_audio_run; guint flags; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsNotation *notation; AgsTimestamp *timestamp; }; struct _AgsPlayNotationAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_play_notation_audio_run_get_type(); AgsPlayNotationAudioRun* ags_play_notation_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run); G_END_DECLS #endif /*__AGS_PLAY_NOTATION_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_stream_channel_run.c0000644000175000017500000000763113607210263020571 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_stream_channel_run_class_init(AgsStreamChannelRunClass *stream_channel_run); void ags_stream_channel_run_init(AgsStreamChannelRun *stream_channel_run); void ags_stream_channel_run_finalize(GObject *gobject); /** * SECTION:ags_stream_channel_run * @short_description: streams channel * @title: AgsStreamChannelRun * @section_id: * @include: ags/audio/recall/ags_stream_channel_run.h * * The #AgsStreamChannelRun class streams the channel. */ static gpointer ags_stream_channel_run_parent_class = NULL; GType ags_stream_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_stream_channel_run = 0; static const GTypeInfo ags_stream_channel_run_info = { sizeof (AgsStreamChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_stream_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsStreamChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_stream_channel_run_init, }; ags_type_stream_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsStreamChannelRun", &ags_stream_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_stream_channel_run); } return g_define_type_id__volatile; } void ags_stream_channel_run_class_init(AgsStreamChannelRunClass *stream_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_stream_channel_run_parent_class = g_type_class_peek_parent(stream_channel_run); /* GObjectClass */ gobject = (GObjectClass *) stream_channel_run; gobject->finalize = ags_stream_channel_run_finalize; } void ags_stream_channel_run_init(AgsStreamChannelRun *stream_channel_run) { ags_recall_set_ability_flags((AgsRecall *) stream_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(stream_channel_run)->name = "ags-stream"; AGS_RECALL(stream_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(stream_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(stream_channel_run)->xml_type = "ags-stream-channel-run"; AGS_RECALL(stream_channel_run)->port = NULL; AGS_RECALL(stream_channel_run)->child_type = AGS_TYPE_STREAM_RECYCLING; } void ags_stream_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_stream_channel_run_parent_class)->finalize(gobject); } /** * ags_stream_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsStreamChannelRun * * Returns: the new #AgsStreamChannelRun * * Since: 3.0.0 */ AgsStreamChannelRun* ags_stream_channel_run_new(AgsChannel *source) { AgsStreamChannelRun *stream_channel_run; stream_channel_run = (AgsStreamChannelRun *) g_object_new(AGS_TYPE_STREAM_CHANNEL_RUN, "source", source, NULL); return(stream_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_copy_channel_run.h0000644000175000017500000000420513607210263020247 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_CHANNEL_RUN_H__ #define __AGS_COPY_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_CHANNEL_RUN (ags_copy_channel_run_get_type()) #define AGS_COPY_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_CHANNEL_RUN, AgsCopyChannelRun)) #define AGS_COPY_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_CHANNEL_RUN, AgsCopyChannelRunClass)) #define AGS_IS_COPY_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_COPY_CHANNEL_RUN)) #define AGS_IS_COPY_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_COPY_CHANNEL_RUN)) #define AGS_COPY_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_COPY_CHANNEL_RUN, AgsCopyChannelRunClass)) typedef struct _AgsCopyChannelRun AgsCopyChannelRun; typedef struct _AgsCopyChannelRunClass AgsCopyChannelRunClass; struct _AgsCopyChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsCopyChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_copy_channel_run_get_type(); AgsCopyChannelRun* ags_copy_channel_run_new(AgsChannel *destination, AgsChannel *source); G_END_DECLS #endif /*__AGS_COPY_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_audio_signal.c0000644000175000017500000001244313607210263021071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_analyse_audio_signal_class_init(AgsAnalyseAudioSignalClass *analyse_audio_signal); void ags_analyse_audio_signal_init(AgsAnalyseAudioSignal *analyse_audio_signal); void ags_analyse_audio_signal_finalize(GObject *gobject); void ags_analyse_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_analyse_audio_signal * @short_description: analyses audio signal * @title: AgsAnalyseAudioSignal * @section_id: * @include: ags/audio/recall/ags_analyse_audio_signal.h * * The #AgsAnalyseAudioSignal class analyses the audio signal. */ static gpointer ags_analyse_audio_signal_parent_class = NULL; GType ags_analyse_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_analyse_audio_signal = 0; static const GTypeInfo ags_analyse_audio_signal_info = { sizeof (AgsAnalyseAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_analyse_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAnalyseAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_analyse_audio_signal_init, }; ags_type_analyse_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsAnalyseAudioSignal", &ags_analyse_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_analyse_audio_signal); } return g_define_type_id__volatile; } void ags_analyse_audio_signal_class_init(AgsAnalyseAudioSignalClass *analyse_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_analyse_audio_signal_parent_class = g_type_class_peek_parent(analyse_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) analyse_audio_signal; gobject->finalize = ags_analyse_audio_signal_finalize; /* properties */ /* AgsRecallClass */ recall = (AgsRecallClass *) analyse_audio_signal; recall->run_inter = ags_analyse_audio_signal_run_inter; } void ags_analyse_audio_signal_init(AgsAnalyseAudioSignal *analyse_audio_signal) { AGS_RECALL(analyse_audio_signal)->child_type = G_TYPE_NONE; } void ags_analyse_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_analyse_audio_signal_parent_class)->finalize(gobject); } void ags_analyse_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsAnalyseAudioSignal *analyse_audio_signal; void (*parent_class_run_inter)(AgsRecall *recall); analyse_audio_signal = AGS_ANALYSE_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_analyse_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); /* get some fields */ g_object_get(analyse_audio_signal, "source", &source, NULL); if(source->stream_current != NULL){ AgsAnalyseChannel *analyse_channel; AgsAnalyseChannelRun *analyse_channel_run; AgsAnalyseRecycling *analyse_recycling; guint samplerate; guint buffer_size; guint format; g_object_get(analyse_audio_signal, "parent", &analyse_recycling, NULL); g_object_get(analyse_recycling, "parent", &analyse_channel_run, NULL); g_object_get(analyse_channel_run, "recall-channel", &analyse_channel, NULL); g_object_get(source, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); ags_analyse_channel_buffer_add(analyse_channel, source->stream_current->data, samplerate, buffer_size, format); g_object_unref(analyse_recycling); g_object_unref(analyse_channel); g_object_unref(analyse_channel_run); }else{ ags_recall_done(recall); } g_object_unref(source); } /** * ags_analyse_audio_signal_new: * @source: the source #AgsAudioSignal * * Create a new instance of #AgsAnalyseAudioSignal * * Returns: the new #AgsAnalyseAudioSignal * * Since: 3.0.0 */ AgsAnalyseAudioSignal* ags_analyse_audio_signal_new(AgsAudioSignal *source) { AgsAnalyseAudioSignal *analyse_audio_signal; analyse_audio_signal = (AgsAnalyseAudioSignal *) g_object_new(AGS_TYPE_ANALYSE_AUDIO_SIGNAL, "source", source, NULL); return(analyse_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_copy_audio_signal.c0000644000175000017500000003633213607210263020412 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_copy_audio_signal_class_init(AgsCopyAudioSignalClass *copy_audio_signal); void ags_copy_audio_signal_init(AgsCopyAudioSignal *copy_audio_signal); void ags_copy_audio_signal_finalize(GObject *gobject); void ags_copy_audio_signal_run_init_pre(AgsRecall *recall); void ags_copy_audio_signal_run_pre(AgsRecall *recall); void ags_copy_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_copy_audio_signal * @short_description: copy audio signal * @title: AgsCopyAudioSignal * @section_id: * @include: ags/audio/recall/ags_copy_audio_signal.h * * The #AgsCopyAudioSignal class copies the audio signal. */ static gpointer ags_copy_audio_signal_parent_class = NULL; GType ags_copy_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_audio_signal = 0; static const GTypeInfo ags_copy_audio_signal_info = { sizeof(AgsCopyAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCopyAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_audio_signal_init, }; ags_type_copy_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsCopyAudioSignal", &ags_copy_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_audio_signal); } return g_define_type_id__volatile; } void ags_copy_audio_signal_class_init(AgsCopyAudioSignalClass *copy_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_copy_audio_signal_parent_class = g_type_class_peek_parent(copy_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) copy_audio_signal; gobject->finalize = ags_copy_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) copy_audio_signal; recall->run_init_pre = ags_copy_audio_signal_run_init_pre; recall->run_pre = ags_copy_audio_signal_run_pre; recall->run_inter = ags_copy_audio_signal_run_inter; } void ags_copy_audio_signal_init(AgsCopyAudioSignal *copy_audio_signal) { AGS_RECALL(copy_audio_signal)->name = "ags-copy"; AGS_RECALL(copy_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_audio_signal)->xml_type = "ags-copy-audio-signal"; AGS_RECALL(copy_audio_signal)->port = NULL; AGS_RECALL(copy_audio_signal)->child_type = G_TYPE_NONE; } void ags_copy_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_copy_audio_signal_parent_class)->finalize(gobject); } void ags_copy_audio_signal_run_init_pre(AgsRecall *recall) { AgsChannel *destination_channel; AgsRecycling *destination_recycling; AgsAudioSignal *destination; AgsRecallID *parent_recall_id; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context; AgsRecyclingContext *recycling_context; AgsCopyChannelRun *copy_channel_run; AgsCopyRecycling *copy_recycling; AgsCopyAudioSignal *copy_audio_signal; GObject *output_soundcard; GList *list_start, *list; GList *stream; gdouble delay; guint attack; guint length; void (*parent_class_run_init_pre)(AgsRecall *recall); copy_audio_signal = AGS_COPY_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_copy_audio_signal_parent_class)->run_init_pre; /* set flags */ ags_recall_unset_behaviour_flags(recall, AGS_SOUND_BEHAVIOUR_PERSISTENT); /* get some fields */ g_object_get(copy_audio_signal, "parent", ©_recycling, "output-soundcard", &output_soundcard, "recall-id", &recall_id, NULL); g_object_get(copy_recycling, "parent", ©_channel_run, NULL); /* channel */ g_object_get(copy_channel_run, "destination", &destination_channel, NULL); /* recycling */ g_object_get(copy_recycling, "destination", &destination_recycling, NULL); /* get recycling context */ g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(destination_channel, "recall-id", &list_start, NULL); parent_recall_id = ags_recall_id_find_recycling_context(list_start, parent_recycling_context); g_list_free_full(list_start, g_object_unref); //TODO:JK: unclear attack = 0; delay = 0.0; /* create new audio signal */ destination = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) destination_recycling, (GObject *) parent_recall_id); g_object_set(copy_audio_signal, "destination", destination, NULL); ags_recycling_create_audio_signal_with_defaults(destination_recycling, destination, delay, attack); length = 1; // (guint) (2.0 * soundcard->delay[soundcard->tic_counter]) + 1; ags_audio_signal_stream_resize(destination, length); ags_connectable_connect(AGS_CONNECTABLE(destination)); destination->stream_current = destination->stream; ags_recycling_add_audio_signal(destination_recycling, destination); #ifdef AGS_DEBUG g_message("copy %x to %x", destination, parent_recall_id); g_message("creating destination"); #endif /* call parent */ parent_class_run_init_pre(recall); /* unref */ g_object_unref(copy_recycling); g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(copy_channel_run); g_object_unref(destination_channel); g_object_unref(destination_recycling); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); } void ags_copy_audio_signal_run_pre(AgsRecall *recall) { AgsAudioSignal *source; AgsCopyAudioSignal *copy_audio_signal; void *buffer; guint buffer_size; guint format; void (*parent_class_run_pre)(AgsRecall *recall); copy_audio_signal = AGS_COPY_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_copy_audio_signal_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); g_object_get(recall, "source", &source, NULL); if(source->stream != NULL){ AgsAudioSignal *destination; g_object_get(recall, "destination", &destination, NULL); buffer = destination->stream->data; g_object_get(destination, "buffer-size", &buffer_size, "format", &format, NULL); ags_audio_buffer_util_clear_buffer(buffer, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); } g_object_unref(source); } void ags_copy_audio_signal_run_inter(AgsRecall *recall) { AgsRecycling *destination_recycling, *source_recycling; AgsAudioSignal *destination, *source; AgsPort *port; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context; AgsRecyclingContext *recycling_context; AgsCopyChannel *copy_channel; AgsCopyChannelRun *copy_channel_run; AgsCopyRecycling *copy_recycling; AgsCopyAudioSignal *copy_audio_signal; GList *note_start; GList *stream_source, *stream_destination; void *buffer_source; gchar *str; guint destination_buffer_size, source_buffer_size; guint destination_samplerate, source_samplerate; guint destination_format, source_format; guint attack; guint copy_mode; gboolean is_muted; gboolean resample; GValue value = {0,}; void (*parent_class_run_inter)(AgsRecall *recall); copy_audio_signal = AGS_COPY_AUDIO_SIGNAL(recall); /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_copy_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); /* get source and recall id */ g_object_get(recall, "source", &source, "recall-id", &recall_id, NULL); /* get recycling context and its parent */ g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get notes */ g_object_get(source, "note", ¬e_start, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && note_start == NULL){ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } g_list_free_full(note_start, g_object_unref); /* get destination */ g_object_get(recall, "destination", &destination, NULL); /* get stream */ stream_source = source->stream; if(stream_source == NULL){ g_object_get(source, "recycling", &source_recycling, NULL); if(destination != NULL){ g_object_get(destination, "recycling", &destination_recycling, NULL); ags_recycling_remove_audio_signal(destination_recycling, destination); g_object_run_dispose((GObject *) destination); g_object_unref((GObject *) destination); g_object_unref(destination_recycling); } ags_recall_done(recall); ags_recycling_remove_audio_signal(source_recycling, source); g_object_unref(source); g_object_unref(source_recycling); /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } if(destination == NULL){ g_warning("no destination"); /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } /* get related recalls */ g_object_get(recall, "parent", ©_recycling, NULL); g_object_get(copy_recycling, "parent", ©_channel_run, NULL); g_object_get(copy_channel_run, "recall-channel", ©_channel, NULL); /* check muted */ g_object_get(copy_channel, "muted", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); is_muted = (g_value_get_float(&value) == 0.0) ? TRUE: FALSE; g_value_unset(&value); g_object_unref(port); if(is_muted){ goto ags_copy_audio_signal_run_inter_END; } stream_destination = destination->stream; if(!ags_recall_global_get_rt_safe() && stream_destination->next == NULL){ ags_audio_signal_add_stream(destination); } g_object_get(destination, "buffer-size", &destination_buffer_size, "samplerate", &destination_samplerate, "format", &destination_format, NULL); g_object_get(source, "buffer-size", &source_buffer_size, "attack", &attack, "samplerate", &source_samplerate, "format", &source_format, NULL); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(destination_format), ags_audio_buffer_util_format_from_soundcard(source_format)); resample = FALSE; /* check if resample */ buffer_source = stream_source->data; attack = (destination_samplerate / source_samplerate) * attack; if(source_samplerate != destination_samplerate){ void *tmp_buffer_source; tmp_buffer_source = ags_stream_alloc(destination_buffer_size, source_format); ags_audio_buffer_util_resample_with_buffer(buffer_source, 1, ags_audio_buffer_util_format_from_soundcard(source_format), source_samplerate, source_buffer_size, destination_samplerate, destination_buffer_size, tmp_buffer_source); buffer_source = tmp_buffer_source; resample = TRUE; } if(ags_recall_test_flags(recall, AGS_RECALL_INITIAL_RUN)){ ags_audio_buffer_util_copy_buffer_to_buffer(stream_destination->data, 1, attack, buffer_source, 1, 0, destination_buffer_size - attack, copy_mode); ags_recall_unset_flags(recall, AGS_RECALL_INITIAL_RUN); }else{ if(attack != 0 && stream_source->prev != NULL){ void *buffer_source_prev; buffer_source_prev = stream_source->prev->data; if(resample){ void *tmp_buffer_source_prev; tmp_buffer_source_prev = ags_stream_alloc(destination_buffer_size, source_format); ags_audio_buffer_util_resample_with_buffer(buffer_source_prev, 1, ags_audio_buffer_util_format_from_soundcard(source_format), source_samplerate, source_buffer_size, destination_samplerate, destination_buffer_size, tmp_buffer_source_prev); buffer_source_prev = tmp_buffer_source_prev; } ags_audio_buffer_util_copy_buffer_to_buffer(stream_destination->data, 1, 0, buffer_source_prev, 1, destination_buffer_size - attack, attack, copy_mode); if(resample){ free(buffer_source_prev); } } ags_audio_buffer_util_copy_buffer_to_buffer(stream_destination->data, 1, source->attack, buffer_source, 1, 0, destination_buffer_size - attack, copy_mode); } if(resample){ free(buffer_source); } ags_copy_audio_signal_run_inter_END: /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); g_object_unref(destination); } /** * ags_copy_audio_signal_new: * @destination: the destination #AgsAudioSignal * @source: the source #AgsAudioSignal * * Create a new instance of #AgsCopyAudioSignal * * Returns: the new #AgsCopyAudioSignal * * Since: 3.0.0 */ AgsCopyAudioSignal* ags_copy_audio_signal_new(AgsAudioSignal *destination, AgsAudioSignal *source) { AgsCopyAudioSignal *copy_audio_signal; copy_audio_signal = (AgsCopyAudioSignal *) g_object_new(AGS_TYPE_COPY_AUDIO_SIGNAL, "destination", destination, "source", source, NULL); return(copy_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_peak_audio_signal.c0000644000175000017500000001640013607210263020352 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_peak_audio_signal_class_init(AgsPeakAudioSignalClass *peak_audio_signal); void ags_peak_audio_signal_init(AgsPeakAudioSignal *peak_audio_signal); void ags_peak_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_peak_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_peak_audio_signal_finalize(GObject *gobject); void ags_peak_audio_signal_run_inter(AgsRecall *recall); AgsRecall* ags_peak_audio_signal_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, GParameter *parameter); /** * SECTION:ags_peak_audio_signal * @short_description: peaks audio signal * @title: AgsPeakAudioSignal * @section_id: * @include: ags/audio/recall/ags_peak_audio_signal.h * * The #AgsPeakAudioSignal class peaks the audio signal. */ enum{ PROP_0, PROP_PEAK, }; static gpointer ags_peak_audio_signal_parent_class = NULL; GType ags_peak_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_peak_audio_signal = 0; static const GTypeInfo ags_peak_audio_signal_info = { sizeof (AgsPeakAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_peak_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPeakAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_peak_audio_signal_init, }; ags_type_peak_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsPeakAudioSignal", &ags_peak_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_peak_audio_signal); } return g_define_type_id__volatile; } void ags_peak_audio_signal_class_init(AgsPeakAudioSignalClass *peak_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_peak_audio_signal_parent_class = g_type_class_peek_parent(peak_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) peak_audio_signal; gobject->set_property = ags_peak_audio_signal_set_property; gobject->get_property = ags_peak_audio_signal_get_property; gobject->finalize = ags_peak_audio_signal_finalize; /* properties */ /** * AgsPeakAudioSignal:peak: * * The peak. * * Since: 3.0.0 */ param_spec = g_param_spec_double("peak", i18n_pspec("resulting peak"), i18n_pspec("The peak resulted"), 0.0, 1.0, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PEAK, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) peak_audio_signal; recall->run_inter = ags_peak_audio_signal_run_inter; } void ags_peak_audio_signal_init(AgsPeakAudioSignal *peak_audio_signal) { AGS_RECALL(peak_audio_signal)->child_type = G_TYPE_NONE; peak_audio_signal->peak = 0.0; } void ags_peak_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPeakAudioSignal *peak_audio_signal; GRecMutex *recall_mutex; peak_audio_signal = AGS_PEAK_AUDIO_SIGNAL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(peak_audio_signal); switch(prop_id){ case PROP_PEAK: { gdouble peak; peak = g_value_get_double(value); g_rec_mutex_lock(recall_mutex); peak_audio_signal->peak = peak; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_peak_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPeakAudioSignal *peak_audio_signal; GRecMutex *recall_mutex; peak_audio_signal = AGS_PEAK_AUDIO_SIGNAL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(peak_audio_signal); switch(prop_id){ case PROP_PEAK: { g_rec_mutex_lock(recall_mutex); g_value_set_double(value, peak_audio_signal->peak); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_peak_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_peak_audio_signal_parent_class)->finalize(gobject); } void ags_peak_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsPeakChannel *peak_channel; AgsPeakChannelRun *peak_channel_run; AgsPeakRecycling *peak_recycling; AgsPeakAudioSignal *peak_audio_signal; guint samplerate; guint buffer_size; guint format; void (*parent_class_run_inter)(AgsRecall *recall); peak_audio_signal = (AgsPeakAudioSignal *) recall; /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_peak_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); /* get some fields */ g_object_get(peak_audio_signal, "source", &source, NULL); if(source->stream_current != NULL){ g_object_get(peak_audio_signal, "parent", &peak_recycling, NULL); g_object_get(peak_recycling, "parent", &peak_channel_run, NULL); g_object_get(peak_channel_run, "recall-channel", &peak_channel, NULL); g_object_get(source, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); ags_peak_channel_buffer_add(peak_channel, source->stream_current->data, samplerate, buffer_size, format); g_object_unref(peak_recycling); g_object_unref(peak_channel_run); g_object_unref(peak_channel); }else{ ags_recall_done(recall); } g_object_unref(source); } /** * ags_peak_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsPeakAudioSignal * * Returns: the new #AgsPeakAudioSignal * * Since: 3.0.0 */ AgsPeakAudioSignal* ags_peak_audio_signal_new(AgsAudioSignal *source) { AgsPeakAudioSignal *peak_audio_signal; peak_audio_signal = (AgsPeakAudioSignal *) g_object_new(AGS_TYPE_PEAK_AUDIO_SIGNAL, "source", source, NULL); return(peak_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_buffer_channel.c0000644000175000017500000002315613607210263017663 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_buffer_channel_class_init(AgsBufferChannelClass *buffer_channel); void ags_buffer_channel_mutable_interface_init(AgsMutableInterface *mutable); void ags_buffer_channel_init(AgsBufferChannel *buffer_channel); void ags_buffer_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_buffer_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_buffer_channel_dispose(GObject *gobject); void ags_buffer_channel_finalize(GObject *gobject); void ags_buffer_channel_set_muted(AgsMutable *mutable, gboolean muted); static AgsPluginPort* ags_buffer_channel_get_muted_plugin_port(); /** * SECTION:ags_buffer_channel * @short_description: buffers channel * @title: AgsBufferChannel * @section_id: * @include: ags/audio/recall/ags_buffer_channel.h * * The #AgsBufferChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_MUTED, }; static gpointer ags_buffer_channel_parent_class = NULL; static AgsMutableInterface *ags_buffer_channel_parent_mutable_interface; static const gchar *ags_buffer_channel_plugin_name = "ags-buffer"; static const gchar *ags_buffer_channel_plugin_specifier[] = { "./muted[0]", }; static const gchar *ags_buffer_channel_plugin_control_port[] = { "1/1", }; GType ags_buffer_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_buffer_channel = 0; static const GTypeInfo ags_buffer_channel_info = { sizeof (AgsBufferChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_buffer_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsBufferChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_buffer_channel_init, }; static const GInterfaceInfo ags_mutable_interface_info = { (GInterfaceInitFunc) ags_buffer_channel_mutable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_buffer_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsBufferChannel", &ags_buffer_channel_info, 0); g_type_add_interface_static(ags_type_buffer_channel, AGS_TYPE_MUTABLE, &ags_mutable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_buffer_channel); } return g_define_type_id__volatile; } void ags_buffer_channel_mutable_interface_init(AgsMutableInterface *mutable) { ags_buffer_channel_parent_mutable_interface = g_type_interface_peek_parent(mutable); mutable->set_muted = ags_buffer_channel_set_muted; } void ags_buffer_channel_class_init(AgsBufferChannelClass *buffer_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_buffer_channel_parent_class = g_type_class_peek_parent(buffer_channel); /* GObjectClass */ gobject = (GObjectClass *) buffer_channel; gobject->set_property = ags_buffer_channel_set_property; gobject->get_property = ags_buffer_channel_get_property; gobject->dispose = ags_buffer_channel_dispose; gobject->finalize = ags_buffer_channel_finalize; /* properties */ /** * AgsBufferChannel:muted: * * The mute port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("muted", i18n_pspec("mute channel"), i18n_pspec("Mute the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); } void ags_buffer_channel_init(AgsBufferChannel *buffer_channel) { GList *port; AGS_RECALL(buffer_channel)->name = "ags-buffer"; AGS_RECALL(buffer_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(buffer_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(buffer_channel)->xml_type = "ags-buffer-channel"; port = NULL; buffer_channel->muted = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_buffer_channel_plugin_name, "specifier", ags_buffer_channel_plugin_specifier[0], "control-port", ags_buffer_channel_plugin_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(buffer_channel->muted); buffer_channel->muted->port_value.ags_port_float = (float) FALSE; /* plugin port */ g_object_set(buffer_channel->muted, "plugin-port", ags_buffer_channel_get_muted_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, buffer_channel->muted); g_object_ref(buffer_channel->muted); /* set port */ AGS_RECALL(buffer_channel)->port = port; } void ags_buffer_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsBufferChannel *buffer_channel; GRecMutex *recall_mutex; buffer_channel = AGS_BUFFER_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(buffer_channel); switch(prop_id){ case PROP_MUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == buffer_channel->muted){ g_rec_mutex_unlock(recall_mutex); return; } if(buffer_channel->muted != NULL){ g_object_unref(G_OBJECT(buffer_channel->muted)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } buffer_channel->muted = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_buffer_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsBufferChannel *buffer_channel; GRecMutex *recall_mutex; buffer_channel = AGS_BUFFER_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(buffer_channel); switch(prop_id){ case PROP_MUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, buffer_channel->muted); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_buffer_channel_dispose(GObject *gobject) { AgsBufferChannel *buffer_channel; buffer_channel = AGS_BUFFER_CHANNEL(gobject); if(buffer_channel->muted != NULL){ g_object_unref(G_OBJECT(buffer_channel->muted)); buffer_channel->muted = NULL; } /* call parent */ G_OBJECT_CLASS(ags_buffer_channel_parent_class)->dispose(gobject); } void ags_buffer_channel_finalize(GObject *gobject) { AgsBufferChannel *buffer_channel; buffer_channel = AGS_BUFFER_CHANNEL(gobject); if(buffer_channel->muted != NULL){ g_object_unref(G_OBJECT(buffer_channel->muted)); } /* call parent */ G_OBJECT_CLASS(ags_buffer_channel_parent_class)->finalize(gobject); } void ags_buffer_channel_set_muted(AgsMutable *mutable, gboolean is_muted) { AgsPort *muted; GValue value = {0,}; g_object_get(G_OBJECT(mutable), "muted", &muted, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (float) is_muted); ags_port_safe_write(muted, &value); g_value_unset(&value); g_object_unref(muted); } static AgsPluginPort* ags_buffer_channel_get_muted_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_TOGGLED); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_buffer_channel_new: * @destination: the destination #AgsChannel * @source: the source #AgsChannel * * Create a new instance of #AgsBufferChannel * * Returns: the new #AgsBufferChannel * * Since: 3.0.0 */ AgsBufferChannel* ags_buffer_channel_new(AgsChannel *destination, AgsChannel *source) { AgsBufferChannel *buffer_channel; buffer_channel = (AgsBufferChannel *) g_object_new(AGS_TYPE_BUFFER_CHANNEL, "destination", destination, "source", source, NULL); return(buffer_channel); } gsequencer-3.1.3/ags/audio/recall/ags_peak_channel_run.c0000644000175000017500000001334013607210263020210 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_peak_channel_run_class_init(AgsPeakChannelRunClass *peak_channel_run); void ags_peak_channel_run_init(AgsPeakChannelRun *peak_channel_run); void ags_peak_channel_run_finalize(GObject *gobject); void ags_peak_channel_run_run_pre(AgsRecall *recall); /** * SECTION:ags_peak_channel_run * @short_description: peak * @title: AgsPeakChannelRun * @section_id: * @include: ags/audio/recall/ags_peak_channel_run.h * * The #AgsPeakChannelRun class peaks the channel. */ static gpointer ags_peak_channel_run_parent_class = NULL; GType ags_peak_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_peak_channel_run = 0; static const GTypeInfo ags_peak_channel_run_info = { sizeof (AgsPeakChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_peak_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPeakChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_peak_channel_run_init, }; ags_type_peak_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsPeakChannelRun", &ags_peak_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_peak_channel_run); } return g_define_type_id__volatile; } void ags_peak_channel_run_class_init(AgsPeakChannelRunClass *peak_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_peak_channel_run_parent_class = g_type_class_peek_parent(peak_channel_run); /* GObjectClass */ gobject = (GObjectClass *) peak_channel_run; gobject->finalize = ags_peak_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) peak_channel_run; recall->run_pre = ags_peak_channel_run_run_pre; } void ags_peak_channel_run_init(AgsPeakChannelRun *peak_channel_run) { ags_recall_set_ability_flags((AgsRecall *) peak_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(peak_channel_run)->name = "ags-peak"; AGS_RECALL(peak_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(peak_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(peak_channel_run)->xml_type = "ags-peak-channel-run"; AGS_RECALL(peak_channel_run)->port = NULL; AGS_RECALL(peak_channel_run)->child_type = AGS_TYPE_PEAK_RECYCLING; } void ags_peak_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_peak_channel_run_parent_class)->finalize(gobject); } void ags_peak_channel_run_run_pre(AgsRecall *recall) { AgsPort *buffer_computed; AgsPeakChannel *peak_channel; guint buffer_size; guint format; gboolean current_buffer_computed; GValue value = {0,}; void (*parent_class_run_pre)(AgsRecall *recall); GRecMutex *buffer_mutex; g_object_get(recall, "recall-channel", &peak_channel, NULL); /* get mutex */ buffer_mutex = &(peak_channel->buffer_mutex); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_peak_channel_run_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); /* calculate of previous run */ g_object_get(peak_channel, "buffer-size", &buffer_size, "format", &format, "buffer-computed", &buffer_computed, NULL); g_rec_mutex_lock(buffer_mutex); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(buffer_computed, &value); current_buffer_computed = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(buffer_computed); if(!current_buffer_computed){ /* set buffer-computed port to TRUE */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, TRUE); ags_port_safe_write(buffer_computed, &value); g_value_unset(&value); } g_rec_mutex_unlock(buffer_mutex); /* lock free - buffer-computed reset by cyclic-task AgsResetPeak */ if(!current_buffer_computed){ /* retrieve peak */ ags_peak_channel_retrieve_peak_internal(peak_channel); /* clear buffer */ ags_audio_buffer_util_clear_buffer(peak_channel->buffer, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); } g_object_unref(peak_channel); } /** * ags_peak_channel_run_new: * @source: the #AgsChannel * * Creates a new instance of #AgsPeakChannelRun * * Returns: the new #AgsPeakChannelRun * * Since: 3.0.0 */ AgsPeakChannelRun* ags_peak_channel_run_new(AgsChannel *source) { AgsPeakChannelRun *peak_channel_run; peak_channel_run = (AgsPeakChannelRun *) g_object_new(AGS_TYPE_PEAK_CHANNEL_RUN, "source", source, NULL); return(peak_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_play_wave_channel_run.c0000644000175000017500000004460213607210263021264 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_play_wave_channel_run_class_init(AgsPlayWaveChannelRunClass *play_wave_channel_run); void ags_play_wave_channel_run_seekable_interface_init(AgsSeekableInterface *seekable); void ags_play_wave_channel_run_init(AgsPlayWaveChannelRun *play_wave_channel_run); void ags_play_wave_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_wave_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_wave_channel_run_dispose(GObject *gobject); void ags_play_wave_channel_run_finalize(GObject *gobject); void ags_play_wave_channel_run_seek(AgsSeekable *seekable, gint64 offset, guint whence); void ags_play_wave_channel_run_run_inter_add_audio_signal(AgsPlayWaveChannelRun *play_wave_channel_run, AgsChannel *channel, GObject *output_soundcard, AgsRecallID *recall_id, guint samplerate, guint buffer_size, guint format); void ags_play_wave_channel_run_run_inter(AgsRecall *recall); /** * SECTION:ags_play_wave_channel_run * @short_description: play wave * @title: AgsPlayWaveChannelRun * @section_id: * @include: ags/channel/recall/ags_play_wave_channel_run.h * * The #AgsPlayWaveChannelRun class play wave. */ enum{ PROP_0, PROP_X_OFFSET, }; static gpointer ags_play_wave_channel_run_parent_class = NULL; GType ags_play_wave_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_wave_channel_run = 0; static const GTypeInfo ags_play_wave_channel_run_info = { sizeof (AgsPlayWaveChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_wave_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayWaveChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_wave_channel_run_init, }; static const GInterfaceInfo ags_seekable_interface_info = { (GInterfaceInitFunc) ags_play_wave_channel_run_seekable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_wave_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsPlayWaveChannelRun", &ags_play_wave_channel_run_info, 0); g_type_add_interface_static(ags_type_play_wave_channel_run, AGS_TYPE_SEEKABLE, &ags_seekable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_wave_channel_run); } return g_define_type_id__volatile; } void ags_play_wave_channel_run_class_init(AgsPlayWaveChannelRunClass *play_wave_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_wave_channel_run_parent_class = g_type_class_peek_parent(play_wave_channel_run); /* GObjectClass */ gobject = (GObjectClass *) play_wave_channel_run; gobject->set_property = ags_play_wave_channel_run_set_property; gobject->get_property = ags_play_wave_channel_run_get_property; gobject->dispose = ags_play_wave_channel_run_dispose; gobject->finalize = ags_play_wave_channel_run_finalize; /* properties */ /** * AgsPlayWaveChannelRun:x-offset: * * The x offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("x-offset", i18n_pspec("x offset"), i18n_pspec("The x offset in the wave"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_OFFSET, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) play_wave_channel_run; recall->run_inter = ags_play_wave_channel_run_run_inter; } void ags_play_wave_channel_run_seekable_interface_init(AgsSeekableInterface *seekable) { seekable->seek = ags_play_wave_channel_run_seek; } void ags_play_wave_channel_run_init(AgsPlayWaveChannelRun *play_wave_channel_run) { ags_recall_set_ability_flags((AgsRecall *) play_wave_channel_run, (AGS_SOUND_ABILITY_WAVE)); AGS_RECALL(play_wave_channel_run)->name = "ags-play-wave"; AGS_RECALL(play_wave_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_wave_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_wave_channel_run)->xml_type = "ags-play-wave-channel-run"; AGS_RECALL(play_wave_channel_run)->port = NULL; play_wave_channel_run->timestamp = ags_timestamp_new(); g_object_ref(play_wave_channel_run->timestamp); play_wave_channel_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); play_wave_channel_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; play_wave_channel_run->timestamp->timer.ags_offset.offset = 0; play_wave_channel_run->audio_signal = NULL; play_wave_channel_run->x_offset = 0; } void ags_play_wave_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayWaveChannelRun *play_wave_channel_run; GRecMutex *recall_mutex; play_wave_channel_run = AGS_PLAY_WAVE_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_wave_channel_run); switch(prop_id){ case PROP_X_OFFSET: { guint64 x_offset; x_offset = g_value_get_uint64(value); g_rec_mutex_lock(recall_mutex); play_wave_channel_run->x_offset = x_offset; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_wave_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayWaveChannelRun *play_wave_channel_run; GRecMutex *recall_mutex; play_wave_channel_run = AGS_PLAY_WAVE_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_wave_channel_run); switch(prop_id){ case PROP_X_OFFSET: { g_rec_mutex_lock(recall_mutex); g_value_set_uint64(value, play_wave_channel_run->x_offset); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_wave_channel_run_dispose(GObject *gobject) { AgsPlayWaveChannelRun *play_wave_channel_run; play_wave_channel_run = AGS_PLAY_WAVE_CHANNEL_RUN(gobject); /* call parent */ G_OBJECT_CLASS(ags_play_wave_channel_run_parent_class)->dispose(gobject); } void ags_play_wave_channel_run_finalize(GObject *gobject) { AgsPlayWaveChannelRun *play_wave_channel_run; play_wave_channel_run = AGS_PLAY_WAVE_CHANNEL_RUN(gobject); /* timestamp */ if(play_wave_channel_run->timestamp != NULL){ g_object_unref(G_OBJECT(play_wave_channel_run->timestamp)); } /* call parent */ G_OBJECT_CLASS(ags_play_wave_channel_run_parent_class)->finalize(gobject); } void ags_play_wave_channel_run_seek(AgsSeekable *seekable, gint64 offset, guint whence) { AgsPlayWaveChannelRun *play_wave_channel_run; GObject *soundcard; gdouble absolute_delay; guint buffer_size; guint64 x_offset; play_wave_channel_run = AGS_PLAY_WAVE_CHANNEL_RUN(seekable); g_object_get(play_wave_channel_run, "output-soundcard", &soundcard, "buffer-size", &buffer_size, NULL); absolute_delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(soundcard)); switch(whence){ case AGS_SEEK_CUR: { g_object_get(play_wave_channel_run, "x-offset", &x_offset, NULL); if(x_offset + (offset * absolute_delay * buffer_size) < 0){ x_offset = 0; }else{ x_offset = x_offset + (offset * absolute_delay * buffer_size); } g_object_set(play_wave_channel_run, "x-offset", x_offset, NULL); } break; case AGS_SEEK_END: { g_warning("seek from end not implemented"); } break; case AGS_SEEK_SET: { x_offset = offset * absolute_delay * buffer_size; g_object_set(play_wave_channel_run, "x-offset", x_offset, NULL); } break; } g_object_unref(soundcard); } void ags_play_wave_channel_run_run_inter_add_audio_signal(AgsPlayWaveChannelRun *play_wave_channel_run, AgsChannel *channel, GObject *output_soundcard, AgsRecallID *recall_id, guint samplerate, guint buffer_size, guint format) { AgsChannel *output; AgsRecycling *first_recycling; g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_unref(first_recycling); play_wave_channel_run->audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, (GObject *) recall_id); g_object_set(play_wave_channel_run->audio_signal, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); ags_audio_signal_stream_resize(play_wave_channel_run->audio_signal, 3); play_wave_channel_run->audio_signal->stream_current = play_wave_channel_run->audio_signal->stream; ags_recycling_add_audio_signal(first_recycling, play_wave_channel_run->audio_signal); ags_connectable_connect(AGS_CONNECTABLE(play_wave_channel_run->audio_signal)); } void ags_play_wave_channel_run_run_inter(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; AgsWave *wave; AgsPort *port; AgsRecallID *recall_id; AgsPlayWaveAudio *play_wave_audio; AgsPlayWaveAudioRun *play_wave_audio_run; AgsPlayWaveChannel *play_wave_channel; AgsPlayWaveChannelRun *play_wave_channel_run; GObject *output_soundcard; GList *start_list, *list; guint line; guint samplerate; guint buffer_size; guint format; guint64 x_offset; guint64 x_point_offset; guint64 relative_offset; gdouble delay; guint frame_count; guint attack; gboolean do_playback; gboolean do_loop; GValue do_playback_value = {0,}; GValue do_loop_value = {0,}; GValue x_offset_value = {0,}; GRecMutex *audio_mutex; GRecMutex *channel_mutex; play_wave_channel_run = (AgsPlayWaveChannelRun *) recall; g_object_get(play_wave_channel_run, "output-soundcard", &output_soundcard, "recall-id", &recall_id, "recall-audio", &play_wave_audio, "recall-channel", &play_wave_channel, "recall-audio-run", &play_wave_audio_run, NULL); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* get do playback */ g_object_get(play_wave_channel, "do-playback", &port, NULL); g_value_init(&do_playback_value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &do_playback_value); do_playback = g_value_get_boolean(&do_playback_value); g_value_unset(&do_playback_value); g_object_unref(port); if(!do_playback){ g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(play_wave_audio); g_object_unref(play_wave_channel); g_object_unref(play_wave_audio_run); return; } g_object_get(play_wave_channel_run, "x-offset", &x_offset, NULL); /* get some fields */ g_object_get(play_wave_audio_run, "audio", &audio, NULL); g_object_get(play_wave_channel_run, "source", &channel, NULL); g_object_get(audio, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, "wave", &start_list, NULL); g_object_get(channel, "line", &line, NULL); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * samplerate; attack = (x_offset % relative_offset) % buffer_size; frame_count = buffer_size - attack; if(x_offset + frame_count > relative_offset * floor(x_offset / relative_offset) + relative_offset){ frame_count = relative_offset * floor((x_offset + frame_count) / relative_offset) - x_offset; } /* clear */ if(play_wave_channel_run->audio_signal != NULL){ ags_audio_buffer_util_clear_buffer(play_wave_channel_run->audio_signal->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); } /* time stamp offset */ ags_timestamp_set_ags_offset(play_wave_channel_run->timestamp, (guint64) (relative_offset * floor((double) x_offset / (double) relative_offset))); /* find wave */ wave = NULL; list = ags_wave_find_near_timestamp(start_list, line, play_wave_channel_run->timestamp); if(list != NULL){ AgsBuffer *buffer; wave = list->data; x_point_offset = x_offset - attack; buffer = ags_wave_find_point(wave, x_point_offset, FALSE); if(buffer != NULL){ guint copy_mode; guint current_format; g_object_get(buffer, "format", ¤t_format, NULL); if(play_wave_channel_run->audio_signal == NULL){ ags_play_wave_channel_run_run_inter_add_audio_signal(play_wave_channel_run, channel, output_soundcard, recall_id, samplerate, buffer_size, format); } copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(current_format)); ags_audio_buffer_util_copy_buffer_to_buffer(play_wave_channel_run->audio_signal->stream_current->data, 1, 0, buffer->data, 1, attack, frame_count, copy_mode); } } /* 2nd attempt */ ags_timestamp_set_ags_offset(play_wave_channel_run->timestamp, (guint64) relative_offset * floor((double) (x_offset + frame_count) / (double) relative_offset)); /* play */ if(attack != 0 || frame_count != buffer_size){ list = ags_wave_find_near_timestamp(start_list, line, play_wave_channel_run->timestamp); if(list != NULL){ AgsBuffer *buffer; wave = list->data; x_point_offset = x_offset + frame_count; buffer = ags_wave_find_point(wave, x_point_offset, FALSE); if(buffer != NULL){ guint copy_mode; guint current_format; g_object_get(buffer, "format", ¤t_format, NULL); if(play_wave_channel_run->audio_signal == NULL){ ags_play_wave_channel_run_run_inter_add_audio_signal(play_wave_channel_run, channel, output_soundcard, recall_id, samplerate, buffer_size, format); } copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(current_format)); ags_audio_buffer_util_copy_buffer_to_buffer(play_wave_channel_run->audio_signal->stream_current->data, 1, frame_count, buffer->data, 1, 0, buffer_size - frame_count, copy_mode); } } } /* check loop */ x_offset += buffer_size; g_object_get(play_wave_audio, "wave-loop", &port, NULL); g_value_init(&do_loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &do_loop_value); do_loop = g_value_get_boolean(&do_loop_value); g_value_unset(&do_loop_value); if(do_loop){ guint64 loop_start, loop_end; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; g_object_get(play_wave_audio, "wave-loop-end", &port, NULL); g_value_init(&loop_end_value, G_TYPE_UINT64); ags_port_safe_read(port, &loop_end_value); loop_end = g_value_get_uint64(&loop_end_value); g_value_unset(&loop_end_value); if(x_offset / buffer_size / delay >= loop_end){ g_object_get(play_wave_audio, "wave-loop-start", &port, NULL); g_value_init(&loop_start_value, G_TYPE_UINT64); ags_port_safe_read(port, &loop_start_value); loop_start = g_value_get_uint64(&loop_start_value); g_value_unset(&loop_start_value); x_offset = (relative_offset * floor((delay * buffer_size * loop_start) / relative_offset)) + ((guint64) (delay * buffer_size * loop_start) % relative_offset); } } /* new x offset */ g_object_set(play_wave_channel_run, "x-offset", x_offset, NULL); g_object_get(play_wave_channel, "x-offset", &port, NULL); g_value_init(&x_offset_value, G_TYPE_UINT64); g_value_set_uint64(&x_offset_value, x_offset); ags_port_safe_write(port, &x_offset_value); g_value_unset(&x_offset_value); g_object_unref(port); /* unref */ g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(play_wave_audio); g_object_unref(play_wave_channel); g_object_unref(play_wave_audio_run); g_object_unref(audio); g_object_unref(channel); g_list_free_full(start_list, g_object_unref); } /** * ags_play_wave_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsPlayWaveChannelRun * * Returns: the new #AgsPlayWaveChannelRun * * Since: 3.0.0 */ AgsPlayWaveChannelRun* ags_play_wave_channel_run_new(AgsChannel *source) { AgsPlayWaveChannelRun *play_wave_channel_run; play_wave_channel_run = (AgsPlayWaveChannelRun *) g_object_new(AGS_TYPE_PLAY_WAVE_CHANNEL_RUN, "source", source, NULL); return(play_wave_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_eq10_audio_signal.h0000644000175000017500000000544313607210263020212 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EQ10_AUDIO_SIGNAL_H__ #define __AGS_EQ10_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EQ10_AUDIO_SIGNAL (ags_eq10_audio_signal_get_type()) #define AGS_EQ10_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EQ10_AUDIO_SIGNAL, AgsEq10AudioSignal)) #define AGS_EQ10_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EQ10_AUDIO_SIGNAL, AgsEq10AudioSignalClass)) #define AGS_IS_EQ10_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_EQ10_AUDIO_SIGNAL)) #define AGS_IS_EQ10_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EQ10_AUDIO_SIGNAL)) #define AGS_EQ10_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_EQ10_AUDIO_SIGNAL, AgsEq10AudioSignalClass)) #define AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE (8) typedef struct _AgsEq10AudioSignal AgsEq10AudioSignal; typedef struct _AgsEq10AudioSignalClass AgsEq10AudioSignalClass; struct _AgsEq10AudioSignal { AgsRecallAudioSignal recall_audio_signal; double cache_28hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_56hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_112hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_224hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_448hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_896hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_1792hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_3584hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_7168hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double cache_14336hz[AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE]; double *output_buffer; double *input_buffer; }; struct _AgsEq10AudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_eq10_audio_signal_get_type(); AgsEq10AudioSignal* ags_eq10_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_EQ10_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_analyse_audio_signal.h0000644000175000017500000000434013607210263021073 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ANALYSE_AUDIO_SIGNAL_H__ #define __AGS_ANALYSE_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ANALYSE_AUDIO_SIGNAL (ags_analyse_audio_signal_get_type()) #define AGS_ANALYSE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ANALYSE_AUDIO_SIGNAL, AgsAnalyseAudioSignal)) #define AGS_ANALYSE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ANALYSE_AUDIO_SIGNAL, AgsAnalyseAudioSignalClass)) #define AGS_IS_ANALYSE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ANALYSE_AUDIO_SIGNAL)) #define AGS_IS_ANALYSE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ANALYSE_AUDIO_SIGNAL)) #define AGS_ANALYSE_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ANALYSE_AUDIO_SIGNAL, AgsAnalyseAudioSignalClass)) typedef struct _AgsAnalyseAudioSignal AgsAnalyseAudioSignal; typedef struct _AgsAnalyseAudioSignalClass AgsAnalyseAudioSignalClass; struct _AgsAnalyseAudioSignal { AgsRecallAudioSignal recall_audio_signal; }; struct _AgsAnalyseAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_analyse_audio_signal_get_type(); AgsAnalyseAudioSignal* ags_analyse_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_ANALYSE_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_count_beats_audio.c0000644000175000017500000011547513607210263020417 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_count_beats_audio_class_init(AgsCountBeatsAudioClass *count_beats_audio); void ags_count_beats_audio_tactable_interface_init(AgsTactableInterface *tactable); void ags_count_beats_audio_init(AgsCountBeatsAudio *count_beats_audio); void ags_count_beats_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_count_beats_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_count_beats_audio_dispose(GObject *gobject); void ags_count_beats_audio_finalize(GObject *gobject); void ags_count_beats_audio_notify_output_soundcard_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_count_beats_audio_change_sequencer_duration(AgsTactable *tactable, guint64 duration); void ags_count_beats_audio_change_notation_duration(AgsTactable *tactable, guint64 duration); void ags_count_beats_audio_change_wave_duration(AgsTactable *tactable, guint64 duration); void ags_count_beats_audio_change_midi_duration(AgsTactable *tactable, guint64 duration); /** * SECTION:ags_count_beats_audio * @short_description: count audio beats * @title: AgsCountBeatsAudio * @section_id: * @include: ags/audio/recall/ags_count_beats_audio.h * * The #AgsCountBeatsAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_SEQUENCER_LOOP, PROP_SEQUENCER_LOOP_START, PROP_SEQUENCER_LOOP_END, PROP_NOTATION_LOOP, PROP_NOTATION_LOOP_START, PROP_NOTATION_LOOP_END, PROP_WAVE_LOOP, PROP_WAVE_LOOP_START, PROP_WAVE_LOOP_END, PROP_MIDI_LOOP, PROP_MIDI_LOOP_START, PROP_MIDI_LOOP_END, }; static gpointer ags_count_beats_audio_parent_class = NULL; static const gchar *ags_count_beats_audio_plugin_name = "ags-count-beats"; static const gchar *ags_count_beats_audio_specifier[] = { "./sequencer_loop[0]", "./sequencer_loop_start[0]", "./sequencer_loop_end[0]", "./notation-loop[0]", "./notation_loop_end[0]" "./notation_loop_start[0]", "./wave_loop[0]", "./wave_loop_start[0]", "./wave_loop_end[0]", "./midi_loop[0]", "./midi_loop_start[0]", "./midi_loop_end[0]", }; static const gchar *ags_count_beats_audio_control_port[] = { "1/12", "2/12", "3/12", "4/12", "5/12", "6/12", "7/12", "8/12", "9/12", "10/12", "11/12", "12/12", }; GType ags_count_beats_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_count_beats_audio = 0; static const GTypeInfo ags_count_beats_audio_info = { sizeof (AgsCountBeatsAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_count_beats_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCountBeatsAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_count_beats_audio_init, }; static const GInterfaceInfo ags_tactable_interface_info = { (GInterfaceInitFunc) ags_count_beats_audio_tactable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_count_beats_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsCountBeatsAudio", &ags_count_beats_audio_info, 0); g_type_add_interface_static(ags_type_count_beats_audio, AGS_TYPE_TACTABLE, &ags_tactable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_count_beats_audio); } return g_define_type_id__volatile; } void ags_count_beats_audio_tactable_interface_init(AgsTactableInterface *tactable) { tactable->get_sequencer_duration = NULL; tactable->get_notation_duration = NULL; tactable->get_wave_duration = NULL; tactable->get_midi_duration = NULL; tactable->get_bpm = NULL; tactable->get_tact = NULL; tactable->change_sequencer_duration = ags_count_beats_audio_change_sequencer_duration; tactable->change_notation_duration = ags_count_beats_audio_change_notation_duration; tactable->change_wave_duration = ags_count_beats_audio_change_wave_duration; tactable->change_midi_duration = ags_count_beats_audio_change_midi_duration; tactable->change_bpm = NULL; tactable->change_tact = NULL; } void ags_count_beats_audio_class_init(AgsCountBeatsAudioClass *count_beats_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_count_beats_audio_parent_class = g_type_class_peek_parent(count_beats_audio); gobject = (GObjectClass *) count_beats_audio; gobject->set_property = ags_count_beats_audio_set_property; gobject->get_property = ags_count_beats_audio_get_property; gobject->dispose = ags_count_beats_audio_dispose; gobject->finalize = ags_count_beats_audio_finalize; /* properties */ /** * AgsCountBeatsAudio:sequencer-loop: * * Count until loop-end and start at loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer-loop", i18n_pspec("sequencer loop playing"), i18n_pspec("Play sequencer in a endless loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_LOOP, param_spec); /** * AgsCountBeatsAudio:sequencer-loop-start: * * The sequencer's loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer_loop_start", i18n_pspec("start beat of loop"), i18n_pspec("The start beat of the sequencer loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_LOOP_START, param_spec); /** * AgsCountBeatsAudio:sequencer-loop-end: * * The sequencer's loop-end. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer-loop-end", i18n_pspec("end beat of sequencer loop"), i18n_pspec("The end beat of the sequencer loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_LOOP_END, param_spec); /** * AgsCountBeatsAudio:notation-loop: * * Count until notation-loop-end and start at notation-loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-loop", i18n_pspec("notation-loop playing"), i18n_pspec("Play in a endless notation_loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_LOOP, param_spec); /** * AgsCountBeatsAudio:notation-loop-start: * * The notation's notation-loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-loop-start", i18n_pspec("start beat of notation loop"), i18n_pspec("The start beat of the notation loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_LOOP_START, param_spec); /** * AgsCountBeatsAudio:notation-loop-end: * * The notation's loop-end. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-loop-end", i18n_pspec("end beat of notation loop"), i18n_pspec("The end beat of the notation loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_LOOP_END, param_spec); /** * AgsCountBeatsAudio:wave-loop: * * Count until loop-end and start at loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-loop", i18n_pspec("wave loop playing"), i18n_pspec("Play wave in a endless loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP, param_spec); /** * AgsCountBeatsAudio:wave-loop-start: * * The wave's loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave_loop_start", i18n_pspec("start beat of loop"), i18n_pspec("The start beat of the wave loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP_START, param_spec); /** * AgsCountBeatsAudio:wave-loop-end: * * The wave's loop-end. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-loop-end", i18n_pspec("end beat of wave loop"), i18n_pspec("The end beat of the wave loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_LOOP_END, param_spec); /** * AgsCountBeatsAudio:midi-loop: * * Count until loop-end and start at loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("midi-loop", i18n_pspec("midi loop playing"), i18n_pspec("Play midi in a endless loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_LOOP, param_spec); /** * AgsCountBeatsAudio:midi-loop-start: * * The midi's loop-start. * * Since: 3.0.0 */ param_spec = g_param_spec_object("midi_loop_start", i18n_pspec("start beat of loop"), i18n_pspec("The start beat of the midi loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_LOOP_START, param_spec); /** * AgsCountBeatsAudio:midi-loop-end: * * The midi's loop-end. * * Since: 3.0.0 */ param_spec = g_param_spec_object("midi-loop-end", i18n_pspec("end beat of midi loop"), i18n_pspec("The end beat of the midi loop"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_LOOP_END, param_spec); } void ags_count_beats_audio_init(AgsCountBeatsAudio *count_beats_audio) { GList *port; g_signal_connect_after(count_beats_audio, "notify::output-soundcard", G_CALLBACK(ags_count_beats_audio_notify_output_soundcard_callback), NULL); AGS_RECALL(count_beats_audio)->name = "ags-count-beats"; AGS_RECALL(count_beats_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(count_beats_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(count_beats_audio)->xml_type = "ags-count-beats-audio"; port = NULL; /* sequencer loop */ count_beats_audio->sequencer_loop = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[0], "control-port", ags_count_beats_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->sequencer_loop); count_beats_audio->sequencer_loop->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, count_beats_audio->sequencer_loop); g_object_ref(count_beats_audio->sequencer_loop); /* sequencer-loop-start */ count_beats_audio->sequencer_loop_start = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[1], "control-port", ags_count_beats_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->sequencer_loop_start); count_beats_audio->sequencer_loop_start->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, count_beats_audio->sequencer_loop_start); g_object_ref(count_beats_audio->sequencer_loop_start); /* sequencer-loop-end */ count_beats_audio->sequencer_loop_end = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[3], "control-port", ags_count_beats_audio_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->sequencer_loop_end); count_beats_audio->sequencer_loop_end->port_value.ags_port_uint = 16; /* add to port */ port = g_list_prepend(port, count_beats_audio->sequencer_loop_end); g_object_ref(count_beats_audio->sequencer_loop_end); /* notation loop */ count_beats_audio->notation_loop = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[0], "control-port", ags_count_beats_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->notation_loop); count_beats_audio->notation_loop->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, count_beats_audio->notation_loop); g_object_ref(count_beats_audio->notation_loop); /* notation-loop-start */ count_beats_audio->notation_loop_start = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[2], "control-port", ags_count_beats_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->notation_loop_start); count_beats_audio->notation_loop_start->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, count_beats_audio->notation_loop_start); g_object_ref(count_beats_audio->notation_loop_start); /* notation-loop-end */ count_beats_audio->notation_loop_end = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[4], "control-port", ags_count_beats_audio_control_port[4], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->notation_loop_end); count_beats_audio->notation_loop_end->port_value.ags_port_uint = 64; /* add to port */ port = g_list_prepend(port, count_beats_audio->notation_loop_end); g_object_ref(count_beats_audio->notation_loop_end); /* wave loop */ count_beats_audio->wave_loop = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[0], "control-port", ags_count_beats_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->wave_loop); count_beats_audio->wave_loop->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, count_beats_audio->wave_loop); g_object_ref(count_beats_audio->wave_loop); /* wave-loop-start */ count_beats_audio->wave_loop_start = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[1], "control-port", ags_count_beats_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->wave_loop_start); count_beats_audio->wave_loop_start->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, count_beats_audio->wave_loop_start); g_object_ref(count_beats_audio->wave_loop_start); /* wave-loop-end */ count_beats_audio->wave_loop_end = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[3], "control-port", ags_count_beats_audio_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->wave_loop_end); count_beats_audio->wave_loop_end->port_value.ags_port_uint = 16; /* add to port */ port = g_list_prepend(port, count_beats_audio->wave_loop_end); g_object_ref(count_beats_audio->wave_loop_end); /* midi loop */ count_beats_audio->midi_loop = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[0], "control-port", ags_count_beats_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->midi_loop); count_beats_audio->midi_loop->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, count_beats_audio->midi_loop); g_object_ref(count_beats_audio->midi_loop); /* midi-loop-start */ count_beats_audio->midi_loop_start = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[1], "control-port", ags_count_beats_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->midi_loop_start); count_beats_audio->midi_loop_start->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, count_beats_audio->midi_loop_start); g_object_ref(count_beats_audio->midi_loop_start); /* midi-loop-end */ count_beats_audio->midi_loop_end = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_count_beats_audio_plugin_name, "specifier", ags_count_beats_audio_specifier[3], "control-port", ags_count_beats_audio_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(count_beats_audio->midi_loop_end); count_beats_audio->midi_loop_end->port_value.ags_port_uint = 16; /* add to port */ port = g_list_prepend(port, count_beats_audio->midi_loop_end); g_object_ref(count_beats_audio->midi_loop_end); /* port */ AGS_RECALL(count_beats_audio)->port = port; } void ags_count_beats_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCountBeatsAudio *count_beats_audio; GRecMutex *recall_mutex; count_beats_audio = AGS_COUNT_BEATS_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio); switch(prop_id){ case PROP_SEQUENCER_LOOP: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->sequencer_loop){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->sequencer_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->sequencer_loop = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_LOOP_START: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->sequencer_loop_start){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->sequencer_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop_start)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->sequencer_loop_start = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_LOOP_END: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->sequencer_loop_end){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->sequencer_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop_end)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->sequencer_loop_end = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_LOOP: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->notation_loop){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->notation_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->notation_loop = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_LOOP_START: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->notation_loop_start){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->notation_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop_start)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->notation_loop_start = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_LOOP_END: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->notation_loop_end){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->notation_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop_end)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->notation_loop_end = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->wave_loop){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->wave_loop = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_START: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->wave_loop_start){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop_start)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->wave_loop_start = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_END: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->wave_loop_end){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop_end)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->wave_loop_end = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_LOOP: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->midi_loop){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->midi_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->midi_loop = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_LOOP_START: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->midi_loop_start){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->midi_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop_start)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->midi_loop_start = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_LOOP_END: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == count_beats_audio->midi_loop_end){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio->midi_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop_end)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } count_beats_audio->midi_loop_end = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_count_beats_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCountBeatsAudio *count_beats_audio; GRecMutex *recall_mutex; count_beats_audio = AGS_COUNT_BEATS_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio); switch(prop_id){ case PROP_SEQUENCER_LOOP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->sequencer_loop); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_LOOP_START: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->sequencer_loop_start); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_LOOP_END: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->sequencer_loop_end); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_LOOP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->notation_loop); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_LOOP_START: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->notation_loop_start); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_LOOP_END: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->notation_loop_end); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->wave_loop); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_START: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->wave_loop_start); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_LOOP_END: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->wave_loop_end); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_LOOP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->midi_loop); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_LOOP_START: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->midi_loop_start); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_LOOP_END: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio->midi_loop_end); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_count_beats_audio_dispose(GObject *gobject) { AgsCountBeatsAudio *count_beats_audio; count_beats_audio = AGS_COUNT_BEATS_AUDIO(gobject); /* sequencer */ if(count_beats_audio->sequencer_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop)); count_beats_audio->sequencer_loop = NULL; } if(count_beats_audio->sequencer_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop_start)); count_beats_audio->sequencer_loop_start = NULL; } if(count_beats_audio->sequencer_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop_end)); count_beats_audio->sequencer_loop_end = NULL; } /* notation */ if(count_beats_audio->notation_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop)); count_beats_audio->notation_loop = NULL; } if(count_beats_audio->notation_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop_start)); count_beats_audio->notation_loop_start = NULL; } if(count_beats_audio->notation_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop_end)); count_beats_audio->notation_loop_end = NULL; } /* wave */ if(count_beats_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop)); count_beats_audio->wave_loop = NULL; } if(count_beats_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop_start)); count_beats_audio->wave_loop_start = NULL; } if(count_beats_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop_end)); count_beats_audio->wave_loop_end = NULL; } /* midi */ if(count_beats_audio->midi_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop)); count_beats_audio->midi_loop = NULL; } if(count_beats_audio->midi_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop_start)); count_beats_audio->midi_loop_start = NULL; } if(count_beats_audio->midi_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop_end)); count_beats_audio->midi_loop_end = NULL; } /* call parent */ G_OBJECT_CLASS(ags_count_beats_audio_parent_class)->dispose(gobject); } void ags_count_beats_audio_finalize(GObject *gobject) { AgsCountBeatsAudio *count_beats_audio; count_beats_audio = AGS_COUNT_BEATS_AUDIO(gobject); /* sequencer */ if(count_beats_audio->sequencer_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop)); } if(count_beats_audio->sequencer_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop_start)); } if(count_beats_audio->sequencer_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->sequencer_loop_end)); } /* notation */ if(count_beats_audio->notation_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop_start)); } if(count_beats_audio->notation_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop_end)); } if(count_beats_audio->notation_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->notation_loop)); } /* wave */ if(count_beats_audio->wave_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop)); } if(count_beats_audio->wave_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop_start)); } if(count_beats_audio->wave_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->wave_loop_end)); } /* midi */ if(count_beats_audio->midi_loop != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop)); } if(count_beats_audio->midi_loop_start != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop_start)); } if(count_beats_audio->midi_loop_end != NULL){ g_object_unref(G_OBJECT(count_beats_audio->midi_loop_end)); } /* call parent */ G_OBJECT_CLASS(ags_count_beats_audio_parent_class)->finalize(gobject); } void ags_count_beats_audio_notify_output_soundcard_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsCountBeatsAudio *count_beats_audio; AgsPort *notation_loop; AgsPort *notation_loop_start; AgsPort *notation_loop_end; AgsPort *wave_loop; AgsPort *wave_loop_start; AgsPort *wave_loop_end; AgsPort *midi_loop; AgsPort *midi_loop_start; AgsPort *midi_loop_end; GObject *output_soundcard; guint loop_start, loop_end; gboolean do_loop; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; GValue do_loop_value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(gobject); g_object_get(gobject, "output-soundcard", &output_soundcard, NULL); if(output_soundcard == NULL){ return; } /* retrieve loop information */ ags_soundcard_get_loop(AGS_SOUNDCARD(output_soundcard), &loop_start, &loop_end, &do_loop); /* set loop information on ports */ g_object_get(gobject, "notation-loop", ¬ation_loop, "notation-loop-start", ¬ation_loop_start, "notation-loop-end", ¬ation_loop_end, "wave-loop", &wave_loop, "wave-loop-start", &wave_loop_start, "wave-loop-end", &wave_loop_end, "midi-loop", &midi_loop, "midi-loop-start", &midi_loop_start, "midi-loop-end", &midi_loop_end, NULL); g_value_init(&do_loop_value, G_TYPE_BOOLEAN); g_value_init(&loop_start_value, G_TYPE_UINT64); g_value_init(&loop_end_value, G_TYPE_UINT64); g_value_set_uint64(&loop_start_value, (guint64) loop_start); g_value_set_uint64(&loop_end_value, (guint64) loop_end); g_value_set_boolean(&do_loop_value, do_loop); /* notation */ ags_port_safe_write(notation_loop, &do_loop_value); ags_port_safe_write(notation_loop_start, &loop_start_value); ags_port_safe_write(notation_loop_end, &loop_end_value); /* wave */ ags_port_safe_write(wave_loop, &do_loop_value); ags_port_safe_write(wave_loop_start, &loop_start_value); ags_port_safe_write(wave_loop_end, &loop_end_value); /* midi */ ags_port_safe_write(midi_loop, &do_loop_value); ags_port_safe_write(midi_loop_start, &loop_start_value); ags_port_safe_write(midi_loop_end, &loop_end_value); /* unset value */ g_value_unset(&do_loop_value); g_value_unset(&loop_start_value); g_value_unset(&loop_end_value); /* unref */ g_object_unref(output_soundcard); g_object_unref(notation_loop); g_object_unref(notation_loop_start); g_object_unref(notation_loop_end); g_object_unref(wave_loop); g_object_unref(wave_loop_start); g_object_unref(wave_loop_end); g_object_unref(midi_loop); g_object_unref(midi_loop_start); g_object_unref(midi_loop_end); } void ags_count_beats_audio_change_sequencer_duration(AgsTactable *tactable, guint64 duration) { AgsPort *port; AgsCountBeatsAudio *count_beats_audio; GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(tactable); /* get port */ g_object_get(count_beats_audio, "sequencer-loop-end", &port, NULL); /* safe write */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, duration); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } void ags_count_beats_audio_change_notation_duration(AgsTactable *tactable, guint64 duration) { AgsPort *port; AgsCountBeatsAudio *count_beats_audio; GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(tactable); /* get port */ g_object_get(count_beats_audio, "notation-loop-end", &port, NULL); /* safe write */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, duration); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } void ags_count_beats_audio_change_wave_duration(AgsTactable *tactable, guint64 duration) { AgsPort *port; AgsCountBeatsAudio *count_beats_audio; GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(tactable); /* get port */ g_object_get(count_beats_audio, "wave-loop-end", &port, NULL); /* safe write */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, duration); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } void ags_count_beats_audio_change_midi_duration(AgsTactable *tactable, guint64 duration) { AgsPort *port; AgsCountBeatsAudio *count_beats_audio; GValue value = {0,}; count_beats_audio = AGS_COUNT_BEATS_AUDIO(tactable); /* get port */ g_object_get(count_beats_audio, "midi-loop-end", &port, NULL); /* safe write */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, duration); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } /** * ags_count_beats_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsCountBeatsAudio * * Returns: the new #AgsCountBeatsAudio * * Since: 3.0.0 */ AgsCountBeatsAudio* ags_count_beats_audio_new(AgsAudio *audio) { AgsCountBeatsAudio *count_beats_audio; count_beats_audio = (AgsCountBeatsAudio *) g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO, "audio", audio, NULL); return(count_beats_audio); } gsequencer-3.1.3/ags/audio/recall/ags_buffer_recycling.c0000644000175000017500000000742713607210263020235 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_buffer_recycling_class_init(AgsBufferRecyclingClass *buffer_recycling); void ags_buffer_recycling_init(AgsBufferRecycling *buffer_recycling); void ags_buffer_recycling_finalize(GObject *gobject); /** * SECTION:ags_buffer_recycling * @short_description: buffer recycling * @title: AgsBufferRecycling * @section_id: * @include: ags/audio/recall/ags_buffer_recycling.h * * The #AgsBufferRecycling class buffers the recycling. */ static gpointer ags_buffer_recycling_parent_class = NULL; GType ags_buffer_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_buffer_recycling = 0; static const GTypeInfo ags_buffer_recycling_info = { sizeof(AgsBufferRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_buffer_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsBufferRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_buffer_recycling_init, }; ags_type_buffer_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsBufferRecycling", &ags_buffer_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_buffer_recycling); } return g_define_type_id__volatile; } void ags_buffer_recycling_class_init(AgsBufferRecyclingClass *buffer_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_buffer_recycling_parent_class = g_type_class_peek_parent(buffer_recycling); /* GObjectClass */ gobject = (GObjectClass *) buffer_recycling; gobject->finalize = ags_buffer_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) buffer_recycling; } void ags_buffer_recycling_init(AgsBufferRecycling *buffer_recycling) { AGS_RECALL(buffer_recycling)->name = "ags-buffer"; AGS_RECALL(buffer_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(buffer_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(buffer_recycling)->xml_type = "ags-buffer-recycling"; AGS_RECALL(buffer_recycling)->port = NULL; AGS_RECALL(buffer_recycling)->child_type = AGS_TYPE_BUFFER_AUDIO_SIGNAL; } void ags_buffer_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_buffer_recycling_parent_class)->finalize(gobject); } /** * ags_buffer_recycling_new: * @destination: the destination #AgsRecycling * @source: the source #AgsRecycling * * Create a new instance of #AgsBufferRecycling * * Returns: the new #AgsBufferRecycling * * Since: 3.0.0 */ AgsBufferRecycling* ags_buffer_recycling_new(AgsRecycling *destination, AgsRecycling *source) { AgsBufferRecycling *buffer_recycling; buffer_recycling = (AgsBufferRecycling *) g_object_new(AGS_TYPE_BUFFER_RECYCLING, "destination", destination, "source", source, NULL); return(buffer_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_envelope_channel.c0000644000175000017500000005562513607210263020235 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_envelope_channel_class_init(AgsEnvelopeChannelClass *envelope_channel); void ags_envelope_channel_plugin_interface_init(AgsPluginInterface *plugin); void ags_envelope_channel_init(AgsEnvelopeChannel *envelope_channel); void ags_envelope_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_envelope_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_envelope_channel_dispose(GObject *gobject); void ags_envelope_channel_finalize(GObject *gobject); void ags_envelope_channel_set_ports(AgsPlugin *plugin, GList *port); /** * SECTION:ags_envelope_channel * @short_description: envelopes channel * @title: AgsEnvelopeChannel * @section_id: * @include: ags/audio/recall/ags_envelope_channel.h * * The #AgsEnvelopeChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_USE_NOTE_LENGTH, PROP_USE_FIXED_LENGTH, PROP_FIXED_LENGTH, PROP_ATTACK, PROP_DECAY, PROP_SUSTAIN, PROP_RELEASE, PROP_RATIO, }; static gpointer ags_envelope_channel_parent_class = NULL; static const gchar *ags_envelope_channel_plugin_name = "ags-envelope"; static const gchar *ags_envelope_channel_specifier[] = { "./use-note-length[0]", "./use-fixed-length[0]", "./fixed-length[0]", "./attack[0]", "./decay[0]", "./sustain[0]", "./release[0]", "./ratio[0]" }; static const gchar *ags_envelope_channel_control_port[] = { "1/8", "2/8", "3/8", "4/8", "5/8", "6/8", "7/8", "8/8", }; GType ags_envelope_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_channel = 0; static const GTypeInfo ags_envelope_channel_info = { sizeof (AgsEnvelopeChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_channel_init, }; static const GInterfaceInfo ags_plugin_interface_info = { (GInterfaceInitFunc) ags_envelope_channel_plugin_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_envelope_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsEnvelopeChannel", &ags_envelope_channel_info, 0); g_type_add_interface_static(ags_type_envelope_channel, AGS_TYPE_PLUGIN, &ags_plugin_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_channel); } return g_define_type_id__volatile; } void ags_envelope_channel_plugin_interface_init(AgsPluginInterface *plugin) { plugin->set_ports = ags_envelope_channel_set_ports; } void ags_envelope_channel_class_init(AgsEnvelopeChannelClass *envelope_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_envelope_channel_parent_class = g_type_class_peek_parent(envelope_channel); /* GObjectClass */ gobject = (GObjectClass *) envelope_channel; gobject->set_property = ags_envelope_channel_set_property; gobject->get_property = ags_envelope_channel_get_property; gobject->dispose = ags_envelope_channel_dispose; gobject->finalize = ags_envelope_channel_finalize; /* properties */ /** * AgsEnvelopeChannel:use-note-length: * * Use note length to compute envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("use-note-length", i18n_pspec("use note length"), i18n_pspec("Use note length to compute envelope"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_USE_NOTE_LENGTH, param_spec); /** * AgsEnvelopeChannel:use-fixed-length: * * Use fixed length to compute envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("use-fixed-length", i18n_pspec("use fixed length"), i18n_pspec("Use fixed length to compute envelope"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_USE_FIXED_LENGTH, param_spec); /** * AgsEnvelopeChannel:fixed-length: * * The fixed length to compute envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("fixed-length", i18n_pspec("fixed length"), i18n_pspec("The fixed length to compute envelope"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_LENGTH, param_spec); /** * AgsEnvelopeChannel:attack: * * The attack of envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("attack", i18n_pspec("attack channel"), i18n_pspec("Attack of the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsEnvelopeChannel:decay: * * The decay of envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("decay", i18n_pspec("decay channel"), i18n_pspec("Decay of the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DECAY, param_spec); /** * AgsEnvelopeChannel:sustain: * * The sustain of envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sustain", i18n_pspec("sustain channel"), i18n_pspec("Sustain of the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SUSTAIN, param_spec); /** * AgsEnvelopeChannel:release: * * The release of envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("release", i18n_pspec("release channel"), i18n_pspec("Release of the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RELEASE, param_spec); /** * AgsEnvelopeChannel:ratio: * * The ratio of envelope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("ratio", i18n_pspec("envelope ratio"), i18n_pspec("The ratio of the envelope"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RATIO, param_spec); } void ags_envelope_channel_init(AgsEnvelopeChannel *envelope_channel) { GList *port; AGS_RECALL(envelope_channel)->name = "ags-envelope"; AGS_RECALL(envelope_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(envelope_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(envelope_channel)->xml_type = "ags-envelope-channel"; /* ports */ port = NULL; /* use note length */ envelope_channel->use_note_length = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[0], "control-port", ags_envelope_channel_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(envelope_channel->use_note_length); envelope_channel->use_note_length->port_value.ags_port_boolean = FALSE; /* use fixed length */ envelope_channel->use_fixed_length = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[1], "control-port", ags_envelope_channel_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(envelope_channel->use_fixed_length); envelope_channel->use_fixed_length->port_value.ags_port_boolean = FALSE; /* fixed length */ envelope_channel->fixed_length = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[2], "control-port", ags_envelope_channel_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(envelope_channel->fixed_length); envelope_channel->fixed_length->port_value.ags_port_double = 0.0; /* attack */ envelope_channel->attack = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[3], "control-port", ags_envelope_channel_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(envelope_channel->attack); envelope_channel->attack->port_value.ags_port_double = 1.0; /* add to port */ port = g_list_prepend(port, envelope_channel->attack); g_object_ref(envelope_channel->attack); /* decay */ envelope_channel->decay = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[4], "control-port", ags_envelope_channel_control_port[4], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(envelope_channel->decay); envelope_channel->decay->port_value.ags_port_double = 1.0; /* add to port */ port = g_list_prepend(port, envelope_channel->decay); g_object_ref(envelope_channel->decay); /* sustain */ envelope_channel->sustain = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[5], "control-port", ags_envelope_channel_control_port[5], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(envelope_channel->sustain); envelope_channel->sustain->port_value.ags_port_double = 1.0; /* add to port */ port = g_list_prepend(port, envelope_channel->sustain); g_object_ref(envelope_channel->sustain); /* release */ envelope_channel->release = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[6], "control-port", ags_envelope_channel_control_port[6], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(envelope_channel->release); envelope_channel->release->port_value.ags_port_double = 1.0; /* add to port */ port = g_list_prepend(port, envelope_channel->release); g_object_ref(envelope_channel->release); /* ratio */ envelope_channel->ratio = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_envelope_channel_plugin_name, "specifier", ags_envelope_channel_specifier[7], "control-port", ags_envelope_channel_control_port[7], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(envelope_channel->ratio); envelope_channel->ratio->port_value.ags_port_double = 1.0; /* add to port */ port = g_list_prepend(port, envelope_channel->ratio); g_object_ref(envelope_channel->ratio); /* set ports */ AGS_RECALL(envelope_channel)->port = port; } void ags_envelope_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsEnvelopeChannel *envelope_channel; GRecMutex *recall_mutex; envelope_channel = AGS_ENVELOPE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(envelope_channel); switch(prop_id){ case PROP_USE_NOTE_LENGTH: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->use_note_length){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->use_note_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->use_note_length)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->use_note_length = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_USE_FIXED_LENGTH: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->use_fixed_length){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->use_fixed_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->use_fixed_length)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->use_fixed_length = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_FIXED_LENGTH: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->fixed_length){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->fixed_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->fixed_length)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->fixed_length = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_ATTACK: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->attack){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->attack != NULL){ g_object_unref(G_OBJECT(envelope_channel->attack)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->attack = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_DECAY: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->decay){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->decay != NULL){ g_object_unref(G_OBJECT(envelope_channel->decay)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->decay = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SUSTAIN: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->sustain){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->sustain != NULL){ g_object_unref(G_OBJECT(envelope_channel->sustain)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->sustain = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RELEASE: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->release){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->release != NULL){ g_object_unref(G_OBJECT(envelope_channel->release)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->release = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_RATIO: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == envelope_channel->ratio){ g_rec_mutex_unlock(recall_mutex); return; } if(envelope_channel->ratio != NULL){ g_object_unref(G_OBJECT(envelope_channel->ratio)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } envelope_channel->ratio = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_envelope_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsEnvelopeChannel *envelope_channel; GRecMutex *recall_mutex; envelope_channel = AGS_ENVELOPE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(envelope_channel); switch(prop_id){ case PROP_USE_NOTE_LENGTH: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->use_note_length); g_rec_mutex_unlock(recall_mutex); } break; case PROP_USE_FIXED_LENGTH: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->use_fixed_length); g_rec_mutex_unlock(recall_mutex); } break; case PROP_FIXED_LENGTH: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->fixed_length); g_rec_mutex_unlock(recall_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->attack); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DECAY: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->decay); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SUSTAIN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->sustain); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RELEASE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->release); g_rec_mutex_unlock(recall_mutex); } break; case PROP_RATIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, envelope_channel->ratio); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_envelope_channel_dispose(GObject *gobject) { AgsEnvelopeChannel *envelope_channel; envelope_channel = AGS_ENVELOPE_CHANNEL(gobject); if(envelope_channel->use_note_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->use_note_length)); envelope_channel->use_note_length = NULL; } if(envelope_channel->use_fixed_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->use_fixed_length)); envelope_channel->use_fixed_length = NULL; } if(envelope_channel->fixed_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->fixed_length)); envelope_channel->fixed_length = NULL; } if(envelope_channel->attack != NULL){ g_object_unref(G_OBJECT(envelope_channel->attack)); envelope_channel->attack = NULL; } if(envelope_channel->decay != NULL){ g_object_unref(G_OBJECT(envelope_channel->decay)); envelope_channel->decay = NULL; } if(envelope_channel->sustain != NULL){ g_object_unref(G_OBJECT(envelope_channel->sustain)); envelope_channel->sustain = NULL; } if(envelope_channel->release != NULL){ g_object_unref(G_OBJECT(envelope_channel->release)); envelope_channel->release = NULL; } if(envelope_channel->ratio != NULL){ g_object_unref(G_OBJECT(envelope_channel->ratio)); envelope_channel->ratio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_envelope_channel_parent_class)->dispose(gobject); } void ags_envelope_channel_finalize(GObject *gobject) { AgsEnvelopeChannel *envelope_channel; envelope_channel = AGS_ENVELOPE_CHANNEL(gobject); if(envelope_channel->use_note_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->use_note_length)); } if(envelope_channel->use_fixed_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->use_fixed_length)); } if(envelope_channel->fixed_length != NULL){ g_object_unref(G_OBJECT(envelope_channel->fixed_length)); } if(envelope_channel->attack != NULL){ g_object_unref(G_OBJECT(envelope_channel->attack)); } if(envelope_channel->decay != NULL){ g_object_unref(G_OBJECT(envelope_channel->decay)); } if(envelope_channel->sustain != NULL){ g_object_unref(G_OBJECT(envelope_channel->sustain)); } if(envelope_channel->release != NULL){ g_object_unref(G_OBJECT(envelope_channel->release)); } if(envelope_channel->ratio != NULL){ g_object_unref(G_OBJECT(envelope_channel->ratio)); } /* call parent */ G_OBJECT_CLASS(ags_envelope_channel_parent_class)->finalize(gobject); } void ags_envelope_channel_set_ports(AgsPlugin *plugin, GList *port) { while(port != NULL){ if(!strncmp(AGS_PORT(port->data)->specifier, "attack[0]", 9)){ g_object_set(G_OBJECT(plugin), "attack", AGS_PORT(port->data), NULL); }else if(!strncmp(AGS_PORT(port->data)->specifier, "decay[0]", 8)){ g_object_set(G_OBJECT(plugin), "decay", AGS_PORT(port->data), NULL); }else if(!strncmp(AGS_PORT(port->data)->specifier, "sustain[0]", 10)){ g_object_set(G_OBJECT(plugin), "sustain", AGS_PORT(port->data), NULL); }else if(!strncmp(AGS_PORT(port->data)->specifier, "release[0]", 10)){ g_object_set(G_OBJECT(plugin), "release", AGS_PORT(port->data), NULL); }else if(!strncmp(AGS_PORT(port->data)->specifier, "ratio[0]", 8)){ g_object_set(G_OBJECT(plugin), "ratio", AGS_PORT(port->data), NULL); } port = port->next; } } /** * ags_envelope_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsEnvelopeChannel * * Returns: the new #AgsEnvelopeChannel * * Since: 3.0.0 */ AgsEnvelopeChannel* ags_envelope_channel_new(AgsChannel *source) { AgsEnvelopeChannel *envelope_channel; envelope_channel = (AgsEnvelopeChannel *) g_object_new(AGS_TYPE_ENVELOPE_CHANNEL, "source", source, NULL); return(envelope_channel); } gsequencer-3.1.3/ags/audio/recall/ags_copy_channel.c0000644000175000017500000002052413607210263017360 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_copy_channel_class_init(AgsCopyChannelClass *copy_channel); void ags_copy_channel_mutable_interface_init(AgsMutableInterface *mutable); void ags_copy_channel_init(AgsCopyChannel *copy_channel); void ags_copy_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_copy_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_copy_channel_dispose(GObject *gobject); void ags_copy_channel_finalize(GObject *gobject); void ags_copy_channel_set_muted(AgsMutable *mutable, gboolean muted); /** * SECTION:ags_copy_channel * @short_description: copys channel * @title: AgsCopyChannel * @section_id: * @include: ags/audio/recall/ags_copy_channel.h * * The #AgsCopyChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_MUTED, }; static gpointer ags_copy_channel_parent_class = NULL; static AgsMutableInterface *ags_copy_channel_parent_mutable_interface; static AgsPluginInterface *ags_copy_channel_parent_plugin_interface; static const gchar *ags_copy_channel_plugin_name = "ags-copy"; static const gchar *ags_copy_channel_plugin_specifier[] = { "./muted[0]", }; static const gchar *ags_copy_channel_plugin_control_port[] = { "1/1", }; GType ags_copy_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_channel = 0; static const GTypeInfo ags_copy_channel_info = { sizeof(AgsCopyChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCopyChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_channel_init, }; static const GInterfaceInfo ags_mutable_interface_info = { (GInterfaceInitFunc) ags_copy_channel_mutable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_copy_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsCopyChannel", &ags_copy_channel_info, 0); g_type_add_interface_static(ags_type_copy_channel, AGS_TYPE_MUTABLE, &ags_mutable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_channel); } return g_define_type_id__volatile; } void ags_copy_channel_mutable_interface_init(AgsMutableInterface *mutable) { ags_copy_channel_parent_mutable_interface = g_type_interface_peek_parent(mutable); mutable->set_muted = ags_copy_channel_set_muted; } void ags_copy_channel_class_init(AgsCopyChannelClass *copy_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_copy_channel_parent_class = g_type_class_peek_parent(copy_channel); /* GObjectClass */ gobject = (GObjectClass *) copy_channel; gobject->set_property = ags_copy_channel_set_property; gobject->get_property = ags_copy_channel_get_property; gobject->dispose = ags_copy_channel_dispose; gobject->finalize = ags_copy_channel_finalize; /* properties */ /** * AgsCopyChannel:muted: * * The mute port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("muted", i18n_pspec("mute channel"), i18n_pspec("Mute the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); } void ags_copy_channel_init(AgsCopyChannel *copy_channel) { GList *port; AGS_RECALL(copy_channel)->name = "ags-copy"; AGS_RECALL(copy_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_channel)->xml_type = "ags-copy-channel"; port = NULL; copy_channel->muted = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_copy_channel_plugin_name, "specifier", ags_copy_channel_plugin_specifier[0], "control-port", ags_copy_channel_plugin_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(copy_channel->muted); copy_channel->muted->port_value.ags_port_float = (float) FALSE; /* add to port */ port = g_list_prepend(port, copy_channel->muted); g_object_ref(copy_channel->muted); /* set port */ AGS_RECALL(copy_channel)->port = port; } void ags_copy_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCopyChannel *copy_channel; GRecMutex *recall_mutex; copy_channel = AGS_COPY_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_channel); switch(prop_id){ case PROP_MUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == copy_channel->muted){ g_rec_mutex_unlock(recall_mutex); return; } if(copy_channel->muted != NULL){ g_object_unref(G_OBJECT(copy_channel->muted)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } copy_channel->muted = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_copy_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCopyChannel *copy_channel; GRecMutex *recall_mutex; copy_channel = AGS_COPY_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_channel); switch(prop_id){ case PROP_MUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, copy_channel->muted); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_copy_channel_dispose(GObject *gobject) { AgsCopyChannel *copy_channel; copy_channel = AGS_COPY_CHANNEL(gobject); if(copy_channel->muted != NULL){ g_object_unref(G_OBJECT(copy_channel->muted)); copy_channel->muted = NULL; } /* call parent */ G_OBJECT_CLASS(ags_copy_channel_parent_class)->dispose(gobject); } void ags_copy_channel_finalize(GObject *gobject) { AgsCopyChannel *copy_channel; copy_channel = AGS_COPY_CHANNEL(gobject); if(copy_channel->muted != NULL){ g_object_unref(G_OBJECT(copy_channel->muted)); } /* call parent */ G_OBJECT_CLASS(ags_copy_channel_parent_class)->finalize(gobject); } void ags_copy_channel_set_muted(AgsMutable *mutable, gboolean muted) { AgsPort *port; GValue value = {0,}; g_object_get(G_OBJECT(mutable), "muted", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (float) (muted ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } /** * ags_copy_channel_new: * @destination: the destination #AgsChannel * @source: the source #AgsChannel * * Create a new instance of #AgsCopyChannel * * Returns: the new #AgsCopyChannel * * Since: 3.0.0 */ AgsCopyChannel* ags_copy_channel_new(AgsChannel *destination, AgsChannel *source) { AgsCopyChannel *copy_channel; copy_channel = (AgsCopyChannel *) g_object_new(AGS_TYPE_COPY_CHANNEL, "destination", destination, "source", source, NULL); return(copy_channel); } gsequencer-3.1.3/ags/audio/recall/ags_feed_channel_run.h0000644000175000017500000000412613607210263020202 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FEED_CHANNEL_RUN_H__ #define __AGS_FEED_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FEED_CHANNEL_RUN (ags_feed_channel_run_get_type()) #define AGS_FEED_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_FEED_CHANNEL_RUN, AgsFeedChannelRun)) #define AGS_FEED_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_INSTANCE_CAST(class, AGS_TYPE_FEED_CHANNEL_RUN, AgsFeedChannelRunClass)) #define AGS_IS_FEED_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FEED_CHANNEL_RUN)) #define AGS_IS_FEED_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FEED_CHANNEL_RUN)) #define AGS_FEED_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FEED_CHANNEL_RUN, AgsFeedChannelRunClass)) typedef struct _AgsFeedChannelRun AgsFeedChannelRun; typedef struct _AgsFeedChannelRunClass AgsFeedChannelRunClass; struct _AgsFeedChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsFeedChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_feed_channel_run_get_type(); AgsFeedChannelRun* ags_feed_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_FEED_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_record_midi_audio_run.c0000644000175000017500000007405313607210264021252 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_record_midi_audio_run_class_init(AgsRecordMidiAudioRunClass *record_midi_audio_run); void ags_record_midi_audio_run_init(AgsRecordMidiAudioRun *record_midi_audio_run); void ags_record_midi_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_record_midi_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_record_midi_audio_run_dispose(GObject *gobject); void ags_record_midi_audio_run_finalize(GObject *gobject); void ags_record_midi_audio_run_resolve_dependency(AgsRecall *recall); void ags_record_midi_audio_run_run_init_pre(AgsRecall *recall); void ags_record_midi_audio_run_run_pre(AgsRecall *recall); /** * SECTION:ags_record_midi_audio_run * @short_description: record midi * @title: AgsRecordMidiAudioRun * @section_id: * @include: ags/audio/recall/ags_record_midi_audio_run.h * * The #AgsRecordMidiAudioRun does record midi. */ enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_COUNT_BEATS_AUDIO_RUN, PROP_TIMESTAMP, }; static gpointer ags_record_midi_audio_run_parent_class = NULL; GType ags_record_midi_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_record_midi_audio_run = 0; static const GTypeInfo ags_record_midi_audio_run_info = { sizeof (AgsRecordMidiAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_record_midi_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecordMidiAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_record_midi_audio_run_init, }; ags_type_record_midi_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsRecordMidiAudioRun", &ags_record_midi_audio_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_record_midi_audio_run); } return g_define_type_id__volatile; } void ags_record_midi_audio_run_class_init(AgsRecordMidiAudioRunClass *record_midi_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_record_midi_audio_run_parent_class = g_type_class_peek_parent(record_midi_audio_run); /* GObjectClass */ gobject = (GObjectClass *) record_midi_audio_run; gobject->set_property = ags_record_midi_audio_run_set_property; gobject->get_property = ags_record_midi_audio_run_get_property; gobject->dispose = ags_record_midi_audio_run_dispose; gobject->finalize = ags_record_midi_audio_run_finalize; /* properties */ /** * AgsRecordMidiAudioRun:delay-audio-run: * * The delay audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("the AgsDelayAudioRun which emits midi_alloc_input signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsRecordMidiAudioRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("the AgsCountBeatsAudioRun which just counts"), AGS_TYPE_COUNT_BEATS_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /** * AgsRecordMidiAudioRun:timestamp: * * The timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("assigned timestamp"), i18n_pspec("the timestamp"), AGS_TYPE_TIMESTAMP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) record_midi_audio_run; recall->resolve_dependency = ags_record_midi_audio_run_resolve_dependency; recall->run_init_pre = ags_record_midi_audio_run_run_init_pre; recall->run_pre = ags_record_midi_audio_run_run_pre; } void ags_record_midi_audio_run_init(AgsRecordMidiAudioRun *record_midi_audio_run) { ags_recall_set_ability_flags((AgsRecall *) record_midi_audio_run, (AGS_SOUND_ABILITY_NOTATION)); AGS_RECALL(record_midi_audio_run)->name = "ags-record-midi"; AGS_RECALL(record_midi_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(record_midi_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(record_midi_audio_run)->xml_type = "ags-record-midi-audio-run"; AGS_RECALL(record_midi_audio_run)->port = NULL; record_midi_audio_run->delay_audio_run = NULL; record_midi_audio_run->count_beats_audio_run = NULL; record_midi_audio_run->note = NULL; record_midi_audio_run->timestamp = ags_timestamp_new(); record_midi_audio_run->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); record_midi_audio_run->timestamp->flags |= AGS_TIMESTAMP_OFFSET; record_midi_audio_run->timestamp->timer.ags_offset.offset = 0; record_midi_audio_run->midi_file = NULL; } void ags_record_midi_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecordMidiAudioRun *record_midi_audio_run; GRecMutex *recall_mutex; record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(record_midi_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *delay_audio_run, *old_delay_audio_run; gboolean is_template; delay_audio_run = g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(delay_audio_run == record_midi_audio_run->delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio_run->delay_audio_run != NULL){ old_delay_audio_run = record_midi_audio_run->delay_audio_run; g_object_unref(G_OBJECT(record_midi_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(delay_audio_run); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) record_midi_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(record_midi_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(record_midi_audio_run), recall_dependency); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); record_midi_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(record_midi_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); } } } break; case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run == record_midi_audio_run->count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if((AGS_RECALL_TEMPLATE & (AGS_RECALL(record_midi_audio_run)->flags)) != 0){ is_template = TRUE; }else{ is_template = FALSE; } if(record_midi_audio_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = record_midi_audio_run->count_beats_audio_run; g_object_unref(G_OBJECT(record_midi_audio_run->count_beats_audio_run)); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } record_midi_audio_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* check template */ if(count_beats_audio_run != NULL && ags_recall_test_flags((AgsRecall *) record_midi_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* dependency - remove */ if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(record_midi_audio_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(record_midi_audio_run), recall_dependency); } } /* dependency - add */ if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(record_midi_audio_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(timestamp == record_midi_audio_run->timestamp){ g_rec_mutex_unlock(recall_mutex); return; } if(record_midi_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(record_midi_audio_run->timestamp)); } if(timestamp != NULL){ g_object_ref(timestamp); } record_midi_audio_run->timestamp = timestamp; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_record_midi_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecordMidiAudioRun *record_midi_audio_run; GRecMutex *recall_mutex; record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(record_midi_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(record_midi_audio_run->delay_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(record_midi_audio_run->count_beats_audio_run)); g_rec_mutex_unlock(recall_mutex); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, G_OBJECT(record_midi_audio_run->timestamp)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_record_midi_audio_run_dispose(GObject *gobject) { AgsRecordMidiAudioRun *record_midi_audio_run; record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(gobject); /* delay audio run */ if(record_midi_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(record_midi_audio_run->delay_audio_run)); record_midi_audio_run->delay_audio_run = NULL; } /* count beats audio run */ if(record_midi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(record_midi_audio_run->count_beats_audio_run)); record_midi_audio_run->count_beats_audio_run = NULL; } g_list_free_full(record_midi_audio_run->note, g_object_unref); record_midi_audio_run->note = NULL; /* call parent */ G_OBJECT_CLASS(ags_record_midi_audio_run_parent_class)->dispose(gobject); } void ags_record_midi_audio_run_finalize(GObject *gobject) { AgsRecordMidiAudioRun *record_midi_audio_run; record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(gobject); /* delay audio run */ if(record_midi_audio_run->delay_audio_run != NULL){ g_object_unref(G_OBJECT(record_midi_audio_run->delay_audio_run)); } /* count beats audio run */ if(record_midi_audio_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(record_midi_audio_run->count_beats_audio_run)); } /* timestamp */ if(record_midi_audio_run->timestamp != NULL){ g_object_unref(G_OBJECT(record_midi_audio_run->timestamp)); } g_list_free_full(record_midi_audio_run->note, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_record_midi_audio_run_parent_class)->finalize(gobject); } void ags_record_midi_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallID *recall_id; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); list = list_start; delay_audio_run = NULL; count_beats_audio_run = NULL; i_stop = 2; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; }else if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); /* unref */ g_object_unref(recall_id); g_object_unref(recall_container); } void ags_record_midi_audio_run_run_init_pre(AgsRecall *recall) { AgsAudio *audio; AgsPort *port; AgsRecordMidiAudio *record_midi_audio; AgsRecordMidiAudioRun *record_midi_audio_run; GObject *input_sequencer; gchar *filename; gboolean playback, record; GValue value = {0,}; void (*parent_class_run_init_pre)(AgsRecall *recall); record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_record_midi_audio_run_parent_class)->run_init_pre; /* get some fields */ g_object_get(record_midi_audio_run, "audio", &audio, "recall-audio", &record_midi_audio, NULL); g_object_get(audio, "input-sequencer", &input_sequencer, NULL); if(input_sequencer == NULL){ g_object_unref(audio); g_object_unref(record_midi_audio); return; } /* midi file */ if(record_midi_audio_run->midi_file != NULL){ g_object_unref(record_midi_audio_run->midi_file); } /* get filename */ g_object_get(record_midi_audio, "filename", &port, NULL); g_value_init(&value, G_TYPE_POINTER); ags_port_safe_read(port, &value); filename = g_value_get_pointer(&value); g_value_unset(&value); g_object_unref(port); /* instantiate midi file and open rw */ record_midi_audio_run->midi_file = (GObject *) ags_midi_file_new(filename); ags_midi_file_rw_open((AgsMidiFile *) record_midi_audio_run->midi_file, filename, TRUE); /* call parent */ parent_class_run_init_pre(recall); /* unref */ g_object_unref(audio); g_object_unref(record_midi_audio); g_free(filename); } void ags_record_midi_audio_run_run_pre(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; AgsNotation *notation; AgsPort *port; AgsRecordMidiAudio *record_midi_audio; AgsRecordMidiAudioRun *record_midi_audio_run; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsTimestamp *timestamp; GObject *input_sequencer; GList *start_list, *list; GList *note, *note_next; unsigned char *midi_buffer; gdouble delay_factor; glong division, tempo, bpm; guint64 notation_counter; gboolean reverse_mapping; gboolean pattern_mode; gboolean playback, record; guint midi_channel; guint audio_start_mapping; guint midi_start_mapping, midi_end_mapping; guint input_pads; guint audio_channel; guint buffer_length; guint i; GValue value = {0,}; void (*parent_class_run_pre)(AgsRecall *recall); GRecMutex *audio_mutex; record_midi_audio_run = AGS_RECORD_MIDI_AUDIO_RUN(recall); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_record_midi_audio_run_parent_class)->run_pre; /* get some fields */ g_object_get(record_midi_audio_run, "audio-channel", &audio_channel, "audio", &audio, "recall-audio", &record_midi_audio, "delay-audio-run", &delay_audio_run, "count-beats-audio-run", &count_beats_audio_run, "timestamp", ×tamp, NULL); g_object_get(audio, "input-sequencer", &input_sequencer, NULL); if(input_sequencer == NULL){ g_object_unref(audio); g_object_unref(record_midi_audio); g_object_unref(delay_audio_run); g_object_unref(count_beats_audio_run); g_object_unref(timestamp); return; } delay_factor = ags_sequencer_get_delay_factor(AGS_SEQUENCER(input_sequencer)); /* get audio fields */ pattern_mode = ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_PATTERN_MODE); reverse_mapping = ags_audio_test_behaviour_flags(audio, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING); g_object_get(audio, "input-pads", &input_pads, "audio-start-mapping", &audio_start_mapping, "midi-start-mapping", &midi_start_mapping, "midi-end-mapping", &midi_end_mapping, "midi-channel", &midi_channel, "notation", &start_list, NULL); /* get sequencer specific data */ bpm = ags_sequencer_get_bpm(AGS_SEQUENCER(input_sequencer)); /* get notation */ g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); ags_timestamp_set_ags_offset(timestamp, AGS_NOTATION_DEFAULT_OFFSET * floor(notation_counter / AGS_NOTATION_DEFAULT_OFFSET)); notation = NULL; list = ags_notation_find_near_timestamp(start_list, audio_channel, timestamp); if(list != NULL){ notation = list->data; } /* get mode */ g_object_get(record_midi_audio, "playback", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); playback = g_value_get_boolean(&value); g_value_reset(&value); g_object_unref(port); g_object_get(record_midi_audio, "record", &port, NULL); ags_port_safe_read(port, &value); record = g_value_get_boolean(&value); g_object_unref(port); /* delta time specific fields */ g_value_unset(&value); g_value_init(&value, G_TYPE_INT64); g_object_get(record_midi_audio, "division", &port, NULL); ags_port_safe_read(port, &value); division = g_value_get_int64(&value); g_value_reset(&value); g_object_unref(port); ags_port_safe_read(record_midi_audio->tempo, &value); tempo = g_value_get_int64(&value); g_value_reset(&value); g_object_get(record_midi_audio, "bpm", &port, NULL); ags_port_safe_read(port, &value); bpm = g_value_get_int64(&value); g_value_unset(&value); g_object_unref(port); /* retrieve buffer */ midi_buffer = ags_sequencer_get_buffer(AGS_SEQUENCER(input_sequencer), &buffer_length); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* playback */ ags_sequencer_lock_buffer(AGS_SEQUENCER(input_sequencer), midi_buffer); if(midi_buffer != NULL){ if(playback){ unsigned char *midi_iter; /* parse bytes */ midi_iter = midi_buffer; while(midi_iter < midi_buffer + buffer_length){ #ifdef AGS_DEBUG g_message("0x%x", *midi_iter); #endif if(ags_midi_util_is_key_on(midi_iter)){ AgsNote *current_note; /* key on - check within mapping */ if(midi_channel == (0x0f & midi_iter[0])){ if(midi_start_mapping <= (0x7f & midi_iter[1]) && ((reverse_mapping && input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1 > 0) || (!reverse_mapping && (0x7f & midi_iter[1]) - midi_start_mapping < midi_end_mapping))){ current_note = NULL; note = record_midi_audio_run->note; while(note != NULL){ guint note_y; g_object_get(note->data, "y", ¬e_y, NULL); /* check current notes */ if(reverse_mapping){ if(note_y == input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1){ current_note = note->data; break; } }else{ if(note_y == (0x7f & midi_iter[1]) - midi_start_mapping){ current_note = note->data; break; } } note = note->next; } /* add note */ if(current_note == NULL){ if((0x7f & (midi_iter[2])) != 0){ current_note = ags_note_new(); current_note->x[0] = notation_counter; current_note->x[1] = notation_counter + 1; if(reverse_mapping){ current_note->y = input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1; }else{ current_note->y = (0x7f & midi_iter[1]) - midi_start_mapping; } /* velocity */ #if 0 current_note->attack.imag = (gdouble) (0x7f & (midi_iter[2])) / 127.0; #endif #ifdef AGS_DEBUG g_message("add %d", current_note->y); #endif if(!pattern_mode){ record_midi_audio_run->note = g_list_prepend(record_midi_audio_run->note, current_note); g_object_ref(current_note); ags_note_set_flags(current_note, AGS_NOTE_FEED); } if(notation == NULL){ notation = ags_notation_new((GObject *) audio, audio_channel); ags_timestamp_set_ags_offset(notation->timestamp, ags_timestamp_get_ags_offset(timestamp)); ags_audio_add_notation(audio, (GObject *) notation); } ags_notation_add_note(notation, current_note, FALSE); } }else{ if((0x7f & (midi_iter[2])) == 0){ /* note-off */ ags_note_unset_flags(current_note, AGS_NOTE_FEED); /* velocity */ #if 0 current_note->release.imag = (gdouble) (0x7f & (midi_iter[2])) / 127.0; #endif record_midi_audio_run->note = g_list_remove(record_midi_audio_run->note, current_note); g_object_unref(current_note); #ifdef AGS_DEBUG g_message("remove %d", current_note->y); #endif }else{ g_object_set(current_note, "x1", notation_counter + 1, NULL); #ifdef AGS_DEBUG g_message("count %d", current_note->y); #endif } } } } midi_iter += 3; }else if(ags_midi_util_is_key_off(midi_iter)){ AgsNote *current_note; if(midi_channel == (0x0f & midi_iter[0])){ /* key off - find matching note */ current_note = NULL; note = record_midi_audio_run->note; while(note != NULL){ guint note_y; g_object_get(note->data, "y", ¬e_y, NULL); /* check current notes */ if(reverse_mapping){ if(note_y == input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1){ current_note = note->data; break; } }else{ if(note_y == (0x7f & midi_iter[1]) - midi_start_mapping){ current_note = note->data; break; } } note = note->next; } /* remove current note */ if(current_note != NULL){ /* velocity */ #if 0 current_note->release.imag = (gdouble) (0x7f & (midi_iter[2])) / 127.0; #endif ags_note_unset_flags(current_note, AGS_NOTE_FEED); record_midi_audio_run->note = g_list_remove(record_midi_audio_run->note, current_note); g_object_unref(current_note); #ifdef AGS_DEBUG g_message("remove %d", current_note->y); #endif } } midi_iter += 3; }else if(ags_midi_util_is_key_pressure(midi_iter)){ AgsNote *current_note; if(midi_channel == (0x0f & midi_iter[0])){ /* key pressure */ current_note = NULL; note = record_midi_audio_run->note; while(note != NULL){ guint note_y; g_object_get(note->data, "y", ¬e_y, NULL); /* check current notes */ if(reverse_mapping){ if(note_y == input_pads - ((0x7f & midi_iter[1]) - midi_start_mapping) - 1){ current_note = note->data; break; } }else{ if(note_y == (0x7f & midi_iter[1]) - midi_start_mapping){ current_note = note->data; break; } } note = note->next; } /* feed note */ if(current_note != NULL){ g_object_set(current_note, "x1", notation_counter + 1, NULL); #ifdef AGS_DEBUG g_message("count %d", current_note->y); #endif } } midi_iter += 3; }else if(ags_midi_util_is_change_parameter(midi_iter)){ /* change parameter */ //TODO:JK: implement me midi_iter += 3; }else if(ags_midi_util_is_pitch_bend(midi_iter)){ /* change parameter */ //TODO:JK: implement me midi_iter += 3; }else if(ags_midi_util_is_change_program(midi_iter)){ /* change program */ //TODO:JK: implement me midi_iter += 2; }else if(ags_midi_util_is_change_pressure(midi_iter)){ /* change pressure */ //TODO:JK: implement me midi_iter += 2; }else if(ags_midi_util_is_sysex(midi_iter)){ guint n; /* sysex */ n = 0; while(midi_iter[n] != 0xf7){ n++; } //TODO:JK: implement me midi_iter += (n + 1); }else if(ags_midi_util_is_song_position(midi_iter)){ /* song position */ //TODO:JK: implement me midi_iter += 3; }else if(ags_midi_util_is_song_select(midi_iter)){ /* song select */ //TODO:JK: implement me midi_iter += 2; }else if(ags_midi_util_is_tune_request(midi_iter)){ /* tune request */ //TODO:JK: implement me midi_iter += 1; }else if(ags_midi_util_is_meta_event(midi_iter)){ /* meta event */ //TODO:JK: implement me midi_iter += (3 + midi_iter[2]); }else{ g_warning("ags_record_midi_audio_run.c - unexpected byte %x", midi_iter[0]); midi_iter++; } } /* feed notes */ note = record_midi_audio_run->note; while(note != NULL){ AgsNote *current_note; current_note = note->data; g_object_set(current_note, "x1", notation_counter + 1, NULL); #ifdef AGS_DEBUG g_message("count %d", current_note->y); #endif note = note->next; } } /* record */ if(record){ unsigned char *smf_buffer; glong delta_time; guint smf_buffer_length; delta_time = ags_midi_util_offset_to_delta_time(delay_factor, division, tempo, bpm, notation_counter); smf_buffer = ags_midi_util_to_smf(midi_buffer, buffer_length, delta_time, &smf_buffer_length); ags_midi_file_write((AgsMidiFile *) record_midi_audio_run->midi_file, smf_buffer, smf_buffer_length); } } ags_sequencer_unlock_buffer(AGS_SEQUENCER(input_sequencer), midi_buffer); /* call parent */ parent_class_run_pre(recall); /* unref */ g_object_unref(audio); g_object_unref(record_midi_audio); g_object_unref(delay_audio_run); g_object_unref(count_beats_audio_run); g_object_unref(timestamp); g_list_free_full(start_list, g_object_unref); } /** * ags_record_midi_audio_run_new: * @audio: the #AgsAudio * @delay_audio_run: the #AgsDelayAudioRun dependency * @count_beats_audio_run: the #AgsCountBeatsAudioRun dependency * * Create a new instance of #AgsRecordMidiAudioRun * * Returns: the new #AgsRecordMidiAudioRun * * Since: 3.0.0 */ AgsRecordMidiAudioRun* ags_record_midi_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsRecordMidiAudioRun *record_midi_audio_run; record_midi_audio_run = (AgsRecordMidiAudioRun *) g_object_new(AGS_TYPE_RECORD_MIDI_AUDIO_RUN, "audio", audio, "delay-audio-run", delay_audio_run, "count-beats-audio-run", count_beats_audio_run, NULL); return(record_midi_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_prepare_recycling.c0000644000175000017500000000745413607210263020422 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_prepare_recycling_class_init(AgsPrepareRecyclingClass *prepare_recycling); void ags_prepare_recycling_init(AgsPrepareRecycling *prepare_recycling); void ags_prepare_recycling_finalize(GObject *gobject); /** * SECTION:ags_prepare_recycling * @short_description: prepares recycling * @title: AgsPrepareRecycling * @section_id: * @include: ags/audio/recall/ags_prepare_recycling.h * * The #AgsPrepareRecycling class prepares the recycling. */ static gpointer ags_prepare_recycling_parent_class = NULL; GType ags_prepare_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_prepare_recycling = 0; static const GTypeInfo ags_prepare_recycling_info = { sizeof (AgsPrepareRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_prepare_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPrepareRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_prepare_recycling_init, }; ags_type_prepare_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsPrepareRecycling", &ags_prepare_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_prepare_recycling); } return g_define_type_id__volatile; } void ags_prepare_recycling_class_init(AgsPrepareRecyclingClass *prepare_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_prepare_recycling_parent_class = g_type_class_peek_parent(prepare_recycling); /* GObjectClass */ gobject = (GObjectClass *) prepare_recycling; gobject->finalize = ags_prepare_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) prepare_recycling; } void ags_prepare_recycling_init(AgsPrepareRecycling *prepare_recycling) { AGS_RECALL(prepare_recycling)->name = "ags-prepare"; AGS_RECALL(prepare_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(prepare_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(prepare_recycling)->xml_type = "ags-prepare-recycling"; AGS_RECALL(prepare_recycling)->port = NULL; AGS_RECALL(prepare_recycling)->child_type = AGS_TYPE_PREPARE_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(prepare_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_prepare_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_prepare_recycling_parent_class)->finalize(gobject); } /** * ags_prepare_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsPrepareRecycling * * Returns: the new #AgsPrepareRecycling * * Since: 3.0.0 */ AgsPrepareRecycling* ags_prepare_recycling_new(AgsRecycling *source) { AgsPrepareRecycling *prepare_recycling; prepare_recycling = (AgsPrepareRecycling *) g_object_new(AGS_TYPE_PREPARE_RECYCLING, "source", source, NULL); return(prepare_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_copy_recycling.c0000644000175000017500000000745613607210263017740 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_copy_recycling_class_init(AgsCopyRecyclingClass *copy_recycling); void ags_copy_recycling_init(AgsCopyRecycling *copy_recycling); void ags_copy_recycling_finalize(GObject *gobject); /** * SECTION:ags_copy_recycling * @short_description: copy recycling * @title: AgsCopyRecycling * @section_id: * @include: ags/audio/recall/ags_copy_recycling.h * * The #AgsCopyRecycling class copies the recycling. */ static gpointer ags_copy_recycling_parent_class = NULL; GType ags_copy_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_recycling = 0; static const GTypeInfo ags_copy_recycling_info = { sizeof(AgsCopyRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCopyRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_recycling_init, }; ags_type_copy_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsCopyRecycling", &ags_copy_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_recycling); } return g_define_type_id__volatile; } void ags_copy_recycling_class_init(AgsCopyRecyclingClass *copy_recycling) { GObjectClass *gobject; AgsRecallClass *recall; ags_copy_recycling_parent_class = g_type_class_peek_parent(copy_recycling); /* GObjectClass */ gobject = (GObjectClass *) copy_recycling; gobject->finalize = ags_copy_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) copy_recycling; } void ags_copy_recycling_init(AgsCopyRecycling *copy_recycling) { AGS_RECALL(copy_recycling)->name = "ags-copy"; AGS_RECALL(copy_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_recycling)->xml_type = "ags-copy-recycling"; AGS_RECALL(copy_recycling)->port = NULL; AGS_RECALL(copy_recycling)->child_type = AGS_TYPE_COPY_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(copy_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_DESTINATION); } void ags_copy_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_copy_recycling_parent_class)->finalize(gobject); } /** * ags_copy_recycling_new: * @destination: the destination #AgsRecycling * @source: the source #AgsRecycling * * Create a new instance of #AgsCopyRecycling * * Returns: the new #AgsCopyRecycling * * Since: 3.0.0 */ AgsCopyRecycling* ags_copy_recycling_new(AgsRecycling *destination, AgsRecycling *source) { AgsCopyRecycling *copy_recycling; copy_recycling = (AgsCopyRecycling *) g_object_new(AGS_TYPE_COPY_RECYCLING, "destination", destination, "source", source, NULL); return(copy_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_play_audio.h0000644000175000017500000000373313607210263017054 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_AUDIO_H__ #define __AGS_PLAY_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_AUDIO (ags_play_audio_get_type()) #define AGS_PLAY_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_AUDIO, AgsPlayAudio)) #define AGS_PLAY_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_AUDIO, AgsPlayAudio)) #define AGS_IS_PLAY_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_AUDIO)) #define AGS_IS_PLAY_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_AUDIO)) #define AGS_PLAY_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_AUDIO, AgsPlayAudioClass)) typedef struct _AgsPlayAudio AgsPlayAudio; typedef struct _AgsPlayAudioClass AgsPlayAudioClass; struct _AgsPlayAudio { AgsRecallAudio recall_audio; AgsPort *muted; }; struct _AgsPlayAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_play_audio_get_type(); AgsPlayAudio* ags_play_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_PLAY_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_route_lv2_audio.c0000644000175000017500000002357613607210263020032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_route_lv2_audio_class_init(AgsRouteLv2AudioClass *route_lv2_audio); void ags_route_lv2_audio_init(AgsRouteLv2Audio *route_lv2_audio); void ags_route_lv2_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_route_lv2_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_route_lv2_audio_dispose(GObject *gobject); void ags_route_lv2_audio_finalize(GObject *gobject); /** * SECTION:ags_route_lv2_audio * @short_description: route MIDI to LV2 * @title: AgsRouteLv2Audio * @section_id: * @include: ags/audio/recall/ags_route_lv2_audio.h * * The #AgsRouteLv2Audio class provides ports to the effect processor. */ enum{ PROP_0, PROP_NOTATION_INPUT, PROP_SEQUENCER_INPUT, }; static gpointer ags_route_lv2_audio_parent_class = NULL; static const gchar *ags_route_lv2_audio_plugin_name = "ags-route-lv2"; static const gchar *ags_route_lv2_audio_specifier[] = { "./notation-input[0]", "./sequencer-input[0]", }; static const gchar *ags_route_lv2_audio_control_port[] = { "1/2", "2/2", }; GType ags_route_lv2_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_route_lv2_audio; static const GTypeInfo ags_route_lv2_audio_info = { sizeof (AgsRouteLv2AudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_route_lv2_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRouteLv2Audio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_route_lv2_audio_init, }; ags_type_route_lv2_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsRouteLv2Audio", &ags_route_lv2_audio_info, 0); g_once_init_leave (&g_define_type_id__volatile, ags_type_route_lv2_audio); } return g_define_type_id__volatile; } void ags_route_lv2_audio_class_init(AgsRouteLv2AudioClass *route_lv2_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_route_lv2_audio_parent_class = g_type_class_peek_parent(route_lv2_audio); gobject = (GObjectClass *) route_lv2_audio; gobject->set_property = ags_route_lv2_audio_set_property; gobject->get_property = ags_route_lv2_audio_get_property; gobject->dispose = ags_route_lv2_audio_dispose; gobject->finalize = ags_route_lv2_audio_finalize; /* properties */ /** * AgsRouteLv2Audio:notation-input: * * If enabled input is taken of #AgsNotation. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-input", i18n_pspec("route notation input"), i18n_pspec("Route notation as input to the LV2 recall"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_INPUT, param_spec); /** * AgsRouteLv2Audio:sequencer-input: * * If enabled input is taken of #AgsSequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer-input", i18n_pspec("route sequencer input"), i18n_pspec("Route sequencer as input to the LV2 recall"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_INPUT, param_spec); } void ags_route_lv2_audio_init(AgsRouteLv2Audio *route_lv2_audio) { GList *port; AGS_RECALL(route_lv2_audio)->name = "ags-count-beats"; AGS_RECALL(route_lv2_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(route_lv2_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(route_lv2_audio)->xml_type = "ags-count-beats-audio"; port = NULL; /* notation input */ route_lv2_audio->notation_input = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_route_lv2_audio_plugin_name, "specifier", ags_route_lv2_audio_specifier[0], "control-port", ags_route_lv2_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(route_lv2_audio->notation_input); route_lv2_audio->notation_input->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, route_lv2_audio->notation_input); g_object_ref(route_lv2_audio->notation_input); /* sequencer input */ route_lv2_audio->sequencer_input = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_route_lv2_audio_plugin_name, "specifier", ags_route_lv2_audio_specifier[1], "control-port", ags_route_lv2_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(route_lv2_audio->sequencer_input); route_lv2_audio->sequencer_input->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, route_lv2_audio->sequencer_input); g_object_ref(route_lv2_audio->sequencer_input); /* set port */ AGS_RECALL(route_lv2_audio)->port = port; } void ags_route_lv2_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRouteLv2Audio *route_lv2_audio; GRecMutex *recall_mutex; route_lv2_audio = AGS_ROUTE_LV2_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_lv2_audio); switch(prop_id){ case PROP_NOTATION_INPUT: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == route_lv2_audio->notation_input){ g_rec_mutex_unlock(recall_mutex); return; } if(route_lv2_audio->notation_input != NULL){ g_object_unref(G_OBJECT(route_lv2_audio->notation_input)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } route_lv2_audio->notation_input = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_INPUT: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == route_lv2_audio->sequencer_input){ g_rec_mutex_unlock(recall_mutex); return; } if(route_lv2_audio->sequencer_input != NULL){ g_object_unref(G_OBJECT(route_lv2_audio->sequencer_input)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } route_lv2_audio->sequencer_input = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_lv2_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRouteLv2Audio *route_lv2_audio; GRecMutex *recall_mutex; route_lv2_audio = AGS_ROUTE_LV2_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(route_lv2_audio); switch(prop_id){ case PROP_NOTATION_INPUT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, route_lv2_audio->notation_input); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_INPUT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, route_lv2_audio->sequencer_input); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_route_lv2_audio_dispose(GObject *gobject) { AgsRouteLv2Audio *route_lv2_audio; route_lv2_audio = AGS_ROUTE_LV2_AUDIO(gobject); /* notation input */ if(route_lv2_audio->notation_input != NULL){ g_object_unref(G_OBJECT(route_lv2_audio->notation_input)); route_lv2_audio->notation_input = NULL; } /* sequencer input */ if(route_lv2_audio->sequencer_input != NULL){ g_object_unref(G_OBJECT(route_lv2_audio->sequencer_input)); route_lv2_audio->sequencer_input = NULL; } /* call parent */ G_OBJECT_CLASS(ags_route_lv2_audio_parent_class)->dispose(gobject); } void ags_route_lv2_audio_finalize(GObject *gobject) { AgsRouteLv2Audio *route_lv2_audio; route_lv2_audio = AGS_ROUTE_LV2_AUDIO(gobject); /* notation input */ if(route_lv2_audio->notation_input != NULL){ g_object_unref(G_OBJECT(route_lv2_audio->notation_input)); } /* sequencer input */ if(route_lv2_audio->sequencer_input != NULL){ g_object_unref(G_OBJECT(route_lv2_audio->sequencer_input)); } /* call parent */ G_OBJECT_CLASS(ags_route_lv2_audio_parent_class)->finalize(gobject); } /** * ags_route_lv2_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsRouteLv2Audio * * Returns: the new #AgsRouteLv2Audio * * Since: 3.0.0 */ AgsRouteLv2Audio* ags_route_lv2_audio_new(AgsAudio *audio) { AgsRouteLv2Audio *route_lv2_audio; route_lv2_audio = (AgsRouteLv2Audio *) g_object_new(AGS_TYPE_ROUTE_LV2_AUDIO, "audio", audio, NULL); return(route_lv2_audio); } gsequencer-3.1.3/ags/audio/recall/ags_prepare_channel.c0000644000175000017500000000666213607210263020053 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_prepare_channel_class_init(AgsPrepareChannelClass *prepare_channel); void ags_prepare_channel_init(AgsPrepareChannel *prepare_channel); void ags_prepare_channel_finalize(GObject *gobject); /** * SECTION:ags_prepare_channel * @short_description: prepares channel * @title: AgsPrepareChannel * @section_id: * @include: ags/audio/recall/ags_prepare_channel.h * * The #AgsPrepareChannel class provides ports to the effect processor. */ static gpointer ags_prepare_channel_parent_class = NULL; static const gchar *ags_prepare_channel_plugin_name = "ags-prepare"; GType ags_prepare_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_prepare_channel = 0; static const GTypeInfo ags_prepare_channel_info = { sizeof (AgsPrepareChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_prepare_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPrepareChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_prepare_channel_init, }; ags_type_prepare_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsPrepareChannel", &ags_prepare_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_prepare_channel); } return g_define_type_id__volatile; } void ags_prepare_channel_class_init(AgsPrepareChannelClass *prepare_channel) { GObjectClass *gobject; ags_prepare_channel_parent_class = g_type_class_peek_parent(prepare_channel); /* GObjectClass */ gobject = (GObjectClass *) prepare_channel; gobject->finalize = ags_prepare_channel_finalize; } void ags_prepare_channel_init(AgsPrepareChannel *prepare_channel) { AGS_RECALL(prepare_channel)->name = "ags-prepare"; AGS_RECALL(prepare_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(prepare_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(prepare_channel)->xml_type = "ags-prepare-channel"; } void ags_prepare_channel_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_prepare_channel_parent_class)->finalize(gobject); } /** * ags_prepare_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsPrepareChannel * * Returns: the new #AgsPrepareChannel * * Since: 3.0.0 */ AgsPrepareChannel* ags_prepare_channel_new(AgsChannel *source) { AgsPrepareChannel *prepare_channel; prepare_channel = (AgsPrepareChannel *) g_object_new(AGS_TYPE_PREPARE_CHANNEL, "source", source, NULL); return(prepare_channel); } gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_channel_run.c0000644000175000017500000007215713607210263022012 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_copy_pattern_channel_run_class_init(AgsCopyPatternChannelRunClass *copy_pattern_channel_run); void ags_copy_pattern_channel_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_copy_pattern_channel_run_init(AgsCopyPatternChannelRun *copy_pattern_channel_run); void ags_copy_pattern_channel_run_dispose(GObject *gobject); void ags_copy_pattern_channel_run_finalize(GObject *gobject); void ags_copy_pattern_channel_run_notify_recall_audio_run(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_copy_pattern_channel_run_notify_recall_audio_run_after(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_copy_pattern_channel_run_notify_delay_audio_run(GObject *gobject, GParamSpec *pspec, AgsCopyPatternChannelRun *copy_pattern_channel_run); void ags_copy_pattern_channel_run_notify_delay_audio_run_after(GObject *gobject, GParamSpec *pspec, AgsCopyPatternChannelRun *copy_pattern_channel_run); void ags_copy_pattern_channel_run_connect(AgsConnectable *connectable); void ags_copy_pattern_channel_run_disconnect(AgsConnectable *connectable); void ags_copy_pattern_channel_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_copy_pattern_channel_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_copy_pattern_channel_run_run_init_pre(AgsRecall *recall); void ags_copy_pattern_channel_run_done(AgsRecall *recall); void ags_copy_pattern_channel_run_sequencer_alloc_callback(AgsDelayAudioRun *delay_audio_run, guint run_order, gdouble delay, guint attack, AgsCopyPatternChannelRun *copy_pattern_channel_run); /** * SECTION:ags_copy_pattern_channel_run * @short_description: copys pattern * @title: AgsCopyPatternChannelRun * @section_id: * @include: ags/audio/recall/ags_copy_pattern_channel_run.h * * The #AgsCopyPatternChannelRun class copys pattern. */ static gpointer ags_copy_pattern_channel_run_parent_class = NULL; static AgsConnectableInterface* ags_copy_pattern_channel_run_parent_connectable_interface; GType ags_copy_pattern_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_pattern_channel_run = 0; static const GTypeInfo ags_copy_pattern_channel_run_info = { sizeof (AgsCopyPatternChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_pattern_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCopyPatternChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_pattern_channel_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_copy_pattern_channel_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_copy_pattern_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsCopyPatternChannelRun", &ags_copy_pattern_channel_run_info, 0); g_type_add_interface_static(ags_type_copy_pattern_channel_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_pattern_channel_run); } return g_define_type_id__volatile; } void ags_copy_pattern_channel_run_class_init(AgsCopyPatternChannelRunClass *copy_pattern_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_copy_pattern_channel_run_parent_class = g_type_class_peek_parent(copy_pattern_channel_run); /* GObjectClass */ gobject = (GObjectClass *) copy_pattern_channel_run; gobject->dispose = ags_copy_pattern_channel_run_dispose; gobject->finalize = ags_copy_pattern_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) copy_pattern_channel_run; recall->run_init_pre = ags_copy_pattern_channel_run_run_init_pre; recall->done = ags_copy_pattern_channel_run_done; } void ags_copy_pattern_channel_run_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_copy_pattern_channel_run_connectable_parent_interface; ags_copy_pattern_channel_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_copy_pattern_channel_run_connect; connectable->disconnect = ags_copy_pattern_channel_run_disconnect; connectable->connect_connection = ags_copy_pattern_channel_run_connect_connection; connectable->disconnect_connection = ags_copy_pattern_channel_run_disconnect_connection; } void ags_copy_pattern_channel_run_init(AgsCopyPatternChannelRun *copy_pattern_channel_run) { ags_recall_set_ability_flags((AgsRecall *) copy_pattern_channel_run, (AGS_SOUND_ABILITY_SEQUENCER)); // g_signal_connect(copy_pattern_channel_run, "notify::recall-audio-run", // G_CALLBACK(ags_copy_pattern_channel_run_notify_recall_audio_run), NULL); g_signal_connect_after(copy_pattern_channel_run, "notify::recall-audio-run", G_CALLBACK(ags_copy_pattern_channel_run_notify_recall_audio_run_after), NULL); /* */ AGS_RECALL(copy_pattern_channel_run)->name = "ags-copy-pattern"; AGS_RECALL(copy_pattern_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_pattern_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_pattern_channel_run)->xml_type = "ags-copy-pattern-channel-run"; AGS_RECALL(copy_pattern_channel_run)->port = NULL; AGS_RECALL(copy_pattern_channel_run)->child_type = G_TYPE_NONE; copy_pattern_channel_run->note = NULL; } void ags_copy_pattern_channel_run_dispose(GObject *gobject) { AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = (AgsCopyPatternChannelRun *) gobject; /* note */ g_list_free_full(copy_pattern_channel_run->note, g_object_unref); copy_pattern_channel_run->note = NULL; /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_channel_run_parent_class)->dispose(gobject); } void ags_copy_pattern_channel_run_finalize(GObject *gobject) { AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = (AgsCopyPatternChannelRun *) gobject; /* note */ g_list_free_full(copy_pattern_channel_run->note, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_channel_run_parent_class)->finalize(gobject); } void ags_copy_pattern_channel_run_notify_recall_audio_run(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(gobject); g_object_get(copy_pattern_channel_run, "recall-audio-run", ©_pattern_audio_run, NULL); if(copy_pattern_audio_run != NULL){ AgsDelayAudioRun *delay_audio_run; // g_object_disconnect(copy_pattern_audio_run, // "any_signal::notify::delay-audio-run", // G_CALLBACK(ags_copy_pattern_channel_run_notify_delay_audio_run), // copy_pattern_channel_run, // NULL); g_object_disconnect(copy_pattern_audio_run, "any_signal::notify::delay-audio-run", G_CALLBACK(ags_copy_pattern_channel_run_notify_delay_audio_run_after), copy_pattern_channel_run, NULL); /* connection */ g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(delay_audio_run != NULL && ags_connectable_is_connected(AGS_CONNECTABLE(copy_pattern_channel_run))){ ags_copy_pattern_channel_run_disconnect_connection(AGS_CONNECTABLE(copy_pattern_channel_run), (GObject *) delay_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } g_object_unref(copy_pattern_audio_run); } } void ags_copy_pattern_channel_run_notify_recall_audio_run_after(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(gobject); g_object_get(copy_pattern_channel_run, "recall-audio-run", ©_pattern_audio_run, NULL); if(copy_pattern_audio_run != NULL){ AgsDelayAudioRun *delay_audio_run; // g_signal_connect(copy_pattern_audio_run, "notify::delay-audio-run", // G_CALLBACK(ags_copy_pattern_channel_run_notify_delay_audio_run), copy_pattern_channel_run); g_signal_connect_after(copy_pattern_audio_run, "notify::delay-audio-run", G_CALLBACK(ags_copy_pattern_channel_run_notify_delay_audio_run_after), copy_pattern_channel_run); /* connection */ g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(delay_audio_run != NULL && ags_connectable_is_connected(AGS_CONNECTABLE(copy_pattern_channel_run))){ ags_copy_pattern_channel_run_connect_connection(AGS_CONNECTABLE(copy_pattern_channel_run), (GObject *) delay_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } g_object_unref(copy_pattern_audio_run); } } void ags_copy_pattern_channel_run_notify_delay_audio_run(GObject *gobject, GParamSpec *pspec, AgsCopyPatternChannelRun *copy_pattern_channel_run) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsDelayAudioRun *delay_audio_run; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(gobject); g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(delay_audio_run != NULL && ags_connectable_is_connected(AGS_CONNECTABLE(copy_pattern_channel_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(copy_pattern_channel_run), (GObject *) delay_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_copy_pattern_channel_run_notify_delay_audio_run_after(GObject *gobject, GParamSpec *pspec, AgsCopyPatternChannelRun *copy_pattern_channel_run) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsDelayAudioRun *delay_audio_run; copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(gobject); g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(delay_audio_run != NULL && ags_connectable_is_connected(AGS_CONNECTABLE(copy_pattern_channel_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(copy_pattern_channel_run), (GObject *) delay_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_copy_pattern_channel_run_connect(AgsConnectable *connectable) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; GRecMutex *recall_mutex; if(ags_connectable_is_connected(connectable)){ return; } copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(connectable); ags_copy_pattern_channel_run_parent_connectable_interface->connect(connectable); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_channel_run); /* connection */ g_object_get(copy_pattern_channel_run, "recall-audio-run", ©_pattern_audio_run, NULL); if(copy_pattern_audio_run != NULL){ AgsDelayAudioRun *delay_audio_run; g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(delay_audio_run != NULL){ ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); g_object_unref(delay_audio_run); } g_object_unref(copy_pattern_audio_run); } } void ags_copy_pattern_channel_run_disconnect(AgsConnectable *connectable) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; GRecMutex *recall_mutex; if(!ags_connectable_is_connected(connectable)){ return; } copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(connectable); ags_copy_pattern_channel_run_parent_connectable_interface->disconnect(connectable); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_channel_run); /* connection */ g_object_get(copy_pattern_channel_run, "recall-audio-run", ©_pattern_audio_run, NULL); if(copy_pattern_audio_run != NULL){ AgsDelayAudioRun *delay_audio_run; g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if(delay_audio_run != NULL){ ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); g_object_unref(delay_audio_run); } g_object_unref(copy_pattern_audio_run); } } void ags_copy_pattern_channel_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(connectable); g_object_get(copy_pattern_channel_run, "recall-audio-run", ©_pattern_audio_run, NULL); if(copy_pattern_audio_run != NULL){ AgsDelayAudioRun *delay_audio_run; g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if((GObject *) delay_audio_run == connection){ g_signal_connect(G_OBJECT(delay_audio_run), "sequencer-alloc-input", G_CALLBACK(ags_copy_pattern_channel_run_sequencer_alloc_callback), copy_pattern_channel_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } g_object_unref(copy_pattern_audio_run); } } void ags_copy_pattern_channel_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(connectable); g_object_get(copy_pattern_channel_run, "recall-audio-run", ©_pattern_audio_run, NULL); if(copy_pattern_audio_run != NULL){ AgsDelayAudioRun *delay_audio_run; g_object_get(copy_pattern_audio_run, "delay-audio-run", &delay_audio_run, NULL); if((GObject *) delay_audio_run == connection){ g_object_disconnect(G_OBJECT(delay_audio_run), "any_signal::sequencer-alloc-input", G_CALLBACK(ags_copy_pattern_channel_run_sequencer_alloc_callback), copy_pattern_channel_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } g_object_unref(copy_pattern_audio_run); } } void ags_copy_pattern_channel_run_run_init_pre(AgsRecall *recall) { AgsChannel *source; AgsPattern *pattern; AgsNote *note; AgsPort *port; AgsCopyPatternChannel *copy_pattern_channel; AgsCopyPatternChannelRun *copy_pattern_channel_run; guint pad; guint i, i_stop; GValue pattern_value = { 0, }; void (*parent_class_run_init_pre)(AgsRecall *recall); GRecMutex *recall_mutex; GRecMutex *pattern_mutex; copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(recall); /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_copy_pattern_channel_run_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); /* get some fields */ g_object_get(copy_pattern_channel_run, "source", &source, "recall-channel", ©_pattern_channel, NULL); /* get AgsPattern */ g_object_get(copy_pattern_channel, "pattern", &port, NULL); g_value_init(&pattern_value, G_TYPE_POINTER); ags_port_safe_read(port, &pattern_value); pattern = g_value_get_pointer(&pattern_value); g_value_unset(&pattern_value); g_object_unref(port); /* add note */ g_object_get(source, "pad", &pad, NULL); /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* i stop */ g_rec_mutex_lock(pattern_mutex); i_stop = pattern->dim[2]; g_rec_mutex_unlock(pattern_mutex); for(i = 0; i < i_stop; i++){ note = ags_note_new(); note->x[0] = i; note->x[1] = i + 1; note->y = pad; copy_pattern_channel_run->note = g_list_prepend(copy_pattern_channel_run->note, note); // g_object_ref(note); } copy_pattern_channel_run->note = g_list_reverse(copy_pattern_channel_run->note); /* unref */ g_object_unref(source); g_object_unref(copy_pattern_channel); } void ags_copy_pattern_channel_run_done(AgsRecall *recall) { AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannelRun *copy_pattern_channel_run; AgsCountBeatsAudioRun *count_beats_audio_run; void (*parent_class_done)(AgsRecall *recall); GRecMutex *recall_mutex; copy_pattern_channel_run = AGS_COPY_PATTERN_CHANNEL_RUN(recall); /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get parent class */ parent_class_done = AGS_RECALL_CLASS(ags_copy_pattern_channel_run_parent_class)->done; /* get AgsCopyPatternAudioRun */ g_object_get(recall, "recall-audio-run", ©_pattern_audio_run, NULL); /* denotify dependency */ g_object_get(copy_pattern_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); ags_recall_notify_dependency((AgsRecall *) count_beats_audio_run, AGS_RECALL_NOTIFY_CHANNEL_RUN, FALSE); /* free notes */ g_rec_mutex_lock(recall_mutex); g_list_free_full(copy_pattern_channel_run->note, g_object_unref); copy_pattern_channel_run->note = NULL; g_rec_mutex_unlock(recall_mutex); /* call parent */ parent_class_done(recall); /* unref */ g_object_unref(copy_pattern_audio_run); g_object_unref(count_beats_audio_run); } void ags_copy_pattern_channel_run_sequencer_alloc_callback(AgsDelayAudioRun *delay_audio_run, guint run_order, gdouble delay, guint attack, AgsCopyPatternChannelRun *copy_pattern_channel_run) { AgsAudio *audio; AgsChannel *source; AgsPattern *pattern; AgsPort *port; AgsCopyPatternAudio *copy_pattern_audio; AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannel *copy_pattern_channel; AgsCountBeatsAudioRun *count_beats_audio_run; guint64 sequencer_counter; gboolean current_bit; GValue pattern_value = { 0, }; GValue i_value = { 0, }; GValue j_value = { 0, }; GRecMutex *pattern_mutex; if(delay != 0.0){ return; } g_object_get(copy_pattern_channel_run, "recall-audio", ©_pattern_audio, "recall-audio-run", ©_pattern_audio_run, "recall-channel", ©_pattern_channel, NULL); g_object_get(copy_pattern_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); /* get bank index 0 */ g_object_get(copy_pattern_audio, "bank-index-0", &port, NULL); g_value_init(&i_value, G_TYPE_FLOAT); ags_port_safe_read(port, &i_value); g_object_unref(port); /* get bank index 1 */ g_object_get(copy_pattern_audio, "bank-index-1", &port, NULL); g_value_init(&j_value, G_TYPE_FLOAT); ags_port_safe_read(port, &j_value); g_object_unref(port); /* get AgsPattern */ g_object_get(copy_pattern_channel, "pattern", &port, NULL); g_value_init(&pattern_value, G_TYPE_POINTER); ags_port_safe_read(port, &pattern_value); pattern = g_value_get_pointer(&pattern_value); g_object_unref(port); /* get pattern mutex */ pattern_mutex = AGS_PATTERN_GET_OBJ_MUTEX(pattern); /* write pattern port - current offset */ #if 0 g_object_set(pattern, "first-index", (guint) g_value_get_float(&i_value), "second-index", (guint) g_value_get_float(&j_value), NULL); #endif /* get sequencer counter */ g_object_get(count_beats_audio_run, "sequencer-counter", &sequencer_counter, NULL); /* read pattern port - current bit */ current_bit = ags_pattern_get_bit(pattern, (guint) g_value_get_float(&i_value), (guint) g_value_get_float(&j_value), (guint) sequencer_counter); g_value_unset(&pattern_value); g_value_unset(&i_value); g_value_unset(&j_value); /* */ if(current_bit){ AgsChannel *link; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling; AgsRecycling *end_recycling; AgsAudioSignal *audio_signal; AgsNote *note; AgsPreset *current_preset; GObject *output_soundcard; GList *preset_start, *preset; guint pad; guint audio_channel; guint note_offset; // g_message("ags_copy_pattern_channel_run_sequencer_alloc_callback - playing channel: %u; playing pattern: %u", // AGS_RECALL_CHANNEL(copy_pattern_channel)->source->line, // copy_pattern_audio_run->count_beats_audio_run->sequencer_counter); /* get audio */ g_object_get(copy_pattern_audio, "audio", &audio, NULL); /* get source */ g_object_get(copy_pattern_channel, "source", &source, NULL); /* get output soundcard */ g_object_get(copy_pattern_channel_run, "output-soundcard", &output_soundcard, NULL); note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); /* source fields */ g_object_get(source, "link", &link, "first-recycling", &first_recycling, "last-recycling", &last_recycling, "pad", &pad, "audio-channel", &audio_channel, NULL); recycling = first_recycling; g_object_ref(recycling); end_recycling = NULL; if(last_recycling != NULL){ end_recycling = ags_recycling_next(last_recycling); } /* find preset scope envelope */ current_preset = NULL; g_object_get(audio, "preset", &preset_start, NULL); preset = preset_start; while((preset = ags_preset_find_scope(preset, "ags-envelope")) != NULL){ guint audio_channel_start, audio_channel_end; guint pad_start, pad_end; guint x_start, x_end; g_object_get(preset->data, "audio-channel-start", &audio_channel_start, "audio-channel-end", &audio_channel_end, "pad-start", &pad_start, "pad-end", &pad_end, "x-start", &x_start, "x-end", &x_end, NULL); if(audio_channel >= audio_channel_start && audio_channel < audio_channel_end && pad >= pad_start && pad < pad_end && sequencer_counter >= x_start && sequencer_counter < x_end){ current_preset = preset->data; break; } preset = preset->next; } g_list_free_full(preset_start, g_object_unref); note = g_list_nth_data(copy_pattern_channel_run->note, sequencer_counter); g_object_set(note, "rt-attack", attack, NULL); /* create audio signals */ next_recycling = NULL; if(recycling != NULL){ AgsRecallID *child_recall_id; while(recycling != end_recycling){ AgsNote *copy_note; child_recall_id = AGS_RECALL(copy_pattern_channel_run)->recall_id; /* apply preset */ copy_note = ags_note_duplicate(note); g_object_set(copy_note, "x0", note_offset, "x1", note_offset + 1, NULL); if(current_preset != NULL){ AgsComplex *val; GValue value = {0,}; GError *error; ags_note_set_flags(copy_note, AGS_NOTE_ENVELOPE); /* get attack */ g_value_init(&value, AGS_TYPE_COMPLEX); error = NULL; ags_preset_get_parameter((AgsPreset *) current_preset, "attack", &value, &error); if(error == NULL){ g_object_set_property((GObject *) copy_note, "attack", &value); }else{ g_error_free(error); } /* get decay */ g_value_reset(&value); error = NULL; ags_preset_get_parameter((AgsPreset *) current_preset, "decay", &value, &error); if(error == NULL){ g_object_set_property((GObject *) copy_note, "decay", &value); }else{ g_error_free(error); } /* get sustain */ g_value_reset(&value); error = NULL; ags_preset_get_parameter((AgsPreset *) current_preset, "sustain", &value, &error); if(error == NULL){ g_object_set_property((GObject *) copy_note, "sustain", &value); }else{ g_error_free(error); } /* get release */ g_value_reset(&value); error = NULL; ags_preset_get_parameter((AgsPreset *) current_preset, "release", &value, &error); if(error == NULL){ g_object_set_property((GObject *) copy_note, "release", &value); }else{ g_error_free(error); } /* get ratio */ g_value_reset(&value); error = NULL; ags_preset_get_parameter((AgsPreset *) current_preset, "ratio", &value, &error); if(error == NULL){ g_object_set_property((GObject *) copy_note, "ratio", &value); }else{ g_error_free(error); } g_value_unset(&value); } if(!ags_recall_global_get_rt_safe()){ /* create audio signal */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, (GObject *) child_recall_id); ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, 0.0, attack); ags_audio_signal_unset_flags(audio_signal, AGS_AUDIO_SIGNAL_TEMPLATE); audio_signal->stream_current = audio_signal->stream; ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); ags_recycling_add_audio_signal(recycling, audio_signal); g_object_set(audio_signal, "note", copy_note, NULL); g_object_unref(copy_note); //g_object_unref(audio_signal); }else{ GList *list_start, *list; audio_signal = NULL; g_object_get(recycling, "audio-signal", &list_start, NULL); list = ags_audio_signal_find_by_recall_id(list_start, (GObject *) child_recall_id); if(list != NULL){ audio_signal = list->data; g_object_set(audio_signal, "note", copy_note, NULL); g_object_unref(copy_note); } g_list_free_full(list_start, g_object_unref); g_object_set(note, "rt-offset", 0, NULL); } /* * emit add_audio_signal on AgsRecycling */ #ifdef AGS_DEBUG g_message("play %d %x", AGS_RECALL_CHANNEL_RUN(copy_pattern_channel_run)->source->line, AGS_RECALL(copy_pattern_channel_run)->recall_id); #endif /* * unref AgsAudioSignal because AgsCopyPatternChannelRun has no need for it * if you need a valid reference to audio_signal you have to g_object_ref(audio_signal) */ // g_object_unref(audio_signal); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } } /* unref */ g_object_unref(audio); g_object_unref(source); g_object_unref(output_soundcard); if(link != NULL){ g_object_unref(link); } if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } } /* unref */ g_object_unref(copy_pattern_audio); g_object_unref(copy_pattern_audio_run); g_object_unref(copy_pattern_channel); g_object_unref(count_beats_audio_run); } /** * ags_copy_pattern_channel_run_new: * @destination: the destination #AgsChannel * @source: the source #AgsChannel * * Create a new instance of #AgsCopyPatternChannelRun * * Returns: the new #AgsCopyPatternChannelRun * * Since: 3.0.0 */ AgsCopyPatternChannelRun* ags_copy_pattern_channel_run_new(AgsChannel *destination, AgsChannel *source) { AgsCopyPatternChannelRun *copy_pattern_channel_run; copy_pattern_channel_run = (AgsCopyPatternChannelRun *) g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, "destination", destination, "channel", source, NULL); return(copy_pattern_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_route_lv2_audio.h0000644000175000017500000000414613607210263020027 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ROUTE_LV2_AUDIO_H__ #define __AGS_ROUTE_LV2_AUDIO_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ROUTE_LV2_AUDIO (ags_route_lv2_audio_get_type()) #define AGS_ROUTE_LV2_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ROUTE_LV2_AUDIO, AgsRouteLv2Audio)) #define AGS_ROUTE_LV2_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ROUTE_LV2_AUDIO, AgsRouteLv2Audio)) #define AGS_IS_ROUTE_LV2_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ROUTE_LV2_AUDIO)) #define AGS_IS_ROUTE_LV2_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ROUTE_LV2_AUDIO)) #define AGS_ROUTE_LV2_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ROUTE_LV2_AUDIO, AgsRouteLv2AudioClass)) typedef struct _AgsRouteLv2Audio AgsRouteLv2Audio; typedef struct _AgsRouteLv2AudioClass AgsRouteLv2AudioClass; struct _AgsRouteLv2Audio { AgsRecallAudio recall_audio; AgsPort *notation_input; AgsPort *sequencer_input; }; struct _AgsRouteLv2AudioClass { AgsRecallAudioClass recall_audio; }; GType ags_route_lv2_audio_get_type(); AgsRouteLv2Audio* ags_route_lv2_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_ROUTE_LV2_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_lfo_audio_signal.h0000644000175000017500000000422213607210263020216 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LFO_AUDIO_SIGNAL_H__ #define __AGS_LFO_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LFO_AUDIO_SIGNAL (ags_lfo_audio_signal_get_type()) #define AGS_LFO_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LFO_AUDIO_SIGNAL, AgsLfoAudioSignal)) #define AGS_LFO_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LFO_AUDIO_SIGNAL, AgsLfoAudioSignalClass)) #define AGS_IS_LFO_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LFO_AUDIO_SIGNAL)) #define AGS_IS_LFO_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LFO_AUDIO_SIGNAL)) #define AGS_LFO_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LFO_AUDIO_SIGNAL, AgsLfoAudioSignalClass)) typedef struct _AgsLfoAudioSignal AgsLfoAudioSignal; typedef struct _AgsLfoAudioSignalClass AgsLfoAudioSignalClass; struct _AgsLfoAudioSignal { AgsRecallAudioSignal recall_audio_signal; gdouble current_lfo_phase; }; struct _AgsLfoAudioSignalClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_lfo_audio_signal_get_type(); AgsLfoAudioSignal* ags_lfo_audio_signal_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_LFO_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_lfo_audio_signal.c0000644000175000017500000002534013607210263020215 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_lfo_audio_signal_class_init(AgsLfoAudioSignalClass *lfo_audio_signal); void ags_lfo_audio_signal_init(AgsLfoAudioSignal *lfo_audio_signal); void ags_lfo_audio_signal_finalize(GObject *gobject); void ags_lfo_audio_signal_run_init_pre(AgsRecall *recall); void ags_lfo_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_lfo_audio_signal * @short_description: lfos audio signal * @title: AgsLfoAudioSignal * @section_id: * @include: ags/audio/recall/ags_lfo_audio_signal.h * * The #AgsLfoAudioSignal class lfos the audio signal. */ static gpointer ags_lfo_audio_signal_parent_class = NULL; GType ags_lfo_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lfo_audio_signal = 0; static const GTypeInfo ags_lfo_audio_signal_info = { sizeof (AgsLfoAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lfo_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLfoAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lfo_audio_signal_init, }; ags_type_lfo_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsLfoAudioSignal", &ags_lfo_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lfo_audio_signal); } return g_define_type_id__volatile; } void ags_lfo_audio_signal_class_init(AgsLfoAudioSignalClass *lfo_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_lfo_audio_signal_parent_class = g_type_class_peek_parent(lfo_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) lfo_audio_signal; gobject->finalize = ags_lfo_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) lfo_audio_signal; recall->run_inter = ags_lfo_audio_signal_run_inter; } void ags_lfo_audio_signal_init(AgsLfoAudioSignal *lfo_audio_signal) { AGS_RECALL(lfo_audio_signal)->name = "ags-lfo"; AGS_RECALL(lfo_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(lfo_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(lfo_audio_signal)->xml_type = "ags-lfo-audio-signal"; AGS_RECALL(lfo_audio_signal)->port = NULL; lfo_audio_signal->current_lfo_phase = 0.0; } void ags_lfo_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_lfo_audio_signal_parent_class)->finalize(gobject); } void ags_lfo_audio_signal_run_init_pre(AgsRecall *recall) { AgsLfoChannel *lfo_channel; AgsLfoChannelRun *lfo_channel_run; AgsLfoRecycling *lfo_recycling; AgsLfoAudioSignal *lfo_audio_signal; AgsPort *port; GValue value = {0,}; void (*parent_class_run_init_pre)(AgsRecall *recall); lfo_audio_signal = (AgsLfoAudioSignal *) recall; /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_lfo_audio_signal_parent_class)->run_init_pre; g_object_get(lfo_audio_signal, "parent", &lfo_recycling, NULL); g_object_get(lfo_recycling, "parent", &lfo_channel_run, NULL); g_object_get(lfo_channel_run, "recall-channel", &lfo_channel, NULL); g_object_get(lfo_channel, "lfo-phase", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); lfo_audio_signal->current_lfo_phase = g_value_get_float(&value); g_value_unset(&value); g_object_unref(port); g_object_unref(lfo_recycling); g_object_unref(lfo_channel_run); g_object_unref(lfo_channel); } void ags_lfo_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsLfoAudioSignal *lfo_audio_signal; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context, *parent_recycling_context; GList *start_note; void (*parent_class_run_inter)(AgsRecall *recall); lfo_audio_signal = (AgsLfoAudioSignal *) recall; /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_lfo_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); g_object_get(lfo_audio_signal, "source", &source, "recall-id", &recall_id, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(source, "note", &start_note, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && start_note == NULL){ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } if(source->stream_current != NULL){ AgsLfoChannel *lfo_channel; AgsLfoChannelRun *lfo_channel_run; AgsLfoRecycling *lfo_recycling; AgsPort *port; void *buffer; gboolean enabled; guint lfo_wave; gdouble lfo_freq; gdouble lfo_phase; gdouble lfo_depth; gdouble lfo_tuning; guint samplerate; guint buffer_size; guint format; guint limit; guint i; GValue value = {0,}; g_object_get(lfo_audio_signal, "parent", &lfo_recycling, NULL); g_object_get(lfo_recycling, "parent", &lfo_channel_run, NULL); g_object_get(lfo_channel_run, "recall-channel", &lfo_channel, NULL); g_object_get(source, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, NULL); buffer = source->stream_current->data; /* ports */ g_object_get(lfo_channel, "enabled", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); enabled = (g_value_get_float(&value) == 1.0) ? TRUE: FALSE; g_value_unset(&value); g_object_unref(port); if(!enabled){ g_object_unref(lfo_recycling); g_object_unref(lfo_channel_run); g_object_unref(lfo_channel); return; } /* wave */ g_object_get(lfo_channel, "lfo-wave", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); lfo_wave = (guint) g_value_get_float(&value); g_value_unset(&value); g_object_unref(port); /* freq */ g_object_get(lfo_channel, "lfo-freq", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); lfo_freq = g_value_get_float(&value); g_value_unset(&value); g_object_unref(port); /* phase */ lfo_phase = lfo_audio_signal->current_lfo_phase; /* depth */ g_object_get(lfo_channel, "lfo-depth", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); lfo_depth = g_value_get_float(&value); g_value_unset(&value); g_object_unref(port); /* tuning */ g_object_get(lfo_channel, "lfo-tuning", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); lfo_tuning = g_value_get_float(&value); g_value_unset(&value); g_object_unref(port); /* LFO */ switch(lfo_wave){ case AGS_SYNTH_OSCILLATOR_SIN: { ags_lfo_synth_util_sin(buffer, lfo_freq, lfo_phase, lfo_depth, lfo_tuning, samplerate, ags_audio_buffer_util_format_from_soundcard(format), 0, buffer_size); } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { ags_lfo_synth_util_sawtooth(buffer, lfo_freq, lfo_phase, lfo_depth, lfo_tuning, samplerate, ags_audio_buffer_util_format_from_soundcard(format), 0, buffer_size); } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { ags_lfo_synth_util_triangle(buffer, lfo_freq, lfo_phase, lfo_depth, lfo_tuning, samplerate, ags_audio_buffer_util_format_from_soundcard(format), 0, buffer_size); } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { ags_lfo_synth_util_square(buffer, lfo_freq, lfo_phase, lfo_depth, lfo_tuning, samplerate, ags_audio_buffer_util_format_from_soundcard(format), 0, buffer_size); } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { ags_lfo_synth_util_impulse(buffer, lfo_freq, lfo_phase, lfo_depth, lfo_tuning, samplerate, ags_audio_buffer_util_format_from_soundcard(format), 0, buffer_size); } break; }; lfo_audio_signal->current_lfo_phase += buffer_size; if(lfo_audio_signal->current_lfo_phase >= samplerate / lfo_freq){ lfo_audio_signal->current_lfo_phase = (guint) lfo_audio_signal->current_lfo_phase % (guint) (samplerate / lfo_freq); } g_object_unref(lfo_recycling); g_object_unref(lfo_channel_run); g_object_unref(lfo_channel); }else{ ags_recall_done(recall); } /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_list_free_full(start_note, g_object_unref); } /** * ags_lfo_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsLfoAudioSignal * * Returns: the new #AgsLfoAudioSignal * * Since: 3.0.0 */ AgsLfoAudioSignal* ags_lfo_audio_signal_new(AgsAudioSignal *source) { AgsLfoAudioSignal *lfo_audio_signal; lfo_audio_signal = (AgsLfoAudioSignal *) g_object_new(AGS_TYPE_LFO_AUDIO_SIGNAL, "source", source, NULL); return(lfo_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_envelope_channel_run.c0000644000175000017500000000765313607210263021117 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_envelope_channel_run_class_init(AgsEnvelopeChannelRunClass *envelope_channel_run); void ags_envelope_channel_run_init(AgsEnvelopeChannelRun *envelope_channel_run); void ags_envelope_channel_run_finalize(GObject *gobject); static gpointer ags_envelope_channel_run_parent_class = NULL; GType ags_envelope_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_envelope_channel_run = 0; static const GTypeInfo ags_envelope_channel_run_info = { sizeof (AgsEnvelopeChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_envelope_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsEnvelopeChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_envelope_channel_run_init, }; ags_type_envelope_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsEnvelopeChannelRun", &ags_envelope_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_envelope_channel_run); } return g_define_type_id__volatile; } void ags_envelope_channel_run_class_init(AgsEnvelopeChannelRunClass *envelope_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_envelope_channel_run_parent_class = g_type_class_peek_parent(envelope_channel_run); /* GObjectClass */ gobject = (GObjectClass *) envelope_channel_run; gobject->finalize = ags_envelope_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) envelope_channel_run; } void ags_envelope_channel_run_init(AgsEnvelopeChannelRun *envelope_channel_run) { ags_recall_set_ability_flags((AgsRecall *) envelope_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(envelope_channel_run)->name = "ags-envelope"; AGS_RECALL(envelope_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(envelope_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(envelope_channel_run)->xml_type = "ags-envelope-channel-run"; AGS_RECALL(envelope_channel_run)->port = NULL; AGS_RECALL(envelope_channel_run)->child_type = AGS_TYPE_ENVELOPE_RECYCLING; } void ags_envelope_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_envelope_channel_run_parent_class)->finalize(gobject); } /** * ags_envelope_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsEnvelopeChannelRun * * Returns: the new #AgsEnvelopeChannelRun * * Since: 3.0.0 */ AgsEnvelopeChannelRun* ags_envelope_channel_run_new(AgsChannel *source) { AgsEnvelopeChannelRun *envelope_channel_run; envelope_channel_run = (AgsEnvelopeChannelRun *) g_object_new(AGS_TYPE_ENVELOPE_CHANNEL_RUN, "source", source, NULL); return(envelope_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_copy_channel.h0000644000175000017500000000410213607210263017357 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_CHANNEL_H__ #define __AGS_COPY_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_CHANNEL (ags_copy_channel_get_type()) #define AGS_COPY_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_CHANNEL, AgsCopyChannel)) #define AGS_COPY_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_CHANNEL, AgsCopyChannel)) #define AGS_IS_COPY_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_CHANNEL)) #define AGS_IS_COPY_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_CHANNEL)) #define AGS_COPY_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_CHANNEL, AgsCopyChannelClass)) typedef struct _AgsCopyChannel AgsCopyChannel; typedef struct _AgsCopyChannelClass AgsCopyChannelClass; struct _AgsCopyChannel { AgsRecallChannel recall_channel; AgsPort *muted; }; struct _AgsCopyChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_copy_channel_get_type(); AgsCopyChannel* ags_copy_channel_new(AgsChannel *destination, AgsChannel *source); G_END_DECLS #endif /*__AGS_COPY_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_channel.h0000644000175000017500000000442113607210263021076 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CAPTURE_WAVE_CHANNEL_H__ #define __AGS_CAPTURE_WAVE_CHANNEL_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CAPTURE_WAVE_CHANNEL (ags_capture_wave_channel_get_type()) #define AGS_CAPTURE_WAVE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CAPTURE_WAVE_CHANNEL, AgsCaptureWaveChannel)) #define AGS_CAPTURE_WAVE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CAPTURE_WAVE_CHANNEL, AgsCaptureWaveChannel)) #define AGS_IS_CAPTURE_WAVE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CAPTURE_WAVE_CHANNEL)) #define AGS_IS_CAPTURE_WAVE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CAPTURE_WAVE_CHANNEL)) #define AGS_CAPTURE_WAVE_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_CAPTURE_WAVE_CHANNEL, AgsCaptureWaveChannelClass)) typedef struct _AgsCaptureWaveChannel AgsCaptureWaveChannel; typedef struct _AgsCaptureWaveChannelClass AgsCaptureWaveChannelClass; struct _AgsCaptureWaveChannel { AgsRecallChannel recall_channel; AgsPort *x_offset; }; struct _AgsCaptureWaveChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_capture_wave_channel_get_type(); AgsCaptureWaveChannel* ags_capture_wave_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_CAPTURE_WAVE_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_feed_audio_signal.c0000644000175000017500000001610213616617253020346 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_feed_audio_signal_class_init(AgsFeedAudioSignalClass *feed_audio_signal); void ags_feed_audio_signal_init(AgsFeedAudioSignal *feed_audio_signal); void ags_feed_audio_signal_finalize(GObject *gobject); void ags_feed_audio_signal_run_pre(AgsRecall *recall); void ags_feed_audio_signal_run_post(AgsRecall *recall); /** * SECTION:ags_feed_audio_signal * @short_description: feeds audio signal * @title: AgsFeedAudioSignal * @section_id: * @include: ags/audio/recall/ags_feed_audio_signal.h * * The #AgsFeedAudioSignal class feeds the audio signal. */ static gpointer ags_feed_audio_signal_parent_class = NULL; GType ags_feed_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_feed_audio_signal = 0; static const GTypeInfo ags_feed_audio_signal_info = { sizeof (AgsFeedAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_feed_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFeedAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_feed_audio_signal_init, }; ags_type_feed_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsFeedAudioSignal", &ags_feed_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_feed_audio_signal); } return g_define_type_id__volatile; } void ags_feed_audio_signal_class_init(AgsFeedAudioSignalClass *feed_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_feed_audio_signal_parent_class = g_type_class_peek_parent(feed_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) feed_audio_signal; gobject->finalize = ags_feed_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) feed_audio_signal; recall->run_pre = ags_feed_audio_signal_run_pre; recall->run_post = ags_feed_audio_signal_run_post; } void ags_feed_audio_signal_init(AgsFeedAudioSignal *feed_audio_signal) { AGS_RECALL(feed_audio_signal)->name = "ags-feed"; AGS_RECALL(feed_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(feed_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(feed_audio_signal)->xml_type = "ags-feed-audio-signal"; AGS_RECALL(feed_audio_signal)->port = NULL; } void ags_feed_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_feed_audio_signal_parent_class)->finalize(gobject); } void ags_feed_audio_signal_run_pre(AgsRecall *recall) { AgsAudioSignal *template, *audio_signal; AgsFeedAudioSignal *feed_audio_signal; GObject *output_soundcard; GList *note_start, *note; void (*parent_class_run_pre)(AgsRecall *recall); feed_audio_signal = (AgsFeedAudioSignal *) recall; /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_feed_audio_signal_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); #if 0 if(ags_recall_global_get_rt_safe()){ return; } #endif g_object_get(feed_audio_signal, "output-soundcard", &output_soundcard, "source", &audio_signal, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); if(note_start != NULL){ note = note_start; while(note != NULL){ if(ags_note_test_flags(note->data, AGS_NOTE_FEED)){ AgsRecycling *recycling; guint x0, x1; guint buffer_size; guint note_offset; gdouble notation_delay; guint frame_count; template = NULL; g_object_get(note->data, "x0", &x0, "x1", &x1, NULL); g_object_get(audio_signal, "recycling", &recycling, "buffer-size", &buffer_size, NULL); template = NULL; if(recycling != NULL){ GList *list_start; g_object_get(recycling, "audio-signal", &list_start, NULL); template = ags_audio_signal_get_template(list_start); g_object_unref(recycling); g_list_free_full(list_start, g_object_unref); } /* get notation delay */ notation_delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(output_soundcard)); note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); /* feed audio signal */ frame_count = (guint) (((gdouble) buffer_size * notation_delay) * (gdouble) ((note_offset + 1) - x0)); ags_audio_signal_feed(audio_signal, template, frame_count); if(template != NULL){ g_object_unref(template); } } note = note->next; } } /* unref */ g_object_unref(output_soundcard); g_object_unref(audio_signal); g_list_free_full(note_start, g_object_unref); } void ags_feed_audio_signal_run_post(AgsRecall *recall) { AgsAudioSignal *audio_signal; AgsFeedAudioSignal *feed_audio_signal; GList *note_start, *note; gboolean success; void (*parent_class_run_post)(AgsRecall *recall); feed_audio_signal = (AgsFeedAudioSignal *) recall; /* get parent class */ parent_class_run_post = AGS_RECALL_CLASS(ags_feed_audio_signal_parent_class)->run_post; /* call parent */ parent_class_run_post(recall); g_object_get(feed_audio_signal, "source", &audio_signal, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); note = note_start; success = FALSE; while(note != NULL){ if(ags_note_test_flags(note->data, AGS_NOTE_FEED)){ success = TRUE; break; } note = note->next; } if(!success){ ags_recall_done(recall); } /* unref */ g_object_unref(audio_signal); g_list_free_full(note_start, g_object_unref); } /** * ags_feed_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsFeedAudioSignal * * Returns: the new #AgsFeedAudioSignal * * Since: 3.0.0 */ AgsFeedAudioSignal* ags_feed_audio_signal_new(AgsAudioSignal *source) { AgsFeedAudioSignal *feed_audio_signal; feed_audio_signal = (AgsFeedAudioSignal *) g_object_new(AGS_TYPE_FEED_AUDIO_SIGNAL, "source", source, NULL); return(feed_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_peak_recycling.c0000644000175000017500000000723413607210263017700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_peak_recycling_class_init(AgsPeakRecyclingClass *peak_recycling); void ags_peak_recycling_init(AgsPeakRecycling *peak_recycling); void ags_peak_recycling_finalize(GObject *gobject); /** * SECTION:ags_peak_recycling * @short_description: peaks recycling * @title: AgsPeakRecycling * @section_id: * @include: ags/audio/recall/ags_peak_recycling.h * * The #AgsPeakRecycling class peaks the recycling. */ static gpointer ags_peak_recycling_parent_class = NULL; GType ags_peak_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_peak_recycling = 0; static const GTypeInfo ags_peak_recycling_info = { sizeof (AgsPeakRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_peak_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPeakRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_peak_recycling_init, }; ags_type_peak_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsPeakRecycling", &ags_peak_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_peak_recycling); } return g_define_type_id__volatile; } void ags_peak_recycling_class_init(AgsPeakRecyclingClass *peak_recycling) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_peak_recycling_parent_class = g_type_class_peek_parent(peak_recycling); /* GObjectClass */ gobject = (GObjectClass *) peak_recycling; gobject->finalize = ags_peak_recycling_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) peak_recycling; } void ags_peak_recycling_init(AgsPeakRecycling *peak_recycling) { AGS_RECALL(peak_recycling)->name = "ags-peak"; AGS_RECALL(peak_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(peak_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(peak_recycling)->xml_type = "ags-peak-recycling"; AGS_RECALL(peak_recycling)->port = NULL; AGS_RECALL(peak_recycling)->child_type = AGS_TYPE_PEAK_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(peak_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_peak_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_peak_recycling_parent_class)->finalize(gobject); } /** * ags_peak_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsPeakRecycling * * Returns: a new #AgsPeakRecycling * * Since: 3.0.0 */ AgsPeakRecycling* ags_peak_recycling_new(AgsRecycling *source) { AgsPeakRecycling *peak_recycling; peak_recycling = (AgsPeakRecycling *) g_object_new(AGS_TYPE_PEAK_RECYCLING, "source", source, NULL); return(peak_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_delay_audio_run.h0000644000175000017500000001214413607210263020065 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DELAY_AUDIO_RUN_H__ #define __AGS_DELAY_AUDIO_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DELAY_AUDIO_RUN (ags_delay_audio_run_get_type()) #define AGS_DELAY_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DELAY_AUDIO_RUN, AgsDelayAudioRun)) #define AGS_DELAY_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DELAY_AUDIO_RUN, AgsDelayAudioRun)) #define AGS_IS_DELAY_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DELAY_AUDIO_RUN)) #define AGS_IS_DELAY_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DELAY_AUDIO_RUN)) #define AGS_DELAY_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_DELAY_AUDIO_RUN, AgsDelayAudioRunClass)) typedef struct _AgsDelayAudioRun AgsDelayAudioRun; typedef struct _AgsDelayAudioRunClass AgsDelayAudioRunClass; struct _AgsDelayAudioRun { AgsRecallAudioRun recall_audio_run; guint dependency_ref; guint hide_ref; guint hide_ref_counter; gdouble sequencer_counter; gdouble notation_counter; gdouble wave_counter; gdouble midi_counter; }; struct _AgsDelayAudioRunClass { AgsRecallAudioRunClass recall_audio_run; void (*sequencer_alloc_output)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*sequencer_alloc_input)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*sequencer_count)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*notation_alloc_output)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*notation_alloc_input)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*notation_count)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*wave_alloc_output)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*wave_alloc_input)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*wave_count)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*midi_alloc_output)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*midi_alloc_input)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void (*midi_count)(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); }; GType ags_delay_audio_run_get_type(); void ags_delay_audio_run_sequencer_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_sequencer_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_sequencer_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_notation_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_notation_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_notation_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_wave_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_wave_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_wave_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_midi_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_midi_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); void ags_delay_audio_run_midi_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack); AgsDelayAudioRun* ags_delay_audio_run_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_DELAY_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_volume_audio_signal.c0000644000175000017500000001540413607210263020744 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_volume_audio_signal_class_init(AgsVolumeAudioSignalClass *volume_audio_signal); void ags_volume_audio_signal_init(AgsVolumeAudioSignal *volume_audio_signal); void ags_volume_audio_signal_finalize(GObject *gobject); void ags_volume_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_volume_audio_signal * @short_description: volumes audio signal * @title: AgsVolumeAudioSignal * @section_id: * @include: ags/audio/recall/ags_volume_audio_signal.h * * The #AgsVolumeAudioSignal class volumes the audio signal. */ static gpointer ags_volume_audio_signal_parent_class = NULL; GType ags_volume_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_volume_audio_signal = 0; static const GTypeInfo ags_volume_audio_signal_info = { sizeof (AgsVolumeAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_volume_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVolumeAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_volume_audio_signal_init, }; ags_type_volume_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsVolumeAudioSignal", &ags_volume_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_volume_audio_signal); } return g_define_type_id__volatile; } void ags_volume_audio_signal_class_init(AgsVolumeAudioSignalClass *volume_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_volume_audio_signal_parent_class = g_type_class_peek_parent(volume_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) volume_audio_signal; gobject->finalize = ags_volume_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) volume_audio_signal; recall->run_inter = ags_volume_audio_signal_run_inter; } void ags_volume_audio_signal_init(AgsVolumeAudioSignal *volume_audio_signal) { AGS_RECALL(volume_audio_signal)->name = "ags-volume"; AGS_RECALL(volume_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(volume_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(volume_audio_signal)->xml_type = "ags-volume-audio-signal"; AGS_RECALL(volume_audio_signal)->port = NULL; } void ags_volume_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_volume_audio_signal_parent_class)->finalize(gobject); } void ags_volume_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsVolumeAudioSignal *volume_audio_signal; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context, *parent_recycling_context; GList *start_note; void (*parent_class_run_inter)(AgsRecall *recall); volume_audio_signal = (AgsVolumeAudioSignal *) recall; /* get parent class */ parent_class_run_inter = AGS_RECALL_CLASS(ags_volume_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); g_object_get(volume_audio_signal, "source", &source, "recall-id", &recall_id, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(source, "note", &start_note, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && start_note == NULL){ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } if(source->stream_current != NULL){ AgsPort *port; AgsVolumeChannel *volume_channel; AgsVolumeChannelRun *volume_channel_run; AgsVolumeRecycling *volume_recycling; void *buffer; gdouble volume; guint buffer_size; guint format; guint limit; guint i; GValue value = {0,}; g_object_get(volume_audio_signal, "parent", &volume_recycling, NULL); g_object_get(volume_recycling, "parent", &volume_channel_run, NULL); g_object_get(volume_channel_run, "recall-channel", &volume_channel, NULL); g_object_get(source, "buffer-size", &buffer_size, "format", &format, NULL); buffer = source->stream_current->data; g_object_get(volume_channel, "volume", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(port, &value); volume = g_value_get_float(&value); g_value_unset(&value); g_object_unref(port); ags_audio_buffer_util_volume(buffer, 1, ags_audio_buffer_util_format_from_soundcard(format), buffer_size, volume); g_object_unref(volume_recycling); g_object_unref(volume_channel_run); g_object_unref(volume_channel); }else{ ags_recall_done(recall); } /* unref */ g_object_unref(source); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_list_free_full(start_note, g_object_unref); } /** * ags_volume_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsVolumeAudioSignal * * Returns: the new #AgsVolumeAudioSignal * * Since: 3.0.0 */ AgsVolumeAudioSignal* ags_volume_audio_signal_new(AgsAudioSignal *source) { AgsVolumeAudioSignal *volume_audio_signal; volume_audio_signal = (AgsVolumeAudioSignal *) g_object_new(AGS_TYPE_VOLUME_AUDIO_SIGNAL, "source", source, NULL); return(volume_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_buffer_channel_run.h0000644000175000017500000000427013607210263020550 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUFFER_CHANNEL_RUN_H__ #define __AGS_BUFFER_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BUFFER_CHANNEL_RUN (ags_buffer_channel_run_get_type()) #define AGS_BUFFER_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUFFER_CHANNEL_RUN, AgsBufferChannelRun)) #define AGS_BUFFER_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BUFFER_CHANNEL_RUN, AgsBufferChannelRunClass)) #define AGS_IS_BUFFER_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_BUFFER_CHANNEL_RUN)) #define AGS_IS_BUFFER_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_BUFFER_CHANNEL_RUN)) #define AGS_BUFFER_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_BUFFER_CHANNEL_RUN, AgsBufferChannelRunClass)) typedef struct _AgsBufferChannelRun AgsBufferChannelRun; typedef struct _AgsBufferChannelRunClass AgsBufferChannelRunClass; struct _AgsBufferChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsBufferChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_buffer_channel_run_get_type(); AgsBufferChannelRun* ags_buffer_channel_run_new(AgsChannel *destination, AgsChannel *source); G_END_DECLS #endif /*__AGS_BUFFER_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_audio_run.c0000644000175000017500000002422413607210263021451 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_capture_wave_audio_run_class_init(AgsCaptureWaveAudioRunClass *capture_wave_audio_run); void ags_capture_wave_audio_run_init(AgsCaptureWaveAudioRun *capture_wave_audio_run); void ags_capture_wave_audio_run_dispose(GObject *gobject); void ags_capture_wave_audio_run_finalize(GObject *gobject); void ags_capture_wave_audio_run_run_init_pre(AgsRecall *recall); void ags_capture_wave_audio_run_done(AgsRecall *recall); /** * SECTION:ags_capture_wave_audio_run * @short_description: capture wave * @title: AgsCaptureWaveAudioRun * @section_id: * @include: ags/audio/recall/ags_capture_wave_audio_run.h * * The #AgsCaptureWaveAudioRun does capture wave. */ static gpointer ags_capture_wave_audio_run_parent_class = NULL; GType ags_capture_wave_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_capture_wave_audio_run = 0; static const GTypeInfo ags_capture_wave_audio_run_info = { sizeof(AgsCaptureWaveAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_capture_wave_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCaptureWaveAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_capture_wave_audio_run_init, }; ags_type_capture_wave_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsCaptureWaveAudioRun", &ags_capture_wave_audio_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_capture_wave_audio_run); } return g_define_type_id__volatile; } void ags_capture_wave_audio_run_class_init(AgsCaptureWaveAudioRunClass *capture_wave_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_capture_wave_audio_run_parent_class = g_type_class_peek_parent(capture_wave_audio_run); /* GObjectClass */ gobject = (GObjectClass *) capture_wave_audio_run; gobject->dispose = ags_capture_wave_audio_run_dispose; gobject->finalize = ags_capture_wave_audio_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) capture_wave_audio_run; recall->run_init_pre = ags_capture_wave_audio_run_run_init_pre; recall->done = ags_capture_wave_audio_run_done; } void ags_capture_wave_audio_run_init(AgsCaptureWaveAudioRun *capture_wave_audio_run) { ags_recall_set_ability_flags((AgsRecall *) capture_wave_audio_run, (AGS_SOUND_ABILITY_WAVE)); AGS_RECALL(capture_wave_audio_run)->name = "ags-capture-wave"; AGS_RECALL(capture_wave_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(capture_wave_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(capture_wave_audio_run)->xml_type = "ags-capture-wave-audio-run"; AGS_RECALL(capture_wave_audio_run)->port = NULL; capture_wave_audio_run->file_buffer = NULL; } void ags_capture_wave_audio_run_dispose(GObject *gobject) { AgsCaptureWaveAudioRun *capture_wave_audio_run; capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(gobject); /* call parent */ G_OBJECT_CLASS(ags_capture_wave_audio_run_parent_class)->dispose(gobject); } void ags_capture_wave_audio_run_finalize(GObject *gobject) { AgsCaptureWaveAudioRun *capture_wave_audio_run; capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(gobject); /* file buffer */ g_free(capture_wave_audio_run->file_buffer); /* call parent */ G_OBJECT_CLASS(ags_capture_wave_audio_run_parent_class)->finalize(gobject); } void ags_capture_wave_audio_run_run_init_pre(AgsRecall *recall) { AgsAudio *audio; AgsPort *port; AgsCaptureWaveAudio *capture_wave_audio; AgsCaptureWaveAudioRun *capture_wave_audio_run; GObject *input_soundcard; gchar *filename; guint file_audio_channels; guint file_samplerate; guint file_format; guint file_buffer_size; gboolean do_record; GValue value = {0,}; void (*parent_class_run_init_pre)(AgsRecall *recall); capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_capture_wave_audio_run_parent_class)->run_init_pre; /* get some fields */ g_object_get(capture_wave_audio_run, "recall-audio", &capture_wave_audio, NULL); g_object_get(capture_wave_audio, "audio", &audio, NULL); /* record */ g_object_get(capture_wave_audio, "record", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); do_record = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(port); filename = NULL; if(do_record){ /* read filename */ g_object_get(capture_wave_audio, "filename", &port, NULL); g_value_init(&value, G_TYPE_STRING); ags_port_safe_read(port, &value); filename = g_value_get_string(&value); g_value_unset(&value); g_object_unref(port); /* read audio channels */ g_object_get(capture_wave_audio, "file-audio-channels", &port, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(port, &value); file_audio_channels = g_value_get_uint(&value); g_value_unset(&value); g_object_unref(port); /* read samplerate */ g_object_get(capture_wave_audio, "file-samplerate", &port, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(port, &value); file_samplerate = g_value_get_uint(&value); g_value_unset(&value); g_object_unref(port); /* read buffer size */ g_object_get(capture_wave_audio, "file-buffer-size", &port, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(port, &value); file_buffer_size = g_value_get_uint(&value); g_value_unset(&value); g_object_unref(port); /* read format */ g_object_get(capture_wave_audio, "file-format", &port, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(port, &value); file_format = g_value_get_uint(&value); g_value_unset(&value); g_object_unref(port); /* file buffer */ capture_wave_audio_run->file_buffer = ags_stream_alloc(file_audio_channels * file_buffer_size, file_format); /* instantiate audio file */ g_object_get(recall, "input-soundcard", &input_soundcard, NULL); if(input_soundcard != NULL){ g_rec_mutex_lock(&(capture_wave_audio->audio_file_mutex)); if(capture_wave_audio->audio_file == NULL){ capture_wave_audio->audio_file = ags_audio_file_new(filename, input_soundcard, -1); g_object_set(capture_wave_audio->audio_file, "file-audio-channels", file_audio_channels, "file-samplerate", file_samplerate, "samplerate", file_samplerate, "buffer-size", file_buffer_size, "format", file_format, NULL); ags_audio_file_rw_open(capture_wave_audio->audio_file, TRUE); } g_rec_mutex_unlock(&(capture_wave_audio->audio_file_mutex)); } } /* call parent */ parent_class_run_init_pre(recall); /* unref */ g_object_unref(capture_wave_audio); g_object_unref(audio); g_free(filename); } void ags_capture_wave_audio_run_done(AgsRecall *recall) { AgsPort *port; AgsAudioFile *audio_file; AgsCaptureWaveAudio *capture_wave_audio; AgsCaptureWaveAudioRun *capture_wave_audio_run; gboolean do_record; GValue value = {0,}; void (*parent_class_done)(AgsRecall *recall); capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(recall); /* get parent class */ parent_class_done = AGS_RECALL_CLASS(ags_capture_wave_audio_run_parent_class)->done; /* get some fields */ g_object_get(capture_wave_audio_run, "recall-audio", &capture_wave_audio, NULL); /* read record */ g_object_get(capture_wave_audio, "record", &port, NULL); g_value_init(&value, G_TYPE_BOOLEAN); ags_port_safe_read(port, &value); do_record = g_value_get_boolean(&value); g_value_unset(&value); g_object_unref(port); if(do_record){ g_rec_mutex_lock(&(capture_wave_audio->audio_file_mutex)); if(capture_wave_audio->audio_file != NULL){ ags_audio_file_flush(capture_wave_audio->audio_file); ags_audio_file_close(capture_wave_audio->audio_file); capture_wave_audio->audio_file = NULL; } g_rec_mutex_unlock(&(capture_wave_audio->audio_file_mutex)); } /* call parent */ parent_class_done(recall); /* unref */ g_object_unref(capture_wave_audio); } /** * ags_capture_wave_audio_run_new: * @audio: the #AgsAudio * * Create a new instance of #AgsCaptureWaveAudioRun * * Returns: the new #AgsCaptureWaveAudioRun * * Since: 3.0.0 */ AgsCaptureWaveAudioRun* ags_capture_wave_audio_run_new(AgsAudio *audio) { AgsCaptureWaveAudioRun *capture_wave_audio_run; capture_wave_audio_run = (AgsCaptureWaveAudioRun *) g_object_new(AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN, "audio", audio, NULL); return(capture_wave_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_stream_channel.c0000644000175000017500000001744113607210263017705 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_stream_channel_class_init(AgsStreamChannelClass *stream_channel); void ags_stream_channel_init(AgsStreamChannel *stream_channel); void ags_stream_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_stream_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_stream_channel_dispose(GObject *gobject); void ags_stream_channel_finalize(GObject *gobject); /** * SECTION:ags_stream_channel * @short_description: streams channel * @title: AgsStreamChannel * @section_id: * @include: ags/audio/recall/ags_stream_channel.h * * The #AgsStreamChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_AUTO_SENSE, }; static gpointer ags_stream_channel_parent_class = NULL; static AgsConnectableInterface *ags_stream_channel_parent_connectable_interface; static const gchar *ags_stream_channel_plugin_name = "ags-stream"; static const gchar *ags_stream_channel_plugin_specifier[] = { "./auto-sense[0]", }; static const gchar *ags_stream_channel_plugin_control_port[] = { "1/1", }; GType ags_stream_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_stream_channel = 0; static const GTypeInfo ags_stream_channel_info = { sizeof (AgsStreamChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_stream_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsStreamChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_stream_channel_init, }; ags_type_stream_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsStreamChannel", &ags_stream_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_stream_channel); } return g_define_type_id__volatile; } void ags_stream_channel_class_init(AgsStreamChannelClass *stream_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_stream_channel_parent_class = g_type_class_peek_parent(stream_channel); /* GObjectClass */ gobject = (GObjectClass *) stream_channel; gobject->set_property = ags_stream_channel_set_property; gobject->get_property = ags_stream_channel_get_property; gobject->dispose = ags_stream_channel_dispose; gobject->finalize = ags_stream_channel_finalize; /* properties */ /** * AgsStreamChannel:auto-sense: * * The auto-sense port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("auto-sense", i18n_pspec("mute channel"), i18n_pspec("Mute the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUTO_SENSE, param_spec); } void ags_stream_channel_init(AgsStreamChannel *stream_channel) { AgsConfig *config; GList *port; gchar *str; AGS_RECALL(stream_channel)->name = "ags-stream"; AGS_RECALL(stream_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(stream_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(stream_channel)->xml_type = "ags-stream-channel"; /* initialize port */ port = NULL; /* auto-sense */ stream_channel->auto_sense = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_stream_channel_plugin_name, "specifier", ags_stream_channel_plugin_specifier[0], "control-port", ags_stream_channel_plugin_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, "port-value-size", sizeof(gboolean), "port-value-length", 1, NULL); g_object_ref(stream_channel->auto_sense); config = ags_config_get_instance(); str = ags_config_get_value(config, AGS_CONFIG_RECALL, "auto-sense"); stream_channel->auto_sense->port_value.ags_port_boolean = ((!g_strcmp0(str, "true") ) ? TRUE: FALSE); g_free(str); /* add to port */ port = g_list_prepend(port, stream_channel->auto_sense); g_object_ref(stream_channel->auto_sense); /* set port */ AGS_RECALL(stream_channel)->port = port; } void ags_stream_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStreamChannel *stream_channel; GRecMutex *recall_mutex; stream_channel = AGS_STREAM_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(stream_channel); switch(prop_id){ case PROP_AUTO_SENSE: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == stream_channel->auto_sense){ g_rec_mutex_unlock(recall_mutex); return; } if(stream_channel->auto_sense != NULL){ g_object_unref(G_OBJECT(stream_channel->auto_sense)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } stream_channel->auto_sense = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_stream_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStreamChannel *stream_channel; GRecMutex *recall_mutex; stream_channel = AGS_STREAM_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(stream_channel); switch(prop_id){ case PROP_AUTO_SENSE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, stream_channel->auto_sense); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_stream_channel_dispose(GObject *gobject) { AgsStreamChannel *stream_channel; stream_channel = AGS_STREAM_CHANNEL(gobject); /* auto-sense */ if(stream_channel->auto_sense != NULL){ g_object_unref(G_OBJECT(stream_channel->auto_sense)); stream_channel->auto_sense = NULL; } /* call parent */ G_OBJECT_CLASS(ags_stream_channel_parent_class)->dispose(gobject); } void ags_stream_channel_finalize(GObject *gobject) { AgsStreamChannel *stream_channel; stream_channel = AGS_STREAM_CHANNEL(gobject); /* auto-sense */ if(stream_channel->auto_sense != NULL){ g_object_unref(G_OBJECT(stream_channel->auto_sense)); } /* call parent */ G_OBJECT_CLASS(ags_stream_channel_parent_class)->finalize(gobject); } /** * ags_stream_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsStreamChannel * * Returns: the new #AgsStreamChannel * * Since: 3.0.0 */ AgsStreamChannel* ags_stream_channel_new(AgsChannel *source) { AgsStreamChannel *stream_channel; stream_channel = (AgsStreamChannel *) g_object_new(AGS_TYPE_STREAM_CHANNEL, "source", source, NULL); return(stream_channel); } gsequencer-3.1.3/ags/audio/recall/ags_loop_channel_run.c0000644000175000017500000004500213607210263020241 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_loop_channel_run_class_init(AgsLoopChannelRunClass *loop_channel_run); void ags_loop_channel_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_loop_channel_run_init(AgsLoopChannelRun *loop_channel_run); void ags_loop_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_loop_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_loop_channel_run_dispose(GObject *gobject); void ags_loop_channel_run_finalize(GObject *gobject); void ags_loop_channel_run_connect(AgsConnectable *connectable); void ags_loop_channel_run_disconnect(AgsConnectable *connectable); void ags_loop_channel_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_loop_channel_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_loop_channel_run_resolve_dependency(AgsRecall *recall); void ags_loop_channel_run_start_callback(AgsCountBeatsAudioRun *count_beats_audio_run, guint run_order, AgsLoopChannelRun *loop_channel_run); void ags_loop_channel_run_loop_callback(AgsCountBeatsAudioRun *count_beats_audio_run, guint run_order, AgsLoopChannelRun *loop_channel_run); void ags_loop_channel_run_stop_callback(AgsCountBeatsAudioRun *count_beats_audio_run, guint run_order, AgsLoopChannelRun *loop_channel_run); /** * SECTION:ags_loop_channel_run * @short_description: loop * @title: AgsLoopChannelRun * @section_id: * @include: ags/audio/recall/ags_loop_channel_run.h * * The #AgsLoopChannelRun class loops the channel. */ enum{ PROP_0, PROP_COUNT_BEATS_AUDIO_RUN, }; static gpointer ags_loop_channel_run_parent_class = NULL; static AgsConnectableInterface *ags_loop_channel_run_parent_connectable_interface; GType ags_loop_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_loop_channel_run = 0; static const GTypeInfo ags_loop_channel_run_info = { sizeof (AgsLoopChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_loop_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLoopChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_loop_channel_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_loop_channel_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_loop_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsLoopChannelRun", &ags_loop_channel_run_info, 0); g_type_add_interface_static(ags_type_loop_channel_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_loop_channel_run); } return g_define_type_id__volatile; } void ags_loop_channel_run_class_init(AgsLoopChannelRunClass *loop_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_loop_channel_run_parent_class = g_type_class_peek_parent(loop_channel_run); /* GObjectClass */ gobject = (GObjectClass *) loop_channel_run; gobject->set_property = ags_loop_channel_run_set_property; gobject->get_property = ags_loop_channel_run_get_property; gobject->dispose = ags_loop_channel_run_dispose; gobject->finalize = ags_loop_channel_run_finalize; /* properties */ /** * AgsLoopChannelRun:count-beats-audio-run: * * The count beats audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("count-beats-audio-run", i18n_pspec("assigned AgsCountBeatsAudioRun"), i18n_pspec("The pointer to a counter object which indicates when looping should happen"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT_BEATS_AUDIO_RUN, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) loop_channel_run; recall->resolve_dependency = ags_loop_channel_run_resolve_dependency; } void ags_loop_channel_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_loop_channel_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_loop_channel_run_connect; connectable->disconnect = ags_loop_channel_run_disconnect; connectable->connect_connection = ags_loop_channel_run_connect_connection; connectable->disconnect_connection = ags_loop_channel_run_disconnect_connection; } void ags_loop_channel_run_init(AgsLoopChannelRun *loop_channel_run) { ags_recall_set_ability_flags((AgsRecall *) loop_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION)); AGS_RECALL(loop_channel_run)->name = "ags-loop"; AGS_RECALL(loop_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(loop_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(loop_channel_run)->xml_type = "ags-loop-channel-run"; AGS_RECALL(loop_channel_run)->port = NULL; AGS_RECALL(loop_channel_run)->child_type = G_TYPE_NONE; loop_channel_run->count_beats_audio_run = NULL; } void ags_loop_channel_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLoopChannelRun *loop_channel_run; GRecMutex *recall_mutex; loop_channel_run = AGS_LOOP_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(loop_channel_run); switch(prop_id){ case PROP_COUNT_BEATS_AUDIO_RUN: { AgsCountBeatsAudioRun *count_beats_audio_run, *old_count_beats_audio_run; gboolean is_template; count_beats_audio_run = (AgsCountBeatsAudioRun *) g_value_get_object(value); old_count_beats_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(loop_channel_run->count_beats_audio_run == count_beats_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(loop_channel_run->count_beats_audio_run != NULL){ old_count_beats_audio_run = loop_channel_run->count_beats_audio_run; g_object_unref(loop_channel_run->count_beats_audio_run); } if(count_beats_audio_run != NULL){ g_object_ref(count_beats_audio_run); } loop_channel_run->count_beats_audio_run = count_beats_audio_run; g_rec_mutex_unlock(recall_mutex); /* dependency */ if(ags_recall_test_flags((AgsRecall *) count_beats_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } if(is_template){ if(old_count_beats_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(loop_channel_run)->recall_dependency, (GObject *) old_count_beats_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(loop_channel_run), recall_dependency); } } if(is_template && count_beats_audio_run != NULL){ ags_recall_add_recall_dependency(AGS_RECALL(loop_channel_run), ags_recall_dependency_new((GObject *) count_beats_audio_run)); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_loop_channel_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLoopChannelRun *loop_channel_run; GRecMutex *recall_mutex; loop_channel_run = AGS_LOOP_CHANNEL_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(loop_channel_run); switch(prop_id){ case PROP_COUNT_BEATS_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, loop_channel_run->count_beats_audio_run); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_loop_channel_run_dispose(GObject *gobject) { AgsLoopChannelRun *loop_channel_run; loop_channel_run = AGS_LOOP_CHANNEL_RUN(gobject); /* count beats audio run */ if(loop_channel_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(loop_channel_run->count_beats_audio_run)); loop_channel_run->count_beats_audio_run = NULL; } /* call parent */ G_OBJECT_CLASS(ags_loop_channel_run_parent_class)->dispose(gobject); } void ags_loop_channel_run_finalize(GObject *gobject) { AgsLoopChannelRun *loop_channel_run; loop_channel_run = AGS_LOOP_CHANNEL_RUN(gobject); /* count beats audio run */ if(loop_channel_run->count_beats_audio_run != NULL){ g_object_unref(G_OBJECT(loop_channel_run->count_beats_audio_run)); } /* call parent */ G_OBJECT_CLASS(ags_loop_channel_run_parent_class)->finalize(gobject); } void ags_loop_channel_run_connect(AgsConnectable *connectable) { AgsLoopChannelRun *loop_channel_run; if(ags_connectable_is_connected(connectable)){ return; } loop_channel_run = AGS_LOOP_CHANNEL_RUN(connectable); /* call parent */ ags_loop_channel_run_parent_connectable_interface->connect(connectable); /* count beats audio run */ ags_connectable_connect_connection(connectable, (GObject *) loop_channel_run->count_beats_audio_run); } void ags_loop_channel_run_disconnect(AgsConnectable *connectable) { AgsLoopChannelRun *loop_channel_run; if(!ags_connectable_is_connected(connectable)){ return; } loop_channel_run = AGS_LOOP_CHANNEL_RUN(connectable); /* call parent */ ags_loop_channel_run_parent_connectable_interface->disconnect(connectable); /* count beats audio run */ ags_connectable_disconnect_connection(connectable, (GObject *) loop_channel_run->count_beats_audio_run); } void ags_loop_channel_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsLoopChannelRun *loop_channel_run; AgsCountBeatsAudioRun *count_beats_audio_run; loop_channel_run = AGS_LOOP_CHANNEL_RUN(connectable); if(connection == NULL){ return; } g_object_get(loop_channel_run, "count-beats-audio-run", &count_beats_audio_run, NULL); /* AgsCountBeatsAudioRun */ if((GObject *) count_beats_audio_run == connection){ g_signal_connect(count_beats_audio_run, "sequencer-start", G_CALLBACK(ags_loop_channel_run_start_callback), loop_channel_run); g_signal_connect(count_beats_audio_run, "sequencer-loop", G_CALLBACK(ags_loop_channel_run_loop_callback), loop_channel_run); g_signal_connect(count_beats_audio_run, "sequencer-stop", G_CALLBACK(ags_loop_channel_run_stop_callback), loop_channel_run); } g_object_unref(count_beats_audio_run); } void ags_loop_channel_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsLoopChannelRun *loop_channel_run; AgsCountBeatsAudioRun *count_beats_audio_run; loop_channel_run = AGS_LOOP_CHANNEL_RUN(connectable); if(connection == NULL){ return; } g_object_get(loop_channel_run, "count-beats-audio-run", &count_beats_audio_run, NULL); /* AgsCountBeatsAudioRun */ if((GObject *) loop_channel_run->count_beats_audio_run == connection){ g_object_disconnect(count_beats_audio_run, "any_signal::sequencer-start", G_CALLBACK(ags_loop_channel_run_start_callback), loop_channel_run, "any_signal::sequencer-loop", G_CALLBACK(ags_loop_channel_run_loop_callback), loop_channel_run, "any_signal::sequencer-stop", G_CALLBACK(ags_loop_channel_run_stop_callback), loop_channel_run, NULL); } g_object_unref(count_beats_audio_run); } void ags_loop_channel_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallContainer *recall_container; AgsRecallID *recall_id; AgsRecallDependency *recall_dependency; AgsCountBeatsAudioRun *count_beats_audio_run; GList *list_start, *list; guint i, i_stop; g_object_get(recall, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-channel-run", &list_start, NULL); list = ags_recall_find_template(list_start); if(list == NULL){ g_warning("AgsRecallClass::resolve - missing dependency"); g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); return; } template = AGS_RECALL(list->data); g_list_free_full(list_start, g_object_unref); g_object_get(template, "recall-dependency", &list_start, NULL); g_object_get(recall, "recall-id", &recall_id, NULL); /* prepare to resolve */ count_beats_audio_run = NULL; list = list_start; i_stop = 1; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_COUNT_BEATS_AUDIO_RUN(dependency)){ count_beats_audio_run = (AgsCountBeatsAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); i++; } g_object_unref(dependency); list = list->next; } g_object_set(G_OBJECT(recall), "count-beats-audio-run", count_beats_audio_run, NULL); g_object_unref(recall_container); g_object_unref(recall_id); g_list_free_full(list_start, g_object_unref); } void ags_loop_channel_run_create_audio_signals(AgsLoopChannelRun *loop_channel_run) { AgsChannel *channel; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *end_recycling; AgsRecycling *recycling, *next_recycling; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; GObject *output_soundcard; gdouble delay; guint attack; // g_message("debug"); g_object_get(loop_channel_run, "source", &channel, NULL); /* recycling */ g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); if(first_recycling == NULL){ g_object_unref(channel); return; } g_object_get(loop_channel_run, "output-soundcard", &output_soundcard, "recall-id", &recall_id, NULL); end_recycling = ags_recycling_next(last_recycling); /* delay and attack */ //TODO:JK: unclear attack = 0;// soundcard->attack[((tic_counter_incr == AGS_NOTATION_TICS_PER_BEAT) ? // 0: // tic_counter_incr)]; delay = 0.0; //soundcard->delay[((tic_counter_incr == AGS_NOTATION_TICS_PER_BEAT) ? // 0: // tic_counter_incr)]; recycling = first_recycling; g_object_ref(recycling); next_recycling = NULL; while(recycling != end_recycling){ audio_signal = ags_audio_signal_new((GObject *) output_soundcard, (GObject *) recycling, (GObject *) recall_id); audio_signal->stream_current = audio_signal->stream; /* */ ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, delay, attack); ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); ags_recycling_add_audio_signal(recycling, audio_signal); /* * unref AgsAudioSignal because AgsLoopChannelRun has no need for it * if you need a valid reference to audio_signal you have to g_object_ref(audio_signal) */ //FIXME:JK: #ifdef AGS_DEBUG g_message("+++++++++++++++++++++++++\n\nloop channel created: AgsAudioSignal#%llx[%u]\n\n+++++++++++++++++++++++++", (long long unsigned int) audio_signal, audio_signal->length); #endif next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* unref */ g_object_unref(channel); g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(first_recycling); g_object_unref(last_recycling); if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } } void ags_loop_channel_run_start_callback(AgsCountBeatsAudioRun *count_beats_audio_run, guint run_order, AgsLoopChannelRun *loop_channel_run) { #ifdef AGS_DEBUG g_message("ags_loop_channel_run_start_callback - run_order: %u; %u\n", AGS_RECALL_CHANNEL_RUN(loop_channel_run)->run_order, run_order); #endif ags_loop_channel_run_create_audio_signals(loop_channel_run); } void ags_loop_channel_run_loop_callback(AgsCountBeatsAudioRun *count_beats_audio_run, guint run_order, AgsLoopChannelRun *loop_channel_run) { #ifdef AGS_DEBUG g_message("ags_loop_channel_run_loop_callback - run_order: %u; %u", AGS_RECALL_CHANNEL_RUN(loop_channel_run)->run_order, run_order); #endif ags_loop_channel_run_create_audio_signals(loop_channel_run); } void ags_loop_channel_run_stop_callback(AgsCountBeatsAudioRun *count_beats_audio_run, guint run_order, AgsLoopChannelRun *loop_channel_run) { /* empty */ } /** * ags_loop_channel_run_new: * @source: the #AgsChannel * @count_beats_audio_run: the #AgsCountBeatsAudioRun dependency * * Create a new instance of #AgsLoopChannelRun * * Returns: the new #AgsLoopChannelRun * * Since: 3.0.0 */ AgsLoopChannelRun* ags_loop_channel_run_new(AgsChannel *source, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsLoopChannelRun *loop_channel_run; loop_channel_run = (AgsLoopChannelRun *) g_object_new(AGS_TYPE_LOOP_CHANNEL_RUN, "source", source, "count-beats-audio-run", count_beats_audio_run, NULL); return(loop_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_mute_recycling.h0000644000175000017500000000406613607210263017737 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTE_RECYCLING_H__ #define __AGS_MUTE_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTE_RECYCLING (ags_mute_recycling_get_type()) #define AGS_MUTE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTE_RECYCLING, AgsMuteRecycling)) #define AGS_MUTE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MUTE_RECYCLING, AgsMuteRecyclingClass)) #define AGS_IS_MUTE_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MUTE_RECYCLING)) #define AGS_IS_MUTE_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MUTE_RECYCLING)) #define AGS_MUTE_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MUTE_RECYCLING, AgsMuteRecyclingClass)) typedef struct _AgsMuteRecycling AgsMuteRecycling; typedef struct _AgsMuteRecyclingClass AgsMuteRecyclingClass; struct _AgsMuteRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsMuteRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_mute_recycling_get_type(); AgsMuteRecycling* ags_mute_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_MUTE_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_buffer_channel.h0000644000175000017500000000417213607210263017665 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUFFER_CHANNEL_H__ #define __AGS_BUFFER_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BUFFER_CHANNEL (ags_buffer_channel_get_type()) #define AGS_BUFFER_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUFFER_CHANNEL, AgsBufferChannel)) #define AGS_BUFFER_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BUFFER_CHANNEL, AgsBufferChannelClass)) #define AGS_IS_BUFFER_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_BUFFER_CHANNEL)) #define AGS_IS_BUFFER_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_BUFFER_CHANNEL)) #define AGS_BUFFER_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_BUFFER_CHANNEL, AgsBufferChannelClass)) typedef struct _AgsBufferChannel AgsBufferChannel; typedef struct _AgsBufferChannelClass AgsBufferChannelClass; struct _AgsBufferChannel { AgsRecallChannel recall_channel; AgsPort *muted; }; struct _AgsBufferChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_buffer_channel_get_type(); AgsBufferChannel* ags_buffer_channel_new(AgsChannel *destination, AgsChannel *source); G_END_DECLS #endif /*__AGS_BUFFER_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_delay_audio.c0000644000175000017500000015322213607210263017177 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_delay_audio_class_init(AgsDelayAudioClass *delay_audio); void ags_delay_audio_tactable_interface_init(AgsTactableInterface *tactable); void ags_delay_audio_init(AgsDelayAudio *delay_audio); void ags_delay_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_delay_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_delay_audio_dispose(GObject *gobject); void ags_delay_audio_finalize(GObject *gobject); void ags_delay_audio_notify_audio_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_delay_audio_notify_output_soundcard_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_delay_audio_notify_output_soundcard_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_delay_audio_notify_samplerate_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_delay_audio_notify_buffer_size_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_delay_audio_tic_after_callback(GObject *soundcard, AgsDelayAudio *delay_audio); gdouble ags_delay_audio_get_bpm(AgsTactable *tactable); gdouble ags_delay_audio_get_tact(AgsTactable *tactable); guint64 ags_delay_audio_get_sequencer_duration(AgsTactable *tactable); guint64 ags_delay_audio_get_notation_duration(AgsTactable *tactable); guint64 ags_delay_audio_get_wave_duration(AgsTactable *tactable); guint64 ags_delay_audio_get_midi_duration(AgsTactable *tactable); void ags_delay_audio_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm); void ags_delay_audio_change_tact(AgsTactable *tactable, gdouble new_tact, gdouble old_bpm); void ags_delay_audio_change_sequencer_duration(AgsTactable *tactable, guint64 duration); void ags_delay_audio_change_notation_duration(AgsTactable *tactable, guint64 duration); void ags_delay_audio_change_wave_duration(AgsTactable *tactable, guint64 duration); void ags_delay_audio_change_midi_duration(AgsTactable *tactable, guint64 duration); void ags_delay_audio_refresh_delay(AgsDelayAudio *delay_audio); /** * SECTION:ags_delay_audio * @short_description: delay audio * @title: AgsDelayAudio * @section_id: * @include: ags/audio/recall/ags_delay_audio.h * * The #AgsDelayAudio class provides ports to the effect processor. */ enum{ NOTATION_DURATION_CHANGED, SEQUENCER_DURATION_CHANGED, WAVE_DURATION_CHANGED, MIDI_DURATION_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, PROP_NOTATION_DELAY, PROP_SEQUENCER_DELAY, PROP_WAVE_DELAY, PROP_MIDI_DELAY, PROP_TACT, PROP_BPM, PROP_NOTATION_DURATION, PROP_SEQUENCER_DURATION, PROP_WAVE_DURATION, PROP_MIDI_DURATION, }; static gpointer ags_delay_audio_parent_class = NULL; static guint delay_audio_signals[LAST_SIGNAL]; static const gchar *ags_delay_audio_plugin_name = "ags-delay"; static const gchar *ags_delay_audio_specifier[] = { "./bpm[0]", "./tact[0]", "./sequencer_delay[0]", "./notation_delay[0]", "./wave_delay[0]", "./midi_delay[0]", "./sequencer_duration[0]", "./notation_duration[0]" "./wave_duration[0]", "./midi_duration[0]", }; static const gchar *ags_delay_audio_control_port[] = { "1/10", "2/10", "3/10", "4/10", "5/10", "6/10", "7/10", "8/10", "9/10", "10/10", }; GType ags_delay_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_delay_audio = 0; static const GTypeInfo ags_delay_audio_info = { sizeof (AgsDelayAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_delay_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsDelayAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_delay_audio_init, }; static const GInterfaceInfo ags_tactable_interface_info = { (GInterfaceInitFunc) ags_delay_audio_tactable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_delay_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsDelayAudio", &ags_delay_audio_info, 0); g_type_add_interface_static(ags_type_delay_audio, AGS_TYPE_TACTABLE, &ags_tactable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_delay_audio); } return g_define_type_id__volatile; } void ags_delay_audio_class_init(AgsDelayAudioClass *delay_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_delay_audio_parent_class = g_type_class_peek_parent(delay_audio); /* GObjectClass */ gobject = (GObjectClass *) delay_audio; gobject->set_property = ags_delay_audio_set_property; gobject->get_property = ags_delay_audio_get_property; gobject->dispose = ags_delay_audio_dispose; gobject->finalize = ags_delay_audio_finalize; /* properties */ /** * AgsDelayAudio:bpm: * * The beats per minute. * * Since: 3.0.0 */ param_spec = g_param_spec_object("bpm", i18n_pspec("bpm of recall"), i18n_pspec("The recall's bpm"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsDelayAudio:tact: * * The tact segmentation. * * Since: 3.0.0 */ param_spec = g_param_spec_object("tact", i18n_pspec("tact of recall"), i18n_pspec("The recall's tact"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TACT, param_spec); /** * AgsDelayAudio:sequencer-delay: * * The sequencer's delay. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer-delay", i18n_pspec("sequencer-delay of recall"), i18n_pspec("The delay of the sequencer"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_DELAY, param_spec); /** * AgsDelayAudio:notation-delay: * * The notation's delay. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-delay", i18n_pspec("notation-delay of recall"), i18n_pspec("The delay of the notation"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_DELAY, param_spec); /** * AgsDelayAudio:wave-delay: * * The wave's delay. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-delay", i18n_pspec("wave-delay of recall"), i18n_pspec("The delay of the wave"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_DELAY, param_spec); /** * AgsDelayAudio:midi-delay: * * The midi's delay. * * Since: 3.0.0 */ param_spec = g_param_spec_object("midi-delay", i18n_pspec("midi-delay of recall"), i18n_pspec("The delay of the midi"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_DELAY, param_spec); /** * AgsDelayAudio:sequencer-duration: * * The sequencer's duration. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer-duration", i18n_pspec("sequencer-duration of recall"), i18n_pspec("The duration of the sequencer"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_DURATION, param_spec); /** * AgsDelayAudio:notation-duration: * * The notation's duration. * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation-duration", i18n_pspec("notation-duration of recall"), i18n_pspec("The duration of the notation"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_DURATION, param_spec); /** * AgsDelayAudio:wave-duration: * * The wave's duration. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave-duration", i18n_pspec("wave-duration of recall"), i18n_pspec("The duration of the wave"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_DURATION, param_spec); /** * AgsDelayAudio:midi-duration: * * The midi's duration. * * Since: 3.0.0 */ param_spec = g_param_spec_object("midi-duration", i18n_pspec("midi-duration of recall"), i18n_pspec("The duration of the midi"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_DURATION, param_spec); /* signals */ /** * AgsDelayAudio::sequencer-duration-changed: * @delay_audio: the #AgsDelaAudio * * The ::sequencer-duration-changed signal notifies about changed duration * of sequencer. * * Since: 3.0.0 */ delay_audio_signals[SEQUENCER_DURATION_CHANGED] = g_signal_new("sequencer-duration-changed", G_TYPE_FROM_CLASS(delay_audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioClass, sequencer_duration_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsDelayAudio::notation-duration-changed: * @delay_audio: the #AgsDelaAudio * * The ::notation-duration-changed signal notifies about changed duration * of notation. * * Since: 3.0.0 */ delay_audio_signals[NOTATION_DURATION_CHANGED] = g_signal_new("notation-duration-changed", G_TYPE_FROM_CLASS(delay_audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioClass, notation_duration_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsDelayAudio::wave-duration-changed: * @delay_audio: the #AgsDelaAudio * * The ::wave-duration-changed signal notifies about changed duration * of wave. * * Since: 3.0.0 */ delay_audio_signals[WAVE_DURATION_CHANGED] = g_signal_new("wave-duration-changed", G_TYPE_FROM_CLASS(delay_audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioClass, wave_duration_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsDelayAudio::midi-duration-changed: * @delay_audio: the #AgsDelaAudio * * The ::midi-duration-changed signal notifies about changed duration * of midi. * * Since: 3.0.0 */ delay_audio_signals[MIDI_DURATION_CHANGED] = g_signal_new("midi-duration-changed", G_TYPE_FROM_CLASS(delay_audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioClass, midi_duration_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_delay_audio_tactable_interface_init(AgsTactableInterface *tactable) { tactable->get_sequencer_duration = ags_delay_audio_get_sequencer_duration; tactable->get_notation_duration = ags_delay_audio_get_notation_duration; tactable->get_wave_duration = ags_delay_audio_get_wave_duration; tactable->get_midi_duration = ags_delay_audio_get_midi_duration; tactable->get_bpm = ags_delay_audio_get_bpm; tactable->get_tact = ags_delay_audio_get_tact; tactable->change_sequencer_duration = ags_delay_audio_change_sequencer_duration; tactable->change_notation_duration = ags_delay_audio_change_notation_duration; tactable->change_wave_duration = ags_delay_audio_change_wave_duration; tactable->change_midi_duration = ags_delay_audio_change_midi_duration; tactable->change_bpm = ags_delay_audio_change_bpm; tactable->change_tact = ags_delay_audio_change_tact; } void ags_delay_audio_init(AgsDelayAudio *delay_audio) { GList *port; gdouble bpm; gdouble delay; AGS_RECALL(delay_audio)->name = "ags-delay"; AGS_RECALL(delay_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(delay_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(delay_audio)->xml_type = "ags-delay-audio"; port = NULL; bpm = AGS_SOUNDCARD_DEFAULT_BPM; delay = AGS_SOUNDCARD_DEFAULT_DELAY; /* bpm */ delay_audio->bpm = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[0], "control-port", ags_delay_audio_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(delay_audio->bpm); delay_audio->bpm->port_value.ags_port_double = bpm; /* add port */ port = g_list_prepend(port, delay_audio->bpm); g_object_ref(delay_audio->bpm); /* tact */ delay_audio->tact = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[1], "control-port", ags_delay_audio_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(delay_audio->tact); delay_audio->tact->port_value.ags_port_double = AGS_SOUNDCARD_DEFAULT_TACT; /* add port */ port = g_list_prepend(port, delay_audio->tact); g_object_ref(delay_audio->tact); /* sequencer delay */ delay_audio->sequencer_delay = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[2], "control-port", ags_delay_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(delay_audio->sequencer_delay); delay_audio->sequencer_delay->port_value.ags_port_double = delay; /* add port */ port = g_list_prepend(port, delay_audio->sequencer_delay); g_object_ref(delay_audio->sequencer_delay); /* notation delay */ delay_audio->notation_delay = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[3], "control-port", ags_delay_audio_control_port[3], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(delay_audio->notation_delay); delay_audio->notation_delay->port_value.ags_port_double = delay; /* add port */ port = g_list_prepend(port, delay_audio->notation_delay); g_object_ref(delay_audio->notation_delay); /* wave delay */ delay_audio->wave_delay = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[2], "control-port", ags_delay_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(delay_audio->wave_delay); delay_audio->wave_delay->port_value.ags_port_double = delay; /* add port */ port = g_list_prepend(port, delay_audio->wave_delay); g_object_ref(delay_audio->wave_delay); /* midi delay */ delay_audio->midi_delay = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[2], "control-port", ags_delay_audio_control_port[2], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_DOUBLE, "port-value-size", sizeof(gdouble), "port-value-length", 1, NULL); g_object_ref(delay_audio->midi_delay); delay_audio->midi_delay->port_value.ags_port_double = delay; /* add port */ port = g_list_prepend(port, delay_audio->midi_delay); g_object_ref(delay_audio->midi_delay); /* sequencer duration */ delay_audio->sequencer_duration = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[4], "control-port", ags_delay_audio_control_port[4], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(delay_audio->sequencer_duration); delay_audio->sequencer_duration->port_value.ags_port_double = ceil(16.0 * delay); /* add port */ port = g_list_prepend(port, delay_audio->sequencer_duration); g_object_ref(delay_audio->sequencer_duration); /* notation duration */ delay_audio->notation_duration = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[5], "control-port", ags_delay_audio_control_port[5], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(delay_audio->notation_duration); delay_audio->notation_duration->port_value.ags_port_double = ceil(AGS_NOTATION_DEFAULT_DURATION * delay); /* add port */ port = g_list_prepend(port, delay_audio->notation_duration); g_object_ref(delay_audio->notation_duration); /* wave duration */ delay_audio->wave_duration = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[4], "control-port", ags_delay_audio_control_port[4], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(delay_audio->wave_duration); delay_audio->wave_duration->port_value.ags_port_double = ceil(16.0 * delay); /* add port */ port = g_list_prepend(port, delay_audio->wave_duration); g_object_ref(delay_audio->wave_duration); /* midi duration */ delay_audio->midi_duration = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_delay_audio_plugin_name, "specifier", ags_delay_audio_specifier[4], "control-port", ags_delay_audio_control_port[4], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(delay_audio->midi_duration); delay_audio->midi_duration->port_value.ags_port_double = ceil(16.0 * delay); /* add port */ port = g_list_prepend(port, delay_audio->midi_duration); g_object_ref(delay_audio->midi_duration); /* set port */ AGS_RECALL(delay_audio)->port = port; /* notify some properties to do final configuration */ g_signal_connect_after(delay_audio, "notify::audio", G_CALLBACK(ags_delay_audio_notify_audio_after_callback), NULL); // g_signal_connect(delay_audio, "notify::output-soundcard", // G_CALLBACK(ags_delay_audio_notify_output_soundcard_callback), NULL); g_signal_connect_after(delay_audio, "notify::output-soundcard", G_CALLBACK(ags_delay_audio_notify_output_soundcard_after_callback), NULL); } void ags_delay_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsDelayAudio *delay_audio; GRecMutex *recall_mutex; delay_audio = AGS_DELAY_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(delay_audio); switch(prop_id){ case PROP_BPM: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->bpm){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->bpm != NULL){ g_object_unref(G_OBJECT(delay_audio->bpm)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->bpm = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_TACT: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->tact){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->tact != NULL){ g_object_unref(G_OBJECT(delay_audio->tact)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->tact = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_DELAY: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->sequencer_delay){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->sequencer_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->sequencer_delay)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->sequencer_delay = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_DELAY: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->notation_delay){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->notation_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->notation_delay)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->notation_delay = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_DELAY: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->wave_delay){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->wave_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->wave_delay)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->wave_delay = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_DELAY: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->midi_delay){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->midi_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->midi_delay)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->midi_delay = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_DURATION: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->sequencer_duration){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->sequencer_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->sequencer_duration)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->sequencer_duration = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_DURATION: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->notation_duration){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->notation_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->notation_duration)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->notation_duration = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_DURATION: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->wave_duration){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->wave_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->wave_duration)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->wave_duration = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_DURATION: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == delay_audio->midi_duration){ g_rec_mutex_unlock(recall_mutex); return; } if(delay_audio->midi_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->midi_duration)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } delay_audio->midi_duration = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_delay_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsDelayAudio *delay_audio; GRecMutex *recall_mutex; delay_audio = AGS_DELAY_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(delay_audio); switch(prop_id){ case PROP_BPM: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->bpm); g_rec_mutex_unlock(recall_mutex); } break; case PROP_TACT: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->tact); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_DELAY: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->sequencer_delay); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_DELAY: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->notation_delay); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_DELAY: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->wave_delay); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_DELAY: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->midi_delay); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_DURATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->notation_duration); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_DURATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->sequencer_duration); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_DURATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->wave_duration); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_DURATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, delay_audio->midi_duration); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_delay_audio_dispose(GObject *gobject) { AgsAudio *audio; AgsDelayAudio *delay_audio; GObject *output_soundcard; delay_audio = AGS_DELAY_AUDIO(gobject); /* disconnect */ output_soundcard = AGS_RECALL(gobject)->output_soundcard; if(output_soundcard != NULL){ g_object_disconnect(output_soundcard, "any_signal::tic", G_CALLBACK(ags_delay_audio_tic_after_callback), gobject, NULL); } audio = AGS_RECALL_AUDIO(gobject)->audio; if(audio != NULL){ g_object_disconnect(audio, "any_signal::notify::samplerate", G_CALLBACK(ags_delay_audio_notify_samplerate_after_callback), gobject, "any_signal::notify::buffer-size", G_CALLBACK(ags_delay_audio_notify_buffer_size_after_callback), gobject, NULL); } /* bpm and tact */ if(delay_audio->bpm != NULL){ g_object_unref(G_OBJECT(delay_audio->bpm)); delay_audio->bpm = NULL; } if(delay_audio->tact != NULL){ g_object_unref(G_OBJECT(delay_audio->tact)); delay_audio->tact = NULL; } /* delay */ if(delay_audio->sequencer_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->sequencer_delay)); delay_audio->sequencer_delay = NULL; } if(delay_audio->notation_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->notation_delay)); delay_audio->notation_delay = NULL; } if(delay_audio->wave_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->wave_delay)); delay_audio->wave_delay = NULL; } if(delay_audio->midi_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->midi_delay)); delay_audio->midi_delay = NULL; } /* duration */ if(delay_audio->sequencer_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->sequencer_duration)); delay_audio->sequencer_duration = NULL; } if(delay_audio->notation_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->notation_duration)); delay_audio->notation_duration = NULL; } if(delay_audio->wave_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->wave_duration)); delay_audio->wave_duration = NULL; } if(delay_audio->midi_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->midi_duration)); delay_audio->midi_duration = NULL; } /* call parent */ G_OBJECT_CLASS(ags_delay_audio_parent_class)->dispose(gobject); } void ags_delay_audio_finalize(GObject *gobject) { AgsAudio *audio; AgsDelayAudio *delay_audio; GObject *output_soundcard; delay_audio = AGS_DELAY_AUDIO(gobject); /* disconnect */ output_soundcard = AGS_RECALL(gobject)->output_soundcard; if(output_soundcard != NULL){ g_object_disconnect(output_soundcard, "any_signal::tic", G_CALLBACK(ags_delay_audio_tic_after_callback), gobject, NULL); } audio = AGS_RECALL_AUDIO(gobject)->audio; if(audio != NULL){ g_object_disconnect(audio, "any_signal::notify::samplerate", G_CALLBACK(ags_delay_audio_notify_samplerate_after_callback), gobject, "any_signal::notify::buffer-size", G_CALLBACK(ags_delay_audio_notify_buffer_size_after_callback), gobject, NULL); } if(delay_audio->bpm != NULL){ g_object_unref(G_OBJECT(delay_audio->bpm)); } if(delay_audio->tact != NULL){ g_object_unref(G_OBJECT(delay_audio->tact)); } if(delay_audio->sequencer_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->sequencer_delay)); } if(delay_audio->notation_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->notation_delay)); } if(delay_audio->wave_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->wave_delay)); } if(delay_audio->midi_delay != NULL){ g_object_unref(G_OBJECT(delay_audio->midi_delay)); } if(delay_audio->sequencer_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->sequencer_duration)); } if(delay_audio->notation_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->notation_duration)); } if(delay_audio->wave_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->wave_duration)); } if(delay_audio->midi_duration != NULL){ g_object_unref(G_OBJECT(delay_audio->midi_duration)); } /* call parent */ G_OBJECT_CLASS(ags_delay_audio_parent_class)->finalize(gobject); } void ags_delay_audio_notify_audio_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsAudio *audio; AgsDelayAudio *delay_audio; g_object_get(gobject, "audio", &audio, NULL); if(audio == NULL){ return; } delay_audio = AGS_DELAY_AUDIO(gobject); g_signal_connect_after(audio, "notify::samplerate", G_CALLBACK(ags_delay_audio_notify_samplerate_after_callback), delay_audio); g_signal_connect_after(audio, "notify::buffer-size", G_CALLBACK(ags_delay_audio_notify_buffer_size_after_callback), delay_audio); g_object_unref(audio); } void ags_delay_audio_notify_output_soundcard_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { GObject *output_soundcard; g_object_get(gobject, "output-soundcard", &output_soundcard, NULL); if(output_soundcard == NULL){ return; } g_object_disconnect(output_soundcard, "any_signal::tic", G_CALLBACK(ags_delay_audio_tic_after_callback), gobject, NULL); g_object_unref(output_soundcard); } void ags_delay_audio_notify_output_soundcard_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsPort *bpm; AgsPort *tact; AgsPort *sequencer_delay; AgsPort *notation_delay; AgsPort *wave_delay; AgsPort *midi_delay; AgsPort *sequencer_duration; AgsPort *notation_duration; AgsPort *wave_duration; AgsPort *midi_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_bpm; gdouble current_delay; gchar *str; GValue value = {0,}; g_object_get(gobject, "output-soundcard", &output_soundcard, NULL); if(output_soundcard == NULL){ return; } g_signal_connect_after(output_soundcard, "tic", G_CALLBACK(ags_delay_audio_tic_after_callback), gobject); delay_audio = AGS_DELAY_AUDIO(gobject); /* get some fields */ current_bpm = ags_soundcard_get_bpm(AGS_SOUNDCARD(output_soundcard)); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); g_object_get(delay_audio, "bpm", &bpm, "tact", &tact, "sequencer-delay", &sequencer_delay, "notation-delay", ¬ation_delay, "wave-delay", &wave_delay, "midi-delay", &midi_delay, "sequencer-duration", &sequencer_duration, "notation-duration", ¬ation_duration, "wave-duration", &wave_duration, "midi-duration", &midi_duration, NULL); /* bpm */ g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, current_bpm); ags_port_safe_write(bpm, &value); g_object_unref(bpm); /* tact */ g_value_reset(&value); //TODO:JK: read config g_value_set_double(&value, AGS_SOUNDCARD_DEFAULT_TACT); ags_port_safe_write(tact, &value); g_object_unref(tact); /* sequencer delay */ g_value_reset(&value); g_value_set_double(&value, current_delay); ags_port_safe_write(sequencer_delay, &value); g_object_unref(sequencer_delay); /* notation delay */ ags_port_safe_write(notation_delay, &value); g_object_unref(notation_delay); /* wave delay */ ags_port_safe_write(wave_delay, &value); g_object_unref(wave_delay); /* midi delay */ ags_port_safe_write(midi_delay, &value); g_object_unref(midi_delay); /* sequencer duration */ g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(16.0 * current_delay)); ags_port_safe_write(sequencer_duration, &value); g_object_unref(sequencer_duration); /* notation duration */ g_value_set_uint64(&value, (guint64) ceil(AGS_NOTATION_DEFAULT_DURATION * current_delay)); ags_port_safe_write(notation_duration, &value); g_object_unref(notation_duration); /* wave duration */ ags_port_safe_write(wave_duration, &value); g_object_unref(wave_duration); /* midi duration */ ags_port_safe_write(midi_duration, &value); g_value_unset(&value); g_object_unref(midi_duration); g_object_unref(output_soundcard); } void ags_delay_audio_notify_samplerate_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsDelayAudio *delay_audio; delay_audio = AGS_DELAY_AUDIO(user_data); ags_delay_audio_refresh_delay(delay_audio); } void ags_delay_audio_notify_buffer_size_after_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsDelayAudio *delay_audio; delay_audio = AGS_DELAY_AUDIO(user_data); ags_delay_audio_refresh_delay(delay_audio); } void ags_delay_audio_tic_after_callback(GObject *soundcard, AgsDelayAudio *delay_audio) { ags_delay_audio_refresh_delay(delay_audio); } gdouble ags_delay_audio_get_bpm(AgsTactable *tactable) { AgsPort *bpm; AgsDelayAudio *delay_audio; gdouble current_bpm; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "bpm", &bpm, NULL); /* retrieve bpm */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(bpm, &value); current_bpm = g_value_get_double(&value); g_value_unset(&value); g_object_unref(bpm); return(current_bpm); } gdouble ags_delay_audio_get_tact(AgsTactable *tactable) { AgsPort *tact; AgsDelayAudio *delay_audio; gdouble current_tact; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "tact", &tact, NULL); /* retrieve tact */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(tact, &value); current_tact = g_value_get_double(&value); g_value_unset(&value); g_object_unref(tact); return(current_tact); } guint64 ags_delay_audio_get_sequencer_duration(AgsTactable *tactable) { AgsPort *sequencer_duration; AgsDelayAudio *delay_audio; gdouble current_sequencer_duration; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "sequencer-duration", &sequencer_duration, NULL); /* retrieve tact */ g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(sequencer_duration, &value); current_sequencer_duration = g_value_get_uint64(&value); g_value_unset(&value); g_object_unref(sequencer_duration); return(current_sequencer_duration); } guint64 ags_delay_audio_get_notation_duration(AgsTactable *tactable) { AgsPort *notation_duration; AgsDelayAudio *delay_audio; gdouble current_notation_duration; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "notation-duration", ¬ation_duration, NULL); /* retrieve tact */ g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(notation_duration, &value); current_notation_duration = g_value_get_uint64(&value); g_value_unset(&value); g_object_unref(notation_duration); return(current_notation_duration); } guint64 ags_delay_audio_get_wave_duration(AgsTactable *tactable) { AgsPort *wave_duration; AgsDelayAudio *delay_audio; gdouble current_wave_duration; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "wave-duration", &wave_duration, NULL); /* retrieve tact */ g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(wave_duration, &value); current_wave_duration = g_value_get_uint64(&value); g_value_unset(&value); g_object_unref(wave_duration); return(current_wave_duration); } guint64 ags_delay_audio_get_midi_duration(AgsTactable *tactable) { AgsPort *midi_duration; AgsDelayAudio *delay_audio; gdouble current_midi_duration; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "midi-duration", &midi_duration, NULL); /* retrieve tact */ g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(midi_duration, &value); current_midi_duration = g_value_get_uint64(&value); g_value_unset(&value); g_object_unref(midi_duration); return(current_midi_duration); } void ags_delay_audio_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm) { AgsPort *bpm; AgsPort *sequencer_delay; AgsPort *notation_delay; AgsPort *wave_delay; AgsPort *midi_delay; AgsPort *sequencer_duration; AgsPort *notation_duration; AgsPort *wave_duration; AgsPort *midi_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "output-soundcard", &output_soundcard, "bpm", &bpm, "sequencer-delay", &sequencer_delay, "notation-delay", ¬ation_delay, "wave-delay", &wave_delay, "midi-delay", &midi_delay, "sequencer-duration", &sequencer_duration, "notation-duration", ¬ation_duration, "wave-duration", &wave_duration, "midi-duration", &midi_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* -- start adjust -- */ g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, current_delay); /* sequencer delay */ ags_port_safe_write(sequencer_delay, &value); g_object_unref(sequencer_delay); /* notation delay */ ags_port_safe_write(notation_delay, &value); g_object_unref(notation_delay); /* wave delay */ ags_port_safe_write(wave_delay, &value); g_object_unref(wave_delay); /* midi delay */ ags_port_safe_write(midi_delay, &value); g_object_unref(midi_delay); /* bpm */ g_value_reset(&value); g_value_set_double(&value, new_bpm); ags_port_safe_write(bpm, &value); g_object_unref(bpm); /* sequencer duration */ g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(16.0 * current_delay)); ags_port_safe_write(sequencer_duration, &value); g_object_unref(sequencer_duration); /* notation duration */ g_value_set_uint64(&value, (guint64) ceil(AGS_NOTATION_DEFAULT_DURATION * current_delay)); ags_port_safe_write(notation_duration, &value); g_object_unref(notation_duration); /* wave duration */ ags_port_safe_write(wave_duration, &value); g_object_unref(wave_duration); /* midi duration */ ags_port_safe_write(midi_duration, &value); g_object_unref(midi_duration); /* -- finish adjust -- */ g_value_unset(&value); /* emit changed */ ags_delay_audio_sequencer_duration_changed(delay_audio); ags_delay_audio_notation_duration_changed(delay_audio); ags_delay_audio_wave_duration_changed(delay_audio); ags_delay_audio_midi_duration_changed(delay_audio); g_object_unref(output_soundcard); } void ags_delay_audio_change_tact(AgsTactable *tactable, gdouble new_tact, gdouble old_tact) { AgsPort *tact; AgsPort *sequencer_delay; AgsPort *notation_delay; AgsPort *wave_delay; AgsPort *midi_delay; AgsPort *sequencer_duration; AgsPort *notation_duration; AgsPort *wave_duration; AgsPort *midi_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); g_object_get(delay_audio, "output-soundcard", &output_soundcard, "tact", &tact, "sequencer-delay", &sequencer_delay, "notation-delay", ¬ation_delay, "wave-delay", &wave_delay, "midi-delay", &midi_delay, "sequencer-duration", &sequencer_duration, "notation-duration", ¬ation_duration, "wave-duration", &wave_duration, "midi-duration", &midi_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* -- start adjust -- */ g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, current_delay); /* sequencer delay */ ags_port_safe_write(sequencer_delay, &value); g_object_unref(sequencer_delay); /* notation delay */ ags_port_safe_write(notation_delay, &value); g_object_unref(notation_delay); /* wave delay */ ags_port_safe_write(wave_delay, &value); g_object_unref(wave_delay); /* midi delay */ ags_port_safe_write(midi_delay, &value); g_object_unref(midi_delay); /* tact */ g_value_reset(&value); g_value_set_double(&value, new_tact); ags_port_safe_write(tact, &value); g_object_unref(tact); /* sequencer duration */ g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(16.0 * current_delay)); ags_port_safe_write(sequencer_duration, &value); g_object_unref(sequencer_duration); /* notation duration */ g_value_set_uint64(&value, (guint64) ceil(AGS_NOTATION_DEFAULT_DURATION * current_delay)); ags_port_safe_write(notation_duration, &value); g_object_unref(notation_duration); /* wave duration */ ags_port_safe_write(wave_duration, &value); g_object_unref(wave_duration); /* midi duration */ ags_port_safe_write(midi_duration, &value); g_object_unref(midi_duration); /* -- finish adjust -- */ g_value_unset(&value); /* emit changed */ ags_delay_audio_sequencer_duration_changed(delay_audio); ags_delay_audio_notation_duration_changed(delay_audio); ags_delay_audio_wave_duration_changed(delay_audio); ags_delay_audio_midi_duration_changed(delay_audio); g_object_unref(output_soundcard); } void ags_delay_audio_refresh_delay(AgsDelayAudio *delay_audio) { AgsPort *sequencer_delay; AgsPort *notation_delay; AgsPort *wave_delay; AgsPort *midi_delay; AgsPort *sequencer_duration; AgsPort *notation_duration; AgsPort *wave_duration; AgsPort *midi_duration; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; g_object_get(delay_audio, "output-soundcard", &output_soundcard, NULL); if(output_soundcard == NULL){ return; } g_object_get(delay_audio, "sequencer-delay", &sequencer_delay, "notation-delay", ¬ation_delay, "wave-delay", &wave_delay, "midi-delay", &midi_delay, "sequencer-duration", &sequencer_duration, "notation-duration", ¬ation_duration, "wave-duration", &wave_duration, "midi-duration", &midi_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* -- start adjust -- */ g_value_init(&value, G_TYPE_DOUBLE); g_value_set_double(&value, current_delay); /* sequencer delay */ ags_port_safe_write(sequencer_delay, &value); g_object_unref(sequencer_delay); /* notation delay */ ags_port_safe_write(notation_delay, &value); g_object_unref(notation_delay); /* wave delay */ ags_port_safe_write(wave_delay, &value); g_object_unref(wave_delay); /* midi delay */ ags_port_safe_write(midi_delay, &value); g_object_unref(midi_delay); /* sequencer duration */ g_value_unset(&value); g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(16.0 * current_delay)); ags_port_safe_write(sequencer_duration, &value); g_object_unref(sequencer_duration); /* notation duration */ g_value_set_uint64(&value, (guint64) ceil(AGS_NOTATION_DEFAULT_DURATION * current_delay)); ags_port_safe_write(notation_duration, &value); /* wave duration */ ags_port_safe_write(wave_duration, &value); g_object_unref(wave_duration); /* midi duration */ ags_port_safe_write(midi_duration, &value); g_object_unref(midi_duration); /* -- finish adjust -- */ g_value_unset(&value); /* emit changed */ ags_delay_audio_sequencer_duration_changed(delay_audio); ags_delay_audio_notation_duration_changed(delay_audio); ags_delay_audio_wave_duration_changed(delay_audio); ags_delay_audio_midi_duration_changed(delay_audio); g_object_unref(output_soundcard); } void ags_delay_audio_change_sequencer_duration(AgsTactable *tactable, guint64 duration) { AgsPort *sequencer_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); /* get some fields */ g_object_get(delay_audio, "output-soundcard", &output_soundcard, "sequencer-duration", &sequencer_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* apply duration */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(duration * current_delay)); ags_port_safe_write(sequencer_duration, &value); g_value_unset(&value); g_object_unref(sequencer_duration); /* emit changed */ ags_delay_audio_sequencer_duration_changed(delay_audio); g_object_unref(output_soundcard); } void ags_delay_audio_change_notation_duration(AgsTactable *tactable, guint64 duration) { AgsPort *notation_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); /* get some fields */ g_object_get(delay_audio, "output-soundcard", &output_soundcard, "notation-duration", ¬ation_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* apply duration */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(duration * current_delay)); ags_port_safe_write(notation_duration, &value); g_value_unset(&value); g_object_unref(notation_duration); /* emit changed */ ags_delay_audio_notation_duration_changed(delay_audio); } void ags_delay_audio_change_wave_duration(AgsTactable *tactable, guint64 duration) { AgsPort *wave_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); /* get some fields */ g_object_get(delay_audio, "output-soundcard", &output_soundcard, "wave-duration", &wave_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* apply duration */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(duration * current_delay)); ags_port_safe_write(wave_duration, &value); g_value_unset(&value); g_object_unref(wave_duration); /* emit changed */ ags_delay_audio_wave_duration_changed(delay_audio); g_object_unref(output_soundcard); } void ags_delay_audio_change_midi_duration(AgsTactable *tactable, guint64 duration) { AgsPort *midi_duration; AgsDelayAudio *delay_audio; GObject *output_soundcard; gdouble current_delay; GValue value = {0,}; delay_audio = AGS_DELAY_AUDIO(tactable); /* get some fields */ g_object_get(delay_audio, "output-soundcard", &output_soundcard, "midi-duration", &midi_duration, NULL); current_delay = ags_soundcard_get_delay(AGS_SOUNDCARD(output_soundcard)); /* apply duration */ g_value_init(&value, G_TYPE_UINT64); g_value_set_uint64(&value, (guint64) ceil(duration * current_delay)); ags_port_safe_write(midi_duration, &value); g_value_unset(&value); g_object_unref(midi_duration); /* emit changed */ ags_delay_audio_midi_duration_changed(delay_audio); g_object_unref(output_soundcard); } /** * ags_delay_audio_sequencer_duration_changed: * @delay_audio: the #AgsDelayAudio * * Sequencer duration changed of #AgsDelayAudio * * Since: 3.0.0 */ void ags_delay_audio_sequencer_duration_changed(AgsDelayAudio *delay_audio) { g_return_if_fail(AGS_IS_DELAY_AUDIO(delay_audio)); g_object_ref((GObject *) delay_audio); g_signal_emit(G_OBJECT(delay_audio), delay_audio_signals[SEQUENCER_DURATION_CHANGED], 0); g_object_unref((GObject *) delay_audio); } /** * ags_delay_audio_notation_duration_changed: * @delay_audio: the #AgsDelayAudio * * Notation duration changed of #AgsDelayAudio * * Since: 3.0.0 */ void ags_delay_audio_notation_duration_changed(AgsDelayAudio *delay_audio) { g_return_if_fail(AGS_IS_DELAY_AUDIO(delay_audio)); g_object_ref((GObject *) delay_audio); g_signal_emit(G_OBJECT(delay_audio), delay_audio_signals[NOTATION_DURATION_CHANGED], 0); g_object_unref((GObject *) delay_audio); } /** * ags_delay_audio_wave_duration_changed: * @delay_audio: the #AgsDelayAudio * * Wave duration changed of #AgsDelayAudio * * Since: 3.0.0 */ void ags_delay_audio_wave_duration_changed(AgsDelayAudio *delay_audio) { g_return_if_fail(AGS_IS_DELAY_AUDIO(delay_audio)); g_object_ref((GObject *) delay_audio); g_signal_emit(G_OBJECT(delay_audio), delay_audio_signals[WAVE_DURATION_CHANGED], 0); g_object_unref((GObject *) delay_audio); } /** * ags_delay_audio_midi_duration_changed: * @delay_audio: the #AgsDelayAudio * * Midi duration changed of #AgsDelayAudio * * Since: 3.0.0 */ void ags_delay_audio_midi_duration_changed(AgsDelayAudio *delay_audio) { g_return_if_fail(AGS_IS_DELAY_AUDIO(delay_audio)); g_object_ref((GObject *) delay_audio); g_signal_emit(G_OBJECT(delay_audio), delay_audio_signals[MIDI_DURATION_CHANGED], 0); g_object_unref((GObject *) delay_audio); } /** * ags_delay_audio_new: * @audio: the #AgsAudio * * Creates a new instance of #AgsDelayAudio * * Returns: the new #AgsDelayAudio * * Since: 3.0.0 */ AgsDelayAudio* ags_delay_audio_new(AgsAudio *audio) { AgsDelayAudio *delay_audio; delay_audio = (AgsDelayAudio *) g_object_new(AGS_TYPE_DELAY_AUDIO, "audio", audio, NULL); return(delay_audio); } gsequencer-3.1.3/ags/audio/recall/ags_loop_channel_run.h0000644000175000017500000000441013607210263020244 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LOOP_CHANNEL_RUN_H__ #define __AGS_LOOP_CHANNEL_RUN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LOOP_CHANNEL_RUN (ags_loop_channel_run_get_type()) #define AGS_LOOP_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LOOP_CHANNEL_RUN, AgsLoopChannelRun)) #define AGS_LOOP_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LOOP_CHANNEL_RUN, AgsLoopChannelRunClass)) #define AGS_IS_LOOP_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LOOP_CHANNEL_RUN)) #define AGS_IS_LOOP_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LOOP_CHANNEL_RUN)) #define AGS_LOOP_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LOOP_CHANNEL_RUN, AgsLoopChannelRunClass)) typedef struct _AgsLoopChannelRun AgsLoopChannelRun; typedef struct _AgsLoopChannelRunClass AgsLoopChannelRunClass; struct _AgsLoopChannelRun { AgsRecallChannelRun recall_channel_run; AgsCountBeatsAudioRun *count_beats_audio_run; }; struct _AgsLoopChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_loop_channel_run_get_type(); AgsLoopChannelRun* ags_loop_channel_run_new(AgsChannel *source, AgsCountBeatsAudioRun *count_beats_audio_run); G_END_DECLS #endif /*__AGS_LOOP_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_route_dssi_audio.h0000644000175000017500000000423013607210263020260 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ROUTE_DSSI_AUDIO_H__ #define __AGS_ROUTE_DSSI_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ROUTE_DSSI_AUDIO (ags_route_dssi_audio_get_type()) #define AGS_ROUTE_DSSI_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ROUTE_DSSI_AUDIO, AgsRouteDssiAudio)) #define AGS_ROUTE_DSSI_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ROUTE_DSSI_AUDIO, AgsRouteDssiAudio)) #define AGS_IS_ROUTE_DSSI_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_ROUTE_DSSI_AUDIO)) #define AGS_IS_ROUTE_DSSI_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_ROUTE_DSSI_AUDIO)) #define AGS_ROUTE_DSSI_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_ROUTE_DSSI_AUDIO, AgsRouteDssiAudioClass)) typedef struct _AgsRouteDssiAudio AgsRouteDssiAudio; typedef struct _AgsRouteDssiAudioClass AgsRouteDssiAudioClass; struct _AgsRouteDssiAudio { AgsRecallAudio recall_audio; AgsPort *notation_input; AgsPort *sequencer_input; }; struct _AgsRouteDssiAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_route_dssi_audio_get_type(); AgsRouteDssiAudio* ags_route_dssi_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_ROUTE_DSSI_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_audio_signal.c0000644000175000017500000003100213607210263021425 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_rt_stream_audio_signal_class_init(AgsRtStreamAudioSignalClass *rt_stream_audio_signal); void ags_rt_stream_audio_signal_init(AgsRtStreamAudioSignal *rt_stream_audio_signal); void ags_rt_stream_audio_signal_dispose(GObject *gobject); void ags_rt_stream_audio_signal_finalize(GObject *gobject); void ags_rt_stream_audio_signal_run_pre(AgsRecall *recall); /** * SECTION:ags_rt_stream_audio_signal * @short_description: rt streams audio signal * @title: AgsRtStreamAudioSignal * @section_id: * @include: ags/audio/recall/ags_rt_stream_audio_signal.h * * The #AgsRtStreamAudioSignal class streams the audio signal template. */ static gpointer ags_rt_stream_audio_signal_parent_class = NULL; GType ags_rt_stream_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_rt_stream_audio_signal = 0; static const GTypeInfo ags_rt_stream_audio_signal_info = { sizeof (AgsRtStreamAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_rt_stream_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRtStreamAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_rt_stream_audio_signal_init, }; ags_type_rt_stream_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsRtStreamAudioSignal", &ags_rt_stream_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_rt_stream_audio_signal); } return g_define_type_id__volatile; } void ags_rt_stream_audio_signal_class_init(AgsRtStreamAudioSignalClass *rt_stream_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_rt_stream_audio_signal_parent_class = g_type_class_peek_parent(rt_stream_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) rt_stream_audio_signal; gobject->dispose = ags_rt_stream_audio_signal_dispose; gobject->finalize = ags_rt_stream_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) rt_stream_audio_signal; recall->run_pre = ags_rt_stream_audio_signal_run_pre; } void ags_rt_stream_audio_signal_init(AgsRtStreamAudioSignal *rt_stream_audio_signal) { AGS_RECALL(rt_stream_audio_signal)->name = "ags-rt_stream"; AGS_RECALL(rt_stream_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(rt_stream_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(rt_stream_audio_signal)->xml_type = "ags-rt_stream-audio-signal"; AGS_RECALL(rt_stream_audio_signal)->port = NULL; AGS_RECALL(rt_stream_audio_signal)->child_type = G_TYPE_NONE; rt_stream_audio_signal->dispose_source = NULL; } void ags_rt_stream_audio_signal_dispose(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_rt_stream_audio_signal_parent_class)->dispose(gobject); } void ags_rt_stream_audio_signal_finalize(GObject *gobject) { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) AGS_RT_STREAM_AUDIO_SIGNAL(gobject)->dispose_source; if(audio_signal != NULL){ AgsRecycling *recycling; recycling = (AgsRecycling *) audio_signal->recycling; if(recycling != NULL){ ags_recycling_remove_audio_signal(recycling, audio_signal); } g_object_run_dispose((GObject *) audio_signal); g_object_unref((GObject *) audio_signal); } /* call parent */ G_OBJECT_CLASS(ags_rt_stream_audio_signal_parent_class)->finalize(gobject); } void ags_rt_stream_audio_signal_run_pre(AgsRecall *recall) { AgsRecycling *recycling; AgsAudioSignal *source; AgsAudioSignal *rt_template; AgsRecallID *recall_id; AgsRecyclingContext *recycling_context, *parent_recycling_context; AgsRtStreamAudioSignal *rt_stream_audio_signal; GList *start_note, *note; void *buffer; gdouble delay; guint rt_template_length; guint rt_template_frame_count; guint loop_start, loop_end; guint buffer_size; guint rt_template_buffer_size; guint source_format, rt_template_format; guint copy_mode; void (*parent_class_run_pre)(AgsRecall *recall); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_rt_stream_audio_signal_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); /* get some fields */ rt_stream_audio_signal = AGS_RT_STREAM_AUDIO_SIGNAL(recall); g_object_get(rt_stream_audio_signal, "source", &source, "recall-id", &recall_id, NULL); buffer = source->stream->data; g_object_get(source, "buffer-size", &buffer_size, "format", &source_format, "delay", &delay, "recycling", &recycling, "rt-template", &rt_template, "note", &start_note, NULL); /* get template */ if(rt_template == NULL){ g_object_unref(source); g_object_unref(recall_id); g_list_free_full(start_note, g_object_unref); return; } g_object_get(rt_template, "buffer-size", &rt_template_buffer_size, "format", &rt_template_format, "length", &rt_template_length, "frame-count", &rt_template_frame_count, "loop-start", &loop_start, "loop-end", &loop_end, NULL); ags_audio_buffer_util_clear_buffer(buffer, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(source_format)); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(source_format), ags_audio_buffer_util_format_from_soundcard(rt_template_format)); /* check note */ g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); note = start_note; while(note != NULL){ AgsNote *current; GList *stream, *template_stream; guint note_x0, note_x1; guint rt_attack; guint64 rt_offset; current = note->data; g_object_get(current, "rt-offset", &rt_offset, "x0", ¬e_x0, "x1", ¬e_x1, NULL); rt_attack = 0; if(rt_offset < rt_template_length || rt_offset < delay * note_x1){ if(loop_start < loop_end){ guint frame_count; guint loop_length; guint loop_frame_count; guint n_frames; guint copy_n_frames; guint nth_loop; guint j_start; guint i, j, k; frame_count = delay * (note_x1 - note_x0) * buffer_size; loop_length = loop_end - loop_start; loop_frame_count = ((frame_count - loop_start) / loop_length) * rt_template_buffer_size; if(rt_offset * buffer_size > loop_end){ if(((guint) rt_offset * buffer_size) + buffer_size > frame_count - (rt_template_frame_count - loop_end)){ if(rt_offset * buffer_size > frame_count - (rt_template_frame_count - loop_end)){ j_start = (frame_count - (rt_offset * buffer_size)) % buffer_size; template_stream = g_list_nth(rt_template->stream, (frame_count - (rt_offset * buffer_size)) / buffer_size); if(template_stream == NULL){ note = note->next; continue; } }else{ j_start = ((guint) (rt_offset * buffer_size) - loop_end) % (loop_end - loop_start) % buffer_size; template_stream = g_list_nth(rt_template->stream, (loop_start + ((((guint) (rt_offset * buffer_size) - loop_end) % (loop_end - loop_start)) / buffer_size))); if(template_stream == NULL){ note = note->next; continue; } } }else{ j_start = ((guint) (rt_offset * buffer_size) - loop_end) % (loop_end - loop_start) % buffer_size; template_stream = g_list_nth(rt_template->stream, (loop_start + ((((guint) (rt_offset * buffer_size) - loop_end) % (loop_end - loop_start)) / buffer_size))); if(template_stream == NULL){ note = note->next; continue; } } }else{ j_start = ((guint) (rt_offset * buffer_size)) % buffer_size; template_stream = g_list_nth(rt_template->stream, rt_offset); if(template_stream == NULL){ note = note->next; continue; } } if(rt_offset == 0){ k = rt_attack; }else{ k = 0; } for(i = 0, j = j_start, nth_loop = rt_offset; i < buffer_size;){ /* compute count of frames to copy */ copy_n_frames = buffer_size; /* limit nth loop */ if(i > loop_start && i + copy_n_frames > loop_start + loop_length && i + copy_n_frames < loop_start + loop_frame_count && i + copy_n_frames >= loop_start + (nth_loop + 1) * loop_length){ copy_n_frames = (loop_start + (nth_loop + 1) * loop_length) - i; } /* check boundaries */ if((k % buffer_size) + copy_n_frames > buffer_size){ copy_n_frames = buffer_size - (k % buffer_size); } if(j + copy_n_frames > buffer_size){ copy_n_frames = buffer_size - j; } if(buffer == NULL || template_stream == NULL){ break; } /* copy */ ags_audio_buffer_util_copy_buffer_to_buffer(buffer, 1, k % buffer_size, template_stream->data, 1, j, copy_n_frames, copy_mode); /* increment and iterate */ if((i + copy_n_frames) % buffer_size == 0){ break; } if(j + copy_n_frames == rt_template_buffer_size){ template_stream = template_stream->next; } if(template_stream == NULL || (i > loop_start && i + copy_n_frames > loop_start + loop_length && i + copy_n_frames < loop_start + loop_frame_count && i + copy_n_frames >= loop_start + (nth_loop + 1) * loop_length)){ j = loop_start % rt_template_buffer_size; template_stream = g_list_nth(rt_template->stream, floor(loop_start / rt_template_buffer_size)); nth_loop++; }else{ j += copy_n_frames; } i += copy_n_frames; k += copy_n_frames; if(j == rt_template_buffer_size){ j = 0; } } }else{ template_stream = g_list_nth(rt_template->stream, rt_offset); if(template_stream == NULL){ note = note->next; continue; } if(rt_offset == 0){ ags_audio_buffer_util_copy_buffer_to_buffer(buffer, 1, rt_attack, template_stream->data, 1, 0, buffer_size - rt_attack, copy_mode); }else{ if(rt_attack != 0 && template_stream->prev != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(buffer, 1, 0, template_stream->prev->data, 1, buffer_size - rt_attack, rt_attack, copy_mode); } ags_audio_buffer_util_copy_buffer_to_buffer(buffer, 1, rt_attack, template_stream->data, 1, 0, buffer_size - rt_attack, copy_mode); } } }else{ GList *start_list; ags_audio_signal_remove_note(source, (GObject *) current); g_object_get(source, "note", &start_list, NULL); if(start_list == NULL && parent_recycling_context == NULL){ ags_recall_done(recall); } g_list_free(start_list); } g_object_set(current, "rt-offset", rt_offset + 1, NULL); note = note->next; } /* unref */ g_object_unref(source); g_object_unref(recall_id); g_list_free_full(start_note, g_object_unref); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); } /** * ags_rt_stream_audio_signal_new: * @source: the #AgsAudioSignal * * Create a new instance of #AgsRtStreamAudioSignal * * Returns: the new #AgsRtStreamAudioSignal * * Since: 3.0.0 */ AgsRtStreamAudioSignal* ags_rt_stream_audio_signal_new(AgsAudioSignal *source) { AgsRtStreamAudioSignal *rt_stream_audio_signal; rt_stream_audio_signal = (AgsRtStreamAudioSignal *) g_object_new(AGS_TYPE_RT_STREAM_AUDIO_SIGNAL, "source", source, NULL); return(rt_stream_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_delay_audio.h0000644000175000017500000000534513607210263017206 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DELAY_AUDIO_H__ #define __AGS_DELAY_AUDIO_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DELAY_AUDIO (ags_delay_audio_get_type()) #define AGS_DELAY_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DELAY_AUDIO, AgsDelayAudio)) #define AGS_DELAY_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DELAY_AUDIO, AgsDelayAudio)) #define AGS_IS_DELAY_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DELAY_AUDIO)) #define AGS_IS_DELAY_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DELAY_AUDIO)) #define AGS_DELAY_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_DELAY_AUDIO, AgsDelayAudioClass)) typedef struct _AgsDelayAudio AgsDelayAudio; typedef struct _AgsDelayAudioClass AgsDelayAudioClass; struct _AgsDelayAudio { AgsRecallAudio recall_audio; AgsPort *bpm; AgsPort *tact; AgsPort *sequencer_delay; AgsPort *notation_delay; AgsPort *wave_delay; AgsPort *midi_delay; AgsPort *sequencer_duration; AgsPort *notation_duration; AgsPort *wave_duration; AgsPort *midi_duration; }; struct _AgsDelayAudioClass { AgsRecallAudioClass recall_audio; void (*sequencer_duration_changed)(AgsDelayAudio *delay_audio); void (*notation_duration_changed)(AgsDelayAudio *delay_audio); void (*wave_duration_changed)(AgsDelayAudio *delay_audio); void (*midi_duration_changed)(AgsDelayAudio *delay_audio); }; GType ags_delay_audio_get_type(); void ags_delay_audio_sequencer_duration_changed(AgsDelayAudio *delay_audio); void ags_delay_audio_notation_duration_changed(AgsDelayAudio *delay_audio); void ags_delay_audio_wave_duration_changed(AgsDelayAudio *delay_audio); void ags_delay_audio_midi_duration_changed(AgsDelayAudio *delay_audio); AgsDelayAudio* ags_delay_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_DELAY_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_channel.c0000644000175000017500000001770113607210263021076 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_capture_wave_channel_class_init(AgsCaptureWaveChannelClass *capture_wave_channel); void ags_capture_wave_channel_init(AgsCaptureWaveChannel *capture_wave_channel); void ags_capture_wave_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_capture_wave_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_capture_wave_channel_dispose(GObject *gobject); void ags_capture_wave_channel_finalize(GObject *gobject); /** * SECTION:ags_capture_wave_channel * @short_description: capture channel wave * @title: AgsCaptureWaveChannel * @section_id: * @include: ags/audio/recall/ags_capture_wave_channel.h * * The #AgsCaptureWaveChannel class provides ports to the effect processor. */ static gpointer ags_capture_wave_channel_parent_class = NULL; static AgsPluginInterface *ags_capture_wave_parent_plugin_interface; static const gchar *ags_capture_wave_channel_plugin_name = "ags-capture-wave"; static const gchar *ags_capture_wave_channel_specifier[] = { "./x-offset[0]", }; static const gchar *ags_capture_wave_channel_control_port[] = { "1/1", }; enum{ PROP_0, PROP_X_OFFSET, }; GType ags_capture_wave_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_capture_wave_channel = 0; static const GTypeInfo ags_capture_wave_channel_info = { sizeof (AgsCaptureWaveChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_capture_wave_channel_class_init, NULL, /* class_finalize */ NULL, /* class_channel */ sizeof (AgsCaptureWaveChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_capture_wave_channel_init, }; ags_type_capture_wave_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsCaptureWaveChannel", &ags_capture_wave_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_capture_wave_channel); } return g_define_type_id__volatile; } void ags_capture_wave_channel_class_init(AgsCaptureWaveChannelClass *capture_wave_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_capture_wave_channel_parent_class = g_type_class_peek_parent(capture_wave_channel); /* GObjectClass */ gobject = (GObjectClass *) capture_wave_channel; gobject->set_property = ags_capture_wave_channel_set_property; gobject->get_property = ags_capture_wave_channel_get_property; gobject->dispose = ags_capture_wave_channel_dispose; gobject->finalize = ags_capture_wave_channel_finalize; /* properties */ /** * AgsCaptureWaveChannel:x-offset: * * The x-offset port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("x-offset", i18n_pspec("x offset"), i18n_pspec("The x offset control"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_OFFSET, param_spec); } void ags_capture_wave_channel_init(AgsCaptureWaveChannel *capture_wave_channel) { GList *port; AGS_RECALL(capture_wave_channel)->name = "ags-capture-wave"; AGS_RECALL(capture_wave_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(capture_wave_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(capture_wave_channel)->xml_type = "ags-capture-wave-channel"; /* port */ port = NULL; /* x offset */ capture_wave_channel->x_offset = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_capture_wave_channel_plugin_name, "specifier", ags_capture_wave_channel_specifier[0], "control-port", ags_capture_wave_channel_control_port[9], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, NULL); g_object_ref(capture_wave_channel->x_offset); capture_wave_channel->x_offset->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, capture_wave_channel->x_offset); g_object_ref(capture_wave_channel->x_offset); /* set port */ AGS_RECALL(capture_wave_channel)->port = port; } void ags_capture_wave_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCaptureWaveChannel *capture_wave_channel; GRecMutex *recall_mutex; capture_wave_channel = AGS_CAPTURE_WAVE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(capture_wave_channel); switch(prop_id){ case PROP_X_OFFSET: { AgsPort *x_offset; x_offset = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(capture_wave_channel->x_offset == x_offset){ g_rec_mutex_unlock(recall_mutex); return; } if(capture_wave_channel->x_offset != NULL){ g_object_unref(G_OBJECT(capture_wave_channel->x_offset)); } if(x_offset != NULL){ g_object_ref(G_OBJECT(x_offset)); } capture_wave_channel->x_offset = x_offset; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_capture_wave_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCaptureWaveChannel *capture_wave_channel; GRecMutex *recall_mutex; capture_wave_channel = AGS_CAPTURE_WAVE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(capture_wave_channel); switch(prop_id){ case PROP_X_OFFSET: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, capture_wave_channel->x_offset); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_capture_wave_channel_dispose(GObject *gobject) { AgsCaptureWaveChannel *capture_wave_channel; capture_wave_channel = AGS_CAPTURE_WAVE_CHANNEL(gobject); /* x-offset */ if(capture_wave_channel->x_offset != NULL){ g_object_unref(capture_wave_channel->x_offset); capture_wave_channel->x_offset = NULL; } /* call parent */ G_OBJECT_CLASS(ags_capture_wave_channel_parent_class)->dispose(gobject); } void ags_capture_wave_channel_finalize(GObject *gobject) { AgsCaptureWaveChannel *capture_wave_channel; capture_wave_channel = AGS_CAPTURE_WAVE_CHANNEL(gobject); /* x-offset */ if(capture_wave_channel->x_offset != NULL){ g_object_unref(capture_wave_channel->x_offset); } /* call parent */ G_OBJECT_CLASS(ags_capture_wave_channel_parent_class)->finalize(gobject); } /** * ags_capture_wave_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsCaptureWaveChannel * * Returns: the new #AgsCaptureWaveChannel * * Since: 3.0.0 */ AgsCaptureWaveChannel* ags_capture_wave_channel_new(AgsChannel *source) { AgsCaptureWaveChannel *capture_wave_channel; capture_wave_channel = (AgsCaptureWaveChannel *) g_object_new(AGS_TYPE_CAPTURE_WAVE_CHANNEL, "source", source, NULL); return(capture_wave_channel); } gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_channel_run.h0000644000175000017500000000454713607210263022015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_PATTERN_CHANNEL_RUN_H__ #define __AGS_COPY_PATTERN_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_PATTERN_CHANNEL_RUN (ags_copy_pattern_channel_run_get_type()) #define AGS_COPY_PATTERN_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, AgsCopyPatternChannelRun)) #define AGS_COPY_PATTERN_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, AgsCopyPatternChannelRunClass)) #define AGS_IS_COPY_PATTERN_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_PATTERN_CHANNEL_RUN)) #define AGS_IS_COPY_PATTERN_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_PATTERN_CHANNEL_RUN)) #define AGS_COPY_PATTERN_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, AgsCopyPatternChannelRunClass)) typedef struct _AgsCopyPatternChannelRun AgsCopyPatternChannelRun; typedef struct _AgsCopyPatternChannelRunClass AgsCopyPatternChannelRunClass; struct _AgsCopyPatternChannelRun { AgsRecallChannelRun recall_channel_run; GList *note; }; struct _AgsCopyPatternChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_copy_pattern_channel_run_get_type(); AgsCopyPatternChannelRun* ags_copy_pattern_channel_run_new(AgsChannel *destination, AgsChannel *source); G_END_DECLS #endif /*__AGS_COPY_PATTERN_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_channel.c0000644000175000017500000002733513607210263017362 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_play_channel_class_init(AgsPlayChannelClass *play_channel); void ags_play_channel_mutable_interface_init(AgsMutableInterface *mutable); void ags_play_channel_init(AgsPlayChannel *play_channel); void ags_play_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_channel_dispose(GObject *gobject); void ags_play_channel_finalize(GObject *gobject); void ags_play_channel_set_muted(AgsMutable *mutable, gboolean muted); static AgsPluginPort* ags_play_channel_get_muted_plugin_port(); enum{ PROP_0, PROP_AUDIO_CHANNEL, PROP_MUTED, }; /** * SECTION:ags_play_channel * @short_description: plays channel * @title: AgsPlayChannel * @section_id: * @include: ags/audio/recall/ags_play_channel.h * * The #AgsPlayChannel class provides ports to the effect processor. */ static gpointer ags_play_channel_parent_class = NULL; static const gchar *ags_play_channel_plugin_name = "ags-play"; static const gchar *ags_play_channel_specifier[] = { "./audio-channel[0]", "./muted[0]", }; static const gchar *ags_play_channel_control_port[] = { "1/2", "2/2", }; GType ags_play_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_channel = 0; static const GTypeInfo ags_play_channel_info = { sizeof (AgsPlayChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_channel_init, }; static const GInterfaceInfo ags_mutable_interface_info = { (GInterfaceInitFunc) ags_play_channel_mutable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_play_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsPlayChannel", &ags_play_channel_info, 0); g_type_add_interface_static(ags_type_play_channel, AGS_TYPE_MUTABLE, &ags_mutable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_channel); } return g_define_type_id__volatile; } void ags_play_channel_class_init(AgsPlayChannelClass *play_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_play_channel_parent_class = g_type_class_peek_parent(play_channel); /* GObjectClass */ gobject = (GObjectClass *) play_channel; gobject->set_property = ags_play_channel_set_property; gobject->get_property = ags_play_channel_get_property; gobject->dispose = ags_play_channel_dispose; gobject->finalize = ags_play_channel_finalize; /* properties */ /** * AgsPlayChannel:audio-channel: * * The audio channel port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-channel", i18n_pspec("assigned audio channel"), i18n_pspec("The audio channel this recall does output to"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsPlayChannel:muted: * * The muted port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("muted", i18n_pspec("mute channel"), i18n_pspec("Mute the channel"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); } void ags_play_channel_mutable_interface_init(AgsMutableInterface *mutable) { mutable->set_muted = ags_play_channel_set_muted; } void ags_play_channel_init(AgsPlayChannel *play_channel) { GList *port; AGS_RECALL(play_channel)->name = "ags-play"; AGS_RECALL(play_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_channel)->xml_type = "ags-play-channel"; port = NULL; /* audio channel */ play_channel->audio_channel = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_channel_plugin_name, "specifier", ags_play_channel_specifier[0], "control-port", ags_play_channel_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, "port-value-size", sizeof(guint64), "port-value-length", 1, NULL); g_object_ref(play_channel->audio_channel); play_channel->audio_channel->port_value.ags_port_uint = 0; /* add to port */ port = g_list_prepend(port, play_channel->audio_channel); g_object_ref(play_channel->audio_channel); /* muted */ play_channel->muted = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_channel_plugin_name, "specifier", ags_play_channel_specifier[1], "control-port", ags_play_channel_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, "port-value-size", sizeof(gfloat), "port-value-length", 1, NULL); g_object_ref(play_channel->muted); play_channel->muted->port_value.ags_port_float = (float) 0.0; /* plugin port */ g_object_set(play_channel->muted, "plugin-port", ags_play_channel_get_muted_plugin_port(), NULL); /* add to port */ port = g_list_prepend(port, play_channel->muted); g_object_ref(play_channel->muted); /* set port */ AGS_RECALL(play_channel)->port = port; } void ags_play_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayChannel *play_channel; GRecMutex *recall_mutex; play_channel = AGS_PLAY_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel); switch(prop_id){ case PROP_AUDIO_CHANNEL: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == play_channel->audio_channel){ g_rec_mutex_unlock(recall_mutex); return; } if(play_channel->audio_channel != NULL){ g_object_unref(G_OBJECT(play_channel->audio_channel)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } play_channel->audio_channel = port; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MUTED: { AgsPort *port; port = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(port == play_channel->muted){ g_rec_mutex_unlock(recall_mutex); return; } if(play_channel->muted != NULL){ g_object_unref(G_OBJECT(play_channel->muted)); } if(port != NULL){ g_object_ref(G_OBJECT(port)); } play_channel->muted = port; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayChannel *play_channel; GRecMutex *recall_mutex; play_channel = AGS_PLAY_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_channel); switch(prop_id){ case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_channel->audio_channel); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MUTED: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_channel->muted); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_channel_dispose(GObject *gobject) { AgsPlayChannel *play_channel; play_channel = AGS_PLAY_CHANNEL(gobject); /* audio channel */ if(play_channel->audio_channel != NULL){ g_object_unref(G_OBJECT(play_channel->audio_channel)); play_channel->audio_channel = NULL; } /* muted */ if(play_channel->muted != NULL){ g_object_unref(G_OBJECT(play_channel->muted)); play_channel->muted = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_channel_parent_class)->dispose(gobject); } void ags_play_channel_finalize(GObject *gobject) { AgsPlayChannel *play_channel; play_channel = AGS_PLAY_CHANNEL(gobject); /* audio channel */ if(play_channel->audio_channel != NULL){ g_object_unref(G_OBJECT(play_channel->audio_channel)); } /* muted */ if(play_channel->muted != NULL){ g_object_unref(G_OBJECT(play_channel->muted)); } /* call parent */ G_OBJECT_CLASS(ags_play_channel_parent_class)->finalize(gobject); } void ags_play_channel_set_ports(AgsPlugin *plugin, GList *port) { while(port != NULL){ if(!strncmp(AGS_PORT(port->data)->specifier, "./audio-channel[0]", 17)){ g_object_set(G_OBJECT(plugin), "audio-channel", AGS_PORT(port->data), NULL); }else if(!strncmp(AGS_PORT(port->data)->specifier, "./muted[0]", 9)){ g_object_set(G_OBJECT(plugin), "muted", AGS_PORT(port->data), NULL); } port = port->next; } } void ags_play_channel_set_muted(AgsMutable *mutable, gboolean muted) { AgsPort *port; GValue value = {0,}; g_object_get(G_OBJECT(mutable), "muted", &port, NULL); g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, (muted ? 1.0: 0.0)); ags_port_safe_write(port, &value); g_value_unset(&value); g_object_unref(port); } static AgsPluginPort* ags_play_channel_get_muted_plugin_port() { static AgsPluginPort *plugin_port = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(plugin_port == NULL){ plugin_port = ags_plugin_port_new(); g_object_ref(plugin_port); plugin_port->flags |= (AGS_PLUGIN_PORT_INPUT | AGS_PLUGIN_PORT_CONTROL | AGS_PLUGIN_PORT_TOGGLED); plugin_port->port_index = 0; /* range */ g_value_init(plugin_port->default_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(plugin_port->default_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->upper_value, 1.0); } g_mutex_unlock(&mutex); return(plugin_port); } /** * ags_play_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsPlayChannel * * Returns: the new #AgsPlayChannel * * Since: 3.0.0 */ AgsPlayChannel* ags_play_channel_new(AgsChannel *source) { AgsPlayChannel *play_channel; play_channel = (AgsPlayChannel *) g_object_new(AGS_TYPE_PLAY_CHANNEL, "source", source, NULL); return(play_channel); } gsequencer-3.1.3/ags/audio/recall/ags_play_wave_channel.c0000644000175000017500000002570613607210263020404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_play_wave_channel_class_init(AgsPlayWaveChannelClass *play_wave_channel); void ags_play_wave_channel_init(AgsPlayWaveChannel *play_wave_channel); void ags_play_wave_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_wave_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_wave_channel_dispose(GObject *gobject); void ags_play_wave_channel_finalize(GObject *gobject); /** * SECTION:ags_play_wave_channel * @short_description: play channel wave * @title: AgsPlayWaveChannel * @section_id: * @include: ags/audio/recall/ags_play_wave_channel.h * * The #AgsPlayWaveChannel class provides ports to the effect processor. */ static gpointer ags_play_wave_channel_parent_class = NULL; static const gchar *ags_play_wave_channel_plugin_name = "ags-play-wave"; static const gchar *ags_play_wave_channel_specifier[] = { "./do-playback[0]", "./x-offset[0]", }; static const gchar *ags_play_wave_channel_control_port[] = { "1/2", "2/2", }; enum{ PROP_0, PROP_WAVE, PROP_DO_PLAYBACK, PROP_X_OFFSET, }; GType ags_play_wave_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_wave_channel = 0; static const GTypeInfo ags_play_wave_channel_info = { sizeof (AgsPlayWaveChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_wave_channel_class_init, NULL, /* class_finalize */ NULL, /* class_channel */ sizeof (AgsPlayWaveChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_wave_channel_init, }; ags_type_play_wave_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsPlayWaveChannel", &ags_play_wave_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_wave_channel); } return g_define_type_id__volatile; } void ags_play_wave_channel_class_init(AgsPlayWaveChannelClass *play_wave_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_play_wave_channel_parent_class = g_type_class_peek_parent(play_wave_channel); /* GObjectClass */ gobject = (GObjectClass *) play_wave_channel; gobject->set_property = ags_play_wave_channel_set_property; gobject->get_property = ags_play_wave_channel_get_property; gobject->dispose = ags_play_wave_channel_dispose; gobject->finalize = ags_play_wave_channel_finalize; /* properties */ /** * AgsPlayWaveChannel:wave: * * The wave containing the notes. * * Since: 3.0.0 */ param_spec = g_param_spec_object("wave", i18n_pspec("assigned AgsWave"), i18n_pspec("The AgsWave containing notes"), AGS_TYPE_WAVE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE, param_spec); /** * AgsPlayWaveChannel:do-playback: * * The do-playback port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("do-playback", i18n_pspec("do playback"), i18n_pspec("The do playback control"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DO_PLAYBACK, param_spec); /** * AgsPlayWaveChannel:x-offset: * * The x-offset port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("x-offset", i18n_pspec("x offset"), i18n_pspec("The x offset control"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_OFFSET, param_spec); } void ags_play_wave_channel_init(AgsPlayWaveChannel *play_wave_channel) { GList *port; AGS_RECALL(play_wave_channel)->name = "ags-play-wave"; AGS_RECALL(play_wave_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_wave_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_wave_channel)->xml_type = "ags-play-wave-channel"; /* fields */ play_wave_channel->wave = NULL; /* port */ port = NULL; /* do playback */ play_wave_channel->do_playback = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_wave_channel_plugin_name, "specifier", ags_play_wave_channel_specifier[0], "control-port", ags_play_wave_channel_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_BOOLEAN, NULL); g_object_ref(play_wave_channel->do_playback); play_wave_channel->do_playback->port_value.ags_port_boolean = TRUE; /* add to port */ port = g_list_prepend(port, play_wave_channel->do_playback); g_object_ref(play_wave_channel->do_playback); /* x offset */ play_wave_channel->x_offset = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_play_wave_channel_plugin_name, "specifier", ags_play_wave_channel_specifier[1], "control-port", ags_play_wave_channel_control_port[1], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_UINT64, NULL); g_object_ref(play_wave_channel->x_offset); play_wave_channel->x_offset->port_value.ags_port_boolean = FALSE; /* add to port */ port = g_list_prepend(port, play_wave_channel->x_offset); g_object_ref(play_wave_channel->x_offset); /* set port */ AGS_RECALL(play_wave_channel)->port = port; } void ags_play_wave_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayWaveChannel *play_wave_channel; GRecMutex *recall_mutex; play_wave_channel = AGS_PLAY_WAVE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_wave_channel); switch(prop_id){ case PROP_WAVE: { AgsWave *wave; wave = (AgsWave *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_wave_channel->wave == wave){ g_rec_mutex_unlock(recall_mutex); return; } if(play_wave_channel->wave != NULL){ g_object_unref(play_wave_channel->wave); } if(wave != NULL){ g_object_ref(wave); } play_wave_channel->wave = wave; g_rec_mutex_unlock(recall_mutex); } break; case PROP_DO_PLAYBACK: { AgsPort *do_playback; do_playback = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_wave_channel->do_playback == do_playback){ g_rec_mutex_unlock(recall_mutex); return; } if(play_wave_channel->do_playback != NULL){ g_object_unref(G_OBJECT(play_wave_channel->do_playback)); } if(do_playback != NULL){ g_object_ref(G_OBJECT(do_playback)); } play_wave_channel->do_playback = do_playback; g_rec_mutex_unlock(recall_mutex); } break; case PROP_X_OFFSET: { AgsPort *x_offset; x_offset = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_wave_channel->x_offset == x_offset){ g_rec_mutex_unlock(recall_mutex); return; } if(play_wave_channel->x_offset != NULL){ g_object_unref(G_OBJECT(play_wave_channel->x_offset)); } if(x_offset != NULL){ g_object_ref(G_OBJECT(x_offset)); } play_wave_channel->x_offset = x_offset; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_wave_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayWaveChannel *play_wave_channel; GRecMutex *recall_mutex; play_wave_channel = AGS_PLAY_WAVE_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_wave_channel); switch(prop_id){ case PROP_WAVE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_wave_channel->wave); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DO_PLAYBACK: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_wave_channel->do_playback); g_rec_mutex_unlock(recall_mutex); } break; case PROP_X_OFFSET: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_wave_channel->x_offset); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_wave_channel_dispose(GObject *gobject) { AgsPlayWaveChannel *play_wave_channel; play_wave_channel = AGS_PLAY_WAVE_CHANNEL(gobject); /* wave */ if(play_wave_channel->wave != NULL){ g_object_unref(G_OBJECT(play_wave_channel->wave)); play_wave_channel->wave = NULL; } /* do playback */ if(play_wave_channel->do_playback != NULL){ g_object_unref(play_wave_channel->do_playback); play_wave_channel->do_playback = NULL; } /* x-offset */ if(play_wave_channel->x_offset != NULL){ g_object_unref(play_wave_channel->x_offset); play_wave_channel->x_offset = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_wave_channel_parent_class)->dispose(gobject); } void ags_play_wave_channel_finalize(GObject *gobject) { AgsPlayWaveChannel *play_wave_channel; play_wave_channel = AGS_PLAY_WAVE_CHANNEL(gobject); /* wave */ if(play_wave_channel->wave != NULL){ g_object_unref(G_OBJECT(play_wave_channel->wave)); } /* do playback */ if(play_wave_channel->do_playback != NULL){ g_object_unref(play_wave_channel->do_playback); } /* x-offset */ if(play_wave_channel->x_offset != NULL){ g_object_unref(play_wave_channel->x_offset); } /* call parent */ G_OBJECT_CLASS(ags_play_wave_channel_parent_class)->finalize(gobject); } /** * ags_play_wave_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsPlayWaveChannel * * Returns: the new #AgsPlayWaveChannel * * Since: 3.0.0 */ AgsPlayWaveChannel* ags_play_wave_channel_new(AgsChannel *source) { AgsPlayWaveChannel *play_wave_channel; play_wave_channel = (AgsPlayWaveChannel *) g_object_new(AGS_TYPE_PLAY_WAVE_CHANNEL, "source", source, NULL); return(play_wave_channel); } gsequencer-3.1.3/ags/audio/recall/ags_lfo_channel_run.h0000644000175000017500000000410713607210263020056 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LFO_CHANNEL_RUN_H__ #define __AGS_LFO_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LFO_CHANNEL_RUN (ags_lfo_channel_run_get_type()) #define AGS_LFO_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_LFO_CHANNEL_RUN, AgsLfoChannelRun)) #define AGS_LFO_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_INSTANCE_CAST(class, AGS_TYPE_LFO_CHANNEL_RUN, AgsLfoChannelRunClass)) #define AGS_IS_LFO_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LFO_CHANNEL_RUN)) #define AGS_IS_LFO_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LFO_CHANNEL_RUN)) #define AGS_LFO_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LFO_CHANNEL_RUN, AgsLfoChannelRunClass)) typedef struct _AgsLfoChannelRun AgsLfoChannelRun; typedef struct _AgsLfoChannelRunClass AgsLfoChannelRunClass; struct _AgsLfoChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsLfoChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_lfo_channel_run_get_type(); AgsLfoChannelRun* ags_lfo_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_LFO_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_dssi_audio.c0000644000175000017500000005217613607210263020076 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . * * Yuri Victorovich (tiny change) - provided FreeBSD and * DragonFly macros. */ #include #include #include #include #include #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) #include #else #ifndef AGS_W32API #include #endif #endif #ifndef AGS_W32API #include #endif #include #include #include #include #include #include #include void ags_play_dssi_audio_class_init(AgsPlayDssiAudioClass *play_dssi_audio); void ags_play_dssi_audio_init(AgsPlayDssiAudio *play_dssi_audio); void ags_play_dssi_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_play_dssi_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_play_dssi_audio_dispose(GObject *gobject); void ags_play_dssi_audio_finalize(GObject *gobject); /** * SECTION:ags_play_dssi_audio * @short_description: play audio dssi * @title: AgsPlayDssiAudio * @section_id: * @include: ags/audio/recall/ags_play_dssi_audio.h * * The #AgsPlayDssiAudio class provides ports to the effect processor. */ enum{ PROP_0, PROP_BANK, PROP_PROGRAM, PROP_PLUGIN, PROP_INPUT_LINES, PROP_OUTPUT_LINES, }; static gpointer ags_play_dssi_audio_parent_class = NULL; static const gchar *ags_play_dssi_audio_plugin_name = "ags-play-dssi"; static const gchar *ags_play_dssi_audio_specifier[] = { }; static const gchar *ags_play_dssi_audio_control_port[] = { }; GType ags_play_dssi_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_dssi_audio; static const GTypeInfo ags_play_dssi_audio_info = { sizeof (AgsPlayDssiAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_dssi_audio_class_init, NULL, /* class_finalize */ NULL, /* class_audio */ sizeof (AgsPlayDssiAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_dssi_audio_init, }; ags_type_play_dssi_audio = g_type_register_static(AGS_TYPE_RECALL_AUDIO, "AgsPlayDssiAudio", &ags_play_dssi_audio_info, 0); g_once_init_leave (&g_define_type_id__volatile, ags_type_play_dssi_audio); } return g_define_type_id__volatile; } void ags_play_dssi_audio_class_init(AgsPlayDssiAudioClass *play_dssi_audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_play_dssi_audio_parent_class = g_type_class_peek_parent(play_dssi_audio); /* GObjectClass */ gobject = (GObjectClass *) play_dssi_audio; gobject->set_property = ags_play_dssi_audio_set_property; gobject->get_property = ags_play_dssi_audio_get_property; gobject->dispose = ags_play_dssi_audio_dispose; gobject->finalize = ags_play_dssi_audio_finalize; /* properties */ /** * AgsPlayDssi:bank: * * The selected bank. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("bank", i18n_pspec("bank"), i18n_pspec("The selected bank"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BANK, param_spec); /** * AgsPlayDssi:program: * * The selected program. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("program", i18n_pspec("program"), i18n_pspec("The selected program"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PROGRAM, param_spec); /** * AgsPlayDssiAudio:plugin: * * The plugin's plugin object. * * Since: 3.0.0 */ param_spec = g_param_spec_object("plugin", i18n_pspec("the plugin"), i18n_pspec("The plugin as plugin object"), AGS_TYPE_DSSI_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN, param_spec); /** * AgsPlayDssiAudio:input-lines: * * The effect's input lines count. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("input-lines", i18n_pspec("input lines of effect"), i18n_pspec("The effect's count of input lines"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_LINES, param_spec); /** * AgsPlayDssiAudio:output-lines: * * The effect's output lines count. * * Since: 3.0.0 */ param_spec = g_param_spec_ulong("output-lines", i18n_pspec("output lines of effect"), i18n_pspec("The effect's count of output lines"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_LINES, param_spec); } void ags_play_dssi_audio_init(AgsPlayDssiAudio *play_dssi_audio) { GList *port; AGS_RECALL(play_dssi_audio)->name = "ags-play-dssi"; AGS_RECALL(play_dssi_audio)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_dssi_audio)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_dssi_audio)->xml_type = "ags-play-dssi-audio"; play_dssi_audio->bank = 0; play_dssi_audio->program = 0; play_dssi_audio->plugin = NULL; play_dssi_audio->plugin_descriptor = NULL; play_dssi_audio->input_port = NULL; play_dssi_audio->input_lines = 0; play_dssi_audio->output_port = NULL; play_dssi_audio->output_lines = 0; } void ags_play_dssi_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayDssiAudio *play_dssi_audio; GRecMutex *recall_mutex; play_dssi_audio = AGS_PLAY_DSSI_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); switch(prop_id){ case PROP_BANK: { g_rec_mutex_lock(recall_mutex); play_dssi_audio->bank = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(recall_mutex); play_dssi_audio->program = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PLUGIN: { AgsDssiPlugin *dssi_plugin; dssi_plugin = g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(play_dssi_audio->plugin == dssi_plugin){ g_rec_mutex_unlock(recall_mutex); return; } if(play_dssi_audio->plugin != NULL){ g_object_unref(play_dssi_audio->plugin); } if(dssi_plugin != NULL){ g_object_ref(dssi_plugin); } play_dssi_audio->plugin = dssi_plugin; g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_LINES: { unsigned long effect_input_lines; effect_input_lines = g_value_get_ulong(value); g_rec_mutex_lock(recall_mutex); if(effect_input_lines == play_dssi_audio->input_lines){ g_rec_mutex_unlock(recall_mutex); return; } play_dssi_audio->input_lines = effect_input_lines; g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_LINES: { unsigned long effect_output_lines; effect_output_lines = g_value_get_ulong(value); g_rec_mutex_lock(recall_mutex); if(effect_output_lines == play_dssi_audio->output_lines){ g_rec_mutex_unlock(recall_mutex); return; } play_dssi_audio->output_lines = effect_output_lines; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_play_dssi_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayDssiAudio *play_dssi_audio; GRecMutex *recall_mutex; play_dssi_audio = AGS_PLAY_DSSI_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); switch(prop_id){ case PROP_BANK: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, play_dssi_audio->bank); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, play_dssi_audio->program); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PLUGIN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, play_dssi_audio->plugin); g_rec_mutex_unlock(recall_mutex); } break; case PROP_INPUT_LINES: { g_rec_mutex_lock(recall_mutex); g_value_set_ulong(value, play_dssi_audio->input_lines); g_rec_mutex_unlock(recall_mutex); } break; case PROP_OUTPUT_LINES: { g_rec_mutex_lock(recall_mutex); g_value_set_ulong(value, play_dssi_audio->output_lines); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_play_dssi_audio_dispose(GObject *gobject) { AgsPlayDssiAudio *play_dssi_audio; play_dssi_audio = (AgsPlayDssiAudio *) gobject; if(play_dssi_audio->plugin != NULL){ g_object_unref(play_dssi_audio->plugin); play_dssi_audio->plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_play_dssi_audio_parent_class)->dispose(gobject); } void ags_play_dssi_audio_finalize(GObject *gobject) { AgsPlayDssiAudio *play_dssi_audio; play_dssi_audio = (AgsPlayDssiAudio *) gobject; if(play_dssi_audio->plugin != NULL){ g_object_unref(play_dssi_audio->plugin); } /* call parent */ G_OBJECT_CLASS(ags_play_dssi_audio_parent_class)->finalize(gobject); } /** * ags_play_dssi_audio_load: * @play_dssi_audio: the #AgsPlayDssiAudio * * Set up DSSI handle. * * Since: 3.0.0 */ void ags_play_dssi_audio_load(AgsPlayDssiAudio *play_dssi_audio) { AgsDssiPlugin *dssi_plugin; gchar *filename, *effect; guint effect_index; void *plugin_so; DSSI_Descriptor_Function dssi_descriptor; DSSI_Descriptor *plugin_descriptor; GRecMutex *recall_mutex; if(!AGS_IS_PLAY_DSSI_AUDIO(play_dssi_audio)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); /* get filename and effect */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(play_dssi_audio)->filename); effect = g_strdup(AGS_RECALL(play_dssi_audio)->effect); g_rec_mutex_unlock(recall_mutex); /* find AgsDssiPlugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); /* get some fields */ g_object_get(play_dssi_audio, "effect-index", &effect_index, NULL); play_dssi_audio->plugin = dssi_plugin; g_object_get(dssi_plugin, "plugin-so", &plugin_so, NULL); /* dssi descriptor function - dlsym */ if(plugin_so){ gboolean success; success = FALSE; #ifdef AGS_W32API dssi_descriptor = (DSSI_Descriptor_Function) GetProcAddress(plugin_so, "dssi_descriptor"); success = (!dssi_descriptor) ? FALSE: TRUE; #else dssi_descriptor = (DSSI_Descriptor_Function) dlsym(plugin_so, "dssi_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && dssi_descriptor){ g_rec_mutex_lock(recall_mutex); play_dssi_audio->plugin_descriptor = plugin_descriptor = dssi_descriptor((unsigned long) effect_index); g_rec_mutex_unlock(recall_mutex); } } /* free */ g_free(filename); g_free(effect); } /** * ags_play_dssi_audio_load_ports: * @play_dssi_audio: the #AgsPlayDssiAudio * * Set up DSSI ports. * * Returns: (element-type AgsAudio.Port) (transfer full): the #GList-struct containing #AgsPort. * * Since: 3.0.0 */ GList* ags_play_dssi_audio_load_ports(AgsPlayDssiAudio *play_dssi_audio) { AgsPort *current; AgsDssiPlugin *dssi_plugin; GList *start_port; GList *start_plugin_port, *plugin_port; gchar *filename, *effect; gchar *plugin_name; unsigned long port_count; unsigned long i; GRecMutex *recall_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_PLAY_DSSI_AUDIO(play_dssi_audio)){ return(NULL); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(play_dssi_audio); /* get filename and effect */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(play_dssi_audio)->filename); effect = g_strdup(AGS_RECALL(play_dssi_audio)->effect); g_rec_mutex_unlock(recall_mutex); /* find AgsDssiPlugin */ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); play_dssi_audio->plugin = dssi_plugin; /* get plugin port */ g_object_get(dssi_plugin, "plugin-port", &start_plugin_port, NULL); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* get plugin name */ g_rec_mutex_lock(base_plugin_mutex); plugin_name = g_strdup_printf("dssi-%u", dssi_plugin->unique_id); g_rec_mutex_unlock(base_plugin_mutex); plugin_port = start_plugin_port; start_port = NULL; if(plugin_port != NULL){ port_count = g_list_length(start_plugin_port); for(i = 0; i < port_count; i++){ if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_CONTROL)){ gchar *specifier; GValue *value; GRecMutex *plugin_port_mutex; /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port->data); /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(AGS_PLUGIN_PORT(plugin_port->data)->port_name); g_rec_mutex_unlock(plugin_port_mutex); if(specifier == NULL){ plugin_port = plugin_port->next; continue; } /* new port */ current = g_object_new(AGS_TYPE_PORT, "plugin-name", plugin_name, "specifier", specifier, "control-port", g_strdup_printf("%lu/%lu", i + 1, port_count), "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, NULL); current->flags |= AGS_PORT_USE_LADSPA_FLOAT; g_object_ref(current); if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ ags_recall_set_flags((AgsRecall *) play_dssi_audio, AGS_RECALL_HAS_OUTPUT_PORT); current->flags |= AGS_PORT_IS_OUTPUT; }else{ if(!ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_INTEGER) && !ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_TOGGLED)){ current->flags |= AGS_PORT_INFINITE_RANGE; } } g_object_set(current, "plugin-port", plugin_port->data, NULL); ags_play_dssi_audio_load_conversion(play_dssi_audio, (GObject *) current, (GObject *) plugin_port->data); g_object_get(plugin_port->data, "default-value", &value, NULL); current->port_value.ags_port_ladspa = g_value_get_float(value); // g_message("connecting port: %d/%d %f", i, port_count, current->port_value.ags_port_float); start_port = g_list_prepend(start_port, current); }else if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_AUDIO)){ /* audio port */ if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_INPUT)){ g_rec_mutex_lock(recall_mutex); if(play_dssi_audio->input_port == NULL){ play_dssi_audio->input_port = (guint *) malloc(sizeof(guint)); play_dssi_audio->input_port[0] = i; }else{ play_dssi_audio->input_port = (guint *) realloc(play_dssi_audio->input_port, (play_dssi_audio->input_lines + 1) * sizeof(guint)); play_dssi_audio->input_port[play_dssi_audio->input_lines] = i; } play_dssi_audio->input_lines += 1; g_rec_mutex_unlock(recall_mutex); }else if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port->data, AGS_PLUGIN_PORT_OUTPUT)){ g_rec_mutex_lock(recall_mutex); if(play_dssi_audio->output_port == NULL){ play_dssi_audio->output_port = (guint *) malloc(sizeof(guint)); play_dssi_audio->output_port[0] = i; }else{ play_dssi_audio->output_port = (guint *) realloc(play_dssi_audio->output_port, (play_dssi_audio->output_lines + 1) * sizeof(guint)); play_dssi_audio->output_port[play_dssi_audio->output_lines] = i; } play_dssi_audio->output_lines += 1; g_rec_mutex_unlock(recall_mutex); } } /* iterate */ plugin_port = plugin_port->next; } start_port = g_list_reverse(start_port); AGS_RECALL(play_dssi_audio)->port = g_list_copy(start_port); } /* unref/free */ g_list_free_full(start_plugin_port, g_object_unref); g_free(filename); g_free(effect); g_free(plugin_name); #ifdef AGS_DEBUG g_message("output lines: %d", play_dssi_audio->output_lines); #endif return(start_port); } /** * ags_play_dssi_audio_load_conversion: * @play_dssi_audio: the #AgsPlayDssiAudio * @port: the #AgsPort * @plugin_port: the #AgsPluginPort * * Loads conversion object by using @plugin_port and sets in on @port. * * Since: 3.0.0 */ void ags_play_dssi_audio_load_conversion(AgsPlayDssiAudio *play_dssi_audio, GObject *port, GObject *plugin_port) { AgsLadspaConversion *ladspa_conversion; if(!AGS_IS_PLAY_DSSI_AUDIO(play_dssi_audio) || !AGS_IS_PORT(port) || !AGS_PLUGIN_PORT(plugin_port)){ return; } ladspa_conversion = NULL; if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port, AGS_PLUGIN_PORT_SAMPLERATE)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags((AgsPluginPort *) plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(ladspa_conversion == NULL || !AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; } if(ladspa_conversion != NULL){ g_object_set(port, "conversion", ladspa_conversion, NULL); } } /** * ags_play_dssi_audio_find: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @filename: plugin's filename * @effect: plugin's effect * * Find DSSI recall. * * Returns: (element-type AgsAudio.Recall) (transfer none): Next matching #GList-struct, or %NULL if not found * * Since: 3.0.0 */ GList* ags_play_dssi_audio_find(GList *recall, gchar *filename, gchar *effect) { while(recall != NULL){ if(AGS_IS_PLAY_DSSI_AUDIO(recall->data)){ gboolean success; GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall->data); /* check current filename and effect */ g_rec_mutex_lock(recall_mutex); success = (!g_strcmp0(AGS_RECALL(recall->data)->filename, filename) && !g_strcmp0(AGS_RECALL(recall->data)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); if(success){ break; } } /* iterate */ recall = recall->next; } return(recall); } /** * ags_play_dssi_audio_new: * @audio: the #AgsAudio * * Create a new instance of #AgsPlayDssiAudio * * Returns: the new #AgsPlayDssiAudio * * Since: 3.0.0 */ AgsPlayDssiAudio* ags_play_dssi_audio_new(AgsAudio *audio) { AgsPlayDssiAudio *play_dssi_audio; play_dssi_audio = (AgsPlayDssiAudio *) g_object_new(AGS_TYPE_PLAY_DSSI_AUDIO, "audio", audio, NULL); return(play_dssi_audio); } gsequencer-3.1.3/ags/audio/recall/ags_mute_audio_signal.c0000644000175000017500000001501013607210263020400 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_mute_audio_signal_class_init(AgsMuteAudioSignalClass *mute_audio_signal); void ags_mute_audio_signal_init(AgsMuteAudioSignal *mute_audio_signal); void ags_mute_audio_signal_finalize(GObject *gobject); void ags_mute_audio_signal_run_inter(AgsRecall *recall); /** * SECTION:ags_mute_audio_signal * @short_description: mutes audio signal * @title: AgsMuteAudioSignal * @section_id: * @include: ags/audio/recall/ags_mute_audio_signal.h * * The #AgsMuteAudioSignal class mutes the audio signal. */ static gpointer ags_mute_audio_signal_parent_class = NULL; GType ags_mute_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mute_audio_signal = 0; static const GTypeInfo ags_mute_audio_signal_info = { sizeof (AgsMuteAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_mute_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMuteAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_mute_audio_signal_init, }; ags_type_mute_audio_signal = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsMuteAudioSignal", &ags_mute_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_mute_audio_signal); } return g_define_type_id__volatile; } void ags_mute_audio_signal_class_init(AgsMuteAudioSignalClass *mute_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; ags_mute_audio_signal_parent_class = g_type_class_peek_parent(mute_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) mute_audio_signal; gobject->finalize = ags_mute_audio_signal_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) mute_audio_signal; recall->run_inter = ags_mute_audio_signal_run_inter; } void ags_mute_audio_signal_init(AgsMuteAudioSignal *mute_audio_signal) { AGS_RECALL(mute_audio_signal)->name = "ags-mute"; AGS_RECALL(mute_audio_signal)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(mute_audio_signal)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(mute_audio_signal)->xml_type = "ags-mute-audio-signal"; AGS_RECALL(mute_audio_signal)->port = NULL; AGS_RECALL(mute_audio_signal)->child_type = G_TYPE_NONE; } void ags_mute_audio_signal_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_mute_audio_signal_parent_class)->finalize(gobject); } void ags_mute_audio_signal_run_inter(AgsRecall *recall) { AgsAudioSignal *source; AgsPort *port; AgsMuteAudio *mute_audio; AgsMuteChannel *mute_channel; AgsMuteChannelRun *mute_channel_run; AgsMuteRecycling *mute_recycling; AgsMuteAudioSignal *mute_audio_signal; GList *stream_source; gboolean audio_muted, channel_muted; guint buffer_size; guint i; void (*parent_class_run_inter)(AgsRecall *recall); GValue audio_value = {0,}; GValue channel_value = {0,}; mute_audio_signal = AGS_MUTE_AUDIO_SIGNAL(recall); /* get parent class and mutex */ parent_class_run_inter = AGS_RECALL_CLASS(ags_mute_audio_signal_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); g_object_get(mute_audio_signal, "source", &source, NULL); stream_source = source->stream_current; if(stream_source == NULL){ ags_recall_done(recall); g_object_unref(source); return; } g_object_get(source, "buffer-size", &buffer_size, NULL); /* get some fields */ g_object_get(mute_audio_signal, "parent", &mute_recycling, NULL); g_object_get(mute_recycling, "parent", &mute_channel_run, NULL); g_object_get(mute_channel_run, "recall-channel", &mute_channel, NULL); g_object_get(mute_channel, "recall-audio", &mute_audio, NULL); /* check muted */ g_object_get(mute_channel, "muted", &port, NULL); g_value_init(&channel_value, G_TYPE_FLOAT); ags_port_safe_read(port, &channel_value); channel_muted = (gboolean) g_value_get_float(&channel_value); g_value_unset(&channel_value); g_object_unref(port); /* check audio */ g_object_get(mute_audio, "muted", &port, NULL); g_value_init(&audio_value, G_TYPE_FLOAT); ags_port_safe_read(port, &audio_value); audio_muted = (gboolean) g_value_get_float(&audio_value); g_value_unset(&audio_value); g_object_unref(port); /* if not muted return */ if(!channel_muted && !audio_muted){ goto ags_mute_audio_signal_run_inter_END; } /* mute */ memset((signed short *) stream_source->data, 0, buffer_size * sizeof(signed short)); ags_mute_audio_signal_run_inter_END: /* unref */ g_object_unref(source); g_object_unref(mute_recycling); g_object_unref(mute_channel_run); g_object_unref(mute_channel); g_object_unref(mute_audio); } /** * ags_mute_audio_signal_new: * @source: the source #AgsAudioSignal * * Create a new instance of #AgsMuteAudioSignal * * Returns: the new #AgsMuteAudioSignal * * Since: 3.0.0 */ AgsMuteAudioSignal* ags_mute_audio_signal_new(AgsAudioSignal *source) { AgsMuteAudioSignal *mute_audio_signal; mute_audio_signal = (AgsMuteAudioSignal *) g_object_new(AGS_TYPE_MUTE_AUDIO_SIGNAL, "source", source, NULL); return(mute_audio_signal); } gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_audio.h0000644000175000017500000000502413607210263020567 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CAPTURE_WAVE_AUDIO_H__ #define __AGS_CAPTURE_WAVE_AUDIO_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CAPTURE_WAVE_AUDIO (ags_capture_wave_audio_get_type()) #define AGS_CAPTURE_WAVE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CAPTURE_WAVE_AUDIO, AgsCaptureWaveAudio)) #define AGS_CAPTURE_WAVE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CAPTURE_WAVE_AUDIO, AgsCaptureWaveAudio)) #define AGS_IS_CAPTURE_WAVE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CAPTURE_WAVE_AUDIO)) #define AGS_IS_CAPTURE_WAVE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CAPTURE_WAVE_AUDIO)) #define AGS_CAPTURE_WAVE_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_CAPTURE_WAVE_AUDIO, AgsCaptureWaveAudioClass)) typedef struct _AgsCaptureWaveAudio AgsCaptureWaveAudio; typedef struct _AgsCaptureWaveAudioClass AgsCaptureWaveAudioClass; struct _AgsCaptureWaveAudio { AgsRecallAudio recall_audio; AgsPort *playback; AgsPort *replace; AgsPort *record; AgsPort *filename; AgsPort *file_audio_channels; AgsPort *file_samplerate; AgsPort *file_buffer_size; AgsPort *file_format; AgsPort *wave_loop; AgsPort *wave_loop_start; AgsPort *wave_loop_end; GRecMutex audio_file_mutex; AgsAudioFile *audio_file; }; struct _AgsCaptureWaveAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_capture_wave_audio_get_type(); AgsCaptureWaveAudio* ags_capture_wave_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_CAPTURE_WAVE_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_loop_channel.c0000644000175000017500000001462313607210263017362 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_loop_channel_class_init(AgsLoopChannelClass *loop_channel); void ags_loop_channel_init(AgsLoopChannel *loop_channel); void ags_loop_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_loop_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_loop_channel_dispose(GObject *gobject); void ags_loop_channel_finalize(GObject *gobject); /** * SECTION:ags_loop_channel * @short_description: loops channel * @title: AgsLoopChannel * @section_id: * @include: ags/audio/recall/ags_loop_channel.h * * The #AgsLoopChannel class provides ports to the effect processor. */ static gpointer ags_loop_channel_parent_class = NULL; enum{ PROP_0, PROP_DELAY_AUDIO, }; GType ags_loop_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_loop_channel = 0; static const GTypeInfo ags_loop_channel_info = { sizeof (AgsLoopChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_loop_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLoopChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_loop_channel_init, }; ags_type_loop_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsLoopChannel", &ags_loop_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_loop_channel); } return g_define_type_id__volatile; } void ags_loop_channel_class_init(AgsLoopChannelClass *loop_channel) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_loop_channel_parent_class = g_type_class_peek_parent(loop_channel); /* GObjectClass */ gobject = (GObjectClass *) loop_channel; gobject->set_property = ags_loop_channel_set_property; gobject->get_property = ags_loop_channel_get_property; gobject->dispose = ags_loop_channel_dispose; gobject->finalize = ags_loop_channel_finalize; /* properties */ /** * AgsLoopChannel:delay-audio: * * The assigned #AgsDelayAudio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio", "assigned delay audio", "The delay audio it is assigned with", AGS_TYPE_DELAY_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO, param_spec); } void ags_loop_channel_init(AgsLoopChannel *loop_channel) { AGS_RECALL(loop_channel)->name = "ags-loop"; AGS_RECALL(loop_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(loop_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(loop_channel)->xml_type = "ags-loop-channel"; loop_channel->delay_audio = NULL; } void ags_loop_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLoopChannel *loop_channel; GRecMutex *recall_mutex; loop_channel = AGS_LOOP_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(loop_channel); switch(prop_id){ case PROP_DELAY_AUDIO: { AgsDelayAudio *delay_audio; delay_audio = (AgsDelayAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(loop_channel->delay_audio == delay_audio){ g_rec_mutex_unlock(recall_mutex); return; } if(loop_channel->delay_audio != NULL){ g_object_unref(G_OBJECT(loop_channel->delay_audio)); } if(delay_audio != NULL){ g_object_ref(G_OBJECT(delay_audio)); } loop_channel->delay_audio = delay_audio; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_loop_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLoopChannel *loop_channel; GRecMutex *recall_mutex; loop_channel = AGS_LOOP_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(loop_channel); switch(prop_id){ case PROP_DELAY_AUDIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, loop_channel->delay_audio); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_loop_channel_dispose(GObject *gobject) { AgsLoopChannel *loop_channel; loop_channel = AGS_LOOP_CHANNEL(gobject); /* delay audio */ if(loop_channel->delay_audio != NULL){ g_object_unref(G_OBJECT(loop_channel->delay_audio)); loop_channel->delay_audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_loop_channel_parent_class)->dispose(gobject); } void ags_loop_channel_finalize(GObject *gobject) { AgsLoopChannel *loop_channel; loop_channel = AGS_LOOP_CHANNEL(gobject); /* delay audio */ if(loop_channel->delay_audio != NULL){ g_object_unref(G_OBJECT(loop_channel->delay_audio)); } /* call parent */ G_OBJECT_CLASS(ags_loop_channel_parent_class)->finalize(gobject); } /** * ags_loop_channel_new: * @source: the #AgsChannel * * Create a new instance of #AgsLoopChannel * * Returns: the new #AgsLoopChannel * * Since: 3.0.0 */ AgsLoopChannel* ags_loop_channel_new(AgsChannel *source) { AgsLoopChannel *loop_channel; loop_channel = (AgsLoopChannel *) g_object_new(AGS_TYPE_LOOP_CHANNEL, "source", source, NULL); return(loop_channel); } gsequencer-3.1.3/ags/audio/recall/ags_play_wave_channel_run.h0000644000175000017500000000453013607210263021265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_WAVE_CHANNEL_RUN_H__ #define __AGS_PLAY_WAVE_CHANNEL_RUN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_WAVE_CHANNEL_RUN (ags_play_wave_channel_run_get_type()) #define AGS_PLAY_WAVE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_WAVE_CHANNEL_RUN, AgsPlayWaveChannelRun)) #define AGS_PLAY_WAVE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_WAVE_CHANNEL_RUN, AgsPlayWaveChannelRun)) #define AGS_IS_PLAY_WAVE_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_WAVE_CHANNEL_RUN)) #define AGS_IS_PLAY_WAVE_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_WAVE_CHANNEL_RUN)) #define AGS_PLAY_WAVE_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_WAVE_CHANNEL_RUN, AgsPlayWaveChannelRunClass)) typedef struct _AgsPlayWaveChannelRun AgsPlayWaveChannelRun; typedef struct _AgsPlayWaveChannelRunClass AgsPlayWaveChannelRunClass; struct _AgsPlayWaveChannelRun { AgsRecallChannelRun recall_channel_run; AgsTimestamp *timestamp; AgsAudioSignal *audio_signal; guint64 x_offset; }; struct _AgsPlayWaveChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_play_wave_channel_run_get_type(); AgsPlayWaveChannelRun* ags_play_wave_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PLAY_WAVE_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_channel.c0000644000175000017500000002030613607210263021113 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_copy_pattern_channel_class_init(AgsCopyPatternChannelClass *copy_pattern_channel); void ags_copy_pattern_channel_init(AgsCopyPatternChannel *copy_pattern_channel); void ags_copy_pattern_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_copy_pattern_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_copy_pattern_channel_dispose(GObject *gobject); void ags_copy_pattern_channel_finalize(GObject *gobject); /** * SECTION:ags_copy_pattern_channel * @short_description: copy patterns channel * @title: AgsCopyPatternChannel * @section_id: * @include: ags/audio/recall/ags_copy_pattern_channel.h * * The #AgsCopyPatternChannel class provides ports to the effect processor. */ enum{ PROP_0, PROP_PATTERN, }; static gpointer ags_copy_pattern_channel_parent_class = NULL; static const gchar *ags_copy_pattern_channel_plugin_name = "ags-copy-pattern"; static const gchar *ags_copy_pattern_channel_specifier[] = { "./pattern[0]" }; static const gchar *ags_copy_pattern_channel_control_port[] = { "1/1" }; GType ags_copy_pattern_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_pattern_channel = 0; static const GTypeInfo ags_copy_pattern_channel_info = { sizeof (AgsCopyPatternChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_pattern_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCopyPatternChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_pattern_channel_init, }; ags_type_copy_pattern_channel = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsCopyPatternChannel", &ags_copy_pattern_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_pattern_channel); } return g_define_type_id__volatile; } void ags_copy_pattern_channel_class_init(AgsCopyPatternChannelClass *copy_pattern_channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_copy_pattern_channel_parent_class = g_type_class_peek_parent(copy_pattern_channel); /* GObjectClass */ gobject = (GObjectClass *) copy_pattern_channel; gobject->set_property = ags_copy_pattern_channel_set_property; gobject->get_property = ags_copy_pattern_channel_get_property; gobject->dispose = ags_copy_pattern_channel_dispose; gobject->finalize = ags_copy_pattern_channel_finalize; /* properties */ /** * AgsCopyPatternChannel:pattern: * * The pattern port. * * Since: 3.0.0 */ param_spec = g_param_spec_object("pattern", i18n_pspec("pattern to play"), i18n_pspec("The pattern which has to be played"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PATTERN, param_spec); } void ags_copy_pattern_channel_init(AgsCopyPatternChannel *copy_pattern_channel) { GList *port; AGS_RECALL(copy_pattern_channel)->name = "ags-copy-pattern"; AGS_RECALL(copy_pattern_channel)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_pattern_channel)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_pattern_channel)->xml_type = "ags-copy-pattern-channel"; port = NULL; /* pattern */ copy_pattern_channel->pattern = g_object_new(AGS_TYPE_PORT, "plugin-name", ags_copy_pattern_channel_plugin_name, "specifier", ags_copy_pattern_channel_specifier[0], "control-port", ags_copy_pattern_channel_control_port[0], "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_OBJECT, NULL); g_object_ref(copy_pattern_channel->pattern); copy_pattern_channel->pattern->port_value.ags_port_object = NULL; /* add to port */ port = g_list_prepend(port, copy_pattern_channel->pattern); g_object_ref(copy_pattern_channel->pattern); /* set port */ AGS_RECALL(copy_pattern_channel)->port = port; } void ags_copy_pattern_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCopyPatternChannel *copy_pattern_channel; GRecMutex *recall_mutex; copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_channel); switch(prop_id){ case PROP_PATTERN: { AgsPort *pattern; pattern = (AgsPort *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(copy_pattern_channel->pattern == pattern){ g_rec_mutex_unlock(recall_mutex); return; } if(copy_pattern_channel->pattern != NULL){ g_object_unref(G_OBJECT(copy_pattern_channel->pattern)); } if(pattern != NULL){ g_object_ref(G_OBJECT(pattern)); } copy_pattern_channel->pattern = pattern; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_copy_pattern_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCopyPatternChannel *copy_pattern_channel; GRecMutex *recall_mutex; copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(copy_pattern_channel); switch(prop_id){ case PROP_PATTERN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, copy_pattern_channel->pattern); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_copy_pattern_channel_dispose(GObject *gobject) { AgsCopyPatternChannel *copy_pattern_channel; copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(gobject); /* pattern */ if(copy_pattern_channel->pattern != NULL){ g_object_unref(copy_pattern_channel->pattern); copy_pattern_channel->pattern = NULL; } /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_channel_parent_class)->dispose(gobject); } void ags_copy_pattern_channel_finalize(GObject *gobject) { AgsCopyPatternChannel *copy_pattern_channel; copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(gobject); /* pattern */ if(copy_pattern_channel->pattern != NULL){ g_object_unref(copy_pattern_channel->pattern); } /* call parent */ G_OBJECT_CLASS(ags_copy_pattern_channel_parent_class)->finalize(gobject); } /** * ags_copy_pattern_channel_new: * @destination: the destination #AgsChannel * @source: the source #AgsChannel * * Create a new instance of #AgsCopyPatternChannel * * Returns: the new #AgsCopyPatternChannel * * Since: 3.0.0 */ AgsCopyPatternChannel* ags_copy_pattern_channel_new(AgsChannel *destination, AgsChannel *source) { AgsCopyPatternChannel *copy_pattern_channel; copy_pattern_channel = (AgsCopyPatternChannel *) g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL, "destination", destination, "source", source, NULL); return(copy_pattern_channel); } gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_recycling.h0000644000175000017500000000426413607210263020765 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RT_STREAM_RECYCLING_H__ #define __AGS_RT_STREAM_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RT_STREAM_RECYCLING (ags_rt_stream_recycling_get_type()) #define AGS_RT_STREAM_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RT_STREAM_RECYCLING, AgsRtStreamRecycling)) #define AGS_RT_STREAM_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RT_STREAM_RECYCLING, AgsRtStreamRecyclingClass)) #define AGS_IS_RT_STREAM_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RT_STREAM_RECYCLING)) #define AGS_IS_RT_STREAM_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RT_STREAM_RECYCLING)) #define AGS_RT_STREAM_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RT_STREAM_RECYCLING, AgsRtStreamRecyclingClass)) typedef struct _AgsRtStreamRecycling AgsRtStreamRecycling; typedef struct _AgsRtStreamRecyclingClass AgsRtStreamRecyclingClass; struct _AgsRtStreamRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsRtStreamRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_rt_stream_recycling_get_type(); AgsRtStreamRecycling* ags_rt_stream_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_RT_STREAM_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_channel_run.c0000644000175000017500000002061013607210263021266 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_rt_stream_channel_run_class_init(AgsRtStreamChannelRunClass *rt_stream_channel_run); void ags_rt_stream_channel_run_init(AgsRtStreamChannelRun *rt_stream_channel_run); void ags_rt_stream_channel_run_check_rt_data(AgsRecall *recall); void ags_rt_stream_channel_run_done(AgsRecall *recall); /** * SECTION:ags_rt_stream_channel_run * @short_description: rt streams channel * @title: AgsRtStreamChannelRun * @section_id: * @include: ags/audio/recall/ags_rt_stream_channel_run.h * * The #AgsRtStreamChannelRun class streams the audio signal template. */ static gpointer ags_rt_stream_channel_run_parent_class = NULL; GType ags_rt_stream_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_rt_stream_channel_run = 0; static const GTypeInfo ags_rt_stream_channel_run_info = { sizeof (AgsRtStreamChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_rt_stream_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRtStreamChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_rt_stream_channel_run_init, }; ags_type_rt_stream_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsRtStreamChannelRun", &ags_rt_stream_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_rt_stream_channel_run); } return g_define_type_id__volatile; } void ags_rt_stream_channel_run_class_init(AgsRtStreamChannelRunClass *rt_stream_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_rt_stream_channel_run_parent_class = g_type_class_peek_parent(rt_stream_channel_run); /* GObjectClass */ gobject = (GObjectClass *) rt_stream_channel_run; /* AgsRecallClass */ recall = (AgsRecallClass *) rt_stream_channel_run; recall->check_rt_data = ags_rt_stream_channel_run_check_rt_data; recall->done = ags_rt_stream_channel_run_done; } void ags_rt_stream_channel_run_init(AgsRtStreamChannelRun *rt_stream_channel_run) { ags_recall_set_ability_flags((AgsRecall *) rt_stream_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(rt_stream_channel_run)->name = "ags-rt_stream"; AGS_RECALL(rt_stream_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(rt_stream_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(rt_stream_channel_run)->xml_type = "ags-rt_stream-channel-run"; AGS_RECALL(rt_stream_channel_run)->port = NULL; AGS_RECALL(rt_stream_channel_run)->child_type = AGS_TYPE_RT_STREAM_RECYCLING; } void ags_rt_stream_channel_run_check_rt_data(AgsRecall *recall) { AgsChannel *source; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *end_recycling; AgsRecycling *recycling, *next_recycling; AgsRtStreamChannelRun *rt_stream_channel_run; AgsRecallID *recall_id; GObject *output_soundcard; rt_stream_channel_run = (AgsRtStreamChannelRun *) recall; g_object_get(rt_stream_channel_run, "source", &source, "output-soundcard", &output_soundcard, "recall-id", &recall_id, NULL); /* get first and last recycling */ g_object_get(source, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); /* get end */ end_recycling = ags_recycling_next(last_recycling); /* */ recycling = first_recycling; g_object_ref(recycling); next_recycling = NULL; while(recycling != end_recycling){ AgsAudioSignal *audio_signal; AgsAudioSignal *rt_template, *template; /* create rt template */ rt_template = ags_audio_signal_new(output_soundcard, (GObject *) recycling, (GObject *) recall_id); rt_template->flags |= AGS_AUDIO_SIGNAL_RT_TEMPLATE; ags_recycling_create_audio_signal_with_defaults(recycling, rt_template, 0.0, 0); ags_recycling_add_audio_signal(recycling, rt_template); /* create buffer */ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) recycling, (GObject *) recall_id); g_object_set(audio_signal, "rt-template", rt_template, NULL); ags_audio_signal_stream_resize(audio_signal, 3); audio_signal->stream_current = audio_signal->stream; /* add buffer */ ags_recycling_add_audio_signal(recycling, audio_signal); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* unref */ g_object_unref(source); g_object_unref(output_soundcard); g_object_unref(recall_id); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_recycling != NULL){ g_object_unref(end_recycling); } } void ags_rt_stream_channel_run_done(AgsRecall *recall) { AgsChannel *source; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *end_recycling; AgsRecycling *recycling, *next_recycling; AgsRecallID *recall_id; AgsRtStreamChannelRun *rt_stream_channel_run; void (*parent_class_done)(AgsRecall *recall); rt_stream_channel_run = (AgsRtStreamChannelRun *) recall; /* get parent class */ parent_class_done = AGS_RECALL_CLASS(ags_rt_stream_channel_run_parent_class)->done; /* get some fields */ g_object_get(rt_stream_channel_run, "source", &source, "recall-id", &recall_id, NULL); /* get first and last recycling */ g_object_get(source, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); /* get end */ end_recycling = ags_recycling_next(last_recycling); /* prepare */ recycling = first_recycling; g_object_ref(recycling); next_recycling = NULL; while(recycling != end_recycling){ GList *start_audio_signal, *audio_signal; g_object_get(recycling, "audio-signal", &start_audio_signal, NULL); audio_signal = start_audio_signal; while((audio_signal = ags_audio_signal_find_by_recall_id(audio_signal, (GObject *) recall_id)) != NULL){ ags_recycling_remove_audio_signal(recycling, audio_signal->data); audio_signal = audio_signal->next; } g_list_free(start_audio_signal); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* call parent */ parent_class_done(recall); /* unref */ g_object_unref(source); g_object_unref(recall_id); if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_recycling != NULL){ g_object_unref(end_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } } /** * ags_rt_stream_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsRtStreamChannelRun * * Returns: the new #AgsRtStreamChannelRun * * Since: 3.0.0 */ AgsRtStreamChannelRun* ags_rt_stream_channel_run_new(AgsChannel *source) { AgsRtStreamChannelRun *rt_stream_channel_run; rt_stream_channel_run = (AgsRtStreamChannelRun *) g_object_new(AGS_TYPE_RT_STREAM_CHANNEL_RUN, "source", source, NULL); return(rt_stream_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_channel.h0000644000175000017500000000442313607210263021122 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_PATTERN_CHANNEL_H__ #define __AGS_COPY_PATTERN_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_PATTERN_CHANNEL (ags_copy_pattern_channel_get_type()) #define AGS_COPY_PATTERN_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_PATTERN_CHANNEL, AgsCopyPatternChannel)) #define AGS_COPY_PATTERN_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_PATTERN_CHANNEL, AgsCopyPatternChannel)) #define AGS_IS_COPY_PATTERN_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_PATTERN_CHANNEL)) #define AGS_IS_COPY_PATTERN_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_PATTERN_CHANNEL)) #define AGS_COPY_PATTERN_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_PATTERN_CHANNEL, AgsCopyPatternChannelClass)) typedef struct _AgsCopyPatternChannel AgsCopyPatternChannel; typedef struct _AgsCopyPatternChannelClass AgsCopyPatternChannelClass; struct _AgsCopyPatternChannel { AgsRecallChannel recall_channel; AgsPort *pattern; }; struct _AgsCopyPatternChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_copy_pattern_channel_get_type(); AgsCopyPatternChannel* ags_copy_pattern_channel_new(AgsChannel *destination, AgsChannel *source); G_END_DECLS #endif /*__AGS_COPY_PATTERN_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_mute_channel.h0000644000175000017500000000404013607210263017360 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTE_CHANNEL_H__ #define __AGS_MUTE_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTE_CHANNEL (ags_mute_channel_get_type()) #define AGS_MUTE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTE_CHANNEL, AgsMuteChannel)) #define AGS_MUTE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MUTE_CHANNEL, AgsMuteChannel)) #define AGS_IS_MUTE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MUTE_CHANNEL)) #define AGS_IS_MUTE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MUTE_CHANNEL)) #define AGS_MUTE_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MUTE_CHANNEL, AgsMuteChannelClass)) typedef struct _AgsMuteChannel AgsMuteChannel; typedef struct _AgsMuteChannelClass AgsMuteChannelClass; struct _AgsMuteChannel { AgsRecallChannel recall_channel; AgsPort *muted; }; struct _AgsMuteChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_mute_channel_get_type(); AgsMuteChannel* ags_mute_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_MUTE_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_recycling.c0000644000175000017500000000752713607210263020765 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_rt_stream_recycling_class_init(AgsRtStreamRecyclingClass *rt_stream_recycling); void ags_rt_stream_recycling_init(AgsRtStreamRecycling *rt_stream_recycling); void ags_rt_stream_recycling_finalize(GObject *gobject); /** * SECTION:ags_rt_stream_recycling * @short_description: rt streams recycling * @title: AgsRtStreamRecycling * @section_id: * @include: ags/audio/recall/ags_rt_stream_recycling.h * * The #AgsRtStreamRecycling rt streams the recycling with appropriate #AgsRecallID. */ static gpointer ags_rt_stream_recycling_parent_class = NULL; GType ags_rt_stream_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_rt_stream_recycling = 0; static const GTypeInfo ags_rt_stream_recycling_info = { sizeof (AgsRtStreamRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_rt_stream_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRtStreamRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_rt_stream_recycling_init, }; ags_type_rt_stream_recycling = g_type_register_static(AGS_TYPE_RECALL_RECYCLING, "AgsRtStreamRecycling", &ags_rt_stream_recycling_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_rt_stream_recycling); } return g_define_type_id__volatile; } void ags_rt_stream_recycling_class_init(AgsRtStreamRecyclingClass *rt_stream_recycling) { GObjectClass *gobject; ags_rt_stream_recycling_parent_class = g_type_class_peek_parent(rt_stream_recycling); /* GObjectClass */ gobject = (GObjectClass *) rt_stream_recycling; gobject->finalize = ags_rt_stream_recycling_finalize; } void ags_rt_stream_recycling_init(AgsRtStreamRecycling *rt_stream_recycling) { AGS_RECALL(rt_stream_recycling)->name = "ags-rt_stream"; AGS_RECALL(rt_stream_recycling)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(rt_stream_recycling)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(rt_stream_recycling)->xml_type = "ags-rt_stream-recycling"; AGS_RECALL(rt_stream_recycling)->port = NULL; AGS_RECALL(rt_stream_recycling)->child_type = AGS_TYPE_RT_STREAM_AUDIO_SIGNAL; AGS_RECALL_RECYCLING(rt_stream_recycling)->flags |= (AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); } void ags_rt_stream_recycling_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_rt_stream_recycling_parent_class)->finalize(gobject); } /** * ags_rt_stream_recycling_new: * @source: the #AgsRecycling * * Create a new instance of #AgsRtStreamRecycling * * Returns: the new #AgsRtStreamRecycling * * Since: 3.0.0 */ AgsRtStreamRecycling* ags_rt_stream_recycling_new(AgsRecycling *source) { AgsRtStreamRecycling *rt_stream_recycling; rt_stream_recycling = (AgsRtStreamRecycling *) g_object_new(AGS_TYPE_RT_STREAM_RECYCLING, "source", source, NULL); return(rt_stream_recycling); } gsequencer-3.1.3/ags/audio/recall/ags_feed_channel_run.c0000644000175000017500000000725313607210263020201 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_feed_channel_run_class_init(AgsFeedChannelRunClass *feed_channel_run); void ags_feed_channel_run_init(AgsFeedChannelRun *feed_channel_run); void ags_feed_channel_run_finalize(GObject *gobject); /** * SECTION:ags_feed_channel_run * @short_description: feeds channel * @title: AgsFeedChannelRun * @section_id: * @include: ags/audio/recall/ags_feed_channel_run.h * * The #AgsFeedChannelRun class feeds the channel. */ static gpointer ags_feed_channel_run_parent_class = NULL; GType ags_feed_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_feed_channel_run = 0; static const GTypeInfo ags_feed_channel_run_info = { sizeof (AgsFeedChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_feed_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFeedChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_feed_channel_run_init, }; ags_type_feed_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsFeedChannelRun", &ags_feed_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_feed_channel_run); } return g_define_type_id__volatile; } void ags_feed_channel_run_class_init(AgsFeedChannelRunClass *feed_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_feed_channel_run_parent_class = g_type_class_peek_parent(feed_channel_run); /* GObjectClass */ gobject = (GObjectClass *) feed_channel_run; gobject->finalize = ags_feed_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) feed_channel_run; } void ags_feed_channel_run_init(AgsFeedChannelRun *feed_channel_run) { ags_recall_set_ability_flags((AgsRecall *) feed_channel_run, (AGS_SOUND_ABILITY_NOTATION)); AGS_RECALL(feed_channel_run)->name = "ags-feed"; AGS_RECALL(feed_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(feed_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(feed_channel_run)->xml_type = "ags-feed-channel-run"; AGS_RECALL(feed_channel_run)->child_type = AGS_TYPE_FEED_RECYCLING; } void ags_feed_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_feed_channel_run_parent_class)->finalize(gobject); } /** * ags_feed_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsFeedChannelRun * * Returns: a new #AgsFeedChannelRun * * Since: 3.0.0 */ AgsFeedChannelRun* ags_feed_channel_run_new(AgsChannel *source) { AgsFeedChannelRun *feed_channel_run; feed_channel_run = (AgsFeedChannelRun *) g_object_new(AGS_TYPE_FEED_CHANNEL_RUN, "source", source, NULL); return(feed_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_play_wave_channel.h0000644000175000017500000000435213607210263020403 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_WAVE_CHANNEL_H__ #define __AGS_PLAY_WAVE_CHANNEL_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_WAVE_CHANNEL (ags_play_wave_channel_get_type()) #define AGS_PLAY_WAVE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_WAVE_CHANNEL, AgsPlayWaveChannel)) #define AGS_PLAY_WAVE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_WAVE_CHANNEL, AgsPlayWaveChannel)) #define AGS_IS_PLAY_WAVE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_WAVE_CHANNEL)) #define AGS_IS_PLAY_WAVE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_WAVE_CHANNEL)) #define AGS_PLAY_WAVE_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_WAVE_CHANNEL, AgsPlayWaveChannelClass)) typedef struct _AgsPlayWaveChannel AgsPlayWaveChannel; typedef struct _AgsPlayWaveChannelClass AgsPlayWaveChannelClass; struct _AgsPlayWaveChannel { AgsRecallChannel recall_channel; AgsWave *wave; AgsPort *do_playback; AgsPort *x_offset; }; struct _AgsPlayWaveChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_play_wave_channel_get_type(); AgsPlayWaveChannel* ags_play_wave_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PLAY_WAVE_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_wave_audio_run.c0000644000175000017500000001066413607210263020756 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_play_wave_audio_run_class_init(AgsPlayWaveAudioRunClass *play_wave_audio_run); void ags_play_wave_audio_run_init(AgsPlayWaveAudioRun *play_wave_audio_run); void ags_play_wave_audio_run_dispose(GObject *gobject); void ags_play_wave_audio_run_finalize(GObject *gobject); /** * SECTION:ags_play_wave_audio_run * @short_description: play wave * @title: AgsPlayWaveAudioRun * @section_id: * @include: ags/audio/recall/ags_play_wave_audio_run.h * * The #AgsPlayWaveAudioRun class play wave. */ static gpointer ags_play_wave_audio_run_parent_class = NULL; GType ags_play_wave_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_play_wave_audio_run = 0; static const GTypeInfo ags_play_wave_audio_run_info = { sizeof (AgsPlayWaveAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_play_wave_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPlayWaveAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_play_wave_audio_run_init, }; ags_type_play_wave_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsPlayWaveAudioRun", &ags_play_wave_audio_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_play_wave_audio_run); } return g_define_type_id__volatile; } void ags_play_wave_audio_run_class_init(AgsPlayWaveAudioRunClass *play_wave_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_play_wave_audio_run_parent_class = g_type_class_peek_parent(play_wave_audio_run); /* GObjectClass */ gobject = (GObjectClass *) play_wave_audio_run; gobject->dispose = ags_play_wave_audio_run_dispose; gobject->finalize = ags_play_wave_audio_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) play_wave_audio_run; } void ags_play_wave_audio_run_init(AgsPlayWaveAudioRun *play_wave_audio_run) { ags_recall_set_ability_flags((AgsRecall *) play_wave_audio_run, (AGS_SOUND_ABILITY_WAVE)); AGS_RECALL(play_wave_audio_run)->name = "ags-play-wave"; AGS_RECALL(play_wave_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(play_wave_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(play_wave_audio_run)->xml_type = "ags-play-wave-audio-run"; AGS_RECALL(play_wave_audio_run)->port = NULL; } void ags_play_wave_audio_run_dispose(GObject *gobject) { AgsPlayWaveAudioRun *play_wave_audio_run; play_wave_audio_run = AGS_PLAY_WAVE_AUDIO_RUN(gobject); /* call parent */ G_OBJECT_CLASS(ags_play_wave_audio_run_parent_class)->dispose(gobject); } void ags_play_wave_audio_run_finalize(GObject *gobject) { AgsPlayWaveAudioRun *play_wave_audio_run; play_wave_audio_run = AGS_PLAY_WAVE_AUDIO_RUN(gobject); /* call parent */ G_OBJECT_CLASS(ags_play_wave_audio_run_parent_class)->finalize(gobject); } /** * ags_play_wave_audio_run_new: * @audio: the #AgsAudio * * Create a new instance of #AgsPlayWaveAudioRun * * Returns: the new #AgsPlayWaveAudioRun * * Since: 3.0.0 */ AgsPlayWaveAudioRun* ags_play_wave_audio_run_new(AgsAudio *audio) { AgsPlayWaveAudioRun *play_wave_audio_run; play_wave_audio_run = (AgsPlayWaveAudioRun *) g_object_new(AGS_TYPE_PLAY_WAVE_AUDIO_RUN, "audio", audio, NULL); return(play_wave_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_copy_pattern_audio.h0000644000175000017500000000455613607210263020622 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COPY_PATTERN_AUDIO_H__ #define __AGS_COPY_PATTERN_AUDIO_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COPY_PATTERN_AUDIO (ags_copy_pattern_audio_get_type()) #define AGS_COPY_PATTERN_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COPY_PATTERN_AUDIO, AgsCopyPatternAudio)) #define AGS_COPY_PATTERN_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_COPY_PATTERN_AUDIO, AgsCopyPatternAudio)) #define AGS_IS_COPY_PATTERN_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_COPY_PATTERN_AUDIO)) #define AGS_IS_COPY_PATTERN_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_COPY_PATTERN_AUDIO)) #define AGS_COPY_PATTERN_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_COPY_PATTERN_AUDIO, AgsCopyPatternAudioClass)) #define AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_0 (256.0) #define AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_1 (256.0) typedef struct _AgsCopyPatternAudio AgsCopyPatternAudio; typedef struct _AgsCopyPatternAudioClass AgsCopyPatternAudioClass; struct _AgsCopyPatternAudio { AgsRecallAudio recall_audio; AgsPort *bank_index_0; AgsPort *bank_index_1; }; struct _AgsCopyPatternAudioClass { AgsRecallAudioClass recall_audio; }; GType ags_copy_pattern_audio_get_type(); AgsCopyPatternAudio* ags_copy_pattern_audio_new(AgsAudio *audio, guint bank_index_0, guint bank_index_1); G_END_DECLS #endif /*__AGS_COPY_PATTERN_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_eq10_channel_run.h0000644000175000017500000000412613607210263020045 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EQ10_CHANNEL_RUN_H__ #define __AGS_EQ10_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EQ10_CHANNEL_RUN (ags_eq10_channel_run_get_type()) #define AGS_EQ10_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_EQ10_CHANNEL_RUN, AgsEq10ChannelRun)) #define AGS_EQ10_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_INSTANCE_CAST(class, AGS_TYPE_EQ10_CHANNEL_RUN, AgsEq10ChannelRunClass)) #define AGS_IS_EQ10_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EQ10_CHANNEL_RUN)) #define AGS_IS_EQ10_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EQ10_CHANNEL_RUN)) #define AGS_EQ10_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EQ10_CHANNEL_RUN, AgsEq10ChannelRunClass)) typedef struct _AgsEq10ChannelRun AgsEq10ChannelRun; typedef struct _AgsEq10ChannelRunClass AgsEq10ChannelRunClass; struct _AgsEq10ChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsEq10ChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_eq10_channel_run_get_type(); AgsEq10ChannelRun* ags_eq10_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_EQ10_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_prepare_channel_run.c0000644000175000017500000001000313607210263020717 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_prepare_channel_run_class_init(AgsPrepareChannelRunClass *prepare_channel_run); void ags_prepare_channel_run_init(AgsPrepareChannelRun *prepare_channel_run); void ags_prepare_channel_run_finalize(GObject *gobject); /** * SECTION:ags_prepare_channel_run * @short_description: prepares channel * @title: AgsPrepareChannelRun * @section_id: * @include: ags/audio/recall/ags_prepare_channel_run.h * * The #AgsPrepareChannelRun class prepares the channel. */ static gpointer ags_prepare_channel_run_parent_class = NULL; GType ags_prepare_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_prepare_channel_run = 0; static const GTypeInfo ags_prepare_channel_run_info = { sizeof (AgsPrepareChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_prepare_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPrepareChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_prepare_channel_run_init, }; ags_type_prepare_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsPrepareChannelRun", &ags_prepare_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_prepare_channel_run); } return g_define_type_id__volatile; } void ags_prepare_channel_run_class_init(AgsPrepareChannelRunClass *prepare_channel_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_prepare_channel_run_parent_class = g_type_class_peek_parent(prepare_channel_run); /* GObjectClass */ gobject = (GObjectClass *) prepare_channel_run; gobject->finalize = ags_prepare_channel_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) prepare_channel_run; } void ags_prepare_channel_run_init(AgsPrepareChannelRun *prepare_channel_run) { ags_recall_set_ability_flags((AgsRecall *) prepare_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(prepare_channel_run)->name = "ags-prepare"; AGS_RECALL(prepare_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(prepare_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(prepare_channel_run)->xml_type = "ags-prepare-channel-run"; AGS_RECALL(prepare_channel_run)->port = NULL; AGS_RECALL(prepare_channel_run)->child_type = AGS_TYPE_PREPARE_RECYCLING; } void ags_prepare_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_prepare_channel_run_parent_class)->finalize(gobject); } /** * ags_prepare_channel_run_new: * @source: the #AgsChannel * * Create a new instance of #AgsPrepareChannelRun * * Returns: the new #AgsPrepareChannelRun * * Since: 3.0.0 */ AgsPrepareChannelRun* ags_prepare_channel_run_new(AgsChannel *source) { AgsPrepareChannelRun *prepare_channel_run; prepare_channel_run = (AgsPrepareChannelRun *) g_object_new(AGS_TYPE_PREPARE_CHANNEL_RUN, "source", source, NULL); return(prepare_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_delay_audio_run.c0000644000175000017500000010067613607210263020070 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_delay_audio_run_class_init(AgsDelayAudioRunClass *delay_audio_run); void ags_delay_audio_run_init(AgsDelayAudioRun *delay_audio_run); void ags_delay_audio_run_finalize(GObject *gobject); void ags_delay_audio_run_run_init_pre(AgsRecall *recall); void ags_delay_audio_run_run_pre(AgsRecall *recall); AgsRecall* ags_delay_audio_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); void ags_delay_audio_run_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase); /** * SECTION:ags_delay_audio_run * @short_description: delay * @title: AgsDelayAudioRun * @section_id: * @include: ags/audio/recall/ags_delay_audio_run.h * * The #AgsDelayAudioRun class delays. */ enum{ NOTATION_ALLOC_OUTPUT, NOTATION_ALLOC_INPUT, NOTATION_COUNT, SEQUENCER_ALLOC_OUTPUT, SEQUENCER_ALLOC_INPUT, SEQUENCER_COUNT, WAVE_ALLOC_OUTPUT, WAVE_ALLOC_INPUT, WAVE_COUNT, MIDI_ALLOC_OUTPUT, MIDI_ALLOC_INPUT, MIDI_COUNT, LAST_SIGNAL, }; static gpointer ags_delay_audio_run_parent_class = NULL; static guint delay_audio_run_signals[LAST_SIGNAL]; GType ags_delay_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_delay_audio_run = 0; static const GTypeInfo ags_delay_audio_run_info = { sizeof(AgsDelayAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_delay_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDelayAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_delay_audio_run_init, }; ags_type_delay_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsDelayAudioRun", &ags_delay_audio_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_delay_audio_run); } return g_define_type_id__volatile; } void ags_delay_audio_run_class_init(AgsDelayAudioRunClass *delay_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; ags_delay_audio_run_parent_class = g_type_class_peek_parent(delay_audio_run); /* GObjectClass */ gobject = (GObjectClass *) delay_audio_run; gobject->finalize = ags_delay_audio_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) delay_audio_run; recall->run_init_pre = ags_delay_audio_run_run_init_pre; recall->run_pre = ags_delay_audio_run_run_pre; recall->duplicate = ags_delay_audio_run_duplicate; recall->notify_dependency = ags_delay_audio_run_notify_dependency; /* AgsDelayAudioRun */ delay_audio_run->notation_alloc_output = NULL; delay_audio_run->notation_alloc_input = NULL; delay_audio_run->notation_count = NULL; delay_audio_run->sequencer_alloc_output = NULL; delay_audio_run->sequencer_alloc_input = NULL; delay_audio_run->sequencer_count = NULL; delay_audio_run->wave_alloc_output = NULL; delay_audio_run->wave_alloc_input = NULL; delay_audio_run->wave_count = NULL; delay_audio_run->midi_alloc_output = NULL; delay_audio_run->midi_alloc_input = NULL; delay_audio_run->midi_count = NULL; /* signals */ /** * AgsDelayAudioRun::sequencer-alloc-output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::sequencer-alloc-output signal is emited while allocating * sequencer output. * * Since: 3.0.0 */ delay_audio_run_signals[SEQUENCER_ALLOC_OUTPUT] = g_signal_new("sequencer-alloc-output", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, sequencer_alloc_output), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::sequencer-alloc-input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::sequencer-alloc-input signal is emited while allocating * sequencer input. * * Since: 3.0.0 */ delay_audio_run_signals[SEQUENCER_ALLOC_INPUT] = g_signal_new("sequencer-alloc-input", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, sequencer_alloc_input), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::sequencer-count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::sequencer-count signal is emited while counting * sequencer. * * Since: 3.0.0 */ delay_audio_run_signals[SEQUENCER_COUNT] = g_signal_new("sequencer-count", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, sequencer_count), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::notation-alloc-output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::notation-alloc-output signal is emited while allocating * notation output. * * Since: 3.0.0 */ delay_audio_run_signals[NOTATION_ALLOC_OUTPUT] = g_signal_new("notation-alloc-output", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, notation_alloc_output), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::notation-alloc-input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::notation-alloc-input signal is emited while allocating * notation input. * * Since: 3.0.0 */ delay_audio_run_signals[NOTATION_ALLOC_INPUT] = g_signal_new("notation-alloc-input", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, notation_alloc_input), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::notation-count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::notation-count signal is emited while counting * notation. * * Since: 3.0.0 */ delay_audio_run_signals[NOTATION_COUNT] = g_signal_new("notation-count", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, notation_count), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::wave-alloc-output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::wave-alloc-output signal is emited while allocating * wave output. * * Since: 3.0.0 */ delay_audio_run_signals[WAVE_ALLOC_OUTPUT] = g_signal_new("wave-alloc-output", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, wave_alloc_output), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::wave-alloc-input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::wave-alloc-input signal is emited while allocating * wave input. * * Since: 3.0.0 */ delay_audio_run_signals[WAVE_ALLOC_INPUT] = g_signal_new("wave-alloc-input", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, wave_alloc_input), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::wave-count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::wave-count signal is emited while counting * wave. * * Since: 3.0.0 */ delay_audio_run_signals[WAVE_COUNT] = g_signal_new("wave-count", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, wave_count), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::midi-alloc-output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::midi-alloc-output signal is emited while allocating * midi output. * * Since: 3.0.0 */ delay_audio_run_signals[MIDI_ALLOC_OUTPUT] = g_signal_new("midi-alloc-output", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, midi_alloc_output), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::midi-alloc-input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::midi-alloc-input signal is emited while allocating * midi input. * * Since: 3.0.0 */ delay_audio_run_signals[MIDI_ALLOC_INPUT] = g_signal_new("midi-alloc-input", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, midi_alloc_input), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); /** * AgsDelayAudioRun::midi-count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * The ::midi-count signal is emited while counting * midi. * * Since: 3.0.0 */ delay_audio_run_signals[MIDI_COUNT] = g_signal_new("midi-count", G_TYPE_FROM_CLASS(delay_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDelayAudioRunClass, midi_count), NULL, NULL, ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_UINT); } void ags_delay_audio_run_init(AgsDelayAudioRun *delay_audio_run) { ags_recall_set_ability_flags((AgsRecall *) delay_audio_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(delay_audio_run)->behaviour_flags |= AGS_SOUND_BEHAVIOUR_PERSISTENT; AGS_RECALL(delay_audio_run)->name = "ags-delay"; AGS_RECALL(delay_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(delay_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(delay_audio_run)->xml_type = "ags-delay-audio-run"; AGS_RECALL(delay_audio_run)->port = NULL; delay_audio_run->dependency_ref = 0; delay_audio_run->hide_ref = 0; delay_audio_run->hide_ref_counter = 0; delay_audio_run->sequencer_counter = 0.0; delay_audio_run->notation_counter = 0.0; delay_audio_run->wave_counter = 0.0; delay_audio_run->midi_counter = 0.0; } void ags_delay_audio_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_delay_audio_run_parent_class)->finalize(gobject); } void ags_delay_audio_run_run_init_pre(AgsRecall *recall) { AgsDelayAudioRun *delay_audio_run; gdouble absolute_delay; void (*parent_class_run_init_pre)(AgsRecall *recall); GRecMutex *recall_mutex; delay_audio_run = AGS_DELAY_AUDIO_RUN(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_delay_audio_run_parent_class)->run_init_pre; /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* call parent class */ parent_class_run_init_pre(recall); /* run order */ absolute_delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(recall->output_soundcard)); g_rec_mutex_lock(recall_mutex); delay_audio_run->hide_ref_counter = 0; delay_audio_run->sequencer_counter = floor(absolute_delay); delay_audio_run->notation_counter = floor(absolute_delay); delay_audio_run->wave_counter = floor(absolute_delay); delay_audio_run->midi_counter = floor(absolute_delay); g_rec_mutex_unlock(recall_mutex); } void ags_delay_audio_run_run_pre(AgsRecall *recall) { AgsRecallID *recall_id; AgsDelayAudio *delay_audio; AgsDelayAudioRun *delay_audio_run; GObject *output_soundcard; guint dependency_ref; guint nth_run; gdouble delay; guint attack; void (*parent_class_run_pre)(AgsRecall *recall); GRecMutex *recall_mutex; delay_audio_run = AGS_DELAY_AUDIO_RUN(recall); /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_delay_audio_run_parent_class)->run_pre; /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* call parent */ parent_class_run_pre(recall); // g_message("ags_delay_audio_run_run_pre()"); /* check done */ g_rec_mutex_lock(recall_mutex); dependency_ref = delay_audio_run->dependency_ref; g_rec_mutex_unlock(recall_mutex); if(!ags_recall_test_behaviour_flags(recall, AGS_SOUND_BEHAVIOUR_PERSISTENT) && dependency_ref == 0){ g_rec_mutex_lock(recall_mutex); delay_audio_run->sequencer_counter = 0.0; delay_audio_run->notation_counter = 0.0; delay_audio_run->wave_counter = 0.0; delay_audio_run->midi_counter = 0.0; g_rec_mutex_unlock(recall_mutex); ags_recall_done(recall); return; } g_object_get(delay_audio_run, "output-soundcard", &output_soundcard, "recall-id", &recall_id, "recall-audio", &delay_audio, NULL); nth_run = 0; attack = ags_soundcard_get_attack(AGS_SOUNDCARD(output_soundcard)); /* sequencer scope */ if(ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_SEQUENCER)){ AgsPort *sequencer_delay; gdouble current_delay; gdouble sequencer_counter; gboolean alloc_sequencer; GValue value = { 0, }; g_object_get(delay_audio, "sequencer-delay", &sequencer_delay, NULL); /* read sequencer delay port */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(sequencer_delay, &value); current_delay = g_value_get_double(&value); g_value_unset(&value); g_object_unref(sequencer_delay); /* counter */ alloc_sequencer = FALSE; g_rec_mutex_lock(recall_mutex); if(delay_audio_run->sequencer_counter + 1.0 >= current_delay){ alloc_sequencer = TRUE; delay_audio_run->sequencer_counter = delay_audio_run->sequencer_counter + 1.0 - current_delay; }else{ delay_audio_run->sequencer_counter += 1.0; } sequencer_counter = delay_audio_run->sequencer_counter; g_rec_mutex_unlock(recall_mutex); /* sequencer */ if(alloc_sequencer){ delay = 0.0; /* sequencer speed */ ags_delay_audio_run_sequencer_alloc_output(delay_audio_run, nth_run, delay, 0); ags_delay_audio_run_sequencer_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_sequencer_count(delay_audio_run, nth_run, delay, attack); }else{ delay = (gdouble) delay_audio_run->sequencer_counter; attack = 0; /* sequencer speed */ ags_delay_audio_run_sequencer_alloc_output(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_sequencer_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_sequencer_count(delay_audio_run, nth_run, delay, attack); } } /* notation scope */ if(ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_NOTATION)){ AgsPort *notation_delay; gdouble current_delay; guint notation_counter; gboolean alloc_notation; GValue value = { 0, }; g_object_get(delay_audio, "notation-delay", ¬ation_delay, NULL); /* read notation delay port */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(notation_delay, &value); current_delay = g_value_get_double(&value); g_value_unset(&value); g_object_unref(notation_delay); /* counter */ alloc_notation = FALSE; g_rec_mutex_lock(recall_mutex); if(delay_audio_run->notation_counter + 1.0 >= current_delay){ alloc_notation = TRUE; delay_audio_run->notation_counter = delay_audio_run->notation_counter + 1.0 - current_delay; }else{ delay_audio_run->notation_counter += 1.0; } notation_counter = delay_audio_run->notation_counter; g_rec_mutex_unlock(recall_mutex); /* notation */ if(alloc_notation){ delay = 0.0; /* notation speed */ ags_delay_audio_run_notation_alloc_output(delay_audio_run, nth_run, delay, 0); ags_delay_audio_run_notation_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_notation_count(delay_audio_run, nth_run, delay, attack); }else{ delay = (gdouble) delay_audio_run->notation_counter; attack = 0; /* notation speed */ ags_delay_audio_run_notation_alloc_output(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_notation_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_notation_count(delay_audio_run, nth_run, delay, attack); } } /* wave scope */ if(ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_WAVE)){ AgsPort *wave_delay; gdouble current_delay; guint wave_counter; gboolean alloc_wave; GValue value = { 0, }; g_object_get(delay_audio, "wave-delay", &wave_delay, NULL); /* read wave delay port */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(wave_delay, &value); current_delay = g_value_get_double(&value); g_value_unset(&value); g_object_unref(wave_delay); /* counter */ alloc_wave = FALSE; g_rec_mutex_lock(recall_mutex); if(delay_audio_run->wave_counter + 1.0 >= current_delay){ alloc_wave = TRUE; delay_audio_run->wave_counter = delay_audio_run->wave_counter + 1.0 - current_delay; }else{ delay_audio_run->wave_counter += 1.0; } wave_counter = delay_audio_run->wave_counter; g_rec_mutex_unlock(recall_mutex); /* wave */ if(alloc_wave){ delay = 0.0; /* wave speed */ ags_delay_audio_run_wave_alloc_output(delay_audio_run, nth_run, delay, 0); ags_delay_audio_run_wave_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_wave_count(delay_audio_run, nth_run, delay, attack); }else{ delay = (gdouble) delay_audio_run->wave_counter; attack = 0; /* wave speed */ ags_delay_audio_run_wave_alloc_output(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_wave_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_wave_count(delay_audio_run, nth_run, delay, attack); } } /* midi scope */ if(ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_MIDI)){ AgsPort *midi_delay; gdouble current_delay; guint midi_counter; gboolean alloc_midi; GValue value = { 0, }; g_object_get(delay_audio, "midi-delay", &midi_delay, NULL); /* read midi delay port */ g_value_init(&value, G_TYPE_DOUBLE); ags_port_safe_read(midi_delay, &value); current_delay = g_value_get_double(&value); g_value_unset(&value); g_object_unref(midi_delay); /* counter */ alloc_midi = FALSE; g_rec_mutex_lock(recall_mutex); if(delay_audio_run->midi_counter + 1.0 >= current_delay){ alloc_midi = TRUE; delay_audio_run->midi_counter = delay_audio_run->midi_counter + 1.0 - current_delay; }else{ delay_audio_run->midi_counter += 1.0; } midi_counter = delay_audio_run->midi_counter; g_rec_mutex_unlock(recall_mutex); /* midi */ if(alloc_midi){ delay = 0.0; /* midi speed */ ags_delay_audio_run_midi_alloc_output(delay_audio_run, nth_run, delay, 0); ags_delay_audio_run_midi_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_midi_count(delay_audio_run, nth_run, delay, attack); }else{ delay = (gdouble) delay_audio_run->midi_counter; attack = 0; /* midi speed */ ags_delay_audio_run_midi_alloc_output(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_midi_alloc_input(delay_audio_run, nth_run, delay, attack); ags_delay_audio_run_midi_count(delay_audio_run, nth_run, delay, attack); } } g_object_unref(output_soundcard); g_object_unref(recall_id); g_object_unref(delay_audio); } AgsRecall* ags_delay_audio_run_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsDelayAudioRun *delay_audio_run, *copy_delay_audio_run; AgsRecall* (*parent_class_duplicate)(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); GRecMutex *recall_mutex; delay_audio_run = (AgsDelayAudioRun *) recall; /* get parent class */ parent_class_duplicate = AGS_RECALL_CLASS(ags_delay_audio_run_parent_class)->duplicate; /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* duplicate */ copy_delay_audio_run = (AgsDelayAudioRun *) parent_class_duplicate(recall, recall_id, n_params, parameter_name, value); /* initial values copied */ g_rec_mutex_lock(recall_mutex); copy_delay_audio_run->dependency_ref = delay_audio_run->dependency_ref; copy_delay_audio_run->hide_ref = delay_audio_run->hide_ref; // copy_delay_audio_run->hide_ref_counter = delay_audio_run->hide_ref_counter; //TODO:JK: may be you want to make a AgsRecallDependency, but a AgsCountable isn't a AgsRecall at all copy_delay_audio_run->sequencer_counter = delay_audio_run->sequencer_counter; copy_delay_audio_run->notation_counter = delay_audio_run->notation_counter; copy_delay_audio_run->wave_counter = delay_audio_run->wave_counter; copy_delay_audio_run->midi_counter = delay_audio_run->midi_counter; g_rec_mutex_unlock(recall_mutex); return((AgsRecall *) copy_delay_audio_run); } void ags_delay_audio_run_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase) { AgsDelayAudioRun *delay_audio_run; GRecMutex *recall_mutex; delay_audio_run = AGS_DELAY_AUDIO_RUN(recall); /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* notify */ g_rec_mutex_lock(recall_mutex); switch(dependency){ case AGS_RECALL_NOTIFY_RUN: if(increase){ delay_audio_run->hide_ref += 1; }else{ delay_audio_run->hide_ref -= 1; } // g_message("delay_audio_run->hide_ref: %u\n", delay_audio_run->hide_ref); break; case AGS_RECALL_NOTIFY_AUDIO: break; case AGS_RECALL_NOTIFY_AUDIO_RUN: break; case AGS_RECALL_NOTIFY_CHANNEL: break; case AGS_RECALL_NOTIFY_CHANNEL_RUN: if(increase){ delay_audio_run->dependency_ref += 1; }else{ delay_audio_run->dependency_ref -= 1; } break; default: g_message("ags_delay_audio_run.c - ags_delay_audio_run_notify: unknown notify"); } g_rec_mutex_unlock(recall_mutex); } /** * ags_delay_audio_run_notation_alloc_output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as notation allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_notation_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[NOTATION_ALLOC_OUTPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_notation_alloc_input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as notation allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_notation_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[NOTATION_ALLOC_INPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_notation_count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as notation counts. * * Since: 3.0.0 */ void ags_delay_audio_run_notation_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[NOTATION_COUNT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_sequencer_alloc_output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as sequencer allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_sequencer_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[SEQUENCER_ALLOC_OUTPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_sequencer_alloc_input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as sequencer allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_sequencer_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[SEQUENCER_ALLOC_INPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_sequencer_count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as sequencer counts. * * Since: 3.0.0 */ void ags_delay_audio_run_sequencer_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[SEQUENCER_COUNT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_wave_alloc_output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as wave allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_wave_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[WAVE_ALLOC_OUTPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_wave_alloc_input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as wave allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_wave_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[WAVE_ALLOC_INPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_wave_count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as wave counts. * * Since: 3.0.0 */ void ags_delay_audio_run_wave_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[WAVE_COUNT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_midi_alloc_output: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as midi allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_midi_alloc_output(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[MIDI_ALLOC_OUTPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_midi_alloc_input: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as midi allocs output. * * Since: 3.0.0 */ void ags_delay_audio_run_midi_alloc_input(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[MIDI_ALLOC_INPUT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_midi_count: * @delay_audio_run: the #AgsDelayAudioRun * @nth_run: the nth run * @delay: the delay * @attack: the attack * * Emitted as midi counts. * * Since: 3.0.0 */ void ags_delay_audio_run_midi_count(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack) { g_return_if_fail(AGS_IS_DELAY_AUDIO_RUN(delay_audio_run)); g_object_ref(G_OBJECT(delay_audio_run)); g_signal_emit(G_OBJECT(delay_audio_run), delay_audio_run_signals[MIDI_COUNT], 0, nth_run, delay, attack); g_object_unref(G_OBJECT(delay_audio_run)); } /** * ags_delay_audio_run_new: * @audio: the #AgsAudio * * Create a new instance of #AgsDelayAudioRun * * Returns: the new #AgsDelayAudioRun * * Since: 3.0.0 */ AgsDelayAudioRun* ags_delay_audio_run_new(AgsAudio *audio) { AgsDelayAudioRun *delay_audio_run; delay_audio_run = (AgsDelayAudioRun *) g_object_new(AGS_TYPE_DELAY_AUDIO_RUN, "audio", audio, NULL); return(delay_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_count_beats_audio_run.c0000644000175000017500000021331213607210263021270 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_count_beats_audio_run_class_init(AgsCountBeatsAudioRunClass *count_beats_audio_run); void ags_count_beats_audio_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_count_beats_audio_run_seekable_interface_init(AgsSeekableInterface *seekable); void ags_count_beats_audio_run_countable_interface_init(AgsCountableInterface *countable); void ags_count_beats_audio_run_tactable_interface_init(AgsTactableInterface *tactable); void ags_count_beats_audio_run_init(AgsCountBeatsAudioRun *count_beats_audio_run); void ags_count_beats_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_count_beats_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_count_beats_audio_run_dispose(GObject *gobject); void ags_count_beats_audio_run_finalize(GObject *gobject); void ags_count_beats_audio_run_connect(AgsConnectable *connectable); void ags_count_beats_audio_run_disconnect(AgsConnectable *connectable); void ags_count_beats_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_count_beats_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection); void ags_count_beats_audio_run_seek(AgsSeekable *seekable, gint64 offset, guint whence); guint64 ags_count_beats_audio_run_get_sequencer_counter(AgsCountable *countable); guint64 ags_count_beats_audio_run_get_notation_counter(AgsCountable *countable); guint64 ags_count_beats_audio_run_get_wave_counter(AgsCountable *countable); guint64 ags_count_beats_audio_run_get_midi_counter(AgsCountable *countable); void ags_count_beats_audio_run_notify_output_soundcard_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_count_beats_audio_run_resolve_dependency(AgsRecall *recall); void ags_count_beats_audio_run_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase); void ags_count_beats_audio_run_run_init_pre(AgsRecall *recall); void ags_count_beats_audio_run_done(AgsRecall *recall); gdouble ags_count_beats_audio_run_get_bpm(AgsTactable *tactable); gdouble ags_count_beats_audio_run_get_tact(AgsTactable *tactable); void ags_count_beats_audio_run_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm); void ags_count_beats_audio_run_change_tact(AgsTactable *tactable, gdouble new_tact, gdouble old_tact); void ags_count_beats_audio_run_notation_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run); void ags_count_beats_audio_run_notation_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run); void ags_count_beats_audio_run_sequencer_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run); void ags_count_beats_audio_run_sequencer_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run); void ags_count_beats_audio_run_wave_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run); void ags_count_beats_audio_run_wave_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run); /** * SECTION:ags_count_beats_audio_run * @short_description: count beats * @title: AgsCountBeatsAudioRun * @section_id: * @include: ags/audio/recall/ags_count_beats_audio_run.h * * The #AgsCountBeatsAudioRun class count beats. */ enum{ SEQUENCER_LOOP, SEQUENCER_START, SEQUENCER_STOP, NOTATION_LOOP, NOTATION_START, NOTATION_STOP, WAVE_LOOP, WAVE_START, WAVE_STOP, MIDI_LOOP, MIDI_START, MIDI_STOP, LAST_SIGNAL, }; enum{ PROP_0, PROP_DELAY_AUDIO_RUN, PROP_NOTATION_COUNTER, PROP_SEQUENCER_COUNTER, PROP_WAVE_COUNTER, PROP_MIDI_COUNTER, }; static gpointer ags_count_beats_audio_run_parent_class = NULL; static AgsConnectableInterface* ags_count_beats_audio_run_parent_connectable_interface; static guint count_beats_audio_run_signals[LAST_SIGNAL]; GType ags_count_beats_audio_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_count_beats_audio_run = 0; static const GTypeInfo ags_count_beats_audio_run_info = { sizeof (AgsCountBeatsAudioRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_count_beats_audio_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCountBeatsAudioRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_count_beats_audio_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_count_beats_audio_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_seekable_interface_info = { (GInterfaceInitFunc) ags_count_beats_audio_run_seekable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_countable_interface_info = { (GInterfaceInitFunc) ags_count_beats_audio_run_countable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_tactable_interface_info = { (GInterfaceInitFunc) ags_count_beats_audio_run_tactable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_count_beats_audio_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_RUN, "AgsCountBeatsAudioRun", &ags_count_beats_audio_run_info, 0); g_type_add_interface_static(ags_type_count_beats_audio_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_count_beats_audio_run, AGS_TYPE_COUNTABLE, &ags_countable_interface_info); g_type_add_interface_static(ags_type_count_beats_audio_run, AGS_TYPE_SEEKABLE, &ags_seekable_interface_info); g_type_add_interface_static(ags_type_count_beats_audio_run, AGS_TYPE_TACTABLE, &ags_tactable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_count_beats_audio_run); } return g_define_type_id__volatile; } void ags_count_beats_audio_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_count_beats_audio_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_count_beats_audio_run_connect; connectable->disconnect = ags_count_beats_audio_run_disconnect; connectable->connect_connection = ags_count_beats_audio_run_connect_connection; connectable->disconnect_connection = ags_count_beats_audio_run_disconnect_connection; } void ags_count_beats_audio_run_seekable_interface_init(AgsSeekableInterface *seekable) { seekable->seek = ags_count_beats_audio_run_seek; } void ags_count_beats_audio_run_countable_interface_init(AgsCountableInterface *countable) { countable->get_sequencer_counter = ags_count_beats_audio_run_get_sequencer_counter; countable->get_notation_counter = ags_count_beats_audio_run_get_notation_counter; countable->get_wave_counter = ags_count_beats_audio_run_get_wave_counter; countable->get_midi_counter = ags_count_beats_audio_run_get_midi_counter; } void ags_count_beats_audio_run_tactable_interface_init(AgsTactableInterface *tactable) { tactable->get_bpm = ags_count_beats_audio_run_get_bpm; tactable->get_tact = ags_count_beats_audio_run_get_tact; tactable->get_sequencer_duration = NULL; tactable->get_notation_duration = NULL; tactable->get_wave_duration = NULL; tactable->get_midi_duration = NULL; tactable->change_sequencer_duration = NULL; tactable->change_notation_duration = NULL; tactable->change_wave_duration = NULL; tactable->change_midi_duration = NULL; tactable->change_bpm = ags_count_beats_audio_run_change_bpm; tactable->change_tact = ags_count_beats_audio_run_change_tact; } void ags_count_beats_audio_run_class_init(AgsCountBeatsAudioRunClass *count_beats_audio_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_count_beats_audio_run_parent_class = g_type_class_peek_parent(count_beats_audio_run); /* GObjectClass */ gobject = (GObjectClass *) count_beats_audio_run; gobject->set_property = ags_count_beats_audio_run_set_property; gobject->get_property = ags_count_beats_audio_run_get_property; gobject->dispose = ags_count_beats_audio_run_dispose; gobject->finalize = ags_count_beats_audio_run_finalize; /* properties */ /** * AgsCountBeatsAudioRun:delay-audio-run: * * The assigned #AgsDelayAudioRun dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("delay-audio-run", i18n_pspec("assigned AgsDelayAudioRun"), i18n_pspec("The AgsDelayAudioRun which emits sequencer_alloc_output sequencer_count signal"), AGS_TYPE_DELAY_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_AUDIO_RUN, param_spec); /** * AgsCountBeatsAudioRun:sequencer-counter: * * The sequencer counter. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("sequencer-counter", i18n_pspec("sequencer counter indicates offset"), i18n_pspec("The sequenecer counter indicates the offset in the sequencer"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_COUNTER, param_spec); /** * AgsCountBeatsAudioRun:notation-counter: * * The notation counter. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("notation-counter", i18n_pspec("notation counter indicates offset"), i18n_pspec("The notation counter indicates the offset in the notation"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION_COUNTER, param_spec); /** * AgsCountBeatsAudioRun:wave-counter: * * The wave counter. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("wave-counter", i18n_pspec("wave counter indicates offset"), i18n_pspec("The sequenecer counter indicates the offset in the wave"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE_COUNTER, param_spec); /** * AgsCountBeatsAudioRun:midi-counter: * * The midi counter. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("midi-counter", i18n_pspec("midi counter indicates offset"), i18n_pspec("The sequenecer counter indicates the offset in the midi"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_COUNTER, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) count_beats_audio_run; recall->resolve_dependency = ags_count_beats_audio_run_resolve_dependency; recall->notify_dependency = ags_count_beats_audio_run_notify_dependency; recall->run_init_pre = ags_count_beats_audio_run_run_init_pre; recall->done = ags_count_beats_audio_run_done; /* AgsCountBeatsAudioRunClass */ count_beats_audio_run->notation_start = NULL; count_beats_audio_run->notation_loop = NULL; count_beats_audio_run->notation_stop = NULL; count_beats_audio_run->sequencer_start = NULL; count_beats_audio_run->sequencer_loop = NULL; count_beats_audio_run->sequencer_stop = NULL; /* signals */ /** * AgsCountBeatsAudioRun::sequencer-start: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::sequencer-start signal is emited while starting sequencer playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[SEQUENCER_START] = g_signal_new("sequencer-start", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, sequencer_start), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::sequencer-loop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::sequencer-loop signal is emited while looping sequencer playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[SEQUENCER_LOOP] = g_signal_new("sequencer-loop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, sequencer_loop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::sequencer-stop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::sequencer-loop signal is emited while stoping sequencer playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[SEQUENCER_STOP] = g_signal_new("sequencer-stop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, sequencer_stop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::notation-start: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::notation-start signal is emited while starting notation playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[NOTATION_START] = g_signal_new("notation-start", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, notation_start), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::notation-loop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::notation-loop signal is emited while looping notation playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[NOTATION_LOOP] = g_signal_new("notation-loop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, notation_loop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::notation-stop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::notation-loop signal is emited while stoping notation playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[NOTATION_STOP] = g_signal_new("notation-stop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, notation_stop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::wave-start: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::wave-start signal is emited while starting wave playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[WAVE_START] = g_signal_new("wave-start", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, wave_start), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::wave-loop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::wave-loop signal is emited while looping wave playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[WAVE_LOOP] = g_signal_new("wave-loop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, wave_loop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::wave-stop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::wave-loop signal is emited while stoping wave playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[WAVE_STOP] = g_signal_new("wave-stop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, wave_stop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::midi-start: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::midi-start signal is emited while starting midi playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[MIDI_START] = g_signal_new("midi-start", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, midi_start), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::midi-loop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::midi-loop signal is emited while looping midi playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[MIDI_LOOP] = g_signal_new("midi-loop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, midi_loop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsCountBeatsAudioRun::midi-stop: * @count_beats_audio_run: the object * @nth_run: the nth run * * The ::midi-loop signal is emited while stoping midi playback. * * Since: 3.0.0 */ count_beats_audio_run_signals[MIDI_STOP] = g_signal_new("midi-stop", G_TYPE_FROM_CLASS(count_beats_audio_run), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsCountBeatsAudioRunClass, midi_stop), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); } void ags_count_beats_audio_run_init(AgsCountBeatsAudioRun *count_beats_audio_run) { ags_recall_set_ability_flags((AgsRecall *) count_beats_audio_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); g_signal_connect_after(count_beats_audio_run, "notify::output-soundcard", G_CALLBACK(ags_count_beats_audio_run_notify_output_soundcard_callback), NULL); AGS_RECALL(count_beats_audio_run)->name = "ags-count-beats"; AGS_RECALL(count_beats_audio_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(count_beats_audio_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(count_beats_audio_run)->xml_type = "ags-count-beats-audio-run"; AGS_RECALL(count_beats_audio_run)->port = NULL; count_beats_audio_run->sequencer_counter = 0; count_beats_audio_run->notation_counter = 0; count_beats_audio_run->wave_counter = 0; count_beats_audio_run->midi_counter = 0; count_beats_audio_run->recall_ref = 0; count_beats_audio_run->hide_ref = 0; count_beats_audio_run->sequencer_hide_ref_counter = 0; count_beats_audio_run->notation_hide_ref_counter = 0; count_beats_audio_run->wave_hide_ref_counter = 0; count_beats_audio_run->midi_hide_ref_counter = 0; count_beats_audio_run->delay_audio_run = NULL; } void ags_count_beats_audio_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCountBeatsAudioRun *count_beats_audio_run; GRecMutex *recall_mutex; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { AgsDelayAudioRun *old_delay_audio_run, *delay_audio_run; gboolean is_template; delay_audio_run = (AgsDelayAudioRun *) g_value_get_object(value); old_delay_audio_run = NULL; g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run->delay_audio_run == delay_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(count_beats_audio_run->delay_audio_run != NULL){ old_delay_audio_run = count_beats_audio_run->delay_audio_run; g_object_unref(G_OBJECT(count_beats_audio_run->delay_audio_run)); } if(delay_audio_run != NULL){ g_object_ref(G_OBJECT(delay_audio_run)); } g_rec_mutex_unlock(recall_mutex); /* check template */ if(delay_audio_run != NULL && ags_recall_test_flags((AgsRecall *) delay_audio_run, AGS_RECALL_TEMPLATE)){ is_template = TRUE; }else{ is_template = FALSE; } /* old - dependency/connection */ if(is_template){ if(old_delay_audio_run != NULL){ AgsRecallDependency *recall_dependency; GList *list; recall_dependency = NULL; list = ags_recall_dependency_find_dependency(AGS_RECALL(count_beats_audio_run)->recall_dependency, (GObject *) old_delay_audio_run); if(list != NULL){ recall_dependency = list->data; } ags_recall_remove_recall_dependency(AGS_RECALL(count_beats_audio_run), recall_dependency); } }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(count_beats_audio_run))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(count_beats_audio_run), (GObject *) old_delay_audio_run); } } /* new - dependency/connection */ g_rec_mutex_lock(recall_mutex); count_beats_audio_run->delay_audio_run = delay_audio_run; g_rec_mutex_unlock(recall_mutex); if(delay_audio_run != NULL){ if(is_template){ ags_recall_add_recall_dependency(AGS_RECALL(count_beats_audio_run), ags_recall_dependency_new((GObject *) delay_audio_run)); }else{ if(ags_connectable_is_connected(AGS_CONNECTABLE(count_beats_audio_run))){ ags_connectable_connect_connection(AGS_CONNECTABLE(count_beats_audio_run), (GObject *) delay_audio_run); } } } } break; case PROP_SEQUENCER_COUNTER: { guint64 counter; counter = g_value_get_uint64(value); g_rec_mutex_lock(recall_mutex); count_beats_audio_run->sequencer_counter = counter; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_COUNTER: { guint64 counter; counter = g_value_get_uint64(value); g_rec_mutex_lock(recall_mutex); count_beats_audio_run->notation_counter = counter; g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_COUNTER: { guint64 counter; counter = g_value_get_uint64(value); g_rec_mutex_lock(recall_mutex); count_beats_audio_run->wave_counter = counter; g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_COUNTER: { guint64 counter; counter = g_value_get_uint64(value); g_rec_mutex_lock(recall_mutex); count_beats_audio_run->midi_counter = counter; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_count_beats_audio_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCountBeatsAudioRun *count_beats_audio_run; GRecMutex *recall_mutex; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); switch(prop_id){ case PROP_DELAY_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, count_beats_audio_run->delay_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SEQUENCER_COUNTER: { g_rec_mutex_lock(recall_mutex); g_value_set_uint64(value, count_beats_audio_run->sequencer_counter); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTATION_COUNTER: { g_rec_mutex_lock(recall_mutex); g_value_set_uint64(value, count_beats_audio_run->notation_counter); g_rec_mutex_unlock(recall_mutex); } break; case PROP_WAVE_COUNTER: { g_rec_mutex_lock(recall_mutex); g_value_set_uint64(value, count_beats_audio_run->wave_counter); g_rec_mutex_unlock(recall_mutex); } break; case PROP_MIDI_COUNTER: { g_rec_mutex_lock(recall_mutex); g_value_set_uint64(value, count_beats_audio_run->midi_counter); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_count_beats_audio_run_dispose(GObject *gobject) { AgsCountBeatsAudioRun *count_beats_audio_run; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(gobject); /* delay audio run */ if(count_beats_audio_run->delay_audio_run != NULL){ g_object_unref(count_beats_audio_run->delay_audio_run); count_beats_audio_run->delay_audio_run = NULL; } /* call parent */ G_OBJECT_CLASS(ags_count_beats_audio_run_parent_class)->dispose(gobject); } void ags_count_beats_audio_run_finalize(GObject *gobject) { AgsCountBeatsAudioRun *count_beats_audio_run; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(gobject); /* delay audio run */ if(count_beats_audio_run->delay_audio_run != NULL){ g_object_unref(count_beats_audio_run->delay_audio_run); } /* call parent */ G_OBJECT_CLASS(ags_count_beats_audio_run_parent_class)->finalize(gobject); } void ags_count_beats_audio_run_connect(AgsConnectable *connectable) { AgsCountBeatsAudioRun *count_beats_audio_run; AgsDelayAudioRun *delay_audio_run; if(ags_connectable_is_connected(connectable)){ return; } ags_count_beats_audio_run_parent_connectable_interface->connect(connectable); count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(connectable); g_object_get(count_beats_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_connect_connection(connectable, (GObject *) delay_audio_run); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_count_beats_audio_run_disconnect(AgsConnectable *connectable) { AgsCountBeatsAudioRun *count_beats_audio_run; AgsDelayAudioRun *delay_audio_run; if(!ags_connectable_is_connected(connectable)){ return; } ags_count_beats_audio_run_parent_connectable_interface->disconnect(connectable); count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(connectable); g_object_get(count_beats_audio_run, "delay-audio-run", &delay_audio_run, NULL); ags_connectable_disconnect_connection(connectable, (GObject *) delay_audio_run); if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_count_beats_audio_run_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsCountBeatsAudioRun *count_beats_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(connectable); g_object_get(count_beats_audio_run, "delay-audio-run", &delay_audio_run, NULL); if((GObject *) delay_audio_run == connection){ g_signal_connect(G_OBJECT(count_beats_audio_run->delay_audio_run), "wave-alloc-output", G_CALLBACK(ags_count_beats_audio_run_wave_alloc_output_callback), count_beats_audio_run); g_signal_connect(G_OBJECT(count_beats_audio_run->delay_audio_run), "wave-count", G_CALLBACK(ags_count_beats_audio_run_wave_count_callback), count_beats_audio_run); g_signal_connect(G_OBJECT(count_beats_audio_run->delay_audio_run), "sequencer-alloc-output", G_CALLBACK(ags_count_beats_audio_run_sequencer_alloc_output_callback), count_beats_audio_run); g_signal_connect(G_OBJECT(count_beats_audio_run->delay_audio_run), "sequencer-count", G_CALLBACK(ags_count_beats_audio_run_sequencer_count_callback), count_beats_audio_run); g_signal_connect(G_OBJECT(count_beats_audio_run->delay_audio_run), "notation-alloc-output", G_CALLBACK(ags_count_beats_audio_run_notation_alloc_output_callback), count_beats_audio_run); g_signal_connect(G_OBJECT(count_beats_audio_run->delay_audio_run), "notation-count", G_CALLBACK(ags_count_beats_audio_run_notation_count_callback), count_beats_audio_run); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_count_beats_audio_run_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsCountBeatsAudioRun *count_beats_audio_run; AgsDelayAudioRun *delay_audio_run; if(connection == NULL){ return; } count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(connectable); g_object_get(count_beats_audio_run, "delay-audio-run", &delay_audio_run, NULL); if((GObject *) delay_audio_run == connection){ g_object_disconnect(delay_audio_run, "any_signal::wave-alloc-output", G_CALLBACK(ags_count_beats_audio_run_wave_alloc_output_callback), count_beats_audio_run, "any_signal::wave-count", G_CALLBACK(ags_count_beats_audio_run_wave_count_callback), count_beats_audio_run, "any_signal::sequencer-alloc-output", G_CALLBACK(ags_count_beats_audio_run_sequencer_alloc_output_callback), count_beats_audio_run, "any_signal::sequencer-count", G_CALLBACK(ags_count_beats_audio_run_sequencer_count_callback), count_beats_audio_run, "any_signal::notation-alloc-output", G_CALLBACK(ags_count_beats_audio_run_notation_alloc_output_callback), count_beats_audio_run, "any_signal::notation-count", G_CALLBACK(ags_count_beats_audio_run_notation_count_callback), count_beats_audio_run, NULL); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } } void ags_count_beats_audio_run_seek(AgsSeekable *seekable, gint64 offset, guint whence) { AgsDelayAudio *delay_audio; AgsDelayAudioRun *delay_audio_run; AgsCountBeatsAudioRun *count_beats_audio_run; AgsPort *sequencer_duration; guint64 duration; GValue value = {0,}; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(seekable); g_object_get(count_beats_audio_run, "delay-audio-run", &delay_audio_run, NULL); g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); /* sequencer */ g_object_get(delay_audio, "sequencer-duration", &sequencer_duration, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(sequencer_duration, &value); duration = g_value_get_uint64(&value); g_value_unset(&value); switch(whence){ case AGS_SEEK_CUR: { guint64 sequencer_counter; guint64 notation_counter; guint64 wave_counter; guint64 midi_counter; g_object_get(count_beats_audio_run, "sequencer-counter", &sequencer_counter, "notation-counter", ¬ation_counter, "wave-counter", &wave_counter, "midi-counter", &midi_counter, NULL); if(sequencer_counter + offset < 0){ sequencer_counter = duration - ((offset - sequencer_counter) % duration); }else{ sequencer_counter = (sequencer_counter + offset) % duration; } if(notation_counter + offset < 0){ notation_counter = 0; } if(wave_counter + offset < 0){ wave_counter = 0; } if(midi_counter + offset < 0){ midi_counter = 0; } g_object_set(count_beats_audio_run, "sequencer-counter", sequencer_counter, "notation-counter", notation_counter, "wave-counter", wave_counter, "midi-counter", midi_counter, NULL); } break; case AGS_SEEK_END: { AgsPort *notation_duration; AgsPort *midi_duration; AgsPort *wave_duration; guint64 sequencer_counter; guint64 notation_counter; guint64 wave_counter; guint64 midi_counter; g_object_get(delay_audio, "notation-duration", ¬ation_duration, "wave-duration", &wave_duration, "midi-duration", &midi_duration, NULL); /* sequencer */ if(duration + offset < 0){ sequencer_counter = duration - ((offset - duration) % duration); }else{ sequencer_counter = (duration + offset) % duration; } /* notation */ g_value_reset(&value); ags_port_safe_read(notation_duration, &value); duration = g_value_get_uint64(&value); if(duration + offset < 0){ notation_counter = 0; }else{ notation_counter = (duration + offset); } /* wave */ g_value_reset(&value); ags_port_safe_read(wave_duration, &value); duration = g_value_get_uint64(&value); if(duration + offset < 0){ wave_counter = 0; }else{ wave_counter = (duration + offset); } /* midi */ g_value_reset(&value); ags_port_safe_read(midi_duration, &value); duration = g_value_get_uint64(&value); if(duration + offset < 0){ midi_counter = 0; }else{ midi_counter = (duration + offset); } g_object_set(count_beats_audio_run, "sequencer-counter", sequencer_counter, "notation-counter", notation_counter, "wave-counter", wave_counter, "midi-counter", midi_counter, NULL); } break; case AGS_SEEK_SET: { guint64 sequencer_counter; g_object_set(count_beats_audio_run, "sequencer-counter", offset % duration, "notation-counter", offset, "wave-counter", offset, "midi-counter", offset, NULL); } break; } g_object_unref(delay_audio_run); g_object_unref(delay_audio); } guint64 ags_count_beats_audio_run_get_sequencer_counter(AgsCountable *countable) { guint64 sequencer_counter; g_object_get(G_OBJECT(countable), "sequencer-counter", &sequencer_counter, NULL); return(sequencer_counter); } guint64 ags_count_beats_audio_run_get_notation_counter(AgsCountable *countable) { guint64 notation_counter; g_object_get(G_OBJECT(countable), "notation-counter", ¬ation_counter, NULL); return(notation_counter); } guint64 ags_count_beats_audio_run_get_wave_counter(AgsCountable *countable) { guint64 wave_counter; g_object_get(G_OBJECT(countable), "wave-counter", &wave_counter, NULL); return(wave_counter); } guint64 ags_count_beats_audio_run_get_midi_counter(AgsCountable *countable) { guint64 midi_counter; g_object_get(G_OBJECT(countable), "midi-counter", &midi_counter, NULL); return(midi_counter); } void ags_count_beats_audio_run_notify_output_soundcard_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsCountBeatsAudioRun *count_beats_audio_run; GObject *output_soundcard; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(gobject); output_soundcard = AGS_RECALL(count_beats_audio_run)->output_soundcard; if(output_soundcard == NULL){ return; } /* bpm */ count_beats_audio_run->bpm = ags_soundcard_get_bpm(AGS_SOUNDCARD(output_soundcard)); /* tact */ count_beats_audio_run->tact = AGS_SOUNDCARD_DEFAULT_TACT; } void ags_count_beats_audio_run_resolve_dependency(AgsRecall *recall) { AgsRecall *template; AgsRecallContainer *recall_container; AgsRecallDependency *recall_dependency; AgsRecallID *recall_id; AgsDelayAudioRun *delay_audio_run; GObject *output_soundcard; GList *list_start, *list; guint i, i_stop; GRecMutex *recall_mutex; g_object_get(recall, "output-soundcard", &output_soundcard, NULL); if(output_soundcard == NULL){ return; } /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* get template */ g_object_get(recall, "recall-id", &recall_id, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); template = NULL; list = ags_recall_find_template(list_start); if(list != NULL){ template = AGS_RECALL(list->data); } g_list_free_full(list_start, g_object_unref); /* check recall dependency */ g_object_get(template, "recall-dependency", &list_start, NULL); delay_audio_run = NULL; list = list_start; i_stop = 1; for(i = 0; i < i_stop && list != NULL;){ GObject *dependency; recall_dependency = AGS_RECALL_DEPENDENCY(list->data); g_object_get(recall_dependency, "dependency", &dependency, NULL); if(AGS_IS_DELAY_AUDIO_RUN(dependency)){ AgsPort *sequencer_duration; AgsDelayAudio *delay_audio; guint note_offset; GValue value = {0,}; delay_audio_run = (AgsDelayAudioRun *) ags_recall_dependency_resolve(recall_dependency, recall_id); if(delay_audio_run != NULL){ delay_audio = NULL; sequencer_duration = NULL; g_object_get(delay_audio_run, "recall-audio", &delay_audio, NULL); note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(output_soundcard)); g_object_get(delay_audio, "sequencer-duration", &sequencer_duration, NULL); g_value_init(&value, G_TYPE_UINT64); ags_port_safe_read(sequencer_duration, &value); g_rec_mutex_lock(recall_mutex); AGS_COUNT_BEATS_AUDIO_RUN(recall)->sequencer_counter = note_offset % g_value_get_uint64(&value); AGS_COUNT_BEATS_AUDIO_RUN(recall)->notation_counter = note_offset; AGS_COUNT_BEATS_AUDIO_RUN(recall)->wave_counter = note_offset; AGS_COUNT_BEATS_AUDIO_RUN(recall)->midi_counter = note_offset; g_rec_mutex_unlock(recall_mutex); g_value_unset(&value); /* unref */ g_object_unref(sequencer_duration); g_object_unref(delay_audio); } i++; } g_object_unref(dependency); list = list->next; } g_object_set(G_OBJECT(recall), "delay-audio-run", delay_audio_run, NULL); /* unref */ g_object_unref(recall_id); g_object_unref(recall_container); g_list_free_full(list_start, g_object_unref); } void ags_count_beats_audio_run_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase) { AgsCountBeatsAudioRun *count_beats_audio_run; GRecMutex *recall_mutex; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall); /* get mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* notify */ g_rec_mutex_lock(recall_mutex); switch(dependency){ case AGS_RECALL_NOTIFY_RUN: if(increase){ count_beats_audio_run->hide_ref += 1; }else{ count_beats_audio_run->hide_ref -= 1; } // g_message("count_beats_audio_run->hide_ref: %u\n", count_beats_audio_run->hide_ref); break; case AGS_RECALL_NOTIFY_AUDIO: break; case AGS_RECALL_NOTIFY_AUDIO_RUN: break; case AGS_RECALL_NOTIFY_CHANNEL: break; case AGS_RECALL_NOTIFY_CHANNEL_RUN: if(increase){ count_beats_audio_run->recall_ref += 1; }else{ count_beats_audio_run->recall_ref -= 1; } break; default: g_message("ags_count_beats_audio_run.c - ags_count_beats_audio_run_notify: unknown notify"); } g_rec_mutex_unlock(recall_mutex); } void ags_count_beats_audio_run_run_init_pre(AgsRecall *recall) { AgsCountBeatsAudioRun *count_beats_audio_run; void (*parent_class_run_init_pre)(AgsRecall *recall); GRecMutex *recall_mutex; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall); /* get parent class */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_count_beats_audio_run_parent_class)->run_init_pre; /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* call parent */ parent_class_run_init_pre(recall); /* basic initialization */ g_rec_mutex_lock(recall_mutex); count_beats_audio_run->first_run = TRUE; count_beats_audio_run->sequencer_hide_ref_counter = 0; count_beats_audio_run->notation_hide_ref_counter = 0; count_beats_audio_run->wave_hide_ref_counter = 0; count_beats_audio_run->midi_hide_ref_counter = 0; g_rec_mutex_unlock(recall_mutex); } void ags_count_beats_audio_run_done(AgsRecall *recall) { AgsAudio *audio; AgsRecallID *recall_id; AgsCountBeatsAudio *count_beats_audio; AgsCountBeatsAudioRun *count_beats_audio_run; AgsDelayAudioRun *delay_audio_run; AgsCancelAudio *cancel_audio; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; void (*parent_class_done)(AgsRecall *recall); count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall); /* get parent class */ parent_class_done = AGS_RECALL_CLASS(ags_count_beats_audio_run_parent_class)->done; g_object_get(count_beats_audio_run, "audio", &audio, "recall-audio", &count_beats_audio, "recall-id", &recall_id, "delay-audio-run", &delay_audio_run, NULL); /* get application_context */ application_context = ags_application_context_get_instance(); /* get task thread */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); if(audio != NULL){ /* create cancel task */ cancel_audio = ags_cancel_audio_new(audio, AGS_SOUND_SCOPE_SEQUENCER); /* append AgsCancelAudio */ ags_task_launcher_add_task(task_launcher, (AgsTask *) cancel_audio); } /* call parent */ parent_class_done(recall); /* chained events */ if(delay_audio_run != NULL){ ags_recall_done((AgsRecall *) delay_audio_run); } if(audio != NULL && recall_id != NULL){ ags_audio_done_recall(audio, recall_id); } /* unref */ if(audio != NULL){ g_object_unref(audio); } if(count_beats_audio != NULL){ g_object_unref(count_beats_audio); } if(recall_id != NULL){ g_object_unref(recall_id); } if(delay_audio_run != NULL){ g_object_unref(delay_audio_run); } g_object_unref(task_launcher); } /** * ags_count_beats_audio_run_sequencer_start: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as sequencer starts playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_sequencer_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[SEQUENCER_START], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_sequencer_loop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as sequencer loops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_sequencer_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[SEQUENCER_LOOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_sequencer_stop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as sequencer stops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_sequencer_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[SEQUENCER_STOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_notation_start: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as notation starts playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_notation_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[NOTATION_START], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_notation_loop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as notation loops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_notation_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[NOTATION_LOOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_notation_stop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as notation stops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_notation_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[NOTATION_STOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_wave_start: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as wave starts playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_wave_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[WAVE_START], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_wave_loop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as wave loops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_wave_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[WAVE_LOOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_wave_stop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as wave stops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_wave_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[WAVE_STOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_midi_start: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as midi starts playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_midi_start(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[MIDI_START], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_midi_loop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as midi loops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_midi_loop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[MIDI_LOOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } /** * ags_count_beats_audio_run_midi_stop: * @count_beats_audio_run: the #AgsCountBeatsAudioRun * @nth_run: the nth run order * * Emitted as midi stops playback. * * Since: 3.0.0 */ void ags_count_beats_audio_run_midi_stop(AgsCountBeatsAudioRun *count_beats_audio_run, guint nth_run) { g_return_if_fail(AGS_IS_COUNT_BEATS_AUDIO_RUN(count_beats_audio_run)); g_object_ref(G_OBJECT(count_beats_audio_run)); g_signal_emit(G_OBJECT(count_beats_audio_run), count_beats_audio_run_signals[MIDI_STOP], 0, nth_run); g_object_unref(G_OBJECT(count_beats_audio_run)); } void ags_count_beats_audio_run_sequencer_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsRecallID *recall_id; AgsPort *sequencer_loop; AgsCountBeatsAudio *count_beats_audio; guint64 sequencer_counter; gboolean first_run; gboolean do_loop; GValue loop_value = {0,}; GRecMutex *recall_mutex; g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_SEQUENCER)){ g_object_unref(recall_id); return; } g_object_get(count_beats_audio_run, "recall-audio", &count_beats_audio, NULL); /* loop */ g_object_get(count_beats_audio, "sequencer-loop", &sequencer_loop, NULL); g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(sequencer_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(sequencer_loop); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_rec_mutex_lock(recall_mutex); sequencer_counter = count_beats_audio_run->sequencer_counter; first_run = count_beats_audio_run->first_run; g_rec_mutex_unlock(recall_mutex); /* start */ if(first_run){ // g_message("ags_count_beats_audio_run_sequencer_alloc_output_callback: start\n"); ags_count_beats_audio_run_sequencer_start(count_beats_audio_run, nth_run); } /* loop */ if(!first_run && sequencer_counter == 0){ /* emit sequencer signals */ if(do_loop){ // g_message("ags_count_beats_audio_run_sequencer_alloc_output_callback: loop\n"); ags_count_beats_audio_run_sequencer_loop(count_beats_audio_run, nth_run); } } /* unref */ g_object_unref(recall_id); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_notation_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsRecallID *recall_id; AgsPort *notation_loop; AgsCountBeatsAudio *count_beats_audio; guint64 notation_counter; gboolean first_run; gboolean do_loop; GValue loop_value = {0,}; GRecMutex *recall_mutex; g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_NOTATION)){ g_object_unref(recall_id); return; } g_object_get(count_beats_audio_run, "recall-audio", &count_beats_audio, NULL); /* loop */ g_object_get(count_beats_audio, "notation-loop", ¬ation_loop, NULL); g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(notation_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(notation_loop); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_rec_mutex_lock(recall_mutex); notation_counter = count_beats_audio_run->notation_counter; first_run = count_beats_audio_run->first_run; g_rec_mutex_unlock(recall_mutex); /* start */ if(first_run){ // g_message("ags_count_beats_audio_run_sequencer_alloc_output_callback: start\n"); ags_count_beats_audio_run_notation_start(count_beats_audio_run, nth_run); } /* loop */ if(!first_run && notation_counter == 0){ /* emit notation signals */ if(do_loop){ // g_message("ags_count_beats_audio_run_notation_alloc_output_callback: loop\n"); ags_count_beats_audio_run_notation_loop(count_beats_audio_run, nth_run); } } /* unref */ g_object_unref(recall_id); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_wave_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsRecallID *recall_id; AgsPort *wave_loop; AgsCountBeatsAudio *count_beats_audio; guint64 wave_counter; gboolean first_run; gboolean do_loop; GValue loop_value = {0,}; GRecMutex *recall_mutex; g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_WAVE)){ g_object_unref(recall_id); return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_object_get(count_beats_audio_run, "recall-audio", &count_beats_audio, NULL); /* loop */ g_object_get(count_beats_audio, "wave-loop", &wave_loop, NULL); g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(wave_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(wave_loop); /* get some fields */ g_rec_mutex_lock(recall_mutex); wave_counter = count_beats_audio_run->wave_counter; first_run = count_beats_audio_run->first_run; g_rec_mutex_unlock(recall_mutex); /* start */ if(first_run){ // g_message("ags_count_beats_audio_run_sequencer_alloc_output_callback: start\n"); ags_count_beats_audio_run_wave_start(count_beats_audio_run, nth_run); } /* loop */ if(!first_run && wave_counter == 0){ /* emit wave signals */ if(do_loop){ // g_message("ags_count_beats_audio_run_wave_alloc_output_callback: loop\n"); ags_count_beats_audio_run_wave_loop(count_beats_audio_run, nth_run); } } /* unref */ g_object_unref(recall_id); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_midi_alloc_output_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsRecallID *recall_id; AgsPort *midi_loop; AgsCountBeatsAudio *count_beats_audio; guint64 midi_counter; gboolean first_run; gboolean do_loop; GValue loop_value = {0,}; GRecMutex *recall_mutex; g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_MIDI)){ g_object_unref(recall_id); return; } g_object_get(count_beats_audio_run, "recall-audio", &count_beats_audio, NULL); /* loop */ g_object_get(count_beats_audio, "midi-loop", &midi_loop, NULL); g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(midi_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(midi_loop); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_rec_mutex_lock(recall_mutex); midi_counter = count_beats_audio_run->midi_counter; first_run = count_beats_audio_run->first_run; g_rec_mutex_unlock(recall_mutex); /* start */ if(first_run){ // g_message("ags_count_beats_audio_run_sequencer_alloc_output_callback: start\n"); ags_count_beats_audio_run_midi_start(count_beats_audio_run, nth_run); } /* loop */ if(!first_run && midi_counter == 0){ /* emit midi signals */ if(do_loop){ // g_message("ags_count_beats_audio_run_midi_alloc_output_callback: loop\n"); ags_count_beats_audio_run_midi_loop(count_beats_audio_run, nth_run); } } /* unref */ g_object_unref(recall_id); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_sequencer_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsAudio *audio; AgsRecallID *recall_id; AgsPort *sequencer_loop; AgsPort *sequencer_loop_start; AgsPort *sequencer_loop_end; AgsCountBeatsAudio *count_beats_audio; gboolean loop; guint64 loop_start, loop_end; gboolean do_loop; gboolean is_done; GValue loop_value = {0,}; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; GRecMutex *recall_mutex; if(delay != 0.0){ return; } g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_SEQUENCER)){ g_object_unref(recall_id); return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_object_get(count_beats_audio_run, "audio", &audio, "recall-audio", &count_beats_audio, NULL); g_object_get(count_beats_audio, "sequencer-loop", &sequencer_loop, "sequencer-loop-start", &sequencer_loop_start, "sequencer-loop-end", &sequencer_loop_end, NULL); /* loop */ g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(sequencer_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(sequencer_loop); /* loop start */ g_value_init(&loop_start_value, G_TYPE_UINT64); ags_port_safe_read(sequencer_loop_start, &loop_start_value); loop_start = g_value_get_uint64(&loop_start_value); g_value_unset(&loop_start_value); g_object_unref(sequencer_loop_start); /* loop end */ g_value_init(&loop_end_value, G_TYPE_UINT64); ags_port_safe_read(sequencer_loop_end, &loop_end_value); loop_end = g_value_get_uint64(&loop_end_value); g_value_unset(&loop_end_value); g_object_unref(sequencer_loop_end); /* count */ g_rec_mutex_lock(recall_mutex); is_done = FALSE; if(count_beats_audio_run->first_run){ count_beats_audio_run->first_run = FALSE; } if(do_loop){ if(count_beats_audio_run->sequencer_counter >= (guint) loop_end - 1.0){ count_beats_audio_run->sequencer_counter = loop_start; }else{ count_beats_audio_run->sequencer_counter += 1; } }else{ if(count_beats_audio_run->sequencer_counter >= (guint) loop_end - 1.0){ count_beats_audio_run->sequencer_counter = 0; is_done = TRUE; }else{ count_beats_audio_run->sequencer_counter += 1; } } g_rec_mutex_unlock(recall_mutex); if(is_done){ /* reset sequencer counter */ g_rec_mutex_lock(recall_mutex); count_beats_audio_run->sequencer_counter = 0; g_rec_mutex_unlock(recall_mutex); /* emit done */ ags_recall_done((AgsRecall *) count_beats_audio_run); } /* unref */ g_object_unref(recall_id); g_object_unref(audio); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_notation_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsAudio *audio; AgsRecallID *recall_id; AgsPort *notation_loop; AgsPort *notation_loop_start; AgsPort *notation_loop_end; AgsCountBeatsAudio *count_beats_audio; guint64 loop_start, loop_end; gboolean do_loop; GValue loop_value = {0,}; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; GRecMutex *recall_mutex; if(delay != 0.0){ return; } g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_NOTATION)){ g_object_unref(recall_id); return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_object_get(count_beats_audio_run, "audio", &audio, "recall-audio", &count_beats_audio, NULL); g_object_get(count_beats_audio, "notation-loop", ¬ation_loop, "notation-loop-start", ¬ation_loop_start, "notation-loop-end", ¬ation_loop_end, NULL); /* loop */ g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(notation_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(notation_loop); /* loop start */ g_value_init(&loop_start_value, G_TYPE_UINT64); ags_port_safe_read(notation_loop_start, &loop_start_value); loop_start = g_value_get_uint64(&loop_start_value); g_value_unset(&loop_start_value); g_object_unref(notation_loop_start); /* loop end */ g_value_init(&loop_end_value, G_TYPE_UINT64); ags_port_safe_read(notation_loop_end, &loop_end_value); loop_end = g_value_get_uint64(&loop_end_value); g_value_unset(&loop_end_value); g_object_unref(notation_loop_end); /* count */ g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run->first_run){ count_beats_audio_run->first_run = FALSE; } if(do_loop){ if(count_beats_audio_run->notation_counter >= loop_end - 1){ count_beats_audio_run->notation_counter = loop_start; }else{ count_beats_audio_run->notation_counter += 1; } }else{ count_beats_audio_run->notation_counter += 1; } g_rec_mutex_unlock(recall_mutex); /* unref */ g_object_unref(recall_id); g_object_unref(audio); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_wave_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsAudio *audio; AgsRecallID *recall_id; AgsPort *wave_loop; AgsPort *wave_loop_start; AgsPort *wave_loop_end; AgsCountBeatsAudio *count_beats_audio; guint64 loop_start, loop_end; gboolean do_loop; GValue loop_value = {0,}; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; GRecMutex *recall_mutex; if(delay != 0.0){ return; } g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_WAVE)){ g_object_unref(recall_id); return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_object_get(count_beats_audio_run, "audio", &audio, "recall-audio", &count_beats_audio, NULL); g_object_get(count_beats_audio, "wave-loop", &wave_loop, "wave-loop-start", &wave_loop_start, "wave-loop-end", &wave_loop_end, NULL); /* loop */ g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(wave_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(wave_loop); /* loop start */ g_value_init(&loop_start_value, G_TYPE_UINT64); ags_port_safe_read(wave_loop_start, &loop_start_value); loop_start = g_value_get_uint64(&loop_start_value); g_value_unset(&loop_start_value); g_object_unref(wave_loop_start); /* loop end */ g_value_init(&loop_end_value, G_TYPE_UINT64); ags_port_safe_read(wave_loop_end, &loop_end_value); loop_end = g_value_get_uint64(&loop_end_value); g_value_unset(&loop_end_value); g_object_unref(wave_loop_end); /* count */ g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run->first_run){ count_beats_audio_run->first_run = FALSE; } if(do_loop){ if(count_beats_audio_run->wave_counter >= loop_end - 1){ count_beats_audio_run->wave_counter = loop_start; }else{ count_beats_audio_run->wave_counter += 1; } }else{ count_beats_audio_run->wave_counter += 1; } g_rec_mutex_unlock(recall_mutex); /* unref */ g_object_unref(recall_id); g_object_unref(audio); g_object_unref(count_beats_audio); } void ags_count_beats_audio_run_midi_count_callback(AgsDelayAudioRun *delay_audio_run, guint nth_run, gdouble delay, guint attack, AgsCountBeatsAudioRun *count_beats_audio_run) { AgsAudio *audio; AgsRecallID *recall_id; AgsPort *midi_loop; AgsPort *midi_loop_start; AgsPort *midi_loop_end; AgsCountBeatsAudio *count_beats_audio; guint64 loop_start, loop_end; gboolean do_loop; GValue loop_value = {0,}; GValue loop_start_value = {0,}; GValue loop_end_value = {0,}; GRecMutex *recall_mutex; if(delay != 0.0){ return; } g_object_get(count_beats_audio_run, "recall-id", &recall_id, NULL); if(!ags_recall_id_check_sound_scope(recall_id, AGS_SOUND_SCOPE_MIDI)){ g_object_unref(recall_id); return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* get some fields */ g_object_get(count_beats_audio_run, "audio", &audio, "recall-audio", &count_beats_audio, NULL); g_object_get(count_beats_audio, "midi-loop", &midi_loop, "midi-loop-start", &midi_loop_start, "midi-loop-end", &midi_loop_end, NULL); /* loop */ g_value_init(&loop_value, G_TYPE_BOOLEAN); ags_port_safe_read(midi_loop, &loop_value); do_loop = g_value_get_boolean(&loop_value); g_value_unset(&loop_value); g_object_unref(midi_loop); /* loop start */ g_value_init(&loop_start_value, G_TYPE_UINT64); ags_port_safe_read(midi_loop_start, &loop_start_value); loop_start = g_value_get_uint64(&loop_start_value); g_value_unset(&loop_start_value); g_object_unref(midi_loop_start); /* loop end */ g_value_init(&loop_end_value, G_TYPE_UINT64); ags_port_safe_read(midi_loop_end, &loop_end_value); loop_end = g_value_get_uint64(&loop_end_value); g_value_unset(&loop_end_value); g_object_unref(midi_loop_end); /* count */ g_rec_mutex_lock(recall_mutex); if(count_beats_audio_run->first_run){ count_beats_audio_run->first_run = FALSE; } if(do_loop){ if(count_beats_audio_run->midi_counter >= loop_end - 1){ count_beats_audio_run->midi_counter = loop_start; }else{ count_beats_audio_run->midi_counter += 1; } }else{ count_beats_audio_run->midi_counter += 1; } g_rec_mutex_unlock(recall_mutex); /* unref */ g_object_unref(recall_id); g_object_unref(audio); g_object_unref(count_beats_audio); } gdouble ags_count_beats_audio_run_get_bpm(AgsTactable *tactable) { AgsCountBeatsAudioRun *count_beats_audio_run; gdouble bpm; GRecMutex *recall_mutex; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(tactable); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* bpm */ g_rec_mutex_lock(recall_mutex); bpm = count_beats_audio_run->bpm; g_rec_mutex_unlock(recall_mutex); return(bpm); } gdouble ags_count_beats_audio_run_get_tact(AgsTactable *tactable) { AgsCountBeatsAudioRun *count_beats_audio_run; gdouble tact; GRecMutex *recall_mutex; count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(tactable); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(count_beats_audio_run); /* tact */ g_rec_mutex_lock(recall_mutex); tact = count_beats_audio_run->tact; g_rec_mutex_unlock(recall_mutex); return(tact); } void ags_count_beats_audio_run_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm) { /* empty */ } void ags_count_beats_audio_run_change_tact(AgsTactable *tactable, gdouble new_tact, gdouble old_tact) { /* empty */ } /** * ags_count_beats_audio_run_new: * @audio: the #AgsAudio * @delay_audio_run: the #AgsDelayAudioRun dependency * * Create a new instance of #AgsCountBeatsAudioRun * * Returns: the new #AgsCountBeatsAudioRun * * Since: 3.0.0 */ AgsCountBeatsAudioRun* ags_count_beats_audio_run_new(AgsAudio *audio, AgsDelayAudioRun *delay_audio_run) { AgsCountBeatsAudioRun *count_beats_audio_run; count_beats_audio_run = (AgsCountBeatsAudioRun *) g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO_RUN, "audio", audio, "delay-audio-run", delay_audio_run, NULL); return(count_beats_audio_run); } gsequencer-3.1.3/ags/audio/recall/ags_capture_wave_audio_run.h0000644000175000017500000000450313607210263021454 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CAPTURE_WAVE_AUDIO_RUN_H__ #define __AGS_CAPTURE_WAVE_AUDIO_RUN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN (ags_capture_wave_audio_run_get_type()) #define AGS_CAPTURE_WAVE_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN, AgsCaptureWaveAudioRun)) #define AGS_CAPTURE_WAVE_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN, AgsCaptureWaveAudioRun)) #define AGS_IS_CAPTURE_WAVE_AUDIO_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN)) #define AGS_IS_CAPTURE_WAVE_AUDIO_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN)) #define AGS_CAPTURE_WAVE_AUDIO_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN, AgsCaptureWaveAudioRunClass)) typedef struct _AgsCaptureWaveAudioRun AgsCaptureWaveAudioRun; typedef struct _AgsCaptureWaveAudioRunClass AgsCaptureWaveAudioRunClass; struct _AgsCaptureWaveAudioRun { AgsRecallAudioRun recall_audio_run; void *file_buffer; guint64 x_offset; }; struct _AgsCaptureWaveAudioRunClass { AgsRecallAudioRunClass recall_audio_run; }; GType ags_capture_wave_audio_run_get_type(); AgsCaptureWaveAudioRun* ags_capture_wave_audio_run_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_CAPTURE_WAVE_AUDIO_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_play_lv2_audio.h0000644000175000017500000000667613607210263017650 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAY_LV2_AUDIO_H__ #define __AGS_PLAY_LV2_AUDIO_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAY_LV2_AUDIO (ags_play_lv2_audio_get_type()) #define AGS_PLAY_LV2_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAY_LV2_AUDIO, AgsPlayLv2Audio)) #define AGS_PLAY_LV2_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLAY_LV2_AUDIO, AgsPlayLv2Audio)) #define AGS_IS_PLAY_LV2_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAY_LV2_AUDIO)) #define AGS_IS_PLAY_LV2_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAY_LV2_AUDIO)) #define AGS_PLAY_LV2_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLAY_LV2_AUDIO, AgsPlayLv2AudioClass)) typedef struct _AgsPlayLv2Audio AgsPlayLv2Audio; typedef struct _AgsPlayLv2AudioClass AgsPlayLv2AudioClass; /** * AgsPlayLv2AudioFlags: * @AGS_PLAY_LV2_AUDIO_HAS_EVENT_PORT: use lv2 event port * @AGS_PLAY_LV2_AUDIO_HAS_ATOM_PORT: use lv2 atom port * @AGS_PLAY_LV2_AUDIO_HAS_WORKER: provide worker to lv2 plugin * * Enum values to control the behavior or indicate internal state of #AgsPlayLv2Audio by * enable/disable as flags. */ typedef enum{ AGS_PLAY_LV2_AUDIO_HAS_EVENT_PORT = 1, AGS_PLAY_LV2_AUDIO_HAS_ATOM_PORT = 1 << 1, AGS_PLAY_LV2_AUDIO_HAS_WORKER = 1 << 2, }AgsPlayLv2AudioFLags; struct _AgsPlayLv2Audio { AgsRecallAudio recall_audio; guint flags; AgsTurtle *turtle; gchar *uri; AgsLv2Plugin *plugin; LV2_Descriptor *plugin_descriptor; uint32_t *input_port; uint32_t input_lines; uint32_t *output_port; uint32_t output_lines; uint32_t event_port; uint32_t atom_port; guint bank; guint program; }; struct _AgsPlayLv2AudioClass { AgsRecallAudioClass recall_audio; }; GType ags_play_lv2_audio_get_type(); gboolean ags_play_lv2_audio_test_flags(AgsPlayLv2Audio *play_lv2_audio, guint flags); void ags_play_lv2_audio_set_flags(AgsPlayLv2Audio *play_lv2_audio, guint flags); void ags_play_lv2_audio_unset_flags(AgsPlayLv2Audio *play_lv2_audio, guint flags); void ags_play_lv2_audio_load(AgsPlayLv2Audio *play_lv2_audio); GList* ags_play_lv2_audio_load_ports(AgsPlayLv2Audio *play_lv2_audio); void ags_play_lv2_audio_load_conversion(AgsPlayLv2Audio *play_lv2_audio, GObject *port, GObject *plugin_port); GList* ags_play_lv2_audio_find(GList *recall, gchar *filename, gchar *uri); AgsPlayLv2Audio* ags_play_lv2_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_PLAY_LV2_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_prepare_channel.h0000644000175000017500000000407613607210263020055 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PREPARE_CHANNEL_H__ #define __AGS_PREPARE_CHANNEL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PREPARE_CHANNEL (ags_prepare_channel_get_type()) #define AGS_PREPARE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PREPARE_CHANNEL, AgsPrepareChannel)) #define AGS_PREPARE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PREPARE_CHANNEL, AgsPrepareChannel)) #define AGS_IS_PREPARE_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PREPARE_CHANNEL)) #define AGS_IS_PREPARE_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PREPARE_CHANNEL)) #define AGS_PREPARE_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PREPARE_CHANNEL, AgsPrepareChannelClass)) typedef struct _AgsPrepareChannel AgsPrepareChannel; typedef struct _AgsPrepareChannelClass AgsPrepareChannelClass; struct _AgsPrepareChannel { AgsRecallChannel recall_channel; }; struct _AgsPrepareChannelClass { AgsRecallChannelClass recall_channel; }; GType ags_prepare_channel_get_type(); AgsPrepareChannel* ags_prepare_channel_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_PREPARE_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_copy_channel_run.c0000644000175000017500000000757313607210263020255 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_copy_channel_run_class_init(AgsCopyChannelRunClass *copy_channel_run); void ags_copy_channel_run_init(AgsCopyChannelRun *copy_channel_run); void ags_copy_channel_run_finalize(GObject *gobject); /** * SECTION:ags_copy_channel_run * @short_description: copy channel * @title: AgsCopyChannelRun * @section_id: * @include: ags/audio/recall/ags_copy_channel_run.h * * The #AgsCopyChannelRun class copies the channel. */ static gpointer ags_copy_channel_run_parent_class = NULL; GType ags_copy_channel_run_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_copy_channel_run = 0; static const GTypeInfo ags_copy_channel_run_info = { sizeof(AgsCopyChannelRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_copy_channel_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCopyChannelRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_copy_channel_run_init, }; ags_type_copy_channel_run = g_type_register_static(AGS_TYPE_RECALL_CHANNEL_RUN, "AgsCopyChannelRun", &ags_copy_channel_run_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_copy_channel_run); } return g_define_type_id__volatile; } void ags_copy_channel_run_class_init(AgsCopyChannelRunClass *copy_channel_run) { GObjectClass *gobject; ags_copy_channel_run_parent_class = g_type_class_peek_parent(copy_channel_run); /* GObjectClass */ gobject = (GObjectClass *) copy_channel_run; gobject->finalize = ags_copy_channel_run_finalize; } void ags_copy_channel_run_init(AgsCopyChannelRun *copy_channel_run) { ags_recall_set_ability_flags((AgsRecall *) copy_channel_run, (AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_WAVE | AGS_SOUND_ABILITY_MIDI)); AGS_RECALL(copy_channel_run)->name = "ags-copy"; AGS_RECALL(copy_channel_run)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(copy_channel_run)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(copy_channel_run)->xml_type = "ags-copy-channel-run"; AGS_RECALL(copy_channel_run)->port = NULL; AGS_RECALL(copy_channel_run)->child_type = AGS_TYPE_COPY_RECYCLING; } void ags_copy_channel_run_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_copy_channel_run_parent_class)->finalize(gobject); } /** * ags_copy_channel_run_new: * @destination: the destination #AgsChannel * @source: the source #AgsChannel * * Create a new instance of #AgsCopyChannelRun * * Returns: the new #AgsCopyChannelRun * * Since: 3.0.0 */ AgsCopyChannelRun* ags_copy_channel_run_new(AgsChannel *destination, AgsChannel *source) { AgsCopyChannelRun *copy_channel_run; copy_channel_run = (AgsCopyChannelRun *) g_object_new(AGS_TYPE_COPY_CHANNEL_RUN, "destination", destination, "source", source, NULL); return(copy_channel_run); } gsequencer-3.1.3/ags/audio/recall/ags_rt_stream_channel_run.h0000644000175000017500000000434013607210263021275 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RT_STREAM_CHANNEL_RUN_H__ #define __AGS_RT_STREAM_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RT_STREAM_CHANNEL_RUN (ags_rt_stream_channel_run_get_type()) #define AGS_RT_STREAM_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RT_STREAM_CHANNEL_RUN, AgsRtStreamChannelRun)) #define AGS_RT_STREAM_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RT_STREAM_CHANNEL_RUN, AgsRtStreamChannelRunClass)) #define AGS_IS_RT_STREAM_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RT_STREAM_CHANNEL_RUN)) #define AGS_IS_RT_STREAM_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RT_STREAM_CHANNEL_RUN)) #define AGS_RT_STREAM_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RT_STREAM_CHANNEL_RUN, AgsRtStreamChannelRunClass)) typedef struct _AgsRtStreamChannelRun AgsRtStreamChannelRun; typedef struct _AgsRtStreamChannelRunClass AgsRtStreamChannelRunClass; struct _AgsRtStreamChannelRun { AgsRecallChannelRun recall_channel_run; }; struct _AgsRtStreamChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_rt_stream_channel_run_get_type(); AgsRtStreamChannelRun* ags_rt_stream_channel_run_new(AgsChannel *source); G_END_DECLS #endif /*__AGS_RT_STREAM_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/recall/ags_eq10_recycling.h0000644000175000017500000000406613607210263017533 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EQ10_RECYCLING_H__ #define __AGS_EQ10_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EQ10_RECYCLING (ags_eq10_recycling_get_type()) #define AGS_EQ10_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EQ10_RECYCLING, AgsEq10Recycling)) #define AGS_EQ10_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EQ10_RECYCLING, AgsEq10RecyclingClass)) #define AGS_IS_EQ10_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_EQ10_RECYCLING)) #define AGS_IS_EQ10_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EQ10_RECYCLING)) #define AGS_EQ10_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_EQ10_RECYCLING, AgsEq10RecyclingClass)) typedef struct _AgsEq10Recycling AgsEq10Recycling; typedef struct _AgsEq10RecyclingClass AgsEq10RecyclingClass; struct _AgsEq10Recycling { AgsRecallRecycling recall_recycling; }; struct _AgsEq10RecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_eq10_recycling_get_type(); AgsEq10Recycling* ags_eq10_recycling_new(AgsRecycling *source); G_END_DECLS #endif /*__AGS_EQ10_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_container.c0000644000175000017500000010604513613101164016757 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_recall_container_class_init(AgsRecallContainerClass *recall_class); void ags_recall_container_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_container_init(AgsRecallContainer *recall); void ags_recall_container_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_container_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_container_dispose(GObject *recall); void ags_recall_container_finalize(GObject *recall); AgsUUID* ags_recall_container_get_uuid(AgsConnectable *connectable); gboolean ags_recall_container_has_resource(AgsConnectable *connectable); gboolean ags_recall_container_is_ready(AgsConnectable *connectable); void ags_recall_container_add_to_registry(AgsConnectable *connectable); void ags_recall_container_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_recall_container_list_resource(AgsConnectable *connectable); xmlNode* ags_recall_container_xml_compose(AgsConnectable *connectable); void ags_recall_container_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_recall_container_is_connected(AgsConnectable *connectable); void ags_recall_container_connect(AgsConnectable *connectable); void ags_recall_container_disconnect(AgsConnectable *connectable); /** * SECTION:ags_recall_container * @short_description: Container to group recalls * @title: AgsRecallContainer * @section_id: * @include: ags/audio/ags_recall_container.h * * #AgsRecallContainer groups recalls of different context. */ enum{ PROP_0, PROP_RECALL_AUDIO_TYPE, PROP_RECALL_AUDIO, PROP_RECALL_AUDIO_RUN_TYPE, PROP_RECALL_AUDIO_RUN, PROP_RECALL_CHANNEL_TYPE, PROP_RECALL_CHANNEL, PROP_RECALL_CHANNEL_RUN_TYPE, PROP_RECALL_CHANNEL_RUN, }; static gpointer ags_recall_container_parent_class = NULL; GType ags_recall_container_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_container = 0; static const GTypeInfo ags_recall_container_info = { sizeof (AgsRecallContainerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_container_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallContainer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_container_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_container_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_container = g_type_register_static(G_TYPE_OBJECT, "AgsRecallContainer", &ags_recall_container_info, 0); g_type_add_interface_static(ags_type_recall_container, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_container); } return g_define_type_id__volatile; } void ags_recall_container_class_init(AgsRecallContainerClass *recall_container) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_container_parent_class = g_type_class_peek_parent(recall_container); /* GObjectClass */ gobject = (GObjectClass *) recall_container; gobject->dispose = ags_recall_container_dispose; gobject->finalize = ags_recall_container_finalize; gobject->set_property = ags_recall_container_set_property; gobject->get_property = ags_recall_container_get_property; /* properties */ /** * AgsRecallContainer:recall-audio-type: * * The associated recall type within audio context. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("recall-audio-type", i18n_pspec("audio level recall type"), i18n_pspec("The recall type which this recall container has on audio level"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO_TYPE, param_spec); /** * AgsRecallContainer:recall-audio: * * The associated recall within audio context. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-audio", i18n_pspec("audio level recall"), i18n_pspec("The recall which this recall container has on audio level"), AGS_TYPE_RECALL_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO, param_spec); /** * AgsRecallContainer:recall-audio-run-type: * * The associated recall type within dynamic audio context. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("recall-audio-run-type", i18n_pspec("audio runlevel recall type"), i18n_pspec("The recall type which this recall container has on audio level during a run"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO_RUN_TYPE, param_spec); /** * AgsRecallContainer:recall-audio-run: (type GList(AgsRecall)) (transfer full) * * The associated recall within dynamic audio context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-audio-run", i18n_pspec("audio runlevel recall"), i18n_pspec("The recall which this recall container has on audio level during a run"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_AUDIO_RUN, param_spec); /** * AgsRecallContainer:recall-channel-type: * * The associated recall type within channel context. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("recall-channel-type", i18n_pspec("channel level recall type"), i18n_pspec("The recall type which this recall container has on channel level"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CHANNEL_TYPE, param_spec); /** * AgsRecallContainer:recall-channel: (type GList(AgsRecall)) (transfer full) * * The associated recall within channel context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-channel", i18n_pspec("channel level recall"), i18n_pspec("The recall which this recall container has on channel level"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CHANNEL, param_spec); /** * AgsRecallContainer:recall-channel-run-type: * * The associated recall type within dynamic channel context. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("recall-channel-run-type", i18n_pspec("channel runlevel recall type"), i18n_pspec("The recall type which this recall container has on audio level during a run"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CHANNEL_RUN_TYPE, param_spec); /** * AgsRecallContainer:recall-channel-run: (type GList(AgsRecall)) (transfer full) * * The associated recall within dynamic channel context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-channel-run", i18n_pspec("channel runlevel recall"), i18n_pspec("The recall which this recall container has on audio level during a run"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CHANNEL_RUN, param_spec); } void ags_recall_container_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_recall_container_get_uuid; connectable->has_resource = ags_recall_container_has_resource; connectable->is_ready = ags_recall_container_is_ready; connectable->add_to_registry = ags_recall_container_add_to_registry; connectable->remove_from_registry = ags_recall_container_remove_from_registry; connectable->list_resource = ags_recall_container_list_resource; connectable->xml_compose = ags_recall_container_xml_compose; connectable->xml_parse = ags_recall_container_xml_parse; connectable->is_connected = ags_recall_container_is_connected; connectable->connect = ags_recall_container_connect; connectable->disconnect = ags_recall_container_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_recall_container_init(AgsRecallContainer *recall_container) { recall_container->flags = 0; /* add recall container mutex */ g_rec_mutex_init(&(recall_container->obj_mutex)); /* */ recall_container->recall_audio = NULL; recall_container->recall_audio_run = NULL; recall_container->recall_channel = NULL; recall_container->recall_channel_run = NULL; } void ags_recall_container_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallContainer *recall_container; GRecMutex *recall_container_mutex; recall_container = AGS_RECALL_CONTAINER(gobject); /* get recall container mutex */ recall_container_mutex = AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(recall_container); switch(prop_id){ case PROP_RECALL_AUDIO_TYPE: { GType recall_audio_type; recall_audio_type = (GType) g_value_get_gtype(value); g_rec_mutex_lock(recall_container_mutex); recall_container->recall_audio_type = recall_audio_type; g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_AUDIO: { AgsAudio *audio; AgsRecallAudio *recall_audio; GList *list_start, *list; recall_audio = (AgsRecallAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_container_mutex); if(recall_container->recall_audio == (AgsRecall *) recall_audio){ g_rec_mutex_unlock(recall_container_mutex); return; } if(recall_container->recall_audio != NULL){ g_object_unref(G_OBJECT(recall_container->recall_audio)); } if(recall_audio != NULL){ g_object_ref(G_OBJECT(recall_audio)); } recall_container->recall_audio = (AgsRecall *) recall_audio; g_rec_mutex_unlock(recall_container_mutex); /* set recall audio - recall audio run */ g_rec_mutex_lock(recall_container_mutex); list = list_start = g_list_copy_deep(recall_container->recall_audio_run, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_container_mutex); while(list != NULL){ g_object_set(G_OBJECT(list->data), "recall-audio", recall_audio, NULL); list = list->next; } g_list_free_full(list_start, g_object_unref); /* set recall audio - recall channel */ g_rec_mutex_lock(recall_container_mutex); list = list_start = g_list_copy_deep(recall_container->recall_channel, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_container_mutex); while(list != NULL){ g_object_set(G_OBJECT(list->data), "recall-audio", recall_audio, NULL); list = list->next; } g_list_free_full(list_start, g_object_unref); /* set recall audio - recall channel run */ g_rec_mutex_lock(recall_container_mutex); list = list_start = g_list_copy_deep(recall_container->recall_channel_run, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_container_mutex); while(list != NULL){ g_object_set(G_OBJECT(list->data), "recall-audio", recall_audio, NULL); list = list->next; } g_list_free_full(list_start, g_object_unref); } break; case PROP_RECALL_AUDIO_RUN_TYPE: { GType recall_audio_run_type; recall_audio_run_type = g_value_get_gtype(value); g_rec_mutex_lock(recall_container_mutex); recall_container->recall_audio_run_type = recall_audio_run_type; g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_AUDIO_RUN: { AgsRecallAudioRun *recall_audio_run; AgsRecallID *recall_id; GList *list_start, *list; guint recall_flags; GRecMutex *recall_mutex; recall_audio_run = (AgsRecallAudioRun *) g_value_get_pointer(value); g_rec_mutex_lock(recall_container_mutex); if(recall_audio_run == NULL || g_list_find(recall_container->recall_audio_run, recall_audio_run) != NULL){ g_rec_mutex_unlock(recall_container_mutex); return; } g_object_ref(G_OBJECT(recall_audio_run)); recall_container->recall_audio_run = g_list_prepend(recall_container->recall_audio_run, recall_audio_run); g_rec_mutex_unlock(recall_container_mutex); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_audio_run); /* set recall audio run - recall channel run */ g_rec_mutex_lock(recall_mutex); recall_flags = AGS_RECALL(recall_audio_run)->flags; g_rec_mutex_unlock(recall_mutex); g_object_get(recall_audio_run, "recall-id", &recall_id, NULL); g_rec_mutex_lock(recall_container_mutex); list = list_start = g_list_copy_deep(recall_container->recall_channel_run, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_container_mutex); if(recall_id != NULL){ AgsRecyclingContext *recycling_context; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ g_object_set(list->data, "recall-audio-run", recall_audio_run, NULL); list = list->next; } g_object_unref(recycling_context); }else if((AGS_RECALL_TEMPLATE & (recall_flags)) != 0){ while((list = ags_recall_find_template(list)) != NULL){ g_object_set(list->data, "recall-audio-run", recall_audio_run, NULL); list = list->next; } } g_list_free_full(list_start, g_object_unref); if(recall_id != NULL){ g_object_unref(recall_id); } } break; case PROP_RECALL_CHANNEL_TYPE: { GType recall_channel_type; recall_channel_type = (GType) g_value_get_gtype(value); g_rec_mutex_lock(recall_container_mutex); recall_container->recall_channel_type = recall_channel_type; g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_CHANNEL: { AgsChannel *source; AgsRecallChannel *recall_channel; GList *list_start, *list; GRecMutex *recall_mutex; recall_channel = (AgsRecallChannel *) g_value_get_pointer(value); g_rec_mutex_lock(recall_container_mutex); if(recall_channel == NULL || g_list_find(recall_container->recall_channel, recall_channel) != NULL){ g_rec_mutex_unlock(recall_container_mutex); return; } g_object_ref(G_OBJECT(recall_channel)); recall_container->recall_channel = g_list_prepend(recall_container->recall_channel, recall_channel); g_rec_mutex_unlock(recall_container_mutex); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_channel); /* set recall channel - recall channel run */ g_rec_mutex_lock(recall_mutex); source = recall_channel->source; g_rec_mutex_unlock(recall_mutex); g_rec_mutex_lock(recall_container_mutex); list = list_start = g_list_copy_deep(recall_container->recall_channel_run, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_container_mutex); while((list = ags_recall_find_provider(list, (GObject *) source)) != NULL){ g_object_set(G_OBJECT(list->data), "recall-channel", recall_channel, NULL); list = list->next; } g_list_free_full(list_start, g_object_unref); } break; case PROP_RECALL_CHANNEL_RUN_TYPE: { GType recall_channel_run_type; recall_channel_run_type = (GType) g_value_get_gtype(value); g_rec_mutex_lock(recall_container_mutex); recall_container->recall_channel_run_type = recall_channel_run_type; g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_CHANNEL_RUN: { AgsRecallChannelRun *recall_channel_run; recall_channel_run = (AgsRecallChannelRun *) g_value_get_pointer(value); g_rec_mutex_lock(recall_container_mutex); if(recall_channel_run == NULL || g_list_find(recall_container->recall_channel_run, recall_channel_run) != NULL){ g_rec_mutex_unlock(recall_container_mutex); return; } g_object_ref(G_OBJECT(recall_channel_run)); recall_container->recall_channel_run = g_list_prepend(recall_container->recall_channel_run, recall_channel_run); g_rec_mutex_unlock(recall_container_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_container_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallContainer *recall_container; GRecMutex *recall_container_mutex; recall_container = AGS_RECALL_CONTAINER(gobject); /* get recall container mutex */ recall_container_mutex = AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(recall_container); switch(prop_id){ case PROP_RECALL_AUDIO_TYPE: { g_rec_mutex_lock(recall_container_mutex); g_value_set_gtype(value, recall_container->recall_audio_type); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_AUDIO: { g_rec_mutex_lock(recall_container_mutex); g_value_set_object(value, recall_container->recall_audio); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_AUDIO_RUN_TYPE: { g_rec_mutex_lock(recall_container_mutex); g_value_set_gtype(value, recall_container->recall_audio_run_type); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_AUDIO_RUN: { g_rec_mutex_lock(recall_container_mutex); g_value_set_pointer(value, g_list_copy_deep(recall_container->recall_audio_run, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_CHANNEL_TYPE: { g_rec_mutex_lock(recall_container_mutex); g_value_set_gtype(value, recall_container->recall_channel_type); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_CHANNEL: { g_rec_mutex_lock(recall_container_mutex); g_value_set_pointer(value, g_list_copy_deep(recall_container->recall_channel, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_CHANNEL_RUN_TYPE: { g_rec_mutex_lock(recall_container_mutex); g_value_set_gtype(value, recall_container->recall_channel_run_type); g_rec_mutex_unlock(recall_container_mutex); } break; case PROP_RECALL_CHANNEL_RUN: { g_rec_mutex_lock(recall_container_mutex); g_value_set_pointer(value, g_list_copy_deep(recall_container->recall_channel_run, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_container_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_container_dispose(GObject *gobject) { AgsRecallContainer *recall_container; recall_container = AGS_RECALL_CONTAINER(gobject); /* recall */ if(recall_container->recall_audio != NULL){ g_object_unref(recall_container->recall_audio); recall_container->recall_audio = NULL; } g_list_free_full(recall_container->recall_audio_run, g_object_unref); recall_container->recall_audio_run = NULL; g_list_free_full(recall_container->recall_channel, g_object_unref); recall_container->recall_channel = NULL; g_list_free_full(recall_container->recall_channel_run, g_object_unref); recall_container->recall_channel_run = NULL; /* call parent */ G_OBJECT_CLASS(ags_recall_container_parent_class)->dispose(gobject); } void ags_recall_container_finalize(GObject *gobject) { AgsRecallContainer *recall_container; recall_container = AGS_RECALL_CONTAINER(gobject); /* recall */ g_object_unref(recall_container->recall_audio); g_list_free_full(recall_container->recall_audio_run, g_object_unref); g_list_free_full(recall_container->recall_channel, g_object_unref); g_list_free_full(recall_container->recall_channel_run, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recall_container_parent_class)->finalize(gobject); } AgsUUID* ags_recall_container_get_uuid(AgsConnectable *connectable) { AgsRecallContainer *recall_container; AgsUUID *ptr; GRecMutex *recall_container_mutex; recall_container = AGS_RECALL_CONTAINER(connectable); /* get recall_container mutex */ recall_container_mutex = AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(recall_container); /* get UUID */ g_rec_mutex_lock(recall_container_mutex); ptr = recall_container->uuid; g_rec_mutex_unlock(recall_container_mutex); return(ptr); } gboolean ags_recall_container_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_recall_container_is_ready(AgsConnectable *connectable) { AgsRecallContainer *recall_container; gboolean is_ready; recall_container = AGS_RECALL_CONTAINER(connectable); /* check is added */ is_ready = ags_recall_container_test_flags(recall_container, AGS_RECALL_CONTAINER_ADDED_TO_REGISTRY); return(is_ready); } void ags_recall_container_add_to_registry(AgsConnectable *connectable) { AgsRecallContainer *recall_container; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *list; if(ags_connectable_is_ready(connectable)){ return; } recall_container = AGS_RECALL_CONTAINER(connectable); ags_recall_container_set_flags(recall_container, AGS_RECALL_CONTAINER_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) recall_container); ags_registry_add_entry(registry, entry); } //TODO:JK: implement me } void ags_recall_container_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_recall_container_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_recall_container_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_recall_container_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_recall_container_is_connected(AgsConnectable *connectable) { AgsRecallContainer *recall_container; gboolean is_connected; recall_container = AGS_RECALL_CONTAINER(connectable); /* check is connected */ is_connected = ags_recall_container_test_flags(recall_container, AGS_RECALL_CONTAINER_CONNECTED); return(is_connected); } void ags_recall_container_connect(AgsConnectable *connectable) { AgsRecallContainer *recall_container; GList *list_start, *list; GRecMutex *recall_container_mutex; if(ags_connectable_is_connected(connectable)){ return; } recall_container = AGS_RECALL_CONTAINER(connectable); ags_recall_container_set_flags(recall_container, AGS_RECALL_CONTAINER_CONNECTED); } void ags_recall_container_disconnect(AgsConnectable *connectable) { AgsRecallContainer *recall_container; GList *list_start, *list; GRecMutex *recall_container_mutex; if(!ags_connectable_is_connected(connectable)){ return; } recall_container = AGS_RECALL_CONTAINER(connectable); ags_recall_container_unset_flags(recall_container, AGS_RECALL_CONTAINER_CONNECTED); } /** * ags_recall_container_test_flags: * @recall_container: the #AgsRecallContainer * @flags: the flags * * Test @flags to be set on @recall_container. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_container_test_flags(AgsRecallContainer *recall_container, guint flags) { gboolean retval; GRecMutex *recall_container_mutex; if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return(FALSE); } /* get recall_container mutex */ recall_container_mutex = AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(recall_container); /* test */ g_rec_mutex_lock(recall_container_mutex); retval = (flags & (recall_container->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_container_mutex); return(retval); } /** * ags_recall_container_set_flags: * @recall_container: the #AgsRecallContainer * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_recall_container_set_flags(AgsRecallContainer *recall_container, guint flags) { GRecMutex *recall_container_mutex; if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return; } /* get recall_container mutex */ recall_container_mutex = AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(recall_container); /* set flags */ g_rec_mutex_lock(recall_container_mutex); recall_container->flags |= flags; g_rec_mutex_unlock(recall_container_mutex); } /** * ags_recall_container_unset_flags: * @recall_container: the #AgsRecallContainer * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_recall_container_unset_flags(AgsRecallContainer *recall_container, guint flags) { GRecMutex *recall_container_mutex; if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return; } /* get recall_container mutex */ recall_container_mutex = AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(recall_container); /* set flags */ g_rec_mutex_lock(recall_container_mutex); recall_container->flags &= (~flags); g_rec_mutex_unlock(recall_container_mutex); } /** * ags_recall_container_add: * @recall_container: the #AgsRecallContainer * @recall: the #AgsRecall * * Add @recall to @recall_container. * * Since: 3.0.0 */ void ags_recall_container_add(AgsRecallContainer *recall_container, AgsRecall *recall) { if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return; } if(AGS_IS_RECALL_AUDIO(recall)){ g_object_set(recall_container, "recall-audio", recall, NULL); g_object_set(recall, "recall-container", recall_container, NULL); }else if(AGS_IS_RECALL_AUDIO_RUN(recall)){ g_object_set(recall_container, "recall-audio-run", recall, NULL); g_object_set(recall, "recall-container", recall_container, NULL); }else if(AGS_IS_RECALL_CHANNEL(recall)){ g_object_set(recall_container, "recall-channel", recall, NULL); g_object_set(recall, "recall-container", recall_container, NULL); }else if(AGS_IS_RECALL_CHANNEL_RUN(recall)){ g_object_set(recall_container, "recall-channel-run", recall, NULL); g_object_set(recall, "recall-container", recall_container, NULL); } } /** * ags_recall_container_remove: * @recall_container: the #AgsRecallContainer * @recall: the #AgsRecall * * Remove @recall from @recall_container. * * Since: 3.0.0 */ void ags_recall_container_remove(AgsRecallContainer *recall_container, AgsRecall *recall) { if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return; } if(AGS_IS_RECALL_AUDIO(recall)){ if(recall == recall_container->recall_audio){ g_object_set(recall, "recall-container", NULL, NULL); g_object_set(recall_container, "recall-audio", NULL, NULL); } }else if(AGS_IS_RECALL_AUDIO_RUN(recall)){ if(g_list_find(recall_container->recall_audio_run, recall) != NULL){ g_object_set(recall, "recall-container", NULL, NULL); recall_container->recall_audio_run = g_list_remove(recall_container->recall_audio_run, recall); g_object_unref(recall); } }else if(AGS_IS_RECALL_CHANNEL(recall)){ if(g_list_find(recall_container->recall_channel, recall) != NULL){ g_object_set(recall, "recall-container", NULL, NULL); recall_container->recall_channel = g_list_remove(recall_container->recall_channel, recall); g_object_unref(recall); } }else if(AGS_IS_RECALL_CHANNEL_RUN(recall)){ if(g_list_find(recall_container->recall_channel_run, recall) != NULL){ g_object_set(recall, "recall-container", NULL, NULL); recall_container->recall_channel_run = g_list_remove(recall_container->recall_channel_run, recall); g_object_unref(recall); } } } /** * ags_recall_container_get_recall_audio: * @recall_container: the #AgsRecallContainer * * Retrieve recall audio of container. * * Returns: (transfer none): the #AgsRecallAudio * * Since: 3.0.0 */ AgsRecall* ags_recall_container_get_recall_audio(AgsRecallContainer *recall_container) { if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return(NULL); } return(recall_container->recall_audio); } /** * ags_recall_container_get_recall_audio_run: * @recall_container: the #AgsRecallContainer * * Retrieve recall audio run of container. * * Returns: (element-type AgsAudio.RecallAudioRun) (transfer none): the #AgsRecallAudioRun as list * * Since: 3.0.0 */ GList* ags_recall_container_get_recall_audio_run(AgsRecallContainer *recall_container) { if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return(NULL); } return(recall_container->recall_audio_run); } /** * ags_recall_container_get_recall_channel: * @recall_container: the #AgsRecallContainer * * Retrieve the recall channel of container. * * Returns: (element-type AgsAudio.RecallChannel) (transfer none): the #AgsRecallChannel * * Since: 3.0.0 */ GList* ags_recall_container_get_recall_channel(AgsRecallContainer *recall_container) { if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return(NULL); } return(recall_container->recall_channel); } /** * ags_recall_container_get_recall_channel_run: * @recall_container: the #AgsRecallContainer * * Retrieve the recall channel run of container. * * Returns: (element-type AgsAudio.RecallChannelRun) (transfer none): the #AgsRecall * * Since: 3.0.0 */ GList* ags_recall_container_get_recall_channel_run(AgsRecallContainer *recall_container) { if(!AGS_IS_RECALL_CONTAINER(recall_container)){ return(NULL); } return(recall_container->recall_channel_run); } /** * ags_recall_container_find: * @recall_container: (element-type AgsAudio.RecallContainer) (transfer none): the #GList-struct containing #AgsRecallContainer * @type: recall type * @find_flags: search mask * @recall_id: an #AgsRecallID * * Finds #AgsRecall for appropriate search criteria. * * Returns: (element-type AgsAudio.Recall) (transfer none): the matching recalls * * Since: 3.0.0 */ GList* ags_recall_container_find(GList *recall_container, GType gtype, guint find_flags, AgsRecallID *recall_id) { AgsRecallContainer *current; AgsRecall *recall; guint mode; if(g_type_is_a(gtype, AGS_TYPE_RECALL_AUDIO)){ mode = 0; }else if(g_type_is_a(gtype, AGS_TYPE_RECALL_AUDIO_RUN)){ mode = 1; }else if(g_type_is_a(gtype, AGS_TYPE_RECALL_CHANNEL)){ mode = 2; }else if(g_type_is_a(gtype, AGS_TYPE_RECALL_CHANNEL_RUN)){ mode = 3; }else{ g_message("ags_recall_container_find: invalid type"); return(NULL); } while(recall_container != NULL){ GType current_gtype; current = AGS_RECALL_CONTAINER(recall_container->data); if(mode == 0){ g_object_get(current, "recall-audio-type", ¤t_gtype, NULL); if((AGS_RECALL_CONTAINER_FIND_TYPE & find_flags) != 0 && current_gtype == gtype){ break; } recall = ags_recall_container_get_recall_audio(current); }else if(mode == 1){ GList *list; g_object_get(current, "recall-audio-run-type", ¤t_gtype, NULL); if((AGS_RECALL_CONTAINER_FIND_TYPE & find_flags) != 0 && current_gtype == gtype){ break; } list = ags_recall_container_get_recall_audio_run(current); if(list == NULL){ recall = NULL; }else{ recall = AGS_RECALL(list->data); } }else if(mode == 2){ GList *list; g_object_get(current, "recall-channel-type", ¤t_gtype, NULL); if((AGS_RECALL_CONTAINER_FIND_TYPE & find_flags) != 0 && current_gtype == gtype){ break; } list = ags_recall_container_get_recall_channel(current); if(list == NULL){ recall = NULL; }else{ recall = AGS_RECALL(list->data); } }else if(mode == 3){ GList *list; g_object_get(current, "recall-channel-run-type", ¤t_gtype, NULL); if((AGS_RECALL_CONTAINER_FIND_TYPE & find_flags) != 0 && current_gtype == gtype){ break; } list = ags_recall_container_get_recall_channel_run(current); if(list == NULL){ recall = NULL; }else{ recall = AGS_RECALL(list->data); } } if(recall != NULL){ AgsRecallID *current_recall_id; gboolean match_recall_id; if((AGS_RECALL_CONTAINER_FIND_TEMPLATE & find_flags) != 0 && ags_recall_test_flags(recall, AGS_RECALL_TEMPLATE)){ break; } g_object_get(recall, "recall-id", ¤t_recall_id, NULL); match_recall_id = (current_recall_id != NULL && current_recall_id == recall_id) ? TRUE: FALSE; g_object_unref(current_recall_id); if((AGS_RECALL_CONTAINER_FIND_RECALL_ID & find_flags) != 0 && match_recall_id){ break; } } recall_container = recall_container->next; } return(recall_container); } /** * ags_recall_container_new: * * Create a new instance of #AgsRecallContainer * * Returns: the new #AgsRecallContainer * * Since: 3.0.0 */ AgsRecallContainer* ags_recall_container_new() { AgsRecallContainer *recall_container; recall_container = (AgsRecallContainer *) g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); return(recall_container); } gsequencer-3.1.3/ags/audio/ags_preset.c0000644000175000017500000006427213616617253015000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_preset_class_init(AgsPresetClass *preset); void ags_preset_init (AgsPreset *preset); void ags_preset_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_preset_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_preset_finalize(GObject *gobject); /** * SECTION:ags_preset * @short_description: presets * @title: AgsPreset * @section_id: * @include: ags/audio/ags_preset.h * * The #AgsPreset stores presets. */ static gpointer ags_preset_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_SCOPE, PROP_PRESET_NAME, PROP_AUDIO_CHANNEL_START, PROP_AUDIO_CHANNEL_END, PROP_PAD_START, PROP_PAD_END, PROP_X_START, PROP_X_END, }; GType ags_preset_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_preset = 0; static const GTypeInfo ags_preset_info = { sizeof (AgsPresetClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_preset_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPreset), 0, /* n_preallocs */ (GInstanceInitFunc) ags_preset_init, }; ags_type_preset = g_type_register_static(G_TYPE_OBJECT, "AgsPreset", &ags_preset_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_preset); } return g_define_type_id__volatile; } void ags_preset_class_init(AgsPresetClass *preset) { GObjectClass *gobject; GParamSpec *param_spec; ags_preset_parent_class = g_type_class_peek_parent(preset); /* GObjectClass */ gobject = (GObjectClass *) preset; gobject->set_property = ags_preset_set_property; gobject->get_property = ags_preset_get_property; gobject->finalize = ags_preset_finalize; /* properties */ /** * AgsPreset:audio: * * The #AgsAudio belonging to. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio"), i18n_pspec("The audio belonging to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsPreset:scope: * * The preset's scope. * * Since: 3.0.0 */ param_spec = g_param_spec_string("scope", i18n_pspec("scope"), i18n_pspec("The preset's scope"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsPreset:preset-name: * * The preset name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset-name", i18n_pspec("preset-name"), i18n_pspec("The preset name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET_NAME, param_spec); /** * AgsPreset:audio-channel-start: * * The start audio channel to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel-start", i18n_pspec("audio-channel-start"), i18n_pspec("The start audio channel to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL_START, param_spec); /** * AgsPreset:audio-channel-end: * * The end audio channel to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel-end", i18n_pspec("audio-channel-end"), i18n_pspec("The end audio channel to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL_END, param_spec); /** * AgsPreset:pad-start: * * The start pad to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pad-start", i18n_pspec("pad-start"), i18n_pspec("The start pad to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PAD_START, param_spec); /** * AgsPreset:pad-end: * * The end pad to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pad-end", i18n_pspec("pad-end"), i18n_pspec("The end pad to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PAD_END, param_spec); /** * AgsPreset:x-start: * * The start x to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("x-start", i18n_pspec("x-start"), i18n_pspec("The start x to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_START, param_spec); /** * AgsPreset:x-end: * * The end x to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("x-end", i18n_pspec("x-end"), i18n_pspec("The end x to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_END, param_spec); } GQuark ags_preset_error_quark() { return(g_quark_from_static_string("ags-preset-error-quark")); } void ags_preset_init(AgsPreset *preset) { preset->flags = 0; /* preset mutex */ g_rec_mutex_init(&(preset->obj_mutex)); /* common fields */ preset->audio = NULL; preset->scope = NULL; preset->preset_name = NULL; /* insets */ preset->audio_channel_start = 0; preset->audio_channel_end = 0; preset->audio_channel_start = 0; preset->audio_channel_end = 0; preset->pad_start = 0; preset->pad_end = 0; preset->x_start = 0; preset->x_end = 0; /* preset value */ preset->n_params = 0; preset->parameter_name = NULL; preset->value = NULL; } void ags_preset_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPreset *preset; GRecMutex *preset_mutex; preset = AGS_PRESET(gobject); /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); switch(prop_id){ case PROP_AUDIO: { GObject *audio; audio = (GObject *) g_value_get_object(value); g_rec_mutex_lock(preset_mutex); if(preset->audio == audio){ g_rec_mutex_unlock(preset_mutex); return; } if(preset->audio != NULL){ g_object_unref(preset->audio); } if(audio != NULL){ g_object_ref(audio); } preset->audio = audio; g_rec_mutex_unlock(preset_mutex); } break; case PROP_SCOPE: { gchar *scope; scope = g_value_get_string(value); g_rec_mutex_lock(preset_mutex); if(preset->scope != NULL){ g_free(preset->scope); } preset->scope = g_strdup(scope); g_rec_mutex_unlock(preset_mutex); } break; case PROP_PRESET_NAME: { gchar *preset_name; preset_name = g_value_get_string(value); g_rec_mutex_lock(preset_mutex); if(preset->preset_name != NULL){ g_free(preset->preset_name); } preset->preset_name = g_strdup(preset_name); g_rec_mutex_unlock(preset_mutex); } break; case PROP_AUDIO_CHANNEL_START: { g_rec_mutex_lock(preset_mutex); preset->audio_channel_start = g_value_get_uint(value); g_rec_mutex_unlock(preset_mutex); } break; case PROP_AUDIO_CHANNEL_END: { g_rec_mutex_lock(preset_mutex); preset->audio_channel_end = g_value_get_uint(value); g_rec_mutex_unlock(preset_mutex); } break; case PROP_PAD_START: { g_rec_mutex_lock(preset_mutex); preset->pad_start = g_value_get_uint(value); g_rec_mutex_unlock(preset_mutex); } break; case PROP_PAD_END: { g_rec_mutex_lock(preset_mutex); preset->pad_end = g_value_get_uint(value); g_rec_mutex_unlock(preset_mutex); } break; case PROP_X_START: { g_rec_mutex_lock(preset_mutex); preset->x_start = g_value_get_uint(value); g_rec_mutex_unlock(preset_mutex); } break; case PROP_X_END: { g_rec_mutex_lock(preset_mutex); preset->x_end = g_value_get_uint(value); g_rec_mutex_unlock(preset_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_preset_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPreset *preset; GRecMutex *preset_mutex; preset = AGS_PRESET(gobject); /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(preset_mutex); g_value_set_object(value, preset->audio); g_rec_mutex_unlock(preset_mutex); } break; case PROP_SCOPE: { g_rec_mutex_lock(preset_mutex); g_value_set_string(value, preset->scope); g_rec_mutex_unlock(preset_mutex); } break; case PROP_PRESET_NAME: { g_rec_mutex_lock(preset_mutex); g_value_set_string(value, preset->preset_name); g_rec_mutex_unlock(preset_mutex); } break; case PROP_AUDIO_CHANNEL_START: { g_rec_mutex_lock(preset_mutex); g_value_set_uint(value, preset->audio_channel_start); g_rec_mutex_unlock(preset_mutex); } break; case PROP_AUDIO_CHANNEL_END: { g_rec_mutex_lock(preset_mutex); g_value_set_uint(value, preset->audio_channel_end); g_rec_mutex_unlock(preset_mutex); } break; case PROP_PAD_START: { g_rec_mutex_lock(preset_mutex); g_value_set_uint(value, preset->pad_start); g_rec_mutex_unlock(preset_mutex); } break; case PROP_PAD_END: { g_rec_mutex_lock(preset_mutex); g_value_set_uint(value, preset->pad_end); g_rec_mutex_unlock(preset_mutex); } break; case PROP_X_START: { g_rec_mutex_lock(preset_mutex); g_value_set_uint(value, preset->x_start); g_rec_mutex_unlock(preset_mutex); } break; case PROP_X_END: { g_rec_mutex_lock(preset_mutex); g_value_set_uint(value, preset->x_end); g_rec_mutex_unlock(preset_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_preset_finalize(GObject *gobject) { AgsPreset *preset; guint i; preset = AGS_PRESET(gobject); if(preset->audio != NULL){ g_object_unref(preset->audio); } g_free(preset->scope); g_free(preset->preset_name); /* paramenter name */ g_strfreev(preset->parameter_name); /* unset value */ for(i = 0; i < preset->n_params; i++){ g_value_unset(&(preset->value[i])); } g_free(preset->value); /* call parent */ G_OBJECT_CLASS(ags_preset_parent_class)->finalize(gobject); } /** * ags_preset_get_obj_mutex: * @preset: the #AgsPreset * * Get object mutex. * * Returns: the #GRecMutex to lock @preset * * Since: 3.1.0 */ GRecMutex* ags_preset_get_obj_mutex(AgsPreset *preset) { if(!AGS_IS_PRESET(preset)){ return(NULL); } return(AGS_PRESET_GET_OBJ_MUTEX(preset)); } /** * ags_preset_test_flags: * @preset: the #AgsPreset * @flags: the flags * * Test @flags to be set on @preset. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_preset_test_flags(AgsPreset *preset, guint flags) { gboolean retval; GRecMutex *preset_mutex; if(!AGS_IS_PRESET(preset)){ return(FALSE); } /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); /* test */ g_rec_mutex_lock(preset_mutex); retval = (flags & (preset->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(preset_mutex); return(retval); } /** * ags_preset_set_flags: * @preset: the #AgsPreset * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_preset_set_flags(AgsPreset *preset, guint flags) { GRecMutex *preset_mutex; if(!AGS_IS_PRESET(preset)){ return; } /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); /* set flags */ g_rec_mutex_lock(preset_mutex); preset->flags |= flags; g_rec_mutex_unlock(preset_mutex); } /** * ags_preset_unset_flags: * @preset: the #AgsPreset * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_preset_unset_flags(AgsPreset *preset, guint flags) { GRecMutex *preset_mutex; if(!AGS_IS_PRESET(preset)){ return; } /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); /* set flags */ g_rec_mutex_lock(preset_mutex); preset->flags &= (~flags); g_rec_mutex_unlock(preset_mutex); } /** * ags_preset_get_audio: * @preset: the #AgsPreset * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ GObject* ags_preset_get_audio(AgsPreset *preset) { GObject *audio; if(!AGS_IS_PRESET(preset)){ return(NULL); } g_object_get(preset, "audio", &audio, NULL); return(audio); } /** * ags_preset_set_audio: * @preset: the #AgsPreset * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_preset_set_audio(AgsPreset *preset, GObject *audio) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "audio", audio, NULL); } /** * ags_preset_get_scope: * @preset: the #AgsPreset * * Get scope. * * Returns: the scope * * Since: 3.1.0 */ gchar* ags_preset_get_scope(AgsPreset *preset) { gchar *scope; if(!AGS_IS_PRESET(preset)){ return(NULL); } g_object_get(preset, "scope", &scope, NULL); return(scope); } /** * ags_preset_set_scope: * @preset: the #AgsPreset * @scope: the scope * * Set scope. * * Since: 3.1.0 */ void ags_preset_set_scope(AgsPreset *preset, gchar *scope) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "scope", scope, NULL); } /** * ags_preset_get_preset_name: * @preset: the #AgsPreset * * Get preset name. * * Returns: the preset name * * Since: 3.1.0 */ gchar* ags_preset_get_preset_name(AgsPreset *preset) { gchar *preset_name; if(!AGS_IS_PRESET(preset)){ return(NULL); } g_object_get(preset, "preset-name", &preset_name, NULL); return(preset_name); } /** * ags_preset_set_preset_name: * @preset: the #AgsPreset * @preset_name: the preset name * * Set preset name. * * Since: 3.1.0 */ void ags_preset_set_preset_name(AgsPreset *preset, gchar *preset_name) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "preset-name", preset_name, NULL); } /** * ags_preset_get_audio_channel_start: * @preset: the #AgsPreset * * Gets audio channel start. * * Returns: the audio channel start * * Since: 3.1.0 */ guint ags_preset_get_audio_channel_start(AgsPreset *preset) { guint audio_channel_start; if(!AGS_IS_PRESET(preset)){ return(0); } g_object_get(preset, "audio-channel-start", &audio_channel_start, NULL); return(audio_channel_start); } /** * ags_preset_set_audio_channel_start: * @preset: the #AgsPreset * @audio_channel_start: the audio channel start * * Sets audio channel start. * * Since: 3.1.0 */ void ags_preset_set_audio_channel_start(AgsPreset *preset, guint audio_channel_start) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "audio-channel-start", audio_channel_start, NULL); } /** * ags_preset_get_audio_channel_end: * @preset: the #AgsPreset * * Gets audio channel end. * * Returns: the audio channel end * * Since: 3.1.0 */ guint ags_preset_get_audio_channel_end(AgsPreset *preset) { guint audio_channel_end; if(!AGS_IS_PRESET(preset)){ return(0); } g_object_get(preset, "audio-channel-end", &audio_channel_end, NULL); return(audio_channel_end); } /** * ags_preset_set_audio_channel_end: * @preset: the #AgsPreset * @audio_channel_end: the audio channel end * * Sets audio channel end. * * Since: 3.1.0 */ void ags_preset_set_audio_channel_end(AgsPreset *preset, guint audio_channel_end) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "audio-channel-end", audio_channel_end, NULL); } /** * ags_preset_get_pad_start: * @preset: the #AgsPreset * * Gets pad start. * * Returns: the pad start * * Since: 3.1.0 */ guint ags_preset_get_pad_start(AgsPreset *preset) { guint pad_start; if(!AGS_IS_PRESET(preset)){ return(0); } g_object_get(preset, "pad-start", &pad_start, NULL); return(pad_start); } /** * ags_preset_set_pad_start: * @preset: the #AgsPreset * @pad_start: the pad start * * Sets pad start. * * Since: 3.1.0 */ void ags_preset_set_pad_start(AgsPreset *preset, guint pad_start) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "pad-start", pad_start, NULL); } /** * ags_preset_get_pad_end: * @preset: the #AgsPreset * * Gets pad end. * * Returns: the pad end * * Since: 3.1.0 */ guint ags_preset_get_pad_end(AgsPreset *preset) { guint pad_end; if(!AGS_IS_PRESET(preset)){ return(0); } g_object_get(preset, "pad-end", &pad_end, NULL); return(pad_end); } /** * ags_preset_set_pad_end: * @preset: the #AgsPreset * @pad_end: the pad end * * Sets pad end. * * Since: 3.1.0 */ void ags_preset_set_pad_end(AgsPreset *preset, guint pad_end) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "pad-end", pad_end, NULL); } /** * ags_preset_get_x_start: * @preset: the #AgsPreset * * Gets x start. * * Returns: the x start * * Since: 3.1.0 */ guint ags_preset_get_x_start(AgsPreset *preset) { guint x_start; if(!AGS_IS_PRESET(preset)){ return(0); } g_object_get(preset, "x-start", &x_start, NULL); return(x_start); } /** * ags_preset_set_x_start: * @preset: the #AgsPreset * @x_start: the x start * * Sets x start. * * Since: 3.1.0 */ void ags_preset_set_x_start(AgsPreset *preset, guint x_start) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "x-start", x_start, NULL); } /** * ags_preset_get_x_end: * @preset: the #AgsPreset * * Gets x end. * * Returns: the x end * * Since: 3.1.0 */ guint ags_preset_get_x_end(AgsPreset *preset) { guint x_end; if(!AGS_IS_PRESET(preset)){ return(0); } g_object_get(preset, "x-end", &x_end, NULL); return(x_end); } /** * ags_preset_set_x_end: * @preset: the #AgsPreset * @x_end: the x end * * Sets x end. * * Since: 3.1.0 */ void ags_preset_set_x_end(AgsPreset *preset, guint x_end) { if(!AGS_IS_PRESET(preset)){ return; } g_object_set(preset, "x-end", x_end, NULL); } /** * ags_preset_find_scope: * @preset: (element-type AgsAudio.Preset) (transfer none): the #GList-struct containing #AgsPreset * @scope: the preset's scope * * Find preset's scope in @preset. * * Returns: (element-type AgsAudio.Preset) (transfer none): the next matching #AgsPreset * * Since: 3.0.0 */ GList* ags_preset_find_scope(GList *preset, gchar *scope) { GRecMutex *preset_mutex; while(preset != NULL){ /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset->data); /* compare scope */ g_rec_mutex_lock(preset_mutex); if(!g_strcmp0(AGS_PRESET(preset->data)->scope, scope)){ g_rec_mutex_unlock(preset_mutex); return(preset); } g_rec_mutex_unlock(preset_mutex); /* iterate */ preset = preset->next; } return(NULL); } /** * ags_preset_find_name: * @preset: (element-type AgsAudio.Preset) (transfer none): the #GList-struct containing #AgsPreset * @preset_name: the preset's name * * Find preset name in @preset. * * Returns: (element-type AgsAudio.Preset) (transfer none): the next matching #AgsPreset * * Since: 3.0.0 */ GList* ags_preset_find_name(GList *preset, gchar *preset_name) { GRecMutex *preset_mutex; while(preset != NULL){ /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset->data); /* compare scope */ g_rec_mutex_lock(preset_mutex); if(!g_strcmp0(AGS_PRESET(preset->data)->preset_name, preset_name)){ g_rec_mutex_unlock(preset_mutex); return(preset); } g_rec_mutex_unlock(preset_mutex); /* iterate */ preset = preset->next; } return(NULL); } /** * ags_preset_add_parameter: * @preset: the #AgsPreset * @param_name: the parameter name * @value: the value to add * * Add parameter to @preset. * * Since: 3.0.0 */ gboolean ags_preset_add_parameter(AgsPreset *preset, gchar *param_name, GValue *value) { guint nth; guint i; gboolean found; GRecMutex *preset_mutex; if(!AGS_IS_PRESET(preset)){ return(FALSE); } /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); /* match or allocate */ g_rec_mutex_lock(preset_mutex); found = FALSE; if(preset->parameter_name == NULL){ preset->parameter_name = (gchar **) malloc(2 * sizeof(gchar *)); preset->parameter_name[0] = NULL; preset->parameter_name[1] = NULL; preset->value = g_new0(GValue, 1); g_value_init(&(preset->value[0]), G_VALUE_TYPE(value)); preset->n_params += 1; nth = 0; }else{ for(i = 0; i < preset->n_params; i++){ if(!g_strcmp0(preset->parameter_name[i], param_name)){ nth = i; found = TRUE; break; } } if(!found){ preset->parameter_name = (gchar **) realloc(preset->parameter_name, (preset->n_params + 2) * sizeof(gchar *)); preset->parameter_name[preset->n_params] = NULL; preset->parameter_name[preset->n_params + 1] = NULL; preset->value = g_renew(GValue, preset->value, preset->n_params + 1); memset(&(preset->value[preset->n_params]), 0, sizeof(GValue)); g_value_init(&(preset->value[preset->n_params]), G_VALUE_TYPE(value)); preset->n_params += 1; nth = i; } } /* set value */ g_free(preset->parameter_name[nth]); preset->parameter_name[nth] = g_strdup(param_name); g_value_copy(value, &(preset->value[nth])); g_rec_mutex_unlock(preset_mutex); return(!found); } /** * ags_preset_remove_parameter: * @preset: the #AgsPreset * @nth: the nth parameter to remove * * Remove parameter of @preset. * * Since: 3.0.0 */ void ags_preset_remove_parameter(AgsPreset *preset, guint nth) { GValue *value; gchar **parameter_name; guint i; GRecMutex *preset_mutex; if(!AGS_IS_PRESET(preset)){ return; } /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); /* check boundaries */ g_rec_mutex_lock(preset_mutex); if(preset->n_params == 0 || nth >= preset->n_params){ g_rec_mutex_unlock(preset_mutex); return; } parameter_name = preset->parameter_name; value = preset->value; if(preset->n_params == 1){ preset->parameter_name = NULL; preset->n_params = 0; }else{ preset->parameter_name = (gchar **) malloc((preset->n_params) * sizeof(gchar *)); preset->value = g_new(GValue, preset->n_params - 1); if(nth > 0){ memcpy(preset->parameter_name, parameter_name, nth * sizeof(gchar *)); memcpy(preset->value, value, nth * sizeof(GValue)); } if(nth + 1 < preset->n_params){ memcpy(&(preset->parameter_name[nth]), &(parameter_name[nth + 1]), (preset->n_params - (nth + 1)) * sizeof(gchar *)); memcpy(&(preset->value[nth]), &(value[nth + 1]), (preset->n_params - (nth + 1)) * sizeof(GValue)); } preset->n_params -= 1; preset->parameter_name[preset->n_params] = NULL; } /* free old preset array */ g_free(parameter_name[nth]); g_free(parameter_name); for(i = 0; i < preset->n_params + 1; i++){ g_value_unset(&(value[i])); } g_free(value); g_rec_mutex_unlock(preset_mutex); } /** * ags_preset_get_parameter: * @preset: the #AgsPreset * @param_name: the parameter name * @value: the return location of value * @error: the #GError-struct * * Get parameter specified by @param_name. If parameter not available * the @error is set to indicate the failure. * * Since: 3.0.0 */ void ags_preset_get_parameter(AgsPreset *preset, gchar *param_name, GValue *value, GError **error) { guint i; gboolean success; GRecMutex *preset_mutex; if(!AGS_IS_PRESET(preset)){ return; } /* get preset mutex */ preset_mutex = AGS_PRESET_GET_OBJ_MUTEX(preset); /* find */ g_rec_mutex_lock(preset_mutex); success = FALSE; if(preset->parameter_name != NULL){ for(i = 0; i < preset->n_params; i++){ if(!g_strcmp0(preset->parameter_name[i], param_name)){ g_value_copy(&(preset->value[i]), value); success = TRUE; break; } } } g_rec_mutex_unlock(preset_mutex); /* report error */ if(!success && error != NULL){ g_set_error(error, AGS_PRESET_ERROR, AGS_PRESET_ERROR_NO_SUCH_PARAMETER, "unable to find parameter: %s", param_name); } } /** * ags_preset_new: * * Create a new instance of #AgsPreset * * Returns: the new #AgsPreset * * Since: 3.0.0 */ AgsPreset* ags_preset_new() { AgsPreset *preset; preset = (AgsPreset *) g_object_new(AGS_TYPE_PRESET, NULL); return(preset); } gsequencer-3.1.3/ags/audio/ags_midi.c0000644000175000017500000005326613616617253014421 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_midi_class_init(AgsMidiClass *midi); void ags_midi_init(AgsMidi *midi); void ags_midi_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_dispose(GObject *gobject); void ags_midi_finalize(GObject *gobject); /** * SECTION:ags_midi * @short_description: Midi class supporting selection and clipboard. * @title: AgsMidi * @section_id: * @include: ags/audio/ags_midi.h * * #AgsMidi acts as a container of #AgsTrack. */ enum{ PROP_0, PROP_AUDIO, PROP_AUDIO_CHANNEL, PROP_TRACK, PROP_TIMESTAMP, }; static gpointer ags_midi_parent_class = NULL; GType ags_midi_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi = 0; static const GTypeInfo ags_midi_info = { sizeof(AgsMidiClass), NULL, NULL, (GClassInitFunc) ags_midi_class_init, NULL, NULL, sizeof(AgsMidi), 0, (GInstanceInitFunc) ags_midi_init, }; ags_type_midi = g_type_register_static(G_TYPE_OBJECT, "AgsMidi", &ags_midi_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi); } return g_define_type_id__volatile; } void ags_midi_class_init(AgsMidiClass *midi) { GObjectClass *gobject; GParamSpec *param_spec; ags_midi_parent_class = g_type_class_peek_parent(midi); gobject = (GObjectClass *) midi; gobject->set_property = ags_midi_set_property; gobject->get_property = ags_midi_get_property; gobject->dispose = ags_midi_dispose; gobject->finalize = ags_midi_finalize; /* properties */ /** * AgsMidi:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of midi"), i18n_pspec("The audio of midi"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsMidi:audio-channel: * * The midi's audio-channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("audio-channel of midi"), i18n_pspec("The numerical audio-channel of midi"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsMidi:timestamp: * * The midi's timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("timestamp of pattern"), i18n_pspec("The timestamp of pattern"), AGS_TYPE_TIMESTAMP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); /** * AgsMidi:track: (type GList(AgsTrack)) (transfer full) * * The assigned #AgsTrack * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("track", i18n_pspec("track of midi"), i18n_pspec("The track of midi"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TRACK, param_spec); } void ags_midi_init(AgsMidi *midi) { midi->flags = 0; /* midi mutex */ g_rec_mutex_init(&(midi->obj_mutex)); /* fields */ midi->audio = NULL; midi->audio_channel = 0; midi->timestamp = ags_timestamp_new(); midi->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); midi->timestamp->flags |= AGS_TIMESTAMP_OFFSET; midi->timestamp->timer.ags_offset.offset = 0; g_object_ref(midi->timestamp); midi->track = NULL; midi->selection = NULL; } void ags_midi_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidi *midi; GRecMutex *midi_mutex; midi = AGS_MIDI(gobject); /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(midi_mutex); if(midi->audio == (GObject *) audio){ g_rec_mutex_unlock(midi_mutex); return; } if(midi->audio != NULL){ g_object_unref(midi->audio); } if(audio != NULL){ g_object_ref(audio); } midi->audio = (GObject *) audio; g_rec_mutex_unlock(midi_mutex); } break; case PROP_AUDIO_CHANNEL: { guint audio_channel; audio_channel = g_value_get_uint(value); g_rec_mutex_lock(midi_mutex); midi->audio_channel = audio_channel; g_rec_mutex_unlock(midi_mutex); } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_value_get_object(value); g_rec_mutex_lock(midi_mutex); if(timestamp == (AgsTimestamp *) midi->timestamp){ g_rec_mutex_unlock(midi_mutex); return; } if(midi->timestamp != NULL){ g_object_unref(G_OBJECT(midi->timestamp)); } if(timestamp != NULL){ g_object_ref(G_OBJECT(timestamp)); } midi->timestamp = timestamp; g_rec_mutex_unlock(midi_mutex); } break; case PROP_TRACK: { AgsTrack *track; track = (AgsTrack *) g_value_get_pointer(value); g_rec_mutex_lock(midi_mutex); if(track == NULL || g_list_find(midi->track, track) != NULL){ g_rec_mutex_unlock(midi_mutex); return; } g_rec_mutex_unlock(midi_mutex); ags_midi_add_track(midi, track, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidi *midi; GRecMutex *midi_mutex; midi = AGS_MIDI(gobject); /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(midi_mutex); g_value_set_object(value, midi->audio); g_rec_mutex_unlock(midi_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(midi_mutex); g_value_set_uint(value, midi->audio_channel); g_rec_mutex_unlock(midi_mutex); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(midi_mutex); g_value_set_object(value, midi->timestamp); g_rec_mutex_unlock(midi_mutex); } break; case PROP_TRACK: { g_rec_mutex_lock(midi_mutex); g_value_set_pointer(value, g_list_copy_deep(midi->track, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(midi_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_dispose(GObject *gobject) { AgsMidi *midi; GList *list; midi = AGS_MIDI(gobject); /* audio */ if(midi->audio != NULL){ g_object_unref(midi->audio); midi->audio = NULL; } /* timestamp */ if(midi->timestamp != NULL){ g_object_unref(midi->timestamp); midi->timestamp = NULL; } /* track and selection */ list = midi->track; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(midi->track, g_object_unref); g_list_free_full(midi->selection, g_object_unref); midi->track = NULL; midi->selection = NULL; /* call parent */ G_OBJECT_CLASS(ags_midi_parent_class)->dispose(gobject); } void ags_midi_finalize(GObject *gobject) { AgsMidi *midi; midi = AGS_MIDI(gobject); /* audio */ if(midi->audio != NULL){ g_object_unref(midi->audio); } /* timestamp */ if(midi->timestamp != NULL){ g_object_unref(midi->timestamp); } /* track and selection */ g_list_free_full(midi->track, g_object_unref); g_list_free_full(midi->selection, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_midi_parent_class)->finalize(gobject); } /** * ags_midi_get_obj_mutex: * @midi: the #AgsMidi * * Get object mutex. * * Returns: the #GRecMutex to lock @midi * * Since: 3.1.0 */ GRecMutex* ags_midi_get_obj_mutex(AgsMidi *midi) { if(!AGS_IS_MIDI(midi)){ return(NULL); } return(AGS_MIDI_GET_OBJ_MUTEX(midi)); } /** * ags_midi_test_flags: * @midi: the #AgsMidi * @flags: the flags * * Test @flags to be set on @midi. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_midi_test_flags(AgsMidi *midi, guint flags) { gboolean retval; GRecMutex *midi_mutex; if(!AGS_IS_MIDI(midi)){ return(FALSE); } /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); /* test */ g_rec_mutex_lock(midi_mutex); retval = (flags & (midi->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(midi_mutex); return(retval); } /** * ags_midi_set_flags: * @midi: the #AgsMidi * @flags: the flags * * Set @flags on @midi. * * Since: 3.0.0 */ void ags_midi_set_flags(AgsMidi *midi, guint flags) { GRecMutex *midi_mutex; if(!AGS_IS_MIDI(midi)){ return; } /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); /* set */ g_rec_mutex_lock(midi_mutex); midi->flags |= flags; g_rec_mutex_unlock(midi_mutex); } /** * ags_midi_unset_flags: * @midi: the #AgsMidi * @flags: the flags * * Unset @flags on @midi. * * Since: 3.0.0 */ void ags_midi_unset_flags(AgsMidi *midi, guint flags) { GRecMutex *midi_mutex; if(!AGS_IS_MIDI(midi)){ return; } /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); /* set */ g_rec_mutex_lock(midi_mutex); midi->flags &= (~flags); g_rec_mutex_unlock(midi_mutex); } /** * ags_midi_find_near_timestamp: * @midi: (element-type AgsAudio.Midi) (transfer none): the #GList-struct containing #AgsMidi * @audio_channel: the matching audio channel * @timestamp: (allow-none): the matching timestamp, or %NULL to match any timestamp * * Retrieve appropriate midi for timestamp. * * Returns: (element-type AgsAudio.Midi) (transfer none): Next match. * * Since: 3.0.0 */ GList* ags_midi_find_near_timestamp(GList *midi, guint audio_channel, AgsTimestamp *timestamp) { AgsTimestamp *current_timestamp; GList *retval; GList *current_start, *current_end, *current; guint current_audio_channel; guint64 current_x, x; guint length, position; gboolean use_ags_offset; gboolean success; if(midi == NULL){ return(NULL); } current_start = midi; current_end = g_list_last(midi); length = g_list_length(midi); position = length / 2; current = g_list_nth(current_start, position); if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_OFFSET)){ x = ags_timestamp_get_ags_offset(timestamp); use_ags_offset = TRUE; }else if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_UNIX)){ x = ags_timestamp_get_unix_time(timestamp); use_ags_offset = FALSE; }else{ return(NULL); } retval = NULL; success = FALSE; while(!success && current != NULL){ current_x = 0; /* check current - start */ g_object_get(current_start->data, "audio-channel", ¤t_audio_channel, NULL); if(current_audio_channel == audio_channel){ if(timestamp == NULL){ retval = current_start; break; } g_object_get(current_start->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_MIDI_DEFAULT_OFFSET){ retval = current_start; break; } }else{ if(current_x >= x && current_x < x + AGS_MIDI_DEFAULT_DURATION){ retval = current_start; break; } } }else{ g_warning("inconsistent data"); } } /* check current - end */ g_object_get(current_end->data, "audio-channel", ¤t_audio_channel, NULL); if(current_audio_channel == audio_channel){ if(timestamp == NULL){ retval = current_end; break; } g_object_get(current_end->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_MIDI_DEFAULT_OFFSET){ retval = current_end; break; } }else{ if(current_x >= x && current_x < x + AGS_MIDI_DEFAULT_DURATION){ retval = current_end; break; } } }else{ g_warning("inconsistent data"); } } /* check current - center */ g_object_get(current->data, "audio-channel", ¤t_audio_channel, NULL); if(current_audio_channel == audio_channel){ if(timestamp == NULL){ retval = current; break; } g_object_get(current->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_MIDI_DEFAULT_OFFSET){ retval = current; break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_MIDI_DEFAULT_DURATION){ retval = current; break; } } }else{ g_warning("inconsistent data"); } } if(position == 0){ break; } position = position / 2; if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else{ current_start = current_start->next; current_end = current->prev; } current = g_list_nth(current_start, position); } return(retval); } /** * ags_midi_sort_func: * @a: the #AgsMidi * @b: another #AgsMidi * * Compare @a and @b. * * Returns: 0 if equal, -1 if smaller and 1 if bigger timestamp * * Since: 3.0.0 */ gint ags_midi_sort_func(gconstpointer a, gconstpointer b) { AgsTimestamp *timestamp_a, *timestamp_b; guint64 offset_a, offset_b; g_object_get(a, "timestamp", ×tamp_a, NULL); g_object_get(b, "timestamp", ×tamp_b, NULL); offset_a = ags_timestamp_get_ags_offset(timestamp_a); offset_b = ags_timestamp_get_ags_offset(timestamp_b); g_object_unref(timestamp_a); g_object_unref(timestamp_b); if(offset_a == offset_b){ return(0); }else if(offset_a < offset_b){ return(-1); }else if(offset_a > offset_b){ return(1); } return(0); } /** * ags_midi_get_audio: * @midi: the #AgsMidi * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ GObject* ags_midi_get_audio(AgsMidi *midi) { GObject *audio; if(!AGS_IS_MIDI(midi)){ return(NULL); } g_object_get(midi, "audio", &audio, NULL); return(audio); } /** * ags_midi_set_audio: * @midi: the #AgsMidi * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_midi_set_audio(AgsMidi *midi, GObject *audio) { if(!AGS_IS_MIDI(midi)){ return; } g_object_set(midi, "audio", audio, NULL); } /** * ags_midi_get_audio_channel: * @midi: the #AgsMidi * * Gets audio channel. * * Returns: the audio channel * * Since: 3.1.0 */ guint ags_midi_get_audio_channel(AgsMidi *midi) { guint audio_channel; if(!AGS_IS_MIDI(midi)){ return(0); } g_object_get(midi, "audio-channel", &audio_channel, NULL); return(audio_channel); } /** * ags_midi_set_audio_channel: * @midi: the #AgsMidi * @audio_channel: the audio channel * * Sets audio channel. * * Since: 3.1.0 */ void ags_midi_set_audio_channel(AgsMidi *midi, guint audio_channel) { if(!AGS_IS_MIDI(midi)){ return; } g_object_set(midi, "audio-channel", audio_channel, NULL); } /** * ags_midi_get_timestamp: * @midi: the #AgsMidi * * Get timestamp. * * Returns: (transfer full): the #AgsTimestamp * * Since: 3.1.0 */ AgsTimestamp* ags_midi_get_timestamp(AgsMidi *midi) { AgsTimestamp *timestamp; if(!AGS_IS_MIDI(midi)){ return(NULL); } g_object_get(midi, "timestamp", ×tamp, NULL); return(timestamp); } /** * ags_midi_set_timestamp: * @midi: the #AgsMidi * @timestamp: the #AgsTimestamp * * Set timestamp. * * Since: 3.1.0 */ void ags_midi_set_timestamp(AgsMidi *midi, AgsTimestamp *timestamp) { if(!AGS_IS_MIDI(midi)){ return; } g_object_set(midi, "timestamp", timestamp, NULL); } /** * ags_midi_get_track: * @midi: the #AgsMidi * * Get track. * * Returns: (element-type AgsAudio.Track) (transfer full): the #GList-struct containig #AgsTrack * * Since: 3.1.0 */ GList* ags_midi_get_track(AgsMidi *midi) { GList *track; if(!AGS_IS_MIDI(midi)){ return(NULL); } g_object_get(midi, "track", &track, NULL); return(track); } /** * ags_midi_set_track: * @midi: the #AgsMidi * @track: (element-type AgsAudio.Track) (transfer full): the #GList-struct containing #AgsTrack * * Set track by replacing existing. * * Since: 3.1.0 */ void ags_midi_set_track(AgsMidi *midi, GList *track) { GList *start_track; GRecMutex *midi_mutex; if(!AGS_IS_MIDI(midi)){ return; } /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); g_rec_mutex_lock(midi_mutex); start_track = midi->track; midi->track = track; g_rec_mutex_unlock(midi_mutex); g_list_free_full(start_track, (GDestroyNotify) g_object_unref); } /** * ags_midi_add: * @midi: (element-type AgsAudio.Midi) (transfer none): the #GList-struct containing #AgsMidi * @new_midi: the midi to add * * Add @new_midi sorted to @midi * * Returns: (element-type AgsAudio.Midi) (transfer none): the new beginning of @midi * * Since: 3.0.0 */ GList* ags_midi_add(GList *midi, AgsMidi *new_midi) { if(!AGS_IS_MIDI(new_midi)){ return(midi); } midi = g_list_insert_sorted(midi, new_midi, ags_midi_sort_func); return(midi); } /** * ags_midi_add_track: * @midi: an #AgsMidi * @track: the #AgsTrack to add * @use_selection_list: if %TRUE add to selection, else to default midi * * Adds a track to midi. * * Since: 3.0.0 */ void ags_midi_add_track(AgsMidi *midi, AgsTrack *track, gboolean use_selection_list) { GRecMutex *midi_mutex; if(!AGS_IS_MIDI(midi) || !AGS_IS_TRACK(track)){ return; } /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); /* insert sorted */ g_object_ref(track); g_rec_mutex_lock(midi_mutex); if(use_selection_list){ midi->selection = g_list_insert_sorted(midi->selection, track, (GCompareFunc) ags_track_sort_func); ags_track_set_flags(track, AGS_TRACK_IS_SELECTED); }else{ midi->track = g_list_insert_sorted(midi->track, track, (GCompareFunc) ags_track_sort_func); } g_rec_mutex_unlock(midi_mutex); } /** * ags_midi_remove_track: * @midi: an #AgsMidi * @track: the #AgsTrack to remove * @use_selection_list: if %TRUE remove from selection, else from default midi * * Removes a track from midi. * * Since: 3.0.0 */ void ags_midi_remove_track(AgsMidi *midi, AgsTrack *track, gboolean use_selection_list) { GRecMutex *midi_mutex; if(!AGS_IS_MIDI(midi) || !AGS_IS_TRACK(track)){ return; } /* get midi mutex */ midi_mutex = AGS_MIDI_GET_OBJ_MUTEX(midi); /* remove if found */ g_rec_mutex_lock(midi_mutex); if(!use_selection_list){ if(g_list_find(midi->track, track) != NULL){ midi->track = g_list_remove(midi->track, track); g_object_unref(track); } }else{ if(g_list_find(midi->selection, track) != NULL){ midi->selection = g_list_remove(midi->selection, track); g_object_unref(track); } } g_rec_mutex_unlock(midi_mutex); } /** * ags_midi_new: * @audio: the assigned #AgsAudio * @audio_channel: the audio channel to be used * * Creates a new instance of #AgsMidi. * * Returns: the new #AgsMidi * * Since: 3.0.0 */ AgsMidi* ags_midi_new(GObject *audio, guint audio_channel) { AgsMidi *midi; midi = (AgsMidi *) g_object_new(AGS_TYPE_MIDI, "audio", audio, "audio-channel", audio_channel, NULL); return(midi); } gsequencer-3.1.3/ags/audio/ags_audio.c0000644000175000017500000112246313616617253014575 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:ags_audio * @short_description: A container of channels organizing them as input or output * @title: AgsAudio * @section_id: * @include: ags/audio/ags_audio.h * * #AgsAudio organizes #AgsChannel objects either as input or output and * is responsible of their alignment. The class can contain #AgsRecall objects * in order to perform computation on all channels or in audio context. * Therefor exists #AgsRecyclingContext acting as tree context. * * At least one #AgsRecallID is assigned to it and has one more if * %AGS_AUDIO_OUTPUT_HAS_RECYCLING is set as flag. * * If %AGS_AUDIO_HAS_NOTATION is set as flag one #AgsNotation is allocated per audio * channel. */ void ags_audio_class_init(AgsAudioClass *audio_class); void ags_audio_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_init(AgsAudio *audio); void ags_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_dispose(GObject *gobject); void ags_audio_finalize(GObject *gobject); AgsUUID* ags_audio_get_uuid(AgsConnectable *connectable); gboolean ags_audio_has_resource(AgsConnectable *connectable); gboolean ags_audio_is_ready(AgsConnectable *connectable); void ags_audio_add_to_registry(AgsConnectable *connectable); void ags_audio_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_xml_compose(AgsConnectable *connectable); void ags_audio_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_is_connected(AgsConnectable *connectable); void ags_audio_connect(AgsConnectable *connectable); void ags_audio_disconnect(AgsConnectable *connectable); void ags_audio_set_ability_flags_channel(AgsChannel *start_channel, guint ability_flags); void ags_audio_unset_ability_flags_channel(AgsChannel *start_channel, guint ability_flags); void ags_audio_set_audio_channels_grow(AgsAudio *audio, GType channel_type, guint audio_channels, guint audio_channels_old, guint bank_dim_0, guint bank_dim_1, guint bank_dim_2, gboolean add_recycling, gboolean add_pattern, gboolean add_synth_generator, gboolean link_recycling, gboolean set_sync_link, gboolean set_async_link); void ags_audio_set_audio_channels_shrink_zero(AgsAudio *audio); void ags_audio_set_audio_channels_shrink(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void ags_audio_set_audio_channels_shrink_notation(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void ags_audio_set_audio_channels_shrink_automation(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void ags_audio_set_audio_channels_shrink_wave(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void ags_audio_set_audio_channels_shrink_midi(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void ags_audio_real_set_audio_channels(AgsAudio *audio, guint audio_channels, guint audio_channels_old); void ags_audio_set_pads_grow(AgsAudio *audio, GType channel_type, guint pads, guint pads_old, guint bank_dim_0, guint bank_dim_1, guint bank_dim_2, gboolean add_recycling, gboolean add_pattern, gboolean add_synth_generator, gboolean link_recycling, gboolean set_sync_link, gboolean set_async_link); void ags_audio_set_pads_unlink(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_set_pads_shrink_zero(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_set_pads_shrink(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_set_pads_remove_notes(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_set_pads_shrink_automation(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_set_pads_shrink_wave(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_set_pads_shrink_midi(AgsAudio *audio, GType channel_type, guint pads); void ags_audio_real_set_pads(AgsAudio *audio, GType channel_type, guint channels, guint channels_old); void ags_audio_set_samplerate_channel(AgsChannel *start_channel, guint samplerate); void ags_audio_set_buffer_size_channel(AgsChannel *start_channel, guint buffer_size); void ags_audio_set_format_channel(AgsChannel *start_channel, guint format); void ags_audio_real_duplicate_recall(AgsAudio *audio, AgsRecallID *recall_id, guint pad, guint audio_channel, guint line); void ags_audio_real_resolve_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_real_init_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags); void ags_audio_real_play_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags); void ags_audio_real_done_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_real_cancel_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_real_cleanup_recall(AgsAudio *audio, AgsRecallID *recall_id); void ags_audio_recall_done_callback(AgsRecall *recall, AgsAudio *audio); GList* ags_audio_real_start(AgsAudio *audio, gint sound_scope); void ags_audio_real_stop(AgsAudio *audio, GList *recall_id, gint sound_scope); GList* ags_audio_real_check_scope(AgsAudio *audio, gint sound_scope); void ags_audio_set_property_all(AgsAudio *audio, gint n_params, const gchar *parameter_name[], const GValue value[]); void ags_audio_recursive_set_property_down(AgsChannel *channel, gint n_params, const gchar *parameter_name[], const GValue value[]); void ags_audio_recursive_set_property_down_input(AgsChannel *channel, gint n_params, const gchar *parameter_name[], const GValue value[]); void ags_audio_real_recursive_run_stage(AgsAudio *audio, gint sound_scope, guint stage); enum{ SET_AUDIO_CHANNELS, SET_PADS, DUPLICATE_RECALL, RESOLVE_RECALL, INIT_RECALL, PLAY_RECALL, DONE_RECALL, CANCEL_RECALL, CLEANUP_RECALL, START, STOP, CHECK_SCOPE, RECURSIVE_RUN_STAGE, LAST_SIGNAL, }; enum{ PROP_0, PROP_AUDIO_NAME, PROP_OUTPUT_SOUNDCARD, PROP_INPUT_SOUNDCARD, PROP_OUTPUT_SEQUENCER, PROP_INPUT_SEQUENCER, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_BPM, PROP_MIN_AUDIO_CHANNELS, PROP_MAX_AUDIO_CHANNELS, PROP_MIN_OUTPUT_PADS, PROP_MAX_OUTPUT_PADS, PROP_MIN_INPUT_PADS, PROP_MAX_INPUT_PADS, PROP_AUDIO_CHANNELS, PROP_OUTPUT_PADS, PROP_OUTPUT_LINES, PROP_INPUT_PADS, PROP_INPUT_LINES, PROP_AUDIO_START_MAPPING, PROP_AUDIO_END_MAPPING, PROP_MIDI_START_MAPPING, PROP_MIDI_END_MAPPING, PROP_MIDI_CHANNEL, PROP_NUMERATOR, PROP_DENOMINATOR, PROP_TIME_SIGNATURE, PROP_IS_MINOR, PROP_SHARP_FLATS, PROP_OCTAVE, PROP_KEY, PROP_ABSOLUTE_KEY, PROP_LOOP_START, PROP_LOOP_END, PROP_OFFSET, PROP_OUTPUT, PROP_INPUT, PROP_PRESET, PROP_SYNTH_GENERATOR, PROP_PLAYBACK_DOMAIN, PROP_CURSOR, PROP_NOTATION, PROP_AUTOMATION, PROP_WAVE, PROP_OUTPUT_AUDIO_FILE, PROP_INPUT_AUDIO_FILE, PROP_MIDI, PROP_OUTPUT_MIDI_FILE, PROP_INPUT_MIDI_FILE, PROP_RECALL_ID, PROP_RECYCLING_CONTEXT, PROP_RECALL_CONTAINER, PROP_PLAY, PROP_RECALL, }; static gpointer ags_audio_parent_class = NULL; static guint audio_signals[LAST_SIGNAL]; GType ags_audio_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio = 0; static const GTypeInfo ags_audio_info = { sizeof(AgsAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio = g_type_register_static(G_TYPE_OBJECT, "AgsAudio", &ags_audio_info, 0); g_type_add_interface_static(ags_type_audio, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio); } return g_define_type_id__volatile; } void ags_audio_class_init(AgsAudioClass *audio) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_parent_class = g_type_class_peek_parent(audio); /* GObjectClass */ gobject = (GObjectClass *) audio; gobject->set_property = ags_audio_set_property; gobject->get_property = ags_audio_get_property; gobject->dispose = ags_audio_dispose; gobject->finalize = ags_audio_finalize; /* properties */ /** * AgsAudio:audio-name: * * The name of audio object. * * Since: 3.0.0 */ param_spec = g_param_spec_string("audio-name", i18n_pspec("assigned name"), i18n_pspec("The name of audio"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_NAME, param_spec); /** * AgsAudio:output-soundcard: * * The assigned #AgsSoundcard acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-soundcard", i18n_pspec("assigned output soundcard"), i18n_pspec("The output soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD, param_spec); /** * AgsAudio:input-soundcard: * * The assigned #AgsSoundcard acting as default source. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-soundcard", i18n_pspec("assigned input soundcard"), i18n_pspec("The input soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD, param_spec); /** * AgsAudio:output-sequencer: * * The assigned #AgsSequencer acting as default source. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-sequencer", i18n_pspec("assigned output sequencer"), i18n_pspec("The output sequencer it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SEQUENCER, param_spec); /** * AgsAudio:input-sequencer: * * The assigned #AgsSequencer acting as default source. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-sequencer", i18n_pspec("assigned input sequencer"), i18n_pspec("The input sequencer it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SEQUENCER, param_spec); /** * AgsAudio:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsAudio:buffer-size: * * The buffer length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsAudio:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsAudio:bpm: * * The bpm. * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("bpm"), i18n_pspec("The bpm"), 0.0, G_MAXDOUBLE, AGS_SOUNDCARD_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsAudio:min-audio-channels: * * The minimum audio channels count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("min-audio-channels", i18n_pspec("minimum audio channels count"), i18n_pspec("The minimum count of audio channels of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIN_AUDIO_CHANNELS, param_spec); /** * AgsAudio:max-audio-channels: * * The maximum audio channels count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("max-audio-channels", i18n_pspec("maximum audio channels count"), i18n_pspec("The maximum count of audio channels of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAX_AUDIO_CHANNELS, param_spec); /** * AgsAudio:min-output-pads: * * The minimum output pads count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("min-output-pads", i18n_pspec("minimum output pads count"), i18n_pspec("The minimum count of output pads of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIN_OUTPUT_PADS, param_spec); /** * AgsAudio:max-output-pads: * * The maximum output pads count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("max-output-pads", i18n_pspec("maximum output pads count"), i18n_pspec("The maximum count of output pads of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAX_OUTPUT_PADS, param_spec); /** * AgsAudio:min-input-pads: * * The minimum input pads count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("min-input-pads", i18n_pspec("minimum input pads count"), i18n_pspec("The minimum count of input pads of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIN_INPUT_PADS, param_spec); /** * AgsAudio:max-input-pads: * * The maximum input pads count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("max-input-pads", i18n_pspec("maximum input pads count"), i18n_pspec("The maximum count of input pads of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAX_INPUT_PADS, param_spec); /** * AgsAudio:audio-channels: * * The audio channels count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channels", i18n_pspec("audio channels count"), i18n_pspec("The count of audio channels of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNELS, param_spec); /** * AgsAudio:output-pads: * * The output pads count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("output-pads", i18n_pspec("output pads count"), i18n_pspec("The count of output pads of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_PADS, param_spec); /** * AgsAudio:output-lines: * * The output lines count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("output-lines", i18n_pspec("output lines count"), i18n_pspec("The count of output lines of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_OUTPUT_LINES, param_spec); /** * AgsAudio:input-pads: * * The input pads count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("input-pads", i18n_pspec("input pads count"), i18n_pspec("The count of input pads of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_PADS, param_spec); /** * AgsAudio:input-lines: * * The input lines count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("input-lines", i18n_pspec("input lines count"), i18n_pspec("The count of input lines of audio"), 0, G_MAXUINT32, 0, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_INPUT_LINES, param_spec); /** * AgsAudio:audio-start-mapping: * * The audio start mapping. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-start-mapping", i18n_pspec("audio start mapping"), i18n_pspec("The audio start mapping"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_START_MAPPING, param_spec); /** * AgsAudio:audio-end-mapping: * * The audio end mapping. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-end-mapping", i18n_pspec("audio end mapping"), i18n_pspec("The audio end mapping"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_END_MAPPING, param_spec); /** * AgsAudio:midi-start-mapping: * * The midi start mapping. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("midi-start-mapping", i18n_pspec("midi start mapping range"), i18n_pspec("The midi mapping range's start"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_START_MAPPING, param_spec); /** * AgsAudio:midi-end-mapping: * * The midi end mapping. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("midi-end-mapping", i18n_pspec("midi end mapping range"), i18n_pspec("The midi mapping range's start"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_END_MAPPING, param_spec); /** * AgsAudio:midi-channel: * * The midi channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("midi-channel", i18n_pspec("midi channel"), i18n_pspec("The midi channel"), 0, 16, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_CHANNEL, param_spec); /** * AgsAudio:numerator: * * The numerator of time signature. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("numerator", i18n_pspec("numerator"), i18n_pspec("The numerator"), 0, 32, 4, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NUMERATOR, param_spec); /** * AgsAudio:denominator: * * The denominator of time signature. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("denominator", i18n_pspec("denominator"), i18n_pspec("The denominator"), 0, 32, 4, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DENOMINATOR, param_spec); /** * AgsAudio:time-signature: * * The time signature. * * Since: 3.0.0 */ param_spec = g_param_spec_string("time-signature", i18n_pspec("time signature"), i18n_pspec("The time signature"), "4/4", G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_TIME_SIGNATURE, param_spec); /** * AgsAudio:is-minor: * * Is minor. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("is-minor", i18n_pspec("is minor"), i18n_pspec("Is minor"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IS_MINOR, param_spec); /** * AgsAudio:sharp-flats: * * The sharp/flats count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("sharp-flats", i18n_pspec("sharp/flats"), i18n_pspec("The sharp/flats count"), 0, 12, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SHARP_FLATS, param_spec); /** * AgsAudio:octave: * * The octave lower. * * Since: 3.0.0 */ param_spec = g_param_spec_int("octave", i18n_pspec("octave"), i18n_pspec("The octave lower"), 0, 10, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OCTAVE, param_spec); /** * AgsAudio:key: * * The key relative to octave. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("key", i18n_pspec("relative key"), i18n_pspec("The key relative to octave"), 0, 12, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_KEY, param_spec); /** * AgsAudio:absolute-key: * * The absolute key lower. * * Since: 3.0.0 */ param_spec = g_param_spec_int("absolute-key", i18n_pspec("absolute key"), i18n_pspec("The absolute key lower"), 0, 128, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ABSOLUTE_KEY, param_spec); /** * AgsAudio:loop-start: * * The audio's loop start. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("loop-start", i18n_pspec("loop start of audio"), i18n_pspec("The loop start of audio"), 0.0, G_MAXUINT64, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_START, param_spec); /** * AgsAudio:loop-end: * * The audio's loop end. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("loop-end", i18n_pspec("loop end of audio"), i18n_pspec("The loop end of audio"), 0.0, G_MAXUINT64, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_END, param_spec); /** * AgsAudio:offset: * * The audio's offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("offset", i18n_pspec("offset of audio"), i18n_pspec("The offset of audio"), 0.0, G_MAXUINT64, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OFFSET, param_spec); /** * AgsAudio:output: * * The #AgsOutput it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output", i18n_pspec("containing output"), i18n_pspec("The output it contains"), AGS_TYPE_OUTPUT, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_OUTPUT, param_spec); /** * AgsAudio:input: * * The #AgsInput it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input", i18n_pspec("containing input"), i18n_pspec("The input it contains"), AGS_TYPE_INPUT, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_INPUT, param_spec); /** * AgsAudio:preset: (type GList(AgsPreset)) (transfer full) * * The assigned #GList-struct containing #AgsPreset information. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("preset", i18n_pspec("preset"), i18n_pspec("The preset"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /** * AgsAudio:synth_generator: (type GList(AgsSynthGenerator)) (transfer full) * * The assigned #GList-struct containing #AgsSynthGenerator information. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("synth-generator", i18n_pspec("synth generator"), i18n_pspec("The synth generator"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SYNTH_GENERATOR, param_spec); /** * AgsAudio:playback-domain: * * The assigned #AgsPlaybackDomain. * * Since: 3.0.0 */ param_spec = g_param_spec_object("playback-domain", i18n_pspec("assigned playback domain"), i18n_pspec("The assigned playback domain"), AGS_TYPE_PLAYBACK_DOMAIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAYBACK_DOMAIN, param_spec); /** * AgsAudio:cursor: (type GList(GObject)) (transfer full) * * The #GObject implementing #AgsCursor interface. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("cursor", i18n_pspec("cursor"), i18n_pspec("The cursor object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CURSOR, param_spec); /** * AgsAudio:notation: (type GList(AgsNotation)) (transfer full) * * The #AgsNotation it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("notation", i18n_pspec("containing notation"), i18n_pspec("The notation it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /** * AgsAudio:automation: (type GList(AgsAutomation)) (transfer full) * * The #AgsAutomation it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("automation", i18n_pspec("containing automation"), i18n_pspec("The automation it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUTOMATION, param_spec); /** * AgsAudio:wave: (type GList(AgsWave)) (transfer full) * * The #AgsWave it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("wave", i18n_pspec("containing wave"), i18n_pspec("The wave it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE, param_spec); /** * AgsAudio:output-audio-file: * * The assigned #AgsAudioFile acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-audio-file", i18n_pspec("assigned output audio file"), i18n_pspec("The output audio file it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_AUDIO_FILE, param_spec); /** * AgsAudio:input-audio-file: * * The assigned #AgsAudioFile acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-audio-file", i18n_pspec("assigned input audio file"), i18n_pspec("The input audio file it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_AUDIO_FILE, param_spec); /** * AgsAudio:midi: (type GList(AgsMidi)) (transfer full) * * The #AgsMidi it contains. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("midi", i18n_pspec("containing midi"), i18n_pspec("The midi it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI, param_spec); /** * AgsAudio:output-midi-file: * * The assigned #AgsMidiFile acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-midi-file", i18n_pspec("assigned output midi file"), i18n_pspec("The output midi file it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_MIDI_FILE, param_spec); /** * AgsAudio:input-midi-file: * * The assigned #AgsMidiFile acting as default sink. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-midi-file", i18n_pspec("assigned input midi file"), i18n_pspec("The input midi file it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_MIDI_FILE, param_spec); /** * AgsAudio:recall-id: (type GList(AgsRecallID)) (transfer full) * * The assigned #AgsRecallID. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-id", i18n_pspec("assigned recall id"), i18n_pspec("The assigned recall id"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_ID, param_spec); /** * AgsAudio:recycling-context: (type GList(AgsRecyclingContext)) (transfer full) * * The assigned #AgsRecyclingContext. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recycling-context", i18n_pspec("assigned recycling context"), i18n_pspec("The assigned recall id"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECYCLING_CONTEXT, param_spec); /** * AgsAudio:recall-container: (type GList(AgsRecallContainer)) (transfer full) * * The #AgsRecallContainer it contains in container-context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-container", i18n_pspec("containing recall container"), i18n_pspec("The recall container it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CONTAINER, param_spec); /** * AgsAudio:play: (type GList(AgsRecall)) (transfer full) * * The #AgsRecall it contains in play-context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("play", i18n_pspec("containing play"), i18n_pspec("The play it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAY, param_spec); /** * AgsAudio:recall: (type GList(AgsRecall)) (transfer full) * * The #AgsRecall it contains in recall-context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall", i18n_pspec("containing recall"), i18n_pspec("The recall it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL, param_spec); /* AgsAudioClass */ audio->set_audio_channels = ags_audio_real_set_audio_channels; audio->set_pads = ags_audio_real_set_pads; audio->duplicate_recall = ags_audio_real_duplicate_recall; audio->resolve_recall = ags_audio_real_resolve_recall; audio->init_recall = ags_audio_real_init_recall; audio->play_recall = ags_audio_real_play_recall; audio->done_recall = ags_audio_real_done_recall; audio->cancel_recall = ags_audio_real_cancel_recall; audio->cleanup_recall = ags_audio_real_cleanup_recall; audio->start = ags_audio_real_start; audio->stop = ags_audio_real_stop; audio->check_scope = ags_audio_real_check_scope; audio->recursive_run_stage = ags_audio_real_recursive_run_stage; /* signals */ /** * AgsAudio::set-audio-channels: * @audio: the object to adjust the channels. * @audio_channels_new: new audio channel count * @audio_channels_old: old audio channel count * * The ::set-audio-channels signal notifies about changes in channel * alignment. * * Since: 3.0.0 */ audio_signals[SET_AUDIO_CHANNELS] = g_signal_new("set-audio-channels", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, set_audio_channels), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsAudio::set-pads: * @audio: the object to adjust pads. * @channel_type: either #AGS_TYPE_INPUT or #AGS_TYPE_OUTPUT * @pads_new: new pad count * @pads_old: old pad count * * The ::set-pads signal notifies about changes in channel * alignment. * * Since: 3.0.0 */ audio_signals[SET_PADS] = g_signal_new("set-pads", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, set_pads), NULL, NULL, ags_cclosure_marshal_VOID__ULONG_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_ULONG, G_TYPE_UINT, G_TYPE_UINT); /** * AgsAudio::duplicate-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * @pad: the pad * @audio_channel: the audio channel * @line: the line * * The ::duplicate-recall signal notifies about duplicated recalls. * * Since: 3.0.0 */ audio_signals[DUPLICATE_RECALL] = g_signal_new("duplicate-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, duplicate_recall), NULL, NULL, ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_OBJECT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsAudio::resolve-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * * The ::resolve-recall signal notifies about resolved recalls. * * Since: 3.0.0 */ audio_signals[RESOLVE_RECALL] = g_signal_new("resolve-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, resolve_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsAudio::init-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * @staging_flags: the staging flags * * The ::init-recall signal notifies about initd recalls. * * Since: 3.0.0 */ audio_signals[INIT_RECALL] = g_signal_new("init-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, init_recall), NULL, NULL, ags_cclosure_marshal_VOID__OBJECT_UINT, G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_UINT); /** * AgsAudio::play-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * @staging_flags: the staging flags * * The ::play-recall signal notifies about playd recalls. * * Since: 3.0.0 */ audio_signals[PLAY_RECALL] = g_signal_new("play-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, play_recall), NULL, NULL, ags_cclosure_marshal_VOID__OBJECT_UINT, G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_UINT); /** * AgsAudio::done-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * * The ::done-recall signal notifies about doned recalls. * * Since: 3.0.0 */ audio_signals[DONE_RECALL] = g_signal_new("done-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, done_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsAudio::cancel-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * * The ::cancel-recall signal notifies about canceld recalls. * * Since: 3.0.0 */ audio_signals[CANCEL_RECALL] = g_signal_new("cancel-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, cancel_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsAudio::cleanup-recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * * The ::cleanup-recall signal notifies about cleanup recalls. * * Since: 3.0.0 */ audio_signals[CLEANUP_RECALL] = g_signal_new("cleanup-recall", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, cleanup_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsAudio::start: * @audio: the #AgsAudio starts playing * @sound_scope: the affected scope * * The ::start signal is invoked while starting playback * of @audio. * * Returns: the #GList-struct containing #AgsRecallID * * Since: 3.0.0 */ audio_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, start), NULL, NULL, ags_cclosure_marshal_POINTER__INT, G_TYPE_POINTER, 1, G_TYPE_INT); /** * AgsAudio::stop: * @audio: the #AgsAudio stops playing * @recall_id: a #GList-struct containing #AgsRecallID * @sound_scope: the affected scope * * The ::stop signal is invoked while stoping playback * of @audio. * * Since: 3.0.0 */ audio_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, stop), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_INT, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT); /** * AgsAudio::check-scope: * @audio: the #AgsAudio to check the scopes * @sound_scope: the affected scope * * The ::check-scope method returns the appropriate recall id of @sound_scope. * * Returns: the #GList-struct containing #AgsRecallID * * Since: 3.0.0 */ audio_signals[CHECK_SCOPE] = g_signal_new("check-scope", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, check_scope), NULL, NULL, ags_cclosure_marshal_POINTER__INT, G_TYPE_POINTER, 1, G_TYPE_INT); /** * AgsAudio::recursive-run-stage: * @audio: the #AgsAudio to run * @sound_scope: the affected scope * @staging_flags: the flags to set * * The ::recursive-run-stage signal is invoked while run staging * of @audio for @sound_scope. * * Since: 3.0.0 */ audio_signals[RECURSIVE_RUN_STAGE] = g_signal_new("recursive-run-stage", G_TYPE_FROM_CLASS(audio), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsAudioClass, recursive_run_stage), NULL, NULL, ags_cclosure_marshal_VOID__INT_UINT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_UINT); } void ags_audio_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_get_uuid; connectable->has_resource = ags_audio_has_resource; connectable->is_ready = ags_audio_is_ready; connectable->add_to_registry = ags_audio_add_to_registry; connectable->remove_from_registry = ags_audio_remove_from_registry; connectable->list_resource = ags_audio_list_resource; connectable->xml_compose = ags_audio_xml_compose; connectable->xml_parse = ags_audio_xml_parse; connectable->is_connected = ags_audio_is_connected; connectable->connect = ags_audio_connect; connectable->disconnect = ags_audio_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_init(AgsAudio *audio) { AgsConfig *config; gchar *str; gchar *str0, *str1; audio->flags = 0; audio->ability_flags = 0; audio->behaviour_flags = 0; memset(audio->staging_flags, 0, (AGS_SOUND_SCOPE_LAST + 1) * sizeof(guint)); /* audio mutex */ g_rec_mutex_init(&(audio->obj_mutex)); /* uuid */ audio->uuid = ags_uuid_alloc(); ags_uuid_generate(audio->uuid); audio->audio_name = NULL; /* config */ config = ags_config_get_instance(); /* base init */ audio->output_soundcard = NULL; audio->output_soundcard_channel_map = NULL; audio->input_soundcard = NULL; audio->input_soundcard_channel_map = NULL; audio->output_sequencer = NULL; audio->input_sequencer = NULL; audio->samplerate = ags_soundcard_helper_config_get_samplerate(config); audio->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); audio->format = ags_soundcard_helper_config_get_format(config); audio->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* bank */ audio->bank_dim[0] = 0; audio->bank_dim[1] = 0; audio->bank_dim[2] = 0; /* channel allocation */ audio->max_audio_channels = G_MAXUINT32; audio->min_audio_channels = 0; audio->max_output_pads = G_MAXUINT32; audio->min_output_pads = 0; audio->max_input_pads = G_MAXUINT32; audio->min_input_pads = 0; audio->audio_channels = 0; audio->output_pads = 0; audio->output_lines = 0; audio->input_pads = 0; audio->input_lines = 0; /* midi mapping */ audio->audio_start_mapping = 0; audio->audio_end_mapping = 0; audio->midi_start_mapping = 0; audio->midi_end_mapping = 0; audio->midi_channel = 0; /* time-signature */ audio->numerator = 4; audio->denominator = 4; audio->time_signature = g_strdup("4/4"); /* sharp/flats */ audio->is_minor = FALSE; audio->sharp_flats = 0; /* octave */ audio->octave = 0; audio->key = 0; audio->absolute_key = 0; /* loop */ audio->loop_start = 0; audio->loop_end = 0; audio->offset = 0; /* channels */ audio->output = NULL; audio->input = NULL; /* preset */ audio->preset = NULL; /* playback domain */ audio->playback_domain = (GObject *) ags_playback_domain_new((GObject *) audio); g_object_ref(audio->playback_domain); /* synth generator */ audio->synth_generator = NULL; /* * Storage objects */ /* cursor */ audio->cursor = NULL; /* notation */ audio->notation = NULL; /* automation */ audio->automation_port = NULL; audio->automation = NULL; /* wave */ audio->wave = NULL; audio->output_audio_file = NULL; audio->input_audio_file = NULL; /* midi */ audio->midi = NULL; audio->output_midi_file = NULL; audio->input_midi_file = NULL; /* recycling context */ audio->recall_id = NULL; audio->recycling_context = NULL; audio->recall_container = NULL; /* play context */ g_rec_mutex_init(&(audio->play_mutex)); audio->play = NULL; /* recall context */ g_rec_mutex_init(&(audio->recall_mutex)); audio->recall = NULL; /* data */ audio->machine_widget = NULL; } void ags_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudio *audio; GRecMutex *audio_mutex; audio = AGS_AUDIO(gobject); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); switch(prop_id){ case PROP_AUDIO_NAME: { gchar *audio_name; audio_name = g_value_get_string(value); g_rec_mutex_lock(audio_mutex); audio->audio_name = g_strdup(audio_name); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); ags_audio_set_output_soundcard(audio, (GObject *) soundcard); } break; case PROP_INPUT_SOUNDCARD: { GObject *soundcard; soundcard = g_value_get_object(value); ags_audio_set_input_soundcard(audio, (GObject *) soundcard); } break; case PROP_OUTPUT_SEQUENCER: { GObject *sequencer; sequencer = g_value_get_object(value); ags_audio_set_output_sequencer(audio, (GObject *) sequencer); } break; case PROP_INPUT_SEQUENCER: { GObject *sequencer; sequencer = g_value_get_object(value); ags_audio_set_input_sequencer(audio, (GObject *) sequencer); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_audio_set_samplerate(audio, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_audio_set_buffer_size(audio, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_audio_set_format(audio, format); } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(audio_mutex); audio->bpm = bpm; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIN_AUDIO_CHANNELS: { guint min_audio_channels; min_audio_channels = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->min_audio_channels = min_audio_channels; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MAX_AUDIO_CHANNELS: { guint max_audio_channels; max_audio_channels = g_value_get_uint(value); ags_audio_set_max_audio_channels(audio, max_audio_channels); } break; case PROP_MIN_OUTPUT_PADS: { guint min_output_pads; min_output_pads = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->min_output_pads = min_output_pads; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MAX_OUTPUT_PADS: { guint max_output_pads; max_output_pads = g_value_get_uint(value); ags_audio_set_max_pads(audio, AGS_TYPE_OUTPUT, max_output_pads); } break; case PROP_MIN_INPUT_PADS: { guint min_input_pads; min_input_pads = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->min_input_pads = min_input_pads; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MAX_INPUT_PADS: { guint max_input_pads; max_input_pads = g_value_get_uint(value); ags_audio_set_max_pads(audio, AGS_TYPE_INPUT, max_input_pads); } break; case PROP_AUDIO_CHANNELS: { guint audio_channels; audio_channels = g_value_get_uint(value); ags_audio_set_audio_channels(audio, audio_channels, 0); } break; case PROP_OUTPUT_PADS: { guint output_pads; output_pads = g_value_get_uint(value); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, output_pads, 0); } break; case PROP_INPUT_PADS: { guint input_pads; input_pads = g_value_get_uint(value); ags_audio_set_pads(audio, AGS_TYPE_INPUT, input_pads, 0); } break; case PROP_AUDIO_START_MAPPING: { guint audio_start_mapping; audio_start_mapping = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->audio_start_mapping = audio_start_mapping; g_rec_mutex_unlock(audio_mutex); } break; case PROP_AUDIO_END_MAPPING: { guint audio_end_mapping; audio_end_mapping = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->audio_end_mapping = audio_end_mapping; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI_START_MAPPING: { guint midi_start_mapping; midi_start_mapping = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->midi_start_mapping = midi_start_mapping; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI_END_MAPPING: { guint midi_end_mapping; midi_end_mapping = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->midi_end_mapping = midi_end_mapping; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI_CHANNEL: { guint midi_channel; midi_channel = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->midi_channel = midi_channel; g_rec_mutex_unlock(audio_mutex); } break; case PROP_NUMERATOR: { guint numerator; numerator = g_value_get_uint(value); /* numerator and time signature */ g_rec_mutex_lock(audio_mutex); audio->numerator = numerator; g_free(audio->time_signature); audio->time_signature = g_strdup_printf("%u/%u", audio->numerator, audio->denominator); g_rec_mutex_unlock(audio_mutex); } break; case PROP_DENOMINATOR: { guint denominator; denominator = g_value_get_uint(value); /* denominator and time signature */ g_rec_mutex_lock(audio_mutex); audio->denominator = denominator; g_free(audio->time_signature); audio->time_signature = g_strdup_printf("%u/%u", audio->numerator, audio->denominator); g_rec_mutex_unlock(audio_mutex); } break; case PROP_IS_MINOR: { gboolean is_minor; is_minor = g_value_get_boolean(value); g_rec_mutex_lock(audio_mutex); audio->is_minor = is_minor; g_rec_mutex_unlock(audio_mutex); } break; case PROP_SHARP_FLATS: { guint sharp_flats; sharp_flats = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->sharp_flats = sharp_flats; g_rec_mutex_unlock(audio_mutex); } break; case PROP_OCTAVE: { gint octave; octave = g_value_get_int(value); g_rec_mutex_lock(audio_mutex); audio->octave = octave; g_rec_mutex_unlock(audio_mutex); } break; case PROP_KEY: { guint key; key = g_value_get_uint(value); g_rec_mutex_lock(audio_mutex); audio->key = key; g_rec_mutex_unlock(audio_mutex); } break; case PROP_ABSOLUTE_KEY: { gint absolute_key; absolute_key = g_value_get_int(value); g_rec_mutex_lock(audio_mutex); audio->absolute_key = absolute_key; g_rec_mutex_unlock(audio_mutex); } break; case PROP_LOOP_START: { guint64 loop_start; loop_start = g_value_get_uint64(value); g_rec_mutex_lock(audio_mutex); audio->loop_start = loop_start; g_rec_mutex_unlock(audio_mutex); } break; case PROP_LOOP_END: { guint64 loop_end; loop_end = g_value_get_uint64(value); g_rec_mutex_lock(audio_mutex); audio->loop_end = loop_end; g_rec_mutex_unlock(audio_mutex); } break; case PROP_OFFSET: { guint64 offset; offset = g_value_get_uint64(value); g_rec_mutex_lock(audio_mutex); audio->offset = offset; g_rec_mutex_unlock(audio_mutex); } break; case PROP_PRESET: { AgsPreset *preset; preset = (AgsPreset *) g_value_get_pointer(value); ags_audio_add_preset(audio, (GObject *) preset); } break; case PROP_SYNTH_GENERATOR: { AgsSynthGenerator *synth_generator; synth_generator = (AgsSynthGenerator *) g_value_get_pointer(value); ags_audio_add_synth_generator(audio, (GObject *) synth_generator); } break; case PROP_PLAYBACK_DOMAIN: { AgsPlaybackDomain *playback_domain; playback_domain = (AgsPlaybackDomain *) g_value_get_object(value); g_rec_mutex_lock(audio_mutex); if(audio->playback_domain == (GObject *) playback_domain){ g_rec_mutex_unlock(audio_mutex); return; } if(audio->playback_domain != NULL){ g_object_unref(audio->playback_domain); } if(playback_domain != NULL){ g_object_ref(playback_domain); } audio->playback_domain = (GObject *) playback_domain; g_rec_mutex_unlock(audio_mutex); } break; case PROP_CURSOR: { GObject *cursor; cursor = (GObject *) g_value_get_pointer(value); ags_audio_add_cursor(audio, (GObject *) cursor); } break; case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_pointer(value); ags_audio_add_notation(audio, (GObject *) notation); } break; case PROP_AUTOMATION: { AgsAutomation *automation; automation = (AgsAutomation *) g_value_get_pointer(value); ags_audio_add_automation(audio, (GObject *) automation); } break; case PROP_WAVE: { AgsWave *wave; wave = (AgsWave *) g_value_get_pointer(value); ags_audio_add_wave(audio, (GObject *) wave); } break; case PROP_OUTPUT_AUDIO_FILE: { AgsAudioFile *output_audio_file; output_audio_file = (AgsAudioFile *) g_value_get_object(value); g_rec_mutex_lock(audio_mutex); if(audio->output_audio_file == (GObject *) output_audio_file){ g_rec_mutex_unlock(audio_mutex); return; } if(audio->output_audio_file != NULL){ g_object_unref(audio->output_audio_file); } if(output_audio_file != NULL){ g_object_ref(output_audio_file); } audio->output_audio_file = (GObject *) output_audio_file; g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_AUDIO_FILE: { AgsAudioFile *input_audio_file; input_audio_file = (AgsAudioFile *) g_value_get_object(value); g_rec_mutex_lock(audio_mutex); if(audio->input_audio_file == (GObject *) input_audio_file){ g_rec_mutex_unlock(audio_mutex); return; } if(audio->input_audio_file != NULL){ g_object_unref(audio->input_audio_file); } if(input_audio_file != NULL){ g_object_ref(input_audio_file); } audio->input_audio_file = (GObject *) input_audio_file; g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI: { AgsMidi *midi; midi = (AgsMidi *) g_value_get_pointer(value); ags_audio_add_midi(audio, (GObject *) midi); } break; case PROP_OUTPUT_MIDI_FILE: { AgsMidiFile *output_midi_file; output_midi_file = g_value_get_object(value); g_rec_mutex_lock(audio_mutex); if((AgsMidiFile *) audio->output_midi_file == output_midi_file){ g_rec_mutex_unlock(audio_mutex); return; } if(audio->output_midi_file != NULL){ g_object_unref(audio->output_midi_file); } if(output_midi_file != NULL) { g_object_ref(output_midi_file); } audio->output_midi_file = (GObject *) output_midi_file; g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_MIDI_FILE: { AgsMidiFile *input_midi_file; input_midi_file = g_value_get_object(value); g_rec_mutex_lock(audio_mutex); if((AgsMidiFile *) audio->input_midi_file == input_midi_file){ g_rec_mutex_unlock(audio_mutex); return; } if(audio->input_midi_file != NULL){ g_object_unref(audio->input_midi_file); } if(input_midi_file != NULL) { g_object_ref(input_midi_file); } audio->input_midi_file = (GObject *) input_midi_file; g_rec_mutex_unlock(audio_mutex); } break; case PROP_RECALL_ID: { AgsRecallID *recall_id; recall_id = (AgsRecallID *) g_value_get_pointer(value); ags_audio_add_recall_id(audio, (GObject *) recall_id); } break; case PROP_RECYCLING_CONTEXT: { AgsRecyclingContext *recycling_context; recycling_context = (AgsRecyclingContext *) g_value_get_pointer(value); ags_audio_add_recycling_context(audio, (GObject *) recycling_context); } break; case PROP_RECALL_CONTAINER: { AgsRecallContainer *recall_container; recall_container = (AgsRecallContainer *) g_value_get_pointer(value); ags_audio_add_recall_container(audio, (GObject *) recall_container); } break; case PROP_PLAY: { AgsRecall *recall; /* */ recall = (AgsRecall *) g_value_get_pointer(value); ags_audio_add_recall(audio, (GObject *) recall, TRUE); } break; case PROP_RECALL: { AgsRecall *recall; /* */ recall = (AgsRecall *) g_value_get_pointer(value); ags_audio_add_recall(audio, (GObject *) recall, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudio *audio; GRecMutex *audio_mutex; audio = AGS_AUDIO(gobject); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); switch(prop_id){ case PROP_AUDIO_NAME: { g_rec_mutex_lock(audio_mutex); g_value_set_string(value, audio->audio_name); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->output_soundcard); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_SOUNDCARD: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->input_soundcard); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_SEQUENCER: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->output_sequencer); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_SEQUENCER: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->input_sequencer); g_rec_mutex_unlock(audio_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->samplerate); g_rec_mutex_unlock(audio_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->buffer_size); g_rec_mutex_unlock(audio_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->format); g_rec_mutex_unlock(audio_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(audio_mutex); g_value_set_double(value, audio->bpm); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIN_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->min_audio_channels); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MAX_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->max_audio_channels); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIN_OUTPUT_PADS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->min_output_pads); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MAX_OUTPUT_PADS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->max_output_pads); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIN_INPUT_PADS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->min_input_pads); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MAX_INPUT_PADS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->max_input_pads); g_rec_mutex_unlock(audio_mutex); } break; case PROP_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->audio_channels); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_PADS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->output_pads); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_LINES: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->output_lines); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_PADS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->input_pads); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_LINES: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->input_lines); g_rec_mutex_unlock(audio_mutex); } break; case PROP_AUDIO_START_MAPPING: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->audio_start_mapping); g_rec_mutex_unlock(audio_mutex); } break; case PROP_AUDIO_END_MAPPING: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->audio_end_mapping); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI_START_MAPPING: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->midi_start_mapping); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI_END_MAPPING: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->midi_end_mapping); g_rec_mutex_unlock(audio_mutex); } break; case PROP_MIDI_CHANNEL: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->midi_channel); g_rec_mutex_unlock(audio_mutex); } break; case PROP_NUMERATOR: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->numerator); g_rec_mutex_unlock(audio_mutex); } break; case PROP_DENOMINATOR: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->denominator); g_rec_mutex_unlock(audio_mutex); } break; case PROP_TIME_SIGNATURE: { g_rec_mutex_lock(audio_mutex); g_value_set_string(value, audio->time_signature); g_rec_mutex_unlock(audio_mutex); } break; case PROP_IS_MINOR: { g_rec_mutex_lock(audio_mutex); g_value_set_boolean(value, audio->is_minor); g_rec_mutex_unlock(audio_mutex); } break; case PROP_SHARP_FLATS: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->sharp_flats); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OCTAVE: { g_rec_mutex_lock(audio_mutex); g_value_set_int(value, audio->octave); g_rec_mutex_unlock(audio_mutex); } break; case PROP_KEY: { g_rec_mutex_lock(audio_mutex); g_value_set_uint(value, audio->key); g_rec_mutex_unlock(audio_mutex); } break; case PROP_ABSOLUTE_KEY: { g_rec_mutex_lock(audio_mutex); g_value_set_int(value, audio->absolute_key); g_rec_mutex_unlock(audio_mutex); } break; case PROP_LOOP_START: { g_rec_mutex_lock(audio_mutex); g_value_set_uint64(value, audio->loop_start); g_rec_mutex_unlock(audio_mutex); } break; case PROP_LOOP_END: { g_rec_mutex_lock(audio_mutex); g_value_set_uint64(value, audio->loop_end); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OFFSET: { g_rec_mutex_lock(audio_mutex); g_value_set_uint64(value, audio->offset); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->output); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->input); g_rec_mutex_unlock(audio_mutex); } break; case PROP_PRESET: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->preset, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_SYNTH_GENERATOR: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->synth_generator, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_PLAYBACK_DOMAIN: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->playback_domain); g_rec_mutex_unlock(audio_mutex); } break; case PROP_CURSOR: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->cursor, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_NOTATION: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->notation, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_AUTOMATION: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->automation, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_WAVE: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->wave, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_AUDIO_FILE: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->output_audio_file); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_AUDIO_FILE: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->input_audio_file); g_rec_mutex_unlock(audio_mutex); } break; case PROP_OUTPUT_MIDI_FILE: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->output_midi_file); g_rec_mutex_unlock(audio_mutex); } break; case PROP_INPUT_MIDI_FILE: { g_rec_mutex_lock(audio_mutex); g_value_set_object(value, audio->input_midi_file); g_rec_mutex_unlock(audio_mutex); } break; case PROP_RECALL_ID: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->recall_id, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_RECYCLING_CONTEXT: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->recycling_context, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_RECALL_CONTAINER: { g_rec_mutex_lock(audio_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->recall_container, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_mutex); } break; case PROP_PLAY: { GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* */ g_rec_mutex_lock(play_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(play_mutex); } break; case PROP_RECALL: { GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* */ g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_audio_dispose(GObject *gobject) { AgsAudio *audio; GList *list, *list_next; GRecMutex *play_mutex, *recall_mutex; audio = AGS_AUDIO(gobject); ags_connectable_disconnect(AGS_CONNECTABLE(audio)); /* soundcard */ if(audio->output_soundcard != NULL){ g_object_unref(audio->output_soundcard); audio->output_soundcard = NULL; } if(audio->input_soundcard != NULL){ g_object_unref(audio->input_soundcard); audio->input_soundcard = NULL; } /* sequencer */ if(audio->output_sequencer != NULL){ g_object_unref(audio->output_sequencer); audio->output_sequencer = NULL; } if(audio->input_sequencer != NULL){ g_object_unref(audio->input_sequencer); audio->input_sequencer = NULL; } /* channels */ ags_audio_set_audio_channels(audio, 0, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 0, 0); /* preset */ if(audio->preset != NULL){ list = audio->preset; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->preset, g_object_unref); audio->preset = NULL; } /* synth_generator */ if(audio->synth_generator != NULL){ list = audio->synth_generator; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->synth_generator, g_object_unref); audio->synth_generator = NULL; } /* playback domain */ if(audio->playback_domain != NULL){ g_object_run_dispose(audio->playback_domain); audio->playback_domain = NULL; } /* notation */ if(audio->notation != NULL){ list = audio->notation; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->notation, g_object_unref); audio->notation = NULL; } /* automation */ if(audio->automation != NULL){ list = audio->automation; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->automation, g_object_unref); audio->automation = NULL; } /* wave */ if(audio->wave != NULL){ list = audio->wave; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->wave, g_object_unref); audio->wave = NULL; } /* output audio file */ if(audio->output_audio_file != NULL){ g_object_unref(audio->output_audio_file); audio->output_audio_file = NULL; } /* input audio file */ if(audio->input_audio_file != NULL){ g_object_unref(audio->input_audio_file); audio->input_audio_file = NULL; } /* midi */ if(audio->midi != NULL){ list = audio->midi; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->midi, g_object_unref); audio->midi = NULL; } /* output midi file */ if(audio->output_midi_file != NULL){ g_object_unref(audio->output_midi_file); audio->output_midi_file = NULL; } /* input midi file */ if(audio->input_midi_file != NULL){ g_object_unref(audio->input_midi_file); audio->input_midi_file = NULL; } /* recall id */ if(audio->recall_id != NULL){ list = audio->recall_id; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->recall_id, g_object_unref); audio->recall_id = NULL; } /* recycling context */ if(audio->recycling_context != NULL){ list = audio->recycling_context; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->recycling_context, g_object_unref); audio->recycling_context = NULL; } /* recall container */ if(audio->recall_container != NULL){ list = audio->recall_container; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->recall_container, g_object_unref); audio->recall_container = NULL; } /* play */ if(audio->play != NULL){ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* run dispose and unref */ g_rec_mutex_lock(play_mutex); list = audio->play; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->play, g_object_unref); audio->play = NULL; g_rec_mutex_unlock(play_mutex); } /* recall */ if(audio->recall != NULL){ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* run dispose and unref */ g_rec_mutex_lock(recall_mutex); list = audio->recall; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(audio->recall, g_object_unref); audio->recall = NULL; g_rec_mutex_unlock(recall_mutex); } /* call parent */ G_OBJECT_CLASS(ags_audio_parent_class)->dispose(gobject); } void ags_audio_finalize(GObject *gobject) { AgsAudio *audio; AgsChannel *channel; GList *list; audio = AGS_AUDIO(gobject); ags_uuid_free(audio->uuid); g_free(audio->audio_name); /* soundcard */ if(audio->output_soundcard != NULL){ g_object_unref(audio->output_soundcard); } if(audio->input_soundcard != NULL){ g_object_unref(audio->input_soundcard); } /* sequencer */ if(audio->output_sequencer != NULL){ g_object_unref(audio->output_sequencer); } if(audio->input_sequencer != NULL){ g_object_unref(audio->input_sequencer); } /* channels */ ags_audio_set_audio_channels(audio, 0, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 0, 0); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 0, 0); /* preset */ if(audio->preset != NULL){ list = audio->preset; while(list != NULL){ g_object_set(list->data, "audio", NULL, NULL); list = list->next; } g_list_free_full(audio->preset, g_object_unref); } /* synth_generator */ if(audio->synth_generator != NULL){ list = audio->synth_generator; while(list != NULL){ g_object_set(list->data, "audio", NULL, NULL); list = list->next; } g_list_free_full(audio->synth_generator, g_object_unref); } /* playback domain */ if(audio->playback_domain != NULL){ g_object_unref(audio->playback_domain); } /* notation */ if(audio->notation != NULL){ list = audio->notation; while(list != NULL){ g_object_set(list->data, "audio", NULL, NULL); list = list->next; } g_list_free_full(audio->notation, g_object_unref); } /* automation */ if(audio->automation != NULL){ list = audio->automation; while(list != NULL){ g_object_set(list->data, "audio", NULL, NULL); list = list->next; } g_list_free_full(audio->automation, g_object_unref); } /* wave */ if(audio->wave != NULL){ list = audio->wave; while(list != NULL){ g_object_set(list->data, "audio", NULL, NULL); list = list->next; } g_list_free_full(audio->wave, g_object_unref); } /* output audio file */ if(audio->output_audio_file != NULL){ g_object_unref(audio->output_audio_file); } /* input audio file */ if(audio->input_audio_file != NULL){ g_object_unref(audio->input_audio_file); } /* midi */ if(audio->midi != NULL){ list = audio->midi; while(list != NULL){ g_object_set(list->data, "audio", NULL, NULL); list = list->next; } g_list_free_full(audio->midi, g_object_unref); } /* output midi file */ if(audio->output_midi_file != NULL){ g_object_unref(audio->output_midi_file); } /* input midi file */ if(audio->input_midi_file != NULL){ g_object_unref(audio->input_midi_file); } /* recall id */ if(audio->recall_id != NULL){ g_list_free_full(audio->recall_id, g_object_unref); } /* recycling context */ if(audio->recycling_context != NULL){ g_list_free_full(audio->recycling_context, g_object_unref); } /* recall container */ if(audio->recall_container != NULL){ g_list_free_full(audio->recall_container, g_object_unref); } /* play context */ if(audio->play != NULL){ list = audio->play; while(list != NULL){ if(AGS_IS_RECALL_AUDIO(list->data) || AGS_IS_RECALL_AUDIO_RUN(list->data)){ g_object_set(list->data, "audio", NULL, NULL); } list = list->next; } g_list_free_full(audio->play, g_object_unref); } /* recall context */ if(audio->recall != NULL){ list = audio->recall; while(list != NULL){ if(AGS_IS_RECALL_AUDIO(list->data) || AGS_IS_RECALL_AUDIO_RUN(list->data)){ g_object_set(list->data, "audio", NULL, NULL); } list = list->next; } g_list_free_full(audio->recall, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_audio_parent_class)->finalize(gobject); } AgsUUID* ags_audio_get_uuid(AgsConnectable *connectable) { AgsAudio *audio; AgsUUID *ptr; GRecMutex *audio_mutex; audio = AGS_AUDIO(connectable); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get UUID */ g_rec_mutex_lock(audio_mutex); ptr = audio->uuid; g_rec_mutex_unlock(audio_mutex); return(ptr); } gboolean ags_audio_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_audio_is_ready(AgsConnectable *connectable) { AgsAudio *audio; gboolean is_ready; audio = AGS_AUDIO(connectable); /* check is added */ is_ready = ags_audio_test_flags(audio, AGS_AUDIO_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_add_to_registry(AgsConnectable *connectable) { AgsAudio *audio; AgsChannel *channel; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *list; if(ags_connectable_is_ready(connectable)){ return; } audio = AGS_AUDIO(connectable); ags_audio_set_flags(audio, AGS_AUDIO_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); entry->id = audio->uuid; g_value_set_object(entry->entry, (gpointer) audio); ags_registry_add_entry(registry, entry); } /* add play */ list = audio->play; while(list != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(list->data)); list = list->next; } /* add recall */ list = audio->recall; while(list != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(list->data)); list = list->next; } /* add output */ channel = audio->output; while(channel != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(channel)); channel = channel->next; } /* add input */ channel = audio->input; while(channel != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(channel)); channel = channel->next; } } void ags_audio_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_audio_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_is_connected(AgsConnectable *connectable) { AgsAudio *audio; gboolean is_connected; audio = AGS_AUDIO(connectable); /* check is connected */ is_connected = ags_audio_test_flags(audio, AGS_AUDIO_CONNECTED); return(is_connected); } void ags_audio_connect(AgsConnectable *connectable) { AgsAudio *audio; AgsChannel *start_channel, *channel, *next_channel; GList *start_list, *list; if(ags_connectable_is_connected(connectable)){ return; } audio = AGS_AUDIO(connectable); ags_audio_set_flags(audio, AGS_AUDIO_CONNECTED); #ifdef AGS_DEBUG g_message("connecting audio"); #endif /* connect channels - output */ g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* connect */ ags_connectable_connect(AGS_CONNECTABLE(channel)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* connect channels - input */ g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* connect */ ags_connectable_connect(AGS_CONNECTABLE(channel)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* connect recall container */ g_object_get(audio, "recall-container", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* connect recall - play context */ g_object_get(audio, "play", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* connect recall - recall context */ g_object_get(audio, "recall", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_audio_disconnect(AgsConnectable *connectable) { AgsAudio *audio; AgsChannel *start_channel, *channel, *next_channel; GList *start_list, *list; if(!ags_connectable_is_connected(connectable)){ return; } audio = AGS_AUDIO(connectable); ags_audio_unset_flags(audio, AGS_AUDIO_CONNECTED); #ifdef AGS_DEBUG g_message("disconnecting audio"); #endif /* disconnect channels - output */ g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* disconnect */ ags_connectable_disconnect(AGS_CONNECTABLE(channel)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* disconnect channels - input */ g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* disconnect */ ags_connectable_disconnect(AGS_CONNECTABLE(channel)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* disconnect recall container */ g_object_get(audio, "recall-container", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* disconnect recall - play context */ g_object_get(audio, "play", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* disconnect recall - recall context */ g_object_get(audio, "recall", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_audio_get_obj_mutex: * @audio: the #AgsAudio * * Get object mutex. * * Returns: the #GRecMutex to lock @audio * * Since: 3.1.0 */ GRecMutex* ags_audio_get_obj_mutex(AgsAudio *audio) { if(!AGS_IS_AUDIO(audio)){ return(NULL); } return(AGS_AUDIO_GET_OBJ_MUTEX(audio)); } /** * ags_audio_get_play_mutex: * @audio: the #AgsAudio * * Get play mutex. * * Returns: the #GRecMutex to lock @audio's play property * * Since: 3.1.0 */ GRecMutex* ags_audio_get_play_mutex(AgsAudio *audio) { if(!AGS_IS_AUDIO(audio)){ return(NULL); } return(AGS_AUDIO_GET_PLAY_MUTEX(audio)); } /** * ags_audio_get_recall_mutex: * @audio: the #AgsAudio * * Get recall mutex. * * Returns: the #GRecMutex to lock @audio's recall property * * Since: 3.1.0 */ GRecMutex* ags_audio_get_recall_mutex(AgsAudio *audio) { if(!AGS_IS_AUDIO(audio)){ return(NULL); } return(AGS_AUDIO_GET_RECALL_MUTEX(audio)); } /** * ags_audio_test_flags: * @audio: the #AgsAudio * @flags: the flags * * Test @flags to be set on @audio. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_test_flags(AgsAudio *audio, guint flags) { gboolean retval; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(FALSE); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* test */ g_rec_mutex_lock(audio_mutex); retval = (flags & (audio->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_mutex); return(retval); } /** * ags_audio_set_flags: * @audio: the #AgsAudio * @flags: see enum AgsAudioFlags * * Enable a feature of #AgsAudio. * * Since: 3.0.0 */ void ags_audio_set_flags(AgsAudio *audio, guint flags) { guint audio_flags; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* check flags */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); if((AGS_AUDIO_NO_OUTPUT & flags) != 0 && (AGS_AUDIO_NO_OUTPUT & audio_flags) == 0){ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 0, 0); } if((AGS_AUDIO_NO_INPUT & flags) != 0 && (AGS_AUDIO_NO_INPUT & audio_flags) == 0){ ags_audio_set_pads(audio, AGS_TYPE_INPUT, 0, 0); } if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (flags)) != 0 && (AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) == 0){ AgsChannel *start_channel, *channel, *next_channel; g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ GObject *output_soundcard; AgsRecycling *first_recycling, *last_recycling; /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, NULL); /* add recycling */ first_recycling = last_recycling = ags_recycling_new(output_soundcard); g_object_ref(first_recycling); g_object_set(first_recycling, "channel", channel, NULL); ags_channel_reset_recycling(channel, first_recycling, last_recycling); g_object_unref(output_soundcard); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } } if((AGS_AUDIO_INPUT_HAS_RECYCLING & (flags)) != 0 && (AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) == 0){ AgsChannel *start_channel, *channel, *next_channel; g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ AgsRecycling *recycling; AgsRecycling *first_recycling, *last_recycling; GObject *output_soundcard; /* get some fields */ g_object_get(channel, "output-soundcard", &output_soundcard, "first-recycling", &recycling, NULL); /* add recycling */ if(recycling == NULL){ first_recycling = last_recycling = ags_recycling_new(output_soundcard); g_object_ref(first_recycling); g_object_set(first_recycling, "channel", channel, NULL); ags_channel_reset_recycling(channel, first_recycling, last_recycling); }else{ g_object_unref(recycling); } g_object_unref(output_soundcard); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } } //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_mutex); audio->flags |= flags; g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_unset_flags: * @audio: the #AgsAudio * @flags: see enum AgsAudioFlags * * Disable a feature of AgsAudio. * * Since: 3.0.0 */ void ags_audio_unset_flags(AgsAudio *audio, guint flags) { guint audio_flags; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* check flags */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) != 0 && (AGS_AUDIO_OUTPUT_HAS_RECYCLING & (flags)) == 0){ AgsChannel *start_channel, *channel, *next_channel; GRecMutex *channel_mutex; g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ AgsRecycling *first_recycling; /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* unset recycling */ g_rec_mutex_lock(channel_mutex); first_recycling = channel->first_recycling; channel->first_recycling = channel->last_recycling = NULL; g_rec_mutex_unlock(channel_mutex); /* remove recycling */ if(first_recycling != NULL){ g_object_run_dispose((GObject *) first_recycling); g_object_unref(first_recycling); } ags_channel_reset_recycling(channel, NULL, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } } if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0 && (AGS_AUDIO_INPUT_HAS_RECYCLING & (flags)) == 0){ AgsChannel *start_channel, *channel, *next_channel; AgsChannel *link; GRecMutex *channel_mutex; g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ AgsRecycling *first_recycling; /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get some fields */ g_rec_mutex_lock(channel_mutex); link = channel->link; g_rec_mutex_unlock(channel_mutex); /* unset recycling */ if(link == NULL){ g_rec_mutex_lock(channel_mutex); first_recycling = channel->first_recycling; channel->first_recycling = channel->last_recycling = NULL; g_rec_mutex_unlock(channel_mutex); /* remove recycling */ if(first_recycling != NULL){ g_object_run_dispose((GObject *) first_recycling); g_object_unref(first_recycling); } ags_channel_reset_recycling(channel, NULL, NULL); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } } //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_mutex); audio->flags &= (~flags); g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_test_ability_flags: * @audio: the #AgsAudio * @ability_flags: the ability flags * * Test @ability_flags to be set on @audio. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_test_ability_flags(AgsAudio *audio, guint ability_flags) { gboolean retval; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(FALSE); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* test */ g_rec_mutex_lock(audio_mutex); retval = (ability_flags & (audio->ability_flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_mutex); return(retval); } void ags_audio_set_ability_flags_channel(AgsChannel *start_channel, guint ability_flags) { AgsChannel *channel, *next_channel; if(!AGS_IS_CHANNEL(start_channel)){ return; } channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* set ability flags */ ags_channel_set_ability_flags(channel, ability_flags); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /** * ags_audio_set_ability_flags: * @audio: the #AgsAudio * @ability_flags: see enum AgsSoundAbilityFlags * * Enable an ability of AgsAudio. * * Since: 3.0.0 */ void ags_audio_set_ability_flags(AgsAudio *audio, guint ability_flags) { AgsChannel *start_output, *start_input; AgsPlaybackDomain *playback_domain; AgsThread *main_loop; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; GObject *output_soundcard; guint samplerate, buffer_size; guint audio_ability_flags; gboolean super_threaded_audio; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } application_context = ags_application_context_get_instance(); /* get main loop */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* check flags */ g_rec_mutex_lock(audio_mutex); audio_ability_flags = audio->ability_flags; samplerate = audio->samplerate; buffer_size = audio->buffer_size; g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output-soundcard", &output_soundcard, "output", &start_output, "input", &start_input, "playback-domain", &playback_domain, NULL); /* get super-threaded flags */ super_threaded_audio = ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO); /* notation ability */ if(super_threaded_audio){ /* find audio loop */ audio_loop = (AgsAudioLoop *) ags_thread_find_type(main_loop, AGS_TYPE_AUDIO_LOOP); /* playback ability */ if((AGS_SOUND_ABILITY_PLAYBACK & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_PLAYBACK & (audio_ability_flags)) == 0){ AgsAudioThread *audio_thread; audio_thread = ags_audio_thread_new(output_soundcard, (GObject *) audio); ags_audio_thread_set_sound_scope(audio_thread, AGS_SOUND_SCOPE_PLAYBACK); g_object_set(audio_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_domain_set_audio_thread(playback_domain, (AgsThread *) audio_thread, AGS_SOUND_SCOPE_PLAYBACK); /* set thread child */ ags_thread_add_child_extended((AgsThread *) audio_loop, (AgsThread *) audio_thread, TRUE, TRUE); } /* sequencer ability */ if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_SEQUENCER & (audio_ability_flags)) == 0){ AgsAudioThread *audio_thread; audio_thread = ags_audio_thread_new(output_soundcard, (GObject *) audio); ags_audio_thread_set_sound_scope(audio_thread, AGS_SOUND_SCOPE_SEQUENCER); g_object_set(audio_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_domain_set_audio_thread(playback_domain, (AgsThread *) audio_thread, AGS_SOUND_SCOPE_SEQUENCER); /* set thread child */ ags_thread_add_child_extended((AgsThread *) audio_loop, (AgsThread *) audio_thread, TRUE, TRUE); } /* notation ability */ if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_NOTATION & (audio_ability_flags)) == 0){ AgsAudioThread *audio_thread; audio_thread = ags_audio_thread_new(output_soundcard, (GObject *) audio); ags_audio_thread_set_sound_scope(audio_thread, AGS_SOUND_SCOPE_NOTATION); g_object_set(audio_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_domain_set_audio_thread(playback_domain, (AgsThread *) audio_thread, AGS_SOUND_SCOPE_NOTATION); /* set thread child */ ags_thread_add_child_extended((AgsThread *) audio_loop, (AgsThread *) audio_thread, TRUE, TRUE); } /* wave ability */ if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_WAVE & (audio_ability_flags)) == 0){ AgsAudioThread *audio_thread; audio_thread = ags_audio_thread_new(output_soundcard, (GObject *) audio); ags_audio_thread_set_sound_scope(audio_thread, AGS_SOUND_SCOPE_WAVE); g_object_set(audio_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_domain_set_audio_thread(playback_domain, (AgsThread *) audio_thread, AGS_SOUND_SCOPE_WAVE); /* set thread child */ ags_thread_add_child_extended((AgsThread *) audio_loop, (AgsThread *) audio_thread, TRUE, TRUE); } /* midi ability */ if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_MIDI & (audio_ability_flags)) == 0){ AgsAudioThread *audio_thread; audio_thread = ags_audio_thread_new(output_soundcard, (GObject *) audio); ags_audio_thread_set_sound_scope(audio_thread, AGS_SOUND_SCOPE_MIDI); g_object_set(audio_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_domain_set_audio_thread(playback_domain, (AgsThread *) audio_thread, AGS_SOUND_SCOPE_MIDI); /* set thread child */ ags_thread_add_child_extended((AgsThread *) audio_loop, (AgsThread *) audio_thread, TRUE, TRUE); } } /* channel */ ags_audio_set_ability_flags_channel(start_output, ability_flags); ags_audio_set_ability_flags_channel(start_input, ability_flags); /* set flags */ g_rec_mutex_lock(audio_mutex); audio->ability_flags |= ability_flags; g_rec_mutex_unlock(audio_mutex); /* unref */ if(main_loop != NULL){ g_object_unref(main_loop); } if(output_soundcard != NULL) { g_object_unref(output_soundcard); } g_object_unref(playback_domain); if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_audio_unset_ability_flags_channel(AgsChannel *start_channel, guint ability_flags) { AgsChannel *channel, *next_channel; if(!AGS_IS_CHANNEL(start_channel)){ return; } channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* set ability flags */ ags_channel_unset_ability_flags(channel, ability_flags); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /** * ags_audio_unset_ability_flags: * @audio: the #AgsAudio * @ability_flags: see enum AgsSoundAbilityFlags * * Disable an ability of AgsAudio. * * Since: 3.0.0 */ void ags_audio_unset_ability_flags(AgsAudio *audio, guint ability_flags) { AgsChannel *start_output, *start_input; AgsPlaybackDomain *playback_domain; AgsThread *main_loop; AgsThread *audio_loop; AgsApplicationContext *application_context; guint audio_ability_flags; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } application_context = ags_application_context_get_instance(); /* get main loop */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* check flags */ g_rec_mutex_lock(audio_mutex); audio_ability_flags = audio->ability_flags; g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output", &start_output, "input", &start_input, "playback-domain", &playback_domain, NULL); /* find audio loop */ audio_loop = ags_thread_find_type(main_loop, AGS_TYPE_AUDIO_LOOP); /* playback ability */ if((AGS_SOUND_ABILITY_PLAYBACK & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_PLAYBACK & (audio_ability_flags)) != 0){ AgsAudioThread *audio_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_PLAYBACK); ags_thread_remove_child(audio_loop, (AgsThread *) audio_thread); ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_PLAYBACK); } /* notation ability */ if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_NOTATION & (audio_ability_flags)) != 0){ AgsAudioThread *audio_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_NOTATION); ags_thread_remove_child(audio_loop, (AgsThread *) audio_thread); ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_NOTATION); } /* sequencer ability */ if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_SEQUENCER & (audio_ability_flags)) != 0){ AgsAudioThread *audio_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_SEQUENCER); ags_thread_remove_child(audio_loop, (AgsThread *) audio_thread); ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_SEQUENCER); } /* wave ability */ if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_WAVE & (audio_ability_flags)) != 0){ AgsAudioThread *audio_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_WAVE); ags_thread_remove_child(audio_loop, (AgsThread *) audio_thread); ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_WAVE); } /* midi ability */ if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_MIDI & (audio_ability_flags)) != 0){ AgsAudioThread *audio_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_MIDI); ags_thread_remove_child(audio_loop, (AgsThread *) audio_thread); ags_playback_domain_set_audio_thread(playback_domain, NULL, AGS_SOUND_SCOPE_MIDI); } /* channel */ ags_audio_unset_ability_flags_channel(start_output, ability_flags); ags_audio_unset_ability_flags_channel(start_input, ability_flags); /* unset flags */ g_rec_mutex_lock(audio_mutex); audio->ability_flags &= (~ability_flags); g_rec_mutex_unlock(audio_mutex); /* unref */ g_object_unref(main_loop); g_object_unref(playback_domain); g_object_unref(start_output); g_object_unref(start_input); } /** * ags_audio_test_behaviour_flags: * @audio: the #AgsAudio * @behaviour_flags: the behaviour flags * * Test @behaviour_flags to be set on @audio. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_test_behaviour_flags(AgsAudio *audio, guint behaviour_flags) { gboolean retval; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(FALSE); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* test */ g_rec_mutex_lock(audio_mutex); retval = (behaviour_flags & (audio->behaviour_flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_mutex); return(retval); } /** * ags_audio_set_behaviour_flags: * @audio: the #AgsAudio * @behaviour_flags: the behaviour flags * * Set behaviour flags. * * Since: 3.0.0 */ void ags_audio_set_behaviour_flags(AgsAudio *audio, guint behaviour_flags) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set flags */ g_rec_mutex_lock(audio_mutex); audio->behaviour_flags |= behaviour_flags; g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_unset_behaviour_flags: * @audio: the #AgsAudio * @behaviour_flags: the behaviour flags * * Unset behaviour flags. * * Since: 3.0.0 */ void ags_audio_unset_behaviour_flags(AgsAudio *audio, guint behaviour_flags) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* unset flags */ g_rec_mutex_lock(audio_mutex); audio->behaviour_flags &= (~behaviour_flags); g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_test_staging_flags: * @audio: the #AgsAudio * @sound_scope: the #AgsSoundScope to test * @staging_flags: the staging flags * * Test @staging_flags to be set on @audio. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_test_staging_flags(AgsAudio *audio, gint sound_scope, guint staging_flags) { gboolean retval; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(FALSE); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* test */ g_rec_mutex_lock(audio_mutex); retval = (staging_flags & (audio->staging_flags[sound_scope])) ? TRUE: FALSE; g_rec_mutex_unlock(audio_mutex); return(retval); } /** * ags_audio_set_staging_flags: * @audio: the #AgsAudio * @sound_scope: the #AgsSoundScope to apply, or -1 to apply to all * @staging_flags: the staging flags * * Set staging flags. * * Since: 3.0.0 */ void ags_audio_set_staging_flags(AgsAudio *audio, gint sound_scope, guint staging_flags) { guint i; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set flags */ g_rec_mutex_lock(audio_mutex); if(sound_scope < 0){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ audio->staging_flags[i] |= staging_flags; } }else if(sound_scope < AGS_SOUND_SCOPE_LAST){ audio->staging_flags[sound_scope] |= staging_flags; } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_unset_staging_flags: * @audio: the #AgsAudio * @sound_scope: the #AgsSoundScope to apply, or -1 to apply to all * @staging_flags: the staging flags * * Unset staging flags. * * Since: 3.0.0 */ void ags_audio_unset_staging_flags(AgsAudio *audio, gint sound_scope, guint staging_flags) { guint i; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* unset flags */ g_rec_mutex_lock(audio_mutex); if(sound_scope < 0){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ audio->staging_flags[i] &= (~staging_flags); } }else if(sound_scope < AGS_SOUND_SCOPE_LAST){ audio->staging_flags[sound_scope] &= (~staging_flags); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_audio_name: * @audio: the #AgsAudio * * Get audio name of @audio. * * Returns: the audio name * * Since: 3.1.0 */ gchar* ags_audio_get_audio_name(AgsAudio *audio) { gchar *audio_name; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "audio-name", &audio_name, NULL); return(audio_name); } /** * ags_audio_set_audio_name: * @audio: the #AgsAudio * @audio_name: the audio name * * Set audio name of @audio. * * Since: 3.1.0 */ void ags_audio_set_audio_name(AgsAudio *audio, gchar *audio_name) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "audio-name", audio_name, NULL); } /** * ags_audio_find_name: * @audio: (element-type AgsAudio.Audio) (transfer none): the #GList-struct containing #AgsAudio * @audio_name: the audio name to find * * Find @audio_name in @audio. * * Returns: (element-type AgsAudio.Audio) (transfer none): the next matching #GList-struct containing #AgsAudio * * Since: 3.0.0 */ GList* ags_audio_find_name(GList *audio, gchar *audio_name) { if(audio == NULL || audio_name == NULL){ return(NULL); } while(audio != NULL){ gboolean success; GRecMutex *audio_mutex; /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio->data); /* match */ g_rec_mutex_lock(audio_mutex); success = (AGS_AUDIO(audio->data)->audio_name != NULL && !g_strcmp0(AGS_AUDIO(audio->data)->audio_name, audio_name)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_mutex); if(success){ return(audio); } audio = audio->next; } return(NULL); } /** * ags_audio_get_max_audio_channels: * @audio: the #AgsAudio * * Get maximum audio channels. * * Returns: the maximum audio channels * * Since: 3.1.0 */ guint ags_audio_get_max_audio_channels(AgsAudio *audio) { guint max_audio_channels; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "max-audio-channels", &max_audio_channels, NULL); return(max_audio_channels); } /** * ags_audio_set_max_audio_channels: * @audio: the #AgsAudio * @max_audio_channels: maximum of audio channels * * Set maximum audio channels. * * Since: 3.0.0 */ void ags_audio_set_max_audio_channels(AgsAudio *audio, guint max_audio_channels) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set max audio channels */ g_rec_mutex_lock(audio_mutex); audio->max_audio_channels = max_audio_channels; g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_max_output_pads: * @audio: the #AgsAudio * * Get maximum output pads. * * Returns: the maximum output pads * * Since: 3.1.0 */ guint ags_audio_get_max_output_pads(AgsAudio *audio) { guint max_output_pads; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "max-output-pads", &max_output_pads, NULL); return(max_output_pads); } /** * ags_audio_set_max_output_pads: * @audio: the #AgsAudio * @max_output_pads: maximum of output pads * * Set maximum output pads. * * Since: 3.1.0 */ void ags_audio_set_max_output_pads(AgsAudio *audio, guint max_output_pads) { ags_audio_set_max_pads(audio, AGS_TYPE_OUTPUT, max_output_pads); } /** * ags_audio_get_max_input_pads: * @audio: the #AgsAudio * * Get maximum input pads. * * Returns: the maximum input pads * * Since: 3.1.0 */ guint ags_audio_get_max_input_pads(AgsAudio *audio) { guint max_input_pads; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "max-input-pads", &max_input_pads, NULL); return(max_input_pads); } /** * ags_audio_set_max_input_pads: * @audio: the #AgsAudio * @max_input_pads: maximum of input pads * * Set maximum input pads. * * Since: 3.1.0 */ void ags_audio_set_max_input_pads(AgsAudio *audio, guint max_input_pads) { ags_audio_set_max_pads(audio, AGS_TYPE_INPUT, max_input_pads); } /** * ags_audio_set_max_pads: * @audio: the #AgsAudio * @channel_type: the #GType of channel, either AGS_TYPE_OUTPUT or AGS_TYPE_INPUT * @max_pads: maximum of pads * * Set maximum pads of @channel_type. * * Since: 3.0.0 */ void ags_audio_set_max_pads(AgsAudio *audio, GType channel_type, guint max_pads) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set max pads */ g_rec_mutex_lock(audio_mutex); if(g_type_is_a(channel_type, AGS_TYPE_OUTPUT)){ audio->max_output_pads = max_pads; }else if(g_type_is_a(channel_type, AGS_TYPE_INPUT)){ audio->max_input_pads = max_pads; } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_audio_channels: * @audio: the #AgsAudio * * Get audio channels. * * Returns: the audio channels * * Since: 3.1.0 */ guint ags_audio_get_audio_channels(AgsAudio *audio) { guint audio_channels; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "audio-channels", &audio_channels, NULL); return(audio_channels); } void ags_audio_set_audio_channels_grow(AgsAudio *audio, GType channel_type, guint audio_channels, guint audio_channels_old, guint bank_dim_0, guint bank_dim_1, guint bank_dim_2, gboolean add_recycling, gboolean add_pattern, gboolean add_synth_generator, gboolean link_recycling, gboolean set_sync_link, gboolean set_async_link) { AgsChannel *start; AgsChannel *channel, *current, *pad_next, *nth_channel; AgsRecycling *first_recycling, *last_recycling; AgsPlaybackDomain *playback_domain; GObject *output_soundcard, *input_soundcard; guint samplerate; guint buffer_size; guint format; guint pads; guint i, j; GRecMutex *audio_mutex; GRecMutex *prev_mutex, *prev_pad_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_object_get(audio, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, "playback-domain", &playback_domain, "output-soundcard", &output_soundcard, "input-soundcard", &input_soundcard, NULL); if(channel_type == AGS_TYPE_OUTPUT){ g_object_get(audio, "output", &start, "output-pads", &pads, NULL); }else{ g_object_get(audio, "input", &start, "input-pads", &pads, NULL); } /* grow */ for(j = 0; j < pads; j++){ if(audio_channels_old != 0){ nth_channel = ags_channel_nth(start, j * audio_channels); pad_next = ags_channel_next_pad(nth_channel); g_object_unref(nth_channel); g_object_unref(pad_next); }else{ pad_next = NULL; } for(i = audio_channels_old; i < audio_channels; i++){ AgsPlayback *playback; channel = (AgsChannel *) g_object_new(channel_type, "audio", (GObject *) audio, "output-soundcard", output_soundcard, "output-soundcard-channel", i, "input-soundcard", input_soundcard, "input-soundcard-channel", i, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); g_object_ref(channel); playback = (AgsPlayback *) channel->playback; g_object_set(playback, "playback-domain", playback_domain, NULL); if(add_pattern){ AgsPattern *pattern; pattern = ags_pattern_new(); g_object_set(channel, "pattern", pattern, NULL); ags_pattern_set_dim(pattern, bank_dim_0, bank_dim_1, bank_dim_2); } if(add_synth_generator){ AgsSynthGenerator *synth_generator; synth_generator = ags_synth_generator_new(); ags_input_add_synth_generator((AgsInput *) channel, (GObject *) synth_generator); } if(start == NULL){ g_rec_mutex_lock(audio_mutex); start = channel; if(channel_type == AGS_TYPE_OUTPUT){ audio->output = channel; }else{ audio->input = channel; } g_rec_mutex_unlock(audio_mutex); } if(j * audio_channels + i != 0){ /* set prev */ channel->prev = ags_channel_nth(start, j * audio_channels + i - 1); g_object_unref(channel->prev); /* get prev mutex */ prev_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel->prev); /* set next and prev->next */ g_rec_mutex_lock(prev_mutex); if(audio_channels_old != 0 && i == audio_channels - 1){ channel->next = pad_next; } channel->prev->next = channel; g_rec_mutex_unlock(prev_mutex); } if(j != 0){ /* set prev pad */ nth_channel = ags_channel_nth(start, i); channel->prev_pad = ags_channel_pad_nth(nth_channel, j - 1); g_object_unref(nth_channel); g_object_unref(channel->prev_pad); /* get prev pad mutex */ prev_pad_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel->prev_pad); /* set prev pad next pad */ g_rec_mutex_lock(prev_pad_mutex); channel->prev_pad->next_pad = channel; g_rec_mutex_unlock(prev_pad_mutex); } /* set indices */ channel->pad = j; channel->audio_channel = i; channel->line = j * audio_channels + i; /* reset nested AgsRecycling tree */ if(add_recycling){ first_recycling = last_recycling = ags_recycling_new(output_soundcard); g_object_ref(first_recycling); g_object_set(first_recycling, "channel", channel, NULL); ags_channel_reset_recycling(channel, first_recycling, last_recycling); }else if(set_sync_link){ AgsChannel *input; g_rec_mutex_lock(audio_mutex); input = audio->input; g_rec_mutex_unlock(audio_mutex); input = ags_channel_nth(input, channel->line); g_object_unref(input); /* set sync link */ if(input != NULL){ first_recycling = input->first_recycling; last_recycling = input->last_recycling; ags_channel_reset_recycling(channel, first_recycling, last_recycling); } }else if(set_async_link){ AgsChannel *start_input; AgsChannel *input, *input_pad_last, *nth_input; g_rec_mutex_lock(audio_mutex); start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); nth_input = ags_channel_nth(start_input, i); g_object_unref(nth_input); input = nth_input; /* set async link */ if(input != NULL){ input_pad_last = ags_channel_pad_last(input); first_recycling = input->first_recycling; last_recycling = input_pad_last->last_recycling; ags_channel_reset_recycling(channel, first_recycling, last_recycling); g_object_unref(input_pad_last); g_object_unref(input); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } } } } /* unref */ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(input_soundcard != NULL){ g_object_unref(input_soundcard); } if(start != NULL){ g_object_unref(start); } g_object_unref(playback_domain); } void ags_audio_set_audio_channels_shrink_zero(AgsAudio *audio) { AgsChannel *channel, *start, *channel_next; gboolean first_run; GError *error; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start = channel = audio->output; first_run = TRUE; error = NULL; ags_audio_set_audio_channel_shrink_zero0: while(channel != NULL){ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_error("%s", error->message); g_error_free(error); } channel = channel->next; } channel = start; while(channel != NULL){ channel_next = channel->next; g_object_run_dispose((GObject *) channel); g_object_unref((GObject *) channel); channel = channel_next; } if(first_run){ start = channel = audio->input; first_run = FALSE; goto ags_audio_set_audio_channel_shrink_zero0; } audio->output = NULL; audio->input = NULL; g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_audio_channels_shrink(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { AgsChannel *start; AgsChannel *channel, *nth_channel; AgsChannel *channel0, *channel1; AgsRecycling *recycling; guint pads, i, j; gboolean first_run; GError *error; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start = channel = audio->output; pads = audio->output_pads; g_rec_mutex_unlock(audio_mutex); first_run = TRUE; ags_audio_set_audio_channel_shrink0: for(i = 0; i < pads; i++){ channel = ags_channel_nth(channel, audio_channels); g_object_unref(channel); for(j = audio_channels; j < audio_channels_old; j++){ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_error("%s", error->message); g_error_free(error); } channel = channel->next; } } channel = start; if(i < pads){ for(i = 0; ; i++){ for(j = 0; j < audio_channels -1; j++){ channel->pad = i; channel->audio_channel = j; channel->line = i * audio_channels + j; channel = channel->next; } channel->pad = i; channel->audio_channel = j; channel->line = i * audio_channels + j; channel0 = channel->next; for(; j < audio_channels_old; j++){ channel1 = channel0->next; g_object_run_dispose((GObject *) channel0); g_object_unref((GObject *) channel0); channel0 = channel1; } channel->next = channel1; if(channel1 != NULL){ channel1->prev = channel; }else{ break; } channel = channel1; } } if(first_run){ first_run = FALSE; g_rec_mutex_lock(audio_mutex); start = channel = audio->input; pads = audio->input_pads; g_rec_mutex_unlock(audio_mutex); goto ags_audio_set_audio_channel_shrink0; } } void ags_audio_set_audio_channels_shrink_notation(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { GList *list_start, *list; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); list = list_start = g_list_copy(audio->notation); while(list != NULL){ if(AGS_NOTATION(list->data)->audio_channel >= audio_channels){ ags_audio_remove_notation(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); } list = list->next; } g_list_free(list_start); g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_audio_channels_shrink_automation(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { GList *list_start, *list; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); list = list_start = g_list_copy(audio->automation); while(list != NULL){ if(AGS_AUTOMATION(list->data)->line % audio_channels_old >= audio_channels){ ags_audio_remove_automation(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); } list = list->next; } g_list_free(list_start); if(audio_channels == 0){ audio->automation = NULL; } g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_audio_channels_shrink_wave(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { GList *list_start, *list; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); list = list_start = g_list_copy(audio->wave); while(list != NULL){ if(AGS_WAVE(list->data)->line % audio_channels_old >= audio_channels){ ags_audio_remove_wave(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); } list = list->next; } g_list_free(list_start); g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_audio_channels_shrink_midi(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { GList *list_start, *list; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); list = list_start = g_list_copy(audio->midi); while(list != NULL){ if(AGS_MIDI(list->data)->audio_channel >= audio_channels){ ags_audio_remove_midi(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); } list = list->next; } g_list_free(list_start); g_rec_mutex_unlock(audio_mutex); } void ags_audio_real_set_audio_channels(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { AgsPlaybackDomain *playback_domain; AgsPlayback *playback; AgsChannel *start_channel, *channel, *nth_channel, *next_channel; AgsMessageDelivery *message_delivery; GList *start_message_queue; guint bank_dim[3]; guint audio_flags; guint ability_flags; guint output_pads, input_pads; gboolean add_recycling; gboolean add_pattern; gboolean add_synth_generator; gboolean link_recycling; // affects AgsInput gboolean set_sync_link, set_async_link; // affects AgsOutput GRecMutex *audio_mutex; if(audio_channels == audio_channels_old){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* grow / shrink */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; ability_flags = audio->ability_flags; output_pads = audio->output_pads; input_pads = audio->input_pads; g_rec_mutex_unlock(audio_mutex); /* get some fields */ g_object_get(audio, "playback-domain", &playback_domain, NULL); if(audio_channels > audio_channels_old){ guint i; /* grow input channels */ if(input_pads > 0 && (AGS_AUDIO_NO_INPUT & (audio_flags)) == 0){ add_recycling = FALSE; add_pattern = FALSE; add_synth_generator = FALSE; link_recycling = FALSE; set_sync_link = FALSE; set_async_link = FALSE; if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ add_recycling = TRUE; } bank_dim[0] = 0; bank_dim[1] = 0; bank_dim[2] = 0; if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) != 0){ add_pattern = TRUE; g_rec_mutex_lock(audio_mutex); bank_dim[0] = audio->bank_dim[0]; bank_dim[1] = audio->bank_dim[1]; bank_dim[2] = audio->bank_dim[2]; g_rec_mutex_unlock(audio_mutex); } if((AGS_AUDIO_INPUT_HAS_SYNTH & (audio_flags)) != 0){ add_synth_generator = TRUE; } if((AGS_AUDIO_ASYNC & (audio_flags)) != 0 && add_recycling){ link_recycling = TRUE; } ags_audio_set_audio_channels_grow(audio, AGS_TYPE_INPUT, audio_channels, audio_channels_old, bank_dim[0], bank_dim[1], bank_dim[2], add_recycling, add_pattern, add_synth_generator, link_recycling, set_sync_link, set_async_link); } /* apply new sizes */ g_rec_mutex_lock(audio_mutex); audio->input_lines = audio_channels * audio->input_pads; g_rec_mutex_unlock(audio_mutex); /* grow output channels */ if(audio->output_pads > 0 && (AGS_AUDIO_NO_OUTPUT & (audio_flags)) == 0){ add_recycling = FALSE; add_pattern = FALSE; add_synth_generator = FALSE; link_recycling = FALSE; set_sync_link = FALSE; set_async_link = FALSE; if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) != 0){ add_recycling = TRUE; }else{ if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ if((AGS_AUDIO_SYNC & (audio_flags)) != 0 && (AGS_AUDIO_ASYNC & (audio_flags)) == 0){ set_sync_link = FALSE; set_async_link = TRUE; }else if((AGS_AUDIO_ASYNC & (audio_flags)) != 0){ set_async_link = TRUE; set_sync_link = FALSE; }else{ #ifdef AGS_DEBUG g_message("ags_audio_set_audio_channels - warning: AGS_AUDIO_SYNC nor AGS_AUDIO_ASYNC aren't defined"); #endif set_sync_link = FALSE; set_async_link = FALSE; } } } ags_audio_set_audio_channels_grow(audio, AGS_TYPE_OUTPUT, audio_channels, audio_channels_old, 0, 0, 0, add_recycling, add_pattern, add_synth_generator, link_recycling, set_sync_link, set_async_link); } /* apply new sizes */ g_rec_mutex_lock(audio_mutex); audio->output_lines = audio_channels * audio->output_pads; audio->audio_channels = audio_channels; g_rec_mutex_unlock(audio_mutex); /* add output playback */ g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; g_object_ref(channel); for(i = 0; i < audio_channels - audio_channels_old; i++){ /* playback */ g_object_get(channel, "playback", &playback, NULL); /* append */ ags_playback_domain_add_playback(playback_domain, (GObject *) playback, AGS_TYPE_OUTPUT); g_object_unref(playback); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } } /* add input playback */ g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(channel); while(channel != NULL){ nth_channel = ags_channel_nth(channel, audio_channels_old); g_object_unref(channel); channel = nth_channel; g_object_ref(channel); for(i = 0; i < audio_channels - audio_channels_old; i++){ /* playback */ g_object_get(channel, "playback", &playback, NULL); /* append */ ags_playback_domain_add_playback(playback_domain, (GObject *) playback, AGS_TYPE_INPUT); g_object_unref(playback); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } } }else if(audio_channels < audio_channels_old){ GList *start_list, *list; guint i, j; GRecMutex *playback_domain_mutex; /* shrink audio channels */ ags_audio_set_audio_channels_shrink_automation(audio, audio_channels, audio_channels_old); if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) != 0){ ags_audio_set_audio_channels_shrink_notation(audio, audio_channels, audio_channels_old); } if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) != 0){ ags_audio_set_audio_channels_shrink_wave(audio, audio_channels, audio_channels_old); } if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) != 0){ ags_audio_set_audio_channels_shrink_midi(audio, audio_channels, audio_channels_old); } if(audio_channels == 0){ ags_audio_set_audio_channels_shrink_zero(audio); }else{ ags_audio_set_audio_channels_shrink(audio, audio_channels, audio_channels_old); } /* apply new sizes */ g_rec_mutex_lock(audio_mutex); audio->audio_channels = audio_channels; audio->input_lines = audio_channels * audio->input_pads; audio->output_lines = audio_channels * audio->output_pads; g_rec_mutex_unlock(audio_mutex); /* shrink output playback domain */ g_object_get(playback_domain, "output-playback", &start_list, NULL); for(j = 0; j < output_pads; j++){ list = g_list_nth(start_list, (j + 1) * audio_channels); for(i = 0; i < audio_channels_old - audio_channels && list != NULL; i++){ playback = list->data; if(AGS_IS_PLAYBACK(playback)){ ags_playback_domain_remove_playback(playback_domain, (GObject *) playback, AGS_TYPE_OUTPUT); } /* iterate */ list = list->next; } } g_list_free_full(start_list, g_object_unref); /* shrink input playback domain */ g_object_get(playback_domain, "input-playback", &start_list, NULL); for(j = 0; j < input_pads; j++){ list = g_list_nth(start_list, (j + 1) * audio_channels); for(i = 0; i < audio_channels_old - audio_channels; i++){ playback = list->data; if(AGS_IS_PLAYBACK(playback)){ ags_playback_domain_remove_playback(playback_domain, (GObject *) playback, AGS_TYPE_INPUT); } /* iterate */ list = list->next; } } g_list_free_full(start_list, g_object_unref); } /* unref */ g_object_unref(playback_domain); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::set-audio-channels"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* audio channels */ message->parameter_name[0] = "audio-channels"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), audio_channels); /* audio channels old */ message->parameter_name[1] = "audio-channels-old"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), audio_channels_old); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_audio_set_audio_channels: * @audio: the #AgsAudio * @audio_channels: new audio channels * @audio_channels_old: old audio channels * * Resize audio channels AgsInput will be allocated first. * * Since: 3.0.0 */ void ags_audio_set_audio_channels(AgsAudio *audio, guint audio_channels, guint audio_channels_old) { GRecMutex *audio_mutex; g_return_if_fail(AGS_IS_AUDIO(audio)); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio channels old */ g_rec_mutex_lock(audio_mutex); audio_channels_old = audio->audio_channels; g_rec_mutex_unlock(audio_mutex); /* emit */ g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[SET_AUDIO_CHANNELS], 0, audio_channels, audio_channels_old); g_object_unref((GObject *) audio); } /** * ags_audio_get_output_pads: * @audio: the #AgsAudio * * Get output pads. * * Returns: the output pads * * Since: 3.1.0 */ guint ags_audio_get_output_pads(AgsAudio *audio) { guint output_pads; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "output-pads", &output_pads, NULL); return(output_pads); } /** * ags_audio_set_output_pads: * @audio: the #AgsAudio * @output_pads: output pads * * Set output pads. * * Since: 3.1.0 */ void ags_audio_set_output_pads(AgsAudio *audio, guint output_pads) { ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, output_pads, 0); } /** * ags_audio_get_input_pads: * @audio: the #AgsAudio * * Get input pads. * * Returns: the input pads * * Since: 3.1.0 */ guint ags_audio_get_input_pads(AgsAudio *audio) { guint input_pads; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "input-pads", &input_pads, NULL); return(input_pads); } /** * ags_audio_set_input_pads: * @audio: the #AgsAudio * @input_pads: input pads * * Set input pads. * * Since: 3.1.0 */ void ags_audio_set_input_pads(AgsAudio *audio, guint input_pads) { ags_audio_set_pads(audio, AGS_TYPE_INPUT, input_pads, 0); } void ags_audio_set_pads_grow(AgsAudio *audio, GType channel_type, guint pads, guint pads_old, guint bank_dim_0, guint bank_dim_1, guint bank_dim_2, gboolean add_recycling, gboolean add_pattern, gboolean add_synth_generator, gboolean link_recycling, gboolean set_sync_link, gboolean set_async_link) { AgsChannel *start; AgsChannel *channel, *nth_channel; AgsRecycling *first_recycling, *last_recycling; AgsPlaybackDomain *playback_domain; GObject *output_soundcard; GObject *input_soundcard; guint samplerate; guint buffer_size; guint format; guint audio_channels; guint i, j; GRecMutex *audio_mutex; GRecMutex *prev_mutex, *prev_pad_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_object_get(audio, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, "audio-channels", &audio_channels, "output-soundcard", &output_soundcard, "input-soundcard", &input_soundcard, "playback-domain", &playback_domain, NULL); if(channel_type == AGS_TYPE_OUTPUT){ g_object_get(audio, "output", &start, NULL); }else{ g_object_get(audio, "input", &start, NULL); } for(j = pads_old; j < pads; j++){ AgsPlayback *playback; for(i = 0; i < audio_channels; i++){ channel = (AgsChannel *) g_object_new(channel_type, "audio", (GObject *) audio, "output-soundcard", output_soundcard, "output-soundcard-channel", i, "input-soundcard", input_soundcard, "input-soundcard-channel", i, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); g_object_ref(channel); playback = (AgsPlayback *) channel->playback; g_object_set(playback, "playback-domain", playback_domain, NULL); if(add_pattern){ AgsPattern *pattern; pattern = ags_pattern_new(); g_object_set(channel, "pattern", pattern, NULL); ags_pattern_set_dim(pattern, bank_dim_0, bank_dim_1, bank_dim_2); } if(add_synth_generator){ AgsSynthGenerator *synth_generator; synth_generator = ags_synth_generator_new(); ags_input_add_synth_generator((AgsInput *) channel, (GObject *) synth_generator); } if(start == NULL){ /* set first channel in AgsAudio */ g_rec_mutex_lock(audio_mutex); if(channel_type == AGS_TYPE_OUTPUT){ start = audio->output = channel; }else{ start = audio->input = channel; } g_rec_mutex_unlock(audio_mutex); } if(j * audio_channels + i != 0){ /* set prev */ channel->prev = ags_channel_nth(start, j * audio_channels + i - 1); g_object_unref(channel->prev); /* get prev mutex */ prev_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel->prev); /* set prev->next */ g_rec_mutex_lock(prev_mutex); channel->prev->next = channel; g_rec_mutex_unlock(prev_mutex); } if(j != 0){ /* set prev pad */ nth_channel = ags_channel_nth(start, i); channel->prev_pad = ags_channel_pad_nth(nth_channel, j - 1); g_object_unref(nth_channel); g_object_unref(channel->prev_pad); /* get prev pad mutex */ prev_pad_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel->prev_pad); /* set prev_pad->next_pad */ g_rec_mutex_lock(prev_pad_mutex); channel->prev_pad->next_pad = channel; g_rec_mutex_unlock(prev_pad_mutex); } /* set indices */ channel->pad = j; channel->audio_channel = i; channel->line = j * audio_channels + i; /* reset nested AgsRecycling tree */ if(add_recycling){ first_recycling = last_recycling = ags_recycling_new(output_soundcard); g_object_ref(first_recycling); g_object_set(first_recycling, "channel", channel, NULL); ags_channel_reset_recycling(channel, first_recycling, last_recycling); }else if(set_sync_link){ AgsChannel *input; g_rec_mutex_lock(audio_mutex); input = audio->input; g_rec_mutex_unlock(audio_mutex); input = ags_channel_nth(input, channel->line); g_object_unref(input); /* set sync link */ if(input != NULL){ first_recycling = input->first_recycling; last_recycling = input->last_recycling; ags_channel_reset_recycling(channel, first_recycling, last_recycling); } }else if(set_async_link){ AgsChannel *start_input; AgsChannel *input, *input_pad_last, *nth_input; g_rec_mutex_lock(audio_mutex); start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); nth_input = ags_channel_nth(start_input, i); g_object_unref(nth_input); input = nth_input; /* set async link */ if(input != NULL){ input_pad_last = ags_channel_pad_last(input); first_recycling = input->first_recycling; last_recycling = input_pad_last->last_recycling; ags_channel_reset_recycling(channel, first_recycling, last_recycling); g_object_unref(input_pad_last); g_object_unref(input); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } } } } /* unref */ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(input_soundcard != NULL){ g_object_unref(input_soundcard); } if(start != NULL){ g_object_unref(start); } g_object_unref(playback_domain); } void ags_audio_set_pads_unlink(AgsAudio *audio, GType channel_type, guint pads) { AgsChannel *channel, *next_channel; GError *error; if(!AGS_IS_AUDIO(audio)){ return; } if(channel_type == AGS_TYPE_OUTPUT){ channel = ags_channel_pad_nth(audio->output, pads); }else{ channel = ags_channel_pad_nth(audio->input, pads); } while(channel != NULL){ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_error("%s", error->message); g_error_free(error); } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } void ags_audio_set_pads_shrink_zero(AgsAudio *audio, GType channel_type, guint pads) { AgsChannel *channel, *channel_next; GError *error; if(!AGS_IS_AUDIO(audio)){ return; } if(channel_type == AGS_TYPE_OUTPUT){ channel = ags_channel_pad_nth(audio->output, pads); }else{ channel = ags_channel_pad_nth(audio->input, pads); } while(channel != NULL){ channel_next = channel->next; #if 0 error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_error("%s", error->message); g_error_free(error); } #endif g_object_run_dispose((GObject *) channel); g_object_unref((GObject *) channel); channel = channel_next; } } void ags_audio_set_pads_shrink(AgsAudio *audio, GType channel_type, guint pads) { AgsChannel *channel, *current; guint audio_channels; guint i; if(!AGS_IS_AUDIO(audio)){ return; } g_object_get(audio, "audio-channels", &audio_channels, NULL); if(channel_type == AGS_TYPE_OUTPUT){ channel = ags_channel_pad_nth(audio->output, pads); }else{ channel = ags_channel_pad_nth(audio->input, pads); } g_object_unref(channel); current = channel; if(channel != NULL && channel->prev_pad != NULL){ channel = channel->prev_pad; }else{ channel = NULL; } ags_audio_set_pads_shrink_zero(audio, channel_type, pads); /* remove pads */ if(channel != NULL){ current = channel; for(i = 0; i < audio_channels; i++){ current->next_pad = NULL; /* iterate */ current = current->next; } /* remove channel */ current = ags_channel_nth(channel, audio_channels - 1); if(current != NULL){ g_object_unref(current); current->next = NULL; } } } void ags_audio_set_pads_remove_notes(AgsAudio *audio, GType channel_type, guint pads) { GList *notation; GList *note_start, *note; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); notation = audio->notation; while(notation != NULL){ note = note_start = g_list_copy(AGS_NOTATION(notation->data)->note); while(note != NULL){ if(AGS_NOTE(note->data)->y >= pads){ AGS_NOTATION(notation->data)->note = g_list_remove(AGS_NOTATION(notation->data)->note, note->data); g_object_unref(note->data); } note = note->next; } g_list_free(note_start); notation = notation->next; } g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_pads_shrink_automation(AgsAudio *audio, GType channel_type, guint pads) { GList *list_start, *list; guint audio_channels; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); audio_channels = audio->audio_channels; list = list_start = g_list_copy(audio->automation); while(list != NULL){ if(AGS_AUTOMATION(list->data)->channel_type == channel_type && AGS_AUTOMATION(list->data)->line >= pads * audio_channels){ ags_audio_remove_automation(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); } list = list->next; } g_list_free(list_start); g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_pads_shrink_wave(AgsAudio *audio, GType channel_type, guint pads) { GList *list_start, *list; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); list = list_start = g_list_copy(audio->wave); while(list != NULL){ ags_audio_remove_wave(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); list = list->next; } g_list_free(audio->wave); g_list_free(list_start); audio->wave = NULL; g_rec_mutex_unlock(audio_mutex); } void ags_audio_set_pads_shrink_midi(AgsAudio *audio, GType channel_type, guint pads) { GList *list_start, *list; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); list = list_start = g_list_copy(audio->midi); while(list != NULL){ ags_audio_remove_midi(audio, list->data); g_object_run_dispose((GObject *) list->data); g_object_unref((GObject *) list->data); list = list->next; } g_list_free(audio->midi); g_list_free(list_start); audio->midi = NULL; g_rec_mutex_unlock(audio_mutex); } /* * resize * AgsInput has to be allocated first */ void ags_audio_real_set_pads(AgsAudio *audio, GType channel_type, guint pads, guint pads_old) { AgsChannel *start_channel, *channel, *next_channel; AgsPlaybackDomain *playback_domain; AgsMessageDelivery *message_delivery; GList *start_message_queue; guint bank_dim[3]; guint audio_flags; guint ability_flags; guint behaviour_flags; guint audio_channels; guint output_pads, input_pads; gboolean add_recycling; gboolean add_pattern; gboolean add_synth_generator; gboolean link_recycling; gboolean set_sync_link, set_async_link; GRecMutex *audio_mutex; if(!(g_type_is_a(channel_type, AGS_TYPE_OUTPUT) || g_type_is_a(channel_type, AGS_TYPE_INPUT))){ g_warning("unknown channel type"); return; } if(pads_old == pads){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; ability_flags = audio->ability_flags; behaviour_flags = audio->behaviour_flags; audio_channels = audio->audio_channels; output_pads = audio->output_pads; input_pads = audio->input_pads; g_rec_mutex_unlock(audio_mutex); /* get some fields */ g_object_get(audio, "playback-domain", &playback_domain, NULL); add_recycling = FALSE; add_pattern = FALSE; add_synth_generator = FALSE; link_recycling = FALSE; set_sync_link = FALSE; set_async_link = FALSE; if(g_type_is_a(channel_type, AGS_TYPE_OUTPUT) && (AGS_AUDIO_NO_OUTPUT & (audio_flags)) == 0){ if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) != 0){ add_recycling = TRUE; }else{ if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ if((AGS_AUDIO_SYNC & (audio_flags)) != 0 && (AGS_AUDIO_ASYNC & (audio_flags)) == 0){ set_async_link = TRUE; }else if((AGS_AUDIO_ASYNC & (audio_flags)) != 0){ set_async_link = TRUE; }else{ #ifdef AGS_DEBUG g_message("ags_audio_set_pads - warning: AGS_AUDIO_SYNC nor AGS_AUDIO_ASYNC aren't defined"); #endif } } } /* output */ if(audio_channels != 0){ /* grow or shrink */ if(pads > output_pads){ guint i, j; /* grow channels */ ags_audio_set_pads_grow(audio, AGS_TYPE_OUTPUT, pads, pads_old, 0, 0, 0, add_recycling, add_pattern, add_synth_generator, link_recycling, set_sync_link, set_async_link); /* get some fields */ g_object_get(audio, "output", &start_channel, NULL); /* add playback domain */ channel = ags_channel_pad_nth(start_channel, pads_old); for(j = pads_old; j < pads; j++){ for(i = 0; i < audio_channels; i++){ AgsPlayback *playback; /* playback */ g_object_get(channel, "playback", &playback, NULL); /* append */ ags_playback_domain_add_playback(playback_domain, (GObject *) playback, AGS_TYPE_OUTPUT); g_object_unref(playback); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } g_object_unref(start_channel); }else if(pads == 0){ GList *start_list, *list; ags_audio_set_pads_shrink_automation(audio, AGS_TYPE_OUTPUT, pads); if((AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT & (behaviour_flags)) != 0){ if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) != 0){ ags_audio_set_pads_remove_notes(audio, AGS_TYPE_OUTPUT, pads); } if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) != 0){ ags_audio_set_pads_shrink_wave(audio, AGS_TYPE_OUTPUT, pads); } if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) != 0){ ags_audio_set_pads_shrink_midi(audio, AGS_TYPE_OUTPUT, pads); } } /* unlink and remove */ ags_audio_set_pads_unlink(audio, AGS_TYPE_OUTPUT, 0); ags_audio_set_pads_shrink_zero(audio, AGS_TYPE_OUTPUT, 0); g_rec_mutex_lock(audio_mutex); audio->output = NULL; g_rec_mutex_unlock(audio_mutex); /* remove playback */ g_object_get(playback_domain, "output-playback", &start_list, NULL); list = start_list; while(list != NULL){ AgsPlayback *playback; playback = (AgsPlayback *) list->data; if(AGS_IS_PLAYBACK(playback)){ /* remove playback */ ags_playback_domain_remove_playback(playback_domain, (GObject *) playback, AGS_TYPE_OUTPUT); g_object_run_dispose((GObject *) playback); g_object_unref((GObject *) playback); } /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); }else if(pads < output_pads){ GList *start_list, *list; /* get some fields */ ags_audio_set_pads_shrink_automation(audio, AGS_TYPE_OUTPUT, pads); ags_audio_set_pads_remove_notes(audio, AGS_TYPE_OUTPUT, pads); /* remove playback */ g_object_get(playback_domain, "output-playback", &start_list, NULL); list = start_list; while(list != NULL){ AgsChannel *current; AgsPlayback *playback; guint current_line; playback = (AgsPlayback *) list->data; g_object_get(playback, "channel", ¤t, NULL); g_object_get(current, "line", ¤t_line, NULL); if(current_line >= pads * audio_channels && AGS_IS_PLAYBACK(playback)){ /* remove playback */ ags_playback_domain_remove_playback(playback_domain, (GObject *) playback, AGS_TYPE_OUTPUT); g_object_run_dispose((GObject *) playback); g_object_unref((GObject *) playback); } g_object_unref(current); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); ags_audio_set_pads_unlink(audio, AGS_TYPE_OUTPUT, pads); ags_audio_set_pads_shrink(audio, AGS_TYPE_OUTPUT, pads); } } /* apply new size */ g_rec_mutex_lock(audio_mutex); audio->output_pads = pads; audio->output_lines = pads * audio_channels; g_rec_mutex_unlock(audio_mutex); // if((AGS_AUDIO_SYNC & audio_flags) != 0 && (AGS_AUDIO_ASYNC & audio_flags) == 0){ //TODO:JK: fix me // input_pads = pads; // audio->input_lines = pads * audio_channels; // } }else if(g_type_is_a(channel_type, AGS_TYPE_INPUT) && (AGS_AUDIO_NO_INPUT & (audio_flags)) == 0){ if((AGS_AUDIO_INPUT_HAS_SYNTH & (audio_flags)) != 0){ add_synth_generator = TRUE; } if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ add_recycling = TRUE; } if((AGS_AUDIO_ASYNC & (audio_flags)) != 0 && add_recycling){ link_recycling = TRUE; } bank_dim[0] = 0; bank_dim[1] = 0; bank_dim[2] = 0; g_rec_mutex_lock(audio_mutex); if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) != 0){ add_pattern = TRUE; bank_dim[0] = audio->bank_dim[0]; bank_dim[1] = audio->bank_dim[1]; bank_dim[2] = audio->bank_dim[2]; } g_rec_mutex_unlock(audio_mutex); /* input */ if(audio_channels != 0){ /* grow or shrink */ if(pads > pads_old){ AgsChannel *current; guint i, j; /* grow channels */ ags_audio_set_pads_grow(audio, AGS_TYPE_INPUT, pads, pads_old, bank_dim[0], bank_dim[1], bank_dim[2], add_recycling, add_pattern, add_synth_generator, link_recycling, set_sync_link, set_async_link); /* get some fields */ g_object_get(audio, "input", &start_channel, NULL); /* add playback domain */ channel = ags_channel_pad_nth(start_channel, pads_old); for(j = pads_old; j < pads; j++){ for(i = 0; i < audio_channels; i++){ AgsPlayback *playback; /* playback */ g_object_get(channel, "playback", &playback, NULL); /* append */ ags_playback_domain_add_playback(playback_domain, (GObject *) playback, AGS_TYPE_INPUT); g_object_unref(playback); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } g_object_unref(start_channel); }else if(pads == 0){ GList *start_list, *list; ags_audio_set_pads_shrink_automation(audio, AGS_TYPE_INPUT, pads); if((AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT & (behaviour_flags)) != 0){ if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) != 0){ ags_audio_set_pads_remove_notes(audio, AGS_TYPE_INPUT, pads); } if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) != 0){ ags_audio_set_pads_shrink_wave(audio, AGS_TYPE_INPUT, pads); } if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) != 0){ ags_audio_set_pads_shrink_midi(audio, AGS_TYPE_INPUT, pads); } } /* shrink channels */ ags_audio_set_pads_unlink(audio, AGS_TYPE_INPUT, pads); ags_audio_set_pads_shrink_zero(audio, AGS_TYPE_INPUT, pads); g_rec_mutex_lock(audio_mutex); audio->input = NULL; g_rec_mutex_unlock(audio_mutex); /* remove playback */ g_object_get(playback_domain, "input-playback", &start_list, NULL); list = start_list; while(list != NULL){ AgsPlayback *playback; playback = (AgsPlayback *) list->data; if(AGS_IS_PLAYBACK(playback)){ /* remove playback */ ags_playback_domain_remove_playback(playback_domain, (GObject *) playback, AGS_TYPE_INPUT); g_object_run_dispose((GObject *) playback); g_object_unref((GObject *) playback); } /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); }else if(pads < pads_old){ GList *start_list, *list; /* get some fields */ ags_audio_set_pads_shrink_automation(audio, AGS_TYPE_INPUT, pads); /* remove playback */ g_object_get(playback_domain, "input-playback", &start_list, NULL); list = start_list; while(list != NULL){ AgsChannel *current; AgsPlayback *playback; guint current_line; playback = (AgsPlayback *) list->data; g_object_get(playback, "channel", ¤t, NULL); g_object_get(current, "line", ¤t_line, NULL); if(current_line >= pads * audio_channels && AGS_IS_PLAYBACK(playback)){ /* remove playback */ ags_playback_domain_remove_playback(playback_domain, (GObject *) playback, AGS_TYPE_INPUT); g_object_run_dispose((GObject *) playback); g_object_unref((GObject *) playback); } g_object_unref(current); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); ags_audio_set_pads_unlink(audio, AGS_TYPE_INPUT, pads); ags_audio_set_pads_shrink(audio, AGS_TYPE_INPUT, pads); } } /* apply new allocation */ g_rec_mutex_lock(audio_mutex); audio->input_pads = pads; audio->input_lines = pads * audio_channels; g_rec_mutex_unlock(audio_mutex); } /* unref */ g_object_unref(playback_domain); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::set-pads"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 3; message->parameter_name = (gchar *) malloc(4 * sizeof(gchar *)); message->value = g_new0(GValue, 3); /* channel type */ message->parameter_name[0] = "channel-type"; g_value_init(&(message->value[0]), G_TYPE_ULONG); g_value_set_ulong(&(message->value[0]), channel_type); /* pads */ message->parameter_name[1] = "pads"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), pads); /* pads old */ message->parameter_name[2] = "pads-old"; g_value_init(&(message->value[2]), G_TYPE_UINT); g_value_set_uint(&(message->value[2]), pads_old); /* terminate string vector */ message->parameter_name[3] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_audio_set_pads: * @audio: the #AgsAudio * @channel_type: AGS_TYPE_INPUT or AGS_TYPE_OUTPUT * @pads: new pad count * @pads_old: old pad count * * Set pad count for the apropriate @channel_type * * Since: 3.0.0 */ void ags_audio_set_pads(AgsAudio *audio, GType channel_type, guint pads, guint pads_old) { GRecMutex *audio_mutex; g_return_if_fail(AGS_IS_AUDIO(audio)); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get output/input pads old */ g_rec_mutex_lock(audio_mutex); pads_old = ((g_type_is_a(channel_type, AGS_TYPE_OUTPUT)) ? audio->output_pads: audio->input_pads); g_rec_mutex_unlock(audio_mutex); /* emit */ g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[SET_PADS], 0, channel_type, pads, pads_old); g_object_unref((GObject *) audio); } /** * ags_audio_get_output_lines: * @audio: the #AgsAudio * * Get output lines. * * Returns: the output lines * * Since: 3.1.0 */ guint ags_audio_get_output_lines(AgsAudio *audio) { guint output_lines; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "output-lines", &output_lines, NULL); return(output_lines); } /** * ags_audio_get_input_lines: * @audio: the #AgsAudio * * Get input lines. * * Returns: the input lines * * Since: 3.1.0 */ guint ags_audio_get_input_lines(AgsAudio *audio) { guint input_lines; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "input-lines", &input_lines, NULL); return(input_lines); } /** * ags_audio_get_output: * @audio: the #AgsAudio * * Get the output object of @audio. * * Returns: (transfer full): the output * * Since: 3.1.0 */ AgsChannel* ags_audio_get_output(AgsAudio *audio) { AgsChannel *output; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "output", &output, NULL); return(output); } /** * ags_audio_get_input: * @audio: the #AgsAudio * * Get the input object of @audio. * * Returns: (transfer full): the input * * Since: 3.1.0 */ AgsChannel* ags_audio_get_input(AgsAudio *audio) { AgsChannel *input; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "input", &input, NULL); return(input); } /** * ags_audio_get_output_soundcard: * @audio: the #AgsAudio * * Get the output soundcard object of @audio. * * Returns: (transfer full): the output soundcard * * Since: 3.1.0 */ GObject* ags_audio_get_output_soundcard(AgsAudio *audio) { GObject *output_soundcard; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "output-soundcard", &output_soundcard, NULL); return(output_soundcard); } /** * ags_audio_set_output_soundcard: * @audio: the #AgsAudio * @output_soundcard: an #AgsSoundcard * * Set the output soundcard object of @audio. * * Since: 3.0.0 */ void ags_audio_set_output_soundcard(AgsAudio *audio, GObject *output_soundcard) { AgsChannel *start_channel, *channel, *next_channel; AgsPlaybackDomain *playback_domain; AgsThread *audio_thread; GObject *old_soundcard; GList *list; guint samplerate; guint buffer_size; guint format; guint i; GRecMutex *audio_mutex; GRecMutex *play_mutex, *recall_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* old soundcard */ g_rec_mutex_lock(audio_mutex); old_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); if(old_soundcard == output_soundcard){ return; } /* ref and set new soundcard */ if(output_soundcard != NULL){ g_object_ref(output_soundcard); } g_rec_mutex_lock(audio_mutex); audio->output_soundcard = (GObject *) output_soundcard; g_rec_mutex_unlock(audio_mutex); if(output_soundcard != NULL){ /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, &samplerate, &buffer_size, &format); /* apply presets */ g_object_set(audio, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); } /* output */ g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(start_channel); while(channel != NULL){ /* reset */ g_object_set(G_OBJECT(channel), "output-soundcard", output_soundcard, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* input */ g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(start_channel); while(channel != NULL){ /* reset */ g_object_set(G_OBJECT(channel), "output-soundcard", output_soundcard, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* playback domain - audio thread */ g_object_get(audio, "playback-domain", &playback_domain, NULL); /* audio thread - output soundcard */ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); if(audio_thread != NULL){ /* set output soundcard */ g_object_set(audio_thread, "default-output-soundcard", output_soundcard, NULL); g_object_unref(audio_thread); } } g_object_unref(playback_domain); /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* play context */ g_rec_mutex_lock(play_mutex); list = audio->play; while(list != NULL){ g_object_set(G_OBJECT(list->data), "output-soundcard", output_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(play_mutex); /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* recall context */ g_rec_mutex_lock(recall_mutex); list = audio->recall; while(list != NULL){ g_object_set(G_OBJECT(list->data), "output-soundcard", output_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(recall_mutex); /* unref old soundcard */ if(old_soundcard != NULL){ g_object_unref(old_soundcard); } } /** * ags_audio_get_input_soundcard: * @audio: the #AgsAudio * * Get the input soundcard object of @audio. * * Returns: (transfer full): the input soundcard * * Since: 3.1.0 */ GObject* ags_audio_get_input_soundcard(AgsAudio *audio) { GObject *input_soundcard; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "input-soundcard", &input_soundcard, NULL); return(input_soundcard); } /** * ags_audio_set_input_soundcard: * @audio: the #AgsAudio * @input_soundcard: an #AgsSoundcard * * Set the input soundcard object on audio. * * Since: 3.0.0 */ void ags_audio_set_input_soundcard(AgsAudio *audio, GObject *input_soundcard) { AgsChannel *start_channel, *channel, *next_channel; GObject *old_soundcard; GList *list; GRecMutex *audio_mutex; GRecMutex *play_mutex, *recall_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* old soundcard */ g_rec_mutex_lock(audio_mutex); old_soundcard = audio->input_soundcard; g_rec_mutex_unlock(audio_mutex); if(old_soundcard == input_soundcard){ return; } /* ref and set new soundcard */ if(input_soundcard != NULL){ g_object_ref(input_soundcard); } g_rec_mutex_lock(audio_mutex); audio->input_soundcard = (GObject *) input_soundcard; g_rec_mutex_unlock(audio_mutex); /* output */ g_object_get(audio, "output", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(start_channel); while(channel != NULL){ /* reset */ g_object_set(G_OBJECT(channel), "input-soundcard", input_soundcard, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* input */ g_object_get(audio, "input", &start_channel, NULL); if(start_channel != NULL){ channel = start_channel; g_object_ref(start_channel); while(channel != NULL){ /* reset */ g_object_set(G_OBJECT(channel), "input-soundcard", input_soundcard, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } g_object_unref(start_channel); } /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* play context */ g_rec_mutex_lock(play_mutex); list = audio->play; while(list != NULL){ g_object_set(G_OBJECT(list->data), "input-soundcard", input_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(play_mutex); /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* recall context */ g_rec_mutex_lock(recall_mutex); list = audio->recall; while(list != NULL){ g_object_set(G_OBJECT(list->data), "input-soundcard", input_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(recall_mutex); /* unref old soundcard */ if(old_soundcard != NULL){ g_object_unref(old_soundcard); } } /** * ags_audio_get_output_sequencer: * @audio: the #AgsAudio * * Get the output sequencer object of @audio. * * Returns: (transfer full): the output sequencer * * Since: 3.1.0 */ GObject* ags_audio_get_output_sequencer(AgsAudio *audio) { GObject *output_sequencer; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "output-sequencer", &output_sequencer, NULL); return(output_sequencer); } /** * ags_audio_set_output_sequencer: * @audio: the #AgsAudio * @sequencer: the output sequencer * * Set output sequencer. * * Since: 3.0.0 */ void ags_audio_set_output_sequencer(AgsAudio *audio, GObject *sequencer) { GObject *old_sequencer; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* old sequencer */ g_rec_mutex_lock(audio_mutex); old_sequencer = audio->output_sequencer; g_rec_mutex_unlock(audio_mutex); if(old_sequencer == sequencer){ return; } /* ref and set new sequencer */ if(sequencer != NULL){ g_object_ref(sequencer); } g_rec_mutex_lock(audio_mutex); audio->output_sequencer = (GObject *) sequencer; g_rec_mutex_unlock(audio_mutex); /* unref old sequencer */ if(old_sequencer != NULL){ g_object_unref(old_sequencer); } } /** * ags_audio_get_input_sequencer: * @audio: the #AgsAudio * * Get the input sequencer object of @audio. * * Returns: (transfer full): the input sequencer * * Since: 3.1.0 */ GObject* ags_audio_get_input_sequencer(AgsAudio *audio) { GObject *input_sequencer; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "input-sequencer", &input_sequencer, NULL); return(input_sequencer); } /** * ags_audio_set_input_sequencer: * @audio: the #AgsAudio * @sequencer: the input sequencer * * Set input sequencer. * * Since: 3.0.0 */ void ags_audio_set_input_sequencer(AgsAudio *audio, GObject *sequencer) { GObject *old_sequencer; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* old sequencer */ g_rec_mutex_lock(audio_mutex); old_sequencer = audio->input_sequencer; g_rec_mutex_unlock(audio_mutex); if(old_sequencer == sequencer){ return; } /* ref and set new sequencer */ if(sequencer != NULL){ g_object_ref(sequencer); } g_rec_mutex_lock(audio_mutex); audio->input_sequencer = (GObject *) sequencer; g_rec_mutex_unlock(audio_mutex); /* unref old sequencer */ if(old_sequencer != NULL){ g_object_unref(old_sequencer); } } /** * ags_audio_get_samplerate: * @audio: the #AgsAudio * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_audio_get_samplerate(AgsAudio *audio) { guint samplerate; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "samplerate", &samplerate, NULL); return(samplerate); } void ags_audio_set_samplerate_channel(AgsChannel *start_channel, guint samplerate) { AgsChannel *channel, *next_channel; if(!AGS_IS_CHANNEL(start_channel)){ return; } channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* set samplerate */ g_object_set(channel, "samplerate", samplerate, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /** * ags_audio_set_samplerate: * @audio: the #AgsAudio * @samplerate: the samplerate * * Sets samplerate. * * Since: 3.0.0 */ void ags_audio_set_samplerate(AgsAudio *audio, guint samplerate) { AgsChannel *start_output, *start_input; AgsPlaybackDomain *playback_domain; AgsThread *audio_thread; AgsMessageDelivery *message_delivery; GList *start_message_queue; GList *start_list, *list; gdouble frequency; guint old_samplerate; guint i; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set samplerate */ g_rec_mutex_lock(audio_mutex); old_samplerate = audio->samplerate; audio->samplerate = samplerate; frequency = ceil((gdouble) audio->samplerate / (gdouble) audio->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output", &start_output, "input", &start_input, "playback-domain", &playback_domain, "synth-generator", &start_list, NULL); /* audio thread - frequency */ if(playback_domain != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); if(audio_thread != NULL){ /* apply new frequency */ g_object_set(audio_thread, "frequency", frequency, NULL); g_object_unref(audio_thread); } } } /* set samplerate output/input */ ags_audio_set_samplerate_channel(start_output, samplerate); ags_audio_set_samplerate_channel(start_input, samplerate); /* set samplerate synth generator */ list = start_list; while(list != NULL){ g_object_set(list->data, "samplerate", samplerate, NULL); list = list->next; } g_list_free_full(start_list, g_object_unref); /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::set-samplerate"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* samplerate */ message->parameter_name[0] = "samplerate"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), samplerate); /* old samplerate */ message->parameter_name[1] = "old-samplerate"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), old_samplerate); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_audio_get_buffer_size: * @audio: the #AgsAudio * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_audio_get_buffer_size(AgsAudio *audio) { guint buffer_size; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "buffer-size", &buffer_size, NULL); return(buffer_size); } void ags_audio_set_buffer_size_channel(AgsChannel *start_channel, guint buffer_size) { AgsChannel *channel, *next_channel; if(!AGS_IS_CHANNEL(start_channel)){ return; } channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* set buffer size */ g_object_set(channel, "buffer-size", buffer_size, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /** * ags_audio_set_buffer_size: * @audio: the #AgsAudio * @buffer_size: the buffer length * * Sets buffer length. * * Since: 3.0.0 */ void ags_audio_set_buffer_size(AgsAudio *audio, guint buffer_size) { AgsChannel *start_output, *start_input; AgsPlaybackDomain *playback_domain; AgsThread *audio_thread; AgsMessageDelivery *message_delivery; GList *start_message_queue; GList *start_list, *list; gdouble frequency; guint old_buffer_size; guint i; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set buffer size */ g_rec_mutex_lock(audio_mutex); old_buffer_size = audio->buffer_size; audio->buffer_size = buffer_size; frequency = ceil((gdouble) audio->samplerate / (gdouble) audio->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output", &start_output, "input", &start_input, "playback-domain", &playback_domain, "synth-generator", &start_list, NULL); /* audio thread - frequency */ if(playback_domain != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); if(audio_thread != NULL){ /* apply new frequency */ g_object_set(playback_domain->audio_thread[i], "frequency", frequency, NULL); g_object_unref(audio_thread); } } } /* set buffer size output/input */ ags_audio_set_buffer_size_channel(start_output, buffer_size); ags_audio_set_buffer_size_channel(start_input, buffer_size); /* set buffer size synth generator */ list = start_list; while(list != NULL){ g_object_set(list->data, "buffer-size", buffer_size, NULL); list = list->next; } g_list_free_full(start_list, g_object_unref); /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::set-buffer-size"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* buffer_size */ message->parameter_name[0] = "buffer-size"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), buffer_size); /* old buffer_size */ message->parameter_name[1] = "old-buffer-size"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), old_buffer_size); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_audio_get_format: * @audio: the #AgsAudio * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_audio_get_format(AgsAudio *audio) { guint format; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "format", &format, NULL); return(format); } void ags_audio_set_format_channel(AgsChannel *start_channel, guint format) { AgsChannel *channel, *next_channel; if(!AGS_IS_CHANNEL(start_channel)){ return; } channel = start_channel; g_object_ref(channel); while(channel != NULL){ /* set format */ g_object_set(channel, "format", format, NULL); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /** * ags_audio_set_format: * @audio: the #AgsAudio * @format: the format * * Sets buffer length. * * Since: 3.0.0 */ void ags_audio_set_format(AgsAudio *audio, guint format) { AgsChannel *start_output, *start_input; AgsMessageDelivery *message_delivery; GList *start_message_queue; GList *start_list, *list; guint old_format; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* set format */ g_rec_mutex_lock(audio_mutex); old_format = audio->format; audio->format = format; g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output", &start_output, "input", &start_input, "synth-generator", &start_list, NULL); /* set format output/input */ ags_audio_set_format_channel(start_output, format); ags_audio_set_format_channel(start_input, format); /* set format synth generator */ list = start_list; while(list != NULL){ g_object_set(list->data, "format", format, NULL); list = list->next; } g_list_free_full(start_list, g_object_unref); /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::set-format"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* format */ message->parameter_name[0] = "format"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), format); /* old format */ message->parameter_name[1] = "old-format"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), old_format); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_audio_get_bpm: * @audio: the #AgsAudio * * Gets bpm. * * Returns: the bpm * * Since: 3.1.0 */ gdouble ags_audio_get_bpm(AgsAudio *audio) { gdouble bpm; if(!AGS_IS_AUDIO(audio)){ return(0.0); } g_object_get(audio, "bpm", &bpm, NULL); return(bpm); } /** * ags_audio_set_bpm: * @audio: the #AgsAudio * @bpm: the bpm * * Sets bpm. * * Since: 3.1.0 */ void ags_audio_set_bpm(AgsAudio *audio, gdouble bpm) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "bpm", bpm, NULL); } /** * ags_audio_get_audio_start_mapping: * @audio: the #AgsAudio * * Gets audio start mapping. * * Returns: the audio start mapping * * Since: 3.1.0 */ guint ags_audio_get_audio_start_mapping(AgsAudio *audio) { guint audio_start_mapping; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "audio-start-mapping", &audio_start_mapping, NULL); return(audio_start_mapping); } /** * ags_audio_set_audio_start_mapping: * @audio: the #AgsAudio * @audio_start_mapping: the audio start mapping * * Sets audio start mapping. * * Since: 3.1.0 */ void ags_audio_set_audio_start_mapping(AgsAudio *audio, guint audio_start_mapping) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "audio-start-mapping", audio_start_mapping, NULL); } /** * ags_audio_get_midi_start_mapping: * @audio: the #AgsAudio * * Gets midi start mapping. * * Returns: the midi start mapping * * Since: 3.1.0 */ guint ags_audio_get_midi_start_mapping(AgsAudio *audio) { guint midi_start_mapping; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "midi-start-mapping", &midi_start_mapping, NULL); return(midi_start_mapping); } /** * ags_audio_set_midi_start_mapping: * @audio: the #AgsAudio * @midi_start_mapping: the midi start mapping * * Sets midi start mapping. * * Since: 3.1.0 */ void ags_audio_set_midi_start_mapping(AgsAudio *audio, guint midi_start_mapping) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "midi-start-mapping", midi_start_mapping, NULL); } /** * ags_audio_get_midi_channel: * @audio: the #AgsAudio * * Gets midi channel. * * Returns: the midi channel * * Since: 3.1.0 */ guint ags_audio_get_midi_channel(AgsAudio *audio) { guint midi_channel; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "midi-channel", &midi_channel, NULL); return(midi_channel); } /** * ags_audio_set_midi_channel: * @audio: the #AgsAudio * @midi_channel: the midi channel * * Sets midi channel. * * Since: 3.1.0 */ void ags_audio_set_midi_channel(AgsAudio *audio, guint midi_channel) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "midi-channel", midi_channel, NULL); } /** * ags_audio_get_numerator: * @audio: the #AgsAudio * * Gets numerator. * * Returns: the numerator * * Since: 3.1.0 */ guint ags_audio_get_numerator(AgsAudio *audio) { guint numerator; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "numerator", &numerator, NULL); return(numerator); } /** * ags_audio_set_numerator: * @audio: the #AgsAudio * @numerator: the numerator * * Sets numerator. * * Since: 3.1.0 */ void ags_audio_set_numerator(AgsAudio *audio, guint numerator) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "numerator", numerator, NULL); } /** * ags_audio_get_denominator: * @audio: the #AgsAudio * * Gets denominator. * * Returns: the denominator * * Since: 3.1.0 */ guint ags_audio_get_denominator(AgsAudio *audio) { guint denominator; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "denominator", &denominator, NULL); return(denominator); } /** * ags_audio_set_denominator: * @audio: the #AgsAudio * @denominator: the denominator * * Sets denominator. * * Since: 3.1.0 */ void ags_audio_set_denominator(AgsAudio *audio, guint denominator) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "denominator", denominator, NULL); } /** * ags_audio_get_time_signature: * @audio: the #AgsAudio * * Gets time signature. * * Returns: the time signature * * Since: 3.1.0 */ gchar* ags_audio_get_time_signature(AgsAudio *audio) { gchar *time_signature; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "time-signature", &time_signature, NULL); return(time_signature); } /** * ags_audio_set_time_signature: * @audio: the #AgsAudio * @time_signature: the time signature * * Sets time signature. * * Since: 3.1.0 */ void ags_audio_set_time_signature(AgsAudio *audio, gchar *time_signature) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "time-signature", time_signature, NULL); } /** * ags_audio_get_is_minor: * @audio: the #AgsAudio * * Gets is minor. * * Returns: is minor * * Since: 3.1.0 */ gboolean ags_audio_get_is_minor(AgsAudio *audio) { gboolean is_minor; if(!AGS_IS_AUDIO(audio)){ return(FALSE); } g_object_get(audio, "is-minor", &is_minor, NULL); return(is_minor); } /** * ags_audio_set_is_minor: * @audio: the #AgsAudio * @is_minor: is minor * * Sets is minor. * * Since: 3.1.0 */ void ags_audio_set_is_minor(AgsAudio *audio, gboolean is_minor) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "is-minor", is_minor, NULL); } /** * ags_audio_get_sharp_flats: * @audio: the #AgsAudio * * Gets sharp flats. * * Returns: the sharp flats * * Since: 3.1.0 */ guint ags_audio_get_sharp_flats(AgsAudio *audio) { guint sharp_flats; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "sharp-flats", &sharp_flats, NULL); return(sharp_flats); } /** * ags_audio_set_sharp_flats: * @audio: the #AgsAudio * @sharp_flats: the sharp flats * * Sets sharp flats. * * Since: 3.1.0 */ void ags_audio_set_sharp_flats(AgsAudio *audio, guint sharp_flats) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "sharp-flats", sharp_flats, NULL); } /** * ags_audio_get_octave: * @audio: the #AgsAudio * * Gets octave. * * Returns: the octave * * Since: 3.1.0 */ gint ags_audio_get_octave(AgsAudio *audio) { gint octave; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "octave", &octave, NULL); return(octave); } /** * ags_audio_set_octave: * @audio: the #AgsAudio * @octave: the octave * * Sets octave. * * Since: 3.1.0 */ void ags_audio_set_octave(AgsAudio *audio, gint octave) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "octave", octave, NULL); } /** * ags_audio_get_key: * @audio: the #AgsAudio * * Gets key. * * Returns: the key * * Since: 3.1.0 */ guint ags_audio_get_key(AgsAudio *audio) { guint key; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "key", &key, NULL); return(key); } /** * ags_audio_set_key: * @audio: the #AgsAudio * @key: the key * * Sets key. * * Since: 3.1.0 */ void ags_audio_set_key(AgsAudio *audio, guint key) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "key", key, NULL); } /** * ags_audio_get_absolute_key: * @audio: the #AgsAudio * * Gets absolute key. * * Returns: the absolute key * * Since: 3.1.0 */ gint ags_audio_get_absolute_key(AgsAudio *audio) { gint absolute_key; if(!AGS_IS_AUDIO(audio)){ return(0); } g_object_get(audio, "absolute-key", &absolute_key, NULL); return(absolute_key); } /** * ags_audio_set_absolute_key: * @audio: the #AgsAudio * @absolute_key: the absolute key * * Sets absolute key. * * Since: 3.1.0 */ void ags_audio_set_absolute_key(AgsAudio *audio, gint absolute_key) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "absolute-key", absolute_key, NULL); } /** * ags_audio_get_preset: * @audio: the #AgsAudio * * Get preset. * * Returns: (element-type AgsAudio.Preset) (transfer full): the #GList-struct containig #AgsPreset * * Since: 3.1.0 */ GList* ags_audio_get_preset(AgsAudio *audio) { GList *preset; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "preset", &preset, NULL); return(preset); } /** * ags_audio_set_preset: * @audio: the #AgsAudio * @preset: (element-type AgsAudio.Preset) (transfer full): the #GList-struct containing #AgsPreset * * Set preset by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_preset(AgsAudio *audio, GList *preset) { GList *start_preset; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_preset = audio->preset; audio->preset = preset; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_preset, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_preset: * @audio: the #AgsAudio * @preset: an #AgsPreset * * Adds a preset. * * Since: 3.0.0 */ void ags_audio_add_preset(AgsAudio *audio, GObject *preset) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_PRESET(preset)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add preset */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->preset, preset) == NULL){ success = TRUE; g_object_ref(preset); audio->preset = g_list_prepend(audio->preset, preset); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(preset, "audio", audio, NULL); } } /** * ags_audio_remove_preset: * @audio: the #AgsAudio * @preset: an #AgsPreset * * Removes a preset. * * Since: 3.0.0 */ void ags_audio_remove_preset(AgsAudio *audio, GObject *preset) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_PRESET(preset)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove preset */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->preset, preset) != NULL){ success = TRUE; audio->preset = g_list_remove(audio->preset, preset); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(preset, "audio", NULL, NULL); g_object_unref(preset); } } /** * ags_audio_get_playback_domain: * @audio: the #AgsAudio * * Get playback domain. * * Returns: (transfer full): the #AgsPlaybackDomain * * Since: 3.1.0 */ GObject* ags_audio_get_playback_domain(AgsAudio *audio) { GObject *playback_domain; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "playback-domain", &playback_domain, NULL); return(playback_domain); } /** * ags_audio_set_playback_domain: * @audio: the #AgsAudio * @playback_domain: the #AgsPlaybackDomain * * Set playback domain. * * Since: 3.1.0 */ void ags_audio_set_playback_domain(AgsAudio *audio, GObject *playback_domain) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "playback-domain", playback_domain, NULL); } /** * ags_audio_get_synth_generator: * @audio: the #AgsAudio * * Get synth generator. * * Returns: (element-type AgsAudio.SynthGenerator) (transfer full): the #GList-struct containing #AgsSynthGenerator * * Since: 3.1.0 */ GList* ags_audio_get_synth_generator(AgsAudio *audio) { GList *synth_generator; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "synth-generator", &synth_generator, NULL); return(synth_generator); } /** * ags_audio_set_synth_generator: * @audio: the #AgsAudio * @synth_generator: (element-type AgsAudio.SynthGenerator) (transfer full): the #GList-struct containing #AgsSynthGenerator * * Set synth generator by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_synth_generator(AgsAudio *audio, GList *synth_generator) { GList *start_synth_generator; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_synth_generator = audio->synth_generator; audio->synth_generator = synth_generator; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_synth_generator, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_synth_generator: * @audio: the #AgsAudio * @synth_generator: an #AgsSynthGenerator * * Adds a synth generator. * * Since: 3.0.0 */ void ags_audio_add_synth_generator(AgsAudio *audio, GObject *synth_generator) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add synth_generator */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->synth_generator, synth_generator) == NULL){ g_object_ref(synth_generator); audio->synth_generator = g_list_prepend(audio->synth_generator, synth_generator); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_remove_synth_generator: * @audio: the #AgsAudio * @synth_generator: an #AgsSynthGenerator * * Removes a synth generator. * * Since: 3.0.0 */ void ags_audio_remove_synth_generator(AgsAudio *audio, GObject *synth_generator) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove synth_generator */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->synth_generator, synth_generator) != NULL){ audio->synth_generator = g_list_remove(audio->synth_generator, synth_generator); g_object_unref(synth_generator); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_cursor: * @audio: the #AgsAudio * * Get cursor. * * Returns: (element-type GObject) (transfer full): the #GList-struct containig #GObject implementing #AgsCursor * * Since: 3.1.0 */ GList* ags_audio_get_cursor(AgsAudio *audio) { GList *cursor; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "cursor", &cursor, NULL); return(cursor); } /** * ags_audio_set_cursor: * @audio: the #AgsAudio * @cursor: (element-type GObject) (transfer full): the #GList-struct containing #AgsCursor * * Set cursor by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_cursor(AgsAudio *audio, GList *cursor) { GList *start_cursor; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_cursor = audio->cursor; audio->cursor = cursor; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_cursor, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_cursor: * @audio: the #AgsAudio * @cursor: the #GObject implementing #AgsCursor * * Adds a cursor. * * Since: 3.0.0 */ void ags_audio_add_cursor(AgsAudio *audio, GObject *cursor) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_CURSOR(cursor)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add cursor */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->cursor, cursor) == NULL){ success = TRUE; g_object_ref(cursor); audio->cursor = g_list_prepend(audio->cursor, (GObject *) cursor); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(cursor, "audio", audio, NULL); } } /** * ags_audio_remove_cursor: * @audio: the #AgsAudio * @cursor: the #GObject implementing #AgsCursor * * Removes a cursor. * * Since: 3.0.0 */ void ags_audio_remove_cursor(AgsAudio *audio, GObject *cursor) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_CURSOR(cursor)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove cursor */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->cursor, cursor) != NULL){ success = TRUE; audio->cursor = g_list_remove(audio->cursor, cursor); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(cursor, "audio", NULL, NULL); g_object_unref(cursor); } } /** * ags_audio_get_notation: * @audio: the #AgsAudio * * Get notation. * * Returns: (element-type AgsAudio.Notation) (transfer full): the #GList-struct containig #AgsNotation * * Since: 3.1.0 */ GList* ags_audio_get_notation(AgsAudio *audio) { GList *notation; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "notation", ¬ation, NULL); return(notation); } /** * ags_audio_set_notation: * @audio: the #AgsAudio * @notation: (element-type AgsAudio.Notation) (transfer full): the #GList-struct containing #AgsNotation * * Set notation by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_notation(AgsAudio *audio, GList *notation) { GList *start_notation; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_notation = audio->notation; audio->notation = notation; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_notation, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_notation: * @audio: the #AgsAudio * @notation: the #AgsNotation * * Adds a notation. * * Since: 3.0.0 */ void ags_audio_add_notation(AgsAudio *audio, GObject *notation) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_NOTATION(notation)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add notation */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->notation, notation) == NULL){ success = TRUE; g_object_ref(notation); audio->notation = ags_notation_add(audio->notation, (AgsNotation *) notation); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(notation, "audio", audio, NULL); } } /** * ags_audio_remove_notation: * @audio: the #AgsAudio * @notation: the #AgsNotation * * Removes a notation. * * Since: 3.0.0 */ void ags_audio_remove_notation(AgsAudio *audio, GObject *notation) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_NOTATION(notation)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove notation */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->notation, notation) != NULL){ success = TRUE; audio->notation = g_list_remove(audio->notation, notation); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(notation, "audio", NULL, NULL); g_object_unref(notation); } } /** * ags_audio_get_automation_port: * @audio: the #AgsAudio * * Get automation port. * * Returns: (transfer full): the string vector containing automation ports * * Since: 3.1.0 */ gchar** ags_audio_get_automation_port(AgsAudio *audio) { gchar **automation_port; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); automation_port = g_strdupv(audio->automation_port); g_rec_mutex_unlock(audio_mutex); return(automation_port); } /** * ags_audio_set_automation_port: * @audio: the #AgsAudio * @automation_port: (transfer full): the string vector containing automation ports * * * Get automation port. * * Since: 3.1.0 */ void ags_audio_set_automation_port(AgsAudio *audio, gchar **automation_port) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); g_strfreev(audio->automation_port); audio->automation_port = automation_port; g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_add_automation_port: * @audio: the #AgsAudio * @control_name: the control name * * Adds an automation port. * * Since: 3.0.0 */ void ags_audio_add_automation_port(AgsAudio *audio, gchar *control_name) { guint length; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || control_name == NULL){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); if(audio->automation_port != NULL && g_strv_contains(audio->automation_port, control_name)){ g_rec_mutex_unlock(audio_mutex); return; } if(audio->automation_port == NULL){ audio->automation_port = (gchar **) malloc(2 * sizeof(gchar *)); audio->automation_port[0] = g_strdup(control_name); audio->automation_port[1] = NULL; }else{ length = g_strv_length(audio->automation_port); audio->automation_port = (gchar **) realloc(audio->automation_port, (length + 2) * sizeof(gchar *)); audio->automation_port[length] = g_strdup(control_name); audio->automation_port[length + 1] = NULL; } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_remove_automation_port: * @audio: the #AgsAudio * @control_name: the control name * * Removes an automation port. * * Since: 3.0.0 */ void ags_audio_remove_automation_port(AgsAudio *audio, gchar *control_name) { gchar **automation_port; guint length; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || control_name == NULL){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); if(!g_strv_contains(audio->automation_port, control_name)){ g_rec_mutex_unlock(audio_mutex); return; } length = g_strv_length(audio->automation_port); if(length == 1){ g_strfreev(audio->automation_port); audio->automation_port = NULL; }else{ automation_port = (gchar **) malloc((length) * sizeof(gchar *)); for(i = 0, j = 0; i < length; i++){ if(!g_strcmp0(audio->automation_port[i], control_name)){ g_free(audio->automation_port[i]); }else{ automation_port[j] = audio->automation_port[i]; j++; } } automation_port[j] = NULL; g_strfreev(audio->automation_port); audio->automation_port = automation_port; } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_automation: * @audio: the #AgsAudio * * Get automation. * * Returns: (element-type AgsAudio.Automation) (transfer full): the #GList-struct containig #AgsAutomation * * Since: 3.1.0 */ GList* ags_audio_get_automation(AgsAudio *audio) { GList *automation; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "automation", &automation, NULL); return(automation); } /** * ags_audio_set_automation: * @audio: the #AgsAudio * @automation: (element-type AgsAudio.Automation) (transfer full): the #GList-struct containing #AgsAutomation * * Set automation by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_automation(AgsAudio *audio, GList *automation) { GList *start_automation; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_automation = audio->automation; audio->automation = automation; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_automation, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_automation: * @audio: the #AgsAudio * @automation: the #AgsAutomation * * Adds an automation. * * Since: 3.0.0 */ void ags_audio_add_automation(AgsAudio *audio, GObject *automation) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_AUTOMATION(automation)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add automation */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->automation, automation) == NULL){ success = TRUE; g_object_ref(automation); audio->automation = ags_automation_add(audio->automation, (AgsAutomation *) automation); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(automation, "audio", audio, NULL); } } /** * ags_audio_remove_automation: * @audio: the #AgsAudio * @automation: the #AgsAutomation * * Removes an automation. * * Since: 3.0.0 */ void ags_audio_remove_automation(AgsAudio *audio, GObject *automation) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_AUTOMATION(automation)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove automation */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->automation, automation) != NULL){ success = TRUE; audio->automation = g_list_remove(audio->automation, automation); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(automation, "audio", NULL, NULL); g_object_unref(automation); } } /** * ags_audio_get_wave: * @audio: the #AgsAudio * * Get wave. * * Returns: (element-type AgsAudio.Wave) (transfer full): the #GList-struct containig #AgsWave * * Since: 3.1.0 */ GList* ags_audio_get_wave(AgsAudio *audio) { GList *wave; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "wave", &wave, NULL); return(wave); } /** * ags_audio_set_wave: * @audio: the #AgsAudio * @wave: (element-type AgsAudio.Wave) (transfer full): the #GList-struct containing #AgsWave * * Set wave by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_wave(AgsAudio *audio, GList *wave) { GList *start_wave; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_wave = audio->wave; audio->wave = wave; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_wave, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_wave: * @audio: the #AgsAudio * @wave: the #AgsWave * * Adds a wave. * * Since: 3.0.0 */ void ags_audio_add_wave(AgsAudio *audio, GObject *wave) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_WAVE(wave)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add wave */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->wave, wave) == NULL){ success = TRUE; g_object_ref(wave); audio->wave = ags_wave_add(audio->wave, (AgsWave *) wave); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(wave, "audio", audio, NULL); } } /** * ags_audio_remove_wave: * @audio: the #AgsAudio * @wave: the #AgsWave * * Removes a wave. * * Since: 3.0.0 */ void ags_audio_remove_wave(AgsAudio *audio, GObject *wave) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_WAVE(wave)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove wave */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->wave, wave) != NULL){ success = TRUE; audio->wave = g_list_remove(audio->wave, wave); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(wave, "audio", NULL, NULL); g_object_unref(wave); } } /** * ags_audio_get_output_audio_file: * @audio: the #AgsAudio * * Get output audio file. * * Returns: (transfer full): the #GObject * * Since: 3.1.0 */ GObject* ags_audio_get_output_audio_file(AgsAudio *audio) { GObject *output_audio_file; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "output-audio-file", &output_audio_file, NULL); return(output_audio_file); } /** * ags_audio_set_output_audio_file: * @audio: the #AgsAudio * @output_audio_file: the #GObject * * Set output audio file. * * Since: 3.1.0 */ void ags_audio_set_output_audio_file(AgsAudio *audio, GObject *output_audio_file) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "output-audio-file", output_audio_file, NULL); } /** * ags_audio_get_input_audio_file: * @audio: the #AgsAudio * * Get input audio file. * * Returns: (transfer full): the #GObject * * Since: 3.1.0 */ GObject* ags_audio_get_input_audio_file(AgsAudio *audio) { GObject *input_audio_file; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "input-audio-file", &input_audio_file, NULL); return(input_audio_file); } /** * ags_audio_set_input_audio_file: * @audio: the #AgsAudio * @input_audio_file: the #GObject * * Set input audio file. * * Since: 3.1.0 */ void ags_audio_set_input_audio_file(AgsAudio *audio, GObject *input_audio_file) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "input-audio-file", input_audio_file, NULL); } /** * ags_audio_get_instrument_name: * @audio: the #AgsAudio * * Gets instrument name. * * Returns: the instrument name * * Since: 3.1.0 */ gchar* ags_audio_get_instrument_name(AgsAudio *audio) { gchar *instrument_name; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "instrument-name", &instrument_name, NULL); return(instrument_name); } /** * ags_audio_set_instrument_name: * @audio: the #AgsAudio * @instrument_name: the instrument name * * Sets instrument name. * * Since: 3.1.0 */ void ags_audio_set_instrument_name(AgsAudio *audio, gchar *instrument_name) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "instrument-name", instrument_name, NULL); } /** * ags_audio_get_track_name: * @audio: the #AgsAudio * * Gets track name. * * Returns: the track name * * Since: 3.1.0 */ gchar* ags_audio_get_track_name(AgsAudio *audio) { gchar *track_name; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "track-name", &track_name, NULL); return(track_name); } /** * ags_audio_set_track_name: * @audio: the #AgsAudio * @track_name: the track name * * Sets track name. * * Since: 3.1.0 */ void ags_audio_set_track_name(AgsAudio *audio, gchar *track_name) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "track-name", track_name, NULL); } /** * ags_audio_get_midi: * @audio: the #AgsAudio * * Get midi. * * Returns: (element-type AgsAudio.Midi) (transfer full): the #GList-struct containig #AgsMidi * * Since: 3.1.0 */ GList* ags_audio_get_midi(AgsAudio *audio) { GList *midi; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "midi", &midi, NULL); return(midi); } /** * ags_audio_set_midi: * @audio: the #AgsAudio * @midi: (element-type AgsAudio.Midi) (transfer full): the #GList-struct containing #AgsMidi * * Set midi by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_midi(AgsAudio *audio, GList *midi) { GList *start_midi; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_midi = audio->midi; audio->midi = midi; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_midi, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_midi: * @audio: the #AgsAudio * @midi: the #AgsMidi * * Adds a midi. * * Since: 3.0.0 */ void ags_audio_add_midi(AgsAudio *audio, GObject *midi) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_MIDI(midi)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add midi */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->midi, midi) == NULL){ success = TRUE; g_object_ref(midi); audio->midi = ags_midi_add(audio->midi, (AgsMidi *) midi); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(midi, "audio", audio, NULL); } } /** * ags_audio_remove_midi: * @audio: the #AgsAudio * @midi: the #AgsMidi * * Removes a midi. * * Since: 3.0.0 */ void ags_audio_remove_midi(AgsAudio *audio, GObject *midi) { gboolean success; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_MIDI(midi)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove midi */ success = FALSE; g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->midi, midi) != NULL){ success = TRUE; audio->midi = g_list_remove(audio->midi, midi); } g_rec_mutex_unlock(audio_mutex); if(success){ g_object_set(midi, "audio", NULL, NULL); g_object_unref(midi); } } /** * ags_audio_get_output_midi_file: * @audio: the #AgsAudio * * Get output MIDI file. * * Returns: (transfer full): the #GObject * * Since: 3.1.0 */ GObject* ags_audio_get_output_midi_file(AgsAudio *audio) { GObject *output_midi_file; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "output-midi-file", &output_midi_file, NULL); return(output_midi_file); } /** * ags_audio_set_output_midi_file: * @audio: the #AgsAudio * @output_midi_file: the #GObject * * Set output MIDI file. * * Since: 3.1.0 */ void ags_audio_set_output_midi_file(AgsAudio *audio, GObject *output_midi_file) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "output-midi-file", output_midi_file, NULL); } /** * ags_audio_get_input_midi_file: * @audio: the #AgsAudio * * Get input MIDI file. * * Returns: (transfer full): the #GObject * * Since: 3.1.0 */ GObject* ags_audio_get_input_midi_file(AgsAudio *audio) { GObject *input_midi_file; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "input-midi-file", &input_midi_file, NULL); return(input_midi_file); } /** * ags_audio_set_input_midi_file: * @audio: the #AgsAudio * @input_midi_file: the #GObject * * Set input MIDI file. * * Since: 3.1.0 */ void ags_audio_set_input_midi_file(AgsAudio *audio, GObject *input_midi_file) { if(!AGS_IS_AUDIO(audio)){ return; } g_object_set(audio, "input-midi-file", input_midi_file, NULL); } /** * ags_audio_get_recall_id: * @audio: the #AgsAudio * * Get recall id. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containig #AgsRecallID * * Since: 3.1.0 */ GList* ags_audio_get_recall_id(AgsAudio *audio) { GList *recall_id; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "recall_id", &recall_id, NULL); return(recall_id); } /** * ags_audio_set_recall_id: * @audio: the #AgsAudio * @recall_id: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containing #AgsRecallID * * Set recall id by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_recall_id(AgsAudio *audio, GList *recall_id) { GList *start_recall_id; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_recall_id = audio->recall_id; audio->recall_id = recall_id; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_recall_id, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_recall_id: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * * Adds a recall id. * * Since: 3.0.0 */ void ags_audio_add_recall_id(AgsAudio *audio, GObject *recall_id) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECALL_ID(recall_id)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add recall id */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->recall_id, recall_id) == NULL){ g_object_ref(recall_id); audio->recall_id = g_list_prepend(audio->recall_id, recall_id); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_remove_recall_id: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID * * Removes a recall id. * * Since: 3.0.0 */ void ags_audio_remove_recall_id(AgsAudio *audio, GObject *recall_id) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECALL_ID(recall_id)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove recall id */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->recall_id, recall_id) != NULL){ audio->recall_id = g_list_remove(audio->recall_id, recall_id); g_object_unref(recall_id); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_recycling_context: * @audio: the #AgsAudio * * Get recycling_context. * * Returns: (element-type AgsAudio.RecyclingContext) (transfer full): the #GList-struct containig #AgsRecyclingContext * * Since: 3.1.0 */ GList* ags_audio_get_recycling_context(AgsAudio *audio) { GList *recycling_context; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "recycling_context", &recycling_context, NULL); return(recycling_context); } /** * ags_audio_set_recycling_context: * @audio: the #AgsAudio * @recycling_context: (element-type AgsAudio.RecyclingContext) (transfer full): the #GList-struct containing #AgsRecyclingContext * * Set recycling_context by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_recycling_context(AgsAudio *audio, GList *recycling_context) { GList *start_recycling_context; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_recycling_context = audio->recycling_context; audio->recycling_context = recycling_context; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_recycling_context, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_recycling_context: * @audio: the #AgsAudio * @recycling_context: the #AgsRecyclingContext * * Adds a recycling context. * * Since: 3.0.0 */ void ags_audio_add_recycling_context(AgsAudio *audio, GObject *recycling_context) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add recycling context */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->recycling_context, recycling_context) == NULL){ g_object_ref(recycling_context); audio->recycling_context = g_list_prepend(audio->recycling_context, recycling_context); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_remove_recycling_context: * @audio: the #AgsAudio * @recycling_context: the #AgsRecyclingContext * * Removes a recycling context. * * Since: 3.0.0 */ void ags_audio_remove_recycling_context(AgsAudio *audio, GObject *recycling_context) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove recycling container */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->recycling_context, recycling_context) != NULL){ audio->recycling_context = g_list_remove(audio->recycling_context, recycling_context); g_object_unref(recycling_context); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_recall_container: * @audio: the #AgsAudio * * Get recall_container. * * Returns: (element-type AgsAudio.RecallContainer) (transfer full): the #GList-struct containig #AgsRecallContainer * * Since: 3.1.0 */ GList* ags_audio_get_recall_container(AgsAudio *audio) { GList *recall_container; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "recall-container", &recall_container, NULL); return(recall_container); } /** * ags_audio_set_recall_container: * @audio: the #AgsAudio * @recall_container: (element-type AgsAudio.RecallContainer) (transfer full): the #GList-struct containing #AgsRecallContainer * * Set recall_container by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_recall_container(AgsAudio *audio, GList *recall_container) { GList *start_recall_container; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_recall_container = audio->recall_container; audio->recall_container = recall_container; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_recall_container, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_recall_container: * @audio: the #AgsAudio * @recall_container: the #AgsRecallContainer * * Adds a recall container. * * Since: 3.0.0 */ void ags_audio_add_recall_container(AgsAudio *audio, GObject *recall_container) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECALL_CONTAINER(recall_container)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* add recall container */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->recall_container, recall_container) == NULL){ g_object_ref(recall_container); audio->recall_container = g_list_prepend(audio->recall_container, recall_container); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_remove_recall_container: * @audio: the #AgsAudio * @recall_container: the #AgsRecallContainer * * Removes a recall container. * * Since: 3.0.0 */ void ags_audio_remove_recall_container(AgsAudio *audio, GObject *recall_container) { GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECALL_CONTAINER(recall_container)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* remove recall container */ g_rec_mutex_lock(audio_mutex); if(g_list_find(audio->recall_container, recall_container) != NULL){ audio->recall_container = g_list_remove(audio->recall_container, recall_container); g_object_unref(recall_container); } g_rec_mutex_unlock(audio_mutex); } /** * ags_audio_get_play: * @audio: the #AgsAudio * * Get play. * * Returns: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containig #AgsRecall * * Since: 3.1.0 */ GList* ags_audio_get_play(AgsAudio *audio) { GList *play; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "play", &play, NULL); return(play); } /** * ags_audio_set_play: * @audio: the #AgsAudio * @play: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containing #AgsRecall * * Set play by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_play(AgsAudio *audio, GList *play) { GList *start_play; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_play = audio->play; audio->play = play; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_play, (GDestroyNotify) g_object_unref); } /** * ags_audio_get_recall: * @audio: the #AgsAudio * * Get recall. * * Returns: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containig #AgsRecall * * Since: 3.1.0 */ GList* ags_audio_get_recall(AgsAudio *audio) { GList *recall; if(!AGS_IS_AUDIO(audio)){ return(NULL); } g_object_get(audio, "recall", &recall, NULL); return(recall); } /** * ags_audio_set_recall: * @audio: the #AgsAudio * @recall: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containing #AgsRecall * * Set recall by replacing existing. * * Since: 3.1.0 */ void ags_audio_set_recall(AgsAudio *audio, GList *recall) { GList *start_recall; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); start_recall = audio->recall; audio->recall = recall; g_rec_mutex_unlock(audio_mutex); g_list_free_full(start_recall, (GDestroyNotify) g_object_unref); } /** * ags_audio_add_recall: * @audio: the #AgsAudio * @recall: the #AgsRecall * @play_context: if %TRUE play context, else if %FALSE recall context * * Adds a recall to @audio. * * Since: 3.0.0 */ void ags_audio_add_recall(AgsAudio *audio, GObject *recall, gboolean play_context) { gboolean success; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECALL(recall)){ return; } success = FALSE; if(play_context){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* add recall */ g_rec_mutex_lock(play_mutex); if(g_list_find(audio->play, recall) == NULL){ success = TRUE; g_object_ref(G_OBJECT(recall)); audio->play = g_list_prepend(audio->play, recall); } g_rec_mutex_unlock(play_mutex); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* add recall */ g_rec_mutex_lock(recall_mutex); if(g_list_find(audio->recall, recall) == NULL){ success = TRUE; g_object_ref(G_OBJECT(recall)); audio->recall = g_list_prepend(audio->recall, recall); } g_rec_mutex_unlock(recall_mutex); } if(success){ if(AGS_IS_RECALL_AUDIO(recall) || AGS_IS_RECALL_AUDIO_RUN(recall)){ g_object_set(recall, "audio", audio, NULL); } } } /** * ags_audio_remove_recall: * @audio: the #AgsAudio * @recall: the #AgsRecall * @play_context: if %TRUE play context, else if %FALSE recall context * * Removes a recall from @audio. * * Since: 3.0.0 */ void ags_audio_remove_recall(AgsAudio *audio, GObject *recall, gboolean play_context) { gboolean success; if(!AGS_IS_AUDIO(audio) || !AGS_IS_RECALL(recall)){ return; } success = FALSE; if(play_context){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* add recall */ g_rec_mutex_lock(play_mutex); if(g_list_find(audio->play, recall) != NULL){ audio->play = g_list_remove(audio->play, recall); } g_rec_mutex_unlock(play_mutex); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* add recall */ g_rec_mutex_lock(recall_mutex); if(g_list_find(audio->recall, recall) != NULL){ audio->recall = g_list_remove(audio->recall, recall); } g_rec_mutex_unlock(recall_mutex); } #if 0 if(success){ if(AGS_IS_RECALL_AUDIO(recall) || AGS_IS_RECALL_AUDIO_RUN(recall)){ g_object_set(recall, "audio", NULL, NULL); } g_object_unref(G_OBJECT(recall)); } #endif } void ags_audio_real_duplicate_recall(AgsAudio *audio, AgsRecallID *recall_id, guint pad, guint audio_channel, guint line) { AgsRecall *recall, *copy_recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; gboolean play_context; GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope == -1){ g_critical("can only duplicate for specific sound scope"); return; } recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) != 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate list */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; play_context = TRUE; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; play_context = FALSE; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* notify run */ // ags_recall_notify_dependency(AGS_RECALL(list->data), AGS_RECALL_NOTIFY_RUN, 1); /* return if already played */ g_rec_mutex_lock(recall_id_mutex); if(ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_WAITING) || ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_ACTIVE) || ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_PROCESSING) || ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_TERMINATING)){ g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } g_rec_mutex_unlock(recall_id_mutex); return; } // ags_recall_id_set_state_flags(recall_id, // AGS_SOUND_STATE_IS_WAITING); g_rec_mutex_unlock(recall_id_mutex); /* duplicate */ while(list != NULL){ GRecMutex *current_recall_mutex; recall = AGS_RECALL(list->data); /* get current recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* some checks */ g_rec_mutex_lock(current_recall_mutex); if(AGS_IS_RECALL_AUDIO(recall) || (AGS_RECALL_TEMPLATE & (recall->flags)) == 0 || recall->recall_id != NULL || !ags_recall_match_ability_flags_to_scope(recall, sound_scope)){ list = list->next; g_rec_mutex_unlock(current_recall_mutex); continue; } g_rec_mutex_unlock(current_recall_mutex); /* duplicate the recall */ copy_recall = ags_recall_duplicate(recall, recall_id, NULL, NULL, NULL); if(copy_recall == NULL){ /* iterate */ list = list->next; continue; } g_object_set(copy_recall, "pad", pad, "audio-channel", audio_channel, "line", line, NULL); #ifdef AGS_DEBUG g_message("recall duplicated: %s %s", G_OBJECT_TYPE_NAME(audio), G_OBJECT_TYPE_NAME(copy_recall)); #endif /* set appropriate sound scope */ copy_recall->sound_scope = sound_scope; /* append to AgsAudio */ ags_audio_add_recall(audio, (GObject *) copy_recall, play_context); g_signal_connect(copy_recall, "done", G_CALLBACK(ags_audio_recall_done_callback), audio); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(copy_recall)); /* notify run */ ags_recall_notify_dependency(copy_recall, AGS_RECALL_NOTIFY_RUN, 1); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_audio_duplicate_recall: * @audio: the #AgsAudio * @recall_id: an #AgsRecallID * @pad: the pad * @audio_channel: the audio channel * @line: the line * * Duplicate all #AgsRecall templates of @audio. * * Since: 3.0.0 */ void ags_audio_duplicate_recall(AgsAudio *audio, AgsRecallID *recall_id, guint pad, guint audio_channel, guint line) { g_return_if_fail(AGS_IS_AUDIO(audio)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[DUPLICATE_RECALL], 0, recall_id, pad, audio_channel, line); g_object_unref((GObject *) audio); } void ags_audio_real_resolve_recall(AgsAudio *audio, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope == -1){ g_critical("can only resolve for specific sound scope"); return; } recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) != 0){ return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* resolve */ while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); ags_recall_resolve_dependency(recall); list = list->next; } g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_audio_resolve_recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID to use * * Performs resolving of recalls. * * Since: 3.0.0 */ void ags_audio_resolve_recall(AgsAudio *audio, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_AUDIO(audio)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[RESOLVE_RECALL], 0, recall_id); g_object_unref((GObject *) audio); } void ags_audio_real_init_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope == -1){ g_critical("can only init for specific sound scope"); return; } recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) != 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* init */ staging_flags = staging_mask & staging_flags; while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* run init stages */ ags_recall_set_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); #if 0 ags_audio_set_staging_flags(audio, sound_scope, staging_flags); #endif if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_audio_init_recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID to use or #NULL * @staging_flags: staging flags, see #AgsSoundStagingFlags-enum * * Initializes the recalls of @audio * * Since: 3.0.0 */ void ags_audio_init_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags) { g_return_if_fail(AGS_IS_AUDIO(audio)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[INIT_RECALL], 0, recall_id, staging_flags); g_object_unref((GObject *) audio); } void ags_audio_real_play_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_mask = (AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST | AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE | AGS_SOUND_STAGING_FINI); GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } if(ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_TERMINATING)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); #if 0 if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (current_staging_flags)) == 0){ return; } #endif /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* automate and play */ staging_flags = staging_mask & staging_flags; if((AGS_SOUND_STAGING_AUTOMATE & (staging_flags)) != 0){ while(list != NULL){ recall = AGS_RECALL(list->data); /* play stages */ if(AGS_IS_RECALL_AUDIO(recall)){ ags_recall_set_staging_flags(recall, AGS_SOUND_STAGING_AUTOMATE); ags_recall_unset_staging_flags(recall, AGS_SOUND_STAGING_AUTOMATE); } list = list->next; } } staging_flags &= (~AGS_SOUND_STAGING_AUTOMATE); list = list_start; while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* play stages */ ags_recall_set_staging_flags(recall, staging_flags); ags_recall_unset_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } //FIXME:JK: uncomment // ags_audio_set_staging_flags(audio, sound_scope, // staging_flags); } /** * ags_audio_play_recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID to apply to * @staging_flags: staging flags, see #AgsSoundStagingFlags-enum * * Performs play for the specified @staging_flags. * * Since: 3.0.0 */ void ags_audio_play_recall(AgsAudio *audio, AgsRecallID *recall_id, guint staging_flags) { g_return_if_fail(AGS_IS_AUDIO(audio) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[PLAY_RECALL], 0, recall_id, staging_flags); g_object_unref((GObject *) audio); } void ags_audio_real_done_recall(AgsAudio *audio, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_flags = (AGS_SOUND_STAGING_DONE); GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (current_staging_flags)) == 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* done */ while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* done stages */ ags_recall_set_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); ags_audio_set_staging_flags(audio, sound_scope, staging_flags); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_audio_done_recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID to apply to * * Done processing audio data. * * Since: 3.0.0 */ void ags_audio_done_recall(AgsAudio *audio, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_AUDIO(audio)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[DONE_RECALL], 0, recall_id); g_object_unref((GObject *) audio); } void ags_audio_real_cancel_recall(AgsAudio *audio, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_flags = (AGS_SOUND_STAGING_CANCEL); GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (current_staging_flags)) == 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* cancel */ while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* cancel stages */ ags_recall_set_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); ags_audio_set_staging_flags(audio, sound_scope, staging_flags); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_audio_cancel_recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID to apply to * * Cancel processing audio data. * * Since: 3.0.0 */ void ags_audio_cancel_recall(AgsAudio *audio, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_AUDIO(audio)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[CANCEL_RECALL], 0, recall_id); g_object_unref((GObject *) audio); } void ags_audio_real_cleanup_recall(AgsAudio *audio, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; GList *match_start, *match; gint sound_scope; guint current_staging_flags; gboolean play_context; gboolean remove_recycling_context; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); GRecMutex *audio_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get staging flags */ g_rec_mutex_lock(audio_mutex); current_staging_flags = audio->staging_flags[sound_scope]; g_rec_mutex_unlock(audio_mutex); /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_rec_mutex_lock(recycling_context_mutex); remove_recycling_context = FALSE; if((AgsRecallID *) recycling_context->recall_id == recall_id){ remove_recycling_context = TRUE; } g_rec_mutex_unlock(recycling_context_mutex); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; play_context = TRUE; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; play_context = FALSE; /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* cleanup */ match_start = NULL; while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* remove recall */ ags_audio_remove_recall(audio, (GObject *) recall, play_context); match_start = g_list_prepend(match_start, recall); list = list->next; } g_list_free_full(list_start, g_object_unref); /* destroy */ match = match_start; while(match != NULL){ recall = AGS_RECALL(match->data); /* destroy */ ags_connectable_disconnect(AGS_CONNECTABLE(recall)); g_object_run_dispose((GObject *) recall); match = match->next; } g_list_free_full(match_start, g_object_unref); } /** * ags_audio_cleanup_recall: * @audio: the #AgsAudio * @recall_id: the #AgsRecallID to apply to * * Cleanup processing audio data. * * Since: 3.0.0 */ void ags_audio_cleanup_recall(AgsAudio *audio, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_AUDIO(audio)); g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[CLEANUP_RECALL], 0, recall_id); g_object_unref((GObject *) audio); } void ags_audio_recall_done_callback(AgsRecall *recall, AgsAudio *audio) { AgsCancelAudio *cancel_audio; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; gint sound_scope; if(AGS_IS_COUNT_BEATS_AUDIO_RUN(recall) && !ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)){ sound_scope = ags_recall_get_sound_scope(recall); application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); cancel_audio = ags_cancel_audio_new(audio, sound_scope); ags_task_launcher_add_task(task_launcher, cancel_audio); } } GList* ags_audio_real_start(AgsAudio *audio, gint sound_scope) { AgsChannel *channel; AgsRecycling *first_recycling; AgsPlaybackDomain *playback_domain; AgsPlayback *playback; AgsRecallID *audio_recall_id; AgsRecallID *channel_recall_id; AgsRecallID *current_recall_id; AgsRecyclingContext *recycling_context; AgsThread *audio_loop; AgsThread *audio_thread; AgsThread *channel_thread; AgsMessageDelivery *message_delivery; AgsApplicationContext *application_context; GList *start_message_queue; GList *start_output_playback, *output_playback; GList *start_recall_id; GList *start_wait_thread, *wait_thread; gint64 start_wait_timeout; guint audio_channels; guint output_pads; gint i; static const guint staging_flags = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!ags_audio_test_flags(audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return(NULL); } application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* add audio to AgsAudioLoop */ ags_audio_loop_add_audio(audio_loop, (GObject *) audio); ags_audio_loop_set_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_AUDIO); /* get some fields */ g_object_get(audio, "playback-domain", &playback_domain, NULL); g_object_get(playback_domain, "output-playback", &start_output_playback, NULL); /* initialize channel */ start_recall_id = NULL; if(sound_scope >= 0){ output_playback = start_output_playback; while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); current_recall_id = ags_playback_get_recall_id(playback, sound_scope); if(current_recall_id == NULL){ /* get some fields */ g_object_get(playback, "channel", &channel, NULL); g_object_get(channel, "first-recycling", &first_recycling, NULL); /* recycling context */ recycling_context = ags_recycling_context_new(1); ags_audio_add_recycling_context(audio, (GObject *) recycling_context); ags_recycling_context_replace(recycling_context, first_recycling, 0); /* create audio recall id */ audio_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(audio_recall_id, sound_scope); ags_audio_add_recall_id(audio, (GObject *) audio_recall_id); g_object_set(recycling_context, "recall-id", audio_recall_id, NULL); /* create channel recall id */ channel_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(channel_recall_id, sound_scope); ags_channel_add_recall_id(channel, (GObject *) channel_recall_id); /* prepend recall id */ start_recall_id = g_list_prepend(start_recall_id, channel_recall_id); /* set playback's recall id */ //NOTE:JK: we use audio recall id, although on AgsPlayback ags_playback_set_recall_id(playback, audio_recall_id, sound_scope); /* unref */ g_object_unref(channel); g_object_unref(first_recycling); }else{ start_recall_id = g_list_prepend(start_recall_id, current_recall_id); } /* iterate */ output_playback = output_playback->next; } /* play init */ ags_audio_recursive_run_stage(audio, sound_scope, staging_flags); output_playback = start_output_playback; /* add to start queue */ start_wait_thread = NULL; if(ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO)){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); if(audio_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, audio_thread); ags_thread_add_start_queue(audio_loop, audio_thread); } } while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); if(ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ channel_thread = ags_playback_get_channel_thread(playback, sound_scope); /* add to start queue */ if(channel_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, channel_thread); ags_thread_add_start_queue(audio_loop, channel_thread); } } /* iterate */ output_playback = output_playback->next; } /* unref */ wait_thread = start_wait_thread; start_wait_timeout = g_get_monotonic_time() + 5 * G_USEC_PER_SEC; while(wait_thread != NULL){ /* wait thread */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(!ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE)){ ags_thread_set_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT); while(ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE) && g_get_monotonic_time() < start_wait_timeout){ g_cond_wait_until(AGS_THREAD_GET_START_COND(wait_thread->data), AGS_THREAD_GET_START_MUTEX(wait_thread->data), start_wait_timeout); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(g_get_monotonic_time() > start_wait_timeout){ g_critical("sync timeout"); goto ags_audio_real_start_ONE_SCOPE_TIMEOUT; } wait_thread = wait_thread->next; } ags_audio_real_start_ONE_SCOPE_TIMEOUT: g_list_free_full(start_wait_thread, g_object_unref); start_wait_thread = NULL; }else{ start_wait_thread = NULL; for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ output_playback = start_output_playback; while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); current_recall_id = ags_playback_get_recall_id(playback, i); if(current_recall_id == NULL){ /* get some fields */ g_object_get(playback, "channel", &channel, NULL); g_object_get(channel, "first-recycling", &first_recycling, NULL); /* recycling context */ recycling_context = ags_recycling_context_new(1); ags_audio_add_recycling_context(audio, (GObject *) recycling_context); /* set recycling */ ags_recycling_context_replace(recycling_context, first_recycling, 0); /* create audio recall id */ audio_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(audio_recall_id, i); ags_audio_add_recall_id(audio, (GObject *) audio_recall_id); g_object_set(recycling_context, "recall-id", audio_recall_id, NULL); /* create channel recall id */ channel_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(channel_recall_id, i); ags_channel_add_recall_id(channel, (GObject *) channel_recall_id); /* prepend recall id */ start_recall_id = g_list_prepend(start_recall_id, channel_recall_id); /* set playback's recall id */ //NOTE:JK: we use audio recall id, although on AgsPlayback ags_playback_set_recall_id(playback, audio_recall_id, i); /* unref */ g_object_unref(channel); g_object_unref(first_recycling); }else{ start_recall_id = g_list_prepend(start_recall_id, current_recall_id); } /* iterate */ output_playback = output_playback->next; } /* play init */ ags_audio_recursive_run_stage(audio, i, staging_flags); output_playback = start_output_playback; /* add to start queue */ if(ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO)){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); if(audio_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, audio_thread); ags_thread_add_start_queue(audio_loop, audio_thread); } } while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); if(ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ channel_thread = ags_playback_get_channel_thread(playback, i); if(channel_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, channel_thread); /* add to start queue */ ags_thread_add_start_queue(audio_loop, channel_thread); } } /* iterate */ output_playback = output_playback->next; } } /* unref */ wait_thread = start_wait_thread; start_wait_timeout = g_get_monotonic_time() + 5 * G_USEC_PER_SEC; while(wait_thread != NULL){ /* wait thread */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(!ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE)){ ags_thread_set_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT); while(ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE) && g_get_monotonic_time() < start_wait_timeout){ g_cond_wait_until(AGS_THREAD_GET_START_COND(wait_thread->data), AGS_THREAD_GET_START_MUTEX(wait_thread->data), start_wait_timeout); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(g_get_monotonic_time() > start_wait_timeout){ g_critical("sync timeout"); goto ags_audio_real_start_ALL_SCOPE_TIMEOUT; } wait_thread = wait_thread->next; } ags_audio_real_start_ALL_SCOPE_TIMEOUT: g_list_free_full(start_wait_thread, g_object_unref); start_wait_thread = NULL; } g_object_unref(playback_domain); g_list_free_full(start_output_playback, g_object_unref); start_recall_id = g_list_reverse(start_recall_id); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::start"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* sound scope */ message->parameter_name[0] = "sound-scope"; g_value_init(&(message->value[0]), G_TYPE_INT); g_value_set_int(&(message->value[0]), sound_scope); /* recall id */ message->parameter_name[1] = "recall-id"; g_value_init(&(message->value[1]), G_TYPE_POINTER); g_value_set_pointer(&(message->value[1]), g_list_copy_deep(start_recall_id, (GCopyFunc) g_object_ref, NULL)); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } return(start_recall_id); } /** * ags_audio_start: * @audio: the #AgsAudio * @sound_scope: the scope * * Is emitted as audio is started. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containing #AgsRecallID * * Since: 3.0.0 */ GList* ags_audio_start(AgsAudio *audio, gint sound_scope) { GList *recall_id; g_return_val_if_fail(AGS_IS_AUDIO(audio), NULL); /* emit */ recall_id = NULL; g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[START], 0, sound_scope, &recall_id); g_object_unref((GObject *) audio); return(recall_id); } void ags_audio_real_stop(AgsAudio *audio, GList *recall_id, gint sound_scope) { AgsChannel *channel; AgsPlaybackDomain *playback_domain; AgsPlayback *playback; AgsRecallID *sequencer_recall_id, *notation_recall_id, *wave_recall_id, *midi_recall_id; AgsThread *audio_loop; AgsThread *audio_thread; AgsThread *channel_thread; AgsMessageDelivery *message_delivery; AgsApplicationContext *application_context; GList *list; GList *start_message_queue; GList *start_output_playback, *output_playback; GList *sequencer, *notation, *wave, *midi; gint i; static const guint staging_flags = (AGS_SOUND_STAGING_CANCEL | AGS_SOUND_STAGING_REMOVE); if(recall_id == NULL || sound_scope >= AGS_SOUND_SCOPE_LAST){ return; } list = recall_id; while(list != NULL){ ags_recall_id_set_state_flags(list->data, AGS_SOUND_STATE_IS_TERMINATING); list = list->next; } application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* get some fields */ g_object_get(audio, "playback-domain", &playback_domain, NULL); g_object_get(playback_domain, "output-playback", &start_output_playback, NULL); if(sound_scope >= 0){ /* stop thread */ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); if(audio_thread != NULL){ ags_thread_stop(audio_thread); g_object_unref(audio_thread); } output_playback = start_output_playback; while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); g_object_get(playback, "channel", &channel, NULL); channel_thread = ags_playback_get_channel_thread(playback, sound_scope); if(channel_thread != NULL){ ags_thread_stop(channel_thread); g_object_unref(channel_thread); } g_object_unref(channel); /* iterate */ output_playback = output_playback->next; } /* cancel */ ags_audio_recursive_run_stage(audio, sound_scope, staging_flags); /* clean - fini */ ags_audio_recursive_run_stage(audio, sound_scope, AGS_SOUND_STAGING_FINI); output_playback = start_output_playback; while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); ags_playback_set_recall_id(playback, NULL, sound_scope); /* iterate */ output_playback = output_playback->next; } }else{ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ /* stop thread */ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); if(audio_thread != NULL){ ags_thread_stop(audio_thread); g_object_unref(audio_thread); } output_playback = start_output_playback; while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); g_object_get(playback, "channel", &channel, NULL); channel_thread = ags_playback_get_channel_thread(playback, i); if(channel_thread != NULL){ ags_thread_stop(channel_thread); g_object_unref(channel_thread); } g_object_unref(channel); /* iterate */ output_playback = output_playback->next; } } for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ /* cancel */ ags_audio_recursive_run_stage(audio, i, staging_flags); /* clean - fini */ ags_audio_recursive_run_stage(audio, i, AGS_SOUND_STAGING_FINI); output_playback = start_output_playback; while(output_playback != NULL){ playback = AGS_PLAYBACK(output_playback->data); ags_playback_set_recall_id(playback, NULL, i); /* iterate */ output_playback = output_playback->next; } } } /* remove audio from AgsAudioLoop */ sequencer = ags_audio_check_scope(audio, (AGS_SOUND_SCOPE_SEQUENCER)); sequencer_recall_id = ags_recall_id_find_parent_recycling_context(sequencer, NULL); notation = ags_audio_check_scope(audio, (AGS_SOUND_SCOPE_NOTATION)); notation_recall_id = ags_recall_id_find_parent_recycling_context(notation, NULL); wave = ags_audio_check_scope(audio, (AGS_SOUND_SCOPE_WAVE)); wave_recall_id = ags_recall_id_find_parent_recycling_context(wave, NULL); midi = ags_audio_check_scope(audio, (AGS_SOUND_SCOPE_MIDI)); midi_recall_id = ags_recall_id_find_parent_recycling_context(midi, NULL); if(sequencer_recall_id == NULL && notation_recall_id == NULL && wave_recall_id == NULL && midi_recall_id == NULL){ ags_audio_loop_remove_audio(audio_loop, (GObject *) audio); } g_list_free_full(sequencer, g_object_unref); g_list_free_full(notation, g_object_unref); g_list_free_full(wave, g_object_unref); g_list_free_full(midi, g_object_unref); g_object_unref(playback_domain); g_list_free_full(start_output_playback, g_object_unref); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsAudio::stop"); /* add message */ message = ags_message_envelope_new((GObject *) audio, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* recall id */ message->parameter_name[0] = "recall-id"; g_value_init(&(message->value[0]), G_TYPE_POINTER); g_value_set_pointer(&(message->value[0]), recall_id); /* sound scope */ message->parameter_name[1] = "sound-scope"; g_value_init(&(message->value[1]), G_TYPE_INT); g_value_set_int(&(message->value[1]), sound_scope); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_audio_stop: * @audio: the #AgsAudio * @recall_id: (element-type AgsAudio.RecallID) (transfer none): the #GList-struct containing #AgsRecallID * @sound_scope: the scope * * Is emitted as playing audio is stopped. * * Since: 3.0.0 */ void ags_audio_stop(AgsAudio *audio, GList *recall_id, gint sound_scope) { g_return_if_fail(AGS_IS_AUDIO(audio)); /* emit */ g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[STOP], 0, recall_id, sound_scope); g_object_unref((GObject *) audio); } GList* ags_audio_real_check_scope(AgsAudio *audio, gint sound_scope) { GList *list_start, *list; GList *recall_id; gint i; /* get recall id */ g_object_get(audio, "recall-id", &list_start, NULL); /* iterate recall id */ list = list_start; recall_id = NULL; if(sound_scope >= 0){ while(list != NULL){ /* check sound scope */ if(ags_recall_id_check_sound_scope(list->data, sound_scope)){ recall_id = g_list_prepend(recall_id, list->data); } /* iterate */ list = list->next; } }else{ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ list = list_start; while(list != NULL){ /* check sound scope */ if(ags_recall_id_check_sound_scope(list->data, i)){ recall_id = g_list_prepend(recall_id, list->data); } /* iterate */ list = list->next; } } } /* reverse recall id */ recall_id = g_list_reverse(recall_id); g_list_foreach(recall_id, (GFunc) g_object_ref, NULL); /* unref */ g_list_free_full(list_start, g_object_unref); return(recall_id); } /** * ags_audio_check_scope: * @audio: the #AgsAudio * @sound_scope: the scope * * Check scope's recall id. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the scope's recall id of @audio * * Since: 3.0.0 */ GList* ags_audio_check_scope(AgsAudio *audio, gint sound_scope) { GList *recall_id; g_return_val_if_fail(AGS_IS_AUDIO(audio), NULL); /* emit */ g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[CHECK_SCOPE], 0, sound_scope, &recall_id); g_object_unref((GObject *) audio); return(recall_id); } /** * ags_audio_collect_all_audio_ports: * @audio: the #AgsAudio * * Retrieve all ports of #AgsAudio. * * Returns: (element-type AgsAudio.Port) (transfer full): a new #GList containing #AgsPort * * Since: 3.0.0 */ GList* ags_audio_collect_all_audio_ports(AgsAudio *audio) { GList *recall_start, *recall; GList *list; GRecMutex *recall_mutex, *play_mutex; GRecMutex *mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } list = NULL; /* get play mutex */ play_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* collect port of playing recall */ g_rec_mutex_lock(play_mutex); recall = recall_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); while(recall != NULL){ AgsRecall *current; current = AGS_RECALL(recall->data); /* get mutex */ mutex = AGS_RECALL_GET_OBJ_MUTEX(current); /* concat port */ g_rec_mutex_lock(mutex); if(current->port != NULL){ if(list == NULL){ list = g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL); }else{ if(current->port != NULL){ list = g_list_concat(list, g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL)); } } } g_rec_mutex_unlock(mutex); /* iterate */ recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* the same for true recall */ g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); while(recall != NULL){ AgsRecall *current; current = AGS_RECALL(recall->data); /* get mutex */ mutex = AGS_RECALL_GET_OBJ_MUTEX(current); /* concat port */ g_rec_mutex_lock(mutex); if(current->port != NULL){ if(list == NULL){ list = g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL); }else{ if(current->port != NULL){ list = g_list_concat(list, g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL)); } } } g_rec_mutex_unlock(mutex); /* iterate */ recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* reverse result */ list = g_list_reverse(list); return(list); } /** * ags_audio_collect_all_audio_ports_by_specifier_and_context: * @audio: an #AgsAudio * @specifier: the port's name * @play_context: either %TRUE for play or %FALSE for recall * * Retrieve specified port of #AgsAudio * * Returns: (element-type AgsAudio.Port) (transfer full): a #GList-struct of #AgsPort if found, otherwise %NULL * * Since: 3.0.0 */ GList* ags_audio_collect_all_audio_ports_by_specifier_and_context(AgsAudio *audio, gchar *specifier, gboolean play_context) { GList *recall_start, *recall; GList *port_start, *port; GList *list; GRecMutex *recall_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } if(play_context){ /* get play mutex */ recall_mutex = AGS_AUDIO_GET_PLAY_MUTEX(audio); /* get recall */ g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy_deep(audio->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); }else{ /* get recall mutex */ recall_mutex = AGS_AUDIO_GET_RECALL_MUTEX(audio); /* get recall */ g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy_deep(audio->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); } /* collect port of playing recall */ list = NULL; while(recall != NULL){ AgsRecall *current; GRecMutex *mutex; current = AGS_RECALL(recall->data); /* get mutex */ mutex = AGS_RECALL_GET_OBJ_MUTEX(current); /* get port */ g_rec_mutex_lock(mutex); port = port_start = g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(mutex); /* check specifier */ while((port = ags_port_find_specifier(port, specifier)) != NULL){ AgsPort *current; current = AGS_PORT(port->data); g_object_ref(current); list = g_list_prepend(list, current); /* iterate - port */ port = port->next; } g_list_free_full(port_start, g_object_unref); /* iterate - recall */ recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* reverse result */ list = g_list_reverse(list); return(list); } /** * ags_audio_open_audio_file_as_channel: * @audio: the #AgsAudio * @filename: (element-type utf8) (transfer none): the files to open * @overwrite_channels: if existing channels should be assigned * @create_channels: if new channels should be created as not fitting if combined with @overwrite_channels * * Open some files. * * Since: 3.0.0 */ void ags_audio_open_audio_file_as_channel(AgsAudio *audio, GSList *filename, gboolean overwrite_channels, gboolean create_channels) { AgsChannel *channel; AgsAudioFile *audio_file; GObject *soundcard; GList *audio_signal; guint input_pads; guint audio_channels; guint i, j; guint list_length; GError *error; GRecMutex *audio_mutex; GRecMutex *channel_mutex; GRecMutex *recycling_mutex; if(!AGS_IS_AUDIO(audio) || filename == NULL || (!overwrite_channels && !create_channels)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio fields */ g_rec_mutex_lock(audio_mutex); channel = audio->input; soundcard = audio->output_soundcard; input_pads = audio->input_pads; audio_channels = audio->audio_channels; g_rec_mutex_unlock(audio_mutex); /* overwriting existing channels */ if(overwrite_channels){ if(channel != NULL){ for(i = 0; i < input_pads && filename != NULL; i++){ audio_file = ags_audio_file_new((gchar *) filename->data, soundcard, -1); if(!ags_audio_file_open(audio_file)){ filename = filename->next; continue; } ags_audio_file_read_audio_signal(audio_file); ags_audio_file_close(audio_file); audio_signal = audio_file->audio_signal; for(j = 0; j < audio_channels && audio_signal != NULL; j++){ AgsRecycling *recycling; AgsFileLink *file_link; /* reset link */ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get recycling */ g_rec_mutex_lock(channel_mutex); recycling = channel->first_recycling; file_link = AGS_INPUT(channel)->file_link; g_rec_mutex_unlock(channel_mutex); /* set filename and channel */ if(file_link == NULL){ file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, NULL); g_object_set(channel, "file-link", file_link, NULL); g_object_unref(file_link); } g_object_set(file_link, "filename", filename->data, "audio-channel", j, NULL); /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* replace template audio signal */ AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; g_object_set(AGS_AUDIO_SIGNAL(audio_signal->data), "recycling", recycling, NULL); ags_recycling_add_audio_signal(recycling, audio_signal->data); /* iterate */ audio_signal = audio_signal->next; g_rec_mutex_lock(channel_mutex); channel = channel->next; g_rec_mutex_unlock(channel_mutex); } if(audio_file->file_audio_channels < audio_channels){ channel = ags_channel_nth(channel, audio_channels - audio_file->file_audio_channels); g_object_unref(channel); } g_object_run_dispose(audio_file); g_object_unref(audio_file); filename = filename->next; } } } /* appending to channels */ if(create_channels && filename != NULL){ list_length = g_slist_length(filename); ags_audio_set_pads((AgsAudio *) audio, AGS_TYPE_INPUT, list_length + AGS_AUDIO(audio)->input_pads, 0); channel = ags_channel_nth(AGS_AUDIO(audio)->input, (AGS_AUDIO(audio)->input_pads - list_length) * AGS_AUDIO(audio)->audio_channels); g_object_unref(channel); while(filename != NULL){ audio_file = ags_audio_file_new((gchar *) filename->data, soundcard, -1); if(!ags_audio_file_open(audio_file)){ filename = filename->next; continue; } ags_audio_file_read_audio_signal(audio_file); ags_audio_file_close(audio_file); audio_signal = audio_file->audio_signal; for(j = 0; j < audio_channels && audio_signal != NULL; j++){ AgsRecycling *recycling; AgsFileLink *file_link; /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get recycling */ g_rec_mutex_lock(channel_mutex); recycling = channel->first_recycling; file_link = AGS_INPUT(channel)->file_link; g_rec_mutex_unlock(channel_mutex); /* set filename and channel */ if(file_link == NULL){ file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, NULL); g_object_set(channel, "file-link", file_link, NULL); g_object_unref(file_link); } g_object_set(file_link, "filename", filename->data, "audio-channel", j, NULL); /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* replace template audio signal */ g_rec_mutex_lock(recycling_mutex); AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; AGS_AUDIO_SIGNAL(audio_signal->data)->recycling = (GObject *) recycling; ags_recycling_add_audio_signal(recycling, audio_signal->data); g_rec_mutex_unlock(recycling_mutex); /* iterate */ audio_signal = audio_signal->next; g_rec_mutex_lock(channel_mutex); channel = channel->next; g_rec_mutex_unlock(channel_mutex); } if(audio_channels > audio_file->file_audio_channels){ channel = ags_channel_nth(channel, audio_channels - audio_file->file_audio_channels); g_object_unref(channel); } g_object_run_dispose(audio_file); g_object_unref(audio_file); filename = filename->next; } } } void ags_audio_open_audio_file_as_wave(AgsAudio *audio, const gchar *filename, gboolean overwrite_channels, gboolean create_channels) { AgsChannel *channel; AgsAudioFile *audio_file; GObject *soundcard; GList *wave; guint audio_channels; GError *error; GRecMutex *audio_mutex; GRecMutex *channel_mutex; if(!AGS_IS_AUDIO(audio) || filename == NULL || (!overwrite_channels && !create_channels)){ return; } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get audio fields */ g_rec_mutex_lock(audio_mutex); audio_channels = audio->audio_channels; soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* open audio file */ audio_file = ags_audio_file_new(filename, soundcard, -1); if(!ags_audio_file_open(audio_file)){ return; } ags_audio_file_read_wave(audio_file, 0, 0.0, 0); ags_audio_file_close(audio_file); //TODO:JK: implement me } void ags_audio_open_midi_file_as_midi(AgsAudio *audio, const gchar *filename, const gchar *instrument, const gchar *track_name, guint midi_channel) { //TODO:JK: implement me } void ags_audio_open_midi_file_as_notation(AgsAudio *audio, const gchar *filename, const gchar *instrument, const gchar *track_name, guint midi_channel) { //TODO:JK: implement me } void ags_audio_set_property_all(AgsAudio *audio, gint n_params, const gchar *parameter_name[], const GValue value[]) { guint i; for(i = 0; i < n_params; i++){ g_object_set_property(G_OBJECT(audio), parameter_name[i], &(value[i])); } } void ags_audio_recursive_set_property_down(AgsChannel *channel, gint n_params, const gchar *parameter_name[], const GValue value[]) { if(channel == NULL){ return; } ags_audio_set_property_all(AGS_AUDIO(channel->audio), n_params, parameter_name, value); ags_audio_recursive_set_property_down_input(channel, n_params, parameter_name, value); } void ags_audio_recursive_set_property_down_input(AgsChannel *channel, gint n_params, const gchar *parameter_name[], const GValue value[]) { AgsAudio *audio; AgsChannel *input; if(channel == NULL){ return; } audio = (AgsAudio *) channel->audio; if(audio == NULL){ return; } input = ags_channel_nth(audio->input, channel->audio_channel); g_object_unref(input); while(input != NULL){ ags_audio_recursive_set_property_down(input->link, n_params, parameter_name, value); input = input->next; } } /** * ags_audio_recursive_set_property: * @audio: the #AgsAudio * @n_params: the count of elements in following arrays * @parameter_name: the parameter's name array * @value: the value array * * Recursive set property for #AgsAudio. * * Since: 3.0.0 */ void ags_audio_recursive_set_property(AgsAudio *audio, gint n_params, const gchar *parameter_name[], const GValue value[]) { AgsChannel *channel; if(!AGS_IS_AUDIO(audio)){ return; } ags_audio_set_property_all(audio, n_params, parameter_name, value); if(audio->input != NULL){ channel = audio->input; while(channel != NULL){ ags_audio_recursive_set_property_down(channel->link, n_params, parameter_name, value); channel = channel->next; } } } void ags_audio_real_recursive_run_stage(AgsAudio *audio, gint sound_scope, guint staging_flags) { AgsChannel *channel; GRecMutex *audio_mutex; GRecMutex *channel_mutex; /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get channel */ g_rec_mutex_lock(audio_mutex); channel = audio->output; g_rec_mutex_unlock(audio_mutex); /* initialize return value */ while(channel != NULL){ /* reset recursive channel stage */ ags_channel_recursive_run_stage(channel, sound_scope, staging_flags); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* iterate */ g_rec_mutex_lock(channel_mutex); channel = channel->next; g_rec_mutex_unlock(channel_mutex); } } /** * ags_audio_recursive_run_stage: * @audio: the #AgsAudio object * @sound_scope: the scope to reset * @staging_flags: the stage to enable * * Resets @audio's @sound_scope specified by @staging_flags. * * Since: 3.0.0 */ void ags_audio_recursive_run_stage(AgsAudio *audio, gint sound_scope, guint staging_flags) { g_return_if_fail(AGS_IS_AUDIO(audio)); /* emit */ g_object_ref((GObject *) audio); g_signal_emit(G_OBJECT(audio), audio_signals[RECURSIVE_RUN_STAGE], 0, sound_scope, staging_flags); g_object_unref((GObject *) audio); } /** * ags_audio_new: * @output_soundcard: the #AgsSoundcard to use for output * * Creates an #AgsAudio, with defaults of @soundcard. * * Returns: a new #AgsAudio * * Since: 3.0.0 */ AgsAudio* ags_audio_new(GObject *output_soundcard) { AgsAudio *audio; audio = (AgsAudio *) g_object_new(AGS_TYPE_AUDIO, "output-soundcard", output_soundcard, NULL); return(audio); } gsequencer-3.1.3/ags/audio/ags_audio_buffer_util.c0000644000175000017500000160340213616617253017160 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include /** * ags_audio_buffer_util_format_from_soundcard: * @soundcard_format: the soundcard bit mode * * Translate soundcard format to audio buffer util format. * * Returns: the converted format * * Since: 3.0.0 */ guint ags_audio_buffer_util_format_from_soundcard(guint soundcard_format) { switch(soundcard_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: return(AGS_AUDIO_BUFFER_UTIL_S8); case AGS_SOUNDCARD_SIGNED_16_BIT: return(AGS_AUDIO_BUFFER_UTIL_S16); case AGS_SOUNDCARD_SIGNED_24_BIT: return(AGS_AUDIO_BUFFER_UTIL_S24); case AGS_SOUNDCARD_SIGNED_32_BIT: return(AGS_AUDIO_BUFFER_UTIL_S32); case AGS_SOUNDCARD_SIGNED_64_BIT: return(AGS_AUDIO_BUFFER_UTIL_S64); case AGS_SOUNDCARD_FLOAT: return(AGS_AUDIO_BUFFER_UTIL_FLOAT); case AGS_SOUNDCARD_DOUBLE: return(AGS_AUDIO_BUFFER_UTIL_DOUBLE); case AGS_SOUNDCARD_COMPLEX: return(AGS_AUDIO_BUFFER_UTIL_COMPLEX); default: { g_warning("ags_audio_buffer_util_format_from_soundcard() - unsupported soundcard format"); return(0); } } } /** * ags_audio_buffer_util_get_copy_mode: * @destination_format: the destination buffer format * @source_format: the source buffer format * * Get copy mode for given destination and source format. * * Returns: the desired copy mode * * Since: 3.0.0 */ guint ags_audio_buffer_util_get_copy_mode(guint destination_format, guint source_format) { guint copy_mode; copy_mode = 0; if(source_format == AGS_AUDIO_BUFFER_UTIL_S8){ /* signed 8 bit source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else if(source_format == AGS_AUDIO_BUFFER_UTIL_S16){ /* signed 16 bit source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else if(source_format == AGS_AUDIO_BUFFER_UTIL_S24){ /* signed 24 bit source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else if(source_format == AGS_AUDIO_BUFFER_UTIL_S32){ /* signed 32 bit source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else if(source_format == AGS_AUDIO_BUFFER_UTIL_S64){ /* signed 64 bit source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else if(source_format == AGS_AUDIO_BUFFER_UTIL_FLOAT){ /* float source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else if(source_format == AGS_AUDIO_BUFFER_UTIL_DOUBLE){ /* double source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } #ifdef __APPLE__ }else if(source_format == AGS_AUDIO_BUFFER_UTIL_FLOAT32){ /* double source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_DOUBLE; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT32; break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } #endif }else if(source_format == AGS_AUDIO_BUFFER_UTIL_COMPLEX){ /* complex source */ switch(destination_format){ case AGS_AUDIO_BUFFER_UTIL_S8: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S8; break; case AGS_AUDIO_BUFFER_UTIL_S16: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S16; break; case AGS_AUDIO_BUFFER_UTIL_S24: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S24; break; case AGS_AUDIO_BUFFER_UTIL_S32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S32; break; case AGS_AUDIO_BUFFER_UTIL_S64: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_S64; break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_FLOAT; break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_DOUBLE; break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_FLOAT32; break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: copy_mode = AGS_AUDIO_BUFFER_UTIL_COPY_COMPLEX_TO_COMPLEX; break; default: { g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported destination buffer format"); } } }else{ g_warning("ags_audio_buffer_util_get_copy_mode() - unsupported source buffer format"); } return(copy_mode); } /** * ags_audio_buffer_util_clear_float: * @buffer: the buffer to clear * @channels: number of channels * @count: count frames * * Clears a buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_clear_float(gfloat *buffer, guint channels, guint count) { guint limit; guint current_channel; guint i; i = 0; /* unrolled function */ if(count > 8){ limit = count - 8; for(; i < limit; i += 8){ current_channel = 0; buffer[0] = 0.0; buffer[(current_channel = channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer += (current_channel + channels); } } for(; i < count; i++){ *buffer = 0.0; buffer += channels; } } #ifdef __APPLE__ /** * ags_audio_buffer_util_clear_float32: * @buffer: the buffer to clear * @channels: number of channels * @count: count frames * * Clears a buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_clear_float32(Float32 *buffer, guint channels, guint count) { guint limit; guint current_channel; guint i; i = 0; /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = (Float32) 0.0; buffer[(current_channel = channels)] = (Float32) 0.0; buffer[(current_channel += channels)] = (Float32) 0.0; buffer[(current_channel += channels)] = (Float32) 0.0; buffer[(current_channel += channels)] = (Float32) 0.0; buffer[(current_channel += channels)] = (Float32) 0.0; buffer[(current_channel += channels)] = (Float32) 0.0; buffer[(current_channel += channels)] = (Float32) 0.0; buffer += (current_channel + channels); } } for(; i < count; i++){ *buffer = (Float32) 0.0; buffer += channels; } } #endif /** * ags_audio_buffer_util_clear_double: * @buffer: the buffer to clear * @channels: number of channels * @count: count frames * * Clears a buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_clear_double(gdouble *buffer, guint channels, guint count) { guint limit; guint current_channel; guint i; i = 0; /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = 0.0; buffer[(current_channel = channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer[(current_channel += channels)] = 0.0; buffer += (current_channel + channels); } } for(; i < count; i++){ *buffer = 0.0; buffer += channels; } } /** * ags_audio_buffer_util_clear_complex: * @buffer: the buffer to clear * @channels: number of channels * @count: count frames * * Clears a buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_clear_complex(AgsComplex *buffer, guint channels, guint count) { guint limit; guint current_channel; guint i; i = 0; /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0].real = 0.0; buffer[0].imag = 0.0; buffer[(current_channel = channels)].real = 0.0; buffer[(current_channel = channels)].imag = 0.0; buffer[(current_channel += channels)].real = 0.0; buffer[(current_channel += channels)].imag = 0.0; buffer[(current_channel += channels)].real = 0.0; buffer[(current_channel += channels)].imag = 0.0; buffer[(current_channel += channels)].real = 0.0; buffer[(current_channel += channels)].imag = 0.0; buffer[(current_channel += channels)].real = 0.0; buffer[(current_channel += channels)].imag = 0.0; buffer[(current_channel += channels)].real = 0.0; buffer[(current_channel += channels)].imag = 0.0; buffer[(current_channel += channels)].real = 0.0; buffer[(current_channel += channels)].imag = 0.0; buffer += (current_channel + channels); } } for(; i < count; i++){ buffer[0].real = 0.0; buffer[0].imag = 0.0; buffer += channels; } } /** * ags_audio_buffer_util_clear_buffer: * @buffer: the audio data * @channels: the number of channels * @count: number of frames * @format: the format * * Clears the audio data. * * Since: 3.0.0 */ void ags_audio_buffer_util_clear_buffer(void *buffer, guint channels, guint count, guint format) { switch(format){ case AGS_AUDIO_BUFFER_UTIL_S8: { memset((gint8 *) buffer, 0, channels * count * sizeof(gint8)); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { memset((gint16 *) buffer, 0, channels * count * sizeof(gint16)); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { memset((gint32 *) buffer, 0, channels * count * sizeof(gint32)); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { memset((gint32 *) buffer, 0, channels * count * sizeof(gint32)); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { memset((gint64 *) buffer, 0, channels * count * sizeof(gint64)); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_audio_buffer_util_clear_float(buffer, channels, count); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_audio_buffer_util_clear_double(buffer, channels, count); } break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_FLOAT32: { ags_audio_buffer_util_clear_float32(buffer, channels, count); } break; #endif case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_audio_buffer_util_clear_complex(buffer, channels, count); } break; default: g_critical("unsupported audio buffer format"); } } /** * ags_audio_buffer_util_envelope_s8: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_s8(gint8 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = (gint8) v_buffer[0]; buffer[(current_channel = channels)] = (gint8) v_buffer[1]; buffer[(current_channel += channels)] = (gint8) v_buffer[2]; buffer[(current_channel += channels)] = (gint8) v_buffer[3]; buffer[(current_channel += channels)] = (gint8) v_buffer[4]; buffer[(current_channel += channels)] = (gint8) v_buffer[5]; buffer[(current_channel += channels)] = (gint8) v_buffer[6]; buffer[(current_channel += channels)] = (gint8) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ current_channel = 0; buffer[0] = 0xff & ((gint16) (buffer[0] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ buffer[0] = 0xff & ((gint16) (buffer[0] * current_volume)); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope_s16: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_s16(gint16 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = (gint16) v_buffer[0]; buffer[(current_channel = channels)] = (gint16) v_buffer[1]; buffer[(current_channel += channels)] = (gint16) v_buffer[2]; buffer[(current_channel += channels)] = (gint16) v_buffer[3]; buffer[(current_channel += channels)] = (gint16) v_buffer[4]; buffer[(current_channel += channels)] = (gint16) v_buffer[5]; buffer[(current_channel += channels)] = (gint16) v_buffer[6]; buffer[(current_channel += channels)] = (gint16) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ current_channel = 0; buffer[0] = (gint16) 0xffff & ((gint32) (buffer[0] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ buffer[0] = (gint16) 0xffff & ((gint32) (buffer[0] * current_volume)); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope_s24: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_s24(gint32 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = (gint32) v_buffer[0]; buffer[(current_channel = channels)] = (gint32) v_buffer[1]; buffer[(current_channel += channels)] = (gint32) v_buffer[2]; buffer[(current_channel += channels)] = (gint32) v_buffer[3]; buffer[(current_channel += channels)] = (gint32) v_buffer[4]; buffer[(current_channel += channels)] = (gint32) v_buffer[5]; buffer[(current_channel += channels)] = (gint32) v_buffer[6]; buffer[(current_channel += channels)] = (gint32) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ current_channel = 0; buffer[0] = (gint32) 0xffffffff & ((gint32) (buffer[0] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ buffer[0] = (gint32) 0xffffffff & ((gint32) (buffer[0] * current_volume)); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope_s32: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_s32(gint32 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = (gint32) v_buffer[0]; buffer[(current_channel = channels)] = (gint32) v_buffer[1]; buffer[(current_channel += channels)] = (gint32) v_buffer[2]; buffer[(current_channel += channels)] = (gint32) v_buffer[3]; buffer[(current_channel += channels)] = (gint32) v_buffer[4]; buffer[(current_channel += channels)] = (gint32) v_buffer[5]; buffer[(current_channel += channels)] = (gint32) v_buffer[6]; buffer[(current_channel += channels)] = (gint32) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ current_channel = 0; buffer[0] = (gint32) 0xffffffff & ((gint64) (buffer[0] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint32) 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ buffer[0] = (gint32) 0xffffffff & ((gint64) (buffer[0] * current_volume)); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope_s64: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_s64(gint64 *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = (gint64) v_buffer[0]; buffer[(current_channel = channels)] = (gint64) v_buffer[1]; buffer[(current_channel += channels)] = (gint64) v_buffer[2]; buffer[(current_channel += channels)] = (gint64) v_buffer[3]; buffer[(current_channel += channels)] = (gint64) v_buffer[4]; buffer[(current_channel += channels)] = (gint64) v_buffer[5]; buffer[(current_channel += channels)] = (gint64) v_buffer[6]; buffer[(current_channel += channels)] = (gint64) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ current_channel = 0; buffer[0] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[0] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ buffer[0] = (gint64) 0xffffffffffffffff & ((gint64) (buffer[0] * current_volume)); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope_float: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_float(gfloat *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = (gfloat) v_buffer[0]; buffer[(current_channel = channels)] = (gfloat) v_buffer[1]; buffer[(current_channel += channels)] = (gfloat) v_buffer[2]; buffer[(current_channel += channels)] = (gfloat) v_buffer[3]; buffer[(current_channel += channels)] = (gfloat) v_buffer[4]; buffer[(current_channel += channels)] = (gfloat) v_buffer[5]; buffer[(current_channel += channels)] = (gfloat) v_buffer[6]; buffer[(current_channel += channels)] = (gfloat) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = ((gdouble) (buffer[0] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); current_volume = start_volume + i * ratio; } } #endif for(; i < buffer_length; i++){ buffer[0] = ((gdouble) (buffer[0] * current_volume)); buffer += channels; current_volume = start_volume + i * ratio; } return(current_volume); } /** * ags_audio_buffer_util_envelope_double: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_double(gdouble *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= current_volume; current_channel = 0; buffer[0] = v_buffer[0]; buffer[(current_channel = channels)] = v_buffer[1]; buffer[(current_channel += channels)] = v_buffer[2]; buffer[(current_channel += channels)] = v_buffer[3]; buffer[(current_channel += channels)] = v_buffer[4]; buffer[(current_channel += channels)] = v_buffer[5]; buffer[(current_channel += channels)] = v_buffer[6]; buffer[(current_channel += channels)] = v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8, current_volume = start_volume + i * ratio){ current_channel = 0; buffer[0] = ((gdouble) (buffer[0] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel = channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * current_volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ buffer[0] = ((gdouble) (buffer[0] * current_volume)); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope_complex: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope_complex(AgsComplex *buffer, guint channels, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble start_volume; guint limit; guint current_channel; guint i; start_volume = current_volume; i = 0; //TODO:JK: improve me for(; i < buffer_length; i++, current_volume = start_volume + i * ratio){ complex z; z = ags_complex_get(buffer) * current_volume; ags_complex_set(buffer, z); buffer += channels; } return(current_volume); } /** * ags_audio_buffer_util_envelope: * @buffer: the audio buffer * @channels: number of audio channels * @format: the format to use * @buffer_length: the buffer's length * @current_volume: current volume * @ratio: the amount to increment * * Envelope buffer at @ratio. * * Returns: the last volume used * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_envelope(void *buffer, guint channels, guint format, guint buffer_length, gdouble current_volume, gdouble ratio) { gdouble retval; retval = 0.0; switch(format){ case AGS_AUDIO_BUFFER_UTIL_S8: { retval = ags_audio_buffer_util_envelope_s8((gint8 *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { retval = ags_audio_buffer_util_envelope_s16((gint16 *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { retval = ags_audio_buffer_util_envelope_s24((gint32 *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { retval = ags_audio_buffer_util_envelope_s32((gint32 *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { retval = ags_audio_buffer_util_envelope_s64((gint64 *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { retval = ags_audio_buffer_util_envelope_float((gfloat *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { retval = ags_audio_buffer_util_envelope_double((gdouble *) buffer, channels, buffer_length, current_volume, ratio); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { retval = ags_audio_buffer_util_envelope_complex((AgsComplex *) buffer, channels, buffer_length, current_volume, ratio); } break; default: g_warning("ags_audio_buffer_util_envelope() - unknown format"); } return(retval); } /** * ags_audio_buffer_util_volume_s8: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_s8(gint8 *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gint8) v_buffer[0]; buffer[(current_channel = channels)] = (gint8) v_buffer[1]; buffer[(current_channel += channels)] = (gint8) v_buffer[2]; buffer[(current_channel += channels)] = (gint8) v_buffer[3]; buffer[(current_channel += channels)] = (gint8) v_buffer[4]; buffer[(current_channel += channels)] = (gint8) v_buffer[5]; buffer[(current_channel += channels)] = (gint8) v_buffer[6]; buffer[(current_channel += channels)] = (gint8) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = 0xff & ((gint16) (buffer[0] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xff & ((gint16) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = 0xff & ((gint16) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_s16: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_s16(gint16 *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gint16) v_buffer[0]; buffer[(current_channel = channels)] = (gint16) v_buffer[1]; buffer[(current_channel += channels)] = (gint16) v_buffer[2]; buffer[(current_channel += channels)] = (gint16) v_buffer[3]; buffer[(current_channel += channels)] = (gint16) v_buffer[4]; buffer[(current_channel += channels)] = (gint16) v_buffer[5]; buffer[(current_channel += channels)] = (gint16) v_buffer[6]; buffer[(current_channel += channels)] = (gint16) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = (gint16) 0xffff & ((gint32) (buffer[0] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = (gint16) 0xffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = (gint16) 0xffff & ((gint32) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_s24: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_s24(gint32 *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gint32) v_buffer[0]; buffer[(current_channel = channels)] = (gint32) v_buffer[1]; buffer[(current_channel += channels)] = (gint32) v_buffer[2]; buffer[(current_channel += channels)] = (gint32) v_buffer[3]; buffer[(current_channel += channels)] = (gint32) v_buffer[4]; buffer[(current_channel += channels)] = (gint32) v_buffer[5]; buffer[(current_channel += channels)] = (gint32) v_buffer[6]; buffer[(current_channel += channels)] = (gint32) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = 0xffffffff & ((gint32) (buffer[0] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint32) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = 0xffffffff & ((gint32) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_s32: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_s32(gint32 *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gint32) v_buffer[0]; buffer[(current_channel = channels)] = (gint32) v_buffer[1]; buffer[(current_channel += channels)] = (gint32) v_buffer[2]; buffer[(current_channel += channels)] = (gint32) v_buffer[3]; buffer[(current_channel += channels)] = (gint32) v_buffer[4]; buffer[(current_channel += channels)] = (gint32) v_buffer[5]; buffer[(current_channel += channels)] = (gint32) v_buffer[6]; buffer[(current_channel += channels)] = (gint32) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = 0xffffffff & ((gint64) (buffer[0] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = 0xffffffff & ((gint64) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_s64: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_s64(gint64 *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gint64) v_buffer[0]; buffer[(current_channel = channels)] = (gint64) v_buffer[1]; buffer[(current_channel += channels)] = (gint64) v_buffer[2]; buffer[(current_channel += channels)] = (gint64) v_buffer[3]; buffer[(current_channel += channels)] = (gint64) v_buffer[4]; buffer[(current_channel += channels)] = (gint64) v_buffer[5]; buffer[(current_channel += channels)] = (gint64) v_buffer[6]; buffer[(current_channel += channels)] = (gint64) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = 0xffffffffffffffff & ((gint64) (buffer[0] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = 0xffffffffffffffff & ((gint64) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = 0xffffffffffffffff & ((gint64) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_float: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_float(gfloat *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gfloat) v_buffer[0]; buffer[(current_channel = channels)] = (gfloat) v_buffer[1]; buffer[(current_channel += channels)] = (gfloat) v_buffer[2]; buffer[(current_channel += channels)] = (gfloat) v_buffer[3]; buffer[(current_channel += channels)] = (gfloat) v_buffer[4]; buffer[(current_channel += channels)] = (gfloat) v_buffer[5]; buffer[(current_channel += channels)] = (gfloat) v_buffer[6]; buffer[(current_channel += channels)] = (gfloat) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = ((gdouble) (buffer[0] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = ((gdouble) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_double: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_double(gdouble *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_buffer *= volume; current_channel = 0; buffer[0] = (gdouble) v_buffer[0]; buffer[(current_channel = channels)] = (gdouble) v_buffer[1]; buffer[(current_channel += channels)] = (gdouble) v_buffer[2]; buffer[(current_channel += channels)] = (gdouble) v_buffer[3]; buffer[(current_channel += channels)] = (gdouble) v_buffer[4]; buffer[(current_channel += channels)] = (gdouble) v_buffer[5]; buffer[(current_channel += channels)] = (gdouble) v_buffer[6]; buffer[(current_channel += channels)] = (gdouble) v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; buffer[0] = ((gdouble) (buffer[0] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel = channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer[current_channel] = ((gdouble) (buffer[(current_channel += channels)] * volume)); buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ buffer[0] = ((gdouble) (buffer[0] * volume)); buffer += channels; } } /** * ags_audio_buffer_util_volume_complex: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume_complex(AgsComplex *buffer, guint channels, guint buffer_length, gdouble volume) { guint limit; guint current_channel; guint i; i = 0; //TODO:JK: improve me for(; i < buffer_length; i++){ complex z; z = ags_complex_get(buffer) * volume; ags_complex_set(buffer, z); buffer += channels; } } /** * ags_audio_buffer_util_volume: * @buffer: the audio buffer * @channels: number of audio channels * @format: the format to use * @buffer_length: the buffer's length * @volume: volume * * Adjust volume of buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_volume(void *buffer, guint channels, guint format, guint buffer_length, gdouble volume) { switch(format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_audio_buffer_util_volume_s8((gint8 *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_audio_buffer_util_volume_s16((gint16 *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_audio_buffer_util_volume_s24((gint32 *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_audio_buffer_util_volume_s32((gint32 *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_audio_buffer_util_volume_s64((gint64 *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_audio_buffer_util_volume_float((gfloat *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_audio_buffer_util_volume_double((gdouble *) buffer, channels, buffer_length, volume); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_audio_buffer_util_volume_complex((AgsComplex *) buffer, channels, buffer_length, volume); } break; default: g_warning("ags_audio_buffer_util_volume() - unknown format"); } } /** * ags_audio_buffer_util_peak_s8: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_s8(gint8 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT8 * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_s16: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_s16(gint16 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT16 * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_s24: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_s24(gint32 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (1.0 / (gdouble) 0xffffffff * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) 0xffffffff * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_32: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_s32(gint32 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT32 * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_64: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_s64(gint64 *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((1.0 / (gdouble) G_MAXUINT64 * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_float: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_float(gfloat *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (0.5 * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - 8; for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_double: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_double(gdouble *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; /* calculate average value */ current_value = 0.0; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(buffer_length > 8){ limit = buffer_length - (buffer_length % 8); for(; i < limit; i += 8){ ags_v8double v_buffer; ags_v8double v_zero; current_channel = 0; v_buffer = (ags_v8double) {(gdouble) buffer[0], (gdouble) buffer[(current_channel = channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)], (gdouble) buffer[(current_channel += channels)]}; v_zero = (ags_v8double) {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; v_buffer = (0.5 * pressure_factor) * v_buffer; v_zero = v_buffer == v_zero; if(v_zero[0] != 0.0){ v_buffer[0] = 1.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 1.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 1.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 1.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 1.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 1.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 1.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 1.0; } v_buffer = 1.0 / v_buffer; if(v_zero[0] != 0.0){ v_buffer[0] = 0.0; } if(v_zero[1] != 0.0){ v_buffer[1] = 0.0; } if(v_zero[2] != 0.0){ v_buffer[2] = 0.0; } if(v_zero[3] != 0.0){ v_buffer[3] = 0.0; } if(v_zero[4] != 0.0){ v_buffer[4] = 0.0; } if(v_zero[5] != 0.0){ v_buffer[5] = 0.0; } if(v_zero[6] != 0.0){ v_buffer[6] = 0.0; } if(v_zero[7] != 0.0){ v_buffer[7] = 0.0; } current_value += v_buffer[0] + v_buffer[1] + v_buffer[2] + v_buffer[3] + v_buffer[4] + v_buffer[5] + v_buffer[6] + v_buffer[7]; buffer += (current_channel + channels); } } #else /* unrolled function */ if(buffer_length > 0){ limit = buffer_length - 8; for(; i < limit; i += 8){ current_channel = 0; if(buffer[0] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[0])); } if(buffer[(current_channel = channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } if(buffer[(current_channel += channels)] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[current_channel])); } buffer += (current_channel + channels); } } #endif for(; i < buffer_length; i++){ if(buffer[0] != 0){ current_value += (1.0 / ((0.5 * pressure_factor) * buffer[0])); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak_complex: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak_complex(AgsComplex *buffer, guint channels, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { double current_value; guint limit; guint current_channel; guint i; i = 0; /* calculate average value */ current_value = 0.0; //TODO:JK: improve me for(; i < buffer_length; i++){ complex z; z = ags_complex_get(buffer); if(creal(z) != 0.0 || cimag(z) != 0.0){ current_value += (1.0 / ((0.5 * pressure_factor) * (z / M_PI))); } buffer += channels; } if(current_value != 0.0){ current_value = (atan(1.0 / harmonic_rate) / sin(current_value / max_rate)); } return(current_value); } /** * ags_audio_buffer_util_peak: * @buffer: the audio buffer * @channels: number of audio channels * @format: the format to use * @buffer_length: the buffer length * @harmonic_rate: the harmonic rate * @max_rate: the max rate * @pressure_factor: the pressure factor * * Retrive peak of buffer. * * Returns: the peak as gdouble * * Since: 3.0.0 */ gdouble ags_audio_buffer_util_peak(void *buffer, guint channels, guint format, guint buffer_length, gdouble harmonic_rate, gdouble max_rate, gdouble pressure_factor) { gdouble current_value; current_value = 0.0; switch(format){ case AGS_AUDIO_BUFFER_UTIL_S8: { current_value = ags_audio_buffer_util_peak_s8((gint8 *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { current_value = ags_audio_buffer_util_peak_s16((gint16 *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { current_value = ags_audio_buffer_util_peak_s24((gint32 *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { current_value = ags_audio_buffer_util_peak_s32((gint32 *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { current_value = ags_audio_buffer_util_peak_s64((gint64 *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { current_value = ags_audio_buffer_util_peak_float((gfloat *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { current_value = ags_audio_buffer_util_peak_double((gdouble *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { current_value = ags_audio_buffer_util_peak_complex((AgsComplex *) buffer, channels, buffer_length, harmonic_rate, max_rate, pressure_factor); } break; default: g_warning("ags_audio_buffer_util_peak() - unknown format"); } return(current_value); } /** * ags_audio_buffer_util_resample_s8: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ gint8* ags_audio_buffer_util_resample_s8(gint8 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gint8 *ret_buffer; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s8_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gint8 *) malloc(channels * (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint8)); memset(ret_buffer, 0, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint8)); ags_audio_buffer_util_copy_float_to_s8(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_s16: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ gint16* ags_audio_buffer_util_resample_s16(gint16 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gint16 *ret_buffer; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s16_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gint16 *) malloc(channels * (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint16)); memset(ret_buffer, 0, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint16)); ags_audio_buffer_util_copy_float_to_s16(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_s24: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ gint32* ags_audio_buffer_util_resample_s24(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gint32 *ret_buffer; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s24_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gint32 *) malloc(channels * (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint32)); memset(ret_buffer, 0, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint32)); ags_audio_buffer_util_copy_float_to_s24(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_s32: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ gint32* ags_audio_buffer_util_resample_s32(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gint32 *ret_buffer; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s32_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gint32 *) malloc(channels * (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint32)); memset(ret_buffer, 0, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint32)); ags_audio_buffer_util_copy_float_to_s32(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_s64: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ gint64* ags_audio_buffer_util_resample_s64(gint64 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gint64 *ret_buffer; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s64_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gint64 *) malloc(channels * (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint64)); memset(ret_buffer, 0, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gint64)); ags_audio_buffer_util_copy_float_to_s64(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_float: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ float* ags_audio_buffer_util_resample_float(gfloat *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gfloat *ret_buffer; //FIXME:JK: lost precision secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_float_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gfloat *) malloc(channels * (ceil((gfloat) buffer_length / (gfloat) samplerate * (gfloat) target_samplerate)) * sizeof(gfloat)); ags_audio_buffer_util_clear_float(ret_buffer, channels, (ceil((gfloat) buffer_length / (gfloat) samplerate * (gfloat) target_samplerate))); ags_audio_buffer_util_copy_float_to_float(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gfloat) buffer_length / (gfloat) samplerate * (gfloat) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_double: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ double* ags_audio_buffer_util_resample_double(gdouble *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { SRC_DATA secret_rabbit; gdouble *ret_buffer; //FIXME:JK: lost precision secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_double_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ret_buffer = (gdouble *) malloc(channels * (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate)) * sizeof(gdouble)); ags_audio_buffer_util_clear_double(ret_buffer, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); ags_audio_buffer_util_copy_float_to_double(ret_buffer, channels, secret_rabbit.data_out, channels, (ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate))); free(secret_rabbit.data_out); free(secret_rabbit.data_in); return(ret_buffer); } /** * ags_audio_buffer_util_resample_complex: * @buffer: the audio buffer * @channels: number of audio channels * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ AgsComplex* ags_audio_buffer_util_resample_complex(AgsComplex *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate) { AgsComplex *ret_buffer; complex **z_ptr_ptr; complex *z_ptr; gdouble **y_ptr_ptr; gdouble *y_ptr; complex z; gdouble y; gdouble delay_factor; gdouble delay; guint output_frames; guint i, n; delay_factor = 1.0 / (gdouble) target_samplerate * (gdouble) samplerate; output_frames = ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate); ret_buffer = (AgsComplex *) malloc(channels * output_frames * sizeof(AgsComplex)); z_ptr = &z; z_ptr_ptr = &z_ptr; y_ptr = &y; y_ptr_ptr = &y_ptr; for(i = 0, n = 0, delay = 0.0; i < output_frames; i++){ /* get y */ //TODO:JK: improve me AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME(buffer + n, channels, n, buffer_length, y_ptr_ptr); /* put z */ AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, channels, i, output_frames, z_ptr_ptr); ags_complex_set(ret_buffer + i, z); delay += delay_factor; if(delay_factor < 1.0){ if(delay >= 1.0){ n += floor(delay); delay -= floor(delay); } }else{ n += floor(delay); delay -= floor(delay); } } return(ret_buffer); } /** * ags_audio_buffer_util_resample: * @buffer: the audio buffer * @channels: number of audio channels * @format: the format * @samplerate: the current samplerate * @buffer_length: the buffer's length * @target_samplerate: the samplerate to use * * Resamples @buffer from @samplerate to @target_samplerate. * * Returns: the resampled audio buffer * * Since: 3.0.0 */ void* ags_audio_buffer_util_resample(void *buffer, guint channels, guint format, guint samplerate, guint buffer_length, guint target_samplerate) { void *retval; retval = NULL; switch(format){ case AGS_AUDIO_BUFFER_UTIL_S8: { retval = ags_audio_buffer_util_resample_s8((gint8 *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { retval = ags_audio_buffer_util_resample_s16((gint16 *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { retval = ags_audio_buffer_util_resample_s24((gint32 *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { retval = ags_audio_buffer_util_resample_s32((gint32 *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { retval = ags_audio_buffer_util_resample_s64((gint64 *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { retval = ags_audio_buffer_util_resample_float((gfloat *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { retval = ags_audio_buffer_util_resample_double((gdouble *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { retval = ags_audio_buffer_util_resample_complex((AgsComplex *) buffer, channels, samplerate, buffer_length, target_samplerate); } break; default: g_warning("ags_audio_buffer_util_resample() - unknown format"); } return(retval); } /** * ags_audio_buffer_util_resample_s8_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_s8_with_buffer(gint8 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint8 *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s8_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_s8(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_s16_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_s16_with_buffer(gint16 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint16 *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s16_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_s16(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_s24_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_s24_with_buffer(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint32 *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s24_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_s24(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_s32_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_s32_with_buffer(gint32 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint32 *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s32_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_s32(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_s64_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_s64_with_buffer(gint64 *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gint64 *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_s64_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_s64(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_float_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_float_with_buffer(gfloat *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gfloat *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = buffer; secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_float(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_double_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_double_with_buffer(gdouble *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, gdouble *target_buffer) { SRC_DATA secret_rabbit; secret_rabbit.src_ratio = target_samplerate / samplerate; secret_rabbit.input_frames = buffer_length; secret_rabbit.data_in = (gfloat *) malloc(channels * buffer_length * sizeof(gfloat)); ags_audio_buffer_util_clear_float(secret_rabbit.data_in, channels, buffer_length); ags_audio_buffer_util_copy_double_to_float(secret_rabbit.data_in, channels, buffer, channels, buffer_length); secret_rabbit.output_frames = ceil(secret_rabbit.src_ratio * buffer_length); secret_rabbit.data_out = (gfloat *) malloc(channels * secret_rabbit.output_frames * sizeof(gfloat)); src_simple(&secret_rabbit, SRC_SINC_BEST_QUALITY, channels); ags_audio_buffer_util_copy_float_to_double(target_buffer, channels, secret_rabbit.data_out, channels, ((secret_rabbit.output_frames > target_buffer_length) ? target_buffer_length: secret_rabbit.output_frames)); free(secret_rabbit.data_out); free(secret_rabbit.data_in); } /** * ags_audio_buffer_util_resample_complex_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_complex_with_buffer(AgsComplex *buffer, guint channels, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, AgsComplex *target_buffer) { complex **z_ptr_ptr; complex *z_ptr; gdouble **y_ptr_ptr; gdouble *y_ptr; complex z; gdouble y; gdouble delay_factor; gdouble delay; guint output_frames; guint i, n; delay_factor = 1.0 / (gdouble) target_samplerate * (gdouble) samplerate; output_frames = ceil((gdouble) buffer_length / (gdouble) samplerate * (gdouble) target_samplerate); z_ptr = &z; z_ptr_ptr = &z_ptr; y_ptr = &y; y_ptr_ptr = &y_ptr; for(i = 0, n = 0, delay = 0.0; i < output_frames && i < target_buffer_length; i++){ /* get y */ //TODO:JK: improve me AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME(buffer + n, channels, n, buffer_length, y_ptr_ptr); /* put z */ AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, channels, i, output_frames, z_ptr_ptr); ags_complex_set(target_buffer + i, z); delay += delay_factor; if(delay_factor < 1.0){ if(delay >= 1.0){ n += floor(delay); delay -= floor(delay); } }else{ n += floor(delay); delay -= floor(delay); } } } /** * ags_audio_buffer_util_resample_with_buffer: * @buffer: the buffer to resample * @channels: the channels * @format: the format * @samplerate: the samplerate * @buffer_length: the buffer length * @target_samplerate: target samplerate * @target_buffer_length: target buffer length * @target_buffer: (out): target buffer * * Resample @buffer by providing @target_buffer. * * Since: 3.0.0 */ void ags_audio_buffer_util_resample_with_buffer(void *buffer, guint channels, guint format, guint samplerate, guint buffer_length, guint target_samplerate, guint target_buffer_length, void *target_buffer) { switch(format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_audio_buffer_util_resample_s8_with_buffer((gint8 *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gint8 *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_audio_buffer_util_resample_s16_with_buffer((gint16 *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gint16 *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_audio_buffer_util_resample_s24_with_buffer((gint32 *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gint32 *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_audio_buffer_util_resample_s32_with_buffer((gint32 *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gint32 *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_audio_buffer_util_resample_s64_with_buffer((gint64 *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gint64 *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_audio_buffer_util_resample_float_with_buffer((gfloat *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gfloat *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_audio_buffer_util_resample_double_with_buffer((gdouble *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (gdouble *) target_buffer); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_audio_buffer_util_resample_complex_with_buffer((AgsComplex *) buffer, channels, samplerate, buffer_length, target_samplerate, target_buffer_length, (AgsComplex *) target_buffer); } break; default: g_warning("ags_audio_buffer_util_resample_with_buffer() - unknown format"); } } /** * ags_audio_buffer_util_copy_s8_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_s8(gint8 *destination, guint dchannels, gint8 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8s8 v_destination; ags_v8s8 v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8s8) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8s8) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* no scale, just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & ((gint16) (destination[0] + source[0])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel = dchannels)] + source[(current_schannel = schannels)])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & ((gint16) (destination[0] + source[0])); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s8_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_s16(gint16 *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 258.00787401574803149606; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel = dchannels)] + (gint32) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s8_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_s24(gint32 *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 66052.03149606299212598425; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel = dchannels)] + (gint32) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s8_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_s32(gint32 *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 1690931.99212598425196850393; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint64) (destination[0] + (gint32) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (gint32) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint64) (destination[0] + (gint32) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s8_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_s64(gint64 *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 72624976668147841.00000000000000000000; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (gint64) (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (gint64) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (gint64) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s8_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_float(gfloat *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00787401574803149606; static const gdouble normalize_divisor = 127.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (gfloat) v_destination[0]; destination[(current_dchannel = dchannels)] = (gfloat) v_destination[1]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[2]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[3]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[4]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[5]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[6]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s8_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_double(gdouble *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00787401574803149606; static const gdouble normalize_divisor = 127.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_s8(gint8 *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00387585070345164342; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_s16(gint16 *destination, guint dchannels, gint16 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8s16 v_destination; ags_v8s16 v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8s16) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8s16) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* no scale, just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gint16) 0xffff & ((gint32) (destination[0] + source[0])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel = dchannels)] + source[(current_schannel = schannels)])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = (gint16) 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gint16) 0xffff & ((gint32) (destination[0] + source[0])); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_s24(gint32 *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 256.00778221991637928403; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel = dchannels)] + (gint32) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_s32(gint32 *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 6553.79995117038483840449; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint64) (destination[0] + (gint32) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (gint32) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint64) (destination[0] + (gint32) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_s64(gint64 *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 281483566907400.00021362956633198034; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (gint64) (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (gint64) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (gint64) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (gint64) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_float(gfloat *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00003051850947599719; static const gdouble normalize_divisor = 32767.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (gfloat) v_destination[0]; destination[(current_dchannel = dchannels)] = (gfloat) v_destination[1]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[2]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[3]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[4]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[5]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[6]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_double(gdouble *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00003051850947599719; static const gdouble normalize_divisor = 32767.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_s8(gint8 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00001513958157772798; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_s16(gint16 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00390613125635758118; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & ((gint32) (destination[0] + (gint32) (scale * source[0]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel = dchannels)] + (gint32) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (gint32) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & ((gint32) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_s24(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8s32 v_destination; ags_v8s32 v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8s32) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8s32) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* no scale, just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint32) (destination[0] + source[0])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel = dchannels)] + source[(current_schannel = schannels)])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint32) (destination[0] + source[0])); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_s32(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 25.60000283718142952697; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_s64(gint64 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 1099511758848.01562488265334160963; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_float(gfloat *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00000011920930376163; static const gdouble normalize_divisor = 8388607.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (gfloat) v_destination[0]; destination[(current_dchannel = dchannels)] = (gfloat) v_destination[1]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[2]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[3]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[4]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[5]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[6]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_double(gdouble *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00000011920930376163; static const gdouble normalize_divisor = 8388607.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_s8(gint8 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00000059138983983780; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_s16(gint16 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00015258323529106482; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & ((gint32) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & ((gint32) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_s24(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.03906249548890626240; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint32) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint32) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_s32(gint32 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8s32 v_destination; ags_v8s32 v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8s32) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8s32) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* no scale, just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = 0xffffffff & ((gint64) (destination[0] + source[0])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + source[(current_schannel = schannels)])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint64) (destination[0] + source[0])); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_s64(gint64 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00000000002328306417; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_float(gfloat *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00000000465661291210; static const gdouble normalize_divisor = 214748363.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (gfloat) v_destination[0]; destination[(current_dchannel = dchannels)] = (gfloat) v_destination[1]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[2]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[3]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[4]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[5]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[6]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_double(gdouble *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00000000465661291210; static const gdouble normalize_divisor = 214748363.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_s8(gint8 *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00000000000000001376; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & ((gint16) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & ((gint16) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_s16(gint16 *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00000000000000355260; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & ((gint32) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & ((gint32) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_s24(gint32 *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00000000000090949459; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint32) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint32) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint32) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_s32(gint32 *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_destination / 2.0 - 1.0) / (2^bits_source / 2.0 - 1.0) static const gdouble scale = 0.00000000002328306417; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & ((gint64) (destination[0] + (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_s64(gint64 *destination, guint dchannels, gint64 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8s64 v_destination; ags_v8s64 v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8s64) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8s64) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* no scale, just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + source[0])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel = dchannels)] + source[(current_schannel = schannels)])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); destination[current_dchannel] = 0xffffffffffffffff & ((gint64) (destination[(current_dchannel += dchannels)] + source[(current_schannel += schannels)])); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + source[0])); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_float(gfloat *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00000000000000000010; static const gdouble normalize_divisor = 9223372036854775807.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (gfloat) v_destination[0]; destination[(current_dchannel = dchannels)] = (gfloat) v_destination[1]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[2]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[3]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[4]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[5]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[6]; destination[(current_dchannel += dchannels)] = (gfloat) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_double(gdouble *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const gdouble scale = 0.00000000000000000010; static const gdouble normalize_divisor = 9223372036854775807.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_s8(gint8 *destination, guint dchannels, gfloat *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 127.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & (gint8) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & (gint8) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_s16(gint16 *destination, guint dchannels, gfloat *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 32767.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & (gint16) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & (gint16) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_s24(gint32 *destination, guint dchannels, gfloat *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 8388607.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_s32(gint32 *destination, guint dchannels, gfloat *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 214748363.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_s64(gint64 *destination, guint dchannels, gfloat *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 9223372036854775807.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_float(gfloat *destination, guint dchannels, gfloat *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_double(gdouble *destination, guint dchannels, gfloat *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_s8(gint8 *destination, guint dchannels, gdouble *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 127.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & (gint8) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & (gint8) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_s16(gint16 *destination, guint dchannels, gdouble *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 32767.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & (gint16) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & (gint16) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_s24(gint32 *destination, guint dchannels, gdouble *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 8388607.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_s32(gint32 *destination, guint dchannels, gdouble *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 214748363.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_s64(gint64 *destination, guint dchannels, gdouble *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 9223372036854775807.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {(gdouble) destination[0], (gdouble) destination[(current_dchannel = dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)], (gdouble) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_float(gfloat *destination, guint dchannels, gdouble *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* no scale, just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_double(gdouble *destination, guint dchannels, gdouble *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) ((destination[0]) + (gdouble) (source[0]))); destination += dchannels; source += schannels; } } #ifdef __APPLE__ /** * ags_audio_buffer_util_copy_s8_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_float32(Float32 *destination, guint dchannels, gint8 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const Float64 scale = 0.0078740157480314960629854564334861866115034L; static const gdouble normalize_divisor = 128.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (Float32) v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_float32(Float32 *destination, guint dchannels, gint16 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const Float64 scale = 0.0000305185094759971922971274004400890622613L; static const gdouble normalize_divisor = 32767.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (Float32) v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_float32(Float32 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const Float64 scale = 0.0000001192093037616376592678982260231634882L; static const gdouble normalize_divisor = 8388607.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (Float32) v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_float32(Float32 *destination, guint dchannels, gint32 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const Float64 scale = 0.0000000004656612875245796924105750826697801L; static const gdouble normalize_divisor = 214748363.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (Float32) v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_float32(Float32 *destination, guint dchannels, gint64 *source, guint schannels, guint count) { //NOTE:JK: scale = 1.0 / (2^bits_source / 2.0 - 1.0) // static const Float64 scale = 0.0000000000000000000722801448323667726912712L; static const gdouble normalize_divisor = 9223372036854775807.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* normalize and copy */ v_source /= (gfloat) normalize_divisor; v_destination += v_source; current_dchannel = 0; destination[0] = (Float32) v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)] / normalize_divisor))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0] / normalize_divisor))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_float32(Float32 *destination, guint dchannels, float *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {source[0], source[(current_schannel = schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)], source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_float32(Float32 *destination, guint dchannels, gdouble *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_float32(Float32 *destination, guint dchannels, Float32 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = (Float32) v_destination[1]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[2]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[3]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[4]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[5]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[6]; destination[(current_dchannel += dchannels)] = (Float32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel = dchannels)] + (Float64) (source[(current_schannel = schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (Float32) ((Float64) (destination[(current_dchannel += dchannels)] + (Float64) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (Float32) ((Float64) (destination[0] + (Float64) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_s8(gint8 *destination, guint dchannels, Float32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 127.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint8) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint8) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint8) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xff & (gint8) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xff & (gint8) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xff & (gint8) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_s16(gint16 *destination, guint dchannels, Float32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 32767.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint16) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint16) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint16) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffff & (gint16) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffff & (gint16) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffff & (gint16) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_s24(gint32 *destination, guint dchannels, Float32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 8388607.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_s32(gint32 *destination, guint dchannels, Float32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 214748363.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint32) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint32) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint32) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffff & (gint32) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffff & (gint32) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_s64(gint64 *destination, guint dchannels, Float32 *source, guint schannels, guint count) { //NOTE:JK: scale = (2^bits_source / 2.0 - 1.0) static const gdouble scale = 9223372036854775807.0; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {(gfloat) destination[0], (gfloat) destination[(current_dchannel = dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)], (gfloat) destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* scale and copy */ v_source *= (gfloat) scale; v_destination += v_source; current_dchannel = 0; destination[0] = (gint64) v_destination[0]; destination[(current_dchannel = dchannels)] = (gint64) v_destination[1]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[2]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[3]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[4]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[5]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[6]; destination[(current_dchannel += dchannels)] = (gint64) v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ current_dchannel = 0; current_schannel = 0; destination[0] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (scale * source[(current_schannel = schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); destination[current_dchannel] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (scale * source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = 0xffffffffffffffff & (gint64) ((gdouble) (destination[0] + (gdouble) (scale * source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_float(gfloat *destination, guint dchannels, Float32 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8float v_destination; ags_v8float v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8float) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8float) {(gfloat) source[0], (gfloat) source[(current_schannel = schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)], (gfloat) source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = (gfloat) ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (source[0]))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float32_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_double(gdouble *destination, guint dchannels, Float32 *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; #if defined(AGS_VECTORIZED_BUILTIN_FUNCTIONS) /* vectorized function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ ags_v8double v_destination; ags_v8double v_source; current_dchannel = 0; current_schannel = 0; v_destination = (ags_v8double) {destination[0], destination[(current_dchannel = dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)], destination[(current_dchannel += dchannels)]}; v_source = (ags_v8double) {(gdouble) source[0], (gdouble) source[(current_schannel = schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)], (gdouble) source[(current_schannel += schannels)]}; /* just copy */ v_destination += v_source; current_dchannel = 0; destination[0] = v_destination[0]; destination[(current_dchannel = dchannels)] = v_destination[1]; destination[(current_dchannel += dchannels)] = v_destination[2]; destination[(current_dchannel += dchannels)] = v_destination[3]; destination[(current_dchannel += dchannels)] = v_destination[4]; destination[(current_dchannel += dchannels)] = v_destination[5]; destination[(current_dchannel += dchannels)] = v_destination[6]; destination[(current_dchannel += dchannels)] = v_destination[7]; /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #else /* unrolled function */ if(count > 8){ limit = count - (count % 8); for(; i < limit; i += 8){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel = dchannels)] + (gdouble) (source[(current_schannel = schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); destination[current_dchannel] = ((gdouble) (destination[(current_dchannel += dchannels)] + (gdouble) (source[(current_schannel += schannels)]))); /* iterate destination */ destination += (current_dchannel + dchannels); /* iterate source */ source += (current_schannel + schannels); } } #endif for(; i < count; i++){ destination[0] = ((gdouble) (destination[0] + (gdouble) (source[0]))); destination += dchannels; source += schannels; } } #endif /** * ags_audio_buffer_util_copy_s8_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s8_to_complex(AgsComplex *destination, guint dchannels, gint8 *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S8_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s16_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s16_to_complex(AgsComplex *destination, guint dchannels, gint16 *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s24_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s24_to_complex(AgsComplex *destination, guint dchannels, gint32 *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S24_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s32_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s32_to_complex(AgsComplex *destination, guint dchannels, gint32 *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S32_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_s64_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_s64_to_complex(AgsComplex *destination, guint dchannels, gint64 *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S64_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_float_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float_to_complex(AgsComplex *destination, guint dchannels, gdouble *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_FLOAT_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_double_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_double_to_complex(AgsComplex *destination, guint dchannels, gdouble *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; i = 0; for(; i < count; i++){ complex z0, z1; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(source, schannels, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } #ifdef __APPLE__ /** * ags_audio_buffer_util_copy_float32_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_float32_to_complex(AgsComplex *destination, guint dchannels, Float32 *source, guint schannels, guint count) { AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; AgsComplex c_value; gfloat *f_ptr; gfloat f_value; guint limit; guint current_dchannel, current_schannel; guint i; c_ptr = &c_value; c_ptr_ptr = &c_ptr; f_ptr = &f_value; i = 0; for(; i < count; i++){ complex z0, z1; f_value = source[0]; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_FLOAT_FRAME(f_ptr, 1, i, count, c_ptr_ptr); z0 = ags_complex_get(destination); z1 = ags_complex_get(c_ptr); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } #endif /** * ags_audio_buffer_util_copy_complex_to_complex: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_complex(AgsComplex *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ complex z0, z1; z0 = ags_complex_get(destination); z1 = ags_complex_get(source); ags_complex_set(destination, z0 + z1); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_s8: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_s8(gint8 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gint8 **ptr_ptr; gint8 *ptr; gint8 value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S8_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = 0xff & ((gint16) (destination[0] + value)); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_s16: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_s16(gint16 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gint16 **ptr_ptr; gint16 *ptr; gint16 value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = (gint16) 0xffff & ((gint32) (destination[0] + value)); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_s24: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_s24(gint32 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gint32 **ptr_ptr; gint32 *ptr; gint32 value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S24_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = 0xffffffff & ((gint32) (destination[0] + value)); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_s32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_s32(gint32 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gint32 **ptr_ptr; gint32 *ptr; gint32 value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S32_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = 0xffffffff & ((gint64) (destination[0] + value)); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_s64: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_s64(gint64 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gint64 **ptr_ptr; gint64 *ptr; gint64 value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S64_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = 0xffffffffffffffff & ((gint64) (destination[0] + value)); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_float: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_float(gfloat *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gfloat **ptr_ptr; gfloat *ptr; gfloat value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_FLOAT_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = (gfloat) ((gdouble) (destination[0] + (gdouble) (value))); destination += dchannels; source += schannels; } } /** * ags_audio_buffer_util_copy_complex_to_double: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_double(gdouble *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gdouble **ptr_ptr; gdouble *ptr; gdouble value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = ((gdouble) ((destination[0]) + (value))); destination += dchannels; source += schannels; } } #ifdef __APPLE__ /** * ags_audio_buffer_util_copy_complex_to_float32: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @source: source buffer * @schannels: source buffer's count of channels * @count: number of frames to copy * * Copy audio data using additive strategy. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_complex_to_float32(Float32 *destination, guint dchannels, AgsComplex *source, guint schannels, guint count) { gdouble **ptr_ptr; gdouble *ptr; gdouble value; guint limit; guint current_dchannel, current_schannel; guint i; i = 0; for(; i < count; i++){ ptr = &value; ptr_ptr = &ptr; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME(source, schannels, i, count, ptr_ptr); destination[0] = ((Float32) ((gdouble) (destination[0]) + (value))); destination += dchannels; source += schannels; } } #endif /** * ags_audio_buffer_util_copy_buffer_to_buffer: * @destination: destination buffer * @dchannels: destination buffer's count of channels * @doffset: start frame of destination * @source: source buffer * @schannels: source buffer's count of channels * @soffset: start frame of source * @count: number of frames to copy * @mode: specified type conversion as described * * Wrapper function to copy functions. Doing type conversion. * * Since: 3.0.0 */ void ags_audio_buffer_util_copy_buffer_to_buffer(void *destination, guint dchannels, guint doffset, void *source, guint schannels, guint soffset, guint count, guint mode) { switch(mode){ case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S8: { ags_audio_buffer_util_copy_s8_to_s8((gint8 *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S16: { ags_audio_buffer_util_copy_s8_to_s16((gint16 *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S24: { ags_audio_buffer_util_copy_s8_to_s24((gint32 *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S32: { ags_audio_buffer_util_copy_s8_to_s32((gint32 *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_S64: { ags_audio_buffer_util_copy_s8_to_s64((gint64 *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT: { ags_audio_buffer_util_copy_s8_to_float((gfloat *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_DOUBLE: { ags_audio_buffer_util_copy_s8_to_double((gdouble *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S8: { ags_audio_buffer_util_copy_s16_to_s8((gint8 *) destination + doffset, dchannels, (gint16 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S16: { ags_audio_buffer_util_copy_s16_to_s16(((gint16 *) destination) + doffset, dchannels, ((gint16 *) source) + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S24: { ags_audio_buffer_util_copy_s16_to_s24((gint32 *) destination + doffset, dchannels, (gint16 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S32: { ags_audio_buffer_util_copy_s16_to_s32((gint32 *) destination + doffset, dchannels, (gint16 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_S64: { ags_audio_buffer_util_copy_s16_to_s64((gint64 *) destination + doffset, dchannels, (gint16 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT: { ags_audio_buffer_util_copy_s16_to_float((gfloat *) destination + doffset, dchannels, (gint16 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_DOUBLE: { ags_audio_buffer_util_copy_s16_to_double((gdouble *) destination + doffset, dchannels, (gint16 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S8: { ags_audio_buffer_util_copy_s24_to_s8((gint8 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S16: { ags_audio_buffer_util_copy_s24_to_s16((gint16 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S24: { ags_audio_buffer_util_copy_s24_to_s24((gint32 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S32: { ags_audio_buffer_util_copy_s24_to_s32((gint32 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_S64: { ags_audio_buffer_util_copy_s24_to_s64((gint64 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT: { ags_audio_buffer_util_copy_s24_to_float((gfloat *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_DOUBLE: { ags_audio_buffer_util_copy_s24_to_double((gdouble *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S8: { ags_audio_buffer_util_copy_s32_to_s8((gint8 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S16: { ags_audio_buffer_util_copy_s32_to_s16((gint16 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S24: { ags_audio_buffer_util_copy_s32_to_s24((gint32 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S32: { ags_audio_buffer_util_copy_s32_to_s32((gint32 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_S64: { ags_audio_buffer_util_copy_s32_to_s64((gint64 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT: { ags_audio_buffer_util_copy_s32_to_s8((gint8 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_DOUBLE: { ags_audio_buffer_util_copy_s32_to_double((gdouble *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S8: { ags_audio_buffer_util_copy_s64_to_s8((gint8 *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S16: { ags_audio_buffer_util_copy_s64_to_s16((gint16 *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S24: { ags_audio_buffer_util_copy_s64_to_s24((gint32 *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S32: { ags_audio_buffer_util_copy_s64_to_s32((gint32 *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_S64: { ags_audio_buffer_util_copy_s64_to_s64((gint64 *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT: { ags_audio_buffer_util_copy_s64_to_float((gfloat *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_DOUBLE: { ags_audio_buffer_util_copy_s64_to_double((gdouble *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S8: { ags_audio_buffer_util_copy_float_to_s8((gint8 *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S16: { ags_audio_buffer_util_copy_float_to_s16((gint16 *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S24: { ags_audio_buffer_util_copy_float_to_s24((gint32 *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S32: { ags_audio_buffer_util_copy_float_to_s32((gint32 *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_S64: { ags_audio_buffer_util_copy_float_to_s64((gint64 *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT: { ags_audio_buffer_util_copy_float_to_float((gfloat *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_DOUBLE: { ags_audio_buffer_util_copy_float_to_double((gdouble *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S8: { ags_audio_buffer_util_copy_double_to_s8((gint8 *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S16: { ags_audio_buffer_util_copy_double_to_s16((gint16 *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S24: { ags_audio_buffer_util_copy_double_to_s24((gint32 *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S32: { ags_audio_buffer_util_copy_double_to_s32((gint32 *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_S64: { ags_audio_buffer_util_copy_double_to_s64((gint64 *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT: { ags_audio_buffer_util_copy_double_to_float((gfloat *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_DOUBLE: { ags_audio_buffer_util_copy_double_to_double((gdouble *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; #ifdef __APPLE__ case AGS_AUDIO_BUFFER_UTIL_COPY_S8_TO_FLOAT32: { ags_audio_buffer_util_copy_s8_to_float32((Float32 *) destination + doffset, dchannels, (gint8 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S16_TO_FLOAT32: { ags_audio_buffer_util_copy_s16_to_float32((Float32 *) destination + doffset, dchannels, ((gint16 *) source) + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S24_TO_FLOAT32: { ags_audio_buffer_util_copy_s24_to_float32((Float32 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S32_TO_FLOAT32: { ags_audio_buffer_util_copy_s32_to_float32((Float32 *) destination + doffset, dchannels, (gint32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_S64_TO_FLOAT32: { ags_audio_buffer_util_copy_s64_to_float32((Float32 *) destination + doffset, dchannels, (gint64 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT_TO_FLOAT32: { ags_audio_buffer_util_copy_float_to_float32((Float32 *) destination + doffset, dchannels, (gfloat *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_DOUBLE_TO_FLOAT32: { ags_audio_buffer_util_copy_double_to_float32((Float32 *) destination + doffset, dchannels, (gdouble *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT32: { ags_audio_buffer_util_copy_float32_to_float32((Float32 *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S8: { ags_audio_buffer_util_copy_float32_to_s8((gint8 *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S16: { ags_audio_buffer_util_copy_float32_to_s16((gint16 *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S24: { ags_audio_buffer_util_copy_float32_to_s24((gint32 *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S32: { ags_audio_buffer_util_copy_float32_to_s32((gint32 *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_S64: { ags_audio_buffer_util_copy_float32_to_s64((gint64 *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; case AGS_AUDIO_BUFFER_UTIL_COPY_FLOAT32_TO_FLOAT: { ags_audio_buffer_util_copy_float32_to_float((gfloat *) destination + doffset, dchannels, (Float32 *) source + soffset, schannels, count); } break; #endif default: { g_warning("ags_audio_buffer_util.c - unknown copy mode"); } } } gsequencer-3.1.3/ags/audio/ags_recall_dssi.h0000644000175000017500000000512713607210263015747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_DSSI_H__ #define __AGS_RECALL_DSSI_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_DSSI (ags_recall_dssi_get_type()) #define AGS_RECALL_DSSI(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_DSSI, AgsRecallDssi)) #define AGS_RECALL_DSSI_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_DSSI, AgsRecallDssiClass)) #define AGS_IS_RECALL_DSSI(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_DSSI)) #define AGS_IS_RECALL_DSSI_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_DSSI)) #define AGS_RECALL_DSSI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_DSSI, AgsRecallDssiClass)) typedef struct _AgsRecallDssi AgsRecallDssi; typedef struct _AgsRecallDssiClass AgsRecallDssiClass; struct _AgsRecallDssi { AgsRecallChannel recall_channel; guint bank; guint program; AgsDssiPlugin *plugin; DSSI_Descriptor *plugin_descriptor; guint *input_port; guint input_lines; guint *output_port; guint output_lines; }; struct _AgsRecallDssiClass { AgsRecallChannelClass recall_channel; }; GType ags_recall_dssi_get_type(); void ags_recall_dssi_load(AgsRecallDssi *recall_dssi); GList* ags_recall_dssi_load_ports(AgsRecallDssi *recall_dssi); void ags_recall_dssi_load_conversion(AgsRecallDssi *recall_dssi, GObject *port, gpointer plugin_port); GList* ags_recall_dssi_find(GList *recall, gchar *filename, gchar *effect); AgsRecallDssi* ags_recall_dssi_new(AgsChannel *source, gchar *filename, gchar *effect, guint effect_index); G_END_DECLS #endif /*__AGS_RECALL_DSSI_H__*/ gsequencer-3.1.3/ags/audio/ags_frequency_map_manager.h0000644000175000017500000000755113607210263020016 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FREQUENCY_MAP_MANAGER_H__ #define __AGS_FREQUENCY_MAP_MANAGER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FREQUENCY_MAP_MANAGER (ags_frequency_map_manager_get_type()) #define AGS_FREQUENCY_MAP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FREQUENCY_MAP_MANAGER, AgsFrequencyMapManager)) #define AGS_FREQUENCY_MAP_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FREQUENCY_MAP_MANAGER, AgsFrequencyMapManagerClass)) #define AGS_IS_FREQUENCY_MAP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FREQUENCY_MAP_MANAGER)) #define AGS_IS_FREQUENCY_MAP_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FREQUENCY_MAP_MANAGER)) #define AGS_FREQUENCY_MAP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FREQUENCY_MAP_MANAGER, AgsFrequencyMapManagerClass)) #define AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsFrequencyMapManager *) obj)->obj_mutex)) #define AGS_FREQUENCY_MAP_MANAGER_EQUINOX (22000) typedef struct _AgsFrequencyMapManager AgsFrequencyMapManager; typedef struct _AgsFrequencyMapManagerClass AgsFrequencyMapManagerClass; /** * AgsFrequencyMapManagerFlags: * @AGS_FREQUENCY_MAP_MANAGER_PRESERVE_FREQUENCY_MAP: if set preserve frequency maps, otherwise destroy * * Enum values to control the behavior or indicate internal state of #AgsFrequencyMapManager by * enable/disable as flags. */ typedef enum{ AGS_FREQUENCY_MAP_MANAGER_PRESERVE_FREQUENCY_MAP = 1, }AgsFrequencyMapManagerFlags; struct _AgsFrequencyMapManager { GObject gobject; guint flags; GRecMutex obj_mutex; GList *frequency_map; GList *factorized_frequency_map; }; struct _AgsFrequencyMapManagerClass { GObjectClass gobject; }; GType ags_frequency_map_manager_get_type(void); gboolean ags_frequency_map_manager_test_flags(AgsFrequencyMapManager *frequency_map_manager, guint flags); void ags_frequency_map_manager_set_flags(AgsFrequencyMapManager *frequency_map_manager, guint flags); void ags_frequency_map_manager_unset_flags(AgsFrequencyMapManager *frequency_map_manager, guint flags); void ags_frequency_map_manager_add_frequency_map(AgsFrequencyMapManager *frequency_map_manager, AgsFrequencyMap *frequency_map); void ags_frequency_map_manager_add_factorized_frequency_map(AgsFrequencyMapManager *frequency_map_manager, AgsFrequencyMap *frequency_map); AgsFrequencyMap* ags_frequency_map_manager_find_frequency_map(AgsFrequencyMapManager *frequency_map_manager, guint samplerate, guint buffer_size, gdouble freq); AgsFrequencyMap* ags_frequency_map_manager_find_factorized_frequency_map(AgsFrequencyMapManager *frequency_map_manager, guint samplerate, guint buffer_size); void ags_frequency_map_manager_load_default(AgsFrequencyMapManager *frequency_map_manager); /* */ AgsFrequencyMapManager* ags_frequency_map_manager_get_instance(); AgsFrequencyMapManager* ags_frequency_map_manager_new(); G_END_DECLS #endif /*__AGS_FREQUENCY_MAP_MANAGER_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_dependency.h0000644000175000017500000000477413607210263017132 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_DEPENDENCY_H__ #define __AGS_RECALL_DEPENDENCY_H__ #include #include #include #include #define AGS_TYPE_RECALL_DEPENDENCY (ags_recall_dependency_get_type()) #define AGS_RECALL_DEPENDENCY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_DEPENDENCY, AgsRecallDependency)) #define AGS_RECALL_DEPENDENCY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_DEPENDENCY, AgsRecallDependencyClass)) #define AGS_IS_RECALL_DEPENDENCY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_DEPENDENCY)) #define AGS_IS_RECALL_DEPENDENCY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_DEPENDENCY)) #define AGS_RECALL_DEPENDENCY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_DEPENDENCY, AgsRecallDependencyClass)) #define AGS_RECALL_DEPENDENCY_GET_OBJ_MUTEX(obj) (&(((AgsRecallDependency *) obj)->obj_mutex)) typedef struct _AgsRecallDependency AgsRecallDependency; typedef struct _AgsRecallDependencyClass AgsRecallDependencyClass; struct _AgsRecallDependency { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *dependency; }; struct _AgsRecallDependencyClass { GObjectClass gobject; }; GType ags_recall_dependency_get_type(void); GList* ags_recall_dependency_find_dependency(GList *recall_dependency, GObject *dependency); GList* ags_recall_dependency_find_dependency_by_provider(GList *recall_dependency, GObject *provider); GObject* ags_recall_dependency_resolve(AgsRecallDependency *recall_dependency, AgsRecallID *recall_id); AgsRecallDependency* ags_recall_dependency_new(GObject *dependency); G_END_DECLS #endif /*__AGS_RECALL_DEPENDENCY_H__*/ gsequencer-3.1.3/ags/audio/ags_fifoout.c0000644000175000017500000013554413607210263015140 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #ifndef AGS_W32API #include #include #endif #include #include #include #include #include #include #include #include #include void ags_fifoout_class_init(AgsFifooutClass *fifoout); void ags_fifoout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_fifoout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_fifoout_init(AgsFifoout *fifoout); void ags_fifoout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_fifoout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_fifoout_dispose(GObject *gobject); void ags_fifoout_finalize(GObject *gobject); AgsUUID* ags_fifoout_get_uuid(AgsConnectable *connectable); gboolean ags_fifoout_has_resource(AgsConnectable *connectable); gboolean ags_fifoout_is_ready(AgsConnectable *connectable); void ags_fifoout_add_to_registry(AgsConnectable *connectable); void ags_fifoout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_fifoout_list_resource(AgsConnectable *connectable); xmlNode* ags_fifoout_xml_compose(AgsConnectable *connectable); void ags_fifoout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_fifoout_is_connected(AgsConnectable *connectable); void ags_fifoout_connect(AgsConnectable *connectable); void ags_fifoout_disconnect(AgsConnectable *connectable); void ags_fifoout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_fifoout_get_device(AgsSoundcard *soundcard); void ags_fifoout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_fifoout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_fifoout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_fifoout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); gboolean ags_fifoout_is_available(AgsSoundcard *soundcard); gboolean ags_fifoout_is_starting(AgsSoundcard *soundcard); gboolean ags_fifoout_is_playing(AgsSoundcard *soundcard); gchar* ags_fifoout_get_uptime(AgsSoundcard *soundcard); void ags_fifoout_fifo_init(AgsSoundcard *soundcard, GError **error); void ags_fifoout_fifo_play(AgsSoundcard *soundcard, GError **error); void ags_fifoout_fifo_free(AgsSoundcard *soundcard); void ags_fifoout_tic(AgsSoundcard *soundcard); void ags_fifoout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_fifoout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_fifoout_get_bpm(AgsSoundcard *soundcard); void ags_fifoout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_fifoout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_fifoout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_fifoout_get_delay(AgsSoundcard *soundcard); guint ags_fifoout_get_attack(AgsSoundcard *soundcard); void* ags_fifoout_get_buffer(AgsSoundcard *soundcard); void* ags_fifoout_get_next_buffer(AgsSoundcard *soundcard); guint ags_fifoout_get_delay_counter(AgsSoundcard *soundcard); void ags_fifoout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_fifoout_get_note_offset(AgsSoundcard *soundcard); void ags_fifoout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_fifoout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_fifoout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_fifoout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_fifoout_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_fifoout * @short_description: Output to pipe * @title: AgsFifoout * @section_id: * @include: ags/audio/ags_fifoout.h * * #AgsFifoout represents a pipe and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, }; static gpointer ags_fifoout_parent_class = NULL; GType ags_fifoout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_fifoout = 0; static const GTypeInfo ags_fifoout_info = { sizeof(AgsFifooutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_fifoout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFifoout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_fifoout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_fifoout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_fifoout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_fifoout = g_type_register_static(G_TYPE_OBJECT, "AgsFifoout", &ags_fifoout_info, 0); g_type_add_interface_static(ags_type_fifoout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_fifoout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_fifoout); } return g_define_type_id__volatile; } void ags_fifoout_class_init(AgsFifooutClass *fifoout) { GObjectClass *gobject; GParamSpec *param_spec; ags_fifoout_parent_class = g_type_class_peek_parent(fifoout); /* GObjectClass */ gobject = (GObjectClass *) fifoout; gobject->set_property = ags_fifoout_set_property; gobject->get_property = ags_fifoout_get_property; gobject->dispose = ags_fifoout_dispose; gobject->finalize = ags_fifoout_finalize; /* properties */ /** * AgsFifoout:device: * * The fifo soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), AGS_FIFOOUT_DEFAULT_DEVICE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsFifoout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), AGS_SOUNDCARD_MIN_DSP_CHANNELS, AGS_SOUNDCARD_MAX_DSP_CHANNELS, AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsFifoout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), AGS_SOUNDCARD_MIN_PCM_CHANNELS, AGS_SOUNDCARD_MAX_PCM_CHANNELS, AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsFifoout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsFifoout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), AGS_SOUNDCARD_MIN_BUFFER_SIZE, AGS_SOUNDCARD_MAX_BUFFER_SIZE, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsFifoout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), AGS_SOUNDCARD_MIN_SAMPLERATE, AGS_SOUNDCARD_MAX_SAMPLERATE, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsFifoout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsFifoout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, AGS_SOUNDCARD_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsFifoout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsFifoout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /* AgsFifooutClass */ } GQuark ags_fifoout_error_quark() { return(g_quark_from_static_string("ags-fifoout-error-quark")); } void ags_fifoout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_fifoout_get_uuid; connectable->has_resource = ags_fifoout_has_resource; connectable->is_ready = ags_fifoout_is_ready; connectable->add_to_registry = ags_fifoout_add_to_registry; connectable->remove_from_registry = ags_fifoout_remove_from_registry; connectable->list_resource = ags_fifoout_list_resource; connectable->xml_compose = ags_fifoout_xml_compose; connectable->xml_parse = ags_fifoout_xml_parse; connectable->is_connected = ags_fifoout_is_connected; connectable->connect = ags_fifoout_connect; connectable->disconnect = ags_fifoout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_fifoout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_fifoout_set_device; soundcard->get_device = ags_fifoout_get_device; soundcard->set_presets = ags_fifoout_set_presets; soundcard->get_presets = ags_fifoout_get_presets; soundcard->list_cards = ags_fifoout_list_cards; soundcard->pcm_info = ags_fifoout_pcm_info; soundcard->get_capability = NULL; soundcard->is_available = ags_fifoout_is_available; soundcard->is_starting = ags_fifoout_is_starting; soundcard->is_playing = ags_fifoout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_fifoout_get_uptime; soundcard->play_init = ags_fifoout_fifo_init; soundcard->play = ags_fifoout_fifo_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_fifoout_fifo_free; soundcard->tic = ags_fifoout_tic; soundcard->offset_changed = ags_fifoout_offset_changed; soundcard->set_bpm = ags_fifoout_set_bpm; soundcard->get_bpm = ags_fifoout_get_bpm; soundcard->set_delay_factor = ags_fifoout_set_delay_factor; soundcard->get_delay_factor = ags_fifoout_get_delay_factor; soundcard->get_absolute_delay = ags_fifoout_get_absolute_delay; soundcard->get_delay = ags_fifoout_get_delay; soundcard->get_attack = ags_fifoout_get_attack; soundcard->get_buffer = ags_fifoout_get_buffer; soundcard->get_next_buffer = ags_fifoout_get_next_buffer; soundcard->get_delay_counter = ags_fifoout_get_delay_counter; soundcard->set_note_offset = ags_fifoout_set_note_offset; soundcard->get_note_offset = ags_fifoout_get_note_offset; soundcard->set_note_offset_absolute = ags_fifoout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_fifoout_get_note_offset_absolute; soundcard->set_loop = ags_fifoout_set_loop; soundcard->get_loop = ags_fifoout_get_loop; soundcard->get_loop_offset = ags_fifoout_get_loop_offset; } void ags_fifoout_init(AgsFifoout *fifoout) { AgsConfig *config; gchar *str; gchar *segmentation; guint denumerator, numerator; fifoout->flags = 0; /* insert fifoout mutex */ g_rec_mutex_init(&(fifoout->obj_mutex)); /* uuid */ fifoout->uuid = ags_uuid_alloc(); ags_uuid_generate(fifoout->uuid); /* flags */ config = ags_config_get_instance(); /* presets */ fifoout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); fifoout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); fifoout->samplerate = ags_soundcard_helper_config_get_samplerate(config); fifoout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); fifoout->format = ags_soundcard_helper_config_get_format(config); /* */ fifoout->device = AGS_FIFOOUT_DEFAULT_DEVICE; fifoout->fifo_fd = -1; /* buffer */ fifoout->buffer = (void **) malloc(4 * sizeof(void*)); fifoout->buffer[0] = NULL; fifoout->buffer[1] = NULL; fifoout->buffer[2] = NULL; fifoout->buffer[3] = NULL; g_atomic_int_set(&(fifoout->available), FALSE); fifoout->ring_buffer_size = AGS_FIFOOUT_DEFAULT_RING_BUFFER_SIZE; fifoout->nth_ring_buffer = 0; fifoout->ring_buffer = NULL; ags_fifoout_realloc_buffer(fifoout); /* bpm */ fifoout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ fifoout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denumerator, &numerator); fifoout->delay_factor = 1.0 / numerator * (numerator / denumerator); g_free(segmentation); } /* delay and attack */ fifoout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); fifoout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_fifoout_adjust_delay_and_attack(fifoout); /* counters */ fifoout->tact_counter = 0.0; fifoout->delay_counter = 0; fifoout->tic_counter = 0; fifoout->note_offset = 0; fifoout->note_offset_absolute = 0; fifoout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; fifoout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; fifoout->do_loop = FALSE; fifoout->loop_offset = 0; } void ags_fifoout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(gobject); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(fifoout_mutex); fifoout->device = g_strdup(device); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(fifoout_mutex); if(dsp_channels == fifoout->dsp_channels){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->dsp_channels = dsp_channels; g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(fifoout_mutex); if(pcm_channels == fifoout->pcm_channels){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->pcm_channels = pcm_channels; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_realloc_buffer(fifoout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(fifoout_mutex); if(format == fifoout->format){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->format = format; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_realloc_buffer(fifoout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(fifoout_mutex); if(buffer_size == fifoout->buffer_size){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->buffer_size = buffer_size; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_realloc_buffer(fifoout); ags_fifoout_adjust_delay_and_attack(fifoout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(fifoout_mutex); if(samplerate == fifoout->samplerate){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->samplerate = samplerate; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_adjust_delay_and_attack(fifoout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(fifoout_mutex); if(bpm == fifoout->bpm){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->bpm = bpm; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_adjust_delay_and_attack(fifoout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(fifoout_mutex); if(delay_factor == fifoout->delay_factor){ g_rec_mutex_unlock(fifoout_mutex); return; } fifoout->delay_factor = delay_factor; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_adjust_delay_and_attack(fifoout); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_fifoout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(gobject); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(fifoout_mutex); g_value_set_string(value, fifoout->device); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(fifoout_mutex); g_value_set_uint(value, fifoout->dsp_channels); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(fifoout_mutex); g_value_set_uint(value, fifoout->pcm_channels); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(fifoout_mutex); g_value_set_uint(value, fifoout->format); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(fifoout_mutex); g_value_set_uint(value, fifoout->buffer_size); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(fifoout_mutex); g_value_set_uint(value, fifoout->samplerate); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(fifoout_mutex); g_value_set_pointer(value, fifoout->buffer); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(fifoout_mutex); g_value_set_double(value, fifoout->bpm); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(fifoout_mutex); g_value_set_double(value, fifoout->delay_factor); g_rec_mutex_unlock(fifoout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(fifoout_mutex); g_value_set_pointer(value, fifoout->attack); g_rec_mutex_unlock(fifoout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_fifoout_dispose(GObject *gobject) { AgsFifoout *fifoout; fifoout = AGS_FIFOOUT(gobject); /* call parent */ G_OBJECT_CLASS(ags_fifoout_parent_class)->dispose(gobject); } void ags_fifoout_finalize(GObject *gobject) { AgsFifoout *fifoout; fifoout = AGS_FIFOOUT(gobject); /* free output buffer */ free(fifoout->buffer[0]); free(fifoout->buffer[1]); free(fifoout->buffer[2]); free(fifoout->buffer[3]); /* free buffer array */ free(fifoout->buffer); /* free AgsAttack */ free(fifoout->attack); /* call parent */ G_OBJECT_CLASS(ags_fifoout_parent_class)->finalize(gobject); } AgsUUID* ags_fifoout_get_uuid(AgsConnectable *connectable) { AgsFifoout *fifoout; AgsUUID *ptr; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(connectable); /* get fifoout signal mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get UUID */ g_rec_mutex_lock(fifoout_mutex); ptr = fifoout->uuid; g_rec_mutex_unlock(fifoout_mutex); return(ptr); } gboolean ags_fifoout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_fifoout_is_ready(AgsConnectable *connectable) { AgsFifoout *fifoout; gboolean is_ready; fifoout = AGS_FIFOOUT(connectable); /* check is added */ is_ready = ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_fifoout_add_to_registry(AgsConnectable *connectable) { AgsFifoout *fifoout; if(ags_connectable_is_ready(connectable)){ return; } fifoout = AGS_FIFOOUT(connectable); ags_fifoout_set_flags(fifoout, AGS_FIFOOUT_ADDED_TO_REGISTRY); } void ags_fifoout_remove_from_registry(AgsConnectable *connectable) { AgsFifoout *fifoout; if(!ags_connectable_is_ready(connectable)){ return; } fifoout = AGS_FIFOOUT(connectable); ags_fifoout_unset_flags(fifoout, AGS_FIFOOUT_ADDED_TO_REGISTRY); } xmlNode* ags_fifoout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_fifoout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_fifoout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_fifoout_is_connected(AgsConnectable *connectable) { AgsFifoout *fifoout; gboolean is_connected; fifoout = AGS_FIFOOUT(connectable); /* check is connected */ is_connected = ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_CONNECTED); return(is_connected); } void ags_fifoout_connect(AgsConnectable *connectable) { AgsFifoout *fifoout; if(ags_connectable_is_connected(connectable)){ return; } fifoout = AGS_FIFOOUT(connectable); ags_fifoout_set_flags(fifoout, AGS_FIFOOUT_CONNECTED); } void ags_fifoout_disconnect(AgsConnectable *connectable) { AgsFifoout *fifoout; if(!ags_connectable_is_connected(connectable)){ return; } fifoout = AGS_FIFOOUT(connectable); ags_fifoout_unset_flags(fifoout, AGS_FIFOOUT_CONNECTED); } /** * ags_fifoout_test_flags: * @fifoout: the #AgsFifoout * @flags: the flags * * Test @flags to be set on @fifoout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_fifoout_test_flags(AgsFifoout *fifoout, guint flags) { gboolean retval; GRecMutex *fifoout_mutex; if(!AGS_IS_FIFOOUT(fifoout)){ return(FALSE); } /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* test */ g_rec_mutex_lock(fifoout_mutex); retval = (flags & (fifoout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(fifoout_mutex); return(retval); } /** * ags_fifoout_set_flags: * @fifoout: the #AgsFifoout * @flags: see #AgsFifooutFlags-enum * * Enable a feature of @fifoout. * * Since: 3.0.0 */ void ags_fifoout_set_flags(AgsFifoout *fifoout, guint flags) { GRecMutex *fifoout_mutex; if(!AGS_IS_FIFOOUT(fifoout)){ return; } /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(fifoout_mutex); fifoout->flags |= flags; g_rec_mutex_unlock(fifoout_mutex); } /** * ags_fifoout_unset_flags: * @fifoout: the #AgsFifoout * @flags: see #AgsFifooutFlags-enum * * Disable a feature of @fifoout. * * Since: 3.0.0 */ void ags_fifoout_unset_flags(AgsFifoout *fifoout, guint flags) { GRecMutex *fifoout_mutex; if(!AGS_IS_FIFOOUT(fifoout)){ return; } /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(fifoout_mutex); fifoout->flags &= (~flags); g_rec_mutex_unlock(fifoout_mutex); } void ags_fifoout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set device */ g_rec_mutex_lock(fifoout_mutex); fifoout->device = g_strdup(device); g_rec_mutex_unlock(fifoout_mutex); } gchar* ags_fifoout_get_device(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gchar *device; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get device */ g_rec_mutex_lock(fifoout_mutex); device = fifoout->device; g_rec_mutex_unlock(fifoout_mutex); return(device); } void ags_fifoout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsFifoout *fifoout; fifoout = AGS_FIFOOUT(soundcard); g_object_set(fifoout, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_fifoout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get presets */ g_rec_mutex_lock(fifoout_mutex); if(channels != NULL){ *channels = fifoout->pcm_channels; } if(rate != NULL){ *rate = fifoout->samplerate; } if(buffer_size != NULL){ *buffer_size = fifoout->buffer_size; } if(format != NULL){ *format = fifoout->format; } g_rec_mutex_unlock(fifoout_mutex); } void ags_fifoout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsFifoout *fifoout; fifoout = AGS_FIFOOUT(soundcard); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } //TODO:JK: implement me if(card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_fifoout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { AgsFifoout *fifoout; fifoout = AGS_FIFOOUT(soundcard); //TODO:JK: implement me } gboolean ags_fifoout_is_available(AgsSoundcard *soundcard) { AgsFifoout *fifoout; //TODO:JK: implement me return(TRUE); } gboolean ags_fifoout_is_starting(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gboolean is_starting; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* check is starting */ g_rec_mutex_lock(fifoout_mutex); is_starting = ((AGS_FIFOOUT_START_PLAY & (fifoout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(fifoout_mutex); return(is_starting); } gboolean ags_fifoout_is_playing(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gboolean is_playing; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* check is starting */ g_rec_mutex_lock(fifoout_mutex); is_playing = ((AGS_FIFOOUT_PLAY & (fifoout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(fifoout_mutex); return(is_playing); } gchar* ags_fifoout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ((gdouble) samplerate / (gdouble) buffer_size) * (gdouble)(60.0 / bpm) * delay_factor; uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_fifoout_fifo_init(AgsSoundcard *soundcard, GError **error) { //TODO:JK: implement me } void ags_fifoout_fifo_play(AgsSoundcard *soundcard, GError **error) { //TODO:JK: implement me } void ags_fifoout_fifo_free(AgsSoundcard *soundcard) { //TODO:JK: implement me } void ags_fifoout_tic(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* determine if attack should be switched */ g_rec_mutex_lock(fifoout_mutex); delay = fifoout->delay[fifoout->tic_counter]; delay_counter = fifoout->delay_counter; note_offset = fifoout->note_offset; note_offset_absolute = fifoout->note_offset_absolute; loop_left = fifoout->loop_left; loop_right = fifoout->loop_right; do_loop = fifoout->do_loop; g_rec_mutex_unlock(fifoout_mutex); if((guint) delay_counter + 1 >= (guint) delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(fifoout_mutex); fifoout->delay_counter = 0.0; fifoout->tact_counter += 1.0; g_rec_mutex_unlock(fifoout_mutex); }else{ g_rec_mutex_lock(fifoout_mutex); fifoout->delay_counter += 1.0; g_rec_mutex_unlock(fifoout_mutex); } } void ags_fifoout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* offset changed */ g_rec_mutex_lock(fifoout_mutex); fifoout->tic_counter += 1; if(fifoout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ fifoout->tic_counter = 0; } g_rec_mutex_unlock(fifoout_mutex); } void ags_fifoout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set bpm */ g_rec_mutex_lock(fifoout_mutex); fifoout->bpm = bpm; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_adjust_delay_and_attack(fifoout); } gdouble ags_fifoout_get_bpm(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gdouble bpm; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get bpm */ g_rec_mutex_lock(fifoout_mutex); bpm = fifoout->bpm; g_rec_mutex_unlock(fifoout_mutex); return(bpm); } void ags_fifoout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set delay factor */ g_rec_mutex_lock(fifoout_mutex); fifoout->delay_factor = delay_factor; g_rec_mutex_unlock(fifoout_mutex); ags_fifoout_adjust_delay_and_attack(fifoout); } gdouble ags_fifoout_get_delay_factor(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gdouble delay_factor; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get delay factor */ g_rec_mutex_lock(fifoout_mutex); delay_factor = fifoout->delay_factor; g_rec_mutex_unlock(fifoout_mutex); return(delay_factor); } gdouble ags_fifoout_get_delay(AgsSoundcard *soundcard) { AgsFifoout *fifoout; guint index; gdouble delay; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get delay */ g_rec_mutex_lock(fifoout_mutex); index = fifoout->tic_counter; delay = fifoout->delay[index]; g_rec_mutex_unlock(fifoout_mutex); return(delay); } gdouble ags_fifoout_get_absolute_delay(AgsSoundcard *soundcard) { AgsFifoout *fifoout; gdouble absolute_delay; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get absolute delay */ g_rec_mutex_lock(fifoout_mutex); absolute_delay = (60.0 * (((gdouble) fifoout->samplerate / (gdouble) fifoout->buffer_size) / (gdouble) fifoout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) fifoout->delay_factor))); g_rec_mutex_unlock(fifoout_mutex); return(absolute_delay); } guint ags_fifoout_get_attack(AgsSoundcard *soundcard) { AgsFifoout *fifoout; guint index; guint attack; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get attack */ g_rec_mutex_lock(fifoout_mutex); index = fifoout->tic_counter; attack = fifoout->attack[index]; g_rec_mutex_unlock(fifoout_mutex); return(attack); } void* ags_fifoout_get_buffer(AgsSoundcard *soundcard) { AgsFifoout *fifoout; void *buffer; fifoout = AGS_FIFOOUT(soundcard); if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER0)){ buffer = fifoout->buffer[0]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER1)){ buffer = fifoout->buffer[1]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER2)){ buffer = fifoout->buffer[2]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER3)){ buffer = fifoout->buffer[3]; }else{ buffer = NULL; } return(buffer); } void* ags_fifoout_get_next_buffer(AgsSoundcard *soundcard) { AgsFifoout *fifoout; void *buffer; fifoout = AGS_FIFOOUT(soundcard); // g_message("next - 0x%0x", ((AGS_FIFOOUT_BUFFER0 | // AGS_FIFOOUT_BUFFER1 | // AGS_FIFOOUT_BUFFER2 | // AGS_FIFOOUT_BUFFER3) & (fifoout->flags))); if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER0)){ buffer = fifoout->buffer[1]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER1)){ buffer = fifoout->buffer[2]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER2)){ buffer = fifoout->buffer[3]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER3)){ buffer = fifoout->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_fifoout_get_prev_buffer(AgsSoundcard *soundcard) { AgsFifoout *fifoout; void *buffer; fifoout = AGS_FIFOOUT(soundcard); if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER0)){ buffer = fifoout->buffer[3]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER1)){ buffer = fifoout->buffer[0]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER2)){ buffer = fifoout->buffer[1]; }else if(ags_fifoout_test_flags(fifoout, AGS_FIFOOUT_BUFFER3)){ buffer = fifoout->buffer[2]; }else{ buffer = NULL; } return(buffer); } guint ags_fifoout_get_delay_counter(AgsSoundcard *soundcard) { AgsFifoout *fifoout; guint delay_counter; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* delay counter */ g_rec_mutex_lock(fifoout_mutex); delay_counter = fifoout->delay_counter; g_rec_mutex_unlock(fifoout_mutex); return(delay_counter); } void ags_fifoout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set note offset */ g_rec_mutex_lock(fifoout_mutex); fifoout->note_offset = note_offset; g_rec_mutex_unlock(fifoout_mutex); } guint ags_fifoout_get_note_offset(AgsSoundcard *soundcard) { AgsFifoout *fifoout; guint note_offset; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set note offset */ g_rec_mutex_lock(fifoout_mutex); note_offset = fifoout->note_offset; g_rec_mutex_unlock(fifoout_mutex); return(note_offset); } void ags_fifoout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set note offset */ g_rec_mutex_lock(fifoout_mutex); fifoout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(fifoout_mutex); } guint ags_fifoout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsFifoout *fifoout; guint note_offset_absolute; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set note offset */ g_rec_mutex_lock(fifoout_mutex); note_offset_absolute = fifoout->note_offset_absolute; g_rec_mutex_unlock(fifoout_mutex); return(note_offset_absolute); } void ags_fifoout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* set loop */ g_rec_mutex_lock(fifoout_mutex); fifoout->loop_left = loop_left; fifoout->loop_right = loop_right; fifoout->do_loop = do_loop; if(do_loop){ fifoout->loop_offset = fifoout->note_offset; } g_rec_mutex_unlock(fifoout_mutex); } void ags_fifoout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsFifoout *fifoout; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get loop */ g_rec_mutex_lock(fifoout_mutex); if(loop_left != NULL){ *loop_left = fifoout->loop_left; } if(loop_right != NULL){ *loop_right = fifoout->loop_right; } if(do_loop != NULL){ *do_loop = fifoout->do_loop; } g_rec_mutex_unlock(fifoout_mutex); } guint ags_fifoout_get_loop_offset(AgsSoundcard *soundcard) { AgsFifoout *fifoout; guint loop_offset; GRecMutex *fifoout_mutex; fifoout = AGS_FIFOOUT(soundcard); /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get loop offset */ g_rec_mutex_lock(fifoout_mutex); loop_offset = fifoout->loop_offset; g_rec_mutex_unlock(fifoout_mutex); return(loop_offset); } /** * ags_fifoout_switch_buffer_flag: * @fifoout: the #AgsFifoout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_fifoout_switch_buffer_flag(AgsFifoout *fifoout) { GRecMutex *fifoout_mutex; if(!AGS_IS_FIFOOUT(fifoout)){ return; } /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* switch buffer flag */ g_rec_mutex_lock(fifoout_mutex); if((AGS_FIFOOUT_BUFFER0 & (fifoout->flags)) != 0){ fifoout->flags &= (~AGS_FIFOOUT_BUFFER0); fifoout->flags |= AGS_FIFOOUT_BUFFER1; }else if((AGS_FIFOOUT_BUFFER1 & (fifoout->flags)) != 0){ fifoout->flags &= (~AGS_FIFOOUT_BUFFER1); fifoout->flags |= AGS_FIFOOUT_BUFFER2; }else if((AGS_FIFOOUT_BUFFER2 & (fifoout->flags)) != 0){ fifoout->flags &= (~AGS_FIFOOUT_BUFFER2); fifoout->flags |= AGS_FIFOOUT_BUFFER3; }else if((AGS_FIFOOUT_BUFFER3 & (fifoout->flags)) != 0){ fifoout->flags &= (~AGS_FIFOOUT_BUFFER3); fifoout->flags |= AGS_FIFOOUT_BUFFER0; } g_rec_mutex_unlock(fifoout_mutex); } /** * ags_fifoout_adjust_delay_and_attack: * @fifoout: the #AgsFifoout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_fifoout_adjust_delay_and_attack(AgsFifoout *fifoout) { gdouble delay; guint default_tact_frames; guint default_period; guint i; GRecMutex *fifoout_mutex; if(!AGS_IS_FIFOOUT(fifoout)){ return; } /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get some initial values */ delay = (60.0 * (((gdouble) fifoout->samplerate / (gdouble) fifoout->buffer_size) / (gdouble) fifoout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) fifoout->delay_factor))); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(fifoout_mutex); default_tact_frames = (guint) (delay * fifoout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); fifoout->attack[0] = 0; fifoout->delay[0] = delay; for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ fifoout->attack[i] = (guint) ((i * default_tact_frames + fifoout->attack[i - 1]) / (AGS_SOUNDCARD_DEFAULT_PERIOD / (delay * i))) % (guint) (fifoout->buffer_size); #ifdef AGS_DEBUG g_message("%d", fifoout->attack[i]); #endif } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ fifoout->delay[i] = ((gdouble) (default_tact_frames + fifoout->attack[i])) / (gdouble) fifoout->buffer_size; #ifdef AGS_DEBUG g_message("%f", fifoout->delay[i]); #endif } g_rec_mutex_unlock(fifoout_mutex); } /** * ags_fifoout_realloc_buffer: * @fifoout: the #AgsFifoout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_fifoout_realloc_buffer(AgsFifoout *fifoout) { guint pcm_channels; guint buffer_size; guint word_size; GRecMutex *fifoout_mutex; if(!AGS_IS_FIFOOUT(fifoout)){ return; } /* get fifoout mutex */ fifoout_mutex = AGS_FIFOOUT_GET_OBJ_MUTEX(fifoout); /* get word size */ g_rec_mutex_lock(fifoout_mutex); pcm_channels = fifoout->pcm_channels; buffer_size = fifoout->buffer_size; switch(fifoout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_warning("ags_fifoout_realloc_buffer(): unsupported word size"); return; } g_rec_mutex_unlock(fifoout_mutex); //NOTE:JK: there is no lock applicable to buffer /* AGS_FIFOOUT_BUFFER_0 */ if(fifoout->buffer[0] != NULL){ free(fifoout->buffer[0]); } fifoout->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_FIFOOUT_BUFFER_1 */ if(fifoout->buffer[1] != NULL){ free(fifoout->buffer[1]); } fifoout->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_FIFOOUT_BUFFER_2 */ if(fifoout->buffer[2] != NULL){ free(fifoout->buffer[2]); } fifoout->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_FIFOOUT_BUFFER_3 */ if(fifoout->buffer[3] != NULL){ free(fifoout->buffer[3]); } fifoout->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_fifoout_new: * * Creates a new instance of #AgsFifoout. * * Returns: the new #AgsFifoout * * Since: 3.0.0 */ AgsFifoout* ags_fifoout_new() { AgsFifoout *fifoout; fifoout = (AgsFifoout *) g_object_new(AGS_TYPE_FIFOOUT, NULL); return(fifoout); } gsequencer-3.1.3/ags/audio/ags_automation.h0000644000175000017500000002144313616617253015654 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTOMATION_H__ #define __AGS_AUTOMATION_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTOMATION (ags_automation_get_type()) #define AGS_AUTOMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTOMATION, AgsAutomation)) #define AGS_AUTOMATION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTOMATION, AgsAutomationClass)) #define AGS_IS_AUTOMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTOMATION)) #define AGS_IS_AUTOMATION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTOMATION)) #define AGS_AUTOMATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_AUTOMATION, AgsAutomationClass)) #define AGS_AUTOMATION_GET_OBJ_MUTEX(obj) (&(((AgsAutomation *) obj)->obj_mutex)) #define AGS_AUTOMATION_DEFAULT_BPM (120.0) #define AGS_AUTOMATION_TICS_PER_BEAT (1.0) #define AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH (1.0 / 16.0 / 64.0) #define AGS_AUTOMATION_MAXIMUM_ACCELERATION_LENGTH (16.0) #define AGS_AUTOMATION_DEFAULT_LENGTH (64 * 16 * 1200 / AGS_AUTOMATION_TICS_PER_BEAT) #define AGS_AUTOMATION_DEFAULT_JIFFIE (60.0 / AGS_AUTOMATION_DEFAULT_BPM / AGS_AUTOMATION_TICS_PER_BEAT) #define AGS_AUTOMATION_DEFAULT_DURATION (AGS_AUTOMATION_DEFAULT_LENGTH * AGS_AUTOMATION_DEFAULT_JIFFIE * AGS_USEC_PER_SEC) #define AGS_AUTOMATION_DEFAULT_OFFSET (64 * (1 / AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH)) #define AGS_AUTOMATION_DEFAULT_PRECISION (8) #define AGS_AUTOMATION_MAXIMUM_STEPS (128) #define AGS_AUTOMATION_CLIPBOARD_VERSION "1.3.0" #define AGS_AUTOMATION_CLIPBOARD_TYPE "AgsAutomationClipboardXml" #define AGS_AUTOMATION_CLIPBOARD_FORMAT "AgsAutomationNativeScale" #define AGS_AUTOMATION_CLIPBOARD_LEGACY_FORMAT "AgsAutomationNativePiano" typedef struct _AgsAutomation AgsAutomation; typedef struct _AgsAutomationClass AgsAutomationClass; /** * AgsAutomationFlags: * @AGS_AUTOMATION_BYPASS: ignore any automation data * * Enum values to control the behavior or indicate internal state of #AgsAutomation by * enable/disable as flags. */ typedef enum{ AGS_AUTOMATION_BYPASS = 1, }AgsAutomationFlags; struct _AgsAutomation { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio; GType channel_type; guint line; AgsTimestamp *timestamp; gchar *control_name; guint steps; gdouble upper; gdouble lower; gdouble default_value; AgsFunction *source_function; GObject *port; GList *acceleration; GList *selection; }; struct _AgsAutomationClass { GObjectClass gobject; }; GType ags_automation_get_type(void); GRecMutex* ags_automation_get_obj_mutex(AgsAutomation *automation); gboolean ags_automation_test_flags(AgsAutomation *automation, guint flags); void ags_automation_set_flags(AgsAutomation *automation, guint flags); void ags_automation_unset_flags(AgsAutomation *automation, guint flags); GList* ags_automation_find_port(GList *automation, GObject *port); GList* ags_automation_find_near_timestamp(GList *automation, guint line, AgsTimestamp *timestamp); GList* ags_automation_find_near_timestamp_extended(GList *automation, guint line, GType channel_type, gchar *control_name, AgsTimestamp *timestamp); gint ags_automation_sort_func(gconstpointer a, gconstpointer b); GList* ags_automation_add(GList *automation, AgsAutomation *new_automation); GObject* ags_automation_get_audio(AgsAutomation *automation); void ags_automation_set_audio(AgsAutomation *automation, GObject *audio); GType ags_automation_get_channel_type(AgsAutomation *automation); void ags_automation_set_channel_type(AgsAutomation *automation, GType channel_type); guint ags_automation_get_line(AgsAutomation *automation); void ags_automation_set_line(AgsAutomation *automation, guint line); AgsTimestamp* ags_automation_get_timestamp(AgsAutomation *automation); void ags_automation_set_timestamp(AgsAutomation *automation, AgsTimestamp *timestamp); gchar* ags_automation_get_control_name(AgsAutomation *automation); void ags_automation_set_control_name(AgsAutomation *automation, gchar *control_name); guint ags_automation_get_steps(AgsAutomation *automation); void ags_automation_set_steps(AgsAutomation *automation, guint steps); gdouble ags_automation_get_upper(AgsAutomation *automation); void ags_automation_set_upper(AgsAutomation *automation, gdouble upper); gdouble ags_automation_get_lower(AgsAutomation *automation); void ags_automation_set_lower(AgsAutomation *automation, gdouble lower); gdouble ags_automation_get_default_value(AgsAutomation *automation); void ags_automation_set_default_value(AgsAutomation *automation, gdouble default_value); GObject* ags_automation_get_port(AgsAutomation *automation); void ags_automation_set_port(AgsAutomation *automation, GObject *port); GList* ags_automation_get_acceleration(AgsAutomation *automation); void ags_automation_set_acceleration(AgsAutomation *automation, GList *acceleration); void ags_automation_add_acceleration(AgsAutomation *automation, AgsAcceleration *acceleration, gboolean use_selection_list); void ags_automation_remove_acceleration(AgsAutomation *automation, AgsAcceleration *acceleration, gboolean use_selection_list); gboolean ags_automation_remove_acceleration_at_position(AgsAutomation *automation, guint x, gdouble y); GList* ags_automation_get_selection(AgsAutomation *automation); gboolean ags_automation_is_acceleration_selected(AgsAutomation *automation, AgsAcceleration *acceleration); AgsAcceleration* ags_automation_find_point(AgsAutomation *automation, guint x, gdouble y, gboolean use_selection_list); GList* ags_automation_find_region(AgsAutomation *automation, guint x0, gdouble y0, guint x1, gdouble y1, gboolean use_selection_list); void ags_automation_free_selection(AgsAutomation *automation); void ags_automation_add_point_to_selection(AgsAutomation *automation, guint x, gdouble y, gboolean replace_current_selection); void ags_automation_remove_point_from_selection(AgsAutomation *automation, guint x, gdouble y); void ags_automation_add_region_to_selection(AgsAutomation *automation, guint x0, gdouble y0, guint x1, gdouble y1, gboolean replace_current_selection); void ags_automation_remove_region_from_selection(AgsAutomation *automation, guint x0, gdouble y0, guint x1, gdouble y1); void ags_automation_add_all_to_selection(AgsAutomation *automation); xmlNode* ags_automation_copy_selection(AgsAutomation *automation); xmlNode* ags_automation_cut_selection(AgsAutomation *automation); void ags_automation_insert_from_clipboard(AgsAutomation *automation, xmlNode *automation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, gdouble y_offset); void ags_automation_insert_from_clipboard_extended(AgsAutomation *automation, xmlNode *automation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, gdouble y_offset, gboolean match_line, gboolean no_duplicates); gchar** ags_automation_get_specifier_unique(GList *automation); gchar** ags_automation_get_specifier_unique_with_channel_type(GList *automation, GType channel_type); GList* ags_automation_find_specifier(GList *automation, gchar *specifier); GList* ags_automation_find_channel_type_with_control_name(GList *automation, GType channel_type, gchar *specifier); GList* ags_automation_find_specifier_with_type_and_line(GList *automation, gchar *specifier, GType channel_type, guint line); guint ags_automation_get_value(AgsAutomation *automation, guint x, guint x_end, gboolean use_prev_on_failure, GValue *value); AgsAutomation* ags_automation_new(GObject *audio, guint line, GType channel_type, gchar *control_name); G_END_DECLS #endif /*__AGS_AUTOMATION_H__*/ gsequencer-3.1.3/ags/audio/jack/0000755000175000017500000000000013622252254013446 500000000000000gsequencer-3.1.3/ags/audio/jack/ags_jack_client.c0000644000175000017500000012763513613101164016641 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_JACK #include #include #include #endif #include void ags_jack_client_class_init(AgsJackClientClass *jack_client); void ags_jack_client_connectable_interface_init(AgsConnectableInterface *connectable); void ags_jack_client_init(AgsJackClient *jack_client); void ags_jack_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_jack_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_jack_client_dispose(GObject *gobject); void ags_jack_client_finalize(GObject *gobject); AgsUUID* ags_jack_client_get_uuid(AgsConnectable *connectable); gboolean ags_jack_client_has_resource(AgsConnectable *connectable); gboolean ags_jack_client_is_ready(AgsConnectable *connectable); void ags_jack_client_add_to_registry(AgsConnectable *connectable); void ags_jack_client_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_jack_client_list_resource(AgsConnectable *connectable); xmlNode* ags_jack_client_xml_compose(AgsConnectable *connectable); void ags_jack_client_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_jack_client_is_connected(AgsConnectable *connectable); void ags_jack_client_connect(AgsConnectable *connectable); void ags_jack_client_disconnect(AgsConnectable *connectable); #ifdef AGS_WITH_JACK void ags_jack_client_shutdown(void *arg); int ags_jack_client_process_callback(jack_nframes_t nframes, void *ptr); int ags_jack_client_xrun_callback(void *ptr); #endif /** * SECTION:ags_jack_client * @short_description: JACK connection * @title: AgsJackClient * @section_id: * @include: ags/audio/jack/ags_jack_client.h * * The #AgsJackClient communicates with a JACK instance. */ enum{ PROP_0, PROP_JACK_SERVER, PROP_CLIENT_NAME, PROP_DEVICE, PROP_PORT, }; static gpointer ags_jack_client_parent_class = NULL; GType ags_jack_client_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_jack_client = 0; static const GTypeInfo ags_jack_client_info = { sizeof(AgsJackClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_jack_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsJackClient), 0, /* n_preallocs */ (GInstanceInitFunc) ags_jack_client_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_jack_client_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_jack_client = g_type_register_static(G_TYPE_OBJECT, "AgsJackClient", &ags_jack_client_info, 0); g_type_add_interface_static(ags_type_jack_client, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_jack_client); } return g_define_type_id__volatile; } void ags_jack_client_class_init(AgsJackClientClass *jack_client) { GObjectClass *gobject; GParamSpec *param_spec; ags_jack_client_parent_class = g_type_class_peek_parent(jack_client); /* GObjectClass */ gobject = (GObjectClass *) jack_client; gobject->set_property = ags_jack_client_set_property; gobject->get_property = ags_jack_client_get_property; gobject->dispose = ags_jack_client_dispose; gobject->finalize = ags_jack_client_finalize; /* properties */ /** * AgsJackClient:jack-server: * * The assigned #AgsJackServer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("jack-server", i18n_pspec("assigned JACK server"), i18n_pspec("The assigned JACK server"), AGS_TYPE_JACK_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_SERVER, param_spec); /** * AgsJackClient:client-name: * * The JACK client name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("client-name", i18n_pspec("the client name"), i18n_pspec("The client name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CLIENT_NAME, param_spec); /** * AgsJackClient:device: (type GList(GObject)) (transfer full) * * The assigned devices. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("device", i18n_pspec("assigned device"), i18n_pspec("The assigned device"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsJackClient:port: (type GList(AgsJackPort)) (transfer full) * * The assigned ports. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port", i18n_pspec("assigned port"), i18n_pspec("The assigned port"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); } void ags_jack_client_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_jack_client_get_uuid; connectable->has_resource = ags_jack_client_has_resource; connectable->is_ready = ags_jack_client_is_ready; connectable->add_to_registry = ags_jack_client_add_to_registry; connectable->remove_from_registry = ags_jack_client_remove_from_registry; connectable->list_resource = ags_jack_client_list_resource; connectable->xml_compose = ags_jack_client_xml_compose; connectable->xml_parse = ags_jack_client_xml_parse; connectable->is_connected = ags_jack_client_is_connected; connectable->connect = ags_jack_client_connect; connectable->disconnect = ags_jack_client_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_jack_client_init(AgsJackClient *jack_client) { /* flags */ jack_client->flags = 0; /* jack client mutex */ g_rec_mutex_init(&(jack_client->obj_mutex)); /* server */ jack_client->jack_server = NULL; /* uuid */ jack_client->uuid = ags_uuid_alloc(); ags_uuid_generate(jack_client->uuid); jack_client->client_name = NULL; jack_client->client_uuid = NULL; /* client */ jack_client->client = NULL; /* device */ jack_client->device = NULL; jack_client->port = NULL; g_atomic_int_set(&(jack_client->queued), 0); } void ags_jack_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsJackClient *jack_client; GRecMutex *jack_client_mutex; jack_client = AGS_JACK_CLIENT(gobject); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); switch(prop_id){ case PROP_JACK_SERVER: { AgsJackServer *jack_server; jack_server = (AgsJackServer *) g_value_get_object(value); g_rec_mutex_lock(jack_client_mutex); if(jack_client->jack_server == (GObject *) jack_server){ g_rec_mutex_unlock(jack_client_mutex); return; } if(jack_client->jack_server != NULL){ g_object_unref(jack_client->jack_server); } if(jack_server != NULL){ g_object_ref(jack_server); } jack_client->jack_server = (GObject *) jack_server; g_rec_mutex_unlock(jack_client_mutex); } break; case PROP_CLIENT_NAME: { char *client_name; client_name = (char *) g_value_get_string(value); g_rec_mutex_lock(jack_client_mutex); g_free(jack_client->client_name); jack_client->client_name = g_strdup(client_name); g_rec_mutex_unlock(jack_client_mutex); } break; case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(jack_client_mutex); if(device == NULL || g_list_find(jack_client->device, device) != NULL){ g_rec_mutex_unlock(jack_client_mutex); return; } g_object_ref(device); jack_client->device = g_list_prepend(jack_client->device, device); g_rec_mutex_unlock(jack_client_mutex); } break; case PROP_PORT: { GObject *port; port = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(jack_client_mutex); if(!AGS_IS_JACK_PORT(port) || g_list_find(jack_client->port, port) != NULL){ g_rec_mutex_unlock(jack_client_mutex); return; } g_object_ref(port); jack_client->port = g_list_prepend(jack_client->port, port); g_rec_mutex_unlock(jack_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsJackClient *jack_client; GRecMutex *jack_client_mutex; jack_client = AGS_JACK_CLIENT(gobject); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); switch(prop_id){ case PROP_JACK_SERVER: { g_rec_mutex_lock(jack_client_mutex); g_value_set_object(value, jack_client->jack_server); g_rec_mutex_unlock(jack_client_mutex); } break; case PROP_CLIENT_NAME: { g_rec_mutex_lock(jack_client_mutex); g_value_set_string(value, jack_client->client_name); g_rec_mutex_unlock(jack_client_mutex); } break; case PROP_DEVICE: { g_rec_mutex_lock(jack_client_mutex); g_value_set_pointer(value, g_list_copy_deep(jack_client->device, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(jack_client_mutex); } break; case PROP_PORT: { g_rec_mutex_lock(jack_client_mutex); g_value_set_pointer(value, g_list_copy_deep(jack_client->port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(jack_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_client_dispose(GObject *gobject) { AgsJackClient *jack_client; GList *list; jack_client = AGS_JACK_CLIENT(gobject); /* jack server */ if(jack_client->jack_server != NULL){ g_object_unref(jack_client->jack_server); jack_client->jack_server = NULL; } /* device */ if(jack_client->device != NULL){ list = jack_client->device; while(list != NULL){ g_object_set(G_OBJECT(list->data), "jack-client", NULL, NULL); list = list->next; } g_list_free_full(jack_client->device, g_object_unref); jack_client->device = NULL; } /* port */ if(jack_client->port != NULL){ list = jack_client->port; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(jack_client->port, g_object_unref); jack_client->port = NULL; } /* call parent */ G_OBJECT_CLASS(ags_jack_client_parent_class)->dispose(gobject); } void ags_jack_client_finalize(GObject *gobject) { AgsJackClient *jack_client; jack_client = AGS_JACK_CLIENT(gobject); /* jack server */ if(jack_client->jack_server != NULL){ g_object_unref(jack_client->jack_server); } /* device */ if(jack_client->device != NULL){ g_list_free_full(jack_client->device, g_object_unref); } /* port */ if(jack_client->port != NULL){ g_list_free_full(jack_client->port, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_jack_client_parent_class)->finalize(gobject); } AgsUUID* ags_jack_client_get_uuid(AgsConnectable *connectable) { AgsJackClient *jack_client; AgsUUID *ptr; GRecMutex *jack_client_mutex; jack_client = AGS_JACK_CLIENT(connectable); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get UUID */ g_rec_mutex_lock(jack_client_mutex); ptr = jack_client->uuid; g_rec_mutex_unlock(jack_client_mutex); return(ptr); } gboolean ags_jack_client_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_jack_client_is_ready(AgsConnectable *connectable) { AgsJackClient *jack_client; gboolean is_ready; jack_client = AGS_JACK_CLIENT(connectable); /* check is added */ is_ready = ags_jack_client_test_flags(jack_client, AGS_JACK_CLIENT_ADDED_TO_REGISTRY); return(is_ready); } void ags_jack_client_add_to_registry(AgsConnectable *connectable) { AgsJackClient *jack_client; if(ags_connectable_is_ready(connectable)){ return; } jack_client = AGS_JACK_CLIENT(connectable); ags_jack_client_set_flags(jack_client, AGS_JACK_CLIENT_ADDED_TO_REGISTRY); } void ags_jack_client_remove_from_registry(AgsConnectable *connectable) { AgsJackClient *jack_client; if(!ags_connectable_is_ready(connectable)){ return; } jack_client = AGS_JACK_CLIENT(connectable); ags_jack_client_unset_flags(jack_client, AGS_JACK_CLIENT_ADDED_TO_REGISTRY); } xmlNode* ags_jack_client_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_jack_client_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_jack_client_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_jack_client_is_connected(AgsConnectable *connectable) { AgsJackClient *jack_client; gboolean is_connected; jack_client = AGS_JACK_CLIENT(connectable); /* check is connected */ is_connected = ags_jack_client_test_flags(jack_client, AGS_JACK_CLIENT_CONNECTED); return(is_connected); } void ags_jack_client_connect(AgsConnectable *connectable) { AgsJackClient *jack_client; GList *list_start, *list; GRecMutex *jack_client_mutex; if(ags_connectable_is_connected(connectable)){ return; } jack_client = AGS_JACK_CLIENT(connectable); ags_jack_client_set_flags(jack_client, AGS_JACK_CLIENT_CONNECTED); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* port */ g_rec_mutex_lock(jack_client_mutex); list = list_start = g_list_copy(jack_client->port); g_rec_mutex_unlock(jack_client_mutex); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_jack_client_disconnect(AgsConnectable *connectable) { AgsJackClient *jack_client; GList *list_start, *list; GRecMutex *jack_client_mutex; if(!ags_connectable_is_connected(connectable)){ return; } jack_client = AGS_JACK_CLIENT(connectable); ags_jack_client_unset_flags(jack_client, AGS_JACK_CLIENT_CONNECTED); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* port */ g_rec_mutex_lock(jack_client_mutex); list = list_start = g_list_copy(jack_client->port); g_rec_mutex_unlock(jack_client_mutex); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_jack_client_test_flags: * @jack_client: the #AgsJackClient * @flags: the flags * * Test @flags to be set on @jack_client. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_jack_client_test_flags(AgsJackClient *jack_client, guint flags) { gboolean retval; GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return(FALSE); } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* test */ g_rec_mutex_lock(jack_client_mutex); retval = (flags & (jack_client->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_client_mutex); return(retval); } /** * ags_jack_client_set_flags: * @jack_client: the #AgsJackClient * @flags: see #AgsJackClientFlags-enum * * Enable a feature of @jack_client. * * Since: 3.0.0 */ void ags_jack_client_set_flags(AgsJackClient *jack_client, guint flags) { GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(jack_client_mutex); jack_client->flags |= flags; g_rec_mutex_unlock(jack_client_mutex); } /** * ags_jack_client_unset_flags: * @jack_client: the #AgsJackClient * @flags: see #AgsJackClientFlags-enum * * Disable a feature of @jack_client. * * Since: 3.0.0 */ void ags_jack_client_unset_flags(AgsJackClient *jack_client, guint flags) { GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(jack_client_mutex); jack_client->flags &= (~flags); g_rec_mutex_unlock(jack_client_mutex); } /** * ags_jack_client_find_uuid: * @jack_client: (element-type AgsAudio.JackClient) (transfer none): the #GList-struct containing #AgsJackClient * @client_uuid: the client uuid to find * * Finds next match of @client_uuid in @jack_client. * * Returns: (element-type AgsAudio.JackClient) (transfer none): the matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_jack_client_find_uuid(GList *jack_client, gchar *client_uuid) { AgsJackClient *current_jack_client; gboolean success; GRecMutex *jack_client_mutex; #ifdef AGS_WITH_JACK while(jack_client != NULL){ current_jack_client = AGS_JACK_CLIENT(jack_client->data); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(current_jack_client); /* check uuid */ g_rec_mutex_lock(jack_client_mutex); success = (current_jack_client->client != NULL && !g_ascii_strcasecmp(jack_get_uuid_for_client_name(current_jack_client->client, jack_get_client_name(current_jack_client->client)), client_uuid)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_client_mutex); if(success){ return(jack_client); } jack_client = jack_client->next; } #endif return(NULL); } /** * ags_jack_client_find: * @jack_client: (element-type AgsAudio.JackClient) (transfer none): the #GList-struct containing #AgsJackClient * @client_name: the client name to find * * Finds next match of @client_name in @jack_client. * * Returns: (element-type AgsAudio.JackClient) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_jack_client_find(GList *jack_client, gchar *client_name) { AgsJackClient *current_jack_client; gboolean success; GRecMutex *jack_client_mutex; #ifdef AGS_WITH_JACK while(jack_client != NULL){ current_jack_client = AGS_JACK_CLIENT(jack_client->data); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(current_jack_client); /* check client name */ g_rec_mutex_lock(jack_client_mutex); success = (current_jack_client->client != NULL && !g_ascii_strcasecmp(jack_get_client_name(current_jack_client->client), client_name)); g_rec_mutex_unlock(jack_client_mutex); if(success){ return(jack_client); } jack_client = jack_client->next; } #endif return(NULL); } /** * ags_jack_client_open: * @jack_client: the #AgsJackClient * @client_name: the client's name * * Open the JACK client's connection and read uuid. * * Since: 3.0.0 */ void ags_jack_client_open(AgsJackClient *jack_client, gchar *client_name) { #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif gchar *client_uuid; GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client) || client_name == NULL){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* check already open */ g_rec_mutex_lock(jack_client_mutex); if(jack_client->client != NULL){ g_rec_mutex_unlock(jack_client_mutex); g_message("Advanced Gtk+ Sequencer JACK client already open"); return; } g_rec_mutex_unlock(jack_client_mutex); g_message("Advanced Gtk+ Sequencer open JACK client"); g_object_set(jack_client, "client-name", client_name, NULL); #ifdef AGS_WITH_JACK client = jack_client_open(client_name, 0, NULL, NULL); if(client != NULL){ client_uuid = jack_get_uuid_for_client_name(client, client_name); /* apply client and uuid */ g_rec_mutex_lock(jack_client_mutex); jack_client->client = client; jack_client->client_uuid = client_uuid; g_rec_mutex_unlock(jack_client_mutex); /* set callbacks */ jack_on_shutdown(client, ags_jack_client_shutdown, jack_client); jack_set_process_callback(client, ags_jack_client_process_callback, jack_client); jack_set_xrun_callback(client, ags_jack_client_xrun_callback, jack_client); } #endif } /** * ags_jack_client_close: * @jack_client: the #AgsJackClient * * Close the JACK client's connection. * * Since: 3.0.0 */ void ags_jack_client_close(AgsJackClient *jack_client) { #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* check already closed */ g_rec_mutex_lock(jack_client_mutex); if(jack_client->client == NULL){ g_rec_mutex_unlock(jack_client_mutex); g_message("Advanced Gtk+ Sequencer JACK client already closed"); return; } g_rec_mutex_unlock(jack_client_mutex); g_message("Advanced Gtk+ Sequencer close JACK client"); #ifdef AGS_WITH_JACK g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); jack_client_close(client); g_rec_mutex_lock(jack_client_mutex); jack_client->client = NULL; g_rec_mutex_unlock(jack_client_mutex); #endif g_rec_mutex_lock(jack_client_mutex); g_list_free_full(jack_client->device, g_object_unref); jack_client->device = NULL; g_rec_mutex_unlock(jack_client_mutex); } /** * ags_jack_client_activate: * @jack_client: the #AgsJackClient * * Activate client. * * Since: 3.0.0 */ void ags_jack_client_activate(AgsJackClient *jack_client) { #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif GList *port_start, *port; int ret; GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); if(ags_jack_client_test_flags(jack_client, AGS_JACK_CLIENT_ACTIVATED) || client == NULL){ return; } #ifdef AGS_WITH_JACK ret = jack_activate(client); #else ret = -1; #endif if(ret != 0){ return; } g_rec_mutex_lock(jack_client_mutex); port = port_start = g_list_copy(jack_client->port); g_rec_mutex_unlock(jack_client_mutex); while(port != NULL){ gchar *port_name; //TODO:JK: make thread-safe g_object_get(port->data, "port-name", &port_name, NULL); ags_jack_port_register(port->data, port_name, (ags_jack_port_test_flags(port->data, AGS_JACK_PORT_IS_AUDIO) ? TRUE: FALSE), (ags_jack_port_test_flags(port->data, AGS_JACK_PORT_IS_MIDI) ? TRUE: FALSE), (ags_jack_port_test_flags(port->data, AGS_JACK_PORT_IS_OUTPUT) ? TRUE: FALSE)); g_free(port_name); port = port->next; } ags_jack_client_set_flags(jack_client, AGS_JACK_CLIENT_ACTIVATED); g_list_free(port_start); } /** * ags_jack_client_deactivate: * @jack_client: the #AgsJackClient * * Deactivate client. * * Since: 3.0.0 */ void ags_jack_client_deactivate(AgsJackClient *jack_client) { #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); if(client == NULL){ return; } #ifdef AGS_WITH_JACK jack_deactivate(client); #endif /* set flags */ ags_jack_client_unset_flags(jack_client, AGS_JACK_CLIENT_ACTIVATED); } /** * ags_jack_client_add_device: * @jack_client: the #AgsJackClient * @jack_device: an #AgsJackDevout, #AgsJackDevin or #AgsJackMidiin * * Add @jack_device to @jack_client. * * Since: 3.0.0 */ void ags_jack_client_add_device(AgsJackClient *jack_client, GObject *jack_device) { GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client) || (!AGS_IS_JACK_DEVOUT(jack_device) && !AGS_IS_JACK_MIDIIN(jack_device) && !AGS_IS_JACK_DEVIN(jack_device))){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* add device */ g_rec_mutex_lock(jack_client_mutex); if(g_list_find(jack_client->device, jack_device) == NULL){ g_object_ref(jack_device); jack_client->device = g_list_prepend(jack_client->device, jack_device); } g_rec_mutex_unlock(jack_client_mutex); } /** * ags_jack_client_remove_device: * @jack_client: the #AgsJackClient * @jack_device: an #AgsJackDevout, #AgsJackDevin or #AgsJackMidiin * * Remove @jack_device from @jack_client. * * Since: 3.0.0 */ void ags_jack_client_remove_device(AgsJackClient *jack_client, GObject *jack_device) { GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* remove */ g_rec_mutex_lock(jack_client_mutex); if(g_list_find(jack_client->device, jack_device) != NULL){ jack_client->device = g_list_remove(jack_client->device, jack_device); g_object_unref(jack_device); } g_rec_mutex_unlock(jack_client_mutex); } /** * ags_jack_client_add_port: * @jack_client: the #AgsJackClient * @jack_port: an #AgsJackPort * * Add @jack_port to @jack_client. * * Since: 3.0.0 */ void ags_jack_client_add_port(AgsJackClient *jack_client, GObject *jack_port) { GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client) || !AGS_IS_JACK_PORT(jack_port)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* add port */ g_rec_mutex_lock(jack_client_mutex); if(g_list_find(jack_client->port, jack_port) == NULL){ g_object_ref(jack_port); jack_client->port = g_list_prepend(jack_client->port, jack_port); } g_rec_mutex_unlock(jack_client_mutex); } /** * ags_jack_client_remove_port: * @jack_client: the #AgsJackClient * @jack_port: an #AgsJackPort * * Remove @jack_port from @jack_client. * * Since: 3.0.0 */ void ags_jack_client_remove_port(AgsJackClient *jack_client, GObject *jack_port) { GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* remove port */ g_rec_mutex_lock(jack_client_mutex); if(g_list_find(jack_client->port, jack_port) != NULL){ jack_client->port = g_list_remove(jack_client->port, jack_port); g_object_unref(jack_port); } g_rec_mutex_unlock(jack_client_mutex); } #ifdef AGS_WITH_JACK void ags_jack_client_shutdown(void *ptr) { AgsJackClient *jack_client; GList *port_start, *port; GRecMutex *jack_client_mutex; jack_client = ptr; /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* unset flags */ g_rec_mutex_lock(jack_client_mutex); jack_client->flags &= (~AGS_JACK_CLIENT_ACTIVATED); port = port_start = g_list_copy(jack_client->port); g_rec_mutex_unlock(jack_client_mutex); while(port != NULL){ ags_jack_port_unset_flags(port->data, AGS_JACK_PORT_REGISTERED); port = port->next; } g_list_free(port_start); } int ags_jack_client_process_callback(jack_nframes_t nframes, void *ptr) { AgsJackServer *jack_server; AgsJackClient *jack_client; AgsJackPort *jack_port; AgsJackDevout *jack_devout; AgsJackDevin *jack_devin; AgsJackMidiin *jack_midiin; AgsAudioLoop *audio_loop; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; jack_client_t *client; jack_default_audio_sample_t *out, *in; jack_midi_event_t in_event; GList *device_start, *device; GList *port_start, *port; void *port_buf; jack_nframes_t event_count; guint time_spent; guint copy_mode; guint word_size; guint event_size; guint i, j; guint nth_buffer; gboolean no_event; GRecMutex *jack_client_mutex; GRecMutex *device_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; if(ptr == NULL){ return(0); } jack_client = ptr; /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get jack server */ g_rec_mutex_lock(jack_client_mutex); jack_server = (AgsJackServer *) jack_client->jack_server; device_start = g_list_copy(jack_client->device); g_rec_mutex_unlock(jack_client_mutex); /* get application context */ application_context = ags_application_context_get_instance(); if(g_atomic_int_get(&(jack_client->queued)) > 0){ g_warning("drop JACK callback"); return(0); }else{ g_atomic_int_inc(&(jack_client->queued)); } /* * process audio */ /* */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); device = device_start; if(device == NULL){ g_atomic_int_dec_and_test(&(jack_client->queued)); g_object_unref(audio_loop); g_object_unref(task_launcher); return(0); } ags_thread_set_flags(audio_loop, AGS_THREAD_TIME_ACCOUNTING); /* * process MIDI and audio input */ /* get device */ device = device_start; while(device != NULL){ /* get device mutex */ if(AGS_IS_JACK_MIDIIN(device->data)){ device_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(device->data); }else{ device = device->next; continue; } /* */ g_rec_mutex_lock(device_mutex); jack_midiin = NULL; if(AGS_IS_JACK_MIDIIN(device->data)){ jack_midiin = (AgsJackMidiin *) device->data; /* wait callback */ no_event = TRUE; if((AGS_JACK_MIDIIN_PASS_THROUGH & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0){ callback_mutex = &(jack_midiin->callback_mutex); g_rec_mutex_unlock(device_mutex); /* give back computing time until ready */ g_mutex_lock(callback_mutex); if((AGS_JACK_MIDIIN_CALLBACK_DONE & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0){ g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_CALLBACK_WAIT); while((AGS_JACK_MIDIIN_CALLBACK_DONE & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0 && (AGS_JACK_MIDIIN_CALLBACK_WAIT & (g_atomic_int_get(&(jack_midiin->sync_flags)))) != 0){ g_cond_wait(&(jack_midiin->callback_cond), callback_mutex); } } g_atomic_int_and(&(jack_midiin->sync_flags), (~(AGS_JACK_MIDIIN_CALLBACK_WAIT | AGS_JACK_MIDIIN_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; g_rec_mutex_lock(device_mutex); } /* MIDI input */ if(jack_midiin != NULL){ if(!no_event){ port = jack_midiin->jack_port; for(i = 0; port != NULL; i++){ jack_port = port->data; port_buf = jack_port_get_buffer(jack_port->port, 4096); event_count = jack_midi_get_event_count(port_buf); for(j = 0; j < event_count; j++){ jack_midi_event_get(&in_event, port_buf, j); if(in_event.size > 0){ nth_buffer = 0; if((AGS_JACK_MIDIIN_BUFFER0 & (jack_midiin->flags)) != 0){ nth_buffer = 1; }else if((AGS_JACK_MIDIIN_BUFFER1 & (jack_midiin->flags)) != 0){ nth_buffer = 2; }else if((AGS_JACK_MIDIIN_BUFFER2 & (jack_midiin->flags)) != 0){ nth_buffer = 3; }else if((AGS_JACK_MIDIIN_BUFFER3 & jack_midiin->flags) != 0){ nth_buffer = 0; } if(ceil((jack_midiin->buffer_size[nth_buffer] + in_event.size) / 4096.0) > ceil(jack_midiin->buffer_size[nth_buffer] / 4096.0)){ if(jack_midiin->buffer[nth_buffer] == NULL){ jack_midiin->buffer[nth_buffer] = malloc(4096 * sizeof(char)); }else{ jack_midiin->buffer[nth_buffer] = realloc(jack_midiin->buffer[nth_buffer], (ceil(jack_midiin->buffer_size[nth_buffer] / 4096.0) * 4096 + 4096) * sizeof(char)); } } memcpy(&(jack_midiin->buffer[nth_buffer][jack_midiin->buffer_size[nth_buffer]]), in_event.buffer, in_event.size); jack_midiin->buffer_size[nth_buffer] += in_event.size; } } jack_midi_clear_buffer(port_buf); port = port->next; } /* signal finish */ callback_finish_mutex = &(jack_midiin->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE); if((AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_midiin->sync_flags)))) != 0){ g_cond_signal(&(jack_midiin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } } } g_rec_mutex_unlock(device_mutex); /* iterate */ device = device->next; } /* * process audio input */ /* get device */ device = device_start; while(device != NULL){ if(AGS_IS_JACK_DEVIN(device->data)){ device_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(device->data); }else{ device = device->next; continue; } /* */ g_rec_mutex_lock(device_mutex); jack_devin = NULL; if(AGS_IS_JACK_DEVIN(device->data)){ jack_devin = (AgsJackDevin *) device->data; /* wait callback */ no_event = TRUE; if((AGS_JACK_DEVIN_PASS_THROUGH & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0){ callback_mutex = &(jack_devin->callback_mutex); g_rec_mutex_unlock(device_mutex); /* give back computing time until ready */ g_mutex_lock(callback_mutex); if((AGS_JACK_DEVIN_CALLBACK_DONE & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0){ g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_CALLBACK_WAIT); while((AGS_JACK_DEVIN_CALLBACK_DONE & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0 && (AGS_JACK_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(jack_devin->sync_flags)))) != 0){ g_cond_wait(&(jack_devin->callback_cond), callback_mutex); } } g_atomic_int_and(&(jack_devin->sync_flags), (~(AGS_JACK_DEVIN_CALLBACK_WAIT | AGS_JACK_DEVIN_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; g_rec_mutex_lock(device_mutex); } /* get buffer */ if((AGS_JACK_DEVIN_BUFFER0 & (jack_devin->flags)) != 0){ nth_buffer = 1; }else if((AGS_JACK_DEVIN_BUFFER1 & (jack_devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_JACK_DEVIN_BUFFER2 & (jack_devin->flags)) != 0){ nth_buffer = 3; }else if((AGS_JACK_DEVIN_BUFFER3 & jack_devin->flags) != 0){ nth_buffer = 0; }else{ /* iterate */ g_rec_mutex_unlock(device_mutex); device = device->next; continue; } /* get copy mode */ copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(jack_devin->format), AGS_AUDIO_BUFFER_UTIL_FLOAT); /* check buffer flag */ switch(jack_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(device_mutex); /* iterate */ device = device->next; continue; } /* retrieve buffer */ port = jack_devin->jack_port; for(i = 0; port != NULL; i++){ jack_port = port->data; in = jack_port_get_buffer(jack_port->port, jack_devin->buffer_size); if(!no_event && in != NULL){ ags_soundcard_lock_buffer(AGS_SOUNDCARD(jack_devin), jack_devin->buffer[nth_buffer]); ags_audio_buffer_util_copy_buffer_to_buffer(jack_devin->buffer[nth_buffer], jack_devin->pcm_channels, i, in, 1, 0, jack_devin->buffer_size, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(jack_devin), jack_devin->buffer[nth_buffer]); } port = port->next; } /* clear buffer */ port = jack_devin->jack_port; for(i = 0; port != NULL; i++){ jack_port = port->data; out = jack_port_get_buffer(jack_port->port, jack_devin->buffer_size); if(out != NULL){ ags_audio_buffer_util_clear_float(out, 1, jack_devin->buffer_size); } port = port->next; } if(!no_event){ /* signal finish */ callback_finish_mutex = &(jack_devin->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_CALLBACK_FINISH_DONE); if((AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_devin->sync_flags)))) != 0){ g_cond_signal(&(jack_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } } g_rec_mutex_unlock(device_mutex); /* iterate */ device = device->next; } /* * process audio output */ /* get device */ device = device_start; while(device != NULL){ if(AGS_IS_JACK_DEVOUT(device->data)){ device_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(device->data); }else{ device = device->next; continue; } /* */ g_rec_mutex_lock(device_mutex); jack_devout = NULL; if(AGS_IS_JACK_DEVOUT(device->data)){ jack_devout = (AgsJackDevout *) device->data; /* wait callback */ no_event = TRUE; if((AGS_JACK_DEVOUT_PASS_THROUGH & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0){ callback_mutex = &(jack_devout->callback_mutex); g_rec_mutex_unlock(device_mutex); /* give back computing time until ready */ g_mutex_lock(callback_mutex); if((AGS_JACK_DEVOUT_CALLBACK_DONE & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0){ g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_CALLBACK_WAIT); while((AGS_JACK_DEVOUT_CALLBACK_DONE & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0 && (AGS_JACK_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(jack_devout->sync_flags)))) != 0){ g_cond_wait(&(jack_devout->callback_cond), callback_mutex); } } g_atomic_int_and(&(jack_devout->sync_flags), (~(AGS_JACK_DEVOUT_CALLBACK_WAIT | AGS_JACK_DEVOUT_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; g_rec_mutex_lock(device_mutex); } /* clear buffer */ port = jack_devout->jack_port; for(i = 0; port != NULL; i++){ jack_port = port->data; out = jack_port_get_buffer(jack_port->port, jack_devout->buffer_size); if(out != NULL){ ags_audio_buffer_util_clear_float(out, 1, jack_devout->buffer_size); } port = port->next; } /* get buffer */ if((AGS_JACK_DEVOUT_BUFFER0 & (jack_devout->flags)) != 0){ nth_buffer = 3; }else if((AGS_JACK_DEVOUT_BUFFER1 & (jack_devout->flags)) != 0){ nth_buffer = 0; }else if((AGS_JACK_DEVOUT_BUFFER2 & (jack_devout->flags)) != 0){ nth_buffer = 1; }else if((AGS_JACK_DEVOUT_BUFFER3 & jack_devout->flags) != 0){ nth_buffer = 2; }else{ /* iterate */ g_rec_mutex_unlock(device_mutex); device = device->next; continue; } /* get copy mode */ copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(jack_devout->format)); /* check buffer flag */ switch(jack_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(device_mutex); /* iterate */ device = device->next; continue; } /* fill buffer */ port = jack_devout->jack_port; for(i = 0; port != NULL; i++){ jack_port = port->data; out = jack_port_get_buffer(jack_port->port, jack_devout->buffer_size); if(!no_event && out != NULL){ ags_soundcard_lock_buffer(AGS_SOUNDCARD(jack_devout), jack_devout->buffer[nth_buffer]); ags_audio_buffer_util_copy_buffer_to_buffer(out, 1, 0, jack_devout->buffer[nth_buffer], jack_devout->pcm_channels, i, jack_devout->buffer_size, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(jack_devout), jack_devout->buffer[nth_buffer]); } port = port->next; } if(!no_event){ /* signal finish */ callback_finish_mutex = &(jack_devout->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_devout->sync_flags)))) != 0){ g_cond_signal(&(jack_devout->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } } g_rec_mutex_unlock(device_mutex); /* iterate */ device = device->next; } g_list_free(device_start); g_atomic_int_dec_and_test(&(jack_client->queued)); /* unref */ g_object_unref(audio_loop); g_object_unref(task_launcher); return(0); } int ags_jack_client_xrun_callback(void *ptr) { AgsJackClient *jack_client; if(ptr == NULL){ return(0); } jack_client = (AgsJackClient *) ptr; //TODO:JK: implement me return(0); } #endif /** * ags_jack_client_new: * @jack_server: the assigned #AgsJackServer * * Create a new instance of #AgsJackClient. * * Returns: the new #AgsJackClient * * Since: 3.0.0 */ AgsJackClient* ags_jack_client_new(GObject *jack_server) { AgsJackClient *jack_client; jack_client = (AgsJackClient *) g_object_new(AGS_TYPE_JACK_CLIENT, "jack-server", jack_server, NULL); return(jack_client); } gsequencer-3.1.3/ags/audio/jack/ags_jack_client.h0000644000175000017500000000752113607210263016641 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_JACK_CLIENT_H__ #define __AGS_JACK_CLIENT_H__ #include #include #include #ifdef AGS_WITH_JACK #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_JACK_CLIENT (ags_jack_client_get_type()) #define AGS_JACK_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_JACK_CLIENT, AgsJackClient)) #define AGS_JACK_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_JACK_CLIENT, AgsJackClient)) #define AGS_IS_JACK_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_JACK_CLIENT)) #define AGS_IS_JACK_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_JACK_CLIENT)) #define AGS_JACK_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_JACK_CLIENT, AgsJackClientClass)) #define AGS_JACK_CLIENT_GET_OBJ_MUTEX(obj) (&(((AgsJackClient *) obj)->obj_mutex)) typedef struct _AgsJackClient AgsJackClient; typedef struct _AgsJackClientClass AgsJackClientClass; /** * AgsJackClientFlags: * @AGS_JACK_CLIENT_ADDED_TO_REGISTRY: the JACK client was added to registry, see #AgsConnectable::add_to_registry() * @AGS_JACK_CLIENT_CONNECTED: indicates the client was connected by calling #AgsConnectable::connect() * @AGS_JACK_CLIENT_ACTIVATED: the client was activated * * Enum values to control the behavior or indicate internal state of #AgsJackClient by * enable/disable as flags. */ typedef enum{ AGS_JACK_CLIENT_ADDED_TO_REGISTRY = 1, AGS_JACK_CLIENT_CONNECTED = 1 << 1, AGS_JACK_CLIENT_ACTIVATED = 1 << 2, }AgsJackClientFlags; struct _AgsJackClient { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *jack_server; AgsUUID *uuid; gchar *client_uuid; gchar *client_name; #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif GList *device; GList *port; volatile guint queued; }; struct _AgsJackClientClass { GObjectClass gobject; }; GType ags_jack_client_get_type(); gboolean ags_jack_client_test_flags(AgsJackClient *jack_client, guint flags); void ags_jack_client_set_flags(AgsJackClient *jack_client, guint flags); void ags_jack_client_unset_flags(AgsJackClient *jack_client, guint flags); GList* ags_jack_client_find_uuid(GList *jack_client, gchar *client_uuid); GList* ags_jack_client_find(GList *jack_client, gchar *client_name); void ags_jack_client_open(AgsJackClient *jack_client, gchar *client_name); void ags_jack_client_close(AgsJackClient *jack_client); void ags_jack_client_add_device(AgsJackClient *jack_client, GObject *jack_device); void ags_jack_client_remove_device(AgsJackClient *jack_client, GObject *jack_device); void ags_jack_client_add_port(AgsJackClient *jack_client, GObject *jack_port); void ags_jack_client_remove_port(AgsJackClient *jack_client, GObject *jack_port); void ags_jack_client_activate(AgsJackClient *jack_client); void ags_jack_client_deactivate(AgsJackClient *jack_client); AgsJackClient* ags_jack_client_new(GObject *jack_server); G_END_DECLS #endif /*__AGS_JACK_CLIENT_H__*/ gsequencer-3.1.3/ags/audio/jack/ags_jack_midiin.c0000644000175000017500000013443113607210263016630 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_jack_midiin_class_init(AgsJackMidiinClass *jack_midiin); void ags_jack_midiin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_jack_midiin_sequencer_interface_init(AgsSequencerInterface *sequencer); void ags_jack_midiin_init(AgsJackMidiin *jack_midiin); void ags_jack_midiin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_jack_midiin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_jack_midiin_dispose(GObject *gobject); void ags_jack_midiin_finalize(GObject *gobject); AgsUUID* ags_jack_midiin_get_uuid(AgsConnectable *connectable); gboolean ags_jack_midiin_has_resource(AgsConnectable *connectable); gboolean ags_jack_midiin_is_ready(AgsConnectable *connectable); void ags_jack_midiin_add_to_registry(AgsConnectable *connectable); void ags_jack_midiin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_jack_midiin_list_resource(AgsConnectable *connectable); xmlNode* ags_jack_midiin_xml_compose(AgsConnectable *connectable); void ags_jack_midiin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_jack_midiin_is_connected(AgsConnectable *connectable); void ags_jack_midiin_connect(AgsConnectable *connectable); void ags_jack_midiin_disconnect(AgsConnectable *connectable); void ags_jack_midiin_set_device(AgsSequencer *sequencer, gchar *device); gchar* ags_jack_midiin_get_device(AgsSequencer *sequencer); void ags_jack_midiin_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name); gboolean ags_jack_midiin_is_starting(AgsSequencer *sequencer); gboolean ags_jack_midiin_is_recording(AgsSequencer *sequencer); void ags_jack_midiin_port_init(AgsSequencer *sequencer, GError **error); void ags_jack_midiin_port_record(AgsSequencer *sequencer, GError **error); void ags_jack_midiin_port_free(AgsSequencer *sequencer); void ags_jack_midiin_tic(AgsSequencer *sequencer); void ags_jack_midiin_offset_changed(AgsSequencer *sequencer, guint note_offset); void ags_jack_midiin_set_bpm(AgsSequencer *sequencer, gdouble bpm); gdouble ags_jack_midiin_get_bpm(AgsSequencer *sequencer); void ags_jack_midiin_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor); gdouble ags_jack_midiin_get_delay_factor(AgsSequencer *sequencer); void* ags_jack_midiin_get_buffer(AgsSequencer *sequencer, guint *buffer_length); void* ags_jack_midiin_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length); void ags_jack_midiin_lock_buffer(AgsSequencer *sequencer, void *buffer); void ags_jack_midiin_unlock_buffer(AgsSequencer *sequencer, void *buffer); void ags_jack_midiin_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset); guint ags_jack_midiin_get_start_note_offset(AgsSequencer *sequencer); void ags_jack_midiin_set_note_offset(AgsSequencer *sequencer, guint note_offset); guint ags_jack_midiin_get_note_offset(AgsSequencer *sequencer); /** * SECTION:ags_jack_midiin * @short_description: Input from sequencer * @title: AgsJackMidiin * @section_id: * @include: ags/audio/jack/ags_jack_midiin.h * * #AgsJackMidiin represents a sequencer and supports midi input. */ enum{ PROP_0, PROP_DEVICE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_JACK_CLIENT, PROP_JACK_PORT, }; static gpointer ags_jack_midiin_parent_class = NULL; GType ags_jack_midiin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_jack_midiin = 0; static const GTypeInfo ags_jack_midiin_info = { sizeof(AgsJackMidiinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_jack_midiin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsJackMidiin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_jack_midiin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_jack_midiin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sequencer_interface_info = { (GInterfaceInitFunc) ags_jack_midiin_sequencer_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_jack_midiin = g_type_register_static(G_TYPE_OBJECT, "AgsJackMidiin", &ags_jack_midiin_info, 0); g_type_add_interface_static(ags_type_jack_midiin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_jack_midiin, AGS_TYPE_SEQUENCER, &ags_sequencer_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_jack_midiin); } return g_define_type_id__volatile; } void ags_jack_midiin_class_init(AgsJackMidiinClass *jack_midiin) { GObjectClass *gobject; GParamSpec *param_spec; ags_jack_midiin_parent_class = g_type_class_peek_parent(jack_midiin); /* GObjectClass */ gobject = (GObjectClass *) jack_midiin; gobject->set_property = ags_jack_midiin_set_property; gobject->get_property = ags_jack_midiin_get_property; gobject->dispose = ags_jack_midiin_dispose; gobject->finalize = ags_jack_midiin_finalize; /* properties */ /** * AgsJackMidiin:device: * * The JACK sequencer indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsJackMidiin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to record"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsJackMidiin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, AGS_SEQUENCER_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsJackMidiin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsJackMidiin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsJackMidiin:jack-client: * * The assigned #AgsJackClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("jack-client", i18n_pspec("jack client object"), i18n_pspec("The jack client object"), AGS_TYPE_JACK_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_CLIENT, param_spec); /** * AgsJackMidiin:jack-port: * * The assigned #AgsJackPort * * Since: 3.0.0 */ param_spec = g_param_spec_object("jack-port", i18n_pspec("jack port object"), i18n_pspec("The jack port object"), AGS_TYPE_JACK_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_PORT, param_spec); /* AgsJackMidiinClass */ } GQuark ags_jack_midiin_error_quark() { return(g_quark_from_static_string("ags-jack_midiin-error-quark")); } void ags_jack_midiin_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_jack_midiin_get_uuid; connectable->has_resource = ags_jack_midiin_has_resource; connectable->is_ready = ags_jack_midiin_is_ready; connectable->add_to_registry = ags_jack_midiin_add_to_registry; connectable->remove_from_registry = ags_jack_midiin_remove_from_registry; connectable->list_resource = ags_jack_midiin_list_resource; connectable->xml_compose = ags_jack_midiin_xml_compose; connectable->xml_parse = ags_jack_midiin_xml_parse; connectable->is_connected = ags_jack_midiin_is_connected; connectable->connect = ags_jack_midiin_connect; connectable->disconnect = ags_jack_midiin_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_jack_midiin_sequencer_interface_init(AgsSequencerInterface *sequencer) { sequencer->set_device = ags_jack_midiin_set_device; sequencer->get_device = ags_jack_midiin_get_device; sequencer->list_cards = ags_jack_midiin_list_cards; sequencer->is_starting = ags_jack_midiin_is_starting; sequencer->is_playing = NULL; sequencer->is_recording = ags_jack_midiin_is_recording; sequencer->play_init = NULL; sequencer->play = NULL; sequencer->record_init = ags_jack_midiin_port_init; sequencer->record = ags_jack_midiin_port_record; sequencer->stop = ags_jack_midiin_port_free; sequencer->tic = ags_jack_midiin_tic; sequencer->offset_changed = ags_jack_midiin_offset_changed; sequencer->set_bpm = ags_jack_midiin_set_bpm; sequencer->get_bpm = ags_jack_midiin_get_bpm; sequencer->set_delay_factor = ags_jack_midiin_set_delay_factor; sequencer->get_delay_factor = ags_jack_midiin_get_delay_factor; sequencer->get_buffer = ags_jack_midiin_get_buffer; sequencer->get_next_buffer = ags_jack_midiin_get_next_buffer; sequencer->lock_buffer = ags_jack_midiin_lock_buffer; sequencer->unlock_buffer = ags_jack_midiin_unlock_buffer; sequencer->set_start_note_offset = ags_jack_midiin_set_start_note_offset; sequencer->get_start_note_offset = ags_jack_midiin_get_start_note_offset; sequencer->set_note_offset = ags_jack_midiin_set_note_offset; sequencer->get_note_offset = ags_jack_midiin_get_note_offset; } void ags_jack_midiin_init(AgsJackMidiin *jack_midiin) { AgsConfig *config; gchar *str; gchar *segmentation; guint i; guint denominator, numerator; jack_midiin->flags = 0; g_atomic_int_set(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_PASS_THROUGH); /* jack midiin mutex */ g_rec_mutex_init(&(jack_midiin->obj_mutex)); /* uuid */ jack_midiin->uuid = ags_uuid_alloc(); ags_uuid_generate(jack_midiin->uuid); /* card and port */ jack_midiin->card_uri = NULL; jack_midiin->jack_client = NULL; jack_midiin->port_name = NULL; jack_midiin->jack_port = NULL; /* buffer */ jack_midiin->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ jack_midiin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(jack_midiin->buffer_mutex[i]); } jack_midiin->buffer = (char **) malloc(4 * sizeof(char*)); jack_midiin->buffer[0] = NULL; jack_midiin->buffer[1] = NULL; jack_midiin->buffer[2] = NULL; jack_midiin->buffer[3] = NULL; jack_midiin->buffer_size[0] = 0; jack_midiin->buffer_size[1] = 0; jack_midiin->buffer_size[2] = 0; jack_midiin->buffer_size[3] = 0; /* bpm */ jack_midiin->bpm = AGS_SEQUENCER_DEFAULT_BPM; /* delay and delay factor */ jack_midiin->delay = AGS_SEQUENCER_DEFAULT_DELAY; jack_midiin->delay_factor = AGS_SEQUENCER_DEFAULT_DELAY_FACTOR; /* segmentation */ config = ags_config_get_instance(); segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); jack_midiin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* counters */ jack_midiin->start_note_offset = 0; jack_midiin->note_offset = 0; jack_midiin->note_offset_absolute = 0; jack_midiin->tact_counter = 0.0; jack_midiin->delay_counter = 0; jack_midiin->tic_counter = 0; /* callback mutex */ g_mutex_init(&(jack_midiin->callback_mutex)); g_cond_init(&(jack_midiin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(jack_midiin->callback_finish_mutex)); g_cond_init(&(jack_midiin->callback_finish_cond)); } void ags_jack_midiin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(gobject); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->card_uri = g_strdup(device); g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->bpm = bpm; g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->delay_factor = delay_factor; g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_JACK_CLIENT: { AgsJackClient *jack_client; jack_client = g_value_get_object(value); g_rec_mutex_lock(jack_midiin_mutex); if(jack_midiin->jack_client == (GObject *) jack_client){ g_rec_mutex_unlock(jack_midiin_mutex); return; } if(jack_midiin->jack_client != NULL){ g_object_unref(G_OBJECT(jack_midiin->jack_client)); } if(jack_client != NULL){ g_object_ref(G_OBJECT(jack_client)); } jack_midiin->jack_client = (GObject *) jack_client; g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_JACK_PORT: { AgsJackPort *jack_port; jack_port = (AgsJackPort *) g_value_get_object(value); g_rec_mutex_lock(jack_midiin_mutex); if(g_list_find(jack_midiin->jack_port, jack_port) != NULL){ g_rec_mutex_unlock(jack_midiin_mutex); return; } if(jack_port != NULL){ g_object_ref(jack_port); jack_midiin->jack_port = g_list_append(jack_midiin->jack_port, jack_port); } g_rec_mutex_unlock(jack_midiin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_midiin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(gobject); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(jack_midiin_mutex); g_value_set_string(value, jack_midiin->card_uri); g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(jack_midiin_mutex); g_value_set_pointer(value, jack_midiin->buffer); g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(jack_midiin_mutex); g_value_set_double(value, jack_midiin->bpm); g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(jack_midiin_mutex); g_value_set_double(value, jack_midiin->delay_factor); g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_JACK_CLIENT: { g_rec_mutex_lock(jack_midiin_mutex); g_value_set_object(value, jack_midiin->jack_client); g_rec_mutex_unlock(jack_midiin_mutex); } break; case PROP_JACK_PORT: { g_rec_mutex_lock(jack_midiin_mutex); g_value_set_pointer(value, g_list_copy_deep(jack_midiin->jack_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(jack_midiin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_midiin_dispose(GObject *gobject) { AgsJackMidiin *jack_midiin; GList *list; jack_midiin = AGS_JACK_MIDIIN(gobject); /* jack client */ if(jack_midiin->jack_client != NULL){ g_object_unref(jack_midiin->jack_client); jack_midiin->jack_client = NULL; } /* jack port */ g_list_free_full(jack_midiin->jack_port, g_object_unref); jack_midiin->jack_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_jack_midiin_parent_class)->dispose(gobject); } void ags_jack_midiin_finalize(GObject *gobject) { AgsJackMidiin *jack_midiin; jack_midiin = AGS_JACK_MIDIIN(gobject); ags_uuid_free(jack_midiin->uuid); /* free output buffer */ if(jack_midiin->buffer[0] != NULL){ free(jack_midiin->buffer[0]); } if(jack_midiin->buffer[1] != NULL){ free(jack_midiin->buffer[1]); } if(jack_midiin->buffer[2] != NULL){ free(jack_midiin->buffer[2]); } if(jack_midiin->buffer[3] != NULL){ free(jack_midiin->buffer[3]); } /* free buffer array */ free(jack_midiin->buffer); /* jack client */ if(jack_midiin->jack_client != NULL){ g_object_unref(jack_midiin->jack_client); } /* jack port */ g_list_free_full(jack_midiin->jack_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_jack_midiin_parent_class)->finalize(gobject); } AgsUUID* ags_jack_midiin_get_uuid(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; AgsUUID *ptr; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(connectable); /* get jack_midiin signal mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* get UUID */ g_rec_mutex_lock(jack_midiin_mutex); ptr = jack_midiin->uuid; g_rec_mutex_unlock(jack_midiin_mutex); return(ptr); } gboolean ags_jack_midiin_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_jack_midiin_is_ready(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; gboolean is_ready; jack_midiin = AGS_JACK_MIDIIN(connectable); /* check is added */ is_ready = ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_ADDED_TO_REGISTRY); return(is_ready); } void ags_jack_midiin_add_to_registry(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; if(ags_connectable_is_ready(connectable)){ return; } jack_midiin = AGS_JACK_MIDIIN(connectable); ags_jack_midiin_set_flags(jack_midiin, AGS_JACK_MIDIIN_ADDED_TO_REGISTRY); } void ags_jack_midiin_remove_from_registry(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; if(!ags_connectable_is_ready(connectable)){ return; } jack_midiin = AGS_JACK_MIDIIN(connectable); ags_jack_midiin_unset_flags(jack_midiin, AGS_JACK_MIDIIN_ADDED_TO_REGISTRY); } xmlNode* ags_jack_midiin_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_jack_midiin_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_jack_midiin_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_jack_midiin_is_connected(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; gboolean is_connected; jack_midiin = AGS_JACK_MIDIIN(connectable); /* check is connected */ is_connected = (((AGS_JACK_MIDIIN_CONNECTED & (jack_midiin->flags)) != 0) ? TRUE: FALSE); return(is_connected); } void ags_jack_midiin_connect(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; if(ags_connectable_is_connected(connectable)){ return; } jack_midiin = AGS_JACK_MIDIIN(connectable); ags_jack_midiin_set_flags(jack_midiin, AGS_JACK_MIDIIN_CONNECTED); } void ags_jack_midiin_disconnect(AgsConnectable *connectable) { AgsJackMidiin *jack_midiin; if(!ags_connectable_is_connected(connectable)){ return; } jack_midiin = AGS_JACK_MIDIIN(connectable); ags_jack_midiin_unset_flags(jack_midiin, AGS_JACK_MIDIIN_CONNECTED); } /** * ags_jack_midiin_test_flags: * @jack_midiin: the #AgsJackMidiin * @flags: the flags * * Test @flags to be set on @jack_midiin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_jack_midiin_test_flags(AgsJackMidiin *jack_midiin, guint flags) { gboolean retval; GRecMutex *jack_midiin_mutex; if(!AGS_IS_JACK_MIDIIN(jack_midiin)){ return(FALSE); } /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* test */ g_rec_mutex_lock(jack_midiin_mutex); retval = (flags & (jack_midiin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_midiin_mutex); return(retval); } /** * ags_jack_midiin_set_flags: * @jack_midiin: the #AgsJackMidiin * @flags: see #AgsJackMidiinFlags-enum * * Enable a feature of @jack_midiin. * * Since: 3.0.0 */ void ags_jack_midiin_set_flags(AgsJackMidiin *jack_midiin, guint flags) { GRecMutex *jack_midiin_mutex; if(!AGS_IS_JACK_MIDIIN(jack_midiin)){ return; } /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->flags |= flags; g_rec_mutex_unlock(jack_midiin_mutex); } /** * ags_jack_midiin_unset_flags: * @jack_midiin: the #AgsJackMidiin * @flags: see #AgsJackMidiinFlags-enum * * Disable a feature of @jack_midiin. * * Since: 3.0.0 */ void ags_jack_midiin_unset_flags(AgsJackMidiin *jack_midiin, guint flags) { GRecMutex *jack_midiin_mutex; if(!AGS_IS_JACK_MIDIIN(jack_midiin)){ return; } /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->flags &= (~flags); g_rec_mutex_unlock(jack_midiin_mutex); } void ags_jack_midiin_set_device(AgsSequencer *sequencer, gchar *device) { AgsJackMidiin *jack_midiin; GList *jack_port, *jack_port_start; gchar *str; int ret; guint nth_card; guint i; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); g_rec_mutex_lock(jack_midiin_mutex); if(jack_midiin->card_uri == device || !g_ascii_strcasecmp(jack_midiin->card_uri, device)){ g_rec_mutex_unlock(jack_midiin_mutex); return; } if(!g_str_has_prefix(device, "ags-jack-midiin-")){ g_warning("invalid JACK device prefix"); g_rec_mutex_unlock(jack_midiin_mutex); return; } ret = sscanf(device, "ags-jack-midiin-%u", &nth_card); if(ret != 1){ g_warning("invalid JACK device specifier"); g_rec_mutex_unlock(jack_midiin_mutex); return; } if(jack_midiin->card_uri != NULL){ g_free(jack_midiin->card_uri); } jack_midiin->card_uri = g_strdup(device); /* apply name to port */ jack_port_start = jack_port = g_list_copy(jack_midiin->jack_port); str = g_strdup_printf("ags-sequencer%d", nth_card); g_object_set(jack_port->data, "port-name", str, NULL); g_free(str); g_list_free(jack_port_start); g_rec_mutex_unlock(jack_midiin_mutex); } gchar* ags_jack_midiin_get_device(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; gchar *device; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); device = NULL; g_rec_mutex_lock(jack_midiin_mutex); device = g_strdup(jack_midiin->card_uri); g_rec_mutex_unlock(jack_midiin_mutex); return(device); } void ags_jack_midiin_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name) { AgsJackClient *jack_client; AgsJackMidiin *jack_midiin; AgsApplicationContext *application_context; GList *list, *list_start; gchar *device, *client_name; jack_midiin = AGS_JACK_MIDIIN(sequencer); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list_start = list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_JACK_MIDIIN(list->data)){ g_object_get(list->data, "device", &device, "jack-client", &jack_client, NULL); if(card_id != NULL){ *card_id = g_list_prepend(*card_id, device); } if(card_name != NULL){ if(jack_client != NULL){ g_object_get(jack_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_jack_midiin_list_cards() - JACK client not connected (null)"); } } if(jack_client != NULL){ g_object_unref(jack_client); } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } gboolean ags_jack_midiin_is_starting(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; gboolean is_starting; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* check is starting */ g_rec_mutex_lock(jack_midiin_mutex); is_starting = ((AGS_JACK_MIDIIN_START_RECORD & (jack_midiin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_midiin_mutex); return(is_starting); } gboolean ags_jack_midiin_is_recording(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; gboolean is_recording; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* check is starting */ g_rec_mutex_lock(jack_midiin_mutex); is_recording = ((AGS_JACK_MIDIIN_RECORD & (jack_midiin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_midiin_mutex); return(is_recording); } void ags_jack_midiin_port_init(AgsSequencer *sequencer, GError **error) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; if(ags_sequencer_is_recording(sequencer)){ return; } jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* */ g_rec_mutex_lock(jack_midiin_mutex); /* prepare for record */ jack_midiin->flags |= (AGS_JACK_MIDIIN_BUFFER3 | AGS_JACK_MIDIIN_START_RECORD | AGS_JACK_MIDIIN_RECORD | AGS_JACK_MIDIIN_NONBLOCKING); /* port setup */ //TODO:JK: implement me /* */ jack_midiin->tact_counter = 0.0; jack_midiin->delay_counter = floor(jack_midiin->delay); jack_midiin->tic_counter = 0; jack_midiin->flags |= (AGS_JACK_MIDIIN_INITIALIZED | AGS_JACK_MIDIIN_START_RECORD | AGS_JACK_MIDIIN_RECORD); g_atomic_int_and(&(jack_midiin->sync_flags), (~(AGS_JACK_MIDIIN_PASS_THROUGH))); g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_INITIAL_CALLBACK); g_rec_mutex_unlock(jack_midiin_mutex); } void ags_jack_midiin_port_record(AgsSequencer *sequencer, GError **error) { AgsJackClient *jack_client; AgsJackMidiin *jack_midiin; AgsTicDevice *tic_device; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; gboolean jack_client_activated; GRecMutex *jack_midiin_mutex; GRecMutex *jack_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); application_context = ags_application_context_get_instance(); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* client */ g_rec_mutex_lock(jack_midiin_mutex); jack_client = (AgsJackClient *) jack_midiin->jack_client; callback_mutex = &(jack_midiin->callback_mutex); callback_finish_mutex = &(jack_midiin->callback_finish_mutex); g_rec_mutex_unlock(jack_midiin_mutex); /* do record */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->flags &= (~AGS_JACK_MIDIIN_START_RECORD); if((AGS_JACK_MIDIIN_INITIALIZED & (jack_midiin->flags)) == 0){ g_rec_mutex_unlock(jack_midiin_mutex); return; } g_rec_mutex_unlock(jack_midiin_mutex); /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* check activated */ g_rec_mutex_lock(jack_client_mutex); jack_client_activated = ((AGS_JACK_CLIENT_ACTIVATED & (jack_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_client_mutex); if(jack_client_activated){ /* signal client */ if((AGS_JACK_MIDIIN_INITIAL_CALLBACK & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_CALLBACK_DONE); if((AGS_JACK_MIDIIN_CALLBACK_WAIT & (g_atomic_int_get(&(jack_midiin->sync_flags)))) != 0){ g_cond_signal(&(jack_midiin->callback_cond)); } g_mutex_unlock(callback_mutex); } /* wait callback */ if((AGS_JACK_MIDIIN_INITIAL_CALLBACK & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0){ g_mutex_lock(callback_finish_mutex); if((AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0){ g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT); while((AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(jack_midiin->sync_flags)))) == 0 && (AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_midiin->sync_flags)))) != 0){ g_cond_wait(&(jack_midiin->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(jack_midiin->sync_flags), (~(AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT | AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(jack_midiin->sync_flags), (~AGS_JACK_MIDIIN_INITIAL_CALLBACK)); } } task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic sequencer */ tic_device = ags_tic_device_new((GObject *) jack_midiin); task = g_list_append(task, tic_device); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) jack_midiin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_jack_midiin_port_free(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* check initialized */ g_rec_mutex_lock(jack_midiin_mutex); if((AGS_JACK_MIDIIN_INITIALIZED & (jack_midiin->flags)) == 0){ g_rec_mutex_unlock(jack_midiin_mutex); return; } callback_mutex = &(jack_midiin->callback_mutex); callback_finish_mutex = &(jack_midiin->callback_finish_mutex); jack_midiin->flags &= (~(AGS_JACK_MIDIIN_BUFFER0 | AGS_JACK_MIDIIN_BUFFER1 | AGS_JACK_MIDIIN_BUFFER2 | AGS_JACK_MIDIIN_BUFFER3 | AGS_JACK_MIDIIN_RECORD)); g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_PASS_THROUGH); g_atomic_int_and(&(jack_midiin->sync_flags), (~AGS_JACK_MIDIIN_INITIAL_CALLBACK)); g_rec_mutex_unlock(jack_midiin_mutex); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_CALLBACK_DONE); if((AGS_JACK_MIDIIN_CALLBACK_WAIT & (g_atomic_int_get(&(jack_midiin->sync_flags)))) != 0){ g_cond_signal(&(jack_midiin->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(jack_midiin->sync_flags), AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE); if((AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_midiin->sync_flags)))) != 0){ g_cond_signal(&(jack_midiin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ g_rec_mutex_lock(jack_midiin_mutex); if(jack_midiin->buffer[1] != NULL){ free(jack_midiin->buffer[1]); jack_midiin->buffer_size[1] = 0; } if(jack_midiin->buffer[2] != NULL){ free(jack_midiin->buffer[2]); jack_midiin->buffer_size[2] = 0; } if(jack_midiin->buffer[3] != NULL){ free(jack_midiin->buffer[3]); jack_midiin->buffer_size[3] = 0; } if(jack_midiin->buffer[0] != NULL){ free(jack_midiin->buffer[0]); jack_midiin->buffer_size[0] = 0; } jack_midiin->note_offset = jack_midiin->start_note_offset; jack_midiin->note_offset_absolute = jack_midiin->start_note_offset; g_rec_mutex_unlock(jack_midiin_mutex); } void ags_jack_midiin_tic(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; gdouble delay; gdouble delay_counter; guint note_offset; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* determine if attack should be switched */ g_rec_mutex_lock(jack_midiin_mutex); delay = jack_midiin->delay; delay_counter = jack_midiin->delay_counter; note_offset = jack_midiin->note_offset; g_rec_mutex_unlock(jack_midiin_mutex); if(delay_counter + 1.0 >= delay){ ags_sequencer_set_note_offset(sequencer, note_offset + 1); /* delay */ ags_sequencer_offset_changed(sequencer, note_offset); /* reset - delay counter */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->delay_counter = delay_counter + 1.0 - delay; jack_midiin->tact_counter += 1.0; g_rec_mutex_unlock(jack_midiin_mutex); }else{ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->delay_counter += 1.0; g_rec_mutex_unlock(jack_midiin_mutex); } } void ags_jack_midiin_offset_changed(AgsSequencer *sequencer, guint note_offset) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* offset changed */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->tic_counter += 1; if(jack_midiin->tic_counter == AGS_SEQUENCER_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ jack_midiin->tic_counter = 0; } g_rec_mutex_unlock(jack_midiin_mutex); } void ags_jack_midiin_set_bpm(AgsSequencer *sequencer, gdouble bpm) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* set bpm */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->bpm = bpm; g_rec_mutex_unlock(jack_midiin_mutex); } gdouble ags_jack_midiin_get_bpm(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; gdouble bpm; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* get bpm */ g_rec_mutex_lock(jack_midiin_mutex); bpm = jack_midiin->bpm; g_rec_mutex_unlock(jack_midiin_mutex); return(bpm); } void ags_jack_midiin_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* set delay factor */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->delay_factor = delay_factor; g_rec_mutex_unlock(jack_midiin_mutex); } gdouble ags_jack_midiin_get_delay_factor(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; gdouble delay_factor; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack_midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* get delay factor */ g_rec_mutex_lock(jack_midiin_mutex); delay_factor = jack_midiin->delay_factor; g_rec_mutex_unlock(jack_midiin_mutex); return(delay_factor); } void* ags_jack_midiin_get_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsJackMidiin *jack_midiin; char *buffer; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get buffer */ if((AGS_JACK_MIDIIN_BUFFER0 & (jack_midiin->flags)) != 0){ buffer = jack_midiin->buffer[0]; }else if((AGS_JACK_MIDIIN_BUFFER1 & (jack_midiin->flags)) != 0){ buffer = jack_midiin->buffer[1]; }else if((AGS_JACK_MIDIIN_BUFFER2 & (jack_midiin->flags)) != 0){ buffer = jack_midiin->buffer[2]; }else if((AGS_JACK_MIDIIN_BUFFER3 & (jack_midiin->flags)) != 0){ buffer = jack_midiin->buffer[3]; }else{ buffer = NULL; } /* return the buffer's length */ if(buffer_length != NULL){ if((AGS_JACK_MIDIIN_BUFFER0 & (jack_midiin->flags)) != 0){ *buffer_length = jack_midiin->buffer_size[0]; }else if((AGS_JACK_MIDIIN_BUFFER1 & (jack_midiin->flags)) != 0){ *buffer_length = jack_midiin->buffer_size[1]; }else if((AGS_JACK_MIDIIN_BUFFER2 & (jack_midiin->flags)) != 0){ *buffer_length = jack_midiin->buffer_size[2]; }else if((AGS_JACK_MIDIIN_BUFFER3 & (jack_midiin->flags)) != 0){ *buffer_length = jack_midiin->buffer_size[3]; }else{ *buffer_length = 0; } } return(buffer); } void* ags_jack_midiin_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsJackMidiin *jack_midiin; char *buffer; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get buffer */ if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER0)){ buffer = jack_midiin->buffer[1]; }else if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER1)){ buffer = jack_midiin->buffer[2]; }else if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER2)){ buffer = jack_midiin->buffer[3]; }else if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER3)){ buffer = jack_midiin->buffer[0]; }else{ buffer = NULL; } /* return the buffer's length */ if(buffer_length != NULL){ if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER0)){ *buffer_length = jack_midiin->buffer_size[1]; }else if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER1)){ *buffer_length = jack_midiin->buffer_size[2]; }else if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER2)){ *buffer_length = jack_midiin->buffer_size[3]; }else if(ags_jack_midiin_test_flags(jack_midiin, AGS_JACK_MIDIIN_BUFFER3)){ *buffer_length = jack_midiin->buffer_size[0]; }else{ *buffer_length = 0; } } return(buffer); } void ags_jack_midiin_lock_buffer(AgsSequencer *sequencer, void *buffer) { AgsJackMidiin *jack_midiin; GRecMutex *buffer_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); buffer_mutex = NULL; if(jack_midiin->buffer != NULL){ if(buffer == jack_midiin->buffer[0]){ buffer_mutex = jack_midiin->buffer_mutex[0]; }else if(buffer == jack_midiin->buffer[1]){ buffer_mutex = jack_midiin->buffer_mutex[1]; }else if(buffer == jack_midiin->buffer[2]){ buffer_mutex = jack_midiin->buffer_mutex[2]; }else if(buffer == jack_midiin->buffer[3]){ buffer_mutex = jack_midiin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_jack_midiin_unlock_buffer(AgsSequencer *sequencer, void *buffer) { AgsJackMidiin *jack_midiin; GRecMutex *buffer_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); buffer_mutex = NULL; if(jack_midiin->buffer != NULL){ if(buffer == jack_midiin->buffer[0]){ buffer_mutex = jack_midiin->buffer_mutex[0]; }else if(buffer == jack_midiin->buffer[1]){ buffer_mutex = jack_midiin->buffer_mutex[1]; }else if(buffer == jack_midiin->buffer[2]){ buffer_mutex = jack_midiin->buffer_mutex[2]; }else if(buffer == jack_midiin->buffer[3]){ buffer_mutex = jack_midiin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } void ags_jack_midiin_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* set note offset */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->start_note_offset = start_note_offset; g_rec_mutex_unlock(jack_midiin_mutex); } guint ags_jack_midiin_get_start_note_offset(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; guint start_note_offset; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* set note offset */ g_rec_mutex_lock(jack_midiin_mutex); start_note_offset = jack_midiin->start_note_offset; g_rec_mutex_unlock(jack_midiin_mutex); return(start_note_offset); } void ags_jack_midiin_set_note_offset(AgsSequencer *sequencer, guint note_offset) { AgsJackMidiin *jack_midiin; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* set note offset */ g_rec_mutex_lock(jack_midiin_mutex); jack_midiin->note_offset = note_offset; g_rec_mutex_unlock(jack_midiin_mutex); } guint ags_jack_midiin_get_note_offset(AgsSequencer *sequencer) { AgsJackMidiin *jack_midiin; guint note_offset; GRecMutex *jack_midiin_mutex; jack_midiin = AGS_JACK_MIDIIN(sequencer); /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* set note offset */ g_rec_mutex_lock(jack_midiin_mutex); note_offset = jack_midiin->note_offset; g_rec_mutex_unlock(jack_midiin_mutex); return(note_offset); } /** * ags_jack_midiin_switch_buffer_flag: * @jack_midiin: the #AgsJackMidiin * * The buffer flag indicates the currently recorded buffer. * * Since: 3.0.0 */ void ags_jack_midiin_switch_buffer_flag(AgsJackMidiin *jack_midiin) { GRecMutex *jack_midiin_mutex; if(!AGS_IS_JACK_MIDIIN(jack_midiin)){ return; } /* get jack midiin mutex */ jack_midiin_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(jack_midiin); /* switch buffer flag */ g_rec_mutex_lock(jack_midiin_mutex); if((AGS_JACK_MIDIIN_BUFFER0 & (jack_midiin->flags)) != 0){ jack_midiin->flags &= (~AGS_JACK_MIDIIN_BUFFER0); jack_midiin->flags |= AGS_JACK_MIDIIN_BUFFER1; /* clear buffer */ if(jack_midiin->buffer[3] != NULL){ free(jack_midiin->buffer[3]); } jack_midiin->buffer[3] = NULL; jack_midiin->buffer_size[3] = 0; }else if((AGS_JACK_MIDIIN_BUFFER1 & (jack_midiin->flags)) != 0){ jack_midiin->flags &= (~AGS_JACK_MIDIIN_BUFFER1); jack_midiin->flags |= AGS_JACK_MIDIIN_BUFFER2; /* clear buffer */ if(jack_midiin->buffer[0] != NULL){ free(jack_midiin->buffer[0]); } jack_midiin->buffer[0] = NULL; jack_midiin->buffer_size[0] = 0; }else if((AGS_JACK_MIDIIN_BUFFER2 & (jack_midiin->flags)) != 0){ jack_midiin->flags &= (~AGS_JACK_MIDIIN_BUFFER2); jack_midiin->flags |= AGS_JACK_MIDIIN_BUFFER3; /* clear buffer */ if(jack_midiin->buffer[1] != NULL){ free(jack_midiin->buffer[1]); } jack_midiin->buffer[1] = NULL; jack_midiin->buffer_size[1] = 0; }else if((AGS_JACK_MIDIIN_BUFFER3 & (jack_midiin->flags)) != 0){ jack_midiin->flags &= (~AGS_JACK_MIDIIN_BUFFER3); jack_midiin->flags |= AGS_JACK_MIDIIN_BUFFER0; /* clear buffer */ if(jack_midiin->buffer[2] != NULL){ free(jack_midiin->buffer[2]); } jack_midiin->buffer[2] = NULL; jack_midiin->buffer_size[2] = 0; } g_rec_mutex_unlock(jack_midiin_mutex); } /** * ags_jack_midiin_new: * * Creates a new instance of #AgsJackMidiin. * * Returns: the new #AgsJackMidiin * * Since: 3.0.0 */ AgsJackMidiin* ags_jack_midiin_new() { AgsJackMidiin *jack_midiin; jack_midiin = (AgsJackMidiin *) g_object_new(AGS_TYPE_JACK_MIDIIN, NULL); return(jack_midiin); } gsequencer-3.1.3/ags/audio/jack/ags_jack_server.c0000644000175000017500000014204413613101164016660 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_jack_server_class_init(AgsJackServerClass *jack_server); void ags_jack_server_connectable_interface_init(AgsConnectableInterface *connectable); void ags_jack_server_sound_server_interface_init(AgsSoundServerInterface *sound_server); void ags_jack_server_init(AgsJackServer *jack_server); void ags_jack_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_jack_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_jack_server_dispose(GObject *gobject); void ags_jack_server_finalize(GObject *gobject); AgsUUID* ags_jack_server_get_uuid(AgsConnectable *connectable); gboolean ags_jack_server_has_resource(AgsConnectable *connectable); gboolean ags_jack_server_is_ready(AgsConnectable *connectable); void ags_jack_server_add_to_registry(AgsConnectable *connectable); void ags_jack_server_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_jack_server_list_resource(AgsConnectable *connectable); xmlNode* ags_jack_server_xml_compose(AgsConnectable *connectable); void ags_jack_server_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_jack_server_is_connected(AgsConnectable *connectable); void ags_jack_server_connect(AgsConnectable *connectable); void ags_jack_server_disconnect(AgsConnectable *connectable); void ags_jack_server_set_url(AgsSoundServer *sound_server, gchar *url); gchar* ags_jack_server_get_url(AgsSoundServer *sound_server); void ags_jack_server_set_ports(AgsSoundServer *sound_server, guint *ports, guint port_count); guint* ags_jack_server_get_ports(AgsSoundServer *sound_server, guint *port_count); void ags_jack_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard); GList* ags_jack_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid); void ags_jack_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer); GList* ags_jack_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid); GObject* ags_jack_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output); void ags_jack_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard); GObject* ags_jack_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output); void ags_jack_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer); /** * SECTION:ags_jack_server * @short_description: JACK instance * @title: AgsJackServer * @section_id: * @include: ags/audio/jack/ags_jack_server.h * * The #AgsJackServer is an object to represent a running JACK instance. */ enum{ PROP_0, PROP_URL, PROP_DEFAULT_SOUNDCARD, PROP_DEFAULT_JACK_CLIENT, PROP_INPUT_JACK_CLIENT, PROP_JACK_CLIENT, }; static gpointer ags_jack_server_parent_class = NULL; GType ags_jack_server_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_jack_server = 0; static const GTypeInfo ags_jack_server_info = { sizeof(AgsJackServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_jack_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsJackServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_jack_server_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_jack_server_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_server_interface_info = { (GInterfaceInitFunc) ags_jack_server_sound_server_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_jack_server = g_type_register_static(G_TYPE_OBJECT, "AgsJackServer", &ags_jack_server_info, 0); g_type_add_interface_static(ags_type_jack_server, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_jack_server, AGS_TYPE_SOUND_SERVER, &ags_sound_server_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_jack_server); } return g_define_type_id__volatile; } void ags_jack_server_class_init(AgsJackServerClass *jack_server) { GObjectClass *gobject; GParamSpec *param_spec; ags_jack_server_parent_class = g_type_class_peek_parent(jack_server); /* GObjectClass */ gobject = (GObjectClass *) jack_server; gobject->set_property = ags_jack_server_set_property; gobject->get_property = ags_jack_server_get_property; gobject->dispose = ags_jack_server_dispose; gobject->finalize = ags_jack_server_finalize; /* properties */ /** * AgsJackServer:url: * * The assigned URL. * * Since: 3.0.0 */ param_spec = g_param_spec_string("url", i18n_pspec("the URL"), i18n_pspec("The URL"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URL, param_spec); /** * AgsJackServer:default-soundcard: * * The default soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-soundcard", i18n_pspec("default soundcard"), i18n_pspec("The default soundcard"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_SOUNDCARD, param_spec); /** * AgsJackServer:default-jack-client: * * The default jack client. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-jack-client", i18n_pspec("default jack client"), i18n_pspec("The default jack client"), AGS_TYPE_JACK_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_JACK_CLIENT, param_spec); /** * AgsJackServer:input-jack-client: * * The input jack client. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-jack-client", i18n_pspec("input jack client"), i18n_pspec("The input jack client"), AGS_TYPE_JACK_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_JACK_CLIENT, param_spec); /** * AgsJackServer:jack-client: (type GList(AgsJackClient)) (transfer full) * * The jack client list. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("jack-client", i18n_pspec("jack client list"), i18n_pspec("The jack client list"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_CLIENT, param_spec); } void ags_jack_server_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_jack_server_get_uuid; connectable->has_resource = ags_jack_server_has_resource; connectable->is_ready = ags_jack_server_is_ready; connectable->add_to_registry = ags_jack_server_add_to_registry; connectable->remove_from_registry = ags_jack_server_remove_from_registry; connectable->list_resource = ags_jack_server_list_resource; connectable->xml_compose = ags_jack_server_xml_compose; connectable->xml_parse = ags_jack_server_xml_parse; connectable->is_connected = ags_jack_server_is_connected; connectable->connect = ags_jack_server_connect; connectable->disconnect = ags_jack_server_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_jack_server_sound_server_interface_init(AgsSoundServerInterface *sound_server) { sound_server->set_url = ags_jack_server_set_url; sound_server->get_url = ags_jack_server_get_url; sound_server->set_ports = ags_jack_server_set_ports; sound_server->get_ports = ags_jack_server_get_ports; sound_server->set_soundcard = ags_jack_server_set_soundcard; sound_server->get_soundcard = ags_jack_server_get_soundcard; sound_server->set_sequencer = ags_jack_server_set_sequencer; sound_server->get_sequencer = ags_jack_server_get_sequencer; sound_server->register_soundcard = ags_jack_server_register_soundcard; sound_server->unregister_soundcard = ags_jack_server_unregister_soundcard; sound_server->register_sequencer = ags_jack_server_register_sequencer; sound_server->unregister_sequencer = ags_jack_server_unregister_sequencer; } void ags_jack_server_init(AgsJackServer *jack_server) { /* flags */ jack_server->flags = 0; /* server mutex */ g_rec_mutex_init(&(jack_server->obj_mutex)); /* uuid */ jack_server->uuid = ags_uuid_alloc(); ags_uuid_generate(jack_server->uuid); /* fields */ jack_server->url = g_strdup_printf("%s://%s:%d", AGS_JACK_SERVER_DEFAULT_PROTOCOL, AGS_JACK_SERVER_DEFAULT_HOST, AGS_JACK_SERVER_DEFAULT_PORT); // jack_server->jackctl = jackctl_server_create(NULL, // NULL); jack_server->port = NULL; jack_server->port_count = 0; jack_server->n_soundcards = 0; jack_server->n_sequencers = 0; jack_server->default_soundcard = NULL; jack_server->default_client = NULL; jack_server->input_client = NULL; jack_server->client = NULL; } void ags_jack_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsJackServer *jack_server; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(gobject); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); switch(prop_id){ case PROP_URL: { gchar *url; url = g_value_get_string(value); g_rec_mutex_lock(jack_server_mutex); if(jack_server->url == url){ g_rec_mutex_unlock(jack_server_mutex); return; } if(jack_server->url != NULL){ g_free(jack_server->url); } jack_server->url = g_strdup(url); g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { GObject *default_soundcard; default_soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(jack_server_mutex); if(jack_server->default_soundcard == (GObject *) default_soundcard){ g_rec_mutex_unlock(jack_server_mutex); return; } if(jack_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(jack_server->default_soundcard)); } if(default_soundcard != NULL){ g_object_ref(G_OBJECT(default_soundcard)); } jack_server->default_soundcard = (GObject *) default_soundcard; g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_DEFAULT_JACK_CLIENT: { AgsJackClient *default_client; default_client = (AgsJackClient *) g_value_get_object(value); g_rec_mutex_lock(jack_server_mutex); if(jack_server->default_client == (GObject *) default_client){ g_rec_mutex_unlock(jack_server_mutex); return; } if(jack_server->default_client != NULL){ g_object_unref(G_OBJECT(jack_server->default_client)); } if(default_client != NULL){ g_object_ref(G_OBJECT(default_client)); } jack_server->default_client = (GObject *) default_client; g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_INPUT_JACK_CLIENT: { AgsJackClient *input_client; input_client = (AgsJackClient *) g_value_get_object(value); g_rec_mutex_lock(jack_server_mutex); if(jack_server->input_client == (GObject *) input_client){ g_rec_mutex_unlock(jack_server_mutex); return; } if(jack_server->input_client != NULL){ g_object_unref(G_OBJECT(jack_server->input_client)); } if(input_client != NULL){ g_object_ref(G_OBJECT(input_client)); } jack_server->input_client = (GObject *) input_client; g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_JACK_CLIENT: { GObject *client; client = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(jack_server_mutex); if(!AGS_IS_JACK_CLIENT(client) || g_list_find(jack_server->client, client) != NULL){ g_rec_mutex_unlock(jack_server_mutex); return; } g_object_ref(G_OBJECT(client)); jack_server->client = g_list_prepend(jack_server->client, client); g_rec_mutex_unlock(jack_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsJackServer *jack_server; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(gobject); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); switch(prop_id){ case PROP_URL: { g_rec_mutex_lock(jack_server_mutex); g_value_set_string(value, jack_server->url); g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { g_rec_mutex_lock(jack_server_mutex); g_value_set_object(value, jack_server->default_soundcard); g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_DEFAULT_JACK_CLIENT: { g_rec_mutex_lock(jack_server_mutex); g_value_set_object(value, jack_server->default_client); g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_INPUT_JACK_CLIENT: { g_rec_mutex_lock(jack_server_mutex); g_value_set_object(value, jack_server->input_client); g_rec_mutex_unlock(jack_server_mutex); } break; case PROP_JACK_CLIENT: { g_rec_mutex_lock(jack_server_mutex); g_value_set_pointer(value, g_list_copy_deep(jack_server->client, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(jack_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_server_dispose(GObject *gobject) { AgsJackServer *jack_server; GList *list; jack_server = AGS_JACK_SERVER(gobject); /* default soundcard */ if(jack_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(jack_server->default_soundcard)); jack_server->default_soundcard = NULL; } /* default client */ if(jack_server->default_client != NULL){ g_object_unref(G_OBJECT(jack_server->default_client)); jack_server->default_client = NULL; } /* input client */ if(jack_server->input_client != NULL){ g_object_unref(G_OBJECT(jack_server->input_client)); jack_server->input_client = NULL; } /* client */ if(jack_server->client != NULL){ list = jack_server->client; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(jack_server->client, g_object_unref); jack_server->client = NULL; } /* call parent */ G_OBJECT_CLASS(ags_jack_server_parent_class)->dispose(gobject); } void ags_jack_server_finalize(GObject *gobject) { AgsJackServer *jack_server; jack_server = AGS_JACK_SERVER(gobject); /* url */ g_free(jack_server->url); /* default soundcard */ if(jack_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(jack_server->default_soundcard)); } /* default client */ if(jack_server->default_client != NULL){ g_object_unref(G_OBJECT(jack_server->default_client)); } /* input client */ if(jack_server->input_client != NULL){ g_object_unref(G_OBJECT(jack_server->input_client)); } /* client */ if(jack_server->client != NULL){ g_list_free_full(jack_server->client, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_jack_server_parent_class)->finalize(gobject); } AgsUUID* ags_jack_server_get_uuid(AgsConnectable *connectable) { AgsJackServer *jack_server; AgsUUID *ptr; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(connectable); /* get jack server signal mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get UUID */ g_rec_mutex_lock(jack_server_mutex); ptr = jack_server->uuid; g_rec_mutex_unlock(jack_server_mutex); return(ptr); } gboolean ags_jack_server_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_jack_server_is_ready(AgsConnectable *connectable) { AgsJackServer *jack_server; gboolean is_ready; jack_server = AGS_JACK_SERVER(connectable); /* check is added */ is_ready = ags_jack_server_test_flags(jack_server, AGS_JACK_SERVER_ADDED_TO_REGISTRY); return(is_ready); } void ags_jack_server_add_to_registry(AgsConnectable *connectable) { AgsJackServer *jack_server; if(ags_connectable_is_ready(connectable)){ return; } jack_server = AGS_JACK_SERVER(connectable); ags_jack_server_set_flags(jack_server, AGS_JACK_SERVER_ADDED_TO_REGISTRY); } void ags_jack_server_remove_from_registry(AgsConnectable *connectable) { AgsJackServer *jack_server; if(!ags_connectable_is_ready(connectable)){ return; } jack_server = AGS_JACK_SERVER(connectable); ags_jack_server_unset_flags(jack_server, AGS_JACK_SERVER_ADDED_TO_REGISTRY); } xmlNode* ags_jack_server_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_jack_server_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_jack_server_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_jack_server_is_connected(AgsConnectable *connectable) { AgsJackServer *jack_server; gboolean is_connected; jack_server = AGS_JACK_SERVER(connectable); /* check is connected */ is_connected = ags_jack_server_test_flags(jack_server, AGS_JACK_SERVER_CONNECTED); return(is_connected); } void ags_jack_server_connect(AgsConnectable *connectable) { AgsJackServer *jack_server; GList *list_start, *list; GRecMutex *jack_server_mutex; if(ags_connectable_is_connected(connectable)){ return; } jack_server = AGS_JACK_SERVER(connectable); ags_jack_server_set_flags(jack_server, AGS_JACK_SERVER_CONNECTED); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); list = list_start = g_list_copy(jack_server->client); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_jack_server_disconnect(AgsConnectable *connectable) { AgsJackServer *jack_server; GList *list_start, *list; GRecMutex *jack_server_mutex; if(!ags_connectable_is_connected(connectable)){ return; } jack_server = AGS_JACK_SERVER(connectable); ags_jack_server_unset_flags(jack_server, AGS_JACK_SERVER_CONNECTED); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* client */ list = list_start = g_list_copy(jack_server->client); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_jack_server_test_flags: * @jack_server: the #AgsJackServer * @flags: the flags * * Test @flags to be set on @jack_server. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_jack_server_test_flags(AgsJackServer *jack_server, guint flags) { gboolean retval; GRecMutex *jack_server_mutex; if(!AGS_IS_JACK_SERVER(jack_server)){ return(FALSE); } /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* test */ g_rec_mutex_lock(jack_server_mutex); retval = (flags & (jack_server->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_server_mutex); return(retval); } /** * ags_jack_server_set_flags: * @jack_server: the #AgsJackServer * @flags: see #AgsJackServerFlags-enum * * Enable a feature of @jack_server. * * Since: 3.0.0 */ void ags_jack_server_set_flags(AgsJackServer *jack_server, guint flags) { GRecMutex *jack_server_mutex; if(!AGS_IS_JACK_SERVER(jack_server)){ return; } /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(jack_server_mutex); jack_server->flags |= flags; g_rec_mutex_unlock(jack_server_mutex); } /** * ags_jack_server_unset_flags: * @jack_server: the #AgsJackServer * @flags: see #AgsJackServerFlags-enum * * Disable a feature of @jack_server. * * Since: 3.0.0 */ void ags_jack_server_unset_flags(AgsJackServer *jack_server, guint flags) { GRecMutex *jack_server_mutex; if(!AGS_IS_JACK_SERVER(jack_server)){ return; } /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(jack_server_mutex); jack_server->flags &= (~flags); g_rec_mutex_unlock(jack_server_mutex); } void ags_jack_server_set_url(AgsSoundServer *sound_server, gchar *url) { AgsJackServer *jack_server; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(sound_server); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* set URL */ g_rec_mutex_lock(jack_server_mutex); jack_server->url = g_strdup(url); g_rec_mutex_unlock(jack_server_mutex); } gchar* ags_jack_server_get_url(AgsSoundServer *sound_server) { AgsJackServer *jack_server; gchar *url; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(sound_server); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* set URL */ g_rec_mutex_lock(jack_server_mutex); url = jack_server->url; g_rec_mutex_unlock(jack_server_mutex); return(url); } void ags_jack_server_set_ports(AgsSoundServer *sound_server, guint *port, guint port_count) { AgsJackServer *jack_server; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(sound_server); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* set ports */ g_rec_mutex_lock(jack_server_mutex); jack_server->port = port; jack_server->port_count = port_count; g_rec_mutex_unlock(jack_server_mutex); } guint* ags_jack_server_get_ports(AgsSoundServer *sound_server, guint *port_count) { AgsJackServer *jack_server; guint *port; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(sound_server); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get ports */ g_rec_mutex_lock(jack_server_mutex); if(port_count != NULL){ *port_count = AGS_JACK_SERVER(sound_server)->port_count; } port = jack_server->port; g_rec_mutex_unlock(jack_server_mutex); return(port); } void ags_jack_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard) { AgsJackServer *jack_server; AgsJackClient *jack_client; GList *list; jack_server = AGS_JACK_SERVER(sound_server); jack_client = (AgsJackClient *) ags_jack_server_find_client(jack_server, client_uuid); if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } //NOTE:JK: soundcard won't removed list = soundcard; while(list != NULL){ ags_jack_client_add_device(jack_client, (GObject *) list->data); list = list->next; } } GList* ags_jack_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid) { AgsJackServer *jack_server; AgsJackClient *jack_client; GList *device_start, *device; GList *list; jack_server = AGS_JACK_SERVER(sound_server); jack_client = (AgsJackClient *) ags_jack_server_find_client(jack_server, client_uuid); if(!AGS_IS_JACK_CLIENT(jack_client)){ return(NULL); } g_object_get(jack_client, "device", &device_start, NULL); device = device_start; list = NULL; while(device != NULL){ if(AGS_IS_JACK_DEVOUT(device->data) || AGS_IS_JACK_DEVIN(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } g_list_free_full(device_start, g_object_unref); return(g_list_reverse(list)); } void ags_jack_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer) { AgsJackServer *jack_server; AgsJackClient *jack_client; GList *list; jack_server = AGS_JACK_SERVER(sound_server); jack_client = (AgsJackClient *) ags_jack_server_find_client(jack_server, client_uuid); if(!AGS_IS_JACK_CLIENT(jack_client)){ return; } //NOTE:JK: sequencer won't removed list = sequencer; while(list != NULL){ ags_jack_client_add_device(jack_client, (GObject *) list->data); list = list->next; } } GList* ags_jack_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid) { AgsJackServer *jack_server; AgsJackClient *jack_client; GList *device_start, *device; GList *list; jack_server = AGS_JACK_SERVER(sound_server); jack_client = (AgsJackClient *) ags_jack_server_find_client(jack_server, client_uuid); if(!AGS_IS_JACK_CLIENT(jack_client)){ return(NULL); } g_object_get(jack_client, "device", &device_start, NULL); device = device_start; list = NULL; while(device != NULL){ if(AGS_IS_JACK_MIDIIN(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } g_list_free_full(device_start, g_object_unref); return(g_list_reverse(list)); } GObject* ags_jack_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output) { AgsJackServer *jack_server; AgsJackClient *jack_client; AgsJackClient *default_client; AgsJackClient *input_client; AgsJackPort *jack_port; AgsJackDevout *jack_devout; AgsJackDevin *jack_devin; AgsApplicationContext *application_context; GObject *soundcard; #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif gchar *str; guint n_soundcards; gboolean initial_set; int rc; guint i; GRecMutex *jack_server_mutex; GRecMutex *jack_client_mutex; jack_server = AGS_JACK_SERVER(sound_server); application_context = ags_application_context_get_instance(); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* the default client */ initial_set = FALSE; /* get some fields */ g_rec_mutex_lock(jack_server_mutex); jack_client = default_client = (AgsJackClient *) jack_server->default_client; input_client = (AgsJackClient *) jack_server->input_client; n_soundcards = jack_server->n_soundcards; g_rec_mutex_unlock(jack_server_mutex); if(!is_output && input_client != NULL){ jack_client = input_client; } if(jack_client == NULL){ jack_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "default-jack-client", jack_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) jack_client); ags_jack_client_open((AgsJackClient *) jack_client, "ags-default-client"); initial_set = TRUE; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); if(client == NULL){ g_warning("ags_jack_server.c - can't open JACK client"); } /* the soundcard */ soundcard = NULL; if(is_output){ jack_devout = ags_jack_devout_new(); soundcard = (GObject *) jack_devout; str = g_strdup_printf("ags-jack-devout-%d", n_soundcards); g_object_set(AGS_JACK_DEVOUT(jack_devout), "jack-client", jack_client, "device", str, NULL); g_free(str); #ifdef AGS_WITH_JACK if(initial_set && client != NULL){ rc = jack_set_buffer_size(client, jack_devout->buffer_size); if(rc != 0){ g_message("%s", strerror(rc)); } } #endif /* register ports */ for(i = 0; i < jack_devout->pcm_channels; i++){ str = g_strdup_printf("ags%d-%04d", n_soundcards, i); #ifdef AGS_DEBUG g_message("%s %x", str, jack_client); #endif jack_port = ags_jack_port_new((GObject *) jack_client); ags_jack_client_add_port(jack_client, (GObject *) jack_port); g_object_set(jack_devout, "jack-port", jack_port, NULL); if(jack_devout->port_name == NULL){ jack_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); jack_devout->port_name[0] = g_strdup(str); }else{ jack_devout->port_name = (gchar **) realloc(jack_devout->port_name, (i + 2) * sizeof(gchar *)); jack_devout->port_name[i] = g_strdup(str); } ags_jack_port_register(jack_port, str, TRUE, FALSE, TRUE); g_free(str); } if(jack_devout->port_name != NULL){ jack_devout->port_name[jack_devout->pcm_channels] = NULL; } ags_jack_devout_realloc_buffer(jack_devout); g_object_set(jack_client, "device", jack_devout, NULL); /* increment n-soundcards */ g_rec_mutex_lock(jack_server_mutex); jack_server->n_soundcards += 1; g_rec_mutex_unlock(jack_server_mutex); }else{ jack_devin = ags_jack_devin_new(); soundcard = (GObject *) jack_devin; str = g_strdup_printf("ags-jack-devin-%d", n_soundcards); g_object_set(AGS_JACK_DEVIN(jack_devin), "jack-client", jack_client, "device", str, NULL); g_free(str); #ifdef AGS_WITH_JACK if(initial_set && client != NULL){ rc = jack_set_buffer_size(client, jack_devin->buffer_size); if(rc != 0){ g_message("%s", strerror(rc)); } } #endif /* register ports */ for(i = 0; i < jack_devin->pcm_channels; i++){ str = g_strdup_printf("ags%d-%04d", n_soundcards, i); #ifdef AGS_DEBUG g_message("%s %x", str, jack_client); #endif jack_port = ags_jack_port_new((GObject *) jack_client); ags_jack_client_add_port(jack_client, (GObject *) jack_port); g_object_set(jack_devin, "jack-port", jack_port, NULL); if(jack_devin->port_name == NULL){ jack_devin->port_name = (gchar **) malloc(2 * sizeof(gchar *)); jack_devin->port_name[0] = g_strdup(str); }else{ jack_devin->port_name = (gchar **) realloc(jack_devin->port_name, (i + 2) * sizeof(gchar *)); jack_devin->port_name[i] = g_strdup(str); } ags_jack_port_register(jack_port, str, TRUE, FALSE, FALSE); g_free(str); } if(jack_devin->port_name != NULL){ jack_devin->port_name[jack_devin->pcm_channels] = NULL; } ags_jack_devin_realloc_buffer(jack_devin); g_object_set(jack_client, "device", jack_devin, NULL); /* increment n-soundcards */ g_rec_mutex_lock(jack_server_mutex); jack_server->n_soundcards += 1; g_rec_mutex_unlock(jack_server_mutex); } return(soundcard); } void ags_jack_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard) { AgsJackServer *jack_server; AgsJackClient *jack_client; AgsJackClient *default_client; AgsJackClient *input_client; GList *list_start, *list; GList *port; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(sound_server); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); jack_client = default_client = (AgsJackClient *) jack_server->default_client; input_client = (AgsJackClient *) jack_server->input_client; g_rec_mutex_unlock(jack_server_mutex); if(AGS_IS_JACK_DEVIN(soundcard) && input_client != NULL){ jack_client = input_client; } if(jack_client == NULL){ g_warning("GSequencer - no jack client"); return; } if(AGS_IS_JACK_DEVOUT(soundcard)){ g_object_get(soundcard, "jack-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_jack_port_unregister(list->data); ags_jack_client_remove_port(jack_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if(AGS_IS_JACK_DEVIN(soundcard)){ g_object_get(soundcard, "jack-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_jack_port_unregister(list->data); ags_jack_client_remove_port(jack_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); } ags_jack_client_remove_device(jack_client, soundcard); g_object_get(default_client, "port", &port, NULL); if(port == NULL){ g_object_get(input_client, "port", &port, NULL); if(port == NULL){ /* reset n-soundcards */ g_rec_mutex_lock(jack_server_mutex); jack_server->n_soundcards = 0; g_rec_mutex_unlock(jack_server_mutex); }else{ g_list_free_full(port, g_object_unref); } }else{ g_list_free_full(port, g_object_unref); } } GObject* ags_jack_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output) { AgsJackServer *jack_server; AgsJackClient *jack_client; AgsJackClient *default_client; AgsJackClient *input_client; AgsJackPort *jack_port; AgsJackMidiin *jack_midiin; AgsApplicationContext *application_context; #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif gchar *str; guint n_sequencers; GRecMutex *jack_server_mutex; GRecMutex *jack_client_mutex; if(is_output){ g_warning("GSequencer - MIDI output not implemented"); return(NULL); } jack_server = AGS_JACK_SERVER(sound_server); application_context = ags_application_context_get_instance(); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); jack_client = default_client = (AgsJackClient *) jack_server->default_client; input_client = (AgsJackClient *) jack_server->input_client; n_sequencers = jack_server->n_sequencers; g_rec_mutex_unlock(jack_server_mutex); if(!is_output && input_client != NULL){ jack_client = input_client; } /* the jack client */ if(jack_client == NULL){ jack_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "default-jack-client", jack_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) jack_client); ags_jack_client_open((AgsJackClient *) jack_client, "ags-default-client"); } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); if(client == NULL){ g_warning("ags_jack_server.c - can't open JACK client"); } jack_midiin = ags_jack_midiin_new(application_context); str = g_strdup_printf("ags-jack-midiin-%d", n_sequencers); g_object_set(AGS_JACK_MIDIIN(jack_midiin), "jack-client", jack_client, "device", str, NULL); g_free(str); /* register sequencer */ jack_port = ags_jack_port_new((GObject *) jack_client); ags_jack_client_add_port(jack_client, (GObject *) jack_port); g_object_set(jack_midiin, "jack-port", jack_port, NULL); str = g_strdup_printf("ags-sequencer%d", jack_server->n_sequencers); #ifdef AGS_DEBUG g_message("%s", str); #endif ags_jack_port_register(jack_port, str, FALSE, TRUE, FALSE); g_object_set(jack_client, "device", jack_midiin, NULL); /* increment n-sequencers */ g_rec_mutex_lock(jack_server_mutex); jack_server->n_sequencers += 1; g_rec_mutex_unlock(jack_server_mutex); return((GObject *) jack_midiin); } void ags_jack_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer) { AgsJackServer *jack_server; AgsJackClient *jack_client; AgsJackClient *input_client; AgsJackClient *default_client; GList *list_start, *list; GList *port; GRecMutex *jack_server_mutex; jack_server = AGS_JACK_SERVER(sound_server); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); jack_client = default_client = (AgsJackClient *) jack_server->default_client; input_client = (AgsJackClient *) jack_server->input_client; g_rec_mutex_unlock(jack_server_mutex); if(AGS_IS_JACK_MIDIIN(sequencer) && input_client != NULL){ jack_client = input_client; } if(jack_client == NULL){ g_warning("GSequencer - no jack client"); return; } g_object_get(sequencer, "jack-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_jack_port_unregister(list->data); ags_jack_client_remove_port(jack_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); ags_jack_client_remove_device(jack_client, sequencer); g_object_get(default_client, "port", &port, NULL); if(port == NULL){ g_object_get(input_client, "port", &port, NULL); if(port == NULL){ /* reset n-sequencers */ g_rec_mutex_lock(jack_server_mutex); jack_server->n_sequencers = 0; g_rec_mutex_unlock(jack_server_mutex); }else{ g_list_free_full(port, g_object_unref); } }else{ g_list_free_full(port, g_object_unref); } } /** * ags_jack_server_register_default_soundcard: * @jack_server: the #AgsJackServer * * Register default soundcard. * * Returns: the instantiated #AgsJackDevout * * Since: 3.0.0 */ GObject* ags_jack_server_register_default_soundcard(AgsJackServer *jack_server) { AgsJackClient *default_client; AgsJackDevout *jack_devout; AgsJackPort *jack_port; AgsApplicationContext *application_context; #ifdef AGS_WITH_JACK jack_client_t *client; #else gpointer client; #endif gchar *str; guint n_soundcards; guint i; int rc; GRecMutex *jack_server_mutex; GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_SERVER(jack_server)){ return(NULL); } application_context = ags_application_context_get_instance(); /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); default_client = (AgsJackClient *) jack_server->default_client; n_soundcards = jack_server->n_soundcards; g_rec_mutex_unlock(jack_server_mutex); /* the default client */ if(default_client == NULL){ default_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "default-jack-client", default_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) default_client); ags_jack_client_open((AgsJackClient *) default_client, "ags-default-client"); } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(default_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = default_client->client; g_rec_mutex_unlock(jack_client_mutex); if(client == NULL){ g_warning("ags_jack_server.c - can't open JACK client"); } /* the soundcard */ jack_devout = ags_jack_devout_new(); g_object_set(AGS_JACK_DEVOUT(jack_devout), "jack-client", default_client, "device", "ags-default-devout", NULL); #ifdef AGS_WITH_JACK if(default_client->client != NULL){ rc = jack_set_buffer_size(client, jack_devout->buffer_size); if(rc != 0){ g_message("%s", strerror(rc)); } } #endif /* register ports */ for(i = 0; i < jack_devout->pcm_channels; i++){ jack_port = ags_jack_port_new((GObject *) default_client); ags_jack_client_add_port(default_client, (GObject *) jack_port); g_object_set(jack_devout, "jack-port", jack_port, NULL); str = g_strdup_printf("ags-default-soundcard-%04d", i); #ifdef AGS_DEBUG g_message("%s", str); #endif if(jack_devout->port_name == NULL){ jack_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); jack_devout->port_name[0] = g_strdup(str); }else{ jack_devout->port_name = (gchar **) realloc(jack_devout->port_name, (i + 2) * sizeof(gchar *)); jack_devout->port_name[i] = g_strdup(str); } ags_jack_port_register(jack_port, str, TRUE, FALSE, TRUE); } if(jack_devout->port_name != NULL){ jack_devout->port_name[jack_devout->pcm_channels] = NULL; } g_object_set(default_client, "device", jack_devout, NULL); return((GObject *) jack_devout); } /** * ags_jack_server_find_url: * @jack_server: (element-type AgsAudio.JackServer) (transfer none): the #GList-struct containing #AgsJackServer * @url: the url to find * * Find #AgsJackServer by url. * * Returns: (element-type AgsAudio.JackServer) (transfer none): the #GList-struct containing a #AgsJackServer matching @url or %NULL * * Since: 3.0.0 */ GList* ags_jack_server_find_url(GList *jack_server, gchar *url) { GList *retval; GRecMutex *jack_server_mutex; retval = NULL; while(jack_server != NULL){ /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server->data); /* check URL */ g_rec_mutex_lock(jack_server_mutex); if(!g_ascii_strcasecmp(AGS_JACK_SERVER(jack_server->data)->url, url)){ retval = jack_server; g_rec_mutex_unlock(jack_server_mutex); break; } g_rec_mutex_unlock(jack_server_mutex); jack_server = jack_server->next; } return(retval); } /** * ags_jack_server_find_client: * @jack_server: the #AgsJackServer * @client_uuid: the uuid to find * * Find #AgsJackClient by uuid. * * Returns: (transfer none): the #AgsJackClient found or %NULL * * Since: 3.0.0 */ GObject* ags_jack_server_find_client(AgsJackServer *jack_server, gchar *client_uuid) { AgsJackClient *retval; GList *list_start, *list; GRecMutex *jack_server_mutex; GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_SERVER(jack_server)){ return(NULL); } /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); list = list_start = g_list_copy(jack_server->client); g_rec_mutex_unlock(jack_server_mutex); retval = NULL; while(list != NULL){ /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(list->data); /* check client UUID */ g_rec_mutex_lock(jack_client_mutex); if(!g_ascii_strcasecmp(AGS_JACK_CLIENT(list->data)->client_uuid, client_uuid)){ retval = list->data; g_rec_mutex_unlock(jack_client_mutex); break; } g_rec_mutex_unlock(jack_client_mutex); list = list->next; } g_list_free(list_start); return((GObject *) retval); } /** * ags_jack_server_find_port: * @jack_server: the #AgsJackServer * @port_uuid: the uuid to find * * Find #AgsJackPort by uuid. * * Returns: (transfer none): the #AgsJackPort found or %NULL * * Since: 3.0.0 */ GObject* ags_jack_server_find_port(AgsJackServer *jack_server, gchar *port_uuid) { GList *client_start, *client; GList *port_start, *port; gboolean success; GRecMutex *jack_port_mutex; g_object_get(jack_server, "jack-client", &client_start, NULL); client = client_start; while(client != NULL){ g_object_get(jack_server, "jack-port", &port_start, NULL); port = port_start; while(port != NULL){ /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(port->data); /* check port UUID */ g_rec_mutex_lock(jack_port_mutex); success = (!g_ascii_strcasecmp(AGS_JACK_PORT(port->data)->port_uuid, port_uuid)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_port_mutex); if(success){ AgsJackPort *retval; retval = port->data; g_list_free_full(client_start, g_object_unref); g_list_free_full(port_start, g_object_unref); return(retval); } /* iterate */ port = port->next; } g_list_free_full(port_start, g_object_unref); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); return(NULL); } /** * ags_jack_server_add_client: * @jack_server: the #AgsJackServer * @jack_client: the #AgsJackClient to add * * Add @jack_client to @jack_server * * Since: 3.0.0 */ void ags_jack_server_add_client(AgsJackServer *jack_server, GObject *jack_client) { GRecMutex *jack_server_mutex; if(!AGS_IS_JACK_SERVER(jack_server) || !AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); if(g_list_find(jack_server->client, jack_client) == NULL){ g_object_ref(jack_client); jack_server->client = g_list_prepend(jack_server->client, jack_client); } g_rec_mutex_unlock(jack_server_mutex); } /** * ags_jack_server_remove_client: * @jack_server: the #AgsJackServer * @jack_client: the #AgsJackClient to remove * * Remove @jack_client to @jack_server * * Since: 3.0.0 */ void ags_jack_server_remove_client(AgsJackServer *jack_server, GObject *jack_client) { GRecMutex *jack_server_mutex; if(!AGS_IS_JACK_SERVER(jack_server) || !AGS_IS_JACK_CLIENT(jack_client)){ return; } /* get jack server mutex */ jack_server_mutex = AGS_JACK_SERVER_GET_OBJ_MUTEX(jack_server); /* get some fields */ g_rec_mutex_lock(jack_server_mutex); if(g_list_find(jack_server->client, jack_client) != NULL){ jack_server->client = g_list_remove(jack_server->client, jack_client); g_object_unref(jack_client); } g_rec_mutex_unlock(jack_server_mutex); } /** * ags_jack_server_connect_client: * @jack_server: the #AgsJackServer * * Connect all clients. * * Since: 3.0.0 */ void ags_jack_server_connect_client(AgsJackServer *jack_server) { GList *client_start, *client; gchar *client_name; GRecMutex *jack_client_mutex; if(!AGS_IS_JACK_SERVER(jack_server)){ return; } g_object_get(jack_server, "jack-client", &client_start, NULL); client = client_start; while(client != NULL){ /* client name */ g_object_get(client->data, "client-name", &client_name, NULL); /* open */ ags_jack_client_open((AgsJackClient *) client->data, client_name); ags_jack_client_activate(client->data); g_free(client_name); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); } /** * ags_jack_server_disconnect_client: * @jack_server: the #AgsJackServer * * Connect all clients. * * Since: 3.0.0 */ void ags_jack_server_disconnect_client(AgsJackServer *jack_server) { GList *client_start, *client; if(!AGS_IS_JACK_SERVER(jack_server)){ return; } g_object_get(jack_server, "jack-client", &client_start, NULL); client = client_start; while(client != NULL){ /* close */ ags_jack_client_deactivate(client->data); ags_jack_client_close((AgsJackClient *) client->data); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); } /** * ags_jack_server_new: * @url: the URL as string * * Create a new instance of #AgsJackServer. * * Returns: the new #AgsJackServer * * Since: 3.0.0 */ AgsJackServer* ags_jack_server_new(gchar *url) { AgsJackServer *jack_server; jack_server = (AgsJackServer *) g_object_new(AGS_TYPE_JACK_SERVER, "url", url, NULL); return(jack_server); } gsequencer-3.1.3/ags/audio/jack/ags_jack_devin.h0000644000175000017500000001354613607210263016474 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_JACK_DEVIN_H__ #define __AGS_JACK_DEVIN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_JACK_DEVIN (ags_jack_devin_get_type()) #define AGS_JACK_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_JACK_DEVIN, AgsJackDevin)) #define AGS_JACK_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_JACK_DEVIN, AgsJackDevin)) #define AGS_IS_JACK_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_JACK_DEVIN)) #define AGS_IS_JACK_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_JACK_DEVIN)) #define AGS_JACK_DEVIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_JACK_DEVIN, AgsJackDevinClass)) #define AGS_JACK_DEVIN_GET_OBJ_MUTEX(obj) (&(((AgsJackDevin *) obj)->obj_mutex)) typedef struct _AgsJackDevin AgsJackDevin; typedef struct _AgsJackDevinClass AgsJackDevinClass; /** * AgsJackDevinFlags: * @AGS_JACK_DEVIN_ADDED_TO_REGISTRY: the JACK devin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_JACK_DEVIN_CONNECTED: indicates the JACK devin was connected by calling #AgsConnectable::connect() * @AGS_JACK_DEVIN_BUFFER0: ring-buffer 0 * @AGS_JACK_DEVIN_BUFFER1: ring-buffer 1 * @AGS_JACK_DEVIN_BUFFER2: ring-buffer 2 * @AGS_JACK_DEVIN_BUFFER3: ring-buffer 3 * @AGS_JACK_DEVIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_JACK_DEVIN_RECORD: do capture * @AGS_JACK_DEVIN_SHUTDOWN: stop capture * @AGS_JACK_DEVIN_START_RECORD: capture starting * @AGS_JACK_DEVIN_NONBLOCKING: do non-blocking calls * @AGS_JACK_DEVIN_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsJackDevin by * enable/disable as flags. */ typedef enum{ AGS_JACK_DEVIN_ADDED_TO_REGISTRY = 1, AGS_JACK_DEVIN_CONNECTED = 1 << 1, AGS_JACK_DEVIN_BUFFER0 = 1 << 2, AGS_JACK_DEVIN_BUFFER1 = 1 << 3, AGS_JACK_DEVIN_BUFFER2 = 1 << 4, AGS_JACK_DEVIN_BUFFER3 = 1 << 5, AGS_JACK_DEVIN_ATTACK_FIRST = 1 << 6, AGS_JACK_DEVIN_RECORD = 1 << 7, AGS_JACK_DEVIN_SHUTDOWN = 1 << 6, AGS_JACK_DEVIN_START_RECORD = 1 << 8, AGS_JACK_DEVIN_NONBLOCKING = 1 << 9, AGS_JACK_DEVIN_INITIALIZED = 1 << 10, }AgsJackDevinFlags; /** * AgsJackDevinSyncFlags: * @AGS_JACK_DEVIN_PASS_THROUGH: do not sync * @AGS_JACK_DEVIN_INITIAL_CALLBACK: initial callback * @AGS_JACK_DEVIN_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_JACK_DEVIN_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_JACK_DEVIN_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_JACK_DEVIN_PASS_THROUGH = 1, AGS_JACK_DEVIN_INITIAL_CALLBACK = 1 << 1, AGS_JACK_DEVIN_CALLBACK_WAIT = 1 << 2, AGS_JACK_DEVIN_CALLBACK_DONE = 1 << 3, AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT = 1 << 4, AGS_JACK_DEVIN_CALLBACK_FINISH_DONE = 1 << 5, }AgsJackDevinSyncFlags; #define AGS_JACK_DEVIN_ERROR (ags_jack_devin_error_quark()) typedef enum{ AGS_JACK_DEVIN_ERROR_LOCKED_SOUNDCARD, }AgsJackDevinError; struct _AgsJackDevin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; void** buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *jack_client; gchar **port_name; GList *jack_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsJackDevinClass { GObjectClass gobject; }; GType ags_jack_devin_get_type(); GQuark ags_jack_devin_error_quark(); gboolean ags_jack_devin_test_flags(AgsJackDevin *jack_devin, guint flags); void ags_jack_devin_set_flags(AgsJackDevin *jack_devin, guint flags); void ags_jack_devin_unset_flags(AgsJackDevin *jack_devin, guint flags); void ags_jack_devin_switch_buffer_flag(AgsJackDevin *jack_devin); void ags_jack_devin_adjust_delay_and_attack(AgsJackDevin *jack_devin); void ags_jack_devin_realloc_buffer(AgsJackDevin *jack_devin); AgsJackDevin* ags_jack_devin_new(); G_END_DECLS #endif /*__AGS_JACK_DEVIN_H__*/ gsequencer-3.1.3/ags/audio/jack/ags_jack_devout.h0000644000175000017500000001377313607210263016677 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_JACK_DEVOUT_H__ #define __AGS_JACK_DEVOUT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_JACK_DEVOUT (ags_jack_devout_get_type()) #define AGS_JACK_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_JACK_DEVOUT, AgsJackDevout)) #define AGS_JACK_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_JACK_DEVOUT, AgsJackDevout)) #define AGS_IS_JACK_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_JACK_DEVOUT)) #define AGS_IS_JACK_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_JACK_DEVOUT)) #define AGS_JACK_DEVOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_JACK_DEVOUT, AgsJackDevoutClass)) #define AGS_JACK_DEVOUT_GET_OBJ_MUTEX(obj) (&(((AgsJackDevout *) obj)->obj_mutex)) typedef struct _AgsJackDevout AgsJackDevout; typedef struct _AgsJackDevoutClass AgsJackDevoutClass; /** * AgsJackDevoutFlags: * @AGS_JACK_DEVOUT_ADDED_TO_REGISTRY: the JACK devout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_JACK_DEVOUT_CONNECTED: indicates the JACK devout was connected by calling #AgsConnectable::connect() * @AGS_JACK_DEVOUT_BUFFER0: ring-buffer 0 * @AGS_JACK_DEVOUT_BUFFER1: ring-buffer 1 * @AGS_JACK_DEVOUT_BUFFER2: ring-buffer 2 * @AGS_JACK_DEVOUT_BUFFER3: ring-buffer 3 * @AGS_JACK_DEVOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_JACK_DEVOUT_PLAY: do playback * @AGS_JACK_DEVOUT_SHUTDOWN: stop playback * @AGS_JACK_DEVOUT_START_PLAY: playback starting * @AGS_JACK_DEVOUT_NONBLOCKING: do non-blocking calls * @AGS_JACK_DEVOUT_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsJackDevout by * enable/disable as flags. */ typedef enum{ AGS_JACK_DEVOUT_ADDED_TO_REGISTRY = 1, AGS_JACK_DEVOUT_CONNECTED = 1 << 1, AGS_JACK_DEVOUT_BUFFER0 = 1 << 2, AGS_JACK_DEVOUT_BUFFER1 = 1 << 3, AGS_JACK_DEVOUT_BUFFER2 = 1 << 4, AGS_JACK_DEVOUT_BUFFER3 = 1 << 5, AGS_JACK_DEVOUT_ATTACK_FIRST = 1 << 6, AGS_JACK_DEVOUT_PLAY = 1 << 7, AGS_JACK_DEVOUT_SHUTDOWN = 1 << 8, AGS_JACK_DEVOUT_START_PLAY = 1 << 9, AGS_JACK_DEVOUT_NONBLOCKING = 1 << 10, AGS_JACK_DEVOUT_INITIALIZED = 1 << 11, }AgsJackDevoutFlags; /** * AgsJackDevoutSyncFlags: * @AGS_JACK_DEVOUT_PASS_THROUGH: do not sync * @AGS_JACK_DEVOUT_INITIAL_CALLBACK: initial callback * @AGS_JACK_DEVOUT_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_JACK_DEVOUT_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_JACK_DEVOUT_PASS_THROUGH = 1, AGS_JACK_DEVOUT_INITIAL_CALLBACK = 1 << 1, AGS_JACK_DEVOUT_CALLBACK_WAIT = 1 << 2, AGS_JACK_DEVOUT_CALLBACK_DONE = 1 << 3, AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT = 1 << 4, AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE = 1 << 5, }AgsJackDevoutSyncFlags; #define AGS_JACK_DEVOUT_ERROR (ags_jack_devout_error_quark()) typedef enum{ AGS_JACK_DEVOUT_ERROR_LOCKED_SOUNDCARD, }AgsJackDevoutError; struct _AgsJackDevout { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void** buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *jack_client; gchar **port_name; GList *jack_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsJackDevoutClass { GObjectClass gobject; }; GType ags_jack_devout_get_type(); GQuark ags_jack_devout_error_quark(); gboolean ags_jack_devout_test_flags(AgsJackDevout *jack_devout, guint flags); void ags_jack_devout_set_flags(AgsJackDevout *jack_devout, guint flags); void ags_jack_devout_unset_flags(AgsJackDevout *jack_devout, guint flags); void ags_jack_devout_switch_buffer_flag(AgsJackDevout *jack_devout); void ags_jack_devout_adjust_delay_and_attack(AgsJackDevout *jack_devout); void ags_jack_devout_realloc_buffer(AgsJackDevout *jack_devout); AgsJackDevout* ags_jack_devout_new(); G_END_DECLS #endif /*__AGS_JACK_DEVOUT_H__*/ gsequencer-3.1.3/ags/audio/jack/ags_jack_port.h0000644000175000017500000000710113607210263016341 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_JACK_PORT_H__ #define __AGS_JACK_PORT_H__ #include #include #include #ifdef AGS_WITH_JACK #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_JACK_PORT (ags_jack_port_get_type()) #define AGS_JACK_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_JACK_PORT, AgsJackPort)) #define AGS_JACK_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_JACK_PORT, AgsJackPort)) #define AGS_IS_JACK_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_JACK_PORT)) #define AGS_IS_JACK_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_JACK_PORT)) #define AGS_JACK_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_JACK_PORT, AgsJackPortClass)) #define AGS_JACK_PORT_GET_OBJ_MUTEX(obj) (&(((AgsJackPort *) obj)->obj_mutex)) typedef struct _AgsJackPort AgsJackPort; typedef struct _AgsJackPortClass AgsJackPortClass; /** * AgsJackPortFlags: * @AGS_JACK_PORT_ADDED_TO_REGISTRY: the JACK port was added to registry, see #AgsConnectable::add_to_registry() * @AGS_JACK_PORT_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_JACK_PORT_REGISTERED: the port was registered * @AGS_JACK_PORT_IS_AUDIO: the port provides audio data * @AGS_JACK_PORT_IS_MIDI: the port provides midi data * @AGS_JACK_PORT_IS_OUTPUT: the port does output * @AGS_JACK_PORT_IS_INPUT: the port does input * * Enum values to control the behavior or indicate internal state of #AgsJackPort by * enable/disable as flags. */ typedef enum{ AGS_JACK_PORT_ADDED_TO_REGISTRY = 1, AGS_JACK_PORT_CONNECTED = 1 << 1, AGS_JACK_PORT_REGISTERED = 1 << 2, AGS_JACK_PORT_IS_AUDIO = 1 << 3, AGS_JACK_PORT_IS_MIDI = 1 << 4, AGS_JACK_PORT_IS_OUTPUT = 1 << 5, AGS_JACK_PORT_IS_INPUT = 1 << 6, }AgsJackPortFlags; struct _AgsJackPort { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *jack_client; AgsUUID *uuid; gchar *port_uuid; gchar *port_name; #ifdef AGS_WITH_JACK jack_port_t *port; #else gpointer port; #endif }; struct _AgsJackPortClass { GObjectClass gobject; }; GType ags_jack_port_get_type(); gboolean ags_jack_port_test_flags(AgsJackPort *jack_port, guint flags); void ags_jack_port_set_flags(AgsJackPort *jack_port, guint flags); void ags_jack_port_unset_flags(AgsJackPort *jack_port, guint flags); GList* ags_jack_port_find(GList *jack_port, gchar *port_name); void ags_jack_port_register(AgsJackPort *jack_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output); void ags_jack_port_unregister(AgsJackPort *jack_port); AgsJackPort* ags_jack_port_new(GObject *jack_client); G_END_DECLS #endif /*__AGS_JACK_PORT_H__*/ gsequencer-3.1.3/ags/audio/jack/ags_jack_devout.c0000644000175000017500000023335013607210264016666 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_jack_devout_class_init(AgsJackDevoutClass *jack_devout); void ags_jack_devout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_jack_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_jack_devout_init(AgsJackDevout *jack_devout); void ags_jack_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_jack_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_jack_devout_dispose(GObject *gobject); void ags_jack_devout_finalize(GObject *gobject); AgsUUID* ags_jack_devout_get_uuid(AgsConnectable *connectable); gboolean ags_jack_devout_has_resource(AgsConnectable *connectable); gboolean ags_jack_devout_is_ready(AgsConnectable *connectable); void ags_jack_devout_add_to_registry(AgsConnectable *connectable); void ags_jack_devout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_jack_devout_list_resource(AgsConnectable *connectable); xmlNode* ags_jack_devout_xml_compose(AgsConnectable *connectable); void ags_jack_devout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_jack_devout_is_connected(AgsConnectable *connectable); void ags_jack_devout_connect(AgsConnectable *connectable); void ags_jack_devout_disconnect(AgsConnectable *connectable); void ags_jack_devout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_jack_devout_get_device(AgsSoundcard *soundcard); void ags_jack_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_jack_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_jack_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_jack_devout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_jack_devout_get_capability(AgsSoundcard *soundcard); gboolean ags_jack_devout_is_starting(AgsSoundcard *soundcard); gboolean ags_jack_devout_is_playing(AgsSoundcard *soundcard); gchar* ags_jack_devout_get_uptime(AgsSoundcard *soundcard); void ags_jack_devout_port_init(AgsSoundcard *soundcard, GError **error); void ags_jack_devout_port_play(AgsSoundcard *soundcard, GError **error); void ags_jack_devout_port_free(AgsSoundcard *soundcard); void ags_jack_devout_tic(AgsSoundcard *soundcard); void ags_jack_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_jack_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_jack_devout_get_bpm(AgsSoundcard *soundcard); void ags_jack_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_jack_devout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_jack_devout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_jack_devout_get_delay(AgsSoundcard *soundcard); guint ags_jack_devout_get_attack(AgsSoundcard *soundcard); void* ags_jack_devout_get_buffer(AgsSoundcard *soundcard); void* ags_jack_devout_get_next_buffer(AgsSoundcard *soundcard); void* ags_jack_devout_get_prev_buffer(AgsSoundcard *soundcard); void ags_jack_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_jack_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_jack_devout_get_delay_counter(AgsSoundcard *soundcard); void ags_jack_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_jack_devout_get_start_note_offset(AgsSoundcard *soundcard); void ags_jack_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_jack_devout_get_note_offset(AgsSoundcard *soundcard); void ags_jack_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_jack_devout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_jack_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_jack_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_jack_devout_get_loop_offset(AgsSoundcard *soundcard); guint ags_jack_devout_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_jack_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_jack_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); /** * SECTION:ags_jack_devout * @short_description: Output to soundcard * @title: AgsJackDevout * @section_id: * @include: ags/audio/jack/ags_jack_devout.h * * #AgsJackDevout represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_JACK_CLIENT, PROP_JACK_PORT, }; static gpointer ags_jack_devout_parent_class = NULL; GType ags_jack_devout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_jack_devout = 0; static const GTypeInfo ags_jack_devout_info = { sizeof(AgsJackDevoutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_jack_devout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsJackDevout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_jack_devout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_jack_devout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_jack_devout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_jack_devout = g_type_register_static(G_TYPE_OBJECT, "AgsJackDevout", &ags_jack_devout_info, 0); g_type_add_interface_static(ags_type_jack_devout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_jack_devout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_jack_devout); } return g_define_type_id__volatile; } void ags_jack_devout_class_init(AgsJackDevoutClass *jack_devout) { GObjectClass *gobject; GParamSpec *param_spec; ags_jack_devout_parent_class = g_type_class_peek_parent(jack_devout); /* GObjectClass */ gobject = (GObjectClass *) jack_devout; gobject->set_property = ags_jack_devout_set_property; gobject->get_property = ags_jack_devout_get_property; gobject->dispose = ags_jack_devout_dispose; gobject->finalize = ags_jack_devout_finalize; /* properties */ /** * AgsJackDevout:device: * * The jack soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-jack-devout-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsJackDevout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), AGS_SOUNDCARD_MIN_DSP_CHANNELS, AGS_SOUNDCARD_MAX_DSP_CHANNELS, AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsJackDevout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), AGS_SOUNDCARD_MIN_PCM_CHANNELS, AGS_SOUNDCARD_MAX_PCM_CHANNELS, AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsJackDevout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsJackDevout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), AGS_SOUNDCARD_MIN_BUFFER_SIZE, AGS_SOUNDCARD_MAX_BUFFER_SIZE, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsJackDevout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), AGS_SOUNDCARD_MIN_SAMPLERATE, AGS_SOUNDCARD_MAX_SAMPLERATE, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsJackDevout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsJackDevout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsJackDevout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsJackDevout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsJackDevout:jack-client: * * The assigned #AgsJackClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("jack-client", i18n_pspec("jack client object"), i18n_pspec("The jack client object"), AGS_TYPE_JACK_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_CLIENT, param_spec); /** * AgsJackDevout:jack-port: * * The assigned #AgsJackPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("jack-port", i18n_pspec("jack port object"), i18n_pspec("The jack port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_PORT, param_spec); } GQuark ags_jack_devout_error_quark() { return(g_quark_from_static_string("ags-jack_devout-error-quark")); } void ags_jack_devout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_jack_devout_get_uuid; connectable->has_resource = ags_jack_devout_has_resource; connectable->is_ready = ags_jack_devout_is_ready; connectable->add_to_registry = ags_jack_devout_add_to_registry; connectable->remove_from_registry = ags_jack_devout_remove_from_registry; connectable->list_resource = ags_jack_devout_list_resource; connectable->xml_compose = ags_jack_devout_xml_compose; connectable->xml_parse = ags_jack_devout_xml_parse; connectable->is_connected = ags_jack_devout_is_connected; connectable->connect = ags_jack_devout_connect; connectable->disconnect = ags_jack_devout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_jack_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_jack_devout_set_device; soundcard->get_device = ags_jack_devout_get_device; soundcard->set_presets = ags_jack_devout_set_presets; soundcard->get_presets = ags_jack_devout_get_presets; soundcard->list_cards = ags_jack_devout_list_cards; soundcard->pcm_info = ags_jack_devout_pcm_info; soundcard->get_capability = ags_jack_devout_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_jack_devout_is_starting; soundcard->is_playing = ags_jack_devout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_jack_devout_get_uptime; soundcard->play_init = ags_jack_devout_port_init; soundcard->play = ags_jack_devout_port_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_jack_devout_port_free; soundcard->tic = ags_jack_devout_tic; soundcard->offset_changed = ags_jack_devout_offset_changed; soundcard->set_bpm = ags_jack_devout_set_bpm; soundcard->get_bpm = ags_jack_devout_get_bpm; soundcard->set_delay_factor = ags_jack_devout_set_delay_factor; soundcard->get_delay_factor = ags_jack_devout_get_delay_factor; soundcard->get_absolute_delay = ags_jack_devout_get_absolute_delay; soundcard->get_delay = ags_jack_devout_get_delay; soundcard->get_attack = ags_jack_devout_get_attack; soundcard->get_buffer = ags_jack_devout_get_buffer; soundcard->get_next_buffer = ags_jack_devout_get_next_buffer; soundcard->get_prev_buffer = ags_jack_devout_get_prev_buffer; soundcard->lock_buffer = ags_jack_devout_lock_buffer; soundcard->unlock_buffer = ags_jack_devout_unlock_buffer; soundcard->get_delay_counter = ags_jack_devout_get_delay_counter; soundcard->set_start_note_offset = ags_jack_devout_set_start_note_offset; soundcard->get_start_note_offset = ags_jack_devout_get_start_note_offset; soundcard->set_note_offset = ags_jack_devout_set_note_offset; soundcard->get_note_offset = ags_jack_devout_get_note_offset; soundcard->set_note_offset_absolute = ags_jack_devout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_jack_devout_get_note_offset_absolute; soundcard->set_loop = ags_jack_devout_set_loop; soundcard->get_loop = ags_jack_devout_get_loop; soundcard->get_loop_offset = ags_jack_devout_get_loop_offset; soundcard->get_sub_block_count = ags_jack_devout_get_sub_block_count; soundcard->trylock_sub_block = ags_jack_devout_trylock_sub_block; soundcard->unlock_sub_block = ags_jack_devout_unlock_sub_block; } void ags_jack_devout_init(AgsJackDevout *jack_devout) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ jack_devout->flags = 0; g_atomic_int_set(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_PASS_THROUGH); /* devout mutex */ g_rec_mutex_init(&(jack_devout->obj_mutex)); /* uuid */ jack_devout->uuid = ags_uuid_alloc(); ags_uuid_generate(jack_devout->uuid); /* presets */ config = ags_config_get_instance(); jack_devout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); jack_devout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); jack_devout->samplerate = ags_soundcard_helper_config_get_samplerate(config); jack_devout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); jack_devout->format = ags_soundcard_helper_config_get_format(config); /* */ jack_devout->card_uri = NULL; jack_devout->jack_client = NULL; jack_devout->port_name = NULL; jack_devout->jack_port = NULL; /* buffer */ jack_devout->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ jack_devout->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(jack_devout->buffer_mutex[i]); } jack_devout->sub_block_count = AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT; jack_devout->sub_block_mutex = (GRecMutex **) malloc(4 * jack_devout->sub_block_count * jack_devout->pcm_channels * sizeof(GRecMutex *)); for(i = 0; i < 4 * jack_devout->sub_block_count * jack_devout->pcm_channels; i++){ jack_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(jack_devout->sub_block_mutex[i]); } jack_devout->buffer = (void **) malloc(4 * sizeof(void*)); jack_devout->buffer[0] = NULL; jack_devout->buffer[1] = NULL; jack_devout->buffer[2] = NULL; jack_devout->buffer[3] = NULL; ags_jack_devout_realloc_buffer(jack_devout); /* bpm */ jack_devout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ jack_devout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); jack_devout->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ jack_devout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); jack_devout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_jack_devout_adjust_delay_and_attack(jack_devout); /* counters */ jack_devout->tact_counter = 0.0; jack_devout->delay_counter = 0.0; jack_devout->tic_counter = 0; jack_devout->start_note_offset = 0; jack_devout->note_offset = 0; jack_devout->note_offset_absolute = 0; jack_devout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; jack_devout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; jack_devout->do_loop = FALSE; jack_devout->loop_offset = 0; /* callback mutex */ g_mutex_init(&(jack_devout->callback_mutex)); g_cond_init(&(jack_devout->callback_cond)); /* callback finish mutex */ g_mutex_init(&(jack_devout->callback_finish_mutex)); g_cond_init(&(jack_devout->callback_finish_cond)); } void ags_jack_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(gobject); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(jack_devout_mutex); jack_devout->card_uri = g_strdup(device); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(jack_devout_mutex); if(dsp_channels == jack_devout->dsp_channels){ g_rec_mutex_unlock(jack_devout_mutex); return; } jack_devout->dsp_channels = dsp_channels; g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels, old_pcm_channels; guint i; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(jack_devout_mutex); if(pcm_channels == jack_devout->pcm_channels){ g_rec_mutex_unlock(jack_devout_mutex); return; } old_pcm_channels = jack_devout->pcm_channels; /* destroy if less pcm-channels */ for(i = 4 * jack_devout->sub_block_count * pcm_channels; i < 4 * jack_devout->sub_block_count * old_pcm_channels; i++){ g_rec_mutex_clear(jack_devout->sub_block_mutex[i]); free(jack_devout->sub_block_mutex[i]); } jack_devout->sub_block_mutex = (GRecMutex **) realloc(jack_devout->sub_block_mutex, 4 * jack_devout->sub_block_count * pcm_channels * sizeof(GRecMutex *)); /* create if more pcm-channels */ for(i = 4 * jack_devout->sub_block_count * old_pcm_channels; i < 4 * jack_devout->sub_block_count * pcm_channels; i++){ jack_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(jack_devout->sub_block_mutex[i]); } jack_devout->pcm_channels = pcm_channels; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_realloc_buffer(jack_devout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(jack_devout_mutex); if(format == jack_devout->format){ g_rec_mutex_unlock(jack_devout_mutex); return; } jack_devout->format = format; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_realloc_buffer(jack_devout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(jack_devout_mutex); if(buffer_size == jack_devout->buffer_size){ g_rec_mutex_unlock(jack_devout_mutex); return; } jack_devout->buffer_size = buffer_size; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_realloc_buffer(jack_devout); ags_jack_devout_adjust_delay_and_attack(jack_devout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(jack_devout_mutex); if(samplerate == jack_devout->samplerate){ g_rec_mutex_unlock(jack_devout_mutex); return; } jack_devout->samplerate = samplerate; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_realloc_buffer(jack_devout); ags_jack_devout_adjust_delay_and_attack(jack_devout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(jack_devout_mutex); jack_devout->bpm = bpm; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_adjust_delay_and_attack(jack_devout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(jack_devout_mutex); jack_devout->delay_factor = delay_factor; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_adjust_delay_and_attack(jack_devout); } break; case PROP_JACK_CLIENT: { AgsJackClient *jack_client; jack_client = (AgsJackClient *) g_value_get_object(value); g_rec_mutex_lock(jack_devout_mutex); if(jack_devout->jack_client == (GObject *) jack_client){ g_rec_mutex_unlock(jack_devout_mutex); return; } if(jack_devout->jack_client != NULL){ g_object_unref(G_OBJECT(jack_devout->jack_client)); } if(jack_client != NULL){ g_object_ref(jack_client); } jack_devout->jack_client = (GObject *) jack_client; g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_JACK_PORT: { AgsJackPort *jack_port; jack_port = (AgsJackPort *) g_value_get_pointer(value); g_rec_mutex_lock(jack_devout_mutex); if(!AGS_IS_JACK_PORT(jack_port) || g_list_find(jack_devout->jack_port, jack_port) != NULL){ g_rec_mutex_unlock(jack_devout_mutex); return; } g_object_ref(jack_port); jack_devout->jack_port = g_list_append(jack_devout->jack_port, jack_port); g_rec_mutex_unlock(jack_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(gobject); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_string(value, jack_devout->card_uri); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_uint(value, jack_devout->dsp_channels); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_uint(value, jack_devout->pcm_channels); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_uint(value, jack_devout->format); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_uint(value, jack_devout->buffer_size); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_uint(value, jack_devout->samplerate); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_pointer(value, jack_devout->buffer); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_double(value, jack_devout->bpm); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_double(value, jack_devout->delay_factor); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_pointer(value, jack_devout->attack); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_JACK_CLIENT: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_object(value, jack_devout->jack_client); g_rec_mutex_unlock(jack_devout_mutex); } break; case PROP_JACK_PORT: { g_rec_mutex_lock(jack_devout_mutex); g_value_set_pointer(value, g_list_copy_deep(jack_devout->jack_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(jack_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_devout_dispose(GObject *gobject) { AgsJackDevout *jack_devout; jack_devout = AGS_JACK_DEVOUT(gobject); /* jack client */ if(jack_devout->jack_client != NULL){ g_object_unref(jack_devout->jack_client); jack_devout->jack_client = NULL; } /* jack port */ g_list_free_full(jack_devout->jack_port, g_object_unref); jack_devout->jack_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_jack_devout_parent_class)->dispose(gobject); } void ags_jack_devout_finalize(GObject *gobject) { AgsJackDevout *jack_devout; jack_devout = AGS_JACK_DEVOUT(gobject); /* free output buffer */ free(jack_devout->buffer[0]); free(jack_devout->buffer[1]); free(jack_devout->buffer[2]); free(jack_devout->buffer[3]); /* free buffer array */ free(jack_devout->buffer); /* free AgsAttack */ free(jack_devout->attack); /* jack client */ if(jack_devout->jack_client != NULL){ g_object_unref(jack_devout->jack_client); } /* jack port */ g_list_free_full(jack_devout->jack_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_jack_devout_parent_class)->finalize(gobject); } AgsUUID* ags_jack_devout_get_uuid(AgsConnectable *connectable) { AgsJackDevout *jack_devout; AgsUUID *ptr; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(connectable); /* get jack devout signal mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get UUID */ g_rec_mutex_lock(jack_devout_mutex); ptr = jack_devout->uuid; g_rec_mutex_unlock(jack_devout_mutex); return(ptr); } gboolean ags_jack_devout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_jack_devout_is_ready(AgsConnectable *connectable) { AgsJackDevout *jack_devout; gboolean is_ready; jack_devout = AGS_JACK_DEVOUT(connectable); /* check is added */ is_ready = ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_jack_devout_add_to_registry(AgsConnectable *connectable) { AgsJackDevout *jack_devout; if(ags_connectable_is_ready(connectable)){ return; } jack_devout = AGS_JACK_DEVOUT(connectable); ags_jack_devout_set_flags(jack_devout, AGS_JACK_DEVOUT_ADDED_TO_REGISTRY); } void ags_jack_devout_remove_from_registry(AgsConnectable *connectable) { AgsJackDevout *jack_devout; if(!ags_connectable_is_ready(connectable)){ return; } jack_devout = AGS_JACK_DEVOUT(connectable); ags_jack_devout_unset_flags(jack_devout, AGS_JACK_DEVOUT_ADDED_TO_REGISTRY); } xmlNode* ags_jack_devout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_jack_devout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_jack_devout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_jack_devout_is_connected(AgsConnectable *connectable) { AgsJackDevout *jack_devout; gboolean is_connected; jack_devout = AGS_JACK_DEVOUT(connectable); /* check is connected */ is_connected = ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_CONNECTED); return(is_connected); } void ags_jack_devout_connect(AgsConnectable *connectable) { AgsJackDevout *jack_devout; if(ags_connectable_is_connected(connectable)){ return; } jack_devout = AGS_JACK_DEVOUT(connectable); ags_jack_devout_set_flags(jack_devout, AGS_JACK_DEVOUT_CONNECTED); } void ags_jack_devout_disconnect(AgsConnectable *connectable) { AgsJackDevout *jack_devout; if(!ags_connectable_is_connected(connectable)){ return; } jack_devout = AGS_JACK_DEVOUT(connectable); ags_jack_devout_unset_flags(jack_devout, AGS_JACK_DEVOUT_CONNECTED); } /** * ags_jack_devout_test_flags: * @jack_devout: the #AgsJackDevout * @flags: the flags * * Test @flags to be set on @jack_devout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_jack_devout_test_flags(AgsJackDevout *jack_devout, guint flags) { gboolean retval; GRecMutex *jack_devout_mutex; if(!AGS_IS_JACK_DEVOUT(jack_devout)){ return(FALSE); } /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* test */ g_rec_mutex_lock(jack_devout_mutex); retval = (flags & (jack_devout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_devout_mutex); return(retval); } /** * ags_jack_devout_set_flags: * @jack_devout: the #AgsJackDevout * @flags: see #AgsJackDevoutFlags-enum * * Enable a feature of @jack_devout. * * Since: 3.0.0 */ void ags_jack_devout_set_flags(AgsJackDevout *jack_devout, guint flags) { GRecMutex *jack_devout_mutex; if(!AGS_IS_JACK_DEVOUT(jack_devout)){ return; } /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->flags |= flags; g_rec_mutex_unlock(jack_devout_mutex); } /** * ags_jack_devout_unset_flags: * @jack_devout: the #AgsJackDevout * @flags: see #AgsJackDevoutFlags-enum * * Disable a feature of @jack_devout. * * Since: 3.0.0 */ void ags_jack_devout_unset_flags(AgsJackDevout *jack_devout, guint flags) { GRecMutex *jack_devout_mutex; if(!AGS_IS_JACK_DEVOUT(jack_devout)){ return; } /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->flags &= (~flags); g_rec_mutex_unlock(jack_devout_mutex); } void ags_jack_devout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsJackDevout *jack_devout; GList *jack_port, *jack_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* check device */ g_rec_mutex_lock(jack_devout_mutex); if(jack_devout->card_uri == device || !g_ascii_strcasecmp(jack_devout->card_uri, device)){ g_rec_mutex_unlock(jack_devout_mutex); return; } if(!g_str_has_prefix(device, "ags-jack-devout-")){ g_rec_mutex_unlock(jack_devout_mutex); g_warning("invalid JACK device prefix"); return; } ret = sscanf(device, "ags-jack-devout-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(jack_devout_mutex); g_warning("invalid JACK device specifier"); return; } g_free(jack_devout->card_uri); jack_devout->card_uri = g_strdup(device); /* apply name to port */ g_rec_mutex_unlock(jack_devout_mutex); #if 0 pcm_channels = jack_devout->pcm_channels; jack_port_start = jack_port = g_list_copy(jack_devout->jack_port); for(i = 0; i < pcm_channels && jack_port != NULL; i++){ str = g_strdup_printf("ags%d-%04d", nth_card, i); g_object_set(jack_port->data, "port-name", str, NULL); g_free(str); jack_port = jack_port->next; } g_list_free(jack_port_start); #endif } gchar* ags_jack_devout_get_device(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gchar *device; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); device = NULL; /* get device */ g_rec_mutex_lock(jack_devout_mutex); device = g_strdup(jack_devout->card_uri); g_rec_mutex_unlock(jack_devout_mutex); return(device); } void ags_jack_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsJackDevout *jack_devout; jack_devout = AGS_JACK_DEVOUT(soundcard); g_object_set(jack_devout, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_jack_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get presets */ g_rec_mutex_lock(jack_devout_mutex); if(channels != NULL){ *channels = jack_devout->pcm_channels; } if(rate != NULL){ *rate = jack_devout->samplerate; } if(buffer_size != NULL){ *buffer_size = jack_devout->buffer_size; } if(format != NULL){ *format = jack_devout->format; } g_rec_mutex_unlock(jack_devout_mutex); } void ags_jack_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsJackClient *jack_client; AgsJackDevout *jack_devout; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; jack_devout = AGS_JACK_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_JACK_DEVOUT(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_JACK_DEVOUT(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_jack_devout_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "jack-client", &jack_client, NULL); if(jack_client != NULL){ /* get client name */ g_object_get(jack_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(jack_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_jack_devout_list_cards() - JACK client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_jack_devout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_jack_devout_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_PLAYBACK); } gboolean ags_jack_devout_is_starting(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gboolean is_starting; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* check is starting */ g_rec_mutex_lock(jack_devout_mutex); is_starting = ((AGS_JACK_DEVOUT_START_PLAY & (jack_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_devout_mutex); return(is_starting); } gboolean ags_jack_devout_is_playing(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gboolean is_playing; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* check is starting */ g_rec_mutex_lock(jack_devout_mutex); is_playing = ((AGS_JACK_DEVOUT_PLAY & (jack_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_devout_mutex); return(is_playing); } gchar* ags_jack_devout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_jack_devout_port_init(AgsSoundcard *soundcard, GError **error) { AgsJackDevout *jack_devout; guint format, word_size; GRecMutex *jack_devout_mutex; if(ags_soundcard_is_playing(soundcard)){ return; } jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* retrieve word size */ g_rec_mutex_lock(jack_devout_mutex); switch(jack_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(jack_devout_mutex); g_warning("ags_jack_devout_port_init(): unsupported word size"); return; } /* prepare for playback */ jack_devout->flags |= (AGS_JACK_DEVOUT_BUFFER3 | AGS_JACK_DEVOUT_START_PLAY | AGS_JACK_DEVOUT_PLAY | AGS_JACK_DEVOUT_NONBLOCKING); memset(jack_devout->buffer[0], 0, jack_devout->pcm_channels * jack_devout->buffer_size * word_size); memset(jack_devout->buffer[1], 0, jack_devout->pcm_channels * jack_devout->buffer_size * word_size); memset(jack_devout->buffer[2], 0, jack_devout->pcm_channels * jack_devout->buffer_size * word_size); memset(jack_devout->buffer[3], 0, jack_devout->pcm_channels * jack_devout->buffer_size * word_size); /* */ jack_devout->tact_counter = 0.0; jack_devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(jack_devout))); jack_devout->tic_counter = 0; jack_devout->flags |= (AGS_JACK_DEVOUT_INITIALIZED | AGS_JACK_DEVOUT_START_PLAY | AGS_JACK_DEVOUT_PLAY); g_atomic_int_and(&(jack_devout->sync_flags), (~(AGS_JACK_DEVOUT_PASS_THROUGH))); g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_INITIAL_CALLBACK); g_rec_mutex_unlock(jack_devout_mutex); } void ags_jack_devout_port_play(AgsSoundcard *soundcard, GError **error) { AgsJackClient *jack_client; AgsJackDevout *jack_devout; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean jack_client_activated; GRecMutex *jack_devout_mutex; GRecMutex *jack_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* client */ g_rec_mutex_lock(jack_devout_mutex); jack_client = (AgsJackClient *) jack_devout->jack_client; callback_mutex = &(jack_devout->callback_mutex); callback_finish_mutex = &(jack_devout->callback_finish_mutex); g_rec_mutex_unlock(jack_devout_mutex); /* do playback */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->flags &= (~AGS_JACK_DEVOUT_START_PLAY); if((AGS_JACK_DEVOUT_INITIALIZED & (jack_devout->flags)) == 0){ g_rec_mutex_unlock(jack_devout_mutex); return; } switch(jack_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(jack_devout_mutex); g_warning("ags_jack_devout_port_play(): unsupported word size"); return; } g_rec_mutex_unlock(jack_devout_mutex); /* get client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get activated */ g_rec_mutex_lock(jack_client_mutex); jack_client_activated = ((AGS_JACK_CLIENT_ACTIVATED & (jack_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_client_mutex); if(jack_client_activated){ /* signal */ if((AGS_JACK_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_CALLBACK_DONE); if((AGS_JACK_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(jack_devout->sync_flags)))) != 0){ g_cond_signal(&(jack_devout->callback_cond)); } g_mutex_unlock(callback_mutex); } /* wait callback */ if((AGS_JACK_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0){ g_mutex_lock(callback_finish_mutex); if((AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0){ g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT); while((AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(jack_devout->sync_flags)))) == 0 && (AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_devout->sync_flags)))) != 0){ g_cond_wait(&(jack_devout->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(jack_devout->sync_flags), (~(AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT | AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(jack_devout->sync_flags), (~AGS_JACK_DEVOUT_INITIAL_CALLBACK)); } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) jack_devout); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) jack_devout); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) jack_devout); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_jack_devout_port_free(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint word_size; GRecMutex *jack_devout_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* */ g_rec_mutex_lock(jack_devout_mutex); if((AGS_JACK_DEVOUT_INITIALIZED & (jack_devout->flags)) == 0){ g_rec_mutex_unlock(jack_devout_mutex); return; } // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); callback_mutex = &(jack_devout->callback_mutex); callback_finish_mutex = &(jack_devout->callback_finish_mutex); jack_devout->flags &= (~(AGS_JACK_DEVOUT_BUFFER0 | AGS_JACK_DEVOUT_BUFFER1 | AGS_JACK_DEVOUT_BUFFER2 | AGS_JACK_DEVOUT_BUFFER3 | AGS_JACK_DEVOUT_PLAY)); g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_PASS_THROUGH); g_atomic_int_and(&(jack_devout->sync_flags), (~AGS_JACK_DEVOUT_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_CALLBACK_DONE); if((AGS_JACK_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(jack_devout->sync_flags)))) != 0){ g_cond_signal(&(jack_devout->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(jack_devout->sync_flags), AGS_JACK_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_JACK_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_devout->sync_flags)))) != 0){ g_cond_signal(&(jack_devout->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ jack_devout->note_offset = jack_devout->start_note_offset; jack_devout->note_offset_absolute = jack_devout->start_note_offset; switch(jack_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_jack_devout_free(): unsupported word size"); } memset(jack_devout->buffer[1], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size); memset(jack_devout->buffer[2], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size); memset(jack_devout->buffer[3], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size); memset(jack_devout->buffer[0], 0, (size_t) jack_devout->pcm_channels * jack_devout->buffer_size * word_size); g_rec_mutex_unlock(jack_devout_mutex); } void ags_jack_devout_tic(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* determine if attack should be switched */ g_rec_mutex_lock(jack_devout_mutex); delay = jack_devout->delay[jack_devout->tic_counter]; delay_counter = jack_devout->delay_counter; note_offset = jack_devout->note_offset; note_offset_absolute = jack_devout->note_offset_absolute; loop_left = jack_devout->loop_left; loop_right = jack_devout->loop_right; do_loop = jack_devout->do_loop; g_rec_mutex_unlock(jack_devout_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->delay_counter = delay_counter + 1.0 - delay; jack_devout->tact_counter += 1.0; g_rec_mutex_unlock(jack_devout_mutex); }else{ g_rec_mutex_lock(jack_devout_mutex); jack_devout->delay_counter += 1.0; g_rec_mutex_unlock(jack_devout_mutex); } } void ags_jack_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* offset changed */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->tic_counter += 1; if(jack_devout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ jack_devout->tic_counter = 0; } g_rec_mutex_unlock(jack_devout_mutex); } void ags_jack_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set bpm */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->bpm = bpm; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_adjust_delay_and_attack(jack_devout); } gdouble ags_jack_devout_get_bpm(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gdouble bpm; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get bpm */ g_rec_mutex_lock(jack_devout_mutex); bpm = jack_devout->bpm; g_rec_mutex_unlock(jack_devout_mutex); return(bpm); } void ags_jack_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set delay factor */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->delay_factor = delay_factor; g_rec_mutex_unlock(jack_devout_mutex); ags_jack_devout_adjust_delay_and_attack(jack_devout); } gdouble ags_jack_devout_get_delay_factor(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gdouble delay_factor; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get delay factor */ g_rec_mutex_lock(jack_devout_mutex); delay_factor = jack_devout->delay_factor; g_rec_mutex_unlock(jack_devout_mutex); return(delay_factor); } gdouble ags_jack_devout_get_delay(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint delay_index; gdouble delay; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get delay */ g_rec_mutex_lock(jack_devout_mutex); delay_index = jack_devout->tic_counter; delay = jack_devout->delay[delay_index]; g_rec_mutex_unlock(jack_devout_mutex); return(delay); } gdouble ags_jack_devout_get_absolute_delay(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; gdouble absolute_delay; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get absolute delay */ g_rec_mutex_lock(jack_devout_mutex); absolute_delay = (60.0 * (((gdouble) jack_devout->samplerate / (gdouble) jack_devout->buffer_size) / (gdouble) jack_devout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) jack_devout->delay_factor))); g_rec_mutex_unlock(jack_devout_mutex); return(absolute_delay); } guint ags_jack_devout_get_attack(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint attack_index; guint attack; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get attack */ g_rec_mutex_lock(jack_devout_mutex); attack_index = jack_devout->tic_counter; attack = jack_devout->attack[attack_index]; g_rec_mutex_unlock(jack_devout_mutex); return(attack); } void* ags_jack_devout_get_buffer(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; void *buffer; jack_devout = AGS_JACK_DEVOUT(soundcard); if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER0)){ buffer = jack_devout->buffer[0]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER1)){ buffer = jack_devout->buffer[1]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER2)){ buffer = jack_devout->buffer[2]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER3)){ buffer = jack_devout->buffer[3]; }else{ buffer = NULL; } return(buffer); } void* ags_jack_devout_get_next_buffer(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; void *buffer; jack_devout = AGS_JACK_DEVOUT(soundcard); // g_message("next - 0x%0x", ((AGS_JACK_DEVOUT_BUFFER0 | // AGS_JACK_DEVOUT_BUFFER1 | // AGS_JACK_DEVOUT_BUFFER2 | // AGS_JACK_DEVOUT_BUFFER3) & (jack_devout->flags))); if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER0)){ buffer = jack_devout->buffer[1]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER1)){ buffer = jack_devout->buffer[2]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER2)){ buffer = jack_devout->buffer[3]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER3)){ buffer = jack_devout->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_jack_devout_get_prev_buffer(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; void *buffer; jack_devout = AGS_JACK_DEVOUT(soundcard); if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER0)){ buffer = jack_devout->buffer[3]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER1)){ buffer = jack_devout->buffer[0]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER2)){ buffer = jack_devout->buffer[1]; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER3)){ buffer = jack_devout->buffer[2]; }else{ buffer = NULL; } return(buffer); } void ags_jack_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsJackDevout *jack_devout; GRecMutex *buffer_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); buffer_mutex = NULL; if(jack_devout->buffer != NULL){ if(buffer == jack_devout->buffer[0]){ buffer_mutex = jack_devout->buffer_mutex[0]; }else if(buffer == jack_devout->buffer[1]){ buffer_mutex = jack_devout->buffer_mutex[1]; }else if(buffer == jack_devout->buffer[2]){ buffer_mutex = jack_devout->buffer_mutex[2]; }else if(buffer == jack_devout->buffer[3]){ buffer_mutex = jack_devout->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_jack_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsJackDevout *jack_devout; GRecMutex *buffer_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); buffer_mutex = NULL; if(jack_devout->buffer != NULL){ if(buffer == jack_devout->buffer[0]){ buffer_mutex = jack_devout->buffer_mutex[0]; }else if(buffer == jack_devout->buffer[1]){ buffer_mutex = jack_devout->buffer_mutex[1]; }else if(buffer == jack_devout->buffer[2]){ buffer_mutex = jack_devout->buffer_mutex[2]; }else if(buffer == jack_devout->buffer[3]){ buffer_mutex = jack_devout->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_jack_devout_get_delay_counter(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint delay_counter; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* delay counter */ g_rec_mutex_lock(jack_devout_mutex); delay_counter = jack_devout->delay_counter; g_rec_mutex_unlock(jack_devout_mutex); return(delay_counter); } void ags_jack_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set note offset */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->start_note_offset = start_note_offset; g_rec_mutex_unlock(jack_devout_mutex); } guint ags_jack_devout_get_start_note_offset(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint start_note_offset; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set note offset */ g_rec_mutex_lock(jack_devout_mutex); start_note_offset = jack_devout->start_note_offset; g_rec_mutex_unlock(jack_devout_mutex); return(start_note_offset); } void ags_jack_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set note offset */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->note_offset = note_offset; g_rec_mutex_unlock(jack_devout_mutex); } guint ags_jack_devout_get_note_offset(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint note_offset; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set note offset */ g_rec_mutex_lock(jack_devout_mutex); note_offset = jack_devout->note_offset; g_rec_mutex_unlock(jack_devout_mutex); return(note_offset); } void ags_jack_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set note offset */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(jack_devout_mutex); } guint ags_jack_devout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint note_offset_absolute; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set note offset */ g_rec_mutex_lock(jack_devout_mutex); note_offset_absolute = jack_devout->note_offset_absolute; g_rec_mutex_unlock(jack_devout_mutex); return(note_offset_absolute); } void ags_jack_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* set loop */ g_rec_mutex_lock(jack_devout_mutex); jack_devout->loop_left = loop_left; jack_devout->loop_right = loop_right; jack_devout->do_loop = do_loop; if(do_loop){ jack_devout->loop_offset = jack_devout->note_offset; } g_rec_mutex_unlock(jack_devout_mutex); } void ags_jack_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsJackDevout *jack_devout; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get loop */ g_rec_mutex_lock(jack_devout_mutex); if(loop_left != NULL){ *loop_left = jack_devout->loop_left; } if(loop_right != NULL){ *loop_right = jack_devout->loop_right; } if(do_loop != NULL){ *do_loop = jack_devout->do_loop; } g_rec_mutex_unlock(jack_devout_mutex); } guint ags_jack_devout_get_loop_offset(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint loop_offset; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get loop offset */ g_rec_mutex_lock(jack_devout_mutex); loop_offset = jack_devout->loop_offset; g_rec_mutex_unlock(jack_devout_mutex); return(loop_offset); } guint ags_jack_devout_get_sub_block_count(AgsSoundcard *soundcard) { AgsJackDevout *jack_devout; guint sub_block_count; GRecMutex *jack_devout_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get loop offset */ g_rec_mutex_lock(jack_devout_mutex); sub_block_count = jack_devout->sub_block_count; g_rec_mutex_unlock(jack_devout_mutex); return(sub_block_count); } gboolean ags_jack_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsJackDevout *jack_devout; guint pcm_channels; guint sub_block_count; gboolean success; GRecMutex *jack_devout_mutex; GRecMutex *sub_block_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get loop offset */ g_rec_mutex_lock(jack_devout_mutex); pcm_channels = jack_devout->pcm_channels; sub_block_count = jack_devout->sub_block_count; g_rec_mutex_unlock(jack_devout_mutex); sub_block_mutex = NULL; success = FALSE; if(jack_devout->buffer != NULL){ if(buffer == jack_devout->buffer[0]){ sub_block_mutex = jack_devout->sub_block_mutex[sub_block]; }else if(buffer == jack_devout->buffer[1]){ sub_block_mutex = jack_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == jack_devout->buffer[2]){ sub_block_mutex = jack_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == jack_devout->buffer[3]){ sub_block_mutex = jack_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ if(g_rec_mutex_trylock(sub_block_mutex) == 0){ success = TRUE; } } return(success); } void ags_jack_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsJackDevout *jack_devout; guint pcm_channels; guint sub_block_count; GRecMutex *jack_devout_mutex; GRecMutex *sub_block_mutex; jack_devout = AGS_JACK_DEVOUT(soundcard); /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get loop offset */ g_rec_mutex_lock(jack_devout_mutex); pcm_channels = jack_devout->pcm_channels; sub_block_count = jack_devout->sub_block_count; g_rec_mutex_unlock(jack_devout_mutex); sub_block_mutex = NULL; if(jack_devout->buffer != NULL){ if(buffer == jack_devout->buffer[0]){ sub_block_mutex = jack_devout->sub_block_mutex[sub_block]; }else if(buffer == jack_devout->buffer[1]){ sub_block_mutex = jack_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == jack_devout->buffer[2]){ sub_block_mutex = jack_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == jack_devout->buffer[3]){ sub_block_mutex = jack_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ g_rec_mutex_unlock(sub_block_mutex); } } /** * ags_jack_devout_switch_buffer_flag: * @jack_devout: an #AgsJackDevout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_jack_devout_switch_buffer_flag(AgsJackDevout *jack_devout) { GRecMutex *jack_devout_mutex; if(!AGS_IS_JACK_DEVOUT(jack_devout)){ return; } /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* switch buffer flag */ g_rec_mutex_lock(jack_devout_mutex); if((AGS_JACK_DEVOUT_BUFFER0 & (jack_devout->flags)) != 0){ jack_devout->flags &= (~AGS_JACK_DEVOUT_BUFFER0); jack_devout->flags |= AGS_JACK_DEVOUT_BUFFER1; }else if((AGS_JACK_DEVOUT_BUFFER1 & (jack_devout->flags)) != 0){ jack_devout->flags &= (~AGS_JACK_DEVOUT_BUFFER1); jack_devout->flags |= AGS_JACK_DEVOUT_BUFFER2; }else if((AGS_JACK_DEVOUT_BUFFER2 & (jack_devout->flags)) != 0){ jack_devout->flags &= (~AGS_JACK_DEVOUT_BUFFER2); jack_devout->flags |= AGS_JACK_DEVOUT_BUFFER3; }else if((AGS_JACK_DEVOUT_BUFFER3 & (jack_devout->flags)) != 0){ jack_devout->flags &= (~AGS_JACK_DEVOUT_BUFFER3); jack_devout->flags |= AGS_JACK_DEVOUT_BUFFER0; } g_rec_mutex_unlock(jack_devout_mutex); } /** * ags_jack_devout_adjust_delay_and_attack: * @jack_devout: the #AgsJackDevout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_jack_devout_adjust_delay_and_attack(AgsJackDevout *jack_devout) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *jack_devout_mutex; if(!AGS_IS_JACK_DEVOUT(jack_devout)){ return; } /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get some initial values */ delay = ags_jack_devout_get_absolute_delay(AGS_SOUNDCARD(jack_devout)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(jack_devout_mutex); default_tact_frames = (guint) (delay * jack_devout->buffer_size); delay_tact_frames = (guint) (floor(delay) * jack_devout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; jack_devout->attack[0] = (guint) floor(0.25 * jack_devout->buffer_size); next_attack = (((jack_devout->attack[i] + default_tact_frames) / jack_devout->buffer_size) - delay) * jack_devout->buffer_size; if(next_attack >= jack_devout->buffer_size){ next_attack = jack_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ jack_devout->attack[i] = jack_devout->attack[i] - ((gdouble) next_attack / 2.0); if(jack_devout->attack[i] < 0){ jack_devout->attack[i] = 0; } if(jack_devout->attack[i] >= jack_devout->buffer_size){ jack_devout->attack[i] = jack_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= jack_devout->buffer_size){ next_attack = jack_devout->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ jack_devout->attack[i] = next_attack; next_attack = (((jack_devout->attack[i] + default_tact_frames) / jack_devout->buffer_size) - delay) * jack_devout->buffer_size; if(next_attack >= jack_devout->buffer_size){ next_attack = jack_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ jack_devout->attack[i] = jack_devout->attack[i] - ((gdouble) next_attack / 2.0); if(jack_devout->attack[i] < 0){ jack_devout->attack[i] = 0; } if(jack_devout->attack[i] >= jack_devout->buffer_size){ jack_devout->attack[i] = jack_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= jack_devout->buffer_size){ next_attack = jack_devout->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", jack_devout->attack[i]); #endif } jack_devout->attack[0] = jack_devout->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ jack_devout->delay[i] = ((gdouble) (default_tact_frames + jack_devout->attack[i] - jack_devout->attack[i + 1])) / (gdouble) jack_devout->buffer_size; #ifdef AGS_DEBUG g_message("%f", jack_devout->delay[i]); #endif } jack_devout->delay[i] = ((gdouble) (default_tact_frames + jack_devout->attack[i] - jack_devout->attack[0])) / (gdouble) jack_devout->buffer_size; g_rec_mutex_unlock(jack_devout_mutex); } /** * ags_jack_devout_realloc_buffer: * @jack_devout: the #AgsJackDevout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_jack_devout_realloc_buffer(AgsJackDevout *jack_devout) { AgsJackClient *jack_client; guint port_count; guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *jack_devout_mutex; if(!AGS_IS_JACK_DEVOUT(jack_devout)){ return; } /* get jack devout mutex */ jack_devout_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(jack_devout); /* get word size */ g_rec_mutex_lock(jack_devout_mutex); jack_client = (AgsJackClient *) jack_devout->jack_client; port_count = g_list_length(jack_devout->jack_port); pcm_channels = jack_devout->pcm_channels; buffer_size = jack_devout->buffer_size; format = jack_devout->format; g_rec_mutex_unlock(jack_devout_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_warning("ags_jack_devout_realloc_buffer(): unsupported word size"); return; } if(port_count < pcm_channels){ AgsJackPort *jack_port; gchar *str; guint nth_soundcard; guint i; g_rec_mutex_lock(jack_devout_mutex); if(jack_devout->card_uri != NULL){ sscanf(jack_devout->card_uri, "ags-jack-devout-%u", &nth_soundcard); }else{ g_rec_mutex_unlock(jack_devout_mutex); g_warning("ags_jack_devout_realloc_buffer() - card uri not set"); return; } g_rec_mutex_unlock(jack_devout_mutex); for(i = port_count; i < pcm_channels; i++){ str = g_strdup_printf("ags%d-%04d", nth_soundcard, i); jack_port = ags_jack_port_new((GObject *) jack_client); ags_jack_client_add_port((AgsJackClient *) jack_client, (GObject *) jack_port); g_rec_mutex_lock(jack_devout_mutex); jack_devout->jack_port = g_list_prepend(jack_devout->jack_port, jack_port); if(jack_devout->port_name == NULL){ jack_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); jack_devout->port_name[0] = g_strdup(str); }else{ jack_devout->port_name = (gchar **) realloc(jack_devout->port_name, (i + 2) * sizeof(gchar *)); jack_devout->port_name[i] = g_strdup(str); } g_rec_mutex_unlock(jack_devout_mutex); ags_jack_port_register(jack_port, str, TRUE, FALSE, TRUE); } jack_devout->port_name[jack_devout->pcm_channels] = NULL; }else if(port_count > pcm_channels){ GList *jack_port_start, *jack_port; guint i; g_rec_mutex_lock(jack_devout_mutex); jack_port = jack_port_start = g_list_copy(jack_devout->jack_port); g_rec_mutex_unlock(jack_devout_mutex); for(i = 0; i < port_count - pcm_channels; i++){ jack_devout->jack_port = g_list_remove(jack_devout->jack_port, jack_port->data); ags_jack_port_unregister(jack_port->data); g_object_unref(jack_port->data); jack_port = jack_port->next; } g_list_free(jack_port_start); g_rec_mutex_lock(jack_devout_mutex); jack_devout->port_name = (gchar **) realloc(jack_devout->port_name, (jack_devout->pcm_channels + 1) * sizeof(gchar *)); jack_devout->port_name[jack_devout->pcm_channels] = NULL; g_rec_mutex_unlock(jack_devout_mutex); } /* AGS_JACK_DEVOUT_BUFFER_0 */ if(jack_devout->buffer[0] != NULL){ free(jack_devout->buffer[0]); } jack_devout->buffer[0] = (void *) malloc(jack_devout->pcm_channels * jack_devout->buffer_size * word_size); /* AGS_JACK_DEVOUT_BUFFER_1 */ if(jack_devout->buffer[1] != NULL){ free(jack_devout->buffer[1]); } jack_devout->buffer[1] = (void *) malloc(jack_devout->pcm_channels * jack_devout->buffer_size * word_size); /* AGS_JACK_DEVOUT_BUFFER_2 */ if(jack_devout->buffer[2] != NULL){ free(jack_devout->buffer[2]); } jack_devout->buffer[2] = (void *) malloc(jack_devout->pcm_channels * jack_devout->buffer_size * word_size); /* AGS_JACK_DEVOUT_BUFFER_3 */ if(jack_devout->buffer[3] != NULL){ free(jack_devout->buffer[3]); } jack_devout->buffer[3] = (void *) malloc(jack_devout->pcm_channels * jack_devout->buffer_size * word_size); } /** * ags_jack_devout_new: * * Creates a new instance of #AgsJackDevout. * * Returns: the new #AgsJackDevout * * Since: 3.0.0 */ AgsJackDevout* ags_jack_devout_new() { AgsJackDevout *jack_devout; jack_devout = (AgsJackDevout *) g_object_new(AGS_TYPE_JACK_DEVOUT, NULL); return(jack_devout); } gsequencer-3.1.3/ags/audio/jack/ags_jack_server.h0000644000175000017500000000740713607210263016674 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_JACK_SERVER_H__ #define __AGS_JACK_SERVER_H__ #include #include #include #ifdef AGS_WITH_JACK #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_JACK_SERVER (ags_jack_server_get_type()) #define AGS_JACK_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_JACK_SERVER, AgsJackServer)) #define AGS_JACK_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_JACK_SERVER, AgsJackServer)) #define AGS_IS_JACK_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_JACK_SERVER)) #define AGS_IS_JACK_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_JACK_SERVER)) #define AGS_JACK_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_JACK_SERVER, AgsJackServerClass)) #define AGS_JACK_SERVER_GET_OBJ_MUTEX(obj) (&(((AgsJackServer *) obj)->obj_mutex)) #define AGS_JACK_SERVER_DEFAULT_PROTOCOL "udp" #define AGS_JACK_SERVER_DEFAULT_HOST "localhost" #define AGS_JACK_SERVER_DEFAULT_PORT (3000) typedef struct _AgsJackServer AgsJackServer; typedef struct _AgsJackServerClass AgsJackServerClass; /** * AgsJackServerFlags: * @AGS_JACK_SERVER_ADDED_TO_REGISTRY: the JACK server was added to registry, see #AgsConnectable::add_to_registry() * @AGS_JACK_SERVER_CONNECTED: indicates the server was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsJackServer by * enable/disable as flags. */ typedef enum{ AGS_JACK_SERVER_ADDED_TO_REGISTRY = 1, AGS_JACK_SERVER_CONNECTED = 1 << 1, }AgsJackServerFlags; struct _AgsJackServer { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gchar *url; // jackctl_server_t *jackctl; guint *port; guint port_count; guint n_soundcards; guint n_sequencers; GObject *default_soundcard; GObject *default_client; GObject *input_client; GList *client; }; struct _AgsJackServerClass { GObjectClass gobject; }; GType ags_jack_server_get_type(); gboolean ags_jack_server_test_flags(AgsJackServer *jack_server, guint flags); void ags_jack_server_set_flags(AgsJackServer *jack_server, guint flags); void ags_jack_server_unset_flags(AgsJackServer *jack_server, guint flags); GList* ags_jack_server_find_url(GList *jack_server, gchar *url); GObject* ags_jack_server_find_client(AgsJackServer *jack_server, gchar *client_uuid); GObject* ags_jack_server_find_port(AgsJackServer *jack_server, gchar *port_uuid); void ags_jack_server_add_client(AgsJackServer *jack_server, GObject *jack_client); void ags_jack_server_remove_client(AgsJackServer *jack_server, GObject *jack_client); void ags_jack_server_connect_client(AgsJackServer *jack_server); void ags_jack_server_disconnect_client(AgsJackServer *jack_server); AgsJackServer* ags_jack_server_new(gchar *url); G_END_DECLS #endif /*__AGS_JACK_SERVER_H__*/ gsequencer-3.1.3/ags/audio/jack/ags_jack_port.c0000644000175000017500000004650013607210263016342 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_jack_port_class_init(AgsJackPortClass *jack_port); void ags_jack_port_connectable_interface_init(AgsConnectableInterface *connectable); void ags_jack_port_init(AgsJackPort *jack_port); void ags_jack_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_jack_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_jack_port_dispose(GObject *gobject); void ags_jack_port_finalize(GObject *gobject); AgsUUID* ags_jack_port_get_uuid(AgsConnectable *connectable); gboolean ags_jack_port_has_resource(AgsConnectable *connectable); gboolean ags_jack_port_is_ready(AgsConnectable *connectable); void ags_jack_port_add_to_registry(AgsConnectable *connectable); void ags_jack_port_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_jack_port_list_resource(AgsConnectable *connectable); xmlNode* ags_jack_port_xml_compose(AgsConnectable *connectable); void ags_jack_port_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_jack_port_is_connected(AgsConnectable *connectable); void ags_jack_port_connect(AgsConnectable *connectable); void ags_jack_port_disconnect(AgsConnectable *connectable); /** * SECTION:ags_jack_port * @short_description: JACK resource. * @title: AgsJackPort * @section_id: * @include: ags/audio/jack/ags_jack_port.h * * The #AgsJackPort represents either a JACK sequencer or soundcard to communicate * with. */ enum{ PROP_0, PROP_JACK_CLIENT, PROP_PORT_NAME, }; static gpointer ags_jack_port_parent_class = NULL; GType ags_jack_port_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_jack_port = 0; static const GTypeInfo ags_jack_port_info = { sizeof(AgsJackPortClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_jack_port_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsJackPort), 0, /* n_preallocs */ (GInstanceInitFunc) ags_jack_port_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_jack_port_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_jack_port = g_type_register_static(G_TYPE_OBJECT, "AgsJackPort", &ags_jack_port_info, 0); g_type_add_interface_static(ags_type_jack_port, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_jack_port); } return g_define_type_id__volatile; } void ags_jack_port_class_init(AgsJackPortClass *jack_port) { GObjectClass *gobject; GParamSpec *param_spec; ags_jack_port_parent_class = g_type_class_peek_parent(jack_port); /* GObjectClass */ gobject = (GObjectClass *) jack_port; gobject->set_property = ags_jack_port_set_property; gobject->get_property = ags_jack_port_get_property; gobject->dispose = ags_jack_port_dispose; gobject->finalize = ags_jack_port_finalize; /* properties */ /** * AgsJackPort:jack-client: * * The assigned #AgsJackClient. * * Since: 3.0.0 */ param_spec = g_param_spec_object("jack-client", i18n_pspec("assigned JACK client"), i18n_pspec("The assigned JACK client"), AGS_TYPE_JACK_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_CLIENT, param_spec); /** * AgsJackPort:port-name: * * The JACK port name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("port-name", i18n_pspec("port name"), i18n_pspec("The port name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_NAME, param_spec); } void ags_jack_port_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_jack_port_get_uuid; connectable->has_resource = ags_jack_port_has_resource; connectable->is_ready = ags_jack_port_is_ready; connectable->add_to_registry = ags_jack_port_add_to_registry; connectable->remove_from_registry = ags_jack_port_remove_from_registry; connectable->list_resource = ags_jack_port_list_resource; connectable->xml_compose = ags_jack_port_xml_compose; connectable->xml_parse = ags_jack_port_xml_parse; connectable->is_connected = ags_jack_port_is_connected; connectable->connect = ags_jack_port_connect; connectable->disconnect = ags_jack_port_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_jack_port_init(AgsJackPort *jack_port) { /* flags */ jack_port->flags = 0; /* port mutex */ g_rec_mutex_init(&(jack_port->obj_mutex)); /* parent */ jack_port->jack_client = NULL; /* uuid */ jack_port->uuid = ags_uuid_alloc(); ags_uuid_generate(jack_port->uuid); /* fields */ jack_port->port_uuid = NULL; jack_port->port_name = NULL; jack_port->port = NULL; } void ags_jack_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsJackPort *jack_port; GRecMutex *jack_port_mutex; jack_port = AGS_JACK_PORT(gobject); /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); switch(prop_id){ case PROP_JACK_CLIENT: { AgsJackClient *jack_client; jack_client = (AgsJackClient *) g_value_get_object(value); g_rec_mutex_lock(jack_port_mutex); if(jack_port->jack_client == (GObject *) jack_client){ g_rec_mutex_unlock(jack_port_mutex); return; } if(jack_port->jack_client != NULL){ g_object_unref(jack_port->jack_client); } if(jack_client != NULL){ g_object_ref(jack_client); } jack_port->jack_client = (GObject *) jack_client; g_rec_mutex_unlock(jack_port_mutex); } break; case PROP_PORT_NAME: { gchar *port_name; port_name = g_value_get_string(value); g_rec_mutex_lock(jack_port_mutex); if(jack_port->port_name == port_name || !g_ascii_strcasecmp(jack_port->port_name, port_name)){ g_rec_mutex_unlock(jack_port_mutex); return; } if(jack_port->port_name != NULL){ g_free(jack_port->port_name); } jack_port->port_name = port_name; #ifdef AGS_WITH_JACK if(jack_port->port != NULL){ jack_port_set_name(jack_port->port, port_name); } #endif g_rec_mutex_unlock(jack_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsJackPort *jack_port; GRecMutex *jack_port_mutex; jack_port = AGS_JACK_PORT(gobject); /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); switch(prop_id){ case PROP_JACK_CLIENT: { g_rec_mutex_lock(jack_port_mutex); g_value_set_object(value, jack_port->jack_client); g_rec_mutex_unlock(jack_port_mutex); } break; case PROP_PORT_NAME: { g_rec_mutex_lock(jack_port_mutex); g_value_set_string(value, jack_port->port_name); g_rec_mutex_unlock(jack_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_port_dispose(GObject *gobject) { AgsJackPort *jack_port; jack_port = AGS_JACK_PORT(gobject); /* jack client */ if(jack_port->jack_client != NULL){ g_object_unref(jack_port->jack_client); jack_port->jack_client = NULL; } /* call parent */ G_OBJECT_CLASS(ags_jack_port_parent_class)->dispose(gobject); } void ags_jack_port_finalize(GObject *gobject) { AgsJackPort *jack_port; jack_port = AGS_JACK_PORT(gobject); /* jack client */ if(jack_port->jack_client != NULL){ g_object_unref(jack_port->jack_client); } /* name */ g_free(jack_port->port_name); /* call parent */ G_OBJECT_CLASS(ags_jack_port_parent_class)->finalize(gobject); } AgsUUID* ags_jack_port_get_uuid(AgsConnectable *connectable) { AgsJackPort *jack_port; AgsUUID *ptr; GRecMutex *jack_port_mutex; jack_port = AGS_JACK_PORT(connectable); /* get jack port signal mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); /* get UUID */ g_rec_mutex_lock(jack_port_mutex); ptr = jack_port->uuid; g_rec_mutex_unlock(jack_port_mutex); return(ptr); } gboolean ags_jack_port_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_jack_port_is_ready(AgsConnectable *connectable) { AgsJackPort *jack_port; gboolean is_ready; jack_port = AGS_JACK_PORT(connectable); /* check is added */ is_ready = ags_jack_port_test_flags(jack_port, AGS_JACK_PORT_ADDED_TO_REGISTRY); return(is_ready); } void ags_jack_port_add_to_registry(AgsConnectable *connectable) { AgsJackPort *jack_port; if(ags_connectable_is_ready(connectable)){ return; } jack_port = AGS_JACK_PORT(connectable); ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_ADDED_TO_REGISTRY); } void ags_jack_port_remove_from_registry(AgsConnectable *connectable) { AgsJackPort *jack_port; if(!ags_connectable_is_ready(connectable)){ return; } jack_port = AGS_JACK_PORT(connectable); ags_jack_port_unset_flags(jack_port, AGS_JACK_PORT_ADDED_TO_REGISTRY); } xmlNode* ags_jack_port_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_jack_port_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_jack_port_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_jack_port_is_connected(AgsConnectable *connectable) { AgsJackPort *jack_port; gboolean is_connected; jack_port = AGS_JACK_PORT(connectable); /* check is connected */ is_connected = ags_jack_port_test_flags(jack_port, AGS_JACK_PORT_CONNECTED); return(is_connected); } void ags_jack_port_connect(AgsConnectable *connectable) { AgsJackPort *jack_port; if(ags_connectable_is_connected(connectable)){ return; } jack_port = AGS_JACK_PORT(connectable); ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_CONNECTED); } void ags_jack_port_disconnect(AgsConnectable *connectable) { AgsJackPort *jack_port; if(!ags_connectable_is_connected(connectable)){ return; } jack_port = AGS_JACK_PORT(connectable); ags_jack_port_unset_flags(jack_port, AGS_JACK_PORT_CONNECTED); } /** * ags_jack_port_test_flags: * @jack_port: the #AgsJackPort * @flags: the flags * * Test @flags to be set on @jack_port. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_jack_port_test_flags(AgsJackPort *jack_port, guint flags) { gboolean retval; GRecMutex *jack_port_mutex; if(!AGS_IS_JACK_PORT(jack_port)){ return(FALSE); } /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); /* test */ g_rec_mutex_lock(jack_port_mutex); retval = (flags & (jack_port->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_port_mutex); return(retval); } /** * ags_jack_port_set_flags: * @jack_port: the #AgsJackPort * @flags: see #AgsJackPortFlags-enum * * Enable a feature of @jack_port. * * Since: 3.0.0 */ void ags_jack_port_set_flags(AgsJackPort *jack_port, guint flags) { GRecMutex *jack_port_mutex; if(!AGS_IS_JACK_PORT(jack_port)){ return; } /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(jack_port_mutex); jack_port->flags |= flags; g_rec_mutex_unlock(jack_port_mutex); } /** * ags_jack_port_unset_flags: * @jack_port: the #AgsJackPort * @flags: see #AgsJackPortFlags-enum * * Disable a feature of @jack_port. * * Since: 3.0.0 */ void ags_jack_port_unset_flags(AgsJackPort *jack_port, guint flags) { GRecMutex *jack_port_mutex; if(!AGS_IS_JACK_PORT(jack_port)){ return; } /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(jack_port_mutex); jack_port->flags &= (~flags); g_rec_mutex_unlock(jack_port_mutex); } /** * ags_jack_port_find: * @jack_port: (element-type AgsAudio.JackPort) (transfer none): the #GList-struct containing #AgsJackPort * @port_name: the port name to find * * Finds next match of @port_name in @jack_port. * * Returns: (element-type AgsAudio.JackPort) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_jack_port_find(GList *jack_port, gchar *port_name) { #ifdef AGS_WITH_JACK jack_port_t *port; #else gpointer port; #endif GRecMutex *jack_port_mutex; #ifdef AGS_WITH_JACK while(jack_port != NULL){ /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port->data); /* get port */ g_rec_mutex_lock(jack_port_mutex); port = AGS_JACK_PORT(jack_port->data)->port; g_rec_mutex_unlock(jack_port_mutex); if(!g_ascii_strcasecmp(jack_port_name(port), port_name)){ return(jack_port); } } #endif return(NULL); } /** * ags_jack_port_register: * @jack_port: the #AgsJackPort * @port_name: the name as string * @is_audio: if %TRUE interpreted as audio port * @is_midi: if %TRUE interpreted as midi port * @is_output: if %TRUE port is acting as output, otherwise as input * * Register a new JACK port and read uuid. Creates a new AgsSequencer or AgsSoundcard * object. * * Since: 3.0.0 */ void ags_jack_port_register(AgsJackPort *jack_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output) { AgsJackServer *jack_server; AgsJackClient *jack_client; #ifdef AGS_WITH_JACK jack_client_t *client; jack_port_t *port; #else gpointer client; gpointer port; #endif GList *list; gchar *port_uuid; GRecMutex *jack_client_mutex; GRecMutex *jack_port_mutex; if(!AGS_IS_JACK_PORT(jack_port) || port_name == NULL){ return; } g_object_get(jack_port, "jack-client", &jack_client, NULL); if(jack_client == NULL){ g_warning("ags_jack_port.c - no assigned AgsJackClient"); return; } if(ags_jack_port_test_flags(jack_port, AGS_JACK_PORT_REGISTERED)){ g_object_unref(jack_client); return; } /* get jack server and application context */ g_object_get(jack_client, "jack-server", &jack_server, NULL); if(jack_server == NULL){ g_object_unref(jack_client); return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); if(client == NULL){ g_object_unref(jack_client); g_object_unref(jack_server); return; } /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); /* get port name */ //FIXME:JK: memory leak? g_rec_mutex_lock(jack_port_mutex); jack_port->port_name = g_strdup(port_name); g_rec_mutex_unlock(jack_port_mutex); /* create sequencer or soundcard */ if(is_output){ ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_IS_OUTPUT); }else{ ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_IS_INPUT); } #ifdef AGS_WITH_JACK port = NULL; if(is_audio){ ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_IS_AUDIO); port = jack_port_register(client, jack_port->port_name, JACK_DEFAULT_AUDIO_TYPE, (is_output ? JackPortIsOutput: JackPortIsInput), 0); }else if(is_midi){ ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_IS_MIDI); port = jack_port_register(client, jack_port->port_name, JACK_DEFAULT_MIDI_TYPE, (is_output ? JackPortIsOutput: JackPortIsInput), 0); } g_rec_mutex_lock(jack_port_mutex); jack_port->port = port; g_rec_mutex_unlock(jack_port_mutex); if(port != NULL){ ags_jack_port_set_flags(jack_port, AGS_JACK_PORT_REGISTERED); } #ifdef HAVE_JACK_PORT_UUID if(port != NULL){ port_uuid = jack_port_uuid(port); g_rec_mutex_lock(jack_port_mutex); jack_port->port_uuid = g_strdup(port_uuid); g_rec_mutex_unlock(jack_port_mutex); } #endif #endif g_object_unref(jack_client); g_object_unref(jack_server); } /** * ags_jack_port_unregister: * @jack_port: the #AgsJackPort * * Unregister JACK port. * * Since: 3.0.0 */ void ags_jack_port_unregister(AgsJackPort *jack_port) { AgsJackClient *jack_client; #ifdef AGS_WITH_JACK jack_client_t *client; jack_port_t *port; #else gpointer client; gpointer port; #endif GRecMutex *jack_client_mutex; GRecMutex *jack_port_mutex; if(!AGS_IS_JACK_PORT(jack_port)){ return; } /* get jack port mutex */ jack_port_mutex = AGS_JACK_PORT_GET_OBJ_MUTEX(jack_port); /* get port */ g_rec_mutex_lock(jack_port_mutex); port = jack_port->port; g_rec_mutex_unlock(jack_port_mutex); if(port == NULL){ return; } /* get jack client */ g_object_get(jack_port, "jack-client", &jack_client, NULL); if(jack_client == NULL){ return; } /* get jack client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get client */ g_rec_mutex_lock(jack_client_mutex); client = jack_client->client; g_rec_mutex_unlock(jack_client_mutex); if(client == NULL){ g_object_unref(jack_client); return; } #ifdef AGS_WITH_JACK jack_port_unregister(client, port); /* unset port and flags */ g_rec_mutex_lock(jack_port_mutex); jack_port->port = NULL; g_rec_mutex_unlock(jack_port_mutex); ags_jack_port_unset_flags(jack_port, AGS_JACK_PORT_REGISTERED); #endif g_object_unref(jack_client); } /** * ags_jack_port_new: * @jack_client: the #AgsJackClient assigned to * * Create a new instance of #AgsJackPort. * * Returns: the new #AgsJackPort * * Since: 3.0.0 */ AgsJackPort* ags_jack_port_new(GObject *jack_client) { AgsJackPort *jack_port; jack_port = (AgsJackPort *) g_object_new(AGS_TYPE_JACK_PORT, "jack-client", jack_client, NULL); return(jack_port); } gsequencer-3.1.3/ags/audio/jack/ags_jack_devin.c0000644000175000017500000021736613607210263016475 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_jack_devin_class_init(AgsJackDevinClass *jack_devin); void ags_jack_devin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_jack_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_jack_devin_init(AgsJackDevin *jack_devin); void ags_jack_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_jack_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_jack_devin_dispose(GObject *gobject); void ags_jack_devin_finalize(GObject *gobject); AgsUUID* ags_jack_devin_get_uuid(AgsConnectable *connectable); gboolean ags_jack_devin_has_resource(AgsConnectable *connectable); gboolean ags_jack_devin_is_ready(AgsConnectable *connectable); void ags_jack_devin_add_to_registry(AgsConnectable *connectable); void ags_jack_devin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_jack_devin_list_resource(AgsConnectable *connectable); xmlNode* ags_jack_devin_xml_compose(AgsConnectable *connectable); void ags_jack_devin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_jack_devin_is_connected(AgsConnectable *connectable); void ags_jack_devin_connect(AgsConnectable *connectable); void ags_jack_devin_disconnect(AgsConnectable *connectable); void ags_jack_devin_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_jack_devin_get_device(AgsSoundcard *soundcard); void ags_jack_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_jack_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_jack_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_jack_devin_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_jack_devin_get_capability(AgsSoundcard *soundcard); gboolean ags_jack_devin_is_starting(AgsSoundcard *soundcard); gboolean ags_jack_devin_is_recording(AgsSoundcard *soundcard); gchar* ags_jack_devin_get_uptime(AgsSoundcard *soundcard); void ags_jack_devin_port_init(AgsSoundcard *soundcard, GError **error); void ags_jack_devin_port_record(AgsSoundcard *soundcard, GError **error); void ags_jack_devin_port_free(AgsSoundcard *soundcard); void ags_jack_devin_tic(AgsSoundcard *soundcard); void ags_jack_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_jack_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_jack_devin_get_bpm(AgsSoundcard *soundcard); void ags_jack_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_jack_devin_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_jack_devin_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_jack_devin_get_delay(AgsSoundcard *soundcard); guint ags_jack_devin_get_attack(AgsSoundcard *soundcard); void* ags_jack_devin_get_buffer(AgsSoundcard *soundcard); void* ags_jack_devin_get_next_buffer(AgsSoundcard *soundcard); void* ags_jack_devin_get_prev_buffer(AgsSoundcard *soundcard); void ags_jack_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_jack_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_jack_devin_get_delay_counter(AgsSoundcard *soundcard); void ags_jack_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_jack_devin_get_start_note_offset(AgsSoundcard *soundcard); void ags_jack_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_jack_devin_get_note_offset(AgsSoundcard *soundcard); void ags_jack_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_jack_devin_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_jack_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_jack_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_jack_devin_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_jack_devin * @short_description: Input from soundcard * @title: AgsJackDevin * @section_id: * @include: ags/audio/jack/ags_jack_devin.h * * #AgsJackDevin represents a soundcard and supports input. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_JACK_CLIENT, PROP_JACK_PORT, PROP_CHANNEL, }; static gpointer ags_jack_devin_parent_class = NULL; GType ags_jack_devin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_jack_devin = 0; static const GTypeInfo ags_jack_devin_info = { sizeof (AgsJackDevinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_jack_devin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsJackDevin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_jack_devin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_jack_devin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_jack_devin_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_jack_devin = g_type_register_static(G_TYPE_OBJECT, "AgsJackDevin", &ags_jack_devin_info, 0); g_type_add_interface_static(ags_type_jack_devin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_jack_devin, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_jack_devin); } return g_define_type_id__volatile; } void ags_jack_devin_class_init(AgsJackDevinClass *jack_devin) { GObjectClass *gobject; GParamSpec *param_spec; ags_jack_devin_parent_class = g_type_class_peek_parent(jack_devin); /* GObjectClass */ gobject = (GObjectClass *) jack_devin; gobject->set_property = ags_jack_devin_set_property; gobject->get_property = ags_jack_devin_get_property; gobject->dispose = ags_jack_devin_dispose; gobject->finalize = ags_jack_devin_finalize; /* properties */ /** * AgsJackDevin:device: * * The jack soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-jack-devin-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsJackDevin:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsJackDevin:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsJackDevin:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsJackDevin:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsJackDevin:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count recorded during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsJackDevin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to record"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsJackDevin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsJackDevin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsJackDevin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsJackDevin:jack-client: * * The assigned #AgsJackClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("jack-client", i18n_pspec("jack client object"), i18n_pspec("The jack client object"), AGS_TYPE_JACK_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_CLIENT, param_spec); /** * AgsJackDevin:jack-port: * * The assigned #AgsJackPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("jack-port", i18n_pspec("jack port object"), i18n_pspec("The jack port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_JACK_PORT, param_spec); } GQuark ags_jack_devin_error_quark() { return(g_quark_from_static_string("ags-jack_devin-error-quark")); } void ags_jack_devin_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_jack_devin_get_uuid; connectable->has_resource = ags_jack_devin_has_resource; connectable->is_ready = ags_jack_devin_is_ready; connectable->add_to_registry = ags_jack_devin_add_to_registry; connectable->remove_from_registry = ags_jack_devin_remove_from_registry; connectable->list_resource = ags_jack_devin_list_resource; connectable->xml_compose = ags_jack_devin_xml_compose; connectable->xml_parse = ags_jack_devin_xml_parse; connectable->is_connected = ags_jack_devin_is_connected; connectable->connect = ags_jack_devin_connect; connectable->disconnect = ags_jack_devin_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_jack_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_jack_devin_set_device; soundcard->get_device = ags_jack_devin_get_device; soundcard->set_presets = ags_jack_devin_set_presets; soundcard->get_presets = ags_jack_devin_get_presets; soundcard->list_cards = ags_jack_devin_list_cards; soundcard->pcm_info = ags_jack_devin_pcm_info; soundcard->get_capability = ags_jack_devin_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_jack_devin_is_starting; soundcard->is_playing = NULL; soundcard->is_recording = ags_jack_devin_is_recording; soundcard->get_uptime = ags_jack_devin_get_uptime; soundcard->play_init = NULL; soundcard->play = NULL; soundcard->record_init = ags_jack_devin_port_init; soundcard->record = ags_jack_devin_port_record; soundcard->stop = ags_jack_devin_port_free; soundcard->tic = ags_jack_devin_tic; soundcard->offset_changed = ags_jack_devin_offset_changed; soundcard->set_bpm = ags_jack_devin_set_bpm; soundcard->get_bpm = ags_jack_devin_get_bpm; soundcard->set_delay_factor = ags_jack_devin_set_delay_factor; soundcard->get_delay_factor = ags_jack_devin_get_delay_factor; soundcard->get_absolute_delay = ags_jack_devin_get_absolute_delay; soundcard->get_delay = ags_jack_devin_get_delay; soundcard->get_attack = ags_jack_devin_get_attack; soundcard->get_buffer = ags_jack_devin_get_buffer; soundcard->get_next_buffer = ags_jack_devin_get_next_buffer; soundcard->get_prev_buffer = ags_jack_devin_get_prev_buffer; soundcard->lock_buffer = ags_jack_devin_lock_buffer; soundcard->unlock_buffer = ags_jack_devin_unlock_buffer; soundcard->get_delay_counter = ags_jack_devin_get_delay_counter; soundcard->set_start_note_offset = ags_jack_devin_set_start_note_offset; soundcard->get_start_note_offset = ags_jack_devin_get_start_note_offset; soundcard->set_note_offset = ags_jack_devin_set_note_offset; soundcard->get_note_offset = ags_jack_devin_get_note_offset; soundcard->set_note_offset_absolute = ags_jack_devin_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_jack_devin_get_note_offset_absolute; soundcard->set_loop = ags_jack_devin_set_loop; soundcard->get_loop = ags_jack_devin_get_loop; soundcard->get_loop_offset = ags_jack_devin_get_loop_offset; } void ags_jack_devin_init(AgsJackDevin *jack_devin) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ jack_devin->flags = 0; g_atomic_int_set(&(jack_devin->sync_flags), AGS_JACK_DEVIN_PASS_THROUGH); /* jack devin mutex */ g_rec_mutex_init(&(jack_devin->obj_mutex)); /* uuid */ jack_devin->uuid = ags_uuid_alloc(); ags_uuid_generate(jack_devin->uuid); /* presets */ config = ags_config_get_instance(); jack_devin->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); jack_devin->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); jack_devin->samplerate = ags_soundcard_helper_config_get_samplerate(config); jack_devin->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); jack_devin->format = ags_soundcard_helper_config_get_format(config); /* */ jack_devin->card_uri = NULL; jack_devin->jack_client = NULL; jack_devin->port_name = NULL; jack_devin->jack_port = NULL; /* buffer */ jack_devin->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ jack_devin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(jack_devin->buffer_mutex[i]); } jack_devin->buffer = (void **) malloc(4 * sizeof(void*)); jack_devin->buffer[0] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * sizeof(gint16)); jack_devin->buffer[1] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * sizeof(gint16)); jack_devin->buffer[2] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * sizeof(gint16)); jack_devin->buffer[3] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * sizeof(gint16)); ags_jack_devin_realloc_buffer(jack_devin); /* bpm */ jack_devin->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ jack_devin->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); jack_devin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ jack_devin->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); jack_devin->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_jack_devin_adjust_delay_and_attack(jack_devin); /* counters */ jack_devin->tact_counter = 0.0; jack_devin->delay_counter = 0.0; jack_devin->tic_counter = 0; jack_devin->start_note_offset = 0; jack_devin->note_offset = 0; jack_devin->note_offset_absolute = 0; jack_devin->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; jack_devin->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; jack_devin->do_loop = FALSE; jack_devin->loop_offset = 0; /* callback mutex */ g_mutex_init(&(jack_devin->callback_mutex)); g_cond_init(&(jack_devin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(jack_devin->callback_finish_mutex)); g_cond_init(&(jack_devin->callback_finish_cond)); } void ags_jack_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(gobject); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(jack_devin_mutex); jack_devin->card_uri = g_strdup(device); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(jack_devin_mutex); if(dsp_channels == jack_devin->dsp_channels){ g_rec_mutex_unlock(jack_devin_mutex); return; } jack_devin->dsp_channels = dsp_channels; g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(jack_devin_mutex); if(pcm_channels == jack_devin->pcm_channels){ g_rec_mutex_unlock(jack_devin_mutex); return; } jack_devin->pcm_channels = pcm_channels; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_realloc_buffer(jack_devin); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(jack_devin_mutex); if(format == jack_devin->format){ g_rec_mutex_unlock(jack_devin_mutex); return; } jack_devin->format = format; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_realloc_buffer(jack_devin); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(jack_devin_mutex); if(buffer_size == jack_devin->buffer_size){ g_rec_mutex_unlock(jack_devin_mutex); return; } jack_devin->buffer_size = buffer_size; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_realloc_buffer(jack_devin); ags_jack_devin_adjust_delay_and_attack(jack_devin); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(jack_devin_mutex); if(samplerate == jack_devin->samplerate){ g_rec_mutex_unlock(jack_devin_mutex); return; } jack_devin->samplerate = samplerate; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_realloc_buffer(jack_devin); ags_jack_devin_adjust_delay_and_attack(jack_devin); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(jack_devin_mutex); jack_devin->bpm = bpm; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_adjust_delay_and_attack(jack_devin); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(jack_devin_mutex); jack_devin->delay_factor = delay_factor; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_adjust_delay_and_attack(jack_devin); } break; case PROP_JACK_CLIENT: { AgsJackClient *jack_client; jack_client = (AgsJackClient *) g_value_get_object(value); g_rec_mutex_lock(jack_devin_mutex); if(jack_devin->jack_client == (GObject *) jack_client){ g_rec_mutex_unlock(jack_devin_mutex); return; } if(jack_devin->jack_client != NULL){ g_object_unref(G_OBJECT(jack_devin->jack_client)); } if(jack_client != NULL){ g_object_ref(jack_client); } jack_devin->jack_client = (GObject *) jack_client; g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_JACK_PORT: { AgsJackPort *jack_port; jack_port = (AgsJackPort *) g_value_get_pointer(value); g_rec_mutex_lock(jack_devin_mutex); if(!AGS_IS_JACK_PORT(jack_port) || g_list_find(jack_devin->jack_port, jack_port) != NULL){ g_rec_mutex_unlock(jack_devin_mutex); return; } g_object_ref(jack_port); jack_devin->jack_port = g_list_append(jack_devin->jack_port, jack_port); g_rec_mutex_unlock(jack_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(gobject); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_string(value, jack_devin->card_uri); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_uint(value, jack_devin->dsp_channels); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_uint(value, jack_devin->pcm_channels); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_uint(value, jack_devin->format); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_uint(value, jack_devin->buffer_size); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_uint(value, jack_devin->samplerate); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_pointer(value, jack_devin->buffer); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_double(value, jack_devin->bpm); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_double(value, jack_devin->delay_factor); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_pointer(value, jack_devin->attack); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_JACK_CLIENT: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_object(value, jack_devin->jack_client); g_rec_mutex_unlock(jack_devin_mutex); } break; case PROP_JACK_PORT: { g_rec_mutex_lock(jack_devin_mutex); g_value_set_pointer(value, g_list_copy_deep(jack_devin->jack_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(jack_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_jack_devin_dispose(GObject *gobject) { AgsJackDevin *jack_devin; jack_devin = AGS_JACK_DEVIN(gobject); /* jack client */ if(jack_devin->jack_client != NULL){ g_object_unref(jack_devin->jack_client); jack_devin->jack_client = NULL; } /* jack port */ g_list_free_full(jack_devin->jack_port, g_object_unref); jack_devin->jack_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_jack_devin_parent_class)->dispose(gobject); } void ags_jack_devin_finalize(GObject *gobject) { AgsJackDevin *jack_devin; jack_devin = AGS_JACK_DEVIN(gobject); /* free output buffer */ free(jack_devin->buffer[0]); free(jack_devin->buffer[1]); free(jack_devin->buffer[2]); free(jack_devin->buffer[3]); /* free buffer array */ free(jack_devin->buffer); /* free AgsAttack */ free(jack_devin->attack); /* jack client */ if(jack_devin->jack_client != NULL){ g_object_unref(jack_devin->jack_client); } /* jack port */ g_list_free_full(jack_devin->jack_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_jack_devin_parent_class)->finalize(gobject); } AgsUUID* ags_jack_devin_get_uuid(AgsConnectable *connectable) { AgsJackDevin *jack_devin; AgsUUID *ptr; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(connectable); /* get jack devin signal mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get UUID */ g_rec_mutex_lock(jack_devin_mutex); ptr = jack_devin->uuid; g_rec_mutex_unlock(jack_devin_mutex); return(ptr); } gboolean ags_jack_devin_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_jack_devin_is_ready(AgsConnectable *connectable) { AgsJackDevin *jack_devin; gboolean is_ready; jack_devin = AGS_JACK_DEVIN(connectable); /* check is added */ is_ready = ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_ADDED_TO_REGISTRY); return(is_ready); } void ags_jack_devin_add_to_registry(AgsConnectable *connectable) { AgsJackDevin *jack_devin; if(ags_connectable_is_ready(connectable)){ return; } jack_devin = AGS_JACK_DEVIN(connectable); ags_jack_devin_set_flags(jack_devin, AGS_JACK_DEVIN_ADDED_TO_REGISTRY); } void ags_jack_devin_remove_from_registry(AgsConnectable *connectable) { AgsJackDevin *jack_devin; if(!ags_connectable_is_ready(connectable)){ return; } jack_devin = AGS_JACK_DEVIN(connectable); ags_jack_devin_unset_flags(jack_devin, AGS_JACK_DEVIN_ADDED_TO_REGISTRY); } xmlNode* ags_jack_devin_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_jack_devin_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_jack_devin_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_jack_devin_is_connected(AgsConnectable *connectable) { AgsJackDevin *jack_devin; gboolean is_connected; jack_devin = AGS_JACK_DEVIN(connectable); /* check is connected */ is_connected = ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_CONNECTED); return(is_connected); } void ags_jack_devin_connect(AgsConnectable *connectable) { AgsJackDevin *jack_devin; if(ags_connectable_is_connected(connectable)){ return; } jack_devin = AGS_JACK_DEVIN(connectable); ags_jack_devin_set_flags(jack_devin, AGS_JACK_DEVIN_CONNECTED); } void ags_jack_devin_disconnect(AgsConnectable *connectable) { AgsJackDevin *jack_devin; if(!ags_connectable_is_connected(connectable)){ return; } jack_devin = AGS_JACK_DEVIN(connectable); ags_jack_devin_unset_flags(jack_devin, AGS_JACK_DEVIN_CONNECTED); } /** * ags_jack_devin_test_flags: * @jack_devin: the #AgsJackDevin * @flags: the flags * * Test @flags to be set on @jack_devin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_jack_devin_test_flags(AgsJackDevin *jack_devin, guint flags) { gboolean retval; GRecMutex *jack_devin_mutex; if(!AGS_IS_JACK_DEVIN(jack_devin)){ return(FALSE); } /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* test */ g_rec_mutex_lock(jack_devin_mutex); retval = (flags & (jack_devin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(jack_devin_mutex); return(retval); } /** * ags_jack_devin_set_flags: * @jack_devin: the #AgsJackDevin * @flags: see #AgsJackDevinFlags-enum * * Enable a feature of @jack_devin. * * Since: 3.0.0 */ void ags_jack_devin_set_flags(AgsJackDevin *jack_devin, guint flags) { GRecMutex *jack_devin_mutex; if(!AGS_IS_JACK_DEVIN(jack_devin)){ return; } /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->flags |= flags; g_rec_mutex_unlock(jack_devin_mutex); } /** * ags_jack_devin_unset_flags: * @jack_devin: the #AgsJackDevin * @flags: see #AgsJackDevinFlags-enum * * Disable a feature of @jack_devin. * * Since: 3.0.0 */ void ags_jack_devin_unset_flags(AgsJackDevin *jack_devin, guint flags) { GRecMutex *jack_devin_mutex; if(!AGS_IS_JACK_DEVIN(jack_devin)){ return; } /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->flags &= (~flags); g_rec_mutex_unlock(jack_devin_mutex); } void ags_jack_devin_set_device(AgsSoundcard *soundcard, gchar *device) { AgsJackDevin *jack_devin; GList *jack_port, *jack_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* check device */ g_rec_mutex_lock(jack_devin_mutex); if(jack_devin->card_uri == device || !g_ascii_strcasecmp(jack_devin->card_uri, device)){ g_rec_mutex_unlock(jack_devin_mutex); return; } if(!g_str_has_prefix(device, "ags-jack-devin-")){ g_rec_mutex_unlock(jack_devin_mutex); g_warning("invalid JACK device prefix"); return; } ret = sscanf(device, "ags-jack-devin-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(jack_devin_mutex); g_warning("invalid JACK device specifier"); return; } g_free(jack_devin->card_uri); jack_devin->card_uri = g_strdup(device); /* apply name to port */ g_rec_mutex_unlock(jack_devin_mutex); #if 0 pcm_channels = jack_devin->pcm_channels; jack_port_start = jack_port = g_list_copy(jack_devin->jack_port); for(i = 0; i < pcm_channels && jack_port != NULL; i++){ str = g_strdup_printf("ags%d-%04d", nth_card, i); g_object_set(jack_port->data, "port-name", str, NULL); g_free(str); jack_port = jack_port->next; } g_list_free(jack_port_start); #endif } gchar* ags_jack_devin_get_device(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gchar *device; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); device = NULL; /* get device */ g_rec_mutex_lock(jack_devin_mutex); device = g_strdup(jack_devin->card_uri); g_rec_mutex_unlock(jack_devin_mutex); return(device); } void ags_jack_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsJackDevin *jack_devin; jack_devin = AGS_JACK_DEVIN(soundcard); g_object_set(jack_devin, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_jack_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get presets */ g_rec_mutex_lock(jack_devin_mutex); if(channels != NULL){ *channels = jack_devin->pcm_channels; } if(rate != NULL){ *rate = jack_devin->samplerate; } if(buffer_size != NULL){ *buffer_size = jack_devin->buffer_size; } if(format != NULL){ *format = jack_devin->format; } g_rec_mutex_unlock(jack_devin_mutex); } /** * ags_jack_devin_list_cards: * @soundcard: the #AgsSoundcard * @card_id: JACK identifier * @card_name: card name * * List available soundcards. * * Since: 3.0.0 */ void ags_jack_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsJackClient *jack_client; AgsJackDevin *jack_devin; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; jack_devin = AGS_JACK_DEVIN(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_JACK_DEVIN(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_JACK_DEVIN(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_jack_devin_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "jack-client", &jack_client, NULL); if(jack_client != NULL){ /* get client name */ g_object_get(jack_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(jack_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_jack_devin_list_cards() - JACK client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_jack_devin_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_jack_devin_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_CAPTURE); } gboolean ags_jack_devin_is_starting(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gboolean is_starting; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* check is starting */ g_rec_mutex_lock(jack_devin_mutex); is_starting = ((AGS_JACK_DEVIN_START_RECORD & (jack_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_devin_mutex); return(is_starting); } gboolean ags_jack_devin_is_recording(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gboolean is_playing; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* check is starting */ g_rec_mutex_lock(jack_devin_mutex); is_playing = ((AGS_JACK_DEVIN_RECORD & (jack_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_devin_mutex); return(is_playing); } gchar* ags_jack_devin_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_jack_devin_port_init(AgsSoundcard *soundcard, GError **error) { AgsJackDevin *jack_devin; guint format, word_size; GRecMutex *jack_devin_mutex; if(ags_soundcard_is_recording(soundcard)){ return; } jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* retrieve word size */ g_rec_mutex_lock(jack_devin_mutex); switch(jack_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(jack_devin_mutex); g_warning("ags_jack_devin_port_init(): unsupported word size"); return; } /* prepare for capture */ jack_devin->flags |= (AGS_JACK_DEVIN_BUFFER3 | AGS_JACK_DEVIN_START_RECORD | AGS_JACK_DEVIN_RECORD | AGS_JACK_DEVIN_NONBLOCKING); memset(jack_devin->buffer[0], 0, jack_devin->pcm_channels * jack_devin->buffer_size * word_size); memset(jack_devin->buffer[1], 0, jack_devin->pcm_channels * jack_devin->buffer_size * word_size); memset(jack_devin->buffer[2], 0, jack_devin->pcm_channels * jack_devin->buffer_size * word_size); memset(jack_devin->buffer[3], 0, jack_devin->pcm_channels * jack_devin->buffer_size * word_size); /* */ jack_devin->tact_counter = 0.0; jack_devin->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(jack_devin))); jack_devin->tic_counter = 0; jack_devin->flags |= (AGS_JACK_DEVIN_INITIALIZED | AGS_JACK_DEVIN_START_RECORD | AGS_JACK_DEVIN_RECORD); g_atomic_int_and(&(jack_devin->sync_flags), (~(AGS_JACK_DEVIN_PASS_THROUGH))); g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_INITIAL_CALLBACK); g_rec_mutex_unlock(jack_devin_mutex); } void ags_jack_devin_port_record(AgsSoundcard *soundcard, GError **error) { AgsJackClient *jack_client; AgsJackDevin *jack_devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean jack_client_activated; GRecMutex *jack_devin_mutex; GRecMutex *jack_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* client */ g_rec_mutex_lock(jack_devin_mutex); jack_client = (AgsJackClient *) jack_devin->jack_client; callback_mutex = &(jack_devin->callback_mutex); callback_finish_mutex = &(jack_devin->callback_finish_mutex); g_rec_mutex_unlock(jack_devin_mutex); /* do capture */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->flags &= (~AGS_JACK_DEVIN_START_RECORD); if((AGS_JACK_DEVIN_INITIALIZED & (jack_devin->flags)) == 0){ g_rec_mutex_unlock(jack_devin_mutex); return; } switch(jack_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(jack_devin_mutex); g_warning("ags_jack_devin_port_record(): unsupported word size"); return; } g_rec_mutex_unlock(jack_devin_mutex); /* get client mutex */ jack_client_mutex = AGS_JACK_CLIENT_GET_OBJ_MUTEX(jack_client); /* get activated */ g_rec_mutex_lock(jack_client_mutex); jack_client_activated = ((AGS_JACK_CLIENT_ACTIVATED & (jack_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(jack_client_mutex); if(jack_client_activated){ /* signal */ if((AGS_JACK_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_CALLBACK_DONE); if((AGS_JACK_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(jack_devin->sync_flags)))) != 0){ g_cond_signal(&(jack_devin->callback_cond)); } g_mutex_unlock(callback_mutex); } /* wait callback */ if((AGS_JACK_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0){ g_mutex_lock(callback_finish_mutex); if((AGS_JACK_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0){ g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT); while((AGS_JACK_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(jack_devin->sync_flags)))) == 0 && (AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_devin->sync_flags)))) != 0){ g_cond_wait(&(jack_devin->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(jack_devin->sync_flags), (~(AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT | AGS_JACK_DEVIN_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(jack_devin->sync_flags), (~AGS_JACK_DEVIN_INITIAL_CALLBACK)); } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) jack_devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) jack_devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) jack_devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_jack_devin_port_free(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; AgsApplicationContext *application_context; guint word_size; GRecMutex *jack_devin_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* */ g_rec_mutex_lock(jack_devin_mutex); if((AGS_JACK_DEVIN_INITIALIZED & (jack_devin->flags)) == 0){ g_rec_mutex_unlock(jack_devin_mutex); return; } // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); callback_mutex = &(jack_devin->callback_mutex); callback_finish_mutex = &(jack_devin->callback_finish_mutex); jack_devin->flags &= (~(AGS_JACK_DEVIN_BUFFER0 | AGS_JACK_DEVIN_BUFFER1 | AGS_JACK_DEVIN_BUFFER2 | AGS_JACK_DEVIN_BUFFER3 | AGS_JACK_DEVIN_RECORD)); g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_PASS_THROUGH); g_atomic_int_and(&(jack_devin->sync_flags), (~AGS_JACK_DEVIN_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_CALLBACK_DONE); if((AGS_JACK_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(jack_devin->sync_flags)))) != 0){ g_cond_signal(&(jack_devin->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(jack_devin->sync_flags), AGS_JACK_DEVIN_CALLBACK_FINISH_DONE); if((AGS_JACK_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(jack_devin->sync_flags)))) != 0){ g_cond_signal(&(jack_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ jack_devin->note_offset = jack_devin->start_note_offset; jack_devin->note_offset_absolute = jack_devin->start_note_offset; switch(jack_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_jack_devin_free(): unsupported word size"); } memset(jack_devin->buffer[1], 0, (size_t) jack_devin->pcm_channels * jack_devin->buffer_size * word_size); memset(jack_devin->buffer[2], 0, (size_t) jack_devin->pcm_channels * jack_devin->buffer_size * word_size); memset(jack_devin->buffer[3], 0, (size_t) jack_devin->pcm_channels * jack_devin->buffer_size * word_size); memset(jack_devin->buffer[0], 0, (size_t) jack_devin->pcm_channels * jack_devin->buffer_size * word_size); g_rec_mutex_unlock(jack_devin_mutex); } void ags_jack_devin_tic(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* determine if attack should be switched */ g_rec_mutex_lock(jack_devin_mutex); delay = jack_devin->delay[jack_devin->tic_counter]; delay_counter = jack_devin->delay_counter; note_offset = jack_devin->note_offset; note_offset_absolute = jack_devin->note_offset_absolute; loop_left = jack_devin->loop_left; loop_right = jack_devin->loop_right; do_loop = jack_devin->do_loop; g_rec_mutex_unlock(jack_devin_mutex); if(delay_counter + 1 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->delay_counter = delay_counter + 1.0 - delay; jack_devin->tact_counter += 1.0; g_rec_mutex_unlock(jack_devin_mutex); }else{ g_rec_mutex_lock(jack_devin_mutex); jack_devin->delay_counter += 1.0; g_rec_mutex_unlock(jack_devin_mutex); } } void ags_jack_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* offset changed */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->tic_counter += 1; if(jack_devin->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ jack_devin->tic_counter = 0; } g_rec_mutex_unlock(jack_devin_mutex); } void ags_jack_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set bpm */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->bpm = bpm; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_adjust_delay_and_attack(jack_devin); } gdouble ags_jack_devin_get_bpm(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gdouble bpm; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get bpm */ g_rec_mutex_lock(jack_devin_mutex); bpm = jack_devin->bpm; g_rec_mutex_unlock(jack_devin_mutex); return(bpm); } void ags_jack_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set delay factor */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->delay_factor = delay_factor; g_rec_mutex_unlock(jack_devin_mutex); ags_jack_devin_adjust_delay_and_attack(jack_devin); } gdouble ags_jack_devin_get_delay_factor(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gdouble delay_factor; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get delay factor */ g_rec_mutex_lock(jack_devin_mutex); delay_factor = jack_devin->delay_factor; g_rec_mutex_unlock(jack_devin_mutex); return(delay_factor); } gdouble ags_jack_devin_get_delay(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint delay_index; gdouble delay; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get delay */ g_rec_mutex_lock(jack_devin_mutex); delay_index = jack_devin->tic_counter; delay = jack_devin->delay[delay_index]; g_rec_mutex_unlock(jack_devin_mutex); return(delay); } gdouble ags_jack_devin_get_absolute_delay(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; gdouble absolute_delay; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get absolute delay */ g_rec_mutex_lock(jack_devin_mutex); absolute_delay = (60.0 * (((gdouble) jack_devin->samplerate / (gdouble) jack_devin->buffer_size) / (gdouble) jack_devin->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) jack_devin->delay_factor))); g_rec_mutex_unlock(jack_devin_mutex); return(absolute_delay); } guint ags_jack_devin_get_attack(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint attack_index; guint attack; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get attack */ g_rec_mutex_lock(jack_devin_mutex); attack_index = jack_devin->tic_counter; attack = jack_devin->attack[attack_index]; g_rec_mutex_unlock(jack_devin_mutex); return(attack); } void* ags_jack_devin_get_buffer(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; void *buffer; jack_devin = AGS_JACK_DEVIN(soundcard); if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER0)){ buffer = jack_devin->buffer[0]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER1)){ buffer = jack_devin->buffer[1]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER2)){ buffer = jack_devin->buffer[2]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER3)){ buffer = jack_devin->buffer[3]; }else{ buffer = NULL; } return(buffer); } void* ags_jack_devin_get_next_buffer(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; void *buffer; jack_devin = AGS_JACK_DEVIN(soundcard); // g_message("next - 0x%0x", ((AGS_JACK_DEVIN_BUFFER0 | // AGS_JACK_DEVIN_BUFFER1 | // AGS_JACK_DEVIN_BUFFER2 | // AGS_JACK_DEVIN_BUFFER3) & (jack_devin->flags))); if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER0)){ buffer = jack_devin->buffer[1]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER1)){ buffer = jack_devin->buffer[2]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER2)){ buffer = jack_devin->buffer[3]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER3)){ buffer = jack_devin->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_jack_devin_get_prev_buffer(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; void *buffer; jack_devin = AGS_JACK_DEVIN(soundcard); if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER0)){ buffer = jack_devin->buffer[3]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER1)){ buffer = jack_devin->buffer[0]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER2)){ buffer = jack_devin->buffer[1]; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER3)){ buffer = jack_devin->buffer[2]; }else{ buffer = NULL; } return(buffer); } void ags_jack_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsJackDevin *jack_devin; GRecMutex *buffer_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); buffer_mutex = NULL; if(jack_devin->buffer != NULL){ if(buffer == jack_devin->buffer[0]){ buffer_mutex = jack_devin->buffer_mutex[0]; }else if(buffer == jack_devin->buffer[1]){ buffer_mutex = jack_devin->buffer_mutex[1]; }else if(buffer == jack_devin->buffer[2]){ buffer_mutex = jack_devin->buffer_mutex[2]; }else if(buffer == jack_devin->buffer[3]){ buffer_mutex = jack_devin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_jack_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsJackDevin *jack_devin; GRecMutex *buffer_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); buffer_mutex = NULL; if(jack_devin->buffer != NULL){ if(buffer == jack_devin->buffer[0]){ buffer_mutex = jack_devin->buffer_mutex[0]; }else if(buffer == jack_devin->buffer[1]){ buffer_mutex = jack_devin->buffer_mutex[1]; }else if(buffer == jack_devin->buffer[2]){ buffer_mutex = jack_devin->buffer_mutex[2]; }else if(buffer == jack_devin->buffer[3]){ buffer_mutex = jack_devin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_jack_devin_get_delay_counter(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint delay_counter; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* delay counter */ g_rec_mutex_lock(jack_devin_mutex); delay_counter = jack_devin->delay_counter; g_rec_mutex_unlock(jack_devin_mutex); return(delay_counter); } void ags_jack_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set note offset */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->start_note_offset = start_note_offset; g_rec_mutex_unlock(jack_devin_mutex); } guint ags_jack_devin_get_start_note_offset(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint start_note_offset; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set note offset */ g_rec_mutex_lock(jack_devin_mutex); start_note_offset = jack_devin->start_note_offset; g_rec_mutex_unlock(jack_devin_mutex); return(start_note_offset); } void ags_jack_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set note offset */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->note_offset = note_offset; g_rec_mutex_unlock(jack_devin_mutex); } guint ags_jack_devin_get_note_offset(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint note_offset; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set note offset */ g_rec_mutex_lock(jack_devin_mutex); note_offset = jack_devin->note_offset; g_rec_mutex_unlock(jack_devin_mutex); return(note_offset); } void ags_jack_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set note offset */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(jack_devin_mutex); } guint ags_jack_devin_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint note_offset_absolute; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set note offset */ g_rec_mutex_lock(jack_devin_mutex); note_offset_absolute = jack_devin->note_offset_absolute; g_rec_mutex_unlock(jack_devin_mutex); return(note_offset_absolute); } void ags_jack_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* set loop */ g_rec_mutex_lock(jack_devin_mutex); jack_devin->loop_left = loop_left; jack_devin->loop_right = loop_right; jack_devin->do_loop = do_loop; if(do_loop){ jack_devin->loop_offset = jack_devin->note_offset; } g_rec_mutex_unlock(jack_devin_mutex); } void ags_jack_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsJackDevin *jack_devin; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get loop */ g_rec_mutex_lock(jack_devin_mutex); if(loop_left != NULL){ *loop_left = jack_devin->loop_left; } if(loop_right != NULL){ *loop_right = jack_devin->loop_right; } if(do_loop != NULL){ *do_loop = jack_devin->do_loop; } g_rec_mutex_unlock(jack_devin_mutex); } guint ags_jack_devin_get_loop_offset(AgsSoundcard *soundcard) { AgsJackDevin *jack_devin; guint loop_offset; GRecMutex *jack_devin_mutex; jack_devin = AGS_JACK_DEVIN(soundcard); /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get loop offset */ g_rec_mutex_lock(jack_devin_mutex); loop_offset = jack_devin->loop_offset; g_rec_mutex_unlock(jack_devin_mutex); return(loop_offset); } /** * ags_jack_devin_switch_buffer_flag: * @jack_devin: an #AgsJackDevin * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_jack_devin_switch_buffer_flag(AgsJackDevin *jack_devin) { GRecMutex *jack_devin_mutex; if(!AGS_IS_JACK_DEVIN(jack_devin)){ return; } /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* switch buffer flag */ g_rec_mutex_lock(jack_devin_mutex); if((AGS_JACK_DEVIN_BUFFER0 & (jack_devin->flags)) != 0){ jack_devin->flags &= (~AGS_JACK_DEVIN_BUFFER0); jack_devin->flags |= AGS_JACK_DEVIN_BUFFER1; }else if((AGS_JACK_DEVIN_BUFFER1 & (jack_devin->flags)) != 0){ jack_devin->flags &= (~AGS_JACK_DEVIN_BUFFER1); jack_devin->flags |= AGS_JACK_DEVIN_BUFFER2; }else if((AGS_JACK_DEVIN_BUFFER2 & (jack_devin->flags)) != 0){ jack_devin->flags &= (~AGS_JACK_DEVIN_BUFFER2); jack_devin->flags |= AGS_JACK_DEVIN_BUFFER3; }else if((AGS_JACK_DEVIN_BUFFER3 & (jack_devin->flags)) != 0){ jack_devin->flags &= (~AGS_JACK_DEVIN_BUFFER3); jack_devin->flags |= AGS_JACK_DEVIN_BUFFER0; } g_rec_mutex_unlock(jack_devin_mutex); } /** * ags_jack_devin_adjust_delay_and_attack: * @jack_devin: the #AgsJackDevin * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_jack_devin_adjust_delay_and_attack(AgsJackDevin *jack_devin) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *jack_devin_mutex; if(!AGS_IS_JACK_DEVIN(jack_devin)){ return; } /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get some initial values */ delay = ags_jack_devin_get_absolute_delay(AGS_SOUNDCARD(jack_devin)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(jack_devin_mutex); default_tact_frames = (guint) (delay * jack_devin->buffer_size); delay_tact_frames = (guint) (floor(delay) * jack_devin->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; jack_devin->attack[0] = (guint) floor(0.25 * jack_devin->buffer_size); next_attack = (((jack_devin->attack[i] + default_tact_frames) / jack_devin->buffer_size) - delay) * jack_devin->buffer_size; if(next_attack >= jack_devin->buffer_size){ next_attack = jack_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ jack_devin->attack[i] = jack_devin->attack[i] - ((gdouble) next_attack / 2.0); if(jack_devin->attack[i] < 0){ jack_devin->attack[i] = 0; } if(jack_devin->attack[i] >= jack_devin->buffer_size){ jack_devin->attack[i] = jack_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= jack_devin->buffer_size){ next_attack = jack_devin->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ jack_devin->attack[i] = next_attack; next_attack = (((jack_devin->attack[i] + default_tact_frames) / jack_devin->buffer_size) - delay) * jack_devin->buffer_size; if(next_attack >= jack_devin->buffer_size){ next_attack = jack_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ jack_devin->attack[i] = jack_devin->attack[i] - ((gdouble) next_attack / 2.0); if(jack_devin->attack[i] < 0){ jack_devin->attack[i] = 0; } if(jack_devin->attack[i] >= jack_devin->buffer_size){ jack_devin->attack[i] = jack_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= jack_devin->buffer_size){ next_attack = jack_devin->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", jack_devin->attack[i]); #endif } jack_devin->attack[0] = jack_devin->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ jack_devin->delay[i] = ((gdouble) (default_tact_frames + jack_devin->attack[i] - jack_devin->attack[i + 1])) / (gdouble) jack_devin->buffer_size; #ifdef AGS_DEBUG g_message("%f", jack_devin->delay[i]); #endif } jack_devin->delay[i] = ((gdouble) (default_tact_frames + jack_devin->attack[i] - jack_devin->attack[0])) / (gdouble) jack_devin->buffer_size; g_rec_mutex_unlock(jack_devin_mutex); } /** * ags_jack_devin_realloc_buffer: * @jack_devin: the #AgsJackDevin * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_jack_devin_realloc_buffer(AgsJackDevin *jack_devin) { AgsJackClient *jack_client; guint port_count; guint pcm_channels; guint buffer_size; guint word_size; GRecMutex *jack_devin_mutex; if(!AGS_IS_JACK_DEVIN(jack_devin)){ return; } /* get jack devin mutex */ jack_devin_mutex = AGS_JACK_DEVIN_GET_OBJ_MUTEX(jack_devin); /* get word size */ g_rec_mutex_lock(jack_devin_mutex); jack_client = jack_devin->jack_client; port_count = g_list_length(jack_devin->jack_port); pcm_channels = jack_devin->pcm_channels; buffer_size = jack_devin->buffer_size; switch(jack_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_warning("ags_jack_devin_realloc_buffer(): unsupported word size"); return; } g_rec_mutex_unlock(jack_devin_mutex); if(port_count < pcm_channels){ AgsJackPort *jack_port; gchar *str; guint nth_soundcard; guint i; g_rec_mutex_lock(jack_devin_mutex); if(jack_devin->card_uri != NULL){ sscanf(jack_devin->card_uri, "ags-jack-devin-%u", &nth_soundcard); }else{ g_rec_mutex_unlock(jack_devin_mutex); g_warning("ags_jack_devin_realloc_buffer() - card uri not set"); return; } g_rec_mutex_unlock(jack_devin_mutex); for(i = port_count; i < pcm_channels; i++){ str = g_strdup_printf("ags%d-%04d", nth_soundcard, i); jack_port = ags_jack_port_new(jack_client); ags_jack_client_add_port((AgsJackClient *) jack_client, (GObject *) jack_port); g_rec_mutex_lock(jack_devin_mutex); jack_devin->jack_port = g_list_prepend(jack_devin->jack_port, jack_port); if(jack_devin->port_name == NULL){ jack_devin->port_name = (gchar **) malloc(2 * sizeof(gchar *)); jack_devin->port_name[0] = g_strdup(str); }else{ jack_devin->port_name = (gchar **) realloc(jack_devin->port_name, (i + 2) * sizeof(gchar *)); jack_devin->port_name[i] = g_strdup(str); } g_rec_mutex_unlock(jack_devin_mutex); ags_jack_port_register(jack_port, str, TRUE, FALSE, FALSE); } jack_devin->port_name[jack_devin->pcm_channels] = NULL; }else if(port_count > pcm_channels){ GList *jack_port_start, *jack_port; guint i; g_rec_mutex_lock(jack_devin_mutex); jack_port = jack_port_start = g_list_copy(jack_devin->jack_port); g_rec_mutex_unlock(jack_devin_mutex); for(i = 0; i < port_count - pcm_channels; i++){ jack_devin->jack_port = g_list_remove(jack_devin->jack_port, jack_port->data); ags_jack_port_unregister(jack_port->data); g_object_unref(jack_port->data); jack_port = jack_port->next; } g_list_free(jack_port_start); g_rec_mutex_lock(jack_devin_mutex); jack_devin->port_name = (gchar **) realloc(jack_devin->port_name, (jack_devin->pcm_channels + 1) * sizeof(gchar *)); jack_devin->port_name[jack_devin->pcm_channels] = NULL; g_rec_mutex_unlock(jack_devin_mutex); } /* AGS_JACK_DEVIN_BUFFER_0 */ if(jack_devin->buffer[0] != NULL){ free(jack_devin->buffer[0]); } jack_devin->buffer[0] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * word_size); /* AGS_JACK_DEVIN_BUFFER_1 */ if(jack_devin->buffer[1] != NULL){ free(jack_devin->buffer[1]); } jack_devin->buffer[1] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * word_size); /* AGS_JACK_DEVIN_BUFFER_2 */ if(jack_devin->buffer[2] != NULL){ free(jack_devin->buffer[2]); } jack_devin->buffer[2] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * word_size); /* AGS_JACK_DEVIN_BUFFER_3 */ if(jack_devin->buffer[3] != NULL){ free(jack_devin->buffer[3]); } jack_devin->buffer[3] = (void *) malloc(jack_devin->pcm_channels * jack_devin->buffer_size * word_size); } /** * ags_jack_devin_new: * * Creates a new instance of #AgsJackDevin. * * Returns: the new #AgsJackDevin * * Since: 3.0.0 */ AgsJackDevin* ags_jack_devin_new() { AgsJackDevin *jack_devin; jack_devin = (AgsJackDevin *) g_object_new(AGS_TYPE_JACK_DEVIN, NULL); return(jack_devin); } gsequencer-3.1.3/ags/audio/jack/ags_jack_midiin.h0000644000175000017500000001274313607210263016636 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_JACK_MIDIIN_H__ #define __AGS_JACK_MIDIIN_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_JACK_MIDIIN (ags_jack_midiin_get_type()) #define AGS_JACK_MIDIIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_JACK_MIDIIN, AgsJackMidiin)) #define AGS_JACK_MIDIIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_JACK_MIDIIN, AgsJackMidiin)) #define AGS_IS_JACK_MIDIIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_JACK_MIDIIN)) #define AGS_IS_JACK_MIDIIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_JACK_MIDIIN)) #define AGS_JACK_MIDIIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_JACK_MIDIIN, AgsJackMidiinClass)) #define AGS_JACK_MIDIIN_GET_OBJ_MUTEX(obj) (&(((AgsJackMidiin *) obj)->obj_mutex)) #define AGS_JACK_MIDIIN_DEFAULT_BUFFER_SIZE (256) typedef struct _AgsJackMidiin AgsJackMidiin; typedef struct _AgsJackMidiinClass AgsJackMidiinClass; /** * AgsJackMidiinFlags: * @AGS_JACK_MIDIIN_ADDED_TO_REGISTRY: the JACK midiin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_JACK_MIDIIN_CONNECTED: indicates the JACK midiin was connected by calling #AgsConnectable::connect() * @AGS_JACK_MIDIIN_BUFFER0: ring-buffer 0 * @AGS_JACK_MIDIIN_BUFFER1: ring-buffer 1 * @AGS_JACK_MIDIIN_BUFFER2: ring-buffer 2 * @AGS_JACK_MIDIIN_BUFFER3: ring-buffer 3 * @AGS_JACK_MIDIIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_JACK_MIDIIN_RECORD: is recording * @AGS_JACK_MIDIIN_SHUTDOWN: stop recording * @AGS_JACK_MIDIIN_START_RECORD: just started recording * @AGS_JACK_MIDIIN_NONBLOCKING: do non-blocking calls * @AGS_JACK_MIDIIN_INITIALIZED: recording is initialized * * Enum values to control the behavior or indicate internal state of #AgsJackMidiin by * enable/disable as flags. */ typedef enum { AGS_JACK_MIDIIN_ADDED_TO_REGISTRY = 1, AGS_JACK_MIDIIN_CONNECTED = 1 << 1, AGS_JACK_MIDIIN_BUFFER0 = 1 << 2, AGS_JACK_MIDIIN_BUFFER1 = 1 << 3, AGS_JACK_MIDIIN_BUFFER2 = 1 << 4, AGS_JACK_MIDIIN_BUFFER3 = 1 << 5, AGS_JACK_MIDIIN_ATTACK_FIRST = 1 << 6, AGS_JACK_MIDIIN_RECORD = 1 << 7, AGS_JACK_MIDIIN_SHUTDOWN = 1 << 8, AGS_JACK_MIDIIN_START_RECORD = 1 << 9, AGS_JACK_MIDIIN_NONBLOCKING = 1 << 10, AGS_JACK_MIDIIN_INITIALIZED = 1 << 11, }AgsJackMidiinFlags; /** * AgsJackMidiinSyncFlags: * @AGS_JACK_MIDIIN_PASS_THROUGH: do not sync * @AGS_JACK_MIDIIN_INITIAL_CALLBACK: initial callback * @AGS_JACK_MIDIIN_CALLBACK_WAIT: sync wait, sequencer conditional lock * @AGS_JACK_MIDIIN_CALLBACK_DONE: sync done, sequencer conditional lock * @AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between sequencer and client. */ typedef enum{ AGS_JACK_MIDIIN_PASS_THROUGH = 1, AGS_JACK_MIDIIN_INITIAL_CALLBACK = 1 << 1, AGS_JACK_MIDIIN_CALLBACK_WAIT = 1 << 2, AGS_JACK_MIDIIN_CALLBACK_DONE = 1 << 3, AGS_JACK_MIDIIN_CALLBACK_FINISH_WAIT = 1 << 4, AGS_JACK_MIDIIN_CALLBACK_FINISH_DONE = 1 << 5, }AgsJackMidiinSyncFlags; #define AGS_JACK_MIDIIN_ERROR (ags_jack_midiin_error_quark()) typedef enum{ AGS_JACK_MIDIIN_ERROR_LOCKED_SOUNDCARD, }AgsJackMidiinError; struct _AgsJackMidiin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; GRecMutex **buffer_mutex; char **buffer; guint buffer_size[4]; double bpm; // beats per minute gdouble delay; gdouble delay_factor; guint latency; gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; gchar *card_uri; GObject *jack_client; gchar **port_name; GList *jack_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsJackMidiinClass { GObjectClass gobject; }; GType ags_jack_midiin_get_type(); GQuark ags_jack_midiin_error_quark(); gboolean ags_jack_midiin_test_flags(AgsJackMidiin *jack_midiin, guint flags); void ags_jack_midiin_set_flags(AgsJackMidiin *jack_midiin, guint flags); void ags_jack_midiin_unset_flags(AgsJackMidiin *jack_midiin, guint flags); void ags_jack_midiin_switch_buffer_flag(AgsJackMidiin *jack_midiin); AgsJackMidiin* ags_jack_midiin_new(); G_END_DECLS #endif /*__AGS_JACK_MIDIIN_H__*/ gsequencer-3.1.3/ags/audio/ags_audio_signal.h0000644000175000017500000001577713616617253016147 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_SIGNAL_H__ #define __AGS_AUDIO_SIGNAL_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_SIGNAL (ags_audio_signal_get_type()) #define AGS_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_SIGNAL, AgsAudioSignal)) #define AGS_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIO_SIGNAL, AgsAudioSignalClass)) #define AGS_IS_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_SIGNAL)) #define AGS_IS_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_SIGNAL)) #define AGS_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_AUDIO_SIGNAL, AgsAudioSignalClass)) #define AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX(obj) (&(((AgsAudioSignal *) obj)->obj_mutex)) #define AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX(obj) (&(((AgsAudioSignal *) obj)->stream_mutex)) typedef struct _AgsAudioSignal AgsAudioSignal; typedef struct _AgsAudioSignalClass AgsAudioSignalClass; /** * AgsAudioSignalFlags: * @AGS_AUDIO_SIGNAL_ADDED_TO_REGISTRY: the audio signal was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_SIGNAL_CONNECTED: indicates the audio signal was connected by calling #AgsConnectable::connect() * @AGS_AUDIO_SIGNAL_TEMPLATE: the audio signal acts as a template * @AGS_AUDIO_SIGNAL_RT_TEMPLATE: the audio signal acts as a realtime template * * Enum values to control the behavior or indicate internal state of #AgsAudioSignal by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_SIGNAL_ADDED_TO_REGISTRY = 1, AGS_AUDIO_SIGNAL_CONNECTED = 1 << 1, AGS_AUDIO_SIGNAL_TEMPLATE = 1 << 2, AGS_AUDIO_SIGNAL_RT_TEMPLATE = 1 << 3, // AGS_AUDIO_SIGNAL_PLAY_DONE = 1 << 3, // AGS_AUDIO_SIGNAL_STANDALONE = 1 << 4, }AgsAudioSignalFlags; struct _AgsAudioSignal { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *recycling; GObject *output_soundcard; gint output_soundcard_channel; GObject *input_soundcard; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; guint word_size; guint length; guint first_frame; guint last_frame; // the last frame at stream_end guint frame_count; // initial size guint loop_start; guint loop_end; gdouble delay; guint attack; AgsComplex damping; AgsComplex vibration; guint timbre_start; guint timbre_end; GObject *template; GObject *rt_template; GList *note; GObject *recall_id; // AGS_TYPE_RECALL_ID to identify the AgsAudioSignal GRecMutex stream_mutex; GList *stream; GList *stream_current; GList *stream_end; }; struct _AgsAudioSignalClass { GObjectClass gobject; void (*add_note)(AgsAudioSignal *audio_signal, GObject *note); void (*remove_note)(AgsAudioSignal *audio_signal, GObject *note); void (*refresh_data)(AgsAudioSignal *audio_signal); }; GType ags_audio_signal_get_type(); GRecMutex* ags_audio_signal_get_obj_mutex(AgsAudioSignal *audio_signal); void ags_audio_signal_stream_lock(AgsAudioSignal *audio_signal); void ags_audio_signal_stream_unlock(AgsAudioSignal *audio_signal); gboolean ags_audio_signal_test_flags(AgsAudioSignal *audio_signal, guint flags); void ags_audio_signal_set_flags(AgsAudioSignal *audio_signal, guint flags); void ags_audio_signal_unset_flags(AgsAudioSignal *audio_signal, guint flags); void* ags_stream_alloc(guint buffer_size, guint format); void ags_stream_free(void *buffer); /* parent */ GObject* ags_audio_signal_get_recycling(AgsAudioSignal *audio_signal); void ags_audio_signal_set_recycling(AgsAudioSignal *audio_signal, GObject *recycling); /* soundcard */ GObject* ags_audio_signal_get_output_soundcard(AgsAudioSignal *audio_signal); void ags_audio_signal_set_output_soundcard(AgsAudioSignal *audio_signal, GObject *output_soundcard); GObject* ags_audio_signal_get_input_soundcard(AgsAudioSignal *audio_signal); void ags_audio_signal_set_input_soundcard(AgsAudioSignal *audio_signal, GObject *input_soundcard); /* presets */ guint ags_audio_signal_get_samplerate(AgsAudioSignal *audio_signal); void ags_audio_signal_set_samplerate(AgsAudioSignal *audio_signal, guint samplerate); guint ags_audio_signal_get_buffer_size(AgsAudioSignal *audio_signal); void ags_audio_signal_set_buffer_size(AgsAudioSignal *audio_signal, guint buffer_size); guint ags_audio_signal_get_format(AgsAudioSignal *audio_signal); void ags_audio_signal_set_format(AgsAudioSignal *audio_signal, guint format); /* children */ GList* ags_audio_signal_get_note(AgsAudioSignal *audio_signal); void ags_audio_signal_set_note(AgsAudioSignal *audio_signal, GList *note); void ags_audio_signal_add_note(AgsAudioSignal *audio_signal, GObject *note); void ags_audio_signal_remove_note(AgsAudioSignal *audio_signal, GObject *note); /* presets related */ void ags_audio_signal_refresh_data(AgsAudioSignal *audio_signal); /* control */ void ags_audio_signal_add_stream(AgsAudioSignal *audio_signal); void ags_audio_signal_stream_resize(AgsAudioSignal *audio_signal, guint length); void ags_audio_signal_stream_safe_resize(AgsAudioSignal *audio_signal, guint length); void ags_audio_signal_duplicate_stream(AgsAudioSignal *audio_signal, AgsAudioSignal *template); void ags_audio_signal_feed(AgsAudioSignal *audio_signal, AgsAudioSignal *template, guint frame_count); /* query */ guint ags_audio_signal_get_length_till_current(AgsAudioSignal *audio_signal); AgsAudioSignal* ags_audio_signal_get_template(GList *audio_signal); GList* ags_audio_signal_get_rt_template(GList *audio_signal); GList* ags_audio_signal_find_stream_current(GList *audio_signal, GObject *recall_id); GList* ags_audio_signal_find_by_recall_id(GList *audio_signal, GObject *recall_id); gboolean ags_audio_signal_is_active(GList *audio_signal, GObject *recall_id); /* instantiate */ AgsAudioSignal* ags_audio_signal_new(GObject *output_soundcard, GObject *recycling, GObject *recall_id); AgsAudioSignal* ags_audio_signal_new_with_length(GObject *output_soundcard, GObject *recycling, GObject *recall_id, guint length); G_END_DECLS #endif /*__AGS_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/ags_buffer.h0000644000175000017500000000636313616617253014751 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUFFER_H__ #define __AGS_BUFFER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BUFFER (ags_buffer_get_type()) #define AGS_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUFFER, AgsBuffer)) #define AGS_BUFFER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BUFFER, AgsBufferClass)) #define AGS_IS_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_BUFFER)) #define AGS_IS_BUFFER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_BUFFER)) #define AGS_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_BUFFER, AgsBufferClass)) #define AGS_BUFFER_GET_OBJ_MUTEX(obj) (&(((AgsBuffer *) obj)->obj_mutex)) #define AGS_BUFFER_DEFAULT_TICKS_PER_QUARTER_BUFFER (16.0) typedef struct _AgsBuffer AgsBuffer; typedef struct _AgsBufferClass AgsBufferClass; /** * AgsBufferFlags: * @AGS_BUFFER_IS_SELECTED: is selected * * Enum values to control the behavior or indicate internal state of #AgsBuffer by * enable/disable as flags. */ typedef enum{ AGS_BUFFER_IS_SELECTED = 1, }AgsBufferFlags; struct _AgsBuffer { GObject gobject; guint flags; GRecMutex obj_mutex; guint64 x; guint64 selection_x0; guint64 selection_x1; guint samplerate; guint buffer_size; guint format; void *data; }; struct _AgsBufferClass { GObjectClass gobject; }; GType ags_buffer_get_type(); GRecMutex* ags_buffer_get_obj_mutex(AgsBuffer *buffer); void ags_buffer_lock(AgsBuffer *buffer); void ags_buffer_unlock(AgsBuffer *buffer); gboolean ags_buffer_test_flags(AgsBuffer *buffer, guint flags); void ags_buffer_set_flags(AgsBuffer *buffer, guint flags); void ags_buffer_unset_flags(AgsBuffer *buffer, guint flags); gint ags_buffer_sort_func(gconstpointer a, gconstpointer b); guint64 ags_buffer_get_x(AgsBuffer *buffer); void ags_buffer_set_x(AgsBuffer *buffer, guint64 x); guint ags_buffer_get_samplerate(AgsBuffer *buffer); void ags_buffer_set_samplerate(AgsBuffer *buffer, guint samplerate); guint ags_buffer_get_buffer_size(AgsBuffer *buffer); void ags_buffer_set_buffer_size(AgsBuffer *buffer, guint buffer_size); guint ags_buffer_get_format(AgsBuffer *buffer); void ags_buffer_set_format(AgsBuffer *buffer, guint format); gpointer ags_buffer_get_data(AgsBuffer *buffer); AgsBuffer* ags_buffer_duplicate(AgsBuffer *buffer); AgsBuffer* ags_buffer_new(); G_END_DECLS #endif /*__AGS_BUFFER_H__*/ gsequencer-3.1.3/ags/audio/ags_generic_recall_recycling.h0000644000175000017500000000451413607210263020457 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_GENERIC_RECALL_RECYCLING_H__ #define __AGS_GENERIC_RECALL_RECYCLING_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_GENERIC_RECALL_RECYCLING (ags_generic_recall_recycling_get_type()) #define AGS_GENERIC_RECALL_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_GENERIC_RECALL_RECYCLING, AgsGenericRecallRecycling)) #define AGS_GENERIC_RECALL_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_GENERIC_RECALL_RECYCLING, AgsGenericRecallRecyclingClass)) #define AGS_IS_GENERIC_RECALL_RECYCLING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_GENERIC_RECALL_RECYCLING)) #define AGS_IS_GENERIC_RECALL_RECYCLING_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_GENERIC_RECALL_RECYCLING)) #define AGS_GENERIC_RECALL_RECYCLING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_GENERIC_RECALL_RECYCLING, AgsGenericRecallRecyclingClass)) typedef struct _AgsGenericRecallRecycling AgsGenericRecallRecycling; typedef struct _AgsGenericRecallRecyclingClass AgsGenericRecallRecyclingClass; struct _AgsGenericRecallRecycling { AgsRecallRecycling recall_recycling; }; struct _AgsGenericRecallRecyclingClass { AgsRecallRecyclingClass recall_recycling; }; GType ags_generic_recall_recycling_get_type(); AgsGenericRecallRecycling* ags_generic_recall_recycling_new(AgsRecycling *recycling, GType child_type); G_END_DECLS #endif /*__AGS_GENERIC_RECALL_RECYCLING_H__*/ gsequencer-3.1.3/ags/audio/ags_generic_recall_channel_run.h0000644000175000017500000000476113607210263021000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_GENERIC_RECALL_CHANNEL_RUN_H__ #define __AGS_GENERIC_RECALL_CHANNEL_RUN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN (ags_generic_recall_channel_run_get_type()) #define AGS_GENERIC_RECALL_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN, AgsGenericRecallChannelRun)) #define AGS_GENERIC_RECALL_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN, AgsGenericRecallChannelRunClass)) #define AGS_IS_GENERIC_RECALL_CHANNEL_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN)) #define AGS_IS_GENERIC_RECALL_CHANNEL_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN)) #define AGS_GENERIC_RECALL_CHANNEL_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN, AgsGenericRecallChannelRunClass)) typedef struct _AgsGenericRecallChannelRun AgsGenericRecallChannelRun; typedef struct _AgsGenericRecallChannelRunClass AgsGenericRecallChannelRunClass; struct _AgsGenericRecallChannelRun { AgsRecallChannelRun recall_channel_run; GType generic_recall_recycling_child_type; }; struct _AgsGenericRecallChannelRunClass { AgsRecallChannelRunClass recall_channel_run; }; GType ags_generic_recall_channel_run_get_type(); AgsGenericRecallChannelRun* ags_generic_recall_channel_run_new(AgsChannel *source, GType child_type, GType generic_recall_recycling_child_type); G_END_DECLS #endif /*__AGS_GENERIC_RECALL_CHANNEL_RUN_H__*/ gsequencer-3.1.3/ags/audio/ags_synth_enums.h0000644000175000017500000000304313607210263016032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_ENUMS_H__ #define __AGS_SYNTH_ENUMS_H__ #include #include #include G_BEGIN_DECLS /** * AgsSynthOscillatorMode: * @AGS_SYNTH_OSCILLATOR_SIN: sinus oscillator * @AGS_SYNTH_OSCILLATOR_SAWTOOTH: sawtooth oscillator * @AGS_SYNTH_OSCILLATOR_TRIANGLE: triangle oscillator * @AGS_SYNTH_OSCILLATOR_SQUARE: square oscillator * @AGS_SYNTH_OSCILLATOR_IMPULSE: impulse oscillator * @AGS_SYNTH_OSCILLATOR_LAST: last mode * * Enum values to specify oscillator mode. */ typedef enum{ AGS_SYNTH_OSCILLATOR_SIN, AGS_SYNTH_OSCILLATOR_SAWTOOTH, AGS_SYNTH_OSCILLATOR_TRIANGLE, AGS_SYNTH_OSCILLATOR_SQUARE, AGS_SYNTH_OSCILLATOR_IMPULSE, AGS_SYNTH_OSCILLATOR_LAST, }AgsSynthOscillatorMode; G_END_DECLS #endif /*__AGS_SYNTH_ENUMS_H__*/ gsequencer-3.1.3/ags/audio/task/0000755000175000017500000000000013622252254013500 500000000000000gsequencer-3.1.3/ags/audio/task/ags_remove_note.c0000644000175000017500000002326713607210263016747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_remove_note_class_init(AgsRemoveNoteClass *remove_note); void ags_remove_note_init(AgsRemoveNote *remove_note); void ags_remove_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_remove_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_remove_note_dispose(GObject *gobject); void ags_remove_note_finalize(GObject *gobject); void ags_remove_note_launch(AgsTask *task); /** * SECTION:ags_remove_note * @short_description: remove note object from notation * @title: AgsRemoveNote * @section_id: * @include: ags/audio/task/ags_remove_note.h * * The #AgsRemoveNote task removes #AgsNote from #AgsNotation. */ static gpointer ags_remove_note_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_NOTE, PROP_AUDIO_CHANNEL, PROP_USE_SELECTION_LIST, }; GType ags_remove_note_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_remove_note = 0; static const GTypeInfo ags_remove_note_info = { sizeof(AgsRemoveNoteClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_remove_note_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRemoveNote), 0, /* n_preallocs */ (GInstanceInitFunc) ags_remove_note_init, }; ags_type_remove_note = g_type_register_static(AGS_TYPE_TASK, "AgsRemoveNote", &ags_remove_note_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_remove_note); } return g_define_type_id__volatile; } void ags_remove_note_class_init(AgsRemoveNoteClass *remove_note) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_remove_note_parent_class = g_type_class_peek_parent(remove_note); /* gobject */ gobject = (GObjectClass *) remove_note; gobject->set_property = ags_remove_note_set_property; gobject->get_property = ags_remove_note_get_property; gobject->dispose = ags_remove_note_dispose; gobject->finalize = ags_remove_note_finalize; /* properties */ /** * AgsRemoveNote:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of remove note"), i18n_pspec("The audio of remove note task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsRemoveNote:note: * * The assigned #AgsNote * * Since: 3.0.0 */ param_spec = g_param_spec_object("note", i18n_pspec("note of remove note"), i18n_pspec("The note of remove note task"), AGS_TYPE_NOTE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE, param_spec); /** * AgsRemoveNote:audio-channel: * * The assigned audio channel * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("audio channel of notation"), i18n_pspec("The audio channel of notation"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsRemoveNote:use-selection-list: * * The notation's use-selection-list. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("use-selection-list", i18n_pspec("use selection list"), i18n_pspec("Use selection list of notation"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_USE_SELECTION_LIST, param_spec); /* task */ task = (AgsTaskClass *) remove_note; task->launch = ags_remove_note_launch; } void ags_remove_note_init(AgsRemoveNote *remove_note) { remove_note->audio = NULL; remove_note->note = NULL; remove_note->audio_channel = 0; remove_note->use_selection_list = FALSE; } void ags_remove_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRemoveNote *remove_note; remove_note = AGS_REMOVE_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(remove_note->audio == audio){ return; } if(remove_note->audio != NULL){ g_object_unref(remove_note->audio); } if(audio != NULL){ g_object_ref(audio); } remove_note->audio = audio; } break; case PROP_NOTE: { AgsNote *note; note = (AgsNote *) g_value_get_object(value); if(remove_note->note == note){ return; } if(remove_note->note != NULL){ g_object_unref(remove_note->note); } if(note != NULL){ g_object_ref(note); } remove_note->note = note; } break; case PROP_AUDIO_CHANNEL: { remove_note->audio_channel = g_value_get_uint(value); } break; case PROP_USE_SELECTION_LIST: { remove_note->use_selection_list = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRemoveNote *remove_note; remove_note = AGS_REMOVE_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, remove_note->audio); } break; case PROP_NOTE: { g_value_set_object(value, remove_note->note); } break; case PROP_AUDIO_CHANNEL: { g_value_set_uint(value, remove_note->audio_channel); } break; case PROP_USE_SELECTION_LIST: { g_value_set_boolean(value, remove_note->use_selection_list); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_note_dispose(GObject *gobject) { AgsRemoveNote *remove_note; remove_note = AGS_REMOVE_NOTE(gobject); if(remove_note->audio != NULL){ g_object_unref(remove_note->audio); remove_note->audio = NULL; } if(remove_note->note != NULL){ g_object_unref(remove_note->note); remove_note->note = NULL; } /* call parent */ G_OBJECT_CLASS(ags_remove_note_parent_class)->dispose(gobject); } void ags_remove_note_finalize(GObject *gobject) { AgsRemoveNote *remove_note; remove_note = AGS_REMOVE_NOTE(gobject); if(remove_note->audio != NULL){ g_object_unref(remove_note->audio); } if(remove_note->note != NULL){ g_object_unref(remove_note->note); } /* call parent */ G_OBJECT_CLASS(ags_remove_note_parent_class)->finalize(gobject); } void ags_remove_note_launch(AgsTask *task) { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsRemoveNote *remove_note; AgsTimestamp *timestamp; GList *list; guint audio_channel; guint x0; GRecMutex *audio_mutex; remove_note = AGS_REMOVE_NOTE(task); g_return_if_fail(AGS_IS_AUDIO(remove_note->audio)); g_return_if_fail(AGS_IS_NOTE(remove_note->note)); /* get some fields */ audio = remove_note->audio; notation = NULL; audio_channel = remove_note->audio_channel; note = remove_note->note; g_object_get(note, "x0", &x0, NULL); /* create timestamp */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(x0 / AGS_NOTATION_DEFAULT_OFFSET); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* find near timestamp */ g_rec_mutex_lock(audio_mutex); list = ags_notation_find_near_timestamp(audio->notation, audio_channel, timestamp); g_rec_mutex_unlock(audio_mutex); if(list == NULL){ return; } /* remove note */ notation = list->data; ags_notation_remove_note(notation, note, remove_note->use_selection_list); g_object_unref(timestamp); } /** * ags_remove_note_new: * @audio: the #AgsAudio * @note: the #AgsNote to remove * @audio_channel: the audio channel * @use_selection_list: if %TRUE remove of selection, otherwise of notation * * Create a new instance of #AgsRemoveNote. * * Returns: the new #AgsRemoveNote * * Since: 3.0.0 */ AgsRemoveNote* ags_remove_note_new(AgsAudio *audio, AgsNote *note, guint audio_channel, gboolean use_selection_list) { AgsRemoveNote *remove_note; remove_note = (AgsRemoveNote *) g_object_new(AGS_TYPE_REMOVE_NOTE, "audio", audio, "note", note, "audio-channel", audio_channel, "use-selection-list", use_selection_list, NULL); return(remove_note); } gsequencer-3.1.3/ags/audio/task/ags_clear_audio_signal.c0000644000175000017500000002025413607210263020222 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_clear_audio_signal_class_init(AgsClearAudioSignalClass *clear_audio_signal); void ags_clear_audio_signal_init(AgsClearAudioSignal *clear_audio_signal); void ags_clear_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_clear_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_clear_audio_signal_dispose(GObject *gobject); void ags_clear_audio_signal_finalize(GObject *gobject); void ags_clear_audio_signal_launch(AgsTask *task); /** * SECTION:ags_clear_audio_signal * @short_description: clear audio signal object * @title: AgsClearAudioSignal * @section_id: * @include: ags/audio/task/ags_clear_audio_signal.h * * The #AgsClearAudioSignal task clears #AgsAudioSignal. */ static gpointer ags_clear_audio_signal_parent_class = NULL; enum{ PROP_0, PROP_AUDIO_SIGNAL, }; GType ags_clear_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_clear_audio_signal = 0; static const GTypeInfo ags_clear_audio_signal_info = { sizeof (AgsClearAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_clear_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsClearAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_clear_audio_signal_init, }; ags_type_clear_audio_signal = g_type_register_static(AGS_TYPE_TASK, "AgsClearAudioSignal", &ags_clear_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_clear_audio_signal); } return g_define_type_id__volatile; } void ags_clear_audio_signal_class_init(AgsClearAudioSignalClass *clear_audio_signal) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_clear_audio_signal_parent_class = g_type_class_peek_parent(clear_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) clear_audio_signal; gobject->set_property = ags_clear_audio_signal_set_property; gobject->get_property = ags_clear_audio_signal_get_property; gobject->finalize = ags_clear_audio_signal_finalize; /* properties */ /** * AgsClearAudioSignal:audio-signal: * * The assigned #AgsAudioSignal * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-signal", i18n_pspec("audio signal of clear audio signal"), i18n_pspec("The audio signal of clear audio signal task"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) clear_audio_signal; task->launch = ags_clear_audio_signal_launch; } void ags_clear_audio_signal_init(AgsClearAudioSignal *clear_audio_signal) { clear_audio_signal->audio_signal = NULL; } void ags_clear_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsClearAudioSignal *clear_audio_signal; clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(gobject); switch(prop_id){ case PROP_AUDIO_SIGNAL: { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) g_value_get_object(value); if(clear_audio_signal->audio_signal == audio_signal){ return; } if(clear_audio_signal->audio_signal != NULL){ g_object_unref(clear_audio_signal->audio_signal); } if(audio_signal != NULL){ g_object_ref(audio_signal); } clear_audio_signal->audio_signal = audio_signal; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_clear_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsClearAudioSignal *clear_audio_signal; clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(gobject); switch(prop_id){ case PROP_AUDIO_SIGNAL: { g_value_set_object(value, clear_audio_signal->audio_signal); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_clear_audio_signal_dispose(GObject *gobject) { AgsClearAudioSignal *clear_audio_signal; clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(gobject); if(clear_audio_signal->audio_signal != NULL){ g_object_unref(clear_audio_signal->audio_signal); clear_audio_signal->audio_signal = NULL; } /* call parent */ G_OBJECT_CLASS(ags_clear_audio_signal_parent_class)->dispose(gobject); } void ags_clear_audio_signal_finalize(GObject *gobject) { AgsClearAudioSignal *clear_audio_signal; clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(gobject); if(clear_audio_signal->audio_signal != NULL){ g_object_unref(clear_audio_signal->audio_signal); } /* call parent */ G_OBJECT_CLASS(ags_clear_audio_signal_parent_class)->finalize(gobject); } void ags_clear_audio_signal_launch(AgsTask *task) { AgsRecycling *recycling; AgsAudioSignal *audio_signal; AgsClearAudioSignal *clear_audio_signal; GList *stream; guint format; clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(task); g_return_if_fail(AGS_IS_AUDIO_SIGNAL(clear_audio_signal->audio_signal)); /* clear */ audio_signal = clear_audio_signal->audio_signal; /* clear the stream */ stream = audio_signal->stream; g_object_get(audio_signal, "format", &format, NULL); while(stream != NULL){ ags_audio_buffer_util_clear_buffer(stream->data, 1, audio_signal->buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); stream = stream->next; } if(ags_audio_signal_test_flags(audio_signal, AGS_AUDIO_SIGNAL_TEMPLATE)){ GList *list_start; GList *rt_template_start, *rt_template; g_object_get(audio_signal, "recycling", &recycling, NULL); g_object_get(recycling, "audio-signal", &list_start, NULL); rt_template = rt_template_start = ags_audio_signal_get_rt_template(list_start); while(rt_template != NULL){ /* clear the stream */ stream = AGS_AUDIO_SIGNAL(rt_template->data)->stream; g_object_get(rt_template->data, "format", &format, NULL); while(stream != NULL){ ags_audio_buffer_util_clear_buffer(stream->data, 1, audio_signal->buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); stream = stream->next; } rt_template = rt_template->next; } g_list_free_full(rt_template_start, g_object_unref); g_list_free_full(list_start, g_object_unref); g_object_unref(recycling); } } /** * ags_clear_audio_signal_new: * @audio_signal: the #AgsAudioSignal to clear * * Create a new instance of #AgsClearAudioSignal. * * Returns: the new #AgsClearAudioSignal. * * Since: 3.0.0 */ AgsClearAudioSignal* ags_clear_audio_signal_new(AgsAudioSignal *audio_signal) { AgsClearAudioSignal *clear_audio_signal; clear_audio_signal = (AgsClearAudioSignal *) g_object_new(AGS_TYPE_CLEAR_AUDIO_SIGNAL, "audio-signal", audio_signal, NULL); return(clear_audio_signal); } gsequencer-3.1.3/ags/audio/task/ags_apply_presets.h0000644000175000017500000000430413607210263017313 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLY_PRESETS_H__ #define __AGS_APPLY_PRESETS_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLY_PRESETS (ags_apply_presets_get_type()) #define AGS_APPLY_PRESETS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLY_PRESETS, AgsApplyPresets)) #define AGS_APPLY_PRESETS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_APPLY_PRESETS, AgsApplyPresetsClass)) #define AGS_IS_APPLY_PRESETS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLY_PRESETS)) #define AGS_IS_APPLY_PRESETS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_APPLY_PRESETS)) #define AGS_APPLY_PRESETS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_APPLY_PRESETS, AgsApplyPresetsClass)) typedef struct _AgsApplyPresets AgsApplyPresets; typedef struct _AgsApplyPresetsClass AgsApplyPresetsClass; struct _AgsApplyPresets { AgsTask task; GObject *scope; guint pcm_channels; guint samplerate; guint buffer_size; guint format; }; struct _AgsApplyPresetsClass { AgsTaskClass task; }; GType ags_apply_presets_get_type(); void ags_apply_presets_soundcard(AgsApplyPresets *apply_presets, GObject *soundcard); AgsApplyPresets* ags_apply_presets_new(GObject *scope, guint pcm_channels, guint samplerate, guint buffer_size, guint format); G_END_DECLS #endif /*__AGS_APPLY_PRESETS_H__*/ gsequencer-3.1.3/ags/audio/task/ags_switch_buffer_flag.c0000644000175000017500000002150213607210263020236 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_switch_buffer_flag_class_init(AgsSwitchBufferFlagClass *switch_buffer_flag); void ags_switch_buffer_flag_init(AgsSwitchBufferFlag *switch_buffer_flag); void ags_switch_buffer_flag_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_switch_buffer_flag_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_switch_buffer_flag_dispose(GObject *gobject); void ags_switch_buffer_flag_finalize(GObject *gobject); void ags_switch_buffer_flag_launch(AgsTask *task); /** * SECTION:ags_switch_buffer_flag * @short_description: switch buffer flag of device * @title: AgsSwitchBufferFlag * @section_id: * @include: ags/audio/task/ags_switch_buffer_flag.h * * The #AgsSwitchBufferFlag task switches the buffer flag of device. */ static gpointer ags_switch_buffer_flag_parent_class = NULL; enum{ PROP_0, PROP_DEVICE, }; GType ags_switch_buffer_flag_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_switch_buffer_flag = 0; static const GTypeInfo ags_switch_buffer_flag_info = { sizeof(AgsSwitchBufferFlagClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_switch_buffer_flag_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSwitchBufferFlag), 0, /* n_preallocs */ (GInstanceInitFunc) ags_switch_buffer_flag_init, }; ags_type_switch_buffer_flag = g_type_register_static(AGS_TYPE_TASK, "AgsSwitchBufferFlag", &ags_switch_buffer_flag_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_switch_buffer_flag); } return g_define_type_id__volatile; } void ags_switch_buffer_flag_class_init(AgsSwitchBufferFlagClass *switch_buffer_flag) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_switch_buffer_flag_parent_class = g_type_class_peek_parent(switch_buffer_flag); /* gobject */ gobject = (GObjectClass *) switch_buffer_flag; gobject->set_property = ags_switch_buffer_flag_set_property; gobject->get_property = ags_switch_buffer_flag_get_property; gobject->dispose = ags_switch_buffer_flag_dispose; gobject->finalize = ags_switch_buffer_flag_finalize; /* properties */ /** * AgsSwitchBufferFlag:device: * * The assigned #AgsSoundcard or #AgsSequencer * * Since: 3.0.0 */ param_spec = g_param_spec_object("device", i18n_pspec("device of change device"), i18n_pspec("The device of change device task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /* task */ task = (AgsTaskClass *) switch_buffer_flag; task->launch = ags_switch_buffer_flag_launch; } void ags_switch_buffer_flag_init(AgsSwitchBufferFlag *switch_buffer_flag) { switch_buffer_flag->device = NULL; } void ags_switch_buffer_flag_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject); switch(prop_id){ case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_object(value); if(switch_buffer_flag->device == (GObject *) device){ return; } if(switch_buffer_flag->device != NULL){ g_object_unref(switch_buffer_flag->device); } if(device != NULL){ g_object_ref(device); } switch_buffer_flag->device = (GObject *) device; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_switch_buffer_flag_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject); switch(prop_id){ case PROP_DEVICE: { g_value_set_object(value, switch_buffer_flag->device); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_switch_buffer_flag_dispose(GObject *gobject) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject); if(switch_buffer_flag->device != NULL){ g_object_unref(switch_buffer_flag->device); switch_buffer_flag->device = NULL; } /* call parent*/ G_OBJECT_CLASS(ags_switch_buffer_flag_parent_class)->dispose(gobject); } void ags_switch_buffer_flag_finalize(GObject *gobject) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(gobject); if(switch_buffer_flag->device != NULL){ g_object_unref(switch_buffer_flag->device); } /* call parent*/ G_OBJECT_CLASS(ags_switch_buffer_flag_parent_class)->finalize(gobject); } void ags_switch_buffer_flag_launch(AgsTask *task) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = AGS_SWITCH_BUFFER_FLAG(task); /* switch buffer flag */ if(AGS_IS_DEVOUT(switch_buffer_flag->device)){ ags_devout_switch_buffer_flag((AgsDevout *) switch_buffer_flag->device); }else if(AGS_IS_DEVIN(switch_buffer_flag->device)){ ags_devin_switch_buffer_flag((AgsDevin *) switch_buffer_flag->device); }else if(AGS_IS_JACK_DEVOUT(switch_buffer_flag->device)){ ags_jack_devout_switch_buffer_flag((AgsJackDevout *) switch_buffer_flag->device); }else if(AGS_IS_JACK_DEVIN(switch_buffer_flag->device)){ ags_jack_devin_switch_buffer_flag((AgsJackDevin *) switch_buffer_flag->device); }else if(AGS_IS_PULSE_DEVOUT(switch_buffer_flag->device)){ ags_pulse_devout_switch_buffer_flag((AgsPulseDevout *) switch_buffer_flag->device); }else if(AGS_IS_PULSE_DEVIN(switch_buffer_flag->device)){ ags_pulse_devin_switch_buffer_flag((AgsPulseDevin *) switch_buffer_flag->device); }else if(AGS_IS_WASAPI_DEVOUT(switch_buffer_flag->device)){ ags_wasapi_devout_switch_buffer_flag((AgsWasapiDevout *) switch_buffer_flag->device); }else if(AGS_IS_WASAPI_DEVIN(switch_buffer_flag->device)){ ags_wasapi_devin_switch_buffer_flag((AgsWasapiDevin *) switch_buffer_flag->device); }else if(AGS_IS_CORE_AUDIO_DEVOUT(switch_buffer_flag->device)){ ags_core_audio_devout_switch_buffer_flag((AgsCoreAudioDevout *) switch_buffer_flag->device); }else if(AGS_IS_CORE_AUDIO_DEVIN(switch_buffer_flag->device)){ ags_core_audio_devin_switch_buffer_flag((AgsCoreAudioDevin *) switch_buffer_flag->device); }else if(AGS_IS_MIDIIN(switch_buffer_flag->device)){ ags_midiin_switch_buffer_flag((AgsMidiin *) switch_buffer_flag->device); }else if(AGS_IS_JACK_MIDIIN(switch_buffer_flag->device)){ ags_jack_midiin_switch_buffer_flag((AgsJackMidiin *) switch_buffer_flag->device); }else if(AGS_IS_CORE_AUDIO_MIDIIN(switch_buffer_flag->device)){ ags_core_audio_midiin_switch_buffer_flag((AgsCoreAudioMidiin *) switch_buffer_flag->device); } } /** * ags_switch_buffer_flag_new: * @device: the #AgsSoundcard or #AgsSequencer * * Creates an #AgsSwitchBufferFlag. * * Returns: an new #AgsSwitchBufferFlag. * * Since: 3.0.0 */ AgsSwitchBufferFlag* ags_switch_buffer_flag_new(GObject *device) { AgsSwitchBufferFlag *switch_buffer_flag; switch_buffer_flag = (AgsSwitchBufferFlag *) g_object_new(AGS_TYPE_SWITCH_BUFFER_FLAG, "device", device, NULL); return(switch_buffer_flag); } gsequencer-3.1.3/ags/audio/task/ags_resize_audio.h0000644000175000017500000000410613607210263017103 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RESIZE_AUDIO_H__ #define __AGS_RESIZE_AUDIO_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RESIZE_AUDIO (ags_resize_audio_get_type()) #define AGS_RESIZE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RESIZE_AUDIO, AgsResizeAudio)) #define AGS_RESIZE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RESIZE_AUDIO, AgsResizeAudioClass)) #define AGS_IS_RESIZE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RESIZE_AUDIO)) #define AGS_IS_RESIZE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RESIZE_AUDIO)) #define AGS_RESIZE_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RESIZE_AUDIO, AgsResizeAudioClass)) typedef struct _AgsResizeAudio AgsResizeAudio; typedef struct _AgsResizeAudioClass AgsResizeAudioClass; struct _AgsResizeAudio { AgsTask task; AgsAudio *audio; guint output_pads; guint input_pads; guint audio_channels; }; struct _AgsResizeAudioClass { AgsTaskClass task; }; GType ags_resize_audio_get_type(); AgsResizeAudio* ags_resize_audio_new(AgsAudio *audio, guint output_pads, guint input_pads, guint audio_channels); G_END_DECLS #endif /*__AGS_RESIZE_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/task/ags_start_audio.h0000644000175000017500000000370113607210263016737 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_START_AUDIO_H__ #define __AGS_START_AUDIO_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_START_AUDIO (ags_start_audio_get_type()) #define AGS_START_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_START_AUDIO, AgsStartAudio)) #define AGS_START_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_START_AUDIO, AgsStartAudioClass)) #define AGS_IS_START_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_START_AUDIO)) #define AGS_IS_START_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_START_AUDIO)) #define AGS_START_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_START_AUDIO, AgsStartAudioClass)) typedef struct _AgsStartAudio AgsStartAudio; typedef struct _AgsStartAudioClass AgsStartAudioClass; struct _AgsStartAudio { AgsTask task; AgsAudio *audio; gint sound_scope; }; struct _AgsStartAudioClass { AgsTaskClass task; }; GType ags_start_audio_get_type(); AgsStartAudio* ags_start_audio_new(AgsAudio *audio, gint sound_scope); G_END_DECLS #endif /*__AGS_START_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/task/ags_free_selection.h0000644000175000017500000000376313607210263017417 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FREE_SELECTION_H__ #define __AGS_FREE_SELECTION_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FREE_SELECTION (ags_free_selection_get_type()) #define AGS_FREE_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FREE_SELECTION, AgsFreeSelection)) #define AGS_FREE_SELECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FREE_SELECTION, AgsFreeSelectionClass)) #define AGS_IS_FREE_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_FREE_SELECTION)) #define AGS_IS_FREE_SELECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_FREE_SELECTION)) #define AGS_FREE_SELECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_FREE_SELECTION, AgsFreeSelectionClass)) typedef struct _AgsFreeSelection AgsFreeSelection; typedef struct _AgsFreeSelectionClass AgsFreeSelectionClass; struct _AgsFreeSelection { AgsTask task; AgsNotation *notation; }; struct _AgsFreeSelectionClass { AgsTaskClass task; }; GType ags_free_selection_get_type(); AgsFreeSelection* ags_free_selection_new(AgsNotation *notation); G_END_DECLS #endif /*__AGS_FREE_SELECTION_H__*/ gsequencer-3.1.3/ags/audio/task/ags_start_sequencer.h0000644000175000017500000000367213607210263017637 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_START_SEQUENCER_H__ #define __AGS_START_SEQUENCER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_START_SEQUENCER (ags_start_sequencer_get_type()) #define AGS_START_SEQUENCER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_START_SEQUENCER, AgsStartSequencer)) #define AGS_START_SEQUENCER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_START_SEQUENCER, AgsStartSequencerClass)) #define AGS_IS_START_SEQUENCER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_START_SEQUENCER)) #define AGS_IS_START_SEQUENCER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_START_SEQUENCER)) #define AGS_START_SEQUENCER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_START_SEQUENCER, AgsStartSequencerClass)) typedef struct _AgsStartSequencer AgsStartSequencer; typedef struct _AgsStartSequencerClass AgsStartSequencerClass; struct _AgsStartSequencer { AgsTask task; }; struct _AgsStartSequencerClass { AgsTaskClass task; }; GType ags_start_sequencer_get_type(); AgsStartSequencer* ags_start_sequencer_new(); G_END_DECLS #endif /*__AGS_START_SEQUENCER_H__*/ gsequencer-3.1.3/ags/audio/task/ags_cancel_channel.h0000644000175000017500000000403313607210263017335 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CANCEL_CHANNEL_H__ #define __AGS_CANCEL_CHANNEL_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CANCEL_CHANNEL (ags_cancel_channel_get_type()) #define AGS_CANCEL_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CANCEL_CHANNEL, AgsCancelChannel)) #define AGS_CANCEL_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CANCEL_CHANNEL, AgsCancelChannelClass)) #define AGS_IS_CANCEL_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CANCEL_CHANNEL)) #define AGS_IS_CANCEL_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CANCEL_CHANNEL)) #define AGS_CANCEL_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CANCEL_CHANNEL, AgsCancelChannelClass)) typedef struct _AgsCancelChannel AgsCancelChannel; typedef struct _AgsCancelChannelClass AgsCancelChannelClass; struct _AgsCancelChannel { AgsTask task; AgsChannel *channel; gint sound_scope; }; struct _AgsCancelChannelClass { AgsTaskClass task; }; GType ags_cancel_channel_get_type(); AgsCancelChannel* ags_cancel_channel_new(AgsChannel *channel, gint sound_scope); G_END_DECLS #endif /*__AGS_CANCEL_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/task/ags_set_audio_channels.h0000644000175000017500000000413713607210263020254 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SET_AUDIO_CHANNELS_H__ #define __AGS_SET_AUDIO_CHANNELS_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SET_AUDIO_CHANNELS (ags_set_audio_channels_get_type()) #define AGS_SET_AUDIO_CHANNELS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SET_AUDIO_CHANNELS, AgsSetAudioChannels)) #define AGS_SET_AUDIO_CHANNELS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SET_AUDIO_CHANNELS, AgsSetAudioChannelsClass)) #define AGS_IS_SET_AUDIO_CHANNELS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SET_AUDIO_CHANNELS)) #define AGS_IS_SET_AUDIO_CHANNELS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SET_AUDIO_CHANNELS)) #define AGS_SET_AUDIO_CHANNELS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SET_AUDIO_CHANNELS, AgsSetAudioChannelsClass)) typedef struct _AgsSetAudioChannels AgsSetAudioChannels; typedef struct _AgsSetAudioChannelsClass AgsSetAudioChannelsClass; struct _AgsSetAudioChannels { AgsTask task; GObject *soundcard; guint audio_channels; }; struct _AgsSetAudioChannelsClass { AgsTaskClass task; }; GType ags_set_audio_channels_get_type(); AgsSetAudioChannels* ags_set_audio_channels_new(GObject *soundcard, guint audio_channels); G_END_DECLS #endif /*__AGS_SET_AUDIO_CHANNELS_H__*/ gsequencer-3.1.3/ags/audio/task/ags_open_single_file.h0000644000175000017500000000417613607210263017731 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OPEN_SINGLE_FILE_H__ #define __AGS_OPEN_SINGLE_FILE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OPEN_SINGLE_FILE (ags_open_single_file_get_type()) #define AGS_OPEN_SINGLE_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OPEN_SINGLE_FILE, AgsOpenSingleFile)) #define AGS_OPEN_SINGLE_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OPEN_SINGLE_FILE, AgsOpenSingleFileClass)) #define AGS_IS_OPEN_SINGLE_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OPEN_SINGLE_FILE)) #define AGS_IS_OPEN_SINGLE_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OPEN_SINGLE_FILE)) #define AGS_OPEN_SINGLE_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OPEN_SINGLE_FILE, AgsOpenSingleFileClass)) typedef struct _AgsOpenSingleFile AgsOpenSingleFile; typedef struct _AgsOpenSingleFileClass AgsOpenSingleFileClass; struct _AgsOpenSingleFile { AgsTask task; AgsChannel *channel; gchar *filename; guint audio_channel; }; struct _AgsOpenSingleFileClass { AgsTaskClass task; }; GType ags_open_single_file_get_type(); AgsOpenSingleFile* ags_open_single_file_new(AgsChannel *channel, gchar *filename, guint audio_channel); G_END_DECLS #endif /*__AGS_OPEN_SINGLE_FILE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_start_channel.h0000644000175000017500000000400513607210263017244 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_START_CHANNEL_H__ #define __AGS_START_CHANNEL_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_START_CHANNEL (ags_start_channel_get_type()) #define AGS_START_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_START_CHANNEL, AgsStartChannel)) #define AGS_START_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_START_CHANNEL, AgsStartChannelClass)) #define AGS_IS_START_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_START_CHANNEL)) #define AGS_IS_START_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_START_CHANNEL)) #define AGS_START_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_START_CHANNEL, AgsStartChannelClass)) typedef struct _AgsStartChannel AgsStartChannel; typedef struct _AgsStartChannelClass AgsStartChannelClass; struct _AgsStartChannel { AgsTask task; AgsChannel *channel; gint sound_scope; }; struct _AgsStartChannelClass { AgsTaskClass task; }; GType ags_start_channel_get_type(); AgsStartChannel* ags_start_channel_new(AgsChannel *channel, gint sound_scope); G_END_DECLS #endif /*__AGS_START_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/task/ags_cancel_audio.c0000644000175000017500000001575713607210263017040 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_cancel_audio_class_init(AgsCancelAudioClass *cancel_audio); void ags_cancel_audio_init(AgsCancelAudio *cancel_audio); void ags_cancel_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_cancel_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_cancel_audio_dispose(GObject *gobject); void ags_cancel_audio_finalize(GObject *gobject); void ags_cancel_audio_launch(AgsTask *task); /** * SECTION:ags_cancel_audio * @short_description: cancel audio task * @title: AgsCancelAudio * @section_id: * @include: ags/audio/task/ags_cancel_audio.h * * The #AgsCancelAudio task cancels #AgsAudio playback. */ static gpointer ags_cancel_audio_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_SOUND_SCOPE, }; GType ags_cancel_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_cancel_audio = 0; static const GTypeInfo ags_cancel_audio_info = { sizeof(AgsCancelAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_cancel_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCancelAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_cancel_audio_init, }; ags_type_cancel_audio = g_type_register_static(AGS_TYPE_TASK, "AgsCancelAudio", &ags_cancel_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_cancel_audio); } return g_define_type_id__volatile; } void ags_cancel_audio_class_init(AgsCancelAudioClass *cancel_audio) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_cancel_audio_parent_class = g_type_class_peek_parent(cancel_audio); /* gobject */ gobject = (GObjectClass *) cancel_audio; gobject->set_property = ags_cancel_audio_set_property; gobject->get_property = ags_cancel_audio_get_property; gobject->dispose = ags_cancel_audio_dispose; gobject->finalize = ags_cancel_audio_finalize; /* properties */ /** * AgsCancelAudio:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of cancel audio"), i18n_pspec("The audio of cancel audio task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsCancelAudio:sound-scope: * * The effects sound-scope. * * Since: 3.0.0 */ param_spec = g_param_spec_int("sound-scope", i18n_pspec("sound scope"), i18n_pspec("The sound scope"), -1, AGS_SOUND_SCOPE_LAST, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUND_SCOPE, param_spec); /* task */ task = (AgsTaskClass *) cancel_audio; task->launch = ags_cancel_audio_launch; } void ags_cancel_audio_init(AgsCancelAudio *cancel_audio) { cancel_audio->audio = NULL; cancel_audio->sound_scope = -1; } void ags_cancel_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCancelAudio *cancel_audio; cancel_audio = AGS_CANCEL_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(cancel_audio->audio == audio){ return; } if(cancel_audio->audio != NULL){ g_object_unref(cancel_audio->audio); } if(audio != NULL){ g_object_ref(audio); } cancel_audio->audio = audio; } break; case PROP_SOUND_SCOPE: { cancel_audio->sound_scope = g_value_get_int(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_cancel_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCancelAudio *cancel_audio; cancel_audio = AGS_CANCEL_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, cancel_audio->audio); } break; case PROP_SOUND_SCOPE: { g_value_set_int(value, cancel_audio->sound_scope); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_cancel_audio_dispose(GObject *gobject) { AgsCancelAudio *cancel_audio; cancel_audio = AGS_CANCEL_AUDIO(gobject); if(cancel_audio->audio != NULL){ g_object_unref(cancel_audio->audio); cancel_audio->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_cancel_audio_parent_class)->dispose(gobject); } void ags_cancel_audio_finalize(GObject *gobject) { AgsCancelAudio *cancel_audio; cancel_audio = AGS_CANCEL_AUDIO(gobject); if(cancel_audio->audio != NULL){ g_object_unref(cancel_audio->audio); } /* call parent */ G_OBJECT_CLASS(ags_cancel_audio_parent_class)->finalize(gobject); } void ags_cancel_audio_launch(AgsTask *task) { AgsAudio *audio; AgsCancelAudio *cancel_audio; GList *start_recall_id; gint sound_scope; cancel_audio = AGS_CANCEL_AUDIO(task); g_return_if_fail(AGS_IS_AUDIO(cancel_audio->audio)); g_object_get(cancel_audio, "audio", &audio, "sound-scope", &sound_scope, NULL); start_recall_id = ags_audio_check_scope(audio, sound_scope); ags_audio_stop(audio, start_recall_id, sound_scope); g_object_unref(audio); g_list_free_full(start_recall_id, g_object_unref); } /** * ags_cancel_audio_new: * @audio: the #AgsAudio to cancel * @sound_scope: the #AgsSoundScope-enum or -1 for all * * Create a new instance of #AgsCancelAudio. * * Returns: the new #AgsCancelAudio. * * Since: 3.0.0 */ AgsCancelAudio* ags_cancel_audio_new(AgsAudio *audio, gint sound_scope) { AgsCancelAudio *cancel_audio; cancel_audio = (AgsCancelAudio *) g_object_new(AGS_TYPE_CANCEL_AUDIO, "audio", audio, "sound-scope", sound_scope, NULL); return(cancel_audio); } gsequencer-3.1.3/ags/audio/task/ags_open_sf2_instrument.h0000644000175000017500000000456113607210263020431 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OPEN_SF2_INSTRUMENT_H__ #define __AGS_OPEN_SF2_INSTRUMENT_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OPEN_SF2_INSTRUMENT (ags_open_sf2_instrument_get_type()) #define AGS_OPEN_SF2_INSTRUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OPEN_SF2_INSTRUMENT, AgsOpenSf2Instrument)) #define AGS_OPEN_SF2_INSTRUMENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OPEN_SF2_INSTRUMENT, AgsOpenSf2InstrumentClass)) #define AGS_IS_OPEN_SF2_INSTRUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OPEN_SF2_INSTRUMENT)) #define AGS_IS_OPEN_SF2_INSTRUMENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OPEN_SF2_INSTRUMENT)) #define AGS_OPEN_SF2_INSTRUMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OPEN_SF2_INSTRUMENT, AgsOpenSf2InstrumentClass)) typedef struct _AgsOpenSf2Instrument AgsOpenSf2Instrument; typedef struct _AgsOpenSf2InstrumentClass AgsOpenSf2InstrumentClass; struct _AgsOpenSf2Instrument { AgsTask task; AgsAudio *audio; AgsIpatch *ipatch; gchar *filename; gchar *preset; gchar *instrument; guint start_pad; }; struct _AgsOpenSf2InstrumentClass { AgsTaskClass task; }; GType ags_open_sf2_instrument_get_type(); AgsOpenSf2Instrument* ags_open_sf2_instrument_new(AgsAudio *audio, AgsIpatch *ipatch, gchar *filename, gchar *preset, gchar *instrument, guint start_pad); G_END_DECLS #endif /*__AGS_OPEN_SF2_INSTRUMENT_H__*/ gsequencer-3.1.3/ags/audio/task/ags_stop_sequencer.c0000644000175000017500000001331713607210263017457 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_stop_sequencer_class_init(AgsStopSequencerClass *stop_sequencer); void ags_stop_sequencer_init(AgsStopSequencer *stop_sequencer); void ags_stop_sequencer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_stop_sequencer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_stop_sequencer_dispose(GObject *gobject); void ags_stop_sequencer_finalize(GObject *gobject); void ags_stop_sequencer_launch(AgsTask *task); /** * SECTION:ags_stop_sequencer * @short_description: stop sequencer object * @title: AgsStopSequencer * @section_id: * @include: ags/audio/task/ags_stop_sequencer.h * * The #AgsStopSequencer task stops sequencer. */ static gpointer ags_stop_sequencer_parent_class = NULL; enum{ PROP_0, }; GType ags_stop_sequencer_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_stop_sequencer = 0; static const GTypeInfo ags_stop_sequencer_info = { sizeof(AgsStopSequencerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_stop_sequencer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsStopSequencer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_stop_sequencer_init, }; ags_type_stop_sequencer = g_type_register_static(AGS_TYPE_TASK, "AgsStopSequencer", &ags_stop_sequencer_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_stop_sequencer); } return g_define_type_id__volatile; } void ags_stop_sequencer_class_init(AgsStopSequencerClass *stop_sequencer) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_stop_sequencer_parent_class = g_type_class_peek_parent(stop_sequencer); /* gobject */ gobject = (GObjectClass *) stop_sequencer; gobject->set_property = ags_stop_sequencer_set_property; gobject->get_property = ags_stop_sequencer_get_property; gobject->dispose = ags_stop_sequencer_dispose; gobject->finalize = ags_stop_sequencer_finalize; /* properties */ /* task */ task = (AgsTaskClass *) stop_sequencer; task->launch = ags_stop_sequencer_launch; } void ags_stop_sequencer_init(AgsStopSequencer *stop_sequencer) { //empty } void ags_stop_sequencer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStopSequencer *stop_sequencer; stop_sequencer = AGS_STOP_SEQUENCER(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_stop_sequencer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStopSequencer *stop_sequencer; stop_sequencer = AGS_STOP_SEQUENCER(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_stop_sequencer_dispose(GObject *gobject) { AgsStopSequencer *stop_sequencer; stop_sequencer = AGS_STOP_SEQUENCER(gobject); /* call parent */ G_OBJECT_CLASS(ags_stop_sequencer_parent_class)->dispose(gobject); } void ags_stop_sequencer_finalize(GObject *gobject) { AgsStopSequencer *stop_sequencer; stop_sequencer = AGS_STOP_SEQUENCER(gobject); /* call parent */ G_OBJECT_CLASS(ags_stop_sequencer_parent_class)->finalize(gobject); } void ags_stop_sequencer_launch(AgsTask *task) { AgsStopSequencer *stop_sequencer; AgsThread *audio_loop; AgsThread *sequencer_thread; AgsApplicationContext *application_context; stop_sequencer = AGS_STOP_SEQUENCER(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(application_context)); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); sequencer_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SEQUENCER_THREAD); while(sequencer_thread != NULL){ if(AGS_IS_SEQUENCER_THREAD(sequencer_thread)){ /* stop AgsSequencer */ AGS_SEQUENCER_THREAD(sequencer_thread)->error = NULL; #ifdef AGS_DEBUG g_message("stop sequencer"); #endif ags_thread_stop(sequencer_thread); } sequencer_thread = g_atomic_pointer_get(&(sequencer_thread->next)); } g_object_unref(audio_loop); } /** * ags_stop_sequencer_new: * * Creates an #AgsStopSequencer. * * Returns: an new #AgsStopSequencer. * * Since: 3.0.0 */ AgsStopSequencer* ags_stop_sequencer_new() { AgsStopSequencer *stop_sequencer; stop_sequencer = (AgsStopSequencer *) g_object_new(AGS_TYPE_STOP_SEQUENCER, NULL); return(stop_sequencer); } gsequencer-3.1.3/ags/audio/task/ags_reset_note.c0000644000175000017500000001535213607210263016570 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_reset_note_class_init(AgsResetNoteClass *reset_note); void ags_reset_note_init(AgsResetNote *reset_note); void ags_reset_note_dispose(GObject *gobject); void ags_reset_note_finalize(GObject *gobject); void ags_reset_note_launch(AgsTask *task); /** * SECTION:ags_reset_note * @short_description: reset note internal * @title: AgsResetNote * @section_id: * @include: ags/audio/task/ags_reset_note.h * * The #AgsResetNote task resets note to recompute the note during next run. */ static gpointer ags_reset_note_parent_class = NULL; AgsResetNote *ags_reset_note = NULL; GType ags_reset_note_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_reset_note = 0; static const GTypeInfo ags_reset_note_info = { sizeof (AgsResetNoteClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_reset_note_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsResetNote), 0, /* n_preallocs */ (GInstanceInitFunc) ags_reset_note_init, }; ags_type_reset_note = g_type_register_static(AGS_TYPE_TASK, "AgsResetNote", &ags_reset_note_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_reset_note); } return g_define_type_id__volatile; } void ags_reset_note_class_init(AgsResetNoteClass *reset_note) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_reset_note_parent_class = g_type_class_peek_parent(reset_note); /* GObjectClass */ gobject = (GObjectClass *) reset_note; gobject->dispose = ags_reset_note_dispose; gobject->finalize = ags_reset_note_finalize; /* AgsTaskClass */ task = (AgsTaskClass *) reset_note; task->launch = ags_reset_note_launch; } void ags_reset_note_init(AgsResetNote *reset_note) { AGS_TASK(reset_note)->flags |= AGS_TASK_CYCLIC; reset_note->note_offset = 0; reset_note->note = NULL; } void ags_reset_note_dispose(GObject *gobject) { AgsResetNote *reset_note; reset_note = AGS_RESET_NOTE(gobject); if(reset_note->note != NULL){ g_list_free_full(reset_note->note, g_object_unref); reset_note->note = NULL; } /* call parent */ G_OBJECT_CLASS(ags_reset_note_parent_class)->dispose(gobject); } void ags_reset_note_finalize(GObject *gobject) { AgsResetNote *reset_note; reset_note = AGS_RESET_NOTE(gobject); if(reset_note->note != NULL){ g_list_free_full(reset_note->note, g_object_unref); } if(reset_note == ags_reset_note){ ags_reset_note = NULL; } /* call parent */ G_OBJECT_CLASS(ags_reset_note_parent_class)->finalize(gobject); } void ags_reset_note_launch(AgsTask *task) { AgsResetNote *reset_note; AgsApplicationContext *application_context; GObject *default_soundcard; GList *note; guint note_offset; guint x1; GRecMutex *task_mutex; reset_note = AGS_RESET_NOTE(task); task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_note); application_context = ags_application_context_get_instance(); default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); g_rec_mutex_lock(task_mutex); if((note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(default_soundcard))) == reset_note->note_offset){ g_rec_mutex_unlock(task_mutex); return; } reset_note->note_offset = note_offset; note = reset_note->note; while(note != NULL){ g_object_get(note->data, "x1", &x1, NULL); g_object_set(note->data, "x1", x1 + 1, NULL); note = note->next; } g_rec_mutex_unlock(task_mutex); } /** * ags_reset_note_add: * @reset_note: the #AgsResetNote * @note: the #AgsNote * * Add @note. * * Since: 3.0.0 */ void ags_reset_note_add(AgsResetNote *reset_note, AgsNote *note) { GRecMutex *task_mutex; if(!AGS_IS_RESET_NOTE(reset_note) || !AGS_IS_NOTE(note)){ return; } task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_note); g_rec_mutex_lock(task_mutex); reset_note->note = g_list_prepend(reset_note->note, note); g_object_ref(note); g_rec_mutex_unlock(task_mutex); } /** * ags_reset_note_remove: * @reset_note: the #AgsResetNote * @note: the #AgsNote * * Remove @note. * * Since: 3.0.0 */ void ags_reset_note_remove(AgsResetNote *reset_note, AgsNote *note) { GRecMutex *task_mutex; if(!AGS_IS_RESET_NOTE(reset_note) || !AGS_IS_NOTE(note)){ return; } task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_note); g_rec_mutex_lock(task_mutex); if(g_list_find(reset_note->note, note) != NULL){ reset_note->note = g_list_remove(reset_note->note, note); g_object_unref(note); } g_rec_mutex_unlock(task_mutex); } /** * ags_reset_note_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsResetNote * * Since: 3.0.0 */ AgsResetNote* ags_reset_note_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_reset_note == NULL){ AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; /* reset note */ ags_reset_note = ags_reset_note_new(); g_mutex_unlock(&mutex); /* add cyclic task */ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); ags_task_launcher_add_cyclic_task(task_launcher, (AgsTask *) ags_reset_note); /* unref */ g_object_unref(task_launcher); }else{ g_mutex_unlock(&mutex); } return(ags_reset_note); } /** * ags_reset_note_new: * * Creates an #AgsResetNote. * * Returns: an new #AgsResetNote. * * Since: 3.0.0 */ AgsResetNote* ags_reset_note_new() { AgsResetNote *reset_note; reset_note = (AgsResetNote *) g_object_new(AGS_TYPE_RESET_NOTE, NULL); return(reset_note); } gsequencer-3.1.3/ags/audio/task/ags_remove_audio_signal.h0000644000175000017500000000434313607210263020437 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_REMOVE_AUDIO_SIGNAL_H__ #define __AGS_REMOVE_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_REMOVE_AUDIO_SIGNAL (ags_remove_audio_signal_get_type()) #define AGS_REMOVE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_REMOVE_AUDIO_SIGNAL, AgsRemoveAudioSignal)) #define AGS_REMOVE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_REMOVE_AUDIO_SIGNAL, AgsRemoveAudioSignalClass)) #define AGS_IS_REMOVE_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_REMOVE_AUDIO_SIGNAL)) #define AGS_IS_REMOVE_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_REMOVE_AUDIO_SIGNAL)) #define AGS_REMOVE_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_REMOVE_AUDIO_SIGNAL, AgsRemoveAudioSignalClass)) typedef struct _AgsRemoveAudioSignal AgsRemoveAudioSignal; typedef struct _AgsRemoveAudioSignalClass AgsRemoveAudioSignalClass; struct _AgsRemoveAudioSignal { AgsTask task; AgsRecycling *recycling; AgsAudioSignal *audio_signal; }; struct _AgsRemoveAudioSignalClass { AgsTaskClass task; }; GType ags_remove_audio_signal_get_type(); AgsRemoveAudioSignal* ags_remove_audio_signal_new(AgsRecycling *recycling, AgsAudioSignal *audio_signal); G_END_DECLS #endif /*__AGS_REMOVE_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/task/ags_apply_sound_config.c0000644000175000017500000010271113607210263020277 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_apply_sound_config_class_init(AgsApplySoundConfigClass *apply_sound_config); void ags_apply_sound_config_init(AgsApplySoundConfig *apply_sound_config); void ags_apply_sound_config_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_apply_sound_config_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_apply_sound_config_dispose(GObject *gobject); void ags_apply_sound_config_finalize(GObject *gobject); void ags_apply_sound_config_change_max_precision(AgsThread *thread, gdouble max_precision); void ags_apply_sound_config_launch(AgsTask *task); /** * SECTION:ags_apply_sound_config * @short_description: apply sound config * @title: AgsApplySoundConfig * @section_id: * @include: ags/audio/task/ags_apply_sound_config.h * * The #AgsApplySoundConfig task apply the specified sound config. */ enum{ PROP_0, PROP_CONFIG_DATA, }; static gpointer ags_apply_sound_config_parent_class = NULL; GType ags_apply_sound_config_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_apply_sound_config = 0; static const GTypeInfo ags_apply_sound_config_info = { sizeof(AgsApplySoundConfigClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_apply_sound_config_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsApplySoundConfig), 0, /* n_preallocs */ (GInstanceInitFunc) ags_apply_sound_config_init, }; ags_type_apply_sound_config = g_type_register_static(AGS_TYPE_TASK, "AgsApplySoundConfig", &ags_apply_sound_config_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_apply_sound_config); } return g_define_type_id__volatile; } void ags_apply_sound_config_class_init(AgsApplySoundConfigClass *apply_sound_config) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_apply_sound_config_parent_class = g_type_class_peek_parent(apply_sound_config); /* GObjectClass */ gobject = (GObjectClass *) apply_sound_config; gobject->set_property = ags_apply_sound_config_set_property; gobject->get_property = ags_apply_sound_config_get_property; gobject->dispose = ags_apply_sound_config_dispose; gobject->finalize = ags_apply_sound_config_finalize; /* properties */ /** * AgsApplySoundConfig:config-data: * * The assigned sound config data as string. * * Since: 3.0.0 */ param_spec = g_param_spec_string("config-data", i18n_pspec("sound config data"), i18n_pspec("The sound config data to apply"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONFIG_DATA, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) apply_sound_config; task->launch = ags_apply_sound_config_launch; } void ags_apply_sound_config_init(AgsApplySoundConfig *apply_sound_config) { apply_sound_config->config_data = NULL; } void ags_apply_sound_config_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplySoundConfig *apply_sound_config; apply_sound_config = AGS_APPLY_SOUND_CONFIG(gobject); switch(prop_id){ case PROP_CONFIG_DATA: { gchar *config_data; config_data = g_value_get_string(value); if(config_data == apply_sound_config->config_data){ return; } g_free(apply_sound_config->config_data); apply_sound_config->config_data = g_strdup(config_data); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_sound_config_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplySoundConfig *apply_sound_config; apply_sound_config = AGS_APPLY_SOUND_CONFIG(gobject); switch(prop_id){ case PROP_CONFIG_DATA: { g_value_set_string(value, apply_sound_config->config_data); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_sound_config_dispose(GObject *gobject) { AgsApplySoundConfig *apply_sound_config; apply_sound_config = AGS_APPLY_SOUND_CONFIG(gobject); /* call parent */ G_OBJECT_CLASS(ags_apply_sound_config_parent_class)->dispose(gobject); } void ags_apply_sound_config_finalize(GObject *gobject) { AgsApplySoundConfig *apply_sound_config; apply_sound_config = AGS_APPLY_SOUND_CONFIG(gobject); /* call parent */ G_OBJECT_CLASS(ags_apply_sound_config_parent_class)->finalize(gobject); } void ags_apply_sound_config_change_max_precision(AgsThread *thread, gdouble max_precision) { AgsThread *current; g_object_set(thread, "max-precision", max_precision, NULL); current = g_atomic_pointer_get(&(thread->children)); while(current != NULL){ ags_apply_sound_config_change_max_precision(current, max_precision); current = g_atomic_pointer_get(&(thread->next)); } } void ags_apply_sound_config_launch(AgsTask *task) { AgsApplySoundConfig *apply_sound_config; AgsJackServer *jack_server; AgsPulseServer *pulse_server; AgsCoreAudioServer *core_audio_server; AgsThread *audio_loop; AgsThread *soundcard_thread; AgsThread *export_thread; AgsThread *sequencer_thread; AgsThread *audio_thread; AgsThread *channel_thread; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; AgsConfig *config; GObject *soundcard; GObject *sequencer; GList *start_sound_server, *sound_server; GList *start_orig_soundcard, *orig_soundcard; GList *start_orig_sequencer, *orig_sequencer; GList *start_audio, *audio; GList *start_list, *list; gchar *soundcard_group; gchar *sequencer_group; gchar *capability; gchar *str; gdouble frequency; guint samplerate; guint buffer_size; guint i; gboolean has_core_audio; gboolean has_pulse; gboolean has_jack; gboolean is_output; static const guint staging_flags = (AGS_SOUND_STAGING_CANCEL | AGS_SOUND_STAGING_REMOVE); apply_sound_config = AGS_APPLY_SOUND_CONFIG(task); application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); start_orig_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); start_orig_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); config = ags_config_get_instance(); if(apply_sound_config->config_data != NULL){ ags_config_clear(config); ags_config_load_from_data(config, apply_sound_config->config_data, -1); } jack_server = NULL; pulse_server = NULL; core_audio_server = NULL; sound_server = start_sound_server = ags_sound_provider_get_sound_server(AGS_SOUND_PROVIDER(application_context)); while(sound_server != NULL){ if(AGS_IS_JACK_SERVER(sound_server->data)){ jack_server = sound_server->data; }else if(AGS_IS_PULSE_SERVER(sound_server->data)){ pulse_server = sound_server->data; }else if(AGS_IS_CORE_AUDIO_SERVER(sound_server->data)){ core_audio_server = sound_server->data; } sound_server = sound_server->next; } has_core_audio = FALSE; has_pulse = FALSE; has_jack = FALSE; /* stop all playback */ soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); while(soundcard_thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(soundcard_thread)){ ags_thread_stop(soundcard_thread); } soundcard_thread = g_atomic_pointer_get(&(soundcard_thread->next)); } export_thread = ags_thread_find_type(audio_loop, AGS_TYPE_EXPORT_THREAD); while(export_thread != NULL){ if(AGS_IS_EXPORT_THREAD(export_thread)){ ags_thread_stop(export_thread); } export_thread = g_atomic_pointer_get(&(export_thread->next)); } sequencer_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SEQUENCER_THREAD); while(sequencer_thread != NULL){ if(AGS_IS_SEQUENCER_THREAD(sequencer_thread)){ ags_thread_stop(sequencer_thread); } sequencer_thread = g_atomic_pointer_get(&(sequencer_thread->next)); } audio = start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); while(audio != NULL){ AgsPlaybackDomain *playback_domain; GList *start_output, *output; GList *start_input, *input; gint sound_scope; g_object_get(audio->data, "playback-domain", &playback_domain, NULL); g_object_get(playback_domain, "output-playback", &start_output, "input-playback", &start_input, NULL); for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ /* stop audio thread */ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); if(audio_thread != NULL){ /* cancel */ ags_audio_recursive_run_stage(audio->data, sound_scope, staging_flags); ags_thread_stop(audio_thread); } /* output */ output = start_output; while(output != NULL){ AgsChannel *channel; g_object_get(output->data, "channel", &channel, NULL); channel_thread = ags_playback_get_channel_thread(output->data, sound_scope); ags_playback_set_recall_id(output->data, NULL, sound_scope); if(channel_thread != NULL){ ags_thread_stop(channel_thread); } g_object_unref(channel); /* iterate */ output = output->next; } /* input */ input = start_input; while(input != NULL){ AgsChannel *channel; g_object_get(input->data, "channel", &channel, NULL); channel_thread = ags_playback_get_channel_thread(input->data, sound_scope); ags_playback_set_recall_id(input->data, NULL, sound_scope); if(channel_thread != NULL){ ags_thread_stop(channel_thread); } g_object_unref(channel); /* iterate */ input = input->next; } } ags_audio_loop_remove_audio((AgsAudioLoop *) audio_loop, (GObject *) audio->data); g_object_unref(playback_domain); g_list_free_full(start_output, g_object_unref); g_list_free_full(start_input, g_object_unref); audio = audio->next; } /* stop sound server */ if(jack_server != NULL){ #ifdef AGS_WITH_JACK AgsJackClient *default_client; AgsJackClient *input_client; g_object_get(jack_server, "default-jack-client", &default_client, "input-jack-client", &input_client, NULL); ags_jack_server_disconnect_client(jack_server); ags_jack_server_remove_client(jack_server, (GObject *) default_client); ags_jack_server_remove_client(jack_server, (GObject *) input_client); if(default_client != NULL){ g_object_unref(default_client); } if(input_client != NULL){ g_object_unref(input_client); } #endif } if(pulse_server != NULL){ #ifdef AGS_WITH_PULSE AgsPulseClient *pulse_client; g_object_get(pulse_server, "default-pulse-client", &pulse_client, NULL); if(pulse_server->main_loop != NULL){ pa_mainloop_quit(pulse_server->main_loop, 0); } ags_pulse_server_disconnect_client(pulse_server); ags_pulse_server_remove_client(pulse_server, (GObject *) pulse_client); pulse_server->main_loop = NULL; pulse_server->main_loop_api = NULL; if(pulse_client != NULL){ g_object_unref(pulse_client); } #endif } if(core_audio_server != NULL){ list = core_audio_server->client; while(list != NULL){ ags_core_audio_client_deactivate(list->data); list = list->next; } } /* remove all soundcard, export and sequencer threads */ soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); while(soundcard_thread != NULL){ AgsThread *next; next = g_atomic_pointer_get(&(soundcard_thread->next)); if(AGS_IS_SOUNDCARD_THREAD(soundcard_thread)){ ags_thread_remove_child(audio_loop, soundcard_thread); g_object_run_dispose((GObject *) soundcard_thread); g_object_unref((GObject *) soundcard_thread); if((AgsThread *) ags_sound_provider_get_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context)) == soundcard_thread){ ags_sound_provider_set_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context), NULL); } } soundcard_thread = next; } export_thread = ags_thread_find_type(audio_loop, AGS_TYPE_EXPORT_THREAD); while(export_thread != NULL){ AgsThread *next; next = g_atomic_pointer_get(&(export_thread->next)); if(AGS_IS_EXPORT_THREAD(export_thread)){ ags_thread_remove_child(audio_loop, export_thread); g_object_run_dispose((GObject *) export_thread); g_object_unref((GObject *) export_thread); } export_thread = next; } sequencer_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SEQUENCER_THREAD); while(sequencer_thread != NULL){ AgsThread *next; next = g_atomic_pointer_get(&(sequencer_thread->next)); if(AGS_IS_SEQUENCER_THREAD(sequencer_thread)){ ags_thread_remove_child(audio_loop, sequencer_thread); g_object_run_dispose((GObject *) sequencer_thread); g_object_unref((GObject *) sequencer_thread); } sequencer_thread = next; } /* unregister soundcard and sequencer */ orig_soundcard = start_orig_soundcard; while(orig_soundcard){ if(AGS_IS_JACK_DEVOUT(orig_soundcard->data) || AGS_IS_JACK_DEVIN(orig_soundcard->data)){ ags_sound_server_unregister_soundcard(AGS_SOUND_SERVER(jack_server), orig_soundcard->data); }else if(AGS_IS_PULSE_DEVOUT(orig_soundcard->data)){ ags_sound_server_unregister_soundcard(AGS_SOUND_SERVER(pulse_server), orig_soundcard->data); }else if(AGS_IS_CORE_AUDIO_DEVOUT(orig_soundcard->data) || AGS_IS_CORE_AUDIO_DEVIN(orig_soundcard->data)){ ags_sound_server_unregister_soundcard(AGS_SOUND_SERVER(core_audio_server), orig_soundcard->data); } orig_soundcard = orig_soundcard->next; } orig_sequencer = start_orig_sequencer; while(orig_sequencer){ if(AGS_IS_JACK_MIDIIN(orig_sequencer->data)){ ags_sound_server_unregister_sequencer(AGS_SOUND_SERVER(jack_server), orig_sequencer->data); }else if(AGS_IS_CORE_AUDIO_MIDIIN(orig_sequencer->data)){ ags_sound_server_unregister_sequencer(AGS_SOUND_SERVER(core_audio_server), orig_sequencer->data); } orig_sequencer = orig_sequencer->next; } ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(application_context), NULL); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), NULL); ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), NULL); if(jack_server != NULL){ #ifdef AGS_WITH_JACK g_object_set(jack_server, "default-jack-client", NULL, NULL); jack_server->n_soundcards = 0; jack_server->n_sequencers = 0; #endif } if(pulse_server != NULL){ #ifdef AGS_WITH_PULSE g_object_set(pulse_server, "default-pulse-client", NULL, NULL); pulse_server->n_soundcards = 0; pulse_server->n_sequencers = 0; #endif } /* read config */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "max-precision"); if(str != NULL){ gdouble max_precision; /* change max precision */ max_precision = g_ascii_strtod(str, NULL); ags_apply_sound_config_change_max_precision(audio_loop, max_precision); } soundcard = NULL; soundcard_group = g_strdup("soundcard"); for(i = 0; ; i++){ guint pcm_channels, buffer_size, samplerate, format; guint cache_buffer_size; gboolean use_cache; if(!g_key_file_has_group(config->key_file, soundcard_group)){ if(i == 0){ g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; }else{ break; } } str = ags_config_get_value(config, soundcard_group, "backend"); capability = ags_config_get_value(config, soundcard_group, "capability"); is_output = TRUE; if(capability != NULL && !g_ascii_strncasecmp(capability, "capture", 8)){ is_output = FALSE; } /* change soundcard */ if(str != NULL){ if(!g_ascii_strncasecmp(str, "core-audio", 11)){ soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(core_audio_server), is_output); has_core_audio = TRUE; }else if(!g_ascii_strncasecmp(str, "pulse", 6)){ soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(pulse_server), is_output); has_pulse = TRUE; }else if(!g_ascii_strncasecmp(str, "jack", 5)){ if(!is_output){ AgsJackClient *input_client; g_object_get(jack_server, "input-jack-client", &input_client, NULL); if(input_client == NULL){ input_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "input-jack-client", input_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) input_client); ags_jack_client_open((AgsJackClient *) input_client, "ags-input-client"); g_object_unref(input_client); } } soundcard = ags_sound_server_register_soundcard(AGS_SOUND_SERVER(jack_server), is_output); has_jack = TRUE; }else if(!g_ascii_strncasecmp(str, "wasapi", 7)){ if(is_output){ soundcard = (GObject *) ags_wasapi_devout_new(); str = ags_config_get_value(config, soundcard_group, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ ags_wasapi_devout_set_flags(AGS_WASAPI_DEVOUT(soundcard), AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE); }else{ ags_wasapi_devout_unset_flags(AGS_WASAPI_DEVOUT(soundcard), AGS_WASAPI_DEVOUT_SHARE_MODE_EXCLUSIVE); } g_free(str); str = ags_config_get_value(config, soundcard_group, "wasapi-buffer-size"); if(str != NULL){ AGS_WASAPI_DEVOUT(soundcard)->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } }else{ soundcard = (GObject *) ags_wasapi_devin_new(); str = ags_config_get_value(config, soundcard_group, "wasapi-share-mode"); if(str != NULL && !g_ascii_strncasecmp(str, "exclusive", 10)){ ags_wasapi_devin_set_flags(AGS_WASAPI_DEVIN(soundcard), AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE); }else{ ags_wasapi_devin_unset_flags(AGS_WASAPI_DEVIN(soundcard), AGS_WASAPI_DEVIN_SHARE_MODE_EXCLUSIVE); } g_free(str); str = ags_config_get_value(config, soundcard_group, "wasapi-buffer-size"); if(str != NULL){ AGS_WASAPI_DEVIN(soundcard)->wasapi_buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } } }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ gchar *str; if(is_output){ soundcard = (GObject *) ags_devout_new(); AGS_DEVOUT(soundcard)->flags &= (~AGS_DEVOUT_OSS); AGS_DEVOUT(soundcard)->flags |= AGS_DEVOUT_ALSA; }else{ soundcard = (GObject *) ags_devin_new(); AGS_DEVIN(soundcard)->flags &= (~AGS_DEVIN_OSS); AGS_DEVIN(soundcard)->flags |= AGS_DEVIN_ALSA; } }else if(!g_ascii_strncasecmp(str, "oss", 4)){ if(is_output){ soundcard = (GObject *) ags_devout_new(); AGS_DEVOUT(soundcard)->flags &= (~AGS_DEVOUT_ALSA); AGS_DEVOUT(soundcard)->flags |= AGS_DEVOUT_OSS; }else{ soundcard = (GObject *) ags_devin_new(); AGS_DEVIN(soundcard)->flags &= (~AGS_DEVIN_ALSA); AGS_DEVIN(soundcard)->flags |= AGS_DEVIN_OSS; } }else{ g_warning(i18n("unknown soundcard backend - %s"), str); g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; } }else{ g_warning(i18n("unknown soundcard backend - NULL")); g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); continue; } if(ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)) == NULL){ ags_sound_provider_set_default_soundcard(AGS_SOUND_PROVIDER(application_context), soundcard); } ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)), soundcard)); g_object_ref(soundcard); /* device */ str = ags_config_get_value(config, soundcard_group, "device"); if(str != NULL){ ags_soundcard_set_device(AGS_SOUNDCARD(soundcard), str); g_free(str); } /* presets */ pcm_channels = AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS; buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; format = AGS_SOUNDCARD_DEFAULT_FORMAT; str = ags_config_get_value(config, soundcard_group, "pcm-channels"); if(str != NULL){ pcm_channels = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "buffer-size"); if(str != NULL){ buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "samplerate"); if(str != NULL){ samplerate = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_config_get_value(config, soundcard_group, "format"); if(str != NULL){ format = g_ascii_strtoull(str, NULL, 10); g_free(str); } ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), pcm_channels, samplerate, buffer_size, format); use_cache = TRUE; str = ags_config_get_value(config, soundcard_group, "use-cache"); if(str != NULL && !g_strncasecmp(str, "false", 5)){ use_cache = FALSE; } cache_buffer_size = 4096; str = ags_config_get_value(config, soundcard_group, "cache-buffer-size"); if(str != NULL){ cache_buffer_size = g_ascii_strtoull(str, NULL, 10); } if(AGS_IS_PULSE_DEVOUT(soundcard)){ GList *start_port, *port; g_object_get(soundcard, "pulse-port", &start_port, NULL); port = start_port; while(port != NULL){ ags_pulse_port_set_samplerate(port->data, samplerate); ags_pulse_port_set_pcm_channels(port->data, pcm_channels); ags_pulse_port_set_buffer_size(port->data, buffer_size); ags_pulse_port_set_format(port->data, format); ags_pulse_port_set_cache_buffer_size(port->data, buffer_size * ceil(cache_buffer_size / buffer_size)); port = port->next; } g_list_free_full(start_port, g_object_unref); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ GList *start_port, *port; g_object_get(soundcard, "core-audio-port", &start_port, NULL); port = start_port; while(port != NULL){ ags_core_audio_port_set_samplerate(port->data, samplerate); ags_core_audio_port_set_pcm_channels(port->data, pcm_channels); ags_core_audio_port_set_buffer_size(port->data, buffer_size); ags_core_audio_port_set_format(port->data, format); ags_core_audio_port_set_cache_buffer_size(port->data, buffer_size * ceil(cache_buffer_size / buffer_size)); port = port->next; } g_list_free_full(start_port, g_object_unref); } g_free(soundcard_group); soundcard_group = g_strdup_printf("%s-%d", AGS_CONFIG_SOUNDCARD, i); } g_free(soundcard_group); /* AgsSequencer */ sequencer = NULL; sequencer_group = g_strdup("sequencer"); for(i = 0; ; i++){ guint pcm_channels, buffer_size, samplerate, format; if(!g_key_file_has_group(config->key_file, sequencer_group)){ if(i == 0){ g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; }else{ break; } } str = ags_config_get_value(config, sequencer_group, "backend"); /* change sequencer */ if(str != NULL){ if(!g_ascii_strncasecmp(str, "jack", 5)){ AgsJackClient *input_client; g_object_get(jack_server, "input-jack-client", &input_client, NULL); if(input_client == NULL){ input_client = ags_jack_client_new((GObject *) jack_server); g_object_set(jack_server, "input-jack-client", input_client, NULL); ags_jack_server_add_client(jack_server, (GObject *) input_client); ags_jack_client_open((AgsJackClient *) input_client, "ags-input-client"); g_object_unref(input_client); } sequencer = ags_sound_server_register_sequencer(AGS_SOUND_SERVER(jack_server), FALSE); has_jack = TRUE; }else if(!g_ascii_strncasecmp(str, "alsa", 5)){ sequencer = (GObject *) ags_midiin_new(); AGS_MIDIIN(sequencer)->flags &= (~AGS_MIDIIN_OSS); AGS_MIDIIN(sequencer)->flags |= AGS_MIDIIN_ALSA; }else if(!g_ascii_strncasecmp(str, "oss", 4)){ sequencer = (GObject *) ags_midiin_new(); AGS_MIDIIN(sequencer)->flags &= (~AGS_MIDIIN_ALSA); AGS_MIDIIN(sequencer)->flags |= AGS_MIDIIN_OSS; }else{ g_warning(i18n("unknown sequencer backend - %s"), str); g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; } }else{ g_warning(i18n("unknown sequencer backend - NULL")); g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); continue; } ags_sound_provider_set_sequencer(AGS_SOUND_PROVIDER(application_context), g_list_append(ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)), sequencer)); g_object_ref(sequencer); /* device */ str = ags_config_get_value(config, sequencer_group, "device"); if(str != NULL){ ags_sequencer_set_device(AGS_SEQUENCER(sequencer), str); g_free(str); } g_free(sequencer_group); sequencer_group = g_strdup_printf("%s-%d", AGS_CONFIG_SEQUENCER, i); } g_free(sequencer_group); /* create threads */ list = start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ guint soundcard_capability; soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(list->data)); soundcard_thread = (AgsThread *) ags_soundcard_thread_new(list->data, soundcard_capability); ags_thread_add_child_extended(AGS_THREAD(audio_loop), (AgsThread *) soundcard_thread, TRUE, TRUE); /* export thread */ export_thread = NULL; /* export thread */ if(AGS_IS_DEVOUT(list->data) || AGS_IS_WASAPI_DEVOUT(list->data) || AGS_IS_JACK_DEVOUT(list->data) || AGS_IS_PULSE_DEVOUT(list->data) || AGS_IS_CORE_AUDIO_DEVOUT(list->data)){ export_thread = (AgsThread *) ags_export_thread_new(list->data, NULL); ags_thread_add_child_extended(AGS_THREAD(audio_loop), (AgsThread *) export_thread, TRUE, TRUE); } /* default soundcard thread */ if(ags_sound_provider_get_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context)) == NULL){ ags_sound_provider_set_default_soundcard_thread(AGS_SOUND_PROVIDER(application_context), (GObject *) soundcard_thread); } list = list->next; } list = start_list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ sequencer_thread = (AgsThread *) ags_sequencer_thread_new(list->data); ags_thread_add_child_extended(AGS_THREAD(audio_loop), (AgsThread *) sequencer_thread, TRUE, TRUE); list = list->next; } /* change frequency */ soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, &samplerate, &buffer_size, NULL); frequency = ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; ags_main_loop_change_frequency(AGS_MAIN_LOOP(audio_loop), frequency); /* reset audio's soundcard */ audio = start_audio; while(audio != NULL){ g_object_set(audio->data, "output-soundcard", soundcard, NULL); audio = audio->next; } /* launch */ if(has_core_audio){ ags_core_audio_client_open((AgsCoreAudioClient *) core_audio_server->default_client, "ags-default-client"); ags_core_audio_server_connect_client(core_audio_server); } if(has_pulse){ ags_pulse_server_connect_client(pulse_server); ags_pulse_server_start_poll(pulse_server); } if(has_jack){ ags_jack_server_connect_client(jack_server); } g_list_free_full(start_sound_server, g_object_unref); g_list_free_full(start_audio, g_object_unref); /* run dispose */ orig_soundcard = start_orig_soundcard; while(orig_soundcard != NULL){ g_object_run_dispose((GObject *) orig_soundcard->data); g_object_unref((GObject *) orig_soundcard->data); orig_soundcard = orig_soundcard->next; } g_list_free_full(start_orig_soundcard, g_object_unref); orig_sequencer = start_orig_sequencer; while(orig_sequencer != NULL){ g_object_run_dispose((GObject *) orig_sequencer->data); g_object_unref((GObject *) orig_sequencer->data); orig_sequencer = orig_sequencer->next; } g_list_free_full(start_orig_sequencer, g_object_unref); g_object_unref(audio_loop); } /** * ags_apply_sound_config_new: * @config_data: the config file as string data * * Creates a new instance of #AgsApplySoundConfig. * * Returns: the new #AgsApplySoundConfig. * * Since: 3.0.0 */ AgsApplySoundConfig* ags_apply_sound_config_new(gchar *config_data) { AgsApplySoundConfig *apply_sound_config; apply_sound_config = (AgsApplySoundConfig *) g_object_new(AGS_TYPE_APPLY_SOUND_CONFIG, "config-data", config_data, NULL); return(apply_sound_config); } gsequencer-3.1.3/ags/audio/task/ags_add_note.h0000644000175000017500000000400313607210263016172 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ADD_NOTE_H__ #define __AGS_ADD_NOTE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ADD_NOTE (ags_add_note_get_type()) #define AGS_ADD_NOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ADD_NOTE, AgsAddNote)) #define AGS_ADD_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ADD_NOTE, AgsAddNoteClass)) #define AGS_IS_ADD_NOTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ADD_NOTE)) #define AGS_IS_ADD_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ADD_NOTE)) #define AGS_ADD_NOTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ADD_NOTE, AgsAddNoteClass)) typedef struct _AgsAddNote AgsAddNote; typedef struct _AgsAddNoteClass AgsAddNoteClass; struct _AgsAddNote { AgsTask task; AgsAudio *audio; AgsNote *note; guint audio_channel; gboolean use_selection_list; }; struct _AgsAddNoteClass { AgsTaskClass task; }; GType ags_add_note_get_type(); AgsAddNote* ags_add_note_new(AgsAudio *audio, AgsNote *note, guint audio_channel, gboolean use_selection_list); G_END_DECLS #endif /*__AGS_ADD_NOTE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_toggle_pattern_bit.c0000644000175000017500000002223413607210263020272 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_toggle_pattern_bit_class_init(AgsTogglePatternBitClass *toggle_pattern_bit); void ags_toggle_pattern_bit_init(AgsTogglePatternBit *toggle_pattern_bit); void ags_toggle_pattern_bit_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_toggle_pattern_bit_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_toggle_pattern_bit_dispose(GObject *gobject); void ags_toggle_pattern_bit_finalize(GObject *gobject); void ags_toggle_pattern_bit_launch(AgsTask *task); /** * SECTION:ags_toggle_pattern_bit * @short_description: toggle the pattern * @title: AgsTogglePatternBit * @section_id: * @include: ags/audio/task/ags_toggle_pattern_bit.h * * The #AgsTogglePatternBit task toggles the specified #AgsPattern. */ enum{ PROP_0, PROP_PATTERN, PROP_LINE, PROP_INDEX_I, PROP_INDEX_J, PROP_BIT, }; static gpointer ags_toggle_pattern_bit_parent_class = NULL; GType ags_toggle_pattern_bit_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_toggle_pattern_bit = 0; static const GTypeInfo ags_toggle_pattern_bit_info = { sizeof(AgsTogglePatternBitClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_toggle_pattern_bit_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsTogglePatternBit), 0, /* n_preallocs */ (GInstanceInitFunc) ags_toggle_pattern_bit_init, }; ags_type_toggle_pattern_bit = g_type_register_static(AGS_TYPE_TASK, "AgsTogglePatternBit", &ags_toggle_pattern_bit_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_toggle_pattern_bit); } return g_define_type_id__volatile; } void ags_toggle_pattern_bit_class_init(AgsTogglePatternBitClass *toggle_pattern_bit) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_toggle_pattern_bit_parent_class = g_type_class_peek_parent(toggle_pattern_bit); /* gobject */ gobject = (GObjectClass *) toggle_pattern_bit; gobject->set_property = ags_toggle_pattern_bit_set_property; gobject->get_property = ags_toggle_pattern_bit_get_property; gobject->dispose = ags_toggle_pattern_bit_dispose; gobject->finalize = ags_toggle_pattern_bit_finalize; /* properties */ /** * AgsTogglePatternBit:pattern: * * The assigned #AgsPattern * * Since: 3.0.0 */ param_spec = g_param_spec_object("pattern", i18n_pspec("pattern of toggle pattern bit"), i18n_pspec("The pattern of toggle pattern bit task"), AGS_TYPE_PATTERN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PATTERN, param_spec); /** * AgsTogglePatternBit:line: * * The line. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("line", i18n_pspec("line"), i18n_pspec("The line"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINE, param_spec); /** * AgsTogglePatternBit:index-i: * * The index-i. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("index-i", i18n_pspec("index-i"), i18n_pspec("The index-i"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX_I, param_spec); /** * AgsTogglePatternBit:index-j: * * The index-j. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("index-j", i18n_pspec("index-j"), i18n_pspec("The index-j"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INDEX_J, param_spec); /** * AgsTogglePatternBit:bit: * * The bit. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("bit", i18n_pspec("bit"), i18n_pspec("The bit"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BIT, param_spec); /* task */ task = (AgsTaskClass *) toggle_pattern_bit; task->launch = ags_toggle_pattern_bit_launch; } void ags_toggle_pattern_bit_init(AgsTogglePatternBit *toggle_pattern_bit) { toggle_pattern_bit->pattern = NULL; toggle_pattern_bit->line = 0; toggle_pattern_bit->index_i = 0; toggle_pattern_bit->index_j = 0; toggle_pattern_bit->bit = 0; } void ags_toggle_pattern_bit_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTogglePatternBit *toggle_pattern_bit; toggle_pattern_bit = AGS_TOGGLE_PATTERN_BIT(gobject); switch(prop_id){ case PROP_PATTERN: { AgsPattern *pattern; pattern = (AgsPattern *) g_value_get_object(value); if(toggle_pattern_bit->pattern == pattern){ return; } if(toggle_pattern_bit->pattern != NULL){ g_object_unref(toggle_pattern_bit->pattern); } if(pattern != NULL){ g_object_ref(pattern); } toggle_pattern_bit->pattern = pattern; } break; case PROP_LINE: { toggle_pattern_bit->line = g_value_get_uint(value); } break; case PROP_INDEX_I: { toggle_pattern_bit->index_i = g_value_get_uint(value); } break; case PROP_INDEX_J: { toggle_pattern_bit->index_j = g_value_get_uint(value); } break; case PROP_BIT: { toggle_pattern_bit->bit = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_toggle_pattern_bit_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTogglePatternBit *toggle_pattern_bit; toggle_pattern_bit = AGS_TOGGLE_PATTERN_BIT(gobject); switch(prop_id){ case PROP_PATTERN: { g_value_set_object(value, toggle_pattern_bit->pattern); } break; case PROP_LINE: { g_value_set_uint(value, toggle_pattern_bit->line); } break; case PROP_INDEX_I: { g_value_set_uint(value, toggle_pattern_bit->index_i); } break; case PROP_INDEX_J: { g_value_set_uint(value, toggle_pattern_bit->index_j); } break; case PROP_BIT: { g_value_set_uint(value, toggle_pattern_bit->bit); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_toggle_pattern_bit_dispose(GObject *gobject) { AgsTogglePatternBit *toggle_pattern_bit; toggle_pattern_bit = AGS_TOGGLE_PATTERN_BIT(gobject); if(toggle_pattern_bit->pattern != NULL){ g_object_unref(toggle_pattern_bit->pattern); toggle_pattern_bit->pattern = NULL; } /* call parent */ G_OBJECT_CLASS(ags_toggle_pattern_bit_parent_class)->dispose(gobject); } void ags_toggle_pattern_bit_finalize(GObject *gobject) { AgsTogglePatternBit *toggle_pattern_bit; toggle_pattern_bit = AGS_TOGGLE_PATTERN_BIT(gobject); if(toggle_pattern_bit->pattern != NULL){ g_object_unref(toggle_pattern_bit->pattern); } /* call parent */ G_OBJECT_CLASS(ags_toggle_pattern_bit_parent_class)->finalize(gobject); } void ags_toggle_pattern_bit_launch(AgsTask *task) { AgsTogglePatternBit *toggle_pattern_bit; toggle_pattern_bit = AGS_TOGGLE_PATTERN_BIT(task); /* toggle */ #ifdef AGS_DEBUG g_message("toggle pattern"); #endif ags_pattern_toggle_bit((AgsPattern *) toggle_pattern_bit->pattern, toggle_pattern_bit->index_i, toggle_pattern_bit->index_j, toggle_pattern_bit->bit); } /** * ags_toggle_pattern_bit_new: * @pattern: the #AgsPattern to toggle * @line: the affected line * @index_i: bank 0 * @index_j: bank 1 * @bit: the index within pattern * * Creates an #AgsTogglePatternBit. * * Returns: an new #AgsTogglePatternBit. * * Since: 3.0.0 */ AgsTogglePatternBit* ags_toggle_pattern_bit_new(AgsPattern *pattern, guint line, guint index_i, guint index_j, guint bit) { AgsTogglePatternBit *toggle_pattern_bit; toggle_pattern_bit = (AgsTogglePatternBit *) g_object_new(AGS_TYPE_TOGGLE_PATTERN_BIT, "pattern", pattern, "line", line, "index-i", index_i, "index-j", index_j, "bit", bit, NULL); return(toggle_pattern_bit); } gsequencer-3.1.3/ags/audio/task/ags_export_output.h0000644000175000017500000000532713607210263017370 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPORT_OUTPUT_H__ #define __AGS_EXPORT_OUTPUT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EXPORT_OUTPUT (ags_export_output_get_type()) #define AGS_EXPORT_OUTPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EXPORT_OUTPUT, AgsExportOutput)) #define AGS_EXPORT_OUTPUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EXPORT_OUTPUT, AgsExportOutputClass)) #define AGS_IS_EXPORT_OUTPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EXPORT_OUTPUT)) #define AGS_IS_EXPORT_OUTPUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EXPORT_OUTPUT)) #define AGS_EXPORT_OUTPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EXPORT_OUTPUT, AgsExportOutputClass)) typedef struct _AgsExportOutput AgsExportOutput; typedef struct _AgsExportOutputClass AgsExportOutputClass; /** * AgsExportOutputFormat: * @AGS_EXPORT_OUTPUT_FORMAT_WAV: use WAV format * @AGS_EXPORT_OUTPUT_FORMAT_OGG: use OGG format * @AGS_EXPORT_OUTPUT_FORMAT_FLAC: use FLAC format * @AGS_EXPORT_OUTPUT_FORMAT_AIFF: use AIFF format * * Enum values to control output format of #AgsExportOutput. */ typedef enum{ AGS_EXPORT_OUTPUT_FORMAT_WAV = 1, AGS_EXPORT_OUTPUT_FORMAT_OGG = 1 << 1, AGS_EXPORT_OUTPUT_FORMAT_FLAC = 1 << 2, AGS_EXPORT_OUTPUT_FORMAT_AIFF = 1 << 3, }AgsExportOutputFormat; struct _AgsExportOutput { AgsTask task; AgsExportThread *export_thread; GObject *soundcard; gchar *filename; guint format; guint tic; gboolean live_performance; }; struct _AgsExportOutputClass { AgsTaskClass task; }; GType ags_export_output_get_type(); AgsExportOutput* ags_export_output_new(AgsExportThread *export_thread, GObject *soundcard, gchar *filename, guint tic, gboolean live_performance); G_END_DECLS #endif /*__AGS_EXPORT_OUTPUT_H__*/ gsequencer-3.1.3/ags/audio/task/ags_open_sf2_instrument.c0000644000175000017500000003760413607210263020430 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_open_sf2_instrument_class_init(AgsOpenSf2InstrumentClass *open_sf2_instrument); void ags_open_sf2_instrument_init(AgsOpenSf2Instrument *open_sf2_instrument); void ags_open_sf2_instrument_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_open_sf2_instrument_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_open_sf2_instrument_dispose(GObject *gobject); void ags_open_sf2_instrument_finalize(GObject *gobject); void ags_open_sf2_instrument_launch(AgsTask *task); /** * SECTION:ags_open_sf2_instrument * @short_description: open Soundfont2 instrument * @title: AgsOpenSf2Instrument * @section_id: * @include: ags/audio/task/ags_open_sf2_instrument.h * * The #AgsOpenSf2Instrument task opens Soundfont2 instruments. */ static gpointer ags_open_sf2_instrument_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_IPATCH, PROP_FILENAME, PROP_PRESET, PROP_INSTRUMENT, PROP_START_PAD, }; GType ags_open_sf2_instrument_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_open_sf2_instrument = 0; static const GTypeInfo ags_open_sf2_instrument_info = { sizeof(AgsOpenSf2InstrumentClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_open_sf2_instrument_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsOpenSf2Instrument), 0, /* n_preallocs */ (GInstanceInitFunc) ags_open_sf2_instrument_init, }; ags_type_open_sf2_instrument = g_type_register_static(AGS_TYPE_TASK, "AgsOpenSf2Instrument", &ags_open_sf2_instrument_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_open_sf2_instrument); } return g_define_type_id__volatile; } void ags_open_sf2_instrument_class_init(AgsOpenSf2InstrumentClass *open_sf2_instrument) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_open_sf2_instrument_parent_class = g_type_class_peek_parent(open_sf2_instrument); /* GObject */ gobject = (GObjectClass *) open_sf2_instrument; gobject->set_property = ags_open_sf2_instrument_set_property; gobject->get_property = ags_open_sf2_instrument_get_property; gobject->dispose = ags_open_sf2_instrument_dispose; gobject->finalize = ags_open_sf2_instrument_finalize; /* properties */ /** * AgsOpenSf2Instrument:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of open sf2 instrument"), i18n_pspec("The audio of open sf2 instrument task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsOpenSf2Instrument:ipatch: * * The assigned #AgsIpatch * * Since: 3.0.0 */ param_spec = g_param_spec_object("ipatch", i18n_pspec("ipatch object"), i18n_pspec("The ipatch object of open sf2 instrument task"), AGS_TYPE_IPATCH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IPATCH, param_spec); /** * AgsOpenSf2Instrument:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename containing the sf2 instrument"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsOpenSf2Instrument:preset: * * The assigned preset. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset", i18n_pspec("the preset"), i18n_pspec("The preset containing the sf2 instrument"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /** * AgsOpenSf2Instrument:instrument: * * The assigned instrument. * * Since: 3.0.0 */ param_spec = g_param_spec_string("instrument", i18n_pspec("the instrument"), i18n_pspec("The instrument containing the sf2 instrument"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INSTRUMENT, param_spec); /** * AgsOpenSf2Instrument:start-pad: * * The assigned start-pad. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("start-pad", i18n_pspec("the start pad"), i18n_pspec("The start pad"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_START_PAD, param_spec); /* AgsTask */ task = (AgsTaskClass *) open_sf2_instrument; task->launch = ags_open_sf2_instrument_launch; } void ags_open_sf2_instrument_init(AgsOpenSf2Instrument *open_sf2_instrument) { open_sf2_instrument->audio = NULL; open_sf2_instrument->instrument = NULL; open_sf2_instrument->filename = NULL; open_sf2_instrument->preset = NULL; open_sf2_instrument->instrument = NULL; open_sf2_instrument->start_pad = 0; } void ags_open_sf2_instrument_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOpenSf2Instrument *open_sf2_instrument; open_sf2_instrument = AGS_OPEN_SF2_INSTRUMENT(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(open_sf2_instrument->audio == audio){ return; } if(open_sf2_instrument->audio != NULL){ g_object_unref(open_sf2_instrument->audio); } if(audio != NULL){ g_object_ref(audio); } open_sf2_instrument->audio = audio; } break; case PROP_IPATCH: { AgsIpatch *ipatch; ipatch = (AgsIpatch *) g_value_get_object(value); if(open_sf2_instrument->ipatch == ipatch){ return; } if(open_sf2_instrument->ipatch != NULL){ g_object_unref(open_sf2_instrument->ipatch); } if(ipatch != NULL){ g_object_ref(ipatch); } open_sf2_instrument->ipatch = ipatch; } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(open_sf2_instrument->filename == filename){ return; } if(open_sf2_instrument->filename != NULL){ g_free(open_sf2_instrument->filename); } open_sf2_instrument->filename = g_strdup(filename); } break; case PROP_PRESET: { gchar *preset; preset = g_value_get_string(value); if(open_sf2_instrument->preset == preset){ return; } if(open_sf2_instrument->preset != NULL){ g_free(open_sf2_instrument->preset); } open_sf2_instrument->preset = g_strdup(preset); } break; case PROP_INSTRUMENT: { gchar *instrument; instrument = g_value_get_string(value); if(open_sf2_instrument->instrument == instrument){ return; } if(open_sf2_instrument->instrument != NULL){ g_free(open_sf2_instrument->instrument); } open_sf2_instrument->instrument = g_strdup(instrument); } break; case PROP_START_PAD: { open_sf2_instrument->start_pad = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_sf2_instrument_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOpenSf2Instrument *open_sf2_instrument; open_sf2_instrument = AGS_OPEN_SF2_INSTRUMENT(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, open_sf2_instrument->audio); } break; case PROP_IPATCH: { g_value_set_object(value, open_sf2_instrument->ipatch); } break; case PROP_FILENAME: { g_value_set_string(value, open_sf2_instrument->filename); } break; case PROP_PRESET: { g_value_set_string(value, open_sf2_instrument->preset); } break; case PROP_INSTRUMENT: { g_value_set_string(value, open_sf2_instrument->instrument); } break; case PROP_START_PAD: { g_value_set_uint(value, open_sf2_instrument->start_pad); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_sf2_instrument_dispose(GObject *gobject) { AgsOpenSf2Instrument *open_sf2_instrument; open_sf2_instrument = AGS_OPEN_SF2_INSTRUMENT(gobject); if(open_sf2_instrument->audio != NULL){ g_object_unref(open_sf2_instrument->audio); open_sf2_instrument->audio = NULL; } if(open_sf2_instrument->ipatch != NULL){ g_object_unref(open_sf2_instrument->ipatch); open_sf2_instrument->ipatch = NULL; } /* call parent */ G_OBJECT_CLASS(ags_open_sf2_instrument_parent_class)->dispose(gobject); } void ags_open_sf2_instrument_finalize(GObject *gobject) { AgsOpenSf2Instrument *open_sf2_instrument; open_sf2_instrument = AGS_OPEN_SF2_INSTRUMENT(gobject); if(open_sf2_instrument->audio != NULL){ g_object_unref(open_sf2_instrument->audio); } if(open_sf2_instrument->ipatch != NULL){ g_object_unref(open_sf2_instrument->ipatch); } g_free(open_sf2_instrument->filename); g_free(open_sf2_instrument->preset); g_free(open_sf2_instrument->instrument); /* call parent */ G_OBJECT_CLASS(ags_open_sf2_instrument_parent_class)->finalize(gobject); } void ags_open_sf2_instrument_launch(AgsTask *task) { AgsAudio *audio; AgsChannel *start_channel; AgsChannel *channel, *next; AgsIpatch *ipatch; AgsOpenSf2Instrument *open_sf2_instrument; GObject *output_soundcard; GList *start_list, *list; guint n_pads; guint n_audio_channels; guint i; guint j, j_stop; GError *error; open_sf2_instrument = (AgsOpenSf2Instrument *) task; g_return_if_fail(AGS_IS_AUDIO(open_sf2_instrument->audio)); g_return_if_fail(AGS_IS_IPATCH(open_sf2_instrument->ipatch)); audio = open_sf2_instrument->audio; ipatch = open_sf2_instrument->ipatch; /* read all samples */ list = start_list = ags_sound_container_get_resource_current(AGS_SOUND_CONTAINER(ipatch)); n_pads = g_list_length(start_list); g_object_get(audio, "audio-channels", &n_audio_channels, "output-soundcard", &output_soundcard, NULL); while(list != NULL){ guint current_audio_channels; ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(list->data), ¤t_audio_channels, NULL, NULL, NULL); if(current_audio_channels > n_audio_channels){ n_audio_channels = current_audio_channels; } list = list->next; } /* read */ if(n_audio_channels > 0 && n_pads > 0){ /* resize */ ags_audio_set_audio_channels(audio, n_audio_channels, 0); ags_audio_set_pads(audio, AGS_TYPE_INPUT, open_sf2_instrument->start_pad + n_pads, 0); /* get some fields */ g_object_get(audio, "input", &start_channel, NULL); list = start_list; i = 0; while(list != NULL){ GList *start_audio_signal, *audio_signal; // g_message("open sf2 sample: %s", ipatch_sf2_sample_get_name(AGS_IPATCH_SAMPLE(list->data)->sample)); channel = ags_channel_pad_nth(start_channel, open_sf2_instrument->start_pad + i); next = NULL; ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(list->data), &j_stop, NULL, NULL, NULL); audio_signal = start_audio_signal = ags_sound_resource_read_audio_signal(AGS_SOUND_RESOURCE(list->data), output_soundcard, -1); for(j = 0; j < j_stop && audio_signal != NULL; j++){ AgsRecycling *recycling; AgsFileLink *file_link; /* reset link */ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } /* get recycling */ g_object_get(channel, "first-recycling", &recycling, "file-link", &file_link, NULL); g_object_unref(recycling); /* set filename and channel */ if(file_link == NULL){ file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, NULL); g_object_set(channel, "file-link", file_link, NULL); } g_object_set(file_link, "filename", ipatch->filename, "preset", AGS_IPATCH_SF2_READER(ipatch->reader)->name_selected[AGS_SF2_PHDR], "instrument", AGS_IPATCH_SF2_READER(ipatch->reader)->name_selected[AGS_SF2_IHDR], "sample", ipatch_sf2_sample_get_name(AGS_IPATCH_SAMPLE(list->data)->sample), "audio-channel", j, NULL); g_object_unref(file_link); /* replace template audio signal */ AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; g_object_set(AGS_AUDIO_SIGNAL(audio_signal->data), "recycling", recycling, NULL); ags_recycling_add_audio_signal(recycling, audio_signal->data); /* iterate */ audio_signal = audio_signal->next; next = ags_channel_next(channel); g_object_unref(channel); channel = next; } if(start_audio_signal == NULL){ g_object_unref(channel); } if(next != NULL){ g_object_unref(next); } g_list_free_full(start_audio_signal, g_object_unref); /* iterate */ list = list->next; i++; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } g_list_free_full(start_list, g_object_unref); } g_object_unref(output_soundcard); } /** * ags_open_sf2_instrument_new: * @audio: the #AgsAudio * @ipatch: the #AgsIpatch or %NULL * @filename: the Soundfont2 file * @preset: the preset * @instrument: the instrument * @start_pad: the pad start * * Creates an #AgsOpenSf2Instrument. * * Returns: an new #AgsOpenSf2Instrument. * * Since: 3.0.0 */ AgsOpenSf2Instrument* ags_open_sf2_instrument_new(AgsAudio *audio, AgsIpatch *ipatch, gchar *filename, gchar *preset, gchar *instrument, guint start_pad) { AgsOpenSf2Instrument *open_sf2_instrument; open_sf2_instrument = (AgsOpenSf2Instrument *) g_object_new(AGS_TYPE_OPEN_SF2_INSTRUMENT, "audio", audio, "ipatch", ipatch, "filename", filename, "preset", preset, "instrument", instrument, "start-pad", start_pad, NULL); return(open_sf2_instrument); } gsequencer-3.1.3/ags/audio/task/ags_add_soundcard.h0000644000175000017500000000365513607210263017223 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ADD_SOUNDCARD_H__ #define __AGS_ADD_SOUNDCARD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ADD_SOUNDCARD (ags_add_soundcard_get_type()) #define AGS_ADD_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ADD_SOUNDCARD, AgsAddSoundcard)) #define AGS_ADD_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ADD_SOUNDCARD, AgsAddSoundcardClass)) #define AGS_IS_ADD_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ADD_SOUNDCARD)) #define AGS_IS_ADD_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ADD_SOUNDCARD)) #define AGS_ADD_SOUNDCARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ADD_SOUNDCARD, AgsAddSoundcardClass)) typedef struct _AgsAddSoundcard AgsAddSoundcard; typedef struct _AgsAddSoundcardClass AgsAddSoundcardClass; struct _AgsAddSoundcard { AgsTask task; GObject *soundcard; }; struct _AgsAddSoundcardClass { AgsTaskClass task; }; GType ags_add_soundcard_get_type(); AgsAddSoundcard* ags_add_soundcard_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_ADD_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/audio/task/ags_add_effect.h0000644000175000017500000000372113607210263016467 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ADD_EFFECT_H__ #define __AGS_ADD_EFFECT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ADD_EFFECT (ags_add_effect_get_type()) #define AGS_ADD_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ADD_EFFECT, AgsAddEffect)) #define AGS_ADD_EFFECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ADD_EFFECT, AgsAddEffectClass)) #define AGS_IS_ADD_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ADD_EFFECT)) #define AGS_IS_ADD_EFFECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ADD_EFFECT)) #define AGS_ADD_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ADD_EFFECT, AgsAddEffectClass)) typedef struct _AgsAddEffect AgsAddEffect; typedef struct _AgsAddEffectClass AgsAddEffectClass; struct _AgsAddEffect { AgsTask task; AgsChannel *channel; gchar *filename; gchar *effect; }; struct _AgsAddEffectClass { AgsTaskClass task; }; GType ags_add_effect_get_type(); AgsAddEffect* ags_add_effect_new(AgsChannel *channel, gchar *filename, gchar *effect); G_END_DECLS #endif /*__AGS_ADD_EFFECT_H__*/ gsequencer-3.1.3/ags/audio/task/ags_add_audio_signal.h0000644000175000017500000000447713607210263017702 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ADD_AUDIO_SIGNAL_H__ #define __AGS_ADD_AUDIO_SIGNAL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ADD_AUDIO_SIGNAL (ags_add_audio_signal_get_type()) #define AGS_ADD_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ADD_AUDIO_SIGNAL, AgsAddAudioSignal)) #define AGS_ADD_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ADD_AUDIO_SIGNAL, AgsAddAudioSignalClass)) #define AGS_IS_ADD_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ADD_AUDIO_SIGNAL)) #define AGS_IS_ADD_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ADD_AUDIO_SIGNAL)) #define AGS_ADD_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ADD_AUDIO_SIGNAL, AgsAddAudioSignalClass)) typedef struct _AgsAddAudioSignal AgsAddAudioSignal; typedef struct _AgsAddAudioSignalClass AgsAddAudioSignalClass; struct _AgsAddAudioSignal { AgsTask task; AgsRecycling *recycling; AgsAudioSignal *audio_signal; GObject *soundcard; AgsRecallID *recall_id; guint audio_signal_flags; }; struct _AgsAddAudioSignalClass { AgsTaskClass task; }; GType ags_add_audio_signal_get_type(); AgsAddAudioSignal* ags_add_audio_signal_new(AgsRecycling *recycling, AgsAudioSignal *audio_signal, GObject *soundcard, AgsRecallID *recall_id, guint audio_signal_flags); G_END_DECLS #endif /*__AGS_ADD_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/task/ags_remove_audio_signal.c0000644000175000017500000002031013607210263020422 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_remove_audio_signal_class_init(AgsRemoveAudioSignalClass *remove_audio_signal); void ags_remove_audio_signal_init(AgsRemoveAudioSignal *remove_audio_signal); void ags_remove_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_remove_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_remove_audio_signal_dispose(GObject *gobject); void ags_remove_audio_signal_finalize(GObject *gobject); void ags_remove_audio_signal_launch(AgsTask *task); /** * SECTION:ags_remove_audio_signal * @short_description: remove audio_signal object from recycling * @title: AgsRemoveAudioSignal * @section_id: * @include: ags/audio/task/ags_remove_audio_signal.h * * The #AgsRemoveAudioSignal task removes #AgsAudioSignal from #AgsRecycling. */ static gpointer ags_remove_audio_signal_parent_class = NULL; enum{ PROP_0, PROP_RECYCLING, PROP_AUDIO_SIGNAL, }; GType ags_remove_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_remove_audio_signal = 0; static const GTypeInfo ags_remove_audio_signal_info = { sizeof(AgsRemoveAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_remove_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRemoveAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_remove_audio_signal_init, }; ags_type_remove_audio_signal = g_type_register_static(AGS_TYPE_TASK, "AgsRemoveAudioSignal", &ags_remove_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_remove_audio_signal); } return g_define_type_id__volatile; } void ags_remove_audio_signal_class_init(AgsRemoveAudioSignalClass *remove_audio_signal) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_remove_audio_signal_parent_class = g_type_class_peek_parent(remove_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) remove_audio_signal; gobject->set_property = ags_remove_audio_signal_set_property; gobject->get_property = ags_remove_audio_signal_get_property; gobject->dispose = ags_remove_audio_signal_dispose; gobject->finalize = ags_remove_audio_signal_finalize; /* properties */ /** * AgsRemoveAudioSignal:recycling: * * The assigned #AgsRecycling * * Since: 3.0.0 */ param_spec = g_param_spec_object("recycling", i18n_pspec("recycling of remove audio signal"), i18n_pspec("The recycling of remove audio signal task"), AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECYCLING, param_spec); /** * AgsRemoveAudioSignal:audio-signal: * * The assigned #AgsAudioSignal * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-signal", i18n_pspec("audio signal of remove audio signal"), i18n_pspec("The audio signal of remove audio signal task"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) remove_audio_signal; task->launch = ags_remove_audio_signal_launch; } void ags_remove_audio_signal_init(AgsRemoveAudioSignal *remove_audio_signal) { remove_audio_signal->recycling = NULL; remove_audio_signal->audio_signal = NULL; } void ags_remove_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRemoveAudioSignal *remove_audio_signal; remove_audio_signal = AGS_REMOVE_AUDIO_SIGNAL(gobject); switch(prop_id){ case PROP_RECYCLING: { AgsRecycling *recycling; recycling = (AgsRecycling *) g_value_get_object(value); if(remove_audio_signal->recycling == recycling){ return; } if(remove_audio_signal->recycling != NULL){ g_object_unref(remove_audio_signal->recycling); } if(recycling != NULL){ g_object_ref(recycling); } remove_audio_signal->recycling = recycling; } break; case PROP_AUDIO_SIGNAL: { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) g_value_get_object(value); if(remove_audio_signal->audio_signal == audio_signal){ return; } if(remove_audio_signal->audio_signal != NULL){ g_object_unref(remove_audio_signal->audio_signal); } if(audio_signal != NULL){ g_object_ref(audio_signal); } remove_audio_signal->audio_signal = audio_signal; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRemoveAudioSignal *remove_audio_signal; remove_audio_signal = AGS_REMOVE_AUDIO_SIGNAL(gobject); switch(prop_id){ case PROP_RECYCLING: { g_value_set_object(value, remove_audio_signal->recycling); } break; case PROP_AUDIO_SIGNAL: { g_value_set_object(value, remove_audio_signal->audio_signal); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_audio_signal_dispose(GObject *gobject) { AgsRemoveAudioSignal *remove_audio_signal; remove_audio_signal = AGS_REMOVE_AUDIO_SIGNAL(gobject); if(remove_audio_signal->recycling != NULL){ g_object_unref(remove_audio_signal->recycling); remove_audio_signal->recycling = NULL; } if(remove_audio_signal->audio_signal != NULL){ g_object_unref(remove_audio_signal->audio_signal); remove_audio_signal->audio_signal = NULL; } /* call parent */ G_OBJECT_CLASS(ags_remove_audio_signal_parent_class)->dispose(gobject); } void ags_remove_audio_signal_finalize(GObject *gobject) { AgsRemoveAudioSignal *remove_audio_signal; remove_audio_signal = AGS_REMOVE_AUDIO_SIGNAL(gobject); if(remove_audio_signal->recycling != NULL){ g_object_unref(remove_audio_signal->recycling); } if(remove_audio_signal->audio_signal != NULL){ g_object_unref(remove_audio_signal->audio_signal); } /* call parent */ G_OBJECT_CLASS(ags_remove_audio_signal_parent_class)->finalize(gobject); } void ags_remove_audio_signal_launch(AgsTask *task) { AgsRemoveAudioSignal *remove_audio_signal; remove_audio_signal = AGS_REMOVE_AUDIO_SIGNAL(task); ags_recycling_remove_audio_signal(remove_audio_signal->recycling, remove_audio_signal->audio_signal); } /** * ags_remove_audio_signal_new: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal to remove * * Create a new instance of #AgsRemoveAudioSignal. * * Returns: the new #AgsRemoveAudioSignal * * Since: 3.0.0 */ AgsRemoveAudioSignal* ags_remove_audio_signal_new(AgsRecycling *recycling, AgsAudioSignal *audio_signal) { AgsRemoveAudioSignal *remove_audio_signal; remove_audio_signal = (AgsRemoveAudioSignal *) g_object_new(AGS_TYPE_REMOVE_AUDIO_SIGNAL, "recycling", recycling, "audio-signal", audio_signal, NULL); return(remove_audio_signal); } gsequencer-3.1.3/ags/audio/task/ags_open_file.h0000644000175000017500000000402513607210263016361 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OPEN_FILE_H__ #define __AGS_OPEN_FILE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OPEN_FILE (ags_open_file_get_type()) #define AGS_OPEN_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OPEN_FILE, AgsOpenFile)) #define AGS_OPEN_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OPEN_FILE, AgsOpenFileClass)) #define AGS_IS_OPEN_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OPEN_FILE)) #define AGS_IS_OPEN_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OPEN_FILE)) #define AGS_OPEN_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OPEN_FILE, AgsOpenFileClass)) typedef struct _AgsOpenFile AgsOpenFile; typedef struct _AgsOpenFileClass AgsOpenFileClass; struct _AgsOpenFile { AgsTask task; AgsAudio *audio; GSList *filename; gboolean overwrite_channels; gboolean create_channels; }; struct _AgsOpenFileClass { AgsTaskClass task; }; GType ags_open_file_get_type(); AgsOpenFile* ags_open_file_new(AgsAudio *audio, GSList *filename, gboolean overwrite_channels, gboolean create_channels); G_END_DECLS #endif /*__AGS_OPEN_FILE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_reset_peak.h0000644000175000017500000000413013607210263016540 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RESET_PEAK_H__ #define __AGS_RESET_PEAK_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RESET_PEAK (ags_reset_peak_get_type()) #define AGS_RESET_PEAK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RESET_PEAK, AgsResetPeak)) #define AGS_RESET_PEAK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RESET_PEAK, AgsResetPeakClass)) #define AGS_IS_RESET_PEAK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RESET_PEAK)) #define AGS_IS_RESET_PEAK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RESET_PEAK)) #define AGS_RESET_PEAK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RESET_PEAK, AgsResetPeakClass)) typedef struct _AgsResetPeak AgsResetPeak; typedef struct _AgsResetPeakClass AgsResetPeakClass; struct _AgsResetPeak { AgsTask task; GList *peak_channel; }; struct _AgsResetPeakClass { AgsTaskClass task; }; GType ags_reset_peak_get_type(); void ags_reset_peak_add(AgsResetPeak *reset_peak, AgsPeakChannel *peak_channel); void ags_reset_peak_remove(AgsResetPeak *reset_peak, AgsPeakChannel *peak_channel); AgsResetPeak* ags_reset_peak_get_instance(); AgsResetPeak* ags_reset_peak_new(); G_END_DECLS #endif /*__AGS_RESET_PEAK_H__*/ gsequencer-3.1.3/ags/audio/task/ags_reset_amplitude.c0000644000175000017500000001642413607210263017610 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_reset_amplitude_class_init(AgsResetAmplitudeClass *reset_amplitude); void ags_reset_amplitude_init(AgsResetAmplitude *reset_amplitude); void ags_reset_amplitude_dispose(GObject *gobject); void ags_reset_amplitude_finalize(GObject *gobject); void ags_reset_amplitude_launch(AgsTask *task); /** * SECTION:ags_reset_amplitude * @short_description: reset amplitude internal * @title: AgsResetAmplitude * @section_id: * @include: ags/audio/task/ags_reset_amplitude.h * * The #AgsResetAmplitude task resets amplitude to recompute the amplitude during next run. */ static gpointer ags_reset_amplitude_parent_class = NULL; AgsResetAmplitude *ags_reset_amplitude = NULL; GType ags_reset_amplitude_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_reset_amplitude = 0; static const GTypeInfo ags_reset_amplitude_info = { sizeof (AgsResetAmplitudeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_reset_amplitude_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsResetAmplitude), 0, /* n_preallocs */ (GInstanceInitFunc) ags_reset_amplitude_init, }; ags_type_reset_amplitude = g_type_register_static(AGS_TYPE_TASK, "AgsResetAmplitude", &ags_reset_amplitude_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_reset_amplitude); } return g_define_type_id__volatile; } void ags_reset_amplitude_class_init(AgsResetAmplitudeClass *reset_amplitude) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_reset_amplitude_parent_class = g_type_class_peek_parent(reset_amplitude); /* GObjectClass */ gobject = (GObjectClass *) reset_amplitude; gobject->dispose = ags_reset_amplitude_dispose; gobject->finalize = ags_reset_amplitude_finalize; /* AgsTaskClass */ task = (AgsTaskClass *) reset_amplitude; task->launch = ags_reset_amplitude_launch; } void ags_reset_amplitude_init(AgsResetAmplitude *reset_amplitude) { AGS_TASK(reset_amplitude)->flags |= AGS_TASK_CYCLIC; reset_amplitude->analyse_channel = NULL; } void ags_reset_amplitude_dispose(GObject *gobject) { AgsResetAmplitude *reset_amplitude; reset_amplitude = AGS_RESET_AMPLITUDE(gobject); if(reset_amplitude->analyse_channel != NULL){ g_list_free_full(reset_amplitude->analyse_channel, g_object_unref); reset_amplitude->analyse_channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_reset_amplitude_parent_class)->dispose(gobject); } void ags_reset_amplitude_finalize(GObject *gobject) { AgsResetAmplitude *reset_amplitude; reset_amplitude = AGS_RESET_AMPLITUDE(gobject); if(reset_amplitude->analyse_channel != NULL){ g_list_free_full(reset_amplitude->analyse_channel, g_object_unref); } if(reset_amplitude == ags_reset_amplitude){ ags_reset_amplitude = NULL; } /* call parent */ G_OBJECT_CLASS(ags_reset_amplitude_parent_class)->finalize(gobject); } void ags_reset_amplitude_launch(AgsTask *task) { AgsResetAmplitude *reset_amplitude; GList *analyse_channel; GValue value = {0,}; GRecMutex *task_mutex; reset_amplitude = AGS_RESET_AMPLITUDE(task); task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_amplitude); g_rec_mutex_lock(task_mutex); analyse_channel = reset_amplitude->analyse_channel; g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, FALSE); while(analyse_channel != NULL){ ags_port_safe_write(AGS_ANALYSE_CHANNEL(analyse_channel->data)->buffer_computed, &value); analyse_channel = analyse_channel->next; } g_rec_mutex_unlock(task_mutex); g_value_unset(&value); } /** * ags_reset_amplitude_add: * @reset_amplitude: the #AgsResetAmplitude * @analyse_channel: the #AgsAnalyseChannel * * Add @analyse_channel. * * Since: 3.0.0 */ void ags_reset_amplitude_add(AgsResetAmplitude *reset_amplitude, AgsAnalyseChannel *analyse_channel) { GRecMutex *task_mutex; if(!AGS_IS_RESET_AMPLITUDE(reset_amplitude) || !AGS_IS_ANALYSE_CHANNEL(analyse_channel)){ return; } task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_amplitude); g_rec_mutex_lock(task_mutex); reset_amplitude->analyse_channel = g_list_prepend(reset_amplitude->analyse_channel, analyse_channel); g_object_ref(analyse_channel); g_rec_mutex_unlock(task_mutex); } /** * ags_reset_amplitude_remove: * @reset_amplitude: the #AgsResetAmplitude * @analyse_channel: the #AgsAnalyseChannel * * Remove @analyse_channel. * * Since: 3.0.0 */ void ags_reset_amplitude_remove(AgsResetAmplitude *reset_amplitude, AgsAnalyseChannel *analyse_channel) { GRecMutex *task_mutex; if(!AGS_IS_RESET_AMPLITUDE(reset_amplitude) || !AGS_IS_ANALYSE_CHANNEL(analyse_channel)){ return; } task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_amplitude); g_rec_mutex_lock(task_mutex); if(g_list_find(reset_amplitude->analyse_channel, analyse_channel) != NULL){ reset_amplitude->analyse_channel = g_list_remove(reset_amplitude->analyse_channel, analyse_channel); g_object_unref(analyse_channel); } g_rec_mutex_unlock(task_mutex); } /** * ags_reset_amplitude_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsResetAmplitude * * Since: 3.0.0 */ AgsResetAmplitude* ags_reset_amplitude_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_reset_amplitude == NULL){ AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; /* reset amplitude */ ags_reset_amplitude = ags_reset_amplitude_new(); g_mutex_unlock(&mutex); /* add cyclic task */ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); ags_task_launcher_add_cyclic_task(task_launcher, (AgsTask *) ags_reset_amplitude); /* unref */ g_object_unref(task_launcher); }else{ g_mutex_unlock(&mutex); } return(ags_reset_amplitude); } /** * ags_reset_amplitude_new: * * Creates an #AgsResetAmplitude. * * Returns: an new #AgsResetAmplitude. * * Since: 3.0.0 */ AgsResetAmplitude* ags_reset_amplitude_new() { AgsResetAmplitude *reset_amplitude; reset_amplitude = (AgsResetAmplitude *) g_object_new(AGS_TYPE_RESET_AMPLITUDE, NULL); return(reset_amplitude); } gsequencer-3.1.3/ags/audio/task/ags_remove_audio.c0000644000175000017500000001522213607210263017073 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_remove_audio_class_init(AgsRemoveAudioClass *remove_audio); void ags_remove_audio_init(AgsRemoveAudio *remove_audio); void ags_remove_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_remove_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_remove_audio_dispose(GObject *gobject); void ags_remove_audio_finalize(GObject *gobject); void ags_remove_audio_launch(AgsTask *task); /** * SECTION:ags_remove_audio * @short_description: remove audio of application context * @title: AgsRemoveAudio * @section_id: * @include: ags/audio/task/ags_remove_audio.h * * The #AgsRemoveAudio task removes #AgsAudio of #AgsApplicationContext. */ static gpointer ags_remove_audio_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, }; GType ags_remove_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_remove_audio = 0; static const GTypeInfo ags_remove_audio_info = { sizeof(AgsRemoveAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_remove_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRemoveAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_remove_audio_init, }; ags_type_remove_audio = g_type_register_static(AGS_TYPE_TASK, "AgsRemoveAudio", &ags_remove_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_remove_audio); } return g_define_type_id__volatile; } void ags_remove_audio_class_init(AgsRemoveAudioClass *remove_audio) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_remove_audio_parent_class = g_type_class_peek_parent(remove_audio); /* gobject */ gobject = (GObjectClass *) remove_audio; gobject->set_property = ags_remove_audio_set_property; gobject->get_property = ags_remove_audio_get_property; gobject->dispose = ags_remove_audio_dispose; gobject->finalize = ags_remove_audio_finalize; /* properties */ /** * AgsRemoveAudio:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of remove audio"), i18n_pspec("The audio of remove audio task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /* task */ task = (AgsTaskClass *) remove_audio; task->launch = ags_remove_audio_launch; } void ags_remove_audio_init(AgsRemoveAudio *remove_audio) { remove_audio->audio = NULL; } void ags_remove_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRemoveAudio *remove_audio; remove_audio = AGS_REMOVE_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(remove_audio->audio == audio){ return; } if(remove_audio->audio != NULL){ g_object_unref(remove_audio->audio); } if(audio != NULL){ g_object_ref(audio); } remove_audio->audio = audio; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRemoveAudio *remove_audio; remove_audio = AGS_REMOVE_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, remove_audio->audio); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_audio_dispose(GObject *gobject) { AgsRemoveAudio *remove_audio; remove_audio = AGS_REMOVE_AUDIO(gobject); if(remove_audio->audio != NULL){ g_object_unref(remove_audio->audio); remove_audio->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_remove_audio_parent_class)->dispose(gobject); } void ags_remove_audio_finalize(GObject *gobject) { AgsRemoveAudio *remove_audio; remove_audio = AGS_REMOVE_AUDIO(gobject); if(remove_audio->audio != NULL){ g_object_unref(remove_audio->audio); } /* call parent */ G_OBJECT_CLASS(ags_remove_audio_parent_class)->finalize(gobject); } void ags_remove_audio_launch(AgsTask *task) { AgsRemoveAudio *remove_audio; AgsApplicationContext *application_context; GList *start_list, *list; remove_audio = AGS_REMOVE_AUDIO(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_SOUND_PROVIDER(application_context)); g_return_if_fail(AGS_IS_AUDIO(remove_audio->audio)); /* remove audio */ list = start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); if(g_list_find(list, remove_audio->audio) != NULL){ /* remove to sound provider */ list = g_list_remove(list, remove_audio->audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), list); /* AgsAudio */ ags_connectable_disconnect(AGS_CONNECTABLE(remove_audio->audio)); g_object_unref(remove_audio->audio); } g_list_free_full(start_list, g_object_unref); } /** * ags_remove_audio_new: * @audio: the #AgsAudio to remove * * Create a new instance of #AgsRemoveAudio. * * Returns: the new #AgsRemoveAudio * * Since: 3.0.0 */ AgsRemoveAudio* ags_remove_audio_new(AgsAudio *audio) { AgsRemoveAudio *remove_audio; remove_audio = (AgsRemoveAudio *) g_object_new(AGS_TYPE_REMOVE_AUDIO, "audio", audio, NULL); return(remove_audio); } gsequencer-3.1.3/ags/audio/task/ags_apply_bpm.c0000644000175000017500000002724613607210263016411 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_apply_bpm_class_init(AgsApplyBpmClass *apply_bpm); void ags_apply_bpm_init(AgsApplyBpm *apply_bpm); void ags_apply_bpm_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_apply_bpm_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_apply_bpm_dispose(GObject *gobject); void ags_apply_bpm_finalize(GObject *gobject); void ags_apply_bpm_launch(AgsTask *task); void ags_apply_bpm_recall(AgsApplyBpm *apply_bpm, AgsRecall *recall); void ags_apply_bpm_channel(AgsApplyBpm *apply_bpm, AgsChannel *channel); void ags_apply_bpm_audio(AgsApplyBpm *apply_bpm, AgsAudio *audio); void ags_apply_bpm_soundcard(AgsApplyBpm *apply_bpm, GObject *soundcard); void ags_apply_bpm_sequencer(AgsApplyBpm *apply_bpm, GObject *sequencer); void ags_apply_bpm_application_context(AgsApplyBpm *apply_bpm, AgsApplicationContext *application_context); /** * SECTION:ags_apply_bpm * @short_description: apply bpm * @title: AgsApplyBpm * @section_id: * @include: ags/audio/task/recall/ags_apply_bpm.h * * The #AgsApplyBpm task applys bpm to #AgsDelayAudio. */ enum{ PROP_0, PROP_SCOPE, PROP_BPM, }; static gpointer ags_apply_bpm_parent_class = NULL; GType ags_apply_bpm_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_apply_bpm = 0; static const GTypeInfo ags_apply_bpm_info = { sizeof (AgsApplyBpmClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_apply_bpm_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsApplyBpm), 0, /* n_preallocs */ (GInstanceInitFunc) ags_apply_bpm_init, }; ags_type_apply_bpm = g_type_register_static(AGS_TYPE_TASK, "AgsApplyBpm", &ags_apply_bpm_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_apply_bpm); } return g_define_type_id__volatile; } void ags_apply_bpm_class_init(AgsApplyBpmClass *apply_bpm) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_apply_bpm_parent_class = g_type_class_peek_parent(apply_bpm); /* GObjectClass */ gobject = (GObjectClass *) apply_bpm; gobject->set_property = ags_apply_bpm_set_property; gobject->get_property = ags_apply_bpm_get_property; gobject->dispose = ags_apply_bpm_dispose; gobject->finalize = ags_apply_bpm_finalize; /* properties */ /** * AgsApplyBpm:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set buffer size"), i18n_pspec("The scope of set buffer size"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsApplyBpm:bpm: * * The bpm to apply to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("bpm"), i18n_pspec("The bpm to apply"), 0.0, G_MAXDOUBLE, AGS_SOUNDCARD_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) apply_bpm; task->launch = ags_apply_bpm_launch; } void ags_apply_bpm_init(AgsApplyBpm *apply_bpm) { apply_bpm->scope = NULL; apply_bpm->bpm = AGS_SOUNDCARD_DEFAULT_BPM; } void ags_apply_bpm_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplyBpm *apply_bpm; apply_bpm = AGS_APPLY_BPM(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(apply_bpm->scope == (GObject *) scope){ return; } if(apply_bpm->scope != NULL){ g_object_unref(apply_bpm->scope); } if(scope != NULL){ g_object_ref(scope); } apply_bpm->scope = (GObject *) scope; } break; case PROP_BPM: { apply_bpm->bpm = g_value_get_double(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_bpm_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplyBpm *apply_bpm; apply_bpm = AGS_APPLY_BPM(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, apply_bpm->scope); } break; case PROP_BPM: { g_value_set_double(value, apply_bpm->bpm); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_bpm_dispose(GObject *gobject) { AgsApplyBpm *apply_bpm; apply_bpm = AGS_APPLY_BPM(gobject); if(apply_bpm->scope != NULL){ g_object_unref(apply_bpm->scope); apply_bpm->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_apply_bpm_parent_class)->dispose(gobject); } void ags_apply_bpm_finalize(GObject *gobject) { AgsApplyBpm *apply_bpm; apply_bpm = AGS_APPLY_BPM(gobject); if(apply_bpm->scope != NULL){ g_object_unref(apply_bpm->scope); } /* call parent */ G_OBJECT_CLASS(ags_apply_bpm_parent_class)->finalize(gobject); } void ags_apply_bpm_launch(AgsTask *task) { AgsApplyBpm *apply_bpm; apply_bpm = AGS_APPLY_BPM(task); if(AGS_IS_APPLICATION_CONTEXT(apply_bpm->scope)){ AgsApplicationContext *application_context; application_context = (AgsApplicationContext *) apply_bpm->scope; ags_apply_bpm_application_context(apply_bpm, application_context); }else if(AGS_IS_SOUNDCARD(apply_bpm->scope)){ GObject *soundcard; soundcard = apply_bpm->scope; ags_apply_bpm_soundcard(apply_bpm, soundcard); }else if(AGS_IS_SEQUENCER(apply_bpm->scope)){ GObject *sequencer; sequencer = apply_bpm->scope; ags_apply_bpm_sequencer(apply_bpm, sequencer); }else if(AGS_IS_AUDIO(apply_bpm->scope)){ AgsAudio *audio; audio = AGS_AUDIO(apply_bpm->scope); ags_apply_bpm_audio(apply_bpm, audio); }else if(AGS_IS_CHANNEL(apply_bpm->scope)){ AgsChannel *channel; channel = AGS_CHANNEL(apply_bpm->scope); ags_apply_bpm_channel(apply_bpm, channel); }else if(AGS_IS_RECALL(apply_bpm->scope)){ AgsRecall *recall; recall = AGS_RECALL(apply_bpm->scope); ags_apply_bpm_recall(apply_bpm, recall); }else{ g_warning("AgsApplyBpm: Not supported scope"); } } void ags_apply_bpm_recall(AgsApplyBpm *apply_bpm, AgsRecall *recall) { if(AGS_IS_TACTABLE(recall)){ ags_tactable_change_bpm(AGS_TACTABLE(recall), apply_bpm->bpm, ags_tactable_get_bpm(AGS_TACTABLE(recall))); } } void ags_apply_bpm_channel(AgsApplyBpm *apply_bpm, AgsChannel *channel) { GList *list_start, *list; /* apply bpm - play */ g_object_get(channel, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_bpm_recall(apply_bpm, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* apply bpm - recall */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_bpm_recall(apply_bpm, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); } void ags_apply_bpm_audio(AgsApplyBpm *apply_bpm, AgsAudio *audio) { AgsChannel *input, *output; AgsChannel *channel, *next_channel; GList *list_start, *list; /* get some fields */ g_object_get(audio, "output", &output, "input", &input, NULL); /* set bpm */ g_object_set(audio, "bpm", apply_bpm->bpm, NULL); /* apply bpm - play */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_bpm_recall(apply_bpm, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* apply bpm - recall */ g_object_get(audio, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_bpm_recall(apply_bpm, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* AgsChannel - output */ if(output != NULL){ channel = output; g_object_ref(channel); while(channel != NULL){ /* apply bpm */ ags_apply_bpm_channel(apply_bpm, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(output); } /* AgsChannel - input */ if(input != NULL){ channel = input; g_object_ref(channel); while(channel != NULL){ /* apply bpm */ ags_apply_bpm_channel(apply_bpm, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(input); } } void ags_apply_bpm_soundcard(AgsApplyBpm *apply_bpm, GObject *soundcard) { ags_soundcard_set_bpm(AGS_SOUNDCARD(soundcard), apply_bpm->bpm); } void ags_apply_bpm_sequencer(AgsApplyBpm *apply_bpm, GObject *sequencer) { ags_sequencer_set_bpm(AGS_SEQUENCER(sequencer), apply_bpm->bpm); } void ags_apply_bpm_application_context(AgsApplyBpm *apply_bpm, AgsApplicationContext *application_context) { GList *list_start, *list; /* soundcard */ list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_apply_bpm_soundcard(apply_bpm, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); /* sequencer */ list = list_start = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_apply_bpm_sequencer(apply_bpm, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); /* audio */ list = list_start = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_apply_bpm_audio(apply_bpm, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); } /** * ags_apply_bpm_new: * @scope: the #GObject * @bpm: the bpm to apply * * Create a new instance of #AgsApplyBpm. * * Returns: the new #AgsApplyBp * * Since: 3.0.0 */ AgsApplyBpm* ags_apply_bpm_new(GObject *scope, gdouble bpm) { AgsApplyBpm *apply_bpm; apply_bpm = (AgsApplyBpm *) g_object_new(AGS_TYPE_APPLY_BPM, "scope", scope, "bpm", bpm, NULL); return(apply_bpm); } gsequencer-3.1.3/ags/audio/task/ags_link_channel.h0000644000175000017500000000376013607210263017053 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LINK_CHANNEL_H__ #define __AGS_LINK_CHANNEL_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LINK_CHANNEL (ags_link_channel_get_type()) #define AGS_LINK_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LINK_CHANNEL, AgsLinkChannel)) #define AGS_LINK_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LINK_CHANNEL, AgsLinkChannelClass)) #define AGS_IS_LINK_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LINK_CHANNEL)) #define AGS_IS_LINK_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LINK_CHANNEL)) #define AGS_LINK_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LINK_CHANNEL, AgsLinkChannelClass)) typedef struct _AgsLinkChannel AgsLinkChannel; typedef struct _AgsLinkChannelClass AgsLinkChannelClass; struct _AgsLinkChannel { AgsTask task; AgsChannel *channel; AgsChannel *link; GError *error; }; struct _AgsLinkChannelClass { AgsTaskClass task; }; GType ags_link_channel_get_type(); AgsLinkChannel* ags_link_channel_new(AgsChannel *channel, AgsChannel *link); G_END_DECLS #endif /*__AGS_LINK_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/task/ags_stop_sequencer.h0000644000175000017500000000363713607210263017470 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STOP_SEQUENCER_H__ #define __AGS_STOP_SEQUENCER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_STOP_SEQUENCER (ags_stop_sequencer_get_type()) #define AGS_STOP_SEQUENCER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_STOP_SEQUENCER, AgsStopSequencer)) #define AGS_STOP_SEQUENCER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_STOP_SEQUENCER, AgsStopSequencerClass)) #define AGS_IS_STOP_SEQUENCER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_STOP_SEQUENCER)) #define AGS_IS_STOP_SEQUENCER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_STOP_SEQUENCER)) #define AGS_STOP_SEQUENCER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_STOP_SEQUENCER, AgsStopSequencerClass)) typedef struct _AgsStopSequencer AgsStopSequencer; typedef struct _AgsStopSequencerClass AgsStopSequencerClass; struct _AgsStopSequencer { AgsTask task; }; struct _AgsStopSequencerClass { AgsTaskClass task; }; GType ags_stop_sequencer_get_type(); AgsStopSequencer* ags_stop_sequencer_new(); G_END_DECLS #endif /*__AGS_STOP_SEQUENCER_H__*/ gsequencer-3.1.3/ags/audio/task/ags_crop_note.c0000644000175000017500000003574513613101164016415 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_crop_note_class_init(AgsCropNoteClass *crop_note); void ags_crop_note_init(AgsCropNote *crop_note); void ags_crop_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_crop_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_crop_note_dispose(GObject *gobject); void ags_crop_note_finalize(GObject *gobject); void ags_crop_note_launch(AgsTask *task); /** * SECTION:ags_crop_note * @short_description: crop notation * @title: AgsCropNote * @section_id: * @include: ags/audio/task/ags_crop_note.h * * The #AgsCropNote task crops #AgsNotation. */ static gpointer ags_crop_note_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_NOTATION, PROP_SELECTION, PROP_X_PADDING, PROP_X_CROP, PROP_ABSOLUTE, PROP_IN_PLACE, PROP_DO_RESIZE, }; GType ags_crop_note_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_crop_note = 0; static const GTypeInfo ags_crop_note_info = { sizeof(AgsCropNoteClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_crop_note_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCropNote), 0, /* n_preallocs */ (GInstanceInitFunc) ags_crop_note_init, }; ags_type_crop_note = g_type_register_static(AGS_TYPE_TASK, "AgsCropNote", &ags_crop_note_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_crop_note); } return g_define_type_id__volatile; } void ags_crop_note_class_init(AgsCropNoteClass *crop_note) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_crop_note_parent_class = g_type_class_peek_parent(crop_note); /* gobject */ gobject = (GObjectClass *) crop_note; gobject->set_property = ags_crop_note_set_property; gobject->get_property = ags_crop_note_get_property; gobject->dispose = ags_crop_note_dispose; gobject->finalize = ags_crop_note_finalize; /* properties */ /** * AgsCropNote:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of crop note"), i18n_pspec("The audio of crop note task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsCropNote:notation: * * The assigned #AgsNotation * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation", i18n_pspec("notation of crop note"), i18n_pspec("The notation of crop note task"), AGS_TYPE_NOTATION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /** * AgsCropNote:selection: (type GList(AgsNote)) (transfer full) * * The assigned #AgsNote * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("selection", i18n_pspec("selection to crop"), i18n_pspec("The selection to crop"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SELECTION, param_spec); /** * AgsCropNote:x-padding: * * Crop notation with x padding. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("x-padding", i18n_pspec("crop with x padding"), i18n_pspec("Crop the notation with x padding"), 0, AGS_CROP_NOTE_DEFAULT_X_LENGTH, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_PADDING, param_spec); /** * AgsCropNote:x-crop: * * Crop notation by x-crop amount. * * Since: 3.0.0 */ param_spec = g_param_spec_int("x-crop", i18n_pspec("crop with x-crop amount"), i18n_pspec("Crop the notation by x-crop amount"), -1 * AGS_CROP_NOTE_DEFAULT_X_LENGTH, AGS_CROP_NOTE_DEFAULT_X_LENGTH, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_CROP, param_spec); /** * AgsCropNote:absolute: * * Crop notation by absolute position. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("absolute", i18n_pspec("crop absolute"), i18n_pspec("Crop the notation by absolute position"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ABSOLUTE, param_spec); /** * AgsCropNote:in-place: * * Crop notation in place. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("in-place", i18n_pspec("crop in place"), i18n_pspec("Crop the notation by in place"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IN_PLACE, param_spec); /** * AgsCropNote:do-resize: * * Crop notation do resize. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("do-resize", i18n_pspec("crop do resize"), i18n_pspec("Crop the notation by do resize"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DO_RESIZE, param_spec); /* task */ task = (AgsTaskClass *) crop_note; task->launch = ags_crop_note_launch; } void ags_crop_note_init(AgsCropNote *crop_note) { crop_note->audio = NULL; crop_note->notation = NULL; crop_note->selection = NULL; crop_note->x_padding = 0; crop_note->x_crop = 0; crop_note->absolute = FALSE; crop_note->in_place = FALSE; crop_note->do_resize = FALSE; } void ags_crop_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCropNote *crop_note; crop_note = AGS_CROP_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(crop_note->audio == audio){ return; } if(crop_note->audio != NULL){ g_object_unref(crop_note->audio); } if(audio != NULL){ g_object_ref(audio); } crop_note->audio = audio; } break; case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_object(value); if(crop_note->notation == notation){ return; } if(crop_note->notation != NULL){ g_object_unref(crop_note->notation); } if(notation != NULL){ g_object_ref(notation); } crop_note->notation = notation; } break; case PROP_SELECTION: { AgsNote *note; note = (AgsNote *) g_value_get_pointer(value); if(note == NULL || g_list_find(crop_note->selection, note) != NULL){ return; } g_object_ref(note); crop_note->selection = g_list_prepend(crop_note->selection, note); } break; case PROP_X_PADDING: { crop_note->x_padding = g_value_get_uint(value); } break; case PROP_X_CROP: { crop_note->x_crop = g_value_get_int(value); } break; case PROP_ABSOLUTE: { crop_note->absolute = g_value_get_boolean(value); } break; case PROP_IN_PLACE: { crop_note->in_place = g_value_get_boolean(value); } break; case PROP_DO_RESIZE: { crop_note->do_resize = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_crop_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCropNote *crop_note; crop_note = AGS_CROP_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, crop_note->audio); } break; case PROP_NOTATION: { g_value_set_object(value, crop_note->notation); } break; case PROP_SELECTION: { g_value_set_pointer(value, g_list_copy_deep(crop_note->selection, (GCopyFunc) g_object_ref, NULL)); } break; case PROP_X_PADDING: { g_value_set_uint(value, crop_note->x_padding); } break; case PROP_X_CROP: { g_value_set_int(value, crop_note->x_crop); } break; case PROP_ABSOLUTE: { g_value_set_boolean(value, crop_note->absolute); } break; case PROP_IN_PLACE: { g_value_set_boolean(value, crop_note->in_place); } break; case PROP_DO_RESIZE: { g_value_set_boolean(value, crop_note->do_resize); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_crop_note_dispose(GObject *gobject) { AgsCropNote *crop_note; crop_note = AGS_CROP_NOTE(gobject); if(crop_note->audio != NULL){ g_object_unref(crop_note->audio); crop_note->audio = NULL; } if(crop_note->notation != NULL){ g_object_unref(crop_note->notation); crop_note->notation = NULL; } if(crop_note->selection != NULL){ g_list_free_full(crop_note->selection, g_object_unref); crop_note->selection = NULL; } /* call parent */ G_OBJECT_CLASS(ags_crop_note_parent_class)->dispose(gobject); } void ags_crop_note_finalize(GObject *gobject) { AgsCropNote *crop_note; crop_note = AGS_CROP_NOTE(gobject); if(crop_note->audio != NULL){ g_object_unref(crop_note->audio); } if(crop_note->notation != NULL){ g_object_unref(crop_note->notation); } if(crop_note->selection != NULL){ g_list_free_full(crop_note->selection, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_crop_note_parent_class)->finalize(gobject); } void ags_crop_note_launch(AgsTask *task) { AgsAudio *audio; AgsNotation *notation, *current_notation; AgsNote *note; AgsCropNote *crop_note; GList *selection; guint audio_channel; guint x_padding; gint x_crop; gint x_offset, x_prev; gboolean absolute; gboolean in_place; gboolean do_resize; gboolean initial_run; crop_note = AGS_CROP_NOTE(task); g_return_if_fail(AGS_IS_AUDIO(crop_note->audio)); g_return_if_fail(AGS_IS_NOTATION(crop_note->notation)); g_object_get(crop_note, "audio", &audio, NULL); /* get some properties */ notation = current_notation = crop_note->notation; g_object_get(notation, "audio-channel", &audio_channel, NULL); selection = crop_note->selection; x_padding = crop_note->x_padding; x_crop = crop_note->x_crop; absolute = crop_note->absolute; in_place = crop_note->in_place; do_resize = crop_note->do_resize; /* crop */ x_offset = 0; x_prev = 0; initial_run = TRUE; while(selection != NULL){ note = ags_note_duplicate(AGS_NOTE(selection->data)); if(absolute){ if(in_place){ note->x[1] = note->x[0] + x_crop; }else if(do_resize){ if(initial_run){ x_offset = 0; x_prev = note->x[0]; initial_run = FALSE; }else{ if(note->x[0] > x_prev){ x_offset += (note->x[0] - x_prev) * x_padding; x_prev = note->x[0]; } } note->x[0] = x_offset + note->x[0]; note->x[1] = x_offset + note->x[0] + x_crop; } }else{ if(in_place){ note->x[1] = note->x[1] + x_crop; }else if(do_resize){ if(initial_run){ x_offset = 0; x_prev = note->x[0]; initial_run = FALSE; }else{ if(note->x[0] > x_prev){ x_offset += (note->x[0] - x_prev) * x_padding; x_prev = note->x[0]; } } note->x[0] = x_offset + note->x[0]; note->x[1] = x_offset + note->x[1] + x_crop; } } if(note->x[0] >= ags_timestamp_get_ags_offset(current_notation->timestamp) + AGS_NOTATION_DEFAULT_OFFSET){ AgsTimestamp *timestamp; GList *list_start, *list; g_object_get(audio, "notation", &list_start, NULL); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = (guint64) (AGS_NOTATION_DEFAULT_OFFSET * floor(note->x[0] / AGS_NOTATION_DEFAULT_OFFSET)); if((list = ags_notation_find_near_timestamp(list_start, audio_channel, timestamp)) == NULL){ current_notation = ags_notation_new((GObject *) audio, audio_channel); current_notation->timestamp->timer.ags_offset.offset = ags_timestamp_get_ags_offset(timestamp); ags_audio_add_notation(audio, (GObject *) current_notation); }else{ current_notation = list->data; } g_list_free_full(list_start, g_object_unref); g_object_unref(timestamp); } /* remove old note */ ags_notation_remove_note(notation, selection->data, TRUE); ags_notation_remove_note(notation, selection->data, FALSE); /* add new note */ ags_notation_add_note(current_notation, note, FALSE); selection = selection->next; } g_object_unref(audio); } /** * ags_crop_note_new: * @audio: the #AgsAudio * @notation: the #AgsNotation * @selection: (element-type AgsAudio.Note) (transfer none): the selection as #GList-struct * @x_padding: the x padding to use * @x_crop: the amout to crop * @absolute: if %TRUE from absolute position, otherwise relative * @in_place: if %TRUE crop in place, otherwise grow relative offset * @do_resize: if %TRUE resize notation, otherwise not * * WARNING you need to provide #AgsAudio as a property. * Creates an #AgsCropNote task. Note either @in_place or @do_resize shall * be %TRUE else it won't have any effect. * * Returns: a new #AgsCropNote * * Since: 3.0.0 */ AgsCropNote* ags_crop_note_new(AgsAudio *audio, AgsNotation *notation, GList *selection, guint x_padding, gint x_crop, gboolean absolute, gboolean in_place, gboolean do_resize) { AgsCropNote *crop_note; crop_note = (AgsCropNote *) g_object_new(AGS_TYPE_CROP_NOTE, "audio", audio, "notation", notation, "x-padding", x_padding, "x-crop", x_crop, "absolute", absolute, "in-place", in_place, "do-resize", do_resize, NULL); //FIXME:JK: argh, introspection! crop_note->selection = g_list_copy_deep(selection, (GCopyFunc) g_object_ref, NULL); return(crop_note); } gsequencer-3.1.3/ags/audio/task/ags_set_audio_channels.c0000644000175000017500000001742613607210263020254 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_set_audio_channels_class_init(AgsSetAudioChannelsClass *set_audio_channels); void ags_set_audio_channels_init(AgsSetAudioChannels *set_audio_channels); void ags_set_audio_channels_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_set_audio_channels_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_set_audio_channels_dispose(GObject *gobject); void ags_set_audio_channels_finalize(GObject *gobject); void ags_set_audio_channels_launch(AgsTask *task); /** * SECTION:ags_set_audio_channels * @short_description: resizes audio channels * @title: AgsSetAudioChannels * @section_id: * @include: ags/audio/task/ags_set_audio_channels.h * * The #AgsSetAudioChannels task resizes audio channels of #AgsSoundcard. */ static gpointer ags_set_audio_channels_parent_class = NULL; enum{ PROP_0, PROP_SOUNDCARD, PROP_AUDIO_CHANNELS, }; GType ags_set_audio_channels_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_set_audio_channels = 0; static const GTypeInfo ags_set_audio_channels_info = { sizeof(AgsSetAudioChannelsClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_set_audio_channels_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSetAudioChannels), 0, /* n_preallocs */ (GInstanceInitFunc) ags_set_audio_channels_init, }; ags_type_set_audio_channels = g_type_register_static(AGS_TYPE_TASK, "AgsSetAudioChannels", &ags_set_audio_channels_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_set_audio_channels); } return g_define_type_id__volatile; } void ags_set_audio_channels_class_init(AgsSetAudioChannelsClass *set_audio_channels) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_set_audio_channels_parent_class = g_type_class_peek_parent(set_audio_channels); /* gobject */ gobject = (GObjectClass *) set_audio_channels; gobject->set_property = ags_set_audio_channels_set_property; gobject->get_property = ags_set_audio_channels_get_property; gobject->dispose = ags_set_audio_channels_dispose; gobject->finalize = ags_set_audio_channels_finalize; /* properties */ /** * AgsSetAudioChannels:soundcard: * * The assigned #AgsSoundcard instance. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of set audio channels"), i18n_pspec("The soundcard of set audio channels"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsSetAudioChannels:audio-channels: * * The count of audio channels to apply to soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channels", i18n_pspec("audio channels"), i18n_pspec("The count of audio channels"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNELS, param_spec); /* task */ task = (AgsTaskClass *) set_audio_channels; task->launch = ags_set_audio_channels_launch; } void ags_set_audio_channels_init(AgsSetAudioChannels *set_audio_channels) { set_audio_channels->soundcard = NULL; set_audio_channels->audio_channels = 0; } void ags_set_audio_channels_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSetAudioChannels *set_audio_channels; set_audio_channels = AGS_SET_AUDIO_CHANNELS(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); if(set_audio_channels->soundcard == (GObject *) soundcard){ return; } if(set_audio_channels->soundcard != NULL){ g_object_unref(set_audio_channels->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } set_audio_channels->soundcard = (GObject *) soundcard; } break; case PROP_AUDIO_CHANNELS: { set_audio_channels->audio_channels = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_audio_channels_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSetAudioChannels *set_audio_channels; set_audio_channels = AGS_SET_AUDIO_CHANNELS(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, set_audio_channels->soundcard); } break; case PROP_AUDIO_CHANNELS: { g_value_set_uint(value, set_audio_channels->audio_channels); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_audio_channels_dispose(GObject *gobject) { AgsSetAudioChannels *set_audio_channels; set_audio_channels = AGS_SET_AUDIO_CHANNELS(gobject); if(set_audio_channels->soundcard != NULL){ g_object_unref(set_audio_channels->soundcard); set_audio_channels->soundcard = NULL; } /* call parent */ G_OBJECT_CLASS(ags_set_audio_channels_parent_class)->dispose(gobject); } void ags_set_audio_channels_finalize(GObject *gobject) { AgsSetAudioChannels *set_audio_channels; set_audio_channels = AGS_SET_AUDIO_CHANNELS(gobject); if(set_audio_channels->soundcard != NULL){ g_object_unref(set_audio_channels->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_set_audio_channels_parent_class)->finalize(gobject); } void ags_set_audio_channels_launch(AgsTask *task) { AgsSetAudioChannels *set_audio_channels; guint channels; guint samplerate; guint buffer_size; guint format; set_audio_channels = AGS_SET_AUDIO_CHANNELS(task); g_return_if_fail(AGS_IS_SOUNDCARD(set_audio_channels->soundcard)); /* set audio channels */ ags_soundcard_get_presets(AGS_SOUNDCARD(set_audio_channels->soundcard), &channels, &samplerate, &buffer_size, &format); ags_soundcard_set_presets(AGS_SOUNDCARD(set_audio_channels->soundcard), set_audio_channels->audio_channels, samplerate, buffer_size, format); } /** * ags_set_audio_channels_new: * @soundcard: the #AgsSoundcard to reset * @audio_channels: the new count of audio channels * * Create a new instance of #AgsSetAudioChannels. * * Returns: the new #AgsSetAudioChannels. * * Since: 3.0.0 */ AgsSetAudioChannels* ags_set_audio_channels_new(GObject *soundcard, guint audio_channels) { AgsSetAudioChannels *set_audio_channels; set_audio_channels = (AgsSetAudioChannels *) g_object_new(AGS_TYPE_SET_AUDIO_CHANNELS, "soundcard", soundcard, "audio-channels", audio_channels, NULL); return(set_audio_channels); } gsequencer-3.1.3/ags/audio/task/ags_reset_peak.c0000644000175000017500000001515613607210263016545 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_reset_peak_class_init(AgsResetPeakClass *reset_peak); void ags_reset_peak_init(AgsResetPeak *reset_peak); void ags_reset_peak_connect(AgsConnectable *connectable); void ags_reset_peak_dispose(GObject *gobject); void ags_reset_peak_finalize(GObject *gobject); void ags_reset_peak_launch(AgsTask *task); /** * SECTION:ags_reset_peak * @short_description: reset peak internal * @title: AgsResetPeak * @section_id: * @include: ags/audio/task/ags_reset_peak.h * * The #AgsResetPeak task resets peak to recompute the peak during next run. */ static gpointer ags_reset_peak_parent_class = NULL; AgsResetPeak *ags_reset_peak = NULL; GType ags_reset_peak_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_reset_peak = 0; static const GTypeInfo ags_reset_peak_info = { sizeof(AgsResetPeakClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_reset_peak_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsResetPeak), 0, /* n_preallocs */ (GInstanceInitFunc) ags_reset_peak_init, }; ags_type_reset_peak = g_type_register_static(AGS_TYPE_TASK, "AgsResetPeak", &ags_reset_peak_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_reset_peak); } return g_define_type_id__volatile; } void ags_reset_peak_class_init(AgsResetPeakClass *reset_peak) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_reset_peak_parent_class = g_type_class_peek_parent(reset_peak); /* GObjectClass */ gobject = (GObjectClass *) reset_peak; gobject->dispose = ags_reset_peak_dispose; gobject->finalize = ags_reset_peak_finalize; /* AgsTaskClass */ task = (AgsTaskClass *) reset_peak; task->launch = ags_reset_peak_launch; } void ags_reset_peak_init(AgsResetPeak *reset_peak) { AGS_TASK(reset_peak)->flags |= AGS_TASK_CYCLIC; reset_peak->peak_channel = NULL; } void ags_reset_peak_dispose(GObject *gobject) { AgsResetPeak *reset_peak; reset_peak = AGS_RESET_PEAK(gobject); if(reset_peak->peak_channel != NULL){ g_list_free_full(reset_peak->peak_channel, g_object_unref); reset_peak->peak_channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_reset_peak_parent_class)->dispose(gobject); } void ags_reset_peak_finalize(GObject *gobject) { AgsResetPeak *reset_peak; reset_peak = AGS_RESET_PEAK(gobject); if(reset_peak->peak_channel != NULL){ g_list_free_full(reset_peak->peak_channel, g_object_unref); } if(reset_peak == ags_reset_peak){ ags_reset_peak = NULL; } /* call parent */ G_OBJECT_CLASS(ags_reset_peak_parent_class)->finalize(gobject); } void ags_reset_peak_launch(AgsTask *task) { AgsResetPeak *reset_peak; GList *peak_channel; GValue value = {0,}; GRecMutex *task_mutex; reset_peak = AGS_RESET_PEAK(task); task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_peak); g_rec_mutex_lock(task_mutex); peak_channel = reset_peak->peak_channel; g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, FALSE); while(peak_channel != NULL){ ags_port_safe_write(AGS_PEAK_CHANNEL(peak_channel->data)->buffer_computed, &value); peak_channel = peak_channel->next; } g_rec_mutex_unlock(task_mutex); g_value_unset(&value); } /** * ags_reset_peak_add: * @reset_peak: the #AgsResetPeak * @peak_channel: the #AgsPeakChannel * * Add @peak_channel. * * Since: 3.0.0 */ void ags_reset_peak_add(AgsResetPeak *reset_peak, AgsPeakChannel *peak_channel) { GRecMutex *task_mutex; if(!AGS_IS_RESET_PEAK(reset_peak) || !AGS_IS_PEAK_CHANNEL(peak_channel)){ return; } task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_peak); g_rec_mutex_lock(task_mutex); reset_peak->peak_channel = g_list_prepend(reset_peak->peak_channel, peak_channel); g_object_ref(peak_channel); g_rec_mutex_unlock(task_mutex); } /** * ags_reset_peak_remove: * @reset_peak: the #AgsResetPeak * @peak_channel: the #AgsPeakChannel * * Remove @peak_channel. * * Since: 3.0.0 */ void ags_reset_peak_remove(AgsResetPeak *reset_peak, AgsPeakChannel *peak_channel) { GRecMutex *task_mutex; if(!AGS_IS_RESET_PEAK(reset_peak) || !AGS_IS_PEAK_CHANNEL(peak_channel)){ return; } task_mutex = AGS_TASK_GET_OBJ_MUTEX(reset_peak); g_rec_mutex_lock(task_mutex); if(g_list_find(reset_peak->peak_channel, peak_channel) != NULL){ reset_peak->peak_channel = g_list_remove(reset_peak->peak_channel, peak_channel); g_object_unref(peak_channel); } g_rec_mutex_unlock(task_mutex); } /** * ags_reset_peak_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsResetPeak * * Since: 3.0.0 */ AgsResetPeak* ags_reset_peak_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_reset_peak == NULL){ AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; ags_reset_peak = ags_reset_peak_new(); g_mutex_unlock(&mutex); /* add cyclic task */ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); ags_task_launcher_add_cyclic_task(task_launcher, (AgsTask *) ags_reset_peak); /* unref */ g_object_unref(task_launcher); }else{ g_mutex_unlock(&mutex); } return(ags_reset_peak); } /** * ags_reset_peak_new: * * Creates an #AgsResetPeak. * * Returns: an new #AgsResetPeak. * * Since: 3.0.0 */ AgsResetPeak* ags_reset_peak_new() { AgsResetPeak *reset_peak; reset_peak = (AgsResetPeak *) g_object_new(AGS_TYPE_RESET_PEAK, NULL); return(reset_peak); } gsequencer-3.1.3/ags/audio/task/ags_reset_note.h0000644000175000017500000000407313607210263016573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RESET_NOTE_H__ #define __AGS_RESET_NOTE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RESET_NOTE (ags_reset_note_get_type()) #define AGS_RESET_NOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RESET_NOTE, AgsResetNote)) #define AGS_RESET_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RESET_NOTE, AgsResetNoteClass)) #define AGS_IS_RESET_NOTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RESET_NOTE)) #define AGS_IS_RESET_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RESET_NOTE)) #define AGS_RESET_NOTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RESET_NOTE, AgsResetNoteClass)) typedef struct _AgsResetNote AgsResetNote; typedef struct _AgsResetNoteClass AgsResetNoteClass; struct _AgsResetNote { AgsTask task; guint note_offset; GList *note; }; struct _AgsResetNoteClass { AgsTaskClass task; }; GType ags_reset_note_get_type(); void ags_reset_note_add(AgsResetNote *reset_note, AgsNote *note); void ags_reset_note_remove(AgsResetNote *reset_note, AgsNote *note); AgsResetNote* ags_reset_note_get_instance(); AgsResetNote* ags_reset_note_new(); G_END_DECLS #endif /*__AGS_RESET_NOTE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_tic_device.h0000644000175000017500000000352613607210263016524 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TIC_DEVICE_H__ #define __AGS_TIC_DEVICE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TIC_DEVICE (ags_tic_device_get_type()) #define AGS_TIC_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TIC_DEVICE, AgsTicDevice)) #define AGS_TIC_DEVICE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TIC_DEVICE, AgsTicDeviceClass)) #define AGS_IS_TIC_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_TIC_DEVICE)) #define AGS_IS_TIC_DEVICE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_TIC_DEVICE)) #define AGS_TIC_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_TIC_DEVICE, AgsTicDeviceClass)) typedef struct _AgsTicDevice AgsTicDevice; typedef struct _AgsTicDeviceClass AgsTicDeviceClass; struct _AgsTicDevice { AgsTask task; GObject *device; }; struct _AgsTicDeviceClass { AgsTaskClass task; }; GType ags_tic_device_get_type(); AgsTicDevice* ags_tic_device_new(GObject *device); G_END_DECLS #endif /*__AGS_TIC_DEVICE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_apply_sequencer_length.h0000644000175000017500000000427013607210263021163 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLY_SEQUENCER_LENGTH_H__ #define __AGS_APPLY_SEQUENCER_LENGTH_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLY_SEQUENCER_LENGTH (ags_apply_sequencer_length_get_type()) #define AGS_APPLY_SEQUENCER_LENGTH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLY_SEQUENCER_LENGTH, AgsApplySequencerLength)) #define AGS_APPLY_SEQUENCER_LENGTH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_APPLY_SEQUENCER_LENGTH, AgsApplySequencerLengthClass)) #define AGS_IS_APPLY_SEQUENCER_LENGTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLY_SEQUENCER_LENGTH)) #define AGS_IS_APPLY_SEQUENCER_LENGTH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_APPLY_SEQUENCER_LENGTH)) #define AGS_APPLY_SEQUENCER_LENGTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_APPLY_SEQUENCER_LENGTH, AgsApplySequencerLengthClass)) typedef struct _AgsApplySequencerLength AgsApplySequencerLength; typedef struct _AgsApplySequencerLengthClass AgsApplySequencerLengthClass; struct _AgsApplySequencerLength { AgsTask task; GObject *scope; gdouble length; }; struct _AgsApplySequencerLengthClass { AgsTaskClass task; }; GType ags_apply_sequencer_length_get_type(); AgsApplySequencerLength* ags_apply_sequencer_length_new(GObject *scope, gdouble length); G_END_DECLS #endif /*__AGS_APPLY_SEQUENCER_LENGTH_H__*/ gsequencer-3.1.3/ags/audio/task/ags_set_format.c0000644000175000017500000002051013607210263016554 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_set_format_class_init(AgsSetFormatClass *set_format); void ags_set_format_init(AgsSetFormat *set_format); void ags_set_format_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_set_format_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_set_format_dispose(GObject *gobject); void ags_set_format_finalize(GObject *gobject); void ags_set_format_launch(AgsTask *task); void ags_set_format_audio_signal(AgsSetFormat *set_format, AgsAudioSignal *audio_signal); void ags_set_format_recycling(AgsSetFormat *set_format, AgsRecycling *recycling); void ags_set_format_channel(AgsSetFormat *set_format, AgsChannel *channel); void ags_set_format_audio(AgsSetFormat *set_format, AgsAudio *audio); void ags_set_format_soundcard(AgsSetFormat *set_format, GObject *soundcard); /** * SECTION:ags_set_format * @short_description: reset format * @title: AgsSetFormat * @section_id: * @include: ags/audio/task/ags_set_format.h * * The #AgsSetFormat task resets format of scope. */ static gpointer ags_set_format_parent_class = NULL; enum{ PROP_0, PROP_SCOPE, PROP_FORMAT, }; GType ags_set_format_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_set_format = 0; static const GTypeInfo ags_set_format_info = { sizeof(AgsSetFormatClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_set_format_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSetFormat), 0, /* n_preallocs */ (GInstanceInitFunc) ags_set_format_init, }; ags_type_set_format = g_type_register_static(AGS_TYPE_TASK, "AgsSetFormat", &ags_set_format_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_set_format); } return g_define_type_id__volatile; } void ags_set_format_class_init(AgsSetFormatClass *set_format) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_set_format_parent_class = g_type_class_peek_parent(set_format); /* gobject */ gobject = (GObjectClass *) set_format; gobject->set_property = ags_set_format_set_property; gobject->get_property = ags_set_format_get_property; gobject->dispose = ags_set_format_dispose; gobject->finalize = ags_set_format_finalize; /* properties */ /** * AgsSetFormat:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set format"), i18n_pspec("The scope of set format"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsSetFormat:format: * * The format to apply to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format to apply"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /* task */ task = (AgsTaskClass *) set_format; task->launch = ags_set_format_launch; } void ags_set_format_init(AgsSetFormat *set_format) { set_format->scope = NULL; set_format->format = 16; } void ags_set_format_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSetFormat *set_format; set_format = AGS_SET_FORMAT(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(set_format->scope == (GObject *) scope){ return; } if(set_format->scope != NULL){ g_object_unref(set_format->scope); } if(scope != NULL){ g_object_ref(scope); } set_format->scope = (GObject *) scope; } break; case PROP_FORMAT: { set_format->format = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_format_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSetFormat *set_format; set_format = AGS_SET_FORMAT(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, set_format->scope); } break; case PROP_FORMAT: { g_value_set_uint(value, set_format->format); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_format_dispose(GObject *gobject) { AgsSetFormat *set_format; set_format = AGS_SET_FORMAT(gobject); if(set_format->scope != NULL){ g_object_unref(set_format->scope); set_format->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_set_format_parent_class)->dispose(gobject); } void ags_set_format_finalize(GObject *gobject) { AgsSetFormat *set_format; set_format = AGS_SET_FORMAT(gobject); if(set_format->scope != NULL){ g_object_unref(set_format->scope); } /* call parent */ G_OBJECT_CLASS(ags_set_format_parent_class)->finalize(gobject); } void ags_set_format_launch(AgsTask *task) { AgsSetFormat *set_format; GObject *scope; set_format = AGS_SET_FORMAT(task); scope = set_format->scope; if(AGS_IS_SOUNDCARD(scope)){ ags_set_format_soundcard(set_format, scope); }else if(AGS_IS_AUDIO(scope)){ ags_set_format_audio(set_format, AGS_AUDIO(scope)); }else if(AGS_IS_CHANNEL(scope)){ ags_set_format_channel(set_format, AGS_CHANNEL(scope)); }else if(AGS_IS_RECYCLING(scope)){ ags_set_format_recycling(set_format, AGS_RECYCLING(scope)); }else if(AGS_IS_AUDIO_SIGNAL(scope)){ ags_set_format_audio_signal(set_format, AGS_AUDIO_SIGNAL(scope)); } } void ags_set_format_audio_signal(AgsSetFormat *set_format, AgsAudioSignal *audio_signal) { g_object_set(audio_signal, "format", set_format->format, NULL); } void ags_set_format_recycling(AgsSetFormat *set_format, AgsRecycling *recycling) { g_object_set(recycling, "format", set_format->format, NULL); } void ags_set_format_channel(AgsSetFormat *set_format, AgsChannel *channel) { g_object_set(channel, "format", set_format->format, NULL); } void ags_set_format_audio(AgsSetFormat *set_format, AgsAudio *audio) { g_object_set(audio, "format", set_format->format, NULL); } void ags_set_format_soundcard(AgsSetFormat *set_format, GObject *soundcard) { guint channels; guint samplerate; guint buffer_size; guint format; /* apply format */ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), &channels, &samplerate, &buffer_size, &format); ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), channels, samplerate, buffer_size, set_format->format); } /** * ags_set_format_new: * @scope: the #GObject to reset * @format: the new format * * Create a new instance of #AgsSetFormat. * * Returns: the new #AgsSetFormat * * Since: 3.0.0 */ AgsSetFormat* ags_set_format_new(GObject *scope, guint format) { AgsSetFormat *set_format; set_format = (AgsSetFormat *) g_object_new(AGS_TYPE_SET_FORMAT, "scope", scope, "format", format, NULL); return(set_format); } gsequencer-3.1.3/ags/audio/task/ags_set_muted.c0000644000175000017500000002257713607210263016421 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_set_muted_class_init(AgsSetMutedClass *set_muted); void ags_set_muted_init(AgsSetMuted *set_muted); void ags_set_muted_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_set_muted_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_set_muted_dispose(GObject *gobject); void ags_set_muted_finalize(GObject *gobject); void ags_set_muted_launch(AgsTask *task); void ags_set_muted_recall(AgsSetMuted *set_muted, AgsRecall *recall); void ags_set_muted_channel(AgsSetMuted *set_muted, AgsChannel *channel); void ags_set_muted_audio(AgsSetMuted *set_muted, AgsAudio *audio); /** * SECTION:ags_set_muted * @short_description: set muted * @title: AgsSetMuted * @section_id: * @include: ags/audio/task/recall/ags_set_muted.h * * The #AgsSetMuted task sets muted to #AgsMutable. */ enum{ PROP_0, PROP_SCOPE, PROP_MUTED, }; static gpointer ags_set_muted_parent_class = NULL; static AgsConnectableInterface *ags_set_muted_parent_connectable_interface; GType ags_set_muted_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_set_muted = 0; static const GTypeInfo ags_set_muted_info = { sizeof(AgsSetMutedClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_set_muted_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSetMuted), 0, /* n_preallocs */ (GInstanceInitFunc) ags_set_muted_init, }; ags_type_set_muted = g_type_register_static(AGS_TYPE_TASK, "AgsSetMuted", &ags_set_muted_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_set_muted); } return g_define_type_id__volatile; } void ags_set_muted_class_init(AgsSetMutedClass *set_muted) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_set_muted_parent_class = g_type_class_peek_parent(set_muted); /* GObjectClass */ gobject = (GObjectClass *) set_muted; gobject->set_property = ags_set_muted_set_property; gobject->get_property = ags_set_muted_get_property; gobject->dispose = ags_set_muted_dispose; gobject->finalize = ags_set_muted_finalize; /* properties */ /** * AgsSetMuted:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set buffer size"), i18n_pspec("The scope of set buffer size"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsSetMuted:muted: * * The muted to set to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("muted", i18n_pspec("muted"), i18n_pspec("The muted to set"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MUTED, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) set_muted; task->launch = ags_set_muted_launch; } void ags_set_muted_init(AgsSetMuted *set_muted) { set_muted->scope = NULL; set_muted->muted = FALSE; } void ags_set_muted_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSetMuted *set_muted; set_muted = AGS_SET_MUTED(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(set_muted->scope == (GObject *) scope){ return; } if(set_muted->scope != NULL){ g_object_unref(set_muted->scope); } if(scope != NULL){ g_object_ref(scope); } set_muted->scope = (GObject *) scope; } break; case PROP_MUTED: { set_muted->muted = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_muted_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSetMuted *set_muted; set_muted = AGS_SET_MUTED(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, set_muted->scope); } break; case PROP_MUTED: { g_value_set_boolean(value, set_muted->muted); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_muted_dispose(GObject *gobject) { AgsSetMuted *set_muted; set_muted = AGS_SET_MUTED(gobject); if(set_muted->scope != NULL){ g_object_unref(set_muted->scope); set_muted->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_set_muted_parent_class)->dispose(gobject); } void ags_set_muted_finalize(GObject *gobject) { AgsSetMuted *set_muted; set_muted = AGS_SET_MUTED(gobject); if(set_muted->scope != NULL){ g_object_unref(set_muted->scope); } /* call parent */ G_OBJECT_CLASS(ags_set_muted_parent_class)->finalize(gobject); } void ags_set_muted_launch(AgsTask *task) { AgsSetMuted *set_muted; set_muted = AGS_SET_MUTED(task); if(AGS_IS_AUDIO(set_muted->scope)){ AgsAudio *audio; audio = AGS_AUDIO(set_muted->scope); ags_set_muted_audio(set_muted, audio); }else if(AGS_IS_CHANNEL(set_muted->scope)){ AgsChannel *channel; channel = AGS_CHANNEL(set_muted->scope); ags_set_muted_channel(set_muted, channel); }else if(AGS_IS_RECALL(set_muted->scope)){ AgsRecall *recall; recall = AGS_RECALL(set_muted->scope); ags_set_muted_recall(set_muted, recall); }else{ g_warning("AgsSetMuted: Not supported scope"); } } void ags_set_muted_recall(AgsSetMuted *set_muted, AgsRecall *recall) { if(AGS_IS_MUTABLE(recall)){ ags_mutable_set_muted(AGS_MUTABLE(recall), set_muted->muted); } } void ags_set_muted_channel(AgsSetMuted *set_muted, AgsChannel *channel) { GList *list_start, *list; /* set muted - play */ g_object_get(channel, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_set_muted_recall(set_muted, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* set muted - recall */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_set_muted_recall(set_muted, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); } void ags_set_muted_audio(AgsSetMuted *set_muted, AgsAudio *audio) { AgsChannel *input, *output; AgsChannel *channel, *next_channel; GList *list_start, *list; /* get some fields */ g_object_get(audio, "output", &output, "input", &input, NULL); /* set muted - play */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_set_muted_recall(set_muted, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* set muted - recall */ g_object_get(audio, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_set_muted_recall(set_muted, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* AgsChannel - output */ if(output != NULL){ channel = output; g_object_ref(channel); while(channel != NULL){ /* set muted */ ags_set_muted_channel(set_muted, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } /* AgsChannel - input */ if(input != NULL){ channel = input; g_object_ref(channel); while(channel != NULL){ /* set muted */ ags_set_muted_channel(set_muted, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } } /** * ags_set_muted_new: * @scope: the #GObject * @muted: muted to set * * Creates an #AgsSetMuted. * * Returns: an new #AgsSetMuted. * * Since: 3.0.0 */ AgsSetMuted* ags_set_muted_new(GObject *scope, gboolean muted) { AgsSetMuted *set_muted; set_muted = (AgsSetMuted *) g_object_new(AGS_TYPE_SET_MUTED, "scope", scope, "muted", muted, NULL); return(set_muted); } gsequencer-3.1.3/ags/audio/task/ags_add_soundcard.c0000644000175000017500000001530713607210263017213 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_add_soundcard_class_init(AgsAddSoundcardClass *add_soundcard); void ags_add_soundcard_init(AgsAddSoundcard *add_soundcard); void ags_add_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_add_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_add_soundcard_dispose(GObject *gobject); void ags_add_soundcard_finalize(GObject *gobject); void ags_add_soundcard_launch(AgsTask *task); enum{ PROP_0, PROP_SOUNDCARD, }; /** * SECTION:ags_add_soundcard * @short_description: add soundcard object to context * @title: AgsAddSoundcard * @section_id: * @include: ags/audio/task/ags_add_soundcard.h * * The #AgsAddSoundcard task adds #AgsSoundcard to context. */ static gpointer ags_add_soundcard_parent_class = NULL; GType ags_add_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_add_soundcard = 0; static const GTypeInfo ags_add_soundcard_info = { sizeof(AgsAddSoundcardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_add_soundcard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAddSoundcard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_add_soundcard_init, }; ags_type_add_soundcard = g_type_register_static(AGS_TYPE_TASK, "AgsAddSoundcard", &ags_add_soundcard_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_add_soundcard); } return g_define_type_id__volatile; } void ags_add_soundcard_class_init(AgsAddSoundcardClass *add_soundcard) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_add_soundcard_parent_class = g_type_class_peek_parent(add_soundcard); /* gobject */ gobject = (GObjectClass *) add_soundcard; gobject->set_property = ags_add_soundcard_set_property; gobject->get_property = ags_add_soundcard_get_property; gobject->dispose = ags_add_soundcard_dispose; gobject->finalize = ags_add_soundcard_finalize; /** * AgsAddSoundcard:soundcard: * * The assigned #AgsSoundcard * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of add soundcard"), i18n_pspec("The soundcard of add soundcard task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /* task */ task = (AgsTaskClass *) add_soundcard; task->launch = ags_add_soundcard_launch; } void ags_add_soundcard_init(AgsAddSoundcard *add_soundcard) { add_soundcard->soundcard = NULL; } void ags_add_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAddSoundcard *add_soundcard; add_soundcard = AGS_ADD_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); if(add_soundcard->soundcard == (GObject *) soundcard){ return; } if(add_soundcard->soundcard != NULL){ g_object_unref(add_soundcard->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } add_soundcard->soundcard = (GObject *) soundcard; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAddSoundcard *add_soundcard; add_soundcard = AGS_ADD_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, add_soundcard->soundcard); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_soundcard_dispose(GObject *gobject) { AgsAddSoundcard *add_soundcard; add_soundcard = AGS_ADD_SOUNDCARD(gobject); if(add_soundcard->soundcard != NULL){ g_object_unref(add_soundcard->soundcard); add_soundcard->soundcard = NULL; } /* call parent */ G_OBJECT_CLASS(ags_add_soundcard_parent_class)->dispose(gobject); } void ags_add_soundcard_finalize(GObject *gobject) { AgsAddSoundcard *add_soundcard; add_soundcard = AGS_ADD_SOUNDCARD(gobject); if(add_soundcard->soundcard != NULL){ g_object_unref(add_soundcard->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_add_soundcard_parent_class)->finalize(gobject); } void ags_add_soundcard_launch(AgsTask *task) { AgsAddSoundcard *add_soundcard; AgsApplicationContext *application_context; GList *list_start; add_soundcard = AGS_ADD_SOUNDCARD(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_SOUND_PROVIDER(application_context)); g_return_if_fail(AGS_IS_SOUNDCARD(add_soundcard->soundcard)); /* add soundcard */ list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(g_list_find(list_start, add_soundcard->soundcard) == NULL){ g_object_ref(add_soundcard->soundcard); ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_append(list_start, add_soundcard->soundcard)); } g_list_free_full(list_start, g_object_unref); } /** * ags_add_soundcard_new: * @soundcard: the #AgsSoundcard to add * * Create a new instance of #AgsAddSoundcard. * * Returns: the new #AgsAddSoundcard. * * Since: 3.0.0 */ AgsAddSoundcard* ags_add_soundcard_new(GObject *soundcard) { AgsAddSoundcard *add_soundcard; add_soundcard = (AgsAddSoundcard *) g_object_new(AGS_TYPE_ADD_SOUNDCARD, "soundcard", soundcard, NULL); return(add_soundcard); } gsequencer-3.1.3/ags/audio/task/ags_open_file.c0000644000175000017500000002126313613101164016353 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_open_file_class_init(AgsOpenFileClass *open_file); void ags_open_file_init(AgsOpenFile *open_file); void ags_open_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_open_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_open_file_dispose(GObject *gobject); void ags_open_file_finalize(GObject *gobject); void ags_open_file_launch(AgsTask *task); /** * SECTION:ags_open_file * @short_description: open file task * @title: AgsOpenFile * @section_id: * @include: ags/audio/task/ags_open_file.h * * The #AgsOpenFile task opens files. */ static gpointer ags_open_file_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_FILENAME, PROP_OVERWRITE_CHANNELS, PROP_CREATE_CHANNELS, }; GType ags_open_file_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_open_file = 0; static const GTypeInfo ags_open_file_info = { sizeof(AgsOpenFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_open_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsOpenFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_open_file_init, }; ags_type_open_file = g_type_register_static(AGS_TYPE_TASK, "AgsOpenFile", &ags_open_file_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_open_file); } return g_define_type_id__volatile; } void ags_open_file_class_init(AgsOpenFileClass *open_file) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_open_file_parent_class = g_type_class_peek_parent(open_file); /* GObject */ gobject = (GObjectClass *) open_file; gobject->set_property = ags_open_file_set_property; gobject->get_property = ags_open_file_get_property; gobject->dispose = ags_open_file_dispose; gobject->finalize = ags_open_file_finalize; /* properties */ /** * AgsOpenFile:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of open file"), i18n_pspec("The audio of open file task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsOpenFile:filename: (type GSList(utf8)) * * The assigned #GSList-struct providing filename as string * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("filename", i18n_pspec("filename of open file"), i18n_pspec("The filename of open file task"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsOpenFile:overwrite-channels: * * As open files overwrite #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("overwrite-channels", i18n_pspec("open file overwriting channels"), i18n_pspec("Do overwrite channels as open files"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OVERWRITE_CHANNELS, param_spec); /** * AgsOpenFile:create-channels: * * As open files create #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("create-channels", i18n_pspec("open file creating channels"), i18n_pspec("Do create channels as open files"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CREATE_CHANNELS, param_spec); /* AgsTask */ task = (AgsTaskClass *) open_file; task->launch = ags_open_file_launch; } void ags_open_file_init(AgsOpenFile *open_file) { open_file->audio = NULL; open_file->filename = NULL; open_file->overwrite_channels = FALSE; open_file->create_channels = FALSE; } void ags_open_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOpenFile *open_file; open_file = AGS_OPEN_FILE(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(open_file->audio == audio){ return; } if(open_file->audio != NULL){ g_object_unref(open_file->audio); } if(audio != NULL){ g_object_ref(audio); } open_file->audio = audio; } break; case PROP_FILENAME: { GSList *filename; filename = g_value_get_pointer(value); if(open_file->filename == filename){ return; } if(open_file->filename != NULL){ g_slist_free(open_file->filename); } open_file->filename = g_slist_copy(filename); } break; case PROP_OVERWRITE_CHANNELS: { open_file->overwrite_channels = g_value_get_boolean(value); } break; case PROP_CREATE_CHANNELS: { open_file->create_channels = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOpenFile *open_file; open_file = AGS_OPEN_FILE(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, open_file->audio); } break; case PROP_FILENAME: { g_value_set_pointer(value, g_slist_copy(open_file->filename)); } break; case PROP_OVERWRITE_CHANNELS: { g_value_set_boolean(value, open_file->overwrite_channels); } break; case PROP_CREATE_CHANNELS: { g_value_set_boolean(value, open_file->create_channels); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_file_dispose(GObject *gobject) { AgsOpenFile *open_file; open_file = AGS_OPEN_FILE(gobject); if(open_file->audio != NULL){ g_object_unref(open_file->audio); open_file->audio = NULL; } if(open_file->filename != NULL){ g_slist_free(open_file->filename); open_file->filename = NULL; } /* call parent */ G_OBJECT_CLASS(ags_open_file_parent_class)->dispose(gobject); } void ags_open_file_finalize(GObject *gobject) { AgsOpenFile *open_file; open_file = AGS_OPEN_FILE(gobject); if(open_file->audio != NULL){ g_object_unref(open_file->audio); } if(open_file->filename != NULL){ g_slist_free(open_file->filename); } /* call parent */ G_OBJECT_CLASS(ags_open_file_parent_class)->finalize(gobject); } void ags_open_file_launch(AgsTask *task) { AgsOpenFile *open_file; open_file = AGS_OPEN_FILE(task); ags_audio_open_audio_file_as_channel(open_file->audio, open_file->filename, open_file->overwrite_channels, open_file->create_channels); } /** * ags_open_file_new: * @audio: the #AgsAudio * @filename: (element-type utf8): the filename to be opened * @overwrite_channels: reset existing #AgsInput * @create_channels: instantiate new #AgsInput * * Create a new instance of #AgsOpenFile. * * Returns: the new #AgsOpenFile. * * Since: 3.0.0 */ AgsOpenFile* ags_open_file_new(AgsAudio *audio, GSList *filename, gboolean overwrite_channels, gboolean create_channels) { AgsOpenFile *open_file; open_file = (AgsOpenFile *) g_object_new(AGS_TYPE_OPEN_FILE, "audio", audio, "filename", filename, "overwrite-channels", overwrite_channels, "create-channels", create_channels, NULL); return(open_file); } gsequencer-3.1.3/ags/audio/task/ags_clear_buffer.c0000644000175000017500000004553713607210263017050 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_clear_buffer_class_init(AgsClearBufferClass *clear_buffer); void ags_clear_buffer_init(AgsClearBuffer *clear_buffer); void ags_clear_buffer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_clear_buffer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_clear_buffer_dispose(GObject *gobject); void ags_clear_buffer_finalize(GObject *gobject); void ags_clear_buffer_launch(AgsTask *task); /** * SECTION:ags_clear_buffer * @short_description: switch buffer flag of device * @title: AgsClearBuffer * @section_id: * @include: ags/audio/task/ags_clear_buffer.h * * The #AgsClearBuffer task switches the buffer flag of device. */ static gpointer ags_clear_buffer_parent_class = NULL; enum{ PROP_0, PROP_DEVICE, }; GType ags_clear_buffer_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_clear_buffer = 0; static const GTypeInfo ags_clear_buffer_info = { sizeof(AgsClearBufferClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_clear_buffer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsClearBuffer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_clear_buffer_init, }; ags_type_clear_buffer = g_type_register_static(AGS_TYPE_TASK, "AgsClearBuffer", &ags_clear_buffer_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_clear_buffer); } return g_define_type_id__volatile; } void ags_clear_buffer_class_init(AgsClearBufferClass *clear_buffer) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_clear_buffer_parent_class = g_type_class_peek_parent(clear_buffer); /* gobject */ gobject = (GObjectClass *) clear_buffer; gobject->set_property = ags_clear_buffer_set_property; gobject->get_property = ags_clear_buffer_get_property; gobject->dispose = ags_clear_buffer_dispose; gobject->finalize = ags_clear_buffer_finalize; /* properties */ /** * AgsClearBuffer:device: * * The assigned #AgsSoundcard or #AgsSequencer * * Since: 3.0.0 */ param_spec = g_param_spec_object("device", i18n_pspec("device of change device"), i18n_pspec("The device of change device task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /* task */ task = (AgsTaskClass *) clear_buffer; task->launch = ags_clear_buffer_launch; } void ags_clear_buffer_init(AgsClearBuffer *clear_buffer) { clear_buffer->device = NULL; } void ags_clear_buffer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsClearBuffer *clear_buffer; clear_buffer = AGS_CLEAR_BUFFER(gobject); switch(prop_id){ case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_object(value); if(clear_buffer->device == (GObject *) device){ return; } if(clear_buffer->device != NULL){ g_object_unref(clear_buffer->device); } if(device != NULL){ g_object_ref(device); } clear_buffer->device = (GObject *) device; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_clear_buffer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsClearBuffer *clear_buffer; clear_buffer = AGS_CLEAR_BUFFER(gobject); switch(prop_id){ case PROP_DEVICE: { g_value_set_object(value, clear_buffer->device); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_clear_buffer_dispose(GObject *gobject) { AgsClearBuffer *clear_buffer; clear_buffer = AGS_CLEAR_BUFFER(gobject); if(clear_buffer->device != NULL){ g_object_unref(clear_buffer->device); clear_buffer->device = NULL; } /* call parent */ G_OBJECT_CLASS(ags_clear_buffer_parent_class)->dispose(gobject); } void ags_clear_buffer_finalize(GObject *gobject) { AgsClearBuffer *clear_buffer; clear_buffer = AGS_CLEAR_BUFFER(gobject); if(clear_buffer->device != NULL){ g_object_unref(clear_buffer->device); } /* call parent */ G_OBJECT_CLASS(ags_clear_buffer_parent_class)->finalize(gobject); } void ags_clear_buffer_launch(AgsTask *task) { AgsClearBuffer *clear_buffer; guint buffer_size; guint pcm_channels; guint format; guint nth_buffer; guint word_size; clear_buffer = AGS_CLEAR_BUFFER(task); g_return_if_fail(AGS_IS_SOUNDCARD(clear_buffer->device)); ags_soundcard_get_presets(AGS_SOUNDCARD(clear_buffer->device), &pcm_channels, NULL, &buffer_size, &format); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_warning("ags_clear_buffer_launch(): unsupported word size"); return; } nth_buffer = 0; if(AGS_IS_DEVOUT(clear_buffer->device)){ AgsDevout *devout; devout = (AgsDevout *) clear_buffer->device; /* retrieve nth buffer */ if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER0)){ nth_buffer = 0; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER1)){ nth_buffer = 1; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER2)){ nth_buffer = 2; }else if(ags_devout_test_flags(devout, AGS_DEVOUT_BUFFER3)){ nth_buffer = 3; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), devout->buffer[nth_buffer]); memset(devout->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), devout->buffer[nth_buffer]); }else if(AGS_IS_DEVIN(clear_buffer->device)){ AgsDevin *devin; devin = (AgsDevin *) clear_buffer->device; /* retrieve nth buffer */ if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER0)){ nth_buffer = 1; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER1)){ nth_buffer = 2; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER2)){ nth_buffer = 3; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER3)){ nth_buffer = 0; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), devin->buffer[nth_buffer]); memset(devin->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), devin->buffer[nth_buffer]); }else if(AGS_IS_JACK_DEVOUT(clear_buffer->device)){ AgsJackDevout *jack_devout; jack_devout = (AgsJackDevout *) clear_buffer->device; /* retrieve nth buffer */ if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER0)){ nth_buffer = 2; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER1)){ nth_buffer = 3; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER2)){ nth_buffer = 0; }else if(ags_jack_devout_test_flags(jack_devout, AGS_JACK_DEVOUT_BUFFER3)){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), jack_devout->buffer[nth_buffer]); memset(jack_devout->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), jack_devout->buffer[nth_buffer]); }else if(AGS_IS_JACK_DEVIN(clear_buffer->device)){ AgsJackDevin *jack_devin; jack_devin = (AgsJackDevin *) clear_buffer->device; /* retrieve nth buffer */ if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER0)){ nth_buffer = 2; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER1)){ nth_buffer = 3; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER2)){ nth_buffer = 0; }else if(ags_jack_devin_test_flags(jack_devin, AGS_JACK_DEVIN_BUFFER3)){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), jack_devin->buffer[nth_buffer]); memset(jack_devin->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), jack_devin->buffer[nth_buffer]); }else if(AGS_IS_PULSE_DEVOUT(clear_buffer->device)){ AgsPulseDevout *pulse_devout; pulse_devout = (AgsPulseDevout *) clear_buffer->device; /* retrieve nth buffer */ if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER0)){ nth_buffer = 2; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER1)){ nth_buffer = 3; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER2)){ nth_buffer = 4; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER3)){ nth_buffer = 5; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER4)){ nth_buffer = 6; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER5)){ nth_buffer = 7; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER6)){ nth_buffer = 0; }else if(ags_pulse_devout_test_flags(pulse_devout, AGS_PULSE_DEVOUT_BUFFER7)){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), pulse_devout->buffer[nth_buffer]); memset(pulse_devout->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), pulse_devout->buffer[nth_buffer]); }else if(AGS_IS_PULSE_DEVIN(clear_buffer->device)){ AgsPulseDevin *pulse_devin; pulse_devin = (AgsPulseDevin *) clear_buffer->device; /* retrieve nth buffer */ if((AGS_PULSE_DEVIN_BUFFER0 & (pulse_devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_PULSE_DEVIN_BUFFER1 & (pulse_devin->flags)) != 0){ nth_buffer = 3; }else if((AGS_PULSE_DEVIN_BUFFER2 & (pulse_devin->flags)) != 0){ nth_buffer = 4; }else if((AGS_PULSE_DEVIN_BUFFER3 & (pulse_devin->flags)) != 0){ nth_buffer = 5; }else if((AGS_PULSE_DEVIN_BUFFER4 & (pulse_devin->flags)) != 0){ nth_buffer = 6; }else if((AGS_PULSE_DEVIN_BUFFER5 & (pulse_devin->flags)) != 0){ nth_buffer = 7; }else if((AGS_PULSE_DEVIN_BUFFER6 & (pulse_devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_PULSE_DEVIN_BUFFER7 & (pulse_devin->flags)) != 0){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), pulse_devin->buffer[nth_buffer]); memset(pulse_devin->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), pulse_devin->buffer[nth_buffer]); }else if(AGS_IS_WASAPI_DEVOUT(clear_buffer->device)){ AgsWasapiDevout *wasapi_devout; wasapi_devout = (AgsWasapiDevout *) clear_buffer->device; /* retrieve nth buffer */ if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER0)){ nth_buffer = 2; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER1)){ nth_buffer = 3; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER2)){ nth_buffer = 4; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER3)){ nth_buffer = 5; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER4)){ nth_buffer = 6; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER5)){ nth_buffer = 7; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER6)){ nth_buffer = 0; }else if(ags_wasapi_devout_test_flags(wasapi_devout, AGS_WASAPI_DEVOUT_BUFFER7)){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), wasapi_devout->buffer[nth_buffer]); memset(wasapi_devout->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), wasapi_devout->buffer[nth_buffer]); }else if(AGS_IS_WASAPI_DEVIN(clear_buffer->device)){ AgsWasapiDevin *wasapi_devin; wasapi_devin = (AgsWasapiDevin *) clear_buffer->device; /* retrieve nth buffer */ if((AGS_WASAPI_DEVIN_BUFFER0 & (wasapi_devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_WASAPI_DEVIN_BUFFER1 & (wasapi_devin->flags)) != 0){ nth_buffer = 3; }else if((AGS_WASAPI_DEVIN_BUFFER2 & (wasapi_devin->flags)) != 0){ nth_buffer = 4; }else if((AGS_WASAPI_DEVIN_BUFFER3 & (wasapi_devin->flags)) != 0){ nth_buffer = 5; }else if((AGS_WASAPI_DEVIN_BUFFER4 & (wasapi_devin->flags)) != 0){ nth_buffer = 6; }else if((AGS_WASAPI_DEVIN_BUFFER5 & (wasapi_devin->flags)) != 0){ nth_buffer = 7; }else if((AGS_WASAPI_DEVIN_BUFFER6 & (wasapi_devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_WASAPI_DEVIN_BUFFER7 & (wasapi_devin->flags)) != 0){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), wasapi_devin->buffer[nth_buffer]); memset(wasapi_devin->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), wasapi_devin->buffer[nth_buffer]); }else if(AGS_IS_CORE_AUDIO_DEVOUT(clear_buffer->device)){ AgsCoreAudioDevout *core_audio_devout; core_audio_devout = (AgsCoreAudioDevout *) clear_buffer->device; /* retrieve nth buffer */ if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER0)){ nth_buffer = 2; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER1)){ nth_buffer = 3; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER2)){ nth_buffer = 4; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER3)){ nth_buffer = 5; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER4)){ nth_buffer = 6; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER5)){ nth_buffer = 7; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER6)){ nth_buffer = 0; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER7)){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), core_audio_devout->buffer[nth_buffer]); memset(core_audio_devout->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), core_audio_devout->buffer[nth_buffer]); }else if(AGS_IS_CORE_AUDIO_DEVIN(clear_buffer->device)){ AgsCoreAudioDevin *core_audio_devin; core_audio_devin = (AgsCoreAudioDevin *) clear_buffer->device; /* retrieve nth buffer */ if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER0)){ nth_buffer = 2; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER1)){ nth_buffer = 3; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER2)){ nth_buffer = 4; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER3)){ nth_buffer = 5; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER4)){ nth_buffer = 6; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER5)){ nth_buffer = 7; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER6)){ nth_buffer = 0; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER7)){ nth_buffer = 1; } ags_soundcard_lock_buffer(AGS_SOUNDCARD(clear_buffer->device), core_audio_devin->buffer[nth_buffer]); memset(core_audio_devin->buffer[nth_buffer], 0, (size_t) pcm_channels * buffer_size * word_size); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(clear_buffer->device), core_audio_devin->buffer[nth_buffer]); }else if(AGS_IS_MIDIIN(clear_buffer->device)){ //TODO:JK: implement me }else if(AGS_IS_JACK_MIDIIN(clear_buffer->device)){ //TODO:JK: implement me }else if(AGS_IS_CORE_AUDIO_MIDIIN(clear_buffer->device)){ //TODO:JK: implement me } } /** * ags_clear_buffer_new: * @device: the #AgsSoundcard or #AgsSequencer * * Create a new instance of #AgsClearBuffer. * * Returns: the new #AgsClearBuffer. * * Since: 3.0.0 */ AgsClearBuffer* ags_clear_buffer_new(GObject *device) { AgsClearBuffer *clear_buffer; clear_buffer = (AgsClearBuffer *) g_object_new(AGS_TYPE_CLEAR_BUFFER, "device", device, NULL); return(clear_buffer); } gsequencer-3.1.3/ags/audio/task/ags_add_note.c0000644000175000017500000002260313607210263016173 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_add_note_class_init(AgsAddNoteClass *add_note); void ags_add_note_init(AgsAddNote *add_note); void ags_add_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_add_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_add_note_dispose(GObject *gobject); void ags_add_note_finalize(GObject *gobject); void ags_add_note_launch(AgsTask *task); /** * SECTION:ags_add_note * @short_description: add note object to notation * @title: AgsAddNote * @section_id: * @include: ags/audio/task/ags_add_note.h * * The #AgsAddNote task adds #AgsNote to #AgsNotation. */ static gpointer ags_add_note_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_NOTE, PROP_AUDIO_CHANNEL, PROP_USE_SELECTION_LIST, }; GType ags_add_note_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_add_note = 0; static const GTypeInfo ags_add_note_info = { sizeof(AgsAddNoteClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_add_note_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAddNote), 0, /* n_preallocs */ (GInstanceInitFunc) ags_add_note_init, }; ags_type_add_note = g_type_register_static(AGS_TYPE_TASK, "AgsAddNote", &ags_add_note_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_add_note); } return g_define_type_id__volatile; } void ags_add_note_class_init(AgsAddNoteClass *add_note) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_add_note_parent_class = g_type_class_peek_parent(add_note); /* gobject */ gobject = (GObjectClass *) add_note; gobject->set_property = ags_add_note_set_property; gobject->get_property = ags_add_note_get_property; gobject->dispose = ags_add_note_dispose; gobject->finalize = ags_add_note_finalize; /* properties */ /** * AgsAddNote:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of notation"), i18n_pspec("The audio of notation"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsAddNote:note: * * The assigned #AgsNote * * Since: 3.0.0 */ param_spec = g_param_spec_object("note", i18n_pspec("note of add note"), i18n_pspec("The note of add note task"), AGS_TYPE_NOTE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE, param_spec); /** * AgsAddNote:audio-channel: * * The assigned audio channel * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("audio channel of notation"), i18n_pspec("The audio channel of notation"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsAddNote:use-selection-list: * * The notation's use-selection-list. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("use-selection-list", i18n_pspec("use selection list"), i18n_pspec("Use selection list of notation"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_USE_SELECTION_LIST, param_spec); /* task */ task = (AgsTaskClass *) add_note; task->launch = ags_add_note_launch; } void ags_add_note_init(AgsAddNote *add_note) { add_note->audio = NULL; add_note->note = NULL; add_note->audio_channel = 0; add_note->use_selection_list = FALSE; } void ags_add_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAddNote *add_note; add_note = AGS_ADD_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(add_note->audio == audio){ return; } if(add_note->audio != NULL){ g_object_unref(add_note->audio); } if(audio != NULL){ g_object_ref(audio); } add_note->audio = audio; } break; case PROP_NOTE: { AgsNote *note; note = (AgsNote *) g_value_get_object(value); if(add_note->note == note){ return; } if(add_note->note != NULL){ g_object_unref(add_note->note); } if(note != NULL){ g_object_ref(note); } add_note->note = note; } break; case PROP_AUDIO_CHANNEL: { add_note->audio_channel = g_value_get_uint(value); } break; case PROP_USE_SELECTION_LIST: { add_note->use_selection_list = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAddNote *add_note; add_note = AGS_ADD_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, add_note->audio); } break; case PROP_NOTE: { g_value_set_object(value, add_note->note); } break; case PROP_AUDIO_CHANNEL: { g_value_set_uint(value, add_note->audio_channel); } break; case PROP_USE_SELECTION_LIST: { g_value_set_boolean(value, add_note->use_selection_list); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_note_dispose(GObject *gobject) { AgsAddNote *add_note; add_note = AGS_ADD_NOTE(gobject); if(add_note->audio != NULL){ g_object_unref(add_note->audio); add_note->audio = NULL; } if(add_note->note != NULL){ g_object_unref(add_note->note); add_note->note = NULL; } /* call parent */ G_OBJECT_CLASS(ags_add_note_parent_class)->dispose(gobject); } void ags_add_note_finalize(GObject *gobject) { AgsAddNote *add_note; add_note = AGS_ADD_NOTE(gobject); if(add_note->audio != NULL){ g_object_unref(add_note->audio); } if(add_note->note != NULL){ g_object_unref(add_note->note); } /* call parent */ G_OBJECT_CLASS(ags_add_note_parent_class)->finalize(gobject); } void ags_add_note_launch(AgsTask *task) { AgsAudio *audio; AgsNotation *notation; AgsNote *note; AgsAddNote *add_note; AgsTimestamp *timestamp; GList *list; guint audio_channel; guint x0; GRecMutex *audio_mutex; add_note = AGS_ADD_NOTE(task); g_return_if_fail(AGS_IS_AUDIO(add_note->audio)); g_return_if_fail(AGS_IS_NOTE(add_note->note)); /* get some fields */ audio = add_note->audio; notation = NULL; audio_channel = add_note->audio_channel; note = add_note->note; g_object_get(note, "x0", &x0, NULL); /* create timestamp */ timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = AGS_NOTATION_DEFAULT_OFFSET * floor(x0 / AGS_NOTATION_DEFAULT_OFFSET); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* find near timestamp */ g_rec_mutex_lock(audio_mutex); list = ags_notation_find_near_timestamp(audio->notation, audio_channel, timestamp); g_rec_mutex_unlock(audio_mutex); if(list == NULL){ notation = ags_notation_new((GObject *) audio, audio_channel); ags_audio_add_notation(audio, (GObject *) notation); }else{ notation = list->data; } /* add note */ ags_notation_add_note(notation, note, add_note->use_selection_list); g_object_unref(timestamp); } /** * ags_add_note_new: * @audio: the #AgsAudio * @note: the #AgsNote to add * @audio_channel: the audio channel * @use_selection_list: if %TRUE added to selection, otherwise to notation * * Create a new instance of #AgsAddNote. * * Returns: the new #AgsAddNote * * Since: 3.0.0 */ AgsAddNote* ags_add_note_new(AgsAudio *audio, AgsNote *note, guint audio_channel, gboolean use_selection_list) { AgsAddNote *add_note; add_note = (AgsAddNote *) g_object_new(AGS_TYPE_ADD_NOTE, "audio", audio, "note", note, "audio-channel", audio_channel, "use-selection-list", use_selection_list, NULL); return(add_note); } gsequencer-3.1.3/ags/audio/task/ags_free_selection.c0000644000175000017500000001424113607210263017403 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_free_selection_class_init(AgsFreeSelectionClass *free_selection); void ags_free_selection_init(AgsFreeSelection *free_selection); void ags_free_selection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_free_selection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_free_selection_dispose(GObject *gobject); void ags_free_selection_finalize(GObject *gobject); void ags_free_selection_launch(AgsTask *task); /** * SECTION:ags_free_selection * @short_description: free selection object * @title: AgsFreeSelection * @section_id: * @include: ags/audio/task/ags_free_selection.h * * The #AgsFreeSelection task frees selection of #AgsNotation. */ static gpointer ags_free_selection_parent_class = NULL; enum{ PROP_0, PROP_NOTATION, }; GType ags_free_selection_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_free_selection = 0; static const GTypeInfo ags_free_selection_info = { sizeof(AgsFreeSelectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_free_selection_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsFreeSelection), 0, /* n_preallocs */ (GInstanceInitFunc) ags_free_selection_init, }; ags_type_free_selection = g_type_register_static(AGS_TYPE_TASK, "AgsFreeSelection", &ags_free_selection_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_free_selection); } return g_define_type_id__volatile; } void ags_free_selection_class_init(AgsFreeSelectionClass *free_selection) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_free_selection_parent_class = g_type_class_peek_parent(free_selection); /* gobject */ gobject = (GObjectClass *) free_selection; gobject->set_property = ags_free_selection_set_property; gobject->get_property = ags_free_selection_get_property; gobject->dispose = ags_free_selection_dispose; gobject->finalize = ags_free_selection_finalize; /* properties */ /** * AgsFreeSelection:notation: * * The assigned #AgsNotation * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation", i18n_pspec("notation of free selection"), i18n_pspec("The notation of free selection task"), AGS_TYPE_NOTATION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /* task */ task = (AgsTaskClass *) free_selection; task->launch = ags_free_selection_launch; } void ags_free_selection_init(AgsFreeSelection *free_selection) { free_selection->notation = NULL; } void ags_free_selection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFreeSelection *free_selection; free_selection = AGS_FREE_SELECTION(gobject); switch(prop_id){ case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_object(value); if(free_selection->notation == notation){ return; } if(free_selection->notation != NULL){ g_object_unref(free_selection->notation); } if(notation != NULL){ g_object_ref(notation); } free_selection->notation = notation; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_free_selection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFreeSelection *free_selection; free_selection = AGS_FREE_SELECTION(gobject); switch(prop_id){ case PROP_NOTATION: { g_value_set_object(value, free_selection->notation); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_free_selection_dispose(GObject *gobject) { AgsFreeSelection *free_selection; free_selection = AGS_FREE_SELECTION(gobject); if(free_selection->notation != NULL){ g_object_unref(free_selection->notation); free_selection->notation = NULL; } /* call parent */ G_OBJECT_CLASS(ags_free_selection_parent_class)->dispose(gobject); } void ags_free_selection_finalize(GObject *gobject) { AgsFreeSelection *free_selection; free_selection = AGS_FREE_SELECTION(gobject); if(free_selection->notation != NULL){ g_object_unref(free_selection->notation); } /* call parent */ G_OBJECT_CLASS(ags_free_selection_parent_class)->finalize(gobject); } void ags_free_selection_launch(AgsTask *task) { AgsNotation *notation; AgsFreeSelection *free_selection; free_selection = AGS_FREE_SELECTION(task); notation = free_selection->notation; /* free selection */ ags_notation_free_selection(notation); } /** * ags_free_selection_new: * @notation: the #AgsNotation * * Create a new instance of #AgsFreeSelection. * * Returns: the new #AgsFreeSelection. * * Since: 3.0.0 */ AgsFreeSelection* ags_free_selection_new(AgsNotation *notation) { AgsFreeSelection *free_selection; free_selection = (AgsFreeSelection *) g_object_new(AGS_TYPE_FREE_SELECTION, "notation", notation, NULL); return(free_selection); } gsequencer-3.1.3/ags/audio/task/ags_remove_note.h0000644000175000017500000000412113607210263016740 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_REMOVE_NOTE_H__ #define __AGS_REMOVE_NOTE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_REMOVE_NOTE (ags_remove_note_get_type()) #define AGS_REMOVE_NOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_REMOVE_NOTE, AgsRemoveNote)) #define AGS_REMOVE_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_REMOVE_NOTE, AgsRemoveNoteClass)) #define AGS_IS_REMOVE_NOTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_REMOVE_NOTE)) #define AGS_IS_REMOVE_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_REMOVE_NOTE)) #define AGS_REMOVE_NOTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_REMOVE_NOTE, AgsRemoveNoteClass)) typedef struct _AgsRemoveNote AgsRemoveNote; typedef struct _AgsRemoveNoteClass AgsRemoveNoteClass; struct _AgsRemoveNote { AgsTask task; AgsAudio *audio; AgsNote *note; guint audio_channel; gboolean use_selection_list; }; struct _AgsRemoveNoteClass { AgsTaskClass task; }; GType ags_remove_note_get_type(); AgsRemoveNote* ags_remove_note_new(AgsAudio *audio, AgsNote *note, guint audio_channel, gboolean use_selection_list); G_END_DECLS #endif /*__AGS_REMOVE_NOTE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_set_buffer_size.h0000644000175000017500000000400113607210263017571 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SET_BUFFER_SIZE_H__ #define __AGS_SET_BUFFER_SIZE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SET_BUFFER_SIZE (ags_set_buffer_size_get_type()) #define AGS_SET_BUFFER_SIZE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SET_BUFFER_SIZE, AgsSetBufferSize)) #define AGS_SET_BUFFER_SIZE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SET_BUFFER_SIZE, AgsSetBufferSizeClass)) #define AGS_IS_SET_BUFFER_SIZE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SET_BUFFER_SIZE)) #define AGS_IS_SET_BUFFER_SIZE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SET_BUFFER_SIZE)) #define AGS_SET_BUFFER_SIZE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SET_BUFFER_SIZE, AgsSetBufferSizeClass)) typedef struct _AgsSetBufferSize AgsSetBufferSize; typedef struct _AgsSetBufferSizeClass AgsSetBufferSizeClass; struct _AgsSetBufferSize { AgsTask task; GObject *scope; guint buffer_size; }; struct _AgsSetBufferSizeClass { AgsTaskClass task; }; GType ags_set_buffer_size_get_type(); AgsSetBufferSize* ags_set_buffer_size_new(GObject *scope, guint buffer_size); G_END_DECLS #endif /*__AGS_SET_BUFFER_SIZE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_start_sequencer.c0000644000175000017500000001354313607210263017630 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_start_sequencer_class_init(AgsStartSequencerClass *start_sequencer); void ags_start_sequencer_init(AgsStartSequencer *start_sequencer); void ags_start_sequencer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_start_sequencer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_start_sequencer_dispose(GObject *gobject); void ags_start_sequencer_finalize(GObject *gobject); void ags_start_sequencer_launch(AgsTask *task); /** * SECTION:ags_start_sequencer * @short_description: start sequencer object * @title: AgsStartSequencer * @section_id: * @include: ags/audio/task/ags_start_sequencer.h * * The #AgsStartSequencer task starts sequencer. */ static gpointer ags_start_sequencer_parent_class = NULL; enum{ PROP_0, }; GType ags_start_sequencer_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_start_sequencer = 0; static const GTypeInfo ags_start_sequencer_info = { sizeof(AgsStartSequencerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_start_sequencer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsStartSequencer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_start_sequencer_init, }; ags_type_start_sequencer = g_type_register_static(AGS_TYPE_TASK, "AgsStartSequencer", &ags_start_sequencer_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_start_sequencer); } return g_define_type_id__volatile; } void ags_start_sequencer_class_init(AgsStartSequencerClass *start_sequencer) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_start_sequencer_parent_class = g_type_class_peek_parent(start_sequencer); /* gobject */ gobject = (GObjectClass *) start_sequencer; gobject->set_property = ags_start_sequencer_set_property; gobject->get_property = ags_start_sequencer_get_property; gobject->dispose = ags_start_sequencer_dispose; gobject->finalize = ags_start_sequencer_finalize; /* properties */ /* task */ task = (AgsTaskClass *) start_sequencer; task->launch = ags_start_sequencer_launch; } void ags_start_sequencer_init(AgsStartSequencer *start_sequencer) { //empty } void ags_start_sequencer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStartSequencer *start_sequencer; start_sequencer = AGS_START_SEQUENCER(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_sequencer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStartSequencer *start_sequencer; start_sequencer = AGS_START_SEQUENCER(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_sequencer_dispose(GObject *gobject) { AgsStartSequencer *start_sequencer; start_sequencer = AGS_START_SEQUENCER(gobject); /* call parent */ G_OBJECT_CLASS(ags_start_sequencer_parent_class)->dispose(gobject); } void ags_start_sequencer_finalize(GObject *gobject) { AgsStartSequencer *start_sequencer; start_sequencer = AGS_START_SEQUENCER(gobject); /* call parent */ G_OBJECT_CLASS(ags_start_sequencer_parent_class)->finalize(gobject); } void ags_start_sequencer_launch(AgsTask *task) { AgsStartSequencer *start_sequencer; AgsThread *audio_loop; AgsThread *sequencer_thread; AgsApplicationContext *application_context; start_sequencer = AGS_START_SEQUENCER(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(application_context)); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); sequencer_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SEQUENCER_THREAD); while(sequencer_thread != NULL){ if(AGS_IS_SEQUENCER_THREAD(sequencer_thread)){ /* append to AgsSequencer */ AGS_SEQUENCER_THREAD(sequencer_thread)->error = NULL; #ifdef AGS_DEBUG g_message("start sequencer"); #endif ags_thread_add_start_queue(audio_loop, sequencer_thread); } sequencer_thread = g_atomic_pointer_get(&(sequencer_thread->next)); } /* unref */ g_object_unref(audio_loop); } /** * ags_start_sequencer_new: * * Creates an #AgsStartSequencer. * * Returns: an new #AgsStartSequencer. * * Since: 3.0.0 */ AgsStartSequencer* ags_start_sequencer_new() { AgsStartSequencer *start_sequencer; start_sequencer = (AgsStartSequencer *) g_object_new(AGS_TYPE_START_SEQUENCER, NULL); return(start_sequencer); } gsequencer-3.1.3/ags/audio/task/ags_seek_soundcard.c0000644000175000017500000002426313607210263017413 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_seek_soundcard_class_init(AgsSeekSoundcardClass *seek_soundcard); void ags_seek_soundcard_init(AgsSeekSoundcard *seek_soundcard); void ags_seek_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_seek_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_seek_soundcard_dispose(GObject *gobject); void ags_seek_soundcard_finalize(GObject *gobject); void ags_seek_soundcard_launch(AgsTask *task); /** * SECTION:ags_seek_soundcard * @short_description: seek soundcard object * @title: AgsSeekSoundcard * @section_id: * @include: ags/audio/task/ags_seek_soundcard.h * * The #AgsSeekSoundcard task seeks #AgsSoundcard. */ static gpointer ags_seek_soundcard_parent_class = NULL; enum{ PROP_0, PROP_SOUNDCARD, PROP_OFFSET, PROP_WHENCE, }; GType ags_seek_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_seek_soundcard = 0; static const GTypeInfo ags_seek_soundcard_info = { sizeof(AgsSeekSoundcardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_seek_soundcard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSeekSoundcard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_seek_soundcard_init, }; ags_type_seek_soundcard = g_type_register_static(AGS_TYPE_TASK, "AgsSeekSoundcard", &ags_seek_soundcard_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_seek_soundcard); } return g_define_type_id__volatile; } void ags_seek_soundcard_class_init(AgsSeekSoundcardClass *seek_soundcard) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_seek_soundcard_parent_class = g_type_class_peek_parent(seek_soundcard); /* gobject */ gobject = (GObjectClass *) seek_soundcard; gobject->set_property = ags_seek_soundcard_set_property; gobject->get_property = ags_seek_soundcard_get_property; gobject->dispose = ags_seek_soundcard_dispose; gobject->finalize = ags_seek_soundcard_finalize; /* properties */ /** * AgsSeekSoundcard:soundcard: * * The assigned #AgsSoundcard * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of seek soundcard"), i18n_pspec("The soundcard of seek soundcard"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsSeekSoundcard:offset: * * The offset to seek. * * Since: 3.0.0 */ param_spec = g_param_spec_int64("offset", i18n_pspec("offset"), i18n_pspec("The amount of offset"), 0, G_MAXINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OFFSET, param_spec); /** * AgsSeekSoundcard:whence: * * Whence either AGS_SEEK_SET, AGS_SEEK_CUR or AGS_SEEK_END * * Since: 3.0.0 */ param_spec = g_param_spec_uint("whence", i18n_pspec("whence"), i18n_pspec("whence"), 0, G_MAXUINT, AGS_SEEK_SET, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WHENCE, param_spec); /* task */ task = (AgsTaskClass *) seek_soundcard; task->launch = ags_seek_soundcard_launch; } void ags_seek_soundcard_init(AgsSeekSoundcard *seek_soundcard) { seek_soundcard->soundcard = NULL; seek_soundcard->offset = 0; seek_soundcard->whence = AGS_SEEK_SET; } void ags_seek_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSeekSoundcard *seek_soundcard; seek_soundcard = AGS_SEEK_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); if(seek_soundcard->soundcard == (GObject *) soundcard){ return; } if(seek_soundcard->soundcard != NULL){ g_object_unref(seek_soundcard->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } seek_soundcard->soundcard = (GObject *) soundcard; } break; case PROP_OFFSET: { seek_soundcard->offset = g_value_get_int64(value); } break; case PROP_WHENCE: { seek_soundcard->whence = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_seek_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSeekSoundcard *seek_soundcard; seek_soundcard = AGS_SEEK_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, seek_soundcard->soundcard); } break; case PROP_OFFSET: { g_value_set_int64(value, seek_soundcard->offset); } break; case PROP_WHENCE: { g_value_set_uint(value, seek_soundcard->whence); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_seek_soundcard_dispose(GObject *gobject) { AgsSeekSoundcard *seek_soundcard; seek_soundcard = AGS_SEEK_SOUNDCARD(gobject); if(seek_soundcard->soundcard != NULL){ g_object_unref(seek_soundcard->soundcard); seek_soundcard->soundcard = NULL; } /* call parent */ G_OBJECT_CLASS(ags_seek_soundcard_parent_class)->dispose(gobject); } void ags_seek_soundcard_finalize(GObject *gobject) { AgsSeekSoundcard *seek_soundcard; seek_soundcard = AGS_SEEK_SOUNDCARD(gobject); if(seek_soundcard->soundcard != NULL){ g_object_unref(seek_soundcard->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_seek_soundcard_parent_class)->finalize(gobject); } void ags_seek_soundcard_launch(AgsTask *task) { AgsSeekSoundcard *seek_soundcard; AgsApplicationContext *application_context; GObject *soundcard; GList *audio_start, *audio; GList *recall_start, *recall; guint note_offset; guint note_offset_absolute; seek_soundcard = AGS_SEEK_SOUNDCARD(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_SOUND_PROVIDER(application_context)); g_return_if_fail(AGS_IS_SOUNDCARD(seek_soundcard->soundcard)); soundcard = seek_soundcard->soundcard; audio = audio_start = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); while(audio != NULL){ /* seek play context */ g_object_get(audio->data, "play", &recall_start, NULL); recall = recall_start; while(recall != NULL){ if(AGS_IS_SEEKABLE(recall->data)){ ags_seekable_seek(AGS_SEEKABLE(recall->data), seek_soundcard->offset, seek_soundcard->whence); } recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* seek recall context */ g_object_get(audio->data, "recall", &recall_start, NULL); recall = recall_start; while(recall != NULL){ if(AGS_IS_SEEKABLE(recall->data)){ ags_seekable_seek(AGS_SEEKABLE(recall->data), seek_soundcard->offset, seek_soundcard->whence); } recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* iterate */ audio = audio->next; } g_list_free_full(audio_start, g_object_unref); /* seek soundcard */ note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(seek_soundcard->soundcard)); note_offset_absolute = ags_soundcard_get_note_offset_absolute(AGS_SOUNDCARD(seek_soundcard->soundcard)); switch(seek_soundcard->whence){ case AGS_SEEK_CUR: { ags_soundcard_set_note_offset(AGS_SOUNDCARD(seek_soundcard->soundcard), note_offset + seek_soundcard->offset); ags_soundcard_set_note_offset_absolute(AGS_SOUNDCARD(seek_soundcard->soundcard), note_offset_absolute + seek_soundcard->offset); } break; case AGS_SEEK_SET: { ags_soundcard_set_note_offset(AGS_SOUNDCARD(seek_soundcard->soundcard), seek_soundcard->offset); ags_soundcard_set_note_offset_absolute(AGS_SOUNDCARD(seek_soundcard->soundcard), seek_soundcard->offset); } break; case AGS_SEEK_END: { ags_soundcard_set_note_offset(AGS_SOUNDCARD(seek_soundcard->soundcard), AGS_NOTATION_DEFAULT_END + seek_soundcard->offset); ags_soundcard_set_note_offset_absolute(AGS_SOUNDCARD(seek_soundcard->soundcard), AGS_NOTATION_DEFAULT_END + seek_soundcard->offset); } break; } } /** * ags_seek_soundcard_new: * @soundcard: the #GObject sub-type implementing #AgsSoundcard * @offset: the offset * @whence: whence see #AgsSeekType-enum * * Create a new instance of #AgsSeekSoundcard. * * Returns: the new #AgsSeekSoundcard * * Since: 3.0.0 */ AgsSeekSoundcard* ags_seek_soundcard_new(GObject *soundcard, gint64 offset, guint whence) { AgsSeekSoundcard *seek_soundcard; seek_soundcard = (AgsSeekSoundcard *) g_object_new(AGS_TYPE_SEEK_SOUNDCARD, "soundcard", soundcard, "offset", offset, "whence", whence, NULL); return(seek_soundcard); } gsequencer-3.1.3/ags/audio/task/ags_apply_tact.h0000644000175000017500000000357013607210263016565 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLY_TACT_H__ #define __AGS_APPLY_TACT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLY_TACT (ags_apply_tact_get_type()) #define AGS_APPLY_TACT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLY_TACT, AgsApplyTact)) #define AGS_APPLY_TACT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_APPLY_TACT, AgsApplyTactClass)) #define AGS_IS_APPLY_TACT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLY_TACT)) #define AGS_IS_APPLY_TACT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_APPLY_TACT)) #define AGS_APPLY_TACT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_APPLY_TACT, AgsApplyTactClass)) typedef struct _AgsApplyTact AgsApplyTact; typedef struct _AgsApplyTactClass AgsApplyTactClass; struct _AgsApplyTact { AgsTask task; GObject *scope; gdouble tact; }; struct _AgsApplyTactClass { AgsTaskClass task; }; GType ags_apply_tact_get_type(); AgsApplyTact* ags_apply_tact_new(GObject *scope, gdouble tact); G_END_DECLS #endif /*__AGS_APPLY_TACT_H__*/ gsequencer-3.1.3/ags/audio/task/ags_clear_buffer.h0000644000175000017500000000361413607210263017043 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CLEAR_BUFFER_H__ #define __AGS_CLEAR_BUFFER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CLEAR_BUFFER (ags_clear_buffer_get_type()) #define AGS_CLEAR_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CLEAR_BUFFER, AgsClearBuffer)) #define AGS_CLEAR_BUFFER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CLEAR_BUFFER, AgsClearBufferClass)) #define AGS_IS_CLEAR_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CLEAR_BUFFER)) #define AGS_IS_CLEAR_BUFFER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CLEAR_BUFFER)) #define AGS_CLEAR_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CLEAR_BUFFER, AgsClearBufferClass)) typedef struct _AgsClearBuffer AgsClearBuffer; typedef struct _AgsClearBufferClass AgsClearBufferClass; struct _AgsClearBuffer { AgsTask task; GObject *device; }; struct _AgsClearBufferClass { AgsTaskClass task; }; GType ags_clear_buffer_get_type(); AgsClearBuffer* ags_clear_buffer_new(GObject *device); G_END_DECLS #endif /*__AGS_CLEAR_BUFFER_H__*/ gsequencer-3.1.3/ags/audio/task/ags_move_note.c0000644000175000017500000003600613613101164016407 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_move_note_class_init(AgsMoveNoteClass *move_note); void ags_move_note_init(AgsMoveNote *move_note); void ags_move_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_move_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_move_note_dispose(GObject *gobject); void ags_move_note_finalize(GObject *gobject); void ags_move_note_launch(AgsTask *task); /** * SECTION:ags_move_note * @short_description: move notation * @title: AgsMoveNote * @section_id: * @include: ags/audio/task/ags_move_note.h * * The #AgsMoveNote task moves #AgsNotation. */ static gpointer ags_move_note_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_NOTATION, PROP_SELECTION, PROP_FIRST_X, PROP_FIRST_Y, PROP_MOVE_X, PROP_MOVE_Y, PROP_RELATIVE, PROP_ABSOLUTE, }; GType ags_move_note_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_move_note = 0; static const GTypeInfo ags_move_note_info = { sizeof(AgsMoveNoteClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_move_note_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMoveNote), 0, /* n_preallocs */ (GInstanceInitFunc) ags_move_note_init, }; ags_type_move_note = g_type_register_static(AGS_TYPE_TASK, "AgsMoveNote", &ags_move_note_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_move_note); } return g_define_type_id__volatile; } void ags_move_note_class_init(AgsMoveNoteClass *move_note) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_move_note_parent_class = g_type_class_peek_parent(move_note); /* gobject */ gobject = (GObjectClass *) move_note; gobject->set_property = ags_move_note_set_property; gobject->get_property = ags_move_note_get_property; gobject->dispose = ags_move_note_dispose; gobject->finalize = ags_move_note_finalize; /* properties */ /** * AgsMoveNote:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of move note"), i18n_pspec("The audio of move note task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsMoveNote:notation: * * The assigned #AgsNotation * * Since: 3.0.0 */ param_spec = g_param_spec_object("notation", i18n_pspec("notation of move note"), i18n_pspec("The notation of move note task"), AGS_TYPE_NOTATION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTATION, param_spec); /** * AgsMoveNote:selection: (type GList(AgsNote)) * * The assigned #AgsNote * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("selection", i18n_pspec("selection to move"), i18n_pspec("The selection to move"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SELECTION, param_spec); /** * AgsMoveNote:first-x: * * Move notation from x offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("first-x", i18n_pspec("move from x offset"), i18n_pspec("Move the notation from x offset"), 0, AGS_MOVE_NOTE_DEFAULT_X_LENGTH, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIRST_X, param_spec); /** * AgsMoveNote:first-y: * * Move notation with x padding. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("first-y", i18n_pspec("move with x padding"), i18n_pspec("Move the notation with x padding"), 0, AGS_MOVE_NOTE_DEFAULT_X_LENGTH, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIRST_Y, param_spec); /** * AgsMoveNote:move-x: * * Move notation by move-x amount. * * Since: 3.0.0 */ param_spec = g_param_spec_int("move-x", i18n_pspec("move with move-x amount"), i18n_pspec("Move the notation by move-x amount"), -1 * AGS_MOVE_NOTE_DEFAULT_X_LENGTH, AGS_MOVE_NOTE_DEFAULT_X_LENGTH, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MOVE_X, param_spec); /** * AgsMoveNote:move-y: * * Move notation by move-y amount. * * Since: 3.0.0 */ param_spec = g_param_spec_int("move-y", i18n_pspec("move with move-y amount"), i18n_pspec("Move the notation by move-y amount"), -1 * AGS_MOVE_NOTE_DEFAULT_Y_LENGTH, AGS_MOVE_NOTE_DEFAULT_Y_LENGTH, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MOVE_Y, param_spec); /** * AgsMoveNote:relative: * * Move notation by relative position. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("relative", i18n_pspec("move relative"), i18n_pspec("Move the notation by relative position"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RELATIVE, param_spec); /** * AgsMoveNote:absolute: * * Move notation by absolute position. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("absolute", i18n_pspec("move absolute"), i18n_pspec("Move the notation by absolute position"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ABSOLUTE, param_spec); /* task */ task = (AgsTaskClass *) move_note; task->launch = ags_move_note_launch; } void ags_move_note_init(AgsMoveNote *move_note) { move_note->audio = NULL; move_note->notation = NULL; move_note->selection = NULL; move_note->first_x = 0; move_note->first_y = 0; move_note->move_x = 0; move_note->move_y = 0; move_note->relative = FALSE; move_note->absolute = FALSE; } void ags_move_note_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMoveNote *move_note; move_note = AGS_MOVE_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(move_note->audio == audio){ return; } if(move_note->audio != NULL){ g_object_unref(move_note->audio); } if(audio != NULL){ g_object_ref(audio); } move_note->audio = audio; } break; case PROP_NOTATION: { AgsNotation *notation; notation = (AgsNotation *) g_value_get_object(value); if(move_note->notation == notation){ return; } if(move_note->notation != NULL){ g_object_unref(move_note->notation); } if(notation != NULL){ g_object_ref(notation); } move_note->notation = notation; } break; case PROP_SELECTION: { AgsNote *note; note = (AgsNote *) g_value_get_pointer(value); if(note == NULL || g_list_find(move_note->selection, note) != NULL){ return; } g_object_ref(note); move_note->selection = g_list_prepend(move_note->selection, note); } break; case PROP_FIRST_X: { move_note->first_x = g_value_get_uint(value); } break; case PROP_FIRST_Y: { move_note->first_y = g_value_get_uint(value); } break; case PROP_MOVE_X: { move_note->move_x = g_value_get_int(value); } break; case PROP_MOVE_Y: { move_note->move_y = g_value_get_int(value); } break; case PROP_RELATIVE: { move_note->relative = g_value_get_boolean(value); } break; case PROP_ABSOLUTE: { move_note->absolute = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_move_note_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMoveNote *move_note; move_note = AGS_MOVE_NOTE(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, move_note->audio); } break; case PROP_NOTATION: { g_value_set_object(value, move_note->notation); } break; case PROP_SELECTION: { g_value_set_pointer(value, g_list_copy_deep(move_note->selection, (GCopyFunc) g_object_ref, NULL)); } break; case PROP_FIRST_X: { g_value_set_int(value, move_note->first_x); } break; case PROP_FIRST_Y: { g_value_set_uint(value, move_note->first_y); } break; case PROP_MOVE_X: { g_value_set_uint(value, move_note->move_x); } break; case PROP_MOVE_Y: { g_value_set_uint(value, move_note->move_y); } break; case PROP_RELATIVE: { g_value_set_boolean(value, move_note->relative); } break; case PROP_ABSOLUTE: { g_value_set_boolean(value, move_note->absolute); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_move_note_dispose(GObject *gobject) { AgsMoveNote *move_note; move_note = AGS_MOVE_NOTE(gobject); if(move_note->audio != NULL){ g_object_unref(move_note->audio); move_note->audio = NULL; } if(move_note->notation != NULL){ g_object_unref(move_note->notation); move_note->notation = NULL; } if(move_note->selection != NULL){ g_list_free(move_note->selection); move_note->selection = NULL; } /* call parent */ G_OBJECT_CLASS(ags_move_note_parent_class)->dispose(gobject); } void ags_move_note_finalize(GObject *gobject) { AgsMoveNote *move_note; move_note = AGS_MOVE_NOTE(gobject); if(move_note->audio != NULL){ g_object_unref(move_note->audio); } if(move_note->notation != NULL){ g_object_unref(move_note->notation); } if(move_note->selection != NULL){ g_list_free(move_note->selection); } /* call parent */ G_OBJECT_CLASS(ags_move_note_parent_class)->finalize(gobject); } void ags_move_note_launch(AgsTask *task) { AgsAudio *audio; AgsNotation *notation, *current_notation; AgsNote *note; AgsMoveNote *move_note; GList *selection; guint audio_channel; guint first_x; guint first_y; gint move_x; gint move_y; gboolean relative; gboolean absolute; move_note = AGS_MOVE_NOTE(task); g_return_if_fail(AGS_IS_AUDIO(move_note->audio)); g_return_if_fail(AGS_IS_NOTATION(move_note->notation)); g_object_get(move_note, "audio", &audio, NULL); /* get some properties */ notation = current_notation = move_note->notation; g_object_get(notation, "audio-channel", &audio_channel, NULL); selection = move_note->selection; first_x = move_note->first_x; first_y = move_note->first_y; move_x = move_note->move_x; move_y = move_note->move_y; relative = move_note->relative; absolute = move_note->absolute; /* move */ while(selection != NULL){ note = ags_note_duplicate(AGS_NOTE(selection->data)); if(relative){ note->x[0] = note->x[0] + move_x; note->x[1] = note->x[1] + move_x; note->y = note->y + move_y; }else if(absolute){ note->x[0] = move_x + (note->x[0] - first_x); note->x[1] = move_x + (note->x[1] - first_x); note->y = move_y + (note->y + first_y); } if(note->x[0] >= ags_timestamp_get_ags_offset(current_notation->timestamp) + AGS_NOTATION_DEFAULT_OFFSET){ AgsTimestamp *timestamp; GList *list_start, *list; g_object_get(audio, "notation", &list_start, NULL); timestamp = ags_timestamp_new(); timestamp->flags &= (~AGS_TIMESTAMP_UNIX); timestamp->flags |= AGS_TIMESTAMP_OFFSET; timestamp->timer.ags_offset.offset = (guint64) (AGS_NOTATION_DEFAULT_OFFSET * floor(note->x[0] / AGS_NOTATION_DEFAULT_OFFSET)); if((list = ags_notation_find_near_timestamp(list_start, audio_channel, timestamp)) == NULL){ current_notation = ags_notation_new((GObject *) audio, audio_channel); current_notation->timestamp->timer.ags_offset.offset = ags_timestamp_get_ags_offset(timestamp); ags_audio_add_notation(audio, (GObject *) current_notation); }else{ current_notation = list->data; } g_list_free_full(list_start, g_object_unref); g_object_unref(timestamp); } /* remove old note */ ags_notation_remove_note(notation, selection->data, TRUE); ags_notation_remove_note(notation, selection->data, FALSE); /* add new note */ ags_notation_add_note(current_notation, note, FALSE); selection = selection->next; } g_object_unref(audio); } /** * ags_move_note_new: * @audio: the #AgsAudio * @notation: the #AgsNotation * @selection: (element-type AgsAudio.Note) (transfer none): the selection as #GList-struct * @first_x: the x offset to move from * @first_y: the x padding to use * @move_x: the amout to move in x direction * @move_y: the amout to move in y direction * @relative: if %TRUE move relative position * @absolute: if %TRUE move absolute position * * Create a new instance of #AgsMoveNote task. Note either @relative or @absolute shall * be %TRUE else it won't have any effect. * * Returns: a new #AgsMoveNote * * Since: 3.0.0 */ AgsMoveNote* ags_move_note_new(AgsAudio *audio, AgsNotation *notation, GList *selection, guint first_x, guint first_y, gint move_x, gint move_y, gboolean relative, gboolean absolute) { AgsMoveNote *move_note; move_note = (AgsMoveNote *) g_object_new(AGS_TYPE_MOVE_NOTE, "audio", audio, "notation", notation, "first-x", first_x, "first-y", first_y, "move-x", move_x, "move-y", move_y, "relative", relative, "absolute", absolute, NULL); //FIXME:JK: argh, introspection! move_note->selection = g_list_copy_deep(selection, (GCopyFunc) g_object_ref, NULL); return(move_note); } gsequencer-3.1.3/ags/audio/task/ags_add_audio_signal.c0000644000175000017500000003250513607210263017666 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_add_audio_signal_class_init(AgsAddAudioSignalClass *add_audio_signal); void ags_add_audio_signal_init(AgsAddAudioSignal *add_audio_signal); void ags_add_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_add_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_add_audio_signal_dispose(GObject *gobject); void ags_add_audio_signal_finalize(GObject *gobject); void ags_add_audio_signal_launch(AgsTask *task); /** * SECTION:ags_add_audio_signal * @short_description: add audio signal object to recycling * @title: AgsAddAudioSignal * @section_id: * @include: ags/audio/task/ags_add_audio_signal.h * * The #AgsAddAudioSignal task adds #AgsAudioSignal to #AgsRecycling. */ static gpointer ags_add_audio_signal_parent_class = NULL; enum{ PROP_0, PROP_RECYCLING, PROP_AUDIO_SIGNAL, PROP_SOUNDCARD, PROP_RECALL_ID, PROP_AUDIO_SIGNAL_FLAGS, }; GType ags_add_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_add_audio_signal = 0; static const GTypeInfo ags_add_audio_signal_info = { sizeof (AgsAddAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_add_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAddAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_add_audio_signal_init, }; ags_type_add_audio_signal = g_type_register_static(AGS_TYPE_TASK, "AgsAddAudioSignal", &ags_add_audio_signal_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_add_audio_signal); } return g_define_type_id__volatile; } void ags_add_audio_signal_class_init(AgsAddAudioSignalClass *add_audio_signal) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_add_audio_signal_parent_class = g_type_class_peek_parent(add_audio_signal); /* gobject */ gobject = (GObjectClass *) add_audio_signal; gobject->set_property = ags_add_audio_signal_set_property; gobject->get_property = ags_add_audio_signal_get_property; gobject->dispose = ags_add_audio_signal_dispose; gobject->finalize = ags_add_audio_signal_finalize; /* properties */ /** * AgsAddAudioSignal:recycling: * * The assigned #AgsRecycling * * Since: 3.0.0 */ param_spec = g_param_spec_object("recycling", i18n_pspec("recycling of add audio signal"), i18n_pspec("The recycling of add audio signal task"), AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECYCLING, param_spec); /** * AgsAddAudioSignal:audio-signal: * * The assigned #AgsAudioSignal * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-signal", i18n_pspec("audio signal of add audio signal"), i18n_pspec("The audio signal of add audio signal task"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL, param_spec); /** * AgsAddAudioSignal:soundcard: * * The assigned #AgsSoundcard * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of add audio signal"), i18n_pspec("The soundcard of add audio signal task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsAddAudioSignal:recall-id: * * The assigned #AgsRecallID * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-id", i18n_pspec("audio signal of add audio signal"), i18n_pspec("The audio signal of add audio signal task"), AGS_TYPE_RECALL_ID, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_ID, param_spec); /** * AgsAddAudioSignal:audio-signal-flags: * * The audio signal's flags. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-signal-flags", i18n_pspec("audio signal flags of effect"), i18n_pspec("The audio signal's flags to apply"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL_FLAGS, param_spec); /* task */ task = (AgsTaskClass *) add_audio_signal; task->launch = ags_add_audio_signal_launch; } void ags_add_audio_signal_init(AgsAddAudioSignal *add_audio_signal) { add_audio_signal->recycling = NULL; add_audio_signal->audio_signal = NULL; add_audio_signal->soundcard = NULL; add_audio_signal->recall_id = NULL; add_audio_signal->audio_signal_flags = 0; } void ags_add_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAddAudioSignal *add_audio_signal; add_audio_signal = AGS_ADD_AUDIO_SIGNAL(gobject); switch(prop_id){ case PROP_RECYCLING: { AgsRecycling *recycling; recycling = (AgsRecycling *) g_value_get_object(value); if(add_audio_signal->recycling == recycling){ return; } if(add_audio_signal->recycling != NULL){ g_object_unref(add_audio_signal->recycling); } if(recycling != NULL){ g_object_ref(recycling); } add_audio_signal->recycling = recycling; } break; case PROP_AUDIO_SIGNAL: { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) g_value_get_object(value); if(add_audio_signal->audio_signal == audio_signal){ return; } if(add_audio_signal->audio_signal != NULL){ g_object_unref(add_audio_signal->audio_signal); } if(audio_signal != NULL){ g_object_ref(audio_signal); } add_audio_signal->audio_signal = audio_signal; } break; case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); if(add_audio_signal->soundcard == (GObject *) soundcard){ return; } if(add_audio_signal->soundcard != NULL){ g_object_unref(add_audio_signal->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } add_audio_signal->soundcard = (GObject *) soundcard; } break; case PROP_RECALL_ID: { AgsRecallID *recall_id; recall_id = (AgsRecallID *) g_value_get_object(value); if(add_audio_signal->recall_id == recall_id){ return; } if(add_audio_signal->recall_id != NULL){ g_object_unref(add_audio_signal->recall_id); } if(recall_id != NULL){ g_object_ref(recall_id); } add_audio_signal->recall_id = recall_id; } break; case PROP_AUDIO_SIGNAL_FLAGS: { guint audio_signal_flags; audio_signal_flags = g_value_get_uint(value); add_audio_signal->audio_signal_flags = audio_signal_flags; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAddAudioSignal *add_audio_signal; add_audio_signal = AGS_ADD_AUDIO_SIGNAL(gobject); switch(prop_id){ case PROP_RECYCLING: { g_value_set_object(value, add_audio_signal->recycling); } break; case PROP_AUDIO_SIGNAL: { g_value_set_object(value, add_audio_signal->audio_signal); } break; case PROP_SOUNDCARD: { g_value_set_object(value, add_audio_signal->soundcard); } break; case PROP_AUDIO_SIGNAL_FLAGS: { g_value_set_uint(value, add_audio_signal->audio_signal_flags); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_audio_signal_dispose(GObject *gobject) { AgsAddAudioSignal *add_audio_signal; add_audio_signal = AGS_ADD_AUDIO_SIGNAL(gobject); if(add_audio_signal->recycling != NULL){ g_object_unref(add_audio_signal->recycling); add_audio_signal->recycling = NULL; } if(add_audio_signal->audio_signal != NULL){ g_object_unref(add_audio_signal->audio_signal); add_audio_signal->audio_signal = NULL; } if(add_audio_signal->soundcard != NULL){ g_object_unref(add_audio_signal->soundcard); add_audio_signal->soundcard = NULL; } if(add_audio_signal->recall_id != NULL){ g_object_unref(add_audio_signal->recall_id); add_audio_signal->recall_id = NULL; } /* call parent */ G_OBJECT_CLASS(ags_add_audio_signal_parent_class)->dispose(gobject); } void ags_add_audio_signal_finalize(GObject *gobject) { AgsAddAudioSignal *add_audio_signal; add_audio_signal = AGS_ADD_AUDIO_SIGNAL(gobject); if(add_audio_signal->recycling != NULL){ g_object_unref(add_audio_signal->recycling); } if(add_audio_signal->audio_signal != NULL){ g_object_unref(add_audio_signal->audio_signal); } if(add_audio_signal->soundcard != NULL){ g_object_unref(add_audio_signal->soundcard); } if(add_audio_signal->recall_id != NULL){ g_object_unref(add_audio_signal->recall_id); } /* call parent */ G_OBJECT_CLASS(ags_add_audio_signal_parent_class)->finalize(gobject); } void ags_add_audio_signal_launch(AgsTask *task) { AgsRecycling *recycling; AgsAudioSignal *audio_signal, *old_template; AgsRecallID *recall_id; AgsAddAudioSignal *add_audio_signal; GObject *soundcard; guint audio_signal_flags; gdouble delay; guint attack; GRecMutex *recycling_mutex; add_audio_signal = AGS_ADD_AUDIO_SIGNAL(task); g_return_if_fail(AGS_IS_RECYCLING(add_audio_signal->recycling)); soundcard = add_audio_signal->soundcard; recycling = add_audio_signal->recycling; audio_signal = add_audio_signal->audio_signal; audio_signal_flags = add_audio_signal->audio_signal_flags; recall_id = add_audio_signal->recall_id; /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* check for template to remove */ old_template = NULL; if((AGS_AUDIO_SIGNAL_TEMPLATE & (audio_signal_flags)) != 0){ g_rec_mutex_lock(recycling_mutex); old_template = ags_audio_signal_get_template(add_audio_signal->recycling->audio_signal); g_rec_mutex_unlock(recycling_mutex); } /* create audio signal */ if(audio_signal == NULL){ audio_signal = add_audio_signal->audio_signal = ags_audio_signal_new((GObject *) soundcard, (GObject *) recycling, (GObject *) recall_id); ags_audio_signal_set_flags(audio_signal, add_audio_signal->audio_signal_flags); } /* delay and attack */ //TODO:JK: unclear attack = 0; //soundcard->attack[((tic_counter_incr == AGS_NOTATION_TICS_PER_BEAT) ? // 0: // tic_counter_incr)]; delay = 0.0; //soundcard->delay[((tic_counter_incr == AGS_NOTATION_TICS_PER_BEAT) ? // 0: // tic_counter_incr)]; /* add audio signal */ ags_recycling_create_audio_signal_with_defaults(recycling, audio_signal, delay, attack); audio_signal->stream_current = audio_signal->stream; ags_connectable_connect(AGS_CONNECTABLE(audio_signal)); /* remove template */ if(old_template != NULL){ ags_recycling_remove_audio_signal(add_audio_signal->recycling, old_template); } /* * emit add_audio_signal on AgsRecycling */ ags_recycling_add_audio_signal(add_audio_signal->recycling, audio_signal); if(old_template != NULL){ g_object_unref(old_template); } } /** * ags_add_audio_signal_new: * @recycling: the #AgsRecycling * @audio_signal: the #AgsAudioSignal to add * @soundcard: the #GObject defaulting to * @recall_id: the #AgsRecallID, may be %NULL if %AGS_AUDIO_SIGNAL_TEMPLATE set * @audio_signal_flags: the flags to set * * Creates an #AgsAddAudioSignal. * * Returns: an new #AgsAddAudioSignal. * * Since: 3.0.0 */ AgsAddAudioSignal* ags_add_audio_signal_new(AgsRecycling *recycling, AgsAudioSignal *audio_signal, GObject *soundcard, AgsRecallID *recall_id, guint audio_signal_flags) { AgsAddAudioSignal *add_audio_signal; add_audio_signal = (AgsAddAudioSignal *) g_object_new(AGS_TYPE_ADD_AUDIO_SIGNAL, "recycling", recycling, "audio-signal", audio_signal, "soundcard", soundcard, "recall-id", recall_id, "audio-signal-flags", audio_signal_flags, NULL); return(add_audio_signal); } gsequencer-3.1.3/ags/audio/task/ags_set_buffer_size.c0000644000175000017500000002572413607210263017603 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_set_buffer_size_class_init(AgsSetBufferSizeClass *set_buffer_size); void ags_set_buffer_size_init(AgsSetBufferSize *set_buffer_size); void ags_set_buffer_size_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_set_buffer_size_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_set_buffer_size_dispose(GObject *gobject); void ags_set_buffer_size_finalize(GObject *gobject); void ags_set_buffer_size_launch(AgsTask *task); void ags_set_buffer_size_audio_signal(AgsSetBufferSize *set_buffer_size, AgsAudioSignal *audio_signal); void ags_set_buffer_size_recycling(AgsSetBufferSize *set_buffer_size, AgsRecycling *recycling); void ags_set_buffer_size_channel(AgsSetBufferSize *set_buffer_size, AgsChannel *channel); void ags_set_buffer_size_audio(AgsSetBufferSize *set_buffer_size, AgsAudio *audio); void ags_set_buffer_size_soundcard(AgsSetBufferSize *set_buffer_size, GObject *soundcard); /** * SECTION:ags_set_buffer_size * @short_description: adjust buffer size * @title: AgsSetBufferSize * @section_id: * @include: ags/audio/task/ags_set_buffer_size.h * * The #AgsSetBufferSize task adjusts buffer size of scope. */ enum{ PROP_0, PROP_SCOPE, PROP_BUFFER_SIZE, }; static gpointer ags_set_buffer_size_parent_class = NULL; GType ags_set_buffer_size_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_set_buffer_size = 0; static const GTypeInfo ags_set_buffer_size_info = { sizeof(AgsSetBufferSizeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_set_buffer_size_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSetBufferSize), 0, /* n_preallocs */ (GInstanceInitFunc) ags_set_buffer_size_init, }; ags_type_set_buffer_size = g_type_register_static(AGS_TYPE_TASK, "AgsSetBufferSize", &ags_set_buffer_size_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_set_buffer_size); } return g_define_type_id__volatile; } void ags_set_buffer_size_class_init(AgsSetBufferSizeClass *set_buffer_size) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_set_buffer_size_parent_class = g_type_class_peek_parent(set_buffer_size); /* gobject */ gobject = (GObjectClass *) set_buffer_size; gobject->set_property = ags_set_buffer_size_set_property; gobject->get_property = ags_set_buffer_size_get_property; gobject->dispose = ags_set_buffer_size_dispose; gobject->finalize = ags_set_buffer_size_finalize; /* properties */ /** * AgsSetBufferSize:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set buffer size"), i18n_pspec("The scope of set buffer size"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsSetBufferSize:buffer-size: * * The buffer size to apply to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size to apply"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /* task */ task = (AgsTaskClass *) set_buffer_size; task->launch = ags_set_buffer_size_launch; } void ags_set_buffer_size_init(AgsSetBufferSize *set_buffer_size) { set_buffer_size->scope = NULL; set_buffer_size->buffer_size = 128; } void ags_set_buffer_size_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSetBufferSize *set_buffer_size; set_buffer_size = AGS_SET_BUFFER_SIZE(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(set_buffer_size->scope == (GObject *) scope){ return; } if(set_buffer_size->scope != NULL){ g_object_unref(set_buffer_size->scope); } if(scope != NULL){ g_object_ref(scope); } set_buffer_size->scope = (GObject *) scope; } break; case PROP_BUFFER_SIZE: { set_buffer_size->buffer_size = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_buffer_size_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSetBufferSize *set_buffer_size; set_buffer_size = AGS_SET_BUFFER_SIZE(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, set_buffer_size->scope); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, set_buffer_size->buffer_size); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_buffer_size_dispose(GObject *gobject) { AgsSetBufferSize *set_buffer_size; set_buffer_size = AGS_SET_BUFFER_SIZE(gobject); if(set_buffer_size->scope != NULL){ g_object_unref(set_buffer_size->scope); set_buffer_size->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_set_buffer_size_parent_class)->dispose(gobject); } void ags_set_buffer_size_finalize(GObject *gobject) { AgsSetBufferSize *set_buffer_size; set_buffer_size = AGS_SET_BUFFER_SIZE(gobject); if(set_buffer_size->scope != NULL){ g_object_unref(set_buffer_size->scope); } /* call parent */ G_OBJECT_CLASS(ags_set_buffer_size_parent_class)->finalize(gobject); } void ags_set_buffer_size_launch(AgsTask *task) { AgsSetBufferSize *set_buffer_size; GObject *scope; set_buffer_size = AGS_SET_BUFFER_SIZE(task); scope = set_buffer_size->scope; if(AGS_IS_SOUNDCARD(scope)){ ags_set_buffer_size_soundcard(set_buffer_size, scope); }else if(AGS_IS_AUDIO(scope)){ ags_set_buffer_size_audio(set_buffer_size, AGS_AUDIO(scope)); }else if(AGS_IS_CHANNEL(scope)){ ags_set_buffer_size_channel(set_buffer_size, AGS_CHANNEL(scope)); }else if(AGS_IS_RECYCLING(scope)){ ags_set_buffer_size_recycling(set_buffer_size, AGS_RECYCLING(scope)); }else if(AGS_IS_AUDIO_SIGNAL(scope)){ ags_set_buffer_size_audio_signal(set_buffer_size, AGS_AUDIO_SIGNAL(scope)); } } void ags_set_buffer_size_audio_signal(AgsSetBufferSize *set_buffer_size, AgsAudioSignal *audio_signal) { g_object_set(audio_signal, "buffer-size", set_buffer_size->buffer_size, NULL); } void ags_set_buffer_size_recycling(AgsSetBufferSize *set_buffer_size, AgsRecycling *recycling) { g_object_set(recycling, "buffer-size", set_buffer_size->buffer_size, NULL); } void ags_set_buffer_size_channel(AgsSetBufferSize *set_buffer_size, AgsChannel *channel) { g_object_set(channel, "buffer-size", set_buffer_size->buffer_size, NULL); } void ags_set_buffer_size_audio(AgsSetBufferSize *set_buffer_size, AgsAudio *audio) { g_object_set(audio, "buffer-size", set_buffer_size->buffer_size, NULL); } void ags_set_buffer_size_soundcard(AgsSetBufferSize *set_buffer_size, GObject *soundcard) { AgsThread *audio_loop; AgsApplicationContext *application_context; GObject *default_soundcard; GList *list_start, *list; gdouble thread_frequency; guint channels; guint samplerate; guint buffer_size; guint format; application_context = ags_application_context_get_instance(); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* set buffer size */ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), &channels, &samplerate, &buffer_size, &format); /* reset soundcards */ default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); if(soundcard == default_soundcard){ /* reset soundcards if applied to first soundcard */ ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), channels, samplerate, set_buffer_size->buffer_size, format); list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(list->data != soundcard){ guint target_channels; guint target_samplerate; guint target_buffer_size; guint target_format; /* get soundcard mutex */ ags_soundcard_get_presets(AGS_SOUNDCARD(list->data), &target_channels, &target_samplerate, &target_buffer_size, &target_format); ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), target_channels, target_samplerate, set_buffer_size->buffer_size * (target_samplerate / samplerate), target_format); } list = list->next; } g_list_free_full(list_start, g_object_unref); /* reset thread frequency */ thread_frequency = samplerate / set_buffer_size->buffer_size + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; ags_main_loop_change_frequency(AGS_MAIN_LOOP(audio_loop), thread_frequency); }else{ g_warning("buffer size can only adjusted of your very first soundcard"); } if(default_soundcard != NULL){ g_object_unref(default_soundcard); } /* unref */ g_object_unref(audio_loop); } /** * ags_set_buffer_size_new: * @scope: the #GObject to reset * @buffer_size: the new buffer size * * Create a new instance of #AgsSetBufferSize. * * Returns: the new #AgsSetBufferSize * * Since: 3.0.0 */ AgsSetBufferSize* ags_set_buffer_size_new(GObject *scope, guint buffer_size) { AgsSetBufferSize *set_buffer_size; set_buffer_size = (AgsSetBufferSize *) g_object_new(AGS_TYPE_SET_BUFFER_SIZE, "scope", scope, "buffer-size", buffer_size, NULL); return(set_buffer_size); } gsequencer-3.1.3/ags/audio/task/ags_set_format.h0000644000175000017500000000357213607210263016572 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SET_FORMAT_H__ #define __AGS_SET_FORMAT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SET_FORMAT (ags_set_format_get_type()) #define AGS_SET_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SET_FORMAT, AgsSetFormat)) #define AGS_SET_FORMAT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SET_FORMAT, AgsSetFormatClass)) #define AGS_IS_SET_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SET_FORMAT)) #define AGS_IS_SET_FORMAT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SET_FORMAT)) #define AGS_SET_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SET_FORMAT, AgsSetFormatClass)) typedef struct _AgsSetFormat AgsSetFormat; typedef struct _AgsSetFormatClass AgsSetFormatClass; struct _AgsSetFormat { AgsTask task; GObject *scope; guint format; }; struct _AgsSetFormatClass { AgsTaskClass task; }; GType ags_set_format_get_type(); AgsSetFormat* ags_set_format_new(GObject *scope, guint format); G_END_DECLS #endif /*__AGS_SET_FORMAT_H__*/ gsequencer-3.1.3/ags/audio/task/ags_apply_tact.c0000644000175000017500000002735513607210263016567 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_apply_tact_class_init(AgsApplyTactClass *apply_tact); void ags_apply_tact_init(AgsApplyTact *apply_tact); void ags_apply_tact_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_apply_tact_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_apply_tact_dispose(GObject *gobject); void ags_apply_tact_finalize(GObject *gobject); void ags_apply_tact_launch(AgsTask *task); void ags_apply_tact_recall(AgsApplyTact *apply_tact, AgsRecall *recall); void ags_apply_tact_channel(AgsApplyTact *apply_tact, AgsChannel *channel); void ags_apply_tact_audio(AgsApplyTact *apply_tact, AgsAudio *audio); void ags_apply_tact_soundcard(AgsApplyTact *apply_tact, GObject *soundcard); void ags_apply_tact_sequencer(AgsApplyTact *apply_tact, GObject *sequencer); void ags_apply_tact_application_context(AgsApplyTact *apply_tact, AgsApplicationContext *application_context); /** * SECTION:ags_apply_tact * @short_description: apply tact to delay audio * @title: AgsApplyTact * @section_id: * @include: ags/audio/task/recall/ags_apply_tact.h * * The #AgsApplyTact task applys tact to #AgsTactable. */ enum{ PROP_0, PROP_SCOPE, PROP_TACT, }; static gpointer ags_apply_tact_parent_class = NULL; GType ags_apply_tact_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_apply_tact = 0; static const GTypeInfo ags_apply_tact_info = { sizeof(AgsApplyTactClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_apply_tact_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsApplyTact), 0, /* n_preallocs */ (GInstanceInitFunc) ags_apply_tact_init, }; ags_type_apply_tact = g_type_register_static(AGS_TYPE_TASK, "AgsApplyTact", &ags_apply_tact_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_apply_tact); } return g_define_type_id__volatile; } void ags_apply_tact_class_init(AgsApplyTactClass *apply_tact) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_apply_tact_parent_class = g_type_class_peek_parent(apply_tact); /* GObjectClass */ gobject = (GObjectClass *) apply_tact; gobject->set_property = ags_apply_tact_set_property; gobject->get_property = ags_apply_tact_get_property; gobject->dispose = ags_apply_tact_dispose; gobject->finalize = ags_apply_tact_finalize; /* properties */ /** * AgsApplyTact:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set buffer size"), i18n_pspec("The scope of set buffer size"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsApplyTact:tact: * * The tact to apply to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_double("tact", i18n_pspec("tact"), i18n_pspec("The tact to apply"), 0, G_MAXDOUBLE, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TACT, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) apply_tact; task->launch = ags_apply_tact_launch; } void ags_apply_tact_init(AgsApplyTact *apply_tact) { apply_tact->scope = NULL; apply_tact->tact = 0.0; } void ags_apply_tact_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplyTact *apply_tact; apply_tact = AGS_APPLY_TACT(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(apply_tact->scope == (GObject *) scope){ return; } if(apply_tact->scope != NULL){ g_object_unref(apply_tact->scope); } if(scope != NULL){ g_object_ref(scope); } apply_tact->scope = (GObject *) scope; } break; case PROP_TACT: { apply_tact->tact = g_value_get_double(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_tact_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplyTact *apply_tact; apply_tact = AGS_APPLY_TACT(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, apply_tact->scope); } break; case PROP_TACT: { g_value_set_double(value, apply_tact->tact); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_tact_dispose(GObject *gobject) { AgsApplyTact *apply_tact; apply_tact = AGS_APPLY_TACT(gobject); if(apply_tact->scope != NULL){ g_object_unref(apply_tact->scope); apply_tact->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_apply_tact_parent_class)->dispose(gobject); } void ags_apply_tact_finalize(GObject *gobject) { AgsApplyTact *apply_tact; apply_tact = AGS_APPLY_TACT(gobject); if(apply_tact->scope != NULL){ g_object_unref(apply_tact->scope); } /* call parent */ G_OBJECT_CLASS(ags_apply_tact_parent_class)->finalize(gobject); } void ags_apply_tact_launch(AgsTask *task) { AgsApplyTact *apply_tact; apply_tact = AGS_APPLY_TACT(task); if(AGS_IS_APPLICATION_CONTEXT(apply_tact->scope)){ AgsApplicationContext *application_context; application_context = (AgsApplicationContext *) apply_tact->scope; ags_apply_tact_application_context(apply_tact, application_context); }else if(AGS_IS_SOUNDCARD(apply_tact->scope)){ GObject *soundcard; soundcard = apply_tact->scope; ags_apply_tact_soundcard(apply_tact, soundcard); }else if(AGS_IS_SEQUENCER(apply_tact->scope)){ GObject *sequencer; sequencer = apply_tact->scope; ags_apply_tact_sequencer(apply_tact, sequencer); }else if(AGS_IS_AUDIO(apply_tact->scope)){ AgsAudio *audio; audio = AGS_AUDIO(apply_tact->scope); ags_apply_tact_audio(apply_tact, audio); }else if(AGS_IS_CHANNEL(apply_tact->scope)){ AgsChannel *channel; channel = AGS_CHANNEL(apply_tact->scope); ags_apply_tact_channel(apply_tact, channel); }else if(AGS_IS_RECALL(apply_tact->scope)){ AgsRecall *recall; recall = AGS_RECALL(apply_tact->scope); ags_apply_tact_recall(apply_tact, recall); }else{ g_warning("AgsApplyTact: Not supported scope"); } } void ags_apply_tact_recall(AgsApplyTact *apply_tact, AgsRecall *recall) { if(AGS_IS_TACTABLE(recall)){ ags_tactable_change_tact(AGS_TACTABLE(recall), ags_tactable_get_tact(AGS_TACTABLE(recall)), apply_tact->tact); } } void ags_apply_tact_channel(AgsApplyTact *apply_tact, AgsChannel *channel) { GList *list_start, *list; /* apply tact - play */ g_object_get(channel, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_tact_recall(apply_tact, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* apply tact - recall */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_tact_recall(apply_tact, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); } void ags_apply_tact_audio(AgsApplyTact *apply_tact, AgsAudio *audio) { AgsChannel *input, *output; AgsChannel *channel, *next_channel; GList *list_start, *list; g_object_get(audio, "output", &output, "input", &input, NULL); /* apply tact - play */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_tact_recall(apply_tact, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* apply tact - recall */ g_object_get(audio, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_tact_recall(apply_tact, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* AgsChannel - output */ if(output != NULL){ channel = output; g_object_ref(channel); while(channel != NULL){ /* apply tact */ ags_apply_tact_channel(apply_tact, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(output); } /* AgsChannel - input */ if(input != NULL){ channel = input; g_object_ref(channel); while(channel != NULL){ /* apply tact */ ags_apply_tact_channel(apply_tact, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(input); } } void ags_apply_tact_soundcard(AgsApplyTact *apply_tact, GObject *soundcard) { ags_soundcard_set_delay_factor(AGS_SOUNDCARD(soundcard), apply_tact->tact); } void ags_apply_tact_sequencer(AgsApplyTact *apply_tact, GObject *sequencer) { ags_sequencer_set_delay_factor(AGS_SEQUENCER(sequencer), apply_tact->tact); } void ags_apply_tact_application_context(AgsApplyTact *apply_tact, AgsApplicationContext *application_context) { GList *list_start, *list; /* soundcard */ list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_apply_tact_soundcard(apply_tact, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); /* sequencer */ list = list_start = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_apply_tact_sequencer(apply_tact, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); /* audio */ list = list_start = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ ags_apply_tact_audio(apply_tact, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); } /** * ags_apply_tact_new: * @scope: the #GObject * @tact: the tact to apply * * Creates an #AgsApplyTact. * * Returns: an new #AgsApplyTact. * * Since: 3.0.0 */ AgsApplyTact* ags_apply_tact_new(GObject *scope, gdouble tact) { AgsApplyTact *apply_tact; apply_tact = (AgsApplyTact *) g_object_new(AGS_TYPE_APPLY_TACT, "scope", scope, "tact", tact, NULL); return(apply_tact); } gsequencer-3.1.3/ags/audio/task/ags_remove_soundcard.c0000644000175000017500000001617513607210263017764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_remove_soundcard_class_init(AgsRemoveSoundcardClass *remove_soundcard); void ags_remove_soundcard_init(AgsRemoveSoundcard *remove_soundcard); void ags_remove_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_remove_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_remove_soundcard_dispose(GObject *gobject); void ags_remove_soundcard_finalize(GObject *gobject); void ags_remove_soundcard_launch(AgsTask *task); /** * SECTION:ags_remove_soundcard * @short_description: remove soundcard object of application context * @title: AgsRemoveSoundcard * @section_id: * @include: ags/audio/task/ags_remove_soundcard.h * * The #AgsRemoveSoundcard task removes #AgsSoundcard of application context. */ static gpointer ags_remove_soundcard_parent_class = NULL; enum{ PROP_0, PROP_SOUNDCARD, }; GType ags_remove_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_remove_soundcard = 0; static const GTypeInfo ags_remove_soundcard_info = { sizeof(AgsRemoveSoundcardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_remove_soundcard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRemoveSoundcard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_remove_soundcard_init, }; ags_type_remove_soundcard = g_type_register_static(AGS_TYPE_TASK, "AgsRemoveSoundcard", &ags_remove_soundcard_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_remove_soundcard); } return g_define_type_id__volatile; } void ags_remove_soundcard_class_init(AgsRemoveSoundcardClass *remove_soundcard) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_remove_soundcard_parent_class = g_type_class_peek_parent(remove_soundcard); /* gobject */ gobject = (GObjectClass *) remove_soundcard; gobject->set_property = ags_remove_soundcard_set_property; gobject->get_property = ags_remove_soundcard_get_property; gobject->dispose = ags_remove_soundcard_dispose; gobject->finalize = ags_remove_soundcard_finalize; /* properties */ /** * AgsRemoveSoundcard:soundcard: * * The assigned #AgsSoundcard * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of remove soundcard"), i18n_pspec("The soundcard of remove soundcard task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /* task */ task = (AgsTaskClass *) remove_soundcard; task->launch = ags_remove_soundcard_launch; } void ags_remove_soundcard_init(AgsRemoveSoundcard *remove_soundcard) { remove_soundcard->soundcard = NULL; } void ags_remove_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRemoveSoundcard *remove_soundcard; remove_soundcard = AGS_REMOVE_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); if(remove_soundcard->soundcard == (GObject *) soundcard){ return; } if(remove_soundcard->soundcard != NULL){ g_object_unref(remove_soundcard->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } remove_soundcard->soundcard = (GObject *) soundcard; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRemoveSoundcard *remove_soundcard; remove_soundcard = AGS_REMOVE_SOUNDCARD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, remove_soundcard->soundcard); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_remove_soundcard_dispose(GObject *gobject) { AgsRemoveSoundcard *remove_soundcard; remove_soundcard = AGS_REMOVE_SOUNDCARD(gobject); if(remove_soundcard->soundcard != NULL){ g_object_unref(remove_soundcard->soundcard); remove_soundcard->soundcard = NULL; } /* call parent */ G_OBJECT_CLASS(ags_remove_soundcard_parent_class)->dispose(gobject); } void ags_remove_soundcard_finalize(GObject *gobject) { AgsRemoveSoundcard *remove_soundcard; remove_soundcard = AGS_REMOVE_SOUNDCARD(gobject); if(remove_soundcard->soundcard != NULL){ g_object_unref(remove_soundcard->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_remove_soundcard_parent_class)->finalize(gobject); } void ags_remove_soundcard_launch(AgsTask *task) { AgsRemoveSoundcard *remove_soundcard; AgsApplicationContext *application_context; GList *list_start; remove_soundcard = AGS_REMOVE_SOUNDCARD(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_SOUND_PROVIDER(application_context)); g_return_if_fail(AGS_IS_SOUNDCARD(remove_soundcard->soundcard)); /* remove soundcard */ list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(g_list_find(list_start, remove_soundcard->soundcard) != NULL){ ags_sound_provider_set_soundcard(AGS_SOUND_PROVIDER(application_context), g_list_remove(list_start, remove_soundcard->soundcard)); g_object_unref(remove_soundcard->soundcard); g_object_unref(remove_soundcard->soundcard); } g_list_free_full(list_start, g_object_unref); } /** * ags_remove_soundcard_new: * @soundcard: the #AgsSoundcard to remove * * Create a new instance of #AgsRemoveSoundcard. * * Returns: the new #AgsRemoveSoundcard. * * Since: 3.0.0 */ AgsRemoveSoundcard* ags_remove_soundcard_new(GObject *soundcard) { AgsRemoveSoundcard *remove_soundcard; remove_soundcard = (AgsRemoveSoundcard *) g_object_new(AGS_TYPE_REMOVE_SOUNDCARD, "soundcard", soundcard, NULL); return(remove_soundcard); } gsequencer-3.1.3/ags/audio/task/ags_set_muted.h0000644000175000017500000000354613607210263016421 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SET_MUTED_H__ #define __AGS_SET_MUTED_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SET_MUTED (ags_set_muted_get_type()) #define AGS_SET_MUTED(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SET_MUTED, AgsSetMuted)) #define AGS_SET_MUTED_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SET_MUTED, AgsSetMutedClass)) #define AGS_IS_SET_MUTED(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SET_MUTED)) #define AGS_IS_SET_MUTED_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SET_MUTED)) #define AGS_SET_MUTED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SET_MUTED, AgsSetMutedClass)) typedef struct _AgsSetMuted AgsSetMuted; typedef struct _AgsSetMutedClass AgsSetMutedClass; struct _AgsSetMuted { AgsTask task; GObject *scope; gboolean muted; }; struct _AgsSetMutedClass { AgsTaskClass task; }; GType ags_set_muted_get_type(); AgsSetMuted* ags_set_muted_new(GObject *scope, gboolean muted); G_END_DECLS #endif /*__AGS_SET_MUTED_H__*/ gsequencer-3.1.3/ags/audio/task/ags_open_single_file.c0000644000175000017500000002432613607210263017723 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_open_single_file_class_init(AgsOpenSingleFileClass *open_single_file); void ags_open_single_file_init(AgsOpenSingleFile *open_single_file); void ags_open_single_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_open_single_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_open_single_file_dispose(GObject *gobject); void ags_open_single_file_finalize(GObject *gobject); void ags_open_single_file_launch(AgsTask *task); /** * SECTION:ags_open_single_file * @short_description: open single file * @title: AgsOpenSingleFile * @section_id: * @include: ags/audio/task/ags_open_single_file.h * * The #AgsOpenFile task opens one single file. */ static gpointer ags_open_single_file_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL, PROP_FILENAME, PROP_AUDIO_CHANNEL, }; GType ags_open_single_file_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_open_single_file = 0; static const GTypeInfo ags_open_single_file_info = { sizeof(AgsOpenSingleFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_open_single_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsOpenSingleFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_open_single_file_init, }; ags_type_open_single_file = g_type_register_static(AGS_TYPE_TASK, "AgsOpenSingleFile", &ags_open_single_file_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_open_single_file); } return g_define_type_id__volatile; } void ags_open_single_file_class_init(AgsOpenSingleFileClass *open_single_file) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_open_single_file_parent_class = g_type_class_peek_parent(open_single_file); /* GObject */ gobject = (GObjectClass *) open_single_file; gobject->set_property = ags_open_single_file_set_property; gobject->get_property = ags_open_single_file_get_property; gobject->dispose = ags_open_single_file_dispose; gobject->finalize = ags_open_single_file_finalize; /* properties */ /** * AgsOpenSingleFile:channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel of open file"), i18n_pspec("The channel of open file task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsOpenSingleFile:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename containing the output"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsOpenSingleFile:audio-channel: * * The audio channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("audio channel"), i18n_pspec("The audio channel to read"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /* AgsTask */ task = (AgsTaskClass *) open_single_file; task->launch = ags_open_single_file_launch; } void ags_open_single_file_init(AgsOpenSingleFile *open_single_file) { open_single_file->channel = NULL; open_single_file->filename = NULL; open_single_file->audio_channel = 0; } void ags_open_single_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOpenSingleFile *open_single_file; open_single_file = AGS_OPEN_SINGLE_FILE(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); if(open_single_file->channel == channel){ return; } if(open_single_file->channel != NULL){ g_object_unref(open_single_file->channel); } if(channel != NULL){ g_object_ref(channel); } open_single_file->channel = channel; } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(open_single_file->filename == filename){ return; } if(open_single_file->filename != NULL){ g_free(open_single_file->filename); } open_single_file->filename = g_strdup(filename); } break; case PROP_AUDIO_CHANNEL: { open_single_file->audio_channel = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_single_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOpenSingleFile *open_single_file; open_single_file = AGS_OPEN_SINGLE_FILE(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, open_single_file->channel); } break; case PROP_FILENAME: { g_value_set_string(value, open_single_file->filename); } break; case PROP_AUDIO_CHANNEL: { g_value_set_uint(value, open_single_file->audio_channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_single_file_dispose(GObject *gobject) { AgsOpenSingleFile *open_single_file; open_single_file = AGS_OPEN_SINGLE_FILE(gobject); if(open_single_file->channel != NULL){ g_object_unref(open_single_file->channel); open_single_file->channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_open_single_file_parent_class)->dispose(gobject); } void ags_open_single_file_finalize(GObject *gobject) { AgsOpenSingleFile *open_single_file; open_single_file = AGS_OPEN_SINGLE_FILE(gobject); if(open_single_file->channel != NULL){ g_object_unref(open_single_file->channel); } g_free(open_single_file->filename); /* call parent */ G_OBJECT_CLASS(ags_open_single_file_parent_class)->finalize(gobject); } void ags_open_single_file_launch(AgsTask *task) { AgsChannel *channel; AgsChannel *link; AgsRecycling *first_recycling; AgsOpenSingleFile *open_single_file; AgsAudioFile *audio_file; AgsFileLink *file_link; GObject *soundcard; GList *audio_signal; guint i; GError *error; open_single_file = AGS_OPEN_SINGLE_FILE(task); g_return_if_fail(AGS_IS_CHANNEL(open_single_file->channel)); channel = open_single_file->channel; g_object_get(channel, "output-soundcard", &soundcard, NULL); /* open audio file and read audio signal */ audio_file = ags_audio_file_new(open_single_file->filename, soundcard, open_single_file->audio_channel); if(!ags_audio_file_open(audio_file)){ g_message("unable to open file - %s", open_single_file->filename); return; } ags_audio_file_read_audio_signal(audio_file); /* iterate channels */ audio_signal = audio_file->audio_signal; /* set link */ g_object_get(channel, "link", &link, NULL); if(link != NULL){ g_object_unref(link); } if(link != NULL){ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } /* file link */ if(AGS_IS_INPUT(channel)){ g_object_get(channel, "file-link", &file_link, NULL); if(file_link == NULL){ file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, NULL); g_object_set(channel, "file-link", file_link, NULL); } g_object_set(file_link, "filename", open_single_file->filename, "preset", NULL, "instrument", NULL, "sample", NULL, "audio-channel", open_single_file->audio_channel, NULL); g_object_unref(file_link); } /* add as template */ g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_unref(first_recycling); AGS_AUDIO_SIGNAL(audio_file->audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(first_recycling, AGS_AUDIO_SIGNAL(audio_file->audio_signal->data)); /* unref audio file */ g_object_unref(audio_file); if(soundcard != NULL){ g_object_unref(soundcard); } } /** * ags_open_single_file_new: * @channel: the #AgsChannel * @filename: the filename to be opened * @audio_channel: the audio channel * * Create a new instance of #AgsOpenSingleFile. * * Returns: the new #AgsOpenSingleFile. * * Since: 3.0.0 */ AgsOpenSingleFile* ags_open_single_file_new(AgsChannel *channel, gchar *filename, guint audio_channel) { AgsOpenSingleFile *open_single_file; open_single_file = (AgsOpenSingleFile *) g_object_new(AGS_TYPE_OPEN_SINGLE_FILE, "channel", channel, "filename", filename, "audio-channel", audio_channel, NULL); return(open_single_file); } gsequencer-3.1.3/ags/audio/task/ags_apply_presets.c0000644000175000017500000003343613607210263017316 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_apply_presets_class_init(AgsApplyPresetsClass *apply_presets); void ags_apply_presets_init(AgsApplyPresets *apply_presets); void ags_apply_presets_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_apply_presets_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_apply_presets_dispose(GObject *gobject); void ags_apply_presets_finalize(GObject *gobject); void ags_apply_presets_launch(AgsTask *task); void ags_apply_presets_audio(AgsApplyPresets *apply_presets, AgsAudio *audio); void ags_apply_presets_channel(AgsApplyPresets *apply_presets, AgsChannel *channel); void ags_apply_presets_audio_signal(AgsApplyPresets *apply_presets, AgsAudioSignal *audio_signal); /** * SECTION:ags_apply_presets * @short_description: apply presets * @title: AgsApplyPresets * @section_id: * @include: ags/audio/task/ags_apply_presets.h * * The #AgsApplyPresets task apply the specified presets. */ enum{ PROP_0, PROP_SCOPE, PROP_PCM_CHANNELS, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, }; static gpointer ags_apply_presets_parent_class = NULL; GType ags_apply_presets_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_apply_presets = 0; static const GTypeInfo ags_apply_presets_info = { sizeof(AgsApplyPresetsClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_apply_presets_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsApplyPresets), 0, /* n_preallocs */ (GInstanceInitFunc) ags_apply_presets_init, }; ags_type_apply_presets = g_type_register_static(AGS_TYPE_TASK, "AgsApplyPresets", &ags_apply_presets_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_apply_presets); } return g_define_type_id__volatile; } void ags_apply_presets_class_init(AgsApplyPresetsClass *apply_presets) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_apply_presets_parent_class = g_type_class_peek_parent(apply_presets); /* GObjectClass */ gobject = (GObjectClass *) apply_presets; gobject->set_property = ags_apply_presets_set_property; gobject->get_property = ags_apply_presets_get_property; gobject->dispose = ags_apply_presets_dispose; gobject->finalize = ags_apply_presets_finalize; /* properties */ /** * AgsApplyPresets:scope: * * The assigned #GObject * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of apply presets"), i18n_pspec("The scope of apply presets task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsApplyPresets:pcm-channels: * * The count of pcm-channels to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("pcm channel count"), i18n_pspec("The count of pcm channels"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsApplyPresets:samplerate: * * The count of samplerate to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate to apply"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsApplyPresets:buffer-size: * * The count of buffer-size to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size to apply"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsApplyPresets:format: * * The count of format to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format to apply"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) apply_presets; task->launch = ags_apply_presets_launch; } void ags_apply_presets_init(AgsApplyPresets *apply_presets) { apply_presets->scope = NULL; apply_presets->pcm_channels = 0; apply_presets->samplerate = 0; apply_presets->buffer_size = 0; apply_presets->format = 0; } void ags_apply_presets_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplyPresets *apply_presets; apply_presets = AGS_APPLY_PRESETS(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(apply_presets->scope == (GObject *) scope){ return; } if(apply_presets->scope != NULL){ g_object_unref(apply_presets->scope); } if(scope != NULL){ g_object_ref(scope); } apply_presets->scope = (GObject *) scope; } break; case PROP_PCM_CHANNELS: { apply_presets->pcm_channels = g_value_get_uint(value); } break; case PROP_SAMPLERATE: { apply_presets->samplerate = g_value_get_uint(value); } break; case PROP_BUFFER_SIZE: { apply_presets->buffer_size = g_value_get_uint(value); } break; case PROP_FORMAT: { apply_presets->format = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_presets_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplyPresets *apply_presets; apply_presets = AGS_APPLY_PRESETS(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, apply_presets->scope); } break; case PROP_PCM_CHANNELS: { g_value_set_uint(value, apply_presets->pcm_channels); } break; case PROP_SAMPLERATE: { g_value_set_uint(value, apply_presets->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, apply_presets->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, apply_presets->format); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_presets_dispose(GObject *gobject) { AgsApplyPresets *apply_presets; apply_presets = AGS_APPLY_PRESETS(gobject); if(apply_presets->scope != NULL){ g_object_unref(apply_presets->scope); apply_presets->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_apply_presets_parent_class)->dispose(gobject); } void ags_apply_presets_finalize(GObject *gobject) { AgsApplyPresets *apply_presets; apply_presets = AGS_APPLY_PRESETS(gobject); if(apply_presets->scope != NULL){ g_object_unref(apply_presets->scope); } /* call parent */ G_OBJECT_CLASS(ags_apply_presets_parent_class)->finalize(gobject); } void ags_apply_presets_launch(AgsTask *task) { AgsApplyPresets *apply_presets; apply_presets = AGS_APPLY_PRESETS(task); if(AGS_IS_SOUNDCARD(apply_presets->scope)){ ags_apply_presets_soundcard(apply_presets, apply_presets->scope); }else if(AGS_IS_AUDIO(apply_presets->scope)){ ags_apply_presets_audio(apply_presets, (AgsAudio *) apply_presets->scope); }else if(AGS_IS_CHANNEL(apply_presets->scope)){ ags_apply_presets_channel(apply_presets, (AgsChannel *) apply_presets->scope); }else if(AGS_IS_AUDIO_SIGNAL(apply_presets->scope)){ ags_apply_presets_audio_signal(apply_presets, (AgsAudioSignal *) apply_presets->scope); }else{ if(apply_presets->scope != NULL){ g_warning("ags_apply_presets_launch() - unsupported scope %s", G_OBJECT_TYPE_NAME(apply_presets->scope)); }else{ g_warning("ags_apply_presets_launch() - unsupported scope (null)0"); } } } void ags_apply_presets_soundcard(AgsApplyPresets *apply_presets, GObject *soundcard) { AgsAudio *audio; AgsThread *main_loop; AgsThread *export_thread; AgsThread *soundcard_thread; AgsThread *audio_thread; AgsThread *channel_thread; AgsApplicationContext *application_context; GList *list_start, *list; gdouble freq; guint channels; application_context = ags_application_context_get_instance(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* calculate thread frequency */ freq = ceil((gdouble) apply_presets->samplerate / (gdouble) apply_presets->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; /* reset soundcard */ ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), apply_presets->pcm_channels, apply_presets->samplerate, apply_presets->buffer_size, apply_presets->format); /* reset audio loop frequency */ g_object_set(G_OBJECT(main_loop), "frequency", freq, NULL); /* reset export thread frequency */ export_thread = ags_thread_find_type(main_loop, AGS_TYPE_EXPORT_THREAD); while(export_thread != NULL){ if(AGS_IS_EXPORT_THREAD(export_thread)){ g_object_set(export_thread, "frequency", freq, NULL); } /* iterate */ export_thread = g_atomic_pointer_get(&(export_thread->next)); } /* reset soundcard thread frequency */ soundcard_thread = ags_thread_find_type(main_loop, AGS_TYPE_SOUNDCARD_THREAD); while(soundcard_thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(export_thread)){ g_object_set(soundcard_thread, "frequency", freq, NULL); } /* iterate */ soundcard_thread = g_atomic_pointer_get(&(soundcard_thread->next)); } /* reset playback on soundcard */ if(ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard))){ ags_soundcard_stop(AGS_SOUNDCARD(soundcard)); ags_soundcard_play_init(AGS_SOUNDCARD(soundcard), &(AGS_SOUNDCARD_THREAD(soundcard_thread)->error)); } /* descend children */ list = list_start = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ audio = AGS_AUDIO(list->data); /* apply presets to audio */ ags_apply_presets_audio(apply_presets, audio); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); /* unref */ g_object_unref(main_loop); } void ags_apply_presets_audio(AgsApplyPresets *apply_presets, AgsAudio *audio) { g_object_set(audio, "samplerate", apply_presets->samplerate, "buffer-size", apply_presets->buffer_size, "format", apply_presets->format, NULL); } void ags_apply_presets_channel(AgsApplyPresets *apply_presets, AgsChannel *channel) { g_object_set(channel, "samplerate", apply_presets->samplerate, "buffer-size", apply_presets->buffer_size, "format", apply_presets->format, NULL); } void ags_apply_presets_audio_signal(AgsApplyPresets *apply_presets, AgsAudioSignal *audio_signal) { g_object_set(audio_signal, "samplerate", apply_presets->samplerate, "buffer-size", apply_presets->buffer_size, "format", apply_presets->format, NULL); } /** * ags_apply_presets_new: * @scope: a #GObject * @pcm_channels: pcm channels * @samplerate: samplerate * @buffer_size: buffer size * @format: format * * Creates a new instance of #AgsApplyPresets. * * Returns: the new #AgsApplyPresets. * * Since: 3.0.0 */ AgsApplyPresets* ags_apply_presets_new(GObject *scope, guint pcm_channels, guint samplerate, guint buffer_size, guint format) { AgsApplyPresets *apply_presets; apply_presets = (AgsApplyPresets *) g_object_new(AGS_TYPE_APPLY_PRESETS, "scope", scope, "pcm-channels", pcm_channels, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); return(apply_presets); } gsequencer-3.1.3/ags/audio/task/ags_open_wave.h0000644000175000017500000000405213607210263016404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OPEN_WAVE_H__ #define __AGS_OPEN_WAVE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OPEN_WAVE (ags_open_wave_get_type()) #define AGS_OPEN_WAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OPEN_WAVE, AgsOpenWave)) #define AGS_OPEN_WAVE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OPEN_WAVE, AgsOpenWaveClass)) #define AGS_IS_OPEN_WAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OPEN_WAVE)) #define AGS_IS_OPEN_WAVE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OPEN_WAVE)) #define AGS_OPEN_WAVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OPEN_WAVE, AgsOpenWaveClass)) typedef struct _AgsOpenWave AgsOpenWave; typedef struct _AgsOpenWaveClass AgsOpenWaveClass; struct _AgsOpenWave { AgsTask task; AgsAudio *audio; AgsAudioFile *audio_file; gchar *filename; guint start_pad; }; struct _AgsOpenWaveClass { AgsTaskClass task; }; GType ags_open_wave_get_type(); AgsOpenWave* ags_open_wave_new(AgsAudio *audio, AgsAudioFile *audio_file, gchar *filename, guint start_pad); G_END_DECLS #endif /*__AGS_OPEN_WAVE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_cancel_audio.h0000644000175000017500000000373613607210263017037 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CANCEL_AUDIO_H__ #define __AGS_CANCEL_AUDIO_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CANCEL_AUDIO (ags_cancel_audio_get_type()) #define AGS_CANCEL_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CANCEL_AUDIO, AgsCancelAudio)) #define AGS_CANCEL_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CANCEL_AUDIO, AgsCancelAudioClass)) #define AGS_IS_CANCEL_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CANCEL_AUDIO)) #define AGS_IS_CANCEL_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CANCEL_AUDIO)) #define AGS_CANCEL_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CANCEL_AUDIO, AgsCancelAudioClass)) typedef struct _AgsCancelAudio AgsCancelAudio; typedef struct _AgsCancelAudioClass AgsCancelAudioClass; struct _AgsCancelAudio { AgsTask task; AgsAudio *audio; gint sound_scope; }; struct _AgsCancelAudioClass { AgsTaskClass task; }; GType ags_cancel_audio_get_type(); AgsCancelAudio* ags_cancel_audio_new(AgsAudio *audio, gint sound_scope); G_END_DECLS #endif /*__AGS_CANCEL_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/task/ags_remove_audio.h0000644000175000017500000000365613607210263017110 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_REMOVE_AUDIO_H__ #define __AGS_REMOVE_AUDIO_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_REMOVE_AUDIO (ags_remove_audio_get_type()) #define AGS_REMOVE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_REMOVE_AUDIO, AgsRemoveAudio)) #define AGS_REMOVE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_REMOVE_AUDIO, AgsRemoveAudioClass)) #define AGS_IS_REMOVE_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_REMOVE_AUDIO)) #define AGS_IS_REMOVE_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_REMOVE_AUDIO)) #define AGS_REMOVE_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_REMOVE_AUDIO, AgsRemoveAudioClass)) typedef struct _AgsRemoveAudio AgsRemoveAudio; typedef struct _AgsRemoveAudioClass AgsRemoveAudioClass; struct _AgsRemoveAudio { AgsTask task; AgsAudio *audio; }; struct _AgsRemoveAudioClass { AgsTaskClass task; }; GType ags_remove_audio_get_type(); AgsRemoveAudio* ags_remove_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_REMOVE_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/task/ags_set_samplerate.h0000644000175000017500000000375513607210263017442 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SET_SAMPLERATE_H__ #define __AGS_SET_SAMPLERATE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SET_SAMPLERATE (ags_set_samplerate_get_type()) #define AGS_SET_SAMPLERATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SET_SAMPLERATE, AgsSetSamplerate)) #define AGS_SET_SAMPLERATE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SET_SAMPLERATE, AgsSetSamplerateClass)) #define AGS_IS_SET_SAMPLERATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SET_SAMPLERATE)) #define AGS_IS_SET_SAMPLERATE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SET_SAMPLERATE)) #define AGS_SET_SAMPLERATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SET_SAMPLERATE, AgsSetSamplerateClass)) typedef struct _AgsSetSamplerate AgsSetSamplerate; typedef struct _AgsSetSamplerateClass AgsSetSamplerateClass; struct _AgsSetSamplerate { AgsTask task; GObject *scope; guint samplerate; }; struct _AgsSetSamplerateClass { AgsTaskClass task; }; GType ags_set_samplerate_get_type(); AgsSetSamplerate* ags_set_samplerate_new(GObject *scope, guint samplerate); G_END_DECLS #endif /*__AGS_SET_SAMPLERATE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_apply_bpm.h0000644000175000017500000000354013607210263016405 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLY_BPM_H__ #define __AGS_APPLY_BPM_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLY_BPM (ags_apply_bpm_get_type()) #define AGS_APPLY_BPM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLY_BPM, AgsApplyBpm)) #define AGS_APPLY_BPM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_APPLY_BPM, AgsApplyBpmClass)) #define AGS_IS_APPLY_BPM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLY_BPM)) #define AGS_IS_APPLY_BPM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_APPLY_BPM)) #define AGS_APPLY_BPM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_APPLY_BPM, AgsApplyBpmClass)) typedef struct _AgsApplyBpm AgsApplyBpm; typedef struct _AgsApplyBpmClass AgsApplyBpmClass; struct _AgsApplyBpm { AgsTask task; GObject *scope; gdouble bpm; }; struct _AgsApplyBpmClass { AgsTaskClass task; }; GType ags_apply_bpm_get_type(); AgsApplyBpm* ags_apply_bpm_new(GObject *scope, gdouble bpm); G_END_DECLS #endif /*__AGS_APPLY_BPM_H__*/ gsequencer-3.1.3/ags/audio/task/ags_apply_sound_config.h0000644000175000017500000000405213607210263020303 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLY_SOUND_CONFIG_H__ #define __AGS_APPLY_SOUND_CONFIG_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLY_SOUND_CONFIG (ags_apply_sound_config_get_type()) #define AGS_APPLY_SOUND_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLY_SOUND_CONFIG, AgsApplySoundConfig)) #define AGS_APPLY_SOUND_CONFIG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_APPLY_SOUND_CONFIG, AgsApplySoundConfigClass)) #define AGS_IS_APPLY_SOUND_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLY_SOUND_CONFIG)) #define AGS_IS_APPLY_SOUND_CONFIG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_APPLY_SOUND_CONFIG)) #define AGS_APPLY_SOUND_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_APPLY_SOUND_CONFIG, AgsApplySoundConfigClass)) typedef struct _AgsApplySoundConfig AgsApplySoundConfig; typedef struct _AgsApplySoundConfigClass AgsApplySoundConfigClass; struct _AgsApplySoundConfig { AgsTask task; gchar *config_data; }; struct _AgsApplySoundConfigClass { AgsTaskClass task; }; GType ags_apply_sound_config_get_type(); AgsApplySoundConfig* ags_apply_sound_config_new(gchar *config_data); G_END_DECLS #endif /*__AGS_APPLY_SOUND_CONFIG_H__*/ gsequencer-3.1.3/ags/audio/task/ags_open_sf2_sample.h0000644000175000017500000000453213607210263017500 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OPEN_SF2_SAMPLE_H__ #define __AGS_OPEN_SF2_SAMPLE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OPEN_SF2_SAMPLE (ags_open_sf2_sample_get_type()) #define AGS_OPEN_SF2_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OPEN_SF2_SAMPLE, AgsOpenSf2Sample)) #define AGS_OPEN_SF2_SAMPLE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OPEN_SF2_SAMPLE, AgsOpenSf2SampleClass)) #define AGS_IS_OPEN_SF2_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OPEN_SF2_SAMPLE)) #define AGS_IS_OPEN_SF2_SAMPLE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_OPEN_SF2_SAMPLE)) #define AGS_OPEN_SF2_SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OPEN_SF2_SAMPLE, AgsOpenSf2SampleClass)) typedef struct _AgsOpenSf2Sample AgsOpenSf2Sample; typedef struct _AgsOpenSf2SampleClass AgsOpenSf2SampleClass; struct _AgsOpenSf2Sample { AgsTask task; AgsChannel *channel; AgsIpatchSample *ipatch_sample; gchar *filename; gchar *preset; gchar *instrument; gchar *sample; guint audio_channel; }; struct _AgsOpenSf2SampleClass { AgsTaskClass task; }; GType ags_open_sf2_sample_get_type(); AgsOpenSf2Sample* ags_open_sf2_sample_new(AgsChannel *channel, AgsIpatchSample *ipatch_sample, gchar *filename, gchar *preset, gchar *instrument, gchar *sample, guint audio_channel); G_END_DECLS #endif /*__AGS_OPEN_SF2_SAMPLE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_set_device.c0000644000175000017500000001537513607210263016540 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_set_device_class_init(AgsSetDeviceClass *set_device); void ags_set_device_init(AgsSetDevice *set_device); void ags_set_device_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_set_device_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_set_device_dispose(GObject *gobject); void ags_set_device_finalize(GObject *gobject); void ags_set_device_launch(AgsTask *task); /** * SECTION:ags_set_device * @short_description: set device * @title: AgsSetDevice * @section_id: * @include: ags/audio/task/ags_set_device.h * * The #AgsSetDevice task sets device of #AgsSoundcard or #AgsSequencer. */ static gpointer ags_set_device_parent_class = NULL; enum{ PROP_0, PROP_SCOPE, PROP_DEVICE, }; GType ags_set_device_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_set_device = 0; static const GTypeInfo ags_set_device_info = { sizeof(AgsSetDeviceClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_set_device_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSetDevice), 0, /* n_preallocs */ (GInstanceInitFunc) ags_set_device_init, }; ags_type_set_device = g_type_register_static(AGS_TYPE_TASK, "AgsSetDevice", &ags_set_device_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_set_device); } return g_define_type_id__volatile; } void ags_set_device_class_init(AgsSetDeviceClass *set_device) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_set_device_parent_class = g_type_class_peek_parent(set_device); /* gobject */ gobject = (GObjectClass *) set_device; gobject->set_property = ags_set_device_set_property; gobject->get_property = ags_set_device_get_property; gobject->dispose = ags_set_device_dispose; gobject->finalize = ags_set_device_finalize; /* properties */ /** * AgsSetDevice:scope: * * The assigned #AgsSoundcard or #AgsSequencer instance. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope to set device"), i18n_pspec("The scope to set device"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsSetDevice:device: * * The device to set. * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("device"), i18n_pspec("The device"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /* task */ task = (AgsTaskClass *) set_device; task->launch = ags_set_device_launch; } void ags_set_device_init(AgsSetDevice *set_device) { set_device->scope = NULL; set_device->device = NULL; } void ags_set_device_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSetDevice *set_device; set_device = AGS_SET_DEVICE(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(set_device->scope == (GObject *) scope){ return; } if(set_device->scope != NULL){ g_object_unref(set_device->scope); } if(scope != NULL){ g_object_ref(scope); } set_device->scope = (GObject *) scope; } break; case PROP_DEVICE: { gchar *device; device = g_value_get_string(value); if(device == set_device->device){ return; } g_free(set_device->device); set_device->device = g_strdup(device); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_device_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSetDevice *set_device; set_device = AGS_SET_DEVICE(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, set_device->scope); } break; case PROP_DEVICE: { g_value_set_string(value, set_device->device); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_device_dispose(GObject *gobject) { AgsSetDevice *set_device; set_device = AGS_SET_DEVICE(gobject); if(set_device->scope != NULL){ g_object_unref(set_device->scope); set_device->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_set_device_parent_class)->dispose(gobject); } void ags_set_device_finalize(GObject *gobject) { AgsSetDevice *set_device; set_device = AGS_SET_DEVICE(gobject); if(set_device->scope != NULL){ g_object_unref(set_device->scope); } g_free(set_device->device); /* call parent */ G_OBJECT_CLASS(ags_set_device_parent_class)->finalize(gobject); } void ags_set_device_launch(AgsTask *task) { AgsSetDevice *set_device; set_device = AGS_SET_DEVICE(task); /* set audio channels */ if(AGS_IS_SOUNDCARD(set_device->scope)){ ags_soundcard_set_device(AGS_SOUNDCARD(set_device->scope), set_device->device); }else if(AGS_IS_SEQUENCER(set_device->scope)){ ags_sequencer_set_device(AGS_SEQUENCER(set_device->scope), set_device->device); } } /** * ags_set_device_new: * @scope: the #AgsSoundcard or #AgsSequencer to reset * @device: the device as string * * Create a new instance of #AgsSetDevice. * * Returns: the new #AgsSetDevice. * * Since: 3.0.0 */ AgsSetDevice* ags_set_device_new(GObject *scope, gchar *device) { AgsSetDevice *set_device; set_device = (AgsSetDevice *) g_object_new(AGS_TYPE_SET_DEVICE, "scope", scope, "device", device, NULL); return(set_device); } gsequencer-3.1.3/ags/audio/task/ags_start_audio.c0000644000175000017500000001555313607210263016742 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_start_audio_class_init(AgsStartAudioClass *start_audio); void ags_start_audio_init(AgsStartAudio *start_audio); void ags_start_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_start_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_start_audio_dispose(GObject *gobject); void ags_start_audio_finalize(GObject *gobject); void ags_start_audio_launch(AgsTask *task); /** * SECTION:ags_start_audio * @short_description: start audio object to audio loop * @title: AgsStartAudio * @section_id: * @include: ags/audio/task/ags_start_audio.h * * The #AgsStartAudio task starts #AgsAudio to #AgsAudioLoop. */ static gpointer ags_start_audio_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_SOUND_SCOPE, }; GType ags_start_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_start_audio = 0; static const GTypeInfo ags_start_audio_info = { sizeof(AgsStartAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_start_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsStartAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_start_audio_init, }; ags_type_start_audio = g_type_register_static(AGS_TYPE_TASK, "AgsStartAudio", &ags_start_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_start_audio); } return g_define_type_id__volatile; } void ags_start_audio_class_init(AgsStartAudioClass *start_audio) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_start_audio_parent_class = g_type_class_peek_parent(start_audio); /* gobject */ gobject = (GObjectClass *) start_audio; gobject->set_property = ags_start_audio_set_property; gobject->get_property = ags_start_audio_get_property; gobject->dispose = ags_start_audio_dispose; gobject->finalize = ags_start_audio_finalize; /* properties */ /** * AgsStartAudio:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of start audio"), i18n_pspec("The audio of start audio task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsStartAudio:sound-scope: * * The effects sound-scope. * * Since: 3.0.0 */ param_spec = g_param_spec_int("sound-scope", i18n_pspec("sound scope"), i18n_pspec("The sound scope"), -1, AGS_SOUND_SCOPE_LAST, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUND_SCOPE, param_spec); /* task */ task = (AgsTaskClass *) start_audio; task->launch = ags_start_audio_launch; } void ags_start_audio_init(AgsStartAudio *start_audio) { start_audio->audio = NULL; start_audio->sound_scope = -1; } void ags_start_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStartAudio *start_audio; start_audio = AGS_START_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(start_audio->audio == audio){ return; } if(start_audio->audio != NULL){ g_object_unref(start_audio->audio); } if(audio != NULL){ g_object_ref(audio); } start_audio->audio = audio; } break; case PROP_SOUND_SCOPE: { start_audio->sound_scope = g_value_get_int(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStartAudio *start_audio; start_audio = AGS_START_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, start_audio->audio); } break; case PROP_SOUND_SCOPE: { g_value_set_int(value, start_audio->sound_scope); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_audio_dispose(GObject *gobject) { AgsStartAudio *start_audio; start_audio = AGS_START_AUDIO(gobject); if(start_audio->audio != NULL){ g_object_unref(start_audio->audio); start_audio->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_start_audio_parent_class)->dispose(gobject); } void ags_start_audio_finalize(GObject *gobject) { AgsStartAudio *start_audio; start_audio = AGS_START_AUDIO(gobject); if(start_audio->audio != NULL){ g_object_unref(start_audio->audio); } /* call parent */ G_OBJECT_CLASS(ags_start_audio_parent_class)->finalize(gobject); } void ags_start_audio_launch(AgsTask *task) { AgsAudio *audio; AgsStartAudio *start_audio; GList *recall_id; gint sound_scope; start_audio = AGS_START_AUDIO(task); g_return_if_fail(AGS_IS_AUDIO(start_audio->audio)); g_object_get(start_audio, "audio", &audio, "sound-scope", &sound_scope, NULL); recall_id = ags_audio_start(audio, sound_scope); g_object_unref(audio); g_list_free_full(recall_id, g_object_unref); } /** * ags_start_audio_new: * @audio: the #AgsAudio to start * @sound_scope: the #AgsSoundScope-enum or -1 for all * * Create a new instance of #AgsStartAudio. * * Returns: the new #AgsStartAudio. * * Since: 3.0.0 */ AgsStartAudio* ags_start_audio_new(AgsAudio *audio, gint sound_scope) { AgsStartAudio *start_audio; start_audio = (AgsStartAudio *) g_object_new(AGS_TYPE_START_AUDIO, "audio", audio, "sound-scope", sound_scope, NULL); return(start_audio); } gsequencer-3.1.3/ags/audio/task/ags_start_soundcard.h0000644000175000017500000000367213607210263017627 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_START_SOUNDCARD_H__ #define __AGS_START_SOUNDCARD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_START_SOUNDCARD (ags_start_soundcard_get_type()) #define AGS_START_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_START_SOUNDCARD, AgsStartSoundcard)) #define AGS_START_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_START_SOUNDCARD, AgsStartSoundcardClass)) #define AGS_IS_START_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_START_SOUNDCARD)) #define AGS_IS_START_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_START_SOUNDCARD)) #define AGS_START_SOUNDCARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_START_SOUNDCARD, AgsStartSoundcardClass)) typedef struct _AgsStartSoundcard AgsStartSoundcard; typedef struct _AgsStartSoundcardClass AgsStartSoundcardClass; struct _AgsStartSoundcard { AgsTask task; }; struct _AgsStartSoundcardClass { AgsTaskClass task; }; GType ags_start_soundcard_get_type(); AgsStartSoundcard* ags_start_soundcard_new(); G_END_DECLS #endif /*__AGS_START_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/audio/task/ags_clear_audio_signal.h0000644000175000017500000000414713607210263020232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CLEAR_AUDIO_SIGNAL_H__ #define __AGS_CLEAR_AUDIO_SIGNAL_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CLEAR_AUDIO_SIGNAL (ags_clear_audio_signal_get_type()) #define AGS_CLEAR_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CLEAR_AUDIO_SIGNAL, AgsClearAudioSignal)) #define AGS_CLEAR_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CLEAR_AUDIO_SIGNAL, AgsClearAudioSignalClass)) #define AGS_IS_CLEAR_AUDIO_SIGNAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CLEAR_AUDIO_SIGNAL)) #define AGS_IS_CLEAR_AUDIO_SIGNAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CLEAR_AUDIO_SIGNAL)) #define AGS_CLEAR_AUDIO_SIGNAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CLEAR_AUDIO_SIGNAL, AgsClearAudioSignalClass)) typedef struct _AgsClearAudioSignal AgsClearAudioSignal; typedef struct _AgsClearAudioSignalClass AgsClearAudioSignalClass; struct _AgsClearAudioSignal { AgsTask task; AgsAudioSignal *audio_signal; }; struct _AgsClearAudioSignalClass { AgsTaskClass task; }; GType ags_clear_audio_signal_get_type(); AgsClearAudioSignal* ags_clear_audio_signal_new(AgsAudioSignal *audio_signal); G_END_DECLS #endif /*__AGS_CLEAR_AUDIO_SIGNAL_H__*/ gsequencer-3.1.3/ags/audio/task/ags_switch_buffer_flag.h0000644000175000017500000000404513607210263020246 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SWITCH_BUFFER_FLAG_H__ #define __AGS_SWITCH_BUFFER_FLAG_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SWITCH_BUFFER_FLAG (ags_switch_buffer_flag_get_type()) #define AGS_SWITCH_BUFFER_FLAG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SWITCH_BUFFER_FLAG, AgsSwitchBufferFlag)) #define AGS_SWITCH_BUFFER_FLAG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SWITCH_BUFFER_FLAG, AgsSwitchBufferFlagClass)) #define AGS_IS_SWITCH_BUFFER_FLAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SWITCH_BUFFER_FLAG)) #define AGS_IS_SWITCH_BUFFER_FLAG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SWITCH_BUFFER_FLAG)) #define AGS_SWITCH_BUFFER_FLAG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SWITCH_BUFFER_FLAG, AgsSwitchBufferFlagClass)) typedef struct _AgsSwitchBufferFlag AgsSwitchBufferFlag; typedef struct _AgsSwitchBufferFlagClass AgsSwitchBufferFlagClass; struct _AgsSwitchBufferFlag { AgsTask task; GObject *device; }; struct _AgsSwitchBufferFlagClass { AgsTaskClass task; }; GType ags_switch_buffer_flag_get_type(); AgsSwitchBufferFlag* ags_switch_buffer_flag_new(GObject *device); G_END_DECLS #endif /*__AGS_SWITCH_BUFFER_FLAG_H__*/ gsequencer-3.1.3/ags/audio/task/ags_toggle_pattern_bit.h0000644000175000017500000000462213607210263020300 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TOGGLE_PATTERN_BIT_H__ #define __AGS_TOGGLE_PATTERN_BIT_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TOGGLE_PATTERN_BIT (ags_toggle_pattern_bit_get_type()) #define AGS_TOGGLE_PATTERN_BIT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TOGGLE_PATTERN_BIT, AgsTogglePatternBit)) #define AGS_TOGGLE_PATTERN_BIT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TOGGLE_PATTERN_BIT, AgsTogglePatternBitClass)) #define AGS_IS_TOGGLE_PATTERN_BIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TOGGLE_PATTERN_BIT)) #define AGS_IS_TOGGLE_PATTERN_BIT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TOGGLE_PATTERN_BIT)) #define AGS_TOGGLE_PATTERN_BIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_TOGGLE_PATTERN_BIT, AgsTogglePatternBitClass)) typedef struct _AgsTogglePatternBit AgsTogglePatternBit; typedef struct _AgsTogglePatternBitClass AgsTogglePatternBitClass; struct _AgsTogglePatternBit { AgsTask task; AgsPattern *pattern; guint line; guint index_i; guint index_j; guint bit; }; struct _AgsTogglePatternBitClass { AgsTaskClass task; void (*refresh_gui)(AgsTogglePatternBit *toggle_pattern_bit); }; GType ags_toggle_pattern_bit_get_type(); void ags_toggle_pattern_bit_refresh_gui(AgsTogglePatternBit *toggle_pattern_bit); AgsTogglePatternBit* ags_toggle_pattern_bit_new(AgsPattern *pattern, guint line, guint index_i, guint index_j, guint bit); G_END_DECLS #endif /*__AGS_TOGGLE_PATTERN_BIT_H__*/ gsequencer-3.1.3/ags/audio/task/ags_stop_soundcard.h0000644000175000017500000000364013607210263017452 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STOP_SOUNDCARD_H__ #define __AGS_STOP_SOUNDCARD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_STOP_SOUNDCARD (ags_stop_soundcard_get_type()) #define AGS_STOP_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_STOP_SOUNDCARD, AgsStopSoundcard)) #define AGS_STOP_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_STOP_SOUNDCARD, AgsStopSoundcardClass)) #define AGS_IS_STOP_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_STOP_SOUNDCARD)) #define AGS_IS_STOP_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_STOP_SOUNDCARD)) #define AGS_STOP_SOUNDCARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_STOP_SOUNDCARD, AgsStopSoundcardClass)) typedef struct _AgsStopSoundcard AgsStopSoundcard; typedef struct _AgsStopSoundcardClass AgsStopSoundcardClass; struct _AgsStopSoundcard { AgsTask task; }; struct _AgsStopSoundcardClass { AgsTaskClass task; }; GType ags_stop_soundcard_get_type(); AgsStopSoundcard* ags_stop_soundcard_new(); G_END_DECLS #endif /*__AGS_STOP_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/audio/task/ags_reset_amplitude.h0000644000175000017500000000443413607210263017613 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RESET_AMPLITUDE_H__ #define __AGS_RESET_AMPLITUDE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RESET_AMPLITUDE (ags_reset_amplitude_get_type()) #define AGS_RESET_AMPLITUDE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RESET_AMPLITUDE, AgsResetAmplitude)) #define AGS_RESET_AMPLITUDE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RESET_AMPLITUDE, AgsResetAmplitudeClass)) #define AGS_IS_RESET_AMPLITUDE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RESET_AMPLITUDE)) #define AGS_IS_RESET_AMPLITUDE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RESET_AMPLITUDE)) #define AGS_RESET_AMPLITUDE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RESET_AMPLITUDE, AgsResetAmplitudeClass)) typedef struct _AgsResetAmplitude AgsResetAmplitude; typedef struct _AgsResetAmplitudeClass AgsResetAmplitudeClass; struct _AgsResetAmplitude { AgsTask task; GList *analyse_channel; }; struct _AgsResetAmplitudeClass { AgsTaskClass task; }; GType ags_reset_amplitude_get_type(); void ags_reset_amplitude_add(AgsResetAmplitude *reset_amplitude, AgsAnalyseChannel *analyse_channel); void ags_reset_amplitude_remove(AgsResetAmplitude *reset_amplitude, AgsAnalyseChannel *analyse_channel); AgsResetAmplitude* ags_reset_amplitude_get_instance(); AgsResetAmplitude* ags_reset_amplitude_new(); G_END_DECLS #endif /*__AGS_RESET_AMPLITUDE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_start_channel.c0000644000175000017500000001626713607210263017254 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_start_channel_class_init(AgsStartChannelClass *start_channel); void ags_start_channel_init(AgsStartChannel *start_channel); void ags_start_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_start_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_start_channel_dispose(GObject *gobject); void ags_start_channel_finalize(GObject *gobject); void ags_start_channel_launch(AgsTask *task); /** * SECTION:ags_start_channel * @short_description: start channel object to audio loop * @title: AgsStartChannel * @section_id: * @include: ags/audio/task/ags_start_channel.h * * The #AgsStartChannel task starts #AgsChannel to #AgsAudioLoop. */ static gpointer ags_start_channel_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL, PROP_SOUND_SCOPE, }; GType ags_start_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_start_channel = 0; static const GTypeInfo ags_start_channel_info = { sizeof (AgsStartChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_start_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsStartChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_start_channel_init, }; ags_type_start_channel = g_type_register_static(AGS_TYPE_TASK, "AgsStartChannel", &ags_start_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_start_channel); } return g_define_type_id__volatile; } void ags_start_channel_class_init(AgsStartChannelClass *start_channel) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_start_channel_parent_class = g_type_class_peek_parent(start_channel); /* GObjectClass */ gobject = (GObjectClass *) start_channel; gobject->set_property = ags_start_channel_set_property; gobject->get_property = ags_start_channel_get_property; gobject->dispose = ags_start_channel_dispose; gobject->finalize = ags_start_channel_finalize; /* properties */ /** * AgsStartChannel:channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel of start channel"), i18n_pspec("The channel of start channel task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsStartChannel:sound-scope: * * The effects sound-scope. * * Since: 3.0.0 */ param_spec = g_param_spec_int("sound-scope", i18n_pspec("sound scope"), i18n_pspec("The sound scope"), -1, AGS_SOUND_SCOPE_LAST, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUND_SCOPE, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) start_channel; task->launch = ags_start_channel_launch; } void ags_start_channel_init(AgsStartChannel *start_channel) { start_channel->channel = NULL; start_channel->sound_scope = -1; } void ags_start_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStartChannel *start_channel; start_channel = AGS_START_CHANNEL(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); if(start_channel->channel == channel){ return; } if(start_channel->channel != NULL){ g_object_unref(start_channel->channel); } if(channel != NULL){ g_object_ref(channel); } start_channel->channel = channel; } break; case PROP_SOUND_SCOPE: { start_channel->sound_scope = g_value_get_int(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStartChannel *start_channel; start_channel = AGS_START_CHANNEL(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, start_channel->channel); } break; case PROP_SOUND_SCOPE: { g_value_set_int(value, start_channel->sound_scope); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_channel_dispose(GObject *gobject) { AgsStartChannel *start_channel; start_channel = AGS_START_CHANNEL(gobject); if(start_channel->channel != NULL){ g_object_unref(start_channel->channel); start_channel->channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_start_channel_parent_class)->dispose(gobject); } void ags_start_channel_finalize(GObject *gobject) { AgsStartChannel *start_channel; start_channel = AGS_START_CHANNEL(gobject); if(start_channel->channel != NULL){ g_object_unref(start_channel->channel); } /* call parent */ G_OBJECT_CLASS(ags_start_channel_parent_class)->finalize(gobject); } void ags_start_channel_launch(AgsTask *task) { AgsChannel *channel; AgsStartChannel *start_channel; GList *recall_id; gint sound_scope; start_channel = AGS_START_CHANNEL(task); g_return_if_fail(AGS_IS_CHANNEL(start_channel->channel)); g_object_get(start_channel, "channel", &channel, "sound-scope", &sound_scope, NULL); recall_id = ags_channel_start(channel, sound_scope); g_object_unref(channel); g_list_free_full(recall_id, g_object_unref); } /** * ags_start_channel_new: * @channel: the #AgsChannel to start * @sound_scope: the sound scope * * Create a new instance of #AgsStartChannel. * * Returns: the new #AgsStartChannel. * * Since: 3.0.0 */ AgsStartChannel* ags_start_channel_new(AgsChannel *channel, gint sound_scope) { AgsStartChannel *start_channel; start_channel = (AgsStartChannel *) g_object_new(AGS_TYPE_START_CHANNEL, "channel", channel, "sound-scope", sound_scope, NULL); return(start_channel); } gsequencer-3.1.3/ags/audio/task/ags_export_output.c0000644000175000017500000002765113607210263017367 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_export_output_class_init(AgsExportOutputClass *export_output); void ags_export_output_init(AgsExportOutput *export_output); void ags_export_output_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_export_output_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_export_output_dispose(GObject *gobject); void ags_export_output_finalize(GObject *gobject); void ags_export_output_launch(AgsTask *task); /** * SECTION:ags_export_output * @short_description: export output task * @title: AgsExportOutput * @section_id: * @include: ags/audio/task/ags_export_output.h * * The #AgsExportOutput task exports #GObject to file. */ static gpointer ags_export_output_parent_class = NULL; enum{ PROP_0, PROP_EXPORT_THREAD, PROP_SOUNDCARD, PROP_FILENAME, PROP_FORMAT, PROP_TIC, PROP_LIVE_PERFORMANCE, }; GType ags_export_output_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_export_output = 0; static const GTypeInfo ags_export_output_info = { sizeof(AgsExportOutputClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_export_output_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsExportOutput), 0, /* n_preallocs */ (GInstanceInitFunc) ags_export_output_init, }; ags_type_export_output = g_type_register_static(AGS_TYPE_TASK, "AgsExportOutput", &ags_export_output_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_export_output); } return g_define_type_id__volatile; } void ags_export_output_class_init(AgsExportOutputClass *export_output) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_export_output_parent_class = g_type_class_peek_parent(export_output); /* gobject */ gobject = (GObjectClass *) export_output; gobject->set_property = ags_export_output_set_property; gobject->get_property = ags_export_output_get_property; gobject->dispose = ags_export_output_dispose; gobject->finalize = ags_export_output_finalize; /* properties */ /** * AgsExportOutput:export-thread: * * The assigned #AgsExportThread * * Since: 3.0.0 */ param_spec = g_param_spec_object("export-thread", i18n_pspec("export thread of export output"), i18n_pspec("The export thread of export output task"), AGS_TYPE_EXPORT_THREAD, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EXPORT_THREAD, param_spec); /** * AgsExportOutput:soundcard: * * The assigned #AgsSoundcard * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of export output"), i18n_pspec("The soundcard of export output task"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsExportOutput:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename containing the output"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsExportOutput:format: * * Format to use. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("audio format"), i18n_pspec("The audio format to use"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsExportOutput:tic: * * Tic offset of output as end tic of it. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("tic", i18n_pspec("tic offset"), i18n_pspec("The tic offset"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIC, param_spec); /** * AgsExportOutput:live-performance: * * Do output the audio export live. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("live-performance", i18n_pspec("export output live"), i18n_pspec("Do export output live"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LIVE_PERFORMANCE, param_spec); /* task */ task = (AgsTaskClass *) export_output; task->launch = ags_export_output_launch; } void ags_export_output_init(AgsExportOutput *export_output) { export_output->export_thread = NULL; export_output->soundcard = NULL; export_output->filename = NULL; export_output->format = 0; export_output->tic = 0; export_output->live_performance = TRUE; } void ags_export_output_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsExportOutput *export_output; export_output = AGS_EXPORT_OUTPUT(gobject); switch(prop_id){ case PROP_EXPORT_THREAD: { AgsExportThread *export_thread; export_thread = (AgsExportThread *) g_value_get_object(value); if(export_output->export_thread == export_thread){ return; } if(export_output->export_thread != NULL){ g_object_unref(export_output->export_thread); } if(export_thread != NULL){ g_object_ref(export_thread); } export_output->export_thread = export_thread; } break; case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); if(export_output->soundcard == (GObject *) soundcard){ return; } if(export_output->soundcard != NULL){ g_object_unref(export_output->soundcard); } if(soundcard != NULL){ g_object_ref(soundcard); } export_output->soundcard = (GObject *) soundcard; } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(export_output->filename == filename){ return; } if(export_output->filename != NULL){ g_free(export_output->filename); } export_output->filename = g_strdup(filename); } break; case PROP_FORMAT: { export_output->format = g_value_get_uint(value); } break; case PROP_TIC: { export_output->tic = g_value_get_uint(value); } break; case PROP_LIVE_PERFORMANCE: { export_output->live_performance = g_value_get_boolean(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_output_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsExportOutput *export_output; export_output = AGS_EXPORT_OUTPUT(gobject); switch(prop_id){ case PROP_EXPORT_THREAD: { g_value_set_object(value, export_output->export_thread); } break; case PROP_SOUNDCARD: { g_value_set_object(value, export_output->soundcard); } break; case PROP_FILENAME: { g_value_set_string(value, export_output->filename); } break; case PROP_FORMAT: { g_value_set_uint(value, export_output->format); } case PROP_TIC: { g_value_set_uint(value, export_output->tic); } break; case PROP_LIVE_PERFORMANCE: { g_value_set_boolean(value, export_output->live_performance); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_output_dispose(GObject *gobject) { AgsExportOutput *export_output; export_output = AGS_EXPORT_OUTPUT(gobject); if(export_output->export_thread != NULL){ g_object_unref(export_output->export_thread); export_output->export_thread = NULL; } if(export_output->soundcard != NULL){ g_object_unref(export_output->soundcard); export_output->soundcard = NULL; } if(export_output->filename != NULL){ g_free(export_output->filename); export_output->filename = NULL; } /* call parent */ G_OBJECT_CLASS(ags_export_output_parent_class)->dispose(gobject); } void ags_export_output_finalize(GObject *gobject) { AgsExportOutput *export_output; export_output = AGS_EXPORT_OUTPUT(gobject); if(export_output->export_thread != NULL){ g_object_unref(export_output->export_thread); } if(export_output->soundcard != NULL){ g_object_unref(export_output->soundcard); } if(export_output->filename != NULL){ g_free(export_output->filename); } /* call parent */ G_OBJECT_CLASS(ags_export_output_parent_class)->finalize(gobject); } void ags_export_output_launch(AgsTask *task) { AgsAudioFile *audio_file; AgsExportOutput *export_output; AgsExportThread *export_thread; GObject *soundcard; gchar *filename; guint pcm_channels; guint samplerate; guint format; guint tic; guint val; export_output = AGS_EXPORT_OUTPUT(task); g_return_if_fail(AGS_IS_EXPORT_THREAD(export_output->export_thread)); g_return_if_fail(AGS_IS_SOUNDCARD(export_output->soundcard)); g_return_if_fail(export_output->filename != NULL); export_thread = export_output->export_thread; soundcard = export_output->soundcard; filename = export_output->filename; tic = export_output->tic; /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), &pcm_channels, &samplerate, NULL, &format); /* open read/write audio file */ audio_file = ags_audio_file_new(filename, soundcard, -1); #ifdef AGS_DEBUG g_message("pcm - %d", pcm_channels); #endif audio_file->file_audio_channels = pcm_channels; audio_file->file_samplerate = (int) samplerate; ags_audio_file_rw_open(audio_file, TRUE); //TODO:JK: more formats g_message("export output"); #ifdef AGS_DEBUG #endif /* start export thread */ g_object_set(G_OBJECT(export_thread), "audio-file", audio_file, "tic", tic, NULL); } /** * ags_export_output_new: * @export_thread: the #AgsExportThread to start * @soundcard: the #GObject to export * @filename: the filename to save * @tic: stream duration in tact * @live_performance: if %TRUE export is done during real-time * * Creates an #AgsExportOutput. * * Returns: an new #AgsExportOutput. * * Since: 3.0.0 */ AgsExportOutput* ags_export_output_new(AgsExportThread *export_thread, GObject *soundcard, gchar *filename, guint tic, gboolean live_performance) { AgsExportOutput *export_output; export_output = (AgsExportOutput *) g_object_new(AGS_TYPE_EXPORT_OUTPUT, "export-thread", export_thread, "soundcard", soundcard, "filename", filename, "tic", tic, "live-performance", live_performance, NULL); return(export_output); } gsequencer-3.1.3/ags/audio/task/ags_open_sf2_sample.c0000644000175000017500000003620213607210263017472 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_open_sf2_sample_class_init(AgsOpenSf2SampleClass *open_sf2_sample); void ags_open_sf2_sample_init(AgsOpenSf2Sample *open_sf2_sample); void ags_open_sf2_sample_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_open_sf2_sample_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_open_sf2_sample_dispose(GObject *gobject); void ags_open_sf2_sample_finalize(GObject *gobject); void ags_open_sf2_sample_launch(AgsTask *task); /** * SECTION:ags_open_sf2_sample * @short_description: open Soundfont2 sample * @title: AgsOpenSf2Sample * @section_id: * @include: ags/audio/task/ags_open_sf2_sample.h * * The #AgsOpenSf2Sample task opens Soundfont2 samples. */ static gpointer ags_open_sf2_sample_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL, PROP_IPATCH_SAMPLE, PROP_FILENAME, PROP_PRESET, PROP_INSTRUMENT, PROP_SAMPLE, PROP_AUDIO_CHANNEL, }; GType ags_open_sf2_sample_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_open_sf2_sample = 0; static const GTypeInfo ags_open_sf2_sample_info = { sizeof(AgsOpenSf2SampleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_open_sf2_sample_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsOpenSf2Sample), 0, /* n_preallocs */ (GInstanceInitFunc) ags_open_sf2_sample_init, }; ags_type_open_sf2_sample = g_type_register_static(AGS_TYPE_TASK, "AgsOpenSf2Sample", &ags_open_sf2_sample_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_open_sf2_sample); } return g_define_type_id__volatile; } void ags_open_sf2_sample_class_init(AgsOpenSf2SampleClass *open_sf2_sample) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_open_sf2_sample_parent_class = g_type_class_peek_parent(open_sf2_sample); /* GObject */ gobject = (GObjectClass *) open_sf2_sample; gobject->set_property = ags_open_sf2_sample_set_property; gobject->get_property = ags_open_sf2_sample_get_property; gobject->dispose = ags_open_sf2_sample_dispose; gobject->finalize = ags_open_sf2_sample_finalize; /* properties */ /** * AgsOpenSf2Sample:channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel of open sf2 sample"), i18n_pspec("The channel of open sf2 sample task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsOpenSf2Sample:ipatch-sample: * * The assigned #AgsIpatchSample * * Since: 3.0.0 */ param_spec = g_param_spec_object("ipatch-sample", i18n_pspec("ipatch sample object"), i18n_pspec("The sample object of open sf2 sample task"), AGS_TYPE_IPATCH_SAMPLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IPATCH_SAMPLE, param_spec); /** * AgsOpenSf2Sample:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename containing the sf2 sample"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsOpenSf2Sample:preset: * * The assigned preset. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset", i18n_pspec("the preset"), i18n_pspec("The preset containing the sf2 sample"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /** * AgsOpenSf2Sample:instrument: * * The assigned instrument. * * Since: 3.0.0 */ param_spec = g_param_spec_string("instrument", i18n_pspec("the instrument"), i18n_pspec("The instrument containing the sf2 sample"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INSTRUMENT, param_spec); /** * AgsOpenSf2Sample:sample: * * The assigned sample. * * Since: 3.0.0 */ param_spec = g_param_spec_string("sample", i18n_pspec("the sample"), i18n_pspec("The sf2 sample"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); /** * AgsOpenSf2Sample:audio-channel: * * The nth audio channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("nth audio channel"), i18n_pspec("The nth audio channel"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /* AgsTask */ task = (AgsTaskClass *) open_sf2_sample; task->launch = ags_open_sf2_sample_launch; } void ags_open_sf2_sample_init(AgsOpenSf2Sample *open_sf2_sample) { open_sf2_sample->channel = NULL; open_sf2_sample->sample = NULL; open_sf2_sample->filename = NULL; open_sf2_sample->preset = NULL; open_sf2_sample->instrument = NULL; open_sf2_sample->sample = NULL; open_sf2_sample->audio_channel = 0; } void ags_open_sf2_sample_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOpenSf2Sample *open_sf2_sample; open_sf2_sample = AGS_OPEN_SF2_SAMPLE(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); if(open_sf2_sample->channel == channel){ return; } if(open_sf2_sample->channel != NULL){ g_object_unref(open_sf2_sample->channel); } if(channel != NULL){ g_object_ref(channel); } open_sf2_sample->channel = channel; } break; case PROP_IPATCH_SAMPLE: { AgsIpatchSample *ipatch_sample; ipatch_sample = (AgsIpatchSample *) g_value_get_object(value); if(open_sf2_sample->ipatch_sample == ipatch_sample){ return; } if(open_sf2_sample->ipatch_sample != NULL){ g_object_unref(open_sf2_sample->ipatch_sample); } if(ipatch_sample != NULL){ g_object_ref(ipatch_sample); } open_sf2_sample->ipatch_sample = ipatch_sample; } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(open_sf2_sample->filename == filename){ return; } if(open_sf2_sample->filename != NULL){ g_free(open_sf2_sample->filename); } open_sf2_sample->filename = g_strdup(filename); } break; case PROP_PRESET: { gchar *preset; preset = g_value_get_string(value); if(open_sf2_sample->preset == preset){ return; } if(open_sf2_sample->preset != NULL){ g_free(open_sf2_sample->preset); } open_sf2_sample->preset = g_strdup(preset); } break; case PROP_INSTRUMENT: { gchar *instrument; instrument = g_value_get_string(value); if(open_sf2_sample->instrument == instrument){ return; } if(open_sf2_sample->instrument != NULL){ g_free(open_sf2_sample->instrument); } open_sf2_sample->instrument = g_strdup(instrument); } break; case PROP_SAMPLE: { gchar *sample; sample = g_value_get_string(value); if(open_sf2_sample->sample == sample){ return; } if(open_sf2_sample->sample != NULL){ g_free(open_sf2_sample->sample); } open_sf2_sample->sample = g_strdup(sample); } break; case PROP_AUDIO_CHANNEL: { open_sf2_sample->audio_channel = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_sf2_sample_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOpenSf2Sample *open_sf2_sample; open_sf2_sample = AGS_OPEN_SF2_SAMPLE(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, open_sf2_sample->channel); } break; case PROP_IPATCH_SAMPLE: { g_value_set_object(value, open_sf2_sample->ipatch_sample); } break; case PROP_FILENAME: { g_value_set_string(value, open_sf2_sample->filename); } break; case PROP_PRESET: { g_value_set_string(value, open_sf2_sample->preset); } break; case PROP_INSTRUMENT: { g_value_set_string(value, open_sf2_sample->instrument); } break; case PROP_SAMPLE: { g_value_set_string(value, open_sf2_sample->sample); } break; case PROP_AUDIO_CHANNEL: { g_value_set_uint(value, open_sf2_sample->audio_channel); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_sf2_sample_dispose(GObject *gobject) { AgsOpenSf2Sample *open_sf2_sample; open_sf2_sample = AGS_OPEN_SF2_SAMPLE(gobject); if(open_sf2_sample->channel != NULL){ g_object_unref(open_sf2_sample->channel); open_sf2_sample->channel = NULL; } if(open_sf2_sample->ipatch_sample != NULL){ g_object_unref(open_sf2_sample->ipatch_sample); open_sf2_sample->ipatch_sample = NULL; } /* call parent */ G_OBJECT_CLASS(ags_open_sf2_sample_parent_class)->dispose(gobject); } void ags_open_sf2_sample_finalize(GObject *gobject) { AgsOpenSf2Sample *open_sf2_sample; open_sf2_sample = AGS_OPEN_SF2_SAMPLE(gobject); if(open_sf2_sample->channel != NULL){ g_object_unref(open_sf2_sample->channel); } if(open_sf2_sample->ipatch_sample != NULL){ g_object_unref(open_sf2_sample->ipatch_sample); } g_free(open_sf2_sample->filename); g_free(open_sf2_sample->preset); g_free(open_sf2_sample->instrument); g_free(open_sf2_sample->sample); /* call parent */ G_OBJECT_CLASS(ags_open_sf2_sample_parent_class)->finalize(gobject); } void ags_open_sf2_sample_launch(AgsTask *task) { AgsChannel *channel; AgsChannel *link; AgsRecycling *first_recycling; AgsOpenSf2Sample *open_sf2_sample; AgsAudioContainer *audio_container; AgsIpatchSample *ipatch_sample; AgsFileLink *file_link; GObject *soundcard; GList *audio_signal; guint i; GError *error; open_sf2_sample = AGS_OPEN_SF2_SAMPLE(task); g_return_if_fail(AGS_IS_CHANNEL(open_sf2_sample->channel)); g_return_if_fail(AGS_IS_IPATCH_SAMPLE(open_sf2_sample->ipatch_sample)); channel = open_sf2_sample->channel; g_object_get(channel, "output-soundcard", &soundcard, NULL); ipatch_sample = open_sf2_sample->ipatch_sample; /* open audio file and read audio signal */ audio_container = NULL; if(ipatch_sample == NULL){ audio_container = ags_audio_container_new(open_sf2_sample->filename, open_sf2_sample->preset, open_sf2_sample->instrument, open_sf2_sample->sample, soundcard, open_sf2_sample->audio_channel); if(!ags_audio_container_open(audio_container)){ g_message("unable to open file - %s", open_sf2_sample->filename); g_object_unref(soundcard); return; } audio_signal = ags_audio_container_read_audio_signal(audio_container); }else{ audio_signal = ags_sound_resource_read_audio_signal(AGS_SOUND_RESOURCE(ipatch_sample), soundcard, open_sf2_sample->audio_channel); } /* set link */ g_object_get(channel, "link", &link, NULL); if(link != NULL){ error = NULL; ags_channel_set_link(channel, NULL, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } /* file link */ if(AGS_IS_INPUT(channel)){ g_object_get(channel, "file-link", &file_link, NULL); if(file_link == NULL){ file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, NULL); g_object_set(channel, "file-link", file_link, NULL); } g_object_set(file_link, "filename", open_sf2_sample->filename, "preset", open_sf2_sample->preset, "instrument", open_sf2_sample->instrument, "sample", open_sf2_sample->sample, "audio-channel", open_sf2_sample->audio_channel, NULL); g_object_unref(file_link); } /* add as template */ g_object_get(channel, "first-recycling", &first_recycling, NULL); g_object_unref(first_recycling); AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(first_recycling, AGS_AUDIO_SIGNAL(audio_signal->data)); /* unref audio file */ if(ipatch_sample == NULL){ g_object_unref(audio_container); } g_object_unref(link); g_object_unref(soundcard); } /** * ags_open_sf2_sample_new: * @channel: the #AgsChannel * @ipatch_sample: the #AgsIpatchSample or %NULL * @filename: the Soundfont2 file * @preset: the preset * @instrument: the instrument * @sample: the sample * @audio_channel: the audio channel * * Creates an #AgsOpenSf2Sample. * * Returns: an new #AgsOpenSf2Sample. * * Since: 3.0.0 */ AgsOpenSf2Sample* ags_open_sf2_sample_new(AgsChannel *channel, AgsIpatchSample *ipatch_sample, gchar *filename, gchar *preset, gchar *instrument, gchar *sample, guint audio_channel) { AgsOpenSf2Sample *open_sf2_sample; open_sf2_sample = (AgsOpenSf2Sample *) g_object_new(AGS_TYPE_OPEN_SF2_SAMPLE, "channel", channel, "ipatch-sample", ipatch_sample, "filename", filename, "preset", preset, "instrument", instrument, "sample", sample, "audio-channel", audio_channel, NULL); return(open_sf2_sample); } gsequencer-3.1.3/ags/audio/task/ags_set_samplerate.c0000644000175000017500000002543413607210263017433 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_set_samplerate_class_init(AgsSetSamplerateClass *set_samplerate); void ags_set_samplerate_init(AgsSetSamplerate *set_samplerate); void ags_set_samplerate_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_set_samplerate_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_set_samplerate_dispose(GObject *gobject); void ags_set_samplerate_finalize(GObject *gobject); void ags_set_samplerate_launch(AgsTask *task); void ags_set_samplerate_audio_signal(AgsSetSamplerate *set_samplerate, AgsAudioSignal *audio_signal); void ags_set_samplerate_recycling(AgsSetSamplerate *set_samplerate, AgsRecycling *recycling); void ags_set_samplerate_channel(AgsSetSamplerate *set_samplerate, AgsChannel *channel); void ags_set_samplerate_audio(AgsSetSamplerate *set_samplerate, AgsAudio *audio); void ags_set_samplerate_soundcard(AgsSetSamplerate *set_samplerate, GObject *soundcard); /** * SECTION:ags_set_samplerate * @short_description: modify samplerate * @title: AgsSetSamplerate * @section_id: * @include: ags/audio/task/ags_set_samplerate.h * * The #AgsSetSamplerate task modifies samplerate of scope. */ static gpointer ags_set_samplerate_parent_class = NULL; enum{ PROP_0, PROP_SCOPE, PROP_SAMPLERATE, }; GType ags_set_samplerate_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_set_samplerate = 0; static const GTypeInfo ags_set_samplerate_info = { sizeof(AgsSetSamplerateClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_set_samplerate_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSetSamplerate), 0, /* n_preallocs */ (GInstanceInitFunc) ags_set_samplerate_init, }; ags_type_set_samplerate = g_type_register_static(AGS_TYPE_TASK, "AgsSetSamplerate", &ags_set_samplerate_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_set_samplerate); } return g_define_type_id__volatile; } void ags_set_samplerate_class_init(AgsSetSamplerateClass *set_samplerate) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_set_samplerate_parent_class = g_type_class_peek_parent(set_samplerate); /* gobject */ gobject = (GObjectClass *) set_samplerate; gobject->set_property = ags_set_samplerate_set_property; gobject->get_property = ags_set_samplerate_get_property; gobject->dispose = ags_set_samplerate_dispose; gobject->finalize = ags_set_samplerate_finalize; /* properties */ /** * AgsSetSamplerate:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set samplerate"), i18n_pspec("The scope of set samplerate"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsSetSamplerate:samplerate: * * The samplerate to apply to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate to apply"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /* task */ task = (AgsTaskClass *) set_samplerate; task->launch = ags_set_samplerate_launch; } void ags_set_samplerate_init(AgsSetSamplerate *set_samplerate) { set_samplerate->scope = NULL; set_samplerate->samplerate = 44100; } void ags_set_samplerate_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSetSamplerate *set_samplerate; set_samplerate = AGS_SET_SAMPLERATE(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(set_samplerate->scope == (GObject *) scope){ return; } if(set_samplerate->scope != NULL){ g_object_unref(set_samplerate->scope); } if(scope != NULL){ g_object_ref(scope); } set_samplerate->scope = (GObject *) scope; } break; case PROP_SAMPLERATE: { set_samplerate->samplerate = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_samplerate_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSetSamplerate *set_samplerate; set_samplerate = AGS_SET_SAMPLERATE(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, set_samplerate->scope); } break; case PROP_SAMPLERATE: { g_value_set_uint(value, set_samplerate->samplerate); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_set_samplerate_dispose(GObject *gobject) { AgsSetSamplerate *set_samplerate; set_samplerate = AGS_SET_SAMPLERATE(gobject); if(set_samplerate->scope != NULL){ g_object_unref(set_samplerate->scope); set_samplerate->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_set_samplerate_parent_class)->dispose(gobject); } void ags_set_samplerate_finalize(GObject *gobject) { AgsSetSamplerate *set_samplerate; set_samplerate = AGS_SET_SAMPLERATE(gobject); if(set_samplerate->scope != NULL){ g_object_unref(set_samplerate->scope); } /* call parent */ G_OBJECT_CLASS(ags_set_samplerate_parent_class)->finalize(gobject); } void ags_set_samplerate_launch(AgsTask *task) { AgsSetSamplerate *set_samplerate; GObject *scope; set_samplerate = AGS_SET_SAMPLERATE(task); scope = set_samplerate->scope; if(AGS_IS_SOUNDCARD(scope)){ ags_set_samplerate_soundcard(set_samplerate, scope); }else if(AGS_IS_AUDIO(scope)){ ags_set_samplerate_audio(set_samplerate, AGS_AUDIO(scope)); }else if(AGS_IS_CHANNEL(scope)){ ags_set_samplerate_channel(set_samplerate, AGS_CHANNEL(scope)); }else if(AGS_IS_RECYCLING(scope)){ ags_set_samplerate_recycling(set_samplerate, AGS_RECYCLING(scope)); }else if(AGS_IS_AUDIO_SIGNAL(scope)){ ags_set_samplerate_audio_signal(set_samplerate, AGS_AUDIO_SIGNAL(scope)); } } void ags_set_samplerate_audio_signal(AgsSetSamplerate *set_samplerate, AgsAudioSignal *audio_signal) { g_object_set(audio_signal, "samplerate", set_samplerate->samplerate, NULL); } void ags_set_samplerate_recycling(AgsSetSamplerate *set_samplerate, AgsRecycling *recycling) { g_object_set(recycling, "samplerate", set_samplerate->samplerate, NULL); } void ags_set_samplerate_channel(AgsSetSamplerate *set_samplerate, AgsChannel *channel) { g_object_set(channel, "samplerate", set_samplerate->samplerate, NULL); } void ags_set_samplerate_audio(AgsSetSamplerate *set_samplerate, AgsAudio *audio) { g_object_set(audio, "samplerate", set_samplerate->samplerate, NULL); } void ags_set_samplerate_soundcard(AgsSetSamplerate *set_samplerate, GObject *soundcard) { AgsThread *audio_loop; AgsApplicationContext *application_context; GObject *default_soundcard; GList *list_start, *list; gdouble thread_frequency; guint channels; guint samplerate; guint buffer_size; guint format; application_context = ags_application_context_get_instance(); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* set buffer size */ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), &channels, &samplerate, &buffer_size, &format); /* reset soundcards */ default_soundcard = ags_sound_provider_get_default_soundcard(AGS_SOUND_PROVIDER(application_context)); if(soundcard == default_soundcard){ /* reset soundcards if applied to first soundcard */ ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), channels, set_samplerate->samplerate, buffer_size, format); list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(list->data != soundcard){ guint target_channels; guint target_samplerate; guint target_buffer_size; guint target_format; /* get soundcard mutex */ ags_soundcard_get_presets(AGS_SOUNDCARD(list->data), &target_channels, &target_samplerate, &target_buffer_size, &target_format); ags_soundcard_set_presets(AGS_SOUNDCARD(soundcard), target_channels, target_samplerate, buffer_size * (target_samplerate / samplerate), target_format); } list = list->next; } g_list_free_full(list_start, g_object_unref); /* reset thread frequency */ thread_frequency = set_samplerate->samplerate / buffer_size + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; ags_main_loop_change_frequency(AGS_MAIN_LOOP(audio_loop), thread_frequency); }else{ g_warning("buffer size can only adjusted of your very first soundcard"); } if(default_soundcard != NULL){ g_object_unref(default_soundcard); } g_object_unref(audio_loop); } /** * ags_set_samplerate_new: * @scope: the #AgsSoundcard to reset * @samplerate: the new samplerate * * Create a new instance of #AgsSetSamplerate. * * Returns: the new #AgsSetSamplerate * * Since: 3.0.0 */ AgsSetSamplerate* ags_set_samplerate_new(GObject *scope, guint samplerate) { AgsSetSamplerate *set_samplerate; set_samplerate = (AgsSetSamplerate *) g_object_new(AGS_TYPE_SET_SAMPLERATE, "scope", scope, "samplerate", samplerate, NULL); return(set_samplerate); } gsequencer-3.1.3/ags/audio/task/ags_apply_sequencer_length.c0000644000175000017500000002677713607210263021176 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_apply_sequencer_length_class_init(AgsApplySequencerLengthClass *apply_sequencer_length); void ags_apply_sequencer_length_init(AgsApplySequencerLength *apply_sequencer_length); void ags_apply_sequencer_length_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_apply_sequencer_length_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_apply_sequencer_length_dispose(GObject *gobject); void ags_apply_sequencer_length_finalize(GObject *gobject); void ags_apply_sequencer_length_recall(AgsApplySequencerLength *apply_sequencer_length, AgsRecall *recall); void ags_apply_sequencer_length_channel(AgsApplySequencerLength *apply_sequencer_length, AgsChannel *channel); void ags_apply_sequencer_length_audio(AgsApplySequencerLength *apply_sequencer_length, AgsAudio *audio); void ags_apply_sequencer_length_launch(AgsTask *task); /** * SECTION:ags_apply_sequencer_length * @short_description: apply sequencer length to delay audio * @title: AgsApplySequencerLength * @section_id: * @include: ags/audio/task/recall/ags_apply_sequencer_length.h * * The #AgsApplySequencerLength task applys sequencer length to #AgsDelayAudio. */ enum{ PROP_0, PROP_SCOPE, PROP_SEQUENCER_LENGTH, }; static gpointer ags_apply_sequencer_length_parent_class = NULL; GType ags_apply_sequencer_length_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_apply_sequencer_length = 0; static const GTypeInfo ags_apply_sequencer_length_info = { sizeof(AgsApplySequencerLengthClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_apply_sequencer_length_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsApplySequencerLength), 0, /* n_preallocs */ (GInstanceInitFunc) ags_apply_sequencer_length_init, }; ags_type_apply_sequencer_length = g_type_register_static(AGS_TYPE_TASK, "AgsApplySequencerLength", &ags_apply_sequencer_length_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_apply_sequencer_length); } return g_define_type_id__volatile; } void ags_apply_sequencer_length_class_init(AgsApplySequencerLengthClass *apply_sequencer_length) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_apply_sequencer_length_parent_class = g_type_class_peek_parent(apply_sequencer_length); /* GObjectClass */ gobject = (GObjectClass *) apply_sequencer_length; gobject->set_property = ags_apply_sequencer_length_set_property; gobject->get_property = ags_apply_sequencer_length_get_property; gobject->dispose = ags_apply_sequencer_length_dispose; gobject->finalize = ags_apply_sequencer_length_finalize; /* properties */ /** * AgsApplySequencerLength:scope: * * The assigned #GObject as scope. * * Since: 3.0.0 */ param_spec = g_param_spec_object("scope", i18n_pspec("scope of set buffer size"), i18n_pspec("The scope of set buffer size"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCOPE, param_spec); /** * AgsApplySequencerLength:sequencer-length: * * The sequencer length to apply to scope. * * Since: 3.0.0 */ param_spec = g_param_spec_double("sequencer-length", i18n_pspec("sequencer length"), i18n_pspec("The sequence length to apply"), 0, G_MAXDOUBLE, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER_LENGTH, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) apply_sequencer_length; task->launch = ags_apply_sequencer_length_launch; } void ags_apply_sequencer_length_init(AgsApplySequencerLength *apply_sequencer_length) { apply_sequencer_length->scope = NULL; apply_sequencer_length->length = 0.0; } void ags_apply_sequencer_length_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplySequencerLength *apply_sequencer_length; apply_sequencer_length = AGS_APPLY_SEQUENCER_LENGTH(gobject); switch(prop_id){ case PROP_SCOPE: { GObject *scope; scope = (GObject *) g_value_get_object(value); if(apply_sequencer_length->scope == (GObject *) scope){ return; } if(apply_sequencer_length->scope != NULL){ g_object_unref(apply_sequencer_length->scope); } if(scope != NULL){ g_object_ref(scope); } apply_sequencer_length->scope = (GObject *) scope; } break; case PROP_SEQUENCER_LENGTH: { apply_sequencer_length->length = g_value_get_double(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_sequencer_length_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplySequencerLength *apply_sequencer_length; apply_sequencer_length = AGS_APPLY_SEQUENCER_LENGTH(gobject); switch(prop_id){ case PROP_SCOPE: { g_value_set_object(value, apply_sequencer_length->scope); } break; case PROP_SEQUENCER_LENGTH: { g_value_set_double(value, apply_sequencer_length->length); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_sequencer_length_dispose(GObject *gobject) { AgsApplySequencerLength *apply_sequencer_length; apply_sequencer_length = AGS_APPLY_SEQUENCER_LENGTH(gobject); if(apply_sequencer_length->scope != NULL){ g_object_unref(apply_sequencer_length->scope); apply_sequencer_length->scope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_apply_sequencer_length_parent_class)->dispose(gobject); } void ags_apply_sequencer_length_finalize(GObject *gobject) { AgsApplySequencerLength *apply_sequencer_length; apply_sequencer_length = AGS_APPLY_SEQUENCER_LENGTH(gobject); if(apply_sequencer_length->scope != NULL){ g_object_unref(apply_sequencer_length->scope); } /* call parent */ G_OBJECT_CLASS(ags_apply_sequencer_length_parent_class)->finalize(gobject); } void ags_apply_sequencer_length_launch(AgsTask *task) { AgsApplySequencerLength *apply_sequencer_length; apply_sequencer_length = AGS_APPLY_SEQUENCER_LENGTH(task); if(AGS_IS_AUDIO(apply_sequencer_length->scope)){ AgsAudio *audio; audio = AGS_AUDIO(apply_sequencer_length->scope); ags_apply_sequencer_length_audio(apply_sequencer_length, audio); }else if(AGS_IS_CHANNEL(apply_sequencer_length->scope)){ AgsChannel *channel; channel = AGS_CHANNEL(apply_sequencer_length->scope); ags_apply_sequencer_length_channel(apply_sequencer_length, channel); }else if(AGS_IS_RECALL(apply_sequencer_length->scope)){ AgsRecall *recall; recall = AGS_RECALL(apply_sequencer_length->scope); ags_apply_sequencer_length_recall(apply_sequencer_length, recall); }else{ g_warning("AgsApplySequencerLength: Not supported scope"); } } void ags_apply_sequencer_length_recall(AgsApplySequencerLength *apply_sequencer_length, AgsRecall *recall) { if(AGS_IS_TACTABLE(recall)){ ags_tactable_change_sequencer_duration(AGS_TACTABLE(recall), apply_sequencer_length->length); } } void ags_apply_sequencer_length_channel(AgsApplySequencerLength *apply_sequencer_length, AgsChannel *channel) { GList *list_start, *list; /* apply sequencer length - play */ g_object_get(channel, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_sequencer_length_recall(apply_sequencer_length, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* apply sequencer length - recall */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_sequencer_length_recall(apply_sequencer_length, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); } void ags_apply_sequencer_length_audio(AgsApplySequencerLength *apply_sequencer_length, AgsAudio *audio) { AgsChannel *input, *output; AgsChannel *channel, *next_channel; GList *list_start, *list; /* get some fields */ g_object_get(audio, "output", &output, "input", &input, NULL); /* apply sequencer_length - play */ g_object_get(audio, "play", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_sequencer_length_recall(apply_sequencer_length, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* apply sequencer length - recall */ g_object_get(audio, "recall", &list_start, NULL); list = list_start; while(list != NULL){ ags_apply_sequencer_length_recall(apply_sequencer_length, AGS_RECALL(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); /* AgsChannel - output */ if(output != NULL){ channel = output; g_object_ref(channel); while(channel != NULL){ /* apply sequencer length */ ags_apply_sequencer_length_channel(apply_sequencer_length, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(output); } /* AgsChannel - input */ if(input != NULL){ channel = input; g_object_ref(channel); while(channel != NULL){ /* apply sequencer length */ ags_apply_sequencer_length_channel(apply_sequencer_length, channel); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(input); } } /** * ags_apply_sequencer_length_new: * @scope: the #GObject * @length: the sequencer length to apply * * Creates an #AgsApplySequencerLength. * * Returns: an new #AgsApplySequencerLength. * * Since: 3.0.0 */ AgsApplySequencerLength* ags_apply_sequencer_length_new(GObject *scope, gdouble length) { AgsApplySequencerLength *apply_sequencer_length; apply_sequencer_length = (AgsApplySequencerLength *) g_object_new(AGS_TYPE_APPLY_SEQUENCER_LENGTH, "scope", scope, "sequencer-length", length, NULL); return(apply_sequencer_length); } gsequencer-3.1.3/ags/audio/task/ags_crop_note.h0000644000175000017500000000437113607210263016415 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CROP_NOTE_H__ #define __AGS_CROP_NOTE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CROP_NOTE (ags_crop_note_get_type()) #define AGS_CROP_NOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CROP_NOTE, AgsCropNote)) #define AGS_CROP_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CROP_NOTE, AgsCropNoteClass)) #define AGS_IS_CROP_NOTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CROP_NOTE)) #define AGS_IS_CROP_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CROP_NOTE)) #define AGS_CROP_NOTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CROP_NOTE, AgsCropNoteClass)) #define AGS_CROP_NOTE_DEFAULT_X_LENGTH (16 * 16 * 1200) typedef struct _AgsCropNote AgsCropNote; typedef struct _AgsCropNoteClass AgsCropNoteClass; struct _AgsCropNote { AgsTask task; AgsAudio *audio; AgsNotation *notation; GList *selection; guint x_padding; gint x_crop; gboolean absolute; gboolean in_place; gboolean do_resize; }; struct _AgsCropNoteClass { AgsTaskClass task; }; GType ags_crop_note_get_type(); AgsCropNote* ags_crop_note_new(AgsAudio *audio, AgsNotation *notation, GList *selection, guint x_padding, gint x_crop, gboolean absolute, gboolean in_place, gboolean do_resize); G_END_DECLS #endif /*__AGS_CROP_NOTE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_resize_audio.c0000644000175000017500000002201513607210263017075 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_resize_audio_class_init(AgsResizeAudioClass *resize_audio); void ags_resize_audio_init(AgsResizeAudio *resize_audio); void ags_resize_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_resize_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_resize_audio_dispose(GObject *gobject); void ags_resize_audio_finalize(GObject *gobject); void ags_resize_audio_launch(AgsTask *task); /** * SECTION:ags_resize_audio * @short_description: resize audio task * @title: AgsResizeAudio * @section_id: * @include: ags/audio/task/ags_resize_audio.h * * The #AgsResizeAudio task resizes #AgsAudio. */ static gpointer ags_resize_audio_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_OUTPUT_PADS, PROP_INPUT_PADS, PROP_AUDIO_CHANNELS, }; GType ags_resize_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_resize_audio = 0; static const GTypeInfo ags_resize_audio_info = { sizeof(AgsResizeAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_resize_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsResizeAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_resize_audio_init, }; ags_type_resize_audio = g_type_register_static(AGS_TYPE_TASK, "AgsResizeAudio", &ags_resize_audio_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_resize_audio); } return g_define_type_id__volatile; } void ags_resize_audio_class_init(AgsResizeAudioClass *resize_audio) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_resize_audio_parent_class = g_type_class_peek_parent(resize_audio); /* gobject */ gobject = (GObjectClass *) resize_audio; gobject->set_property = ags_resize_audio_set_property; gobject->get_property = ags_resize_audio_get_property; gobject->dispose = ags_resize_audio_dispose; gobject->finalize = ags_resize_audio_finalize; /* properties */ /** * AgsResizeAudio:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of resize audio"), i18n_pspec("The audio of resize audio task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsResizeAudio:output-pads: * * The count of output pads to apply to audio. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("output-pads", i18n_pspec("output pads"), i18n_pspec("The count of output pads"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_PADS, param_spec); /** * AgsResizeAudio:input-pads: * * The count of input pads to apply to audio. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("input-pads", i18n_pspec("input pads"), i18n_pspec("The count of input pads"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_PADS, param_spec); /** * AgsResizeAudio:audio-channels: * * The count of audio channels to apply to audio. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channels", i18n_pspec("audio channels"), i18n_pspec("The count of audio channels"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNELS, param_spec); /* task */ task = (AgsTaskClass *) resize_audio; task->launch = ags_resize_audio_launch; } void ags_resize_audio_init(AgsResizeAudio *resize_audio) { resize_audio->audio = NULL; resize_audio->output_pads = 0; resize_audio->input_pads = 0; resize_audio->audio_channels = 0; } void ags_resize_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsResizeAudio *resize_audio; resize_audio = AGS_RESIZE_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(resize_audio->audio == audio){ return; } if(resize_audio->audio != NULL){ g_object_unref(resize_audio->audio); } if(audio != NULL){ g_object_ref(audio); } resize_audio->audio = audio; } break; case PROP_OUTPUT_PADS: { resize_audio->output_pads = g_value_get_uint(value); } break; case PROP_INPUT_PADS: { resize_audio->input_pads = g_value_get_uint(value); } break; case PROP_AUDIO_CHANNELS: { resize_audio->audio_channels = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_resize_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsResizeAudio *resize_audio; resize_audio = AGS_RESIZE_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, resize_audio->audio); } break; case PROP_OUTPUT_PADS: { g_value_set_uint(value, resize_audio->output_pads); } break; case PROP_INPUT_PADS: { g_value_set_uint(value, resize_audio->input_pads); } break; case PROP_AUDIO_CHANNELS: { g_value_set_uint(value, resize_audio->audio_channels); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_resize_audio_dispose(GObject *gobject) { AgsResizeAudio *resize_audio; resize_audio = AGS_RESIZE_AUDIO(gobject); if(resize_audio->audio != NULL){ g_object_unref(resize_audio->audio); resize_audio->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_resize_audio_parent_class)->dispose(gobject); } void ags_resize_audio_finalize(GObject *gobject) { AgsResizeAudio *resize_audio; resize_audio = AGS_RESIZE_AUDIO(gobject); if(resize_audio->audio != NULL){ g_object_unref(resize_audio->audio); } /* call parent */ G_OBJECT_CLASS(ags_resize_audio_parent_class)->finalize(gobject); } void ags_resize_audio_launch(AgsTask *task) { AgsAudio *audio; AgsResizeAudio *resize_audio; guint audio_channels_old; guint input_pads_old, output_pads_old; resize_audio = AGS_RESIZE_AUDIO(task); g_return_if_fail(AGS_IS_AUDIO(resize_audio->audio)); audio = resize_audio->audio; /* get some fields */ g_object_get(audio, "audio-channels", &audio_channels_old, "output-pads", &output_pads_old, "input-pads", &input_pads_old, NULL); /* resize audio - audio channels */ if(audio_channels_old != resize_audio->audio_channels){ ags_audio_set_audio_channels(audio, resize_audio->audio_channels, audio_channels_old); } /* resize audio - output */ if(output_pads_old != resize_audio->output_pads){ ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, resize_audio->output_pads, output_pads_old); } /* resize audio - input */ if(input_pads_old != resize_audio->input_pads){ ags_audio_set_pads(audio, AGS_TYPE_INPUT, resize_audio->input_pads, input_pads_old); } } /** * ags_resize_audio_new: * @audio: the #AgsAudio to resize * @output_pads: output pads * @input_pads: input pads * @audio_channels: audio channels * * Creates an #AgsResizeAudio. * * Returns: an new #AgsResizeAudio. * * Since: 3.0.0 */ AgsResizeAudio* ags_resize_audio_new(AgsAudio *audio, guint output_pads, guint input_pads, guint audio_channels) { AgsResizeAudio *resize_audio; resize_audio = (AgsResizeAudio *) g_object_new(AGS_TYPE_RESIZE_AUDIO, "audio", audio, "output-pads", output_pads, "input-pads", input_pads, "audio-channels", audio_channels, NULL); return(resize_audio); } gsequencer-3.1.3/ags/audio/task/ags_set_device.h0000644000175000017500000000357413607210263016543 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SET_DEVICE_H__ #define __AGS_SET_DEVICE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SET_DEVICE (ags_set_device_get_type()) #define AGS_SET_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SET_DEVICE, AgsSetDevice)) #define AGS_SET_DEVICE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SET_DEVICE, AgsSetDeviceClass)) #define AGS_IS_SET_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SET_DEVICE)) #define AGS_IS_SET_DEVICE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SET_DEVICE)) #define AGS_SET_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SET_DEVICE, AgsSetDeviceClass)) typedef struct _AgsSetDevice AgsSetDevice; typedef struct _AgsSetDeviceClass AgsSetDeviceClass; struct _AgsSetDevice { AgsTask task; GObject *scope; gchar *device; }; struct _AgsSetDeviceClass { AgsTaskClass task; }; GType ags_set_device_get_type(); AgsSetDevice* ags_set_device_new(GObject *scope, gchar *device); G_END_DECLS #endif /*__AGS_SET_DEVICE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_start_soundcard.c0000644000175000017500000001630113607210263017613 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_start_soundcard_class_init(AgsStartSoundcardClass *start_soundcard); void ags_start_soundcard_init(AgsStartSoundcard *start_soundcard); void ags_start_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_start_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_start_soundcard_dispose(GObject *gobject); void ags_start_soundcard_finalize(GObject *gobject); void ags_start_soundcard_launch(AgsTask *task); /** * SECTION:ags_start_soundcard * @short_description: start soundcard object * @title: AgsStartSoundcard * @section_id: * @include: ags/audio/task/ags_start_soundcard.h * * The #AgsStartSoundcard task starts soundcard. */ static gpointer ags_start_soundcard_parent_class = NULL; enum{ PROP_0, }; GType ags_start_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_start_soundcard = 0; static const GTypeInfo ags_start_soundcard_info = { sizeof(AgsStartSoundcardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_start_soundcard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsStartSoundcard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_start_soundcard_init, }; ags_type_start_soundcard = g_type_register_static(AGS_TYPE_TASK, "AgsStartSoundcard", &ags_start_soundcard_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_start_soundcard); } return g_define_type_id__volatile; } void ags_start_soundcard_class_init(AgsStartSoundcardClass *start_soundcard) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_start_soundcard_parent_class = g_type_class_peek_parent(start_soundcard); /* gobject */ gobject = (GObjectClass *) start_soundcard; gobject->set_property = ags_start_soundcard_set_property; gobject->get_property = ags_start_soundcard_get_property; gobject->dispose = ags_start_soundcard_dispose; gobject->finalize = ags_start_soundcard_finalize; /* properties */ /* task */ task = (AgsTaskClass *) start_soundcard; task->launch = ags_start_soundcard_launch; } void ags_start_soundcard_init(AgsStartSoundcard *start_soundcard) { //empty } void ags_start_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStartSoundcard *start_soundcard; start_soundcard = AGS_START_SOUNDCARD(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStartSoundcard *start_soundcard; start_soundcard = AGS_START_SOUNDCARD(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_start_soundcard_dispose(GObject *gobject) { AgsStartSoundcard *start_soundcard; start_soundcard = AGS_START_SOUNDCARD(gobject); /* call parent */ G_OBJECT_CLASS(ags_start_soundcard_parent_class)->dispose(gobject); } void ags_start_soundcard_finalize(GObject *gobject) { AgsStartSoundcard *start_soundcard; start_soundcard = AGS_START_SOUNDCARD(gobject); /* call parent */ G_OBJECT_CLASS(ags_start_soundcard_parent_class)->finalize(gobject); } void ags_start_soundcard_launch(AgsTask *task) { AgsStartSoundcard *start_soundcard; AgsThread *audio_loop; AgsThread *soundcard_thread; AgsThread *export_thread; AgsThread *next_thread; AgsApplicationContext *application_context; start_soundcard = AGS_START_SOUNDCARD(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(application_context)); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); while(soundcard_thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(soundcard_thread)){ GObject *soundcard; guint soundcard_capability; #ifdef AGS_DEBUG g_message("start soundcard"); #endif g_object_get(soundcard_thread, "soundcard", &soundcard, NULL); soundcard_capability = ags_soundcard_get_capability(AGS_SOUNDCARD(soundcard)); AGS_SOUNDCARD_THREAD(soundcard_thread)->error = NULL; if(soundcard_capability == AGS_SOUNDCARD_CAPABILITY_PLAYBACK){ ags_soundcard_play_init(AGS_SOUNDCARD(soundcard), &(AGS_SOUNDCARD_THREAD(soundcard_thread)->error)); }else if(soundcard_capability == AGS_SOUNDCARD_CAPABILITY_CAPTURE){ ags_soundcard_record_init(AGS_SOUNDCARD(soundcard), &(AGS_SOUNDCARD_THREAD(soundcard_thread)->error)); } /* append soundcard thread */ ags_thread_add_start_queue(audio_loop, soundcard_thread); g_object_unref(soundcard); } /* iterate */ next_thread = ags_thread_next(soundcard_thread); g_object_unref(soundcard_thread); soundcard_thread = next_thread; } export_thread = ags_thread_find_type(audio_loop, AGS_TYPE_EXPORT_THREAD); while(export_thread != NULL){ if(AGS_IS_EXPORT_THREAD(export_thread)){ GObject *export; guint export_capability; #ifdef AGS_DEBUG g_message("start export"); #endif /* append export thread */ ags_thread_add_start_queue(audio_loop, export_thread); } /* iterate */ next_thread = ags_thread_next(export_thread); g_object_unref(export_thread); export_thread = next_thread; } /* unref */ g_object_unref(audio_loop); } /** * ags_start_soundcard_new: * * Create a new instance of #AgsStartSoundcard. * * Returns: the new #AgsStartSoundcard. * * Since: 3.0.0 */ AgsStartSoundcard* ags_start_soundcard_new() { AgsStartSoundcard *start_soundcard; start_soundcard = (AgsStartSoundcard *) g_object_new(AGS_TYPE_START_SOUNDCARD, NULL); return(start_soundcard); } gsequencer-3.1.3/ags/audio/task/ags_apply_synth.h0000644000175000017500000000416213607210263016775 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLY_SYNTH_H__ #define __AGS_APPLY_SYNTH_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLY_SYNTH (ags_apply_synth_get_type()) #define AGS_APPLY_SYNTH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLY_SYNTH, AgsApplySynth)) #define AGS_APPLY_SYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_APPLY_SYNTH, AgsApplySynthClass)) #define AGS_IS_APPLY_SYNTH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLY_SYNTH)) #define AGS_IS_APPLY_SYNTH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_APPLY_SYNTH)) #define AGS_APPLY_SYNTH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_APPLY_SYNTH, AgsApplySynthClass)) typedef struct _AgsApplySynth AgsApplySynth; typedef struct _AgsApplySynthClass AgsApplySynthClass; struct _AgsApplySynth { AgsTask task; AgsSynthGenerator *synth_generator; AgsChannel *start_channel; gdouble base_note; guint count; }; struct _AgsApplySynthClass { AgsTaskClass task; }; GType ags_apply_synth_get_type(); AgsApplySynth* ags_apply_synth_new(AgsSynthGenerator *synth_generator, AgsChannel *start_channel, gdouble base_note, guint count); G_END_DECLS #endif /*__AGS_APPLY_SYNTH_H__*/ gsequencer-3.1.3/ags/audio/task/ags_cancel_channel.c0000644000175000017500000001642513615120037017336 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_cancel_channel_class_init(AgsCancelChannelClass *cancel_channel); void ags_cancel_channel_init(AgsCancelChannel *cancel_channel); void ags_cancel_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_cancel_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_cancel_channel_dispose(GObject *gobject); void ags_cancel_channel_finalize(GObject *gobject); void ags_cancel_channel_launch(AgsTask *task); /** * SECTION:ags_cancel_channel * @short_description: cancel channel task * @title: AgsCancelChannel * @section_id: * @include: ags/audio/task/ags_cancel_channel.h * * The #AgsCancelChannel task cancels #AgsChannel playback. */ static gpointer ags_cancel_channel_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL, PROP_SOUND_SCOPE, }; GType ags_cancel_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_cancel_channel = 0; static const GTypeInfo ags_cancel_channel_info = { sizeof(AgsCancelChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_cancel_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCancelChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_cancel_channel_init, }; ags_type_cancel_channel = g_type_register_static(AGS_TYPE_TASK, "AgsCancelChannel", &ags_cancel_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_cancel_channel); } return g_define_type_id__volatile; } void ags_cancel_channel_class_init(AgsCancelChannelClass *cancel_channel) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_cancel_channel_parent_class = g_type_class_peek_parent(cancel_channel); /* gobject */ gobject = (GObjectClass *) cancel_channel; gobject->set_property = ags_cancel_channel_set_property; gobject->get_property = ags_cancel_channel_get_property; gobject->dispose = ags_cancel_channel_dispose; gobject->finalize = ags_cancel_channel_finalize; /* properties */ /** * AgsCancelChannel:channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel of cancel channel"), i18n_pspec("The channel of cancel channel task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsCancelChannel:sound-scope: * * The effects sound-scope. * * Since: 3.0.0 */ param_spec = g_param_spec_int("sound-scope", i18n_pspec("sound scope"), i18n_pspec("The sound scope"), -1, AGS_SOUND_SCOPE_LAST, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUND_SCOPE, param_spec); /* task */ task = (AgsTaskClass *) cancel_channel; task->launch = ags_cancel_channel_launch; } void ags_cancel_channel_init(AgsCancelChannel *cancel_channel) { cancel_channel->channel = NULL; cancel_channel->sound_scope = -1; } void ags_cancel_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCancelChannel *cancel_channel; cancel_channel = AGS_CANCEL_CHANNEL(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); if(cancel_channel->channel == channel){ return; } if(cancel_channel->channel != NULL){ g_object_unref(cancel_channel->channel); } if(channel != NULL){ g_object_ref(channel); } cancel_channel->channel = channel; } break; case PROP_SOUND_SCOPE: { cancel_channel->sound_scope = g_value_get_int(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_cancel_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCancelChannel *cancel_channel; cancel_channel = AGS_CANCEL_CHANNEL(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, cancel_channel->channel); } break; case PROP_SOUND_SCOPE: { g_value_set_int(value, cancel_channel->sound_scope); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_cancel_channel_dispose(GObject *gobject) { AgsCancelChannel *cancel_channel; cancel_channel = AGS_CANCEL_CHANNEL(gobject); if(cancel_channel->channel != NULL){ g_object_unref(cancel_channel->channel); cancel_channel->channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_cancel_channel_parent_class)->dispose(gobject); } void ags_cancel_channel_finalize(GObject *gobject) { AgsCancelChannel *cancel_channel; cancel_channel = AGS_CANCEL_CHANNEL(gobject); if(cancel_channel->channel != NULL){ g_object_unref(cancel_channel->channel); } /* call parent */ G_OBJECT_CLASS(ags_cancel_channel_parent_class)->finalize(gobject); } void ags_cancel_channel_launch(AgsTask *task) { AgsChannel *channel; AgsCancelChannel *cancel_channel; GList *start_recall_id; gint sound_scope; cancel_channel = AGS_CANCEL_CHANNEL(task); g_return_if_fail(AGS_IS_CHANNEL(cancel_channel->channel)); g_object_get(cancel_channel, "channel", &channel, "sound-scope", &sound_scope, NULL); start_recall_id = ags_channel_check_scope(channel, sound_scope); ags_channel_stop(channel, start_recall_id, sound_scope); g_object_unref(channel); g_list_free_full(start_recall_id, g_object_unref); } /** * ags_cancel_channel_new: * @channel: the #AgsChannel to cancel * @sound_scope: the #AgsSoundScope-enum or -1 for all * * Create a new instance of #AgsCancelChannel. * * Returns: the new #AgsCancelChannel. * * Since: 3.0.0 */ AgsCancelChannel* ags_cancel_channel_new(AgsChannel *channel, gint sound_scope) { AgsCancelChannel *cancel_channel; cancel_channel = (AgsCancelChannel *) g_object_new(AGS_TYPE_CANCEL_CHANNEL, "channel", channel, "sound-scope", sound_scope, NULL); return(cancel_channel); } gsequencer-3.1.3/ags/audio/task/ags_add_audio.h0000644000175000017500000000353513607210263016337 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ADD_AUDIO_H__ #define __AGS_ADD_AUDIO_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ADD_AUDIO (ags_add_audio_get_type()) #define AGS_ADD_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ADD_AUDIO, AgsAddAudio)) #define AGS_ADD_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ADD_AUDIO, AgsAddAudioClass)) #define AGS_IS_ADD_AUDIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ADD_AUDIO)) #define AGS_IS_ADD_AUDIO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ADD_AUDIO)) #define AGS_ADD_AUDIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ADD_AUDIO, AgsAddAudioClass)) typedef struct _AgsAddAudio AgsAddAudio; typedef struct _AgsAddAudioClass AgsAddAudioClass; struct _AgsAddAudio { AgsTask task; AgsAudio *audio; }; struct _AgsAddAudioClass { AgsTaskClass task; }; GType ags_add_audio_get_type(); AgsAddAudio* ags_add_audio_new(AgsAudio *audio); G_END_DECLS #endif /*__AGS_ADD_AUDIO_H__*/ gsequencer-3.1.3/ags/audio/task/ags_stop_soundcard.c0000644000175000017500000001423513607210263017447 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_stop_soundcard_class_init(AgsStopSoundcardClass *stop_soundcard); void ags_stop_soundcard_init(AgsStopSoundcard *stop_soundcard); void ags_stop_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_stop_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_stop_soundcard_dispose(GObject *gobject); void ags_stop_soundcard_finalize(GObject *gobject); void ags_stop_soundcard_launch(AgsTask *task); /** * SECTION:ags_stop_soundcard * @short_description: stop soundcard object * @title: AgsStopSoundcard * @section_id: * @include: ags/audio/task/ags_stop_soundcard.h * * The #AgsStopSoundcard task stops soundcard. */ static gpointer ags_stop_soundcard_parent_class = NULL; enum{ PROP_0, }; GType ags_stop_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_stop_soundcard = 0; static const GTypeInfo ags_stop_soundcard_info = { sizeof(AgsStopSoundcardClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_stop_soundcard_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsStopSoundcard), 0, /* n_preallocs */ (GInstanceInitFunc) ags_stop_soundcard_init, }; ags_type_stop_soundcard = g_type_register_static(AGS_TYPE_TASK, "AgsStopSoundcard", &ags_stop_soundcard_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_stop_soundcard); } return g_define_type_id__volatile; } void ags_stop_soundcard_class_init(AgsStopSoundcardClass *stop_soundcard) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_stop_soundcard_parent_class = g_type_class_peek_parent(stop_soundcard); /* gobject */ gobject = (GObjectClass *) stop_soundcard; gobject->set_property = ags_stop_soundcard_set_property; gobject->get_property = ags_stop_soundcard_get_property; gobject->dispose = ags_stop_soundcard_dispose; gobject->finalize = ags_stop_soundcard_finalize; /* properties */ /* task */ task = (AgsTaskClass *) stop_soundcard; task->launch = ags_stop_soundcard_launch; } void ags_stop_soundcard_init(AgsStopSoundcard *stop_soundcard) { //empty } void ags_stop_soundcard_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsStopSoundcard *stop_soundcard; stop_soundcard = AGS_STOP_SOUNDCARD(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_stop_soundcard_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsStopSoundcard *stop_soundcard; stop_soundcard = AGS_STOP_SOUNDCARD(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_stop_soundcard_dispose(GObject *gobject) { AgsStopSoundcard *stop_soundcard; stop_soundcard = AGS_STOP_SOUNDCARD(gobject); /* call parent */ G_OBJECT_CLASS(ags_stop_soundcard_parent_class)->dispose(gobject); } void ags_stop_soundcard_finalize(GObject *gobject) { AgsStopSoundcard *stop_soundcard; stop_soundcard = AGS_STOP_SOUNDCARD(gobject); /* call parent */ G_OBJECT_CLASS(ags_stop_soundcard_parent_class)->finalize(gobject); } void ags_stop_soundcard_launch(AgsTask *task) { AgsStopSoundcard *stop_soundcard; AgsThread *audio_loop; AgsThread *soundcard_thread; AgsThread *export_thread; AgsThread *next_thread; AgsApplicationContext *application_context; stop_soundcard = AGS_STOP_SOUNDCARD(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(application_context)); /* get main loop */ audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); soundcard_thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); while(soundcard_thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(soundcard_thread)){ /* stop soundcard thread */ ags_thread_stop(soundcard_thread); } /* iterate */ next_thread = ags_thread_next(soundcard_thread); g_object_unref(soundcard_thread); soundcard_thread = next_thread; } export_thread = ags_thread_find_type(audio_loop, AGS_TYPE_EXPORT_THREAD); while(export_thread != NULL){ if(AGS_IS_EXPORT_THREAD(export_thread)){ /* stop export thread */ ags_thread_stop(export_thread); } /* iterate */ next_thread = ags_thread_next(export_thread); g_object_unref(export_thread); export_thread = next_thread; } g_object_unref(audio_loop); } /** * ags_stop_soundcard_new: * * Create a new instance of #AgsStopSoundcard. * * Returns: the new #AgsStopSoundcard. * * Since: 3.0.0 */ AgsStopSoundcard* ags_stop_soundcard_new() { AgsStopSoundcard *stop_soundcard; stop_soundcard = (AgsStopSoundcard *) g_object_new(AGS_TYPE_STOP_SOUNDCARD, NULL); return(stop_soundcard); } gsequencer-3.1.3/ags/audio/task/ags_seek_soundcard.h0000644000175000017500000000402213607210263017407 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SEEK_SOUNDCARD_H__ #define __AGS_SEEK_SOUNDCARD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SEEK_SOUNDCARD (ags_seek_soundcard_get_type()) #define AGS_SEEK_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SEEK_SOUNDCARD, AgsSeekSoundcard)) #define AGS_SEEK_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SEEK_SOUNDCARD, AgsSeekSoundcardClass)) #define AGS_IS_SEEK_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SEEK_SOUNDCARD)) #define AGS_IS_SEEK_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SEEK_SOUNDCARD)) #define AGS_SEEK_SOUNDCARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SEEK_SOUNDCARD, AgsSeekSoundcardClass)) typedef struct _AgsSeekSoundcard AgsSeekSoundcard; typedef struct _AgsSeekSoundcardClass AgsSeekSoundcardClass; struct _AgsSeekSoundcard { AgsTask task; GObject *soundcard; gint64 offset; guint whence; }; struct _AgsSeekSoundcardClass { AgsTaskClass task; }; GType ags_seek_soundcard_get_type(); AgsSeekSoundcard* ags_seek_soundcard_new(GObject *soundcard, gint64 offset, guint whence); G_END_DECLS #endif /*__AGS_SEEK_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/audio/task/ags_tic_device.c0000644000175000017500000001433713607210263016521 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_tic_device_class_init(AgsTicDeviceClass *tic_device); void ags_tic_device_init(AgsTicDevice *tic_device); void ags_tic_device_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_tic_device_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_tic_device_dispose(GObject *gobject); void ags_tic_device_finalize(GObject *gobject); void ags_tic_device_launch(AgsTask *task); /** * SECTION:ags_tic_device * @short_description: tic device object * @title: AgsTicDevice * @section_id: * @include: ags/audio/task/ags_tic_device.h * * The #AgsTicDevice task tics #GObject. */ static gpointer ags_tic_device_parent_class = NULL; enum{ PROP_0, PROP_DEVICE, }; GType ags_tic_device_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_tic_device = 0; static const GTypeInfo ags_tic_device_info = { sizeof(AgsTicDeviceClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_tic_device_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsTicDevice), 0, /* n_preallocs */ (GInstanceInitFunc) ags_tic_device_init, }; ags_type_tic_device = g_type_register_static(AGS_TYPE_TASK, "AgsTicDevice", &ags_tic_device_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_tic_device); } return g_define_type_id__volatile; } void ags_tic_device_class_init(AgsTicDeviceClass *tic_device) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_tic_device_parent_class = g_type_class_peek_parent(tic_device); /* gobject */ gobject = (GObjectClass *) tic_device; gobject->set_property = ags_tic_device_set_property; gobject->get_property = ags_tic_device_get_property; gobject->dispose = ags_tic_device_dispose; gobject->finalize = ags_tic_device_finalize; /* properties */ /** * AgsTicDevice:device: * * The assigned #GObject as device. * * Since: 3.0.0 */ param_spec = g_param_spec_object("device", i18n_pspec("device to tic"), i18n_pspec("The device to tic"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /* task */ task = (AgsTaskClass *) tic_device; task->launch = ags_tic_device_launch; } void ags_tic_device_init(AgsTicDevice *tic_device) { tic_device->device = NULL; } void ags_tic_device_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTicDevice *tic_device; tic_device = AGS_TIC_DEVICE(gobject); switch(prop_id){ case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_object(value); if(tic_device->device == (GObject *) device){ return; } if(tic_device->device != NULL){ g_object_unref(tic_device->device); } if(device != NULL){ g_object_ref(device); } tic_device->device = (GObject *) device; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_tic_device_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTicDevice *tic_device; tic_device = AGS_TIC_DEVICE(gobject); switch(prop_id){ case PROP_DEVICE: { g_value_set_object(value, tic_device->device); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_tic_device_dispose(GObject *gobject) { AgsTicDevice *tic_device; tic_device = AGS_TIC_DEVICE(gobject); if(tic_device->device != NULL){ g_object_unref(tic_device->device); tic_device->device = NULL; } /* call parent */ G_OBJECT_CLASS(ags_tic_device_parent_class)->dispose(gobject); } void ags_tic_device_finalize(GObject *gobject) { AgsTicDevice *tic_device; tic_device = AGS_TIC_DEVICE(gobject); if(tic_device->device != NULL){ g_object_unref(tic_device->device); } /* call parent */ G_OBJECT_CLASS(ags_tic_device_parent_class)->finalize(gobject); } void ags_tic_device_launch(AgsTask *task) { AgsTicDevice *tic_device; tic_device = AGS_TIC_DEVICE(task); //FIXME:JK: configure realtime disable event if(AGS_IS_SOUNDCARD(tic_device->device)){ AgsSoundcardInterface *soundcard_interface; soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(AGS_SOUNDCARD(tic_device->device)); //soundcard_interface->tic(AGS_SOUNDCARD(tic_device->device)); ags_soundcard_tic(AGS_SOUNDCARD(tic_device->device)); }else if(AGS_IS_SEQUENCER(AGS_SEQUENCER(tic_device->device))){ AgsSequencerInterface *sequencer_interface; sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(AGS_SEQUENCER(tic_device->device)); //sequencer_interface->tic(AGS_SEQUENCER(tic_device->device)); ags_sequencer_tic(AGS_SEQUENCER(tic_device->device)); } } /** * ags_tic_device_new: * @device: the #GObject to tic * * Creates an #AgsTicDevice. * * Returns: an new #AgsTicDevice. * * Since: 3.0.0 */ AgsTicDevice* ags_tic_device_new(GObject *device) { AgsTicDevice *tic_device; tic_device = (AgsTicDevice *) g_object_new(AGS_TYPE_TIC_DEVICE, "device", device, NULL); return(tic_device); } gsequencer-3.1.3/ags/audio/task/ags_add_effect.c0000644000175000017500000002201713607210263016461 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_add_effect_class_init(AgsAddEffectClass *add_effect); void ags_add_effect_connectable_interface_init(AgsConnectableInterface *connectable); void ags_add_effect_init(AgsAddEffect *add_effect); void ags_add_effect_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_add_effect_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_add_effect_connect(AgsConnectable *connectable); void ags_add_effect_disconnect(AgsConnectable *connectable); void ags_add_effect_dispose(GObject *gobject); void ags_add_effect_finalize(GObject *gobject); void ags_add_effect_launch(AgsTask *task); /** * SECTION:ags_add_effect * @short_description: add effect object to context * @title: AgsAddEffect * @section_id: * @include: ags/audio/task/ags_add_effect.h * * The #AgsAddEffect task adds the specified effect to #AgsChannel. */ static gpointer ags_add_effect_parent_class = NULL; static AgsConnectableInterface *ags_add_effect_parent_connectable_interface; enum{ PROP_0, PROP_CHANNEL, PROP_FILENAME, PROP_EFFECT, }; GType ags_add_effect_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_add_effect = 0; static const GTypeInfo ags_add_effect_info = { sizeof (AgsAddEffectClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_add_effect_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAddEffect), 0, /* n_preallocs */ (GInstanceInitFunc) ags_add_effect_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_add_effect_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_add_effect = g_type_register_static(AGS_TYPE_TASK, "AgsAddEffect", &ags_add_effect_info, 0); g_type_add_interface_static(ags_type_add_effect, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_add_effect); } return g_define_type_id__volatile; } void ags_add_effect_class_init(AgsAddEffectClass *add_effect) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_add_effect_parent_class = g_type_class_peek_parent(add_effect); /* gobject */ gobject = (GObjectClass *) add_effect; gobject->set_property = ags_add_effect_set_property; gobject->get_property = ags_add_effect_get_property; gobject->dispose = ags_add_effect_dispose; gobject->finalize = ags_add_effect_finalize; /* properties */ /** * AgsAddEffect:channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel of add effect"), i18n_pspec("The channel of add effect task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsAddEffect:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename containing the effect"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsAddEffect:effect: * * The assigned effect. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("the effect"), i18n_pspec("The effect"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /* task */ task = (AgsTaskClass *) add_effect; task->launch = ags_add_effect_launch; } void ags_add_effect_connectable_interface_init(AgsConnectableInterface *connectable) { ags_add_effect_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_add_effect_connect; connectable->disconnect = ags_add_effect_disconnect; } void ags_add_effect_init(AgsAddEffect *add_effect) { add_effect->channel = NULL; add_effect->filename = NULL; add_effect->effect = NULL; } void ags_add_effect_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAddEffect *add_effect; add_effect = AGS_ADD_EFFECT(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); if(add_effect->channel == channel){ return; } if(add_effect->channel != NULL){ g_object_unref(add_effect->channel); } if(channel != NULL){ g_object_ref(channel); } add_effect->channel = channel; } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(add_effect->filename == filename){ return; } if(add_effect->filename != NULL){ g_free(add_effect->filename); } add_effect->filename = g_strdup(filename); } break; case PROP_EFFECT: { gchar *effect; effect = g_value_get_string(value); if(add_effect->effect == effect){ return; } if(add_effect->effect != NULL){ g_free(add_effect->effect); } add_effect->effect = g_strdup(effect); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_effect_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAddEffect *add_effect; add_effect = AGS_ADD_EFFECT(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, add_effect->channel); } break; case PROP_FILENAME: { g_value_set_string(value, add_effect->filename); } break; case PROP_EFFECT: { g_value_set_string(value, add_effect->effect); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_effect_connect(AgsConnectable *connectable) { ags_add_effect_parent_connectable_interface->connect(connectable); /* empty */ } void ags_add_effect_disconnect(AgsConnectable *connectable) { ags_add_effect_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_add_effect_dispose(GObject *gobject) { AgsAddEffect *add_effect; add_effect = AGS_ADD_EFFECT(gobject); if(add_effect->channel != NULL){ g_object_unref(add_effect->channel); add_effect->channel = NULL; } if(add_effect->filename != NULL){ g_free(add_effect->filename); add_effect->filename = NULL; } if(add_effect->effect != NULL){ g_free(add_effect->effect); add_effect->effect = NULL; } /* call parent */ G_OBJECT_CLASS(ags_add_effect_parent_class)->dispose(gobject); } void ags_add_effect_finalize(GObject *gobject) { AgsAddEffect *add_effect; add_effect = AGS_ADD_EFFECT(gobject); if(add_effect->channel != NULL){ g_object_unref(add_effect->channel); } g_free(add_effect->filename); g_free(add_effect->effect); /* call parent */ G_OBJECT_CLASS(ags_add_effect_parent_class)->finalize(gobject); } void ags_add_effect_launch(AgsTask *task) { AgsAddEffect *add_effect; GList *recall_list; add_effect = AGS_ADD_EFFECT(task); recall_list = ags_channel_add_effect(add_effect->channel, add_effect->filename, add_effect->effect); g_list_free(recall_list); } /** * ags_add_effect_new: * @channel: the #AgsChannel to set up the effect * @filename: the filename including @effect * @effect: the effect's name * * Create a new instance of #AgsAddEffect. * * Returns: the new #AgsAddEffect. * * Since: 3.0.0 */ AgsAddEffect* ags_add_effect_new(AgsChannel *channel, gchar *filename, gchar *effect) { AgsAddEffect *add_effect; add_effect = (AgsAddEffect *) g_object_new(AGS_TYPE_ADD_EFFECT, "channel", channel, "filename", filename, "effect", effect, NULL); return(add_effect); } gsequencer-3.1.3/ags/audio/task/ags_move_note.h0000644000175000017500000000450113607210263016413 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MOVE_NOTE_H__ #define __AGS_MOVE_NOTE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MOVE_NOTE (ags_move_note_get_type()) #define AGS_MOVE_NOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MOVE_NOTE, AgsMoveNote)) #define AGS_MOVE_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MOVE_NOTE, AgsMoveNoteClass)) #define AGS_IS_MOVE_NOTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MOVE_NOTE)) #define AGS_IS_MOVE_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_MOVE_NOTE)) #define AGS_MOVE_NOTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_MOVE_NOTE, AgsMoveNoteClass)) #define AGS_MOVE_NOTE_DEFAULT_X_LENGTH (16 * 16 * 1200) #define AGS_MOVE_NOTE_DEFAULT_Y_LENGTH (1024) typedef struct _AgsMoveNote AgsMoveNote; typedef struct _AgsMoveNoteClass AgsMoveNoteClass; struct _AgsMoveNote { AgsTask task; AgsAudio *audio; AgsNotation *notation; GList *selection; guint first_x; guint first_y; guint move_x; guint move_y; gboolean relative; gboolean absolute; }; struct _AgsMoveNoteClass { AgsTaskClass task; }; GType ags_move_note_get_type(); AgsMoveNote* ags_move_note_new(AgsAudio *audio, AgsNotation *notation, GList *selection, guint first_x, guint first_y, gint move_x, gint move_y, gboolean relative, gboolean absolute); G_END_DECLS #endif /*__AGS_MOVE_NOTE_H__*/ gsequencer-3.1.3/ags/audio/task/ags_remove_soundcard.h0000644000175000017500000000377613607210263017774 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_REMOVE_SOUNDCARD_H__ #define __AGS_REMOVE_SOUNDCARD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_REMOVE_SOUNDCARD (ags_remove_soundcard_get_type()) #define AGS_REMOVE_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_REMOVE_SOUNDCARD, AgsRemoveSoundcard)) #define AGS_REMOVE_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_REMOVE_SOUNDCARD, AgsRemoveSoundcardClass)) #define AGS_IS_REMOVE_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_REMOVE_SOUNDCARD)) #define AGS_IS_REMOVE_SOUNDCARD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_REMOVE_SOUNDCARD)) #define AGS_REMOVE_SOUNDCARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_REMOVE_SOUNDCARD, AgsRemoveSoundcardClass)) typedef struct _AgsRemoveSoundcard AgsRemoveSoundcard; typedef struct _AgsRemoveSoundcardClass AgsRemoveSoundcardClass; struct _AgsRemoveSoundcard { AgsTask task; GObject *soundcard; }; struct _AgsRemoveSoundcardClass { AgsTaskClass task; }; GType ags_remove_soundcard_get_type(); AgsRemoveSoundcard* ags_remove_soundcard_new(GObject *soundcard); G_END_DECLS #endif /*__AGS_REMOVE_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/audio/task/ags_apply_synth.c0000644000175000017500000002707513607210263017000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_apply_synth_class_init(AgsApplySynthClass *apply_synth); void ags_apply_synth_init(AgsApplySynth *apply_synth); void ags_apply_synth_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_apply_synth_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_apply_synth_dispose(GObject *gobject); void ags_apply_synth_finalize(GObject *gobject); void ags_apply_synth_launch(AgsTask *task); /** * SECTION:ags_apply_synth * @short_description: apply synth to channel * @title: AgsApplySynth * @section_id: * @include: ags/audio/task/ags_apply_synth.h * * The #AgsApplySynth task apply the specified synth to channel. */ static gpointer ags_apply_synth_parent_class = NULL; enum{ PROP_0, PROP_SYNTH_GENERATOR, PROP_START_CHANNEL, PROP_BASE_NOTE, PROP_COUNT, }; GType ags_apply_synth_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_apply_synth = 0; static const GTypeInfo ags_apply_synth_info = { sizeof(AgsApplySynthClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_apply_synth_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsApplySynth), 0, /* n_preallocs */ (GInstanceInitFunc) ags_apply_synth_init, }; ags_type_apply_synth = g_type_register_static(AGS_TYPE_TASK, "AgsApplySynth", &ags_apply_synth_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_apply_synth); } return g_define_type_id__volatile; } void ags_apply_synth_class_init(AgsApplySynthClass *apply_synth) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_apply_synth_parent_class = g_type_class_peek_parent(apply_synth); /* GObjectClass */ gobject = (GObjectClass *) apply_synth; gobject->set_property = ags_apply_synth_set_property; gobject->get_property = ags_apply_synth_get_property; gobject->dispose = ags_apply_synth_dispose; gobject->finalize = ags_apply_synth_finalize; /* properties */ /** * AgsApplySynth:synth-generator: * * The assigned #AgsSynthGenerator * * Since: 3.0.0 */ param_spec = g_param_spec_object("synth-generator", i18n_pspec("synth generator"), i18n_pspec("The synth generator to apply"), AGS_TYPE_SYNTH_GENERATOR, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SYNTH_GENERATOR, param_spec); /** * AgsApplySynth:start-channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("start-channel", i18n_pspec("start channel of apply synth"), i18n_pspec("The start channel of apply synth task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_START_CHANNEL, param_spec); /** * AgsApplySynth:base-note: * * The base-note to ramp up from. * * Since: 3.0.0 */ param_spec = g_param_spec_double("base-note", i18n_pspec("base note"), i18n_pspec("The base note to ramp up from"), -78.0, 78.0, -48.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BASE_NOTE, param_spec); /** * AgsApplySynth:count: * * The count of channels to apply. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("count", i18n_pspec("count of channels"), i18n_pspec("The count of channels to apply"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_COUNT, param_spec); /* AgsTaskClass */ task = (AgsTaskClass *) apply_synth; task->launch = ags_apply_synth_launch; } void ags_apply_synth_init(AgsApplySynth *apply_synth) { apply_synth->synth_generator = NULL; apply_synth->start_channel = NULL; apply_synth->count = 0; } void ags_apply_synth_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplySynth *apply_synth; apply_synth = AGS_APPLY_SYNTH(gobject); switch(prop_id){ case PROP_SYNTH_GENERATOR: { AgsSynthGenerator *synth_generator; synth_generator = (AgsSynthGenerator *) g_value_get_object(value); if(apply_synth->synth_generator == synth_generator){ return; } if(apply_synth->synth_generator != NULL){ g_object_unref(apply_synth->synth_generator); } if(synth_generator != NULL){ g_object_ref(synth_generator); } apply_synth->synth_generator = synth_generator; } break; case PROP_START_CHANNEL: { AgsChannel *start_channel; start_channel = (AgsChannel *) g_value_get_object(value); if(apply_synth->start_channel == start_channel){ return; } if(apply_synth->start_channel != NULL){ g_object_unref(apply_synth->start_channel); } if(start_channel != NULL){ g_object_ref(start_channel); } apply_synth->start_channel = start_channel; } break; case PROP_BASE_NOTE: { apply_synth->base_note = g_value_get_double(value); } break; case PROP_COUNT: { apply_synth->count = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_synth_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplySynth *apply_synth; apply_synth = AGS_APPLY_SYNTH(gobject); switch(prop_id){ case PROP_SYNTH_GENERATOR: { g_value_set_object(value, apply_synth->synth_generator); } break; case PROP_START_CHANNEL: { g_value_set_object(value, apply_synth->start_channel); } break; case PROP_BASE_NOTE: { g_value_set_double(value, apply_synth->base_note); } break; case PROP_COUNT: { g_value_set_uint(value, apply_synth->count); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_apply_synth_dispose(GObject *gobject) { AgsApplySynth *apply_synth; apply_synth = AGS_APPLY_SYNTH(gobject); if(apply_synth->synth_generator != NULL){ g_object_unref(apply_synth->synth_generator); apply_synth->synth_generator = NULL; } if(apply_synth->start_channel != NULL){ g_object_unref(apply_synth->start_channel); apply_synth->start_channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_apply_synth_parent_class)->dispose(gobject); } void ags_apply_synth_finalize(GObject *gobject) { AgsApplySynth *apply_synth; apply_synth = AGS_APPLY_SYNTH(gobject); if(apply_synth->synth_generator != NULL){ g_object_unref(apply_synth->synth_generator); } if(apply_synth->start_channel != NULL){ g_object_unref(apply_synth->start_channel); } /* call parent */ G_OBJECT_CLASS(ags_apply_synth_parent_class)->finalize(gobject); } void ags_apply_synth_launch(AgsTask *task) { AgsApplySynth *apply_synth; AgsAudio *audio; AgsChannel *channel, *next_channel, *input; AgsRecycling *first_recycling; AgsAudioSignal *audio_signal; AgsSynthGenerator *synth_generator; GObject *output_soundcard; GList *list_start; GList *rt_template_start, *rt_template; gchar *str; gdouble base_note; gdouble note; guint count; guint i; apply_synth = AGS_APPLY_SYNTH(task); g_return_if_fail(AGS_IS_CHANNEL(apply_synth->start_channel)); g_return_if_fail(AGS_IS_SYNTH_GENERATOR(apply_synth->synth_generator)); channel = apply_synth->start_channel; synth_generator = apply_synth->synth_generator; base_note = apply_synth->base_note; count = apply_synth->count; /* get some fields */ g_object_get(channel, "audio", &audio, NULL); /* compute */ channel = apply_synth->start_channel; if(channel != NULL){ g_object_ref(channel); for(i = 0; channel != NULL && i < apply_synth->count; i++){ /* get some fields */ g_object_get(channel, "first-recycling", &first_recycling, NULL); /* get template */ g_object_get(first_recycling, "output-soundcard", &output_soundcard, "audio-signal", &list_start, NULL); audio_signal = ags_audio_signal_get_template(list_start); if(audio_signal == NULL){ audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; ags_recycling_add_audio_signal(first_recycling, audio_signal); g_object_ref(audio_signal); } /* compute audio signal */ note = apply_synth->base_note + i; ags_synth_generator_compute(synth_generator, (GObject *) audio_signal, note); rt_template = rt_template_start = ags_audio_signal_get_rt_template(list_start); while(rt_template != NULL){ ags_synth_generator_compute(synth_generator, rt_template->data, note); rt_template = rt_template->next; } g_list_free_full(rt_template_start, g_object_unref); g_list_free_full(list_start, g_object_unref); g_object_unref(output_soundcard); g_object_unref(first_recycling); g_object_unref(audio_signal); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } } if(audio != NULL){ g_object_unref(audio); } } /** * ags_apply_synth_new: * @synth_generator: the #AgsSynthGenerator * @start_channel: the start #AgsChannel * @base_note: the base note * @count: the count of lines * * Creates an #AgsApplySynth. * * Returns: an new #AgsApplySynth. * * Since: 3.0.0 */ AgsApplySynth* ags_apply_synth_new(AgsSynthGenerator *synth_generator, AgsChannel *start_channel, gdouble base_note, guint count) { AgsApplySynth *apply_synth; apply_synth = (AgsApplySynth *) g_object_new(AGS_TYPE_APPLY_SYNTH, "synth-generator", synth_generator, "start-channel", start_channel, "base-note", base_note, "count", count, NULL); return(apply_synth); } gsequencer-3.1.3/ags/audio/task/ags_link_channel.c0000644000175000017500000002063313607210263017044 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_link_channel_class_init(AgsLinkChannelClass *link_channel); void ags_link_channel_init(AgsLinkChannel *link_channel); void ags_link_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_link_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_link_channel_dispose(GObject *gobject); void ags_link_channel_finalize(GObject *gobject); void ags_link_channel_launch(AgsTask *task); /** * SECTION:ags_link_channel * @short_description: link channel task * @title: AgsLinkChannel * @section_id: * @include: ags/audio/task/ags_link_channel.h * * The #AgsLinkChannel task links #AgsChannel. */ static gpointer ags_link_channel_parent_class = NULL; enum{ PROP_0, PROP_CHANNEL, PROP_LINK, PROP_ERROR, }; GType ags_link_channel_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_link_channel = 0; static const GTypeInfo ags_link_channel_info = { sizeof(AgsLinkChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_link_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLinkChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_link_channel_init, }; ags_type_link_channel = g_type_register_static(AGS_TYPE_TASK, "AgsLinkChannel", &ags_link_channel_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_link_channel); } return g_define_type_id__volatile; } void ags_link_channel_class_init(AgsLinkChannelClass *link_channel) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_link_channel_parent_class = g_type_class_peek_parent(link_channel); /* GObject */ gobject = (GObjectClass *) link_channel; gobject->set_property = ags_link_channel_set_property; gobject->get_property = ags_link_channel_get_property; gobject->dispose = ags_link_channel_dispose; gobject->finalize = ags_link_channel_finalize; /* properties */ /** * AgsLinkChannel:channel: * * The assigned #AgsChannel * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel of link channel"), i18n_pspec("The channel of link channel task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsLinkChannel:link: * * The assigned #AgsChannel link * * Since: 3.0.0 */ param_spec = g_param_spec_object("link", i18n_pspec("link of link channel"), i18n_pspec("The link of link channel task"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINK, param_spec); /** * AgsLinkChannel:error: * * The assigned #GError-struct * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("error", i18n_pspec("error of link channel"), i18n_pspec("The error of link channel task"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ERROR, param_spec); /* AgsTask */ task = (AgsTaskClass *) link_channel; task->launch = ags_link_channel_launch; } void ags_link_channel_init(AgsLinkChannel *link_channel) { link_channel->channel = NULL; link_channel->link = NULL; link_channel->error = NULL; } void ags_link_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLinkChannel *link_channel; link_channel = AGS_LINK_CHANNEL(gobject); switch(prop_id){ case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); if(link_channel->channel == channel){ return; } if(link_channel->channel != NULL){ g_object_unref(link_channel->channel); } if(channel != NULL){ g_object_ref(channel); } link_channel->channel = channel; } break; case PROP_LINK: { AgsChannel *link; link = (AgsChannel *) g_value_get_object(value); if(link_channel->link == link){ return; } if(link_channel->link != NULL){ g_object_unref(link_channel->link); } if(link != NULL){ g_object_ref(link); } link_channel->link = link; } break; case PROP_ERROR: { GError *error; error = g_value_get_pointer(value); link_channel->error = error; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_link_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLinkChannel *link_channel; link_channel = AGS_LINK_CHANNEL(gobject); switch(prop_id){ case PROP_CHANNEL: { g_value_set_object(value, link_channel->channel); } break; case PROP_LINK: { g_value_set_object(value, link_channel->link); } break; case PROP_ERROR: { g_value_set_pointer(value, link_channel->error); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_link_channel_dispose(GObject *gobject) { AgsLinkChannel *link_channel; link_channel = AGS_LINK_CHANNEL(gobject); if(link_channel->channel != NULL){ g_object_unref(link_channel->channel); link_channel->channel = NULL; } if(link_channel->link != NULL){ g_object_unref(link_channel->link); link_channel->link = NULL; } /* call parent */ G_OBJECT_CLASS(ags_link_channel_parent_class)->dispose(gobject); } void ags_link_channel_finalize(GObject *gobject) { AgsLinkChannel *link_channel; link_channel = AGS_LINK_CHANNEL(gobject); if(link_channel->channel != NULL){ g_object_unref(link_channel->channel); } if(link_channel->link != NULL){ g_object_unref(link_channel->link); } /* call parent */ G_OBJECT_CLASS(ags_link_channel_parent_class)->finalize(gobject); } void ags_link_channel_launch(AgsTask *task) { AgsChannel *channel, *link; AgsLinkChannel *link_channel; link_channel = AGS_LINK_CHANNEL(task); channel = link_channel->channel; link = link_channel->link; if((channel != NULL && channel->link == link) || (link != NULL && link->link == channel)){ return; } /* unset file-link */ if(AGS_IS_INPUT(channel)){ g_object_set(channel, "file-link", NULL, NULL); } /* unset file-link */ if(AGS_IS_INPUT(link)){ g_object_set(link, "file-link", NULL, NULL); } /* unlink first */ //NOTE:JK: may be we want to improve this ags_channel_set_link(channel, NULL, NULL); ags_channel_set_link(link, NULL, NULL); /* link channel */ ags_channel_set_link(channel, link, &(link_channel->error)); if(link_channel->error != NULL){ g_message("%s", link_channel->error->message); } } /** * ags_link_channel_new: * @channel: the #AgsChannel * @link: the #AgsChannel to be linked, may be %NULL * * Create a new instance of #AgsLinkChannel. * * Returns: the new #AgsLinkChannel. * * Since: 3.0.0 */ AgsLinkChannel* ags_link_channel_new(AgsChannel *channel, AgsChannel *link) { AgsLinkChannel *link_channel; link_channel = (AgsLinkChannel *) g_object_new(AGS_TYPE_LINK_CHANNEL, "channel", channel, "link", link, NULL); return(link_channel); } gsequencer-3.1.3/ags/audio/task/ags_add_audio.c0000644000175000017500000001572013607210263016331 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_add_audio_class_init(AgsAddAudioClass *add_audio); void ags_add_audio_connectable_interface_init(AgsConnectableInterface *connectable); void ags_add_audio_init(AgsAddAudio *add_audio); void ags_add_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_add_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_add_audio_dispose(GObject *gobject); void ags_add_audio_finalize(GObject *gobject); void ags_add_audio_launch(AgsTask *task); enum{ PROP_0, PROP_AUDIO, }; /** * SECTION:ags_add_audio * @short_description: add audio object to application context * @title: AgsAddAudio * @section_id: * @include: ags/audio/task/ags_add_audio.h * * The #AgsAddAudio task adds #AgsAudio to #AgsApplicationContext. */ static gpointer ags_add_audio_parent_class = NULL; static AgsConnectableInterface *ags_add_audio_parent_connectable_interface; GType ags_add_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_add_audio = 0; static const GTypeInfo ags_add_audio_info = { sizeof (AgsAddAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_add_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAddAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_add_audio_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_add_audio_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_add_audio = g_type_register_static(AGS_TYPE_TASK, "AgsAddAudio", &ags_add_audio_info, 0); g_type_add_interface_static(ags_type_add_audio, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_add_audio); } return g_define_type_id__volatile; } void ags_add_audio_class_init(AgsAddAudioClass *add_audio) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_add_audio_parent_class = g_type_class_peek_parent(add_audio); /* gobject */ gobject = (GObjectClass *) add_audio; gobject->set_property = ags_add_audio_set_property; gobject->get_property = ags_add_audio_get_property; gobject->dispose = ags_add_audio_dispose; gobject->finalize = ags_add_audio_finalize; /* properties */ /** * AgsAddAudio:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of add audio"), i18n_pspec("The audio of add audio task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /* task */ task = (AgsTaskClass *) add_audio; task->launch = ags_add_audio_launch; } void ags_add_audio_connectable_interface_init(AgsConnectableInterface *connectable) { ags_add_audio_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_add_audio_init(AgsAddAudio *add_audio) { add_audio->audio = NULL; } void ags_add_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAddAudio *add_audio; add_audio = AGS_ADD_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(add_audio->audio == audio){ return; } if(add_audio->audio != NULL){ g_object_unref(add_audio->audio); } if(audio != NULL){ g_object_ref(audio); } add_audio->audio = audio; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAddAudio *add_audio; add_audio = AGS_ADD_AUDIO(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, add_audio->audio); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_add_audio_dispose(GObject *gobject) { AgsAddAudio *add_audio; add_audio = AGS_ADD_AUDIO(gobject); if(add_audio->audio != NULL){ g_object_unref(add_audio->audio); add_audio->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_add_audio_parent_class)->dispose(gobject); } void ags_add_audio_finalize(GObject *gobject) { AgsAddAudio *add_audio; add_audio = AGS_ADD_AUDIO(gobject); if(add_audio->audio != NULL){ g_object_unref(add_audio->audio); } /* call parent */ G_OBJECT_CLASS(ags_add_audio_parent_class)->finalize(gobject); } void ags_add_audio_launch(AgsTask *task) { AgsAddAudio *add_audio; AgsApplicationContext *application_context; GList *start_list; add_audio = AGS_ADD_AUDIO(task); application_context = ags_application_context_get_instance(); g_return_if_fail(AGS_IS_SOUND_PROVIDER(application_context)); g_return_if_fail(AGS_IS_AUDIO(add_audio->audio)); /* ref audio */ g_object_ref(add_audio->audio); /* add to sound provider */ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); g_list_foreach(start_list, (GFunc) g_object_unref, NULL); g_object_ref(add_audio->audio); start_list = g_list_append(start_list, add_audio->audio); ags_sound_provider_set_audio(AGS_SOUND_PROVIDER(application_context), start_list); /* AgsAudio */ ags_connectable_connect(AGS_CONNECTABLE(add_audio->audio)); } /** * ags_add_audio_new: * @audio: the #AgsAudio to add * * Creates an #AgsAddAudio. * * Returns: an new #AgsAddAudio. * * Since: 3.0.0 */ AgsAddAudio* ags_add_audio_new(AgsAudio *audio) { AgsAddAudio *add_audio; add_audio = (AgsAddAudio *) g_object_new(AGS_TYPE_ADD_AUDIO, "audio", audio, NULL); return(add_audio); } gsequencer-3.1.3/ags/audio/task/ags_open_wave.c0000644000175000017500000002431013607210263016376 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_open_wave_class_init(AgsOpenWaveClass *open_wave); void ags_open_wave_init(AgsOpenWave *open_wave); void ags_open_wave_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_open_wave_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_open_wave_dispose(GObject *gobject); void ags_open_wave_finalize(GObject *gobject); void ags_open_wave_launch(AgsTask *task); /** * SECTION:ags_open_wave * @short_description: open wave * @title: AgsOpenWave * @section_id: * @include: ags/audio/task/ags_open_wave.h * * The #AgsOpenWave task opens audio files as wave. */ static gpointer ags_open_wave_parent_class = NULL; enum{ PROP_0, PROP_AUDIO, PROP_AUDIO_FILE, PROP_FILENAME, PROP_START_PAD, }; GType ags_open_wave_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_open_wave = 0; static const GTypeInfo ags_open_wave_info = { sizeof(AgsOpenWaveClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_open_wave_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsOpenWave), 0, /* n_preallocs */ (GInstanceInitFunc) ags_open_wave_init, }; ags_type_open_wave = g_type_register_static(AGS_TYPE_TASK, "AgsOpenWave", &ags_open_wave_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_open_wave); } return g_define_type_id__volatile; } void ags_open_wave_class_init(AgsOpenWaveClass *open_wave) { GObjectClass *gobject; AgsTaskClass *task; GParamSpec *param_spec; ags_open_wave_parent_class = g_type_class_peek_parent(open_wave); /* GObject */ gobject = (GObjectClass *) open_wave; gobject->set_property = ags_open_wave_set_property; gobject->get_property = ags_open_wave_get_property; gobject->dispose = ags_open_wave_dispose; gobject->finalize = ags_open_wave_finalize; /* properties */ /** * AgsOpenWave:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of open sf2 instrument"), i18n_pspec("The audio of open sf2 instrument task"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsOpenWave:audio-file: * * The assigned #AgsAudioFile * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-file", i18n_pspec("audio file object"), i18n_pspec("The audio file object to create the wave from"), AGS_TYPE_AUDIO_FILE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_FILE, param_spec); /** * AgsOpenWave:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename containing the sf2 instrument"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsOpenWave:start-pad: * * The assigned start-pad. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("start-pad", i18n_pspec("the start pad"), i18n_pspec("The start pad"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_START_PAD, param_spec); /* AgsTask */ task = (AgsTaskClass *) open_wave; task->launch = ags_open_wave_launch; } void ags_open_wave_init(AgsOpenWave *open_wave) { open_wave->audio = NULL; open_wave->audio_file = NULL; open_wave->filename = NULL; open_wave->start_pad = 0; } void ags_open_wave_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOpenWave *open_wave; open_wave = AGS_OPEN_WAVE(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); if(open_wave->audio == audio){ return; } if(open_wave->audio != NULL){ g_object_unref(open_wave->audio); } if(audio != NULL){ g_object_ref(audio); } open_wave->audio = audio; } break; case PROP_AUDIO_FILE: { AgsAudioFile *audio_file; audio_file = (AgsAudioFile *) g_value_get_object(value); if(open_wave->audio_file == audio_file){ return; } if(open_wave->audio_file != NULL){ g_object_unref(open_wave->audio_file); } if(audio_file != NULL){ g_object_ref(audio_file); } open_wave->audio_file = audio_file; } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); if(open_wave->filename == filename){ return; } if(open_wave->filename != NULL){ g_free(open_wave->filename); } open_wave->filename = g_strdup(filename); } break; case PROP_START_PAD: { open_wave->start_pad = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_wave_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOpenWave *open_wave; open_wave = AGS_OPEN_WAVE(gobject); switch(prop_id){ case PROP_AUDIO: { g_value_set_object(value, open_wave->audio); } break; case PROP_AUDIO_FILE: { g_value_set_object(value, open_wave->audio_file); } break; case PROP_FILENAME: { g_value_set_string(value, open_wave->filename); } break; case PROP_START_PAD: { g_value_set_uint(value, open_wave->start_pad); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_open_wave_dispose(GObject *gobject) { AgsOpenWave *open_wave; open_wave = AGS_OPEN_WAVE(gobject); if(open_wave->audio != NULL){ g_object_unref(open_wave->audio); open_wave->audio = NULL; } if(open_wave->audio_file != NULL){ g_object_unref(open_wave->audio_file); open_wave->audio_file = NULL; } /* call parent */ G_OBJECT_CLASS(ags_open_wave_parent_class)->dispose(gobject); } void ags_open_wave_finalize(GObject *gobject) { AgsOpenWave *open_wave; open_wave = AGS_OPEN_WAVE(gobject); if(open_wave->audio != NULL){ g_object_unref(open_wave->audio); } if(open_wave->audio_file != NULL){ g_object_unref(open_wave->audio_file); } g_free(open_wave->filename); /* call parent */ G_OBJECT_CLASS(ags_open_wave_parent_class)->finalize(gobject); } void ags_open_wave_launch(AgsTask *task) { AgsAudio *audio; AgsChannel *start_channel, *channel; AgsAudioFile *audio_file; AgsOpenWave *open_wave; GObject *output_soundcard; GList *start_list, *list; guint n_pads, current_pads; guint n_audio_channels, current_audio_channels; open_wave = (AgsOpenWave *) task; g_return_if_fail(AGS_IS_AUDIO(open_wave->audio)); audio = open_wave->audio; audio_file = open_wave->audio_file; if(audio_file == NULL){ //TODO:JK: implement me return; } /* get some fields */ g_object_get(audio, "input-pads", &n_pads, "audio-channels", &n_audio_channels, "output-soundcard", &output_soundcard, NULL); ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(audio_file->sound_resource), ¤t_audio_channels, NULL, NULL, NULL); if(current_audio_channels > n_audio_channels){ n_audio_channels = current_audio_channels; } if(n_audio_channels > 0){ GList *start_wave, *wave; /* resize */ ags_audio_set_audio_channels(audio, n_audio_channels, 0); if(n_pads < open_wave->start_pad + 1){ ags_audio_set_pads(audio, AGS_TYPE_INPUT, open_wave->start_pad + 1, 0); } wave = start_wave = ags_sound_resource_read_wave(AGS_SOUND_RESOURCE(audio_file->sound_resource), output_soundcard, -1, 0, 0.0, 0); while(wave != NULL){ guint current_line; g_object_get(wave->data, "line", ¤t_line, NULL); g_object_set(wave->data, "line", (open_wave->start_pad * n_audio_channels) + current_line, NULL); ags_audio_add_wave(audio, wave->data); wave = wave->next; } g_list_free(start_wave); } } /** * ags_open_wave_new: * @audio: the #AgsAudio * @audio_file: the #AgsAudioFile or %NULL * @filename: the Soundfont2 file * @start_pad: the pad start * * Creates an #AgsOpenWave. * * Returns: an new #AgsOpenWave. * * Since: 3.0.0 */ AgsOpenWave* ags_open_wave_new(AgsAudio *audio, AgsAudioFile *audio_file, gchar *filename, guint start_pad) { AgsOpenWave *open_wave; open_wave = (AgsOpenWave *) g_object_new(AGS_TYPE_OPEN_WAVE, "audio", audio, "audio-file", audio_file, "filename", filename, "start-pad", start_pad, NULL); return(open_wave); } gsequencer-3.1.3/ags/audio/ags_output.h0000644000175000017500000000365513607210263015027 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OUTPUT_H__ #define __AGS_OUTPUT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OUTPUT (ags_output_get_type()) #define AGS_OUTPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OUTPUT, AgsOutput)) #define AGS_OUTPUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OUTPUT, AgsOutputClass)) #define AGS_IS_OUTPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OUTPUT)) #define AGS_IS_OUTPUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OUTPUT)) #define AGS_OUTPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OUTPUT, AgsOutputClass)) typedef struct _AgsOutput AgsOutput; typedef struct _AgsOutputClass AgsOutputClass; struct _AgsOutput { AgsChannel channel; }; struct _AgsOutputClass { AgsChannelClass channel; }; GType ags_output_get_type(); AgsRecycling* ags_output_find_first_input_recycling(AgsOutput *output); AgsRecycling* ags_output_find_last_input_recycling(AgsOutput *output); AgsOutput* ags_output_new(GObject *audio); G_END_DECLS #endif /*__AGS_OUTPUT_H__*/ gsequencer-3.1.3/ags/audio/ags_input.h0000644000175000017500000000465213607210263014624 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INPUT_H__ #define __AGS_INPUT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_INPUT (ags_input_get_type()) #define AGS_INPUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_INPUT, AgsInput)) #define AGS_INPUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_INPUT, AgsInputClass)) #define AGS_IS_INPUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_INPUT)) #define AGS_IS_INPUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_INPUT)) #define AGS_INPUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_INPUT, AgsInputClass)) #define AGS_INPUT_SYNTH_BASE_NOTE (-48.0) typedef struct _AgsInput AgsInput; typedef struct _AgsInputClass AgsInputClass; struct _AgsInput { AgsChannel channel; GObject *file_link; GList *synth_generator; }; struct _AgsInputClass { AgsChannelClass channel; }; GType ags_input_get_type(); /* dispatcher helper */ gboolean ags_input_is_active(AgsInput *input, GObject *recycling_context); AgsInput* ags_input_next_active(AgsInput *input, GObject *recycling_context); /* synth generator */ void ags_input_add_synth_generator(AgsInput *input, GObject *synth_generator); void ags_input_remove_synth_generator(AgsInput *input, GObject *synth_generator); /* open file */ gboolean ags_input_open_file(AgsInput *input, gchar *filename, gchar *preset, gchar *instrument, gchar *sample, guint audio_channel); /* instantiate */ AgsInput* ags_input_new(GObject *audio); G_END_DECLS #endif /*__AGS_INPUT_H__*/ gsequencer-3.1.3/ags/audio/midi/0000755000175000017500000000000013622252264013461 500000000000000gsequencer-3.1.3/ags/audio/midi/ags_midi_parser.h0000644000175000017500000001563013607210263016703 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_PARSER_H__ #define __AGS_MIDI_PARSER_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_PARSER (ags_midi_parser_get_type ()) #define AGS_MIDI_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_PARSER, AgsMidiParser)) #define AGS_MIDI_PARSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_PARSER, AgsMidiParserClass)) #define AGS_IS_MIDI_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDI_PARSER)) #define AGS_IS_MIDI_PARSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDI_PARSER)) #define AGS_MIDI_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MIDI_PARSER, AgsMidiParserClass)) #define AGS_MIDI_PARSER_GET_OBJ_MUTEX(obj) (&(((AgsMidiParser *) obj)->obj_mutex)) #define AGS_MIDI_PARSER_MAX_TEXT_LENGTH (4096) #define AGS_MIDI_PARSER_MTHD "MThd" #define AGS_MIDI_PARSER_MTCK "MTrk" #define AGS_MIDI_EVENT "event" typedef struct _AgsMidiParser AgsMidiParser; typedef struct _AgsMidiParserClass AgsMidiParserClass; typedef enum{ AGS_MIDI_PARSER_EOF = 1, AGS_MIDI_PARSER_EOT = 1 << 1, }AgsMidiParserFlags; typedef enum{ AGS_MIDI_CHUNK_HEADER = 1, AGS_MIDI_CHUNK_TRACK = 1 << 1, AGS_MIDI_CHUNK_UNKNOWN = 1 << 2, }AgsMidiChunkFlags; struct _AgsMidiParser { GObject gobject; guint flags; GRecMutex obj_mutex; FILE *file; guint nth_chunk; guchar *buffer; size_t file_length; size_t offset; guint current_time; guchar current_status; xmlDoc *doc; }; struct _AgsMidiParserClass { GObjectClass gobject; int (*midi_getc)(AgsMidiParser *midi_parser); void (*on_error)(AgsMidiParser *midi_parser, GError **error); xmlDoc* (*parse_full)(AgsMidiParser *midi_parser); xmlNode* (*parse_bytes)(AgsMidiParser *midi_parser, guchar *midi_buffer, guint buffer_length); xmlNode* (*parse_header)(AgsMidiParser *midi_parser); xmlNode* (*parse_track)(AgsMidiParser *midi_parser); xmlNode* (*key_on)(AgsMidiParser *midi_parser, guint status); xmlNode* (*key_off)(AgsMidiParser *midi_parser, guint status); xmlNode* (*key_pressure)(AgsMidiParser *midi_parser, guint status); xmlNode* (*change_parameter)(AgsMidiParser *midi_parser, guint status); xmlNode* (*change_pitch_bend)(AgsMidiParser *midi_parser, guint status); xmlNode* (*change_program)(AgsMidiParser *midi_parser, guint status); xmlNode* (*change_channel_pressure)(AgsMidiParser *midi_parser, guint status); xmlNode* (*not_defined)(AgsMidiParser *midi_parser, guint status); xmlNode* (*sysex)(AgsMidiParser *midi_parser, guint status); xmlNode* (*system_common)(AgsMidiParser *midi_parser, guint status); xmlNode* (*meta_event)(AgsMidiParser *midi_parser, guint status); xmlNode* (*sequence_number)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*end_of_track)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*smtpe)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*tempo)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*time_signature)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*key_signature)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*sequencer_meta_event)(AgsMidiParser *midi_parser, guint meta_type); xmlNode* (*text_event)(AgsMidiParser *midi_parser, guint meta_type); }; GType ags_midi_parser_get_type(void); gint16 ags_midi_parser_read_gint16(AgsMidiParser *midi_parser); gint32 ags_midi_parser_read_gint24(AgsMidiParser *midi_parser); gint32 ags_midi_parser_read_gint32(AgsMidiParser *midi_parser); long ags_midi_parser_read_varlength(AgsMidiParser *midi_parser); gchar* ags_midi_parser_read_text(AgsMidiParser *midi_parser, gint length); gdouble ags_midi_parser_ticks_to_sec(AgsMidiParser *midi_parser, guint ticks, gint division, guint tempo); int ags_midi_parser_midi_getc(AgsMidiParser *midi_parser); void ags_midi_parser_on_error(AgsMidiParser *midi_parser, GError **error); xmlDoc* ags_midi_parser_parse_full(AgsMidiParser *midi_parser); xmlNode* ags_midi_parser_parse_bytes(AgsMidiParser *midi_parser, guchar *midi_buffer, guint buffer_length); xmlNode* ags_midi_parser_parse_header(AgsMidiParser *midi_parser); xmlNode* ags_midi_parser_parse_track(AgsMidiParser *midi_parser); xmlNode* ags_midi_parser_channel_message(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_key_on(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_key_off(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_key_pressure(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_change_parameter(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_change_pitch_bend(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_change_program(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_change_channel_pressure(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_not_defined(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_sysex(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_system_common(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_meta_event(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_sequence_number(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_end_of_track(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_smtpe(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_tempo(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_time_signature(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_key_signature(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_sequencer_meta_event(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_meta_misc(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_text_event(AgsMidiParser *midi_parser, guint meta_type); AgsMidiParser* ags_midi_parser_new(FILE *file); G_END_DECLS #endif /*__AGS_MIDI_PARSER_H__*/ gsequencer-3.1.3/ags/audio/midi/ags_midi_builder.c0000644000175000017500000022570613607210263017037 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_midi_builder_class_init(AgsMidiBuilderClass *midi_builder); void ags_midi_builder_init(AgsMidiBuilder *midi_builder); void ags_midi_builder_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_builder_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_builder_finalize(GObject *gobject); void ags_midi_builder_real_midi_putc(AgsMidiBuilder *midi_builder, int c); void ags_midi_builder_real_on_error(AgsMidiBuilder *builder, GError **error); /* channel messages */ void ags_midi_builder_real_append_header(AgsMidiBuilder *midi_builder, guint offset, guint format, guint track_count, guint division, guint times, guint bpm, guint clicks); void ags_midi_builder_real_append_track(AgsMidiBuilder *midi_builder, gchar *track_name); void ags_midi_builder_real_append_key_on(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity); void ags_midi_builder_real_append_key_off(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity); void ags_midi_builder_real_append_key_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint pressure); void ags_midi_builder_real_append_change_parameter(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint control, guint value); void ags_midi_builder_real_append_change_pitch_bend(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pitch, guint transmitter); void ags_midi_builder_real_append_change_program(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint program); void ags_midi_builder_real_append_change_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pressure); /* sysex and system common */ void ags_midi_builder_real_append_sysex(AgsMidiBuilder *midi_builder, guint delta_time, guchar *sysex_data, guint length); void ags_midi_builder_real_append_quarter_frame(AgsMidiBuilder *midi_builder, guint delta_time, guint message_type, guint values); void ags_midi_builder_real_append_song_position(AgsMidiBuilder *midi_builder, guint delta_time, guint song_position); void ags_midi_builder_real_append_song_select(AgsMidiBuilder *midi_builder, guint delta_time, guint song_select); void ags_midi_builder_real_append_tune_request(AgsMidiBuilder *midi_builder, guint delta_time); /* meta events */ void ags_midi_builder_real_append_sequence_number(AgsMidiBuilder *midi_builder, guint delta_time, guint sequence); void ags_midi_builder_real_append_smtpe(AgsMidiBuilder *midi_builder, guint delta_time, guint rr, guint hr, guint mn, guint se, guint fr); void ags_midi_builder_real_append_tempo(AgsMidiBuilder *midi_builder, guint delta_time, guint tempo); void ags_midi_builder_real_append_time_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint nn, guint dd, guint cc, guint bb); void ags_midi_builder_real_append_key_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint sf, guint mi); void ags_midi_builder_real_append_sequencer_meta_event(AgsMidiBuilder *midi_builder, guint delta_time, guint len, guint id, guint data); void ags_midi_builder_real_append_text_event(AgsMidiBuilder *midi_builder, guint delta_time, gchar *text, guint length); void ags_midi_builder_append_xml_node_header(AgsMidiBuilder *midi_builder, xmlNode *node); void ags_midi_builder_append_xml_node_tracks(AgsMidiBuilder *midi_builder, xmlNode *node); void ags_midi_builder_append_xml_node_track(AgsMidiBuilder *midi_builder, xmlNode *node); void ags_midi_builder_append_xml_node_message(AgsMidiBuilder *midi_builder, xmlNode *node); void ags_midi_builder_append_xml_node_system_common(AgsMidiBuilder *midi_builder, xmlNode *node); void ags_midi_builder_append_xml_node_meta_event(AgsMidiBuilder *midi_builder, xmlNode *node); /** * SECTION:ags_midi_builder * @short_description: MIDI builder * @title: AgsMidiBuilder * @section_id: * @include: ags/audio/midi/ags_midi_builder.h * * The #AgsMidiBuilder lets you create MIDI files using its builder functions. */ enum{ PROP_0, PROP_FILE, }; enum{ MIDI_PUTC, ON_ERROR, APPEND_HEADER, APPEND_TRACK, KEY_ON, KEY_OFF, KEY_PRESSURE, CHANGE_PARAMETER, CHANGE_PITCH_BEND, CHANGE_PROGRAM, CHANGE_PRESSURE, SYSEX, QUARTER_FRAME, SONG_POSITION, SONG_SELECT, TUNE_REQUEST, SEQUENCE_NUMBER, SMTPE, TEMPO, TIME_SIGNATURE, KEY_SIGNATURE, SEQUENCER_META_EVENT, TEXT_EVENT, LAST_SIGNAL, }; static gpointer ags_midi_builder_parent_class = NULL; static guint midi_builder_signals[LAST_SIGNAL]; GType ags_midi_builder_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_builder = 0; static const GTypeInfo ags_midi_builder_info = { sizeof (AgsMidiBuilderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_builder_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiBuilder), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_builder_init, }; ags_type_midi_builder = g_type_register_static(G_TYPE_OBJECT, "AgsMidiBuilder", &ags_midi_builder_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_builder); } return g_define_type_id__volatile; } void ags_midi_builder_class_init(AgsMidiBuilderClass *midi_builder) { GObjectClass *gobject; GParamSpec *param_spec; ags_midi_builder_parent_class = g_type_class_peek_parent(midi_builder); /* GObjectClass */ gobject = (GObjectClass *) midi_builder; gobject->set_property = ags_midi_builder_set_property; gobject->get_property = ags_midi_builder_get_property; gobject->finalize = ags_midi_builder_finalize; /* properties */ /** * AgsMidiBuilder:file: * * The file to parse data from. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("file", i18n_pspec("the file stream"), i18n_pspec("The file stream to parse"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); /* AgsMidiBuilderClass */ midi_builder->midi_putc = ags_midi_builder_real_midi_putc; midi_builder->on_error = ags_midi_builder_real_on_error; midi_builder->append_header = ags_midi_builder_real_append_header; midi_builder->append_track = ags_midi_builder_real_append_track; midi_builder->append_key_on = ags_midi_builder_real_append_key_on; midi_builder->append_key_off = ags_midi_builder_real_append_key_off; midi_builder->append_key_pressure = ags_midi_builder_real_append_key_pressure; midi_builder->append_change_parameter = ags_midi_builder_real_append_change_parameter; midi_builder->append_change_pitch_bend = ags_midi_builder_real_append_change_pitch_bend; midi_builder->append_change_program = ags_midi_builder_real_append_change_program; midi_builder->append_change_pressure = ags_midi_builder_real_append_change_pressure; midi_builder->append_sysex = ags_midi_builder_real_append_sysex; midi_builder->append_quarter_frame = ags_midi_builder_real_append_quarter_frame; midi_builder->append_song_position = ags_midi_builder_real_append_song_position; midi_builder->append_song_select = ags_midi_builder_real_append_song_select; midi_builder->append_tune_request = ags_midi_builder_real_append_tune_request; midi_builder->append_sequence_number = ags_midi_builder_real_append_sequence_number; midi_builder->append_smtpe = ags_midi_builder_real_append_smtpe; midi_builder->append_tempo = ags_midi_builder_real_append_tempo; midi_builder->append_time_signature = ags_midi_builder_real_append_time_signature; midi_builder->append_key_signature = ags_midi_builder_real_append_key_signature; midi_builder->append_sequencer_meta_event = ags_midi_builder_real_append_sequencer_meta_event; midi_builder->append_text_event = ags_midi_builder_real_append_text_event; /* signals */ /** * AgsMidiBuilder::midi-putc: * @midi_builder: the builder * @error: the #GError * * The ::midi-putc signal is emited during putting char to file. * * Since: 3.0.0 */ midi_builder_signals[MIDI_PUTC] = g_signal_new("midi-putc", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, midi_putc), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); /** * AgsMidiBuilder::on-error: * @midi_builder: the builder * @error: the #GError * * The ::on-error signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[ON_ERROR] = g_signal_new("on-error", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, on_error), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsMidiBuilder::append-header: * @midi_builder: the builder * @offset: start delta-time * @format: format 0, 1 or 2 * @track_count: the number of tracks * @division: timing division * @times: pulses per quarter note * @bpm: beats per minute * @clicks: timing clicks * * The ::append-header signal is emited during building of header. * * Since: 3.0.0 */ midi_builder_signals[APPEND_HEADER] = g_signal_new("append-header", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_header), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT, G_TYPE_NONE, 7, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-track: * @midi_builder: the builder * @track_name: the trach name * * The ::append-track signal is emited during building of track. * * Since: 3.0.0 */ midi_builder_signals[APPEND_TRACK] = g_signal_new("append-track", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_track), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); /** * AgsMidiBuilder::append-key-on: * @midi_builder: the builder * @delta_time: delta-time * @audio_channel: the audio channel * @note: the note to play from 0 to 128 * @velocity: key dynamics * * The ::append-key-on signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[KEY_ON] = g_signal_new("key-on", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_key_on), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-key-off: * @midi_builder: the builders * @delta_time: delta-time * @audio_channel: the audio channel * @note: the note to stop play from 0 to 128 * @velocity: key dynamics * * The ::append-key-off signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[KEY_OFF] = g_signal_new("key-off", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_key_off), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-key-pressure: * @midi_builder: the builder * @delta_time: delta-time * @audio_channel: the audio channel * @note: the note to press from 0 to 128 * @pressure: the amount of the pressure * * The ::append-key-pressure signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[KEY_PRESSURE] = g_signal_new("key-pressure", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_key_pressure), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-change-parameter: * @midi_builder: the builder * @delta_time: delta-time * @channel: the audio channel * @control: the control * @value: and its value * * The ::append-change-parameter signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[CHANGE_PARAMETER] = g_signal_new("change-parameter", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_change_parameter), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-change-pitch-bend: * @midi_builder: the builder * @delta_time: delta-time * @channel: the audio channel * @pitch: amount of pitch as 14 bit quantifier, 0, 0x2000 to 0x3fff * @transmitter: sensitivy of the wheel * * The ::append-change-pitch-bend signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[CHANGE_PITCH_BEND] = g_signal_new("change-pitch-bend", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_change_pitch_bend), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-change-program: * @midi_builder: the builder * @delta_time: delta-time * @channel: the audio channel * @program: the new programm * * The ::append-change-program signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[CHANGE_PROGRAM] = g_signal_new("change-program", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_change_program), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-change-channel-pressure: * @midi_builder: the builder * @delta_time: delta-time * @channel: the audio channel * @pressure: the new pressure, aftertouch * * The ::append-change-channel-pressure signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[CHANGE_PRESSURE] = g_signal_new("change-channel-pressure", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_change_pressure), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-sysex: * @midi_builder: the builder * @delta_time: delta-time * @sysex_data: the data array * @length: the length of the array * * The ::append-sysex signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[SYSEX] = g_signal_new("sysex", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_sysex), NULL, NULL, ags_cclosure_marshal_VOID__UINT_POINTER_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_POINTER, G_TYPE_UINT); /** * AgsMidiBuilder::append-quarter-frame: * @midi_builder: the builder * @delta_time: the delta time * @message_type: the message type * @values: the values * * The ::append-quarter-frame signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[QUARTER_FRAME] = g_signal_new("quarter-frame", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_quarter_frame), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-song-position: * @midi_builder: the builder * @delta_time: delta-time * @song_position: the current position from 0x0 to 0x3fff * * The ::append-song-position signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[SONG_POSITION] = g_signal_new("song-position", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_song_position), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-song-select: * @midi_builder: the builder * @delta_time: delta-time * @song_select: the song or sequence * * The ::append-song-select signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[SONG_SELECT] = g_signal_new("song-select", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_song_select), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-tune-request: * @midi_builder: the builder * @delta_time: delta-time * * The ::append-tune-request signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[TUNE_REQUEST] = g_signal_new("tune-request", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_tune_request), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsMidiBuilder::append-sequence-number: * @midi_builder: the builder * @delta_time: delta-time * @sequence: the nth sequence * * The ::append-sequence-number signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[SEQUENCE_NUMBER] = g_signal_new("sequence-number", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_sequence_number), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-smtpe: * @midi_builder: the builder * @delta_time: delta-time * @hr: hours * @mn: minutes * @se: seconds * @fr: frame number * @ff: frequency * * The ::append-smtpe signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[SMTPE] = g_signal_new("smtpe", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_smtpe), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT, G_TYPE_NONE, 6, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-tempo: * @midi_builder: the builder * @delta_time: delta-time * @tempo: the tempo number as 24-bit quantifier * * The ::append-tempo signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[TEMPO] = g_signal_new("tempo", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_tempo), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-time-signature: * @midi_builder: the builder * @delta_time: delta time * @nn: numerator * @dd: denominator * @cc: ticks per metronome click * @bb: 32nd per quarter note * * The ::append-time-signature signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[TIME_SIGNATURE] = g_signal_new("time-signature", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_time_signature), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT, G_TYPE_NONE, 5, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-key-signature: * @midi_builder: the builder * @delta_time: delta-time * @sf: signature frame * @mi: if %TRUE minor else major * * The ::append-key-signature signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[KEY_SIGNATURE] = g_signal_new("key-signature", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_key_signature), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_BOOLEAN); /** * AgsMidiBuilder::append-sequencer-meta-event: * @midi_builder: the builder * @delta_time: delta-time * @len: length * @id: identifier * @data: buffer * * The ::append-sequencer-meta-event signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[SEQUENCER_META_EVENT] = g_signal_new("sequencer-meta-event", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_sequencer_meta_event), NULL, NULL, ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT, G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT); /** * AgsMidiBuilder::append-text-event: * @midi_builder: the builder * @delta_time: delta-time * @text: the text * @length: length * * The ::append-text-event signal is emited during building of event. * * Since: 3.0.0 */ midi_builder_signals[TEXT_EVENT] = g_signal_new("text-event", G_TYPE_FROM_CLASS(midi_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiBuilderClass, append_text_event), NULL, NULL, ags_cclosure_marshal_VOID__UINT_STRING_UINT, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT); } void ags_midi_builder_init(AgsMidiBuilder *midi_builder) { midi_builder->flags = 0; /* midi builder mutex */ g_rec_mutex_init(&(midi_builder->obj_mutex)); midi_builder->data = NULL; midi_builder->length = 0; midi_builder->file = NULL; midi_builder->midi_header = NULL; midi_builder->midi_track = NULL; midi_builder->current_midi_track = NULL; } void ags_midi_builder_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiBuilder *midi_builder; GRecMutex *midi_builder_mutex; midi_builder = AGS_MIDI_BUILDER(gobject); /* get midi builder mutex */ midi_builder_mutex = AGS_MIDI_BUILDER_GET_OBJ_MUTEX(midi_builder); switch(prop_id){ case PROP_FILE: { g_rec_mutex_lock(midi_builder_mutex); midi_builder->file = g_value_get_pointer(value); g_rec_mutex_unlock(midi_builder_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_builder_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiBuilder *midi_builder; GRecMutex *midi_builder_mutex; midi_builder = AGS_MIDI_BUILDER(gobject); /* get midi builder mutex */ midi_builder_mutex = AGS_MIDI_BUILDER_GET_OBJ_MUTEX(midi_builder); switch(prop_id){ case PROP_FILE: { g_rec_mutex_lock(midi_builder_mutex); g_value_set_pointer(value, midi_builder->file); g_rec_mutex_unlock(midi_builder_mutex); } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_builder_finalize(GObject *gobject) { AgsMidiBuilder *midi_builder; midi_builder = (AgsMidiBuilder *) gobject; /* call parent */ G_OBJECT_CLASS(ags_midi_builder_parent_class)->finalize(gobject); } /** * ags_midi_builder_header_alloc: * * Allocate MIDI builder header. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsMidiBuilderHeader-struct * * Since: 3.0.0 */ AgsMidiBuilderHeader* ags_midi_builder_header_alloc() { AgsMidiBuilderHeader *midi_builder_header; midi_builder_header = (AgsMidiBuilderHeader *) malloc(sizeof(AgsMidiBuilderHeader)); midi_builder_header->offset = 0; midi_builder_header->format = 1; midi_builder_header->count = 0; midi_builder_header->division = 0; midi_builder_header->times = 0; midi_builder_header->beat = 0; midi_builder_header->clicks = 0; midi_builder_header->data = NULL; midi_builder_header->length = 0; return(midi_builder_header); } /** * ags_midi_builder_header_free: * @midi_builder_header: (type gpointer) (transfer none): the #AgsMidiBuilderHeader-struct * * Free MIDI builder header. * * Since: 3.0.0 */ void ags_midi_builder_header_free(AgsMidiBuilderHeader *midi_builder_header) { if(midi_builder_header == NULL){ return; } free(midi_builder_header); } /** * ags_midi_builder_track_alloc: * * Allocate MIDI builder track. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsMidiBuilderTrack-struct * * Since: 3.0.0 */ AgsMidiBuilderTrack* ags_midi_builder_track_alloc() { AgsMidiBuilderTrack *midi_builder_track; midi_builder_track = (AgsMidiBuilderTrack *) malloc(sizeof(AgsMidiBuilderTrack)); midi_builder_track->offset = 0; midi_builder_track->track_name = NULL; midi_builder_track->absolute_time = 0; midi_builder_track->data = NULL; midi_builder_track->length = 0; return(midi_builder_track); } /** * ags_midi_builder_track_free: * @midi_builder_track: (type gpointer) (transfer none): the #AgsMidiBuilderTrack-struct * * Free MIDI builder track. * * Since: 3.0.0 */ void ags_midi_builder_track_free(AgsMidiBuilderTrack *midi_builder_track) { if(midi_builder_track == NULL){ return; } if(midi_builder_track->track_name != NULL){ free(midi_builder_track->track_name); } if(midi_builder_track->data != NULL){ free(midi_builder_track->data); } free(midi_builder_track); } /** * ags_midi_builder_track_find_delta_time_with_track_name: * @midi_builder_track: (element-type gpointer) (transfer none): the #AgsMidiBuilderTrack * @absolute_time: the absolute time * @track_name: the track's string representation * * Finds matching #AgsMidiBuilderTrack-struct within @midi_builder_track #GList-struct. * * Returns: (element-type gpointer) (transfer none): the matching #GList-struct * * Since: 3.0.0 */ GList* ags_midi_builder_track_find_delta_time_with_track_name(GList *midi_builder_track, guint64 absolute_time, gchar *track_name) { while(midi_builder_track != NULL){ if(AGS_MIDI_BUILDER_TRACK(midi_builder_track->data)->absolute_time == absolute_time && !g_ascii_strcasecmp(AGS_MIDI_BUILDER_TRACK(midi_builder_track->data)->track_name, track_name)){ break; } midi_builder_track = midi_builder_track->next; } return(midi_builder_track); } /** * ags_midi_builder_track_insert_midi_message: * @midi_builder_track: the #AgsMidiBuilderTrack-struct * @buffer: the MIDI message * @length: the buffer length * * Insert MIDI message. * * Since: 3.0.0 */ void ags_midi_builder_track_insert_midi_message(AgsMidiBuilderTrack *midi_builder_track, guchar *buffer, guint length) { guchar *current; gint prefix_length, suffix_length; guint64 absolute_time; glong delta_time; if(midi_builder_track == NULL || buffer == NULL || length == 0){ return; } /* read delta-time */ ags_midi_buffer_util_get_varlength(buffer, &delta_time); midi_builder_track->absolute_time += delta_time; /* get offset */ midi_builder_track->data = (guchar *) realloc(midi_builder_track->data, (midi_builder_track->length + length) * sizeof(guchar)); current = midi_builder_track->data + midi_builder_track->length; if(current == NULL){ prefix_length = 0; suffix_length = 0; }else{ /* prefix */ if(current <= midi_builder_track->data + midi_builder_track->length){ prefix_length = current - midi_builder_track->data; }else{ prefix_length = 0; } /* suffix */ if(midi_builder_track->length > prefix_length){ suffix_length = midi_builder_track->length - prefix_length; memmove(midi_builder_track->data + prefix_length + length, midi_builder_track->data + prefix_length, suffix_length); } } memcpy(midi_builder_track->data + prefix_length, buffer, length); /* set data */ midi_builder_track->length += length; ags_midi_buffer_util_put_int32(midi_builder_track->data + 4, midi_builder_track->length); } /** * ags_midi_builder_track_get_delta_time_offset: * @midi_builder_track: the #AgsMidiBuilderTrack-struct * @absolute_time: the absolute time * * Get offset by delta time. * * Returns: the buffer position before @delta_time * * Since: 3.0.0 */ guchar* ags_midi_builder_track_get_delta_time_offset(AgsMidiBuilderTrack *midi_builder_track, guint64 absolute_time) { guchar *prev, *current; guint64 time_counter; glong current_delta_time; if(midi_builder_track == NULL || midi_builder_track->data == NULL){ return(NULL); } current = midi_builder_track->data; prev = NULL; time_counter = 0; while(current != NULL){ current = ags_midi_buffer_util_seek_message(current, 1, ¤t_delta_time); time_counter += current_delta_time; if(time_counter > absolute_time){ break; } if(current >= midi_builder_track->data + midi_builder_track->length){ break; } prev = current; } if(current == NULL){ current = midi_builder_track->data + midi_builder_track->length; } return(current); } void ags_midi_builder_real_midi_putc(AgsMidiBuilder *midi_builder, gint c) { if(midi_builder->file == NULL){ return; } fputc(c, midi_builder->file); } /** * ags_midi_builder_midi_putc: * @midi_builder: the #AgsMidiBuilder * @c: the character to put * * Put char in MIDI file. * * Since: 3.0.0 */ void ags_midi_builder_midi_putc(AgsMidiBuilder *midi_builder, gint c) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[MIDI_PUTC], 0, c); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_on_error(AgsMidiBuilder *midi_builder, GError **error) { if(error != NULL && *error != NULL){ g_warning("%s", (*error)->message); } } /** * ags_midi_builder_on_error: * @midi_builder: the #AgsMidiBuilder * @error: the error * * Triggered as an error occurs. * * Since: 3.0.0 */ void ags_midi_builder_on_error(AgsMidiBuilder *midi_builder, GError **error) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[ON_ERROR], 0, error); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_header(AgsMidiBuilder *midi_builder, guint offset, guint format, guint track_count, guint division, guint times, guint bpm, guint clicks) { AgsMidiBuilderHeader *midi_builder_header; if(midi_builder->midi_header == NULL){ midi_builder_header = midi_builder->midi_header = ags_midi_builder_header_alloc(); }else{ midi_builder_header = midi_builder->midi_header; } if(midi_builder_header->data == NULL){ midi_builder_header->data = (guchar *) malloc(14 * sizeof(guchar)); midi_builder_header->length = 14; } midi_builder_header->offset = offset; midi_builder_header->format = format; midi_builder_header->count = track_count; midi_builder_header->division = division; midi_builder_header->times = times; midi_builder_header->beat = bpm; midi_builder_header->clicks = clicks; ags_midi_buffer_util_put_header(midi_builder_header->data, offset, format, track_count, division); } /** * ags_midi_builder_append_header: * @midi_builder: the #AgsMidiBuilder * @offset: start delta-time * @format: either 0, 1 or 2. * @track_count: the number of tracks * @division: timing division * @times: pulse per quarter note * @bpm: beats per minute * @clicks: timing clicks * * Appends MIDI header to @midi_builder. * * Since: 3.0.0 */ void ags_midi_builder_append_header(AgsMidiBuilder *midi_builder, guint offset, guint format, guint track_count, guint division, guint times, guint bpm, guint clicks) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[APPEND_HEADER], 0, offset, format, track_count, division, times, bpm, clicks); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_track(AgsMidiBuilder *midi_builder, gchar *track_name) { AgsMidiBuilderTrack *midi_builder_track; guint delta_time_size; guint length; /* allocate struct */ midi_builder_track = ags_midi_builder_track_alloc(); midi_builder_track->track_name = g_strdup(track_name); /* fill buffer */ delta_time_size = ags_midi_buffer_util_get_varlength_size(0); if(track_name != NULL){ length = strlen(track_name); }else{ length = 0; } midi_builder_track->data = (guchar *) malloc((8 + delta_time_size + length + 3) * sizeof(guchar)); midi_builder_track->length = (4 + 4) + delta_time_size + length + 3; ags_midi_buffer_util_put_track(midi_builder_track->data, 0); if(track_name != NULL){ ags_midi_buffer_util_put_text_event(midi_builder_track->data + 8, 0, track_name, length); } /* append track */ midi_builder->current_midi_track = midi_builder_track; midi_builder->midi_track = g_list_append(midi_builder->midi_track, midi_builder_track); } /** * ags_midi_builder_append_track: * @midi_builder: the #AgsMidiBuilder * @track_name: the track name * * Append a track called @track_name to @midi_builder. * * Since: 3.0.0 */ void ags_midi_builder_append_track(AgsMidiBuilder *midi_builder, gchar *track_name) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[APPEND_TRACK], 0, track_name); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_key_on(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 3) * sizeof(guchar)); ags_midi_buffer_util_put_key_on(buffer, delta_time, audio_channel, note, velocity); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 3); } /** * ags_midi_builder_append_key_on: * @midi_builder: the #AgsMidiBuilder * @delta_time: delta-time * @audio_channel: the audio channel * @note: the note to play from 0 to 128 * @velocity: key dynamics * * Append key-on for @note to @midi_builder with key dynamics @velocity, at @delta_time. * * Since: 3.0.0 */ void ags_midi_builder_append_key_on(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[KEY_ON], 0, delta_time, audio_channel, note, velocity); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_key_off(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 3) * sizeof(guchar)); ags_midi_buffer_util_put_key_off(buffer, delta_time, audio_channel, note, velocity); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 3); } /** * ags_midi_builder_append_key_off: * @midi_builder: the #AgsMidiBuilder * @delta_time: delta-time * @audio_channel: the audio channel * @note: the note to play from 0 to 128 * @velocity: key dynamics * * Append key-off for @note to @midi_builder with key dynamics @velocity, at @delta_time. * * Since: 3.0.0 */ void ags_midi_builder_append_key_off(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[KEY_OFF], 0, delta_time, audio_channel, note, velocity); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_key_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint pressure) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 3) * sizeof(guchar)); ags_midi_buffer_util_put_key_pressure(buffer, delta_time, audio_channel, note, pressure); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 3); } /** * ags_midi_builder_append_key_pressure: * @midi_builder: the #AgsMidiBuilder * @delta_time: delta-time * @audio_channel: the audio channel * @note: the note to play from 0 to 128 * @pressure: key dynamics * * Append key-pressure for @note to @midi_builder with key dynamics @pressure, at @delta_time. * * Since: 3.0.0 */ void ags_midi_builder_append_key_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint pressure) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[KEY_PRESSURE], 0, delta_time, audio_channel, note, pressure); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_change_parameter(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint control, guint value) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 3) * sizeof(guchar)); ags_midi_buffer_util_put_change_parameter(buffer, delta_time, channel, control, value); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 3); } /** * ags_midi_builder_append_change_parameter: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @channel: the channel * @control: the control * @value: the value * * Appends change parameter. * * Since: 3.0.0 */ void ags_midi_builder_append_change_parameter(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint control, guint value) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[CHANGE_PARAMETER], 0, delta_time, channel, control, value); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_change_pitch_bend(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pitch, guint transmitter) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 3) * sizeof(guchar)); ags_midi_buffer_util_put_pitch_bend(buffer, delta_time, channel, pitch, transmitter); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 3); } /** * ags_midi_builder_append_change_pitch_bend: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @channel: the channel * @pitch: the pitch * @transmitter: the transmitter * * Change pitch bend. * * Since: 3.0.0 */ void ags_midi_builder_append_change_pitch_bend(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pitch, guint transmitter) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[CHANGE_PITCH_BEND], 0, delta_time, channel, pitch, transmitter); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_change_program(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint program) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 2) * sizeof(guchar)); ags_midi_buffer_util_put_change_program(buffer, delta_time, channel, program); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 2); } /** * ags_midi_builder_append_change_program: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @channel: the channel * @program: the program * * Appends change program. * * Since: 3.0.0 */ void ags_midi_builder_append_change_program(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint program) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[CHANGE_PROGRAM], 0, delta_time, channel, program); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_change_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pressure) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 2) * sizeof(guchar)); ags_midi_buffer_util_put_change_pressure(buffer, delta_time, channel, pressure); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 2); } /** * ags_midi_builder_append_change_pressure: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @channel: the channel * @pressure: the pressure * * Appends change pressure. * * Since: 3.0.0 */ void ags_midi_builder_append_change_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pressure) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[CHANGE_PRESSURE], 0, delta_time, channel, pressure); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_sysex(AgsMidiBuilder *midi_builder, guint delta_time, guchar *sysex_data, guint length) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + length) * sizeof(guchar)); ags_midi_buffer_util_put_sysex(buffer, delta_time, sysex_data, length); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + length); } /** * ags_midi_builder_append_sysex: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @sysex_data: the sysex data * @length: length * * Appends sysex data. * * Since: 3.0.0 */ void ags_midi_builder_append_sysex(AgsMidiBuilder *midi_builder, guint delta_time, guchar *sysex_data, guint length) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[SYSEX], 0, delta_time, sysex_data, length); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_quarter_frame(AgsMidiBuilder *midi_builder, guint delta_time, guint message_type, guint values) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 2) * sizeof(guchar)); ags_midi_buffer_util_put_quarter_frame(buffer, delta_time, message_type, values); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 2); } /** * ags_midi_builder_append_quarter_frame: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @message_type: the message type * @values: values * * Appends quarter frame. * * Since: 3.0.0 */ void ags_midi_builder_append_quarter_frame(AgsMidiBuilder *midi_builder, guint delta_time, guint message_type, guint values) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[QUARTER_FRAME], 0, delta_time, message_type, values); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_song_position(AgsMidiBuilder *midi_builder, guint delta_time, guint song_position) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 3) * sizeof(guchar)); ags_midi_buffer_util_put_song_position(buffer, delta_time, song_position); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 3); } /** * ags_midi_builder_append_song_position: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @song_position: the song position * * Appends song position. * * Since: 3.0.0 */ void ags_midi_builder_append_song_position(AgsMidiBuilder *midi_builder, guint delta_time, guint song_position) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[SONG_POSITION], 0, delta_time, song_position); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_song_select(AgsMidiBuilder *midi_builder, guint delta_time, guint song_select) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 2) * sizeof(guchar)); ags_midi_buffer_util_put_song_select(buffer, delta_time, song_select); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 2); } /** * ags_midi_builder_append_song_select: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @song_select: the song select * * Appends song select. * * Since: 3.0.0 */ void ags_midi_builder_append_song_select(AgsMidiBuilder *midi_builder, guint delta_time, guint song_select) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[SONG_SELECT], 0, delta_time, song_select); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_tune_request(AgsMidiBuilder *midi_builder, guint delta_time) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 1) * sizeof(guchar)); ags_midi_buffer_util_put_tune_request(buffer, delta_time); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 1); } /** * ags_midi_builder_append_tune_request: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * * Appends tune request. * * Since: 3.0.0 */ void ags_midi_builder_append_tune_request(AgsMidiBuilder *midi_builder, guint delta_time) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[TUNE_REQUEST], 0, delta_time); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_sequence_number(AgsMidiBuilder *midi_builder, guint delta_time, guint sequence) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 5) * sizeof(guchar)); ags_midi_buffer_util_put_sequence_number(buffer, delta_time, sequence); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 5); } /** * ags_midi_builder_append_sequence_number: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @sequence: the sequence number * * Appends sequence number. * * Since: 3.0.0 */ void ags_midi_builder_append_sequence_number(AgsMidiBuilder *midi_builder, guint delta_time, guint sequence) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[SEQUENCE_NUMBER], 0, delta_time, sequence); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_smtpe(AgsMidiBuilder *midi_builder, guint delta_time, guint rr, guint hr, guint mn, guint se, guint fr) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 8) * sizeof(guchar)); ags_midi_buffer_util_put_smtpe(buffer, delta_time, rr, hr, mn, se, fr); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 8); } /** * ags_midi_builder_append_smtpe: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @rr: rate * @hr: hours * @mn: minutes * @se: seconds * @fr: fraction * * Appends smtpe. * * Since: 3.0.0 */ void ags_midi_builder_append_smtpe(AgsMidiBuilder *midi_builder, guint delta_time, guint rr, guint hr, guint mn, guint se, guint fr) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[SMTPE], 0, delta_time, rr, hr, mn, se, fr); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_tempo(AgsMidiBuilder *midi_builder, guint delta_time, guint tempo) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 6) * sizeof(guchar)); ags_midi_buffer_util_put_tempo(buffer, delta_time, tempo); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 6); } /** * ags_midi_builder_append_tempo: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @tempo: the tempo * * Appends tempo. * * Since: 3.0.0 */ void ags_midi_builder_append_tempo(AgsMidiBuilder *midi_builder, guint delta_time, guint tempo) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[TEMPO], 0, delta_time, tempo); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_time_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint nn, guint dd, guint cc, guint bb) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 7) * sizeof(guchar)); ags_midi_buffer_util_put_time_signature(buffer, (glong) delta_time, (glong) nn, (glong) dd, (glong) cc, (glong) bb); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 7); } /** * ags_midi_builder_append_time_signature: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @nn: numerator * @dd: denominator * @cc: ticks per metronome click * @bb: 32nd per quarter note * * Appends time signature. * * Since: 3.0.0 */ void ags_midi_builder_append_time_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint nn, guint dd, guint cc, guint bb) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[TIME_SIGNATURE], 0, delta_time, nn, dd, cc, bb); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_key_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint sf, guint mi) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + 5) * sizeof(guchar)); ags_midi_buffer_util_put_key_signature(buffer, delta_time, sf, mi); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + 5); } /** * ags_midi_builder_append_key_signature: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @sf: key * @mi: mode * * Appends key signature. * * Since: 3.0.0 */ void ags_midi_builder_append_key_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint sf, guint mi) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[KEY_SIGNATURE], 0, delta_time, sf, mi); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_sequencer_meta_event(AgsMidiBuilder *midi_builder, guint delta_time, guint len, guint id, guint data) { guchar *buffer; guint delta_time_size; delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + len + 3) * sizeof(guchar)); ags_midi_buffer_util_put_sequencer_meta_event(buffer, delta_time, len, id, data); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + len + 3); } /** * ags_midi_builder_append_sequencer_meta_event: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @len: the length * @id: the id * @data: the data * * Appends sequencer meta event. * * Since: 3.0.0 */ void ags_midi_builder_append_sequencer_meta_event(AgsMidiBuilder *midi_builder, guint delta_time, guint len, guint id, guint data) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[SEQUENCER_META_EVENT], 0, delta_time, len, id, data); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_real_append_text_event(AgsMidiBuilder *midi_builder, guint delta_time, gchar *text, guint length) { guchar *buffer; guint delta_time_size; if(length > 0){ if(text[length - 1] == '\0'){ length--; } } delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); buffer = (guchar *) malloc((delta_time_size + length + 3) * sizeof(guchar)); ags_midi_buffer_util_put_text_event(buffer, delta_time, text, length); ags_midi_builder_track_insert_midi_message(midi_builder->current_midi_track, buffer, delta_time_size + length + 3); } /** * ags_midi_builder_append_text_event: * @midi_builder: the #AgsMidiBuilder * @delta_time: the delta time * @text: the string * @length: the string length * * Appends text event. * * Since: 3.0.0 */ void ags_midi_builder_append_text_event(AgsMidiBuilder *midi_builder, guint delta_time, gchar *text, guint length) { g_return_if_fail(AGS_IS_MIDI_BUILDER(midi_builder)); g_object_ref((GObject *) midi_builder); g_signal_emit(G_OBJECT(midi_builder), midi_builder_signals[TEXT_EVENT], 0, delta_time, text, length); g_object_unref((GObject *) midi_builder); } void ags_midi_builder_append_xml_node_header(AgsMidiBuilder *midi_builder, xmlNode *node) { xmlChar *str; guint offset; guint format; guint track_count; guint division; /* offset */ str = xmlGetProp(node, "offset"); offset = 0; if(str != NULL){ offset = g_ascii_strtoull(str, NULL, 10); } /* format */ str = xmlGetProp(node, "format"); format = 0; if(str != NULL){ format = g_ascii_strtoull(str, NULL, 10); } /* track-count */ str = xmlGetProp(node, "track-count"); track_count = 0; if(str != NULL){ track_count = g_ascii_strtoull(str, NULL, 10); } /* division */ str = xmlGetProp(node, "division"); division = 0; if(str != NULL){ division = g_ascii_strtoull(str, NULL, 10); } /* append header */ ags_midi_builder_append_header(midi_builder, offset, format, track_count, division, 0, 0, 0); } void ags_midi_builder_append_xml_node_tracks(AgsMidiBuilder *midi_builder, xmlNode *node) { xmlNode *child; child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "midi-track", 11)){ ags_midi_builder_append_xml_node_track(midi_builder, child); } } child = child->next; } } void ags_midi_builder_append_xml_node_track(AgsMidiBuilder *midi_builder, xmlNode *node) { xmlNode *child; xmlChar *str; guint offset; /* offset */ str = xmlGetProp(node, "offset"); offset = 0; if(str != NULL){ offset = g_ascii_strtoull(str, NULL, 10); } ags_midi_builder_append_track(midi_builder, NULL); midi_builder->current_midi_track->offset = offset; ags_midi_buffer_util_put_track(midi_builder->current_midi_track->data, 0); /* child nodes */ child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "midi-message", 13)){ ags_midi_builder_append_xml_node_message(midi_builder, child); }else if(!xmlStrncmp(child->name, (xmlChar *) "midi-system-common", 19)){ ags_midi_builder_append_xml_node_system_common(midi_builder, child); }else if(!xmlStrncmp(child->name, (xmlChar *) "meta-event", 11)){ ags_midi_builder_append_xml_node_meta_event(midi_builder, child); } } child = child->next; } } void ags_midi_builder_append_xml_node_message(AgsMidiBuilder *midi_builder, xmlNode *node) { xmlChar *event; xmlChar *str; guint delta_time; /* get event */ event = xmlGetProp(node, "event"); if(event == NULL){ return; } /* get event */ delta_time = 0; str = xmlGetProp(node, "delta-time"); if(str != NULL){ delta_time = g_ascii_strtoull(str, NULL, 10); } /* compute event */ if(!xmlStrncmp(event, "note-on", 8)){ guint key, note, velocity; /* key */ key = 0; str = xmlGetProp(node, "key"); if(str != NULL){ key = g_ascii_strtoull(str, NULL, 10); } /* note */ note = 0; str = xmlGetProp(node, "note"); if(str != NULL){ note = g_ascii_strtoull(str, NULL, 10); } /* velocity */ velocity = 0; str = xmlGetProp(node, "velocity"); if(str != NULL){ velocity = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_key_on(midi_builder, delta_time, key, note, velocity); }else if(!xmlStrncmp(event, "note-off", 9)){ guint key, note, velocity; /* key */ key = 0; str = xmlGetProp(node, "key"); if(str != NULL){ key = g_ascii_strtoull(str, NULL, 10); } /* note */ note = 0; str = xmlGetProp(node, "note"); if(str != NULL){ note = g_ascii_strtoull(str, NULL, 10); } /* velocity */ velocity = 0; str = xmlGetProp(node, "velocity"); if(str != NULL){ velocity = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_key_off(midi_builder, delta_time, key, note, velocity); }else if(!xmlStrncmp(event, "polyphonic", 11)){ guint key, note, pressure; /* key */ key = 0; str = xmlGetProp(node, "key"); if(str != NULL){ key = g_ascii_strtoull(str, NULL, 10); } /* note */ note = 0; str = xmlGetProp(node, "note"); if(str != NULL){ note = g_ascii_strtoull(str, NULL, 10); } /* pressure */ pressure = 0; str = xmlGetProp(node, "pressure"); if(str != NULL){ pressure = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_key_pressure(midi_builder, delta_time, key, note, pressure); }else if(!xmlStrncmp(event, "change-parameter", 11)){ guint channel, control, value; /* channel */ channel = 0; str = xmlGetProp(node, "channel"); if(str != NULL){ channel = g_ascii_strtoull(str, NULL, 10); } /* control */ control = 0; str = xmlGetProp(node, "control"); if(str != NULL){ control = g_ascii_strtoull(str, NULL, 10); } /* value */ value = 0; str = xmlGetProp(node, "value"); if(str != NULL){ value = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_change_parameter(midi_builder, delta_time, channel, control, value); }else if(!xmlStrncmp(event, "pitch-bend", 11)){ guint channel, pitch, transmitter; /* channel */ channel = 0; str = xmlGetProp(node, "channel"); if(str != NULL){ channel = g_ascii_strtoull(str, NULL, 10); } /* pitch */ pitch = 0; str = xmlGetProp(node, "pitch-bend"); if(str != NULL){ pitch = g_ascii_strtoull(str, NULL, 10); } /* transmitter */ transmitter = 0; str = xmlGetProp(node, "transmitter"); if(str != NULL){ transmitter = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_change_pitch_bend(midi_builder, delta_time, channel, pitch, transmitter); }else if(!xmlStrncmp(event, "program-change", 15)){ guint channel, program; /* channel */ channel = 0; str = xmlGetProp(node, "channel"); if(str != NULL){ channel = g_ascii_strtoull(str, NULL, 10); } /* program */ program = 0; str = xmlGetProp(node, "program"); if(str != NULL){ program = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_change_program(midi_builder, delta_time, channel, program); }else if(!xmlStrncmp(event, "channel-pressure", 17)){ guint channel, pressure; /* channel */ channel = 0; str = xmlGetProp(node, "channel"); if(str != NULL){ channel = g_ascii_strtoull(str, NULL, 10); } /* pressure */ pressure = 0; str = xmlGetProp(node, "pressure"); if(str != NULL){ pressure = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_change_pressure(midi_builder, delta_time, channel, pressure); }else if(!xmlStrncmp(event, "misc", 5)){ g_warning("not supported MIDI message misc"); }else if(!xmlStrncmp(event, "sequence-number", 16)){ guint sequence; /* sequence */ sequence = 0; str = xmlGetProp(node, "sequence"); if(str != NULL){ sequence = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_sequence_number(midi_builder, delta_time, sequence); }else if(!xmlStrncmp(event, "end-of-track", 13)){ g_warning("not supported MIDI message end-of-track"); }else if(!xmlStrncmp(event, "smtpe", 6)){ guint rr, hr, mn, se, fr; /* timestamp */ rr = 0; hr = 0; mn = 0; se = 0; fr = 0; str = xmlGetProp(node, "rate"); if(str != NULL){ sscanf(str, "%d", &rr); } str = xmlGetProp(node, "timestamp"); if(str != NULL){ sscanf(str, "%d %d %d %d", &hr, &mn, &se, &fr); } /* append */ ags_midi_builder_append_smtpe(midi_builder, delta_time, rr, hr, mn, se, fr); }else if(!xmlStrncmp(event, "tempo-number", 13)){ gint tempo; /* tempo */ tempo = 0; str = xmlGetProp(node, "tempo"); if(str != NULL){ tempo = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_tempo(midi_builder, delta_time, tempo); }else if(!xmlStrncmp(event, "time-signature", 16)){ guint nn, dd, cc, bb; guint denom = 1; /* timesig */ nn = 0; dd = 0; cc = 0; bb = 0; str = xmlGetProp(node, "timesign"); if(str != NULL){ sscanf(str, "%d/%d %d %d", &nn, &denom, &cc, &bb); } while(denom != 1){ dd++; denom /= 2; } /* append */ ags_midi_builder_append_time_signature(midi_builder, delta_time, nn, dd, cc, bb); }else if(!xmlStrncmp(event, "key-signature", 14)){ xmlChar *minor; gint sf; guint mi; /* keysig */ minor = NULL; sf = 0; mi = 1; str = xmlGetProp(node, "timesign"); if(str != NULL){ sscanf(str, "%d %ms", &sf, &minor); } /* sharp flats */ if(sf < 0){ sf += 256; } /* minor */ if(!g_ascii_strncasecmp(minor, "minor", 6)){ mi = 1; }else{ mi = 0; } /* append */ ags_midi_builder_append_key_signature(midi_builder, delta_time, sf, mi); } } void ags_midi_builder_append_xml_node_system_common(AgsMidiBuilder *midi_builder, xmlNode *node) { xmlChar *str; guint delta_time; /* get delta-time */ delta_time = 0; str = xmlGetProp(node, "delta-time"); if(str != NULL){ delta_time = g_ascii_strtoull(str, NULL, 10); } /* parse node */ if((str = xmlGetProp(node, "quarter-frame")) != NULL){ guint quarter_frame; guint message_type, values; /* get quarter frame */ quarter_frame = 0; str = xmlGetProp(node, "quarter-frame"); if(str != NULL){ quarter_frame = g_ascii_strtoull(str, NULL, 10); } message_type = 0x70 & quarter_frame; values = 0x0f & quarter_frame; /* append */ ags_midi_builder_append_quarter_frame(midi_builder, delta_time, message_type, values); }else if((str = xmlGetProp(node, "song-position")) != NULL){ guint song_position; /* get song position */ song_position = 0; str = xmlGetProp(node, "song-position"); if(str != NULL){ song_position = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_song_position(midi_builder, delta_time, song_position); }else if((str = xmlGetProp(node, "song-select")) != NULL){ guint song_select; /* get song select */ song_select = 0; str = xmlGetProp(node, "song-select"); if(str != NULL){ song_select = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_song_select(midi_builder, delta_time, song_select); } } void ags_midi_builder_append_xml_node_meta_event(AgsMidiBuilder *midi_builder, xmlNode *node) { xmlChar *str; guint delta_time; guint len, id, data; /* get delta-time */ delta_time = 0; str = xmlGetProp(node, "delta-time"); if(str != NULL){ delta_time = g_ascii_strtoull(str, NULL, 10); } /* length */ len = 0; str = xmlGetProp(node, "length"); if(str != NULL){ len = g_ascii_strtoull(str, NULL, 10); } /* id */ id = 0; str = xmlGetProp(node, "id"); if(str != NULL){ id = g_ascii_strtoull(str, NULL, 10); } /* data */ data = 0; str = xmlGetProp(node, "data"); if(str != NULL){ data = g_ascii_strtoull(str, NULL, 10); } /* append */ ags_midi_builder_append_sequencer_meta_event(midi_builder, delta_time, len, id, data); } /** * ags_midi_builder_append_xml_node: * @midi_builder: the #AgsMidiBuilder * @node: the xmlNode * * Append from XML node @node. * * Since: 3.0.0 */ void ags_midi_builder_append_xml_node(AgsMidiBuilder *midi_builder, xmlNode *node) { if(!xmlStrncmp(node->name, "midi-header", 12)){ ags_midi_builder_append_xml_node_header(midi_builder, node); }else if(!xmlStrncmp(node->name, "midi-tracks", 12)){ ags_midi_builder_append_xml_node_tracks(midi_builder, node); }else if(!xmlStrncmp(node->name, "midi-track", 12)){ ags_midi_builder_append_xml_node_track(midi_builder, node); }else if(!xmlStrncmp(node->name, "midi-message", 12)){ ags_midi_builder_append_xml_node_message(midi_builder, node); }else if(!xmlStrncmp(node->name, "midi-system-common", 12)){ ags_midi_builder_append_xml_node_system_common(midi_builder, node); }else if(!xmlStrncmp(node->name, "meta-event", 12)){ ags_midi_builder_append_xml_node_meta_event(midi_builder, node); } } /** * ags_midi_builder_from_xml_doc: * @midi_builder: the #AgsMidiBuilder * @doc: the xmlDocument * * Builds from XML document @doc. * * Since: 3.0.0 */ void ags_midi_builder_from_xml_doc(AgsMidiBuilder *midi_builder, xmlDoc *doc) { xmlNode *root_node; xmlNode *child; if(midi_builder == NULL || doc == NULL){ return; } root_node = xmlDocGetRootElement(doc); child = root_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(child->name, (xmlChar *) "midi-header", 13)){ ags_midi_builder_append_xml_node(midi_builder, child); }else if(!xmlStrncmp(child->name, (xmlChar *) "midi-tracks", 13)){ ags_midi_builder_append_xml_node(midi_builder, child); } } child = child->next; } } /** * ags_midi_builder_build: * @midi_builder: the #AgsMidiBuilder * * Build the MIDI data. * * Since: 3.0.0 */ void ags_midi_builder_build(AgsMidiBuilder *midi_builder) { GList *midi_track; guchar *offset; guint length; if(midi_builder == NULL){ return; } /* compute length */ length = 0; if(midi_builder->midi_header != NULL){ length += midi_builder->midi_header->length; } midi_track = midi_builder->midi_track; while(midi_track != NULL){ length += AGS_MIDI_BUILDER_TRACK(midi_track->data)->length; length += 4; //NOTE:JK: EOT midi_track = midi_track->next; } /* allocate buffer */ if(midi_builder->data != NULL){ free(midi_builder->data); } if(length > 0){ midi_builder->data = (guchar *) malloc(length * sizeof(guchar)); midi_builder->length = length; }else{ midi_builder->data = NULL; midi_builder->length = 0; return; } /* fill */ offset = midi_builder->data; if(offset != NULL && midi_builder->midi_header != NULL & midi_builder->midi_header->data != NULL){ memcpy(offset, midi_builder->midi_header->data, midi_builder->midi_header->length * sizeof(guchar)); offset += midi_builder->midi_header->length; } midi_track = midi_builder->midi_track; while(midi_track != NULL){ if(AGS_MIDI_BUILDER_TRACK(midi_track->data)->data != NULL){ memcpy(offset, AGS_MIDI_BUILDER_TRACK(midi_track->data)->data, AGS_MIDI_BUILDER_TRACK(midi_track->data)->length * sizeof(guchar)); offset += AGS_MIDI_BUILDER_TRACK(midi_track->data)->length; ags_midi_buffer_util_put_end_of_track(offset, 0); offset += 4; } midi_track = midi_track->next; } } /** * ags_midi_builder_new: * @file: the FILE handle * * Creates a new instance of #AgsMidiBuilder * * Returns: the new #AgsMidiBuilder * * Since: 3.0.0 */ AgsMidiBuilder* ags_midi_builder_new(FILE *file) { AgsMidiBuilder *midi_builder; midi_builder = (AgsMidiBuilder *) g_object_new(AGS_TYPE_MIDI_BUILDER, "file", file, NULL); return(midi_builder); } gsequencer-3.1.3/ags/audio/midi/ags_midi_file.c0000644000175000017500000007301313607210263016320 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_midi_file_class_init(AgsMidiFileClass *midi_file); void ags_midi_file_init(AgsMidiFile *midi_file); void ags_midi_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_file_finalize(GObject *gobject); /** * SECTION:ags_midi_file * @short_description: the MIDI file * @title: AgsMidiFile * @section_id: * @include: ags/audio/midi/ags_midi_file.h * * #AgsMidiFile reads or writes your midi files. */ enum{ PROP_0, PROP_FILENAME, }; static gpointer ags_midi_file_parent_class = NULL; GType ags_midi_file_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_file = 0; static const GTypeInfo ags_midi_file_info = { sizeof (AgsMidiFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_file_init, }; ags_type_midi_file = g_type_register_static(G_TYPE_OBJECT, "AgsMidiFile", &ags_midi_file_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_file); } return g_define_type_id__volatile; } void ags_midi_file_class_init(AgsMidiFileClass *midi_file) { GObjectClass *gobject; GParamSpec *param_spec; ags_midi_file_parent_class = g_type_class_peek_parent(midi_file); /* GObjectClass */ gobject = (GObjectClass *) midi_file; gobject->set_property = ags_midi_file_set_property; gobject->get_property = ags_midi_file_get_property; gobject->finalize = ags_midi_file_finalize; /* properties */ /** * AgsMidiFile:filename: * * The assigned filename to perform input/output on. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("assigned filename"), i18n_pspec("The filename to read or write"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); } GQuark ags_midi_file_error_quark() { return(g_quark_from_static_string("ags-midi-file-error-quark")); } void ags_midi_file_init(AgsMidiFile *midi_file) { midi_file->flags = 0; /* midi file mutex */ g_mutex_init(&(midi_file->obj_mutex)); midi_file->file = NULL; midi_file->filename = NULL; midi_file->buffer = NULL; midi_file->buffer_length = 0; midi_file->offset = AGS_MIDI_FILE_DEFAULT_OFFSET; midi_file->format = AGS_MIDI_FILE_DEFAULT_FORMAT; midi_file->count = 0; midi_file->division = (60 * AGS_USEC_PER_SEC) / AGS_MIDI_FILE_DEFAULT_BEATS; midi_file->times = 0; midi_file->beat = AGS_MIDI_FILE_DEFAULT_BEATS; midi_file->clicks = AGS_MIDI_FILE_DEFAULT_TICKS; midi_file->track = NULL; midi_file->current_track = NULL; midi_file->notation = NULL; midi_file->midi = NULL; } void ags_midi_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiFile *midi_file; GRecMutex *midi_file_mutex; midi_file = AGS_MIDI_FILE(gobject); /* get midi file mutex */ midi_file_mutex = AGS_MIDI_FILE_GET_OBJ_MUTEX(midi_file); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(midi_file_mutex); if(filename == midi_file->filename){ g_rec_mutex_unlock(midi_file_mutex); return; } if(midi_file->filename != NULL){ g_free(midi_file->filename); } midi_file->filename = g_strdup(filename); g_rec_mutex_unlock(midi_file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiFile *midi_file; GRecMutex *midi_file_mutex; midi_file = AGS_MIDI_FILE(gobject); /* get midi file mutex */ midi_file_mutex = AGS_MIDI_FILE_GET_OBJ_MUTEX(midi_file); switch(prop_id){ case PROP_FILENAME: { g_rec_mutex_lock(midi_file_mutex); g_value_set_string(value, midi_file->filename); g_rec_mutex_unlock(midi_file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_file_finalize(GObject *gobject) { AgsMidiFile *midi_file; midi_file = (AgsMidiFile *) gobject; g_free(midi_file->filename); /* call parent */ G_OBJECT_CLASS(ags_midi_file_parent_class)->finalize(gobject); } /** * ags_midi_file_open: * @midi_file: the #AgsMidiFile * @filename: the filename * * Opens a MIDI file read-only. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_file_open(AgsMidiFile *midi_file, gchar *filename) { if(!AGS_IS_MIDI_FILE(midi_file) || midi_file->filename == NULL){ return(FALSE); } g_object_set(midi_file, "filename", filename, NULL); if(!g_file_test(filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ return(FALSE); } midi_file->file = fopen(midi_file->filename, "r"); return(TRUE); } /** * ags_midi_file_open_from_data: * @midi_file: the #AgsMidiFile * @data: the buffer to set * @buffer_length: the length of the buffer * * Opens a virtual MIDI file residing in @data's array. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_file_open_from_data(AgsMidiFile *midi_file, unsigned char *data, guint buffer_length) { if(!AGS_IS_MIDI_FILE(midi_file)){ return(FALSE); } midi_file->buffer = data; midi_file->buffer_length = buffer_length; return(TRUE); } /** * ags_midi_file_rw_open: * @midi_file: the #AgsMidiFile * @filename: the filename * @create: %TRUE create file if not exists, else if %FALSE return * * Opens a MIDI file with read-write permission. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_file_rw_open(AgsMidiFile *midi_file, gchar *filename, gboolean create) { if(!AGS_IS_MIDI_FILE(midi_file) || filename == NULL){ return(FALSE); } g_object_set(midi_file, "filename", filename, NULL); if(!create && !g_file_test(filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ return(FALSE); } midi_file->file = fopen(midi_file->filename, "r+"); return(TRUE); } /** * ags_midi_file_close: * @midi_file: the #AgsMidiFile * * Closes the file stream. * * Since: 3.0.0 */ void ags_midi_file_close(AgsMidiFile *midi_file) { if(!AGS_IS_MIDI_FILE(midi_file) || midi_file->file == NULL){ return; } fclose(midi_file->file); midi_file->file = NULL; } /** * ags_midi_file_read: * @midi_file: the #AgsMidiFile * * Reads all bytes of the file's stream and stores them in the internal buffer. * * Returns: the data array just read * * Since: 3.0.0 */ unsigned char* ags_midi_file_read(AgsMidiFile *midi_file) { struct stat sb; size_t n_read; if(!AGS_IS_MIDI_FILE(midi_file) || midi_file->filename == NULL || midi_file->file == NULL){ return(NULL); } stat(midi_file->filename, &sb); if(sb.st_size == 0){ return(NULL); } midi_file->buffer_length = sb.st_size + 1; midi_file->buffer = (unsigned char *) malloc(midi_file->buffer_length * sizeof(unsigned char)); midi_file->buffer[sb.st_size] = EOF; n_read = fread(midi_file->buffer, sizeof(unsigned char), sb.st_size, midi_file->file); if(n_read != sb.st_size){ g_critical("fread() number of bytes read doesn't match buffer size"); } midi_file->iter = midi_file->buffer; return(midi_file->buffer); } /** * ags_midi_file_write: * @midi_file: the #AgsMidiFile * @data: the data array to write * @buffer_length: n-bytes to write * * Writes @data to the file stream and to internal buffer, reallocates it if necessary. * * Since: 3.0.0 */ void ags_midi_file_write(AgsMidiFile *midi_file, unsigned char *data, guint buffer_length) { unsigned char *start; if(!AGS_IS_MIDI_FILE(midi_file) || midi_file->file == NULL){ return; } if(midi_file->buffer == NULL){ start = midi_file->buffer = (unsigned char *) malloc((buffer_length + 1) * sizeof(unsigned char)); midi_file->buffer_length = buffer_length + 1; }else{ guint old_buffer_length; old_buffer_length = midi_file->buffer_length; midi_file->buffer = realloc(midi_file->buffer, (old_buffer_length + buffer_length) * sizeof(unsigned char)); start = &(midi_file->buffer[old_buffer_length - 1]); } memcpy(start, data, buffer_length * sizeof(unsigned char)); start[buffer_length] = EOF; fwrite(data, sizeof(unsigned char), buffer_length, midi_file->file); } /** * ags_midi_file_seek: * @midi_file: the #AgsMidiFile * @position: the offset * @whence: SEEK_SET, SEEK_END, or SEEK_CUR * * Seeks the file stream's offset. * * Since: 3.0.0 */ void ags_midi_file_seek(AgsMidiFile *midi_file, guint position, gint whence) { if(!AGS_IS_MIDI_FILE(midi_file) || midi_file->file == NULL){ return; } fseek(midi_file->file, position, whence); } /** * ags_midi_file_flush: * @midi_file: the #AgsMidiFile * * Flushes file stream's data buffer to disc. * * Since: 3.0.0 */ void ags_midi_file_flush(AgsMidiFile *midi_file) { if(!AGS_IS_MIDI_FILE(midi_file) || midi_file->file == NULL){ return; } fflush(midi_file->file); } /** * ags_midi_file_read_byte: * @midi_file: the #AgsMidiFile * @error: the #GError pointer return location * * Reads a unsigned char quantity. * * Returns: the current value at file's iteration pointer * * Since: 3.0.0 */ unsigned char ags_midi_file_read_byte(AgsMidiFile *midi_file, GError **error) { unsigned char value; if(!AGS_IS_MIDI_FILE(midi_file)){ return(0x0); } if(midi_file->iter + 1 < midi_file->buffer + midi_file->buffer_length){ value = (midi_file->iter[0]); midi_file->iter += 1; }else{ if(error != NULL){ g_set_error(error, AGS_MIDI_FILE_ERROR, AGS_MIDI_FILE_ERROR_PREMATURE_EOF, "no more data available in file buffer"); } return(0x0); } return(value); } /** * ags_midi_file_read_gint16: * @midi_file: the #AgsMidiFile * @error: the #GError pointer return location * * Reads a gint16 quantity. * * Returns: the current value at file's iteration pointer * * Since: 3.0.0 */ gint16 ags_midi_file_read_gint16(AgsMidiFile *midi_file, GError **error) { unsigned char str[2]; gint16 value = 0; if(!AGS_IS_MIDI_FILE(midi_file)){ return(0x0); } if(midi_file->iter + 2 < midi_file->buffer + midi_file->buffer_length){ str[0] = (midi_file->iter[0]); str[1] = (midi_file->iter[1]); midi_file->iter += 2; value = (str[0] & 0xff); value = (value<<8) + (str[1] & 0xff); }else{ if(error != NULL){ g_set_error(error, AGS_MIDI_FILE_ERROR, AGS_MIDI_FILE_ERROR_PREMATURE_EOF, "no more data available in file buffer"); } return(0x0); } return(value); } /** * ags_midi_file_read_gint24: * @midi_file: the #AgsMidiFile * @error: the #GError pointer return location * * Reads a 24-bit quantity. * * Returns: the current value at file's iteration pointer * * Since: 3.0.0 */ gint32 ags_midi_file_read_gint24(AgsMidiFile *midi_file, GError **error) { unsigned char str[4]; gint32 value = 0; if(!AGS_IS_MIDI_FILE(midi_file)){ return(0x0); } if(midi_file->iter + 3 < midi_file->buffer + midi_file->buffer_length){ str[0] = (unsigned char) 0x00; str[1] = (midi_file->iter[0]); str[2] = (midi_file->iter[1]); str[3] = (midi_file->iter[2]); midi_file->iter += 3; value = (value<<8) + (str[1] & 0xff); value = (value<<8) + (str[2] & 0xff); value = (value<<8) + (str[3] & 0xff); }else{ if(error != NULL){ g_set_error(error, AGS_MIDI_FILE_ERROR, AGS_MIDI_FILE_ERROR_PREMATURE_EOF, "no more data available in file buffer"); } return(0x0); } return(value); } /** * ags_midi_file_read_gint32: * @midi_file: the #AgsMidiFile * @error: the #GError pointer return location * * Reads a gint32 quantity. * * Returns: the current value at file's iteration pointer * * Since: 3.0.0 */ gint32 ags_midi_file_read_gint32(AgsMidiFile *midi_file, GError **error) { unsigned char str[4]; gint32 value; if(!AGS_IS_MIDI_FILE(midi_file)){ return(0x0); } if(midi_file->iter + 4 < midi_file->buffer + midi_file->buffer_length){ str[0] = (midi_file->iter[0]); str[1] = (midi_file->iter[1]); str[2] = (midi_file->iter[2]); str[3] = (midi_file->iter[3]); midi_file->iter += 4; value = (str[0] & 0xff); value = (value<<8) + (str[1] & 0xff); value = (value<<8) + (str[2] & 0xff); value = (value<<8) + (str[3] & 0xff); }else{ if(error != NULL){ g_set_error(error, AGS_MIDI_FILE_ERROR, AGS_MIDI_FILE_ERROR_PREMATURE_EOF, "no more data available in file buffer"); } return(0x0); } return(value); } /** * ags_midi_file_read_varlength: * @midi_file: the #AgsMidiFile * @error: the #GError pointer return location * * Reads a variable length quantity. * * Returns: the current value at file's iteration pointer * * Since: 3.0.0 */ long ags_midi_file_read_varlength(AgsMidiFile *midi_file, GError **error) { long value; guint i; unsigned char c; gboolean success; if(!AGS_IS_MIDI_FILE(midi_file)){ return(0x0); } c = 0x0; success = TRUE; if(midi_file->iter + 1 < midi_file->buffer + midi_file->buffer_length){ c = midi_file->iter[0]; value = c; i = 1; midi_file->iter += 1; }else{ success = FALSE; } if((c & 0x80) && success){ value &= 0x7F; do{ if(midi_file->iter + 1 < midi_file->buffer + midi_file->buffer_length){ //TODO:JK: unsafe value = (value << 7) + ((c = (midi_file->iter[0])) & 0x7F); i++; midi_file->iter += 1; }else{ success = FALSE; } }while((c & 0x80) && success); } if(!success){ if(error != NULL){ g_set_error(error, AGS_MIDI_FILE_ERROR, AGS_MIDI_FILE_ERROR_PREMATURE_EOF, "no more data available in file buffer"); } return(0x0); } return(value); } /** * ags_midi_file_read_text: * @midi_file: the #AgsMidiFile * @length: the number of bytes to be read, or as long valid string for -1 * @error: the #GError pointer return location * * Reads a string. * * Returns: the string at file's iteration pointer * * Since: 3.0.0 */ unsigned char* ags_midi_file_read_text(AgsMidiFile *midi_file, gint length, GError **error) { unsigned char *text; gchar c; guint i; if(!AGS_IS_MIDI_FILE(midi_file)){ return(NULL); } if(midi_file->iter + length >= midi_file->buffer + midi_file->buffer_length){ if(error != NULL){ g_set_error(error, AGS_MIDI_FILE_ERROR, AGS_MIDI_FILE_ERROR_PREMATURE_EOF, "no more data available in file buffer"); } return(NULL); } text = (unsigned char *) malloc((AGS_MIDI_FILE_MAX_TEXT_LENGTH + 1) * sizeof(unsigned char)); memset(text, 0, AGS_MIDI_FILE_MAX_TEXT_LENGTH * sizeof(unsigned char)); i = 0; while((length <= 0 || i < length) && (c = (midi_file->iter[0])) != EOF){ midi_file->iter += 1; //TODO:JK: unsafe if(c == '\0' || !(g_ascii_isalnum(c) || g_ascii_ispunct(c) || c == ' ')){ break; } text[i] = c; i++; } text[i] = '\0'; return(text); } /** * ags_midi_file_write_byte: * @midi_file: the #AgsMidiFile * @val: the value to write * * Writes a unsigned char quantity to internal buffer. * * Since: 3.0.0 */ void ags_midi_file_write_byte(AgsMidiFile *midi_file, unsigned char val) { if(midi_file->iter + 1 >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + 1) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } midi_file->iter[0] = val; midi_file->iter += 1; } /** * ags_midi_file_write_gint16: * @midi_file: the #AgsMidiFile * @val: the value to write * * Writes a gint16 quantity to internal buffer. * * Since: 3.0.0 */ void ags_midi_file_write_gint16(AgsMidiFile *midi_file, gint16 val) { if((midi_file->iter + 2) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + 2) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } midi_file->iter[0] = 0xff & val; midi_file->iter[1] = (0xff00 & val) >> 8; midi_file->iter += 2; } /** * ags_midi_file_write_gint24: * @midi_file: the #AgsMidiFile * @val: the value to write * * Writes a 24-bit quantity to internal buffer. * * Since: 3.0.0 */ void ags_midi_file_write_gint24(AgsMidiFile *midi_file, gint32 val) { if((midi_file->iter + 3) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + 3) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } midi_file->iter[0] = 0xff & val; midi_file->iter[1] = (0xff00 & val) >> 8; midi_file->iter[2] = (0xff0000 & val) >> 16; midi_file->iter += 3; } /** * ags_midi_file_write_gint32: * @midi_file: the #AgsMidiFile * @val: the value to write * * Writes a gint32 quantity to internal buffer. * * Since: 3.0.0 */ void ags_midi_file_write_gint32(AgsMidiFile *midi_file, gint32 val) { if((midi_file->iter + 4) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + 4) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } midi_file->iter[0] = 0xff & val; midi_file->iter[1] = (0xff00 & val) >> 8; midi_file->iter[2] = (0xff0000 & val) >> 16; midi_file->iter[3] = (0xff000000 & val) >> 24; midi_file->iter += 4; } /** * ags_midi_file_write_varlenght: * @midi_file: the #AgsMidiFile * @val: the value to write * * Writes a variable length quantity to internal buffer. * * Since: 3.0.0 */ void ags_midi_file_write_varlength(AgsMidiFile *midi_file, long val) { gchar c; long mask; guint i, j; mask = 0xff; /* retrieve new size */ i = 0; do{ c = ((mask << (i * 8)) & val) >> (i * 8); i++; }while(0x80 & c); /* realloc buffer if needed */ if((midi_file->iter + i) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + i) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } /* write to internal buffer */ for(j = 0; j < i; i++){ midi_file->iter[j] = ((mask << (j * 8)) & val) >> (j * 8); } midi_file->iter += i; } /** * ags_midi_file_write_text: * @midi_file: the #AgsMidiFile * @text: the text * @length: the string's length * * Writes a string to internal buffer up to length bytes. * * Since: 3.0.0 */ void ags_midi_file_write_text(AgsMidiFile *midi_file, gchar *text, guint length) { guint i; if(text == NULL){ return; } if((midi_file->iter + length) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + length) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } for(i = 0; i < length; i++){ midi_file->iter[i] = text[i]; } midi_file->iter += length; } /** * ags_midi_file_read_header: * @midi_file: the #AgsMidiFile * @buffer_length: pointer to return buffer length or %NULL * @error: the #GError pointer return location * * Reads the MIDI file's header and positions internal buffer pointer just behind it. * * Returns: the header's bytes * * Since: 3.0.0 */ unsigned char* ags_midi_file_read_header(AgsMidiFile *midi_file, guint *buffer_length, GError **error) { static gchar header[] = "MThd"; unsigned char *data; guint length; guint n; gchar c; GError *local_error; if(!AGS_IS_MIDI_FILE(midi_file)){ if(buffer_length != NULL){ *buffer_length = 0; } return(NULL); } data = NULL; length = 0; /* read header */ n = 0; while(n < 4 && (AGS_MIDI_FILE_EOF & (midi_file->flags)) == 0){ c = midi_file->iter[n]; if(c == header[n]){ n++; }else{ n = 0; } } /* position internal iteration pointer */ midi_file->iter += 4; length += 4; /* get some values */ local_error = NULL; midi_file->offset = (guint) ags_midi_file_read_gint32(midi_file, &local_error); local_error = NULL; midi_file->format = (guint) ags_midi_file_read_gint16(midi_file, &local_error); local_error = NULL; midi_file->count = (guint) ags_midi_file_read_gint16(midi_file, &local_error); local_error = NULL; midi_file->division = (guint) ags_midi_file_read_gint16(midi_file, &local_error); if((midi_file->division) & 0x8000){ /* SMPTE */ midi_file->times = 0; /* Can't do beats */ } midi_file->beat = midi_file->clicks = midi_file->division; length += 10; /* return values */ if(buffer_length != NULL){ *buffer_length = length; } return(data); } /** * ags_midi_file_write_header: * @midi_file: the #AgsMidiFile * @buffer: the buffer to write * @buffer_length: the length of the buffer * * Write header bytes. * * Since: 3.0.0 */ void ags_midi_file_write_header(AgsMidiFile *midi_file, unsigned char *buffer, guint length) { guint i; if(!AGS_IS_MIDI_FILE(midi_file)){ return; } if((midi_file->iter + length) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + length) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } for(i = 0; i < length; i++){ midi_file->iter[i] = buffer[i]; } midi_file->iter += length; } /** * ags_midi_file_read_track_data: * @midi_file: the #AgsMidiFile * @buffer_length: pointer to return buffer length or %NULL * @error: the #GError pointer return location * * Reads the MIDI file's track data. * * Returns: the track's bytes * * Since: 3.0.0 */ unsigned char* ags_midi_file_read_track_data(AgsMidiFile *midi_file, guint *buffer_length, GError **error) { gchar *track_name; unsigned char *data, *start; guint length; long delta_time; guint status; guint n; gchar c; gboolean end_of_track; static gchar track[] = "MTrk"; GError *local_error; if(!AGS_IS_MIDI_FILE(midi_file)){ if(buffer_length != NULL){ *buffer_length = 0; } return(NULL); } track_name = NULL; data = NULL; length = 0; /* midi track */ n = 0; while(n < 4 && midi_file->iter < &(midi_file->buffer[midi_file->buffer_length])){ c = midi_file->iter[0]; midi_file->iter += 1; if(c == track[n]){ n++; }else{ n = 0; } } start = midi_file->iter - 4; /* offset */ local_error = NULL; ags_midi_file_read_gint32(midi_file, &local_error); end_of_track = FALSE; while(!end_of_track){ local_error = NULL; delta_time = ags_midi_file_read_varlength(midi_file, &local_error); status = midi_file->iter[0]; midi_file->iter += 1; if((0xf0 & (0xf0 & status)) != 0xf0){ #ifdef AGS_DEBUG g_message("channel message"); #endif }else{ #ifdef AGS_DEBUG g_message("status message"); #endif switch(status){ case 0xf0: { /* start of system exclusive */ while(midi_file->iter[0] != 0xf7 && midi_file->iter < &(midi_file->buffer[midi_file->buffer_length])){ midi_file->iter += 1; } } case 0xf1: { /* quarter frame */ midi_file->iter += 1; } break; case 0xf2: { /* song position */ midi_file->iter += 2; } break; case 0xf3: { /* song select */ midi_file->iter += 1; } break; case 0xf4: case 0xf5: { /* undefined */ } break; case 0xf6: { /* tune request */ } break; case 0xf7: { /* sysex continuation or arbitrary stuff */ #ifdef AGS_DEBUG g_message("sysex end"); #endif } break; case 0xff: { guint meta_type; /* meta event */ meta_type = midi_file->iter[0]; midi_file->iter += 1; switch(meta_type){ case 0x00: { int c; c = midi_file->iter[0]; midi_file->iter += 1; if(c == 0x02){ midi_file->iter += 2; } } break; case 0x01: /* Text event */ case 0x02: /* Copyright notice */ case 0x03: /* Sequence/Track name */ case 0x04: /* Instrument name */ case 0x05: /* Lyric */ case 0x06: /* Marker */ case 0x07: /* Cue point */ case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: { gchar *text; guint text_length; /* These are all text events */ local_error = NULL; text_length = ags_midi_file_read_varlength(midi_file, &local_error); local_error = NULL; text = ags_midi_file_read_text(midi_file, text_length, &local_error); g_free(text); } break; case 0x2f: { int c; c = midi_file->iter[0]; midi_file->iter += 1; if(c == 0x0){ /* End of Track */ end_of_track = TRUE; } } break; case 0x51: { int c; c = midi_file->iter[0]; midi_file->iter += 1; if(c == 0x03){ /* Set tempo */ midi_file->iter += 3; } } break; case 0x54: { int c; c = midi_file->iter[0]; midi_file->iter += 1; if(c == 0x05){ midi_file->iter += 5; } } break; case 0x58: { int c; c = midi_file->iter[0]; midi_file->iter += 1; if(c == 0x04){ /* time signature */ midi_file->iter += 4; } } break; case 0x59: { int c; c = midi_file->iter[0]; midi_file->iter += 1; if(c == 0x02){ /* key signature */ midi_file->iter += 2; } } break; case 0x7f: { /* sequencer meta event */ midi_file->iter += 3; } break; default: { /* misc */ } } } break; default: g_warning("bad byte"); break; } } } /* return value */ length = midi_file->iter - start; if(buffer_length != NULL){ *buffer_length = length; } data = malloc(length * sizeof(unsigned char)); memcpy(data, start, length * sizeof(unsigned char)); return(data); } void ags_midi_file_write_track_data(AgsMidiFile *midi_file, unsigned char *buffer, guint length) { guint i; if(!AGS_IS_MIDI_FILE(midi_file)){ return; } if((midi_file->iter + length) >= (midi_file->buffer + midi_file->buffer_length)){ size_t new_length; new_length = (midi_file->iter + length) - (midi_file->buffer + midi_file->buffer_length); midi_file->buffer = (unsigned char *) realloc(midi_file->buffer, new_length * sizeof(unsigned char)); midi_file->buffer_length = new_length; } for(i = 0; i < length; i++){ midi_file->iter[i] = buffer[i]; } midi_file->iter += length; } void ags_midi_file_read_notation(AgsMidiFile *midi_file) { //TODO:JK: implement me } void ags_mid_file_read_midi(AgsMidiFile *midi_file) { //TODO:JK: implement me } /** * ags_midi_file_new: * @filename: the filename * * Create a new instance of #AgsMidiFile * * Returns: the new #AgsMidiFile * * Since: 3.0.0 */ AgsMidiFile* ags_midi_file_new(gchar *filename) { AgsMidiFile *midi_file; midi_file = (AgsMidiFile *) g_object_new(AGS_TYPE_MIDI_FILE, "filename", filename, NULL); return(midi_file); } gsequencer-3.1.3/ags/audio/midi/ags_midi_parser.c0000644000175000017500000017405313607331151016703 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_midi_parser_class_init(AgsMidiParserClass *midi_parser); void ags_midi_parser_init(AgsMidiParser *midi_parser); void ags_midi_parser_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midi_parser_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midi_parser_finalize(GObject *gobject); int ags_midi_parser_real_midi_getc(AgsMidiParser *midi_parser); void ags_midi_parser_real_on_error(AgsMidiParser *midi_parser, GError **error); xmlDoc* ags_midi_parser_real_parse_full(AgsMidiParser *midi_parser); xmlNode* ags_midi_parser_real_parse_header(AgsMidiParser *midi_parser); xmlNode* ags_midi_parser_real_parse_track(AgsMidiParser *midi_parser); xmlNode* ags_midi_parser_real_key_on(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_key_off(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_key_pressure(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_change_parameter(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_change_pitch_bend(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_change_program(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_change_channel_pressure(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_not_defined(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_sysex(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_system_common(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_meta_event(AgsMidiParser *midi_parser, guint status); xmlNode* ags_midi_parser_real_sequence_number(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_end_of_track(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_smtpe(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_tempo(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_time_signature(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_key_signature(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_sequencer_meta_event(AgsMidiParser *midi_parser, guint meta_type); xmlNode* ags_midi_parser_real_text_event(AgsMidiParser *midi_parser, guint meta_type); /** * SECTION:ags_midi_parser * @short_description: the MIDI parser * @title: AgsMidiParser * @section_id: * @include: ags/audio/midi/ags_midi_parser.h * * #AgsMidiParser parses your midi. */ enum{ PROP_0, PROP_FILE, }; enum{ MIDI_GETC, ON_ERROR, PARSE_FULL, PARSE_BYTES, PARSE_HEADER, PARSE_TRACK, KEY_ON, KEY_OFF, KEY_PRESSURE, CHANGE_PARAMETER, CHANGE_PITCH_BEND, CHANGE_PROGRAM, CHANGE_CHANNEL_PRESSURE, NOT_DEFINED, SYSEX, SYSTEM_COMMON, META_EVENT, SEQUENCE_NUMBER, END_OF_TRACK, SMTPE, TEMPO, TIME_SIGNATURE, KEY_SIGNATURE, SEQUENCER_META_EVENT, TEXT_EVENT, LAST_SIGNAL, }; static gpointer ags_midi_parser_parent_class = NULL; static guint midi_parser_signals[LAST_SIGNAL]; GType ags_midi_parser_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midi_parser = 0; static const GTypeInfo ags_midi_parser_info = { sizeof (AgsMidiParserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midi_parser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMidiParser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midi_parser_init, }; ags_type_midi_parser = g_type_register_static(G_TYPE_OBJECT, "AgsMidiParser", &ags_midi_parser_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_midi_parser); } return g_define_type_id__volatile; } void ags_midi_parser_class_init(AgsMidiParserClass *midi_parser) { GObjectClass *gobject; GParamSpec *param_spec; ags_midi_parser_parent_class = g_type_class_peek_parent(midi_parser); /* GObjectClass */ gobject = (GObjectClass *) midi_parser; gobject->set_property = ags_midi_parser_set_property; gobject->get_property = ags_midi_parser_get_property; gobject->finalize = ags_midi_parser_finalize; /* properties */ /** * AgsMidiParser:file: * * The file to parse data from. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("file", i18n_pspec("the file stream"), i18n_pspec("The file stream to parse"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); /* AgsMidiParser */ midi_parser->midi_getc = ags_midi_parser_real_midi_getc; midi_parser->on_error = ags_midi_parser_real_on_error; midi_parser->parse_full = ags_midi_parser_real_parse_full; midi_parser->parse_header = ags_midi_parser_real_parse_header; midi_parser->parse_track = ags_midi_parser_real_parse_track; midi_parser->key_on = ags_midi_parser_real_key_on; midi_parser->key_off = ags_midi_parser_real_key_off; midi_parser->key_pressure = ags_midi_parser_real_key_pressure; midi_parser->change_parameter = ags_midi_parser_real_change_parameter; midi_parser->change_pitch_bend = ags_midi_parser_real_change_pitch_bend; midi_parser->change_program = ags_midi_parser_real_change_program; midi_parser->change_channel_pressure = ags_midi_parser_real_change_channel_pressure; midi_parser->not_defined = ags_midi_parser_real_not_defined; midi_parser->sysex = ags_midi_parser_real_sysex; midi_parser->system_common = ags_midi_parser_real_system_common; midi_parser->meta_event = ags_midi_parser_real_meta_event; midi_parser->sequence_number = ags_midi_parser_real_sequence_number; midi_parser->end_of_track = ags_midi_parser_real_end_of_track; midi_parser->smtpe = ags_midi_parser_real_smtpe; midi_parser->tempo = ags_midi_parser_real_tempo; midi_parser->time_signature = ags_midi_parser_real_time_signature; midi_parser->key_signature = ags_midi_parser_real_key_signature; midi_parser->sequencer_meta_event = ags_midi_parser_real_sequencer_meta_event; midi_parser->text_event = ags_midi_parser_real_text_event; /* signals */ /** * AgsMidiParser::midi-getc: * @midi_parser: the #AgsMidiParser * * The ::midi-getc signal is emited during parsing of event. * * Returns: The character read * * Since: 3.0.0 */ midi_parser_signals[MIDI_GETC] = g_signal_new("midi-getc", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, midi_getc), NULL, NULL, ags_cclosure_marshal_INT__VOID, G_TYPE_INT, 0); /** * AgsMidiParser::on-error: * @midi_parser: the #AgsMidiParser * @error: the return location of #GError * * The ::on-error signal is emited as error occurs. * * Since: 3.0.0 */ midi_parser_signals[ON_ERROR] = g_signal_new("on-error", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, on_error), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsMidiParser::parse-full: * @midi_parser: the #AgsMidiParser * * The ::parse-full signal is emited during parsing of midi file. * * Returns: The XML doc * * Since: 3.0.0 */ midi_parser_signals[PARSE_FULL] = g_signal_new("parse-full", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, parse_full), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsMidiParser::parse-bytes: * @midi_parser: the #AgsMidiParser * @buffer: the MIDI data * @buffer_length: the buffer's length * * The ::parse-bytes signal is emited during parsing of bytes. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[PARSE_BYTES] = g_signal_new("parse-bytes", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, parse_bytes), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER_UINT, G_TYPE_POINTER, 2, G_TYPE_POINTER, G_TYPE_UINT); /** * AgsMidiParser::parse-header: * @midi_parser: the #AgsMidiParser * * The ::parse-header signal is emited during parsing of header. * * Returns: The XML node representing the header * * Since: 3.0.0 */ midi_parser_signals[PARSE_HEADER] = g_signal_new("parse-header", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, parse_header), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsMidiParser::parse-track: * @midi_parser: the #AgsMidiParser * * The ::parse-track signal is emited during parsing of track. * * Returns: The XML node representing the track * * Since: 3.0.0 */ midi_parser_signals[PARSE_TRACK] = g_signal_new("parse-track", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, parse_track), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsMidiParser::key-on: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::key-on signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[KEY_ON] = g_signal_new("key-on", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, key_on), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::key-off: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::key-off signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[KEY_OFF] = g_signal_new("key-off", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, key_off), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::key-pressure: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::key-pressure signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[KEY_PRESSURE] = g_signal_new("key-pressure", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, key_pressure), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::change-parameter: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::change-parameter signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[CHANGE_PARAMETER] = g_signal_new("change-parameter", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, change_parameter), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::change-pitch-bend: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::change-pitch-bend signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[CHANGE_PITCH_BEND] = g_signal_new("change-pitch-bend", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, change_pitch_bend), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::change-program: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::change-program signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[CHANGE_PROGRAM] = g_signal_new("change-program", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, change_program), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::change-channel-pressure: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::change-channel-pressure signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[CHANGE_CHANNEL_PRESSURE] = g_signal_new("change-channel-pressure", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, change_channel_pressure), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::not-defined: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::not-defined signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[NOT_DEFINED] = g_signal_new("not-defined", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, not_defined), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::sysex: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::sysex signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[SYSEX] = g_signal_new("sysex", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, sysex), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::system-common: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::system-common signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[SYSTEM_COMMON] = g_signal_new("system-common", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, system_common), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::meta-event: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::meta-event signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[META_EVENT] = g_signal_new("meta-event", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, meta_event), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::sequence-number: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::sequence-number signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[SEQUENCE_NUMBER] = g_signal_new("sequence-number", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, sequence_number), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::end-of-track: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::end-of-track signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[END_OF_TRACK] = g_signal_new("end-of-track", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, end_of_track), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::smtpe: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::smtpe signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[SMTPE] = g_signal_new("smtpe", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, smtpe), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::tempo: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::tempo signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[TEMPO] = g_signal_new("tempo", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, tempo), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::time-signature: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::time-signature signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[TIME_SIGNATURE] = g_signal_new("time-signature", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, time_signature), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::key-signature: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::key-signature signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[KEY_SIGNATURE] = g_signal_new("key-signature", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, key_signature), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::sequencer-meta-event: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::sequencer-meta-event signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[SEQUENCER_META_EVENT] = g_signal_new("sequencer-meta-event", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, sequencer_meta_event), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); /** * AgsMidiParser::text-event: * @midi_parser: the #AgsMidiParser * @status: the MIDI status byte * * The ::text-event signal is emited during parsing of event. * * Returns: The XML node representing the event * * Since: 3.0.0 */ midi_parser_signals[TEXT_EVENT] = g_signal_new("text-event", G_TYPE_FROM_CLASS(midi_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMidiParserClass, text_event), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); } void ags_midi_parser_init(AgsMidiParser *midi_parser) { midi_parser->flags = 0; /* midi parser mutex */ g_rec_mutex_init(&(midi_parser->obj_mutex)); midi_parser->file = NULL; midi_parser->nth_chunk = 0; midi_parser->file_length = 0; midi_parser->offset = 0; midi_parser->current_time = 0; midi_parser->current_status = 0x0; midi_parser->doc = NULL; } void ags_midi_parser_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiParser *midi_parser; GRecMutex *midi_parser_mutex; midi_parser = AGS_MIDI_PARSER(gobject); /* get midi parser mutex */ midi_parser_mutex = AGS_MIDI_PARSER_GET_OBJ_MUTEX(midi_parser); switch(prop_id){ case PROP_FILE: { struct stat sb; g_rec_mutex_lock(midi_parser_mutex); midi_parser->file = g_value_get_pointer(value); g_rec_mutex_unlock(midi_parser_mutex); /* read file */ fstat(fileno(midi_parser->file), &sb); midi_parser->file_length = sb.st_size; midi_parser->buffer = (guchar *) malloc(midi_parser->file_length * sizeof(guchar)); fread(midi_parser->buffer, sizeof(guchar), midi_parser->file_length, midi_parser->file); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_parser_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiParser *midi_parser; GRecMutex *midi_parser_mutex; midi_parser = AGS_MIDI_PARSER(gobject); /* get midi parser mutex */ midi_parser_mutex = AGS_MIDI_PARSER_GET_OBJ_MUTEX(midi_parser); switch(prop_id){ case PROP_FILE: { g_rec_mutex_lock(midi_parser_mutex); g_value_set_pointer(value, midi_parser->file); g_rec_mutex_unlock(midi_parser_mutex); } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midi_parser_finalize(GObject *gobject) { AgsMidiParser *midi_parser; midi_parser = (AgsMidiParser *) gobject; /* call parent */ G_OBJECT_CLASS(ags_midi_parser_parent_class)->finalize(gobject); } /** * ags_midi_parser_read_gint16: * @midi_parser: the #AgsMidiParser * * Read gint16. * * Returns: the read gint16 * * Since: 3.0.0 */ gint16 ags_midi_parser_read_gint16(AgsMidiParser *midi_parser) { char str[2]; gint16 value = 0; str[0] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); str[1] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); value = (str[0] & 0xff); value = (value << 8) + (str[1] & 0xff); return(value); } /** * ags_midi_parser_read_gint24: * @midi_parser: the #AgsMidiParser * * Read gint32. * * Returns: the read gint32 * * Since: 3.0.0 */ gint32 ags_midi_parser_read_gint24(AgsMidiParser *midi_parser) { char str[4]; gint32 value = 0; str[0] = (char) 0x00; str[1] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); str[2] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); str[3] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); value = (value << 8) + (str[1] & 0xff); value = (value << 8) + (str[2] & 0xff); value = (value << 8) + (str[3] & 0xff); return(value); } /** * ags_midi_parser_read_gint32: * @midi_parser: the #AgsMidiParser * * Read gint32. * * Returns: the read gint32 * * Since: 3.0.0 */ gint32 ags_midi_parser_read_gint32(AgsMidiParser *midi_parser) { char str[4]; gint32 value; str[0] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); str[1] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); str[2] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); str[3] = (char) 0xff & ags_midi_parser_midi_getc(midi_parser); value = (str[0] & 0xff); value = (value << 8) + (str[1] & 0xff); value = (value << 8) + (str[2] & 0xff); value = (value << 8) + (str[3] & 0xff); return(value); } /** * ags_midi_parser_read_varlength: * @midi_parser: the #AgsMidiParser * * Read varlength as long. * * Returns: the read varlength * * Since: 3.0.0 */ long ags_midi_parser_read_varlength(AgsMidiParser *midi_parser) { long value; guint i; guchar c; c = ags_midi_parser_midi_getc(midi_parser); value = c; i = 1; if(0x80 & c){ value &= 0x7F; do{ c = ags_midi_parser_midi_getc(midi_parser); value = (value << 7) + (0x7F & (c)); i++; }while(0x80 & c); } return(value); } /** * ags_midi_parser_read_text: * @midi_parser: the #AgsMidiParser * @length: the length * * Read text. * * Returns: the text read as string * * Since: 3.0.0 */ gchar* ags_midi_parser_read_text(AgsMidiParser *midi_parser, gint length) { gchar text[AGS_MIDI_PARSER_MAX_TEXT_LENGTH + 1]; gchar c; guint i; memset(text, 0, AGS_MIDI_PARSER_MAX_TEXT_LENGTH * sizeof(char)); i = 0; while((length <= 0 || i < length) && (AGS_MIDI_PARSER_EOF & (midi_parser->flags)) == 0 && i < AGS_MIDI_PARSER_MAX_TEXT_LENGTH){ (c = (char) 0xff & (ags_midi_parser_midi_getc(midi_parser))); if(c == '\0' || !(g_ascii_isalnum(c) || g_ascii_ispunct(c) || c == ' ')){ break; } text[i] = c; i++; } text[i] = '\0'; return(g_strdup(text)); } /** * ags_midi_parser_ticks_to_sec: * @midi_parser: the #AgsMidiParser * @ticks: the ticks count * @division: the division * @tempo: the tempo * * Convert ticks to seconds. * * Returns: the seconds read from ticks * * Since: 3.0.0 */ gdouble ags_midi_parser_ticks_to_sec(AgsMidiParser *midi_parser, guint ticks, gint division, guint tempo) { gdouble retval; if(division > 0){ retval = ((gdouble) ticks * tempo) / (gdouble) (division * 1000000.0); return(retval); }else{ gdouble smtpe_format, smtpe_resolution; smtpe_format = (gdouble) ((0xff00 & division) >> 8); smtpe_resolution = (gdouble) (0xff & division); retval = (((gdouble) ticks) / (gdouble) (smtpe_format * smtpe_resolution * 1000000.0)); return(retval); } } int ags_midi_parser_real_midi_getc(AgsMidiParser *midi_parser) { int c; if(midi_parser->file == NULL){ return(-1); } if(midi_parser->offset >= midi_parser->file_length){ midi_parser->flags |= AGS_MIDI_PARSER_EOF; return(-1); } c = (int) midi_parser->buffer[midi_parser->offset]; midi_parser->offset += 1; return(c); } /** * ags_midi_parser_midi_getc: * @midi_parser: the #AgsMidiParser * * Read one byte. * * Returns: the byte read * * Since: 3.0.0 */ int ags_midi_parser_midi_getc(AgsMidiParser *midi_parser) { int c; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), '\0'); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[MIDI_GETC], 0, &c); g_object_unref((GObject *) midi_parser); return(c); } void ags_midi_parser_real_on_error(AgsMidiParser *midi_parser, GError **error) { //TODO:JK: implement me } /** * ags_midi_parser_on_error: * @midi_parser: the #AgsMidiParser * @error: the return location of #GError-struct * * Error reporting. * * Since: 3.0.0 */ void ags_midi_parser_on_error(AgsMidiParser *midi_parser, GError **error) { g_return_if_fail(AGS_IS_MIDI_PARSER(midi_parser)); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[ON_ERROR], 0, error); g_object_unref((GObject *) midi_parser); } xmlDoc* ags_midi_parser_real_parse_full(AgsMidiParser *midi_parser) { xmlDoc *doc; xmlNode *root_node; xmlNode *tracks_node; xmlNode *current; /* create xmlDoc and set root node */ midi_parser->doc = doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "midi"); xmlDocSetRootElement(doc, root_node); /* create tracks node */ tracks_node = xmlNewNode(NULL, "midi-tracks"); /* parse header */ current = ags_midi_parser_parse_header(midi_parser); xmlAddChild(root_node, current); #ifdef AGS_DEBUG g_message("parsed header"); #endif /* parse tracks */ xmlAddChild(root_node, tracks_node); while(((AGS_MIDI_PARSER_EOF & (midi_parser->flags))) == 0){ current = ags_midi_parser_parse_track(midi_parser); if(current != NULL){ xmlAddChild(tracks_node, current); #ifdef AGS_DEBUG g_message("parsed track"); #endif }else{ g_warning("skipped input"); } } return(doc); } /** * ags_midi_parser_parse_full: * @midi_parser: the #AgsMidiParser * * Parse all data of #AgsMidiParser:file. * * Returns: (transfer none): the xmlDoc representing your MIDI file * * Since: 3.0.0 */ xmlDoc* ags_midi_parser_parse_full(AgsMidiParser *midi_parser) { xmlDoc *doc; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[PARSE_FULL], 0, &doc); g_object_unref((GObject *) midi_parser); return(doc); } xmlNode* ags_midi_parser_parse_bytes(AgsMidiParser *midi_parser, guchar *midi_buffer, guint buffer_length) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_midi_parser_real_parse_header(AgsMidiParser *midi_parser) { xmlNode *node; static gchar header[] = "MThd"; guint offset; guint format; guint count; guint division; guint beat, clicks; guint n; gchar c; /* read header */ n = 0; while(n < 4 && (AGS_MIDI_PARSER_EOF & (midi_parser->flags)) == 0){ c = ags_midi_parser_midi_getc(midi_parser); if(c == header[n]){ n++; }else{ n = 0; } } node = xmlNewNode(NULL, "midi-header"); /* get some values */ offset = (guint) ags_midi_parser_read_gint32(midi_parser); format = (guint) ags_midi_parser_read_gint16(midi_parser); count = (guint) ags_midi_parser_read_gint16(midi_parser); division = (guint) ags_midi_parser_read_gint16(midi_parser); xmlNewProp(node, "offset", g_strdup_printf("%d", offset)); xmlNewProp(node, "format", g_strdup_printf("%d", format)); if(division & 0x8000){ /* SMTPE */ xmlNewProp(node, "division", g_strdup_printf("%d %d", -((-(division>>8))&0xff), division&0xff)); }else{ xmlNewProp(node, "division", g_strdup_printf("%d", division)); } if(format > 2){ g_warning("Can't deal with format %d files\n", format); return(NULL); } beat = clicks = division; xmlNewProp(node, "beat", g_strdup_printf("%d", beat)); xmlNewProp(node, "track-count", g_strdup_printf("%d", count)); return(node); } /** * ags_midi_parser_parse_header: * @midi_parser: the #AgsMidiParser * * Parse MIDI header * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_parse_header(AgsMidiParser *midi_parser) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[PARSE_HEADER], 0, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_parse_track(AgsMidiParser *midi_parser) { xmlNode *node, *current; static gchar track[] = "MTrk"; gint offset; long delta_time; guint status; guint n; gchar c; n = 0; while(n < 4 && (AGS_MIDI_PARSER_EOF & (midi_parser->flags)) == 0){ c = ags_midi_parser_midi_getc(midi_parser); if(c == track[n]){ n++; }else{ n = 0; } } if((AGS_MIDI_PARSER_EOF & (midi_parser->flags)) != 0){ return(NULL); } node = xmlNewNode(NULL, "midi-track"); offset = ags_midi_parser_read_gint32(midi_parser); #ifdef AGS_DEBUG g_message("n = %d\noffset = %d", n, offset); #endif if(offset < 0){ return(NULL); } midi_parser->current_time = 0; for(; midi_parser->offset < midi_parser->file_length; ){ delta_time = ags_midi_parser_read_varlength(midi_parser); midi_parser->current_time += (guint) delta_time; status = ags_midi_parser_midi_getc(midi_parser); if((0xf0 & status) == 0xf0){ #ifdef AGS_DEBUG g_message("status message"); #endif switch(status){ case 0xf0: { /* start of system exclusive */ ags_midi_parser_sysex(midi_parser, status); } break; case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: { ags_midi_parser_system_common(midi_parser, status); } break; case 0xf7: { /* sysex continuation or arbitrary stuff */ #ifdef AGS_DEBUG g_message("sysex end"); #endif } break; case 0xff: { /* meta event */ current = ags_midi_parser_meta_event(midi_parser, status); if(current != NULL){ xmlChar *str; xmlNewProp(current, "delta-time", g_strdup_printf("%d", midi_parser->current_time)); xmlAddChild(node, current); str = xmlGetProp(current, AGS_MIDI_EVENT); if(str != NULL && !g_ascii_strcasecmp(str, "end-of-track")){ return(node); } } } break; default: g_warning("bad byte"); } }else{ current = ags_midi_parser_channel_message(midi_parser, status); if(current != NULL){ xmlNewProp(current, "delta-time", g_strdup_printf("%u", midi_parser->current_time)); xmlAddChild(node, current); }else{ g_message("unknown channel message 0x%x", status); } #ifdef AGS_DEBUG g_message("channel message"); #endif } } return(node); } /** * ags_midi_parser_parse_track: * @midi_parser: the #AgsMidiParser * * Parse MIDI track. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_parse_track(AgsMidiParser *midi_parser) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[PARSE_TRACK], 0, &node); g_object_unref((GObject *) midi_parser); return(node); } /** * ags_midi_parser_channel_message: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse channel message. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_channel_message(AgsMidiParser *midi_parser, guint status) { xmlNode *node; node = NULL; #ifdef AGS_DEBUG g_message("channel message"); #endif ags_midi_parser_channel_message_CHECK: switch(status & 0xf0){ case 0x80: { node = ags_midi_parser_key_off(midi_parser, status); midi_parser->current_status = status; } break; case 0x90: { node = ags_midi_parser_key_on(midi_parser, status); midi_parser->current_status = status; } break; case 0xa0: { node = ags_midi_parser_key_pressure(midi_parser, status); midi_parser->current_status = status; } break; case 0xb0: { node = ags_midi_parser_change_parameter(midi_parser, status); midi_parser->current_status = status; } break; case 0xc0: { node = ags_midi_parser_change_program(midi_parser, status); midi_parser->current_status = status; } break; case 0xd0: { node = ags_midi_parser_change_channel_pressure(midi_parser, status); midi_parser->current_status = status; } break; case 0xe0: { node = ags_midi_parser_change_pitch_bend(midi_parser, status); midi_parser->current_status = status; } break; default: { if(midi_parser->current_status >= 0x80 && midi_parser->current_status <= 0xef){ #ifdef AGS_DEBUG g_message("repeat status=0x%x", midi_parser->current_status); #endif midi_parser->offset -= 1; status = midi_parser->current_status; goto ags_midi_parser_channel_message_CHECK; } } } return(node); } xmlNode* ags_midi_parser_real_key_on(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, note, velocity; #ifdef AGS_DEBUG g_message("key on"); #endif channel = 0xf & status; note = (0x7f) & ags_midi_parser_midi_getc(midi_parser); velocity = (0x7f) & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "note-on"); xmlNewProp(node, "key", g_strdup_printf("%d", channel)); xmlNewProp(node, "note", g_strdup_printf("%d", note)); xmlNewProp(node, "velocity", g_strdup_printf("%d", velocity)); return(node); } /** * ags_midi_parser_key_on: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse key on. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_key_on(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[KEY_ON], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_key_off(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, note, velocity; #ifdef AGS_DEBUG g_message("key off"); #endif channel = 0xf & status; note = (0x7f) & ags_midi_parser_midi_getc(midi_parser); velocity = (0x7f) & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "note-off"); xmlNewProp(node, "key", g_strdup_printf("%d", channel)); xmlNewProp(node, "note", g_strdup_printf("%d", note)); xmlNewProp(node, "velocity", g_strdup_printf("%d", velocity)); return(node); } /** * ags_midi_parser_key_off: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse key off. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_key_off(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[KEY_OFF], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_key_pressure(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, note, pressure; #ifdef AGS_DEBUG g_message("key pressure"); #endif channel = 0xf & status; note = 0x7f & ags_midi_parser_midi_getc(midi_parser); pressure = 0x7f & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "polyphonic"); xmlNewProp(node, "key", g_strdup_printf("%d", channel)); xmlNewProp(node, "note", g_strdup_printf("%d", note)); xmlNewProp(node, "pressure", g_strdup_printf("%d", pressure)); return(node); } /** * ags_midi_parser_key_pressure: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse key pressure. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_key_pressure(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[KEY_PRESSURE], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_change_parameter(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, control, value; #ifdef AGS_DEBUG g_message("change parameter"); #endif channel = 0xf & status; control = 0x7f & ags_midi_parser_midi_getc(midi_parser); value = 0x7f & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); if(control < 120){ xmlNewProp(node, AGS_MIDI_EVENT, "change-parameter"); xmlNewProp(node, "channel", g_strdup_printf("%d", channel)); xmlNewProp(node, "control", g_strdup_printf("%d", control)); xmlNewProp(node, "value", g_strdup_printf("%d", value)); }else{ xmlNewProp(node, AGS_MIDI_EVENT, "change-mode"); xmlNewProp(node, "channel", g_strdup_printf("%d", channel)); switch(control){ case 120: { xmlNewProp(node, "mode", "all-sound-off"); } break; case 121: { xmlNewProp(node, "mode", "reset-control-all"); xmlNewProp(node, "value", g_strdup_printf("%d", value)); } break; case 122: { if(value == 0){ xmlNewProp(node, "mode", "local-control-off"); }else{ xmlNewProp(node, "mode", "local-control-on"); } } break; case 123: { xmlNewProp(node, "mode", "all-notes-off"); } break; case 124: { xmlNewProp(node, "mode", "omni-mode-on"); } break; case 125: { xmlNewProp(node, "mode", "omni-mode-off"); } break; case 126: { xmlNewProp(node, "mode", "mono-mode-on"); xmlNewProp(node, "omni-off-channels", g_strdup_printf("%d", value)); } break; case 127: { xmlNewProp(node, "mode", "poly-mode-on"); } break; } } return(node); } /** * ags_midi_parser_change_parameter: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse change parameter. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_change_parameter(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[CHANGE_PARAMETER], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_change_pitch_bend(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, pitch, transmitter; #ifdef AGS_DEBUG g_message("change pitch bend"); #endif channel = 0xf & status; pitch = 0x7f & ags_midi_parser_midi_getc(midi_parser); transmitter = 0x7f & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, "channel", g_strdup_printf("%d", channel)); xmlNewProp(node, AGS_MIDI_EVENT, "pitch-bend"); xmlNewProp(node, "pitch", g_strdup_printf("%d", pitch)); xmlNewProp(node, "transmitter", g_strdup_printf("%d", transmitter)); return(node); } /** * ags_midi_parser_change_pitch_bend: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse change pitch bend. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_change_pitch_bend(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[CHANGE_PITCH_BEND], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_change_program(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, program; #ifdef AGS_DEBUG g_message("change program"); #endif channel = 0xf & status; program = 0x7f & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "program-change"); xmlNewProp(node, "channel", g_strdup_printf("%d", channel)); xmlNewProp(node, "program", g_strdup_printf("%d", program)); return(node); } /** * ags_midi_parser_change_program: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse change program. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_change_program(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[CHANGE_PROGRAM], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_change_channel_pressure(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int channel, pressure; #ifdef AGS_DEBUG g_message("change channel pressure"); #endif channel = 0xf & status; pressure = 0x7f & ags_midi_parser_midi_getc(midi_parser); node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "channel-pressure"); xmlNewProp(node, "channel", g_strdup_printf("%d", channel)); xmlNewProp(node, "pressure", g_strdup_printf("%d", pressure)); return(node); } /** * ags_midi_parser_change_channel_pressure: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse change channel pressure. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_change_channel_pressure(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[CHANGE_CHANNEL_PRESSURE], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_not_defined(AgsMidiParser *midi_parser, guint status) { #ifdef AGS_DEBUG g_message("not defined"); #endif return(NULL); } /** * ags_midi_parser_not_defined: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse not defined. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_not_defined(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[NOT_DEFINED], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_sysex(AgsMidiParser *midi_parser, guint status) { xmlNode *node; gchar c; while((c = ags_midi_parser_midi_getc(midi_parser)) != 0xf7 && (AGS_MIDI_PARSER_EOF & (midi_parser->flags)) == 0); #ifdef AGS_DEBUG g_message("discarded sysex"); #endif return(NULL); } /** * ags_midi_parser_sysex: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse sysex. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_sysex(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[SYSEX], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_system_common(AgsMidiParser *midi_parser, guint status) { xmlNode *node; int c; node = NULL; #ifdef AGS_DEBUG g_message("system common"); #endif switch(status){ case 0xf1: { guint quarter_frame; quarter_frame = 0xff & (ags_midi_parser_midi_getc(midi_parser)); node = xmlNewNode(NULL, "midi-system-common"); xmlNewProp(node, "quarter-frame", g_strdup_printf("%d", quarter_frame)); } break; case 0xf2: { guint song_position; song_position = 0x7f & (ags_midi_parser_midi_getc(midi_parser)) << 7; song_position |= 0x7f & (ags_midi_parser_midi_getc(midi_parser)); node = xmlNewNode(NULL, "midi-system-common"); xmlNewProp(node, "song-position", g_strdup_printf("%d", song_position)); } break; case 0xf3: { guint song_select; song_select = 0x7f & (ags_midi_parser_midi_getc(midi_parser)); node = xmlNewNode(NULL, "midi-system-common"); xmlNewProp(node, "song-select", g_strdup_printf("%d", song_select)); } break; case 0xf4: { #ifdef AGS_DEBUG g_message("undefined"); #endif } break; case 0xf5: { #ifdef AGS_DEBUG g_message("undefined"); #endif } break; case 0xf6: { #ifdef AGS_DEBUG g_message("tune request"); #endif } break; } return(node); } /** * ags_midi_parser_system_common: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse system common. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_system_common(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[SYSTEM_COMMON], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_meta_event(AgsMidiParser *midi_parser, guint status) { xmlNode *node; char chunk_meta_length[4]; guint meta_type; #ifdef AGS_DEBUG g_message("meta event"); #endif meta_type = 0xff & (ags_midi_parser_midi_getc(midi_parser)); node = NULL; switch(meta_type){ case 0x00: { int c; c = ags_midi_parser_midi_getc(midi_parser); if(c == 0x02){ node = ags_midi_parser_sequence_number(midi_parser, meta_type); } } break; case 0x01: /* Text event */ case 0x02: /* Copyright notice */ case 0x03: /* Sequence/Track name */ case 0x04: /* Instrument name */ case 0x05: /* Lyric */ case 0x06: /* Marker */ case 0x07: /* Cue point */ case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: { /* These are all text events */ node = ags_midi_parser_text_event(midi_parser, meta_type); } break; case 0x2f: { /* End of Track */ node = ags_midi_parser_end_of_track(midi_parser, meta_type); } break; case 0x51: { /* Set tempo */ node = ags_midi_parser_tempo(midi_parser, meta_type); } break; case 0x54: { node = ags_midi_parser_smtpe(midi_parser, meta_type); } break; case 0x58: { node = ags_midi_parser_time_signature(midi_parser, meta_type); } break; case 0x59: { node = ags_midi_parser_key_signature(midi_parser, meta_type); } break; case 0x7f: { node = ags_midi_parser_sequencer_meta_event(midi_parser, meta_type); } break; default: midi_parser->offset += 5; node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "misc"); } #ifdef AGS_DEBUG g_message("meta type 0x%x", meta_type); #endif return(node); } /** * ags_midi_parser_meta_event: * @midi_parser: the #AgsMidiParser * @status: the status byte * * Parse meta event. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_meta_event(AgsMidiParser *midi_parser, guint status) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[META_EVENT], 0, status, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_sequence_number(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; guint sequence; #ifdef AGS_DEBUG g_message("sequence number"); #endif node = xmlNewNode(NULL, "midi-message"); sequence = (guint) ags_midi_parser_read_gint16(midi_parser); xmlNewProp(node, AGS_MIDI_EVENT, "sequence-number"); xmlNewProp(node, "sequence", g_strdup_printf("%d", sequence)); return(node); } /** * ags_midi_parser_sequence_number: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse sequence number. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_sequence_number(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[SEQUENCE_NUMBER], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_end_of_track(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; int length; #ifdef AGS_DEBUG g_message("EOT"); #endif node = xmlNewNode(NULL, "midi-message"); length = ags_midi_parser_midi_getc(midi_parser); xmlNewProp(node, AGS_MIDI_EVENT, "end-of-track"); return(node); } /** * ags_midi_parser_end_of_track: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse end of track. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_end_of_track(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[END_OF_TRACK], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_smtpe(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; int length; int rr, hr, mn, se, fr, ff; #ifdef AGS_DEBUG g_message("SMTPE"); #endif node = xmlNewNode(NULL, "midi-message"); length = ags_midi_parser_midi_getc(midi_parser); rr = hr = ags_midi_parser_midi_getc(midi_parser); rr = (0x60 & rr) >> 5; hr = (0x1f & hr); mn = 0xff & ags_midi_parser_midi_getc(midi_parser); se = 0xff & ags_midi_parser_midi_getc(midi_parser); fr = 0xff & ags_midi_parser_midi_getc(midi_parser); ff = 0xff & ags_midi_parser_midi_getc(midi_parser); xmlNewProp(node, AGS_MIDI_EVENT, "smtpe"); xmlNewProp(node, "rate", g_strdup_printf("%d", rr)); xmlNewProp(node, "timestamp", g_strdup_printf("%d %d %d %d", hr, mn, se, fr)); return(node); } /** * ags_midi_parser_smtpe: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse smtpe. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_smtpe(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[SMTPE], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_tempo(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; guint length; gint tempo; #ifdef AGS_DEBUG g_message("tempo"); #endif node = xmlNewNode(NULL, "midi-message"); length = 0xff & ags_midi_parser_midi_getc(midi_parser); tempo = ags_midi_parser_read_gint24(midi_parser); xmlNewProp(node, AGS_MIDI_EVENT, "tempo-number"); xmlNewProp(node, "tempo", g_strdup_printf("%d", tempo)); return(node); } /** * ags_midi_parser_tempo: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse tempo. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_tempo(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[TEMPO], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_time_signature(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; int length; int nn, dd, cc, bb; int denom = 1; #ifdef AGS_DEBUG g_message("time signature"); #endif node = xmlNewNode(NULL, "midi-message"); length = 0xff & ags_midi_parser_midi_getc(midi_parser); nn = 0xff & ags_midi_parser_midi_getc(midi_parser); dd = 0xff & ags_midi_parser_midi_getc(midi_parser); cc = 0xff & ags_midi_parser_midi_getc(midi_parser); bb = 0xff & ags_midi_parser_midi_getc(midi_parser); while(dd > 0){ denom *= 2; dd--; } xmlNewProp(node, AGS_MIDI_EVENT, "time-signature"); xmlNewProp(node, "timesig", g_strdup_printf("%d/%d %d %d", nn, denom, cc, bb)); return(node); } /** * ags_midi_parser_time_signature: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse time signature. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_time_signature(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[TIME_SIGNATURE], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_key_signature(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; int length; int sf, mi; #ifdef AGS_DEBUG g_message("key signature"); #endif node = xmlNewNode(NULL, "midi-message"); xmlNewProp(node, AGS_MIDI_EVENT, "key-signature"); length = ags_midi_parser_midi_getc(midi_parser); sf = ags_midi_parser_midi_getc(midi_parser); mi = ags_midi_parser_midi_getc(midi_parser); xmlNewProp(node, "keysig", g_strdup_printf("%d %s", (sf > 127 ? sf - 256: sf), (mi ? "minor": "major"))); return(node); } /** * ags_midi_parser_key_signature: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse key signature. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_key_signature(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[KEY_SIGNATURE], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_sequencer_meta_event(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; guint len, id, data; #ifdef AGS_DEBUG g_message("sequencer meta event"); #endif node = xmlNewNode(NULL, "midi-meta-event"); len = ags_midi_parser_midi_getc(midi_parser); id = ags_midi_parser_midi_getc(midi_parser); data = ags_midi_parser_midi_getc(midi_parser); xmlNewProp(node, "length", g_strdup_printf("%d", len)); xmlNewProp(node, "id", g_strdup_printf("%d", id)); xmlNewProp(node, "data", g_strdup_printf("%d", data)); return(node); } xmlNode* ags_midi_parser_sequencer_meta_event(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[META_EVENT], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } xmlNode* ags_midi_parser_real_text_event(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; gchar *text; guint text_length; #ifdef AGS_DEBUG g_message("text event"); #endif node = xmlNewNode(NULL, "midi-message"); //TODO:JK: verify me text_length = 0x7f & ags_midi_parser_midi_getc(midi_parser); text = ags_midi_parser_read_text(midi_parser, text_length); switch(0x0f & meta_type){ case 0x01: /* Text event */ xmlNewProp(node, "text", text); break; case 0x02: { /* Copyright notice */ xmlNewProp(node, "copyright", text); } break; case 0x03: { /* Sequence/Track name */ xmlNewProp(node, "sequence-name", text); } break; case 0x04: { /* Instrument name */ xmlNewProp(node, "instrument-name", text); } break; case 0x05: /* Lyric */ break; case 0x06: /* Marker */ break; case 0x07: /* Cue point */ break; case 0x08: break; case 0x09: break; case 0x0a: break; case 0x0b: break; case 0x0c: break; case 0x0d: break; case 0x0e: break; case 0x0f: break; default: g_warning("unknown text event"); } return(node); } /** * ags_midi_parser_text_event: * @midi_parser: the #AgsMidiParser * @meta_type: the meta type byte * * Parse text event. * * Returns: (transfer none): the xmlNode containing parsed data * * Since: 3.0.0 */ xmlNode* ags_midi_parser_text_event(AgsMidiParser *midi_parser, guint meta_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_MIDI_PARSER(midi_parser), NULL); g_object_ref((GObject *) midi_parser); g_signal_emit(G_OBJECT(midi_parser), midi_parser_signals[TEXT_EVENT], 0, meta_type, &node); g_object_unref((GObject *) midi_parser); return(node); } /** * ags_midi_parser_new: * @file: the FILE handle * * Creates a new instance of #AgsMidiParser * * Returns: the new #AgsMidiParser * * Since: 3.0.0 */ AgsMidiParser* ags_midi_parser_new(FILE *file) { AgsMidiParser *midi_parser; struct stat sb; midi_parser = (AgsMidiParser *) g_object_new(AGS_TYPE_MIDI_PARSER, "file", file, NULL); return(midi_parser); } gsequencer-3.1.3/ags/audio/midi/ags_midi_builder.h0000644000175000017500000002367613607210263017046 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_BUILDER_H__ #define __AGS_MIDI_BUILDER_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_BUILDER (ags_midi_builder_get_type ()) #define AGS_MIDI_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_BUILDER, AgsMidiBuilder)) #define AGS_MIDI_BUILDER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_BUILDER, AgsMidiBuilderClass)) #define AGS_IS_MIDI_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDI_BUILDER)) #define AGS_IS_MIDI_BUILDER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDI_BUILDER)) #define AGS_MIDI_BUILDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MIDI_BUILDER, AgsMidiBuilderClass)) #define AGS_MIDI_BUILDER_GET_OBJ_MUTEX(obj) (&(((AgsMidiBuilder *) obj)->obj_mutex)) #define AGS_MIDI_BUILDER_HEADER(ptr) ((AgsMidiBuilderHeader *)(ptr)) #define AGS_MIDI_BUILDER_TRACK(ptr) ((AgsMidiBuilderTrack *)(ptr)) typedef struct _AgsMidiBuilder AgsMidiBuilder; typedef struct _AgsMidiBuilderClass AgsMidiBuilderClass; typedef struct _AgsMidiBuilderHeader AgsMidiBuilderHeader; typedef struct _AgsMidiBuilderTrack AgsMidiBuilderTrack; typedef enum{ AGS_MIDI_BUILDER_EOF = 1, AGS_MIDI_BUILDER_EOT = 1 << 1, }AgsMidiBuilderFlags; struct _AgsMidiBuilder { GObject gobject; guint flags; GRecMutex obj_mutex; guchar *data; guint length; FILE *file; AgsMidiBuilderHeader *midi_header; GList *midi_track; AgsMidiBuilderTrack *current_midi_track; }; struct _AgsMidiBuilderClass { GObjectClass gobject; void (*midi_putc)(AgsMidiBuilder *midi_builder, gint c); void (*on_error)(AgsMidiBuilder *midi_builder, GError **error); /* channel messages */ void (*append_header)(AgsMidiBuilder *midi_builder, guint offset, guint format, guint track_count, guint division, guint times, guint bpm, guint clicks); void (*append_track)(AgsMidiBuilder *midi_builder, gchar *track_name); void (*append_key_on)(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity); void (*append_key_off)(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity); void (*append_key_pressure)(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint pressure); void (*append_change_parameter)(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint control, guint value); void (*append_change_pitch_bend)(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pitch, guint transmitter); void (*append_change_program)(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint program); void (*append_change_pressure)(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pressure); /* sysex and system common */ void (*append_sysex)(AgsMidiBuilder *midi_builder, guint delta_time, guchar *sysex_data, guint length); void (*append_quarter_frame)(AgsMidiBuilder *midi_builder, guint delta_time, guint message_type, guint values); void (*append_song_position)(AgsMidiBuilder *midi_builder, guint delta_time, guint song_position); void (*append_song_select)(AgsMidiBuilder *midi_builder, guint delta_time, guint song_select); void (*append_tune_request)(AgsMidiBuilder *midi_builder, guint delta_time); /* meta events */ void (*append_sequence_number)(AgsMidiBuilder *midi_builder, guint delta_time, guint sequence); void (*append_smtpe)(AgsMidiBuilder *midi_builder, guint delta_time, guint rr, guint hr, guint mn, guint se, guint fr); void (*append_tempo)(AgsMidiBuilder *midi_builder, guint delta_time, guint tempo); void (*append_time_signature)(AgsMidiBuilder *midi_builder, guint delta_time, guint nn, guint dd, guint cc, guint bb); void (*append_key_signature)(AgsMidiBuilder *midi_builder, guint delta_time, guint sf, guint mi); void (*append_sequencer_meta_event)(AgsMidiBuilder *midi_builder, guint delta_time, guint len, guint id, guint data); void (*append_text_event)(AgsMidiBuilder *midi_builder, guint delta_time, gchar *text, guint length); }; struct _AgsMidiBuilderHeader { guint offset; guint format; guint count; guint division; guint times; guint beat; guint clicks; guchar *data; guint length; }; struct _AgsMidiBuilderTrack { AgsMidiBuilder *midi_builder; guint offset; gchar *track_name; guint64 absolute_time; guchar *data; guint length; }; GType ags_midi_builder_get_type(void); AgsMidiBuilderHeader* ags_midi_builder_header_alloc(); void ags_midi_builder_header_free(AgsMidiBuilderHeader *midi_builder_header); AgsMidiBuilderTrack* ags_midi_builder_track_alloc(); void ags_midi_builder_track_free(AgsMidiBuilderTrack *midi_builder_track); GList* ags_midi_builder_track_find_delta_time_with_track_name(GList *midi_builder_track, guint64 absolute_time, gchar *track_name); void ags_midi_builder_track_insert_midi_message(AgsMidiBuilderTrack *midi_builder_track, guchar *buffer, guint length); guchar* ags_midi_builder_track_get_delta_time_offset(AgsMidiBuilderTrack *midi_builder_track, guint64 absolute_time); /* low-level IO */ void ags_midi_builder_midi_putc(AgsMidiBuilder *midi_builder, gint c); void ags_midi_builder_on_error(AgsMidiBuilder *midi_builder, GError **error); /* channel messages */ void ags_midi_builder_append_header(AgsMidiBuilder *midi_builder, guint offset, guint format, guint track_count, guint division, guint times, guint bpm, guint clicks); void ags_midi_builder_append_track(AgsMidiBuilder *midi_builder, gchar *track_name); void ags_midi_builder_append_key_on(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity); void ags_midi_builder_append_key_off(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint velocity); void ags_midi_builder_append_key_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint audio_channel, guint note, guint pressure); void ags_midi_builder_append_change_parameter(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint control, guint value); void ags_midi_builder_append_change_pitch_bend(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pitch, guint transmitter); void ags_midi_builder_append_change_program(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint program); void ags_midi_builder_append_change_pressure(AgsMidiBuilder *midi_builder, guint delta_time, guint channel, guint pressure); /* sysex and system common */ void ags_midi_builder_append_sysex(AgsMidiBuilder *midi_builder, guint delta_time, guchar *sysex_data, guint length); void ags_midi_builder_append_quarter_frame(AgsMidiBuilder *midi_builder, guint delta_time, guint message_type, guint values); void ags_midi_builder_append_song_position(AgsMidiBuilder *midi_builder, guint delta_time, guint song_position); void ags_midi_builder_append_song_select(AgsMidiBuilder *midi_builder, guint delta_time, guint song_select); void ags_midi_builder_append_tune_request(AgsMidiBuilder *midi_builder, guint delta_time); /* meta events */ void ags_midi_builder_append_sequence_number(AgsMidiBuilder *midi_builder, guint delta_time, guint sequence); void ags_midi_builder_append_smtpe(AgsMidiBuilder *midi_builder, guint delta_time, guint rr, guint hr, guint mn, guint se, guint fr); void ags_midi_builder_append_tempo(AgsMidiBuilder *midi_builder, guint delta_time, guint tempo); void ags_midi_builder_append_time_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint nn, guint dd, guint cc, guint bb); void ags_midi_builder_append_key_signature(AgsMidiBuilder *midi_builder, guint delta_time, guint sf, guint mi); void ags_midi_builder_append_sequencer_meta_event(AgsMidiBuilder *midi_builder, guint delta_time, guint len, guint id, guint data); void ags_midi_builder_append_text_event(AgsMidiBuilder *midi_builder, guint delta_time, gchar *text, guint length); /* */ void ags_midi_builder_append_xml_node(AgsMidiBuilder *midi_builder, xmlNode *node); void ags_midi_builder_from_xml_doc(AgsMidiBuilder *midi_builder, xmlDoc *doc); /* */ void ags_midi_builder_build(AgsMidiBuilder *midi_builder); /* */ AgsMidiBuilder* ags_midi_builder_new(FILE *file); G_END_DECLS #endif /*__AGS_MIDI_BUILDER_H__*/ gsequencer-3.1.3/ags/audio/midi/ags_midi_buffer_util.c0000644000175000017500000014465513607210263017722 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include /** * SECTION:ags_midi_buffer_util * @short_description: MIDI buffer util * @title: AgsMidiBufferUtil * @section_id: * @include: ags/audio/midi/ags_midi_buffer_util.h * * Utility functions for MIDI buffers. */ /** * ags_midi_buffer_util_get_varlength_size: * @varlength: the variable length * * Retrieve the size needed to store the variable length. * * Returns: the size needed to be allocated * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_varlength_size(glong varlength) { guint current; guchar c; guint i; glong mask; /* retrieve new size */ mask = 0x7f; current = 8 * 4 - 4; i = current; for(; current >= 8; ){ if(((mask << (i - 7)) & varlength) != 0){ break; } i -= 7; current -= 8; } return(floor(current / 8.0) + 1); } /** * ags_midi_buffer_util_put_varlength: * @buffer: the character buffer * @varlength: the value to put * * Put the variable lenght value to @buffer. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_varlength(guchar *buffer, glong varlength) { guint varlength_size; guint i, j; glong mask; if(buffer == NULL){ return; } varlength_size = ags_midi_buffer_util_get_varlength_size(varlength); /* write to internal buffer */ mask = 0x7f; j = 0; i = 7 * varlength_size; for(; j < varlength_size; ){ buffer[j] = ((mask << (i - 7)) & varlength) >> (i - 7); if(j + 1 < varlength_size){ buffer[j] |= 0x80; } i -= 7; j++; } } /** * ags_midi_buffer_util_get_varlength: * @buffer: the character buffer * @varlength: the return location * * Get the variable lenght value from @buffer. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_varlength(guchar *buffer, glong *varlength) { glong value; guint i; char c; if(buffer == NULL){ return(0); } c = buffer[0]; value = c; i = 1; if(c & 0x80){ value &= 0x7F; do{ value = (value << 7) + ((c = buffer[i]) & 0x7F); i++; }while(c & 0x80); } if(varlength != NULL){ *varlength = value; } return(i); } /** * ags_midi_buffer_util_put_int16: * @buffer: the character buffer * @val: the integer * * Put signed 16 bit integer. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_int16(guchar *buffer, glong val) { if(buffer == NULL){ return; } buffer[0] = (val & (0xff << 8)) >> 8; buffer[1] = val & 0xff; } /** * ags_midi_buffer_util_get_int16: * @buffer: the character buffer * @val: return location of the integer * * Get signed 32 bit integer. * * Since: 3.0.0 */ void ags_midi_buffer_util_get_int16(guchar *buffer, glong *val) { glong tmp; if(buffer == NULL){ return; } tmp = (buffer[0] & 0xff); tmp = (tmp << 8) + (buffer[1] & 0xff); if(val != NULL){ *val = tmp; } } /** * ags_midi_buffer_util_put_int24: * @buffer: the character buffer * @val: the integer * * Put signed 24 bit integer. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_int24(guchar *buffer, glong val) { if(buffer == NULL){ return; } buffer[0] = (val & (0xff << 16)) >> 16; buffer[1] = (val & (0xff << 8)) >> 8; buffer[2] = val & 0xff; } /** * ags_midi_buffer_util_get_int24: * @buffer: the character buffer * @val: return location of the integer * * Get signed 24 bit integer. * * Since: 3.0.0 */ void ags_midi_buffer_util_get_int24(guchar *buffer, glong *val) { glong tmp; if(buffer == NULL){ return; } tmp = (buffer[0] & 0xff); tmp = (tmp << 8) + (buffer[1] & 0xff); tmp = (tmp << 8) + (buffer[2] & 0xff); if(val != NULL){ *val = tmp; } } /** * ags_midi_buffer_util_put_int32: * @buffer: the character buffer * @val: the integer * * Put signed 32 bit integer. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_int32(guchar *buffer, glong val) { if(buffer == NULL){ return; } buffer[0] = (val & (0xff << 24)) >> 24; buffer[1] = (val & (0xff << 16)) >> 16; buffer[2] = (val & (0xff << 8)) >> 8; buffer[3] = val & 0xff; } /** * ags_midi_buffer_util_get_int32: * @buffer: the character buffer * @val: return location of the integer * * Get signed 32 bit integer. * * Since: 3.0.0 */ void ags_midi_buffer_util_get_int32(guchar *buffer, glong *val) { glong tmp; if(buffer == NULL){ return; } tmp = (buffer[0] & 0xff); tmp = (tmp << 8) + (buffer[1] & 0xff); tmp = (tmp << 8) + (buffer[2] & 0xff); tmp = (tmp << 8) + (buffer[3] & 0xff); if(val != NULL){ *val = tmp; } } /** * ags_midi_buffer_util_put_header: * @buffer: the character buffer * @offset: start delta-time * @format: either 0, 1 or 2. * @track_count: the number of tracks * @division: timing division * * Puts the midi header. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_header(guchar *buffer, glong offset, glong format, glong track_count, glong division) { static gchar header[] = "MThd"; if(buffer == NULL){ return; } /* put MThd */ memcpy(buffer, header, 4 * sizeof(guchar)); /* chunk length */ if(offset != 6){ g_warning("invalid chunk length"); } ags_midi_buffer_util_put_int32(buffer + 4, 6); /* format */ ags_midi_buffer_util_put_int16(buffer + 8, format); /* track count */ ags_midi_buffer_util_put_int16(buffer + 10, track_count); /* division */ ags_midi_buffer_util_put_int16(buffer + 12, division); } /** * ags_midi_buffer_util_get_header: * @buffer: the character buffer * @offset: start delta-time * @format: either 0, 1 or 2. * @track_count: the number of tracks * @division: timing division * * Gets the midi header * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_header(guchar *buffer, glong *offset, glong *format, glong *track_count, glong *division) { static gchar header[] = "MThd"; if(g_ascii_strncasecmp(buffer, header, 4)){ return(0); } /* offset */ ags_midi_buffer_util_get_int32(buffer + 4, offset); /* format */ ags_midi_buffer_util_get_int16(buffer + 8, format); /* track count */ ags_midi_buffer_util_get_int16(buffer + 10, track_count); /* division */ ags_midi_buffer_util_get_int16(buffer + 12, division); return(14); } /** * ags_midi_buffer_util_put_track: * @buffer: the midi buffer * @offset: start delta-time * * Put track. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_track(guchar *buffer, glong offset) { static gchar track[] = "MTrk"; if(buffer == NULL){ return; } /* put MTrk */ memcpy(buffer, track, 4 * sizeof(guchar)); /* offset */ ags_midi_buffer_util_put_int32(buffer + 4, offset); } /** * ags_midi_buffer_util_get_track: * @buffer: the midi buffer * @offset: start delta-time * * Get track * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_track(guchar *buffer, glong *offset) { static gchar track[] = "MTrk"; if(buffer == NULL){ return(0); } if(g_ascii_strncasecmp(buffer, track, 4)){ return(0); } /* offset */ ags_midi_buffer_util_get_int32(buffer + 4, offset); return(8); } /** * ags_midi_buffer_util_put_key_on: * @buffer: the character buffer * @delta_time: timing information * @channel: valid channels from 0-15 * @key: valid keys to play 0-128 * @velocity: the key dynamics * * Puts the given values to @buffer with appropriate channel message. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_key_on(guchar *buffer, glong delta_time, glong channel, glong key, glong velocity) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* key-on channel message */ buffer[delta_time_size] = 0x90 | (channel & 0xf); /* key */ buffer[delta_time_size + 1] = key & 0x7f; /* velocity */ buffer[delta_time_size + 2] = velocity & 0x7f; } /** * ags_midi_buffer_util_get_key_on: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @key: the return location of key * @velocity: the return location of velocity * * Get the key-on message from @buffer. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_key_on(guchar *buffer, glong *delta_time, glong *channel, glong *key, glong *velocity) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* key */ if(key != NULL){ *key = (0x7f & buffer[delta_time_size + 1]); } /* velocity */ if(velocity != NULL){ *velocity = (0x7f & buffer[delta_time_size + 2]); } return(delta_time_size + 3); } /** * ags_midi_buffer_util_put_key_off: * @buffer: the character buffer * @delta_time: timing information * @channel: valid channels from 0-15 * @key: valid keys to play 0-128 * @velocity: the key dynamics * * Puts the given values to @buffer with appropriate channel message. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_key_off(guchar *buffer, glong delta_time, glong channel, glong key, glong velocity) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* key-off channel message */ buffer[delta_time_size] = 0x80; buffer[delta_time_size] |= (channel & 0xf); /* key */ buffer[delta_time_size + 1] = key & 0x7f; /* velocity */ buffer[delta_time_size + 2] = velocity & 0x7f; } /** * ags_midi_buffer_util_get_key_off: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @key: the return location of key * @velocity: the return location of velocity * * Get the key-off message from @buffer. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_key_off(guchar *buffer, glong *delta_time, glong *channel, glong *key, glong *velocity) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* key */ if(key != NULL){ *key = (0x7f & buffer[delta_time_size + 1]); } /* velocity */ if(velocity != NULL){ *velocity = (0x7f & buffer[delta_time_size + 2]); } return(delta_time_size + 3); } /** * ags_midi_buffer_util_put_key_pressure: * @buffer: the character buffer * @delta_time: timing information * @channel: valid channels from 0-15 * @key: valid keys to play 0-128 * @pressure: the key dynamics * * Puts the given values to @buffer with appropriate channel message. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_key_pressure(guchar *buffer, glong delta_time, glong channel, glong key, glong pressure) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* key-pressure channel message */ buffer[delta_time_size] = 0xa0; buffer[delta_time_size] |= (channel & 0xf); /* key */ buffer[delta_time_size + 1] = key & 0x7f; /* pressure */ buffer[delta_time_size + 2] = pressure & 0x7f; } /** * ags_midi_buffer_util_get_key_pressure: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @key: the return location of key * @pressure: the return location of pressure * * Get the key-pressure message from @buffer. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_key_pressure(guchar *buffer, glong *delta_time, glong *channel, glong *key, glong *pressure) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* key */ if(key != NULL){ *key = (0x7f & buffer[delta_time_size + 1]); } /* pressure */ if(pressure != NULL){ *pressure = (0x7f & buffer[delta_time_size + 2]); } return(delta_time_size + 3); } /** * ags_midi_buffer_util_put_change_parameter: * @buffer: the character buffer * @delta_time: timing information * @channel: channel * @control: the control * @value: the value * * Put change parameter. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_change_parameter(guchar *buffer, glong delta_time, glong channel, glong control, glong value) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* change-parameter channel message */ buffer[delta_time_size] = 0xb0; buffer[delta_time_size] |= (channel & 0xf); /* control */ buffer[delta_time_size + 1] = 0x7f & control; /* value */ buffer[delta_time_size + 2] = 0x7f & value; } /** * ags_midi_buffer_util_get_change_parameter: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @control: the return location of the control * @value: the return location the value * * Get change parameter. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_change_parameter(guchar *buffer, glong *delta_time, glong *channel, glong *control, glong *value) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* control */ if(control != NULL){ *control = 0x7f & buffer[delta_time_size + 1]; } /* value */ if(value != NULL){ *value = 0x7f & buffer[delta_time_size + 2]; } return(delta_time_size + 3); } /** * ags_midi_buffer_util_put_pitch_bend: * @buffer: the character buffer * @delta_time: timing information * @channel: channel * @pitch: the pitch * @transmitter: the transmitter * * Put pitch bend. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_pitch_bend(guchar *buffer, glong delta_time, glong channel, glong pitch, glong transmitter) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* pitch-bend channel message */ buffer[delta_time_size] = 0xe0; buffer[delta_time_size] |= (channel & 0xf); /* pitch */ buffer[delta_time_size + 1] = 0x7f & pitch; /* transmitter */ buffer[delta_time_size + 2] = 0x7f & transmitter; } /** * ags_midi_buffer_util_get_pitch_bend: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @pitch: the return location of the pitch * @transmitter: the return location the transmitter * * Get pitch bend. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_pitch_bend(guchar *buffer, glong *delta_time, glong *channel, glong *pitch, glong *transmitter) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* pitch */ if(pitch != NULL){ *pitch = 0x7f & buffer[delta_time_size + 1]; } /* transmitter */ if(transmitter != NULL){ *transmitter = 0x7f & buffer[delta_time_size + 2]; } return(delta_time_size + 3); } /** * ags_midi_buffer_util_put_change_program: * @buffer: the character buffer * @delta_time: timing information * @channel: channel * @program: the program * * Put change program. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_change_program(guchar *buffer, glong delta_time, glong channel, glong program) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* change-parameter channel message */ buffer[delta_time_size] = 0xc0; buffer[delta_time_size] |= (channel & 0xf); /* program */ buffer[delta_time_size + 1] = 0x7f & program; } /** * ags_midi_buffer_util_get_change_program: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @program: the return location of the program * * Get change program. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_change_program(guchar *buffer, glong *delta_time, glong *channel, glong *program) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* program */ if(program != NULL){ *program = 0x7f & buffer[delta_time_size + 1]; } return(delta_time_size + 2); } /** * ags_midi_buffer_util_put_change_pressure: * @buffer: the character buffer * @delta_time: timing information * @channel: channel * @pressure: the pressure * * Put change pressure. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_change_pressure(guchar *buffer, glong delta_time, glong channel, glong pressure) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* change-parameter channel message */ buffer[delta_time_size] = 0xd0; buffer[delta_time_size] |= (channel & 0xf); /* pressure */ buffer[delta_time_size + 1] = 0x7f & pressure; } /** * ags_midi_buffer_util_get_change_pressure: * @buffer: the character buffer * @delta_time: the return location of timing information * @channel: the return location of channel * @pressure: the return location of the pressure * * Get change pressure. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_change_pressure(guchar *buffer, glong *delta_time, glong *channel, glong *pressure) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* channel */ if(channel != NULL){ *channel = (0xf & buffer[delta_time_size]); } /* pressure */ if(pressure != NULL){ *pressure = 0x7f & buffer[delta_time_size + 1]; } return(delta_time_size + 2); } /** * ags_midi_buffer_util_put_sysex: * @buffer: the character buffer * @delta_time: timing information * @data: the data * @length: the data's length * * Put sysex. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_sysex(guchar *buffer, glong delta_time, guchar *data, glong length) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xf0; /* put data */ memcpy(buffer + delta_time_size + 1, data, length * sizeof(guchar)); /* EOX end of sysex */ buffer[delta_time_size + length + 1] = 0xf7; } /** * ags_midi_buffer_util_get_sysex: * @buffer: the character buffer * @delta_time: the return location of timing information * @data: the return location of data * @length: the return location of length * * Get sysex. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_sysex(guchar *buffer, glong *delta_time, guchar **data, glong *length) { guchar *tmp_data; glong val; guint delta_time_size; guint i; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } for(i = 0; buffer[delta_time_size + i + 1] != 0xf7; i++); if(data != NULL){ if(i > 0){ tmp_data = (guchar *) malloc(i * sizeof(guchar)); }else{ tmp_data = NULL; } memcpy(tmp_data, buffer + delta_time_size + 1, i * sizeof(guchar)); *data = tmp_data; } if(length != NULL){ *length = i; } return(delta_time_size + i + 2); } /** * ags_midi_buffer_util_put_quarter_frame: * @buffer: the character buffer * @delta_time: timing information * @message_type: the message type * @values: the values * * Put quarter frame. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_quarter_frame(guchar *buffer, glong delta_time, glong message_type, glong values) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xf1; /* message type */ buffer[delta_time_size + 1] = 0x70 & message_type; /* values */ buffer[delta_time_size + 1] |= 0x0f & values; } /** * ags_midi_buffer_util_get_quarter_frame: * @buffer: the character buffer * @delta_time: the return location of timing information * @message_type: the return location of the message type * @values: the return location of the values * * Get quarter frame. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_quarter_frame(guchar *buffer, glong *delta_time, glong *message_type, glong *values) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } if(message_type != NULL){ *message_type = 0x70 & buffer[delta_time_size + 1]; } if(values != NULL){ *values = 0x0f & buffer[delta_time_size + 1]; } return(delta_time_size + 2); } /** * ags_midi_buffer_util_put_song_position: * @buffer: the character buffer * @delta_time: timing information * @song_position: the song position * * Put song position. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_song_position(guchar *buffer, glong delta_time, glong song_position) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xf2; /* song position */ buffer[delta_time_size + 1] = 0x7f & song_position; buffer[delta_time_size + 2] = 0x7f & (song_position >> 7); } /** * ags_midi_buffer_util_get_song_position: * @buffer: the character buffer * @delta_time: the return location of timing information * @song_position: the return location of the song position * * Get song position. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_song_position(guchar *buffer, glong *delta_time, glong *song_position) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* song position */ if(song_position != NULL){ *song_position = 0x7f & buffer[delta_time_size + 1]; *song_position |= ((0x7f & buffer[delta_time_size + 2]) << 7); } return(delta_time_size + 3); } /** * ags_midi_buffer_util_put_song_select: * @buffer: the character buffer * @delta_time: timing information * @song_select: the song select * * Put song select. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_song_select(guchar *buffer, glong delta_time, glong song_select) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xf3; /* song select */ buffer[delta_time_size + 1] = 0x7f & song_select; } /** * ags_midi_buffer_util_get_song_select: * @buffer: the character buffer * @delta_time: the return location of timing information * @song_select: the return location of the song select * * Get song select. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_song_select(guchar *buffer, glong *delta_time, glong *song_select) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } if(song_select != NULL){ *song_select = 0x7f & buffer[delta_time_size + 1]; } return(delta_time_size + 2); } /** * ags_midi_buffer_util_put_tune_request: * @buffer: the character buffer * @delta_time: timing information * * Put tune request * * Since: 3.0.0 */ void ags_midi_buffer_util_put_tune_request(guchar *buffer, glong delta_time) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xf6; } /** * ags_midi_buffer_util_get_tune_request: * @buffer: the character buffer * @delta_time: the return location of timing information * * Get tune request. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_tune_request(guchar *buffer, glong *delta_time) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } return(delta_time_size + 1); } /** * ags_midi_buffer_util_put_sequence_number: * @buffer: the character buffer * @delta_time: timing information * @sequence: the sequence * * Put sequence number. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_sequence_number(guchar *buffer, glong delta_time, glong sequence) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x00; /* length */ buffer[delta_time_size + 2] = 2; /* data */ buffer[delta_time_size + 3] = ((0xff00 & sequence) >> 8); buffer[delta_time_size + 4] = 0xff & sequence; } /** * ags_midi_buffer_util_get_sequence_number: * @buffer: the character buffer * @delta_time: the return location of timing information * @sequence: the return location of the sequence * * Get sequence number. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_sequence_number(guchar *buffer, glong *delta_time, glong *sequence) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* sequence */ if(sequence != NULL){ *sequence = buffer[delta_time_size + 3] << 8; *sequence |= buffer[delta_time_size + 4]; } return(delta_time_size + 5); } /** * ags_midi_buffer_util_put_smtpe: * @buffer: the character buffer * @delta_time: timing information * @rr: frame rate * @hr: hour * @mn: minute * @se: second * @fr: frame number * * Put smtpe timestamp. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_smtpe(guchar *buffer, glong delta_time, glong rr, glong hr, glong mn, glong se, glong fr) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x54; /* length */ buffer[delta_time_size + 2] = 5; /* rr */ buffer[delta_time_size + 3] = rr; /* hr */ buffer[delta_time_size + 3] |= hr; /* mn */ buffer[delta_time_size + 4] = mn; /* se */ buffer[delta_time_size + 5] = se; /* fr */ buffer[delta_time_size + 6] = fr; } /** * ags_midi_buffer_util_get_smtpe: * @buffer: the character buffer * @delta_time: the return location of timing information * @rr: the return location of frame rate * @hr: the return location of hour * @mn: the return location of minute * @se: the return location of second * @fr: the return location of frame number * * Get smtpe timestamp. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_smtpe(guchar *buffer, glong *delta_time, glong *rr, glong *hr, glong *mn, glong *se, glong *fr) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* rr */ if(rr != NULL){ *rr = 0xc0 & buffer[delta_time_size + 3]; } /* hr */ if(hr != NULL){ *hr = 0x3f & buffer[delta_time_size + 3]; } /* mn */ if(mn != NULL){ *mn = buffer[delta_time_size + 4]; } /* se */ if(se != NULL){ *se = buffer[delta_time_size + 5]; } /* fr */ if(fr != NULL){ *fr = buffer[delta_time_size + 6]; } return(delta_time_size + 7); } /** * ags_midi_buffer_util_put_tempo: * @buffer: the character buffer * @delta_time: timing information * @tempo: the tempo * * Put tempo. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_tempo(guchar *buffer, glong delta_time, glong tempo) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x51; /* length */ buffer[delta_time_size + 2] = 0x03; /* tempo */ ags_midi_buffer_util_put_int24(buffer + delta_time_size + 3, tempo); } /** * ags_midi_buffer_util_get_tempo: * @buffer: the character buffer * @delta_time: the return location of timing information * @tempo: the tempo * * Get tempo. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_tempo(guchar *buffer, glong *delta_time, glong *tempo) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* tempo */ ags_midi_buffer_util_get_int24(buffer + delta_time_size + 3, tempo); return(delta_time_size + 6); } /** * ags_midi_buffer_util_put_time_signature: * @buffer: the character buffer * @delta_time: timing information * @nn: numerator * @dd: denominator * @cc: clocks * @bb: beats * * Put time signature * * Since: 3.0.0 */ void ags_midi_buffer_util_put_time_signature(guchar *buffer, glong delta_time, glong nn, glong dd, glong cc, glong bb) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x58; /* length */ buffer[delta_time_size + 2] = 0x4; /* nn */ buffer[delta_time_size + 3] = nn; /* dd */ buffer[delta_time_size + 4] = dd; /* cc */ buffer[delta_time_size + 5] = cc; /* bb */ buffer[delta_time_size + 6] = bb; } /** * ags_midi_buffer_util_get_time_signature: * @buffer: the character buffer * @delta_time: the return location of timing information * @nn: the return location of numerator * @dd: the return location of denominator * @cc: the return location of clocks * @bb: the return location of beats * * Get time signature. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_time_signature(guchar *buffer, glong *delta_time, glong *nn, glong *dd, glong *cc, glong *bb) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* nn */ if(nn != NULL){ *nn = buffer[delta_time_size + 3]; } /* dd */ if(dd != NULL){ *dd = buffer[delta_time_size + 4]; } /* cc */ if(cc != NULL){ *cc = buffer[delta_time_size + 5]; } /* bb */ if(bb != NULL){ *bb = buffer[delta_time_size + 6]; } return(delta_time_size + 7); } /** * ags_midi_buffer_util_put_key_signature: * @buffer: the character buffer * @delta_time: timing information * @sf: flats or sharps * @mi: 1 equals minor or 0 means major * * Put key signature. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_key_signature(guchar *buffer, glong delta_time, glong sf, glong mi) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x59; /* length */ buffer[delta_time_size + 2] = 2; /* sf */ buffer[delta_time_size + 3] = sf; /* mi */ buffer[delta_time_size + 4] = mi; } /** * ags_midi_buffer_util_get_key_signature: * @buffer: the character buffer * @delta_time: the return location of timing information * @sf: the return location of flats or sharps * @mi: the return location of minor or major * * Get key signature. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_key_signature(guchar *buffer, glong *delta_time, glong *sf, glong *mi) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* sf */ if(sf != NULL){ *sf = buffer[delta_time_size + 3]; } /* mi */ if(mi != NULL){ *mi = buffer[delta_time_size + 4]; } return(delta_time_size + 5); } /** * ags_midi_buffer_util_put_sequencer_meta_event: * @buffer: the character buffer * @delta_time: timing information * @len: the length of data * @id: the manufacturer id * @data: the data * * Put sequencer meta event. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_sequencer_meta_event(guchar *buffer, glong delta_time, glong len, glong id, glong data) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x7f; /* length */ buffer[delta_time_size + 2] = 0xff & len; /* id */ buffer[delta_time_size + 3] = 0xff & id; /* data */ switch(len){ case 3: { buffer[delta_time_size + 6] = ((0xff << 16) & data) >> 16; } case 2: { buffer[delta_time_size + 4] = 0xff & data; buffer[delta_time_size + 5] = ((0xff << 8) & data) >> 8; } } } /** * ags_midi_buffer_util_get_sequencer_meta_event: * @buffer: the character buffer * @delta_time: the return location of timing information * @len: the return location of the length of data * @id: the return location of the manufacturer id * @data: the return location of the data * * Get sequencer meta event. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_sequencer_meta_event(guchar *buffer, glong *delta_time, glong *len, glong *id, glong *data) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } if(len != NULL){ len[0] = buffer[delta_time_size + 2]; } if(id != NULL){ *id = buffer[delta_time_size + 3]; } if(data != NULL){ *data = 0; switch(buffer[delta_time_size + 2]){ case 3: { *data |= (buffer[delta_time_size + 6] << 16); } case 2: { *data |= buffer[delta_time_size + 4]; *data |= (buffer[delta_time_size + 5] << 8); } } } return(delta_time_size + buffer[delta_time_size + 2] + 3); } /** * ags_midi_buffer_util_put_text_event: * @buffer: the character buffer * @delta_time: timing information * @text: the text * @length: the length * * Put text event. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_text_event(guchar *buffer, glong delta_time, gchar *text, glong length) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x01; /* length */ buffer[delta_time_size + 2] = 0xff & length; /* text */ memcpy(buffer + delta_time_size + 3, text, length * sizeof(guchar)); } /** * ags_midi_buffer_util_get_text_event: * @buffer: the character buffer * @delta_time: the return location of timing information * @text: the return location of the text * @length: the return location of the length * * Get text event. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_text_event(guchar *buffer, glong *delta_time, gchar **text, glong *length) { glong val; guint text_size; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } /* length */ text_size = 0x7f & buffer[delta_time_size + 2]; if(length != NULL){ *length = text_size; } /* text */ if(text != NULL){ text[0] = (gchar *) malloc(text_size * sizeof(gchar)); memcpy(text[0], buffer + delta_time_size + 3, text_size * sizeof(gchar)); } return(delta_time_size + text_size + 3); } /** * ags_midi_buffer_util_put_end_of_track: * @buffer: the character buffer * @delta_time: timing information * * Put end of track. * * Since: 3.0.0 */ void ags_midi_buffer_util_put_end_of_track(guchar *buffer, glong delta_time) { guint delta_time_size; if(buffer == NULL){ return; } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength_size(delta_time); ags_midi_buffer_util_put_varlength(buffer, delta_time); /* status byte */ buffer[delta_time_size] = 0xff; /* type */ buffer[delta_time_size + 1] = 0x2f; /* length */ buffer[delta_time_size + 2] = 0; } /** * ags_midi_buffer_util_get_end_of_track: * @buffer: the character buffer * @delta_time: the return location of timing information * * Get end of track. * * Returns: the number of bytes read. * * Since: 3.0.0 */ guint ags_midi_buffer_util_get_end_of_track(guchar *buffer, glong *delta_time) { glong val; guint delta_time_size; if(buffer == NULL){ return(0); } /* delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(buffer, &val); if(delta_time != NULL){ *delta_time = val; } return(delta_time_size + 3); } /** * ags_midi_buffer_util_seek_message: * @buffer: the buffer to seek * @message_count: seek count messages * @delta_time: the return location of current delta time * * Seek MIDI messages from @buffer * * Returns: the buffer at offset at @message_count ahead * * Since: 3.0.0 */ guchar* ags_midi_buffer_util_seek_message(guchar *buffer, guint message_count, glong *delta_time) { static gchar header[] = "MThd"; static gchar track[] = "MTrk"; guchar *offset; glong current_delta_time; glong next_delta_time; guint delta_time_size; guchar status, prev_status; guchar meta_type; guint n; guint i; gboolean initial_run; if(buffer == NULL){ return(NULL); } offset = buffer; /* check for header */ if(!g_ascii_strncasecmp(offset, header, 4)){ offset += 14; } /* seek message count */ current_delta_time = 0; initial_run = TRUE; prev_status = 0; for(i = 0; i < message_count; i++){ /* check for track */ if(initial_run){ if(!g_ascii_strncasecmp(offset, track, 4)){ offset += 8; } initial_run = FALSE; } /* read delta time */ delta_time_size = ags_midi_buffer_util_get_varlength(offset, ¤t_delta_time); /* read status byte */ status = offset[delta_time_size]; n = 1; ags_midi_buffer_util_seek_message_REPEAT_STATUS: if((0xf0 & status) != 0xf0){ switch(status & 0xf0){ case 0x80: { n += delta_time_size + 2; prev_status = status; } break; case 0x90: { n += delta_time_size + 2; prev_status = status; } break; case 0xa0: { n += delta_time_size + 2; prev_status = status; } break; case 0xb0: { n += delta_time_size + 2; prev_status = status; } break; case 0xc0: { n += delta_time_size + 1; prev_status = status; } break; case 0xd0: { n += delta_time_size + 1; prev_status = status; } break; case 0xe0: { n += delta_time_size + 2; prev_status = status; } break; default: { #ifdef AGS_DEBUG g_message("repeat status=0x%x", prev_status); #endif status = prev_status; goto ags_midi_buffer_util_seek_message_REPEAT_STATUS; } } offset += n; /* check if status is omitted */ delta_time_size = ags_midi_buffer_util_get_varlength(offset, &next_delta_time); if((0xf0 & offset[delta_time_size]) != 0xf0){ switch(status & 0xf0){ case 0x80: case 0x90: case 0xa0: case 0xb0: case 0xc0: case 0xd0: case 0xe0: break; default: { n = 0; current_delta_time = next_delta_time; goto ags_midi_buffer_util_seek_message_REPEAT_STATUS; } } } }else{ status = offset[delta_time_size]; switch(status){ case 0xf0: { /* start of system exclusive */ n = ags_midi_buffer_util_get_sysex(offset, NULL, NULL, NULL); offset += n; } break; case 0xf1: { /* quarter frame */ n = ags_midi_buffer_util_get_quarter_frame(offset, NULL, NULL, NULL); offset += n; } break; case 0xf2: { /* song position */ n = ags_midi_buffer_util_get_song_position(offset, NULL, NULL); offset += n; } break; case 0xf3: { /* song select */ n = ags_midi_buffer_util_get_song_select(offset, NULL, NULL); offset += n; } break; case 0xf4: case 0xf5: { #ifdef AGS_DEBUG g_message("undefined"); #endif offset += delta_time_size; } break; case 0xf6: { /* tune request */ n = ags_midi_buffer_util_get_tune_request(offset, NULL); offset += n; } break; case 0xf7: { /* sysex continuation or arbitrary stuff */ #ifdef AGS_DEBUG g_message("sysex end"); #endif } break; case 0xff: { guint meta_type; meta_type = offset[delta_time_size + 1]; switch(meta_type){ case 0x00: { int c; // c = offset[delta_time_size + 1]; // if(c == 0x02){ n = ags_midi_buffer_util_get_sequence_number(offset, NULL, NULL); offset += n; // } } break; case 0x01: /* Text event */ case 0x02: /* Copyright notice */ case 0x03: /* Sequence/Track name */ case 0x04: /* Instrument name */ case 0x05: /* Lyric */ case 0x06: /* Marker */ case 0x07: /* Cue point */ case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: { /* These are all text events */ n = ags_midi_buffer_util_get_text_event(offset, NULL, NULL, NULL); offset += n; } break; case 0x2f: { int c; // c = buffer[delta_time_size]; // if(c == 0x0){ /* End of Track */ n = ags_midi_buffer_util_get_end_of_track(offset, NULL); offset = NULL; } break; case 0x51: { int c; // c = offset[delta_time_size]; // if(c == 0x03){ /* Set tempo */ n = ags_midi_buffer_util_get_tempo(offset, NULL, NULL); offset += n; // } } break; case 0x54: { int c; c = offset[delta_time_size]; // if(c == 0x05){ n = ags_midi_buffer_util_get_smtpe(offset, NULL, NULL, NULL, NULL, NULL, NULL); offset += n; // } } break; case 0x58: { int c; // c = ags_midi_parser_midi_getc(midi_parser); n = ags_midi_buffer_util_get_time_signature(offset, NULL, NULL, NULL, NULL, NULL); offset += n; // if(c == 0x04){ // } } break; case 0x59: { int c; // c = offset[delta_time_size]; // if(c == 0x02){ n = ags_midi_buffer_util_get_key_signature(offset, NULL, NULL, NULL); offset += n; // } } break; case 0x7f: { n = ags_midi_buffer_util_get_sequencer_meta_event(NULL, NULL, NULL, NULL, NULL); offset += n; } break; default: offset += 5; } } break; default: g_warning("bad byte"); } } } if(delta_time != NULL){ *delta_time = current_delta_time; } return(offset); } /** * ags_midi_buffer_util_decode: * @buffer: the midi buffer * @event: the ALSA sequencer event * * Decode @event to @buffer * * Returns: the bytes written * * Since: 3.0.0 */ guint ags_midi_buffer_util_decode(guchar *buffer, snd_seq_event_t *event) { guint count; if(buffer == NULL || event == NULL){ return(0); } count = 0; switch(event->type){ case SND_SEQ_EVENT_NOTEON: { guchar tmp[8]; ags_midi_buffer_util_put_key_on(tmp, 0, event->data.note.channel, event->data.note.note, event->data.note.velocity); count = ags_midi_buffer_util_get_varlength_size(0); memcpy(buffer, tmp + count, 3 * sizeof(guchar)); count = 3; } break; case SND_SEQ_EVENT_NOTEOFF: { guchar tmp[8]; ags_midi_buffer_util_put_key_off(tmp, 0, event->data.note.channel, event->data.note.note, event->data.note.velocity); count = ags_midi_buffer_util_get_varlength_size(0); memcpy(buffer, tmp + count, 3 * sizeof(guchar)); count = 3; } break; default: g_warning("ags_midi_buffer_util_decode() - unsupported MIDI event"); break; } return(count); } gsequencer-3.1.3/ags/audio/midi/ags_midi_util.c0000644000175000017500000003241713607210263016361 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include unsigned char* ags_midi_util_to_smf_realloc(unsigned char *smf_buffer, guint smf_buffer_length); /** * SECTION:ags_midi_util * @short_description: MIDI util * @title: AgsMidiUtil * @section_id: * @include: ags/audio/midi/ags_midi_util.h * * Utility functions for MIDI. */ /** * ags_midi_util_is_key_on: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_key_on(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0x90) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_key_off: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_key_off(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0x80) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_key_pressure: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_key_pressure(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0xa0) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_change_parameter: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_change_parameter(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0xb0) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_pitch_bend: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_pitch_bend(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0xe0) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_change_program: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_change_program(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0xc0) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_change_pressure: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_change_pressure(unsigned char *buffer) { gboolean retval; retval = ((0xf0 & buffer[0]) == 0xd0) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_sysex: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_sysex(unsigned char *buffer) { gboolean retval; retval = ((0xff & buffer[0]) == 0xf0) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_quarter_frame: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_quarter_frame(unsigned char *buffer) { gboolean retval; retval = ((0xff & buffer[0]) == 0xf1) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_song_position: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_song_position(unsigned char *buffer) { gboolean retval; retval = ((0xff & buffer[0]) == 0xf2) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_song_select: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_song_select(unsigned char *buffer) { gboolean retval; retval = ((0xff & buffer[0]) == 0xf3) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_tune_request: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_tune_request(unsigned char *buffer) { gboolean retval; retval = ((0xff & buffer[0]) == 0xf6) ? TRUE: FALSE; return(retval); } /** * ags_midi_util_is_meta_event: * @buffer: the midi buffer * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_midi_util_is_meta_event(unsigned char *buffer) { gboolean retval; retval = ((0xff & buffer[0]) == 0xff) ? TRUE: FALSE; return(retval); } unsigned char* ags_midi_util_to_smf_realloc(unsigned char *smf_buffer, guint smf_buffer_length) { if(smf_buffer == NULL){ smf_buffer = (unsigned char *) malloc(smf_buffer_length * sizeof(unsigned char)); }else{ smf_buffer = (unsigned char *) realloc(smf_buffer, smf_buffer_length * sizeof(unsigned char)); } return(smf_buffer); } /** * ags_midi_util_to_smf: * @midi_buffer: the midi buffer * @buffer_length: the buffer length * @delta_time: the delta time * @smf_buffer_length: the return location of resulting length * * Convert real-time MIDI to SMF. * * Returns: the SMF buffer * * Since: 3.0.0 */ unsigned char* ags_midi_util_to_smf(unsigned char *midi_buffer, guint buffer_length, glong delta_time, guint *smf_buffer_length) { unsigned char *midi_iter; unsigned char *smf_buffer; guint ret_smf_buffer_length; if(midi_buffer == NULL){ return(NULL); } smf_buffer = NULL; ret_smf_buffer_length = 0; /* parse bytes */ midi_iter = midi_buffer; while(midi_iter < midi_buffer + buffer_length){ if(ags_midi_util_is_key_on(midi_iter)){ /* key on */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_key_on(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1], 0x7f & midi_iter[2]); midi_iter += 3; }else if(ags_midi_util_is_key_off(midi_iter)){ /* key off */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_key_off(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1], 0x7f & midi_iter[2]); midi_iter += 3; }else if(ags_midi_util_is_key_pressure(midi_iter)){ /* key pressure */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_key_pressure(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1], 0x7f & midi_iter[2]); midi_iter += 3; }else if(ags_midi_util_is_change_parameter(midi_iter)){ /* change parameter */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_change_parameter(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1], 0x7f & midi_iter[2]); midi_iter += 3; }else if(ags_midi_util_is_pitch_bend(midi_iter)){ /* pitch bend */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_pitch_bend(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1], 0x7f & midi_iter[2]); midi_iter += 3; }else if(ags_midi_util_is_change_program(midi_iter)){ /* change program */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 2); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_change_program(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1]); midi_iter += 2; }else if(ags_midi_util_is_change_pressure(midi_iter)){ /* change pressure */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 2); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_change_pressure(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1]); midi_iter += 2; }else if(ags_midi_util_is_sysex(midi_iter)){ guint n; /* sysex */ n = 1; while(midi_iter[n] != 0xf7){ n++; } ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_sysex(smf_buffer, delta_time, &(midi_iter[1]), n); midi_iter += (n + 2); }else if(ags_midi_util_is_song_position(midi_iter)){ /* song position */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_song_position(smf_buffer, delta_time, ((0x7f & midi_iter[0]) | ((0x7f & midi_iter[1]) << 7))); midi_iter += 3; }else if(ags_midi_util_is_song_select(midi_iter)){ /* song select */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_change_program(smf_buffer, delta_time, 0xf & midi_iter[0], 0x7f & midi_iter[1]); midi_iter += 2; }else if(ags_midi_util_is_tune_request(midi_iter)){ /* tune request */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); ags_midi_buffer_util_put_tune_request(smf_buffer, delta_time); midi_iter += 1; }else if(ags_midi_util_is_meta_event(midi_iter)){ /* meta event */ ret_smf_buffer_length += (ags_midi_buffer_util_get_varlength_size(delta_time) + 3); smf_buffer = ags_midi_util_to_smf_realloc(smf_buffer, ret_smf_buffer_length); if(midi_iter[1] == 0x01){ ags_midi_buffer_util_put_text_event(smf_buffer, delta_time, midi_iter + 3, 0xff & midi_iter[2]); }else if(midi_iter[1] == 0x7f){ if(midi_iter[2] == 3){ ags_midi_buffer_util_put_sequencer_meta_event(smf_buffer, delta_time, midi_iter[2], midi_iter[3], ((midi_iter[4]) | ((midi_iter[5]) << 8)) | ((midi_iter[5]) << 16)); }else if(midi_iter[2] == 2){ ags_midi_buffer_util_put_sequencer_meta_event(smf_buffer, delta_time, midi_iter[2], midi_iter[3], ((midi_iter[4]) | ((midi_iter[5]) << 8))); } } midi_iter += (3 + midi_iter[2]); }else{ g_warning("ags_midi_util.c - unexpected byte %x", midi_iter[0]); midi_iter++; } } return(smf_buffer); } /** * ags_midi_util_delta_time_to_offset: * @delay_factor: delay factor * @division: division * @tempo: tempo * @bpm: bpm * @delta_time: delta time * * Delta time to offset * * Returns: the offset * * Since: 3.0.0 */ guint ags_midi_util_delta_time_to_offset(gdouble delay_factor, glong division, glong tempo, glong bpm, glong delta_time) { guint offset; if(((1 << 15) & division) == 0){ /* ticks per quarter note */ offset = (16.0 * bpm / 60.0) * delta_time * (tempo / division / ((gdouble) AGS_USEC_PER_SEC)) * delay_factor; }else{ /* SMTPE */ offset = (16.0 * bpm / 60.0) * delta_time / (((division * division) / 256.0) / ((gdouble) AGS_USEC_PER_SEC)) * delay_factor; } return(offset); } /** * ags_midi_util_offset_to_delta_time: * @delay_factor: delay factor * @division: division * @tempo: tempo * @bpm: bpm * @x: note offset * * Offset to delta time * * Returns: the delta time * * Since: 3.0.0 */ glong ags_midi_util_offset_to_delta_time(gdouble delay_factor, glong division, glong tempo, glong bpm, guint x) { guint delta_time; if(((1 << 15) & division) == 0){ /* ticks per quarter note */ delta_time = (60.0 * AGS_USEC_PER_SEC * division * x) / (16.0 * bpm * delay_factor * tempo); }else{ /* SMTPE */ delta_time = (60.0 * (((division * division) / 256.0) / ((gdouble) AGS_USEC_PER_SEC)) * x) / (16.0 * bpm * delay_factor * tempo); } return(delta_time); } gsequencer-3.1.3/ags/audio/midi/ags_midi_file.dtd0000644000175000017500000000433313461636433016661 00000000000000 gsequencer-3.1.3/ags/audio/midi/ags_midi_buffer_util.h0000644000175000017500000002162313607210263017714 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_BUFFER_UTIL_H__ #define __AGS_MIDI_BUFFER_UTIL_H__ #include #include #include #include G_BEGIN_DECLS typedef enum{ AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_LSB = 0x0, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_FRAME_NUMBER_MSB = 0x10, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_LSB = 0x20, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_SECONDS_MSB = 0x30, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_LSB = 0x40, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_MINUTES_MSB = 0x50, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_LSB = 0x60, AGS_MIDI_BUFFER_UTIL_MTC_QUARTER_FRAME_HOURS_MSB = 0x70, }AgsMidiBufferUtilMtcQuarterFrameMessageType; typedef enum{ AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_24_FPS = 0x0, AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_25_FPS = 0x40, AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS = 0x80, AGS_MIDI_BUFFER_UTIL_SMTPE_FRAME_RATE_30_FPS_DROP_FRAME = 0xc0, }AgsMidiBufferUtilSmtpeFrameRate; /* varlength */ guint ags_midi_buffer_util_get_varlength_size(glong varlength); void ags_midi_buffer_util_put_varlength(guchar *buffer, glong varlength); guint ags_midi_buffer_util_get_varlength(guchar *buffer, glong *varlength); /* integer - 2 bytes */ void ags_midi_buffer_util_put_int16(guchar *buffer, glong val); void ags_midi_buffer_util_get_int16(guchar *buffer, glong *val); /* integer - 3 bytes */ void ags_midi_buffer_util_put_int24(guchar *buffer, glong val); void ags_midi_buffer_util_get_int24(guchar *buffer, glong *val); /* integer - 4 bytes */ void ags_midi_buffer_util_put_int32(guchar *buffer, glong val); void ags_midi_buffer_util_get_int32(guchar *buffer, glong *val); /* channel message */ /* midi header */ void ags_midi_buffer_util_put_header(guchar *buffer, glong offset, glong format, glong track_count, glong division); guint ags_midi_buffer_util_get_header(guchar *buffer, glong *offset, glong *format, glong *track_count, glong *division); /* midi track */ void ags_midi_buffer_util_put_track(guchar *buffer, glong offset); guint ags_midi_buffer_util_get_track(guchar *buffer, glong *offset); /* key on */ void ags_midi_buffer_util_put_key_on(guchar *buffer, glong delta_time, glong channel, glong key, glong velocity); guint ags_midi_buffer_util_get_key_on(guchar *buffer, glong *delta_time, glong *channel, glong *key, glong *velocity); /* key off */ void ags_midi_buffer_util_put_key_off(guchar *buffer, glong delta_time, glong channel, glong key, glong velocity); guint ags_midi_buffer_util_get_key_off(guchar *buffer, glong *delta_time, glong *channel, glong *key, glong *velocity); /* key pressure */ void ags_midi_buffer_util_put_key_pressure(guchar *buffer, glong delta_time, glong channel, glong key, glong pressure); guint ags_midi_buffer_util_get_key_pressure(guchar *buffer, glong *delta_time, glong *channel, glong *key, glong *pressure); /* change parameter */ void ags_midi_buffer_util_put_change_parameter(guchar *buffer, glong delta_time, glong channel, glong control, glong value); guint ags_midi_buffer_util_get_change_parameter(guchar *buffer, glong *delta_time, glong *channel, glong *control, glong *value); /* pitch bend */ void ags_midi_buffer_util_put_pitch_bend(guchar *buffer, glong delta_time, glong channel, glong pitch, glong transmitter); guint ags_midi_buffer_util_get_pitch_bend(guchar *buffer, glong *delta_time, glong *channel, glong *pitch, glong *transmitter); /* change program */ void ags_midi_buffer_util_put_change_program(guchar *buffer, glong delta_time, glong channel, glong program); guint ags_midi_buffer_util_get_change_program(guchar *buffer, glong *delta_time, glong *channel, glong *program); /* change pressure */ void ags_midi_buffer_util_put_change_pressure(guchar *buffer, glong delta_time, glong channel, glong pressure); guint ags_midi_buffer_util_get_change_pressure(guchar *buffer, glong *delta_time, glong *channel, glong *pressure); /* sysex and system common */ /* sysex */ void ags_midi_buffer_util_put_sysex(guchar *buffer, glong delta_time, guchar *data, glong length); guint ags_midi_buffer_util_get_sysex(guchar *buffer, glong *delta_time, guchar **data, glong *length); /* quarter frame */ void ags_midi_buffer_util_put_quarter_frame(guchar *buffer, glong delta_time, glong message_type, glong values); guint ags_midi_buffer_util_get_quarter_frame(guchar *buffer, glong *delta_time, glong *message_type, glong *values); /* song position */ void ags_midi_buffer_util_put_song_position(guchar *buffer, glong delta_time, glong song_position); guint ags_midi_buffer_util_get_song_position(guchar *buffer, glong *delta_time, glong *song_position); /* song select */ void ags_midi_buffer_util_put_song_select(guchar *buffer, glong delta_time, glong song_select); guint ags_midi_buffer_util_get_song_select(guchar *buffer, glong *delta_time, glong *song_select); /* tune request */ void ags_midi_buffer_util_put_tune_request(guchar *buffer, glong delta_time); guint ags_midi_buffer_util_get_tune_request(guchar *buffer, glong *delta_time); /* meta event */ /* sequence number */ void ags_midi_buffer_util_put_sequence_number(guchar *buffer, glong delta_time, glong sequence); guint ags_midi_buffer_util_get_sequence_number(guchar *buffer, glong *delta_time, glong *sequence); /* smtpe */ void ags_midi_buffer_util_put_smtpe(guchar *buffer, glong delta_time, glong rr, glong hr, glong mn, glong se, glong fr); guint ags_midi_buffer_util_get_smtpe(guchar *buffer, glong *delta_time, glong *rr, glong *hr, glong *mn, glong *se, glong *fr); /* tempo */ void ags_midi_buffer_util_put_tempo(guchar *buffer, glong delta_time, glong tempo); guint ags_midi_buffer_util_get_tempo(guchar *buffer, glong *delta_time, glong *tempo); /* time signature */ void ags_midi_buffer_util_put_time_signature(guchar *buffer, glong delta_time, glong nn, glong dd, glong cc, glong bb); guint ags_midi_buffer_util_get_time_signature(guchar *buffer, glong *delta_time, glong *nn, glong *dd, glong *cc, glong *bb); /* key signature */ void ags_midi_buffer_util_put_key_signature(guchar *buffer, glong delta_time, glong sf, glong mi); guint ags_midi_buffer_util_get_key_signature(guchar *buffer, glong *delta_time, glong *sf, glong *mi); /* sequencer meta event */ void ags_midi_buffer_util_put_sequencer_meta_event(guchar *buffer, glong delta_time, glong len, glong id, glong data); guint ags_midi_buffer_util_get_sequencer_meta_event(guchar *buffer, glong *delta_time, glong *len, glong *id, glong *data); /* text event */ void ags_midi_buffer_util_put_text_event(guchar *buffer, glong delta_time, gchar *text, glong length); guint ags_midi_buffer_util_get_text_event(guchar *buffer, glong *delta_time, gchar **text, glong *length); /* end of track */ void ags_midi_buffer_util_put_end_of_track(guchar *buffer, glong delta_time); guint ags_midi_buffer_util_get_end_of_track(guchar *buffer, glong *delta_time); /* seek */ guchar* ags_midi_buffer_util_seek_message(guchar *buffer, guint message_count, glong *delta_time); /* ALSA sequencer */ /* decode */ guint ags_midi_buffer_util_decode(guchar *buffer, snd_seq_event_t *event); G_END_DECLS #endif /*__AGS_MIDI_BUFFER_UTIL_H__*/ gsequencer-3.1.3/ags/audio/midi/ags_midi_file.h0000644000175000017500000001372013607210263016324 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_FILE_H__ #define __AGS_MIDI_FILE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI_FILE (ags_midi_file_get_type ()) #define AGS_MIDI_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI_FILE, AgsMidiFile)) #define AGS_MIDI_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI_FILE, AgsMidiFileClass)) #define AGS_IS_MIDI_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDI_FILE)) #define AGS_IS_MIDI_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDI_FILE)) #define AGS_MIDI_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_MIDI_FILE, AgsMidiFileClass)) #define AGS_MIDI_FILE_GET_OBJ_MUTEX(obj) (&(((AgsMidiFile *) obj)->obj_mutex)) #define AGS_MIDI_FILE_TRACK(ptr) ((AgsMidiFileTrack *)(ptr)) #define AGS_MIDI_FILE_MAX_TEXT_LENGTH (4096) #define AGS_MIDI_FILE_MTHD "MThd" #define AGS_MIDI_FILE_MTRK "MTrk" #define AGS_MIDI_FILE_DEFAULT_OFFSET (0) #define AGS_MIDI_FILE_DEFAULT_FORMAT (1) #define AGS_MIDI_FILE_DEFAULT_BEATS (120) #define AGS_MIDI_FILE_DEFAULT_FPS (30) #define AGS_MIDI_FILE_DEFAULT_TICKS (384) typedef struct _AgsMidiFile AgsMidiFile; typedef struct _AgsMidiFileClass AgsMidiFileClass; typedef struct _AgsMidiFileTrack AgsMidiFileTrack; typedef enum{ /* channel messages */ AGS_MIDI_FILE_KEY_OFF = 0x80, AGS_MIDI_FILE_KEY_ON = 0x90, AGS_MIDI_FILE_KEY_PRESSURE = 0xa0, AGS_MIDI_FILE_CHANGE_PARAMETER = 0xb0, AGS_MIDI_FILE_CHANGE_PROGRAM = 0xc0, AGS_MIDI_FILE_CHANNEL_PRESSURE = 0xd0, AGS_MIDI_FILE_CHANGE_PITCH_BEND = 0xe0, /* status messages */ AGS_MIDI_FILE_SYSEX = 0xf0, AGS_MIDI_FILE_QUARTER_FRAME = 0xf1, AGS_MIDI_FILE_SONG_POSITION = 0xf2, AGS_MIDI_FILE_SONG_SELECT = 0xf3, AGS_MIDI_FILE_UNDEFINED_0 = 0xf4, AGS_MIDI_FILE_UNDEFINED_1 = 0xf5, AGS_MIDI_FILE_TUNE_REQUEST = 0xf6, AGS_MIDI_FILE_SYSEX_END = 0xf7, AGS_MIDI_FILE_META_EVENT = 0xff, }AgsMidiFileStatus; typedef enum{ AGS_MIDI_FILE_EOF = 1, AGS_MIDI_FILE_SMTPE = 1 << 1, AGS_MIDI_FILE_DROP_FRAME = 1 << 2, }AgsMidiFileFlags; #define AGS_MIDI_FILE_ERROR (ags_midi_file_error_quark()) typedef enum{ AGS_MIDI_FILE_ERROR_PREMATURE_EOF, }AgsMidiFileError; struct _AgsMidiFile { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *filename; FILE *file; unsigned char *buffer; guint buffer_length; unsigned char *iter; guint offset; guint format; guint count; guint division; guint times; guint beat; guint clicks; GList *track; AgsMidiFileTrack *current_track; GList *notation; GList *midi; }; struct _AgsMidiFileClass { GObjectClass gobject; }; struct _AgsMidiFileTrack { GObject *sequencer; gchar *track_name; unsigned char *buffer; }; GType ags_midi_file_get_type(void); GQuark ags_midi_file_error_quark(); gboolean ags_midi_file_open(AgsMidiFile *midi_file, gchar *filename); gboolean ags_midi_file_open_from_data(AgsMidiFile *midi_file, unsigned char *data, guint buffer_length); gboolean ags_midi_file_rw_open(AgsMidiFile *midi_file, gchar *filename, gboolean create); void ags_midi_file_close(AgsMidiFile *midi_file); unsigned char* ags_midi_file_read(AgsMidiFile *midi_file); void ags_midi_file_write(AgsMidiFile *midi_file, unsigned char *data, guint buffer_length); void ags_midi_file_seek(AgsMidiFile *midi_file, guint position, gint whence); void ags_midi_file_flush(AgsMidiFile *midi_file); unsigned char ags_midi_file_read_byte(AgsMidiFile *midi_file, GError **error); gint16 ags_midi_file_read_gint16(AgsMidiFile *midi_file, GError **error); gint32 ags_midi_file_read_gint24(AgsMidiFile *midi_file, GError **error); gint32 ags_midi_file_read_gint32(AgsMidiFile *midi_file, GError **error); long ags_midi_file_read_varlength(AgsMidiFile *midi_file, GError **error); unsigned char* ags_midi_file_read_text(AgsMidiFile *midi_file, gint length, GError **error); void ags_midi_file_write_byte(AgsMidiFile *midi_file, unsigned char val); void ags_midi_file_write_gint16(AgsMidiFile *midi_file, gint16 val); void ags_midi_file_write_gint24(AgsMidiFile *midi_file, gint32 val); void ags_midi_file_write_gint32(AgsMidiFile *midi_file, gint32 val); void ags_midi_file_write_varlength(AgsMidiFile *midi_file, long val); void ags_midi_file_write_text(AgsMidiFile *midi_file, gchar *text, guint length); unsigned char* ags_midi_file_read_header(AgsMidiFile *midi_file, guint *buffer_length, GError **error); void ags_midi_file_write_header(AgsMidiFile *midi_file, unsigned char *buffer, guint buffer_length); unsigned char* ags_midi_file_read_track_data(AgsMidiFile *midi_file, guint *buffer_length, GError **error); void ags_midi_file_write_track_data(AgsMidiFile *midi_file, unsigned char *buffer, guint buffer_length); void ags_midi_file_read_notation(AgsMidiFile *midi_file); void ags_mid_file_read_midi(AgsMidiFile *midi_file); AgsMidiFile* ags_midi_file_new(gchar *filename); G_END_DECLS #endif /*__AGS_MIDI_FILE_H__*/ gsequencer-3.1.3/ags/audio/midi/ags_midi_util.h0000644000175000017500000000445313607210263016365 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_UTIL_H__ #define __AGS_MIDI_UTIL_H__ #include #include #include G_BEGIN_DECLS /* real-time channel message utility */ gboolean ags_midi_util_is_key_on(unsigned char *buffer); gboolean ags_midi_util_is_key_off(unsigned char *buffer); gboolean ags_midi_util_is_key_pressure(unsigned char *buffer); gboolean ags_midi_util_is_change_parameter(unsigned char *buffer); gboolean ags_midi_util_is_pitch_bend(unsigned char *buffer); gboolean ags_midi_util_is_change_program(unsigned char *buffer); gboolean ags_midi_util_is_change_pressure(unsigned char *buffer); /* real-time sysex utility */ gboolean ags_midi_util_is_sysex(unsigned char *buffer); /* real-time system common utility */ gboolean ags_midi_util_is_quarter_frame(unsigned char *buffer); gboolean ags_midi_util_is_song_position(unsigned char *buffer); gboolean ags_midi_util_is_song_select(unsigned char *buffer); gboolean ags_midi_util_is_tune_request(unsigned char *buffer); /* real-time meta event utility */ gboolean ags_midi_util_is_meta_event(unsigned char *buffer); /* */ unsigned char* ags_midi_util_to_smf(unsigned char *midi_buffer, guint buffer_length, glong delta_time, guint *smf_buffer_length); guint ags_midi_util_delta_time_to_offset(gdouble delay_factor, glong division, glong tempo, glong bpm, glong delta_time); glong ags_midi_util_offset_to_delta_time(gdouble delay_factor, glong division, glong tempo, glong bpm, guint x); G_END_DECLS #endif /*__AGS_MIDI_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_lv2_run.c0000644000175000017500000010712413616617253016401 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_lv2_run_class_init(AgsRecallLv2RunClass *recall_lv2_run_class); void ags_recall_lv2_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_lv2_run_plugin_interface_init(AgsPluginInterface *plugin); void ags_recall_lv2_run_init(AgsRecallLv2Run *recall_lv2_run); void ags_recall_lv2_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_lv2_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_lv2_run_finalize(GObject *gobject); void ags_recall_lv2_run_run_init_pre(AgsRecall *recall); void ags_recall_lv2_run_run_pre(AgsRecall *recall); void ags_recall_lv2_run_run_inter(AgsRecall *recall); void ags_recall_lv2_run_load_ports(AgsRecallLv2Run *recall_lv2_run); /** * SECTION:ags_recall_lv2_run * @Short_description: The object interfacing with LV2 * @Title: AgsRecallLv2Run * * #AgsRecallLv2Run provides LV2 support. */ enum{ PROP_0, PROP_NOTE, PROP_ROUTE_LV2_AUDIO_RUN, }; static gpointer ags_recall_lv2_run_parent_class = NULL; static AgsConnectableInterface* ags_recall_lv2_run_parent_connectable_interface; static AgsPluginInterface* ags_recall_lv2_run_parent_plugin_interface; GType ags_recall_lv2_run_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_lv2_run = 0; static const GTypeInfo ags_recall_lv2_run_info = { sizeof (AgsRecallLv2RunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_lv2_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallLv2Run), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_lv2_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_lv2_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_plugin_interface_info = { (GInterfaceInitFunc) ags_recall_lv2_run_plugin_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_lv2_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsRecallLv2Run", &ags_recall_lv2_run_info, 0); g_type_add_interface_static(ags_type_recall_lv2_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_recall_lv2_run, AGS_TYPE_PLUGIN, &ags_plugin_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_lv2_run); } return g_define_type_id__volatile; } void ags_recall_lv2_run_class_init(AgsRecallLv2RunClass *recall_lv2_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_lv2_run_parent_class = g_type_class_peek_parent(recall_lv2_run); /* GObjectClass */ gobject = (GObjectClass *) recall_lv2_run; gobject->set_property = ags_recall_lv2_run_set_property; gobject->get_property = ags_recall_lv2_run_get_property; gobject->finalize = ags_recall_lv2_run_finalize; /* properties */ /** * AgsRecallLv2Run:route-lv2-audio-run: * * The route lv2 audio run dependency. * * Since: 3.0.0 */ param_spec = g_param_spec_object("route-lv2-audio-run", i18n_pspec("assigned AgsRouteLv2AudioRun"), i18n_pspec("the AgsRouteLv2AudioRun"), AGS_TYPE_ROUTE_LV2_AUDIO_RUN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ROUTE_LV2_AUDIO_RUN, param_spec); /** * AgsRecallLv2Run:note: (type GList(AgsNote)) (transfer full) * * The assigned #AgsNote. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("note", i18n_pspec("assigned note"), i18n_pspec("The note it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_lv2_run; recall->run_init_pre = ags_recall_lv2_run_run_init_pre; recall->run_pre = ags_recall_lv2_run_run_pre; recall->run_inter = ags_recall_lv2_run_run_inter; } void ags_recall_lv2_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_lv2_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_lv2_run_plugin_interface_init(AgsPluginInterface *plugin) { ags_recall_lv2_run_parent_plugin_interface = g_type_interface_peek_parent(plugin); } void ags_recall_lv2_run_init(AgsRecallLv2Run *recall_lv2_run) { recall_lv2_run->lv2_handle = NULL; recall_lv2_run->input = NULL; recall_lv2_run->output = NULL; recall_lv2_run->event_port = NULL; recall_lv2_run->atom_port = NULL; recall_lv2_run->delta_time = 0; recall_lv2_run->event_buffer = (snd_seq_event_t **) malloc(2 * sizeof(snd_seq_event_t *)); recall_lv2_run->event_buffer[0] = (snd_seq_event_t *) malloc(sizeof(snd_seq_event_t)); memset(recall_lv2_run->event_buffer[0], 0, sizeof(snd_seq_event_t)); recall_lv2_run->event_buffer[1] = NULL; recall_lv2_run->event_count = (unsigned long *) malloc(2 * sizeof(unsigned long)); recall_lv2_run->event_count[0] = 0; recall_lv2_run->event_count[1] = 0; recall_lv2_run->route_lv2_audio_run = NULL; recall_lv2_run->note = NULL; recall_lv2_run->worker_handle = NULL; } void ags_recall_lv2_run_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallLv2Run *recall_lv2_run; GRecMutex *recall_mutex; recall_lv2_run = AGS_RECALL_LV2_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2_run); switch(prop_id){ case PROP_ROUTE_LV2_AUDIO_RUN: { AgsRouteLv2AudioRun *route_lv2_audio_run; route_lv2_audio_run = g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if((GObject *) route_lv2_audio_run == recall_lv2_run->route_lv2_audio_run){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_lv2_run->route_lv2_audio_run != NULL){ g_object_unref(G_OBJECT(recall_lv2_run->route_lv2_audio_run)); } if(route_lv2_audio_run != NULL){ g_object_ref(route_lv2_audio_run); } recall_lv2_run->route_lv2_audio_run = (GObject *) route_lv2_audio_run; g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTE: { GObject *note; note = g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_NOTE(note) || g_list_find(recall_lv2_run->note, note) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } recall_lv2_run->note = g_list_prepend(recall_lv2_run->note, note); g_object_ref(note); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_lv2_run_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallLv2Run *recall_lv2_run; GRecMutex *recall_mutex; recall_lv2_run = AGS_RECALL_LV2_RUN(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2_run); switch(prop_id){ case PROP_ROUTE_LV2_AUDIO_RUN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_lv2_run->route_lv2_audio_run); g_rec_mutex_unlock(recall_mutex); } break; case PROP_NOTE: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy(recall_lv2_run->note)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_lv2_run_finalize(GObject *gobject) { AgsRecallLv2 *recall_lv2; AgsRecallLv2Run *recall_lv2_run; recall_lv2_run = AGS_RECALL_LV2_RUN(gobject); g_free(recall_lv2_run->lv2_handle); g_free(recall_lv2_run->output); g_free(recall_lv2_run->input); if(recall_lv2_run->atom_port != NULL){ free(recall_lv2_run->atom_port); } if(recall_lv2_run->event_port != NULL){ free(recall_lv2_run->event_port); } if(recall_lv2_run->event_buffer != NULL){ free(recall_lv2_run->event_buffer); } if(recall_lv2_run->event_count != NULL){ free(recall_lv2_run->event_count); } if(recall_lv2_run->route_lv2_audio_run != NULL){ g_object_unref(recall_lv2_run->route_lv2_audio_run); } g_list_free_full(recall_lv2_run->note, g_object_unref); if(recall_lv2_run->worker_handle != NULL){ AgsReturnableThread *returnable_thread; g_object_get(recall_lv2_run->worker_handle, "returnable-thread", &returnable_thread, NULL); if(returnable_thread != NULL){ ags_returnable_thread_unset_flags(returnable_thread, AGS_RETURNABLE_THREAD_IN_USE); ags_thread_stop((AgsThread *) returnable_thread); g_object_unref(returnable_thread); } g_object_unref(recall_lv2_run->worker_handle); } /* call parent */ G_OBJECT_CLASS(ags_recall_lv2_run_parent_class)->finalize(gobject); } void ags_recall_lv2_run_run_init_pre(AgsRecall *recall) { AgsRecallLv2 *recall_lv2; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallLv2Run *recall_lv2_run; AgsAudioSignal *audio_signal; AgsLv2Plugin *lv2_plugin; AgsConfig *config; LV2_Handle *lv2_handle; float *output, *input; guint output_lines, input_lines; guint samplerate; guint buffer_size; guint port_count; guint i, i_stop; void (*parent_class_run_init_pre)(AgsRecall *recall); void (*connect_port)(LV2_Handle instance, uint32_t port, void *data_location); void (*activate)(LV2_Handle instance); GRecMutex *recall_lv2_mutex; /* get recall mutex */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_recall_lv2_run_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); recall_lv2_run = AGS_RECALL_LV2_RUN(recall); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_lv2, NULL); /* set up buffer */ g_object_get(recall_lv2_run, "source", &audio_signal, NULL); g_object_get(audio_signal, "samplerate", &samplerate, "buffer-size", &buffer_size, NULL); /* get recall lv2 mutex */ recall_lv2_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* get some fields */ g_rec_mutex_lock(recall_lv2_mutex); lv2_plugin = recall_lv2->plugin; output_lines = recall_lv2->output_lines; input_lines = recall_lv2->input_lines; connect_port = recall_lv2->plugin_descriptor->connect_port; activate = recall_lv2->plugin_descriptor->activate; g_rec_mutex_unlock(recall_lv2_mutex); /* set up buffer */ input = NULL; output = NULL; if(input_lines > 0){ input = (float *) malloc(input_lines * buffer_size * sizeof(float)); } output = (float *) malloc(output_lines * buffer_size * sizeof(float)); recall_lv2_run->output = output; recall_lv2_run->input = input; /* instantiate lv2 */ lv2_handle = (LV2_Handle *) ags_base_plugin_instantiate((AgsBasePlugin *) lv2_plugin, samplerate, buffer_size); recall_lv2_run->lv2_handle = lv2_handle; #ifdef AGS_DEBUG g_message("instantiate LV2 handle"); #endif ags_recall_lv2_run_load_ports(recall_lv2_run); /* can't be done in ags_recall_lv2_run_run_init_inter since possebility of overlapping buffers */ g_rec_mutex_lock(recall_lv2_mutex); /* connect audio port */ for(i = 0; i < input_lines; i++){ #ifdef AGS_DEBUG g_message("connect in port: %d", recall_lv2->input_port[i]); #endif connect_port(recall_lv2_run->lv2_handle[0], recall_lv2->input_port[i], recall_lv2_run->input); } for(i = 0; i < output_lines; i++){ #ifdef AGS_DEBUG g_message("connect out port: %d", recall_lv2->output_port[i]); #endif connect_port(recall_lv2_run->lv2_handle[0], recall_lv2->output_port[i], recall_lv2_run->output); } /* connect event port */ if(ags_recall_lv2_test_flags(recall_lv2, AGS_RECALL_LV2_HAS_EVENT_PORT)){ recall_lv2_run->event_port = ags_lv2_plugin_event_buffer_alloc(AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT); #ifdef AGS_DEBUG g_message("connect event port: 0x%x", recall_lv2->event_port); #endif connect_port(recall_lv2_run->lv2_handle[0], recall_lv2->event_port, recall_lv2_run->event_port); } /* connect atom port */ if(ags_recall_lv2_test_flags(recall_lv2, AGS_RECALL_LV2_HAS_ATOM_PORT)){ recall_lv2_run->atom_port = ags_lv2_plugin_alloc_atom_sequence(AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT); #ifdef AGS_DEBUG g_message("connect atom port: 0x%x", recall_lv2->atom_port); #endif connect_port(recall_lv2_run->lv2_handle[0], recall_lv2->atom_port, recall_lv2_run->atom_port); } /* activate */ if(activate != NULL){ activate(recall_lv2_run->lv2_handle[0]); } g_rec_mutex_unlock(recall_lv2_mutex); /* set program */ if(ags_lv2_plugin_test_flags(lv2_plugin, AGS_LV2_PLUGIN_HAS_PROGRAM_INTERFACE)){ AgsPort *current_port; GList *plugin_port_start, *plugin_port; GList *port; GList *list; gchar *specifier, *current_specifier; float *port_data; guint bank, program; guint port_count; GRecMutex *base_plugin_mutex; g_rec_mutex_lock(recall_lv2_mutex); port = g_list_copy(AGS_RECALL(recall_lv2)->port); bank = recall_lv2->bank; program = recall_lv2->program; g_rec_mutex_unlock(recall_lv2_mutex); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* get plugin port */ g_rec_mutex_lock(base_plugin_mutex); plugin_port_start = g_list_copy(AGS_BASE_PLUGIN(lv2_plugin)->plugin_port); g_rec_mutex_unlock(base_plugin_mutex); /* create port data */ port_count = g_list_length(plugin_port_start); port_data = (float *) malloc(port_count * sizeof(float)); plugin_port = plugin_port_start; for(i = 0; i < port_count && plugin_port != NULL; ){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_rec_mutex_unlock(plugin_port_mutex); list = ags_port_find_specifier(port, specifier); if(list != NULL){ GValue value = {0,}; current_port = list->data; g_value_init(&value, G_TYPE_FLOAT); ags_port_safe_read(current_port, &value); port_data[i] = g_value_get_float(&value); g_value_unset(&value); }else{ port_data[i] = 0.0; } g_free(specifier); /* iterate plugin port */ plugin_port = plugin_port->next; } ags_lv2_plugin_change_program(lv2_plugin, recall_lv2_run->lv2_handle[0], bank, program); /* reset port data */ plugin_port = plugin_port_start; for(i = 0; i < port_count && plugin_port != NULL;){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); /* get specifier */ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_rec_mutex_unlock(plugin_port_mutex); list = ags_port_find_specifier(port, specifier); if(list != NULL){ GValue value = {0,}; current_port = list->data; g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, port_data[i]); ags_port_safe_write_raw(current_port, &value); g_value_unset(&value); } /* iterate plugin port */ plugin_port = plugin_port->next; } g_free(port_data); g_list_free(port); g_list_free(plugin_port_start); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_lv2); g_object_unref(audio_signal); } void ags_recall_lv2_run_run_pre(AgsRecall *recall) { AgsAudio *audio; AgsChannel *channel; AgsRecallLv2 *recall_lv2; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallLv2Run *recall_lv2_run; AgsAudioSignal *audio_signal; AgsPort *current_port; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsCountBeatsAudioRun *count_beats_audio_run; AgsRouteLv2AudioRun *route_lv2_audio_run; GList *list_start, *list; GList *port; GList *note_start, *note; guint output_lines, input_lines; guint notation_counter; guint x0, x1; guint port_count; guint copy_mode_in, copy_mode_out; guint buffer_size; guint i; void (*parent_class_run_pre)(AgsRecall *recall); void (*run)(LV2_Handle instance, uint32_t sample_count); void (*deactivate)(LV2_Handle instance); void (*cleanup)(LV2_Handle instance); GRecMutex *recall_lv2_mutex; GRecMutex *port_mutex; /* get parent class */ parent_class_run_pre = AGS_RECALL_CLASS(ags_recall_lv2_run_parent_class)->run_pre; /* call parent */ parent_class_run_pre(recall); g_object_get(recall, "recall-id", &recall_id, "source", &audio_signal, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && note_start == NULL){ g_object_unref(recall_id); g_object_unref(audio_signal); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } g_list_free_full(note_start, g_object_unref); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "source", &channel, "recall-channel", &recall_lv2, NULL); g_object_get(channel, "audio", &audio, NULL); recall_lv2_run = AGS_RECALL_LV2_RUN(recall); g_object_get(recall_lv2_run, "route-lv2-audio-run", &route_lv2_audio_run, NULL); /* get recall lv2 mutex */ recall_lv2_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); count_beats_audio_run = NULL; if(route_lv2_audio_run != NULL){ g_object_get(route_lv2_audio_run, "count-beats-audio-run", &count_beats_audio_run, NULL); } g_object_get(audio_signal, "buffer-size", &buffer_size, NULL); /* get some fields */ g_rec_mutex_lock(recall_lv2_mutex); output_lines = recall_lv2->output_lines; input_lines = recall_lv2->input_lines; g_rec_mutex_unlock(recall_lv2_mutex); if(count_beats_audio_run != NULL){ g_object_get(count_beats_audio_run, "notation-counter", ¬ation_counter, NULL); g_object_get(recall_lv2_run, "note", ¬e_start, NULL); if(ags_recall_global_get_rt_safe()){ note = note_start; while(note != NULL){ g_object_get(note->data, "x0", &x0, "x1", &x1, NULL); if((x1 + 1 <= notation_counter && !ags_note_test_flags(note->data, AGS_NOTE_FEED)) || x0 > notation_counter){ recall_lv2_run->note = g_list_remove(recall_lv2_run->note, note->data); g_object_unref(note->data); } note = note->next; } g_list_free(note_start); }else{ g_object_get(note_start->data, "x0", &x0, "x1", &x1, NULL); if(audio_signal->stream_current == NULL || (x1 + 1 <= notation_counter && !ags_note_test_flags(note_start->data, AGS_NOTE_FEED)) || x0 > notation_counter){ // g_message("done"); g_rec_mutex_lock(recall_lv2_mutex); deactivate = recall_lv2->plugin_descriptor->deactivate; cleanup = recall_lv2->plugin_descriptor->cleanup; g_rec_mutex_unlock(recall_lv2_mutex); /* deactivate */ if(deactivate != NULL){ deactivate(recall_lv2_run->lv2_handle[0]); } /* cleanup */ if(cleanup != NULL){ cleanup(recall_lv2_run->lv2_handle[0]); } ags_recall_done(recall); g_list_free(note_start); goto ags_recall_lv2_run_run_pre_END; } } }else{ if(parent_recycling_context == NULL && audio_signal->stream_current == NULL){ #if 0 g_rec_mutex_lock(recall_lv2_mutex); deactivate = recall_lv2->plugin_descriptor->deactivate; cleanup = recall_lv2->plugin_descriptor->cleanup; g_rec_mutex_unlock(recall_lv2_mutex); /* deactivate */ if(deactivate != NULL){ deactivate(recall_lv2_run->lv2_handle[0]); } /* cleanup */ if(cleanup != NULL){ cleanup(recall_lv2_run->lv2_handle[0]); } ags_recall_done(recall); goto ags_recall_lv2_run_run_pre_END; #else ags_audio_signal_add_stream(audio_signal); audio_signal->stream_current = audio_signal->stream_end; ags_audio_signal_stream_safe_resize(audio_signal, audio_signal->length + 2); // ags_audio_signal_add_stream(audio_signal); #endif } } /* get copy mode and clear buffer */ copy_mode_in = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); copy_mode_out = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(audio_signal->format), AGS_AUDIO_BUFFER_UTIL_FLOAT); if(recall_lv2_run->output != NULL){ ags_audio_buffer_util_clear_float(recall_lv2_run->output, 1, output_lines * buffer_size); } if(recall_lv2_run->input != NULL){ ags_audio_buffer_util_clear_float(recall_lv2_run->input, 1, input_lines * buffer_size); } /* copy data */ if(recall_lv2_run->input != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(recall_lv2_run->input, 1, 0, audio_signal->stream_current->data, 1, 0, (guint) buffer_size, copy_mode_in); } /* process data */ g_rec_mutex_lock(recall_lv2_mutex); run = recall_lv2->plugin_descriptor->run; g_rec_mutex_unlock(recall_lv2_mutex); if(parent_recycling_context == NULL){ snd_seq_event_t *seq_event; guint audio_start_mapping; guint midi_start_mapping; guint pad; g_object_get(audio_signal, "note", ¬e_start, NULL); /* key on */ seq_event = recall_lv2_run->event_buffer[0]; if(recall_lv2_run->event_count[0] == 0){ gboolean success; g_object_get(audio, "audio-start-mapping", &audio_start_mapping, "midi-start-mapping", &midi_start_mapping, NULL); g_object_get(channel, "pad", &pad, NULL); seq_event->type = SND_SEQ_EVENT_NOTEON; seq_event->data.note.channel = 0; seq_event->data.note.note = 0x7f & (pad - audio_start_mapping + midi_start_mapping); seq_event->data.note.velocity = 127; /* write to port */ success = FALSE; if(ags_recall_lv2_test_flags(recall_lv2, AGS_RECALL_LV2_HAS_ATOM_PORT)){ success = ags_lv2_plugin_atom_sequence_append_midi(recall_lv2_run->atom_port, AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT, seq_event, 1); }else if(ags_recall_lv2_test_flags(recall_lv2, AGS_RECALL_LV2_HAS_EVENT_PORT)){ success = ags_lv2_plugin_event_buffer_append_midi(recall_lv2_run->event_port, AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT, seq_event, 1); } if(success){ recall_lv2_run->event_count[0] = 1; }else{ note_start = NULL; } } }else{ g_object_get(recall_lv2_run, "note", ¬e_start, NULL); } note = note_start; while(note != NULL){ run(recall_lv2_run->lv2_handle[0], (uint32_t) buffer_size); note = note->next; } g_list_free(note_start); /* copy data */ if(recall_lv2_run->output != NULL){ ags_audio_buffer_util_clear_buffer(audio_signal->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); ags_audio_buffer_util_copy_buffer_to_buffer(audio_signal->stream_current->data, 1, 0, recall_lv2_run->output, 1, 0, (guint) buffer_size, copy_mode_out); } ags_recall_lv2_run_run_pre_END: g_object_unref(audio); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_lv2); if(route_lv2_audio_run != NULL){ g_object_unref(route_lv2_audio_run); } if(count_beats_audio_run != NULL){ g_object_unref(count_beats_audio_run); } } void ags_recall_lv2_run_run_inter(AgsRecall *recall) { AgsRecallLv2 *recall_lv2; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallLv2Run *recall_lv2_run; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context, *recycling_context; AgsLv2Plugin *lv2_plugin; GList *note_start, *note; guint output_lines, input_lines; guint copy_mode_in, copy_mode_out; guint buffer_size; guint i; void (*parent_class_run_inter)(AgsRecall *recall); void (*run)(LV2_Handle instance, uint32_t sample_count); void (*deactivate)(LV2_Handle instance); void (*cleanup)(LV2_Handle instance); GRecMutex *recall_lv2_mutex; /* get recall mutex */ parent_class_run_inter = AGS_RECALL_CLASS(ags_recall_lv2_run_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); g_object_get(recall, "source", &audio_signal, "recall-id", &recall_id, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && note_start == NULL){ g_object_unref(audio_signal); g_object_unref(recall_id); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } g_list_free_full(note_start, g_object_unref); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_lv2, NULL); g_object_get(recall_lv2, "plugin", &lv2_plugin, NULL); recall_lv2_run = AGS_RECALL_LV2_RUN(recall); if(ags_lv2_plugin_test_flags(lv2_plugin, AGS_LV2_PLUGIN_IS_SYNTHESIZER)){ g_object_unref(audio_signal); g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_lv2); g_object_unref(lv2_plugin); return; } /* get recall lv2 mutex */ recall_lv2_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); g_object_get(audio_signal, "buffer-size", &buffer_size, NULL); /* get some fields */ g_rec_mutex_lock(recall_lv2_mutex); output_lines = recall_lv2->output_lines; input_lines = recall_lv2->input_lines; run = recall_lv2->plugin_descriptor->run; deactivate = recall_lv2->plugin_descriptor->deactivate; cleanup = recall_lv2->plugin_descriptor->cleanup; g_rec_mutex_unlock(recall_lv2_mutex); /* set up buffer */ if(audio_signal->stream_current == NULL){ // g_message("done"); /* deactivate */ if(deactivate != NULL){ deactivate(recall_lv2_run->lv2_handle[0]); } /* cleanup */ if(cleanup != NULL){ cleanup(recall_lv2_run->lv2_handle[0]); } ags_recall_done(recall); goto ags_recall_lv2_run_run_inter_END; } copy_mode_in = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); copy_mode_out = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(audio_signal->format), AGS_AUDIO_BUFFER_UTIL_FLOAT); if(recall_lv2_run->output != NULL){ ags_audio_buffer_util_clear_float(recall_lv2_run->output, output_lines, buffer_size); } if(recall_lv2_run->input != NULL){ ags_audio_buffer_util_clear_float(recall_lv2_run->input, input_lines, buffer_size); } if(recall_lv2_run->input != NULL){ ags_audio_buffer_util_copy_buffer_to_buffer(recall_lv2_run->input, (guint) input_lines, 0, audio_signal->stream_current->data, 1, 0, (guint) buffer_size, copy_mode_in); } /* process data */ run(recall_lv2_run->lv2_handle[0], (uint32_t) buffer_size); /* copy data */ if(recall_lv2_run->output != NULL){ ags_audio_buffer_util_clear_buffer(audio_signal->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); ags_audio_buffer_util_copy_buffer_to_buffer(audio_signal->stream_current->data, 1, 0, recall_lv2_run->output, (guint) output_lines, 0, (guint) buffer_size, copy_mode_out); } ags_recall_lv2_run_run_inter_END: g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_lv2); g_object_unref(audio_signal); g_object_unref(lv2_plugin); } /** * ags_recall_lv2_run_load_ports: * @recall_lv2_run: the #AgsRecallLv2Run * * Set up LV2 ports. * * Since: 3.0.0 */ void ags_recall_lv2_run_load_ports(AgsRecallLv2Run *recall_lv2_run) { AgsRecallLv2 *recall_lv2; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsPort *current_port; AgsLv2Plugin *lv2_plugin; LV2_Handle lv2_handle; GList *plugin_port_start, *plugin_port; GList *port; GList *list; gchar *filename, *effect; gchar *specifier, *current_specifier; guint port_count; guint i, j; void (*connect_port)(LV2_Handle instance, uint32_t port, void *data_location); GRecMutex *recall_mutex; GRecMutex *recall_lv2_mutex; GRecMutex *port_mutex; if(!AGS_IS_RECALL_LV2_RUN(recall_lv2_run)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2_run); g_object_get(recall_lv2_run, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_lv2, NULL); /* get recall lv2 mutex */ recall_lv2_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* get some fields */ g_rec_mutex_lock(recall_mutex); lv2_handle = NULL; if(recall_lv2_run->lv2_handle != NULL){ lv2_handle = recall_lv2_run->lv2_handle[0]; } filename = g_strdup(AGS_RECALL(recall_lv2)->filename); effect = g_strdup(AGS_RECALL(recall_lv2)->effect); port = g_list_copy(AGS_RECALL(recall_lv2)->port); connect_port = recall_lv2->plugin_descriptor->connect_port; g_rec_mutex_unlock(recall_mutex); if(lv2_handle == NULL){ return; } lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); g_free(filename); g_free(effect); g_object_get(lv2_plugin, "plugin-port", &plugin_port_start, NULL); if(plugin_port_start != NULL){ plugin_port = plugin_port_start; for(i = 0; plugin_port != NULL; i++){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_CONTROL)){ g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_rec_mutex_unlock(plugin_port_mutex); list = ags_port_find_specifier(port, specifier); g_free(specifier); if(list != NULL){ float *port_pointer; guint port_index; uint32_t lv2_port_index; current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); /* get port pointer */ g_rec_mutex_lock(port_mutex); port_pointer = (float *) &(current_port->port_value.ags_port_ladspa); g_rec_mutex_unlock(port_mutex); g_object_get(current_plugin_port, "port-index", &port_index, NULL); lv2_port_index = (uint32_t) port_index; connect_port(lv2_handle, lv2_port_index, (void *) port_pointer); #ifdef AGS_DEBUG g_message("connect port: %d", port_index); #endif } } /* iterate plugin port */ plugin_port = plugin_port->next; } } g_list_free(port); g_list_free_full(plugin_port_start, g_object_unref); g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_lv2); } /** * ags_recall_lv2_run_new: * @source: the #AgsAudioSignal as source * * Creates a new instance of #AgsRecallLv2Run * * Returns: the new #AgsRecallLv2Run * * Since: 3.0.0 */ AgsRecallLv2Run* ags_recall_lv2_run_new(AgsAudioSignal *source) { AgsRecallLv2Run *recall_lv2_run; recall_lv2_run = (AgsRecallLv2Run *) g_object_new(AGS_TYPE_RECALL_LV2_RUN, "source", source, NULL); return(recall_lv2_run); } gsequencer-3.1.3/ags/audio/ags_channel.h0000644000175000017500000003234013616617253015102 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CHANNEL_H__ #define __AGS_CHANNEL_H__ #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CHANNEL (ags_channel_get_type()) #define AGS_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CHANNEL, AgsChannel)) #define AGS_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CHANNEL, AgsChannelClass)) #define AGS_IS_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CHANNEL)) #define AGS_IS_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CHANNEL)) #define AGS_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CHANNEL, AgsChannelClass)) #define AGS_CHANNEL_GET_OBJ_MUTEX(obj) (&(((AgsChannel *) obj)->obj_mutex)) #define AGS_CHANNEL_GET_PLAY_MUTEX(obj) (&(((AgsChannel *) obj)->play_mutex)) #define AGS_CHANNEL_GET_RECALL_MUTEX(obj) (&(((AgsChannel *) obj)->recall_mutex)) #define AGS_CHANNEL_MINIMUM_OCTAVE (0) #define AGS_CHANNEL_MAXIMUM_OCTAVE (10) #define AGS_CHANNEL_DEFAULT_OCTAVE (AGS_CHANNEL_MINIMUM_OCTAVE) #define AGS_CHANNEL_MINIMUM_OCTAVE_SEMITONE (0) #define AGS_CHANNEL_MAXIMUM_OCTAVE_SEMITONE (12) #define AGS_CHANNEL_DEFAULT_OCTAVE_SEMITONE (AGS_CHANNEL_MINIMUM_OCTAVE_SEMITONE) #define AGS_CHANNEL_MINIMUM_SEMITONE (0) #define AGS_CHANNEL_MAXIMUM_SEMITONE (128) #define AGS_CHANNEL_DEFAULT_SEMITONE (AGS_CHANNEL_MINIMUM_SEMITONE) #define AGS_CHANNEL_MINIMUM_NOTE_FREQUENCY (440.0 * exp((-69.0 / 12.0) * log(2.0))) #define AGS_CHANNEL_MAXIMUM_NOTE_FREQUENCY (440.0 * exp((58.0 / 12.0) * log(2.0))) #define AGS_CHANNEL_DEFAULT_NOTE_FREQUENCY (AGS_CHANNEL_MINIMUM_NOTE_FREQUENCY) #define AGS_CHANNEL_MINIMUM_MIDI_NOTE (0) #define AGS_CHANNEL_MAXIMUM_MIDI_NOTE (127) #define AGS_CHANNEL_DEFAULT_MIDI_NOTE (AGS_CHANNEL_MINIMUM_MIDI_NOTE) typedef struct _AgsChannel AgsChannel; typedef struct _AgsChannelClass AgsChannelClass; /** * AgsChannelFlags: * @AGS_CHANNEL_ADDED_TO_REGISTRY: the channel was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CHANNEL_CONNECTED: indicates the channel was connected by calling #AgsConnectable::connect() * @AGS_CHANNEL_BYPASS: don't apply any data * * Enum values to control the behavior or indicate internal state of #AgsChannel by * enable/disable as flags. */ typedef enum{ AGS_CHANNEL_ADDED_TO_REGISTRY = 1, AGS_CHANNEL_CONNECTED = 1 << 1, AGS_CHANNEL_BYPASS = 1 << 2, }AgsChannelFlags; #define AGS_CHANNEL_ERROR (ags_channel_error_quark()) typedef enum{ AGS_CHANNEL_ERROR_LOOP_IN_LINK, }AgsChannelError; struct _AgsChannel { GObject gobject; guint flags; guint ability_flags; guint behaviour_flags; guint staging_flags[AGS_SOUND_SCOPE_LAST]; GRecMutex obj_mutex; AgsUUID *uuid; GObject *audio; GObject *output_soundcard; gint output_soundcard_channel; GObject *input_soundcard; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; guint pad; guint audio_channel; guint line; gint octave; guint key; gint absolute_key; gdouble note_frequency; gchar *note_key; guint midi_note; AgsChannel *prev; AgsChannel *prev_pad; AgsChannel *next; AgsChannel *next_pad; AgsChannel *link; AgsRecycling *first_recycling; AgsRecycling *last_recycling; GObject *playback; GList *pattern; GList *recall_id; GList *recycling_context; GList *recall_container; GRecMutex play_mutex; GList *play; GRecMutex recall_mutex; GList *recall; gpointer line_widget; gpointer file_data; }; struct _AgsChannelClass { GObjectClass gobject; void (*recycling_changed)(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region); GList* (*add_effect)(AgsChannel *channel, gchar *filename, gchar *effect); void (*remove_effect)(AgsChannel *channel, guint nth); void (*duplicate_recall)(AgsChannel *channel, AgsRecallID *recall_id); void (*resolve_recall)(AgsChannel *channel, AgsRecallID *recall_id); void (*init_recall)(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags); void (*play_recall)(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags); void (*done_recall)(AgsChannel *channel, AgsRecallID *recall_id); void (*cancel_recall)(AgsChannel *channel, AgsRecallID *recall_id); void (*cleanup_recall)(AgsChannel *channel, AgsRecallID *recall_id); GList* (*start)(AgsChannel *channel, gint sound_scope); void (*stop)(AgsChannel *channel, GList *recall_id, gint sound_scope); GList* (*check_scope)(AgsChannel *channel, gint sound_scope); void (*recursive_run_stage)(AgsChannel *channel, gint sound_scope, guint staging_flags); }; GType ags_channel_get_type(); GQuark ags_channel_error_quark(); GRecMutex* ags_channel_get_obj_mutex(AgsChannel *channel); GRecMutex* ags_channel_get_play_mutex(AgsChannel *channel); GRecMutex* ags_channel_get_recall_mutex(AgsChannel *channel); gboolean ags_channel_test_flags(AgsChannel *channel, guint flags); void ags_channel_set_flags(AgsChannel *channel, guint flags); void ags_channel_unset_flags(AgsChannel *channel, guint flags); gboolean ags_channel_test_ability_flags(AgsChannel *channel, guint ability_flags); void ags_channel_set_ability_flags(AgsChannel *channel, guint ability_flags); void ags_channel_unset_ability_flags(AgsChannel *channel, guint ability_flags); gboolean ags_channel_test_behaviour_flags(AgsChannel *channel, guint behaviour_flags); void ags_channel_set_behaviour_flags(AgsChannel *channel, guint behaviour_flags); void ags_channel_unset_behaviour_flags(AgsChannel *channel, guint behaviour_flags); gboolean ags_channel_test_staging_flags(AgsChannel *channel, gint sound_scope, guint staging_flags); void ags_channel_set_staging_flags(AgsChannel *channel, gint sound_scope, guint staging_flags); void ags_channel_unset_staging_flags(AgsChannel *channel, gint sound_scope, guint staging_flags); /* parent */ GObject* ags_channel_get_audio(AgsChannel *channel); void ags_channel_set_audio(AgsChannel *channel, GObject *audio); /* channels */ AgsChannel* ags_channel_next(AgsChannel *channel); AgsChannel* ags_channel_prev(AgsChannel *channel); AgsChannel* ags_channel_next_pad(AgsChannel *channel); AgsChannel* ags_channel_prev_pad(AgsChannel *channel); AgsChannel* ags_channel_first(AgsChannel *channel); AgsChannel* ags_channel_last(AgsChannel *channel); AgsChannel* ags_channel_nth(AgsChannel *channel, guint nth); AgsChannel* ags_channel_pad_first(AgsChannel *channel); AgsChannel* ags_channel_pad_last(AgsChannel *channel); AgsChannel* ags_channel_pad_nth(AgsChannel *channel, guint nth); AgsChannel* ags_channel_first_with_recycling(AgsChannel *channel); AgsChannel* ags_channel_last_with_recycling(AgsChannel *channel); AgsChannel* ags_channel_prev_with_recycling(AgsChannel *channel); AgsChannel* ags_channel_next_with_recycling(AgsChannel *channel); AgsChannel* ags_channel_get_link(AgsChannel *channel); void ags_channel_set_link(AgsChannel *channel, AgsChannel *link, GError **error); void ags_channel_reset_recycling(AgsChannel *channel, AgsRecycling *first_recycling, AgsRecycling *last_recycling); void ags_channel_recycling_changed(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region); /* soundcard */ GObject* ags_channel_get_output_soundcard(AgsChannel *channel); void ags_channel_set_output_soundcard(AgsChannel *channel, GObject *output_soundcard); GObject* ags_channel_get_input_soundcard(AgsChannel *channel); void ags_channel_set_input_soundcard(AgsChannel *channel, GObject *input_soundcard); /* presets */ guint ags_channel_get_samplerate(AgsChannel *channel); void ags_channel_set_samplerate(AgsChannel *channel, guint samplerate); guint ags_channel_get_buffer_size(AgsChannel *channel); void ags_channel_set_buffer_size(AgsChannel *channel, guint buffer_size); guint ags_channel_get_format(AgsChannel *channel); void ags_channel_set_format(AgsChannel *channel, guint format); /* alignment */ guint ags_channel_get_pad(AgsChannel *channel); void ags_channel_set_pad(AgsChannel *channel, guint pad); guint ags_channel_get_audio_channel(AgsChannel *channel); void ags_channel_set_audio_channel(AgsChannel *channel, guint audio_channel); guint ags_channel_get_line(AgsChannel *channel); void ags_channel_set_line(AgsChannel *channel, guint line); /* key */ gint ags_channel_get_octave(AgsChannel *channel); void ags_channel_set_octave(AgsChannel *channel, gint octave); guint ags_channel_get_key(AgsChannel *channel); void ags_channel_set_key(AgsChannel *channel, guint key); gint ags_channel_get_absolute_key(AgsChannel *channel); void ags_channel_set_absolute_key(AgsChannel *channel, gint absolute_key); /* children */ GList* ags_channel_get_pattern(AgsChannel *channel); void ags_channel_set_pattern(AgsChannel *channel, GList *pattern); void ags_channel_add_pattern(AgsChannel *channel, GObject *pattern); void ags_channel_remove_pattern(AgsChannel *channel, GObject *pattern); /* recall related */ GObject* ags_channel_get_playback(AgsChannel *channel); void ags_channel_set_playback(AgsChannel *channel, GObject *playback); GList* ags_channel_get_recall_id(AgsChannel *channel); void ags_channel_set_recall_id(AgsChannel *channel, GList *recall_id); void ags_channel_add_recall_id(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_remove_recall_id(AgsChannel *channel, AgsRecallID *recall_id); GList* ags_channel_get_recall_container(AgsChannel *channel); void ags_channel_set_recall_container(AgsChannel *channel, GList *recall_container); void ags_channel_add_recall_container(AgsChannel *channel, GObject *recall_container); void ags_channel_remove_recall_container(AgsChannel *channel, GObject *recall_container); GList* ags_channel_get_play(AgsChannel *channel); void ags_channel_set_play(AgsChannel *channel, GList *play); GList* ags_channel_get_recall(AgsChannel *channel); void ags_channel_set_recall(AgsChannel *channel, GList *recall); void ags_channel_add_recall(AgsChannel *channel, GObject *recall, gboolean play_context); void ags_channel_remove_recall(AgsChannel *channel, GObject *recall, gboolean play_context); /* add/remove effect */ GList* ags_channel_add_effect(AgsChannel *channel, char *filename, gchar *effect); void ags_channel_remove_effect(AgsChannel *channel, guint nth); /* stages */ void ags_channel_duplicate_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_resolve_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_init_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags); void ags_channel_play_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags); void ags_channel_done_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_cancel_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_cleanup_recall(AgsChannel *channel, AgsRecallID *recall_id); /* control */ GList* ags_channel_start(AgsChannel *channel, gint sound_scope); void ags_channel_stop(AgsChannel *channel, GList *recall_id, gint sound_scope); /* query */ GList* ags_channel_check_scope(AgsChannel *channel, gint sound_scope); GList* ags_channel_collect_all_channel_ports(AgsChannel *channel); GList* ags_channel_collect_all_channel_ports_by_specifier_and_context(AgsChannel *channel, gchar *specifier, gboolean play_context); /* recursive functions */ AgsChannel* ags_channel_get_level(AgsChannel *channel); void ags_channel_recursive_set_property(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value); void ags_channel_recursive_run_stage(AgsChannel *channel, gint sound_scope, guint staging_flags); /* instantiate */ AgsChannel* ags_channel_new(GObject *audio); G_END_DECLS #endif /*__AGS_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/thread/0000755000175000017500000000000013622252253014004 500000000000000gsequencer-3.1.3/ags/audio/thread/ags_sf2_loader.c0000644000175000017500000003327213607210263016747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_sf2_loader_class_init(AgsSF2LoaderClass *sf2_loader); void ags_sf2_loader_init(AgsSF2Loader *sf2_loader); void ags_sf2_loader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sf2_loader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sf2_loader_dispose(GObject *gobject); void ags_sf2_loader_finalize(GObject *gobject); void* ags_sf2_loader_run(void *ptr); /** * SECTION:ags_sf2_loader * @short_description: load Soundfont2 asynchronously * @title: AgsSF2Loader * @section_id: * @include: ags/plugin/ags_sf2_loader.h * * The #AgsSF2Loader loads Soundfont2 audio data asynchronously. */ enum{ PROP_0, PROP_AUDIO, PROP_FILENAME, PROP_PRESET, PROP_INSTRUMENT, PROP_AUDIO_CONTAINER, }; static gpointer ags_sf2_loader_parent_class = NULL; GType ags_sf2_loader_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sf2_loader = 0; static const GTypeInfo ags_sf2_loader_info = { sizeof(AgsSF2LoaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sf2_loader_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSF2Loader), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sf2_loader_init, }; ags_type_sf2_loader = g_type_register_static(G_TYPE_OBJECT, "AgsSF2Loader", &ags_sf2_loader_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sf2_loader); } return g_define_type_id__volatile; } void ags_sf2_loader_class_init(AgsSF2LoaderClass *sf2_loader) { GObjectClass *gobject; GParamSpec *param_spec; ags_sf2_loader_parent_class = g_type_class_peek_parent(sf2_loader); /* GObject */ gobject = (GObjectClass *) sf2_loader; gobject->set_property = ags_sf2_loader_set_property; gobject->get_property = ags_sf2_loader_get_property; gobject->dispose = ags_sf2_loader_dispose; gobject->finalize = ags_sf2_loader_finalize; /* properties */ /** * AgsSF2Loader:audio: * * The assigned audio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio"), i18n_pspec("The audio"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsSF2Loader:filename: * * The filename to open. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename"), i18n_pspec("The filename"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsSF2Loader:preset: * * The preset to open. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset", i18n_pspec("preset"), i18n_pspec("The preset"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /** * AgsSF2Loader:instrument: * * The instrument to open. * * Since: 3.0.0 */ param_spec = g_param_spec_string("instrument", i18n_pspec("instrument"), i18n_pspec("The instrument"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INSTRUMENT, param_spec); /** * AgsSF2Loader:audio-container: * * The audio container opened. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-container", i18n_pspec("audio container"), i18n_pspec("The audio container"), AGS_TYPE_AUDIO_CONTAINER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CONTAINER, param_spec); } void ags_sf2_loader_init(AgsSF2Loader *sf2_loader) { sf2_loader->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(sf2_loader->obj_mutex)); /* fields */ sf2_loader->thread = NULL; sf2_loader->audio = NULL; sf2_loader->filename = NULL; sf2_loader->preset = NULL; sf2_loader->instrument = NULL; sf2_loader->audio_container = NULL; } void ags_sf2_loader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSF2Loader *sf2_loader; GRecMutex *sf2_loader_mutex; sf2_loader = AGS_SF2_LOADER(gobject); /* get base plugin mutex */ sf2_loader_mutex = AGS_SF2_LOADER_GET_OBJ_MUTEX(sf2_loader); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = g_value_get_object(value); g_rec_mutex_lock(sf2_loader_mutex); if(sf2_loader->audio == audio){ g_rec_mutex_unlock(sf2_loader_mutex); return; } if(sf2_loader->audio != NULL){ g_object_unref(sf2_loader->audio); } if(audio != NULL){ g_object_ref(audio); } sf2_loader->audio = audio; g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(sf2_loader_mutex); if(sf2_loader->filename == filename){ g_rec_mutex_unlock(sf2_loader_mutex); return; } if(sf2_loader->filename != NULL){ g_free(sf2_loader->filename); } sf2_loader->filename = g_strdup(filename); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_PRESET: { gchar *preset; preset = g_value_get_string(value); g_rec_mutex_lock(sf2_loader_mutex); if(sf2_loader->preset == preset){ g_rec_mutex_unlock(sf2_loader_mutex); return; } if(sf2_loader->preset != NULL){ g_free(sf2_loader->preset); } sf2_loader->preset = g_strdup(preset); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_INSTRUMENT: { gchar *instrument; instrument = g_value_get_string(value); g_rec_mutex_lock(sf2_loader_mutex); if(sf2_loader->instrument == instrument){ g_rec_mutex_unlock(sf2_loader_mutex); return; } if(sf2_loader->instrument != NULL){ g_free(sf2_loader->instrument); } sf2_loader->instrument = g_strdup(instrument); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_AUDIO_CONTAINER: { AgsAudioContainer *audio_container; audio_container = g_value_get_object(value); g_rec_mutex_lock(sf2_loader_mutex); if(sf2_loader->audio_container == audio_container){ g_rec_mutex_unlock(sf2_loader_mutex); return; } if(sf2_loader->audio_container != NULL){ g_object_unref(sf2_loader->audio_container); } if(audio_container != NULL){ g_object_ref(audio_container); } sf2_loader->audio_container = audio_container; g_rec_mutex_unlock(sf2_loader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sf2_loader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSF2Loader *sf2_loader; GRecMutex *sf2_loader_mutex; sf2_loader = AGS_SF2_LOADER(gobject); /* get base plugin mutex */ sf2_loader_mutex = AGS_SF2_LOADER_GET_OBJ_MUTEX(sf2_loader); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(sf2_loader_mutex); g_value_set_object(value, sf2_loader->audio); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(sf2_loader_mutex); g_value_set_string(value, sf2_loader->filename); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_PRESET: { g_rec_mutex_lock(sf2_loader_mutex); g_value_set_string(value, sf2_loader->preset); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_INSTRUMENT: { g_rec_mutex_lock(sf2_loader_mutex); g_value_set_string(value, sf2_loader->instrument); g_rec_mutex_unlock(sf2_loader_mutex); } break; case PROP_AUDIO_CONTAINER: { g_rec_mutex_lock(sf2_loader_mutex); g_value_set_object(value, sf2_loader->audio_container); g_rec_mutex_unlock(sf2_loader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sf2_loader_dispose(GObject *gobject) { AgsSF2Loader *sf2_loader; sf2_loader = AGS_SF2_LOADER(gobject); if(sf2_loader->audio != NULL){ g_object_unref(sf2_loader->audio); sf2_loader->audio = NULL; } if(sf2_loader->audio_container != NULL){ g_object_unref(sf2_loader->audio_container); sf2_loader->audio_container = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sf2_loader_parent_class)->dispose(gobject); } void ags_sf2_loader_finalize(GObject *gobject) { AgsSF2Loader *sf2_loader; sf2_loader = AGS_SF2_LOADER(gobject); /* destroy object mutex */ if(sf2_loader->audio != NULL){ g_object_unref(sf2_loader->audio); } g_free(sf2_loader->filename); g_free(sf2_loader->preset); g_free(sf2_loader->instrument); if(sf2_loader->audio_container != NULL){ g_object_unref(sf2_loader->audio_container); } /* call parent */ G_OBJECT_CLASS(ags_sf2_loader_parent_class)->finalize(gobject); } /** * ags_sf2_loader_test_flags: * @sf2_loader: the #AgsSF2Loader * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sf2_loader_test_flags(AgsSF2Loader *sf2_loader, guint flags) { gboolean retval; GRecMutex *sf2_loader_mutex; if(!AGS_IS_SF2_LOADER(sf2_loader)){ return(FALSE); } /* get sf2 loader mutex */ sf2_loader_mutex = AGS_SF2_LOADER_GET_OBJ_MUTEX(sf2_loader); /* test flags */ g_rec_mutex_lock(sf2_loader_mutex); retval = ((flags & (sf2_loader->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(sf2_loader_mutex); return(retval); } /** * ags_sf2_loader_set_flags: * @sf2_loader: the #AgsSF2Loader * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_sf2_loader_set_flags(AgsSF2Loader *sf2_loader, guint flags) { GRecMutex *sf2_loader_mutex; if(!AGS_IS_SF2_LOADER(sf2_loader)){ return; } /* get sf2 loader mutex */ sf2_loader_mutex = AGS_SF2_LOADER_GET_OBJ_MUTEX(sf2_loader); /* set flags */ g_rec_mutex_lock(sf2_loader_mutex); sf2_loader->flags |= flags; g_rec_mutex_unlock(sf2_loader_mutex); } /** * ags_sf2_loader_unset_flags: * @sf2_loader: the #AgsSF2Loader * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_sf2_loader_unset_flags(AgsSF2Loader *sf2_loader, guint flags) { GRecMutex *sf2_loader_mutex; if(!AGS_IS_SF2_LOADER(sf2_loader)){ return; } /* get sf2 loader mutex */ sf2_loader_mutex = AGS_SF2_LOADER_GET_OBJ_MUTEX(sf2_loader); /* unset flags */ g_rec_mutex_lock(sf2_loader_mutex); sf2_loader->flags &= (~flags); g_rec_mutex_unlock(sf2_loader_mutex); } void* ags_sf2_loader_run(void *ptr) { AgsSF2Loader *sf2_loader; GObject *output_soundcard; GList *start_sf2, *sf2; guint n_pads, current_pads; guint n_audio_channels, current_audio_channels; sf2_loader = AGS_SF2_LOADER(ptr); g_object_get(sf2_loader->audio, "output-soundcard", &output_soundcard, NULL); sf2_loader->audio_container = ags_audio_container_new(sf2_loader->filename, NULL, NULL, NULL, output_soundcard, -1); ags_audio_container_open(sf2_loader->audio_container); if(sf2_loader->audio_container->sound_container != NULL){ ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(sf2_loader->audio_container->sound_container), 0); AGS_IPATCH(sf2_loader->audio_container->sound_container)->nesting_level += 1; } g_object_unref(output_soundcard); ags_sf2_loader_set_flags(sf2_loader, AGS_SF2_LOADER_HAS_COMPLETED); g_thread_exit(NULL); return(NULL); } void ags_sf2_loader_start(AgsSF2Loader *sf2_loader) { if(!AGS_IS_SF2_LOADER(sf2_loader)){ return; } sf2_loader->thread = g_thread_new("Advanced Gtk+ Sequencer - SFZ loader", ags_sf2_loader_run, sf2_loader); } /** * ags_sf2_loader_new: * @audio: the #AgsAudio * @filename: the filename * @preset: the preset * @instrument: the instrument * * Create a new instance of #AgsSF2Loader. * * Returns: the new #AgsSF2Loader * * Since: 3.0.0 */ AgsSF2Loader* ags_sf2_loader_new(AgsAudio *audio, gchar *filename, gchar *preset, gchar *instrument) { AgsSF2Loader *sf2_loader; sf2_loader = (AgsSF2Loader *) g_object_new(AGS_TYPE_SF2_LOADER, "audio", audio, "filename", filename, "preset", preset, "instrument", instrument, NULL); return(sf2_loader); } gsequencer-3.1.3/ags/audio/thread/ags_audio_thread.c0000644000175000017500000007170213616617253017371 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_audio_thread_class_init(AgsAudioThreadClass *audio_thread); void ags_audio_thread_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_thread_init(AgsAudioThread *audio_thread); void ags_audio_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_thread_dispose(GObject *gobject); void ags_audio_thread_finalize(GObject *gobject); void ags_audio_thread_start(AgsThread *thread); void ags_audio_thread_run(AgsThread *thread); void ags_audio_thread_stop(AgsThread *thread); void ags_audio_thread_play_channel_super_threaded(AgsAudioThread *audio_thread, AgsPlayback *playback); void ags_audio_thread_sync_channel_super_threaded(AgsAudioThread *audio_thread, AgsPlayback *playback); /** * SECTION:ags_audio_thread * @short_description: audio thread * @title: AgsAudioThread * @section_id: * @include: ags/audio/thread/ags_audio_thread.h * * The #AgsAudioThread acts as audio output thread to soundcard. */ enum{ PROP_0, PROP_DEFAULT_OUTPUT_SOUNDCARD, PROP_AUDIO, PROP_SOUND_SCOPE, }; static gpointer ags_audio_thread_parent_class = NULL; static AgsConnectableInterface *ags_audio_thread_parent_connectable_interface; GType ags_audio_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_thread = 0; static const GTypeInfo ags_audio_thread_info = { sizeof (AgsAudioThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_thread_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_thread_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsAudioThread", &ags_audio_thread_info, 0); g_type_add_interface_static(ags_type_audio_thread, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_thread); } return g_define_type_id__volatile; } void ags_audio_thread_class_init(AgsAudioThreadClass *audio_thread) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_audio_thread_parent_class = g_type_class_peek_parent(audio_thread); /* GObject */ gobject = (GObjectClass *) audio_thread; gobject->set_property = ags_audio_thread_set_property; gobject->get_property = ags_audio_thread_get_property; gobject->dispose = ags_audio_thread_dispose; gobject->finalize = ags_audio_thread_finalize; /* properties */ /** * AgsAudioThread:default-output-soundcard: * * The assigned default soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-output-soundcard", i18n_pspec("default output soundcard assigned to"), i18n_pspec("The default output AgsSoundcard it is assigned to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_OUTPUT_SOUNDCARD, param_spec); /** * AgsAudioThread:audio: * * The assigned #AgsAudio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio assigned to"), i18n_pspec("The AgsAudio it is assigned to"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /* AgsThread */ thread = (AgsThreadClass *) audio_thread; thread->start = ags_audio_thread_start; thread->run = ags_audio_thread_run; thread->stop = ags_audio_thread_stop; } void ags_audio_thread_connectable_interface_init(AgsConnectableInterface *connectable) { ags_audio_thread_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_audio_thread_init(AgsAudioThread *audio_thread) { AgsThread *thread; AgsConfig *config; gdouble frequency; guint samplerate; guint buffer_size; thread = (AgsThread *) audio_thread; ags_thread_set_flags(thread, (AGS_THREAD_START_SYNCED_FREQ | AGS_THREAD_IMMEDIATE_SYNC)); config = ags_config_get_instance(); samplerate = ags_soundcard_helper_config_get_samplerate(config); buffer_size = ags_soundcard_helper_config_get_buffer_size(config); frequency = ((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_object_set(thread, "frequency", frequency, NULL); g_atomic_int_set(&(audio_thread->status_flags), 0); audio_thread->default_output_soundcard = NULL; /* start */ g_mutex_init(&(audio_thread->wakeup_mutex)); g_cond_init(&(audio_thread->wakeup_cond)); /* sync */ g_mutex_init(&(audio_thread->done_mutex)); g_cond_init(&(audio_thread->done_cond)); /* audio and sound scope */ audio_thread->audio = NULL; audio_thread->sound_scope = -1; audio_thread->sync_thread = NULL; } void ags_audio_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioThread *audio_thread; GRecMutex *thread_mutex; audio_thread = AGS_AUDIO_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_thread); switch(prop_id){ case PROP_DEFAULT_OUTPUT_SOUNDCARD: { GObject *default_output_soundcard; default_output_soundcard = g_value_get_object(value); g_rec_mutex_lock(thread_mutex); if(audio_thread->default_output_soundcard == default_output_soundcard){ g_rec_mutex_unlock(thread_mutex); return; } if(audio_thread->default_output_soundcard != NULL){ g_object_unref(audio_thread->default_output_soundcard); } if(default_output_soundcard != NULL){ g_object_ref(default_output_soundcard); } audio_thread->default_output_soundcard = default_output_soundcard; g_rec_mutex_unlock(thread_mutex); } break; case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(thread_mutex); if(audio_thread->audio == (GObject *) audio){ g_rec_mutex_unlock(thread_mutex); return; } if(audio_thread->audio != NULL){ g_object_unref(G_OBJECT(audio_thread->audio)); } if(audio != NULL){ g_object_ref(G_OBJECT(audio)); } audio_thread->audio = (GObject *) audio; g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioThread *audio_thread; GRecMutex *thread_mutex; audio_thread = AGS_AUDIO_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_thread); switch(prop_id){ case PROP_DEFAULT_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(thread_mutex); g_value_set_object(value, audio_thread->default_output_soundcard); g_rec_mutex_unlock(thread_mutex); } break; case PROP_AUDIO: { g_rec_mutex_lock(thread_mutex); g_value_set_object(value, G_OBJECT(audio_thread->audio)); g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_thread_dispose(GObject *gobject) { AgsAudioThread *audio_thread; audio_thread = AGS_AUDIO_THREAD(gobject); /* soundcard */ if(audio_thread->default_output_soundcard != NULL){ g_object_unref(audio_thread->default_output_soundcard); audio_thread->default_output_soundcard = NULL; } /* audio */ if(audio_thread->audio != NULL){ g_object_unref(audio_thread->audio); audio_thread->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_thread_parent_class)->dispose(gobject); } void ags_audio_thread_finalize(GObject *gobject) { AgsAudioThread *audio_thread; audio_thread = AGS_AUDIO_THREAD(gobject); /* soundcard */ if(audio_thread->default_output_soundcard != NULL){ g_object_unref(audio_thread->default_output_soundcard); } /* audio */ if(audio_thread->audio != NULL){ g_object_unref(audio_thread->audio); } /* call parent */ G_OBJECT_CLASS(ags_audio_thread_parent_class)->finalize(gobject); } void ags_audio_thread_start(AgsThread *thread) { #ifdef AGS_DEBUG g_message("audio thread start"); #endif /* reset status */ ags_audio_thread_set_status_flags(thread, (AGS_AUDIO_THREAD_STATUS_WAIT | AGS_AUDIO_THREAD_STATUS_DONE | AGS_AUDIO_THREAD_STATUS_WAIT_SYNC | AGS_AUDIO_THREAD_STATUS_DONE_SYNC)); AGS_THREAD_CLASS(ags_audio_thread_parent_class)->start(thread); } void ags_audio_thread_run(AgsThread *thread) { AgsAudio *audio; AgsChannel *channel; AgsPlaybackDomain *playback_domain; AgsAudioLoop *audio_loop; AgsAudioThread *audio_thread; GList *output_playback_start, *input_playback_start, *playback; GList *recall_id; gint sound_scope; GRecMutex *thread_mutex; // g_message("do: audio %f", thread->tic_delay); /* real-time setup */ #ifdef AGS_WITH_RT if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP)){ AgsPriority *priority; struct sched_param param; gchar *str; priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP); } #endif audio_loop = thread->parent; if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ return; } audio_thread = AGS_AUDIO_THREAD(thread); thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_object_get(audio_thread, "audio", &audio, NULL); g_object_get(audio, "playback-domain", &playback_domain, NULL); /* start - wait until signaled */ g_rec_mutex_lock(thread_mutex); sound_scope = audio_thread->sound_scope; g_rec_mutex_unlock(thread_mutex); if(sound_scope != AGS_SOUND_SCOPE_PLAYBACK){ g_mutex_lock(&(audio_thread->wakeup_mutex)); if(ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT)){ ags_audio_thread_unset_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE); while(ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT) && !ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE)){ g_cond_wait(&(audio_thread->wakeup_cond), &(audio_thread->wakeup_mutex)); } } ags_audio_thread_set_status_flags(audio_thread, (AGS_AUDIO_THREAD_STATUS_WAIT | AGS_AUDIO_THREAD_STATUS_DONE)); g_mutex_unlock(&(audio_thread->wakeup_mutex)); } /* emit tact callback */ // ags_audio_tact(audio); // g_message("audio thread run"); /* * do audio processing */ // g_message("audio thread"); /* input */ g_rec_mutex_lock(thread_mutex); sound_scope = audio_thread->sound_scope; g_rec_mutex_unlock(thread_mutex); g_object_get(playback_domain, "input-playback", &input_playback_start, NULL); playback = input_playback_start; while(playback != NULL){ if(ags_playback_test_flags(playback->data, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ ags_audio_thread_play_channel_super_threaded(audio_thread, playback->data); }else{ g_object_get(playback->data, "channel", &channel, NULL); g_object_unref(channel); if(sound_scope >= 0){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK || ags_playback_get_recall_id((AgsPlayback *) playback, sound_scope) == NULL){ playback = playback->next; continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } }else{ for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK || ags_playback_get_recall_id((AgsPlayback *) playback, sound_scope) == NULL){ continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } } } } playback = playback->next; } /* output */ g_rec_mutex_lock(thread_mutex); sound_scope = audio_thread->sound_scope; g_rec_mutex_unlock(thread_mutex); g_object_get(playback_domain, "output-playback", &output_playback_start, NULL); playback = output_playback_start; while(playback != NULL){ if(ags_playback_test_flags(playback->data, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ ags_audio_thread_play_channel_super_threaded(audio_thread, playback->data); }else{ g_object_get(playback->data, "channel", &channel, NULL); g_object_unref(channel); if(sound_scope >= 0){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK || ags_playback_get_recall_id((AgsPlayback *) playback->data, sound_scope) == NULL){ playback = playback->next; continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RESET | AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } }else{ for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK || ags_playback_get_recall_id((AgsPlayback *) playback->data, sound_scope) == NULL){ continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RESET | AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } } } } playback = playback->next; } /* * wait to be completed */ g_rec_mutex_lock(thread_mutex); sound_scope = audio_thread->sound_scope; g_rec_mutex_unlock(thread_mutex); if(sound_scope != AGS_SOUND_SCOPE_PLAYBACK){ /* input */ playback = input_playback_start; while(playback != NULL){ if(ags_playback_test_flags(playback->data, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ ags_audio_thread_sync_channel_super_threaded(audio_thread, playback->data); } playback = playback->next; } /* output */ playback = output_playback_start; while(playback != NULL){ if(ags_playback_test_flags(playback->data, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ ags_audio_thread_sync_channel_super_threaded(audio_thread, playback->data); } playback = playback->next; } } g_list_free_full(input_playback_start, g_object_unref); g_list_free_full(output_playback_start, g_object_unref); g_list_free(audio_thread->sync_thread); audio_thread->sync_thread = NULL; /* sync */ if(sound_scope != AGS_SOUND_SCOPE_PLAYBACK){ g_mutex_lock(&(audio_thread->done_mutex)); ags_audio_thread_unset_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT_SYNC); if(!ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE_SYNC)){ g_cond_signal(&(audio_thread->done_cond)); } g_mutex_unlock(&(audio_thread->done_mutex)); } /* unref */ g_object_unref(audio); g_object_unref(playback_domain); } void ags_audio_thread_stop(AgsThread *thread) { AgsAudioThread *audio_thread; AgsThread *child, *next_child; if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING)){ return; } #ifdef AGS_DEBUG g_message("audio thread stop"); #endif audio_thread = AGS_AUDIO_THREAD(thread); /* call parent */ AGS_THREAD_CLASS(ags_audio_thread_parent_class)->stop(thread); /* stop channel */ child = ags_thread_children(thread); while(child != NULL){ ags_thread_stop(child); /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } /* ensure synced */ g_mutex_lock(&(audio_thread->done_mutex)); ags_audio_thread_unset_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT_SYNC); if(!ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE_SYNC)){ g_cond_signal(&(audio_thread->done_cond)); } g_mutex_unlock(&(audio_thread->done_mutex)); } void ags_audio_thread_play_channel_super_threaded(AgsAudioThread *audio_thread, AgsPlayback *playback) { AgsChannel *channel; AgsChannelThread *channel_thread; AgsThread *thread; GList *recall_id; gint sound_scope; GRecMutex *thread_mutex; thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_thread); g_object_get(playback, "channel", &channel, NULL); g_rec_mutex_lock(thread_mutex); sound_scope = audio_thread->sound_scope; g_rec_mutex_unlock(thread_mutex); if(sound_scope >= 0){ if(sound_scope != AGS_SOUND_SCOPE_PLAYBACK){ if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ thread = ags_playback_get_channel_thread(playback, sound_scope); if(thread != NULL){ channel_thread = (AgsChannelThread *) thread; if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ /* wakeup wait */ g_mutex_lock(&(channel_thread->wakeup_mutex)); ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT); if(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE)){ g_cond_signal(&(channel_thread->wakeup_cond)); } g_mutex_unlock(&(channel_thread->wakeup_mutex)); audio_thread->sync_thread = g_list_prepend(audio_thread->sync_thread, channel_thread); } } g_list_free_full(recall_id, g_object_unref); } } }else{ for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK){ continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ thread = ags_playback_get_channel_thread(playback, sound_scope); if(thread != NULL){ channel_thread = (AgsChannelThread *) thread; if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ /* wakeup wait */ g_mutex_lock(&(channel_thread->wakeup_mutex)); ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT); if(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE)){ g_cond_signal(&(channel_thread->wakeup_cond)); } g_mutex_unlock(&(channel_thread->wakeup_mutex)); audio_thread->sync_thread = g_list_prepend(audio_thread->sync_thread, channel_thread); } } g_list_free_full(recall_id, g_object_unref); } } } /* unref */ g_object_unref(channel); } void ags_audio_thread_sync_channel_super_threaded(AgsAudioThread *audio_thread, AgsPlayback *playback) { AgsChannel *channel; AgsChannelThread *channel_thread; AgsThread *thread; GList *recall_id; gint sound_scope; GRecMutex *thread_mutex; thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_thread); g_rec_mutex_lock(thread_mutex); sound_scope = audio_thread->sound_scope; g_rec_mutex_unlock(thread_mutex); g_object_get(playback, "channel", &channel, NULL); if(sound_scope >= 0){ if(sound_scope != AGS_SOUND_SCOPE_PLAYBACK){ if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ thread = ags_playback_get_channel_thread(playback, sound_scope); if(thread != NULL){ channel_thread = (AgsChannelThread *) thread; g_mutex_lock(&(channel_thread->done_mutex)); if(g_list_find(audio_thread->sync_thread, channel_thread) != NULL && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ if(ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC)){ ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC); while(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC) && ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC)){ g_cond_wait(&(channel_thread->done_cond), &(channel_thread->done_mutex)); } } } ags_channel_thread_set_status_flags(channel_thread, (AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC | AGS_CHANNEL_THREAD_STATUS_DONE_SYNC)); g_mutex_unlock(&(channel_thread->done_mutex)); } g_list_free_full(recall_id, g_object_unref); } } }else{ for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK){ continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ thread = ags_playback_get_channel_thread(playback, sound_scope); if(thread != NULL){ channel_thread = (AgsChannelThread *) thread; g_mutex_lock(&(channel_thread->done_mutex)); if(g_list_find(audio_thread->sync_thread, channel_thread) != NULL && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ if(ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC)){ ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC); while(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC) && ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC)){ g_cond_wait(&(channel_thread->done_cond), &(channel_thread->done_mutex)); } } } ags_channel_thread_set_status_flags(channel_thread, (AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC | AGS_CHANNEL_THREAD_STATUS_DONE_SYNC)); g_mutex_unlock(&(channel_thread->done_mutex)); } g_list_free_full(recall_id, g_object_unref); } } } /* unref */ g_object_unref(channel); } /** * ags_audio_thread_test_status_flags: * @audio_thread: the #AgsAudioThread * @status_flags: status flags * * Test @status_flags of @audio_thread. * * Returns: %TRUE if status flags set, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audio_thread_test_status_flags(AgsAudioThread *audio_thread, guint status_flags) { gboolean retval; if(!AGS_IS_AUDIO_THREAD(audio_thread)){ return(FALSE); } retval = ((status_flags & (g_atomic_int_get(&(audio_thread->status_flags)))) != 0) ? TRUE: FALSE; return(retval); } /** * ags_audio_thread_set_status_flags: * @audio_thread: the #AgsAudioThread * @status_flags: status flags * * Set status flags. * * Since: 3.0.0 */ void ags_audio_thread_set_status_flags(AgsAudioThread *audio_thread, guint status_flags) { if(!AGS_IS_AUDIO_THREAD(audio_thread)){ return; } g_atomic_int_or(&(audio_thread->status_flags), status_flags); } /** * ags_audio_thread_unset_status_flags: * @audio_thread: the #AgsAudioThread * @status_flags: status flags * * Unset status flags. * * Since: 3.0.0 */ void ags_audio_thread_unset_status_flags(AgsAudioThread *audio_thread, guint status_flags) { if(!AGS_IS_AUDIO_THREAD(audio_thread)){ return; } g_atomic_int_and(&(audio_thread->status_flags), (~status_flags)); } /** * ags_audio_thread_set_sound_scope: * @audio_thread: the #AgsAudioThread * @sound_scope: the sound scope * * Set sound scope. * * Since: 3.0.0 */ void ags_audio_thread_set_sound_scope(AgsAudioThread *audio_thread, gint sound_scope) { GRecMutex *thread_mutex; if(!AGS_IS_AUDIO_THREAD(audio_thread)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_thread); /* set scope */ g_rec_mutex_lock(thread_mutex); audio_thread->sound_scope = sound_scope; g_rec_mutex_unlock(thread_mutex); } /** * ags_audio_thread_new: * @default_output_soundcard: the #GObject * @audio: the #AgsAudio * * Create a new instance of #AgsAudioThread. * * Returns: the new #AgsAudioThread * * Since: 3.0.0 */ AgsAudioThread* ags_audio_thread_new(GObject *default_output_soundcard, GObject *audio) { AgsAudioThread *audio_thread; audio_thread = (AgsAudioThread *) g_object_new(AGS_TYPE_AUDIO_THREAD, "default-output-soundcard", default_output_soundcard, "audio", audio, NULL); return(audio_thread); } gsequencer-3.1.3/ags/audio/thread/ags_audio_loop.c0000644000175000017500000011460713616617253017075 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_audio_loop_class_init(AgsAudioLoopClass *audio_loop); void ags_audio_loop_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_loop_main_loop_interface_init(AgsMainLoopInterface *main_loop); void ags_audio_loop_init(AgsAudioLoop *audio_loop); void ags_audio_loop_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_loop_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_loop_dispose(GObject *gobject); void ags_audio_loop_finalize(GObject *gobject); GRecMutex* ags_audio_loop_get_tree_lock(AgsMainLoop *main_loop); void ags_audio_loop_set_syncing(AgsMainLoop *main_loop, gboolean is_syncing); gboolean ags_audio_loop_is_syncing(AgsMainLoop *main_loop); void ags_audio_loop_set_critical_region(AgsMainLoop *main_loop, gboolean is_critical_region); gboolean ags_audio_loop_is_critical_region(AgsMainLoop *main_loop); void ags_audio_loop_inc_queued_critical_region(AgsMainLoop *main_loop); void ags_audio_loop_dec_queued_critical_region(AgsMainLoop *main_loop); guint ags_audio_loop_test_queued_critical_region(AgsMainLoop *main_loop); void ags_audio_loop_change_frequency(AgsMainLoop *main_loop, gdouble frequency); void ags_audio_loop_start(AgsThread *thread); void ags_audio_loop_run(AgsThread *thread); void ags_audio_loop_play_channel(AgsAudioLoop *audio_loop); void ags_audio_loop_play_channel_super_threaded(AgsAudioLoop *audio_loop, AgsPlayback *playback); void ags_audio_loop_sync_channel_super_threaded(AgsAudioLoop *audio_loop, AgsPlayback *playback); void ags_audio_loop_play_audio(AgsAudioLoop *audio_loop); void ags_audio_loop_play_audio_super_threaded(AgsAudioLoop *audio_loop, AgsPlaybackDomain *playback_domain); void ags_audio_loop_sync_audio_super_threaded(AgsAudioLoop *audio_loop, AgsPlaybackDomain *playback_domain); /** * SECTION:ags_audio_loop * @short_description: audio loop * @title: AgsAudioLoop * @section_id: * @include: ags/audio/thread/ags_audio_loop.h * * The #AgsAudioLoop is suitable as #AgsMainLoop and does * audio processing. */ enum{ PROP_0, PROP_PLAY_CHANNEL, PROP_PLAY_AUDIO, }; static gpointer ags_audio_loop_parent_class = NULL; static AgsConnectableInterface *ags_audio_loop_parent_connectable_interface; GType ags_audio_loop_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_loop = 0; static const GTypeInfo ags_audio_loop_info = { sizeof (AgsAudioLoopClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_loop_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioLoop), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_loop_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_loop_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_main_loop_interface_info = { (GInterfaceInitFunc) ags_audio_loop_main_loop_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_loop = g_type_register_static(AGS_TYPE_THREAD, "AgsAudioLoop", &ags_audio_loop_info, 0); g_type_add_interface_static(ags_type_audio_loop, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_audio_loop, AGS_TYPE_MAIN_LOOP, &ags_main_loop_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_loop); } return g_define_type_id__volatile; } void ags_audio_loop_class_init(AgsAudioLoopClass *audio_loop) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_audio_loop_parent_class = g_type_class_peek_parent(audio_loop); /* GObject */ gobject = (GObjectClass *) audio_loop; gobject->set_property = ags_audio_loop_set_property; gobject->get_property = ags_audio_loop_get_property; gobject->dispose = ags_audio_loop_dispose; gobject->finalize = ags_audio_loop_finalize; /* properties */ /** * AgsAudioLoop:play-channel: (type GList(AgsPlayback)) (transfer full) * * An #AgsChannel to add for playback. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("play-channel", i18n_pspec("channel to run"), i18n_pspec("A channel to run"), G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAY_CHANNEL, param_spec); /** * AgsAudioLoop:play-audio: (type GList(AgsPlaybackDomain)) (transfer full) * * An #AgsAudio to add for playback. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("play-audio", i18n_pspec("audio to run"), i18n_pspec("A audio to run"), G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAY_AUDIO, param_spec); /* AgsThread */ thread = (AgsThreadClass *) audio_loop; thread->start = ags_audio_loop_start; thread->run = ags_audio_loop_run; /* AgsAudioLoop */ } void ags_audio_loop_connectable_interface_init(AgsConnectableInterface *connectable) { ags_audio_loop_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_audio_loop_main_loop_interface_init(AgsMainLoopInterface *main_loop) { main_loop->get_tree_lock = ags_audio_loop_get_tree_lock; main_loop->set_syncing = ags_audio_loop_set_syncing; main_loop->is_syncing = ags_audio_loop_is_syncing; main_loop->set_critical_region = ags_audio_loop_set_critical_region; main_loop->is_critical_region = ags_audio_loop_is_critical_region; main_loop->inc_queued_critical_region = ags_audio_loop_inc_queued_critical_region; main_loop->dec_queued_critical_region = ags_audio_loop_dec_queued_critical_region; main_loop->test_queued_critical_region = ags_audio_loop_test_queued_critical_region; main_loop->change_frequency = ags_audio_loop_change_frequency; } void ags_audio_loop_init(AgsAudioLoop *audio_loop) { AgsThread *thread; AgsConfig *config; gdouble frequency; guint samplerate; guint buffer_size; guint i; thread = (AgsThread *) audio_loop; ags_thread_set_flags(thread, AGS_THREAD_TIME_ACCOUNTING); /* calculate frequency */ config = ags_config_get_instance(); samplerate = ags_soundcard_helper_config_get_samplerate(config); buffer_size = ags_soundcard_helper_config_get_buffer_size(config); frequency = ((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_object_set(thread, "frequency", frequency, NULL); audio_loop->flags = 0; /* tree lock mutex */ g_rec_mutex_init(&(audio_loop->tree_lock)); ags_main_loop_set_syncing(AGS_MAIN_LOOP(audio_loop), FALSE); ags_main_loop_set_critical_region(AGS_MAIN_LOOP(audio_loop), FALSE); g_atomic_int_set(&(audio_loop->critical_region_ref), 0); /* recall related lists */ audio_loop->play_channel_ref = 0; audio_loop->play_channel = NULL; audio_loop->play_audio_ref = 0; audio_loop->play_audio = NULL; audio_loop->sync_thread = NULL; } void ags_audio_loop_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioLoop *audio_loop; GRecMutex *thread_mutex; audio_loop = AGS_AUDIO_LOOP(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); switch(prop_id){ case PROP_PLAY_CHANNEL: { AgsPlayback *playback; playback = (AgsPlayback *) g_value_get_pointer(value); g_rec_mutex_lock(thread_mutex); if(AGS_IS_PLAYBACK(playback) && g_list_find(audio_loop->play_channel, playback) == NULL){ g_object_ref(playback); audio_loop->play_channel = g_list_prepend(audio_loop->play_channel, playback); audio_loop->play_channel_ref = audio_loop->play_channel_ref + 1; } g_rec_mutex_unlock(thread_mutex); } break; case PROP_PLAY_AUDIO: { AgsPlaybackDomain *playback_domain; playback_domain = (AgsPlaybackDomain *) g_value_get_pointer(value); g_rec_mutex_lock(thread_mutex); if(AGS_IS_PLAYBACK_DOMAIN(playback_domain) && g_list_find(audio_loop->play_audio, playback_domain) == NULL){ audio_loop->play_audio = g_list_prepend(audio_loop->play_audio, playback_domain); g_object_ref(playback_domain); audio_loop->play_audio_ref = audio_loop->play_audio_ref + 1; } g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_loop_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioLoop *audio_loop; GRecMutex *thread_mutex; audio_loop = AGS_AUDIO_LOOP(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); switch(prop_id){ case PROP_PLAY_CHANNEL: { g_rec_mutex_lock(thread_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_loop->play_channel, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(thread_mutex); } break; case PROP_PLAY_AUDIO: { g_rec_mutex_lock(thread_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_loop->play_audio, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_loop_dispose(GObject *gobject) { AgsAudioLoop *audio_loop; audio_loop = AGS_AUDIO_LOOP(gobject); /* unref AgsPlayback lists */ if(audio_loop->play_channel != NULL){ g_list_free_full(audio_loop->play_channel, g_object_unref); audio_loop->play_channel = NULL; } if(audio_loop->play_audio != NULL){ g_list_free_full(audio_loop->play_audio, g_object_unref); audio_loop->play_audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_loop_parent_class)->dispose(gobject); } void ags_audio_loop_finalize(GObject *gobject) { AgsAudioLoop *audio_loop; audio_loop = AGS_AUDIO_LOOP(gobject); /* unref AgsPlayback lists */ g_list_free_full(audio_loop->play_channel, g_object_unref); g_list_free_full(audio_loop->play_audio, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_audio_loop_parent_class)->finalize(gobject); } GRecMutex* ags_audio_loop_get_tree_lock(AgsMainLoop *main_loop) { GRecMutex *tree_lock; /* get tree lock mutex */ tree_lock = &(AGS_AUDIO_LOOP(main_loop)->tree_lock); return(tree_lock); } void ags_audio_loop_set_syncing(AgsMainLoop *main_loop, gboolean is_syncing) { AgsAudioLoop *audio_loop; audio_loop = AGS_AUDIO_LOOP(main_loop); /* set syncing */ g_atomic_int_set(&(audio_loop->is_syncing), is_syncing); } gboolean ags_audio_loop_is_syncing(AgsMainLoop *main_loop) { AgsAudioLoop *audio_loop; gboolean is_syncing; audio_loop = AGS_AUDIO_LOOP(main_loop); /* is syncing */ is_syncing = g_atomic_int_get(&(audio_loop->is_syncing)); return(is_syncing); } void ags_audio_loop_set_critical_region(AgsMainLoop *main_loop, gboolean is_critical_region) { AgsAudioLoop *audio_loop; audio_loop = AGS_AUDIO_LOOP(main_loop); /* set critical region */ g_atomic_int_set(&(audio_loop->is_critical_region), is_critical_region); } gboolean ags_audio_loop_is_critical_region(AgsMainLoop *main_loop) { AgsAudioLoop *audio_loop; gboolean is_critical_region; audio_loop = AGS_AUDIO_LOOP(main_loop); /* is critical region */ is_critical_region = g_atomic_int_get(&(audio_loop->is_critical_region)); return(is_critical_region); } void ags_audio_loop_inc_queued_critical_region(AgsMainLoop *main_loop) { AgsAudioLoop *audio_loop; audio_loop = AGS_AUDIO_LOOP(main_loop); /* increment critical region */ g_atomic_int_inc(&(audio_loop->critical_region_ref)); } void ags_audio_loop_dec_queued_critical_region(AgsMainLoop *main_loop) { AgsAudioLoop *audio_loop; audio_loop = AGS_AUDIO_LOOP(main_loop); /* decrement critical region */ g_atomic_int_dec_and_test(&(audio_loop->critical_region_ref)); } guint ags_audio_loop_test_queued_critical_region(AgsMainLoop *main_loop) { AgsAudioLoop *audio_loop; guint critical_region_ref; audio_loop = AGS_AUDIO_LOOP(main_loop); /* set critical region */ critical_region_ref = g_atomic_int_get(&(audio_loop->is_critical_region)); return(critical_region_ref); } void ags_audio_loop_change_frequency(AgsMainLoop *main_loop, gdouble frequency) { AgsThread *audio_loop; AgsThread *thread, *next_thread; audio_loop = AGS_THREAD(main_loop); g_object_set(audio_loop, "frequency", frequency, NULL); /* reset soundcard thread */ thread = ags_thread_find_type(audio_loop, AGS_TYPE_SOUNDCARD_THREAD); while(thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(thread)){ g_object_set(thread, "frequency", frequency, NULL); } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } /* reset sequencer thread */ thread = ags_thread_find_type(audio_loop, AGS_TYPE_SEQUENCER_THREAD); while(thread != NULL){ if(AGS_IS_SEQUENCER_THREAD(thread)){ g_object_set(thread, "frequency", frequency, NULL); } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } /* reset export thread */ thread = ags_thread_find_type(audio_loop, AGS_TYPE_EXPORT_THREAD); while(thread != NULL){ if(AGS_IS_EXPORT_THREAD(thread)){ g_object_set(thread, "frequency", frequency, NULL); } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } /* reset audio thread */ thread = ags_thread_find_type(audio_loop, AGS_TYPE_AUDIO_THREAD); while(thread != NULL){ if(AGS_IS_AUDIO_THREAD(thread)){ AgsThread *child, *next_child; g_object_set(thread, "frequency", frequency, NULL); /* reset channel thread */ child = ags_thread_find_type(audio_loop, AGS_TYPE_CHANNEL_THREAD); while(child != NULL){ g_object_set(child, "frequency", frequency, NULL); /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } } void ags_audio_loop_start(AgsThread *thread) { AgsAudioLoop *audio_loop; GRecMutex *thread_mutex; audio_loop = AGS_AUDIO_LOOP(thread); /* set status synced */ ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_SYNCED); /* call parent */ AGS_THREAD_CLASS(ags_audio_loop_parent_class)->start(thread); } void ags_audio_loop_run(AgsThread *thread) { AgsAudioLoop *audio_loop; GList *start_queue; guint play_audio_ref, play_channel_ref; GRecMutex *thread_mutex; // g_message("do: audio loop %f", thread->tic_delay); audio_loop = AGS_AUDIO_LOOP(thread); thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* real-time setup */ #ifdef AGS_WITH_RT if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP)){ AgsPriority *priority; struct sched_param param; gchar *str; priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP); } #endif /* get some fields */ g_rec_mutex_lock(thread_mutex); start_queue = thread->start_queue; play_audio_ref = audio_loop->play_audio_ref; play_channel_ref = audio_loop->play_channel_ref; g_rec_mutex_unlock(thread_mutex); /* play channel */ if(ags_audio_loop_test_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_CHANNEL)){ ags_audio_loop_play_channel(audio_loop); if(play_channel_ref == 0 && start_queue == NULL){ ags_audio_loop_unset_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_CHANNEL); } } /* play audio */ if(ags_audio_loop_test_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_AUDIO)){ ags_audio_loop_play_audio(audio_loop); if(play_audio_ref == 0 && start_queue == NULL){ ags_audio_loop_unset_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_AUDIO); } } /* decide if we stop */ if(play_channel_ref == 0 && play_audio_ref == 0){ AgsThread *soundcard_thread, *next_soundcard_thread; AgsThread *sequencer_thread, *next_sequencer_thread; AgsThread *export_thread, *next_export_thread; gdouble frequency; /* soundcard thread */ soundcard_thread = ags_thread_find_type(thread, AGS_TYPE_SOUNDCARD_THREAD); while(soundcard_thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(soundcard_thread)){ if(ags_thread_test_status_flags(soundcard_thread, AGS_THREAD_STATUS_RUNNING)){ ags_thread_stop(soundcard_thread); } } /* iterate */ next_soundcard_thread = ags_thread_next(soundcard_thread); g_object_unref(soundcard_thread); soundcard_thread = next_soundcard_thread; } /* sequencer thread */ sequencer_thread = ags_thread_find_type(thread, AGS_TYPE_SEQUENCER_THREAD); while(sequencer_thread != NULL){ if(AGS_IS_SEQUENCER_THREAD(sequencer_thread)){ if(ags_thread_test_status_flags(sequencer_thread, AGS_THREAD_STATUS_RUNNING)){ ags_thread_stop(sequencer_thread); } } /* iterate */ next_sequencer_thread = ags_thread_next(sequencer_thread); g_object_unref(sequencer_thread); sequencer_thread = next_sequencer_thread; } /* export thread */ export_thread = ags_thread_find_type(thread, AGS_TYPE_EXPORT_THREAD); while(export_thread != NULL){ if(AGS_IS_EXPORT_THREAD(export_thread)){ if(ags_thread_test_status_flags(export_thread, AGS_THREAD_STATUS_RUNNING)){ ags_thread_stop(export_thread); } } /* iterate */ next_export_thread = ags_thread_next(export_thread); g_object_unref(export_thread); export_thread = next_export_thread; } g_object_get(audio_loop, "frequency", &frequency, NULL); if(!ags_thread_test_flags(audio_loop, AGS_THREAD_TIME_ACCOUNTING)){ g_usleep((guint) (G_USEC_PER_SEC / frequency) - 4); } } } /** * ags_audio_loop_play_channel: * @audio_loop: an #AgsAudioLoop * * Invokes ags_channel_recursive_run_stage() for all scopes containing #AgsRecallID. * * Since: 3.0.0 */ void ags_audio_loop_play_channel(AgsAudioLoop *audio_loop) { AgsPlayback *playback; AgsChannel *channel; GList *start_play_channel, *play_channel; GList *recall_id; gint sound_scope; GRecMutex *thread_mutex; thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); /* get play channel */ g_rec_mutex_lock(thread_mutex); start_play_channel = g_list_copy_deep(audio_loop->play_channel, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(thread_mutex); if(start_play_channel == NULL){ if(ags_audio_loop_test_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_CHANNEL_TERMINATING)){ ags_audio_loop_unset_flags(audio_loop, (AGS_AUDIO_LOOP_PLAY_CHANNEL | AGS_AUDIO_LOOP_PLAY_CHANNEL_TERMINATING)); }else{ ags_audio_loop_set_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_CHANNEL_TERMINATING); } } //FIXME:JK: missing else ags_audio_loop_unset_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_CHANNEL_TERMINATING); ags_audio_loop_set_flags(audio_loop, AGS_AUDIO_LOOP_PLAYING_CHANNEL); /* run the 3 stages */ play_channel = start_play_channel; while(play_channel != NULL){ playback = (AgsPlayback *) play_channel->data; channel = NULL; g_object_get(playback, "channel", &channel, NULL); /* play */ #if 0 if(ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ /* super threaded */ ags_audio_loop_play_channel_super_threaded(audio_loop, playback); }else{ #endif /* not super threaded */ sound_scope = AGS_SOUND_SCOPE_PLAYBACK; if(ags_playback_get_recall_id(playback, sound_scope) == NULL){ g_object_unref(channel); play_channel = play_channel->next; continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } #if 0 } #endif g_object_unref(channel); /* iterate */ play_channel = play_channel->next; } /* sync channel */ #if 0 play_channel = start_play_channel; while(play_channel != NULL){ playback = (AgsPlayback *) play_channel->data; /* sync */ if(ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ /* super threaded */ ags_audio_loop_sync_channel_super_threaded(audio_loop, playback); } /* iterate */ play_channel = play_channel->next; } #endif g_list_free_full(start_play_channel, g_object_unref); } void ags_audio_loop_play_channel_super_threaded(AgsAudioLoop *audio_loop, AgsPlayback *playback) { AgsChannel *channel; AgsChannelThread *channel_thread; AgsThread *thread; GList *recall_id; gint sound_scope; channel = NULL; g_object_get(playback, "channel", &channel, NULL); g_object_unref(channel); sound_scope = AGS_SOUND_SCOPE_PLAYBACK; if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ thread = ags_playback_get_channel_thread(playback, sound_scope); if(thread != NULL){ channel_thread = (AgsChannelThread *) thread; if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ /* wakeup wait */ g_mutex_lock(&(channel_thread->wakeup_mutex)); ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT); if(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE)){ g_cond_signal(&(channel_thread->wakeup_cond)); } g_mutex_unlock(&(channel_thread->wakeup_mutex)); audio_loop->sync_thread = g_list_prepend(audio_loop->sync_thread, channel_thread); } } g_list_free_full(recall_id, g_object_unref); } } void ags_audio_loop_sync_channel_super_threaded(AgsAudioLoop *audio_loop, AgsPlayback *playback) { AgsChannel *channel; AgsChannelThread *channel_thread; AgsThread *thread; GList *recall_id; gint sound_scope; channel = NULL; g_object_get(playback, "channel", &channel, NULL); g_object_unref(channel); sound_scope = AGS_SOUND_SCOPE_PLAYBACK; if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ thread = ags_playback_get_channel_thread(playback, sound_scope); if(thread != NULL){ channel_thread = (AgsChannelThread *) thread; g_mutex_lock(&(channel_thread->done_mutex)); if(g_list_find(audio_loop->sync_thread, channel_thread) != NULL && ags_thread_test_status_flags(channel_thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(channel_thread, AGS_THREAD_STATUS_SYNCED)){ if(ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC)){ ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC); while(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC) && ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC)){ g_cond_wait(&(channel_thread->done_cond), &(channel_thread->done_mutex)); } } } ags_channel_thread_set_status_flags(channel_thread, (AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC | AGS_CHANNEL_THREAD_STATUS_DONE_SYNC)); g_mutex_unlock(&(channel_thread->done_mutex)); } g_list_free_full(recall_id, g_object_unref); } } /** * ags_audio_loop_play_audio: * @audio_loop: an #AgsAudioLoop * * Invokes ags_audio_recursive_run_stage() for all scopes containing #AgsRecallID. * * Since: 3.0.0 */ void ags_audio_loop_play_audio(AgsAudioLoop *audio_loop) { AgsPlaybackDomain *playback_domain; AgsAudio *audio; GList *start_play_audio, *play_audio; GList *recall_id; gint sound_scope; GRecMutex *thread_mutex; thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); /* get play audio */ g_rec_mutex_lock(thread_mutex); start_play_audio = g_list_copy_deep(audio_loop->play_audio, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(thread_mutex); if(start_play_audio == NULL){ if(ags_audio_loop_test_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_AUDIO_TERMINATING)){ ags_audio_loop_unset_flags(audio_loop, (AGS_AUDIO_LOOP_PLAY_AUDIO | AGS_AUDIO_LOOP_PLAY_AUDIO_TERMINATING)); }else{ ags_audio_loop_set_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_AUDIO_TERMINATING); } } //FIXME:JK: missing else ags_audio_loop_unset_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_AUDIO_TERMINATING); ags_audio_loop_set_flags(audio_loop, AGS_AUDIO_LOOP_PLAYING_AUDIO); /* playing */ play_audio = start_play_audio; while(play_audio != NULL){ playback_domain = (AgsPlaybackDomain *) play_audio->data; audio = NULL; g_object_get(playback_domain, "audio", &audio, NULL); /* play */ if(ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO)){ /* super threaded */ ags_audio_loop_play_audio_super_threaded(audio_loop, playback_domain); }else{ /* not super threaded */ for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK){ continue; } if((recall_id = ags_audio_check_scope(audio, sound_scope)) != NULL){ #if 1 ags_audio_recursive_run_stage(audio, sound_scope, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_audio_recursive_run_stage(audio, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_audio_recursive_run_stage(audio, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_audio_recursive_run_stage(audio, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } } } g_object_unref(audio); /* iterate */ play_audio = play_audio->next; } /* sync audio */ play_audio = start_play_audio; while(play_audio != NULL){ playback_domain = (AgsPlaybackDomain *) play_audio->data; /* sync */ if(ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO)){ ags_audio_loop_sync_audio_super_threaded(audio_loop, playback_domain); } /* iterate */ play_audio = play_audio->next; } g_list_free_full(start_play_audio, g_object_unref); g_list_free(audio_loop->sync_thread); audio_loop->sync_thread = NULL; } /** * ags_audio_loop_play_audio_super_threaded: * @audio_loop: the #AgsAudioLoop * @playback_domain: an #AgsPlaybackDomain * * Play audio super-threaded. * * Since: 3.0.0 */ void ags_audio_loop_play_audio_super_threaded(AgsAudioLoop *audio_loop, AgsPlaybackDomain *playback_domain) { AgsAudio *audio; AgsAudioThread *audio_thread; AgsThread *thread; GList *recall_id; gint sound_scope; audio = NULL; g_object_get(playback_domain, "audio", &audio, NULL); for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK){ continue; } if((recall_id = ags_audio_check_scope(audio, sound_scope)) != NULL){ thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); if(thread != NULL){ audio_thread = (AgsAudioThread *) thread; if(ags_thread_test_status_flags(audio_thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(audio_thread, AGS_THREAD_STATUS_SYNCED)){ /* wakeup wait */ g_mutex_lock(&(audio_thread->wakeup_mutex)); ags_audio_thread_unset_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT); if(!ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE)){ g_cond_signal(&(audio_thread->wakeup_cond)); } g_mutex_unlock(&(audio_thread->wakeup_mutex)); audio_loop->sync_thread = g_list_prepend(audio_loop->sync_thread, audio_thread); } } g_list_free_full(recall_id, g_object_unref); } } g_object_unref(audio); } /** * ags_audio_loop_sync_audio_super_threaded: * @audio_loop: the #AgsAudioLoop * @playback_domain: an #AgsPlaybackDomain * * Sync audio super-threaded. * * Since: 3.0.0 */ void ags_audio_loop_sync_audio_super_threaded(AgsAudioLoop *audio_loop, AgsPlaybackDomain *playback_domain) { AgsAudio *audio; AgsAudioThread *audio_thread; AgsThread *thread; GList *recall_id; gint sound_scope; audio = NULL; g_object_get(playback_domain, "audio", &audio, NULL); for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK){ continue; } if((recall_id = ags_audio_check_scope(audio, sound_scope)) != NULL){ thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); if(thread != NULL){ audio_thread = (AgsAudioThread *) thread; if(g_list_find(audio_loop->sync_thread, audio_thread) != NULL && ags_thread_test_status_flags(audio_thread, AGS_THREAD_STATUS_RUNNING) && ags_thread_test_status_flags(audio_thread, AGS_THREAD_STATUS_SYNCED)){ g_mutex_lock(&(audio_thread->done_mutex)); if(ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT_SYNC)){ ags_audio_thread_unset_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE_SYNC); while(!ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_DONE_SYNC) && ags_audio_thread_test_status_flags(audio_thread, AGS_AUDIO_THREAD_STATUS_WAIT_SYNC)){ g_cond_wait(&(audio_thread->done_cond), &(audio_thread->done_mutex)); } } ags_audio_thread_set_status_flags(audio_thread, (AGS_AUDIO_THREAD_STATUS_WAIT_SYNC | AGS_AUDIO_THREAD_STATUS_DONE_SYNC)); g_mutex_unlock(&(audio_thread->done_mutex)); } } g_list_free_full(recall_id, g_object_unref); } } g_object_unref(audio); } /** * ags_audio_loop_test_flags: * @audio_loop: the #AgsAudioLoop * @flags: the flags * * Test @flags to be set on @audio_loop. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_loop_test_flags(AgsAudioLoop *audio_loop, guint flags) { gboolean retval; GRecMutex *audio_loop_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop)){ return(FALSE); } /* get audio loop mutex */ audio_loop_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); /* test flags */ g_rec_mutex_lock(audio_loop_mutex); retval = ((flags & (audio_loop->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_loop_mutex); return(retval); } /** * ags_audio_loop_set_flags: * @audio_loop: the #AgsAudioLoop * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_audio_loop_set_flags(AgsAudioLoop *audio_loop, guint flags) { GRecMutex *audio_loop_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop)){ return; } /* get audio loop mutex */ audio_loop_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); /* set flags */ g_rec_mutex_lock(audio_loop_mutex); audio_loop->flags |= flags; g_rec_mutex_unlock(audio_loop_mutex); } /** * ags_audio_loop_unset_flags: * @audio_loop: the #AgsAudioLoop * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_audio_loop_unset_flags(AgsAudioLoop *audio_loop, guint flags) { GRecMutex *audio_loop_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop)){ return; } /* get audio loop mutex */ audio_loop_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); /* unset flags */ g_rec_mutex_lock(audio_loop_mutex); audio_loop->flags &= (~flags); g_rec_mutex_unlock(audio_loop_mutex); } /** * ags_audio_loop_add_audio: * @audio_loop: the #AgsAudioLoop * @audio: an #AgsAudio * * Add audio for playback. * * Since: 3.0.0 */ void ags_audio_loop_add_audio(AgsAudioLoop *audio_loop, GObject *audio) { AgsPlaybackDomain *playback_domain; GRecMutex *thread_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop) || !AGS_IS_AUDIO(audio)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); g_object_get(audio, "playback-domain", &playback_domain, NULL); g_rec_mutex_lock(thread_mutex); if(g_list_find(audio_loop->play_audio, playback_domain) == NULL){ audio_loop->play_audio = g_list_prepend(audio_loop->play_audio, playback_domain); audio_loop->play_audio_ref = audio_loop->play_audio_ref + 1; }else{ if(playback_domain != NULL){ g_object_unref(playback_domain); } } g_rec_mutex_unlock(thread_mutex); } /** * ags_audio_loop_remove_audio: * @audio_loop: the #AgsAudioLoop * @audio: an #AgsAudio * * Remove audio of playback. * * Since: 3.0.0 */ void ags_audio_loop_remove_audio(AgsAudioLoop *audio_loop, GObject *audio) { AgsPlaybackDomain *playback_domain; GRecMutex *thread_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop) || !AGS_IS_AUDIO(audio)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); g_object_get(audio, "playback-domain", &playback_domain, NULL); g_rec_mutex_lock(thread_mutex); if(g_list_find(audio_loop->play_audio, playback_domain) != NULL){ audio_loop->play_audio = g_list_remove(audio_loop->play_audio, playback_domain); audio_loop->play_audio_ref = audio_loop->play_audio_ref - 1; g_object_unref(playback_domain); } g_rec_mutex_unlock(thread_mutex); if(playback_domain != NULL){ g_object_unref(playback_domain); } } /** * ags_audio_loop_add_channel: * @audio_loop: the #AgsAudioLoop * @channel: an #AgsChannel * * Add channel for playback. * * Since: 3.0.0 */ void ags_audio_loop_add_channel(AgsAudioLoop *audio_loop, GObject *channel) { AgsPlayback *playback; GRecMutex *thread_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop) || !AGS_IS_CHANNEL(channel)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); g_object_get(channel, "playback", &playback, NULL); g_rec_mutex_lock(thread_mutex); if(g_list_find(audio_loop->play_channel, playback) == NULL){ audio_loop->play_channel = g_list_prepend(audio_loop->play_channel, playback); audio_loop->play_channel_ref = audio_loop->play_channel_ref + 1; }else{ if(playback != NULL){ g_object_unref(playback); } } g_rec_mutex_unlock(thread_mutex); } /** * ags_audio_loop_remove_channel: * @audio_loop: the #AgsAudioLoop * @channel: an #AgsChannel * * Remove channel of playback. * * Since: 3.0.0 */ void ags_audio_loop_remove_channel(AgsAudioLoop *audio_loop, GObject *channel) { AgsPlayback *playback; GRecMutex *thread_mutex; if(!AGS_IS_AUDIO_LOOP(audio_loop) || !AGS_IS_CHANNEL(channel)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(audio_loop); g_object_get(channel, "playback", &playback, NULL); g_rec_mutex_lock(thread_mutex); if(g_list_find(audio_loop->play_channel, playback) != NULL){ audio_loop->play_channel = g_list_remove(audio_loop->play_channel, playback); audio_loop->play_channel_ref = audio_loop->play_channel_ref - 1; g_object_unref(playback); } g_rec_mutex_unlock(thread_mutex); if(playback != NULL){ g_object_unref(playback); } } /** * ags_audio_loop_new: * * Create a new #AgsAudioLoop. * * Returns: the new #AgsAudioLoop * * Since: 3.0.0 */ AgsAudioLoop* ags_audio_loop_new() { AgsAudioLoop *audio_loop; audio_loop = (AgsAudioLoop *) g_object_new(AGS_TYPE_AUDIO_LOOP, NULL); return(audio_loop); } gsequencer-3.1.3/ags/audio/thread/ags_sf2_loader.h0000644000175000017500000000527113607210263016752 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SF2_LOADER_H__ #define __AGS_SF2_LOADER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SF2_LOADER (ags_sf2_loader_get_type()) #define AGS_SF2_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SF2_LOADER, AgsSF2Loader)) #define AGS_SF2_LOADER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SF2_LOADER, AgsSF2LoaderClass)) #define AGS_IS_SF2_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SF2_LOADER)) #define AGS_IS_SF2_LOADER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SF2_LOADER)) #define AGS_SF2_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SF2_LOADER, AgsSF2LoaderClass)) #define AGS_SF2_LOADER_GET_OBJ_MUTEX(obj) (&(((AgsSF2Loader *) obj)->obj_mutex)) typedef struct _AgsSF2Loader AgsSF2Loader; typedef struct _AgsSF2LoaderClass AgsSF2LoaderClass; /** * AgsSF2LoaderFlags: * @AGS_SF2_LOADER_HAS_COMPLETED: has completed * * Enum values to configure SF2 loader. */ typedef enum{ AGS_SF2_LOADER_HAS_COMPLETED = 1, }AgsSF2LoaderFlags; struct _AgsSF2Loader { GObject gobject; guint flags; GRecMutex obj_mutex; GThread *thread; AgsAudio *audio; gchar *filename; gchar *preset; gchar *instrument; AgsAudioContainer *audio_container; }; struct _AgsSF2LoaderClass { GObjectClass gobject; }; GType ags_sf2_loader_get_type(); gboolean ags_sf2_loader_test_flags(AgsSF2Loader *sf2_loader, guint flags); void ags_sf2_loader_set_flags(AgsSF2Loader *sf2_loader, guint flags); void ags_sf2_loader_unset_flags(AgsSF2Loader *sf2_loader, guint flags); void ags_sf2_loader_start(AgsSF2Loader *sf2_loader); AgsSF2Loader* ags_sf2_loader_new(AgsAudio *audio, gchar *filename, gchar *preset, gchar *instrument); G_END_DECLS #endif /*__AGS_SF2_LOADER_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_channel_thread.h0000644000175000017500000000700513607210263017666 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CHANNEL_THREAD_H__ #define __AGS_CHANNEL_THREAD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CHANNEL_THREAD (ags_channel_thread_get_type()) #define AGS_CHANNEL_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CHANNEL_THREAD, AgsChannelThread)) #define AGS_CHANNEL_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CHANNEL_THREAD, AgsChannelThreadClass)) #define AGS_IS_CHANNEL_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CHANNEL_THREAD)) #define AGS_IS_CHANNEL_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CHANNEL_THREAD)) #define AGS_CHANNEL_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CHANNEL_THREAD, AgsChannelThreadClass)) #define AGS_CHANNEL_THREAD_DEFAULT_JIFFIE (ceil(AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK) typedef struct _AgsChannelThread AgsChannelThread; typedef struct _AgsChannelThreadClass AgsChannelThreadClass; /** * AgsChannelThreadFlags: * @AGS_CHANNEL_THREAD_STATUS_DONE: sync done parent thread, initial wait during #AgsThread::run() * @AGS_CHANNEL_THREAD_STATUS_WAIT: sync wait parent thread, initial wait during #AgsThread::run() * @AGS_CHANNEL_THREAD_STATUS_DONE_SYNC: sync done parent thread, signal completed during #AgsThread::run() * @AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC: sync wait parent thread, signal completed during #AgsThread::run() * * Enum values to control the behavior or indicate internal state of #AgsChannelThread by * enable/disable as flags. */ typedef enum{ AGS_CHANNEL_THREAD_STATUS_DONE = 1, AGS_CHANNEL_THREAD_STATUS_WAIT = 1 << 1, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC = 1 << 2, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC = 1 << 3, }AgsChannelThreadFlags; struct _AgsChannelThread { AgsThread thread; volatile guint status_flags; GObject *default_output_soundcard; GMutex wakeup_mutex; GCond wakeup_cond; GMutex done_mutex; GCond done_cond; GObject *channel; gint sound_scope; }; struct _AgsChannelThreadClass { AgsThreadClass thread; }; GType ags_channel_thread_get_type(); gboolean ags_channel_thread_test_status_flags(AgsChannelThread *channel_thread, guint status_flags); void ags_channel_thread_set_status_flags(AgsChannelThread *channel_thread, guint status_flags); void ags_channel_thread_unset_status_flags(AgsChannelThread *channel_thread, guint status_flags); void ags_channel_thread_set_sound_scope(AgsChannelThread *channel_thread, gint sound_scope); AgsChannelThread* ags_channel_thread_new(GObject *default_output_soundcard, GObject *channel); G_END_DECLS #endif /*__AGS_CHANNEL_THREAD_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_sequencer_thread.h0000644000175000017500000000477113607210263020257 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SEQUENCER_THREAD_H__ #define __AGS_SEQUENCER_THREAD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SEQUENCER_THREAD (ags_sequencer_thread_get_type()) #define AGS_SEQUENCER_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SEQUENCER_THREAD, AgsSequencerThread)) #define AGS_SEQUENCER_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SEQUENCER_THREAD, AgsSequencerThreadClass)) #define AGS_IS_SEQUENCER_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SEQUENCER_THREAD)) #define AGS_IS_SEQUENCER_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SEQUENCER_THREAD)) #define AGS_SEQUENCER_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SEQUENCER_THREAD, AgsSequencerThreadClass)) #define AGS_SEQUENCER_THREAD_DEFAULT_JIFFIE (ceil(AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK) typedef struct _AgsSequencerThread AgsSequencerThread; typedef struct _AgsSequencerThreadClass AgsSequencerThreadClass; struct _AgsSequencerThread { AgsThread thread; time_t time_val; GObject *sequencer; AgsThread *timestamp_thread; GError *error; }; struct _AgsSequencerThreadClass { AgsThreadClass thread; void (*interval_timeout)(AgsSequencerThread *sequencer_thread); }; GType ags_sequencer_thread_get_type(); void ags_sequencer_thread_interval_timeout(AgsSequencerThread *sequencer_thread); AgsSequencerThread* ags_sequencer_thread_find_sequencer(AgsSequencerThread *sequencer_thread, GObject *sequencer); AgsSequencerThread* ags_sequencer_thread_new(GObject *sequencer); G_END_DECLS #endif /*__AGS_SEQUENCER_THREAD_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_sequencer_thread.c0000644000175000017500000003340513614062654020255 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_sequencer_thread_class_init(AgsSequencerThreadClass *sequencer_thread); void ags_sequencer_thread_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sequencer_thread_init(AgsSequencerThread *sequencer_thread); void ags_sequencer_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sequencer_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sequencer_thread_connect(AgsConnectable *connectable); void ags_sequencer_thread_disconnect(AgsConnectable *connectable); void ags_sequencer_thread_dispose(GObject *gobject); void ags_sequencer_thread_finalize(GObject *gobject); void ags_sequencer_thread_start(AgsThread *thread); void ags_sequencer_thread_run(AgsThread *thread); void ags_sequencer_thread_stop(AgsThread *thread); void ags_sequencer_stopped_all_callback(AgsAudioLoop *audio_loop, AgsSequencerThread *sequencer_thread); /** * SECTION:ags_sequencer_thread * @short_description: sequencer thread * @title: AgsSequencerThread * @section_id: * @include: ags/thread/ags_sequencer_thread.h * * The #AgsSequencerThread acts as midi input thread. */ enum{ INTERVAL_TIMEOUT, LAST_SIGNAL, }; enum{ PROP_0, PROP_SEQUENCER, }; static gpointer ags_sequencer_thread_parent_class = NULL; static AgsConnectableInterface *ags_sequencer_thread_parent_connectable_interface; static guint sequencer_thread_signals[LAST_SIGNAL]; GType ags_sequencer_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sequencer_thread = 0; static const GTypeInfo ags_sequencer_thread_info = { sizeof (AgsSequencerThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sequencer_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSequencerThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sequencer_thread_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sequencer_thread_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sequencer_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsSequencerThread", &ags_sequencer_thread_info, 0); g_type_add_interface_static(ags_type_sequencer_thread, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sequencer_thread); } return g_define_type_id__volatile; } void ags_sequencer_thread_class_init(AgsSequencerThreadClass *sequencer_thread) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_sequencer_thread_parent_class = g_type_class_peek_parent(sequencer_thread); /* GObject */ gobject = (GObjectClass *) sequencer_thread; gobject->set_property = ags_sequencer_thread_set_property; gobject->get_property = ags_sequencer_thread_get_property; gobject->dispose = ags_sequencer_thread_dispose; gobject->finalize = ags_sequencer_thread_finalize; /** * AgsSequencerThread:sequencer: * * The assigned #AgsSequencer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sequencer", i18n_pspec("sequencer assigned to"), i18n_pspec("The AgsSequencer it is assigned to"), G_TYPE_OBJECT, G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEQUENCER, param_spec); /* AgsThread */ thread = (AgsThreadClass *) sequencer_thread; thread->start = ags_sequencer_thread_start; thread->run = ags_sequencer_thread_run; thread->stop = ags_sequencer_thread_stop; /* AgsSequencerThread */ sequencer_thread->interval_timeout = NULL; /* signals */ sequencer_thread_signals[INTERVAL_TIMEOUT] = g_signal_new("interval-timeout", G_TYPE_FROM_CLASS(sequencer_thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSequencerThreadClass, interval_timeout), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_sequencer_thread_connectable_interface_init(AgsConnectableInterface *connectable) { ags_sequencer_thread_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_sequencer_thread_connect; connectable->disconnect = ags_sequencer_thread_disconnect; } void ags_sequencer_thread_init(AgsSequencerThread *sequencer_thread) { AgsThread *thread; AgsConfig *config; gdouble frequency; guint samplerate; guint buffer_size; thread = (AgsThread *) sequencer_thread; ags_thread_set_flags(thread, AGS_THREAD_START_SYNCED_FREQ); config = ags_config_get_instance(); samplerate = ags_soundcard_helper_config_get_samplerate(config); buffer_size = ags_soundcard_helper_config_get_buffer_size(config); frequency = ((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_object_set(thread, "frequency", frequency, NULL); sequencer_thread->sequencer = NULL; sequencer_thread->timestamp_thread = NULL; // sequencer_thread->timestamp_thread = (AgsThread *) ags_timestamp_thread_new(); // ags_thread_add_child(thread, sequencer_thread->timestamp_thread); sequencer_thread->error = NULL; } void ags_sequencer_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSequencerThread *sequencer_thread; sequencer_thread = AGS_SEQUENCER_THREAD(gobject); switch(prop_id){ case PROP_SEQUENCER: { AgsSequencer *sequencer; sequencer = (AgsSequencer *) g_value_get_object(value); if(sequencer_thread->sequencer != NULL){ g_object_unref(G_OBJECT(sequencer_thread->sequencer)); } if(sequencer != NULL){ g_object_ref(G_OBJECT(sequencer)); if(AGS_IS_MIDIIN(sequencer)){ ags_thread_set_flags(sequencer_thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC); }else if(AGS_IS_JACK_MIDIIN(sequencer)){ ags_thread_set_flags(sequencer_thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC); // g_atomic_int_and(&(AGS_THREAD(sequencer_thread)->flags), // (~AGS_THREAD_INTERMEDIATE_PRE_SYNC)); } } sequencer_thread->sequencer = G_OBJECT(sequencer); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sequencer_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSequencerThread *sequencer_thread; sequencer_thread = AGS_SEQUENCER_THREAD(gobject); switch(prop_id){ case PROP_SEQUENCER: { g_value_set_object(value, G_OBJECT(sequencer_thread->sequencer)); } break; } } void ags_sequencer_thread_connect(AgsConnectable *connectable) { AgsThread *audio_loop, *sequencer_thread; sequencer_thread = AGS_THREAD(connectable); if(ags_thread_test_flags(sequencer_thread, AGS_THREAD_CONNECTED)){ return; } ags_sequencer_thread_parent_connectable_interface->connect(connectable); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(ags_application_context_get_instance())); g_signal_connect((GObject *) audio_loop, "stopped-all", G_CALLBACK(ags_sequencer_stopped_all_callback), sequencer_thread); } void ags_sequencer_thread_disconnect(AgsConnectable *connectable) { ags_sequencer_thread_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_sequencer_thread_dispose(GObject *gobject) { AgsSequencerThread *sequencer_thread; sequencer_thread = AGS_SEQUENCER_THREAD(gobject); /* sequencer */ if(sequencer_thread->sequencer != NULL){ g_object_unref(sequencer_thread->sequencer); sequencer_thread->sequencer = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sequencer_thread_parent_class)->dispose(gobject); } void ags_sequencer_thread_finalize(GObject *gobject) { AgsSequencerThread *sequencer_thread; sequencer_thread = AGS_SEQUENCER_THREAD(gobject); /* sequencer */ if(sequencer_thread->sequencer != NULL){ g_object_unref(sequencer_thread->sequencer); } /* call parent */ G_OBJECT_CLASS(ags_sequencer_thread_parent_class)->finalize(gobject); } void ags_sequencer_thread_start(AgsThread *thread) { AgsSequencer *sequencer; AgsSequencerThread *sequencer_thread; static gboolean initialized = FALSE; GError *error; sequencer_thread = AGS_SEQUENCER_THREAD(thread); sequencer = AGS_SEQUENCER(sequencer_thread->sequencer); /* abort if already recording */ if(ags_sequencer_is_recording(sequencer)){ return; } /* check if already initialized */ sequencer_thread->error = NULL; if(ags_sequencer_get_buffer(sequencer, NULL) == NULL){ ags_sequencer_record_init(sequencer, &(sequencer_thread->error)); #ifdef AGS_DEBUG g_message("ags_sequencer_record"); #endif } AGS_THREAD_CLASS(ags_sequencer_thread_parent_class)->start(thread); } void ags_sequencer_thread_run(AgsThread *thread) { AgsSequencer *sequencer; AgsSequencerThread *sequencer_thread; long delay; GError *error; sequencer_thread = AGS_SEQUENCER_THREAD(thread); sequencer = AGS_SEQUENCER(sequencer_thread->sequencer); /* real-time setup */ #ifdef AGS_WITH_RT if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP)){ AgsPriority *priority; struct sched_param param; gchar *str; priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP); } #endif if(ags_sequencer_is_recording(sequencer)){ error = NULL; ags_sequencer_record(sequencer, &error); if(error != NULL){ g_warning("ags_sequencer_thread - %s", error->message); g_error_free(error); } } /* notify about time exceeded */ ags_sequencer_thread_interval_timeout(sequencer_thread); } void ags_sequencer_thread_stop(AgsThread *thread) { AgsSequencer *sequencer; AgsSequencerThread *sequencer_thread; sequencer_thread = AGS_SEQUENCER_THREAD(thread); sequencer = AGS_SEQUENCER(sequencer_thread->sequencer); AGS_THREAD_CLASS(ags_sequencer_thread_parent_class)->stop(thread); ags_sequencer_stop(sequencer); } void ags_sequencer_stopped_all_callback(AgsAudioLoop *audio_loop, AgsSequencerThread *sequencer_thread) { AgsSequencer *sequencer; sequencer = AGS_SEQUENCER(sequencer_thread->sequencer); if(ags_sequencer_is_recording(sequencer)){ ags_thread_stop((AgsThread *) sequencer_thread); } } void ags_sequencer_thread_interval_timeout(AgsSequencerThread *sequencer_thread) { g_return_if_fail(AGS_IS_SEQUENCER_THREAD(sequencer_thread)); g_object_ref((GObject *) sequencer_thread); g_signal_emit(G_OBJECT(sequencer_thread), sequencer_thread_signals[INTERVAL_TIMEOUT], 0); g_object_unref((GObject *) sequencer_thread); } /** * ags_sequencer_thread_find_sequencer: * @sequencer_thread: the #AgsSequencerThread * @sequencer: the #AgsSequencer to find * * Find @sequencer as sibling of @sequencer_thread, if it was found on the returned * thread should be called g_object_unref(). * * Returns: (transfer full): the matching #AgsSequencerThread, if not * found %NULL. * * Since: 3.0.0 */ AgsSequencerThread* ags_sequencer_thread_find_sequencer(AgsSequencerThread *sequencer_thread, GObject *sequencer) { AgsThread *thread, *next_thread; if(!AGS_IS_SEQUENCER_THREAD(sequencer_thread)){ return(NULL); } thread = sequencer_thread; g_object_ref(thread); while(thread != NULL){ if(AGS_IS_SEQUENCER_THREAD(thread) && AGS_SEQUENCER_THREAD(thread)->sequencer == sequencer){ return(thread); } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } return(NULL); } /** * ags_sequencer_thread_new: * @sequencer: the #AgsSequencer * * Create a new instance of #AgsSequencerThread. * * Returns: the new #AgsSequencerThread * * Since: 3.0.0 */ AgsSequencerThread* ags_sequencer_thread_new(GObject *sequencer) { AgsSequencerThread *sequencer_thread; sequencer_thread = (AgsSequencerThread *) g_object_new(AGS_TYPE_SEQUENCER_THREAD, "sequencer", sequencer, NULL); return(sequencer_thread); } gsequencer-3.1.3/ags/audio/thread/ags_soundcard_thread.h0000644000175000017500000000460313607210263020241 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNDCARD_THREAD_H__ #define __AGS_SOUNDCARD_THREAD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUNDCARD_THREAD (ags_soundcard_thread_get_type()) #define AGS_SOUNDCARD_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUNDCARD_THREAD, AgsSoundcardThread)) #define AGS_SOUNDCARD_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SOUNDCARD_THREAD, AgsSoundcardThreadClass)) #define AGS_IS_SOUNDCARD_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SOUNDCARD_THREAD)) #define AGS_IS_SOUNDCARD_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SOUNDCARD_THREAD)) #define AGS_SOUNDCARD_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SOUNDCARD_THREAD, AgsSoundcardThreadClass)) #define AGS_SOUNDCARD_THREAD_DEFAULT_JIFFIE (ceil(AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK) typedef struct _AgsSoundcardThread AgsSoundcardThread; typedef struct _AgsSoundcardThreadClass AgsSoundcardThreadClass; struct _AgsSoundcardThread { AgsThread thread; guint flags; guint soundcard_capability; GObject *soundcard; GError *error; }; struct _AgsSoundcardThreadClass { AgsThreadClass thread; }; GType ags_soundcard_thread_get_type(); AgsSoundcardThread* ags_soundcard_thread_find_soundcard(AgsSoundcardThread *soundcard_thread, GObject *soundcard); AgsSoundcardThread* ags_soundcard_thread_new(GObject *soundcard, guint soundcard_capability); G_END_DECLS #endif /*__AGS_SOUNDCARD_THREAD_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_sfz_loader.c0000644000175000017500000006216513607210263017062 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_sfz_loader_class_init(AgsSFZLoaderClass *sfz_loader); void ags_sfz_loader_init(AgsSFZLoader *sfz_loader); void ags_sfz_loader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sfz_loader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sfz_loader_dispose(GObject *gobject); void ags_sfz_loader_finalize(GObject *gobject); void* ags_sfz_loader_run(void *ptr); /** * SECTION:ags_sfz_loader * @short_description: load sfz asynchronously * @title: AgsSFZLoader * @section_id: * @include: ags/plugin/ags_sfz_loader.h * * The #AgsSFZLoader loads sfz audio data asynchronously. */ enum{ PROP_0, PROP_AUDIO, PROP_FILENAME, PROP_AUDIO_CONTAINER, }; static gpointer ags_sfz_loader_parent_class = NULL; GType ags_sfz_loader_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sfz_loader = 0; static const GTypeInfo ags_sfz_loader_info = { sizeof(AgsSFZLoaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sfz_loader_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSFZLoader), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sfz_loader_init, }; ags_type_sfz_loader = g_type_register_static(G_TYPE_OBJECT, "AgsSFZLoader", &ags_sfz_loader_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sfz_loader); } return g_define_type_id__volatile; } void ags_sfz_loader_class_init(AgsSFZLoaderClass *sfz_loader) { GObjectClass *gobject; GParamSpec *param_spec; ags_sfz_loader_parent_class = g_type_class_peek_parent(sfz_loader); /* GObject */ gobject = (GObjectClass *) sfz_loader; gobject->set_property = ags_sfz_loader_set_property; gobject->get_property = ags_sfz_loader_get_property; gobject->dispose = ags_sfz_loader_dispose; gobject->finalize = ags_sfz_loader_finalize; /* properties */ /** * AgsSFZLoader:audio: * * The assigned audio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio"), i18n_pspec("The audio"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsSFZLoader:filename: * * The filename to open. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename"), i18n_pspec("The filename"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsSFZLoader:audio-container: * * The audio container opened. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-container", i18n_pspec("audio container"), i18n_pspec("The audio container"), AGS_TYPE_AUDIO_CONTAINER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CONTAINER, param_spec); } void ags_sfz_loader_init(AgsSFZLoader *sfz_loader) { sfz_loader->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(sfz_loader->obj_mutex)); /* fields */ sfz_loader->thread = NULL; sfz_loader->audio = NULL; sfz_loader->filename = NULL; sfz_loader->audio_container = NULL; } void ags_sfz_loader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSFZLoader *sfz_loader; GRecMutex *sfz_loader_mutex; sfz_loader = AGS_SFZ_LOADER(gobject); /* get base plugin mutex */ sfz_loader_mutex = AGS_SFZ_LOADER_GET_OBJ_MUTEX(sfz_loader); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = g_value_get_object(value); g_rec_mutex_lock(sfz_loader_mutex); if(sfz_loader->audio == audio){ g_rec_mutex_unlock(sfz_loader_mutex); return; } if(sfz_loader->audio != NULL){ g_object_unref(sfz_loader->audio); } if(audio != NULL){ g_object_ref(audio); } sfz_loader->audio = audio; g_rec_mutex_unlock(sfz_loader_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(sfz_loader_mutex); if(sfz_loader->filename == filename){ g_rec_mutex_unlock(sfz_loader_mutex); return; } if(sfz_loader->filename != NULL){ g_free(sfz_loader->filename); } sfz_loader->filename = g_strdup(filename); g_rec_mutex_unlock(sfz_loader_mutex); } break; case PROP_AUDIO_CONTAINER: { AgsAudioContainer *audio_container; audio_container = g_value_get_object(value); g_rec_mutex_lock(sfz_loader_mutex); if(sfz_loader->audio_container == audio_container){ g_rec_mutex_unlock(sfz_loader_mutex); return; } if(sfz_loader->audio_container != NULL){ g_object_unref(sfz_loader->audio_container); } if(audio_container != NULL){ g_object_ref(audio_container); } sfz_loader->audio_container = audio_container; g_rec_mutex_unlock(sfz_loader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sfz_loader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSFZLoader *sfz_loader; GRecMutex *sfz_loader_mutex; sfz_loader = AGS_SFZ_LOADER(gobject); /* get base plugin mutex */ sfz_loader_mutex = AGS_SFZ_LOADER_GET_OBJ_MUTEX(sfz_loader); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(sfz_loader_mutex); g_value_set_object(value, sfz_loader->audio); g_rec_mutex_unlock(sfz_loader_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(sfz_loader_mutex); g_value_set_string(value, sfz_loader->filename); g_rec_mutex_unlock(sfz_loader_mutex); } break; case PROP_AUDIO_CONTAINER: { g_rec_mutex_lock(sfz_loader_mutex); g_value_set_object(value, sfz_loader->audio_container); g_rec_mutex_unlock(sfz_loader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sfz_loader_dispose(GObject *gobject) { AgsSFZLoader *sfz_loader; sfz_loader = AGS_SFZ_LOADER(gobject); if(sfz_loader->audio != NULL){ g_object_unref(sfz_loader->audio); sfz_loader->audio = NULL; } if(sfz_loader->audio_container != NULL){ g_object_unref(sfz_loader->audio_container); sfz_loader->audio_container = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sfz_loader_parent_class)->dispose(gobject); } void ags_sfz_loader_finalize(GObject *gobject) { AgsSFZLoader *sfz_loader; sfz_loader = AGS_SFZ_LOADER(gobject); /* destroy object mutex */ if(sfz_loader->audio != NULL){ g_object_unref(sfz_loader->audio); } g_free(sfz_loader->filename); if(sfz_loader->audio_container != NULL){ g_object_unref(sfz_loader->audio_container); } /* call parent */ G_OBJECT_CLASS(ags_sfz_loader_parent_class)->finalize(gobject); } /** * ags_sfz_loader_test_flags: * @sfz_loader: the #AgsSFZLoader * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sfz_loader_test_flags(AgsSFZLoader *sfz_loader, guint flags) { gboolean retval; GRecMutex *sfz_loader_mutex; if(!AGS_IS_SFZ_LOADER(sfz_loader)){ return(FALSE); } /* get sfz loader mutex */ sfz_loader_mutex = AGS_SFZ_LOADER_GET_OBJ_MUTEX(sfz_loader); /* test flags */ g_rec_mutex_lock(sfz_loader_mutex); retval = ((flags & (sfz_loader->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(sfz_loader_mutex); return(retval); } /** * ags_sfz_loader_set_flags: * @sfz_loader: the #AgsSFZLoader * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_sfz_loader_set_flags(AgsSFZLoader *sfz_loader, guint flags) { GRecMutex *sfz_loader_mutex; if(!AGS_IS_SFZ_LOADER(sfz_loader)){ return; } /* get sfz loader mutex */ sfz_loader_mutex = AGS_SFZ_LOADER_GET_OBJ_MUTEX(sfz_loader); /* set flags */ g_rec_mutex_lock(sfz_loader_mutex); sfz_loader->flags |= flags; g_rec_mutex_unlock(sfz_loader_mutex); } /** * ags_sfz_loader_unset_flags: * @sfz_loader: the #AgsSFZLoader * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_sfz_loader_unset_flags(AgsSFZLoader *sfz_loader, guint flags) { GRecMutex *sfz_loader_mutex; if(!AGS_IS_SFZ_LOADER(sfz_loader)){ return; } /* get sfz loader mutex */ sfz_loader_mutex = AGS_SFZ_LOADER_GET_OBJ_MUTEX(sfz_loader); /* unset flags */ g_rec_mutex_lock(sfz_loader_mutex); sfz_loader->flags &= (~flags); g_rec_mutex_unlock(sfz_loader_mutex); } void* ags_sfz_loader_run(void *ptr) { AgsChannel *start_input, *next_input, *input; AgsSFZGroup *group; AgsSFZRegion *region; AgsSFZLoader *sfz_loader; GObject *output_soundcard; GList *start_audio_signal, *audio_signal; GList *start_list, *list; glong key, current_key; glong hikey, lokey, current_hikey, current_lokey; guint n_pads, current_pads; guint n_audio_channels, current_audio_channels; int retval; guint j_stop; guint i, j; sfz_loader = AGS_SFZ_LOADER(ptr); g_object_get(sfz_loader->audio, "output-soundcard", &output_soundcard, NULL); sfz_loader->audio_container = ags_audio_container_new(sfz_loader->filename, NULL, NULL, NULL, output_soundcard, -1); ags_audio_container_open(sfz_loader->audio_container); /* select */ ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(sfz_loader->audio_container->sound_container), 0); g_object_get(sfz_loader->audio, "input", &start_input, "input-pads", &n_pads, "audio-channels", &n_audio_channels, NULL); hikey = 0; lokey = 0; ags_sfz_file_get_range(AGS_SFZ_FILE(sfz_loader->audio_container->sound_container), &lokey, &hikey); /* resize */ g_object_get(sfz_loader->audio_container->sound_container, "sample", &start_list, NULL); list = start_list; current_audio_channels = n_audio_channels; while(list != NULL){ guint tmp; ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(list->data), &tmp, NULL, NULL, NULL); if(tmp > current_audio_channels){ current_audio_channels = tmp; } /* iterate */ list = list->next; } if(current_audio_channels > n_audio_channels){ n_audio_channels = current_audio_channels; ags_audio_set_audio_channels(sfz_loader->audio, n_audio_channels, 0); } current_pads = hikey - lokey + 1; if(lokey <= hikey && current_pads > n_pads){ n_pads = current_pads; ags_audio_set_pads(sfz_loader->audio, AGS_TYPE_INPUT, n_pads, 0); } input = start_input; audio_signal = start_audio_signal = NULL; j_stop = n_audio_channels; for(i = 0, j = 0; input != NULL;){ AgsRecycling *first_recycling; g_object_get(input, "first-recycling", &first_recycling, NULL); list = start_list; while(list != NULL){ gchar *str_key, *str_pitch_keycenter; gchar *str_lokey, *str_hikey; gboolean success; g_object_get(list->data, "group", &group, "region", ®ion, NULL); /* group */ str_pitch_keycenter = ags_sfz_group_lookup_control(group, "pitch_keycenter"); str_key = ags_sfz_group_lookup_control(group, "key"); str_lokey = ags_sfz_group_lookup_control(group, "lokey"); str_hikey = ags_sfz_group_lookup_control(group, "hikey"); lokey = 0; if(str_lokey != NULL){ retval = sscanf(str_lokey, "%lu", ¤t_lokey); if(retval <= 0){ retval = ags_diatonic_scale_note_to_midi_key(str_lokey, ¤t_lokey); if(retval > 0){ lokey = current_lokey; } }else{ lokey = current_lokey; } } key = lokey + i; success = FALSE; if(str_pitch_keycenter != NULL){ retval = sscanf(str_pitch_keycenter, "%lu", ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } }else{ retval = ags_diatonic_scale_note_to_midi_key(str_pitch_keycenter, ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } } } } if(str_key != NULL){ retval = sscanf(str_key, "%lu", ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } }else{ retval = ags_diatonic_scale_note_to_midi_key(str_key, ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } } } if(success){ g_free(str_pitch_keycenter); g_free(str_key); g_free(str_hikey); g_free(str_lokey); break; } } if(str_hikey != NULL && str_lokey != NULL){ success = FALSE; retval = sscanf(str_hikey, "%lu", ¤t_hikey); if(retval <= 0){ retval = ags_diatonic_scale_note_to_midi_key(str_hikey, ¤t_hikey); if(retval > 0){ if(current_key <= current_hikey){ success = TRUE; } } }else{ if(current_key <= current_hikey){ success = TRUE; } } retval = sscanf(str_lokey, "%lu", ¤t_lokey); if(retval <= 0){ retval = ags_diatonic_scale_note_to_midi_key(str_lokey, ¤t_lokey); if(retval > 0){ if(current_key >= current_lokey){ success = TRUE; }else{ success = FALSE; } }else{ success = FALSE; } }else{ if(current_key >= current_lokey){ success = TRUE; }else{ success = FALSE; } } if(success){ hikey = current_hikey; lokey = current_lokey; g_free(str_pitch_keycenter); g_free(str_key); g_free(str_hikey); g_free(str_lokey); break; } } g_free(str_pitch_keycenter); g_free(str_key); g_free(str_hikey); g_free(str_lokey); /* region */ str_pitch_keycenter = ags_sfz_region_lookup_control(region, "pitch_keycenter"); str_key = ags_sfz_region_lookup_control(region, "key"); str_lokey = ags_sfz_region_lookup_control(region, "lokey"); str_hikey = ags_sfz_region_lookup_control(region, "hikey"); lokey = 0; if(str_lokey != NULL){ retval = sscanf(str_lokey, "%lu", ¤t_lokey); if(retval <= 0){ retval = ags_diatonic_scale_note_to_midi_key(str_lokey, ¤t_lokey); if(retval > 0){ lokey = current_lokey; } }else{ lokey = current_lokey; } } key = lokey + i; success = FALSE; if(str_pitch_keycenter != NULL){ retval = sscanf(str_pitch_keycenter, "%lu", ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } }else{ retval = ags_diatonic_scale_note_to_midi_key(str_pitch_keycenter, ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } } } } if(str_key != NULL){ retval = sscanf(str_key, "%lu", ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } }else{ retval = ags_diatonic_scale_note_to_midi_key(str_key, ¤t_key); if(retval > 0){ if(current_key == key){ success = TRUE; } } } if(success){ g_free(str_pitch_keycenter); g_free(str_key); g_free(str_hikey); g_free(str_lokey); break; } } if(str_hikey != NULL && str_lokey != NULL){ gboolean success; success = FALSE; retval = sscanf(str_hikey, "%lu", ¤t_hikey); if(retval <= 0){ retval = ags_diatonic_scale_note_to_midi_key(str_hikey, ¤t_hikey); if(retval > 0){ if(current_key <= current_hikey){ success = TRUE; } } }else{ if(current_key <= current_hikey){ success = TRUE; } } retval = sscanf(str_lokey, "%lu", ¤t_lokey); if(retval <= 0){ retval = ags_diatonic_scale_note_to_midi_key(str_lokey, ¤t_lokey); if(retval > 0){ if(current_key >= current_lokey){ success = TRUE; }else{ success = FALSE; } }else{ success = FALSE; } }else{ if(current_key >= current_lokey){ success = TRUE; }else{ success = FALSE; } } if(success){ hikey = current_hikey; lokey = current_lokey; g_free(str_pitch_keycenter); g_free(str_key); g_free(str_hikey); g_free(str_lokey); break; } } g_free(str_pitch_keycenter); g_free(str_key); g_free(str_hikey); g_free(str_lokey); /* iterate */ list = list->next; } if(j == 0 && list != NULL){ audio_signal = start_audio_signal = ags_sound_resource_read_audio_signal(AGS_SOUND_RESOURCE(list->data), output_soundcard, -1); } /* add audio signal as template to recycling */ audio_signal = g_list_nth(start_audio_signal, j); if(audio_signal != NULL){ AgsAudioSignal *current_audio_signal; GList *start_stream, *stream; gchar *str_key, *str_pitch_keycenter; gchar *str_lokey; guint samplerate; guint buffer_size; guint format; guint loop_start, loop_end; glong pitch_keycenter, current_pitch_keycenter; guint x_offset; /* key center */ g_object_get(list->data, "group", &group, "region", ®ion, NULL); key = lokey + i; pitch_keycenter = 49; /* group */ str_pitch_keycenter = ags_sfz_group_lookup_control(group, "pitch_keycenter"); str_key = ags_sfz_group_lookup_control(group, "key"); if(str_pitch_keycenter != NULL){ retval = sscanf(str_pitch_keycenter, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_pitch_keycenter; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_pitch_keycenter, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } }else if(str_key != NULL){ retval = sscanf(str_key, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_key; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_key, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } } g_free(str_pitch_keycenter); g_free(str_key); /* region */ str_pitch_keycenter = ags_sfz_region_lookup_control(region, "pitch_keycenter"); str_key = ags_sfz_region_lookup_control(region, "key"); if(str_pitch_keycenter != NULL){ retval = sscanf(str_pitch_keycenter, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_pitch_keycenter; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_pitch_keycenter, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } }else if(str_key != NULL){ retval = sscanf(str_key, "%lu", ¤t_pitch_keycenter); if(retval > 0){ pitch_keycenter = current_key; }else{ retval = ags_diatonic_scale_note_to_midi_key(str_key, ¤t_key); if(retval > 0){ pitch_keycenter = current_key; } } } g_free(str_pitch_keycenter); g_free(str_key); /* loop start/end */ g_object_get(audio_signal->data, "samplerate", &samplerate, "buffer-size", &buffer_size, "format", &format, "loop-start", &loop_start, "loop-end", &loop_end, NULL); /* create audio signal */ current_audio_signal = ags_audio_signal_new(output_soundcard, (GObject *) first_recycling, NULL); current_audio_signal->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; g_object_set(current_audio_signal, "loop-start", loop_start, "loop-end", loop_end, NULL); ags_audio_signal_duplicate_stream(current_audio_signal, audio_signal->data); /* pitch */ stream = start_stream = current_audio_signal->stream; x_offset = 0; key -= lokey; while(stream != NULL){ switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { ags_filter_util_pitch_s8((gint8 *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { ags_filter_util_pitch_s16((gint16 *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ags_filter_util_pitch_s24((gint32 *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ags_filter_util_pitch_s32((gint32 *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { ags_filter_util_pitch_s64((gint64 *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_FLOAT: { ags_filter_util_pitch_float((gfloat *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_DOUBLE: { ags_filter_util_pitch_double((gdouble *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; case AGS_SOUNDCARD_COMPLEX: { ags_filter_util_pitch_complex((AgsComplex *) stream->data, buffer_size, samplerate, pitch_keycenter - 48.0, ((gdouble) key - (gdouble) pitch_keycenter) * 100.0); } break; } /* iterate */ x_offset += buffer_size; stream = stream->next; } /* add audio signal */ ags_recycling_add_audio_signal(first_recycling, current_audio_signal); }else{ g_message("SFZ audio signal not found"); } g_object_unref(first_recycling); /* iterate */ if(j + 1 < j_stop){ j++; }else{ g_list_free_full(start_audio_signal, g_object_unref); audio_signal = start_audio_signal = NULL; i++; j = 0; list = list->next; } next_input = ags_channel_next(input); g_object_unref(input); input = next_input; } g_object_unref(output_soundcard); g_list_free_full(start_list, g_object_unref); ags_sfz_loader_set_flags(sfz_loader, AGS_SFZ_LOADER_HAS_COMPLETED); g_thread_exit(NULL); return(NULL); } void ags_sfz_loader_start(AgsSFZLoader *sfz_loader) { if(!AGS_IS_SFZ_LOADER(sfz_loader)){ return; } sfz_loader->thread = g_thread_new("Advanced Gtk+ Sequencer - SFZ loader", ags_sfz_loader_run, sfz_loader); } /** * ags_sfz_loader_new: * @audio: the #AgsAudio * @filename: the filename * @do_replace: if %TRUE replace @audio's sfz * * Create a new instance of #AgsSFZLoader. * * Returns: the new #AgsSFZLoader * * Since: 3.0.0 */ AgsSFZLoader* ags_sfz_loader_new(AgsAudio *audio, gchar *filename, gboolean do_replace) { AgsSFZLoader *sfz_loader; sfz_loader = (AgsSFZLoader *) g_object_new(AGS_TYPE_SFZ_LOADER, "audio", audio, "filename", filename, NULL); if(do_replace){ ags_sfz_loader_set_flags(sfz_loader, AGS_SFZ_LOADER_DO_REPLACE); } return(sfz_loader); } gsequencer-3.1.3/ags/audio/thread/ags_export_thread.c0000644000175000017500000003267513607210263017605 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_export_thread_class_init(AgsExportThreadClass *export_thread); void ags_export_thread_connectable_interface_init(AgsConnectableInterface *connectable); void ags_export_thread_init(AgsExportThread *export_thread); void ags_export_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_export_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_export_thread_connect(AgsConnectable *connectable); void ags_export_thread_disconnect(AgsConnectable *connectable); void ags_export_thread_dispose(GObject *gobject); void ags_export_thread_finalize(GObject *gobject); void ags_export_thread_start(AgsThread *thread); void ags_export_thread_run(AgsThread *thread); void ags_export_thread_stop(AgsThread *thread); /** * SECTION:ags_export_thread * @short_description: export thread * @title: AgsExportThread * @section_id: * @include: ags/audio/thread/ags_export_thread.h * * The #AgsExportThread acts as audio output thread to file. */ enum{ PROP_0, PROP_SOUNDCARD, PROP_AUDIO_FILE, PROP_TIC, }; static gpointer ags_export_thread_parent_class = NULL; static AgsConnectableInterface *ags_export_thread_parent_connectable_interface; GType ags_export_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_export_thread = 0; static const GTypeInfo ags_export_thread_info = { sizeof (AgsExportThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_export_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsExportThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_export_thread_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_export_thread_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_export_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsExportThread", &ags_export_thread_info, 0); g_type_add_interface_static(ags_type_export_thread, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_export_thread); } return g_define_type_id__volatile; } void ags_export_thread_class_init(AgsExportThreadClass *export_thread) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_export_thread_parent_class = g_type_class_peek_parent(export_thread); /* GObject */ gobject = (GObjectClass *) export_thread; gobject->get_property = ags_export_thread_get_property; gobject->set_property = ags_export_thread_set_property; gobject->dispose = ags_export_thread_dispose; gobject->finalize = ags_export_thread_finalize; /* properties */ /** * AgsExportThread:soundcard: * * The assigned #AgsSoundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard assigned to"), i18n_pspec("The AgsSoundcard it is assigned to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsExportThread:audio-file: * * The assigned #AgsAudioFile. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-file", i18n_pspec("audio file to write"), i18n_pspec("The audio file to write output"), AGS_TYPE_AUDIO_FILE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_FILE, param_spec); /** * AgsExportThread:tic: * * The tic. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("tic", i18n_pspec("tic"), i18n_pspec("The tic"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIC, param_spec); /* AgsThread */ thread = (AgsThreadClass *) export_thread; thread->start = ags_export_thread_start; thread->run = ags_export_thread_run; thread->stop = ags_export_thread_stop; } void ags_export_thread_connectable_interface_init(AgsConnectableInterface *connectable) { ags_export_thread_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_export_thread_connect; connectable->disconnect = ags_export_thread_disconnect; } void ags_export_thread_init(AgsExportThread *export_thread) { AgsThread *thread; AgsConfig *config; gdouble frequency; guint samplerate; guint buffer_size; thread = (AgsThread *) export_thread; ags_thread_set_flags(thread, (AGS_THREAD_START_SYNCED_FREQ | AGS_THREAD_INTERMEDIATE_POST_SYNC)); config = ags_config_get_instance(); samplerate = ags_soundcard_helper_config_get_samplerate(config); buffer_size = ags_soundcard_helper_config_get_buffer_size(config); frequency = ((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_object_set(thread, "frequency", frequency, NULL); export_thread->flags = 0; export_thread->tic = 0; export_thread->counter = 0; export_thread->soundcard = NULL; export_thread->audio_file = NULL; } void ags_export_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsExportThread *export_thread; GRecMutex *thread_mutex; export_thread = AGS_EXPORT_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(export_thread); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(thread_mutex); if(export_thread->soundcard == soundcard){ g_rec_mutex_unlock(thread_mutex); return; } if(export_thread->soundcard != NULL){ g_object_unref(G_OBJECT(export_thread->soundcard)); } if(soundcard != NULL){ g_object_ref(G_OBJECT(soundcard)); } export_thread->soundcard = soundcard; g_rec_mutex_unlock(thread_mutex); } break; case PROP_AUDIO_FILE: { AgsAudioFile *audio_file; audio_file = g_value_get_object(value); g_rec_mutex_lock(thread_mutex); if(export_thread->audio_file == audio_file){ g_rec_mutex_unlock(thread_mutex); return; } if(export_thread->audio_file != NULL){ g_object_unref(export_thread->audio_file); } if(audio_file != NULL){ g_object_ref(audio_file); } export_thread->audio_file = audio_file; g_rec_mutex_unlock(thread_mutex); } break; case PROP_TIC: { g_rec_mutex_lock(thread_mutex); export_thread->tic = g_value_get_uint(value); g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsExportThread *export_thread; GRecMutex *thread_mutex; export_thread = AGS_EXPORT_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(export_thread); switch(prop_id){ case PROP_SOUNDCARD: { g_rec_mutex_lock(thread_mutex); g_value_set_object(value, G_OBJECT(export_thread->soundcard)); g_rec_mutex_unlock(thread_mutex); } break; case PROP_AUDIO_FILE: { g_rec_mutex_lock(thread_mutex); g_value_set_object(value, export_thread->audio_file); g_rec_mutex_unlock(thread_mutex); } break; case PROP_TIC: { g_rec_mutex_lock(thread_mutex); g_value_set_uint(value, export_thread->tic); g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_export_thread_connect(AgsConnectable *connectable) { ags_export_thread_parent_connectable_interface->connect(connectable); /* empty */ } void ags_export_thread_disconnect(AgsConnectable *connectable) { ags_export_thread_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_export_thread_dispose(GObject *gobject) { AgsExportThread *export_thread; export_thread = AGS_EXPORT_THREAD(gobject); /* soundcard */ if(export_thread->soundcard != NULL){ g_object_unref(export_thread->soundcard); export_thread->soundcard = NULL; } /* audio file */ if(export_thread->audio_file != NULL){ g_object_unref(export_thread->audio_file); export_thread->audio_file = NULL; } /* call parent */ G_OBJECT_CLASS(ags_export_thread_parent_class)->dispose(gobject); } void ags_export_thread_finalize(GObject *gobject) { AgsExportThread *export_thread; export_thread = AGS_EXPORT_THREAD(gobject); /* soundcard */ if(export_thread->soundcard != NULL){ g_object_unref(export_thread->soundcard); } /* audio file */ if(export_thread->audio_file != NULL){ g_object_unref(export_thread->audio_file); } /* call parent */ G_OBJECT_CLASS(ags_export_thread_parent_class)->finalize(gobject); } void ags_export_thread_start(AgsThread *thread) { AgsExportThread *export_thread; export_thread = (AgsExportThread *) thread; export_thread->counter = 0; AGS_THREAD_CLASS(ags_export_thread_parent_class)->start(thread); } void ags_export_thread_run(AgsThread *thread) { AgsExportThread *export_thread; AgsSoundcard *soundcard; void *soundcard_buffer; guint pcm_channels; guint buffer_size; guint format; export_thread = AGS_EXPORT_THREAD(thread); if(export_thread->audio_file == NULL){ return; } if(export_thread->counter == export_thread->tic){ ags_thread_stop(thread); }else{ export_thread->counter += 1; } /* */ soundcard = AGS_SOUNDCARD(export_thread->soundcard); soundcard_buffer = NULL; if(AGS_IS_DEVOUT(soundcard) || AGS_IS_WASAPI_DEVOUT(soundcard)){ soundcard_buffer = ags_soundcard_get_buffer(soundcard); }else if(AGS_IS_JACK_DEVOUT(soundcard) || AGS_IS_PULSE_DEVOUT(soundcard)){ soundcard_buffer = ags_soundcard_get_prev_buffer(soundcard); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ soundcard_buffer = ags_soundcard_get_buffer(soundcard); } ags_soundcard_get_presets(soundcard, &pcm_channels, NULL, &buffer_size, &format); ags_soundcard_lock_buffer(soundcard, soundcard_buffer); ags_audio_file_write(export_thread->audio_file, soundcard_buffer, (guint) buffer_size, format); ags_soundcard_unlock_buffer(soundcard, soundcard_buffer); } void ags_export_thread_stop(AgsThread *thread) { AgsExportThread *export_thread; export_thread = AGS_EXPORT_THREAD(thread); AGS_THREAD_CLASS(ags_export_thread_parent_class)->stop(thread); ags_audio_file_flush(export_thread->audio_file); ags_audio_file_close(export_thread->audio_file); export_thread->audio_file = NULL; } /** * ags_export_thread_find_soundcard: * @export_thread: the #AgsExportThread * @soundcard: the #AgsSoundcard to find * * Returns: (transfer full): the matching #AgsExportThread, if not * found %NULL. * * Since: 3.0.0 */ AgsExportThread* ags_export_thread_find_soundcard(AgsExportThread *export_thread, GObject *soundcard) { AgsThread *thread, *next_thread; if(!AGS_IS_EXPORT_THREAD(export_thread)){ return(NULL); } thread = export_thread; g_object_ref(thread); while(thread != NULL){ if(AGS_IS_EXPORT_THREAD(thread) && AGS_EXPORT_THREAD(thread)->soundcard == soundcard){ return(thread); } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } return(NULL); } /** * ags_export_thread_new: * @soundcard: the #AgsSoundcard * @audio_file: the output file * * Create a new instance of #AgsExportThread. * * Returns: the new #AgsExportThread * * Since: 3.0.0 */ AgsExportThread* ags_export_thread_new(GObject *soundcard, AgsAudioFile *audio_file) { AgsExportThread *export_thread; export_thread = (AgsExportThread *) g_object_new(AGS_TYPE_EXPORT_THREAD, "soundcard", soundcard, "audio-file", audio_file, NULL); return(export_thread); } gsequencer-3.1.3/ags/audio/thread/ags_wave_loader.h0000644000175000017500000000512313607210263017216 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_LOADER_H__ #define __AGS_WAVE_LOADER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE_LOADER (ags_wave_loader_get_type()) #define AGS_WAVE_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE_LOADER, AgsWaveLoader)) #define AGS_WAVE_LOADER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE_LOADER, AgsWaveLoaderClass)) #define AGS_IS_WAVE_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE_LOADER)) #define AGS_IS_WAVE_LOADER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE_LOADER)) #define AGS_WAVE_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_WAVE_LOADER, AgsWaveLoaderClass)) #define AGS_WAVE_LOADER_GET_OBJ_MUTEX(obj) (&(((AgsWaveLoader *) obj)->obj_mutex)) typedef struct _AgsWaveLoader AgsWaveLoader; typedef struct _AgsWaveLoaderClass AgsWaveLoaderClass; typedef enum{ AGS_WAVE_LOADER_DO_REPLACE = 1, AGS_WAVE_LOADER_HAS_COMPLETED = 1 << 1, }AgsWaveLoaderFlags; struct _AgsWaveLoader { GObject gobject; guint flags; GRecMutex obj_mutex; GThread *thread; AgsAudio *audio; gchar *filename; AgsAudioFile *audio_file; }; struct _AgsWaveLoaderClass { GObjectClass gobject; }; GType ags_wave_loader_get_type(); gboolean ags_wave_loader_test_flags(AgsWaveLoader *wave_loader, guint flags); void ags_wave_loader_set_flags(AgsWaveLoader *wave_loader, guint flags); void ags_wave_loader_unset_flags(AgsWaveLoader *wave_loader, guint flags); void ags_wave_loader_start(AgsWaveLoader *wave_loader); AgsWaveLoader* ags_wave_loader_new(AgsAudio *audio, gchar *filename, gboolean do_replace); G_END_DECLS #endif /*__AGS_WAVE_LOADER_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_audio_thread.h0000644000175000017500000000666713607210263017374 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_THREAD_H__ #define __AGS_AUDIO_THREAD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_THREAD (ags_audio_thread_get_type()) #define AGS_AUDIO_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_THREAD, AgsAudioThread)) #define AGS_AUDIO_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_THREAD, AgsAudioThreadClass)) #define AGS_IS_AUDIO_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_THREAD)) #define AGS_IS_AUDIO_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_THREAD)) #define AGS_AUDIO_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_THREAD, AgsAudioThreadClass)) #define AGS_AUDIO_THREAD_DEFAULT_JIFFIE (ceil(AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK) typedef struct _AgsAudioThread AgsAudioThread; typedef struct _AgsAudioThreadClass AgsAudioThreadClass; /** * AgsAudioThreadFlags: * @AGS_AUDIO_THREAD_STATUS_DONE: sync done parent thread, initial wait during #AgsThread::run() * @AGS_AUDIO_THREAD_STATUS_WAIT: sync wait parent thread, initial wait during #AgsThread::run() * @AGS_AUDIO_THREAD_STATUS_DONE_SYNC: sync done parent thread, signal completed during #AgsThread::run() * @AGS_AUDIO_THREAD_STATUS_WAIT_SYNC: sync wait parent thread, signal completed during #AgsThread::run() * * Enum values to control the behavior or indicate internal state of #AgsAudioThread by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_THREAD_STATUS_DONE = 1, AGS_AUDIO_THREAD_STATUS_WAIT = 1 << 1, AGS_AUDIO_THREAD_STATUS_DONE_SYNC = 1 << 2, AGS_AUDIO_THREAD_STATUS_WAIT_SYNC = 1 << 3, }AgsAudioThreadFlags; struct _AgsAudioThread { AgsThread thread; volatile guint status_flags; GObject *default_output_soundcard; GMutex wakeup_mutex; GCond wakeup_cond; GMutex done_mutex; GCond done_cond; GObject *audio; gint sound_scope; GList *sync_thread; }; struct _AgsAudioThreadClass { AgsThreadClass thread; }; GType ags_audio_thread_get_type(); gboolean ags_audio_thread_test_status_flags(AgsAudioThread *audio_thread, guint status_flags); void ags_audio_thread_set_status_flags(AgsAudioThread *audio_thread, guint status_flags); void ags_audio_thread_unset_status_flags(AgsAudioThread *audio_thread, guint status_flags); void ags_audio_thread_set_sound_scope(AgsAudioThread *audio_thread, gint sound_scope); AgsAudioThread* ags_audio_thread_new(GObject *default_output_soundcard, GObject *audio); G_END_DECLS #endif /*__AGS_AUDIO_THREAD_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_wave_loader.c0000644000175000017500000003232413607210263017214 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_wave_loader_class_init(AgsWaveLoaderClass *wave_loader); void ags_wave_loader_init(AgsWaveLoader *wave_loader); void ags_wave_loader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_wave_loader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_wave_loader_dispose(GObject *gobject); void ags_wave_loader_finalize(GObject *gobject); void* ags_wave_loader_run(void *ptr); /** * SECTION:ags_wave_loader * @short_description: load wave asynchronously * @title: AgsWaveLoader * @section_id: * @include: ags/plugin/ags_wave_loader.h * * The #AgsWaveLoader loads wave audio data asynchronously. */ enum{ PROP_0, PROP_AUDIO, PROP_FILENAME, PROP_AUDIO_FILE, }; static gpointer ags_wave_loader_parent_class = NULL; GType ags_wave_loader_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_wave_loader = 0; static const GTypeInfo ags_wave_loader_info = { sizeof(AgsWaveLoaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_wave_loader_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsWaveLoader), 0, /* n_preallocs */ (GInstanceInitFunc) ags_wave_loader_init, }; ags_type_wave_loader = g_type_register_static(G_TYPE_OBJECT, "AgsWaveLoader", &ags_wave_loader_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_wave_loader); } return g_define_type_id__volatile; } void ags_wave_loader_class_init(AgsWaveLoaderClass *wave_loader) { GObjectClass *gobject; GParamSpec *param_spec; ags_wave_loader_parent_class = g_type_class_peek_parent(wave_loader); /* GObject */ gobject = (GObjectClass *) wave_loader; gobject->set_property = ags_wave_loader_set_property; gobject->get_property = ags_wave_loader_get_property; gobject->dispose = ags_wave_loader_dispose; gobject->finalize = ags_wave_loader_finalize; /* properties */ /** * AgsWaveLoader:audio: * * The assigned audio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio"), i18n_pspec("The audio"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsWaveLoader:filename: * * The filename to open. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename"), i18n_pspec("The filename"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsWaveLoader:audio-file: * * The audio file opened. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-file", i18n_pspec("audio file"), i18n_pspec("The audio file"), AGS_TYPE_AUDIO_FILE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_FILE, param_spec); } void ags_wave_loader_init(AgsWaveLoader *wave_loader) { wave_loader->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(wave_loader->obj_mutex)); /* fields */ wave_loader->thread = NULL; wave_loader->audio = NULL; wave_loader->filename = NULL; wave_loader->audio_file = NULL; } void ags_wave_loader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsWaveLoader *wave_loader; GRecMutex *wave_loader_mutex; wave_loader = AGS_WAVE_LOADER(gobject); /* get base plugin mutex */ wave_loader_mutex = AGS_WAVE_LOADER_GET_OBJ_MUTEX(wave_loader); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = g_value_get_object(value); g_rec_mutex_lock(wave_loader_mutex); if(wave_loader->audio == audio){ g_rec_mutex_unlock(wave_loader_mutex); return; } if(wave_loader->audio != NULL){ g_object_unref(wave_loader->audio); } if(audio != NULL){ g_object_ref(audio); } wave_loader->audio = audio; g_rec_mutex_unlock(wave_loader_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(wave_loader_mutex); if(wave_loader->filename == filename){ g_rec_mutex_unlock(wave_loader_mutex); return; } if(wave_loader->filename != NULL){ g_free(wave_loader->filename); } wave_loader->filename = g_strdup(filename); g_rec_mutex_unlock(wave_loader_mutex); } break; case PROP_AUDIO_FILE: { AgsAudioFile *audio_file; audio_file = g_value_get_object(value); g_rec_mutex_lock(wave_loader_mutex); if(wave_loader->audio_file == audio_file){ g_rec_mutex_unlock(wave_loader_mutex); return; } if(wave_loader->audio_file != NULL){ g_object_unref(wave_loader->audio_file); } if(audio_file != NULL){ g_object_ref(audio_file); } wave_loader->audio_file = audio_file; g_rec_mutex_unlock(wave_loader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_loader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsWaveLoader *wave_loader; GRecMutex *wave_loader_mutex; wave_loader = AGS_WAVE_LOADER(gobject); /* get base plugin mutex */ wave_loader_mutex = AGS_WAVE_LOADER_GET_OBJ_MUTEX(wave_loader); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(wave_loader_mutex); g_value_set_object(value, wave_loader->audio); g_rec_mutex_unlock(wave_loader_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(wave_loader_mutex); g_value_set_string(value, wave_loader->filename); g_rec_mutex_unlock(wave_loader_mutex); } break; case PROP_AUDIO_FILE: { g_rec_mutex_lock(wave_loader_mutex); g_value_set_object(value, wave_loader->audio_file); g_rec_mutex_unlock(wave_loader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_wave_loader_dispose(GObject *gobject) { AgsWaveLoader *wave_loader; wave_loader = AGS_WAVE_LOADER(gobject); if(wave_loader->audio != NULL){ g_object_unref(wave_loader->audio); wave_loader->audio = NULL; } if(wave_loader->audio_file != NULL){ g_object_unref(wave_loader->audio_file); wave_loader->audio_file = NULL; } /* call parent */ G_OBJECT_CLASS(ags_wave_loader_parent_class)->dispose(gobject); } void ags_wave_loader_finalize(GObject *gobject) { AgsWaveLoader *wave_loader; wave_loader = AGS_WAVE_LOADER(gobject); /* destroy object mutex */ if(wave_loader->audio != NULL){ g_object_unref(wave_loader->audio); } g_free(wave_loader->filename); if(wave_loader->audio_file != NULL){ g_object_unref(wave_loader->audio_file); } /* call parent */ G_OBJECT_CLASS(ags_wave_loader_parent_class)->finalize(gobject); } /** * ags_wave_loader_test_flags: * @wave_loader: the #AgsWaveLoader * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_wave_loader_test_flags(AgsWaveLoader *wave_loader, guint flags) { gboolean retval; GRecMutex *wave_loader_mutex; if(!AGS_IS_WAVE_LOADER(wave_loader)){ return(FALSE); } /* get wave loader mutex */ wave_loader_mutex = AGS_WAVE_LOADER_GET_OBJ_MUTEX(wave_loader); /* test flags */ g_rec_mutex_lock(wave_loader_mutex); retval = ((flags & (wave_loader->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(wave_loader_mutex); return(retval); } /** * ags_wave_loader_set_flags: * @wave_loader: the #AgsWaveLoader * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_wave_loader_set_flags(AgsWaveLoader *wave_loader, guint flags) { GRecMutex *wave_loader_mutex; if(!AGS_IS_WAVE_LOADER(wave_loader)){ return; } /* get wave loader mutex */ wave_loader_mutex = AGS_WAVE_LOADER_GET_OBJ_MUTEX(wave_loader); /* set flags */ g_rec_mutex_lock(wave_loader_mutex); wave_loader->flags |= flags; g_rec_mutex_unlock(wave_loader_mutex); } /** * ags_wave_loader_unset_flags: * @wave_loader: the #AgsWaveLoader * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_wave_loader_unset_flags(AgsWaveLoader *wave_loader, guint flags) { GRecMutex *wave_loader_mutex; if(!AGS_IS_WAVE_LOADER(wave_loader)){ return; } /* get wave loader mutex */ wave_loader_mutex = AGS_WAVE_LOADER_GET_OBJ_MUTEX(wave_loader); /* unset flags */ g_rec_mutex_lock(wave_loader_mutex); wave_loader->flags &= (~flags); g_rec_mutex_unlock(wave_loader_mutex); } void* ags_wave_loader_run(void *ptr) { AgsWaveLoader *wave_loader; GObject *output_soundcard; GList *start_wave, *wave; guint n_pads, current_pads; guint n_audio_channels, current_audio_channels; wave_loader = AGS_WAVE_LOADER(ptr); g_object_get(wave_loader->audio, "output-soundcard", &output_soundcard, NULL); g_object_unref(output_soundcard); wave_loader->audio_file = ags_audio_file_new(wave_loader->filename, output_soundcard, -1); ags_audio_file_open(wave_loader->audio_file); if(ags_wave_loader_test_flags(wave_loader, AGS_WAVE_LOADER_DO_REPLACE)){ g_object_get(wave_loader->audio, "wave", &start_wave, NULL); wave = start_wave; while(wave != NULL){ ags_audio_remove_wave(wave_loader->audio, wave->data); wave = wave->next; } g_list_free_full(start_wave, g_object_unref); g_object_set(wave_loader->audio, "input-audio-file", wave_loader->audio_file, NULL); } /* get some fields */ g_object_get(wave_loader->audio, "input-pads", &n_pads, "audio-channels", &n_audio_channels, "output-soundcard", &output_soundcard, NULL); ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(wave_loader->audio_file->sound_resource), ¤t_audio_channels, NULL, NULL, NULL); if(current_audio_channels > n_audio_channels){ n_audio_channels = current_audio_channels; } if(n_audio_channels > 0){ GList *start_wave, *wave; /* resize */ ags_audio_set_audio_channels(wave_loader->audio, n_audio_channels, 0); if(n_pads < 1){ ags_audio_set_pads(wave_loader->audio, AGS_TYPE_INPUT, 1, 0); } wave = start_wave = ags_sound_resource_read_wave(AGS_SOUND_RESOURCE(wave_loader->audio_file->sound_resource), output_soundcard, -1, 0, 0.0, 0); if(ags_wave_loader_test_flags(wave_loader, AGS_WAVE_LOADER_DO_REPLACE)){ while(wave != NULL){ guint current_line; #if 0 g_object_get(wave->data, "line", ¤t_line, NULL); g_object_set(wave->data, "line", current_line, NULL); #endif ags_audio_add_wave(wave_loader->audio, wave->data); wave = wave->next; } } g_list_free(start_wave); } ags_wave_loader_set_flags(wave_loader, AGS_WAVE_LOADER_HAS_COMPLETED); g_thread_exit(NULL); return(NULL); } void ags_wave_loader_start(AgsWaveLoader *wave_loader) { if(!AGS_IS_WAVE_LOADER(wave_loader)){ return; } wave_loader->thread = g_thread_new("Advanced Gtk+ Sequencer - SFZ loader", ags_wave_loader_run, wave_loader); } /** * ags_wave_loader_new: * @audio: the #AgsAudio * @filename: the filename * @do_replace: if %TRUE replace @audio's wave * * Create a new instance of #AgsWaveLoader. * * Returns: the new #AgsWaveLoader * * Since: 3.0.0 */ AgsWaveLoader* ags_wave_loader_new(AgsAudio *audio, gchar *filename, gboolean do_replace) { AgsWaveLoader *wave_loader; wave_loader = (AgsWaveLoader *) g_object_new(AGS_TYPE_WAVE_LOADER, "audio", audio, "filename", filename, NULL); if(do_replace){ ags_wave_loader_set_flags(wave_loader, AGS_WAVE_LOADER_DO_REPLACE); } return(wave_loader); } gsequencer-3.1.3/ags/audio/thread/ags_sfz_loader.h0000644000175000017500000000534313607210263017062 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SFZ_LOADER_H__ #define __AGS_SFZ_LOADER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SFZ_LOADER (ags_sfz_loader_get_type()) #define AGS_SFZ_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SFZ_LOADER, AgsSFZLoader)) #define AGS_SFZ_LOADER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SFZ_LOADER, AgsSFZLoaderClass)) #define AGS_IS_SFZ_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SFZ_LOADER)) #define AGS_IS_SFZ_LOADER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SFZ_LOADER)) #define AGS_SFZ_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SFZ_LOADER, AgsSFZLoaderClass)) #define AGS_SFZ_LOADER_GET_OBJ_MUTEX(obj) (&(((AgsSFZLoader *) obj)->obj_mutex)) typedef struct _AgsSFZLoader AgsSFZLoader; typedef struct _AgsSFZLoaderClass AgsSFZLoaderClass; /** * AgsSFZLoaderFlags: * @AGS_SFZ_LOADER_DO_REPLACE: do replace audio signal * @AGS_SFZ_LOADER_HAS_COMPLETED: has completed * * Enum values to configure SFZ loader. */ typedef enum{ AGS_SFZ_LOADER_DO_REPLACE = 1, AGS_SFZ_LOADER_HAS_COMPLETED = 1 << 1, }AgsSFZLoaderFlags; struct _AgsSFZLoader { GObject gobject; guint flags; GRecMutex obj_mutex; GThread *thread; AgsAudio *audio; gchar *filename; AgsAudioContainer *audio_container; }; struct _AgsSFZLoaderClass { GObjectClass gobject; }; GType ags_sfz_loader_get_type(); gboolean ags_sfz_loader_test_flags(AgsSFZLoader *sfz_loader, guint flags); void ags_sfz_loader_set_flags(AgsSFZLoader *sfz_loader, guint flags); void ags_sfz_loader_unset_flags(AgsSFZLoader *sfz_loader, guint flags); void ags_sfz_loader_start(AgsSFZLoader *sfz_loader); AgsSFZLoader* ags_sfz_loader_new(AgsAudio *audio, gchar *filename, gboolean do_replace); G_END_DECLS #endif /*__AGS_SFZ_LOADER_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_audio_loop.h0000644000175000017500000000717513607210263017071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_LOOP_H__ #define __AGS_AUDIO_LOOP_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_LOOP (ags_audio_loop_get_type()) #define AGS_AUDIO_LOOP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_LOOP, AgsAudioLoop)) #define AGS_AUDIO_LOOP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_LOOP, AgsAudioLoopClass)) #define AGS_IS_AUDIO_LOOP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_LOOP)) #define AGS_IS_AUDIO_LOOP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_LOOP)) #define AGS_AUDIO_LOOP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_LOOP, AgsAudioLoopClass)) #define AGS_AUDIO_LOOP_DEFAULT_JIFFIE (ceil(AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK) typedef struct _AgsAudioLoop AgsAudioLoop; typedef struct _AgsAudioLoopClass AgsAudioLoopClass; /** * AgsAudioLoopFlags: * @AGS_AUDIO_LOOP_PLAY_CHANNEL: play channel * @AGS_AUDIO_LOOP_PLAYING_CHANNEL: playing channnel * @AGS_AUDIO_LOOP_PLAY_CHANNEL_TERMINATING: play channe terminating * @AGS_AUDIO_LOOP_PLAY_AUDIO: play audio * @AGS_AUDIO_LOOP_PLAYING_AUDIO: playing audio * @AGS_AUDIO_LOOP_PLAY_AUDIO_TERMINATING: play audio terminating * * Enum values to control the behavior or indicate internal state of #AgsAudioLoop by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_LOOP_PLAY_CHANNEL = 1, AGS_AUDIO_LOOP_PLAYING_CHANNEL = 1 << 1, AGS_AUDIO_LOOP_PLAY_CHANNEL_TERMINATING = 1 << 2, AGS_AUDIO_LOOP_PLAY_AUDIO = 1 << 3, AGS_AUDIO_LOOP_PLAYING_AUDIO = 1 << 4, AGS_AUDIO_LOOP_PLAY_AUDIO_TERMINATING = 1 << 5, }AgsAudioLoopFlags; struct _AgsAudioLoop { AgsThread thread; guint flags; GRecMutex tree_lock; volatile gboolean is_syncing; volatile gboolean is_critical_region; volatile guint critical_region_ref; guint play_channel_ref; GList *play_channel; // play AgsChannel guint play_audio_ref; GList *play_audio; // play AgsAudio GList *sync_thread; }; struct _AgsAudioLoopClass { AgsThreadClass thread; }; GType ags_audio_loop_get_type(); gboolean ags_audio_loop_test_flags(AgsAudioLoop *audio_loop, guint flags); void ags_audio_loop_set_flags(AgsAudioLoop *audio_loop, guint flags); void ags_audio_loop_unset_flags(AgsAudioLoop *audio_loop, guint flags); void ags_audio_loop_add_audio(AgsAudioLoop *audio_loop, GObject *audio); void ags_audio_loop_remove_audio(AgsAudioLoop *audio_loop, GObject *audio); void ags_audio_loop_add_channel(AgsAudioLoop *audio_loop, GObject *channel); void ags_audio_loop_remove_channel(AgsAudioLoop *audio_loop, GObject *channel); AgsAudioLoop* ags_audio_loop_new(); G_END_DECLS #endif /*__AGS_AUDIO_LOOP_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_channel_thread.c0000644000175000017500000004402613616617253017677 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_channel_thread_class_init(AgsChannelThreadClass *channel_thread); void ags_channel_thread_connectable_interface_init(AgsConnectableInterface *connectable); void ags_channel_thread_init(AgsChannelThread *channel_thread); void ags_channel_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_channel_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_channel_thread_dispose(GObject *gobject); void ags_channel_thread_finalize(GObject *gobject); void ags_channel_thread_start(AgsThread *thread); void ags_channel_thread_run(AgsThread *thread); void ags_channel_thread_stop(AgsThread *thread); /** * SECTION:ags_channel_thread * @short_description: channel thread * @title: AgsChannelThread * @section_id: * @include: ags/audio/thread/ags_channel_thread.h * * The #AgsChannelThread acts as channel output thread to soundcard. */ enum{ PROP_0, PROP_DEFAULT_OUTPUT_SOUNDCARD, PROP_CHANNEL, PROP_SOUND_SCOPE, }; static gpointer ags_channel_thread_parent_class = NULL; static AgsConnectableInterface *ags_channel_thread_parent_connectable_interface; GType ags_channel_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_channel_thread = 0; static const GTypeInfo ags_channel_thread_info = { sizeof (AgsChannelThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_channel_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsChannelThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_channel_thread_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_channel_thread_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_channel_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsChannelThread", &ags_channel_thread_info, 0); g_type_add_interface_static(ags_type_channel_thread, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_channel_thread); } return g_define_type_id__volatile; } void ags_channel_thread_class_init(AgsChannelThreadClass *channel_thread) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_channel_thread_parent_class = g_type_class_peek_parent(channel_thread); /* GObject */ gobject = (GObjectClass *) channel_thread; gobject->set_property = ags_channel_thread_set_property; gobject->get_property = ags_channel_thread_get_property; gobject->dispose = ags_channel_thread_dispose; gobject->finalize = ags_channel_thread_finalize; /* properties */ /** * AgsChannelThread:default-output-soundcard: * * The assigned default soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-output-soundcard", i18n_pspec("default output soundcard assigned to"), i18n_pspec("The default output AgsSoundcard it is assigned to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_OUTPUT_SOUNDCARD, param_spec); /** * AgsChannelThread:channel: * * The assigned #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("channel assigned to"), i18n_pspec("The AgsChannel it is assigned to."), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /* AgsThread */ thread = (AgsThreadClass *) channel_thread; thread->start = ags_channel_thread_start; thread->run = ags_channel_thread_run; thread->stop = ags_channel_thread_stop; } void ags_channel_thread_connectable_interface_init(AgsConnectableInterface *connectable) { ags_channel_thread_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_channel_thread_init(AgsChannelThread *channel_thread) { AgsThread *thread; AgsConfig *config; gdouble frequency; guint samplerate; guint buffer_size; thread = (AgsThread *) channel_thread; ags_thread_set_flags(thread, (AGS_THREAD_START_SYNCED_FREQ | AGS_THREAD_IMMEDIATE_SYNC)); config = ags_config_get_instance(); samplerate = ags_soundcard_helper_config_get_samplerate(config); buffer_size = ags_soundcard_helper_config_get_buffer_size(config); frequency = ((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_object_set(thread, "frequency", frequency, NULL); g_atomic_int_set(&(channel_thread->status_flags), 0); channel_thread->default_output_soundcard = NULL; /* start */ g_mutex_init(&(channel_thread->wakeup_mutex)); g_cond_init(&(channel_thread->wakeup_cond)); /* sync */ g_mutex_init(&(channel_thread->done_mutex)); g_cond_init(&(channel_thread->done_cond)); /* channel and sound scope */ channel_thread->channel = NULL; channel_thread->sound_scope = -1; } void ags_channel_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsChannelThread *channel_thread; GRecMutex *thread_mutex; channel_thread = AGS_CHANNEL_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(channel_thread); switch(prop_id){ case PROP_DEFAULT_OUTPUT_SOUNDCARD: { GObject *default_output_soundcard; default_output_soundcard = g_value_get_object(value); g_rec_mutex_lock(thread_mutex); if(channel_thread->default_output_soundcard == default_output_soundcard){ g_rec_mutex_unlock(thread_mutex); return; } if(channel_thread->default_output_soundcard != NULL){ g_object_unref(channel_thread->default_output_soundcard); } if(default_output_soundcard != NULL){ g_object_ref(default_output_soundcard); } channel_thread->default_output_soundcard = default_output_soundcard; g_rec_mutex_unlock(thread_mutex); } break; case PROP_CHANNEL: { AgsChannel *channel; channel = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(thread_mutex); if(channel_thread->channel == (GObject *) channel){ g_rec_mutex_unlock(thread_mutex); return; } if(channel_thread->channel != NULL){ g_object_unref(G_OBJECT(channel_thread->channel)); } if(channel != NULL){ g_object_ref(G_OBJECT(channel)); } channel_thread->channel = (GObject *) channel; g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_channel_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsChannelThread *channel_thread; GRecMutex *thread_mutex; channel_thread = AGS_CHANNEL_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(channel_thread); switch(prop_id){ case PROP_DEFAULT_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(thread_mutex); g_value_set_object(value, channel_thread->default_output_soundcard); g_rec_mutex_unlock(thread_mutex); } break; case PROP_CHANNEL: { g_rec_mutex_lock(thread_mutex); g_value_set_object(value, G_OBJECT(channel_thread->channel)); g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_channel_thread_dispose(GObject *gobject) { AgsChannelThread *channel_thread; channel_thread = AGS_CHANNEL_THREAD(gobject); /* soundcard */ if(channel_thread->default_output_soundcard != NULL){ g_object_unref(channel_thread->default_output_soundcard); channel_thread->default_output_soundcard = NULL; } /* channel */ if(channel_thread->channel != NULL){ g_object_unref(channel_thread->channel); channel_thread->channel = NULL; } /* call parent */ G_OBJECT_CLASS(ags_channel_thread_parent_class)->dispose(gobject); } void ags_channel_thread_finalize(GObject *gobject) { AgsChannelThread *channel_thread; channel_thread = AGS_CHANNEL_THREAD(gobject); /* soundcard */ if(channel_thread->default_output_soundcard != NULL){ g_object_unref(channel_thread->default_output_soundcard); } /* channel */ if(channel_thread->channel != NULL){ g_object_unref(channel_thread->channel); } /* call parent */ G_OBJECT_CLASS(ags_channel_thread_parent_class)->finalize(gobject); } void ags_channel_thread_start(AgsThread *thread) { #ifdef AGS_DEBUG g_message("channel thread start"); #endif /* reset status */ ags_channel_thread_set_status_flags(thread, (AGS_CHANNEL_THREAD_STATUS_WAIT | AGS_CHANNEL_THREAD_STATUS_DONE | AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC | AGS_CHANNEL_THREAD_STATUS_DONE_SYNC)); AGS_THREAD_CLASS(ags_channel_thread_parent_class)->start(thread); } void ags_channel_thread_run(AgsThread *thread) { AgsChannel *channel; AgsPlayback *playback; AgsAudioLoop *audio_loop; AgsChannelThread *channel_thread; GList *recall_id; gint sound_scope; GRecMutex *thread_mutex; /* real-time setup */ #ifdef AGS_WITH_RT if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP)){ AgsPriority *priority; struct sched_param param; gchar *str; priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP); } #endif audio_loop = thread->parent; if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_SYNCED)){ return; } channel_thread = AGS_CHANNEL_THREAD(thread); g_object_get(channel_thread, "channel", &channel, NULL); g_object_get(channel, "playback", &playback, NULL); /* start - wait until signaled */ g_mutex_lock(&(channel_thread->wakeup_mutex)); if(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE) && ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT)){ ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE); while(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE) && ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT)){ g_cond_wait(&(channel_thread->wakeup_cond), &(channel_thread->wakeup_mutex)); } } ags_channel_thread_set_status_flags(channel_thread, (AGS_CHANNEL_THREAD_STATUS_WAIT | AGS_CHANNEL_THREAD_STATUS_DONE)); g_mutex_unlock(&(channel_thread->wakeup_mutex)); /* * do audio processing */ if(channel_thread->sound_scope >= 0){ sound_scope = channel_thread->sound_scope; if(sound_scope != AGS_SOUND_SCOPE_PLAYBACK || ags_playback_get_recall_id(playback, sound_scope) != NULL){ if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } } }else{ for(sound_scope = 0; sound_scope < AGS_SOUND_SCOPE_LAST; sound_scope++){ if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK || ags_playback_get_recall_id(playback, sound_scope) == NULL){ continue; } if((recall_id = ags_channel_check_scope(channel, sound_scope)) != NULL){ #if 1 ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_INTER)); ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE)); #else ags_channel_recursive_run_stage(channel, sound_scope, (AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST)); #endif g_list_free_full(recall_id, g_object_unref); } } } /* sync */ g_mutex_lock(&(channel_thread->done_mutex)); ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC); if(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC)){ g_cond_signal(&(channel_thread->done_cond)); } g_mutex_unlock(&(channel_thread->done_mutex)); /* unref */ g_object_unref(channel); g_object_unref(playback); } void ags_channel_thread_stop(AgsThread *thread) { AgsChannelThread *channel_thread; if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING)){ return; } /* */ channel_thread = AGS_CHANNEL_THREAD(thread); #ifdef AGS_DEBUG g_message("channel thread stop"); #endif /* call parent */ AGS_THREAD_CLASS(ags_channel_thread_parent_class)->stop(thread); /* ensure synced */ g_mutex_lock(&(channel_thread->done_mutex)); ags_channel_thread_unset_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_WAIT_SYNC); if(!ags_channel_thread_test_status_flags(channel_thread, AGS_CHANNEL_THREAD_STATUS_DONE_SYNC)){ g_cond_signal(&(channel_thread->done_cond)); } g_mutex_unlock(&(channel_thread->done_mutex)); } /** * ags_channel_thread_test_status_flags: * @channel_thread: the #AgsChannelThread * @status_flags: status flags * * Test @status_flags of @channel_thread. * * Returns: %TRUE if status flags set, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_channel_thread_test_status_flags(AgsChannelThread *channel_thread, guint status_flags) { gboolean retval; if(!AGS_IS_CHANNEL_THREAD(channel_thread)){ return(FALSE); } retval = ((status_flags & (g_atomic_int_get(&(channel_thread->status_flags)))) != 0) ? TRUE: FALSE; return(retval); } /** * ags_channel_thread_set_status_flags: * @channel_thread: the #AgsChannelThread * @status_flags: status flags * * Set status flags. * * Since: 3.0.0 */ void ags_channel_thread_set_status_flags(AgsChannelThread *channel_thread, guint status_flags) { if(!AGS_IS_CHANNEL_THREAD(channel_thread)){ return; } g_atomic_int_or(&(channel_thread->status_flags), status_flags); } /** * ags_channel_thread_unset_status_flags: * @channel_thread: the #AgsChannelThread * @status_flags: status flags * * Unset status flags. * * Since: 3.0.0 */ void ags_channel_thread_unset_status_flags(AgsChannelThread *channel_thread, guint status_flags) { if(!AGS_IS_CHANNEL_THREAD(channel_thread)){ return; } g_atomic_int_and(&(channel_thread->status_flags), (~status_flags)); } /** * ags_channel_thread_set_sound_scope: * @channel_thread: the #AgsChannelThread * @sound_scope: the sound scope * * Set sound scope. * * Since: 3.0.0 */ void ags_channel_thread_set_sound_scope(AgsChannelThread *channel_thread, gint sound_scope) { GRecMutex *thread_mutex; if(!AGS_IS_CHANNEL_THREAD(channel_thread)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(channel_thread); /* set scope */ g_rec_mutex_lock(thread_mutex); channel_thread->sound_scope = sound_scope; g_rec_mutex_unlock(thread_mutex); } /** * ags_channel_thread_new: * @default_output_soundcard: the #GObject * @channel: the #AgsChannel * * Create a new #AgsChannelThread. * * Returns: the new #AgsChannelThread * * Since: 3.0.0 */ AgsChannelThread* ags_channel_thread_new(GObject *default_output_soundcard, GObject *channel) { AgsChannelThread *channel_thread; channel_thread = (AgsChannelThread *) g_object_new(AGS_TYPE_CHANNEL_THREAD, "default-output-soundcard", default_output_soundcard, "channel", channel, NULL); return(channel_thread); } gsequencer-3.1.3/ags/audio/thread/ags_export_thread.h0000644000175000017500000000522013607210263017574 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPORT_THREAD_H__ #define __AGS_EXPORT_THREAD_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_EXPORT_THREAD (ags_export_thread_get_type()) #define AGS_EXPORT_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EXPORT_THREAD, AgsExportThread)) #define AGS_EXPORT_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_EXPORT_THREAD, AgsExportThreadClass)) #define AGS_IS_EXPORT_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_EXPORT_THREAD)) #define AGS_IS_EXPORT_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EXPORT_THREAD)) #define AGS_EXPORT_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_EXPORT_THREAD, AgsExportThreadClass)) #define AGS_EXPORT_THREAD_DEFAULT_JIFFIE (ceil(AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK) // same as soundcard thread typedef struct _AgsExportThread AgsExportThread; typedef struct _AgsExportThreadClass AgsExportThreadClass; /** * AgsExportThreadFlags: * @AGS_EXPORT_THREAD_LIVE_PERFORMANCE: do live export * * Enum values to control the behavior or indicate internal state of #AgsExportThread by * enable/disable as flags. */ typedef enum{ AGS_EXPORT_THREAD_LIVE_PERFORMANCE = 1, }AgsExportThreadFlags; struct _AgsExportThread { AgsThread thread; guint flags; guint tic; guint counter; GObject *soundcard; AgsAudioFile *audio_file; }; struct _AgsExportThreadClass { AgsThreadClass thread; }; GType ags_export_thread_get_type(); AgsExportThread* ags_export_thread_find_soundcard(AgsExportThread *export_thread, GObject *soundcard); AgsExportThread* ags_export_thread_new(GObject *soundcard, AgsAudioFile *audio_file); G_END_DECLS #endif /*__AGS_EXPORT_THREAD_H__*/ gsequencer-3.1.3/ags/audio/thread/ags_soundcard_thread.c0000644000175000017500000004237313614062654020251 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_soundcard_thread_class_init(AgsSoundcardThreadClass *soundcard_thread); void ags_soundcard_thread_connectable_interface_init(AgsConnectableInterface *connectable); void ags_soundcard_thread_init(AgsSoundcardThread *soundcard_thread); void ags_soundcard_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_soundcard_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_soundcard_thread_connect(AgsConnectable *connectable); void ags_soundcard_thread_disconnect(AgsConnectable *connectable); void ags_soundcard_thread_dispose(GObject *gobject); void ags_soundcard_thread_finalize(GObject *gobject); void ags_soundcard_thread_start(AgsThread *thread); void ags_soundcard_thread_run(AgsThread *thread); void ags_soundcard_thread_stop(AgsThread *thread); void ags_soundcard_thread_stopped_all_callback(AgsAudioLoop *audio_loop, AgsSoundcardThread *soundcard_thread); /** * SECTION:ags_soundcard_thread * @short_description: soundcard thread * @title: AgsSoundcardThread * @section_id: * @include: ags/audio/thread/ags_soundcard_thread.h * * The #AgsSoundcardThread acts as audio output thread to soundcard. */ static gpointer ags_soundcard_thread_parent_class = NULL; static AgsConnectableInterface *ags_soundcard_thread_parent_connectable_interface; enum{ PROP_0, PROP_SOUNDCARD, PROP_SOUNDCARD_CAPABILITY, }; GType ags_soundcard_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_soundcard_thread = 0; static const GTypeInfo ags_soundcard_thread_info = { sizeof (AgsSoundcardThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_soundcard_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSoundcardThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_soundcard_thread_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_soundcard_thread_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_soundcard_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsSoundcardThread", &ags_soundcard_thread_info, 0); g_type_add_interface_static(ags_type_soundcard_thread, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_soundcard_thread); } return g_define_type_id__volatile; } void ags_soundcard_thread_class_init(AgsSoundcardThreadClass *soundcard_thread) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_soundcard_thread_parent_class = g_type_class_peek_parent(soundcard_thread); /* GObject */ gobject = (GObjectClass *) soundcard_thread; gobject->set_property = ags_soundcard_thread_set_property; gobject->get_property = ags_soundcard_thread_get_property; gobject->dispose = ags_soundcard_thread_dispose; gobject->finalize = ags_soundcard_thread_finalize; /** * AgsSoundcardThread:soundcard: * * The assigned #AgsSoundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard assigned to"), i18n_pspec("The AgsSoundcard it is assigned to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsSoundcardThread:soundcard-capability: * * The soundcard capability. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("soundcard-capability", i18n_pspec("soundcard capability"), i18n_pspec("The soundcard capability"), 0, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD_CAPABILITY, param_spec); /* AgsThread */ thread = (AgsThreadClass *) soundcard_thread; thread->start = ags_soundcard_thread_start; thread->run = ags_soundcard_thread_run; thread->stop = ags_soundcard_thread_stop; } void ags_soundcard_thread_connectable_interface_init(AgsConnectableInterface *connectable) { ags_soundcard_thread_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_soundcard_thread_connect; connectable->disconnect = ags_soundcard_thread_disconnect; } void ags_soundcard_thread_init(AgsSoundcardThread *soundcard_thread) { AgsThread *thread; AgsConfig *config; gdouble frequency; guint samplerate; guint buffer_size; thread = (AgsThread *) soundcard_thread; ags_thread_set_flags(thread, (AGS_THREAD_START_SYNCED_FREQ | AGS_THREAD_INTERMEDIATE_POST_SYNC)); // g_atomic_int_or(&(thread->flags), // AGS_THREAD_TIMING); config = ags_config_get_instance(); samplerate = (guint) ags_soundcard_helper_config_get_samplerate(config); buffer_size = (guint) ags_soundcard_helper_config_get_buffer_size(config); frequency = ((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_object_set(thread, "frequency", frequency, NULL); /* */ soundcard_thread->soundcard_capability = 0; soundcard_thread->soundcard = NULL; soundcard_thread->error = NULL; } void ags_soundcard_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSoundcardThread *soundcard_thread; soundcard_thread = AGS_SOUNDCARD_THREAD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; guint samplerate; guint buffer_size; soundcard = (GObject *) g_value_get_object(value); if(soundcard_thread->soundcard != NULL){ g_object_unref(G_OBJECT(soundcard_thread->soundcard)); } if(soundcard != NULL){ g_object_ref(G_OBJECT(soundcard)); ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, &samplerate, &buffer_size, NULL); g_object_set(soundcard_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); /* playback */ if(AGS_IS_DEVOUT(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_POST_SYNC); }else if(AGS_IS_WASAPI_DEVOUT(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_POST_SYNC); }else if(AGS_IS_JACK_DEVOUT(soundcard) || AGS_IS_PULSE_DEVOUT(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_POST_SYNC); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_POST_SYNC); } /* capture */ if(AGS_IS_DEVIN(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC); }else if(AGS_IS_WASAPI_DEVIN(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC); }else if(AGS_IS_JACK_DEVIN(soundcard) || AGS_IS_PULSE_DEVIN(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC); }else if(AGS_IS_CORE_AUDIO_DEVIN(soundcard)){ ags_thread_set_flags(soundcard_thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC); } /* duplex */ //TODO:JK: implement me } soundcard_thread->soundcard = G_OBJECT(soundcard); } break; case PROP_SOUNDCARD_CAPABILITY: { soundcard_thread->soundcard_capability = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_soundcard_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSoundcardThread *soundcard_thread; soundcard_thread = AGS_SOUNDCARD_THREAD(gobject); switch(prop_id){ case PROP_SOUNDCARD: { g_value_set_object(value, G_OBJECT(soundcard_thread->soundcard)); } break; case PROP_SOUNDCARD_CAPABILITY: { g_value_set_uint(value, soundcard_thread->soundcard_capability); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_soundcard_thread_connect(AgsConnectable *connectable) { AgsThread *audio_loop, *soundcard_thread; soundcard_thread = AGS_THREAD(connectable); if(ags_thread_test_flags(soundcard_thread, AGS_THREAD_CONNECTED)){ return; } ags_soundcard_thread_parent_connectable_interface->connect(connectable); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(ags_application_context_get_instance())); g_signal_connect((GObject *) audio_loop, "stopped-all", G_CALLBACK(ags_soundcard_thread_stopped_all_callback), soundcard_thread); g_object_unref(audio_loop); } void ags_soundcard_thread_disconnect(AgsConnectable *connectable) { ags_soundcard_thread_parent_connectable_interface->disconnect(connectable); /* empty */ } void ags_soundcard_thread_dispose(GObject *gobject) { AgsSoundcardThread *soundcard_thread; soundcard_thread = AGS_SOUNDCARD_THREAD(gobject); /* soundcard */ if(soundcard_thread->soundcard != NULL){ g_object_unref(soundcard_thread->soundcard); soundcard_thread->soundcard = NULL; } /* call parent */ G_OBJECT_CLASS(ags_soundcard_thread_parent_class)->dispose(gobject); } void ags_soundcard_thread_finalize(GObject *gobject) { AgsSoundcardThread *soundcard_thread; soundcard_thread = AGS_SOUNDCARD_THREAD(gobject); /* soundcard */ if(soundcard_thread->soundcard != NULL){ g_object_unref(soundcard_thread->soundcard); } /* call parent */ G_OBJECT_CLASS(ags_soundcard_thread_parent_class)->finalize(gobject); } void ags_soundcard_thread_start(AgsThread *thread) { AgsSoundcardThread *soundcard_thread; soundcard_thread = AGS_SOUNDCARD_THREAD(thread); /* disable timing */ ags_thread_unset_flags(thread, AGS_THREAD_TIME_ACCOUNTING); AGS_THREAD_CLASS(ags_soundcard_thread_parent_class)->start(thread); } void ags_soundcard_thread_run(AgsThread *thread) { AgsSoundcardThread *soundcard_thread; GObject *soundcard; gboolean is_playing, is_recording; GError *error; soundcard_thread = AGS_SOUNDCARD_THREAD(thread); soundcard = soundcard_thread->soundcard; /* real-time setup */ #ifdef AGS_WITH_RT if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP)){ AgsPriority *priority; struct sched_param param; gchar *str; priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_RT_SETUP); } #endif /* playback */ if((AGS_SOUNDCARD_CAPABILITY_PLAYBACK & (soundcard_thread->soundcard_capability)) != 0){ is_playing = ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard)); if(is_playing){ error = NULL; ags_soundcard_play(AGS_SOUNDCARD(soundcard), &error); if(error != NULL){ //TODO:JK: implement me g_warning("%s", error->message); g_error_free(error); } } } /* capture */ if((AGS_SOUNDCARD_CAPABILITY_CAPTURE & (soundcard_thread->soundcard_capability)) != 0){ is_recording = ags_soundcard_is_recording(AGS_SOUNDCARD(soundcard)); if(is_recording){ error = NULL; ags_soundcard_record(AGS_SOUNDCARD(soundcard), &error); if(error != NULL){ //TODO:JK: implement me g_warning("%s", error->message); g_error_free(error); } } } /* duplex */ if((AGS_SOUNDCARD_CAPABILITY_DUPLEX & (soundcard_thread->soundcard_capability)) != 0){ //TODO:JK: implement me } } void ags_soundcard_thread_stop(AgsThread *thread) { AgsSoundcardThread *soundcard_thread; GObject *soundcard; soundcard_thread = AGS_SOUNDCARD_THREAD(thread); soundcard = soundcard_thread->soundcard; /* stop thread and soundcard */ if(AGS_IS_WASAPI_DEVOUT(soundcard)){ if((AGS_WASAPI_DEVOUT_SHUTDOWN & (AGS_WASAPI_DEVOUT(soundcard)->flags)) == 0){ ags_soundcard_stop(AGS_SOUNDCARD(soundcard)); }else{ /* reset flags */ AGS_WASAPI_DEVOUT(soundcard)->flags &= (~(AGS_WASAPI_DEVOUT_BUFFER0 | AGS_WASAPI_DEVOUT_BUFFER1 | AGS_WASAPI_DEVOUT_BUFFER2 | AGS_WASAPI_DEVOUT_BUFFER3 | AGS_WASAPI_DEVOUT_BUFFER4 | AGS_WASAPI_DEVOUT_BUFFER5 | AGS_WASAPI_DEVOUT_BUFFER6 | AGS_WASAPI_DEVOUT_BUFFER7 | AGS_WASAPI_DEVOUT_PLAY | AGS_WASAPI_DEVOUT_INITIALIZED | AGS_WASAPI_DEVOUT_SHUTDOWN)); AGS_THREAD_CLASS(ags_soundcard_thread_parent_class)->stop(thread); g_message("WASAPI thread stopped"); } }else if(AGS_IS_WASAPI_DEVIN(soundcard)){ if((AGS_WASAPI_DEVIN_SHUTDOWN & (AGS_WASAPI_DEVIN(soundcard)->flags)) == 0){ ags_soundcard_stop(AGS_SOUNDCARD(soundcard)); }else{ /* reset flags */ AGS_WASAPI_DEVIN(soundcard)->flags &= (~(AGS_WASAPI_DEVIN_BUFFER0 | AGS_WASAPI_DEVIN_BUFFER1 | AGS_WASAPI_DEVIN_BUFFER2 | AGS_WASAPI_DEVIN_BUFFER3 | AGS_WASAPI_DEVIN_BUFFER4 | AGS_WASAPI_DEVIN_BUFFER5 | AGS_WASAPI_DEVIN_BUFFER6 | AGS_WASAPI_DEVIN_BUFFER7 | AGS_WASAPI_DEVIN_RECORD | AGS_WASAPI_DEVIN_INITIALIZED | AGS_WASAPI_DEVIN_SHUTDOWN)); AGS_THREAD_CLASS(ags_soundcard_thread_parent_class)->stop(thread); g_message("WASAPI thread stopped"); } }else{ AGS_THREAD_CLASS(ags_soundcard_thread_parent_class)->stop(thread); //FIXME:JK: is this safe? ags_soundcard_stop(AGS_SOUNDCARD(soundcard)); } ags_thread_set_flags(thread, AGS_THREAD_TIME_ACCOUNTING); } void ags_soundcard_thread_stopped_all_callback(AgsAudioLoop *audio_loop, AgsSoundcardThread *soundcard_thread) { AgsSoundcard *soundcard; soundcard = AGS_SOUNDCARD(soundcard_thread->soundcard); if(ags_soundcard_is_playing(soundcard)){ ags_thread_stop((AgsThread *) soundcard_thread); } } /** * ags_soundcard_thread_find_soundcard: * @soundcard_thread: the #AgsSoundcardThread * @soundcard: the #AgsSoundcard to find * * Find @soundcard as sibling of @soundcard_thread, if it was found on the returned * thread should be called g_object_unref(). * * Returns: (transfer full): the matching #AgsSoundcardThread, if not * found %NULL. * * Since: 3.0.0 */ AgsSoundcardThread* ags_soundcard_thread_find_soundcard(AgsSoundcardThread *soundcard_thread, GObject *soundcard) { AgsThread *thread, *next_thread; if(!AGS_IS_SOUNDCARD_THREAD(soundcard_thread)){ return(NULL); } thread = soundcard_thread; g_object_ref(thread); while(thread != NULL){ if(AGS_IS_SOUNDCARD_THREAD(thread) && AGS_SOUNDCARD_THREAD(thread)->soundcard == soundcard){ return(thread); } /* iterate */ next_thread = ags_thread_next(thread); g_object_unref(thread); thread = next_thread; } return(NULL); } /** * ags_soundcard_thread_new: * @soundcard: the #AgsSoundcard * @soundcard_capability: see #AgsSoundcardCapability-enum * * Create a new instance of #AgsSoundcardThread. * * Returns: the new #AgsSoundcardThread * * Since: 3.0.0 */ AgsSoundcardThread* ags_soundcard_thread_new(GObject *soundcard, guint soundcard_capability) { AgsSoundcardThread *soundcard_thread; soundcard_thread = (AgsSoundcardThread *) g_object_new(AGS_TYPE_SOUNDCARD_THREAD, "soundcard", soundcard, "soundcard-capability", soundcard_capability, NULL); return(soundcard_thread); } gsequencer-3.1.3/ags/audio/ags_fourier_transform_util.c0000644000175000017500000003375113607210263020265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . * * Loy, Gareth * Musimathics volume 2 - Musical Signals, First MIT press paperback * edition, 2011 * MIT Press, * Copyright 2007 Gareth Loy * ISBN 978-0-262-51656-3 * * http://musimathics.com * * Based on Discrete Short Time Fourier Transform covered in Musimathics * volume 2 chapter 10. Thank you Dr. Gareth Loy. */ #include #include #include #include /** * SECTION:ags_fourier_transform_util * @short_description: fourier transform util * @title: AgsFourierTransformUtil * @section_id: * @include: ags/audio/ags_fourier_transform_util.h * * Utility functions to compute fourier transform. */ /** * ags_fourier_transform_util_compute_stft_s8: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_s8(gint8 *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; static const gdouble normalize_factor = M_PI / 127.0; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = ((gdouble) buffer[i] * normalize_factor) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_compute_stft_s16: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_s16(gint16 *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; static const gdouble normalize_factor = M_PI / 32767.0; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = ((gdouble) buffer[i] * normalize_factor) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_compute_stft_s24: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_s24(gint32 *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; static const gdouble normalize_factor = M_PI / 8388607.0; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = ((gdouble) buffer[i] * normalize_factor) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_compute_stft_s32: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_s32(gint32 *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; static const gdouble normalize_factor = M_PI / 214748363.0; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = ((gdouble) buffer[i] * normalize_factor) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_compute_stft_s64: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_s64(gint64 *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; static const long double normalize_factor = M_PI / 9223372036854775807.0; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = ((gdouble) buffer[i] * normalize_factor) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_compute_stft_float: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_float(gfloat *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = (buffer[i] * M_PI) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_compute_stft_double: * @buffer: the audio buffer * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_compute_stft_double(gdouble *buffer, guint channels, guint buffer_length, AgsComplex **retval) { guint n; guint i, i_stop; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble h; gdouble k; gdouble r; k = (gdouble) n; r = (gdouble) n; h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(n - r); z = (buffer[i] * M_PI) * h * cexp(-1.0 * I * 2.0 * M_PI * k * r); ags_complex_set(retval[0] + i, z); } } /** * ags_fourier_transform_util_inverse_stft_s8: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_s8(AgsComplex *buffer, guint channels, guint buffer_length, gint8 **retval) { guint n; guint i, i_stop; static const gdouble scale = 127.0 / M_PI; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = scale * y; } } /** * ags_fourier_transform_util_inverse_stft_s16: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_s16(AgsComplex *buffer, guint channels, guint buffer_length, gint16 **retval) { guint n; guint i, i_stop; static const gdouble scale = 32767.0 / M_PI; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = scale * y; } } /** * ags_fourier_transform_util_inverse_stft_s24: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_s24(AgsComplex *buffer, guint channels, guint buffer_length, gint32 **retval) { guint n; guint i, i_stop; static const gdouble scale = 8388607.0 / M_PI; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = scale * y; } } /** * ags_fourier_transform_util_inverse_stft_s32: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_s32(AgsComplex *buffer, guint channels, guint buffer_length, gint32 **retval) { guint n; guint i, i_stop; static const gdouble scale = 214748363.0 / M_PI; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = scale * y; } } /** * ags_fourier_transform_util_inverse_stft_s64: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_s64(AgsComplex *buffer, guint channels, guint buffer_length, gint64 **retval) { guint n; guint i, i_stop; static const long double scale = 9223372036854775807.0 / M_PI; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = scale * y; } } /** * ags_fourier_transform_util_inverse_stft_float: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_float(AgsComplex *buffer, guint channels, guint buffer_length, gfloat **retval) { guint n; guint i, i_stop; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = y / M_PI; } } /** * ags_fourier_transform_util_inverse_stft_double: * @buffer: the complex data * @channels: number of audio channels * @buffer_length: the buffer's length * @retval: the return location of result * * Compute inverse fourier transform of @buffer. * * Since: 3.0.0 */ void ags_fourier_transform_util_inverse_stft_double(AgsComplex *buffer, guint channels, guint buffer_length, gdouble **retval) { guint n; guint i, i_stop; if(buffer == NULL || retval == NULL || retval[0] == NULL){ return; } i_stop = channels * buffer_length; for(i = 0, n = 0; i < i_stop; i += channels, n++){ complex z; gdouble k; gdouble y; z = ags_complex_get(&(buffer[n])); k = (gdouble) n; y = (z * cexp(I * 2.0 * M_PI * k * n)); retval[0][i] = y / M_PI; } } gsequencer-3.1.3/ags/audio/ags_recall_recycling.c0000644000175000017500000006720713616617253017000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_recycling_class_init(AgsRecallRecyclingClass *recall_recycling); void ags_recall_recycling_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_recycling_init(AgsRecallRecycling *recall_recycling); void ags_recall_recycling_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_recycling_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_recycling_dispose(GObject *gobject); void ags_recall_recycling_finalize(GObject *gobject); void ags_recall_recycling_connect(AgsConnectable *connectable); void ags_recall_recycling_disconnect(AgsConnectable *connectable); void ags_recall_recycling_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_recall_recycling_disconnect_connection(AgsConnectable *connectable, GObject *connection); AgsRecall* ags_recall_recycling_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); void ags_recall_recycling_source_add_audio_signal_callback(AgsRecycling *source, AgsAudioSignal *audio_signal, AgsRecallRecycling *recall_recycling); void ags_recall_recycling_source_remove_audio_signal_callback(AgsRecycling *source, AgsAudioSignal *audio_signal, AgsRecallRecycling *recall_recycling); /** * SECTION:ags_recall_recycling * @short_description: recycling context of recall * @title: AgsRecallRecycling * @section_id: * @include: ags/audio/ags_recall_recycling.h * * #AgsRecallRecycling acts as recycling recall. */ enum{ PROP_0, PROP_AUDIO_CHANNEL, PROP_DESTINATION, PROP_SOURCE, PROP_CHILD_DESTINATION, PROP_CHILD_SOURCE, }; static gpointer ags_recall_recycling_parent_class = NULL; static AgsConnectableInterface* ags_recall_recycling_parent_connectable_interface; GType ags_recall_recycling_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_recycling = 0; static const GTypeInfo ags_recall_recycling_info = { sizeof (AgsRecallRecyclingClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_recycling_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallRecycling), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_recycling_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_recycling_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_recycling = g_type_register_static(AGS_TYPE_RECALL, "AgsRecallRecycling", &ags_recall_recycling_info, 0); g_type_add_interface_static(ags_type_recall_recycling, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_recycling); } return g_define_type_id__volatile; } void ags_recall_recycling_class_init(AgsRecallRecyclingClass *recall_recycling) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_recycling_parent_class = g_type_class_peek_parent(recall_recycling); /* GObjectClass */ gobject = (GObjectClass *) recall_recycling; gobject->set_property = ags_recall_recycling_set_property; gobject->get_property = ags_recall_recycling_get_property; gobject->dispose = ags_recall_recycling_dispose; gobject->finalize = ags_recall_recycling_finalize; /* properties */ /** * AgsRecallRecycling:audio-channel: * * The assigned destination recycling. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("assigned audio channel"), i18n_pspec("The audio channel this recall does output to"), 0, 65536, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsRecallRecycling:destination: * * The assigned destination recycling. * * Since: 3.0.0 */ param_spec = g_param_spec_object("destination", i18n_pspec("AgsRecycling destination of this recall"), i18n_pspec("The AgsRecycling destination of this recall"), AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESTINATION, param_spec); /** * AgsRecallRecycling:source: * * The assigned source recycling. * * Since: 3.0.0 */ param_spec = g_param_spec_object("source", i18n_pspec("AgsRecycling source of this recall"), i18n_pspec("The AgsRecycling source of this recall"), AGS_TYPE_RECYCLING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOURCE, param_spec); /** * AgsRecallRecycling:child-destination: * * The assigned destination audio signal. * * Since: 3.0.0 */ param_spec = g_param_spec_object("child-destination", i18n_pspec("AgsAudioSignal of this recall"), i18n_pspec("The destination AgsAudioSignal child recall needs"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHILD_DESTINATION, param_spec); /** * AgsRecallRecycling:child-source: (type GList(AgsAudioSignal)) (transfer full) * * The assigned source audio signal. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("child-source", i18n_pspec("AgsAudioSignal of this recall"), i18n_pspec("The source AgsAudioSignal child recall needs"), G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHILD_SOURCE, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_recycling; recall->duplicate = ags_recall_recycling_duplicate; /* AgsRecallRecyclingClass */ } void ags_recall_recycling_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_recall_recycling_connectable_parent_interface; ags_recall_recycling_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_recall_recycling_connect; connectable->disconnect = ags_recall_recycling_disconnect; connectable->connect_connection = ags_recall_recycling_connect_connection; connectable->disconnect_connection = ags_recall_recycling_disconnect_connection; } void ags_recall_recycling_init(AgsRecallRecycling *recall_recycling) { recall_recycling->flags = (AGS_RECALL_RECYCLING_MAP_CHILD_DESTINATION | AGS_RECALL_RECYCLING_MAP_CHILD_SOURCE); recall_recycling->audio_channel = 0; recall_recycling->destination = NULL; recall_recycling->source = NULL; recall_recycling->child_destination = NULL; recall_recycling->child_source = NULL; } void ags_recall_recycling_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallRecycling *recall_recycling; GRecMutex *recall_mutex; recall_recycling = AGS_RECALL_RECYCLING(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_recycling); switch(prop_id){ case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(recall_mutex); recall_recycling->audio_channel = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { AgsRecycling *destination; destination = (AgsRecycling *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_recycling->destination == destination){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_recycling->destination != NULL){ g_object_unref(G_OBJECT(recall_recycling->destination)); } if(destination != NULL){ g_object_ref(G_OBJECT(destination)); } recall_recycling->destination = destination; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { AgsRecycling *source; source = (AgsRecycling *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_recycling->source == source){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_recycling->source != NULL){ if((AGS_RECALL_TEMPLATE & (AGS_RECALL(recall_recycling)->flags)) == 0 && ags_connectable_is_connected(AGS_CONNECTABLE(recall_recycling))){ ags_connectable_disconnect_connection(AGS_CONNECTABLE(recall_recycling), (GObject *) recall_recycling->source); } g_object_unref(recall_recycling->source); } if(source != NULL){ g_object_ref(G_OBJECT(source)); } recall_recycling->source = source; if(source != NULL){ if((AGS_RECALL_TEMPLATE & (AGS_RECALL(recall_recycling)->flags)) == 0 && ags_connectable_is_connected(AGS_CONNECTABLE(recall_recycling))){ ags_connectable_connect_connection(AGS_CONNECTABLE(recall_recycling), (GObject *) source); } } g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD_DESTINATION: { AgsAudioSignal *child_destination; child_destination = (AgsAudioSignal *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_recycling->child_destination == child_destination){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_recycling->child_destination != NULL){ g_object_unref(G_OBJECT(recall_recycling->child_destination)); } if(child_destination != NULL){ g_object_ref(G_OBJECT(child_destination)); } recall_recycling->child_destination = child_destination; g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD_SOURCE: { AgsAudioSignal *child_source; child_source = (AgsAudioSignal *) g_value_get_pointer(value); g_rec_mutex_lock(recall_mutex); if(!AGS_IS_AUDIO_SIGNAL(child_source) || g_list_find(recall_recycling->child_source, child_source) != NULL){ g_rec_mutex_unlock(recall_mutex); return; } g_object_ref(G_OBJECT(child_source)); recall_recycling->child_source = g_list_prepend(recall_recycling->child_source, child_source); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_recycling_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallRecycling *recall_recycling; GRecMutex *recall_mutex; recall_recycling = AGS_RECALL_RECYCLING(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_recycling); switch(prop_id){ case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_recycling->audio_channel); g_rec_mutex_unlock(recall_mutex); } break; case PROP_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_recycling->destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_recycling->source); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_recycling->child_destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_CHILD_SOURCE: { g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(recall_recycling->child_source, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; }; } void ags_recall_recycling_dispose(GObject *gobject) { AgsRecallRecycling *recall_recycling; recall_recycling = AGS_RECALL_RECYCLING(gobject); /* destination */ if(recall_recycling->destination != NULL){ g_object_unref(G_OBJECT(recall_recycling->destination)); recall_recycling->destination = NULL; } /* source */ if(recall_recycling->source != NULL){ g_object_unref(G_OBJECT(recall_recycling->source)); recall_recycling->source = NULL; } /* child destination */ if(recall_recycling->child_destination != NULL){ g_object_unref(G_OBJECT(recall_recycling->child_destination)); recall_recycling->child_destination = NULL; } /* child source */ if(recall_recycling->child_source != NULL){ g_list_free_full(recall_recycling->child_source, g_object_unref); recall_recycling->child_source = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_recycling_parent_class)->dispose(gobject); } void ags_recall_recycling_finalize(GObject *gobject) { AgsRecallRecycling *recall_recycling; recall_recycling = AGS_RECALL_RECYCLING(gobject); /* destination */ if(recall_recycling->destination != NULL){ g_object_unref(G_OBJECT(recall_recycling->destination)); } /* source */ if(recall_recycling->source != NULL){ g_object_unref(G_OBJECT(recall_recycling->source)); } /* child destination */ if(recall_recycling->child_destination != NULL){ g_object_unref(G_OBJECT(recall_recycling->child_destination)); } /* child source */ if(recall_recycling->child_source != NULL){ g_list_free_full(recall_recycling->child_source, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_recall_recycling_parent_class)->finalize(gobject); } void ags_recall_recycling_connect(AgsConnectable *connectable) { AgsRecycling *source; AgsRecallRecycling *recall_recycling; if(ags_connectable_is_connected(connectable)){ return; } recall_recycling = AGS_RECALL_RECYCLING(connectable); g_object_get(recall_recycling, "source", &source, NULL); ags_recall_recycling_parent_connectable_interface->connect(connectable); ags_connectable_connect_connection(connectable, (GObject *) source); g_object_unref(source); } void ags_recall_recycling_disconnect(AgsConnectable *connectable) { AgsRecycling *source; AgsRecallRecycling *recall_recycling; if(!ags_connectable_is_connected(connectable)){ return; } recall_recycling = AGS_RECALL_RECYCLING(connectable); g_object_get(recall_recycling, "source", &source, NULL); ags_recall_recycling_parent_connectable_interface->disconnect(connectable); ags_connectable_disconnect_connection(connectable, (GObject *) source); g_object_unref(source); } void ags_recall_recycling_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsRecallRecycling *recall_recycling; recall_recycling = AGS_RECALL_RECYCLING(connectable); if((GObject *) recall_recycling->destination == connection){ //empty }else if((GObject *) recall_recycling->source == connection){ g_signal_connect_after(connection, "add-audio-signal", G_CALLBACK(ags_recall_recycling_source_add_audio_signal_callback), recall_recycling); g_signal_connect(connection, "remove-audio-signal", G_CALLBACK(ags_recall_recycling_source_remove_audio_signal_callback), recall_recycling); } } void ags_recall_recycling_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsRecallRecycling *recall_recycling; recall_recycling = AGS_RECALL_RECYCLING(connectable); if((GObject *) recall_recycling->destination == connection){ //empty }else if((GObject *) recall_recycling->source == connection){ g_object_disconnect(connection, "any_signal::add-audio-signal", G_CALLBACK(ags_recall_recycling_source_add_audio_signal_callback), recall_recycling, NULL); g_object_disconnect(connection, "any_signal::remove-audio-signal", G_CALLBACK(ags_recall_recycling_source_remove_audio_signal_callback), recall_recycling, NULL); } } AgsRecall* ags_recall_recycling_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsRecycling *destination, *source; AgsRecallRecycling *recall_recycling, *copy_recall_recycling; guint audio_channel; recall_recycling = AGS_RECALL_RECYCLING(recall); /* get some fields */ g_object_get(recall_recycling, "audio-channel", &audio_channel, "destination", &destination, "source", &source, NULL); copy_recall_recycling = AGS_RECALL_RECYCLING(AGS_RECALL_CLASS(ags_recall_recycling_parent_class)->duplicate(recall, recall_id, n_params, parameter_name, value)); g_object_set(copy_recall_recycling, "audio-channel", audio_channel, "destination", destination, "source", source, NULL); if(destination != NULL){ g_object_unref(destination); } if(source != NULL){ g_object_unref(source); } return((AgsRecall *) copy_recall_recycling); } void ags_recall_recycling_source_add_audio_signal_callback(AgsRecycling *source, AgsAudioSignal *audio_signal, AgsRecallRecycling *recall_recycling) { AgsChannel *channel; AgsChannel *destination_channel; AgsRecallChannelRun *recall_channel_run; AgsRecallAudioSignal *recall_audio_signal; AgsRecallID *recall_id, *source_recall_id; AgsRecyclingContext *recycling_context, *source_recycling_context; GObject *output_soundcard; GType child_type; GList *list_start; gint sound_scope; guint audio_channel; gboolean success; GRecMutex *recall_mutex; if(ags_audio_signal_test_flags(audio_signal, AGS_AUDIO_SIGNAL_TEMPLATE) || ags_audio_signal_test_flags(audio_signal, AGS_AUDIO_SIGNAL_RT_TEMPLATE)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_recycling); /* get some fields */ g_object_get(recall_recycling, "output-soundcard", &output_soundcard, NULL); g_rec_mutex_lock(recall_mutex); sound_scope = AGS_RECALL(recall_recycling)->sound_scope; child_type = AGS_RECALL(recall_recycling)->child_type; audio_channel = recall_recycling->audio_channel; g_rec_mutex_unlock(recall_mutex); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "source", &channel, NULL); g_object_get(recall_recycling, "recall-id", &recall_id, NULL); if(recall_id == NULL){ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(recall_channel_run); g_object_unref(channel); return; } g_object_get(audio_signal, "recall-id", &source_recall_id, NULL); if(source_recall_id == NULL){ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); return; } g_object_get(recall_id, "recycling-context", &recycling_context, NULL); if(recycling_context == NULL){ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); return; } g_object_get(source_recall_id, "recycling-context", &source_recycling_context, NULL); if(source_recycling_context == NULL){ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); g_object_unref(recycling_context); return; } if(recycling_context != source_recycling_context){ if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); g_object_unref(recycling_context); g_object_unref(source_recycling_context); return; } g_object_get(recall_channel_run, "destination", &destination_channel, NULL); if(destination_channel != NULL){ AgsRecyclingContext *parent_recycling_context; g_object_get(destination_channel, "recall-id", &list_start, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); success = (destination_channel == NULL || ags_recall_id_find_recycling_context(list_start, parent_recycling_context) != NULL) ? TRUE: FALSE; g_object_unref(parent_recycling_context); g_list_free_full(list_start, g_object_unref); if(!success){ goto ags_recall_recycling_source_add_audio_signal_callback_END; } } if(!ags_recall_id_check_sound_scope(recall_id, sound_scope)){ goto ags_recall_recycling_source_add_audio_signal_callback_END; } #ifdef AGS_DEBUG g_message("add %s", G_OBJECT_TYPE_NAME(recall_recycling)); g_message("ags_recall_recycling_source_add_audio_signal_callback %s[%llx]", G_OBJECT_TYPE_NAME(recall_recycling), (long long unsigned int) recall_recycling); g_message("ags_recall_recycling_source_add_audio_signal - channel: %s[%u]", G_OBJECT_TYPE_NAME(recall_recycling), AGS_CHANNEL(recall_recycling->source->channel)->line); if(!AGS_IS_INPUT(source->channel)){ g_message("ags_recall_recycling_source_add_audio_signal_callback[%s]", G_OBJECT_TYPE_NAME(recall)); } #endif if(child_type != G_TYPE_NONE){ recall_audio_signal = g_object_new(child_type, "output-soundcard", output_soundcard, "recall-id", source_recall_id, "audio-channel", audio_channel, "source", audio_signal, NULL); #ifdef AGS_DEBUG g_message(" + recall recycling %s", G_OBJECT_TYPE_NAME(recall_audio_signal)); #endif ags_recall_add_child((AgsRecall *) recall_recycling, (AgsRecall *) recall_audio_signal); } ags_recall_recycling_source_add_audio_signal_callback_END: if(output_soundcard != NULL){ g_object_unref(output_soundcard); } g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); g_object_unref(recycling_context); g_object_unref(source_recycling_context); if(destination_channel != NULL){ g_object_unref(destination_channel); } } void ags_recall_recycling_source_remove_audio_signal_callback(AgsRecycling *source, AgsAudioSignal *audio_signal, AgsRecallRecycling *recall_recycling) { AgsChannel *channel; AgsChannel *destination_channel; AgsAudioSignal *current_audio_signal; AgsRecallChannelRun *recall_channel_run; AgsRecallAudioSignal *recall_audio_signal; AgsRecallID *recall_id, *source_recall_id; AgsRecyclingContext *recycling_context, *source_recycling_context; AgsRecyclingContext *parent_recycling_context; GList *list_start, *list; gboolean success; if((AGS_AUDIO_SIGNAL_TEMPLATE & (audio_signal->flags)) != 0 || (AGS_AUDIO_SIGNAL_RT_TEMPLATE & (audio_signal->flags)) != 0){ return; } g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "source", &channel, NULL); g_object_get(recall_recycling, "recall-id", &recall_id, NULL); if(recall_id == NULL){ g_object_unref(recall_channel_run); g_object_unref(channel); return; } g_object_get(audio_signal, "recall-id", &source_recall_id, NULL); if(source_recall_id == NULL){ g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); return; } g_object_get(recall_id, "recycling-context", &recycling_context, NULL); if(recycling_context == NULL){ g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); return; } g_object_get(source_recall_id, "recycling-context", &source_recycling_context, NULL); if(source_recycling_context == NULL){ g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); g_object_unref(recycling_context); return; } g_object_get(recall_channel_run, "destination", &destination_channel, NULL); if(destination_channel != NULL){ g_object_get(destination_channel, "recall-id", &list_start, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); success = (destination_channel == NULL || ags_recall_id_find_recycling_context(list_start, parent_recycling_context) != NULL) ? TRUE: FALSE; g_list_free_full(list_start, g_object_unref); if(!success){ goto ags_recall_recycling_source_remove_audio_signal_callback_END; } } #ifdef AGS_DEBUG g_message("ags_recall_recycling_source_remove_audio_signal - channel: %s[%u]\n", G_OBJECT_TYPE_NAME(recall_recycling), AGS_CHANNEL(recall_recycling->source->channel)->line); #endif #if 0 g_object_get(recall_recycling, "child", &list_start, NULL); list = list_start; while(list != NULL){ recall_audio_signal = AGS_RECALL_AUDIO_SIGNAL(list->data); g_object_get(recall_audio_signal, "source", ¤t_audio_signal, NULL); if(current_audio_signal == audio_signal){ g_message("- recall recycling %s", G_OBJECT_TYPE_NAME(recall_audio_signal)); ags_recall_done((AgsRecall *) recall_audio_signal); } g_object_unref(current_audio_signal); list = list->next; } g_list_free_full(list_start, g_object_unref); #endif ags_recall_recycling_source_remove_audio_signal_callback_END: g_object_unref(recall_channel_run); g_object_unref(channel); g_object_unref(recall_id); g_object_unref(source_recall_id); g_object_unref(recycling_context); g_object_unref(source_recycling_context); if(destination_channel != NULL){ g_object_unref(destination_channel); } } /** * ags_recall_recycling_new: * * Creates a new instance of #AgsRecallRecycling * * Returns: the new #AgsRecallRecycling * * Since: 3.0.0 */ AgsRecallRecycling* ags_recall_recycling_new() { AgsRecallRecycling *recall_recycling; recall_recycling = (AgsRecallRecycling *) g_object_new(AGS_TYPE_RECALL_RECYCLING, NULL); return(recall_recycling); } gsequencer-3.1.3/ags/audio/ags_recall_lv2.c0000644000175000017500000006305613607210263015510 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include void ags_recall_lv2_class_init(AgsRecallLv2Class *recall_lv2_class); void ags_recall_lv2_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_lv2_init(AgsRecallLv2 *recall_lv2); void ags_recall_lv2_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_lv2_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_lv2_dispose(GObject *gobject); void ags_recall_lv2_finalize(GObject *gobject); /** * SECTION:ags_recall_lv2 * @short_description: The object interfacing with LV2 * @title: AgsRecallLv2 * @section_id: * @include: ags/audio/ags_recall_lv2.h * * #AgsRecallLv2 provides LV2 support. */ enum{ PROP_0, PROP_TURTLE, PROP_PLUGIN, PROP_URI, PROP_EVENT_PORT, PROP_ATOM_PORT, PROP_BANK, PROP_PROGRAM, }; static gpointer ags_recall_lv2_parent_class = NULL; static AgsConnectableInterface* ags_recall_lv2_parent_connectable_interface; GType ags_recall_lv2_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_lv2 = 0; static const GTypeInfo ags_recall_lv2_info = { sizeof (AgsRecallLv2Class), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_lv2_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallLv2), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_lv2_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_lv2_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_lv2 = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsRecallLv2", &ags_recall_lv2_info, 0); g_type_add_interface_static(ags_type_recall_lv2, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_lv2); } return g_define_type_id__volatile; } void ags_recall_lv2_class_init(AgsRecallLv2Class *recall_lv2) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_lv2_parent_class = g_type_class_peek_parent(recall_lv2); /* GObjectClass */ gobject = (GObjectClass *) recall_lv2; gobject->set_property = ags_recall_lv2_set_property; gobject->get_property = ags_recall_lv2_get_property; gobject->dispose = ags_recall_lv2_dispose; gobject->finalize = ags_recall_lv2_finalize; /* properties */ /** * AgsRecallLv2:turtle: * * The assigned turtle. * * Since: 3.0.0 */ param_spec = g_param_spec_object("turtle", i18n_pspec("turtle of recall lv2"), i18n_pspec("The turtle which this recall lv2 is described by"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TURTLE, param_spec); /** * AgsRecallLv2:plugin: * * The assigned plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("plugin", i18n_pspec("plugin of recall lv2"), i18n_pspec("The plugin which this recall lv2 does run"), AGS_TYPE_LV2_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN, param_spec); /** * AgsRecallLv2:uri: * * The uri's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("uri", i18n_pspec("the uri"), i18n_pspec("The uri's string representation"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URI, param_spec); /** * AgsRecallLv2:event-port: * * The event port index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("event-port", i18n_pspec("event port"), i18n_pspec("The event port index"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EVENT_PORT, param_spec); /** * AgsRecallLv2:atom-port: * * The atom port index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("atom-port", i18n_pspec("atom port"), i18n_pspec("The atom port index"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ATOM_PORT, param_spec); /** * AgsRecallLv2:bank: * * The selected bank. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("bank", i18n_pspec("bank"), i18n_pspec("The selected bank"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BANK, param_spec); /** * AgsRecallLv2:program: * * The selected program. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("program", i18n_pspec("program"), i18n_pspec("The selected program"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PROGRAM, param_spec); } void ags_recall_lv2_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_lv2_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_lv2_init(AgsRecallLv2 *recall_lv2) { AGS_RECALL(recall_lv2)->name = "ags-lv2"; AGS_RECALL(recall_lv2)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(recall_lv2)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(recall_lv2)->xml_type = "ags-recall-lv2"; AGS_RECALL(recall_lv2)->port = NULL; recall_lv2->flags = 0; recall_lv2->turtle = NULL; recall_lv2->uri = NULL; recall_lv2->plugin = NULL; recall_lv2->plugin_descriptor = NULL; recall_lv2->input_port = NULL; recall_lv2->input_lines = 0; recall_lv2->output_port = NULL; recall_lv2->output_lines = 0; recall_lv2->event_port = 0; recall_lv2->atom_port = 0; recall_lv2->bank = 0; recall_lv2->program = 0; } void ags_recall_lv2_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallLv2 *recall_lv2; GRecMutex *recall_mutex; recall_lv2 = AGS_RECALL_LV2(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); switch(prop_id){ case PROP_TURTLE: { AgsTurtle *turtle; turtle = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_lv2->turtle == turtle){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_lv2->turtle != NULL){ g_object_unref(recall_lv2->turtle); } if(turtle != NULL){ g_object_ref(turtle); } recall_lv2->turtle = turtle; g_rec_mutex_unlock(recall_mutex); } break; case PROP_PLUGIN: { AgsLv2Plugin *plugin; plugin = (AgsLv2Plugin *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_lv2->plugin == plugin){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_lv2->plugin != NULL){ g_object_unref(recall_lv2->plugin); } if(plugin != NULL){ g_object_ref(plugin); } recall_lv2->plugin = plugin; g_rec_mutex_unlock(recall_mutex); } break; case PROP_URI: { gchar *uri; uri = g_value_get_string(value); g_rec_mutex_lock(recall_mutex); if(uri == recall_lv2->uri){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_lv2->uri != NULL){ g_free(recall_lv2->uri); } recall_lv2->uri = g_strdup(uri); g_rec_mutex_unlock(recall_mutex); } break; case PROP_EVENT_PORT: { g_rec_mutex_lock(recall_mutex); recall_lv2->event_port = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_ATOM_PORT: { g_rec_mutex_lock(recall_mutex); recall_lv2->atom_port = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BANK: { g_rec_mutex_lock(recall_mutex); recall_lv2->bank = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(recall_mutex); recall_lv2->program = g_value_get_uint(value); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_lv2_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallLv2 *recall_lv2; GRecMutex *recall_mutex; recall_lv2 = AGS_RECALL_LV2(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); switch(prop_id){ case PROP_TURTLE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_lv2->turtle); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PLUGIN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_lv2->plugin); g_rec_mutex_unlock(recall_mutex); } break; case PROP_URI: { g_rec_mutex_lock(recall_mutex); g_value_set_string(value, recall_lv2->uri); g_rec_mutex_unlock(recall_mutex); } break; case PROP_EVENT_PORT: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_lv2->event_port); g_rec_mutex_unlock(recall_mutex); } break; case PROP_ATOM_PORT: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_lv2->atom_port); g_rec_mutex_unlock(recall_mutex); } break; case PROP_BANK: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_lv2->bank); g_rec_mutex_unlock(recall_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(recall_mutex); g_value_set_uint(value, recall_lv2->program); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_lv2_dispose(GObject *gobject) { AgsRecallLv2 *recall_lv2; recall_lv2 = AGS_RECALL_LV2(gobject); /* turtle */ if(recall_lv2->turtle != NULL){ g_object_unref(recall_lv2->turtle); recall_lv2->turtle = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_lv2_parent_class)->dispose(gobject); } void ags_recall_lv2_finalize(GObject *gobject) { AgsRecallLv2 *recall_lv2; recall_lv2 = AGS_RECALL_LV2(gobject); /* turtle */ if(recall_lv2->turtle != NULL){ g_object_unref(recall_lv2->turtle); } if(recall_lv2->input_port != NULL){ free(recall_lv2->input_port); } if(recall_lv2->output_port != NULL){ free(recall_lv2->output_port); } /* call parent */ G_OBJECT_CLASS(ags_recall_lv2_parent_class)->finalize(gobject); } /** * ags_recall_lv2_test_flags: * @recall_lv2: the #AgsRecallLv2 * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_lv2_test_flags(AgsRecallLv2 *recall_lv2, guint flags) { gboolean retval; GRecMutex *recall_mutex; if(!AGS_IS_RECALL_LV2(recall_lv2)){ return(FALSE); } /* get base plugin mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* test flags */ g_rec_mutex_lock(recall_mutex); retval = ((flags & (recall_lv2->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); return(retval); } /** * ags_recall_lv2_set_flags: * @recall_lv2: the #AgsRecallLv2 * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_recall_lv2_set_flags(AgsRecallLv2 *recall_lv2, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL_LV2(recall_lv2)){ return; } /* get base plugin mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* set flags */ g_rec_mutex_lock(recall_mutex); recall_lv2->flags |= flags; g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_lv2_unset_flags: * @recall_lv2: the #AgsRecallLv2 * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_recall_lv2_unset_flags(AgsRecallLv2 *recall_lv2, guint flags) { GRecMutex *recall_mutex; if(!AGS_IS_RECALL_LV2(recall_lv2)){ return; } /* get base plugin mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* unset flags */ g_rec_mutex_lock(recall_mutex); recall_lv2->flags &= (~flags); g_rec_mutex_unlock(recall_mutex); } /** * ags_recall_lv2_load: * @recall_lv2: the #AgsRecallLv2 * * Set up LV2 handle. * * Since: 3.0.0 */ void ags_recall_lv2_load(AgsRecallLv2 *recall_lv2) { AgsLv2Plugin *lv2_plugin; gchar *filename; gchar *effect; guint effect_index; guint i; void *plugin_so; LV2_Descriptor_Function lv2_descriptor; LV2_Descriptor *plugin_descriptor; GRecMutex *recall_mutex; if(!AGS_IS_RECALL_LV2(recall_lv2)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* get some fields */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall_lv2)->filename); effect = g_strdup(AGS_RECALL(recall_lv2)->effect); g_rec_mutex_unlock(recall_mutex); /* find lv2 plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); g_object_get(lv2_plugin, "plugin-so", &plugin_so, NULL); if(plugin_so == NULL){ g_message("open %s", filename); #ifdef AGS_W32API plugin_so = LoadLibrary(filename); #else plugin_so = dlopen(filename, RTLD_NOW); #endif g_object_set(lv2_plugin, "plugin-so", plugin_so, NULL); } g_free(filename); g_free(effect); if(plugin_so != NULL){ gboolean success; success = FALSE; #ifdef AGS_W32API lv2_descriptor = (LV2_Descriptor_Function) GetProcAddress(plugin_so, "lv2_descriptor"); success = (!lv2_descriptor) ? FALSE: TRUE; #else lv2_descriptor = (LV2_Descriptor_Function) dlsym(plugin_so, "lv2_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && lv2_descriptor){ effect_index = 0; for(i = 0; (plugin_descriptor = lv2_descriptor((unsigned long) i)) != NULL; i++){ if(!g_ascii_strcasecmp(plugin_descriptor->URI, lv2_plugin->uri)){ effect_index = i; g_object_set(lv2_plugin, "effect-index", effect_index, NULL); break; } } g_rec_mutex_lock(recall_mutex); recall_lv2->plugin_descriptor = plugin_descriptor; g_rec_mutex_unlock(recall_mutex); if(ags_lv2_plugin_test_flags(lv2_plugin, AGS_LV2_PLUGIN_NEEDS_WORKER)){ ags_recall_lv2_set_flags(recall_lv2, AGS_RECALL_LV2_HAS_WORKER); } } } } /** * ags_recall_lv2_load_ports: * @recall_lv2: the #AgsRecallLv2 * * Set up LV2 ports. * * Returns: (element-type AgsAudio.Port) (transfer full): the #GList-struct containing #AgsPort * * Since: 3.0.0 */ GList* ags_recall_lv2_load_ports(AgsRecallLv2 *recall_lv2) { AgsPort *current_port; AgsLv2Plugin *lv2_plugin; GList *port, *retval; GList *plugin_port_start, *plugin_port; gchar *filename; gchar *effect; guint effect_index; guint port_count; guint i; GRecMutex *recall_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_RECALL_LV2(recall_lv2)){ return(NULL); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_lv2); /* get some fields */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall_lv2)->filename); effect = g_strdup(AGS_RECALL(recall_lv2)->effect); effect_index = AGS_RECALL(recall_lv2)->effect_index; g_rec_mutex_unlock(recall_mutex); /* find lv2 plugin */ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); g_free(filename); g_free(effect); /* set lv2 plugin */ g_rec_mutex_lock(recall_mutex); recall_lv2->plugin = lv2_plugin; g_rec_mutex_unlock(recall_mutex); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* get port descriptor */ g_rec_mutex_lock(base_plugin_mutex); plugin_port = plugin_port_start = g_list_copy(AGS_BASE_PLUGIN(lv2_plugin)->plugin_port); g_rec_mutex_unlock(base_plugin_mutex); port = NULL; retval = NULL; if(plugin_port != NULL){ port_count = g_list_length(plugin_port_start); for(i = 0; i < port_count; i++){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INPUT)){ if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_EVENT)){ guint port_index; ags_recall_lv2_set_flags(recall_lv2, AGS_RECALL_LV2_HAS_EVENT_PORT); g_object_get(current_plugin_port, "port-index", &port_index, NULL); g_object_set(recall_lv2, "event-port", port_index, NULL); } if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_ATOM)){ guint port_index; ags_recall_lv2_set_flags(recall_lv2, AGS_RECALL_LV2_HAS_ATOM_PORT); g_object_get(current_plugin_port, "port-index", &port_index, NULL); g_object_set(recall_lv2, "atom-port", port_index, NULL); } } if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_CONTROL) && (ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INPUT) || ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT))){ gchar *plugin_name; gchar *specifier; GValue *default_value; default_value = g_new0(GValue, 1); g_value_init(default_value, G_TYPE_FLOAT); g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_value_copy(current_plugin_port->default_value, default_value); g_rec_mutex_unlock(plugin_port_mutex); if(specifier == NULL){ g_value_unset(default_value); g_free(default_value); plugin_port = plugin_port->next; continue; } plugin_name = g_strdup_printf("lv2-<%s>", lv2_plugin->uri); current_port = g_object_new(AGS_TYPE_PORT, "plugin-name", plugin_name, "specifier", specifier, "control-port", g_strdup_printf("%u/%u", i, port_count), "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, NULL); g_object_ref(current_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT)){ current_port->flags |= AGS_PORT_IS_OUTPUT; ags_recall_set_flags((AgsRecall *) recall_lv2, AGS_RECALL_HAS_OUTPUT_PORT); }else{ gint scale_steps; g_object_get(current_plugin_port, "scale-steps", &scale_steps, NULL); if(!ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INTEGER) && !ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_TOGGLED) && scale_steps == -1){ current_port->flags |= AGS_PORT_INFINITE_RANGE; } } g_object_set(current_port, "plugin-port", current_plugin_port, NULL); ags_recall_lv2_load_conversion(recall_lv2, (GObject *) current_port, current_plugin_port); ags_port_safe_write_raw(current_port, default_value); #ifdef AGS_DEBUG g_message("connecting port: %s %d/%d", specifier, i, port_count); #endif port = g_list_prepend(port, current_port); g_value_unset(default_value); g_free(default_value); g_free(plugin_name); g_free(specifier); }else if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_AUDIO)){ guint port_index; g_object_get(current_plugin_port, "port-index", &port_index, NULL); g_rec_mutex_lock(recall_mutex); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INPUT)){ if(recall_lv2->input_port == NULL){ recall_lv2->input_port = (guint *) malloc(sizeof(guint)); recall_lv2->input_port[0] = port_index; }else{ recall_lv2->input_port = (guint *) realloc(recall_lv2->input_port, (recall_lv2->input_lines + 1) * sizeof(guint)); recall_lv2->input_port[recall_lv2->input_lines] = port_index; } recall_lv2->input_lines += 1; }else if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT)){ if(recall_lv2->output_port == NULL){ recall_lv2->output_port = (guint *) malloc(sizeof(guint)); recall_lv2->output_port[0] = port_index; }else{ recall_lv2->output_port = (guint *) realloc(recall_lv2->output_port, (recall_lv2->output_lines + 1) * sizeof(guint)); recall_lv2->output_port[recall_lv2->output_lines] = port_index; } recall_lv2->output_lines += 1; } g_rec_mutex_unlock(recall_mutex); } /* iterate plugin port */ plugin_port = plugin_port->next; } /* reverse port */ g_rec_mutex_lock(recall_mutex); AGS_RECALL(recall_lv2)->port = g_list_reverse(port); retval = g_list_copy(AGS_RECALL(recall_lv2)->port); g_rec_mutex_unlock(recall_mutex); } g_list_free(plugin_port_start); return(retval); } /** * ags_recall_lv2_load_conversion: * @recall_lv2: the #AgsRecallLv2 * @port: the #AgsPort * @plugin_port: the #AgsPluginPort * * Loads conversion object by using @plugin_port and sets in on @port. * * Since: 3.0.0 */ void ags_recall_lv2_load_conversion(AgsRecallLv2 *recall_lv2, GObject *port, gpointer plugin_port) { AgsLv2Conversion *lv2_conversion; if(!AGS_IS_RECALL_LV2(recall_lv2) || !AGS_IS_PORT(port) || !AGS_IS_PLUGIN_PORT(plugin_port)){ return; } lv2_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(!AGS_IS_LV2_CONVERSION(lv2_conversion)){ lv2_conversion = ags_lv2_conversion_new(); } lv2_conversion->flags |= AGS_LV2_CONVERSION_LOGARITHMIC; } if(lv2_conversion != NULL){ g_object_set(port, "conversion", lv2_conversion, NULL); } } /** * ags_recall_lv2_find: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @filename: plugin filename * @effect: effect's name * * Retrieve LV2 recall. * * Returns: (element-type AgsAudio.Recall) (transfer none): Next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_recall_lv2_find(GList *recall, gchar *filename, gchar *effect) { gboolean success; GRecMutex *recall_mutex; while(recall != NULL){ if(AGS_IS_RECALL_LV2(recall->data)){ /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall->data); /* check filename and effect */ g_rec_mutex_lock(recall_mutex); success = (!g_strcmp0(AGS_RECALL(recall->data)->filename, filename) && !g_strcmp0(AGS_RECALL(recall->data)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); if(success){ return(recall); } } recall = recall->next; } return(NULL); } /** * ags_recall_lv2_new: * @source: the #AgsChannel as source * @turtle: the RDF turtle file * @filename: the LV2 plugin filename * @effect: the LV2 plugin effect * @uri: uri's name * @effect_index: effect's index * * Creates a new instance of #AgsRecallLv2 * * Returns: the new #AgsRecallLv2 * * Since: 3.0.0 */ AgsRecallLv2* ags_recall_lv2_new(AgsChannel *source, AgsTurtle *turtle, gchar *filename, gchar *effect, gchar *uri, uint32_t index) { AgsRecallLv2 *recall_lv2; GObject *output_soundcard; output_soundcard = NULL; if(source != NULL){ g_object_get(source, "output-soundcard", &output_soundcard, NULL); } recall_lv2 = (AgsRecallLv2 *) g_object_new(AGS_TYPE_RECALL_LV2, "output-soundcard", output_soundcard, "turtle", turtle, "source", source, "filename", filename, "effect", effect, "uri", uri, "effect-index", index, NULL); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } return(recall_lv2); } gsequencer-3.1.3/ags/audio/ags_frequency_map.c0000644000175000017500000005324413607210263016317 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_frequency_map_class_init(AgsFrequencyMapClass *frequency_map_class); void ags_frequency_map_connectable_interface_init(AgsConnectableInterface *connectable); void ags_frequency_map_init(AgsFrequencyMap *frequency_map); void ags_frequency_map_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_frequency_map_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_frequency_map_dispose(GObject *gobject); void ags_frequency_map_finalize(GObject *gobject); void ags_frequency_map_real_process(AgsFrequencyMap *frequency_map); void ags_frequency_map_real_factorize(AgsFrequencyMap *frequency_map, AgsFrequencyMap *factorized_frequency_map); void ags_frequency_map_real_compute_max_likelihood(AgsFrequencyMap *frequency_map, AgsComplex *source, AgsComplex **retval); /** * SECTION:ags_frequency_map * @short_description: Contains the audio data for a given frequency * @title: AgsFrequencyMap * @section_id: * @include: ags/audio/ags_frequency_map.h * * #AgsFrequencyMap stores a buffer of complex numbers. Representing an discrete sampled * oscillator wave at a giving frequency. */ enum{ PROP_0, PROP_Z_INDEX, PROP_WINDOW_COUNT, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FRAME_COUNT, PROP_ATTACK, PROP_OSCILLATOR_MODE, PROP_FREQ, }; enum{ PROCESS, FACTORIZE, COMPUTE_MAX_LIKELIHOOD, LAST_SIGNAL, }; static gpointer ags_frequency_map_parent_class = NULL; static guint frequency_map_signals[LAST_SIGNAL]; GType ags_frequency_map_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_frequency_map = 0; static const GTypeInfo ags_frequency_map_info = { sizeof (AgsFrequencyMapClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_frequency_map_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFrequencyMap), 0, /* n_preallocs */ (GInstanceInitFunc) ags_frequency_map_init, }; ags_type_frequency_map = g_type_register_static(G_TYPE_OBJECT, "AgsFrequencyMap", &ags_frequency_map_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_frequency_map); } return g_define_type_id__volatile; } void ags_frequency_map_class_init(AgsFrequencyMapClass *frequency_map) { GObjectClass *gobject; GParamSpec *param_spec; ags_frequency_map_parent_class = g_type_class_peek_parent(frequency_map); /* GObjectClass */ gobject = (GObjectClass *) frequency_map; gobject->set_property = ags_frequency_map_set_property; gobject->get_property = ags_frequency_map_get_property; gobject->dispose = ags_frequency_map_dispose; gobject->finalize = ags_frequency_map_finalize; /* properties */ /** * AgsFrequencyMap:z-index: * * The z-index as position of this frequency map. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("z-index", i18n_pspec("z-index as position"), i18n_pspec("The z-index of this frequency map"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Z_INDEX, param_spec); /** * AgsFrequencyMap:window-count: * * The the window count of total z-indexes. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("window-count", i18n_pspec("window count"), i18n_pspec("The window count of indexes"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WINDOW_COUNT, param_spec); /** * AgsFrequencyMap:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsFrequencyMap:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsFrequencyMap:frame-count: * * The initial size of audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("frame-count", i18n_pspec("frame count of audio data"), i18n_pspec("The initial frame count of audio data"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FRAME_COUNT, param_spec); /** * AgsFrequencyMap:attack: * * The attack to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("attack", i18n_pspec("using attack"), i18n_pspec("The attack to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsFrequencyMap:oscillator-mode: * * The oscillator mode to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("oscillator-mode", i18n_pspec("using oscillator mode"), i18n_pspec("The oscillator mode to be used"), 0, G_MAXUINT32, AGS_SYNTH_OSCILLATOR_SIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSCILLATOR_MODE, param_spec); /** * AgsFrequencyMap:freq: * * The freq to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("freq", i18n_pspec("using frequency"), i18n_pspec("The frequency to be used"), -1.0, G_MAXDOUBLE, AGS_FREQUENCY_MAP_DEFAULT_FREQ, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FREQ, param_spec); /* AgsFrequencyMapClass */ frequency_map->process = ags_frequency_map_real_process; frequency_map->factorize = ags_frequency_map_real_factorize; frequency_map->compute_max_likelihood = ags_frequency_map_real_compute_max_likelihood; /* signals */ /** * AgsFrequencyMap::process: * @frequency_map: the #AgsFrequencyMap * * The ::process signal notifies about processed buffer. * * Since: 3.0.0 */ frequency_map_signals[PROCESS] = g_signal_new("process", G_TYPE_FROM_CLASS(frequency_map), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFrequencyMapClass, process), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsFrequencyMap::factorize: * @frequency_map: the #AgsFrequencyMap * @factorized_frequency_map: the factorized #AgsFrequencyMap * * The ::factorize signal notifies about factorizing map. * * Since: 3.0.0 */ frequency_map_signals[FACTORIZE] = g_signal_new("factorize", G_TYPE_FROM_CLASS(frequency_map), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFrequencyMapClass, factorize), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsFrequencyMap::compute-max-likelihood: * @frequency_map: the #AgsFrequencyMap * @source: the source buffer * @retval: return location pointer to buffer * * The ::compute-max-likelihood signal notifies about max likelihooded commputed. * * Since: 3.0.0 */ frequency_map_signals[COMPUTE_MAX_LIKELIHOOD] = g_signal_new("compute-max-likelihood", G_TYPE_FROM_CLASS(frequency_map), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFrequencyMapClass, compute_max_likelihood), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); } void ags_frequency_map_init(AgsFrequencyMap *frequency_map) { frequency_map->flags = 0; /* add audio signal mutex */ g_rec_mutex_init(&(frequency_map->obj_mutex)); /* uuid */ #if 0 frequency_map->uuid = ags_uuid_alloc(); ags_uuid_generate(frequency_map->uuid); #else frequency_map->uuid = NULL; #endif frequency_map->z_index = 0; frequency_map->window_count = 0; /* presets */ frequency_map->samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; frequency_map->buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; frequency_map->frame_count = 0; frequency_map->attack = 0; frequency_map->oscillator_mode = AGS_SYNTH_OSCILLATOR_SIN; frequency_map->freq = AGS_FREQUENCY_MAP_DEFAULT_FREQ; frequency_map->buffer = ags_stream_alloc(AGS_SOUNDCARD_COMPLEX, frequency_map->buffer_size); } void ags_frequency_map_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFrequencyMap *frequency_map; GRecMutex *frequency_map_mutex; frequency_map = AGS_FREQUENCY_MAP(gobject); /* get audio signal mutex */ frequency_map_mutex = AGS_FREQUENCY_MAP_GET_OBJ_MUTEX(frequency_map); switch(prop_id){ case PROP_Z_INDEX: { guint z_index; z_index = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->z_index = z_index; g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_WINDOW_COUNT: { guint window_count; window_count = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->window_count = window_count; g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->samplerate = samplerate; g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); if(frequency_map->buffer_size != buffer_size){ frequency_map->buffer_size = buffer_size; ags_stream_free(frequency_map->buffer); frequency_map->buffer = ags_stream_alloc(AGS_SOUNDCARD_COMPLEX, frequency_map->buffer_size); } g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_FRAME_COUNT: { guint frame_count; frame_count = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->frame_count = frame_count; g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_ATTACK: { guint attack; attack = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->attack = attack; g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_OSCILLATOR_MODE: { guint oscillator_mode; oscillator_mode = g_value_get_uint(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->oscillator_mode = oscillator_mode; g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_FREQ: { gdouble freq; freq = g_value_get_double(value); g_rec_mutex_lock(frequency_map_mutex); frequency_map->freq = freq; g_rec_mutex_unlock(frequency_map_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_frequency_map_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFrequencyMap *frequency_map; GRecMutex *frequency_map_mutex; frequency_map = AGS_FREQUENCY_MAP(gobject); /* get audio signal mutex */ frequency_map_mutex = AGS_FREQUENCY_MAP_GET_OBJ_MUTEX(frequency_map); switch(prop_id){ case PROP_Z_INDEX: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->z_index); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_WINDOW_COUNT: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->window_count); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->samplerate); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->buffer_size); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_FRAME_COUNT: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->frame_count); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->attack); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_OSCILLATOR_MODE: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_uint(value, frequency_map->oscillator_mode); g_rec_mutex_unlock(frequency_map_mutex); } break; case PROP_FREQ: { g_rec_mutex_lock(frequency_map_mutex); g_value_set_double(value, frequency_map->freq); g_rec_mutex_unlock(frequency_map_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_frequency_map_dispose(GObject *gobject) { AgsFrequencyMap *frequency_map; frequency_map = AGS_FREQUENCY_MAP(gobject); /* call parent */ G_OBJECT_CLASS(ags_frequency_map_parent_class)->dispose(gobject); } void ags_frequency_map_finalize(GObject *gobject) { AgsFrequencyMap *frequency_map; frequency_map = AGS_FREQUENCY_MAP(gobject); ags_uuid_free(frequency_map->uuid); /* call parent */ G_OBJECT_CLASS(ags_frequency_map_parent_class)->finalize(gobject); } /** * ags_frequency_map_sort_func: * @a: an #AgsFrequencyMap * @b: an #AgsFrequencyMap * * Sort frequency maps. * * Returns: 0 if equal, -1 if smaller and 1 if bigger offset * * Since: 3.0.0 */ gint ags_frequency_map_sort_func(gconstpointer a, gconstpointer b) { guint a_samplerate, b_samplerate; guint a_buffer_size, b_buffer_size; gdouble a_freq, b_freq; if(a == NULL || b == NULL){ return(0); } g_object_get(a, "samplerate", &a_samplerate, "buffer-size", &a_buffer_size, "freq", &a_freq, NULL); g_object_get(b, "samplerate", &b_samplerate, "buffer-size", &b_buffer_size, "freq", &b_freq, NULL); if(a_samplerate == b_samplerate){ if(a_buffer_size == b_buffer_size){ if(a_freq == b_freq){ return(0); } if(a_freq < b_freq){ return(-1); }else{ return(1); } } if(a_buffer_size < b_buffer_size){ return(-1); }else{ return(1); } } if(a_samplerate < b_samplerate){ return(-1); }else{ return(1); } } /** * ags_frequency_map_test_flags: * @frequency_map: the #AgsFrequencyMap * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_frequency_map_test_flags(AgsFrequencyMap *frequency_map, guint flags) { gboolean retval; GRecMutex *frequency_map_mutex; if(!AGS_IS_FREQUENCY_MAP(frequency_map)){ return(FALSE); } /* get base plugin mutex */ frequency_map_mutex = AGS_FREQUENCY_MAP_GET_OBJ_MUTEX(frequency_map); /* test flags */ g_rec_mutex_lock(frequency_map_mutex); retval = ((flags & (frequency_map->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(frequency_map_mutex); return(retval); } /** * ags_frequency_map_set_flags: * @frequency_map: the #AgsFrequencyMap * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_frequency_map_set_flags(AgsFrequencyMap *frequency_map, guint flags) { GRecMutex *frequency_map_mutex; if(!AGS_IS_FREQUENCY_MAP(frequency_map)){ return; } /* get base plugin mutex */ frequency_map_mutex = AGS_FREQUENCY_MAP_GET_OBJ_MUTEX(frequency_map); /* set flags */ g_rec_mutex_lock(frequency_map_mutex); frequency_map->flags |= flags; g_rec_mutex_unlock(frequency_map_mutex); } /** * ags_frequency_map_unset_flags: * @frequency_map: the #AgsFrequencyMap * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_frequency_map_unset_flags(AgsFrequencyMap *frequency_map, guint flags) { GRecMutex *frequency_map_mutex; if(!AGS_IS_FREQUENCY_MAP(frequency_map)){ return; } /* get base plugin mutex */ frequency_map_mutex = AGS_FREQUENCY_MAP_GET_OBJ_MUTEX(frequency_map); /* unset flags */ g_rec_mutex_lock(frequency_map_mutex); frequency_map->flags &= (~flags); g_rec_mutex_unlock(frequency_map_mutex); } void ags_frequency_map_real_process(AgsFrequencyMap *frequency_map) { switch(frequency_map->oscillator_mode){ case AGS_SYNTH_OSCILLATOR_SIN: { ags_synth_util_sin_complex(frequency_map->buffer + frequency_map->attack, frequency_map->freq, 0.0, 1.0, frequency_map->samplerate, 0, frequency_map->frame_count); } break; case AGS_SYNTH_OSCILLATOR_SAWTOOTH: { ags_synth_util_sawtooth_complex(frequency_map->buffer + frequency_map->attack, frequency_map->freq, 0.0, 1.0, frequency_map->samplerate, 0, frequency_map->frame_count); } break; case AGS_SYNTH_OSCILLATOR_TRIANGLE: { ags_synth_util_triangle_complex(frequency_map->buffer + frequency_map->attack, frequency_map->freq, 0.0, 1.0, frequency_map->samplerate, 0, frequency_map->frame_count); } break; case AGS_SYNTH_OSCILLATOR_SQUARE: { ags_synth_util_square_complex(frequency_map->buffer + frequency_map->attack, frequency_map->freq, 0.0, 1.0, frequency_map->samplerate, 0, frequency_map->frame_count); } break; case AGS_SYNTH_OSCILLATOR_IMPULSE: { ags_synth_util_impulse_complex(frequency_map->buffer + frequency_map->attack, frequency_map->freq, 0.0, 1.0, frequency_map->samplerate, 0, frequency_map->frame_count); } break; } } /** * ags_frequency_map_process: * @frequency_map: the #AgsFrequencyMap * * Process @frequency_map. * * Since: 3.0.0 */ void ags_frequency_map_process(AgsFrequencyMap *frequency_map) { g_return_if_fail(AGS_IS_FREQUENCY_MAP(frequency_map)); g_object_ref(G_OBJECT(frequency_map)); g_signal_emit(G_OBJECT(frequency_map), frequency_map_signals[PROCESS], 0); g_object_unref(G_OBJECT(frequency_map)); } void ags_frequency_map_real_factorize(AgsFrequencyMap *frequency_map, AgsFrequencyMap *factorized_frequency_map) { complex z; guint i; for(i = frequency_map->attack; i < frequency_map->frame_count; i++){ z = ags_complex_get(&(factorized_frequency_map->buffer[i])) * ags_complex_get(&(frequency_map->buffer[i])); ags_complex_set(&(factorized_frequency_map->buffer[i]), z); } } /** * ags_frequency_map_factorize: * @frequency_map: the #AgsFrequencyMap * @factorized_frequency_map: the factorized #AgsFrequencyMap * * Factorize @frequency_map. * * Since: 3.0.0 */ void ags_frequency_map_factorize(AgsFrequencyMap *frequency_map, AgsFrequencyMap *factorized_frequency_map) { g_return_if_fail(AGS_IS_FREQUENCY_MAP(frequency_map) && AGS_IS_FREQUENCY_MAP(factorized_frequency_map)); g_object_ref(G_OBJECT(frequency_map)); g_signal_emit(G_OBJECT(frequency_map), frequency_map_signals[FACTORIZE], 0, factorized_frequency_map); g_object_unref(G_OBJECT(frequency_map)); } void ags_frequency_map_real_compute_max_likelihood(AgsFrequencyMap *frequency_map, AgsComplex *source, AgsComplex **retval) { complex z; guint i; for(i = 0; i < frequency_map->buffer_size; i++){ z = ags_complex_get(&(frequency_map->buffer[i])) * ags_complex_get(&(source[i])); ags_complex_set(&(retval[0][i]), z); } } /** * ags_frequency_map_compute_max_likelihood: * @frequency_map: the #AgsFrequencyMap * @source: the source as #AgsComplex buffer * @retval: the return location of result as #AgsComplex buffer * * Compute maximum likelihood @source and store in @retval. * * Since: 3.0.0 */ void ags_frequency_map_compute_max_likelihood(AgsFrequencyMap *frequency_map, AgsComplex *source, AgsComplex **retval) { g_return_if_fail(AGS_IS_FREQUENCY_MAP(frequency_map) && source != NULL && retval != NULL && retval[0] != NULL); g_object_ref(G_OBJECT(frequency_map)); g_signal_emit(G_OBJECT(frequency_map), frequency_map_signals[COMPUTE_MAX_LIKELIHOOD], 0, source, retval); g_object_unref(G_OBJECT(frequency_map)); } /** * ags_frequency_map_new: * * * Returns: a new #AgsFrequencyMap * * Since: 3.0.0 */ AgsFrequencyMap* ags_frequency_map_new() { AgsFrequencyMap *frequency_map; frequency_map = (AgsFrequencyMap *) g_object_new(AGS_TYPE_FREQUENCY_MAP, NULL); return(frequency_map); } gsequencer-3.1.3/ags/audio/audio-unit/0000755000175000017500000000000013622252254014614 500000000000000gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_client.h0000644000175000017500000001054613607210263021240 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_UNIT_CLIENT_H__ #define __AGS_AUDIO_UNIT_CLIENT_H__ #include #include #include #ifdef AGS_WITH_AUDIO_UNIT #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_UNIT_CLIENT (ags_audio_unit_client_get_type()) #define AGS_AUDIO_UNIT_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_UNIT_CLIENT, AgsAudioUnitClient)) #define AGS_AUDIO_UNIT_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_UNIT_CLIENT, AgsAudioUnitClient)) #define AGS_IS_AUDIO_UNIT_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_UNIT_CLIENT)) #define AGS_IS_AUDIO_UNIT_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_UNIT_CLIENT)) #define AGS_AUDIO_UNIT_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_UNIT_CLIENT, AgsAudioUnitClientClass)) #define AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(obj) (&(((AgsAudioUnitClient *) obj)->obj_mutex)) typedef struct _AgsAudioUnitClient AgsAudioUnitClient; typedef struct _AgsAudioUnitClientClass AgsAudioUnitClientClass; /** * AgsAudioUnitClientFlags: * @AGS_AUDIO_UNIT_CLIENT_ADDED_TO_REGISTRY: the AudioUnit client was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_UNIT_CLIENT_CONNECTED: indicates the client was connected by calling #AgsConnectable::connect() * @AGS_AUDIO_UNIT_CLIENT_ACTIVATED: the client was activated * @AGS_AUDIO_UNIT_CLIENT_READY: the client is ready * * Enum values to control the behavior or indicate internal state of #AgsAudioUnitClient by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_UNIT_CLIENT_ADDED_TO_REGISTRY = 1, AGS_AUDIO_UNIT_CLIENT_CONNECTED = 1 << 1, AGS_AUDIO_UNIT_CLIENT_ACTIVATED = 1 << 2, AGS_AUDIO_UNIT_CLIENT_READY = 1 << 3, }AgsAudioUnitClientFlags; struct _AgsAudioUnitClient { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio_unit_server; AgsUUID *uuid; gchar *client_uuid; gchar *client_name; GList *device; GList *port; }; struct _AgsAudioUnitClientClass { GObjectClass gobject; }; GType ags_audio_unit_client_get_type(); gboolean ags_audio_unit_client_test_flags(AgsAudioUnitClient *audio_unit_client, guint flags); void ags_audio_unit_client_set_flags(AgsAudioUnitClient *audio_unit_client, guint flags); void ags_audio_unit_client_unset_flags(AgsAudioUnitClient *audio_unit_client, guint flags); GList* ags_audio_unit_client_find_uuid(GList *audio_unit_client, gchar *client_uuid); GList* ags_audio_unit_client_find(GList *audio_unit_client, gchar *client_name); void ags_audio_unit_client_open(AgsAudioUnitClient *audio_unit_client, gchar *client_name); void ags_audio_unit_client_add_device(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_device); void ags_audio_unit_client_remove_device(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_device); void ags_audio_unit_client_add_port(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_port); void ags_audio_unit_client_remove_port(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_port); void ags_audio_unit_client_activate(AgsAudioUnitClient *audio_unit_client); void ags_audio_unit_client_deactivate(AgsAudioUnitClient *audio_unit_client); AgsAudioUnitClient* ags_audio_unit_client_new(GObject *audio_unit_server); G_END_DECLS #endif /*__AGS_AUDIO_UNIT_CLIENT_H__*/ gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_devout.c0000644000175000017500000026512613607210263021271 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_audio_unit_devout_class_init(AgsAudioUnitDevoutClass *audio_unit_devout); void ags_audio_unit_devout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_unit_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_audio_unit_devout_init(AgsAudioUnitDevout *audio_unit_devout); void ags_audio_unit_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_unit_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_unit_devout_dispose(GObject *gobject); void ags_audio_unit_devout_finalize(GObject *gobject); AgsUUID* ags_audio_unit_devout_get_uuid(AgsConnectable *connectable); gboolean ags_audio_unit_devout_has_resource(AgsConnectable *connectable); gboolean ags_audio_unit_devout_is_ready(AgsConnectable *connectable); void ags_audio_unit_devout_add_to_registry(AgsConnectable *connectable); void ags_audio_unit_devout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_unit_devout_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_unit_devout_xml_compose(AgsConnectable *connectable); void ags_audio_unit_devout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_unit_devout_is_connected(AgsConnectable *connectable); void ags_audio_unit_devout_connect(AgsConnectable *connectable); void ags_audio_unit_devout_disconnect(AgsConnectable *connectable); void ags_audio_unit_devout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_audio_unit_devout_get_device(AgsSoundcard *soundcard); void ags_audio_unit_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_audio_unit_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_audio_unit_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_audio_unit_devout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_audio_unit_devout_get_capability(AgsSoundcard *soundcard); gboolean ags_audio_unit_devout_is_starting(AgsSoundcard *soundcard); gboolean ags_audio_unit_devout_is_playing(AgsSoundcard *soundcard); gchar* ags_audio_unit_devout_get_uptime(AgsSoundcard *soundcard); void ags_audio_unit_devout_port_init(AgsSoundcard *soundcard, GError **error); void ags_audio_unit_devout_port_play(AgsSoundcard *soundcard, GError **error); void ags_audio_unit_devout_port_free(AgsSoundcard *soundcard); void ags_audio_unit_devout_tic(AgsSoundcard *soundcard); void ags_audio_unit_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_audio_unit_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_audio_unit_devout_get_bpm(AgsSoundcard *soundcard); void ags_audio_unit_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_audio_unit_devout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_audio_unit_devout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_audio_unit_devout_get_delay(AgsSoundcard *soundcard); guint ags_audio_unit_devout_get_attack(AgsSoundcard *soundcard); void* ags_audio_unit_devout_get_buffer(AgsSoundcard *soundcard); void* ags_audio_unit_devout_get_next_buffer(AgsSoundcard *soundcard); void* ags_audio_unit_devout_get_prev_buffer(AgsSoundcard *soundcard); void ags_audio_unit_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_audio_unit_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_audio_unit_devout_get_delay_counter(AgsSoundcard *soundcard); void ags_audio_unit_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_audio_unit_devout_get_start_note_offset(AgsSoundcard *soundcard); void ags_audio_unit_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_audio_unit_devout_get_note_offset(AgsSoundcard *soundcard); void ags_audio_unit_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_audio_unit_devout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_audio_unit_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_audio_unit_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_audio_unit_devout_get_loop_offset(AgsSoundcard *soundcard); guint ags_audio_unit_devout_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_audio_unit_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_audio_unit_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); /** * SECTION:ags_audio_unit_devout * @short_description: Output to soundcard * @title: AgsAudioUnitDevout * @section_id: * @include: ags/audio/audio-unit/ags_audio_unit_devout.h * * #AgsAudioUnitDevout represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_AUDIO_UNIT_CLIENT, PROP_AUDIO_UNIT_PORT, PROP_CHANNEL, }; static gpointer ags_audio_unit_devout_parent_class = NULL; GType ags_audio_unit_devout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_unit_devout = 0; static const GTypeInfo ags_audio_unit_devout_info = { sizeof(AgsAudioUnitDevoutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_unit_devout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudioUnitDevout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_unit_devout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_unit_devout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_audio_unit_devout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_unit_devout = g_type_register_static(G_TYPE_OBJECT, "AgsAudioUnitDevout", &ags_audio_unit_devout_info, 0); g_type_add_interface_static(ags_type_audio_unit_devout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_audio_unit_devout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_unit_devout); } return g_define_type_id__volatile; } void ags_audio_unit_devout_class_init(AgsAudioUnitDevoutClass *audio_unit_devout) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_unit_devout_parent_class = g_type_class_peek_parent(audio_unit_devout); /* GObjectClass */ gobject = (GObjectClass *) audio_unit_devout; gobject->set_property = ags_audio_unit_devout_set_property; gobject->get_property = ags_audio_unit_devout_get_property; gobject->dispose = ags_audio_unit_devout_dispose; gobject->finalize = ags_audio_unit_devout_finalize; /* properties */ /** * AgsAudioUnitDevout:device: * * The audio unit soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-audio-unit-devout-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsAudioUnitDevout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsAudioUnitDevout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsAudioUnitDevout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsAudioUnitDevout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsAudioUnitDevout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsAudioUnitDevout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsAudioUnitDevout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsAudioUnitDevout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsAudioUnitDevout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsAudioUnitDevout:audio-unit-client: * * The assigned #AgsAudioUnitClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-unit-client", i18n_pspec("audio unit client object"), i18n_pspec("The audio unit client object"), AGS_TYPE_AUDIO_UNIT_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_CLIENT, param_spec); /** * AgsAudioUnitDevout:audio-unit-port: * * The assigned #AgsAudioUnitPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("audio-unit-port", i18n_pspec("audio unit port object"), i18n_pspec("The audio unit port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_PORT, param_spec); } GQuark ags_audio_unit_devout_error_quark() { return(g_quark_from_static_string("ags-audio_unit_devout-error-quark")); } void ags_audio_unit_devout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_unit_devout_get_uuid; connectable->has_resource = ags_audio_unit_devout_has_resource; connectable->is_ready = ags_audio_unit_devout_is_ready; connectable->add_to_registry = ags_audio_unit_devout_add_to_registry; connectable->remove_from_registry = ags_audio_unit_devout_remove_from_registry; connectable->list_resource = ags_audio_unit_devout_list_resource; connectable->xml_compose = ags_audio_unit_devout_xml_compose; connectable->xml_parse = ags_audio_unit_devout_xml_parse; connectable->is_connected = ags_audio_unit_devout_is_connected; connectable->connect = ags_audio_unit_devout_connect; connectable->disconnect = ags_audio_unit_devout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_unit_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_audio_unit_devout_set_device; soundcard->get_device = ags_audio_unit_devout_get_device; soundcard->set_presets = ags_audio_unit_devout_set_presets; soundcard->get_presets = ags_audio_unit_devout_get_presets; soundcard->list_cards = ags_audio_unit_devout_list_cards; soundcard->pcm_info = ags_audio_unit_devout_pcm_info; soundcard->get_capability = ags_audio_unit_devout_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_audio_unit_devout_is_starting; soundcard->is_playing = ags_audio_unit_devout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_audio_unit_devout_get_uptime; soundcard->play_init = ags_audio_unit_devout_port_init; soundcard->play = ags_audio_unit_devout_port_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_audio_unit_devout_port_free; soundcard->tic = ags_audio_unit_devout_tic; soundcard->offset_changed = ags_audio_unit_devout_offset_changed; soundcard->set_bpm = ags_audio_unit_devout_set_bpm; soundcard->get_bpm = ags_audio_unit_devout_get_bpm; soundcard->set_delay_factor = ags_audio_unit_devout_set_delay_factor; soundcard->get_delay_factor = ags_audio_unit_devout_get_delay_factor; soundcard->get_absolute_delay = ags_audio_unit_devout_get_absolute_delay; soundcard->get_delay = ags_audio_unit_devout_get_delay; soundcard->get_attack = ags_audio_unit_devout_get_attack; soundcard->get_buffer = ags_audio_unit_devout_get_buffer; soundcard->get_next_buffer = ags_audio_unit_devout_get_next_buffer; soundcard->get_prev_buffer = ags_audio_unit_devout_get_prev_buffer; soundcard->lock_buffer = ags_audio_unit_devout_lock_buffer; soundcard->unlock_buffer = ags_audio_unit_devout_unlock_buffer; soundcard->get_delay_counter = ags_audio_unit_devout_get_delay_counter; soundcard->set_start_note_offset = ags_audio_unit_devout_set_start_note_offset; soundcard->get_start_note_offset = ags_audio_unit_devout_get_start_note_offset; soundcard->set_note_offset = ags_audio_unit_devout_set_note_offset; soundcard->get_note_offset = ags_audio_unit_devout_get_note_offset; soundcard->set_note_offset_absolute = ags_audio_unit_devout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_audio_unit_devout_get_note_offset_absolute; soundcard->set_loop = ags_audio_unit_devout_set_loop; soundcard->get_loop = ags_audio_unit_devout_get_loop; soundcard->get_loop_offset = ags_audio_unit_devout_get_loop_offset; soundcard->get_sub_block_count = ags_audio_unit_devout_get_sub_block_count; soundcard->trylock_sub_block = ags_audio_unit_devout_trylock_sub_block; soundcard->unlock_sub_block = ags_audio_unit_devout_unlock_sub_block; } void ags_audio_unit_devout_init(AgsAudioUnitDevout *audio_unit_devout) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ audio_unit_devout->flags = 0; g_atomic_int_set(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_PASS_THROUGH); /* devout mutex */ g_rec_mutex_init(&(audio_unit_devout->obj_mutex)); /* uuid */ audio_unit_devout->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_unit_devout->uuid); /* presets */ config = ags_config_get_instance(); audio_unit_devout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); audio_unit_devout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); audio_unit_devout->samplerate = ags_soundcard_helper_config_get_samplerate(config); audio_unit_devout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); audio_unit_devout->format = ags_soundcard_helper_config_get_format(config); /* */ audio_unit_devout->card_uri = NULL; audio_unit_devout->audio_unit_client = NULL; audio_unit_devout->port_name = NULL; audio_unit_devout->audio_unit_port = NULL; /* buffer */ audio_unit_devout->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ audio_unit_devout->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(audio_unit_devout->buffer_mutex[i]); } audio_unit_devout->sub_block_count = AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT; audio_unit_devout->sub_block_mutex = (GRecMutex **) malloc(8 * audio_unit_devout->sub_block_count * audio_unit_devout->pcm_channels * sizeof(GRecMutex *)); for(i = 0; i < 8 * audio_unit_devout->sub_block_count * audio_unit_devout->pcm_channels; i++){ audio_unit_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(audio_unit_devout->sub_block_mutex[i]); } audio_unit_devout->buffer = (void **) malloc(8 * sizeof(void*)); audio_unit_devout->buffer[0] = NULL; audio_unit_devout->buffer[1] = NULL; audio_unit_devout->buffer[2] = NULL; audio_unit_devout->buffer[3] = NULL; audio_unit_devout->buffer[4] = NULL; audio_unit_devout->buffer[5] = NULL; audio_unit_devout->buffer[6] = NULL; audio_unit_devout->buffer[7] = NULL; ags_audio_unit_devout_realloc_buffer(audio_unit_devout); /* bpm */ audio_unit_devout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ audio_unit_devout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); audio_unit_devout->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ audio_unit_devout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); audio_unit_devout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); /* counters */ audio_unit_devout->tact_counter = 0.0; audio_unit_devout->delay_counter = 0.0; audio_unit_devout->tic_counter = 0; audio_unit_devout->start_note_offset = 0; audio_unit_devout->note_offset = 0; audio_unit_devout->note_offset_absolute = 0; audio_unit_devout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; audio_unit_devout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; audio_unit_devout->do_loop = FALSE; audio_unit_devout->loop_offset = 0; /* callback mutex */ g_mutex_init(&(audio_unit_devout->callback_mutex)); g_cond_init(&(audio_unit_devout->callback_cond)); /* callback finish mutex */ g_mutex_init(&(audio_unit_devout->callback_finish_mutex)); g_cond_init(&(audio_unit_devout->callback_finish_cond)); } void ags_audio_unit_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(gobject); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->card_uri = g_strdup(device); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(dsp_channels == audio_unit_devout->dsp_channels){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } audio_unit_devout->dsp_channels = dsp_channels; g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels, old_pcm_channels; guint i; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(pcm_channels == audio_unit_devout->pcm_channels){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } old_pcm_channels = audio_unit_devout->pcm_channels; /* destroy if less pcm-channels */ for(i = 8 * audio_unit_devout->sub_block_count * pcm_channels; i < 8 * audio_unit_devout->sub_block_count * old_pcm_channels; i++){ g_rec_mutex_clear(audio_unit_devout->sub_block_mutex[i]); free(audio_unit_devout->sub_block_mutex[i]); } audio_unit_devout->sub_block_mutex = (GRecMutex **) realloc(audio_unit_devout->sub_block_mutex, 8 * audio_unit_devout->sub_block_count * pcm_channels * sizeof(GRecMutex *)); /* create if more pcm-channels */ for(i = 8 * audio_unit_devout->sub_block_count * old_pcm_channels; i < 8 * audio_unit_devout->sub_block_count * pcm_channels; i++){ audio_unit_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(audio_unit_devout->sub_block_mutex[i]); } audio_unit_devout->pcm_channels = pcm_channels; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_realloc_buffer(audio_unit_devout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(format == audio_unit_devout->format){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } audio_unit_devout->format = format; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_realloc_buffer(audio_unit_devout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(buffer_size == audio_unit_devout->buffer_size){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } audio_unit_devout->buffer_size = buffer_size; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_realloc_buffer(audio_unit_devout); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(samplerate == audio_unit_devout->samplerate){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } audio_unit_devout->samplerate = samplerate; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_realloc_buffer(audio_unit_devout); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->bpm = bpm; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->delay_factor = delay_factor; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); } break; case PROP_AUDIO_UNIT_CLIENT: { AgsAudioUnitClient *audio_unit_client; audio_unit_client = (AgsAudioUnitClient *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(audio_unit_devout->audio_unit_client == (GObject *) audio_unit_client){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } if(audio_unit_devout->audio_unit_client != NULL){ g_object_unref(G_OBJECT(audio_unit_devout->audio_unit_client)); } if(audio_unit_client != NULL){ g_object_ref(audio_unit_client); } audio_unit_devout->audio_unit_client = (GObject *) audio_unit_client; g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_AUDIO_UNIT_PORT: { AgsAudioUnitPort *audio_unit_port; audio_unit_port = (AgsAudioUnitPort *) g_value_get_pointer(value); g_rec_mutex_lock(audio_unit_devout_mutex); if(!AGS_IS_AUDIO_UNIT_PORT(audio_unit_port) || g_list_find(audio_unit_devout->audio_unit_port, audio_unit_port) != NULL){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } g_object_ref(audio_unit_port); audio_unit_devout->audio_unit_port = g_list_append(audio_unit_devout->audio_unit_port, audio_unit_port); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(gobject); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_string(value, audio_unit_devout->card_uri); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_uint(value, audio_unit_devout->dsp_channels); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_uint(value, audio_unit_devout->pcm_channels); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_uint(value, audio_unit_devout->format); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_uint(value, audio_unit_devout->buffer_size); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_uint(value, audio_unit_devout->samplerate); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_pointer(value, audio_unit_devout->buffer); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_double(value, audio_unit_devout->bpm); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_double(value, audio_unit_devout->delay_factor); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_pointer(value, audio_unit_devout->attack); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_AUDIO_UNIT_CLIENT: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_object(value, audio_unit_devout->audio_unit_client); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; case PROP_AUDIO_UNIT_PORT: { g_rec_mutex_lock(audio_unit_devout_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_unit_devout->audio_unit_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_unit_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_devout_dispose(GObject *gobject) { AgsAudioUnitDevout *audio_unit_devout; GList *list; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(gobject); /* audio_unit client */ if(audio_unit_devout->audio_unit_client != NULL){ g_object_unref(audio_unit_devout->audio_unit_client); audio_unit_devout->audio_unit_client = NULL; } /* audio_unit port */ g_list_free_full(audio_unit_devout->audio_unit_port, g_object_unref); audio_unit_devout->audio_unit_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_audio_unit_devout_parent_class)->dispose(gobject); } void ags_audio_unit_devout_finalize(GObject *gobject) { AgsAudioUnitDevout *audio_unit_devout; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(gobject); /* free output buffer */ free(audio_unit_devout->buffer[0]); free(audio_unit_devout->buffer[1]); free(audio_unit_devout->buffer[2]); free(audio_unit_devout->buffer[3]); free(audio_unit_devout->buffer[4]); free(audio_unit_devout->buffer[5]); free(audio_unit_devout->buffer[6]); free(audio_unit_devout->buffer[7]); /* free buffer array */ free(audio_unit_devout->buffer); /* free AgsAttack */ free(audio_unit_devout->attack); /* audio_unit client */ if(audio_unit_devout->audio_unit_client != NULL){ g_object_unref(audio_unit_devout->audio_unit_client); } /* audio_unit port */ g_list_free_full(audio_unit_devout->audio_unit_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_audio_unit_devout_parent_class)->finalize(gobject); } AgsUUID* ags_audio_unit_devout_get_uuid(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; AgsUUID *ptr; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); /* get audio_unit devout signal mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get UUID */ g_rec_mutex_lock(audio_unit_devout_mutex); ptr = audio_unit_devout->uuid; g_rec_mutex_unlock(audio_unit_devout_mutex); return(ptr); } gboolean ags_audio_unit_devout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_audio_unit_devout_is_ready(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; gboolean is_ready; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); /* check is added */ is_ready = ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_unit_devout_add_to_registry(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; if(ags_connectable_is_ready(connectable)){ return; } audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); ags_audio_unit_devout_set_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_ADDED_TO_REGISTRY); } void ags_audio_unit_devout_remove_from_registry(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; if(!ags_connectable_is_ready(connectable)){ return; } audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); ags_audio_unit_devout_unset_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_ADDED_TO_REGISTRY); } xmlNode* ags_audio_unit_devout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_unit_devout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_unit_devout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_unit_devout_is_connected(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; gboolean is_connected; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); /* check is connected */ is_connected = ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_CONNECTED); return(is_connected); } void ags_audio_unit_devout_connect(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; if(ags_connectable_is_connected(connectable)){ return; } audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); ags_audio_unit_devout_set_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_CONNECTED); } void ags_audio_unit_devout_disconnect(AgsConnectable *connectable) { AgsAudioUnitDevout *audio_unit_devout; if(!ags_connectable_is_connected(connectable)){ return; } audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(connectable); ags_audio_unit_devout_unset_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_CONNECTED); } /** * ags_audio_unit_devout_test_flags: * @audio_unit_devout: the #AgsAudioUnitDevout * @flags: the flags * * Test @flags to be set on @audio_unit_devout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_unit_devout_test_flags(AgsAudioUnitDevout *audio_unit_devout, guint flags) { gboolean retval; GRecMutex *audio_unit_devout_mutex; if(!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_devout)){ return(FALSE); } /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* test */ g_rec_mutex_lock(audio_unit_devout_mutex); retval = (flags & (audio_unit_devout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_devout_mutex); return(retval); } /** * ags_audio_unit_devout_set_flags: * @audio_unit_devout: the #AgsAudioUnitDevout * @flags: see #AgsAudioUnitDevoutFlags-enum * * Enable a feature of @audio_unit_devout. * * Since: 3.0.0 */ void ags_audio_unit_devout_set_flags(AgsAudioUnitDevout *audio_unit_devout, guint flags) { GRecMutex *audio_unit_devout_mutex; if(!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_devout)){ return; } /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->flags |= flags; g_rec_mutex_unlock(audio_unit_devout_mutex); } /** * ags_audio_unit_devout_unset_flags: * @audio_unit_devout: the #AgsAudioUnitDevout * @flags: see #AgsAudioUnitDevoutFlags-enum * * Disable a feature of @audio_unit_devout. * * Since: 3.0.0 */ void ags_audio_unit_devout_unset_flags(AgsAudioUnitDevout *audio_unit_devout, guint flags) { GRecMutex *audio_unit_devout_mutex; if(!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_devout)){ return; } /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->flags &= (~flags); g_rec_mutex_unlock(audio_unit_devout_mutex); } void ags_audio_unit_devout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsAudioUnitDevout *audio_unit_devout; GList *audio_unit_port, *audio_unit_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* check device */ g_rec_mutex_lock(audio_unit_devout_mutex); if(audio_unit_devout->card_uri == device || !g_ascii_strcasecmp(audio_unit_devout->card_uri, device)){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } if(!g_str_has_prefix(device, "ags-audio_unit-devout-")){ g_rec_mutex_unlock(audio_unit_devout_mutex); g_warning("invalid audio_unitaudio device prefix"); return; } ret = sscanf(device, "ags-audio_unit-devout-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(audio_unit_devout_mutex); g_warning("invalid audio_unitaudio device specifier"); return; } g_free(audio_unit_devout->card_uri); audio_unit_devout->card_uri = g_strdup(device); /* apply name to port */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_port_start = audio_unit_port = g_list_copy(audio_unit_devout->audio_unit_port); g_rec_mutex_unlock(audio_unit_devout_mutex); str = g_strdup_printf("ags-soundcard%d", nth_card); g_object_set(audio_unit_port->data, "port-name", str, NULL); g_free(str); g_list_free(audio_unit_port_start); } gchar* ags_audio_unit_devout_get_device(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gchar *device; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); device = NULL; /* get device */ g_rec_mutex_lock(audio_unit_devout_mutex); device = g_strdup(audio_unit_devout->card_uri); g_rec_mutex_unlock(audio_unit_devout_mutex); return(device); } void ags_audio_unit_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsAudioUnitDevout *audio_unit_devout; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); g_object_set(audio_unit_devout, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_audio_unit_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get presets */ g_rec_mutex_lock(audio_unit_devout_mutex); if(channels != NULL){ *channels = audio_unit_devout->pcm_channels; } if(rate != NULL){ *rate = audio_unit_devout->samplerate; } if(buffer_size != NULL){ *buffer_size = audio_unit_devout->buffer_size; } if(format != NULL){ *format = audio_unit_devout->format; } g_rec_mutex_unlock(audio_unit_devout_mutex); } void ags_audio_unit_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsAudioUnitClient *audio_unit_client; AgsAudioUnitDevout *audio_unit_devout; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_AUDIO_UNIT_DEVOUT(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_AUDIO_UNIT_DEVOUT(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_audio_unit_devout_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "audio_unit-client", &audio_unit_client, NULL); if(audio_unit_client != NULL){ /* get client name */ g_object_get(audio_unit_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(audio_unit_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_audio_unit_devout_list_cards() - audio_unitaudio client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_audio_unit_devout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_audio_unit_devout_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_PLAYBACK); } gboolean ags_audio_unit_devout_is_starting(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gboolean is_starting; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* check is starting */ g_rec_mutex_lock(audio_unit_devout_mutex); is_starting = ((AGS_AUDIO_UNIT_DEVOUT_START_PLAY & (audio_unit_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_devout_mutex); return(is_starting); } gboolean ags_audio_unit_devout_is_playing(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gboolean is_playing; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* check is starting */ g_rec_mutex_lock(audio_unit_devout_mutex); is_playing = ((AGS_AUDIO_UNIT_DEVOUT_PLAY & (audio_unit_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_devout_mutex); return(is_playing); } gchar* ags_audio_unit_devout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_audio_unit_devout_port_init(AgsSoundcard *soundcard, GError **error) { AgsAudioUnitPort *audio_unit_port; AgsAudioUnitDevout *audio_unit_devout; guint format, word_size; GRecMutex *audio_unit_port_mutex; GRecMutex *audio_unit_devout_mutex; if(ags_soundcard_is_playing(soundcard)){ return; } audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio-unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* port */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_port = (AgsAudioUnitPort *) audio_unit_devout->audio_unit_port->data; g_rec_mutex_unlock(audio_unit_devout_mutex); /* get port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* retrieve word size */ g_rec_mutex_lock(audio_unit_devout_mutex); switch(audio_unit_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(audio_unit_devout_mutex); g_warning("ags_audio_unit_devout_port_init(): unsupported word size"); return; } /* prepare for playback */ audio_unit_devout->flags |= (AGS_AUDIO_UNIT_DEVOUT_BUFFER7 | AGS_AUDIO_UNIT_DEVOUT_START_PLAY | AGS_AUDIO_UNIT_DEVOUT_PLAY | AGS_AUDIO_UNIT_DEVOUT_NONBLOCKING); memset(audio_unit_devout->buffer[0], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[1], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[2], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[3], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[4], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[5], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[6], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[7], 0, audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); /* */ audio_unit_devout->tact_counter = 0.0; audio_unit_devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(audio_unit_devout))); audio_unit_devout->tic_counter = 0; audio_unit_devout->flags |= (AGS_AUDIO_UNIT_DEVOUT_INITIALIZED | AGS_AUDIO_UNIT_DEVOUT_START_PLAY | AGS_AUDIO_UNIT_DEVOUT_PLAY); g_atomic_int_or(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_INITIAL_CALLBACK); g_rec_mutex_unlock(audio_unit_devout_mutex); } void ags_audio_unit_devout_port_play(AgsSoundcard *soundcard, GError **error) { AgsAudioUnitClient *audio_unit_client; AgsAudioUnitDevout *audio_unit_devout; AgsAudioUnitPort *audio_unit_port; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean audio_unit_client_activated; GRecMutex *audio_unit_devout_mutex; GRecMutex *audio_unit_client_mutex; GRecMutex *audio_unit_port_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get audio-unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* client */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_client = (AgsAudioUnitClient *) audio_unit_devout->audio_unit_client; audio_unit_port = (AgsAudioUnitPort *) audio_unit_devout->audio_unit_port->data; callback_mutex = &(audio_unit_devout->callback_mutex); callback_finish_mutex = &(audio_unit_devout->callback_finish_mutex); /* do playback */ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_START_PLAY); if((AGS_AUDIO_UNIT_DEVOUT_INITIALIZED & (audio_unit_devout->flags)) == 0){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } switch(audio_unit_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(audio_unit_devout_mutex); g_warning("ags_audio_unit_devout_port_play(): unsupported word size"); return; } g_rec_mutex_unlock(audio_unit_devout_mutex); /* get client and port mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* get activated */ g_rec_mutex_lock(audio_unit_client_mutex); audio_unit_client_activated = ((AGS_AUDIO_UNIT_CLIENT_ACTIVATED & (audio_unit_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_client_mutex); if(audio_unit_client_activated){ while((AGS_AUDIO_UNIT_DEVOUT_PASS_THROUGH & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) != 0){ usleep(4); } /* signal */ if((AGS_AUDIO_UNIT_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_CALLBACK_DONE); if((AGS_AUDIO_UNIT_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) != 0){ g_cond_signal(&(audio_unit_devout->callback_cond)); } g_mutex_unlock(callback_mutex); // } /* wait callback */ g_mutex_lock(callback_finish_mutex); if((AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) == 0){ g_atomic_int_or(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_WAIT); while((AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) == 0 && (AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) != 0){ g_cond_wait(&(audio_unit_devout->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(audio_unit_devout->sync_flags), (~(AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_WAIT | AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(audio_unit_devout->sync_flags), (~AGS_AUDIO_UNIT_DEVOUT_INITIAL_CALLBACK)); } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) audio_unit_devout); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) audio_unit_devout); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) audio_unit_devout); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_audio_unit_devout_port_free(AgsSoundcard *soundcard) { AgsAudioUnitPort *audio_unit_port; AgsAudioUnitDevout *audio_unit_devout; guint pcm_channels; guint word_size; GRecMutex *audio_unit_port_mutex; GRecMutex *audio_unit_devout_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio-unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* port */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_port = (AgsAudioUnitPort *) audio_unit_devout->audio_unit_port->data; pcm_channels = audio_unit_devout->pcm_channels; g_rec_mutex_unlock(audio_unit_devout_mutex); /* get port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* */ g_rec_mutex_lock(audio_unit_devout_mutex); if((AGS_AUDIO_UNIT_DEVOUT_INITIALIZED & (audio_unit_devout->flags)) == 0){ g_rec_mutex_unlock(audio_unit_devout_mutex); return; } callback_mutex = &(audio_unit_devout->callback_mutex); callback_finish_mutex = &(audio_unit_devout->callback_finish_mutex); // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); audio_unit_devout->flags &= (~(AGS_AUDIO_UNIT_DEVOUT_BUFFER0 | AGS_AUDIO_UNIT_DEVOUT_BUFFER1 | AGS_AUDIO_UNIT_DEVOUT_BUFFER2 | AGS_AUDIO_UNIT_DEVOUT_BUFFER3 | AGS_AUDIO_UNIT_DEVOUT_BUFFER4 | AGS_AUDIO_UNIT_DEVOUT_BUFFER5 | AGS_AUDIO_UNIT_DEVOUT_BUFFER6 | AGS_AUDIO_UNIT_DEVOUT_BUFFER7 | AGS_AUDIO_UNIT_DEVOUT_PLAY)); g_atomic_int_or(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_PASS_THROUGH); g_atomic_int_and(&(audio_unit_devout->sync_flags), (~AGS_AUDIO_UNIT_DEVOUT_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_CALLBACK_DONE); if((AGS_AUDIO_UNIT_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) != 0){ g_cond_signal(&(audio_unit_devout->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(audio_unit_devout->sync_flags), AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(audio_unit_devout->sync_flags)))) != 0){ g_cond_signal(&(audio_unit_devout->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ audio_unit_devout->note_offset = audio_unit_devout->start_note_offset; audio_unit_devout->note_offset_absolute = audio_unit_devout->start_note_offset; switch(audio_unit_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_audio_unit_devout_free(): unsupported word size"); } g_rec_mutex_unlock(audio_unit_devout_mutex); if(audio_unit_devout->audio_unit_port != NULL){ audio_unit_port = audio_unit_devout->audio_unit_port->data; while(!g_atomic_int_get(&(audio_unit_port->is_empty))) usleep(500000); } g_rec_mutex_lock(audio_unit_devout_mutex); memset(audio_unit_devout->buffer[0], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[1], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[2], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[3], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[4], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[5], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[6], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); memset(audio_unit_devout->buffer[7], 0, (size_t) audio_unit_devout->pcm_channels * audio_unit_devout->buffer_size * word_size); g_rec_mutex_unlock(audio_unit_devout_mutex); } void ags_audio_unit_devout_tic(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* determine if attack should be switched */ g_rec_mutex_lock(audio_unit_devout_mutex); delay = audio_unit_devout->delay[audio_unit_devout->tic_counter]; delay_counter = audio_unit_devout->delay_counter; note_offset = audio_unit_devout->note_offset; note_offset_absolute = audio_unit_devout->note_offset_absolute; loop_left = audio_unit_devout->loop_left; loop_right = audio_unit_devout->loop_right; do_loop = audio_unit_devout->do_loop; g_rec_mutex_unlock(audio_unit_devout_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->delay_counter = delay_counter + 1.0 - delay; audio_unit_devout->tact_counter += 1.0; g_rec_mutex_unlock(audio_unit_devout_mutex); }else{ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->delay_counter += 1.0; g_rec_mutex_unlock(audio_unit_devout_mutex); } } void ags_audio_unit_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* offset changed */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->tic_counter += 1; if(audio_unit_devout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ audio_unit_devout->tic_counter = 0; } g_rec_mutex_unlock(audio_unit_devout_mutex); } void ags_audio_unit_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set bpm */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->bpm = bpm; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); } gdouble ags_audio_unit_devout_get_bpm(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gdouble bpm; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get bpm */ g_rec_mutex_lock(audio_unit_devout_mutex); bpm = audio_unit_devout->bpm; g_rec_mutex_unlock(audio_unit_devout_mutex); return(bpm); } void ags_audio_unit_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set delay factor */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->delay_factor = delay_factor; g_rec_mutex_unlock(audio_unit_devout_mutex); ags_audio_unit_devout_adjust_delay_and_attack(audio_unit_devout); } gdouble ags_audio_unit_devout_get_delay_factor(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gdouble delay_factor; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get delay factor */ g_rec_mutex_lock(audio_unit_devout_mutex); delay_factor = audio_unit_devout->delay_factor; g_rec_mutex_unlock(audio_unit_devout_mutex); return(delay_factor); } gdouble ags_audio_unit_devout_get_delay(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint delay_index; gdouble delay; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get delay */ g_rec_mutex_lock(audio_unit_devout_mutex); delay_index = audio_unit_devout->tic_counter; delay = audio_unit_devout->delay[delay_index]; g_rec_mutex_unlock(audio_unit_devout_mutex); return(delay); } gdouble ags_audio_unit_devout_get_absolute_delay(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; gdouble absolute_delay; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get absolute delay */ g_rec_mutex_lock(audio_unit_devout_mutex); absolute_delay = (60.0 * (((gdouble) audio_unit_devout->samplerate / (gdouble) audio_unit_devout->buffer_size) / (gdouble) audio_unit_devout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) audio_unit_devout->delay_factor))); g_rec_mutex_unlock(audio_unit_devout_mutex); return(absolute_delay); } guint ags_audio_unit_devout_get_attack(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint attack_index; guint attack; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get attack */ g_rec_mutex_lock(audio_unit_devout_mutex); attack_index = audio_unit_devout->tic_counter; attack = audio_unit_devout->attack[attack_index]; g_rec_mutex_unlock(audio_unit_devout_mutex); return(attack); } void* ags_audio_unit_devout_get_buffer(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; void *buffer; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER0)){ buffer = audio_unit_devout->buffer[0]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER1)){ buffer = audio_unit_devout->buffer[1]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER2)){ buffer = audio_unit_devout->buffer[2]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER3)){ buffer = audio_unit_devout->buffer[3]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER4)){ buffer = audio_unit_devout->buffer[4]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER5)){ buffer = audio_unit_devout->buffer[5]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER6)){ buffer = audio_unit_devout->buffer[6]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER7)){ buffer = audio_unit_devout->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_audio_unit_devout_get_next_buffer(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; void *buffer; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER0)){ buffer = audio_unit_devout->buffer[1]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER1)){ buffer = audio_unit_devout->buffer[2]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER2)){ buffer = audio_unit_devout->buffer[3]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER3)){ buffer = audio_unit_devout->buffer[4]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER4)){ buffer = audio_unit_devout->buffer[5]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER5)){ buffer = audio_unit_devout->buffer[6]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER6)){ buffer = audio_unit_devout->buffer[7]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER7)){ buffer = audio_unit_devout->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_audio_unit_devout_get_prev_buffer(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; void *buffer; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER0)){ buffer = audio_unit_devout->buffer[7]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER1)){ buffer = audio_unit_devout->buffer[0]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER2)){ buffer = audio_unit_devout->buffer[1]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER3)){ buffer = audio_unit_devout->buffer[2]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER4)){ buffer = audio_unit_devout->buffer[3]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER5)){ buffer = audio_unit_devout->buffer[4]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER6)){ buffer = audio_unit_devout->buffer[5]; }else if(ags_audio_unit_devout_test_flags(audio_unit_devout, AGS_AUDIO_UNIT_DEVOUT_BUFFER7)){ buffer = audio_unit_devout->buffer[6]; }else{ buffer = NULL; } return(buffer); } void ags_audio_unit_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *buffer_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); buffer_mutex = NULL; if(audio_unit_devout->buffer != NULL){ if(buffer == audio_unit_devout->buffer[0]){ buffer_mutex = audio_unit_devout->buffer_mutex[0]; }else if(buffer == audio_unit_devout->buffer[1]){ buffer_mutex = audio_unit_devout->buffer_mutex[1]; }else if(buffer == audio_unit_devout->buffer[2]){ buffer_mutex = audio_unit_devout->buffer_mutex[2]; }else if(buffer == audio_unit_devout->buffer[3]){ buffer_mutex = audio_unit_devout->buffer_mutex[3]; }else if(buffer == audio_unit_devout->buffer[4]){ buffer_mutex = audio_unit_devout->buffer_mutex[4]; }else if(buffer == audio_unit_devout->buffer[5]){ buffer_mutex = audio_unit_devout->buffer_mutex[5]; }else if(buffer == audio_unit_devout->buffer[6]){ buffer_mutex = audio_unit_devout->buffer_mutex[6]; }else if(buffer == audio_unit_devout->buffer[7]){ buffer_mutex = audio_unit_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_audio_unit_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *buffer_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); buffer_mutex = NULL; if(audio_unit_devout->buffer != NULL){ if(buffer == audio_unit_devout->buffer[0]){ buffer_mutex = audio_unit_devout->buffer_mutex[0]; }else if(buffer == audio_unit_devout->buffer[1]){ buffer_mutex = audio_unit_devout->buffer_mutex[1]; }else if(buffer == audio_unit_devout->buffer[2]){ buffer_mutex = audio_unit_devout->buffer_mutex[2]; }else if(buffer == audio_unit_devout->buffer[3]){ buffer_mutex = audio_unit_devout->buffer_mutex[3]; }else if(buffer == audio_unit_devout->buffer[4]){ buffer_mutex = audio_unit_devout->buffer_mutex[4]; }else if(buffer == audio_unit_devout->buffer[5]){ buffer_mutex = audio_unit_devout->buffer_mutex[5]; }else if(buffer == audio_unit_devout->buffer[6]){ buffer_mutex = audio_unit_devout->buffer_mutex[6]; }else if(buffer == audio_unit_devout->buffer[7]){ buffer_mutex = audio_unit_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_audio_unit_devout_get_delay_counter(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint delay_counter; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* delay counter */ g_rec_mutex_lock(audio_unit_devout_mutex); delay_counter = audio_unit_devout->delay_counter; g_rec_mutex_unlock(audio_unit_devout_mutex); return(delay_counter); } void ags_audio_unit_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set note offset */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->start_note_offset = start_note_offset; g_rec_mutex_unlock(audio_unit_devout_mutex); } guint ags_audio_unit_devout_get_start_note_offset(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint start_note_offset; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set note offset */ g_rec_mutex_lock(audio_unit_devout_mutex); start_note_offset = audio_unit_devout->start_note_offset; g_rec_mutex_unlock(audio_unit_devout_mutex); return(start_note_offset); } void ags_audio_unit_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set note offset */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->note_offset = note_offset; g_rec_mutex_unlock(audio_unit_devout_mutex); } guint ags_audio_unit_devout_get_note_offset(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint note_offset; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set note offset */ g_rec_mutex_lock(audio_unit_devout_mutex); note_offset = audio_unit_devout->note_offset; g_rec_mutex_unlock(audio_unit_devout_mutex); return(note_offset); } void ags_audio_unit_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set note offset */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(audio_unit_devout_mutex); } guint ags_audio_unit_devout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint note_offset_absolute; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set note offset */ g_rec_mutex_lock(audio_unit_devout_mutex); note_offset_absolute = audio_unit_devout->note_offset_absolute; g_rec_mutex_unlock(audio_unit_devout_mutex); return(note_offset_absolute); } void ags_audio_unit_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* set loop */ g_rec_mutex_lock(audio_unit_devout_mutex); audio_unit_devout->loop_left = loop_left; audio_unit_devout->loop_right = loop_right; audio_unit_devout->do_loop = do_loop; if(do_loop){ audio_unit_devout->loop_offset = audio_unit_devout->note_offset; } g_rec_mutex_unlock(audio_unit_devout_mutex); } void ags_audio_unit_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsAudioUnitDevout *audio_unit_devout; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get loop */ g_rec_mutex_lock(audio_unit_devout_mutex); if(loop_left != NULL){ *loop_left = audio_unit_devout->loop_left; } if(loop_right != NULL){ *loop_right = audio_unit_devout->loop_right; } if(do_loop != NULL){ *do_loop = audio_unit_devout->do_loop; } g_rec_mutex_unlock(audio_unit_devout_mutex); } guint ags_audio_unit_devout_get_loop_offset(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint loop_offset; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get loop offset */ g_rec_mutex_lock(audio_unit_devout_mutex); loop_offset = audio_unit_devout->loop_offset; g_rec_mutex_unlock(audio_unit_devout_mutex); return(loop_offset); } guint ags_audio_unit_devout_get_sub_block_count(AgsSoundcard *soundcard) { AgsAudioUnitDevout *audio_unit_devout; guint sub_block_count; GRecMutex *audio_unit_devout_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get loop offset */ g_rec_mutex_lock(audio_unit_devout_mutex); sub_block_count = audio_unit_devout->sub_block_count; g_rec_mutex_unlock(audio_unit_devout_mutex); return(sub_block_count); } gboolean ags_audio_unit_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsAudioUnitDevout *audio_unit_devout; guint pcm_channels; guint sub_block_count; gboolean success; GRecMutex *audio_unit_devout_mutex; GRecMutex *sub_block_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get loop offset */ g_rec_mutex_lock(audio_unit_devout_mutex); pcm_channels = audio_unit_devout->pcm_channels; sub_block_count = audio_unit_devout->sub_block_count; g_rec_mutex_unlock(audio_unit_devout_mutex); sub_block_mutex = NULL; success = FALSE; if(audio_unit_devout->buffer != NULL){ if(buffer == audio_unit_devout->buffer[0]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[sub_block]; }else if(buffer == audio_unit_devout->buffer[1]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[2]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[3]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[4]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[5]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[6]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[7]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ if(g_rec_mutex_trylock(sub_block_mutex) == 0){ success = TRUE; } } return(success); } void ags_audio_unit_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsAudioUnitDevout *audio_unit_devout; guint pcm_channels; guint sub_block_count; GRecMutex *audio_unit_devout_mutex; GRecMutex *sub_block_mutex; audio_unit_devout = AGS_AUDIO_UNIT_DEVOUT(soundcard); /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get loop offset */ g_rec_mutex_lock(audio_unit_devout_mutex); pcm_channels = audio_unit_devout->pcm_channels; sub_block_count = audio_unit_devout->sub_block_count; g_rec_mutex_unlock(audio_unit_devout_mutex); sub_block_mutex = NULL; if(audio_unit_devout->buffer != NULL){ if(buffer == audio_unit_devout->buffer[0]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[sub_block]; }else if(buffer == audio_unit_devout->buffer[1]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[2]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[3]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[4]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[5]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[6]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == audio_unit_devout->buffer[7]){ sub_block_mutex = audio_unit_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ g_rec_mutex_unlock(sub_block_mutex); } } /** * ags_audio_unit_devout_switch_buffer_flag: * @audio_unit_devout: an #AgsAudioUnitDevout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_audio_unit_devout_switch_buffer_flag(AgsAudioUnitDevout *audio_unit_devout) { GRecMutex *audio_unit_devout_mutex; if(!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_devout)){ return; } /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* switch buffer flag */ g_rec_mutex_lock(audio_unit_devout_mutex); if((AGS_AUDIO_UNIT_DEVOUT_BUFFER0 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER0); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER1; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER1 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER1); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER2; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER2 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER2); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER3; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER3 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER3); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER4; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER4 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER4); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER5; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER5 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER5); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER6; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER6 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER6); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER7; }else if((AGS_AUDIO_UNIT_DEVOUT_BUFFER7 & (audio_unit_devout->flags)) != 0){ audio_unit_devout->flags &= (~AGS_AUDIO_UNIT_DEVOUT_BUFFER7); audio_unit_devout->flags |= AGS_AUDIO_UNIT_DEVOUT_BUFFER0; } g_rec_mutex_unlock(audio_unit_devout_mutex); } /** * ags_audio_unit_devout_adjust_delay_and_attack: * @audio_unit_devout: the #AgsAudioUnitDevout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_audio_unit_devout_adjust_delay_and_attack(AgsAudioUnitDevout *audio_unit_devout) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *audio_unit_devout_mutex; if(!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_devout)){ return; } /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get some initial values */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(audio_unit_devout)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(audio_unit_devout_mutex); default_tact_frames = (guint) (delay * audio_unit_devout->buffer_size); delay_tact_frames = (guint) (floor(delay) * audio_unit_devout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; audio_unit_devout->attack[0] = (guint) floor(0.25 * audio_unit_devout->buffer_size); next_attack = (((audio_unit_devout->attack[i] + default_tact_frames) / audio_unit_devout->buffer_size) - delay) * audio_unit_devout->buffer_size; if(next_attack < 0){ next_attack = 0; } if(next_attack >= audio_unit_devout->buffer_size){ next_attack = audio_unit_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ audio_unit_devout->attack[i] = audio_unit_devout->attack[i] - ((gdouble) next_attack / 2.0); if(audio_unit_devout->attack[i] < 0){ audio_unit_devout->attack[i] = 0; } if(audio_unit_devout->attack[i] >= audio_unit_devout->buffer_size){ audio_unit_devout->attack[i] = audio_unit_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= audio_unit_devout->buffer_size){ next_attack = audio_unit_devout->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ audio_unit_devout->attack[i] = next_attack; next_attack = (((audio_unit_devout->attack[i] + default_tact_frames) / audio_unit_devout->buffer_size) - delay) * audio_unit_devout->buffer_size; if(next_attack >= audio_unit_devout->buffer_size){ next_attack = audio_unit_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ audio_unit_devout->attack[i] = audio_unit_devout->attack[i] - ((gdouble) next_attack / 2.0); if(audio_unit_devout->attack[i] < 0){ audio_unit_devout->attack[i] = 0; } if(audio_unit_devout->attack[i] >= audio_unit_devout->buffer_size){ audio_unit_devout->attack[i] = audio_unit_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= audio_unit_devout->buffer_size){ next_attack = audio_unit_devout->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", audio_unit_devout->attack[i]); #endif } audio_unit_devout->attack[0] = audio_unit_devout->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ audio_unit_devout->delay[i] = ((gdouble) (default_tact_frames + audio_unit_devout->attack[i] - audio_unit_devout->attack[i + 1])) / (gdouble) audio_unit_devout->buffer_size; #ifdef AGS_DEBUG g_message("%f", audio_unit_devout->delay[i]); #endif } audio_unit_devout->delay[i] = ((gdouble) (default_tact_frames + audio_unit_devout->attack[i] - audio_unit_devout->attack[0])) / (gdouble) audio_unit_devout->buffer_size; g_rec_mutex_unlock(audio_unit_devout_mutex); } /** * ags_audio_unit_devout_realloc_buffer: * @audio_unit_devout: the #AgsAudioUnitDevout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_audio_unit_devout_realloc_buffer(AgsAudioUnitDevout *audio_unit_devout) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *audio_unit_devout_mutex; if(!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_devout)){ return; } /* get audio_unit devout mutex */ audio_unit_devout_mutex = AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(audio_unit_devout); /* get word size */ g_rec_mutex_lock(audio_unit_devout_mutex); pcm_channels = audio_unit_devout->pcm_channels; buffer_size = audio_unit_devout->buffer_size; format = audio_unit_devout->format; g_rec_mutex_unlock(audio_unit_devout_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_audio_unit_devout_realloc_buffer(): unsupported word size"); return; } /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_0 */ if(audio_unit_devout->buffer[0] != NULL){ free(audio_unit_devout->buffer[0]); } audio_unit_devout->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_1 */ if(audio_unit_devout->buffer[1] != NULL){ free(audio_unit_devout->buffer[1]); } audio_unit_devout->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_2 */ if(audio_unit_devout->buffer[2] != NULL){ free(audio_unit_devout->buffer[2]); } audio_unit_devout->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_3 */ if(audio_unit_devout->buffer[3] != NULL){ free(audio_unit_devout->buffer[3]); } audio_unit_devout->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_4 */ if(audio_unit_devout->buffer[4] != NULL){ free(audio_unit_devout->buffer[4]); } audio_unit_devout->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_5 */ if(audio_unit_devout->buffer[5] != NULL){ free(audio_unit_devout->buffer[5]); } audio_unit_devout->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_6 */ if(audio_unit_devout->buffer[6] != NULL){ free(audio_unit_devout->buffer[6]); } audio_unit_devout->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVOUT_BUFFER_7 */ if(audio_unit_devout->buffer[7] != NULL){ free(audio_unit_devout->buffer[7]); } audio_unit_devout->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_audio_unit_devout_new: * * Creates a new instance of #AgsAudioUnitDevout. * * Returns: a new #AgsAudioUnitDevout * * Since: 3.0.0 */ AgsAudioUnitDevout* ags_audio_unit_devout_new() { AgsAudioUnitDevout *audio_unit_devout; audio_unit_devout = (AgsAudioUnitDevout *) g_object_new(AGS_TYPE_AUDIO_UNIT_DEVOUT, NULL); return(audio_unit_devout); } gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_devin.h0000644000175000017500000001556313607210263021073 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_UNIT_DEVIN_H__ #define __AGS_AUDIO_UNIT_DEVIN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_UNIT_DEVIN (ags_audio_unit_devin_get_type()) #define AGS_AUDIO_UNIT_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_UNIT_DEVIN, AgsAudioUnitDevin)) #define AGS_AUDIO_UNIT_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_UNIT_DEVIN, AgsAudioUnitDevin)) #define AGS_IS_AUDIO_UNIT_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_UNIT_DEVIN)) #define AGS_IS_AUDIO_UNIT_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_UNIT_DEVIN)) #define AGS_AUDIO_UNIT_DEVIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_UNIT_DEVIN, AgsAudioUnitDevinClass)) #define AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(obj) (&(((AgsAudioUnitDevin *) obj)->obj_mutex)) typedef struct _AgsAudioUnitDevin AgsAudioUnitDevin; typedef struct _AgsAudioUnitDevinClass AgsAudioUnitDevinClass; /** * AgsAudioUnitDevinFlags: * @AGS_AUDIO_UNIT_DEVIN_ADDED_TO_REGISTRY: the core-audio devin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_UNIT_DEVIN_CONNECTED: indicates the core-audio devin was connected by calling #AgsConnectable::connect() * @AGS_AUDIO_UNIT_DEVIN_BUFFER0: ring-buffer 0 * @AGS_AUDIO_UNIT_DEVIN_BUFFER1: ring-buffer 1 * @AGS_AUDIO_UNIT_DEVIN_BUFFER2: ring-buffer 2 * @AGS_AUDIO_UNIT_DEVIN_BUFFER3: ring-buffer 3 * @AGS_AUDIO_UNIT_DEVIN_BUFFER4: ring-buffer 4 * @AGS_AUDIO_UNIT_DEVIN_BUFFER5: ring-buffer 5 * @AGS_AUDIO_UNIT_DEVIN_BUFFER6: ring-buffer 6 * @AGS_AUDIO_UNIT_DEVIN_BUFFER7: ring-buffer 7 * @AGS_AUDIO_UNIT_DEVIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_AUDIO_UNIT_DEVIN_RECORD: do capture * @AGS_AUDIO_UNIT_DEVIN_SHUTDOWN: stop capture * @AGS_AUDIO_UNIT_DEVIN_START_RECORD: capture starting * @AGS_AUDIO_UNIT_DEVIN_NONBLOCKING: do non-blocking calls * @AGS_AUDIO_UNIT_DEVIN_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsAudioUnitDevin by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_UNIT_DEVIN_ADDED_TO_REGISTRY = 1, AGS_AUDIO_UNIT_DEVIN_CONNECTED = 1 << 1, AGS_AUDIO_UNIT_DEVIN_BUFFER0 = 1 << 2, AGS_AUDIO_UNIT_DEVIN_BUFFER1 = 1 << 3, AGS_AUDIO_UNIT_DEVIN_BUFFER2 = 1 << 4, AGS_AUDIO_UNIT_DEVIN_BUFFER3 = 1 << 5, AGS_AUDIO_UNIT_DEVIN_BUFFER4 = 1 << 6, AGS_AUDIO_UNIT_DEVIN_BUFFER5 = 1 << 7, AGS_AUDIO_UNIT_DEVIN_BUFFER6 = 1 << 8, AGS_AUDIO_UNIT_DEVIN_BUFFER7 = 1 << 9, AGS_AUDIO_UNIT_DEVIN_ATTACK_FIRST = 1 << 10, AGS_AUDIO_UNIT_DEVIN_RECORD = 1 << 11, AGS_AUDIO_UNIT_DEVIN_SHUTDOWN = 1 << 12, AGS_AUDIO_UNIT_DEVIN_START_RECORD = 1 << 13, AGS_AUDIO_UNIT_DEVIN_NONBLOCKING = 1 << 14, AGS_AUDIO_UNIT_DEVIN_INITIALIZED = 1 << 15, }AgsAudioUnitDevinFlags; /** * AgsAudioUnitDevinSyncFlags: * @AGS_AUDIO_UNIT_DEVIN_PASS_THROUGH: do not sync * @AGS_AUDIO_UNIT_DEVIN_INITIAL_CALLBACK: initial callback * @AGS_AUDIO_UNIT_DEVIN_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_AUDIO_UNIT_DEVIN_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_AUDIO_UNIT_DEVIN_PASS_THROUGH = 1, AGS_AUDIO_UNIT_DEVIN_INITIAL_CALLBACK = 1 << 1, AGS_AUDIO_UNIT_DEVIN_CALLBACK_WAIT = 1 << 2, AGS_AUDIO_UNIT_DEVIN_CALLBACK_DONE = 1 << 3, AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_WAIT = 1 << 4, AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_DONE = 1 << 5, }AgsAudioUnitDevinSyncFlags; #define AGS_AUDIO_UNIT_DEVIN_ERROR (ags_audio_unit_devin_error_quark()) typedef enum{ AGS_AUDIO_UNIT_DEVIN_ERROR_LOCKED_SOUNDCARD, }AgsAudioUnitDevinError; struct _AgsAudioUnitDevin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; void** buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *audio_unit_client; gchar **port_name; GList *audio_unit_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; GObject *notify_soundcard; }; struct _AgsAudioUnitDevinClass { GObjectClass gobject; }; GType ags_audio_unit_devin_get_type(); GQuark ags_audio_unit_devin_error_quark(); gboolean ags_audio_unit_devin_test_flags(AgsAudioUnitDevin *audio_unit_devin, guint flags); void ags_audio_unit_devin_set_flags(AgsAudioUnitDevin *audio_unit_devin, guint flags); void ags_audio_unit_devin_unset_flags(AgsAudioUnitDevin *audio_unit_devin, guint flags); void ags_audio_unit_devin_switch_buffer_flag(AgsAudioUnitDevin *audio_unit_devin); void ags_audio_unit_devin_adjust_delay_and_attack(AgsAudioUnitDevin *audio_unit_devin); void ags_audio_unit_devin_realloc_buffer(AgsAudioUnitDevin *audio_unit_devin); AgsAudioUnitDevin* ags_audio_unit_devin_new(); G_END_DECLS #endif /*__AGS_AUDIO_UNIT_DEVIN_H__*/ gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_port.c0000644000175000017500000006151513607210263020743 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_AUDIO_UNIT #include #include #endif #include void ags_audio_unit_port_class_init(AgsAudioUnitPortClass *audio_unit_port); void ags_audio_unit_port_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_unit_port_init(AgsAudioUnitPort *audio_unit_port); void ags_audio_unit_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_unit_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_unit_port_dispose(GObject *gobject); void ags_audio_unit_port_finalize(GObject *gobject); AgsUUID* ags_audio_unit_port_get_uuid(AgsConnectable *connectable); gboolean ags_audio_unit_port_has_resource(AgsConnectable *connectable); gboolean ags_audio_unit_port_is_ready(AgsConnectable *connectable); void ags_audio_unit_port_add_to_registry(AgsConnectable *connectable); void ags_audio_unit_port_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_unit_port_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_unit_port_xml_compose(AgsConnectable *connectable); void ags_audio_unit_port_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_unit_port_is_connected(AgsConnectable *connectable); void ags_audio_unit_port_connect(AgsConnectable *connectable); void ags_audio_unit_port_disconnect(AgsConnectable *connectable); #ifdef AGS_WITH_AUDIO_UNIT OSStatus ags_audio_unit_port_output_render_callback(AgsAudioUnitPort *audio_unit_port, AudioUnitRenderActionFlags *io_action_flags, const AudioTimeStamp *in_time_stamp, UInt32 in_bus_number, UInt32 in_number_frames, AudioBufferList *io_data); #endif /** * SECTION:ags_audio_unit_port * @short_description: core audio resource. * @title: AgsAudioUnitPort * @section_id: * @include: ags/audio/audio-unit/ags_audio_unit_port.h * * The #AgsAudioUnitPort represents either a core audio sequencer or soundcard to communicate * with. */ enum{ PROP_0, PROP_AUDIO_UNIT_CLIENT, PROP_AUDIO_UNIT_DEVICE, PROP_PORT_NAME, }; static gpointer ags_audio_unit_port_parent_class = NULL; GType ags_audio_unit_port_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_unit_port = 0; static const GTypeInfo ags_audio_unit_port_info = { sizeof(AgsAudioUnitPortClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_unit_port_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudioUnitPort), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_unit_port_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_unit_port_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_unit_port = g_type_register_static(G_TYPE_OBJECT, "AgsAudioUnitPort", &ags_audio_unit_port_info, 0); g_type_add_interface_static(ags_type_audio_unit_port, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_unit_port); } return g_define_type_id__volatile; } void ags_audio_unit_port_class_init(AgsAudioUnitPortClass *audio_unit_port) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_unit_port_parent_class = g_type_class_peek_parent(audio_unit_port); /* GObjectClass */ gobject = (GObjectClass *) audio_unit_port; gobject->set_property = ags_audio_unit_port_set_property; gobject->get_property = ags_audio_unit_port_get_property; gobject->dispose = ags_audio_unit_port_dispose; gobject->finalize = ags_audio_unit_port_finalize; /* properties */ /** * AgsAudioUnitPort:audio-unit-client: * * The assigned #AgsAudioUnitClient. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-unit-client", i18n_pspec("assigned core audio client"), i18n_pspec("The assigned core audio client"), AGS_TYPE_AUDIO_UNIT_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_CLIENT, param_spec); /** * AgsAudioUnitPort:audio-unit-device: * * The assigned #AgsAudioUnitDevout. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-unit-device", i18n_pspec("assigned core audio devout"), i18n_pspec("The assigned core audio devout"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_DEVICE, param_spec); /** * AgsAudioUnitPort:port-name: * * The core audio soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("port-name", i18n_pspec("port name"), i18n_pspec("The port name"), "hw:0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_NAME, param_spec); } void ags_audio_unit_port_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_unit_port_get_uuid; connectable->has_resource = ags_audio_unit_port_has_resource; connectable->is_ready = ags_audio_unit_port_is_ready; connectable->add_to_registry = ags_audio_unit_port_add_to_registry; connectable->remove_from_registry = ags_audio_unit_port_remove_from_registry; connectable->list_resource = ags_audio_unit_port_list_resource; connectable->xml_compose = ags_audio_unit_port_xml_compose; connectable->xml_parse = ags_audio_unit_port_xml_parse; connectable->is_connected = ags_audio_unit_port_is_connected; connectable->connect = ags_audio_unit_port_connect; connectable->disconnect = ags_audio_unit_port_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_unit_port_init(AgsAudioUnitPort *audio_unit_port) { AgsConfig *config; gchar *str; guint word_size; guint fixed_size; guint i; /* flags */ audio_unit_port->flags = 0; /* port mutex */ g_rec_mutex_init(&(audio_unit_port->obj_mutex)); /* parent */ audio_unit_port->audio_unit_client = NULL; /* uuid */ audio_unit_port->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_unit_port->uuid); /* */ audio_unit_port->audio_unit_device = NULL; audio_unit_port->port_uuid = ags_id_generator_create_uuid(); audio_unit_port->port_name = NULL; /* read config */ config = ags_config_get_instance(); audio_unit_port->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); audio_unit_port->samplerate = ags_soundcard_helper_config_get_samplerate(config); audio_unit_port->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); audio_unit_port->format = ags_soundcard_helper_config_get_format(config); #ifdef AGS_WITH_AUDIO_UNIT audio_unit_port->data_format = (AudioStreamBasicDescription *) malloc(sizeof(AudioStreamBasicDescription)); audio_unit_port->graph = (AUGraph *) malloc(sizeof(AUGraph)); audio_unit_port->description = (AudioComponentDescription *) malloc(sizeof(AudioComponentDescription)); memset(audio_unit_port->description, 0, sizeof(AudioComponentDescription)); audio_unit_port->node = (AUNode *) malloc(sizeof(AUNode)); audio_unit_port->audio_component = NULL; audio_unit_port->audio_unit = (AudioUnit *) malloc(sizeof(AudioUnit)); audio_unit_port->render_callback = (AURenderCallbackStruct *) malloc(sizeof(AURenderCallbackStruct)); #else audio_unit_port->data_format = NULL; audio_unit_port->graph = NULL; audio_unit_port->description = NULL; audio_unit_port->node = NULL; audio_unit_port->audio_component = NULL; audio_unit_port->audio_unit = NULL; audio_unit_port->render_callback = NULL; #endif audio_unit_port->midi_port_number = 0; g_atomic_int_set(&(audio_unit_port->is_empty), FALSE); g_atomic_int_set(&(audio_unit_port->queued), 0); } void ags_audio_unit_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioUnitPort *audio_unit_port; GRecMutex *audio_unit_port_mutex; audio_unit_port = AGS_AUDIO_UNIT_PORT(gobject); /* get audio_unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); switch(prop_id){ case PROP_AUDIO_UNIT_CLIENT: { AgsAudioUnitClient *audio_unit_client; audio_unit_client = (AgsAudioUnitClient *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_port_mutex); if(audio_unit_port->audio_unit_client == (GObject *) audio_unit_client){ g_rec_mutex_unlock(audio_unit_port_mutex); return; } if(audio_unit_port->audio_unit_client != NULL){ g_object_unref(audio_unit_port->audio_unit_client); } if(audio_unit_client != NULL){ g_object_ref(audio_unit_client); } audio_unit_port->audio_unit_client = (GObject *) audio_unit_client; g_rec_mutex_unlock(audio_unit_port_mutex); } break; case PROP_AUDIO_UNIT_DEVICE: { GObject *audio_unit_device; audio_unit_device = g_value_get_object(value); g_rec_mutex_lock(audio_unit_port_mutex); if(audio_unit_port->audio_unit_device == audio_unit_device){ g_rec_mutex_unlock(audio_unit_port_mutex); return; } if(audio_unit_port->audio_unit_device != NULL){ g_object_unref(audio_unit_port->audio_unit_device); } if(audio_unit_device != NULL){ g_object_ref(audio_unit_device); } audio_unit_port->audio_unit_device = (GObject *) audio_unit_device; g_rec_mutex_unlock(audio_unit_port_mutex); } break; case PROP_PORT_NAME: { gchar *port_name; port_name = g_value_get_string(value); g_rec_mutex_lock(audio_unit_port_mutex); if(audio_unit_port->port_name == port_name){ g_rec_mutex_unlock(audio_unit_port_mutex); return; } if(audio_unit_port->port_name != NULL){ g_free(audio_unit_port->port_name); } audio_unit_port->port_name = port_name; g_rec_mutex_unlock(audio_unit_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioUnitPort *audio_unit_port; GRecMutex *audio_unit_port_mutex; audio_unit_port = AGS_AUDIO_UNIT_PORT(gobject); /* get audio_unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); switch(prop_id){ case PROP_AUDIO_UNIT_CLIENT: { g_rec_mutex_lock(audio_unit_port_mutex); g_value_set_object(value, audio_unit_port->audio_unit_client); g_rec_mutex_unlock(audio_unit_port_mutex); } break; case PROP_AUDIO_UNIT_DEVICE: { g_rec_mutex_lock(audio_unit_port_mutex); g_value_set_object(value, audio_unit_port->audio_unit_device); g_rec_mutex_unlock(audio_unit_port_mutex); } break; case PROP_PORT_NAME: { g_rec_mutex_lock(audio_unit_port_mutex); g_value_set_string(value, audio_unit_port->port_name); g_rec_mutex_unlock(audio_unit_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_port_dispose(GObject *gobject) { AgsAudioUnitPort *audio_unit_port; audio_unit_port = AGS_AUDIO_UNIT_PORT(gobject); /* core audio client */ if(audio_unit_port->audio_unit_client != NULL){ g_object_unref(audio_unit_port->audio_unit_client); audio_unit_port->audio_unit_client = NULL; } /* core audio device */ if(audio_unit_port->audio_unit_device != NULL){ g_object_unref(audio_unit_port->audio_unit_device); audio_unit_port->audio_unit_device = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_unit_port_parent_class)->dispose(gobject); } void ags_audio_unit_port_finalize(GObject *gobject) { AgsAudioUnitPort *audio_unit_port; audio_unit_port = AGS_AUDIO_UNIT_PORT(gobject); /* core audio client */ if(audio_unit_port->audio_unit_client != NULL){ g_object_unref(audio_unit_port->audio_unit_client); } /* core audio device */ if(audio_unit_port->audio_unit_device != NULL){ g_object_unref(audio_unit_port->audio_unit_device); } /* name */ g_free(audio_unit_port->port_name); /* call parent */ G_OBJECT_CLASS(ags_audio_unit_port_parent_class)->finalize(gobject); } AgsUUID* ags_audio_unit_port_get_uuid(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; AgsUUID *ptr; GRecMutex *audio_unit_port_mutex; audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); /* get audio_unit port signal mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* get UUID */ g_rec_mutex_lock(audio_unit_port_mutex); ptr = audio_unit_port->uuid; g_rec_mutex_unlock(audio_unit_port_mutex); return(ptr); } gboolean ags_audio_unit_port_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_audio_unit_port_is_ready(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; gboolean is_ready; audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); /* check is added */ is_ready = ags_audio_unit_port_test_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_unit_port_add_to_registry(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; if(ags_connectable_is_ready(connectable)){ return; } audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_ADDED_TO_REGISTRY); } void ags_audio_unit_port_remove_from_registry(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; if(!ags_connectable_is_ready(connectable)){ return; } audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); ags_audio_unit_port_unset_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_ADDED_TO_REGISTRY); } xmlNode* ags_audio_unit_port_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_unit_port_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_unit_port_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_unit_port_is_connected(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; gboolean is_connected; audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); /* check is connected */ is_connected = ags_audio_unit_port_test_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_CONNECTED); return(is_connected); } void ags_audio_unit_port_connect(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; if(ags_connectable_is_connected(connectable)){ return; } audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_CONNECTED); } void ags_audio_unit_port_disconnect(AgsConnectable *connectable) { AgsAudioUnitPort *audio_unit_port; if(!ags_connectable_is_connected(connectable)){ return; } audio_unit_port = AGS_AUDIO_UNIT_PORT(connectable); ags_audio_unit_port_unset_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_CONNECTED); } /** * ags_audio_unit_port_test_flags: * @audio_unit_port: the #AgsAudioUnitPort * @flags: the flags * * Test @flags to be set on @audio_unit_port. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_unit_port_test_flags(AgsAudioUnitPort *audio_unit_port, guint flags) { gboolean retval; GRecMutex *audio_unit_port_mutex; if(!AGS_IS_AUDIO_UNIT_PORT(audio_unit_port)){ return(FALSE); } /* get audio_unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* test */ g_rec_mutex_lock(audio_unit_port_mutex); retval = (flags & (audio_unit_port->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_port_mutex); return(retval); } /** * ags_audio_unit_port_set_flags: * @audio_unit_port: the #AgsAudioUnitPort * @flags: see #AgsAudioUnitPortFlags-enum * * Enable a feature of @audio_unit_port. * * Since: 3.0.0 */ void ags_audio_unit_port_set_flags(AgsAudioUnitPort *audio_unit_port, guint flags) { GRecMutex *audio_unit_port_mutex; if(!AGS_IS_AUDIO_UNIT_PORT(audio_unit_port)){ return; } /* get audio_unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_unit_port_mutex); audio_unit_port->flags |= flags; g_rec_mutex_unlock(audio_unit_port_mutex); } /** * ags_audio_unit_port_unset_flags: * @audio_unit_port: the #AgsAudioUnitPort * @flags: see #AgsAudioUnitPortFlags-enum * * Disable a feature of @audio_unit_port. * * Since: 3.0.0 */ void ags_audio_unit_port_unset_flags(AgsAudioUnitPort *audio_unit_port, guint flags) { GRecMutex *audio_unit_port_mutex; if(!AGS_IS_AUDIO_UNIT_PORT(audio_unit_port)){ return; } /* get audio_unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_unit_port_mutex); audio_unit_port->flags &= (~flags); g_rec_mutex_unlock(audio_unit_port_mutex); } /** * ags_audio_unit_port_find: * @audio_unit_port: (element-type AgsAudio.AudioUnitPort) (transfer none): the #GList-struct containing #AgsAudioUnitPort * @port_name: the port name to find * * Finds next match of @port_name in @audio_unit_port. * * Returns: (element-type AgsAudio.AudioUnitPort) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_audio_unit_port_find(GList *audio_unit_port, gchar *port_name) { gboolean success; GRecMutex *audio_unit_port_mutex; while(audio_unit_port != NULL){ /* get audio_unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port->data); /* check port name */ g_rec_mutex_lock(audio_unit_port_mutex); success = (!g_ascii_strcasecmp(AGS_AUDIO_UNIT_PORT(audio_unit_port->data)->port_name, port_name)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_port_mutex); if(success){ return(audio_unit_port); } } return(NULL); } #ifdef AGS_WITH_AUDIO_UNIT OSStatus ags_audio_unit_port_output_render_callback(AgsAudioUnitPort *audio_unit_port, AudioUnitRenderActionFlags *io_action_flags, const AudioTimeStamp *in_time_stamp, UInt32 in_bus_number, UInt32 in_number_frames, AudioBufferList *io_data) { } #endif void ags_audio_unit_port_register(AgsAudioUnitPort *audio_unit_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output) { if(!AGS_IS_AUDIO_UNIT_PORT(audio_unit_port) || port_name == NULL){ return; } if(ags_audio_unit_port_test_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_REGISTERED)){ return; } if(is_output){ ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_IS_OUTPUT); }else{ ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_IS_INPUT); } #ifdef AGS_WITH_AUDIO_UNIT NewAUGraph(audio_unit_port->graph); #endif if(is_audio){ ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_IS_AUDIO); if(is_output){ #ifdef AGS_WITH_AUDIO_UNIT audio_unit_port->description->componentType = kAudioUnitType_Output; audio_unit_port->description->componentSubType = kAudioUnitSubType_DefaultOutput; audio_unit_port->description->componentManufacturer = kAudioUnitManufacturer_Apple; AUGraphAddNode(audio_unit_port->graph[0], audio_unit_port->description, audio_unit_port->node); AUGraphOpen(audio_unit_port->graph[0]); AUGraphInitialize(audio_unit_port->graph[0]); AUGraphStart(audio_unit_port->graph[0]); audio_unit_port->audio_component = AudioComponentFindNext(NULL, audio_unit_port->description); AudioComponentInstanceNew(audio_unit_port->audio_component, audio_unit_port->audio_unit); audio_unit_port->render_callback->inputProc = ags_audio_unit_port_output_render_callback; audio_unit_port->render_callback->inputProcRefCon = audio_unit_port; AudioUnitSetProperty(audio_unit_port->audio_unit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, audio_unit_port->render_callback, sizeof(AURenderCallbackStruct)); AudioOutputUnitStart(audio_unit_port->audio_unit); #endif }else{ #ifdef AGS_WITH_AUDIO_UNIT #endif } }else if(is_midi){ ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_IS_MIDI); if(is_output){ #ifdef AGS_WITH_AUDIO_UNIT #endif }else{ #ifdef AGS_WITH_AUDIO_UNIT #endif } } ags_audio_unit_port_set_flags(audio_unit_port, AGS_AUDIO_UNIT_PORT_REGISTERED); //TODO:JK: implement me } void ags_audio_unit_port_unregister(AgsAudioUnitPort *audio_unit_port) { //TODO:JK: implement me } void ags_audio_unit_port_set_format(AgsAudioUnitPort *audio_unit_port, guint format) { GRecMutex *audio_unit_port_mutex; /* get audio-unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* */ g_rec_mutex_lock(audio_unit_port_mutex); audio_unit_port->format = format; g_rec_mutex_unlock(audio_unit_port_mutex); } void ags_audio_unit_port_set_samplerate(AgsAudioUnitPort *audio_unit_port, guint samplerate) { GRecMutex *audio_unit_port_mutex; /* get audio-unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* */ g_rec_mutex_lock(audio_unit_port_mutex); #ifdef AGS_WITH_AUDIO_UNIT audio_unit_port->data_format->mSampleRate = (float) samplerate; #endif audio_unit_port->samplerate = samplerate; g_rec_mutex_unlock(audio_unit_port_mutex); } void ags_audio_unit_port_set_buffer_size(AgsAudioUnitPort *audio_unit_port, guint buffer_size) { GRecMutex *audio_unit_port_mutex; /* get audio-unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* */ g_rec_mutex_lock(audio_unit_port_mutex); #ifdef AGS_WITH_AUDIO_UNIT //TODO:JK: implement me #endif audio_unit_port->buffer_size = buffer_size; g_rec_mutex_unlock(audio_unit_port_mutex); } void ags_audio_unit_port_set_pcm_channels(AgsAudioUnitPort *audio_unit_port, guint pcm_channels) { GRecMutex *audio_unit_port_mutex; /* get audio-unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(audio_unit_port); /* */ g_rec_mutex_lock(audio_unit_port_mutex); audio_unit_port->pcm_channels = pcm_channels; #ifdef AGS_WITH_AUDIO_UNIT audio_unit_port->data_format->mChannelsPerFrame = pcm_channels; #endif g_rec_mutex_unlock(audio_unit_port_mutex); } /** * ags_audio_unit_port_new: * @audio_unit_client: the #AgsAudioUnitClient assigned to * * Create a new instance of #AgsAudioUnitPort. * * Returns: the new #AgsAudioUnitPort * * Since: 3.0.0 */ AgsAudioUnitPort* ags_audio_unit_port_new(GObject *audio_unit_client) { AgsAudioUnitPort *audio_unit_port; audio_unit_port = (AgsAudioUnitPort *) g_object_new(AGS_TYPE_AUDIO_UNIT_PORT, "audio-unit-client", audio_unit_client, NULL); return(audio_unit_port); } gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_server.h0000644000175000017500000001016213607210263021262 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_UNIT_SERVER_H__ #define __AGS_AUDIO_UNIT_SERVER_H__ #include #include #include #ifdef AGS_WITH_AUDIO_UNIT #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_UNIT_SERVER (ags_audio_unit_server_get_type()) #define AGS_AUDIO_UNIT_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_UNIT_SERVER, AgsAudioUnitServer)) #define AGS_AUDIO_UNIT_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_UNIT_SERVER, AgsAudioUnitServer)) #define AGS_IS_AUDIO_UNIT_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_UNIT_SERVER)) #define AGS_IS_AUDIO_UNIT_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_UNIT_SERVER)) #define AGS_AUDIO_UNIT_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_UNIT_SERVER, AgsAudioUnitServerClass)) #define AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(obj) (&(((AgsAudioUnitServer *) obj)->obj_mutex)) typedef struct _AgsAudioUnitServer AgsAudioUnitServer; typedef struct _AgsAudioUnitServerClass AgsAudioUnitServerClass; /** * AgsAudioUnitServerFlags: * @AGS_AUDIO_UNIT_SERVER_ADDED_TO_REGISTRY: the AudioUnit server was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_UNIT_SERVER_CONNECTED: indicates the server was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsAudioUnitServer by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_UNIT_SERVER_ADDED_TO_REGISTRY = 1, AGS_AUDIO_UNIT_SERVER_CONNECTED = 1 << 1, }AgsAudioUnitServerFlags; struct _AgsAudioUnitServer { GObject gobject; guint flags; GRecMutex obj_mutex; volatile gboolean running; pthread_t *thread; AgsApplicationContext *application_context; AgsUUID *uuid; gchar *url; guint *port; guint port_count; guint n_soundcards; guint n_sequencers; GObject *default_soundcard; GObject *default_client; GObject *input_client; GList *client; }; struct _AgsAudioUnitServerClass { GObjectClass gobject; }; GType ags_audio_unit_server_get_type(); gboolean ags_audio_unit_server_test_flags(AgsAudioUnitServer *audio_unit_server, guint flags); void ags_audio_unit_server_set_flags(AgsAudioUnitServer *audio_unit_server, guint flags); void ags_audio_unit_server_unset_flags(AgsAudioUnitServer *audio_unit_server, guint flags); GList* ags_audio_unit_server_find_url(GList *audio_unit_server, gchar *url); GObject* ags_audio_unit_server_find_client(AgsAudioUnitServer *audio_unit_server, gchar *client_uuid); GObject* ags_audio_unit_server_find_port(AgsAudioUnitServer *audio_unit_server, gchar *port_uuid); void ags_audio_unit_server_add_client(AgsAudioUnitServer *audio_unit_server, GObject *audio_unit_client); void ags_audio_unit_server_remove_client(AgsAudioUnitServer *audio_unit_server, GObject *audio_unit_client); void ags_audio_unit_server_connect_client(AgsAudioUnitServer *audio_unit_server); void ags_audio_unit_server_start_poll(AgsAudioUnitServer *audio_unit_server); AgsAudioUnitServer* ags_audio_unit_server_new(gchar *url); G_END_DECLS #endif /*__AGS_AUDIO_UNIT_SERVER_H__*/ gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_port.h0000644000175000017500000001224013607210263020737 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_UNIT_PORT_H__ #define __AGS_AUDIO_UNIT_PORT_H__ #include #include #include #ifdef AGS_WITH_AUDIO_UNIT #include #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_UNIT_PORT (ags_audio_unit_port_get_type()) #define AGS_AUDIO_UNIT_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_UNIT_PORT, AgsAudioUnitPort)) #define AGS_AUDIO_UNIT_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_UNIT_PORT, AgsAudioUnitPort)) #define AGS_IS_AUDIO_UNIT_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_UNIT_PORT)) #define AGS_IS_AUDIO_UNIT_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_UNIT_PORT)) #define AGS_AUDIO_UNIT_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_UNIT_PORT, AgsAudioUnitPortClass)) #define AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(obj) (&(((AgsAudioUnitPort *) obj)->obj_mutex)) #define AGS_AUDIO_UNIT_PORT_DEFAULT_CACHE_BUFFER_SIZE (4096) typedef struct _AgsAudioUnitPort AgsAudioUnitPort; typedef struct _AgsAudioUnitPortClass AgsAudioUnitPortClass; /** * AgsAudioUnitPortFlags: * @AGS_AUDIO_UNIT_PORT_ADDED_TO_REGISTRY: the AudioUnit port was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_UNIT_PORT_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_AUDIO_UNIT_PORT_REGISTERED: the port was registered * @AGS_AUDIO_UNIT_PORT_IS_AUDIO: the port provides audio data * @AGS_AUDIO_UNIT_PORT_IS_MIDI: the port provides midi data * @AGS_AUDIO_UNIT_PORT_IS_OUTPUT: the port does output * @AGS_AUDIO_UNIT_PORT_IS_INPUT: the port does input * * Enum values to control the behavior or indicate internal state of #AgsAudioUnitPort by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_UNIT_PORT_ADDED_TO_REGISTRY = 1, AGS_AUDIO_UNIT_PORT_CONNECTED = 1 << 1, AGS_AUDIO_UNIT_PORT_REGISTERED = 1 << 2, AGS_AUDIO_UNIT_PORT_IS_AUDIO = 1 << 3, AGS_AUDIO_UNIT_PORT_IS_MIDI = 1 << 4, AGS_AUDIO_UNIT_PORT_IS_OUTPUT = 1 << 5, AGS_AUDIO_UNIT_PORT_IS_INPUT = 1 << 6, }AgsAudioUnitPortFlags; struct _AgsAudioUnitPort { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio_unit_client; AgsUUID *uuid; GObject *audio_unit_device; gchar *port_uuid; gchar *port_name; guint pcm_channels; guint samplerate; guint buffer_size; guint format; #ifdef AGS_WITH_AUDIO_UNIT AudioStreamBasicDescription *data_format; AUGraph *graph; AudioComponentDescription *description; AUNode *node; AudioComponent audio_component; AudioUnit *audio_unit; AURenderCallbackStruct *render_callback; #else gpointer data_format; gpointer graph; gpointer description; gpointer node; gpointer audio_component; gpointer audio_unit; gpointer render_callback; #endif unsigned int midi_port_number; volatile gboolean output_running; volatile gboolean input_running; volatile gboolean is_empty; volatile guint queued; }; struct _AgsAudioUnitPortClass { GObjectClass gobject; }; GType ags_audio_unit_port_get_type(); gboolean ags_audio_unit_port_test_flags(AgsAudioUnitPort *audio_unit_port, guint flags); void ags_audio_unit_port_set_flags(AgsAudioUnitPort *audio_unit_port, guint flags); void ags_audio_unit_port_unset_flags(AgsAudioUnitPort *audio_unit_port, guint flags); GList* ags_audio_unit_port_find(GList *audio_unit_port, gchar *port_name); void ags_audio_unit_port_register(AgsAudioUnitPort *audio_unit_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output); void ags_audio_unit_port_unregister(AgsAudioUnitPort *audio_unit_port); void ags_audio_unit_port_set_format(AgsAudioUnitPort *audio_unit_port, guint format); void ags_audio_unit_port_set_samplerate(AgsAudioUnitPort *audio_unit_port, guint samplerate); void ags_audio_unit_port_set_pcm_channels(AgsAudioUnitPort *audio_unit_port, guint pcm_channels); void ags_audio_unit_port_set_buffer_size(AgsAudioUnitPort *audio_unit_port, guint buffer_size); AgsAudioUnitPort* ags_audio_unit_port_new(GObject *audio_unit_client); G_END_DECLS #endif /*__AGS_AUDIO_UNIT_PORT_H__*/ gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_client.c0000644000175000017500000007160713613101164021234 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_audio_unit_client_class_init(AgsAudioUnitClientClass *audio_unit_client); void ags_audio_unit_client_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_unit_client_init(AgsAudioUnitClient *audio_unit_client); void ags_audio_unit_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_unit_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_unit_client_dispose(GObject *gobject); void ags_audio_unit_client_finalize(GObject *gobject); AgsUUID* ags_audio_unit_client_get_uuid(AgsConnectable *connectable); gboolean ags_audio_unit_client_has_resource(AgsConnectable *connectable); gboolean ags_audio_unit_client_is_ready(AgsConnectable *connectable); void ags_audio_unit_client_add_to_registry(AgsConnectable *connectable); void ags_audio_unit_client_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_unit_client_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_unit_client_xml_compose(AgsConnectable *connectable); void ags_audio_unit_client_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_unit_client_is_connected(AgsConnectable *connectable); void ags_audio_unit_client_connect(AgsConnectable *connectable); void ags_audio_unit_client_disconnect(AgsConnectable *connectable); /** * SECTION:ags_audio_unit_client * @short_description: core audio connection * @title: AgsAudioUnitClient * @section_id: * @include: ags/audio/audio-unit/ags_audio_unit_client.h * * The #AgsAudioUnitClient communicates with a core audio instance. */ enum{ PROP_0, PROP_AUDIO_UNIT_SERVER, PROP_CLIENT_NAME, PROP_DEVICE, PROP_PORT, }; static gpointer ags_audio_unit_client_parent_class = NULL; GType ags_audio_unit_client_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_unit_client = 0; static const GTypeInfo ags_audio_unit_client_info = { sizeof(AgsAudioUnitClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_unit_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudioUnitClient), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_unit_client_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_unit_client_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_unit_client = g_type_register_static(G_TYPE_OBJECT, "AgsAudioUnitClient", &ags_audio_unit_client_info, 0); g_type_add_interface_static(ags_type_audio_unit_client, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_unit_client); } return g_define_type_id__volatile; } void ags_audio_unit_client_class_init(AgsAudioUnitClientClass *audio_unit_client) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_unit_client_parent_class = g_type_class_peek_parent(audio_unit_client); /* GObjectClass */ gobject = (GObjectClass *) audio_unit_client; gobject->set_property = ags_audio_unit_client_set_property; gobject->get_property = ags_audio_unit_client_get_property; gobject->dispose = ags_audio_unit_client_dispose; gobject->finalize = ags_audio_unit_client_finalize; /* properties */ /** * AgsAudioUnitClient:audio-unit-server: * * The assigned #AgsAudioUnitServer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-unit-server", i18n_pspec("assigned core audio server"), i18n_pspec("The assigned core audio server"), AGS_TYPE_AUDIO_UNIT_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_SERVER, param_spec); /** * AgsAudioUnitClient:client-name: * * The audio-unit client name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("client-name", i18n_pspec("the client name"), i18n_pspec("The client name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CLIENT_NAME, param_spec); /** * AgsAudioUnitClient:device: (type GList(GObject)) (transfer full) * * The assigned devices. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("device", i18n_pspec("assigned device"), i18n_pspec("The assigned device"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsAudioUnitClient:port: (type GList(AgsAudioUnitPort)) (transfer full) * * The assigned ports. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port", i18n_pspec("assigned port"), i18n_pspec("The assigned port"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); } void ags_audio_unit_client_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_unit_client_get_uuid; connectable->has_resource = ags_audio_unit_client_has_resource; connectable->is_ready = ags_audio_unit_client_is_ready; connectable->add_to_registry = ags_audio_unit_client_add_to_registry; connectable->remove_from_registry = ags_audio_unit_client_remove_from_registry; connectable->list_resource = ags_audio_unit_client_list_resource; connectable->xml_compose = ags_audio_unit_client_xml_compose; connectable->xml_parse = ags_audio_unit_client_xml_parse; connectable->is_connected = ags_audio_unit_client_is_connected; connectable->connect = ags_audio_unit_client_connect; connectable->disconnect = ags_audio_unit_client_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_unit_client_init(AgsAudioUnitClient *audio_unit_client) { /* flags */ audio_unit_client->flags = 0; /* audio unit client mutex */ g_rec_mutex_init(&(audio_unit_client->obj_mutex)); /* server */ audio_unit_client->audio_unit_server = NULL; /* uuid */ audio_unit_client->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_unit_client->uuid); /* client name and uuid */ audio_unit_client->client_uuid = ags_id_generator_create_uuid(); audio_unit_client->client_name = NULL; /* device */ audio_unit_client->device = NULL; audio_unit_client->port = NULL; } void ags_audio_unit_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioUnitClient *audio_unit_client; GRecMutex *audio_unit_client_mutex; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(gobject); /* get audio-unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); switch(prop_id){ case PROP_AUDIO_UNIT_SERVER: { AgsAudioUnitServer *audio_unit_server; audio_unit_server = (AgsAudioUnitServer *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_client_mutex); if(audio_unit_client->audio_unit_server == (GObject *) audio_unit_server){ g_rec_mutex_unlock(audio_unit_client_mutex); return; } if(audio_unit_client->audio_unit_server != NULL){ g_object_unref(audio_unit_client->audio_unit_server); } if(audio_unit_server != NULL){ g_object_ref(audio_unit_server); } audio_unit_client->audio_unit_server = (GObject *) audio_unit_server; g_rec_mutex_unlock(audio_unit_client_mutex); } break; case PROP_CLIENT_NAME: { char *client_name; client_name = (char *) g_value_get_string(value); g_rec_mutex_lock(audio_unit_client_mutex); g_free(audio_unit_client->client_name); audio_unit_client->client_name = g_strdup(client_name); g_rec_mutex_unlock(audio_unit_client_mutex); } break; case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(audio_unit_client_mutex); if(device == NULL || g_list_find(audio_unit_client->device, device) != NULL){ g_rec_mutex_unlock(audio_unit_client_mutex); return; } g_object_ref(device); audio_unit_client->device = g_list_prepend(audio_unit_client->device, device); g_rec_mutex_unlock(audio_unit_client_mutex); } break; case PROP_PORT: { GObject *port; port = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(audio_unit_client_mutex); if(!AGS_IS_AUDIO_UNIT_PORT(port) || g_list_find(audio_unit_client->port, port) != NULL){ g_rec_mutex_unlock(audio_unit_client_mutex); return; } g_object_ref(port); audio_unit_client->port = g_list_prepend(audio_unit_client->port, port); g_rec_mutex_unlock(audio_unit_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioUnitClient *audio_unit_client; GRecMutex *audio_unit_client_mutex; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(gobject); /* get audio-unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); switch(prop_id){ case PROP_AUDIO_UNIT_SERVER: { g_rec_mutex_lock(audio_unit_client_mutex); g_value_set_object(value, audio_unit_client->audio_unit_server); g_rec_mutex_unlock(audio_unit_client_mutex); } break; case PROP_CLIENT_NAME: { g_rec_mutex_lock(audio_unit_client_mutex); g_value_set_string(value, audio_unit_client->client_name); g_rec_mutex_unlock(audio_unit_client_mutex); } break; case PROP_DEVICE: { g_rec_mutex_lock(audio_unit_client_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_unit_client->device, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_unit_client_mutex); } break; case PROP_PORT: { g_rec_mutex_lock(audio_unit_client_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_unit_client->port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_unit_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_client_dispose(GObject *gobject) { AgsAudioUnitClient *audio_unit_client; GList *list; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(gobject); /* core audio server */ if(audio_unit_client->audio_unit_server != NULL){ g_object_unref(audio_unit_client->audio_unit_server); audio_unit_client->audio_unit_server = NULL; } /* device */ if(audio_unit_client->device != NULL){ list = audio_unit_client->device; while(list != NULL){ g_object_set(G_OBJECT(list->data), "audio-unit-client", NULL, NULL); list = list->next; } g_list_free_full(audio_unit_client->device, g_object_unref); audio_unit_client->device = NULL; } /* port */ if(audio_unit_client->port != NULL){ list = audio_unit_client->port; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(audio_unit_client->port, g_object_unref); audio_unit_client->port = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_unit_client_parent_class)->dispose(gobject); } void ags_audio_unit_client_finalize(GObject *gobject) { AgsAudioUnitClient *audio_unit_client; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(gobject); /* core audio server */ if(audio_unit_client->audio_unit_server != NULL){ g_object_unref(audio_unit_client->audio_unit_server); } /* device */ if(audio_unit_client->device != NULL){ g_list_free_full(audio_unit_client->device, g_object_unref); } /* port */ if(audio_unit_client->port != NULL){ g_list_free_full(audio_unit_client->port, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_audio_unit_client_parent_class)->finalize(gobject); } AgsUUID* ags_audio_unit_client_get_uuid(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; AgsUUID *ptr; GRecMutex *audio_unit_client_mutex; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* get UUID */ g_rec_mutex_lock(audio_unit_client_mutex); ptr = audio_unit_client->uuid; g_rec_mutex_unlock(audio_unit_client_mutex); return(ptr); } gboolean ags_audio_unit_client_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_audio_unit_client_is_ready(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; gboolean is_ready; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); /* check is added */ is_ready = ags_audio_unit_client_test_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_unit_client_add_to_registry(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; if(ags_connectable_is_ready(connectable)){ return; } audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); ags_audio_unit_client_set_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ADDED_TO_REGISTRY); } void ags_audio_unit_client_remove_from_registry(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; if(!ags_connectable_is_ready(connectable)){ return; } audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); ags_audio_unit_client_unset_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ADDED_TO_REGISTRY); } xmlNode* ags_audio_unit_client_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_unit_client_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_unit_client_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_unit_client_is_connected(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; gboolean is_connected; audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); /* check is connected */ is_connected = ags_audio_unit_client_test_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_CONNECTED); return(is_connected); } void ags_audio_unit_client_connect(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; GList *list_start, *list; GRecMutex *audio_unit_client_mutex; if(ags_connectable_is_connected(connectable)){ return; } audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); ags_audio_unit_client_set_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_CONNECTED); /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* port */ g_object_get(audio_unit_client, "port", &list_start, NULL); list = list_start; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); } void ags_audio_unit_client_disconnect(AgsConnectable *connectable) { AgsAudioUnitClient *audio_unit_client; GList *list_start, *list; GRecMutex *audio_unit_client_mutex; if(!ags_connectable_is_connected(connectable)){ return; } audio_unit_client = AGS_AUDIO_UNIT_CLIENT(connectable); ags_audio_unit_client_unset_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_CONNECTED); /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* port */ g_object_get(audio_unit_client, "port", &list_start, NULL); list = list_start; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(list_start, g_object_unref); } /** * ags_audio_unit_client_test_flags: * @audio_unit_client: the #AgsAudioUnitClient * @flags: the flags * * Test @flags to be set on @audio_unit_client. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_unit_client_test_flags(AgsAudioUnitClient *audio_unit_client, guint flags) { gboolean retval; GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return(FALSE); } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* test */ g_rec_mutex_lock(audio_unit_client_mutex); retval = (flags & (audio_unit_client->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_client_mutex); return(retval); } /** * ags_audio_unit_client_set_flags: * @audio_unit_client: the #AgsAudioUnitClient * @flags: see #AgsAudioUnitClientFlags-enum * * Enable a feature of @audio_unit_client. * * Since: 3.0.0 */ void ags_audio_unit_client_set_flags(AgsAudioUnitClient *audio_unit_client, guint flags) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_unit_client_mutex); audio_unit_client->flags |= flags; g_rec_mutex_unlock(audio_unit_client_mutex); } /** * ags_audio_unit_client_unset_flags: * @audio_unit_client: the #AgsAudioUnitClient * @flags: see #AgsAudioUnitClientFlags-enum * * Disable a feature of @audio_unit_client. * * Since: 3.0.0 */ void ags_audio_unit_client_unset_flags(AgsAudioUnitClient *audio_unit_client, guint flags) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_unit_client_mutex); audio_unit_client->flags &= (~flags); g_rec_mutex_unlock(audio_unit_client_mutex); } /** * ags_audio_unit_client_find_uuid: * @audio_unit_client: (element-type AgsAudio.AudioUnitClient) (transfer none): the #GList-struct containing #AgsAudioUnitClient * @client_uuid: the client uuid to find * * Finds next match of @client_uuid in @audio_unit_client. * * Returns: (element-type AgsAudio.AudioUnitClient) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_audio_unit_client_find_uuid(GList *audio_unit_client, gchar *client_uuid) { while(audio_unit_client != NULL){ if(!g_ascii_strcasecmp(AGS_AUDIO_UNIT_CLIENT(audio_unit_client->data)->client_uuid, client_uuid)){ return(audio_unit_client); } } return(NULL); } /** * ags_audio_unit_client_find: * @audio_unit_client: (element-type AgsAudio.AudioUnitClient) (transfer none): the #GList-struct containing #AgsAudioUnitClient * @client_name: the client name to find * * Finds next match of @client_name in @audio_unit_client. * * Returns: (element-type AgsAudio.AudioUnitClient) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_audio_unit_client_find(GList *audio_unit_client, gchar *client_name) { AgsAudioUnitClient *current_audio_unit_client; gboolean success; GRecMutex *audio_unit_client_mutex; while(audio_unit_client != NULL){ current_audio_unit_client = AGS_AUDIO_UNIT_CLIENT(audio_unit_client->data); /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(current_audio_unit_client); /* check uuid */ g_rec_mutex_lock(audio_unit_client_mutex); success = (!g_ascii_strcasecmp(current_audio_unit_client->client_name, client_name)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_client_mutex); if(success){ return(audio_unit_client); } audio_unit_client = audio_unit_client->next; } return(NULL); } /** * ags_audio_unit_client_open: * @audio_unit_client: the #AgsAudioUnitClient * @client_name: the client's name * * Open the core audio client's connection and read uuid. * * Since: 3.0.0 */ void ags_audio_unit_client_open(AgsAudioUnitClient *audio_unit_client, gchar *client_name) { AgsAudioUnitServer *audio_unit_server; #ifdef AGS_WITH_AUDIO_UNIT OSStatus retval; #endif gboolean ready; GRecMutex *audio_unit_server_mutex; GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client) || client_name == NULL){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* check already open */ g_rec_mutex_lock(audio_unit_client_mutex); if(ags_audio_unit_client_test_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ACTIVATED)){ g_rec_mutex_unlock(audio_unit_client_mutex); g_message("Advanced Gtk+ Sequencer audio-unit client already open"); return; } audio_unit_server = audio_unit_client->audio_unit_server; g_rec_mutex_unlock(audio_unit_client_mutex); g_message("Advanced Gtk+ Sequencer open audio-unit client"); g_object_set(audio_unit_client, "client-name", client_name, NULL); /* get audio_unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); } /** * ags_audio_unit_client_activate: * @audio_unit_client: the #AgsAudioUnitClient * * Activate client. * * Since: 3.0.0 */ void ags_audio_unit_client_activate(AgsAudioUnitClient *audio_unit_client) { GList *port_start, *port; int ret; GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); if(ags_audio_unit_client_test_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ACTIVATED)){ return; } g_rec_mutex_lock(audio_unit_client_mutex); port = port_start = g_list_copy(audio_unit_client->port); g_rec_mutex_unlock(audio_unit_client_mutex); while(port != NULL){ gchar *port_name; g_object_get(port->data, "port-name", &port_name, NULL); ags_audio_unit_port_register(port->data, port_name, (ags_audio_unit_port_test_flags(port->data, AGS_AUDIO_UNIT_PORT_IS_AUDIO) ? TRUE: FALSE), (ags_audio_unit_port_test_flags(port->data, AGS_AUDIO_UNIT_PORT_IS_MIDI) ? TRUE: FALSE), (ags_audio_unit_port_test_flags(port->data, AGS_AUDIO_UNIT_PORT_IS_OUTPUT) ? TRUE: FALSE)); g_free(port_name); port = port->next; } ags_audio_unit_client_set_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ACTIVATED); g_list_free(port_start); } /** * ags_audio_unit_client_deactivate: * @audio_unit_client: the #AgsAudioUnitClient * * Deactivate client. * * Since: 3.0.0 */ void ags_audio_unit_client_deactivate(AgsAudioUnitClient *audio_unit_client) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); ags_audio_unit_client_unset_flags(audio_unit_client, AGS_AUDIO_UNIT_CLIENT_ACTIVATED); } /** * ags_audio_unit_client_add_device: * @audio_unit_client: the #AgsAudioUnitClient * @audio_unit_device: an #AgsAudioUnitDevout or #AgsAudioUnitDevin * * Add @audio_unit_device to @audio_unit_client. * * Since: 3.0.0 */ void ags_audio_unit_client_add_device(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_device) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client) || (!AGS_IS_AUDIO_UNIT_DEVOUT(audio_unit_device) && !AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_device))){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* add device */ g_rec_mutex_lock(audio_unit_client_mutex); if(g_list_find(audio_unit_client->device, audio_unit_device) == NULL){ g_object_ref(audio_unit_device); audio_unit_client->device = g_list_prepend(audio_unit_client->device, audio_unit_device); } g_rec_mutex_unlock(audio_unit_client_mutex); } /** * ags_audio_unit_client_remove_device: * @audio_unit_client: the #AgsAudioUnitClient * @audio_unit_device: an #AgsAudioUnitDevout or #AgsAudioUnitDevin * * Remove @audio_unit_device from @audio_unit_client. * * Since: 3.0.0 */ void ags_audio_unit_client_remove_device(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_device) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* remove */ g_rec_mutex_lock(audio_unit_client_mutex); if(g_list_find(audio_unit_client->device, audio_unit_device) != NULL){ audio_unit_client->device = g_list_remove(audio_unit_client->device, audio_unit_device); g_object_unref(audio_unit_device); } g_rec_mutex_unlock(audio_unit_client_mutex); } /** * ags_audio_unit_client_add_port: * @audio_unit_client: the #AgsAudioUnitClient * @audio_unit_port: an #AgsAudioUnitPort * * Add @audio_unit_port to @audio_unit_client. * * Since: 3.0.0 */ void ags_audio_unit_client_add_port(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_port) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client) || !AGS_IS_AUDIO_UNIT_PORT(audio_unit_port)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* add port */ g_rec_mutex_lock(audio_unit_client_mutex); if(g_list_find(audio_unit_client->port, audio_unit_port) == NULL){ g_object_ref(audio_unit_port); audio_unit_client->port = g_list_prepend(audio_unit_client->port, audio_unit_port); } g_rec_mutex_unlock(audio_unit_client_mutex); } /** * ags_audio_unit_client_remove_port: * @audio_unit_client: the #AgsAudioUnitClient * @audio_unit_port: an #AgsAudioUnitPort * * Remove @audio_unit_port from @audio_unit_client. * * Since: 3.0.0 */ void ags_audio_unit_client_remove_port(AgsAudioUnitClient *audio_unit_client, GObject *audio_unit_port) { GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio_unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* remove port */ g_rec_mutex_lock(audio_unit_client_mutex); if(g_list_find(audio_unit_client->port, audio_unit_port) != NULL){ audio_unit_client->port = g_list_remove(audio_unit_client->port, audio_unit_port); g_object_unref(audio_unit_port); } g_rec_mutex_unlock(audio_unit_client_mutex); } /** * ags_audio_unit_client_new: * @audio_unit_server: the assigned #AgsAudioUnitServer * * Create a new instance of #AgsAudioUnitClient. * * Returns: the new #AgsAudioUnitClient * * Since: 3.0.0 */ AgsAudioUnitClient* ags_audio_unit_client_new(GObject *audio_unit_server) { AgsAudioUnitClient *audio_unit_client; audio_unit_client = (AgsAudioUnitClient *) g_object_new(AGS_TYPE_AUDIO_UNIT_CLIENT, "audio-unit-server", audio_unit_server, NULL); return(audio_unit_client); } gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_devin.c0000644000175000017500000023260613607210263021065 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_audio_unit_devin_class_init(AgsAudioUnitDevinClass *audio_unit_devin); void ags_audio_unit_devin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_unit_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_audio_unit_devin_init(AgsAudioUnitDevin *audio_unit_devin); void ags_audio_unit_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_unit_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_unit_devin_dispose(GObject *gobject); void ags_audio_unit_devin_finalize(GObject *gobject); AgsUUID* ags_audio_unit_devin_get_uuid(AgsConnectable *connectable); gboolean ags_audio_unit_devin_has_resource(AgsConnectable *connectable); gboolean ags_audio_unit_devin_is_ready(AgsConnectable *connectable); void ags_audio_unit_devin_add_to_registry(AgsConnectable *connectable); void ags_audio_unit_devin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_unit_devin_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_unit_devin_xml_compose(AgsConnectable *connectable); void ags_audio_unit_devin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_unit_devin_is_connected(AgsConnectable *connectable); void ags_audio_unit_devin_connect(AgsConnectable *connectable); void ags_audio_unit_devin_disconnect(AgsConnectable *connectable); void ags_audio_unit_devin_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_audio_unit_devin_get_device(AgsSoundcard *soundcard); void ags_audio_unit_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_audio_unit_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_audio_unit_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_audio_unit_devin_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_audio_unit_devin_get_capability(AgsSoundcard *soundcard); gboolean ags_audio_unit_devin_is_starting(AgsSoundcard *soundcard); gboolean ags_audio_unit_devin_is_recording(AgsSoundcard *soundcard); gchar* ags_audio_unit_devin_get_uptime(AgsSoundcard *soundcard); void ags_audio_unit_devin_port_init(AgsSoundcard *soundcard, GError **error); void ags_audio_unit_devin_port_record(AgsSoundcard *soundcard, GError **error); void ags_audio_unit_devin_port_free(AgsSoundcard *soundcard); void ags_audio_unit_devin_tic(AgsSoundcard *soundcard); void ags_audio_unit_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_audio_unit_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_audio_unit_devin_get_bpm(AgsSoundcard *soundcard); void ags_audio_unit_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_audio_unit_devin_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_audio_unit_devin_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_audio_unit_devin_get_delay(AgsSoundcard *soundcard); guint ags_audio_unit_devin_get_attack(AgsSoundcard *soundcard); void* ags_audio_unit_devin_get_buffer(AgsSoundcard *soundcard); void* ags_audio_unit_devin_get_next_buffer(AgsSoundcard *soundcard); void* ags_audio_unit_devin_get_prev_buffer(AgsSoundcard *soundcard); void ags_audio_unit_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_audio_unit_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_audio_unit_devin_get_delay_counter(AgsSoundcard *soundcard); void ags_audio_unit_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_audio_unit_devin_get_start_note_offset(AgsSoundcard *soundcard); void ags_audio_unit_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_audio_unit_devin_get_note_offset(AgsSoundcard *soundcard); void ags_audio_unit_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_audio_unit_devin_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_audio_unit_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_audio_unit_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_audio_unit_devin_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_audio_unit_devin * @short_description: Output to soundcard * @title: AgsAudioUnitDevin * @section_id: * @include: ags/audio/audio-unit/ags_audio_unit_devin.h * * #AgsAudioUnitDevin represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_AUDIO_UNIT_CLIENT, PROP_AUDIO_UNIT_PORT, PROP_CHANNEL, }; static gpointer ags_audio_unit_devin_parent_class = NULL; GType ags_audio_unit_devin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_unit_devin = 0; static const GTypeInfo ags_audio_unit_devin_info = { sizeof(AgsAudioUnitDevinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_unit_devin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudioUnitDevin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_unit_devin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_unit_devin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_audio_unit_devin_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_unit_devin = g_type_register_static(G_TYPE_OBJECT, "AgsAudioUnitDevin", &ags_audio_unit_devin_info, 0); g_type_add_interface_static(ags_type_audio_unit_devin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_audio_unit_devin, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_unit_devin); } return g_define_type_id__volatile; } void ags_audio_unit_devin_class_init(AgsAudioUnitDevinClass *audio_unit_devin) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_unit_devin_parent_class = g_type_class_peek_parent(audio_unit_devin); /* GObjectClass */ gobject = (GObjectClass *) audio_unit_devin; gobject->set_property = ags_audio_unit_devin_set_property; gobject->get_property = ags_audio_unit_devin_get_property; gobject->dispose = ags_audio_unit_devin_dispose; gobject->finalize = ags_audio_unit_devin_finalize; /* properties */ /** * AgsAudioUnitDevin:device: * * The audio unit soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-audio-unit-devin-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsAudioUnitDevin:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsAudioUnitDevin:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsAudioUnitDevin:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsAudioUnitDevin:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsAudioUnitDevin:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsAudioUnitDevin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsAudioUnitDevin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsAudioUnitDevin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsAudioUnitDevin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsAudioUnitDevin:audio-unit-client: * * The assigned #AgsAudioUnitClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio-unit-client", i18n_pspec("audio unit client object"), i18n_pspec("The audio unit client object"), AGS_TYPE_AUDIO_UNIT_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_CLIENT, param_spec); /** * AgsAudioUnitDevin:audio-unit-port: * * The assigned #AgsAudioUnitPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("audio-unit-port", i18n_pspec("audio unit port object"), i18n_pspec("The audio unit port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_PORT, param_spec); } GQuark ags_audio_unit_devin_error_quark() { return(g_quark_from_static_string("ags-audio_unit_devin-error-quark")); } void ags_audio_unit_devin_connectable_interface_init(AgsConnectableInterface *connectable) { //TODO:JK: implement me } void ags_audio_unit_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_audio_unit_devin_set_device; soundcard->get_device = ags_audio_unit_devin_get_device; soundcard->set_presets = ags_audio_unit_devin_set_presets; soundcard->get_presets = ags_audio_unit_devin_get_presets; soundcard->list_cards = ags_audio_unit_devin_list_cards; soundcard->pcm_info = ags_audio_unit_devin_pcm_info; soundcard->get_capability = ags_audio_unit_devin_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_audio_unit_devin_is_starting; soundcard->is_playing = NULL; soundcard->is_recording = ags_audio_unit_devin_is_recording; soundcard->get_uptime = ags_audio_unit_devin_get_uptime; soundcard->play_init = NULL; soundcard->play = NULL; soundcard->record_init = ags_audio_unit_devin_port_init; soundcard->record = ags_audio_unit_devin_port_record; soundcard->stop = ags_audio_unit_devin_port_free; soundcard->tic = ags_audio_unit_devin_tic; soundcard->offset_changed = ags_audio_unit_devin_offset_changed; soundcard->set_bpm = ags_audio_unit_devin_set_bpm; soundcard->get_bpm = ags_audio_unit_devin_get_bpm; soundcard->set_delay_factor = ags_audio_unit_devin_set_delay_factor; soundcard->get_delay_factor = ags_audio_unit_devin_get_delay_factor; soundcard->get_absolute_delay = ags_audio_unit_devin_get_absolute_delay; soundcard->get_delay = ags_audio_unit_devin_get_delay; soundcard->get_attack = ags_audio_unit_devin_get_attack; soundcard->get_buffer = ags_audio_unit_devin_get_buffer; soundcard->get_next_buffer = ags_audio_unit_devin_get_next_buffer; soundcard->get_prev_buffer = ags_audio_unit_devin_get_prev_buffer; soundcard->lock_buffer = ags_audio_unit_devin_lock_buffer; soundcard->unlock_buffer = ags_audio_unit_devin_unlock_buffer; soundcard->get_delay_counter = ags_audio_unit_devin_get_delay_counter; soundcard->set_start_note_offset = ags_audio_unit_devin_set_start_note_offset; soundcard->get_start_note_offset = ags_audio_unit_devin_get_start_note_offset; soundcard->set_note_offset = ags_audio_unit_devin_set_note_offset; soundcard->get_note_offset = ags_audio_unit_devin_get_note_offset; soundcard->set_note_offset_absolute = ags_audio_unit_devin_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_audio_unit_devin_get_note_offset_absolute; soundcard->set_loop = ags_audio_unit_devin_set_loop; soundcard->get_loop = ags_audio_unit_devin_get_loop; soundcard->get_loop_offset = ags_audio_unit_devin_get_loop_offset; } void ags_audio_unit_devin_init(AgsAudioUnitDevin *audio_unit_devin) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ audio_unit_devin->flags = 0; g_atomic_int_set(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_PASS_THROUGH); /* devin mutex */ g_rec_mutex_init(&(audio_unit_devin->obj_mutex)); /* uuid */ audio_unit_devin->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_unit_devin->uuid); /* presets */ config = ags_config_get_instance(); audio_unit_devin->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); audio_unit_devin->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); audio_unit_devin->samplerate = ags_soundcard_helper_config_get_samplerate(config); audio_unit_devin->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); audio_unit_devin->format = ags_soundcard_helper_config_get_format(config); /* */ audio_unit_devin->card_uri = NULL; audio_unit_devin->audio_unit_client = NULL; audio_unit_devin->port_name = NULL; audio_unit_devin->audio_unit_port = NULL; /* buffer */ audio_unit_devin->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ audio_unit_devin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(audio_unit_devin->buffer_mutex[i]); } audio_unit_devin->buffer = (void **) malloc(8 * sizeof(void*)); audio_unit_devin->buffer[0] = NULL; audio_unit_devin->buffer[1] = NULL; audio_unit_devin->buffer[2] = NULL; audio_unit_devin->buffer[3] = NULL; audio_unit_devin->buffer[4] = NULL; audio_unit_devin->buffer[5] = NULL; audio_unit_devin->buffer[6] = NULL; audio_unit_devin->buffer[7] = NULL; ags_audio_unit_devin_realloc_buffer(audio_unit_devin); /* bpm */ audio_unit_devin->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ audio_unit_devin->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); audio_unit_devin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ audio_unit_devin->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); audio_unit_devin->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); /* counters */ audio_unit_devin->tact_counter = 0.0; audio_unit_devin->delay_counter = 0.0; audio_unit_devin->tic_counter = 0; audio_unit_devin->start_note_offset = 0; audio_unit_devin->note_offset = 0; audio_unit_devin->note_offset_absolute = 0; audio_unit_devin->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; audio_unit_devin->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; audio_unit_devin->do_loop = FALSE; audio_unit_devin->loop_offset = 0; /* callback mutex */ g_mutex_init(&(audio_unit_devin->callback_mutex)); g_cond_init(&(audio_unit_devin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(audio_unit_devin->callback_finish_mutex)); g_cond_init(&(audio_unit_devin->callback_finish_cond)); } void ags_audio_unit_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(gobject); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->card_uri = g_strdup(device); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(dsp_channels == audio_unit_devin->dsp_channels){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } audio_unit_devin->dsp_channels = dsp_channels; g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(pcm_channels == audio_unit_devin->pcm_channels){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } audio_unit_devin->pcm_channels = pcm_channels; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_realloc_buffer(audio_unit_devin); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(format == audio_unit_devin->format){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } audio_unit_devin->format = format; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_realloc_buffer(audio_unit_devin); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(buffer_size == audio_unit_devin->buffer_size){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } audio_unit_devin->buffer_size = buffer_size; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_realloc_buffer(audio_unit_devin); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(samplerate == audio_unit_devin->samplerate){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } audio_unit_devin->samplerate = samplerate; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_realloc_buffer(audio_unit_devin); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->bpm = bpm; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->delay_factor = delay_factor; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); } break; case PROP_AUDIO_UNIT_CLIENT: { AgsAudioUnitClient *audio_unit_client; audio_unit_client = (AgsAudioUnitClient *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(audio_unit_devin->audio_unit_client == (GObject *) audio_unit_client){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } if(audio_unit_devin->audio_unit_client != NULL){ g_object_unref(G_OBJECT(audio_unit_devin->audio_unit_client)); } if(audio_unit_client != NULL){ g_object_ref(audio_unit_client); } audio_unit_devin->audio_unit_client = (GObject *) audio_unit_client; g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_AUDIO_UNIT_PORT: { AgsAudioUnitPort *audio_unit_port; audio_unit_port = (AgsAudioUnitPort *) g_value_get_pointer(value); g_rec_mutex_lock(audio_unit_devin_mutex); if(!AGS_IS_AUDIO_UNIT_PORT(audio_unit_port) || g_list_find(audio_unit_devin->audio_unit_port, audio_unit_port) != NULL){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } g_object_ref(audio_unit_port); audio_unit_devin->audio_unit_port = g_list_append(audio_unit_devin->audio_unit_port, audio_unit_port); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(gobject); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_string(value, audio_unit_devin->card_uri); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_uint(value, audio_unit_devin->dsp_channels); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_uint(value, audio_unit_devin->pcm_channels); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_uint(value, audio_unit_devin->format); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_uint(value, audio_unit_devin->buffer_size); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_uint(value, audio_unit_devin->samplerate); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_pointer(value, audio_unit_devin->buffer); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_double(value, audio_unit_devin->bpm); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_double(value, audio_unit_devin->delay_factor); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_pointer(value, audio_unit_devin->attack); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_AUDIO_UNIT_CLIENT: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_object(value, audio_unit_devin->audio_unit_client); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; case PROP_AUDIO_UNIT_PORT: { g_rec_mutex_lock(audio_unit_devin_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_unit_devin->audio_unit_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_unit_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_devin_dispose(GObject *gobject) { AgsAudioUnitDevin *audio_unit_devin; GList *list; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(gobject); //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_audio_unit_devin_parent_class)->dispose(gobject); } void ags_audio_unit_devin_finalize(GObject *gobject) { AgsAudioUnitDevin *audio_unit_devin; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(gobject); //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_audio_unit_devin_parent_class)->finalize(gobject); } /** * ags_audio_unit_devin_test_flags: * @audio_unit_devin: the #AgsAudioUnitDevin * @flags: the flags * * Test @flags to be set on @audio_unit_devin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_unit_devin_test_flags(AgsAudioUnitDevin *audio_unit_devin, guint flags) { gboolean retval; GRecMutex *audio_unit_devin_mutex; if(!AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_devin)){ return(FALSE); } /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* test */ g_rec_mutex_lock(audio_unit_devin_mutex); retval = (flags & (audio_unit_devin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_devin_mutex); return(retval); } /** * ags_audio_unit_devin_set_flags: * @audio_unit_devin: the #AgsAudioUnitDevin * @flags: see #AgsAudioUnitDevinFlags-enum * * Enable a feature of @audio_unit_devin. * * Since: 3.0.0 */ void ags_audio_unit_devin_set_flags(AgsAudioUnitDevin *audio_unit_devin, guint flags) { GRecMutex *audio_unit_devin_mutex; if(!AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_devin)){ return; } /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->flags |= flags; g_rec_mutex_unlock(audio_unit_devin_mutex); } /** * ags_audio_unit_devin_unset_flags: * @audio_unit_devin: the #AgsAudioUnitDevin * @flags: see #AgsAudioUnitDevinFlags-enum * * Disable a feature of @audio_unit_devin. * * Since: 3.0.0 */ void ags_audio_unit_devin_unset_flags(AgsAudioUnitDevin *audio_unit_devin, guint flags) { GRecMutex *audio_unit_devin_mutex; if(!AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_devin)){ return; } /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->flags &= (~flags); g_rec_mutex_unlock(audio_unit_devin_mutex); } void ags_audio_unit_devin_set_device(AgsSoundcard *soundcard, gchar *device) { AgsAudioUnitDevin *audio_unit_devin; GList *audio_unit_port, *audio_unit_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* check device */ g_rec_mutex_lock(audio_unit_devin_mutex); if(audio_unit_devin->card_uri == device || !g_ascii_strcasecmp(audio_unit_devin->card_uri, device)){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } if(!g_str_has_prefix(device, "ags-audio-unit-devin-")){ g_rec_mutex_unlock(audio_unit_devin_mutex); g_warning("invalid AudioUnit device prefix"); return; } ret = sscanf(device, "ags-audio-unit-devin-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(audio_unit_devin_mutex); g_warning("invalid AudioUnit device specifier"); return; } g_free(audio_unit_devin->card_uri); audio_unit_devin->card_uri = g_strdup(device); /* apply name to port */ pcm_channels = audio_unit_devin->pcm_channels; audio_unit_port_start = audio_unit_port = g_list_copy(audio_unit_devin->audio_unit_port); g_rec_mutex_unlock(audio_unit_devin_mutex); for(i = 0; i < pcm_channels && audio_unit_port != NULL; i++){ str = g_strdup_printf("ags-soundcard%d-%04d", nth_card, i); g_object_set(audio_unit_port->data, "port-name", str, NULL); g_free(str); audio_unit_port = audio_unit_port->next; } g_list_free(audio_unit_port_start); } gchar* ags_audio_unit_devin_get_device(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gchar *device; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); device = NULL; /* get device */ g_rec_mutex_lock(audio_unit_devin_mutex); device = g_strdup(audio_unit_devin->card_uri); g_rec_mutex_unlock(audio_unit_devin_mutex); return(device); } void ags_audio_unit_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsAudioUnitDevin *audio_unit_devin; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); g_object_set(audio_unit_devin, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_audio_unit_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get presets */ g_rec_mutex_lock(audio_unit_devin_mutex); if(channels != NULL){ *channels = audio_unit_devin->pcm_channels; } if(rate != NULL){ *rate = audio_unit_devin->samplerate; } if(buffer_size != NULL){ *buffer_size = audio_unit_devin->buffer_size; } if(format != NULL){ *format = audio_unit_devin->format; } g_rec_mutex_unlock(audio_unit_devin_mutex); } /** * ags_audio_unit_devin_list_cards: * @soundcard: the #AgsSoundcard * @card_id: AUDIO_UNIT identifier * @card_name: card name * * List available soundcards. * * Since: 3.0.0 */ void ags_audio_unit_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsAudioUnitClient *audio_unit_client; AgsAudioUnitDevin *audio_unit_devin; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_AUDIO_UNIT_DEVIN(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_AUDIO_UNIT_DEVIN(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_audio_unit_devin_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "audio_unit-client", &audio_unit_client, NULL); if(audio_unit_client != NULL){ /* get client name */ g_object_get(audio_unit_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(audio_unit_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_audio_unit_devin_list_cards() - AUDIO_UNIT client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_audio_unit_devin_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_audio_unit_devin_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_CAPTURE); } gboolean ags_audio_unit_devin_is_starting(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gboolean is_starting; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* check is starting */ g_rec_mutex_lock(audio_unit_devin_mutex); is_starting = ((AGS_AUDIO_UNIT_DEVIN_START_RECORD & (audio_unit_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_devin_mutex); return(is_starting); } gboolean ags_audio_unit_devin_is_recording(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gboolean is_playing; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* check is starting */ g_rec_mutex_lock(audio_unit_devin_mutex); is_playing = ((AGS_AUDIO_UNIT_DEVIN_RECORD & (audio_unit_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_devin_mutex); return(is_playing); } gchar* ags_audio_unit_devin_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_audio_unit_devin_port_init(AgsSoundcard *soundcard, GError **error) { AgsAudioUnitDevin *audio_unit_devin; guint format, word_size; GRecMutex *audio_unit_devin_mutex; if(ags_soundcard_is_recording(soundcard)){ return; } audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio-unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* retrieve word size */ g_rec_mutex_lock(audio_unit_devin_mutex); switch(audio_unit_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(audio_unit_devin_mutex); g_warning("ags_audio_unit_devin_port_init(): unsupported word size"); return; } /* prepare for playback */ audio_unit_devin->flags |= (AGS_AUDIO_UNIT_DEVIN_BUFFER7 | AGS_AUDIO_UNIT_DEVIN_START_RECORD | AGS_AUDIO_UNIT_DEVIN_RECORD | AGS_AUDIO_UNIT_DEVIN_NONBLOCKING); memset(audio_unit_devin->buffer[0], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[1], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[2], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[3], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[4], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[5], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[6], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[7], 0, audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); /* */ audio_unit_devin->tact_counter = 0.0; audio_unit_devin->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(audio_unit_devin))); audio_unit_devin->tic_counter = 0; audio_unit_devin->flags |= (AGS_AUDIO_UNIT_DEVIN_INITIALIZED | AGS_AUDIO_UNIT_DEVIN_START_RECORD | AGS_AUDIO_UNIT_DEVIN_RECORD); g_atomic_int_or(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_INITIAL_CALLBACK); g_rec_mutex_unlock(audio_unit_devin_mutex); } void ags_audio_unit_devin_port_record(AgsSoundcard *soundcard, GError **error) { AgsAudioUnitClient *audio_unit_client; AgsAudioUnitDevin *audio_unit_devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean audio_unit_client_activated; GRecMutex *audio_unit_devin_mutex; GRecMutex *audio_unit_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get audio-unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* client */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_client = (AgsAudioUnitClient *) audio_unit_devin->audio_unit_client; callback_mutex = &(audio_unit_devin->callback_mutex); callback_finish_mutex = &(audio_unit_devin->callback_finish_mutex); /* do playback */ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_START_RECORD); switch(audio_unit_devin->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(audio_unit_devin_mutex); g_warning("ags_audio_unit_devin_port_record(): unsupported word size"); return; } g_rec_mutex_unlock(audio_unit_devin_mutex); /* get client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); /* get activated */ g_rec_mutex_lock(audio_unit_client_mutex); audio_unit_client_activated = ((AGS_AUDIO_UNIT_CLIENT_ACTIVATED & (audio_unit_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_client_mutex); if(audio_unit_client_activated){ while((AGS_AUDIO_UNIT_DEVIN_PASS_THROUGH & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) != 0){ usleep(4); } /* signal */ if((AGS_AUDIO_UNIT_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_CALLBACK_DONE); if((AGS_AUDIO_UNIT_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) != 0){ g_cond_signal(&(audio_unit_devin->callback_cond)); } g_mutex_unlock(callback_mutex); // } /* wait callback */ g_mutex_lock(callback_finish_mutex); if((AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) == 0){ g_atomic_int_or(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_WAIT); while((AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) == 0 && (AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) != 0){ g_cond_wait(&(audio_unit_devin->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(audio_unit_devin->sync_flags), (~(AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_WAIT | AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(audio_unit_devin->sync_flags), (~AGS_AUDIO_UNIT_DEVIN_INITIAL_CALLBACK)); } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) audio_unit_devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) audio_unit_devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) audio_unit_devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_audio_unit_devin_port_free(AgsSoundcard *soundcard) { AgsAudioUnitPort *audio_unit_port; AgsAudioUnitDevin *audio_unit_devin; guint word_size; GRecMutex *audio_unit_devin_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio-unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* */ g_rec_mutex_lock(audio_unit_devin_mutex); if((AGS_AUDIO_UNIT_DEVIN_INITIALIZED & (audio_unit_devin->flags)) == 0){ g_rec_mutex_unlock(audio_unit_devin_mutex); return; } callback_mutex = &(audio_unit_devin->callback_mutex); callback_finish_mutex = &(audio_unit_devin->callback_finish_mutex); // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); audio_unit_devin->flags &= (~(AGS_AUDIO_UNIT_DEVIN_BUFFER0 | AGS_AUDIO_UNIT_DEVIN_BUFFER1 | AGS_AUDIO_UNIT_DEVIN_BUFFER2 | AGS_AUDIO_UNIT_DEVIN_BUFFER3 | AGS_AUDIO_UNIT_DEVIN_BUFFER4 | AGS_AUDIO_UNIT_DEVIN_BUFFER5 | AGS_AUDIO_UNIT_DEVIN_BUFFER6 | AGS_AUDIO_UNIT_DEVIN_BUFFER7 | AGS_AUDIO_UNIT_DEVIN_RECORD)); g_atomic_int_or(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_PASS_THROUGH); g_atomic_int_and(&(audio_unit_devin->sync_flags), (~AGS_AUDIO_UNIT_DEVIN_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_CALLBACK_DONE); if((AGS_AUDIO_UNIT_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) != 0){ g_cond_signal(&(audio_unit_devin->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(audio_unit_devin->sync_flags), AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_DONE); if((AGS_AUDIO_UNIT_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(audio_unit_devin->sync_flags)))) != 0){ g_cond_signal(&(audio_unit_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ audio_unit_devin->note_offset = audio_unit_devin->start_note_offset; audio_unit_devin->note_offset_absolute = audio_unit_devin->start_note_offset; switch(audio_unit_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_audio_unit_devin_free(): unsupported word size"); } g_rec_mutex_unlock(audio_unit_devin_mutex); if(audio_unit_devin->audio_unit_port != NULL){ audio_unit_port = audio_unit_devin->audio_unit_port->data; while(!g_atomic_int_get(&(audio_unit_port->is_empty))) usleep(500000); } g_rec_mutex_lock(audio_unit_devin_mutex); memset(audio_unit_devin->buffer[0], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[1], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[2], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[3], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[4], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[5], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[6], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); memset(audio_unit_devin->buffer[7], 0, (size_t) audio_unit_devin->pcm_channels * audio_unit_devin->buffer_size * word_size); g_rec_mutex_unlock(audio_unit_devin_mutex); } void ags_audio_unit_devin_tic(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* determine if attack should be switched */ g_rec_mutex_lock(audio_unit_devin_mutex); delay = audio_unit_devin->delay[audio_unit_devin->tic_counter]; delay_counter = audio_unit_devin->delay_counter; note_offset = audio_unit_devin->note_offset; note_offset_absolute = audio_unit_devin->note_offset_absolute; loop_left = audio_unit_devin->loop_left; loop_right = audio_unit_devin->loop_right; do_loop = audio_unit_devin->do_loop; g_rec_mutex_unlock(audio_unit_devin_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->delay_counter = delay_counter + 1.0 - delay; audio_unit_devin->tact_counter += 1.0; g_rec_mutex_unlock(audio_unit_devin_mutex); }else{ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->delay_counter += 1.0; g_rec_mutex_unlock(audio_unit_devin_mutex); } } void ags_audio_unit_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* offset changed */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->tic_counter += 1; if(audio_unit_devin->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ audio_unit_devin->tic_counter = 0; } g_rec_mutex_unlock(audio_unit_devin_mutex); } void ags_audio_unit_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set bpm */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->bpm = bpm; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); } gdouble ags_audio_unit_devin_get_bpm(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gdouble bpm; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get bpm */ g_rec_mutex_lock(audio_unit_devin_mutex); bpm = audio_unit_devin->bpm; g_rec_mutex_unlock(audio_unit_devin_mutex); return(bpm); } void ags_audio_unit_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set delay factor */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->delay_factor = delay_factor; g_rec_mutex_unlock(audio_unit_devin_mutex); ags_audio_unit_devin_adjust_delay_and_attack(audio_unit_devin); } gdouble ags_audio_unit_devin_get_delay_factor(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gdouble delay_factor; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get delay factor */ g_rec_mutex_lock(audio_unit_devin_mutex); delay_factor = audio_unit_devin->delay_factor; g_rec_mutex_unlock(audio_unit_devin_mutex); return(delay_factor); } gdouble ags_audio_unit_devin_get_delay(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint delay_index; gdouble delay; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get delay */ g_rec_mutex_lock(audio_unit_devin_mutex); delay_index = audio_unit_devin->tic_counter; delay = audio_unit_devin->delay[delay_index]; g_rec_mutex_unlock(audio_unit_devin_mutex); return(delay); } gdouble ags_audio_unit_devin_get_absolute_delay(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; gdouble absolute_delay; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get absolute delay */ g_rec_mutex_lock(audio_unit_devin_mutex); absolute_delay = (60.0 * (((gdouble) audio_unit_devin->samplerate / (gdouble) audio_unit_devin->buffer_size) / (gdouble) audio_unit_devin->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) audio_unit_devin->delay_factor))); g_rec_mutex_unlock(audio_unit_devin_mutex); return(absolute_delay); } guint ags_audio_unit_devin_get_attack(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint attack_index; guint attack; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get attack */ g_rec_mutex_lock(audio_unit_devin_mutex); attack_index = audio_unit_devin->tic_counter; attack = audio_unit_devin->attack[attack_index]; g_rec_mutex_unlock(audio_unit_devin_mutex); return(attack); } void* ags_audio_unit_devin_get_buffer(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; void *buffer; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER0)){ buffer = audio_unit_devin->buffer[0]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER1)){ buffer = audio_unit_devin->buffer[1]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER2)){ buffer = audio_unit_devin->buffer[2]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER3)){ buffer = audio_unit_devin->buffer[3]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER4)){ buffer = audio_unit_devin->buffer[4]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER5)){ buffer = audio_unit_devin->buffer[5]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER6)){ buffer = audio_unit_devin->buffer[6]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER7)){ buffer = audio_unit_devin->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_audio_unit_devin_get_next_buffer(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; void *buffer; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); // g_message("next - 0x%0x", ((AGS_AUDIO_UNIT_DEVIN_BUFFER0 | // AGS_AUDIO_UNIT_DEVIN_BUFFER1 | // AGS_AUDIO_UNIT_DEVIN_BUFFER2 | // AGS_AUDIO_UNIT_DEVIN_BUFFER3) & (audio_unit_devin->flags))); if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER0)){ buffer = audio_unit_devin->buffer[1]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER1)){ buffer = audio_unit_devin->buffer[2]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER2)){ buffer = audio_unit_devin->buffer[3]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER3)){ buffer = audio_unit_devin->buffer[4]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER4)){ buffer = audio_unit_devin->buffer[5]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER5)){ buffer = audio_unit_devin->buffer[6]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER6)){ buffer = audio_unit_devin->buffer[7]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER7)){ buffer = audio_unit_devin->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_audio_unit_devin_get_prev_buffer(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; void *buffer; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER0)){ buffer = audio_unit_devin->buffer[7]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER1)){ buffer = audio_unit_devin->buffer[0]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER2)){ buffer = audio_unit_devin->buffer[1]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER3)){ buffer = audio_unit_devin->buffer[2]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER4)){ buffer = audio_unit_devin->buffer[3]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER5)){ buffer = audio_unit_devin->buffer[4]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER6)){ buffer = audio_unit_devin->buffer[5]; }else if(ags_audio_unit_devin_test_flags(audio_unit_devin, AGS_AUDIO_UNIT_DEVIN_BUFFER7)){ buffer = audio_unit_devin->buffer[6]; }else{ buffer = NULL; } return(buffer); } void ags_audio_unit_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *buffer_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); buffer_mutex = NULL; if(audio_unit_devin->buffer != NULL){ if(buffer == audio_unit_devin->buffer[0]){ buffer_mutex = audio_unit_devin->buffer_mutex[0]; }else if(buffer == audio_unit_devin->buffer[1]){ buffer_mutex = audio_unit_devin->buffer_mutex[1]; }else if(buffer == audio_unit_devin->buffer[2]){ buffer_mutex = audio_unit_devin->buffer_mutex[2]; }else if(buffer == audio_unit_devin->buffer[3]){ buffer_mutex = audio_unit_devin->buffer_mutex[3]; }else if(buffer == audio_unit_devin->buffer[4]){ buffer_mutex = audio_unit_devin->buffer_mutex[4]; }else if(buffer == audio_unit_devin->buffer[5]){ buffer_mutex = audio_unit_devin->buffer_mutex[5]; }else if(buffer == audio_unit_devin->buffer[6]){ buffer_mutex = audio_unit_devin->buffer_mutex[6]; }else if(buffer == audio_unit_devin->buffer[7]){ buffer_mutex = audio_unit_devin->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_audio_unit_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *buffer_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); buffer_mutex = NULL; if(audio_unit_devin->buffer != NULL){ if(buffer == audio_unit_devin->buffer[0]){ buffer_mutex = audio_unit_devin->buffer_mutex[0]; }else if(buffer == audio_unit_devin->buffer[1]){ buffer_mutex = audio_unit_devin->buffer_mutex[1]; }else if(buffer == audio_unit_devin->buffer[2]){ buffer_mutex = audio_unit_devin->buffer_mutex[2]; }else if(buffer == audio_unit_devin->buffer[3]){ buffer_mutex = audio_unit_devin->buffer_mutex[3]; }else if(buffer == audio_unit_devin->buffer[4]){ buffer_mutex = audio_unit_devin->buffer_mutex[4]; }else if(buffer == audio_unit_devin->buffer[5]){ buffer_mutex = audio_unit_devin->buffer_mutex[5]; }else if(buffer == audio_unit_devin->buffer[6]){ buffer_mutex = audio_unit_devin->buffer_mutex[6]; }else if(buffer == audio_unit_devin->buffer[7]){ buffer_mutex = audio_unit_devin->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_audio_unit_devin_get_delay_counter(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint delay_counter; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* delay counter */ g_rec_mutex_lock(audio_unit_devin_mutex); delay_counter = audio_unit_devin->delay_counter; g_rec_mutex_unlock(audio_unit_devin_mutex); return(delay_counter); } void ags_audio_unit_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set note offset */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->note_offset = note_offset; g_rec_mutex_unlock(audio_unit_devin_mutex); } guint ags_audio_unit_devin_get_start_note_offset(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint start_note_offset; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set note offset */ g_rec_mutex_lock(audio_unit_devin_mutex); start_note_offset = audio_unit_devin->start_note_offset; g_rec_mutex_unlock(audio_unit_devin_mutex); return(start_note_offset); } void ags_audio_unit_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set note offset */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->start_note_offset = start_note_offset; g_rec_mutex_unlock(audio_unit_devin_mutex); } guint ags_audio_unit_devin_get_note_offset(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint note_offset; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set note offset */ g_rec_mutex_lock(audio_unit_devin_mutex); note_offset = audio_unit_devin->note_offset; g_rec_mutex_unlock(audio_unit_devin_mutex); return(note_offset); } void ags_audio_unit_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set note offset */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(audio_unit_devin_mutex); } guint ags_audio_unit_devin_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint note_offset_absolute; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set note offset */ g_rec_mutex_lock(audio_unit_devin_mutex); note_offset_absolute = audio_unit_devin->note_offset_absolute; g_rec_mutex_unlock(audio_unit_devin_mutex); return(note_offset_absolute); } void ags_audio_unit_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* set loop */ g_rec_mutex_lock(audio_unit_devin_mutex); audio_unit_devin->loop_left = loop_left; audio_unit_devin->loop_right = loop_right; audio_unit_devin->do_loop = do_loop; if(do_loop){ audio_unit_devin->loop_offset = audio_unit_devin->note_offset; } g_rec_mutex_unlock(audio_unit_devin_mutex); } void ags_audio_unit_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsAudioUnitDevin *audio_unit_devin; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get loop */ g_rec_mutex_lock(audio_unit_devin_mutex); if(loop_left != NULL){ *loop_left = audio_unit_devin->loop_left; } if(loop_right != NULL){ *loop_right = audio_unit_devin->loop_right; } if(do_loop != NULL){ *do_loop = audio_unit_devin->do_loop; } g_rec_mutex_unlock(audio_unit_devin_mutex); } guint ags_audio_unit_devin_get_loop_offset(AgsSoundcard *soundcard) { AgsAudioUnitDevin *audio_unit_devin; guint loop_offset; GRecMutex *audio_unit_devin_mutex; audio_unit_devin = AGS_AUDIO_UNIT_DEVIN(soundcard); /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get loop offset */ g_rec_mutex_lock(audio_unit_devin_mutex); loop_offset = audio_unit_devin->loop_offset; g_rec_mutex_unlock(audio_unit_devin_mutex); return(loop_offset); } /** * ags_audio_unit_devin_switch_buffer_flag: * @audio_unit_devin: an #AgsAudioUnitDevin * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_audio_unit_devin_switch_buffer_flag(AgsAudioUnitDevin *audio_unit_devin) { GRecMutex *audio_unit_devin_mutex; if(!AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_devin)){ return; } /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* switch buffer flag */ g_rec_mutex_lock(audio_unit_devin_mutex); if((AGS_AUDIO_UNIT_DEVIN_BUFFER0 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER0); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER1; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER1 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER1); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER2; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER2 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER2); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER3; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER3 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER3); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER4; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER4 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER4); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER5; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER5 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER5); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER6; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER6 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER6); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER7; }else if((AGS_AUDIO_UNIT_DEVIN_BUFFER7 & (audio_unit_devin->flags)) != 0){ audio_unit_devin->flags &= (~AGS_AUDIO_UNIT_DEVIN_BUFFER7); audio_unit_devin->flags |= AGS_AUDIO_UNIT_DEVIN_BUFFER0; } g_rec_mutex_unlock(audio_unit_devin_mutex); } /** * ags_audio_unit_devin_adjust_delay_and_attack: * @audio_unit_devin: the #AgsAudioUnitDevin * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_audio_unit_devin_adjust_delay_and_attack(AgsAudioUnitDevin *audio_unit_devin) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *audio_unit_devin_mutex; if(!AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_devin)){ return; } /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get some initial values */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(audio_unit_devin)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(audio_unit_devin_mutex); default_tact_frames = (guint) (delay * audio_unit_devin->buffer_size); delay_tact_frames = (guint) (floor(delay) * audio_unit_devin->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; audio_unit_devin->attack[0] = (guint) floor(0.25 * audio_unit_devin->buffer_size); next_attack = (((audio_unit_devin->attack[i] + default_tact_frames) / audio_unit_devin->buffer_size) - delay) * audio_unit_devin->buffer_size; if(next_attack < 0){ next_attack = 0; } if(next_attack >= audio_unit_devin->buffer_size){ next_attack = audio_unit_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ audio_unit_devin->attack[i] = audio_unit_devin->attack[i] - ((gdouble) next_attack / 2.0); if(audio_unit_devin->attack[i] < 0){ audio_unit_devin->attack[i] = 0; } if(audio_unit_devin->attack[i] >= audio_unit_devin->buffer_size){ audio_unit_devin->attack[i] = audio_unit_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= audio_unit_devin->buffer_size){ next_attack = audio_unit_devin->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ audio_unit_devin->attack[i] = next_attack; next_attack = (((audio_unit_devin->attack[i] + default_tact_frames) / audio_unit_devin->buffer_size) - delay) * audio_unit_devin->buffer_size; if(next_attack >= audio_unit_devin->buffer_size){ next_attack = audio_unit_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ audio_unit_devin->attack[i] = audio_unit_devin->attack[i] - ((gdouble) next_attack / 2.0); if(audio_unit_devin->attack[i] < 0){ audio_unit_devin->attack[i] = 0; } if(audio_unit_devin->attack[i] >= audio_unit_devin->buffer_size){ audio_unit_devin->attack[i] = audio_unit_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= audio_unit_devin->buffer_size){ next_attack = audio_unit_devin->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", audio_unit_devin->attack[i]); #endif } audio_unit_devin->attack[0] = audio_unit_devin->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ audio_unit_devin->delay[i] = ((gdouble) (default_tact_frames + audio_unit_devin->attack[i] - audio_unit_devin->attack[i + 1])) / (gdouble) audio_unit_devin->buffer_size; #ifdef AGS_DEBUG g_message("%f", audio_unit_devin->delay[i]); #endif } audio_unit_devin->delay[i] = ((gdouble) (default_tact_frames + audio_unit_devin->attack[i] - audio_unit_devin->attack[0])) / (gdouble) audio_unit_devin->buffer_size; g_rec_mutex_unlock(audio_unit_devin_mutex); } /** * ags_audio_unit_devin_realloc_buffer: * @audio_unit_devin: the #AgsAudioUnitDevin * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_audio_unit_devin_realloc_buffer(AgsAudioUnitDevin *audio_unit_devin) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *audio_unit_devin_mutex; if(!AGS_IS_AUDIO_UNIT_DEVIN(audio_unit_devin)){ return; } /* get audio_unit devin mutex */ audio_unit_devin_mutex = AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX(audio_unit_devin); /* get word size */ g_rec_mutex_lock(audio_unit_devin_mutex); pcm_channels = audio_unit_devin->pcm_channels; buffer_size = audio_unit_devin->buffer_size; format = audio_unit_devin->format; g_rec_mutex_unlock(audio_unit_devin_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_audio_unit_devin_realloc_buffer(): unsupported word size"); return; } /* AGS_AUDIO_UNIT_DEVIN_BUFFER_0 */ if(audio_unit_devin->buffer[0] != NULL){ free(audio_unit_devin->buffer[0]); } audio_unit_devin->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_1 */ if(audio_unit_devin->buffer[1] != NULL){ free(audio_unit_devin->buffer[1]); } audio_unit_devin->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_2 */ if(audio_unit_devin->buffer[2] != NULL){ free(audio_unit_devin->buffer[2]); } audio_unit_devin->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_3 */ if(audio_unit_devin->buffer[3] != NULL){ free(audio_unit_devin->buffer[3]); } audio_unit_devin->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_4 */ if(audio_unit_devin->buffer[4] != NULL){ free(audio_unit_devin->buffer[4]); } audio_unit_devin->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_5 */ if(audio_unit_devin->buffer[5] != NULL){ free(audio_unit_devin->buffer[5]); } audio_unit_devin->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_6 */ if(audio_unit_devin->buffer[6] != NULL){ free(audio_unit_devin->buffer[6]); } audio_unit_devin->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_AUDIO_UNIT_DEVIN_BUFFER_7 */ if(audio_unit_devin->buffer[7] != NULL){ free(audio_unit_devin->buffer[7]); } audio_unit_devin->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_audio_unit_devin_new: * * Creates a new instance of #AgsAudioUnitDevin. * * Returns: a new #AgsAudioUnitDevin * * Since: 3.0.0 */ AgsAudioUnitDevin* ags_audio_unit_devin_new() { AgsAudioUnitDevin *audio_unit_devin; audio_unit_devin = (AgsAudioUnitDevin *) g_object_new(AGS_TYPE_AUDIO_UNIT_DEVIN, NULL); return(audio_unit_devin); } gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_devout.h0000644000175000017500000001602313607210263021264 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_UNIT_DEVOUT_H__ #define __AGS_AUDIO_UNIT_DEVOUT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_UNIT_DEVOUT (ags_audio_unit_devout_get_type()) #define AGS_AUDIO_UNIT_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_UNIT_DEVOUT, AgsAudioUnitDevout)) #define AGS_AUDIO_UNIT_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_UNIT_DEVOUT, AgsAudioUnitDevout)) #define AGS_IS_AUDIO_UNIT_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_UNIT_DEVOUT)) #define AGS_IS_AUDIO_UNIT_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_UNIT_DEVOUT)) #define AGS_AUDIO_UNIT_DEVOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_UNIT_DEVOUT, AgsAudioUnitDevoutClass)) #define AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX(obj) (&(((AgsAudioUnitDevout *) obj)->obj_mutex)) typedef struct _AgsAudioUnitDevout AgsAudioUnitDevout; typedef struct _AgsAudioUnitDevoutClass AgsAudioUnitDevoutClass; /** * AgsAudioUnitDevoutFlags: * @AGS_AUDIO_UNIT_DEVOUT_ADDED_TO_REGISTRY: the core-audio devout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_UNIT_DEVOUT_CONNECTED: indicates the core-audio devout was connected by calling #AgsConnectable::connect() * @AGS_AUDIO_UNIT_DEVOUT_BUFFER0: ring-buffer 0 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER1: ring-buffer 1 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER2: ring-buffer 2 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER3: ring-buffer 3 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER4: ring-buffer 4 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER5: ring-buffer 5 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER6: ring-buffer 6 * @AGS_AUDIO_UNIT_DEVOUT_BUFFER7: ring-buffer 7 * @AGS_AUDIO_UNIT_DEVOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_AUDIO_UNIT_DEVOUT_PLAY: do playback * @AGS_AUDIO_UNIT_DEVOUT_SHUTDOWN: stop playback * @AGS_AUDIO_UNIT_DEVOUT_START_PLAY: playback starting * @AGS_AUDIO_UNIT_DEVOUT_NONBLOCKING: do non-blocking calls * @AGS_AUDIO_UNIT_DEVOUT_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsAudioUnitDevout by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_UNIT_DEVOUT_ADDED_TO_REGISTRY = 1, AGS_AUDIO_UNIT_DEVOUT_CONNECTED = 1 << 1, AGS_AUDIO_UNIT_DEVOUT_BUFFER0 = 1 << 2, AGS_AUDIO_UNIT_DEVOUT_BUFFER1 = 1 << 3, AGS_AUDIO_UNIT_DEVOUT_BUFFER2 = 1 << 4, AGS_AUDIO_UNIT_DEVOUT_BUFFER3 = 1 << 5, AGS_AUDIO_UNIT_DEVOUT_BUFFER4 = 1 << 6, AGS_AUDIO_UNIT_DEVOUT_BUFFER5 = 1 << 7, AGS_AUDIO_UNIT_DEVOUT_BUFFER6 = 1 << 8, AGS_AUDIO_UNIT_DEVOUT_BUFFER7 = 1 << 9, AGS_AUDIO_UNIT_DEVOUT_ATTACK_FIRST = 1 << 10, AGS_AUDIO_UNIT_DEVOUT_PLAY = 1 << 11, AGS_AUDIO_UNIT_DEVOUT_SHUTDOWN = 1 << 12, AGS_AUDIO_UNIT_DEVOUT_START_PLAY = 1 << 13, AGS_AUDIO_UNIT_DEVOUT_NONBLOCKING = 1 << 14, AGS_AUDIO_UNIT_DEVOUT_INITIALIZED = 1 << 15, }AgsAudioUnitDevoutFlags; /** * AgsAudioUnitDevoutSyncFlags: * @AGS_AUDIO_UNIT_DEVOUT_PASS_THROUGH: do not sync * @AGS_AUDIO_UNIT_DEVOUT_INITIAL_CALLBACK: initial callback * @AGS_AUDIO_UNIT_DEVOUT_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_AUDIO_UNIT_DEVOUT_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_AUDIO_UNIT_DEVOUT_PASS_THROUGH = 1, AGS_AUDIO_UNIT_DEVOUT_INITIAL_CALLBACK = 1 << 1, AGS_AUDIO_UNIT_DEVOUT_CALLBACK_WAIT = 1 << 2, AGS_AUDIO_UNIT_DEVOUT_CALLBACK_DONE = 1 << 3, AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_WAIT = 1 << 4, AGS_AUDIO_UNIT_DEVOUT_CALLBACK_FINISH_DONE = 1 << 5, }AgsAudioUnitDevoutSyncFlags; #define AGS_AUDIO_UNIT_DEVOUT_ERROR (ags_audio_unit_devout_error_quark()) typedef enum{ AGS_AUDIO_UNIT_DEVOUT_ERROR_LOCKED_SOUNDCARD, }AgsAudioUnitDevoutError; struct _AgsAudioUnitDevout { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void** buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *audio_unit_client; gchar **port_name; GList *audio_unit_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; GObject *notify_soundcard; }; struct _AgsAudioUnitDevoutClass { GObjectClass gobject; }; GType ags_audio_unit_devout_get_type(); GQuark ags_audio_unit_devout_error_quark(); gboolean ags_audio_unit_devout_test_flags(AgsAudioUnitDevout *audio_unit_devout, guint flags); void ags_audio_unit_devout_set_flags(AgsAudioUnitDevout *audio_unit_devout, guint flags); void ags_audio_unit_devout_unset_flags(AgsAudioUnitDevout *audio_unit_devout, guint flags); void ags_audio_unit_devout_switch_buffer_flag(AgsAudioUnitDevout *audio_unit_devout); void ags_audio_unit_devout_adjust_delay_and_attack(AgsAudioUnitDevout *audio_unit_devout); void ags_audio_unit_devout_realloc_buffer(AgsAudioUnitDevout *audio_unit_devout); AgsAudioUnitDevout* ags_audio_unit_devout_new(); G_END_DECLS #endif /*__AGS_AUDIO_UNIT_DEVOUT_H__*/ gsequencer-3.1.3/ags/audio/audio-unit/ags_audio_unit_server.c0000644000175000017500000013474313613101164021265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_audio_unit_server_class_init(AgsAudioUnitServerClass *audio_unit_server); void ags_audio_unit_server_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_unit_server_sound_server_interface_init(AgsSoundServerInterface *sound_server); void ags_audio_unit_server_init(AgsAudioUnitServer *audio_unit_server); void ags_audio_unit_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_unit_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_unit_server_dispose(GObject *gobject); void ags_audio_unit_server_finalize(GObject *gobject); AgsUUID* ags_audio_unit_server_get_uuid(AgsConnectable *connectable); gboolean ags_audio_unit_server_has_resource(AgsConnectable *connectable); gboolean ags_audio_unit_server_is_ready(AgsConnectable *connectable); void ags_audio_unit_server_add_to_registry(AgsConnectable *connectable); void ags_audio_unit_server_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_unit_server_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_unit_server_xml_compose(AgsConnectable *connectable); void ags_audio_unit_server_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_unit_server_is_connected(AgsConnectable *connectable); void ags_audio_unit_server_connect(AgsConnectable *connectable); void ags_audio_unit_server_disconnect(AgsConnectable *connectable); void ags_audio_unit_server_set_url(AgsSoundServer *sound_server, gchar *url); gchar* ags_audio_unit_server_get_url(AgsSoundServer *sound_server); void ags_audio_unit_server_set_ports(AgsSoundServer *sound_server, guint *ports, guint port_count); guint* ags_audio_unit_server_get_ports(AgsSoundServer *sound_server, guint *port_count); void ags_audio_unit_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard); GList* ags_audio_unit_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid); void ags_audio_unit_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer); GList* ags_audio_unit_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid); GObject* ags_audio_unit_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output); void ags_audio_unit_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard); GObject* ags_audio_unit_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output); void ags_audio_unit_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer); void* ags_audio_unit_server_do_poll_loop(void *ptr); /** * SECTION:ags_audio_unit_server * @short_description: audio unit instance * @title: AgsAudioUnitServer * @section_id: * @include: ags/audio/audio-unit/ags_audio_unit_server.h * * The #AgsAudioUnitServer is an object to represent a running audio unit instance. */ enum{ PROP_0, PROP_URL, PROP_DEFAULT_SOUNDCARD, PROP_DEFAULT_AUDIO_UNIT_CLIENT, PROP_INPUT_AUDIO_UNIT_CLIENT, PROP_AUDIO_UNIT_CLIENT, }; static gpointer ags_audio_unit_server_parent_class = NULL; GType ags_audio_unit_server_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_unit_server = 0; static const GTypeInfo ags_audio_unit_server_info = { sizeof(AgsAudioUnitServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_unit_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsAudioUnitServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_unit_server_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_unit_server_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_server_interface_info = { (GInterfaceInitFunc) ags_audio_unit_server_sound_server_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_unit_server = g_type_register_static(G_TYPE_OBJECT, "AgsAudioUnitServer", &ags_audio_unit_server_info, 0); g_type_add_interface_static(ags_type_audio_unit_server, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_audio_unit_server, AGS_TYPE_SOUND_SERVER, &ags_sound_server_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_unit_server); } return g_define_type_id__volatile; } void ags_audio_unit_server_class_init(AgsAudioUnitServerClass *audio_unit_server) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_unit_server_parent_class = g_type_class_peek_parent(audio_unit_server); /* GObjectClass */ gobject = (GObjectClass *) audio_unit_server; gobject->set_property = ags_audio_unit_server_set_property; gobject->get_property = ags_audio_unit_server_get_property; gobject->dispose = ags_audio_unit_server_dispose; gobject->finalize = ags_audio_unit_server_finalize; /* properties */ /** * AgsAudioUnitServer:url: * * The assigned URL. * * Since: 3.0.0 */ param_spec = g_param_spec_string("url", i18n_pspec("the URL"), i18n_pspec("The URL"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URL, param_spec); /** * AgsAudioUnitServer:default-soundcard: * * The default soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-soundcard", i18n_pspec("default soundcard"), i18n_pspec("The default soundcard"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_SOUNDCARD, param_spec); /** * AgsAudioUnitServer:default-audio-unit-client: * * The default audio unit client. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-audio-unit-client", i18n_pspec("default audio unit client"), i18n_pspec("The default audio unit client"), AGS_TYPE_AUDIO_UNIT_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_AUDIO_UNIT_CLIENT, param_spec); /** * AgsAudioUnitServer:input-audio-unit-client: * * The input audio unit client. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-audio-unit-client", i18n_pspec("input audio unit client"), i18n_pspec("The input audio unit client"), AGS_TYPE_AUDIO_UNIT_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_AUDIO_UNIT_CLIENT, param_spec); /** * AgsAudioUnitServer:audio-unit-client: (type GList(AgsAudioUnitClient)) (transfer full) * * The audio unit client list. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("audio-unit-client", i18n_pspec("audio unit client list"), i18n_pspec("The audio unit client list"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_UNIT_CLIENT, param_spec); } void ags_audio_unit_server_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_unit_server_get_uuid; connectable->has_resource = ags_audio_unit_server_has_resource; connectable->is_ready = ags_audio_unit_server_is_ready; connectable->add_to_registry = ags_audio_unit_server_add_to_registry; connectable->remove_from_registry = ags_audio_unit_server_remove_from_registry; connectable->list_resource = ags_audio_unit_server_list_resource; connectable->xml_compose = ags_audio_unit_server_xml_compose; connectable->xml_parse = ags_audio_unit_server_xml_parse; connectable->is_connected = ags_audio_unit_server_is_connected; connectable->connect = ags_audio_unit_server_connect; connectable->disconnect = ags_audio_unit_server_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_unit_server_sound_server_interface_init(AgsSoundServerInterface *sound_server) { sound_server->set_url = ags_audio_unit_server_set_url; sound_server->get_url = ags_audio_unit_server_get_url; sound_server->set_ports = ags_audio_unit_server_set_ports; sound_server->get_ports = ags_audio_unit_server_get_ports; sound_server->set_soundcard = ags_audio_unit_server_set_soundcard; sound_server->get_soundcard = ags_audio_unit_server_get_soundcard; sound_server->set_sequencer = ags_audio_unit_server_set_sequencer; sound_server->get_sequencer = ags_audio_unit_server_get_sequencer; sound_server->register_soundcard = ags_audio_unit_server_register_soundcard; sound_server->unregister_soundcard = ags_audio_unit_server_unregister_soundcard; sound_server->register_sequencer = ags_audio_unit_server_register_sequencer; sound_server->unregister_sequencer = ags_audio_unit_server_unregister_sequencer; } void ags_audio_unit_server_init(AgsAudioUnitServer *audio_unit_server) { /* flags */ audio_unit_server->flags = 0; /* server mutex */ g_rec_mutex_init(&(audio_unit_server->obj_mutex)); g_atomic_int_set(&(audio_unit_server->running), TRUE); audio_unit_server->thread = NULL; /* uuid */ audio_unit_server->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_unit_server->uuid); audio_unit_server->url = NULL; audio_unit_server->port = NULL; audio_unit_server->port_count = 0; audio_unit_server->n_soundcards = 0; audio_unit_server->n_sequencers = 0; audio_unit_server->default_soundcard = NULL; audio_unit_server->default_client = NULL; audio_unit_server->input_client = NULL; audio_unit_server->client = NULL; } void ags_audio_unit_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioUnitServer *audio_unit_server; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(gobject); /* get audio-unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); switch(prop_id){ case PROP_URL: { gchar *url; url = g_value_get_string(value); g_rec_mutex_lock(audio_unit_server_mutex); if(audio_unit_server->url == url){ g_rec_mutex_unlock(audio_unit_server_mutex); return; } if(audio_unit_server->url != NULL){ g_free(audio_unit_server->url); } audio_unit_server->url = g_strdup(url); g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { GObject *default_soundcard; default_soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_server_mutex); if(audio_unit_server->default_soundcard == (GObject *) default_soundcard){ g_rec_mutex_unlock(audio_unit_server_mutex); return; } if(audio_unit_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(audio_unit_server->default_soundcard)); } if(default_soundcard != NULL){ g_object_ref(G_OBJECT(default_soundcard)); } audio_unit_server->default_soundcard = (GObject *) default_soundcard; g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_DEFAULT_AUDIO_UNIT_CLIENT: { AgsAudioUnitClient *default_client; default_client = (AgsAudioUnitClient *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_server_mutex); if(audio_unit_server->default_client == (GObject *) default_client){ g_rec_mutex_unlock(audio_unit_server_mutex); return; } if(audio_unit_server->default_client != NULL){ g_object_unref(G_OBJECT(audio_unit_server->default_client)); } if(default_client != NULL){ g_object_ref(G_OBJECT(default_client)); } audio_unit_server->default_client = (GObject *) default_client; g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_INPUT_AUDIO_UNIT_CLIENT: { AgsAudioUnitClient *input_client; input_client = (AgsAudioUnitClient *) g_value_get_object(value); g_rec_mutex_lock(audio_unit_server_mutex); if(audio_unit_server->input_client == (GObject *) input_client){ g_rec_mutex_unlock(audio_unit_server_mutex); return; } if(audio_unit_server->input_client != NULL){ g_object_unref(G_OBJECT(audio_unit_server->input_client)); } if(input_client != NULL){ g_object_ref(G_OBJECT(input_client)); } audio_unit_server->input_client = (GObject *) input_client; g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_AUDIO_UNIT_CLIENT: { GObject *client; client = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(audio_unit_server_mutex); if(!AGS_IS_AUDIO_UNIT_CLIENT(client) || g_list_find(audio_unit_server->client, client) != NULL){ g_rec_mutex_unlock(audio_unit_server_mutex); return; } g_object_ref(G_OBJECT(client)); audio_unit_server->client = g_list_prepend(audio_unit_server->client, client); g_rec_mutex_unlock(audio_unit_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioUnitServer *audio_unit_server; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(gobject); /* get audio-unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); switch(prop_id){ case PROP_URL: { g_rec_mutex_lock(audio_unit_server_mutex); g_value_set_string(value, audio_unit_server->url); g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { g_rec_mutex_lock(audio_unit_server_mutex); g_value_set_object(value, audio_unit_server->default_soundcard); g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_DEFAULT_AUDIO_UNIT_CLIENT: { g_rec_mutex_lock(audio_unit_server_mutex); g_value_set_object(value, audio_unit_server->default_client); g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_INPUT_AUDIO_UNIT_CLIENT: { g_rec_mutex_lock(audio_unit_server_mutex); g_value_set_object(value, audio_unit_server->input_client); g_rec_mutex_unlock(audio_unit_server_mutex); } break; case PROP_AUDIO_UNIT_CLIENT: { g_rec_mutex_lock(audio_unit_server_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_unit_server->client, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_unit_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_unit_server_dispose(GObject *gobject) { AgsAudioUnitServer *audio_unit_server; GList *list; audio_unit_server = AGS_AUDIO_UNIT_SERVER(gobject); /* default soundcard */ if(audio_unit_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(audio_unit_server->default_soundcard)); audio_unit_server->default_soundcard = NULL; } /* default client */ if(audio_unit_server->default_client != NULL){ g_object_unref(G_OBJECT(audio_unit_server->default_client)); audio_unit_server->default_client = NULL; } /* input client */ if(audio_unit_server->input_client != NULL){ g_object_unref(G_OBJECT(audio_unit_server->input_client)); audio_unit_server->input_client = NULL; } /* client */ if(audio_unit_server->client != NULL){ list = audio_unit_server->client; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(audio_unit_server->client, g_object_unref); audio_unit_server->client = NULL; } /* call parent */ G_OBJECT_CLASS(ags_audio_unit_server_parent_class)->dispose(gobject); } void ags_audio_unit_server_finalize(GObject *gobject) { AgsAudioUnitServer *audio_unit_server; audio_unit_server = AGS_AUDIO_UNIT_SERVER(gobject); /* url */ g_free(audio_unit_server->url); /* default soundcard */ if(audio_unit_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(audio_unit_server->default_soundcard)); } /* default client */ if(audio_unit_server->default_client != NULL){ g_object_unref(G_OBJECT(audio_unit_server->default_client)); } /* input client */ if(audio_unit_server->input_client != NULL){ g_object_unref(G_OBJECT(audio_unit_server->input_client)); } /* client */ if(audio_unit_server->client != NULL){ g_list_free_full(audio_unit_server->client, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_audio_unit_server_parent_class)->finalize(gobject); } AgsUUID* ags_audio_unit_server_get_uuid(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; AgsUUID *ptr; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); /* get audio unit server signal mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* get UUID */ g_rec_mutex_lock(audio_unit_server_mutex); ptr = audio_unit_server->uuid; g_rec_mutex_unlock(audio_unit_server_mutex); return(ptr); } gboolean ags_audio_unit_server_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_audio_unit_server_is_ready(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; gboolean is_ready; audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); /* check is added */ is_ready = ags_audio_unit_server_test_flags(audio_unit_server, AGS_AUDIO_UNIT_SERVER_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_unit_server_add_to_registry(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; if(ags_connectable_is_ready(connectable)){ return; } audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); ags_audio_unit_server_set_flags(audio_unit_server, AGS_AUDIO_UNIT_SERVER_ADDED_TO_REGISTRY); } void ags_audio_unit_server_remove_from_registry(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; if(!ags_connectable_is_ready(connectable)){ return; } audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); ags_audio_unit_server_unset_flags(audio_unit_server, AGS_AUDIO_UNIT_SERVER_ADDED_TO_REGISTRY); } xmlNode* ags_audio_unit_server_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_unit_server_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_unit_server_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_unit_server_is_connected(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; gboolean is_connected; audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); /* check is connected */ is_connected = ags_audio_unit_server_test_flags(audio_unit_server, AGS_AUDIO_UNIT_SERVER_CONNECTED); return(is_connected); } void ags_audio_unit_server_connect(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; GList *start_list, *list; if(ags_connectable_is_connected(connectable)){ return; } audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); ags_audio_unit_server_set_flags(audio_unit_server, AGS_AUDIO_UNIT_SERVER_CONNECTED); /* connect client */ g_object_get(audio_unit_server, "audio-unit-client", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_audio_unit_server_disconnect(AgsConnectable *connectable) { AgsAudioUnitServer *audio_unit_server; GList *start_list, *list; if(!ags_connectable_is_connected(connectable)){ return; } audio_unit_server = AGS_AUDIO_UNIT_SERVER(connectable); ags_audio_unit_server_unset_flags(audio_unit_server, AGS_AUDIO_UNIT_SERVER_CONNECTED); /* connect client */ g_object_get(audio_unit_server, "audio-unit-client", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_audio_unit_server_test_flags: * @audio_unit_server: the #AgsAudioUnitServer * @flags: the flags * * Test @flags to be set on @audio_unit_server. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_unit_server_test_flags(AgsAudioUnitServer *audio_unit_server, guint flags) { gboolean retval; GRecMutex *audio_unit_server_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server)){ return(FALSE); } /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* test */ g_rec_mutex_lock(audio_unit_server_mutex); retval = (flags & (audio_unit_server->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_server_mutex); return(retval); } /** * ags_audio_unit_server_set_flags: * @audio_unit_server: the #AgsAudioUnitServer * @flags: see #AgsAudioUnitServerFlags-enum * * Enable a feature of @audio_unit_server. * * Since: 3.0.0 */ void ags_audio_unit_server_set_flags(AgsAudioUnitServer *audio_unit_server, guint flags) { GRecMutex *audio_unit_server_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server)){ return; } /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->flags |= flags; g_rec_mutex_unlock(audio_unit_server_mutex); } /** * ags_audio_unit_server_unset_flags: * @audio_unit_server: the #AgsAudioUnitServer * @flags: see #AgsAudioUnitServerFlags-enum * * Disable a feature of @audio_unit_server. * * Since: 3.0.0 */ void ags_audio_unit_server_unset_flags(AgsAudioUnitServer *audio_unit_server, guint flags) { GRecMutex *audio_unit_server_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server)){ return; } /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->flags &= (~flags); g_rec_mutex_unlock(audio_unit_server_mutex); } void ags_audio_unit_server_set_url(AgsSoundServer *sound_server, gchar *url) { AgsAudioUnitServer *audio_unit_server; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* set URL */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->url = g_strdup(url); g_rec_mutex_unlock(audio_unit_server_mutex); } gchar* ags_audio_unit_server_get_url(AgsSoundServer *sound_server) { AgsAudioUnitServer *audio_unit_server; gchar *url; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* set URL */ g_rec_mutex_lock(audio_unit_server_mutex); url = g_strdup(audio_unit_server->url); g_rec_mutex_unlock(audio_unit_server_mutex); return(url); } void ags_audio_unit_server_set_ports(AgsSoundServer *sound_server, guint *port, guint port_count) { AgsAudioUnitServer *audio_unit_server; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* set ports */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->port = port; audio_unit_server->port_count = port_count; g_rec_mutex_unlock(audio_unit_server_mutex); } guint* ags_audio_unit_server_get_ports(AgsSoundServer *sound_server, guint *port_count) { AgsAudioUnitServer *audio_unit_server; guint *port; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* get ports */ g_rec_mutex_lock(audio_unit_server_mutex); if(port_count != NULL){ *port_count = AGS_AUDIO_UNIT_SERVER(sound_server)->port_count; } port = audio_unit_server->port; g_rec_mutex_unlock(audio_unit_server_mutex); return(port); } void ags_audio_unit_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard) { AgsAudioUnitServer *audio_unit_server; AgsAudioUnitClient *audio_unit_client; GList *list; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); audio_unit_client = (AgsAudioUnitClient *) ags_audio_unit_server_find_client(audio_unit_server, client_uuid); if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } //NOTE:JK: soundcard won't removed list = soundcard; while(list != NULL){ ags_audio_unit_client_add_device(audio_unit_client, (GObject *) list->data); list = list->next; } } GList* ags_audio_unit_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid) { AgsAudioUnitServer *audio_unit_server; AgsAudioUnitClient *audio_unit_client; GList *device_start, *device; GList *list; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); audio_unit_client = (AgsAudioUnitClient *) ags_audio_unit_server_find_client(audio_unit_server, client_uuid); if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return(NULL); } g_object_get(audio_unit_client, "device", &device_start, NULL); device = device_start; list = NULL; while(device != NULL){ if(AGS_IS_AUDIO_UNIT_DEVOUT(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } return(g_list_reverse(list)); } void ags_audio_unit_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer) { AgsAudioUnitServer *audio_unit_server; AgsAudioUnitClient *audio_unit_client; GList *list; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); audio_unit_client = (AgsAudioUnitClient *) ags_audio_unit_server_find_client(audio_unit_server, client_uuid); if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } //NOTE:JK: sequencer won't removed list = sequencer; while(list != NULL){ ags_audio_unit_client_add_device(audio_unit_client, (GObject *) list->data); list = list->next; } } GList* ags_audio_unit_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid) { AgsAudioUnitServer *audio_unit_server; AgsAudioUnitClient *audio_unit_client; GList *device_start, *device; GList *list; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); audio_unit_client = (AgsAudioUnitClient *) ags_audio_unit_server_find_client(audio_unit_server, client_uuid); if(!AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return(NULL); } g_object_get(audio_unit_client, "device", &device_start, NULL); device = device_start; list = NULL; #if 0 while(device != NULL){ if(AGS_IS_AUDIO_UNIT_MIDIIN(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } #endif return(g_list_reverse(list)); } GObject* ags_audio_unit_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output) { AgsAudioUnitServer *audio_unit_server; AgsAudioUnitClient *audio_unit_client; AgsAudioUnitClient *default_client; AgsAudioUnitClient *input_client; AgsAudioUnitPort *audio_unit_port; AgsAudioUnitDevout *audio_unit_devout; AgsAudioUnitDevin *audio_unit_devin; AgsApplicationContext *application_context; GObject *soundcard; gchar *str; guint n_soundcards; gboolean initial_set; guint i; GRecMutex *audio_unit_server_mutex; GRecMutex *audio_unit_client_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); application_context = ags_application_context_get_instance(); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* the default client */ initial_set = FALSE; /* get some fields */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_client = default_client = (AgsAudioUnitClient *) audio_unit_server->default_client; input_client = (AgsAudioUnitClient *) audio_unit_server->input_client; n_soundcards = audio_unit_server->n_soundcards; g_rec_mutex_unlock(audio_unit_server_mutex); if(!is_output && input_client != NULL){ audio_unit_client = input_client; } /* the default client */ if(audio_unit_client == NULL){ audio_unit_client = ags_audio_unit_client_new((GObject *) audio_unit_server); g_object_set(audio_unit_server, "default-audio-unit-client", audio_unit_client, NULL); ags_audio_unit_server_add_client(audio_unit_server, (GObject *) audio_unit_client); ags_audio_unit_client_open((AgsAudioUnitClient *) audio_unit_client, "ags-default-client"); initial_set = TRUE; } /* get audio unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(audio_unit_client); soundcard = NULL; /* the soundcard */ if(is_output){ audio_unit_devout = ags_audio_unit_devout_new(application_context); soundcard = (GObject *) audio_unit_devout; str = g_strdup_printf("ags-audio-unit-devout-%d", n_soundcards); g_object_set(AGS_AUDIO_UNIT_DEVOUT(audio_unit_devout), "audio-unit-client", audio_unit_client, "device", str, NULL); g_free(str); /* register ports */ audio_unit_port = ags_audio_unit_port_new((GObject *) audio_unit_client); str = g_strdup_printf("ags-soundcard%d", n_soundcards); g_object_set(audio_unit_port, "audio-unit-device", audio_unit_devout, NULL); ags_audio_unit_client_add_port(audio_unit_client, (GObject *) audio_unit_port); g_object_set(audio_unit_devout, "audio-unit-port", audio_unit_port, NULL); audio_unit_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); audio_unit_devout->port_name[0] = g_strdup(str); audio_unit_devout->port_name[1] = NULL; ags_audio_unit_port_register(audio_unit_port, str, TRUE, FALSE, TRUE); ags_audio_unit_devout_realloc_buffer(audio_unit_devout); g_object_set(audio_unit_client, "device", audio_unit_devout, NULL); /* increment n-soundcards */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->n_soundcards += 1; g_rec_mutex_unlock(audio_unit_server_mutex); }else{ audio_unit_devin = ags_audio_unit_devin_new(application_context); soundcard = (GObject *) audio_unit_devin; str = g_strdup_printf("ags-audio-unit-devin-%d", n_soundcards); g_object_set(AGS_AUDIO_UNIT_DEVIN(audio_unit_devin), "audio-unit-client", audio_unit_client, "device", str, NULL); g_free(str); /* register ports */ audio_unit_port = ags_audio_unit_port_new((GObject *) audio_unit_client); str = g_strdup_printf("ags-soundcard%d", n_soundcards); g_object_set(audio_unit_port, "audio-unit-device", audio_unit_devin, NULL); ags_audio_unit_client_add_port(audio_unit_client, (GObject *) audio_unit_port); g_object_set(audio_unit_devin, "audio-unit-port", audio_unit_port, NULL); audio_unit_devin->port_name = (gchar **) malloc(2 * sizeof(gchar *)); audio_unit_devin->port_name[0] = g_strdup(str); audio_unit_devin->port_name[1] = NULL; ags_audio_unit_port_register(audio_unit_port, str, TRUE, FALSE, FALSE); ags_audio_unit_devin_realloc_buffer(audio_unit_devin); g_object_set(audio_unit_client, "device", audio_unit_devin, NULL); /* increment n-soundcards */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->n_soundcards += 1; g_rec_mutex_unlock(audio_unit_server_mutex); } return(soundcard); } void ags_audio_unit_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard) { AgsAudioUnitServer *audio_unit_server; AgsAudioUnitClient *audio_unit_client; AgsAudioUnitClient *default_client; AgsAudioUnitClient *input_client; GList *list_start, *list; GList *port; GRecMutex *audio_unit_server_mutex; audio_unit_server = AGS_AUDIO_UNIT_SERVER(sound_server); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* the default client */ g_object_get(audio_unit_server, "default-audio-unit-client", &default_client, "input-audio-unit-client", &input_client, NULL); audio_unit_client = default_client; if(AGS_IS_AUDIO_UNIT_DEVIN(soundcard) && input_client != NULL){ audio_unit_client = input_client; } if(audio_unit_client == NULL){ g_warning("GSequencer - no audio unit client"); return; } if(AGS_IS_AUDIO_UNIT_DEVOUT(soundcard)){ g_object_get(soundcard, "audio-unit-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_audio_unit_port_unregister(list->data); ags_audio_unit_client_remove_port(audio_unit_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if(AGS_IS_AUDIO_UNIT_DEVIN(soundcard)){ g_object_get(soundcard, "audio-unit-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_audio_unit_port_unregister(list->data); ags_audio_unit_client_remove_port(audio_unit_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); } ags_audio_unit_client_remove_device(audio_unit_client, soundcard); g_object_get(audio_unit_client, "port", &port, NULL); if(port == NULL){ /* reset n-soundcards */ g_rec_mutex_lock(audio_unit_server_mutex); audio_unit_server->n_soundcards = 0; g_rec_mutex_unlock(audio_unit_server_mutex); } g_list_free_full(port, g_object_unref); } GObject* ags_audio_unit_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output) { g_message("GSequencer - can't register audio-unit sequencer"); return(NULL); } void ags_audio_unit_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer) { g_message("GSequencer - can't unregister audio-unit sequencer"); } /** * ags_audio_unit_server_register_default_soundcard: * @audio_unit_server: the #AgsAudioUnitServer * * Register default soundcard. * * Returns: the instantiated #AgsAudioUnitDevout * * Since: 3.0.0 */ GObject* ags_audio_unit_server_register_default_soundcard(AgsAudioUnitServer *audio_unit_server) { AgsAudioUnitClient *default_client; AgsAudioUnitDevout *audio_unit_devout; AgsAudioUnitPort *audio_unit_port; AgsApplicationContext *application_context; gchar *str; guint n_soundcards; guint i; GRecMutex *audio_unit_server_mutex; GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server)){ return(NULL); } application_context = ags_application_context_get_instance(); /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* get some fields */ g_rec_mutex_lock(audio_unit_server_mutex); default_client = (AgsAudioUnitClient *) audio_unit_server->default_client; n_soundcards = audio_unit_server->n_soundcards; g_rec_mutex_unlock(audio_unit_server_mutex); /* the default client */ g_object_get(audio_unit_server, "default-audio-unit-client", &default_client, NULL); /* the default client */ if(default_client == NULL){ default_client = ags_audio_unit_client_new((GObject *) audio_unit_server); g_object_set(audio_unit_server, "default-audio-unit-client", default_client, NULL); ags_audio_unit_server_add_client(audio_unit_server, (GObject *) default_client); ags_audio_unit_client_open((AgsAudioUnitClient *) audio_unit_server->default_client, "ags-default-client"); } /* get audio unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(default_client); /* the soundcard */ audio_unit_devout = ags_audio_unit_devout_new(application_context); g_object_set(AGS_AUDIO_UNIT_DEVOUT(audio_unit_devout), "audio-unit-client", default_client, "device", "ags-default-devout", NULL); /* register ports */ audio_unit_port = ags_audio_unit_port_new((GObject *) default_client); g_object_set(audio_unit_port, "audio-unit-device", audio_unit_devout, NULL); ags_audio_unit_client_add_port(default_client, (GObject *) audio_unit_port); g_object_set(audio_unit_devout, "audio-unit-port", audio_unit_port, NULL); str = g_strdup_printf("ags-default-soundcard"); #ifdef AGS_DEBUG g_message("%s", str); #endif audio_unit_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); audio_unit_devout->port_name[0] = g_strdup(str); audio_unit_devout->port_name[1] = NULL; ags_audio_unit_port_register(audio_unit_port, str, TRUE, FALSE, TRUE); g_free(str); g_object_set(default_client, "device", audio_unit_devout, NULL); return((GObject *) audio_unit_devout); } /** * ags_audio_unit_server_find_url: * @audio_unit_server: (element-type AgsAudio.AudioUnitServer) (transfer none): the #GList-struct containing #AgsAudioUnitServer * @url: the url to find * * Find #AgsAudioUnitServer by url. * * Returns: (element-type AgsAudio.AudioUnitServer) (transfer none): the next matching #GList-struct containing a #AgsAudioUnitServer matching @url or %NULL * * Since: 3.0.0 */ GList* ags_audio_unit_server_find_url(GList *audio_unit_server, gchar *url) { GList *retval; GRecMutex *audio_unit_server_mutex; retval = NULL; while(audio_unit_server != NULL){ /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server->data); /* check URL */ g_rec_mutex_lock(audio_unit_server_mutex); if(!g_ascii_strcasecmp(AGS_AUDIO_UNIT_SERVER(audio_unit_server->data)->url, url)){ retval = audio_unit_server; g_rec_mutex_unlock(audio_unit_server_mutex); break; } g_rec_mutex_unlock(audio_unit_server_mutex); audio_unit_server = audio_unit_server->next; } return(retval); } /** * ags_audio_unit_server_find_client: * @audio_unit_server: the #AgsAudioUnitServer * @client_uuid: the uuid to find * * Find #AgsAudioUnitClient by uuid. * * Returns: (transfer none): the #AgsAudioUnitClient found or %NULL * * Since: 3.0.0 */ GObject* ags_audio_unit_server_find_client(AgsAudioUnitServer *audio_unit_server, gchar *client_uuid) { AgsAudioUnitClient *retval; GList *start_list, *list; GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server)){ return(NULL); } /* get some fields */ g_object_get(audio_unit_server, "audio-unit-client", &start_list, NULL); list = start_list; retval = NULL; while(list != NULL){ /* get audio unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(list->data); /* check client UUID */ g_rec_mutex_lock(audio_unit_client_mutex); if(!g_ascii_strcasecmp(AGS_AUDIO_UNIT_CLIENT(list->data)->client_uuid, client_uuid)){ retval = list->data; g_rec_mutex_unlock(audio_unit_client_mutex); break; } g_rec_mutex_unlock(audio_unit_client_mutex); list = list->next; } g_list_free_full(start_list, g_object_unref); return((GObject *) retval); } /** * ags_audio_unit_server_find_port: * @audio_unit_server: the #AgsAudioUnitServer * @port_uuid: the uuid to find * * Find #AgsAudioUnitPort by uuid. * * Returns: (transfer none): the #AgsAudioUnitPort found or %NULL * * Since: 3.0.0 */ GObject* ags_audio_unit_server_find_port(AgsAudioUnitServer *audio_unit_server, gchar *port_uuid) { GList *client_start, *client; GList *port_start, *port; gboolean success; GRecMutex *audio_unit_port_mutex; g_object_get(audio_unit_server, "audio-unit-client", &client_start, NULL); client = client_start; while(client != NULL){ g_object_get(audio_unit_server, "audio-unit-port", &port_start, NULL); port = port_start; while(port != NULL){ /* get audio unit port mutex */ audio_unit_port_mutex = AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX(port->data); /* check port UUID */ g_rec_mutex_lock(audio_unit_port_mutex); success = (!g_ascii_strcasecmp(AGS_AUDIO_UNIT_PORT(port->data)->port_uuid, port_uuid)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_unit_port_mutex); if(success){ AgsAudioUnitPort *retval; retval = port->data; g_list_free(client_start); g_list_free(port_start); return(retval); } /* iterate */ port = port->next; } g_list_free(port_start); /* iterate */ client = client->next; } g_list_free(client_start); return(NULL); } /** * ags_audio_unit_server_add_client: * @audio_unit_server: the #AgsAudioUnitServer * @audio_unit_client: the #AgsAudioUnitClient to add * * Add @audio_unit_client to @audio_unit_server * * Since: 3.0.0 */ void ags_audio_unit_server_add_client(AgsAudioUnitServer *audio_unit_server, GObject *audio_unit_client) { GRecMutex *audio_unit_server_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server) || !AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* get some fields */ g_rec_mutex_lock(audio_unit_server_mutex); if(g_list_find(audio_unit_server->client, audio_unit_client) == NULL){ g_object_ref(audio_unit_client); audio_unit_server->client = g_list_prepend(audio_unit_server->client, audio_unit_client); } g_rec_mutex_unlock(audio_unit_server_mutex); } /** * ags_audio_unit_server_remove_client: * @audio_unit_server: the #AgsAudioUnitServer * @audio_unit_client: the #AgsAudioUnitClient to remove * * Remove @audio_unit_client to @audio_unit_server * * Since: 3.0.0 */ void ags_audio_unit_server_remove_client(AgsAudioUnitServer *audio_unit_server, GObject *audio_unit_client) { GRecMutex *audio_unit_server_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server) || !AGS_IS_AUDIO_UNIT_CLIENT(audio_unit_client)){ return; } /* get audio unit server mutex */ audio_unit_server_mutex = AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX(audio_unit_server); /* get some fields */ g_rec_mutex_lock(audio_unit_server_mutex); if(g_list_find(audio_unit_server->client, audio_unit_client) != NULL){ audio_unit_server->client = g_list_remove(audio_unit_server->client, audio_unit_client); g_object_unref(audio_unit_client); } g_rec_mutex_unlock(audio_unit_server_mutex); } /** * ags_audio_unit_server_connect_client: * @audio_unit_server: the #AgsAudioUnitServer * * Connect all clients. * * Since: 3.0.0 */ void ags_audio_unit_server_connect_client(AgsAudioUnitServer *audio_unit_server) { GList *client_start, *client; gchar *client_name; GRecMutex *audio_unit_client_mutex; if(!AGS_IS_AUDIO_UNIT_SERVER(audio_unit_server)){ return; } g_object_get(audio_unit_server, "audio-unit-client", &client_start, NULL); client = client_start; while(client != NULL){ /* get audio unit client mutex */ audio_unit_client_mutex = AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX(client->data); /* client name */ g_rec_mutex_lock(audio_unit_client_mutex); client_name = g_strdup(AGS_AUDIO_UNIT_CLIENT(client->data)->client_name); g_rec_mutex_unlock(audio_unit_client_mutex); /* open */ ags_audio_unit_client_open((AgsAudioUnitClient *) client->data, client_name); ags_audio_unit_client_activate(client->data); g_free(client_name); /* iterate */ client = client->next; } g_list_free(client_start); } /** * ags_audio_unit_server_new: * @url: the URL as string * * Create a new instance of #AgsAudioUnitServer. * * Returns: the new #AgsAudioUnitServer * * Since: 3.0.0 */ AgsAudioUnitServer* ags_audio_unit_server_new(gchar *url) { AgsAudioUnitServer *audio_unit_server; audio_unit_server = (AgsAudioUnitServer *) g_object_new(AGS_TYPE_AUDIO_UNIT_SERVER, "url", url, NULL); return(audio_unit_server); } gsequencer-3.1.3/ags/audio/ags_recall_lv2.h0000644000175000017500000000655513607210263015516 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_LV2_H__ #define __AGS_RECALL_LV2_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_LV2 (ags_recall_lv2_get_type()) #define AGS_RECALL_LV2(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_LV2, AgsRecallLv2)) #define AGS_RECALL_LV2_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_LV2, AgsRecallLv2Class)) #define AGS_IS_RECALL_LV2(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_LV2)) #define AGS_IS_RECALL_LV2_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_LV2)) #define AGS_RECALL_LV2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_LV2, AgsRecallLv2Class)) typedef struct _AgsRecallLv2 AgsRecallLv2; typedef struct _AgsRecallLv2Class AgsRecallLv2Class; /** * AgsRecallLv2FLags: * @AGS_RECALL_LV2_HAS_EVENT_PORT: has event port * @AGS_RECALL_LV2_HAS_ATOM_PORT: has atom port * @AGS_RECALL_LV2_HAS_WORKER: has worker * * Enum values to control the behavior or indicate internal state of #AgsRecallLv2 by * enable/disable as flags. */ typedef enum{ AGS_RECALL_LV2_HAS_EVENT_PORT = 1, AGS_RECALL_LV2_HAS_ATOM_PORT = 1 << 1, AGS_RECALL_LV2_HAS_WORKER = 1 << 2, }AgsRecallLv2FLags; struct _AgsRecallLv2 { AgsRecallChannel recall_channel; guint flags; AgsTurtle *turtle; gchar *uri; AgsLv2Plugin *plugin; LV2_Descriptor *plugin_descriptor; guint *input_port; guint input_lines; guint *output_port; guint output_lines; guint event_port; guint atom_port; guint bank; guint program; }; struct _AgsRecallLv2Class { AgsRecallChannelClass recall_channel; }; GType ags_recall_lv2_get_type(); gboolean ags_recall_lv2_test_flags(AgsRecallLv2 *recall_lv2, guint flags); void ags_recall_lv2_set_flags(AgsRecallLv2 *recall_lv2, guint flags); void ags_recall_lv2_unset_flags(AgsRecallLv2 *recall_lv2, guint flags); void ags_recall_lv2_load(AgsRecallLv2 *recall_lv2); GList* ags_recall_lv2_load_ports(AgsRecallLv2 *recall_lv2); void ags_recall_lv2_load_conversion(AgsRecallLv2 *recall_lv2, GObject *port, gpointer plugin_port); GList* ags_recall_lv2_find(GList *recall, gchar *filename, gchar *effect); AgsRecallLv2* ags_recall_lv2_new(AgsChannel *source, AgsTurtle *turtle, gchar *filename, gchar *effect, gchar *uri, guint effect_index); G_END_DECLS #endif /*__AGS_RECALL_LV2_H__*/ gsequencer-3.1.3/ags/audio/ags_acceleration.h0000644000175000017500000000720213616617253016122 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ACCELERATION_H__ #define __AGS_ACCELERATION_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_ACCELERATION (ags_acceleration_get_type()) #define AGS_ACCELERATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_ACCELERATION, AgsAcceleration)) #define AGS_ACCELERATION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_ACCELERATION, AgsAccelerationClass)) #define AGS_IS_ACCELERATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_ACCELERATION)) #define AGS_IS_ACCELERATION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_ACCELERATION)) #define AGS_ACCELERATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_ACCELERATION, AgsAccelerationClass)) #define AGS_ACCELERATION_GET_OBJ_MUTEX(obj) (&(((AgsAcceleration *) obj)->obj_mutex)) typedef struct _AgsAcceleration AgsAcceleration; typedef struct _AgsAccelerationClass AgsAccelerationClass; /** * AgsAccelerationFlags: * @AGS_ACCELERATION_DEFAULT_START: if start is default start point * @AGS_ACCELERATION_DEFAULT_END: if end is default end point * @AGS_ACCELERATION_GUI: interpret x and y as GUI format * @AGS_ACCELERATION_RUNTIME: interpret x and y as runtime formant * @AGS_ACCELERATION_HUMAN_READABLE: interpret x and y as human readable * @AGS_ACCELERATION_DEFAULT_LENGTH: if default length applies * @AGS_ACCELERATION_IS_SELECTED: if the acceleration is selected */ typedef enum{ AGS_ACCELERATION_DEFAULT_START = 1, AGS_ACCELERATION_DEFAULT_END = 1 << 1, AGS_ACCELERATION_GUI = 1 << 2, AGS_ACCELERATION_RUNTIME = 1 << 3, AGS_ACCELERATION_HUMAN_READABLE = 1 << 4, AGS_ACCELERATION_DEFAULT_LENGTH = 1 << 5, AGS_ACCELERATION_IS_SELECTED = 1 << 6, }AgsAccelerationFlags; struct _AgsAcceleration { GObject gobject; guint flags; GRecMutex obj_mutex; // gui format, convert easy to visualization guint x; gdouble y; gchar *acceleration_name; }; struct _AgsAccelerationClass { GObjectClass gobject; }; GType ags_acceleration_get_type(); GRecMutex* ags_acceleration_get_obj_mutex(AgsAcceleration *acceleration); gboolean ags_acceleration_test_flags(AgsAcceleration *acceleration, guint flags); void ags_acceleration_set_flags(AgsAcceleration *acceleration, guint flags); void ags_acceleration_unset_flags(AgsAcceleration *acceleration, guint flags); gint ags_acceleration_sort_func(gconstpointer a, gconstpointer b); guint ags_acceleration_get_x(AgsAcceleration *acceleration); void ags_acceleration_set_x(AgsAcceleration *acceleration, guint x); gdouble ags_acceleration_get_y(AgsAcceleration *acceleration); void ags_acceleration_set_y(AgsAcceleration *acceleration, gdouble y); AgsAcceleration* ags_acceleration_duplicate(AgsAcceleration *acceleration); AgsAcceleration* ags_acceleration_new(); G_END_DECLS #endif /*__AGS_ACCELERATION_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_factory.c0000644000175000017500000110020213607210263016436 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_factory_class_init(AgsRecallFactoryClass *recall_factory_class); void ags_recall_factory_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_factory_init(AgsRecallFactory *recall_factory); GList* ags_recall_factory_create_play(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_play_master(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_prepare(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_copy(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_feed(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_stream(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_rt_stream(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_buffer(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_delay(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_count_beats(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_loop(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_copy_pattern(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_play_wave(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_capture_wave(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_play_dssi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_play_lv2(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_play_notation(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_peak(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_analyse(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_mute(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_volume(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_eq10(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_envelope(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_lfo(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_ladspa(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_lv2(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_dssi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_record_midi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_route_dssi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); GList* ags_recall_factory_create_route_lv2(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); /** * SECTION:ags_recall_factory * @short_description: Factory pattern * @title: AgsRecallFactory * @section_id: * @include: ags/audio/ags_recall_factory.h * * #AgsRecallFactory instantiates and sets up recalls. */ static gpointer ags_recall_factory_parent_class = NULL; GType ags_recall_factory_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_factory = 0; static const GTypeInfo ags_recall_factory_info = { sizeof (AgsRecallFactoryClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_factory_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallFactory), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_factory_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_factory_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_factory = g_type_register_static(G_TYPE_OBJECT, "AgsRecallFactory", &ags_recall_factory_info, 0); g_type_add_interface_static(ags_type_recall_factory, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_factory); } return g_define_type_id__volatile; } void ags_recall_factory_class_init(AgsRecallFactoryClass *recall_factory) { ags_recall_factory_parent_class = g_type_class_peek_parent(recall_factory); } void ags_recall_factory_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->add_to_registry = NULL; connectable->remove_from_registry = NULL; connectable->connect = NULL; connectable->disconnect = NULL; } void ags_recall_factory_init(AgsRecallFactory *recall_factory) { } GList* ags_recall_factory_create_play(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPlayChannel *play_channel; AgsPlayChannelRun *play_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsPlayChannel */ play_channel = (AgsPlayChannel *) g_object_new(AGS_TYPE_PLAY_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel, (AGS_SOUND_ABILITY_PLAYBACK)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); play_channel->audio_channel->port_value.ags_port_uint = start_audio_channel + j; ags_channel_add_recall(channel, (GObject *) play_channel, TRUE); recall = g_list_prepend(recall, play_channel); g_object_set(play_container, "recall-channel", play_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel)); /* AgsPlayChannelRun */ play_channel_run = (AgsPlayChannelRun *) g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, "recall-channel", play_channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel_run, (AGS_SOUND_ABILITY_PLAYBACK)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_channel_run, TRUE); recall = g_list_prepend(recall, play_channel_run); g_object_set(play_container, "recall-channel-run", play_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsPlayChannel */ play_channel = (AgsPlayChannel *) g_object_new(AGS_TYPE_PLAY_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel, (AGS_SOUND_ABILITY_PLAYBACK)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); play_channel->audio_channel->port_value.ags_port_uint = start_audio_channel + j; ags_channel_add_recall(channel, (GObject *) play_channel, FALSE); recall = g_list_prepend(recall, play_channel); g_object_set(recall_container, "recall-channel", play_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel)); /* AgsPlayChannelRun */ play_channel_run = (AgsPlayChannelRun *) g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, "recall-channel", play_channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel_run, (AGS_SOUND_ABILITY_PLAYBACK)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_channel_run, FALSE); recall = g_list_prepend(recall, play_channel_run); g_object_set(recall_container, "recall-channel-run", play_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_play_master(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPlayAudio *play_audio; AgsPlayChannel *play_channel; AgsPlayChannelRunMaster *play_channel_run_master; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); /* */ play_audio = (AgsPlayAudio *) g_object_new(AGS_TYPE_PLAY_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_audio, TRUE); recall = g_list_prepend(recall, play_audio); }else{ if(play_container == NULL){ g_object_get(audio, "play", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_PLAY_AUDIO); play_audio = AGS_PLAY_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_audio); g_object_get(play_audio, "recall-container", &play_container, NULL); g_object_unref(play_container); }else{ g_object_get(play_container, "recall-audio", &play_audio, NULL); g_object_unref(play_audio); recall = g_list_prepend(recall, play_audio); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsPlayChannel */ play_channel = (AgsPlayChannel *) g_object_new(AGS_TYPE_PLAY_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); play_channel->audio_channel->port_value.ags_port_uint = start_audio_channel + j; ags_channel_add_recall(channel, (GObject *) play_channel, TRUE); recall = g_list_prepend(recall, play_channel); g_object_set(play_container, "recall-channel", play_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel)); /* AgsPlayChannelRun */ play_channel_run_master = (AgsPlayChannelRunMaster *) g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN_MASTER, "output-soundcard", output_soundcard, "source", channel, "recall-channel", play_channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel_run_master, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel_run_master, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel_run_master, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_channel_run_master, TRUE); recall = g_list_prepend(recall, play_channel_run_master); g_object_set(play_container, "recall-channel-run", play_channel_run_master, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel_run_master)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); /* */ play_audio = (AgsPlayAudio *) g_object_new(AGS_TYPE_PLAY_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_audio, FALSE); recall = g_list_prepend(recall, play_audio); }else{ if(recall_container == NULL){ g_object_get(audio, "recall", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_PLAY_AUDIO); play_audio = AGS_PLAY_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_audio); g_object_get(play_audio, "recall-container", &recall_container, NULL); g_object_unref(recall_container); }else{ g_object_get(recall_container, "recall-audio", &play_audio, NULL); g_object_unref(play_audio); recall = g_list_prepend(recall, play_audio); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsPlayChannel */ play_channel = (AgsPlayChannel *) g_object_new(AGS_TYPE_PLAY_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); play_channel->audio_channel->port_value.ags_port_uint = start_audio_channel + j; ags_channel_add_recall(channel, (GObject *) play_channel, FALSE); recall = g_list_prepend(recall, play_channel); g_object_set(recall_container, "recall-channel", play_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel)); /* AgsPlayChannelRun */ play_channel_run_master = (AgsPlayChannelRunMaster *) g_object_new(AGS_TYPE_PLAY_CHANNEL_RUN_MASTER, "output-soundcard", output_soundcard, "source", channel, "recall-channel", play_channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_channel_run_master, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_channel_run_master, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_channel_run_master, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_channel_run_master, FALSE); recall = g_list_prepend(recall, play_channel_run_master); g_object_set(recall_container, "recall-channel-run", play_channel_run_master, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_channel_run_master)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_prepare(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPrepareChannel *prepare_channel; AgsPrepareChannelRun *prepare_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_pad, *next_channel, *nth_channel, *current; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; GRecMutex *current_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ gboolean found_prepare; channel = start; if(channel != NULL){ g_object_ref(channel); } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ current = ags_channel_nth(start_output, start_audio_channel + j); /* check output */ while(current != NULL){ /* get channel mutex */ current_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current); /* check output present */ g_object_get(channel, "play", &list_start, NULL); list = list_start; found_prepare = FALSE; while((list = ags_recall_template_find_type(list, AGS_TYPE_PREPARE_CHANNEL)) != NULL){ AgsChannel *current_destination; g_object_get(list->data, "destination", ¤t_destination, NULL); if(current_destination == current){ found_prepare = TRUE; break; } list = list->next; } g_list_free_full(list_start, g_object_unref); if(found_prepare){ /* iterate - current */ g_rec_mutex_lock(current_mutex); current = current->next_pad; g_rec_mutex_unlock(current_mutex); continue; } if(play_container == NULL){ play_container = ags_recall_container_new(); play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); } ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsPrepareChannel */ prepare_channel = (AgsPrepareChannel *) g_object_new(AGS_TYPE_PREPARE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "destination", current, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) prepare_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) prepare_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) prepare_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) prepare_channel, TRUE); recall = g_list_prepend(recall, prepare_channel); g_object_set(play_container, "recall-channel", prepare_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(prepare_channel)); /* AgsPrepareChannelRun */ prepare_channel_run = (AgsPrepareChannelRun *) g_object_new(AGS_TYPE_PREPARE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", prepare_channel, "source", channel, "destination", current, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) prepare_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) prepare_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) prepare_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) prepare_channel_run, TRUE); recall = g_list_prepend(recall, prepare_channel_run); g_object_set(play_container, "recall-channel-run", prepare_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(prepare_channel_run)); /* iterate */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ gboolean found_prepare; channel = start; if(channel != NULL){ g_object_ref(channel); } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ current = ags_channel_nth(start_output, start_audio_channel + j); /* check output */ while(current != NULL){ /* get channel mutex */ current_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current); /* check output present */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; found_prepare = FALSE; while((list = ags_recall_template_find_type(list, AGS_TYPE_PREPARE_CHANNEL)) != NULL){ AgsChannel *current_destination; g_object_get(list->data, "destination", ¤t_destination, NULL); if(current_destination == current){ found_prepare = TRUE; break; } list = list->next; } g_list_free_full(list_start, g_object_unref); if(found_prepare){ /* iterate */ g_rec_mutex_lock(current_mutex); current = current->next_pad; g_rec_mutex_unlock(current_mutex); continue; } if(recall_container == NULL){ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(audio, (GObject *) recall_container); } ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsPrepareChannel */ prepare_channel = (AgsPrepareChannel *) g_object_new(AGS_TYPE_PREPARE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "destination", current, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) prepare_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) prepare_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) prepare_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) prepare_channel, FALSE); recall = g_list_prepend(recall, prepare_channel); g_object_set(recall_container, "recall-channel", prepare_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(prepare_channel)); /* AgsPrepareChannelRun */ prepare_channel_run = (AgsPrepareChannelRun *) g_object_new(AGS_TYPE_PREPARE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", prepare_channel, "source", channel, "destination", current, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) prepare_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) prepare_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) prepare_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) prepare_channel_run, FALSE); recall = g_list_prepend(recall, prepare_channel_run); g_object_set(recall_container, "recall-channel-run", prepare_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(prepare_channel_run)); /* iterate */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_copy(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsCopyChannel *copy_channel; AgsCopyChannelRun *copy_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_pad, *next_channel, *nth_channel, *current; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; GRecMutex *current_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ gboolean found_copy; channel = start; if(channel != NULL){ g_object_ref(channel); } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ current = ags_channel_nth(start_output, start_audio_channel + j); /* check output */ while(current != NULL){ current_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current); /* check output present */ g_object_get(channel, "play", &list_start, NULL); list = list_start; found_copy = FALSE; while((list = ags_recall_template_find_type(list, AGS_TYPE_COPY_CHANNEL)) != NULL){ AgsChannel *current_destination; g_object_get(list->data, "destination", ¤t_destination, NULL); if(current_destination == current){ found_copy = TRUE; break; } list = list->next; } g_list_free_full(list_start, g_object_unref); if(found_copy){ /* iterate - current */ g_rec_mutex_lock(current_mutex); current = current->next_pad; g_rec_mutex_unlock(current_mutex); continue; } if(play_container == NULL){ play_container = ags_recall_container_new(); play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); } ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsCopyChannel */ copy_channel = (AgsCopyChannel *) g_object_new(AGS_TYPE_COPY_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "destination", current, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) copy_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) copy_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_channel, TRUE); recall = g_list_prepend(recall, copy_channel); g_object_set(play_container, "recall-channel", copy_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_channel)); /* AgsCopyChannelRun */ copy_channel_run = (AgsCopyChannelRun *) g_object_new(AGS_TYPE_COPY_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", copy_channel, "source", channel, "destination", current, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) copy_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) copy_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_channel_run, TRUE); recall = g_list_prepend(recall, copy_channel_run); g_object_set(play_container, "recall-channel-run", copy_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_channel_run)); /* iterate */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ gboolean found_copy; channel = start; if(channel != NULL){ g_object_ref(channel); } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ current = ags_channel_nth(start_output, start_audio_channel + j); /* check output */ while(current != NULL){ current_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current); /* check output present */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; found_copy = FALSE; while((list = ags_recall_template_find_type(list, AGS_TYPE_COPY_CHANNEL)) != NULL){ AgsChannel *current_destination; g_object_get(list->data, "destination", ¤t_destination, NULL); if(current_destination == current){ found_copy = TRUE; break; } list = list->next; } g_list_free_full(list_start, g_object_unref); if(found_copy){ /* iterate */ g_rec_mutex_lock(current_mutex); current = current->next_pad; g_rec_mutex_unlock(current_mutex); continue; } if(recall_container == NULL){ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(audio, (GObject *) recall_container); } ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsCopyChannel */ copy_channel = (AgsCopyChannel *) g_object_new(AGS_TYPE_COPY_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "destination", current, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) copy_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) copy_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_channel, FALSE); recall = g_list_prepend(recall, copy_channel); g_object_set(recall_container, "recall-channel", copy_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_channel)); /* AgsCopyChannelRun */ copy_channel_run = (AgsCopyChannelRun *) g_object_new(AGS_TYPE_COPY_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", copy_channel, "source", channel, "destination", current, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) copy_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) copy_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_channel_run, FALSE); recall = g_list_prepend(recall, copy_channel_run); g_object_set(recall_container, "recall-channel-run", copy_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_channel_run)); /* iterate */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_feed(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsFeedChannel *feed_channel; AgsFeedChannelRun *feed_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsFeedChannel */ feed_channel = (AgsFeedChannel *) g_object_new(AGS_TYPE_FEED_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) feed_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) feed_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) feed_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) feed_channel, TRUE); recall = g_list_prepend(recall, feed_channel); g_object_set(play_container, "recall-channel", feed_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(feed_channel)); /* AgsFeedChannelRun */ feed_channel_run = (AgsFeedChannelRun *) g_object_new(AGS_TYPE_FEED_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", feed_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) feed_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) feed_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) feed_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) feed_channel_run, TRUE); recall = g_list_prepend(recall, feed_channel_run); g_object_set(play_container, "recall-channel-run", feed_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(feed_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsFeedChannel */ feed_channel = (AgsFeedChannel *) g_object_new(AGS_TYPE_FEED_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) feed_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) feed_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) feed_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) feed_channel, FALSE); recall = g_list_prepend(recall, feed_channel); g_object_set(recall_container, "recall-channel", feed_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(feed_channel)); /* AgsFeedChannelRun */ feed_channel_run = (AgsFeedChannelRun *) g_object_new(AGS_TYPE_FEED_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", feed_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) feed_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) feed_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) feed_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) feed_channel_run, FALSE); recall = g_list_prepend(recall, feed_channel_run); g_object_set(recall_container, "recall-channel-run", feed_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(feed_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_stream(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsStreamChannel *stream_channel; AgsStreamChannelRun *stream_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsStreamChannel */ stream_channel = (AgsStreamChannel *) g_object_new(AGS_TYPE_STREAM_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) stream_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) stream_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) stream_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) stream_channel, TRUE); recall = g_list_prepend(recall, stream_channel); g_object_set(play_container, "recall-channel", stream_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(stream_channel)); /* AgsStreamChannelRun */ stream_channel_run = (AgsStreamChannelRun *) g_object_new(AGS_TYPE_STREAM_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", stream_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) stream_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) stream_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) stream_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) stream_channel_run, TRUE); recall = g_list_prepend(recall, stream_channel_run); g_object_set(play_container, "recall-channel-run", stream_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(stream_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsStreamChannel */ stream_channel = (AgsStreamChannel *) g_object_new(AGS_TYPE_STREAM_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) stream_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) stream_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) stream_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) stream_channel, FALSE); recall = g_list_prepend(recall, stream_channel); g_object_set(recall_container, "recall-channel", stream_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(stream_channel)); /* AgsStreamChannelRun */ stream_channel_run = (AgsStreamChannelRun *) g_object_new(AGS_TYPE_STREAM_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", stream_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) stream_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) stream_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) stream_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) stream_channel_run, FALSE); recall = g_list_prepend(recall, stream_channel_run); g_object_set(recall_container, "recall-channel-run", stream_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(stream_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_rt_stream(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRtStreamChannel *rt_stream_channel; AgsRtStreamChannelRun *rt_stream_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsRtStreamChannel */ rt_stream_channel = (AgsRtStreamChannel *) g_object_new(AGS_TYPE_RT_STREAM_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) rt_stream_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) rt_stream_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) rt_stream_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) rt_stream_channel, TRUE); recall = g_list_prepend(recall, rt_stream_channel); g_object_set(play_container, "recall-channel", rt_stream_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(rt_stream_channel)); /* AgsRtStreamChannelRun */ rt_stream_channel_run = (AgsRtStreamChannelRun *) g_object_new(AGS_TYPE_RT_STREAM_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", rt_stream_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) rt_stream_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) rt_stream_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) rt_stream_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) rt_stream_channel_run, TRUE); recall = g_list_prepend(recall, rt_stream_channel_run); g_object_set(play_container, "recall-channel-run", rt_stream_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(rt_stream_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsRtStreamChannel */ rt_stream_channel = (AgsRtStreamChannel *) g_object_new(AGS_TYPE_RT_STREAM_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) rt_stream_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) rt_stream_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) rt_stream_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) rt_stream_channel, FALSE); recall = g_list_prepend(recall, rt_stream_channel); g_object_set(recall_container, "recall-channel", rt_stream_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(rt_stream_channel)); /* AgsRtStreamChannelRun */ rt_stream_channel_run = (AgsRtStreamChannelRun *) g_object_new(AGS_TYPE_RT_STREAM_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", rt_stream_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) rt_stream_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) rt_stream_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) rt_stream_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) rt_stream_channel_run, FALSE); recall = g_list_prepend(recall, rt_stream_channel_run); g_object_set(recall_container, "recall-channel-run", rt_stream_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(rt_stream_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_buffer(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsBufferChannel *buffer_channel; AgsBufferChannelRun *buffer_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_pad, *nth_channel, *current; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint output_pads, input_pads; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; output_pads = audio->output_pads; input_pads = audio->input_pads; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = start_output; if(start != NULL){ g_object_ref(start); } }else{ start = start_input; if(start != NULL){ g_object_ref(start); } } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ gboolean found_buffer; for(i = start_pad; i < stop_pad && i < input_pads; i++){ for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ channel = ags_channel_nth(start, i * audio_channels + start_audio_channel + j); if(channel == NULL){ break; } current = ags_channel_nth(start_output, start_audio_channel + j); /* check output */ next_pad = NULL; while(current != NULL){ /* check output present */ g_object_get(channel, "play", &list_start, NULL); list = list_start; found_buffer = FALSE; while((list = ags_recall_template_find_type(list, AGS_TYPE_BUFFER_CHANNEL)) != NULL){ AgsChannel *current_destination; g_object_get(list->data, "destination", ¤t_destination, NULL); if(current_destination == current){ found_buffer = TRUE; break; } list = list->next; } g_list_free_full(list_start, g_object_unref); if(found_buffer){ /* iterate - current */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; continue; } if(play_container == NULL){ play_container = ags_recall_container_new(); play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); } ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsBufferChannel */ buffer_channel = (AgsBufferChannel *) g_object_new(AGS_TYPE_BUFFER_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "destination", current, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) buffer_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) buffer_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) buffer_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) buffer_channel, TRUE); recall = g_list_prepend(recall, buffer_channel); g_object_set(play_container, "recall-channel", buffer_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(buffer_channel)); /* AgsBufferChannelRun */ buffer_channel_run = (AgsBufferChannelRun *) g_object_new(AGS_TYPE_BUFFER_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", buffer_channel, "source", channel, "destination", current, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) buffer_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) buffer_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) buffer_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) buffer_channel_run, TRUE); recall = g_list_prepend(recall, buffer_channel_run); g_object_set(play_container, "recall-channel-run", buffer_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(buffer_channel_run)); /* iterate - current */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } g_object_unref(channel); } } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ gboolean found_buffer; for(i = start_pad; i < stop_pad && i < input_pads; i++){ for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ channel = ags_channel_nth(start, i * audio_channels + start_audio_channel + j); if(channel == NULL){ break; } current = ags_channel_nth(start_output, start_audio_channel + j); /* check output */ next_pad = NULL; while(current != NULL){ /* check output present */ g_object_get(channel, "recall", &list_start, NULL); list = list_start; found_buffer = FALSE; while((list = ags_recall_template_find_type(list, AGS_TYPE_BUFFER_CHANNEL)) != NULL){ AgsChannel *current_destination; g_object_get(list->data, "destination", ¤t_destination, NULL); if(current_destination == current){ found_buffer = TRUE; break; } list = list->next; } g_list_free_full(list_start, g_object_unref); if(found_buffer){ /* iterate - current */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; continue; } if(recall_container == NULL){ recall_container = ags_recall_container_new(); ags_audio_add_recall_container(audio, (GObject *) recall_container); } ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsBufferChannel */ buffer_channel = (AgsBufferChannel *) g_object_new(AGS_TYPE_BUFFER_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "destination", current, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) buffer_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) buffer_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) buffer_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) buffer_channel, FALSE); recall = g_list_prepend(recall, buffer_channel); g_object_set(recall_container, "recall-channel", buffer_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(buffer_channel)); /* AgsBufferChannelRun */ buffer_channel_run = (AgsBufferChannelRun *) g_object_new(AGS_TYPE_BUFFER_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", buffer_channel, "source", channel, "destination", current, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) buffer_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) buffer_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) buffer_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) buffer_channel_run, FALSE); recall = g_list_prepend(recall, buffer_channel_run); g_object_set(recall_container, "recall-channel-run", buffer_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(buffer_channel_run)); /* iterate - current */ next_pad = ags_channel_next_pad(current); g_object_unref(current); current = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } g_object_unref(channel); } } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_delay(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsDelayAudio *delay_audio; AgsDelayAudioRun *delay_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); delay_audio = (AgsDelayAudio *) g_object_new(AGS_TYPE_DELAY_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) delay_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) delay_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) delay_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) delay_audio, TRUE); recall = g_list_prepend(recall, delay_audio); g_object_set(play_container, "recall-audio", delay_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(delay_audio)); delay_audio_run = (AgsDelayAudioRun *) g_object_new(AGS_TYPE_DELAY_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", delay_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) delay_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) delay_audio_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) delay_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) delay_audio_run, TRUE); recall = g_list_prepend(recall, delay_audio_run); g_object_set(play_container, "recall-audio-run", delay_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(delay_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); delay_audio = (AgsDelayAudio *) g_object_new(AGS_TYPE_DELAY_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) delay_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) delay_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) delay_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) delay_audio, FALSE); recall = g_list_prepend(recall, delay_audio); g_object_set(recall_container, "recall-audio", delay_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(delay_audio)); delay_audio_run = (AgsDelayAudioRun *) g_object_new(AGS_TYPE_DELAY_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", delay_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) delay_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) delay_audio_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) delay_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) delay_audio_run, FALSE); recall = g_list_prepend(recall, delay_audio_run); g_object_set(recall_container, "recall-audio-run", delay_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(delay_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_count_beats(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsCountBeatsAudio *count_beats_audio; AgsCountBeatsAudioRun *count_beats_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); count_beats_audio = (AgsCountBeatsAudio *) g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) count_beats_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) count_beats_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) count_beats_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) count_beats_audio, TRUE); recall = g_list_prepend(recall, count_beats_audio); g_object_set(play_container, "recall-audio", count_beats_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(count_beats_audio)); count_beats_audio_run = (AgsCountBeatsAudioRun *) g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", count_beats_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) count_beats_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) count_beats_audio_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) count_beats_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) count_beats_audio_run, TRUE); recall = g_list_prepend(recall, count_beats_audio_run); g_object_set(play_container, "recall-audio-run", count_beats_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(count_beats_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); count_beats_audio = (AgsCountBeatsAudio *) g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) count_beats_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) count_beats_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) count_beats_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) count_beats_audio, FALSE); recall = g_list_prepend(recall, count_beats_audio); g_object_set(recall_container, "recall-audio", count_beats_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(count_beats_audio)); count_beats_audio_run = (AgsCountBeatsAudioRun *) g_object_new(AGS_TYPE_COUNT_BEATS_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", count_beats_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) count_beats_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) count_beats_audio_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) count_beats_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) count_beats_audio_run, FALSE); recall = g_list_prepend(recall, count_beats_audio_run); g_object_set(recall_container, "recall-audio-run", count_beats_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(count_beats_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_loop(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsLoopChannel *loop_channel; AgsLoopChannelRun *loop_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); }else{ //TODO:JK: implement me } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsLoopChannel */ loop_channel = (AgsLoopChannel *) g_object_new(AGS_TYPE_LOOP_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, //TODO:JK: add missing dependency "delay_audio" NULL); ags_recall_set_flags((AgsRecall *) loop_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) loop_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) loop_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) loop_channel, TRUE); recall = g_list_prepend(recall, loop_channel); g_object_set(play_container, "recall-channel", loop_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(loop_channel)); /* AgsLoopChannelRun */ loop_channel_run = (AgsLoopChannelRun *) g_object_new(AGS_TYPE_LOOP_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, "recall-channel", loop_channel, "recall-container", play_container, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) loop_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) loop_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) loop_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) loop_channel_run, TRUE); recall = g_list_prepend(recall, loop_channel_run); g_object_set(play_container, "recall-channel-run", loop_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(loop_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); }else{ //TODO:JK: implement me } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsLoopChannel */ loop_channel = (AgsLoopChannel *) g_object_new(AGS_TYPE_LOOP_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, //TODO:JK: add missing dependency "delay_audio" NULL); ags_recall_set_flags((AgsRecall *) loop_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) loop_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) loop_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) loop_channel, FALSE); recall = g_list_prepend(recall, loop_channel); g_object_set(recall_container, "recall-channel", loop_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(loop_channel)); /* AgsLoopChannelRun */ loop_channel_run = (AgsLoopChannelRun *) g_object_new(AGS_TYPE_LOOP_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, "recall-channel", loop_channel, "recall-container", recall_container, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) loop_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) loop_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) loop_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) loop_channel_run, FALSE); recall = g_list_prepend(recall, loop_channel_run); g_object_set(recall_container, "recall-channel-run", loop_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(loop_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_copy_pattern(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsCopyPatternAudio *copy_pattern_audio; AgsCopyPatternAudioRun *copy_pattern_audio_run; AgsCopyPatternChannel *copy_pattern_channel; AgsCopyPatternChannelRun *copy_pattern_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0 || ags_recall_find_type(audio->play, AGS_TYPE_COPY_PATTERN_AUDIO) == NULL){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); /* AgsCopyPatternAudio */ copy_pattern_audio = (AgsCopyPatternAudio *) g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_audio, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) copy_pattern_audio, TRUE); recall = g_list_prepend(recall, copy_pattern_audio); g_object_set(play_container, "recall-audio", copy_pattern_audio, NULL); /* AgsCopyPatternAudioRun */ copy_pattern_audio_run = (AgsCopyPatternAudioRun *) g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO_RUN, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, "recall-audio", copy_pattern_audio, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_audio_run, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) copy_pattern_audio_run, TRUE); recall = g_list_prepend(recall, copy_pattern_audio_run); g_object_set(play_container, "recall-audio-run", copy_pattern_audio_run, NULL); }else{ if(play_container == NULL){ g_object_get(audio, "play", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_COPY_PATTERN_AUDIO); copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_list_free(list_start); recall = g_list_prepend(recall, copy_pattern_audio); g_object_get(copy_pattern_audio, "recall-container", &play_container, NULL); g_object_get(play_container, "recall-audio-run", &list_start, NULL); g_object_unref(play_container); list = ags_recall_find_template(list_start); copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, copy_pattern_audio_run); }else{ g_object_get(play_container, "recall-audio", ©_pattern_audio, NULL); g_object_unref(copy_pattern_audio); recall = g_list_prepend(recall, copy_pattern_audio); g_object_get(play_container, "recall-audio-run", &list_start, NULL); list = ags_recall_find_template(list_start); copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, copy_pattern_audio_run); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsCopyPatternChannel in channel->recall */ copy_pattern_channel = (AgsCopyPatternChannel *) g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, "recall-container", play_container, "recall-audio", copy_pattern_audio, // "pattern", channel->pattern->data, NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_channel, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_pattern_channel, TRUE); recall = g_list_prepend(recall, copy_pattern_channel); g_object_set(play_container, "recall-channel", copy_pattern_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_pattern_channel)); /* AgsCopyPatternChannelRun */ copy_pattern_channel_run = (AgsCopyPatternChannelRun *) g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, // "recall_audio_run", copy_pattern_audio_run, "recall-container", play_container, "recall-audio", copy_pattern_audio, "recall-audio-run", copy_pattern_audio_run, "recall-channel", copy_pattern_channel, NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_channel_run, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_pattern_channel_run, TRUE); recall = g_list_prepend(recall, copy_pattern_channel_run); g_object_set(play_container, "recall-channel-run", copy_pattern_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_pattern_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0 || ags_recall_find_type(audio->recall, AGS_TYPE_COPY_PATTERN_AUDIO) == NULL){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); /* AgsCopyPatternAudio */ copy_pattern_audio = (AgsCopyPatternAudio *) g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_audio, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) copy_pattern_audio, FALSE); recall = g_list_prepend(recall, copy_pattern_audio); g_object_set(recall_container, "recall-audio", copy_pattern_audio, NULL); /* AgsCopyPatternAudioRun */ copy_pattern_audio_run = (AgsCopyPatternAudioRun *) g_object_new(AGS_TYPE_COPY_PATTERN_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-audio", copy_pattern_audio, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_audio_run, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) copy_pattern_audio_run, FALSE); recall = g_list_prepend(recall, copy_pattern_audio_run); g_object_set(recall_container, "recall-audio-run", copy_pattern_audio_run, NULL); }else{ if(recall_container == NULL){ g_object_get(audio, "recall", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_COPY_PATTERN_AUDIO); copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, copy_pattern_audio); g_object_get(copy_pattern_audio, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); g_object_unref(recall_container); list = ags_recall_find_template(list_start); copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, copy_pattern_audio_run); }else{ g_object_get(recall_container, "recall-audio", ©_pattern_audio, NULL); recall = g_list_prepend(recall, copy_pattern_audio); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); g_object_unref(copy_pattern_audio); list = ags_recall_template_find_type(list_start, AGS_TYPE_COPY_PATTERN_AUDIO_RUN); copy_pattern_audio_run = list->data; recall = g_list_prepend(recall, copy_pattern_audio_run); g_list_free_full(list_start, g_object_unref); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsCopyPatternChannel in channel->recall */ copy_pattern_channel = (AgsCopyPatternChannel *) g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, "recall-container", recall_container, "recall-audio", copy_pattern_audio, //"pattern", channel->pattern->data, NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_channel, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_pattern_channel, FALSE); recall = g_list_prepend(recall, copy_pattern_channel); g_object_set(recall_container, "recall-channel", copy_pattern_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_pattern_channel)); /* AgsCopyPatternChannelRun */ copy_pattern_channel_run = (AgsCopyPatternChannelRun *) g_object_new(AGS_TYPE_COPY_PATTERN_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, // "recall_audio_run", copy_pattern_audio_run, "recall-container", recall_container, "recall-audio", copy_pattern_audio, "recall-audio-run", copy_pattern_audio_run, "recall-channel", copy_pattern_channel, NULL); ags_recall_set_flags((AgsRecall *) copy_pattern_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) copy_pattern_channel_run, (AGS_SOUND_ABILITY_SEQUENCER)); ags_recall_set_behaviour_flags((AgsRecall *) copy_pattern_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) copy_pattern_channel_run, FALSE); recall = g_list_prepend(recall, copy_pattern_channel_run); g_object_set(recall_container, "recall-channel-run", copy_pattern_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(copy_pattern_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_play_wave(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPlayWaveAudio *play_wave_audio; AgsPlayWaveAudioRun *play_wave_audio_run; AgsPlayWaveChannel *play_wave_channel; AgsPlayWaveChannelRun *play_wave_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0 || ags_recall_find_type(audio->play, AGS_TYPE_PLAY_WAVE_AUDIO) == NULL){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); /* AgsPlayWaveAudio */ play_wave_audio = (AgsPlayWaveAudio *) g_object_new(AGS_TYPE_PLAY_WAVE_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_wave_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_audio, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_wave_audio, TRUE); recall = g_list_prepend(recall, play_wave_audio); g_object_set(play_container, "recall-audio", play_wave_audio, NULL); /* AgsPlayWaveAudioRun */ play_wave_audio_run = (AgsPlayWaveAudioRun *) g_object_new(AGS_TYPE_PLAY_WAVE_AUDIO_RUN, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, "recall-audio", play_wave_audio, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) play_wave_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_audio_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_wave_audio_run, TRUE); recall = g_list_prepend(recall, play_wave_audio_run); g_object_set(play_container, "recall-audio-run", play_wave_audio_run, NULL); }else{ if(play_container == NULL){ g_object_get(audio, "play", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_PLAY_WAVE_AUDIO); play_wave_audio = AGS_PLAY_WAVE_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_wave_audio); g_object_get(play_wave_audio, "recall-container", &play_container, NULL); g_object_get(play_container, "recall-audio-run", &list_start, NULL); g_object_unref(play_container); list = ags_recall_find_template(list_start); play_wave_audio_run = AGS_PLAY_WAVE_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_wave_audio_run); }else{ g_object_get(play_container, "recall-audio", &play_wave_audio, NULL); g_object_unref(play_wave_audio); recall = g_list_prepend(recall, play_wave_audio); g_object_get(play_container, "recall-audio-run", &list_start, NULL); list = ags_recall_find_template(list_start); play_wave_audio_run = AGS_PLAY_WAVE_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_wave_audio_run); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsPlayWaveChannel in channel->recall */ play_wave_channel = (AgsPlayWaveChannel *) g_object_new(AGS_TYPE_PLAY_WAVE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, "recall-container", play_container, "recall-audio", play_wave_audio, // "pattern", channel->pattern->data, NULL); ags_recall_set_flags((AgsRecall *) play_wave_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_channel, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_wave_channel, TRUE); recall = g_list_prepend(recall, play_wave_channel); g_object_set(play_container, "recall-channel", play_wave_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_wave_channel)); /* AgsPlayWaveChannelRun */ play_wave_channel_run = (AgsPlayWaveChannelRun *) g_object_new(AGS_TYPE_PLAY_WAVE_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, // "recall_audio_run", play_wave_audio_run, "recall-container", play_container, "recall-audio", play_wave_audio, "recall-audio-run", play_wave_audio_run, "recall-channel", play_wave_channel, NULL); ags_recall_set_flags((AgsRecall *) play_wave_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_channel_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_wave_channel_run, TRUE); recall = g_list_prepend(recall, play_wave_channel_run); g_object_set(play_container, "recall-channel-run", play_wave_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_wave_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0 || ags_recall_find_type(audio->recall, AGS_TYPE_PLAY_WAVE_AUDIO) == NULL){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); /* AgsPlayWaveAudio */ play_wave_audio = (AgsPlayWaveAudio *) g_object_new(AGS_TYPE_PLAY_WAVE_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_wave_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_audio, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_wave_audio, FALSE); recall = g_list_prepend(recall, play_wave_audio); g_object_set(recall_container, "recall-audio", play_wave_audio, NULL); /* AgsPlayWaveAudioRun */ play_wave_audio_run = (AgsPlayWaveAudioRun *) g_object_new(AGS_TYPE_PLAY_WAVE_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-audio", play_wave_audio, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) play_wave_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_audio_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_wave_audio_run, FALSE); recall = g_list_prepend(recall, play_wave_audio_run); g_object_set(recall_container, "recall-audio-run", play_wave_audio_run, NULL); }else{ if(recall_container == NULL){ g_object_get(audio, "recall", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_PLAY_WAVE_AUDIO); play_wave_audio = AGS_PLAY_WAVE_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_wave_audio); g_object_get(play_wave_audio, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); g_object_unref(recall_container); list = ags_recall_find_template(list_start); play_wave_audio_run = AGS_PLAY_WAVE_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, play_wave_audio_run); }else{ g_object_get(recall_container, "recall-audio", &play_wave_audio, NULL); g_object_unref(play_wave_audio); recall = g_list_prepend(recall, play_wave_audio); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); list = ags_recall_template_find_type(list_start, AGS_TYPE_PLAY_WAVE_AUDIO_RUN); play_wave_audio_run = list->data; recall = g_list_prepend(recall, play_wave_audio_run); g_list_free_full(list_start, g_object_unref); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsPlayWaveChannel in channel->recall */ play_wave_channel = (AgsPlayWaveChannel *) g_object_new(AGS_TYPE_PLAY_WAVE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, "recall-container", recall_container, "recall-audio", play_wave_audio, //"pattern", channel->pattern->data, NULL); ags_recall_set_flags((AgsRecall *) play_wave_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_channel, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_wave_channel, FALSE); recall = g_list_prepend(recall, play_wave_channel); g_object_set(recall_container, "recall-channel", play_wave_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_wave_channel)); /* AgsPlayWaveChannelRun */ play_wave_channel_run = (AgsPlayWaveChannelRun *) g_object_new(AGS_TYPE_PLAY_WAVE_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, // "recall_audio_run", play_wave_audio_run, "recall-container", recall_container, "recall-audio", play_wave_audio, "recall-audio-run", play_wave_audio_run, "recall-channel", play_wave_channel, NULL); ags_recall_set_flags((AgsRecall *) play_wave_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_wave_channel_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) play_wave_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) play_wave_channel_run, FALSE); recall = g_list_prepend(recall, play_wave_channel_run); g_object_set(recall_container, "recall-channel-run", play_wave_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_wave_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_capture_wave(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsCaptureWaveAudio *capture_wave_audio; AgsCaptureWaveAudioRun *capture_wave_audio_run; AgsCaptureWaveChannel *capture_wave_channel; AgsCaptureWaveChannelRun *capture_wave_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0 || ags_recall_find_type(audio->play, AGS_TYPE_CAPTURE_WAVE_AUDIO) == NULL){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); /* AgsCaptureWaveAudio */ capture_wave_audio = (AgsCaptureWaveAudio *) g_object_new(AGS_TYPE_CAPTURE_WAVE_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) capture_wave_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_audio, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) capture_wave_audio, TRUE); recall = g_list_prepend(recall, capture_wave_audio); g_object_set(play_container, "recall-audio", capture_wave_audio, NULL); /* AgsCaptureWaveAudioRun */ capture_wave_audio_run = (AgsCaptureWaveAudioRun *) g_object_new(AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, "recall-audio", capture_wave_audio, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) capture_wave_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_audio_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) capture_wave_audio_run, TRUE); recall = g_list_prepend(recall, capture_wave_audio_run); g_object_set(play_container, "recall-audio-run", capture_wave_audio_run, NULL); }else{ if(play_container == NULL){ g_object_get(audio, "play", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_CAPTURE_WAVE_AUDIO); capture_wave_audio = AGS_CAPTURE_WAVE_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, capture_wave_audio); g_object_get(capture_wave_audio, "recall-container", &play_container, NULL); g_object_get(play_container, "recall-audio-run", &list_start, NULL); g_object_unref(play_container); list = ags_recall_find_template(list_start); capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, capture_wave_audio_run); }else{ g_object_get(play_container, "recall-audio", &capture_wave_audio, NULL); g_object_unref(capture_wave_audio); recall = g_list_prepend(recall, capture_wave_audio); g_object_get(play_container, "recall-audio-run", &list_start, NULL); list = ags_recall_find_template(list_start); capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, capture_wave_audio_run); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsCaptureWaveChannel in channel->recall */ capture_wave_channel = (AgsCaptureWaveChannel *) g_object_new(AGS_TYPE_CAPTURE_WAVE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, "recall-container", play_container, "recall-audio", capture_wave_audio, // "pattern", channel->pattern->data, NULL); ags_recall_set_flags((AgsRecall *) capture_wave_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_channel, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) capture_wave_channel, TRUE); recall = g_list_prepend(recall, capture_wave_channel); g_object_set(play_container, "recall-channel", capture_wave_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(capture_wave_channel)); /* AgsCaptureWaveChannelRun */ capture_wave_channel_run = (AgsCaptureWaveChannelRun *) g_object_new(AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, // "recall_audio_run", capture_wave_audio_run, "recall-container", play_container, "recall-audio", capture_wave_audio, "recall-audio-run", capture_wave_audio_run, "recall-channel", capture_wave_channel, NULL); ags_recall_set_flags((AgsRecall *) capture_wave_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_channel_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) capture_wave_channel_run, TRUE); recall = g_list_prepend(recall, capture_wave_channel_run); g_object_set(play_container, "recall-channel-run", capture_wave_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(capture_wave_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0 || ags_recall_find_type(audio->recall, AGS_TYPE_CAPTURE_WAVE_AUDIO) == NULL){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); /* AgsCaptureWaveAudio */ capture_wave_audio = (AgsCaptureWaveAudio *) g_object_new(AGS_TYPE_CAPTURE_WAVE_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) capture_wave_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_audio, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) capture_wave_audio, FALSE); recall = g_list_prepend(recall, capture_wave_audio); g_object_set(recall_container, "recall-audio", capture_wave_audio, NULL); /* AgsCaptureWaveAudioRun */ capture_wave_audio_run = (AgsCaptureWaveAudioRun *) g_object_new(AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-container", recall_container, "recall-audio", capture_wave_audio, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) capture_wave_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_audio_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) capture_wave_audio_run, FALSE); recall = g_list_prepend(recall, capture_wave_audio_run); g_object_set(recall_container, "recall-audio-run", capture_wave_audio_run, NULL); }else{ if(recall_container == NULL){ g_object_get(audio, "recall", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_CAPTURE_WAVE_AUDIO); capture_wave_audio = AGS_CAPTURE_WAVE_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, capture_wave_audio); g_object_get(capture_wave_audio, "recall-container", &recall_container, NULL); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); g_object_unref(recall_container); list = ags_recall_find_template(list_start); capture_wave_audio_run = AGS_CAPTURE_WAVE_AUDIO_RUN(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, capture_wave_audio_run); }else{ g_object_get(recall_container, "recall-audio", &capture_wave_audio, NULL); g_object_unref(capture_wave_audio); recall = g_list_prepend(recall, capture_wave_audio); g_object_get(recall_container, "recall-audio-run", &list_start, NULL); list = ags_recall_template_find_type(list_start, AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN); capture_wave_audio_run = list->data; recall = g_list_prepend(recall, capture_wave_audio_run); g_list_free_full(list_start, g_object_unref); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsCaptureWaveChannel in channel->recall */ capture_wave_channel = (AgsCaptureWaveChannel *) g_object_new(AGS_TYPE_CAPTURE_WAVE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, "recall-container", recall_container, "recall-audio", capture_wave_audio, //"pattern", channel->pattern->data, NULL); ags_recall_set_flags((AgsRecall *) capture_wave_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_channel, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) capture_wave_channel, FALSE); recall = g_list_prepend(recall, capture_wave_channel); g_object_set(recall_container, "recall-channel", capture_wave_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(capture_wave_channel)); /* AgsCaptureWaveChannelRun */ capture_wave_channel_run = (AgsCaptureWaveChannelRun *) g_object_new(AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN, "output-soundcard", output_soundcard, "source", channel, // "destination", destination, // "recall_audio_run", capture_wave_audio_run, "recall-container", recall_container, "recall-audio", capture_wave_audio, "recall-audio-run", capture_wave_audio_run, "recall-channel", capture_wave_channel, NULL); ags_recall_set_flags((AgsRecall *) capture_wave_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) capture_wave_channel_run, (AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) capture_wave_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) capture_wave_channel_run, FALSE); recall = g_list_prepend(recall, capture_wave_channel_run); g_object_set(recall_container, "recall-channel-run", capture_wave_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(capture_wave_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_play_dssi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPlayDssiAudio *play_dssi_audio; AgsPlayDssiAudioRun *play_dssi_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); play_dssi_audio = (AgsPlayDssiAudio *) g_object_new(AGS_TYPE_PLAY_DSSI_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_dssi_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_dssi_audio, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_dssi_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); if((AGS_RECALL_FACTORY_BULK & create_flags) != 0){ ags_recall_set_behaviour_flags((AgsRecall *) play_dssi_audio, (AGS_SOUND_BEHAVIOUR_BULK_MODE)); } ags_audio_add_recall(audio, (GObject *) play_dssi_audio, TRUE); recall = g_list_prepend(recall, play_dssi_audio); g_object_set(play_container, "recall-audio", play_dssi_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_dssi_audio)); play_dssi_audio_run = (AgsPlayDssiAudioRun *) g_object_new(AGS_TYPE_PLAY_DSSI_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", play_dssi_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_dssi_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_dssi_audio_run, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_dssi_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_dssi_audio_run, TRUE); recall = g_list_prepend(recall, play_dssi_audio_run); g_object_set(play_container, "recall-audio-run", play_dssi_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_dssi_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); play_dssi_audio = (AgsPlayDssiAudio *) g_object_new(AGS_TYPE_PLAY_DSSI_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_dssi_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_dssi_audio, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_dssi_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); if((AGS_RECALL_FACTORY_BULK & create_flags) != 0){ ags_recall_set_behaviour_flags((AgsRecall *) play_dssi_audio, (AGS_SOUND_BEHAVIOUR_BULK_MODE)); } ags_audio_add_recall(audio, (GObject *) play_dssi_audio, FALSE); recall = g_list_prepend(recall, play_dssi_audio); g_object_set(recall_container, "recall-audio", play_dssi_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_dssi_audio)); play_dssi_audio_run = (AgsPlayDssiAudioRun *) g_object_new(AGS_TYPE_PLAY_DSSI_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", play_dssi_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) play_dssi_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_dssi_audio_run, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_dssi_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_dssi_audio_run, FALSE); recall = g_list_prepend(recall, play_dssi_audio_run); g_object_set(recall_container, "recall-audio-run", play_dssi_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_dssi_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_play_lv2(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPlayLv2Audio *play_lv2_audio; AgsPlayLv2AudioRun *play_lv2_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); play_lv2_audio = (AgsPlayLv2Audio *) g_object_new(AGS_TYPE_PLAY_LV2_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_lv2_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_lv2_audio, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_lv2_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_lv2_audio, TRUE); recall = g_list_prepend(recall, play_lv2_audio); g_object_set(play_container, "recall-audio", play_lv2_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_lv2_audio)); play_lv2_audio_run = (AgsPlayLv2AudioRun *) g_object_new(AGS_TYPE_PLAY_LV2_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", play_lv2_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_lv2_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_lv2_audio_run, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_lv2_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); if((AGS_RECALL_FACTORY_BULK & create_flags) != 0){ ags_recall_set_behaviour_flags((AgsRecall *) play_lv2_audio, (AGS_SOUND_BEHAVIOUR_BULK_MODE)); } ags_audio_add_recall(audio, (GObject *) play_lv2_audio_run, TRUE); recall = g_list_prepend(recall, play_lv2_audio_run); g_object_set(play_container, "recall-audio-run", play_lv2_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_lv2_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); play_lv2_audio = (AgsPlayLv2Audio *) g_object_new(AGS_TYPE_PLAY_LV2_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_lv2_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_lv2_audio, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_lv2_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); if((AGS_RECALL_FACTORY_BULK & create_flags) != 0){ ags_recall_set_behaviour_flags((AgsRecall *) play_lv2_audio, (AGS_SOUND_BEHAVIOUR_BULK_MODE)); } ags_audio_add_recall(audio, (GObject *) play_lv2_audio, FALSE); recall = g_list_prepend(recall, play_lv2_audio); g_object_set(recall_container, "recall-audio", play_lv2_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_lv2_audio)); play_lv2_audio_run = (AgsPlayLv2AudioRun *) g_object_new(AGS_TYPE_PLAY_LV2_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", play_lv2_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) play_lv2_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_lv2_audio_run, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_lv2_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_lv2_audio_run, FALSE); recall = g_list_prepend(recall, play_lv2_audio_run); g_object_set(recall_container, "recall-audio-run", play_lv2_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_lv2_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_play_notation(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPlayNotationAudio *play_notation_audio; AgsPlayNotationAudioRun *play_notation_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); play_notation_audio = (AgsPlayNotationAudio *) g_object_new(AGS_TYPE_PLAY_NOTATION_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_notation_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_notation_audio, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_notation_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_notation_audio, TRUE); recall = g_list_prepend(recall, play_notation_audio); g_object_set(play_container, "recall-audio", play_notation_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_notation_audio)); play_notation_audio_run = (AgsPlayNotationAudioRun *) g_object_new(AGS_TYPE_PLAY_NOTATION_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", play_notation_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) play_notation_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_notation_audio_run, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_notation_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_notation_audio_run, TRUE); recall = g_list_prepend(recall, play_notation_audio_run); g_object_set(play_container, "recall-audio-run", play_notation_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_notation_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); play_notation_audio = (AgsPlayNotationAudio *) g_object_new(AGS_TYPE_PLAY_NOTATION_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) play_notation_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_notation_audio, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_notation_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_notation_audio, FALSE); recall = g_list_prepend(recall, play_notation_audio); g_object_set(recall_container, "recall-audio", play_notation_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_notation_audio)); play_notation_audio_run = (AgsPlayNotationAudioRun *) g_object_new(AGS_TYPE_PLAY_NOTATION_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", play_notation_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) play_notation_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) play_notation_audio_run, (AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) play_notation_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) play_notation_audio_run, FALSE); recall = g_list_prepend(recall, play_notation_audio_run); g_object_set(recall_container, "recall-audio-run", play_notation_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(play_notation_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_peak(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsPeakChannel *peak_channel; AgsPeakChannelRun *peak_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsPeakChannel */ peak_channel = (AgsPeakChannel *) g_object_new(AGS_TYPE_PEAK_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) peak_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) peak_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) peak_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) peak_channel, TRUE); recall = g_list_prepend(recall, peak_channel); g_object_set(play_container, "recall-channel", peak_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(peak_channel)); /* AgsPeakChannelRun */ peak_channel_run = (AgsPeakChannelRun *) g_object_new(AGS_TYPE_PEAK_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", peak_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) peak_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) peak_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) peak_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) peak_channel_run, TRUE); recall = g_list_prepend(recall, peak_channel_run); g_object_set(play_container, "recall-channel-run", peak_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(peak_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsPeakChannel */ peak_channel = (AgsPeakChannel *) g_object_new(AGS_TYPE_PEAK_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) peak_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) peak_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) peak_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) peak_channel, FALSE); recall = g_list_prepend(recall, peak_channel); g_object_set(recall_container, "recall-channel", peak_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(peak_channel)); /* AgsPeakChannelRun */ peak_channel_run = (AgsPeakChannelRun *) g_object_new(AGS_TYPE_PEAK_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", peak_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) peak_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) peak_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) peak_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) peak_channel_run, FALSE); recall = g_list_prepend(recall, peak_channel_run); g_object_set(recall_container, "recall-channel-run", peak_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(peak_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_analyse(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsAnalyseChannel *analyse_channel; AgsAnalyseChannelRun *analyse_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad && channel != NULL; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel && channel != NULL; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsAnalyseChannel */ analyse_channel = (AgsAnalyseChannel *) g_object_new(AGS_TYPE_ANALYSE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) analyse_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) analyse_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) analyse_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) analyse_channel, TRUE); recall = g_list_prepend(recall, analyse_channel); g_object_set(play_container, "recall-channel", analyse_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(analyse_channel)); /* AgsAnalyseChannelRun */ analyse_channel_run = (AgsAnalyseChannelRun *) g_object_new(AGS_TYPE_ANALYSE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", analyse_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) analyse_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) analyse_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) analyse_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) analyse_channel_run, TRUE); recall = g_list_prepend(recall, analyse_channel_run); g_object_set(play_container, "recall-channel-run", analyse_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(analyse_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad && channel != NULL; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel && channel != NULL; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsAnalyseChannel */ analyse_channel = (AgsAnalyseChannel *) g_object_new(AGS_TYPE_ANALYSE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) analyse_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) analyse_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) analyse_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) analyse_channel, FALSE); recall = g_list_prepend(recall, analyse_channel); g_object_set(recall_container, "recall-channel", analyse_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(analyse_channel)); /* AgsAnalyseChannelRun */ analyse_channel_run = (AgsAnalyseChannelRun *) g_object_new(AGS_TYPE_ANALYSE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", analyse_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) analyse_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) analyse_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) analyse_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) analyse_channel_run, FALSE); recall = g_list_prepend(recall, analyse_channel_run); g_object_set(recall_container, "recall-channel-run", analyse_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(analyse_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_mute(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsMuteAudio *mute_audio; AgsMuteAudioRun *mute_audio_run; AgsMuteChannel *mute_channel; AgsMuteChannelRun *mute_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); /* AgsMuteAudio */ mute_audio = (AgsMuteAudio *) g_object_new(AGS_TYPE_MUTE_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) mute_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) mute_audio, TRUE); recall = g_list_prepend(recall, mute_audio); g_object_set(play_container, "recall-audio", mute_audio, NULL); /* AgsMuteAudioRun */ mute_audio_run = (AgsMuteAudioRun *) g_object_new(AGS_TYPE_MUTE_AUDIO_RUN, "output-soundcard", output_soundcard, // "recall-audio", mute_audio, "recall-container", play_container, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) mute_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_audio_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) mute_audio_run, TRUE); recall = g_list_prepend(recall, mute_audio_run); g_object_set(play_container, "recall-audio-run", mute_audio_run, NULL); }else{ if(play_container == NULL){ g_object_get(audio, "play", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_MUTE_AUDIO); mute_audio = AGS_MUTE_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, mute_audio); g_object_get(mute_audio, "recall-container", &play_container, NULL); g_object_unref(play_container); }else{ g_object_get(play_container, "recall-audio", &mute_audio, NULL); g_object_unref(mute_audio); recall = g_list_prepend(recall, mute_audio); } } } if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsMuteChannel */ mute_channel = (AgsMuteChannel *) g_object_new(AGS_TYPE_MUTE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) mute_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) mute_channel, TRUE); recall = g_list_prepend(recall, mute_channel); g_object_set(play_container, "recall-channel", mute_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(mute_channel)); /* AgsMuteChannelRun */ mute_channel_run = (AgsMuteChannelRun *) g_object_new(AGS_TYPE_MUTE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", mute_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) mute_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) mute_channel_run, TRUE); recall = g_list_prepend(recall, mute_channel_run); g_object_set(play_container, "recall-channel-run", mute_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(mute_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if((AGS_RECALL_FACTORY_REMAP & (create_flags)) == 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); /* AgsMuteAudio */ mute_audio = (AgsMuteAudio *) g_object_new(AGS_TYPE_MUTE_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) mute_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_audio, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) mute_audio, FALSE); recall = g_list_prepend(recall, mute_audio); g_object_set(recall_container, "recall-audio", mute_audio, NULL); /* AgsMuteAudioRun */ mute_audio_run = (AgsMuteAudioRun *) g_object_new(AGS_TYPE_MUTE_AUDIO_RUN, "output-soundcard", output_soundcard, // "recall-audio", mute_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "count_beats_audio_run" NULL); ags_recall_set_flags((AgsRecall *) mute_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_audio_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) mute_audio_run, FALSE); recall = g_list_prepend(recall, mute_audio_run); g_object_set(recall_container, "recall-audio-run", mute_audio_run, NULL); }else{ if(recall_container == NULL){ g_object_get(audio, "recall", &list_start, NULL); list = ags_recall_find_type(list_start, AGS_TYPE_MUTE_AUDIO); mute_audio = AGS_MUTE_AUDIO(list->data); g_list_free_full(list_start, g_object_unref); recall = g_list_prepend(recall, mute_audio); g_object_get(mute_audio, "recall-container", &recall_container, NULL); g_object_unref(recall_container); }else{ g_object_get(recall_container, "recall-audio", &mute_audio, NULL); g_object_unref(mute_audio); recall = g_list_prepend(recall, mute_audio); } } nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsMuteChannel */ mute_channel = (AgsMuteChannel *) g_object_new(AGS_TYPE_MUTE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) mute_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) mute_channel, FALSE); recall = g_list_prepend(recall, mute_channel); g_object_set(recall_container, "recall-channel", mute_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(mute_channel)); /* AgsMuteChannelRun */ mute_channel_run = (AgsMuteChannelRun *) g_object_new(AGS_TYPE_MUTE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", mute_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) mute_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) mute_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) mute_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) mute_channel_run, FALSE); recall = g_list_prepend(recall, mute_channel_run); g_object_set(recall_container, "recall-channel-run", mute_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(mute_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_volume(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsVolumeChannel *volume_channel; AgsVolumeChannelRun *volume_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsVolumeChannel */ volume_channel = (AgsVolumeChannel *) g_object_new(AGS_TYPE_VOLUME_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) volume_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) volume_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) volume_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) volume_channel, TRUE); recall = g_list_prepend(recall, volume_channel); g_object_set(play_container, "recall-channel", volume_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(volume_channel)); /* AgsVolumeChannelRun */ volume_channel_run = (AgsVolumeChannelRun *) g_object_new(AGS_TYPE_VOLUME_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", volume_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) volume_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) volume_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) volume_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) volume_channel_run, TRUE); recall = g_list_prepend(recall, volume_channel_run); g_object_set(play_container, "recall-channel-run", volume_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(volume_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsVolumeChannel */ volume_channel = (AgsVolumeChannel *) g_object_new(AGS_TYPE_VOLUME_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) volume_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) volume_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) volume_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) volume_channel, FALSE); recall = g_list_prepend(recall, volume_channel); g_object_set(recall_container, "recall-channel", volume_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(volume_channel)); /* AgsVolumeChannelRun */ volume_channel_run = (AgsVolumeChannelRun *) g_object_new(AGS_TYPE_VOLUME_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", volume_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) volume_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) volume_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) volume_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) volume_channel_run, FALSE); recall = g_list_prepend(recall, volume_channel_run); g_object_set(recall_container, "recall-channel-run", volume_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(volume_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_eq10(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsEq10Channel *eq10_channel; AgsEq10ChannelRun *eq10_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad && channel != NULL; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel && channel != NULL; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsEq10Channel */ eq10_channel = (AgsEq10Channel *) g_object_new(AGS_TYPE_EQ10_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) eq10_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) eq10_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) eq10_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) eq10_channel, TRUE); recall = g_list_prepend(recall, eq10_channel); g_object_set(play_container, "recall-channel", eq10_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(eq10_channel)); /* AgsEq10ChannelRun */ eq10_channel_run = (AgsEq10ChannelRun *) g_object_new(AGS_TYPE_EQ10_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", eq10_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) eq10_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) eq10_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) eq10_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) eq10_channel_run, TRUE); recall = g_list_prepend(recall, eq10_channel_run); g_object_set(play_container, "recall-channel-run", eq10_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(eq10_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad && channel != NULL; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel && channel != NULL; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsEq10Channel */ eq10_channel = (AgsEq10Channel *) g_object_new(AGS_TYPE_EQ10_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) eq10_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) eq10_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) eq10_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) eq10_channel, FALSE); recall = g_list_prepend(recall, eq10_channel); g_object_set(recall_container, "recall-channel", eq10_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(eq10_channel)); /* AgsEq10ChannelRun */ eq10_channel_run = (AgsEq10ChannelRun *) g_object_new(AGS_TYPE_EQ10_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", eq10_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) eq10_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) eq10_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) eq10_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) eq10_channel_run, FALSE); recall = g_list_prepend(recall, eq10_channel_run); g_object_set(recall_container, "recall-channel-run", eq10_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(eq10_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_envelope(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsEnvelopeChannel *envelope_channel; AgsEnvelopeChannelRun *envelope_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsEnvelopeChannel */ envelope_channel = (AgsEnvelopeChannel *) g_object_new(AGS_TYPE_ENVELOPE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) envelope_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) envelope_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) envelope_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) envelope_channel, TRUE); recall = g_list_prepend(recall, envelope_channel); g_object_set(play_container, "recall-channel", envelope_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(envelope_channel)); /* AgsEnvelopeChannelRun */ envelope_channel_run = (AgsEnvelopeChannelRun *) g_object_new(AGS_TYPE_ENVELOPE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", envelope_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) envelope_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) envelope_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) envelope_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) envelope_channel_run, TRUE); recall = g_list_prepend(recall, envelope_channel_run); g_object_set(play_container, "recall-channel-run", envelope_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(envelope_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsEnvelopeChannel */ envelope_channel = (AgsEnvelopeChannel *) g_object_new(AGS_TYPE_ENVELOPE_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) envelope_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) envelope_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) envelope_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) envelope_channel, FALSE); recall = g_list_prepend(recall, envelope_channel); g_object_set(recall_container, "recall-channel", envelope_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(envelope_channel)); /* AgsEnvelopeChannelRun */ envelope_channel_run = (AgsEnvelopeChannelRun *) g_object_new(AGS_TYPE_ENVELOPE_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", envelope_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) envelope_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) envelope_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) envelope_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) envelope_channel_run, FALSE); recall = g_list_prepend(recall, envelope_channel_run); g_object_set(recall_container, "recall-channel-run", envelope_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(envelope_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_lfo(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsLfoChannel *lfo_channel; AgsLfoChannelRun *lfo_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsLfoChannel */ lfo_channel = (AgsLfoChannel *) g_object_new(AGS_TYPE_LFO_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) lfo_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) lfo_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) lfo_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) lfo_channel, TRUE); recall = g_list_prepend(recall, lfo_channel); g_object_set(play_container, "recall-channel", lfo_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(lfo_channel)); /* AgsLfoChannelRun */ lfo_channel_run = (AgsLfoChannelRun *) g_object_new(AGS_TYPE_LFO_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", lfo_channel, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) lfo_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) lfo_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) lfo_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) lfo_channel_run, TRUE); recall = g_list_prepend(recall, lfo_channel_run); g_object_set(play_container, "recall-channel-run", lfo_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(lfo_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsLfoChannel */ lfo_channel = (AgsLfoChannel *) g_object_new(AGS_TYPE_LFO_CHANNEL, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) lfo_channel, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) lfo_channel, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) lfo_channel, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) lfo_channel, FALSE); recall = g_list_prepend(recall, lfo_channel); g_object_set(recall_container, "recall-channel", lfo_channel, NULL); ags_connectable_connect(AGS_CONNECTABLE(lfo_channel)); /* AgsLfoChannelRun */ lfo_channel_run = (AgsLfoChannelRun *) g_object_new(AGS_TYPE_LFO_CHANNEL_RUN, "output-soundcard", output_soundcard, "recall-channel", lfo_channel, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) lfo_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) lfo_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI | AGS_SOUND_ABILITY_WAVE)); ags_recall_set_behaviour_flags((AgsRecall *) lfo_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) lfo_channel_run, FALSE); recall = g_list_prepend(recall, lfo_channel_run); g_object_set(recall_container, "recall-channel-run", lfo_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(lfo_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_ladspa(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRecallLadspa *recall_ladspa; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsRecallLadspa */ recall_ladspa = (AgsRecallLadspa *) g_object_new(AGS_TYPE_RECALL_LADSPA, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) recall_ladspa, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) recall_ladspa, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) recall_ladspa, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) recall_ladspa, TRUE); recall = g_list_prepend(recall, recall_ladspa); g_object_set(play_container, "recall-channel", recall_ladspa, NULL); ags_connectable_connect(AGS_CONNECTABLE(recall_ladspa)); /* AgsGenericRecallChannelRun */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LADSPA_RUN); g_object_set(generic_recall_channel_run, "output-soundcard", output_soundcard, // "recall-channel", recall_ladspa, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); recall = g_list_prepend(recall, generic_recall_channel_run); g_object_set(play_container, "recall-channel-run", generic_recall_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsRecallLadspa */ recall_ladspa = (AgsRecallLadspa *) g_object_new(AGS_TYPE_RECALL_LADSPA, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) recall_ladspa, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) recall_ladspa, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) recall_ladspa, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) recall_ladspa, FALSE); recall = g_list_prepend(recall, recall_ladspa); g_object_set(recall_container, "recall-channel-run", recall_ladspa, NULL); ags_connectable_connect(AGS_CONNECTABLE(recall_ladspa)); /* AgsGenericRecallChannelRun */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LADSPA_RUN); g_object_set(generic_recall_channel_run, "output-soundcard", output_soundcard, // "recall-channel", recall_ladspa, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); recall = g_list_prepend(recall, generic_recall_channel_run); g_object_set(recall_container, "recall-channel-run", generic_recall_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_lv2(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRecallLv2 *recall_lv2; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsRecallLv2 */ recall_lv2 = (AgsRecallLv2 *) g_object_new(AGS_TYPE_RECALL_LV2, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) recall_lv2, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) recall_lv2, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) recall_lv2, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) recall_lv2, TRUE); recall = g_list_prepend(recall, recall_lv2); g_object_set(play_container, "recall-channel", recall_lv2, NULL); ags_connectable_connect(AGS_CONNECTABLE(recall_lv2)); /* AgsGenericRecallChannelRun */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LV2_RUN); g_object_set(generic_recall_channel_run, "output-soundcard", output_soundcard, // "recall-channel", recall_lv2, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); recall = g_list_prepend(recall, generic_recall_channel_run); g_object_set(play_container, "recall-channel-run", generic_recall_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsRecallLv2 */ recall_lv2 = (AgsRecallLv2 *) g_object_new(AGS_TYPE_RECALL_LV2, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) recall_lv2, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) recall_lv2, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) recall_lv2, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) recall_lv2, FALSE); recall = g_list_prepend(recall, recall_lv2); g_object_set(recall_container, "recall-channel", recall_lv2, NULL); ags_connectable_connect(AGS_CONNECTABLE(recall_lv2)); /* AgsGenericRecallChannelRun */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LV2_RUN); g_object_set(generic_recall_channel_run, "output-soundcard", output_soundcard, // "recall-channel", recall_lv2, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); recall = g_list_prepend(recall, generic_recall_channel_run); g_object_set(recall_container, "recall-channel-run", generic_recall_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_dssi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRecallDssi *recall_dssi; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsChannel *start_output, *start_input; AgsChannel *start, *channel, *next_channel, *nth_channel; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint audio_channels; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; audio_channels = audio->audio_channels; start_output = audio->output; if(start_output != NULL){ g_object_ref(start_output); } start_input = audio->input; if(start_input != NULL){ g_object_ref(start_input); } g_rec_mutex_unlock(audio_mutex); /* get channel */ if((AGS_RECALL_FACTORY_OUTPUT & (create_flags)) != 0){ start = ags_channel_nth(start_output, start_pad * audio_channels); }else{ start = ags_channel_nth(start_input, start_pad * audio_channels); } recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) play_container); /* AgsRecallDssi */ recall_dssi = (AgsRecallDssi *) g_object_new(AGS_TYPE_RECALL_DSSI, "output-soundcard", output_soundcard, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) recall_dssi, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) recall_dssi, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) recall_dssi, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) recall_dssi, TRUE); recall = g_list_prepend(recall, recall_dssi); g_object_set(play_container, "recall-channel", recall_dssi, NULL); ags_connectable_connect(AGS_CONNECTABLE(recall_dssi)); /* AgsGenericRecallChannelRun */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_DSSI_RUN); g_object_set(generic_recall_channel_run, "output-soundcard", output_soundcard, // "recall-channel", recall_dssi, "source", channel, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); recall = g_list_prepend(recall, generic_recall_channel_run); g_object_set(play_container, "recall-channel-run", generic_recall_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ channel = start; if(channel != NULL){ g_object_ref(channel); } if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); nth_channel = NULL; for(i = 0; i < stop_pad - start_pad; i++){ nth_channel = ags_channel_nth(channel, start_audio_channel); g_object_unref(channel); channel = nth_channel; for(j = 0; j < stop_audio_channel - start_audio_channel; j++){ /* add recall container */ ags_channel_add_recall_container(channel, (GObject *) recall_container); /* AgsRecallDssi */ recall_dssi = (AgsRecallDssi *) g_object_new(AGS_TYPE_RECALL_DSSI, "output-soundcard", output_soundcard, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) recall_dssi, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) recall_dssi, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) recall_dssi, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) recall_dssi, FALSE); recall = g_list_prepend(recall, recall_dssi); g_object_set(recall_container, "recall-channel", recall_dssi, NULL); ags_connectable_connect(AGS_CONNECTABLE(recall_dssi)); /* AgsGenericRecallChannelRun */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_DSSI_RUN); g_object_set(generic_recall_channel_run, "output-soundcard", output_soundcard, // "recall-channel", recall_dssi, "source", channel, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) generic_recall_channel_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) generic_recall_channel_run, (AGS_SOUND_ABILITY_PLAYBACK | AGS_SOUND_ABILITY_NOTATION | AGS_SOUND_ABILITY_SEQUENCER | AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) generic_recall_channel_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); recall = g_list_prepend(recall, generic_recall_channel_run); g_object_set(recall_container, "recall-channel-run", generic_recall_channel_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } nth_channel = ags_channel_nth(channel, audio_channels - stop_audio_channel); if(channel != NULL){ g_object_unref(channel); } channel = nth_channel; } if(nth_channel != NULL){ g_object_unref(nth_channel); } } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } if(start != NULL){ g_object_unref(start); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_record_midi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRecordMidiAudio *record_midi_audio; AgsRecordMidiAudioRun *record_midi_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); record_midi_audio = (AgsRecordMidiAudio *) g_object_new(AGS_TYPE_RECORD_MIDI_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) record_midi_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) record_midi_audio, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) record_midi_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) record_midi_audio, TRUE); recall = g_list_prepend(recall, record_midi_audio); g_object_set(play_container, "recall-audio", record_midi_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(record_midi_audio)); record_midi_audio_run = (AgsRecordMidiAudioRun *) g_object_new(AGS_TYPE_RECORD_MIDI_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", record_midi_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) record_midi_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) record_midi_audio_run, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) record_midi_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) record_midi_audio_run, TRUE); recall = g_list_prepend(recall, record_midi_audio_run); g_object_set(play_container, "recall-audio-run", record_midi_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(record_midi_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); record_midi_audio = (AgsRecordMidiAudio *) g_object_new(AGS_TYPE_RECORD_MIDI_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) record_midi_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) record_midi_audio, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) record_midi_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) record_midi_audio, FALSE); recall = g_list_prepend(recall, record_midi_audio); g_object_set(recall_container, "recall-audio", record_midi_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(record_midi_audio)); record_midi_audio_run = (AgsRecordMidiAudioRun *) g_object_new(AGS_TYPE_RECORD_MIDI_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", record_midi_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) record_midi_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) record_midi_audio_run, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) record_midi_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) record_midi_audio_run, FALSE); recall = g_list_prepend(recall, record_midi_audio_run); g_object_set(recall_container, "recall-audio-run", record_midi_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(record_midi_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_route_dssi(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRouteDssiAudio *route_dssi_audio; AgsRouteDssiAudioRun *route_dssi_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); route_dssi_audio = (AgsRouteDssiAudio *) g_object_new(AGS_TYPE_ROUTE_DSSI_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) route_dssi_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_dssi_audio, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_dssi_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_dssi_audio, TRUE); recall = g_list_prepend(recall, route_dssi_audio); g_object_set(play_container, "recall-audio", route_dssi_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_dssi_audio)); route_dssi_audio_run = (AgsRouteDssiAudioRun *) g_object_new(AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", route_dssi_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) route_dssi_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_dssi_audio_run, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_dssi_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_dssi_audio_run, TRUE); recall = g_list_prepend(recall, route_dssi_audio_run); g_object_set(play_container, "recall-audio-run", route_dssi_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_dssi_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); route_dssi_audio = (AgsRouteDssiAudio *) g_object_new(AGS_TYPE_ROUTE_DSSI_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) route_dssi_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_dssi_audio, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_dssi_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_dssi_audio, FALSE); recall = g_list_prepend(recall, route_dssi_audio); g_object_set(recall_container, "recall-audio", route_dssi_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_dssi_audio)); route_dssi_audio_run = (AgsRouteDssiAudioRun *) g_object_new(AGS_TYPE_ROUTE_DSSI_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", route_dssi_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "delay-audio" NULL); ags_recall_set_flags((AgsRecall *) route_dssi_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_dssi_audio_run, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_dssi_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_dssi_audio_run, FALSE); recall = g_list_prepend(recall, route_dssi_audio_run); g_object_set(recall_container, "recall-audio-run", route_dssi_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_dssi_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } GList* ags_recall_factory_create_route_lv2(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { AgsRouteLv2Audio *route_lv2_audio; AgsRouteLv2AudioRun *route_lv2_audio_run; AgsPort *port; GObject *output_soundcard; GList *list_start, *list; GList *recall; guint i, j; GRecMutex *audio_mutex; if(!AGS_IS_AUDIO(audio)){ return(NULL); } /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); output_soundcard = audio->output_soundcard; g_rec_mutex_unlock(audio_mutex); /* list */ recall = NULL; /* play */ if((AGS_RECALL_FACTORY_PLAY & (create_flags)) != 0){ if(play_container == NULL){ play_container = ags_recall_container_new(); } play_container->flags |= AGS_RECALL_CONTAINER_PLAY; ags_audio_add_recall_container(audio, (GObject *) play_container); route_lv2_audio = (AgsRouteLv2Audio *) g_object_new(AGS_TYPE_ROUTE_LV2_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) route_lv2_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_lv2_audio, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_lv2_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_lv2_audio, TRUE); recall = g_list_prepend(recall, route_lv2_audio); g_object_set(play_container, "recall-audio", route_lv2_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_lv2_audio)); route_lv2_audio_run = (AgsRouteLv2AudioRun *) g_object_new(AGS_TYPE_ROUTE_LV2_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", route_lv2_audio, "recall-container", play_container, NULL); ags_recall_set_flags((AgsRecall *) route_lv2_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_lv2_audio_run, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_lv2_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_lv2_audio_run, TRUE); recall = g_list_prepend(recall, route_lv2_audio_run); g_object_set(play_container, "recall-audio-run", route_lv2_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_lv2_audio_run)); } /* recall */ if((AGS_RECALL_FACTORY_RECALL & (create_flags)) != 0){ if(recall_container == NULL){ recall_container = ags_recall_container_new(); } ags_audio_add_recall_container(audio, (GObject *) recall_container); route_lv2_audio = (AgsRouteLv2Audio *) g_object_new(AGS_TYPE_ROUTE_LV2_AUDIO, "output-soundcard", output_soundcard, "audio", audio, "recall-container", recall_container, NULL); ags_recall_set_flags((AgsRecall *) route_lv2_audio, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_lv2_audio, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_lv2_audio, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_lv2_audio, FALSE); recall = g_list_prepend(recall, route_lv2_audio); g_object_set(recall_container, "recall-audio", route_lv2_audio, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_lv2_audio)); route_lv2_audio_run = (AgsRouteLv2AudioRun *) g_object_new(AGS_TYPE_ROUTE_LV2_AUDIO_RUN, "output-soundcard", output_soundcard, "recall-audio", route_lv2_audio, "recall-container", recall_container, //TODO:JK: add missing dependency "route_lv2-audio" NULL); ags_recall_set_flags((AgsRecall *) route_lv2_audio_run, (AGS_RECALL_TEMPLATE)); ags_recall_set_ability_flags((AgsRecall *) route_lv2_audio_run, (AGS_SOUND_ABILITY_MIDI)); ags_recall_set_behaviour_flags((AgsRecall *) route_lv2_audio_run, (((AGS_RECALL_FACTORY_OUTPUT & create_flags) != 0) ? AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT)); ags_audio_add_recall(audio, (GObject *) route_lv2_audio_run, FALSE); recall = g_list_prepend(recall, route_lv2_audio_run); g_object_set(recall_container, "recall-audio-run", route_lv2_audio_run, NULL); ags_connectable_connect(AGS_CONNECTABLE(route_lv2_audio_run)); } /* return instantiated recall */ recall = g_list_reverse(recall); g_list_foreach(recall, (GFunc) g_object_ref, NULL); return(recall); } /** * ags_recall_factory_create: * @audio: an #AgsAudio that should keep the recalls * @play_container: an #AgsRecallContainer to indetify what recall to use * @recall_container: an #AgsRecallContainer to indetify what recall to use * @plugin_name: the plugin identifier to instantiate * @start_audio_channel: the first audio channel to apply * @stop_audio_channel: the last audio channel to apply * @start_pad: the first pad to apply * @stop_pad: the last pad to apply * @create_flags: modify the behaviour of this function * @recall_flags: flags to be set for #AgsRecall * * Instantiate #AgsRecall by this factory. * * Returns: (element-type AgsAudio.Recall) (transfer full): The #GList-struct containing #AgsRecall * * Since: 3.0.0 */ GList* ags_recall_factory_create(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags) { GList *recall; recall = NULL; #ifdef AGS_DEBUG g_message("AgsRecallFactory creating: %s[%d,%d]", plugin_name, stop_pad, stop_audio_channel); #endif if(!strncmp(plugin_name, "ags-delay", 10)){ recall = ags_recall_factory_create_delay(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-count-beats", 16)){ recall = ags_recall_factory_create_count_beats(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-stream", 11)){ recall = ags_recall_factory_create_stream(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-rt-stream", 14)){ recall = ags_recall_factory_create_rt_stream(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-feed", 9)){ recall = ags_recall_factory_create_feed(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-loop", 9)){ recall = ags_recall_factory_create_loop(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-play-master", 16)){ recall = ags_recall_factory_create_play_master(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-prepare", 12)){ recall = ags_recall_factory_create_prepare(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-copy", 9)){ recall = ags_recall_factory_create_copy(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-buffer", 11)){ recall = ags_recall_factory_create_buffer(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-play", 9)){ recall = ags_recall_factory_create_play(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-copy-pattern", 17)){ recall = ags_recall_factory_create_copy_pattern(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-play-wave", 14)){ recall = ags_recall_factory_create_play_wave(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-capture-wave", 17)){ recall = ags_recall_factory_create_capture_wave(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-play-dssi", 14)){ recall = ags_recall_factory_create_play_dssi(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-play-lv2", 13)){ recall = ags_recall_factory_create_play_lv2(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-play-notation", 18)){ recall = ags_recall_factory_create_play_notation(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-peak", 9)){ recall = ags_recall_factory_create_peak(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-analyse", 12)){ recall = ags_recall_factory_create_analyse(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-mute", 9)){ recall = ags_recall_factory_create_mute(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-volume", 11)){ recall = ags_recall_factory_create_volume(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-eq10", 9)){ recall = ags_recall_factory_create_eq10(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-envelope", 13)){ recall = ags_recall_factory_create_envelope(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-lfo", 8)){ recall = ags_recall_factory_create_lfo(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-ladspa", 11)){ recall = ags_recall_factory_create_ladspa(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-dssi", 9)){ recall = ags_recall_factory_create_dssi(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-lv2", 8)){ recall = ags_recall_factory_create_lv2(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-record-midi", 16)){ recall = ags_recall_factory_create_record_midi(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-route-dssi", 15)){ recall = ags_recall_factory_create_route_dssi(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); }else if(!strncmp(plugin_name, "ags-route-lv2", 14)){ recall = ags_recall_factory_create_route_lv2(audio, play_container, recall_container, plugin_name, start_audio_channel, stop_audio_channel, start_pad, stop_pad, create_flags, recall_flags); } return(recall); } /** * ags_recall_factory_new: * * Create a new instance of #AgsRecallFactory * * Returns: the new #AgsRecallFactory * * Since: 3.0.0 */ AgsRecallFactory* ags_recall_factory_new() { AgsRecallFactory *recall_factory; recall_factory = (AgsRecallFactory *) g_object_new(AGS_TYPE_RECALL_FACTORY, NULL); return(recall_factory); } gsequencer-3.1.3/ags/audio/ags_recall_audio_signal.c0000644000175000017500000002171313607210263017435 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_recall_audio_signal_class_init(AgsRecallAudioSignalClass *recall_audio_signal); void ags_recall_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_audio_signal_init(AgsRecallAudioSignal *recall_audio_signal); void ags_recall_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_audio_signal_dispose(GObject *gobject); void ags_recall_audio_signal_finalize(GObject *gobject); /** * SECTION:ags_recall_audio_signal * @Short_description: audio signal context of recall * @Title: AgsRecallAudioSignal * @section_id: * @include: ags/audio/ags_recall_audio_signal.h * * #AgsRecallAudioSignal acts as audio signal recall. */ enum{ PROP_0, PROP_DESTINATION, PROP_SOURCE, }; static gpointer ags_recall_audio_signal_parent_class = NULL; static AgsConnectableInterface *ags_recall_audio_signal_parent_connectable_interface; GType ags_recall_audio_signal_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_audio_signal = 0; static const GTypeInfo ags_recall_audio_signal_info = { sizeof (AgsRecallAudioSignalClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_audio_signal_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallAudioSignal), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_audio_signal_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_audio_signal_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_audio_signal = g_type_register_static(AGS_TYPE_RECALL, "AgsRecallAudioSignal", &ags_recall_audio_signal_info, 0); g_type_add_interface_static(ags_type_recall_audio_signal, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_audio_signal); } return g_define_type_id__volatile; } void ags_recall_audio_signal_class_init(AgsRecallAudioSignalClass *recall_audio_signal) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_audio_signal_parent_class = g_type_class_peek_parent(recall_audio_signal); /* GObjectClass */ gobject = (GObjectClass *) recall_audio_signal; gobject->set_property = ags_recall_audio_signal_set_property; gobject->get_property = ags_recall_audio_signal_get_property; gobject->dispose = ags_recall_audio_signal_dispose; gobject->finalize = ags_recall_audio_signal_finalize; /* properties */ /** * AgsRecallAudioSignal:destination: * * The destination audio signal * * Since: 3.0.0 */ param_spec = g_param_spec_object("destination", i18n_pspec("destination of output"), i18n_pspec("The destination where this recall will write the audio signal to"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESTINATION, param_spec); /** * AgsRecallAudioSignal:source: * * The source audio signal * * Since: 3.0.0 */ param_spec = g_param_spec_object("source", i18n_pspec("source of input"), i18n_pspec("The source where this recall will take the audio signal from"), AGS_TYPE_AUDIO_SIGNAL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOURCE, param_spec); } void ags_recall_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_audio_signal_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_audio_signal_init(AgsRecallAudioSignal *recall_audio_signal) { recall_audio_signal->source = NULL; recall_audio_signal->destination = NULL; } void ags_recall_audio_signal_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallAudioSignal *recall_audio_signal; GRecMutex *recall_mutex; recall_audio_signal = AGS_RECALL_AUDIO_SIGNAL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_audio_signal); switch(prop_id){ case PROP_DESTINATION: { AgsAudioSignal *destination; destination = (AgsAudioSignal *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_audio_signal->destination == destination){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_audio_signal->destination != NULL){ g_object_unref(recall_audio_signal->destination); } if(destination != NULL){ g_object_ref(G_OBJECT(destination)); } recall_audio_signal->destination = destination; g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { AgsAudioSignal *source; source = (AgsAudioSignal *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_audio_signal->source == source){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_audio_signal->source != NULL){ g_object_unref(recall_audio_signal->source); } if(source != NULL){ g_object_ref(G_OBJECT(source)); } recall_audio_signal->source = source; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_audio_signal_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallAudioSignal *recall_audio_signal; GRecMutex *recall_mutex; recall_audio_signal = AGS_RECALL_AUDIO_SIGNAL(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_audio_signal); switch(prop_id){ case PROP_DESTINATION: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_audio_signal->destination); g_rec_mutex_unlock(recall_mutex); } break; case PROP_SOURCE: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_audio_signal->source); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_audio_signal_dispose(GObject *gobject) { AgsRecallAudioSignal *recall_audio_signal; recall_audio_signal = AGS_RECALL_AUDIO_SIGNAL(gobject); /* destination */ if(recall_audio_signal->destination != NULL){ g_object_unref(recall_audio_signal->destination); recall_audio_signal->destination = NULL; } /* source */ if(recall_audio_signal->source != NULL){ g_object_unref(recall_audio_signal->source); recall_audio_signal->source = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_audio_signal_parent_class)->dispose(gobject); } void ags_recall_audio_signal_finalize(GObject *gobject) { AgsRecallAudioSignal *recall_audio_signal; recall_audio_signal = AGS_RECALL_AUDIO_SIGNAL(gobject); #ifdef AGS_DEBUG g_message("- recall audio signal %s", G_OBJECT_TYPE_NAME(recall_audio_signal)); #endif /* destination */ if(recall_audio_signal->destination != NULL){ g_object_unref(recall_audio_signal->destination); } /* source */ if(recall_audio_signal->source != NULL){ g_object_unref(recall_audio_signal->source); } /* call parent */ G_OBJECT_CLASS(ags_recall_audio_signal_parent_class)->finalize(gobject); } /** * ags_recall_audio_signal_new: * * Creates an #AgsRecallAudioSignal. * * Returns: a new #AgsRecallAudioSignal. * * Since: 3.0.0 */ AgsRecallAudioSignal* ags_recall_audio_signal_new() { AgsRecallAudioSignal *recall_audio_signal; recall_audio_signal = (AgsRecallAudioSignal *) g_object_new(AGS_TYPE_RECALL_AUDIO_SIGNAL, NULL); return(recall_audio_signal); } gsequencer-3.1.3/ags/audio/ags_midiin.h0000644000175000017500000001301313607210263014725 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDIIN_H__ #define __AGS_MIDIIN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDIIN (ags_midiin_get_type()) #define AGS_MIDIIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDIIN, AgsMidiin)) #define AGS_MIDIIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MIDIIN, AgsMidiin)) #define AGS_IS_MIDIIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDIIN)) #define AGS_IS_MIDIIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDIIN)) #define AGS_MIDIIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_MIDIIN, AgsMidiinClass)) #define AGS_MIDIIN_GET_OBJ_MUTEX(obj) (&(((AgsMidiin *) obj)->obj_mutex)) #define AGS_MIDIIN_DEFAULT_ALSA_DEVICE "hw:0,0" #define AGS_MIDIIN_DEFAULT_OSS_DEVICE "/dev/midi00" #define AGS_MIDIIN_DEFAULT_BUFFER_SIZE (4096) typedef struct _AgsMidiin AgsMidiin; typedef struct _AgsMidiinClass AgsMidiinClass; /** * AgsMidiinFlags: * @AGS_MIDIIN_ADDED_TO_REGISTRY: the midiin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_MIDIIN_CONNECTED: indicates the midiin was connected by calling #AgsConnectable::connect() * @AGS_MIDIIN_BUFFER0: ring-buffer 0 * @AGS_MIDIIN_BUFFER1: ring-buffer 1 * @AGS_MIDIIN_BUFFER2: ring-buffer 2 * @AGS_MIDIIN_BUFFER3: ring-buffer 3 * @AGS_MIDIIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_MIDIIN_RECORD: is recording * @AGS_MIDIIN_OSS: use OSS4 backend * @AGS_MIDIIN_ALSA: use ALSA backend * @AGS_MIDIIN_SHUTDOWN: stop recording * @AGS_MIDIIN_START_RECORD: just started recording * @AGS_MIDIIN_NONBLOCKING: do non-blocking calls * @AGS_MIDIIN_INITIALIZED: recording is initialized * * Enum values to control the behavior or indicate internal state of #AgsMidiin by * enable/disable as flags. */ typedef enum { AGS_MIDIIN_ADDED_TO_REGISTRY = 1, AGS_MIDIIN_CONNECTED = 1 << 1, AGS_MIDIIN_BUFFER0 = 1 << 2, AGS_MIDIIN_BUFFER1 = 1 << 3, AGS_MIDIIN_BUFFER2 = 1 << 4, AGS_MIDIIN_BUFFER3 = 1 << 5, AGS_MIDIIN_ATTACK_FIRST = 1 << 6, AGS_MIDIIN_RECORD = 1 << 7, AGS_MIDIIN_OSS = 1 << 8, AGS_MIDIIN_ALSA = 1 << 9, AGS_MIDIIN_SHUTDOWN = 1 << 10, AGS_MIDIIN_START_RECORD = 1 << 11, AGS_MIDIIN_NONBLOCKING = 1 << 12, AGS_MIDIIN_INITIALIZED = 1 << 13, }AgsMidiinFlags; /** * AgsMidiinSyncFlags: * @AGS_MIDIIN_PASS_THROUGH: do not sync * @AGS_MIDIIN_INITIAL_POLL: initial poll * @AGS_MIDIIN_POLL_WAIT: sync wait, sequencer conditional lock * @AGS_MIDIIN_POLL_DONE: sync done, sequencer conditional lock * @AGS_MIDIIN_POLL_FINISH_WAIT: sync wait, client conditional lock * @AGS_MIDIIN_POLL_FINISH_DONE: sync done, client conditional lock * @AGS_MIDIIN_POLL_SWITCH_BUFFER: switch buffer * * Enum values to control the synchronization between sequencer and poll. */ typedef enum{ AGS_MIDIIN_PASS_THROUGH = 1, AGS_MIDIIN_INITIAL_POLL = 1 << 1, AGS_MIDIIN_POLL_WAIT = 1 << 2, AGS_MIDIIN_POLL_DONE = 1 << 3, AGS_MIDIIN_POLL_FINISH_WAIT = 1 << 4, AGS_MIDIIN_POLL_FINISH_DONE = 1 << 5, AGS_MIDIIN_POLL_SWITCH_BUFFER = 1 << 6, }AgsMidiinSyncFlags; #define AGS_MIDIIN_ERROR (ags_midiin_error_quark()) typedef enum{ AGS_MIDIIN_ERROR_LOCKED_SEQUENCER, }AgsMidiinError; struct _AgsMidiin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; char **ring_buffer; guint ring_buffer_size[2]; GRecMutex **buffer_mutex; char **buffer; guint buffer_size[4]; double bpm; // beats per minute gdouble delay; gdouble delay_factor; guint latency; gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; union{ struct _AgsOssMidi{ int device_fd; char *device; }oss; struct _AgsAlsaMidi{ char *device; int rc; #ifdef AGS_WITH_ALSA snd_rawmidi_t *handle; #else gpointer handle; #endif }alsa; }in; }; struct _AgsMidiinClass { GObjectClass gobject; }; GType ags_midiin_get_type(); GQuark ags_midiin_error_quark(); gboolean ags_midiin_test_flags(AgsMidiin *midiin, guint flags); void ags_midiin_set_flags(AgsMidiin *midiin, guint flags); void ags_midiin_unset_flags(AgsMidiin *midiin, guint flags); void ags_midiin_switch_buffer_flag(AgsMidiin *midiin); AgsMidiin* ags_midiin_new(); G_END_DECLS #endif /*__AGS_MIDIIN_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_ladspa.h0000644000175000017500000000527313607210263016253 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_LADSPA_H__ #define __AGS_RECALL_LADSPA_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_LADSPA (ags_recall_ladspa_get_type()) #define AGS_RECALL_LADSPA(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_LADSPA, AgsRecallLadspa)) #define AGS_RECALL_LADSPA_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_LADSPA, AgsRecallLadspaClass)) #define AGS_IS_RECALL_LADSPA(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_LADSPA)) #define AGS_IS_RECALL_LADSPA_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_LADSPA)) #define AGS_RECALL_LADSPA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_LADSPA, AgsRecallLadspaClass)) typedef struct _AgsRecallLadspa AgsRecallLadspa; typedef struct _AgsRecallLadspaClass AgsRecallLadspaClass; struct _AgsRecallLadspa { AgsRecallChannel recall_channel; AgsLadspaPlugin *plugin; LADSPA_Descriptor *plugin_descriptor; guint *input_port; guint input_lines; guint *output_port; guint output_lines; }; struct _AgsRecallLadspaClass { AgsRecallChannelClass recall_channel; }; GType ags_recall_ladspa_get_type(); void ags_recall_ladspa_load(AgsRecallLadspa *recall_ladspa); GList* ags_recall_ladspa_load_ports(AgsRecallLadspa *recall_ladspa); void ags_recall_ladspa_load_conversion(AgsRecallLadspa *recall_ladspa, GObject *port, gpointer plugin_port); GList* ags_recall_ladspa_find(GList *recall, gchar *filename, gchar *effect); AgsRecallLadspa* ags_recall_ladspa_new(AgsChannel *source, gchar *filename, gchar *effect, guint effect_index); G_END_DECLS #endif /*__AGS_RECALL_LADSPA_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_ladspa.c0000644000175000017500000004264513607210263016252 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include void ags_recall_ladspa_class_init(AgsRecallLadspaClass *recall_ladspa_class); void ags_recall_ladspa_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_ladspa_init(AgsRecallLadspa *recall_ladspa); void ags_recall_ladspa_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_ladspa_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_ladspa_finalize(GObject *gobject); /** * SECTION:ags_recall_ladspa * @short_description: The object interfacing with LADSPA * @title: AgsRecallLadspa * @section_id: * @include: ags/audio/ags_recall_ladspa.h * * #AgsRecallLadspa provides LADSPA support. */ static gpointer ags_recall_ladspa_parent_class = NULL; static AgsConnectableInterface* ags_recall_ladspa_parent_connectable_interface; enum{ PROP_0, PROP_PLUGIN, }; GType ags_recall_ladspa_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_ladspa = 0; static const GTypeInfo ags_recall_ladspa_info = { sizeof (AgsRecallLadspaClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_ladspa_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallLadspa), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_ladspa_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_ladspa_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_ladspa = g_type_register_static(AGS_TYPE_RECALL_CHANNEL, "AgsRecallLadspa", &ags_recall_ladspa_info, 0); g_type_add_interface_static(ags_type_recall_ladspa, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_ladspa); } return g_define_type_id__volatile; } void ags_recall_ladspa_class_init(AgsRecallLadspaClass *recall_ladspa) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_ladspa_parent_class = g_type_class_peek_parent(recall_ladspa); /* GObjectClass */ gobject = (GObjectClass *) recall_ladspa; gobject->set_property = ags_recall_ladspa_set_property; gobject->get_property = ags_recall_ladspa_get_property; gobject->finalize = ags_recall_ladspa_finalize; /* properties */ /** * AgsRecallLadspa:plugin: * * The assigned plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("plugin", i18n_pspec("plugin of recall ladspa"), i18n_pspec("The plugin which this recall ladspa does run"), AGS_TYPE_LADSPA_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN, param_spec); } void ags_recall_ladspa_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_ladspa_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_ladspa_init(AgsRecallLadspa *recall_ladspa) { AGS_RECALL(recall_ladspa)->name = "ags-ladspa"; AGS_RECALL(recall_ladspa)->version = AGS_RECALL_DEFAULT_VERSION; AGS_RECALL(recall_ladspa)->build_id = AGS_RECALL_DEFAULT_BUILD_ID; AGS_RECALL(recall_ladspa)->xml_type = "ags-recall-ladspa"; AGS_RECALL(recall_ladspa)->port = NULL; recall_ladspa->plugin = NULL; recall_ladspa->plugin_descriptor = NULL; recall_ladspa->input_port = NULL; recall_ladspa->input_lines = 0; recall_ladspa->output_port = NULL; recall_ladspa->output_lines = 0; } void ags_recall_ladspa_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallLadspa *recall_ladspa; GRecMutex *recall_mutex; recall_ladspa = AGS_RECALL_LADSPA(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); switch(prop_id){ case PROP_PLUGIN: { AgsLadspaPlugin *plugin; plugin = (AgsLadspaPlugin *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_ladspa->plugin == plugin){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_ladspa->plugin != NULL){ g_object_unref(recall_ladspa->plugin); } if(plugin != NULL){ g_object_ref(plugin); } recall_ladspa->plugin = plugin; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; }; } void ags_recall_ladspa_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallLadspa *recall_ladspa; GRecMutex *recall_mutex; recall_ladspa = AGS_RECALL_LADSPA(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); switch(prop_id){ case PROP_PLUGIN: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_ladspa->plugin); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_ladspa_finalize(GObject *gobject) { AgsRecallLadspa *recall_ladspa; recall_ladspa = AGS_RECALL_LADSPA(gobject); if(recall_ladspa->input_port != NULL){ free(recall_ladspa->input_port); } if(recall_ladspa->output_port != NULL){ free(recall_ladspa->output_port); } /* call parent */ G_OBJECT_CLASS(ags_recall_ladspa_parent_class)->finalize(gobject); } /** * ags_recall_ladspa_load: * @recall_ladspa: the #AgsRecallLadspa * * Set up LADSPA handle. * * Since: 3.0.0 */ void ags_recall_ladspa_load(AgsRecallLadspa *recall_ladspa) { AgsLadspaPlugin *ladspa_plugin; gchar *filename; gchar *effect; guint effect_index; void *plugin_so; LADSPA_Descriptor_Function ladspa_descriptor; LADSPA_Descriptor *plugin_descriptor; GRecMutex *recall_mutex; if(!AGS_IS_RECALL_LADSPA(recall_ladspa)){ return; } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); /* get some fields */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall_ladspa)->filename); effect = g_strdup(AGS_RECALL(recall_ladspa)->effect); effect_index = AGS_RECALL(recall_ladspa)->effect_index; g_rec_mutex_unlock(recall_mutex); /* find ladspa plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); g_free(filename); g_free(effect); g_object_get(ladspa_plugin, "plugin-so", &plugin_so, NULL); if(plugin_so){ gboolean success; success = FALSE; #ifdef AGS_W32API ladspa_descriptor = (LADSPA_Descriptor_Function) GetProcAddress((void *) plugin_so, "ladspa_descriptor"); success = (!ladspa_descriptor) ? FALSE: TRUE; #else ladspa_descriptor = (LADSPA_Descriptor_Function) dlsym((void *) plugin_so, "ladspa_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && ladspa_descriptor){ g_rec_mutex_lock(recall_mutex); recall_ladspa->plugin_descriptor = plugin_descriptor = ladspa_descriptor(effect_index); g_rec_mutex_unlock(recall_mutex); } } } /** * ags_recall_ladspa_load_ports: * @recall_ladspa: the #AgsRecallLadspa * * Set up LADSPA ports. * * Returns: (element-type AgsAudio.Port) (transfer full): the #GList-struct containing #AgsPort * * Since: 3.0.0 */ GList* ags_recall_ladspa_load_ports(AgsRecallLadspa *recall_ladspa) { AgsPort *current_port; AgsLadspaPlugin *ladspa_plugin; GList *port, *retval; GList *plugin_port_start, *plugin_port; gchar *filename; gchar *effect; guint effect_index; guint port_count; guint i; GRecMutex *recall_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_RECALL_LADSPA(recall_ladspa)){ return(NULL); } /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); /* get some fields */ g_rec_mutex_lock(recall_mutex); filename = g_strdup(AGS_RECALL(recall_ladspa)->filename); effect = g_strdup(AGS_RECALL(recall_ladspa)->effect); effect_index = AGS_RECALL(recall_ladspa)->effect_index; g_rec_mutex_unlock(recall_mutex); /* find ladspa plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); g_free(filename); g_free(effect); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(ladspa_plugin); /* get port descriptor */ g_rec_mutex_lock(base_plugin_mutex); plugin_port = plugin_port_start = g_list_copy(AGS_BASE_PLUGIN(ladspa_plugin)->plugin_port); g_rec_mutex_unlock(base_plugin_mutex); port = NULL; retval = NULL; if(plugin_port != NULL){ port_count = g_list_length(plugin_port_start); for(i = 0; i < port_count; i++){ AgsPluginPort *current_plugin_port; GRecMutex *plugin_port_mutex; current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_CONTROL)){ gchar *plugin_name; gchar *specifier; GValue *default_value; plugin_name = g_strdup_printf("ladspa-%u", ladspa_plugin->unique_id); default_value = g_new0(GValue, 1); g_value_init(default_value, G_TYPE_FLOAT); g_rec_mutex_lock(plugin_port_mutex); specifier = g_strdup(current_plugin_port->port_name); g_value_copy(current_plugin_port->default_value, default_value); g_rec_mutex_unlock(plugin_port_mutex); current_port = g_object_new(AGS_TYPE_PORT, "plugin-name", plugin_name, "specifier", specifier, "control-port", g_strdup_printf("%u/%u", i, port_count), "port-value-is-pointer", FALSE, "port-value-type", G_TYPE_FLOAT, NULL); current_port->flags |= AGS_PORT_USE_LADSPA_FLOAT; g_object_ref(current_port); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT)){ current_port->flags |= AGS_PORT_IS_OUTPUT; ags_recall_set_flags((AgsRecall *) recall_ladspa, AGS_RECALL_HAS_OUTPUT_PORT); }else{ if(!ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INTEGER) && !ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_TOGGLED)){ current_port->flags |= AGS_PORT_INFINITE_RANGE; } } g_object_set(current_port, "plugin-port", current_plugin_port, NULL); ags_recall_ladspa_load_conversion(recall_ladspa, (GObject *) current_port, current_plugin_port); ags_port_safe_write_raw(current_port, default_value); port = g_list_prepend(port, current_port); g_value_unset(default_value); g_free(default_value); g_free(plugin_name); g_free(specifier); }else if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_AUDIO)){ g_rec_mutex_lock(recall_mutex); if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_INPUT)){ if(recall_ladspa->input_port == NULL){ recall_ladspa->input_port = (guint *) malloc(sizeof(guint)); recall_ladspa->input_port[0] = i; }else{ recall_ladspa->input_port = (guint *) realloc(recall_ladspa->input_port, (recall_ladspa->input_lines + 1) * sizeof(guint)); recall_ladspa->input_port[recall_ladspa->input_lines] = i; } recall_ladspa->input_lines += 1; }else if(ags_plugin_port_test_flags(current_plugin_port, AGS_PLUGIN_PORT_OUTPUT)){ if(recall_ladspa->output_port == NULL){ recall_ladspa->output_port = (guint *) malloc(sizeof(guint)); recall_ladspa->output_port[0] = i; }else{ recall_ladspa->output_port = (guint *) realloc(recall_ladspa->output_port, (recall_ladspa->output_lines + 1) * sizeof(guint)); recall_ladspa->output_port[recall_ladspa->output_lines] = i; } recall_ladspa->output_lines += 1; } g_rec_mutex_unlock(recall_mutex); } /* iterate plugin port */ plugin_port = plugin_port->next; } /* reverse port */ g_rec_mutex_lock(recall_mutex); AGS_RECALL(recall_ladspa)->port = g_list_reverse(port); retval = g_list_copy(AGS_RECALL(recall_ladspa)->port); g_rec_mutex_unlock(recall_mutex); } g_list_free(plugin_port_start); return(retval); } /** * ags_recall_ladspa_load_conversion: * @recall_ladspa: the #AgsRecallLadspa * @port: the #AgsPort * @plugin_port: the #AgsPluginPort * * Loads conversion object by using @plugin_port and sets in on @port. * * Since: 3.0.0 */ void ags_recall_ladspa_load_conversion(AgsRecallLadspa *recall_ladspa, GObject *port, gpointer plugin_port) { AgsLadspaConversion *ladspa_conversion; if(!AGS_IS_RECALL_LADSPA(recall_ladspa) || !AGS_IS_PORT(port) || !AGS_IS_PLUGIN_PORT(plugin_port)){ return; } ladspa_conversion = NULL; if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_BELOW)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_BELOW; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_BOUNDED_ABOVE)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_BOUNDED_ABOVE; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_SAMPLERATE)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_SAMPLERATE; } if(ags_plugin_port_test_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC)){ if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ ladspa_conversion = ags_ladspa_conversion_new(); } ladspa_conversion->flags |= AGS_LADSPA_CONVERSION_LOGARITHMIC; } if(ladspa_conversion != NULL){ g_object_set(port, "conversion", ladspa_conversion, NULL); } } /** * ags_recall_ladspa_find: * @recall: (element-type AgsAudio.Recall) (transfer none): the #GList-struct containing #AgsRecall * @filename: plugin filename * @effect: effect's name * * Retrieve LADSPA recall. * * Returns: (element-type AgsAudio.Recall) (transfer none): Next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_recall_ladspa_find(GList *recall, gchar *filename, gchar *effect) { gboolean success; GRecMutex *recall_mutex; while(recall != NULL){ if(AGS_IS_RECALL_LADSPA(recall->data)){ /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall->data); /* check filename and effect */ g_rec_mutex_lock(recall_mutex); success = (!g_strcmp0(AGS_RECALL(recall->data)->filename, filename) && !g_strcmp0(AGS_RECALL(recall->data)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_mutex); if(success){ return(recall); } } recall = recall->next; } return(NULL); } /** * ags_recall_ladspa_new: * @source: the #AgsChannel as source * @filename: the LADSPA plugin filename * @effect: effect's name * @effect_index: effect's index * * Creates a new instance of #AgsRecallLadspa * * Returns: the new #AgsRecallLadspa * * Since: 3.0.0 */ AgsRecallLadspa* ags_recall_ladspa_new(AgsChannel *source, gchar *filename, gchar *effect, guint effect_index) { AgsRecallLadspa *recall_ladspa; GObject *output_soundcard; output_soundcard = NULL; if(source != NULL){ g_object_get(source, "output-soundcard", &output_soundcard, NULL); } recall_ladspa = (AgsRecallLadspa *) g_object_new(AGS_TYPE_RECALL_LADSPA, "output-soundcard", output_soundcard, "source", source, "filename", filename, "effect", effect, "effect-index", effect_index, NULL); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } return(recall_ladspa); } gsequencer-3.1.3/ags/audio/ags_filter_util.c0000644000175000017500000014271113607210263016001 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include /** * SECTION:ags_filter_util * @short_description: filter util * @title: AgsFilterUtil * @section_id: * @include: ags/audio/ags_filter_util.h * * Utility functions to compute filters. */ /** * ags_filter_util_pitch_s8: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_s8(gint8 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gint8 **ptr_ptr_buffer; gint8 *ptr_buffer; gint8 *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint8 sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint8 sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint8 sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint8 sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_s16: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_s16(gint16 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gint16 **ptr_ptr_buffer; gint16 *ptr_buffer; gint16 *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; tail = 0; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); if(i + k >= buffer_length){ tail = (i + k + 2) - buffer_length; } sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1 - tail)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k - tail)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; tail = 0; while(i < buffer_length && (guint) new_freq_period > 0){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); if((guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor)) >= buffer_length){ tail = (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) + 2) - buffer_length; } sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); if(i + k >= buffer_length){ tail = (i + k + 2) - buffer_length; } sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1 - tail)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k - tail)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint16 sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint16 sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint16 sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint16 sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_s24: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_s24(gint32 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gint32 **ptr_ptr_buffer; gint32 *ptr_buffer; gint32 *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_s32: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_s32(gint32 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gint32 **ptr_ptr_buffer; gint32 *ptr_buffer; gint32 *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint32 sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_s64: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_s64(gint64 *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gint64 **ptr_ptr_buffer; gint64 *ptr_buffer; gint64 *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint64 sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint64 sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gint64 sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gint64 sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_float: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_float(gfloat *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gfloat **ptr_ptr_buffer; gfloat *ptr_buffer; gfloat *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gfloat sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gfloat sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gfloat sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gfloat sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_double: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_double(gdouble *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gdouble **ptr_ptr_buffer; gdouble *ptr_buffer; gdouble *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(offset, 1, n, buffer_length, ptr_ptr_mix_buffer); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(ptr_new_mix_buffer, 1, n, buffer_length, ptr_ptr_buffer); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gdouble sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gdouble sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; gdouble sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } for(i = 1; i < buffer_length; i++){ gdouble t; gdouble sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = buffer[i - 1]; sum1 = buffer[i]; sum = (1.0 - t) * sum0 + (t * sum1); buffer[i] = sum; } } } /** * ags_filter_util_pitch_complex: * @buffer: the audio buffer * @buffer_length: the buffer's length * @samplerate: the samplerate * @base_key: the base key * @tuning: the tuning * * Apply pitch filter. * * Since: 3.0.0 */ void ags_filter_util_pitch_complex(AgsComplex *buffer, guint buffer_length, guint samplerate, gdouble base_key, gdouble tuning) { AgsComplex **ptr_ptr_mix_buffer, **ptr_ptr_im_mix_buffer, **ptr_ptr_new_mix_buffer; AgsComplex *ptr_mix_buffer, *ptr_im_mix_buffer, *ptr_new_mix_buffer; AgsComplex *mix_buffer; AgsComplex *im_mix_buffer, *new_mix_buffer; gdouble **ptr_ptr_buffer; gdouble *ptr_buffer; gdouble *offset; gdouble base_freq, im_freq, new_freq; gdouble offset_factor, im_offset_factor, new_offset_factor; gdouble freq_period, im_freq_period, new_freq_period; gdouble t; complex sum, sum0, sum1; gdouble n; guint i, j, k; guint tail; if(tuning == 0.0){ return; } /* frequency */ base_freq = 27.5 * exp2((base_key + 48.0) / 12.0); im_freq = base_freq + 1.0; new_freq = 27.5 * exp2(((base_key + 48.0) + (tuning / 100.0)) / 12.0); /* get frequency period */ freq_period = samplerate / base_freq; im_freq_period = samplerate / im_freq; new_freq_period = samplerate / new_freq; /* get offset factor */ offset_factor = 1.0; im_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / im_freq); new_offset_factor = 1.0 / (samplerate / base_freq) * (samplerate / new_freq); /* allocate buffer */ mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); im_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); new_mix_buffer = (AgsComplex *) ags_stream_alloc(buffer_length, AGS_SOUNDCARD_COMPLEX); ptr_ptr_buffer = &ptr_buffer; ptr_ptr_mix_buffer = &ptr_mix_buffer; ptr_ptr_im_mix_buffer = &ptr_im_mix_buffer; ptr_ptr_new_mix_buffer = &ptr_new_mix_buffer; /* compute mix buffer */ for(i = 0; i < buffer_length; i++){ ptr_mix_buffer = mix_buffer + i; offset = buffer + i; n = (gdouble) i; ags_complex_set(ptr_mix_buffer, ags_complex_get(offset)); } /* compute intermediate mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(im_mix_buffer, sum); i = 1; while(i < buffer_length){ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < im_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * im_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(im_mix_buffer + (guint) (i + j), sum); } } i += j; } /* compute new mix buffer */ sum = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer, sum); i = 1; while(i < buffer_length){ if(new_freq_period > freq_period){ for(j = 0; j < new_freq_period && i + j < buffer_length;){ sum0 = ags_complex_get(mix_buffer); ags_complex_set(new_mix_buffer + (guint) i + j, sum); for(k = 1; k < freq_period && i + j < buffer_length; j++, k++){ t = (freq_period / new_freq_period) * 1.0 / exp2(j * 2.0 * M_PI * new_freq / base_freq); sum0 = ags_complex_get(mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor) - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (floor(i / new_freq_period) * new_freq_period + (k / new_offset_factor))); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } }else{ for(j = 0; j < freq_period && i + j < buffer_length;){ for(k = 1; k < new_freq_period && i + j < buffer_length; j++, k++){ t = 1.0 / exp((gdouble) k * 2.0 * M_PI * new_freq_period / freq_period); sum0 = ags_complex_get(mix_buffer + (guint) (i + k - 1)); sum1 = ags_complex_get(im_mix_buffer + (guint) (i + k)); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(new_mix_buffer + (guint) (i + j), sum); } } } i += j; } /* rewrite buffer */ for(i = 0; i < buffer_length; i++){ n = (gdouble) (i % (guint) new_freq_period); ptr_new_mix_buffer = new_mix_buffer + i; ptr_buffer = buffer + i; ags_complex_set(ptr_buffer, ags_complex_get(ptr_new_mix_buffer)); } ags_stream_free(mix_buffer); ags_stream_free(im_mix_buffer); ags_stream_free(new_mix_buffer); /* interpolation */ if(freq_period < new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; complex sum, sum0, sum1; t = 1.0 / exp(freq_period / new_freq_period); sum0 = ags_complex_get(buffer + i); sum1 = ags_complex_get(buffer + i - 1); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(buffer + i, sum); } for(i = 1; i < buffer_length; i++){ gdouble t; complex sum, sum0, sum1; t = (-1.0 * (1.0 / exp((i * 2.0 * M_PI * new_freq / samplerate) / (new_freq_period - freq_period)))) + 1.0; sum0 = ags_complex_get(buffer + i); sum1 = ags_complex_get(buffer + i - 1); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(mix_buffer + i, sum); } for(i = 1; i < buffer_length; i++){ ags_complex_set(buffer + i, ags_complex_get(mix_buffer + i)); } } if(freq_period > new_freq_period){ for(i = 1; i < buffer_length; i++){ gdouble t; complex sum, sum0, sum1; t = 1.0 / (freq_period / new_freq_period); sum0 = ags_complex_get(buffer + i); sum1 = ags_complex_get(buffer + i - 1); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(buffer + i, sum); } for(i = 1; i < buffer_length; i++){ gdouble t; complex sum, sum0, sum1; t = (-1.0 * (1.0 / (freq_period / new_freq_period * i))) + 1.0; sum0 = ags_complex_get(buffer + i); sum1 = ags_complex_get(buffer + i - 1); sum = (1.0 - t) * sum0 + (t * sum1); ags_complex_set(mix_buffer + i, sum); } for(i = 1; i < buffer_length; i++){ ags_complex_set(buffer + i, ags_complex_get(mix_buffer + i)); } } } gsequencer-3.1.3/ags/audio/ags_channel.c0000644000175000017500000127173613616617253015114 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:ags_channel * @short_description: Acts as entry point to the audio tree. * @title: AgsChannel * @section_id: * @include: ags/audio/ags_channel.h * * #AgsChannel is the entry point to the entire audio tree and its nested * recycling tree. * * Every channel has its own #AgsRecallID. As modifying link a new #AgsRecyclingContext * is indicated, since it acts as a kind of recall id tree context. */ void ags_channel_class_init(AgsChannelClass *channel_class); void ags_channel_connectable_interface_init(AgsConnectableInterface *connectable); void ags_channel_init(AgsChannel *channel); void ags_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_channel_dispose(GObject *gobject); void ags_channel_finalize(GObject *gobject); AgsUUID* ags_channel_get_uuid(AgsConnectable *connectable); gboolean ags_channel_has_resource(AgsConnectable *connectable); gboolean ags_channel_is_ready(AgsConnectable *connectable); void ags_channel_add_to_registry(AgsConnectable *connectable); void ags_channel_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_channel_list_resource(AgsConnectable *connectable); xmlNode* ags_channel_xml_compose(AgsConnectable *connectable); void ags_channel_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_channel_is_connected(AgsConnectable *connectable); void ags_channel_connect(AgsConnectable *connectable); void ags_channel_disconnect(AgsConnectable *connectable); gboolean ags_channel_reset_recycling_recursive_input(AgsChannel *input, AgsAudio **found_next, AgsAudio **found_prev, AgsChannel **next_channel, AgsChannel **prev_channel, AgsRecycling **replace_with_first_recycling, AgsRecycling **replace_with_last_recycling, guint *complete_level_first, guint *complete_level_last, gboolean *find_next, gboolean *find_prev, gboolean *replace_first, gboolean *replace_last); void ags_channel_reset_recycling_recursive_output(AgsChannel *output, AgsAudio **found_next, AgsAudio **found_prev, AgsChannel **next_channel, AgsChannel **prev_channel, AgsRecycling **replace_with_first_recycling, AgsRecycling **replace_with_last_recycling, guint *complete_level_first, guint *complete_level_last, gboolean *find_next, gboolean *find_prev, gboolean *replace_first, gboolean *replace_last); void ags_channel_reset_recycling_recursive(AgsChannel *input, AgsAudio **found_next, AgsAudio **found_prev, AgsChannel **next_channel, AgsChannel **prev_channel, AgsRecycling **replace_with_first_recycling, AgsRecycling **replace_with_last_recycling, guint *complete_level_first, guint *complete_level_last, gboolean *find_next, gboolean *find_prev, gboolean *replace_first, gboolean *replace_last); void ags_channel_reset_recycling_reset_recycling_context_up(AgsChannel *current); void ags_channel_reset_recycling_reset_recycling_context_down(AgsChannel *current_output, AgsRecyclingContext *new_recycling_context, AgsRecyclingContext *old_recycling_context); void ags_channel_reset_recycling_reset_recycling_context_down_input(AgsChannel *current_output, AgsRecyclingContext *new_recycling_context, AgsRecyclingContext *old_recycling_context); void ags_channel_reset_recycling_emit_changed_input(AgsChannel *start_channel, AgsChannel *input, AgsRecycling *changed_old_first_recycling, AgsRecycling *changed_old_last_recycling, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *first_recycling, AgsRecycling *last_recycling); void ags_channel_reset_recycling_emit_changed_output(AgsChannel *start_channel, AgsChannel *output, AgsRecycling *changed_old_first_recycling, AgsRecycling *changed_old_last_recycling, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *first_recycling, AgsRecycling *last_recycling); void ags_channel_reset_recycling_emit_changed(AgsChannel *start_channel, AgsChannel *input, AgsRecycling *changed_old_first_recycling, AgsRecycling *changed_old_last_recycling, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *first_recycling, AgsRecycling *last_recycling); void ags_channel_real_recycling_changed(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region); GList* ags_channel_add_ladspa_effect(AgsChannel *channel, gchar *filename, gchar *effect); GList* ags_channel_add_dssi_effect(AgsChannel *channel, gchar *filename, gchar *effect); GList* ags_channel_add_lv2_effect(AgsChannel *channel, gchar *filename, gchar *effect); GList* ags_channel_real_add_effect(AgsChannel *channel, gchar *filename, gchar *effect); void ags_channel_real_remove_effect(AgsChannel *channel, guint nth); void ags_channel_real_duplicate_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_real_resolve_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_real_init_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags); void ags_channel_real_play_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags); void ags_channel_real_done_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_real_cancel_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_real_cleanup_recall(AgsChannel *channel, AgsRecallID *recall_id); void ags_channel_recall_done_callback(AgsRecall *recall, AgsChannel *channel); GList* ags_channel_real_start(AgsChannel *channel, gint sound_scope); void ags_channel_real_stop(AgsChannel *channel, GList *recall_id, gint sound_scope); GList* ags_channel_real_check_scope(AgsChannel *channel, gint sound_scope); void ags_channel_recursive_set_property_setv(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value); void ags_channel_recursive_set_property_down(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value); void ags_channel_recursive_set_property_down_input(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value); void ags_channel_recursive_setup_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_setup_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_setup_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_prepare_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_prepare_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_prepare_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_do_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint staging_flags); void ags_channel_recursive_do_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint staging_flags); void ags_channel_recursive_do_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint staging_flags); void ags_channel_recursive_cleanup_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_cleanup_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_recursive_cleanup_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags); void ags_channel_real_recursive_run_stage(AgsChannel *channel, gint sound_scope, guint staging_flags); enum{ ADD_EFFECT, REMOVE_EFFECT, RECYCLING_CHANGED, DUPLICATE_RECALL, RESOLVE_RECALL, INIT_RECALL, PLAY_RECALL, DONE_RECALL, CANCEL_RECALL, CLEANUP_RECALL, START, STOP, CHECK_SCOPE, RECURSIVE_RUN_STAGE, LAST_SIGNAL, }; enum{ PROP_0, PROP_AUDIO, PROP_OUTPUT_SOUNDCARD, PROP_OUTPUT_SOUNDCARD_CHANNEL, PROP_INPUT_SOUNDCARD, PROP_INPUT_SOUNDCARD_CHANNEL, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_PAD, PROP_AUDIO_CHANNEL, PROP_LINE, PROP_OCTAVE, PROP_KEY, PROP_ABSOLUTE_KEY, PROP_NOTE_FREQUENCY, PROP_NOTE_KEY, PROP_MIDI_NOTE, PROP_PREV, PROP_PREV_PAD, PROP_NEXT, PROP_NEXT_PAD, PROP_LINK, PROP_FIRST_RECYCLING, PROP_LAST_RECYCLING, PROP_PLAYBACK, PROP_PATTERN, PROP_RECALL_ID, PROP_RECYCLING_CONTEXT, PROP_RECALL_CONTAINER, PROP_PLAY, PROP_RECALL, }; enum{ AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_ADD_RECALL_ID = 1, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE = 1 << 1, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE = 1 << 2, }AgsChannelRecursivePrepareStagingFlags; enum{ AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL = 1, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL = 1 << 1, AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE = 1 << 2, }AgsChannelRecursiveCleanupStagingFlags; static gpointer ags_channel_parent_class = NULL; static guint channel_signals[LAST_SIGNAL]; GType ags_channel_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_channel = 0; static const GTypeInfo ags_channel_info = { sizeof (AgsChannelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_channel_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsChannel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_channel_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_channel_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_channel = g_type_register_static(G_TYPE_OBJECT, "AgsChannel", &ags_channel_info, 0); g_type_add_interface_static(ags_type_channel, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_channel); } return g_define_type_id__volatile; } void ags_channel_class_init(AgsChannelClass *channel) { GObjectClass *gobject; GParamSpec *param_spec; ags_channel_parent_class = g_type_class_peek_parent(channel); /* GObjectClass */ gobject = (GObjectClass *) channel; gobject->set_property = ags_channel_set_property; gobject->get_property = ags_channel_get_property; gobject->dispose = ags_channel_dispose; gobject->finalize = ags_channel_finalize; /* properties */ /** * AgsChannel:audio: * * The assigned #AgsAudio aligning channels. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio it is assigned with"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsChannel:output-soundcard: * * The assigned output #AgsSoundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("output-soundcard", i18n_pspec("assigned output soundcard"), i18n_pspec("The output soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD, param_spec); /** * AgsChannel:output-soundcard-channel: * * The output soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("output-soundcard-channel", i18n_pspec("output soundcard channel"), i18n_pspec("The output soundcard channel"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsChannel:input-soundcard: * * The assigned input #AgsSoundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("input-soundcard", i18n_pspec("assigned input soundcard"), i18n_pspec("The input soundcard it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD, param_spec); /** * AgsChannel:input-soundcard-channel: * * The input soundcard channel. * * Since: 3.0.0 */ param_spec = g_param_spec_int("input-soundcard-channel", i18n_pspec("input soundcard channel"), i18n_pspec("The input soundcard channel"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INPUT_SOUNDCARD_CHANNEL, param_spec); /** * AgsChannel:samplerate: * * The samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("samplerate"), i18n_pspec("The samplerate"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsChannel:buffer-size: * * The buffer size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("buffer size"), i18n_pspec("The buffer size"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsChannel:format: * * The format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("format"), i18n_pspec("The format"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsChannel:pad: * * The nth pad. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pad", i18n_pspec("nth pad"), i18n_pspec("The nth pad"), 0, G_MAXUINT32, 0, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_PAD, param_spec); /** * AgsChannel:audio-channel: * * The nth audio channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("nth audio channel"), i18n_pspec("The nth audio channel"), 0, G_MAXUINT32, 0, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsChannel:line: * * The nth line. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("line", i18n_pspec("nth line"), i18n_pspec("The nth line"), 0, G_MAXUINT32, 0, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_LINE, param_spec); /** * AgsChannel:octave: * * The nth octave. * * Since: 3.0.0 */ param_spec = g_param_spec_int("octave", i18n_pspec("nth octave"), i18n_pspec("The nth octave"), AGS_CHANNEL_MINIMUM_OCTAVE, AGS_CHANNEL_MAXIMUM_OCTAVE, AGS_CHANNEL_DEFAULT_OCTAVE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OCTAVE, param_spec); /** * AgsChannel:key: * * The nth key. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("key", i18n_pspec("nth key"), i18n_pspec("The nth key"), AGS_CHANNEL_MINIMUM_OCTAVE_SEMITONE, AGS_CHANNEL_MAXIMUM_OCTAVE_SEMITONE, AGS_CHANNEL_DEFAULT_OCTAVE_SEMITONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_KEY, param_spec); /** * AgsChannel:absolute-key: * * The nth absolute key. * * Since: 3.0.0 */ param_spec = g_param_spec_int("absolute-key", i18n_pspec("nth absolute key"), i18n_pspec("The nth absolute key"), AGS_CHANNEL_MINIMUM_SEMITONE, AGS_CHANNEL_MAXIMUM_SEMITONE, AGS_CHANNEL_DEFAULT_SEMITONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ABSOLUTE_KEY, param_spec); /** * AgsChannel:note-frequency: * * The note frequency. * * Since: 3.0.0 */ param_spec = g_param_spec_double("note-frequency", i18n_pspec("note frequency"), i18n_pspec("The note frequency"), AGS_CHANNEL_MINIMUM_NOTE_FREQUENCY, AGS_CHANNEL_MAXIMUM_NOTE_FREQUENCY, AGS_CHANNEL_DEFAULT_NOTE_FREQUENCY, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE_FREQUENCY, param_spec); /** * AgsChannel:note-key: * * The assigned note key representing this channel. * * Since: 3.0.0 */ param_spec = g_param_spec_string("note-key", i18n_pspec("assigned note key"), i18n_pspec("The note key it is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NOTE_KEY, param_spec); /** * AgsChannel:midi-note: * * The nth midi note. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("midi-note", i18n_pspec("nth midi note"), i18n_pspec("The nth midi note"), AGS_CHANNEL_MINIMUM_MIDI_NOTE, AGS_CHANNEL_MAXIMUM_MIDI_NOTE, AGS_CHANNEL_DEFAULT_MIDI_NOTE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MIDI_NOTE, param_spec); /** * AgsChannel:prev: * * The assigned prev #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("prev", "assigned prev", "The prev it is assigned with", AGS_TYPE_CHANNEL, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_PREV, param_spec); /** * AgsChannel:prev-pad: * * The assigned prev pad #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("prev-pad", "assigned prev pad", "The prev pad it is assigned with", AGS_TYPE_CHANNEL, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_PREV_PAD, param_spec); /** * AgsChannel:next: * * The assigned next #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("next", "assigned next", "The next it is assigned with", AGS_TYPE_CHANNEL, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_NEXT, param_spec); /** * AgsChannel:next-pad: * * The assigned next pad #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("next-pad", "assigned next pad", "The next it is assigned with", AGS_TYPE_CHANNEL, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_NEXT_PAD, param_spec); /** * AgsChannel:link: * * The assigned link as #AgsChannel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("link", i18n_pspec("assigned link"), i18n_pspec("The link it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINK, param_spec); /** * AgsChannel:first-recycling: * * The containing #AgsRecycling it takes it #AgsAudioSignal from. * * Since: 3.0.0 */ param_spec = g_param_spec_object("first-recycling", i18n_pspec("containing first recycling"), i18n_pspec("The first recycling it contains"), AGS_TYPE_RECYCLING, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_FIRST_RECYCLING, param_spec); /** * AgsChannel:last-recycling: * * The containing #AgsRecycling it takes it #AgsAudioSignal from. * * Since: 3.0.0 */ param_spec = g_param_spec_object("last-recycling", i18n_pspec("containing last recycling"), i18n_pspec("The last recycling it contains"), AGS_TYPE_RECYCLING, G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_LAST_RECYCLING, param_spec); /** * AgsChannel:playback: * * The assigned #AgsPlayback. * * Since: 3.0.0 */ param_spec = g_param_spec_object("playback", i18n_pspec("assigned playback"), i18n_pspec("The playback it is assigned with"), AGS_TYPE_PLAYBACK, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAYBACK, param_spec); /** * AgsChannel:pattern: (type GList(AgsPatter)) (transfer full) * * The containing #AgsPattern. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("pattern", i18n_pspec("containing pattern"), i18n_pspec("The pattern it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PATTERN, param_spec); /** * AgsChannel:recall-id: (type GList(AgsRecallID)) (transfer full) * * The assigned #AgsRecallID. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-id", i18n_pspec("assigned recall id"), i18n_pspec("The recall id it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_ID, param_spec); /** * AgsChannel:recycling-context: (type GList(AgsRecyclingContext)) (transfer full) * * The containing #AgsRecyclingContext. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recycling-context", i18n_pspec("containing recycling-context"), i18n_pspec("The recycling context it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECYCLING_CONTEXT, param_spec); /** * AgsChannel:recall-container: (type GList(AgsRecallContainer)) (transfer full) * * The containing #AgsRecallContainer. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall-container", i18n_pspec("containing recall-container"), i18n_pspec("The recall container it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_CONTAINER, param_spec); /** * AgsChannel:recall: (type GList(AgsRecall)) (transfer full) * * The containing #AgsRecall in recall-context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("recall", i18n_pspec("containing recall"), i18n_pspec("The recall it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL, param_spec); /** * AgsChannel:play: (type GList(AgsRecall)) (transfer full) * * The containing #AgsRecall in play-context. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("play", i18n_pspec("containing play"), i18n_pspec("The play it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAY, param_spec); /* AgsChannelClass */ channel->recycling_changed = NULL; channel->add_effect = ags_channel_real_add_effect; channel->remove_effect = ags_channel_real_remove_effect; channel->duplicate_recall = ags_channel_real_duplicate_recall; channel->resolve_recall = ags_channel_real_resolve_recall; channel->init_recall = ags_channel_real_init_recall; channel->play_recall = ags_channel_real_play_recall; channel->done_recall = ags_channel_real_done_recall; channel->cancel_recall = ags_channel_real_cancel_recall; channel->cleanup_recall = ags_channel_real_cleanup_recall; channel->start = ags_channel_real_start; channel->stop = ags_channel_real_stop; channel->check_scope = ags_channel_real_check_scope; channel->recursive_run_stage = ags_channel_real_recursive_run_stage; /* signals */ /** * AgsChannel::recycling-changed: * @channel: the #AgsChannel recycling changed * @old_start_region: first #AgsRecycling * @old_end_region: last #AgsRecycling * @new_start_region: new first #AgsRecycling * @new_end_region: new last #AgsRecycling * @old_start_changed_region: modified link #AgsRecycling start * @old_end_changed_region: modified link #AgsRecyclig end * @new_start_changed_region: replacing link #AgsRecycling start * @new_end_changed_region: replacing link #AgsRecycling end * * The ::recycling-changed signal is invoked to notify modified recycling tree. * * Since: 3.0.0 */ channel_signals[RECYCLING_CHANGED] = g_signal_new("recycling-changed", G_TYPE_FROM_CLASS (channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsChannelClass, recycling_changed), NULL, NULL, ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT, G_TYPE_NONE, 8, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_OBJECT, G_TYPE_OBJECT); /** * AgsChannel::add-effect: * @channel: the #AgsChannel to modify * @filename: the effect's filename * @effect: the effect's name * * The ::add-effect signal notifies about added effect. * * Since: 3.0.0 */ channel_signals[ADD_EFFECT] = g_signal_new("add-effect", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, add_effect), NULL, NULL, ags_cclosure_marshal_POINTER__STRING_STRING, G_TYPE_POINTER, 2, G_TYPE_STRING, G_TYPE_STRING); /** * AgsChannel::remove-effect: * @channel: the #AgsChannel to modify * @nth: the nth effect * * The ::remove-effect signal notifies about removed effect. * * Since: 3.0.0 */ channel_signals[REMOVE_EFFECT] = g_signal_new("remove-effect", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, remove_effect), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsChannel::duplicate-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * * The ::duplicate-recall signal is invoked during playback initialization. * * Since: 3.0.0 */ channel_signals[DUPLICATE_RECALL] = g_signal_new("duplicate-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, duplicate_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsChannel::resolve-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * * The ::resolve-recall signal is invoked during playback initialization. * * Since: 3.0.0 */ channel_signals[RESOLVE_RECALL] = g_signal_new("resolve-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, resolve_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsChannel::init-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * @staging_flags: the staging flags * * The ::init-recall signal is invoked during playback initialization. * * Since: 3.0.0 */ channel_signals[INIT_RECALL] = g_signal_new("init-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, init_recall), NULL, NULL, ags_cclosure_marshal_VOID__OBJECT_UINT, G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_UINT); /** * AgsChannel::play-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * @staging_flags: the staging flags * * The ::play-recall signal is invoked during playback run. * * Since: 3.0.0 */ channel_signals[PLAY_RECALL] = g_signal_new("play-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, play_recall), NULL, NULL, ags_cclosure_marshal_VOID__OBJECT_UINT, G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_UINT); /** * AgsChannel::done-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * * The ::done-recall signal is invoked during termination of playback. * * Since: 3.0.0 */ channel_signals[DONE_RECALL] = g_signal_new("done-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, done_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsChannel::cancel-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * * The ::cancel-recall signal is invoked during termination of playback. * * Since: 3.0.0 */ channel_signals[CANCEL_RECALL] = g_signal_new("cancel-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, cancel_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsChannel::cleanup-recall: * @channel: the #AgsChannel * @recall_id: the appropriate #AgsRecallID * * The ::cleanup-recall signal is invoked during termination of playback. * * Since: 3.0.0 */ channel_signals[CLEANUP_RECALL] = g_signal_new("cleanup-recall", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, cleanup_recall), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); /** * AgsChannel::start: * @channel: the #AgsChannel * @sound_scope: the sound scope * * The ::start signal is invoked as playback starts. * * Returns: (type GLib.List) (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containing #AgsRecallID * * Since: 3.0.0 */ channel_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, start), NULL, NULL, ags_cclosure_marshal_POINTER__INT, G_TYPE_POINTER, 1, G_TYPE_INT); /** * AgsChannel::stop: * @channel: the #AgsChannel * @recall_id: the #GList-struct containing #AgsRecallID * @sound_scope: the sound scope * * The ::stop signal is invoked as playback stops. * * Since: 3.0.0 */ channel_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, stop), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_INT, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_INT); /** * AgsChannel::check-scope: * @channel: the #AgsChannel * @sound_scope: the sound scope * * The ::check-scope signal gives you control of checking scope. * * Returns: the #GList-struct containing #AgsRecallID * * Since: 3.0.0 */ channel_signals[CHECK_SCOPE] = g_signal_new("check-scope", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, check_scope), NULL, NULL, ags_cclosure_marshal_POINTER__INT, G_TYPE_POINTER, 1, G_TYPE_INT); /** * AgsChannel::recursive-run-stage: * @channel: the #AgsChannel * @sound_scope: the sound scope * @staging_flags: the staging flags * * The ::recursive-run-stage signal gives you control of checking scope. * * Since: 3.0.0 */ channel_signals[RECURSIVE_RUN_STAGE] = g_signal_new("recursive-run-stage", G_TYPE_FROM_CLASS(channel), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsChannelClass, recursive_run_stage), NULL, NULL, ags_cclosure_marshal_VOID__INT_UINT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_UINT); } void ags_channel_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_channel_get_uuid; connectable->has_resource = ags_channel_has_resource; connectable->is_ready = ags_channel_is_ready; connectable->add_to_registry = ags_channel_add_to_registry; connectable->remove_from_registry = ags_channel_remove_from_registry; connectable->list_resource = ags_channel_list_resource; connectable->xml_compose = ags_channel_xml_compose; connectable->xml_parse = ags_channel_xml_parse; connectable->is_connected = ags_channel_is_connected; connectable->connect = ags_channel_connect; connectable->disconnect = ags_channel_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } GQuark ags_channel_error_quark() { return(g_quark_from_static_string("ags-channel-error-quark")); } void ags_channel_init(AgsChannel *channel) { AgsConfig *config; gchar *str; channel->flags = 0; channel->ability_flags = 0; channel->behaviour_flags = 0; memset(channel->staging_flags, 0, (AGS_SOUND_SCOPE_LAST + 1) * sizeof(guint)); /* channel mutex */ g_rec_mutex_init(&(channel->obj_mutex)); /* uuid */ channel->uuid = ags_uuid_alloc(); ags_uuid_generate(channel->uuid); /* config */ config = ags_config_get_instance(); /* base init */ channel->audio = NULL; channel->output_soundcard = NULL; channel->output_soundcard_channel = -1; channel->input_soundcard = NULL; channel->input_soundcard_channel = 0; /* presets */ channel->samplerate = ags_soundcard_helper_config_get_samplerate(config); channel->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); channel->format = ags_soundcard_helper_config_get_format(config); /* allocation info */ channel->pad = 0; channel->audio_channel = 0; channel->line = 0; channel->octave = AGS_CHANNEL_DEFAULT_OCTAVE; channel->key = AGS_CHANNEL_DEFAULT_OCTAVE_SEMITONE; channel->absolute_key = AGS_CHANNEL_DEFAULT_SEMITONE; channel->note_frequency = AGS_CHANNEL_DEFAULT_NOTE_FREQUENCY; channel->note_key = NULL; channel->midi_note = AGS_CHANNEL_DEFAULT_MIDI_NOTE; /* inter-connected channels */ channel->prev = NULL; channel->prev_pad = NULL; channel->next = NULL; channel->next_pad = NULL; /* link and recycling */ channel->link = NULL; channel->first_recycling = NULL; channel->last_recycling = NULL; /* playback */ channel->playback = (GObject *) ags_playback_new((GObject *) channel); g_object_ref(channel->playback); /* pattern */ channel->pattern = NULL; /* recall id and recycling context */ channel->recall_id = NULL; channel->recycling_context = NULL; /* recall container */ channel->recall_container = NULL; /* play */ g_rec_mutex_init(&(channel->play_mutex)); channel->play = NULL; /* recall */ g_rec_mutex_init(&(channel->recall_mutex)); channel->recall = NULL; /* data */ channel->line_widget = NULL; channel->file_data = NULL; } void ags_channel_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsChannel *channel; GRecMutex *channel_mutex; channel = AGS_CHANNEL(gobject); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(channel_mutex); if((AgsAudio *) channel->audio == audio){ g_rec_mutex_unlock(channel_mutex); return; } if(channel->audio != NULL){ g_object_unref(G_OBJECT(channel->audio)); } if(audio != NULL){ g_object_ref(G_OBJECT(audio)); } channel->audio = (GObject *) audio; g_rec_mutex_unlock(channel_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { GObject *output_soundcard; output_soundcard = (GObject *) g_value_get_object(value); ags_channel_set_output_soundcard(channel, output_soundcard); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(channel_mutex); channel->output_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_INPUT_SOUNDCARD: { GObject *input_soundcard; input_soundcard = (GObject *) g_value_get_object(value); ags_channel_set_input_soundcard(channel, input_soundcard); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(channel_mutex); channel->input_soundcard_channel = g_value_get_int(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_channel_set_samplerate(channel, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_channel_set_buffer_size(channel, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_channel_set_format(channel, format); } break; case PROP_PAD: { g_rec_mutex_lock(channel_mutex); channel->pad = g_value_get_uint(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(channel_mutex); channel->audio_channel = g_value_get_uint(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_LINE: { g_rec_mutex_lock(channel_mutex); channel->line = g_value_get_uint(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_OCTAVE: { g_rec_mutex_lock(channel_mutex); channel->octave = g_value_get_int(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_KEY: { g_rec_mutex_lock(channel_mutex); channel->key = g_value_get_uint(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_ABSOLUTE_KEY: { g_rec_mutex_lock(channel_mutex); channel->absolute_key = g_value_get_int(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_NOTE_FREQUENCY: { g_rec_mutex_lock(channel_mutex); channel->note_frequency = g_value_get_double(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_NOTE_KEY: { gchar *note_key; note_key = g_value_get_string(value); g_rec_mutex_lock(channel_mutex); if(channel->note_key == note_key){ g_rec_mutex_unlock(channel_mutex); return; } if(channel->note_key != NULL){ g_free(channel->note_key); } channel->note_key = g_strdup(note_key); g_rec_mutex_unlock(channel_mutex); } break; case PROP_MIDI_NOTE: { g_rec_mutex_lock(channel_mutex); channel->midi_note = g_value_get_uint(value); g_rec_mutex_unlock(channel_mutex); } break; case PROP_LINK: { AgsChannel *link; link = (AgsChannel *) g_value_get_object(value); g_rec_mutex_lock(channel_mutex); if(channel->link == link){ g_rec_mutex_unlock(channel_mutex); return; } g_rec_mutex_unlock(channel_mutex); ags_channel_set_link(channel, link, NULL); } break; case PROP_PLAYBACK: { AgsPlayback *playback; playback = (AgsPlayback *) g_value_get_object(value); g_rec_mutex_lock(channel_mutex); if(channel->playback == (GObject *) playback){ g_rec_mutex_unlock(channel_mutex); return; } if(channel->playback != NULL){ g_object_unref(channel->playback); } if(playback != NULL){ g_object_ref(playback); } channel->playback = (GObject *) playback; g_rec_mutex_unlock(channel_mutex); } break; case PROP_PATTERN: { AgsPattern *pattern; pattern = (AgsPattern *) g_value_get_pointer(value); ags_channel_add_pattern(channel, (GObject *) pattern); } break; case PROP_RECALL_ID: { AgsRecallID *recall_id; recall_id = (AgsRecallID *) g_value_get_pointer(value); ags_channel_add_recall_id(channel, recall_id); } break; case PROP_RECYCLING_CONTEXT: { AgsRecyclingContext *recycling_context; recycling_context = (AgsRecyclingContext *) g_value_get_pointer(value); g_rec_mutex_lock(channel_mutex); if(recycling_context == NULL || g_list_find(channel->recycling_context, recycling_context) != NULL){ g_rec_mutex_unlock(channel_mutex); return; } channel->recycling_context = g_list_prepend(channel->recycling_context, recycling_context); g_object_ref(recycling_context); g_rec_mutex_unlock(channel_mutex); } break; case PROP_RECALL_CONTAINER: { AgsRecallContainer *recall_container; recall_container = (AgsRecallContainer *) g_value_get_pointer(value); ags_channel_add_recall_container(channel, (GObject *) recall_container); } break; case PROP_PLAY: { AgsRecall *play; play = (AgsRecall *) g_value_get_pointer(value); ags_channel_add_recall(channel, (GObject *) play, TRUE); } break; case PROP_RECALL: { AgsRecall *recall; /* */ recall = (AgsRecall *) g_value_get_pointer(value); ags_channel_add_recall(channel, (GObject *) recall, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_channel_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsChannel *channel; GRecMutex *channel_mutex; channel = AGS_CHANNEL(gobject); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->audio); g_rec_mutex_unlock(channel_mutex); } break; case PROP_OUTPUT_SOUNDCARD: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->output_soundcard); g_rec_mutex_unlock(channel_mutex); } break; case PROP_OUTPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(channel_mutex); g_value_set_int(value, channel->output_soundcard_channel); g_rec_mutex_unlock(channel_mutex); } break; case PROP_INPUT_SOUNDCARD: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->input_soundcard); g_rec_mutex_unlock(channel_mutex); } break; case PROP_INPUT_SOUNDCARD_CHANNEL: { g_rec_mutex_lock(channel_mutex); g_value_set_int(value, channel->input_soundcard_channel); g_rec_mutex_unlock(channel_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->samplerate); g_rec_mutex_unlock(channel_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->buffer_size); g_rec_mutex_unlock(channel_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->format); g_rec_mutex_unlock(channel_mutex); } break; case PROP_PAD: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->pad); g_rec_mutex_unlock(channel_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->audio_channel); g_rec_mutex_unlock(channel_mutex); } break; case PROP_LINE: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->line); g_rec_mutex_unlock(channel_mutex); } break; case PROP_ABSOLUTE_KEY: { g_rec_mutex_lock(channel_mutex); g_value_set_int(value, channel->absolute_key); g_rec_mutex_unlock(channel_mutex); } break; case PROP_NOTE_FREQUENCY: { g_rec_mutex_lock(channel_mutex); g_value_set_double(value, channel->note_frequency); g_rec_mutex_unlock(channel_mutex); } break; case PROP_NOTE_KEY: { g_rec_mutex_lock(channel_mutex); g_value_set_string(value, channel->note_key); g_rec_mutex_unlock(channel_mutex); } break; case PROP_MIDI_NOTE: { g_rec_mutex_lock(channel_mutex); g_value_set_uint(value, channel->midi_note); g_rec_mutex_unlock(channel_mutex); } break; case PROP_PREV: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->prev); g_rec_mutex_unlock(channel_mutex); } break; case PROP_PREV_PAD: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->prev_pad); g_rec_mutex_unlock(channel_mutex); } break; case PROP_NEXT: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->next); g_rec_mutex_unlock(channel_mutex); } break; case PROP_NEXT_PAD: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->next_pad); g_rec_mutex_unlock(channel_mutex); } break; case PROP_LINK: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->link); g_rec_mutex_unlock(channel_mutex); } break; case PROP_FIRST_RECYCLING: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->first_recycling); g_rec_mutex_unlock(channel_mutex); } break; case PROP_LAST_RECYCLING: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->last_recycling); g_rec_mutex_unlock(channel_mutex); } break; case PROP_PLAYBACK: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, channel->playback); g_rec_mutex_unlock(channel_mutex); } break; case PROP_PATTERN: { g_rec_mutex_lock(channel_mutex); g_value_set_pointer(value, g_list_copy_deep(channel->pattern, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(channel_mutex); } break; case PROP_RECALL_ID: { g_rec_mutex_lock(channel_mutex); g_value_set_pointer(value, g_list_copy_deep(channel->recall_id, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(channel_mutex); } break; case PROP_RECYCLING_CONTEXT: { g_rec_mutex_lock(channel_mutex); g_value_set_pointer(value, g_list_copy_deep(channel->recycling_context, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(channel_mutex); } break; case PROP_RECALL_CONTAINER: { g_rec_mutex_lock(channel_mutex); g_value_set_pointer(value, g_list_copy_deep(channel->recall_container, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(channel_mutex); } break; case PROP_PLAY: { GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* */ g_rec_mutex_lock(play_mutex); g_value_set_pointer(value, g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(play_mutex); } break; case PROP_RECALL: { GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* */ g_rec_mutex_lock(recall_mutex); g_value_set_pointer(value, g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_channel_dispose(GObject *gobject) { AgsChannel *channel; AgsRecycling *recycling, *recycling_next; AgsRecycling *end_region; GList *list, *list_next; gboolean dispose_recycling; channel = AGS_CHANNEL(gobject); ags_connectable_disconnect(AGS_CONNECTABLE(channel)); /* audio */ dispose_recycling = FALSE; if(channel->audio != NULL){ if(((AGS_AUDIO_INPUT_HAS_RECYCLING & (AGS_AUDIO(channel->audio)->flags)) != 0 && AGS_IS_INPUT(channel) && channel->link == NULL) || ((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (AGS_AUDIO(channel->audio)->flags)) != 0 && AGS_IS_OUTPUT(channel))){ dispose_recycling = TRUE; } g_object_unref(channel->audio); channel->audio = NULL; } /* soundcard */ if(channel->output_soundcard != NULL){ g_object_unref(channel->output_soundcard); channel->output_soundcard = NULL; } if(channel->input_soundcard != NULL){ g_object_unref(channel->input_soundcard); channel->input_soundcard = NULL; } /* recycling */ recycling = channel->first_recycling; if(recycling != NULL){ end_region = channel->last_recycling->next; while(recycling != end_region){ recycling_next = recycling->next; if(dispose_recycling){ g_object_run_dispose((GObject *) recycling); g_object_unref((GObject *) recycling); } recycling = recycling_next; } channel->first_recycling = NULL; channel->last_recycling = NULL; } /* playback */ if(channel->playback != NULL){ AgsPlayback *playback; playback = (AgsPlayback *) channel->playback; //TODO:JK: stop threads g_object_set(playback, "channel", NULL, NULL); // g_object_run_dispose(playback); g_object_unref(playback); channel->playback = NULL; } /* recall id */ if(channel->recall_id != NULL){ list = channel->recall_id; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(channel->recall_id, g_object_unref); channel->recall_id = NULL; } /* recall container */ if(channel->recall_container != NULL){ list = channel->recall_container; while(list != NULL){ AgsRecall *recall_audio; GList *recall_audio_run; list_next = list->next; g_object_get(list->data, "recall-audio", &recall_audio, "recall-audio-run", &recall_audio_run, NULL); if(recall_audio == NULL && recall_audio_run == NULL){ g_object_run_dispose((GObject *) list->data); } if(recall_audio != NULL){ g_object_unref(recall_audio); } g_list_free_full(recall_audio_run, g_object_unref); list = list_next; } g_list_free_full(channel->recall_container, g_object_unref); channel->recall_container = NULL; } /* recall */ if(channel->recall != NULL){ g_rec_mutex_lock(AGS_CHANNEL_GET_RECALL_MUTEX(channel)); list = channel->recall; while(list != NULL){ list_next = list->next; g_object_run_dispose((GObject *) list->data); list = list_next; } g_list_free_full(channel->recall, g_object_unref); channel->recall = NULL; g_rec_mutex_unlock(AGS_CHANNEL_GET_RECALL_MUTEX(channel)); } /* play */ if(channel->play != NULL){ g_rec_mutex_lock(AGS_CHANNEL_GET_PLAY_MUTEX(channel)); list = channel->play; while(list != NULL){ list_next = list->next; g_object_run_dispose((GObject *) list->data); list = list_next; } g_list_free_full(channel->play, g_object_unref); channel->play = NULL; g_rec_mutex_unlock(AGS_CHANNEL_GET_PLAY_MUTEX(channel)); } /* pattern */ if(channel->pattern != NULL){ list = channel->pattern; while(list != NULL){ list_next = list->next; g_object_run_dispose((GObject *) list->data); list = list_next; } g_list_free_full(channel->pattern, g_object_unref); channel->pattern = NULL; } /* call parent */ G_OBJECT_CLASS(ags_channel_parent_class)->dispose(gobject); } void ags_channel_finalize(GObject *gobject) { AgsChannel *channel; AgsRecycling *recycling, *recycling_next; channel = AGS_CHANNEL(gobject); /* audio */ if(channel->audio != NULL){ g_object_unref(channel->audio); } /* soundcard */ if(channel->output_soundcard != NULL){ g_object_unref(channel->output_soundcard); } if(channel->input_soundcard != NULL){ g_object_unref(channel->input_soundcard); } /* recycling */ recycling = channel->first_recycling; if(recycling != NULL){ while(recycling != channel->last_recycling->next){ recycling_next = recycling->next; g_object_unref((GObject *) recycling); recycling = recycling_next; } } /* key string */ if(channel->note_key != NULL){ free(channel->note_key); } /* playback */ if(channel->playback != NULL){ g_object_unref(channel->playback); } /* recall id */ g_list_free_full(channel->recall_id, g_object_unref); /* recall */ g_list_free_full(channel->recall_container, g_object_unref); g_list_free_full(channel->recall, g_object_unref); g_list_free_full(channel->play, g_object_unref); /* pattern */ g_list_free_full(channel->pattern, g_object_unref); /* call parent class */ G_OBJECT_CLASS(ags_channel_parent_class)->finalize(gobject); } AgsUUID* ags_channel_get_uuid(AgsConnectable *connectable) { AgsChannel *channel; AgsUUID *ptr; GRecMutex *channel_mutex; channel = AGS_CHANNEL(connectable); /* get channel signal mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get UUID */ g_rec_mutex_lock(channel_mutex); ptr = channel->uuid; g_rec_mutex_unlock(channel_mutex); return(ptr); } gboolean ags_channel_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_channel_is_ready(AgsConnectable *connectable) { AgsChannel *channel; gboolean is_ready; channel = AGS_CHANNEL(connectable); /* check is added */ is_ready = ags_channel_test_flags(channel, AGS_CHANNEL_ADDED_TO_REGISTRY); return(is_ready); } void ags_channel_add_to_registry(AgsConnectable *connectable) { AgsChannel *channel; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *start_list, *list; if(ags_connectable_is_ready(connectable)){ return; } channel = AGS_CHANNEL(connectable); ags_channel_set_flags(channel, AGS_CHANNEL_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) channel); ags_registry_add_entry(registry, entry); } /* get some fields */ g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); /* add recycling */ if(first_recycling != NULL){ recycling = first_recycling; g_object_ref(recycling); /* get end recycling */ end_recycling = ags_recycling_next(last_recycling); while(recycling != end_recycling){ /* add */ ags_connectable_add_to_registry(AGS_CONNECTABLE(recycling)); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } g_object_unref(first_recycling); g_object_unref(last_recycling); if(end_recycling != NULL){ g_object_unref(end_recycling); } } /* add play */ g_object_get(channel, "play", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* add recall */ g_object_get(channel, "recall", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_add_to_registry(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_channel_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_channel_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_channel_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_channel_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_channel_is_connected(AgsConnectable *connectable) { AgsChannel *channel; gboolean is_connected; channel = AGS_CHANNEL(connectable); /* check is connected */ is_connected = ags_channel_test_flags(channel, AGS_CHANNEL_CONNECTED); return(is_connected); } void ags_channel_connect(AgsConnectable *connectable) { AgsChannel *channel; AgsChannel *link; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; GList *start_list, *list; if(ags_connectable_is_connected(connectable)){ return; } channel = AGS_CHANNEL(connectable); ags_channel_set_flags(channel, AGS_CHANNEL_CONNECTED); #ifdef AGS_DEBUG g_message("connecting channel"); #endif /* get some fields */ g_object_get(channel, "link", &link, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); /* connect recycling */ if(first_recycling != NULL && (AGS_IS_OUTPUT(channel) || (AGS_IS_INPUT(channel) && link == NULL))){ recycling = first_recycling; g_object_ref(recycling); /* get end recycling */ end_recycling = ags_recycling_next(last_recycling); while(recycling != end_recycling){ /* connect */ ags_connectable_connect(AGS_CONNECTABLE(recycling)); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } if(end_recycling != NULL){ g_object_unref(end_recycling); } } if(link != NULL){ g_object_unref(link); } if(first_recycling != NULL){ g_object_unref(first_recycling); } if(last_recycling != NULL){ g_object_unref(last_recycling); } //NOTE:JK: playback connected by playback domain /* connect pattern */ g_object_get(channel, "pattern", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* connect recall container */ g_object_get(channel, "recall-container", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* connect recall - play context */ g_object_get(channel, "play", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* connect recall - recall context */ g_object_get(channel, "recall", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } void ags_channel_disconnect(AgsConnectable *connectable) { AgsChannel *channel; AgsChannel *link; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; GList *start_list, *list; if(!ags_connectable_is_connected(connectable)){ return; } channel = AGS_CHANNEL(connectable); ags_channel_unset_flags(channel, AGS_CHANNEL_CONNECTED); #ifdef AGS_DEBUG g_message("disconnecting channel"); #endif /* get some fields */ g_object_get(channel, "link", &link, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); /* disconnect recycling */ if(first_recycling != NULL && (AGS_IS_OUTPUT(channel) || (AGS_IS_INPUT(channel) && link == NULL))){ recycling = first_recycling; g_object_ref(recycling); /* get end recycling */ end_recycling = ags_recycling_next(last_recycling); while(recycling != end_recycling){ /* disconnect */ ags_connectable_disconnect(AGS_CONNECTABLE(recycling)); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } if(end_recycling != NULL){ g_object_unref(end_recycling); } } if(link != NULL){ g_object_unref(link); } if(first_recycling != NULL){ g_object_unref(first_recycling); } if(last_recycling != NULL){ g_object_unref(last_recycling); } /* disconnect pattern */ g_object_get(channel, "pattern", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* disconnect recall container */ g_object_get(channel, "recall-container", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* disconnect recall - play context */ g_object_get(channel, "play", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); /* disconnect recall - recall context */ g_object_get(channel, "recall", &start_list, NULL); list = start_list; while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_channel_get_obj_mutex: * @channel: the #AgsChannel * * Get object mutex. * * Returns: the #GRecMutex to lock @channel * * Since: 3.1.0 */ GRecMutex* ags_channel_get_obj_mutex(AgsChannel *channel) { if(!AGS_IS_CHANNEL(channel)){ return(NULL); } return(AGS_CHANNEL_GET_OBJ_MUTEX(channel)); } /** * ags_channel_get_play_mutex: * @channel: the #AgsChannel * * Get play mutex. * * Returns: the #GRecMutex to lock @channel's play property * * Since: 3.1.0 */ GRecMutex* ags_channel_get_play_mutex(AgsChannel *channel) { if(!AGS_IS_CHANNEL(channel)){ return(NULL); } return(AGS_CHANNEL_GET_PLAY_MUTEX(channel)); } /** * ags_channel_get_recall_mutex: * @channel: the #AgsChannel * * Get recall mutex. * * Returns: the #GRecMutex to lock @channel's recall property * * Since: 3.1.0 */ GRecMutex* ags_channel_get_recall_mutex(AgsChannel *channel) { if(!AGS_IS_CHANNEL(channel)){ return(NULL); } return(AGS_CHANNEL_GET_RECALL_MUTEX(channel)); } /** * ags_channel_test_flags: * @channel: the #AgsChannel * @flags: the flags * * Test @flags to be set on @channel. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_channel_test_flags(AgsChannel *channel, guint flags) { gboolean retval; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(FALSE); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* test */ g_rec_mutex_lock(channel_mutex); retval = (flags & (channel->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(channel_mutex); return(retval); } /** * ags_channel_set_flags: * @channel: the #AgsChannel * @flags: see #AgsChannelFlags-enum * * Enable a feature of @channel. * * Since: 3.0.0 */ void ags_channel_set_flags(AgsChannel *channel, guint flags) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(channel_mutex); channel->flags |= flags; g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_unset_flags: * @channel: the #AgsChannel * @flags: see #AgsChannelFlags-enum * * Disable a feature of @channel. * * Since: 3.0.0 */ void ags_channel_unset_flags(AgsChannel *channel, guint flags) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(channel_mutex); channel->flags &= (~flags); g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_test_ability_flags: * @channel: the #AgsChannel * @ability_flags: the ability flags * * Test @ability_flags to be set on @channel. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_channel_test_ability_flags(AgsChannel *channel, guint ability_flags) { gboolean retval; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(FALSE); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* test */ g_rec_mutex_lock(channel_mutex); retval = (ability_flags & (channel->ability_flags)) ? TRUE: FALSE; g_rec_mutex_unlock(channel_mutex); return(retval); } /** * ags_channel_set_ability_flags: * @channel: the #AgsChannel * @ability_flags: see enum AgsSoundAbilityFlags * * Enable an ability of AgsChannel. * * Since: 3.0.0 */ void ags_channel_set_ability_flags(AgsChannel *channel, guint ability_flags) { AgsAudio *audio; AgsPlaybackDomain *playback_domain; AgsPlayback *playback; GObject *output_soundcard; guint samplerate, buffer_size; guint channel_ability_flags; gboolean super_threaded_channel; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get channel fields */ g_rec_mutex_lock(channel_mutex); channel_ability_flags = channel->ability_flags; samplerate = channel->samplerate; buffer_size = channel->buffer_size; g_rec_mutex_unlock(channel_mutex); g_object_get(channel, "audio", &audio, "output-soundcard", &output_soundcard, "playback", &playback, NULL); /* get playback fields */ super_threaded_channel = ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL); g_object_get(playback, "playback-domain", &playback_domain, NULL); if(super_threaded_channel){ /* playback ability */ if((AGS_SOUND_ABILITY_PLAYBACK & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_PLAYBACK & (channel_ability_flags)) == 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; channel_thread = ags_channel_thread_new(output_soundcard, (GObject *) channel); ags_channel_thread_set_sound_scope(channel_thread, AGS_SOUND_SCOPE_PLAYBACK); g_object_set(channel_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_set_channel_thread(playback, (AgsThread *) channel_thread, AGS_SOUND_SCOPE_PLAYBACK); /* set thread child */ audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_PLAYBACK); ags_thread_add_child_extended((AgsThread *) audio_thread, (AgsThread *) channel_thread, TRUE, TRUE); } /* sequencer ability */ if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_SEQUENCER & (channel_ability_flags)) == 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; channel_thread = ags_channel_thread_new(output_soundcard, (GObject *) channel); ags_channel_thread_set_sound_scope(channel_thread, AGS_SOUND_SCOPE_SEQUENCER); g_object_set(channel_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_set_channel_thread(playback, (AgsThread *) channel_thread, AGS_SOUND_SCOPE_SEQUENCER); /* set thread child */ audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_SEQUENCER); ags_thread_add_child_extended((AgsThread *) audio_thread, (AgsThread *) channel_thread, TRUE, TRUE); } /* notation ability */ if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_NOTATION & (channel_ability_flags)) == 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; channel_thread = ags_channel_thread_new(output_soundcard, (GObject *) channel); ags_channel_thread_set_sound_scope(channel_thread, AGS_SOUND_SCOPE_NOTATION); g_object_set(channel_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_set_channel_thread(playback, (AgsThread *) channel_thread, AGS_SOUND_SCOPE_NOTATION); /* set thread child */ audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_NOTATION); ags_thread_add_child_extended((AgsThread *) audio_thread, (AgsThread *) channel_thread, TRUE, TRUE); } /* wave ability */ if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_WAVE & (channel_ability_flags)) == 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; channel_thread = ags_channel_thread_new(output_soundcard, (GObject *) channel); ags_channel_thread_set_sound_scope(channel_thread, AGS_SOUND_SCOPE_WAVE); g_object_set(channel_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_set_channel_thread(playback, (AgsThread *) channel_thread, AGS_SOUND_SCOPE_WAVE); /* set thread child */ audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_WAVE); ags_thread_add_child_extended((AgsThread *) audio_thread, (AgsThread *) channel_thread, TRUE, TRUE); } /* midi ability */ if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) != 0 && (AGS_SOUND_ABILITY_MIDI & (channel_ability_flags)) == 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; channel_thread = ags_channel_thread_new(output_soundcard, (GObject *) channel); ags_channel_thread_set_sound_scope(channel_thread, AGS_SOUND_SCOPE_MIDI); g_object_set(channel_thread, "frequency", ceil((gdouble) samplerate / (gdouble) buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK, NULL); ags_playback_set_channel_thread(playback, (AgsThread *) channel_thread, AGS_SOUND_SCOPE_MIDI); /* set thread child */ audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_MIDI); ags_thread_add_child_extended((AgsThread *) audio_thread, (AgsThread *) channel_thread, TRUE, TRUE); } } /* unref */ g_object_unref(audio); if(output_soundcard != NULL){ g_object_unref(output_soundcard); } if(playback_domain != NULL){ g_object_unref(playback_domain); } if(playback != NULL){ g_object_unref(playback); } /* set flags */ g_rec_mutex_lock(channel_mutex); channel->ability_flags |= ability_flags; g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_unset_ability_flags: * @channel: the #AgsChannel * @ability_flags: see enum AgsSoundAbilityFlags * * Disable an ability of AgsChannel. * * Since: 3.0.0 */ void ags_channel_unset_ability_flags(AgsChannel *channel, guint ability_flags) { AgsPlaybackDomain *playback_domain; AgsPlayback *playback; guint channel_ability_flags; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get channel fields */ g_rec_mutex_lock(channel_mutex); channel_ability_flags = channel->ability_flags; g_rec_mutex_unlock(channel_mutex); g_object_get(channel, "playback", &playback, NULL); /* get playback fields */ g_object_get(playback, "playback-domain", &playback_domain, NULL); /* playback ability */ if((AGS_SOUND_ABILITY_PLAYBACK & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_PLAYBACK & (channel_ability_flags)) != 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_PLAYBACK); channel_thread = (AgsChannelThread *) ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_PLAYBACK); ags_thread_remove_child((AgsThread *) audio_thread, (AgsThread *) channel_thread); ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_PLAYBACK); } /* notation ability */ if((AGS_SOUND_ABILITY_NOTATION & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_NOTATION & (channel_ability_flags)) != 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_NOTATION); channel_thread = (AgsChannelThread *) ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_NOTATION); ags_thread_remove_child((AgsThread *) audio_thread, (AgsThread *) channel_thread); ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_NOTATION); } /* sequencer ability */ if((AGS_SOUND_ABILITY_SEQUENCER & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_SEQUENCER & (channel_ability_flags)) != 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_SEQUENCER); channel_thread = (AgsChannelThread *) ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_SEQUENCER); ags_thread_remove_child((AgsThread *) audio_thread, (AgsThread *) channel_thread); ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_SEQUENCER); } /* wave ability */ if((AGS_SOUND_ABILITY_WAVE & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_WAVE & (channel_ability_flags)) != 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_WAVE); channel_thread = (AgsChannelThread *) ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_WAVE); ags_thread_remove_child((AgsThread *) audio_thread, (AgsThread *) channel_thread); ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_WAVE); } /* midi ability */ if((AGS_SOUND_ABILITY_MIDI & (ability_flags)) == 0 && (AGS_SOUND_ABILITY_MIDI & (channel_ability_flags)) != 0){ AgsAudioThread *audio_thread; AgsChannelThread *channel_thread; audio_thread = (AgsAudioThread *) ags_playback_domain_get_audio_thread(playback_domain, AGS_SOUND_SCOPE_MIDI); channel_thread = (AgsChannelThread *) ags_playback_get_channel_thread(playback, AGS_SOUND_SCOPE_MIDI); ags_thread_remove_child((AgsThread *) audio_thread, (AgsThread *) channel_thread); ags_playback_set_channel_thread(playback, NULL, AGS_SOUND_SCOPE_MIDI); } if(playback_domain != NULL){ g_object_unref(playback_domain); } if(playback != NULL){ g_object_unref(playback); } /* unset flags */ g_rec_mutex_lock(channel_mutex); channel->ability_flags &= (~ability_flags); g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_test_behaviour_flags: * @channel: the #AgsChannel * @behaviour_flags: the behaviour flags * * Test @behaviour_flags to be set on @channel. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_channel_test_behaviour_flags(AgsChannel *channel, guint behaviour_flags) { gboolean retval; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(FALSE); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* test */ g_rec_mutex_lock(channel_mutex); retval = (behaviour_flags & (channel->behaviour_flags)) ? TRUE: FALSE; g_rec_mutex_unlock(channel_mutex); return(retval); } /** * ags_channel_set_behaviour_flags: * @channel: the #AgsChannel * @behaviour_flags: the behaviour flags * * Set behaviour flags. * * Since: 3.0.0 */ void ags_channel_set_behaviour_flags(AgsChannel *channel, guint behaviour_flags) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* set flags */ g_rec_mutex_lock(channel_mutex); channel->behaviour_flags |= behaviour_flags; g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_unset_behaviour_flags: * @channel: the #AgsChannel * @behaviour_flags: the behaviour flags * * Unset behaviour flags. * * Since: 3.0.0 */ void ags_channel_unset_behaviour_flags(AgsChannel *channel, guint behaviour_flags) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* unset flags */ g_rec_mutex_lock(channel_mutex); channel->behaviour_flags &= (~behaviour_flags); g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_test_staging_flags: * @channel: the #AgsChannel * @sound_scope: the #AgsSoundScope to test * @staging_flags: the staging flags * * Test @staging_flags to be set on @channel. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_channel_test_staging_flags(AgsChannel *channel, gint sound_scope, guint staging_flags) { gboolean retval; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(FALSE); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* test */ g_rec_mutex_lock(channel_mutex); retval = (staging_flags & (channel->staging_flags[sound_scope])) ? TRUE: FALSE; g_rec_mutex_unlock(channel_mutex); return(retval); } /** * ags_channel_set_staging_flags: * @channel: the #AgsChannel * @sound_scope: the #AgsSoundScope to apply, or -1 to apply to all * @staging_flags: the staging flags * * Set staging flags. * * Since: 3.0.0 */ void ags_channel_set_staging_flags(AgsChannel *channel, gint sound_scope, guint staging_flags) { guint i; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* set flags */ g_rec_mutex_lock(channel_mutex); if(sound_scope < 0){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ channel->staging_flags[i] |= staging_flags; } }else if(sound_scope < AGS_SOUND_SCOPE_LAST){ channel->staging_flags[sound_scope] |= staging_flags; } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_unset_staging_flags: * @channel: the #AgsChannel * @sound_scope: the #AgsSoundScope to apply, or -1 to apply to all * @staging_flags: the staging flags * * Unset staging flags. * * Since: 3.0.0 */ void ags_channel_unset_staging_flags(AgsChannel *channel, gint sound_scope, guint staging_flags) { guint i; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* unset flags */ g_rec_mutex_lock(channel_mutex); if(sound_scope < 0){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ channel->staging_flags[i] &= (~staging_flags); } }else if(sound_scope < AGS_SOUND_SCOPE_LAST){ channel->staging_flags[sound_scope] &= (~staging_flags); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_get_audio: * @channel: the #AgsChannel * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ GObject* ags_channel_get_audio(AgsChannel *channel) { GObject *audio; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "audio", &audio, NULL); return(audio); } /** * ags_channel_set_audio: * @channel: the #AgsChannel * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_channel_set_audio(AgsChannel *channel, GObject *audio) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "audio", audio, NULL); } /** * ags_channel_next: * @channel: the #AgsChannel * * Iterate @channel. * * Returns: (transfer full): the next of #AgsChannel if available, otherwise %NULL * * Since: 3.0.0 */ AgsChannel* ags_channel_next(AgsChannel *channel) { AgsChannel *next; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get next */ g_rec_mutex_lock(channel_mutex); next = channel->next; if(next != NULL){ g_object_ref(next); } g_rec_mutex_unlock(channel_mutex); return(next); } /** * ags_channel_prev: * @channel: the #AgsChannel * * Iterate @channel. * * Returns: (transfer full): the prev of #AgsChannel if available, otherwise %NULL * * Since: 3.0.0 */ AgsChannel* ags_channel_prev(AgsChannel *channel) { AgsChannel *prev; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get prev */ g_rec_mutex_lock(channel_mutex); prev = channel->prev; if(prev != NULL){ g_object_ref(prev); } g_rec_mutex_unlock(channel_mutex); return(prev); } /** * ags_channel_next_pad: * @channel: the #AgsChannel * * Iterate @channel. * * Returns: (transfer full): the next pad of #AgsChannel if available, otherwise %NULL * * Since: 3.0.0 */ AgsChannel* ags_channel_next_pad(AgsChannel *channel) { AgsChannel *next_pad; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get next pad */ g_rec_mutex_lock(channel_mutex); next_pad = channel->next_pad; if(next_pad != NULL){ g_object_ref(next_pad); } g_rec_mutex_unlock(channel_mutex); return(next_pad); } /** * ags_channel_prev_pad: * @channel: the #AgsChannel * * Iterate @channel. * * Returns: (transfer full): the prev pad of #AgsChannel if available, otherwise %NULL * * Since: 3.0.0 */ AgsChannel* ags_channel_prev_pad(AgsChannel *channel) { AgsChannel *prev_pad; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get prev pad */ g_rec_mutex_lock(channel_mutex); prev_pad = channel->prev_pad; if(prev_pad != NULL){ g_object_ref(prev_pad); } g_rec_mutex_unlock(channel_mutex); return(prev_pad); } /** * ags_channel_first: * @channel: an #AgsChannel * * Iterates until the first #AgsChannel was found. * * Returns: (transfer full): the first #AgsChannel * * Since: 3.0.0 */ AgsChannel* ags_channel_first(AgsChannel *channel) { AgsChannel *prev; gboolean has_prev; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* first */ channel = ags_channel_pad_first(channel); while(channel != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check prev */ has_prev = TRUE; g_rec_mutex_lock(channel_mutex); prev = channel->prev; if(prev == NULL){ has_prev = FALSE; }else{ g_object_ref(prev); } g_rec_mutex_unlock(channel_mutex); if(!has_prev){ break; } /* iterate */ g_object_unref(channel); channel = prev; } return(channel); } /** * ags_channel_last: * @channel: an #AgsChannel * * Iterates until the last #AgsChannel was found. * * Returns: (transfer full): the last #AgsChannel * * Since: 3.0.0 */ AgsChannel* ags_channel_last(AgsChannel *channel) { AgsChannel *next; gboolean has_next; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* last */ channel = ags_channel_pad_last(channel); while(channel != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check next */ has_next = TRUE; g_rec_mutex_lock(channel_mutex); next = channel->next; if(next == NULL){ has_next = FALSE; }else{ g_object_ref(next); } g_rec_mutex_unlock(channel_mutex); if(!has_next){ break; } /* iterate */ g_object_unref(channel); channel = next; } return(channel); } /** * ags_channel_nth: * @channel: an #AgsChannel * @nth: the count to iterate * * Iterates @nth times forward. * * Returns: (transfer full): the nth #AgsChannel * * Since: 3.0.0 */ AgsChannel* ags_channel_nth(AgsChannel *channel, guint nth) { AgsChannel *next; guint i; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_ref(channel); for(i = 0; i < nth && channel != NULL; i++){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* prepare */ g_rec_mutex_lock(channel_mutex); next = channel->next; if(next != NULL){ g_object_ref(next); } g_rec_mutex_unlock(channel_mutex); /* iterate */ g_object_unref(channel); channel = next; } #ifdef AGS_DEBUG if((nth != 0 && i != nth) || channel == NULL){ g_message("ags_channel_nth:\n nth channel does not exist\n `- stopped @: i = %u; nth = %u\n", i, nth); } #endif return(channel); } /** * ags_channel_pad_first: * @channel: an #AgsChannel * * Iterates until the first pad has been reached. * * Returns: (transfer full): the first #AgsChannel with the same audio channel as @channel * * Since: 3.0.0 */ AgsChannel* ags_channel_pad_first(AgsChannel *channel) { AgsChannel *prev_pad; gboolean has_prev_pad; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* pad first */ g_object_ref(channel); while(channel != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check has prev pad */ has_prev_pad = TRUE; g_rec_mutex_lock(channel_mutex); prev_pad = channel->prev_pad; if(prev_pad == NULL){ has_prev_pad = FALSE; }else{ g_object_ref(prev_pad); } g_rec_mutex_unlock(channel_mutex); if(!has_prev_pad){ break; } /* iterate */ g_object_unref(channel); channel = prev_pad; } return(channel); } /** * ags_channel_pad_last: * @channel: an #AgsChannel * * Iterates until the last pad has been reached. * * Returns: (transfer full): the last #AgsChannel with the same audio channel as @channel * * Since: 3.0.0 */ AgsChannel* ags_channel_pad_last(AgsChannel *channel) { AgsChannel *next_pad; gboolean has_next_pad; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_ref(channel); while(channel != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check has next pad */ has_next_pad = TRUE; g_rec_mutex_lock(channel_mutex); next_pad = channel->next_pad; if(next_pad == NULL){ has_next_pad = FALSE; }else{ g_object_ref(next_pad); } g_rec_mutex_unlock(channel_mutex); if(!has_next_pad){ break; } /* iterate */ g_object_unref(channel); channel = next_pad; } return(channel); } /** * ags_channel_pad_nth: * @channel: an #AgsChannel * @nth: the count of pads to step * * Iterates nth times. * * Returns: (transfer full): the nth pad * * Since: 3.0.0 */ AgsChannel* ags_channel_pad_nth(AgsChannel *channel, guint nth) { AgsChannel *next_pad; guint i; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_ref(channel); for(i = 0; i < nth && channel != NULL; i++){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* prepare */ g_rec_mutex_lock(channel_mutex); next_pad = channel->next_pad; if(next_pad != NULL){ g_object_ref(next_pad); } g_rec_mutex_unlock(channel_mutex); /* iterate */ g_object_unref(channel); channel = next_pad; } #ifdef AGS_DEBUG if(channel == NULL){ g_message("ags_channel_nth_pad:\n nth pad does not exist\n `- stopped @: i = %u; nth = %u", i, nth); } #endif return(channel); } /** * ags_channel_first_with_recycling: * @channel: an #AgsChannel * * Find first recycling related to @channel. * * Returns: (transfer full): the first channel with an #AgsRecycling * * Since: 3.0.0 */ AgsChannel* ags_channel_first_with_recycling(AgsChannel *channel) { AgsChannel *next_pad; gboolean has_recycling; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } channel = ags_channel_pad_first(channel); /* first with recycling */ while(channel != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check has recycling */ has_recycling = FALSE; g_rec_mutex_lock(channel_mutex); next_pad = channel->next_pad; if(channel->first_recycling != NULL){ has_recycling = TRUE; }else{ if(next_pad != NULL){ g_object_ref(next_pad); } } g_rec_mutex_unlock(channel_mutex); if(has_recycling){ break; } /* iterate */ g_object_unref(channel); channel = next_pad; } return(channel); } /** * ags_channel_last_with_recycling: * @channel: an #AgsChannel * * Find last recycling related to @channel. * * Returns: (transfer full): the last channel with an #AgsRecycling * * Since: 3.0.0 */ AgsChannel* ags_channel_last_with_recycling(AgsChannel *channel) { AgsChannel *prev_pad; gboolean has_recycling; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } channel = ags_channel_pad_last(channel); while(channel != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check has recycling */ has_recycling = FALSE; g_rec_mutex_lock(channel_mutex); prev_pad = channel->prev_pad; if(channel->first_recycling != NULL){ has_recycling = TRUE; }else{ if(prev_pad != NULL){ g_object_ref(prev_pad); } } g_rec_mutex_unlock(channel_mutex); if(has_recycling){ break; } /* iterate */ g_object_unref(channel); channel = prev_pad; } return(channel); } /** * ags_channel_prev_with_recycling: * @channel: an #AgsChannel * * Find previous #AgsRecycling of @channel. * * Returns: (transfer full): the prev channel with an #AgsRecycling * * Since: 3.0.0 */ AgsChannel* ags_channel_prev_with_recycling(AgsChannel *channel) { AgsChannel *current, *prev_pad; AgsRecycling *recycling; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* prev with recycling */ g_rec_mutex_lock(channel_mutex); prev_pad = channel->prev_pad; if(prev_pad != NULL){ g_object_ref(prev_pad); } g_rec_mutex_unlock(channel_mutex); current = prev_pad; while(current != NULL && current != channel){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check has recycling */ g_rec_mutex_lock(channel_mutex); recycling = current->last_recycling; prev_pad = current->prev_pad; if(prev_pad != NULL){ g_object_ref(prev_pad); } g_rec_mutex_unlock(channel_mutex); if(recycling != NULL){ break; } /* iterate */ g_object_unref(current); current = prev_pad; } return(current); } /** * ags_channel_next_with_recycling: * @channel: an #AgsChannel * * Find next #AgsRecycling of @channel. * * Returns: (transfer full): the next channel with an #AgsRecycling * * Since: 3.0.0 */ AgsChannel* ags_channel_next_with_recycling(AgsChannel *channel) { AgsChannel *current, *next_pad; AgsRecycling *recycling; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* next with recycling */ g_rec_mutex_lock(channel_mutex); next_pad = channel->next_pad; if(next_pad != NULL){ g_object_ref(next_pad); } g_rec_mutex_unlock(channel_mutex); current = next_pad; while(current != NULL){ /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* check has recycling */ g_rec_mutex_lock(channel_mutex); recycling = current->first_recycling; next_pad = current->next_pad; if(next_pad != NULL){ g_object_ref(next_pad); } g_rec_mutex_unlock(channel_mutex); if(recycling != NULL){ break; } /* iterate */ g_object_unref(current); current = next_pad; } return(current); } /** * ags_channel_get_link: * @channel: the #AgsChannel * * Ascend/descend @channel. * * Returns: (transfer full): the link of #AgsChannel if available, otherwise %NULL * * Since: 3.0.0 */ AgsChannel* ags_channel_get_link(AgsChannel *channel) { AgsChannel *link; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get next pad */ g_rec_mutex_lock(channel_mutex); link = channel->link; if(link != NULL){ g_object_ref(link); } g_rec_mutex_unlock(channel_mutex); return(link); } /** * ags_channel_set_link: * @channel: an #AgsChannel to link * @link: an other #AgsChannel to link with * @error: you may retrieve a AGS_CHANNEL_ERROR_LOOP_IN_LINK error * * Change the linking of #AgsChannel objects. Sets link, calls ags_channel_reset_recycling(). * Further it does loop detection and makes your machine running. * * Since: 3.0.0 */ void ags_channel_set_link(AgsChannel *channel, AgsChannel *link, GError **error) { AgsChannel *old_channel_link, *old_link_link; AgsChannel *old_channel_level, *old_link_level; GError *this_error; GRecMutex *channel_mutex; GRecMutex *link_mutex; #ifdef AGS_DEBUG g_message("set link %x %x", channel, link); #endif if(channel == NULL && link == NULL){ return; } if(channel != NULL && !AGS_IS_CHANNEL(channel)){ g_warning("ags_channel_set_link() - unsupported type"); return; } if(link != NULL && !AGS_IS_CHANNEL(link)){ g_warning("ags_channel_set_link() - unsupported type"); return; } /* get channel and link mutex */ channel_mutex = NULL; link_mutex = NULL; if(channel != NULL){ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); } if(link != NULL){ link_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(link); } //FIXME:JK: use g_object_get() to retrieve fields /* get some fields */ old_channel_link = NULL; old_link_link = NULL; if(channel != NULL){ g_rec_mutex_lock(channel_mutex); old_channel_link = channel->link; g_rec_mutex_unlock(channel_mutex); /* check no change */ if(old_channel_link == link){ return; } }else{ g_rec_mutex_lock(link_mutex); old_link_link = link->link; g_rec_mutex_unlock(link_mutex); /* check no change */ if(old_link_link == NULL){ return; } } /* get some fields */ if(link != NULL){ g_rec_mutex_lock(link_mutex); old_link_link = link->link; g_rec_mutex_unlock(link_mutex); } /* check for a loop */ if(channel != NULL && link != NULL){ AgsAudio *audio, *current_audio; AgsChannel *start_output, *start_input; AgsChannel *current_channel, *current_link; GObject *soundcard; guint current_audio_channel, current_line; if(AGS_IS_OUTPUT(channel)){ /* get audio */ g_object_get(link, "audio", &audio, "line", ¤t_line, "audio-channel", ¤t_audio_channel, NULL); /* set current */ current_channel = link; g_object_ref(current_channel); }else{ /* get audio */ g_object_get(channel, "audio", &audio, "line", ¤t_line, "audio-channel", ¤t_audio_channel, NULL); /* set current */ current_channel = channel; g_object_ref(current_channel); } /* get some fields */ g_object_get(audio, "output", &start_output, "input", &start_input, NULL); /* */ if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ current_channel = ags_channel_nth(start_output, current_audio_channel); }else{ current_channel = ags_channel_nth(start_output, current_line); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(start_input != NULL){ g_object_unref(start_input); } current_link = NULL; if(current_channel != NULL){ /* ascend tree */ current_link = ags_channel_get_link(current_channel); g_object_unref(current_channel); current_channel = current_link; } if(current_channel != NULL){ /* get some fields */ g_object_get(current_channel, "audio", ¤t_audio, NULL); while(current_channel != NULL){ /* check audio */ if(current_audio == audio){ if(error != NULL){ g_set_error(error, AGS_CHANNEL_ERROR, AGS_CHANNEL_ERROR_LOOP_IN_LINK, "failed to link channel"); } return; } /* get some fields */ g_object_get(current_audio, "output", &start_output, NULL); /* get some fields */ g_object_get(current_channel, "line", ¤t_line, "audio-channel", ¤t_audio_channel, NULL); if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ current_channel = ags_channel_nth(start_output, current_audio_channel); }else{ current_channel = ags_channel_nth(start_output, current_line); } /* unref */ if(start_output != NULL){ g_object_unref(start_output); } if(current_channel != NULL){ /* ascend tree */ current_link = ags_channel_get_link(current_channel); g_object_unref(current_channel); current_channel = current_link; } g_object_unref(current_audio); if(current_channel != NULL){ /* get audio */ g_object_get(current_channel, "audio", ¤t_audio, NULL); } } } if(current_link != NULL){ g_object_unref(current_link); } } /* set channel link */ if(channel != NULL){ g_rec_mutex_lock(channel_mutex); channel->link = link; g_rec_mutex_unlock(channel_mutex); } /* set link link */ if(link != NULL){ g_rec_mutex_lock(link_mutex); link->link = channel; g_rec_mutex_unlock(link_mutex); } /* ref count */ if(channel != NULL && link != NULL){ g_object_ref(channel); g_object_ref(link); } if(channel != NULL && old_channel_link != NULL){ g_object_unref(channel); g_object_unref(old_channel_link); } if(link != NULL && old_link_link != NULL){ g_object_unref(link); g_object_unref(old_link_link); } /* notify link */ if(channel != NULL && link != NULL){ ags_channel_set_link(link, channel, &this_error); } if(channel != NULL && old_channel_link != NULL){ GRecMutex *old_channel_link_mutex; /* get old channel link mutex */ old_channel_link_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(old_channel_link); /* reset link */ g_rec_mutex_lock(old_channel_link_mutex); old_channel_link->link = NULL; g_rec_mutex_unlock(old_channel_link_mutex); /* emit */ this_error = NULL; ags_channel_set_link(old_channel_link, NULL, &this_error); } if(link != NULL && old_link_link != NULL){ GRecMutex *old_link_link_mutex; /* get old link link mutex */ old_link_link_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(old_link_link); /* reset link */ g_rec_mutex_lock(old_link_link_mutex); old_link_link->link = NULL; g_rec_mutex_unlock(old_link_link_mutex); /* emit */ this_error = NULL; ags_channel_set_link(old_link_link, NULL, &this_error); } /* reset recycling */ if(AGS_IS_OUTPUT(channel)){ if(link != NULL){ AgsRecycling *first_recycling, *last_recycling; /* get some fields */ g_rec_mutex_lock(channel_mutex); first_recycling = channel->first_recycling; last_recycling = channel->last_recycling; g_rec_mutex_unlock(channel_mutex); /* reset */ ags_channel_reset_recycling(link, first_recycling, last_recycling); } }else if(AGS_IS_OUTPUT(link)){ if(channel != NULL){ AgsRecycling *first_recycling, *last_recycling; /* get some fields */ g_rec_mutex_lock(link_mutex); first_recycling = link->first_recycling; last_recycling = link->last_recycling; g_rec_mutex_unlock(link_mutex); /* reset */ ags_channel_reset_recycling(channel, first_recycling, last_recycling); } } if(AGS_IS_INPUT(channel)){ if(link == NULL){ AgsAudio *audio; guint audio_flags; GRecMutex *audio_mutex; /* get some fields */ g_rec_mutex_lock(channel_mutex); audio = (AgsAudio *) channel->audio; g_rec_mutex_unlock(channel_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* instantiate new recycling */ if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ AgsRecycling *recycling; GObject *output_soundcard; GObject *input_soundcard; gint output_soundcard_channel; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; /* get some fields */ g_rec_mutex_lock(channel_mutex); output_soundcard = channel->output_soundcard; output_soundcard_channel = channel->output_soundcard_channel; input_soundcard = channel->input_soundcard; input_soundcard_channel = channel->input_soundcard_channel; samplerate = channel->samplerate; buffer_size = channel->buffer_size; format = channel->format; g_rec_mutex_unlock(channel_mutex); /* reset */ recycling = g_object_new(AGS_TYPE_RECYCLING, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); ags_channel_reset_recycling(channel, recycling, recycling); } } }else if(AGS_IS_INPUT(link)){ if(channel == NULL){ AgsAudio *audio; guint audio_flags; GRecMutex *audio_mutex; /* get some fields */ g_rec_mutex_lock(link_mutex); audio = (AgsAudio *) link->audio; g_rec_mutex_unlock(link_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* instantiate new recycling */ if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ AgsRecycling *recycling; GObject *output_soundcard; GObject *input_soundcard; gint output_soundcard_channel; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; /* get some fields */ g_rec_mutex_lock(link_mutex); output_soundcard = link->output_soundcard; output_soundcard_channel = link->output_soundcard_channel; input_soundcard = link->input_soundcard; input_soundcard_channel = link->input_soundcard_channel; samplerate = link->samplerate; buffer_size = link->buffer_size; format = link->format; g_rec_mutex_unlock(link_mutex); /* reset */ recycling = g_object_new(AGS_TYPE_RECYCLING, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); ags_channel_reset_recycling(link, recycling, recycling); } } } if(AGS_IS_INPUT(old_channel_link)){ AgsAudio *audio; guint audio_flags; GRecMutex *audio_mutex; GRecMutex *old_channel_link_mutex; /* get old channel link mutex */ old_channel_link_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(old_channel_link); /* get some fields */ g_rec_mutex_lock(old_channel_link_mutex); audio = (AgsAudio *) old_channel_link->audio; g_rec_mutex_unlock(old_channel_link_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* instantiate new recycling */ if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ AgsRecycling *recycling; GObject *output_soundcard; GObject *input_soundcard; gint output_soundcard_channel; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; /* get some fields */ g_rec_mutex_lock(old_channel_link_mutex); output_soundcard = old_channel_link->output_soundcard; output_soundcard_channel = old_channel_link->output_soundcard_channel; input_soundcard = old_channel_link->input_soundcard; input_soundcard_channel = old_channel_link->input_soundcard_channel; samplerate = old_channel_link->samplerate; buffer_size = old_channel_link->buffer_size; format = old_channel_link->format; g_rec_mutex_unlock(old_channel_link_mutex); /* reset */ recycling = g_object_new(AGS_TYPE_RECYCLING, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); ags_channel_reset_recycling(old_channel_link, recycling, recycling); }else{ ags_channel_reset_recycling(old_channel_link, NULL, NULL); } } if(AGS_IS_INPUT(old_link_link)){ AgsAudio *audio; guint audio_flags; GRecMutex *audio_mutex; GRecMutex *old_link_link_mutex; /* get old link link mutex */ old_link_link_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(old_link_link); /* get some fields */ g_rec_mutex_lock(old_link_link_mutex); audio = (AgsAudio *) old_link_link->audio; g_rec_mutex_unlock(old_link_link_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get some fields */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* instantiate new recycling */ if((AGS_AUDIO_INPUT_HAS_RECYCLING & (audio_flags)) != 0){ AgsRecycling *recycling; GObject *output_soundcard; GObject *input_soundcard; gint output_soundcard_channel; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; /* get some fields */ g_rec_mutex_lock(old_link_link_mutex); output_soundcard = old_link_link->output_soundcard; output_soundcard_channel = old_link_link->output_soundcard_channel; input_soundcard = old_link_link->input_soundcard; input_soundcard_channel = old_link_link->input_soundcard_channel; samplerate = old_link_link->samplerate; buffer_size = old_link_link->buffer_size; format = old_link_link->format; g_rec_mutex_unlock(old_link_link_mutex); /* reset */ recycling = g_object_new(AGS_TYPE_RECYCLING, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); ags_channel_reset_recycling(old_link_link, recycling, recycling); }else{ ags_channel_reset_recycling(old_channel_link, NULL, NULL); } } /* reset soundcard */ if((AGS_IS_OUTPUT(channel) && AGS_IS_INPUT(link)) || (AGS_IS_INPUT(channel) && AGS_IS_OUTPUT(link))){ AgsChannel *current, *current_link; GObject *output_soundcard; GObject *input_soundcard; gchar **parameter_name; gint output_soundcard_channel; gint input_soundcard_channel; guint n_params; GValue *value; GRecMutex *mutex; if(AGS_IS_INPUT(channel)){ current = channel; current_link = link; mutex = channel_mutex; }else{ current = link; current_link = channel; mutex = link_mutex; } /* get some fields */ g_rec_mutex_lock(mutex); output_soundcard = current->output_soundcard; output_soundcard_channel = current->output_soundcard_channel; input_soundcard = current->input_soundcard; input_soundcard_channel = current->input_soundcard_channel; g_rec_mutex_unlock(mutex); /* allocate parameter name and value */ n_params = 4; parameter_name = (gchar **) malloc((n_params + 1) * sizeof(gchar *)); value = g_new0(GValue, n_params); /* output soundcard */ parameter_name[0] = "output-soundcard"; g_value_init(&(value[0]), G_TYPE_OBJECT); g_value_set_object(&(value[0]), output_soundcard); /* output soundcard channel */ parameter_name[1] = "output-soundcard-channel"; g_value_init(&(value[1]), G_TYPE_INT); g_value_set_int(&(value[1]), output_soundcard_channel); /* input soundcard */ parameter_name[2] = "input-soundcard"; g_value_init(&(value[2]), G_TYPE_OBJECT); g_value_set_object(&(value[2]), input_soundcard); /* input soundcard channel */ parameter_name[3] = "input-soundcard-channel"; g_value_init(&(value[3]), G_TYPE_INT); g_value_set_int(&(value[3]), input_soundcard_channel); /* terminate string vector */ parameter_name[4] = NULL; /* recursive set property */ ags_channel_recursive_set_property(current_link, n_params, parameter_name, value); } /* unset recall id - old channel */ if(AGS_IS_INPUT(old_channel_link)){ old_channel_level = ags_channel_get_level(old_channel_link); if(old_channel_level == NULL){ gint i; for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ GList *recall_id; recall_id = ags_channel_check_scope(old_channel_link, i); if(recall_id != NULL){ ags_channel_recursive_run_stage(old_channel_link, i, (AGS_SOUND_STAGING_CANCEL | AGS_SOUND_STAGING_DONE | AGS_SOUND_STAGING_REMOVE)); g_list_free_full(recall_id, g_object_unref); } } }else{ g_object_unref(old_channel_level); } } /* unset recall id - old link */ if(AGS_IS_INPUT(old_link_link)){ old_link_level = ags_channel_get_level(old_link_link); if(old_link_level == NULL){ gint i; for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ GList *recall_id; recall_id = ags_channel_check_scope(old_link_link, i); if(recall_id != NULL){ ags_channel_recursive_run_stage(old_link_link, i, (AGS_SOUND_STAGING_CANCEL | AGS_SOUND_STAGING_DONE | AGS_SOUND_STAGING_REMOVE)); g_list_free_full(recall_id, g_object_unref); } } }else{ g_object_unref(old_link_level); } } /* reset recall id */ if(channel != NULL){ gint i; for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ GList *recall_id; recall_id = ags_channel_check_scope(channel, i); if(recall_id != NULL){ ags_channel_recursive_run_stage(link, i, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); g_list_free_full(recall_id, g_object_unref); } } } if(link != NULL){ gint i; for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ GList *recall_id; recall_id = ags_channel_check_scope(link, i); if(recall_id != NULL){ ags_channel_recursive_run_stage(channel, i, (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST)); g_list_free_full(recall_id, g_object_unref); } } } } gboolean ags_channel_reset_recycling_recursive_input(AgsChannel *input, AgsAudio **found_next, AgsAudio **found_prev, AgsChannel **next_channel, AgsChannel **prev_channel, AgsRecycling **replace_with_first_recycling, AgsRecycling **replace_with_last_recycling, guint *complete_level_first, guint *complete_level_last, gboolean *find_next, gboolean *find_prev, gboolean *replace_first, gboolean *replace_last) { AgsAudio *audio; AgsChannel *nth_channel_prev, *nth_channel_next; guint audio_flags; GRecMutex *audio_mutex; GRecMutex *input_mutex; GRecMutex *next_channel_mutex; GRecMutex *prev_channel_mutex; if(input == NULL){ return(TRUE); } /* get input mutex */ input_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(input); /* check done */ g_rec_mutex_lock(input_mutex); if((input->first_recycling == replace_with_first_recycling[0] && input->last_recycling == replace_with_last_recycling[0])){ g_rec_mutex_unlock(input_mutex); return(TRUE); } /* set recycling */ if(replace_first[0]){ input->first_recycling = replace_with_first_recycling[0]; } if(replace_last[0]){ input->last_recycling = replace_with_last_recycling[0]; } /* search for neighboor recyclings */ audio = (AgsAudio *) input->audio; g_rec_mutex_unlock(input_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* audio flags */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); if((AGS_AUDIO_ASYNC & (audio_flags)) != 0){ if(find_prev[0]){ nth_channel_prev = ags_channel_prev_with_recycling(input); if(nth_channel_prev != NULL){ #ifdef AGS_DEBUG g_message("found prev"); #endif find_prev[0] = FALSE; replace_first[0] = FALSE; if(complete_level_first[0] == 0){ found_prev[0] = audio; prev_channel[0] = nth_channel_prev; complete_level_first[0] = 1; } g_object_unref(nth_channel_prev); } }else{ nth_channel_prev = ags_channel_prev_with_recycling(input); if(nth_channel_prev != NULL){ g_object_unref(nth_channel_prev); } } if(find_next[0]){ nth_channel_next = ags_channel_next_with_recycling(input); if(nth_channel_next != NULL){ #ifdef AGS_DEBUG g_message("found next"); #endif find_next[0] = FALSE; replace_last[0] = FALSE; if(complete_level_last[0] == 0){ found_next[0] = audio; next_channel[0] = nth_channel_next; complete_level_last[0] = 1; } g_object_unref(nth_channel_next); } }else{ nth_channel_next = ags_channel_next_with_recycling(input); if(nth_channel_next != NULL){ g_object_unref(nth_channel_next); } } if(prev_channel[0] != NULL){ if(next_channel[0] == NULL){ if(replace_with_last_recycling[0] == NULL){ /* get prev channel mutex */ prev_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(prev_channel[0]); /* prev channel */ g_rec_mutex_lock(prev_channel_mutex); replace_with_last_recycling[0] = prev_channel[0]->last_recycling; g_rec_mutex_unlock(prev_channel_mutex); /* continues flag */ find_next[0] = FALSE; } }else{ /* get prev and next channel mutex */ prev_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(prev_channel[0]); next_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(next_channel[0]); /* prev channel */ g_rec_mutex_lock(prev_channel_mutex); replace_with_last_recycling[0] = prev_channel[0]->last_recycling; g_rec_mutex_unlock(prev_channel_mutex); /* next channel */ g_rec_mutex_lock(next_channel_mutex); replace_with_first_recycling[0] = next_channel[0]->first_recycling; g_rec_mutex_unlock(next_channel_mutex); } }else{ if(next_channel[0] != NULL){ if(replace_with_first_recycling[0] == NULL){ /* get prev and next channel mutex */ next_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(next_channel[0]); /* next channel */ g_rec_mutex_lock(next_channel_mutex); replace_with_first_recycling[0] = next_channel[0]->first_recycling; g_rec_mutex_unlock(next_channel_mutex); /* continues flag */ find_prev[0] = FALSE; } } } } if(replace_first[0] || replace_last[0]){ return(FALSE); }else{ return(TRUE); } } void ags_channel_reset_recycling_recursive_output(AgsChannel *output, AgsAudio **found_next, AgsAudio **found_prev, AgsChannel **next_channel, AgsChannel **prev_channel, AgsRecycling **replace_with_first_recycling, AgsRecycling **replace_with_last_recycling, guint *complete_level_first, guint *complete_level_last, gboolean *find_next, gboolean *find_prev, gboolean *replace_first, gboolean *replace_last) { AgsAudio *audio; AgsChannel *input; AgsChannel *link; AgsChannel *nth_channel_prev, *nth_channel_next; AgsRecycling *first_recycling, *last_recycling; guint audio_flags; guint audio_channel; GRecMutex *audio_mutex; GRecMutex *output_mutex; if(output == NULL){ return; } /* get output mutex */ output_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(output); /* get audio and audio channel */ g_rec_mutex_lock(output_mutex); audio = (AgsAudio *) output->audio; audio_channel = output->audio_channel; g_rec_mutex_unlock(output_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get input and flags */ g_rec_mutex_lock(audio_mutex); input = audio->input; audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* replace */ if(replace_last[0]){ /* do it so */ g_rec_mutex_lock(output_mutex); output->last_recycling = replace_with_last_recycling[0]; g_rec_mutex_unlock(output_mutex); } /* last recycling */ if(replace_first[0]){ /* do it so */ g_rec_mutex_lock(output_mutex); output->first_recycling = replace_with_first_recycling[0]; g_rec_mutex_unlock(output_mutex); } /* deeper level */ g_rec_mutex_lock(output_mutex); link = output->link; g_rec_mutex_unlock(output_mutex); if(link != NULL){ ags_channel_reset_recycling_recursive(link, found_next, found_prev, next_channel, prev_channel, replace_with_first_recycling, replace_with_last_recycling, complete_level_first, complete_level_last, find_next, find_prev, replace_first, replace_last); } } void ags_channel_reset_recycling_recursive(AgsChannel *input, AgsAudio **found_next, AgsAudio **found_prev, AgsChannel **next_channel, AgsChannel **prev_channel, AgsRecycling **replace_with_first_recycling, AgsRecycling **replace_with_last_recycling, guint *complete_level_first, guint *complete_level_last, gboolean *find_next, gboolean *find_prev, gboolean *replace_first, gboolean *replace_last) { AgsAudio *audio; AgsChannel *output; AgsChannel *nth_output; guint audio_channel, line; gboolean completed; if(input == NULL){ return; } /* get audio and audio channel */ g_object_get(input, "audio", &audio, "audio-channel", &audio_channel, "line", &line, NULL); /* get output */ g_object_get(audio, "output", &output, NULL); /* AgsInput */ completed = ags_channel_reset_recycling_recursive_input(input, found_next, found_prev, next_channel, prev_channel, replace_with_first_recycling, replace_with_last_recycling, complete_level_first, complete_level_last, find_next, find_prev, replace_first, replace_last); if(completed){ if(audio != NULL){ g_object_unref(audio); } if(output != NULL){ g_object_unref(output); } return; } /* AgsOutput */ if(!ags_audio_test_flags(audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ nth_output = ags_channel_nth(output, audio_channel); if(output != NULL){ g_object_unref(output); } output = nth_output; }else{ nth_output = ags_channel_nth(output, line); if(output != NULL){ g_object_unref(output); } output = nth_output; } ags_channel_reset_recycling_recursive_output(output, found_next, found_prev, next_channel, prev_channel, replace_with_first_recycling, replace_with_last_recycling, complete_level_first, complete_level_last, find_next, find_prev, replace_first, replace_last); if(audio != NULL){ g_object_unref(audio); } if(output != NULL){ g_object_unref(output); } } } void ags_channel_reset_recycling_reset_recycling_context_up(AgsChannel *current) { //NOTE:JK: actually handled by ags_channel_set_link() #if 0 gint i; if(!AGS_IS_CHANNEL(current)){ return; } for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ GList *recall_id; recall_id = ags_channel_check_scope(current, i); if(recall_id != NULL){ ags_channel_recursive_run_stage(current, i, (AGS_SOUND_STAGING_CANCEL)); g_list_free_full(recall_id, g_object_unref); } } #endif } void ags_channel_reset_recycling_reset_recycling_context_down(AgsChannel *current_output, AgsRecyclingContext *new_recycling_context, AgsRecyclingContext *old_recycling_context) { AgsAudio *current_audio; GList *recall_id_start, *recall_id; guint current_audio_flags; GRecMutex *current_audio_mutex; GRecMutex *current_output_mutex; if(!AGS_IS_CHANNEL(current_output)){ return; } /* get current output mutex */ current_output_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current_output); /* get current audio */ g_rec_mutex_lock(current_output_mutex); current_audio = (AgsAudio *) current_output->audio; g_rec_mutex_unlock(current_output_mutex); /* get current audio mutex */ current_audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(current_audio); /* get recall id - output */ g_rec_mutex_lock(current_output_mutex); recall_id = recall_id_start = g_list_copy(current_output->recall_id); g_rec_mutex_unlock(current_output_mutex); /* reset - output */ while(recall_id != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; GRecMutex *recall_id_mutex; current_recall_id = recall_id->data; /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(recall_id_mutex); if(current_recycling_context == old_recycling_context){ g_object_set(current_recall_id, "recycling-context", new_recycling_context, NULL); } recall_id = recall_id->next; } g_list_free(recall_id_start); /* get recall id - audio */ g_rec_mutex_lock(current_audio_mutex); current_audio_flags = current_audio->flags; recall_id = g_list_copy(current_audio->recall_id); g_rec_mutex_unlock(current_audio_mutex); /* reset - audio */ while(recall_id != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; GRecMutex *recall_id_mutex; current_recall_id = recall_id->data; /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(recall_id_mutex); if(current_recycling_context == old_recycling_context){ g_object_set(current_recall_id, "recycling-context", new_recycling_context, NULL); } recall_id = recall_id->next; } g_list_free(recall_id_start); /* check completed */ if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (current_audio_flags)) != 0){ return; } /* traverse the tree */ ags_channel_reset_recycling_reset_recycling_context_down_input(current_output, new_recycling_context, old_recycling_context); } void ags_channel_reset_recycling_reset_recycling_context_down_input(AgsChannel *current_output, AgsRecyclingContext *new_recycling_context, AgsRecyclingContext *old_recycling_context) { AgsAudio *current_audio; AgsChannel *current_input, *next_pad, *nth_input; AgsChannel *current_link; GList *start_recall_id, *recall_id; guint audio_flags; guint audio_channel, line; if(!AGS_IS_CHANNEL(current_output)){ return; } /* get current audio */ g_object_get(current_output, "audio", ¤t_audio, "audio-channel", &audio_channel, "line", &line, NULL); /* get some fields */ g_object_get(current_audio, "input", ¤t_input, NULL); /* reset and traverse */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(current_input, audio_channel); g_object_unref(current_input); current_input = nth_input; while(current_input != NULL){ /* get recall id - input */ g_object_get(current_input, "recall-id", &start_recall_id, NULL); current_link = ags_channel_get_link(current_input); /* reset - input */ recall_id = start_recall_id; while(recall_id != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; current_recall_id = recall_id->data; g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); if(current_recycling_context == old_recycling_context){ g_object_set(current_recall_id, "recycling-context", new_recycling_context, NULL); } if(current_recycling_context != NULL){ g_object_unref(current_recycling_context); } recall_id = recall_id->next; } g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_reset_recycling_reset_recycling_context_down_input(current_link, new_recycling_context, old_recycling_context); /* unref */ if(current_link != NULL){ g_object_unref(current_link); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } }else{ nth_input = ags_channel_nth(current_input, line); g_object_unref(current_input); current_input = nth_input; /* get recall id - input */ g_object_get(current_input, "recall-id", &start_recall_id, NULL); current_link = ags_channel_get_link(current_input); /* reset - input */ recall_id = start_recall_id; while(recall_id != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; current_recall_id = recall_id->data; g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); if(current_recycling_context == old_recycling_context){ g_object_set(current_recall_id, "recycling-context", new_recycling_context, NULL); } if(current_recycling_context != NULL){ g_object_unref(current_recycling_context); } recall_id = recall_id->next; } g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_reset_recycling_reset_recycling_context_down_input(current_link, new_recycling_context, old_recycling_context); /* unref */ if(current_link != NULL){ g_object_unref(current_link); } } if(current_audio != NULL){ g_object_unref(current_audio); } } void ags_channel_reset_recycling_emit_changed_input(AgsChannel *start_channel, AgsChannel *input, AgsRecycling *changed_old_first_recycling, AgsRecycling *changed_old_last_recycling, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *first_recycling, AgsRecycling *last_recycling) { AgsRecycling *input_first_recycling, *input_last_recycling; GRecMutex *input_mutex; if(input == NULL){ return; } /* get input mutex */ input_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(input); /* get current recycling */ g_rec_mutex_lock(input_mutex); input_first_recycling = input->first_recycling; input_last_recycling = input->last_recycling; g_rec_mutex_unlock(input_mutex); /* emit changed */ if(input != start_channel){ ags_channel_recycling_changed(input, changed_old_first_recycling, changed_old_last_recycling, input_first_recycling, input_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); } } void ags_channel_reset_recycling_emit_changed_output(AgsChannel *start_channel, AgsChannel *output, AgsRecycling *changed_old_first_recycling, AgsRecycling *changed_old_last_recycling, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *first_recycling, AgsRecycling *last_recycling) { AgsChannel *link; AgsRecycling *output_first_recycling, *output_last_recycling; GRecMutex *output_mutex; if(output == NULL){ return; } /* get output mutex */ output_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(output); /* get current recycling */ g_rec_mutex_lock(output_mutex); link = output->link; output_first_recycling = output->first_recycling; output_last_recycling = output->last_recycling; g_rec_mutex_unlock(output_mutex); /* emit changed */ if(output != start_channel){ ags_channel_recycling_changed(output, changed_old_first_recycling, changed_old_last_recycling, output_first_recycling, output_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); } if(link != NULL){ ags_channel_reset_recycling_emit_changed(start_channel, link, changed_old_first_recycling, changed_old_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); } } void ags_channel_reset_recycling_emit_changed(AgsChannel *start_channel, AgsChannel *input, AgsRecycling *changed_old_first_recycling, AgsRecycling *changed_old_last_recycling, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *first_recycling, AgsRecycling *last_recycling) { AgsAudio *audio; AgsChannel *output, *nth_output; guint audio_channel, line; if(input == NULL){ return; } /* get audio and audio channel */ g_object_get(input, "audio", &audio, "audio-channel", &audio_channel, "line", &line, NULL); /* get output */ g_object_get(audio, "output", &output, NULL); /* AgsInput */ ags_channel_reset_recycling_emit_changed_input(start_channel, input, changed_old_first_recycling, changed_old_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); /* higher level */ if(!ags_audio_test_flags(audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ nth_output = ags_channel_nth(output, audio_channel); if(output != NULL){ g_object_unref(output); } output = nth_output; }else{ nth_output = ags_channel_nth(output, line); if(output != NULL){ g_object_unref(output); } output = nth_output; } ags_channel_reset_recycling_emit_changed_output(start_channel, output, changed_old_first_recycling, changed_old_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); } if(output != NULL){ g_object_unref(output); } return; } /** * ags_channel_reset_recycling: * @channel: the channel to reset * @first_recycling: the recycling to set for channel->first_recycling * @last_recycling: the recycling to set for channel->last_recycling * * Called by ags_channel_set_link() to handle outdated #AgsRecycling references. * Invoke only by a task. * * Since: 3.0.0 */ void ags_channel_reset_recycling(AgsChannel *channel, AgsRecycling *first_recycling, AgsRecycling *last_recycling) { AgsAudio *audio; AgsAudio *found_prev, *found_next; AgsAudio *level_audio; AgsChannel *prev_channel, *next_channel, *current; AgsChannel *level_channel, *level_link; AgsRecycling *parent; AgsRecycling *old_first_recycling, *old_last_recycling; AgsRecycling *replace_with_first_recycling, *replace_with_last_recycling; AgsRecycling *changed_old_first_recycling, *changed_old_last_recycling; AgsRecycling *nth_recycling, *next_recycling, *stop_recycling; AgsRecycling *next_first_recycling, *prev_last_recycling; guint audio_flags; guint level_audio_flags; guint complete_level_first, complete_level_last; gboolean is_output; gboolean replace_first, replace_last; gboolean find_prev, find_next; gboolean change_old_last, change_old_first; GRecMutex *audio_mutex; GRecMutex *level_audio_mutex; GRecMutex *channel_mutex; GRecMutex *current_mutex; GRecMutex *nth_channel_mutex; GRecMutex *level_channel_mutex; GRecMutex *recycling_mutex; GRecMutex *nth_recycling_mutex; /* entry point */ if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* */ g_rec_mutex_lock(channel_mutex); audio = (AgsAudio *) channel->audio; g_rec_mutex_unlock(channel_mutex); /* fix first or last recycling if needed */ if(first_recycling == NULL && last_recycling != NULL){ first_recycling = last_recycling; } if(last_recycling == NULL && first_recycling != NULL){ last_recycling = first_recycling; } /* set old recycling */ old_first_recycling = channel->first_recycling; old_last_recycling = channel->last_recycling; /* initialising */ found_prev = NULL; found_next = NULL; parent = NULL; prev_channel = NULL; next_channel = NULL; replace_with_first_recycling = first_recycling; replace_with_last_recycling = last_recycling; changed_old_first_recycling = NULL; changed_old_last_recycling = NULL; complete_level_first = 0; complete_level_last = 0; replace_first = TRUE; replace_last = TRUE; find_next = TRUE; find_prev = TRUE; change_old_first = TRUE; change_old_last = TRUE; if((old_first_recycling == first_recycling)){ replace_first = FALSE; } if((old_last_recycling == last_recycling)){ replace_last = FALSE; } /* set recycling - update AgsChannel */ if(AGS_IS_INPUT(channel)){ ags_channel_reset_recycling_recursive(channel, &found_next, &found_prev, &next_channel, &prev_channel, &replace_with_first_recycling, &replace_with_last_recycling, &complete_level_first, &complete_level_last, &find_next, &find_prev, &replace_first, &replace_last); }else{ ags_channel_reset_recycling_recursive_output(channel, &found_next, &found_prev, &next_channel, &prev_channel, &replace_with_first_recycling, &replace_with_last_recycling, &complete_level_first, &complete_level_last, &find_next, &find_prev, &replace_first, &replace_last); } g_rec_mutex_lock(channel_mutex); channel->first_recycling = first_recycling; channel->last_recycling = last_recycling; g_rec_mutex_unlock(channel_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* audio flags */ g_rec_mutex_lock(audio_mutex); audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* join now the retrieved recyclings */ next_first_recycling = NULL; prev_last_recycling = NULL; if(!(AGS_IS_INPUT(channel) && (AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) != 0)){ if(first_recycling != NULL){ if(prev_channel != NULL){ /* get prev channel mutex */ nth_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(prev_channel); /* get prev channel last recycling */ g_rec_mutex_lock(nth_channel_mutex); prev_last_recycling = prev_channel->last_recycling; g_rec_mutex_unlock(nth_channel_mutex); if(prev_last_recycling != NULL){ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(prev_last_recycling); /* prev channel last recycling next */ g_object_set(prev_last_recycling, "next", first_recycling, NULL); /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(first_recycling); /* first recycling prev */ g_object_set(first_recycling, "prev", prev_last_recycling, NULL); }else{ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(first_recycling); /* first recycling prev */ g_object_set(first_recycling, "prev", NULL, NULL); } }else{ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(first_recycling); /* first recycling prev */ g_object_set(first_recycling, "prev", NULL, NULL); } if(next_channel != NULL){ /* get next channel mutex */ nth_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(next_channel); /* get prev channel last recycling */ g_rec_mutex_lock(nth_channel_mutex); next_first_recycling = next_channel->first_recycling; g_rec_mutex_unlock(nth_channel_mutex); if(next_first_recycling != NULL){ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(next_first_recycling); /* next channel first recycling next */ g_object_set(next_first_recycling, "prev", last_recycling, NULL); /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(last_recycling); /* last recycling next */ g_object_set(last_recycling, "next", next_first_recycling, NULL); }else{ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(last_recycling); /* last recycling next */ g_object_set(last_recycling, "next", NULL, NULL); } }else{ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(last_recycling); /* last recycling next */ g_object_set(last_recycling, "next", NULL, NULL); } }else{ gboolean link_next, link_prev; if(prev_channel != NULL){ /* get prev channel mutex */ nth_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(prev_channel); /* */ g_rec_mutex_lock(nth_channel_mutex); prev_last_recycling = prev_channel->last_recycling; g_rec_mutex_unlock(nth_channel_mutex); if(prev_last_recycling != NULL){ link_next = TRUE; }else{ link_next = FALSE; } }else{ link_next = FALSE; } if(next_channel != NULL){ /* get prev channel mutex */ nth_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(next_channel); /* */ g_rec_mutex_lock(nth_channel_mutex); next_first_recycling = next_channel->first_recycling; g_rec_mutex_unlock(nth_channel_mutex); if(next_first_recycling != NULL){ link_prev = TRUE; }else{ link_prev = FALSE; } }else{ link_prev = FALSE; } if(link_next){ if(link_prev){ AgsRecycling *first_recycling, *last_recycling; /* get first recycling mutex */ nth_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(next_channel); g_rec_mutex_lock(nth_channel_mutex); first_recycling = next_channel->first_recycling; g_rec_mutex_unlock(nth_channel_mutex); /* get last recycling mutex */ nth_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(prev_channel); g_rec_mutex_lock(nth_channel_mutex); last_recycling = prev_channel->last_recycling; g_rec_mutex_unlock(nth_channel_mutex); /* * */ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(next_first_recycling); /* next channel first recycling next */ g_object_set(next_first_recycling, "prev", last_recycling, NULL); /* * */ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(prev_last_recycling); /* prev channel last recycling next */ g_object_set(prev_last_recycling, "next", first_recycling, NULL); }else{ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(prev_last_recycling); /* prev channel last recycling next */ g_object_set(prev_last_recycling, "next", NULL, NULL); } }else if(link_prev){ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(next_first_recycling); /* next channel first recycling next */ g_object_set(next_first_recycling, "prev", NULL, NULL); } } } /* find and set parent */ if(first_recycling != NULL){ /* find parent */ parent = NULL; if(AGS_IS_OUTPUT(channel)){ g_rec_mutex_lock(channel_mutex); current = channel->link; g_rec_mutex_unlock(channel_mutex); }else{ current = channel; } while(current != NULL && parent == NULL){ AgsAudio *audio; AgsChannel *output; guint audio_channel, line; GRecMutex *audio_mutex; guint audio_flags; /* get current mutex */ current_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current); /* get audio */ g_rec_mutex_lock(current_mutex); audio = (AgsAudio *) current->audio; audio_channel = current->audio_channel; line = current->line; g_rec_mutex_unlock(current_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* get nth */ g_rec_mutex_lock(audio_mutex); output = audio->output; audio_flags = audio->flags; g_rec_mutex_unlock(audio_mutex); /* get current */ if((AGS_AUDIO_ASYNC & (audio_flags)) != 0){ current = ags_channel_nth(output, audio_channel); if(current != NULL){ g_object_unref(current); //FIXME:JK: bad ref count } }else{ current = ags_channel_nth(output, line); if(current != NULL){ g_object_unref(current); //FIXME:JK: bad ref count } } if(current != NULL){ /* get current mutex */ current_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(current); /* check if parent found */ g_rec_mutex_lock(current_mutex); if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) != 0){ /* set parent */ parent = current->first_recycling; } current = current->link; g_rec_mutex_unlock(current_mutex); }else{ break; } } /* apply parent */ nth_recycling = first_recycling; /* get recycling mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(last_recycling); /* */ g_rec_mutex_lock(recycling_mutex); stop_recycling = last_recycling->next; g_rec_mutex_unlock(recycling_mutex); /* parent - do it so */ while(nth_recycling != stop_recycling){ /* get nth recycling mutex */ nth_recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(nth_recycling); /* set parent and iterate */ g_object_set(nth_recycling, "parent", parent, NULL); g_rec_mutex_lock(nth_recycling_mutex); nth_recycling = nth_recycling->next; g_rec_mutex_unlock(nth_recycling_mutex); } } /* reset recycling context */ level_channel = ags_channel_get_level(channel); level_audio = NULL; if(level_channel != NULL){ /* get level channel mutex */ level_channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(level_channel); /* get level audio */ g_rec_mutex_lock(level_channel_mutex); level_audio = (AgsAudio *) level_channel->audio; level_link = level_channel->link; g_rec_mutex_unlock(level_channel_mutex); /* get level audio mutex */ level_audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(level_audio); /* get some fields */ g_rec_mutex_lock(level_audio_mutex); level_audio_flags = level_audio->flags; g_rec_mutex_unlock(level_audio_mutex); if(AGS_IS_INPUT(level_channel)){ gboolean reset_recycling_context; reset_recycling_context = FALSE; if((AGS_AUDIO_INPUT_HAS_RECYCLING & (level_audio_flags)) != 0){ reset_recycling_context = TRUE; } if(reset_recycling_context){ gint i; for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ GList *recall_id_start, *recall_id; recall_id = recall_id_start = ags_channel_check_scope(level_channel, i); while(recall_id != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *recycling_context, *new_recycling_context; GRecMutex *recall_id_mutex; current_recall_id = AGS_RECALL_ID(recall_id->data); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* get recycling context */ g_rec_mutex_lock(recall_id_mutex); recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(recall_id_mutex); /* reset recycling context */ new_recycling_context = ags_recycling_context_reset_recycling(recycling_context, old_first_recycling, old_last_recycling, first_recycling, last_recycling); /* add/remove recycling context */ ags_audio_remove_recycling_context(level_audio, (GObject *) recycling_context); ags_audio_add_recycling_context(level_audio, (GObject *) new_recycling_context); /* traverse the tree */ ags_channel_reset_recycling_reset_recycling_context_down(level_link, new_recycling_context, recycling_context); /* iterate */ recall_id = recall_id->next; } g_list_free_full(recall_id_start, g_object_unref); } } }else{ #ifdef AGS_DEBUG g_message("unexpected result as retrieving level: !AGS_IS_INPUT(level)"); #endif } g_object_unref(level_channel); }else{ if(first_recycling == NULL){ /* reset recycling context */ ags_channel_reset_recycling_reset_recycling_context_up(channel); }else{ #ifdef AGS_DEBUG g_message("unexpected result: level_channel == NULL && first_recycling != NULL"); #endif } } /* emit changed */ changed_old_first_recycling = NULL; changed_old_last_recycling = NULL; is_output = AGS_IS_OUTPUT(channel); if(!is_output){ if(old_first_recycling != NULL){ changed_old_first_recycling = old_first_recycling; changed_old_last_recycling = old_last_recycling; } ags_channel_reset_recycling_emit_changed_input(channel, channel, changed_old_first_recycling, changed_old_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); if((AGS_AUDIO_OUTPUT_HAS_RECYCLING & (audio_flags)) == 0){ AgsChannel *output; g_rec_mutex_lock(audio_mutex); output = audio->output; g_rec_mutex_unlock(audio_mutex); /* get matching output */ if((AGS_AUDIO_ASYNC & (audio_flags)) != 0){ guint audio_channel; g_rec_mutex_lock(channel_mutex); audio_channel = channel->audio_channel; g_rec_mutex_unlock(channel_mutex); output = ags_channel_nth(output, audio_channel); if(output != NULL){ g_object_unref(output); //FIXME:JK: bad ref count } }else{ guint line; g_rec_mutex_lock(channel_mutex); line = channel->line; g_rec_mutex_unlock(channel_mutex); output = ags_channel_nth(output, line); if(output != NULL){ g_object_unref(output); //FIXME:JK: bad ref count } } /* emit */ ags_channel_reset_recycling_emit_changed_output(channel, output, changed_old_first_recycling, changed_old_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); } }else{ ags_channel_reset_recycling_emit_changed_output(channel, channel, changed_old_first_recycling, changed_old_last_recycling, old_first_recycling, old_last_recycling, first_recycling, last_recycling); } } /** * ags_channel_recycling_changed: * @channel: the object recycling changed * @old_start_region: first recycling * @old_end_region: last recycling * @new_start_region: new first recycling * @new_end_region: new last recycling * @old_start_changed_region: modified link recycling start * @old_end_changed_region: modified link recyclig end * @new_start_changed_region: replacing link recycling start * @new_end_changed_region: replacing link recycling end * * Modify recycling. Asynchronously only. * * Since: 3.0.0 */ void ags_channel_recycling_changed(AgsChannel *channel, AgsRecycling *old_start_region, AgsRecycling *old_end_region, AgsRecycling *new_start_region, AgsRecycling *new_end_region, AgsRecycling *old_start_changed_region, AgsRecycling *old_end_changed_region, AgsRecycling *new_start_changed_region, AgsRecycling *new_end_changed_region) { g_return_if_fail(AGS_IS_CHANNEL(channel)); g_object_ref(G_OBJECT(channel)); g_signal_emit(G_OBJECT(channel), channel_signals[RECYCLING_CHANGED], 0, old_start_region, old_end_region, new_start_region, new_end_region, old_start_changed_region, old_end_changed_region, new_start_changed_region, new_end_changed_region); g_object_unref(G_OBJECT(channel)); } /** * ags_channel_get_output_soundcard: * @channel: the #AgsChannel * * Get the output soundcard object of @channel. * * Returns: (transfer full): the output soundcard * * Since: 3.1.0 */ GObject* ags_channel_get_output_soundcard(AgsChannel *channel) { GObject *output_soundcard; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "output-soundcard", &output_soundcard, NULL); return(output_soundcard); } /** * ags_channel_set_output_soundcard: * @channel: an #AgsChannel * @output_soundcard: an #GObject * * Set the output soundcard object of @channel. * * Since: 3.0.0 */ void ags_channel_set_output_soundcard(AgsChannel *channel, GObject *output_soundcard) { AgsRecycling *recycling; AgsPlayback *playback; AgsThread *channel_thread; GObject *old_soundcard; GList *list; guint samplerate; guint buffer_size; guint format; gint i; gboolean reset_recycling; GRecMutex *channel_mutex; GRecMutex *playback_mutex; GRecMutex *play_mutex, *recall_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* old soundcard */ g_rec_mutex_lock(channel_mutex); old_soundcard = channel->output_soundcard; g_rec_mutex_unlock(channel_mutex); if(old_soundcard == output_soundcard){ return; } /* ref and set new soundcard */ if(output_soundcard != NULL){ g_object_ref(output_soundcard); } g_rec_mutex_lock(channel_mutex); channel->output_soundcard = (GObject *) output_soundcard; g_rec_mutex_unlock(channel_mutex); if(output_soundcard != NULL){ /* get presets */ ags_soundcard_get_presets(AGS_SOUNDCARD(output_soundcard), NULL, &samplerate, &buffer_size, &format); /* apply presets */ g_object_set(channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); } /* AgsRecycling */ reset_recycling = FALSE; g_rec_mutex_lock(channel_mutex); if((AGS_IS_OUTPUT(channel) || channel->link == NULL) && channel->first_recycling != NULL){ reset_recycling = TRUE; } g_rec_mutex_unlock(channel_mutex); if(reset_recycling){ g_rec_mutex_lock(channel_mutex); recycling = channel->first_recycling; g_rec_mutex_unlock(channel_mutex); g_object_set(G_OBJECT(recycling), "output-soundcard", output_soundcard, NULL); } /* playback - channel thread */ g_rec_mutex_lock(channel_mutex); playback = AGS_PLAYBACK(channel->playback); g_rec_mutex_unlock(channel_mutex); /* get playback domain mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* channel thread - output soundcard */ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ g_rec_mutex_lock(playback_mutex); channel_thread = playback->channel_thread[i]; g_rec_mutex_unlock(playback_mutex); if(channel_thread != NULL){ /* set output soundcard */ g_object_set(channel_thread, "default-output-soundcard", output_soundcard, NULL); } } /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* play context */ g_rec_mutex_lock(play_mutex); list = channel->play; while(list != NULL){ g_object_set(G_OBJECT(list->data), "output-soundcard", output_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(play_mutex); /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* recall context */ g_rec_mutex_lock(recall_mutex); list = channel->recall; while(list != NULL){ g_object_set(G_OBJECT(list->data), "output-soundcard", output_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(recall_mutex); /* unref old soundcard */ if(old_soundcard != NULL){ g_object_unref(old_soundcard); } } /** * ags_channel_get_input_soundcard: * @channel: the #AgsChannel * * Get the input soundcard object of @channel. * * Returns: (transfer full): the input soundcard * * Since: 3.1.0 */ GObject* ags_channel_get_input_soundcard(AgsChannel *channel) { GObject *input_soundcard; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "input-soundcard", &input_soundcard, NULL); return(input_soundcard); } /** * ags_channel_set_input_soundcard: * @channel: the #AgsChannel * @input_soundcard: an #AgsSoundcard * * Set the input soundcard object on channel. * * Since: 3.0.0 */ void ags_channel_set_input_soundcard(AgsChannel *channel, GObject *input_soundcard) { AgsRecycling *recycling; GObject *old_soundcard; GList *list; gboolean reset_recycling; GRecMutex *channel_mutex; GRecMutex *play_mutex, *recall_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* old soundcard */ g_rec_mutex_lock(channel_mutex); old_soundcard = channel->input_soundcard; g_rec_mutex_unlock(channel_mutex); if(old_soundcard == input_soundcard){ return; } /* ref and set new soundcard */ if(input_soundcard != NULL){ g_object_ref(input_soundcard); } g_rec_mutex_lock(channel_mutex); channel->input_soundcard = (GObject *) input_soundcard; g_rec_mutex_unlock(channel_mutex); /* AgsRecycling */ reset_recycling = FALSE; g_rec_mutex_lock(channel_mutex); if((AGS_IS_OUTPUT(channel) || channel->link == NULL) && channel->first_recycling != NULL){ reset_recycling = TRUE; } g_rec_mutex_unlock(channel_mutex); if(reset_recycling){ g_rec_mutex_lock(channel_mutex); recycling = channel->first_recycling; g_rec_mutex_unlock(channel_mutex); g_object_set(G_OBJECT(recycling), "input-soundcard", input_soundcard, NULL); } /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* play context */ g_rec_mutex_lock(play_mutex); list = channel->play; while(list != NULL){ g_object_set(G_OBJECT(list->data), "input-soundcard", input_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(play_mutex); /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* recall context */ g_rec_mutex_lock(recall_mutex); list = channel->recall; while(list != NULL){ g_object_set(G_OBJECT(list->data), "input-soundcard", input_soundcard, NULL); list = list->next; } g_rec_mutex_unlock(recall_mutex); /* unref old soundcard */ if(old_soundcard != NULL){ g_object_unref(old_soundcard); } } /** * ags_channel_get_samplerate: * @channel: the #AgsChannel * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_channel_get_samplerate(AgsChannel *channel) { guint samplerate; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_channel_set_samplerate: * @channel: the #AgsChannel * @samplerate: the samplerate * * Set samplerate. * * Since: 3.0.0 */ void ags_channel_set_samplerate(AgsChannel *channel, guint samplerate) { AgsChannel *link; AgsRecycling *recycling; AgsPlayback *playback; AgsThread *channel_thread; AgsMessageDelivery *message_delivery; GList *start_message_queue; gdouble frequency; guint old_samplerate; gint i; GRecMutex *channel_mutex; GRecMutex *playback_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* set samplerate */ g_rec_mutex_lock(channel_mutex); old_samplerate = channel->samplerate; channel->samplerate = samplerate; link = channel->link; recycling = channel->first_recycling; playback = (AgsPlayback *) channel->playback; frequency = ceil((gdouble) channel->samplerate / (gdouble) channel->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_rec_mutex_unlock(channel_mutex); if(playback != NULL){ /* get playback domain mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* channel thread - frequency */ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ g_rec_mutex_lock(playback_mutex); channel_thread = playback->channel_thread[i]; g_rec_mutex_unlock(playback_mutex); if(channel_thread != NULL){ /* apply new frequency */ g_object_set(channel_thread, "frequency", frequency, NULL); } } } if(link == NULL && recycling != NULL){ g_object_set(recycling, "samplerate", samplerate, NULL); } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::set-samplerate"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* samplerate */ message->parameter_name[0] = "samplerate"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), samplerate); /* old samplerate */ message->parameter_name[1] = "old-samplerate"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), old_samplerate); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_channel_get_buffer_size: * @channel: the #AgsChannel * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_channel_get_buffer_size(AgsChannel *channel) { guint buffer_size; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_channel_set_buffer_size: * @channel: the #AgsChannel * @buffer_size: the buffer_size * * Set buffer-size. * * Since: 3.0.0 */ void ags_channel_set_buffer_size(AgsChannel *channel, guint buffer_size) { AgsChannel *link; AgsRecycling *recycling; AgsPlayback *playback; AgsThread *channel_thread; AgsMessageDelivery *message_delivery; GList *start_message_queue; gdouble frequency; guint old_buffer_size; gint i; GRecMutex *channel_mutex; GRecMutex *playback_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* set buffer size */ g_rec_mutex_lock(channel_mutex); old_buffer_size = channel->buffer_size; channel->buffer_size = buffer_size; link = channel->link; recycling = channel->first_recycling; playback = (AgsPlayback *) channel->playback; frequency = ceil((gdouble) channel->samplerate / (gdouble) channel->buffer_size) + AGS_SOUNDCARD_DEFAULT_OVERCLOCK; g_rec_mutex_unlock(channel_mutex); if(playback != NULL){ /* get playback domain mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* channel thread - frequency */ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ g_rec_mutex_lock(playback_mutex); channel_thread = playback->channel_thread[i]; g_rec_mutex_unlock(playback_mutex); if(channel_thread != NULL){ /* apply new frequency */ g_object_set(channel_thread, "frequency", frequency, NULL); } } } if(link == NULL && recycling != NULL){ g_object_set(recycling, "buffer-size", buffer_size, NULL); } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::set-buffer-size"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* buffer_size */ message->parameter_name[0] = "buffer-size"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), buffer_size); /* old buffer_size */ message->parameter_name[1] = "old-buffer-size"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), old_buffer_size); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_channel_get_format: * @channel: the #AgsChannel * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_channel_get_format(AgsChannel *channel) { guint format; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "format", &format, NULL); return(format); } /** * ags_channel_set_format: * @channel: the #AgsChannel * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_channel_set_format(AgsChannel *channel, guint format) { AgsChannel *link; AgsRecycling *recycling; AgsMessageDelivery *message_delivery; GList *start_message_queue; guint old_format; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* set buffer size */ g_rec_mutex_lock(channel_mutex); old_format = channel->format; channel->format = format; link = channel->link; recycling = channel->first_recycling; g_rec_mutex_unlock(channel_mutex); if(link == NULL && recycling != NULL){ g_object_set(recycling, "format", format, NULL); } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::set-format"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* format */ message->parameter_name[0] = "format"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), format); /* old format */ message->parameter_name[1] = "old-format"; g_value_init(&(message->value[1]), G_TYPE_UINT); g_value_set_uint(&(message->value[1]), old_format); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_channel_get_pad: * @channel: the #AgsChannel * * Gets pad. * * Returns: the pad * * Since: 3.1.0 */ guint ags_channel_get_pad(AgsChannel *channel) { guint pad; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "pad", &pad, NULL); return(pad); } /** * ags_channel_set_pad: * @channel: the #AgsChannel * @pad: the pad * * Set pad. * * Since: 3.0.0 */ void ags_channel_set_pad(AgsChannel *channel, guint pad) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "pad", pad, NULL); } /** * ags_channel_get_audio_channel: * @channel: the #AgsChannel * * Gets audio_channel. * * Returns: the audio_channel * * Since: 3.1.0 */ guint ags_channel_get_audio_channel(AgsChannel *channel) { guint audio_channel; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "audio-channel", &audio_channel, NULL); return(audio_channel); } /** * ags_channel_set_audio_channel: * @channel: the #AgsChannel * @audio_channel: the audio_channel * * Set audio_channel. * * Since: 3.0.0 */ void ags_channel_set_audio_channel(AgsChannel *channel, guint audio_channel) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "audio-channel", audio_channel, NULL); } /** * ags_channel_get_line: * @channel: the #AgsChannel * * Gets line. * * Returns: the line * * Since: 3.1.0 */ guint ags_channel_get_line(AgsChannel *channel) { guint line; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "line", &line, NULL); return(line); } /** * ags_channel_set_line: * @channel: the #AgsChannel * @line: the line * * Set line. * * Since: 3.0.0 */ void ags_channel_set_line(AgsChannel *channel, guint line) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "line", line, NULL); } /** * ags_channel_get_octave: * @channel: the #AgsChannel * * Gets octave. * * Returns: the octave * * Since: 3.1.0 */ gint ags_channel_get_octave(AgsChannel *channel) { gint octave; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "octave", &octave, NULL); return(octave); } /** * ags_channel_set_octave: * @channel: the #AgsChannel * @octave: the octave * * Sets octave. * * Since: 3.1.0 */ void ags_channel_set_octave(AgsChannel *channel, gint octave) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "octave", octave, NULL); } /** * ags_channel_get_key: * @channel: the #AgsChannel * * Gets key. * * Returns: the key * * Since: 3.1.0 */ guint ags_channel_get_key(AgsChannel *channel) { guint key; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "key", &key, NULL); return(key); } /** * ags_channel_set_key: * @channel: the #AgsChannel * @key: the key * * Sets key. * * Since: 3.1.0 */ void ags_channel_set_key(AgsChannel *channel, guint key) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "key", key, NULL); } /** * ags_channel_get_absolute_key: * @channel: the #AgsChannel * * Gets absolute key. * * Returns: the absolute key * * Since: 3.1.0 */ gint ags_channel_get_absolute_key(AgsChannel *channel) { gint absolute_key; if(!AGS_IS_CHANNEL(channel)){ return(0); } g_object_get(channel, "absolute-key", &absolute_key, NULL); return(absolute_key); } /** * ags_channel_set_absolute_key: * @channel: the #AgsChannel * @absolute_key: the absolute key * * Sets absolute key. * * Since: 3.1.0 */ void ags_channel_set_absolute_key(AgsChannel *channel, gint absolute_key) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "absolute-key", absolute_key, NULL); } /** * ags_channel_get_pattern: * @channel: the #AgsChannel * * Get pattern. * * Returns: (element-type AgsAudio.Pattern) (transfer full): the #GList-struct containig #AgsPattern * * Since: 3.1.0 */ GList* ags_channel_get_pattern(AgsChannel *channel) { GList *pattern; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "pattern", &pattern, NULL); return(pattern); } /** * ags_channel_set_pattern: * @channel: the #AgsChannel * @pattern: (element-type AgsAudio.Pattern) (transfer full): the #GList-struct containing #AgsPattern * * Set pattern by replacing existing. * * Since: 3.1.0 */ void ags_channel_set_pattern(AgsChannel *channel, GList *pattern) { GList *start_pattern; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); g_rec_mutex_lock(channel_mutex); start_pattern = channel->pattern; channel->pattern = pattern; g_rec_mutex_unlock(channel_mutex); g_list_free_full(start_pattern, (GDestroyNotify) g_object_unref); } /** * ags_channel_add_pattern: * @channel: an #AgsChannel * @pattern: the #AgsPattern * * Removes a pattern. * * Since: 3.0.0 */ void ags_channel_add_pattern(AgsChannel *channel, GObject *pattern) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_PATTERN(pattern)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* add pattern */ g_rec_mutex_lock(channel_mutex); if(g_list_find(channel->pattern, pattern) == NULL){ g_object_ref(pattern); channel->pattern = g_list_prepend(channel->pattern, pattern); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_remove_pattern: * @channel: an #AgsChannel * @pattern: the #AgsPattern * * Removes a pattern. * * Since: 3.0.0 */ void ags_channel_remove_pattern(AgsChannel *channel, GObject *pattern) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_PATTERN(pattern)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* remove pattern */ g_rec_mutex_lock(channel_mutex); if(g_list_find(channel->pattern, pattern) != NULL){ channel->pattern = g_list_remove(channel->pattern, pattern); g_object_unref(G_OBJECT(pattern)); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_get_playback: * @channel: the #AgsChannel * * Get playback domain. * * Returns: (transfer full): the #AgsPlayback * * Since: 3.1.0 */ GObject* ags_channel_get_playback(AgsChannel *channel) { GObject *playback; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "playback", &playback, NULL); return(playback); } /** * ags_channel_set_playback: * @channel: the #AgsChannel * @playback: the #AgsPlayback * * Set playback. * * Since: 3.1.0 */ void ags_channel_set_playback(AgsChannel *channel, GObject *playback) { if(!AGS_IS_CHANNEL(channel)){ return; } g_object_set(channel, "playback", playback, NULL); } /** * ags_channel_get_recall_id: * @channel: the #AgsChannel * * Get recall id. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containig #AgsRecallID * * Since: 3.1.0 */ GList* ags_channel_get_recall_id(AgsChannel *channel) { GList *recall_id; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "recall_id", &recall_id, NULL); return(recall_id); } /** * ags_channel_set_recall_id: * @channel: the #AgsChannel * @recall_id: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containing #AgsRecallID * * Set recall id by replacing existing. * * Since: 3.1.0 */ void ags_channel_set_recall_id(AgsChannel *channel, GList *recall_id) { GList *start_recall_id; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); g_rec_mutex_lock(channel_mutex); start_recall_id = channel->recall_id; channel->recall_id = recall_id; g_rec_mutex_unlock(channel_mutex); g_list_free_full(start_recall_id, (GDestroyNotify) g_object_unref); } /** * ags_channel_add_recall_id: * @channel: an #AgsChannel * @recall_id: the #AgsRecallID * * Adds a recall id. * * Since: 3.0.0 */ void ags_channel_add_recall_id(AgsChannel *channel, AgsRecallID *recall_id) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECALL_ID(recall_id)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* add recall id */ g_rec_mutex_lock(channel_mutex); if(g_list_find(channel->recall_id, recall_id) == NULL){ g_object_ref(G_OBJECT(recall_id)); channel->recall_id = g_list_prepend(channel->recall_id, recall_id); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_remove_recall_id: * @channel: an #AgsChannel * @recall_id: the #AgsRecallID * * Removes a recall id. * * Since: 3.0.0 */ void ags_channel_remove_recall_id(AgsChannel *channel, AgsRecallID *recall_id) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECALL_ID(recall_id)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* remove recall id */ g_rec_mutex_lock(channel_mutex); if(g_list_find(channel->recall_id, recall_id) != NULL){ channel->recall_id = g_list_remove(channel->recall_id, recall_id); g_object_unref(G_OBJECT(recall_id)); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_get_recall_container: * @channel: the #AgsChannel * * Get recall_container. * * Returns: (element-type AgsAudio.RecallContainer) (transfer full): the #GList-struct containig #AgsRecallContainer * * Since: 3.1.0 */ GList* ags_channel_get_recall_container(AgsChannel *channel) { GList *recall_container; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "recall-container", &recall_container, NULL); return(recall_container); } /** * ags_channel_set_recall_container: * @channel: the #AgsChannel * @recall_container: (element-type AgsAudio.RecallContainer) (transfer full): the #GList-struct containing #AgsRecallContainer * * Set recall_container by replacing existing. * * Since: 3.1.0 */ void ags_channel_set_recall_container(AgsChannel *channel, GList *recall_container) { GList *start_recall_container; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); g_rec_mutex_lock(channel_mutex); start_recall_container = channel->recall_container; channel->recall_container = recall_container; g_rec_mutex_unlock(channel_mutex); g_list_free_full(start_recall_container, (GDestroyNotify) g_object_unref); } /** * ags_channel_add_recall_container: * @channel: an #AgsChannel * @recall_container: the #AgsRecallContainer * * Adds a recall container. * * Since: 3.0.0 */ void ags_channel_add_recall_container(AgsChannel *channel, GObject *recall_container) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECALL_CONTAINER(recall_container)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* add recall container */ g_rec_mutex_lock(channel_mutex); if(g_list_find(channel->recall_container, recall_container) == NULL){ g_object_ref(G_OBJECT(recall_container)); channel->recall_container = g_list_prepend(channel->recall_container, recall_container); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_remove_recall_container: * @channel: an #AgsChannel * @recall_container: the #AgsRecallContainer * * Removes a recall container. * * Since: 3.0.0 */ void ags_channel_remove_recall_container(AgsChannel *channel, GObject *recall_container) { GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECALL_CONTAINER(recall_container)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* remove recall container */ g_rec_mutex_lock(channel_mutex); if(g_list_find(channel->recall_container, recall_container) != NULL){ channel->recall_container = g_list_remove(channel->recall_container, recall_container); g_object_unref(G_OBJECT(recall_container)); } g_rec_mutex_unlock(channel_mutex); } /** * ags_channel_get_play: * @channel: the #AgsChannel * * Get play. * * Returns: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containig #AgsRecall * * Since: 3.1.0 */ GList* ags_channel_get_play(AgsChannel *channel) { GList *play; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "play", &play, NULL); return(play); } /** * ags_channel_set_play: * @channel: the #AgsChannel * @play: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containing #AgsRecall * * Set play by replacing existing. * * Since: 3.1.0 */ void ags_channel_set_play(AgsChannel *channel, GList *play) { GList *start_play; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); g_rec_mutex_lock(channel_mutex); start_play = channel->play; channel->play = play; g_rec_mutex_unlock(channel_mutex); g_list_free_full(start_play, (GDestroyNotify) g_object_unref); } /** * ags_channel_get_recall: * @channel: the #AgsChannel * * Get recall. * * Returns: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containig #AgsRecall * * Since: 3.1.0 */ GList* ags_channel_get_recall(AgsChannel *channel) { GList *recall; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } g_object_get(channel, "recall", &recall, NULL); return(recall); } /** * ags_channel_set_recall: * @channel: the #AgsChannel * @recall: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containing #AgsRecall * * Set recall by replacing existing. * * Since: 3.1.0 */ void ags_channel_set_recall(AgsChannel *channel, GList *recall) { GList *start_recall; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); g_rec_mutex_lock(channel_mutex); start_recall = channel->recall; channel->recall = recall; g_rec_mutex_unlock(channel_mutex); g_list_free_full(start_recall, (GDestroyNotify) g_object_unref); } /** * ags_channel_add_recall: * @channel: an #AgsChannel * @recall: the #AgsRecall * @play_context: %TRUE if play context, else if %FALSE recall context * * Adds a recall. * * Since: 3.0.0 */ void ags_channel_add_recall(AgsChannel *channel, GObject *recall, gboolean play_context) { GObject *output_soundcard, *input_soundcard; gint output_soundcard_channel, input_soundcard_channel; guint samplerate; guint buffer_size; guint format; gboolean success; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECALL(recall)){ return; } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get some fields */ g_rec_mutex_lock(channel_mutex); output_soundcard = channel->output_soundcard; output_soundcard_channel = channel->output_soundcard_channel; input_soundcard = channel->input_soundcard; input_soundcard_channel = channel->input_soundcard_channel; samplerate = channel->samplerate; buffer_size = channel->buffer_size; format = channel->format; g_rec_mutex_unlock(channel_mutex); success = FALSE; g_object_set(recall, "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "samplerate", samplerate, "buffer-size", buffer_size, "format", format, NULL); if(play_context){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* add recall */ g_rec_mutex_lock(play_mutex); if(g_list_find(channel->play, recall) == NULL){ g_object_ref(G_OBJECT(recall)); channel->play = g_list_prepend(channel->play, recall); } g_rec_mutex_unlock(play_mutex); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* add recall */ g_rec_mutex_lock(recall_mutex); if(g_list_find(channel->recall, recall) == NULL){ g_object_ref(G_OBJECT(recall)); channel->recall = g_list_prepend(channel->recall, recall); } g_rec_mutex_unlock(recall_mutex); } if(success){ if(AGS_IS_RECALL_CHANNEL(recall) || AGS_IS_RECALL_CHANNEL_RUN(recall)){ g_object_set(recall, "source", channel, NULL); } } } /** * ags_channel_remove_recall: * @channel: an #AgsChannel * @recall: the #AgsRecall * @play_context: %TRUE if play context, else if %FALSE recall context * * Removes a recall. * * Since: 3.0.0 */ void ags_channel_remove_recall(AgsChannel *channel, GObject *recall, gboolean play_context) { gboolean success; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECALL(recall)){ return; } success = FALSE; if(play_context){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* add recall */ g_rec_mutex_lock(play_mutex); if(g_list_find(channel->play, recall) != NULL){ success = TRUE; channel->play = g_list_remove(channel->play, recall); } g_rec_mutex_unlock(play_mutex); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* add recall */ g_rec_mutex_lock(recall_mutex); if(g_list_find(channel->recall, recall) != NULL){ success = TRUE; channel->recall = g_list_remove(channel->recall, recall); } g_rec_mutex_unlock(recall_mutex); } if(success){ #if 0 if(AGS_IS_RECALL_CHANNEL(recall) || AGS_IS_RECALL_CHANNEL_RUN(recall)){ g_object_set(recall, "source", NULL, "destination", NULL, NULL); } #endif g_object_unref(G_OBJECT(recall)); } } GList* ags_channel_add_ladspa_effect(AgsChannel *channel, gchar *filename, gchar *effect) { AgsAudio *audio; AgsRecallContainer *recall_container; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsRecallLadspa *recall_ladspa; AgsLadspaManager *ladspa_manager; AgsLadspaPlugin *ladspa_plugin; GObject *output_soundcard, *input_soundcard; GList *recall_list; gint output_soundcard_channel, input_soundcard_channel; void *plugin_so; LADSPA_Descriptor_Function ladspa_descriptor; LADSPA_Descriptor *plugin_descriptor; unsigned long effect_index; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get some fields */ g_rec_mutex_lock(channel_mutex); audio = (AgsAudio *) channel->audio; output_soundcard = channel->output_soundcard; output_soundcard_channel = channel->output_soundcard_channel; input_soundcard = channel->input_soundcard; input_soundcard_channel = channel->input_soundcard_channel; g_rec_mutex_unlock(channel_mutex); /* initialize return value */ recall_list = NULL; /* load plugin */ ladspa_manager = ags_ladspa_manager_get_instance(); ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ladspa_manager, filename, effect); effect_index = AGS_BASE_PLUGIN(ladspa_plugin)->effect_index; /* ladspa play */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(channel, (GObject *) recall_container); recall_ladspa = ags_recall_ladspa_new(channel, filename, effect, effect_index); AGS_RECALL(recall_ladspa)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(recall_ladspa), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, NULL); ags_channel_add_recall(channel, (GObject *) recall_ladspa, TRUE); recall_list = g_list_prepend(recall_list, recall_ladspa); /* load */ ags_recall_ladspa_load(recall_ladspa); ags_recall_ladspa_load_ports(recall_ladspa); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LADSPA_RUN); AGS_RECALL(generic_recall_channel_run)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, "recall-channel", recall_ladspa, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); recall_list = g_list_prepend(recall_list, generic_recall_channel_run); /* check if connected or running */ if(ags_connectable_is_connected(AGS_CONNECTABLE(channel))){ AgsRecall *current; GList *recall_id_start, *recall_id; GRecMutex *recall_id_mutex; ags_connectable_connect(AGS_CONNECTABLE(recall_container)); ags_connectable_connect(AGS_CONNECTABLE(recall_ladspa)); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* get recall id */ g_rec_mutex_lock(channel_mutex); recall_id = recall_id_start = g_list_copy(channel->recall_id); g_rec_mutex_unlock(channel_mutex); while(recall_id != NULL){ if(AGS_RECALL_ID(recall_id->data)->recycling_context != NULL && AGS_RECALL_ID(recall_id->data)->recycling_context->parent == NULL){ if(ags_recall_id_check_staging_flags(recall_id->data, (AGS_SOUND_STATE_IS_WAITING | AGS_SOUND_STATE_IS_ACTIVE))){ gint sound_scope; guint staging_flags; current = ags_recall_duplicate((AgsRecall *) generic_recall_channel_run, (AgsRecallID *) recall_id->data, NULL, NULL, NULL); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id->data); /* set appropriate scope */ g_rec_mutex_lock(recall_id_mutex); sound_scope = AGS_RECALL_ID(recall_id->data)->sound_scope; staging_flags = AGS_RECALL_ID(recall_id->data)->staging_flags; g_rec_mutex_unlock(recall_id_mutex); ags_recall_set_sound_scope(current, sound_scope); /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) current, TRUE); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(current)); /* notify run and resolve dependencies */ ags_recall_notify_dependency(current, AGS_RECALL_NOTIFY_RUN, 1); ags_recall_resolve_dependency(current); /* set staging flags */ ags_recall_set_staging_flags(current, staging_flags); } } /* iterate */ recall_id = recall_id->next; } /* free GList */ g_list_free(recall_id_start); } /* ladspa recall */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(channel, (GObject *) recall_container); recall_ladspa = ags_recall_ladspa_new(channel, filename, effect, effect_index); AGS_RECALL(recall_ladspa)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(recall_ladspa), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, NULL); ags_channel_add_recall(channel, (GObject *) recall_ladspa, FALSE); recall_list = g_list_prepend(recall_list, recall_ladspa); /* load */ ags_recall_ladspa_load(recall_ladspa); ags_recall_ladspa_load_ports(recall_ladspa); /* generic recall */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LADSPA_RUN); AGS_RECALL(generic_recall_channel_run)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, "recall-channel", recall_ladspa, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); recall_list = g_list_prepend(recall_list, generic_recall_channel_run); /* check if connected or running */ if(ags_connectable_is_connected(AGS_CONNECTABLE(channel))){ AgsRecall *current; GList *recall_id_start, *recall_id; ags_connectable_connect(AGS_CONNECTABLE(recall_container)); ags_connectable_connect(AGS_CONNECTABLE(recall_ladspa)); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* get recall id */ g_rec_mutex_lock(channel_mutex); recall_id = recall_id_start = g_list_copy(channel->recall_id); g_rec_mutex_unlock(channel_mutex); while(recall_id != NULL){ if(AGS_RECALL_ID(recall_id->data)->recycling_context != NULL && AGS_RECALL_ID(recall_id->data)->recycling_context->parent != NULL){ if(ags_recall_id_check_staging_flags(recall_id->data, (AGS_SOUND_STATE_IS_WAITING | AGS_SOUND_STATE_IS_ACTIVE))){ gint sound_scope; guint staging_flags; GRecMutex *recall_id_mutex; current = ags_recall_duplicate((AgsRecall *) generic_recall_channel_run, (AgsRecallID *) recall_id->data, NULL, NULL, NULL); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id->data); /* set appropriate scope */ g_rec_mutex_lock(recall_id_mutex); sound_scope = AGS_RECALL_ID(recall_id->data)->sound_scope; staging_flags = AGS_RECALL_ID(recall_id->data)->staging_flags; g_rec_mutex_unlock(recall_id_mutex); ags_recall_set_sound_scope(current, sound_scope); /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) current, FALSE); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(current)); /* notify run and resolve dependencies */ ags_recall_notify_dependency(current, AGS_RECALL_NOTIFY_RUN, 1); ags_recall_resolve_dependency(current); /* set staging flags */ ags_recall_set_staging_flags(current, staging_flags); } } /* iterate */ recall_id = recall_id->next; } /* free GList */ g_list_free(recall_id_start); } return(recall_list); } GList* ags_channel_add_dssi_effect(AgsChannel *channel, gchar *filename, gchar *effect) { AgsAudio *audio; AgsRecallContainer *recall_container; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsRecallDssi *recall_dssi; AgsDssiManager *dssi_manager; AgsDssiPlugin *dssi_plugin; GObject *output_soundcard, *input_soundcard; GList *recall_list; gint output_soundcard_channel, input_soundcard_channel; void *plugin_so; DSSI_Descriptor_Function dssi_descriptor; DSSI_Descriptor *plugin_descriptor; unsigned long effect_index; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get some fields */ g_rec_mutex_lock(channel_mutex); audio = (AgsAudio *) channel->audio; output_soundcard = channel->output_soundcard; output_soundcard_channel = channel->output_soundcard_channel; input_soundcard = channel->input_soundcard; input_soundcard_channel = channel->input_soundcard_channel; g_rec_mutex_unlock(channel_mutex); recall_list = NULL; /* load plugin */ dssi_manager = ags_dssi_manager_get_instance(); dssi_plugin = ags_dssi_manager_find_dssi_plugin(dssi_manager, filename, effect); effect_index = AGS_BASE_PLUGIN(dssi_plugin)->effect_index; /* dssi play */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(channel, (GObject *) recall_container); recall_dssi = ags_recall_dssi_new(channel, filename, effect, effect_index); AGS_RECALL(recall_dssi)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(recall_dssi), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, NULL); ags_channel_add_recall(channel, (GObject *) recall_dssi, TRUE); recall_list = g_list_prepend(recall_list, recall_dssi); /* load */ ags_recall_dssi_load(recall_dssi); ags_recall_dssi_load_ports(recall_dssi); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_DSSI_RUN); AGS_RECALL(generic_recall_channel_run)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, "recall-channel", recall_dssi, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); recall_list = g_list_prepend(recall_list, generic_recall_channel_run); /* check if connected or running */ if(ags_connectable_is_connected(AGS_CONNECTABLE(channel))){ AgsRecall *current; GList *recall_id_start, *recall_id; GRecMutex *recall_id_mutex; ags_connectable_connect(AGS_CONNECTABLE(recall_container)); ags_connectable_connect(AGS_CONNECTABLE(recall_dssi)); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* get recall id */ g_rec_mutex_lock(channel_mutex); recall_id = recall_id_start = g_list_copy(channel->recall_id); g_rec_mutex_unlock(channel_mutex); while(recall_id != NULL){ if(AGS_RECALL_ID(recall_id->data)->recycling_context != NULL && AGS_RECALL_ID(recall_id->data)->recycling_context->parent == NULL){ if(ags_recall_id_check_staging_flags(recall_id->data, (AGS_SOUND_STATE_IS_WAITING | AGS_SOUND_STATE_IS_ACTIVE))){ gint sound_scope; guint staging_flags; current = ags_recall_duplicate((AgsRecall *) generic_recall_channel_run, (AgsRecallID *) recall_id->data, NULL, NULL, NULL); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id->data); /* set appropriate scope */ g_rec_mutex_lock(recall_id_mutex); sound_scope = AGS_RECALL_ID(recall_id->data)->sound_scope; staging_flags = AGS_RECALL_ID(recall_id->data)->staging_flags; g_rec_mutex_unlock(recall_id_mutex); ags_recall_set_sound_scope(current, sound_scope); /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) current, TRUE); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(current)); /* notify run and resolve dependencies */ ags_recall_notify_dependency(current, AGS_RECALL_NOTIFY_RUN, 1); ags_recall_resolve_dependency(current); /* set staging flags */ ags_recall_set_staging_flags(current, staging_flags); } } /* iterate */ recall_id = recall_id->next; } /* free GList */ g_list_free(recall_id_start); } /* dssi recall */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(channel, (GObject *) recall_container); recall_dssi = ags_recall_dssi_new(channel, filename, effect, effect_index); AGS_RECALL(recall_dssi)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(recall_dssi), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, NULL); ags_channel_add_recall(channel, (GObject *) recall_dssi, FALSE); recall_list = g_list_prepend(recall_list, recall_dssi); /* load */ ags_recall_dssi_load(recall_dssi); ags_recall_dssi_load_ports(recall_dssi); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_DSSI_RUN); AGS_RECALL(generic_recall_channel_run)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, "recall-channel", recall_dssi, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); recall_list = g_list_prepend(recall_list, generic_recall_channel_run); /* check if connected or running */ if(ags_connectable_is_connected(AGS_CONNECTABLE(channel))){ AgsRecall *current; GList *recall_id_start, *recall_id; ags_connectable_connect(AGS_CONNECTABLE(recall_container)); ags_connectable_connect(AGS_CONNECTABLE(recall_dssi)); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* get recall id */ g_rec_mutex_lock(channel_mutex); recall_id = recall_id_start = g_list_copy(channel->recall_id); g_rec_mutex_unlock(channel_mutex); while(recall_id != NULL){ if(AGS_RECALL_ID(recall_id->data)->recycling_context != NULL && AGS_RECALL_ID(recall_id->data)->recycling_context->parent != NULL){ if(ags_recall_id_check_staging_flags(recall_id->data, (AGS_SOUND_STATE_IS_WAITING | AGS_SOUND_STATE_IS_ACTIVE))){ gint sound_scope; guint staging_flags; GRecMutex *recall_id_mutex; current = ags_recall_duplicate((AgsRecall *) generic_recall_channel_run, (AgsRecallID *) recall_id->data, NULL, NULL, NULL); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id->data); /* set appropriate scope */ g_rec_mutex_lock(recall_id_mutex); sound_scope = AGS_RECALL_ID(recall_id->data)->sound_scope; staging_flags = AGS_RECALL_ID(recall_id->data)->staging_flags; g_rec_mutex_unlock(recall_id_mutex); ags_recall_set_sound_scope(current, sound_scope); /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) current, FALSE); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(current)); /* notify run and resolve dependencies */ ags_recall_notify_dependency(current, AGS_RECALL_NOTIFY_RUN, 1); ags_recall_resolve_dependency(current); /* set staging flags */ ags_recall_set_staging_flags(current, staging_flags); } } /* iterate */ recall_id = recall_id->next; } /* free GList */ g_list_free(recall_id_start); } return(recall_list); } GList* ags_channel_add_lv2_effect(AgsChannel *channel, gchar *filename, gchar *effect) { AgsAudio *audio; AgsRecallContainer *recall_container; AgsGenericRecallChannelRun *generic_recall_channel_run; AgsRecallLv2 *recall_lv2; AgsLv2Manager *lv2_manager; AgsLv2Plugin *lv2_plugin; GObject *output_soundcard, *input_soundcard; GList *uri_node; GList *recall_list; gchar *uri; gchar *str; gint output_soundcard_channel, input_soundcard_channel; void *plugin_so; LV2_Descriptor_Function lv2_descriptor; LV2_Descriptor *plugin_descriptor; uint32_t effect_index; GRecMutex *channel_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get some fields */ g_rec_mutex_lock(channel_mutex); audio = (AgsAudio *) channel->audio; output_soundcard = channel->output_soundcard; output_soundcard_channel = channel->output_soundcard_channel; input_soundcard = channel->input_soundcard; input_soundcard_channel = channel->input_soundcard_channel; g_rec_mutex_unlock(channel_mutex); recall_list = NULL; /* load plugin */ lv2_manager = ags_lv2_manager_get_instance(); lv2_plugin = ags_lv2_manager_find_lv2_plugin(lv2_manager, filename, effect); effect_index = AGS_BASE_PLUGIN(lv2_plugin)->effect_index; uri = lv2_plugin->uri; /* lv2 play */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(channel, (GObject *) recall_container); recall_lv2 = ags_recall_lv2_new(channel, lv2_plugin->turtle, filename, effect, uri, effect_index); AGS_RECALL(recall_lv2)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(recall_lv2), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, NULL); ags_channel_add_recall(channel, (GObject *) recall_lv2, TRUE); recall_list = g_list_prepend(recall_list, recall_lv2); /* load */ ags_recall_lv2_load(recall_lv2); ags_recall_lv2_load_ports(recall_lv2); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LV2_RUN); AGS_RECALL(generic_recall_channel_run)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, "recall-channel", recall_lv2, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, TRUE); recall_list = g_list_prepend(recall_list, generic_recall_channel_run); /* check if connected or running */ if(ags_connectable_is_connected(AGS_CONNECTABLE(channel))){ AgsRecall *current; GList *recall_id_start, *recall_id; GRecMutex *recall_id_mutex; ags_connectable_connect(AGS_CONNECTABLE(recall_container)); ags_connectable_connect(AGS_CONNECTABLE(recall_lv2)); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* get recall id */ g_rec_mutex_lock(channel_mutex); recall_id = recall_id_start = g_list_copy(channel->recall_id); g_rec_mutex_unlock(channel_mutex); while(recall_id != NULL){ if(AGS_RECALL_ID(recall_id->data)->recycling_context != NULL && AGS_RECALL_ID(recall_id->data)->recycling_context->parent == NULL){ if(ags_recall_id_check_staging_flags(recall_id->data, (AGS_SOUND_STATE_IS_WAITING | AGS_SOUND_STATE_IS_ACTIVE))){ gint sound_scope; guint staging_flags; current = ags_recall_duplicate((AgsRecall *) generic_recall_channel_run, (AgsRecallID *) recall_id->data, NULL, NULL, NULL); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id->data); /* set appropriate scope */ g_rec_mutex_lock(recall_id_mutex); sound_scope = AGS_RECALL_ID(recall_id->data)->sound_scope; staging_flags = AGS_RECALL_ID(recall_id->data)->staging_flags; g_rec_mutex_unlock(recall_id_mutex); ags_recall_set_sound_scope(current, sound_scope); /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) current, TRUE); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(current)); /* notify run and resolve dependencies */ ags_recall_notify_dependency(current, AGS_RECALL_NOTIFY_RUN, 1); ags_recall_resolve_dependency(current); /* set staging flags */ ags_recall_set_staging_flags(current, staging_flags); } } /* iterate */ recall_id = recall_id->next; } /* free GList */ g_list_free(recall_id_start); } /* lv2 recall */ recall_container = ags_recall_container_new(); ags_channel_add_recall_container(channel, (GObject *) recall_container); recall_lv2 = ags_recall_lv2_new(channel, lv2_plugin->turtle, filename, effect, uri, effect_index); AGS_RECALL(recall_lv2)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(recall_lv2), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, NULL); ags_channel_add_recall(channel, (GObject *) recall_lv2, FALSE); recall_list = g_list_prepend(recall_list, recall_lv2); /* load */ ags_recall_lv2_load(recall_lv2); ags_recall_lv2_load_ports(recall_lv2); /* generic */ generic_recall_channel_run = ags_generic_recall_channel_run_new(channel, AGS_TYPE_GENERIC_RECALL_RECYCLING, AGS_TYPE_RECALL_LV2_RUN); AGS_RECALL(generic_recall_channel_run)->flags |= AGS_RECALL_TEMPLATE; g_object_set(G_OBJECT(generic_recall_channel_run), "output-soundcard", output_soundcard, "output-soundcard-channel", output_soundcard_channel, "input-soundcard", input_soundcard, "input-soundcard-channel", input_soundcard_channel, "recall-container", recall_container, "recall-channel", recall_lv2, NULL); ags_channel_add_recall(channel, (GObject *) generic_recall_channel_run, FALSE); recall_list = g_list_prepend(recall_list, generic_recall_channel_run); /* check if connected or running */ if(ags_connectable_is_connected(AGS_CONNECTABLE(channel))){ AgsRecall *current; GList *recall_id_start, *recall_id; GRecMutex *recall_id_mutex; ags_connectable_connect(AGS_CONNECTABLE(recall_container)); ags_connectable_connect(AGS_CONNECTABLE(recall_lv2)); ags_connectable_connect(AGS_CONNECTABLE(generic_recall_channel_run)); /* get recall id */ g_rec_mutex_lock(channel_mutex); recall_id = recall_id_start = g_list_copy(channel->recall_id); g_rec_mutex_unlock(channel_mutex); while(recall_id != NULL){ if(AGS_RECALL_ID(recall_id->data)->recycling_context != NULL && AGS_RECALL_ID(recall_id->data)->recycling_context->parent == NULL){ if(ags_recall_id_check_staging_flags(recall_id->data, (AGS_SOUND_STATE_IS_WAITING | AGS_SOUND_STATE_IS_ACTIVE))){ gint sound_scope; guint staging_flags; current = ags_recall_duplicate((AgsRecall *) generic_recall_channel_run, (AgsRecallID *) recall_id->data, NULL, NULL, NULL); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id->data); /* set appropriate scope */ g_rec_mutex_lock(recall_id_mutex); sound_scope = AGS_RECALL_ID(recall_id->data)->sound_scope; staging_flags = AGS_RECALL_ID(recall_id->data)->staging_flags; g_rec_mutex_unlock(recall_id_mutex); ags_recall_set_sound_scope(current, sound_scope); /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) current, FALSE); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(current)); /* notify run and resolve dependencies */ ags_recall_notify_dependency(current, AGS_RECALL_NOTIFY_RUN, 1); ags_recall_resolve_dependency(current); /* set staging flags */ ags_recall_set_staging_flags(current, staging_flags); } } /* iterate */ recall_id = recall_id->next; } /* free GList */ g_list_free(recall_id_start); } return(recall_list); } GList* ags_channel_real_add_effect(AgsChannel *channel, gchar *filename, gchar *effect) { AgsLadspaPlugin *ladspa_plugin; AgsDssiPlugin *dssi_plugin; AgsLv2Plugin *lv2_plugin; AgsMessageDelivery *message_delivery; GList *start_message_queue; GList *recall_list; /* load plugin */ ladspa_plugin = ags_ladspa_manager_find_ladspa_plugin(ags_ladspa_manager_get_instance(), filename, effect); recall_list = NULL; if(ladspa_plugin != NULL){ recall_list = ags_channel_add_ladspa_effect(channel, filename, effect); } if(ladspa_plugin == NULL){ dssi_plugin = ags_dssi_manager_find_dssi_plugin(ags_dssi_manager_get_instance(), filename, effect); if(dssi_plugin != NULL){ recall_list = ags_channel_add_dssi_effect(channel, filename, effect); } } if(ladspa_plugin == NULL && dssi_plugin == NULL){ lv2_plugin = ags_lv2_manager_find_lv2_plugin(ags_lv2_manager_get_instance(), filename, effect); if(lv2_plugin != NULL){ recall_list = ags_channel_add_lv2_effect(channel, filename, effect); } } /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::add-effect"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* filename */ message->parameter_name[0] = "filename"; g_value_init(&(message->value[0]), G_TYPE_STRING); g_value_set_string(&(message->value[0]), filename); /* effect */ message->parameter_name[1] = "effect"; g_value_init(&(message->value[1]), G_TYPE_STRING); g_value_set_string(&(message->value[1]), effect); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } return(recall_list); } /** * ags_channel_add_effect: * @channel: the #AgsChannel * @filename: the filename * @effect: the effect * * Add specified effect to @channel. * * Returns: (element-type AgsAudio.Recall) (transfer full): the #GList-struct containing #AgsRecall * * Since: 3.0.0 */ GList* ags_channel_add_effect(AgsChannel *channel, gchar *filename, gchar *effect) { GList *recall_list; g_return_val_if_fail(AGS_IS_CHANNEL(channel), NULL); recall_list = NULL; g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[ADD_EFFECT], 0, filename, effect, &recall_list); g_object_unref((GObject *) channel); return(recall_list); } void ags_channel_real_remove_effect(AgsChannel *channel, guint nth) { AgsAudio *audio; AgsRecall *recall_channel, *recall_channel_run; AgsRecallContainer *recall_container; AgsMessageDelivery *message_delivery; GList *start_message_queue; GList *automation_start, *automation; GList *port; GList *list_start, *list; GList *play_start, *play; GList *recall_start, *recall; GList *task; gchar *specifier; guint nth_effect; GRecMutex *audio_mutex; GRecMutex *channel_mutex; GRecMutex *play_mutex, *recall_mutex; /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* get some fields */ g_rec_mutex_lock(channel_mutex); audio = (AgsAudio *) channel->audio; g_rec_mutex_unlock(channel_mutex); /* get audio mutex */ audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); /* play */ nth_effect = 0; g_rec_mutex_lock(play_mutex); play = play_start = g_list_copy(channel->play); while((play = ags_recall_template_find_all_type(play, AGS_TYPE_RECALL_LADSPA, AGS_TYPE_RECALL_LV2, G_TYPE_NONE)) != NULL){ if((AGS_RECALL_TEMPLATE & (AGS_RECALL(play->data)->flags)) != 0){ nth_effect++; } if(nth_effect == nth + 1){ break; } play = play->next; } g_rec_mutex_unlock(play_mutex); /* recall */ nth_effect = 0; g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy(channel->recall); while((recall = ags_recall_template_find_all_type(recall, AGS_TYPE_RECALL_LADSPA, AGS_TYPE_RECALL_LV2, G_TYPE_NONE)) != NULL){ if((AGS_RECALL_TEMPLATE & (AGS_RECALL(recall->data)->flags)) != 0){ nth_effect++; } if(nth_effect == nth + 1){ break; } recall = recall->next; } g_rec_mutex_unlock(recall_mutex); /* play context */ /* automation */ port = NULL; if(play != NULL){ g_rec_mutex_lock(play_mutex); port = AGS_RECALL(play->data)->port; g_rec_mutex_unlock(play_mutex); } while(port != NULL){ specifier = AGS_PORT(port->data)->specifier; /* get automation */ g_rec_mutex_lock(audio_mutex); automation = automation_start = g_list_copy(audio->automation); g_rec_mutex_unlock(audio_mutex); while((automation = ags_automation_find_specifier(automation, specifier)) != NULL){ /* remove automation */ ags_audio_remove_automation(audio, automation->data); /* run dispose and unref */ g_object_run_dispose(automation->data); g_object_unref(automation->data); /* iterate */ automation = automation->next; } g_list_free(automation_start); /* iterate */ port = port->next; } /* remove - recall channel run */ recall_container = (AgsRecallContainer *) AGS_RECALL(play->data)->recall_container; recall_channel = (AgsRecall *) play->data; recall_channel_run = (AgsRecall *) ags_recall_find_template(recall_container->recall_channel_run)->data; list = list_start = g_list_copy(recall_container->recall_channel_run); while(list != NULL){ ags_channel_remove_recall(channel, (GObject *) list->data, TRUE); /* iterate */ list = list->next; } g_list_free(list_start); /* remove - recall channel */ ags_channel_remove_recall(channel, (GObject *) recall_channel, TRUE); /* remove recal container */ ags_channel_remove_recall_container(channel, (GObject *) recall_container); /* recall context */ /* automation */ port = NULL; if(recall != NULL){ g_rec_mutex_lock(recall_mutex); port = AGS_RECALL(recall->data)->port; g_rec_mutex_unlock(recall_mutex); } while(port != NULL){ specifier = AGS_PORT(port->data)->specifier; /* get automation */ g_rec_mutex_lock(audio_mutex); automation = automation_start = g_list_copy(audio->automation); g_rec_mutex_unlock(audio_mutex); while((automation = ags_automation_find_specifier(automation, specifier)) != NULL){ /* remove automation */ ags_audio_remove_automation(audio, automation->data); /* run dispose and unref */ g_object_run_dispose(automation->data); g_object_unref(automation->data); /* iterate */ automation = automation->next; } g_list_free(automation_start); /* iterate */ port = port->next; } /* remove - recall channel */ recall_container = (AgsRecallContainer *) AGS_RECALL(recall->data)->recall_container; recall_channel = (AgsRecall *) recall->data; recall_channel_run = (AgsRecall *) ags_recall_find_template(recall_container->recall_channel_run)->data; list = list_start = g_list_copy(recall_container->recall_channel_run); while(list != NULL){ ags_channel_remove_recall(channel, (GObject *) list->data, FALSE); /* iterate */ list = list->next; } g_list_free(list_start); /* remove - recall channel */ ags_channel_remove_recall(channel, (GObject *) recall_channel, FALSE); /* remove recal container */ ags_channel_remove_recall_container(channel, (GObject *) recall_container); /* free lists */ g_list_free(play_start); g_list_free(recall_start); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::remove-effect"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 1; message->parameter_name = (gchar **) malloc(2 * sizeof(gchar *)); message->value = g_new0(GValue, 1); /* nth */ message->parameter_name[0] = "nth"; g_value_init(&(message->value[0]), G_TYPE_UINT); g_value_set_uint(&(message->value[0]), nth); /* terminate string vector */ message->parameter_name[1] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_channel_remove_effect: * @channel: the #AgsChannel * @nth: nth effect * * Remove specified effect of @channel. * * Since: 3.0.0 */ void ags_channel_remove_effect(AgsChannel *channel, guint nth) { g_return_if_fail(AGS_IS_CHANNEL(channel)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[REMOVE_EFFECT], 0, nth); g_object_unref((GObject *) channel); } void ags_channel_real_duplicate_recall(AgsChannel *channel, AgsRecallID *recall_id) { AgsRecall *recall, *copy_recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; gboolean play_context; GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } // g_message("dup"); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope == -1){ g_critical("can only duplicate for specific sound scope"); return; } recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) != 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate list */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; play_context = TRUE; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; play_context = FALSE; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* notify run */ // ags_recall_notify_dependency(AGS_RECALL(list->data), AGS_RECALL_NOTIFY_RUN, 1); /* return if already played */ g_rec_mutex_lock(recall_id_mutex); if(ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_WAITING) || ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_ACTIVE) || ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_PROCESSING) || ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_TERMINATING)){ g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } g_rec_mutex_unlock(recall_id_mutex); return; } ags_recall_id_set_state_flags(recall_id, AGS_SOUND_STATE_IS_WAITING); g_rec_mutex_unlock(recall_id_mutex); /* duplicate */ while(list != NULL){ GRecMutex *current_recall_mutex; recall = AGS_RECALL(list->data); /* get current recall mutex */ current_recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall); /* some checks */ g_rec_mutex_lock(current_recall_mutex); if(AGS_IS_RECALL_CHANNEL(recall) || (AGS_RECALL_TEMPLATE & (recall->flags)) == 0 || recall->recall_id != NULL || !ags_recall_match_ability_flags_to_scope(recall, sound_scope)){ list = list->next; g_rec_mutex_unlock(current_recall_mutex); continue; } g_rec_mutex_unlock(current_recall_mutex); /* duplicate the recall */ copy_recall = ags_recall_duplicate(recall, recall_id, NULL, NULL, NULL); if(copy_recall == NULL){ /* iterate */ list = list->next; continue; } #ifdef AGS_DEBUG g_message("recall duplicated: %s %s", G_OBJECT_TYPE_NAME(channel), G_OBJECT_TYPE_NAME(copy_recall)); #endif /* set appropriate sound scope */ copy_recall->sound_scope = sound_scope; /* append to AgsChannel */ ags_channel_add_recall(channel, (GObject *) copy_recall, play_context); g_signal_connect(copy_recall, "done", G_CALLBACK(ags_channel_recall_done_callback), channel); /* connect */ ags_connectable_connect(AGS_CONNECTABLE(copy_recall)); /* notify run */ ags_recall_notify_dependency(copy_recall, AGS_RECALL_NOTIFY_RUN, 1); /* iterate */ list = list->next; } g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_channel_duplicate_recall: * @channel: the #AgsChannel * @recall_id: the #AgsRecallID * * Duplicate #AgsRecall template and assign @recall_id to it. * * Since: 3.0.0 */ void ags_channel_duplicate_recall(AgsChannel *channel, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[DUPLICATE_RECALL], 0, recall_id); g_object_unref((GObject *) channel); } void ags_channel_real_resolve_recall(AgsChannel *channel, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope == -1){ g_critical("can only resolve for specific sound scope"); return; } recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) != 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* resolve */ while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); ags_recall_resolve_dependency(recall); list = list->next; } g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_channel_resolve_recall: * @channel: an #AgsChannel * @recall_id: appropriate #AgsRecallID * * Resolve step of initialization. * * Since: 3.0.0 */ void ags_channel_resolve_recall(AgsChannel *channel, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[RESOLVE_RECALL], 0, recall_id); g_object_unref((GObject *) channel); } void ags_channel_real_init_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope == -1){ g_critical("can only init for specific sound scope"); return; } recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) != 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* init */ staging_flags = staging_mask & staging_flags; while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* run init stages */ ags_recall_set_state_flags(recall, AGS_SOUND_STATE_IS_ACTIVE); ags_recall_set_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); #if 0 ags_channel_set_staging_flags(channel, sound_scope, staging_flags); #endif if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_channel_init_recall: * @channel: the #AgsChannel * @recall_id: the #AgsRecallID * @staging_flags: the stages to invoke * * Prepare #AgsRecall objects and invoke #AgsRecall::run-init-pre, #AgsRecall::run-init-inter or * #AgsRecall::run-init-post as specified by @staging_flags. * * Since: 3.0.0 */ void ags_channel_init_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[INIT_RECALL], 0, recall_id, staging_flags); g_object_unref((GObject *) channel); } void ags_channel_real_play_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_mask = (AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST | AGS_SOUND_STAGING_FEED_INPUT_QUEUE | AGS_SOUND_STAGING_AUTOMATE | AGS_SOUND_STAGING_RUN_PRE | AGS_SOUND_STAGING_RUN_INTER | AGS_SOUND_STAGING_RUN_POST | AGS_SOUND_STAGING_DO_FEEDBACK | AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE | AGS_SOUND_STAGING_FINI); GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } // g_message("recall ID 0x%x", recall_id); if(ags_recall_id_check_state_flags(recall_id, AGS_SOUND_STATE_IS_TERMINATING)){ // g_message("`⁻ term"); return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); #if 0 if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (current_staging_flags)) == 0){ return; } #endif /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* automate and play */ staging_flags = staging_mask & staging_flags; if((AGS_SOUND_STAGING_AUTOMATE & (staging_flags)) != 0){ while(list != NULL){ recall = AGS_RECALL(list->data); /* play stages */ if(AGS_IS_RECALL_CHANNEL(recall)){ ags_recall_set_staging_flags(recall, AGS_SOUND_STAGING_AUTOMATE); ags_recall_unset_staging_flags(recall, AGS_SOUND_STAGING_AUTOMATE); } list = list->next; } } staging_flags &= (~AGS_SOUND_STAGING_AUTOMATE); list = list_start; while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* play stages */ ags_recall_set_staging_flags(recall, staging_flags); ags_recall_unset_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } //FIXME:JK: uncomment // ags_channel_set_staging_flags(channel, sound_scope, // staging_flags); } /** * ags_channel_play_recall: * @channel: the #AgsChannel * @recall_id: the #AgsRecallID * @staging_flags: the stages to invoke * * Run the specified steps by @recall_id of @channel. * * Since: 3.0.0 */ void ags_channel_play_recall(AgsChannel *channel, AgsRecallID *recall_id, guint staging_flags) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[PLAY_RECALL], 0, recall_id, staging_flags); g_object_unref((GObject *) channel); } void ags_channel_real_done_recall(AgsChannel *channel, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_flags = (AGS_SOUND_STAGING_DONE); GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (current_staging_flags)) == 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* done */ while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* done stages */ ags_recall_set_staging_flags(recall, staging_flags); list = list->next; } g_list_free_full(list_start, g_object_unref); ags_channel_set_staging_flags(channel, sound_scope, staging_flags); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_channel_done_recall: * @channel: the #AgsChannel * @recall_id: the #AgsRecallID * * Done processing specified by @recall_id. * * Since: 3.0.0 */ void ags_channel_done_recall(AgsChannel *channel, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref(G_OBJECT(channel)); g_signal_emit(G_OBJECT(channel), channel_signals[DONE_RECALL], 0, recall_id); g_object_unref(G_OBJECT(channel)); } void ags_channel_real_cancel_recall(AgsChannel *channel, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; guint sound_scope; guint current_staging_flags; static const guint staging_flags = (AGS_SOUND_STAGING_CANCEL); GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || (AGS_SOUND_STAGING_RUN_INIT_PRE & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (current_staging_flags)) == 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (current_staging_flags)) == 0){ if(recycling_context != NULL){ g_object_unref(recycling_context); } return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* cancel */ while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* cancel stages */ ags_recall_set_staging_flags(recall, staging_flags); ags_recall_unset_state_flags(recall, AGS_SOUND_STATE_IS_ACTIVE); list = list->next; } g_list_free_full(list_start, g_object_unref); ags_channel_set_staging_flags(channel, sound_scope, staging_flags); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_channel_cancel_recall: * @channel: the #AgsChannel * @recall_id: the #AgsRecallID * * Cancel processing specified by @recall_id. * * Since: 3.0.0 */ void ags_channel_cancel_recall(AgsChannel *channel, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[CANCEL_RECALL], 0, recall_id); g_object_unref((GObject *) channel); } void ags_channel_real_cleanup_recall(AgsChannel *channel, AgsRecallID *recall_id) { AgsRecall *recall; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *list_start, *list; GList *match_start, *match; gint sound_scope; guint current_staging_flags; gboolean play_context; GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get some fields */ g_rec_mutex_lock(recall_id_mutex); sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); recycling_context = NULL; g_object_get(recall_id, "recycling-context", &recycling_context, NULL); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get staging flags */ g_rec_mutex_lock(channel_mutex); current_staging_flags = channel->staging_flags[sound_scope]; g_rec_mutex_unlock(channel_mutex); /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent recycling context */ parent_recycling_context = NULL; g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); /* get the appropriate lists */ if(parent_recycling_context == NULL){ GRecMutex *play_mutex; play_context = TRUE; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* copy play context */ g_rec_mutex_lock(play_mutex); list = list_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); /* reverse play context */ list = list_start = g_list_reverse(list_start); }else{ GRecMutex *recall_mutex; play_context = FALSE; /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* copy recall context */ g_rec_mutex_lock(recall_mutex); list = list_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); /* reverse recall context */ list = list_start = g_list_reverse(list_start); } /* cleanup */ match_start = NULL; while((list = ags_recall_find_recycling_context(list, (GObject *) recycling_context)) != NULL){ recall = AGS_RECALL(list->data); /* remove recall */ ags_channel_remove_recall(channel, (GObject *) recall, play_context); match_start = g_list_prepend(match_start, recall); list = list->next; } g_list_free_full(list_start, g_object_unref); /* destroy */ match = match_start; while(match != NULL){ recall = AGS_RECALL(match->data); /* destroy */ ags_connectable_disconnect(AGS_CONNECTABLE(recall)); g_object_run_dispose((GObject *) recall); match = match->next; } g_list_free_full(match_start, g_object_unref); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } if(recycling_context != NULL){ g_object_unref(recycling_context); } } /** * ags_channel_cleanup_recall: * @channel: the #AgsChannel * @recall_id: the #AgsRecallID * * Cleanup processing specified by @recall_id. * * Since: 3.0.0 */ void ags_channel_cleanup_recall(AgsChannel *channel, AgsRecallID *recall_id) { g_return_if_fail(AGS_IS_CHANNEL(channel) && AGS_IS_RECALL_ID(recall_id)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[CLEANUP_RECALL], 0, recall_id); g_object_unref((GObject *) channel); } void ags_channel_recall_done_callback(AgsRecall *recall, AgsChannel *channel) { AgsCancelChannel *cancel_channel; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; gint sound_scope; if(AGS_IS_PLAY_CHANNEL_RUN(recall) && !ags_recall_test_state_flags(recall, AGS_SOUND_STATE_IS_TERMINATING)){ sound_scope = ags_recall_get_sound_scope(recall); if(sound_scope == AGS_SOUND_SCOPE_PLAYBACK){ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); cancel_channel = ags_cancel_channel_new(channel, sound_scope); ags_task_launcher_add_task(task_launcher, cancel_channel); } } } GList* ags_channel_real_start(AgsChannel *channel, gint sound_scope) { AgsAudio *audio; AgsRecycling *first_recycling; AgsPlaybackDomain *playback_domain; AgsPlayback *playback; AgsRecallID *audio_recall_id; AgsRecallID *channel_recall_id; AgsRecallID *current_recall_id; AgsRecyclingContext *recycling_context; AgsThread *audio_loop; AgsThread *audio_thread; AgsThread *channel_thread; AgsMessageDelivery *message_delivery; AgsApplicationContext *application_context; GList *start_message_queue; GList *start_recall_id; GList *start_wait_thread, *wait_thread; gint64 start_wait_timeout; gint i; static const guint staging_flags = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!AGS_IS_INPUT(channel) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return(NULL); } /* get some fields */ g_object_get(channel, "audio", &audio, NULL); /* test input has recycling */ if(!ags_audio_test_flags(audio, AGS_AUDIO_INPUT_HAS_RECYCLING)){ g_object_unref(audio); return(NULL); } application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* add channel to AgsAudioLoop */ ags_audio_loop_add_channel(AGS_AUDIO_LOOP(audio_loop), (GObject *) channel); ags_audio_loop_set_flags(audio_loop, AGS_AUDIO_LOOP_PLAY_CHANNEL); /* get playback domain */ g_object_get(audio, "playback-domain", &playback_domain, NULL); /* get recycling and playback */ g_object_get(channel, "first-recycling", &first_recycling, "playback", &playback, NULL); /* run stage */ start_recall_id = NULL; if(sound_scope >= 0){ current_recall_id = ags_playback_get_recall_id(playback, sound_scope); if(current_recall_id == NULL){ /* recycling context */ recycling_context = ags_recycling_context_new(1); ags_audio_add_recycling_context(audio, (GObject *) recycling_context); /* set recycling */ ags_recycling_context_replace(recycling_context, first_recycling, 0); /* create audio recall id */ audio_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(audio_recall_id, sound_scope); ags_audio_add_recall_id(audio, (GObject *) audio_recall_id); g_object_set(recycling_context, "recall-id", audio_recall_id, NULL); /* create channel recall id */ channel_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(channel_recall_id, sound_scope); ags_channel_add_recall_id(channel, (GObject *) channel_recall_id); /* prepend recall id */ start_recall_id = g_list_prepend(start_recall_id, channel_recall_id); /* set playback's recall id */ if(AGS_SOUND_SCOPE_PLAYBACK == sound_scope){ // ags_recall_id_set_state_flags(channel_recall_id, AGS_SOUND_STATE_IS_WAITING); } ags_playback_set_recall_id(playback, channel_recall_id, sound_scope); }else{ start_recall_id = g_list_prepend(start_recall_id, current_recall_id); } /* run stage */ ags_channel_recursive_run_stage(channel, sound_scope, staging_flags); /* add to start queue */ audio_thread = NULL; channel_thread = NULL; start_wait_thread = NULL; if(AGS_SOUND_SCOPE_PLAYBACK != sound_scope){ if(ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO)){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); if(audio_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, audio_thread); ags_thread_add_start_queue(audio_loop, audio_thread); } } if(ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ channel_thread = ags_playback_get_channel_thread(playback, sound_scope); if(channel_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, channel_thread); ags_thread_add_start_queue(audio_loop, channel_thread); } } } /* unref */ wait_thread = start_wait_thread; start_wait_timeout = g_get_monotonic_time() + 5 * G_USEC_PER_SEC; while(wait_thread != NULL){ /* wait thread */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(!ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE)){ ags_thread_set_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT); while(ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE) && g_get_monotonic_time() < start_wait_timeout){ g_cond_wait_until(AGS_THREAD_GET_START_COND(wait_thread->data), AGS_THREAD_GET_START_MUTEX(wait_thread->data), start_wait_timeout); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(g_get_monotonic_time() > start_wait_timeout){ g_critical("sync timeout"); goto ags_channel_real_start_ONE_SCOPE_TIMEOUT; } wait_thread = wait_thread->next; } ags_channel_real_start_ONE_SCOPE_TIMEOUT: g_list_free_full(start_wait_thread, g_object_unref); start_wait_thread = NULL; }else{ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ current_recall_id = ags_playback_get_recall_id(playback, i); if(current_recall_id == NULL){ /* recycling context */ recycling_context = ags_recycling_context_new(1); ags_audio_add_recycling_context(audio, (GObject *) recycling_context); /* set recycling */ ags_recycling_context_replace(recycling_context, first_recycling, 0); /* create audio recall id */ audio_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(audio_recall_id, i); ags_audio_add_recall_id(audio, (GObject *) audio_recall_id); g_object_set(recycling_context, "recall-id", audio_recall_id, NULL); /* create channel recall id */ channel_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(channel_recall_id, i); ags_channel_add_recall_id(channel, (GObject *) channel_recall_id); /* prepend recall id */ start_recall_id = g_list_prepend(start_recall_id, channel_recall_id); /* set playback's recall id */ if(AGS_SOUND_SCOPE_PLAYBACK == i){ // ags_recall_id_set_state_flags(channel_recall_id, AGS_SOUND_STATE_IS_WAITING); } ags_playback_set_recall_id(playback, channel_recall_id, i); }else{ start_recall_id = g_list_prepend(start_recall_id, current_recall_id); } /* run stage */ ags_channel_recursive_run_stage(channel, i, staging_flags); /* add to start queue */ audio_thread = NULL; channel_thread = NULL; start_wait_thread = NULL; if(AGS_SOUND_SCOPE_PLAYBACK != i){ if(ags_playback_domain_test_flags(playback_domain, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO)){ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); if(audio_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, audio_thread); ags_thread_add_start_queue(audio_loop, audio_thread); } } if(ags_playback_test_flags(playback, AGS_PLAYBACK_SUPER_THREADED_CHANNEL)){ channel_thread = ags_playback_get_channel_thread(playback, i); if(channel_thread != NULL){ start_wait_thread = g_list_prepend(start_wait_thread, channel_thread); ags_thread_add_start_queue(audio_loop, channel_thread); } } } /* unref */ wait_thread = start_wait_thread; start_wait_timeout = g_get_monotonic_time() + 5 * G_USEC_PER_SEC; while(wait_thread != NULL){ /* wait thread */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(!ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE)){ ags_thread_set_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT); while(ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(wait_thread->data, AGS_THREAD_STATUS_START_DONE) && g_get_monotonic_time() < start_wait_timeout){ g_cond_wait_until(AGS_THREAD_GET_START_COND(wait_thread->data), AGS_THREAD_GET_START_MUTEX(wait_thread->data), start_wait_timeout); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(wait_thread->data)); if(g_get_monotonic_time() > start_wait_timeout){ g_critical("sync timeout"); goto ags_channel_real_start_ALL_SCOPE_TIMEOUT; } wait_thread = wait_thread->next; } ags_channel_real_start_ALL_SCOPE_TIMEOUT: g_list_free_full(start_wait_thread, g_object_unref); start_wait_thread = NULL; } } g_object_unref(audio); g_object_unref(playback_domain); g_object_unref(first_recycling); g_object_unref(playback); start_recall_id = g_list_reverse(start_recall_id); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::start"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* sound scope */ message->parameter_name[0] = "sound-scope"; g_value_init(&(message->value[0]), G_TYPE_INT); g_value_set_int(&(message->value[0]), sound_scope); /* recall id */ message->parameter_name[1] = "recall-id"; g_value_init(&(message->value[1]), G_TYPE_POINTER); g_value_set_pointer(&(message->value[1]), g_list_copy_deep(start_recall_id, (GCopyFunc) g_object_ref, NULL)); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } return(start_recall_id); } /** * ags_channel_start: * @channel: the #AgsChannel * @sound_scope: the sound scope * * Start @channel's @sound_scope to do playback. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containing #AgsRecallID * * Since: 3.0.0 */ GList* ags_channel_start(AgsChannel *channel, gint sound_scope) { GList *recall_id; g_return_val_if_fail(AGS_IS_CHANNEL(channel), NULL); recall_id = NULL; g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[START], 0, sound_scope, &recall_id); g_object_unref((GObject *) channel); return(recall_id); } void ags_channel_real_stop(AgsChannel *channel, GList *recall_id, gint sound_scope) { AgsPlaybackDomain *playback_domain; AgsPlayback *playback; AgsThread *audio_loop; AgsThread *audio_thread; AgsThread *channel_thread; AgsMessageDelivery *message_delivery; AgsApplicationContext *application_context; GList *list; GList *start_message_queue; gint i; static const guint staging_flags = (AGS_SOUND_STAGING_CANCEL | AGS_SOUND_STAGING_REMOVE); if(recall_id == NULL || sound_scope >= AGS_SOUND_SCOPE_LAST){ return; } list = recall_id; while(list != NULL){ ags_recall_id_set_state_flags(list->data, AGS_SOUND_STATE_IS_TERMINATING); list = list->next; } application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* get some fields */ g_object_get(channel, "playback", &playback, NULL); g_object_get(playback, "playback-domain", &playback_domain, NULL); if(sound_scope >= 0){ /* stop thread */ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, sound_scope); channel_thread = ags_playback_get_channel_thread(playback, sound_scope); if(audio_thread != NULL){ ags_thread_stop(audio_thread); g_object_unref(audio_thread); } if(channel_thread != NULL){ ags_thread_stop(channel_thread); g_object_unref(channel_thread); } /* cancel */ ags_channel_recursive_run_stage(channel, sound_scope, staging_flags); /* clean - fini */ ags_channel_recursive_run_stage(channel, sound_scope, AGS_SOUND_STAGING_FINI); ags_playback_set_recall_id(playback, NULL, sound_scope); }else{ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ /* stop thread */ audio_thread = ags_playback_domain_get_audio_thread(playback_domain, i); channel_thread = ags_playback_get_channel_thread(playback, i); if(audio_thread != NULL){ ags_thread_stop(audio_thread); g_object_unref(audio_thread); } if(channel_thread != NULL){ ags_thread_stop(channel_thread); g_object_unref(channel_thread); } } for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ /* cancel */ ags_channel_recursive_run_stage(channel, i, staging_flags); /* clean - fini */ ags_channel_recursive_run_stage(channel, i, AGS_SOUND_STAGING_FINI); ags_playback_set_recall_id(playback, NULL, i); } } /* remove channel from AgsAudioLoop */ ags_audio_loop_remove_channel(audio_loop, (GObject *) channel); /* emit message */ message_delivery = ags_message_delivery_get_instance(); start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, "libags-audio"); if(start_message_queue != NULL){ AgsMessageEnvelope *message; xmlDoc *doc; xmlNode *root_node; /* specify message body */ doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags-command"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "method", "AgsChannel::stop"); /* add message */ message = ags_message_envelope_new((GObject *) channel, NULL, doc); /* set parameter */ message->n_params = 2; message->parameter_name = (gchar **) malloc(3 * sizeof(gchar *)); message->value = g_new0(GValue, 2); /* recall id */ message->parameter_name[0] = "recall-id"; g_value_init(&(message->value[0]), G_TYPE_POINTER); g_value_set_pointer(&(message->value[0]), recall_id); /* sound scope */ message->parameter_name[1] = "sound-scope"; g_value_init(&(message->value[1]), G_TYPE_INT); g_value_set_int(&(message->value[1]), sound_scope); /* terminate string vector */ message->parameter_name[2] = NULL; /* add message */ ags_message_delivery_add_message_envelope(message_delivery, "libags-audio", message); g_list_free_full(start_message_queue, (GDestroyNotify) g_object_unref); } } /** * ags_channel_stop: * @channel: the #AgsChannel * @recall_id: (element-type AgsAudio.RecallID) (transfer none): the #GList-struct containing #AgsRecallID * @sound_scope: the sound scope * * Stop @channel's @sound_scope playback specified by @recall_id. * * Since: 3.0.0 */ void ags_channel_stop(AgsChannel *channel, GList *recall_id, gint sound_scope) { g_return_if_fail(AGS_IS_CHANNEL(channel)); g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[STOP], 0, recall_id, sound_scope); g_object_unref((GObject *) channel); } GList* ags_channel_real_check_scope(AgsChannel *channel, gint sound_scope) { GList *list_start, *list; GList *recall_id; gint i; /* get recall id */ g_object_get(channel, "recall-id", &list_start, NULL); /* iterate recall id */ list = list_start; recall_id = NULL; if(sound_scope >= 0){ while(list != NULL){ /* check sound scope */ if(ags_recall_id_check_sound_scope(list->data, sound_scope)){ recall_id = g_list_prepend(recall_id, list->data); } /* iterate */ list = list->next; } }else{ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ list = list_start; while(list != NULL){ /* check sound scope */ if(ags_recall_id_check_sound_scope(list->data, i)){ recall_id = g_list_prepend(recall_id, list->data); } /* iterate */ list = list->next; } } } /* reverse recall id */ recall_id = g_list_reverse(recall_id); g_list_foreach(recall_id, (GFunc) g_object_ref, NULL); /* unref */ g_list_free_full(list_start, g_object_unref); return(recall_id); } /** * ags_channel_check_scope: * @channel: the #AgsChannel * @sound_scope: the sound scope * * Check @channel's @sound_scope. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the #GList-struct containing #AgsRecallID or %NULL if not playing * * Since: 3.0.0 */ GList* ags_channel_check_scope(AgsChannel *channel, gint sound_scope) { GList *recall_id; g_return_val_if_fail(AGS_IS_CHANNEL(channel), NULL); recall_id = NULL; g_object_ref((GObject *) channel); g_signal_emit(G_OBJECT(channel), channel_signals[CHECK_SCOPE], 0, sound_scope, &recall_id); g_object_unref((GObject *) channel); return(recall_id); } /** * ags_channel_collect_all_channel_ports: * @channel: the #AgsChannel * * Retrieve all ports of #AgsChannel. * * Returns: (element-type AgsAudio.Port) (transfer full): a new #GList containing #AgsPort * * Since: 3.0.0 */ GList* ags_channel_collect_all_channel_ports(AgsChannel *channel) { GList *recall_start, *recall; GList *list; GRecMutex *recall_mutex, *play_mutex; GRecMutex *mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } list = NULL; /* get play mutex */ play_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* collect port of playing recall */ g_rec_mutex_lock(play_mutex); recall = recall_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(play_mutex); while(recall != NULL){ AgsRecall *current; current = AGS_RECALL(recall->data); /* get mutex */ mutex = AGS_RECALL_GET_OBJ_MUTEX(current); /* concat port */ g_rec_mutex_lock(mutex); if(current->port != NULL){ if(list == NULL){ list = g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL); }else{ if(current->port != NULL){ list = g_list_concat(list, g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL)); } } } g_rec_mutex_unlock(mutex); /* iterate */ recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* the same for true recall */ g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); while(recall != NULL){ AgsRecall *current; current = AGS_RECALL(recall->data); /* get mutex */ mutex = AGS_RECALL_GET_OBJ_MUTEX(current); /* concat port */ g_rec_mutex_lock(mutex); if(current->port != NULL){ if(list == NULL){ list = g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL); }else{ if(current->port != NULL){ list = g_list_concat(list, g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL)); } } } g_rec_mutex_unlock(mutex); /* iterate */ recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* */ list = g_list_reverse(list); return(list); } /** * ags_channel_collect_all_channel_ports_by_specifier_and_context: * @channel: an #AgsChannel * @specifier: the port's name * @play_context: either %TRUE for play or %FALSE for recall * * Retrieve specified port of #AgsChannel * * Returns: (element-type AgsAudio.Port) (transfer full): a #GList-struct of #AgsPort if found, otherwise %NULL * * Since: 3.0.0 */ GList* ags_channel_collect_all_channel_ports_by_specifier_and_context(AgsChannel *channel, gchar *specifier, gboolean play_context) { GList *recall_start, *recall; GList *port_start, *port; GList *list; GRecMutex *recall_mutex; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } if(play_context){ /* get play mutex */ recall_mutex = AGS_CHANNEL_GET_PLAY_MUTEX(channel); /* get recall */ g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy_deep(channel->play, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); }else{ /* get recall mutex */ recall_mutex = AGS_CHANNEL_GET_RECALL_MUTEX(channel); /* get recall */ g_rec_mutex_lock(recall_mutex); recall = recall_start = g_list_copy_deep(channel->recall, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recall_mutex); } /* collect port of playing recall */ list = NULL; while(recall != NULL){ AgsRecall *current; GRecMutex *mutex; current = AGS_RECALL(recall->data); /* get mutex */ mutex = AGS_RECALL_GET_OBJ_MUTEX(current); /* get port */ g_rec_mutex_lock(mutex); port = port_start = g_list_copy_deep(current->port, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(mutex); /* check specifier */ while((port = ags_port_find_specifier(port, specifier)) != NULL){ AgsPort *current; current = AGS_PORT(port->data); g_object_ref(current); list = g_list_prepend(list, current); /* iterate - port */ port = port->next; } g_list_free_full(port_start, g_object_unref); /* iterate - recall */ recall = recall->next; } g_list_free_full(recall_start, g_object_unref); /* reverse result */ list = g_list_reverse(list); return(list); } /** * ags_channel_get_level: * @channel: the #AgsChannel * * Get level. * * Returns: (transfer full): the level of @channel as #AgsChannel or %NULL if no parent recycling. * * Since: 3.0.0 */ AgsChannel* ags_channel_get_level(AgsChannel *channel) { AgsAudio *audio; AgsChannel *start_output, *nth_output; AgsChannel *level, *next_level; guint audio_channel; guint input_line; /* check above recycling */ level = channel; if(level != NULL){ g_object_ref(level); } audio = NULL; if(AGS_IS_OUTPUT(channel)){ goto ags_channel_get_level_ITERATE; } while(level != NULL){ /* get some fields */ g_object_get(level, "audio", &audio, "audio-channel", &audio_channel, "line", &input_line, NULL); if(ags_audio_test_flags(audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ if(audio != NULL){ g_object_unref(audio); } break; } /* get some fields */ g_object_get(audio, "output", &start_output, NULL); if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ nth_output = ags_channel_nth(start_output, audio_channel); if(level != NULL){ g_object_unref(level); } level = nth_output; }else{ nth_output = ags_channel_nth(start_output, input_line); if(level != NULL){ g_object_unref(level); } level = nth_output; } if(audio != NULL){ g_object_unref(audio); } if(level == NULL){ break; } ags_channel_get_level_ITERATE: /* iterate */ next_level = ags_channel_get_link(level); g_object_unref(level); level = next_level; } return(level); } void ags_channel_recursive_set_property_setv(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value) { #if HAVE_GLIB_2_54 g_object_setv((GObject *) channel, n_params, parameter_name, value); #else guint i; for(i = 0; i < n_params; i++){ g_object_set_property((GObject *) channel, parameter_name[i], &(value[i])); } #endif } void ags_channel_recursive_set_property_down(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value){ if(channel == NULL){ return; } ags_channel_recursive_set_property_setv(channel, n_params, parameter_name, value); ags_channel_recursive_set_property_down_input(channel, n_params, parameter_name, value); } void ags_channel_recursive_set_property_down_input(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *input, *next_pad, *nth_input; AgsChannel *link; guint audio_channel, line; if(channel == NULL){ return; } /* get some fields */ g_object_get(channel, "audio", &audio, "audio-channel", &audio_channel, "line", &line, NULL); if(audio == NULL){ return; } /* get some fields */ g_object_get(audio, "input", &start_input, NULL); /* sync/async */ if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); input = nth_input; next_pad = NULL; while(input != NULL){ /* get some fields */ link = ags_channel_get_link(input); /* set property */ ags_channel_recursive_set_property_setv(input, n_params, parameter_name, value); ags_channel_recursive_set_property_down(link, n_params, parameter_name, value); /* unref */ if(link != NULL){ g_object_unref(link); } /* iterate */ next_pad = ags_channel_next_pad(input); g_object_unref(input); input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ nth_input = ags_channel_nth(start_input, line); input = nth_input; /* get some fields */ link = ags_channel_get_link(input); /* set property */ ags_channel_recursive_set_property_setv(input, n_params, parameter_name, value); ags_channel_recursive_set_property_down(link, n_params, parameter_name, value); /* unref */ if(link != NULL){ g_object_unref(link); } if(input != NULL){ g_object_unref(input); } } } /** * ags_channel_recursive_set_property: * @channel: the #AgsChannel * @n_params: the count of paramter name and value pairs * @parameter_name: a string vector containing parameter names * @value: the value array * * Recursive set property for #AgsChannel. * * Since: 3.0.0 */ void ags_channel_recursive_set_property(AgsChannel *channel, gint n_params, gchar **parameter_name, GValue *value) { AgsChannel *link; if(!AGS_IS_CHANNEL(channel)){ return; } /* get some fields */ link = ags_channel_get_link(channel); if(AGS_IS_INPUT(channel)){ ags_channel_recursive_set_property_setv(channel, n_params, parameter_name, value); ags_channel_recursive_set_property_down(link, n_params, parameter_name, value); }else{ ags_channel_recursive_set_property_down(channel, n_params, parameter_name, value); } if(link != NULL){ g_object_unref(link); } } void ags_channel_recursive_setup_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *current_channel, *nth_channel; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint pad, audio_channel; guint line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } current_channel = channel; if(current_channel != NULL){ g_object_ref(current_channel); } current_link = NULL; if(AGS_IS_OUTPUT(channel)){ g_object_get(channel, "audio", ¤t_audio, NULL); goto ags_channel_recursive_prepare_run_stage_up_OUTPUT; } while(current_channel != NULL){ /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_channel_add_recall_id(current_channel, current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(current_channel, "audio", ¤t_audio, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_audio_add_recall_id(current_audio, (GObject *) current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_channel, "audio-channel", &audio_channel, "line", &line, NULL); /* move up */ if(current_channel != NULL){ g_object_unref(current_channel); } g_object_get(current_audio, "output", ¤t_channel, NULL); if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ /* unref current audio */ g_object_unref(current_audio); if(current_channel != NULL){ g_object_unref(current_channel); } break; } if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_channel = ags_channel_nth(current_channel, audio_channel); g_object_unref(current_channel); current_channel = nth_channel; }else{ nth_channel = ags_channel_nth(current_channel, line); g_object_unref(current_channel); current_channel = nth_channel; } ags_channel_recursive_prepare_run_stage_up_OUTPUT: /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_channel_add_recall_id(current_channel, current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* unref current audio */ g_object_unref(current_audio); /* iterate */ current_link = ags_channel_get_link(current_channel); g_object_unref(current_channel); current_channel = current_link; } if(current_link != NULL){ g_object_unref(current_link); } } void ags_channel_recursive_setup_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *next_channel, *nth_input; AgsRecallID *current_recall_id, *next_recall_id; AgsRecyclingContext *next_recycling_context; GList *start_recall_id, *recall_id; guint audio_channel, line; gboolean play_context; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* setup */ next_recycling_context = recycling_context; /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_channel_add_recall_id(channel, current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(channel, "audio", ¤t_audio, "audio-channel", &audio_channel, "line", &line, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_audio_add_recall_id(current_audio, (GObject *) current_recall_id); } g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* check next recycling context */ current_input = NULL; if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ AgsRecycling *first_recycling; AgsRecycling *recycling; gint position; next_recycling_context = NULL; if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ AgsChannel *first_with_recycling; nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; first_with_recycling = ags_channel_first_with_recycling(current_input); g_object_get(first_with_recycling, "first-recycling", &first_recycling, NULL); g_object_unref(first_with_recycling); if(current_input != NULL){ g_object_unref(current_input); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; g_object_get(current_input, "first-recycling", &first_recycling, NULL); if(current_input != NULL){ g_object_unref(current_input); } } if(first_recycling != NULL){ position = ags_recycling_context_find_child(recycling_context, first_recycling); if(position >= 0){ GList *child_start; g_object_get(recycling_context, "child", &child_start, NULL); next_recycling_context = g_list_nth_data(child_start, position); g_list_free_full(child_start, g_object_unref); } g_object_unref(first_recycling); } } if(next_recycling_context == NULL){ AgsRecycling *first_recycling, *last_recycling; AgsRecycling *end_region; AgsRecycling *recycling, *next_recycling; guint64 length; guint64 i; current_input = NULL; length = 0; if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; if(current_input != NULL){ g_object_ref(current_input); } next_pad = NULL; while(current_input != NULL){ gint position; g_object_get(current_input, "first-recycling", &first_recycling, NULL); g_object_get(current_input, "last-recycling", &last_recycling, NULL); end_region = ags_recycling_next(last_recycling); position = ags_recycling_position(first_recycling, end_region, last_recycling); length += (position + 1); /* unref */ if(first_recycling != NULL){ g_object_unref(first_recycling); g_object_unref(last_recycling); } if(end_region != NULL){ g_object_unref(end_region); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; if(current_input != NULL){ g_object_ref(current_input); } next_pad = NULL; g_object_get(current_input, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); if(first_recycling != NULL){ end_region = ags_recycling_next(last_recycling); length = ags_recycling_position(first_recycling, end_region, last_recycling); length++; g_object_unref(first_recycling); g_object_unref(last_recycling); if(end_region != NULL){ g_object_unref(end_region); } }else{ length = 0; } if(current_input != NULL){ g_object_unref(current_input); } } /* instantiate next recycling context */ if(length > 0){ next_recycling_context = ags_recycling_context_new(length); g_object_set(recycling_context, "child", next_recycling_context, NULL); ags_audio_add_recycling_context(current_audio, (GObject *) next_recycling_context); current_input = nth_input; for(i = 0; i < length;){ g_object_get(current_input, "first-recycling", &first_recycling, NULL); recycling = first_recycling; g_object_ref(recycling); next_recycling = NULL; for(; i < length && recycling != NULL; i++){ /* set recycling */ ags_recycling_context_replace(next_recycling_context, recycling, i); /* iterate */ i++; next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } /* unref */ if(first_recycling != NULL){ g_object_unref(first_recycling); } if(next_recycling != NULL){ g_object_unref(next_recycling); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } } } if(next_recycling_context != NULL && next_recycling_context != recycling_context){ /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, next_recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", next_recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_audio_add_recall_id(current_audio, (GObject *) current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); } ags_channel_recursive_setup_run_stage_down_input(channel, next_recycling_context, sound_scope, local_staging_flags); /* unref */ if(current_audio != NULL){ g_object_unref(current_audio); } if(start_input != NULL){ g_object_unref(start_input); } } void ags_channel_recursive_setup_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *nth_input; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint audio_channel, line; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get some fields */ g_object_get(channel, "audio", ¤t_audio, "line", &line, "audio-channel", &audio_channel, NULL); if(current_audio == NULL){ return; } /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* sync/async */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; next_pad = NULL; while(current_input != NULL){ /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_channel_add_recall_id(current_input, current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_setup_run_stage_down(current_link, recycling_context, sound_scope, local_staging_flags); if(current_link != NULL){ g_object_unref(current_link); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); if(current_recall_id == NULL){ current_recall_id = g_object_new(AGS_TYPE_RECALL_ID, "recycling-context", recycling_context, NULL); ags_recall_id_set_sound_scope(current_recall_id, sound_scope); ags_channel_add_recall_id(current_input, current_recall_id); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_setup_run_stage_down(current_link, recycling_context, sound_scope, local_staging_flags); if(current_link != NULL){ g_object_unref(current_link); } if(current_input != NULL){ g_object_unref(current_input); } } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } } void ags_channel_recursive_prepare_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *current_channel, *nth_channel; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint pad, audio_channel; guint line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } current_channel = channel; if(current_channel != NULL){ g_object_ref(current_channel); } current_link = NULL; if(AGS_IS_OUTPUT(channel)){ g_object_get(channel, "audio", ¤t_audio, NULL); goto ags_channel_recursive_prepare_run_stage_up_OUTPUT; } while(current_channel != NULL){ /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_duplicate_recall(current_channel, current_recall_id); } } /* resolve */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_resolve_recall(current_channel, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(current_channel, "audio", ¤t_audio, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate */ g_object_get(current_channel, "pad", &pad, "audio-channel", &audio_channel, "line", &line, NULL); if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_duplicate_recall(current_audio, current_recall_id, pad, audio_channel, line); } } /* resolve */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_resolve_recall(current_audio, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_channel, "audio-channel", &audio_channel, "line", &line, NULL); /* move up */ if(current_channel != NULL){ g_object_unref(current_channel); } g_object_get(current_audio, "output", ¤t_channel, NULL); if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ /* unref current audio */ g_object_unref(current_audio); if(current_channel != NULL){ g_object_unref(current_channel); } break; } if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_channel = ags_channel_nth(current_channel, audio_channel); g_object_unref(current_channel); current_channel = nth_channel; }else{ nth_channel = ags_channel_nth(current_channel, line); g_object_unref(current_channel); current_channel = nth_channel; } ags_channel_recursive_prepare_run_stage_up_OUTPUT: /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_duplicate_recall(current_channel, current_recall_id); } } /* resolve */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_resolve_recall(current_channel, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* unref current audio */ g_object_unref(current_audio); /* iterate */ current_link = ags_channel_get_link(current_channel); g_object_unref(current_channel); current_channel = current_link; } if(current_link != NULL){ g_object_unref(current_link); } } void ags_channel_recursive_prepare_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *next_channel, *nth_input; AgsRecallID *current_recall_id, *next_recall_id; AgsRecyclingContext *next_recycling_context; GList *start_recall_id, *recall_id; guint pad, audio_channel; guint line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* prepare */ next_recycling_context = recycling_context; /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_duplicate_recall(channel, current_recall_id); } } /* resolve */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_resolve_recall(channel, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(channel, "audio", ¤t_audio, "audio-channel", &audio_channel, "line", &line, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate - audio */ g_object_get(channel, "pad", &pad, "audio-channel", &audio_channel, "line", &line, NULL); if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_duplicate_recall(current_audio, current_recall_id, pad, audio_channel, line); } } /* resolve - audio */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_resolve_recall(current_audio, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* check next recycling context */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ AgsRecycling *first_recycling; gint position; next_recycling_context = NULL; if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ AgsChannel *first_with_recycling; nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; first_with_recycling = ags_channel_first_with_recycling(current_input); g_object_get(first_with_recycling, "first-recycling", &first_recycling, NULL); g_object_unref(first_with_recycling); if(current_input != NULL){ g_object_unref(current_input); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; g_object_get(current_input, "first-recycling", &first_recycling, NULL); if(current_input != NULL){ g_object_unref(current_input); } } if(first_recycling != NULL){ position = ags_recycling_context_find_child(recycling_context, first_recycling); if(position >= 0){ GList *child_start; g_object_get(recycling_context, "child", &child_start, NULL); next_recycling_context = g_list_nth_data(child_start, position); g_list_free_full(child_start, g_object_unref); } g_object_unref(first_recycling); } } if(next_recycling_context != NULL && next_recycling_context != recycling_context){ /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, next_recycling_context); /* duplicate - audio */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_duplicate_recall(current_audio, current_recall_id, pad, audio_channel, line); } } /* resolve - audio */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_resolve_recall(current_audio, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } /* traverse the tree */ ags_channel_recursive_prepare_run_stage_down_input(channel, next_recycling_context, sound_scope, local_staging_flags); /* unref */ if(current_audio != NULL){ g_object_unref(current_audio); } } void ags_channel_recursive_prepare_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *nth_input; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint audio_channel, line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get some fields */ g_object_get(channel, "audio", ¤t_audio, "line", &line, "audio-channel", &audio_channel, NULL); if(current_audio == NULL){ return; } /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* sync/async */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; next_pad = NULL; while(current_input != NULL){ /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_duplicate_recall(current_input, current_recall_id); } } /* resolve */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id){ ags_channel_resolve_recall(current_input, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_prepare_run_stage_down(current_link, recycling_context, sound_scope, local_staging_flags); if(current_link != NULL){ g_object_unref(current_link); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* duplicate */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_duplicate_recall(current_input, current_recall_id); } } /* resolve */ if((AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_resolve_recall(current_input, current_recall_id); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_prepare_run_stage_down(current_link, recycling_context, sound_scope, local_staging_flags); if(current_link != NULL){ g_object_unref(current_link); } if(current_input != NULL){ g_object_unref(current_input); } } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } } void ags_channel_recursive_do_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint staging_flags) { AgsAudio *current_audio; AgsChannel *current_channel, *nth_channel; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint audio_channel; guint line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } current_channel = channel; if(current_channel != NULL){ g_object_ref(current_channel); } current_link = NULL; if(AGS_IS_OUTPUT(channel)){ g_object_get(channel, "audio", ¤t_audio, NULL); goto ags_channel_recursive_do_run_stage_up_OUTPUT; } while(current_channel != NULL){ /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_init_recall(current_channel, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_channel_play_recall(current_channel, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(current_channel, "audio", ¤t_audio, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_init_recall(current_audio, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_audio_play_recall(current_audio, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_channel, "audio-channel", &audio_channel, "line", &line, NULL); /* move up */ if(current_channel != NULL){ g_object_unref(current_channel); } g_object_get(current_audio, "output", ¤t_channel, NULL); if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ /* unref current audio */ g_object_unref(current_audio); if(current_channel != NULL){ g_object_unref(current_channel); } break; } if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_channel = ags_channel_nth(current_channel, audio_channel); g_object_unref(current_channel); current_channel = nth_channel; }else{ nth_channel = ags_channel_nth(current_channel, line); g_object_unref(current_channel); current_channel = nth_channel; } ags_channel_recursive_do_run_stage_up_OUTPUT: /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_init_recall(current_channel, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_channel_play_recall(current_channel, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* unref current audio */ g_object_unref(current_audio); /* iterate */ current_link = ags_channel_get_link(current_channel); g_object_unref(current_channel); current_channel = current_link; } if(current_link != NULL){ g_object_unref(current_link); } } void ags_channel_recursive_do_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *next_channel, *nth_input; AgsRecallID *current_recall_id, *next_recall_id; AgsRecyclingContext *next_recycling_context; GList *start_recall_id, *recall_id; guint audio_channel, line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* do */ next_recycling_context = recycling_context; /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_init_recall(channel, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_channel_play_recall(channel, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(channel, "audio", ¤t_audio, "audio-channel", &audio_channel, "line", &line, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_init_recall(current_audio, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_audio_play_recall(current_audio, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* check next recycling context */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ AgsRecycling *first_recycling; gint position; next_recycling_context = NULL; if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ AgsChannel *first_with_recycling; nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; first_with_recycling = ags_channel_first_with_recycling(current_input); g_object_get(first_with_recycling, "first-recycling", &first_recycling, NULL); g_object_unref(first_with_recycling); if(current_input != NULL){ g_object_unref(current_input); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; g_object_get(current_input, "first-recycling", &first_recycling, NULL); if(current_input != NULL){ g_object_unref(current_input); } } if(first_recycling != NULL){ position = ags_recycling_context_find_child(recycling_context, first_recycling); if(position >= 0){ GList *child_start; g_object_get(recycling_context, "child", &child_start, NULL); next_recycling_context = g_list_nth_data(child_start, position); g_list_free_full(child_start, g_object_unref); } g_object_unref(first_recycling); } } if(next_recycling_context != NULL && next_recycling_context != recycling_context){ /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, next_recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_init_recall(current_audio, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_audio_play_recall(current_audio, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } /* traverse the tree */ ags_channel_recursive_do_run_stage_down_input(channel, next_recycling_context, sound_scope, staging_flags); /* unref */ if(current_audio != NULL){ g_object_unref(current_audio); } } void ags_channel_recursive_do_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *nth_input; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint audio_channel, line; if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get some fields */ g_object_get(channel, "audio", ¤t_audio, "line", &line, "audio-channel", &audio_channel, NULL); if(current_audio == NULL){ return; } /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* sync/async */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; next_pad = NULL; while(current_input != NULL){ /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_init_recall(current_input, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_channel_play_recall(current_input, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_do_run_stage_down(current_link, recycling_context, sound_scope, staging_flags); if(current_link != NULL){ g_object_unref(current_link); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* init recall */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_init_recall(current_input, current_recall_id, staging_flags); } } /* play recall */ if(current_recall_id != NULL){ ags_channel_play_recall(current_input, current_recall_id, staging_flags); } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_do_run_stage_down(current_link, recycling_context, sound_scope, staging_flags); if(current_link != NULL){ g_object_unref(current_link); } if(current_input != NULL){ g_object_unref(current_input); } } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } } void ags_channel_recursive_cleanup_run_stage_up(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *current_channel, *nth_channel; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint audio_channel; guint line; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } current_channel = channel; if(current_channel != NULL){ g_object_ref(current_channel); } current_link = NULL; if(AGS_IS_OUTPUT(channel)){ g_object_get(channel, "audio", ¤t_audio, NULL); goto ags_channel_recursive_cleanup_run_stage_up_OUTPUT; } while(current_channel != NULL){ /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cancel_recall(current_channel, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cleanup_recall(current_channel, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_remove_recall_id(current_channel, current_recall_id); ags_channel_unset_staging_flags(current_channel, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(current_channel, "audio", ¤t_audio, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_cancel_recall(current_audio, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id){ ags_audio_cleanup_recall(current_audio, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_remove_recall_id(current_audio, (GObject *) current_recall_id); ags_audio_unset_staging_flags(current_audio, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_channel, "audio-channel", &audio_channel, "line", &line, NULL); /* move up */ if(current_channel != NULL){ g_object_unref(current_channel); } g_object_get(current_audio, "output", ¤t_channel, NULL); if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ ags_audio_remove_recycling_context(current_audio, (GObject *) recycling_context); } /* unref current audio */ g_object_unref(current_audio); break; } if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_channel = ags_channel_nth(current_channel, audio_channel); g_object_unref(current_channel); current_channel = nth_channel; }else{ nth_channel = ags_channel_nth(current_channel, line); g_object_unref(current_channel); current_channel = nth_channel; } ags_channel_recursive_cleanup_run_stage_up_OUTPUT: /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(current_channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cancel_recall(current_channel, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cleanup_recall(current_channel, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id){ ags_channel_remove_recall_id(current_channel, current_recall_id); ags_channel_unset_staging_flags(current_channel, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ ags_audio_remove_recycling_context(current_audio, (GObject *) recycling_context); } /* unref current audio */ g_object_unref(current_audio); /* iterate */ current_link = ags_channel_get_link(current_channel); g_object_unref(current_channel); current_channel = current_link; } if(current_link != NULL){ g_object_unref(current_link); } } void ags_channel_recursive_cleanup_run_stage_down(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *next_channel, *nth_input; AgsRecallID *current_recall_id, *next_recall_id; AgsRecyclingContext *next_recycling_context; GList *start_recall_id, *recall_id; guint audio_channel, line; gboolean play_context; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* cleanup */ next_recycling_context = recycling_context; /* check scope - output */ recall_id = start_recall_id = ags_channel_check_scope(channel, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cancel_recall(channel, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cleanup_recall(channel, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_remove_recall_id(channel, current_recall_id); ags_channel_unset_staging_flags(channel, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get current audio */ g_object_get(channel, "audio", ¤t_audio, "audio-channel", &audio_channel, "line", &line, NULL); /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_cancel_recall(current_audio, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id){ ags_audio_cleanup_recall(current_audio, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_remove_recall_id(current_audio, (GObject *) current_recall_id); ags_audio_unset_staging_flags(current_audio, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* check next recycling context */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING)){ AgsRecycling *first_recycling; gint position; next_recycling_context = NULL; first_recycling = NULL; if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ AgsChannel *first_with_recycling; nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; first_with_recycling = ags_channel_first_with_recycling(current_input); g_object_get(first_with_recycling, "first-recycling", &first_recycling, NULL); g_object_unref(first_with_recycling); if(current_input != NULL){ g_object_unref(current_input); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; g_object_get(current_input, "first-recycling", &first_recycling, NULL); if(current_input != NULL){ g_object_unref(current_input); } } if(first_recycling != NULL){ position = ags_recycling_context_find_child(recycling_context, first_recycling); if(position >= 0){ GList *child_start; g_object_get(recycling_context, "child", &child_start, NULL); next_recycling_context = g_list_nth_data(child_start, position); g_list_free_full(child_start, g_object_unref); } g_object_unref(first_recycling); } } if(next_recycling_context != NULL && next_recycling_context != recycling_context){ /* check scope - audio */ recall_id = start_recall_id = ags_audio_check_scope(current_audio, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, next_recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_cancel_recall(current_audio, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_cleanup_recall(current_audio, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_audio_remove_recall_id(current_audio, (GObject *) current_recall_id); ags_audio_unset_staging_flags(current_audio, sound_scope, staging_mask); } } g_list_free_full(start_recall_id, g_object_unref); } /* free recall id */ ags_channel_recursive_cleanup_run_stage_down_input(channel, next_recycling_context, sound_scope, local_staging_flags); /* unref */ if(start_input != NULL){ g_object_unref(start_input); } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ ags_audio_remove_recycling_context(current_audio, (GObject *) recycling_context); ags_audio_remove_recycling_context(current_audio, (GObject *) next_recycling_context); } /* unref */ if(current_audio != NULL){ g_object_unref(current_audio); } } void ags_channel_recursive_cleanup_run_stage_down_input(AgsChannel *channel, AgsRecyclingContext *recycling_context, gint sound_scope, guint local_staging_flags) { AgsAudio *current_audio; AgsChannel *start_input; AgsChannel *current_input, *next_pad, *nth_input; AgsChannel *current_link; AgsRecallID *current_recall_id; GList *start_recall_id, *recall_id; guint audio_channel, line; static const guint staging_mask = (AGS_SOUND_STAGING_CHECK_RT_DATA | AGS_SOUND_STAGING_RUN_INIT_PRE | AGS_SOUND_STAGING_RUN_INIT_INTER | AGS_SOUND_STAGING_RUN_INIT_POST); if(!AGS_IS_CHANNEL(channel) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get some fields */ g_object_get(channel, "audio", ¤t_audio, "line", &line, "audio-channel", &audio_channel, NULL); if(current_audio == NULL){ return; } /* get some fields */ g_object_get(current_audio, "input", &start_input, NULL); /* sync/async */ if(ags_audio_test_flags(current_audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); current_input = nth_input; next_pad = NULL; while(current_input != NULL){ /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ recall_id = start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cancel_recall(current_input, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cleanup_recall(current_input, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_remove_recall_id(current_input, current_recall_id); ags_channel_unset_staging_flags(current_input, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_cleanup_run_stage_down(current_link, recycling_context, sound_scope, local_staging_flags); if(current_link != NULL){ g_object_unref(current_link); } /* iterate */ next_pad = ags_channel_next_pad(current_input); g_object_unref(current_input); current_input = next_pad; } if(next_pad != NULL){ g_object_unref(next_pad); } }else{ nth_input = ags_channel_nth(start_input, line); current_input = nth_input; /* get some fields */ current_link = ags_channel_get_link(current_input); /* check scope - input */ start_recall_id = ags_channel_check_scope(current_input, sound_scope); current_recall_id = ags_recall_id_find_recycling_context(start_recall_id, recycling_context); /* cancel */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cancel_recall(current_input, current_recall_id); } } /* remove */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_cleanup_recall(current_input, current_recall_id); } } /* fini - clean */ if((AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE & (local_staging_flags)) != 0){ if(current_recall_id != NULL){ ags_channel_remove_recall_id(current_input, current_recall_id); ags_channel_unset_staging_flags(current_input, sound_scope, staging_mask); } } /* free recall id */ g_list_free_full(start_recall_id, g_object_unref); /* traverse the tree */ ags_channel_recursive_cleanup_run_stage_down(current_link, recycling_context, sound_scope, local_staging_flags); if(current_link != NULL){ g_object_unref(current_link); } if(current_input != NULL){ g_object_unref(current_input); } } if(start_input != NULL){ g_object_unref(start_input); } } void ags_channel_real_recursive_run_stage(AgsChannel *channel, gint sound_scope, guint staging_flags) { AgsChannel *link; AgsRecyclingContext *recycling_context; GList *recall_id, *recall_id_iter; gint i; GRecMutex *channel_mutex; GRecMutex *recall_id_mutex; if(sound_scope < 0 || sound_scope >= AGS_SOUND_SCOPE_LAST){ return; } /* check scope - input */ recall_id = ags_channel_check_scope(channel, sound_scope); recycling_context = NULL; if(recall_id != NULL){ AgsRecycling *recycling; GList *iter; g_object_get(channel, "first-recycling", &recycling, NULL); iter = recall_id; while(iter != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; current_recall_id = iter->data; /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(current_recall_id); /* get recycling context */ g_rec_mutex_lock(recall_id_mutex); current_recycling_context = current_recall_id->recycling_context; g_rec_mutex_unlock(recall_id_mutex); if(ags_recycling_context_find(current_recycling_context, recycling) >= 0){ recycling_context = current_recycling_context; break; } /* iterate */ iter = iter->next; } g_object_unref(recycling); g_list_free_full(recall_id, g_object_unref); } /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(channel); /* get link */ g_rec_mutex_lock(channel_mutex); link = channel->link; g_rec_mutex_unlock(channel_mutex); if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 || (AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0){ if(AGS_IS_OUTPUT(channel)){ /* add recall id */ ags_channel_recursive_setup_run_stage_down(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_ADD_RECALL_ID); ags_channel_recursive_setup_run_stage_up(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_ADD_RECALL_ID); /* duplicate */ ags_channel_recursive_prepare_run_stage_down(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE); ags_channel_recursive_prepare_run_stage_up(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE); /* resolve */ ags_channel_recursive_prepare_run_stage_down(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE); ags_channel_recursive_prepare_run_stage_up(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE); }else{ /* add recall id */ ags_channel_recursive_prepare_run_stage_down(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_ADD_RECALL_ID); ags_channel_recursive_prepare_run_stage_up(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_ADD_RECALL_ID); /* duplicate */ ags_channel_recursive_prepare_run_stage_down(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE); ags_channel_recursive_prepare_run_stage_up(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_DUPLICATE); /* resolve */ ags_channel_recursive_prepare_run_stage_down(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE); ags_channel_recursive_prepare_run_stage_up(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_PREPARE_STAGING_RESOLVE); } } if(AGS_IS_OUTPUT(channel)){ /* do run stage - init/play recall */ ags_channel_recursive_do_run_stage_down(channel, recycling_context, sound_scope, staging_flags); ags_channel_recursive_do_run_stage_up(link, recycling_context, sound_scope, staging_flags); }else{ /* do run stage - init/play recall */ ags_channel_recursive_do_run_stage_down(link, recycling_context, sound_scope, staging_flags); ags_channel_recursive_do_run_stage_up(channel, recycling_context, sound_scope, staging_flags); } if((AGS_SOUND_STAGING_CANCEL & (staging_flags)) != 0){ if(AGS_IS_OUTPUT(channel)){ /* cancel */ ags_channel_recursive_cleanup_run_stage_down(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL); ags_channel_recursive_cleanup_run_stage_up(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL); }else{ /* cancel */ ags_channel_recursive_cleanup_run_stage_down(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL); ags_channel_recursive_cleanup_run_stage_up(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_CANCEL_RECALL); } } if((AGS_SOUND_STAGING_REMOVE & (staging_flags)) != 0){ if(AGS_IS_OUTPUT(channel)){ /* remove */ ags_channel_recursive_cleanup_run_stage_down(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL); ags_channel_recursive_cleanup_run_stage_up(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL); }else{ /* remove */ ags_channel_recursive_cleanup_run_stage_down(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL); ags_channel_recursive_cleanup_run_stage_up(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_STAGING_REMOVE_RECALL); } } if((AGS_SOUND_STAGING_FINI & (staging_flags)) != 0){ if(AGS_IS_OUTPUT(channel)){ ags_channel_recursive_cleanup_run_stage_down(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE); ags_channel_recursive_cleanup_run_stage_up(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE); }else{ ags_channel_recursive_cleanup_run_stage_down(link, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE); ags_channel_recursive_cleanup_run_stage_up(channel, recycling_context, sound_scope, AGS_CHANNEL_RECURSIVE_CLEANUP_SCOPE); } } } /** * ags_channel_recursive_run_stage: * @channel: the #AgsChannel * @sound_scope: the sound scope * @staging_flags: the staging flags * * Recursive run stage specified by @staging_flags for matching @sound_scope. * * Since: 3.0.0 */ void ags_channel_recursive_run_stage(AgsChannel *channel, gint sound_scope, guint staging_flags) { g_return_if_fail(AGS_IS_CHANNEL(channel)); g_object_ref(G_OBJECT(channel)); g_signal_emit(G_OBJECT(channel), channel_signals[RECURSIVE_RUN_STAGE], 0, sound_scope, staging_flags); g_object_unref(G_OBJECT(channel)); } /** * ags_channel_new: * @audio: the #AgsAudio * * Creates a new instance of #AgsChannel, linking tree to @audio. * * Returns: a new #AgsChannel * * Since: 3.0.0 */ AgsChannel* ags_channel_new(GObject *audio) { AgsChannel *channel; channel = (AgsChannel *) g_object_new(AGS_TYPE_CHANNEL, "audio", audio, NULL); return(channel); } gsequencer-3.1.3/ags/audio/ags_lfo_synth_util.h0000644000175000017500000002367313607210263016533 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LFO_SYNTH_UTIL_H__ #define __AGS_LFO_SYNTH_UTIL_H__ #include #include #include G_BEGIN_DECLS /* sin LFO */ void ags_lfo_synth_util_sin_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sin_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); /* sawtooth LFO */ void ags_lfo_synth_util_sawtooth_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); /* triangle LFO */ void ags_lfo_synth_util_triangle_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_triangle_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); /* square LFO */ void ags_lfo_synth_util_square_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_square_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); /* impulse LFO */ void ags_lfo_synth_util_impulse_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); void ags_lfo_synth_util_impulse_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames); /* LFOs */ void ags_lfo_synth_util_sin(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_lfo_synth_util_sawtooth(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_lfo_synth_util_triangle(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_lfo_synth_util_square(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); void ags_lfo_synth_util_impulse(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames); G_END_DECLS #endif /*__AGS_LFO_SYNTH_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_synth_generator.c0000644000175000017500000013650713616617253016712 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_synth_generator_class_init(AgsSynthGeneratorClass *synth_generator); void ags_synth_generator_init(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_synth_generator_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_synth_generator_finalize(GObject *gobject); /** * SECTION:ags_synth_generator * @short_description: generate wave-form * @title: AgsSynthGenerator * @section_id: * @include: ags/file/ags_synth_generator.h * * The #AgsSynthGenerator generates wave-forms with oscillators. */ enum{ PROP_0, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_DELAY, PROP_ATTACK, PROP_FRAME_COUNT, PROP_LOOP_START, PROP_LOOP_END, PROP_DO_LFO, PROP_OSCILLATOR, PROP_FREQUENCY, PROP_PHASE, PROP_VOLUME, PROP_LFO_DEPTH, PROP_TUNING, PROP_DO_FM_SYNTH, PROP_FM_LFO_OSCILLATOR, PROP_FM_LFO_FREQUENCY, PROP_FM_LFO_DEPTH, PROP_FM_TUNING, PROP_TIMESTAMP, }; static gpointer ags_synth_generator_parent_class = NULL; static const gchar *ags_synth_generator_plugin_name = "ags-synth-generator"; GType ags_synth_generator_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_synth_generator = 0; static const GTypeInfo ags_synth_generator_info = { sizeof (AgsSynthGeneratorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_synth_generator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSynthGenerator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_synth_generator_init, }; ags_type_synth_generator = g_type_register_static(AGS_TYPE_FUNCTION, "AgsSynthGenerator", &ags_synth_generator_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_synth_generator); } return g_define_type_id__volatile; } void ags_synth_generator_class_init(AgsSynthGeneratorClass *synth_generator) { GObjectClass *gobject; GParamSpec *param_spec; ags_synth_generator_parent_class = g_type_class_peek_parent(synth_generator); /* GObjectClass */ gobject = (GObjectClass *) synth_generator; gobject->set_property = ags_synth_generator_set_property; gobject->get_property = ags_synth_generator_get_property; gobject->finalize = ags_synth_generator_finalize; /* properties */ /** * AgsSynthGenerator:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT32, AGS_SYNTH_GENERATOR_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsSynthGenerator:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, AGS_SYNTH_GENERATOR_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsSynthGenerator:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT32, AGS_SYNTH_GENERATOR_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsSynthGenerator:frame-count: * * The frame count to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("frame-count", i18n_pspec("apply frame count"), i18n_pspec("To apply frame count"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FRAME_COUNT, param_spec); /** * AgsSynthGenerator:loop-start: * * The loop start to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("loop-start", i18n_pspec("loop start"), i18n_pspec("The loop start"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_START, param_spec); /** * AgsSynthGenerator:loop-end: * * The loop end to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("loop-end", i18n_pspec("loop end"), i18n_pspec("To loop end"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_END, param_spec); /** * AgsSynthGenerator:delay: * * The delay to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay", i18n_pspec("using delay"), i18n_pspec("The delay to be used"), 0.0, 65535.0, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY, param_spec); /** * AgsSynthGenerator:attack: * * The attack to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("attack", i18n_pspec("apply attack"), i18n_pspec("To apply attack"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsSynthGenerator:do-lfo: * * If %TRUE compute LFO amplification, otherwise not. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("do-lfo", i18n_pspec("do LFO amplification"), i18n_pspec("do LFO amplification"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DO_LFO, param_spec); /** * AgsSynthGenerator:oscillator: * * The oscillator to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("oscillator", i18n_pspec("using oscillator"), i18n_pspec("The oscillator to be used"), 0, G_MAXUINT32, AGS_SYNTH_GENERATOR_DEFAULT_OSCILLATOR, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSCILLATOR, param_spec); /** * AgsAudioSignal:frequency: * * The frequency to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("frequency", i18n_pspec("using frequency"), i18n_pspec("The frequency to be used"), 0.0, 65535.0, AGS_SYNTH_GENERATOR_DEFAULT_FREQUENCY, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FREQUENCY, param_spec); /** * AgsAudioSignal:phase: * * The phase to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("phase", i18n_pspec("using phase"), i18n_pspec("The phase to be used"), 0.0, 65535.0, AGS_SYNTH_GENERATOR_DEFAULT_PHASE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PHASE, param_spec); /** * AgsAudioSignal:volume: * * The volume to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("volume", i18n_pspec("using volume"), i18n_pspec("The volume to be used"), 0.0, 2.0, AGS_SYNTH_GENERATOR_DEFAULT_VOLUME, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_VOLUME, param_spec); /** * AgsAudioSignal:lfo-depth: * * The LFO depth to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lfo-depth", i18n_pspec("using LFO depth"), i18n_pspec("The LFO depth to be used"), 0.0, 1.0, AGS_SYNTH_GENERATOR_DEFAULT_LFO_DEPTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LFO_DEPTH, param_spec); /** * AgsAudioSignal:tuning: * * The tuning to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("tuning", i18n_pspec("using tuning"), i18n_pspec("The tuning to be used"), 0.0, 1200.0, AGS_SYNTH_GENERATOR_DEFAULT_TUNING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TUNING, param_spec); /** * AgsSynthGenerator:do-fm-synth: * * If %TRUE compute FM synth, otherwise not. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("do-fm-synth", i18n_pspec("do fm synth"), i18n_pspec("do fm synth"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DO_FM_SYNTH, param_spec); /** * AgsSynthGenerator:fm-lfo-oscillator: * * The frame count to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fm-lfo-oscillator", i18n_pspec("fm LFO oscillator mode"), i18n_pspec("the frequency modulation LFO oscillator mode"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FM_LFO_OSCILLATOR, param_spec); /** * AgsAudioSignal:fm-lfo-frequency: * * The fm LFO frequency to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("fm-lfo-frequency", i18n_pspec("using fm LFO frequency"), i18n_pspec("The fm LFO frequency to be used"), 0.001, 27.5, AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_FREQUENCY, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FM_LFO_FREQUENCY, param_spec); /** * AgsAudioSignal:fm-lfo-depth: * * The fm LFO depth to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("fm-lfo-depth", i18n_pspec("using fm LFO depth"), i18n_pspec("The fm LFO depth to be used"), 0.0, 1.0, AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_DEPTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FM_LFO_DEPTH, param_spec); /** * AgsAudioSignal:fm-tuning: * * The fm tuning to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("fm-tuning", i18n_pspec("using FM tuning"), i18n_pspec("The FM tuning to be used"), 0.0, 1200.0, AGS_SYNTH_GENERATOR_DEFAULT_FM_TUNING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FM_TUNING, param_spec); /** * AgsSynthGenerator:timestamp: * * The assigned timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("timestamp"), i18n_pspec("The timestamp"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); } void ags_synth_generator_init(AgsSynthGenerator *synth_generator) { AgsConfig *config; synth_generator->flags = 0; /* config */ config = ags_config_get_instance(); /* presets */ synth_generator->samplerate = ags_soundcard_helper_config_get_samplerate(config); synth_generator->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); synth_generator->format = ags_soundcard_helper_config_get_format(config); /* more base init */ synth_generator->frame_count = 0; synth_generator->loop_start = 0; synth_generator->loop_end = 0; synth_generator->delay = 0.0; synth_generator->attack = 0; synth_generator->do_lfo = FALSE; synth_generator->oscillator = AGS_SYNTH_GENERATOR_DEFAULT_OSCILLATOR; synth_generator->frequency = AGS_SYNTH_GENERATOR_DEFAULT_FREQUENCY; synth_generator->phase = AGS_SYNTH_GENERATOR_DEFAULT_PHASE; synth_generator->volume = AGS_SYNTH_GENERATOR_DEFAULT_VOLUME; synth_generator->lfo_depth = AGS_SYNTH_GENERATOR_DEFAULT_LFO_DEPTH; synth_generator->tuning = AGS_SYNTH_GENERATOR_DEFAULT_TUNING; synth_generator->sync_relative = FALSE; synth_generator->sync_point = NULL; synth_generator->sync_point_count = 0; synth_generator->damping = ags_complex_alloc(); synth_generator->vibration = ags_complex_alloc(); synth_generator->do_fm_synth = FALSE; synth_generator->fm_lfo_oscillator = 0; synth_generator->fm_lfo_frequency = AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_FREQUENCY; synth_generator->fm_lfo_depth = AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_DEPTH; synth_generator->fm_tuning = AGS_SYNTH_GENERATOR_DEFAULT_FM_TUNING; /* timestamp */ synth_generator->timestamp = NULL; } void ags_synth_generator_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSynthGenerator *synth_generator; synth_generator = AGS_SYNTH_GENERATOR(gobject); switch(prop_id){ case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_synth_generator_set_samplerate(synth_generator, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_synth_generator_set_buffer_size(synth_generator, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_synth_generator_set_format(synth_generator, format); } break; case PROP_DELAY: { synth_generator->delay = g_value_get_double(value); } break; case PROP_ATTACK: { synth_generator->attack = g_value_get_uint(value); } break; case PROP_FRAME_COUNT: { synth_generator->frame_count = g_value_get_uint(value); } break; case PROP_LOOP_START: { synth_generator->loop_start = g_value_get_uint(value); } break; case PROP_LOOP_END: { synth_generator->loop_end = g_value_get_uint(value); } break; case PROP_OSCILLATOR: { synth_generator->oscillator = g_value_get_uint(value); } break; case PROP_FREQUENCY: { synth_generator->frequency = g_value_get_double(value); } break; case PROP_PHASE: { synth_generator->phase = g_value_get_double(value); } break; case PROP_VOLUME: { synth_generator->volume = g_value_get_double(value); } break; case PROP_DO_FM_SYNTH: { synth_generator->do_fm_synth = g_value_get_boolean(value); } break; case PROP_FM_LFO_OSCILLATOR: { synth_generator->fm_lfo_oscillator = g_value_get_uint(value); } break; case PROP_FM_LFO_FREQUENCY: { synth_generator->fm_lfo_frequency = g_value_get_double(value); } break; case PROP_FM_LFO_DEPTH: { synth_generator->fm_lfo_depth = g_value_get_double(value); } break; case PROP_FM_TUNING: { synth_generator->fm_tuning = g_value_get_double(value); } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_value_get_object(value); if(synth_generator->timestamp == (GObject *) timestamp){ return; } if(synth_generator->timestamp != NULL){ g_object_unref(synth_generator->timestamp); } if(timestamp != NULL){ g_object_ref(timestamp); } synth_generator->timestamp = (GObject *) timestamp; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_synth_generator_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSynthGenerator *synth_generator; synth_generator = AGS_SYNTH_GENERATOR(gobject); switch(prop_id){ case PROP_SAMPLERATE: { g_value_set_uint(value, synth_generator->samplerate); } break; case PROP_BUFFER_SIZE: { g_value_set_uint(value, synth_generator->buffer_size); } break; case PROP_FORMAT: { g_value_set_uint(value, synth_generator->format); } break; case PROP_DELAY: { g_value_set_double(value, synth_generator->delay); } break; case PROP_ATTACK: { g_value_set_uint(value, synth_generator->attack); } break; case PROP_FRAME_COUNT: { g_value_set_uint(value, synth_generator->frame_count); } break; case PROP_LOOP_START: { g_value_set_uint(value, synth_generator->loop_start); } break; case PROP_LOOP_END: { g_value_set_uint(value, synth_generator->loop_end); } break; case PROP_OSCILLATOR: { g_value_set_uint(value, synth_generator->oscillator); } break; case PROP_FREQUENCY: { g_value_set_double(value, synth_generator->frequency); } break; case PROP_PHASE: { g_value_set_double(value, synth_generator->phase); } break; case PROP_DO_FM_SYNTH: { g_value_set_boolean(value, synth_generator->do_fm_synth); } break; case PROP_FM_LFO_OSCILLATOR: { g_value_set_uint(value, synth_generator->fm_lfo_oscillator); } break; case PROP_FM_LFO_FREQUENCY: { g_value_set_double(value, synth_generator->fm_lfo_frequency); } break; case PROP_FM_LFO_DEPTH: { g_value_set_double(value, synth_generator->fm_lfo_depth); } break; case PROP_FM_TUNING: { g_value_set_double(value, synth_generator->fm_tuning); } break; case PROP_TIMESTAMP: { g_value_set_object(value, synth_generator->timestamp); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_synth_generator_finalize(GObject *gobject) { AgsSynthGenerator *synth_generator; synth_generator = AGS_SYNTH_GENERATOR(gobject); if(synth_generator->timestamp != NULL){ g_object_unref(synth_generator->timestamp); } /* finalize */ G_OBJECT_CLASS(ags_synth_generator_parent_class)->finalize(gobject); } /** * ags_synth_generator_get_obj_mutex: * @synth_generator: the #AgsSynthGenerator * * Get object mutex. * * Returns: the #GRecMutex to lock @synth_generator * * Since: 3.1.0 */ GRecMutex* ags_synth_generator_get_obj_mutex(AgsSynthGenerator *synth_generator) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(NULL); } return(AGS_SYNTH_GENERATOR_GET_OBJ_MUTEX(synth_generator)); } /** * ags_synth_generator_get_samplerate: * @synth_generator: the #AgsSynthGenerator * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_synth_generator_get_samplerate(AgsSynthGenerator *synth_generator) { guint samplerate; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_synth_generator_set_samplerate: * @synth_generator: the #AgsSynthGenerator * @samplerate: the samplerate * * Set samplerate. * * Since: 3.0.0 */ void ags_synth_generator_set_samplerate(AgsSynthGenerator *synth_generator, guint samplerate) { guint old_samplerate; guint i; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } old_samplerate = synth_generator->samplerate; if(old_samplerate == samplerate){ return; } synth_generator->samplerate = samplerate; synth_generator->frame_count = samplerate * (synth_generator->frame_count / old_samplerate); synth_generator->loop_start = samplerate * (synth_generator->loop_start / old_samplerate); synth_generator->loop_end = samplerate * (synth_generator->loop_end / old_samplerate); synth_generator->attack = samplerate * (synth_generator->attack / old_samplerate); synth_generator->phase = samplerate * (synth_generator->phase / old_samplerate); for(i = 0; i < synth_generator->sync_point_count; i++){ synth_generator->sync_point[i][0].real = samplerate * (synth_generator->sync_point[i][0].real / old_samplerate); synth_generator->sync_point[i][0].imag = samplerate * (synth_generator->sync_point[i][0].imag / old_samplerate); } } /** * ags_synth_generator_get_buffer_size: * @synth_generator: the #AgsSynthGenerator * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_synth_generator_get_buffer_size(AgsSynthGenerator *synth_generator) { guint buffer_size; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_synth_generator_set_buffer_size: * @synth_generator: the #AgsSynthGenerator * @buffer_size: the buffer size * * Set buffer size. * * Since: 3.0.0 */ void ags_synth_generator_set_buffer_size(AgsSynthGenerator *synth_generator, guint buffer_size) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } synth_generator->buffer_size = buffer_size; } /** * ags_synth_generator_get_format: * @synth_generator: the #AgsSynthGenerator * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_synth_generator_get_format(AgsSynthGenerator *synth_generator) { guint format; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "format", &format, NULL); return(format); } /** * ags_synth_generator_set_format: * @synth_generator: the #AgsSynthGenerator * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_synth_generator_set_format(AgsSynthGenerator *synth_generator, guint format) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } synth_generator->format = format; } /** * ags_synth_generator_get_delay: * @synth_generator: the #AgsSynthGenerator * * Gets delay. * * Returns: the delay * * Since: 3.1.0 */ gdouble ags_synth_generator_get_delay(AgsSynthGenerator *synth_generator) { gdouble delay; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "delay", &delay, NULL); return(delay); } /** * ags_synth_generator_set_delay: * @synth_generator: the #AgsSynthGenerator * @delay: the delay * * Sets delay. * * Since: 3.1.0 */ void ags_synth_generator_set_delay(AgsSynthGenerator *synth_generator, gdouble delay) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "delay", delay, NULL); } /** * ags_synth_generator_get_frame_count: * @synth_generator: the #AgsSynthGenerator * * Gets frame count. * * Returns: the frame count * * Since: 3.1.0 */ guint ags_synth_generator_get_frame_count(AgsSynthGenerator *synth_generator) { guint frame_count; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "frame-count", &frame_count, NULL); return(frame_count); } /** * ags_synth_generator_set_frame_count: * @synth_generator: the #AgsSynthGenerator * @frame_count: the frame count * * Sets frame count. * * Since: 3.1.0 */ void ags_synth_generator_set_frame_count(AgsSynthGenerator *synth_generator, guint frame_count) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "frame-count", frame_count, NULL); } /** * ags_synth_generator_get_loop_start: * @synth_generator: the #AgsSynthGenerator * * Gets loop start. * * Returns: the loop start * * Since: 3.1.0 */ guint ags_synth_generator_get_loop_start(AgsSynthGenerator *synth_generator) { guint loop_start; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "loop-start", &loop_start, NULL); return(loop_start); } /** * ags_synth_generator_set_loop_start: * @synth_generator: the #AgsSynthGenerator * @loop_start: the loop start * * Sets loop start. * * Since: 3.1.0 */ void ags_synth_generator_set_loop_start(AgsSynthGenerator *synth_generator, guint loop_start) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "loop-start", loop_start, NULL); } /** * ags_synth_generator_get_loop_end: * @synth_generator: the #AgsSynthGenerator * * Gets loop end. * * Returns: the loop end * * Since: 3.1.0 */ guint ags_synth_generator_get_loop_end(AgsSynthGenerator *synth_generator) { guint loop_end; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "loop-end", &loop_end, NULL); return(loop_end); } /** * ags_synth_generator_set_loop_end: * @synth_generator: the #AgsSynthGenerator * @loop_end: the loop end * * Sets loop end. * * Since: 3.1.0 */ void ags_synth_generator_set_loop_end(AgsSynthGenerator *synth_generator, guint loop_end) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "loop-end", loop_end, NULL); } /** * ags_synth_generator_get_do_lfo: * @synth_generator: the #AgsSynthGenerator * * Gets do lfo. * * Returns: the do lfo * * Since: 3.1.0 */ gboolean ags_synth_generator_get_do_lfo(AgsSynthGenerator *synth_generator) { gboolean do_lfo; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(FALSE); } g_object_get(synth_generator, "do-lfo", &do_lfo, NULL); return(do_lfo); } /** * ags_synth_generator_set_do_lfo: * @synth_generator: the #AgsSynthGenerator * @do_lfo: the do lfo * * Sets do lfo. * * Since: 3.1.0 */ void ags_synth_generator_set_do_lfo(AgsSynthGenerator *synth_generator, gboolean do_lfo) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "do-lfo", do_lfo, NULL); } /** * ags_synth_generator_get_oscillator: * @synth_generator: the #AgsSynthGenerator * * Gets oscillator. * * Returns: the oscillator * * Since: 3.1.0 */ guint ags_synth_generator_get_oscillator(AgsSynthGenerator *synth_generator) { guint oscillator; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "oscillator", &oscillator, NULL); return(oscillator); } /** * ags_synth_generator_set_oscillator: * @synth_generator: the #AgsSynthGenerator * @oscillator: the oscillator * * Sets oscillator. * * Since: 3.1.0 */ void ags_synth_generator_set_oscillator(AgsSynthGenerator *synth_generator, guint oscillator) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "oscillator", oscillator, NULL); } /** * ags_synth_generator_get_frequency: * @synth_generator: the #AgsSynthGenerator * * Gets frequency. * * Returns: the frequency * * Since: 3.1.0 */ gdouble ags_synth_generator_get_frequency(AgsSynthGenerator *synth_generator) { gdouble frequency; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "frequency", &frequency, NULL); return(frequency); } /** * ags_synth_generator_set_frequency: * @synth_generator: the #AgsSynthGenerator * @frequency: the frequency * * Sets frequency. * * Since: 3.1.0 */ void ags_synth_generator_set_frequency(AgsSynthGenerator *synth_generator, gdouble frequency) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "frequency", frequency, NULL); } /** * ags_synth_generator_get_phase: * @synth_generator: the #AgsSynthGenerator * * Gets phase. * * Returns: the phase * * Since: 3.1.0 */ gdouble ags_synth_generator_get_phase(AgsSynthGenerator *synth_generator) { gdouble phase; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "phase", &phase, NULL); return(phase); } /** * ags_synth_generator_set_phase: * @synth_generator: the #AgsSynthGenerator * @phase: the phase * * Sets phase. * * Since: 3.1.0 */ void ags_synth_generator_set_phase(AgsSynthGenerator *synth_generator, gdouble phase) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "phase", phase, NULL); } /** * ags_synth_generator_get_volume: * @synth_generator: the #AgsSynthGenerator * * Gets volume. * * Returns: the volume * * Since: 3.1.0 */ gdouble ags_synth_generator_get_volume(AgsSynthGenerator *synth_generator) { gdouble volume; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "volume", &volume, NULL); return(volume); } /** * ags_synth_generator_set_volume: * @synth_generator: the #AgsSynthGenerator * @volume: the volume * * Sets volume. * * Since: 3.1.0 */ void ags_synth_generator_set_volume(AgsSynthGenerator *synth_generator, gdouble volume) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "volume", volume, NULL); } /** * ags_synth_generator_get_lfo_depth: * @synth_generator: the #AgsSynthGenerator * * Gets LFO depth. * * Returns: the LFO depth * * Since: 3.1.0 */ gdouble ags_synth_generator_get_lfo_depth(AgsSynthGenerator *synth_generator) { gdouble lfo_depth; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "lfo-depth", &lfo_depth, NULL); return(lfo_depth); } /** * ags_synth_generator_set_lfo_depth: * @synth_generator: the #AgsSynthGenerator * @lfo_depth: the LFO depth * * Sets LFO depth. * * Since: 3.1.0 */ void ags_synth_generator_set_lfo_depth(AgsSynthGenerator *synth_generator, gdouble lfo_depth) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "lfo-depth", lfo_depth, NULL); } /** * ags_synth_generator_get_tuning: * @synth_generator: the #AgsSynthGenerator * * Gets tuning. * * Returns: the tuning * * Since: 3.1.0 */ gdouble ags_synth_generator_get_tuning(AgsSynthGenerator *synth_generator) { gdouble tuning; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "tuning", &tuning, NULL); return(tuning); } /** * ags_synth_generator_set_tuning: * @synth_generator: the #AgsSynthGenerator * @tuning: the tuning * * Sets tuning. * * Since: 3.1.0 */ void ags_synth_generator_set_tuning(AgsSynthGenerator *synth_generator, gdouble tuning) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "tuning", tuning, NULL); } /** * ags_synth_generator_get_do_fm_synth: * @synth_generator: the #AgsSynthGenerator * * Gets do FM synth. * * Returns: the do FM synth * * Since: 3.1.0 */ gboolean ags_synth_generator_get_do_fm_synth(AgsSynthGenerator *synth_generator) { gboolean do_fm_synth; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(FALSE); } g_object_get(synth_generator, "do-fm-synth", &do_fm_synth, NULL); return(do_fm_synth); } /** * ags_synth_generator_set_do_fm_synth: * @synth_generator: the #AgsSynthGenerator * @do_fm_synth: the do FM synth * * Sets do FM synth. * * Since: 3.1.0 */ void ags_synth_generator_set_do_fm_synth(AgsSynthGenerator *synth_generator, gboolean do_fm_synth) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "do-fm-synth", do_fm_synth, NULL); } /** * ags_synth_generator_get_fm_lfo_oscillator: * @synth_generator: the #AgsSynthGenerator * * Gets FM LFO oscillator. * * Returns: the FM LFO oscillator * * Since: 3.1.0 */ guint ags_synth_generator_get_fm_lfo_oscillator(AgsSynthGenerator *synth_generator) { guint fm_lfo_oscillator; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0); } g_object_get(synth_generator, "fm-lfo-oscillator", &fm_lfo_oscillator, NULL); return(fm_lfo_oscillator); } /** * ags_synth_generator_set_fm_lfo_oscillator: * @synth_generator: the #AgsSynthGenerator * @fm_lfo_oscillator: the FM LFO oscillator * * Sets FM LFO oscillator. * * Since: 3.1.0 */ void ags_synth_generator_set_fm_lfo_oscillator(AgsSynthGenerator *synth_generator, guint fm_lfo_oscillator) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "fm-lfo-oscillator", fm_lfo_oscillator, NULL); } /** * ags_synth_generator_get_fm_lfo_frequency: * @synth_generator: the #AgsSynthGenerator * * Gets FM LFO frequency. * * Returns: the FM LFO frequency * * Since: 3.1.0 */ gdouble ags_synth_generator_get_fm_lfo_frequency(AgsSynthGenerator *synth_generator) { gdouble fm_lfo_frequency; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "fm-lfo-frequency", &fm_lfo_frequency, NULL); return(fm_lfo_frequency); } /** * ags_synth_generator_set_fm_lfo_frequency: * @synth_generator: the #AgsSynthGenerator * @fm_lfo_frequency: the FM LFO frequency * * Sets FM LFO frequency. * * Since: 3.1.0 */ void ags_synth_generator_set_fm_lfo_frequency(AgsSynthGenerator *synth_generator, gdouble fm_lfo_frequency) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "fm-lfo-frequency", fm_lfo_frequency, NULL); } /** * ags_synth_generator_get_fm_lfo_depth: * @synth_generator: the #AgsSynthGenerator * * Gets FM LFO depth. * * Returns: the FM LFO depth * * Since: 3.1.0 */ gdouble ags_synth_generator_get_fm_lfo_depth(AgsSynthGenerator *synth_generator) { gdouble fm_lfo_depth; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "fm-lfo-depth", &fm_lfo_depth, NULL); return(fm_lfo_depth); } /** * ags_synth_generator_set_fm_lfo_depth: * @synth_generator: the #AgsSynthGenerator * @fm_lfo_depth: the FM LFO depth * * Sets FM LFO depth. * * Since: 3.1.0 */ void ags_synth_generator_set_fm_lfo_depth(AgsSynthGenerator *synth_generator, gdouble fm_lfo_depth) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "fm-lfo-depth", fm_lfo_depth, NULL); } /** * ags_synth_generator_get_fm_tuning: * @synth_generator: the #AgsSynthGenerator * * Gets FM tuning. * * Returns: the FM tuning * * Since: 3.1.0 */ gdouble ags_synth_generator_get_fm_tuning(AgsSynthGenerator *synth_generator) { gdouble fm_tuning; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(0.0); } g_object_get(synth_generator, "fm-tuning", &fm_tuning, NULL); return(fm_tuning); } /** * ags_synth_generator_set_fm_tuning: * @synth_generator: the #AgsSynthGenerator * @fm_tuning: the FM tuning * * Sets FM tuning. * * Since: 3.1.0 */ void ags_synth_generator_set_fm_tuning(AgsSynthGenerator *synth_generator, gdouble fm_tuning) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "fm-tuning", fm_tuning, NULL); } /** * ags_synth_generator_get_timestamp: * @synth_generator: the #AgsSynthGenerator * * Get timestamp. * * Returns: (transfer full): the #AgsTimestamp * * Since: 3.1.0 */ AgsTimestamp* ags_synth_generator_get_timestamp(AgsSynthGenerator *synth_generator) { AgsTimestamp *timestamp; if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return(NULL); } g_object_get(synth_generator, "timestamp", ×tamp, NULL); return(timestamp); } /** * ags_synth_generator_set_timestamp: * @synth_generator: the #AgsSynthGenerator * @timestamp: the #AgsTimestamp * * Set timestamp. * * Since: 3.1.0 */ void ags_synth_generator_set_timestamp(AgsSynthGenerator *synth_generator, AgsTimestamp *timestamp) { if(!AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_set(synth_generator, "timestamp", timestamp, NULL); } /** * ags_synth_generator_compute: * @synth_generator: the #AgsSynthGenerator * @audio_signal: the #AgsAudioSignal * @note: the note to compute * * Compute synth for @note. * * Since: 3.0.0 */ void ags_synth_generator_compute(AgsSynthGenerator *synth_generator, GObject *audio_signal, gdouble note) { GList *stream_start, *stream; gdouble delay; guint attack; guint frame_count; guint buffer_size; guint current_frame_count, requested_frame_count; gboolean do_lfo; guint oscillator; gdouble samplerate; gdouble current_frequency; gdouble phase, volume; gdouble lfo_depth; gdouble tuning; gdouble current_phase; guint format; guint audio_buffer_util_format; guint current_attack, current_count; guint offset; guint last_sync; guint i, j; AgsComplex **sync_point; guint sync_point_count; gboolean do_fm_synth; guint fm_lfo_osc_mode; gdouble fm_lfo_freq; gdouble fm_lfo_depth; gdouble fm_tuning; gboolean synced; delay = synth_generator->delay; attack = synth_generator->attack; frame_count = synth_generator->frame_count; buffer_size = AGS_AUDIO_SIGNAL(audio_signal)->buffer_size; do_lfo = synth_generator->do_lfo; oscillator = synth_generator->oscillator; sync_point = synth_generator->sync_point; sync_point_count = synth_generator->sync_point_count; current_frame_count = AGS_AUDIO_SIGNAL(audio_signal)->length * buffer_size; requested_frame_count = (guint) ceil(((floor(delay) * buffer_size + attack) + frame_count) / buffer_size) * buffer_size; if(current_frame_count < requested_frame_count){ ags_audio_signal_stream_resize((AgsAudioSignal *) audio_signal, ceil(requested_frame_count / buffer_size)); } g_object_set(audio_signal, "loop-start", synth_generator->loop_start, "loop-end", synth_generator->loop_end, "last-frame", attack + frame_count, NULL); /* */ stream = stream_start = g_list_nth(AGS_AUDIO_SIGNAL(audio_signal)->stream, (guint) floor(delay)); samplerate = AGS_AUDIO_SIGNAL(audio_signal)->samplerate; current_frequency = (guint) ((double) synth_generator->frequency * exp2((double)((double) note + 48.0) / 12.0)); phase = current_phase = synth_generator->phase; volume = synth_generator->volume; format = AGS_AUDIO_SIGNAL(audio_signal)->format; audio_buffer_util_format = ags_audio_buffer_util_format_from_soundcard(format); lfo_depth = synth_generator->lfo_depth; tuning = synth_generator->tuning; current_attack = attack; current_count = buffer_size; if(attack < buffer_size){ current_count = buffer_size - attack; }else{ stream = g_list_nth(stream_start, (guint) floor((double) attack / (double) buffer_size)); current_count = buffer_size - (attack % buffer_size); } offset = 0; last_sync = 0; if(sync_point != NULL){ if(sync_point_count > 1 && floor(sync_point[1][0].real) > 0.0){ if(sync_point[1][0].real < current_count){ current_count = sync_point[1][0].real; } }else{ if(sync_point[0][0].real < current_count && floor(sync_point[0][0].real) > 0.0){ current_count = sync_point[0][0].real; } } } do_fm_synth = synth_generator->do_fm_synth; fm_lfo_osc_mode = 0; switch(synth_generator->fm_lfo_oscillator){ case AGS_SYNTH_GENERATOR_OSCILLATOR_SIN: { fm_lfo_osc_mode = AGS_SYNTH_OSCILLATOR_SIN; } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SAWTOOTH: { fm_lfo_osc_mode = AGS_SYNTH_OSCILLATOR_SAWTOOTH; } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_TRIANGLE: { fm_lfo_osc_mode = AGS_SYNTH_OSCILLATOR_TRIANGLE; } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SQUARE: { fm_lfo_osc_mode = AGS_SYNTH_OSCILLATOR_SQUARE; } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_IMPULSE: { fm_lfo_osc_mode = AGS_SYNTH_OSCILLATOR_IMPULSE; } break; } fm_lfo_freq = synth_generator->fm_lfo_frequency; fm_lfo_depth = synth_generator->fm_lfo_depth; fm_tuning = synth_generator->fm_tuning; synced = FALSE; for(i = attack, j = 0; i < frame_count + attack && stream != NULL;){ if(!do_fm_synth && !do_lfo){ switch(oscillator){ case AGS_SYNTH_GENERATOR_OSCILLATOR_SIN: { ags_synth_util_sin(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SAWTOOTH: { ags_synth_util_sawtooth(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_TRIANGLE: { ags_synth_util_triangle(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SQUARE: { ags_synth_util_square(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_IMPULSE: { ags_synth_util_impulse(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count); } break; default: g_message("unknown oscillator"); } }else if(do_lfo){ switch(oscillator){ case AGS_SYNTH_GENERATOR_OSCILLATOR_SIN: { ags_lfo_synth_util_sin(stream->data, current_frequency, current_phase, lfo_depth, tuning, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SAWTOOTH: { ags_lfo_synth_util_sawtooth(stream->data, current_frequency, current_phase, lfo_depth, tuning, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_TRIANGLE: { ags_lfo_synth_util_triangle(stream->data, current_frequency, current_phase, lfo_depth, tuning, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SQUARE: { ags_lfo_synth_util_square(stream->data, current_frequency, current_phase, lfo_depth, tuning, samplerate, audio_buffer_util_format, current_attack, current_count); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_IMPULSE: { ags_lfo_synth_util_impulse(stream->data, current_frequency, current_phase, lfo_depth, tuning, samplerate, audio_buffer_util_format, current_attack, current_count); } break; default: g_message("unknown oscillator"); } }else if(do_fm_synth){ switch(synth_generator->oscillator){ case AGS_SYNTH_GENERATOR_OSCILLATOR_SIN: { ags_fm_synth_util_sin(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count, fm_lfo_osc_mode, fm_lfo_freq, fm_lfo_depth, fm_tuning); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SAWTOOTH: { ags_fm_synth_util_sawtooth(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count, fm_lfo_osc_mode, fm_lfo_freq, fm_lfo_depth, fm_tuning); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_TRIANGLE: { ags_fm_synth_util_triangle(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count, fm_lfo_osc_mode, fm_lfo_freq, fm_lfo_depth, fm_tuning); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_SQUARE: { ags_fm_synth_util_square(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count, fm_lfo_osc_mode, fm_lfo_freq, fm_lfo_depth, fm_tuning); } break; case AGS_SYNTH_GENERATOR_OSCILLATOR_IMPULSE: { ags_fm_synth_util_impulse(stream->data, current_frequency, current_phase, volume, samplerate, audio_buffer_util_format, current_attack, current_count, fm_lfo_osc_mode, fm_lfo_freq, fm_lfo_depth, fm_tuning); } break; default: g_message("unknown oscillator"); } } if(current_frequency == 0.0){ current_phase = (guint) ((offset + current_count) + phase); }else if(floor(samplerate / current_frequency) == 0){ current_phase = (guint) ((offset + current_count) + phase); }else{ current_phase = (guint) ((offset + current_count) + phase) % (guint) floor(samplerate / current_frequency); } if(sync_point != NULL){ if(floor(sync_point[j][0].real) > 0.0 && last_sync + sync_point[j][0].real < offset + current_count){ current_phase = sync_point[j][0].imag; synced = TRUE; } } offset += current_count; i += current_count; if(buffer_size > (current_attack + current_count)){ current_count = buffer_size - (current_attack + current_count); current_attack = buffer_size - current_count; }else{ current_count = buffer_size; current_attack = 0; } if(sync_point != NULL){ if(j + 1 < sync_point_count && floor(sync_point[j + 1][0].real) > 0.0){ if(sync_point[j + 1][0].real < current_count){ current_count = sync_point[j + 1][0].real; } }else{ if(floor(sync_point[0][0].real) > 0.0 && sync_point[0][0].real < current_count){ current_count = sync_point[0][0].real; } } } if(sync_point != NULL){ if(synced){ last_sync = last_sync + sync_point[j][0].real; j++; if(j >= sync_point_count || floor(sync_point[j][0].real) == 0.0){ j = 0; } synced = FALSE; } } if(i != 0 && i % buffer_size == 0){ stream = stream->next; } } } /** * ags_synth_generator_new: * * Creates an #AgsSynthGenerator * * Returns: a new #AgsSynthGenerator * * Since: 3.0.0 */ AgsSynthGenerator* ags_synth_generator_new() { AgsSynthGenerator *synth_generator; synth_generator = (AgsSynthGenerator *) g_object_new(AGS_TYPE_SYNTH_GENERATOR, NULL); return(synth_generator); } gsequencer-3.1.3/ags/audio/ags_preset.h0000644000175000017500000001070613616617253014776 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PRESET_H__ #define __AGS_PRESET_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PRESET (ags_preset_get_type()) #define AGS_PRESET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PRESET, AgsPreset)) #define AGS_PRESET_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PRESET, AgsPresetClass)) #define AGS_IS_PRESET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PRESET)) #define AGS_IS_PRESET_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PRESET)) #define AGS_PRESET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PRESET, AgsPresetClass)) #define AGS_PRESET_GET_OBJ_MUTEX(obj) (&(((AgsPreset *) obj)->obj_mutex)) typedef struct _AgsPreset AgsPreset; typedef struct _AgsPresetClass AgsPresetClass; /** * AgsPresetFlags: * @AGS_PRESET_ADDED_TO_REGISTRY: the preset was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PRESET_CONNECTED: indicates the playback was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsPreset by * enable/disable as flags. */ typedef enum{ AGS_PRESET_ADDED_TO_REGISTRY = 1, AGS_PRESET_CONNECTED = 1 << 1, }AgsPresetFlags; #define AGS_PRESET_ERROR (ags_preset_error_quark()) typedef enum{ AGS_PRESET_ERROR_NO_SUCH_PARAMETER, }AgsPresetError; struct _AgsPreset { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio; gchar *scope; gchar *preset_name; guint audio_channel_start; guint audio_channel_end; guint pad_start; guint pad_end; guint x_start; guint x_end; guint n_params; gchar **parameter_name; GValue *value; }; struct _AgsPresetClass { GObjectClass gobject; }; GType ags_preset_get_type(); GQuark ags_preset_error_quark(); GRecMutex* ags_preset_get_obj_mutex(AgsPreset *preset); gboolean ags_preset_test_flags(AgsPreset *preset, guint flags); void ags_preset_set_flags(AgsPreset *preset, guint flags); void ags_preset_unset_flags(AgsPreset *preset, guint flags); GObject* ags_preset_get_audio(AgsPreset *preset); void ags_preset_set_audio(AgsPreset *preset, GObject *audio); gchar* ags_preset_get_scope(AgsPreset *preset); void ags_preset_set_scope(AgsPreset *preset, gchar *scope); gchar* ags_preset_get_preset_name(AgsPreset *preset); void ags_preset_set_preset_name(AgsPreset *preset, gchar *preset_name); guint ags_preset_get_audio_channel_start(AgsPreset *preset); void ags_preset_set_audio_channel_start(AgsPreset *preset, guint audio_channel_start); guint ags_preset_get_audio_channel_end(AgsPreset *preset); void ags_preset_set_audio_channel_end(AgsPreset *preset, guint audio_channel_end); guint ags_preset_get_pad_start(AgsPreset *preset); void ags_preset_set_pad_start(AgsPreset *preset, guint pad_start); guint ags_preset_get_pad_end(AgsPreset *preset); void ags_preset_set_pad_end(AgsPreset *preset, guint pad_end); guint ags_preset_get_x_start(AgsPreset *preset); void ags_preset_set_x_start(AgsPreset *preset, guint x_start); guint ags_preset_get_x_end(AgsPreset *preset); void ags_preset_set_x_end(AgsPreset *preset, guint x_end); GList* ags_preset_find_scope(GList *preset, gchar *scope); GList* ags_preset_find_name(GList *preset, gchar *preset_name); gboolean ags_preset_add_parameter(AgsPreset *preset, gchar *param_name, GValue *value); void ags_preset_remove_parameter(AgsPreset *preset, guint nth); void ags_preset_get_parameter(AgsPreset *preset, gchar *param_name, GValue *value, GError **error); AgsPreset* ags_preset_new(); G_END_DECLS #endif /*__AGS_PRESET_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_container.h0000644000175000017500000001054513607210263016767 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_CONTAINER_H__ #define __AGS_RECALL_CONTAINER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_CONTAINER (ags_recall_container_get_type()) #define AGS_RECALL_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_CONTAINER, AgsRecallContainer)) #define AGS_RECALL_CONTAINER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_CONTAINER, AgsRecallContainerClass)) #define AGS_IS_RECALL_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_CONTAINER)) #define AGS_IS_RECALL_CONTAINER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_CONTAINER)) #define AGS_RECALL_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_CONTAINER, AgsRecallContainerClass)) #define AGS_RECALL_CONTAINER_GET_OBJ_MUTEX(obj) (&(((AgsRecallContainer *) obj)->obj_mutex)) typedef struct _AgsRecallContainer AgsRecallContainer; typedef struct _AgsRecallContainerClass AgsRecallContainerClass; /** * AgsRecallContainerFlags: * @AGS_RECALL_CONTAINER_ADDED_TO_REGISTRY: add to registry * @AGS_RECALL_CONTAINER_CONNECTED: indicates the recall container was connected by calling #AgsConnectable::connect() * @AGS_RECALL_CONTAINER_PLAY: bound to play context * * Enum values to control the behavior or indicate internal state of #AgsRecallContainer by * enable/disable as flags. */ typedef enum{ AGS_RECALL_CONTAINER_ADDED_TO_REGISTRY = 1, AGS_RECALL_CONTAINER_CONNECTED = 1 << 1, AGS_RECALL_CONTAINER_PLAY = 1 << 2, }AgsRecallContainerFlags; /** * AgsRecallContainerFindFlags: * @AGS_RECALL_CONTAINER_FIND_TYPE: find type * @AGS_RECALL_CONTAINER_FIND_TEMPLATE: find template * @AGS_RECALL_CONTAINER_FIND_RECALL_ID: find recall id * * Enum values to specify find criteria. */ typedef enum{ AGS_RECALL_CONTAINER_FIND_TYPE = 1, AGS_RECALL_CONTAINER_FIND_TEMPLATE = 1 << 1, AGS_RECALL_CONTAINER_FIND_RECALL_ID = 1 << 2, }AgsRecallContainerFindFlags; struct _AgsRecallContainer { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GType recall_audio_type; AgsRecall *recall_audio; GType recall_audio_run_type; GList *recall_audio_run; GType recall_channel_type; GList *recall_channel; GType recall_channel_run_type; GList *recall_channel_run; }; struct _AgsRecallContainerClass { GObjectClass gobject; }; GType ags_recall_container_get_type(); gboolean ags_recall_container_test_flags(AgsRecallContainer *recall_container, guint flags); void ags_recall_container_set_flags(AgsRecallContainer *recall_container, guint flags); void ags_recall_container_unset_flags(AgsRecallContainer *recall_container, guint flags); /* children */ void ags_recall_container_add(AgsRecallContainer *recall_container, AgsRecall *recall); void ags_recall_container_remove(AgsRecallContainer *recall_container, AgsRecall *recall); /* query */ AgsRecall* ags_recall_container_get_recall_audio(AgsRecallContainer *recall_container); GList* ags_recall_container_get_recall_audio_run(AgsRecallContainer *recall_container); GList* ags_recall_container_get_recall_channel(AgsRecallContainer *recall_container); GList* ags_recall_container_get_recall_channel_run(AgsRecallContainer *recall_container); GList* ags_recall_container_find(GList *recall_container, GType type, guint find_flags, AgsRecallID *recall_id); /* instantiate */ AgsRecallContainer* ags_recall_container_new(); G_END_DECLS #endif /*__AGS_RECALL_CONTAINER_H__*/ gsequencer-3.1.3/ags/audio/ags_track.c0000644000175000017500000002370613616617253014577 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_track_class_init(AgsTrackClass *track); void ags_track_init(AgsTrack *track); void ags_track_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_track_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_track_finalize(GObject *gobject); /** * SECTION:ags_track * @short_description: Track class. * @title: AgsTrack * @section_id: * @include: ags/audio/ags_track.h * * #AgsTrack represents a tone. */ enum{ PROP_0, PROP_X, PROP_SMF_BUFFER, }; static gpointer ags_track_parent_class = NULL; GType ags_track_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_track = 0; static const GTypeInfo ags_track_info = { sizeof(AgsTrackClass), NULL, NULL, (GClassInitFunc) ags_track_class_init, NULL, NULL, sizeof(AgsTrack), 0, (GInstanceInitFunc) ags_track_init, }; ags_type_track = g_type_register_static(G_TYPE_OBJECT, "AgsTrack", &ags_track_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_track); } return g_define_type_id__volatile; } void ags_track_class_init(AgsTrackClass *track) { GObjectClass *gobject; GParamSpec *param_spec; ags_track_parent_class = g_type_class_peek_parent(track); gobject = (GObjectClass *) track; gobject->set_property = ags_track_set_property; gobject->get_property = ags_track_get_property; gobject->finalize = ags_track_finalize; /* properties */ /** * AgsTrack:x: * * Track's x offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("x", i18n_pspec("offset x"), i18n_pspec("The x offset"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X, param_spec); /** * AgsTrack:smf-buffer: * * Track's SMF buffer. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("smf-buffer", i18n_pspec("SMF buffer"), i18n_pspec("The SMF buffer"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SMF_BUFFER, param_spec); } void ags_track_init(AgsTrack *track) { track->flags = 0; /* track mutex */ g_rec_mutex_init(&(track->obj_mutex)); /* fields */ track->x = 0; track->smf_buffer = NULL; } void ags_track_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTrack *track; GRecMutex *track_mutex; track = AGS_TRACK(gobject); /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); switch(prop_id){ case PROP_X: { g_rec_mutex_lock(track_mutex); track->x = g_value_get_uint64(value); g_rec_mutex_unlock(track_mutex); } break; case PROP_SMF_BUFFER: { g_rec_mutex_lock(track_mutex); track->smf_buffer = g_value_get_pointer(value); g_rec_mutex_unlock(track_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_track_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTrack *track; GRecMutex *track_mutex; track = AGS_TRACK(gobject); /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); switch(prop_id){ case PROP_X: { g_rec_mutex_lock(track_mutex); g_value_set_uint64(value, track->x); g_rec_mutex_unlock(track_mutex); } break; case PROP_SMF_BUFFER: { g_rec_mutex_lock(track_mutex); g_value_set_pointer(value, track->smf_buffer); g_rec_mutex_unlock(track_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_track_finalize(GObject *gobject) { AgsTrack *track; track = AGS_TRACK(gobject); if(track->smf_buffer != NULL){ free(track->smf_buffer); } /* call parent */ G_OBJECT_CLASS(ags_track_parent_class)->finalize(gobject); } /** * ags_track_get_obj_mutex: * @track: the #AgsTrack * * Get object mutex. * * Returns: the #GRecMutex to lock @track * * Since: 3.1.0 */ GRecMutex* ags_track_get_obj_mutex(AgsTrack *track) { if(!AGS_IS_TRACK(track)){ return(NULL); } return(AGS_TRACK_GET_OBJ_MUTEX(track)); } /** * ags_track_lock: * @track: the #AgsTrack * * Lock object mutex. * * Since: 3.1.0 */ void ags_track_lock(AgsTrack *track) { if(!AGS_IS_TRACK(track)){ return; } g_rec_mutex_lock(AGS_TRACK_GET_OBJ_MUTEX(track)); } /** * ags_track_unlock: * @track: the #AgsTrack * * Unlock object mutex. * * Since: 3.1.0 */ void ags_track_unlock(AgsTrack *track) { if(!AGS_IS_TRACK(track)){ return; } g_rec_mutex_unlock(AGS_TRACK_GET_OBJ_MUTEX(track)); } /** * ags_track_test_flags: * @track: the #AgsTrack * @flags: the flags * * Test @flags to be set on @track. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_track_test_flags(AgsTrack *track, guint flags) { gboolean retval; GRecMutex *track_mutex; if(!AGS_IS_TRACK(track)){ return(FALSE); } /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); /* test */ g_rec_mutex_lock(track_mutex); retval = (flags & (track->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(track_mutex); return(retval); } /** * ags_track_set_flags: * @track: the #AgsTrack * @flags: the flags * * Set @flags on @track. * * Since: 3.0.0 */ void ags_track_set_flags(AgsTrack *track, guint flags) { GRecMutex *track_mutex; if(!AGS_IS_TRACK(track)){ return; } /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); /* set */ g_rec_mutex_lock(track_mutex); track->flags |= flags; g_rec_mutex_unlock(track_mutex); } /** * ags_track_unset_flags: * @track: the #AgsTrack * @flags: the flags * * Unset @flags on @track. * * Since: 3.0.0 */ void ags_track_unset_flags(AgsTrack *track, guint flags) { GRecMutex *track_mutex; if(!AGS_IS_TRACK(track)){ return; } /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); /* unset */ g_rec_mutex_lock(track_mutex); track->flags &= (~flags); g_rec_mutex_unlock(track_mutex); } /** * ags_track_sort_func: * @a: an #AgsTrack * @b: an #AgsTrack * * Sort tracks. * * Returns: 0 if equal, -1 if smaller and 1 if bigger offset * * Since: 3.0.0 */ gint ags_track_sort_func(gconstpointer a, gconstpointer b) { guint64 a_x, b_x ; if(a == NULL || b == NULL){ return(0); } g_object_get(a, "x", &a_x , NULL); g_object_get(b, "x", &b_x , NULL); if(a_x == b_x){ return(0); } if(a_x < b_x){ return(-1); }else{ return(1); } } /** * ags_track_get_x: * @track: the #AgsTrack * * Gets x. * * Returns: the x * * Since: 3.1.0 */ guint64 ags_track_get_x(AgsTrack *track) { guint64 x; if(!AGS_IS_TRACK(track)){ return(0); } g_object_get(track, "x", &x, NULL); return(x); } /** * ags_track_set_x: * @track: the #AgsTrack * @x: the x * * Sets x. * * Since: 3.1.0 */ void ags_track_set_x(AgsTrack *track, guint64 x) { if(!AGS_IS_TRACK(track)){ return; } g_object_set(track, "x", x, NULL); } /** * ags_track_get_data: * @track: the #AgsTrack * @smf_buffer_length: (out): the SMF buffer length return location * * Gets data. * * Returns: the data * * Since: 3.1.0 */ gpointer ags_track_get_smf_buffer(AgsTrack *track, guint *smf_buffer_length) { gpointer smf_buffer; GRecMutex *track_mutex; if(!AGS_IS_TRACK(track)){ return(NULL); } /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); /* set format */ g_rec_mutex_lock(track_mutex); smf_buffer = track->smf_buffer; if(smf_buffer_length != NULL){ smf_buffer_length[0] = track->smf_buffer_length; } g_rec_mutex_unlock(track_mutex); return(smf_buffer); } /** * ags_track_duplicate: * @track: an #AgsTrack * * Duplicate a track. * * Returns: (transfer full): the duplicated #AgsTrack. * * Since: 3.0.0 */ AgsTrack* ags_track_duplicate(AgsTrack *track) { AgsTrack *track_copy; guint copy_mode; GRecMutex *track_mutex; if(!AGS_IS_TRACK(track)){ return(NULL); } /* get track mutex */ track_mutex = AGS_TRACK_GET_OBJ_MUTEX(track); /* instantiate track */ track_copy = ags_track_new(); track_copy->flags = 0; g_rec_mutex_lock(track_mutex); track_copy->x = track->x; // g_object_set(track_copy, // NULL); //TODO:JK: implement me g_rec_mutex_unlock(track_mutex); return(track_copy); } /** * ags_track_new: * * Creates a new instance of #AgsTrack. * * Returns: the new #AgsTrack * * Since: 3.0.0 */ AgsTrack* ags_track_new() { AgsTrack *track; track = (AgsTrack *) g_object_new(AGS_TYPE_TRACK, NULL); return(track); } gsequencer-3.1.3/ags/audio/ags_soundcard_util.c0000644000175000017500000000375013607210263016475 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include /** * SECTION:ags_soundcard_util * @short_description: soundcard util * @title: AgsSoundcardUtil * @section_id: * @include: ags/audio/ags_soundcard_util.h * * Soundcard utility functions. */ /** * ags_soundcard_util_get_obj_mutex: * @soundcard: the #GObject sub-type implementing #AgsSoundcard * * Get object mutex of @soundcard. * * Returns: (transfer none): GRecMutex pointer * * Since: 3.0.0 */ GRecMutex* ags_soundcard_util_get_obj_mutex(GObject *soundcard) { GRecMutex *obj_mutex; obj_mutex = NULL; if(AGS_IS_DEVOUT(soundcard)){ obj_mutex = AGS_DEVOUT_GET_OBJ_MUTEX(soundcard); }else if(AGS_IS_JACK_DEVOUT(soundcard)){ obj_mutex = AGS_JACK_DEVOUT_GET_OBJ_MUTEX(soundcard); }else if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ obj_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(soundcard); }else if(AGS_IS_WASAPI_DEVOUT(soundcard)){ obj_mutex = AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX(soundcard); }else{ g_warning("unknown soundcard implementation"); } return(obj_mutex); } gsequencer-3.1.3/ags/audio/ags_playback.c0000644000175000017500000004443313607210263015247 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_playback_class_init(AgsPlaybackClass *playback); void ags_playback_init(AgsPlayback *playback); void ags_playback_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_playback_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_playback_dispose(GObject *gobject); void ags_playback_finalize(GObject *gobject); /** * SECTION:ags_playback * @short_description: Outputting to soundcard context * @title: AgsPlayback * @section_id: * @include: ags/audio/ags_playback.h * * #AgsPlayback represents a context to output. */ static gpointer ags_playback_parent_class = NULL; enum{ PROP_0, PROP_PLAYBACK_DOMAIN, PROP_CHANNEL, PROP_AUDIO_CHANNEL, PROP_PLAY_NOTE, }; GType ags_playback_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_playback = 0; static const GTypeInfo ags_playback_info = { sizeof(AgsPlaybackClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_playback_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPlayback), 0, /* n_preallocs */ (GInstanceInitFunc) ags_playback_init, }; ags_type_playback = g_type_register_static(G_TYPE_OBJECT, "AgsPlayback", &ags_playback_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_playback); } return g_define_type_id__volatile; } void ags_playback_class_init(AgsPlaybackClass *playback) { GObjectClass *gobject; GParamSpec *param_spec; ags_playback_parent_class = g_type_class_peek_parent(playback); /* GObjectClass */ gobject = (GObjectClass *) playback; gobject->set_property = ags_playback_set_property; gobject->get_property = ags_playback_get_property; gobject->dispose = ags_playback_dispose; gobject->finalize = ags_playback_finalize; /* properties */ /** * AgsPlayback:playback-domain: * * The parent playback domain. * * Since: 3.0.0 */ param_spec = g_param_spec_object("playback-domain", i18n_pspec("parent playback domain"), i18n_pspec("The playback domain it is child of"), AGS_TYPE_PLAYBACK_DOMAIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAYBACK_DOMAIN, param_spec); /** * AgsPlayback:channel: * * The assigned channel. * * Since: 3.0.0 */ param_spec = g_param_spec_object("channel", i18n_pspec("assigned channel"), i18n_pspec("The channel it is assigned with"), AGS_TYPE_CHANNEL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL, param_spec); /** * AgsPlayback:audio-channel: * * The assigned audio channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("assigned audio channel"), i18n_pspec("The audio channel it is assigned with"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsPlayback:play-note: * * The assigned note. * * Since: 3.0.0 */ param_spec = g_param_spec_object("play-note", i18n_pspec("assigned note to play"), i18n_pspec("The note to do playback"), AGS_TYPE_NOTE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLAY_NOTE, param_spec); } void ags_playback_init(AgsPlayback *playback) { AgsConfig *config; gchar *thread_model, *super_threaded_scope; gboolean super_threaded_channel; guint i; playback->flags = 0; /* add playback mutex */ g_rec_mutex_init(&(playback->obj_mutex)); /* config */ config = ags_config_get_instance(); /* thread model */ super_threaded_channel = FALSE; thread_model = ags_config_get_value(config, AGS_CONFIG_THREAD, "model"); if(thread_model != NULL && !g_ascii_strncasecmp(thread_model, "super-threaded", 15)){ super_threaded_scope = ags_config_get_value(config, AGS_CONFIG_THREAD, "super-threaded-scope"); if(super_threaded_scope != NULL && (!g_ascii_strncasecmp(super_threaded_scope, "channel", 8))){ super_threaded_channel = TRUE; } g_free(super_threaded_scope); } g_free(thread_model); /* default flags */ if(super_threaded_channel){ playback->flags |= AGS_PLAYBACK_SUPER_THREADED_CHANNEL; } /* channel */ playback->channel = NULL; playback->audio_channel = 0; playback->play_note = (GObject *) ags_note_new(); g_object_ref(playback->play_note); /* playback domain */ playback->playback_domain = NULL; /* super threaded channel */ playback->channel_thread = (AgsThread **) malloc(AGS_SOUND_SCOPE_LAST * sizeof(AgsThread *)); for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ playback->channel_thread[i] = NULL; } /* recall id */ playback->recall_id = (AgsRecallID **) malloc(AGS_SOUND_SCOPE_LAST * sizeof(AgsRecallID *)); for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ playback->recall_id[i] = NULL; } } void ags_playback_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPlayback *playback; GRecMutex *playback_mutex; playback = AGS_PLAYBACK(gobject); /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); switch(prop_id){ case PROP_PLAYBACK_DOMAIN: { GObject *playback_domain; playback_domain = (GObject *) g_value_get_object(value); g_rec_mutex_lock(playback_mutex); if((GObject *) playback->playback_domain == playback_domain){ g_rec_mutex_unlock(playback_mutex); return; } if(playback->playback_domain != NULL){ g_object_unref(G_OBJECT(playback->playback_domain)); } if(playback_domain != NULL){ g_object_ref(G_OBJECT(playback_domain)); } playback->playback_domain = (GObject *) playback_domain; g_rec_mutex_unlock(playback_mutex); } break; case PROP_CHANNEL: { GObject *channel; channel = (GObject *) g_value_get_object(value); g_rec_mutex_lock(playback_mutex); if(channel == playback->channel){ g_rec_mutex_unlock(playback_mutex); return; } if(playback->channel != NULL){ g_object_unref(G_OBJECT(playback->channel)); } if(channel != NULL){ g_object_ref(G_OBJECT(channel)); AGS_NOTE(playback->play_note)->y = AGS_CHANNEL(channel)->pad; } playback->channel = (GObject *) channel; g_rec_mutex_unlock(playback_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(playback_mutex); playback->audio_channel = g_value_get_uint(value); g_rec_mutex_unlock(playback_mutex); } break; case PROP_PLAY_NOTE: { GObject *note; note = (GObject *) g_value_get_object(value); g_rec_mutex_lock(playback_mutex); if(note == playback->play_note){ g_rec_mutex_unlock(playback_mutex); return; } if(playback->play_note != NULL){ g_object_unref(G_OBJECT(playback->play_note)); } if(note != NULL){ g_object_ref(G_OBJECT(note)); } playback->play_note = (GObject *) note; g_rec_mutex_unlock(playback_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_playback_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPlayback *playback; GRecMutex *playback_mutex; playback = AGS_PLAYBACK(gobject); /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); switch(prop_id){ case PROP_PLAYBACK_DOMAIN: { g_rec_mutex_lock(playback_mutex); g_value_set_object(value, playback->playback_domain); g_rec_mutex_unlock(playback_mutex); } break; case PROP_CHANNEL: { g_rec_mutex_lock(playback_mutex); g_value_set_object(value, playback->channel); g_rec_mutex_unlock(playback_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(playback_mutex); g_value_set_uint(value, playback->audio_channel); g_rec_mutex_unlock(playback_mutex); } break; case PROP_PLAY_NOTE: { g_rec_mutex_lock(playback_mutex); g_value_set_object(value, playback->play_note); g_rec_mutex_unlock(playback_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_playback_dispose(GObject *gobject) { AgsPlayback *playback; guint i; playback = AGS_PLAYBACK(gobject); /* playback domain */ if(playback->playback_domain != NULL){ g_object_unref(playback->playback_domain); playback->playback_domain = NULL; } /* channel */ if(playback->channel != NULL){ g_object_unref(playback->channel); playback->channel = NULL; } /* channel thread */ if(playback->channel_thread != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ if(playback->channel_thread[i] != NULL){ g_object_run_dispose((GObject *) playback->channel_thread[i]); g_object_unref((GObject *) playback->channel_thread[i]); playback->channel_thread[i] = NULL; } } } /* recall id */ if(playback->recall_id != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ if(playback->recall_id[i] != NULL){ g_object_unref(playback->recall_id[i]); playback->recall_id[i] = NULL; } } } /* call parent */ G_OBJECT_CLASS(ags_playback_parent_class)->dispose(gobject); } void ags_playback_finalize(GObject *gobject) { AgsPlayback *playback; guint i; playback = AGS_PLAYBACK(gobject); /* playback domain */ if(playback->playback_domain != NULL){ g_object_unref(playback->playback_domain); } /* channel */ if(playback->channel != NULL){ g_object_unref(playback->channel); } /* channel thread */ if(playback->channel_thread != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ if(playback->channel_thread[i] != NULL){ g_object_run_dispose((GObject *) playback->channel_thread[i]); g_object_unref((GObject *) playback->channel_thread[i]); } } free(playback->channel_thread); } /* recall id */ if(playback->recall_id != NULL){ for(i = 0; i < AGS_SOUND_SCOPE_LAST; i++){ if(playback->recall_id[i] != NULL){ g_object_unref(playback->recall_id[i]); } } free(playback->recall_id); } /* call parent */ G_OBJECT_CLASS(ags_playback_parent_class)->finalize(gobject); } /** * ags_playback_test_flags: * @playback: the #AgsPlayback * @flags: the flags * * Test @flags to be set on @playback. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_playback_test_flags(AgsPlayback *playback, guint flags) { gboolean retval; GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback)){ return(FALSE); } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* test */ g_rec_mutex_lock(playback_mutex); retval = (flags & (playback->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(playback_mutex); return(retval); } /** * ags_playback_set_flags: * @playback: the #AgsPlayback * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_playback_set_flags(AgsPlayback *playback, guint flags) { GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback)){ return; } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* set flags */ g_rec_mutex_lock(playback_mutex); playback->flags |= flags; g_rec_mutex_unlock(playback_mutex); } /** * ags_playback_unset_flags: * @playback: the #AgsPlayback * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_playback_unset_flags(AgsPlayback *playback, guint flags) { GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback)){ return; } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* set flags */ g_rec_mutex_lock(playback_mutex); playback->flags &= (~flags); g_rec_mutex_unlock(playback_mutex); } /** * ags_playback_set_channel_thread: * @playback: the #AgsPlayback * @thread: the #AgsChannelThread * @sound_scope: the scope of the thread to set * * Set channel thread of appropriate scope. * * Since: 3.0.0 */ void ags_playback_set_channel_thread(AgsPlayback *playback, AgsThread *thread, gint sound_scope) { GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return; } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* unset old */ g_rec_mutex_lock(playback_mutex); if(playback->channel_thread[sound_scope] != NULL){ if(ags_thread_test_status_flags(playback->channel_thread[sound_scope], AGS_THREAD_STATUS_RUNNING)){ ags_thread_stop(playback->channel_thread[sound_scope]); } g_object_run_dispose((GObject *) playback->channel_thread[sound_scope]); g_object_unref((GObject *) playback->channel_thread[sound_scope]); } /* set new */ if(thread != NULL){ g_object_ref(thread); } playback->channel_thread[sound_scope] = thread; g_rec_mutex_unlock(playback_mutex); } /** * ags_playback_get_channel_thread: * @playback: the #AgsPlayback * @sound_scope: the scope of the thread to get * * Get channel thread of appropriate scope. * * Returns: (transfer full): the matching #AgsThread or %NULL * * Since: 3.0.0 */ AgsThread* ags_playback_get_channel_thread(AgsPlayback *playback, gint sound_scope) { AgsThread *channel_thread; GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return(NULL); } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* get channel thread */ g_rec_mutex_lock(playback_mutex); channel_thread = (playback->channel_thread != NULL) ? playback->channel_thread[sound_scope]: NULL; if(channel_thread != NULL){ g_object_ref(channel_thread); } g_rec_mutex_unlock(playback_mutex); return(channel_thread); } /** * ags_playback_set_recall_id: * @playback: the #AgsPlayback * @recall_id: the #AgsRecallID * @sound_scope: the scope of the recall id to set * * Set recall id of appropriate scope. * * Since: 3.0.0 */ void ags_playback_set_recall_id(AgsPlayback *playback, AgsRecallID *recall_id, gint sound_scope) { GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return; } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* unref old */ g_rec_mutex_lock(playback_mutex); if(playback->recall_id[sound_scope] != NULL){ g_object_unref(playback->recall_id[sound_scope]); } /* ref new */ if(recall_id != NULL){ g_object_ref(recall_id); } /* set recall id */ playback->recall_id[sound_scope] = recall_id; g_rec_mutex_unlock(playback_mutex); } /** * ags_playback_get_recall_id: * @playback: the #AgsPlayback * @sound_scope: the scope of the recall id to get * * Get recall id of appropriate scope. * * Returns: (transfer full): the matching #AgsRecallID or %NULL * * Since: 3.0.0 */ AgsRecallID* ags_playback_get_recall_id(AgsPlayback *playback, gint sound_scope) { AgsRecallID *recall_id; GRecMutex *playback_mutex; if(!AGS_IS_PLAYBACK(playback) || sound_scope >= AGS_SOUND_SCOPE_LAST){ return(NULL); } /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback); /* get recall id */ g_rec_mutex_lock(playback_mutex); if(playback->recall_id == NULL){ g_rec_mutex_unlock(playback_mutex); return(NULL); } recall_id = playback->recall_id[sound_scope]; if(recall_id != NULL){ g_object_ref(recall_id); } g_rec_mutex_unlock(playback_mutex); return(recall_id); } /** * ags_playback_find_channel: * @playback: (element-type AgsAudio.Playback) (transfer none): the #GList-struct containing #AgsPlayback * @channel: the #AgsChannel * * Find @channel in @playback. * * Returns: (transfer none): the matching playback * * Since: 3.0.0 */ AgsPlayback* ags_playback_find_channel(GList *playback, GObject *channel) { GRecMutex *playback_mutex; while(playback != NULL){ /* get playback mutex */ playback_mutex = AGS_PLAYBACK_GET_OBJ_MUTEX(playback->data); /* check channel */ g_rec_mutex_lock(playback_mutex); if(AGS_PLAYBACK(playback->data)->channel == channel){ g_rec_mutex_unlock(playback_mutex); return(playback->data); } g_rec_mutex_unlock(playback_mutex); /* iterate */ playback = playback->next; } return(NULL); } /** * ags_playback_new: * @channel: the #AgsChannel * * Instantiate a playback object and assign @channel. * * Returns: the new #AgsPlayback * * Since: 3.0.0 */ AgsPlayback* ags_playback_new(GObject *channel) { AgsPlayback *playback; playback = (AgsPlayback *) g_object_new(AGS_TYPE_PLAYBACK, "channel", channel, NULL); return(playback); } gsequencer-3.1.3/ags/audio/ags_fourier_transform_util.h0000644000175000017500000002362213607210263020266 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FOURIER_TRANSFORM_UTIL_H__ #define __AGS_FOURIER_TRANSFORM_UTIL_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S8_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ static const gdouble normalize_factor = M_PI / 127.0; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * normalize_factor) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ static const gdouble normalize_factor = M_PI / 32767.0; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * normalize_factor) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S24_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ static const gdouble normalize_factor = M_PI / 8388607.0; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * normalize_factor) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S32_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ static const gdouble normalize_factor = M_PI / 214748363.0; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * normalize_factor) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S64_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ static const long double normalize_factor = M_PI / 9223372036854775807.0; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * normalize_factor) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_FLOAT_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * M_PI) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_h; \ gdouble l_k; \ gdouble l_r; \ \ l_k = (gdouble) x_n; \ l_r = (gdouble) x_n; \ \ l_h = AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x_n - l_r); \ \ l_z = (x_buffer[0] * M_PI) * l_h * cexp(-1.0 * I * 2.0 * M_PI * l_k * l_r); \ \ ags_complex_set(x_retval[0], l_z); } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S8_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ static const gdouble scale = 127.0 / M_PI; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = scale * l_y; } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ static const gdouble scale = 32767.0 / M_PI; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = scale * l_y; } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S24_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ static const gdouble scale = 8388607.0 / M_PI; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = scale * l_y; } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S32_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ static const gdouble scale = 214748363.0 / M_PI; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = scale * l_y; } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S64_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ static const long double scale = 9223372036854775807.0 / M_PI; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = scale * l_y; } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_FLOAT_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = l_y / M_PI; } #define AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME(x_buffer, x_channels, x_n, x_buffer_length, x_retval) { complex l_z; \ gdouble l_k; \ gdouble l_y; \ \ l_z = ags_complex_get(x_buffer); \ \ l_k = (gdouble) x_n; \ \ l_y = (l_z * cexp(I * 2.0 * M_PI * l_k * x_n)); \ \ x_retval[0][0] = l_y / M_PI; } #define AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW(x) (x + 1.0) void ags_fourier_transform_util_compute_stft_s8(gint8 *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_compute_stft_s16(gint16 *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_compute_stft_s24(gint32 *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_compute_stft_s32(gint32 *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_compute_stft_s64(gint64 *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_compute_stft_float(gfloat *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_compute_stft_double(gdouble *buffer, guint channels, guint buffer_length, AgsComplex **retval); void ags_fourier_transform_util_inverse_stft_s8(AgsComplex *buffer, guint channels, guint buffer_length, gint8 **retval); void ags_fourier_transform_util_inverse_stft_s16(AgsComplex *buffer, guint channels, guint buffer_length, gint16 **retval); void ags_fourier_transform_util_inverse_stft_s24(AgsComplex *buffer, guint channels, guint buffer_length, gint32 **retval); void ags_fourier_transform_util_inverse_stft_s32(AgsComplex *buffer, guint channels, guint buffer_length, gint32 **retval); void ags_fourier_transform_util_inverse_stft_s64(AgsComplex *buffer, guint channels, guint buffer_length, gint64 **retval); void ags_fourier_transform_util_inverse_stft_float(AgsComplex *buffer, guint channels, guint buffer_length, gfloat **retval); void ags_fourier_transform_util_inverse_stft_double(AgsComplex *buffer, guint channels, guint buffer_length, gdouble **retval); G_END_DECLS #endif /*__AGS_FOURIER_TRANSFORM_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_lfo_synth_util.c0000644000175000017500000014557713607210263016536 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include /** * SECTION:ags_lfo_synth_util * @short_description: low frequency oscillator synth util * @title: AgsLFOSynthUtil * @section_id: * @include: ags/audio/ags_lfo_synth_util.h * * Utility functions to compute LFO synths. */ /** * ags_lfo_synth_util_sin_s8: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth))); } } /** * ags_lfo_synth_util_sin_s16: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth))); } } /** * ags_lfo_synth_util_sin_s24: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth))); } } /** * ags_lfo_synth_util_sin_s32: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth))); } } /** * ags_lfo_synth_util_sin_s64: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth))); } } /** * ags_lfo_synth_util_sin_float: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (float) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth)); } } /** * ags_lfo_synth_util_sin_double: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ buffer[i] = (double) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth)); } } /** * ags_lfo_synth_util_sin_complex: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sinus wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ y = (gdouble) (tuning / 1200.0 + sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) * depth); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_lfo_synth_util_sawtooth_s8: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * depth))); } } /** * ags_lfo_synth_util_sawtooth_s16: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * depth))); } } /** * ags_lfo_synth_util_sawtooth_s24: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * depth))); } } /** * ags_lfo_synth_util_sawtooth_s32: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * depth))); } } /** * ags_lfo_synth_util_sawtooth_s64: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0) * depth))); } } /** * ags_lfo_synth_util_sawtooth_float: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] * (double) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0))); } } /** * ags_lfo_synth_util_sawtooth_double: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] * (double) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0))); } } /** * ags_lfo_synth_util_sawtooth_complex: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < offset + n_frames; i++){ y = (double) (tuning / 1200.0 + ((((int) ceil(i + phase) % (int) ceil(samplerate / freq)) * 2.0 * freq / samplerate) - 1.0)); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_lfo_synth_util_triangle_s8: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) ((((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * depth))); } } /** * ags_lfo_synth_util_triangle_s16: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * depth))); } } /** * ags_lfo_synth_util_triangle_s24: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * depth))); } } /** * ags_lfo_synth_util_triangle_s32: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * depth))); } } /** * ags_lfo_synth_util_triangle_s64: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = (gint64) (0xffffffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0) * depth))); } } /** * ags_lfo_synth_util_triangle_float: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] * (double) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0))); } } /** * ags_lfo_synth_util_triangle_double: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); for(i = offset; i < offset + n_frames; i++){ buffer[i] = ((double) buffer[i] * (double) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0))); } } /** * ags_lfo_synth_util_triangle_complex: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; phase = (int) ceil(phase) % (int) ceil(freq); phase = ceil(phase / freq) * ceil(samplerate / freq); c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < offset + n_frames; i++){ y = (double) (tuning / 1200.0 + (((phase + i) * freq / samplerate * 2.0) - ((int) ((double) ((int) ((phase + i) * freq / samplerate)) / 2.0) * 2) - 1.0)); AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_lfo_synth_util_square_s8: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_square_s16: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_square_s24: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_square_s32: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_square_s64: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (gint64) (0xffffffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_square_float: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] * (tuning / 1200.0 + 1.0 * depth)); }else{ buffer[i] = (buffer[i] * (tuning / 1200.0 + -1.0 * depth)); } } } /** * ags_lfo_synth_util_square_double: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ buffer[i] = (buffer[i] * (tuning / 1200.0 + 1.0 * depth)); }else{ buffer[i] = (buffer[i] * (tuning / 1200.0 + -1.0 * depth)); } } } /** * ags_lfo_synth_util_square_complex: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= 0.0){ y = (tuning / 1200.0 + 1.0 * depth); }else{ y = (tuning / 1200.0 + -1.0 * depth); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_lfo_synth_util_impulse_s8: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_s8(gint8 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint8) (0xff & (gint16) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_impulse_s16: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_s16(gint16 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint16) (0xffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_impulse_s24: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_s24(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint32) (0xffffffff & (gint32) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_impulse_s32: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_s32(gint32 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint32) (0xffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_impulse_s64: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_s64(gint64 *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (gint64) (0xffffffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + 1.0 * depth))); }else{ buffer[i] = (gint64) (0xffffffffffffffff & (gint64) ((gdouble) buffer[i] * (gdouble) (tuning / 1200.0 + -1.0 * depth))); } } } /** * ags_lfo_synth_util_impulse_float: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_float(float *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] * (tuning / 1200.0 + 1.0 * depth)); }else{ buffer[i] = (buffer[i] * (tuning / 1200.0 + -1.0 * depth)); } } } /** * ags_lfo_synth_util_impulse_double: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_double(double *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { guint i; for(i = offset; i < offset + n_frames; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ buffer[i] = (buffer[i] * (tuning / 1200.0 + 1.0 * depth)); }else{ buffer[i] = (buffer[i] * (tuning / 1200.0 + -1.0 * depth)); } } } /** * ags_lfo_synth_util_impulse_complex: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse_complex(AgsComplex *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint offset, guint n_frames) { AgsComplex c; AgsComplex *c_ptr; AgsComplex **c_ptr_ptr; double *y_ptr; double y; complex z0, z1; guint i_stop; guint i; c_ptr = &c; c_ptr_ptr = &c_ptr; y_ptr = &y; i_stop = offset + n_frames; for(i = offset; i < i_stop; i++){ if(sin((gdouble) (i + phase) * 2.0 * M_PI * freq / (gdouble) samplerate) >= sin(2.0 * M_PI * 3.0 / 5.0)){ y = (tuning / 1200.0 + 1.0 * depth); }else{ y = (tuning / 1200.0 + -1.0 * depth); } AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME(y_ptr, 1, i - offset, i_stop - offset, c_ptr_ptr); z0 = ags_complex_get(buffer + i); z1 = ags_complex_get(c_ptr); ags_complex_set(buffer + i, z0 + z1); } } /** * ags_lfo_synth_util_sin: * @buffer: the audio buffer * @freq: the frequency of the sin wave * @phase: the phase of the sin wave * @depth: the depth of the sin wave * @tuning: the tuning of the sin wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * LFO using sin wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sin(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_lfo_synth_util_sin_s8((gint8 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_lfo_synth_util_sin_s16((gint16 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_lfo_synth_util_sin_s24((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_lfo_synth_util_sin_s32((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_lfo_synth_util_sin_s64((gint64 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_lfo_synth_util_sin_float((float *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_lfo_synth_util_sin_double((double *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_lfo_synth_util_sin_complex((AgsComplex *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; default: { g_warning("ags_lfo_synth_util_sin() - unsupported format"); } } } /** * ags_lfo_synth_util_sawtooth: * @buffer: the audio buffer * @freq: the frequency of the sawtooth wave * @phase: the phase of the sawtooth wave * @depth: the depth of the sawtooth wave * @tuning: the tuning of the sawtooth wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * LFO using sawtooth wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_sawtooth(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_lfo_synth_util_sawtooth_s8((gint8 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_lfo_synth_util_sawtooth_s16((gint16 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_lfo_synth_util_sawtooth_s24((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_lfo_synth_util_sawtooth_s32((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_lfo_synth_util_sawtooth_s64((gint64 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_lfo_synth_util_sawtooth_float((float *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_lfo_synth_util_sawtooth_double((double *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_lfo_synth_util_sawtooth_complex((AgsComplex *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; default: { g_warning("ags_lfo_synth_util_sawtooth() - unsupported format"); } } } /** * ags_lfo_synth_util_triangle: * @buffer: the audio buffer * @freq: the frequency of the triangle wave * @phase: the phase of the triangle wave * @depth: the depth of the triangle wave * @tuning: the tuning of the triangle wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * LFO using triangle wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_triangle(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_lfo_synth_util_triangle_s8((gint8 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_lfo_synth_util_triangle_s16((gint16 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_lfo_synth_util_triangle_s24((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_lfo_synth_util_triangle_s32((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_lfo_synth_util_triangle_s64((gint64 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_lfo_synth_util_triangle_float((float *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_lfo_synth_util_triangle_double((double *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_lfo_synth_util_triangle_complex((AgsComplex *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; default: { g_warning("ags_lfo_synth_util_triangle() - unsupported format"); } } } /** * ags_lfo_synth_util_square: * @buffer: the audio buffer * @freq: the frequency of the square wave * @phase: the phase of the square wave * @depth: the depth of the square wave * @tuning: the tuning of the square wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * LFO using square wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_square(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_lfo_synth_util_square_s8((gint8 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_lfo_synth_util_square_s16((gint16 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_lfo_synth_util_square_s24((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_lfo_synth_util_square_s32((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_lfo_synth_util_square_s64((gint64 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_lfo_synth_util_square_float((float *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_lfo_synth_util_square_double((double *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_lfo_synth_util_square_complex((AgsComplex *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; default: { g_warning("ags_lfo_synth_util_square() - unsupported format"); } } } /** * ags_lfo_synth_util_impulse: * @buffer: the audio buffer * @freq: the frequency of the impulse wave * @phase: the phase of the impulse wave * @depth: the depth of the impulse wave * @tuning: the tuning of the impulse wave * @samplerate: the samplerate * @audio_buffer_util_format: the audio data format * @offset: start frame * @n_frames: generate n frames * * LFO using impulse wave. * * Since: 3.0.0 */ void ags_lfo_synth_util_impulse(void *buffer, gdouble freq, gdouble phase, gdouble depth, gdouble tuning, guint samplerate, guint audio_buffer_util_format, guint offset, guint n_frames) { switch(audio_buffer_util_format){ case AGS_AUDIO_BUFFER_UTIL_S8: { ags_lfo_synth_util_impulse_s8((gint8 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S16: { ags_lfo_synth_util_impulse_s16((gint16 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S24: { ags_lfo_synth_util_impulse_s24((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S32: { ags_lfo_synth_util_impulse_s32((gint32 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_S64: { ags_lfo_synth_util_impulse_s64((gint64 *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_FLOAT: { ags_lfo_synth_util_impulse_float((float *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_DOUBLE: { ags_lfo_synth_util_impulse_double((double *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; case AGS_AUDIO_BUFFER_UTIL_COMPLEX: { ags_lfo_synth_util_impulse_complex((AgsComplex *) buffer, freq, phase, depth, tuning, samplerate, offset, n_frames); } break; default: { g_warning("ags_lfo_synth_util_impulse() - unsupported format"); } } } gsequencer-3.1.3/ags/audio/ags_audio_application_context.h0000644000175000017500000000560413607210263020713 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_APPLICATION_CONTEXT_H__ #define __AGS_AUDIO_APPLICATION_CONTEXT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_APPLICATION_CONTEXT (ags_audio_application_context_get_type()) #define AGS_AUDIO_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_APPLICATION_CONTEXT, AgsAudioApplicationContext)) #define AGS_AUDIO_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_APPLICATION_CONTEXT, AgsAudioApplicationContextClass)) #define AGS_IS_AUDIO_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_APPLICATION_CONTEXT)) #define AGS_IS_AUDIO_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_APPLICATION_CONTEXT)) #define AGS_AUDIO_APPLICATION_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_APPLICATION_CONTEXT, AgsAudioApplicationContextClass)) #define AGS_AUDIO_DEFAULT_VERSION "3.0.0" #define AGS_AUDIO_BUILD_ID "Fri Nov 8 21:47:01 UTC 2019" #define AGS_EFFECTS_DEFAULT_VERSION "0.7.13" typedef struct _AgsAudioApplicationContext AgsAudioApplicationContext; typedef struct _AgsAudioApplicationContextClass AgsAudioApplicationContextClass; struct _AgsAudioApplicationContext { AgsApplicationContext application_context; guint flags; AgsThreadPool *thread_pool; GList *worker; GMainContext *server_main_context; gboolean is_operating; AgsServerStatus *server_status; AgsRegistry *registry; GList *server; GMainContext *audio_main_context; GMainContext *osc_server_main_context; GObject *default_soundcard; AgsThread *default_soundcard_thread; AgsThread *default_export_thread; GList *soundcard; GList *sequencer; GList *audio; GList *sound_server; GList *osc_server; }; struct _AgsAudioApplicationContextClass { AgsApplicationContextClass application_context; }; GType ags_audio_application_context_get_type(); AgsAudioApplicationContext* ags_audio_application_context_new(); G_END_DECLS #endif /*__AGS_AUDIO_APPLICATION_CONTEXT_H__*/ gsequencer-3.1.3/ags/audio/ags_track.h0000644000175000017500000000537113616617253014602 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TRACK_H__ #define __AGS_TRACK_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TRACK (ags_track_get_type()) #define AGS_TRACK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TRACK, AgsTrack)) #define AGS_TRACK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TRACK, AgsTrackClass)) #define AGS_IS_TRACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_TRACK)) #define AGS_IS_TRACK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_TRACK)) #define AGS_TRACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_TRACK, AgsTrackClass)) #define AGS_TRACK_GET_OBJ_MUTEX(obj) (&(((AgsTrack *) obj)->obj_mutex)) #define AGS_TRACK_DEFAULT_TICKS_PER_QUARTER_TRACK (16.0) typedef struct _AgsTrack AgsTrack; typedef struct _AgsTrackClass AgsTrackClass; /** * AgsTrackFlags: * @AGS_TRACK_IS_SELECTED: is selected * * Enum values to control the behavior or indicate internal state of #AgsTrack by * enable/disable as flags. */ typedef enum{ AGS_TRACK_IS_SELECTED = 1, }AgsTrackFlags; struct _AgsTrack { GObject gobject; guint flags; GRecMutex obj_mutex; guint64 x; unsigned char *smf_buffer; guint smf_buffer_length; }; struct _AgsTrackClass { GObjectClass gobject; }; GType ags_track_get_type(); GRecMutex* ags_track_get_obj_mutex(AgsTrack *track); void ags_track_lock(AgsTrack *track); void ags_track_unlock(AgsTrack *track); gboolean ags_track_test_flags(AgsTrack *track, guint flags); void ags_track_set_flags(AgsTrack *track, guint flags); void ags_track_unset_flags(AgsTrack *track, guint flags); gint ags_track_sort_func(gconstpointer a, gconstpointer b); guint64 ags_track_get_x(AgsTrack *track); void ags_track_set_x(AgsTrack *track, guint64 x); gpointer ags_track_get_smf_buffer(AgsTrack *track, guint *smf_buffer_length); AgsTrack* ags_track_duplicate(AgsTrack *track); AgsTrack* ags_track_new(); G_END_DECLS #endif /*__AGS_TRACK_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_audio.c0000644000175000017500000002733413616617253016117 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_recall_audio_class_init(AgsRecallAudioClass *recall_audio); void ags_recall_audio_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_audio_init(AgsRecallAudio *recall_audio); void ags_recall_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_audio_dispose(GObject *gobject); void ags_recall_audio_finalize(GObject *gobject); void ags_recall_audio_automate(AgsRecall *recall); AgsRecall* ags_recall_audio_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); /** * SECTION:ags_recall_audio * @short_description: audio context of recall * @title: AgsRecallAudio * @section_id: * @include: ags/audio/ags_recall_audio.h * * #AgsRecallAudio acts as audio recall. */ enum{ PROP_0, PROP_AUDIO, }; static gpointer ags_recall_audio_parent_class = NULL; static AgsConnectableInterface* ags_recall_audio_parent_connectable_interface; GType ags_recall_audio_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_audio = 0; static const GTypeInfo ags_recall_audio_info = { sizeof (AgsRecallAudioClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_audio_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallAudio), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_audio_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_audio_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_audio = g_type_register_static(AGS_TYPE_RECALL, "AgsRecallAudio", &ags_recall_audio_info, 0); g_type_add_interface_static(ags_type_recall_audio, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_audio); } return g_define_type_id__volatile; } void ags_recall_audio_class_init(AgsRecallAudioClass *recall_audio) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_audio_parent_class = g_type_class_peek_parent(recall_audio); /* GObjectClass */ gobject = (GObjectClass *) recall_audio; gobject->dispose = ags_recall_audio_dispose; gobject->finalize = ags_recall_audio_finalize; gobject->set_property = ags_recall_audio_set_property; gobject->get_property = ags_recall_audio_get_property; /* properties */ /** * AgsRecallAudio:audio: * * The assigned audio. * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("assigned audio"), i18n_pspec("The audio object it is assigned to"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /* AgsRecallClass */ recall = (AgsRecallClass *) recall_audio; recall->automate = ags_recall_audio_automate; recall->duplicate = ags_recall_audio_duplicate; } void ags_recall_audio_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_audio_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_audio_init(AgsRecallAudio *recall_audio) { recall_audio->flags = 0; recall_audio->audio = NULL; } void ags_recall_audio_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallAudio *recall_audio; GRecMutex *recall_mutex; recall_audio = AGS_RECALL_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(gobject); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(recall_mutex); if(recall_audio->audio == audio){ g_rec_mutex_unlock(recall_mutex); return; } if(recall_audio->audio != NULL){ g_object_unref(recall_audio->audio); } if(audio != NULL){ g_object_ref(audio); } recall_audio->audio = audio; g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_audio_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallAudio *recall_audio; GRecMutex *recall_mutex; recall_audio = AGS_RECALL_AUDIO(gobject); /* get recall mutex */ recall_mutex = AGS_RECALL_GET_OBJ_MUTEX(gobject); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(recall_mutex); g_value_set_object(value, recall_audio->audio); g_rec_mutex_unlock(recall_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_audio_dispose(GObject *gobject) { AgsRecallAudio *recall_audio; recall_audio = AGS_RECALL_AUDIO(gobject); /* audio */ if(recall_audio->audio != NULL){ g_object_unref(G_OBJECT(recall_audio->audio)); recall_audio->audio = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_audio_parent_class)->dispose(gobject); } void ags_recall_audio_finalize(GObject *gobject) { AgsRecallAudio *recall_audio; recall_audio = AGS_RECALL_AUDIO(gobject); /* audio */ if(recall_audio->audio != NULL){ g_object_unref(G_OBJECT(recall_audio->audio)); } /* call parent */ G_OBJECT_CLASS(ags_recall_audio_parent_class)->finalize(gobject); } void ags_recall_audio_automate(AgsRecall *recall) { AgsAudio *audio; GObject *soundcard; GList *automation_start, *automation; GList *port_start, *port; gdouble delay; guint note_offset, delay_counter; guint loop_left, loop_right; gboolean do_loop; double x, step; guint ret_x; gboolean return_prev_on_failure; GRecMutex *audio_mutex; g_object_get(recall, "audio", &audio, NULL); audio_mutex = AGS_AUDIO_GET_OBJ_MUTEX(audio); g_rec_mutex_lock(audio_mutex); if(audio->automation_port == NULL){ g_rec_mutex_unlock(audio_mutex); return; } g_rec_mutex_unlock(audio_mutex); g_object_get(audio, "output-soundcard", &soundcard, NULL); g_object_get(recall, "port", &port_start, NULL); /* retrieve position */ note_offset = ags_soundcard_get_note_offset(AGS_SOUNDCARD(soundcard)); delay = ags_soundcard_get_delay(AGS_SOUNDCARD(soundcard)); delay_counter = ags_soundcard_get_delay_counter(AGS_SOUNDCARD(soundcard)); /* retrieve loop information */ ags_soundcard_get_loop(AGS_SOUNDCARD(soundcard), &loop_left, &loop_right, &do_loop); return_prev_on_failure = TRUE; if(do_loop && loop_left <= note_offset){ if(note_offset == loop_left){ return_prev_on_failure = TRUE; } } /* apply automation */ port = port_start; x = ((double) note_offset + (delay_counter / delay)) * ((1.0 / AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH) * AGS_NOTATION_MINIMUM_NOTE_LENGTH); step = ((1.0 / AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH) * AGS_NOTATION_MINIMUM_NOTE_LENGTH); while(port != NULL){ gchar *specifier; gboolean success; g_object_get(AGS_PORT(port->data), "specifier", &specifier, NULL); g_rec_mutex_lock(audio_mutex); success = g_strv_contains(audio->automation_port, specifier); g_rec_mutex_unlock(audio_mutex); g_free(specifier); if(!success){ /* iterate */ port = port->next; continue; } g_object_get(AGS_PORT(port->data), "automation", &automation_start, NULL); /* find offset */ automation = automation_start; while(automation != NULL){ AgsAutomation *current_automation; AgsTimestamp *timestamp; current_automation = automation->data; /* get some fields */ g_object_get(current_automation, "timestamp", ×tamp, NULL); if(ags_timestamp_get_ags_offset(timestamp) + AGS_AUTOMATION_DEFAULT_OFFSET < x){ automation = automation->next; g_object_unref(timestamp); continue; } if(!ags_automation_test_flags(current_automation, AGS_AUTOMATION_BYPASS)){ GValue value = {0,}; ret_x = ags_automation_get_value(current_automation, floor(x), ceil(x + step), return_prev_on_failure, &value); if(ret_x != G_MAXUINT){ ags_port_safe_write(port->data, &value); } } if(ags_timestamp_get_ags_offset(timestamp) > ceil(x + step)){ g_object_unref(timestamp); break; } /* unref */ g_object_unref(timestamp); /* iterate */ automation = automation->next; } g_list_free_full(automation_start, g_object_unref); /* iterate */ port = port->next; } g_object_unref(audio); g_object_unref(soundcard); g_list_free_full(port_start, g_object_unref); } AgsRecall* ags_recall_audio_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value) { AgsRecallAudio *copy_recall_audio; /* duplicate */ copy_recall_audio = AGS_RECALL_AUDIO(AGS_RECALL_CLASS(ags_recall_audio_parent_class)->duplicate(recall, recall_id, n_params, parameter_name, value)); g_warning("ags_recall_audio_duplicate - you shouldn't do this %s", G_OBJECT_TYPE_NAME(recall)); return((AgsRecall *) copy_recall_audio); } /** * ags_recall_audio_get_audio: * @recall_audio: the #AgsRecallAudio * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ AgsAudio* ags_recall_audio_get_audio(AgsRecallAudio *recall_audio) { AgsAudio *audio; if(!AGS_IS_RECALL_AUDIO(recall_audio)){ return(NULL); } g_object_get(recall_audio, "audio", &audio, NULL); return(audio); } /** * ags_recall_audio_set_audio: * @recall_audio: the #AgsRecallAudio * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_recall_audio_set_audio(AgsRecallAudio *recall_audio, AgsAudio *audio) { if(!AGS_IS_RECALL_AUDIO(recall_audio)){ return; } g_object_set(recall_audio, "audio", audio, NULL); } /** * ags_recall_audio_new: * @audio: the assigned #AgsAudio * * Creates an #AgsRecallAudio. * * Returns: a new #AgsRecallAudio. * * Since: 3.0.0 */ AgsRecallAudio* ags_recall_audio_new(AgsAudio *audio) { AgsRecallAudio *recall_audio; recall_audio = (AgsRecallAudio *) g_object_new(AGS_TYPE_RECALL_AUDIO, "audio", audio, NULL); return(recall_audio); } gsequencer-3.1.3/ags/audio/ags_recycling_context.c0000644000175000017500000007070713613101164017203 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_recycling_context_class_init(AgsRecyclingContextClass *recycling_context_class); void ags_recycling_context_init(AgsRecyclingContext *recycling_context); void ags_recycling_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recycling_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recycling_context_dispose(GObject *gobject); void ags_recycling_context_finalize(GObject *gobject); /** * SECTION:ags_recycling_context * @short_description: A context of recycling acting as dynamic context. * @title: AgsRecyclingContext * @section_id: * @include: ags/audio/ags_recycling_context.h * * #AgsRecyclingContext organizes #AgsRecycling objects as dynamic context * within nested tree. */ enum{ PROP_0, PROP_RECALL_ID, PROP_PARENT, PROP_CHILD, PROP_LENGTH, }; static gpointer ags_recycling_context_parent_class = NULL; GType ags_recycling_context_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recycling_context = 0; static const GTypeInfo ags_recycling_context_info = { sizeof (AgsRecyclingContextClass), (GBaseInitFunc) NULL, /* base_init */ (GBaseFinalizeFunc) NULL, /* base_finalize */ (GClassInitFunc) ags_recycling_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecyclingContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recycling_context_init, }; ags_type_recycling_context = g_type_register_static(G_TYPE_OBJECT, "AgsRecyclingContext", &ags_recycling_context_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_recycling_context); } return g_define_type_id__volatile; } void ags_recycling_context_class_init(AgsRecyclingContextClass *recycling_context) { GObjectClass *gobject; GParamSpec *param_spec; ags_recycling_context_parent_class = g_type_class_peek_parent(recycling_context); gobject = (GObjectClass *) recycling_context; gobject->set_property = ags_recycling_context_set_property; gobject->get_property = ags_recycling_context_get_property; gobject->dispose = ags_recycling_context_dispose; gobject->finalize = ags_recycling_context_finalize; /* properties */ /** * AgsRecyclingContext:recall-id: * * The assigned #AgsRecallID. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recall-id", i18n_pspec("the default recall id"), i18n_pspec("The recall id located in audio object as destiny"), AGS_TYPE_RECALL_ID, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECALL_ID, param_spec); /** * AgsRecyclingContext:parent: * * The parent recycling context within tree. * * Since: 3.0.0 */ param_spec = g_param_spec_object("parent", i18n_pspec("parent context"), i18n_pspec("The context this one is packed into"), AGS_TYPE_RECYCLING_CONTEXT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PARENT, param_spec); /** * AgsRecyclingContext:child: (type GList(AgsRecyclingContext)) (transfer full) * * The child recycling contexts. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("child", i18n_pspec("child context"), i18n_pspec("The child context"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHILD, param_spec); /** * AgsRecyclingContext:length: * * Boundary length. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("length", i18n_pspec("length of the array of assigned recycling"), i18n_pspec("The recycling array length"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LENGTH, param_spec); } void ags_recycling_context_init(AgsRecyclingContext *recycling_context) { recycling_context->flags = 0; recycling_context->sound_scope = 0; /* recycling context mutex */ g_rec_mutex_init(&(recycling_context->obj_mutex)); /* recall id */ recycling_context->recall_id = NULL; /* parent and child */ recycling_context->parent = NULL; recycling_context->children = NULL; /* context */ recycling_context->recycling = NULL; recycling_context->length = 0; } void ags_recycling_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecyclingContext *recycling_context; GRecMutex *recycling_context_mutex; recycling_context = AGS_RECYCLING_CONTEXT(gobject); /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); switch(prop_id){ case PROP_RECALL_ID: { AgsRecallID *recall_id; recall_id = (AgsRecallID *) g_value_get_object(value); g_rec_mutex_lock(recycling_context_mutex); if(recycling_context->recall_id == (GObject *) recall_id){ g_rec_mutex_unlock(recycling_context_mutex); return; } if(recycling_context->recall_id != NULL){ g_object_unref(G_OBJECT(recycling_context->recall_id)); } if(recall_id != NULL){ g_object_ref(G_OBJECT(recall_id)); } recycling_context->recall_id = (GObject *) recall_id; g_rec_mutex_unlock(recycling_context_mutex); } break; case PROP_PARENT: { AgsRecyclingContext *parent; parent = (AgsRecyclingContext *) g_value_get_object(value); g_rec_mutex_lock(recycling_context_mutex); if(recycling_context->parent == parent){ g_rec_mutex_unlock(recycling_context_mutex); return; } if(recycling_context->parent != NULL){ g_object_unref(recycling_context->parent); } if(parent != NULL){ g_object_ref(parent); } recycling_context->parent = parent; g_rec_mutex_unlock(recycling_context_mutex); } break; case PROP_CHILD: { AgsRecyclingContext *child; child = (AgsRecyclingContext *) g_value_get_pointer(value); g_rec_mutex_lock(recycling_context_mutex); if(!AGS_IS_RECYCLING_CONTEXT(child) || g_list_find(recycling_context->children, child) != NULL){ g_rec_mutex_unlock(recycling_context_mutex); return; } g_rec_mutex_unlock(recycling_context_mutex); ags_recycling_context_add_child(recycling_context, child); } break; case PROP_LENGTH: { guint64 length, old_length; guint64 i; length = g_value_get_uint64(value); g_rec_mutex_lock(recycling_context_mutex); if(length == 0){ if(recycling_context->recycling != NULL){ free(recycling_context->recycling); } recycling_context->recycling = NULL; recycling_context->length = 0; g_rec_mutex_unlock(recycling_context_mutex); return; } if(recycling_context->recycling == NULL){ recycling_context->recycling = (AgsRecycling **) malloc(length * sizeof(AgsRecycling *)); old_length = 0; }else{ recycling_context->recycling = (AgsRecycling **) realloc(recycling_context->recycling, length * sizeof(AgsRecycling *)); old_length = recycling_context->length; } recycling_context->length = length; for(i = old_length; i < length; i++){ recycling_context->recycling[i] = NULL; } g_rec_mutex_unlock(recycling_context_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recycling_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecyclingContext *recycling_context; GRecMutex *recycling_context_mutex; recycling_context = AGS_RECYCLING_CONTEXT(gobject); /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); switch(prop_id){ case PROP_RECALL_ID: { g_rec_mutex_lock(recycling_context_mutex); g_value_set_object(value, recycling_context->recall_id); g_rec_mutex_unlock(recycling_context_mutex); } break; case PROP_PARENT: { g_rec_mutex_lock(recycling_context_mutex); g_value_set_object(value, recycling_context->parent); g_rec_mutex_unlock(recycling_context_mutex); } break; case PROP_CHILD: { g_rec_mutex_lock(recycling_context_mutex); g_value_set_pointer(value, g_list_copy_deep(recycling_context->children, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(recycling_context_mutex); } break; case PROP_LENGTH: { g_rec_mutex_lock(recycling_context_mutex); g_value_set_uint64(value, recycling_context->length); g_rec_mutex_unlock(recycling_context_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recycling_context_dispose(GObject *gobject) { AgsRecyclingContext *recycling_context; GList *list_start, *list; guint i; recycling_context = AGS_RECYCLING_CONTEXT(gobject); /* parent */ if(recycling_context->parent != NULL){ g_object_unref(recycling_context->parent); recycling_context->parent = NULL; } /* recall id */ if(recycling_context->recall_id != NULL){ g_object_unref(recycling_context->recall_id); recycling_context->recall_id = NULL; } /* recycling */ if(recycling_context->recycling != NULL){ for(i = 0; i < recycling_context->length; i++){ g_object_unref(recycling_context->recycling[i]); } free(recycling_context->recycling); recycling_context->recycling = NULL; recycling_context->length = 0; } /* children */ list = list_start = g_list_copy_deep(recycling_context->children, (GCopyFunc) g_object_ref, NULL); while(list != NULL){ ags_recycling_context_remove_child(recycling_context, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recycling_context_parent_class)->dispose(gobject); } void ags_recycling_context_finalize(GObject *gobject) { AgsRecyclingContext *recycling_context; GList *list; guint i; recycling_context = AGS_RECYCLING_CONTEXT(gobject); /* parent */ if(recycling_context->parent != NULL){ g_object_unref(recycling_context->parent); } /* recall id */ if(recycling_context->recall_id != NULL){ g_object_unref(recycling_context->recall_id); } /* recycling */ if(recycling_context->recycling != NULL){ for(i = 0; i < recycling_context->length; i++){ g_object_unref(recycling_context->recycling[i]); } free(recycling_context->recycling); } /* children */ g_list_free_full(recycling_context->children, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_recycling_context_parent_class)->finalize(gobject); } /** * ags_recycling_context_find_scope: * @recycling_context: (element-type AgsAudio.RecyclingContext) (transfer none): the #GList-struct containing #AgsRecyclingContext * @sound_scope: the sound scope * * Find matching @sound_scope in @recycling_context. * * Returns: (element-type AgsAudio.RecyclingContext) (transfer none): the matching #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_recycling_context_find_scope(GList *recycling_context, gint sound_scope) { gboolean success; GRecMutex *recycling_context_mutex; while(recycling_context != NULL){ AgsRecyclingContext *current; current = AGS_RECYCLING_CONTEXT(recycling_context->data); /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(current); /* check success */ g_rec_mutex_lock(recycling_context_mutex); success = (current->sound_scope == sound_scope) ? TRUE: FALSE; g_rec_mutex_unlock(recycling_context_mutex); if(success){ break; } recycling_context = recycling_context->next; } return(recycling_context); } /** * ags_recycling_context_replace: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to add * @position: the index of @recycling * * Replaces one recycling entry in a context. * * Since: 3.0.0 */ void ags_recycling_context_replace(AgsRecyclingContext *recycling_context, AgsRecycling *recycling, gint position) { AgsRecycling *old_recycling; guint64 length; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); length = recycling_context->length; g_rec_mutex_unlock(recycling_context_mutex); if(position >= length){ return; } /* replace */ g_rec_mutex_lock(recycling_context_mutex); old_recycling = recycling_context->recycling[position]; recycling_context->recycling[position] = recycling; g_rec_mutex_unlock(recycling_context_mutex); /* ref count */ if(old_recycling != NULL){ g_object_unref(old_recycling); } if(recycling != NULL){ g_object_ref(recycling); } } /** * ags_recycling_context_add: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to add * * Adds a recycling to a context. * * Since: 3.0.0 */ void ags_recycling_context_add(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { gint new_length; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); new_length = recycling_context->length + 1; g_rec_mutex_unlock(recycling_context_mutex); /* resize */ g_object_set(recycling_context, "length", (guint64) new_length, NULL); /* */ recycling_context->recycling[new_length - 1] = recycling; /* ref count */ g_object_ref(recycling); } /** * ags_recycling_context_remove: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to remove * * Removes a recycling in a context. * * Since: 3.0.0 */ void ags_recycling_context_remove(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { AgsRecycling **old_context; gint new_length; guint i, j; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); if(recycling_context->length > 0){ old_context = (AgsRecycling **) malloc(recycling_context->length * sizeof(AgsRecycling *)); memcpy(old_context, recycling_context->recycling, recycling_context->length * sizeof(AgsRecycling *)); new_length = recycling_context->length - 1; }else{ old_context = NULL; new_length = 0; } g_rec_mutex_unlock(recycling_context_mutex); /* resize */ g_object_set(recycling_context, "length", (guint64) new_length, NULL); /* reset */ g_rec_mutex_lock(recycling_context_mutex); for(i = 0, j = 0; i < new_length; i++){ if(old_context[i] != recycling){ recycling_context->recycling[j] = old_context[i]; j++; } } g_rec_mutex_unlock(recycling_context_mutex); /* ref count */ g_object_unref(recycling); /* free old context */ g_free(old_context); } /** * ags_recycling_context_insert: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to insert * @position: the index to insert at * * Inserts a recycling to a context. * * Since: 3.0.0 */ void ags_recycling_context_insert(AgsRecyclingContext *recycling_context, AgsRecycling *recycling, gint position) { AgsRecycling **old_context; gint new_length; guint i, j; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return; } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); if(recycling_context->length > 0){ old_context = (AgsRecycling **) malloc(recycling_context->length * sizeof(AgsRecycling *)); memcpy(old_context, recycling_context->recycling, recycling_context->length * sizeof(AgsRecycling *)); }else{ old_context = NULL; } new_length = recycling_context->length + 1; g_rec_mutex_unlock(recycling_context_mutex); /* resize */ g_object_set(recycling_context, "length", (guint64) new_length, NULL); /* reset */ g_rec_mutex_lock(recycling_context_mutex); for(i = 0, j = 0; i < new_length - 1; i++){ if(i != position){ recycling_context->recycling[i] = old_context[j]; j++; } } recycling_context->recycling[position] = recycling; g_rec_mutex_unlock(recycling_context_mutex); /* ref count */ g_object_ref(recycling); if(old_context != NULL){ free(old_context); } } /** * ags_recycling_context_get_toplevel: * @recycling_context: the #AgsRecyclingContext * * Iterates the tree up to highest level. * * Returns: (transfer full): the topmost recycling context * * Since: 3.0.0 */ AgsRecyclingContext* ags_recycling_context_get_toplevel(AgsRecyclingContext *recycling_context) { AgsRecyclingContext *parent; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return(NULL); } do{ /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); parent = recycling_context->parent; g_rec_mutex_unlock(recycling_context_mutex); }while(parent != NULL && (recycling_context = parent) != NULL); return(recycling_context); } /** * ags_recycling_context_find: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to look up * * Find position of recycling within array. * * Returns: recycling array index * * Since: 3.0.0 */ gint ags_recycling_context_find(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { gint i; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return(-1); } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* find */ g_rec_mutex_lock(recycling_context_mutex); for(i = 0; i < recycling_context->length; i++){ if(recycling_context->recycling[i] == recycling){ g_rec_mutex_unlock(recycling_context_mutex); return(i); } } g_rec_mutex_unlock(recycling_context_mutex); return(-1); } /** * ags_recycling_context_find_child: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to look up * * Find position of recycling within arrays. * * Returns: recycling array index * * Since: 3.0.0 */ gint ags_recycling_context_find_child(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { GList *child_start, *child; gint i; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return(-1); } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get child */ g_rec_mutex_lock(recycling_context_mutex); child = child_start = g_list_copy_deep(recycling_context->children, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recycling_context_mutex); for(i = 0; child != NULL; i++){ if(ags_recycling_context_find(AGS_RECYCLING_CONTEXT(child->data), recycling) != -1){ g_list_free(child_start); return(i); } child = child->next; } g_list_free_full(child_start, g_object_unref); return(-1); } /** * ags_recycling_context_find_parent: * @recycling_context: the #AgsRecyclingContext * @recycling: the #AgsRecycling to look up * * Find position of recycling within array. * * Returns: recycling array index * * Since: 3.0.0 */ gint ags_recycling_context_find_parent(AgsRecyclingContext *recycling_context, AgsRecycling *recycling) { AgsRecyclingContext *parent; gint i; GRecMutex *recycling_context_mutex; GRecMutex *parent_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context) || !AGS_IS_RECYCLING(recycling)){ return(-1); } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get parent */ g_rec_mutex_lock(recycling_context_mutex); parent = recycling_context->parent; g_rec_mutex_unlock(recycling_context_mutex); if(parent != NULL){ /* get parent mutex */ parent_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(parent); /* find */ g_rec_mutex_lock(parent_mutex); for(i = 0; i < parent->length; i++){ if(parent->recycling[i] == recycling){ g_rec_mutex_unlock(parent_mutex); return(i); } } g_rec_mutex_unlock(parent_mutex); } return(-1); } /** * ags_recycling_context_add_child: * @parent: the parental #AgsRecyclingContext * @child: the child * * Adds a recycling context as child. * * Since: 3.0.0 */ void ags_recycling_context_add_child(AgsRecyclingContext *parent, AgsRecyclingContext *child) { GRecMutex *parent_mutex; if(!AGS_IS_RECYCLING_CONTEXT(parent) || !AGS_IS_RECYCLING_CONTEXT(child)){ return; } g_object_set(child, "parent", parent, NULL); /* get parent mutex */ parent_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(parent); /* add child */ g_rec_mutex_lock(parent_mutex); if(g_list_find(parent->children, child) == NULL){ parent->children = g_list_append(parent->children, child); g_object_ref(child); } g_rec_mutex_unlock(parent_mutex); } /** * ags_recycling_context_remove_child: * @parent: the #AgsRecyclingContext * @child: the child to remove * * Removes a recycling context of its parent. * * Since: 3.0.0 */ void ags_recycling_context_remove_child(AgsRecyclingContext *parent, AgsRecyclingContext *child) { GRecMutex *parent_mutex; if(!AGS_IS_RECYCLING_CONTEXT(parent) || !AGS_IS_RECYCLING_CONTEXT(child)){ return; } g_object_set(child, "parent", NULL, NULL); /* get parent mutex */ parent_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(parent); /* remove child */ g_rec_mutex_lock(parent_mutex); if(g_list_find(parent->children, child) != NULL){ parent->children = g_list_remove(parent->children, child); g_object_unref(child); } g_rec_mutex_unlock(parent_mutex); } /** * ags_recycling_context_get_child_recall_id: * @recycling_context: the #AgsRecyclingContext * * Retrieve all child recall ids. * * Returns: (element-type AgsAudio.RecallID) (transfer full): the #AgsRecallID as #GList-struct * * Since: 3.0.0 */ GList* ags_recycling_context_get_child_recall_id(AgsRecyclingContext *recycling_context) { GList *child_start, *child; GList *recall_id_list; GRecMutex *recycling_context_mutex; GRecMutex *child_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return(NULL); } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); child = child_start = g_list_copy_deep(recycling_context->children, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recycling_context_mutex); recall_id_list = NULL; while(child != NULL){ /* get recycling context mutex */ child_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(child->data); /* */ g_rec_mutex_lock(child_mutex); if(AGS_RECYCLING_CONTEXT(child->data)->recall_id != NULL){ recall_id_list = g_list_prepend(recall_id_list, AGS_RECYCLING_CONTEXT(child->data)->recall_id); } g_rec_mutex_unlock(child_mutex); child = child->next; } g_list_free_full(child_start, g_object_unref); /* reverse the result */ recall_id_list = g_list_reverse(recall_id_list); return(recall_id_list); } /** * ags_recycling_context_reset_recycling: * @recycling_context: the #AgsRecyclingContext * @old_first_recycling: the first recycling to replace * @old_last_recycling: the last recycling to replace * @new_first_recycling: the first recycling to insert * @new_last_recycling: the last recycling to insert * * Modify recycling of context. * * Returns: (transfer full): the new #AgsRecyclingContext * * Since: 3.0.0 */ AgsRecyclingContext* ags_recycling_context_reset_recycling(AgsRecyclingContext *recycling_context, AgsRecycling *old_first_recycling, AgsRecycling *old_last_recycling, AgsRecycling *new_first_recycling, AgsRecycling *new_last_recycling) { AgsRecycling *recycling; AgsRecyclingContext *new_recycling_context; AgsRecyclingContext *parent; GList *child_start, *child; gint new_length; guint i; GRecMutex *recycling_mutex; GRecMutex *recycling_context_mutex; if(!AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return(NULL); } parent = NULL; /* retrieve new length */ new_length = ags_recycling_position(new_first_recycling, old_last_recycling, old_last_recycling); new_length++; /* instantiate */ new_recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, "length", (guint64) new_length, NULL); recycling = new_first_recycling; for(i = 0; i < new_length; i++){ /* get parent mutex */ recycling_mutex = AGS_RECYCLING_GET_OBJ_MUTEX(recycling); /* set context */ new_recycling_context->recycling[i] = recycling; g_object_ref(recycling); /* iterate */ g_rec_mutex_lock(recycling_mutex); recycling = recycling->next; g_rec_mutex_unlock(recycling_mutex); } /* get recycling context mutex */ recycling_context_mutex = AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX(recycling_context); /* get some fields */ g_rec_mutex_lock(recycling_context_mutex); child = child_start = g_list_copy_deep(recycling_context->children, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(recycling_context_mutex); while(child != NULL){ g_object_set(new_recycling_context, "child", child->data, NULL); child = child->next; } if(parent != NULL){ g_object_set(parent, "child", new_recycling_context, NULL); } g_list_free_full(child_start, g_object_unref); /* dispose old recycling context */ g_object_run_dispose((GObject *) recycling_context); return(new_recycling_context); } /** * ags_recycling_context_new: * @length: array dimension of context * * Creates a #AgsRecyclingContext, boundaries are specified by @length * * Returns: a new #AgsRecyclingContext * * Since: 3.0.0 */ AgsRecyclingContext* ags_recycling_context_new(guint64 length) { AgsRecyclingContext *recycling_context; recycling_context = g_object_new(AGS_TYPE_RECYCLING_CONTEXT, "length", length, NULL); return(recycling_context); } gsequencer-3.1.3/ags/audio/ags_wave.h0000644000175000017500000001302213616617253014430 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WAVE_H__ #define __AGS_WAVE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_WAVE (ags_wave_get_type()) #define AGS_WAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WAVE, AgsWave)) #define AGS_WAVE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_WAVE, AgsWaveClass)) #define AGS_IS_WAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WAVE)) #define AGS_IS_WAVE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WAVE)) #define AGS_WAVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_WAVE, AgsWaveClass)) #define AGS_WAVE_GET_OBJ_MUTEX(obj) (&(((AgsWave *) obj)->obj_mutex)) #define AGS_WAVE_DEFAULT_BPM (120.0) #define AGS_WAVE_TICS_PER_BEAT (1.0) #define AGS_WAVE_MINIMUM_BUFFER_LENGTH (1.0 / 16.0) #define AGS_WAVE_DEFAULT_BUFFER_LENGTH (64.0) #define AGS_WAVE_DEFAULT_LENGTH (65535.0 / AGS_WAVE_TICS_PER_BEAT - AGS_WAVE_MINIMUM_BUFFER_LENGTH) #define AGS_WAVE_DEFAULT_JIFFIE (60.0 / AGS_WAVE_DEFAULT_BPM / AGS_WAVE_TICS_PER_BEAT) #define AGS_WAVE_DEFAULT_DURATION (AGS_WAVE_DEFAULT_LENGTH * AGS_WAVE_DEFAULT_JIFFIE * AGS_USEC_PER_SEC) #define AGS_WAVE_DEFAULT_OFFSET (AGS_WAVE_DEFAULT_BUFFER_LENGTH * AGS_SOUNDCARD_DEFAULT_SAMPLERATE) #define AGS_WAVE_CLIPBOARD_VERSION "1.4.0" #define AGS_WAVE_CLIPBOARD_TYPE "AgsWaveClipboardXml" #define AGS_WAVE_CLIPBOARD_FORMAT "AgsWaveNativeLevel" typedef struct _AgsWave AgsWave; typedef struct _AgsWaveClass AgsWaveClass; /** * AgsWaveFlags: * @AGS_WAVE_BYPASS: ignore any wave data * * Enum values to control the behavior or indicate internal state of #AgsWave by * enable/disable as flags. */ typedef enum{ AGS_WAVE_BYPASS = 1, }AgsWaveFlags; struct _AgsWave { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio; guint line; guint64 duration; guint samplerate; guint buffer_size; guint format; AgsTimestamp *timestamp; GList *buffer; GList *selection; }; struct _AgsWaveClass { GObjectClass gobject; }; GType ags_wave_get_type(void); GRecMutex* ags_wave_get_obj_mutex(AgsWave *wave); gboolean ags_wave_test_flags(AgsWave *wave, guint flags); void ags_wave_set_flags(AgsWave *wave, guint flags); void ags_wave_unset_flags(AgsWave *wave, guint flags); GList* ags_wave_find_near_timestamp(GList *wave, guint line, AgsTimestamp *timestamp); gint ags_wave_sort_func(gconstpointer a, gconstpointer b); GObject* ags_wave_get_audio(AgsWave *wave); void ags_wave_set_audio(AgsWave *wave, GObject *audio); guint ags_wave_get_line(AgsWave *wave); void ags_wave_set_line(AgsWave *wave, guint line); guint ags_wave_get_samplerate(AgsWave *wave); void ags_wave_set_samplerate(AgsWave *wave, guint samplerate); guint ags_wave_get_buffer_size(AgsWave *wave); void ags_wave_set_buffer_size(AgsWave *wave, guint buffer_size); guint ags_wave_get_format(AgsWave *wave); void ags_wave_set_format(AgsWave *wave, guint format); AgsTimestamp* ags_wave_get_timestamp(AgsWave *wave); void ags_wave_set_timestamp(AgsWave *wave, AgsTimestamp *timestamp); GList* ags_wave_get_buffer(AgsWave *wave); void ags_wave_set_buffer(AgsWave *wave, GList *buffer); GList* ags_wave_add(GList *wave, AgsWave *new_wave); void ags_wave_add_buffer(AgsWave *wave, AgsBuffer *buffer, gboolean use_selection_list); void ags_wave_remove_buffer(AgsWave *wave, AgsBuffer *buffer, gboolean use_selection_list); GList* ags_wave_get_selection(AgsWave *wave); gboolean ags_wave_is_buffer_selected(AgsWave *wave, AgsBuffer *buffer); AgsBuffer* ags_wave_find_point(AgsWave *wave, guint64 x, gboolean use_selection_list); GList* ags_wave_find_region(AgsWave *wave, guint64 x0, guint64 x1, gboolean use_selection_list); void ags_wave_free_selection(AgsWave *wave); void ags_wave_add_region_to_selection(AgsWave *wave, guint64 x0, guint64 x1, gboolean replace_current_selection); void ags_wave_remove_region_from_selection(AgsWave *wave, guint64 x0, guint64 x1); void ags_wave_add_all_to_selection(AgsWave *wave); xmlNode* ags_wave_copy_selection(AgsWave *wave); xmlNode* ags_wave_cut_selection(AgsWave *wave); void ags_wave_insert_from_clipboard(AgsWave *wave, xmlNode *wave_node, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack); void ags_wave_insert_from_clipboard_extended(AgsWave *wave, xmlNode *wave_node, gboolean reset_x_offset, guint64 x_offset, gdouble delay, guint attack, gboolean match_line, gboolean do_replace); AgsWave* ags_wave_new(GObject *audio, guint line); G_END_DECLS #endif /*__AGS_WAVE_H__*/ gsequencer-3.1.3/ags/audio/ags_diatonic_scale.h0000644000175000017500000000214113607210263016415 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DIATONIC_SCALE_H__ #define __AGS_DIATONIC_SCALE_H__ #include #include #include G_BEGIN_DECLS guint ags_diatonic_scale_note_to_midi_key(gchar *note, glong *key); guint ags_diatonic_scale_midi_key_to_note(glong key, gchar **note); G_END_DECLS #endif /*__AGS_DIATONIC_SCALE_H__*/ gsequencer-3.1.3/ags/audio/ags_playback.h0000644000175000017500000000661213607210263015251 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAYBACK_H__ #define __AGS_PLAYBACK_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAYBACK (ags_playback_get_type()) #define AGS_PLAYBACK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAYBACK, AgsPlayback)) #define AGS_PLAYBACK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PLAYBACK, AgsPlayback)) #define AGS_IS_PLAYBACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAYBACK)) #define AGS_IS_PLAYBACK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAYBACK)) #define AGS_PLAYBACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PLAYBACK, AgsPlaybackClass)) #define AGS_PLAYBACK_GET_OBJ_MUTEX(obj) (&(((AgsPlayback *) obj)->obj_mutex)) typedef struct _AgsPlayback AgsPlayback; typedef struct _AgsPlaybackClass AgsPlaybackClass; /** * AgsPlaybackFlags: * @AGS_PLAYBACK_CONNECTED: indicates the playback was connected by calling #AgsConnectable::connect() * @AGS_PLAYBACK_SINGLE_THREADED: single threaded * @AGS_PLAYBACK_SUPER_THREADED_CHANNEL: super threaded channel * * Enum values to control the behavior or indicate internal state of #AgsPlayback by * enable/disable as flags. */ typedef enum{ AGS_PLAYBACK_CONNECTED = 1, AGS_PLAYBACK_SINGLE_THREADED = 1 << 1, AGS_PLAYBACK_SUPER_THREADED_CHANNEL = 1 << 2, }AgsPlaybackFlags; struct _AgsPlayback { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *playback_domain; GObject *channel; guint audio_channel; GObject *play_note; AgsThread **channel_thread; AgsRecallID **recall_id; }; struct _AgsPlaybackClass { GObjectClass gobject; }; GType ags_playback_get_type(); gboolean ags_playback_test_flags(AgsPlayback *playback, guint flags); void ags_playback_set_flags(AgsPlayback *playback, guint flags); void ags_playback_unset_flags(AgsPlayback *playback, guint flags); /* get and set */ void ags_playback_set_channel_thread(AgsPlayback *playback, AgsThread *thread, gint sound_scope); AgsThread* ags_playback_get_channel_thread(AgsPlayback *playback, gint sound_scope); void ags_playback_set_recall_id(AgsPlayback *playback, AgsRecallID *recall_id, gint sound_scope); AgsRecallID* ags_playback_get_recall_id(AgsPlayback *playback, gint sound_scope); /* find */ AgsPlayback* ags_playback_find_channel(GList *playback, GObject *channel); /* instance */ AgsPlayback* ags_playback_new(GObject *channel); G_END_DECLS #endif /*__AGS_PLAYBACK_H__*/ gsequencer-3.1.3/ags/audio/ags_port.h0000644000175000017500000001047413607210263014450 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PORT_H__ #define __AGS_PORT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PORT (ags_port_get_type()) #define AGS_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PORT, AgsPort)) #define AGS_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PORT, AgsPortClass)) #define AGS_IS_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PORT)) #define AGS_IS_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PORT)) #define AGS_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PORT, AgsPortClass)) #define AGS_PORT_GET_OBJ_MUTEX(obj) (&(((AgsPort *) obj)->obj_mutex)) typedef struct _AgsPort AgsPort; typedef struct _AgsPortClass AgsPortClass; /** * AgsPortFlags: * @AGS_PORT_ADDED_TO_REGISTRY: add to registry * @AGS_PORT_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_PORT_CONVERT_ALWAYS: convert always * @AGS_PORT_USE_LADSPA_FLOAT: use ladspa float * @AGS_PORT_IS_OUTPUT: is output * @AGS_PORT_INFINITE_RANGE: infinite range * * Enum values to control the behavior or indicate internal state of #AgsPort by * enable/disable as flags. */ typedef enum{ AGS_PORT_ADDED_TO_REGISTRY = 1, AGS_PORT_CONNECTED = 1 << 1, AGS_PORT_CONVERT_ALWAYS = 1 << 2, AGS_PORT_USE_LADSPA_FLOAT = 1 << 3, AGS_PORT_IS_OUTPUT = 1 << 4, AGS_PORT_INFINITE_RANGE = 1 << 5, }AgsPortFlags; struct _AgsPort { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gchar *plugin_name; gchar *specifier; gchar *control_port; gboolean port_value_is_pointer; GType port_value_type; guint port_value_size; guint port_value_length; GObject *plugin_port; AgsConversion *conversion; GList *automation; union _AgsPortValue{ gboolean ags_port_boolean; gint64 ags_port_int; guint64 ags_port_uint; gfloat ags_port_float; LADSPA_Data ags_port_ladspa; gdouble ags_port_double; AgsComplex ags_port_complex; gchar *ags_port_string; gboolean *ags_port_boolean_ptr; gint64 *ags_port_int_ptr; guint64 *ags_port_uint_ptr; gfloat *ags_port_float_ptr; gdouble *ags_port_double_ptr; AgsComplex *ags_port_complex_ptr; gpointer ags_port_pointer; GObject *ags_port_object; }port_value; }; struct _AgsPortClass { GObjectClass gobject; void (*safe_read)(AgsPort *port, GValue *value); void (*safe_write)(AgsPort *port, GValue *value); void (*safe_get_property)(AgsPort *port, gchar *property_name, GValue *value); void (*safe_set_property)(AgsPort *port, gchar *property_name, GValue *value); }; GType ags_port_get_type(); gboolean ags_port_test_flags(AgsPort *port, guint flags); void ags_port_set_flags(AgsPort *port, guint flags); void ags_port_unset_flags(AgsPort *port, guint flags); void ags_port_safe_read(AgsPort *port, GValue *value); void ags_port_safe_read_raw(AgsPort *port, GValue *value); void ags_port_safe_write(AgsPort *port, GValue *value); void ags_port_safe_write_raw(AgsPort *port, GValue *value); void ags_port_safe_get_property(AgsPort *port, gchar *property_name, GValue *value); void ags_port_safe_set_property(AgsPort *port, gchar *property_name, GValue *value); GList* ags_port_find_specifier(GList *port, gchar *specifier); void ags_port_add_automation(AgsPort *port, GObject *automation); void ags_port_remove_automation(AgsPort *port, GObject *automation); AgsPort* ags_port_new(); G_END_DECLS #endif /*__AGS_PORT_H__*/ gsequencer-3.1.3/ags/audio/ags_midi.h0000644000175000017500000000766313616617253014426 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MIDI_H__ #define __AGS_MIDI_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MIDI (ags_midi_get_type()) #define AGS_MIDI(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MIDI, AgsMidi)) #define AGS_MIDI_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_MIDI, AgsMidiClass)) #define AGS_IS_MIDI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MIDI)) #define AGS_IS_MIDI_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MIDI)) #define AGS_MIDI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_MIDI, AgsMidiClass)) #define AGS_MIDI_GET_OBJ_MUTEX(obj) (&(((AgsMidi *) obj)->obj_mutex)) #define AGS_MIDI_DEFAULT_BPM (120.0) #define AGS_MIDI_TICS_PER_BEAT (1.0) #define AGS_MIDI_MINIMUM_TRACK_LENGTH (1.0 / 16.0) #define AGS_MIDI_DEFAULT_LENGTH (65535.0 / AGS_MIDI_TICS_PER_BEAT - AGS_MIDI_MINIMUM_TRACK_LENGTH) #define AGS_MIDI_DEFAULT_JIFFIE (60.0 / AGS_MIDI_DEFAULT_BPM / AGS_MIDI_TICS_PER_BEAT) #define AGS_MIDI_DEFAULT_DURATION (AGS_MIDI_DEFAULT_LENGTH * AGS_MIDI_DEFAULT_JIFFIE * AGS_USEC_PER_SEC) #define AGS_MIDI_DEFAULT_OFFSET (64 * (1 / AGS_MIDI_MINIMUM_TRACK_LENGTH)) #define AGS_MIDI_CLIPBOARD_VERSION "1.4.0" #define AGS_MIDI_CLIPBOARD_TYPE "AgsMidiClipboardXml" #define AGS_MIDI_CLIPBOARD_FORMAT "AgsMidiNativeLevel" typedef struct _AgsMidi AgsMidi; typedef struct _AgsMidiClass AgsMidiClass; /** * AgsMidiFlags: * @AGS_MIDI_BYPASS: ignore any midi data * * Enum values to control the behavior or indicate internal state of #AgsMidi by * enable/disable as flags. */ typedef enum{ AGS_MIDI_BYPASS = 1, }AgsMidiFlags; struct _AgsMidi { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio; guint audio_channel; AgsTimestamp *timestamp; GList *track; GList *selection; }; struct _AgsMidiClass { GObjectClass gobject; }; GType ags_midi_get_type(void); GRecMutex* ags_midi_get_obj_mutex(AgsMidi *midi); gboolean ags_midi_test_flags(AgsMidi *midi, guint flags); void ags_midi_set_flags(AgsMidi *midi, guint flags); void ags_midi_unset_flags(AgsMidi *midi, guint flags); GList* ags_midi_find_near_timestamp(GList *midi, guint audio_channel, AgsTimestamp *timestamp); gint ags_midi_sort_func(gconstpointer a, gconstpointer b); GObject* ags_midi_get_audio(AgsMidi *midi); void ags_midi_set_audio(AgsMidi *midi, GObject *audio); guint ags_midi_get_audio_channel(AgsMidi *midi); void ags_midi_set_audio_channel(AgsMidi *midi, guint audio_channel); AgsTimestamp* ags_midi_get_timestamp(AgsMidi *midi); void ags_midi_set_timestamp(AgsMidi *midi, AgsTimestamp *timestamp); GList* ags_midi_get_track(AgsMidi *midi); void ags_midi_set_track(AgsMidi *midi, GList *track); GList* ags_midi_add(GList *midi, AgsMidi *new_midi); void ags_midi_add_track(AgsMidi *midi, AgsTrack *track, gboolean use_selection_list); void ags_midi_remove_track(AgsMidi *midi, AgsTrack *track, gboolean use_selection_list); AgsMidi* ags_midi_new(GObject *audio, guint audio_channel); G_END_DECLS #endif /*__AGS_MIDI_H__*/ gsequencer-3.1.3/ags/audio/ags_pattern.h0000644000175000017500000001016213616617253015145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PATTERN_H__ #define __AGS_PATTERN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PATTERN (ags_pattern_get_type()) #define AGS_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_PATTERN, AgsPattern)) #define AGS_PATTERN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PATTERN, AgsPatternClass)) #define AGS_IS_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PATTERN)) #define AGS_IS_PATTERN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PATTERN)) #define AGS_PATTERN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PATTERN, AgsPatternClass)) #define AGS_PATTERN_GET_OBJ_MUTEX(obj) (&(((AgsPattern *) obj)->obj_mutex)) #define AGS_PATTERN_DEFAULT_BPM (120.0) #define AGS_PATTERN_TICS_PER_BEAT (1.0) #define AGS_PATTERN_MINIMUM_NOTE_LENGTH (1.0 / 16.0) #define AGS_PATTERN_MAXIMUM_NOTE_LENGTH (16.0) #define AGS_PATTERN_DEFAULT_LENGTH (65535.0 / AGS_PATTERN_TICS_PER_BEAT - AGS_PATTERN_MAXIMUM_NOTE_LENGTH) #define AGS_PATTERN_DEFAULT_JIFFIE (60.0 / AGS_PATTERN_DEFAULT_BPM / AGS_PATTERN_TICS_PER_BEAT) #define AGS_PATTERN_DEFAULT_DURATION (AGS_PATTERN_DEFAULT_LENGTH * AGS_PATTERN_DEFAULT_JIFFIE * AGS_USEC_PER_SEC) #define AGS_PATTERN_DEFAULT_OFFSET (64) typedef struct _AgsPattern AgsPattern; typedef struct _AgsPatternClass AgsPatternClass; /** * AgsPatternFlags: * @AGS_PATTERN_ADDED_TO_REGISTRY: the pattern was added to registry, see #AgsConnectable::add_to_registry() * @AGS_PATTERN_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsPattern by * enable/disable as flags. */ typedef enum{ AGS_PATTERN_ADDED_TO_REGISTRY = 1, AGS_PATTERN_CONNECTED = 1 << 1, }AgsPatternFlags; struct _AgsPattern { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *channel; AgsTimestamp *timestamp; guint dim[3]; guint ***pattern; GObject *port; guint i; guint j; guint bit; }; struct _AgsPatternClass { GObjectClass gobject; }; GType ags_pattern_get_type(); GRecMutex* ags_pattern_get_obj_mutex(AgsPattern *pattern); gboolean ags_pattern_test_flags(AgsPattern *pattern, guint flags); void ags_pattern_set_flags(AgsPattern *pattern, guint flags); void ags_pattern_unset_flags(AgsPattern *pattern, guint flags); GList* ags_pattern_find_near_timestamp(GList *pattern, AgsTimestamp *timestamp); GObject* ags_pattern_get_channel(AgsPattern *pattern); void ags_pattern_set_channel(AgsPattern *pattern, GObject *channel); AgsTimestamp* ags_pattern_get_timestamp(AgsPattern *pattern); void ags_pattern_set_timestamp(AgsPattern *pattern, AgsTimestamp *timestamp); void ags_pattern_get_dim(AgsPattern *pattern, guint *dim0, guint *dim1, guint *length); void ags_pattern_set_dim(AgsPattern *pattern, guint dim0, guint dim1, guint length); GObject* ags_pattern_get_port(AgsPattern *pattern); void ags_pattern_set_port(AgsPattern *pattern, GObject *port); gboolean ags_pattern_is_empty(AgsPattern *pattern, guint i, guint j); gboolean ags_pattern_get_bit(AgsPattern *pattern, guint i, guint j, guint bit); void ags_pattern_toggle_bit(AgsPattern *pattern, guint i, guint j, guint bit); AgsPattern* ags_pattern_new(); G_END_DECLS #endif /*__AGS_PATTERN_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_factory.h0000644000175000017500000000601413607210263016450 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_FACTORY_H__ #define __AGS_RECALL_FACTORY_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_FACTORY (ags_recall_factory_get_type()) #define AGS_RECALL_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_FACTORY, AgsRecallFactory)) #define AGS_RECALL_FACTORY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_FACTORY, AgsRecallFactoryClass)) #define AGS_IS_RECALL_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_FACTORY)) #define AGS_IS_RECALL_FACTORY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_FACTORY)) #define AGS_RECALL_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_FACTORY, AgsRecallFactoryClass)) typedef struct _AgsRecallFactory AgsRecallFactory; typedef struct _AgsRecallFactoryClass AgsRecallFactoryClass; /** * AgsRecallFactoryCreateFlags: * @AGS_RECALL_FACTORY_OUTPUT: output related * @AGS_RECALL_FACTORY_INPUT: input related * @AGS_RECALL_FACTORY_REMAP: remap * @AGS_RECALL_FACTORY_ADD: do add * @AGS_RECALL_FACTORY_PLAY: bounded to play * @AGS_RECALL_FACTORY_RECALL: bounded to recall * @AGS_RECALL_FACTORY_BULK: operates on bulk mode * * Enum values controlling instantiating the recall implementation. */ typedef enum{ AGS_RECALL_FACTORY_OUTPUT = 1, AGS_RECALL_FACTORY_INPUT = 1 << 1, AGS_RECALL_FACTORY_REMAP = 1 << 2, AGS_RECALL_FACTORY_ADD = 1 << 3, AGS_RECALL_FACTORY_PLAY = 1 << 4, AGS_RECALL_FACTORY_RECALL = 1 << 5, AGS_RECALL_FACTORY_BULK = 1 << 6, }AgsRecallFactoryCreateFlags; struct _AgsRecallFactory { GObject gobject; }; struct _AgsRecallFactoryClass { GObjectClass gobject; }; GType ags_recall_factory_get_type(); GList* ags_recall_factory_create(AgsAudio *audio, AgsRecallContainer *play_container, AgsRecallContainer *recall_container, gchar *plugin_name, guint start_audio_channel, guint stop_audio_channel, guint start_pad, guint stop_pad, guint create_flags, guint recall_flags); /* */ AgsRecallFactory* ags_recall_factory_new(); G_END_DECLS #endif /*__AGS_RECALL_FACTORY_H__*/ gsequencer-3.1.3/ags/audio/ags_input.c0000644000175000017500000004570013613101164014612 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_input_class_init (AgsInputClass *input_class); void ags_input_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_input_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_input_init (AgsInput *input); void ags_input_dispose(GObject *gobject); void ags_input_finalize(GObject *gobject); void ags_input_notify_samplerate_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_input_notify_buffer_size_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); void ags_input_notify_format_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data); /** * SECTION:ags_input * @short_description: Input of #AgsAudio * @title: AgsInput * @section_id: * @include: ags/audio/ags_input.h * * #AgsInput represents an input channel of #AgsAudio. */ static gpointer ags_input_parent_class = NULL; enum{ PROP_0, PROP_FILE_LINK, PROP_SYNTH_GENERATOR, }; GType ags_input_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_input = 0; static const GTypeInfo ags_input_info = { sizeof (AgsInputClass), (GBaseInitFunc) NULL, /* base_init */ (GBaseFinalizeFunc) NULL, /* base_finalize */ (GClassInitFunc) ags_input_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsInput), 0, /* n_preallocs */ (GInstanceInitFunc) ags_input_init, }; ags_type_input = g_type_register_static(AGS_TYPE_CHANNEL, "AgsInput", &ags_input_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_input); } return g_define_type_id__volatile; } void ags_input_class_init(AgsInputClass *input) { GObjectClass *gobject; GParamSpec *param_spec; ags_input_parent_class = g_type_class_peek_parent(input); gobject = (GObjectClass *) input; gobject->set_property = ags_input_set_property; gobject->get_property = ags_input_get_property; gobject->dispose = ags_input_dispose; gobject->finalize = ags_input_finalize; /* properties */ /** * AgsInput:file-link: * * The file containing audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file-link", i18n_pspec("file link assigned to"), i18n_pspec("The file link to read from"), AGS_TYPE_FILE_LINK, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_LINK, param_spec); /** * AgsInput:synth-generator: (type GList(AgsSynthGenerator)) (transfer full) * * The synth generators assigned with this input. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("synth-generator", i18n_pspec("the synth generator"), i18n_pspec("The synth generator to be used"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SYNTH_GENERATOR, param_spec); } void ags_input_init(AgsInput *input) { g_signal_connect_after(input, "notify::samplerate", G_CALLBACK(ags_input_notify_samplerate_callback), NULL); g_signal_connect_after(input, "notify::buffer-size", G_CALLBACK(ags_input_notify_buffer_size_callback), NULL); g_signal_connect_after(input, "notify::format", G_CALLBACK(ags_input_notify_format_callback), NULL); input->file_link = NULL; input->synth_generator = NULL; } void ags_input_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsInput *input; GRecMutex *channel_mutex; input = AGS_INPUT(gobject); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(input); switch(prop_id){ case PROP_FILE_LINK: { AgsFileLink *file_link; file_link = (AgsFileLink *) g_value_get_object(value); g_rec_mutex_lock(channel_mutex); if(input->file_link == (GObject *) file_link){ g_rec_mutex_unlock(channel_mutex); return; } if(input->file_link != NULL){ g_object_unref(G_OBJECT(input->file_link)); } if(file_link != NULL){ g_object_ref(G_OBJECT(file_link)); } input->file_link = (GObject *) file_link; g_rec_mutex_unlock(channel_mutex); } break; case PROP_SYNTH_GENERATOR: { AgsSynthGenerator *synth_generator; synth_generator = (AgsSynthGenerator *) g_value_get_pointer(value); g_rec_mutex_lock(channel_mutex); if(g_list_find(input->synth_generator, synth_generator) != NULL){ g_rec_mutex_unlock(channel_mutex); return; } g_rec_mutex_unlock(channel_mutex); ags_input_add_synth_generator(input, (GObject *) synth_generator); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_input_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsInput *input; GRecMutex *channel_mutex; input = AGS_INPUT(gobject); /* get channel mutex */ channel_mutex = AGS_CHANNEL_GET_OBJ_MUTEX(input); switch(prop_id){ case PROP_FILE_LINK: { g_rec_mutex_lock(channel_mutex); g_value_set_object(value, input->file_link); g_rec_mutex_unlock(channel_mutex); } break; case PROP_SYNTH_GENERATOR: { g_rec_mutex_lock(channel_mutex); g_value_set_pointer(value, g_list_copy_deep(input->synth_generator, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(channel_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_input_dispose(GObject *gobject) { AgsInput *input; GList *list, *list_next; input = AGS_INPUT(gobject); /* file link */ if(input->file_link != NULL){ g_object_run_dispose(G_OBJECT(input->file_link)); g_object_unref(G_OBJECT(input->file_link)); input->file_link = NULL; } /* synth generator */ if(input->synth_generator != NULL){ list = input->synth_generator; while(list != NULL){ list_next = list->next; g_object_run_dispose(list->data); list = list_next; } g_list_free_full(input->synth_generator, g_object_unref); input->synth_generator = NULL; } /* finalize */ G_OBJECT_CLASS(ags_input_parent_class)->dispose(gobject); } void ags_input_finalize(GObject *gobject) { AgsInput *input; input = AGS_INPUT(gobject); /* file link */ if(input->file_link != NULL){ g_object_unref(G_OBJECT(input->file_link)); } /* synth generator */ g_list_free_full(input->synth_generator, g_object_unref); /* finalize */ G_OBJECT_CLASS(ags_input_parent_class)->finalize(gobject); } void ags_input_notify_samplerate_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsInput *input; GList *start_list, *list; guint samplerate; input = AGS_INPUT(gobject); g_object_get(gobject, "samplerate", &samplerate, "synth-generator", &start_list, NULL); /* apply to synth generator */ list = start_list; while(list != NULL){ g_object_set(list->data, "samplerate", samplerate, NULL); list = list->next; } g_list_free(start_list); } void ags_input_notify_buffer_size_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsInput *input; GList *start_list, *list; guint buffer_size; input = AGS_INPUT(gobject); g_object_get(gobject, "buffer-size", &buffer_size, "synth-generator", &start_list, NULL); /* apply to synth generator */ list = start_list; while(list != NULL){ g_object_set(list->data, "buffer-size", buffer_size, NULL); list = list->next; } g_list_free(start_list); } void ags_input_notify_format_callback(GObject *gobject, GParamSpec *pspec, gpointer user_data) { AgsInput *input; GList *start_list, *list; guint format; input = AGS_INPUT(gobject); g_object_get(gobject, "format", &format, "synth-generator", &start_list, NULL); /* apply to synth generator */ list = start_list; while(list != NULL){ g_object_set(list->data, "format", format, NULL); list = list->next; } g_list_free(start_list); } /** * ags_input_is_active: * @input: the #AgsInput * @recycling_context: the #AgsRecyclingContext to check * * Check if @input is active and needs processing. * * Returns: %TRUE if has a need to be processed, else %FALSE * * Since: 3.0.0 */ gboolean ags_input_is_active(AgsInput *input, GObject *recycling_context) { AgsChannel *channel; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; AgsAudioSignal *audio_signal; AgsRecyclingContext *active_context; GList *start_list, *list; gboolean success; if(!AGS_IS_INPUT(input) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return(FALSE); } channel = (AgsChannel *) input; /* get recycling */ g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); if(first_recycling == NULL){ return(FALSE); } /* get active recycling context */ active_context = (AgsRecyclingContext *) recycling_context; /* get end recycling */ end_recycling = ags_recycling_next(last_recycling); /* check if active */ recycling = first_recycling; g_object_ref(recycling); success = FALSE; while(recycling != end_recycling){ /* get audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); list = start_list; while(list != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; audio_signal = list->data; /* get recall id */ g_object_get(audio_signal, "recall-id", ¤t_recall_id, NULL); if(current_recall_id == NULL){ list = list->next; continue; } /* get recycling context */ g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); success = (current_recycling_context == active_context) ? TRUE: FALSE; if(current_recycling_context != NULL){ g_object_unref(current_recycling_context); } if(success){ g_list_free_full(start_list, g_object_unref); goto ags_input_is_active_END; } list = list->next; } g_list_free_full(start_list, g_object_unref); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } ags_input_is_active_END: g_object_unref(first_recycling); g_object_unref(last_recycling); if(end_recycling != NULL){ g_object_unref(end_recycling); } return(success); } /** * ags_input_next_active: * @input: the #AgsInput * @recycling_context: the #AgsRecyclingContext to check * * Find next #AgsInput needed to be processed. * * Returns: (transfer full): next active #AgsInput, else %NULL if non available * * Since: 3.0.0 */ AgsInput* ags_input_next_active(AgsInput *input, GObject *recycling_context) { AgsChannel *channel, *next_pad_channel; AgsInput *retval; AgsRecycling *first_recycling, *last_recycling; AgsRecycling *recycling, *next_recycling, *end_recycling; AgsAudioSignal *audio_signal; AgsRecyclingContext *active_context; GList *start_list, *list; gboolean success; if(!AGS_IS_INPUT(input) || !AGS_IS_RECYCLING_CONTEXT(recycling_context)){ return(NULL); } channel = (AgsChannel *) input; g_object_ref(channel); retval = NULL; /* check if active */ while(channel != NULL){ /* get recycling */ g_object_get(channel, "first-recycling", &first_recycling, "last-recycling", &last_recycling, NULL); if(first_recycling == NULL){ /* iterate */ next_pad_channel = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad_channel; continue; } /* get active recycling context */ active_context = (AgsRecyclingContext *) recycling_context; /* get end recycling */ end_recycling = ags_recycling_next(last_recycling); /* check recycling */ recycling = first_recycling; while(recycling != end_recycling){ /* get audio signal */ g_object_get(recycling, "audio-signal", &start_list, NULL); /* check audio signal */ list = start_list; while(list != NULL){ AgsRecallID *current_recall_id; AgsRecyclingContext *current_recycling_context; audio_signal = list->data; /* get recall id */ g_object_get(audio_signal, "recall-id", ¤t_recall_id, NULL); if(current_recall_id == NULL){ list = list->next; continue; } /* get recycling context */ g_object_get(current_recall_id, "recycling-context", ¤t_recycling_context, NULL); success = (current_recycling_context == active_context) ? TRUE: FALSE; if(success){ g_list_free_full(start_list, g_object_unref); retval = channel; goto ags_input_next_active_END; } list = list->next; } g_list_free_full(start_list, g_object_unref); /* iterate */ next_recycling = ags_recycling_next(recycling); g_object_unref(recycling); recycling = next_recycling; } ags_input_next_active_END: g_object_unref(first_recycling); g_object_unref(last_recycling); if(end_recycling != NULL){ g_object_unref(end_recycling); } if(retval != NULL){ break; } /* iterate */ next_pad_channel = ags_channel_next_pad(channel); g_object_unref(channel); channel = next_pad_channel; } return(retval); } /** * ags_input_add_synth_generator: * @input: the #AgsInput * @synth_generator: the #AgsSynthGenerator * * Add @synth_generator to @input. * * Since: 3.0.0 */ void ags_input_add_synth_generator(AgsInput *input, GObject *synth_generator) { if(!AGS_IS_INPUT(input) || !AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } g_object_ref(synth_generator); input->synth_generator = g_list_prepend(input->synth_generator, synth_generator); } /** * ags_input_remove_synth_generator: * @input: the #AgsInput * @synth_generator: the #AgsSynthGenerator * * Remove @synth_generator from @input. * * Since: 3.0.0 */ void ags_input_remove_synth_generator(AgsInput *input, GObject *synth_generator) { if(!AGS_IS_INPUT(input) || !AGS_IS_SYNTH_GENERATOR(synth_generator)){ return; } input->synth_generator = g_list_remove(input->synth_generator, synth_generator); g_object_unref(synth_generator); } /** * ags_input_open_file: * @input: the #AgsInput * @filename: the filename as string * @preset: the preset to open * @instrument: the instrument to open * @sample: the sample to open * @audio_channel: the audio channel to read * * Open @filename and assign @audio_channel's data as AGS_AUDIO_SIGNAL_TEMPLATE * audio signal to @input's own recycling. * * Returns: %TRUE if open was successful, else %FALSE * * Since: 3.0.0 */ gboolean ags_input_open_file(AgsInput *input, gchar *filename, gchar *preset, gchar *instrument, gchar *sample, guint audio_channel) { AgsRecycling *recycling; AgsFileLink *file_link; GList *audio_signal; gboolean success; if(!AGS_IS_INPUT(input)){ return(FALSE); } audio_signal = NULL; success = FALSE; if(ags_audio_file_check_suffix(filename)){ AgsAudioFile *audio_file; success = TRUE; preset = NULL; instrument = NULL; /* open audio file and read audio signal */ audio_file = ags_audio_file_new(filename, AGS_CHANNEL(input)->output_soundcard, audio_channel); ags_audio_file_open(audio_file); ags_audio_file_read_audio_signal(audio_file); audio_signal = audio_file->audio_signal; // g_object_unref(audio_file); }else if(ags_ipatch_check_suffix(filename)){ AgsAudioContainer *audio_container; success = TRUE; preset = NULL; instrument = NULL; /* open audio container and read audio signal */ audio_container = ags_audio_container_new(filename, preset, instrument, sample, AGS_CHANNEL(input)->output_soundcard, audio_channel); ags_audio_container_open(audio_container); ags_audio_container_read_audio_signal(audio_container); audio_signal = audio_container->audio_signal; // g_object_unref(audio_container); } if(success){ if(audio_signal != NULL){ file_link = g_object_new(AGS_TYPE_AUDIO_FILE_LINK, "filename", filename, "preset", preset, "instrument", instrument, "sample", sample, "audio-channel", audio_channel, NULL); g_object_set(input, "file-link", file_link, NULL); /* mark as template */ AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; /* add as template */ g_object_get(input, "first-recycling", &recycling, NULL); ags_recycling_add_audio_signal(recycling, AGS_AUDIO_SIGNAL(audio_signal->data)); g_object_unref(recycling); }else{ success = FALSE; } } return(success); } /** * ags_input_new: * @audio: the #AgsAudio * * Creates a #AgsInput, linking tree to @audio. * * Returns: a new #AgsInput * * Since: 3.0.0 */ AgsInput* ags_input_new(GObject *audio) { AgsInput *input; input = (AgsInput *) g_object_new(AGS_TYPE_INPUT, "audio", audio, NULL); return(input); } gsequencer-3.1.3/ags/audio/ags_recall_ladspa_run.c0000644000175000017500000004254413607210263017134 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_recall_ladspa_run_class_init(AgsRecallLadspaRunClass *recall_ladspa_run_class); void ags_recall_ladspa_run_connectable_interface_init(AgsConnectableInterface *connectable); void ags_recall_ladspa_run_plugin_interface_init(AgsPluginInterface *plugin); void ags_recall_ladspa_run_init(AgsRecallLadspaRun *recall_ladspa_run); void ags_recall_ladspa_run_finalize(GObject *gobject); void ags_recall_ladspa_run_run_init_pre(AgsRecall *recall); void ags_recall_ladspa_run_run_inter(AgsRecall *recall); void ags_recall_ladspa_run_load_ports(AgsRecallLadspaRun *recall_ladspa_run); /** * SECTION:ags_recall_ladspa_run * @Short_description: The object interfacing with LADSPA * @Title: AgsRecallLadspaRun * * #AgsRecallLadspaRun provides LADSPA support. */ static gpointer ags_recall_ladspa_run_parent_class = NULL; static AgsConnectableInterface* ags_recall_ladspa_run_parent_connectable_interface; static AgsPluginInterface* ags_recall_ladspa_run_parent_plugin_interface; GType ags_recall_ladspa_run_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_ladspa_run = 0; static const GTypeInfo ags_recall_ladspa_run_info = { sizeof (AgsRecallLadspaRunClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_ladspa_run_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRecallLadspaRun), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_ladspa_run_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_recall_ladspa_run_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_plugin_interface_info = { (GInterfaceInitFunc) ags_recall_ladspa_run_plugin_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_recall_ladspa_run = g_type_register_static(AGS_TYPE_RECALL_AUDIO_SIGNAL, "AgsRecallLadspaRun", &ags_recall_ladspa_run_info, 0); g_type_add_interface_static(ags_type_recall_ladspa_run, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_recall_ladspa_run, AGS_TYPE_PLUGIN, &ags_plugin_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_ladspa_run); } return g_define_type_id__volatile; } void ags_recall_ladspa_run_class_init(AgsRecallLadspaRunClass *recall_ladspa_run) { GObjectClass *gobject; AgsRecallClass *recall; GParamSpec *param_spec; ags_recall_ladspa_run_parent_class = g_type_class_peek_parent(recall_ladspa_run); /* GObjectClass */ gobject = (GObjectClass *) recall_ladspa_run; gobject->finalize = ags_recall_ladspa_run_finalize; /* AgsRecallClass */ recall = (AgsRecallClass *) recall_ladspa_run; recall->run_init_pre = ags_recall_ladspa_run_run_init_pre; recall->run_inter = ags_recall_ladspa_run_run_inter; } void ags_recall_ladspa_run_connectable_interface_init(AgsConnectableInterface *connectable) { ags_recall_ladspa_run_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_recall_ladspa_run_plugin_interface_init(AgsPluginInterface *plugin) { ags_recall_ladspa_run_parent_plugin_interface = g_type_interface_peek_parent(plugin); } void ags_recall_ladspa_run_init(AgsRecallLadspaRun *recall_ladspa_run) { recall_ladspa_run->ladspa_handle = NULL; recall_ladspa_run->audio_channels = 0; recall_ladspa_run->input = NULL; recall_ladspa_run->output = NULL; } void ags_recall_ladspa_run_connect(AgsConnectable *connectable) { ags_recall_ladspa_run_parent_connectable_interface->connect(connectable); } void ags_recall_ladspa_run_disconnect(AgsConnectable *connectable) { ags_recall_ladspa_run_parent_connectable_interface->disconnect(connectable); } void ags_recall_ladspa_run_finalize(GObject *gobject) { AgsRecallLadspa *recall_ladspa; AgsRecallLadspaRun *recall_ladspa_run; unsigned long i; recall_ladspa_run = AGS_RECALL_LADSPA_RUN(gobject); g_free(recall_ladspa_run->ladspa_handle); g_free(recall_ladspa_run->output); g_free(recall_ladspa_run->input); /* call parent */ G_OBJECT_CLASS(ags_recall_ladspa_run_parent_class)->finalize(gobject); } void ags_recall_ladspa_run_run_init_pre(AgsRecall *recall) { AgsRecallLadspa *recall_ladspa; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallLadspaRun *recall_ladspa_run; AgsAudioSignal *audio_signal; LADSPA_Handle *ladspa_handle; LADSPA_Data *output, *input; guint output_lines, input_lines; guint samplerate; guint buffer_size; guint port_count; guint i, i_stop; void (*parent_class_run_init_pre)(AgsRecall *recall); LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, unsigned long SampleRate); void (*activate)(LADSPA_Handle Instance); GRecMutex *recall_ladspa_mutex; /* get recall mutex */ parent_class_run_init_pre = AGS_RECALL_CLASS(ags_recall_ladspa_run_parent_class)->run_init_pre; /* call parent */ parent_class_run_init_pre(recall); recall_ladspa_run = AGS_RECALL_LADSPA_RUN(recall); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_ladspa, NULL); /* set up buffer */ g_object_get(recall_ladspa_run, "source", &audio_signal, NULL); /* set up buffer */ g_object_get(audio_signal, "samplerate", &samplerate, "buffer-size", &buffer_size, NULL); /* get recall ladspa mutex */ recall_ladspa_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); /* get some fields */ g_rec_mutex_lock(recall_ladspa_mutex); output_lines = recall_ladspa->output_lines; input_lines = recall_ladspa->input_lines; instantiate = recall_ladspa->plugin_descriptor->instantiate; activate = recall_ladspa->plugin_descriptor->activate; g_rec_mutex_unlock(recall_ladspa_mutex); /* set up buffer */ output = NULL; input = NULL; if(input_lines > 0){ input = (LADSPA_Data *) malloc(input_lines * buffer_size * sizeof(LADSPA_Data)); } output = (LADSPA_Data *) malloc(output_lines * buffer_size * sizeof(LADSPA_Data)); recall_ladspa_run->output = output; recall_ladspa_run->input = input; if(input_lines < output_lines){ i_stop = output_lines; }else{ i_stop = input_lines; } ladspa_handle = NULL; if(i_stop > 0){ ladspa_handle = (LADSPA_Handle *) malloc(i_stop * sizeof(LADSPA_Handle)); } recall_ladspa_run->audio_channels = i_stop; /* instantiate ladspa */ g_rec_mutex_lock(recall_ladspa_mutex); for(i = 0; i < i_stop; i++){ ladspa_handle[i] = instantiate(recall_ladspa->plugin_descriptor, (unsigned long) samplerate); #ifdef AGS_DEBUG g_message("instantiated LADSPA handle"); #endif } g_rec_mutex_unlock(recall_ladspa_mutex); /* load ports */ recall_ladspa_run->ladspa_handle = ladspa_handle; ags_recall_ladspa_run_load_ports(recall_ladspa_run); /* activate */ for(i = 0; i < i_stop; i++){ if(activate != NULL){ activate(recall_ladspa_run->ladspa_handle[i]); } #ifdef AGS_DEBUG g_message("activated LADSPA handle"); #endif } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_ladspa); g_object_unref(audio_signal); } void ags_recall_ladspa_run_run_inter(AgsRecall *recall) { AgsRecallLadspa *recall_ladspa; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsRecallLadspaRun *recall_ladspa_run; AgsAudioSignal *audio_signal; AgsRecallID *recall_id; AgsRecyclingContext *parent_recycling_context, *recycling_context; GList *note_start, *note; guint output_lines, input_lines; guint copy_mode_in, copy_mode_out; guint buffer_size; guint i; void (*parent_class_run_inter)(AgsRecall *recall); void (*run)(LADSPA_Handle Instance, unsigned long SampleCount); void (*deactivate)(LADSPA_Handle Instance); void (*cleanup)(LADSPA_Handle Instance); GRecMutex *recall_ladspa_mutex; /* get recall mutex */ parent_class_run_inter = AGS_RECALL_CLASS(ags_recall_ladspa_run_parent_class)->run_inter; /* call parent */ parent_class_run_inter(recall); g_object_get(recall, "recall-id", &recall_id, "source", &audio_signal, NULL); g_object_get(recall_id, "recycling-context", &recycling_context, NULL); g_object_get(recycling_context, "parent", &parent_recycling_context, NULL); g_object_get(audio_signal, "note", ¬e_start, NULL); if(ags_recall_global_get_rt_safe() && parent_recycling_context != NULL && note_start == NULL){ g_object_unref(recall_id); g_object_unref(audio_signal); g_object_unref(recycling_context); g_object_unref(parent_recycling_context); return; } g_list_free_full(note_start, g_object_unref); g_object_get(recall, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_ladspa, NULL); recall_ladspa_run = AGS_RECALL_LADSPA_RUN(recall); /* get recall ladspa mutex */ recall_ladspa_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); g_object_get(audio_signal, "buffer-size", &buffer_size, NULL); /* get some fields */ g_rec_mutex_lock(recall_ladspa_mutex); output_lines = recall_ladspa->output_lines; input_lines = recall_ladspa->input_lines; run = recall_ladspa->plugin_descriptor->run; deactivate = recall_ladspa->plugin_descriptor->deactivate; cleanup = recall_ladspa->plugin_descriptor->cleanup; g_rec_mutex_unlock(recall_ladspa_mutex); if(audio_signal->stream_current == NULL){ for(i = 0; i < input_lines; i++){ /* deactivate */ //TODO:JK: fix-me if(deactivate != NULL){ deactivate(recall_ladspa_run->ladspa_handle[i]); } cleanup(recall_ladspa_run->ladspa_handle[i]); } ags_recall_done(recall); goto ags_recall_ladspa_run_run_inter_END; } /* get copy mode and clear buffer */ copy_mode_in = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_FLOAT, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); copy_mode_out = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(audio_signal->format), AGS_AUDIO_BUFFER_UTIL_FLOAT); if(recall_ladspa_run->output != NULL){ ags_audio_buffer_util_clear_float(recall_ladspa_run->output, output_lines, buffer_size); } /* copy data */ if(recall_ladspa_run->input != NULL){ ags_audio_buffer_util_clear_float(recall_ladspa_run->input, input_lines, buffer_size); ags_audio_buffer_util_copy_buffer_to_buffer(recall_ladspa_run->input, (guint) input_lines, 0, audio_signal->stream_current->data, 1, 0, (guint) buffer_size, copy_mode_in); } /* process data */ run(recall_ladspa_run->ladspa_handle[0], buffer_size); /* copy data */ if(recall_ladspa_run->output != NULL){ ags_audio_buffer_util_clear_buffer(audio_signal->stream_current->data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(audio_signal->format)); ags_audio_buffer_util_copy_buffer_to_buffer(audio_signal->stream_current->data, 1, 0, recall_ladspa_run->output, (guint) output_lines, 0, (guint) buffer_size, copy_mode_out); } ags_recall_ladspa_run_run_inter_END: g_object_unref(recall_id); g_object_unref(recycling_context); if(parent_recycling_context != NULL){ g_object_unref(parent_recycling_context); } g_object_unref(recall_recycling); g_object_unref(audio_signal); g_object_unref(recall_channel_run); g_object_unref(recall_ladspa); } /** * ags_recall_ladspa_run_load_ports: * @recall_ladspa_run: the #AgsRecallLadspaRun * * Set up LADSPA ports. * * Since: 3.0.0 */ void ags_recall_ladspa_run_load_ports(AgsRecallLadspaRun *recall_ladspa_run) { AgsRecallLadspa *recall_ladspa; AgsRecallChannelRun *recall_channel_run; AgsRecallRecycling *recall_recycling; AgsPort *current_port; GList *list_start, *list; gchar *specifier, *current_specifier; guint output_lines, input_lines; guint port_count; guint i, j, j_stop; LADSPA_Descriptor *plugin_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortDescriptor current_port_descriptor; void (*connect_port)(LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation); GRecMutex *recall_ladspa_mutex; GRecMutex *port_mutex; if(!AGS_IS_RECALL_LADSPA_RUN(recall_ladspa_run)){ return; } /* get recall mutex */ g_object_get(recall_ladspa_run, "parent", &recall_recycling, NULL); g_object_get(recall_recycling, "parent", &recall_channel_run, NULL); g_object_get(recall_channel_run, "recall-channel", &recall_ladspa, NULL); /* get recall ladspa mutex */ recall_ladspa_mutex = AGS_RECALL_GET_OBJ_MUTEX(recall_ladspa); /* get some fields */ g_rec_mutex_lock(recall_ladspa_mutex); output_lines = recall_ladspa->output_lines; input_lines = recall_ladspa->input_lines; list_start = g_list_copy(AGS_RECALL(recall_ladspa)->port); plugin_descriptor = recall_ladspa->plugin_descriptor; port_count = plugin_descriptor->PortCount; port_descriptor = plugin_descriptor->PortDescriptors; connect_port = recall_ladspa->plugin_descriptor->connect_port; g_rec_mutex_unlock(recall_ladspa_mutex); /* match port */ if(input_lines < output_lines){ j_stop = output_lines; }else{ j_stop = input_lines; } for(i = 0; i < port_count; i++){ g_rec_mutex_lock(recall_ladspa_mutex); current_port_descriptor = port_descriptor[i]; g_rec_mutex_unlock(recall_ladspa_mutex); if(LADSPA_IS_PORT_CONTROL(current_port_descriptor)){ if(LADSPA_IS_PORT_INPUT(current_port_descriptor) || LADSPA_IS_PORT_OUTPUT(current_port_descriptor)){ LADSPA_Data *port_pointer; g_rec_mutex_lock(recall_ladspa_mutex); specifier = g_strdup(plugin_descriptor->PortNames[i]); g_rec_mutex_unlock(recall_ladspa_mutex); list = ags_port_find_specifier(list_start, specifier); g_free(specifier); if(list != NULL){ current_port = list->data; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(current_port); for(j = 0; j < j_stop; j++){ #ifdef AGS_DEBUG g_message("connecting port[%d]: %d/%d - %f", j, i, port_count, current->port_value.ags_port_ladspa); #endif g_rec_mutex_lock(port_mutex); port_pointer = (LADSPA_Data *) &(current_port->port_value.ags_port_ladspa); g_rec_mutex_unlock(port_mutex); connect_port(recall_ladspa_run->ladspa_handle[j], (unsigned long) i, port_pointer); } } } } } g_list_free(list_start); /* connect audio port */ for(j = 0; j < input_lines; j++){ connect_port(recall_ladspa_run->ladspa_handle[j], (unsigned long) (recall_ladspa->input_port[j]), &(recall_ladspa_run->input[j])); } for(j = 0; j < recall_ladspa->output_lines; j++){ connect_port(recall_ladspa_run->ladspa_handle[j], (unsigned long) (recall_ladspa->output_port[j]), &(recall_ladspa_run->output[j])); } g_object_unref(recall_recycling); g_object_unref(recall_channel_run); g_object_unref(recall_ladspa); } /** * ags_recall_ladspa_run_new: * @source: the #AgsAudioSignal as source * * Creates a new instance of #AgsRecallLadspaRun * * Returns: the new #AgsRecallLadspaRun * * Since: 3.0.0 */ AgsRecallLadspaRun* ags_recall_ladspa_run_new(AgsAudioSignal *source) { AgsRecallLadspaRun *recall_ladspa_run; recall_ladspa_run = (AgsRecallLadspaRun *) g_object_new(AGS_TYPE_RECALL_LADSPA_RUN, "source", source, NULL); return(recall_ladspa_run); } gsequencer-3.1.3/ags/audio/ags_recall_lv2_run.h0000644000175000017500000000466013607210263016375 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_LV2_RUN_H__ #define __AGS_RECALL_LV2_RUN_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_LV2_RUN (ags_recall_lv2_run_get_type()) #define AGS_RECALL_LV2_RUN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_LV2_RUN, AgsRecallLv2Run)) #define AGS_RECALL_LV2_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_LV2_RUN, AgsRecallLv2RunClass)) #define AGS_IS_RECALL_LV2_RUN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL_LV2_RUN)) #define AGS_IS_RECALL_LV2_RUN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL_LV2_RUN)) #define AGS_RECALL_LV2_RUN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL_LV2_RUN, AgsRecallLv2RunClass)) #define AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT (8 * 256) typedef struct _AgsRecallLv2Run AgsRecallLv2Run; typedef struct _AgsRecallLv2RunClass AgsRecallLv2RunClass; struct _AgsRecallLv2Run { AgsRecallAudioSignal recall_audio_signal; LV2_Handle *lv2_handle; float *input; float *output; void *event_port; void *atom_port; long delta_time; snd_seq_event_t **event_buffer; unsigned long *event_count; GObject *route_lv2_audio_run; GList *note; GObject *worker_handle; }; struct _AgsRecallLv2RunClass { AgsRecallAudioSignalClass recall_audio_signal; }; GType ags_recall_lv2_run_get_type(); AgsRecallLv2Run* ags_recall_lv2_run_new(AgsAudioSignal *source); G_END_DECLS #endif /*__AGS_RECALL_LV2_RUN_H__*/ gsequencer-3.1.3/ags/audio/ags_recall_id.c0000644000175000017500000004407313607210263015377 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_recall_id_class_init(AgsRecallIDClass *recall_id); void ags_recall_id_init(AgsRecallID *recall_id); void ags_recall_id_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_recall_id_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_recall_id_dispose(GObject *gobject); void ags_recall_id_finalize(GObject *gobject); /** * SECTION:ags_recall_id * @short_description: The object specifies run context. * @title: AgsRecallID * @section_id: * @include: ags/audio/ags_recall_id.h * * #AgsRecallID acts as dynamic context identifier. */ enum{ PROP_0, PROP_RECYCLING_CONTEXT, }; static gpointer ags_recall_id_parent_class = NULL; GType ags_recall_id_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_recall_id = 0; static const GTypeInfo ags_recall_id_info = { sizeof(AgsRecallIDClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_recall_id_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRecallID), 0, /* n_preallocs */ (GInstanceInitFunc) ags_recall_id_init, }; ags_type_recall_id = g_type_register_static(G_TYPE_OBJECT, "AgsRecallID", &ags_recall_id_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_recall_id); } return g_define_type_id__volatile; } void ags_recall_id_class_init(AgsRecallIDClass *recall_id) { GObjectClass *gobject; GParamSpec *param_spec; ags_recall_id_parent_class = g_type_class_peek_parent(recall_id); /* GObjectClass */ gobject = (GObjectClass *) recall_id; gobject->set_property = ags_recall_id_set_property; gobject->get_property = ags_recall_id_get_property; gobject->dispose = ags_recall_id_dispose; gobject->finalize = ags_recall_id_finalize; /* properties */ /** * AgsRecallID:recycling-context: * * The dynamic run context belonging to. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recycling-context", i18n_pspec("assigned recycling context"), i18n_pspec("The recycling context it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECYCLING_CONTEXT, param_spec); } void ags_recall_id_init(AgsRecallID *recall_id) { recall_id->flags = 0; recall_id->sound_scope = -1; recall_id->staging_flags = 0; recall_id->state_flags = 0; /* recall id mutex */ g_rec_mutex_init(&(recall_id->obj_mutex)); /* recycling context */ recall_id->recycling_context = NULL; } void ags_recall_id_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRecallID *recall_id; GRecMutex *recall_id_mutex; recall_id = AGS_RECALL_ID(gobject); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); switch(prop_id){ case PROP_RECYCLING_CONTEXT: { AgsRecyclingContext *recycling_context; recycling_context = g_value_get_object(value); g_rec_mutex_lock(recall_id_mutex); if(recall_id->recycling_context == recycling_context){ g_rec_mutex_unlock(recall_id_mutex); return; } if(recall_id->recycling_context != NULL){ g_object_unref(recall_id->recycling_context); } if(recycling_context != NULL){ g_object_ref(recycling_context); } recall_id->recycling_context = recycling_context; g_rec_mutex_unlock(recall_id_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_id_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRecallID *recall_id; GRecMutex *recall_id_mutex; recall_id = AGS_RECALL_ID(gobject); /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); switch(prop_id){ case PROP_RECYCLING_CONTEXT: { g_rec_mutex_lock(recall_id_mutex); g_value_set_object(value, recall_id->recycling_context); g_rec_mutex_unlock(recall_id_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_recall_id_dispose(GObject *gobject) { AgsRecallID *recall_id; recall_id = AGS_RECALL_ID(gobject); if(recall_id->recycling_context != NULL){ g_object_unref(recall_id->recycling_context); recall_id->recycling_context = NULL; } /* call parent */ G_OBJECT_CLASS(ags_recall_id_parent_class)->dispose(gobject); } void ags_recall_id_finalize(GObject *gobject) { AgsRecallID *recall_id; recall_id = AGS_RECALL_ID(gobject); if(recall_id->recycling_context != NULL){ g_object_unref(recall_id->recycling_context); } /* call parent */ G_OBJECT_CLASS(ags_recall_id_parent_class)->finalize(gobject); } /** * ags_recall_id_set_scope: * @recall_id: the #AgsRecallID * @sound_scope: the sound scope * * Set @sound_scope for @recall_id. * * Since: 3.0.0 */ void ags_recall_id_set_sound_scope(AgsRecallID *recall_id, gint sound_scope) { GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id) || ags_recall_id_check_sound_scope(recall_id, -1)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* set sound scope */ g_rec_mutex_lock(recall_id_mutex); recall_id->sound_scope = sound_scope; g_rec_mutex_unlock(recall_id_mutex); } /** * ags_recall_id_check_sound_scope: * @recall_id: the #AgsRecallID * @sound_scope: the sound scope to check or -1 to check all * * Check if @sound_scope is set for @recall_id. * * Returns: %TRUE if sound scope matches, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_id_check_sound_scope(AgsRecallID *recall_id, gint sound_scope) { gint recall_id_sound_scope; GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get sound scope */ g_rec_mutex_lock(recall_id_mutex); recall_id_sound_scope = recall_id->sound_scope; g_rec_mutex_unlock(recall_id_mutex); if(sound_scope < 0){ switch(recall_id_sound_scope){ case AGS_SOUND_SCOPE_PLAYBACK: case AGS_SOUND_SCOPE_NOTATION: case AGS_SOUND_SCOPE_SEQUENCER: case AGS_SOUND_SCOPE_WAVE: case AGS_SOUND_SCOPE_MIDI: return(TRUE); default: return(FALSE); } }else{ if(sound_scope < AGS_SOUND_SCOPE_LAST && sound_scope == recall_id_sound_scope){ return(TRUE); }else{ return(FALSE); } } } /** * ags_recall_id_test_staging_flags: * @recall_id: the #AgsRecallID * @staging_flags: the staging flags * * Test @staging_flags to be set on @recall_id. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_id_test_staging_flags(AgsRecallID *recall_id, guint staging_flags) { gboolean retval; GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* test */ g_rec_mutex_lock(recall_id_mutex); retval = (staging_flags & (recall_id->staging_flags)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_id_mutex); return(retval); } /** * ags_recall_id_set_staging_flags: * @recall_id: the #AgsRecallID * @staging_flags: staging flags to set * * Set staging flags. * * Since: 3.0.0 */ void ags_recall_id_set_staging_flags(AgsRecallID *recall_id, guint staging_flags) { GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* set staging flags */ g_rec_mutex_lock(recall_id_mutex); recall_id->staging_flags |= staging_flags; g_rec_mutex_unlock(recall_id_mutex); } /** * ags_recall_id_unset_staging_flags: * @recall_id: the #AgsRecallID * @staging_flags: staging flags to unset * * Unset staging flags. * * Since: 3.0.0 */ void ags_recall_id_unset_staging_flags(AgsRecallID *recall_id, guint staging_flags) { GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* unset staging flags */ g_rec_mutex_lock(recall_id_mutex); recall_id->staging_flags &= (~staging_flags); g_rec_mutex_unlock(recall_id_mutex); } /** * ags_recall_id_check_staging_flags: * @recall_id: the #AgsRecallID * @staging_flags: staging flags to check * * Check the occurence of @staging_flags in @recall_id. * * Returns: %TRUE if all flags matched, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_id_check_staging_flags(AgsRecallID *recall_id, guint staging_flags) { guint recall_id_staging_flags; GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get staging flags */ g_rec_mutex_lock(recall_id_mutex); recall_id_staging_flags = recall_id->staging_flags; g_rec_mutex_unlock(recall_id_mutex); /* check staging flags */ if((AGS_SOUND_STAGING_CHECK_RT_DATA & (staging_flags)) != 0 && (AGS_SOUND_STAGING_CHECK_RT_DATA & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INIT_PRE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_PRE & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INIT_INTER & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_INTER & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INIT_POST & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INIT_POST & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_FEED_INPUT_QUEUE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FEED_INPUT_QUEUE & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_AUTOMATE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_AUTOMATE & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_PRE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_PRE & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_INTER & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_INTER & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_RUN_POST & (staging_flags)) != 0 && (AGS_SOUND_STAGING_RUN_POST & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_DO_FEEDBACK & (staging_flags)) != 0 && (AGS_SOUND_STAGING_DO_FEEDBACK & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_FINI & (staging_flags)) != 0 && (AGS_SOUND_STAGING_FINI & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_CANCEL & (staging_flags)) != 0 && (AGS_SOUND_STAGING_CANCEL & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_DONE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_DONE & (recall_id_staging_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STAGING_REMOVE & (staging_flags)) != 0 && (AGS_SOUND_STAGING_REMOVE & (recall_id_staging_flags)) == 0){ return(FALSE); } return(TRUE); } /** * ags_recall_id_test_state_flags: * @recall_id: the #AgsRecallID * @state_flags: the state flags * * Test @state_flags to be set on @recall_id. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_recall_id_test_state_flags(AgsRecallID *recall_id, guint state_flags) { gboolean retval; GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } /* get recall_id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* test */ g_rec_mutex_lock(recall_id_mutex); retval = (state_flags & (recall_id->state_flags)) ? TRUE: FALSE; g_rec_mutex_unlock(recall_id_mutex); return(retval); } /** * ags_recall_id_set_state_flags: * @recall_id: the #AgsRecallID * @state_flags: state flags to set * * Set state flags. * * Since: 3.0.0 */ void ags_recall_id_set_state_flags(AgsRecallID *recall_id, guint state_flags) { GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* set state flags */ g_rec_mutex_lock(recall_id_mutex); recall_id->state_flags |= state_flags; g_rec_mutex_unlock(recall_id_mutex); } /** * ags_recall_id_unset_state_flags: * @recall_id: the #AgsRecallID * @state_flags: state flags to unset * * Unset state flags. * * Since: 3.0.0 */ void ags_recall_id_unset_state_flags(AgsRecallID *recall_id, guint state_flags) { GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return; } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* unset state flags */ g_rec_mutex_lock(recall_id_mutex); recall_id->state_flags &= (~state_flags); g_rec_mutex_unlock(recall_id_mutex); } /** * ags_recall_id_check_state_flags: * @recall_id: the #AgsRecallID * @state_flags: state flags to check * * Check the occurence of @state_flags in @recall_id. * * Returns: %TRUE if all flags matched, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_recall_id_check_state_flags(AgsRecallID *recall_id, guint state_flags) { guint recall_id_state_flags; GRecMutex *recall_id_mutex; if(!AGS_IS_RECALL_ID(recall_id)){ return(FALSE); } /* get recall id mutex */ recall_id_mutex = AGS_RECALL_ID_GET_OBJ_MUTEX(recall_id); /* get state flags */ g_rec_mutex_lock(recall_id_mutex); recall_id_state_flags = recall_id->state_flags; g_rec_mutex_unlock(recall_id_mutex); /* check state flags */ if((AGS_SOUND_STATE_IS_WAITING & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_WAITING & (recall_id_state_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STATE_IS_ACTIVE & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_ACTIVE & (recall_id_state_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STATE_IS_PROCESSING & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_PROCESSING & (recall_id_state_flags)) == 0){ return(FALSE); } if((AGS_SOUND_STATE_IS_TERMINATING & (state_flags)) != 0 && (AGS_SOUND_STATE_IS_TERMINATING & (recall_id_state_flags)) == 0){ return(FALSE); } return(TRUE); } /** * ags_recall_id_find_recycling_context: * @recall_id: (element-type AgsAudio.RecallID) (transfer none): the #GList-struct containing #AgsRecallID * @recycling_context: the #AgsRecyclingContext to match * * Retrieve recall id by recycling context. * * Returns: (transfer none): Matching #AgsRecallID * * Since: 3.0.0 */ AgsRecallID* ags_recall_id_find_recycling_context(GList *recall_id, AgsRecyclingContext *recycling_context) { while(recall_id != NULL){ AgsRecyclingContext *current_recycling_context; gboolean success; g_object_get(recall_id->data, "recycling-context", ¤t_recycling_context, NULL); success = (current_recycling_context == recycling_context) ? TRUE: FALSE; g_object_unref(current_recycling_context); if(success){ return(recall_id->data); } recall_id = recall_id->next; } return(NULL); } /** * ags_recall_id_find_parent_recycling_context: * @recall_id: (element-type AgsAudio.RecallID) (transfer none): the #GList-struct containing #AgsRecallID * @parent_recycling_context: the #AgsRecyclingContext to match * * Retrieve recall id by recycling context. * * Returns: (transfer none): Matching #AgsRecallID * * Since: 3.0.0 */ AgsRecallID* ags_recall_id_find_parent_recycling_context(GList *recall_id, AgsRecyclingContext *parent_recycling_context) { while(recall_id != NULL){ AgsRecyclingContext *current_parent_recycling_context; AgsRecyclingContext *current_recycling_context; gboolean success; success = FALSE; g_object_get(recall_id->data, "recycling-context", ¤t_recycling_context, NULL); if(current_recycling_context != NULL){ g_object_get(current_recycling_context, "parent", ¤t_parent_recycling_context, NULL); if(current_parent_recycling_context == parent_recycling_context){ success = TRUE; } /* unref */ if(current_parent_recycling_context != NULL){ g_object_unref(current_parent_recycling_context); } g_object_unref(current_recycling_context); } if(success){ return(recall_id->data); } recall_id = recall_id->next; } return(NULL); } /** * ags_recall_id_new: * * Creates a #AgsRecallID * * Returns: a new #AgsRecallID * * Since: 3.0.0 */ AgsRecallID* ags_recall_id_new() { AgsRecallID *recall_id; recall_id = (AgsRecallID *) g_object_new(AGS_TYPE_RECALL_ID, NULL); return(recall_id); } gsequencer-3.1.3/ags/audio/ags_devin.c0000644000175000017500000026566713607210263014604 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #ifndef AGS_W32API #include #include #ifndef __APPLE__ #include #endif #endif #include #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include void ags_devin_class_init(AgsDevinClass *devin); void ags_devin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_devin_init(AgsDevin *devin); void ags_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_devin_dispose(GObject *gobject); void ags_devin_finalize(GObject *gobject); AgsUUID* ags_devin_get_uuid(AgsConnectable *connectable); gboolean ags_devin_has_resource(AgsConnectable *connectable); gboolean ags_devin_is_ready(AgsConnectable *connectable); void ags_devin_add_to_registry(AgsConnectable *connectable); void ags_devin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_devin_list_resource(AgsConnectable *connectable); xmlNode* ags_devin_xml_compose(AgsConnectable *connectable); void ags_devin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_devin_is_connected(AgsConnectable *connectable); void ags_devin_connect(AgsConnectable *connectable); void ags_devin_disconnect(AgsConnectable *connectable); void ags_devin_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_devin_get_device(AgsSoundcard *soundcard); void ags_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_devin_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_devin_get_capability(AgsSoundcard *soundcard); gboolean ags_devin_is_available(AgsSoundcard *soundcard); gboolean ags_devin_is_starting(AgsSoundcard *soundcard); gboolean ags_devin_is_recording(AgsSoundcard *soundcard); gchar* ags_devin_get_uptime(AgsSoundcard *soundcard); void ags_devin_delegate_record_init(AgsSoundcard *soundcard, GError **error); void ags_devin_delegate_record(AgsSoundcard *soundcard, GError **error); void ags_devin_delegate_stop(AgsSoundcard *soundcard); void ags_devin_oss_init(AgsSoundcard *soundcard, GError **error); void ags_devin_oss_record_fill_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size); void ags_devin_oss_record(AgsSoundcard *soundcard, GError **error); void ags_devin_oss_free(AgsSoundcard *soundcard); void ags_devin_alsa_init(AgsSoundcard *soundcard, GError **error); void ags_devin_alsa_record_fill_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size); void ags_devin_alsa_record(AgsSoundcard *soundcard, GError **error); void ags_devin_alsa_free(AgsSoundcard *soundcard); void ags_devin_tic(AgsSoundcard *soundcard); void ags_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_devin_get_bpm(AgsSoundcard *soundcard); void ags_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_devin_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_devin_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_devin_get_delay(AgsSoundcard *soundcard); guint ags_devin_get_attack(AgsSoundcard *soundcard); void* ags_devin_get_buffer(AgsSoundcard *soundcard); void* ags_devin_get_next_buffer(AgsSoundcard *soundcard); void* ags_devin_get_prev_buffer(AgsSoundcard *soundcard); void ags_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_devin_get_delay_counter(AgsSoundcard *soundcard); void ags_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_devin_get_start_note_offset(AgsSoundcard *soundcard); void ags_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_devin_get_note_offset(AgsSoundcard *soundcard); void ags_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_devin_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_devin_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_devin * @short_description: Input from soundcard * @title: AgsDevin * @section_id: * @include: ags/audio/ags_devin.h * * #AgsDevin represents a soundcard and supports input. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, }; static gpointer ags_devin_parent_class = NULL; GType ags_devin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_devin = 0; static const GTypeInfo ags_devin_info = { sizeof(AgsDevinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_devin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDevin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_devin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_devin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_devin_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_devin = g_type_register_static(G_TYPE_OBJECT, "AgsDevin", &ags_devin_info, 0); g_type_add_interface_static(ags_type_devin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_devin, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_devin); } return g_define_type_id__volatile; } void ags_devin_class_init(AgsDevinClass *devin) { GObjectClass *gobject; GParamSpec *param_spec; ags_devin_parent_class = g_type_class_peek_parent(devin); /* GObjectClass */ gobject = (GObjectClass *) devin; gobject->set_property = ags_devin_set_property; gobject->get_property = ags_devin_get_property; gobject->dispose = ags_devin_dispose; gobject->finalize = ags_devin_finalize; /* properties */ /** * AgsDevin:device: * * The alsa soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), AGS_DEVIN_DEFAULT_ALSA_DEVICE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsDevin:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), AGS_SOUNDCARD_MIN_DSP_CHANNELS, AGS_SOUNDCARD_MAX_DSP_CHANNELS, AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsDevin:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), AGS_SOUNDCARD_MIN_PCM_CHANNELS, AGS_SOUNDCARD_MAX_PCM_CHANNELS, AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsDevin:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsDevin:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), AGS_SOUNDCARD_MIN_BUFFER_SIZE, AGS_SOUNDCARD_MAX_BUFFER_SIZE, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsDevin:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count recorded during a second"), AGS_SOUNDCARD_MIN_SAMPLERATE, AGS_SOUNDCARD_MAX_SAMPLERATE, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsDevin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to record"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsDevin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsDevin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsDevin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /* AgsDevinClass */ } GQuark ags_devin_error_quark() { return(g_quark_from_static_string("ags-devin-error-quark")); } void ags_devin_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_devin_get_uuid; connectable->has_resource = ags_devin_has_resource; connectable->is_ready = ags_devin_is_ready; connectable->add_to_registry = ags_devin_add_to_registry; connectable->remove_from_registry = ags_devin_remove_from_registry; connectable->list_resource = ags_devin_list_resource; connectable->xml_compose = ags_devin_xml_compose; connectable->xml_parse = ags_devin_xml_parse; connectable->is_connected = ags_devin_is_connected; connectable->connect = ags_devin_connect; connectable->disconnect = ags_devin_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_devin_set_device; soundcard->get_device = ags_devin_get_device; soundcard->set_presets = ags_devin_set_presets; soundcard->get_presets = ags_devin_get_presets; soundcard->list_cards = ags_devin_list_cards; soundcard->pcm_info = ags_devin_pcm_info; soundcard->get_capability = ags_devin_get_capability; soundcard->is_available = ags_devin_is_available; soundcard->is_starting = ags_devin_is_starting; soundcard->is_playing = NULL; soundcard->is_recording = ags_devin_is_recording; soundcard->get_uptime = ags_devin_get_uptime; soundcard->play_init = NULL; soundcard->play = NULL; soundcard->record_init = ags_devin_delegate_record_init; soundcard->record = ags_devin_delegate_record; soundcard->stop = ags_devin_delegate_stop; soundcard->tic = ags_devin_tic; soundcard->offset_changed = ags_devin_offset_changed; soundcard->set_bpm = ags_devin_set_bpm; soundcard->get_bpm = ags_devin_get_bpm; soundcard->set_delay_factor = ags_devin_set_delay_factor; soundcard->get_delay_factor = ags_devin_get_delay_factor; soundcard->get_absolute_delay = ags_devin_get_absolute_delay; soundcard->get_delay = ags_devin_get_delay; soundcard->get_attack = ags_devin_get_attack; soundcard->get_buffer = ags_devin_get_buffer; soundcard->get_next_buffer = ags_devin_get_next_buffer; soundcard->get_prev_buffer = ags_devin_get_prev_buffer; soundcard->lock_buffer = ags_devin_lock_buffer; soundcard->unlock_buffer = ags_devin_unlock_buffer; soundcard->get_delay_counter = ags_devin_get_delay_counter; soundcard->set_start_note_offset = ags_devin_set_start_note_offset; soundcard->get_start_note_offset = ags_devin_get_start_note_offset; soundcard->set_note_offset = ags_devin_set_note_offset; soundcard->get_note_offset = ags_devin_get_note_offset; soundcard->set_note_offset_absolute = ags_devin_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_devin_get_note_offset_absolute; soundcard->set_loop = ags_devin_set_loop; soundcard->get_loop = ags_devin_get_loop; soundcard->get_loop_offset = ags_devin_get_loop_offset; } void ags_devin_init(AgsDevin *devin) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; gboolean use_alsa; devin->flags = 0; /* insert devin mutex */ g_rec_mutex_init(&(devin->obj_mutex)); /* uuid */ devin->uuid = ags_uuid_alloc(); ags_uuid_generate(devin->uuid); /* flags */ config = ags_config_get_instance(); #ifdef AGS_WITH_ALSA use_alsa = TRUE; #else use_alsa = FALSE; #endif str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "backend"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "backend"); } if(str != NULL && !g_ascii_strncasecmp(str, "oss", 4)){ use_alsa = FALSE; } if(use_alsa){ devin->flags |= (AGS_DEVIN_ALSA); }else{ devin->flags |= (AGS_DEVIN_OSS); } g_free(str); /* presets */ devin->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); devin->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); devin->samplerate = ags_soundcard_helper_config_get_samplerate(config); devin->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); devin->format = ags_soundcard_helper_config_get_format(config); /* device */ if(use_alsa){ devin->out.alsa.handle = NULL; devin->out.alsa.device = AGS_DEVIN_DEFAULT_ALSA_DEVICE; }else{ devin->out.oss.device_fd = -1; devin->out.oss.device = AGS_DEVIN_DEFAULT_OSS_DEVICE; } /* buffer */ devin->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ devin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(devin->buffer_mutex[i]); } devin->buffer = (void **) malloc(4 * sizeof(void*)); devin->buffer[0] = NULL; devin->buffer[1] = NULL; devin->buffer[2] = NULL; devin->buffer[3] = NULL; g_atomic_int_set(&(devin->available), FALSE); devin->ring_buffer_size = AGS_DEVIN_DEFAULT_RING_BUFFER_SIZE; devin->nth_ring_buffer = 0; devin->ring_buffer = NULL; ags_devin_realloc_buffer(devin); /* bpm */ devin->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ devin->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); devin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ devin->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); devin->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_devin_adjust_delay_and_attack(devin); /* counters */ devin->tact_counter = 0.0; devin->delay_counter = 0; devin->tic_counter = 0; devin->start_note_offset = 0; devin->note_offset = 0; devin->note_offset_absolute = 0; devin->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; devin->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; devin->do_loop = FALSE; devin->loop_offset = 0; } void ags_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(gobject); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_OSS & (devin->flags)) != 0){ devin->out.oss.device = g_strdup(device); }else if((AGS_DEVIN_ALSA & (devin->flags)) != 0){ devin->out.alsa.device = g_strdup(device); } g_rec_mutex_unlock(devin_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(devin_mutex); if(dsp_channels == devin->dsp_channels){ g_rec_mutex_unlock(devin_mutex); return; } devin->dsp_channels = dsp_channels; g_rec_mutex_unlock(devin_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(devin_mutex); if(pcm_channels == devin->pcm_channels){ g_rec_mutex_unlock(devin_mutex); return; } devin->pcm_channels = pcm_channels; g_rec_mutex_unlock(devin_mutex); ags_devin_realloc_buffer(devin); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(devin_mutex); if(format == devin->format){ g_rec_mutex_unlock(devin_mutex); return; } devin->format = format; g_rec_mutex_unlock(devin_mutex); ags_devin_realloc_buffer(devin); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(devin_mutex); if(buffer_size == devin->buffer_size){ g_rec_mutex_unlock(devin_mutex); return; } devin->buffer_size = buffer_size; g_rec_mutex_unlock(devin_mutex); ags_devin_realloc_buffer(devin); ags_devin_adjust_delay_and_attack(devin); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(devin_mutex); if(samplerate == devin->samplerate){ g_rec_mutex_unlock(devin_mutex); return; } devin->samplerate = samplerate; g_rec_mutex_unlock(devin_mutex); ags_devin_adjust_delay_and_attack(devin); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(devin_mutex); if(bpm == devin->bpm){ g_rec_mutex_unlock(devin_mutex); return; } devin->bpm = bpm; g_rec_mutex_unlock(devin_mutex); ags_devin_adjust_delay_and_attack(devin); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(devin_mutex); if(delay_factor == devin->delay_factor){ g_rec_mutex_unlock(devin_mutex); return; } devin->delay_factor = delay_factor; g_rec_mutex_unlock(devin_mutex); ags_devin_adjust_delay_and_attack(devin); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(gobject); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_OSS & (devin->flags)) != 0){ g_value_set_string(value, devin->out.oss.device); }else if((AGS_DEVIN_ALSA & (devin->flags)) != 0){ g_value_set_string(value, devin->out.alsa.device); } g_rec_mutex_unlock(devin_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(devin_mutex); g_value_set_uint(value, devin->dsp_channels); g_rec_mutex_unlock(devin_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(devin_mutex); g_value_set_uint(value, devin->pcm_channels); g_rec_mutex_unlock(devin_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(devin_mutex); g_value_set_uint(value, devin->format); g_rec_mutex_unlock(devin_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(devin_mutex); g_value_set_uint(value, devin->buffer_size); g_rec_mutex_unlock(devin_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(devin_mutex); g_value_set_uint(value, devin->samplerate); g_rec_mutex_unlock(devin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(devin_mutex); g_value_set_pointer(value, devin->buffer); g_rec_mutex_unlock(devin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(devin_mutex); g_value_set_double(value, devin->bpm); g_rec_mutex_unlock(devin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(devin_mutex); g_value_set_double(value, devin->delay_factor); g_rec_mutex_unlock(devin_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(devin_mutex); g_value_set_pointer(value, devin->attack); g_rec_mutex_unlock(devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_devin_dispose(GObject *gobject) { AgsDevin *devin; GList *list; devin = AGS_DEVIN(gobject); /* call parent */ G_OBJECT_CLASS(ags_devin_parent_class)->dispose(gobject); } void ags_devin_finalize(GObject *gobject) { AgsDevin *devin; devin = AGS_DEVIN(gobject); ags_uuid_free(devin->uuid); /* free output buffer */ free(devin->buffer[0]); free(devin->buffer[1]); free(devin->buffer[2]); free(devin->buffer[3]); /* free buffer array */ free(devin->buffer); /* free AgsAttack */ free(devin->attack); /* call parent */ G_OBJECT_CLASS(ags_devin_parent_class)->finalize(gobject); } AgsUUID* ags_devin_get_uuid(AgsConnectable *connectable) { AgsDevin *devin; AgsUUID *ptr; GRecMutex *devin_mutex; devin = AGS_DEVIN(connectable); /* get devin signal mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get UUID */ g_rec_mutex_lock(devin_mutex); ptr = devin->uuid; g_rec_mutex_unlock(devin_mutex); return(ptr); } gboolean ags_devin_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_devin_is_ready(AgsConnectable *connectable) { AgsDevin *devin; gboolean is_ready; devin = AGS_DEVIN(connectable); /* check is added */ is_ready = ags_devin_test_flags(devin, AGS_DEVIN_ADDED_TO_REGISTRY); return(is_ready); } void ags_devin_add_to_registry(AgsConnectable *connectable) { AgsDevin *devin; if(ags_connectable_is_ready(connectable)){ return; } devin = AGS_DEVIN(connectable); ags_devin_set_flags(devin, AGS_DEVIN_ADDED_TO_REGISTRY); } void ags_devin_remove_from_registry(AgsConnectable *connectable) { AgsDevin *devin; if(!ags_connectable_is_ready(connectable)){ return; } devin = AGS_DEVIN(connectable); ags_devin_unset_flags(devin, AGS_DEVIN_ADDED_TO_REGISTRY); } xmlNode* ags_devin_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_devin_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_devin_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_devin_is_connected(AgsConnectable *connectable) { AgsDevin *devin; gboolean is_connected; devin = AGS_DEVIN(connectable); /* check is connected */ is_connected = ags_devin_test_flags(devin, AGS_DEVIN_CONNECTED); return(is_connected); } void ags_devin_connect(AgsConnectable *connectable) { AgsDevin *devin; if(ags_connectable_is_connected(connectable)){ return; } devin = AGS_DEVIN(connectable); ags_devin_set_flags(devin, AGS_DEVIN_CONNECTED); } void ags_devin_disconnect(AgsConnectable *connectable) { AgsDevin *devin; if(!ags_connectable_is_connected(connectable)){ return; } devin = AGS_DEVIN(connectable); ags_devin_unset_flags(devin, AGS_DEVIN_CONNECTED); } /** * ags_devin_test_flags: * @devin: the #AgsDevin * @flags: the flags * * Test @flags to be set on @devin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_devin_test_flags(AgsDevin *devin, guint flags) { gboolean retval; GRecMutex *devin_mutex; if(!AGS_IS_DEVIN(devin)){ return(FALSE); } /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* test */ g_rec_mutex_lock(devin_mutex); retval = (flags & (devin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(devin_mutex); return(retval); } /** * ags_devin_set_flags: * @devin: the #AgsDevin * @flags: see #AgsDevinFlags-enum * * Enable a feature of @devin. * * Since: 3.0.0 */ void ags_devin_set_flags(AgsDevin *devin, guint flags) { GRecMutex *devin_mutex; if(!AGS_IS_DEVIN(devin)){ return; } /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(devin_mutex); devin->flags |= flags; g_rec_mutex_unlock(devin_mutex); } /** * ags_devin_unset_flags: * @devin: the #AgsDevin * @flags: see #AgsDevinFlags-enum * * Disable a feature of @devin. * * Since: 3.0.0 */ void ags_devin_unset_flags(AgsDevin *devin, guint flags) { GRecMutex *devin_mutex; if(!AGS_IS_DEVIN(devin)){ return; } /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(devin_mutex); devin->flags &= (~flags); g_rec_mutex_unlock(devin_mutex); } void ags_devin_set_device(AgsSoundcard *soundcard, gchar *device) { AgsDevin *devin; GList *card_id, *card_id_start, *card_name, *card_name_start; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* list cards */ card_id = NULL; card_name = NULL; ags_soundcard_list_cards(soundcard, &card_id, &card_name); card_id_start = card_id; card_name_start = card_name; /* check card */ g_rec_mutex_lock(devin_mutex); while(card_id != NULL){ if(!g_ascii_strncasecmp(card_id->data, device, strlen(card_id->data))){ if((AGS_DEVIN_ALSA & (devin->flags)) != 0){ devin->out.alsa.device = g_strdup(device); }else{ devin->out.oss.device = g_strdup(device); } break; } card_id = card_id->next; } g_rec_mutex_unlock(devin_mutex); /* free card id and name */ g_list_free_full(card_id_start, g_free); g_list_free_full(card_name_start, g_free); } gchar* ags_devin_get_device(AgsSoundcard *soundcard) { AgsDevin *devin; gchar *device; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); device = NULL; g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_ALSA & (devin->flags)) != 0){ device = g_strdup(devin->out.alsa.device); }else if((AGS_DEVIN_OSS & (devin->flags)) != 0){ device = g_strdup(devin->out.oss.device); } g_rec_mutex_unlock(devin_mutex); return(device); } void ags_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsDevin *devin; devin = AGS_DEVIN(soundcard); g_object_set(devin, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get presets */ g_rec_mutex_lock(devin_mutex); if(channels != NULL){ *channels = devin->pcm_channels; } if(rate != NULL){ *rate = devin->samplerate; } if(buffer_size != NULL){ *buffer_size = devin->buffer_size; } if(format != NULL){ *format = devin->format; } g_rec_mutex_unlock(devin_mutex); } void ags_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_ALSA & (devin->flags)) != 0){ #ifdef AGS_WITH_ALSA snd_ctl_t *card_handle; snd_ctl_card_info_t *card_info; char *name; gchar *str; gchar *str_err; int card_num; int device; int error; card_num = -1; while(TRUE){ char *iface; char **hints, **iter; error = snd_card_next(&card_num); if(card_num < 0 || error < 0){ str_err = snd_strerror(error); g_message("Can't get the next card number: %s", str_err); //free(str_err); break; } str = g_strdup_printf("hw:%d", card_num); #ifdef AGS_DEBUG g_message("found soundcard - %s", str); #endif error = snd_ctl_open(&card_handle, str, 0); if(error < 0){ g_free(str); continue; } snd_ctl_card_info_alloca(&card_info); error = snd_ctl_card_info(card_handle, card_info); if(error < 0){ snd_ctl_close(card_handle); g_free(str); continue; } device = -1; error = snd_ctl_pcm_next_device(card_handle, &device); if(error < 0){ snd_ctl_close(card_handle); g_free(str); continue; } iface = "pcm"; hints = NULL; error = snd_device_name_hint(card_num, iface, &hints); if(hints != NULL){ for(iter = hints; iter[0] != NULL; iter++){ if(card_id != NULL){ *card_id = g_list_prepend(*card_id, g_strdup(snd_device_name_get_hint(iter[0], "NAME"))); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(snd_ctl_card_info_get_name(card_info))); } } snd_device_name_free_hint(hints); } snd_ctl_close(card_handle); } snd_config_update_free_global(); #endif }else{ #ifdef AGS_WITH_OSS oss_sysinfo sysinfo; oss_audioinfo ai; char *mixer_device; int mixerfd = -1; int next, n; int i; if((mixer_device = getenv("OSS_MIXERDEV")) == NULL){ mixer_device = "/dev/mixer"; } if((mixerfd = open(mixer_device, O_RDONLY, 0)) == -1){ int e = errno; switch(e){ case ENXIO: case ENODEV: { g_warning("Open Sound System is not running in your system."); } break; case ENOENT: { g_warning("No %s device available in your system.\nPerhaps Open Sound System is not installed or running.", mixer_device); } break; default: g_warning("%s", strerror(e)); } } if(ioctl(mixerfd, SNDCTL_SYSINFO, &sysinfo) == -1){ if(errno == ENXIO){ g_warning("OSS has not detected any supported sound hardware in your system."); }else{ g_warning("SNDCTL_SYSINFO"); if(errno == EINVAL){ g_warning("Error: OSS version 4.0 or later is required"); } } n = 0; }else{ n = sysinfo.numaudios; } memset(&ai, 0, sizeof(oss_audioinfo)); ioctl(mixerfd, SNDCTL_AUDIOINFO_EX, &ai); for(i = 0; i < n; i++){ ai.dev = i; if(ioctl(mixerfd, SNDCTL_ENGINEINFO, &ai) == -1){ int e = errno; g_warning("Can't get device info for /dev/dsp%d (SNDCTL_AUDIOINFO)\nerrno = %d: %s", i, e, strerror(e)); continue; } if((DSP_CAP_OUTPUT & (ai.caps)) != 0){ if(card_id != NULL){ *card_id = g_list_prepend(*card_id, g_strdup_printf("/dev/dsp%i", i)); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(ai.name)); } } next = ai.next_rec_engine; if(next <= 0){ break; } } #endif } g_rec_mutex_unlock(devin_mutex); if(card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_devin_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { AgsDevin *devin; GRecMutex *devin_mutex; if(card_id == NULL){ return; } devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* pcm info */ g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_ALSA & (devin->flags)) != 0){ #ifdef AGS_WITH_ALSA snd_pcm_t *handle; snd_pcm_hw_params_t *params; gchar *str; unsigned int val; int dir; snd_pcm_uframes_t frames; int rc; int err; /* Open PCM device for recordback. */ handle = NULL; rc = snd_pcm_open(&handle, card_id, SND_PCM_STREAM_CAPTURE, 0); if(rc < 0) { str = snd_strerror(rc); g_message("unable to open pcm device: %s\n", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s\n", str); } // free(str); goto ags_devin_pcm_info_ERR; } /* Allocate a hardware parameters object. */ snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */ snd_pcm_hw_params_any(handle, params); /* channels */ snd_pcm_hw_params_get_channels_min(params, &val); *channels_min = val; snd_pcm_hw_params_get_channels_max(params, &val); *channels_max = val; /* samplerate */ dir = 0; snd_pcm_hw_params_get_rate_min(params, &val, &dir); *rate_min = val; dir = 0; snd_pcm_hw_params_get_rate_max(params, &val, &dir); *rate_max = val; /* buffer size */ dir = 0; snd_pcm_hw_params_get_buffer_size_min(params, &frames); *buffer_size_min = frames; dir = 0; snd_pcm_hw_params_get_buffer_size_max(params, &frames); *buffer_size_max = frames; snd_pcm_close(handle); #endif }else{ #ifdef AGS_WITH_OSS oss_audioinfo ainfo; gchar *str; int mixerfd; int acc; unsigned int cmd; mixerfd = open(card_id, O_RDWR, 0); if(mixerfd == -1){ int e = errno; str = strerror(e); g_message("unable to open pcm device: %s\n", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s\n", str); } goto ags_devin_pcm_info_ERR; } memset(&ainfo, 0, sizeof (ainfo)); cmd = SNDCTL_AUDIOINFO; if(card_id != NULL && !g_ascii_strncasecmp(card_id, "/dev/dsp", 8)){ if(strlen(card_id) > 8){ sscanf(card_id, "/dev/dsp%d", &(ainfo.dev)); }else{ ainfo.dev = 0; } }else{ goto ags_devin_pcm_info_ERR; } if(ioctl(mixerfd, cmd, &ainfo) == -1){ int e = errno; str = strerror(e); g_message("unable to retrieve audio info: %s\n", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to retrieve audio info: %s\n", str); } goto ags_devin_pcm_info_ERR; } *channels_min = ainfo.min_channels; *channels_max = ainfo.max_channels; *rate_min = ainfo.min_rate; *rate_max = ainfo.max_rate; *buffer_size_min = 64; *buffer_size_max = 8192; #endif } ags_devin_pcm_info_ERR: g_rec_mutex_unlock(devin_mutex); } guint ags_devin_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_CAPTURE); } gboolean ags_devin_is_available(AgsSoundcard *soundcard) { AgsDevin *devin; gboolean retval; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* check available */ retval = FALSE; //TODO:JK: implement me return(retval); } gboolean ags_devin_is_starting(AgsSoundcard *soundcard) { AgsDevin *devin; gboolean is_starting; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* check is starting */ g_rec_mutex_lock(devin_mutex); is_starting = ((AGS_DEVIN_START_RECORD & (devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(devin_mutex); return(is_starting); } gboolean ags_devin_is_recording(AgsSoundcard *soundcard) { AgsDevin *devin; gboolean is_recording; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* check is starting */ g_rec_mutex_lock(devin_mutex); is_recording = ((AGS_DEVIN_RECORD & (devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(devin_mutex); return(is_recording); } gchar* ags_devin_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_recording(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_devin_delegate_record_init(AgsSoundcard *soundcard, GError **error) { AgsDevin *devin; devin = AGS_DEVIN(soundcard); if(ags_devin_test_flags(devin, AGS_DEVIN_ALSA)){ ags_devin_alsa_init(soundcard, error); }else if(ags_devin_test_flags(devin, AGS_DEVIN_OSS)){ ags_devin_oss_init(soundcard, error); } } void ags_devin_delegate_record(AgsSoundcard *soundcard, GError **error) { AgsDevin *devin; devin = AGS_DEVIN(soundcard); if(ags_devin_test_flags(devin, AGS_DEVIN_ALSA)){ ags_devin_alsa_record(soundcard, error); }else if(ags_devin_test_flags(devin, AGS_DEVIN_OSS)){ ags_devin_oss_record(soundcard, error); } } void ags_devin_delegate_stop(AgsSoundcard *soundcard) { AgsDevin *devin; devin = AGS_DEVIN(soundcard); if(ags_devin_test_flags(devin, AGS_DEVIN_ALSA)){ ags_devin_alsa_free(soundcard); }else if(ags_devin_test_flags(devin, AGS_DEVIN_OSS)){ ags_devin_oss_free(soundcard); } } void ags_devin_oss_init(AgsSoundcard *soundcard, GError **error) { AgsDevin *devin; gchar *str; guint word_size; int format; int tmp; guint i; GRecMutex *devin_mutex; if(ags_soundcard_is_recording(soundcard)){ return; } devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* retrieve word size */ g_rec_mutex_lock(devin_mutex); switch(devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { #ifdef AGS_WITH_OSS format = AFMT_U8; #endif word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { #ifdef AGS_WITH_OSS format = AFMT_S16_NE; #endif word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { #ifdef AGS_WITH_OSS format = AFMT_S24_NE; #endif word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { #ifdef AGS_WITH_OSS format = AFMT_S32_NE; #endif word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } default: g_warning("ags_devin_oss_init(): unsupported word size"); return; } /* prepare for recordback */ devin->flags |= (AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING); memset(devin->buffer[0], 0, devin->pcm_channels * devin->buffer_size * word_size); memset(devin->buffer[1], 0, devin->pcm_channels * devin->buffer_size * word_size); memset(devin->buffer[2], 0, devin->pcm_channels * devin->buffer_size * word_size); memset(devin->buffer[3], 0, devin->pcm_channels * devin->buffer_size * word_size); /* allocate ring buffer */ g_atomic_int_set(&(devin->available), FALSE); devin->ring_buffer = (unsigned char **) malloc(devin->ring_buffer_size * sizeof(unsigned char *)); for(i = 0; i < devin->ring_buffer_size; i++){ devin->ring_buffer[i] = (unsigned char *) malloc(devin->pcm_channels * devin->buffer_size * word_size * sizeof(unsigned char)); } #ifdef AGS_WITH_OSS /* open device fd */ str = devin->out.oss.device; devin->out.oss.device_fd = open(str, O_RDONLY, 0); if(devin->out.oss.device_fd == -1){ devin->flags &= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); g_warning("couldn't open device %s", devin->out.oss.device); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open dsp device: %s\n", str); } return; } //NOTE:JK: unsupported on kfreebsd 9.0 // tmp = APF_NORMAL; // ioctl(devin->out.oss.device_fd, SNDCTL_DSP_PROFILE, &tmp); tmp = format; if(ioctl(devin->out.oss.device_fd, SNDCTL_DSP_SETFMT, &tmp) == -1){ devin->flags &= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = strerror(errno); g_warning("failed to select bits/sample"); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, "unable to open dsp device: %s", str); } devin->out.oss.device_fd = -1; return; } if(tmp != format){ devin->flags &= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = strerror(errno); g_warning("failed to select bits/sample"); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, "unable to open dsp device: %s", str); } devin->out.oss.device_fd = -1; return; } tmp = devin->dsp_channels; if(ioctl(devin->out.oss.device_fd, SNDCTL_DSP_CHANNELS, &tmp) == -1){ devin->flags &= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = strerror(errno); g_warning("Channels count (%i) not available for recordbacks: %s", devin->dsp_channels, str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_CHANNELS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.oss.device_fd = -1; return; } if(tmp != devin->dsp_channels){ devin->flags &= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = strerror(errno); g_warning("Channels count (%i) not available for capture: %s", devin->dsp_channels, str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_CHANNELS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.oss.device_fd = -1; return; } tmp = devin->samplerate; if(ioctl(devin->out.oss.device_fd, SNDCTL_DSP_SPEED, &tmp) == -1){ devin->flags &= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = strerror(errno); g_warning("Rate %iHz not available for capture: %s", devin->samplerate, str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_SAMPLERATE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.oss.device_fd = -1; return; } if(tmp != devin->samplerate){ g_warning("Warning: Capture using %d Hz (file %d Hz)", tmp, devin->samplerate); } #endif devin->tact_counter = 0.0; devin->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(devin))); devin->tic_counter = 0; devin->nth_ring_buffer = 0; #ifdef AGS_WITH_OSS devin->flags |= AGS_DEVIN_INITIALIZED; #endif devin->flags |= AGS_DEVIN_BUFFER0; devin->flags &= (~(AGS_DEVIN_BUFFER1 | AGS_DEVIN_BUFFER2 | AGS_DEVIN_BUFFER3)); g_rec_mutex_unlock(devin_mutex); } void ags_devin_oss_record_fill_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size) { int format_bits; guint word_size; int bps; int res; guint chn; guint count, i; switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(char); bps = 1; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(short); bps = 2; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(long); bps = 3; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(long); bps = 4; } break; default: g_warning("ags_devin_oss_record(): unsupported word size"); return; } /* fill the channel areas */ for(count = 0; count < buffer_size; count++){ for(chn = 0; chn < channels; chn++){ /* Generate data in native endian format */ res = 0; if(ags_endian_host_is_be()){ for(i = 0; i < bps; i++){ res |= (int) (*(ring_buffer + chn * bps + word_size - 1 - i)) << (i * 8); } }else{ for(i = 0; i < bps; i++){ res |= (int) (*(ring_buffer + chn * bps + i)) << (i * 8); } } switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { ((gint8 *) buffer)[count * channels + chn] = res; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { ((gint16 *) buffer)[count * channels + chn] = res; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ((gint32 *) buffer)[count * channels + chn] = res; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ((gint32 *) buffer)[count * channels + chn] = res; } break; } } ring_buffer += channels * bps; } } void ags_devin_oss_record(AgsSoundcard *soundcard, GError **error) { AgsDevin *devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; GList *list; gchar *str; guint word_size; guint nth_buffer; int n_write; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); #ifdef AGS_WITH_OSS /* lock */ g_rec_mutex_lock(devin_mutex); /* retrieve word size */ switch(devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } //NOTE:JK: not available break; default: g_warning("ags_devin_oss_record(): unsupported word size"); return; } /* do capture */ devin->flags &= (~AGS_DEVIN_START_RECORD); if((AGS_DEVIN_INITIALIZED & (devin->flags)) == 0){ g_rec_mutex_unlock(devin_mutex); return; } /* check buffer flag */ nth_buffer = 0; if((AGS_DEVIN_BUFFER0 & (devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_DEVIN_BUFFER1 & (devin->flags)) != 0){ nth_buffer = 1; }else if((AGS_DEVIN_BUFFER2 & (devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_DEVIN_BUFFER3 & (devin->flags)) != 0){ nth_buffer = 3; } /* write ring buffer */ n_write = read(devin->out.oss.device_fd, devin->ring_buffer[devin->nth_ring_buffer], devin->pcm_channels * devin->buffer_size * word_size * sizeof (char)); /* fill buffer */ ags_soundcard_lock_buffer(soundcard, devin->buffer[nth_buffer]); ags_devin_oss_record_fill_buffer(devin->buffer[nth_buffer], devin->format, devin->ring_buffer[devin->nth_ring_buffer], devin->pcm_channels, devin->buffer_size); ags_soundcard_unlock_buffer(soundcard, devin->buffer[nth_buffer]); g_atomic_int_set(&(devin->available), FALSE); if(n_write != devin->pcm_channels * devin->buffer_size * word_size * sizeof (char)){ g_critical("write() return doesn't match written bytes"); } /* increment nth ring-buffer */ if(devin->nth_ring_buffer + 1 >= devin->ring_buffer_size){ devin->nth_ring_buffer = 0; }else{ devin->nth_ring_buffer += 1; } g_rec_mutex_unlock(devin_mutex); #endif /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) devin); task = g_list_append(task, clear_buffer); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_devin_oss_free(AgsSoundcard *soundcard) { AgsDevin *devin; guint i; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* */ g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_INITIALIZED & (devin->flags)) == 0){ g_rec_mutex_unlock(devin_mutex); return; } close(devin->out.oss.device_fd); devin->out.oss.device_fd = -1; /* free ring-buffer */ g_atomic_int_set(&(devin->available), FALSE); for(i = 0; i < devin->ring_buffer_size; i++){ free(devin->ring_buffer[i]); } free(devin->ring_buffer); devin->ring_buffer = NULL; /* reset flags */ devin->flags &= (~(AGS_DEVIN_BUFFER0 | AGS_DEVIN_BUFFER1 | AGS_DEVIN_BUFFER2 | AGS_DEVIN_BUFFER3 | AGS_DEVIN_RECORD | AGS_DEVIN_INITIALIZED)); devin->note_offset = devin->start_note_offset; devin->note_offset_absolute = devin->start_note_offset; g_rec_mutex_unlock(devin_mutex); } void ags_devin_alsa_init(AgsSoundcard *soundcard, GError **error) { AgsDevin *devin; #ifdef AGS_WITH_ALSA snd_pcm_t *handle; snd_pcm_hw_params_t *hwparams; snd_pcm_sw_params_t *swparams; gchar *str; int rc; unsigned int val; snd_pcm_uframes_t frames; unsigned int rate; unsigned int rrate; unsigned int channels; snd_pcm_uframes_t size; snd_pcm_sframes_t buffer_size; snd_pcm_sframes_t period_size; snd_pcm_format_t format; int period_event; int err, dir; #endif guint word_size; guint i; GRecMutex *devin_mutex; static unsigned int period_time = 100000; static unsigned int buffer_time = 100000; if(ags_soundcard_is_recording(soundcard)){ return; } devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* retrieve word size */ g_rec_mutex_lock(devin_mutex); if(devin->out.alsa.device == NULL){ g_rec_mutex_unlock(devin_mutex); return; } #ifdef AGS_WITH_ALSA format = 0; #endif switch(devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S8; #endif word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S16; #endif word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S24; #endif //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { #ifdef AGS_WITH_ALSA format = SND_PCM_FORMAT_S32; #endif word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(devin_mutex); g_warning("ags_devin_alsa_init(): unsupported word size"); return; } /* prepare for playback */ devin->flags |= (AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING); memset(devin->buffer[0], 0, devin->pcm_channels * devin->buffer_size * word_size); memset(devin->buffer[1], 0, devin->pcm_channels * devin->buffer_size * word_size); memset(devin->buffer[2], 0, devin->pcm_channels * devin->buffer_size * word_size); memset(devin->buffer[3], 0, devin->pcm_channels * devin->buffer_size * word_size); /* allocate ring buffer */ #ifdef AGS_WITH_ALSA g_atomic_int_set(&(devin->available), FALSE); devin->ring_buffer = (unsigned char **) malloc(devin->ring_buffer_size * sizeof(unsigned char *)); for(i = 0; i < devin->ring_buffer_size; i++){ devin->ring_buffer[i] = (unsigned char *) malloc(devin->pcm_channels * devin->buffer_size * (snd_pcm_format_physical_width(format) / 8) * sizeof(unsigned char)); } /* */ period_event = 0; /* Open PCM device for playback. */ handle = NULL; if((err = snd_pcm_open(&handle, devin->out.alsa.device, SND_PCM_STREAM_CAPTURE, 0)) < 0){ gchar *device_fixup; str = snd_strerror(err); g_warning("Playback open error (attempting fixup): %s", str); device_fixup = g_strdup_printf("%s,0", devin->out.alsa.device); handle = NULL; if((err = snd_pcm_open(&handle, device_fixup, SND_PCM_STREAM_CAPTURE, 0)) < 0){ devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_LOCKED_SOUNDCARD, "unable to open pcm device: %s", str); } return; } } snd_pcm_hw_params_alloca(&hwparams); snd_pcm_sw_params_alloca(&swparams); /* choose all parameters */ err = snd_pcm_hw_params_any(handle, hwparams); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Broken configuration for playback: no configurations available: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_BROKEN_CONFIGURATION, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } /* set hardware resampling * / err = snd_pcm_hw_params_set_rate_resample(handle, hwparams, 0); if (err < 0) { g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Resampling setup failed for playback: %s\n", str); // free(str); return; } */ /* set the interleaved read/write format */ err = snd_pcm_hw_params_set_access(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Access type not available for playback: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_ACCESS_TYPE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } /* set the sample format */ err = snd_pcm_hw_params_set_format(handle, hwparams, format); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Sample format not available for playback: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_SAMPLE_FORMAT_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } /* set the count of channels */ channels = devin->pcm_channels; err = snd_pcm_hw_params_set_channels(handle, hwparams, channels); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Channels count (%i) not available for playbacks: %s", channels, str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_CHANNELS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } /* set the stream rate */ rate = devin->samplerate; rrate = rate; err = snd_pcm_hw_params_set_rate_near(handle, hwparams, &rrate, 0); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Rate %iHz not available for playback: %s", rate, str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_SAMPLERATE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } if (rrate != rate) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); g_warning("Rate doesn't match (requested %iHz, get %iHz)", rate, err); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_SAMPLERATE_NOT_AVAILABLE, "unable to open pcm device"); } devin->out.alsa.handle = NULL; return; } /* set the buffer size */ size = 2 * devin->buffer_size; err = snd_pcm_hw_params_set_buffer_size(handle, hwparams, size); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to set buffer size %lu for playback: %s", size, str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_BUFFER_SIZE_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } /* set the period size * / period_size = devin->buffer_size; err = snd_pcm_hw_params_set_period_size_near(handle, hwparams, period_size, dir); if (err < 0) { g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to get period size for playback: %s\n", str); // free(str); return; } */ /* write the parameters to device */ err = snd_pcm_hw_params(handle, hwparams); if (err < 0) { devin->flags |= (~(AGS_DEVIN_START_RECORD | AGS_DEVIN_RECORD | AGS_DEVIN_NONBLOCKING)); g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to set hw params for playback: %s", str); if(error != NULL){ g_set_error(error, AGS_DEVIN_ERROR, AGS_DEVIN_ERROR_HW_PARAMETERS_NOT_AVAILABLE, "unable to open pcm device: %s", str); } devin->out.alsa.handle = NULL; // free(str); return; } /* get the current swparams * / err = snd_pcm_sw_params_current(handle, swparams); if (err < 0) { g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to determine current swparams for playback: %s\n", str); // free(str); return; } */ /* start the transfer when the buffer is almost full: */ /* (buffer_size / avail_min) * avail_min * / err = snd_pcm_sw_params_set_start_threshold(handle, swparams, (buffer_size / period_size) * period_size); if (err < 0) { g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to set start threshold mode for playback: %s\n", str); // free(str); return; } */ /* allow the transfer when at least period_size samples can be processed */ /* or disable this mechanism when period event is enabled (aka interrupt like style processing) * / err = snd_pcm_sw_params_set_avail_min(handle, swparams, period_event ? buffer_size : period_size); if (err < 0) { g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to set avail min for playback: %s\n", str); // free(str); return; } /* write the parameters to the playback device * / err = snd_pcm_sw_params(handle, swparams); if (err < 0) { g_rec_mutex_unlock(devin_mutex); str = snd_strerror(err); g_warning("Unable to set sw params for playback: %s\n", str); // free(str); return; } */ /* */ devin->out.alsa.handle = handle; #endif devin->tact_counter = 0.0; devin->delay_counter = 0.0; devin->tic_counter = 0; devin->nth_ring_buffer = 0; #ifdef AGS_WITH_ALSA devin->flags |= AGS_DEVIN_INITIALIZED; #endif devin->flags |= AGS_DEVIN_BUFFER0; devin->flags &= (~(AGS_DEVIN_BUFFER1 | AGS_DEVIN_BUFFER2 | AGS_DEVIN_BUFFER3)); g_rec_mutex_unlock(devin_mutex); } void ags_devin_alsa_record_fill_buffer(void *buffer, guint ags_format, unsigned char *ring_buffer, guint channels, guint buffer_size) { #ifdef AGS_WITH_ALSA snd_pcm_format_t format; int format_bits; unsigned int max_val; int bps; /* bytes per sample */ int phys_bps; int big_endian; int to_unsigned; int res; gint count; guint i, chn; switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { format = SND_PCM_FORMAT_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { format = SND_PCM_FORMAT_S16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { format = SND_PCM_FORMAT_S24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { format = SND_PCM_FORMAT_S32; } break; default: g_warning("ags_devin_alsa_record(): unsupported word size"); return; } count = buffer_size; format_bits = snd_pcm_format_width(format); max_val = (1 << (format_bits - 1)) - 1; bps = format_bits / 8; phys_bps = snd_pcm_format_physical_width(format) / 8; big_endian = snd_pcm_format_big_endian(format) == 1; to_unsigned = snd_pcm_format_unsigned(format) == 1; /* fill the channel areas */ for(count = 0; count < buffer_size; count++){ for(chn = 0; chn < channels; chn++){ /* Generate data in native endian format */ res = 0; if (big_endian) { for (i = 0; i < bps; i++) res |= (int) (*(ring_buffer + chn * bps + phys_bps - 1 - i) << (i * 8)); } else { for (i = 0; i < bps; i++) res |= (int) (*(ring_buffer + chn * bps + i) << (i * 8)); } if(to_unsigned){ res |= 1U << (format_bits - 1); } switch(ags_format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { ((gint8 *) buffer)[count * channels + chn] = res; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { ((gint16 *) buffer)[count * channels + chn] = res; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ((gint32 *) buffer)[count * channels + chn] = res; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ((gint32 *) buffer)[count * channels + chn] = res; } break; } } ring_buffer += channels * bps; } #endif } void ags_devin_alsa_record(AgsSoundcard *soundcard, GError **error) { AgsDevin *devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; GList *list; gchar *str; guint word_size; guint nth_buffer; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* lock */ g_rec_mutex_lock(devin_mutex); /* retrieve word size */ switch(devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(devin_mutex); g_warning("ags_devin_alsa_record(): unsupported word size"); return; } /* do capture */ devin->flags &= (~AGS_DEVIN_START_RECORD); if((AGS_DEVIN_INITIALIZED & (devin->flags)) == 0){ g_rec_mutex_unlock(devin_mutex); return; } // g_message("record - 0x%0x", ((AGS_DEVIN_BUFFER0 | // AGS_DEVIN_BUFFER1 | // AGS_DEVIN_BUFFER2 | // AGS_DEVIN_BUFFER3) & (devin->flags))); /* check buffer flag */ nth_buffer = 0; if((AGS_DEVIN_BUFFER0 & (devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_DEVIN_BUFFER1 & (devin->flags)) != 0){ nth_buffer = 1; }else if((AGS_DEVIN_BUFFER2 & (devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_DEVIN_BUFFER3 & (devin->flags)) != 0){ nth_buffer = 3; } #ifdef AGS_WITH_ALSA /* write ring buffer */ devin->out.alsa.rc = snd_pcm_readi(devin->out.alsa.handle, devin->ring_buffer[devin->nth_ring_buffer], (snd_pcm_uframes_t) (devin->buffer_size)); /* fill buffer */ ags_soundcard_lock_buffer(soundcard, devin->buffer[nth_buffer]); ags_devin_alsa_record_fill_buffer(devin->buffer[nth_buffer], devin->format, devin->ring_buffer[devin->nth_ring_buffer], devin->pcm_channels, devin->buffer_size); ags_soundcard_unlock_buffer(soundcard, devin->buffer[nth_buffer]); g_atomic_int_set(&(devin->available), FALSE); /* check error flag */ if((AGS_DEVIN_NONBLOCKING & (devin->flags)) == 0){ if(devin->out.alsa.rc == -EPIPE){ /* EPIPE means underrun */ snd_pcm_prepare(devin->out.alsa.handle); #ifdef AGS_DEBUG g_message("underrun occurred"); #endif }else if(devin->out.alsa.rc == -ESTRPIPE){ static const struct timespec idle = { 0, 4000, }; int err; while((err = snd_pcm_resume(devin->out.alsa.handle)) < 0){ // == -EAGAIN nanosleep(&idle, NULL); /* wait until the suspend flag is released */ } if(err < 0){ err = snd_pcm_prepare(devin->out.alsa.handle); } }else if(devin->out.alsa.rc < 0){ str = snd_strerror(devin->out.alsa.rc); g_message("error from writei: %s", str); }else if(devin->out.alsa.rc != (int) devin->buffer_size) { g_message("short write, write %d frames", devin->out.alsa.rc); } } #endif /* increment nth ring-buffer */ g_atomic_int_set(&(devin->available), FALSE); if(devin->nth_ring_buffer + 1 >= devin->ring_buffer_size){ devin->nth_ring_buffer = 0; }else{ devin->nth_ring_buffer += 1; } g_rec_mutex_unlock(devin_mutex); /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); #ifdef AGS_WITH_ALSA snd_pcm_prepare(devin->out.alsa.handle); #endif /* unref */ g_object_unref(task_launcher); } void ags_devin_alsa_free(AgsSoundcard *soundcard) { AgsDevin *devin; AgsApplicationContext *application_context; guint i; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* lock */ g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_INITIALIZED & (devin->flags)) == 0 || devin->out.alsa.handle == NULL){ g_rec_mutex_unlock(devin_mutex); return; } #ifdef AGS_WITH_ALSA // snd_pcm_drain(devin->out.alsa.handle); snd_pcm_close(devin->out.alsa.handle); devin->out.alsa.handle = NULL; #endif /* free ring-buffer */ for(i = 0; i < devin->ring_buffer_size; i++){ free(devin->ring_buffer[i]); } free(devin->ring_buffer); devin->ring_buffer = NULL; /* reset flags */ devin->flags &= (~(AGS_DEVIN_BUFFER0 | AGS_DEVIN_BUFFER1 | AGS_DEVIN_BUFFER2 | AGS_DEVIN_BUFFER3 | AGS_DEVIN_RECORD | AGS_DEVIN_INITIALIZED)); devin->note_offset = devin->start_note_offset; devin->note_offset_absolute = devin->start_note_offset; g_rec_mutex_unlock(devin_mutex); } void ags_devin_tic(AgsSoundcard *soundcard) { AgsDevin *devin; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* determine if attack should be switched */ g_rec_mutex_lock(devin_mutex); delay = devin->delay[devin->tic_counter]; delay_counter = devin->delay_counter; note_offset = devin->note_offset; note_offset_absolute = devin->note_offset_absolute; loop_left = devin->loop_left; loop_right = devin->loop_right; do_loop = devin->do_loop; g_rec_mutex_unlock(devin_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(devin_mutex); devin->delay_counter = delay_counter + 1.0 - delay; devin->tact_counter += 1.0; g_rec_mutex_unlock(devin_mutex); }else{ g_rec_mutex_lock(devin_mutex); devin->delay_counter += 1.0; g_rec_mutex_unlock(devin_mutex); } } void ags_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* offset changed */ g_rec_mutex_lock(devin_mutex); devin->tic_counter += 1; if(devin->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ devin->tic_counter = 0; } g_rec_mutex_unlock(devin_mutex); } void ags_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set bpm */ g_rec_mutex_lock(devin_mutex); devin->bpm = bpm; g_rec_mutex_unlock(devin_mutex); ags_devin_adjust_delay_and_attack(devin); } gdouble ags_devin_get_bpm(AgsSoundcard *soundcard) { AgsDevin *devin; gdouble bpm; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get bpm */ g_rec_mutex_lock(devin_mutex); bpm = devin->bpm; g_rec_mutex_unlock(devin_mutex); return(bpm); } void ags_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set delay factor */ g_rec_mutex_lock(devin_mutex); devin->delay_factor = delay_factor; g_rec_mutex_unlock(devin_mutex); ags_devin_adjust_delay_and_attack(devin); } gdouble ags_devin_get_delay_factor(AgsSoundcard *soundcard) { AgsDevin *devin; gdouble delay_factor; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get delay factor */ g_rec_mutex_lock(devin_mutex); delay_factor = devin->delay_factor; g_rec_mutex_unlock(devin_mutex); return(delay_factor); } gdouble ags_devin_get_delay(AgsSoundcard *soundcard) { AgsDevin *devin; guint index; gdouble delay; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get delay */ g_rec_mutex_lock(devin_mutex); index = devin->tic_counter; delay = devin->delay[index]; g_rec_mutex_unlock(devin_mutex); return(delay); } gdouble ags_devin_get_absolute_delay(AgsSoundcard *soundcard) { AgsDevin *devin; gdouble absolute_delay; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get absolute delay */ g_rec_mutex_lock(devin_mutex); absolute_delay = (60.0 * (((gdouble) devin->samplerate / (gdouble) devin->buffer_size) / (gdouble) devin->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) devin->delay_factor))); g_rec_mutex_unlock(devin_mutex); return(absolute_delay); } guint ags_devin_get_attack(AgsSoundcard *soundcard) { AgsDevin *devin; guint index; guint attack; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get attack */ g_rec_mutex_lock(devin_mutex); index = devin->tic_counter; attack = devin->attack[index]; g_rec_mutex_unlock(devin_mutex); return(attack); } void* ags_devin_get_buffer(AgsSoundcard *soundcard) { AgsDevin *devin; void *buffer; devin = AGS_DEVIN(soundcard); if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER0)){ buffer = devin->buffer[0]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER1)){ buffer = devin->buffer[1]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER2)){ buffer = devin->buffer[2]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER3)){ buffer = devin->buffer[3]; }else{ buffer = NULL; } return(buffer); } void* ags_devin_get_next_buffer(AgsSoundcard *soundcard) { AgsDevin *devin; void *buffer; devin = AGS_DEVIN(soundcard); // g_message("next - 0x%0x", ((AGS_DEVIN_BUFFER0 | // AGS_DEVIN_BUFFER1 | // AGS_DEVIN_BUFFER2 | // AGS_DEVIN_BUFFER3) & (devin->flags))); if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER0)){ buffer = devin->buffer[1]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER1)){ buffer = devin->buffer[2]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER2)){ buffer = devin->buffer[3]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER3)){ buffer = devin->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_devin_get_prev_buffer(AgsSoundcard *soundcard) { AgsDevin *devin; void *buffer; devin = AGS_DEVIN(soundcard); if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER0)){ buffer = devin->buffer[3]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER1)){ buffer = devin->buffer[0]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER2)){ buffer = devin->buffer[1]; }else if(ags_devin_test_flags(devin, AGS_DEVIN_BUFFER3)){ buffer = devin->buffer[2]; }else{ buffer = NULL; } return(buffer); } void ags_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsDevin *devin; GRecMutex *buffer_mutex; devin = AGS_DEVIN(soundcard); buffer_mutex = NULL; if(devin->buffer != NULL){ if(buffer == devin->buffer[0]){ buffer_mutex = devin->buffer_mutex[0]; }else if(buffer == devin->buffer[1]){ buffer_mutex = devin->buffer_mutex[1]; }else if(buffer == devin->buffer[2]){ buffer_mutex = devin->buffer_mutex[2]; }else if(buffer == devin->buffer[3]){ buffer_mutex = devin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsDevin *devin; GRecMutex *buffer_mutex; devin = AGS_DEVIN(soundcard); buffer_mutex = NULL; if(devin->buffer != NULL){ if(buffer == devin->buffer[0]){ buffer_mutex = devin->buffer_mutex[0]; }else if(buffer == devin->buffer[1]){ buffer_mutex = devin->buffer_mutex[1]; }else if(buffer == devin->buffer[2]){ buffer_mutex = devin->buffer_mutex[2]; }else if(buffer == devin->buffer[3]){ buffer_mutex = devin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_devin_get_delay_counter(AgsSoundcard *soundcard) { AgsDevin *devin; guint delay_counter; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* delay counter */ g_rec_mutex_lock(devin_mutex); delay_counter = devin->delay_counter; g_rec_mutex_unlock(devin_mutex); return(delay_counter); } void ags_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set note offset */ g_rec_mutex_lock(devin_mutex); devin->start_note_offset = start_note_offset; g_rec_mutex_unlock(devin_mutex); } guint ags_devin_get_start_note_offset(AgsSoundcard *soundcard) { AgsDevin *devin; guint start_note_offset; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set note offset */ g_rec_mutex_lock(devin_mutex); start_note_offset = devin->start_note_offset; g_rec_mutex_unlock(devin_mutex); return(start_note_offset); } void ags_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set note offset */ g_rec_mutex_lock(devin_mutex); devin->note_offset = note_offset; g_rec_mutex_unlock(devin_mutex); } guint ags_devin_get_note_offset(AgsSoundcard *soundcard) { AgsDevin *devin; guint note_offset; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set note offset */ g_rec_mutex_lock(devin_mutex); note_offset = devin->note_offset; g_rec_mutex_unlock(devin_mutex); return(note_offset); } void ags_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set note offset */ g_rec_mutex_lock(devin_mutex); devin->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(devin_mutex); } guint ags_devin_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsDevin *devin; guint note_offset_absolute; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set note offset */ g_rec_mutex_lock(devin_mutex); note_offset_absolute = devin->note_offset_absolute; g_rec_mutex_unlock(devin_mutex); return(note_offset_absolute); } void ags_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* set loop */ g_rec_mutex_lock(devin_mutex); devin->loop_left = loop_left; devin->loop_right = loop_right; devin->do_loop = do_loop; if(do_loop){ devin->loop_offset = devin->note_offset; } g_rec_mutex_unlock(devin_mutex); } void ags_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsDevin *devin; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get loop */ g_rec_mutex_lock(devin_mutex); if(loop_left != NULL){ *loop_left = devin->loop_left; } if(loop_right != NULL){ *loop_right = devin->loop_right; } if(do_loop != NULL){ *do_loop = devin->do_loop; } g_rec_mutex_unlock(devin_mutex); } guint ags_devin_get_loop_offset(AgsSoundcard *soundcard) { AgsDevin *devin; guint loop_offset; GRecMutex *devin_mutex; devin = AGS_DEVIN(soundcard); /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get loop offset */ g_rec_mutex_lock(devin_mutex); loop_offset = devin->loop_offset; g_rec_mutex_unlock(devin_mutex); return(loop_offset); } /** * ags_devin_switch_buffer_flag: * @devin: the #AgsDevin * * The buffer flag indicates the currently recorded buffer. * * Since: 3.0.0 */ void ags_devin_switch_buffer_flag(AgsDevin *devin) { GRecMutex *devin_mutex; if(!AGS_IS_DEVIN(devin)){ return; } /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* switch buffer flag */ g_rec_mutex_lock(devin_mutex); if((AGS_DEVIN_BUFFER0 & (devin->flags)) != 0){ devin->flags &= (~AGS_DEVIN_BUFFER0); devin->flags |= AGS_DEVIN_BUFFER1; }else if((AGS_DEVIN_BUFFER1 & (devin->flags)) != 0){ devin->flags &= (~AGS_DEVIN_BUFFER1); devin->flags |= AGS_DEVIN_BUFFER2; }else if((AGS_DEVIN_BUFFER2 & (devin->flags)) != 0){ devin->flags &= (~AGS_DEVIN_BUFFER2); devin->flags |= AGS_DEVIN_BUFFER3; }else if((AGS_DEVIN_BUFFER3 & (devin->flags)) != 0){ devin->flags &= (~AGS_DEVIN_BUFFER3); devin->flags |= AGS_DEVIN_BUFFER0; } g_rec_mutex_unlock(devin_mutex); } /** * ags_devin_adjust_delay_and_attack: * @devin: the #AgsDevin * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_devin_adjust_delay_and_attack(AgsDevin *devin) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *devin_mutex; if(!AGS_IS_DEVIN(devin)){ return; } /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get some initial values */ delay = ags_devin_get_absolute_delay(AGS_SOUNDCARD(devin)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif default_tact_frames = (guint) (delay * devin->buffer_size); delay_tact_frames = (guint) (floor(delay) * devin->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; devin->attack[0] = (guint) floor(0.25 * devin->buffer_size); next_attack = (((devin->attack[i] + default_tact_frames) / devin->buffer_size) - delay) * devin->buffer_size; if(next_attack >= devin->buffer_size){ next_attack = devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ devin->attack[i] = devin->attack[i] - ((gdouble) next_attack / 2.0); if(devin->attack[i] < 0){ devin->attack[i] = 0; } if(devin->attack[i] >= devin->buffer_size){ devin->attack[i] = devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= devin->buffer_size){ next_attack = devin->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ devin->attack[i] = next_attack; next_attack = (((devin->attack[i] + default_tact_frames) / devin->buffer_size) - delay) * devin->buffer_size; if(next_attack >= devin->buffer_size){ next_attack = devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ devin->attack[i] = devin->attack[i] - ((gdouble) next_attack / 2.0); if(devin->attack[i] < 0){ devin->attack[i] = 0; } if(devin->attack[i] >= devin->buffer_size){ devin->attack[i] = devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= devin->buffer_size){ next_attack = devin->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", devin->attack[i]); #endif } devin->attack[0] = devin->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ devin->delay[i] = ((gdouble) (default_tact_frames + devin->attack[i] - devin->attack[i + 1])) / (gdouble) devin->buffer_size; #ifdef AGS_DEBUG g_message("%f", devin->delay[i]); #endif } devin->delay[i] = ((gdouble) (default_tact_frames + devin->attack[i] - devin->attack[0])) / (gdouble) devin->buffer_size; g_rec_mutex_unlock(devin_mutex); } /** * ags_devin_realloc_buffer: * @devin: the #AgsDevin * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_devin_realloc_buffer(AgsDevin *devin) { guint pcm_channels; guint buffer_size; guint word_size; GRecMutex *devin_mutex; if(!AGS_IS_DEVIN(devin)){ return; } /* get devin mutex */ devin_mutex = AGS_DEVIN_GET_OBJ_MUTEX(devin); /* get word size */ g_rec_mutex_lock(devin_mutex); pcm_channels = devin->pcm_channels; buffer_size = devin->buffer_size; switch(devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_warning("ags_devin_realloc_buffer(): unsupported word size"); return; } g_rec_mutex_unlock(devin_mutex); //NOTE:JK: there is no lock applicable to buffer /* AGS_DEVIN_BUFFER_0 */ if(devin->buffer[0] != NULL){ free(devin->buffer[0]); } devin->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_DEVIN_BUFFER_1 */ if(devin->buffer[1] != NULL){ free(devin->buffer[1]); } devin->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_DEVIN_BUFFER_2 */ if(devin->buffer[2] != NULL){ free(devin->buffer[2]); } devin->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_DEVIN_BUFFER_3 */ if(devin->buffer[3] != NULL){ free(devin->buffer[3]); } devin->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_devin_new: * * Creates a new instance of #AgsDevin. * * Returns: the new #AgsDevin * * Since: 3.0.0 */ AgsDevin* ags_devin_new() { AgsDevin *devin; devin = (AgsDevin *) g_object_new(AGS_TYPE_DEVIN, NULL); return(devin); } gsequencer-3.1.3/ags/audio/ags_recall.h0000644000175000017500000003051113616617253014732 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_H__ #define __AGS_RECALL_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL (ags_recall_get_type()) #define AGS_RECALL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL, AgsRecall)) #define AGS_RECALL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL, AgsRecallClass)) #define AGS_IS_RECALL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RECALL)) #define AGS_IS_RECALL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RECALL)) #define AGS_RECALL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_RECALL, AgsRecallClass)) #define AGS_RECALL_HANDLER(handler) ((AgsRecallHandler *)(handler)) #define AGS_RECALL_GET_OBJ_MUTEX(obj) (&(((AgsRecall *) obj)->obj_mutex)) #define AGS_RECALL_DEFAULT_VERSION "2.0.0" #define AGS_RECALL_DEFAULT_BUILD_ID "Tue Feb 6 14:27:35 UTC 2018" typedef struct _AgsRecall AgsRecall; typedef struct _AgsRecallClass AgsRecallClass; typedef struct _AgsRecallHandler AgsRecallHandler; /** * AgsRecallFlags: * @AGS_RECALL_ADDED_TO_REGISTRY: the recall was added to registry, see #AgsConnectable::add_to_registry() * @AGS_RECALL_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_RECALL_TEMPLATE: is template * @AGS_RECALL_DEFAULT_TEMPLATE: is default template * @AGS_RECALL_HAS_OUTPUT_PORT: has output port * @AGS_RECALL_BYPASS: don't apply effect processing * @AGS_RECALL_INITIAL_RUN: initial run, first attack to audio data * * Enum values to control the behavior or indicate internal state of #AgsRecall by * enable/disable as flags. */ typedef enum{ AGS_RECALL_ADDED_TO_REGISTRY = 1, AGS_RECALL_CONNECTED = 1 << 1, AGS_RECALL_TEMPLATE = 1 << 2, AGS_RECALL_DEFAULT_TEMPLATE = 1 << 3, AGS_RECALL_HAS_OUTPUT_PORT = 1 << 4, AGS_RECALL_BYPASS = 1 << 5, AGS_RECALL_INITIAL_RUN = 1 << 6, }AgsRecallFlags; /** * AgsRecallNotifyDependencyMode: * @AGS_RECALL_NOTIFY_RUN: notify dependency as calling run * @AGS_RECALL_NOTIFY_AUDIO: notify dependency audio * @AGS_RECALL_NOTIFY_AUDIO_RUN: notifiy dependency audio run * @AGS_RECALL_NOTIFY_CHANNEL: notifiy dependency channel * @AGS_RECALL_NOTIFY_CHANNEL_RUN: notifiy dependency channel run * @AGS_RECALL_NOTIFY_RECALL: notifiy dependency recall * * Modes to notify of dependencies. */ typedef enum{ AGS_RECALL_NOTIFY_RUN, AGS_RECALL_NOTIFY_AUDIO, AGS_RECALL_NOTIFY_AUDIO_RUN, AGS_RECALL_NOTIFY_CHANNEL, AGS_RECALL_NOTIFY_CHANNEL_RUN, AGS_RECALL_NOTIFY_RECALL, }AgsRecallNotifyDependencyMode; struct _AgsRecall { GObject gobject; guint flags; guint ability_flags; guint behaviour_flags; gint sound_scope; guint staging_flags; guint state_flags; // gboolean rt_safe; note replace by globals GRecMutex obj_mutex; AgsUUID *uuid; gchar *version; gchar *build_id; gchar *name; gchar *filename; gchar *effect; guint effect_index; gchar *xml_type; GObject *recall_container; GObject *output_soundcard; gint output_soundcard_channel; GObject *input_soundcard; gint input_soundcard_channel; guint samplerate; guint buffer_size; guint format; guint pad; guint audio_channel; guint line; GList *port; GList *automation_port; AgsRecallID *recall_id; GList *recall_dependency; GList *recall_handler; AgsRecall *parent; GType child_type; guint n_child_params; gchar **child_parameter_name; GValue *child_value; GList *children; }; struct _AgsRecallClass { GObjectClass gobject; void (*resolve_dependency)(AgsRecall *recall); void (*check_rt_data)(AgsRecall *recall); void (*run_init_pre)(AgsRecall *recall); void (*run_init_inter)(AgsRecall *recall); void (*run_init_post)(AgsRecall *recall); void (*feed_input_queue)(AgsRecall *recall); void (*automate)(AgsRecall *recall); void (*run_pre)(AgsRecall *recall); void (*run_inter)(AgsRecall *recall); void (*run_post)(AgsRecall *recall); void (*do_feedback)(AgsRecall *recall); void (*feed_output_queue)(AgsRecall *recall); void (*stop_persistent)(AgsRecall *recall); void (*cancel)(AgsRecall *recall); void (*done)(AgsRecall *recall); AgsRecall* (*duplicate)(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); void (*notify_dependency)(AgsRecall *recall, guint dependency, gboolean increase); void (*child_added)(AgsRecall *recall, AgsRecall *child); }; /** * AgsRecallHandler: * @signal_name: the signal to listen * @callback: the callback to use * @data: user data to pass * * A #AgsRecallHandler-struct acts as a callback definition */ struct _AgsRecallHandler { const gchar *signal_name; GCallback callback; GObject *data; }; GType ags_recall_get_type(); void ags_recall_global_set_omit_event(gboolean omit_event); gboolean ags_recall_global_get_children_lock_free(); gboolean ags_recall_global_get_omit_event(); gboolean ags_recall_global_get_performance_mode(); gboolean ags_recall_global_get_rt_safe(); GRecMutex* ags_recall_get_obj_mutex(AgsRecall *recall); gboolean ags_recall_test_flags(AgsRecall *recall, guint flags); void ags_recall_set_flags(AgsRecall *recall, guint flags); void ags_recall_unset_flags(AgsRecall *recall, guint flags); /* ability flags */ gboolean ags_recall_test_ability_flags(AgsRecall *recall, guint ability_flags); void ags_recall_set_ability_flags(AgsRecall *recall, guint ability_flags); void ags_recall_unset_ability_flags(AgsRecall *recall, guint ability_flags); gboolean ags_recall_check_ability_flags(AgsRecall *recall, guint ability_flags); gboolean ags_recall_match_ability_flags_to_scope(AgsRecall *recall, gint sound_scope); /* behaviour flags */ gboolean ags_recall_test_behaviour_flags(AgsRecall *recall, guint behaviour_flags); void ags_recall_set_behaviour_flags(AgsRecall *recall, guint behaviour_flags); void ags_recall_unset_behaviour_flags(AgsRecall *recall, guint behaviour_flags); gboolean ags_recall_check_behaviour_flags(AgsRecall *recall, guint behaviour_flags); /* scope */ void ags_recall_set_sound_scope(AgsRecall *recall, gint sound_scope); gint ags_recall_get_sound_scope(AgsRecall *recall); gboolean ags_recall_check_sound_scope(AgsRecall *recall, gint sound_scope); /* staging flags */ gboolean ags_recall_test_staging_flags(AgsRecall *recall, guint staging_flags); void ags_recall_set_staging_flags(AgsRecall *recall, guint staging_flags); void ags_recall_unset_staging_flags(AgsRecall *recall, guint staging_flags); gboolean ags_recall_check_staging_flags(AgsRecall *recall, guint staging_flags); /* state flags */ gboolean ags_recall_test_state_flags(AgsRecall *recall, guint state_flags); void ags_recall_set_state_flags(AgsRecall *recall, guint state_flags); void ags_recall_unset_state_flags(AgsRecall *recall, guint state_flags); gboolean ags_recall_check_state_flags(AgsRecall *recall, guint state_flags); /* fields */ gchar* ags_recall_get_filename(AgsRecall *recall); void ags_recall_set_filename(AgsRecall *recall, gchar *filename); gchar* ags_recall_get_effect(AgsRecall *recall); void ags_recall_set_effect(AgsRecall *recall, gchar *effect); guint ags_recall_get_effect_index(AgsRecall *recall); void ags_recall_set_effect_index(AgsRecall *recall, guint effect_index); GObject* ags_recall_get_recall_container(AgsRecall *recall); void ags_recall_set_recall_container(AgsRecall *recall, GObject *recall_container); /* children */ AgsRecallID* ags_recall_get_recall_id(AgsRecall *recall); void ags_recall_set_recall_id(AgsRecall *recall, AgsRecallID *recall_id); GList* ags_recall_get_recall_dependency(AgsRecall *recall); void ags_recall_set_recall_dependency(AgsRecall *recall, GList *recall_dependency); void ags_recall_add_recall_dependency(AgsRecall *recall, AgsRecallDependency *recall_dependency); void ags_recall_remove_recall_dependency(AgsRecall *recall, AgsRecallDependency *recall_dependency); GList* ags_recall_get_children(AgsRecall *recall); void ags_recall_set_children(AgsRecall *recall, GList *children); void ags_recall_add_child(AgsRecall *recall, AgsRecall *child); void ags_recall_remove_child(AgsRecall *recall, AgsRecall *child); void ags_recall_handler_free(AgsRecallHandler *recall_handler); AgsRecallHandler* ags_recall_handler_alloc(const gchar *signal_name, GCallback callback, GObject *data); void ags_recall_add_recall_handler(AgsRecall *recall, AgsRecallHandler *recall_handler); void ags_recall_remove_recall_handler(AgsRecall *recall, AgsRecallHandler *recall_handler); /* soundcard */ GObject* ags_recall_get_output_soundcard(AgsRecall *recall); void ags_recall_set_output_soundcard(AgsRecall *recall, GObject *output_soundcard); GObject* ags_recall_get_input_soundcard(AgsRecall *recall); void ags_recall_set_input_soundcard(AgsRecall *recall, GObject *input_soundcard); /* presets */ guint ags_recall_get_samplerate(AgsRecall *recall); void ags_recall_set_samplerate(AgsRecall *recall, guint samplerate); guint ags_recall_get_buffer_size(AgsRecall *recall); void ags_recall_set_buffer_size(AgsRecall *recall, guint buffer_size); guint ags_recall_get_format(AgsRecall *recall); void ags_recall_set_format(AgsRecall *recall, guint format); /* events */ void ags_recall_resolve_dependency(AgsRecall *recall); void ags_recall_check_rt_data(AgsRecall *recall); void ags_recall_run_init_pre(AgsRecall *recall); void ags_recall_run_init_inter(AgsRecall *recall); void ags_recall_run_init_post(AgsRecall *recall); void ags_recall_feed_input_queue(AgsRecall *recall); void ags_recall_automate(AgsRecall *recall); void ags_recall_run_pre(AgsRecall *recall); void ags_recall_run_inter(AgsRecall *recall); void ags_recall_run_post(AgsRecall *recall); void ags_recall_do_feedback(AgsRecall *recall); void ags_recall_feed_output_queue(AgsRecall *recall); void ags_recall_stop_persistent(AgsRecall *recall); void ags_recall_cancel(AgsRecall *recall); void ags_recall_done(AgsRecall *recall); AgsRecall* ags_recall_duplicate(AgsRecall *recall, AgsRecallID *recall_id, guint *n_params, gchar **parameter_name, GValue *value); void ags_recall_notify_dependency(AgsRecall *recall, guint dependency, gboolean increase); void ags_recall_child_added(AgsRecall *recall, AgsRecall *child); /* query */ gboolean ags_recall_is_done(GList *recall, GObject *recycling_context); GList* ags_recall_get_by_effect(GList *recall, gchar *filename, gchar *effect); GList* ags_recall_find_recall_id_with_effect(GList *recall, AgsRecallID *recall_id, gchar *filename, gchar *effect); GList* ags_recall_find_type(GList *recall, GType type); GList* ags_recall_find_template(GList *recall); GList* ags_recall_template_find_type(GList *recall, GType type); GList* ags_recall_template_find_all_type(GList *recall, ...); GList* ags_recall_find_type_with_recycling_context(GList *recall, GType type, GObject *recycling_context); GList* ags_recall_find_recycling_context(GList *recall, GObject *recycling_context); GList* ags_recall_find_provider(GList *recall, GObject *provider); GList* ags_recall_template_find_provider(GList *recall, GObject *provider); GList* ags_recall_find_provider_with_recycling_context(GList *recall, GObject *provider, GObject *recycling_context); /* control */ void ags_recall_lock_port(AgsRecall *recall); void ags_recall_unlock_port(AgsRecall *recall); /* instantiate */ AgsRecall* ags_recall_new(); G_END_DECLS #endif /*__AGS_RECALL_H__*/ gsequencer-3.1.3/ags/audio/ags_buffer.c0000644000175000017500000004641013616617253014741 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_buffer_class_init(AgsBufferClass *buffer); void ags_buffer_init(AgsBuffer *buffer); void ags_buffer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_buffer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_buffer_finalize(GObject *gobject); /** * SECTION:ags_buffer * @short_description: Buffer class. * @title: AgsBuffer * @section_id: * @include: ags/audio/ags_buffer.h * * #AgsBuffer represents a tone. */ enum{ PROP_0, PROP_X, PROP_SELECTION_X0, PROP_SELECTION_X1, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_DATA, }; static gpointer ags_buffer_parent_class = NULL; GType ags_buffer_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_buffer = 0; static const GTypeInfo ags_buffer_info = { sizeof(AgsBufferClass), NULL, NULL, (GClassInitFunc) ags_buffer_class_init, NULL, NULL, sizeof(AgsBuffer), 0, (GInstanceInitFunc) ags_buffer_init, }; ags_type_buffer = g_type_register_static(G_TYPE_OBJECT, "AgsBuffer", &ags_buffer_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_buffer); } return g_define_type_id__volatile; } void ags_buffer_class_init(AgsBufferClass *buffer) { GObjectClass *gobject; GParamSpec *param_spec; ags_buffer_parent_class = g_type_class_peek_parent(buffer); gobject = (GObjectClass *) buffer; gobject->set_property = ags_buffer_set_property; gobject->get_property = ags_buffer_get_property; gobject->finalize = ags_buffer_finalize; /* properties */ /** * AgsBuffer:x: * * Buffer's x offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("x", i18n_pspec("offset x"), i18n_pspec("The x offset"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X, param_spec); /** * AgsBuffer:selection-x0: * * Buffer's selection x0 offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("selection-x0", i18n_pspec("selection offset x0"), i18n_pspec("The selection's x0 offset"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SELECTION_X0, param_spec); /** * AgsBuffer:selection-x1: * * Buffer's selection x1 offset. * * Since: 3.0.0 */ param_spec = g_param_spec_uint64("selection-x1", i18n_pspec("selection offset x1"), i18n_pspec("The selection's x1 offset"), 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SELECTION_X1, param_spec); /** * AgsBuffer:samplerate: * * Buffer's audio data samplerate. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("audio data samplerate"), i18n_pspec("The samplerate of audio data"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_SAMPLERATE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsBuffer:buffer-size: * * Buffer's audio data buffer size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("audio data's buffer size"), i18n_pspec("The buffer size of audio data"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsBuffer:format: * * Buffer's audio data format. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("audio data format"), i18n_pspec("The format of audio data"), 0, G_MAXUINT32, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsBuffer:data: * * Buffer's audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("data", i18n_pspec("audio data"), i18n_pspec("The audio data"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DATA, param_spec); } void ags_buffer_init(AgsBuffer *buffer) { AgsConfig *config; buffer->flags = 0; /* add buffer mutex */ g_rec_mutex_init(&(buffer->obj_mutex)); /* config */ config = ags_config_get_instance(); /* fields */ buffer->x = 0; buffer->selection_x0 = 0; buffer->selection_x1 = 0; buffer->samplerate = (guint) ags_soundcard_helper_config_get_samplerate(config); buffer->buffer_size = (guint) ags_soundcard_helper_config_get_buffer_size(config); buffer->format = (guint) ags_soundcard_helper_config_get_format(config); buffer->data = ags_stream_alloc(buffer->buffer_size, buffer->format); } void ags_buffer_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsBuffer *buffer; GRecMutex *buffer_mutex; buffer = AGS_BUFFER(gobject); /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); switch(prop_id){ case PROP_X: { g_rec_mutex_lock(buffer_mutex); buffer->x = g_value_get_uint64(value); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_SELECTION_X0: { g_rec_mutex_lock(buffer_mutex); buffer->selection_x0 = g_value_get_uint64(value); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_SELECTION_X1: { g_rec_mutex_lock(buffer_mutex); buffer->selection_x1 = g_value_get_uint64(value); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); ags_buffer_set_samplerate(buffer, samplerate); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); ags_buffer_set_buffer_size(buffer, buffer_size); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); ags_buffer_set_format(buffer, format); } break; case PROP_DATA: { g_rec_mutex_lock(buffer_mutex); buffer->data = g_value_get_pointer(value); g_rec_mutex_unlock(buffer_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_buffer_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsBuffer *buffer; GRecMutex *buffer_mutex; buffer = AGS_BUFFER(gobject); /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); switch(prop_id){ case PROP_X: { g_rec_mutex_lock(buffer_mutex); g_value_set_uint64(value, buffer->x); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_SELECTION_X0: { g_rec_mutex_lock(buffer_mutex); g_value_set_uint64(value, buffer->selection_x0); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_SELECTION_X1: { g_rec_mutex_lock(buffer_mutex); g_value_set_uint64(value, buffer->selection_x1); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(buffer_mutex); g_value_set_uint(value, buffer->samplerate); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(buffer_mutex); g_value_set_uint(value, buffer->buffer_size); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(buffer_mutex); g_value_set_uint(value, buffer->format); g_rec_mutex_unlock(buffer_mutex); } break; case PROP_DATA: { g_rec_mutex_lock(buffer_mutex); g_value_set_pointer(value, buffer->data); g_rec_mutex_unlock(buffer_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_buffer_finalize(GObject *gobject) { AgsBuffer *buffer; buffer = AGS_BUFFER(gobject); if(buffer->data != NULL){ free(buffer->data); } /* call parent */ G_OBJECT_CLASS(ags_buffer_parent_class)->finalize(gobject); } /** * ags_buffer_get_obj_mutex: * @buffer: the #AgsBuffer * * Get object mutex. * * Returns: the #GRecMutex to lock @buffer * * Since: 3.1.0 */ GRecMutex* ags_buffer_get_obj_mutex(AgsBuffer *buffer) { if(!AGS_IS_BUFFER(buffer)){ return(NULL); } return(AGS_BUFFER_GET_OBJ_MUTEX(buffer)); } /** * ags_buffer_lock: * @buffer: the #AgsBuffer * * Lock object mutex. * * Since: 3.1.0 */ void ags_buffer_lock(AgsBuffer *buffer) { if(!AGS_IS_BUFFER(buffer)){ return; } g_rec_mutex_lock(AGS_BUFFER_GET_OBJ_MUTEX(buffer)); } /** * ags_buffer_unlock: * @buffer: the #AgsBuffer * * Unlock object mutex. * * Since: 3.1.0 */ void ags_buffer_unlock(AgsBuffer *buffer) { if(!AGS_IS_BUFFER(buffer)){ return; } g_rec_mutex_unlock(AGS_BUFFER_GET_OBJ_MUTEX(buffer)); } /** * ags_buffer_test_flags: * @buffer: the #AgsBuffer * @flags: the flags * * Test @flags to be set on @buffer. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_buffer_test_flags(AgsBuffer *buffer, guint flags) { gboolean retval; GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return(FALSE); } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* test */ g_rec_mutex_lock(buffer_mutex); retval = (flags & (buffer->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(buffer_mutex); return(retval); } /** * ags_buffer_set_flags: * @buffer: the #AgsBuffer * @flags: the flags * * Set @flags on @buffer. * * Since: 3.0.0 */ void ags_buffer_set_flags(AgsBuffer *buffer, guint flags) { GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* set */ g_rec_mutex_lock(buffer_mutex); buffer->flags |= flags; g_rec_mutex_unlock(buffer_mutex); } /** * ags_buffer_unset_flags: * @buffer: the #AgsBuffer * @flags: the flags * * Unset @flags on @buffer. * * Since: 3.0.0 */ void ags_buffer_unset_flags(AgsBuffer *buffer, guint flags) { GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* unset */ g_rec_mutex_lock(buffer_mutex); buffer->flags &= (~flags); g_rec_mutex_unlock(buffer_mutex); } /** * ags_buffer_sort_func: * @a: an #AgsBuffer * @b: an other #AgsBuffer * * Sort buffers. * * Returns: 0 if equal, -1 if smaller and 1 if bigger offset * * Since: 3.0.0 */ gint ags_buffer_sort_func(gconstpointer a, gconstpointer b) { guint64 a_x, b_x ; if(a == NULL || b == NULL){ return(0); } g_object_get(a, "x", &a_x, NULL); g_object_get(b, "x", &b_x, NULL); if(a_x == b_x){ return(0); } if(a_x < b_x){ return(-1); }else{ return(1); } } /** * ags_buffer_get_x: * @buffer: the #AgsBuffer * * Gets x. * * Returns: the x * * Since: 3.1.0 */ guint64 ags_buffer_get_x(AgsBuffer *buffer) { guint64 x; if(!AGS_IS_BUFFER(buffer)){ return(0); } g_object_get(buffer, "x", &x, NULL); return(x); } /** * ags_buffer_set_x: * @buffer: the #AgsBuffer * @x: the x * * Sets x. * * Since: 3.1.0 */ void ags_buffer_set_x(AgsBuffer *buffer, guint64 x) { if(!AGS_IS_BUFFER(buffer)){ return; } g_object_set(buffer, "x", x, NULL); } /** * ags_buffer_get_samplerate: * @buffer: the #AgsBuffer * * Gets samplerate. * * Returns: the samplerate * * Since: 3.1.0 */ guint ags_buffer_get_samplerate(AgsBuffer *buffer) { guint samplerate; if(!AGS_IS_BUFFER(buffer)){ return(0); } g_object_get(buffer, "samplerate", &samplerate, NULL); return(samplerate); } /** * ags_buffer_set_samplerate: * @buffer: the #AgsBuffer * @samplerate: the samplerate * * Set samplerate. * * Since: 3.0.0 */ void ags_buffer_set_samplerate(AgsBuffer *buffer, guint samplerate) { GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* set samplerate */ g_rec_mutex_lock(buffer_mutex); //TODO:JK: resample data? buffer->samplerate = samplerate; g_rec_mutex_unlock(buffer_mutex); } /** * ags_buffer_get_buffer_size: * @buffer: the #AgsBuffer * * Gets buffer size. * * Returns: the buffer size * * Since: 3.1.0 */ guint ags_buffer_get_buffer_size(AgsBuffer *buffer) { guint buffer_size; if(!AGS_IS_BUFFER(buffer)){ return(0); } g_object_get(buffer, "buffer-size", &buffer_size, NULL); return(buffer_size); } /** * ags_buffer_set_buffer_size: * @buffer: the #AgsBuffer * @buffer_size: the buffer size * * Set buffer size. * * Since: 3.0.0 */ void ags_buffer_set_buffer_size(AgsBuffer *buffer, guint buffer_size) { guint old_buffer_size; guint word_size; GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* set buffer size */ g_rec_mutex_lock(buffer_mutex); old_buffer_size = buffer->buffer_size; buffer->buffer_size = buffer_size; if(old_buffer_size == buffer->buffer_size){ g_rec_mutex_unlock(buffer_mutex); return; } switch(buffer->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { buffer->data = (gint8 *) realloc(buffer->data, buffer_size * sizeof(gint8)); word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { buffer->data = (gint16 *) realloc(buffer->data, buffer_size * sizeof(gint16)); word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { buffer->data = (gint32 *) realloc(buffer->data, buffer_size * sizeof(gint32)); //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { buffer->data = (gint32 *) realloc(buffer->data, buffer_size * sizeof(gint32)); word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { buffer->data = (gint64 *) realloc(buffer->data, buffer_size * sizeof(gint64)); word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(buffer_mutex); g_warning("ags_buffer_set_buffer_size(): unsupported word size"); return; } if(old_buffer_size < buffer_size){ memset(buffer->data + old_buffer_size, 0, (buffer_size - old_buffer_size) * word_size); } g_rec_mutex_unlock(buffer_mutex); } /** * ags_buffer_get_format: * @buffer: the #AgsBuffer * * Gets format. * * Returns: the format * * Since: 3.1.0 */ guint ags_buffer_get_format(AgsBuffer *buffer) { guint format; if(!AGS_IS_BUFFER(buffer)){ return(0); } g_object_get(buffer, "format", &format, NULL); return(format); } /** * ags_buffer_set_format: * @buffer: the #AgsBuffer * @format: the format * * Set format. * * Since: 3.0.0 */ void ags_buffer_set_format(AgsBuffer *buffer, guint format) { void *data; guint copy_mode; GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return; } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* set format */ g_rec_mutex_lock(buffer_mutex); if(buffer->format == format){ g_rec_mutex_unlock(buffer_mutex); return; } data = ags_stream_alloc(buffer->buffer_size, format); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(buffer->format)); ags_audio_buffer_util_copy_buffer_to_buffer(data, 1, 0, buffer->data, 1, 0, buffer->buffer_size, copy_mode); free(buffer->data); buffer->data = data; buffer->format = format; g_rec_mutex_unlock(buffer_mutex); } /** * ags_buffer_get_data: * @buffer: the #AgsBuffer * * Gets data. * * Returns: the data * * Since: 3.1.0 */ gpointer ags_buffer_get_data(AgsBuffer *buffer) { gpointer data; GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return(NULL); } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* set format */ g_rec_mutex_lock(buffer_mutex); data = buffer->data; g_rec_mutex_unlock(buffer_mutex); return(data); } /** * ags_buffer_duplicate: * @buffer: an #AgsBuffer * * Duplicate a buffer. * * Returns: (transfer full): the duplicated #AgsBuffer. * * Since: 3.0.0 */ AgsBuffer* ags_buffer_duplicate(AgsBuffer *buffer) { AgsBuffer *buffer_copy; guint copy_mode; GRecMutex *buffer_mutex; if(!AGS_IS_BUFFER(buffer)){ return(NULL); } /* get buffer mutex */ buffer_mutex = AGS_BUFFER_GET_OBJ_MUTEX(buffer); /* instantiate buffer */ buffer_copy = ags_buffer_new(); buffer_copy->flags = 0; g_rec_mutex_lock(buffer_mutex); buffer_copy->x = buffer->x; g_object_set(buffer_copy, "samplerate", buffer->samplerate, "buffer-size", buffer->buffer_size, "format", buffer->format, NULL); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(buffer_copy->format), ags_audio_buffer_util_format_from_soundcard(buffer->format)); ags_audio_buffer_util_copy_buffer_to_buffer(buffer_copy->data, 1, 0, buffer->data, 1, 0, buffer_copy->buffer_size, copy_mode); g_rec_mutex_unlock(buffer_mutex); return(buffer_copy); } /** * ags_buffer_new: * * Creates a new instance of #AgsBuffer * * Returns: the new #AgsBuffer * * Since: 3.0.0 */ AgsBuffer* ags_buffer_new() { AgsBuffer *buffer; buffer = (AgsBuffer *) g_object_new(AGS_TYPE_BUFFER, NULL); return(buffer); } gsequencer-3.1.3/ags/audio/ags_diatonic_scale.c0000644000175000017500000001072513607210263016417 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include /** * SECTION:ags_diatonic_scale * @short_description: diatonic scale util * @title: AgsDiatonicScale * @section_id: * @include: ags/audio/ags_diatonic_scale.h * * Utility functions to handle diatonic scale. */ /** * ags_diatonic_scale_note_to_midi_key: * @note: the note name * @key: return location of MIDI key * * Convert @note to MIDI key and store in @key. * * Returns: the number of chars read * * Since: 3.0.0 */ guint ags_diatonic_scale_note_to_midi_key(gchar *note, glong *key) { guint char_count; gint position; glong x_key; int retval; gboolean success; if(note == NULL || note[0] == '\0' || key == NULL){ return(0); } x_key = 49; char_count = 0; success = FALSE; switch(note[0]){ case 'a': { success = TRUE; x_key = 49; } break; case 'h': case 'b': { success = TRUE; x_key = 51; } break; case 'c': { success = TRUE; x_key = 52; } break; case 'd': { success = TRUE; x_key = 54; } break; case 'e': { success = TRUE; x_key = 56; } break; case 'f': { success = TRUE; x_key = 57; } break; case 'g': { success = TRUE; x_key = 59; } break; } if(success){ char_count = 1; } if(!success || note[1] == '\0'){ goto ags_diatonic_scale_note_to_midi_key_COMPLETED; } success = FALSE; switch(note[1]){ case '#': { success = TRUE; x_key += 1; } break; case 'b': { success = TRUE; x_key -= 1; } break; } if(success){ char_count = 2; } if(!success || note[2] == '\0'){ goto ags_diatonic_scale_note_to_midi_key_COMPLETED; } success = FALSE; position = -1; retval = sscanf(note + 2, "%d", &position); if(retval > 0){ if(position > 49){ x_key += ((position - 1) * 12) - 48; }else if(position < 49){ x_key += ((position - 1) * 12) - 48; } char_count += retval; } ags_diatonic_scale_note_to_midi_key_COMPLETED: key[0] = x_key; return(char_count); } /** * ags_diatonic_scale_midi_key_to_note: * @key: MIDI key * @note: return location of note name * * Convert MIDI @key to note name and store in @note. * * Returns: the number of chars written * * Since: 3.0.0 */ guint ags_diatonic_scale_midi_key_to_note(glong key, gchar **note) { gchar *x_note; gchar *str; guint char_count; gint sharp_flats; gint position; static const gchar *sharp = "#"; if(key > 128 || note == NULL){ return(0); } x_note = NULL; sharp_flats = -1; position = -1; switch(key % 12){ case 0: { x_note = "a"; } break; case 1: { x_note = "a"; sharp_flats = 1; } break; case 2: { x_note = "h"; } break; case 3: { x_note = "c"; } break; case 4: { x_note = "c"; sharp_flats = 1; } break; case 5: { x_note = "d"; } break; case 6: { x_note = "d"; sharp_flats = 1; } break; case 7: { x_note = "e"; } break; case 8: { x_note = "f"; } break; case 9: { x_note = "f"; sharp_flats = 1; } break; case 10: { x_note = "g"; } case 11: { x_note = "g"; sharp_flats = 1; } break; break; } position = floor((gdouble) key / 12.0) + 1; if(sharp_flats != -1 && position != -1){ str = g_strdup_printf("%s%s%d", x_note, sharp, position); }else if(position != -1){ str = g_strdup_printf("%s%d", x_note, position); }else{ str = g_strdup_printf("%s", x_note); } char_count = strlen(str); note[0] = str; return(char_count); } gsequencer-3.1.3/ags/audio/ags_output.c0000644000175000017500000001376213607210263015022 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_output_class_init(AgsOutputClass *output_class); void ags_output_connectable_interface_init(AgsConnectableInterface *connectable); void ags_output_init(AgsOutput *output); /** * SECTION:ags_output * @short_description: Output of #AgsAudio * @title: AgsOutput * @section_id: * @include: ags/audio/ags_output.h * * #AgsOutput represents an output channel of #AgsAudio. */ static gpointer ags_output_parent_class = NULL; static AgsConnectableInterface *ags_output_parent_connectable_interface; GType ags_output_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_output = 0; static const GTypeInfo ags_output_info = { sizeof (AgsOutputClass), (GBaseInitFunc) NULL, /* base_init */ (GBaseFinalizeFunc) NULL, /* base_finalize */ (GClassInitFunc) ags_output_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOutput), 0, /* n_preallocs */ (GInstanceInitFunc) ags_output_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_output_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_output = g_type_register_static(AGS_TYPE_CHANNEL, "AgsOutput", &ags_output_info, 0); g_type_add_interface_static(ags_type_output, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_output); } return g_define_type_id__volatile; } void ags_output_class_init(AgsOutputClass *output) { ags_output_parent_class = g_type_class_peek_parent(output); } void ags_output_connectable_interface_init(AgsConnectableInterface *connectable) { AgsConnectableInterface *ags_output_connectable_parent_interface; ags_output_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_output_init(AgsOutput *output) { /* empty */ } /** * ags_output_find_first_input_recycling: * @output: an #AgsOutput * * Retrieve first input recycling. * * Returns: (transfer full): the first #AgsRecycling of #AgsAudio * * Since: 3.0.0 */ AgsRecycling* ags_output_find_first_input_recycling(AgsOutput *output) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *input, *first_with_recycling, *nth_input; AgsRecycling *recycling; guint audio_channel, line; if(!AGS_IS_OUTPUT(output)){ return(NULL); } /* get some fields */ g_object_get(output, "audio", &audio, "audio-channel", &audio_channel, "line", &line, NULL); /* get some fields */ g_object_get(audio, "input", &start_input, NULL); /* find first input recycling */ input = NULL; if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); if(nth_input != NULL){ first_with_recycling = ags_channel_first_with_recycling(nth_input); g_object_unref(nth_input); input = first_with_recycling; } }else{ nth_input = ags_channel_nth(start_input, line); input = nth_input; } /* recycling */ recycling = NULL; if(input != NULL){ g_object_get(input, "first-recycling", &recycling, NULL); g_object_unref(input); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } g_object_unref(audio); return(recycling); } /** * ags_output_find_last_input_recycling: * @output: an #AgsOutput * * Retrieve last input recycling. * * Returns: (transfer full): the last #AgsRecycling of #AgsAudio * * Since: 3.0.0 */ AgsRecycling* ags_output_find_last_input_recycling(AgsOutput *output) { AgsAudio *audio; AgsChannel *start_input; AgsChannel *input, *last_with_recycling, *nth_input; AgsRecycling *recycling; guint audio_channel, line; if(!AGS_IS_OUTPUT(output)){ return(NULL); } /* get some fields */ g_object_get(output, "audio", &audio, "audio-channel", &audio_channel, "line", &line, NULL); /* get some fields */ g_object_get(audio, "input", &start_input, NULL); input = NULL; if(ags_audio_test_flags(audio, AGS_AUDIO_ASYNC)){ nth_input = ags_channel_nth(start_input, audio_channel); if(nth_input != NULL){ last_with_recycling = ags_channel_last_with_recycling(nth_input); g_object_unref(nth_input); input = last_with_recycling; } }else{ nth_input = ags_channel_nth(start_input, line); input = nth_input; } /* recycling */ recycling = NULL; if(input != NULL){ g_object_get(input, "last-recycling", &recycling, NULL); g_object_unref(input); } /* unref */ if(start_input != NULL){ g_object_unref(start_input); } return(recycling); } /** * ags_output_new: * @audio: the #AgsAudio * * Creates an #AgsOutput, assigned to @audio. * * Returns: a new #AgsOutput * * Since: 3.0.0 */ AgsOutput* ags_output_new(GObject *audio) { AgsOutput *output; output = (AgsOutput *) g_object_new(AGS_TYPE_OUTPUT, "audio", audio, NULL); return(output); } gsequencer-3.1.3/ags/audio/ags_automation.c0000644000175000017500000025003113616617253015644 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_automation_class_init(AgsAutomationClass *automation); void ags_automation_init(AgsAutomation *automation); void ags_automation_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_automation_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_automation_dispose(GObject *gobject); void ags_automation_finalize(GObject *gobject); void ags_automation_insert_from_clipboard_version_0_4_3(AgsAutomation *automation, xmlNode *root_node, char *version, char *x_boundary, char *y_boundary, gboolean from_x_offset, guint x_offset, gboolean from_y_offset, guint y_offset, gboolean match_line, gboolean no_duplicates, guint current_line, gboolean match_timestamp); void ags_automation_insert_native_scale_from_clipboard(AgsAutomation *automation, xmlNode *root_node, char *version, char *x_boundary, char *y_boundary, gboolean from_x_offset, guint x_offset, gboolean from_y_offset, guint y_offset, gboolean match_line, gboolean no_duplicates); /** * SECTION:ags_automation * @short_description: Automation class supporting selection and clipboard. * @title: AgsAutomation * @section_id: * @include: ags/audio/ags_automation.h * * #AgsAutomation acts as a container of #AgsAcceleration. */ enum{ PROP_0, PROP_AUDIO, PROP_CHANNEL_TYPE, PROP_LINE, PROP_TIMESTAMP, PROP_CONTROL_NAME, PROP_STEPS, PROP_UPPER, PROP_LOWER, PROP_DEFAULT_VALUE, PROP_PORT, PROP_ACCELERATION, }; static gpointer ags_automation_parent_class = NULL; GType ags_automation_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_automation = 0; static const GTypeInfo ags_automation_info = { sizeof(AgsAutomationClass), NULL, NULL, (GClassInitFunc) ags_automation_class_init, NULL, NULL, sizeof(AgsAutomation), 0, (GInstanceInitFunc) ags_automation_init, }; ags_type_automation = g_type_register_static(G_TYPE_OBJECT, "AgsAutomation", &ags_automation_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_automation); } return g_define_type_id__volatile; } void ags_automation_class_init(AgsAutomationClass *automation) { GObjectClass *gobject; GParamSpec *param_spec; ags_automation_parent_class = g_type_class_peek_parent(automation); gobject = (GObjectClass *) automation; gobject->set_property = ags_automation_set_property; gobject->get_property = ags_automation_get_property; gobject->dispose = ags_automation_dispose; gobject->finalize = ags_automation_finalize; /* properties */ /** * AgsAutomation:audio: * * The assigned #AgsAudio * * Since: 3.0.0 */ param_spec = g_param_spec_object("audio", i18n_pspec("audio of automation"), i18n_pspec("The audio of automation"), AGS_TYPE_AUDIO, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO, param_spec); /** * AgsAutomation:channel-type: * * The effect's assigned channel type. * * Since: 3.0.0 */ param_spec = g_param_spec_gtype("channel-type", i18n_pspec("channel type to apply"), i18n_pspec("The channel type to apply"), G_TYPE_NONE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHANNEL_TYPE, param_spec); /** * AgsAutomation:line: * * The effect's line. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("line", i18n_pspec("line of effect"), i18n_pspec("The numerical line of effect"), 0, 65535, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINE, param_spec); /** * AgsAutomation:timestamp: * * The automation's timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("timestamp of automation"), i18n_pspec("The timestamp of automation"), AGS_TYPE_TIMESTAMP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); /** * AgsAutomation:control-name: * * The effect's assigned control name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-name", i18n_pspec("control name"), i18n_pspec("The control name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_NAME, param_spec); /** * AgsAutomation:steps: * * The effect's steps. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("steps", i18n_pspec("steps of effect"), i18n_pspec("The steps of effect"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STEPS, param_spec); /** * AgsAutomation:upper: * * The effect's upper. * * Since: 3.0.0 */ param_spec = g_param_spec_double("upper", i18n_pspec("upper of effect"), i18n_pspec("The upper of effect"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER, param_spec); /** * AgsAutomation:lower: * * The effect's lower. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lower", i18n_pspec("lower of effect"), i18n_pspec("The lower of effect"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER, param_spec); /** * AgsAutomation:default-value: * * The effect's default-value. * * Since: 3.0.0 */ param_spec = g_param_spec_double("default-value", i18n_pspec("default value of effect"), i18n_pspec("The default value of effect"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_VALUE, param_spec); /** * AgsAutomation:port: * * The assigned #AgsPort * * Since: 3.0.0 */ param_spec = g_param_spec_object("port", i18n_pspec("port of automation"), i18n_pspec("The port of automation"), AGS_TYPE_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); /** * AgsAutomation:acceleration: (type GList(AgsAcceleration)) (transfer full) * * The acceleration list. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("acceleration", i18n_pspec("acceleration"), i18n_pspec("The acceleration"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ACCELERATION, param_spec); } void ags_automation_init(AgsAutomation *automation) { automation->flags = 0; // AGS_AUTOMATION_BYPASS /* add automation mutex */ g_rec_mutex_init(&(automation->obj_mutex)); /* */ automation->audio = NULL; automation->channel_type = G_TYPE_NONE; automation->line = 0; automation->timestamp = ags_timestamp_new(); automation->timestamp->flags &= (~AGS_TIMESTAMP_UNIX); automation->timestamp->flags |= AGS_TIMESTAMP_OFFSET; automation->timestamp->timer.ags_offset.offset = 0; g_object_ref(automation->timestamp); automation->control_name = NULL; automation->steps = 8; automation->upper = 1.0; automation->lower = 0.0; automation->default_value = 0.0; automation->source_function = NULL; automation->port = NULL; automation->acceleration = NULL; automation->selection = NULL; } void ags_automation_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAutomation *automation; GRecMutex *automation_mutex; automation = AGS_AUTOMATION(gobject); /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); switch(prop_id){ case PROP_AUDIO: { AgsAudio *audio; audio = (AgsAudio *) g_value_get_object(value); g_rec_mutex_lock(automation_mutex); if(automation->audio == (GObject *) audio){ g_rec_mutex_unlock(automation_mutex); return; } if(automation->audio != NULL){ g_object_unref(automation->audio); } if(audio != NULL){ g_object_ref(audio); } automation->audio = (GObject *) audio; g_rec_mutex_unlock(automation_mutex); } break; case PROP_LINE: { guint line; line = g_value_get_uint(value); g_rec_mutex_lock(automation_mutex); automation->line = line; g_rec_mutex_unlock(automation_mutex); } break; case PROP_CHANNEL_TYPE: { GType channel_type; channel_type = (GType) g_value_get_gtype(value); g_rec_mutex_lock(automation_mutex); automation->channel_type = channel_type; g_rec_mutex_unlock(automation_mutex); } break; case PROP_CONTROL_NAME: { gchar *control_name; control_name = g_value_get_string(value); g_rec_mutex_lock(automation_mutex); if(automation->control_name != NULL){ g_free(automation->control_name); } automation->control_name = g_strdup(control_name); g_rec_mutex_unlock(automation_mutex); } break; case PROP_PORT: { AgsPort *port; AgsPluginPort *plugin_port; port = g_value_get_object(value); g_rec_mutex_lock(automation_mutex); if(automation->port == (GObject *) port){ g_rec_mutex_unlock(automation_mutex); return; } if(automation->port != NULL){ g_object_unref(automation->port); } plugin_port = NULL; if(port != NULL){ g_object_ref(port); g_object_get(port, "plugin-port", &plugin_port, NULL); if((AGS_PORT_INFINITE_RANGE & (port->flags)) != 0){ automation->steps = AGS_AUTOMATION_MAXIMUM_STEPS; } } automation->port = (GObject *) port; g_rec_mutex_unlock(automation_mutex); if(plugin_port != NULL){ gfloat upper, lower; guint steps; guint plugin_port_flags; GRecMutex *plugin_port_mutex; /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); /* get some fields */ g_rec_mutex_lock(plugin_port_mutex); plugin_port_flags = plugin_port->flags; lower = g_value_get_float(plugin_port->lower_value); upper = g_value_get_float(plugin_port->upper_value); steps = plugin_port->scale_steps; g_rec_mutex_unlock(plugin_port_mutex); g_object_set(automation, "upper", upper, "lower", lower, NULL); if((AGS_PLUGIN_PORT_TOGGLED & (plugin_port_flags)) != 0){ automation->lower = 0.0; automation->upper = 1.0; automation->steps = 1; }else if((AGS_PLUGIN_PORT_INTEGER & (plugin_port_flags)) != 0){ automation->steps = steps; }else{ automation->steps = AGS_AUTOMATION_DEFAULT_PRECISION; } g_object_unref(plugin_port); } } break; case PROP_TIMESTAMP: { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_value_get_object(value); g_rec_mutex_lock(automation_mutex); if(automation->timestamp == timestamp){ g_rec_mutex_unlock(automation_mutex); return; } if(automation->timestamp != NULL){ g_object_unref(G_OBJECT(automation->timestamp)); } if(timestamp != NULL){ g_object_ref(G_OBJECT(timestamp)); } automation->timestamp = timestamp; g_rec_mutex_unlock(automation_mutex); } break; case PROP_STEPS: { guint steps; steps = g_value_get_uint(value); g_rec_mutex_lock(automation_mutex); automation->steps = steps; g_rec_mutex_unlock(automation_mutex); } break; case PROP_UPPER: { gdouble upper; upper = g_value_get_double(value); g_rec_mutex_lock(automation_mutex); automation->upper = upper; g_rec_mutex_unlock(automation_mutex); } break; case PROP_LOWER: { gdouble lower; lower = g_value_get_double(value); g_rec_mutex_lock(automation_mutex); automation->lower = lower; g_rec_mutex_unlock(automation_mutex); } break; case PROP_DEFAULT_VALUE: { gdouble default_value; default_value = g_value_get_double(value); g_rec_mutex_lock(automation_mutex); automation->default_value = default_value; g_rec_mutex_unlock(automation_mutex); } break; case PROP_ACCELERATION: { AgsAcceleration *acceleration; acceleration = (AgsAcceleration *) g_value_get_object(value); g_rec_mutex_lock(automation_mutex); if(!AGS_IS_ACCELERATION(acceleration) || g_list_find(automation->acceleration, acceleration) != NULL){ g_rec_mutex_unlock(automation_mutex); return; } g_rec_mutex_unlock(automation_mutex); ags_automation_add_acceleration(automation, acceleration, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAutomation *automation; GRecMutex *automation_mutex; automation = AGS_AUTOMATION(gobject); /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); switch(prop_id){ case PROP_AUDIO: { g_rec_mutex_lock(automation_mutex); g_value_set_object(value, automation->audio); g_rec_mutex_unlock(automation_mutex); } break; case PROP_LINE: { g_rec_mutex_lock(automation_mutex); g_value_set_uint(value, automation->line); g_rec_mutex_unlock(automation_mutex); } break; case PROP_CHANNEL_TYPE: { g_rec_mutex_lock(automation_mutex); g_value_set_gtype(value, automation->channel_type); g_rec_mutex_unlock(automation_mutex); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(automation_mutex); g_value_set_object(value, automation->timestamp); g_rec_mutex_unlock(automation_mutex); } break; case PROP_CONTROL_NAME: { g_rec_mutex_lock(automation_mutex); g_value_set_string(value, automation->control_name); g_rec_mutex_unlock(automation_mutex); } break; case PROP_STEPS: { g_rec_mutex_lock(automation_mutex); g_value_set_uint(value, automation->steps); g_rec_mutex_unlock(automation_mutex); } break; case PROP_UPPER: { g_rec_mutex_lock(automation_mutex); g_value_set_double(value, automation->upper); g_rec_mutex_unlock(automation_mutex); } break; case PROP_LOWER: { g_rec_mutex_lock(automation_mutex); g_value_set_double(value, automation->lower); g_rec_mutex_unlock(automation_mutex); } break; case PROP_DEFAULT_VALUE: { g_rec_mutex_lock(automation_mutex); g_value_set_double(value, automation->default_value); g_rec_mutex_unlock(automation_mutex); } break; case PROP_PORT: { g_rec_mutex_lock(automation_mutex); g_value_set_object(value, automation->port); g_rec_mutex_unlock(automation_mutex); } break; case PROP_ACCELERATION: { g_rec_mutex_lock(automation_mutex); g_value_set_pointer(value, g_list_copy_deep(automation->acceleration, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(automation_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_automation_dispose(GObject *gobject) { AgsAutomation *automation; GList *list; automation = AGS_AUTOMATION(gobject); /* audio */ if(automation->audio != NULL){ g_object_unref(automation->audio); automation->audio = NULL; } /* timestamp */ if(automation->timestamp != NULL){ g_object_unref(automation->timestamp); automation->timestamp = NULL; } /* source function */ if(automation->source_function != NULL){ g_object_run_dispose((GObject *) automation->source_function); g_object_unref(automation->source_function); automation->source_function = NULL; } /* port */ if(automation->port != NULL){ g_object_unref(automation->port); automation->port = NULL; } /* acceleration */ list = automation->acceleration; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(automation->acceleration, g_object_unref); g_list_free_full(automation->selection, g_object_unref); automation->acceleration = NULL; automation->selection = NULL; /* call parent */ G_OBJECT_CLASS(ags_automation_parent_class)->dispose(gobject); } void ags_automation_finalize(GObject *gobject) { AgsAutomation *automation; automation = AGS_AUTOMATION(gobject); /* audio */ if(automation->audio != NULL){ g_object_unref(automation->audio); } /* timestamp */ if(automation->timestamp != NULL){ g_object_unref(automation->timestamp); } /* control name */ if(automation->control_name != NULL){ free(automation->control_name); } /* source function */ if(automation->source_function != NULL){ g_object_unref(automation->source_function); } /* port */ if(automation->port != NULL){ g_object_unref(automation->port); } /* acceleration */ g_list_free_full(automation->acceleration, g_object_unref); g_list_free_full(automation->selection, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_automation_parent_class)->finalize(gobject); } /** * ags_automation_test_flags: * @automation: the #AgsAutomation * @flags: the flags * * Test @flags to be set on @automation. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_automation_test_flags(AgsAutomation *automation, guint flags) { gboolean retval; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(FALSE); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* test */ g_rec_mutex_lock(automation_mutex); retval = (flags & (automation->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(automation_mutex); return(retval); } /** * ags_automation_set_flags: * @automation: the #AgsAutomation * @flags: the flags * * Set @flags on @automation. * * Since: 3.0.0 */ void ags_automation_set_flags(AgsAutomation *automation, guint flags) { GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* set */ g_rec_mutex_lock(automation_mutex); automation->flags |= flags; g_rec_mutex_unlock(automation_mutex); } /** * ags_automation_unset_flags: * @automation: the #AgsAutomation * @flags: the flags * * Unset @flags on @automation. * * Since: 3.0.0 */ void ags_automation_unset_flags(AgsAutomation *automation, guint flags) { GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* set */ g_rec_mutex_lock(automation_mutex); automation->flags &= (~flags); g_rec_mutex_unlock(automation_mutex); } /** * ags_automation_get_obj_mutex: * @automation: the #AgsAutomation * * Get object mutex. * * Returns: the #GRecMutex to lock @automation * * Since: 3.1.0 */ GRecMutex* ags_automation_get_obj_mutex(AgsAutomation *automation) { if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } return(AGS_AUTOMATION_GET_OBJ_MUTEX(automation)); } /** * ags_automation_find_port: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @port: the #AgsPort to match * * Find automation by port. * * Returns: (element-type AgsAudio.Automation) (transfer none): next matching automation as #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_automation_find_port(GList *automation, GObject *port) { if(automation == NULL || !AGS_IS_PORT(port)){ return(NULL); } while(automation != NULL){ GObject *current_port; gboolean success; g_object_get(automation->data, "port", ¤t_port, NULL); success = (current_port == port) ? TRUE: FALSE; g_object_unref(current_port); if(success){ break; } automation = automation->next; } return(automation); } /** * ags_automation_find_near_timestamp: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @line: the matching audio channel * @timestamp: the matching timestamp * * Retrieve appropriate automation for timestamp. * * Returns: (element-type AgsAudio.Automation) (transfer none): Next matching #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_automation_find_near_timestamp(GList *automation, guint line, AgsTimestamp *timestamp) { AgsTimestamp *current_timestamp; GList *retval; GList *current_start, *current_end, *current; guint current_line; guint64 current_x, x; guint length, position; gboolean use_ags_offset; gboolean success; if(automation == NULL){ return(NULL); } current_start = automation; current_end = g_list_last(automation); length = g_list_length(automation); position = (length - 1) / 2; current = g_list_nth(current_start, position); x = 0; use_ags_offset = FALSE; if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_OFFSET)){ x = ags_timestamp_get_ags_offset(timestamp); use_ags_offset = TRUE; }else if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_UNIX)){ x = ags_timestamp_get_unix_time(timestamp); use_ags_offset = FALSE; } retval = NULL; success = FALSE; while(!success && current != NULL){ current_x = 0; /* check current - start */ g_object_get(current_start->data, "line", ¤t_line, NULL); if(current_line == line){ if(timestamp == NULL){ retval = current_start; break; } g_object_get(current_start->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_OFFSET){ retval = current_start; break; } }else{ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_DURATION){ retval = current_start; break; } } }else{ g_warning("inconsistent data"); } } /* check current - end */ g_object_get(current_end->data, "line", ¤t_line, NULL); if(current_line == line){ if(timestamp == NULL){ retval = current_end; break; } g_object_get(current_end->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_OFFSET){ retval = current_end; break; } }else{ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_DURATION){ retval = current_end; break; } } }else{ g_warning("inconsistent data"); } } /* check current - center */ g_object_get(current->data, "line", ¤t_line, NULL); if(current_line == line){ if(timestamp == NULL){ retval = current; break; } } g_object_get(current->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_OFFSET && current_line == line){ retval = current; break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_DURATION && current_line == line){ retval = current; break; } } }else{ g_warning("inconsistent data"); } if(length <= 3){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } return(retval); } /** * ags_automation_find_near_timestamp_extended: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @line: the matching audio channel * @channel_type: the matching channel type * @control_name: the matching control name * @timestamp: the matching timestamp * * Retrieve appropriate automation for timestamp. * * Returns: (element-type AgsAudio.Automation) (transfer none): Next matching #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_automation_find_near_timestamp_extended(GList *automation, guint line, GType channel_type, gchar *control_name, AgsTimestamp *timestamp) { AgsTimestamp *current_timestamp; GList *retval; GList *current_start, *current_end, *current; GType current_channel_type; gchar *current_control_name; guint current_line; guint64 current_x, x; guint length, position; gboolean use_ags_offset; gboolean success; if(automation == NULL){ return(NULL); } current_start = automation; current_end = g_list_last(automation); length = g_list_length(automation); position = (length - 1) / 2; current = g_list_nth(current_start, position); x = 0; use_ags_offset = FALSE; if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_OFFSET)){ x = ags_timestamp_get_ags_offset(timestamp); use_ags_offset = TRUE; }else if(ags_timestamp_test_flags(timestamp, AGS_TIMESTAMP_UNIX)){ x = ags_timestamp_get_unix_time(timestamp); use_ags_offset = FALSE; } retval = NULL; success = FALSE; while(!success && current != NULL){ current_x = 0; /* check current - start */ g_object_get(current_start->data, "line", ¤t_line, "channel-type", ¤t_channel_type, "control-name", ¤t_control_name, NULL); if(current_line == line && g_type_is_a(current_channel_type, channel_type) && !g_strcmp0(current_control_name, control_name)){ g_free(current_control_name); if(timestamp == NULL){ retval = current_start; break; } g_object_get(current_start->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x > x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_OFFSET){ retval = current_start; break; } }else{ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_DURATION){ retval = current_start; break; } } }else{ g_warning("inconsistent data"); } }else{ g_free(current_control_name); } /* check current - end */ g_object_get(current_end->data, "line", ¤t_line, "channel-type", ¤t_channel_type, "control-name", ¤t_control_name, NULL); if(current_line == line && g_type_is_a(current_channel_type, channel_type) && !g_strcmp0(current_control_name, control_name)){ g_free(current_control_name); if(timestamp == NULL){ retval = current_end; break; } g_object_get(current_end->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x < x){ break; } } if(use_ags_offset){ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_OFFSET){ retval = current_end; break; } }else{ if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_DURATION){ retval = current_end; break; } } }else{ g_warning("inconsistent data"); } }else{ g_free(current_control_name); } /* check current - center */ current_x = 0; g_object_get(current->data, "line", ¤t_line, "channel-type", ¤t_channel_type, "control-name", ¤t_control_name, NULL); if(current_line == line && g_type_is_a(current_channel_type, channel_type) && !g_strcmp0(current_control_name, control_name)){ if(timestamp == NULL){ retval = current; g_free(current_control_name); break; } } g_object_get(current->data, "timestamp", ¤t_timestamp, NULL); if(current_timestamp != NULL){ if(use_ags_offset){ current_x = ags_timestamp_get_ags_offset(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_OFFSET && current_line == line && g_type_is_a(current_channel_type, channel_type) && !g_strcmp0(current_control_name, control_name)){ retval = current; break; } }else{ current_x = ags_timestamp_get_unix_time(current_timestamp); g_object_unref(current_timestamp); if(current_x >= x && current_x < x + AGS_AUTOMATION_DEFAULT_DURATION && current_line == line && g_type_is_a(current_channel_type, channel_type) && !g_strcmp0(current_control_name, control_name)){ retval = current; break; } } }else{ g_warning("inconsistent data"); } g_free(current_control_name); if(position == 0){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } return(retval); } /** * ags_automation_sort_func: * @a: an #AgsAutomation * @b: an other #AgsAutomation * * Compare @a to @b. * * Returns: 0 if equal, -1 if smaller and 1 if bigger offset * * Since: 3.0.0 */ gint ags_automation_sort_func(gconstpointer a, gconstpointer b) { AgsTimestamp *timestamp_a, *timestamp_b; guint64 offset_a, offset_b; g_object_get(a, "timestamp", ×tamp_a, NULL); g_object_get(b, "timestamp", ×tamp_b, NULL); offset_a = ags_timestamp_get_ags_offset(timestamp_a); offset_b = ags_timestamp_get_ags_offset(timestamp_b); g_object_unref(timestamp_a); g_object_unref(timestamp_b); if(offset_a == offset_b){ return(0); }else if(offset_a < offset_b){ return(-1); }else if(offset_a > offset_b){ return(1); } return(0); } /** * ags_automation_add: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @new_automation: the #AgsAutomation to add * * Add @new_automation sorted to @automation * * Returns: (element-type AgsAudio.Automation) (transfer none): the new beginning of @automation * * Since: 3.0.0 */ GList* ags_automation_add(GList *automation, AgsAutomation *new_automation) { if(!AGS_IS_AUTOMATION(new_automation)){ return(automation); } automation = g_list_insert_sorted(automation, new_automation, ags_automation_sort_func); return(automation); } /** * ags_automation_get_audio: * @automation: the #AgsAutomation * * Get audio. * * Returns: (transfer full): the #AgsAudio * * Since: 3.1.0 */ GObject* ags_automation_get_audio(AgsAutomation *automation) { GObject *audio; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } g_object_get(automation, "audio", &audio, NULL); return(audio); } /** * ags_automation_set_audio: * @automation: the #AgsAutomation * @audio: the #AgsAudio * * Set audio. * * Since: 3.1.0 */ void ags_automation_set_audio(AgsAutomation *automation, GObject *audio) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "audio", audio, NULL); } /** * ags_automation_get_channel_type: * @automation: the #AgsAutomation * * Gets channel type. * * Returns: the channel type * * Since: 3.1.0 */ GType ags_automation_get_channel_type(AgsAutomation *automation) { GType channel_type; if(!AGS_IS_AUTOMATION(automation)){ return(0); } g_object_get(automation, "channel_type", &channel_type, NULL); return(channel_type); } /** * ags_automation_set_channel_type: * @automation: the #AgsAutomation * @channel_type: the channel type * * Sets channel type. * * Since: 3.1.0 */ void ags_automation_set_channel_type(AgsAutomation *automation, GType channel_type) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "channel-type", channel_type, NULL); } /** * ags_automation_get_line: * @automation: the #AgsAutomation * * Gets line. * * Returns: the line * * Since: 3.1.0 */ guint ags_automation_get_line(AgsAutomation *automation) { guint line; if(!AGS_IS_AUTOMATION(automation)){ return(0); } g_object_get(automation, "line", &line, NULL); return(line); } /** * ags_automation_set_line: * @automation: the #AgsAutomation * @line: the line * * Sets line. * * Since: 3.1.0 */ void ags_automation_set_line(AgsAutomation *automation, guint line) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "line", line, NULL); } /** * ags_automation_get_timestamp: * @automation: the #AgsAutomation * * Get timestamp. * * Returns: (transfer full): the #AgsTimestamp * * Since: 3.1.0 */ AgsTimestamp* ags_automation_get_timestamp(AgsAutomation *automation) { AgsTimestamp *timestamp; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } g_object_get(automation, "timestamp", ×tamp, NULL); return(timestamp); } /** * ags_automation_set_timestamp: * @automation: the #AgsAutomation * @timestamp: the #AgsTimestamp * * Set timestamp. * * Since: 3.1.0 */ void ags_automation_set_timestamp(AgsAutomation *automation, AgsTimestamp *timestamp) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "timestamp", timestamp, NULL); } /** * ags_automation_get_control_name: * @automation: the #AgsAutomation * * Get control name. * * Returns: (transfer full): the control name * * Since: 3.1.0 */ gchar* ags_automation_get_control_name(AgsAutomation *automation) { gchar *control_name; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } g_object_get(automation, "control-name", &control_name, NULL); return(control_name); } /** * ags_automation_set_control_name: * @automation: the #AgsAutomation * @control_name: the control name * * Set control name. * * Since: 3.1.0 */ void ags_automation_set_control_name(AgsAutomation *automation, gchar *control_name) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "control-name", control_name, NULL); } /** * ags_automation_get_steps: * @automation: the #AgsAutomation * * Gets steps. * * Returns: the steps * * Since: 3.1.0 */ guint ags_automation_get_steps(AgsAutomation *automation) { guint steps; if(!AGS_IS_AUTOMATION(automation)){ return(0); } g_object_get(automation, "steps", &steps, NULL); return(steps); } /** * ags_automation_set_steps: * @automation: the #AgsAutomation * @steps: the steps * * Sets steps. * * Since: 3.1.0 */ void ags_automation_set_steps(AgsAutomation *automation, guint steps) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "steps", steps, NULL); } /** * ags_automation_get_upper: * @automation: the #AgsAutomation * * Gets upper. * * Returns: the upper * * Since: 3.1.0 */ gdouble ags_automation_get_upper(AgsAutomation *automation) { gdouble upper; if(!AGS_IS_AUTOMATION(automation)){ return(0.0); } g_object_get(automation, "upper", &upper, NULL); return(upper); } /** * ags_automation_set_upper: * @automation: the #AgsAutomation * @upper: the upper * * Sets upper. * * Since: 3.1.0 */ void ags_automation_set_upper(AgsAutomation *automation, gdouble upper) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "upper", upper, NULL); } /** * ags_automation_get_lower: * @automation: the #AgsAutomation * * Gets lower. * * Returns: the lower * * Since: 3.1.0 */ gdouble ags_automation_get_lower(AgsAutomation *automation) { gdouble lower; if(!AGS_IS_AUTOMATION(automation)){ return(0.0); } g_object_get(automation, "lower", &lower, NULL); return(lower); } /** * ags_automation_set_lower: * @automation: the #AgsAutomation * @lower: the lower * * Sets lower. * * Since: 3.1.0 */ void ags_automation_set_lower(AgsAutomation *automation, gdouble lower) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "lower", lower, NULL); } /** * ags_automation_get_default_value: * @automation: the #AgsAutomation * * Gets default value. * * Returns: the default value * * Since: 3.1.0 */ gdouble ags_automation_get_default_value(AgsAutomation *automation) { gdouble default_value; if(!AGS_IS_AUTOMATION(automation)){ return(0.0); } g_object_get(automation, "default-value", &default_value, NULL); return(default_value); } /** * ags_automation_set_default_value: * @automation: the #AgsAutomation * @default_value: the default value * * Sets default value. * * Since: 3.1.0 */ void ags_automation_set_default_value(AgsAutomation *automation, gdouble default_value) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "default-value", default_value, NULL); } /** * ags_automation_get_port: * @automation: the #AgsAutomation * * Get port. * * Returns: (transfer full): the #AgsPort * * Since: 3.1.0 */ GObject* ags_automation_get_port(AgsAutomation *automation) { GObject *port; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } g_object_get(automation, "port", &port, NULL); return(port); } /** * ags_automation_set_port: * @automation: the #AgsAutomation * @port: the #AgsPort * * Set port. * * Since: 3.1.0 */ void ags_automation_set_port(AgsAutomation *automation, GObject *port) { if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_set(automation, "port", port, NULL); } /** * ags_automation_get_acceleration: * @automation: the #AgsAutomation * * Get acceleration. * * Returns: (element-type AgsAudio.Acceleration) (transfer full): the #GList-struct containig #AgsAcceleration * * Since: 3.1.0 */ GList* ags_automation_get_acceleration(AgsAutomation *automation) { GList *acceleration; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } g_object_get(automation, "acceleration", &acceleration, NULL); return(acceleration); } /** * ags_automation_set_acceleration: * @automation: the #AgsAutomation * @acceleration: (element-type AgsAudio.Acceleration) (transfer full): the #GList-struct containing #AgsAcceleration * * Set acceleration by replacing existing. * * Since: 3.1.0 */ void ags_automation_set_acceleration(AgsAutomation *automation, GList *acceleration) { GList *start_acceleration; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); g_rec_mutex_lock(automation_mutex); start_acceleration = automation->acceleration; automation->acceleration = acceleration; g_rec_mutex_unlock(automation_mutex); g_list_free_full(start_acceleration, (GDestroyNotify) g_object_unref); } /** * ags_automation_add_acceleration: * @automation: the #AgsAutomation * @acceleration: the #AgsAcceleration to add * @use_selection_list: if %TRUE add to selection, else to default automation * * Adds @acceleration to @automation. * * Since: 3.0.0 */ void ags_automation_add_acceleration(AgsAutomation *automation, AgsAcceleration *acceleration, gboolean use_selection_list) { GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation) || !AGS_IS_ACCELERATION(acceleration)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* insert sorted */ g_object_ref(acceleration); g_rec_mutex_lock(automation_mutex); if(use_selection_list){ automation->selection = g_list_insert_sorted(automation->selection, acceleration, (GCompareFunc) ags_acceleration_sort_func); ags_acceleration_set_flags(acceleration, AGS_ACCELERATION_IS_SELECTED); }else{ automation->acceleration = g_list_insert_sorted(automation->acceleration, acceleration, (GCompareFunc) ags_acceleration_sort_func); } g_rec_mutex_unlock(automation_mutex); } /** * ags_automation_remove_acceleration: * @automation: the #AgsAutomation * @acceleration: the #AgsAcceleration to remove * @use_selection_list: if %TRUE remove from selection, else from default automation * * Removes @acceleration from @automation. * * Since: 3.0.0 */ void ags_automation_remove_acceleration(AgsAutomation *automation, AgsAcceleration *acceleration, gboolean use_selection_list) { GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation) || !AGS_IS_ACCELERATION(acceleration)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* remove if found */ g_rec_mutex_lock(automation_mutex); if(!use_selection_list){ if(g_list_find(automation->acceleration, acceleration) != NULL){ automation->acceleration = g_list_remove(automation->acceleration, acceleration); g_object_unref(acceleration); } }else{ if(g_list_find(automation->selection, acceleration) != NULL){ automation->selection = g_list_remove(automation->selection, acceleration); g_object_unref(acceleration); } } g_rec_mutex_unlock(automation_mutex); } /** * ags_automation_remove_acceleration_at_position: * @automation: the #AgsAutomation * @x: x offset * @y: y value of acceleration * * Removes one #AgsAcceleration of automation. * * Returns: %TRUE if successfully removed acceleration, else %FALSE * * Since: 3.0.0 */ gboolean ags_automation_remove_acceleration_at_position(AgsAutomation *automation, guint x, gdouble y) { AgsAcceleration *acceleration; GList *start_list, *list; gdouble upper, lower; guint current_x; gdouble current_y; gboolean retval; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(FALSE); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* find acceleration */ g_rec_mutex_lock(automation_mutex); upper = automation->upper; lower = automation->lower; list = start_list = g_list_copy_deep(automation->acceleration, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(automation_mutex); acceleration = NULL; retval = FALSE; while(list != NULL){ g_object_get(list->data, "x", ¤t_x, "y", ¤t_y, NULL); if(current_x == x && (current_y - ((upper - lower) / AGS_AUTOMATION_MAXIMUM_STEPS) <= y && current_y + ((upper - lower) / AGS_AUTOMATION_MAXIMUM_STEPS) >= y)){ acceleration = list->data; retval = TRUE; break; } if(current_x > x){ break; } list = list->next; } /* delete link and unref */ if(retval){ g_rec_mutex_lock(automation_mutex); automation->acceleration = g_list_remove(automation->acceleration, acceleration); g_object_unref(acceleration); g_rec_mutex_unlock(automation_mutex); } g_list_free_full(start_list, g_object_unref); return(retval); } /** * ags_automation_get_selection: * @automation: the #AgsAutomation * * Retrieve selection. * * Returns: (element-type AgsAudio.Acceleration) (transfer none): the selection. * * Since: 3.0.0 */ GList* ags_automation_get_selection(AgsAutomation *automation) { GList *selection; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* selection */ g_rec_mutex_lock(automation_mutex); selection = automation->selection; g_rec_mutex_unlock(automation_mutex); return(selection); } /** * ags_automation_is_acceleration_selected: * @automation: the #AgsAutomation * @acceleration: the #AgsAcceleration to check for * * Check selection for acceleration. * * Returns: %TRUE if selected, else %FALSE * * Since: 3.0.0 */ gboolean ags_automation_is_acceleration_selected(AgsAutomation *automation, AgsAcceleration *acceleration) { GList *selection; guint x, current_x; gboolean retval; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation) || !AGS_IS_ACCELERATION(acceleration)){ return(FALSE); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* get x */ g_object_get(acceleration, "x", &x, NULL); /* match acceleration */ g_rec_mutex_lock(automation_mutex); selection = automation->selection; retval = FALSE; while(selection != NULL){ /* get current x */ g_object_get(selection->data, "x", ¤t_x, NULL); if(current_x > x){ break; } if(selection->data == acceleration){ retval = TRUE; break; } selection = selection->next; } g_rec_mutex_unlock(automation_mutex); return(retval); } /** * ags_automation_find_point: * @automation: the #AgsAutomation * @x: x offset * @y: y value acceleration, will be ignored * @use_selection_list: if %TRUE selection is searched * * Find acceleration by offset and acceleration. * * Returns: (transfer none): the matching acceleration. * * Since: 3.0.0 */ AgsAcceleration* ags_automation_find_point(AgsAutomation *automation, guint x, gdouble y, gboolean use_selection_list) { AgsAcceleration *retval; GList *acceleration; guint current_x; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* find acceleration */ g_rec_mutex_lock(automation_mutex); if(use_selection_list){ acceleration = automation->selection; }else{ acceleration = automation->acceleration; } retval = NULL; while(acceleration != NULL){ g_object_get(acceleration->data, "x", ¤t_x, NULL); if(current_x > x){ break; } if(current_x == x){ retval = acceleration->data; break; } acceleration = acceleration->next; } g_rec_mutex_unlock(automation_mutex); return(retval); } /** * ags_automation_find_region: * @automation: the #AgsAutomation * @x0: start offset * @y0: value start * @x1: end offset * @y1: value end * @use_selection_list: if %TRUE selection is searched * * Find acceleration by offset and value region. * * Returns: (element-type AgsAudio.Acceleration) (transfer full): the matching accelerations as #GList-struct * * Since: 3.0.0 */ GList* ags_automation_find_region(AgsAutomation *automation, guint x0, gdouble y0, guint x1, gdouble y1, gboolean use_selection_list) { GList *acceleration; GList *region; guint current_x; gdouble current_y; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); if(x0 > x1){ guint tmp; tmp = x1; x1 = x0; x0 = x1; } if(y0 > y1){ gdouble tmp_y; tmp_y = y0; y0 = y1; y1 = tmp_y; } /* find acceleration */ g_rec_mutex_lock(automation_mutex); if(use_selection_list){ acceleration = automation->selection; }else{ acceleration = automation->acceleration; } while(acceleration != NULL){ g_object_get(acceleration->data, "x", ¤t_x, NULL); if(current_x >= x0){ break; } acceleration = acceleration->next; } region = NULL; while(acceleration != NULL){ g_object_get(acceleration->data, "x", ¤t_x, "y", ¤t_y, NULL); if(current_x > x1){ break; } if(current_y >= y0 && current_y < y1){ region = g_list_prepend(region, acceleration->data); } acceleration = acceleration->next; } g_rec_mutex_unlock(automation_mutex); region = g_list_reverse(region); return(region); } /** * ags_automation_free_selection: * @automation: the #AgsAutomation * * Clear selection. * * Since: 3.0.0 */ void ags_automation_free_selection(AgsAutomation *automation) { AgsAcceleration *acceleration; GList *list_start, *list; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* free selection */ g_rec_mutex_lock(automation_mutex); list = list_start = automation->selection; while(list != NULL){ ags_acceleration_unset_flags(list->data, AGS_ACCELERATION_IS_SELECTED); list = list->next; } automation->selection = NULL; g_rec_mutex_unlock(automation_mutex); g_list_free_full(list_start, g_object_unref); } /** * ags_automation_add_point_to_selection: * @automation: the #AgsAutomation * @x: x offset * @y: y acceleration value * @replace_current_selection: if %TRUE selection is replaced * * Select acceleration at position. * * Since: 3.0.0 */ void ags_automation_add_point_to_selection(AgsAutomation *automation, guint x, gdouble y, gboolean replace_current_selection) { AgsAcceleration *acceleration; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* find acceleration */ acceleration = ags_automation_find_point(automation, x, y, FALSE); if(acceleration == NULL){ /* there is nothing to be selected */ if(replace_current_selection){ ags_automation_free_selection(automation); } }else{ /* add to or replace selection */ ags_acceleration_set_flags(acceleration, AGS_ACCELERATION_IS_SELECTED); if(replace_current_selection){ GList *list; list = g_list_alloc(); list->data = acceleration; g_object_ref(acceleration); ags_automation_free_selection(automation); /* replace */ g_rec_mutex_lock(automation_mutex); automation->selection = list; g_rec_mutex_unlock(automation_mutex); }else{ if(!ags_automation_is_acceleration_selected(automation, acceleration)){ /* add */ ags_automation_add_acceleration(automation, acceleration, TRUE); } } } } /** * ags_automation_remove_point_from_selection: * @automation: the #AgsAutomation * @x: x offset * @y: y acceleration value * * Remove acceleration at position of selection. * * Since: 3.0.0 */ void ags_automation_remove_point_from_selection(AgsAutomation *automation, guint x, gdouble y) { AgsAcceleration *acceleration; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* find point */ acceleration = ags_automation_find_point(automation, x, y, TRUE); if(acceleration != NULL){ ags_acceleration_unset_flags(acceleration, AGS_ACCELERATION_IS_SELECTED); /* remove acceleration from selection */ g_rec_mutex_lock(automation_mutex); automation->selection = g_list_remove(automation->selection, acceleration); g_object_unref(acceleration); g_rec_mutex_unlock(automation_mutex); } } /** * ags_automation_add_region_from_selection: * @automation: the #AgsAutomation * @x0: x start offset * @y0: y start acceleration * @x1: x end offset * @y1: y end acceleration * @replace_current_selection: if %TRUE current selection is replaced, else if %FALSE * it is added to current selection. * * Add acceleration within region of selection. * * Since: 3.0.0 */ void ags_automation_add_region_to_selection(AgsAutomation *automation, guint x0, gdouble y0, guint x1, gdouble y1, gboolean replace_current_selection) { AgsAcceleration *acceleration; GList *region, *list; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* find region */ region = ags_automation_find_region(automation, x0, y0, x1, y1, FALSE); if(replace_current_selection){ ags_automation_free_selection(automation); list = region; while(list != NULL){ ags_acceleration_set_flags(list->data, AGS_ACCELERATION_IS_SELECTED); g_object_ref(list->data); list = list->next; } /* replace */ g_rec_mutex_lock(automation_mutex); automation->selection = region; g_rec_mutex_unlock(automation_mutex); }else{ list = region; while(list != NULL){ if(!ags_automation_is_acceleration_selected(automation, list->data)){ /* add */ ags_automation_add_acceleration(automation, list->data, TRUE); } list = list->next; } g_list_free(region); } } /** * ags_automation_remove_region_from_selection: * @automation: the #AgsAutomation * @x0: x start offset * @y0: y start acceleration * @x1: x end offset * @y1: y end acceleration * * Remove acceleration within region of selection. * * Since: 3.0.0 */ void ags_automation_remove_region_from_selection(AgsAutomation *automation, guint x0, gdouble y0, guint x1, gdouble y1) { AgsAcceleration *acceleration; GList *region; GList *list; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* find region */ region = ags_automation_find_region(automation, x0, y0, x1, y1, TRUE); list = region; while(list != NULL){ ags_acceleration_unset_flags(list->data, AGS_ACCELERATION_IS_SELECTED); /* remove */ g_rec_mutex_lock(automation_mutex); automation->selection = g_list_remove(automation->selection, list->data); g_rec_mutex_unlock(automation_mutex); g_object_unref(list->data); /* iterate */ list = list->next; } g_list_free(region); } /** * ags_automation_add_all_to_selection: * @automation: the #AgsAutomation * * Add all acceleration to selection. * * Since: 3.0.0 */ void ags_automation_add_all_to_selection(AgsAutomation *automation) { GList *list; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return; } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* select all */ g_rec_mutex_lock(automation_mutex); list = automation->acceleration; while(list != NULL){ ags_automation_add_acceleration(automation, list->data, TRUE); list = list->next; } g_rec_mutex_unlock(automation_mutex); } /** * ags_automation_copy_selection: * @automation: the #AgsAutomation * * Copy selection to clipboard. * * Returns: (transfer none): the selection as xmlNode * * Since: 3.0.0 */ xmlNode* ags_automation_copy_selection(AgsAutomation *automation) { AgsTimestamp *timestamp; xmlNode *automation_node, *current_acceleration; xmlNode *timestamp_node; GList *selection; guint current_x; gdouble current_y; guint x_boundary; gdouble y_boundary; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* create root node */ g_rec_mutex_lock(automation_mutex); automation_node = xmlNewNode(NULL, BAD_CAST "automation"); xmlNewProp(automation_node, BAD_CAST "program", BAD_CAST "ags"); xmlNewProp(automation_node, BAD_CAST "type", BAD_CAST AGS_AUTOMATION_CLIPBOARD_TYPE); xmlNewProp(automation_node, BAD_CAST "version", BAD_CAST AGS_AUTOMATION_CLIPBOARD_VERSION); xmlNewProp(automation_node, BAD_CAST "format", BAD_CAST AGS_AUTOMATION_CLIPBOARD_FORMAT); xmlNewProp(automation_node, "control-name", automation->control_name); xmlNewProp(automation_node, "line", g_strdup_printf("%u", automation->line)); /* timestamp */ timestamp = automation->timestamp; if(timestamp != NULL){ timestamp_node = xmlNewNode(NULL, BAD_CAST "timestamp"); xmlAddChild(automation_node, timestamp_node); xmlNewProp(timestamp_node, BAD_CAST "offset", BAD_CAST (g_strdup_printf("%lu", ags_timestamp_get_ags_offset(timestamp)))); } /* selection */ selection = automation->selection; if(selection != NULL){ g_object_get(selection->data, "x", ¤t_x, NULL); x_boundary = current_x; y_boundary = G_MAXDOUBLE; }else{ x_boundary = 0; y_boundary = 0.0; } while(selection != NULL){ g_object_get(selection->data, "x", ¤t_x, "y", ¤t_y, NULL); current_acceleration = xmlNewChild(automation_node, NULL, BAD_CAST "acceleration", NULL); xmlNewProp(current_acceleration, BAD_CAST "x", BAD_CAST g_strdup_printf("%u", current_x)); xmlNewProp(current_acceleration, BAD_CAST "y", BAD_CAST g_strdup_printf("%f", current_y)); if(y_boundary > current_y){ y_boundary = current_y; } selection = selection->next; } g_rec_mutex_unlock(automation_mutex); xmlNewProp(automation_node, BAD_CAST "x-boundary", BAD_CAST g_strdup_printf("%u", x_boundary)); xmlNewProp(automation_node, BAD_CAST "y-boundary", BAD_CAST g_strdup_printf("%f", y_boundary)); return(automation_node); } /** * ags_automation_cut_selection: * @automation: the #AgsAutomation * * Cut selection to clipboard. * * Returns: (transfer none): the selection as xmlNod * * Since: 3.0.0 */ xmlNode* ags_automation_cut_selection(AgsAutomation *automation) { xmlNode *automation_node; GList *selection, *acceleration; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(NULL); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* copy selection */ automation_node = ags_automation_copy_selection(automation); /* cut */ g_rec_mutex_lock(automation_mutex); selection = automation->selection; while(selection != NULL){ automation->acceleration = g_list_remove(automation->acceleration, selection->data); g_object_unref(selection->data); selection = selection->next; } g_rec_mutex_unlock(automation_mutex); /* free selection */ ags_automation_free_selection(automation); return(automation_node); } void ags_automation_insert_from_clipboard_version_0_4_3(AgsAutomation *automation, xmlNode *root_node, char *version, char *x_boundary, char *y_boundary, gboolean from_x_offset, guint x_offset, gboolean from_y_offset, guint y_offset, gboolean match_line, gboolean no_duplicates, guint current_line, gboolean match_timestamp) { AgsAcceleration *acceleration; AgsTimestamp *timestamp; xmlNode *node; char *endptr; char *x, *y; guint64 timestamp_offset; guint x_boundary_val, y_boundary_val; guint x_val; gdouble y_val; guint base_x_difference, base_y_difference; gboolean subtract_x, subtract_y; node = root_node->children; /* retrieve x values for resetting */ base_x_difference = 0; subtract_x = FALSE; if(from_x_offset){ if(x_boundary != NULL){ errno = 0; x_boundary_val = strtoul(x_boundary, &endptr, 10); if(errno == ERANGE){ goto dont_reset_x_offset; } if(x_boundary == endptr){ goto dont_reset_x_offset; } if(x_boundary_val < x_offset){ base_x_difference = x_offset - x_boundary_val; subtract_x = FALSE; }else{ base_x_difference = x_boundary_val - x_offset; subtract_x = TRUE; } }else{ dont_reset_x_offset: from_x_offset = FALSE; } } /* retrieve y values for resetting */ base_y_difference = 0; subtract_y = FALSE; if(from_y_offset){ if(y_boundary != NULL){ errno = 0; y_boundary_val = strtoul(y_boundary, &endptr, 10); if(errno == ERANGE){ goto dont_reset_y_offset; } if(y_boundary == endptr){ goto dont_reset_y_offset; } if(y_boundary_val < y_offset){ base_y_difference = y_offset - y_boundary_val; subtract_y = FALSE; }else{ base_y_difference = y_boundary_val - y_offset; subtract_y = TRUE; } }else{ dont_reset_y_offset: from_y_offset = FALSE; } } for(; node != NULL; node = node->next){ if(node->type == XML_ELEMENT_NODE && !xmlStrncmp("acceleration", node->name, 5)){ /* retrieve x0 offset */ x = xmlGetProp(node, "x"); if(x == NULL){ continue; } errno = 0; x_val = strtoul(x, &endptr, 10); if(errno == ERANGE){ continue; } if(x == endptr){ continue; } /* retrieve y offset */ y = xmlGetProp(node, "y"); if(y == NULL){ continue; } errno = 0; y_val = strtod(y, &endptr); if(errno == ERANGE){ continue; } if(y == endptr){ continue; } /* calculate new offset */ if(from_x_offset){ errno = 0; if(subtract_x){ x_val -= base_x_difference; if(errno != 0){ continue; } }else{ x_val += base_x_difference; if(errno != 0){ continue; } } } if(from_y_offset){ errno = 0; if(subtract_y){ y_val -= base_y_difference; }else{ y_val += base_y_difference; } if(errno != 0){ continue; } } /* check duplicate */ if(no_duplicates && ags_automation_find_point(automation, x_val, y_val, FALSE) != NULL){ continue; } /* add acceleration */ g_object_get(automation, "timestamp", ×tamp, NULL); timestamp_offset = ags_timestamp_get_ags_offset(timestamp); g_object_unref(timestamp); if(!match_timestamp || (x_val >= timestamp_offset && x_val < timestamp_offset + AGS_AUTOMATION_DEFAULT_OFFSET)){ acceleration = ags_acceleration_new(); acceleration->x = x_val; acceleration->y = y_val; #ifdef AGS_DEBUG g_message("adding acceleration at: [%u|%f]\n", x_val, y_val); #endif ags_automation_add_acceleration(automation, acceleration, FALSE); } } } } void ags_automation_insert_native_scale_from_clipboard(AgsAutomation *automation, xmlNode *root_node, char *version, char *x_boundary, char *y_boundary, gboolean from_x_offset, guint x_offset, gboolean from_y_offset, guint y_offset, gboolean match_line, gboolean no_duplicates) { guint current_line; gboolean match_timestamp; if(!AGS_IS_AUTOMATION(automation)){ return; } g_object_get(automation, "line", ¤t_line, NULL); match_timestamp = TRUE; if(!xmlStrncmp("0.4.3", version, 6)){ ags_automation_insert_from_clipboard_version_0_4_3(automation, root_node, version, x_boundary, y_boundary, from_x_offset, x_offset, from_y_offset, y_offset, match_line, no_duplicates, current_line, match_timestamp); }else if(!xmlStrncmp("1.3.0", version, 6)){ match_timestamp = TRUE; if(match_line && current_line != g_ascii_strtoull(xmlGetProp(root_node, "line"), NULL, 10)){ return; } ags_automation_insert_from_clipboard_version_0_4_3(automation, root_node, version, x_boundary, y_boundary, from_x_offset, x_offset, from_y_offset, y_offset, match_line, no_duplicates, current_line, match_timestamp); } } /** * ags_automation_insert_from_clipboard: * @automation: the #AgsAutomation * @automation_node: the xmlNode * @reset_x_offset: if %TRUE reset x offset * @x_offset: the x offset to use * @reset_y_offset: if %TRUE reset y offset * @y_offset: the y offset to use * * Insert clipboard @automation_node to @automation. * * Since: 3.0.0 */ void ags_automation_insert_from_clipboard(AgsAutomation *automation, xmlNode *automation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, gdouble y_offset) { ags_automation_insert_from_clipboard_extended(automation, automation_node, reset_x_offset, x_offset, reset_y_offset, y_offset, FALSE, FALSE); } /** * ags_automation_insert_from_clipboard_extended: * @automation: the #AgsAutomation * @automation_node: the xmlNode * @reset_x_offset: if %TRUE reset x offset * @x_offset: the x offset to use * @reset_y_offset: if %TRUE reset y offset * @y_offset: the y offset to use * @match_line: if %TRUE match line or discard * @no_duplicates: if %TRUE eliminate duplicates * * Insert clipboard @automation_node to @automation. * * Since: 3.0.0 */ void ags_automation_insert_from_clipboard_extended(AgsAutomation *automation, xmlNode *automation_node, gboolean reset_x_offset, guint x_offset, gboolean reset_y_offset, gdouble y_offset, gboolean match_line, gboolean no_duplicates) { char *program, *version, *type, *format; char *base_frequency; char *x_boundary, *y_boundary; if(!AGS_IS_AUTOMATION(automation)){ return; } while(automation_node != NULL){ if(automation_node->type == XML_ELEMENT_NODE && !xmlStrncmp("automation", automation_node->name, 11)){ break; } automation_node = automation_node->next; } if(automation_node != NULL){ program = xmlGetProp(automation_node, "program"); if(!xmlStrncmp("ags", program, 4)){ version = xmlGetProp(automation_node, "version"); type = xmlGetProp(automation_node, "type"); format = xmlGetProp(automation_node, "format"); if(!xmlStrcmp(AGS_AUTOMATION_CLIPBOARD_FORMAT, format) || !xmlStrcmp(AGS_AUTOMATION_CLIPBOARD_LEGACY_FORMAT, format)){ x_boundary = xmlGetProp(automation_node, "x_boundary"); y_boundary = xmlGetProp(automation_node, "y_boundary"); ags_automation_insert_native_scale_from_clipboard(automation, automation_node, version, x_boundary, y_boundary, reset_x_offset, x_offset, reset_y_offset, y_offset, match_line, no_duplicates); } } } } /** * ags_automation_get_specifier_unique: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * * Retrieve automation port specifier. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL terminated string array * * Since: 3.0.0 */ gchar** ags_automation_get_specifier_unique(GList *automation) { AgsAutomation *current_automation; gchar **specifier; gchar *current_control_name; guint length, i; gboolean contains_control_name; GRecMutex *automation_mutex; if(automation == NULL){ return(NULL); } specifier = (gchar **) malloc(sizeof(gchar*)); specifier[0] = NULL; length = 1; while(automation != NULL){ current_automation = automation->data; /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(current_automation); /* duplicate control name */ g_rec_mutex_lock(automation_mutex); current_control_name = g_strdup(current_automation->control_name); g_rec_mutex_unlock(automation_mutex); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(specifier, current_control_name); #else contains_control_name = ags_strv_contains(specifier, current_control_name); #endif if(!contains_control_name){ specifier = (gchar **) realloc(specifier, (length + 1) * sizeof(gchar *)); specifier[length - 1] = current_control_name; specifier[length] = NULL; length++; }else{ g_free(current_control_name); } /* iterate */ automation = automation->next; } return(specifier); } /** * ags_automation_get_specifier_unique_with_channel_type: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @channel_type: the channel's #GType * * Retrieve automation port specifier. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL terminated string array * * Since: 3.0.0 */ gchar** ags_automation_get_specifier_unique_with_channel_type(GList *automation, GType channel_type) { AgsAutomation *current_automation; GType current_channel_type; gchar **specifier; gchar *current_control_name; guint length, i; gboolean contains_control_name; GRecMutex *automation_mutex; if(automation == NULL){ return(NULL); } specifier = (gchar **) malloc(sizeof(gchar*)); specifier[0] = NULL; length = 1; while(automation != NULL){ current_automation = automation->data; /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(current_automation); /* get channel type */ g_rec_mutex_lock(automation_mutex); current_channel_type = current_automation->channel_type; g_rec_mutex_unlock(automation_mutex); if(current_channel_type != channel_type){ automation = automation->next; continue; } /* duplicate control name */ g_rec_mutex_lock(automation_mutex); current_control_name = g_strdup(current_automation->control_name); g_rec_mutex_unlock(automation_mutex); #ifdef HAVE_GLIB_2_44 contains_control_name = g_strv_contains(specifier, current_control_name); #else contains_control_name = ags_strv_contains(specifier, current_control_name); #endif if(!contains_control_name){ specifier = (gchar **) realloc(specifier, (length + 1) * sizeof(gchar *)); specifier[length - 1] = current_control_name; specifier[length] = NULL; length++; }else{ g_free(current_control_name); } /* iterate */ automation = automation->next; } return(specifier); } /** * ags_automation_find_specifier: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @specifier: the string specifier to find * * Find port specifier. * * Returns: (element-type AgsAudio.Automation) (transfer none): Next matching #GList * * Since: 3.0.0 */ GList* ags_automation_find_specifier(GList *automation, gchar *specifier) { AgsAutomation *current_automation; gchar *current_control_name; gboolean success; GRecMutex *automation_mutex; while(automation != NULL){ current_automation = automation->data; /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(current_automation); /* duplicate control name */ g_rec_mutex_lock(automation_mutex); current_control_name = g_strdup(current_automation->control_name); g_rec_mutex_unlock(automation_mutex); /* check control name */ success = (!g_ascii_strcasecmp(current_control_name, specifier)) ? TRUE: FALSE; g_free(current_control_name); if(success){ break; } automation = automation->next; } return(automation); } /** * ags_automation_find_channel_type_with_control_name: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @channel_type: the #GType to match * @specifier: the control name * * Find automation by @channel_type. * * Returns: (element-type AgsAudio.Automation) (transfer none): next matching automation as #GList-struct or %NULL if not found * * Since: 3.0.0 */ GList* ags_automation_find_channel_type_with_control_name(GList *automation, GType channel_type, gchar *specifier) { AgsAutomation *current_automation; GType current_channel_type; gchar *current_control_name; gboolean success; GRecMutex *automation_mutex; if(automation == NULL){ return(NULL); } while(automation != NULL){ current_automation = automation->data; /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(current_automation); /* duplicate control name */ g_rec_mutex_lock(automation_mutex); current_channel_type = current_automation->channel_type; current_control_name = g_strdup(current_automation->control_name); g_rec_mutex_unlock(automation_mutex); /* check channel type and control name */ success = (current_channel_type == channel_type && !g_strcmp0(current_control_name, specifier)) ? TRUE: FALSE; g_free(current_control_name); if(success){ break; } automation = automation->next; } return(automation); } /** * ags_automation_find_specifier_with_type_and_line: * @automation: (element-type AgsAudio.Automation) (transfer none): the #GList-struct containing #AgsAutomation * @specifier: the string specifier to find * @channel_type: the channel #GType * @line: the line * * Find port specifier with channel type and line. * * Returns: (element-type AgsAudio.Automation) (transfer none): Next matching #GList-struct * * Since: 3.0.0 */ GList* ags_automation_find_specifier_with_type_and_line(GList *automation, gchar *specifier, GType channel_type, guint line) { AgsAutomation *current_automation; GType current_channel_type; gchar *current_control_name; guint current_line; gboolean success; GRecMutex *automation_mutex; if(automation == NULL){ return(NULL); } while(automation != NULL){ current_automation = automation->data; /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(current_automation); /* duplicate control name */ g_rec_mutex_lock(automation_mutex); current_channel_type = current_automation->channel_type; current_line = current_automation->line; current_control_name = g_strdup(current_automation->control_name); g_rec_mutex_unlock(automation_mutex); /* check channel type, line and control name */ success = (!g_ascii_strcasecmp(current_control_name, specifier) && current_channel_type == channel_type && current_line == line) ? TRUE: FALSE; g_free(current_control_name); if(success){ break; } automation = automation->next; } return(automation); } /** * ags_automation_get_value: * @automation: the #AgsAutomation * @x: the x-offset * @x_end: the x-end-offset * @use_prev_on_failure: if %TRUE use previous value, else return G_MAXUINT * @value: (out caller-allocates): the return location of value * * Get automation value. * * Returns: the x_offset * * Since: 3.0.0 */ guint ags_automation_get_value(AgsAutomation *automation, guint x, guint x_end, gboolean use_prev_on_failure, GValue *value) { AgsAcceleration *matching_acceleration; AgsPort *port; GType port_value_type; GList *acceleration; GList *next, *prev; GList *current_start, *current_end, *current; guint current_start_x, current_end_x, current_x; guint length, position; gboolean success; guint ret_x; gdouble default_value; gdouble y; gboolean port_value_is_pointer; GRecMutex *automation_mutex; if(!AGS_IS_AUTOMATION(automation)){ return(G_MAXUINT); } /* get automation mutex */ automation_mutex = AGS_AUTOMATION_GET_OBJ_MUTEX(automation); /* */ g_rec_mutex_lock(automation_mutex); port = (AgsPort *) automation->port; acceleration = automation->acceleration; current_start = acceleration; current_end = g_list_last(acceleration); length = g_list_length(acceleration); position = (length - 1) / 2; current = g_list_nth(current_start, position); if(acceleration == NULL){ g_rec_mutex_unlock(automation_mutex); return(G_MAXUINT); } matching_acceleration = NULL; ret_x = 0; success = FALSE; while(!success && current != NULL){ g_object_get(current_start->data, "x", ¤t_start_x, NULL); if(current_start_x > x){ break; } if(current_start_x >= x && current_start_x < x_end){ matching_acceleration = current_start->data; break; } g_object_get(current_end->data, "x", ¤t_end_x, NULL); if(current_end_x < x){ break; } if(current_end_x >= x && current_end_x < x_end){ matching_acceleration = current_end->data; break; } g_object_get(current->data, "x", ¤t_x, NULL); if(current_x >= x && current_x < x_end){ matching_acceleration = current->data; break; } if(length <= 3){ break; } if(current_x < x){ current_start = current->next; current_end = current_end->prev; }else if(current_x > x){ current_start = current_start->next; current_end = current->prev; }else{ current_start = current_start->next; //NOTE:JK: we want progression //current_end = current_end->prev; } length = g_list_position(current_start, current_end) + 1; position = (length - 1) / 2; current = g_list_nth(current_start, position); } if(matching_acceleration != NULL){ guint tmp_x; next = NULL; if(current_start->data == matching_acceleration){ next = current_start->next; ret_x = current_start_x; }else if(current_end->data == matching_acceleration){ next = current_end->next; ret_x = current_end_x; }else if(current->data == matching_acceleration){ next = current->next; ret_x = current_x; } while(next != NULL){ g_object_get(next->data, "x", &tmp_x, NULL); if(tmp_x > x_end){ break; } matching_acceleration = next->data; next = next->next; } }else{ if(use_prev_on_failure){ guint tmp_x; prev = current_end; while(prev != NULL){ g_object_get(prev->data, "x", &tmp_x, NULL); if(tmp_x < x){ matching_acceleration = prev->data; break; } prev = prev->prev; } } } g_rec_mutex_unlock(automation_mutex); if(matching_acceleration == NULL){ return(G_MAXUINT); } /* apply port */ g_object_get(automation, "default-value", &default_value, NULL); g_object_get(port, "port-value-is-pointer", &port_value_is_pointer, "port-value-type", &port_value_type, NULL); g_object_get(matching_acceleration, "y", &y, NULL); if(!port_value_is_pointer){ if(port_value_type == G_TYPE_BOOLEAN){ gboolean current; current = FALSE; if(acceleration == NULL){ if(default_value != 0.0){ current = TRUE; } }else{ if(y != 0.0){ current = TRUE; } } g_value_init(value, G_TYPE_BOOLEAN); g_value_set_boolean(value, current); }else if(port_value_type == G_TYPE_INT64){ gint64 current; current = floor(y); g_value_init(value, G_TYPE_INT64); g_value_set_int64(value, current); }else if(port_value_type == G_TYPE_UINT64){ guint64 current; current = floor(y); g_value_init(value, G_TYPE_UINT64); g_value_set_uint64(value, current); }else if(port_value_type == G_TYPE_FLOAT){ gfloat current; current = y; g_value_init(value, G_TYPE_FLOAT); g_value_set_float(value, current); }else if(port_value_type == G_TYPE_DOUBLE){ gdouble current; current = y; g_value_init(value, G_TYPE_DOUBLE); g_value_set_double(value, current); }else if(port_value_type == G_TYPE_POINTER){ g_warning("ags_automation.c - unsupported value type pointer"); }else if(port_value_type == G_TYPE_OBJECT){ g_warning("ags_automation.c - unsupported value type object"); }else{ g_warning("ags_automation.c - unknown type"); } }else{ g_warning("ags_automation.c - unsupported value type pointer"); } return(ret_x); } /** * ags_automation_new: * @audio: the #AgsAudio * @line: the line to apply * @channel_type: the channel type * @control_name: the control name * * Creates a new instance of #AgsAutomation. * * Returns: the new #AgsAutomation * * Since: 3.0.0 */ AgsAutomation* ags_automation_new(GObject *audio, guint line, GType channel_type, gchar *control_name) { AgsAutomation *automation; automation = (AgsAutomation *) g_object_new(AGS_TYPE_AUTOMATION, "audio", audio, "line", line, "channel-type", channel_type, "control-name", control_name, NULL); return(automation); } gsequencer-3.1.3/ags/audio/ags_recall_id.h0000644000175000017500000000641113607210263015376 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_ID_H__ #define __AGS_RECALL_ID_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_ID (ags_recall_id_get_type ()) #define AGS_RECALL_ID(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), AGS_TYPE_RECALL_ID, AgsRecallID)) #define AGS_RECALL_ID_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), AGS_TYPE_RECALL_ID, AgsRecallIDClass)) #define AGS_IS_RECALL_ID(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_ID)) #define AGS_IS_RECALL_ID_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_ID)) #define AGS_RECALL_ID_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_ID, AgsRecallIDClass)) #define AGS_RECALL_ID_GET_OBJ_MUTEX(obj) (&(((AgsRecallID *) obj)->obj_mutex)) typedef struct _AgsRecallID AgsRecallID; typedef struct _AgsRecallIDClass AgsRecallIDClass; struct _AgsRecallID { GObject gobject; guint flags; gint sound_scope; guint staging_flags; guint state_flags; GRecMutex obj_mutex; AgsRecyclingContext *recycling_context; }; struct _AgsRecallIDClass { GObjectClass gobject; }; GType ags_recall_id_get_type(void); /* scope */ void ags_recall_id_set_sound_scope(AgsRecallID *recall_id, gint sound_scope); gboolean ags_recall_id_check_sound_scope(AgsRecallID *recall_id, gint sound_scope); /* staging flags */ gboolean ags_recall_id_test_staging_flags(AgsRecallID *recall_id, guint staging_flags); void ags_recall_id_set_staging_flags(AgsRecallID *recall_id, guint staging_flags); void ags_recall_id_unset_staging_flags(AgsRecallID *recall_id, guint staging_flags); gboolean ags_recall_id_check_staging_flags(AgsRecallID *recall_id, guint staging_flags); /* state flags */ gboolean ags_recall_id_test_state_flags(AgsRecallID *recall_id, guint state_flags); void ags_recall_id_set_state_flags(AgsRecallID *recall_id, guint state_flags); void ags_recall_id_unset_state_flags(AgsRecallID *recall_id, guint state_flags); gboolean ags_recall_id_check_state_flags(AgsRecallID *recall_id, guint state_flags); /* query recycling context */ AgsRecallID* ags_recall_id_find_recycling_context(GList *recall_id, AgsRecyclingContext *recycling_context); AgsRecallID* ags_recall_id_find_parent_recycling_context(GList *recall_id, AgsRecyclingContext *parent_recycling_context); /* instantiate */ AgsRecallID* ags_recall_id_new(); G_END_DECLS #endif /*__AGS_RECALL_ID_H__*/ gsequencer-3.1.3/ags/audio/ags_char_buffer_util.h0000644000175000017500000001320513607210263016762 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CHAR_BUFFER_UTIL_H__ #define __AGS_CHAR_BUFFER_UTIL_H__ #include #include #include G_BEGIN_DECLS /** * AgsCharBufferUtilCopyMode: * @AGS_CHAR_BUFFER_UTIL_COPY_S8_TO_CBUFFER: copy signed 8 bit to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_S16_TO_CBUFFER: copy signed 16 bit to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_S24_TO_CBUFFER: copy signed 24 bit to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_S32_TO_CBUFFER: copy signed 32 bit to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_S64_TO_CBUFFER: copy signed 64 bit to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_FLOAT_TO_CBUFFER: copy float to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_DOUBLE_TO_CBUFFER: copy double to char buffer * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S8: copy char buffer to signed 8 bit * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S16: copy char buffer to signed 16 bit * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S24: copy char buffer to signed 24 bit * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S32: copy char buffer to signed 32 bit * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S64: copy char buffer to signed 64 bit * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_FLOAT: copy char buffer to float * @AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_DOUBLE: copy char buffer to double * * Copy modes. */ typedef enum{ AGS_CHAR_BUFFER_UTIL_COPY_S8_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_S16_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_S24_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_S32_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_S64_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_FLOAT_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_DOUBLE_TO_CBUFFER, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S8, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S16, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S24, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S32, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_S64, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_FLOAT, AGS_CHAR_BUFFER_UTIL_COPY_CBUFFER_TO_DOUBLE, }AgsCharBufferUtilCopyMode; /* copy to cbuffer */ void ags_char_buffer_util_copy_s8_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint8 *source, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_s16_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint16 *source, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_s24_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint32 *source, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_s32_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint32 *source, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_s64_to_cbuffer(guchar *destination, guint word_size, guint dchannels, gint64 *source, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_float_to_cbuffer(guchar *destination, guint word_size, guint dchannels, float *source, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_double_to_cbuffer(guchar *destination, guint word_size, guint dchannels, double *source, guint schannels, guint frame_count, guint byte_order); /* copy from cbuffer */ void ags_char_buffer_util_copy_cbuffer_to_s8(gint8 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_cbuffer_to_s16(gint16 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_cbuffer_to_s24(gint32 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_cbuffer_to_s32(gint32 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_cbuffer_to_s64(gint64 *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_cbuffer_to_float(float *destination, guint dchannels, gint8 *source, guint word_size, guint schannels, guint frame_count, guint byte_order); void ags_char_buffer_util_copy_cbuffer_to_double(double *destination, guint dchannels, guchar *source, guint word_size, guint schannels, guint frame_count, guint byte_order); /* copy */ void ags_char_buffer_util_copy_buffer_to_buffer(void *destination, guint dchannels, guint doffset, void *source, guint schannels, guint soffset, guint frame_count, guint byte_order, guint word_size, guint mode); G_END_DECLS #endif /*__AGS_CHAR_BUFFER_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_sequencer_util.h0000644000175000017500000000201413607210263016502 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SEQUENCER_UTIL_H__ #define __AGS_SEQUENCER_UTIL_H__ #include #include #include G_BEGIN_DECLS GRecMutex* ags_sequencer_util_get_obj_mutex(GObject *sequencer); G_END_DECLS #endif /*__AGS_SEQUENCER_UTIL_H__*/ gsequencer-3.1.3/ags/audio/ags_sound_enums.h0000644000175000017500000001357613607210263016031 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUND_ENUMS_H__ #define __AGS_SOUND_ENUMS_H__ #include #include #include G_BEGIN_DECLS /** * AgsSoundAbilityFlags: * @AGS_SOUND_ABILITY_PLAYBACK: playback ability * @AGS_SOUND_ABILITY_SEQUENCER: sequenecer ability * @AGS_SOUND_ABILITY_NOTATION: notation abilitiy * @AGS_SOUND_ABILITY_WAVE: wave abilitiy * @AGS_SOUND_ABILITY_MIDI: MIDI ability * * Enum values to specify particular ability. Mark an object to be * able to handle matching scope. */ typedef enum{ AGS_SOUND_ABILITY_PLAYBACK = 1, AGS_SOUND_ABILITY_SEQUENCER = 1 << 1, AGS_SOUND_ABILITY_NOTATION = 1 << 2, AGS_SOUND_ABILITY_WAVE = 1 << 3, AGS_SOUND_ABILITY_MIDI = 1 << 4, }AgsSoundAbilityFlags; /** * AgsSoundBehaviourFlags: * @AGS_SOUND_BEHAVIOUR_PATTERN_MODE: pattern mode * @AGS_SOUND_BEHAVIOUR_BULK_MODE: bulk mode * @AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING: reverse mapping * @AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT: defaults to output * @AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT: defaults to input * @AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT: chained to output * @AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT: chained to input * @AGS_SOUND_BEHAVIOUR_PERSISTENT: persistend * @AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK: persistend playback * @AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION: persistend notation * @AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER: persistend sequencer * @AGS_SOUND_BEHAVIOUR_PERSISTENT_WAVE: persistend wave * @AGS_SOUND_BEHAVIOUR_PERSISTENT_MIDI: persistend MIDI * @AGS_SOUND_BEHAVIOUR_PROPAGATE_DONE: propagate done * * Enum values to describe behaviour. */ typedef enum{ AGS_SOUND_BEHAVIOUR_PATTERN_MODE = 1, AGS_SOUND_BEHAVIOUR_BULK_MODE = 1 << 1, AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING = 1 << 2, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_OUTPUT = 1 << 3, AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT = 1 << 4, AGS_SOUND_BEHAVIOUR_CHAINED_TO_OUTPUT = 1 << 5, AGS_SOUND_BEHAVIOUR_CHAINED_TO_INPUT = 1 << 6, AGS_SOUND_BEHAVIOUR_PERSISTENT = 1 << 7, AGS_SOUND_BEHAVIOUR_PERSISTENT_PLAYBACK = 1 << 8, AGS_SOUND_BEHAVIOUR_PERSISTENT_NOTATION = 1 << 9, AGS_SOUND_BEHAVIOUR_PERSISTENT_SEQUENCER = 1 << 10, AGS_SOUND_BEHAVIOUR_PERSISTENT_WAVE = 1 << 11, AGS_SOUND_BEHAVIOUR_PERSISTENT_MIDI = 1 << 12, AGS_SOUND_BEHAVIOUR_PROPAGATE_DONE = 1 << 13, }AgsSoundBehaviourFlags; /** * AgsSoundScope: * @AGS_SOUND_SCOPE_PLAYBACK: playback scope * @AGS_SOUND_SCOPE_SEQUENCER: sequenecer scope * @AGS_SOUND_SCOPE_NOTATION: notation abilitiy * @AGS_SOUND_SCOPE_WAVE: wave abilitiy * @AGS_SOUND_SCOPE_MIDI: MIDI scope * @AGS_SOUND_SCOPE_LAST: the last scope * * Enum values to specify current scope. Request current scope. */ typedef enum{ AGS_SOUND_SCOPE_PLAYBACK, AGS_SOUND_SCOPE_SEQUENCER, AGS_SOUND_SCOPE_NOTATION, AGS_SOUND_SCOPE_WAVE, AGS_SOUND_SCOPE_MIDI, AGS_SOUND_SCOPE_LAST, }AgsSoundScope; /** * AgsSoundStagingFlags: * @AGS_SOUND_STAGING_CHECK_RT_DATA: check rt-data * @AGS_SOUND_STAGING_RUN_INIT_PRE: run init pre * @AGS_SOUND_STAGING_RUN_INIT_INTER: run init inter * @AGS_SOUND_STAGING_RUN_INIT_POST: run init post * @AGS_SOUND_STAGING_FEED_INPUT_QUEUE: feed input queue * @AGS_SOUND_STAGING_AUTOMATE: automate * @AGS_SOUND_STAGING_RUN_PRE: run pre * @AGS_SOUND_STAGING_RUN_INTER: run inter * @AGS_SOUND_STAGING_RUN_POST: run post * @AGS_SOUND_STAGING_DO_FEEDBACK: do feedback * @AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE: feed output queue * @AGS_SOUND_STAGING_FINI: fini * @AGS_SOUND_STAGING_CANCEL: cancel * @AGS_SOUND_STAGING_DONE: done * @AGS_SOUND_STAGING_REMOVE: remove * @AGS_SOUND_STAGING_RESET: reset * * Enum values to stage the specified action. */ typedef enum{ AGS_SOUND_STAGING_CHECK_RT_DATA = 1, AGS_SOUND_STAGING_RUN_INIT_PRE = 1 << 1, AGS_SOUND_STAGING_RUN_INIT_INTER = 1 << 2, AGS_SOUND_STAGING_RUN_INIT_POST = 1 << 3, AGS_SOUND_STAGING_FEED_INPUT_QUEUE = 1 << 4, AGS_SOUND_STAGING_AUTOMATE = 1 << 5, AGS_SOUND_STAGING_RUN_PRE = 1 << 6, AGS_SOUND_STAGING_RUN_INTER = 1 << 7, AGS_SOUND_STAGING_RUN_POST = 1 << 8, AGS_SOUND_STAGING_DO_FEEDBACK = 1 << 9, AGS_SOUND_STAGING_FEED_OUTPUT_QUEUE = 1 << 10, AGS_SOUND_STAGING_FINI = 1 << 11, AGS_SOUND_STAGING_CANCEL = 1 << 12, AGS_SOUND_STAGING_DONE = 1 << 13, AGS_SOUND_STAGING_REMOVE = 1 << 14, AGS_SOUND_STAGING_RESET = 1 << 15, }AgsSoundStagingFlags; /** * AgsSoundStateFlags: * @AGS_SOUND_STATE_IS_WAITING: is waiting * @AGS_SOUND_STATE_IS_ACTIVE: is active * @AGS_SOUND_STATE_IS_PROCESSING: is processing * @AGS_SOUND_STATE_IS_TERMINATING: is terminating * * Enum values to indicate state. */ typedef enum{ AGS_SOUND_STATE_IS_WAITING = 1, AGS_SOUND_STATE_IS_ACTIVE = 1 << 1, AGS_SOUND_STATE_IS_PROCESSING = 1 << 2, AGS_SOUND_STATE_IS_TERMINATING = 1 << 3, }AgsSoundStateFlags; G_END_DECLS #endif /*__AGS_SOUND_ENUMS_H__*/ gsequencer-3.1.3/ags/audio/core-audio/0000755000175000017500000000000013622252254014565 500000000000000gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_devin.h0000644000175000017500000001552513607210263021013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CORE_AUDIO_DEVIN_H__ #define __AGS_CORE_AUDIO_DEVIN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CORE_AUDIO_DEVIN (ags_core_audio_devin_get_type()) #define AGS_CORE_AUDIO_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CORE_AUDIO_DEVIN, AgsCoreAudioDevin)) #define AGS_CORE_AUDIO_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CORE_AUDIO_DEVIN, AgsCoreAudioDevin)) #define AGS_IS_CORE_AUDIO_DEVIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CORE_AUDIO_DEVIN)) #define AGS_IS_CORE_AUDIO_DEVIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CORE_AUDIO_DEVIN)) #define AGS_CORE_AUDIO_DEVIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CORE_AUDIO_DEVIN, AgsCoreAudioDevinClass)) #define AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(obj) (&(((AgsCoreAudioDevin *) obj)->obj_mutex)) typedef struct _AgsCoreAudioDevin AgsCoreAudioDevin; typedef struct _AgsCoreAudioDevinClass AgsCoreAudioDevinClass; /** * AgsCoreAudioDevinFlags: * @AGS_CORE_AUDIO_DEVIN_ADDED_TO_REGISTRY: the core-audio devin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CORE_AUDIO_DEVIN_CONNECTED: indicates the core-audio devin was connected by calling #AgsConnectable::connect() * @AGS_CORE_AUDIO_DEVIN_BUFFER0: ring-buffer 0 * @AGS_CORE_AUDIO_DEVIN_BUFFER1: ring-buffer 1 * @AGS_CORE_AUDIO_DEVIN_BUFFER2: ring-buffer 2 * @AGS_CORE_AUDIO_DEVIN_BUFFER3: ring-buffer 3 * @AGS_CORE_AUDIO_DEVIN_BUFFER4: ring-buffer 4 * @AGS_CORE_AUDIO_DEVIN_BUFFER5: ring-buffer 5 * @AGS_CORE_AUDIO_DEVIN_BUFFER6: ring-buffer 6 * @AGS_CORE_AUDIO_DEVIN_BUFFER7: ring-buffer 7 * @AGS_CORE_AUDIO_DEVIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_CORE_AUDIO_DEVIN_RECORD: do capture * @AGS_CORE_AUDIO_DEVIN_SHUTDOWN: stop capture * @AGS_CORE_AUDIO_DEVIN_START_RECORD: capture starting * @AGS_CORE_AUDIO_DEVIN_NONBLOCKING: do non-blocking calls * @AGS_CORE_AUDIO_DEVIN_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsCoreAudioDevin by * enable/disable as flags. */ typedef enum{ AGS_CORE_AUDIO_DEVIN_ADDED_TO_REGISTRY = 1, AGS_CORE_AUDIO_DEVIN_CONNECTED = 1 << 1, AGS_CORE_AUDIO_DEVIN_BUFFER0 = 1 << 2, AGS_CORE_AUDIO_DEVIN_BUFFER1 = 1 << 3, AGS_CORE_AUDIO_DEVIN_BUFFER2 = 1 << 4, AGS_CORE_AUDIO_DEVIN_BUFFER3 = 1 << 5, AGS_CORE_AUDIO_DEVIN_BUFFER4 = 1 << 6, AGS_CORE_AUDIO_DEVIN_BUFFER5 = 1 << 7, AGS_CORE_AUDIO_DEVIN_BUFFER6 = 1 << 8, AGS_CORE_AUDIO_DEVIN_BUFFER7 = 1 << 9, AGS_CORE_AUDIO_DEVIN_ATTACK_FIRST = 1 << 10, AGS_CORE_AUDIO_DEVIN_RECORD = 1 << 11, AGS_CORE_AUDIO_DEVIN_SHUTDOWN = 1 << 12, AGS_CORE_AUDIO_DEVIN_START_RECORD = 1 << 13, AGS_CORE_AUDIO_DEVIN_NONBLOCKING = 1 << 14, AGS_CORE_AUDIO_DEVIN_INITIALIZED = 1 << 15, }AgsCoreAudioDevinFlags; /** * AgsCoreAudioDevinSyncFlags: * @AGS_CORE_AUDIO_DEVIN_PASS_THROUGH: do not sync * @AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK: initial callback * @AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_CORE_AUDIO_DEVIN_PASS_THROUGH = 1, AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK = 1 << 1, AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT = 1 << 2, AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE = 1 << 3, AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT = 1 << 4, AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE = 1 << 5, }AgsCoreAudioDevinSyncFlags; #define AGS_CORE_AUDIO_DEVIN_ERROR (ags_core_audio_devin_error_quark()) typedef enum{ AGS_CORE_AUDIO_DEVIN_ERROR_LOCKED_SOUNDCARD, }AgsCoreAudioDevinError; struct _AgsCoreAudioDevin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; void** buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *core_audio_client; gchar **port_name; GList *core_audio_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsCoreAudioDevinClass { GObjectClass gobject; }; GType ags_core_audio_devin_get_type(); GQuark ags_core_audio_devin_error_quark(); gboolean ags_core_audio_devin_test_flags(AgsCoreAudioDevin *core_audio_devin, guint flags); void ags_core_audio_devin_set_flags(AgsCoreAudioDevin *core_audio_devin, guint flags); void ags_core_audio_devin_unset_flags(AgsCoreAudioDevin *core_audio_devin, guint flags); void ags_core_audio_devin_switch_buffer_flag(AgsCoreAudioDevin *core_audio_devin); void ags_core_audio_devin_adjust_delay_and_attack(AgsCoreAudioDevin *core_audio_devin); void ags_core_audio_devin_realloc_buffer(AgsCoreAudioDevin *core_audio_devin); AgsCoreAudioDevin* ags_core_audio_devin_new(); G_END_DECLS #endif /*__AGS_CORE_AUDIO_DEVIN_H__*/ gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_midiin.h0000644000175000017500000001412013607210263021145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CORE_AUDIO_MIDIIN_H__ #define __AGS_CORE_AUDIO_MIDIIN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CORE_AUDIO_MIDIIN (ags_core_audio_midiin_get_type()) #define AGS_CORE_AUDIO_MIDIIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CORE_AUDIO_MIDIIN, AgsCoreAudioMidiin)) #define AGS_CORE_AUDIO_MIDIIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CORE_AUDIO_MIDIIN, AgsCoreAudioMidiin)) #define AGS_IS_CORE_AUDIO_MIDIIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CORE_AUDIO_MIDIIN)) #define AGS_IS_CORE_AUDIO_MIDIIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CORE_AUDIO_MIDIIN)) #define AGS_CORE_AUDIO_MIDIIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CORE_AUDIO_MIDIIN, AgsCoreAudioMidiinClass)) #define AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(obj) (&(((AgsCoreAudioMidiin *) obj)->obj_mutex)) #define AGS_CORE_AUDIO_MIDIIN_DEFAULT_BUFFER_SIZE (256) typedef struct _AgsCoreAudioMidiin AgsCoreAudioMidiin; typedef struct _AgsCoreAudioMidiinClass AgsCoreAudioMidiinClass; /** * AgsCoreAudioMidiinFlags: * @AGS_CORE_AUDIO_MIDIIN_ADDED_TO_REGISTRY: the CoreAudio midiin was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CORE_AUDIO_MIDIIN_CONNECTED: indicates the CoreAudio midiin was connected by calling #AgsConnectable::connect() * @AGS_CORE_AUDIO_MIDIIN_BUFFER0: ring-buffer 0 * @AGS_CORE_AUDIO_MIDIIN_BUFFER1: ring-buffer 1 * @AGS_CORE_AUDIO_MIDIIN_BUFFER2: ring-buffer 2 * @AGS_CORE_AUDIO_MIDIIN_BUFFER3: ring-buffer 3 * @AGS_CORE_AUDIO_MIDIIN_ATTACK_FIRST: use first attack, instead of second one * @AGS_CORE_AUDIO_MIDIIN_RECORD: is recording * @AGS_CORE_AUDIO_MIDIIN_SHUTDOWN: stop recording * @AGS_CORE_AUDIO_MIDIIN_START_RECORD: just started recording * @AGS_CORE_AUDIO_MIDIIN_NONBLOCKING: do non-blocking calls * @AGS_CORE_AUDIO_MIDIIN_INITIALIZED: recording is initialized * * Enum values to control the behavior or indicate internal state of #AgsCoreAudioMidiin by * enable/disable as flags. */ typedef enum { AGS_CORE_AUDIO_MIDIIN_ADDED_TO_REGISTRY = 1, AGS_CORE_AUDIO_MIDIIN_CONNECTED = 1 << 1, AGS_CORE_AUDIO_MIDIIN_BUFFER0 = 1 << 2, AGS_CORE_AUDIO_MIDIIN_BUFFER1 = 1 << 3, AGS_CORE_AUDIO_MIDIIN_BUFFER2 = 1 << 4, AGS_CORE_AUDIO_MIDIIN_BUFFER3 = 1 << 5, AGS_CORE_AUDIO_MIDIIN_ATTACK_FIRST = 1 << 6, AGS_CORE_AUDIO_MIDIIN_RECORD = 1 << 7, AGS_CORE_AUDIO_MIDIIN_SHUTDOWN = 1 << 8, AGS_CORE_AUDIO_MIDIIN_START_RECORD = 1 << 9, AGS_CORE_AUDIO_MIDIIN_NONBLOCKING = 1 << 10, AGS_CORE_AUDIO_MIDIIN_INITIALIZED = 1 << 11, }AgsCoreAudioMidiinFlags; /** * AgsCoreAudioMidiinSyncFlags: * @AGS_CORE_AUDIO_MIDIIN_PASS_THROUGH: do not sync * @AGS_CORE_AUDIO_MIDIIN_INITIAL_CALLBACK: initial callback * @AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE: sync done, client conditional lock * @AGS_CORE_AUDIO_MIDIIN_DO_SYNC: do synchronize * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_CORE_AUDIO_MIDIIN_PASS_THROUGH = 1, AGS_CORE_AUDIO_MIDIIN_INITIAL_CALLBACK = 1 << 1, AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT = 1 << 2, AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE = 1 << 3, AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT = 1 << 4, AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE = 1 << 5, AGS_CORE_AUDIO_MIDIIN_DO_SYNC = 1 << 6, }AgsCoreAudioMidiinSyncFlags; #define AGS_CORE_AUDIO_MIDIIN_ERROR (ags_core_audio_midiin_error_quark()) typedef enum{ AGS_CORE_AUDIO_MIDIIN_ERROR_LOCKED_SOUNDCARD, }AgsCoreAudioMidiinError; struct _AgsCoreAudioMidiin { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; GRecMutex **buffer_mutex; char **buffer; guint buffer_size[4]; double bpm; // beats per minute gdouble delay; gdouble delay_factor; guint latency; gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; gchar *card_uri; GObject *core_audio_client; gchar **port_name; GList *core_audio_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsCoreAudioMidiinClass { GObjectClass gobject; }; GType ags_core_audio_midiin_get_type(); GQuark ags_core_audio_midiin_error_quark(); gboolean ags_core_audio_midiin_test_flags(AgsCoreAudioMidiin *core_audio_midiin, guint flags); void ags_core_audio_midiin_set_flags(AgsCoreAudioMidiin *core_audio_midiin, guint flags); void ags_core_audio_midiin_unset_flags(AgsCoreAudioMidiin *core_audio_midiin, guint flags); void ags_core_audio_midiin_switch_buffer_flag(AgsCoreAudioMidiin *core_audio_midiin); AgsCoreAudioMidiin* ags_core_audio_midiin_new(); G_END_DECLS #endif /*__AGS_CORE_AUDIO_MIDIIN_H__*/ gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_server.h0000644000175000017500000001005113607210263021201 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CORE_AUDIO_SERVER_H__ #define __AGS_CORE_AUDIO_SERVER_H__ #include #include #include #ifdef AGS_WITH_CORE_AUDIO #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_CORE_AUDIO_SERVER (ags_core_audio_server_get_type()) #define AGS_CORE_AUDIO_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CORE_AUDIO_SERVER, AgsCoreAudioServer)) #define AGS_CORE_AUDIO_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CORE_AUDIO_SERVER, AgsCoreAudioServer)) #define AGS_IS_CORE_AUDIO_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CORE_AUDIO_SERVER)) #define AGS_IS_CORE_AUDIO_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CORE_AUDIO_SERVER)) #define AGS_CORE_AUDIO_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CORE_AUDIO_SERVER, AgsCoreAudioServerClass)) #define AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(obj) (&(((AgsCoreAudioServer *) obj)->obj_mutex)) typedef struct _AgsCoreAudioServer AgsCoreAudioServer; typedef struct _AgsCoreAudioServerClass AgsCoreAudioServerClass; /** * AgsCoreAudioServerFlags: * @AGS_CORE_AUDIO_SERVER_ADDED_TO_REGISTRY: the CoreAudio server was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CORE_AUDIO_SERVER_CONNECTED: indicates the server was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsCoreAudioServer by * enable/disable as flags. */ typedef enum{ AGS_CORE_AUDIO_SERVER_ADDED_TO_REGISTRY = 1, AGS_CORE_AUDIO_SERVER_CONNECTED = 1 << 1, }AgsCoreAudioServerFlags; struct _AgsCoreAudioServer { GObject gobject; guint flags; GRecMutex obj_mutex; volatile gboolean running; pthread_t *thread; AgsUUID *uuid; gchar *url; guint *port; guint port_count; guint n_soundcards; guint n_sequencers; GObject *default_soundcard; GObject *default_client; GList *client; }; struct _AgsCoreAudioServerClass { GObjectClass gobject; }; GType ags_core_audio_server_get_type(); gboolean ags_core_audio_server_test_flags(AgsCoreAudioServer *core_audio_server, guint flags); void ags_core_audio_server_set_flags(AgsCoreAudioServer *core_audio_server, guint flags); void ags_core_audio_server_unset_flags(AgsCoreAudioServer *core_audio_server, guint flags); GList* ags_core_audio_server_find_url(GList *core_audio_server, gchar *url); GObject* ags_core_audio_server_find_client(AgsCoreAudioServer *core_audio_server, gchar *client_uuid); GObject* ags_core_audio_server_find_port(AgsCoreAudioServer *core_audio_server, gchar *port_uuid); void ags_core_audio_server_add_client(AgsCoreAudioServer *core_audio_server, GObject *core_audio_client); void ags_core_audio_server_remove_client(AgsCoreAudioServer *core_audio_server, GObject *core_audio_client); void ags_core_audio_server_connect_client(AgsCoreAudioServer *core_audio_server); void ags_core_audio_server_start_poll(AgsCoreAudioServer *core_audio_server); AgsCoreAudioServer* ags_core_audio_server_new(gchar *url); G_END_DECLS #endif /*__AGS_CORE_AUDIO_SERVER_H__*/ gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_devin.c0000644000175000017500000023240113607210263021000 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_core_audio_devin_class_init(AgsCoreAudioDevinClass *core_audio_devin); void ags_core_audio_devin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_core_audio_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_core_audio_devin_init(AgsCoreAudioDevin *core_audio_devin); void ags_core_audio_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_core_audio_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_core_audio_devin_dispose(GObject *gobject); void ags_core_audio_devin_finalize(GObject *gobject); AgsUUID* ags_core_audio_devin_get_uuid(AgsConnectable *connectable); gboolean ags_core_audio_devin_has_resource(AgsConnectable *connectable); gboolean ags_core_audio_devin_is_ready(AgsConnectable *connectable); void ags_core_audio_devin_add_to_registry(AgsConnectable *connectable); void ags_core_audio_devin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_core_audio_devin_list_resource(AgsConnectable *connectable); xmlNode* ags_core_audio_devin_xml_compose(AgsConnectable *connectable); void ags_core_audio_devin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_core_audio_devin_is_connected(AgsConnectable *connectable); void ags_core_audio_devin_connect(AgsConnectable *connectable); void ags_core_audio_devin_disconnect(AgsConnectable *connectable); void ags_core_audio_devin_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_core_audio_devin_get_device(AgsSoundcard *soundcard); void ags_core_audio_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_core_audio_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_core_audio_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_core_audio_devin_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_core_audio_devin_get_capability(AgsSoundcard *soundcard); gboolean ags_core_audio_devin_is_starting(AgsSoundcard *soundcard); gboolean ags_core_audio_devin_is_recording(AgsSoundcard *soundcard); gchar* ags_core_audio_devin_get_uptime(AgsSoundcard *soundcard); void ags_core_audio_devin_port_init(AgsSoundcard *soundcard, GError **error); void ags_core_audio_devin_port_record(AgsSoundcard *soundcard, GError **error); void ags_core_audio_devin_port_free(AgsSoundcard *soundcard); void ags_core_audio_devin_tic(AgsSoundcard *soundcard); void ags_core_audio_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_core_audio_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_core_audio_devin_get_bpm(AgsSoundcard *soundcard); void ags_core_audio_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_core_audio_devin_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_core_audio_devin_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_core_audio_devin_get_delay(AgsSoundcard *soundcard); guint ags_core_audio_devin_get_attack(AgsSoundcard *soundcard); void* ags_core_audio_devin_get_buffer(AgsSoundcard *soundcard); void* ags_core_audio_devin_get_next_buffer(AgsSoundcard *soundcard); void* ags_core_audio_devin_get_prev_buffer(AgsSoundcard *soundcard); void ags_core_audio_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_core_audio_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_core_audio_devin_get_delay_counter(AgsSoundcard *soundcard); void ags_core_audio_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_core_audio_devin_get_start_note_offset(AgsSoundcard *soundcard); void ags_core_audio_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_core_audio_devin_get_note_offset(AgsSoundcard *soundcard); void ags_core_audio_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_core_audio_devin_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_core_audio_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_core_audio_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_core_audio_devin_get_loop_offset(AgsSoundcard *soundcard); /** * SECTION:ags_core_audio_devin * @short_description: Output to soundcard * @title: AgsCoreAudioDevin * @section_id: * @include: ags/audio/core-audio/ags_core_audio_devin.h * * #AgsCoreAudioDevin represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_CORE_AUDIO_CLIENT, PROP_CORE_AUDIO_PORT, PROP_CHANNEL, }; static gpointer ags_core_audio_devin_parent_class = NULL; GType ags_core_audio_devin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_core_audio_devin = 0; static const GTypeInfo ags_core_audio_devin_info = { sizeof(AgsCoreAudioDevinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_core_audio_devin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCoreAudioDevin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_core_audio_devin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_core_audio_devin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_core_audio_devin_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_core_audio_devin = g_type_register_static(G_TYPE_OBJECT, "AgsCoreAudioDevin", &ags_core_audio_devin_info, 0); g_type_add_interface_static(ags_type_core_audio_devin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_core_audio_devin, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_core_audio_devin); } return g_define_type_id__volatile; } void ags_core_audio_devin_class_init(AgsCoreAudioDevinClass *core_audio_devin) { GObjectClass *gobject; GParamSpec *param_spec; ags_core_audio_devin_parent_class = g_type_class_peek_parent(core_audio_devin); /* GObjectClass */ gobject = (GObjectClass *) core_audio_devin; gobject->set_property = ags_core_audio_devin_set_property; gobject->get_property = ags_core_audio_devin_get_property; gobject->dispose = ags_core_audio_devin_dispose; gobject->finalize = ags_core_audio_devin_finalize; /* properties */ /** * AgsCoreAudioDevin:device: * * The core audio soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-core-audio-devin-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsCoreAudioDevin:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsCoreAudioDevin:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsCoreAudioDevin:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsCoreAudioDevin:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsCoreAudioDevin:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsCoreAudioDevin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsCoreAudioDevin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsCoreAudioDevin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsCoreAudioDevin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsCoreAudioDevin:core-audio-client: * * The assigned #AgsCoreAudioClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-client", i18n_pspec("core audio client object"), i18n_pspec("The core audio client object"), AGS_TYPE_CORE_AUDIO_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_CLIENT, param_spec); /** * AgsCoreAudioDevin:core-audio-port: * * The assigned #AgsCoreAudioPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("core-audio-port", i18n_pspec("core audio port object"), i18n_pspec("The core audio port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_PORT, param_spec); } GQuark ags_core_audio_devin_error_quark() { return(g_quark_from_static_string("ags-core_audio_devin-error-quark")); } void ags_core_audio_devin_connectable_interface_init(AgsConnectableInterface *connectable) { //TODO:JK: implement me } void ags_core_audio_devin_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_core_audio_devin_set_device; soundcard->get_device = ags_core_audio_devin_get_device; soundcard->set_presets = ags_core_audio_devin_set_presets; soundcard->get_presets = ags_core_audio_devin_get_presets; soundcard->list_cards = ags_core_audio_devin_list_cards; soundcard->pcm_info = ags_core_audio_devin_pcm_info; soundcard->get_capability = ags_core_audio_devin_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_core_audio_devin_is_starting; soundcard->is_playing = NULL; soundcard->is_recording = ags_core_audio_devin_is_recording; soundcard->get_uptime = ags_core_audio_devin_get_uptime; soundcard->play_init = NULL; soundcard->play = NULL; soundcard->record_init = ags_core_audio_devin_port_init; soundcard->record = ags_core_audio_devin_port_record; soundcard->stop = ags_core_audio_devin_port_free; soundcard->tic = ags_core_audio_devin_tic; soundcard->offset_changed = ags_core_audio_devin_offset_changed; soundcard->set_bpm = ags_core_audio_devin_set_bpm; soundcard->get_bpm = ags_core_audio_devin_get_bpm; soundcard->set_delay_factor = ags_core_audio_devin_set_delay_factor; soundcard->get_delay_factor = ags_core_audio_devin_get_delay_factor; soundcard->get_absolute_delay = ags_core_audio_devin_get_absolute_delay; soundcard->get_delay = ags_core_audio_devin_get_delay; soundcard->get_attack = ags_core_audio_devin_get_attack; soundcard->get_buffer = ags_core_audio_devin_get_buffer; soundcard->get_next_buffer = ags_core_audio_devin_get_next_buffer; soundcard->get_prev_buffer = ags_core_audio_devin_get_prev_buffer; soundcard->lock_buffer = ags_core_audio_devin_lock_buffer; soundcard->unlock_buffer = ags_core_audio_devin_unlock_buffer; soundcard->get_delay_counter = ags_core_audio_devin_get_delay_counter; soundcard->set_start_note_offset = ags_core_audio_devin_set_start_note_offset; soundcard->get_start_note_offset = ags_core_audio_devin_get_start_note_offset; soundcard->set_note_offset = ags_core_audio_devin_set_note_offset; soundcard->get_note_offset = ags_core_audio_devin_get_note_offset; soundcard->set_note_offset_absolute = ags_core_audio_devin_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_core_audio_devin_get_note_offset_absolute; soundcard->set_loop = ags_core_audio_devin_set_loop; soundcard->get_loop = ags_core_audio_devin_get_loop; soundcard->get_loop_offset = ags_core_audio_devin_get_loop_offset; } void ags_core_audio_devin_init(AgsCoreAudioDevin *core_audio_devin) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ core_audio_devin->flags = 0; g_atomic_int_set(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_PASS_THROUGH); /* devin mutex */ g_rec_mutex_init(&(core_audio_devin->obj_mutex)); /* uuid */ core_audio_devin->uuid = ags_uuid_alloc(); ags_uuid_generate(core_audio_devin->uuid); /* presets */ config = ags_config_get_instance(); core_audio_devin->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); core_audio_devin->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); core_audio_devin->samplerate = ags_soundcard_helper_config_get_samplerate(config); core_audio_devin->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); core_audio_devin->format = ags_soundcard_helper_config_get_format(config); /* */ core_audio_devin->card_uri = NULL; core_audio_devin->core_audio_client = NULL; core_audio_devin->port_name = NULL; core_audio_devin->core_audio_port = NULL; /* buffer */ core_audio_devin->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ core_audio_devin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(core_audio_devin->buffer_mutex[i]); } core_audio_devin->buffer = (void **) malloc(8 * sizeof(void*)); core_audio_devin->buffer[0] = NULL; core_audio_devin->buffer[1] = NULL; core_audio_devin->buffer[2] = NULL; core_audio_devin->buffer[3] = NULL; core_audio_devin->buffer[4] = NULL; core_audio_devin->buffer[5] = NULL; core_audio_devin->buffer[6] = NULL; core_audio_devin->buffer[7] = NULL; ags_core_audio_devin_realloc_buffer(core_audio_devin); /* bpm */ core_audio_devin->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ core_audio_devin->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); core_audio_devin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ core_audio_devin->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); core_audio_devin->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); /* counters */ core_audio_devin->tact_counter = 0.0; core_audio_devin->delay_counter = 0.0; core_audio_devin->tic_counter = 0; core_audio_devin->start_note_offset = 0; core_audio_devin->note_offset = 0; core_audio_devin->note_offset_absolute = 0; core_audio_devin->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; core_audio_devin->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; core_audio_devin->do_loop = FALSE; core_audio_devin->loop_offset = 0; /* callback mutex */ g_mutex_init(&(core_audio_devin->callback_mutex)); g_cond_init(&(core_audio_devin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(core_audio_devin->callback_finish_mutex)); g_cond_init(&(core_audio_devin->callback_finish_cond)); } void ags_core_audio_devin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(gobject); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->card_uri = g_strdup(device); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devin_mutex); if(dsp_channels == core_audio_devin->dsp_channels){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } core_audio_devin->dsp_channels = dsp_channels; g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devin_mutex); if(pcm_channels == core_audio_devin->pcm_channels){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } core_audio_devin->pcm_channels = pcm_channels; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_realloc_buffer(core_audio_devin); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devin_mutex); if(format == core_audio_devin->format){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } core_audio_devin->format = format; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_realloc_buffer(core_audio_devin); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devin_mutex); if(buffer_size == core_audio_devin->buffer_size){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } core_audio_devin->buffer_size = buffer_size; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_realloc_buffer(core_audio_devin); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devin_mutex); if(samplerate == core_audio_devin->samplerate){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } core_audio_devin->samplerate = samplerate; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_realloc_buffer(core_audio_devin); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->bpm = bpm; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->delay_factor = delay_factor; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); } break; case PROP_CORE_AUDIO_CLIENT: { AgsCoreAudioClient *core_audio_client; core_audio_client = (AgsCoreAudioClient *) g_value_get_object(value); g_rec_mutex_lock(core_audio_devin_mutex); if(core_audio_devin->core_audio_client == (GObject *) core_audio_client){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } if(core_audio_devin->core_audio_client != NULL){ g_object_unref(G_OBJECT(core_audio_devin->core_audio_client)); } if(core_audio_client != NULL){ g_object_ref(core_audio_client); } core_audio_devin->core_audio_client = (GObject *) core_audio_client; g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_CORE_AUDIO_PORT: { AgsCoreAudioPort *core_audio_port; core_audio_port = (AgsCoreAudioPort *) g_value_get_pointer(value); g_rec_mutex_lock(core_audio_devin_mutex); if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port) || g_list_find(core_audio_devin->core_audio_port, core_audio_port) != NULL){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } g_object_ref(core_audio_port); core_audio_devin->core_audio_port = g_list_append(core_audio_devin->core_audio_port, core_audio_port); g_rec_mutex_unlock(core_audio_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_devin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(gobject); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_string(value, core_audio_devin->card_uri); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_uint(value, core_audio_devin->dsp_channels); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_uint(value, core_audio_devin->pcm_channels); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_uint(value, core_audio_devin->format); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_uint(value, core_audio_devin->buffer_size); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_uint(value, core_audio_devin->samplerate); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_pointer(value, core_audio_devin->buffer); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_double(value, core_audio_devin->bpm); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_double(value, core_audio_devin->delay_factor); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_pointer(value, core_audio_devin->attack); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_CORE_AUDIO_CLIENT: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_object(value, core_audio_devin->core_audio_client); g_rec_mutex_unlock(core_audio_devin_mutex); } break; case PROP_CORE_AUDIO_PORT: { g_rec_mutex_lock(core_audio_devin_mutex); g_value_set_pointer(value, g_list_copy_deep(core_audio_devin->core_audio_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(core_audio_devin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_devin_dispose(GObject *gobject) { AgsCoreAudioDevin *core_audio_devin; GList *list; core_audio_devin = AGS_CORE_AUDIO_DEVIN(gobject); //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_core_audio_devin_parent_class)->dispose(gobject); } void ags_core_audio_devin_finalize(GObject *gobject) { AgsCoreAudioDevin *core_audio_devin; core_audio_devin = AGS_CORE_AUDIO_DEVIN(gobject); //TODO:JK: implement me /* call parent */ G_OBJECT_CLASS(ags_core_audio_devin_parent_class)->finalize(gobject); } /** * ags_core_audio_devin_test_flags: * @core_audio_devin: the #AgsCoreAudioDevin * @flags: the flags * * Test @flags to be set on @core_audio_devin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_core_audio_devin_test_flags(AgsCoreAudioDevin *core_audio_devin, guint flags) { gboolean retval; GRecMutex *core_audio_devin_mutex; if(!AGS_IS_CORE_AUDIO_DEVIN(core_audio_devin)){ return(FALSE); } /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* test */ g_rec_mutex_lock(core_audio_devin_mutex); retval = (flags & (core_audio_devin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_devin_mutex); return(retval); } /** * ags_core_audio_devin_set_flags: * @core_audio_devin: the #AgsCoreAudioDevin * @flags: see #AgsCoreAudioDevinFlags-enum * * Enable a feature of @core_audio_devin. * * Since: 3.0.0 */ void ags_core_audio_devin_set_flags(AgsCoreAudioDevin *core_audio_devin, guint flags) { GRecMutex *core_audio_devin_mutex; if(!AGS_IS_CORE_AUDIO_DEVIN(core_audio_devin)){ return; } /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->flags |= flags; g_rec_mutex_unlock(core_audio_devin_mutex); } /** * ags_core_audio_devin_unset_flags: * @core_audio_devin: the #AgsCoreAudioDevin * @flags: see #AgsCoreAudioDevinFlags-enum * * Disable a feature of @core_audio_devin. * * Since: 3.0.0 */ void ags_core_audio_devin_unset_flags(AgsCoreAudioDevin *core_audio_devin, guint flags) { GRecMutex *core_audio_devin_mutex; if(!AGS_IS_CORE_AUDIO_DEVIN(core_audio_devin)){ return; } /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->flags &= (~flags); g_rec_mutex_unlock(core_audio_devin_mutex); } void ags_core_audio_devin_set_device(AgsSoundcard *soundcard, gchar *device) { AgsCoreAudioDevin *core_audio_devin; GList *core_audio_port, *core_audio_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* check device */ g_rec_mutex_lock(core_audio_devin_mutex); if(core_audio_devin->card_uri == device || !g_ascii_strcasecmp(core_audio_devin->card_uri, device)){ g_rec_mutex_unlock(core_audio_devin_mutex); return; } if(!g_str_has_prefix(device, "ags-core-audio-devin-")){ g_rec_mutex_unlock(core_audio_devin_mutex); g_warning("invalid CoreAudio device prefix"); return; } ret = sscanf(device, "ags-core-audio-devin-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(core_audio_devin_mutex); g_warning("invalid CoreAudio device specifier"); return; } g_free(core_audio_devin->card_uri); core_audio_devin->card_uri = g_strdup(device); /* apply name to port */ pcm_channels = core_audio_devin->pcm_channels; core_audio_port_start = core_audio_port = g_list_copy(core_audio_devin->core_audio_port); g_rec_mutex_unlock(core_audio_devin_mutex); for(i = 0; i < pcm_channels && core_audio_port != NULL; i++){ str = g_strdup_printf("ags-soundcard%d-%04d", nth_card, i); g_object_set(core_audio_port->data, "port-name", str, NULL); g_free(str); core_audio_port = core_audio_port->next; } g_list_free(core_audio_port_start); } gchar* ags_core_audio_devin_get_device(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gchar *device; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); device = NULL; /* get device */ g_rec_mutex_lock(core_audio_devin_mutex); device = g_strdup(core_audio_devin->card_uri); g_rec_mutex_unlock(core_audio_devin_mutex); return(device); } void ags_core_audio_devin_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsCoreAudioDevin *core_audio_devin; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); g_object_set(core_audio_devin, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_core_audio_devin_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get presets */ g_rec_mutex_lock(core_audio_devin_mutex); if(channels != NULL){ *channels = core_audio_devin->pcm_channels; } if(rate != NULL){ *rate = core_audio_devin->samplerate; } if(buffer_size != NULL){ *buffer_size = core_audio_devin->buffer_size; } if(format != NULL){ *format = core_audio_devin->format; } g_rec_mutex_unlock(core_audio_devin_mutex); } /** * ags_core_audio_devin_list_cards: * @soundcard: the #AgsSoundcard * @card_id: CORE_AUDIO identifier * @card_name: card name * * List available soundcards. * * Since: 3.0.0 */ void ags_core_audio_devin_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsCoreAudioClient *core_audio_client; AgsCoreAudioDevin *core_audio_devin; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_CORE_AUDIO_DEVIN(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_CORE_AUDIO_DEVIN(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_core_audio_devin_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "core_audio-client", &core_audio_client, NULL); if(core_audio_client != NULL){ /* get client name */ g_object_get(core_audio_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(core_audio_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_core_audio_devin_list_cards() - CORE_AUDIO client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_core_audio_devin_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_core_audio_devin_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_CAPTURE); } gboolean ags_core_audio_devin_is_starting(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gboolean is_starting; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* check is starting */ g_rec_mutex_lock(core_audio_devin_mutex); is_starting = ((AGS_CORE_AUDIO_DEVIN_START_RECORD & (core_audio_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_devin_mutex); return(is_starting); } gboolean ags_core_audio_devin_is_recording(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gboolean is_playing; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* check is starting */ g_rec_mutex_lock(core_audio_devin_mutex); is_playing = ((AGS_CORE_AUDIO_DEVIN_RECORD & (core_audio_devin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_devin_mutex); return(is_playing); } gchar* ags_core_audio_devin_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_core_audio_devin_port_init(AgsSoundcard *soundcard, GError **error) { AgsCoreAudioDevin *core_audio_devin; guint format, word_size; GRecMutex *core_audio_devin_mutex; if(ags_soundcard_is_recording(soundcard)){ return; } core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core-audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* retrieve word size */ g_rec_mutex_lock(core_audio_devin_mutex); switch(core_audio_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(core_audio_devin_mutex); g_warning("ags_core_audio_devin_port_init(): unsupported word size"); return; } /* prepare for playback */ core_audio_devin->flags |= (AGS_CORE_AUDIO_DEVIN_BUFFER7 | AGS_CORE_AUDIO_DEVIN_START_RECORD | AGS_CORE_AUDIO_DEVIN_RECORD | AGS_CORE_AUDIO_DEVIN_NONBLOCKING); memset(core_audio_devin->buffer[0], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[1], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[2], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[3], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[4], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[5], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[6], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[7], 0, core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); /* */ core_audio_devin->tact_counter = 0.0; core_audio_devin->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(core_audio_devin))); core_audio_devin->tic_counter = 0; core_audio_devin->flags |= (AGS_CORE_AUDIO_DEVIN_INITIALIZED | AGS_CORE_AUDIO_DEVIN_START_RECORD | AGS_CORE_AUDIO_DEVIN_RECORD); g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK); g_rec_mutex_unlock(core_audio_devin_mutex); } void ags_core_audio_devin_port_record(AgsSoundcard *soundcard, GError **error) { AgsCoreAudioClient *core_audio_client; AgsCoreAudioDevin *core_audio_devin; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean core_audio_client_activated; GRecMutex *core_audio_devin_mutex; GRecMutex *core_audio_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); application_context = ags_application_context_get_instance(); /* get core-audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* client */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_client = (AgsCoreAudioClient *) core_audio_devin->core_audio_client; callback_mutex = &(core_audio_devin->callback_mutex); callback_finish_mutex = &(core_audio_devin->callback_finish_mutex); /* do playback */ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_START_RECORD); switch(core_audio_devin->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(core_audio_devin_mutex); g_warning("ags_core_audio_devin_port_record(): unsupported word size"); return; } g_rec_mutex_unlock(core_audio_devin_mutex); /* get client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* get activated */ g_rec_mutex_lock(core_audio_client_mutex); core_audio_client_activated = ((AGS_CORE_AUDIO_CLIENT_ACTIVATED & (core_audio_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_client_mutex); if(core_audio_client_activated){ while((AGS_CORE_AUDIO_DEVIN_PASS_THROUGH & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ usleep(4); } /* signal */ if((AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE); if((AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devin->callback_cond)); } g_mutex_unlock(callback_mutex); // } /* wait callback */ g_mutex_lock(callback_finish_mutex); if((AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) == 0){ g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT); while((AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) == 0 && (AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ g_cond_wait(&(core_audio_devin->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(core_audio_devin->sync_flags), (~(AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT | AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(core_audio_devin->sync_flags), (~AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK)); } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) core_audio_devin); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) core_audio_devin); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) core_audio_devin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_core_audio_devin_port_free(AgsSoundcard *soundcard) { AgsCoreAudioPort *core_audio_port; AgsCoreAudioDevin *core_audio_devin; guint word_size; GRecMutex *core_audio_devin_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core-audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* */ g_rec_mutex_lock(core_audio_devin_mutex); callback_mutex = &(core_audio_devin->callback_mutex); callback_finish_mutex = &(core_audio_devin->callback_finish_mutex); // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); core_audio_devin->flags &= (~(AGS_CORE_AUDIO_DEVIN_BUFFER0 | AGS_CORE_AUDIO_DEVIN_BUFFER1 | AGS_CORE_AUDIO_DEVIN_BUFFER2 | AGS_CORE_AUDIO_DEVIN_BUFFER3 | AGS_CORE_AUDIO_DEVIN_BUFFER4 | AGS_CORE_AUDIO_DEVIN_BUFFER5 | AGS_CORE_AUDIO_DEVIN_BUFFER6 | AGS_CORE_AUDIO_DEVIN_BUFFER7 | AGS_CORE_AUDIO_DEVIN_RECORD)); g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_PASS_THROUGH); g_atomic_int_and(&(core_audio_devin->sync_flags), (~AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK)); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE); if((AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devin->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE); if((AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ core_audio_devin->note_offset = core_audio_devin->start_note_offset; core_audio_devin->note_offset_absolute = core_audio_devin->start_note_offset; switch(core_audio_devin->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_core_audio_devin_free(): unsupported word size"); } g_rec_mutex_unlock(core_audio_devin_mutex); if(core_audio_devin->core_audio_port != NULL){ core_audio_port = core_audio_devin->core_audio_port->data; while(!g_atomic_int_get(&(core_audio_port->is_empty))) usleep(500000); } g_rec_mutex_lock(core_audio_devin_mutex); memset(core_audio_devin->buffer[0], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[1], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[2], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[3], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[4], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[5], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[6], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); memset(core_audio_devin->buffer[7], 0, (size_t) core_audio_devin->pcm_channels * core_audio_devin->buffer_size * word_size); g_rec_mutex_unlock(core_audio_devin_mutex); } void ags_core_audio_devin_tic(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* determine if attack should be switched */ g_rec_mutex_lock(core_audio_devin_mutex); delay = core_audio_devin->delay[core_audio_devin->tic_counter]; delay_counter = core_audio_devin->delay_counter; note_offset = core_audio_devin->note_offset; note_offset_absolute = core_audio_devin->note_offset_absolute; loop_left = core_audio_devin->loop_left; loop_right = core_audio_devin->loop_right; do_loop = core_audio_devin->do_loop; g_rec_mutex_unlock(core_audio_devin_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->delay_counter = delay_counter + 1.0 - delay; core_audio_devin->tact_counter += 1.0; g_rec_mutex_unlock(core_audio_devin_mutex); }else{ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->delay_counter += 1.0; g_rec_mutex_unlock(core_audio_devin_mutex); } } void ags_core_audio_devin_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* offset changed */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->tic_counter += 1; if(core_audio_devin->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ core_audio_devin->tic_counter = 0; } g_rec_mutex_unlock(core_audio_devin_mutex); } void ags_core_audio_devin_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set bpm */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->bpm = bpm; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); } gdouble ags_core_audio_devin_get_bpm(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gdouble bpm; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get bpm */ g_rec_mutex_lock(core_audio_devin_mutex); bpm = core_audio_devin->bpm; g_rec_mutex_unlock(core_audio_devin_mutex); return(bpm); } void ags_core_audio_devin_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set delay factor */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->delay_factor = delay_factor; g_rec_mutex_unlock(core_audio_devin_mutex); ags_core_audio_devin_adjust_delay_and_attack(core_audio_devin); } gdouble ags_core_audio_devin_get_delay_factor(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gdouble delay_factor; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get delay factor */ g_rec_mutex_lock(core_audio_devin_mutex); delay_factor = core_audio_devin->delay_factor; g_rec_mutex_unlock(core_audio_devin_mutex); return(delay_factor); } gdouble ags_core_audio_devin_get_delay(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint delay_index; gdouble delay; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get delay */ g_rec_mutex_lock(core_audio_devin_mutex); delay_index = core_audio_devin->tic_counter; delay = core_audio_devin->delay[delay_index]; g_rec_mutex_unlock(core_audio_devin_mutex); return(delay); } gdouble ags_core_audio_devin_get_absolute_delay(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; gdouble absolute_delay; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get absolute delay */ g_rec_mutex_lock(core_audio_devin_mutex); absolute_delay = (60.0 * (((gdouble) core_audio_devin->samplerate / (gdouble) core_audio_devin->buffer_size) / (gdouble) core_audio_devin->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) core_audio_devin->delay_factor))); g_rec_mutex_unlock(core_audio_devin_mutex); return(absolute_delay); } guint ags_core_audio_devin_get_attack(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint attack_index; guint attack; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get attack */ g_rec_mutex_lock(core_audio_devin_mutex); attack_index = core_audio_devin->tic_counter; attack = core_audio_devin->attack[attack_index]; g_rec_mutex_unlock(core_audio_devin_mutex); return(attack); } void* ags_core_audio_devin_get_buffer(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; void *buffer; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER0)){ buffer = core_audio_devin->buffer[0]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER1)){ buffer = core_audio_devin->buffer[1]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER2)){ buffer = core_audio_devin->buffer[2]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER3)){ buffer = core_audio_devin->buffer[3]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER4)){ buffer = core_audio_devin->buffer[4]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER5)){ buffer = core_audio_devin->buffer[5]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER6)){ buffer = core_audio_devin->buffer[6]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER7)){ buffer = core_audio_devin->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_core_audio_devin_get_next_buffer(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; void *buffer; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); // g_message("next - 0x%0x", ((AGS_CORE_AUDIO_DEVIN_BUFFER0 | // AGS_CORE_AUDIO_DEVIN_BUFFER1 | // AGS_CORE_AUDIO_DEVIN_BUFFER2 | // AGS_CORE_AUDIO_DEVIN_BUFFER3) & (core_audio_devin->flags))); if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER0)){ buffer = core_audio_devin->buffer[1]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER1)){ buffer = core_audio_devin->buffer[2]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER2)){ buffer = core_audio_devin->buffer[3]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER3)){ buffer = core_audio_devin->buffer[4]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER4)){ buffer = core_audio_devin->buffer[5]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER5)){ buffer = core_audio_devin->buffer[6]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER6)){ buffer = core_audio_devin->buffer[7]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER7)){ buffer = core_audio_devin->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_core_audio_devin_get_prev_buffer(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; void *buffer; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER0)){ buffer = core_audio_devin->buffer[7]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER1)){ buffer = core_audio_devin->buffer[0]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER2)){ buffer = core_audio_devin->buffer[1]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER3)){ buffer = core_audio_devin->buffer[2]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER4)){ buffer = core_audio_devin->buffer[3]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER5)){ buffer = core_audio_devin->buffer[4]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER6)){ buffer = core_audio_devin->buffer[5]; }else if(ags_core_audio_devin_test_flags(core_audio_devin, AGS_CORE_AUDIO_DEVIN_BUFFER7)){ buffer = core_audio_devin->buffer[6]; }else{ buffer = NULL; } return(buffer); } void ags_core_audio_devin_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *buffer_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); buffer_mutex = NULL; if(core_audio_devin->buffer != NULL){ if(buffer == core_audio_devin->buffer[0]){ buffer_mutex = core_audio_devin->buffer_mutex[0]; }else if(buffer == core_audio_devin->buffer[1]){ buffer_mutex = core_audio_devin->buffer_mutex[1]; }else if(buffer == core_audio_devin->buffer[2]){ buffer_mutex = core_audio_devin->buffer_mutex[2]; }else if(buffer == core_audio_devin->buffer[3]){ buffer_mutex = core_audio_devin->buffer_mutex[3]; }else if(buffer == core_audio_devin->buffer[4]){ buffer_mutex = core_audio_devin->buffer_mutex[4]; }else if(buffer == core_audio_devin->buffer[5]){ buffer_mutex = core_audio_devin->buffer_mutex[5]; }else if(buffer == core_audio_devin->buffer[6]){ buffer_mutex = core_audio_devin->buffer_mutex[6]; }else if(buffer == core_audio_devin->buffer[7]){ buffer_mutex = core_audio_devin->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_core_audio_devin_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *buffer_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); buffer_mutex = NULL; if(core_audio_devin->buffer != NULL){ if(buffer == core_audio_devin->buffer[0]){ buffer_mutex = core_audio_devin->buffer_mutex[0]; }else if(buffer == core_audio_devin->buffer[1]){ buffer_mutex = core_audio_devin->buffer_mutex[1]; }else if(buffer == core_audio_devin->buffer[2]){ buffer_mutex = core_audio_devin->buffer_mutex[2]; }else if(buffer == core_audio_devin->buffer[3]){ buffer_mutex = core_audio_devin->buffer_mutex[3]; }else if(buffer == core_audio_devin->buffer[4]){ buffer_mutex = core_audio_devin->buffer_mutex[4]; }else if(buffer == core_audio_devin->buffer[5]){ buffer_mutex = core_audio_devin->buffer_mutex[5]; }else if(buffer == core_audio_devin->buffer[6]){ buffer_mutex = core_audio_devin->buffer_mutex[6]; }else if(buffer == core_audio_devin->buffer[7]){ buffer_mutex = core_audio_devin->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_core_audio_devin_get_delay_counter(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint delay_counter; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* delay counter */ g_rec_mutex_lock(core_audio_devin_mutex); delay_counter = core_audio_devin->delay_counter; g_rec_mutex_unlock(core_audio_devin_mutex); return(delay_counter); } void ags_core_audio_devin_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set note offset */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->note_offset = note_offset; g_rec_mutex_unlock(core_audio_devin_mutex); } guint ags_core_audio_devin_get_start_note_offset(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint start_note_offset; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set note offset */ g_rec_mutex_lock(core_audio_devin_mutex); start_note_offset = core_audio_devin->start_note_offset; g_rec_mutex_unlock(core_audio_devin_mutex); return(start_note_offset); } void ags_core_audio_devin_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set note offset */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->start_note_offset = start_note_offset; g_rec_mutex_unlock(core_audio_devin_mutex); } guint ags_core_audio_devin_get_note_offset(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint note_offset; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set note offset */ g_rec_mutex_lock(core_audio_devin_mutex); note_offset = core_audio_devin->note_offset; g_rec_mutex_unlock(core_audio_devin_mutex); return(note_offset); } void ags_core_audio_devin_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set note offset */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(core_audio_devin_mutex); } guint ags_core_audio_devin_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint note_offset_absolute; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set note offset */ g_rec_mutex_lock(core_audio_devin_mutex); note_offset_absolute = core_audio_devin->note_offset_absolute; g_rec_mutex_unlock(core_audio_devin_mutex); return(note_offset_absolute); } void ags_core_audio_devin_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* set loop */ g_rec_mutex_lock(core_audio_devin_mutex); core_audio_devin->loop_left = loop_left; core_audio_devin->loop_right = loop_right; core_audio_devin->do_loop = do_loop; if(do_loop){ core_audio_devin->loop_offset = core_audio_devin->note_offset; } g_rec_mutex_unlock(core_audio_devin_mutex); } void ags_core_audio_devin_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsCoreAudioDevin *core_audio_devin; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get loop */ g_rec_mutex_lock(core_audio_devin_mutex); if(loop_left != NULL){ *loop_left = core_audio_devin->loop_left; } if(loop_right != NULL){ *loop_right = core_audio_devin->loop_right; } if(do_loop != NULL){ *do_loop = core_audio_devin->do_loop; } g_rec_mutex_unlock(core_audio_devin_mutex); } guint ags_core_audio_devin_get_loop_offset(AgsSoundcard *soundcard) { AgsCoreAudioDevin *core_audio_devin; guint loop_offset; GRecMutex *core_audio_devin_mutex; core_audio_devin = AGS_CORE_AUDIO_DEVIN(soundcard); /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get loop offset */ g_rec_mutex_lock(core_audio_devin_mutex); loop_offset = core_audio_devin->loop_offset; g_rec_mutex_unlock(core_audio_devin_mutex); return(loop_offset); } /** * ags_core_audio_devin_switch_buffer_flag: * @core_audio_devin: an #AgsCoreAudioDevin * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_core_audio_devin_switch_buffer_flag(AgsCoreAudioDevin *core_audio_devin) { GRecMutex *core_audio_devin_mutex; if(!AGS_IS_CORE_AUDIO_DEVIN(core_audio_devin)){ return; } /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* switch buffer flag */ g_rec_mutex_lock(core_audio_devin_mutex); if((AGS_CORE_AUDIO_DEVIN_BUFFER0 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER0); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER1; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER1 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER1); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER2; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER2 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER2); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER3; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER3 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER3); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER4; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER4 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER4); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER5; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER5 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER5); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER6; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER6 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER6); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER7; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER7 & (core_audio_devin->flags)) != 0){ core_audio_devin->flags &= (~AGS_CORE_AUDIO_DEVIN_BUFFER7); core_audio_devin->flags |= AGS_CORE_AUDIO_DEVIN_BUFFER0; } g_rec_mutex_unlock(core_audio_devin_mutex); } /** * ags_core_audio_devin_adjust_delay_and_attack: * @core_audio_devin: the #AgsCoreAudioDevin * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_core_audio_devin_adjust_delay_and_attack(AgsCoreAudioDevin *core_audio_devin) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *core_audio_devin_mutex; if(!AGS_IS_CORE_AUDIO_DEVIN(core_audio_devin)){ return; } /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get some initial values */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(core_audio_devin)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(core_audio_devin_mutex); default_tact_frames = (guint) (delay * core_audio_devin->buffer_size); delay_tact_frames = (guint) (floor(delay) * core_audio_devin->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; core_audio_devin->attack[0] = (guint) floor(0.25 * core_audio_devin->buffer_size); next_attack = (((core_audio_devin->attack[i] + default_tact_frames) / core_audio_devin->buffer_size) - delay) * core_audio_devin->buffer_size; if(next_attack < 0){ next_attack = 0; } if(next_attack >= core_audio_devin->buffer_size){ next_attack = core_audio_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ core_audio_devin->attack[i] = core_audio_devin->attack[i] - ((gdouble) next_attack / 2.0); if(core_audio_devin->attack[i] < 0){ core_audio_devin->attack[i] = 0; } if(core_audio_devin->attack[i] >= core_audio_devin->buffer_size){ core_audio_devin->attack[i] = core_audio_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= core_audio_devin->buffer_size){ next_attack = core_audio_devin->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ core_audio_devin->attack[i] = next_attack; next_attack = (((core_audio_devin->attack[i] + default_tact_frames) / core_audio_devin->buffer_size) - delay) * core_audio_devin->buffer_size; if(next_attack >= core_audio_devin->buffer_size){ next_attack = core_audio_devin->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ core_audio_devin->attack[i] = core_audio_devin->attack[i] - ((gdouble) next_attack / 2.0); if(core_audio_devin->attack[i] < 0){ core_audio_devin->attack[i] = 0; } if(core_audio_devin->attack[i] >= core_audio_devin->buffer_size){ core_audio_devin->attack[i] = core_audio_devin->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= core_audio_devin->buffer_size){ next_attack = core_audio_devin->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", core_audio_devin->attack[i]); #endif } core_audio_devin->attack[0] = core_audio_devin->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ core_audio_devin->delay[i] = ((gdouble) (default_tact_frames + core_audio_devin->attack[i] - core_audio_devin->attack[i + 1])) / (gdouble) core_audio_devin->buffer_size; #ifdef AGS_DEBUG g_message("%f", core_audio_devin->delay[i]); #endif } core_audio_devin->delay[i] = ((gdouble) (default_tact_frames + core_audio_devin->attack[i] - core_audio_devin->attack[0])) / (gdouble) core_audio_devin->buffer_size; g_rec_mutex_unlock(core_audio_devin_mutex); } /** * ags_core_audio_devin_realloc_buffer: * @core_audio_devin: the #AgsCoreAudioDevin * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_core_audio_devin_realloc_buffer(AgsCoreAudioDevin *core_audio_devin) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *core_audio_devin_mutex; if(!AGS_IS_CORE_AUDIO_DEVIN(core_audio_devin)){ return; } /* get core_audio devin mutex */ core_audio_devin_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* get word size */ g_rec_mutex_lock(core_audio_devin_mutex); pcm_channels = core_audio_devin->pcm_channels; buffer_size = core_audio_devin->buffer_size; format = core_audio_devin->format; g_rec_mutex_unlock(core_audio_devin_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_core_audio_devin_realloc_buffer(): unsupported word size"); return; } /* AGS_CORE_AUDIO_DEVIN_BUFFER_0 */ if(core_audio_devin->buffer[0] != NULL){ free(core_audio_devin->buffer[0]); } core_audio_devin->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_1 */ if(core_audio_devin->buffer[1] != NULL){ free(core_audio_devin->buffer[1]); } core_audio_devin->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_2 */ if(core_audio_devin->buffer[2] != NULL){ free(core_audio_devin->buffer[2]); } core_audio_devin->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_3 */ if(core_audio_devin->buffer[3] != NULL){ free(core_audio_devin->buffer[3]); } core_audio_devin->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_4 */ if(core_audio_devin->buffer[4] != NULL){ free(core_audio_devin->buffer[4]); } core_audio_devin->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_5 */ if(core_audio_devin->buffer[5] != NULL){ free(core_audio_devin->buffer[5]); } core_audio_devin->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_6 */ if(core_audio_devin->buffer[6] != NULL){ free(core_audio_devin->buffer[6]); } core_audio_devin->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVIN_BUFFER_7 */ if(core_audio_devin->buffer[7] != NULL){ free(core_audio_devin->buffer[7]); } core_audio_devin->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_core_audio_devin_new: * * Creates a new instance of #AgsCoreAudioDevin. * * Returns: a new #AgsCoreAudioDevin * * Since: 3.0.0 */ AgsCoreAudioDevin* ags_core_audio_devin_new() { AgsCoreAudioDevin *core_audio_devin; core_audio_devin = (AgsCoreAudioDevin *) g_object_new(AGS_TYPE_CORE_AUDIO_DEVIN, NULL); return(core_audio_devin); } gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_client.c0000644000175000017500000007431513613101164021155 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_core_audio_client_class_init(AgsCoreAudioClientClass *core_audio_client); void ags_core_audio_client_connectable_interface_init(AgsConnectableInterface *connectable); void ags_core_audio_client_init(AgsCoreAudioClient *core_audio_client); void ags_core_audio_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_core_audio_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_core_audio_client_dispose(GObject *gobject); void ags_core_audio_client_finalize(GObject *gobject); AgsUUID* ags_core_audio_client_get_uuid(AgsConnectable *connectable); gboolean ags_core_audio_client_has_resource(AgsConnectable *connectable); gboolean ags_core_audio_client_is_ready(AgsConnectable *connectable); void ags_core_audio_client_add_to_registry(AgsConnectable *connectable); void ags_core_audio_client_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_core_audio_client_list_resource(AgsConnectable *connectable); xmlNode* ags_core_audio_client_xml_compose(AgsConnectable *connectable); void ags_core_audio_client_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_core_audio_client_is_connected(AgsConnectable *connectable); void ags_core_audio_client_connect(AgsConnectable *connectable); void ags_core_audio_client_disconnect(AgsConnectable *connectable); /** * SECTION:ags_core_audio_client * @short_description: core audio connection * @title: AgsCoreAudioClient * @section_id: * @include: ags/audio/core-audio/ags_core_audio_client.h * * The #AgsCoreAudioClient communicates with a core audio instance. */ enum{ PROP_0, PROP_CORE_AUDIO_SERVER, PROP_CLIENT_NAME, PROP_DEVICE, PROP_PORT, }; static gpointer ags_core_audio_client_parent_class = NULL; GType ags_core_audio_client_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_core_audio_client = 0; static const GTypeInfo ags_core_audio_client_info = { sizeof(AgsCoreAudioClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_core_audio_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCoreAudioClient), 0, /* n_preallocs */ (GInstanceInitFunc) ags_core_audio_client_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_core_audio_client_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_core_audio_client = g_type_register_static(G_TYPE_OBJECT, "AgsCoreAudioClient", &ags_core_audio_client_info, 0); g_type_add_interface_static(ags_type_core_audio_client, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_core_audio_client); } return g_define_type_id__volatile; } void ags_core_audio_client_class_init(AgsCoreAudioClientClass *core_audio_client) { GObjectClass *gobject; GParamSpec *param_spec; ags_core_audio_client_parent_class = g_type_class_peek_parent(core_audio_client); /* GObjectClass */ gobject = (GObjectClass *) core_audio_client; gobject->set_property = ags_core_audio_client_set_property; gobject->get_property = ags_core_audio_client_get_property; gobject->dispose = ags_core_audio_client_dispose; gobject->finalize = ags_core_audio_client_finalize; /* properties */ /** * AgsCoreAudioClient:core-audio-server: * * The assigned #AgsCoreAudioServer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-server", i18n_pspec("assigned core audio server"), i18n_pspec("The assigned core audio server"), AGS_TYPE_CORE_AUDIO_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_SERVER, param_spec); /** * AgsCoreAudioClient:client-name: * * The core-audio client name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("client-name", i18n_pspec("the client name"), i18n_pspec("The client name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CLIENT_NAME, param_spec); /** * AgsCoreAudioClient:device: (type GList(GObject)) (transfer full) * * The assigned devices. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("device", i18n_pspec("assigned device"), i18n_pspec("The assigned device"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsCoreAudioClient:port: (type GList(AgsCoreAudioPort)) (transfer full) * * The assigned ports. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port", i18n_pspec("assigned port"), i18n_pspec("The assigned port"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT, param_spec); } void ags_core_audio_client_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_core_audio_client_get_uuid; connectable->has_resource = ags_core_audio_client_has_resource; connectable->is_ready = ags_core_audio_client_is_ready; connectable->add_to_registry = ags_core_audio_client_add_to_registry; connectable->remove_from_registry = ags_core_audio_client_remove_from_registry; connectable->list_resource = ags_core_audio_client_list_resource; connectable->xml_compose = ags_core_audio_client_xml_compose; connectable->xml_parse = ags_core_audio_client_xml_parse; connectable->is_connected = ags_core_audio_client_is_connected; connectable->connect = ags_core_audio_client_connect; connectable->disconnect = ags_core_audio_client_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_core_audio_client_init(AgsCoreAudioClient *core_audio_client) { /* flags */ core_audio_client->flags = 0; /* core audio client mutex */ g_rec_mutex_init(&(core_audio_client->obj_mutex)); /* server */ core_audio_client->core_audio_server = NULL; /* uuid */ core_audio_client->uuid = ags_uuid_alloc(); ags_uuid_generate(core_audio_client->uuid); /* client name and uuid */ core_audio_client->client_uuid = ags_id_generator_create_uuid(); core_audio_client->client_name = NULL; /* client */ core_audio_client->graph = NULL; /* device */ core_audio_client->device = NULL; core_audio_client->port = NULL; } void ags_core_audio_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCoreAudioClient *core_audio_client; GRecMutex *core_audio_client_mutex; core_audio_client = AGS_CORE_AUDIO_CLIENT(gobject); /* get core-audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); switch(prop_id){ case PROP_CORE_AUDIO_SERVER: { AgsCoreAudioServer *core_audio_server; core_audio_server = (AgsCoreAudioServer *) g_value_get_object(value); g_rec_mutex_lock(core_audio_client_mutex); if(core_audio_client->core_audio_server == (GObject *) core_audio_server){ g_rec_mutex_unlock(core_audio_client_mutex); return; } if(core_audio_client->core_audio_server != NULL){ g_object_unref(core_audio_client->core_audio_server); } if(core_audio_server != NULL){ g_object_ref(core_audio_server); } core_audio_client->core_audio_server = (GObject *) core_audio_server; g_rec_mutex_unlock(core_audio_client_mutex); } break; case PROP_CLIENT_NAME: { char *client_name; client_name = (char *) g_value_get_string(value); g_rec_mutex_lock(core_audio_client_mutex); g_free(core_audio_client->client_name); core_audio_client->client_name = g_strdup(client_name); g_rec_mutex_unlock(core_audio_client_mutex); } break; case PROP_DEVICE: { GObject *device; device = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(core_audio_client_mutex); if(device == NULL || g_list_find(core_audio_client->device, device) != NULL){ g_rec_mutex_unlock(core_audio_client_mutex); return; } g_object_ref(device); core_audio_client->device = g_list_prepend(core_audio_client->device, device); g_rec_mutex_unlock(core_audio_client_mutex); } break; case PROP_PORT: { GObject *port; port = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(core_audio_client_mutex); if(!AGS_IS_CORE_AUDIO_PORT(port) || g_list_find(core_audio_client->port, port) != NULL){ g_rec_mutex_unlock(core_audio_client_mutex); return; } g_object_ref(port); core_audio_client->port = g_list_prepend(core_audio_client->port, port); g_rec_mutex_unlock(core_audio_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCoreAudioClient *core_audio_client; GRecMutex *core_audio_client_mutex; core_audio_client = AGS_CORE_AUDIO_CLIENT(gobject); /* get core-audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); switch(prop_id){ case PROP_CORE_AUDIO_SERVER: { g_rec_mutex_lock(core_audio_client_mutex); g_value_set_object(value, core_audio_client->core_audio_server); g_rec_mutex_unlock(core_audio_client_mutex); } break; case PROP_CLIENT_NAME: { g_rec_mutex_lock(core_audio_client_mutex); g_value_set_string(value, core_audio_client->client_name); g_rec_mutex_unlock(core_audio_client_mutex); } break; case PROP_DEVICE: { g_rec_mutex_lock(core_audio_client_mutex); g_value_set_pointer(value, g_list_copy_deep(core_audio_client->device, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(core_audio_client_mutex); } break; case PROP_PORT: { g_rec_mutex_lock(core_audio_client_mutex); g_value_set_pointer(value, g_list_copy_deep(core_audio_client->port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(core_audio_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_client_dispose(GObject *gobject) { AgsCoreAudioClient *core_audio_client; GList *list; core_audio_client = AGS_CORE_AUDIO_CLIENT(gobject); /* core audio server */ if(core_audio_client->core_audio_server != NULL){ g_object_unref(core_audio_client->core_audio_server); core_audio_client->core_audio_server = NULL; } /* device */ if(core_audio_client->device != NULL){ list = core_audio_client->device; while(list != NULL){ g_object_set(G_OBJECT(list->data), "core-audio-client", NULL, NULL); list = list->next; } g_list_free_full(core_audio_client->device, g_object_unref); core_audio_client->device = NULL; } /* port */ if(core_audio_client->port != NULL){ list = core_audio_client->port; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(core_audio_client->port, g_object_unref); core_audio_client->port = NULL; } /* call parent */ G_OBJECT_CLASS(ags_core_audio_client_parent_class)->dispose(gobject); } void ags_core_audio_client_finalize(GObject *gobject) { AgsCoreAudioClient *core_audio_client; core_audio_client = AGS_CORE_AUDIO_CLIENT(gobject); /* core audio server */ if(core_audio_client->core_audio_server != NULL){ g_object_unref(core_audio_client->core_audio_server); } /* core audio graph */ if(core_audio_client->graph != NULL){ free(core_audio_client->graph); } /* device */ if(core_audio_client->device != NULL){ g_list_free_full(core_audio_client->device, g_object_unref); } /* port */ if(core_audio_client->port != NULL){ g_list_free_full(core_audio_client->port, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_core_audio_client_parent_class)->finalize(gobject); } AgsUUID* ags_core_audio_client_get_uuid(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; AgsUUID *ptr; GRecMutex *core_audio_client_mutex; core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* get UUID */ g_rec_mutex_lock(core_audio_client_mutex); ptr = core_audio_client->uuid; g_rec_mutex_unlock(core_audio_client_mutex); return(ptr); } gboolean ags_core_audio_client_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_core_audio_client_is_ready(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; gboolean is_ready; core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); /* check is added */ is_ready = ags_core_audio_client_test_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_ADDED_TO_REGISTRY); return(is_ready); } void ags_core_audio_client_add_to_registry(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; if(ags_connectable_is_ready(connectable)){ return; } core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); ags_core_audio_client_set_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_ADDED_TO_REGISTRY); } void ags_core_audio_client_remove_from_registry(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; if(!ags_connectable_is_ready(connectable)){ return; } core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); ags_core_audio_client_unset_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_ADDED_TO_REGISTRY); } xmlNode* ags_core_audio_client_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_core_audio_client_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_core_audio_client_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_core_audio_client_is_connected(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; gboolean is_connected; core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); /* check is connected */ is_connected = ags_core_audio_client_test_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_CONNECTED); return(is_connected); } void ags_core_audio_client_connect(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; GList *list_start, *list; GRecMutex *core_audio_client_mutex; if(ags_connectable_is_connected(connectable)){ return; } core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); ags_core_audio_client_set_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_CONNECTED); /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* port */ g_rec_mutex_lock(core_audio_client_mutex); list = list_start = g_list_copy(core_audio_client->port); g_rec_mutex_unlock(core_audio_client_mutex); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_core_audio_client_disconnect(AgsConnectable *connectable) { AgsCoreAudioClient *core_audio_client; GList *list_start, *list; GRecMutex *core_audio_client_mutex; if(!ags_connectable_is_connected(connectable)){ return; } core_audio_client = AGS_CORE_AUDIO_CLIENT(connectable); ags_core_audio_client_unset_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_CONNECTED); /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* port */ g_rec_mutex_lock(core_audio_client_mutex); list = list_start = g_list_copy(core_audio_client->port); g_rec_mutex_unlock(core_audio_client_mutex); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_core_audio_client_test_flags: * @core_audio_client: the #AgsCoreAudioClient * @flags: the flags * * Test @flags to be set on @core_audio_client. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_core_audio_client_test_flags(AgsCoreAudioClient *core_audio_client, guint flags) { gboolean retval; GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return(FALSE); } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* test */ g_rec_mutex_lock(core_audio_client_mutex); retval = (flags & (core_audio_client->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_client_mutex); return(retval); } /** * ags_core_audio_client_set_flags: * @core_audio_client: the #AgsCoreAudioClient * @flags: see #AgsCoreAudioClientFlags-enum * * Enable a feature of @core_audio_client. * * Since: 3.0.0 */ void ags_core_audio_client_set_flags(AgsCoreAudioClient *core_audio_client, guint flags) { GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(core_audio_client_mutex); core_audio_client->flags |= flags; g_rec_mutex_unlock(core_audio_client_mutex); } /** * ags_core_audio_client_unset_flags: * @core_audio_client: the #AgsCoreAudioClient * @flags: see #AgsCoreAudioClientFlags-enum * * Disable a feature of @core_audio_client. * * Since: 3.0.0 */ void ags_core_audio_client_unset_flags(AgsCoreAudioClient *core_audio_client, guint flags) { GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(core_audio_client_mutex); core_audio_client->flags &= (~flags); g_rec_mutex_unlock(core_audio_client_mutex); } /** * ags_core_audio_client_find_uuid: * @core_audio_client: (element-type AgsAudio.CoreAudioClient) (transfer none): the #GList-struct containing #AgsCoreAudioClient * @client_uuid: the client uuid to find * * Finds next match of @client_uuid in @core_audio_client. * * Returns: (element-type AgsAudio.CoreAudioClient) (transfer none): a #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_core_audio_client_find_uuid(GList *core_audio_client, gchar *client_uuid) { while(core_audio_client != NULL){ if(AGS_CORE_AUDIO_CLIENT(core_audio_client->data)->graph != NULL && !g_ascii_strcasecmp(AGS_CORE_AUDIO_CLIENT(core_audio_client->data)->client_uuid, client_uuid)){ return(core_audio_client); } } return(NULL); } /** * ags_core_audio_client_find: * @core_audio_client: (element-type AgsAudio.CoreAudioClient) (transfer none): the #GList-struct containing #AgsCoreAudioClient * @client_name: the client name to find * * Finds next match of @client_name in @core_audio_client. * * Returns: (element-type AgsAudio.CoreAudioClient) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_core_audio_client_find(GList *core_audio_client, gchar *client_name) { AgsCoreAudioClient *current_core_audio_client; gboolean success; GRecMutex *core_audio_client_mutex; while(core_audio_client != NULL){ current_core_audio_client = AGS_CORE_AUDIO_CLIENT(core_audio_client->data); /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(current_core_audio_client); /* check uuid */ g_rec_mutex_lock(core_audio_client_mutex); success = (current_core_audio_client->graph != NULL && !g_ascii_strcasecmp(current_core_audio_client->client_name, client_name)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_client_mutex); if(success){ return(core_audio_client); } core_audio_client = core_audio_client->next; } return(NULL); } /** * ags_core_audio_client_open: * @core_audio_client: the #AgsCoreAudioClient * @client_name: the client's name * * Open the core audio client's connection and read uuid. * * Since: 3.0.0 */ void ags_core_audio_client_open(AgsCoreAudioClient *core_audio_client, gchar *client_name) { AgsCoreAudioServer *core_audio_server; #ifdef AGS_WITH_CORE_AUDIO OSStatus retval; #endif gboolean ready; GRecMutex *core_audio_server_mutex; GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client) || client_name == NULL){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* check already open */ g_rec_mutex_lock(core_audio_client_mutex); if(core_audio_client->graph != NULL){ g_rec_mutex_unlock(core_audio_client_mutex); g_message("Advanced Gtk+ Sequencer core-audio client already open"); return; } core_audio_server = core_audio_client->core_audio_server; g_rec_mutex_unlock(core_audio_client_mutex); g_message("Advanced Gtk+ Sequencer open core-audio client"); g_object_set(core_audio_client, "client-name", client_name, NULL); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); #ifdef AGS_WITH_CORE_AUDIO core_audio_client->graph = (AUGraph *) malloc(sizeof(AUGraph)); memset(core_audio_client->graph, 0, sizeof(AUGraph)); retval = NewAUGraph(core_audio_client->graph); if(retval != noErr){ free(core_audio_client->graph); core_audio_client->graph = NULL; } #endif } /** * ags_core_audio_client_activate: * @core_audio_client: the #AgsCoreAudioClient * * Activate client. * * Since: 3.0.0 */ void ags_core_audio_client_activate(AgsCoreAudioClient *core_audio_client) { #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif GList *port_start, *port; int ret; GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* get graph */ g_rec_mutex_lock(core_audio_client_mutex); graph = core_audio_client->graph; g_rec_mutex_unlock(core_audio_client_mutex); if(ags_core_audio_client_test_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_ACTIVATED) || graph == NULL){ return; } g_rec_mutex_lock(core_audio_client_mutex); port = port_start = g_list_copy(core_audio_client->port); g_rec_mutex_unlock(core_audio_client_mutex); while(port != NULL){ gchar *port_name; g_object_get(port->data, "port-name", &port_name, NULL); ags_core_audio_port_register(port->data, port_name, (ags_core_audio_port_test_flags(port->data, AGS_CORE_AUDIO_PORT_IS_AUDIO) ? TRUE: FALSE), (ags_core_audio_port_test_flags(port->data, AGS_CORE_AUDIO_PORT_IS_MIDI) ? TRUE: FALSE), (ags_core_audio_port_test_flags(port->data, AGS_CORE_AUDIO_PORT_IS_OUTPUT) ? TRUE: FALSE)); g_free(port_name); port = port->next; } ags_core_audio_client_set_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_ACTIVATED); g_list_free(port_start); } /** * ags_core_audio_client_deactivate: * @core_audio_client: the #AgsCoreAudioClient * * Deactivate client. * * Since: 3.0.0 */ void ags_core_audio_client_deactivate(AgsCoreAudioClient *core_audio_client) { #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* get graph */ g_rec_mutex_lock(core_audio_client_mutex); graph = core_audio_client->graph; g_rec_mutex_unlock(core_audio_client_mutex); if(graph == NULL){ return; } #ifdef AGS_WITH_CORE_AUDIO AUGraphStop(graph); #endif /* set graph */ g_rec_mutex_lock(core_audio_client_mutex); core_audio_client->graph = NULL; g_rec_mutex_unlock(core_audio_client_mutex); ags_core_audio_client_unset_flags(core_audio_client, AGS_CORE_AUDIO_CLIENT_ACTIVATED); } /** * ags_core_audio_client_add_device: * @core_audio_client: the #AgsCoreAudioClient * @core_audio_device: an #AgsCoreAudioDevout or #AgsCoreAudioDevin * * Add @core_audio_device to @core_audio_client. * * Since: 3.0.0 */ void ags_core_audio_client_add_device(AgsCoreAudioClient *core_audio_client, GObject *core_audio_device) { GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client) || (!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_device) && !AGS_IS_CORE_AUDIO_DEVIN(core_audio_device))){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* add device */ g_rec_mutex_lock(core_audio_client_mutex); if(g_list_find(core_audio_client->device, core_audio_device) == NULL){ g_object_ref(core_audio_device); core_audio_client->device = g_list_prepend(core_audio_client->device, core_audio_device); } g_rec_mutex_unlock(core_audio_client_mutex); } /** * ags_core_audio_client_remove_device: * @core_audio_client: the #AgsCoreAudioClient * @core_audio_device: an #AgsCoreAudioDevout or #AgsCoreAudioDevin * * Remove @core_audio_device from @core_audio_client. * * Since: 3.0.0 */ void ags_core_audio_client_remove_device(AgsCoreAudioClient *core_audio_client, GObject *core_audio_device) { GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* remove */ g_rec_mutex_lock(core_audio_client_mutex); if(g_list_find(core_audio_client->device, core_audio_device) != NULL){ core_audio_client->device = g_list_remove(core_audio_client->device, core_audio_device); g_object_unref(core_audio_device); } g_rec_mutex_unlock(core_audio_client_mutex); } /** * ags_core_audio_client_add_port: * @core_audio_client: the #AgsCoreAudioClient * @core_audio_port: an #AgsCoreAudioPort * * Add @core_audio_port to @core_audio_client. * * Since: 3.0.0 */ void ags_core_audio_client_add_port(AgsCoreAudioClient *core_audio_client, GObject *core_audio_port) { GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client) || !AGS_IS_CORE_AUDIO_PORT(core_audio_port)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* add port */ g_rec_mutex_lock(core_audio_client_mutex); if(g_list_find(core_audio_client->port, core_audio_port) == NULL){ g_object_ref(core_audio_port); core_audio_client->port = g_list_prepend(core_audio_client->port, core_audio_port); } g_rec_mutex_unlock(core_audio_client_mutex); } /** * ags_core_audio_client_remove_port: * @core_audio_client: the #AgsCoreAudioClient * @core_audio_port: an #AgsCoreAudioPort * * Remove @core_audio_port from @core_audio_client. * * Since: 3.0.0 */ void ags_core_audio_client_remove_port(AgsCoreAudioClient *core_audio_client, GObject *core_audio_port) { GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* remove port */ g_rec_mutex_lock(core_audio_client_mutex); if(g_list_find(core_audio_client->port, core_audio_port) != NULL){ core_audio_client->port = g_list_remove(core_audio_client->port, core_audio_port); g_object_unref(core_audio_port); } g_rec_mutex_unlock(core_audio_client_mutex); } /** * ags_core_audio_client_new: * @core_audio_server: the assigned #AgsCoreAudioServer * * Create a new instance of #AgsCoreAudioClient. * * Returns: the new #AgsCoreAudioClient * * Since: 3.0.0 */ AgsCoreAudioClient* ags_core_audio_client_new(GObject *core_audio_server) { AgsCoreAudioClient *core_audio_client; core_audio_client = (AgsCoreAudioClient *) g_object_new(AGS_TYPE_CORE_AUDIO_CLIENT, "core-audio-server", core_audio_server, NULL); return(core_audio_client); } gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_midiin.c0000644000175000017500000015063513607210263021154 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_core_audio_midiin_class_init(AgsCoreAudioMidiinClass *core_audio_midiin); void ags_core_audio_midiin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_core_audio_midiin_sequencer_interface_init(AgsSequencerInterface *sequencer); void ags_core_audio_midiin_init(AgsCoreAudioMidiin *core_audio_midiin); void ags_core_audio_midiin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_core_audio_midiin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_core_audio_midiin_dispose(GObject *gobject); void ags_core_audio_midiin_finalize(GObject *gobject); AgsUUID* ags_core_audio_midiin_get_uuid(AgsConnectable *connectable); gboolean ags_core_audio_midiin_has_resource(AgsConnectable *connectable); gboolean ags_core_audio_midiin_is_ready(AgsConnectable *connectable); void ags_core_audio_midiin_add_to_registry(AgsConnectable *connectable); void ags_core_audio_midiin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_core_audio_midiin_list_resource(AgsConnectable *connectable); xmlNode* ags_core_audio_midiin_xml_compose(AgsConnectable *connectable); void ags_core_audio_midiin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_core_audio_midiin_is_connected(AgsConnectable *connectable); void ags_core_audio_midiin_connect(AgsConnectable *connectable); void ags_core_audio_midiin_disconnect(AgsConnectable *connectable); void ags_core_audio_midiin_set_device(AgsSequencer *sequencer, gchar *device); gchar* ags_core_audio_midiin_get_device(AgsSequencer *sequencer); void ags_core_audio_midiin_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name); gboolean ags_core_audio_midiin_is_starting(AgsSequencer *sequencer); gboolean ags_core_audio_midiin_is_recording(AgsSequencer *sequencer); void ags_core_audio_midiin_port_init(AgsSequencer *sequencer, GError **error); void ags_core_audio_midiin_port_record(AgsSequencer *sequencer, GError **error); void ags_core_audio_midiin_port_free(AgsSequencer *sequencer); void ags_core_audio_midiin_tic(AgsSequencer *sequencer); void ags_core_audio_midiin_offset_changed(AgsSequencer *sequencer, guint note_offset); void ags_core_audio_midiin_set_bpm(AgsSequencer *sequencer, gdouble bpm); gdouble ags_core_audio_midiin_get_bpm(AgsSequencer *sequencer); void ags_core_audio_midiin_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor); gdouble ags_core_audio_midiin_get_delay_factor(AgsSequencer *sequencer); void* ags_core_audio_midiin_get_buffer(AgsSequencer *sequencer, guint *buffer_length); void* ags_core_audio_midiin_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length); void ags_core_audio_midiin_lock_buffer(AgsSequencer *sequencer, void *buffer); void ags_core_audio_midiin_unlock_buffer(AgsSequencer *sequencer, void *buffer); void ags_core_audio_midiin_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset); guint ags_core_audio_midiin_get_start_note_offset(AgsSequencer *sequencer); void ags_core_audio_midiin_set_note_offset(AgsSequencer *sequencer, guint note_offset); guint ags_core_audio_midiin_get_note_offset(AgsSequencer *sequencer); /** * SECTION:ags_core_audio_midiin * @short_description: Input from sequencer * @title: AgsCoreAudioMidiin * @section_id: * @include: ags/audio/core-audio/ags_core_audio_midiin.h * * #AgsCoreAudioMidiin represents a sequencer and supports midi input. */ enum{ PROP_0, PROP_DEVICE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_CORE_AUDIO_CLIENT, PROP_CORE_AUDIO_PORT, }; static gpointer ags_core_audio_midiin_parent_class = NULL; GType ags_core_audio_midiin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_core_audio_midiin = 0; static const GTypeInfo ags_core_audio_midiin_info = { sizeof(AgsCoreAudioMidiinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_core_audio_midiin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCoreAudioMidiin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_core_audio_midiin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_core_audio_midiin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sequencer_interface_info = { (GInterfaceInitFunc) ags_core_audio_midiin_sequencer_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_core_audio_midiin = g_type_register_static(G_TYPE_OBJECT, "AgsCoreAudioMidiin", &ags_core_audio_midiin_info, 0); g_type_add_interface_static(ags_type_core_audio_midiin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_core_audio_midiin, AGS_TYPE_SEQUENCER, &ags_sequencer_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_core_audio_midiin); } return g_define_type_id__volatile; } void ags_core_audio_midiin_class_init(AgsCoreAudioMidiinClass *core_audio_midiin) { GObjectClass *gobject; GParamSpec *param_spec; ags_core_audio_midiin_parent_class = g_type_class_peek_parent(core_audio_midiin); /* GObjectClass */ gobject = (GObjectClass *) core_audio_midiin; gobject->set_property = ags_core_audio_midiin_set_property; gobject->get_property = ags_core_audio_midiin_get_property; gobject->dispose = ags_core_audio_midiin_dispose; gobject->finalize = ags_core_audio_midiin_finalize; /* properties */ /** * AgsCoreAudioMidiin:device: * * The core audio sequencer indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "hw:0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsCoreAudioMidiin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to record"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsCoreAudioMidiin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsCoreAudioMidiin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsCoreAudioMidiin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsCoreAudioMidiin:core-audio-client: * * The assigned #AgsCoreAudioClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-client", i18n_pspec("core audio client object"), i18n_pspec("The core audio client object"), AGS_TYPE_CORE_AUDIO_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_CLIENT, param_spec); /** * AgsCoreAudioMidiin:core-audio-port: * * The assigned #AgsCoreAudioPort * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-port", i18n_pspec("core audio port object"), i18n_pspec("The core audio port object"), AGS_TYPE_CORE_AUDIO_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_PORT, param_spec); /* AgsCoreAudioMidiinClass */ } GQuark ags_core_audio_midiin_error_quark() { return(g_quark_from_static_string("ags-core_audio_midiin-error-quark")); } void ags_core_audio_midiin_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_core_audio_midiin_get_uuid; connectable->has_resource = ags_core_audio_midiin_has_resource; connectable->is_ready = ags_core_audio_midiin_is_ready; connectable->add_to_registry = ags_core_audio_midiin_add_to_registry; connectable->remove_from_registry = ags_core_audio_midiin_remove_from_registry; connectable->list_resource = ags_core_audio_midiin_list_resource; connectable->xml_compose = ags_core_audio_midiin_xml_compose; connectable->xml_parse = ags_core_audio_midiin_xml_parse; connectable->is_connected = ags_core_audio_midiin_is_connected; connectable->connect = ags_core_audio_midiin_connect; connectable->disconnect = ags_core_audio_midiin_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_core_audio_midiin_sequencer_interface_init(AgsSequencerInterface *sequencer) { sequencer->set_device = ags_core_audio_midiin_set_device; sequencer->get_device = ags_core_audio_midiin_get_device; sequencer->list_cards = ags_core_audio_midiin_list_cards; sequencer->is_starting = ags_core_audio_midiin_is_starting; sequencer->is_playing = NULL; sequencer->is_recording = ags_core_audio_midiin_is_recording; sequencer->play_init = NULL; sequencer->play = NULL; sequencer->record_init = ags_core_audio_midiin_port_init; sequencer->record = ags_core_audio_midiin_port_record; sequencer->stop = ags_core_audio_midiin_port_free; sequencer->tic = ags_core_audio_midiin_tic; sequencer->offset_changed = ags_core_audio_midiin_offset_changed; sequencer->set_bpm = ags_core_audio_midiin_set_bpm; sequencer->get_bpm = ags_core_audio_midiin_get_bpm; sequencer->set_delay_factor = ags_core_audio_midiin_set_delay_factor; sequencer->get_delay_factor = ags_core_audio_midiin_get_delay_factor; sequencer->get_buffer = ags_core_audio_midiin_get_buffer; sequencer->get_next_buffer = ags_core_audio_midiin_get_next_buffer; sequencer->lock_buffer = ags_core_audio_midiin_lock_buffer; sequencer->unlock_buffer = ags_core_audio_midiin_unlock_buffer; sequencer->set_start_note_offset = ags_core_audio_midiin_set_start_note_offset; sequencer->get_start_note_offset = ags_core_audio_midiin_get_start_note_offset; sequencer->set_note_offset = ags_core_audio_midiin_set_note_offset; sequencer->get_note_offset = ags_core_audio_midiin_get_note_offset; } void ags_core_audio_midiin_init(AgsCoreAudioMidiin *core_audio_midiin) { AgsConfig *config; gchar *segmentation; guint i; guint denominator, numerator; /* flags */ core_audio_midiin->flags = 0; g_atomic_int_set(&(core_audio_midiin->sync_flags), AGS_CORE_AUDIO_MIDIIN_PASS_THROUGH); /* core-audio midiin mutex */ g_rec_mutex_init(&(core_audio_midiin->obj_mutex)); /* uuid */ core_audio_midiin->uuid = ags_uuid_alloc(); ags_uuid_generate(core_audio_midiin->uuid); /* card and port */ core_audio_midiin->card_uri = NULL; core_audio_midiin->core_audio_client = NULL; core_audio_midiin->port_name = NULL; core_audio_midiin->core_audio_port = NULL; /* buffer */ core_audio_midiin->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ core_audio_midiin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(core_audio_midiin->buffer_mutex[i]); } core_audio_midiin->buffer = (char **) malloc(4 * sizeof(char*)); core_audio_midiin->buffer[0] = NULL; core_audio_midiin->buffer[1] = NULL; core_audio_midiin->buffer[2] = NULL; core_audio_midiin->buffer[3] = NULL; core_audio_midiin->buffer_size[0] = 0; core_audio_midiin->buffer_size[1] = 0; core_audio_midiin->buffer_size[2] = 0; core_audio_midiin->buffer_size[3] = 0; /* bpm */ core_audio_midiin->bpm = AGS_SEQUENCER_DEFAULT_BPM; /* delay and delay factor */ core_audio_midiin->delay = AGS_SEQUENCER_DEFAULT_DELAY; core_audio_midiin->delay_factor = AGS_SEQUENCER_DEFAULT_DELAY_FACTOR; /* segmentation */ config = ags_config_get_instance(); segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); core_audio_midiin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* counters */ core_audio_midiin->start_note_offset = 0; core_audio_midiin->note_offset = 0; core_audio_midiin->note_offset_absolute = 0; core_audio_midiin->tact_counter = 0.0; core_audio_midiin->delay_counter = 0; core_audio_midiin->tic_counter = 0; /* callback mutex */ g_mutex_init(&(core_audio_midiin->callback_mutex)); g_cond_init(&(core_audio_midiin->callback_cond)); /* callback finish mutex */ g_mutex_init(&(core_audio_midiin->callback_finish_mutex)); g_cond_init(&(core_audio_midiin->callback_finish_cond)); } void ags_core_audio_midiin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(gobject); /* get core-audio client mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->card_uri = g_strdup(device); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->bpm = bpm; g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->delay_factor = delay_factor; g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_CORE_AUDIO_CLIENT: { AgsCoreAudioClient *core_audio_client; core_audio_client = g_value_get_object(value); g_rec_mutex_lock(core_audio_midiin_mutex); if(core_audio_midiin->core_audio_client == (GObject *) core_audio_client){ g_rec_mutex_unlock(core_audio_midiin_mutex); return; } if(core_audio_midiin->core_audio_client != NULL){ g_object_unref(G_OBJECT(core_audio_midiin->core_audio_client)); } if(core_audio_client != NULL){ g_object_ref(G_OBJECT(core_audio_client)); } core_audio_midiin->core_audio_client = (GObject *) core_audio_client; g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_CORE_AUDIO_PORT: { AgsCoreAudioPort *core_audio_port; core_audio_port = (AgsCoreAudioPort *) g_value_get_object(value); g_rec_mutex_lock(core_audio_midiin_mutex); if(g_list_find(core_audio_midiin->core_audio_port, core_audio_port) != NULL){ g_rec_mutex_unlock(core_audio_midiin_mutex); return; } if(core_audio_port != NULL){ g_object_ref(core_audio_port); core_audio_midiin->core_audio_port = g_list_append(core_audio_midiin->core_audio_port, core_audio_port); } g_rec_mutex_unlock(core_audio_midiin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_midiin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(gobject); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(core_audio_midiin_mutex); g_value_set_string(value, core_audio_midiin->card_uri); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(core_audio_midiin_mutex); g_value_set_pointer(value, core_audio_midiin->buffer); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(core_audio_midiin_mutex); g_value_set_double(value, core_audio_midiin->bpm); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(core_audio_midiin_mutex); g_value_set_double(value, core_audio_midiin->delay_factor); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_CORE_AUDIO_CLIENT: { g_rec_mutex_lock(core_audio_midiin_mutex); g_value_set_object(value, core_audio_midiin->core_audio_client); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; case PROP_CORE_AUDIO_PORT: { g_rec_mutex_lock(core_audio_midiin_mutex); g_value_set_pointer(value, g_list_copy_deep(core_audio_midiin->core_audio_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(core_audio_midiin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_midiin_dispose(GObject *gobject) { AgsCoreAudioMidiin *core_audio_midiin; GList *list; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(gobject); /* core_audio client */ if(core_audio_midiin->core_audio_client != NULL){ g_object_unref(core_audio_midiin->core_audio_client); core_audio_midiin->core_audio_client = NULL; } /* core_audio port */ g_list_free_full(core_audio_midiin->core_audio_port, g_object_unref); core_audio_midiin->core_audio_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_core_audio_midiin_parent_class)->dispose(gobject); } void ags_core_audio_midiin_finalize(GObject *gobject) { AgsCoreAudioMidiin *core_audio_midiin; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(gobject); ags_uuid_free(core_audio_midiin->uuid); /* free output buffer */ if(core_audio_midiin->buffer[0] != NULL){ free(core_audio_midiin->buffer[0]); } if(core_audio_midiin->buffer[1] != NULL){ free(core_audio_midiin->buffer[1]); } if(core_audio_midiin->buffer[2] != NULL){ free(core_audio_midiin->buffer[2]); } if(core_audio_midiin->buffer[3] != NULL){ free(core_audio_midiin->buffer[3]); } /* free buffer array */ free(core_audio_midiin->buffer); /* core_audio client */ if(core_audio_midiin->core_audio_client != NULL){ g_object_unref(core_audio_midiin->core_audio_client); } /* core_audio port */ g_list_free_full(core_audio_midiin->core_audio_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_core_audio_midiin_parent_class)->finalize(gobject); } AgsUUID* ags_core_audio_midiin_get_uuid(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; AgsUUID *ptr; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); /* get core_audio_midiin signal mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* get UUID */ g_rec_mutex_lock(core_audio_midiin_mutex); ptr = core_audio_midiin->uuid; g_rec_mutex_unlock(core_audio_midiin_mutex); return(ptr); } gboolean ags_core_audio_midiin_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_core_audio_midiin_is_ready(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; gboolean is_ready; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); /* check is added */ is_ready = ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_ADDED_TO_REGISTRY); return(is_ready); } void ags_core_audio_midiin_add_to_registry(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; if(ags_connectable_is_ready(connectable)){ return; } core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); ags_core_audio_midiin_set_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_ADDED_TO_REGISTRY); } void ags_core_audio_midiin_remove_from_registry(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; if(!ags_connectable_is_ready(connectable)){ return; } core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); ags_core_audio_midiin_unset_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_ADDED_TO_REGISTRY); } xmlNode* ags_core_audio_midiin_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_core_audio_midiin_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_core_audio_midiin_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_core_audio_midiin_is_connected(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; gboolean is_connected; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); /* check is connected */ is_connected = ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_CONNECTED); return(is_connected); } void ags_core_audio_midiin_connect(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; if(ags_connectable_is_connected(connectable)){ return; } core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); ags_core_audio_midiin_set_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_CONNECTED); } void ags_core_audio_midiin_disconnect(AgsConnectable *connectable) { AgsCoreAudioMidiin *core_audio_midiin; if(!ags_connectable_is_connected(connectable)){ return; } core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(connectable); ags_core_audio_midiin_unset_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_CONNECTED); } /** * ags_core_audio_midiin_test_flags: * @core_audio_midiin: the #AgsCoreAudioMidiin * @flags: the flags * * Test @flags to be set on @core_audio_midiin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_core_audio_midiin_test_flags(AgsCoreAudioMidiin *core_audio_midiin, guint flags) { gboolean retval; GRecMutex *core_audio_midiin_mutex; if(!AGS_IS_CORE_AUDIO_MIDIIN(core_audio_midiin)){ return(FALSE); } /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* test */ g_rec_mutex_lock(core_audio_midiin_mutex); retval = (flags & (core_audio_midiin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_midiin_mutex); return(retval); } /** * ags_core_audio_midiin_set_flags: * @core_audio_midiin: the #AgsCoreAudioMidiin * @flags: see #AgsCoreAudioMidiinFlags-enum * * Enable a feature of @core_audio_midiin. * * Since: 3.0.0 */ void ags_core_audio_midiin_set_flags(AgsCoreAudioMidiin *core_audio_midiin, guint flags) { GRecMutex *core_audio_midiin_mutex; if(!AGS_IS_CORE_AUDIO_MIDIIN(core_audio_midiin)){ return; } /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->flags |= flags; g_rec_mutex_unlock(core_audio_midiin_mutex); } /** * ags_core_audio_midiin_unset_flags: * @core_audio_midiin: the #AgsCoreAudioMidiin * @flags: see #AgsCoreAudioMidiinFlags-enum * * Disable a feature of @core_audio_midiin. * * Since: 3.0.0 */ void ags_core_audio_midiin_unset_flags(AgsCoreAudioMidiin *core_audio_midiin, guint flags) { GRecMutex *core_audio_midiin_mutex; if(!AGS_IS_CORE_AUDIO_MIDIIN(core_audio_midiin)){ return; } /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->flags &= (~flags); g_rec_mutex_unlock(core_audio_midiin_mutex); } void ags_core_audio_midiin_set_device(AgsSequencer *sequencer, gchar *device) { AgsCoreAudioMidiin *core_audio_midiin; GList *core_audio_port, *core_audio_port_start; gchar *str; int ret; guint nth_card; guint i; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); g_rec_mutex_lock(core_audio_midiin_mutex); if(core_audio_midiin->card_uri == device || !g_ascii_strcasecmp(core_audio_midiin->card_uri, device)){ g_rec_mutex_unlock(core_audio_midiin_mutex); return; } if(!g_str_has_prefix(device, "ags-core_audio-midiin-")){ g_warning("invalid CORE_AUDIO device prefix"); g_rec_mutex_unlock(core_audio_midiin_mutex); return; } ret = sscanf(device, "ags-core_audio-midiin-%u", &nth_card); if(ret != 1){ g_warning("invalid CORE_AUDIO device specifier"); g_rec_mutex_unlock(core_audio_midiin_mutex); return; } if(core_audio_midiin->card_uri != NULL){ g_free(core_audio_midiin->card_uri); } core_audio_midiin->card_uri = g_strdup(device); /* apply name to port */ core_audio_port_start = core_audio_port = g_list_copy(core_audio_midiin->core_audio_port); str = g_strdup_printf("ags-sequencer%d", nth_card); g_object_set(core_audio_port->data, "port-name", str, NULL); g_free(str); g_list_free(core_audio_port_start); g_rec_mutex_unlock(core_audio_midiin_mutex); } gchar* ags_core_audio_midiin_get_device(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; gchar *device; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); device = NULL; g_rec_mutex_lock(core_audio_midiin_mutex); device = g_strdup(core_audio_midiin->card_uri); g_rec_mutex_unlock(core_audio_midiin_mutex); return(device); } void ags_core_audio_midiin_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name) { AgsCoreAudioClient *core_audio_client; AgsCoreAudioMidiin *core_audio_midiin; AgsApplicationContext *application_context; GList *list, *list_start; gchar *device, *client_name; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list_start = list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_CORE_AUDIO_MIDIIN(list->data)){ g_object_get(list->data, "device", &device, "core-audio-client", &core_audio_client, NULL); if(card_id != NULL){ *card_id = g_list_prepend(*card_id, device); } if(card_name != NULL){ if(core_audio_client != NULL){ g_object_get(core_audio_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_core_audio_midiin_list_cards() - CORE_AUDIO client not connected (null)"); } } g_object_unref(core_audio_client); } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } gboolean ags_core_audio_midiin_is_starting(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; gboolean is_starting; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* check is starting */ g_rec_mutex_lock(core_audio_midiin_mutex); is_starting = ((AGS_CORE_AUDIO_MIDIIN_START_RECORD & (core_audio_midiin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_midiin_mutex); return(is_starting); } gboolean ags_core_audio_midiin_is_recording(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; gboolean is_recording; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* check is starting */ g_rec_mutex_lock(core_audio_midiin_mutex); is_recording = ((AGS_CORE_AUDIO_MIDIIN_RECORD & (core_audio_midiin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_midiin_mutex); return(is_recording); } void ags_core_audio_midiin_port_init(AgsSequencer *sequencer, GError **error) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; if(ags_sequencer_is_recording(sequencer)){ return; } core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* */ g_rec_mutex_lock(core_audio_midiin_mutex); /* prepare for record */ core_audio_midiin->flags |= (AGS_CORE_AUDIO_MIDIIN_BUFFER3 | AGS_CORE_AUDIO_MIDIIN_START_RECORD | AGS_CORE_AUDIO_MIDIIN_RECORD | AGS_CORE_AUDIO_MIDIIN_NONBLOCKING); /* port setup */ //TODO:JK: implement me /* */ core_audio_midiin->tact_counter = 0.0; core_audio_midiin->delay_counter = floor(core_audio_midiin->delay); core_audio_midiin->tic_counter = 0; core_audio_midiin->flags |= (AGS_CORE_AUDIO_MIDIIN_INITIALIZED | AGS_CORE_AUDIO_MIDIIN_START_RECORD | AGS_CORE_AUDIO_MIDIIN_RECORD); g_atomic_int_and(&(core_audio_midiin->sync_flags), (~(AGS_CORE_AUDIO_MIDIIN_PASS_THROUGH))); g_atomic_int_or(&(core_audio_midiin->sync_flags), AGS_CORE_AUDIO_MIDIIN_INITIAL_CALLBACK); g_rec_mutex_unlock(core_audio_midiin_mutex); } void ags_core_audio_midiin_port_record(AgsSequencer *sequencer, GError **error) { AgsCoreAudioClient *core_audio_client; AgsCoreAudioPort *core_audio_port; AgsCoreAudioMidiin *core_audio_midiin; AgsTicDevice *tic_device; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; gboolean core_audio_client_activated; gboolean do_sync; GRecMutex *core_audio_midiin_mutex; GRecMutex *core_audio_client_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); application_context = ags_application_context_get_instance(); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* client */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_client = (AgsCoreAudioClient *) core_audio_midiin->core_audio_client; g_rec_mutex_unlock(core_audio_midiin_mutex); /* do record */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->flags &= (~AGS_CORE_AUDIO_MIDIIN_START_RECORD); if((AGS_CORE_AUDIO_MIDIIN_INITIALIZED & (core_audio_midiin->flags)) == 0){ g_rec_mutex_unlock(core_audio_midiin_mutex); return; } callback_mutex = &(core_audio_midiin->callback_mutex); callback_finish_mutex = &(core_audio_midiin->callback_finish_mutex); g_rec_mutex_unlock(core_audio_midiin_mutex); /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* check activated */ g_rec_mutex_lock(core_audio_client_mutex); core_audio_client_activated = ((AGS_CORE_AUDIO_CLIENT_ACTIVATED & (core_audio_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_client_mutex); do_sync = FALSE; if(core_audio_client_activated){ if((AGS_CORE_AUDIO_MIDIIN_INITIAL_CALLBACK & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) == 0){ if((AGS_CORE_AUDIO_MIDIIN_DO_SYNC & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_DO_SYNC)); do_sync = TRUE; /* signal client - wait callback */ g_mutex_lock(callback_mutex); g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT)); if((AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) == 0){ g_cond_signal(&(core_audio_midiin->callback_cond)); } g_mutex_unlock(callback_mutex); } }else{ g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_DO_SYNC)); g_atomic_int_or(&(core_audio_midiin->sync_flags), (AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT | AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE)); g_atomic_int_or(&(core_audio_midiin->sync_flags), (AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT | AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE)); g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_INITIAL_CALLBACK)); } } /* implied wait - callback finish wait */ if(do_sync){ g_mutex_lock(callback_finish_mutex); if((AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE)); while((AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) == 0 && (AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_cond_wait(&(core_audio_midiin->callback_finish_cond), callback_finish_mutex); } } g_mutex_unlock(callback_finish_mutex); g_atomic_int_or(&(core_audio_midiin->sync_flags), (AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT | AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE)); } task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic sequencer */ tic_device = ags_tic_device_new((GObject *) core_audio_midiin); task = g_list_append(task, tic_device); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) core_audio_midiin); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_core_audio_midiin_port_free(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* check initialized */ g_rec_mutex_lock(core_audio_midiin_mutex); if((AGS_CORE_AUDIO_MIDIIN_INITIALIZED & (core_audio_midiin->flags)) == 0){ g_rec_mutex_unlock(core_audio_midiin_mutex); return; } callback_mutex = &(core_audio_midiin->callback_mutex); callback_finish_mutex = &(core_audio_midiin->callback_finish_mutex); core_audio_midiin->flags &= (~(AGS_CORE_AUDIO_MIDIIN_BUFFER0 | AGS_CORE_AUDIO_MIDIIN_BUFFER1 | AGS_CORE_AUDIO_MIDIIN_BUFFER2 | AGS_CORE_AUDIO_MIDIIN_BUFFER3 | AGS_CORE_AUDIO_MIDIIN_RECORD)); g_atomic_int_or(&(core_audio_midiin->sync_flags), AGS_CORE_AUDIO_MIDIIN_PASS_THROUGH); g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_INITIAL_CALLBACK)); g_rec_mutex_unlock(core_audio_midiin_mutex); /* signal callback */ g_mutex_lock(callback_mutex); g_atomic_int_or(&(core_audio_midiin->sync_flags), AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE); if((AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_cond_signal(&(core_audio_midiin->callback_cond)); } g_mutex_unlock(callback_mutex); /* signal thread */ g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(core_audio_midiin->sync_flags), AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE); if((AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_cond_signal(&(core_audio_midiin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); /* */ g_rec_mutex_lock(core_audio_midiin_mutex); if(core_audio_midiin->buffer[1] != NULL){ free(core_audio_midiin->buffer[1]); core_audio_midiin->buffer_size[1] = 0; } if(core_audio_midiin->buffer[2] != NULL){ free(core_audio_midiin->buffer[2]); core_audio_midiin->buffer_size[2] = 0; } if(core_audio_midiin->buffer[3] != NULL){ free(core_audio_midiin->buffer[3]); core_audio_midiin->buffer_size[3] = 0; } if(core_audio_midiin->buffer[0] != NULL){ free(core_audio_midiin->buffer[0]); core_audio_midiin->buffer_size[0] = 0; } core_audio_midiin->note_offset = core_audio_midiin->start_note_offset; core_audio_midiin->note_offset_absolute = core_audio_midiin->start_note_offset; g_rec_mutex_unlock(core_audio_midiin_mutex); } void ags_core_audio_midiin_tic(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; gdouble delay; gdouble delay_counter; guint note_offset; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* determine if attack should be switched */ g_rec_mutex_lock(core_audio_midiin_mutex); delay = core_audio_midiin->delay; delay_counter = core_audio_midiin->delay_counter; note_offset = core_audio_midiin->note_offset; g_rec_mutex_unlock(core_audio_midiin_mutex); if(delay_counter + 1.0 >= delay){ ags_sequencer_set_note_offset(sequencer, note_offset + 1); /* delay */ ags_sequencer_offset_changed(sequencer, note_offset); /* reset - delay counter */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->delay_counter = delay_counter + 1.0 - delay; core_audio_midiin->tact_counter += 1.0; g_rec_mutex_unlock(core_audio_midiin_mutex); }else{ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->delay_counter += 1.0; g_rec_mutex_unlock(core_audio_midiin_mutex); } } void ags_core_audio_midiin_offset_changed(AgsSequencer *sequencer, guint note_offset) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* offset changed */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->tic_counter += 1; if(core_audio_midiin->tic_counter == AGS_SEQUENCER_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ core_audio_midiin->tic_counter = 0; } g_rec_mutex_unlock(core_audio_midiin_mutex); } void ags_core_audio_midiin_set_bpm(AgsSequencer *sequencer, gdouble bpm) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* set bpm */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->bpm = bpm; g_rec_mutex_unlock(core_audio_midiin_mutex); } gdouble ags_core_audio_midiin_get_bpm(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; gdouble bpm; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* get bpm */ g_rec_mutex_lock(core_audio_midiin_mutex); bpm = core_audio_midiin->bpm; g_rec_mutex_unlock(core_audio_midiin_mutex); return(bpm); } void ags_core_audio_midiin_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* set delay factor */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->delay_factor = delay_factor; g_rec_mutex_unlock(core_audio_midiin_mutex); } gdouble ags_core_audio_midiin_get_delay_factor(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; gdouble delay_factor; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio_midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* get delay factor */ g_rec_mutex_lock(core_audio_midiin_mutex); delay_factor = core_audio_midiin->delay_factor; g_rec_mutex_unlock(core_audio_midiin_mutex); return(delay_factor); } void* ags_core_audio_midiin_get_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsCoreAudioMidiin *core_audio_midiin; char *buffer; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get buffer */ if((AGS_CORE_AUDIO_MIDIIN_BUFFER0 & (core_audio_midiin->flags)) != 0){ buffer = core_audio_midiin->buffer[0]; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER1 & (core_audio_midiin->flags)) != 0){ buffer = core_audio_midiin->buffer[1]; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER2 & (core_audio_midiin->flags)) != 0){ buffer = core_audio_midiin->buffer[2]; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER3 & (core_audio_midiin->flags)) != 0){ buffer = core_audio_midiin->buffer[3]; }else{ buffer = NULL; } /* return the buffer's length */ if(buffer_length != NULL){ if((AGS_CORE_AUDIO_MIDIIN_BUFFER0 & (core_audio_midiin->flags)) != 0){ *buffer_length = core_audio_midiin->buffer_size[0]; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER1 & (core_audio_midiin->flags)) != 0){ *buffer_length = core_audio_midiin->buffer_size[1]; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER2 & (core_audio_midiin->flags)) != 0){ *buffer_length = core_audio_midiin->buffer_size[2]; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER3 & (core_audio_midiin->flags)) != 0){ *buffer_length = core_audio_midiin->buffer_size[3]; }else{ *buffer_length = 0; } } return(buffer); } void* ags_core_audio_midiin_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsCoreAudioMidiin *core_audio_midiin; char *buffer; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get buffer */ if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER0)){ buffer = core_audio_midiin->buffer[1]; }else if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER1)){ buffer = core_audio_midiin->buffer[2]; }else if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER2)){ buffer = core_audio_midiin->buffer[3]; }else if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER3)){ buffer = core_audio_midiin->buffer[0]; }else{ buffer = NULL; } /* return the buffer's length */ if(buffer_length != NULL){ if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER0)){ *buffer_length = core_audio_midiin->buffer_size[1]; }else if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER1)){ *buffer_length = core_audio_midiin->buffer_size[2]; }else if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER2)){ *buffer_length = core_audio_midiin->buffer_size[3]; }else if(ags_core_audio_midiin_test_flags(core_audio_midiin, AGS_CORE_AUDIO_MIDIIN_BUFFER3)){ *buffer_length = core_audio_midiin->buffer_size[0]; }else{ *buffer_length = 0; } } return(buffer); } void ags_core_audio_midiin_lock_buffer(AgsSequencer *sequencer, void *buffer) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *buffer_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); buffer_mutex = NULL; if(core_audio_midiin->buffer != NULL){ if(buffer == core_audio_midiin->buffer[0]){ buffer_mutex = core_audio_midiin->buffer_mutex[0]; }else if(buffer == core_audio_midiin->buffer[1]){ buffer_mutex = core_audio_midiin->buffer_mutex[1]; }else if(buffer == core_audio_midiin->buffer[2]){ buffer_mutex = core_audio_midiin->buffer_mutex[2]; }else if(buffer == core_audio_midiin->buffer[3]){ buffer_mutex = core_audio_midiin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_core_audio_midiin_unlock_buffer(AgsSequencer *sequencer, void *buffer) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *buffer_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); buffer_mutex = NULL; if(core_audio_midiin->buffer != NULL){ if(buffer == core_audio_midiin->buffer[0]){ buffer_mutex = core_audio_midiin->buffer_mutex[0]; }else if(buffer == core_audio_midiin->buffer[1]){ buffer_mutex = core_audio_midiin->buffer_mutex[1]; }else if(buffer == core_audio_midiin->buffer[2]){ buffer_mutex = core_audio_midiin->buffer_mutex[2]; }else if(buffer == core_audio_midiin->buffer[3]){ buffer_mutex = core_audio_midiin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } void ags_core_audio_midiin_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* set note offset */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->start_note_offset = start_note_offset; g_rec_mutex_unlock(core_audio_midiin_mutex); } guint ags_core_audio_midiin_get_start_note_offset(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; guint start_note_offset; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* set note offset */ g_rec_mutex_lock(core_audio_midiin_mutex); start_note_offset = core_audio_midiin->start_note_offset; g_rec_mutex_unlock(core_audio_midiin_mutex); return(start_note_offset); } void ags_core_audio_midiin_set_note_offset(AgsSequencer *sequencer, guint note_offset) { AgsCoreAudioMidiin *core_audio_midiin; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* set note offset */ g_rec_mutex_lock(core_audio_midiin_mutex); core_audio_midiin->note_offset = note_offset; g_rec_mutex_unlock(core_audio_midiin_mutex); } guint ags_core_audio_midiin_get_note_offset(AgsSequencer *sequencer) { AgsCoreAudioMidiin *core_audio_midiin; guint note_offset; GRecMutex *core_audio_midiin_mutex; core_audio_midiin = AGS_CORE_AUDIO_MIDIIN(sequencer); /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* set note offset */ g_rec_mutex_lock(core_audio_midiin_mutex); note_offset = core_audio_midiin->note_offset; g_rec_mutex_unlock(core_audio_midiin_mutex); return(note_offset); } /** * ags_core_audio_midiin_switch_buffer_flag: * @core_audio_midiin: the #AgsCoreAudioMidiin * * The buffer flag indicates the currently recorded buffer. * * Since: 3.0.0 */ void ags_core_audio_midiin_switch_buffer_flag(AgsCoreAudioMidiin *core_audio_midiin) { GRecMutex *core_audio_midiin_mutex; /* get core_audio midiin mutex */ core_audio_midiin_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* switch buffer flag */ g_rec_mutex_lock(core_audio_midiin_mutex); if((AGS_CORE_AUDIO_MIDIIN_BUFFER0 & (core_audio_midiin->flags)) != 0){ core_audio_midiin->flags &= (~AGS_CORE_AUDIO_MIDIIN_BUFFER0); core_audio_midiin->flags |= AGS_CORE_AUDIO_MIDIIN_BUFFER1; /* clear buffer */ if(core_audio_midiin->buffer[3] != NULL){ free(core_audio_midiin->buffer[3]); } core_audio_midiin->buffer[3] = NULL; core_audio_midiin->buffer_size[3] = 0; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER1 & (core_audio_midiin->flags)) != 0){ core_audio_midiin->flags &= (~AGS_CORE_AUDIO_MIDIIN_BUFFER1); core_audio_midiin->flags |= AGS_CORE_AUDIO_MIDIIN_BUFFER2; /* clear buffer */ if(core_audio_midiin->buffer[0] != NULL){ free(core_audio_midiin->buffer[0]); } core_audio_midiin->buffer[0] = NULL; core_audio_midiin->buffer_size[0] = 0; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER2 & (core_audio_midiin->flags)) != 0){ core_audio_midiin->flags &= (~AGS_CORE_AUDIO_MIDIIN_BUFFER2); core_audio_midiin->flags |= AGS_CORE_AUDIO_MIDIIN_BUFFER3; /* clear buffer */ if(core_audio_midiin->buffer[1] != NULL){ free(core_audio_midiin->buffer[1]); } core_audio_midiin->buffer[1] = NULL; core_audio_midiin->buffer_size[1] = 0; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER3 & (core_audio_midiin->flags)) != 0){ core_audio_midiin->flags &= (~AGS_CORE_AUDIO_MIDIIN_BUFFER3); core_audio_midiin->flags |= AGS_CORE_AUDIO_MIDIIN_BUFFER0; /* clear buffer */ if(core_audio_midiin->buffer[2] != NULL){ free(core_audio_midiin->buffer[2]); } core_audio_midiin->buffer[2] = NULL; core_audio_midiin->buffer_size[2] = 0; } g_rec_mutex_unlock(core_audio_midiin_mutex); } /** * ags_core_audio_midiin_new: * * Creates a new instance of #AgsCoreAudioMidiin. * * Returns: a new #AgsCoreAudioMidiin * * Since: 3.0.0 */ AgsCoreAudioMidiin* ags_core_audio_midiin_new() { AgsCoreAudioMidiin *core_audio_midiin; core_audio_midiin = (AgsCoreAudioMidiin *) g_object_new(AGS_TYPE_CORE_AUDIO_MIDIIN, NULL); return(core_audio_midiin); } gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_client.h0000644000175000017500000001066313607210263021162 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CORE_AUDIO_CLIENT_H__ #define __AGS_CORE_AUDIO_CLIENT_H__ #include #include #include #ifdef AGS_WITH_CORE_AUDIO #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_CORE_AUDIO_CLIENT (ags_core_audio_client_get_type()) #define AGS_CORE_AUDIO_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CORE_AUDIO_CLIENT, AgsCoreAudioClient)) #define AGS_CORE_AUDIO_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CORE_AUDIO_CLIENT, AgsCoreAudioClient)) #define AGS_IS_CORE_AUDIO_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CORE_AUDIO_CLIENT)) #define AGS_IS_CORE_AUDIO_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CORE_AUDIO_CLIENT)) #define AGS_CORE_AUDIO_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CORE_AUDIO_CLIENT, AgsCoreAudioClientClass)) #define AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(obj) (&(((AgsCoreAudioClient *) obj)->obj_mutex)) typedef struct _AgsCoreAudioClient AgsCoreAudioClient; typedef struct _AgsCoreAudioClientClass AgsCoreAudioClientClass; /** * AgsCoreAudioClientFlags: * @AGS_CORE_AUDIO_CLIENT_ADDED_TO_REGISTRY: the CoreAudio client was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CORE_AUDIO_CLIENT_CONNECTED: indicates the client was connected by calling #AgsConnectable::connect() * @AGS_CORE_AUDIO_CLIENT_ACTIVATED: the client was activated * @AGS_CORE_AUDIO_CLIENT_READY: the client is ready * * Enum values to control the behavior or indicate internal state of #AgsCoreAudioClient by * enable/disable as flags. */ typedef enum{ AGS_CORE_AUDIO_CLIENT_ADDED_TO_REGISTRY = 1, AGS_CORE_AUDIO_CLIENT_CONNECTED = 1 << 1, AGS_CORE_AUDIO_CLIENT_ACTIVATED = 1 << 2, AGS_CORE_AUDIO_CLIENT_READY = 1 << 3, }AgsCoreAudioClientFlags; struct _AgsCoreAudioClient { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *core_audio_server; AgsUUID *uuid; gchar *client_uuid; gchar *client_name; #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif GList *device; GList *port; }; struct _AgsCoreAudioClientClass { GObjectClass gobject; }; GType ags_core_audio_client_get_type(); gboolean ags_core_audio_client_test_flags(AgsCoreAudioClient *core_audio_client, guint flags); void ags_core_audio_client_set_flags(AgsCoreAudioClient *core_audio_client, guint flags); void ags_core_audio_client_unset_flags(AgsCoreAudioClient *core_audio_client, guint flags); GList* ags_core_audio_client_find_uuid(GList *core_audio_client, gchar *client_uuid); GList* ags_core_audio_client_find(GList *core_audio_client, gchar *client_name); void ags_core_audio_client_open(AgsCoreAudioClient *core_audio_client, gchar *client_name); void ags_core_audio_client_add_device(AgsCoreAudioClient *core_audio_client, GObject *core_audio_device); void ags_core_audio_client_remove_device(AgsCoreAudioClient *core_audio_client, GObject *core_audio_device); void ags_core_audio_client_add_port(AgsCoreAudioClient *core_audio_client, GObject *core_audio_port); void ags_core_audio_client_remove_port(AgsCoreAudioClient *core_audio_client, GObject *core_audio_port); void ags_core_audio_client_activate(AgsCoreAudioClient *core_audio_client); void ags_core_audio_client_deactivate(AgsCoreAudioClient *core_audio_client); AgsCoreAudioClient* ags_core_audio_client_new(GObject *core_audio_server); G_END_DECLS #endif /*__AGS_CORE_AUDIO_CLIENT_H__*/ gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_port.c0000644000175000017500000020027413613101102020646 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef AGS_WITH_CORE_AUDIO #include #include #endif #include void ags_core_audio_port_class_init(AgsCoreAudioPortClass *core_audio_port); void ags_core_audio_port_connectable_interface_init(AgsConnectableInterface *connectable); void ags_core_audio_port_init(AgsCoreAudioPort *core_audio_port); void ags_core_audio_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_core_audio_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_core_audio_port_dispose(GObject *gobject); void ags_core_audio_port_finalize(GObject *gobject); AgsUUID* ags_core_audio_port_get_uuid(AgsConnectable *connectable); gboolean ags_core_audio_port_has_resource(AgsConnectable *connectable); gboolean ags_core_audio_port_is_ready(AgsConnectable *connectable); void ags_core_audio_port_add_to_registry(AgsConnectable *connectable); void ags_core_audio_port_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_core_audio_port_list_resource(AgsConnectable *connectable); xmlNode* ags_core_audio_port_xml_compose(AgsConnectable *connectable); void ags_core_audio_port_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_core_audio_port_is_connected(AgsConnectable *connectable); void ags_core_audio_port_connect(AgsConnectable *connectable); void ags_core_audio_port_disconnect(AgsConnectable *connectable); #ifdef AGS_WITH_CORE_AUDIO void* ags_core_audio_port_cached_output_thread(AgsCoreAudioPort *core_audio_port); void* ags_core_audio_port_cached_input_thread(AgsCoreAudioPort *core_audio_port); void* ags_core_audio_port_output_thread(AgsCoreAudioPort *core_audio_port); void* ags_core_audio_port_input_thread(AgsCoreAudioPort *core_audio_port); void ags_core_audio_port_cached_handle_output_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer); void ags_core_audio_port_cached_handle_input_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer, const AudioTimeStamp *in_start_time, UInt32 in_num_packets, const AudioStreamPacketDescription *in_packet_desc); void ags_core_audio_port_handle_output_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer); void ags_core_audio_port_handle_input_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer, const AudioTimeStamp *in_start_time, UInt32 in_num_packets, const AudioStreamPacketDescription *in_packet_desc); void ags_core_audio_port_midi_notify_callback(const MIDINotification *message, void *ref_con); void ags_core_audio_port_midi_read_callback(const MIDIPacketList *pkt_list, void *ref_con, void *conn_ref_con); #endif /** * SECTION:ags_core_audio_port * @short_description: core audio resource. * @title: AgsCoreAudioPort * @section_id: * @include: ags/audio/core-audio/ags_core_audio_port.h * * The #AgsCoreAudioPort represents either a core audio sequencer or soundcard to communicate * with. */ enum{ PROP_0, PROP_CORE_AUDIO_CLIENT, PROP_CORE_AUDIO_DEVICE, PROP_PORT_NAME, }; static gpointer ags_core_audio_port_parent_class = NULL; #ifdef AGS_WITH_CORE_AUDIO volatile gint ags_core_audio_port_output_run_loop_initialized; volatile gint ags_core_audio_port_input_run_loop_initialized; #ifdef AGS_MAC_BUNDLE void ags_core_audio_port_premain() __attribute__ ((constructor)); #endif void ags_core_audio_port_premain() { g_atomic_int_set(&ags_core_audio_port_output_run_loop_initialized, FALSE); g_atomic_int_set(&ags_core_audio_port_input_run_loop_initialized, FALSE); } CFRunLoopRef ags_core_audio_port_output_run_loop = NULL; CFRunLoopRef ags_core_audio_port_input_run_loop = NULL; #endif GType ags_core_audio_port_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_core_audio_port = 0; static const GTypeInfo ags_core_audio_port_info = { sizeof(AgsCoreAudioPortClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_core_audio_port_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCoreAudioPort), 0, /* n_preallocs */ (GInstanceInitFunc) ags_core_audio_port_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_core_audio_port_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_core_audio_port = g_type_register_static(G_TYPE_OBJECT, "AgsCoreAudioPort", &ags_core_audio_port_info, 0); g_type_add_interface_static(ags_type_core_audio_port, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_core_audio_port); } return g_define_type_id__volatile; } void ags_core_audio_port_class_init(AgsCoreAudioPortClass *core_audio_port) { GObjectClass *gobject; GParamSpec *param_spec; ags_core_audio_port_parent_class = g_type_class_peek_parent(core_audio_port); /* GObjectClass */ gobject = (GObjectClass *) core_audio_port; gobject->set_property = ags_core_audio_port_set_property; gobject->get_property = ags_core_audio_port_get_property; gobject->dispose = ags_core_audio_port_dispose; gobject->finalize = ags_core_audio_port_finalize; /* properties */ /** * AgsCoreAudioPort:core-audio-client: * * The assigned #AgsCoreAudioClient. * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-client", i18n_pspec("assigned core audio client"), i18n_pspec("The assigned core audio client"), AGS_TYPE_CORE_AUDIO_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_CLIENT, param_spec); /** * AgsCoreAudioPort:core-audio-device: * * The assigned #AgsCoreAudioDevout. * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-device", i18n_pspec("assigned core audio devout"), i18n_pspec("The assigned core audio devout"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_DEVICE, param_spec); /** * AgsCoreAudioPort:port-name: * * The core audio soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("port-name", i18n_pspec("port name"), i18n_pspec("The port name"), "hw:0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_NAME, param_spec); } void ags_core_audio_port_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_core_audio_port_get_uuid; connectable->has_resource = ags_core_audio_port_has_resource; connectable->is_ready = ags_core_audio_port_is_ready; connectable->add_to_registry = ags_core_audio_port_add_to_registry; connectable->remove_from_registry = ags_core_audio_port_remove_from_registry; connectable->list_resource = ags_core_audio_port_list_resource; connectable->xml_compose = ags_core_audio_port_xml_compose; connectable->xml_parse = ags_core_audio_port_xml_parse; connectable->is_connected = ags_core_audio_port_is_connected; connectable->connect = ags_core_audio_port_connect; connectable->disconnect = ags_core_audio_port_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_core_audio_port_init(AgsCoreAudioPort *core_audio_port) { AgsConfig *config; gchar *str; guint word_size; guint fixed_size; guint i; /* flags */ core_audio_port->flags = 0; /* port mutex */ g_rec_mutex_init(&(core_audio_port->obj_mutex)); /* parent */ core_audio_port->core_audio_client = NULL; /* uuid */ core_audio_port->uuid = ags_uuid_alloc(); ags_uuid_generate(core_audio_port->uuid); /* */ core_audio_port->core_audio_device = NULL; core_audio_port->port_uuid = ags_id_generator_create_uuid(); core_audio_port->port_name = NULL; /* read config */ config = ags_config_get_instance(); core_audio_port->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); core_audio_port->samplerate = ags_soundcard_helper_config_get_samplerate(config); core_audio_port->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); core_audio_port->format = ags_soundcard_helper_config_get_format(config); core_audio_port->use_cache = TRUE; core_audio_port->cache_buffer_size = AGS_CORE_AUDIO_PORT_DEFAULT_CACHE_BUFFER_SIZE; core_audio_port->current_cache = 0; core_audio_port->completed_cache = 0; core_audio_port->cache_offset = 0; core_audio_port->cache = (void **) malloc(4 * sizeof(void *)); #ifdef AGS_WITH_CORE_AUDIO /* Audio */ //core_audio_port->aq_ref = (AudioQueueRef *) malloc(sizeof(AudioQueueRef)); memset(&(core_audio_port->aq_ref), 0, sizeof(AudioQueueRef)); memset(&(core_audio_port->record_aq_ref), 0, sizeof(AudioQueueRef)); //core_audio_port->data_format = (AudioStreamBasicDescription *) malloc(sizeof(AudioStreamBasicDescription)); memset(&(core_audio_port->data_format), 0, sizeof(AudioStreamBasicDescription)); size_t bytesPerSample = sizeof(gint16); core_audio_port->data_format.mBitsPerChannel = 8 * bytesPerSample; core_audio_port->data_format.mBytesPerPacket = core_audio_port->pcm_channels * bytesPerSample; core_audio_port->data_format.mBytesPerFrame = core_audio_port->pcm_channels * bytesPerSample; core_audio_port->data_format.mFramesPerPacket = 1; core_audio_port->data_format.mChannelsPerFrame = core_audio_port->pcm_channels; core_audio_port->data_format.mFormatID = kAudioFormatLinearPCM; core_audio_port->data_format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; core_audio_port->data_format.mSampleRate = (float) core_audio_port->samplerate; memset(&(core_audio_port->record_format), 0, sizeof(AudioStreamBasicDescription)); core_audio_port->record_format.mBitsPerChannel = 8 * bytesPerSample; core_audio_port->record_format.mBytesPerPacket = core_audio_port->pcm_channels * bytesPerSample; core_audio_port->record_format.mBytesPerFrame = core_audio_port->pcm_channels * bytesPerSample; core_audio_port->record_format.mFramesPerPacket = 1; core_audio_port->record_format.mChannelsPerFrame = core_audio_port->pcm_channels; core_audio_port->record_format.mFormatID = kAudioFormatLinearPCM; core_audio_port->record_format.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; core_audio_port->record_format.mSampleRate = (float) core_audio_port->samplerate; /* MIDI */ core_audio_port->midi_client = (MIDIClientRef *) malloc(sizeof(MIDIClientRef)); memset(core_audio_port->midi_client, 0, sizeof(MIDIClientRef)); core_audio_port->midi_port = (MIDIPortRef *) malloc(sizeof(MIDIPortRef)); memset(core_audio_port->midi_port, 0, sizeof(MIDIPortRef)); #else core_audio_port->aq_ref = NULL; core_audio_port->data_format = NULL; core_audio_port->midi_client = NULL; core_audio_port->midi_port = NULL; #endif word_size = 0; switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { core_audio_port->cache[0] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint16)); core_audio_port->cache[1] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint16)); core_audio_port->cache[2] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint16)); core_audio_port->cache[3] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint16)); word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { core_audio_port->cache[0] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[1] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[2] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[3] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { core_audio_port->cache[0] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[1] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[2] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[3] = (void *) malloc(core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); word_size = sizeof(gint32); } break; default: g_warning("core audio devout/devin - unsupported format"); } fixed_size = core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * word_size; memset(core_audio_port->cache[0], 0, core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * word_size); memset(core_audio_port->cache[1], 0, core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * word_size); memset(core_audio_port->cache[2], 0, core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * word_size); memset(core_audio_port->cache[3], 0, core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * word_size); core_audio_port->midi_port_number = 0; g_atomic_int_set(&(core_audio_port->is_empty), FALSE); g_atomic_int_set(&(core_audio_port->queued), 0); } void ags_core_audio_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCoreAudioPort *core_audio_port; GRecMutex *core_audio_port_mutex; core_audio_port = AGS_CORE_AUDIO_PORT(gobject); /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); switch(prop_id){ case PROP_CORE_AUDIO_CLIENT: { AgsCoreAudioClient *core_audio_client; core_audio_client = (AgsCoreAudioClient *) g_value_get_object(value); g_rec_mutex_lock(core_audio_port_mutex); if(core_audio_port->core_audio_client == (GObject *) core_audio_client){ g_rec_mutex_unlock(core_audio_port_mutex); return; } if(core_audio_port->core_audio_client != NULL){ g_object_unref(core_audio_port->core_audio_client); } if(core_audio_client != NULL){ g_object_ref(core_audio_client); } core_audio_port->core_audio_client = (GObject *) core_audio_client; g_rec_mutex_unlock(core_audio_port_mutex); } break; case PROP_CORE_AUDIO_DEVICE: { GObject *core_audio_device; core_audio_device = g_value_get_object(value); g_rec_mutex_lock(core_audio_port_mutex); if(core_audio_port->core_audio_device == core_audio_device){ g_rec_mutex_unlock(core_audio_port_mutex); return; } if(core_audio_port->core_audio_device != NULL){ g_object_unref(core_audio_port->core_audio_device); } if(core_audio_device != NULL){ g_object_ref(core_audio_device); } core_audio_port->core_audio_device = (GObject *) core_audio_device; g_rec_mutex_unlock(core_audio_port_mutex); } break; case PROP_PORT_NAME: { gchar *port_name; port_name = g_value_get_string(value); g_rec_mutex_lock(core_audio_port_mutex); if(core_audio_port->port_name == port_name){ g_rec_mutex_unlock(core_audio_port_mutex); return; } if(core_audio_port->port_name != NULL){ g_free(core_audio_port->port_name); } core_audio_port->port_name = port_name; g_rec_mutex_unlock(core_audio_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCoreAudioPort *core_audio_port; GRecMutex *core_audio_port_mutex; core_audio_port = AGS_CORE_AUDIO_PORT(gobject); /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); switch(prop_id){ case PROP_CORE_AUDIO_CLIENT: { g_rec_mutex_lock(core_audio_port_mutex); g_value_set_object(value, core_audio_port->core_audio_client); g_rec_mutex_unlock(core_audio_port_mutex); } break; case PROP_CORE_AUDIO_DEVICE: { g_rec_mutex_lock(core_audio_port_mutex); g_value_set_object(value, core_audio_port->core_audio_device); g_rec_mutex_unlock(core_audio_port_mutex); } break; case PROP_PORT_NAME: { g_rec_mutex_lock(core_audio_port_mutex); g_value_set_string(value, core_audio_port->port_name); g_rec_mutex_unlock(core_audio_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_port_dispose(GObject *gobject) { AgsCoreAudioPort *core_audio_port; core_audio_port = AGS_CORE_AUDIO_PORT(gobject); /* core audio client */ if(core_audio_port->core_audio_client != NULL){ g_object_unref(core_audio_port->core_audio_client); core_audio_port->core_audio_client = NULL; } /* core audio device */ if(core_audio_port->core_audio_device != NULL){ g_object_unref(core_audio_port->core_audio_device); core_audio_port->core_audio_device = NULL; } /* call parent */ G_OBJECT_CLASS(ags_core_audio_port_parent_class)->dispose(gobject); } void ags_core_audio_port_finalize(GObject *gobject) { AgsCoreAudioPort *core_audio_port; core_audio_port = AGS_CORE_AUDIO_PORT(gobject); /* core audio client */ if(core_audio_port->core_audio_client != NULL){ g_object_unref(core_audio_port->core_audio_client); } /* core audio device */ if(core_audio_port->core_audio_device != NULL){ g_object_unref(core_audio_port->core_audio_device); } /* name */ g_free(core_audio_port->port_name); if(core_audio_port->midi_client != NULL){ free(core_audio_port->midi_client); } if(core_audio_port->midi_port != NULL){ free(core_audio_port->midi_port); } /* call parent */ G_OBJECT_CLASS(ags_core_audio_port_parent_class)->finalize(gobject); } AgsUUID* ags_core_audio_port_get_uuid(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; AgsUUID *ptr; GRecMutex *core_audio_port_mutex; core_audio_port = AGS_CORE_AUDIO_PORT(connectable); /* get core_audio port signal mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* get UUID */ g_rec_mutex_lock(core_audio_port_mutex); ptr = core_audio_port->uuid; g_rec_mutex_unlock(core_audio_port_mutex); return(ptr); } gboolean ags_core_audio_port_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_core_audio_port_is_ready(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; gboolean is_ready; core_audio_port = AGS_CORE_AUDIO_PORT(connectable); /* check is added */ is_ready = ags_core_audio_port_test_flags(core_audio_port, AGS_CORE_AUDIO_PORT_ADDED_TO_REGISTRY); return(is_ready); } void ags_core_audio_port_add_to_registry(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; if(ags_connectable_is_ready(connectable)){ return; } core_audio_port = AGS_CORE_AUDIO_PORT(connectable); ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_ADDED_TO_REGISTRY); } void ags_core_audio_port_remove_from_registry(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; if(!ags_connectable_is_ready(connectable)){ return; } core_audio_port = AGS_CORE_AUDIO_PORT(connectable); ags_core_audio_port_unset_flags(core_audio_port, AGS_CORE_AUDIO_PORT_ADDED_TO_REGISTRY); } xmlNode* ags_core_audio_port_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_core_audio_port_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_core_audio_port_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_core_audio_port_is_connected(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; gboolean is_connected; core_audio_port = AGS_CORE_AUDIO_PORT(connectable); /* check is connected */ is_connected = ags_core_audio_port_test_flags(core_audio_port, AGS_CORE_AUDIO_PORT_CONNECTED); return(is_connected); } void ags_core_audio_port_connect(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; if(ags_connectable_is_connected(connectable)){ return; } core_audio_port = AGS_CORE_AUDIO_PORT(connectable); ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_CONNECTED); } void ags_core_audio_port_disconnect(AgsConnectable *connectable) { AgsCoreAudioPort *core_audio_port; if(!ags_connectable_is_connected(connectable)){ return; } core_audio_port = AGS_CORE_AUDIO_PORT(connectable); ags_core_audio_port_unset_flags(core_audio_port, AGS_CORE_AUDIO_PORT_CONNECTED); } /** * ags_core_audio_port_test_flags: * @core_audio_port: the #AgsCoreAudioPort * @flags: the flags * * Test @flags to be set on @core_audio_port. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_core_audio_port_test_flags(AgsCoreAudioPort *core_audio_port, guint flags) { gboolean retval; GRecMutex *core_audio_port_mutex; if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port)){ return(FALSE); } /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* test */ g_rec_mutex_lock(core_audio_port_mutex); retval = (flags & (core_audio_port->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_port_mutex); return(retval); } /** * ags_core_audio_port_set_flags: * @core_audio_port: the #AgsCoreAudioPort * @flags: see #AgsCoreAudioPortFlags-enum * * Enable a feature of @core_audio_port. * * Since: 3.0.0 */ void ags_core_audio_port_set_flags(AgsCoreAudioPort *core_audio_port, guint flags) { GRecMutex *core_audio_port_mutex; if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port)){ return; } /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->flags |= flags; g_rec_mutex_unlock(core_audio_port_mutex); } /** * ags_core_audio_port_unset_flags: * @core_audio_port: the #AgsCoreAudioPort * @flags: see #AgsCoreAudioPortFlags-enum * * Disable a feature of @core_audio_port. * * Since: 3.0.0 */ void ags_core_audio_port_unset_flags(AgsCoreAudioPort *core_audio_port, guint flags) { GRecMutex *core_audio_port_mutex; if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port)){ return; } /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->flags &= (~flags); g_rec_mutex_unlock(core_audio_port_mutex); } /** * ags_core_audio_port_find: * @core_audio_port: (element-type AgsAudio.CoreAudioPort) (transfer none): the #GList-struct containing #AgsCoreAudioPort * @port_name: the port name to find * * Finds next match of @port_name in @core_audio_port. * * Returns: (element-type AgsAudio.CoreAudioPort) (transfer none): the next matching #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_core_audio_port_find(GList *core_audio_port, gchar *port_name) { gboolean success; GRecMutex *core_audio_port_mutex; while(core_audio_port != NULL){ /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port->data); /* check port name */ g_rec_mutex_lock(core_audio_port_mutex); success = (!g_ascii_strcasecmp(AGS_CORE_AUDIO_PORT(core_audio_port->data)->port_name, port_name)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_port_mutex); if(success){ return(core_audio_port); } } return(NULL); } #ifdef AGS_WITH_CORE_AUDIO OSStatus SetCurrentIOBufferFrameSize(AudioObjectID inDeviceID, UInt32 inIOBufferFrameSize) { AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyBufferFrameSize, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectSetPropertyData(inDeviceID, &theAddress, 0, NULL, sizeof(UInt32), &inIOBufferFrameSize); } #endif #ifdef AGS_WITH_CORE_AUDIO void* ags_core_audio_port_output_thread(AgsCoreAudioPort *core_audio_port) { ags_core_audio_port_output_run_loop = CFRunLoopGetCurrent(); g_atomic_int_set(&ags_core_audio_port_output_run_loop_initialized, TRUE); do{ CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE); }while(g_atomic_int_get(&(core_audio_port->output_running))); g_thread_exit(NULL); return(NULL); } void* ags_core_audio_port_input_thread(AgsCoreAudioPort *core_audio_port) { ags_core_audio_port_input_run_loop = CFRunLoopGetCurrent(); g_atomic_int_set(&ags_core_audio_port_input_run_loop_initialized, TRUE); do{ CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE); }while(g_atomic_int_get(&(core_audio_port->input_running))); g_thread_exit(NULL); return(NULL); } #endif /** * ags_core_audio_port_register: * @core_audio_port: the #AgsCoreAudioPort * @port_name: the name as string * @is_audio: if %TRUE interpreted as audio port * @is_midi: if %TRUE interpreted as midi port * @is_output: if %TRUE port is acting as output, otherwise as input * * Register a new core audio port and read uuid. Creates a new AgsSequencer or AgsSoundcard * object. * * Since: 3.0.0 */ void ags_core_audio_port_register(AgsCoreAudioPort *core_audio_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *core_audio_client; GList *list; gchar *name, *uuid; guint format; guint i; gboolean use_cache; #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; OSStatus retval; #else gpointer graph; #endif GRecMutex *core_audio_client_mutex; GRecMutex *core_audio_port_mutex; if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port) || port_name == NULL){ return; } g_object_get(core_audio_port, "core-audio-client", &core_audio_client, NULL); if(core_audio_client == NULL){ g_warning("ags_core_audio_port.c - no assigned AgsCore_AudioClient"); return; } if(ags_core_audio_port_test_flags(core_audio_port, AGS_CORE_AUDIO_PORT_REGISTERED)){ g_object_unref(core_audio_client); return; } /* get core_audio server and application context */ g_object_get(core_audio_client, "core-audio-server", &core_audio_server, NULL); if(core_audio_server == NULL){ g_object_unref(core_audio_client); return; } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* get graph */ g_rec_mutex_lock(core_audio_client_mutex); graph = core_audio_client->graph; g_rec_mutex_unlock(core_audio_client_mutex); if(graph == NULL){ g_object_unref(core_audio_client); g_object_unref(core_audio_server); return; } /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* get port name */ //FIXME:JK: memory leak? g_rec_mutex_lock(core_audio_port_mutex); port_name = g_strdup(core_audio_port->port_name); format = core_audio_port->format; use_cache = core_audio_port->use_cache; g_rec_mutex_unlock(core_audio_port_mutex); /* create sequencer or soundcard */ if(is_output){ ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_IS_OUTPUT); }else{ ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_IS_INPUT); } if(is_audio){ ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_IS_AUDIO); if(is_output){ GThread *thread; void **arr; guint word_size; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_message("core audio - unsupported word size"); } #ifdef AGS_WITH_CORE_AUDIO if(!g_atomic_int_get(&ags_core_audio_port_output_run_loop_initialized)){ g_atomic_int_set(&(core_audio_port->output_running), TRUE); thread = g_thread_new("Advanced Gtk+ Sequencer - core-audio output", ags_core_audio_port_output_thread, core_audio_port); while(!g_atomic_int_get(&ags_core_audio_port_output_run_loop_initialized)){ usleep(400); } } if(use_cache){ AudioQueueNewOutput(&(core_audio_port->data_format), ags_core_audio_port_cached_handle_output_buffer, core_audio_port, ags_core_audio_port_output_run_loop, NULL, 0, &(core_audio_port->aq_ref)); }else{ AudioQueueNewOutput(&(core_audio_port->data_format), ags_core_audio_port_handle_output_buffer, core_audio_port, ags_core_audio_port_output_run_loop, NULL, 0, &(core_audio_port->aq_ref)); } for(i = 0; i < 8; i++){ if(use_cache){ AudioQueueAllocateBuffer(core_audio_port->aq_ref, (core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint16)), &(core_audio_port->buf_ref[i])); }else{ AudioQueueAllocateBuffer(core_audio_port->aq_ref, (core_audio_port->pcm_channels * core_audio_port->buffer_size * sizeof(gint16)), &(core_audio_port->buf_ref[i])); } ags_core_audio_port_handle_output_buffer(core_audio_port, core_audio_port->aq_ref, core_audio_port->buf_ref[i]); } AudioQueueSetParameter(core_audio_port->aq_ref, kAudioQueueParam_Volume, 1.0); AudioQueueStart(core_audio_port->aq_ref, NULL); #endif }else{ GThread *thread; void **arr; guint word_size; switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_message("core audio - unsupported word size"); } #ifdef AGS_WITH_CORE_AUDIO if(!g_atomic_int_get(&ags_core_audio_port_input_run_loop_initialized)){ g_atomic_int_set(&(core_audio_port->input_running), TRUE); thread = g_thread_new("Advanced Gtk+ Sequencer - core-audio input", ags_core_audio_port_input_thread, core_audio_port); while(!g_atomic_int_get(&ags_core_audio_port_input_run_loop_initialized)){ usleep(400); } } #if 0 if(use_cache){ AudioQueueNewInput(&(core_audio_port->record_format), ags_core_audio_port_cached_handle_input_buffer, core_audio_port, ags_core_audio_port_input_run_loop, kCFRunLoopDefaultMode, 0, &(core_audio_port->record_aq_ref)); }else{ } #endif AudioQueueNewInput(&(core_audio_port->record_format), ags_core_audio_port_handle_input_buffer, core_audio_port, ags_core_audio_port_input_run_loop, kCFRunLoopDefaultMode, 0, &(core_audio_port->record_aq_ref)); for(i = 0; i < 16; i++){ AudioQueueAllocateBuffer(core_audio_port->record_aq_ref, (core_audio_port->pcm_channels * core_audio_port->buffer_size * sizeof(gint16)), &(core_audio_port->record_buf_ref[i])); AudioQueueEnqueueBuffer(core_audio_port->record_aq_ref, core_audio_port->record_buf_ref[i], 0, NULL); } AudioQueueSetParameter(core_audio_port->record_aq_ref, kAudioQueueParam_Volume, 1.0); AudioQueueStart(core_audio_port->record_aq_ref, NULL); #endif } }else if(is_midi){ ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_IS_MIDI); if(is_output){ //NOTE:JK: not implemented }else{ #ifdef AGS_WITH_CORE_AUDIO MIDIEndpointRef endpoint; retval = MIDIClientCreate(CFSTR("Advanced Gtk+ Sequencer - Core MIDI to System Sounds Demo"), NULL, core_audio_port, core_audio_port->midi_client); if(retval != noErr){ goto ags_core_audio_port_register_END; } retval = MIDIInputPortCreate(*(core_audio_port->midi_client), CFSTR("Input port"), ags_core_audio_port_midi_read_callback, core_audio_port, core_audio_port->midi_port); if(retval != noErr){ goto ags_core_audio_port_register_END; } endpoint = MIDIGetSource(core_audio_port->midi_port_number); if(endpoint == 0){ goto ags_core_audio_port_register_END; } retval = MIDIPortConnectSource(*(core_audio_port->midi_port), endpoint, NULL); if(retval != noErr){ goto ags_core_audio_port_register_END; } #endif } } ags_core_audio_port_set_flags(core_audio_port, AGS_CORE_AUDIO_PORT_REGISTERED); ags_core_audio_port_register_END: g_object_unref(core_audio_client); g_object_unref(core_audio_server); } void ags_core_audio_port_unregister(AgsCoreAudioPort *core_audio_port) { if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port)){ return; } g_atomic_int_set(&(core_audio_port->output_running), FALSE); g_atomic_int_set(&(core_audio_port->input_running), FALSE); //NOTE:JK: not implemented ags_core_audio_port_unset_flags(core_audio_port, AGS_CORE_AUDIO_PORT_REGISTERED); } #ifdef AGS_WITH_CORE_AUDIO void ags_core_audio_port_cached_handle_output_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer) { AgsCoreAudioDevout *core_audio_devout; AgsCoreAudioDevin *core_audio_devin; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; GObject *soundcard; struct timespec idle_time = { 0, 0, }; guint current_cache; guint next_cache, completed_cache; guint played_cache; guint word_size; guint frame_size; guint copy_mode; gboolean is_playing; GRecMutex *core_audio_port_mutex; if(core_audio_port == NULL){ return; } application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_devout = (AgsCoreAudioDevout *) core_audio_port->core_audio_device; switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S24); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, AGS_AUDIO_BUFFER_UTIL_S32); } break; } frame_size = core_audio_port->pcm_channels * core_audio_port->cache_buffer_size; in_buffer->mAudioDataByteSize = frame_size * sizeof(gint16); current_cache = core_audio_port->current_cache; g_rec_mutex_unlock(core_audio_port_mutex); soundcard = NULL; if(core_audio_devout != NULL){ soundcard = (GObject *) core_audio_devout; }else if(core_audio_devin != NULL){ soundcard = (GObject *) core_audio_devin; } is_playing = FALSE; if(ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard))){ if(current_cache == 3){ next_cache = 0; }else{ next_cache = current_cache + 1; } is_playing = TRUE; }else{ next_cache = 0; } /* wait until cache ready */ g_rec_mutex_lock(core_audio_port_mutex); completed_cache = core_audio_port->completed_cache; g_rec_mutex_unlock(core_audio_port_mutex); if(is_playing){ idle_time.tv_nsec = ags_core_audio_port_get_latency(core_audio_port) / 8; while(next_cache == completed_cache && ags_soundcard_is_playing(AGS_SOUNDCARD(soundcard))){ nanosleep(&idle_time, NULL); g_rec_mutex_lock(core_audio_port_mutex); completed_cache = core_audio_port->completed_cache; g_rec_mutex_unlock(core_audio_port_mutex); } if(current_cache == 0){ played_cache = 3; }else{ played_cache = current_cache - 1; } }else{ played_cache = 0; } // g_message("p %d", played_cache); ags_audio_buffer_util_clear_buffer(in_buffer->mAudioData, 1, (in_buffer->mAudioDataByteSize / sizeof(gint16)), AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_copy_buffer_to_buffer(in_buffer->mAudioData, 1, 0, core_audio_port->cache[played_cache], 1, 0, frame_size, copy_mode); AudioQueueEnqueueBuffer(core_audio_port->aq_ref, in_buffer, 0, NULL); /* seek current cache */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->current_cache = next_cache; g_rec_mutex_unlock(core_audio_port_mutex); /* unref */ g_object_unref(audio_loop); } void ags_core_audio_port_cached_handle_input_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer, const AudioTimeStamp *in_start_time, UInt32 in_num_packets, const AudioStreamPacketDescription *in_packet_desc) { //TODO:JK: implement me } void ags_core_audio_port_handle_output_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer) { AgsCoreAudioDevout *core_audio_devout; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; guint word_size; guint nth_buffer; guint copy_mode; guint count; guint i; gboolean is_playing; gboolean pass_through; gboolean no_event; gboolean empty_run; GRecMutex *core_audio_port_mutex; GRecMutex *device_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; if(core_audio_port == NULL){ return; } /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); if(g_atomic_int_get(&(core_audio_port->queued)) > 0){ g_warning("drop core audio output callback"); return; }else{ g_atomic_int_inc(&(core_audio_port->queued)); } /* * process audio */ /* */ application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); in_buffer->mAudioDataByteSize = core_audio_port->pcm_channels * core_audio_port->buffer_size * sizeof(gint16); ags_audio_buffer_util_clear_buffer(in_buffer->mAudioData, 1, (in_buffer->mAudioDataByteSize / sizeof(gint16)), AGS_AUDIO_BUFFER_UTIL_S16); if(audio_loop == NULL){ g_atomic_int_dec_and_test(&(core_audio_port->queued)); return; } /* */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_devout = core_audio_port->core_audio_device; g_rec_mutex_unlock(core_audio_port_mutex); /* get device mutex */ device_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* */ g_rec_mutex_lock(core_audio_port_mutex); empty_run = FALSE; switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: empty_run = TRUE; } count = core_audio_port->pcm_channels * core_audio_port->buffer_size; g_rec_mutex_unlock(core_audio_port_mutex); /* wait callback */ is_playing = ags_soundcard_is_playing(AGS_SOUNDCARD(core_audio_devout)); if(is_playing){ g_atomic_int_and(&(core_audio_devout->sync_flags), (~(AGS_CORE_AUDIO_DEVOUT_PASS_THROUGH))); } no_event = TRUE; if(is_playing){ callback_mutex = &(core_audio_devout->callback_mutex); /* give back computing time until ready */ if((AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); if((AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) == 0){ g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT); while((AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) == 0 && (AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ g_cond_wait(&(core_audio_devout->callback_cond), callback_mutex); } }else{ g_atomic_int_and(&(core_audio_devout->sync_flags), (~AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK)); } g_atomic_int_and(&(core_audio_devout->sync_flags), (~(AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT | AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; } } /* get buffer */ g_rec_mutex_lock(device_mutex); if((AGS_CORE_AUDIO_DEVOUT_BUFFER0 & (core_audio_devout->flags)) != 0){ nth_buffer = 7; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER1 & (core_audio_devout->flags)) != 0){ nth_buffer = 0; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER2 & (core_audio_devout->flags)) != 0){ nth_buffer = 1; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER3 & (core_audio_devout->flags)) != 0){ nth_buffer = 2; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER4 & (core_audio_devout->flags)) != 0){ nth_buffer = 3; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER5 & (core_audio_devout->flags)) != 0){ nth_buffer = 4; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER6 & (core_audio_devout->flags)) != 0){ nth_buffer = 5; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER7 & (core_audio_devout->flags)) != 0){ nth_buffer = 6; }else{ empty_run = TRUE; } switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: empty_run = TRUE; } g_rec_mutex_unlock(device_mutex); /* get copy mode */ if(!empty_run && is_playing){ g_atomic_int_set(&(core_audio_port->is_empty), FALSE); copy_mode = ags_audio_buffer_util_get_copy_mode(AGS_AUDIO_BUFFER_UTIL_S16, ags_audio_buffer_util_format_from_soundcard(core_audio_devout->format)); ags_soundcard_lock_buffer(AGS_SOUNDCARD(core_audio_devout), core_audio_devout->buffer[nth_buffer]); ags_audio_buffer_util_copy_buffer_to_buffer(in_buffer->mAudioData, 1, 0, core_audio_devout->buffer[nth_buffer], 1, 0, core_audio_port->pcm_channels * core_audio_port->buffer_size, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(core_audio_devout), core_audio_devout->buffer[nth_buffer]); } AudioQueueEnqueueBuffer(core_audio_port->aq_ref, in_buffer, 0, NULL); /* signal finish */ if(!no_event){ callback_finish_mutex = &(core_audio_devout->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devout->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } if(empty_run){ g_atomic_int_set(&(core_audio_port->is_empty), TRUE); } g_atomic_int_dec_and_test(&(core_audio_port->queued)); /* unref */ g_object_unref(audio_loop); } void ags_core_audio_port_handle_input_buffer(AgsCoreAudioPort *core_audio_port, AudioQueueRef in_audio_queue, AudioQueueBufferRef in_buffer, const AudioTimeStamp *in_start_time, UInt32 in_num_packets, const AudioStreamPacketDescription *in_packet_desc) { AgsCoreAudioDevin *core_audio_devin; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; guint word_size; guint nth_buffer; guint copy_mode; guint count; guint i; gboolean is_recording; gboolean pass_through; gboolean no_event; gboolean empty_run; GRecMutex *core_audio_port_mutex; GRecMutex *device_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; if(core_audio_port == NULL){ return; } /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); if(g_atomic_int_get(&(core_audio_port->queued)) > 0){ g_warning("drop core audio output callback"); return; }else{ g_atomic_int_inc(&(core_audio_port->queued)); } /* * process audio */ /* */ application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); if(audio_loop == NULL){ g_atomic_int_dec_and_test(&(core_audio_port->queued)); return; } /* */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_devin = core_audio_port->core_audio_device; g_rec_mutex_unlock(core_audio_port_mutex); /* get device mutex */ device_mutex = AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX(core_audio_devin); /* */ g_rec_mutex_lock(core_audio_port_mutex); empty_run = FALSE; switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: empty_run = TRUE; } count = core_audio_port->pcm_channels * core_audio_port->buffer_size; g_rec_mutex_unlock(core_audio_port_mutex); /* wait callback */ is_recording = ags_soundcard_is_recording(AGS_SOUNDCARD(core_audio_devin)); if(is_recording){ g_atomic_int_and(&(core_audio_devin->sync_flags), (~(AGS_CORE_AUDIO_DEVIN_PASS_THROUGH))); } no_event = TRUE; if(is_recording){ callback_mutex = &(core_audio_devin->callback_mutex); /* give back computing time until ready */ if((AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); if((AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) == 0){ g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT); while((AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) == 0 && (AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ g_cond_wait(&(core_audio_devin->callback_cond), callback_mutex); } }else{ g_atomic_int_and(&(core_audio_devin->sync_flags), (~AGS_CORE_AUDIO_DEVIN_INITIAL_CALLBACK)); } g_atomic_int_and(&(core_audio_devin->sync_flags), (~(AGS_CORE_AUDIO_DEVIN_CALLBACK_WAIT | AGS_CORE_AUDIO_DEVIN_CALLBACK_DONE))); g_mutex_unlock(callback_mutex); no_event = FALSE; } } /* get buffer */ g_rec_mutex_lock(device_mutex); if((AGS_CORE_AUDIO_DEVIN_BUFFER0 & (core_audio_devin->flags)) != 0){ nth_buffer = 0; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER1 & (core_audio_devin->flags)) != 0){ nth_buffer = 1; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER2 & (core_audio_devin->flags)) != 0){ nth_buffer = 2; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER3 & (core_audio_devin->flags)) != 0){ nth_buffer = 3; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER4 & (core_audio_devin->flags)) != 0){ nth_buffer = 4; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER5 & (core_audio_devin->flags)) != 0){ nth_buffer = 5; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER6 & (core_audio_devin->flags)) != 0){ nth_buffer = 6; }else if((AGS_CORE_AUDIO_DEVIN_BUFFER7 & (core_audio_devin->flags)) != 0){ nth_buffer = 7; }else{ empty_run = TRUE; } word_size = 0; switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: empty_run = TRUE; } g_rec_mutex_unlock(device_mutex); /* get copy mode */ if(!empty_run && is_recording){ g_atomic_int_set(&(core_audio_port->is_empty), FALSE); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(core_audio_devin->format), AGS_AUDIO_BUFFER_UTIL_S16); #if 0 g_message("%d: %x %x %x %x", core_audio_port->pcm_channels * core_audio_port->buffer_size, ((gint16 *) in_buffer->mAudioData)[0], ((gint16 *) in_buffer->mAudioData)[1], ((gint16 *) in_buffer->mAudioData)[2], ((gint16 *) in_buffer->mAudioData)[3]); #endif ags_soundcard_lock_buffer(AGS_SOUNDCARD(core_audio_devin), core_audio_devin->buffer[nth_buffer]); ags_audio_buffer_util_copy_buffer_to_buffer(core_audio_devin->buffer[nth_buffer], 1, 0, in_buffer->mAudioData, 1, 0, core_audio_port->pcm_channels * core_audio_port->buffer_size, copy_mode); ags_soundcard_unlock_buffer(AGS_SOUNDCARD(core_audio_devin), core_audio_devin->buffer[nth_buffer]); } in_buffer->mAudioDataByteSize = core_audio_port->pcm_channels * core_audio_port->buffer_size * sizeof(gint16); ags_audio_buffer_util_clear_buffer(in_buffer->mAudioData, 1, (in_buffer->mAudioDataByteSize / sizeof(gint16)), AGS_AUDIO_BUFFER_UTIL_S16); AudioQueueEnqueueBuffer(core_audio_port->record_aq_ref, in_buffer, 0, NULL); /* signal finish */ if(!no_event){ callback_finish_mutex = &(core_audio_devin->callback_finish_mutex); g_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(core_audio_devin->sync_flags), AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_DONE); if((AGS_CORE_AUDIO_DEVIN_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_devin->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } if(empty_run){ g_atomic_int_set(&(core_audio_port->is_empty), TRUE); } g_atomic_int_dec_and_test(&(core_audio_port->queued)); /* unref */ g_object_unref(audio_loop); } void ags_core_audio_port_midi_notify_callback(const MIDINotification *message, void *ref_con) { //NOTE:JK: unused } void ags_core_audio_port_midi_read_callback(const MIDIPacketList *pkt_list, void *ref_con, void *conn_ref_con) { AgsCoreAudioPort *core_audio_port; AgsCoreAudioMidiin *core_audio_midiin; AgsAudioLoop *audio_loop; AgsApplicationContext *application_context; MIDIPacket *packet; guint nth_buffer; gint num_packets; gint i; gboolean no_event; GRecMutex *core_audio_port_mutex; GRecMutex *device_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_port = (AgsCoreAudioPort *) ref_con; if(core_audio_port == NULL){ return; } /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* * process midi */ /* */ application_context = ags_application_context_get_instance(); audio_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); /* */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_midiin = core_audio_port->core_audio_device; g_rec_mutex_unlock(core_audio_port_mutex); /* get device mutex */ device_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(core_audio_midiin); /* */ g_rec_mutex_lock(device_mutex); callback_mutex = &(core_audio_midiin->callback_mutex); callback_finish_mutex = &(core_audio_midiin->callback_finish_mutex); /* wait callback */ g_atomic_int_inc(&(core_audio_port->queued)); no_event = TRUE; if((AGS_CORE_AUDIO_MIDIIN_PASS_THROUGH & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) == 0){ g_rec_mutex_unlock(device_mutex); /* force wait */ g_atomic_int_or(&(core_audio_midiin->sync_flags), AGS_CORE_AUDIO_MIDIIN_DO_SYNC); /* wait callback */ g_mutex_lock(callback_mutex); if((AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE)); while((AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) == 0 && (AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) != 0){ g_cond_wait(&(core_audio_midiin->callback_cond), callback_mutex); } } g_mutex_unlock(callback_mutex); g_atomic_int_or(&(core_audio_midiin->sync_flags), (AGS_CORE_AUDIO_MIDIIN_CALLBACK_WAIT | AGS_CORE_AUDIO_MIDIIN_CALLBACK_DONE)); /* lock device */ g_rec_mutex_lock(device_mutex); no_event = FALSE; }else{ g_atomic_int_set(&(core_audio_port->is_empty), TRUE); } /* get buffer */ if((AGS_CORE_AUDIO_MIDIIN_BUFFER0 & (core_audio_midiin->flags)) != 0){ nth_buffer = 1; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER1 & (core_audio_midiin->flags)) != 0){ nth_buffer = 2; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER2 & (core_audio_midiin->flags)) != 0){ nth_buffer = 3; }else if((AGS_CORE_AUDIO_MIDIIN_BUFFER3 & (core_audio_midiin->flags)) != 0){ nth_buffer = 0; } packet = &pkt_list->packet[0]; num_packets = pkt_list->numPackets; for(i = 0; i < num_packets; i++){ guint length; length = packet->length; if(length == 0){ packet = MIDIPacketNext(packet); continue; } if(ceil((core_audio_midiin->buffer_size[nth_buffer] + length) / 4096.0) > ceil(core_audio_midiin->buffer_size[nth_buffer] / 4096.0)){ if(core_audio_midiin->buffer[nth_buffer] == NULL){ core_audio_midiin->buffer[nth_buffer] = malloc(4096 * sizeof(char)); }else{ core_audio_midiin->buffer[nth_buffer] = realloc(core_audio_midiin->buffer[nth_buffer], (ceil(core_audio_midiin->buffer_size[nth_buffer] / 4096.0) * 4096 + 4096) * sizeof(char)); } } memcpy(&(core_audio_midiin->buffer[nth_buffer][core_audio_midiin->buffer_size[nth_buffer]]), packet->data, length); core_audio_midiin->buffer_size[nth_buffer] += length; packet = MIDIPacketNext(packet); } /* signal finish */ if(!no_event){ g_rec_mutex_unlock(device_mutex); /* signal client - wait callback finish */ g_mutex_lock(callback_finish_mutex); g_atomic_int_and(&(core_audio_midiin->sync_flags), (~AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_WAIT)); if((AGS_CORE_AUDIO_MIDIIN_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(core_audio_midiin->sync_flags)))) == 0){ g_cond_signal(&(core_audio_midiin->callback_finish_cond)); } g_mutex_unlock(callback_finish_mutex); } g_atomic_int_dec_and_test(&(core_audio_port->queued)); } #endif void ags_core_audio_port_set_format(AgsCoreAudioPort *core_audio_port, guint format) { GRecMutex *core_audio_port_mutex; /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->format = format; g_rec_mutex_unlock(core_audio_port_mutex); } void ags_core_audio_port_set_samplerate(AgsCoreAudioPort *core_audio_port, guint samplerate) { GRecMutex *core_audio_port_mutex; /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* */ g_rec_mutex_lock(core_audio_port_mutex); #ifdef AGS_WITH_CORE_AUDIO core_audio_port->data_format.mSampleRate = (float) samplerate; #endif core_audio_port->samplerate = samplerate; g_rec_mutex_unlock(core_audio_port_mutex); } void ags_core_audio_port_set_buffer_size(AgsCoreAudioPort *core_audio_port, guint buffer_size) { GRecMutex *core_audio_port_mutex; /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* */ g_rec_mutex_lock(core_audio_port_mutex); #ifdef AGS_WITH_CORE_AUDIO //TODO:JK: implement me #endif core_audio_port->buffer_size = buffer_size; g_rec_mutex_unlock(core_audio_port_mutex); } void ags_core_audio_port_set_pcm_channels(AgsCoreAudioPort *core_audio_port, guint pcm_channels) { GRecMutex *core_audio_port_mutex; /* get core-audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* */ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->pcm_channels = pcm_channels; #ifdef AGS_WITH_CORE_AUDIO core_audio_port->data_format.mChannelsPerFrame = pcm_channels; #endif g_rec_mutex_unlock(core_audio_port_mutex); } void ags_core_audio_port_set_cache_buffer_size(AgsCoreAudioPort *core_audio_port, guint cache_buffer_size) { GRecMutex *core_audio_port_mutex; /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* lock core_audio port */ g_rec_mutex_lock(core_audio_port_mutex); switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { core_audio_port->cache[0] = (void *) realloc(core_audio_port->cache[0], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[1] = (void *) realloc(core_audio_port->cache[1], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[2] = (void *) realloc(core_audio_port->cache[2], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[3] = (void *) realloc(core_audio_port->cache[3], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { core_audio_port->cache[0] = (void *) realloc(core_audio_port->cache[0], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[1] = (void *) realloc(core_audio_port->cache[1], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[2] = (void *) realloc(core_audio_port->cache[2], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[3] = (void *) realloc(core_audio_port->cache[3], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { core_audio_port->cache[0] = (void *) realloc(core_audio_port->cache[0], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[1] = (void *) realloc(core_audio_port->cache[1], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[2] = (void *) realloc(core_audio_port->cache[2], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); core_audio_port->cache[3] = (void *) realloc(core_audio_port->cache[3], core_audio_port->pcm_channels * core_audio_port->cache_buffer_size * sizeof(gint32)); } break; default: g_warning("core_audio devout - unsupported format"); } g_rec_mutex_unlock(core_audio_port_mutex); } /** * ags_core_audio_port_get_latency: * @core_audio_port: the #AgsCoreAudioPort * * Gets latency. * * Since: 3.0.0 */ guint ags_core_audio_port_get_latency(AgsCoreAudioPort *core_audio_port) { guint latency; GRecMutex *core_audio_port_mutex; /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* lock core_audio port */ g_rec_mutex_lock(core_audio_port_mutex); latency = 0; #ifdef AGS_WITH_CORE_AUDIO if(core_audio_port->use_cache){ latency = (guint) floor((gdouble) NSEC_PER_SEC / (gdouble) core_audio_port->samplerate * (gdouble) core_audio_port->cache_buffer_size); }else{ latency = (guint) floor((gdouble) NSEC_PER_SEC / (gdouble) core_audio_port->samplerate * (gdouble) core_audio_port->buffer_size); } #endif g_rec_mutex_unlock(core_audio_port_mutex); return(latency); } /** * ags_core_audio_port_new: * @core_audio_client: the #AgsCoreAudioClient assigned to * * Create a new instance of #AgsCoreAudioPort. * * Returns: the new #AgsCoreAudioPort * * Since: 3.0.0 */ AgsCoreAudioPort* ags_core_audio_port_new(GObject *core_audio_client) { AgsCoreAudioPort *core_audio_port; core_audio_port = (AgsCoreAudioPort *) g_object_new(AGS_TYPE_CORE_AUDIO_PORT, "core-audio-client", core_audio_client, NULL); return(core_audio_port); } gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_server.c0000644000175000017500000014267013613101164021205 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_core_audio_server_class_init(AgsCoreAudioServerClass *core_audio_server); void ags_core_audio_server_connectable_interface_init(AgsConnectableInterface *connectable); void ags_core_audio_server_sound_server_interface_init(AgsSoundServerInterface *sound_server); void ags_core_audio_server_init(AgsCoreAudioServer *core_audio_server); void ags_core_audio_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_core_audio_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_core_audio_server_dispose(GObject *gobject); void ags_core_audio_server_finalize(GObject *gobject); AgsUUID* ags_core_audio_server_get_uuid(AgsConnectable *connectable); gboolean ags_core_audio_server_has_resource(AgsConnectable *connectable); gboolean ags_core_audio_server_is_ready(AgsConnectable *connectable); void ags_core_audio_server_add_to_registry(AgsConnectable *connectable); void ags_core_audio_server_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_core_audio_server_list_resource(AgsConnectable *connectable); xmlNode* ags_core_audio_server_xml_compose(AgsConnectable *connectable); void ags_core_audio_server_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_core_audio_server_is_connected(AgsConnectable *connectable); void ags_core_audio_server_connect(AgsConnectable *connectable); void ags_core_audio_server_disconnect(AgsConnectable *connectable); void ags_core_audio_server_set_url(AgsSoundServer *sound_server, gchar *url); gchar* ags_core_audio_server_get_url(AgsSoundServer *sound_server); void ags_core_audio_server_set_ports(AgsSoundServer *sound_server, guint *ports, guint port_count); guint* ags_core_audio_server_get_ports(AgsSoundServer *sound_server, guint *port_count); void ags_core_audio_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard); GList* ags_core_audio_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid); void ags_core_audio_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer); GList* ags_core_audio_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid); GObject* ags_core_audio_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output); void ags_core_audio_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard); GObject* ags_core_audio_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output); void ags_core_audio_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer); void* ags_core_audio_server_do_poll_loop(void *ptr); /** * SECTION:ags_core_audio_server * @short_description: core audio instance * @title: AgsCoreAudioServer * @section_id: * @include: ags/audio/core-audio/ags_core_audio_server.h * * The #AgsCoreAudioServer is an object to represent a running core audio instance. */ enum{ PROP_0, PROP_URL, PROP_DEFAULT_SOUNDCARD, PROP_DEFAULT_CORE_AUDIO_CLIENT, PROP_CORE_AUDIO_CLIENT, }; static gpointer ags_core_audio_server_parent_class = NULL; GType ags_core_audio_server_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_core_audio_server = 0; static const GTypeInfo ags_core_audio_server_info = { sizeof(AgsCoreAudioServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_core_audio_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCoreAudioServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_core_audio_server_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_core_audio_server_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_server_interface_info = { (GInterfaceInitFunc) ags_core_audio_server_sound_server_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_core_audio_server = g_type_register_static(G_TYPE_OBJECT, "AgsCoreAudioServer", &ags_core_audio_server_info, 0); g_type_add_interface_static(ags_type_core_audio_server, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_core_audio_server, AGS_TYPE_SOUND_SERVER, &ags_sound_server_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_core_audio_server); } return g_define_type_id__volatile; } void ags_core_audio_server_class_init(AgsCoreAudioServerClass *core_audio_server) { GObjectClass *gobject; GParamSpec *param_spec; ags_core_audio_server_parent_class = g_type_class_peek_parent(core_audio_server); /* GObjectClass */ gobject = (GObjectClass *) core_audio_server; gobject->set_property = ags_core_audio_server_set_property; gobject->get_property = ags_core_audio_server_get_property; gobject->dispose = ags_core_audio_server_dispose; gobject->finalize = ags_core_audio_server_finalize; /* properties */ /** * AgsCoreAudioServer:url: * * The assigned URL. * * Since: 3.0.0 */ param_spec = g_param_spec_string("url", i18n_pspec("the URL"), i18n_pspec("The URL"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URL, param_spec); /** * AgsCoreAudioServer:default-soundcard: * * The default soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-soundcard", i18n_pspec("default soundcard"), i18n_pspec("The default soundcard"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_SOUNDCARD, param_spec); /** * AgsCoreAudioServer:default-core-audio-client: * * The default core audio client. * * Since: 3.0.0 */ param_spec = g_param_spec_object("default-core-audio-client", i18n_pspec("default core audio client"), i18n_pspec("The default core audio client"), AGS_TYPE_CORE_AUDIO_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_CORE_AUDIO_CLIENT, param_spec); /** * AgsCoreAudioServer:core-audio-client: (type GList(AgsCoreAudioClient)) (transfer full) * * The core audio client list. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("core-audio-client", i18n_pspec("core audio client list"), i18n_pspec("The core audio client list"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_CLIENT, param_spec); } void ags_core_audio_server_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_core_audio_server_get_uuid; connectable->has_resource = ags_core_audio_server_has_resource; connectable->is_ready = ags_core_audio_server_is_ready; connectable->add_to_registry = ags_core_audio_server_add_to_registry; connectable->remove_from_registry = ags_core_audio_server_remove_from_registry; connectable->list_resource = ags_core_audio_server_list_resource; connectable->xml_compose = ags_core_audio_server_xml_compose; connectable->xml_parse = ags_core_audio_server_xml_parse; connectable->is_connected = ags_core_audio_server_is_connected; connectable->connect = ags_core_audio_server_connect; connectable->disconnect = ags_core_audio_server_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_core_audio_server_sound_server_interface_init(AgsSoundServerInterface *sound_server) { sound_server->set_url = ags_core_audio_server_set_url; sound_server->get_url = ags_core_audio_server_get_url; sound_server->set_ports = ags_core_audio_server_set_ports; sound_server->get_ports = ags_core_audio_server_get_ports; sound_server->set_soundcard = ags_core_audio_server_set_soundcard; sound_server->get_soundcard = ags_core_audio_server_get_soundcard; sound_server->set_sequencer = ags_core_audio_server_set_sequencer; sound_server->get_sequencer = ags_core_audio_server_get_sequencer; sound_server->register_soundcard = ags_core_audio_server_register_soundcard; sound_server->unregister_soundcard = ags_core_audio_server_unregister_soundcard; sound_server->register_sequencer = ags_core_audio_server_register_sequencer; sound_server->unregister_sequencer = ags_core_audio_server_unregister_sequencer; } void ags_core_audio_server_init(AgsCoreAudioServer *core_audio_server) { /* flags */ core_audio_server->flags = 0; /* server mutex */ g_rec_mutex_init(&(core_audio_server->obj_mutex)); g_atomic_int_set(&(core_audio_server->running), TRUE); core_audio_server->thread = NULL; /* uuid */ core_audio_server->uuid = ags_uuid_alloc(); ags_uuid_generate(core_audio_server->uuid); core_audio_server->url = NULL; core_audio_server->port = NULL; core_audio_server->port_count = 0; core_audio_server->n_soundcards = 0; core_audio_server->n_sequencers = 0; core_audio_server->default_soundcard = NULL; core_audio_server->default_client = NULL; core_audio_server->client = NULL; } void ags_core_audio_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCoreAudioServer *core_audio_server; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(gobject); /* get core-audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); switch(prop_id){ case PROP_URL: { gchar *url; url = g_value_get_string(value); g_rec_mutex_lock(core_audio_server_mutex); if(core_audio_server->url == url){ g_rec_mutex_unlock(core_audio_server_mutex); return; } if(core_audio_server->url != NULL){ g_free(core_audio_server->url); } core_audio_server->url = g_strdup(url); g_rec_mutex_unlock(core_audio_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { GObject *default_soundcard; default_soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(core_audio_server_mutex); if(core_audio_server->default_soundcard == (GObject *) default_soundcard){ g_rec_mutex_unlock(core_audio_server_mutex); return; } if(core_audio_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(core_audio_server->default_soundcard)); } if(default_soundcard != NULL){ g_object_ref(G_OBJECT(default_soundcard)); } core_audio_server->default_soundcard = (GObject *) default_soundcard; g_rec_mutex_unlock(core_audio_server_mutex); } break; case PROP_DEFAULT_CORE_AUDIO_CLIENT: { AgsCoreAudioClient *default_client; default_client = (AgsCoreAudioClient *) g_value_get_object(value); g_rec_mutex_lock(core_audio_server_mutex); if(core_audio_server->default_client == (GObject *) default_client){ g_rec_mutex_unlock(core_audio_server_mutex); return; } if(core_audio_server->default_client != NULL){ g_object_unref(G_OBJECT(core_audio_server->default_client)); } if(default_client != NULL){ g_object_ref(G_OBJECT(default_client)); } core_audio_server->default_client = (GObject *) default_client; g_rec_mutex_unlock(core_audio_server_mutex); } break; case PROP_CORE_AUDIO_CLIENT: { GObject *client; client = (GObject *) g_value_get_pointer(value); g_rec_mutex_lock(core_audio_server_mutex); if(!AGS_IS_CORE_AUDIO_CLIENT(client) || g_list_find(core_audio_server->client, client) != NULL){ g_rec_mutex_unlock(core_audio_server_mutex); return; } g_object_ref(G_OBJECT(client)); core_audio_server->client = g_list_prepend(core_audio_server->client, client); g_rec_mutex_unlock(core_audio_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCoreAudioServer *core_audio_server; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(gobject); /* get core-audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); switch(prop_id){ case PROP_URL: { g_rec_mutex_lock(core_audio_server_mutex); g_value_set_string(value, core_audio_server->url); g_rec_mutex_unlock(core_audio_server_mutex); } break; case PROP_DEFAULT_SOUNDCARD: { g_rec_mutex_lock(core_audio_server_mutex); g_value_set_object(value, core_audio_server->default_soundcard); g_rec_mutex_unlock(core_audio_server_mutex); } break; case PROP_DEFAULT_CORE_AUDIO_CLIENT: { g_rec_mutex_lock(core_audio_server_mutex); g_value_set_object(value, core_audio_server->default_client); g_rec_mutex_unlock(core_audio_server_mutex); } break; case PROP_CORE_AUDIO_CLIENT: { g_rec_mutex_lock(core_audio_server_mutex); g_value_set_pointer(value, g_list_copy_deep(core_audio_server->client, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(core_audio_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_server_dispose(GObject *gobject) { AgsCoreAudioServer *core_audio_server; GList *list; core_audio_server = AGS_CORE_AUDIO_SERVER(gobject); /* default soundcard */ if(core_audio_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(core_audio_server->default_soundcard)); core_audio_server->default_soundcard = NULL; } /* default client */ if(core_audio_server->default_client != NULL){ g_object_unref(G_OBJECT(core_audio_server->default_client)); core_audio_server->default_client = NULL; } /* client */ if(core_audio_server->client != NULL){ list = core_audio_server->client; while(list != NULL){ g_object_run_dispose(G_OBJECT(list->data)); list = list->next; } g_list_free_full(core_audio_server->client, g_object_unref); core_audio_server->client = NULL; } /* call parent */ G_OBJECT_CLASS(ags_core_audio_server_parent_class)->dispose(gobject); } void ags_core_audio_server_finalize(GObject *gobject) { AgsCoreAudioServer *core_audio_server; core_audio_server = AGS_CORE_AUDIO_SERVER(gobject); /* url */ g_free(core_audio_server->url); /* default soundcard */ if(core_audio_server->default_soundcard != NULL){ g_object_unref(G_OBJECT(core_audio_server->default_soundcard)); } /* default client */ if(core_audio_server->default_client != NULL){ g_object_unref(G_OBJECT(core_audio_server->default_client)); } /* client */ if(core_audio_server->client != NULL){ g_list_free_full(core_audio_server->client, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_core_audio_server_parent_class)->finalize(gobject); } AgsUUID* ags_core_audio_server_get_uuid(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; AgsUUID *ptr; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); /* get core_audio server signal mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get UUID */ g_rec_mutex_lock(core_audio_server_mutex); ptr = core_audio_server->uuid; g_rec_mutex_unlock(core_audio_server_mutex); return(ptr); } gboolean ags_core_audio_server_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_core_audio_server_is_ready(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; gboolean is_ready; core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); /* check is added */ is_ready = ags_core_audio_server_test_flags(core_audio_server, AGS_CORE_AUDIO_SERVER_ADDED_TO_REGISTRY); return(is_ready); } void ags_core_audio_server_add_to_registry(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; if(ags_connectable_is_ready(connectable)){ return; } core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); ags_core_audio_server_set_flags(core_audio_server, AGS_CORE_AUDIO_SERVER_ADDED_TO_REGISTRY); } void ags_core_audio_server_remove_from_registry(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; if(!ags_connectable_is_ready(connectable)){ return; } core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); ags_core_audio_server_unset_flags(core_audio_server, AGS_CORE_AUDIO_SERVER_ADDED_TO_REGISTRY); } xmlNode* ags_core_audio_server_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_core_audio_server_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_core_audio_server_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_core_audio_server_is_connected(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; gboolean is_connected; core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); /* check is connected */ is_connected = ags_core_audio_server_test_flags(core_audio_server, AGS_CORE_AUDIO_SERVER_CONNECTED); return(is_connected); } void ags_core_audio_server_connect(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; GList *list_start, *list; GRecMutex *core_audio_server_mutex; if(ags_connectable_is_connected(connectable)){ return; } core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); ags_core_audio_server_set_flags(core_audio_server, AGS_CORE_AUDIO_SERVER_CONNECTED); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); list = list_start = g_list_copy(core_audio_server->client); while(list != NULL){ ags_connectable_connect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } void ags_core_audio_server_disconnect(AgsConnectable *connectable) { AgsCoreAudioServer *core_audio_server; GList *list_start, *list; GRecMutex *core_audio_server_mutex; if(!ags_connectable_is_connected(connectable)){ return; } core_audio_server = AGS_CORE_AUDIO_SERVER(connectable); ags_core_audio_server_unset_flags(core_audio_server, AGS_CORE_AUDIO_SERVER_CONNECTED); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* client */ list = list_start = g_list_copy(core_audio_server->client); while(list != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(list->data)); list = list->next; } g_list_free(list_start); } /** * ags_core_audio_server_test_flags: * @core_audio_server: the #AgsCoreAudioServer * @flags: the flags * * Test @flags to be set on @core_audio_server. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_core_audio_server_test_flags(AgsCoreAudioServer *core_audio_server, guint flags) { gboolean retval; GRecMutex *core_audio_server_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server)){ return(FALSE); } /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* test */ g_rec_mutex_lock(core_audio_server_mutex); retval = (flags & (core_audio_server->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_server_mutex); return(retval); } /** * ags_core_audio_server_set_flags: * @core_audio_server: the #AgsCoreAudioServer * @flags: see #AgsCoreAudioServerFlags-enum * * Enable a feature of @core_audio_server. * * Since: 3.0.0 */ void ags_core_audio_server_set_flags(AgsCoreAudioServer *core_audio_server, guint flags) { GRecMutex *core_audio_server_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server)){ return; } /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->flags |= flags; g_rec_mutex_unlock(core_audio_server_mutex); } /** * ags_core_audio_server_unset_flags: * @core_audio_server: the #AgsCoreAudioServer * @flags: see #AgsCoreAudioServerFlags-enum * * Disable a feature of @core_audio_server. * * Since: 3.0.0 */ void ags_core_audio_server_unset_flags(AgsCoreAudioServer *core_audio_server, guint flags) { GRecMutex *core_audio_server_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server)){ return; } /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->flags &= (~flags); g_rec_mutex_unlock(core_audio_server_mutex); } void ags_core_audio_server_set_url(AgsSoundServer *sound_server, gchar *url) { AgsCoreAudioServer *core_audio_server; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* set URL */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->url = g_strdup(url); g_rec_mutex_unlock(core_audio_server_mutex); } gchar* ags_core_audio_server_get_url(AgsSoundServer *sound_server) { AgsCoreAudioServer *core_audio_server; gchar *url; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* set URL */ g_rec_mutex_lock(core_audio_server_mutex); url = core_audio_server->url; g_rec_mutex_unlock(core_audio_server_mutex); return(url); } void ags_core_audio_server_set_ports(AgsSoundServer *sound_server, guint *port, guint port_count) { AgsCoreAudioServer *core_audio_server; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* set ports */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->port = port; core_audio_server->port_count = port_count; g_rec_mutex_unlock(core_audio_server_mutex); } guint* ags_core_audio_server_get_ports(AgsSoundServer *sound_server, guint *port_count) { AgsCoreAudioServer *core_audio_server; guint *port; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get ports */ g_rec_mutex_lock(core_audio_server_mutex); if(port_count != NULL){ *port_count = AGS_CORE_AUDIO_SERVER(sound_server)->port_count; } port = core_audio_server->port; g_rec_mutex_unlock(core_audio_server_mutex); return(port); } void ags_core_audio_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *core_audio_client; GList *list; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); core_audio_client = (AgsCoreAudioClient *) ags_core_audio_server_find_client(core_audio_server, client_uuid); if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } //NOTE:JK: soundcard won't removed list = soundcard; while(list != NULL){ ags_core_audio_client_add_device(core_audio_client, (GObject *) list->data); list = list->next; } } GList* ags_core_audio_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *core_audio_client; GList *device_start, *device; GList *list; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); core_audio_client = (AgsCoreAudioClient *) ags_core_audio_server_find_client(core_audio_server, client_uuid); if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return(NULL); } g_object_get(core_audio_client, "device", &device_start, NULL); device = device_start; list = NULL; while(device != NULL){ if(AGS_IS_CORE_AUDIO_DEVOUT(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } g_list_free_full(device_start, g_object_unref); return(g_list_reverse(list)); } void ags_core_audio_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *core_audio_client; GList *list; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); core_audio_client = (AgsCoreAudioClient *) ags_core_audio_server_find_client(core_audio_server, client_uuid); if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } //NOTE:JK: sequencer won't removed list = sequencer; while(list != NULL){ ags_core_audio_client_add_device(core_audio_client, (GObject *) list->data); list = list->next; } } GList* ags_core_audio_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *core_audio_client; GList *device_start, *device; GList *list; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); core_audio_client = (AgsCoreAudioClient *) ags_core_audio_server_find_client(core_audio_server, client_uuid); if(!AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return(NULL); } g_object_get(core_audio_client, "device", &device_start, NULL); device = device_start; list = NULL; #if 0 while(device != NULL){ if(AGS_IS_CORE_AUDIO_MIDIIN(device->data)){ list = g_list_prepend(list, device->data); g_object_ref(device->data); } device = device->next; } #endif g_list_free_full(device_start, g_object_unref); return(g_list_reverse(list)); } GObject* ags_core_audio_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *default_client; AgsCoreAudioPort *core_audio_port; AgsCoreAudioDevout *core_audio_devout; AgsCoreAudioDevin *core_audio_devin; AgsApplicationContext *application_context; GObject *soundcard; #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif gchar *str; guint n_soundcards; gboolean initial_set; guint i; GRecMutex *core_audio_server_mutex; GRecMutex *core_audio_client_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); application_context = ags_application_context_get_instance(); /* get core audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* the default client */ initial_set = FALSE; /* get some fields */ g_rec_mutex_lock(core_audio_server_mutex); default_client = (AgsCoreAudioClient *) core_audio_server->default_client; n_soundcards = core_audio_server->n_soundcards; g_rec_mutex_unlock(core_audio_server_mutex); /* the default client */ if(default_client == NULL){ default_client = ags_core_audio_client_new((GObject *) core_audio_server); g_object_set(core_audio_server, "default-core-audio-client", default_client, NULL); ags_core_audio_server_add_client(core_audio_server, (GObject *) default_client); ags_core_audio_client_open((AgsCoreAudioClient *) default_client, "ags-default-client"); initial_set = TRUE; } /* get core audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(default_client); /* get graph */ g_rec_mutex_lock(core_audio_client_mutex); graph = default_client->graph; g_rec_mutex_unlock(core_audio_client_mutex); if(graph == NULL){ g_warning("ags_core_audio_server.c - can't open core audio client"); } soundcard = NULL; /* the soundcard */ if(is_output){ core_audio_devout = ags_core_audio_devout_new(); soundcard = (GObject *) core_audio_devout; str = g_strdup_printf("ags-core-audio-devout-%d", n_soundcards); g_object_set(AGS_CORE_AUDIO_DEVOUT(core_audio_devout), "core-audio-client", default_client, "device", str, NULL); g_free(str); /* register ports */ core_audio_port = ags_core_audio_port_new((GObject *) default_client); str = g_strdup_printf("ags-soundcard%d", n_soundcards); g_object_set(core_audio_port, "core-audio-device", core_audio_devout, NULL); ags_core_audio_client_add_port(default_client, (GObject *) core_audio_port); g_object_set(core_audio_devout, "core-audio-port", core_audio_port, NULL); core_audio_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); core_audio_devout->port_name[0] = g_strdup(str); core_audio_devout->port_name[1] = NULL; ags_core_audio_port_register(core_audio_port, str, TRUE, FALSE, TRUE); ags_core_audio_devout_realloc_buffer(core_audio_devout); g_object_set(default_client, "device", core_audio_devout, NULL); /* increment n-soundcards */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->n_soundcards += 1; g_rec_mutex_unlock(core_audio_server_mutex); }else{ core_audio_devin = ags_core_audio_devin_new(); soundcard = (GObject *) core_audio_devin; str = g_strdup_printf("ags-core-audio-devin-%d", n_soundcards); g_object_set(AGS_CORE_AUDIO_DEVIN(core_audio_devin), "core-audio-client", default_client, "device", str, NULL); g_free(str); /* register ports */ core_audio_port = ags_core_audio_port_new((GObject *) default_client); str = g_strdup_printf("ags-soundcard%d", n_soundcards); g_object_set(core_audio_port, "core-audio-device", core_audio_devin, NULL); ags_core_audio_client_add_port(default_client, (GObject *) core_audio_port); g_object_set(core_audio_devin, "core-audio-port", core_audio_port, NULL); core_audio_devin->port_name = (gchar **) malloc(2 * sizeof(gchar *)); core_audio_devin->port_name[0] = g_strdup(str); core_audio_devin->port_name[1] = NULL; ags_core_audio_port_register(core_audio_port, str, TRUE, FALSE, FALSE); ags_core_audio_devin_realloc_buffer(core_audio_devin); g_object_set(default_client, "device", core_audio_devin, NULL); /* increment n-soundcards */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->n_soundcards += 1; g_rec_mutex_unlock(core_audio_server_mutex); } return(soundcard); } void ags_core_audio_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *default_client; #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif GList *list_start, *list; GList *port; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); /* get core audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* the default client */ g_object_get(core_audio_server, "default-core-audio-client", &default_client, NULL); if(default_client == NULL){ g_warning("GSequencer - no CoreAudio client"); return; } if(AGS_IS_CORE_AUDIO_DEVOUT(soundcard)){ g_object_get(soundcard, "core-audio-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_core_audio_port_unregister(list->data); ags_core_audio_client_remove_port(default_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); }else if(AGS_IS_CORE_AUDIO_DEVIN(soundcard)){ g_object_get(soundcard, "core-audio-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_core_audio_port_unregister(list->data); ags_core_audio_client_remove_port(default_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); } ags_core_audio_client_remove_device(default_client, soundcard); g_object_get(default_client, "port", &port, NULL); if(port == NULL){ /* reset n-soundcards */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->n_soundcards = 0; g_rec_mutex_unlock(core_audio_server_mutex); } g_object_unref(default_client); g_list_free_full(port, g_object_unref); } GObject* ags_core_audio_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *default_client; AgsCoreAudioPort *core_audio_port; AgsCoreAudioMidiin *core_audio_midiin; AgsApplicationContext *application_context; #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif gchar *str; guint n_sequencers; GRecMutex *core_audio_server_mutex; GRecMutex *core_audio_client_mutex; if(is_output){ g_warning("GSequencer - MIDI output not implemented"); return(NULL); } core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); application_context = ags_application_context_get_instance(); /* get core-audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get some fields */ g_rec_mutex_lock(core_audio_server_mutex); default_client = (AgsCoreAudioClient *) core_audio_server->default_client; n_sequencers = core_audio_server->n_sequencers; g_rec_mutex_unlock(core_audio_server_mutex); core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(default_client); #ifdef AGS_WITH_CORE_AUDIO if(n_sequencers >= MIDIGetNumberOfDestinations()){ return(NULL); } #endif /* the default client */ if(default_client == NULL){ default_client = ags_core_audio_client_new((GObject *) core_audio_server); g_object_set(core_audio_server, "default-core-audio-client", default_client, NULL); ags_core_audio_server_add_client(core_audio_server, (GObject *) default_client); ags_core_audio_client_open((AgsCoreAudioClient *) default_client, "ags-default-client"); } /* get graph */ g_rec_mutex_lock(core_audio_client_mutex); graph = default_client->graph; g_rec_mutex_unlock(core_audio_client_mutex); if(graph == NULL){ g_warning("ags_core_audio_server.c - can't open core audio client"); } core_audio_midiin = ags_core_audio_midiin_new(); str = g_strdup_printf("ags-core-audio-midiin-%d", n_sequencers); g_object_set(AGS_CORE_AUDIO_MIDIIN(core_audio_midiin), "core-audio-client", default_client, "device", str, NULL); g_free(str); /* register sequencer */ core_audio_port = ags_core_audio_port_new((GObject *) default_client); core_audio_port->midi_port_number = n_sequencers; g_object_set(core_audio_port, "core-audio-device", core_audio_midiin, NULL); ags_core_audio_client_add_port(default_client, (GObject *) core_audio_port); g_object_set(core_audio_midiin, "core-audio-port", core_audio_port, NULL); str = g_strdup_printf("ags-sequencer%d", n_sequencers); #ifdef AGS_DEBUG g_message("%s", str); #endif core_audio_midiin->port_name = (gchar **) malloc(2 * sizeof(gchar *)); core_audio_midiin->port_name[0] = g_strdup(str); core_audio_midiin->port_name[1] = NULL; ags_core_audio_port_register(core_audio_port, str, FALSE, TRUE, FALSE); g_object_set(default_client, "device", core_audio_midiin, NULL); /* increment n-sequencers */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->n_sequencers += 1; g_rec_mutex_unlock(core_audio_server_mutex); return((GObject *) core_audio_midiin); } void ags_core_audio_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer) { AgsCoreAudioServer *core_audio_server; AgsCoreAudioClient *default_client; GList *list_start, *list; GList *port; GRecMutex *core_audio_server_mutex; core_audio_server = AGS_CORE_AUDIO_SERVER(sound_server); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* the default client */ g_object_get(core_audio_server, "default-core-audio-client", &default_client, NULL); if(default_client == NULL){ g_warning("GSequencer - no core_audio client"); return; } g_object_get(sequencer, "core-audio-port", &list_start, NULL); list = list_start; while(list != NULL){ ags_core_audio_port_unregister(list->data); ags_core_audio_client_remove_port(default_client, list->data); list = list->next; } g_list_free_full(list_start, g_object_unref); ags_core_audio_client_remove_device(default_client, sequencer); g_object_get(default_client, "port", &port, NULL); if(port == NULL){ /* reset n-sequencers */ g_rec_mutex_lock(core_audio_server_mutex); core_audio_server->n_sequencers = 0; g_rec_mutex_unlock(core_audio_server_mutex); } g_object_unref(default_client); g_list_free_full(port, g_object_unref); } /** * ags_core_audio_server_register_default_soundcard: * @core_audio_server: the #AgsCoreAudioServer * * Register default soundcard. * * Returns: the instantiated #AgsCoreAudioDevout * * Since: 3.0.0 */ GObject* ags_core_audio_server_register_default_soundcard(AgsCoreAudioServer *core_audio_server) { AgsCoreAudioClient *default_client; AgsCoreAudioDevout *core_audio_devout; AgsCoreAudioPort *core_audio_port; AgsApplicationContext *application_context; #ifdef AGS_WITH_CORE_AUDIO AUGraph *graph; #else gpointer graph; #endif gchar *str; guint n_soundcards; guint i; GRecMutex *core_audio_server_mutex; GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server)){ return(NULL); } application_context = ags_application_context_get_instance(); /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get some fields */ g_rec_mutex_lock(core_audio_server_mutex); default_client = (AgsCoreAudioClient *) core_audio_server->default_client; n_soundcards = core_audio_server->n_soundcards; g_rec_mutex_unlock(core_audio_server_mutex); /* the default client */ if(default_client == NULL){ default_client = ags_core_audio_client_new((GObject *) core_audio_server); g_object_set(core_audio_server, "default-core-audio-client", default_client, NULL); ags_core_audio_server_add_client(core_audio_server, (GObject *) default_client); ags_core_audio_client_open((AgsCoreAudioClient *) core_audio_server->default_client, "ags-default-client"); } /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(default_client); /* get graph */ g_rec_mutex_lock(core_audio_client_mutex); graph = default_client->graph; g_rec_mutex_unlock(core_audio_client_mutex); if(graph == NULL){ g_warning("ags_core_audio_server.c - can't open core audio client"); } /* the soundcard */ core_audio_devout = ags_core_audio_devout_new(); g_object_set(AGS_CORE_AUDIO_DEVOUT(core_audio_devout), "core-audio-client", default_client, "device", "ags-default-devout", NULL); /* register ports */ core_audio_port = ags_core_audio_port_new((GObject *) default_client); g_object_set(core_audio_port, "core-audio-device", core_audio_devout, NULL); ags_core_audio_client_add_port(default_client, (GObject *) core_audio_port); g_object_set(core_audio_devout, "core-audio-port", core_audio_port, NULL); str = g_strdup_printf("ags-default-soundcard"); #ifdef AGS_DEBUG g_message("%s", str); #endif core_audio_devout->port_name = (gchar **) malloc(2 * sizeof(gchar *)); core_audio_devout->port_name[0] = g_strdup(str); core_audio_devout->port_name[1] = NULL; ags_core_audio_port_register(core_audio_port, str, TRUE, FALSE, TRUE); g_free(str); g_object_set(default_client, "device", core_audio_devout, NULL); return((GObject *) core_audio_devout); } /** * ags_core_audio_server_find_url: * @core_audio_server: (element-type AgsAudio.CoreAudioServer) (transfer none): the #GList-struct containing #AgsCoreAudioServer * @url: the url to find * * Find #AgsCoreAudioServer by url. * * Returns: (element-type AgsAudio.CoreAudioServer) (transfer none): the next matching #GList-struct containing a #AgsCoreAudioServer matching @url or %NULL * * Since: 3.0.0 */ GList* ags_core_audio_server_find_url(GList *core_audio_server, gchar *url) { GList *retval; GRecMutex *core_audio_server_mutex; retval = NULL; while(core_audio_server != NULL){ /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server->data); /* check URL */ g_rec_mutex_lock(core_audio_server_mutex); if(!g_ascii_strcasecmp(AGS_CORE_AUDIO_SERVER(core_audio_server->data)->url, url)){ retval = core_audio_server; g_rec_mutex_unlock(core_audio_server_mutex); break; } g_rec_mutex_unlock(core_audio_server_mutex); core_audio_server = core_audio_server->next; } return(retval); } /** * ags_core_audio_server_find_client: * @core_audio_server: the #AgsCoreAudioServer * @client_uuid: the uuid to find * * Find #AgsCoreAudioClient by uuid. * * Returns: (transfer none): the #AgsCoreAudioClient found or %NULL * * Since: 3.0.0 */ GObject* ags_core_audio_server_find_client(AgsCoreAudioServer *core_audio_server, gchar *client_uuid) { AgsCoreAudioClient *retval; GList *list_start, *list; GRecMutex *core_audio_server_mutex; GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server)){ return(NULL); } /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get some fields */ g_rec_mutex_lock(core_audio_server_mutex); list = list_start = g_list_copy(core_audio_server->client); g_rec_mutex_unlock(core_audio_server_mutex); retval = NULL; while(list != NULL){ /* get core_audio client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(list->data); /* check client UUID */ g_rec_mutex_lock(core_audio_client_mutex); if(!g_ascii_strcasecmp(AGS_CORE_AUDIO_CLIENT(list->data)->client_uuid, client_uuid)){ retval = list->data; g_rec_mutex_unlock(core_audio_client_mutex); break; } g_rec_mutex_unlock(core_audio_client_mutex); list = list->next; } g_list_free(list_start); return((GObject *) retval); } /** * ags_core_audio_server_find_port: * @core_audio_server: the #AgsCoreAudioServer * @port_uuid: the uuid to find * * Find #AgsCoreAudioPort by uuid. * * Returns: (transfer none): the #AgsCoreAudioPort found or %NULL * * Since: 3.0.0 */ GObject* ags_core_audio_server_find_port(AgsCoreAudioServer *core_audio_server, gchar *port_uuid) { GList *client_start, *client; GList *port_start, *port; gboolean success; GRecMutex *core_audio_port_mutex; g_object_get(core_audio_server, "core-audio-client", &client_start, NULL); client = client_start; while(client != NULL){ g_object_get(core_audio_server, "core-audio-port", &port_start, NULL); port = port_start; while(port != NULL){ /* get core_audio port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(port->data); /* check port UUID */ g_rec_mutex_lock(core_audio_port_mutex); success = (!g_ascii_strcasecmp(AGS_CORE_AUDIO_PORT(port->data)->port_uuid, port_uuid)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_port_mutex); if(success){ AgsCoreAudioPort *retval; retval = port->data; g_list_free_full(client_start, g_object_unref); g_list_free_full(port_start, g_object_unref); return(retval); } /* iterate */ port = port->next; } g_list_free_full(port_start, g_object_unref); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); return(NULL); } /** * ags_core_audio_server_add_client: * @core_audio_server: the #AgsCoreAudioServer * @core_audio_client: the #AgsCoreAudioClient to add * * Add @core_audio_client to @core_audio_server * * Since: 3.0.0 */ void ags_core_audio_server_add_client(AgsCoreAudioServer *core_audio_server, GObject *core_audio_client) { GRecMutex *core_audio_server_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server) || !AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get some fields */ g_rec_mutex_lock(core_audio_server_mutex); if(g_list_find(core_audio_server->client, core_audio_client) == NULL){ g_object_ref(core_audio_client); core_audio_server->client = g_list_prepend(core_audio_server->client, core_audio_client); } g_rec_mutex_unlock(core_audio_server_mutex); } /** * ags_core_audio_server_remove_client: * @core_audio_server: the #AgsCoreAudioServer * @core_audio_client: the #AgsCoreAudioClient to remove * * Remove @core_audio_client to @core_audio_server * * Since: 3.0.0 */ void ags_core_audio_server_remove_client(AgsCoreAudioServer *core_audio_server, GObject *core_audio_client) { GRecMutex *core_audio_server_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server) || !AGS_IS_CORE_AUDIO_CLIENT(core_audio_client)){ return; } /* get core_audio server mutex */ core_audio_server_mutex = AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX(core_audio_server); /* get some fields */ g_rec_mutex_lock(core_audio_server_mutex); if(g_list_find(core_audio_server->client, core_audio_client) != NULL){ core_audio_server->client = g_list_remove(core_audio_server->client, core_audio_client); g_object_unref(core_audio_client); } g_rec_mutex_unlock(core_audio_server_mutex); } /** * ags_core_audio_server_connect_client: * @core_audio_server: the #AgsCoreAudioServer * * Connect all clients. * * Since: 3.0.0 */ void ags_core_audio_server_connect_client(AgsCoreAudioServer *core_audio_server) { GList *client_start, *client; gchar *client_name; GRecMutex *core_audio_client_mutex; if(!AGS_IS_CORE_AUDIO_SERVER(core_audio_server)){ return; } g_object_get(core_audio_server, "core-audio-client", &client_start, NULL); client = client_start; while(client != NULL){ /* client name */ g_object_get(client->data, "client-name", &client_name, NULL); /* open */ ags_core_audio_client_open((AgsCoreAudioClient *) client->data, client_name); ags_core_audio_client_activate(client->data); g_free(client_name); /* iterate */ client = client->next; } g_list_free_full(client_start, g_object_unref); } /** * ags_core_audio_server_new: * @url: the URL as string * * Create a new instance of #AgsCoreAudioServer. * * Returns: the new #AgsCoreAudioServer * * Since: 3.0.0 */ AgsCoreAudioServer* ags_core_audio_server_new(gchar *url) { AgsCoreAudioServer *core_audio_server; core_audio_server = (AgsCoreAudioServer *) g_object_new(AGS_TYPE_CORE_AUDIO_SERVER, "url", url, NULL); return(core_audio_server); } gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_devout.h0000644000175000017500000001576513607210263021222 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CORE_AUDIO_DEVOUT_H__ #define __AGS_CORE_AUDIO_DEVOUT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CORE_AUDIO_DEVOUT (ags_core_audio_devout_get_type()) #define AGS_CORE_AUDIO_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CORE_AUDIO_DEVOUT, AgsCoreAudioDevout)) #define AGS_CORE_AUDIO_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CORE_AUDIO_DEVOUT, AgsCoreAudioDevout)) #define AGS_IS_CORE_AUDIO_DEVOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CORE_AUDIO_DEVOUT)) #define AGS_IS_CORE_AUDIO_DEVOUT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CORE_AUDIO_DEVOUT)) #define AGS_CORE_AUDIO_DEVOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CORE_AUDIO_DEVOUT, AgsCoreAudioDevoutClass)) #define AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(obj) (&(((AgsCoreAudioDevout *) obj)->obj_mutex)) typedef struct _AgsCoreAudioDevout AgsCoreAudioDevout; typedef struct _AgsCoreAudioDevoutClass AgsCoreAudioDevoutClass; /** * AgsCoreAudioDevoutFlags: * @AGS_CORE_AUDIO_DEVOUT_ADDED_TO_REGISTRY: the core-audio devout was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CORE_AUDIO_DEVOUT_CONNECTED: indicates the core-audio devout was connected by calling #AgsConnectable::connect() * @AGS_CORE_AUDIO_DEVOUT_BUFFER0: ring-buffer 0 * @AGS_CORE_AUDIO_DEVOUT_BUFFER1: ring-buffer 1 * @AGS_CORE_AUDIO_DEVOUT_BUFFER2: ring-buffer 2 * @AGS_CORE_AUDIO_DEVOUT_BUFFER3: ring-buffer 3 * @AGS_CORE_AUDIO_DEVOUT_BUFFER4: ring-buffer 4 * @AGS_CORE_AUDIO_DEVOUT_BUFFER5: ring-buffer 5 * @AGS_CORE_AUDIO_DEVOUT_BUFFER6: ring-buffer 6 * @AGS_CORE_AUDIO_DEVOUT_BUFFER7: ring-buffer 7 * @AGS_CORE_AUDIO_DEVOUT_ATTACK_FIRST: use first attack, instead of second one * @AGS_CORE_AUDIO_DEVOUT_PLAY: do playback * @AGS_CORE_AUDIO_DEVOUT_SHUTDOWN: stop playback * @AGS_CORE_AUDIO_DEVOUT_START_PLAY: playback starting * @AGS_CORE_AUDIO_DEVOUT_NONBLOCKING: do non-blocking calls * @AGS_CORE_AUDIO_DEVOUT_INITIALIZED: the soundcard was initialized * * Enum values to control the behavior or indicate internal state of #AgsCoreAudioDevout by * enable/disable as flags. */ typedef enum{ AGS_CORE_AUDIO_DEVOUT_ADDED_TO_REGISTRY = 1, AGS_CORE_AUDIO_DEVOUT_CONNECTED = 1 << 1, AGS_CORE_AUDIO_DEVOUT_BUFFER0 = 1 << 2, AGS_CORE_AUDIO_DEVOUT_BUFFER1 = 1 << 3, AGS_CORE_AUDIO_DEVOUT_BUFFER2 = 1 << 4, AGS_CORE_AUDIO_DEVOUT_BUFFER3 = 1 << 5, AGS_CORE_AUDIO_DEVOUT_BUFFER4 = 1 << 6, AGS_CORE_AUDIO_DEVOUT_BUFFER5 = 1 << 7, AGS_CORE_AUDIO_DEVOUT_BUFFER6 = 1 << 8, AGS_CORE_AUDIO_DEVOUT_BUFFER7 = 1 << 9, AGS_CORE_AUDIO_DEVOUT_ATTACK_FIRST = 1 << 10, AGS_CORE_AUDIO_DEVOUT_PLAY = 1 << 11, AGS_CORE_AUDIO_DEVOUT_SHUTDOWN = 1 << 12, AGS_CORE_AUDIO_DEVOUT_START_PLAY = 1 << 13, AGS_CORE_AUDIO_DEVOUT_NONBLOCKING = 1 << 14, AGS_CORE_AUDIO_DEVOUT_INITIALIZED = 1 << 15, }AgsCoreAudioDevoutFlags; /** * AgsCoreAudioDevoutSyncFlags: * @AGS_CORE_AUDIO_DEVOUT_PASS_THROUGH: do not sync * @AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK: initial callback * @AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT: sync wait, soundcard conditional lock * @AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE: sync done, soundcard conditional lock * @AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT: sync wait, client conditional lock * @AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE: sync done, client conditional lock * * Enum values to control the synchronization between soundcard and client. */ typedef enum{ AGS_CORE_AUDIO_DEVOUT_PASS_THROUGH = 1, AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK = 1 << 1, AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT = 1 << 2, AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE = 1 << 3, AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT = 1 << 4, AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE = 1 << 5, }AgsCoreAudioDevoutSyncFlags; #define AGS_CORE_AUDIO_DEVOUT_ERROR (ags_core_audio_devout_error_quark()) typedef enum{ AGS_CORE_AUDIO_DEVOUT_ERROR_LOCKED_SOUNDCARD, }AgsCoreAudioDevoutError; struct _AgsCoreAudioDevout { GObject gobject; guint flags; volatile guint sync_flags; GRecMutex obj_mutex; AgsUUID *uuid; guint dsp_channels; guint pcm_channels; guint format; guint buffer_size; guint samplerate; GRecMutex **buffer_mutex; guint sub_block_count; GRecMutex **sub_block_mutex; void** buffer; double bpm; // beats per minute gdouble delay_factor; gdouble *delay; // count of tics within buffer size guint *attack; // where currently tic resides in the stream's offset, measured in 1/64 of bpm gdouble tact_counter; gdouble delay_counter; // next time attack changeing when delay_counter == delay guint tic_counter; // in the range of default period guint start_note_offset; guint note_offset; guint note_offset_absolute; guint loop_left; guint loop_right; gboolean do_loop; guint loop_offset; gchar *card_uri; GObject *core_audio_client; gchar **port_name; GList *core_audio_port; GMutex callback_mutex; GCond callback_cond; GMutex callback_finish_mutex; GCond callback_finish_cond; }; struct _AgsCoreAudioDevoutClass { GObjectClass gobject; }; GType ags_core_audio_devout_get_type(); GQuark ags_core_audio_devout_error_quark(); gboolean ags_core_audio_devout_test_flags(AgsCoreAudioDevout *core_audio_devout, guint flags); void ags_core_audio_devout_set_flags(AgsCoreAudioDevout *core_audio_devout, guint flags); void ags_core_audio_devout_unset_flags(AgsCoreAudioDevout *core_audio_devout, guint flags); void ags_core_audio_devout_switch_buffer_flag(AgsCoreAudioDevout *core_audio_devout); void ags_core_audio_devout_adjust_delay_and_attack(AgsCoreAudioDevout *core_audio_devout); void ags_core_audio_devout_realloc_buffer(AgsCoreAudioDevout *core_audio_devout); AgsCoreAudioDevout* ags_core_audio_devout_new(); G_END_DECLS #endif /*__AGS_CORE_AUDIO_DEVOUT_H__*/ gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_port.h0000644000175000017500000001275413607210263020673 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CORE_AUDIO_PORT_H__ #define __AGS_CORE_AUDIO_PORT_H__ #include #include #include #ifdef AGS_WITH_CORE_AUDIO #include #include #include #include #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_CORE_AUDIO_PORT (ags_core_audio_port_get_type()) #define AGS_CORE_AUDIO_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CORE_AUDIO_PORT, AgsCoreAudioPort)) #define AGS_CORE_AUDIO_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CORE_AUDIO_PORT, AgsCoreAudioPort)) #define AGS_IS_CORE_AUDIO_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CORE_AUDIO_PORT)) #define AGS_IS_CORE_AUDIO_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CORE_AUDIO_PORT)) #define AGS_CORE_AUDIO_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CORE_AUDIO_PORT, AgsCoreAudioPortClass)) #define AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(obj) (&(((AgsCoreAudioPort *) obj)->obj_mutex)) #define AGS_CORE_AUDIO_PORT_DEFAULT_CACHE_BUFFER_SIZE (4096) typedef struct _AgsCoreAudioPort AgsCoreAudioPort; typedef struct _AgsCoreAudioPortClass AgsCoreAudioPortClass; /** * AgsCoreAudioPortFlags: * @AGS_CORE_AUDIO_PORT_ADDED_TO_REGISTRY: the CoreAudio port was added to registry, see #AgsConnectable::add_to_registry() * @AGS_CORE_AUDIO_PORT_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * @AGS_CORE_AUDIO_PORT_REGISTERED: the port was registered * @AGS_CORE_AUDIO_PORT_IS_AUDIO: the port provides audio data * @AGS_CORE_AUDIO_PORT_IS_MIDI: the port provides midi data * @AGS_CORE_AUDIO_PORT_IS_OUTPUT: the port does output * @AGS_CORE_AUDIO_PORT_IS_INPUT: the port does input * * Enum values to control the behavior or indicate internal state of #AgsCoreAudioPort by * enable/disable as flags. */ typedef enum{ AGS_CORE_AUDIO_PORT_ADDED_TO_REGISTRY = 1, AGS_CORE_AUDIO_PORT_CONNECTED = 1 << 1, AGS_CORE_AUDIO_PORT_REGISTERED = 1 << 2, AGS_CORE_AUDIO_PORT_IS_AUDIO = 1 << 3, AGS_CORE_AUDIO_PORT_IS_MIDI = 1 << 4, AGS_CORE_AUDIO_PORT_IS_OUTPUT = 1 << 5, AGS_CORE_AUDIO_PORT_IS_INPUT = 1 << 6, }AgsCoreAudioPortFlags; struct _AgsCoreAudioPort { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *core_audio_client; AgsUUID *uuid; GObject *core_audio_device; gchar *port_uuid; gchar *port_name; guint pcm_channels; guint samplerate; guint buffer_size; guint format; gboolean use_cache; guint cache_buffer_size; guint current_cache; guint completed_cache; guint cache_offset; void **cache; #ifdef AGS_WITH_CORE_AUDIO AudioQueueRef aq_ref; AudioStreamBasicDescription data_format; AudioQueueRef record_aq_ref; AudioStreamBasicDescription record_format; AudioQueueBufferRef buf_ref[16]; AudioQueueBufferRef record_buf_ref[16]; MIDIClientRef *midi_client; MIDIPortRef *midi_port; #else gpointer aq_ref; gpointer data_format; gpointer buffer; gpointer midi_client; gpointer midi_port; #endif unsigned int midi_port_number; volatile gboolean output_running; volatile gboolean input_running; volatile gboolean is_empty; volatile guint queued; }; struct _AgsCoreAudioPortClass { GObjectClass gobject; }; GType ags_core_audio_port_get_type(); gboolean ags_core_audio_port_test_flags(AgsCoreAudioPort *core_audio_port, guint flags); void ags_core_audio_port_set_flags(AgsCoreAudioPort *core_audio_port, guint flags); void ags_core_audio_port_unset_flags(AgsCoreAudioPort *core_audio_port, guint flags); GList* ags_core_audio_port_find(GList *core_audio_port, gchar *port_name); void ags_core_audio_port_register(AgsCoreAudioPort *core_audio_port, gchar *port_name, gboolean is_audio, gboolean is_midi, gboolean is_output); void ags_core_audio_port_unregister(AgsCoreAudioPort *core_audio_port); void ags_core_audio_port_set_format(AgsCoreAudioPort *core_audio_port, guint format); void ags_core_audio_port_set_samplerate(AgsCoreAudioPort *core_audio_port, guint samplerate); void ags_core_audio_port_set_pcm_channels(AgsCoreAudioPort *core_audio_port, guint pcm_channels); void ags_core_audio_port_set_buffer_size(AgsCoreAudioPort *core_audio_port, guint buffer_size); void ags_core_audio_port_set_cache_buffer_size(AgsCoreAudioPort *core_audio_port, guint cache_buffer_size); guint ags_core_audio_port_get_latency(AgsCoreAudioPort *core_audio_port); AgsCoreAudioPort* ags_core_audio_port_new(GObject *core_audio_client); G_END_DECLS #endif /*__AGS_CORE_AUDIO_PORT_H__*/ gsequencer-3.1.3/ags/audio/core-audio/ags_core_audio_devout.c0000644000175000017500000030116313607210263021203 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_core_audio_devout_class_init(AgsCoreAudioDevoutClass *core_audio_devout); void ags_core_audio_devout_connectable_interface_init(AgsConnectableInterface *connectable); void ags_core_audio_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard); void ags_core_audio_devout_init(AgsCoreAudioDevout *core_audio_devout); void ags_core_audio_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_core_audio_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_core_audio_devout_dispose(GObject *gobject); void ags_core_audio_devout_finalize(GObject *gobject); AgsUUID* ags_core_audio_devout_get_uuid(AgsConnectable *connectable); gboolean ags_core_audio_devout_has_resource(AgsConnectable *connectable); gboolean ags_core_audio_devout_is_ready(AgsConnectable *connectable); void ags_core_audio_devout_add_to_registry(AgsConnectable *connectable); void ags_core_audio_devout_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_core_audio_devout_list_resource(AgsConnectable *connectable); xmlNode* ags_core_audio_devout_xml_compose(AgsConnectable *connectable); void ags_core_audio_devout_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_core_audio_devout_is_connected(AgsConnectable *connectable); void ags_core_audio_devout_connect(AgsConnectable *connectable); void ags_core_audio_devout_disconnect(AgsConnectable *connectable); void ags_core_audio_devout_set_device(AgsSoundcard *soundcard, gchar *device); gchar* ags_core_audio_devout_get_device(AgsSoundcard *soundcard); void ags_core_audio_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_core_audio_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_core_audio_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_core_audio_devout_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_core_audio_devout_get_capability(AgsSoundcard *soundcard); gboolean ags_core_audio_devout_is_starting(AgsSoundcard *soundcard); gboolean ags_core_audio_devout_is_playing(AgsSoundcard *soundcard); gchar* ags_core_audio_devout_get_uptime(AgsSoundcard *soundcard); void ags_core_audio_devout_port_init(AgsSoundcard *soundcard, GError **error); void ags_core_audio_devout_port_play(AgsSoundcard *soundcard, GError **error); void ags_core_audio_devout_port_free(AgsSoundcard *soundcard); void ags_core_audio_devout_tic(AgsSoundcard *soundcard); void ags_core_audio_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset); void ags_core_audio_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_core_audio_devout_get_bpm(AgsSoundcard *soundcard); void ags_core_audio_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_core_audio_devout_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_core_audio_devout_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_core_audio_devout_get_delay(AgsSoundcard *soundcard); guint ags_core_audio_devout_get_attack(AgsSoundcard *soundcard); void* ags_core_audio_devout_get_buffer(AgsSoundcard *soundcard); void* ags_core_audio_devout_get_next_buffer(AgsSoundcard *soundcard); void* ags_core_audio_devout_get_prev_buffer(AgsSoundcard *soundcard); void ags_core_audio_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_core_audio_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer); guint ags_core_audio_devout_get_delay_counter(AgsSoundcard *soundcard); void ags_core_audio_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_core_audio_devout_get_start_note_offset(AgsSoundcard *soundcard); void ags_core_audio_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_core_audio_devout_get_note_offset(AgsSoundcard *soundcard); void ags_core_audio_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_core_audio_devout_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_core_audio_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_core_audio_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_core_audio_devout_get_loop_offset(AgsSoundcard *soundcard); guint ags_core_audio_devout_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_core_audio_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_core_audio_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); /** * SECTION:ags_core_audio_devout * @short_description: Output to soundcard * @title: AgsCoreAudioDevout * @section_id: * @include: ags/audio/core-audio/ags_core_audio_devout.h * * #AgsCoreAudioDevout represents a soundcard and supports output. */ enum{ PROP_0, PROP_DEVICE, PROP_DSP_CHANNELS, PROP_PCM_CHANNELS, PROP_FORMAT, PROP_BUFFER_SIZE, PROP_SAMPLERATE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, PROP_CORE_AUDIO_CLIENT, PROP_CORE_AUDIO_PORT, PROP_CHANNEL, }; static gpointer ags_core_audio_devout_parent_class = NULL; GType ags_core_audio_devout_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_core_audio_devout = 0; static const GTypeInfo ags_core_audio_devout_info = { sizeof(AgsCoreAudioDevoutClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_core_audio_devout_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCoreAudioDevout), 0, /* n_preallocs */ (GInstanceInitFunc) ags_core_audio_devout_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_core_audio_devout_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_soundcard_interface_info = { (GInterfaceInitFunc) ags_core_audio_devout_soundcard_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_core_audio_devout = g_type_register_static(G_TYPE_OBJECT, "AgsCoreAudioDevout", &ags_core_audio_devout_info, 0); g_type_add_interface_static(ags_type_core_audio_devout, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_core_audio_devout, AGS_TYPE_SOUNDCARD, &ags_soundcard_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_core_audio_devout); } return g_define_type_id__volatile; } void ags_core_audio_devout_class_init(AgsCoreAudioDevoutClass *core_audio_devout) { GObjectClass *gobject; GParamSpec *param_spec; ags_core_audio_devout_parent_class = g_type_class_peek_parent(core_audio_devout); /* GObjectClass */ gobject = (GObjectClass *) core_audio_devout; gobject->set_property = ags_core_audio_devout_set_property; gobject->get_property = ags_core_audio_devout_get_property; gobject->dispose = ags_core_audio_devout_dispose; gobject->finalize = ags_core_audio_devout_finalize; /* properties */ /** * AgsCoreAudioDevout:device: * * The core audio soundcard indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), "ags-core-audio-devout-0", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsCoreAudioDevout:dsp-channels: * * The dsp channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("dsp-channels", i18n_pspec("count of DSP channels"), i18n_pspec("The count of DSP channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DSP_CHANNELS, param_spec); /** * AgsCoreAudioDevout:pcm-channels: * * The pcm channel count * * Since: 3.0.0 */ param_spec = g_param_spec_uint("pcm-channels", i18n_pspec("count of PCM channels"), i18n_pspec("The count of PCM channels to use"), 1, 64, 2, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PCM_CHANNELS, param_spec); /** * AgsCoreAudioDevout:format: * * The precision of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("precision of buffer"), i18n_pspec("The precision to use for a frame"), 1, 64, AGS_SOUNDCARD_DEFAULT_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsCoreAudioDevout:buffer-size: * * The buffer size * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("frame count of a buffer"), i18n_pspec("The count of frames a buffer contains"), 1, 44100, 940, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsCoreAudioDevout:samplerate: * * The samplerate * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("frames per second"), i18n_pspec("The frames count played during a second"), 8000, 96000, 44100, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsCoreAudioDevout:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to play"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsCoreAudioDevout:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, 120.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsCoreAudioDevout:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsCoreAudioDevout:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /** * AgsCoreAudioDevout:core-audio-client: * * The assigned #AgsCoreAudioClient * * Since: 3.0.0 */ param_spec = g_param_spec_object("core-audio-client", i18n_pspec("core audio client object"), i18n_pspec("The core audio client object"), AGS_TYPE_CORE_AUDIO_CLIENT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_CLIENT, param_spec); /** * AgsCoreAudioDevout:core-audio-port: * * The assigned #AgsCoreAudioPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("core-audio-port", i18n_pspec("core audio port object"), i18n_pspec("The core audio port object"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CORE_AUDIO_PORT, param_spec); } GQuark ags_core_audio_devout_error_quark() { return(g_quark_from_static_string("ags-core_audio_devout-error-quark")); } void ags_core_audio_devout_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_core_audio_devout_get_uuid; connectable->has_resource = ags_core_audio_devout_has_resource; connectable->is_ready = ags_core_audio_devout_is_ready; connectable->add_to_registry = ags_core_audio_devout_add_to_registry; connectable->remove_from_registry = ags_core_audio_devout_remove_from_registry; connectable->list_resource = ags_core_audio_devout_list_resource; connectable->xml_compose = ags_core_audio_devout_xml_compose; connectable->xml_parse = ags_core_audio_devout_xml_parse; connectable->is_connected = ags_core_audio_devout_is_connected; connectable->connect = ags_core_audio_devout_connect; connectable->disconnect = ags_core_audio_devout_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_core_audio_devout_soundcard_interface_init(AgsSoundcardInterface *soundcard) { soundcard->set_device = ags_core_audio_devout_set_device; soundcard->get_device = ags_core_audio_devout_get_device; soundcard->set_presets = ags_core_audio_devout_set_presets; soundcard->get_presets = ags_core_audio_devout_get_presets; soundcard->list_cards = ags_core_audio_devout_list_cards; soundcard->pcm_info = ags_core_audio_devout_pcm_info; soundcard->get_capability = ags_core_audio_devout_get_capability; soundcard->is_available = NULL; soundcard->is_starting = ags_core_audio_devout_is_starting; soundcard->is_playing = ags_core_audio_devout_is_playing; soundcard->is_recording = NULL; soundcard->get_uptime = ags_core_audio_devout_get_uptime; soundcard->play_init = ags_core_audio_devout_port_init; soundcard->play = ags_core_audio_devout_port_play; soundcard->record_init = NULL; soundcard->record = NULL; soundcard->stop = ags_core_audio_devout_port_free; soundcard->tic = ags_core_audio_devout_tic; soundcard->offset_changed = ags_core_audio_devout_offset_changed; soundcard->set_bpm = ags_core_audio_devout_set_bpm; soundcard->get_bpm = ags_core_audio_devout_get_bpm; soundcard->set_delay_factor = ags_core_audio_devout_set_delay_factor; soundcard->get_delay_factor = ags_core_audio_devout_get_delay_factor; soundcard->get_absolute_delay = ags_core_audio_devout_get_absolute_delay; soundcard->get_delay = ags_core_audio_devout_get_delay; soundcard->get_attack = ags_core_audio_devout_get_attack; soundcard->get_buffer = ags_core_audio_devout_get_buffer; soundcard->get_next_buffer = ags_core_audio_devout_get_next_buffer; soundcard->get_prev_buffer = ags_core_audio_devout_get_prev_buffer; soundcard->lock_buffer = ags_core_audio_devout_lock_buffer; soundcard->unlock_buffer = ags_core_audio_devout_unlock_buffer; soundcard->get_delay_counter = ags_core_audio_devout_get_delay_counter; soundcard->set_start_note_offset = ags_core_audio_devout_set_start_note_offset; soundcard->get_start_note_offset = ags_core_audio_devout_get_start_note_offset; soundcard->set_note_offset = ags_core_audio_devout_set_note_offset; soundcard->get_note_offset = ags_core_audio_devout_get_note_offset; soundcard->set_note_offset_absolute = ags_core_audio_devout_set_note_offset_absolute; soundcard->get_note_offset_absolute = ags_core_audio_devout_get_note_offset_absolute; soundcard->set_loop = ags_core_audio_devout_set_loop; soundcard->get_loop = ags_core_audio_devout_get_loop; soundcard->get_loop_offset = ags_core_audio_devout_get_loop_offset; soundcard->get_sub_block_count = ags_core_audio_devout_get_sub_block_count; soundcard->trylock_sub_block = ags_core_audio_devout_trylock_sub_block; soundcard->unlock_sub_block = ags_core_audio_devout_unlock_sub_block; } void ags_core_audio_devout_init(AgsCoreAudioDevout *core_audio_devout) { AgsConfig *config; gchar *str; gchar *segmentation; guint denominator, numerator; guint i; /* flags */ core_audio_devout->flags = 0; g_atomic_int_set(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_PASS_THROUGH); /* devout mutex */ g_rec_mutex_init(&(core_audio_devout->obj_mutex)); /* uuid */ core_audio_devout->uuid = ags_uuid_alloc(); ags_uuid_generate(core_audio_devout->uuid); /* presets */ config = ags_config_get_instance(); core_audio_devout->dsp_channels = ags_soundcard_helper_config_get_dsp_channels(config); core_audio_devout->pcm_channels = ags_soundcard_helper_config_get_pcm_channels(config); core_audio_devout->samplerate = ags_soundcard_helper_config_get_samplerate(config); core_audio_devout->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); core_audio_devout->format = ags_soundcard_helper_config_get_format(config); /* */ core_audio_devout->card_uri = NULL; core_audio_devout->core_audio_client = NULL; core_audio_devout->port_name = NULL; core_audio_devout->core_audio_port = NULL; /* buffer */ core_audio_devout->buffer_mutex = (GRecMutex **) malloc(8 * sizeof(GRecMutex *)); for(i = 0; i < 8; i++){ core_audio_devout->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(core_audio_devout->buffer_mutex[i]); } core_audio_devout->sub_block_count = AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT; core_audio_devout->sub_block_mutex = (GRecMutex **) malloc(8 * core_audio_devout->sub_block_count * core_audio_devout->pcm_channels * sizeof(GRecMutex *)); for(i = 0; i < 8 * core_audio_devout->sub_block_count * core_audio_devout->pcm_channels; i++){ core_audio_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(core_audio_devout->sub_block_mutex[i]); } core_audio_devout->buffer = (void **) malloc(8 * sizeof(void*)); core_audio_devout->buffer[0] = NULL; core_audio_devout->buffer[1] = NULL; core_audio_devout->buffer[2] = NULL; core_audio_devout->buffer[3] = NULL; core_audio_devout->buffer[4] = NULL; core_audio_devout->buffer[5] = NULL; core_audio_devout->buffer[6] = NULL; core_audio_devout->buffer[7] = NULL; ags_core_audio_devout_realloc_buffer(core_audio_devout); /* bpm */ core_audio_devout->bpm = AGS_SOUNDCARD_DEFAULT_BPM; /* delay factor */ core_audio_devout->delay_factor = AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); core_audio_devout->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } /* delay and attack */ core_audio_devout->delay = (gdouble *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(gdouble)); core_audio_devout->attack = (guint *) malloc((int) 2 * AGS_SOUNDCARD_DEFAULT_PERIOD * sizeof(guint)); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); /* counters */ core_audio_devout->tact_counter = 0.0; core_audio_devout->delay_counter = 0.0; core_audio_devout->tic_counter = 0; core_audio_devout->start_note_offset = 0; core_audio_devout->note_offset = 0; core_audio_devout->note_offset_absolute = 0; core_audio_devout->loop_left = AGS_SOUNDCARD_DEFAULT_LOOP_LEFT; core_audio_devout->loop_right = AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT; core_audio_devout->do_loop = FALSE; core_audio_devout->loop_offset = 0; /* callback mutex */ g_mutex_init(&(core_audio_devout->callback_mutex)); g_cond_init(&(core_audio_devout->callback_cond)); /* callback finish mutex */ g_mutex_init(&(core_audio_devout->callback_finish_mutex)); g_cond_init(&(core_audio_devout->callback_finish_cond)); } void ags_core_audio_devout_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(gobject); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->card_uri = g_strdup(device); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_DSP_CHANNELS: { guint dsp_channels; dsp_channels = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devout_mutex); if(dsp_channels == core_audio_devout->dsp_channels){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } core_audio_devout->dsp_channels = dsp_channels; g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_PCM_CHANNELS: { guint pcm_channels, old_pcm_channels; guint i; pcm_channels = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devout_mutex); if(pcm_channels == core_audio_devout->pcm_channels){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } old_pcm_channels = core_audio_devout->pcm_channels; /* destroy if less pcm-channels */ for(i = 8 * core_audio_devout->sub_block_count * pcm_channels; i < 8 * core_audio_devout->sub_block_count * old_pcm_channels; i++){ g_rec_mutex_clear(core_audio_devout->sub_block_mutex[i]); free(core_audio_devout->sub_block_mutex[i]); } core_audio_devout->sub_block_mutex = (GRecMutex **) realloc(core_audio_devout->sub_block_mutex, 8 * core_audio_devout->sub_block_count * pcm_channels * sizeof(GRecMutex *)); /* create if more pcm-channels */ for(i = 8 * core_audio_devout->sub_block_count * old_pcm_channels; i < 8 * core_audio_devout->sub_block_count * pcm_channels; i++){ core_audio_devout->sub_block_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(core_audio_devout->sub_block_mutex[i]); } core_audio_devout->pcm_channels = pcm_channels; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_realloc_buffer(core_audio_devout); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devout_mutex); if(format == core_audio_devout->format){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } core_audio_devout->format = format; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_realloc_buffer(core_audio_devout); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devout_mutex); if(buffer_size == core_audio_devout->buffer_size){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } core_audio_devout->buffer_size = buffer_size; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_realloc_buffer(core_audio_devout); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); } break; case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(core_audio_devout_mutex); if(samplerate == core_audio_devout->samplerate){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } core_audio_devout->samplerate = samplerate; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_realloc_buffer(core_audio_devout); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->bpm = bpm; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->delay_factor = delay_factor; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); } break; case PROP_CORE_AUDIO_CLIENT: { AgsCoreAudioClient *core_audio_client; core_audio_client = (AgsCoreAudioClient *) g_value_get_object(value); g_rec_mutex_lock(core_audio_devout_mutex); if(core_audio_devout->core_audio_client == (GObject *) core_audio_client){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } if(core_audio_devout->core_audio_client != NULL){ g_object_unref(G_OBJECT(core_audio_devout->core_audio_client)); } if(core_audio_client != NULL){ g_object_ref(core_audio_client); } core_audio_devout->core_audio_client = (GObject *) core_audio_client; g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_CORE_AUDIO_PORT: { AgsCoreAudioPort *core_audio_port; core_audio_port = (AgsCoreAudioPort *) g_value_get_pointer(value); g_rec_mutex_lock(core_audio_devout_mutex); if(!AGS_IS_CORE_AUDIO_PORT(core_audio_port) || g_list_find(core_audio_devout->core_audio_port, core_audio_port) != NULL){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } g_object_ref(core_audio_port); core_audio_devout->core_audio_port = g_list_append(core_audio_devout->core_audio_port, core_audio_port); g_rec_mutex_unlock(core_audio_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_devout_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(gobject); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_string(value, core_audio_devout->card_uri); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_DSP_CHANNELS: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_uint(value, core_audio_devout->dsp_channels); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_PCM_CHANNELS: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_uint(value, core_audio_devout->pcm_channels); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_uint(value, core_audio_devout->format); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_uint(value, core_audio_devout->buffer_size); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_uint(value, core_audio_devout->samplerate); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_pointer(value, core_audio_devout->buffer); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_double(value, core_audio_devout->bpm); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_double(value, core_audio_devout->delay_factor); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_ATTACK: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_pointer(value, core_audio_devout->attack); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_CORE_AUDIO_CLIENT: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_object(value, core_audio_devout->core_audio_client); g_rec_mutex_unlock(core_audio_devout_mutex); } break; case PROP_CORE_AUDIO_PORT: { g_rec_mutex_lock(core_audio_devout_mutex); g_value_set_pointer(value, g_list_copy_deep(core_audio_devout->core_audio_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(core_audio_devout_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_core_audio_devout_dispose(GObject *gobject) { AgsCoreAudioDevout *core_audio_devout; GList *list; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(gobject); /* core_audio client */ if(core_audio_devout->core_audio_client != NULL){ g_object_unref(core_audio_devout->core_audio_client); core_audio_devout->core_audio_client = NULL; } /* core_audio port */ g_list_free_full(core_audio_devout->core_audio_port, g_object_unref); core_audio_devout->core_audio_port = NULL; /* call parent */ G_OBJECT_CLASS(ags_core_audio_devout_parent_class)->dispose(gobject); } void ags_core_audio_devout_finalize(GObject *gobject) { AgsCoreAudioDevout *core_audio_devout; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(gobject); /* free output buffer */ free(core_audio_devout->buffer[0]); free(core_audio_devout->buffer[1]); free(core_audio_devout->buffer[2]); free(core_audio_devout->buffer[3]); free(core_audio_devout->buffer[4]); free(core_audio_devout->buffer[5]); free(core_audio_devout->buffer[6]); free(core_audio_devout->buffer[7]); /* free buffer array */ free(core_audio_devout->buffer); /* free AgsAttack */ free(core_audio_devout->attack); /* core_audio client */ if(core_audio_devout->core_audio_client != NULL){ g_object_unref(core_audio_devout->core_audio_client); } /* core_audio port */ g_list_free_full(core_audio_devout->core_audio_port, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_core_audio_devout_parent_class)->finalize(gobject); } AgsUUID* ags_core_audio_devout_get_uuid(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; AgsUUID *ptr; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); /* get core_audio devout signal mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get UUID */ g_rec_mutex_lock(core_audio_devout_mutex); ptr = core_audio_devout->uuid; g_rec_mutex_unlock(core_audio_devout_mutex); return(ptr); } gboolean ags_core_audio_devout_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_core_audio_devout_is_ready(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; gboolean is_ready; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); /* check is added */ is_ready = ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_ADDED_TO_REGISTRY); return(is_ready); } void ags_core_audio_devout_add_to_registry(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; if(ags_connectable_is_ready(connectable)){ return; } core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); ags_core_audio_devout_set_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_ADDED_TO_REGISTRY); } void ags_core_audio_devout_remove_from_registry(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; if(!ags_connectable_is_ready(connectable)){ return; } core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); ags_core_audio_devout_unset_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_ADDED_TO_REGISTRY); } xmlNode* ags_core_audio_devout_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_core_audio_devout_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_core_audio_devout_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_core_audio_devout_is_connected(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; gboolean is_connected; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); /* check is connected */ is_connected = ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_CONNECTED); return(is_connected); } void ags_core_audio_devout_connect(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; if(ags_connectable_is_connected(connectable)){ return; } core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); ags_core_audio_devout_set_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_CONNECTED); } void ags_core_audio_devout_disconnect(AgsConnectable *connectable) { AgsCoreAudioDevout *core_audio_devout; if(!ags_connectable_is_connected(connectable)){ return; } core_audio_devout = AGS_CORE_AUDIO_DEVOUT(connectable); ags_core_audio_devout_unset_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_CONNECTED); } /** * ags_core_audio_devout_test_flags: * @core_audio_devout: the #AgsCoreAudioDevout * @flags: the flags * * Test @flags to be set on @core_audio_devout. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_core_audio_devout_test_flags(AgsCoreAudioDevout *core_audio_devout, guint flags) { gboolean retval; GRecMutex *core_audio_devout_mutex; if(!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_devout)){ return(FALSE); } /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* test */ g_rec_mutex_lock(core_audio_devout_mutex); retval = (flags & (core_audio_devout->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_devout_mutex); return(retval); } /** * ags_core_audio_devout_set_flags: * @core_audio_devout: the #AgsCoreAudioDevout * @flags: see #AgsCoreAudioDevoutFlags-enum * * Enable a feature of @core_audio_devout. * * Since: 3.0.0 */ void ags_core_audio_devout_set_flags(AgsCoreAudioDevout *core_audio_devout, guint flags) { GRecMutex *core_audio_devout_mutex; if(!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_devout)){ return; } /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->flags |= flags; g_rec_mutex_unlock(core_audio_devout_mutex); } /** * ags_core_audio_devout_unset_flags: * @core_audio_devout: the #AgsCoreAudioDevout * @flags: see #AgsCoreAudioDevoutFlags-enum * * Disable a feature of @core_audio_devout. * * Since: 3.0.0 */ void ags_core_audio_devout_unset_flags(AgsCoreAudioDevout *core_audio_devout, guint flags) { GRecMutex *core_audio_devout_mutex; if(!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_devout)){ return; } /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->flags &= (~flags); g_rec_mutex_unlock(core_audio_devout_mutex); } void ags_core_audio_devout_set_device(AgsSoundcard *soundcard, gchar *device) { AgsCoreAudioDevout *core_audio_devout; GList *core_audio_port, *core_audio_port_start; gchar *str; guint pcm_channels; int ret; guint nth_card; guint i; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* check device */ g_rec_mutex_lock(core_audio_devout_mutex); if(core_audio_devout->card_uri == device || !g_ascii_strcasecmp(core_audio_devout->card_uri, device)){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } if(!g_str_has_prefix(device, "ags-core_audio-devout-")){ g_rec_mutex_unlock(core_audio_devout_mutex); g_warning("invalid core_audioaudio device prefix"); return; } ret = sscanf(device, "ags-core_audio-devout-%u", &nth_card); if(ret != 1){ g_rec_mutex_unlock(core_audio_devout_mutex); g_warning("invalid core_audioaudio device specifier"); return; } g_free(core_audio_devout->card_uri); core_audio_devout->card_uri = g_strdup(device); /* apply name to port */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_port_start = core_audio_port = g_list_copy(core_audio_devout->core_audio_port); g_rec_mutex_unlock(core_audio_devout_mutex); str = g_strdup_printf("ags-soundcard%d", nth_card); g_object_set(core_audio_port->data, "port-name", str, NULL); g_free(str); g_list_free(core_audio_port_start); } gchar* ags_core_audio_devout_get_device(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gchar *device; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); device = NULL; /* get device */ g_rec_mutex_lock(core_audio_devout_mutex); device = g_strdup(core_audio_devout->card_uri); g_rec_mutex_unlock(core_audio_devout_mutex); return(device); } void ags_core_audio_devout_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsCoreAudioDevout *core_audio_devout; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); g_object_set(core_audio_devout, "pcm-channels", channels, "samplerate", rate, "buffer-size", buffer_size, "format", format, NULL); } void ags_core_audio_devout_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get presets */ g_rec_mutex_lock(core_audio_devout_mutex); if(channels != NULL){ *channels = core_audio_devout->pcm_channels; } if(rate != NULL){ *rate = core_audio_devout->samplerate; } if(buffer_size != NULL){ *buffer_size = core_audio_devout->buffer_size; } if(format != NULL){ *format = core_audio_devout->format; } g_rec_mutex_unlock(core_audio_devout_mutex); } void ags_core_audio_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsCoreAudioClient *core_audio_client; AgsCoreAudioDevout *core_audio_devout; AgsApplicationContext *application_context; GList *list_start, *list; gchar *card_uri; gchar *client_name; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } list = list_start = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); while(list != NULL){ if(AGS_IS_CORE_AUDIO_DEVOUT(list->data)){ if(card_id != NULL){ card_uri = ags_soundcard_get_device(AGS_SOUNDCARD(list->data)); if(AGS_CORE_AUDIO_DEVOUT(list->data)->card_uri != NULL){ *card_id = g_list_prepend(*card_id, card_uri); }else{ *card_id = g_list_prepend(*card_id, g_strdup("(null)")); g_warning("ags_core_audio_devout_list_cards() - card id (null)"); } } if(card_name != NULL){ g_object_get(list->data, "core_audio-client", &core_audio_client, NULL); if(core_audio_client != NULL){ /* get client name */ g_object_get(core_audio_client, "client-name", &client_name, NULL); *card_name = g_list_prepend(*card_name, client_name); g_object_unref(core_audio_client); }else{ *card_name = g_list_prepend(*card_name, g_strdup("(null)")); g_warning("ags_core_audio_devout_list_cards() - core_audioaudio client not connected (null)"); } } } list = list->next; } g_list_free_full(list_start, g_object_unref); if(card_id != NULL && *card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL && *card_name != NULL){ *card_name = g_list_reverse(*card_name); } } void ags_core_audio_devout_pcm_info(AgsSoundcard *soundcard, char *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { if(channels_min != NULL){ *channels_min = 1; } if(channels_max != NULL){ *channels_max = 1024; } if(rate_min != NULL){ *rate_min = 8000; } if(rate_max != NULL){ *rate_max = 192000; } if(buffer_size_min != NULL){ *buffer_size_min = 64; } if(buffer_size_max != NULL){ *buffer_size_max = 8192; } } guint ags_core_audio_devout_get_capability(AgsSoundcard *soundcard) { return(AGS_SOUNDCARD_CAPABILITY_PLAYBACK); } gboolean ags_core_audio_devout_is_starting(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gboolean is_starting; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* check is starting */ g_rec_mutex_lock(core_audio_devout_mutex); is_starting = ((AGS_CORE_AUDIO_DEVOUT_START_PLAY & (core_audio_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_devout_mutex); return(is_starting); } gboolean ags_core_audio_devout_is_playing(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gboolean is_playing; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* check is starting */ g_rec_mutex_lock(core_audio_devout_mutex); is_playing = ((AGS_CORE_AUDIO_DEVOUT_PLAY & (core_audio_devout->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_devout_mutex); return(is_playing); } gchar* ags_core_audio_devout_get_uptime(AgsSoundcard *soundcard) { gchar *uptime; if(ags_soundcard_is_playing(soundcard)){ guint samplerate; guint buffer_size; guint note_offset; gdouble bpm; gdouble delay_factor; gdouble delay; ags_soundcard_get_presets(soundcard, NULL, &samplerate, &buffer_size, NULL); note_offset = ags_soundcard_get_note_offset_absolute(soundcard); bpm = ags_soundcard_get_bpm(soundcard); delay_factor = ags_soundcard_get_delay_factor(soundcard); /* calculate delays */ delay = ags_soundcard_get_absolute_delay(soundcard); uptime = ags_time_get_uptime_from_offset(note_offset, bpm, delay, delay_factor); }else{ uptime = g_strdup(AGS_TIME_ZERO); } return(uptime); } void ags_core_audio_devout_port_init(AgsSoundcard *soundcard, GError **error) { AgsCoreAudioPort *core_audio_port; AgsCoreAudioDevout *core_audio_devout; guint format, word_size; gboolean use_cache; GRecMutex *core_audio_port_mutex; GRecMutex *core_audio_devout_mutex; if(ags_soundcard_is_playing(soundcard)){ return; } core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core-audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* port */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_port = (AgsCoreAudioPort *) core_audio_devout->core_audio_port->data; g_rec_mutex_unlock(core_audio_devout_mutex); /* get port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* check use cache */ g_rec_mutex_lock(core_audio_port_mutex); use_cache = core_audio_port->use_cache; if(use_cache){ core_audio_port->completed_cache = 0; core_audio_port->current_cache = 1; } g_rec_mutex_unlock(core_audio_port_mutex); /* retrieve word size */ g_rec_mutex_lock(core_audio_devout_mutex); switch(core_audio_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: g_rec_mutex_unlock(core_audio_devout_mutex); g_warning("ags_core_audio_devout_port_init(): unsupported word size"); return; } /* prepare for playback */ core_audio_devout->flags |= (AGS_CORE_AUDIO_DEVOUT_BUFFER7 | AGS_CORE_AUDIO_DEVOUT_START_PLAY | AGS_CORE_AUDIO_DEVOUT_PLAY | AGS_CORE_AUDIO_DEVOUT_NONBLOCKING); memset(core_audio_devout->buffer[0], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[1], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[2], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[3], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[4], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[5], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[6], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[7], 0, core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); /* */ core_audio_devout->tact_counter = 0.0; core_audio_devout->delay_counter = floor(ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(core_audio_devout))); core_audio_devout->tic_counter = 0; core_audio_devout->flags |= (AGS_CORE_AUDIO_DEVOUT_INITIALIZED | AGS_CORE_AUDIO_DEVOUT_START_PLAY | AGS_CORE_AUDIO_DEVOUT_PLAY); g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK); g_rec_mutex_unlock(core_audio_devout_mutex); } void ags_core_audio_devout_port_play(AgsSoundcard *soundcard, GError **error) { AgsCoreAudioClient *core_audio_client; AgsCoreAudioDevout *core_audio_devout; AgsCoreAudioPort *core_audio_port; AgsTicDevice *tic_device; AgsClearBuffer *clear_buffer; AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; guint word_size; gboolean use_cache; gboolean core_audio_client_activated; GRecMutex *core_audio_devout_mutex; GRecMutex *core_audio_client_mutex; GRecMutex *core_audio_port_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); application_context = ags_application_context_get_instance(); /* get core-audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* client */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_client = (AgsCoreAudioClient *) core_audio_devout->core_audio_client; core_audio_port = (AgsCoreAudioPort *) core_audio_devout->core_audio_port->data; callback_mutex = &(core_audio_devout->callback_mutex); callback_finish_mutex = &(core_audio_devout->callback_finish_mutex); /* do playback */ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_START_PLAY); if((AGS_CORE_AUDIO_DEVOUT_INITIALIZED & (core_audio_devout->flags)) == 0){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } switch(core_audio_devout->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //NOTE:JK: The 24-bit linear samples use 32-bit physical space word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_rec_mutex_unlock(core_audio_devout_mutex); g_warning("ags_core_audio_devout_port_play(): unsupported word size"); return; } g_rec_mutex_unlock(core_audio_devout_mutex); /* get port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* check use cache */ g_rec_mutex_lock(core_audio_port_mutex); use_cache = core_audio_port->use_cache; g_rec_mutex_unlock(core_audio_port_mutex); if(use_cache){ void *buffer; guint current_cache; guint completed_cache; guint write_cache; guint cache_buffer_size; guint cache_offset; guint pcm_channels; guint buffer_size; guint format; struct timespec idle_time = { 0, 0, }; idle_time.tv_nsec = ags_core_audio_port_get_latency(core_audio_port) / 8; g_rec_mutex_lock(core_audio_port_mutex); completed_cache = core_audio_port->completed_cache; cache_buffer_size = core_audio_port->cache_buffer_size; cache_offset = core_audio_port->cache_offset; g_rec_mutex_unlock(core_audio_port_mutex); if(completed_cache == 3){ write_cache = 0; }else{ write_cache = completed_cache + 1; } /* wait until ready */ g_rec_mutex_lock(core_audio_port_mutex); current_cache = core_audio_port->current_cache; g_rec_mutex_unlock(core_audio_port_mutex); while(write_cache == current_cache){ nanosleep(&idle_time, NULL); g_rec_mutex_lock(core_audio_port_mutex); current_cache = core_audio_port->current_cache; g_rec_mutex_unlock(core_audio_port_mutex); } /* fill cache */ g_rec_mutex_lock(core_audio_devout_mutex); pcm_channels = core_audio_devout->pcm_channels; buffer_size = core_audio_devout->buffer_size; format = core_audio_devout->format; g_rec_mutex_unlock(core_audio_devout_mutex); buffer = ags_soundcard_get_buffer(AGS_SOUNDCARD(core_audio_devout)); // g_message("w %d", write_cache); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { if(cache_offset == 0){ ags_audio_buffer_util_clear_buffer(core_audio_port->cache[write_cache], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); } if(buffer != NULL){ ags_audio_buffer_util_copy_s16_to_s16((gint16 *) core_audio_port->cache[write_cache] + (pcm_channels * cache_offset), 1, (gint16 *) buffer, 1, pcm_channels * buffer_size); } } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { if(cache_offset == 0){ ags_audio_buffer_util_clear_buffer(core_audio_port->cache[write_cache], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } if(buffer != NULL){ ags_audio_buffer_util_copy_s24_to_s24((gint32 *) core_audio_port->cache[write_cache] + (pcm_channels * cache_offset), 1, (gint32 *) buffer, 1, pcm_channels * buffer_size); } } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { if(cache_offset == 0){ ags_audio_buffer_util_clear_buffer(core_audio_port->cache[write_cache], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } if(buffer != NULL){ ags_audio_buffer_util_copy_s32_to_s32((gint32 *) core_audio_port->cache[write_cache] + (pcm_channels * cache_offset), 1, (gint32 *) buffer, 1, pcm_channels * buffer_size); } } break; } /* seek cache */ if(cache_offset + buffer_size >= cache_buffer_size){ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->completed_cache = write_cache; core_audio_port->cache_offset = 0; g_rec_mutex_unlock(core_audio_port_mutex); }else{ g_rec_mutex_lock(core_audio_port_mutex); core_audio_port->cache_offset += buffer_size; g_rec_mutex_unlock(core_audio_port_mutex); } }else{ /* get client mutex */ core_audio_client_mutex = AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX(core_audio_client); /* get activated */ g_rec_mutex_lock(core_audio_client_mutex); core_audio_client_activated = ((AGS_CORE_AUDIO_CLIENT_ACTIVATED & (core_audio_client->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(core_audio_client_mutex); if(core_audio_client_activated){ while((AGS_CORE_AUDIO_DEVOUT_PASS_THROUGH & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ usleep(4); } /* signal */ if((AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) == 0){ g_mutex_lock(callback_mutex); g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE); if((AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devout->callback_cond)); } g_mutex_unlock(callback_mutex); // } /* wait callback */ g_mutex_lock(callback_finish_mutex); if((AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) == 0){ g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT); while((AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) == 0 && (AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ g_cond_wait(&(core_audio_devout->callback_finish_cond), callback_finish_mutex); } } g_atomic_int_and(&(core_audio_devout->sync_flags), (~(AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT | AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE))); g_mutex_unlock(callback_finish_mutex); }else{ g_atomic_int_and(&(core_audio_devout->sync_flags), (~AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK)); } } } /* update soundcard */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic soundcard */ tic_device = ags_tic_device_new((GObject *) core_audio_devout); task = g_list_append(task, tic_device); /* reset - clear buffer */ clear_buffer = ags_clear_buffer_new((GObject *) core_audio_devout); task = g_list_append(task, clear_buffer); /* reset - switch buffer flags */ switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) core_audio_devout); task = g_list_append(task, switch_buffer_flag); /* append tasks */ ags_task_launcher_add_task_all(task_launcher, task); /* unref */ g_object_unref(task_launcher); } void ags_core_audio_devout_port_free(AgsSoundcard *soundcard) { AgsCoreAudioPort *core_audio_port; AgsCoreAudioDevout *core_audio_devout; guint pcm_channels; guint cache_buffer_size; guint word_size; gboolean use_cache; GRecMutex *core_audio_port_mutex; GRecMutex *core_audio_devout_mutex; GMutex *callback_mutex; GMutex *callback_finish_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core-audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* port */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_port = (AgsCoreAudioPort *) core_audio_devout->core_audio_port->data; pcm_channels = core_audio_devout->pcm_channels; g_rec_mutex_unlock(core_audio_devout_mutex); /* get port mutex */ core_audio_port_mutex = AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX(core_audio_port); /* check use cache */ g_rec_mutex_lock(core_audio_port_mutex); cache_buffer_size = core_audio_port->cache_buffer_size; use_cache = core_audio_port->use_cache; if(use_cache){ core_audio_port->completed_cache = 0; core_audio_port->current_cache = 0; core_audio_port->cache_offset = 0; } switch(core_audio_port->format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { ags_audio_buffer_util_clear_buffer(core_audio_port->cache[0], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[1], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[2], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[3], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ags_audio_buffer_util_clear_buffer(core_audio_port->cache[0], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[1], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[2], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[3], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ags_audio_buffer_util_clear_buffer(core_audio_port->cache[0], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[1], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[2], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); ags_audio_buffer_util_clear_buffer(core_audio_port->cache[3], 1, pcm_channels * cache_buffer_size, AGS_AUDIO_BUFFER_UTIL_S32); } break; } g_rec_mutex_unlock(core_audio_port_mutex); /* */ g_rec_mutex_lock(core_audio_devout_mutex); if((AGS_CORE_AUDIO_DEVOUT_INITIALIZED & (core_audio_devout->flags)) == 0){ g_rec_mutex_unlock(core_audio_devout_mutex); return; } callback_mutex = &(core_audio_devout->callback_mutex); callback_finish_mutex = &(core_audio_devout->callback_finish_mutex); // g_atomic_int_or(&(AGS_THREAD(application_context->main_loop)->flags), // AGS_THREAD_TIMING); core_audio_devout->flags &= (~(AGS_CORE_AUDIO_DEVOUT_BUFFER0 | AGS_CORE_AUDIO_DEVOUT_BUFFER1 | AGS_CORE_AUDIO_DEVOUT_BUFFER2 | AGS_CORE_AUDIO_DEVOUT_BUFFER3 | AGS_CORE_AUDIO_DEVOUT_BUFFER4 | AGS_CORE_AUDIO_DEVOUT_BUFFER5 | AGS_CORE_AUDIO_DEVOUT_BUFFER6 | AGS_CORE_AUDIO_DEVOUT_BUFFER7 | AGS_CORE_AUDIO_DEVOUT_PLAY)); g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_PASS_THROUGH); g_atomic_int_and(&(core_audio_devout->sync_flags), (~AGS_CORE_AUDIO_DEVOUT_INITIAL_CALLBACK)); /* signal callback */ g_rec_mutex_lock(callback_mutex); g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_CALLBACK_DONE); if((AGS_CORE_AUDIO_DEVOUT_CALLBACK_WAIT & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devout->callback_cond)); } g_rec_mutex_unlock(callback_mutex); /* signal thread */ g_rec_mutex_lock(callback_finish_mutex); g_atomic_int_or(&(core_audio_devout->sync_flags), AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_DONE); if((AGS_CORE_AUDIO_DEVOUT_CALLBACK_FINISH_WAIT & (g_atomic_int_get(&(core_audio_devout->sync_flags)))) != 0){ g_cond_signal(&(core_audio_devout->callback_finish_cond)); } g_rec_mutex_unlock(callback_finish_mutex); /* */ core_audio_devout->note_offset = core_audio_devout->start_note_offset; core_audio_devout->note_offset_absolute = core_audio_devout->start_note_offset; switch(core_audio_devout->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { word_size = sizeof(gint8); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_64_BIT: { word_size = sizeof(gint64); } break; default: word_size = 0; g_critical("ags_core_audio_devout_free(): unsupported word size"); } g_rec_mutex_unlock(core_audio_devout_mutex); if(core_audio_devout->core_audio_port != NULL){ core_audio_port = core_audio_devout->core_audio_port->data; while(!g_atomic_int_get(&(core_audio_port->is_empty))) usleep(500000); } g_rec_mutex_lock(core_audio_devout_mutex); memset(core_audio_devout->buffer[0], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[1], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[2], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[3], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[4], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[5], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[6], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); memset(core_audio_devout->buffer[7], 0, (size_t) core_audio_devout->pcm_channels * core_audio_devout->buffer_size * word_size); g_rec_mutex_unlock(core_audio_devout_mutex); } void ags_core_audio_devout_tic(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gdouble delay; gdouble delay_counter; guint note_offset_absolute; guint note_offset; guint loop_left, loop_right; gboolean do_loop; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* determine if attack should be switched */ g_rec_mutex_lock(core_audio_devout_mutex); delay = core_audio_devout->delay[core_audio_devout->tic_counter]; delay_counter = core_audio_devout->delay_counter; note_offset = core_audio_devout->note_offset; note_offset_absolute = core_audio_devout->note_offset_absolute; loop_left = core_audio_devout->loop_left; loop_right = core_audio_devout->loop_right; do_loop = core_audio_devout->do_loop; g_rec_mutex_unlock(core_audio_devout_mutex); if(delay_counter + 1.0 >= delay){ if(do_loop && note_offset + 1 == loop_right){ ags_soundcard_set_note_offset(soundcard, loop_left); }else{ ags_soundcard_set_note_offset(soundcard, note_offset + 1); } ags_soundcard_set_note_offset_absolute(soundcard, note_offset_absolute + 1); /* delay */ ags_soundcard_offset_changed(soundcard, note_offset); /* reset - delay counter */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->delay_counter = delay_counter + 1.0 - delay; core_audio_devout->tact_counter += 1.0; g_rec_mutex_unlock(core_audio_devout_mutex); }else{ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->delay_counter += 1.0; g_rec_mutex_unlock(core_audio_devout_mutex); } } void ags_core_audio_devout_offset_changed(AgsSoundcard *soundcard, guint note_offset) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* offset changed */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->tic_counter += 1; if(core_audio_devout->tic_counter == AGS_SOUNDCARD_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ core_audio_devout->tic_counter = 0; } g_rec_mutex_unlock(core_audio_devout_mutex); } void ags_core_audio_devout_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set bpm */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->bpm = bpm; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); } gdouble ags_core_audio_devout_get_bpm(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gdouble bpm; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get bpm */ g_rec_mutex_lock(core_audio_devout_mutex); bpm = core_audio_devout->bpm; g_rec_mutex_unlock(core_audio_devout_mutex); return(bpm); } void ags_core_audio_devout_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set delay factor */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->delay_factor = delay_factor; g_rec_mutex_unlock(core_audio_devout_mutex); ags_core_audio_devout_adjust_delay_and_attack(core_audio_devout); } gdouble ags_core_audio_devout_get_delay_factor(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gdouble delay_factor; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get delay factor */ g_rec_mutex_lock(core_audio_devout_mutex); delay_factor = core_audio_devout->delay_factor; g_rec_mutex_unlock(core_audio_devout_mutex); return(delay_factor); } gdouble ags_core_audio_devout_get_delay(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint delay_index; gdouble delay; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get delay */ g_rec_mutex_lock(core_audio_devout_mutex); delay_index = core_audio_devout->tic_counter; delay = core_audio_devout->delay[delay_index]; g_rec_mutex_unlock(core_audio_devout_mutex); return(delay); } gdouble ags_core_audio_devout_get_absolute_delay(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; gdouble absolute_delay; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get absolute delay */ g_rec_mutex_lock(core_audio_devout_mutex); absolute_delay = (60.0 * (((gdouble) core_audio_devout->samplerate / (gdouble) core_audio_devout->buffer_size) / (gdouble) core_audio_devout->bpm) * ((1.0 / 16.0) * (1.0 / (gdouble) core_audio_devout->delay_factor))); g_rec_mutex_unlock(core_audio_devout_mutex); return(absolute_delay); } guint ags_core_audio_devout_get_attack(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint attack_index; guint attack; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get attack */ g_rec_mutex_lock(core_audio_devout_mutex); attack_index = core_audio_devout->tic_counter; attack = core_audio_devout->attack[attack_index]; g_rec_mutex_unlock(core_audio_devout_mutex); return(attack); } void* ags_core_audio_devout_get_buffer(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; void *buffer; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER0)){ buffer = core_audio_devout->buffer[0]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER1)){ buffer = core_audio_devout->buffer[1]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER2)){ buffer = core_audio_devout->buffer[2]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER3)){ buffer = core_audio_devout->buffer[3]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER4)){ buffer = core_audio_devout->buffer[4]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER5)){ buffer = core_audio_devout->buffer[5]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER6)){ buffer = core_audio_devout->buffer[6]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER7)){ buffer = core_audio_devout->buffer[7]; }else{ buffer = NULL; } return(buffer); } void* ags_core_audio_devout_get_next_buffer(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; void *buffer; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER0)){ buffer = core_audio_devout->buffer[1]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER1)){ buffer = core_audio_devout->buffer[2]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER2)){ buffer = core_audio_devout->buffer[3]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER3)){ buffer = core_audio_devout->buffer[4]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER4)){ buffer = core_audio_devout->buffer[5]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER5)){ buffer = core_audio_devout->buffer[6]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER6)){ buffer = core_audio_devout->buffer[7]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER7)){ buffer = core_audio_devout->buffer[0]; }else{ buffer = NULL; } return(buffer); } void* ags_core_audio_devout_get_prev_buffer(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; void *buffer; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER0)){ buffer = core_audio_devout->buffer[7]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER1)){ buffer = core_audio_devout->buffer[0]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER2)){ buffer = core_audio_devout->buffer[1]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER3)){ buffer = core_audio_devout->buffer[2]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER4)){ buffer = core_audio_devout->buffer[3]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER5)){ buffer = core_audio_devout->buffer[4]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER6)){ buffer = core_audio_devout->buffer[5]; }else if(ags_core_audio_devout_test_flags(core_audio_devout, AGS_CORE_AUDIO_DEVOUT_BUFFER7)){ buffer = core_audio_devout->buffer[6]; }else{ buffer = NULL; } return(buffer); } void ags_core_audio_devout_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *buffer_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); buffer_mutex = NULL; if(core_audio_devout->buffer != NULL){ if(buffer == core_audio_devout->buffer[0]){ buffer_mutex = core_audio_devout->buffer_mutex[0]; }else if(buffer == core_audio_devout->buffer[1]){ buffer_mutex = core_audio_devout->buffer_mutex[1]; }else if(buffer == core_audio_devout->buffer[2]){ buffer_mutex = core_audio_devout->buffer_mutex[2]; }else if(buffer == core_audio_devout->buffer[3]){ buffer_mutex = core_audio_devout->buffer_mutex[3]; }else if(buffer == core_audio_devout->buffer[4]){ buffer_mutex = core_audio_devout->buffer_mutex[4]; }else if(buffer == core_audio_devout->buffer[5]){ buffer_mutex = core_audio_devout->buffer_mutex[5]; }else if(buffer == core_audio_devout->buffer[6]){ buffer_mutex = core_audio_devout->buffer_mutex[6]; }else if(buffer == core_audio_devout->buffer[7]){ buffer_mutex = core_audio_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_core_audio_devout_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *buffer_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); buffer_mutex = NULL; if(core_audio_devout->buffer != NULL){ if(buffer == core_audio_devout->buffer[0]){ buffer_mutex = core_audio_devout->buffer_mutex[0]; }else if(buffer == core_audio_devout->buffer[1]){ buffer_mutex = core_audio_devout->buffer_mutex[1]; }else if(buffer == core_audio_devout->buffer[2]){ buffer_mutex = core_audio_devout->buffer_mutex[2]; }else if(buffer == core_audio_devout->buffer[3]){ buffer_mutex = core_audio_devout->buffer_mutex[3]; }else if(buffer == core_audio_devout->buffer[4]){ buffer_mutex = core_audio_devout->buffer_mutex[4]; }else if(buffer == core_audio_devout->buffer[5]){ buffer_mutex = core_audio_devout->buffer_mutex[5]; }else if(buffer == core_audio_devout->buffer[6]){ buffer_mutex = core_audio_devout->buffer_mutex[6]; }else if(buffer == core_audio_devout->buffer[7]){ buffer_mutex = core_audio_devout->buffer_mutex[7]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } guint ags_core_audio_devout_get_delay_counter(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint delay_counter; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* delay counter */ g_rec_mutex_lock(core_audio_devout_mutex); delay_counter = core_audio_devout->delay_counter; g_rec_mutex_unlock(core_audio_devout_mutex); return(delay_counter); } void ags_core_audio_devout_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set note offset */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->start_note_offset = start_note_offset; g_rec_mutex_unlock(core_audio_devout_mutex); } guint ags_core_audio_devout_get_start_note_offset(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint start_note_offset; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set note offset */ g_rec_mutex_lock(core_audio_devout_mutex); start_note_offset = core_audio_devout->start_note_offset; g_rec_mutex_unlock(core_audio_devout_mutex); return(start_note_offset); } void ags_core_audio_devout_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set note offset */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->note_offset = note_offset; g_rec_mutex_unlock(core_audio_devout_mutex); } guint ags_core_audio_devout_get_note_offset(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint note_offset; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set note offset */ g_rec_mutex_lock(core_audio_devout_mutex); note_offset = core_audio_devout->note_offset; g_rec_mutex_unlock(core_audio_devout_mutex); return(note_offset); } void ags_core_audio_devout_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset_absolute) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set note offset */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->note_offset_absolute = note_offset_absolute; g_rec_mutex_unlock(core_audio_devout_mutex); } guint ags_core_audio_devout_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint note_offset_absolute; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set note offset */ g_rec_mutex_lock(core_audio_devout_mutex); note_offset_absolute = core_audio_devout->note_offset_absolute; g_rec_mutex_unlock(core_audio_devout_mutex); return(note_offset_absolute); } void ags_core_audio_devout_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* set loop */ g_rec_mutex_lock(core_audio_devout_mutex); core_audio_devout->loop_left = loop_left; core_audio_devout->loop_right = loop_right; core_audio_devout->do_loop = do_loop; if(do_loop){ core_audio_devout->loop_offset = core_audio_devout->note_offset; } g_rec_mutex_unlock(core_audio_devout_mutex); } void ags_core_audio_devout_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsCoreAudioDevout *core_audio_devout; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get loop */ g_rec_mutex_lock(core_audio_devout_mutex); if(loop_left != NULL){ *loop_left = core_audio_devout->loop_left; } if(loop_right != NULL){ *loop_right = core_audio_devout->loop_right; } if(do_loop != NULL){ *do_loop = core_audio_devout->do_loop; } g_rec_mutex_unlock(core_audio_devout_mutex); } guint ags_core_audio_devout_get_loop_offset(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint loop_offset; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get loop offset */ g_rec_mutex_lock(core_audio_devout_mutex); loop_offset = core_audio_devout->loop_offset; g_rec_mutex_unlock(core_audio_devout_mutex); return(loop_offset); } guint ags_core_audio_devout_get_sub_block_count(AgsSoundcard *soundcard) { AgsCoreAudioDevout *core_audio_devout; guint sub_block_count; GRecMutex *core_audio_devout_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get loop offset */ g_rec_mutex_lock(core_audio_devout_mutex); sub_block_count = core_audio_devout->sub_block_count; g_rec_mutex_unlock(core_audio_devout_mutex); return(sub_block_count); } gboolean ags_core_audio_devout_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsCoreAudioDevout *core_audio_devout; guint pcm_channels; guint sub_block_count; gboolean success; GRecMutex *core_audio_devout_mutex; GRecMutex *sub_block_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get loop offset */ g_rec_mutex_lock(core_audio_devout_mutex); pcm_channels = core_audio_devout->pcm_channels; sub_block_count = core_audio_devout->sub_block_count; g_rec_mutex_unlock(core_audio_devout_mutex); sub_block_mutex = NULL; success = FALSE; if(core_audio_devout->buffer != NULL){ if(buffer == core_audio_devout->buffer[0]){ sub_block_mutex = core_audio_devout->sub_block_mutex[sub_block]; }else if(buffer == core_audio_devout->buffer[1]){ sub_block_mutex = core_audio_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[2]){ sub_block_mutex = core_audio_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[3]){ sub_block_mutex = core_audio_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[4]){ sub_block_mutex = core_audio_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[5]){ sub_block_mutex = core_audio_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[6]){ sub_block_mutex = core_audio_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[7]){ sub_block_mutex = core_audio_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ if(g_rec_mutex_trylock(sub_block_mutex) == 0){ success = TRUE; } } return(success); } void ags_core_audio_devout_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsCoreAudioDevout *core_audio_devout; guint pcm_channels; guint sub_block_count; GRecMutex *core_audio_devout_mutex; GRecMutex *sub_block_mutex; core_audio_devout = AGS_CORE_AUDIO_DEVOUT(soundcard); /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get loop offset */ g_rec_mutex_lock(core_audio_devout_mutex); pcm_channels = core_audio_devout->pcm_channels; sub_block_count = core_audio_devout->sub_block_count; g_rec_mutex_unlock(core_audio_devout_mutex); sub_block_mutex = NULL; if(core_audio_devout->buffer != NULL){ if(buffer == core_audio_devout->buffer[0]){ sub_block_mutex = core_audio_devout->sub_block_mutex[sub_block]; }else if(buffer == core_audio_devout->buffer[1]){ sub_block_mutex = core_audio_devout->sub_block_mutex[pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[2]){ sub_block_mutex = core_audio_devout->sub_block_mutex[2 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[3]){ sub_block_mutex = core_audio_devout->sub_block_mutex[3 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[4]){ sub_block_mutex = core_audio_devout->sub_block_mutex[4 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[5]){ sub_block_mutex = core_audio_devout->sub_block_mutex[5 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[6]){ sub_block_mutex = core_audio_devout->sub_block_mutex[6 * pcm_channels * sub_block_count + sub_block]; }else if(buffer == core_audio_devout->buffer[7]){ sub_block_mutex = core_audio_devout->sub_block_mutex[7 * pcm_channels * sub_block_count + sub_block]; } } if(sub_block_mutex != NULL){ g_rec_mutex_unlock(sub_block_mutex); } } /** * ags_core_audio_devout_switch_buffer_flag: * @core_audio_devout: an #AgsCoreAudioDevout * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_core_audio_devout_switch_buffer_flag(AgsCoreAudioDevout *core_audio_devout) { GRecMutex *core_audio_devout_mutex; if(!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_devout)){ return; } /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* switch buffer flag */ g_rec_mutex_lock(core_audio_devout_mutex); if((AGS_CORE_AUDIO_DEVOUT_BUFFER0 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER0); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER1; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER1 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER1); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER2; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER2 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER2); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER3; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER3 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER3); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER4; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER4 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER4); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER5; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER5 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER5); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER6; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER6 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER6); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER7; }else if((AGS_CORE_AUDIO_DEVOUT_BUFFER7 & (core_audio_devout->flags)) != 0){ core_audio_devout->flags &= (~AGS_CORE_AUDIO_DEVOUT_BUFFER7); core_audio_devout->flags |= AGS_CORE_AUDIO_DEVOUT_BUFFER0; } g_rec_mutex_unlock(core_audio_devout_mutex); } /** * ags_core_audio_devout_adjust_delay_and_attack: * @core_audio_devout: the #AgsCoreAudioDevout * * Calculate delay and attack and reset it. * * Since: 3.0.0 */ void ags_core_audio_devout_adjust_delay_and_attack(AgsCoreAudioDevout *core_audio_devout) { gdouble delay; guint default_tact_frames; guint delay_tact_frames; guint default_period; gint next_attack; guint i; GRecMutex *core_audio_devout_mutex; if(!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_devout)){ return; } /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get some initial values */ delay = ags_soundcard_get_absolute_delay(AGS_SOUNDCARD(core_audio_devout)); #ifdef AGS_DEBUG g_message("delay : %f", delay); #endif g_rec_mutex_lock(core_audio_devout_mutex); default_tact_frames = (guint) (delay * core_audio_devout->buffer_size); delay_tact_frames = (guint) (floor(delay) * core_audio_devout->buffer_size); default_period = (1.0 / AGS_SOUNDCARD_DEFAULT_PERIOD) * (default_tact_frames); i = 0; core_audio_devout->attack[0] = (guint) floor(0.25 * core_audio_devout->buffer_size); next_attack = (((core_audio_devout->attack[i] + default_tact_frames) / core_audio_devout->buffer_size) - delay) * core_audio_devout->buffer_size; if(next_attack < 0){ next_attack = 0; } if(next_attack >= core_audio_devout->buffer_size){ next_attack = core_audio_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ core_audio_devout->attack[i] = core_audio_devout->attack[i] - ((gdouble) next_attack / 2.0); if(core_audio_devout->attack[i] < 0){ core_audio_devout->attack[i] = 0; } if(core_audio_devout->attack[i] >= core_audio_devout->buffer_size){ core_audio_devout->attack[i] = core_audio_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= core_audio_devout->buffer_size){ next_attack = core_audio_devout->buffer_size - 1; } } for(i = 1; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD; i++){ core_audio_devout->attack[i] = next_attack; next_attack = (((core_audio_devout->attack[i] + default_tact_frames) / core_audio_devout->buffer_size) - delay) * core_audio_devout->buffer_size; if(next_attack >= core_audio_devout->buffer_size){ next_attack = core_audio_devout->buffer_size - 1; } /* check if delay drops for next attack */ if(next_attack < 0){ core_audio_devout->attack[i] = core_audio_devout->attack[i] - ((gdouble) next_attack / 2.0); if(core_audio_devout->attack[i] < 0){ core_audio_devout->attack[i] = 0; } if(core_audio_devout->attack[i] >= core_audio_devout->buffer_size){ core_audio_devout->attack[i] = core_audio_devout->buffer_size - 1; } next_attack = next_attack + (next_attack / 2.0); if(next_attack < 0){ next_attack = 0; } if(next_attack >= core_audio_devout->buffer_size){ next_attack = core_audio_devout->buffer_size - 1; } } #ifdef AGS_DEBUG g_message("%d", core_audio_devout->attack[i]); #endif } core_audio_devout->attack[0] = core_audio_devout->attack[i - 2]; for(i = 0; i < (int) 2.0 * AGS_SOUNDCARD_DEFAULT_PERIOD - 1; i++){ core_audio_devout->delay[i] = ((gdouble) (default_tact_frames + core_audio_devout->attack[i] - core_audio_devout->attack[i + 1])) / (gdouble) core_audio_devout->buffer_size; #ifdef AGS_DEBUG g_message("%f", core_audio_devout->delay[i]); #endif } core_audio_devout->delay[i] = ((gdouble) (default_tact_frames + core_audio_devout->attack[i] - core_audio_devout->attack[0])) / (gdouble) core_audio_devout->buffer_size; g_rec_mutex_unlock(core_audio_devout_mutex); } /** * ags_core_audio_devout_realloc_buffer: * @core_audio_devout: the #AgsCoreAudioDevout * * Reallocate the internal audio buffer. * * Since: 3.0.0 */ void ags_core_audio_devout_realloc_buffer(AgsCoreAudioDevout *core_audio_devout) { guint pcm_channels; guint buffer_size; guint format; guint word_size; GRecMutex *core_audio_devout_mutex; if(!AGS_IS_CORE_AUDIO_DEVOUT(core_audio_devout)){ return; } /* get core_audio devout mutex */ core_audio_devout_mutex = AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX(core_audio_devout); /* get word size */ g_rec_mutex_lock(core_audio_devout_mutex); pcm_channels = core_audio_devout->pcm_channels; buffer_size = core_audio_devout->buffer_size; format = core_audio_devout->format; g_rec_mutex_unlock(core_audio_devout_mutex); switch(format){ case AGS_SOUNDCARD_SIGNED_16_BIT: { word_size = sizeof(gint16); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { word_size = sizeof(gint32); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { word_size = sizeof(gint32); } break; default: g_warning("ags_core_audio_devout_realloc_buffer(): unsupported word size"); return; } /* AGS_CORE_AUDIO_DEVOUT_BUFFER_0 */ if(core_audio_devout->buffer[0] != NULL){ free(core_audio_devout->buffer[0]); } core_audio_devout->buffer[0] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_1 */ if(core_audio_devout->buffer[1] != NULL){ free(core_audio_devout->buffer[1]); } core_audio_devout->buffer[1] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_2 */ if(core_audio_devout->buffer[2] != NULL){ free(core_audio_devout->buffer[2]); } core_audio_devout->buffer[2] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_3 */ if(core_audio_devout->buffer[3] != NULL){ free(core_audio_devout->buffer[3]); } core_audio_devout->buffer[3] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_4 */ if(core_audio_devout->buffer[4] != NULL){ free(core_audio_devout->buffer[4]); } core_audio_devout->buffer[4] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_5 */ if(core_audio_devout->buffer[5] != NULL){ free(core_audio_devout->buffer[5]); } core_audio_devout->buffer[5] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_6 */ if(core_audio_devout->buffer[6] != NULL){ free(core_audio_devout->buffer[6]); } core_audio_devout->buffer[6] = (void *) malloc(pcm_channels * buffer_size * word_size); /* AGS_CORE_AUDIO_DEVOUT_BUFFER_7 */ if(core_audio_devout->buffer[7] != NULL){ free(core_audio_devout->buffer[7]); } core_audio_devout->buffer[7] = (void *) malloc(pcm_channels * buffer_size * word_size); } /** * ags_core_audio_devout_new: * * Creates a new instance of #AgsCoreAudioDevout. * * Returns: a new #AgsCoreAudioDevout * * Since: 3.0.0 */ AgsCoreAudioDevout* ags_core_audio_devout_new() { AgsCoreAudioDevout *core_audio_devout; core_audio_devout = (AgsCoreAudioDevout *) g_object_new(AGS_TYPE_CORE_AUDIO_DEVOUT, NULL); return(core_audio_devout); } gsequencer-3.1.3/ags/audio/osc/0000755000175000017500000000000013622252264013323 500000000000000gsequencer-3.1.3/ags/audio/osc/ags_osc_xmlrpc_message.h0000644000175000017500000000436313607210263020125 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_XMLRPC_MESSAGE_H__ #define __AGS_OSC_XMLRPC_MESSAGE_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_XMLRPC_MESSAGE (ags_osc_xmlrpc_message_get_type ()) #define AGS_OSC_XMLRPC_MESSAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_XMLRPC_MESSAGE, AgsOscXmlrpcMessage)) #define AGS_OSC_XMLRPC_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_XMLRPC_MESSAGE, AgsOscXmlrpcMessageClass)) #define AGS_IS_OSC_XMLRPC_MESSAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_XMLRPC_MESSAGE)) #define AGS_IS_OSC_XMLRPC_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_XMLRPC_MESSAGE)) #define AGS_OSC_XMLRPC_MESSAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_XMLRPC_MESSAGE, AgsOscXmlrpcMessageClass)) typedef struct _AgsOscXmlrpcMessage AgsOscXmlrpcMessage; typedef struct _AgsOscXmlrpcMessageClass AgsOscXmlrpcMessageClass; struct _AgsOscXmlrpcMessage { AgsOscMessage osc_message; SoupMessage *msg; GHashTable *query; }; struct _AgsOscXmlrpcMessageClass { AgsOscMessageClass osc_message; }; GType ags_osc_xmlrpc_message_get_type(void); /* instance */ AgsOscXmlrpcMessage* ags_osc_xmlrpc_message_new(); G_END_DECLS #endif /*__AGS_OSC_XMLRPC_MESSAGE_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_server.c0000644000175000017500000011600613613101164016407 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_server_class_init(AgsOscServerClass *osc_server); void ags_osc_server_init(AgsOscServer *osc_server); void ags_osc_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_server_dispose(GObject *gobject); void ags_osc_server_finalize(GObject *gobject); void ags_osc_server_real_start(AgsOscServer *osc_server); void ags_osc_server_real_stop(AgsOscServer *osc_server); gboolean ags_osc_server_real_listen(AgsOscServer *osc_server); void ags_osc_server_real_dispatch(AgsOscServer *osc_server); void* ags_osc_server_listen_thread(void *ptr); void* ags_osc_server_dispatch_thread(void *ptr); /** * SECTION:ags_osc_server * @short_description: the OSC server * @title: AgsOscServer * @section_id: * @include: ags/audio/osc/ags_osc_server.h * * #AgsOscServer your osc server. */ enum{ PROP_0, PROP_DOMAIN, PROP_SERVER_PORT, PROP_IP4, PROP_IP6, PROP_CONNECTION, PROP_FRONT_CONTROLLER, PROP_CONTROLLER, }; enum{ START, STOP, LISTEN, DISPATCH, LAST_SIGNAL, }; static gpointer ags_osc_server_parent_class = NULL; static guint osc_server_signals[LAST_SIGNAL]; GType ags_osc_server_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_server = 0; static const GTypeInfo ags_osc_server_info = { sizeof (AgsOscServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_server_init, }; ags_type_osc_server = g_type_register_static(G_TYPE_OBJECT, "AgsOscServer", &ags_osc_server_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_server); } return g_define_type_id__volatile; } void ags_osc_server_class_init(AgsOscServerClass *osc_server) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_server_parent_class = g_type_class_peek_parent(osc_server); /* GObjectClass */ gobject = (GObjectClass *) osc_server; gobject->set_property = ags_osc_server_set_property; gobject->get_property = ags_osc_server_get_property; gobject->dispose = ags_osc_server_dispose; gobject->finalize = ags_osc_server_finalize; /* properties */ /** * AgsOscServer:domain: * * The domain to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("domain", i18n_pspec("domain"), i18n_pspec("The domain to use"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DOMAIN, param_spec); /** * AgsOscServer:server-port: * * The server port to use. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("server-port", i18n_pspec("server port"), i18n_pspec("The server port to use"), 0, G_MAXUINT32, AGS_OSC_SERVER_DEFAULT_SERVER_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SERVER_PORT, param_spec); /** * AgsOscServer:ip4: * * The IPv4 address as string of the server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip4", i18n_pspec("ip4"), i18n_pspec("The IPv4 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP4, param_spec); /** * AgsOscServer:ip6: * * The IPv6 address as string of the server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip6", i18n_pspec("ip6"), i18n_pspec("The IPv6 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP6, param_spec); /** * AgsOscServer:connection: (type GList(AgsOscConnection)) (transfer full) * * The assigned #AgsOscConnection providing default settings. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("connection", i18n_pspec("assigned connection"), i18n_pspec("The connection it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONNECTION, param_spec); /** * AgsOscServer:front-controller: * * The assigned #AgsOscFrontController. * * Since: 3.0.0 */ param_spec = g_param_spec_object("front-controller", i18n_pspec("assigned OSC front controller"), i18n_pspec("The OSC front controller it is assigned with"), AGS_TYPE_OSC_FRONT_CONTROLLER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FRONT_CONTROLLER, param_spec); /** * AgsOscServer:controller: (type GList(AgsOscController)) (transfer full) * * The assigned #AgsOscController providing default settings. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("controller", i18n_pspec("assigned controller"), i18n_pspec("The controller it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROLLER, param_spec); /* AgsOscServerClass */ osc_server->start = ags_osc_server_real_start; osc_server->stop = ags_osc_server_real_stop; osc_server->listen = ags_osc_server_real_listen; osc_server->dispatch = ags_osc_server_real_dispatch; /* signals */ /** * AgsOscServer::start: * @osc_server: the #AgsOscServer * * The ::start signal is emited during start of server. * * Since: 3.0.0 */ osc_server_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS(osc_server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscServerClass, start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscServer::stop: * @osc_server: the #AgsOscServer * * The ::stop signal is emited during stop of server. * * Since: 3.0.0 */ osc_server_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS(osc_server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscServerClass, stop), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscServer::listen: * @osc_server: the #AgsOscServer * * The ::listen signal is emited during listen of server. * * Returns: %TRUE as a new connection was initiated, otherwise %FALSE * * Since: 3.0.0 */ osc_server_signals[LISTEN] = g_signal_new("listen", G_TYPE_FROM_CLASS(osc_server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscServerClass, listen), NULL, NULL, ags_cclosure_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); /** * AgsOscServer::dispatch: * @osc_server: the #AgsOscServer * * The ::dispatch signal is emited during dispatch of server. * * Since: 3.0.0 */ osc_server_signals[DISPATCH] = g_signal_new("dispatch", G_TYPE_FROM_CLASS(osc_server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscServerClass, dispatch), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_osc_server_init(AgsOscServer *osc_server) { osc_server->flags = 0; /* osc server mutex */ g_rec_mutex_init(&(osc_server->obj_mutex)); osc_server->ip4 = g_strdup(AGS_OSC_SERVER_DEFAULT_INET4_ADDRESS); osc_server->ip6 = g_strdup(AGS_OSC_SERVER_DEFAULT_INET6_ADDRESS); osc_server->domain = g_strdup(AGS_OSC_SERVER_DEFAULT_DOMAIN); osc_server->server_port = AGS_OSC_SERVER_DEFAULT_SERVER_PORT; osc_server->ip4_fd = -1; osc_server->ip6_fd = -1; osc_server->ip4_socket = NULL; osc_server->ip6_socket = NULL; osc_server->ip4_address = NULL; osc_server->ip6_address = NULL; osc_server->accept_delay = (struct timespec *) malloc(sizeof(struct timespec)); osc_server->accept_delay->tv_sec = 0; osc_server->accept_delay->tv_nsec = AGS_NSEC_PER_SEC / 1000; osc_server->dispatch_delay = (struct timespec *) malloc(sizeof(struct timespec)); osc_server->dispatch_delay->tv_sec = 0; osc_server->dispatch_delay->tv_nsec = AGS_NSEC_PER_SEC / 1000; osc_server->listen_thread = NULL; osc_server->dispatch_thread = NULL; osc_server->connection = NULL; osc_server->front_controller = NULL; osc_server->controller = NULL; } void ags_osc_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscServer *osc_server; GRecMutex *osc_server_mutex; osc_server = AGS_OSC_SERVER(gobject); /* get osc server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); switch(prop_id){ case PROP_DOMAIN: { gchar *domain; domain = g_value_get_string(value); g_rec_mutex_lock(osc_server_mutex); if(osc_server->domain == domain){ g_rec_mutex_unlock(osc_server_mutex); return; } g_free(osc_server->domain); osc_server->domain = g_strdup(domain); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_SERVER_PORT: { guint server_port; server_port = g_value_get_uint(value); g_rec_mutex_lock(osc_server_mutex); osc_server->server_port = server_port; g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_IP4: { gchar *ip4; ip4 = g_value_get_string(value); g_rec_mutex_lock(osc_server_mutex); if(osc_server->ip4 == ip4){ g_rec_mutex_unlock(osc_server_mutex); return; } g_free(osc_server->ip4); osc_server->ip4 = g_strdup(ip4); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_IP6: { gchar *ip6; ip6 = g_value_get_string(value); g_rec_mutex_lock(osc_server_mutex); if(osc_server->ip6 == ip6){ g_rec_mutex_unlock(osc_server_mutex); return; } g_free(osc_server->ip6); osc_server->ip6 = g_strdup(ip6); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_CONNECTION: { GObject *connection; connection = g_value_get_pointer(value); g_rec_mutex_lock(osc_server_mutex); if(g_list_find(osc_server->connection, connection) != NULL){ g_rec_mutex_unlock(osc_server_mutex); return; } g_rec_mutex_unlock(osc_server_mutex); ags_osc_server_add_connection(osc_server, connection); } break; case PROP_FRONT_CONTROLLER: { GObject *front_controller; front_controller = g_value_get_object(value); g_rec_mutex_lock(osc_server_mutex); if(osc_server->front_controller == front_controller){ g_rec_mutex_unlock(osc_server_mutex); return; } if(osc_server->front_controller != NULL){ g_object_unref(osc_server->front_controller); } if(front_controller != NULL){ g_object_ref(front_controller); } osc_server->front_controller = front_controller; g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_CONTROLLER: { GObject *controller; controller = g_value_get_pointer(value); g_rec_mutex_lock(osc_server_mutex); if(g_list_find(osc_server->controller, controller) != NULL){ g_rec_mutex_unlock(osc_server_mutex); return; } g_rec_mutex_unlock(osc_server_mutex); ags_osc_server_add_controller(osc_server, controller); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscServer *osc_server; GRecMutex *osc_server_mutex; osc_server = AGS_OSC_SERVER(gobject); /* get osc server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); switch(prop_id){ case PROP_DOMAIN: { g_rec_mutex_lock(osc_server_mutex); g_value_set_string(value, osc_server->domain); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_SERVER_PORT: { g_rec_mutex_lock(osc_server_mutex); g_value_set_uint(value, osc_server->server_port); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_IP4: { g_rec_mutex_lock(osc_server_mutex); g_value_set_string(value, osc_server->ip4); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_IP6: { g_rec_mutex_lock(osc_server_mutex); g_value_set_string(value, osc_server->ip6); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_CONNECTION: { g_rec_mutex_lock(osc_server_mutex); g_value_set_pointer(value, g_list_copy_deep(osc_server->connection, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_FRONT_CONTROLLER: { g_rec_mutex_lock(osc_server_mutex); g_value_set_object(value, osc_server->front_controller); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_CONTROLLER: { g_rec_mutex_lock(osc_server_mutex); g_value_set_pointer(value, g_list_copy_deep(osc_server->controller, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(osc_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_server_dispose(GObject *gobject) { AgsOscServer *osc_server; GList *start_list, *list; osc_server = (AgsOscServer *) gobject; if(osc_server->connection != NULL){ list = start_list = osc_server->connection; while(list != NULL){ g_object_set(list->data, "osc-server", NULL, NULL); } g_list_free_full(start_list, g_object_unref); osc_server->connection = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_server_parent_class)->dispose(gobject); } void ags_osc_server_finalize(GObject *gobject) { AgsOscServer *osc_server; osc_server = (AgsOscServer *) gobject; g_free(osc_server->domain); g_free(osc_server->ip4); g_free(osc_server->ip6); if(osc_server->accept_delay != NULL){ free(osc_server->accept_delay); } if(osc_server->dispatch_delay != NULL){ free(osc_server->dispatch_delay); } g_list_free_full(osc_server->connection, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_osc_server_parent_class)->finalize(gobject); } /** * ags_osc_server_test_flags: * @osc_server: the #AgsOscServer * @flags: the flags * * Test @flags to be set on @osc_server. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_server_test_flags(AgsOscServer *osc_server, guint flags) { gboolean retval; GRecMutex *osc_server_mutex; if(!AGS_IS_OSC_SERVER(osc_server)){ return(FALSE); } /* get osc_server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); /* test */ g_rec_mutex_lock(osc_server_mutex); retval = ((flags & (osc_server->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(osc_server_mutex); return(retval); } /** * ags_osc_server_set_flags: * @osc_server: the #AgsOscServer * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_server_set_flags(AgsOscServer *osc_server, guint flags) { GRecMutex *osc_server_mutex; if(!AGS_IS_OSC_SERVER(osc_server)){ return; } /* get osc_server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); /* set flags */ g_rec_mutex_lock(osc_server_mutex); osc_server->flags = (flags | (osc_server->flags)); g_rec_mutex_unlock(osc_server_mutex); } /** * ags_osc_server_unset_flags: * @osc_server: the #AgsOscServer * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_server_unset_flags(AgsOscServer *osc_server, guint flags) { GRecMutex *osc_server_mutex; if(!AGS_IS_OSC_SERVER(osc_server)){ return; } /* get osc_server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); /* set flags */ g_rec_mutex_lock(osc_server_mutex); osc_server->flags = ((~flags) & (osc_server->flags)); g_rec_mutex_unlock(osc_server_mutex); } /** * ags_osc_server_add_connection: * @osc_server: the #AgsOscServer * @osc_connection: the #AgsOscConnection * * Add @osc_connection to @osc_server. * * Since: 3.0.0 */ void ags_osc_server_add_connection(AgsOscServer *osc_server, GObject *osc_connection) { if(!AGS_IS_OSC_SERVER(osc_server) || !AGS_IS_OSC_CONNECTION(osc_connection)){ return; } if(g_list_find(osc_server->connection, osc_connection) == NULL){ g_object_ref(osc_connection); osc_server->connection = g_list_prepend(osc_server->connection, osc_connection); g_object_set(osc_connection, "osc-server", osc_server, NULL); } } /** * ags_osc_server_remove_connection: * @osc_server: the #AgsOscServer * @osc_connection: the #AgsOscConnection * * Remove @osc_connection from @osc_server. * * Since: 3.0.0 */ void ags_osc_server_remove_connection(AgsOscServer *osc_server, GObject *osc_connection) { if(!AGS_IS_OSC_SERVER(osc_server) || !AGS_IS_OSC_CONNECTION(osc_connection)){ return; } if(g_list_find(osc_server->connection, osc_connection) != NULL){ osc_server->connection = g_list_remove(osc_server->connection, osc_connection); g_object_set(osc_connection, "osc-server", NULL, NULL); g_object_unref(osc_connection); } } /** * ags_osc_server_add_controller: * @osc_server: the #AgsOscServer * @osc_controller: the #AgsOscController * * Add @osc_controller to @osc_server. * * Since: 3.0.0 */ void ags_osc_server_add_controller(AgsOscServer *osc_server, GObject *osc_controller) { if(!AGS_IS_OSC_SERVER(osc_server) || !AGS_IS_OSC_CONTROLLER(osc_controller)){ return; } if(g_list_find(osc_server->controller, osc_controller) == NULL){ g_object_ref(osc_controller); osc_server->controller = g_list_prepend(osc_server->controller, osc_controller); g_object_set(osc_controller, "osc-server", osc_server, NULL); } } /** * ags_osc_server_remove_controller: * @osc_server: the #AgsOscServer * @osc_controller: the #AgsOscController * * Remove @osc_controller from @osc_server. * * Since: 3.0.0 */ void ags_osc_server_remove_controller(AgsOscServer *osc_server, GObject *osc_controller) { if(!AGS_IS_OSC_SERVER(osc_server) || !AGS_IS_OSC_CONTROLLER(osc_controller)){ return; } if(g_list_find(osc_server->controller, osc_controller) != NULL){ osc_server->controller = g_list_remove(osc_server->controller, osc_controller); g_object_set(osc_controller, "osc-server", NULL, NULL); g_object_unref(osc_controller); } } /** * ags_osc_server_add_default_controller: * @osc_server: the #AgsOscServer * * Add default controlers to @osc_server. * * Since: 3.0.0 */ void ags_osc_server_add_default_controller(AgsOscServer *osc_server) { AgsOscFrontController *front_controller; AgsOscActionController *action_controller; AgsOscConfigController *config_controller; AgsOscInfoController *info_controller; AgsOscMeterController *meter_controller; AgsOscNodeController *node_controller; AgsOscRenewController *renew_controller; AgsOscStatusController *status_controller; if(!AGS_IS_OSC_SERVER(osc_server)){ return; } /* front controller */ front_controller = ags_osc_front_controller_new(); g_object_set(front_controller, "osc-server", osc_server, NULL); g_object_set(osc_server, "front-controller", front_controller, NULL); /* action controller */ action_controller = ags_osc_action_controller_new(); g_object_set(action_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) action_controller); /* config controller */ config_controller = ags_osc_config_controller_new(); g_object_set(config_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) config_controller); /* info controller */ info_controller = ags_osc_info_controller_new(); g_object_set(info_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) info_controller); /* meter controller */ meter_controller = ags_osc_meter_controller_new(); g_object_set(meter_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) meter_controller); /* node controller */ node_controller = ags_osc_node_controller_new(); g_object_set(node_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) node_controller); /* renew controller */ renew_controller = ags_osc_renew_controller_new(); g_object_set(renew_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) renew_controller); /* status controller */ status_controller = ags_osc_status_controller_new(); g_object_set(status_controller, "osc-server", osc_server, NULL); ags_osc_server_add_controller(osc_server, (GObject *) status_controller); } void ags_osc_server_real_start(AgsOscServer *osc_server) { AgsOscFrontController *osc_front_controller; GList *start_controller, *controller; gboolean any_address; gboolean ip4_success, ip6_success; gboolean ip4_udp_success, ip4_tcp_success; gboolean ip6_udp_success, ip6_tcp_success; GError *error; GRecMutex *osc_server_mutex; if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_STARTED)){ return; } ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_STARTED); /* get osc_server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); any_address = ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_ANY_ADDRESS); ip4_success = FALSE; ip6_success = FALSE; ip4_udp_success = FALSE; ip4_tcp_success = FALSE; ip6_udp_success = FALSE; ip6_tcp_success = FALSE; if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_INET4)){ ip4_success = TRUE; if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_UDP)){ ip4_udp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_server_mutex); error = NULL; osc_server->ip4_socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error); osc_server->ip4_fd = g_socket_get_fd(osc_server->ip4_socket); g_socket_set_listen_backlog(osc_server->ip4_socket, AGS_OSC_SERVER_DEFAULT_BACKLOG); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } }else if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_TCP)){ ip4_tcp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_server_mutex); error = NULL; osc_server->ip4_socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error); osc_server->ip4_fd = g_socket_get_fd(osc_server->ip4_socket); g_socket_set_listen_backlog(osc_server->ip4_socket, AGS_OSC_SERVER_DEFAULT_BACKLOG); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } }else{ g_critical("no flow control type"); } /* get ip4 */ if(any_address){ g_rec_mutex_lock(osc_server_mutex); osc_server->ip4_address = g_inet_socket_address_new(g_inet_address_new_any(G_SOCKET_FAMILY_IPV4), osc_server->server_port); g_rec_mutex_unlock(osc_server_mutex); }else{ g_rec_mutex_lock(osc_server_mutex); osc_server->ip4_address = g_inet_socket_address_new(g_inet_address_new_from_string(osc_server->ip4), osc_server->server_port); g_rec_mutex_unlock(osc_server_mutex); } } if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_INET6)){ ip6_success = TRUE; if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_UDP)){ ip6_udp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_server_mutex); error = NULL; osc_server->ip6_socket = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error); osc_server->ip6_fd = g_socket_get_fd(osc_server->ip6_socket); g_socket_set_listen_backlog(osc_server->ip6_socket, AGS_OSC_SERVER_DEFAULT_BACKLOG); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } }else if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_TCP)){ ip6_tcp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_server_mutex); error = NULL; osc_server->ip6_socket = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error); osc_server->ip6_fd = g_socket_get_fd(osc_server->ip6_socket); g_socket_set_listen_backlog(osc_server->ip6_socket, AGS_OSC_SERVER_DEFAULT_BACKLOG); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } }else{ g_critical("no flow control type"); } /* get ip6 */ if(any_address){ g_rec_mutex_lock(osc_server_mutex); osc_server->ip6_address = g_inet_socket_address_new(g_inet_address_new_any(G_SOCKET_FAMILY_IPV6), osc_server->server_port); g_rec_mutex_unlock(osc_server_mutex); }else{ g_rec_mutex_lock(osc_server_mutex); osc_server->ip6_address = g_inet_socket_address_new(g_inet_address_new_from_string(osc_server->ip6), osc_server->server_port); g_rec_mutex_unlock(osc_server_mutex); } } if(ip4_success != TRUE && ip6_success != TRUE){ g_critical("no protocol family"); return; } if(ip4_success){ error = NULL; g_socket_bind(osc_server->ip4_socket, osc_server->ip4_address, TRUE, &error); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } } if(ip6_success){ error = NULL; g_socket_bind(osc_server->ip6_socket, osc_server->ip6_address, TRUE, &error); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } } if(osc_server->ip4_fd != -1){ //TODO:JK: check remove #if 0 int flags; flags = fcntl(osc_server->ip4_fd, F_GETFL, 0); fcntl(osc_server->ip4_fd, F_SETFL, flags | O_NONBLOCK); #else g_object_set(osc_server->ip4_socket, "blocking", FALSE, NULL); #endif } if(osc_server->ip6_fd != -1){ //TODO:JK: check remove #if 0 int flags; flags = fcntl(osc_server->ip6_fd, F_GETFL, 0); fcntl(osc_server->ip6_fd, F_SETFL, flags | O_NONBLOCK); #else g_object_set(osc_server->ip6_socket, "blocking", FALSE, NULL); #endif } ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_RUNNING); g_message("starting OSC listen and dispatch threads"); /* create listen and dispatch thread */ osc_server->listen_thread = g_thread_new("Advanced Gtk+ Sequencer OSC Server - listen thread", ags_osc_server_listen_thread, osc_server); osc_server->dispatch_thread = g_thread_new("Advanced Gtk+ Sequencer OSC Server - dispatch thread", ags_osc_server_dispatch_thread, osc_server); /* controller */ g_object_get(osc_server, "front-controller", &osc_front_controller, "controller", &start_controller, NULL); ags_osc_front_controller_start_delegate(osc_front_controller); controller = start_controller; while(controller != NULL){ if(AGS_IS_OSC_METER_CONTROLLER(controller->data)){ ags_osc_meter_controller_start_monitor(controller->data); } controller = controller->next; } g_object_unref(osc_front_controller); g_list_free_full(start_controller, g_object_unref); } /** * ags_osc_server_start: * @osc_server: the #AgsOscServer * * Start OSC server. * * Since: 3.0.0 */ void ags_osc_server_start(AgsOscServer *osc_server) { g_return_if_fail(AGS_IS_OSC_SERVER(osc_server)); g_object_ref((GObject *) osc_server); g_signal_emit(G_OBJECT(osc_server), osc_server_signals[START], 0); g_object_unref((GObject *) osc_server); } void ags_osc_server_real_stop(AgsOscServer *osc_server) { AgsOscFrontController *osc_front_controller; GList *start_controller, *controller; GError *error; GRecMutex *osc_server_mutex; if(!ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_RUNNING)){ return; } /* get OSC server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); /* stop */ ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_TERMINATING); ags_osc_server_unset_flags(osc_server, AGS_OSC_SERVER_RUNNING); g_thread_join(osc_server->listen_thread); g_thread_join(osc_server->dispatch_thread); /* close fd */ g_rec_mutex_lock(osc_server_mutex); if(osc_server->ip4_fd != -1){ error = NULL; g_socket_close(osc_server->ip4_socket, &error); g_object_unref(osc_server->ip4_socket); osc_server->ip4_socket = NULL; osc_server->ip4_fd = -1; } if(osc_server->ip6_fd != -1){ error = NULL; g_socket_close(osc_server->ip6_socket, &error); g_object_unref(osc_server->ip6_socket); osc_server->ip6_socket = NULL; osc_server->ip6_fd = -1; } g_rec_mutex_unlock(osc_server_mutex); /* controller */ g_object_get(osc_server, "front-controller", &osc_front_controller, "controller", &start_controller, NULL); ags_osc_front_controller_stop_delegate(osc_front_controller); controller = start_controller; while(controller != NULL){ if(AGS_IS_OSC_METER_CONTROLLER(controller->data)){ ags_osc_meter_controller_stop_monitor(controller->data); } controller = controller->next; } g_object_unref(osc_front_controller); g_list_free_full(start_controller, g_object_unref); ags_osc_server_unset_flags(osc_server, (AGS_OSC_SERVER_STARTED | AGS_OSC_SERVER_TERMINATING)); } /** * ags_osc_server_stop: * @osc_server: the #AgsOscServer * * Stop OSC server. * * Since: 3.0.0 */ void ags_osc_server_stop(AgsOscServer *osc_server) { g_return_if_fail(AGS_IS_OSC_SERVER(osc_server)); g_object_ref((GObject *) osc_server); g_signal_emit(G_OBJECT(osc_server), osc_server_signals[STOP], 0); g_object_unref((GObject *) osc_server); } gboolean ags_osc_server_real_listen(AgsOscServer *osc_server) { gboolean created_connection; GError *error; GRecMutex *osc_server_mutex; if(!ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_STARTED)){ return(FALSE); } /* get OSC server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_server); if(osc_server->ip4_fd != -1){ g_rec_mutex_lock(osc_server_mutex); error = NULL; g_socket_listen(osc_server->ip4_socket, &error); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } } if(osc_server->ip6_fd != -1){ g_rec_mutex_lock(osc_server_mutex); error = NULL; g_socket_listen(osc_server->ip6_socket, &error); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ g_critical("AgsOscServer - %s", error->message); g_error_free(error); } } created_connection = FALSE; if(osc_server->ip4_fd != -1){ GSocket *connection_socket; g_rec_mutex_lock(osc_server_mutex); error = NULL; connection_socket = g_socket_accept(osc_server->ip4_socket, NULL, &error); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ if(!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ g_critical("AgsOscServer - %s", error->message); } g_error_free(error); } if(connection_socket != NULL){ AgsOscConnection *osc_connection; created_connection = TRUE; osc_connection = ags_osc_connection_new((GObject *) osc_server); osc_connection->socket = connection_socket; osc_connection->fd = g_socket_get_fd(connection_socket); g_object_set(connection_socket, "blocking", FALSE, NULL); ags_osc_connection_set_flags(osc_connection, (AGS_OSC_CONNECTION_ACTIVE | AGS_OSC_CONNECTION_INET4)); ags_osc_server_add_connection(osc_server, (GObject *) osc_connection); } } if(osc_server->ip6_fd != -1){ GSocket *connection_socket; g_rec_mutex_lock(osc_server_mutex); error = NULL; connection_socket = g_socket_accept(osc_server->ip6_socket, NULL, &error); g_rec_mutex_unlock(osc_server_mutex); if(error != NULL){ if(!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ g_critical("AgsOscServer - %s", error->message); } g_error_free(error); } if(connection_socket != NULL){ AgsOscConnection *osc_connection; created_connection = TRUE; osc_connection = ags_osc_connection_new((GObject *) osc_server); osc_connection->socket = connection_socket; osc_connection->fd = g_socket_get_fd(connection_socket); g_object_set(connection_socket, "blocking", FALSE, NULL); ags_osc_connection_set_flags(osc_connection, (AGS_OSC_CONNECTION_ACTIVE | AGS_OSC_CONNECTION_INET6)); ags_osc_server_add_connection(osc_server, (GObject *) osc_connection); } } return(created_connection); } /** * ags_osc_server_listen: * @osc_server: the #AgsOscServer * * Listen as OSC server. * * Returns: %TRUE as a new connection was initiated, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_osc_server_listen(AgsOscServer *osc_server) { gboolean created_connection; g_return_val_if_fail(AGS_IS_OSC_SERVER(osc_server), FALSE); g_object_ref((GObject *) osc_server); g_signal_emit(G_OBJECT(osc_server), osc_server_signals[LISTEN], 0, &created_connection); g_object_unref((GObject *) osc_server); return(created_connection); } void ags_osc_server_real_dispatch(AgsOscServer *osc_server) { GList *start_list, *list; guchar *slip_buffer; guint data_length; if(!ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_STARTED)){ return; } g_object_get(osc_server, "connection", &start_list, NULL); list = start_list; while(list != NULL){ int fd; GRecMutex *osc_connection_mutex; /* get osc_connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(list->data); /* get fd */ g_rec_mutex_lock(osc_connection_mutex); fd = AGS_OSC_CONNECTION(list->data)->fd; g_rec_mutex_unlock(osc_connection_mutex); if(fd == -1){ ags_osc_server_remove_connection(osc_server, list->data); list = list->next; continue; } g_object_ref(list->data); slip_buffer = ags_osc_connection_read_bytes(list->data, &data_length); if(slip_buffer != NULL){ GList *start_osc_response, *osc_response; unsigned char *packet; guint packet_size; packet = ags_osc_util_slip_decode(slip_buffer, data_length, &packet_size); osc_response = start_osc_response = ags_osc_front_controller_do_request((AgsOscFrontController *) osc_server->front_controller, list->data, packet, packet_size); while(osc_response != NULL){ ags_osc_connection_write_response(list->data, osc_response->data); osc_response = osc_response->next; } // g_list_free_full(start_osc_response, // g_object_unref); /* free packet */ if(packet != NULL){ free(packet); } } g_object_unref(list->data); list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_osc_server_dispatch: * @osc_server: the #AgsOscServer * * Dispatch the OSC server. * * Since: 3.0.0 */ void ags_osc_server_dispatch(AgsOscServer *osc_server) { g_return_if_fail(AGS_IS_OSC_SERVER(osc_server)); g_object_ref((GObject *) osc_server); g_signal_emit(G_OBJECT(osc_server), osc_server_signals[DISPATCH], 0); g_object_unref((GObject *) osc_server); } void* ags_osc_server_listen_thread(void *ptr) { AgsOscServer *osc_server; gboolean created_connection; osc_server = AGS_OSC_SERVER(ptr); while(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_RUNNING)){ created_connection = ags_osc_server_listen(osc_server); if(!created_connection){ nanosleep(osc_server->accept_delay, NULL); } } g_thread_exit(NULL); return(NULL); } void* ags_osc_server_dispatch_thread(void *ptr) { AgsOscServer *osc_server; osc_server = AGS_OSC_SERVER(ptr); while(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_RUNNING)){ ags_osc_server_dispatch(osc_server); nanosleep(osc_server->dispatch_delay, NULL); } g_thread_exit(NULL); return(NULL); } /** * ags_osc_server_new: * * Creates a new instance of #AgsOscServer * * Returns: the new #AgsOscServer * * Since: 3.0.0 */ AgsOscServer* ags_osc_server_new() { AgsOscServer *osc_server; osc_server = (AgsOscServer *) g_object_new(AGS_TYPE_OSC_SERVER, NULL); return(osc_server); } gsequencer-3.1.3/ags/audio/osc/ags_osc_xmlrpc_server.h0000644000175000017500000000514613607210263020007 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_XMLRPC_SERVER_H__ #define __AGS_OSC_XMLRPC_SERVER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_XMLRPC_SERVER (ags_osc_xmlrpc_server_get_type ()) #define AGS_OSC_XMLRPC_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_XMLRPC_SERVER, AgsOscXmlrpcServer)) #define AGS_OSC_XMLRPC_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_XMLRPC_SERVER, AgsOscXmlrpcServerClass)) #define AGS_IS_OSC_XMLRPC_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_XMLRPC_SERVER)) #define AGS_IS_OSC_XMLRPC_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_XMLRPC_SERVER)) #define AGS_OSC_XMLRPC_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_XMLRPC_SERVER, AgsOscXmlrpcServerClass)) #define AGS_OSC_XMLRPC_SERVER_DEFAULT_CHUNK_SIZE (16384) typedef struct _AgsOscXmlrpcServer AgsOscXmlrpcServer; typedef struct _AgsOscXmlrpcServerClass AgsOscXmlrpcServerClass; struct _AgsOscXmlrpcServer { AgsOscServer osc_server; AgsServer *xmlrpc_server; AgsController *osc_xmlrpc_controller; }; struct _AgsOscXmlrpcServerClass { AgsOscServerClass osc_server; }; GType ags_osc_xmlrpc_server_get_type(void); void ags_osc_xmlrpc_server_add_websocket_handler(AgsOscXmlrpcServer *osc_xmlrpc_server, char *path, char *origin, char **protocols, SoupServerWebsocketCallback callback, gpointer user_data, GDestroyNotify destroy); /* default controllers */ void ags_osc_xmlrpc_server_add_default_controller(AgsOscXmlrpcServer *osc_xmlrpc_server); /* instance */ AgsOscXmlrpcServer* ags_osc_xmlrpc_server_new(); G_END_DECLS #endif /*__AGS_OSC_XMLRPC_SERVER_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_response.c0000644000175000017500000002604213607210263016743 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_osc_response_class_init(AgsOscResponseClass *osc_response); void ags_osc_response_init(AgsOscResponse *osc_response); void ags_osc_response_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_response_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_response_dispose(GObject *gobject); void ags_osc_response_finalize(GObject *gobject); /** * SECTION:ags_osc_response * @short_description: the OSC server side response * @title: AgsOscResponse * @section_id: * @include: ags/audio/osc/ags_osc_response.h * * #AgsOscResponse your OSC server side response. */ enum{ PROP_0, PROP_PACKET, PROP_PACKET_SIZE, PROP_ERROR_MESSAGE, PROP_OSC_MESSAGE, }; static gpointer ags_osc_response_parent_class = NULL; GType ags_osc_response_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_response = 0; static const GTypeInfo ags_osc_response_info = { sizeof (AgsOscResponseClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_response_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscResponse), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_response_init, }; ags_type_osc_response = g_type_register_static(G_TYPE_OBJECT, "AgsOscResponse", &ags_osc_response_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_response); } return g_define_type_id__volatile; } void ags_osc_response_class_init(AgsOscResponseClass *osc_response) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_response_parent_class = g_type_class_peek_parent(osc_response); /* GObjectClass */ gobject = (GObjectClass *) osc_response; gobject->set_property = ags_osc_response_set_property; gobject->get_property = ags_osc_response_get_property; gobject->dispose = ags_osc_response_dispose; gobject->finalize = ags_osc_response_finalize; /* properties */ /** * AgsOscResponse:packet: * * The response packet. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("packet", i18n_pspec("response packet"), i18n_pspec("The response packet"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PACKET, param_spec); /** * AgsOscResponse:packet-size: * * The response packet's size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("packet-size", i18n_pspec("response packet size"), i18n_pspec("The response packet size"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PACKET_SIZE, param_spec); /** * AgsOscResponse:error-message: * * The error message. * * Since: 3.0.0 */ param_spec = g_param_spec_string("error-message", i18n_pspec("error message"), i18n_pspec("The error message"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ERROR_MESSAGE, param_spec); /** * AgsOscResponse:osc-message: * * The assigned #AgsOscMessage * * Since: 3.0.0 */ param_spec = g_param_spec_object("osc-message", i18n("assigned OSC message"), i18n("The assigned OSC message"), AGS_TYPE_OSC_MESSAGE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSC_MESSAGE, param_spec); } void ags_osc_response_init(AgsOscResponse *osc_response) { osc_response->flags = 0; /* osc response mutex */ g_rec_mutex_init(&(osc_response->obj_mutex)); osc_response->packet = NULL; osc_response->packet_size = 0; osc_response->error_message = NULL; osc_response->osc_message = NULL; osc_response->creation_time = NULL; } void ags_osc_response_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscResponse *osc_response; GRecMutex *osc_response_mutex; osc_response = AGS_OSC_RESPONSE(gobject); /* get osc response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); switch(prop_id){ case PROP_PACKET: { gpointer packet; packet = g_value_get_pointer(value); g_rec_mutex_lock(osc_response_mutex); if(osc_response->packet == packet){ g_rec_mutex_unlock(osc_response_mutex); return; } osc_response->packet = packet; g_rec_mutex_unlock(osc_response_mutex); } break; case PROP_PACKET_SIZE: { guint packet_size; packet_size = g_value_get_uint(value); g_rec_mutex_lock(osc_response_mutex); osc_response->packet_size = packet_size; g_rec_mutex_unlock(osc_response_mutex); } break; case PROP_ERROR_MESSAGE: { gchar *error_message; error_message = g_value_get_string(value); g_rec_mutex_lock(osc_response_mutex); if(osc_response->error_message == error_message){ g_rec_mutex_unlock(osc_response_mutex); return; } g_free(osc_response->error_message); osc_response->error_message = g_strdup(error_message); g_rec_mutex_unlock(osc_response_mutex); } break; case PROP_OSC_MESSAGE: { AgsOscMessage *osc_message; osc_message = (AgsOscMessage *) g_value_get_object(value); g_rec_mutex_lock(osc_response_mutex); if(osc_response->osc_message == (GObject *) osc_message){ g_rec_mutex_unlock(osc_response_mutex); return; } if(osc_response->osc_message != NULL){ g_object_unref(G_OBJECT(osc_response->osc_message)); } if(osc_message != NULL){ g_object_ref(G_OBJECT(osc_message)); } osc_response->osc_message = (GObject *) osc_message; g_rec_mutex_unlock(osc_response_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_response_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscResponse *osc_response; GRecMutex *osc_response_mutex; osc_response = AGS_OSC_RESPONSE(gobject); /* get osc response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); switch(prop_id){ case PROP_PACKET: { g_rec_mutex_lock(osc_response_mutex); g_value_set_pointer(value, osc_response->packet); g_rec_mutex_unlock(osc_response_mutex); } break; case PROP_PACKET_SIZE: { g_rec_mutex_lock(osc_response_mutex); g_value_set_uint(value, osc_response->packet_size); g_rec_mutex_unlock(osc_response_mutex); } break; case PROP_ERROR_MESSAGE: { g_rec_mutex_lock(osc_response_mutex); g_value_set_pointer(value, osc_response->error_message); g_rec_mutex_unlock(osc_response_mutex); } break; case PROP_OSC_MESSAGE: { g_rec_mutex_lock(osc_response_mutex); g_value_set_object(value, osc_response->osc_message); g_rec_mutex_unlock(osc_response_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_response_dispose(GObject *gobject) { AgsOscResponse *osc_response; osc_response = (AgsOscResponse *) gobject; if(osc_response->osc_message != NULL){ g_object_unref(osc_response->osc_message); osc_response->osc_message = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_response_parent_class)->dispose(gobject); } void ags_osc_response_finalize(GObject *gobject) { AgsOscResponse *osc_response; osc_response = (AgsOscResponse *) gobject; if(osc_response->packet != NULL){ free(osc_response->packet); } g_free(osc_response->error_message); if(osc_response->osc_message != NULL){ g_object_unref(osc_response->osc_message); } /* call parent */ G_OBJECT_CLASS(ags_osc_response_parent_class)->finalize(gobject); } /** * ags_osc_response_test_flags: * @osc_response: the #AgsOscResponse * @flags: the flags * * Test @flags to be set on @osc_response. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_response_test_flags(AgsOscResponse *osc_response, guint flags) { gboolean retval; GRecMutex *osc_response_mutex; if(!AGS_IS_OSC_RESPONSE(osc_response)){ return(FALSE); } /* get osc_response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); /* test */ g_rec_mutex_lock(osc_response_mutex); retval = (flags & (osc_response->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(osc_response_mutex); return(retval); } /** * ags_osc_response_set_flags: * @osc_response: the #AgsOscResponse * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_response_set_flags(AgsOscResponse *osc_response, guint flags) { GRecMutex *osc_response_mutex; if(!AGS_IS_OSC_RESPONSE(osc_response)){ return; } /* get osc_response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); /* set flags */ g_rec_mutex_lock(osc_response_mutex); osc_response->flags |= flags; g_rec_mutex_unlock(osc_response_mutex); } /** * ags_osc_response_unset_flags: * @osc_response: the #AgsOscResponse * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_response_unset_flags(AgsOscResponse *osc_response, guint flags) { GRecMutex *osc_response_mutex; if(!AGS_IS_OSC_RESPONSE(osc_response)){ return; } /* get osc_response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); /* set flags */ g_rec_mutex_lock(osc_response_mutex); osc_response->flags &= (~flags); g_rec_mutex_unlock(osc_response_mutex); } /** * ags_osc_response_new: * * Creates a new instance of #AgsOscResponse * * Returns: the new #AgsOscResponse * * Since: 3.0.0 */ AgsOscResponse* ags_osc_response_new() { AgsOscResponse *osc_response; osc_response = (AgsOscResponse *) g_object_new(AGS_TYPE_OSC_RESPONSE, NULL); return(osc_response); } gsequencer-3.1.3/ags/audio/osc/controller/0000755000175000017500000000000013622252254015505 500000000000000gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_info_controller.h0000644000175000017500000000473013607210263022473 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_INFO_CONTROLLER_H__ #define __AGS_OSC_INFO_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_INFO_CONTROLLER (ags_osc_info_controller_get_type()) #define AGS_OSC_INFO_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_INFO_CONTROLLER, AgsOscInfoController)) #define AGS_OSC_INFO_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_INFO_CONTROLLER, AgsOscInfoControllerClass)) #define AGS_IS_OSC_INFO_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_INFO_CONTROLLER)) #define AGS_IS_OSC_INFO_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_INFO_CONTROLLER)) #define AGS_OSC_INFO_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_INFO_CONTROLLER, AgsOscInfoControllerClass)) typedef struct _AgsOscInfoController AgsOscInfoController; typedef struct _AgsOscInfoControllerClass AgsOscInfoControllerClass; struct _AgsOscInfoController { AgsOscController osc_controller; }; struct _AgsOscInfoControllerClass { AgsOscControllerClass osc_controller; gpointer (*get_info)(AgsOscInfoController *osc_info_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); }; GType ags_osc_info_controller_get_type(); gpointer ags_osc_info_controller_get_info(AgsOscInfoController *osc_info_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); AgsOscInfoController* ags_osc_info_controller_new(); G_END_DECLS #endif /*__AGS_OSC_INFO_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_export_controller.c0000644000175000017500000004363213607210263023060 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_osc_export_controller_class_init(AgsOscExportControllerClass *osc_export_controller); void ags_osc_export_controller_init(AgsOscExportController *osc_export_controller); void ags_osc_export_controller_dispose(GObject *gobject); void ags_osc_export_controller_finalize(GObject *gobject); gpointer ags_osc_export_controller_real_do_export(AgsOscExportController *osc_export_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); /** * SECTION:ags_osc_export_controller * @short_description: OSC export controller * @title: AgsOscExportController * @section_id: * @include: ags/audio/osc/controller/ags_osc_export_controller.h * * The #AgsOscExportController implements the OSC export controller. */ enum{ PROP_0, }; enum{ DO_EXPORT, LAST_SIGNAL, }; static gpointer ags_osc_export_controller_parent_class = NULL; static guint osc_export_controller_signals[LAST_SIGNAL]; static GMutex regex_mutex; GType ags_osc_export_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_export_controller = 0; static const GTypeInfo ags_osc_export_controller_info = { sizeof (AgsOscExportControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_export_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscExportController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_export_controller_init, }; ags_type_osc_export_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscExportController", &ags_osc_export_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_export_controller); } return g_define_type_id__volatile; } void ags_osc_export_controller_class_init(AgsOscExportControllerClass *osc_export_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_export_controller_parent_class = g_type_class_peek_parent(osc_export_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_export_controller; gobject->dispose = ags_osc_export_controller_dispose; gobject->finalize = ags_osc_export_controller_finalize; /* properties */ /* AgsOscExportControllerClass */ osc_export_controller->do_export = ags_osc_export_controller_real_do_export; /* signals */ /** * AgsOscExportController::do-export: * @osc_export_controller: the #AgsOscExportController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::do-export signal is emited during get data of export controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_export_controller_signals[DO_EXPORT] = g_signal_new("do-export", G_TYPE_FROM_CLASS(osc_export_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscExportControllerClass, do_export), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_export_controller_init(AgsOscExportController *osc_export_controller) { g_object_set(osc_export_controller, "context-path", "/export", NULL); } void ags_osc_export_controller_dispose(GObject *gobject) { AgsOscExportController *osc_export_controller; osc_export_controller = AGS_OSC_EXPORT_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_export_controller_parent_class)->dispose(gobject); } void ags_osc_export_controller_finalize(GObject *gobject) { AgsOscExportController *osc_export_controller; osc_export_controller = AGS_OSC_EXPORT_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_export_controller_parent_class)->finalize(gobject); } gpointer ags_osc_export_controller_real_do_export(AgsOscExportController *osc_export_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsTask *task; AgsApplicationContext *application_context; GList *start_response; GList *start_list, *list; gchar *type_tag; gchar *path; gchar *filename; guint format; guint64 tic; gboolean live_performance; guint length; guint path_offset; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",ssihs", 6)) ? TRUE: FALSE; if(success){ success = (!strncmp(type_tag + 6, "T", 2) || strncmp(type_tag + 6, "F", 2)) ? TRUE: FALSE; } if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read path */ ags_osc_buffer_util_get_string(message + 12, &path, NULL); /* check argument */ if(path == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); /* read filename */ ags_osc_buffer_util_get_string(message + 12 + length, &filename, NULL); /* check argument */ if(filename == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); free(path); return(start_response); } length += 4 * (guint) ceil((double) (strlen(filename) + 1) / 4.0); /* read format */ ags_osc_buffer_util_get_int32(message + 12 + length, &format); /* check argument */ if(format == 0){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); free(path); free(filename); return(start_response); } /* read tic */ ags_osc_buffer_util_get_int64(message + 16 + length, &tic); /* check argument */ if(tic == 0){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); free(path); free(filename); return(start_response); } /* read live export */ live_performance = (type_tag[6] == 'T') ? TRUE: FALSE; /* get sound provider */ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); path_offset = 0; if(!strncmp(path, "/AgsSoundProvider", 17)){ path_offset += 17; if(!strncmp(path + path_offset, "/AgsSoundcard", 13)){ AgsExportThread *export_thread; AgsThread *main_loop; GList *start_soundcard, *soundcard; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 13; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); export_thread = (AgsExportThread *) ags_thread_find_type(main_loop, AGS_TYPE_EXPORT_THREAD); soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsExportOutput *export_output; AgsExportThread *current_export_thread; GObject *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_soundcard, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); current_export_thread = ags_export_thread_find_soundcard(export_thread, current); export_output = ags_export_output_new(current_export_thread, current, filename, tic, live_performance); ags_task_launcher_add_task(task_launcher, (AgsTask *) export_output); /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ AgsExportOutput *export_output; AgsExportThread *current_export_thread; gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); soundcard = g_list_nth(start_soundcard, i_start); for(i = i_start; i <= i_stop; i++){ current_export_thread = ags_export_thread_find_soundcard(export_thread, soundcard->data); export_output = ags_export_output_new(current_export_thread, soundcard->data, filename, tic, live_performance); ags_task_launcher_add_task(task_launcher, (AgsTask *) export_output); /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); soundcard = soundcard->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsExportOutput *export_output; AgsExportThread *current_export_thread; path_offset += 3; if(start_soundcard != NULL){ current_export_thread = ags_export_thread_find_soundcard(export_thread, start_soundcard->data); export_output = ags_export_output_new(current_export_thread, start_soundcard->data, filename, tic, live_performance); ags_task_launcher_add_task(task_launcher, (AgsTask *) export_output); /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsExportOutput *export_output; AgsExportThread *current_export_thread; path_offset += 3; if(start_soundcard == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } soundcard = start_soundcard; while(soundcard != NULL){ current_export_thread = ags_export_thread_find_soundcard(export_thread, soundcard->data); export_output = ags_export_output_new(current_export_thread, soundcard->data, filename, tic, live_performance); ags_task_launcher_add_task(task_launcher, (AgsTask *) export_output); /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); soundcard = soundcard->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsExportOutput *export_output; AgsExportThread *current_export_thread; path_offset += 3; if(start_soundcard == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(soundcard != NULL){ GList *retval; current_export_thread = ags_export_thread_find_soundcard(export_thread, soundcard->data); export_output = ags_export_output_new(current_export_thread, soundcard->data, filename, tic, live_performance); ags_task_launcher_add_task(task_launcher, (AgsTask *) export_output); /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); soundcard = soundcard->next; } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_soundcard, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_soundcard, g_object_unref); } } return(start_response); } /** * ags_osc_export_controller_do_export: * @osc_export_controller: the #AgsOscExportController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Run export. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_export_controller_do_export(AgsOscExportController *osc_export_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_EXPORT_CONTROLLER(osc_export_controller), NULL); g_object_ref((GObject *) osc_export_controller); g_signal_emit(G_OBJECT(osc_export_controller), osc_export_controller_signals[DO_EXPORT], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_export_controller); return(osc_response); } /** * ags_osc_export_controller_new: * * Instantiate new #AgsOscExportController * * Returns: the #AgsOscExportController * * Since: 3.0.0 */ AgsOscExportController* ags_osc_export_controller_new() { AgsOscExportController *osc_export_controller; osc_export_controller = (AgsOscExportController *) g_object_new(AGS_TYPE_OSC_EXPORT_CONTROLLER, NULL); return(osc_export_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_action_controller.h0000644000175000017500000000505013607210263023011 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_ACTION_CONTROLLER_H__ #define __AGS_OSC_ACTION_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_ACTION_CONTROLLER (ags_osc_action_controller_get_type()) #define AGS_OSC_ACTION_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_ACTION_CONTROLLER, AgsOscActionController)) #define AGS_OSC_ACTION_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_ACTION_CONTROLLER, AgsOscActionControllerClass)) #define AGS_IS_OSC_ACTION_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_ACTION_CONTROLLER)) #define AGS_IS_OSC_ACTION_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_ACTION_CONTROLLER)) #define AGS_OSC_ACTION_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_ACTION_CONTROLLER, AgsOscActionControllerClass)) typedef struct _AgsOscActionController AgsOscActionController; typedef struct _AgsOscActionControllerClass AgsOscActionControllerClass; struct _AgsOscActionController { AgsOscController osc_controller; }; struct _AgsOscActionControllerClass { AgsOscControllerClass osc_controller; gpointer (*run_action)(AgsOscActionController *osc_action_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_osc_action_controller_get_type(); gpointer ags_osc_action_controller_run_action(AgsOscActionController *osc_action_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); AgsOscActionController* ags_osc_action_controller_new(); G_END_DECLS #endif /*__AGS_OSC_ACTION_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_action_controller.c0000644000175000017500000003722313607210263023013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_action_controller_class_init(AgsOscActionControllerClass *osc_action_controller); void ags_osc_action_controller_init(AgsOscActionController *osc_action_controller); void ags_osc_action_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_action_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_action_controller_dispose(GObject *gobject); void ags_osc_action_controller_finalize(GObject *gobject); gpointer ags_osc_action_controller_real_run_action(AgsOscActionController *osc_action_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); /** * SECTION:ags_osc_action_controller * @short_description: OSC action controller * @title: AgsOscActionController * @section_id: * @include: ags/audio/osc/controller/ags_osc_action_controller.h * * The #AgsOscActionController implements the OSC action controller. */ enum{ PROP_0, }; enum{ RUN_ACTION, LAST_SIGNAL, }; static gpointer ags_osc_action_controller_parent_class = NULL; static guint osc_action_controller_signals[LAST_SIGNAL]; GType ags_osc_action_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_action_controller = 0; static const GTypeInfo ags_osc_action_controller_info = { sizeof (AgsOscActionControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_action_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscActionController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_action_controller_init, }; ags_type_osc_action_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscActionController", &ags_osc_action_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_action_controller); } return g_define_type_id__volatile; } void ags_osc_action_controller_class_init(AgsOscActionControllerClass *osc_action_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_action_controller_parent_class = g_type_class_peek_parent(osc_action_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_action_controller; gobject->set_property = ags_osc_action_controller_set_property; gobject->get_property = ags_osc_action_controller_get_property; gobject->dispose = ags_osc_action_controller_dispose; gobject->finalize = ags_osc_action_controller_finalize; /* properties */ /* AgsOscActionControllerClass */ osc_action_controller->run_action = ags_osc_action_controller_real_run_action; /* signals */ /** * AgsOscActionController::run-action: * @osc_action_controller: the #AgsOscActionController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::run-action signal is emited during get data of action controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_action_controller_signals[RUN_ACTION] = g_signal_new("run-action", G_TYPE_FROM_CLASS(osc_action_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscActionControllerClass, run_action), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_action_controller_init(AgsOscActionController *osc_action_controller) { g_object_set(osc_action_controller, "context-path", "/action", NULL); } void ags_osc_action_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscActionController *osc_action_controller; GRecMutex *osc_controller_mutex; osc_action_controller = AGS_OSC_ACTION_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_action_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_action_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscActionController *osc_action_controller; GRecMutex *osc_controller_mutex; osc_action_controller = AGS_OSC_ACTION_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_action_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_action_controller_dispose(GObject *gobject) { AgsOscActionController *osc_action_controller; osc_action_controller = AGS_OSC_ACTION_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_action_controller_parent_class)->dispose(gobject); } void ags_osc_action_controller_finalize(GObject *gobject) { AgsOscActionController *osc_action_controller; osc_action_controller = AGS_OSC_ACTION_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_action_controller_parent_class)->finalize(gobject); } gpointer ags_osc_action_controller_real_run_action(AgsOscActionController *osc_action_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsTask *task; AgsApplicationContext *application_context; GList *start_response; GList *start_list, *list; gchar *type_tag; gchar *path; gchar *action; guint length; guint path_offset; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",ss", 4)) ? TRUE: FALSE; if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read path */ ags_osc_buffer_util_get_string(message + 12, &path, NULL); /* check argument */ if(path == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } length = strlen(path); /* read action */ ags_osc_buffer_util_get_string(message + 12 + (4 * (guint) ceil((double) (length + 1) / 4.0)), &action, NULL); /* check argument */ if(action == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); free(path); return(start_response); } /* get sound provider */ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); path_offset = 0; if(!strncmp(path, "/AgsSoundProvider", 17)){ path_offset += 17; if(!strncmp(path + path_offset, "/AgsSoundcard", 13)){ path_offset += 13; if(!g_strcmp0("start", action)){ task = (AgsTask *) ags_start_soundcard_new(application_context); ags_task_launcher_add_task(task_launcher, task); }else if(!g_strcmp0("stop", action)){ task = (AgsTask *) ags_stop_soundcard_new(application_context); ags_task_launcher_add_task(task_launcher, task); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); free(type_tag); free(path); free(action); g_object_unref(task_launcher); return(start_response); } }else if(!strncmp(path + path_offset, "/AgsSequencer", 13)){ path_offset += 13; if(!g_strcmp0("start", action)){ task = (AgsTask *) ags_start_sequencer_new(application_context); ags_task_launcher_add_task(task_launcher, task); }else if(!g_strcmp0("stop", action)){ task = (AgsTask *) ags_stop_sequencer_new(application_context); ags_task_launcher_add_task(task_launcher, task); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); free(type_tag); free(path); free(action); g_object_unref(task_launcher); return(start_response); } }else if(!strncmp(path + path_offset, "/AgsAudio", 9)){ AgsAudio *audio; guint nth_audio; int retval; audio = NULL; path_offset += 9; if(g_ascii_isdigit(path[path_offset + 1])){ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); retval = sscanf(path + path_offset, "[%d]", &nth_audio); if(retval <= 0){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MISSING_INDEX, NULL); free(type_tag); free(path); free(action); g_object_unref(task_launcher); g_list_free_full(start_list, g_object_unref); return(start_response); } audio = g_list_nth_data(start_list, nth_audio); path_offset = strchr(path + path_offset, ']') - path + 1; g_list_free_full(start_list, g_object_unref); }else if(path[path_offset + 1] == '"'){ gchar *audio_name; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); free(type_tag); free(path); free(action); g_object_unref(task_launcher); return(start_response); } length = offset - (path + path_offset + 3); audio_name = malloc((length + 1) * sizeof(gchar)); sscanf(path + path_offset, "%ms", &audio_name); start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); list = ags_audio_find_name(start_list, audio_name); if(list != NULL){ audio = list->data; } path_offset = path_offset + strlen(audio_name) + 2; g_list_free_full(start_list, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MISSING_INDEX, NULL); free(type_tag); free(path); free(action); g_object_unref(task_launcher); return(start_response); } if(!g_strcmp0("start", action)){ task = (AgsTask *) ags_start_audio_new(audio, -1); ags_task_launcher_add_task(task_launcher, task); }else if(!g_strcmp0("stop", action)){ task = (AgsTask *) ags_cancel_audio_new(audio, -1); ags_task_launcher_add_task(task_launcher, task); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); free(type_tag); free(path); free(action); g_object_unref(task_launcher); return(start_response); } } } /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); free(action); g_object_unref(task_launcher); return(start_response); } /** * ags_osc_action_controller_run_action: * @osc_action_controller: the #AgsOscActionController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Run action. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_action_controller_run_action(AgsOscActionController *osc_action_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_ACTION_CONTROLLER(osc_action_controller), NULL); g_object_ref((GObject *) osc_action_controller); g_signal_emit(G_OBJECT(osc_action_controller), osc_action_controller_signals[RUN_ACTION], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_action_controller); return(osc_response); } /** * ags_osc_action_controller_new: * * Instantiate new #AgsOscActionController * * Returns: the #AgsOscActionController * * Since: 3.0.0 */ AgsOscActionController* ags_osc_action_controller_new() { AgsOscActionController *osc_action_controller; osc_action_controller = (AgsOscActionController *) g_object_new(AGS_TYPE_OSC_ACTION_CONTROLLER, NULL); return(osc_action_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_front_controller.h0000644000175000017500000000734413607210263022674 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_FRONT_CONTROLLER_H__ #define __AGS_OSC_FRONT_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_FRONT_CONTROLLER (ags_osc_front_controller_get_type()) #define AGS_OSC_FRONT_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_FRONT_CONTROLLER, AgsOscFrontController)) #define AGS_OSC_FRONT_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_FRONT_CONTROLLER, AgsOscFrontControllerClass)) #define AGS_IS_OSC_FRONT_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_FRONT_CONTROLLER)) #define AGS_IS_OSC_FRONT_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_FRONT_CONTROLLER)) #define AGS_OSC_FRONT_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_FRONT_CONTROLLER, AgsOscFrontControllerClass)) typedef struct _AgsOscFrontController AgsOscFrontController; typedef struct _AgsOscFrontControllerClass AgsOscFrontControllerClass; typedef enum{ AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED = 1, AGS_OSC_FRONT_CONTROLLER_DELEGATE_RUNNING = 1 << 1, AGS_OSC_FRONT_CONTROLLER_DELEGATE_TERMINATING = 1 << 2, }AgsOscFrontControllerFlags; struct _AgsOscFrontController { AgsOscController osc_controller; guint flags; gint64 delegate_timeout; volatile gboolean do_reset; GMutex delegate_mutex; GCond delegate_cond; GThread *delegate_thread; GList *message; }; struct _AgsOscFrontControllerClass { AgsOscControllerClass osc_controller; void (*start_delegate)(AgsOscFrontController *osc_front_controller); void (*stop_delegate)(AgsOscFrontController *osc_front_controller); gpointer (*do_request)(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size); }; GType ags_osc_front_controller_get_type(); gboolean ags_osc_front_controller_test_flags(AgsOscFrontController *osc_front_controller, guint flags); void ags_osc_front_controller_set_flags(AgsOscFrontController *osc_front_controller, guint flags); void ags_osc_front_controller_unset_flags(AgsOscFrontController *osc_front_controller, guint flags); void ags_osc_front_controller_add_message(AgsOscFrontController *osc_front_controller, GObject *message); void ags_osc_front_controller_remove_message(AgsOscFrontController *osc_front_controller, GObject *message); void ags_osc_front_controller_start_delegate(AgsOscFrontController *osc_front_controller); void ags_osc_front_controller_stop_delegate(AgsOscFrontController *osc_front_controller); gpointer ags_osc_front_controller_do_request(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size); AgsOscFrontController* ags_osc_front_controller_new(); G_END_DECLS #endif /*__AGS_OSC_FRONT_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_controller.c0000644000175000017500000001661313607210263021456 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_osc_controller_class_init(AgsOscControllerClass *osc_controller); void ags_osc_controller_init(AgsOscController *osc_controller); void ags_osc_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_controller_dispose(GObject *gobject); void ags_osc_controller_finalize(GObject *gobject); /** * SECTION:ags_osc_controller * @short_description: base OSC controller * @title: AgsOscController * @section_id: * @include: ags/audio/osc/controller/ags_osc_controller.h * * The #AgsOscController is a base object to implement OSC controllers. */ enum{ PROP_0, PROP_OSC_SERVER, PROP_CONTEXT_PATH, }; static gpointer ags_osc_controller_parent_class = NULL; GType ags_osc_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_controller = 0; static const GTypeInfo ags_osc_controller_info = { sizeof (AgsOscControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_controller_init, }; ags_type_osc_controller = g_type_register_static(G_TYPE_OBJECT, "AgsOscController", &ags_osc_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_controller); } return g_define_type_id__volatile; } void ags_osc_controller_class_init(AgsOscControllerClass *osc_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_controller_parent_class = g_type_class_peek_parent(osc_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_controller; gobject->set_property = ags_osc_controller_set_property; gobject->get_property = ags_osc_controller_get_property; gobject->dispose = ags_osc_controller_dispose; gobject->finalize = ags_osc_controller_finalize; /* properties */ /** * AgsOscController:osc-server: * * The assigned #AgsOscServer * * Since: 3.0.0 */ param_spec = g_param_spec_object("osc-server", i18n("assigned osc server"), i18n("The assigned osc server"), AGS_TYPE_OSC_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSC_SERVER, param_spec); /** * AgsOscController:context-path: * * The context path provided. * * Since: 3.0.0 */ param_spec = g_param_spec_string("context-path", i18n_pspec("context path to provide"), i18n_pspec("The context path provided by this controller"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTEXT_PATH, param_spec); } void ags_osc_controller_init(AgsOscController *osc_controller) { /* osc controller mutex */ g_rec_mutex_init(&(osc_controller->obj_mutex)); osc_controller->osc_server = NULL; osc_controller->context_path = NULL; } void ags_osc_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscController *osc_controller; GRecMutex *osc_controller_mutex; osc_controller = AGS_OSC_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_controller); switch(prop_id){ case PROP_OSC_SERVER: { AgsOscServer *osc_server; osc_server = (AgsOscServer *) g_value_get_object(value); g_rec_mutex_lock(osc_controller_mutex); if(osc_controller->osc_server == (GObject *) osc_server){ g_rec_mutex_unlock(osc_controller_mutex); return; } if(osc_controller->osc_server != NULL){ g_object_unref(G_OBJECT(osc_controller->osc_server)); } if(osc_server != NULL){ g_object_ref(G_OBJECT(osc_server)); } osc_controller->osc_server = (GObject *) osc_server; g_rec_mutex_unlock(osc_controller_mutex); } break; case PROP_CONTEXT_PATH: { char *context_path; context_path = (char *) g_value_get_string(value); g_rec_mutex_lock(osc_controller_mutex); osc_controller->context_path = g_strdup(context_path); g_rec_mutex_unlock(osc_controller_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscController *osc_controller; GRecMutex *osc_controller_mutex; osc_controller = AGS_OSC_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_controller); switch(prop_id){ case PROP_OSC_SERVER: { g_rec_mutex_lock(osc_controller_mutex); g_value_set_object(value, osc_controller->osc_server); g_rec_mutex_unlock(osc_controller_mutex); } break; case PROP_CONTEXT_PATH: { g_rec_mutex_lock(osc_controller_mutex); g_value_set_string(value, osc_controller->context_path); g_rec_mutex_unlock(osc_controller_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_controller_dispose(GObject *gobject) { AgsOscController *osc_controller; osc_controller = AGS_OSC_CONTROLLER(gobject); if(osc_controller->osc_server != NULL){ g_object_unref(osc_controller->osc_server); osc_controller->osc_server = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_controller_parent_class)->dispose(gobject); } void ags_osc_controller_finalize(GObject *gobject) { AgsOscController *osc_controller; osc_controller = AGS_OSC_CONTROLLER(gobject); if(osc_controller->osc_server != NULL){ g_object_unref(osc_controller->osc_server); } /* call parent */ G_OBJECT_CLASS(ags_osc_controller_parent_class)->finalize(gobject); } /** * ags_osc_controller_new: * * Instantiate new #AgsOscController * * Returns: the #AgsOscController * * Since: 3.0.0 */ AgsOscController* ags_osc_controller_new() { AgsOscController *osc_controller; osc_controller = (AgsOscController *) g_object_new(AGS_TYPE_OSC_CONTROLLER, NULL); return(osc_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_controller.h0000644000175000017500000000421113607210263021452 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_CONTROLLER_H__ #define __AGS_OSC_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_CONTROLLER (ags_osc_controller_get_type()) #define AGS_OSC_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_CONTROLLER, AgsOscController)) #define AGS_OSC_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_CONTROLLER, AgsOscControllerClass)) #define AGS_IS_OSC_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_CONTROLLER)) #define AGS_IS_OSC_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_CONTROLLER)) #define AGS_OSC_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_CONTROLLER, AgsOscControllerClass)) #define AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(obj) (&(((AgsOscController *) obj)->obj_mutex)) typedef struct _AgsOscController AgsOscController; typedef struct _AgsOscControllerClass AgsOscControllerClass; struct _AgsOscController { GObject gobject; GRecMutex obj_mutex; GObject *osc_server; gchar *context_path; }; struct _AgsOscControllerClass { GObjectClass gobject; }; GType ags_osc_controller_get_type(); AgsOscController* ags_osc_controller_new(); G_END_DECLS #endif /*__AGS_OSC_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_meter_controller.c0000644000175000017500000036745013607210263022662 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_meter_controller_class_init(AgsOscMeterControllerClass *osc_meter_controller); void ags_osc_meter_controller_init(AgsOscMeterController *osc_meter_controller); void ags_osc_meter_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_meter_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_meter_controller_dispose(GObject *gobject); void ags_osc_meter_controller_finalize(GObject *gobject); gboolean ags_osc_meter_controller_monitor_timeout(AgsOscMeterController *osc_meter_controller); void ags_osc_meter_controller_real_start_monitor(AgsOscMeterController *osc_meter_controller); void ags_osc_meter_controller_real_stop_monitor(AgsOscMeterController *osc_meter_controller); gpointer ags_osc_meter_controller_monitor_meter_audio(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsAudio *audio, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_meter_controller_monitor_meter_channel(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsChannel *channel, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_meter_controller_monitor_meter_recall(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsRecall *recall, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_meter_controller_monitor_meter_port(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsRecall *parent, AgsPort *port, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); void ags_osc_meter_controller_expand_path_audio(AgsAudio *audio, gchar *path, gchar ***strv); void ags_osc_meter_controller_expand_path_channel(AgsChannel *channel, gchar *path, gchar ***strv); void ags_osc_meter_controller_expand_path_recall(AgsRecall *recall, gchar *path, gchar ***strv); void ags_osc_meter_controller_expand_path_port(AgsPort *port, gchar *path, gchar ***strv); void ags_osc_meter_controller_expand_path(gchar *path, gchar ***strv); gpointer ags_osc_meter_controller_monitor_meter_enable(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size, gchar *type_tag, gchar *path); gpointer ags_osc_meter_controller_monitor_meter_disable(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size, gchar *type_tag, gchar *path); gpointer ags_osc_meter_controller_real_monitor_meter(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); /** * SECTION:ags_osc_meter_controller * @short_description: base osc_meter_controller * @title: AgsOscMeterController * @section_id: * @include: ags/audio/osc/controller/ags_osc_meter_controller.h * * The #AgsOscMeterController is a base object to implement osc_meter_controllers. */ enum{ PROP_0, }; enum{ START_MONITOR, STOP_MONITOR, MONITOR_METER, LAST_SIGNAL, }; static gpointer ags_osc_meter_controller_parent_class = NULL; static guint osc_meter_controller_signals[LAST_SIGNAL]; static GMutex regex_mutex; GType ags_osc_meter_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_meter_controller = 0; static const GTypeInfo ags_osc_meter_controller_info = { sizeof (AgsOscMeterControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_meter_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscMeterController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_meter_controller_init, }; ags_type_osc_meter_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscMeterController", &ags_osc_meter_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_meter_controller); } return g_define_type_id__volatile; } void ags_osc_meter_controller_class_init(AgsOscMeterControllerClass *osc_meter_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_meter_controller_parent_class = g_type_class_peek_parent(osc_meter_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_meter_controller; gobject->set_property = ags_osc_meter_controller_set_property; gobject->get_property = ags_osc_meter_controller_get_property; gobject->dispose = ags_osc_meter_controller_dispose; gobject->finalize = ags_osc_meter_controller_finalize; /* properties */ /* AgsOscMeterControllerClass */ osc_meter_controller->start_monitor = ags_osc_meter_controller_real_start_monitor; osc_meter_controller->stop_monitor = ags_osc_meter_controller_real_stop_monitor; osc_meter_controller->monitor_meter = ags_osc_meter_controller_real_monitor_meter; /* signals */ /** * AgsOscMeterController::start-monitor: * @osc_meter_controller: the #AgsOscMeterController * * The ::start-monitor signal is emited during start of monitoring meter. * * Since: 3.0.0 */ osc_meter_controller_signals[START_MONITOR] = g_signal_new("start-monitor", G_TYPE_FROM_CLASS(osc_meter_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscMeterControllerClass, start_monitor), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscMeterController::stop-monitor: * @osc_meter_controller: the #AgsOscMeterController * * The ::stop-monitor signal is emited during stop of monitoring meter. * * Since: 3.0.0 */ osc_meter_controller_signals[STOP_MONITOR] = g_signal_new("stop-monitor", G_TYPE_FROM_CLASS(osc_meter_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscMeterControllerClass, stop_monitor), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscMeterController::monitor-meter: * @osc_meter_controller: the #AgsOscMeterController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::monitor-meter signal is emited during get data of meter controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_meter_controller_signals[MONITOR_METER] = g_signal_new("monitor-meter", G_TYPE_FROM_CLASS(osc_meter_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscMeterControllerClass, monitor_meter), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_meter_controller_init(AgsOscMeterController *osc_meter_controller) { g_object_set(osc_meter_controller, "context-path", "/meter", NULL); osc_meter_controller->flags = 0; /* monitor structs */ osc_meter_controller->monitor = NULL; } void ags_osc_meter_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscMeterController *osc_meter_controller; GRecMutex *osc_controller_mutex; osc_meter_controller = AGS_OSC_METER_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_meter_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscMeterController *osc_meter_controller; GRecMutex *osc_controller_mutex; osc_meter_controller = AGS_OSC_METER_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_meter_controller_dispose(GObject *gobject) { AgsOscMeterController *osc_meter_controller; osc_meter_controller = AGS_OSC_METER_CONTROLLER(gobject); if(osc_meter_controller->monitor != NULL){ g_list_free_full(osc_meter_controller->monitor, (GDestroyNotify) ags_osc_meter_controller_monitor_free); osc_meter_controller->monitor = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_meter_controller_parent_class)->dispose(gobject); } void ags_osc_meter_controller_finalize(GObject *gobject) { AgsOscMeterController *osc_meter_controller; osc_meter_controller = AGS_OSC_METER_CONTROLLER(gobject); if(osc_meter_controller->monitor != NULL){ g_list_free_full(osc_meter_controller->monitor, (GDestroyNotify) ags_osc_meter_controller_monitor_free); } /* call parent */ G_OBJECT_CLASS(ags_osc_meter_controller_parent_class)->finalize(gobject); } gboolean ags_osc_meter_controller_monitor_timeout(AgsOscMeterController *osc_meter_controller) { GList *start_monitor, *monitor; GRecMutex *osc_controller_mutex; /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* run */ g_rec_mutex_lock(osc_controller_mutex); monitor = start_monitor = g_list_copy(osc_meter_controller->monitor); while(monitor != NULL){ ags_osc_meter_controller_monitor_ref(monitor->data); monitor = monitor->next; } g_rec_mutex_unlock(osc_controller_mutex); /* */ monitor = start_monitor; while(monitor != NULL){ AgsPort *port; AgsOscConnection *osc_connection; AgsOscResponse *osc_response; GType port_value_type; gchar *path; guchar *packet; guint port_value_length; gboolean port_value_is_pointer; guint real_packet_size; guint packet_size; GRecMutex *port_mutex; g_rec_mutex_lock(osc_controller_mutex); osc_connection = AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->osc_connection; path = AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->path; port = AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->port; g_rec_mutex_unlock(osc_controller_mutex); /* */ osc_response = ags_osc_response_new(); packet = (guchar *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); g_object_set(osc_response, "packet", packet, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/meter", -1); packet_size += 8; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* check array type */ g_object_get(port, "port-value-is-pointer", &port_value_is_pointer, "port-value-type", &port_value_type, "port-value-length", &port_value_length, NULL); if(port_value_is_pointer){ gchar *type_tag; guint length; guint i; /* message type tag */ if(packet_size + (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); ags_osc_connection_write_response(osc_connection, (GObject *) osc_response); g_object_run_dispose(osc_response); g_object_unref(osc_response); /* iterate */ monitor = monitor->next; continue; } type_tag = packet + packet_size; // (gchar *) malloc((port_value_length + 5) * sizeof(gchar)); type_tag[0] = ','; type_tag[1] = 's'; type_tag[2] = '['; type_tag[port_value_length + 3] = ']'; if(port_value_type == G_TYPE_DOUBLE){ for(i = 0; i < port_value_length; i++){ packet[packet_size + 3 + i] = 'd'; } /* node path */ packet_size += (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)); length = strlen(path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); ags_osc_connection_write_response(osc_connection, (GObject *) osc_response); g_object_run_dispose(osc_response); g_object_unref(osc_response); /* iterate */ monitor = monitor->next; continue; } g_rec_mutex_lock(osc_controller_mutex); ags_osc_buffer_util_put_string(packet + packet_size, path, -1); g_rec_mutex_unlock(osc_controller_mutex); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); if(packet_size + (4 * (guint) ceil((double) (port_value_length * 8) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); ags_osc_connection_write_response(osc_connection, (GObject *) osc_response); g_object_run_dispose(osc_response); g_object_unref(osc_response); /* iterate */ monitor = monitor->next; continue; } g_rec_mutex_lock(port_mutex); for(i = 0; i < port_value_length; i++){ gdouble value; value = port->port_value.ags_port_double_ptr[i]; ags_osc_buffer_util_put_double(packet + packet_size + (i * 8), value); } g_rec_mutex_unlock(port_mutex); packet_size += (port_value_length * 8); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else{ g_warning("unsupported port type"); } }else{ if(port_value_type == G_TYPE_FLOAT){ gfloat value; guint length; /* message type tag */ g_rec_mutex_lock(port_mutex); value = port->port_value.ags_port_float; g_rec_mutex_unlock(port_mutex); ags_osc_buffer_util_put_string(packet + packet_size, ",sf", -1); /* node path */ packet_size += 4; length = strlen(path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 8 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); ags_osc_connection_write_response(osc_connection, (GObject *) osc_response); g_object_run_dispose(osc_response); g_object_unref(osc_response); /* iterate */ monitor = monitor->next; continue; } g_rec_mutex_lock(osc_controller_mutex); ags_osc_buffer_util_put_string(packet + packet_size, path, -1); g_rec_mutex_unlock(osc_controller_mutex); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_osc_buffer_util_put_float(packet + packet_size, value); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else{ g_warning("unsupported port type"); } } g_object_set(osc_response, "packet-size", packet_size, NULL); /* write response */ ags_osc_connection_write_response(osc_connection, (GObject *) osc_response); g_object_run_dispose(osc_response); g_object_unref(osc_response); /* iterate */ monitor = monitor->next; } g_list_free_full(start_monitor, (GDestroyNotify) ags_osc_meter_controller_monitor_unref); if(!ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING)){ return(G_SOURCE_REMOVE); } return(G_SOURCE_CONTINUE); } /** * ags_osc_meter_controller_test_flags: * @osc_meter_controller: the #AgsOscMeterController * @flags: the flags * * Test @flags to be set on @osc_meter_controller. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_meter_controller_test_flags(AgsOscMeterController *osc_meter_controller, guint flags) { gboolean retval; GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)){ return(FALSE); } /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* test */ g_rec_mutex_lock(osc_controller_mutex); retval = (flags & (osc_meter_controller->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(osc_controller_mutex); return(retval); } /** * ags_osc_meter_controller_set_flags: * @osc_meter_controller: the #AgsOscMeterController * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_meter_controller_set_flags(AgsOscMeterController *osc_meter_controller, guint flags) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)){ return; } /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* set flags */ g_rec_mutex_lock(osc_controller_mutex); osc_meter_controller->flags |= flags; g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_meter_controller_unset_flags: * @osc_meter_controller: the #AgsOscMeterController * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_meter_controller_unset_flags(AgsOscMeterController *osc_meter_controller, guint flags) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)){ return; } /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* set flags */ g_rec_mutex_lock(osc_controller_mutex); osc_meter_controller->flags &= (~flags); g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_meter_controller_monitor_alloc: * * Allocate #AgsOscMeterControllerMonitor-struct. * * Returns: (type gpointer) (transfer none): the newly allocate #AgsOscMeterControllerMonitor-struct * * Since: 3.0.0 */ AgsOscMeterControllerMonitor* ags_osc_meter_controller_monitor_alloc() { AgsOscMeterControllerMonitor *monitor; monitor = (AgsOscMeterControllerMonitor *) malloc(sizeof(AgsOscMeterControllerMonitor)); g_atomic_int_set(&(monitor->ref_count), 0); monitor->osc_connection = NULL; monitor->path = NULL; monitor->port = NULL; return(monitor); } /** * ags_osc_meter_controller_monitor_free: * @monitor: (type gpointer) (transfer none): the #AgsOscMeterControllerMonitor-struct * * Free @monitor. * * Since: 3.0.0 */ void ags_osc_meter_controller_monitor_free(AgsOscMeterControllerMonitor *monitor) { if(monitor == NULL){ return; } if(monitor->osc_connection != NULL){ g_object_unref(monitor->osc_connection); } g_free(monitor->path); if(monitor->port != NULL){ g_object_unref(monitor->port); } free(monitor); } /** * ags_osc_meter_controller_monitor_ref: * @monitor: (type gpointer) (transfer none): the #AgsOscMeterControllerMonitor-struct * * Increase reference count of @monitor. * * Since: 3.0.0 */ void ags_osc_meter_controller_monitor_ref(AgsOscMeterControllerMonitor *monitor) { if(monitor == NULL){ return; } g_atomic_int_inc(&(monitor->ref_count)); } /** * ags_osc_meter_controller_monitor_unref: * @monitor: (type gpointer) (transfer none): the #AgsOscMeterControllerMonitor-struct * * Decrease reference count of @monitor. If ref count is less or equal 0 * @monitor is freed. * * Since: 3.0.0 */ void ags_osc_meter_controller_monitor_unref(AgsOscMeterControllerMonitor *monitor) { if(monitor == NULL){ return; } if(g_atomic_int_dec_and_test(&(monitor->ref_count)) || g_atomic_int_get(&(monitor->ref_count)) < 0){ ags_osc_meter_controller_monitor_free(monitor); } } /** * ags_osc_meter_controller_monitor_find_path: * @monitor: (element-type gpointer) (transfer none): the #GList-struct containing #AgsOscMeterControllerMonitor-struct * @path: the path as string * * Find @path in @monitor. * * Returns: (element-type gpointer) (transfer none): the next matching #GList-struct containing #AgsOscMeterControllerMonitor-struct * * Since: 3.0.0 */ GList* ags_osc_meter_controller_monitor_find_path(GList *monitor, gchar *path) { if(monitor == NULL || path == NULL){ return(NULL); } while(monitor != NULL){ if(!g_strcmp0(AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->path, path)){ return(monitor); } monitor = monitor->next; } return(NULL); } /** * ags_osc_meter_controller_monitor_find_port: * @monitor: (element-type gpointer) (transfer none): the #GList-struct containing #AgsOscMeterControllerMonitor-struct * @port: the #AgsPort * * Find @port in @monitor. * * Returns: (element-type gpointer) (transfer none): the next matching #GList-struct containing #AgsOscMeterControllerMonitor-struct * * Since: 3.0.0 */ GList* ags_osc_meter_controller_monitor_find_port(GList *monitor, AgsPort *port) { if(monitor == NULL || port == NULL){ return(NULL); } while(monitor != NULL){ if(AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->port == port){ return(monitor); } monitor = monitor->next; } return(NULL); } /** * ags_osc_meter_controller_monitor_add_monitor: * @osc_meter_controller: the #AgsOscMeterController * @monitor: (type gpointer) (transfer none): the #AgsOscMeterControllerMonitor-struct * * Add @monitor to @osc_meter_controller. * * Since: 3.0.0 */ void ags_osc_meter_controller_add_monitor(AgsOscMeterController *osc_meter_controller, AgsOscMeterControllerMonitor *monitor) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)){ return; } /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* add monitor */ g_rec_mutex_lock(osc_controller_mutex); if(g_list_find(osc_meter_controller->monitor, monitor) == NULL){ ags_osc_meter_controller_monitor_ref(monitor); osc_meter_controller->monitor = g_list_prepend(osc_meter_controller->monitor, monitor); } g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_meter_controller_monitor_remove_monitor: * @osc_meter_controller: the #AgsOscMeterController * @monitor: (type gpointer) (transfer none): the #AgsOscMeterControllerMonitor-struct * * Remove @monitor from @osc_meter_controller. * * Since: 3.0.0 */ void ags_osc_meter_controller_remove_monitor(AgsOscMeterController *osc_meter_controller, AgsOscMeterControllerMonitor *monitor) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)){ return; } /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* remove monitor */ g_rec_mutex_lock(osc_controller_mutex); if(g_list_find(osc_meter_controller->monitor, monitor) != NULL){ osc_meter_controller->monitor = g_list_remove(osc_meter_controller->monitor, monitor); ags_osc_meter_controller_monitor_unref(monitor); } g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_meter_controller_monitor_contains_monitor: * @osc_meter_controller: the #AgsOscMeterController * @osc_connection: the #AgsOscConnection * @port: the #AgsPort * * Check if there is a monitor matching @osc_connection and @port in @osc_meter_controller. * * Returns: %TRUE if found, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_osc_meter_controller_contains_monitor(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsPort *port) { GList *monitor; GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller) || !AGS_IS_OSC_CONNECTION(osc_connection) || !AGS_IS_PORT(port)){ return(FALSE); } /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* check if contains OSC connection and port */ g_rec_mutex_lock(osc_controller_mutex); monitor = osc_meter_controller->monitor; while(monitor != NULL){ if(AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->osc_connection == osc_connection && AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->port == port){ g_rec_mutex_unlock(osc_controller_mutex); return(TRUE); } monitor = monitor->next; } g_rec_mutex_unlock(osc_controller_mutex); return(FALSE); } void ags_osc_meter_controller_real_start_monitor(AgsOscMeterController *osc_meter_controller) { AgsConfig *config; GMainContext *main_context; GSource *timeout_source; gchar *str; gdouble monitor_timeout; GRecMutex *osc_controller_mutex; config = ags_config_get_instance(); /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* test if already started */ g_rec_mutex_lock(osc_controller_mutex); if(ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_STARTED)){ g_rec_mutex_unlock(osc_controller_mutex); return; } ags_osc_meter_controller_set_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_STARTED); g_rec_mutex_unlock(osc_controller_mutex); /* monitor timeout */ monitor_timeout = AGS_OSC_METER_CONTROLLER_DEFAULT_MONITOR_TIMEOUT; str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "monitor-timeout"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER_0, "monitor-timeout"); } if(str != NULL){ monitor_timeout = g_ascii_strtod(str, NULL); free(str); } /* create monitor timeout */ ags_osc_meter_controller_set_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING); main_context = g_main_context_get_thread_default(); timeout_source = g_timeout_source_new(monitor_timeout * G_TIME_SPAN_MILLISECOND); g_source_set_callback(timeout_source, ags_osc_meter_controller_monitor_timeout, osc_meter_controller, NULL); g_source_attach(timeout_source, main_context); } /** * ags_osc_meter_controller_start_monitor: * @osc_meter_controller: the #AgsOscMeterController * * Start monitoring. * * Since: 3.0.0 */ void ags_osc_meter_controller_start_monitor(AgsOscMeterController *osc_meter_controller) { g_return_if_fail(AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)); g_object_ref((GObject *) osc_meter_controller); g_signal_emit(G_OBJECT(osc_meter_controller), osc_meter_controller_signals[START_MONITOR], 0); g_object_unref((GObject *) osc_meter_controller); } void ags_osc_meter_controller_real_stop_monitor(AgsOscMeterController *osc_meter_controller) { if(!ags_osc_meter_controller_test_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING)){ return; } ags_osc_meter_controller_set_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_TERMINATING); ags_osc_meter_controller_unset_flags(osc_meter_controller, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING); ags_osc_meter_controller_unset_flags(osc_meter_controller, (AGS_OSC_METER_CONTROLLER_MONITOR_STARTED | AGS_OSC_METER_CONTROLLER_MONITOR_TERMINATING)); } /** * ags_osc_meter_controller_stop_monitor: * @osc_meter_controller: the #AgsOscMeterController * * Stop monitoring. * * Since: 3.0.0 */ void ags_osc_meter_controller_stop_monitor(AgsOscMeterController *osc_meter_controller) { g_return_if_fail(AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller)); g_object_ref((GObject *) osc_meter_controller); g_signal_emit(G_OBJECT(osc_meter_controller), osc_meter_controller_signals[STOP_MONITOR], 0); g_object_unref((GObject *) osc_meter_controller); } gpointer ags_osc_meter_controller_monitor_meter_audio(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsAudio *audio, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; guchar *packet; guint real_packet_size; guint packet_size; gint nth_audio; if(!AGS_IS_AUDIO(audio)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, "/AgsOutput", 10) || !strncmp(path + path_offset, "/AgsInput", 9)){ AgsChannel *start_channel; AgsChannel *channel, *next_channel; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; start_channel = NULL; if(!strncmp(path + path_offset, "/AgsOutput", 10)){ path_offset += 10; g_object_get(audio, "output", &start_channel, NULL); }else{ path_offset += 9; g_object_get(audio, "input", &start_channel, NULL); } /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); channel = ags_channel_nth(start_channel, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_meter_controller_monitor_meter_channel(osc_meter_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(channel != NULL){ g_object_unref(channel); } }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); channel = ags_channel_nth(start_channel, i_start); next_channel = NULL; for(i = i_start; i <= i_stop && channel != NULL; i++){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_channel(osc_meter_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_channel(osc_meter_controller, osc_connection, start_channel, message, message_size, type_tag, path, path_offset); /* unref */ g_object_unref(start_channel); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); return(start_response); } /* prepare */ channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_channel(osc_meter_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(start_channel); if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); return(start_response); } channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_channel(osc_meter_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(start_channel); if(next_channel != NULL){ g_object_unref(next_channel); } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); /* unref */ g_object_unref(start_channel); return(start_response); } }else{ GType recall_type; GList *start_play, *play; GList *start_recall, *recall; regmatch_t match_arr[3]; gchar *type_name; gchar *str; guint type_name_length; guint str_length; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^\\/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path + path_offset, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + path_offset + 1, type_name_length); str_length = match_arr[2].rm_eo - match_arr[2].rm_so; str = g_strndup(path + path_offset + 1 + type_name_length, str_length); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); return(start_response); } recall_type = g_type_from_name(type_name); g_object_get(audio, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, str, index_max_matches, match_arr, 0) == 0){ guint i; guint i_stop; path_offset += (type_name_length + 1) + str_length; i_stop = g_ascii_strtoull(str + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } }else if(ags_regexec(&range_access_regex, str, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; path_offset += (type_name_length + 1) + str_length; endptr = NULL; i_start = g_ascii_strtoull(str + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i >= i_start){ if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } } if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } }else if(ags_regexec(&voluntary_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; current = recall->data; start_response = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } }else if(ags_regexec(&more_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else if(ags_regexec(&wildcard_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } return(start_response); } gpointer ags_osc_meter_controller_monitor_meter_channel(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsChannel *channel, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsAudio *audio; AgsOscResponse *osc_response; AgsApplicationContext *application_context; GType recall_type; GList *start_response; GList *start_play, *play; GList *start_recall, *recall; regmatch_t match_arr[3]; gchar *type_name; gchar *str; guint type_name_length; guint str_length; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^\\/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } start_response = NULL; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path + path_offset, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + path_offset + 1, type_name_length); str_length = match_arr[2].rm_eo - match_arr[2].rm_so; str = g_strndup(path + path_offset + 1 + type_name_length, str_length); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); return(start_response); } recall_type = g_type_from_name(type_name); g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, str, index_max_matches, match_arr, 0) == 0){ guint i; guint i_stop; path_offset += (type_name_length + 1) + str_length; i_stop = g_ascii_strtoull(str + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } }else if(ags_regexec(&range_access_regex, str, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; path_offset += (type_name_length + 1) + str_length; endptr = NULL; i_start = g_ascii_strtoull(str + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i >= i_start){ if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } } if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } }else if(ags_regexec(&voluntary_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; current = recall->data; start_response = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } }else if(ags_regexec(&more_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else if(ags_regexec(&wildcard_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_meter_controller_monitor_meter_recall(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); return(start_response); } return(start_response); } gpointer ags_osc_meter_controller_monitor_meter_recall(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsRecall *recall, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; guchar *packet; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_RECALL(recall)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (guchar *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); }else if(!strncmp(path + path_offset, "/AgsPort", 8)){ GList *start_port, *port; regmatch_t match_arr[3]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; path_offset += 8; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); g_object_get(recall, "port", &start_port, NULL); port = start_port; if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsPort *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_port, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_meter_controller_monitor_meter_port(osc_meter_controller, osc_connection, recall, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); port = g_list_nth(start_port, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_port(osc_meter_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_port(osc_meter_controller, osc_connection, recall, start_port->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } port = start_port; while(port != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_port(osc_meter_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } while(port != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_port(osc_meter_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsPort *current; gchar *port_specifier; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } length = offset - (path + path_offset + 2); port_specifier = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(port_specifier, path + path_offset + 2, (length) * sizeof(gchar)); port_specifier[length] = '\0'; current = NULL; port = ags_port_find_specifier(start_port, port_specifier); if(port != NULL){ current = port->data; } path_offset += (length + 4); start_response = ags_osc_meter_controller_monitor_meter_port(osc_meter_controller, osc_connection, recall, current, message, message_size, type_tag, path, path_offset); }else{ g_list_free_full(start_port, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } g_list_free_full(start_port, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_object_unref(task_launcher); return(start_response); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_meter_controller_monitor_meter_port(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsRecall *parent, AgsPort *port, guchar *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsAudio *audio; AgsChannel *channel; AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_list, *list; guchar *packet; gchar *current_path; gchar *specifier; guint real_packet_size; guint packet_size; gint nth_audio; gint nth_channel; gint nth_recall; gint nth_port; if(!AGS_IS_PORT(port)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); nth_recall = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; guint i; audio = NULL; channel = NULL; current_path = NULL; if(AGS_IS_RECALL_CHANNEL(parent)){ g_object_get(parent, "source", &channel, NULL); g_object_get(channel, "audio", &audio, "line", &nth_channel, NULL); g_object_get(channel, "play", &start_list, NULL); /* find nth recall */ list = start_list; for(i = 0; list != NULL; i++){ list = ags_recall_template_find_type(list, G_OBJECT_TYPE(parent)); if(list != NULL){ if(list->data == parent){ break; } list = list->next; } } g_list_free_full(start_list, g_object_unref); if(list != NULL){ nth_recall = i; }else{ g_object_get(channel, "recall", &start_list, NULL); list = start_list; for(i = 0; list != NULL; i++){ list = ags_recall_template_find_type(list, G_OBJECT_TYPE(parent)); if(list != NULL){ if(list->data == parent){ break; } list = list->next; } } g_list_free_full(start_list, g_object_unref); nth_recall = i; } g_object_unref(channel); g_object_unref(audio); }else if(AGS_IS_RECALL_AUDIO(parent)){ g_object_get(parent, "audio", &audio, NULL); g_object_get(audio, "play", &start_list, NULL); /* find nth recall */ list = start_list; for(i = 0; list != NULL; i++){ list = ags_recall_template_find_type(list, G_OBJECT_TYPE(parent)); if(list != NULL){ if(list->data == parent){ break; } list = list->next; } } g_list_free_full(start_list, g_object_unref); if(list != NULL){ nth_recall = i; }else{ g_object_get(channel, "recall", &start_list, NULL); list = start_list; for(i = 0; list != NULL; i++){ list = ags_recall_template_find_type(list, G_OBJECT_TYPE(parent)); if(list != NULL){ if(list->data == parent){ break; } list = list->next; } } g_list_free_full(start_list, g_object_unref); nth_recall = i; } g_object_unref(audio); } g_object_get(parent, "port", &start_list, NULL); nth_port = g_list_index(start_list, port); g_list_free_full(start_list, g_object_unref); /* get nth audio */ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); nth_audio = g_list_index(start_list, audio); g_list_free_full(start_list, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (guchar *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); packet_size = 0; g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_offset += 1; if(!strncmp(path + path_offset, "value", 6)){ GType port_value_type; guint port_value_length; gboolean port_value_is_pointer; GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* create current path */ g_rec_mutex_lock(port_mutex); specifier = g_strdup(port->specifier); g_rec_mutex_unlock(port_mutex); if(channel != NULL){ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s[%d]/%s[%d]/AgsPort[%d]:value", nth_audio, ((AGS_IS_OUTPUT(channel)) ? "AgsOutput": "AgsInput"), nth_channel, G_OBJECT_TYPE_NAME(parent), nth_recall, nth_port); }else{ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s[%d]/AgsPort[%d]:value", nth_audio, G_OBJECT_TYPE_NAME(parent), nth_recall, nth_port); } g_free(specifier); } if(!ags_osc_meter_controller_contains_monitor(osc_meter_controller, osc_connection, port)){ AgsOscMeterControllerMonitor *monitor; /* allocate monitor */ monitor = ags_osc_meter_controller_monitor_alloc(); monitor->osc_connection = osc_connection; g_object_ref(osc_connection); monitor->path = g_strdup(current_path); monitor->port = port; g_object_ref(port); /* add monitor */ ags_osc_meter_controller_add_monitor(osc_meter_controller, monitor); } g_free(current_path); } return(start_response); } gpointer ags_osc_meter_controller_monitor_meter_enable(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size, gchar *type_tag, gchar *path) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_audio, *audio; guint path_offset; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; start_response = NULL; application_context = ags_application_context_get_instance(); path_offset = 0; if(strncmp(path, "/AgsSoundProvider", 17) != 0){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); return(start_response); } path_offset += 17; if(strncmp(path + path_offset, "/AgsAudio", 9) != 0){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); return(start_response); } path_offset += 9; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); audio = start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsAudio *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_audio, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_meter_controller_monitor_meter_audio(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); audio = g_list_nth(start_audio, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_audio(osc_meter_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_audio(osc_meter_controller, osc_connection, start_audio->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_audio, g_object_unref); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); return(start_response); } audio = start_audio; while(audio != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_audio(osc_meter_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); return(start_response); } while(audio != NULL){ GList *retval; retval = ags_osc_meter_controller_monitor_meter_audio(osc_meter_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsAudio *current; gchar *audio_name; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); g_list_free_full(start_audio, g_object_unref); return(start_response); } length = offset - (path + path_offset + 2); audio_name = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(audio_name, path + path_offset + 2, (length) * sizeof(gchar)); audio_name[length] = '\0'; current = NULL; audio = ags_audio_find_name(start_audio, audio_name); if(audio != NULL){ current = audio->data; } g_free(audio_name); path_offset += (length + 4); start_response = ags_osc_meter_controller_monitor_meter_audio(osc_meter_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_audio, g_object_unref); return(start_response); } g_list_free_full(start_audio, g_object_unref); return(start_response); } void ags_osc_meter_controller_expand_path_audio(AgsAudio *audio, gchar *path, gchar ***strv) { AgsChannel *start_channel; AgsChannel *channel, *next_channel; regmatch_t match_arr[3]; gchar *prefix; gchar *offset; gchar *next_path; guint path_offset; guint i, i_start, i_stop; gboolean is_output; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static regex_t recall_regex; static regex_t generic_single_access_regex; static regex_t generic_range_access_regex; static regex_t generic_voluntary_access_regex; static regex_t generic_more_access_regex; static regex_t generic_wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[(\\?)\\]"; static const gchar *more_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[(\\*)\\]"; static const gchar *recall_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *generic_single_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/([A-Za-z]+)\\[([0-9]+)\\]"; static const gchar *generic_range_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/([A-Za-z]+)\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *generic_voluntary_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/([A-Za-z]+)\\[(\\?)\\]"; static const gchar *generic_more_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/([A-Za-z]+)\\[(\\+)\\]"; static const gchar *generic_wildcard_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/([A-Za-z]+)\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; if(audio == NULL || path == NULL){ return; } g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&generic_single_access_regex, generic_single_access_pattern, REG_EXTENDED); ags_regcomp(&generic_range_access_regex, generic_range_access_pattern, REG_EXTENDED); ags_regcomp(&generic_voluntary_access_regex, generic_voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&generic_more_access_regex, generic_more_access_pattern, REG_EXTENDED); ags_regcomp(&generic_wildcard_access_regex, generic_wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); start_channel = NULL; prefix = NULL; path_offset = 0; if((offset = strstr(path, "/AgsOutput")) != NULL){ g_object_get(audio, "output", &start_channel, NULL); path_offset = offset - path + 10; prefix = g_strndup(path, path_offset); is_output = TRUE; }else if((offset = strstr(path, "/AgsInput")) != NULL){ g_object_get(audio, "input", &start_channel, NULL); path_offset = offset - path + 9; prefix = g_strndup(path, path_offset); is_output = FALSE; } if(ags_regexec(&single_access_regex, path, index_max_matches, match_arr, 0) == 0){ gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); channel = ags_channel_nth(start_channel, i_stop); next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, endptr + 1); ags_osc_meter_controller_expand_path_channel(channel, next_path, strv); g_free(next_path); /* unref */ g_object_unref(start_channel); if(channel != NULL){ g_object_unref(channel); } }else if(ags_regexec(&range_access_regex, path, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); channel = ags_channel_nth(start_channel, i_start); next_channel = NULL; for(i = i_start; i <= i_stop && channel != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, endptr + 1); ags_osc_meter_controller_expand_path_channel(channel, next_path, strv); g_free(next_path); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(start_channel); if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&voluntary_access_regex, path, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel != NULL){ next_path = g_strdup_printf("%s[0]%s", prefix, path + path_offset + 3); ags_osc_meter_controller_expand_path_channel(start_channel, next_path, strv); g_free(next_path); /* unref */ g_object_unref(start_channel); } }else if(ags_regexec(&more_access_regex, path, index_max_matches, match_arr, 0) == 0){ guint i; path_offset += 3; if(start_channel == NULL){ return; } channel = start_channel; g_object_ref(channel); for(i = 0; channel != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); ags_osc_meter_controller_expand_path_channel(channel, next_path, strv); g_free(next_path); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ g_object_unref(start_channel); if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&wildcard_access_regex, path, index_max_matches, match_arr, 0) == 0){ guint i; channel = start_channel; if(channel != NULL){ g_object_ref(channel); } next_channel = NULL; for(i = 0; channel != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); ags_osc_meter_controller_expand_path_channel(channel, next_path, strv); g_free(next_path); /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ AgsRecall *current; GType recall_type; GList *start_play, *play; GList *start_recall, *recall; gchar *type_name; guint type_name_length; if(ags_regexec(&recall_regex, path, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + match_arr[1].rm_so, type_name_length); }else{ return; } recall_type = g_type_from_name(type_name); g_object_get(audio, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&generic_single_access_regex, path, index_max_matches, match_arr, 0) == 0){ gchar *endptr; guint i, i_stop; offset = path + match_arr[1].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = NULL; play = ags_recall_template_find_type(start_play, recall_type); for(i = 0; i < i_stop && play != NULL; i++){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(play != NULL){ current = play->data; }else{ recall = ags_recall_template_find_type(start_recall, recall_type); for(i = 0; i < i_stop && recall != NULL; i++){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } if(recall != NULL){ current = recall->data; } } next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, endptr + 1); ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); }else if(ags_regexec(&generic_range_access_regex, path, max_matches, match_arr, 0) == 0){ AgsRecall *current; gchar *endptr; guint i; guint i_start, i_stop; offset = path + match_arr[1].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); play = start_play; for(i = 0; i < i_start && play != NULL; i++){ play = ags_recall_template_find_type(play, recall_type); if(i + 1 < i_start){ play = play->next; } } recall = start_recall; for(i = 0; i < i_start && play != NULL; i++){ recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_start){ recall = recall->next; } } for(i = i_start; i <= i_stop && (play != NULL || recall != NULL); i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, endptr + 1); current = NULL; if(play != NULL){ current = play->data; }else if(recall != NULL){ current = recall->data; } ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); if(play != NULL){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(recall != NULL){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } } }else if(ags_regexec(&generic_voluntary_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsRecall *current; offset = path + match_arr[1].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); current = NULL; play = ags_recall_template_find_type(start_play, recall_type); if(play != NULL){ current = play->data; }else{ recall = ags_recall_template_find_type(start_recall, recall_type); if(recall != NULL){ current = recall->data; } } if(current != NULL){ i_stop = 0; next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, path + path_offset + 3); ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); } }else if(ags_regexec(&generic_more_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsRecall *current; offset = path + match_arr[1].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); play = ags_recall_template_find_type(start_play, recall_type); recall = ags_recall_template_find_type(start_recall, recall_type); if(play == NULL && recall == NULL){ g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return; } for(i = 0; play != NULL || recall != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); current = NULL; if(play != NULL){ current = play->data; }else if(recall != NULL){ current = recall->data; } ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); if(play != NULL){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(recall != NULL){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } } }else if(ags_regexec(&generic_wildcard_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsRecall *current; offset = path + match_arr[1].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); play = ags_recall_template_find_type(start_play, recall_type); recall = ags_recall_template_find_type(start_recall, recall_type); for(i = 0; play != NULL || recall != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); current = NULL; if(play != NULL){ current = play->data; }else if(recall != NULL){ current = recall->data; } ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); if(play != NULL){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(recall != NULL){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } } } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } g_free(prefix); } void ags_osc_meter_controller_expand_path_channel(AgsChannel *channel, gchar *path, gchar ***strv) { AgsRecall *current; GType recall_type; regmatch_t match_arr[4]; GList *start_play, *play; GList *start_recall, *recall; gchar *type_name; gchar *prefix; gchar *offset; gchar *next_path; guint type_name_length; guint path_offset; guint i, i_start, i_stop; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\]/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\]/([A-Za-z]+)\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\]/([A-Za-z]+)\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\]/([A-Za-z]+)\\[(\\?)\\]"; static const gchar *more_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\]/([A-Za-z]+)\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^/AgsSoundProvider/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\]/([A-Za-z]+)\\[(\\*)\\]"; static const size_t max_matches = 4; static const size_t index_max_matches = 3; if(channel == NULL || path == NULL){ return; } g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[2].rm_eo - match_arr[2].rm_so; type_name = g_strndup(path + match_arr[2].rm_so, type_name_length); }else{ return; } recall_type = g_type_from_name(type_name); prefix = NULL; path_offset = 0; g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, path, index_max_matches, match_arr, 0) == 0){ gchar *endptr; guint i, i_stop; offset = path + match_arr[2].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = NULL; play = ags_recall_template_find_type(start_play, recall_type); for(i = 0; i < i_stop && play != NULL; i++){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(play != NULL){ current = play->data; }else{ recall = ags_recall_template_find_type(start_recall, recall_type); for(i = 0; i < i_stop && recall != NULL; i++){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } if(recall != NULL){ current = recall->data; } } next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, endptr + 1); ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); }else if(ags_regexec(&range_access_regex, path, max_matches, match_arr, 0) == 0){ AgsRecall *current; gchar *endptr; guint i; guint i_start, i_stop; offset = path + match_arr[2].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); play = start_play; for(i = 0; i < i_start && play != NULL; i++){ play = ags_recall_template_find_type(play, recall_type); if(i + 1 < i_start){ play = play->next; } } recall = start_recall; for(i = 0; i < i_start && play != NULL; i++){ recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_start){ recall = recall->next; } } for(i = i_start; i <= i_stop && (play != NULL || recall != NULL); i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, endptr + 1); current = NULL; if(play != NULL){ current = play->data; }else if(recall != NULL){ current = recall->data; } ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); if(play != NULL){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(recall != NULL){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } } }else if(ags_regexec(&voluntary_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsRecall *current; offset = path + match_arr[2].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); current = NULL; play = ags_recall_template_find_type(start_play, recall_type); if(play != NULL){ current = play->data; }else{ recall = ags_recall_template_find_type(start_recall, recall_type); if(recall != NULL){ current = recall->data; } } if(current != NULL){ next_path = g_strdup_printf("%s[0]%s", prefix, path + path_offset + 3); ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); } }else if(ags_regexec(&more_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsRecall *current; guint i; offset = path + match_arr[2].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); play = ags_recall_template_find_type(start_play, recall_type); recall = ags_recall_template_find_type(start_recall, recall_type); if(play == NULL && recall == NULL){ g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return; } i = 0; while(play != NULL || recall != NULL){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); current = NULL; if(play != NULL){ current = play->data; }else if(recall != NULL){ current = recall->data; } ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); if(play != NULL){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(recall != NULL){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } i++; } }else if(ags_regexec(&wildcard_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsRecall *current; guint i; offset = path + match_arr[2].rm_eo; path_offset = offset - path; prefix = g_strndup(path, path_offset); play = ags_recall_template_find_type(start_play, recall_type); recall = ags_recall_template_find_type(start_recall, recall_type); i = 0; while(play != NULL || recall != NULL){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); current = NULL; if(play != NULL){ current = play->data; }else if(recall != NULL){ current = recall->data; } ags_osc_meter_controller_expand_path_recall(current, next_path, strv); g_free(next_path); if(play != NULL){ play = play->next; play = ags_recall_template_find_type(play, recall_type); } if(recall != NULL){ recall = recall->next; recall = ags_recall_template_find_type(recall, recall_type); } i++; } } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_free(prefix); } void ags_osc_meter_controller_expand_path_recall(AgsRecall *recall, gchar *path, gchar ***strv) { regmatch_t match_arr[4]; GList *start_port, *port; gchar *prefix; gchar *offset; gchar *next_path; guint path_offset; guint i, i_start, i_stop; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^/AgsSoundProvider(/AgsAudio\\[[0-9]+\\]|/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\])/[A-Za-z]+\\[[0-9]+\\]/AgsPort\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^/AgsSoundProvider/(/AgsAudio\\[[0-9]+\\]|/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\])/[A-Za-z]+\\[[0-9]+\\]/AgsPort\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^/AgsSoundProvider/(/AgsAudio\\[[0-9]+\\]|/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\])/[A-Za-z]+\\[[0-9]+\\]/AgsPort\\[(\\?)\\]"; static const gchar *more_access_pattern = "^/AgsSoundProvider/(/AgsAudio\\[[0-9]+\\]|/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\])/[A-Za-z]+\\[[0-9]+\\]/AgsPort\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^/AgsSoundProvider/(/AgsAudio\\[[0-9]+\\]|/AgsAudio\\[[0-9]+\\]/(AgsOutput|AgsInput)\\[[0-9]+\\])/[A-Za-z]+\\[[0-9]+\\]/AgsPort\\[(\\*)\\]"; static const size_t max_matches = 4; static const size_t index_max_matches = 3; if(recall == NULL || path == NULL){ return; } g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); prefix = NULL; path_offset = 0; if((offset = strstr(path, "/AgsPort")) != NULL){ path_offset = offset - path + 8; prefix = g_strndup(path, path_offset); } g_object_get(recall, "port", &start_port, NULL); if(ags_regexec(&single_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsPort *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_port, i_stop); next_path = g_strdup_printf("%s[%d]%s", prefix, i_stop, endptr + 1); ags_osc_meter_controller_expand_path_port(current, next_path, strv); g_free(next_path); }else if(ags_regexec(&range_access_regex, path, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); port = g_list_nth(start_port, i_start); for(i = i_start; i <= i_stop && port != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, endptr + 1); ags_osc_meter_controller_expand_path_port(port->data, next_path, strv); g_free(next_path); port = port->next; } }else if(ags_regexec(&voluntary_access_regex, path, index_max_matches, match_arr, 0) == 0){ if(start_port != NULL){ next_path = g_strdup_printf("%s[0]%s", prefix, path + path_offset + 3); ags_osc_meter_controller_expand_path_port(start_port->data, next_path, strv); g_free(next_path); } }else if(ags_regexec(&more_access_regex, path, index_max_matches, match_arr, 0) == 0){ guint i; if(start_port == NULL){ return; } port = start_port; for(i = 0; port != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); ags_osc_meter_controller_expand_path_port(port->data, next_path, strv); g_free(next_path); port = port->next; } }else if(ags_regexec(&wildcard_access_regex, path, index_max_matches, match_arr, 0) == 0){ guint i; port = start_port; for(i = 0; port != NULL; i++){ next_path = g_strdup_printf("%s[%d]%s", prefix, i, path + path_offset + 3); ags_osc_meter_controller_expand_path_port(port->data, next_path, strv); g_free(next_path); port = port->next; } }else{ if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsPort *current; gchar *specifier; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ g_list_free_full(start_port, g_object_unref); return; } length = offset - (path + path_offset + 2); specifier = g_strndup(path + path_offset + 2, length); current = NULL; port = ags_port_find_specifier(start_port, specifier); if(port != NULL){ current = port->data; } g_free(specifier); next_path = g_strdup_printf("%s[%d]%s", prefix, g_list_index(start_port, current), path + path_offset + length + 4); ags_osc_meter_controller_expand_path_port(current, next_path, strv); } } g_list_free_full(start_port, g_object_unref); } void ags_osc_meter_controller_expand_path_port(AgsPort *port, gchar *path, gchar ***strv) { guint length; if(port == NULL || path == NULL || strv == NULL){ return; } if(strv[0] == NULL){ length = 0; strv[0] = (gchar **) malloc(2 * sizeof(gchar *)); }else{ length = g_strv_length(strv[0]); strv[0] = (gchar **) realloc(strv[0], (length + 2) * sizeof(gchar *)); } strv[0][length] = g_strdup(path); strv[0][length + 1] = NULL; } void ags_osc_meter_controller_expand_path(gchar *path, gchar ***strv) { AgsApplicationContext *application_context; GList *start_audio, *audio; regmatch_t match_arr[2]; gchar *next_path; guint path_offset; guint i, i_start, i_stop; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^/AgsSoundProvider/AgsAudio\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^/AgsSoundProvider/AgsAudio\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^/AgsSoundProvider/AgsAudio\\[(\\?)\\]"; static const gchar *more_access_pattern = "^/AgsSoundProvider/AgsAudio\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^/AgsSoundProvider/AgsAudio\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; if(path == NULL){ return; } application_context = ags_application_context_get_instance(); g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); audio = start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); path_offset = strlen("/AgsSoundProvider/AgsAudio"); if(ags_regexec(&single_access_regex, path, index_max_matches, match_arr, 0) == 0){ AgsAudio *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_audio, i_stop); next_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]%s", i_stop, endptr + 1); ags_osc_meter_controller_expand_path_audio(current, next_path, strv); g_free(next_path); }else if(ags_regexec(&range_access_regex, path, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); audio = g_list_nth(start_audio, i_start); for(i = i_start; i <= i_stop && audio != NULL; i++){ next_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]%s", i, endptr + 1); ags_osc_meter_controller_expand_path_audio(audio->data, next_path, strv); g_free(next_path); audio = audio->next; } }else if(ags_regexec(&voluntary_access_regex, path, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio != NULL){ next_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[0]%s", path + path_offset); ags_osc_meter_controller_expand_path_audio(audio->data, next_path, strv); g_free(next_path); } }else if(ags_regexec(&more_access_regex, path, index_max_matches, match_arr, 0) == 0){ guint i; path_offset += 3; if(start_audio == NULL){ return; } audio = start_audio; for(i = 0; audio != NULL; i++){ next_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]%s", i, path + path_offset); ags_osc_meter_controller_expand_path_audio(audio->data, next_path, strv); g_free(next_path); audio = audio->next; } }else if(ags_regexec(&wildcard_access_regex, path, index_max_matches, match_arr, 0) == 0){ guint i; audio = start_audio; for(i = 0; audio != NULL; i++){ next_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]%s", i, path + path_offset); ags_osc_meter_controller_expand_path_audio(audio->data, next_path, strv); g_free(next_path); audio = audio->next; } }else{ path_offset = strlen("/AgsSoundProvider/AgsAudio"); if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsAudio *current; gchar *audio_name; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ g_list_free_full(start_audio, g_object_unref); return; } length = offset - (path + path_offset + 2); audio_name = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(audio_name, path + path_offset + 2, (length) * sizeof(gchar)); audio_name[length] = '\0'; current = NULL; audio = ags_audio_find_name(start_audio, audio_name); if(audio != NULL){ current = audio->data; } g_free(audio_name); next_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]%s", g_list_index(start_audio, current), offset + 2); ags_osc_meter_controller_expand_path_audio(current, next_path, strv); } } g_list_free_full(start_audio, g_object_unref); } gpointer ags_osc_meter_controller_monitor_meter_disable(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size, gchar *type_tag, gchar *path) { AgsOscResponse *osc_response; AgsOscMeterControllerMonitor *current; GList *monitor; GList *start_response; gchar **strv, **iter; guint i; GRecMutex *osc_controller_mutex; start_response = NULL; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); /* get OSC meter controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_meter_controller); /* find path and connection */ strv = NULL; ags_osc_meter_controller_expand_path(path, &strv); if(strv != NULL){ iter = strv; for(; iter[0] != NULL; iter++){ /* attempt 2 times play/recall */ for(i = 0; i < 2; i++){ g_rec_mutex_lock(osc_controller_mutex); monitor = osc_meter_controller->monitor; current = NULL; while((monitor = ags_osc_meter_controller_monitor_find_path(monitor, iter[0])) != NULL){ if(AGS_OSC_METER_CONTROLLER_MONITOR(monitor->data)->osc_connection == osc_connection){ current = monitor->data; break; } monitor = monitor->next; } g_rec_mutex_unlock(osc_controller_mutex); /* remove monitor */ if(current != NULL){ ags_osc_meter_controller_remove_monitor(osc_meter_controller, current); } } } g_strfreev(strv); } return(start_response); } gpointer ags_osc_meter_controller_real_monitor_meter(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size) { AgsApplicationContext *application_context; AgsOscResponse *osc_response; GList *start_response; gchar *type_tag; gchar *path; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && strlen(type_tag) == 3 && !strncmp(type_tag, ",s", 2) && (type_tag[2] == 'T' || type_tag[2] == 'F')) ? TRUE: FALSE; if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read argument */ ags_osc_buffer_util_get_string(message + 12, &path, NULL); if(path == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } /* get sound provider */ if(type_tag[2] == 'T'){ start_response = ags_osc_meter_controller_monitor_meter_enable(osc_meter_controller, osc_connection, message, message_size, type_tag, path); }else if(type_tag[2] == 'F'){ start_response = ags_osc_meter_controller_monitor_meter_disable(osc_meter_controller, osc_connection, message, message_size, type_tag, path); } free(type_tag); free(path); return(start_response); } /** * ags_osc_meter_controller_monitor_meter: * @osc_meter_controller: the #AgsOscMeterController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Get meter. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_meter_controller_monitor_meter(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_METER_CONTROLLER(osc_meter_controller), NULL); g_object_ref((GObject *) osc_meter_controller); g_signal_emit(G_OBJECT(osc_meter_controller), osc_meter_controller_signals[MONITOR_METER], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_meter_controller); return(osc_response); } /** * ags_osc_meter_controller_new: * * Instantiate new #AgsOscMeterController * * Returns: the #AgsOscMeterController * * Since: 3.0.0 */ AgsOscMeterController* ags_osc_meter_controller_new() { AgsOscMeterController *osc_meter_controller; osc_meter_controller = (AgsOscMeterController *) g_object_new(AGS_TYPE_OSC_METER_CONTROLLER, NULL); return(osc_meter_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_export_controller.h0000644000175000017500000000504213607210263023056 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_EXPORT_CONTROLLER_H__ #define __AGS_OSC_EXPORT_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_EXPORT_CONTROLLER (ags_osc_export_controller_get_type()) #define AGS_OSC_EXPORT_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_EXPORT_CONTROLLER, AgsOscExportController)) #define AGS_OSC_EXPORT_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_EXPORT_CONTROLLER, AgsOscExportControllerClass)) #define AGS_IS_OSC_EXPORT_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_EXPORT_CONTROLLER)) #define AGS_IS_OSC_EXPORT_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_EXPORT_CONTROLLER)) #define AGS_OSC_EXPORT_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_EXPORT_CONTROLLER, AgsOscExportControllerClass)) typedef struct _AgsOscExportController AgsOscExportController; typedef struct _AgsOscExportControllerClass AgsOscExportControllerClass; struct _AgsOscExportController { AgsOscController osc_controller; }; struct _AgsOscExportControllerClass { AgsOscControllerClass osc_controller; gpointer (*do_export)(AgsOscExportController *osc_export_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_osc_export_controller_get_type(); gpointer ags_osc_export_controller_do_export(AgsOscExportController *osc_export_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); AgsOscExportController* ags_osc_export_controller_new(); G_END_DECLS #endif /*__AGS_OSC_EXPORT_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_node_controller.c0000644000175000017500000035010213607210263022455 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_node_controller_class_init(AgsOscNodeControllerClass *osc_node_controller); void ags_osc_node_controller_init(AgsOscNodeController *osc_node_controller); void ags_osc_node_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_node_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_node_controller_dispose(GObject *gobject); void ags_osc_node_controller_finalize(GObject *gobject); gpointer ags_osc_node_controller_get_data_soundcard(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, GObject *soundcard, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_node_controller_get_data_sequencer(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, GObject *sequencer, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_node_controller_get_data_audio(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsAudio *audio, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_node_controller_get_data_channel(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsChannel *channel, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_node_controller_get_data_recall(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsRecall *recall, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_node_controller_get_data_port(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsRecall *parent, AgsPort *port, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_node_controller_real_get_data(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); /** * SECTION:ags_osc_node_controller * @short_description: OSC node controller * @title: AgsOscNodeController * @section_id: * @include: ags/audio/osc/controller/ags_osc_node_controller.h * * The #AgsOscNodeController implements the OSC node controller. */ enum{ PROP_0, }; enum{ GET_DATA, LAST_SIGNAL, }; static gpointer ags_osc_node_controller_parent_class = NULL; static guint osc_node_controller_signals[LAST_SIGNAL]; static GMutex regex_mutex; GType ags_osc_node_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_node_controller = 0; static const GTypeInfo ags_osc_node_controller_info = { sizeof (AgsOscNodeControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_node_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscNodeController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_node_controller_init, }; ags_type_osc_node_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscNodeController", &ags_osc_node_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_node_controller); } return g_define_type_id__volatile; } void ags_osc_node_controller_class_init(AgsOscNodeControllerClass *osc_node_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_node_controller_parent_class = g_type_class_peek_parent(osc_node_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_node_controller; gobject->set_property = ags_osc_node_controller_set_property; gobject->get_property = ags_osc_node_controller_get_property; gobject->dispose = ags_osc_node_controller_dispose; gobject->finalize = ags_osc_node_controller_finalize; /* properties */ /* AgsOscNodeControllerClass */ osc_node_controller->get_data = ags_osc_node_controller_real_get_data; /* signals */ /** * AgsOscNodeController::get-data: * @osc_node_controller: the #AgsOscNodeController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::get-data signal is emited during get data of node controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_node_controller_signals[GET_DATA] = g_signal_new("get-data", G_TYPE_FROM_CLASS(osc_node_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscNodeControllerClass, get_data), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_node_controller_init(AgsOscNodeController *osc_node_controller) { g_object_set(osc_node_controller, "context-path", "/node", NULL); } void ags_osc_node_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscNodeController *osc_node_controller; GRecMutex *osc_controller_mutex; osc_node_controller = AGS_OSC_NODE_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_node_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_node_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscNodeController *osc_node_controller; GRecMutex *osc_controller_mutex; osc_node_controller = AGS_OSC_NODE_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_node_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_node_controller_dispose(GObject *gobject) { AgsOscNodeController *osc_node_controller; osc_node_controller = AGS_OSC_NODE_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_node_controller_parent_class)->dispose(gobject); } void ags_osc_node_controller_finalize(GObject *gobject) { AgsOscNodeController *osc_node_controller; osc_node_controller = AGS_OSC_NODE_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_node_controller_parent_class)->finalize(gobject); } gpointer ags_osc_node_controller_get_data_soundcard(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, GObject *soundcard, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_list; unsigned char *packet; gchar *current_path; guint real_packet_size; guint packet_size; gint nth_soundcard; if(!AGS_IS_SOUNDCARD(soundcard)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ /* get nth soundcard */ start_list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); nth_soundcard = g_list_index(start_list, soundcard); g_list_free_full(start_list, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_offset += 1; if(!strncmp(path + path_offset, "device", 7)){ gchar *device; guint length; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsSoundcard[%d]:device", nth_soundcard); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",ss", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); device = ags_soundcard_get_device(AGS_SOUNDCARD(soundcard)); length = strlen(device); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, device, -1); packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "pcm-channels", 13)){ guint pcm_channels; guint length; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsSoundcard[%d]:pcm-channels", nth_soundcard); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), &pcm_channels, NULL, NULL, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, pcm_channels); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "samplerate", 11)){ guint samplerate; guint length; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsSoundcard[%d]:samplerate", nth_soundcard); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); packet_size = 16 + length; ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, &samplerate, NULL, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, samplerate); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "buffer-size", 12)){ guint buffer_size; guint length; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsSoundcard[%d]:buffer-size", nth_soundcard); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, NULL, &buffer_size, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, buffer_size); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "format", 7)){ guint format; guint length; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsSoundcard[%d]:format", nth_soundcard); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, NULL, NULL, &format); ags_osc_buffer_util_put_int32(packet + packet_size, format); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); return(start_response); } return(start_response); } gpointer ags_osc_node_controller_get_data_sequencer(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, GObject *sequencer, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_list; unsigned char *packet; gchar *current_path; guint real_packet_size; guint packet_size; gint nth_sequencer; if(!AGS_IS_SEQUENCER(sequencer)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ /* get nth sequencer */ start_list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); nth_sequencer = g_list_index(start_list, sequencer); g_list_free_full(start_list, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_offset += 1; if(!strncmp(path + path_offset, "device", 7)){ gchar *device; guint length; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsSequencer[%d]:device", nth_sequencer); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",ss", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); device = ags_sequencer_get_device(AGS_SEQUENCER(sequencer)); length = strlen(device); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, device, -1); packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); return(start_response); } return(start_response); } gpointer ags_osc_node_controller_get_data_audio(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsAudio *audio, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_list; unsigned char *packet; gchar *current_path; guint real_packet_size; guint packet_size; gint nth_audio; if(!AGS_IS_AUDIO(audio)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; /* get nth audio */ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); nth_audio = g_list_index(start_list, audio); g_list_free_full(start_list, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_offset += 1; /* properties */ if(!strncmp(path + path_offset, "audio-channels", 15)){ guint audio_channels; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]:audio-channels", nth_audio); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(audio, "audio-channels", &audio_channels, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, audio_channels); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "output-pads", 12)){ guint output_pads; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]:output-pads", nth_audio); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(audio, "output-pads", &output_pads, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, output_pads); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "input-pads", 11)){ guint input_pads; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]:input-pads", nth_audio); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(audio, "input-pads", &input_pads, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, input_pads); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "buffer-size", 12)){ guint buffer_size; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]:buffer-size", nth_audio); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(audio, "buffer-size", &buffer_size, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, buffer_size); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "samplerate", 11)){ guint samplerate; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]:samplerate", nth_audio); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(audio, "samplerate", &samplerate, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, samplerate); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "format", 7)){ guint format; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]:format", nth_audio); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(audio, "format", &format, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, format); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else if(!strncmp(path + path_offset, "/AgsOutput", 10) || !strncmp(path + path_offset, "/AgsInput", 9)){ AgsChannel *start_channel; AgsChannel *channel, *next_channel; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; start_channel = NULL; if(!strncmp(path + path_offset, "/AgsOutput", 10)){ path_offset += 10; g_object_get(audio, "output", &start_channel, NULL); }else{ path_offset += 9; g_object_get(audio, "input", &start_channel, NULL); } /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); channel = ags_channel_nth(start_channel, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_channel != NULL){ g_object_unref(start_channel); } if(channel != NULL){ g_object_unref(channel); } }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); channel = ags_channel_nth(start_channel, i_start); next_channel = NULL; for(i = i_start; i <= i_stop && channel != NULL; i++){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, start_channel, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); return(start_response); } /* prepare */ channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); return(start_response); } /* prepare */ channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } return(start_response); } }else{ GType recall_type; GList *start_play, *play; GList *start_recall, *recall; regmatch_t match_arr[3]; gchar *type_name; gchar *str; guint type_name_length; guint str_length; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^\\/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path + path_offset, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + path_offset + 1, type_name_length); str_length = match_arr[2].rm_eo - match_arr[2].rm_so; str = g_strndup(path + path_offset + 1 + type_name_length, str_length); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); return(start_response); } recall_type = g_type_from_name(type_name); g_object_get(audio, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, str, index_max_matches, match_arr, 0) == 0){ guint i; guint i_stop; path_offset += (type_name_length + 1) + str_length; i_stop = g_ascii_strtoull(str + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } }else if(ags_regexec(&range_access_regex, str, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; path_offset += (type_name_length + 1) + str_length; endptr = NULL; i_start = g_ascii_strtoull(str + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i >= i_start){ if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } } if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } }else if(ags_regexec(&voluntary_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; current = recall->data; start_response = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } }else if(ags_regexec(&more_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else if(ags_regexec(&wildcard_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } return(start_response); } gpointer ags_osc_node_controller_get_data_channel(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsChannel *channel, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsAudio *audio; AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_list; unsigned char *packet; gchar *current_path; guint real_packet_size; guint packet_size; gint nth_audio; gint nth_channel; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; g_object_get(channel, "audio", &audio, "line", &nth_channel, NULL); g_object_unref(audio); /* get nth audio */ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); nth_audio = g_list_index(start_list, audio); g_list_free_full(start_list, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_offset += 1; if(!strncmp(path + path_offset, "buffer-size", 12)){ guint buffer_size; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s[%d]:buffer-size", nth_audio, ((AGS_IS_OUTPUT(channel)) ? "AgsOutput": "AgsInput"), nth_channel); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(channel, "buffer-size", &buffer_size, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, buffer_size); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "samplerate", 11)){ guint samplerate; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s[%d]:samplerate", nth_audio, ((AGS_IS_OUTPUT(channel)) ? "AgsOutput": "AgsInput"), nth_channel); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(channel, "samplerate", &samplerate, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, samplerate); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(!strncmp(path + path_offset, "format", 7)){ guint format; /* create current path */ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s[%d]:format", nth_audio, ((AGS_IS_OUTPUT(channel)) ? "AgsOutput": "AgsInput"), nth_channel); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); /* message type tag */ packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",si", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 4 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); g_object_get(channel, "format", &format, NULL); ags_osc_buffer_util_put_int32(packet + packet_size, format); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else{ GType recall_type; GList *start_play, *play; GList *start_recall, *recall; regmatch_t match_arr[3]; gchar *type_name; gchar *str; guint type_name_length; guint str_length; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^\\/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path + path_offset, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + path_offset + 1, type_name_length); str_length = match_arr[2].rm_eo - match_arr[2].rm_so; str = g_strndup(path + path_offset + 1 + type_name_length, str_length); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); return(start_response); } recall_type = g_type_from_name(type_name); g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, str, index_max_matches, match_arr, 0) == 0){ guint i; guint i_stop; path_offset += (type_name_length + 1) + str_length; i_stop = g_ascii_strtoull(str + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } }else if(ags_regexec(&range_access_regex, str, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; path_offset += (type_name_length + 1) + str_length; endptr = NULL; i_start = g_ascii_strtoull(str + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i >= i_start){ if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } } if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } }else if(ags_regexec(&voluntary_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; current = recall->data; start_response = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } }else if(ags_regexec(&more_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else if(ags_regexec(&wildcard_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_node_controller_get_data_recall(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); return(start_response); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } return(start_response); } gpointer ags_osc_node_controller_get_data_recall(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsRecall *recall, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; unsigned char *packet; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_RECALL(recall)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); }else if(!strncmp(path + path_offset, "/AgsPort", 8)){ GList *start_port, *port; regmatch_t match_arr[3]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; path_offset += 8; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); g_object_get(recall, "port", &start_port, NULL); port = start_port; if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsPort *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_port, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_node_controller_get_data_port(osc_node_controller, osc_connection, recall, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); port = g_list_nth(start_port, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_node_controller_get_data_port(osc_node_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_port(osc_node_controller, osc_connection, recall, start_port->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_object_unref(task_launcher); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_object_unref(task_launcher); return(start_response); } port = start_port; while(port != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_port(osc_node_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_object_unref(task_launcher); return(start_response); } while(port != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_port(osc_node_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsPort *current; gchar *port_specifier; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } length = offset - (path + path_offset + 2); port_specifier = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(port_specifier, path + path_offset + 2, (length) * sizeof(gchar)); port_specifier[length] = '\0'; current = NULL; port = ags_port_find_specifier(start_port, port_specifier); if(port != NULL){ current = port->data; } path_offset += (length + 4); start_response = ags_osc_node_controller_get_data_port(osc_node_controller, osc_connection, recall, current, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } g_list_free_full(start_port, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_object_unref(task_launcher); return(start_response); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_node_controller_get_data_port(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, AgsRecall *parent, AgsPort *port, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsAudio *audio; AgsChannel *channel; AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; GList *start_list; unsigned char *packet; gchar *current_path; gchar *specifier; guint real_packet_size; guint packet_size; gint nth_audio; gint nth_channel; if(!AGS_IS_PORT(port)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; audio = NULL; channel = NULL; if(AGS_IS_RECALL_CHANNEL(parent)){ g_object_get(parent, "source", &channel, NULL); g_object_get(channel, "audio", &audio, "line", &nth_channel, NULL); g_object_unref(channel); g_object_unref(audio); }else if(AGS_IS_RECALL_AUDIO(parent)){ g_object_get(parent, "audio", &audio, NULL); g_object_unref(audio); } /* get nth audio */ start_list = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); nth_audio = g_list_index(start_list, audio); g_list_free_full(start_list, g_object_unref); osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_offset += 1; if(!strncmp(path + path_offset, "value", 6)){ GType port_value_type; guint port_value_length; gboolean port_value_is_pointer; GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* create current path */ g_rec_mutex_lock(port_mutex); specifier = g_strdup(port->specifier); g_rec_mutex_unlock(port_mutex); if(channel != NULL){ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s[%d]/%s/AgsPort[%s]:value", nth_audio, ((AGS_IS_OUTPUT(channel)) ? "AgsOutput": "AgsInput"), nth_channel, G_OBJECT_TYPE_NAME(parent), specifier); }else{ current_path = g_strdup_printf("/AgsSoundProvider/AgsAudio[%d]/%s/AgsPort[%s]:value", nth_audio, G_OBJECT_TYPE_NAME(parent), specifier); } g_free(specifier); /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/node", -1); packet_size += 8; /* check array type */ g_object_get(port, "port-value-is-pointer", &port_value_is_pointer, "port-value-type", &port_value_type, "port-value-length", &port_value_length, NULL); if(port_value_is_pointer){ gchar *type_tag; guint i; /* message type tag */ if(packet_size + (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } type_tag = packet + packet_size; // (gchar *) malloc((port_value_length + 5) * sizeof(gchar)); type_tag[0] = ','; type_tag[1] = 's'; type_tag[2] = '['; type_tag[port_value_length + 4] = ']'; if(port_value_type == G_TYPE_BOOLEAN){ g_rec_mutex_lock(port_mutex); for(i = 0; i < port_value_length; i++){ gboolean is_active; is_active = port->port_value.ags_port_boolean_ptr[i]; if(is_active){ packet[packet_size + 3 + i] = 'T'; }else{ packet[packet_size + 3 + i] = 'F'; } } g_rec_mutex_unlock(port_mutex); /* node path */ packet_size += (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)); length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_INT64){ for(i = 0; i < port_value_length; i++){ packet[packet_size + 3 + i] = 'h'; } /* node path */ packet_size += (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)); length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); if(packet_size + (4 * (guint) ceil((double) (port_value_length * 8) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } g_rec_mutex_lock(port_mutex); for(i = 0; i < port_value_length; i++){ gint64 value; value = port->port_value.ags_port_int_ptr[i]; ags_osc_buffer_util_put_int64(packet + packet_size + 3 + (i * 8), value); } g_rec_mutex_unlock(port_mutex); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_UINT64){ for(i = 0; i < port_value_length; i++){ packet[packet_size + 3 + i] = 'h'; } /* node path */ packet_size += (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)); length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); if(packet_size + (4 * (guint) ceil((double) (port_value_length * 8) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } g_rec_mutex_lock(port_mutex); for(i = 0; i < port_value_length; i++){ guint64 value; value = port->port_value.ags_port_uint_ptr[i]; //FIXME:JK: unsafe sign ags_osc_buffer_util_put_int64(packet + packet_size + 3 + (i * 8), value); } g_rec_mutex_unlock(port_mutex); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_FLOAT){ for(i = 0; i < port_value_length; i++){ packet[packet_size + 3 + i] = 'f'; } /* node path */ packet_size += (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)); length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); if(packet_size + (4 * (guint) ceil((double) (port_value_length * 4) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } g_rec_mutex_lock(port_mutex); for(i = 0; i < port_value_length; i++){ gfloat value; value = port->port_value.ags_port_float_ptr[i]; ags_osc_buffer_util_put_float(packet + packet_size + 3 + (i * 4), value); } g_rec_mutex_unlock(port_mutex); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_DOUBLE){ for(i = 0; i < port_value_length; i++){ packet[packet_size + 3 + i] = 'd'; } /* node path */ packet_size += (4 * (guint) ceil((double) (port_value_length + 5) / 4.0)); length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); if(packet_size + (4 * (guint) ceil((double) (port_value_length * 8) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } g_rec_mutex_lock(port_mutex); for(i = 0; i < port_value_length; i++){ gdouble value; value = port->port_value.ags_port_double_ptr[i]; ags_osc_buffer_util_put_double(packet + packet_size + 3 + (i * 8), value); } g_rec_mutex_unlock(port_mutex); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); } }else{ if(port_value_type == G_TYPE_BOOLEAN){ gboolean is_active; /* message type tag */ g_rec_mutex_lock(port_mutex); is_active = port->port_value.ags_port_boolean; g_rec_mutex_unlock(port_mutex); if(is_active){ ags_osc_buffer_util_put_string(packet + packet_size, ",sT", -1); }else{ ags_osc_buffer_util_put_string(packet + packet_size, ",sF", -1); } /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_INT64){ gint64 value; /* message type tag */ g_rec_mutex_lock(port_mutex); value = port->port_value.ags_port_int; g_rec_mutex_unlock(port_mutex); ags_osc_buffer_util_put_string(packet + packet_size, ",sh", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 8 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_osc_buffer_util_put_int64(packet + packet_size, value); packet_size += 8; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_UINT64){ guint64 value; /* message type tag */ g_rec_mutex_lock(port_mutex); value = port->port_value.ags_port_uint; g_rec_mutex_unlock(port_mutex); ags_osc_buffer_util_put_string(packet + packet_size, ",sh", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 8 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); //FIXME:JK: unsafe sign ags_osc_buffer_util_put_int64(packet + packet_size, value); packet_size += 8; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_FLOAT){ gfloat value; /* message type tag */ g_rec_mutex_lock(port_mutex); value = port->port_value.ags_port_float; g_rec_mutex_unlock(port_mutex); ags_osc_buffer_util_put_string(packet + packet_size, ",sf", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 8 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_osc_buffer_util_put_float(packet + packet_size, value); packet_size += 4; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); }else if(port_value_type == G_TYPE_DOUBLE){ gdouble value; /* message type tag */ g_rec_mutex_lock(port_mutex); value = port->port_value.ags_port_double; g_rec_mutex_unlock(port_mutex); ags_osc_buffer_util_put_string(packet + packet_size, ",sd", -1); /* node path */ packet_size += 4; length = strlen(current_path); if(packet_size + (4 * (guint) ceil((double) (length + 1) / 4.0)) + 8 > real_packet_size){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); return(start_response); } ags_osc_buffer_util_put_string(packet + packet_size, current_path, -1); /* node argument */ packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); ags_osc_buffer_util_put_double(packet + packet_size, value); packet_size += 8; /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); } } g_object_set(osc_response, "packet-size", packet_size, NULL); } } return(start_response); } gpointer ags_osc_node_controller_real_get_data(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; gchar *type_tag; gchar *path; guint path_offset; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",s", 2)) ? TRUE: FALSE; if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read argument */ ags_osc_buffer_util_get_string(message + 8 + (4 * (guint) ceil((gdouble) (strlen(type_tag) + 1) / 4.0)), &path, NULL); if(path == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } /* create packet */ application_context = ags_application_context_get_instance(); path_offset = 0; if(!strncmp(path, "/AgsSoundProvider", 17)){ path_offset = 17; if(!strncmp(path + path_offset, "/AgsSoundcard", 13)){ GList *start_soundcard, *soundcard; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 13; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ GObject *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_soundcard, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_node_controller_get_data_soundcard(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); soundcard = g_list_nth(start_soundcard, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, soundcard->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } soundcard = soundcard->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_soundcard != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, start_soundcard->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_soundcard == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_soundcard, g_object_unref); free(type_tag); free(path); return(start_response); } soundcard = start_soundcard; while(soundcard != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, soundcard->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } soundcard = soundcard->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_soundcard == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(soundcard != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, soundcard->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } soundcard = soundcard->next; } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_soundcard, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_soundcard, g_object_unref); }else if(!strncmp(path + path_offset, "/AgsSequencer", 13)){ GList *start_sequencer, *sequencer; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 13; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ GObject *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_sequencer, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_node_controller_get_data_sequencer(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); sequencer = g_list_nth(start_sequencer, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, sequencer->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } sequencer = sequencer->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_sequencer != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, start_sequencer->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_sequencer == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } sequencer = start_sequencer; while(sequencer != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, sequencer->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } sequencer = sequencer->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_sequencer == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(sequencer != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_channel(osc_node_controller, osc_connection, sequencer->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } sequencer = sequencer->next; } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_sequencer, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_sequencer, g_object_unref); }else if(!strncmp(path + path_offset, "/AgsAudio", 9)){ GList *start_audio, *audio; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 9; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); audio = start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsAudio *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_audio, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_node_controller_get_data_audio(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); audio = g_list_nth(start_audio, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_node_controller_get_data_audio(osc_node_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_audio(osc_node_controller, osc_connection, start_audio->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } audio = start_audio; while(audio != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_audio(osc_node_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(audio != NULL){ GList *retval; retval = ags_osc_node_controller_get_data_audio(osc_node_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsAudio *current; gchar *audio_name; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); g_list_free_full(start_audio, g_object_unref); free(type_tag); free(path); return(start_response); } length = offset - (path + path_offset + 2); audio_name = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(audio_name, path + path_offset + 2, (length) * sizeof(gchar)); audio_name[length] = '\0'; current = NULL; audio = ags_audio_find_name(start_audio, audio_name); if(audio != NULL){ current = audio->data; } path_offset += (length + 4); start_response = ags_osc_node_controller_get_data_audio(osc_node_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_audio, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_audio, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); free(type_tag); free(path); return(start_response); } } if(start_response == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } free(type_tag); free(path); return(start_response); } /** * ags_osc_node_controller_get_data: * @osc_node_controller: the #AgsOscNodeController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Get node. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_node_controller_get_data(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_NODE_CONTROLLER(osc_node_controller), NULL); g_object_ref((GObject *) osc_node_controller); g_signal_emit(G_OBJECT(osc_node_controller), osc_node_controller_signals[GET_DATA], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_node_controller); return(osc_response); } /** * ags_osc_node_controller_new: * * Instantiate new #AgsOscNodeController * * Returns: the #AgsOscNodeController * * Since: 3.0.0 */ AgsOscNodeController* ags_osc_node_controller_new() { AgsOscNodeController *osc_node_controller; osc_node_controller = (AgsOscNodeController *) g_object_new(AGS_TYPE_OSC_NODE_CONTROLLER, NULL); return(osc_node_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_config_controller.c0000644000175000017500000002355413607210263023005 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_osc_config_controller_class_init(AgsOscConfigControllerClass *osc_config_controller); void ags_osc_config_controller_init(AgsOscConfigController *osc_config_controller); void ags_osc_config_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_config_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_config_controller_dispose(GObject *gobject); void ags_osc_config_controller_finalize(GObject *gobject); gpointer ags_osc_config_controller_real_apply_config(AgsOscConfigController *osc_config_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); /** * SECTION:ags_osc_config_controller * @short_description: OSC config controller * @title: AgsOscConfigController * @section_id: * @include: ags/audio/osc/controller/ags_osc_config_controller.h * * The #AgsOscConfigController implements the OSC config controller. */ enum{ PROP_0, }; enum{ APPLY_CONFIG, LAST_SIGNAL, }; static gpointer ags_osc_config_controller_parent_class = NULL; static guint osc_config_controller_signals[LAST_SIGNAL]; GType ags_osc_config_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_config_controller = 0; static const GTypeInfo ags_osc_config_controller_info = { sizeof (AgsOscConfigControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_config_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscConfigController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_config_controller_init, }; ags_type_osc_config_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscConfigController", &ags_osc_config_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_config_controller); } return g_define_type_id__volatile; } void ags_osc_config_controller_class_init(AgsOscConfigControllerClass *osc_config_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_config_controller_parent_class = g_type_class_peek_parent(osc_config_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_config_controller; gobject->set_property = ags_osc_config_controller_set_property; gobject->get_property = ags_osc_config_controller_get_property; gobject->dispose = ags_osc_config_controller_dispose; gobject->finalize = ags_osc_config_controller_finalize; /* properties */ /* AgsOscConfigControllerClass */ osc_config_controller->apply_config = ags_osc_config_controller_real_apply_config; /* signals */ /** * AgsOscConfigController::apply-config: * @osc_config_controller: the #AgsOscConfigController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::apply-config signal is emited during get data of config controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_config_controller_signals[APPLY_CONFIG] = g_signal_new("apply-config", G_TYPE_FROM_CLASS(osc_config_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscConfigControllerClass, apply_config), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_config_controller_init(AgsOscConfigController *osc_config_controller) { g_object_set(osc_config_controller, "context-path", "/config", NULL); } void ags_osc_config_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscConfigController *osc_config_controller; GRecMutex *osc_controller_mutex; osc_config_controller = AGS_OSC_CONFIG_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_config_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_config_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscConfigController *osc_config_controller; GRecMutex *osc_controller_mutex; osc_config_controller = AGS_OSC_CONFIG_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_config_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_config_controller_dispose(GObject *gobject) { AgsOscConfigController *osc_config_controller; osc_config_controller = AGS_OSC_CONFIG_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_config_controller_parent_class)->dispose(gobject); } void ags_osc_config_controller_finalize(GObject *gobject) { AgsOscConfigController *osc_config_controller; osc_config_controller = AGS_OSC_CONFIG_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_config_controller_parent_class)->finalize(gobject); } gpointer ags_osc_config_controller_real_apply_config(AgsOscConfigController *osc_config_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscResponse *osc_response; AgsApplySoundConfig *apply_sound_config; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; gchar *type_tag; gchar *config_data; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",s", 3)) ? TRUE: FALSE; if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read config data */ ags_osc_buffer_util_get_string(message + 12, &config_data, NULL); if(config_data == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } /* get sound provider */ application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); apply_sound_config = ags_apply_sound_config_new(config_data); ags_task_launcher_add_task(task_launcher, (AgsTask *) apply_sound_config); /* create response */ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(config_data); g_object_unref(task_launcher); return(start_response); } /** * ags_osc_config_controller_apply_config: * @osc_config_controller: the #AgsOscConfigController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Apply config. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_config_controller_apply_config(AgsOscConfigController *osc_config_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_CONFIG_CONTROLLER(osc_config_controller), NULL); g_object_ref((GObject *) osc_config_controller); g_signal_emit(G_OBJECT(osc_config_controller), osc_config_controller_signals[APPLY_CONFIG], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_config_controller); return(osc_response); } /** * ags_osc_config_controller_new: * * Instantiate new #AgsOscConfigController * * Returns: the #AgsOscConfigController * * Since: 3.0.0 */ AgsOscConfigController* ags_osc_config_controller_new() { AgsOscConfigController *osc_config_controller; osc_config_controller = (AgsOscConfigController *) g_object_new(AGS_TYPE_OSC_CONFIG_CONTROLLER, NULL); return(osc_config_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_plugin_controller.h0000644000175000017500000000465713607210263023046 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_PLUGIN_CONTROLLER_H__ #define __AGS_OSC_PLUGIN_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_PLUGIN_CONTROLLER (ags_osc_plugin_controller_get_type()) #define AGS_OSC_PLUGIN_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_PLUGIN_CONTROLLER, AgsOscPluginController)) #define AGS_OSC_PLUGIN_CONTROLLER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_OSC_PLUGIN_CONTROLLER, AgsOscPluginControllerInterface)) #define AGS_IS_OSC_PLUGIN_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_OSC_PLUGIN_CONTROLLER)) #define AGS_IS_OSC_PLUGIN_CONTROLLER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_OSC_PLUGIN_CONTROLLER)) #define AGS_OSC_PLUGIN_CONTROLLER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_OSC_PLUGIN_CONTROLLER, AgsOscPluginControllerInterface)) typedef struct _AgsOscPluginController AgsOscPluginController; typedef struct _AgsOscPluginControllerInterface AgsOscPluginControllerInterface; struct _AgsOscPluginControllerInterface { GTypeInterface ginterface; gpointer (*do_request)(AgsOscPluginController *osc_plugin_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_osc_plugin_controller_get_type(); gpointer ags_osc_plugin_controller_do_request(AgsOscPluginController *osc_plugin_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); G_END_DECLS #endif /*__AGS_OSC_PLUGIN_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_renew_controller.h0000644000175000017500000000510213607210263022652 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_RENEW_CONTROLLER_H__ #define __AGS_OSC_RENEW_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_RENEW_CONTROLLER (ags_osc_renew_controller_get_type()) #define AGS_OSC_RENEW_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_RENEW_CONTROLLER, AgsOscRenewController)) #define AGS_OSC_RENEW_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_RENEW_CONTROLLER, AgsOscRenewControllerClass)) #define AGS_IS_OSC_RENEW_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_RENEW_CONTROLLER)) #define AGS_IS_OSC_RENEW_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_RENEW_CONTROLLER)) #define AGS_OSC_RENEW_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_RENEW_CONTROLLER, AgsOscRenewControllerClass)) #define AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH (8) typedef struct _AgsOscRenewController AgsOscRenewController; typedef struct _AgsOscRenewControllerClass AgsOscRenewControllerClass; struct _AgsOscRenewController { AgsOscController osc_controller; }; struct _AgsOscRenewControllerClass { AgsOscControllerClass osc_controller; gpointer (*set_data)(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_osc_renew_controller_get_type(); gpointer ags_osc_renew_controller_set_data(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); AgsOscRenewController* ags_osc_renew_controller_new(); G_END_DECLS #endif /*__AGS_OSC_RENEW_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_node_controller.h0000644000175000017500000000503713607210263022466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_NODE_CONTROLLER_H__ #define __AGS_OSC_NODE_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_NODE_CONTROLLER (ags_osc_node_controller_get_type()) #define AGS_OSC_NODE_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_NODE_CONTROLLER, AgsOscNodeController)) #define AGS_OSC_NODE_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_NODE_CONTROLLER, AgsOscNodeControllerClass)) #define AGS_IS_OSC_NODE_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_NODE_CONTROLLER)) #define AGS_IS_OSC_NODE_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_NODE_CONTROLLER)) #define AGS_OSC_NODE_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_NODE_CONTROLLER, AgsOscNodeControllerClass)) #define AGS_OSC_NODE_CONTROLLER_CONTEXT_PATH_LENGTH (8) typedef struct _AgsOscNodeController AgsOscNodeController; typedef struct _AgsOscNodeControllerClass AgsOscNodeControllerClass; struct _AgsOscNodeController { AgsOscController osc_controller; }; struct _AgsOscNodeControllerClass { AgsOscControllerClass osc_controller; gpointer (*get_data)(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_osc_node_controller_get_type(); gpointer ags_osc_node_controller_get_data(AgsOscNodeController *osc_node_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); AgsOscNodeController* ags_osc_node_controller_new(); G_END_DECLS #endif /*__AGS_OSC_NODE_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_config_controller.h0000644000175000017500000000505013607210263023001 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_CONFIG_CONTROLLER_H__ #define __AGS_OSC_CONFIG_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_CONFIG_CONTROLLER (ags_osc_config_controller_get_type()) #define AGS_OSC_CONFIG_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_CONFIG_CONTROLLER, AgsOscConfigController)) #define AGS_OSC_CONFIG_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_CONFIG_CONTROLLER, AgsOscConfigControllerClass)) #define AGS_IS_OSC_CONFIG_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_CONFIG_CONTROLLER)) #define AGS_IS_OSC_CONFIG_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_CONFIG_CONTROLLER)) #define AGS_OSC_CONFIG_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_CONFIG_CONTROLLER, AgsOscConfigControllerClass)) typedef struct _AgsOscConfigController AgsOscConfigController; typedef struct _AgsOscConfigControllerClass AgsOscConfigControllerClass; struct _AgsOscConfigController { AgsOscController osc_controller; }; struct _AgsOscConfigControllerClass { AgsOscControllerClass osc_controller; gpointer (*apply_config)(AgsOscConfigController *osc_config_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); }; GType ags_osc_config_controller_get_type(); gpointer ags_osc_config_controller_apply_config(AgsOscConfigController *osc_config_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); AgsOscConfigController* ags_osc_config_controller_new(); G_END_DECLS #endif /*__AGS_OSC_CONFIG_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_status_controller.h0000644000175000017500000000503213607210263023057 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_STATUS_CONTROLLER_H__ #define __AGS_OSC_STATUS_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_STATUS_CONTROLLER (ags_osc_status_controller_get_type()) #define AGS_OSC_STATUS_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_STATUS_CONTROLLER, AgsOscStatusController)) #define AGS_OSC_STATUS_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_STATUS_CONTROLLER, AgsOscStatusControllerClass)) #define AGS_IS_OSC_STATUS_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_STATUS_CONTROLLER)) #define AGS_IS_OSC_STATUS_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_STATUS_CONTROLLER)) #define AGS_OSC_STATUS_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_STATUS_CONTROLLER, AgsOscStatusControllerClass)) typedef struct _AgsOscStatusController AgsOscStatusController; typedef struct _AgsOscStatusControllerClass AgsOscStatusControllerClass; struct _AgsOscStatusController { AgsOscController osc_controller; }; struct _AgsOscStatusControllerClass { AgsOscControllerClass osc_controller; gpointer (*get_status)(AgsOscStatusController *osc_status_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); }; GType ags_osc_status_controller_get_type(); gpointer ags_osc_status_controller_get_status(AgsOscStatusController *osc_status_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); AgsOscStatusController* ags_osc_status_controller_new(); G_END_DECLS #endif /*__AGS_OSC_STATUS_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_info_controller.c0000644000175000017500000002044013607210263022462 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_osc_info_controller_class_init(AgsOscInfoControllerClass *osc_info_controller); void ags_osc_info_controller_init(AgsOscInfoController *osc_info_controller); void ags_osc_info_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_info_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_info_controller_dispose(GObject *gobject); void ags_osc_info_controller_finalize(GObject *gobject); gpointer ags_osc_info_controller_real_get_info(AgsOscInfoController *osc_info_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); /** * SECTION:ags_osc_info_controller * @short_description: OSC info controller * @title: AgsOscInfoController * @section_id: * @include: ags/audio/osc/controller/ags_osc_info_controller.h * * The #AgsOscInfoController implements the OSC info controller. */ enum{ PROP_0, }; enum{ GET_INFO, LAST_SIGNAL, }; static gpointer ags_osc_info_controller_parent_class = NULL; static guint osc_info_controller_signals[LAST_SIGNAL]; GType ags_osc_info_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_info_controller = 0; static const GTypeInfo ags_osc_info_controller_info = { sizeof (AgsOscInfoControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_info_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscInfoController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_info_controller_init, }; ags_type_osc_info_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscInfoController", &ags_osc_info_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_info_controller); } return g_define_type_id__volatile; } void ags_osc_info_controller_class_init(AgsOscInfoControllerClass *osc_info_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_info_controller_parent_class = g_type_class_peek_parent(osc_info_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_info_controller; gobject->set_property = ags_osc_info_controller_set_property; gobject->get_property = ags_osc_info_controller_get_property; gobject->dispose = ags_osc_info_controller_dispose; gobject->finalize = ags_osc_info_controller_finalize; /* properties */ /* AgsOscInfoControllerClass */ osc_info_controller->get_info = ags_osc_info_controller_real_get_info; /* signals */ /** * AgsOscInfoController::get-info: * @osc_info_controller: the #AgsOscInfoController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::get-info signal is emited during get info of info controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_info_controller_signals[GET_INFO] = g_signal_new("get-info", G_TYPE_FROM_CLASS(osc_info_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscInfoControllerClass, get_info), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_info_controller_init(AgsOscInfoController *osc_info_controller) { g_object_set(osc_info_controller, "context-path", "/info", NULL); } void ags_osc_info_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscInfoController *osc_info_controller; GRecMutex *osc_controller_mutex; osc_info_controller = AGS_OSC_INFO_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_info_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_info_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscInfoController *osc_info_controller; GRecMutex *osc_controller_mutex; osc_info_controller = AGS_OSC_INFO_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_info_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_info_controller_dispose(GObject *gobject) { AgsOscInfoController *osc_info_controller; osc_info_controller = AGS_OSC_INFO_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_info_controller_parent_class)->dispose(gobject); } void ags_osc_info_controller_finalize(GObject *gobject) { AgsOscInfoController *osc_info_controller; osc_info_controller = AGS_OSC_INFO_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_info_controller_parent_class)->finalize(gobject); } gpointer ags_osc_info_controller_real_get_info(AgsOscInfoController *osc_info_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size) { AgsOscResponse *osc_response; GList *start_response; guchar *packet; guint packet_size; static const guchar server_info_message[] = "/info\0\0\0,ssss\0\0\0V2.1.0\0\0osc-server\0\0Advanced Gtk+ Sequencer\02.1.0\0\0\0"; start_response = NULL; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); /* create packet */ packet = (guchar *) malloc((4 * sizeof(guchar)) + sizeof(server_info_message)); ags_osc_buffer_util_put_int32(packet, sizeof(server_info_message)); memcpy(packet + 4, server_info_message, sizeof(server_info_message)); /* set response packet */ g_object_set(osc_response, "packet", packet, "packet-size", (4 * sizeof(guchar)) + sizeof(server_info_message), NULL); return(start_response); } /** * ags_osc_info_controller_get_info: * @osc_info_controller: the #AgsOscInfoController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Get info. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_info_controller_get_info(AgsOscInfoController *osc_info_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_INFO_CONTROLLER(osc_info_controller), NULL); g_object_ref((GObject *) osc_info_controller); g_signal_emit(G_OBJECT(osc_info_controller), osc_info_controller_signals[GET_INFO], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_info_controller); return(osc_response); } /** * ags_osc_info_controller_new: * * Instantiate new #AgsOscInfoController * * Returns: the #AgsOscInfoController * * Since: 3.0.0 */ AgsOscInfoController* ags_osc_info_controller_new() { AgsOscInfoController *osc_info_controller; osc_info_controller = (AgsOscInfoController *) g_object_new(AGS_TYPE_OSC_INFO_CONTROLLER, NULL); return(osc_info_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_renew_controller.c0000644000175000017500000032334613607210263022662 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_renew_controller_class_init(AgsOscRenewControllerClass *osc_renew_controller); void ags_osc_renew_controller_init(AgsOscRenewController *osc_renew_controller); void ags_osc_renew_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_renew_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_renew_controller_dispose(GObject *gobject); void ags_osc_renew_controller_finalize(GObject *gobject); gpointer ags_osc_renew_controller_set_data_soundcard(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, GObject *soundcard, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_renew_controller_set_data_sequencer(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, GObject *sequencer, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_renew_controller_set_data_audio(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsAudio *audio, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_renew_controller_set_data_channel(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsChannel *channel, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_renew_controller_set_data_recall(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsRecall *recall, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_renew_controller_set_data_port(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsRecall *parent, AgsPort *port, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset); gpointer ags_osc_renew_controller_real_set_data(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size); /** * SECTION:ags_osc_renew_controller * @short_description: OSC renew controller * @title: AgsOscRenewController * @section_id: * @include: ags/audio/osc/controller/ags_osc_renew_controller.h * * The #AgsOscRenewController implements the OSC renew controller. */ enum{ PROP_0, }; enum{ SET_DATA, LAST_SIGNAL, }; static gpointer ags_osc_renew_controller_parent_class = NULL; static guint osc_renew_controller_signals[LAST_SIGNAL]; static GMutex regex_mutex; GType ags_osc_renew_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_renew_controller = 0; static const GTypeInfo ags_osc_renew_controller_info = { sizeof (AgsOscRenewControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_renew_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscRenewController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_renew_controller_init, }; ags_type_osc_renew_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscRenewController", &ags_osc_renew_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_renew_controller); } return g_define_type_id__volatile; } void ags_osc_renew_controller_class_init(AgsOscRenewControllerClass *osc_renew_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_renew_controller_parent_class = g_type_class_peek_parent(osc_renew_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_renew_controller; gobject->set_property = ags_osc_renew_controller_set_property; gobject->get_property = ags_osc_renew_controller_get_property; gobject->dispose = ags_osc_renew_controller_dispose; gobject->finalize = ags_osc_renew_controller_finalize; /* properties */ /* AgsOscRenewControllerClass */ osc_renew_controller->set_data = ags_osc_renew_controller_real_set_data; /* signals */ /** * AgsOscRenewController::set-data: * @osc_renew_controller: the #AgsOscRenewController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::set-data signal is emited during get data of renew controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_renew_controller_signals[SET_DATA] = g_signal_new("set-data", G_TYPE_FROM_CLASS(osc_renew_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscRenewControllerClass, set_data), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_renew_controller_init(AgsOscRenewController *osc_renew_controller) { g_object_set(osc_renew_controller, "context-path", "/renew", NULL); } void ags_osc_renew_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscRenewController *osc_renew_controller; GRecMutex *osc_controller_mutex; osc_renew_controller = AGS_OSC_RENEW_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_renew_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_renew_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscRenewController *osc_renew_controller; GRecMutex *osc_controller_mutex; osc_renew_controller = AGS_OSC_RENEW_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_renew_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_renew_controller_dispose(GObject *gobject) { AgsOscRenewController *osc_renew_controller; osc_renew_controller = AGS_OSC_RENEW_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_renew_controller_parent_class)->dispose(gobject); } void ags_osc_renew_controller_finalize(GObject *gobject) { AgsOscRenewController *osc_renew_controller; osc_renew_controller = AGS_OSC_RENEW_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_renew_controller_parent_class)->finalize(gobject); } gpointer ags_osc_renew_controller_set_data_soundcard(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, GObject *soundcard, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_SOUNDCARD(soundcard)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; type_tag_length = 4 * (guint) ceil((double) (strlen(type_tag) + 1) / 4.0); path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; if(!strncmp(path + path_offset, "device", 7)){ AgsSetDevice *set_device; gchar *device; gboolean success; success = (!strncmp(type_tag + 2, "s", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read device */ ags_osc_buffer_util_get_string(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &device, NULL); set_device = ags_set_device_new(soundcard, device); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_device); if(device != NULL){ free(device); } }else if(!strncmp(path + path_offset, "pcm-channels", 13)){ AgsSetAudioChannels *set_audio_channels; guint pcm_channels; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read pcm channels */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &pcm_channels); set_audio_channels = ags_set_audio_channels_new(soundcard, pcm_channels); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_audio_channels); }else if(!strncmp(path + path_offset, "samplerate", 11)){ AgsSetSamplerate *set_samplerate; guint samplerate; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read samplerate */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &samplerate); set_samplerate = ags_set_samplerate_new(soundcard, samplerate); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_samplerate); }else if(!strncmp(path + path_offset, "buffer-size", 12)){ AgsSetBufferSize *set_buffer_size; guint buffer_size; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read buffer size */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &buffer_size); set_buffer_size = ags_set_buffer_size_new(soundcard, buffer_size); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_buffer_size); }else if(!strncmp(path + path_offset, "format", 7)){ AgsSetFormat *set_format; guint format; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read format */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &format); set_format = ags_set_format_new(soundcard, format); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_format); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); g_object_unref(task_launcher); return(start_response); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_renew_controller_set_data_sequencer(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, GObject *sequencer, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_SEQUENCER(sequencer)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; type_tag_length = 4 * (guint) ceil((double) (strlen(type_tag) + 1) / 4.0); path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; if(!strncmp(path + path_offset, "device", 12)){ AgsSetDevice *set_device; gchar *device; gboolean success; success = (!strncmp(type_tag + 2, "s", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read device */ ags_osc_buffer_util_get_string(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &device, NULL); set_device = ags_set_device_new(sequencer, device); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_device); if(device != NULL){ free(device); } }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); g_object_unref(task_launcher); return(start_response); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_renew_controller_set_data_audio(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsAudio *audio, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_AUDIO(audio)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; type_tag_length = 4 * (guint) ceil((double) (strlen(type_tag) + 1) / 4.0); path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; /* properties */ if(!strncmp(path + path_offset, "audio-channels", 15)){ AgsResizeAudio *resize_audio; guint output_pads, input_pads; guint audio_channels; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read audio channels */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &audio_channels); g_object_get(audio, "output-pads", &output_pads, "input-pads", &input_pads, NULL); resize_audio = ags_resize_audio_new(audio, output_pads, input_pads, audio_channels); ags_task_launcher_add_task(task_launcher, (AgsTask *) resize_audio); }else if(!strncmp(path + path_offset, "output-pads", 12)){ AgsResizeAudio *resize_audio; guint output_pads, input_pads; guint audio_channels; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read output pads */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &output_pads); g_object_get(audio, "input-pads", &input_pads, "audio-channels", &audio_channels, NULL); resize_audio = ags_resize_audio_new(audio, output_pads, input_pads, audio_channels); ags_task_launcher_add_task(task_launcher, (AgsTask *) resize_audio); }else if(!strncmp(path + path_offset, "input-pads", 11)){ AgsResizeAudio *resize_audio; guint output_pads, input_pads; guint audio_channels; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read input pads */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &input_pads); g_object_get(audio, "output-pads", &output_pads, "audio-channels", &audio_channels, NULL); resize_audio = ags_resize_audio_new(audio, output_pads, input_pads, audio_channels); ags_task_launcher_add_task(task_launcher, (AgsTask *) resize_audio); }else if(!strncmp(path + path_offset, "samplerate", 11)){ AgsSetSamplerate *set_samplerate; guint samplerate; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read samplerate */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &samplerate); set_samplerate = ags_set_samplerate_new((GObject *) audio, samplerate); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_samplerate); }else if(!strncmp(path + path_offset, "buffer-size", 12)){ AgsSetBufferSize *set_buffer_size; guint buffer_size; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read buffer size */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &buffer_size); set_buffer_size = ags_set_buffer_size_new((GObject *) audio, buffer_size); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_buffer_size); }else if(!strncmp(path + path_offset, "format", 7)){ AgsSetFormat *set_format; guint format; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read format */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &format); set_format = ags_set_format_new((GObject *) audio, format); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_format); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else if(!strncmp(path + path_offset, "/AgsOutput", 10) || !strncmp(path + path_offset, "/AgsInput", 9)){ AgsChannel *start_channel; AgsChannel *channel, *next_channel; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; start_channel = NULL; if(!strncmp(path + path_offset, "/AgsOutput", 10)){ path_offset += 10; g_object_get(audio, "output", &start_channel, NULL); }else{ path_offset += 9; g_object_get(audio, "input", &start_channel, NULL); } /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); channel = ags_channel_nth(start_channel, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_channel != NULL){ g_object_unref(start_channel); } if(channel != NULL){ g_object_unref(channel); } }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); channel = ags_channel_nth(start_channel, i_start); next_channel = NULL; for(i = i_start; i <= i_stop && channel != NULL; i++){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, start_channel, message, message_size, type_tag, path, path_offset); g_object_unref(start_channel); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_object_unref(task_launcher); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_object_unref(task_launcher); return(start_response); } /* prepare */ channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_channel == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_object_unref(task_launcher); return(start_response); } /* prepare */ channel = start_channel; g_object_ref(channel); next_channel = NULL; while(channel != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, channel, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } /* iterate */ next_channel = ags_channel_next(channel); g_object_unref(channel); channel = next_channel; } /* unref */ if(start_channel != NULL){ g_object_unref(start_channel); } if(next_channel != NULL){ g_object_unref(next_channel); } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); /* unref */ g_object_unref(task_launcher); if(start_channel != NULL){ g_object_unref(start_channel); } return(start_response); } }else{ GType recall_type; GList *start_play, *play; GList *start_recall, *recall; regmatch_t match_arr[3]; gchar *type_name; gchar *str; guint type_name_length; guint str_length; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^\\/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path + path_offset, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + path_offset + 1, type_name_length); str_length = match_arr[2].rm_eo - match_arr[2].rm_so; str = g_strndup(path + path_offset + 1 + type_name_length, str_length); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); g_object_unref(task_launcher); return(start_response); } recall_type = g_type_from_name(type_name); g_object_get(audio, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, str, index_max_matches, match_arr, 0) == 0){ guint i; guint i_stop; path_offset += (type_name_length + 1) + str_length; i_stop = g_ascii_strtoull(str + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } }else if(ags_regexec(&range_access_regex, str, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; path_offset += (type_name_length + 1) + str_length; endptr = NULL; i_start = g_ascii_strtoull(str + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i >= i_start){ if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } } if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } }else if(ags_regexec(&voluntary_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; current = recall->data; start_response = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_object_unref(task_launcher); return(start_response); } }else if(ags_regexec(&more_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_object_unref(task_launcher); return(start_response); } if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else if(ags_regexec(&wildcard_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_object_unref(task_launcher); return(start_response); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_renew_controller_set_data_channel(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsChannel *channel, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; unsigned char *packet; guint type_tag_length; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_CHANNEL(channel)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; type_tag_length = 4 * (guint) ceil((double) (strlen(type_tag) + 1) / 4.0); path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; if(!strncmp(path + path_offset, "samplerate", 11)){ AgsSetSamplerate *set_samplerate; guint samplerate; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read samplerate */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &samplerate); set_samplerate = ags_set_samplerate_new((GObject *) channel, samplerate); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_samplerate); }else if(!strncmp(path + path_offset, "buffer-size", 12)){ AgsSetBufferSize *set_buffer_size; guint buffer_size; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read buffer size */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &buffer_size); set_buffer_size = ags_set_buffer_size_new((GObject *) channel, buffer_size); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_buffer_size); }else if(!strncmp(path + path_offset, "format", 7)){ AgsSetFormat *set_format; guint format; gboolean success; success = (!strncmp(type_tag + 2, "i", 2)) ? TRUE: FALSE; if(!success || message_size < 16 + path_length + 4){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } /* read format */ ags_osc_buffer_util_get_int32(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + type_tag_length + path_length, &format); set_format = ags_set_format_new((GObject *) channel, format); ags_task_launcher_add_task(task_launcher, (AgsTask *) set_format); }else{ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); } g_object_set(osc_response, "packet-size", packet_size, NULL); }else{ GType recall_type; GList *start_play, *play; GList *start_recall, *recall; regmatch_t match_arr[3]; gchar *type_name; gchar *str; guint type_name_length; guint str_length; static regex_t recall_regex; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *recall_pattern = "^\\/([a-zA-Z]+)(\\/|\\[[0-9]+\\]|\\[[0-9]+\\-[0-9]+\\]|\\[\\?\\]|\\[\\+\\]|\\[\\*\\]|:)"; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&recall_regex, recall_pattern, REG_EXTENDED); ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&recall_regex, path + path_offset, max_matches, match_arr, 0) == 0){ type_name_length = match_arr[1].rm_eo - match_arr[1].rm_so; type_name = g_strndup(path + path_offset + 1, type_name_length); str_length = match_arr[2].rm_eo - match_arr[2].rm_so; str = g_strndup(path + path_offset + 1 + type_name_length, str_length); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH, NULL); g_object_unref(task_launcher); return(start_response); } recall_type = g_type_from_name(type_name); g_object_get(channel, "play", &start_play, "recall", &start_recall, NULL); if(ags_regexec(&single_access_regex, str, index_max_matches, match_arr, 0) == 0){ guint i; guint i_stop; path_offset += (type_name_length + 1) + str_length; i_stop = g_ascii_strtoull(str + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } }else if(ags_regexec(&range_access_regex, str, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; path_offset += (type_name_length + 1) + str_length; endptr = NULL; i_start = g_ascii_strtoull(str + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, NULL, 10); play = start_play; recall = start_recall; for(i = 0; i <= i_stop; i++){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(i >= i_start){ if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } } if(i + 1 < i_stop){ if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } } }else if(ags_regexec(&voluntary_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; current = recall->data; start_response = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_object_unref(task_launcher); return(start_response); } }else if(ags_regexec(&more_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play == NULL && recall == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_object_unref(task_launcher); return(start_response); } if(play != NULL){ AgsRecall *current; current = play->data; start_response = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); start_response = g_list_concat(start_response, retval); } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else if(ags_regexec(&wildcard_access_regex, str, index_max_matches, match_arr, 0) == 0){ path_offset += (type_name_length + 1) + str_length; play = start_play; recall = start_recall; while(play != NULL || recall != NULL){ play = ags_recall_template_find_type(play, recall_type); recall = ags_recall_template_find_type(recall, recall_type); if(play != NULL){ AgsRecall *current; GList *retval; current = play->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(recall != NULL){ AgsRecall *current; GList *retval; current = recall->data; retval = ags_osc_renew_controller_set_data_recall(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } } if(play != NULL){ play = play->next; } if(recall != NULL){ recall = recall->next; } } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); g_object_unref(task_launcher); return(start_response); } g_list_free_full(start_play, g_object_unref); g_list_free_full(start_recall, g_object_unref); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_renew_controller_set_data_recall(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsRecall *recall, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_response; unsigned char *packet; guint path_length; guint real_packet_size; guint packet_size; if(!AGS_IS_RECALL(recall)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(!strncmp(path + path_offset, ":", 1)){ guint length; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); g_object_unref(task_launcher); return(start_response); }else if(!strncmp(path + path_offset, "/AgsPort", 8)){ GList *start_port, *port; regmatch_t match_arr[3]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 3; static const size_t index_max_matches = 2; path_offset += 8; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); g_object_get(recall, "port", &start_port, NULL); port = start_port; if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsPort *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_port, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_renew_controller_set_data_port(osc_renew_controller, osc_connection, recall, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); port = g_list_nth(start_port, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_renew_controller_set_data_port(osc_renew_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port != NULL){ start_response = ags_osc_renew_controller_set_data_port(osc_renew_controller, osc_connection, recall, start_port->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_object_unref(task_launcher); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_object_unref(task_launcher); return(start_response); } port = start_port; while(port != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_port(osc_renew_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_port == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); g_object_unref(task_launcher); return(start_response); } while(port != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_port(osc_renew_controller, osc_connection, recall, port->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } port = port->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsPort *current; gchar *port_specifier; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } length = offset - (path + path_offset + 2); port_specifier = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(port_specifier, path + path_offset + 2, (length) * sizeof(gchar)); port_specifier[length] = '\0'; current = NULL; port = ags_port_find_specifier(start_port, port_specifier); if(port != NULL){ current = port->data; } path_offset += (length + 4); start_response = ags_osc_renew_controller_set_data_port(osc_renew_controller, osc_connection, recall, current, message, message_size, type_tag, path, path_offset); free(port_specifier); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_port, g_object_unref); g_object_unref(task_launcher); return(start_response); } g_list_free_full(start_port, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_object_unref(task_launcher); return(start_response); } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_renew_controller_set_data_port(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, AgsRecall *parent, AgsPort *port, unsigned char *message, guint message_size, gchar *type_tag, gchar *path, guint path_offset) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; AgsTaskLauncher *task_launcher; GList *start_response; unsigned char *packet; guint path_length; guint type_tag_offset; guint real_packet_size; guint packet_size; if(!AGS_IS_PORT(port)){ return(NULL); } start_response = NULL; application_context = ags_application_context_get_instance(); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); real_packet_size = 0; packet_size = 0; if(path[path_offset] == ':'){ guint length; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); packet = (unsigned char *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; path_length = 4 * (guint) ceil((double) (strlen(path) + 1) / 4.0); path_offset += 1; if(!strncmp(path + path_offset, "value", 6)){ GType port_value_type; guint port_value_length; gboolean port_value_is_pointer; GRecMutex *port_mutex; /* get port mutex */ port_mutex = AGS_PORT_GET_OBJ_MUTEX(port); /* check array type */ g_object_get(port, "port-value-is-pointer", &port_value_is_pointer, "port-value-type", &port_value_type, "port-value-length", &port_value_length, NULL); path_offset = 4 * (guint) ceil((double) (path_offset + 7) / 4.0); if(port_value_is_pointer){ guint i; if(message_size < 16 + path_length + 2 || type_tag[2] != '['){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } if(port_value_type == G_TYPE_BOOLEAN){ guint value_count; gboolean success; value_count = 0; success = TRUE; g_rec_mutex_lock(port_mutex); for(i = 0; 16 + path_length + 3 + i < message_size && type_tag[3 + i] != '\0' && type_tag[3 + i] != ']' && i < port_value_length; i++){ if(type_tag[3 + i] == 'T'){ port->port_value.ags_port_boolean_ptr[i] = TRUE; }else if(type_tag[3 + i] == 'F'){ port->port_value.ags_port_boolean_ptr[i] = FALSE; }else{ success = FALSE; break; } } g_rec_mutex_unlock(port_mutex); if(!success || type_tag[3 + i] != ']'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } value_count = i; }else if(port_value_type == G_TYPE_INT64){ gint64 value; guint value_count; gboolean success; value_count = 0; success = TRUE; for(i = 0; 16 + path_length + 3 + i < message_size && type_tag[3 + i] != '\0' && type_tag[3 + i] != ']' && i < port_value_length; i++){ if(type_tag[3 + i] != 'h'){ success = FALSE; break; } } if(!success || type_tag[3 + i] != ']'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } type_tag_offset = 4 * (guint) ceil((double) (5 + i) / 4.0); value_count = i; g_rec_mutex_lock(port_mutex); for(i = 0; path_offset + type_tag_offset + (i * 8) < message_size && i < value_count; i++){ ags_osc_buffer_util_get_int64(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset + (i * 8), &value); port->port_value.ags_port_int_ptr[i] = value; } g_rec_mutex_unlock(port_mutex); }else if(port_value_type == G_TYPE_UINT64){ guint64 value; guint value_count; gboolean success; value_count = 0; success = TRUE; for(i = 0; 16 + path_length + 3 + i < message_size && type_tag[3 + i] != '\0' && type_tag[3 + i] != ']' && i < port_value_length; i++){ if(type_tag[3 + i] != 'h'){ success = FALSE; break; } } if(!success || type_tag[3 + i] != ']'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } type_tag_offset = 4 * (guint) ceil((double) (5 + i) / 4.0); value_count = i; g_rec_mutex_lock(port_mutex); for(i = 0; path_offset + type_tag_offset + (i * 8) < message_size && i < value_count; i++){ ags_osc_buffer_util_get_int64(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset + (i * 8), &value); port->port_value.ags_port_uint_ptr[i] = value; } g_rec_mutex_unlock(port_mutex); }else if(port_value_type == G_TYPE_FLOAT){ gfloat value; guint value_count; gboolean success; value_count = 0; success = TRUE; for(i = 0; 16 + path_length + 3 + i < message_size && type_tag[3 + i] != '\0' && type_tag[3 + i] != ']' && i < port_value_length; i++){ if(type_tag[3 + i] != 'f'){ success = FALSE; break; } } if(!success || type_tag[3 + i] != ']'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } type_tag_offset = 4 * (guint) ceil((double) (5 + i) / 4.0); value_count = i; g_rec_mutex_lock(port_mutex); for(i = 0; path_offset + type_tag_offset + (i * 4) < message_size && i < value_count; i++){ ags_osc_buffer_util_get_float(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset + (i * 4), &value); port->port_value.ags_port_float_ptr[i] = value; } g_rec_mutex_unlock(port_mutex); }else if(port_value_type == G_TYPE_DOUBLE){ gdouble value; guint value_count; gboolean success; value_count = 0; success = TRUE; for(i = 0; 16 + path_length + 3 + i < message_size && type_tag[3 + i] != '\0' && type_tag[3 + i] != ']' && i < port_value_length; i++){ if(type_tag[3 + i] != 'd'){ success = FALSE; break; } } if(!success || type_tag[3 + i] != ']'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } type_tag_offset = 4 * (guint) ceil((double) (5 + i) / 4.0); value_count = i; g_rec_mutex_lock(port_mutex); for(i = 0; path_offset + type_tag_offset + (i * 8) < message_size && i < value_count; i++){ ags_osc_buffer_util_get_double(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset + (i * 8), &value); port->port_value.ags_port_double_ptr[i] = value; } g_rec_mutex_unlock(port_mutex); } }else{ if(port_value_type == G_TYPE_BOOLEAN){ gboolean success; success = TRUE; g_rec_mutex_lock(port_mutex); if(message_size < 16 + path_length + 2){ if(type_tag[2] == 'T'){ port->port_value.ags_port_boolean = TRUE; }else if(type_tag[2] == 'F'){ port->port_value.ags_port_boolean = FALSE; }else{ success = FALSE; } }else{ success = FALSE; } g_rec_mutex_unlock(port_mutex); if(!success || type_tag[3] != '\0'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } }else if(port_value_type == G_TYPE_INT64){ gint64 value; gboolean success; type_tag_offset = 4; success = TRUE; if(message_size >= 8 + path_offset + type_tag_offset + 8){ if(type_tag[2] == 'h'){ ags_osc_buffer_util_get_int64(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset, &value); /* set value */ g_rec_mutex_lock(port_mutex); port->port_value.ags_port_int = value; g_rec_mutex_unlock(port_mutex); }else{ success = FALSE; } }else{ success = FALSE; } if(!success || type_tag[3] != '\0'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } }else if(port_value_type == G_TYPE_UINT64){ guint64 value; gboolean success; type_tag_offset = 4; success = TRUE; if(message_size >= 8 + path_offset + type_tag_offset + 8){ if(type_tag[2] == 'h'){ ags_osc_buffer_util_get_int64(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset, &value); /* set value */ g_rec_mutex_lock(port_mutex); port->port_value.ags_port_uint = value; g_rec_mutex_unlock(port_mutex); }else{ success = FALSE; } }else{ success = FALSE; } if(!success || type_tag[3] != '\0'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } }else if(port_value_type == G_TYPE_FLOAT){ gfloat value; gboolean success; type_tag_offset = 4; success = TRUE; if(message_size >= 8 + path_offset + type_tag_offset + 4){ if(type_tag[2] == 'f'){ ags_osc_buffer_util_get_float(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset, &value); /* set value */ g_rec_mutex_lock(port_mutex); port->port_value.ags_port_float = value; g_rec_mutex_unlock(port_mutex); }else{ success = FALSE; } }else{ success = FALSE; } if(!success || type_tag[3] != '\0'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } }else if(port_value_type == G_TYPE_DOUBLE){ gdouble value; gboolean success; type_tag_offset = 4; success = TRUE; if(message_size >= 8 + path_offset + type_tag_offset + 8){ if(type_tag[2] == 'd'){ ags_osc_buffer_util_get_double(message + AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH + path_offset + type_tag_offset, &value); /* set value */ g_rec_mutex_lock(port_mutex); port->port_value.ags_port_double = value; g_rec_mutex_unlock(port_mutex); }else{ success = FALSE; } }else{ success = FALSE; } if(!success || type_tag[3] != '\0'){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); g_object_unref(task_launcher); return(start_response); } } } } } g_object_unref(task_launcher); return(start_response); } gpointer ags_osc_renew_controller_real_set_data(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscResponse *osc_response; AgsApplicationContext *application_context; GList *start_response; gchar *type_tag; gchar *path; guint path_offset; gboolean success; start_response = NULL; /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",s", 2)) ? TRUE: FALSE; if(!success){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } /* read argument */ ags_osc_buffer_util_get_string(message + 8 + (4 * (guint) ceil((gdouble) (strlen(type_tag) + 1) / 4.0)), &path, NULL); if(path == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); free(type_tag); return(start_response); } /* create packet */ application_context = ags_application_context_get_instance(); path_offset = 0; if(!strncmp(path, "/AgsSoundProvider", 17)){ path_offset = 17; if(!strncmp(path + path_offset, "/AgsSoundcard", 13)){ GList *start_soundcard, *soundcard; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 13; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); soundcard = start_soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ GObject *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_soundcard, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_renew_controller_set_data_soundcard(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); soundcard = g_list_nth(start_soundcard, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, soundcard->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } soundcard = soundcard->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_soundcard != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, start_soundcard->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_soundcard == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } soundcard = start_soundcard; while(soundcard != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, soundcard->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } soundcard = soundcard->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_soundcard == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(soundcard != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, soundcard->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } soundcard = soundcard->next; } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_soundcard, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_soundcard, g_object_unref); }else if(!strncmp(path + path_offset, "/AgsSequencer", 13)){ GList *start_sequencer, *sequencer; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 13; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); sequencer = start_sequencer = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ GObject *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_sequencer, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_renew_controller_set_data_sequencer(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); sequencer = g_list_nth(start_sequencer, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, sequencer->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } sequencer = sequencer->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_sequencer != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, start_sequencer->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_sequencer == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } sequencer = start_sequencer; while(sequencer != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, sequencer->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } sequencer = sequencer->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_sequencer == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(sequencer != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_channel(osc_renew_controller, osc_connection, sequencer->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } sequencer = sequencer->next; } }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_sequencer, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_sequencer, g_object_unref); }else if(!strncmp(path + path_offset, "/AgsAudio", 9)){ GList *start_audio, *audio; regmatch_t match_arr[2]; static regex_t single_access_regex; static regex_t range_access_regex; static regex_t voluntary_access_regex; static regex_t more_access_regex; static regex_t wildcard_access_regex; static gboolean regex_compiled = FALSE; static const gchar *single_access_pattern = "^\\[([0-9]+)\\]"; static const gchar *range_access_pattern = "^\\[([0-9]+)\\-([0-9]+)\\]"; static const gchar *voluntary_access_pattern = "^\\[(\\?)\\]"; static const gchar *more_access_pattern = "^\\[(\\+)\\]"; static const gchar *wildcard_access_pattern = "^\\[(\\*)\\]"; static const size_t max_matches = 2; static const size_t index_max_matches = 1; path_offset += 9; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&single_access_regex, single_access_pattern, REG_EXTENDED); ags_regcomp(&range_access_regex, range_access_pattern, REG_EXTENDED); ags_regcomp(&voluntary_access_regex, voluntary_access_pattern, REG_EXTENDED); ags_regcomp(&more_access_regex, more_access_pattern, REG_EXTENDED); ags_regcomp(&wildcard_access_regex, wildcard_access_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); audio = start_audio = ags_sound_provider_get_audio(AGS_SOUND_PROVIDER(application_context)); if(ags_regexec(&single_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ AgsAudio *current; gchar *endptr; guint i_stop; endptr = NULL; i_stop = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); current = g_list_nth_data(start_audio, i_stop); path_offset += ((endptr + 1) - (path + path_offset)); start_response = ags_osc_renew_controller_set_data_audio(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else if(ags_regexec(&range_access_regex, path + path_offset, max_matches, match_arr, 0) == 0){ gchar *endptr; guint i; guint i_start, i_stop; endptr = NULL; i_start = g_ascii_strtoull(path + path_offset + 1, &endptr, 10); i_stop = g_ascii_strtoull(endptr + 1, &endptr, 10); path_offset += ((endptr + 1) - (path + path_offset)); audio = g_list_nth(start_audio, i_start); for(i = i_start; i <= i_stop; i++){ GList *retval; retval = ags_osc_renew_controller_set_data_audio(osc_renew_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(ags_regexec(&voluntary_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_audio(osc_renew_controller, osc_connection, start_audio->data, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } }else if(ags_regexec(&more_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } audio = start_audio; while(audio != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_audio(osc_renew_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(ags_regexec(&wildcard_access_regex, path + path_offset, index_max_matches, match_arr, 0) == 0){ path_offset += 3; if(start_audio == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_OK); free(type_tag); free(path); return(start_response); } while(audio != NULL){ GList *retval; retval = ags_osc_renew_controller_set_data_audio(osc_renew_controller, osc_connection, audio->data, message, message_size, type_tag, path, path_offset); if(start_response != NULL){ start_response = g_list_concat(start_response, retval); }else{ start_response = retval; } audio = audio->next; } }else if(path[path_offset] == '[' && path[path_offset + 1] == '"'){ AgsAudio *current; gchar *audio_name; gchar *offset; guint length; if((offset = strchr(path + path_offset + 2, '"')) == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED, NULL); g_list_free_full(start_audio, g_object_unref); free(type_tag); free(path); return(start_response); } length = offset - (path + path_offset + 2); audio_name = (gchar *) malloc((length + 1) * sizeof(gchar)); memcpy(audio_name, path + path_offset + 2, (length) * sizeof(gchar)); audio_name[length] = '\0'; current = NULL; audio = ags_audio_find_name(start_audio, audio_name); if(audio != NULL){ current = audio->data; } path_offset += (length + 4); start_response = ags_osc_renew_controller_set_data_audio(osc_renew_controller, osc_connection, current, message, message_size, type_tag, path, path_offset); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); g_list_free_full(start_audio, g_object_unref); free(type_tag); free(path); return(start_response); } g_list_free_full(start_audio, g_object_unref); }else{ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT, NULL); free(type_tag); free(path); return(start_response); } } if(start_response == NULL){ osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE, NULL); free(type_tag); free(path); return(start_response); } free(type_tag); free(path); return(start_response); } /** * ags_osc_renew_controller_set_data: * @osc_renew_controller: the #AgsOscRenewController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Renew data. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_renew_controller_set_data(AgsOscRenewController *osc_renew_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_RENEW_CONTROLLER(osc_renew_controller), NULL); g_object_ref((GObject *) osc_renew_controller); g_signal_emit(G_OBJECT(osc_renew_controller), osc_renew_controller_signals[SET_DATA], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_renew_controller); return(osc_response); } /** * ags_osc_renew_controller_new: * * Instantiate new #AgsOscRenewController * * Returns: the #AgsOscRenewController * * Since: 3.0.0 */ AgsOscRenewController* ags_osc_renew_controller_new() { AgsOscRenewController *osc_renew_controller; osc_renew_controller = (AgsOscRenewController *) g_object_new(AGS_TYPE_OSC_RENEW_CONTROLLER, NULL); return(osc_renew_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_plugin_controller.c0000644000175000017500000000564013607210263023032 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_osc_plugin_controller_class_init(AgsOscPluginControllerInterface *ginterface); /** * SECTION:ags_osc_plugin_controller * @short_description: provide abstract OSC controller * @title: AgsOscPluginController * @section_id: AgsOscPluginController * @include: ags/audio/osc/controller/ags_osc_plugin_controller.h * * The #AgsOscPluginController provides you an abstraction of OSC controller implementation. */ GType ags_osc_plugin_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_plugin_controller = 0; ags_type_osc_plugin_controller = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsOscPluginController", sizeof(AgsOscPluginControllerInterface), (GClassInitFunc) ags_osc_plugin_controller_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_plugin_controller); } return g_define_type_id__volatile; } void ags_osc_plugin_controller_class_init(AgsOscPluginControllerInterface *ginterface) { /* empty */ } /** * ags_osc_plugin_controller_do_request: * @osc_plugin_controller: the #AgsOscPluginController * @osc_connection: the #AgsOscConnection * @message: the OSC message * @message_size: the message size * * Do request. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_plugin_controller_do_request(AgsOscPluginController *osc_plugin_controller, AgsOscConnection *osc_connection, unsigned char *message, guint message_size) { AgsOscPluginControllerInterface *osc_plugin_controller_interface; gpointer response; g_return_val_if_fail(AGS_IS_OSC_PLUGIN_CONTROLLER(osc_plugin_controller), NULL); osc_plugin_controller_interface = AGS_OSC_PLUGIN_CONTROLLER_GET_INTERFACE(osc_plugin_controller); g_return_val_if_fail(osc_plugin_controller_interface->do_request, NULL); response = osc_plugin_controller_interface->do_request(osc_plugin_controller, osc_connection, message, message_size); return(response); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_status_controller.c0000644000175000017500000002377213607210263023065 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_osc_status_controller_class_init(AgsOscStatusControllerClass *osc_status_controller); void ags_osc_status_controller_init(AgsOscStatusController *osc_status_controller); void ags_osc_status_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_status_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_status_controller_dispose(GObject *gobject); void ags_osc_status_controller_finalize(GObject *gobject); gpointer ags_osc_status_controller_real_get_status(AgsOscStatusController *status_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); /** * SECTION:ags_osc_status_controller * @short_description: OSC status controller * @title: AgsOscStatusController * @section_id: * @include: ags/audio/osc/controller/ags_osc_status_controller.h * * The #AgsOscStatusController implements the OSC status controller. */ enum{ PROP_0, }; enum{ GET_STATUS, LAST_SIGNAL, }; static gpointer ags_osc_status_controller_parent_class = NULL; static guint osc_status_controller_signals[LAST_SIGNAL]; GType ags_osc_status_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_status_controller = 0; static const GTypeInfo ags_osc_status_controller_info = { sizeof (AgsOscStatusControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_status_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscStatusController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_status_controller_init, }; ags_type_osc_status_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscStatusController", &ags_osc_status_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_status_controller); } return g_define_type_id__volatile; } void ags_osc_status_controller_class_init(AgsOscStatusControllerClass *osc_status_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_status_controller_parent_class = g_type_class_peek_parent(osc_status_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_status_controller; gobject->set_property = ags_osc_status_controller_set_property; gobject->get_property = ags_osc_status_controller_get_property; gobject->dispose = ags_osc_status_controller_dispose; gobject->finalize = ags_osc_status_controller_finalize; /* properties */ /* AgsOscStatusControllerClass */ osc_status_controller->get_status = ags_osc_status_controller_real_get_status; /* signals */ /** * AgsOscStatusController::get-status: * @osc_status_controller: the #AgsOscStatusController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * The ::get-status signal is emited during get status of status controller. * * Returns: the #AgsOscResponse * * Since: 3.0.0 */ osc_status_controller_signals[GET_STATUS] = g_signal_new("get-status", G_TYPE_FROM_CLASS(osc_status_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscStatusControllerClass, get_status), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_status_controller_init(AgsOscStatusController *osc_status_controller) { g_object_set(osc_status_controller, "context-path", "/status", NULL); } void ags_osc_status_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscStatusController *osc_status_controller; GRecMutex *osc_controller_mutex; osc_status_controller = AGS_OSC_STATUS_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_status_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_status_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscStatusController *osc_status_controller; GRecMutex *osc_controller_mutex; osc_status_controller = AGS_OSC_STATUS_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_status_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_status_controller_dispose(GObject *gobject) { AgsOscStatusController *osc_status_controller; osc_status_controller = AGS_OSC_STATUS_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_status_controller_parent_class)->dispose(gobject); } void ags_osc_status_controller_finalize(GObject *gobject) { AgsOscStatusController *osc_status_controller; osc_status_controller = AGS_OSC_STATUS_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_osc_status_controller_parent_class)->finalize(gobject); } gpointer ags_osc_status_controller_real_get_status(AgsOscStatusController *osc_status_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size) { AgsOscServer *osc_server; AgsOscResponse *osc_response; GList *start_response; gchar *type_tag; gchar *status; guchar *packet; guint real_packet_size; guint packet_size; guint length; gboolean success; start_response = NULL; osc_response = ags_osc_response_new(); start_response = g_list_prepend(start_response, osc_response); /* read type tag */ ags_osc_buffer_util_get_string(message + 8, &type_tag, NULL); success = (type_tag != NULL && !strncmp(type_tag, ",", 2)) ? TRUE: FALSE; if(!success){ ags_osc_response_set_flags(osc_response, AGS_OSC_RESPONSE_ERROR); g_object_set(osc_response, "error-message", AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST, NULL); if(type_tag != NULL){ free(type_tag); } return(start_response); } g_object_get(osc_status_controller, "osc-server", &osc_server, NULL); real_packet_size = 0; packet_size = 0; packet = (guchar *) malloc(AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); memset(packet, 0, AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE * sizeof(guchar)); g_object_set(osc_response, "packet", packet, "packet-size", packet_size, NULL); real_packet_size = AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE; /* message path */ packet_size = 4; ags_osc_buffer_util_put_string(packet + packet_size, "/status", -1); packet_size += 8; ags_osc_buffer_util_put_string(packet + packet_size, ",s", -1); /* status argument */ packet_size += 4; if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_RUNNING)){ status = "server up and running"; }else if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_STARTED)){ status = "server started"; }else if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_TERMINATING)){ status = "server terminating"; }else{ status = "server stopped"; } length = strlen(status); ags_osc_buffer_util_put_string(packet + packet_size, status, -1); packet_size += (4 * (guint) ceil((double) (length + 1) / 4.0)); /* packet size */ ags_osc_buffer_util_put_int32(packet, packet_size); free(type_tag); return(start_response); } /** * ags_osc_status_controller_get_status: * @osc_status_controller: the #AgsOscStatusController * @osc_connection: the #AgsOscConnection * @message: the message received * @message_size: the message size * * Get status. * * Returns: the #GList-struct containing #AgsOscResponse * * Since: 3.0.0 */ gpointer ags_osc_status_controller_get_status(AgsOscStatusController *osc_status_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_STATUS_CONTROLLER(osc_status_controller), NULL); g_object_ref((GObject *) osc_status_controller); g_signal_emit(G_OBJECT(osc_status_controller), osc_status_controller_signals[GET_STATUS], 0, osc_connection, message, message_size, &osc_response); g_object_unref((GObject *) osc_status_controller); return(osc_response); } /** * ags_osc_status_controller_new: * * Instantiate new #AgsOscStatusController * * Returns: the #AgsOscStatusController * * Since: 3.0.0 */ AgsOscStatusController* ags_osc_status_controller_new() { AgsOscStatusController *osc_status_controller; osc_status_controller = (AgsOscStatusController *) g_object_new(AGS_TYPE_OSC_STATUS_CONTROLLER, NULL); return(osc_status_controller); } gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_meter_controller.h0000644000175000017500000001131313607210263022647 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_METER_CONTROLLER_H__ #define __AGS_OSC_METER_CONTROLLER_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_METER_CONTROLLER (ags_osc_meter_controller_get_type()) #define AGS_OSC_METER_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_METER_CONTROLLER, AgsOscMeterController)) #define AGS_OSC_METER_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_METER_CONTROLLER, AgsOscMeterControllerClass)) #define AGS_IS_OSC_METER_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_METER_CONTROLLER)) #define AGS_IS_OSC_METER_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_METER_CONTROLLER)) #define AGS_OSC_METER_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_METER_CONTROLLER, AgsOscMeterControllerClass)) #define AGS_OSC_METER_CONTROLLER_DEFAULT_MONITOR_TIMEOUT (1.0 / 30.0) #define AGS_OSC_METER_CONTROLLER_MONITOR(ptr) ((AgsOscMeterControllerMonitor *)(ptr)) typedef struct _AgsOscMeterController AgsOscMeterController; typedef struct _AgsOscMeterControllerClass AgsOscMeterControllerClass; typedef struct _AgsOscMeterControllerMonitor AgsOscMeterControllerMonitor; typedef enum{ AGS_OSC_METER_CONTROLLER_MONITOR_STARTED = 1, AGS_OSC_METER_CONTROLLER_MONITOR_RUNNING = 1 << 1, AGS_OSC_METER_CONTROLLER_MONITOR_TERMINATING = 1 << 2, }AgsOscMeterControllerFlags; struct _AgsOscMeterController { AgsOscController osc_controller; guint flags; GList *monitor; }; struct _AgsOscMeterControllerClass { AgsOscControllerClass osc_controller; void (*start_monitor)(AgsOscMeterController *osc_meter_controller); void (*stop_monitor)(AgsOscMeterController *osc_meter_controller); gpointer (*monitor_meter)(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); }; struct _AgsOscMeterControllerMonitor { volatile gint ref_count; AgsOscConnection *osc_connection; gchar *path; AgsPort *port; }; GType ags_osc_meter_controller_get_type(); gboolean ags_osc_meter_controller_test_flags(AgsOscMeterController *osc_meter_controller, guint flags); void ags_osc_meter_controller_set_flags(AgsOscMeterController *osc_meter_controller, guint flags); void ags_osc_meter_controller_unset_flags(AgsOscMeterController *osc_meter_controller, guint flags); AgsOscMeterControllerMonitor* ags_osc_meter_controller_monitor_alloc(); void ags_osc_meter_controller_monitor_free(AgsOscMeterControllerMonitor *monitor); void ags_osc_meter_controller_monitor_ref(AgsOscMeterControllerMonitor *monitor); void ags_osc_meter_controller_monitor_unref(AgsOscMeterControllerMonitor *monitor); GList* ags_osc_meter_controller_monitor_find_path(GList *monitor, gchar *path); GList* ags_osc_meter_controller_monitor_find_port(GList *monitor, AgsPort *port); void ags_osc_meter_controller_add_monitor(AgsOscMeterController *osc_meter_controller, AgsOscMeterControllerMonitor *monitor); void ags_osc_meter_controller_remove_monitor(AgsOscMeterController *osc_meter_controller, AgsOscMeterControllerMonitor *monitor); gboolean ags_osc_meter_controller_contains_monitor(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, AgsPort *port); void ags_osc_meter_controller_start_monitor(AgsOscMeterController *osc_meter_controller); void ags_osc_meter_controller_stop_monitor(AgsOscMeterController *osc_meter_controller); gpointer ags_osc_meter_controller_monitor_meter(AgsOscMeterController *osc_meter_controller, AgsOscConnection *osc_connection, guchar *message, guint message_size); AgsOscMeterController* ags_osc_meter_controller_new(); G_END_DECLS #endif /*__AGS_OSC_METER_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/controller/ags_osc_front_controller.c0000644000175000017500000007154313620523727022700 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __APPLE__ #include #include #endif #include void ags_osc_front_controller_class_init(AgsOscFrontControllerClass *osc_front_controller); void ags_osc_front_controller_init(AgsOscFrontController *osc_front_controller); void ags_osc_front_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_front_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_front_controller_dispose(GObject *gobject); void ags_osc_front_controller_finalize(GObject *gobject); void* ags_osc_front_controller_delegate_thread(void *ptr); void ags_osc_front_controller_real_start_delegate(AgsOscFrontController *osc_front_controller); void ags_osc_front_controller_real_stop_delegate(AgsOscFrontController *osc_front_controller); gsize ags_osc_front_controller_read_bundle(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size, gsize offset); gsize ags_osc_front_controller_read_message(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size, gsize offset, gint32 tv_sec, gint32 tv_fraction, gboolean immediately); gpointer ags_osc_front_controller_real_do_request(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size); /** * SECTION:ags_osc_front_controller * @short_description: OSC front controller * @title: AgsOscFrontController * @section_id: * @include: ags/audio/osc/controller/ags_osc_front_controller.h * * The #AgsOscFrontController implements the OSC front controller. */ enum{ PROP_0, }; enum{ START_DELEGATE, STOP_DELEGATE, DO_REQUEST, LAST_SIGNAL, }; static gpointer ags_osc_front_controller_parent_class = NULL; static guint osc_front_controller_signals[LAST_SIGNAL]; GType ags_osc_front_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_front_controller = 0; static const GTypeInfo ags_osc_front_controller_info = { sizeof (AgsOscFrontControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_front_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscFrontController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_front_controller_init, }; ags_type_osc_front_controller = g_type_register_static(AGS_TYPE_OSC_CONTROLLER, "AgsOscFrontController", &ags_osc_front_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_front_controller); } return g_define_type_id__volatile; } void ags_osc_front_controller_class_init(AgsOscFrontControllerClass *osc_front_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_front_controller_parent_class = g_type_class_peek_parent(osc_front_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_front_controller; // gobject->set_property = ags_osc_front_controller_set_property; // gobject->get_property = ags_osc_front_controller_get_property; gobject->dispose = ags_osc_front_controller_dispose; gobject->finalize = ags_osc_front_controller_finalize; /* properties */ /* AgsOscFrontControllerClass */ osc_front_controller->start_delegate = ags_osc_front_controller_real_start_delegate; osc_front_controller->stop_delegate = ags_osc_front_controller_real_stop_delegate; osc_front_controller->do_request = ags_osc_front_controller_real_do_request; /* signals */ /** * AgsOscFrontController::start-delegate: * @osc_front_controller: the #AgsOscFrontController * * The ::start-delegate signal is emited during start of delegating messages. * * Since: 3.0.0 */ osc_front_controller_signals[START_DELEGATE] = g_signal_new("start-delegate", G_TYPE_FROM_CLASS(osc_front_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscFrontControllerClass, start_delegate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscFrontController::stop-delegate: * @osc_front_controller: the #AgsOscFrontController * * The ::stop-delegate signal is emited during stop of delegating messages. * * Since: 3.0.0 */ osc_front_controller_signals[STOP_DELEGATE] = g_signal_new("stop-delegate", G_TYPE_FROM_CLASS(osc_front_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscFrontControllerClass, stop_delegate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscFrontController::do-request: * @osc_front_controller: the #AgsOscFrontController * @osc_connection: the #AgsOscConnection * @packet: the packet received * @packet_size: the packet size * * The ::do-request signal is emited during do request of front controller. * * Since: 3.0.0 */ osc_front_controller_signals[DO_REQUEST] = g_signal_new("do-request", G_TYPE_FROM_CLASS(osc_front_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscFrontControllerClass, do_request), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64, G_TYPE_POINTER, 3, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_INT64); } void ags_osc_front_controller_init(AgsOscFrontController *osc_front_controller) { g_object_set(osc_front_controller, "context-path", "/", NULL); osc_front_controller->flags = 0; osc_front_controller->delegate_timeout = (struct timespec *) malloc(sizeof(struct timespec)); osc_front_controller->delegate_timeout = 0; g_atomic_int_set(&(osc_front_controller->do_reset), FALSE); g_mutex_init(&(osc_front_controller->delegate_mutex)); g_cond_init(&(osc_front_controller->delegate_cond)); osc_front_controller->delegate_thread = NULL; osc_front_controller->message = NULL; } void ags_osc_front_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscFrontController *osc_front_controller; GRecMutex *osc_controller_mutex; osc_front_controller = AGS_OSC_FRONT_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_front_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscFrontController *osc_front_controller; GRecMutex *osc_controller_mutex; osc_front_controller = AGS_OSC_FRONT_CONTROLLER(gobject); /* get osc controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_front_controller_dispose(GObject *gobject) { AgsOscFrontController *osc_front_controller; osc_front_controller = AGS_OSC_FRONT_CONTROLLER(gobject); if(osc_front_controller->message != NULL){ g_list_free_full(osc_front_controller->message, (GDestroyNotify) g_object_unref); osc_front_controller->message = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_front_controller_parent_class)->dispose(gobject); } void ags_osc_front_controller_finalize(GObject *gobject) { AgsOscFrontController *osc_front_controller; osc_front_controller = AGS_OSC_FRONT_CONTROLLER(gobject); if(osc_front_controller->message != NULL){ g_list_free_full(osc_front_controller->message, (GDestroyNotify) g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_osc_front_controller_parent_class)->finalize(gobject); } void* ags_osc_front_controller_delegate_thread(void *ptr) { AgsOscServer *osc_server; AgsOscFrontController *osc_front_controller; GList *start_controller, *controller; gint64 time_now, time_next; gint64 current_time; GRecMutex *osc_controller_mutex; osc_front_controller = AGS_OSC_FRONT_CONTROLLER(ptr); g_object_get(osc_front_controller, "osc-server", &osc_server, NULL); g_object_get(osc_server, "controller", &start_controller, NULL); /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); time_next = 0; ags_osc_front_controller_set_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_RUNNING); while(ags_osc_front_controller_test_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_RUNNING)){ GList *start_message, *message; GList *start_list, *list; g_mutex_lock(&(osc_front_controller->delegate_mutex)); time_now = g_get_monotonic_time(); osc_front_controller->delegate_timeout = time_now + (G_TIME_SPAN_SECOND / 30); while(!g_atomic_int_get(&(osc_front_controller->do_reset)) && ((time_now < time_next) && (time_now < osc_front_controller->delegate_timeout))){ g_cond_wait_until(&(osc_front_controller->delegate_cond), &(osc_front_controller->delegate_mutex), osc_front_controller->delegate_timeout); time_now = g_get_monotonic_time(); } g_atomic_int_set(&(osc_front_controller->do_reset), FALSE); g_mutex_unlock(&(osc_front_controller->delegate_mutex)); /* check delegate */ g_rec_mutex_lock(osc_controller_mutex); start_message = NULL; list = start_list = g_list_copy(osc_front_controller->message); while(list != NULL){ if(AGS_OSC_MESSAGE(list->data)->immediately){ start_message = g_list_prepend(start_message, list->data); ags_osc_front_controller_remove_message(osc_front_controller, list->data); }else{ current_time = AGS_OSC_MESSAGE(list->data)->tv_sec + AGS_OSC_MESSAGE(list->data)->tv_fraction / 4.294967296 * 1000.0; if(current_time < time_now){ start_message = g_list_prepend(start_message, list->data); ags_osc_front_controller_remove_message(osc_front_controller, list->data); }else{ break; } } list = list->next; } g_rec_mutex_unlock(osc_controller_mutex); g_list_free(start_list); message = start_message = g_list_reverse(start_message); while(message != NULL){ GList *start_osc_response, *osc_response; AgsOscMessage *current; gchar *path; ags_osc_buffer_util_get_string(AGS_OSC_MESSAGE(message->data)->message, &path, NULL); controller = start_controller; start_osc_response = NULL; while(controller != NULL){ gboolean success; GRecMutex *mutex; /* get OSC controller mutex */ mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(controller->data); /* match path */ g_rec_mutex_lock(mutex); success = !g_strcmp0(AGS_OSC_CONTROLLER(controller->data)->context_path, path); g_rec_mutex_unlock(mutex); if(success){ current = AGS_OSC_MESSAGE(message->data); /* delegate */ if(AGS_IS_OSC_ACTION_CONTROLLER(controller->data)){ start_osc_response = ags_osc_action_controller_run_action(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_CONFIG_CONTROLLER(controller->data)){ start_osc_response = ags_osc_config_controller_apply_config(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_INFO_CONTROLLER(controller->data)){ start_osc_response = ags_osc_info_controller_get_info(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_METER_CONTROLLER(controller->data)){ start_osc_response = ags_osc_meter_controller_monitor_meter(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_NODE_CONTROLLER(controller->data)){ start_osc_response = ags_osc_node_controller_get_data(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_RENEW_CONTROLLER(controller->data)){ start_osc_response = ags_osc_renew_controller_set_data(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_STATUS_CONTROLLER(controller->data)){ start_osc_response = ags_osc_status_controller_get_status(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_PLUGIN_CONTROLLER(controller->data)){ start_osc_response = ags_osc_plugin_controller_do_request(AGS_OSC_PLUGIN_CONTROLLER(controller->data), current->osc_connection, current->message, current->message_size); } break; } controller = controller->next; } /* write response */ osc_response = start_osc_response; while(osc_response != NULL){ ags_osc_connection_write_response(current->osc_connection, osc_response->data); osc_response = osc_response->next; } g_list_free_full(start_osc_response, g_object_unref); message = message->next; } /* free messages */ g_list_free_full(start_message, (GDestroyNotify) g_object_unref); /* next */ g_mutex_lock(&(osc_front_controller->delegate_mutex)); if(osc_front_controller->message != NULL){ time_next = AGS_OSC_MESSAGE(osc_front_controller->message)->tv_sec + AGS_OSC_MESSAGE(osc_front_controller->message)->tv_fraction / 4.294967296 * 1000.0; }else{ time_now = g_get_monotonic_time(); time_next = time_now + G_TIME_SPAN_SECOND / 30; } g_mutex_unlock(&(osc_front_controller->delegate_mutex)); } g_object_unref(osc_server); g_list_free_full(start_controller, g_object_unref); g_thread_exit(NULL); return(NULL); } /** * ags_osc_front_controller_test_flags: * @osc_front_controller: the #AgsOscFrontController * @flags: the flags * * Test @flags to be set on @osc_front_controller. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_front_controller_test_flags(AgsOscFrontController *osc_front_controller, guint flags) { gboolean retval; GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller)){ return(FALSE); } /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); /* test */ g_rec_mutex_lock(osc_controller_mutex); retval = (flags & (osc_front_controller->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(osc_controller_mutex); return(retval); } /** * ags_osc_front_controller_set_flags: * @osc_front_controller: the #AgsOscFrontController * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_front_controller_set_flags(AgsOscFrontController *osc_front_controller, guint flags) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller)){ return; } /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); /* set flags */ g_rec_mutex_lock(osc_controller_mutex); osc_front_controller->flags |= flags; g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_front_controller_unset_flags: * @osc_front_controller: the #AgsOscFrontController * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_front_controller_unset_flags(AgsOscFrontController *osc_front_controller, guint flags) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller)){ return; } /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); /* set flags */ g_rec_mutex_lock(osc_controller_mutex); osc_front_controller->flags &= (~flags); g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_front_controller_add_message: * @osc_front_controller: the #AgsOscFrontController * @message: the #AgsOscMessage * * Add @message to @osc_front_controller. * * Since: 3.0.0 */ void ags_osc_front_controller_add_message(AgsOscFrontController *osc_front_controller, GObject *message) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller) || message == NULL){ return; } /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); /* add */ g_rec_mutex_lock(osc_controller_mutex); if(g_list_find(osc_front_controller->message, message) == NULL){ osc_front_controller->message = g_list_insert_sorted(osc_front_controller->message, message, ags_osc_message_sort_func); g_object_ref(message); } g_rec_mutex_unlock(osc_controller_mutex); } /** * ags_osc_front_controller_remove_message: * @osc_front_controller: the #AgsOscFrontController * @message: the #AgsOscMessage * * Remove @message from @osc_front_controller. * * Since: 3.0.0 */ void ags_osc_front_controller_remove_message(AgsOscFrontController *osc_front_controller, GObject *message) { GRecMutex *osc_controller_mutex; if(!AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller) || message == NULL){ return; } /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); /* remove */ g_rec_mutex_lock(osc_controller_mutex); if(g_list_find(osc_front_controller->message, message) != NULL){ osc_front_controller->message = g_list_remove(osc_front_controller->message, message); g_object_unref(message); } g_rec_mutex_unlock(osc_controller_mutex); } void ags_osc_front_controller_real_start_delegate(AgsOscFrontController *osc_front_controller) { GRecMutex *osc_controller_mutex; /* get OSC front controller mutex */ osc_controller_mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(osc_front_controller); /* test if already started */ g_rec_mutex_lock(osc_controller_mutex); if(ags_osc_front_controller_test_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED)){ g_rec_mutex_unlock(osc_controller_mutex); return; } ags_osc_front_controller_set_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED); g_rec_mutex_unlock(osc_controller_mutex); /* create delegate thread */ osc_front_controller->delegate_thread = g_thread_new("Advanced Gtk+ Sequencer OSC Server - delegate thread", ags_osc_front_controller_delegate_thread, osc_front_controller); } /** * ags_osc_front_controller_start_delegate: * @osc_front_controller: the #AgsOscFrontController * * Start delegating. * * Since: 3.0.0 */ void ags_osc_front_controller_start_delegate(AgsOscFrontController *osc_front_controller) { g_return_if_fail(AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller)); g_object_ref((GObject *) osc_front_controller); g_signal_emit(G_OBJECT(osc_front_controller), osc_front_controller_signals[START_DELEGATE], 0); g_object_unref((GObject *) osc_front_controller); } void ags_osc_front_controller_real_stop_delegate(AgsOscFrontController *osc_front_controller) { if(!ags_osc_front_controller_test_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_RUNNING)){ return; } ags_osc_front_controller_set_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_TERMINATING); ags_osc_front_controller_unset_flags(osc_front_controller, AGS_OSC_FRONT_CONTROLLER_DELEGATE_RUNNING); /* join thread */ g_thread_join(osc_front_controller->delegate_thread); ags_osc_front_controller_unset_flags(osc_front_controller, (AGS_OSC_FRONT_CONTROLLER_DELEGATE_TERMINATING | AGS_OSC_FRONT_CONTROLLER_DELEGATE_STARTED)); } /** * ags_osc_front_controller_stop_delegate: * @osc_front_controller: the #AgsOscFrontController * * Stop delegating. * * Since: 3.0.0 */ void ags_osc_front_controller_stop_delegate(AgsOscFrontController *osc_front_controller) { g_return_if_fail(AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller)); g_object_ref((GObject *) osc_front_controller); g_signal_emit(G_OBJECT(osc_front_controller), osc_front_controller_signals[STOP_DELEGATE], 0); g_object_unref((GObject *) osc_front_controller); } gsize ags_osc_front_controller_read_bundle(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size, gsize offset) { gint32 tv_sec; gint32 tv_fraction; gboolean immediately; gsize read_count; gint32 length; read_count = 8; ags_osc_buffer_util_get_timetag(packet + offset + read_count, &(tv_sec), &(tv_fraction), &(immediately)); read_count += 8; for(; offset < packet_size;){ ags_osc_buffer_util_get_int32(packet + offset + read_count, &length); read_count += 4; if(!g_strcmp0(packet + offset + read_count, "#bundle")){ ags_osc_front_controller_read_bundle(osc_front_controller, osc_connection, packet, packet_size, offset + read_count); read_count += ((gsize) 4 * ceil((double) length / 4.0)); }else if(packet[offset + read_count] == '/'){ ags_osc_front_controller_read_message(osc_front_controller, osc_connection, packet, packet_size, offset + read_count, tv_sec, tv_fraction, immediately); read_count += ((gsize) 4 * ceil((double) length / 4.0)); }else{ read_count += 1; g_warning("malformed data"); } } return(read_count); } gsize ags_osc_front_controller_read_message(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size, gsize offset, gint32 tv_sec, gint32 tv_fraction, gboolean immediately) { AgsOscMessage *osc_message; guchar *message; gchar *address_pattern; gchar *type_tag; gsize address_pattern_length; gsize type_tag_length; gsize data_length; gsize read_count; guint i; read_count = 0; ags_osc_buffer_util_get_string(packet + offset, &address_pattern, &address_pattern_length); if(address_pattern == NULL){ return(0); } read_count += (4 * (gsize) ceil((double) (address_pattern_length + 1) / 4.0)); free(address_pattern); type_tag = NULL; if(packet_size > offset + read_count){ if(packet[offset + read_count] == ','){ ags_osc_buffer_util_get_string(packet + offset + read_count, &type_tag, &type_tag_length); read_count += (4 * (gsize) ceil((double) (type_tag_length + 1) / 4.0)); } } data_length = 0; if(type_tag != NULL){ for(i = 1; i < type_tag_length; i++){ switch(type_tag[i]){ case AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE: case AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE: case AGS_OSC_UTIL_TYPE_TAG_STRING_NIL: case AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE: case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START: case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR: case AGS_OSC_UTIL_TYPE_TAG_STRING_INT32: case AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT: case AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA: case AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI: { data_length += 4; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_INT64: case AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE: case AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG: { data_length += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL: case AGS_OSC_UTIL_TYPE_TAG_STRING_STRING: { gsize length; length = strlen(packet + offset + read_count + data_length); data_length += (4 * (gsize) ceil((double) (length + 1) / 4.0)); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB: { gint32 data_size; ags_osc_buffer_util_get_int32(packet + offset + read_count + data_length, &data_size); data_length += data_size; } break; } } free(type_tag); } read_count += (4 * (gsize) ceil((double) data_length / 4.0)); osc_message = ags_osc_message_new(); message = (guchar *) malloc(read_count * sizeof(guchar)); memcpy(message, packet + offset, read_count * sizeof(guchar)); g_object_set(osc_message, "osc-connection", osc_connection, "tv-sec", tv_sec, "tv-fraction", tv_fraction, "immediately", immediately, "message-size", read_count, "message", message, NULL); ags_osc_front_controller_add_message(osc_front_controller, osc_message); return(read_count); } gpointer ags_osc_front_controller_real_do_request(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size) { gint32 tv_sec; gint32 tv_fraction; gboolean immediately; gsize offset; if(packet == NULL || packet_size < 0){ return(NULL); } tv_sec = 0; tv_fraction = 0; immediately = TRUE; for(offset = 4; offset < packet_size;){ gsize read_count; #ifdef AGS_DEBUG g_message("%d %d", offset, packet_size); g_message("%x[%c]", packet[offset], packet[offset]); #endif read_count = 0; if(!g_strcmp0(packet + offset, "#bundle")){ read_count = ags_osc_front_controller_read_bundle(osc_front_controller, osc_connection, packet, packet_size, offset); }else if(packet[offset] == '/'){ read_count = ags_osc_front_controller_read_message(osc_front_controller, osc_connection, packet, packet_size, offset, 0, 0, TRUE); } if(read_count > 0){ offset += ((gsize) 4 * ceil((double) read_count / 4.0)); }else{ offset += 1; g_warning("malformed data"); } } return(NULL); } /** * ags_osc_front_controller_write_response: * @osc_front_controller: the #AgsOscFrontController * @osc_connection: the #AgsOscConnection * @packet: the packet received * @packet_size: the packet size * * Do request. * * Returns: %NULL * * Since: 3.0.0 */ gpointer ags_osc_front_controller_do_request(AgsOscFrontController *osc_front_controller, AgsOscConnection *osc_connection, guchar *packet, gsize packet_size) { gpointer osc_response; g_return_val_if_fail(AGS_IS_OSC_FRONT_CONTROLLER(osc_front_controller), NULL); g_object_ref((GObject *) osc_front_controller); g_object_ref((GObject *) osc_connection); g_signal_emit(G_OBJECT(osc_front_controller), osc_front_controller_signals[DO_REQUEST], 0, osc_connection, packet, (gint64) packet_size, &osc_response); g_object_unref((GObject *) osc_connection); g_object_unref((GObject *) osc_front_controller); return(osc_response); } /** * ags_osc_front_controller_new: * * Instantiate new #AgsOscFrontController * * Returns: the #AgsOscFrontController * * Since: 3.0.0 */ AgsOscFrontController* ags_osc_front_controller_new() { AgsOscFrontController *osc_front_controller; osc_front_controller = (AgsOscFrontController *) g_object_new(AGS_TYPE_OSC_FRONT_CONTROLLER, NULL); return(osc_front_controller); } gsequencer-3.1.3/ags/audio/osc/ags_osc_parser.c0000644000175000017500000006733213607210263016410 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_osc_parser_class_init(AgsOscParserClass *osc_parser); void ags_osc_parser_init(AgsOscParser *osc_parser); void ags_osc_parser_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_parser_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_parser_finalize(GObject *gobject); int ags_osc_parser_real_osc_getc(AgsOscParser *osc_parser); void ags_osc_parser_real_on_error(AgsOscParser *osc_parser, GError **error); xmlDoc* ags_osc_parser_real_parse_full(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_real_parse_bytes(AgsOscParser *osc_parser, unsigned char *osc_buffer, guint buffer_length); xmlNode* ags_osc_parser_real_packet(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_real_bundle(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_real_message(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_real_value(AgsOscParser *osc_parser, guint v_type); /** * SECTION:ags_osc_parser * @short_description: the OSC parser * @title: AgsOscParser * @section_id: * @include: ags/audio/osc/ags_osc_parser.h * * #AgsOscParser reads your osc parsers. */ enum{ PROP_0, }; enum{ OSC_GETC, ON_ERROR, PARSE_FULL, PARSE_BYTES, PACKET, BUNDLE, MESSAGE, VALUE, LAST_SIGNAL, }; static gpointer ags_osc_parser_parent_class = NULL; static guint osc_parser_signals[LAST_SIGNAL]; GType ags_osc_parser_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_parser = 0; static const GTypeInfo ags_osc_parser_info = { sizeof (AgsOscParserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_parser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscParser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_parser_init, }; ags_type_osc_parser = g_type_register_static(G_TYPE_OBJECT, "AgsOscParser", &ags_osc_parser_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_parser); } return g_define_type_id__volatile; } void ags_osc_parser_class_init(AgsOscParserClass *osc_parser) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_parser_parent_class = g_type_class_peek_parent(osc_parser); /* GObjectClass */ gobject = (GObjectClass *) osc_parser; gobject->set_property = ags_osc_parser_set_property; gobject->get_property = ags_osc_parser_get_property; gobject->finalize = ags_osc_parser_finalize; /* AgsOscParser */ osc_parser->osc_getc = ags_osc_parser_real_osc_getc; osc_parser->on_error = ags_osc_parser_real_on_error; osc_parser->parse_full = ags_osc_parser_real_parse_full; osc_parser->parse_bytes = ags_osc_parser_real_parse_bytes; osc_parser->packet = ags_osc_parser_real_packet; osc_parser->bundle = ags_osc_parser_real_bundle; osc_parser->packet = ags_osc_parser_real_packet; osc_parser->value = ags_osc_parser_real_value; /* signals */ /** * AgsOscParser::osc-getc: * @osc_parser: the #AgsOscParser * * The ::osc-getc signal is emited during parsing of event. * * Returns: The character read * * Since: 3.0.0 */ osc_parser_signals[OSC_GETC] = g_signal_new("osc-getc", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, osc_getc), NULL, NULL, ags_cclosure_marshal_INT__VOID, G_TYPE_INT, 0); /** * AgsOscParser::on-error: * @osc_parser: the #AgsOscParser * @error: the return location of #GError * * The ::on-error signal is emited as error occurs. * * Since: 3.0.0 */ osc_parser_signals[ON_ERROR] = g_signal_new("on-error", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, on_error), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsOscParser::parse-full: * @osc_parser: the #AgsOscParser * * The ::parse-full signal is emited during parsing of osc file. * * Returns: The XML doc * * Since: 3.0.0 */ osc_parser_signals[PARSE_FULL] = g_signal_new("parse-full", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, parse_full), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsOscParser::parse-bytes: * @osc_parser: the #AgsOscParser * @buffer: the OSC data * @buffer_length: the buffer's length * * The ::parse-bytes signal is emited during parsing of bytes. * * Returns: The XML node representing the event * * Since: 3.0.0 */ osc_parser_signals[PARSE_BYTES] = g_signal_new("parse-bytes", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, parse_bytes), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER_UINT, G_TYPE_POINTER, 2, G_TYPE_POINTER, G_TYPE_UINT); /** * AgsOscParser::packet: * @osc_parser: the #AgsOscParser * * The ::packet signal is emited during parsing. * * Returns: The XML node representing packet * * Since: 3.0.0 */ osc_parser_signals[PACKET] = g_signal_new("packet", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, packet), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsOscParser::bundle: * @osc_parser: the #AgsOscParser * * The ::bundle signal is emited during parsing. * * Returns: The XML node representing bundle * * Since: 3.0.0 */ osc_parser_signals[BUNDLE] = g_signal_new("bundle", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, bundle), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsOscParser::message: * @osc_parser: the #AgsOscParser * * The ::message signal is emited during parsing. * * Returns: The XML node representing message * * Since: 3.0.0 */ osc_parser_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, message), NULL, NULL, ags_cclosure_marshal_POINTER__VOID, G_TYPE_POINTER, 0); /** * AgsOscParser::value: * @osc_parser: the #AgsOscParser * @v_type: value type * * The ::value signal is emited during parsing. * * Returns: The XML node representing value * * Since: 3.0.0 */ osc_parser_signals[VALUE] = g_signal_new("value", G_TYPE_FROM_CLASS(osc_parser), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscParserClass, value), NULL, NULL, ags_cclosure_marshal_POINTER__UINT, G_TYPE_POINTER, 1, G_TYPE_UINT); } void ags_osc_parser_init(AgsOscParser *osc_parser) { osc_parser->flags = 0; /* osc parser mutex */ g_rec_mutex_init(&(osc_parser->obj_mutex)); osc_parser->buffer = NULL; osc_parser->file_length = 0; osc_parser->offset = 0; osc_parser->start_offset = 0; osc_parser->packet_size = 0; osc_parser->doc = NULL; } void ags_osc_parser_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscParser *osc_parser; GRecMutex *osc_parser_mutex; osc_parser = AGS_OSC_PARSER(gobject); /* get osc parser mutex */ osc_parser_mutex = AGS_OSC_PARSER_GET_OBJ_MUTEX(osc_parser); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_parser_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscParser *osc_parser; GRecMutex *osc_parser_mutex; osc_parser = AGS_OSC_PARSER(gobject); /* get osc parser mutex */ osc_parser_mutex = AGS_OSC_PARSER_GET_OBJ_MUTEX(osc_parser); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_parser_finalize(GObject *gobject) { AgsOscParser *osc_parser; osc_parser = (AgsOscParser *) gobject; /* call parent */ G_OBJECT_CLASS(ags_osc_parser_parent_class)->finalize(gobject); } /** * ags_osc_parser_read_gint32: * @osc_parser: the #AgsOscParser * * Read 32 bit integer. * * Returns: the gint32 read * * Since: 3.0.0 */ gint32 ags_osc_parser_read_gint32(AgsOscParser *osc_parser) { char str[4]; gint32 value; str[0] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[1] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[2] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[3] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); value = (str[0] & 0xff); value = (value<<8) + (str[1] & 0xff); value = (value<<8) + (str[2] & 0xff); value = (value<<8) + (str[3] & 0xff); return(value); } /** * ags_osc_parser_read_gint64: * @osc_parser: the #AgsOscParser * * Read 64 bit integer. * * Returns: the gint64 read * * Since: 3.0.0 */ gint64 ags_osc_parser_read_gint64(AgsOscParser *osc_parser) { char str[8]; gint64 value; str[0] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[1] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[2] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[3] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[4] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[5] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[6] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[7] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); value = (str[0] & 0xff); value = (value << 8) + (str[1] & 0xff); value = (value << 8) + (str[2] & 0xff); value = (value << 8) + (str[3] & 0xff); value = (value << 8) + (str[4] & 0xff); value = (value << 8) + (str[5] & 0xff); value = (value << 8) + (str[6] & 0xff); value = (value << 8) + (str[7] & 0xff); return(value); } /** * ags_osc_parser_read_gfloat: * @osc_parser: the #AgsOscParser * * Read floating point value. * * Returns: the gfloat read * * Since: 3.0.0 */ gfloat ags_osc_parser_read_gfloat(AgsOscParser *osc_parser) { char str[4]; union{ guint32 val; GFloatIEEE754 ieee_float; }data; str[0] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[1] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[2] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[3] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); data.val = (str[0] & 0xff); data.val = (data.val<<8) + (str[1] & 0xff); data.val = (data.val<<8) + (str[2] & 0xff); data.val = (data.val<<8) + (str[3] & 0xff); return(data.ieee_float.v_float); } /** * ags_osc_parser_read_gdouble: * @osc_parser: the #AgsOscParser * * Read double precision floating point value. * * Returns: the gdouble read * * Since: 3.0.0 */ gdouble ags_osc_parser_read_gdouble(AgsOscParser *osc_parser) { char str[8]; union{ guint64 val; GDoubleIEEE754 ieee_double; }data; str[0] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[1] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[2] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[3] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[4] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[5] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[6] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[7] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); data.val = (str[0] & 0xff); data.val = (data.val << 8) + (str[1] & 0xff); data.val = (data.val << 8) + (str[2] & 0xff); data.val = (data.val << 8) + (str[3] & 0xff); data.val = (data.val << 8) + (str[4] & 0xff); data.val = (data.val << 8) + (str[5] & 0xff); data.val = (data.val << 8) + (str[6] & 0xff); data.val = (data.val << 8) + (str[7] & 0xff); return(data.ieee_double.v_double); } /** * ags_osc_parser_read_text: * @osc_parser: the #AgsOscParser * @length: the length * * Read text. * * Returns: the text read as string * * Since: 3.0.0 */ gchar* ags_osc_parser_read_text(AgsOscParser *osc_parser, gint length) { gchar text[AGS_OSC_PARSER_MAX_TEXT_LENGTH + 1]; gchar c; guint i; memset(text, 0, AGS_OSC_PARSER_MAX_TEXT_LENGTH * sizeof(char)); i = 0; while((length <= 0 || i < length) && (AGS_OSC_PARSER_EOF & (osc_parser->flags)) == 0 && i < AGS_OSC_PARSER_MAX_TEXT_LENGTH){ (c = (char) 0xff & (ags_osc_parser_osc_getc(osc_parser))); if(c == '\0'){ break; } text[i] = c; i++; } text[i] = '\0'; return(g_strdup(text)); } int ags_osc_parser_real_osc_getc(AgsOscParser *osc_parser) { int c; if(osc_parser->offset >= osc_parser->file_length){ osc_parser->flags |= AGS_OSC_PARSER_EOF; return(-1); } c = (int) osc_parser->buffer[osc_parser->offset]; osc_parser->offset += 1; return(c); } /** * ags_osc_parser_osc_getc: * @osc_parser: the #AgsOscParser * * Read byte. * * Returns: the byte read * * Since: 3.0.0 */ int ags_osc_parser_osc_getc(AgsOscParser *osc_parser) { int c; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), '\0'); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[OSC_GETC], 0, &c); g_object_unref((GObject *) osc_parser); return(c); } void ags_osc_parser_real_on_error(AgsOscParser *osc_parser, GError **error) { //TODO:JK: implement me } /** * ags_osc_parser_on_error: * @osc_parser: the #AgsOscParser * @error: the #GError-struct return location * * On error event. * * Since: 3.0.0 */ void ags_osc_parser_on_error(AgsOscParser *osc_parser, GError **error) { g_return_if_fail(AGS_IS_OSC_PARSER(osc_parser)); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[ON_ERROR], 0, error); g_object_unref((GObject *) osc_parser); } xmlDoc* ags_osc_parser_real_parse_full(AgsOscParser *osc_parser) { xmlDoc *doc; xmlNode *root_node; xmlNode *packets_node; xmlNode *current; /* create xmlDoc and set root node */ osc_parser->doc = doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "osc"); xmlDocSetRootElement(doc, root_node); /* create packets node */ packets_node = xmlNewNode(NULL, "osc-packets"); /* parse packets */ xmlAddChild(root_node, packets_node); osc_parser->offset = 0; while(((AGS_OSC_PARSER_EOF & (osc_parser->flags))) == 0){ current = ags_osc_parser_packet(osc_parser); if(current != NULL){ xmlAddChild(packets_node, current); #ifdef AGS_DEBUG g_message("parsed packet"); #endif }else{ g_warning("skipped input"); } } return(doc); } /** * ags_osc_parser_parse_full: * @osc_parser: the #AgsOscParser * * Parse full document. * * Returns: (transfer none): the parsed XML doc * * Since: 3.0.0 */ xmlDoc* ags_osc_parser_parse_full(AgsOscParser *osc_parser) { xmlDoc *doc; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), NULL); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[PARSE_FULL], 0, &doc); g_object_unref((GObject *) osc_parser); return(doc); } xmlNode* ags_osc_parser_real_parse_bytes(AgsOscParser *osc_parser, unsigned char *osc_buffer, guint buffer_length) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } /** * ags_osc_parser_parse_bytes: * @osc_parser: the #AgsOscParser * @osc_buffer: the data buffer * @buffer_length: the length of data buffer * * Parse bytes. * * Returns: (transfer none): the parsed XML node * * Since: 3.0.0 */ xmlNode* ags_osc_parser_parse_bytes(AgsOscParser *osc_parser, unsigned char *osc_buffer, guint buffer_length) { xmlNode *node; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), NULL); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[PARSE_BYTES], 0, &node); g_object_unref((GObject *) osc_parser); return(node); } xmlNode* ags_osc_parser_real_packet(AgsOscParser *osc_parser) { xmlNode *node, *current; gsize start_offset; gint32 packet_size; gchar current_byte; node = xmlNewNode(NULL, "osc-packet"); packet_size = osc_parser->packet_size = ags_osc_parser_read_gint32(osc_parser); xmlNewProp(node, "packet-size", g_strdup_printf("%u", packet_size)); current_byte = ags_osc_parser_osc_getc(osc_parser); start_offset = osc_parser->start_offset = osc_parser->offset; while(osc_parser->offset < start_offset + packet_size){ if(current_byte == '#'){ current = ags_osc_parser_bundle(osc_parser); }else if(current_byte == '/'){ current = ags_osc_parser_message(osc_parser); }else{ current = NULL; g_warning("failed to read bundle or message"); } if(current != NULL){ xmlAddChild(node, current); } } return(node); } /** * ags_osc_parser_packet: * @osc_parser: the #AgsOscParser * * Parse OSC packet. * * Returns: (transfer none): the parsed XML node * * Since: 3.0.0 */ xmlNode* ags_osc_parser_packet(AgsOscParser *osc_parser) { xmlNode *node; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), NULL); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[PACKET], 0, &node); g_object_unref((GObject *) osc_parser); return(node); } xmlNode* ags_osc_parser_real_bundle(AgsOscParser *osc_parser) { xmlNode *node, *current; gint32 tv_secs; gint32 tv_fraction; gboolean immediately; guint i; gchar current_byte; static gchar bundle[] = "#bundle"; for(i = 0; i < 7; i++){ gchar c; c = ags_osc_parser_osc_getc(osc_parser); if(c != bundle[i + 1]){ g_warning("bad byte"); return(NULL); } } node = xmlNewNode(NULL, "osc-bundle"); /* read time tag */ tv_secs = ags_osc_parser_read_gint32(osc_parser); tv_fraction = ags_osc_parser_read_gint32(osc_parser); immediately = FALSE; if((0x1 & (tv_fraction)) != 0){ immediately = TRUE; } /* add prop */ xmlNewProp(node, "tv-secs", g_strdup_printf("%u", tv_secs)); xmlNewProp(node, "tv-fraction", g_strdup_printf("%u", tv_fraction)); xmlNewProp(node, "immediately", g_strdup_printf("%s", ((immediately) ? "true": "false"))); while(osc_parser->offset < osc_parser->start_offset + osc_parser->packet_size){ current_byte = ags_osc_parser_osc_getc(osc_parser); if(current_byte == '#'){ current = ags_osc_parser_bundle(osc_parser); }else if(current_byte == '/'){ current = ags_osc_parser_message(osc_parser); }else{ current = NULL; g_warning("failed to read bundle or message"); } if(current != NULL){ xmlAddChild(node, current); } } return(node); } /** * ags_osc_parser_bundle: * @osc_parser: the #AgsOscParser * * Parse OSC bundle. * * Returns: (transfer none): the parsed XML node * * Since: 3.0.0 */ xmlNode* ags_osc_parser_bundle(AgsOscParser *osc_parser) { xmlNode *node; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), NULL); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[BUNDLE], 0, &node); g_object_unref((GObject *) osc_parser); return(node); } xmlNode* ags_osc_parser_real_message(AgsOscParser *osc_parser) { xmlNode *node, *current; gchar *address_pattern; gchar *type_tag; gchar *str; gchar current_byte; node = xmlNewNode(NULL, "osc-message"); str = ags_osc_parser_read_text(osc_parser, -1); address_pattern = g_strdup_printf("/%s", str); g_free(str); xmlNewProp(node, "address-pattern", address_pattern); current_byte = ags_osc_parser_osc_getc(osc_parser); if(current_byte != ','){ unsigned char *blob; char str[4]; gint32 value; guint i; /* no type tag - provide blob */ str[0] = (char) 0xff & current_byte; str[1] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[2] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); str[3] = (char) 0xff & ags_osc_parser_osc_getc(osc_parser); value = (str[0] & 0xff); value = (value<<8) + (str[1] & 0xff); value = (value<<8) + (str[2] & 0xff); value = (value<<8) + (str[3] & 0xff); current = xmlNewNode(NULL, "osc-value"); blob = (unsigned char *) malloc(value * sizeof(unsigned char)); for(i = 0; i < value; i++){ blob[i] = ags_osc_parser_osc_getc(osc_parser); } xmlNodeSetContent(current, g_base64_encode(blob, value)); free(blob); xmlAddChild(node, current); }else{ gchar *iter; /* has got type tag */ str = ags_osc_parser_read_text(osc_parser, -1); type_tag = g_strdup_printf(",%s", str); g_free(str); xmlNewProp(node, "type-tag", type_tag); for(iter = type_tag + 1; iter[0] != '\0'; iter++){ switch(iter[0]){ case AGS_OSC_UTIL_TYPE_TAG_STRING_INT32: case AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT: case AGS_OSC_UTIL_TYPE_TAG_STRING_STRING: case AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB: case AGS_OSC_UTIL_TYPE_TAG_STRING_INT64: case AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG: case AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE: case AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL: case AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR: case AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA: case AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI: { current = ags_osc_parser_value(osc_parser, iter[0]); if(current != NULL){ xmlAddChild(node, current); } } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE: case AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE: case AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE: case AGS_OSC_UTIL_TYPE_TAG_STRING_NIL: case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START: case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END: break; default: { g_warning("unknown type"); } } } } return(node); } /** * ags_osc_parser_message: * @osc_parser: the #AgsOscParser * * Parse OSC message. * * Returns: (transfer none): the parsed XML node * * Since: 3.0.0 */ xmlNode* ags_osc_parser_message(AgsOscParser *osc_parser) { xmlNode *node; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), NULL); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[MESSAGE], 0, &node); g_object_unref((GObject *) osc_parser); return(node); } xmlNode* ags_osc_parser_real_value(AgsOscParser *osc_parser, guint v_type) { xmlNode *node; node = xmlNewNode(NULL, "osc-value"); switch(v_type){ case AGS_OSC_UTIL_TYPE_TAG_STRING_INT32: { xmlNewProp(node, "int32", g_strdup_printf("%d", ags_osc_parser_read_gint32(osc_parser))); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT: { xmlNewProp(node, "float", g_strdup_printf("%f", ags_osc_parser_read_gfloat(osc_parser))); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_STRING: { xmlNewProp(node, "text", ags_osc_parser_read_text(osc_parser, -1)); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB: { unsigned char *blob; gint32 data_size; guint i; data_size = ags_osc_parser_read_gint32(osc_parser); blob = (unsigned char *) malloc(data_size * sizeof(unsigned char)); for(i = 0; i < data_size; i++){ blob[i] = ags_osc_parser_osc_getc(osc_parser); } xmlNodeSetContent(node, g_base64_encode(blob, data_size)); free(blob); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_INT64: { xmlNewProp(node, "int64", g_strdup_printf("%ld", ags_osc_parser_read_gint64(osc_parser))); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG: { gint32 tv_secs; gint32 tv_fraction; gboolean immediately; tv_secs = ags_osc_parser_read_gint32(osc_parser); tv_fraction = ags_osc_parser_read_gint32(osc_parser); immediately = (0x1 & (tv_fraction)) ? TRUE: FALSE; xmlNewProp(node, "tv-secs", g_strdup_printf("%d", tv_secs)); xmlNewProp(node, "tv-fraction", g_strdup_printf("%d", tv_fraction)); xmlNewProp(node, "immediately", g_strdup_printf("%s", ((immediately) ? "true": "false"))); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE: { xmlNewProp(node, "double", g_strdup_printf("%f", ags_osc_parser_read_gdouble(osc_parser))); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL: { xmlNewProp(node, "symbol", ags_osc_parser_read_text(osc_parser, -1)); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR: { gint32 c; c = ags_osc_parser_read_gint32(osc_parser); xmlNewProp(node, "char", g_strdup_printf("%c", c)); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA: { guint8 r, g, b, a; r = 0xff & (ags_osc_parser_osc_getc(osc_parser)); g = 0xff & (ags_osc_parser_osc_getc(osc_parser)); b = 0xff & (ags_osc_parser_osc_getc(osc_parser)); a = 0xff & (ags_osc_parser_osc_getc(osc_parser)); xmlNewProp(node, "red", g_strdup_printf("%u", r)); xmlNewProp(node, "green", g_strdup_printf("%u", g)); xmlNewProp(node, "blue", g_strdup_printf("%u", b)); xmlNewProp(node, "alpha", g_strdup_printf("%u", a)); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI: { guint8 port; guint8 status_byte; guint8 data0, data1; port = 0xff & (ags_osc_parser_osc_getc(osc_parser)); status_byte = 0xff & (ags_osc_parser_osc_getc(osc_parser)); data0 = 0xff & (ags_osc_parser_osc_getc(osc_parser)); data1 = 0xff & (ags_osc_parser_osc_getc(osc_parser)); xmlNewProp(node, "port", g_strdup_printf("%u", port)); xmlNewProp(node, "status-byte", g_strdup_printf("%u", status_byte)); xmlNewProp(node, "data0", g_strdup_printf("%u", data0)); xmlNewProp(node, "data1", g_strdup_printf("%u", data1)); } break; } return(node); } /** * ags_osc_parser_value: * @osc_parser: the #AgsOscParser * @v_type: value type * * Parse OSC value. * * Returns: (transfer none): the parsed XML node * * Since: 3.0.0 */ xmlNode* ags_osc_parser_value(AgsOscParser *osc_parser, guint v_type) { xmlNode *node; g_return_val_if_fail(AGS_IS_OSC_PARSER(osc_parser), NULL); g_object_ref((GObject *) osc_parser); g_signal_emit(G_OBJECT(osc_parser), osc_parser_signals[VALUE], 0, v_type, &node); g_object_unref((GObject *) osc_parser); return(node); } /** * ags_osc_parser_new: * * Creates a new instance of #AgsOscParser * * Returns: the new #AgsOscParser * * Since: 3.0.0 */ AgsOscParser* ags_osc_parser_new() { AgsOscParser *osc_parser; osc_parser = (AgsOscParser *) g_object_new(AGS_TYPE_OSC_PARSER, NULL); return(osc_parser); } gsequencer-3.1.3/ags/audio/osc/ags_osc_message.h0000644000175000017500000000437513607210263016543 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_MESSAGE_H__ #define __AGS_OSC_MESSAGE_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_MESSAGE (ags_osc_message_get_type ()) #define AGS_OSC_MESSAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_MESSAGE, AgsOscMessage)) #define AGS_OSC_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_MESSAGE, AgsOscMessageClass)) #define AGS_IS_OSC_MESSAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_MESSAGE)) #define AGS_IS_OSC_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_MESSAGE)) #define AGS_OSC_MESSAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_MESSAGE, AgsOscMessageClass)) #define AGS_OSC_MESSAGE_GET_OBJ_MUTEX(obj) (&(((AgsOscMessage *) obj)->obj_mutex)) typedef struct _AgsOscMessage AgsOscMessage; typedef struct _AgsOscMessageClass AgsOscMessageClass; struct _AgsOscMessage { GObject gobject; GRecMutex obj_mutex; AgsOscConnection *osc_connection; gint32 tv_sec; gint32 tv_fraction; gboolean immediately; guint message_size; guchar *message; }; struct _AgsOscMessageClass { GObjectClass gobject; }; GType ags_osc_message_get_type(void); gint ags_osc_message_sort_func(gconstpointer a, gconstpointer b); /* instance */ AgsOscMessage* ags_osc_message_new(); G_END_DECLS #endif /*__AGS_OSC_MESSAGE_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_client.h0000644000175000017500000001005313607210263016363 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_CLIENT_H__ #define __AGS_OSC_CLIENT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_CLIENT (ags_osc_client_get_type ()) #define AGS_OSC_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_CLIENT, AgsOscClient)) #define AGS_OSC_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_CLIENT, AgsOscClientClass)) #define AGS_IS_OSC_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_CLIENT)) #define AGS_IS_OSC_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_CLIENT)) #define AGS_OSC_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_CLIENT, AgsOscClientClass)) #define AGS_OSC_CLIENT_GET_OBJ_MUTEX(obj) (&(((AgsOscClient *) obj)->obj_mutex)) #define AGS_OSC_CLIENT_DEFAULT_MAX_ADDRESS_LENGTH (2048) #define AGS_OSC_CLIENT_DEFAULT_SERVER_PORT (9000) #define AGS_OSC_CLIENT_DEFAULT_DOMAIN "localhost" #define AGS_OSC_CLIENT_DEFAULT_INET4_ADDRESS "127.0.0.1" #define AGS_OSC_CLIENT_DEFAULT_INET6_ADDRESS "::1" #define AGS_OSC_CLIENT_DEFAULT_MAX_RETRY (16) #define AGS_OSC_CLIENT_CHUNK_SIZE (131072) #define AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH (256) typedef struct _AgsOscClient AgsOscClient; typedef struct _AgsOscClientClass AgsOscClientClass; /** * AgsOscClientFlags: * @AGS_OSC_CLIENT_INET4: use IPv4 socket * @AGS_OSC_CLIENT_INET6: use IPv6 socket * @AGS_OSC_CLIENT_UDP: use UDP transport protocol * @AGS_OSC_CLIENT_TCP: used TCP transport protocol * * Enum values to configure OSC client. */ typedef enum{ AGS_OSC_CLIENT_INET4 = 1, AGS_OSC_CLIENT_INET6 = 1 << 1, AGS_OSC_CLIENT_UDP = 1 << 2, AGS_OSC_CLIENT_TCP = 1 << 3, }AgsOscClientFlags; struct _AgsOscClient { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *ip4; gchar *ip6; gchar *domain; guint server_port; int ip4_fd; int ip6_fd; GSocket *ip4_socket; GSocket *ip6_socket; GSocketAddress *ip4_address; GSocketAddress *ip6_address; guint max_retry_count; struct timespec *retry_delay; struct timespec *start_time; unsigned char *cache_data; guint cache_data_length; unsigned char *buffer; guint allocated_buffer_size; guint read_count; gboolean has_valid_data; struct timespec *timeout_delay; }; struct _AgsOscClientClass { GObjectClass gobject; void (*resolve)(AgsOscClient *osc_client); void (*connect)(AgsOscClient *osc_client); unsigned char* (*read_bytes)(AgsOscClient *osc_client, guint *data_length); gboolean (*write_bytes)(AgsOscClient *osc_client, guchar *data, guint data_length); }; GType ags_osc_client_get_type(void); gboolean ags_osc_client_test_flags(AgsOscClient *osc_client, guint flags); void ags_osc_client_set_flags(AgsOscClient *osc_client, guint flags); void ags_osc_client_unset_flags(AgsOscClient *osc_client, guint flags); void ags_osc_client_resolve(AgsOscClient *osc_client); void ags_osc_client_connect(AgsOscClient *osc_client); unsigned char* ags_osc_client_read_bytes(AgsOscClient *osc_client, guint *data_length); gboolean ags_osc_client_write_bytes(AgsOscClient *osc_client, guchar *data, guint data_length); AgsOscClient* ags_osc_client_new(); G_END_DECLS #endif /*__AGS_OSC_CLIENT_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_util.h0000644000175000017500000000521013607210263016061 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_UTIL_H__ #define __AGS_OSC_UTIL_H__ #include #include #include G_BEGIN_DECLS #define AGS_OSC_UTIL_TYPE_TAG_STRING_INT32 'i' #define AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT 'f' #define AGS_OSC_UTIL_TYPE_TAG_STRING_STRING 's' #define AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB 'b' #define AGS_OSC_UTIL_TYPE_TAG_STRING_INT64 'h' #define AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG 't' #define AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE 'd' #define AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL 'S' #define AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR 'c' #define AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA 'r' #define AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI 'm' #define AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE 'T' #define AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE 'F' #define AGS_OSC_UTIL_TYPE_TAG_STRING_NIL 'N' #define AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE 'I' #define AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START '[' #define AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END ']' #define AGS_OSC_UTIL_TYPE_TAG_STRING_ALL "ifshtdScrmTFNI" #define AGS_OSC_UTIL_ADDRESS_PATTERN_VALID_CHARS_PATTERN "([a-zA-Z \\#\\*\\,\\/\\?\\[\\]\\{\\}]+)" #define AGS_OSC_UTIL_SLIP_CHUNK_LENGTH (8192) #define AGS_OSC_UTIL_SLIP_END (192) #define AGS_OSC_UTIL_SLIP_ESC (219) #define AGS_OSC_UTIL_SLIP_ESC_END (220) #define AGS_OSC_UTIL_SLIP_ESC_ESC (221) guint ags_osc_util_type_tag_string_count_type(gchar *type_tag); unsigned char* ags_osc_util_meta_data(gchar *uri, guint *meta_data_length); unsigned char* ags_osc_util_mime_header(gchar *uri, guint *mime_header_length); unsigned char* ags_osc_util_slip_encode(unsigned char *osc_buffer, guint buffer_length, guint *returned_buffer_length); unsigned char* ags_osc_util_slip_decode(unsigned char *slip_buffer, guint slip_buffer_length, guint *returned_buffer_length); void ags_osc_util_timetag_now(gint32 *tv_sec, gint32 *tv_fraction); G_END_DECLS #endif /*__AGS_OSC_UTIL_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_builder.h0000644000175000017500000001202113607210263016530 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_BUILDER_H__ #define __AGS_OSC_BUILDER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_BUILDER (ags_osc_builder_get_type ()) #define AGS_OSC_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_BUILDER, AgsOscBuilder)) #define AGS_OSC_BUILDER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_BUILDER, AgsOscBuilderClass)) #define AGS_IS_OSC_BUILDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_BUILDER)) #define AGS_IS_OSC_BUILDER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_BUILDER)) #define AGS_OSC_BUILDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_BUILDER, AgsOscBuilderClass)) #define AGS_OSC_BUILDER_GET_OBJ_MUTEX(obj) (&(((AgsOscBuilder *) obj)->obj_mutex)) #define AGS_OSC_BUILDER_PACKET(x) ((AgsOscBuilderPacket *)(x)) #define AGS_OSC_BUILDER_BUNDLE(x) ((AgsOscBuilderBundle *)(x)) #define AGS_OSC_BUILDER_MESSAGE(x) ((AgsOscBuilderMessage *)(x)) #define AGS_OSC_BUILDER_DEFAULT_CHUNK_SIZE (8192) #define AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE (8192) typedef struct _AgsOscBuilder AgsOscBuilder; typedef struct _AgsOscBuilderClass AgsOscBuilderClass; typedef struct _AgsOscBuilderPacket AgsOscBuilderPacket; typedef struct _AgsOscBuilderBundle AgsOscBuilderBundle; typedef struct _AgsOscBuilderMessage AgsOscBuilderMessage; typedef enum{ AGS_OSC_BUILDER_ADD_VALUE = 1, }AgsOscBuilderFlags; struct _AgsOscBuilder { GObject gobject; guint flags; GRecMutex obj_mutex; unsigned char *data; guint length; guint64 offset; GList *packet; gchar *current_type_tag; gchar *offset_type_tag; }; struct _AgsOscBuilderClass { GObjectClass gobject; void (*osc_putc)(AgsOscBuilder *osc_builder, gint c); void (*on_error)(AgsOscBuilder *osc_builder, GError **error); /* */ void (*append_packet)(AgsOscBuilder *osc_builder); void (*append_bundle)(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gint tv_secs, gint tv_fraction, gboolean immediately); void (*append_message)(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gchar *address_pattern, gchar *type_tag); void (*append_value)(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gint v_type, GValue *value); }; struct _AgsOscBuilderPacket { guint64 offset; gsize packet_size; AgsOscBuilder *builder; GList *message; GList *bundle; }; struct _AgsOscBuilderBundle { guint64 offset; gsize bundle_size; gint32 tv_secs; gint32 tv_fraction; gboolean immediately; AgsOscBuilderPacket *packet; AgsOscBuilderBundle *parent_bundle; GList *message; GList *bundle; }; struct _AgsOscBuilderMessage { guint64 offset; gchar *address_pattern; gchar *type_tag; gsize data_allocated_length; gsize data_length; unsigned char *data; AgsOscBuilderPacket *packet; AgsOscBuilderBundle *parent_bundle; }; GType ags_osc_builder_get_type(void); AgsOscBuilderPacket* ags_osc_builder_packet_alloc(guint64 offset); void ags_osc_builder_packet_free(AgsOscBuilderPacket *packet); AgsOscBuilderBundle* ags_osc_builder_bundle_alloc(guint64 offset); void ags_osc_builder_bundle_free(AgsOscBuilderBundle *bundle); AgsOscBuilderMessage* ags_osc_builder_message_alloc(guint64 offset); void ags_osc_builder_message_free(AgsOscBuilderMessage *message); /* */ void ags_osc_builder_osc_putc(AgsOscBuilder *osc_builder, gint c); void ags_osc_builder_on_error(AgsOscBuilder *osc_builder, GError **error); /* */ void ags_osc_builder_append_packet(AgsOscBuilder *osc_builder); void ags_osc_builder_append_bundle(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gint tv_secs, gint tv_fraction, gboolean immediately); void ags_osc_builder_append_message(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gchar *address_pattern, gchar *type_tag); void ags_osc_builder_append_value(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gint v_type, GValue *value); /* */ void ags_osc_builder_build(AgsOscBuilder *osc_builder); /* */ AgsOscBuilder* ags_osc_builder_new(); G_END_DECLS #endif /*__AGS_OSC_BUILDER_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_response.h0000644000175000017500000000625713607210263016756 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_RESPONSE_H__ #define __AGS_OSC_RESPONSE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_RESPONSE (ags_osc_response_get_type ()) #define AGS_OSC_RESPONSE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_RESPONSE, AgsOscResponse)) #define AGS_OSC_RESPONSE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_RESPONSE, AgsOscResponseClass)) #define AGS_IS_OSC_RESPONSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_RESPONSE)) #define AGS_IS_OSC_RESPONSE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_RESPONSE)) #define AGS_OSC_RESPONSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_RESPONSE, AgsOscResponseClass)) #define AGS_OSC_RESPONSE_GET_OBJ_MUTEX(obj) (&(((AgsOscResponse *) obj)->obj_mutex)) #define AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE "server failure" #define AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST "malformed request" #define AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH "unknown path" #define AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT "unknown argument" #define AGS_OSC_RESPONSE_ERROR_MESSAGE_MISSING_INDEX "missing index" #define AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED "chunk size exceeded" #define AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE (131072) typedef struct _AgsOscResponse AgsOscResponse; typedef struct _AgsOscResponseClass AgsOscResponseClass; /** * AgsOscResponseFlags: * @AGS_OSC_RESPONSE_EMPTY: is empty * @AGS_OSC_RESPONSE_OK: is OK * @AGS_OSC_RESPONSE_ERROR: has error * * Enum values to configure OSC response. */ typedef enum{ AGS_OSC_RESPONSE_EMPTY = 1, AGS_OSC_RESPONSE_OK = 1 << 1, AGS_OSC_RESPONSE_ERROR = 1 << 2, }AgsOscResponseFlags; struct _AgsOscResponse { GObject gobject; guint flags; GRecMutex obj_mutex; guchar *packet; guint packet_size; gchar *error_message; GObject *osc_message; struct timespec *creation_time; }; struct _AgsOscResponseClass { GObjectClass gobject; }; GType ags_osc_response_get_type(void); gboolean ags_osc_response_test_flags(AgsOscResponse *osc_response, guint flags); void ags_osc_response_set_flags(AgsOscResponse *osc_response, guint flags); void ags_osc_response_unset_flags(AgsOscResponse *osc_response, guint flags); AgsOscResponse* ags_osc_response_new(); G_END_DECLS #endif /*__AGS_OSC_RESPONSE_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_buffer_util.h0000644000175000017500000000715513607210263017424 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_BUFFER_UTIL_H__ #define __AGS_OSC_BUFFER_UTIL_H__ #include #include #include G_BEGIN_DECLS void ags_osc_buffer_util_put_int32(unsigned char *buffer, gint32 val); void ags_osc_buffer_util_get_int32(unsigned char *buffer, gint32 *val); void ags_osc_buffer_util_put_timetag(unsigned char *buffer, gint32 tv_secs, gint32 tv_fraction, gboolean immediately); void ags_osc_buffer_util_get_timetag(unsigned char *buffer, gint32 *tv_secs, gint32 *tv_fraction, gboolean *immediately); void ags_osc_buffer_util_put_float(unsigned char *buffer, gfloat val); void ags_osc_buffer_util_get_float(unsigned char *buffer, gfloat *val); void ags_osc_buffer_util_put_string(unsigned char *buffer, gchar *str, gsize length); void ags_osc_buffer_util_get_string(unsigned char *buffer, gchar **str, gsize *length); void ags_osc_buffer_util_put_blob(unsigned char *buffer, gint32 data_size, unsigned char *data); void ags_osc_buffer_util_get_blob(unsigned char *buffer, gint32 *data_size, unsigned char **data); void ags_osc_buffer_util_put_int64(unsigned char *buffer, gint64 val); void ags_osc_buffer_util_get_int64(unsigned char *buffer, gint64 *val); void ags_osc_buffer_util_put_double(unsigned char *buffer, gdouble val); void ags_osc_buffer_util_get_double(unsigned char *buffer, gdouble *val); void ags_osc_buffer_util_put_char(unsigned char *buffer, gchar val); void ags_osc_buffer_util_get_char(unsigned char *buffer, gchar *val); void ags_osc_buffer_util_put_rgba(unsigned char *buffer, guint8 r, guint8 g, guint8 b, guint8 a); void ags_osc_buffer_util_get_rgba(unsigned char *buffer, guint8 *r, guint8 *g, guint8 *b, guint8 *a); void ags_osc_buffer_util_put_midi(unsigned char *buffer, guint8 port, guint8 status_byte, guint8 data0, guint8 data1); void ags_osc_buffer_util_get_midi(unsigned char *buffer, guint8 *port, guint8 *status_byte, guint8 *data0, guint8 *data1); void ags_osc_buffer_util_put_packet(unsigned char *buffer, gint32 packet_size, unsigned char *packet); void ags_osc_buffer_util_get_packet(unsigned char *buffer, gint32 *packet_size, unsigned char **packet); void ags_osc_buffer_util_put_packets(unsigned char *buffer, gint32 packet_size, ...); void ags_osc_buffer_util_put_message(unsigned char *buffer, gchar *address_pattern, gchar *type_tag); void ags_osc_buffer_util_get_message(unsigned char *buffer, gchar **address_pattern, gchar **type_tag); void ags_osc_buffer_util_put_bundle(unsigned char *buffer, gint32 tv_secs, gint32 tv_fraction, gboolean immediately); void ags_osc_buffer_util_get_bundle(unsigned char *buffer, gint32 *tv_secs, gint32 *tv_fraction, gboolean *immediately); G_END_DECLS #endif /*__AGS_OSC_BUFFER_UTIL_H__*/ gsequencer-3.1.3/ags/audio/osc/xmlrpc/0000755000175000017500000000000013622252254014627 500000000000000gsequencer-3.1.3/ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.h0000644000175000017500000000700513607210263022165 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_XMLRPC_CONTROLLER_H__ #define __AGS_OSC_XMLRPC_CONTROLLER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_XMLRPC_CONTROLLER (ags_osc_xmlrpc_controller_get_type()) #define AGS_OSC_XMLRPC_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_XMLRPC_CONTROLLER, AgsOscXmlrpcController)) #define AGS_OSC_XMLRPC_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_OSC_XMLRPC_CONTROLLER, AgsOscXmlrpcControllerClass)) #define AGS_IS_OSC_XMLRPC_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_XMLRPC_CONTROLLER)) #define AGS_IS_OSC_XMLRPC_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_XMLRPC_CONTROLLER)) #define AGS_OSC_XMLRPC_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_OSC_XMLRPC_CONTROLLER, AgsOscXmlrpcControllerClass)) #define AGS_OSC_XMLRPC_CONTROLLER_DEFAULT_DELEGATE_TIMEOUT (1.0 / 30.0) typedef struct _AgsOscXmlrpcController AgsOscXmlrpcController; typedef struct _AgsOscXmlrpcControllerClass AgsOscXmlrpcControllerClass; typedef enum{ AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED = 1, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_RUNNING = 1 << 1, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_TERMINATING = 1 << 2, }AgsOscXmlrpcControllerFlags; struct _AgsOscXmlrpcController { AgsController controller; guint flags; GObject *osc_xmlrpc_server; volatile gboolean do_reset; GMutex delegate_mutex; GCond delegate_cond; GList *message; GList *queued_response; }; struct _AgsOscXmlrpcControllerClass { AgsControllerClass controller; void (*start_delegate)(AgsOscXmlrpcController *osc_xmlrpc_controller); void (*stop_delegate)(AgsOscXmlrpcController *osc_xmlrpc_controller); }; GType ags_osc_xmlrpc_controller_get_type(); gboolean ags_osc_xmlrpc_controller_test_flags(AgsOscXmlrpcController *osc_xmlrpc_controller, guint flags); void ags_osc_xmlrpc_controller_set_flags(AgsOscXmlrpcController *osc_xmlrpc_controller, guint flags); void ags_osc_xmlrpc_controller_unset_flags(AgsOscXmlrpcController *osc_xmlrpc_controller, guint flags); void ags_osc_xmlrpc_controller_add_message(AgsOscXmlrpcController *osc_xmlrpc_controller, GObject *message); void ags_osc_xmlrpc_controller_remove_message(AgsOscXmlrpcController *osc_xmlrpc_controller, GObject *message); void ags_osc_xmlrpc_controller_start_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller); void ags_osc_xmlrpc_controller_stop_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller); AgsOscXmlrpcController* ags_osc_xmlrpc_controller_new(); G_END_DECLS #endif /*__AGS_OSC_XMLRPC_CONTROLLER_H__*/ gsequencer-3.1.3/ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c0000644000175000017500000011206313613101102022145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __APPLE__ #include #include #endif #include void ags_osc_xmlrpc_controller_class_init(AgsOscXmlrpcControllerClass *osc_xmlrpc_controller); void ags_osc_xmlrpc_controller_plugin_controller_interface_init(AgsPluginControllerInterface *plugin_controller); void ags_osc_xmlrpc_controller_init(AgsOscXmlrpcController *osc_xmlrpc_controller); void ags_osc_xmlrpc_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_xmlrpc_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_xmlrpc_controller_dispose(GObject *gobject); void ags_osc_xmlrpc_controller_finalize(GObject *gobject); gboolean ags_osc_xmlrpc_controller_delegate_timeout(AgsOscXmlrpcController *osc_xmlrpc_controller); void ags_osc_xmlrpc_controller_real_start_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller); void ags_osc_xmlrpc_controller_real_stop_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller); gsize ags_osc_xmlrpc_controller_read_bundle(AgsOscXmlrpcController *osc_xmlrpc_controller, AgsOscWebsocketConnection *osc_websocket_connection, SoupMessage *msg, GHashTable *query, guchar *packet, gsize packet_size, gsize offset); gsize ags_osc_xmlrpc_controller_read_message(AgsOscXmlrpcController *osc_xmlrpc_controller, AgsOscWebsocketConnection *osc_websocket_connection, SoupMessage *msg, GHashTable *query, guchar *packet, gsize packet_size, gsize offset, gint32 tv_sec, gint32 tv_fraction, gboolean immediately); gpointer ags_osc_xmlrpc_controller_do_request(AgsPluginController *plugin_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *context_path, gchar *login, gchar *security_token); enum{ PROP_0, PROP_OSC_XMLRPC_SERVER, }; enum{ START_DELEGATE, STOP_DELEGATE, LAST_SIGNAL, }; /** * SECTION:ags_osc_xmlrpc_controller * @short_description: handle OSC XMLRPC requests * @title: AgsOscXmlrpcController * @section_id: * @include: ags/audio/osc/controller/ags_osc_xmlrpc_controller.h * * The #AgsOscXmlrpcController is an object to handle XMLRPC requests. */ static gpointer ags_osc_xmlrpc_controller_parent_class = NULL; static guint osc_xmlrpc_controller_signals[LAST_SIGNAL]; GType ags_osc_xmlrpc_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_xmlrpc_controller = 0; static const GTypeInfo ags_osc_xmlrpc_controller_info = { sizeof (AgsOscXmlrpcControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_xmlrpc_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscXmlrpcController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_xmlrpc_controller_init, }; static const GInterfaceInfo ags_plugin_controller_interface_info = { (GInterfaceInitFunc) ags_osc_xmlrpc_controller_plugin_controller_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_osc_xmlrpc_controller = g_type_register_static(AGS_TYPE_CONTROLLER, "AgsOscXmlrpcController", &ags_osc_xmlrpc_controller_info, 0); g_type_add_interface_static(ags_type_osc_xmlrpc_controller, AGS_TYPE_PLUGIN_CONTROLLER, &ags_plugin_controller_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_xmlrpc_controller); } return g_define_type_id__volatile; } void ags_osc_xmlrpc_controller_class_init(AgsOscXmlrpcControllerClass *osc_xmlrpc_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_xmlrpc_controller_parent_class = g_type_class_peek_parent(osc_xmlrpc_controller); /* GObjectClass */ gobject = (GObjectClass *) osc_xmlrpc_controller; gobject->set_property = ags_osc_xmlrpc_controller_set_property; gobject->get_property = ags_osc_xmlrpc_controller_get_property; gobject->dispose = ags_osc_xmlrpc_controller_dispose; gobject->finalize = ags_osc_xmlrpc_controller_finalize; /* properties */ /** * AgsOscXmlrpcController:osc-xmlrpc-server: * * The assigned #AgsOscServer * * Since: 3.0.0 */ param_spec = g_param_spec_object("osc-xmlrpc-server", i18n("assigned OSC XMLRPC server"), i18n("The assigned OSC XMLRPC server"), AGS_TYPE_OSC_XMLRPC_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSC_XMLRPC_SERVER, param_spec); /* AgsOscXmlrpcController */ osc_xmlrpc_controller->start_delegate = ags_osc_xmlrpc_controller_real_start_delegate; osc_xmlrpc_controller->stop_delegate = ags_osc_xmlrpc_controller_real_stop_delegate; /* signals */ /** * AgsOscXmlrpcController::start-delegate: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * * The ::start-delegate signal is emited during start of delegating messages. * * Since: 3.0.0 */ osc_xmlrpc_controller_signals[START_DELEGATE] = g_signal_new("start-delegate", G_TYPE_FROM_CLASS(osc_xmlrpc_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscXmlrpcControllerClass, start_delegate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscXmlrpcController::stop-delegate: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * * The ::stop-delegate signal is emited during stop of delegating messages. * * Since: 3.0.0 */ osc_xmlrpc_controller_signals[STOP_DELEGATE] = g_signal_new("stop-delegate", G_TYPE_FROM_CLASS(osc_xmlrpc_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscXmlrpcControllerClass, stop_delegate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_osc_xmlrpc_controller_plugin_controller_interface_init(AgsPluginControllerInterface *plugin_controller) { plugin_controller->do_request = ags_osc_xmlrpc_controller_do_request; } void ags_osc_xmlrpc_controller_init(AgsOscXmlrpcController *osc_xmlrpc_controller) { gchar *context_path; context_path = g_strdup_printf("%s/ags-osc-over-xmlrpc", AGS_CONTROLLER_BASE_PATH); g_object_set(osc_xmlrpc_controller, "context-path", context_path, NULL); g_free(context_path); /* OSC XMLRPC server */ osc_xmlrpc_controller->flags = 0; osc_xmlrpc_controller->osc_xmlrpc_server = NULL; g_atomic_int_set(&(osc_xmlrpc_controller->do_reset), FALSE); g_mutex_init(&(osc_xmlrpc_controller->delegate_mutex)); g_cond_init(&(osc_xmlrpc_controller->delegate_cond)); osc_xmlrpc_controller->message = NULL; osc_xmlrpc_controller->queued_response = NULL; } void ags_osc_xmlrpc_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscXmlrpcController *osc_xmlrpc_controller; GRecMutex *controller_mutex; osc_xmlrpc_controller = AGS_OSC_XMLRPC_CONTROLLER(gobject); /* get osc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); switch(prop_id){ case PROP_OSC_XMLRPC_SERVER: { AgsOscXmlrpcServer *osc_xmlrpc_server; osc_xmlrpc_server = (AgsOscServer *) g_value_get_object(value); g_rec_mutex_lock(controller_mutex); if(osc_xmlrpc_controller->osc_xmlrpc_server == (GObject *) osc_xmlrpc_server){ g_rec_mutex_unlock(controller_mutex); return; } if(osc_xmlrpc_controller->osc_xmlrpc_server != NULL){ g_object_unref(G_OBJECT(osc_xmlrpc_controller->osc_xmlrpc_server)); } if(osc_xmlrpc_server != NULL){ g_object_ref(G_OBJECT(osc_xmlrpc_server)); } osc_xmlrpc_controller->osc_xmlrpc_server = (GObject *) osc_xmlrpc_server; g_rec_mutex_unlock(controller_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_xmlrpc_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscXmlrpcController *osc_xmlrpc_controller; GRecMutex *controller_mutex; osc_xmlrpc_controller = AGS_OSC_XMLRPC_CONTROLLER(gobject); /* get osc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); switch(prop_id){ case PROP_OSC_XMLRPC_SERVER: { g_rec_mutex_lock(controller_mutex); g_value_set_object(value, osc_xmlrpc_controller->osc_xmlrpc_server); g_rec_mutex_unlock(controller_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_xmlrpc_controller_dispose(GObject *gobject) { AgsOscXmlrpcController *osc_xmlrpc_controller; osc_xmlrpc_controller = AGS_OSC_XMLRPC_CONTROLLER(gobject); if(osc_xmlrpc_controller->osc_xmlrpc_server != NULL){ g_object_unref(osc_xmlrpc_controller->osc_xmlrpc_server); osc_xmlrpc_controller->osc_xmlrpc_server = NULL; } if(osc_xmlrpc_controller->message != NULL){ g_list_free_full(osc_xmlrpc_controller->message, (GDestroyNotify) g_object_unref); osc_xmlrpc_controller->message = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_xmlrpc_controller_parent_class)->dispose(gobject); } void ags_osc_xmlrpc_controller_finalize(GObject *gobject) { AgsOscXmlrpcController *osc_xmlrpc_controller; osc_xmlrpc_controller = AGS_OSC_XMLRPC_CONTROLLER(gobject); if(osc_xmlrpc_controller->osc_xmlrpc_server != NULL){ g_object_unref(osc_xmlrpc_controller->osc_xmlrpc_server); } if(osc_xmlrpc_controller->message != NULL){ g_list_free_full(osc_xmlrpc_controller->message, (GDestroyNotify) g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_osc_xmlrpc_controller_parent_class)->finalize(gobject); } gboolean ags_osc_xmlrpc_controller_delegate_timeout(AgsOscXmlrpcController *osc_xmlrpc_controller) { AgsOscXmlrpcServer *osc_xmlrpc_server; AgsOscMessage *current; GList *start_osc_response, *osc_response; GList *start_message, *message; GList *start_list, *list; GList *start_controller, *controller; gint64 time_now, time_next; gint64 current_time; GRecMutex *controller_mutex; g_object_get(osc_xmlrpc_controller, "osc-xmlrpc-server", &osc_xmlrpc_server, NULL); g_object_get(osc_xmlrpc_server, "controller", &start_controller, NULL); /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); time_next = 0; /* */ g_mutex_lock(&(osc_xmlrpc_controller->delegate_mutex)); time_now = g_get_monotonic_time(); g_atomic_int_set(&(osc_xmlrpc_controller->do_reset), FALSE); g_mutex_unlock(&(osc_xmlrpc_controller->delegate_mutex)); /* check queued response */ g_rec_mutex_lock(controller_mutex); start_osc_response = g_list_copy_deep(osc_xmlrpc_controller->queued_response, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(controller_mutex); osc_response = start_osc_response; while(osc_response != NULL){ gint64 num_written; gboolean has_expired; GRecMutex *response_mutex; static const struct timespec timeout_delay = { 30, 0, }; g_object_get(osc_response->data, "osc-message", ¤t, NULL); num_written = ags_osc_connection_write_response(current->osc_connection, osc_response->data); g_object_unref(current); response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response->data); g_rec_mutex_lock(response_mutex); has_expired = ags_time_timeout_expired(AGS_OSC_RESPONSE(osc_response->data)->creation_time, &timeout_delay); g_rec_mutex_unlock(response_mutex); if(num_written != -1 || has_expired){ g_rec_mutex_lock(controller_mutex); osc_xmlrpc_controller->queued_response = g_list_remove(osc_xmlrpc_controller->queued_response, osc_response->data); g_object_unref(osc_response->data); g_rec_mutex_unlock(controller_mutex); } osc_response = osc_response->next; } g_list_free_full(start_osc_response, g_object_unref); /* check delegate */ g_rec_mutex_lock(controller_mutex); start_message = NULL; list = start_list = g_list_copy_deep(osc_xmlrpc_controller->message, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(controller_mutex); while(list != NULL){ gboolean immediately; GRecMutex *message_mutex; message_mutex = AGS_OSC_MESSAGE_GET_OBJ_MUTEX(list->data); g_object_get(list->data, "immediately", &immediately, NULL); if(immediately){ start_message = g_list_prepend(start_message, list->data); g_object_ref(list->data); ags_osc_xmlrpc_controller_remove_message(osc_xmlrpc_controller, list->data); }else{ g_rec_mutex_lock(message_mutex); current_time = AGS_OSC_MESSAGE(list->data)->tv_sec + AGS_OSC_MESSAGE(list->data)->tv_fraction / 4.294967296 * 1000.0; g_rec_mutex_unlock(message_mutex); if(current_time < time_now){ start_message = g_list_prepend(start_message, list->data); g_object_ref(list->data); ags_osc_xmlrpc_controller_remove_message(osc_xmlrpc_controller, list->data); }else{ break; } } list = list->next; } g_list_free_full(start_list, (GDestroyNotify) g_object_unref); message = start_message = g_list_reverse(start_message); while(message != NULL){ gchar *path; ags_osc_buffer_util_get_string(AGS_OSC_MESSAGE(message->data)->message, &path, NULL); controller = start_controller; start_osc_response = NULL; while(controller != NULL){ gboolean success; GRecMutex *mutex; /* get OSC controller mutex */ mutex = AGS_OSC_CONTROLLER_GET_OBJ_MUTEX(controller->data); /* match path */ g_rec_mutex_lock(mutex); success = !g_strcmp0(AGS_OSC_CONTROLLER(controller->data)->context_path, path); g_rec_mutex_unlock(mutex); if(success){ current = AGS_OSC_MESSAGE(message->data); /* delegate */ if(AGS_IS_OSC_ACTION_CONTROLLER(controller->data)){ start_osc_response = ags_osc_action_controller_run_action(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_CONFIG_CONTROLLER(controller->data)){ start_osc_response = ags_osc_config_controller_apply_config(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_INFO_CONTROLLER(controller->data)){ start_osc_response = ags_osc_info_controller_get_info(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_METER_CONTROLLER(controller->data)){ start_osc_response = ags_osc_meter_controller_monitor_meter(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_NODE_CONTROLLER(controller->data)){ start_osc_response = ags_osc_node_controller_get_data(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_RENEW_CONTROLLER(controller->data)){ start_osc_response = ags_osc_renew_controller_set_data(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_STATUS_CONTROLLER(controller->data)){ start_osc_response = ags_osc_status_controller_get_status(controller->data, current->osc_connection, current->message, current->message_size); }else if(AGS_IS_OSC_PLUGIN_CONTROLLER(controller->data)){ start_osc_response = ags_osc_plugin_controller_do_request(AGS_OSC_PLUGIN_CONTROLLER(controller->data), current->osc_connection, current->message, current->message_size); } /* write response */ osc_response = start_osc_response; while(osc_response != NULL){ gint64 num_written; #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif GRecMutex *response_mutex; num_written = ags_osc_connection_write_response(current->osc_connection, osc_response->data); if(num_written == -1){ response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response->data); g_rec_mutex_lock(response_mutex); AGS_OSC_RESPONSE(osc_response->data)->creation_time = (struct timespec *) malloc(sizeof(struct timespec)); #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); AGS_OSC_RESPONSE(osc_response->data)->creation_time->tv_sec = mts.tv_sec; AGS_OSC_RESPONSE(osc_response->data)->creation_time->tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, AGS_OSC_RESPONSE(osc_response->data)->creation_time); #endif g_rec_mutex_unlock(response_mutex); g_object_set(osc_response->data, "osc-message", current, NULL); g_rec_mutex_lock(controller_mutex); osc_xmlrpc_controller->queued_response = g_list_prepend(osc_xmlrpc_controller->queued_response, osc_response->data); g_object_ref(osc_response->data); g_rec_mutex_unlock(controller_mutex); } osc_response = osc_response->next; } g_list_free_full(start_osc_response, g_object_unref); break; } controller = controller->next; } message = message->next; } /* free messages */ g_list_free_full(start_message, (GDestroyNotify) g_object_unref); /* next */ g_mutex_lock(&(osc_xmlrpc_controller->delegate_mutex)); if(osc_xmlrpc_controller->message != NULL){ time_next = AGS_OSC_MESSAGE(osc_xmlrpc_controller->message)->tv_sec + AGS_OSC_MESSAGE(osc_xmlrpc_controller->message)->tv_fraction / 4.294967296 * 1000.0; }else{ time_now = g_get_monotonic_time(); time_next = time_now + G_TIME_SPAN_SECOND / 30; } g_mutex_unlock(&(osc_xmlrpc_controller->delegate_mutex)); g_object_unref(osc_xmlrpc_server); g_list_free_full(start_controller, g_object_unref); if(!ags_osc_xmlrpc_controller_test_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_RUNNING)){ return(G_SOURCE_REMOVE); } return(G_SOURCE_CONTINUE); } /** * ags_osc_xmlrpc_controller_test_flags: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * @flags: the flags * * Test @flags to be set on @osc_xmlrpc_controller. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_xmlrpc_controller_test_flags(AgsOscXmlrpcController *osc_xmlrpc_controller, guint flags) { gboolean retval; GRecMutex *controller_mutex; if(!AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller)){ return(FALSE); } /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); /* test */ g_rec_mutex_lock(controller_mutex); retval = (flags & (osc_xmlrpc_controller->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(controller_mutex); return(retval); } /** * ags_osc_xmlrpc_controller_set_flags: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_xmlrpc_controller_set_flags(AgsOscXmlrpcController *osc_xmlrpc_controller, guint flags) { GRecMutex *controller_mutex; if(!AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller)){ return; } /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); /* set flags */ g_rec_mutex_lock(controller_mutex); osc_xmlrpc_controller->flags |= flags; g_rec_mutex_unlock(controller_mutex); } /** * ags_osc_xmlrpc_controller_unset_flags: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_xmlrpc_controller_unset_flags(AgsOscXmlrpcController *osc_xmlrpc_controller, guint flags) { GRecMutex *controller_mutex; if(!AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller)){ return; } /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); /* set flags */ g_rec_mutex_lock(controller_mutex); osc_xmlrpc_controller->flags &= (~flags); g_rec_mutex_unlock(controller_mutex); } /** * ags_osc_xmlrpc_controller_add_message: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * @message: the #AgsOscMessage * * Add @message to @osc_xmlrpc_controller. * * Since: 3.0.0 */ void ags_osc_xmlrpc_controller_add_message(AgsOscXmlrpcController *osc_xmlrpc_controller, GObject *message) { GRecMutex *controller_mutex; if(!AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller) || !AGS_IS_OSC_MESSAGE(message)){ return; } /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); /* add */ g_rec_mutex_lock(controller_mutex); if(g_list_find(osc_xmlrpc_controller->message, message) == NULL){ osc_xmlrpc_controller->message = g_list_insert_sorted(osc_xmlrpc_controller->message, message, ags_osc_message_sort_func); g_object_ref(message); } g_rec_mutex_unlock(controller_mutex); } /** * ags_osc_xmlrpc_controller_remove_message: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * @message: the #AgsOscMessage * * Remove @message from @osc_xmlrpc_controller. * * Since: 3.0.0 */ void ags_osc_xmlrpc_controller_remove_message(AgsOscXmlrpcController *osc_xmlrpc_controller, GObject *message) { GRecMutex *controller_mutex; if(!AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller) || !AGS_IS_OSC_MESSAGE(message)){ return; } /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); /* remove */ g_rec_mutex_lock(controller_mutex); if(g_list_find(osc_xmlrpc_controller->message, message) != NULL){ osc_xmlrpc_controller->message = g_list_remove(osc_xmlrpc_controller->message, message); g_object_unref(message); } g_rec_mutex_unlock(controller_mutex); } void ags_osc_xmlrpc_controller_real_start_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller) { AgsConfig *config; GMainContext *main_context; GSource *timeout_source; gchar *str; gdouble delegate_timeout; GRecMutex *controller_mutex; /* get OSC xmlrpc controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(osc_xmlrpc_controller); /* test if already started */ g_rec_mutex_lock(controller_mutex); if(ags_osc_xmlrpc_controller_test_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED)){ g_rec_mutex_unlock(controller_mutex); return; } ags_osc_xmlrpc_controller_set_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED); g_rec_mutex_unlock(controller_mutex); config = ags_config_get_instance(); /* delegate timeout */ ags_osc_xmlrpc_controller_set_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_RUNNING); delegate_timeout = AGS_OSC_XMLRPC_CONTROLLER_DEFAULT_DELEGATE_TIMEOUT; str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER, "delegate-timeout"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_OSC_SERVER_0, "delegate-timeout"); } if(str != NULL){ delegate_timeout = g_ascii_strtod(str, NULL); free(str); } /* create delegate timeout */ main_context = g_main_context_get_thread_default(); timeout_source = g_timeout_source_new(delegate_timeout * G_TIME_SPAN_MILLISECOND); g_source_set_callback(timeout_source, ags_osc_xmlrpc_controller_delegate_timeout, osc_xmlrpc_controller, NULL); g_source_attach(timeout_source, main_context); } /** * ags_osc_xmlrpc_controller_start_delegate: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * * Start delegating. * * Since: 3.0.0 */ void ags_osc_xmlrpc_controller_start_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller) { g_return_if_fail(AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller)); g_object_ref((GObject *) osc_xmlrpc_controller); g_signal_emit(G_OBJECT(osc_xmlrpc_controller), osc_xmlrpc_controller_signals[START_DELEGATE], 0); g_object_unref((GObject *) osc_xmlrpc_controller); } void ags_osc_xmlrpc_controller_real_stop_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller) { if(!ags_osc_xmlrpc_controller_test_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_RUNNING)){ return; } ags_osc_xmlrpc_controller_set_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_TERMINATING); ags_osc_xmlrpc_controller_unset_flags(osc_xmlrpc_controller, AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_RUNNING); /* join thread */ ags_osc_xmlrpc_controller_unset_flags(osc_xmlrpc_controller, (AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_TERMINATING | AGS_OSC_XMLRPC_CONTROLLER_DELEGATE_STARTED)); } /** * ags_osc_xmlrpc_controller_stop_delegate: * @osc_xmlrpc_controller: the #AgsOscXmlrpcController * * Stop delegating. * * Since: 3.0.0 */ void ags_osc_xmlrpc_controller_stop_delegate(AgsOscXmlrpcController *osc_xmlrpc_controller) { g_return_if_fail(AGS_IS_OSC_XMLRPC_CONTROLLER(osc_xmlrpc_controller)); g_object_ref((GObject *) osc_xmlrpc_controller); g_signal_emit(G_OBJECT(osc_xmlrpc_controller), osc_xmlrpc_controller_signals[STOP_DELEGATE], 0); g_object_unref((GObject *) osc_xmlrpc_controller); } gsize ags_osc_xmlrpc_controller_read_bundle(AgsOscXmlrpcController *osc_xmlrpc_controller, AgsOscWebsocketConnection *osc_websocket_connection, SoupMessage *msg, GHashTable *query, guchar *packet, gsize packet_size, gsize offset) { gint32 tv_sec; gint32 tv_fraction; gboolean immediately; gsize read_count; gint32 length; read_count = 8; ags_osc_buffer_util_get_timetag(packet + offset + read_count, &(tv_sec), &(tv_fraction), &(immediately)); read_count += 8; for(; offset < packet_size;){ ags_osc_buffer_util_get_int32(packet + offset + read_count, &length); read_count += 4; if(!g_strcmp0(packet + offset + read_count, "#bundle")){ ags_osc_xmlrpc_controller_read_bundle(osc_xmlrpc_controller, osc_websocket_connection, msg, query, packet, packet_size, offset + read_count); read_count += ((gsize) 4 * ceil((double) length / 4.0)); }else if(packet[offset + read_count] == '/'){ ags_osc_xmlrpc_controller_read_message(osc_xmlrpc_controller, osc_websocket_connection, msg, query, packet, packet_size, offset + read_count, tv_sec, tv_fraction, immediately); read_count += ((gsize) 4 * ceil((double) length / 4.0)); }else{ read_count += 1; g_warning("malformed data"); } } return(read_count); } gsize ags_osc_xmlrpc_controller_read_message(AgsOscXmlrpcController *osc_xmlrpc_controller, AgsOscWebsocketConnection *osc_websocket_connection, SoupMessage *msg, GHashTable *query, guchar *packet, gsize packet_size, gsize offset, gint32 tv_sec, gint32 tv_fraction, gboolean immediately) { AgsOscMessage *osc_message; guchar *message; gchar *address_pattern; gchar *type_tag; gsize address_pattern_length; gsize type_tag_length; gsize data_length; gsize read_count; guint i; read_count = 0; ags_osc_buffer_util_get_string(packet + offset, &address_pattern, &address_pattern_length); if(address_pattern == NULL){ return(0); } read_count += (4 * (gsize) ceil((double) (address_pattern_length + 1) / 4.0)); free(address_pattern); type_tag = NULL; if(packet_size > offset + read_count){ if(packet[offset + read_count] == ','){ ags_osc_buffer_util_get_string(packet + offset + read_count, &type_tag, &type_tag_length); read_count += (4 * (gsize) ceil((double) (type_tag_length + 1) / 4.0)); } } data_length = 0; if(type_tag != NULL){ for(i = 1; i < type_tag_length; i++){ switch(type_tag[i]){ case AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE: case AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE: case AGS_OSC_UTIL_TYPE_TAG_STRING_NIL: case AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE: case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START: case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR: case AGS_OSC_UTIL_TYPE_TAG_STRING_INT32: case AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT: case AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA: case AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI: { data_length += 4; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_INT64: case AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE: case AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG: { data_length += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL: case AGS_OSC_UTIL_TYPE_TAG_STRING_STRING: { gsize length; length = strlen(packet + offset + read_count + data_length); data_length += (4 * (gsize) ceil((double) (length + 1) / 4.0)); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB: { gint32 data_size; ags_osc_buffer_util_get_int32(packet + offset + read_count + data_length, &data_size); data_length += data_size; } break; } } free(type_tag); } read_count += (4 * (gsize) ceil((double) data_length / 4.0)); osc_message = ags_osc_xmlrpc_message_new(); message = (guchar *) malloc(read_count * sizeof(guchar)); memcpy(message, packet + offset, read_count * sizeof(guchar)); g_object_set(osc_message, "osc-connection", osc_websocket_connection, "tv-sec", tv_sec, "tv-fraction", tv_fraction, "immediately", immediately, "message-size", read_count, "message", message, "msg", msg, "query", query, NULL); ags_osc_xmlrpc_controller_add_message(osc_xmlrpc_controller, osc_message); return(read_count); } gpointer ags_osc_xmlrpc_controller_do_request(AgsPluginController *plugin_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token) { AgsOscXmlrpcServer *osc_xmlrpc_server; AgsOscXmlrpcController *osc_xmlrpc_controller; AgsOscWebsocketConnection *osc_websocket_connection; xmlDoc *doc; xmlDoc *response_doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; xmlNode *response_root_node; xmlNode *response_redirect_node; GBytes *request_body_data; xmlChar *buffer; gchar *data; guchar *packet; xmlChar *response_buffer; gchar *response_resource_id; gsize data_size; gsize packet_size; gint32 tv_sec; gint32 tv_fraction; gboolean immediately; gsize offset; int response_buffer_length; if(!AGS_IS_SECURITY_CONTEXT(security_context) || path == NULL || login == NULL || security_token == NULL){ return(NULL); } g_object_get(msg, "request-body-data", &request_body_data, NULL); data = g_bytes_get_data(request_body_data, &data_size); /* parse XML doc */ buffer = xmlCharStrndup(data, data_size); doc = xmlParseDoc(buffer); xmlFree(buffer); if(doc == NULL){ return(NULL); } root_node = xmlDocGetRootElement(doc); if(root_node == NULL){ return(NULL); } /* */ osc_xmlrpc_controller = AGS_OSC_XMLRPC_CONTROLLER(plugin_controller); g_object_get(osc_xmlrpc_controller, "osc-xmlrpc-server", &osc_xmlrpc_server, NULL); response_resource_id = g_uuid_string_random(); osc_websocket_connection = ags_osc_websocket_connection_new(osc_xmlrpc_server); g_object_set(osc_websocket_connection, "security-context", security_context, "login", login, "security-token", security_token, "resource-id", response_resource_id, NULL); ags_osc_server_add_connection(osc_xmlrpc_server, osc_websocket_connection); osc_packet_node_list = root_node->children; while(osc_packet_node_list != NULL){ if(osc_packet_node_list->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(osc_packet_node_list->name, "ags-osc-packet-list", 20)){ osc_packet_node = osc_packet_node_list->children; while(osc_packet_node != NULL){ if(osc_packet_node->type == XML_ELEMENT_NODE){ if(!xmlStrncmp(osc_packet_node->name, "ags-osc-packet", 15)){ xmlChar *tmp_packet; tmp_packet = xmlNodeGetContent(osc_packet_node); packet = g_base64_decode(tmp_packet, &packet_size); tv_sec = 0; tv_fraction = 0; immediately = TRUE; for(offset = 4; offset < packet_size;){ gsize read_count; #ifdef AGS_DEBUG g_message("%d %d", offset, packet_size); g_message("%x[%c]", packet[offset], packet[offset]); #endif if(!g_strcmp0(packet + offset, "#bundle")){ read_count = ags_osc_xmlrpc_controller_read_bundle(osc_xmlrpc_controller, osc_websocket_connection, msg, query, packet, packet_size, offset); }else if(packet[offset] == '/'){ read_count = ags_osc_xmlrpc_controller_read_message(osc_xmlrpc_controller, osc_websocket_connection, msg, query, packet, packet_size, offset, 0, 0, TRUE); }else{ read_count = 1; g_warning("malformed data"); } if(read_count > 0){ offset += ((gsize) 4 * ceil((double) read_count / 4.0)); }else{ offset += 1; g_warning("malformed data"); } } g_free(packet); } } osc_packet_node = osc_packet_node->next; } } } osc_packet_node_list = osc_packet_node_list->next; } xmlFreeDoc(doc); /* response */ g_message("PATH=%s", path); response_doc = xmlNewDoc("1.0"); response_root_node = xmlNewNode(NULL, "ags-osc-over-xmlrpc"); xmlDocSetRootElement(response_doc, response_root_node); response_redirect_node = xmlNewNode(NULL, "ags-srv-redirect"); xmlNewProp(response_redirect_node, "resource-id", response_resource_id); xmlAddChild(response_root_node, response_redirect_node); /* set body */ xmlDocDumpFormatMemoryEnc(response_doc, &response_buffer, &response_buffer_length, "UTF-8", TRUE); soup_message_set_response(msg, "text/xml; charset=UTF-8", SOUP_MEMORY_COPY, response_buffer, response_buffer_length); soup_message_set_status(msg, 200); xmlFree(response_buffer); xmlFreeDoc(response_doc); g_free(response_resource_id); return(NULL); } /** * ags_osc_xmlrpc_controller_new: * * Instantiate new #AgsOscXmlrpcController * * Returns: the #AgsOscXmlrpcController * * Since: 3.0.0 */ AgsOscXmlrpcController* ags_osc_xmlrpc_controller_new() { AgsOscXmlrpcController *osc_xmlrpc_controller; osc_xmlrpc_controller = (AgsOscXmlrpcController *) g_object_new(AGS_TYPE_OSC_XMLRPC_CONTROLLER, NULL); return(osc_xmlrpc_controller); } gsequencer-3.1.3/ags/audio/osc/ags_osc_server.h0000644000175000017500000001166013607210263016420 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_SERVER_H__ #define __AGS_OSC_SERVER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_SERVER (ags_osc_server_get_type ()) #define AGS_OSC_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_SERVER, AgsOscServer)) #define AGS_OSC_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_SERVER, AgsOscServerClass)) #define AGS_IS_OSC_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_SERVER)) #define AGS_IS_OSC_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_SERVER)) #define AGS_OSC_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_SERVER, AgsOscServerClass)) #define AGS_OSC_SERVER_GET_OBJ_MUTEX(obj) (&(((AgsOscServer *) obj)->obj_mutex)) #define AGS_OSC_SERVER_DEFAULT_MAX_ADDRESS_LENGTH (2048) #define AGS_OSC_SERVER_DEFAULT_SERVER_PORT (9000) #define AGS_OSC_SERVER_DEFAULT_DOMAIN "localhost" #define AGS_OSC_SERVER_DEFAULT_INET4_ADDRESS "127.0.0.1" #define AGS_OSC_SERVER_DEFAULT_INET6_ADDRESS "::1" #define AGS_OSC_SERVER_DEFAULT_BACKLOG (512) #define AGS_OSC_SERVER_DEFAULT_MAX_CONNECTIONS (8192) typedef struct _AgsOscServer AgsOscServer; typedef struct _AgsOscServerClass AgsOscServerClass; /** * AgsOscServerFlags: * @AGS_OSC_SERVER_STARTED: the server was started * @AGS_OSC_SERVER_RUNNING: the server is up and running * @AGS_OSC_SERVER_TERMINATING: the server is closing connections and terminating * @AGS_OSC_SERVER_INET4: use IPv4 * @AGS_OSC_SERVER_INET6: use IPv6 * @AGS_OSC_SERVER_UDP: run using UDP transport * @AGS_OSC_SERVER_TCP: run using TCP transport * @AGS_OSC_SERVER_UNIX: run on UNIX socket * @AGS_OSC_SERVER_ANY_ADDRESS: listen on any address * @AGS_OSC_SERVER_AUTO_START: start the server * * Enum values to control the behavior or indicate internal state of #AgsOscServer by * enable/disable as flags. */ typedef enum{ AGS_OSC_SERVER_STARTED = 1, AGS_OSC_SERVER_RUNNING = 1 << 1, AGS_OSC_SERVER_TERMINATING = 1 << 2, AGS_OSC_SERVER_INET4 = 1 << 3, AGS_OSC_SERVER_INET6 = 1 << 4, AGS_OSC_SERVER_UDP = 1 << 5, AGS_OSC_SERVER_TCP = 1 << 6, AGS_OSC_SERVER_UNIX = 1 << 7, AGS_OSC_SERVER_ANY_ADDRESS = 1 << 8, AGS_OSC_SERVER_AUTO_START = 1 << 9, }AgsOscServerFlags; struct _AgsOscServer { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *ip4; gchar *ip6; gchar *domain; guint server_port; int ip4_fd; int ip6_fd; GSocket *ip4_socket; GSocket *ip6_socket; GSocketAddress *ip4_address; GSocketAddress *ip6_address; struct timespec *accept_delay; struct timespec *dispatch_delay; GThread *listen_thread; GThread *dispatch_thread; GList *connection; GObject *front_controller; GList *controller; }; struct _AgsOscServerClass { GObjectClass gobject; void (*start)(AgsOscServer *osc_server); void (*stop)(AgsOscServer *osc_server); gboolean (*listen)(AgsOscServer *osc_server); void (*dispatch)(AgsOscServer *osc_server); }; GType ags_osc_server_get_type(void); gboolean ags_osc_server_test_flags(AgsOscServer *osc_server, guint flags); void ags_osc_server_set_flags(AgsOscServer *osc_server, guint flags); void ags_osc_server_unset_flags(AgsOscServer *osc_server, guint flags); /* fields */ void ags_osc_server_add_connection(AgsOscServer *osc_server, GObject *osc_connection); void ags_osc_server_remove_connection(AgsOscServer *osc_server, GObject *osc_connection); void ags_osc_server_add_controller(AgsOscServer *osc_server, GObject *osc_controller); void ags_osc_server_remove_controller(AgsOscServer *osc_server, GObject *osc_controller); /* default controllers */ void ags_osc_server_add_default_controller(AgsOscServer *osc_server); /* events */ void ags_osc_server_start(AgsOscServer *osc_server); void ags_osc_server_stop(AgsOscServer *osc_server); gboolean ags_osc_server_listen(AgsOscServer *osc_server); void ags_osc_server_dispatch(AgsOscServer *osc_server); /* instance */ AgsOscServer* ags_osc_server_new(); G_END_DECLS #endif /*__AGS_OSC_SERVER_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_file.dtd0000644000175000017500000000331513461636433016364 00000000000000 gsequencer-3.1.3/ags/audio/osc/ags_osc_message.c0000644000175000017500000002715413607210263016536 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_osc_message_class_init(AgsOscMessageClass *osc_message); void ags_osc_message_init(AgsOscMessage *osc_message); void ags_osc_message_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_message_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_message_dispose(GObject *gobject); void ags_osc_message_finalize(GObject *gobject); /** * SECTION:ags_osc_message * @short_description: the OSC server side message * @title: AgsOscMessage * @section_id: * @include: ags/audio/osc/ags_osc_message.h * * #AgsOscMessage your OSC server side message. */ enum{ PROP_0, PROP_OSC_CONNECTION, PROP_TV_SEC, PROP_TV_FRACTION, PROP_IMMEDIATELY, PROP_MESSAGE_SIZE, PROP_MESSAGE, }; static gpointer ags_osc_message_parent_class = NULL; GType ags_osc_message_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_message = 0; static const GTypeInfo ags_osc_message_info = { sizeof (AgsOscMessageClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_message_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscMessage), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_message_init, }; ags_type_osc_message = g_type_register_static(G_TYPE_OBJECT, "AgsOscMessage", &ags_osc_message_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_message); } return g_define_type_id__volatile; } void ags_osc_message_class_init(AgsOscMessageClass *osc_message) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_message_parent_class = g_type_class_peek_parent(osc_message); /* GObjectClass */ gobject = (GObjectClass *) osc_message; gobject->set_property = ags_osc_message_set_property; gobject->get_property = ags_osc_message_get_property; gobject->dispose = ags_osc_message_dispose; gobject->finalize = ags_osc_message_finalize; /* properties */ /** * AgsOscMessage:osc-connection: * * The assigned #AgsOscConnection. * * Since: 3.0.0 */ param_spec = g_param_spec_object("osc-connection", i18n_pspec("assigned OSC connection"), i18n_pspec("The OSC connection it is assigned with"), AGS_TYPE_OSC_CONNECTION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSC_CONNECTION, param_spec); /** * AgsOscMessage:tv-sec: * * The time value in seconds. * * Since: 3.0.0 */ param_spec = g_param_spec_int("tv-sec", i18n_pspec("time value seconds"), i18n_pspec("The time value in seconds"), 0, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TV_SEC, param_spec); /** * AgsOscMessage:tv-fraction: * * The time value's fraction. * * Since: 3.0.0 */ param_spec = g_param_spec_int("tv-fraction", i18n_pspec("time value fraction"), i18n_pspec("The fraction of time value"), 0, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TV_FRACTION, param_spec); /** * AgsOscMessage:immediately: * * The immediately switch. * * Since: 3.0.0 */ param_spec = g_param_spec_boolean("immediately", i18n_pspec("immediately"), i18n_pspec("The immediately switch"), FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IMMEDIATELY, param_spec); /** * AgsOscMessage:message-size: * * The size of message in bytes. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("message-size", i18n_pspec("message size"), i18n_pspec("The size of message"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MESSAGE_SIZE, param_spec); /** * AgsOscMessage:message: * * The message data. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("message", i18n_pspec("message"), i18n_pspec("The IPv6 address of the server"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MESSAGE, param_spec); } void ags_osc_message_init(AgsOscMessage *osc_message) { /* osc message mutex */ g_rec_mutex_init(&(osc_message->obj_mutex)); osc_message->osc_connection = NULL; osc_message->tv_sec = 0; osc_message->tv_fraction = 0; osc_message->immediately = FALSE; osc_message->message_size = 0; osc_message->message = NULL; } void ags_osc_message_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscMessage *osc_message; GRecMutex *osc_message_mutex; osc_message = AGS_OSC_MESSAGE(gobject); /* get osc message mutex */ osc_message_mutex = AGS_OSC_MESSAGE_GET_OBJ_MUTEX(osc_message); switch(prop_id){ case PROP_OSC_CONNECTION: { GObject *osc_connection; osc_connection = g_value_get_object(value); g_rec_mutex_lock(osc_message_mutex); if(osc_message->osc_connection == osc_connection){ g_rec_mutex_unlock(osc_message_mutex); return; } if(osc_message->osc_connection != NULL){ g_object_unref(osc_message->osc_connection); } if(osc_connection != NULL){ g_object_ref(osc_connection); } osc_message->osc_connection = osc_connection; g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_TV_SEC: { gint32 tv_sec; tv_sec = (gint32) g_value_get_int(value); g_rec_mutex_lock(osc_message_mutex); osc_message->tv_sec = tv_sec; g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_TV_FRACTION: { gint32 tv_fraction; tv_fraction = (gint32) g_value_get_int(value); g_rec_mutex_lock(osc_message_mutex); osc_message->tv_fraction = tv_fraction; g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_IMMEDIATELY: { gboolean immediately; immediately = g_value_get_boolean(value); g_rec_mutex_lock(osc_message_mutex); osc_message->immediately = immediately; g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_MESSAGE_SIZE: { guint message_size; message_size = g_value_get_uint(value); g_rec_mutex_lock(osc_message_mutex); osc_message->message_size = message_size; g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_MESSAGE: { guchar *message; message = g_value_get_pointer(value); g_rec_mutex_lock(osc_message_mutex); osc_message->message = message; g_rec_mutex_unlock(osc_message_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_message_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscMessage *osc_message; GRecMutex *osc_message_mutex; osc_message = AGS_OSC_MESSAGE(gobject); /* get osc message mutex */ osc_message_mutex = AGS_OSC_MESSAGE_GET_OBJ_MUTEX(osc_message); switch(prop_id){ case PROP_OSC_CONNECTION: { g_rec_mutex_lock(osc_message_mutex); g_value_set_object(value, osc_message->osc_connection); g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_TV_SEC: { g_rec_mutex_lock(osc_message_mutex); g_value_set_int(value, (gint) osc_message->tv_sec); g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_TV_FRACTION: { g_rec_mutex_lock(osc_message_mutex); g_value_set_int(value, (gint) osc_message->tv_fraction); g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_IMMEDIATELY: { g_rec_mutex_lock(osc_message_mutex); g_value_set_boolean(value, osc_message->immediately); g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_MESSAGE_SIZE: { g_rec_mutex_lock(osc_message_mutex); g_value_set_uint(value, osc_message->message_size); g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_MESSAGE: { g_rec_mutex_lock(osc_message_mutex); g_value_set_pointer(value, osc_message->message); g_rec_mutex_unlock(osc_message_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_message_dispose(GObject *gobject) { AgsOscMessage *osc_message; osc_message = (AgsOscMessage *) gobject; if(osc_message->osc_connection != NULL){ g_object_unref(osc_message->osc_connection); osc_message->osc_connection = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_message_parent_class)->dispose(gobject); } void ags_osc_message_finalize(GObject *gobject) { AgsOscMessage *osc_message; osc_message = (AgsOscMessage *) gobject; if(osc_message->osc_connection != NULL){ g_object_unref(osc_message->osc_connection); } if(osc_message->message != NULL){ free(osc_message->message); } /* call parent */ G_OBJECT_CLASS(ags_osc_message_parent_class)->finalize(gobject); } /** * ags_osc_front_controller_message_sort_func: * @a: the #AgsOscFrontControllerMessage-struct * @b: the other #AgsOscFrontControllerMessage-struct * * Compare @a and @b in view of timing. * * Returns: -1 if @a happens before @b, 0 if at the very same time or 1 if after * * Since: 3.0.0 */ gint ags_osc_message_sort_func(gconstpointer a, gconstpointer b) { AgsOscMessage *message_a, *message_b; if(a == NULL || b == NULL){ return(0); } message_a = a; message_b = b; if(message_a->immediately && message_b->immediately){ return(0); } if(message_a->immediately){ return(-1); } if(message_b->immediately){ return(1); } if(message_a->tv_sec < message_b->tv_sec || (message_a->tv_sec == message_b->tv_sec && message_a->tv_fraction < message_b->tv_fraction)){ return(-1); } if(message_a->tv_sec > message_b->tv_sec || (message_a->tv_sec == message_b->tv_sec && message_a->tv_fraction > message_b->tv_fraction)){ return(1); } return(0); } /** * ags_osc_message_new: * * Creates a new instance of #AgsOscMessage * * Returns: the new #AgsOscMessage * * Since: 3.0.0 */ AgsOscMessage* ags_osc_message_new() { AgsOscMessage *osc_message; osc_message = (AgsOscMessage *) g_object_new(AGS_TYPE_OSC_MESSAGE, NULL); return(osc_message); } gsequencer-3.1.3/ags/audio/osc/ags_osc_client.c0000644000175000017500000010055213622251454016366 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #ifdef __APPLE__ #include #include #endif #include void ags_osc_client_class_init(AgsOscClientClass *osc_client); void ags_osc_client_init(AgsOscClient *osc_client); void ags_osc_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_client_finalize(GObject *gobject); void ags_osc_client_real_resolve(AgsOscClient *osc_client); void ags_osc_client_real_connect(AgsOscClient *osc_client); unsigned char* ags_osc_client_real_read_bytes(AgsOscClient *osc_client, guint *data_length); gboolean ags_osc_client_real_write_bytes(AgsOscClient *osc_client, guchar *data, guint data_length); /** * SECTION:ags_osc_client * @short_description: the OSC client * @title: AgsOscClient * @section_id: * @include: ags/audio/osc/ags_osc_client.h * * #AgsOscClient your OSC client. */ enum{ PROP_0, PROP_DOMAIN, PROP_SERVER_PORT, PROP_IP4, PROP_IP6, }; enum{ RESOLVE, CONNECT, READ_BYTES, WRITE_BYTES, LAST_SIGNAL, }; static gpointer ags_osc_client_parent_class = NULL; static guint osc_client_signals[LAST_SIGNAL]; GType ags_osc_client_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_client = 0; static const GTypeInfo ags_osc_client_info = { sizeof (AgsOscClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscClient), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_client_init, }; ags_type_osc_client = g_type_register_static(G_TYPE_OBJECT, "AgsOscClient", &ags_osc_client_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_client); } return g_define_type_id__volatile; } void ags_osc_client_class_init(AgsOscClientClass *osc_client) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_client_parent_class = g_type_class_peek_parent(osc_client); /* GObjectClass */ gobject = (GObjectClass *) osc_client; gobject->set_property = ags_osc_client_set_property; gobject->get_property = ags_osc_client_get_property; gobject->finalize = ags_osc_client_finalize; /* properties */ /** * AgsOscClient:domain: * * The domain to lookup server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("domain", i18n_pspec("domain"), i18n_pspec("The domain to resolve"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DOMAIN, param_spec); /** * AgsOscClient:server-port: * * The server port to connect. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("server-port", i18n_pspec("server port"), i18n_pspec("The server port to connect"), 0, G_MAXUINT32, AGS_OSC_CLIENT_DEFAULT_SERVER_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SERVER_PORT, param_spec); /** * AgsOscClient:ip4: * * The IPv4 address as string of the server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip4", i18n_pspec("ip4"), i18n_pspec("The IPv4 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP4, param_spec); /** * AgsOscClient:ip6: * * The IPv6 address as string of the server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip6", i18n_pspec("ip6"), i18n_pspec("The IPv6 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP6, param_spec); /* AgsOscClientClass */ osc_client->resolve = ags_osc_client_real_resolve; osc_client->connect = ags_osc_client_real_connect; osc_client->read_bytes = ags_osc_client_real_read_bytes; osc_client->write_bytes = ags_osc_client_real_write_bytes; /* signals */ /** * AgsOscClient::resolve: * @osc_client: the #AgsOscClient * * The ::resolve signal is emited during resolve of domain. * * Since: 3.0.0 */ osc_client_signals[RESOLVE] = g_signal_new("resolve", G_TYPE_FROM_CLASS(osc_client), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscClientClass, resolve), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscClient::connect: * @osc_client: the #AgsOscClient * * The ::connect signal is emited as connection is establishing. * * Since: 3.0.0 */ osc_client_signals[CONNECT] = g_signal_new("connect", G_TYPE_FROM_CLASS(osc_client), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscClientClass, connect), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscClient::read-bytes: * @osc_client: the #AgsOscClient * @data_length: the return location of byte array's length * * The ::read-bytes signal is emited while read bytes. * * Returns: byte array read or %NULL if no data available * * Since: 3.0.0 */ osc_client_signals[READ_BYTES] = g_signal_new("read-bytes", G_TYPE_FROM_CLASS(osc_client), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscClientClass, read_bytes), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER, G_TYPE_POINTER, 1, G_TYPE_POINTER); /** * AgsOscClient::write-bytes: * @osc_client: the #AgsOscClient * @data: the byte array * @data_length: the length of byte array * * The ::write-bytes signal is emited while write bytes. * * Returns: %TRUE if all bytes written, otherwise %FALSE * * Since: 3.0.0 */ osc_client_signals[WRITE_BYTES] = g_signal_new("write-bytes", G_TYPE_FROM_CLASS(osc_client), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscClientClass, write_bytes), NULL, NULL, ags_cclosure_marshal_BOOLEAN__POINTER_UINT, G_TYPE_BOOLEAN, 2, G_TYPE_POINTER, G_TYPE_UINT); } void ags_osc_client_init(AgsOscClient *osc_client) { osc_client->flags = AGS_OSC_CLIENT_INET4; /* osc client mutex */ g_rec_mutex_init(&(osc_client->obj_mutex)); osc_client->ip4 = g_strdup(AGS_OSC_CLIENT_DEFAULT_INET4_ADDRESS); osc_client->ip6 = g_strdup(AGS_OSC_CLIENT_DEFAULT_INET6_ADDRESS); osc_client->domain = g_strdup(AGS_OSC_CLIENT_DEFAULT_DOMAIN); osc_client->server_port = AGS_OSC_CLIENT_DEFAULT_SERVER_PORT; osc_client->ip4_fd = -1; osc_client->ip6_fd = -1; osc_client->ip4_socket = NULL; osc_client->ip6_socket = NULL; osc_client->ip4_address = NULL; osc_client->ip6_address = NULL; osc_client->max_retry_count = AGS_OSC_CLIENT_DEFAULT_MAX_RETRY; osc_client->retry_delay = (struct timespec *) malloc(sizeof(struct timespec)); osc_client->retry_delay->tv_sec = 5; osc_client->retry_delay->tv_nsec = 0; osc_client->start_time = (struct timespec *) malloc(sizeof(struct timespec)); osc_client->start_time->tv_sec = 0; osc_client->start_time->tv_nsec = 0; osc_client->cache_data = (unsigned char *) malloc(AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH * sizeof(unsigned char)); osc_client->cache_data_length = 0; osc_client->buffer = (unsigned char *) malloc(AGS_OSC_CLIENT_CHUNK_SIZE * sizeof(unsigned char)); osc_client->allocated_buffer_size = AGS_OSC_CLIENT_CHUNK_SIZE; osc_client->read_count = 0; osc_client->has_valid_data = 0; osc_client->timeout_delay = (struct timespec *) malloc(sizeof(struct timespec)); osc_client->timeout_delay->tv_sec = 0; osc_client->timeout_delay->tv_nsec = 4000; } void ags_osc_client_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscClient *osc_client; GRecMutex *osc_client_mutex; osc_client = AGS_OSC_CLIENT(gobject); /* get osc client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); switch(prop_id){ case PROP_DOMAIN: { gchar *domain; domain = g_value_get_string(value); g_rec_mutex_lock(osc_client_mutex); if(osc_client->domain == domain){ g_rec_mutex_unlock(osc_client_mutex); return; } g_free(osc_client->domain); osc_client->domain = g_strdup(domain); g_rec_mutex_unlock(osc_client_mutex); } break; case PROP_SERVER_PORT: { guint server_port; server_port = g_value_get_uint(value); g_rec_mutex_lock(osc_client_mutex); osc_client->server_port = server_port; g_rec_mutex_unlock(osc_client_mutex); } break; case PROP_IP4: { gchar *ip4; ip4 = g_value_get_string(value); g_rec_mutex_lock(osc_client_mutex); if(osc_client->ip4 == ip4){ g_rec_mutex_unlock(osc_client_mutex); return; } g_free(osc_client->ip4); osc_client->ip4 = g_strdup(ip4); g_rec_mutex_unlock(osc_client_mutex); } break; case PROP_IP6: { gchar *ip6; ip6 = g_value_get_string(value); g_rec_mutex_lock(osc_client_mutex); if(osc_client->ip6 == ip6){ g_rec_mutex_unlock(osc_client_mutex); return; } g_free(osc_client->ip6); osc_client->ip6 = g_strdup(ip6); g_rec_mutex_unlock(osc_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_client_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscClient *osc_client; GRecMutex *osc_client_mutex; osc_client = AGS_OSC_CLIENT(gobject); /* get osc client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); switch(prop_id){ case PROP_DOMAIN: { g_rec_mutex_lock(osc_client_mutex); g_value_set_string(value, osc_client->domain); g_rec_mutex_unlock(osc_client_mutex); } break; case PROP_SERVER_PORT: { g_rec_mutex_lock(osc_client_mutex); g_value_set_uint(value, osc_client->server_port); g_rec_mutex_unlock(osc_client_mutex); } break; case PROP_IP4: { g_rec_mutex_lock(osc_client_mutex); g_value_set_string(value, osc_client->ip4); g_rec_mutex_unlock(osc_client_mutex); } break; case PROP_IP6: { g_rec_mutex_lock(osc_client_mutex); g_value_set_string(value, osc_client->ip6); g_rec_mutex_unlock(osc_client_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_client_finalize(GObject *gobject) { AgsOscClient *osc_client; osc_client = (AgsOscClient *) gobject; g_free(osc_client->ip4); g_free(osc_client->ip6); if(osc_client->retry_delay != NULL){ free(osc_client->retry_delay); } if(osc_client->start_time != NULL){ free(osc_client->start_time); } if(osc_client->buffer != NULL){ free(osc_client->buffer); } if(osc_client->timeout_delay != NULL){ free(osc_client->timeout_delay); } /* call parent */ G_OBJECT_CLASS(ags_osc_client_parent_class)->finalize(gobject); } /** * ags_osc_client_test_flags: * @osc_client: the #AgsOscClient * @flags: the flags * * Test @flags to be set on @osc_client. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_client_test_flags(AgsOscClient *osc_client, guint flags) { gboolean retval; GRecMutex *osc_client_mutex; if(!AGS_IS_OSC_CLIENT(osc_client)){ return(FALSE); } /* get osc_client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); /* test */ g_rec_mutex_lock(osc_client_mutex); retval = (flags & (osc_client->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(osc_client_mutex); return(retval); } /** * ags_osc_client_set_flags: * @osc_client: the #AgsOscClient * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_client_set_flags(AgsOscClient *osc_client, guint flags) { GRecMutex *osc_client_mutex; if(!AGS_IS_OSC_CLIENT(osc_client)){ return; } /* get osc_client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); /* set flags */ g_rec_mutex_lock(osc_client_mutex); osc_client->flags |= flags; g_rec_mutex_unlock(osc_client_mutex); } /** * ags_osc_client_unset_flags: * @osc_client: the #AgsOscClient * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_client_unset_flags(AgsOscClient *osc_client, guint flags) { GRecMutex *osc_client_mutex; if(!AGS_IS_OSC_CLIENT(osc_client)){ return; } /* get osc_client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); /* set flags */ g_rec_mutex_lock(osc_client_mutex); osc_client->flags &= (~flags); g_rec_mutex_unlock(osc_client_mutex); } void ags_osc_client_real_resolve(AgsOscClient *osc_client) { GResolver *resolver; GList *start_list, *list; gchar *ip4, *ip6; GError *error; GRecMutex *osc_client_mutex; /* get osc client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); resolver = g_resolver_get_default(); /* lock */ g_rec_mutex_lock(osc_client_mutex); #if 0 /* IPv4 */ error = NULL; start_list = g_resolver_lookup_by_name_with_flags(resolver, osc_client->domain, G_RESOLVER_NAME_LOOKUP_FLAGS_IPV4_ONLY, NULL, &error); if(error != NULL){ g_warning("AgsOscClient - %s", error->message); g_error_free(error); } if(start_list != NULL){ osc_client->ip4 = g_inet_address_to_string(start_list->data); g_resolver_free_addresses(start_list); } /* IPv6 */ error = NULL; start_list = g_resolver_lookup_by_name_with_flags(resolver, osc_client->domain, G_RESOLVER_NAME_LOOKUP_FLAGS_IPV6_ONLY, NULL, &error); if(error != NULL){ g_warning("AgsOscClient - %s", error->message); g_error_free(error); } if(start_list != NULL){ osc_client->ip6 = g_inet_address_to_string(start_list->data); g_resolver_free_addresses(start_list); } #else error = NULL; start_list = g_resolver_lookup_by_name(resolver, osc_client->domain, NULL, &error); if(error != NULL){ g_warning("AgsOscClient - %s", error->message); g_error_free(error); } list = start_list; ip4 = NULL; ip6 = NULL; while(list != NULL && (ip4 == NULL || ip6 == NULL)){ guint address_family; g_object_get(list->data, "family", &address_family, NULL); if(address_family == G_SOCKET_FAMILY_IPV4){ ip4 = g_inet_address_to_string(list->data); }else if(address_family == G_SOCKET_FAMILY_IPV6){ ip6 = g_inet_address_to_string(list->data); } list = list->next; } osc_client->ip4 = ip4; osc_client->ip6 = ip6; g_resolver_free_addresses(start_list); #endif /* unlock */ g_rec_mutex_unlock(osc_client_mutex); g_object_unref(resolver); } /** * ags_osc_client_resolve: * @osc_client: the #AgsOscClient * * Resolve OSC client. * * Since: 3.0.0 */ void ags_osc_client_resolve(AgsOscClient *osc_client) { g_return_if_fail(AGS_IS_OSC_CLIENT(osc_client)); g_object_ref((GObject *) osc_client); g_signal_emit(G_OBJECT(osc_client), osc_client_signals[RESOLVE], 0); g_object_unref((GObject *) osc_client); } void ags_osc_client_real_connect(AgsOscClient *osc_client) { gboolean ip4_success, ip6_success; gboolean ip4_udp_success, ip4_tcp_success; gboolean ip6_udp_success, ip6_tcp_success; gboolean ip4_connected, ip6_connected; guint i; GError *error; GRecMutex *osc_client_mutex; /* get osc client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); ip4_success = FALSE; ip6_success = FALSE; ip4_udp_success = FALSE; ip4_tcp_success = FALSE; ip6_udp_success = FALSE; ip6_tcp_success = FALSE; if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_INET4)){ ip4_success = TRUE; if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_UDP)){ ip4_udp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_client_mutex); error = NULL; osc_client->ip4_socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error); osc_client->ip4_fd = g_socket_get_fd(osc_client->ip4_socket); g_rec_mutex_unlock(osc_client_mutex); if(error != NULL){ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } }else if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_TCP)){ ip4_tcp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_client_mutex); error = NULL; osc_client->ip4_socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error); osc_client->ip4_fd = g_socket_get_fd(osc_client->ip4_socket); g_rec_mutex_unlock(osc_client_mutex); if(error != NULL){ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } }else{ g_critical("no flow control type"); } /* get ip4 */ g_rec_mutex_lock(osc_client_mutex); osc_client->ip4_address = g_inet_socket_address_new(g_inet_address_new_from_string(osc_client->ip4), osc_client->server_port); g_rec_mutex_unlock(osc_client_mutex); } if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_INET6)){ ip6_success = TRUE; if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_UDP)){ ip6_udp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_client_mutex); error = NULL; osc_client->ip6_socket = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &error); osc_client->ip6_fd = g_socket_get_fd(osc_client->ip6_socket); g_rec_mutex_unlock(osc_client_mutex); if(error != NULL){ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } }else if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_TCP)){ ip6_tcp_success = TRUE; /* create socket */ g_rec_mutex_lock(osc_client_mutex); error = NULL; osc_client->ip6_socket = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error); osc_client->ip6_fd = g_socket_get_fd(osc_client->ip6_socket); g_rec_mutex_unlock(osc_client_mutex); if(error != NULL){ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } }else{ g_critical("no flow control type"); } /* get ip6 */ g_rec_mutex_lock(osc_client_mutex); osc_client->ip6_address = g_inet_socket_address_new(g_inet_address_new_from_string(osc_client->ip6), osc_client->server_port); g_rec_mutex_unlock(osc_client_mutex); } if(!ip4_success && !ip6_success){ g_critical("no protocol family"); return; } if(!ip4_udp_success && !ip4_tcp_success && !ip6_udp_success && !ip6_tcp_success){ return; } if(osc_client->ip4_fd != -1){ //TODO:JK: check remove #if 0 int flags; flags = fcntl(osc_client->ip4_fd, F_GETFL, 0); fcntl(osc_client->ip4_fd, F_SETFL, flags | O_NONBLOCK); #else // g_object_set(osc_client->ip4_socket, // "blocking", FALSE, // NULL); #endif } if(osc_client->ip6_fd != -1){ //TODO:JK: check remove #if 0 int flags; flags = fcntl(osc_client->ip6_fd, F_GETFL, 0); fcntl(osc_client->ip6_fd, F_SETFL, flags | O_NONBLOCK); #else // g_object_set(osc_client->ip6_socket, // "blocking", FALSE, // NULL); #endif } ip4_connected = FALSE; ip6_connected = FALSE; i = 0; while(((ip4_udp_success || ip4_tcp_success) && !ip4_connected) || ((ip6_udp_success || ip6_tcp_success) && !ip6_connected)){ if(!ip4_connected){ if(ip4_udp_success || ip4_tcp_success){ int rc; /* connect */ g_rec_mutex_lock(osc_client_mutex); error = NULL; g_socket_connect(osc_client->ip4_socket, osc_client->ip4_address, NULL, &error); g_rec_mutex_unlock(osc_client_mutex); if(error == NULL){ ip4_connected = TRUE; }else{ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } } } if(!ip6_connected){ if(ip6_udp_success || ip6_tcp_success){ int rc; /* connect */ g_rec_mutex_lock(osc_client_mutex); error = NULL; g_socket_connect(osc_client->ip6_socket, osc_client->ip6_address, NULL, &error); g_rec_mutex_unlock(osc_client_mutex); if(error == NULL){ ip6_connected = TRUE; }else{ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } } } if(i >= osc_client->max_retry_count){ break; } nanosleep(osc_client->retry_delay, NULL); i++; } if(!ip4_connected && !ip6_connected){ g_message("failed to connect to server"); } } /** * ags_osc_client_connect: * @osc_client: the #AgsOscClient * * Connect OSC client. * * Since: 3.0.0 */ void ags_osc_client_connect(AgsOscClient *osc_client) { g_return_if_fail(AGS_IS_OSC_CLIENT(osc_client)); g_object_ref((GObject *) osc_client); g_signal_emit(G_OBJECT(osc_client), osc_client_signals[CONNECT], 0); g_object_unref((GObject *) osc_client); } unsigned char* ags_osc_client_real_read_bytes(AgsOscClient *osc_client, guint *data_length) { GSocket *socket; unsigned char *buffer; unsigned char data[AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH]; guint allocated_buffer_size; guint read_count; int retval; guint available_data_length; gint64 start_data, end_data; int ip4_fd, ip6_fd; int fd; guint i, j; gboolean has_valid_data; gboolean success; #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif GError *error; GRecMutex *osc_client_mutex; /* get osc_client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); /* get fd */ g_rec_mutex_lock(osc_client_mutex); #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); osc_client->start_time->tv_sec = mts.tv_sec; osc_client->start_time->tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, osc_client->start_time); #endif ip4_fd = osc_client->ip4_fd; ip6_fd = osc_client->ip6_fd; buffer = osc_client->buffer; allocated_buffer_size = osc_client->allocated_buffer_size; read_count = osc_client->read_count; has_valid_data = osc_client->has_valid_data; if(ip4_fd != -1){ fd = ip4_fd; socket = osc_client->ip4_socket; }else{ fd = ip6_fd; socket = osc_client->ip6_socket; } g_rec_mutex_unlock(osc_client_mutex); if(fd == -1){ if(data_length != NULL){ *data_length = 0; } return(NULL); } /* */ start_data = -1; end_data = -1; j = 0; while(TRUE){ gboolean has_expired; g_rec_mutex_lock(osc_client_mutex); has_expired = ags_time_timeout_expired(osc_client->start_time, osc_client->timeout_delay); g_rec_mutex_unlock(osc_client_mutex); if(has_expired){ break; } available_data_length = 0; if(osc_client->cache_data_length > 0){ memcpy(data, osc_client->cache_data, osc_client->cache_data_length * sizeof(unsigned char)); available_data_length += osc_client->cache_data_length; } retval = 0; g_rec_mutex_lock(osc_client_mutex); if(osc_client->cache_data_length < AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH){ error = NULL; retval = g_socket_receive(socket, data + osc_client->cache_data_length, AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH - osc_client->cache_data_length, NULL, &error); if(retval > 0){ available_data_length += retval; } } osc_client->cache_data_length = 0; g_rec_mutex_unlock(osc_client_mutex); if(error != NULL){ if(!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ g_critical("AgsOscClient - %s", error->message); } g_error_free(error); if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ if(available_data_length == 0){ continue; } }else{ if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CONNECTION_CLOSED)){ g_rec_mutex_lock(osc_client_mutex); error = NULL; g_socket_close(socket, &error); g_object_unref(socket); if(ip4_fd == fd){ osc_client->ip4_fd = -1; osc_client->ip4_socket = NULL; }else if(ip6_fd == fd){ osc_client->ip6_fd = -1; osc_client->ip6_socket = NULL; } g_rec_mutex_unlock(osc_client_mutex); break; } } } if(available_data_length == 0){ continue; } success = FALSE; if(start_data == -1 && read_count == 0){ for(i = 0; i < available_data_length; i++){ if(data[i] == AGS_OSC_UTIL_SLIP_END){ success = TRUE; break; } } } if(success){ start_data = i; ags_osc_client_read_bytes_REPEAT_0: success = FALSE; for(i = start_data + 1; i < available_data_length; i++){ if(data[i] == AGS_OSC_UTIL_SLIP_END){ success = TRUE; break; } } if(success){ end_data = i; if(start_data + 1 == end_data){ gboolean has_expired; start_data = end_data; j++; g_rec_mutex_lock(osc_client_mutex); has_expired = ags_time_timeout_expired(osc_client->start_time, osc_client->timeout_delay); g_rec_mutex_unlock(osc_client_mutex); if(j < 2 || !has_expired){ goto ags_osc_client_read_bytes_REPEAT_0; }else{ break; } } g_rec_mutex_lock(osc_client_mutex); memcpy(osc_client->buffer, data + start_data, (end_data - start_data + 1) * sizeof(unsigned char)); g_rec_mutex_unlock(osc_client_mutex); if(data_length != NULL){ data_length[0] = end_data - start_data + 1; } /* fill cache */ if(end_data > 0 && end_data < available_data_length){ memcpy(osc_client->cache_data, data + end_data, (available_data_length - end_data) * sizeof(unsigned char)); osc_client->cache_data_length = available_data_length - end_data; } osc_client->read_count = 0; osc_client->has_valid_data = FALSE; return(osc_client->buffer); }else{ read_count += (available_data_length - start_data); g_rec_mutex_lock(osc_client_mutex); memcpy(osc_client->buffer, data + start_data, (available_data_length - start_data) * sizeof(unsigned char)); g_rec_mutex_unlock(osc_client_mutex); has_valid_data = TRUE; continue; } }else{ if(has_valid_data){ success = FALSE; for(i = 0; i < available_data_length; i++){ if(data[i] == AGS_OSC_UTIL_SLIP_END){ success = TRUE; break; } } if(success){ if(read_count + i >= AGS_OSC_CLIENT_CHUNK_SIZE){ if(data_length != NULL){ *data_length = 0; } osc_client->read_count = 0; osc_client->has_valid_data = FALSE; return(NULL); } g_rec_mutex_lock(osc_client_mutex); memcpy(osc_client->buffer + read_count, data, (i + 1) * sizeof(unsigned char)); g_rec_mutex_unlock(osc_client_mutex); read_count += i; if(data_length != NULL){ data_length[0] = read_count + 1; } /* fill cache */ if(i < available_data_length){ memcpy(osc_client->cache_data, data + i, (available_data_length - i) * sizeof(unsigned char)); osc_client->cache_data_length = available_data_length - i; } osc_client->read_count = 0; osc_client->has_valid_data = FALSE; return(osc_client->buffer); }else{ if(read_count + available_data_length >= AGS_OSC_CLIENT_CHUNK_SIZE){ if(data_length != NULL){ *data_length = 0; } osc_client->read_count = 0; osc_client->has_valid_data = FALSE; return(NULL); } g_rec_mutex_lock(osc_client_mutex); memcpy(osc_client->buffer + read_count, data, (available_data_length) * sizeof(unsigned char)); g_rec_mutex_unlock(osc_client_mutex); read_count += available_data_length; continue; } } } } osc_client->read_count = read_count; osc_client->has_valid_data = has_valid_data; if(data_length != NULL){ *data_length = 0; } return(NULL); } /** * ags_osc_client_read_bytes: * @osc_client: the #AgsOscClient * @data_length: the return location of byte array's length * * Read bytes. * * Returns: byte array read or %NULL if no data available * * Since: 3.0.0 */ unsigned char* ags_osc_client_read_bytes(AgsOscClient *osc_client, guint *data_length) { unsigned char *buffer; g_return_val_if_fail(AGS_IS_OSC_CLIENT(osc_client), NULL); g_object_ref((GObject *) osc_client); g_signal_emit(G_OBJECT(osc_client), osc_client_signals[READ_BYTES], 0, data_length, &buffer); g_object_unref((GObject *) osc_client); return(buffer); } gboolean ags_osc_client_real_write_bytes(AgsOscClient *osc_client, guchar *data, guint data_length) { int ip4_fd, ip6_fd; int num_write; gboolean success; GError *error; GRecMutex *osc_client_mutex; /* get osc client mutex */ osc_client_mutex = AGS_OSC_CLIENT_GET_OBJ_MUTEX(osc_client); /* initialize success */ success = TRUE; /* get fd */ g_rec_mutex_lock(osc_client_mutex); ip4_fd = osc_client->ip4_fd; ip6_fd = osc_client->ip6_fd; g_rec_mutex_unlock(osc_client_mutex); /* write on IPv4 socket */ if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_INET4)){ g_rec_mutex_lock(osc_client_mutex); num_write = 0; error = NULL; if(osc_client->ip4_socket != NULL){ num_write = g_socket_send(osc_client->ip4_socket, data, data_length, NULL, &error); } g_rec_mutex_unlock(osc_client_mutex); if(num_write != data_length){ success = FALSE; } if(error != NULL){ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } } /* write on IPv6 socket */ if(ags_osc_client_test_flags(osc_client, AGS_OSC_CLIENT_INET6)){ g_rec_mutex_lock(osc_client_mutex); num_write = 0; error = NULL; if(osc_client->ip6_socket != NULL){ num_write = g_socket_send(osc_client->ip6_socket, data, data_length, NULL, &error); } g_rec_mutex_unlock(osc_client_mutex); if(num_write != data_length){ success = FALSE; } if(error != NULL){ g_critical("AgsOscClient - %s", error->message); g_error_free(error); } } return(success); } /** * ags_osc_client_write_bytes: * @osc_client: the #AgsOscClient * @data: the byte array * @data_length: the length of byte array * * Write @data using OSC client. * * Returns: %TRUE if all bytes written, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_osc_client_write_bytes(AgsOscClient *osc_client, guchar *data, guint data_length) { gboolean success; g_return_val_if_fail(AGS_IS_OSC_CLIENT(osc_client), FALSE); g_object_ref((GObject *) osc_client); g_signal_emit(G_OBJECT(osc_client), osc_client_signals[WRITE_BYTES], 0, data, data_length, &success); g_object_unref((GObject *) osc_client); return(success); } /** * ags_osc_client_new: * * Creates a new instance of #AgsOscClient * * Returns: the new #AgsOscClient * * Since: 3.0.0 */ AgsOscClient* ags_osc_client_new() { AgsOscClient *osc_client; osc_client = (AgsOscClient *) g_object_new(AGS_TYPE_OSC_CLIENT, NULL); return(osc_client); } gsequencer-3.1.3/ags/audio/osc/ags_osc_websocket_connection.c0000644000175000017500000004043513607210263021314 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_websocket_connection_class_init(AgsOscWebsocketConnectionClass *osc_websocket_connection); void ags_osc_websocket_connection_init(AgsOscWebsocketConnection *osc_websocket_connection); void ags_osc_websocket_connection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_websocket_connection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_websocket_connection_dispose(GObject *gobject); void ags_osc_websocket_connection_finalize(GObject *gobject); gint64 ags_osc_websocket_connection_write_response(AgsOscWebsocketConnection *osc_websocket_connection, GObject *osc_response); /** * SECTION:ags_osc_websocket_connection * @short_description: the OSC server side WebSockets connection * @title: AgsOscWebsocketConnection * @section_id: * @include: ags/audio/osc/ags_osc_websocket_connection.h * * #AgsOscWebsocketConnection your OSC server side websocket_connection. */ enum{ PROP_0, PROP_WEBSOCKET_CONNECTION, PROP_SECURITY_CONTEXT, PROP_LOGIN, PROP_SECURITY_TOKEN, PROP_RESOURCE_ID, }; static gpointer ags_osc_websocket_connection_parent_class = NULL; GType ags_osc_websocket_connection_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_websocket_connection = 0; static const GTypeInfo ags_osc_websocket_connection_info = { sizeof (AgsOscWebsocketConnectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_websocket_connection_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscWebsocketConnection), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_websocket_connection_init, }; ags_type_osc_websocket_connection = g_type_register_static(AGS_TYPE_OSC_CONNECTION, "AgsOscWebsocketConnection", &ags_osc_websocket_connection_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_websocket_connection); } return g_define_type_id__volatile; } void ags_osc_websocket_connection_class_init(AgsOscWebsocketConnectionClass *osc_websocket_connection) { GObjectClass *gobject; AgsOscConnectionClass *osc_connection; GParamSpec *param_spec; ags_osc_websocket_connection_parent_class = g_type_class_peek_parent(osc_websocket_connection); /* GObjectClass */ gobject = (GObjectClass *) osc_websocket_connection; gobject->set_property = ags_osc_websocket_connection_set_property; gobject->get_property = ags_osc_websocket_connection_get_property; gobject->dispose = ags_osc_websocket_connection_dispose; gobject->finalize = ags_osc_websocket_connection_finalize; /* properties */ /** * AgsOscWebsocketConnection:websocket-connection: * * The assigned #SoupMessage. * * Since: 3.0.0 */ param_spec = g_param_spec_object("websocket-connection", i18n_pspec("assigned websocket connection"), i18n_pspec("The websocket connection it is assigned with"), SOUP_TYPE_WEBSOCKET_CONNECTION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WEBSOCKET_CONNECTION, param_spec); /** * AgsOscWebsocketConnection:security-context: * * The assigned #AgsSecurityContext. * * Since: 3.0.0 */ param_spec = g_param_spec_object("security-context", i18n_pspec("assigned security context"), i18n_pspec("The security context it is assigned with"), AGS_TYPE_SECURITY_CONTEXT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SECURITY_CONTEXT, param_spec); /** * AgsOscWebsocketConnection:login: * * The current login. * * Since: 3.0.0 */ param_spec = g_param_spec_string("login", i18n_pspec("login"), i18n_pspec("The current login"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOGIN, param_spec); /** * AgsOscWebsocketConnection:security-token: * * The current security token. * * Since: 3.0.0 */ param_spec = g_param_spec_string("security-token", i18n_pspec("security token"), i18n_pspec("The current security token"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SECURITY_TOKEN, param_spec); /** * AgsOscWebsocketConnection:resource-id: * * The resource ID from a redirect. * * Since: 3.0.0 */ param_spec = g_param_spec_string("resource-id", i18n_pspec("resource ID"), i18n_pspec("The resource ID from a redirect"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RESOURCE_ID, param_spec); /* AgsOscConnectionClass */ osc_connection = (AgsOscConnection *) osc_websocket_connection; osc_connection->read_bytes = NULL; osc_connection->write_response = ags_osc_websocket_connection_write_response; osc_connection->close = NULL; /* signals */ } void ags_osc_websocket_connection_init(AgsOscWebsocketConnection *osc_websocket_connection) { osc_websocket_connection->websocket_connection = NULL; osc_websocket_connection->security_context = NULL; osc_websocket_connection->login = NULL; osc_websocket_connection->security_token = NULL; osc_websocket_connection->resource_id = NULL; } void ags_osc_websocket_connection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscWebsocketConnection *osc_websocket_connection; GRecMutex *osc_connection_mutex; osc_websocket_connection = AGS_OSC_WEBSOCKET_CONNECTION(gobject); /* get osc connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_websocket_connection); switch(prop_id){ case PROP_WEBSOCKET_CONNECTION: { GObject *websocket_connection; websocket_connection = g_value_get_object(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_websocket_connection->websocket_connection == websocket_connection){ g_rec_mutex_unlock(osc_connection_mutex); return; } if(osc_websocket_connection->websocket_connection != NULL){ g_object_unref(osc_websocket_connection->websocket_connection); } if(websocket_connection != NULL){ g_object_ref(websocket_connection); } osc_websocket_connection->websocket_connection = websocket_connection; g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_SECURITY_CONTEXT: { GObject *security_context; security_context = g_value_get_object(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_websocket_connection->security_context == security_context){ g_rec_mutex_unlock(osc_connection_mutex); return; } if(osc_websocket_connection->security_context != NULL){ g_object_unref(osc_websocket_connection->security_context); } if(security_context != NULL){ g_object_ref(security_context); } osc_websocket_connection->security_context = security_context; g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_LOGIN: { gchar *login; login = g_value_get_string(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_websocket_connection->login == login){ g_rec_mutex_unlock(osc_connection_mutex); return; } g_free(osc_websocket_connection->login); osc_websocket_connection->login = g_strdup(login); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_SECURITY_TOKEN: { gchar *security_token; security_token = g_value_get_string(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_websocket_connection->security_token == security_token){ g_rec_mutex_unlock(osc_connection_mutex); return; } g_free(osc_websocket_connection->security_token); osc_websocket_connection->security_token = g_strdup(security_token); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_RESOURCE_ID: { gchar *resource_id; resource_id = g_value_get_string(value); g_rec_mutex_lock(osc_connection_mutex); if(resource_id == osc_websocket_connection->resource_id){ g_rec_mutex_unlock(osc_connection_mutex); return; } g_free(osc_websocket_connection->resource_id); osc_websocket_connection->resource_id = g_strdup(resource_id); g_rec_mutex_unlock(osc_connection_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_websocket_connection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscWebsocketConnection *osc_websocket_connection; GRecMutex *osc_connection_mutex; osc_websocket_connection = AGS_OSC_WEBSOCKET_CONNECTION(gobject); /* get osc connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_websocket_connection); switch(prop_id){ case PROP_WEBSOCKET_CONNECTION: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_object(value, osc_websocket_connection->websocket_connection); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_SECURITY_CONTEXT: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_object(value, osc_websocket_connection->security_context); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_LOGIN: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_string(value, osc_websocket_connection->login); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_SECURITY_TOKEN: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_string(value, osc_websocket_connection->security_token); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_RESOURCE_ID: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_string(value, osc_websocket_connection->resource_id); g_rec_mutex_unlock(osc_connection_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_websocket_connection_dispose(GObject *gobject) { AgsOscWebsocketConnection *osc_websocket_connection; osc_websocket_connection = (AgsOscWebsocketConnection *) gobject; if(osc_websocket_connection->websocket_connection != NULL){ g_object_unref(osc_websocket_connection->websocket_connection); osc_websocket_connection->websocket_connection = NULL; } if(osc_websocket_connection->security_context != NULL){ g_object_unref(osc_websocket_connection->security_context); osc_websocket_connection->security_context = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_websocket_connection_parent_class)->dispose(gobject); } void ags_osc_websocket_connection_finalize(GObject *gobject) { AgsOscWebsocketConnection *osc_websocket_connection; osc_websocket_connection = (AgsOscWebsocketConnection *) gobject; if(osc_websocket_connection->websocket_connection != NULL){ g_object_unref(osc_websocket_connection->websocket_connection); } if(osc_websocket_connection->security_context != NULL){ g_object_unref(osc_websocket_connection->security_context); } g_free(osc_websocket_connection->login); g_free(osc_websocket_connection->security_token); g_free(osc_websocket_connection->resource_id); /* call parent */ G_OBJECT_CLASS(ags_osc_websocket_connection_parent_class)->finalize(gobject); } gint64 ags_osc_websocket_connection_write_response(AgsOscWebsocketConnection *osc_websocket_connection, GObject *osc_response) { SoupWebsocketConnection *websocket_connection; GIOStream *stream; GOutputStream *output_stream; xmlDoc *doc; xmlNode *root_node; xmlNode *osc_packet_node_list; xmlNode *osc_packet_node; gchar *data; xmlChar *buffer; int buffer_length; GError *error; GRecMutex *osc_response_mutex; if(!AGS_IS_OSC_RESPONSE(osc_response)){ return(-1); } g_object_get(osc_websocket_connection, "websocket-connection", &websocket_connection, NULL); if(websocket_connection == NULL){ return(-1); } /* get osc response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); /* create XML doc */ doc = xmlNewDoc(BAD_CAST XML_DEFAULT_VERSION); root_node = xmlNewNode(NULL, BAD_CAST "ags-osc-over-xmlrpc"); xmlDocSetRootElement(doc, root_node); osc_packet_node_list = xmlNewNode(NULL, BAD_CAST "ags-osc-packet-list"); xmlAddChild(root_node, osc_packet_node_list); osc_packet_node = xmlNewNode(NULL, BAD_CAST "ags-osc-packet"); /* encode OSC packet */ g_rec_mutex_lock(osc_response_mutex); data = g_base64_encode(AGS_OSC_RESPONSE(osc_response)->packet, AGS_OSC_RESPONSE(osc_response)->packet_size); g_rec_mutex_unlock(osc_response_mutex); xmlNodeSetContent(osc_packet_node, data); xmlAddChild(osc_packet_node_list, osc_packet_node); xmlDocDumpFormatMemoryEnc(doc, &buffer, &buffer_length, "UTF-8", TRUE); xmlFreeDoc(doc); g_rec_mutex_lock(osc_response_mutex); soup_websocket_connection_send_text(websocket_connection, buffer); g_rec_mutex_unlock(osc_response_mutex); g_object_unref(websocket_connection); xmlFree(buffer); return((gint64) buffer_length); } /** * ags_osc_websocket_connection_find_resource_id: * @osc_websocket_connection: (element-type AgsAudio.OscWebsocketConnection) (transfer none): the #GList-struct containing #AgsOscWebsocketConnection * @resource_id: the resource id * * Find @resource_id in @osc_websocket_connection. * * Returns: (element-type AgsAudio.OscWebsocketConnection) (transfer none): the next matchine #GList-struct or %NULL * * Since: 3.0.0 */ GList* ags_osc_websocket_connection_find_resource_id(GList *osc_websocket_connection, gchar *resource_id) { gchar *current_resource_id; gboolean success; if(osc_websocket_connection == NULL || resource_id == NULL){ return(NULL); } while(osc_websocket_connection != NULL){ g_object_get(osc_websocket_connection->data, "resource-id", ¤t_resource_id, NULL); success = (!g_strcmp0(resource_id, current_resource_id)) ? TRUE: FALSE; g_free(current_resource_id); if(success){ break; } /* iterate */ osc_websocket_connection = osc_websocket_connection->next; } return(osc_websocket_connection); } /** * ags_osc_websocket_connection_new: * @osc_server: the #AgsOscServer * * Creates a new instance of #AgsOscWebsocketConnection * * Returns: the new #AgsOscWebsocketConnection * * Since: 3.0.0 */ AgsOscWebsocketConnection* ags_osc_websocket_connection_new(GObject *osc_server) { AgsOscWebsocketConnection *osc_websocket_connection; osc_websocket_connection = (AgsOscWebsocketConnection *) g_object_new(AGS_TYPE_OSC_WEBSOCKET_CONNECTION, "osc-server", osc_server, NULL); return(osc_websocket_connection); } gsequencer-3.1.3/ags/audio/osc/ags_osc_connection.c0000644000175000017500000006555413622252176017265 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #ifdef __APPLE__ #include #include #endif #if defined(AGS_W32API) #include #endif #include void ags_osc_connection_class_init(AgsOscConnectionClass *osc_connection); void ags_osc_connection_init(AgsOscConnection *osc_connection); void ags_osc_connection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_connection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_connection_dispose(GObject *gobject); void ags_osc_connection_finalize(GObject *gobject); guchar* ags_osc_connection_real_read_bytes(AgsOscConnection *osc_connection, guint *data_length); gint64 ags_osc_connection_real_write_response(AgsOscConnection *osc_connection, GObject *osc_response); void ags_osc_connection_real_close(AgsOscConnection *osc_connection); /** * SECTION:ags_osc_connection * @short_description: the OSC server side connection * @title: AgsOscConnection * @section_id: * @include: ags/audio/osc/ags_osc_connection.h * * #AgsOscConnection your OSC server side connection. */ enum{ PROP_0, PROP_OSC_SERVER, PROP_IP4, PROP_IP6, }; enum{ READ_BYTES, WRITE_RESPONSE, CLOSE, LAST_SIGNAL, }; static gpointer ags_osc_connection_parent_class = NULL; static guint osc_connection_signals[LAST_SIGNAL]; GType ags_osc_connection_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_connection = 0; static const GTypeInfo ags_osc_connection_info = { sizeof (AgsOscConnectionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_connection_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscConnection), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_connection_init, }; ags_type_osc_connection = g_type_register_static(G_TYPE_OBJECT, "AgsOscConnection", &ags_osc_connection_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_connection); } return g_define_type_id__volatile; } void ags_osc_connection_class_init(AgsOscConnectionClass *osc_connection) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_connection_parent_class = g_type_class_peek_parent(osc_connection); /* GObjectClass */ gobject = (GObjectClass *) osc_connection; gobject->set_property = ags_osc_connection_set_property; gobject->get_property = ags_osc_connection_get_property; gobject->dispose = ags_osc_connection_dispose; gobject->finalize = ags_osc_connection_finalize; /* properties */ /** * AgsOscConnection:osc-server: * * The assigned #AgsOscServer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("osc-server", i18n_pspec("assigned OSC server"), i18n_pspec("The OSC server it is assigned with"), AGS_TYPE_OSC_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSC_SERVER, param_spec); /** * AgsOscConnection:ip4: * * The IPv4 address as string of the server connection. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip4", i18n_pspec("ip4"), i18n_pspec("The IPv4 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP4, param_spec); /** * AgsOscConnection:ip6: * * The IPv6 address as string of the server connection. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip6", i18n_pspec("ip6"), i18n_pspec("The IPv6 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP6, param_spec); /* AgsOscConnectionClass */ osc_connection->read_bytes = ags_osc_connection_real_read_bytes; osc_connection->write_response = ags_osc_connection_real_write_response; osc_connection->close = ags_osc_connection_real_close; /* signals */ /** * AgsOscConnection::read-bytes: * @osc_connection: the #AgsOscConnection * @data_length: the return location of byte array's length * * The ::read-bytes signal is emited while read bytes. * * Returns: byte array read or %NULL if no data available * * Since: 3.0.0 */ osc_connection_signals[READ_BYTES] = g_signal_new("read-bytes", G_TYPE_FROM_CLASS(osc_connection), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscConnectionClass, read_bytes), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER, G_TYPE_POINTER, 1, G_TYPE_POINTER); /** * AgsOscConnection::write-response: * @osc_connection: the #AgsOscConnection * @osc_response: the #AgsOscResponse * * The ::write-response signal is emited while write response. * * Returns: the count bytes written * * Since: 3.0.0 */ osc_connection_signals[WRITE_RESPONSE] = g_signal_new("write-response", G_TYPE_FROM_CLASS(osc_connection), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscConnectionClass, write_response), NULL, NULL, ags_cclosure_marshal_INT64__OBJECT, G_TYPE_INT64, 1, G_TYPE_OBJECT); /** * AgsOscConnection::close: * @osc_connection: the #AgsOscConnection * * The ::close signal is emited as closing the file descriptor. * * Since: 3.0.0 */ osc_connection_signals[CLOSE] = g_signal_new("close", G_TYPE_FROM_CLASS(osc_connection), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscConnectionClass, close), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_osc_connection_init(AgsOscConnection *osc_connection) { #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif osc_connection->flags = AGS_OSC_CONNECTION_INET4; /* osc connection mutex */ g_rec_mutex_init(&(osc_connection->obj_mutex)); osc_connection->ip4 = NULL; osc_connection->ip6 = NULL; osc_connection->fd = -1; osc_connection->socket = NULL; osc_connection->start_time = (struct timespec *) malloc(sizeof(struct timespec)); osc_connection->start_time->tv_sec = 0; osc_connection->start_time->tv_nsec = 0; osc_connection->cache_data = (guchar *) malloc(AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH * sizeof(guchar)); osc_connection->cache_data_length = 0; osc_connection->buffer = (guchar *) malloc(AGS_OSC_CONNECTION_CHUNK_SIZE * sizeof(guchar)); osc_connection->allocated_buffer_size = AGS_OSC_CONNECTION_CHUNK_SIZE; osc_connection->read_count = 0; osc_connection->has_valid_data = FALSE; osc_connection->timeout_delay = (struct timespec *) malloc(sizeof(struct timespec)); osc_connection->timeout_delay->tv_sec = 0; osc_connection->timeout_delay->tv_nsec = 4000; osc_connection->timestamp = (struct timespec *) malloc(sizeof(struct timespec)); osc_connection->timestamp->tv_sec = 0; osc_connection->timestamp->tv_nsec = 0; #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); osc_connection->timestamp->tv_sec = mts.tv_sec; osc_connection->timestamp->tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, osc_connection->timestamp); #endif } void ags_osc_connection_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscConnection *osc_connection; GRecMutex *osc_connection_mutex; osc_connection = AGS_OSC_CONNECTION(gobject); /* get osc connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); switch(prop_id){ case PROP_OSC_SERVER: { GObject *osc_server; osc_server = g_value_get_object(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_connection->osc_server == osc_server){ g_rec_mutex_unlock(osc_connection_mutex); return; } if(osc_connection->osc_server != NULL){ g_object_unref(osc_connection->osc_server); } if(osc_server != NULL){ g_object_ref(osc_server); } osc_connection->osc_server = osc_server; g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_IP4: { gchar *ip4; ip4 = g_value_get_string(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_connection->ip4 == ip4){ g_rec_mutex_unlock(osc_connection_mutex); return; } g_free(osc_connection->ip4); osc_connection->ip4 = g_strdup(ip4); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_IP6: { gchar *ip6; ip6 = g_value_get_string(value); g_rec_mutex_lock(osc_connection_mutex); if(osc_connection->ip6 == ip6){ g_rec_mutex_unlock(osc_connection_mutex); return; } g_free(osc_connection->ip6); osc_connection->ip6 = g_strdup(ip6); g_rec_mutex_unlock(osc_connection_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_connection_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscConnection *osc_connection; GRecMutex *osc_connection_mutex; osc_connection = AGS_OSC_CONNECTION(gobject); /* get osc connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); switch(prop_id){ case PROP_OSC_SERVER: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_object(value, osc_connection->osc_server); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_IP4: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_string(value, osc_connection->ip4); g_rec_mutex_unlock(osc_connection_mutex); } break; case PROP_IP6: { g_rec_mutex_lock(osc_connection_mutex); g_value_set_string(value, osc_connection->ip6); g_rec_mutex_unlock(osc_connection_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_connection_dispose(GObject *gobject) { AgsOscConnection *osc_connection; osc_connection = (AgsOscConnection *) gobject; if(osc_connection->osc_server != NULL){ g_object_unref(osc_connection->osc_server); osc_connection->osc_server = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_connection_parent_class)->dispose(gobject); } void ags_osc_connection_finalize(GObject *gobject) { AgsOscConnection *osc_connection; osc_connection = (AgsOscConnection *) gobject; if(osc_connection->osc_server != NULL){ g_object_unref(osc_connection->osc_server); } g_free(osc_connection->ip4); g_free(osc_connection->ip6); if(osc_connection->start_time != NULL){ free(osc_connection->start_time); } if(osc_connection->timeout_delay != NULL){ free(osc_connection->timeout_delay); } if(osc_connection->timestamp != NULL){ free(osc_connection->timestamp); } /* call parent */ G_OBJECT_CLASS(ags_osc_connection_parent_class)->finalize(gobject); } /** * ags_osc_connection_test_flags: * @osc_connection: the #AgsOscConnection * @flags: the flags * * Test @flags to be set on @osc_connection. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_osc_connection_test_flags(AgsOscConnection *osc_connection, guint flags) { gboolean retval; GRecMutex *osc_connection_mutex; if(!AGS_IS_OSC_CONNECTION(osc_connection)){ return(FALSE); } /* get osc_connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); /* test */ g_rec_mutex_lock(osc_connection_mutex); retval = (flags & (osc_connection->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(osc_connection_mutex); return(retval); } /** * ags_osc_connection_set_flags: * @osc_connection: the #AgsOscConnection * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_osc_connection_set_flags(AgsOscConnection *osc_connection, guint flags) { GRecMutex *osc_connection_mutex; if(!AGS_IS_OSC_CONNECTION(osc_connection)){ return; } /* get osc_connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); /* set flags */ g_rec_mutex_lock(osc_connection_mutex); osc_connection->flags |= flags; g_rec_mutex_unlock(osc_connection_mutex); } /** * ags_osc_connection_unset_flags: * @osc_connection: the #AgsOscConnection * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_osc_connection_unset_flags(AgsOscConnection *osc_connection, guint flags) { GRecMutex *osc_connection_mutex; if(!AGS_IS_OSC_CONNECTION(osc_connection)){ return; } /* get osc_connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); /* set flags */ g_rec_mutex_lock(osc_connection_mutex); osc_connection->flags &= (~flags); g_rec_mutex_unlock(osc_connection_mutex); } /** * ags_osc_connection_timeout_expired: * @start_time: the start time #timespec-struct * @timeout_delay: the delay #timespec-struct * * Check @start_time plus @timeout_delay against current time. * * Returns: %TRUE if timeout expired, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_osc_connection_timeout_expired(struct timespec *start_time, struct timespec *timeout_delay) { struct timespec current_time; struct timespec deadline; #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif if(start_time == NULL || timeout_delay == NULL){ return(TRUE); } #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); current_time.tv_sec = mts.tv_sec; current_time.tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, ¤t_time); #endif if(start_time->tv_nsec + timeout_delay->tv_nsec > AGS_NSEC_PER_SEC){ deadline.tv_sec = start_time->tv_sec + timeout_delay->tv_sec + 1; deadline.tv_nsec = (start_time->tv_nsec + timeout_delay->tv_nsec) - AGS_NSEC_PER_SEC; }else{ deadline.tv_sec = start_time->tv_sec + timeout_delay->tv_sec; deadline.tv_nsec = start_time->tv_nsec + timeout_delay->tv_nsec; } if(current_time.tv_sec > deadline.tv_sec){ return(TRUE); }else{ if(current_time.tv_sec == deadline.tv_sec && current_time.tv_nsec > deadline.tv_nsec){ return(TRUE); } } return(FALSE); } guchar* ags_osc_connection_real_read_bytes(AgsOscConnection *osc_connection, guint *data_length) { guchar *buffer; guchar data[AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH]; guint allocated_buffer_size; guint read_count; int retval; guint available_data_length; gint64 start_data, end_data; int fd; guint i, j; gboolean has_valid_data; gboolean success; #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif GError *error; GRecMutex *osc_connection_mutex; /* get osc_connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); /* get fd */ g_rec_mutex_lock(osc_connection_mutex); #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); osc_connection->start_time->tv_sec = mts.tv_sec; osc_connection->start_time->tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, osc_connection->start_time); #endif fd = osc_connection->fd; buffer = osc_connection->buffer; allocated_buffer_size = osc_connection->allocated_buffer_size; read_count = osc_connection->read_count; has_valid_data = osc_connection->has_valid_data; g_rec_mutex_unlock(osc_connection_mutex); if(fd == -1){ if(data_length != NULL){ *data_length = 0; } return(NULL); } /* */ start_data = -1; end_data = -1; j = 0; while(!ags_osc_connection_timeout_expired(osc_connection->start_time, osc_connection->timeout_delay)){ available_data_length = 0; if(osc_connection->cache_data_length > 0){ memcpy(data, osc_connection->cache_data, osc_connection->cache_data_length * sizeof(guchar)); available_data_length += osc_connection->cache_data_length; } retval = 0; g_rec_mutex_lock(osc_connection_mutex); if(osc_connection->cache_data_length < AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH){ error = NULL; retval = g_socket_receive(osc_connection->socket, data + osc_connection->cache_data_length, AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH - osc_connection->cache_data_length, NULL, &error); //TODO:JK: check remove #if 0 retval = read(fd, data + osc_connection->cache_data_length, AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH - osc_connection->cache_data_length); #endif if(retval > 0){ available_data_length += retval; } } osc_connection->cache_data_length = 0; g_rec_mutex_unlock(osc_connection_mutex); if(error != NULL){ if(!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ g_critical("AgsOscConnection - %s", error->message); } if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ if(available_data_length == 0){ g_error_free(error); continue; } }else{ if(g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CONNECTION_CLOSED)){ g_error_free(error); g_rec_mutex_lock(osc_connection_mutex); error = NULL; g_socket_close(osc_connection->socket, &error); g_object_unref(osc_connection->socket); osc_connection->socket = NULL; osc_connection->fd = -1; g_rec_mutex_unlock(osc_connection_mutex); break; } } g_error_free(error); } if(available_data_length == 0){ continue; } success = FALSE; if(start_data == -1 && read_count == 0){ for(i = 0; i < available_data_length; i++){ if(data[i] == AGS_OSC_UTIL_SLIP_END){ success = TRUE; break; } } } if(success){ start_data = i; ags_osc_connection_read_bytes_REPEAT_0: success = FALSE; for(i = start_data + 1; i < available_data_length; i++){ if(data[i] == AGS_OSC_UTIL_SLIP_END){ success = TRUE; break; } } if(success){ end_data = i; if(start_data + 1 == end_data){ start_data = end_data; j++; if(j < 2 || !ags_osc_connection_timeout_expired(osc_connection->start_time, osc_connection->timeout_delay)){ goto ags_osc_connection_read_bytes_REPEAT_0; }else{ break; } } g_rec_mutex_lock(osc_connection_mutex); memcpy(osc_connection->buffer, data + start_data, (end_data - start_data + 1) * sizeof(guchar)); g_rec_mutex_unlock(osc_connection_mutex); if(data_length != NULL){ data_length[0] = end_data - start_data + 1; } /* fill cache */ if(end_data > 0 && end_data < available_data_length){ memcpy(osc_connection->cache_data, data + end_data, (available_data_length - end_data) * sizeof(guchar)); osc_connection->cache_data_length = available_data_length - end_data; } osc_connection->read_count = 0; osc_connection->has_valid_data = FALSE; return(osc_connection->buffer); }else{ read_count += (available_data_length - start_data); g_rec_mutex_lock(osc_connection_mutex); memcpy(osc_connection->buffer, data + start_data, (available_data_length - start_data) * sizeof(guchar)); g_rec_mutex_unlock(osc_connection_mutex); has_valid_data = TRUE; continue; } }else{ if(has_valid_data){ success = FALSE; for(i = 0; i < available_data_length; i++){ if(data[i] == AGS_OSC_UTIL_SLIP_END){ success = TRUE; break; } } if(success){ if(read_count + i >= AGS_OSC_CONNECTION_CHUNK_SIZE){ if(data_length != NULL){ data_length[0] = 0; } osc_connection->read_count = 0; osc_connection->has_valid_data = FALSE; return(NULL); } g_rec_mutex_lock(osc_connection_mutex); memcpy(osc_connection->buffer + read_count, data, (i + 1) * sizeof(guchar)); g_rec_mutex_unlock(osc_connection_mutex); read_count += (i + 1); if(data_length != NULL){ data_length[0] = read_count; } /* fill cache */ if(i < available_data_length){ memcpy(osc_connection->cache_data, data + i, (available_data_length - i) * sizeof(guchar)); osc_connection->cache_data_length = available_data_length - i; } osc_connection->read_count = 0; osc_connection->has_valid_data = FALSE; return(osc_connection->buffer); }else{ if(read_count + available_data_length >= AGS_OSC_CONNECTION_CHUNK_SIZE){ if(data_length != NULL){ data_length[0] = 0; } osc_connection->read_count = 0; osc_connection->has_valid_data = FALSE; return(NULL); } g_rec_mutex_lock(osc_connection_mutex); memcpy(osc_connection->buffer + read_count, data, (available_data_length) * sizeof(guchar)); g_rec_mutex_unlock(osc_connection_mutex); read_count += available_data_length; continue; } } } } osc_connection->read_count = read_count; osc_connection->has_valid_data = has_valid_data; if(data_length != NULL){ data_length[0] = 0; } return(NULL); } /** * ags_osc_connection_read_bytes: * @osc_connection: the #AgsOscConnection * @data_length: the return location of byte array's length * * Read bytes. * * Returns: byte array read or %NULL if no data available * * Since: 3.0.0 */ guchar* ags_osc_connection_read_bytes(AgsOscConnection *osc_connection, guint *data_length) { guchar *buffer; g_return_val_if_fail(AGS_IS_OSC_CONNECTION(osc_connection), NULL); g_object_ref((GObject *) osc_connection); g_signal_emit(G_OBJECT(osc_connection), osc_connection_signals[READ_BYTES], 0, data_length, &buffer); g_object_unref((GObject *) osc_connection); return(buffer); } gint64 ags_osc_connection_real_write_response(AgsOscConnection *osc_connection, GObject *osc_response) { guchar *slip_buffer; int fd; guint slip_buffer_length; gint64 num_write; GError *error; GRecMutex *osc_connection_mutex; GRecMutex *osc_response_mutex; if(!AGS_IS_OSC_RESPONSE(osc_response)){ return(-1); } /* get osc connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); /* get fd */ g_rec_mutex_lock(osc_connection_mutex); fd = osc_connection->fd; g_rec_mutex_unlock(osc_connection_mutex); if(fd == -1){ return(0); } /* get osc response mutex */ osc_response_mutex = AGS_OSC_RESPONSE_GET_OBJ_MUTEX(osc_response); /* write */ g_rec_mutex_lock(osc_response_mutex); slip_buffer = ags_osc_util_slip_encode(AGS_OSC_RESPONSE(osc_response)->packet, AGS_OSC_RESPONSE(osc_response)->packet_size, &slip_buffer_length); g_rec_mutex_unlock(osc_response_mutex); g_rec_mutex_lock(osc_connection_mutex); num_write = 0; error = NULL; if(osc_connection->socket != NULL){ num_write = g_socket_send(osc_connection->socket, slip_buffer, slip_buffer_length * sizeof(guchar), NULL, &error); } g_rec_mutex_unlock(osc_connection_mutex); if(error != NULL){ if(!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)){ g_critical("AgsOscConnection - %s", error->message); } g_error_free(error); } //TODO:JK: check remove #if 0 num_write = write(fd, slip_buffer, slip_buffer_length * sizeof(guchar)); #endif if(slip_buffer != NULL){ free(slip_buffer); } return(num_write); } /** * ags_osc_connection_write_response: * @osc_connection: the #AgsOscConnection * @osc_response: the #AgsOscResponse * * Write response. * * Returns: the count of bytes written * * Since: 3.0.0 */ gint64 ags_osc_connection_write_response(AgsOscConnection *osc_connection, GObject *osc_response) { gint64 num_write; g_return_val_if_fail(AGS_IS_OSC_CONNECTION(osc_connection), -1); g_object_ref((GObject *) osc_connection); g_signal_emit(G_OBJECT(osc_connection), osc_connection_signals[WRITE_RESPONSE], 0, osc_response, &num_write); g_object_unref((GObject *) osc_connection); return(num_write); } void ags_osc_connection_real_close(AgsOscConnection *osc_connection) { GError *error; GRecMutex *osc_connection_mutex; /* get osc_connection mutex */ osc_connection_mutex = AGS_OSC_CONNECTION_GET_OBJ_MUTEX(osc_connection); /* set flags */ g_rec_mutex_lock(osc_connection_mutex); error = NULL; g_socket_close(osc_connection->socket, &error); g_object_unref(osc_connection->socket); osc_connection->socket = NULL; osc_connection->fd = -1; g_rec_mutex_unlock(osc_connection_mutex); if(error != NULL){ g_critical("AgsOscConnection - %s", error->message); g_error_free(error); } ags_osc_connection_unset_flags(osc_connection, AGS_OSC_CONNECTION_ACTIVE); } /** * ags_osc_connection_close: * @osc_connection: the #AgsOscConnection * * Close @osc_connection. * * Since: 3.0.0 */ void ags_osc_connection_close(AgsOscConnection *osc_connection) { g_return_if_fail(AGS_IS_OSC_CONNECTION(osc_connection)); g_object_ref((GObject *) osc_connection); g_signal_emit(G_OBJECT(osc_connection), osc_connection_signals[CLOSE], 0); g_object_unref((GObject *) osc_connection); } /** * ags_osc_connection_new: * @osc_server: the #AgsOscServer * * Creates a new instance of #AgsOscConnection * * Returns: the new #AgsOscConnection * * Since: 3.0.0 */ AgsOscConnection* ags_osc_connection_new(GObject *osc_server) { AgsOscConnection *osc_connection; osc_connection = (AgsOscConnection *) g_object_new(AGS_TYPE_OSC_CONNECTION, "osc-server", osc_server, NULL); return(osc_connection); } gsequencer-3.1.3/ags/audio/osc/ags_osc_xmlrpc_server.c0000644000175000017500000005201213607210263017774 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_osc_xmlrpc_server_class_init(AgsOscXmlrpcServerClass *osc_xmlrpc_server); void ags_osc_xmlrpc_server_init(AgsOscXmlrpcServer *osc_xmlrpc_server); void ags_osc_xmlrpc_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_xmlrpc_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_xmlrpc_server_dispose(GObject *gobject); void ags_osc_xmlrpc_server_finalize(GObject *gobject); void ags_osc_xmlrpc_server_start(AgsOscServer *osc_server); void ags_osc_xmlrpc_server_stop(AgsOscServer *osc_server); void ags_osc_xmlrpc_server_websocket_callback(SoupServer *server, SoupWebsocketConnection *connection, const char *path, SoupClientContext *client, AgsOscXmlrpcServer *osc_xmlrpc_server); /** * SECTION:ags_osc_xmlrpc_server * @short_description: the OSC XMLRPC server * @title: AgsOscXmlrpcServer * @section_id: * @include: ags/audio/osc/ags_osc_xmlrpc_server.h * * #AgsOscXmlrpcServer your OSC XMLRPC server. */ enum{ PROP_0, PROP_OSC_XMLRPC_CONTROLLER, PROP_XMLRPC_SERVER, }; static gpointer ags_osc_xmlrpc_server_parent_class = NULL; GType ags_osc_xmlrpc_server_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_xmlrpc_server = 0; static const GTypeInfo ags_osc_xmlrpc_server_info = { sizeof (AgsOscXmlrpcServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_xmlrpc_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscXmlrpcServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_xmlrpc_server_init, }; ags_type_osc_xmlrpc_server = g_type_register_static(AGS_TYPE_OSC_SERVER, "AgsOscXmlrpcServer", &ags_osc_xmlrpc_server_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_xmlrpc_server); } return g_define_type_id__volatile; } void ags_osc_xmlrpc_server_class_init(AgsOscXmlrpcServerClass *osc_xmlrpc_server) { AgsOscServerClass *osc_server; GObjectClass *gobject; GParamSpec *param_spec; ags_osc_xmlrpc_server_parent_class = g_type_class_peek_parent(osc_xmlrpc_server); /* GObjectClass */ gobject = (GObjectClass *) osc_xmlrpc_server; gobject->set_property = ags_osc_xmlrpc_server_set_property; gobject->get_property = ags_osc_xmlrpc_server_get_property; gobject->dispose = ags_osc_xmlrpc_server_dispose; gobject->finalize = ags_osc_xmlrpc_server_finalize; /* properties */ /** * AgsOscXmlrpcServer:xmlrpc-server: * * The assigned #AgsServer. * * Since: 3.0.0 */ param_spec = g_param_spec_object("xmlrpc-server", i18n_pspec("assigned server"), i18n_pspec("The server it is assigned with"), AGS_TYPE_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_XMLRPC_SERVER, param_spec); /** * AgsOscXmlrpcServer:osc-xmlrpc-controller: * * The assigned #AgsOscXmlrpcController. * * Since: 3.0.0 */ param_spec = g_param_spec_object("osc-xmlrpc-controller", i18n_pspec("OSC XMLRPC controller"), i18n_pspec("The OSC XMLRPC controller"), AGS_TYPE_CONTROLLER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OSC_XMLRPC_CONTROLLER, param_spec); /* AgsOscServerClass */ osc_server = (AgsOscServerClass *) osc_xmlrpc_server; osc_server->start = ags_osc_xmlrpc_server_start; osc_server->stop = ags_osc_xmlrpc_server_stop; osc_server->listen = NULL; osc_server->dispatch = NULL; } void ags_osc_xmlrpc_server_init(AgsOscXmlrpcServer *osc_xmlrpc_server) { osc_xmlrpc_server->xmlrpc_server = NULL; osc_xmlrpc_server->osc_xmlrpc_controller = NULL; } void ags_osc_xmlrpc_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscXmlrpcServer *osc_xmlrpc_server; GRecMutex *osc_server_mutex; osc_xmlrpc_server = AGS_OSC_XMLRPC_SERVER(gobject); /* get osc server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_xmlrpc_server); switch(prop_id){ case PROP_XMLRPC_SERVER: { GObject *xmlrpc_server; xmlrpc_server = g_value_get_object(value); g_rec_mutex_lock(osc_server_mutex); if(osc_xmlrpc_server->xmlrpc_server == xmlrpc_server){ g_rec_mutex_unlock(osc_server_mutex); return; } if(osc_xmlrpc_server->xmlrpc_server != NULL){ g_object_unref(osc_xmlrpc_server->xmlrpc_server); } if(xmlrpc_server != NULL){ g_object_ref(xmlrpc_server); } osc_xmlrpc_server->xmlrpc_server = xmlrpc_server; g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_OSC_XMLRPC_CONTROLLER: { GObject *osc_xmlrpc_controller; osc_xmlrpc_controller = g_value_get_object(value); g_rec_mutex_lock(osc_server_mutex); if(osc_xmlrpc_server->osc_xmlrpc_controller == osc_xmlrpc_controller){ g_rec_mutex_unlock(osc_server_mutex); return; } if(osc_xmlrpc_server->osc_xmlrpc_controller != NULL){ g_object_unref(osc_xmlrpc_server->osc_xmlrpc_controller); } if(osc_xmlrpc_controller != NULL){ g_object_ref(osc_xmlrpc_controller); } osc_xmlrpc_server->osc_xmlrpc_controller = osc_xmlrpc_controller; g_rec_mutex_unlock(osc_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_xmlrpc_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscXmlrpcServer *osc_xmlrpc_server; GRecMutex *osc_server_mutex; osc_xmlrpc_server = AGS_OSC_XMLRPC_SERVER(gobject); /* get osc server mutex */ osc_server_mutex = AGS_OSC_SERVER_GET_OBJ_MUTEX(osc_xmlrpc_server); switch(prop_id){ case PROP_XMLRPC_SERVER: { g_rec_mutex_lock(osc_server_mutex); g_value_set_object(value, osc_xmlrpc_server->xmlrpc_server); g_rec_mutex_unlock(osc_server_mutex); } break; case PROP_OSC_XMLRPC_CONTROLLER: { g_rec_mutex_lock(osc_server_mutex); g_value_set_object(value, osc_xmlrpc_server->osc_xmlrpc_controller); g_rec_mutex_unlock(osc_server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_xmlrpc_server_dispose(GObject *gobject) { AgsOscXmlrpcServer *osc_xmlrpc_server; osc_xmlrpc_server = (AgsOscXmlrpcServer *) gobject; if(osc_xmlrpc_server->xmlrpc_server != NULL){ g_object_unref(osc_xmlrpc_server->xmlrpc_server); osc_xmlrpc_server->xmlrpc_server = NULL; } if(osc_xmlrpc_server->osc_xmlrpc_controller != NULL){ g_object_unref(osc_xmlrpc_server->osc_xmlrpc_controller); osc_xmlrpc_server->osc_xmlrpc_controller = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_xmlrpc_server_parent_class)->dispose(gobject); } void ags_osc_xmlrpc_server_finalize(GObject *gobject) { AgsOscXmlrpcServer *osc_xmlrpc_server; osc_xmlrpc_server = (AgsOscXmlrpcServer *) gobject; if(osc_xmlrpc_server->xmlrpc_server != NULL){ g_object_unref(osc_xmlrpc_server->xmlrpc_server); } if(osc_xmlrpc_server->osc_xmlrpc_controller != NULL){ g_object_unref(osc_xmlrpc_server->osc_xmlrpc_controller); } /* call parent */ G_OBJECT_CLASS(ags_osc_xmlrpc_server_parent_class)->finalize(gobject); } void ags_osc_xmlrpc_server_start(AgsOscServer *osc_server) { AgsOscXmlrpcController *osc_xmlrpc_controller; GList *start_controller, *controller; if(ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_STARTED)){ return; } ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_STARTED); ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_RUNNING); g_message("starting OSC XMLRPC threads"); /* controller */ g_object_get(osc_server, "osc-xmlrpc-controller", &osc_xmlrpc_controller, "controller", &start_controller, NULL); ags_osc_xmlrpc_controller_start_delegate(osc_xmlrpc_controller); controller = start_controller; while(controller != NULL){ if(AGS_IS_OSC_METER_CONTROLLER(controller->data)){ ags_osc_meter_controller_start_monitor(controller->data); } controller = controller->next; } g_object_unref(osc_xmlrpc_controller); g_list_free_full(start_controller, g_object_unref); } void ags_osc_xmlrpc_server_stop(AgsOscServer *osc_server) { AgsOscXmlrpcController *osc_xmlrpc_controller; GList *start_controller, *controller; if(!ags_osc_server_test_flags(osc_server, AGS_OSC_SERVER_RUNNING)){ return; } /* stop */ ags_osc_server_set_flags(osc_server, AGS_OSC_SERVER_TERMINATING); ags_osc_server_unset_flags(osc_server, AGS_OSC_SERVER_RUNNING); /* controller */ g_object_get(osc_server, "osc-xmlrpc-controller", &osc_xmlrpc_controller, "controller", &start_controller, NULL); ags_osc_xmlrpc_controller_stop_delegate(osc_xmlrpc_controller); controller = start_controller; while(controller != NULL){ if(AGS_IS_OSC_METER_CONTROLLER(controller->data)){ ags_osc_meter_controller_stop_monitor(controller->data); } controller = controller->next; } g_object_unref(osc_xmlrpc_controller); g_list_free_full(start_controller, g_object_unref); ags_osc_server_unset_flags(osc_server, (AGS_OSC_SERVER_STARTED | AGS_OSC_SERVER_TERMINATING)); } /** * ags_osc_xmlrpc_server_add_websocket_handler: * @osc_xmlrpc_server: the #AgsOscXmlrpcServer * @path: the path * @origin: the origin * @protocols: the protocls as string vector * @callback: the callback * @user_data: user data * @destroy: destroy notify function * * Add websocket handler to soup server. * * Since: 3.0.0 */ void ags_osc_xmlrpc_server_add_websocket_handler(AgsOscXmlrpcServer *osc_xmlrpc_server, char *path, char *origin, char **protocols, SoupServerWebsocketCallback callback, gpointer user_data, GDestroyNotify destroy) { AgsServer *xmlrpc_server; GRecMutex *server_mutex; if(!AGS_IS_OSC_XMLRPC_SERVER(osc_xmlrpc_server)){ return; } g_object_get(osc_xmlrpc_server, "xmlrpc-server", &xmlrpc_server, NULL); if(!AGS_IS_SERVER(xmlrpc_server)){ return; } /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(xmlrpc_server); g_message("add websocket handler"); g_rec_mutex_lock(server_mutex); soup_server_add_websocket_handler(xmlrpc_server->soup_server, path, // path NULL, // origin NULL, // protocols callback, user_data, destroy); g_rec_mutex_unlock(server_mutex); g_object_unref(xmlrpc_server); } void ags_osc_xmlrpc_server_add_default_controller(AgsOscXmlrpcServer *osc_xmlrpc_server) { AgsOscActionController *action_controller; AgsOscConfigController *config_controller; AgsOscInfoController *info_controller; AgsOscMeterController *meter_controller; AgsOscNodeController *node_controller; AgsOscRenewController *renew_controller; AgsOscStatusController *status_controller; AgsServer *xmlrpc_server; AgsOscXmlrpcController *osc_xmlrpc_controller; gchar *response_path; if(!AGS_IS_OSC_XMLRPC_SERVER(osc_xmlrpc_server)){ return; } g_object_get(osc_xmlrpc_server, "xmlrpc-server", &xmlrpc_server, NULL); if(!AGS_IS_SERVER(xmlrpc_server)){ return; } /* XMLRPC controller */ osc_xmlrpc_controller = ags_osc_xmlrpc_controller_new(); g_object_set(osc_xmlrpc_controller, "server", xmlrpc_server, "osc-xmlrpc-server", osc_xmlrpc_server, NULL); g_object_set(osc_xmlrpc_server, "osc-xmlrpc-controller", osc_xmlrpc_controller, NULL); ags_server_add_controller(xmlrpc_server, (GObject *) osc_xmlrpc_controller); /* action controller */ action_controller = ags_osc_action_controller_new(); g_object_set(action_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) action_controller); /* config controller */ config_controller = ags_osc_config_controller_new(); g_object_set(config_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) config_controller); /* info controller */ info_controller = ags_osc_info_controller_new(); g_object_set(info_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) info_controller); /* meter controller */ meter_controller = ags_osc_meter_controller_new(); g_object_set(meter_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) meter_controller); /* node controller */ node_controller = ags_osc_node_controller_new(); g_object_set(node_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) node_controller); /* renew controller */ renew_controller = ags_osc_renew_controller_new(); g_object_set(renew_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) renew_controller); /* status controller */ status_controller = ags_osc_status_controller_new(); g_object_set(status_controller, "osc-server", osc_xmlrpc_server, NULL); ags_osc_server_add_controller(osc_xmlrpc_server, (GObject *) status_controller); /* OSC response websocket handler */ response_path = g_strdup_printf("%s/ags-osc-over-xmlrpc/response", AGS_CONTROLLER_BASE_PATH); ags_osc_xmlrpc_server_add_websocket_handler(osc_xmlrpc_server, response_path, NULL, NULL, ags_osc_xmlrpc_server_websocket_callback, osc_xmlrpc_server, NULL); g_free(response_path); } void ags_osc_xmlrpc_server_websocket_message_callback(SoupWebsocketConnection *websocket_connection, gint type, GBytes *message, AgsOscXmlrpcServer *osc_xmlrpc_server) { AgsAuthenticationManager *authentication_manager; AgsSecurityContext *security_context; AgsLoginInfo *login_info; xmlDoc *doc; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *root_node; guchar buffer[AGS_OSC_XMLRPC_SERVER_DEFAULT_CHUNK_SIZE]; gchar *xpath; gchar *login; gchar *user_uuid; gchar *security_token; gchar *resource_id; gsize num_read; guint n_attempts; guint i; GError *error; GRecMutex *controller_mutex; GRecMutex *authentication_manager_mutex; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); doc = NULL; root_node = NULL; doc = xmlParseDoc(g_bytes_get_data(message, NULL)); if(doc == NULL){ return; } root_node = xmlDocGetRootElement(doc); if(root_node == NULL){ return; } login = NULL; security_token = NULL; resource_id = NULL; /* login */ xpath = "/ags-osc-over-xmlrpc/ags-srv-login"; xpath_context = xmlXPathNewContext(doc); xpath_object = xmlXPathNodeEval(root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *tmp_login; tmp_login = xmlNodeGetContent(node[i]); login = g_strdup(tmp_login); xmlFree(tmp_login); break; } } } xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); /* security token */ xpath = "/ags-osc-over-xmlrpc/ags-srv-security-token"; xpath_context = xmlXPathNewContext(doc); xpath_object = xmlXPathNodeEval(root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *tmp_security_token; tmp_security_token = xmlNodeGetContent(node[i]); security_token = g_strdup(tmp_security_token); xmlFree(tmp_security_token); break; } } } xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); /* security token */ xpath = "/ags-osc-over-xmlrpc/ags-srv-redirect"; xpath_context = xmlXPathNewContext(doc); xpath_object = xmlXPathNodeEval(root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *tmp_resource_id; tmp_resource_id = xmlGetProp(node[i], "resource-id"); resource_id = g_strdup(tmp_resource_id); xmlFree(tmp_resource_id); break; } } } xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); xmlFreeDoc(doc); if(login == NULL || security_token == NULL || resource_id == NULL){ g_free(login); g_free(security_token); g_free(resource_id); return; } login_info = ags_authentication_manager_lookup_login(authentication_manager, login); if(login_info != NULL){ g_rec_mutex_lock(authentication_manager_mutex); security_context = login_info->security_context; g_object_ref(security_context); user_uuid = g_strdup(login_info->user_uuid); g_rec_mutex_unlock(authentication_manager_mutex); if(ags_authentication_manager_is_session_active(authentication_manager, security_context, user_uuid, security_token)){ GList *start_connection, *connection; g_object_get(osc_xmlrpc_server, "connection", &start_connection, NULL); connection = ags_osc_websocket_connection_find_resource_id(start_connection, resource_id); if(connection != NULL){ g_object_set(connection->data, "websocket-connection", websocket_connection, "security-context", security_context, "login", login, "security-token", security_token, NULL); } g_list_free_full(start_connection, g_object_unref); } g_object_unref(security_context); ags_login_info_unref(login_info); g_free(user_uuid); } g_free(login); g_free(security_token); g_free(resource_id); } void ags_osc_xmlrpc_server_websocket_callback(SoupServer *server, SoupWebsocketConnection *websocket_connection, const char *path, SoupClientContext *client, AgsOscXmlrpcServer *osc_xmlrpc_server) { g_signal_connect(websocket_connection, "message", ags_osc_xmlrpc_server_websocket_message_callback, osc_xmlrpc_server); g_object_ref(websocket_connection); } /** * ags_osc_xmlrpc_server_new: * * Creates a new instance of #AgsOscXmlrpcServer * * Returns: the new #AgsOscXmlrpcServer * * Since: 3.0.0 */ AgsOscXmlrpcServer* ags_osc_xmlrpc_server_new() { AgsOscXmlrpcServer *osc_xmlrpc_server; osc_xmlrpc_server = (AgsOscXmlrpcServer *) g_object_new(AGS_TYPE_OSC_XMLRPC_SERVER, NULL); return(osc_xmlrpc_server); } gsequencer-3.1.3/ags/audio/osc/ags_osc_buffer_util.c0000644000175000017500000004756313607210263017426 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include /** * SECTION:ags_osc_buffer_util * @short_description: OSC buffer util * @title: AgsOscBufferUtil * @section_id: * @include: ags/audio/osc/ags_osc_buffer_util.h * * Utility functions for OSC buffer. */ /** * ags_osc_buffer_util_put_int32: * @buffer: the unsigned char buffer * @val: the 32 bit integer value * * Put @val in @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_int32(unsigned char *buffer, gint32 val) { if(buffer == NULL){ return; } buffer[0] = (val & ((guint32) 0xff << 24)) >> 24; buffer[1] = (val & ((guint32) 0xff << 16)) >> 16; buffer[2] = (val & ((guint32) 0xff << 8)) >> 8; buffer[3] = val & (guint32) 0xff; } /** * ags_osc_buffer_util_get_int32: * @buffer: the unsigned char buffer * @val: return location of the 32 bit integer value * * Get @val from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_int32(unsigned char *buffer, gint32 *val) { gint32 tmp; if(buffer == NULL){ return; } tmp = (guint32) (buffer[0] & 0xff); tmp = (guint32) (tmp << 8) + (buffer[1] & 0xff); tmp = (guint32) (tmp << 8) + (buffer[2] & 0xff); tmp = (guint32) (tmp << 8) + (buffer[3] & 0xff); if(val != NULL){ val[0] = tmp; } } /** * ags_osc_buffer_util_put_timetag: * @buffer: the unsigned char buffer * @tv_secs: number of seconds since midnight on January 1, 1900 * @tv_fraction: fraction of seconds to a precision of about 200 picoseconds * @immediately: if %TRUE apply immediately, otherwise %FALSE not immediately * * Put timetag specified by @tv_secs, @tv_fraction and @immediately to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_timetag(unsigned char *buffer, gint32 tv_secs, gint32 tv_fraction, gboolean immediately) { if(buffer == NULL){ return; } buffer[0] = (tv_secs & (0xff << 24)) >> 24; buffer[1] = (tv_secs & (0xff << 16)) >> 16; buffer[2] = (tv_secs & (0xff << 8)) >> 8; buffer[3] = tv_secs & 0xff; buffer[4] = (tv_fraction & (0xff << 24)) >> 24; buffer[5] = (tv_fraction & (0xff << 16)) >> 16; buffer[6] = (tv_fraction & (0xff << 8)) >> 8; buffer[7] = tv_fraction & 0xfe; if(immediately){ buffer[7] |= 0x1; } } /** * ags_osc_buffer_util_get_timetag: * @buffer: the unsigned char buffer * @tv_secs: return location of number of seconds since midnight on January 1, 1900 * @tv_fraction: return location of fraction of seconds to a precision of about 200 picoseconds * @immediately: return location of if %TRUE apply immediately, otherwise %FALSE not immediately * * Get timetag specified by @tv_secs, @tv_fraction and @immediately from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_timetag(unsigned char *buffer, gint32 *tv_secs, gint32 *tv_fraction, gboolean *immediately) { gint32 tmp; if(buffer == NULL){ return; } tmp = (buffer[0] & 0xff); tmp = (tmp << 8) + (buffer[1] & 0xff); tmp = (tmp << 8) + (buffer[2] & 0xff); tmp = (tmp << 8) + (buffer[3] & 0xff); if(tv_secs != NULL){ *tv_secs = tmp; } tmp = (buffer[4] & 0xff); tmp = (tmp << 8) + (buffer[5] & 0xff); tmp = (tmp << 8) + (buffer[6] & 0xff); tmp = (tmp << 8) + (buffer[7] & 0xfe); if(tv_fraction != NULL){ *tv_fraction = tmp; } if(immediately != NULL){ if((0x1 & buffer[7]) != 0){ *immediately = TRUE; }else{ *immediately = FALSE; } } } /** * ags_osc_buffer_util_put_float: * @buffer: the unsigned char buffer * @val: the float value * * Put @val to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_float(unsigned char *buffer, gfloat val) { union{ guint32 val; GFloatIEEE754 ieee_float; }data; if(buffer == NULL){ return; } data.ieee_float.v_float = val; buffer[0] = (data.val & ((guint32) 0xff << 24)) >> 24; buffer[1] = (data.val & ((guint32) 0xff << 16)) >> 16; buffer[2] = (data.val & ((guint32) 0xff << 8)) >> 8; buffer[3] = data.val & (guint32) 0xff; } /** * ags_osc_buffer_util_get_float: * @buffer: the unsigned char buffer * @val: the float value * * Get @val from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_float(unsigned char *buffer, gfloat *val) { union{ guint32 val; GFloatIEEE754 ieee_float; }data; if(buffer == NULL){ return; } data.val = (buffer[0] & 0xff); data.val = (data.val << 8) + (buffer[1] & 0xff); data.val = (data.val << 8) + (buffer[2] & 0xff); data.val = (data.val << 8) + (buffer[3] & 0xff); if(val != NULL){ val[0] = data.ieee_float.v_float; } } /** * ags_osc_buffer_util_put_string: * @buffer: the unsigned char buffer * @str: the ASCII string * @length: the length to write or -1 to write until null byte * * Put @str to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_string(unsigned char *buffer, gchar *str, gsize length) { if(buffer == NULL || length == 0){ return; } if(length == -1){ length = strlen(str); } memcpy(buffer, str, length * sizeof(unsigned char)); buffer[length] = '\0'; } /** * ags_osc_buffer_util_get_string: * @buffer: the unsigned char buffer * @str: the return location of ASCII string * @length: the return location of bytes read * * Get @str from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_string(unsigned char *buffer, gchar **str, gsize *length) { gchar *tmp; unsigned char *offset; gsize count; if(buffer == NULL){ return; } offset = index(buffer, '\0'); count = offset - buffer; if(str != NULL){ if(count > 0){ tmp = (gchar *) malloc((count + 1) * sizeof(gchar)); memcpy(tmp, buffer, count + 1); }else{ tmp = NULL; } str[0] = tmp; } if(length != NULL){ length[0] = count; } } /** * ags_osc_buffer_util_put_blob: * @buffer: the unsigned char buffer * @data_size: the blob's data size * @data: the blob's data * * Put @data to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_blob(unsigned char *buffer, gint32 data_size, unsigned char *data) { guint padding; guint i; if(buffer == NULL || data_size < 0){ return; } ags_osc_buffer_util_put_int32(buffer, data_size); memcpy(buffer + 4, data, data_size); if(data_size % 4 != 0){ padding = 4 - (data_size % 4); }else{ padding = 0; } for(i = 0; i < padding; i++){ buffer[4 + data_size + i] = 0x0; } } /** * ags_osc_buffer_util_get_blob: * @buffer: the unsigned char buffer * @data_size: the return location of blob's data size * @data: the return location of blob's data * * Get @data from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_blob(unsigned char *buffer, gint32 *data_size, unsigned char **data) { unsigned char *blob; gint32 tmp; if(buffer == NULL){ return; } ags_osc_buffer_util_get_int32(buffer, &tmp); if(data_size != NULL){ *data_size = tmp; } if(data != NULL){ if(tmp > 0){ blob = (unsigned char *) malloc(tmp * sizeof(unsigned char)); memcpy(blob, buffer + 4, tmp); *data = blob; }else{ *data = NULL; } } } /** * ags_osc_buffer_util_put_int64: * @buffer: the unsigned char buffer * @val: the 64 bit integer * * Put @val to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_int64(unsigned char *buffer, gint64 val) { if(buffer == NULL){ return; } buffer[0] = (val & ((guint64) 0xff << 56)) >> 56; buffer[1] = (val & ((guint64) 0xff << 48)) >> 48; buffer[2] = (val & ((guint64) 0xff << 40)) >> 40; buffer[3] = (val & ((guint64) 0xff << 32)) >> 32; buffer[4] = (val & ((guint64) 0xff << 24)) >> 24; buffer[5] = (val & ((guint64) 0xff << 16)) >> 16; buffer[6] = (val & ((guint64) 0xff << 8)) >> 8; buffer[7] = val & (guint64) 0xff; } /** * ags_osc_buffer_util_get_int64: * @buffer: the unsigned char buffer * @val: the return location of 64 bit integer * * Get @val from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_int64(unsigned char *buffer, gint64 *val) { gint64 tmp; if(buffer == NULL){ return; } tmp = (guint64) (buffer[0] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[1] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[2] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[3] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[4] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[5] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[6] & 0xff); tmp = (guint64) (tmp << 8) + (buffer[7] & 0xff); if(val != NULL){ val[0] = tmp; } } /** * ags_osc_buffer_util_put_double: * @buffer: the unsigned char buffer * @val: the double floating point value * * Put @val to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_double(unsigned char *buffer, gdouble val) { union{ guint64 val; GDoubleIEEE754 ieee_double; }data; if(buffer == NULL){ return; } data.ieee_double.v_double = val; buffer[0] = (data.val & ((guint64) 0xff << 56)) >> 56; buffer[1] = (data.val & ((guint64) 0xff << 48)) >> 48; buffer[2] = (data.val & ((guint64) 0xff << 40)) >> 40; buffer[3] = (data.val & ((guint64) 0xff << 32)) >> 32; buffer[4] = (data.val & ((guint64) 0xff << 24)) >> 24; buffer[5] = (data.val & ((guint64) 0xff << 16)) >> 16; buffer[6] = (data.val & ((guint64) 0xff << 8)) >> 8; buffer[7] = data.val & (guint64) 0xff; } /** * ags_osc_buffer_util_get_double: * @buffer: the unsigned char buffer * @val: the return location of double floating point value * * Get @val from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_double(unsigned char *buffer, gdouble *val) { union{ guint64 val; GDoubleIEEE754 ieee_double; }data; if(buffer == NULL){ return; } data.val = (guint64) (buffer[0] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[1] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[2] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[3] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[4] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[5] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[6] & 0xff); data.val = (guint64) (data.val << 8) + (buffer[7] & 0xff); if(val != NULL){ val[0] = data.ieee_double.v_double; } } /** * ags_osc_buffer_util_put_char: * @buffer: the unsigned char buffer * @val: the ASCII char * * Put @val to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_char(unsigned char *buffer, gchar val) { if(buffer == NULL){ return; } buffer[0] = 0x0; buffer[1] = 0x0; buffer[2] = 0x0; buffer[3] = val; } /** * ags_osc_buffer_util_get_char: * @buffer: the unsigned char buffer * @val: the return location of ASCII char * * Get @val from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_char(unsigned char *buffer, gchar *val) { gint32 tmp; if(buffer == NULL){ return; } tmp = (buffer[3] & 0xff); if(val != NULL){ val[0] = tmp; } } /** * ags_osc_buffer_util_put_rgba: * @buffer: the unsigned char buffer * @r: the red value * @g: the green value * @b: the blue value * @a: the alpha value * * Put RGBA color specified by @r, @g, @b and @a to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_rgba(unsigned char *buffer, guint8 r, guint8 g, guint8 b, guint8 a) { if(buffer == NULL){ return; } buffer[0] = r; buffer[1] = g; buffer[2] = b; buffer[3] = a; } /** * ags_osc_buffer_util_get_rgba: * @buffer: the unsigned char buffer * @r: the return location of red value * @g: the return location of green value * @b: the return location of blue value * @a: the return location of alpha value * * Get RGBA color specified by @r, @g, @b and @a from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_rgba(unsigned char *buffer, guint8 *r, guint8 *g, guint8 *b, guint8 *a) { if(buffer == NULL){ return; } if(r != NULL){ *r = buffer[0]; } if(g != NULL){ *g = buffer[1]; } if(b != NULL){ *b = buffer[2]; } if(a != NULL){ *a = buffer[3]; } } /** * ags_osc_buffer_util_put_midi: * @buffer: the unsigned char buffer * @port: the port * @status_byte: the status byte * @data0: the first piece of data * @data1: the second piece of data * * Put MIDI to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_midi(unsigned char *buffer, guint8 port, guint8 status_byte, guint8 data0, guint8 data1) { if(buffer == NULL){ return; } buffer[0] = port; buffer[1] = status_byte; buffer[2] = data0; buffer[3] = data1; } /** * ags_osc_buffer_util_get_midi: * @buffer: the unsigned char buffer * @port: the return location of port * @status_byte: the return location of status byte * @data0: the return location of first piece of data * @data1: the return location of second piece of data * * Get MIDI from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_midi(unsigned char *buffer, guint8 *port, guint8 *status_byte, guint8 *data0, guint8 *data1) { if(buffer == NULL){ return; } if(port != NULL){ *port = buffer[0]; } if(status_byte != NULL){ *status_byte = buffer[1]; } if(data0 != NULL){ *data0 = buffer[2]; } if(data1 != NULL){ *data1 = buffer[3]; } } /** * ags_osc_buffer_util_put_packet: * @buffer: the unsigned char buffer * @packet_size: the packet's size * @packet: the packet * * Put @packet to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_packet(unsigned char *buffer, gint32 packet_size, unsigned char *packet) { guint padding; guint i; if(buffer == NULL || packet_size < 0){ return; } if(packet_size % 4 != 0){ padding = 4 - (packet_size % 4); }else{ padding = 0; } ags_osc_buffer_util_put_int32(buffer, packet_size + padding); memcpy(buffer + 4, packet, packet_size); for(i = 0; i < padding; i++){ buffer[4 + packet_size + i] = 0x0; } } /** * ags_osc_buffer_util_get_packet: * @buffer: the unsigned char buffer * @packet_size: the return location of packet's size * @packet: the return location of packet * * Get @packet from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_packet(unsigned char *buffer, gint32 *packet_size, unsigned char **packet) { unsigned char *data; gint32 tmp; if(buffer == NULL){ return; } ags_osc_buffer_util_get_int32(buffer, &tmp); if(packet_size != NULL){ *packet_size = tmp; } if(packet != NULL){ if(tmp > 0){ data = (unsigned char *) malloc(tmp * sizeof(unsigned char)); memcpy(data, buffer + 4, tmp); *packet = data; }else{ *packet = NULL; } } } /** * ags_osc_buffer_util_put_packets: * @buffer: the unsigned char buffer * @packet_size: the packet size or -1 if no packet * @...: the packets followed by packet size until it is -1 * * Put packets to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_packets(unsigned char *buffer, gint32 packet_size, ...) { va_list var_args; unsigned char *packet; if(buffer == NULL || packet_size < 0){ return; } va_start(var_args, packet_size); while(packet_size >= 0){ packet = va_arg(var_args, unsigned char *); ags_osc_buffer_util_put_packet(buffer, packet_size, packet); /* iterate */ buffer += (4 + packet_size); packet_size = va_arg(var_args, gint32); } va_end(var_args); } /** * ags_osc_buffer_util_put_message: * @buffer: the unsigned char buffer * @address_pattern: the address pattern * @type_tag: the type tag * * Put message heading to @buffer. Note you have to put following arguments * yourself. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_message(unsigned char *buffer, gchar *address_pattern, gchar *type_tag) { gsize address_pattern_length; gsize type_tag_length; if(buffer == NULL || address_pattern[0] != '/' || type_tag[0] != ','){ return; } address_pattern_length = strlen(address_pattern); ags_osc_buffer_util_put_string(buffer, address_pattern, address_pattern_length); buffer += (4 * (guint) ceil((double) (address_pattern_length + 1) / 4.0)); type_tag_length = strlen(type_tag); ags_osc_buffer_util_put_string(buffer, type_tag, type_tag_length); } /** * ags_osc_buffer_util_get_message: * @buffer: the unsigned char buffer * @address_pattern: return location of the address pattern * @type_tag: return location of the type tag * * Get message heading from @buffer. Note you have to get following arguments * yourself. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_message(unsigned char *buffer, gchar **address_pattern, gchar **type_tag) { gchar *str; guint offset; gsize length; if(buffer == NULL){ return; } if(buffer[0] == '/'){ ags_osc_buffer_util_get_string(buffer, &str, &length); }else{ if(address_pattern != NULL){ address_pattern[0] = NULL; } if(type_tag != NULL){ type_tag[0] = NULL; } return; } if(address_pattern != NULL){ address_pattern[0] = str; }else{ g_free(str); } offset = (4 * (guint) ceil((double) (length + 1) / 4.0)); if(buffer[offset] == ','){ ags_osc_buffer_util_get_string(buffer + offset, &str, &length); }else{ str = NULL; } if(type_tag != NULL){ type_tag[0] = str; }else{ g_free(str); } } /** * ags_osc_buffer_util_put_bundle: * @buffer: the unsigned char buffer * @tv_secs: number of seconds since midnight on January 1, 1900 * @tv_fraction: fraction of seconds to a precision of about 200 picoseconds * @immediately: if %TRUE apply immediately, otherwise %FALSE not immediately * * Put bundle to @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_put_bundle(unsigned char *buffer, gint32 tv_secs, gint32 tv_fraction, gboolean immediately) { if(buffer == NULL){ return; } memcpy(buffer, "#bundle", 8 * sizeof(unsigned char)); buffer += 8; ags_osc_buffer_util_put_timetag(buffer, tv_secs, tv_fraction, immediately); } /** * ags_osc_buffer_util_get_bundle: * @buffer: the unsigned char buffer * @tv_secs: return location of number of seconds since midnight on January 1, 1900 * @tv_fraction: return location of fraction of seconds to a precision of about 200 picoseconds * @immediately: return location of if %TRUE apply immediately, otherwise %FALSE not immediately * * Get bundle from @buffer. * * Since: 3.0.0 */ void ags_osc_buffer_util_get_bundle(unsigned char *buffer, gint32 *tv_secs, gint32 *tv_fraction, gboolean *immediately) { gboolean success; if(buffer == NULL){ return; } success = (!strncmp(buffer, "#bundle", 8)) ? TRUE: FALSE; if(!success){ if(tv_secs != NULL){ *tv_secs = -1; } if(tv_fraction != NULL){ *tv_fraction = -1; } if(immediately != NULL){ *immediately = FALSE; } return; } buffer += 8; ags_osc_buffer_util_get_timetag(buffer, tv_secs, tv_fraction, immediately); } gsequencer-3.1.3/ags/audio/osc/ags_osc_parser.h0000644000175000017500000000710413607210263016404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_PARSER_H__ #define __AGS_OSC_PARSER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_PARSER (ags_osc_parser_get_type ()) #define AGS_OSC_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_PARSER, AgsOscParser)) #define AGS_OSC_PARSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_PARSER, AgsOscParserClass)) #define AGS_IS_OSC_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_PARSER)) #define AGS_IS_OSC_PARSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_PARSER)) #define AGS_OSC_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_PARSER, AgsOscParserClass)) #define AGS_OSC_PARSER_GET_OBJ_MUTEX(obj) (&(((AgsOscParser *) obj)->obj_mutex)) #define AGS_OSC_PARSER_MAX_TEXT_LENGTH (4096) typedef struct _AgsOscParser AgsOscParser; typedef struct _AgsOscParserClass AgsOscParserClass; typedef enum{ AGS_OSC_PARSER_EOF = 1, }AgsOscParserFlags; struct _AgsOscParser { GObject gobject; guint flags; GRecMutex obj_mutex; unsigned char *buffer; size_t file_length; size_t offset; gsize start_offset; gint32 packet_size; xmlDoc *doc; }; struct _AgsOscParserClass { GObjectClass gobject; int (*osc_getc)(AgsOscParser *osc_parser); void (*on_error)(AgsOscParser *osc_parser, GError **error); xmlDoc* (*parse_full)(AgsOscParser *osc_parser); xmlNode* (*parse_bytes)(AgsOscParser *osc_parser, unsigned char *osc_buffer, guint buffer_length); xmlNode* (*packet)(AgsOscParser *osc_parser); xmlNode* (*bundle)(AgsOscParser *osc_parser); xmlNode* (*message)(AgsOscParser *osc_parser); xmlNode* (*value)(AgsOscParser *osc_parser, guint v_type); }; GType ags_osc_parser_get_type(void); gint32 ags_osc_parser_read_gint32(AgsOscParser *osc_parser); gint64 ags_osc_parser_read_gint64(AgsOscParser *osc_parser); gfloat ags_osc_parser_read_gfloat(AgsOscParser *osc_parser); gdouble ags_osc_parser_read_gdouble(AgsOscParser *osc_parser); gchar* ags_osc_parser_read_text(AgsOscParser *osc_parser, gint length); int ags_osc_parser_osc_getc(AgsOscParser *osc_parser); void ags_osc_parser_on_error(AgsOscParser *osc_parser, GError **error); xmlDoc* ags_osc_parser_parse_full(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_parse_bytes(AgsOscParser *osc_parser, unsigned char *osc_buffer, guint buffer_length); xmlNode* ags_osc_parser_packet(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_bundle(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_message(AgsOscParser *osc_parser); xmlNode* ags_osc_parser_value(AgsOscParser *osc_parser, guint v_type); AgsOscParser* ags_osc_parser_new(); G_END_DECLS #endif /*__AGS_OSC_PARSER_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_websocket_connection.h0000644000175000017500000000513113607210263021313 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_WEBSOCKET_CONNECTION_H__ #define __AGS_OSC_WEBSOCKET_CONNECTION_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_WEBSOCKET_CONNECTION (ags_osc_websocket_connection_get_type ()) #define AGS_OSC_WEBSOCKET_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_WEBSOCKET_CONNECTION, AgsOscWebsocketConnection)) #define AGS_OSC_WEBSOCKET_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_WEBSOCKET_CONNECTION, AgsOscWebsocketConnectionClass)) #define AGS_IS_OSC_WEBSOCKET_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_WEBSOCKET_CONNECTION)) #define AGS_IS_OSC_WEBSOCKET_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_WEBSOCKET_CONNECTION)) #define AGS_OSC_WEBSOCKET_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_WEBSOCKET_CONNECTION, AgsOscWebsocketConnectionClass)) typedef struct _AgsOscWebsocketConnection AgsOscWebsocketConnection; typedef struct _AgsOscWebsocketConnectionClass AgsOscWebsocketConnectionClass; struct _AgsOscWebsocketConnection { AgsOscConnection connection; SoupWebsocketConnection *websocket_connection; GObject *security_context; gchar *login; gchar *security_token; gchar *resource_id; }; struct _AgsOscWebsocketConnectionClass { AgsOscConnectionClass connection; }; GType ags_osc_websocket_connection_get_type(void); GList* ags_osc_websocket_connection_find_resource_id(GList *osc_websocket_connection, gchar *resource_id); /* instance */ AgsOscWebsocketConnection* ags_osc_websocket_connection_new(GObject *osc_server); G_END_DECLS #endif /*__AGS_OSC_WEBSOCKET_CONNECTION_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_connection.h0000644000175000017500000000757213607210263017260 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_OSC_CONNECTION_H__ #define __AGS_OSC_CONNECTION_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_OSC_CONNECTION (ags_osc_connection_get_type ()) #define AGS_OSC_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_OSC_CONNECTION, AgsOscConnection)) #define AGS_OSC_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_OSC_CONNECTION, AgsOscConnectionClass)) #define AGS_IS_OSC_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_OSC_CONNECTION)) #define AGS_IS_OSC_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OSC_CONNECTION)) #define AGS_OSC_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_OSC_CONNECTION, AgsOscConnectionClass)) #define AGS_OSC_CONNECTION_GET_OBJ_MUTEX(obj) (&(((AgsOscConnection *) obj)->obj_mutex)) #define AGS_OSC_CONNECTION_TIMEOUT_USEC (250) #define AGS_OSC_CONNECTION_DEAD_LINE_USEC (60000000) #define AGS_OSC_CONNECTION_CHUNK_SIZE (131072) #define AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH (256) typedef struct _AgsOscConnection AgsOscConnection; typedef struct _AgsOscConnectionClass AgsOscConnectionClass; /** * AgsOscConnectionFlags: * @AGS_OSC_CONNECTION_ACTIVE: is active * @AGS_OSC_CONNECTION_INET4: IPv4 connection * @AGS_OSC_CONNECTION_INET6: IPv6 connection * * Enum values to configure OSC connection. */ typedef enum{ AGS_OSC_CONNECTION_ACTIVE = 1, AGS_OSC_CONNECTION_INET4 = 1 << 1, AGS_OSC_CONNECTION_INET6 = 1 << 2, }AgsOscConnectionFlags; struct _AgsOscConnection { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *osc_server; gchar *ip4; gchar *ip6; int fd; GSocket *socket; struct timespec *start_time; guchar *cache_data; guint cache_data_length; guchar *buffer; guint allocated_buffer_size; guint read_count; gboolean has_valid_data; struct timespec *timeout_delay; struct timespec *timestamp; }; struct _AgsOscConnectionClass { GObjectClass gobject; guchar* (*read_bytes)(AgsOscConnection *osc_connection, guint *data_length); gint64 (*write_response)(AgsOscConnection *osc_connection, GObject *osc_response); void (*close)(AgsOscConnection *osc_connection); }; GType ags_osc_connection_get_type(void); gboolean ags_osc_connection_test_flags(AgsOscConnection *osc_connection, guint flags); void ags_osc_connection_set_flags(AgsOscConnection *osc_connection, guint flags); void ags_osc_connection_unset_flags(AgsOscConnection *osc_connection, guint flags); gboolean ags_osc_connection_timeout_expired(struct timespec *start_time, struct timespec *timeout_delay); /* events */ guchar* ags_osc_connection_read_bytes(AgsOscConnection *osc_connection, guint *data_length); gint64 ags_osc_connection_write_response(AgsOscConnection *osc_connection, GObject *osc_response); void ags_osc_connection_close(AgsOscConnection *osc_connection); /* instance */ AgsOscConnection* ags_osc_connection_new(GObject *osc_server); G_END_DECLS #endif /*__AGS_OSC_CONNECTION_H__*/ gsequencer-3.1.3/ags/audio/osc/ags_osc_xmlrpc_message.c0000644000175000017500000001621213607210263020114 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_osc_xmlrpc_message_class_init(AgsOscXmlrpcMessageClass *osc_xmlrpc_message); void ags_osc_xmlrpc_message_init(AgsOscXmlrpcMessage *osc_xmlrpc_message); void ags_osc_xmlrpc_message_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_xmlrpc_message_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_xmlrpc_message_dispose(GObject *gobject); void ags_osc_xmlrpc_message_finalize(GObject *gobject); /** * SECTION:ags_osc_xmlrpc_message * @short_description: the OSC server side XMLRPC message * @title: AgsOscXmlrpcMessage * @section_id: * @include: ags/audio/osc/ags_osc_xmlrpc_message.h * * #AgsOscXmlrpcMessage your OSC server side XMLRPC message. */ enum{ PROP_0, PROP_MSG, PROP_QUERY, }; static gpointer ags_osc_xmlrpc_message_parent_class = NULL; GType ags_osc_xmlrpc_message_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_xmlrpc_message = 0; static const GTypeInfo ags_osc_xmlrpc_message_info = { sizeof (AgsOscXmlrpcMessageClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_xmlrpc_message_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscXmlrpcMessage), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_xmlrpc_message_init, }; ags_type_osc_xmlrpc_message = g_type_register_static(AGS_TYPE_OSC_MESSAGE, "AgsOscXmlrpcMessage", &ags_osc_xmlrpc_message_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_xmlrpc_message); } return g_define_type_id__volatile; } void ags_osc_xmlrpc_message_class_init(AgsOscXmlrpcMessageClass *osc_xmlrpc_message) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_xmlrpc_message_parent_class = g_type_class_peek_parent(osc_xmlrpc_message); /* GObjectClass */ gobject = (GObjectClass *) osc_xmlrpc_message; gobject->set_property = ags_osc_xmlrpc_message_set_property; gobject->get_property = ags_osc_xmlrpc_message_get_property; gobject->dispose = ags_osc_xmlrpc_message_dispose; gobject->finalize = ags_osc_xmlrpc_message_finalize; /* properties */ /** * AgsOscXmlrpcMessage:msg: * * The assigned #SoupMessage. * * Since: 3.0.0 */ param_spec = g_param_spec_object("msg", i18n_pspec("assigned soup message"), i18n_pspec("The soup message it is assigned with"), SOUP_TYPE_MESSAGE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MSG, param_spec); /** * AgsOscXmlrpcMessage:query: * * The current query. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("query", i18n_pspec("query"), i18n_pspec("The current query"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_QUERY, param_spec); /* signals */ } void ags_osc_xmlrpc_message_init(AgsOscXmlrpcMessage *osc_xmlrpc_message) { osc_xmlrpc_message->msg = NULL; osc_xmlrpc_message->query = NULL; } void ags_osc_xmlrpc_message_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscXmlrpcMessage *osc_xmlrpc_message; GRecMutex *osc_message_mutex; osc_xmlrpc_message = AGS_OSC_XMLRPC_MESSAGE(gobject); /* get osc message mutex */ osc_message_mutex = AGS_OSC_MESSAGE_GET_OBJ_MUTEX(osc_xmlrpc_message); switch(prop_id){ case PROP_MSG: { GObject *msg; msg = g_value_get_object(value); g_rec_mutex_lock(osc_message_mutex); if(osc_xmlrpc_message->msg == msg){ g_rec_mutex_unlock(osc_message_mutex); return; } if(osc_xmlrpc_message->msg != NULL){ g_object_unref(osc_xmlrpc_message->msg); } if(msg != NULL){ g_object_ref(msg); } osc_xmlrpc_message->msg = msg; g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_QUERY: { GHashTable *query; query = g_value_get_pointer(value); g_rec_mutex_lock(osc_message_mutex); osc_xmlrpc_message->query = query; g_rec_mutex_unlock(osc_message_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_xmlrpc_message_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscXmlrpcMessage *osc_xmlrpc_message; GRecMutex *osc_message_mutex; osc_xmlrpc_message = AGS_OSC_XMLRPC_MESSAGE(gobject); /* get osc message mutex */ osc_message_mutex = AGS_OSC_MESSAGE_GET_OBJ_MUTEX(osc_xmlrpc_message); switch(prop_id){ case PROP_MSG: { g_rec_mutex_lock(osc_message_mutex); g_value_set_object(value, osc_xmlrpc_message->msg); g_rec_mutex_unlock(osc_message_mutex); } break; case PROP_QUERY: { g_rec_mutex_lock(osc_message_mutex); g_value_set_pointer(value, osc_xmlrpc_message->query); g_rec_mutex_unlock(osc_message_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_xmlrpc_message_dispose(GObject *gobject) { AgsOscXmlrpcMessage *osc_xmlrpc_message; osc_xmlrpc_message = (AgsOscXmlrpcMessage *) gobject; if(osc_xmlrpc_message->msg != NULL){ g_object_unref(osc_xmlrpc_message->msg); osc_xmlrpc_message->msg = NULL; } /* call parent */ G_OBJECT_CLASS(ags_osc_xmlrpc_message_parent_class)->dispose(gobject); } void ags_osc_xmlrpc_message_finalize(GObject *gobject) { AgsOscXmlrpcMessage *osc_xmlrpc_message; osc_xmlrpc_message = (AgsOscXmlrpcMessage *) gobject; if(osc_xmlrpc_message->msg != NULL){ g_object_unref(osc_xmlrpc_message->msg); } /* call parent */ G_OBJECT_CLASS(ags_osc_xmlrpc_message_parent_class)->finalize(gobject); } /** * ags_osc_xmlrpc_message_new: * * Creates a new instance of #AgsOscXmlrpcMessage * * Returns: the new #AgsOscXmlrpcMessage * * Since: 3.0.0 */ AgsOscXmlrpcMessage* ags_osc_xmlrpc_message_new() { AgsOscXmlrpcMessage *osc_xmlrpc_message; osc_xmlrpc_message = (AgsOscXmlrpcMessage *) g_object_new(AGS_TYPE_OSC_XMLRPC_MESSAGE, NULL); return(osc_xmlrpc_message); } gsequencer-3.1.3/ags/audio/osc/ags_osc_builder.c0000644000175000017500000007746613607210263016553 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_osc_builder_class_init(AgsOscBuilderClass *osc_builder); void ags_osc_builder_init(AgsOscBuilder *osc_builder); void ags_osc_builder_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_osc_builder_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_osc_builder_finalize(GObject *gobject); void ags_osc_builder_real_osc_putc(AgsOscBuilder *osc_builder, gint c); void ags_osc_builder_real_on_error(AgsOscBuilder *osc_builder, GError **error); void ags_osc_builder_real_append_packet(AgsOscBuilder *osc_builder); void ags_osc_builder_real_append_bundle(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gint tv_secs, gint tv_fraction, gboolean immediately); void ags_osc_builder_real_append_message(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gchar *address_pattern, gchar *type_tag); void ags_osc_builder_real_append_value(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gint v_type, GValue *value); void ags_osc_builder_skip_empty_types(AgsOscBuilder *osc_builder); void ags_osc_builder_bundle_resize(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gsize grow_data); void ags_osc_builder_message_check_resize(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gsize append_size); void ags_osc_builder_build_bundle(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *bundle, unsigned char *data, gsize *offset); void ags_osc_builder_build_message(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, unsigned char *data, gsize *offset); /** * SECTION:ags_osc_builder * @short_description: OSC builder * @title: AgsOscBuilder * @section_id: * @include: ags/audio/osc/ags_osc_builder.h * * The #AgsOscBuilder lets you create OSC files using its builder functions. */ enum{ PROP_0, }; enum{ OSC_PUTC, ON_ERROR, APPEND_PACKET, APPEND_BUNDLE, APPEND_MESSAGE, APPEND_VALUE, LAST_SIGNAL, }; static gpointer ags_osc_builder_parent_class = NULL; static guint osc_builder_signals[LAST_SIGNAL]; GType ags_osc_builder_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_osc_builder = 0; static const GTypeInfo ags_osc_builder_info = { sizeof (AgsOscBuilderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_osc_builder_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsOscBuilder), 0, /* n_preallocs */ (GInstanceInitFunc) ags_osc_builder_init, }; ags_type_osc_builder = g_type_register_static(G_TYPE_OBJECT, "AgsOscBuilder", &ags_osc_builder_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_osc_builder); } return g_define_type_id__volatile; } void ags_osc_builder_class_init(AgsOscBuilderClass *osc_builder) { GObjectClass *gobject; GParamSpec *param_spec; ags_osc_builder_parent_class = g_type_class_peek_parent(osc_builder); /* GObjectClass */ gobject = (GObjectClass *) osc_builder; gobject->set_property = ags_osc_builder_set_property; gobject->get_property = ags_osc_builder_get_property; gobject->finalize = ags_osc_builder_finalize; /* properties */ /* AgsOscBuilderClass */ osc_builder->osc_putc = ags_osc_builder_real_osc_putc; osc_builder->on_error = ags_osc_builder_real_on_error; osc_builder->append_packet = ags_osc_builder_real_append_packet; osc_builder->append_bundle = ags_osc_builder_real_append_bundle; osc_builder->append_message = ags_osc_builder_real_append_message; osc_builder->append_value = ags_osc_builder_real_append_value; /* signals */ /** * AgsOscBuilder::osc-putc: * @osc_builder: the builder * @error: the #GError * * The ::osc-putc signal is emited during putting char to file. * * Since: 3.0.0 */ osc_builder_signals[OSC_PUTC] = g_signal_new("osc-putc", G_TYPE_FROM_CLASS(osc_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscBuilderClass, osc_putc), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); /** * AgsOscBuilder::on-error: * @osc_builder: the builder * @error: the #GError * * The ::on-error signal is emited during building of event. * * Since: 3.0.0 */ osc_builder_signals[ON_ERROR] = g_signal_new("on-error", G_TYPE_FROM_CLASS(osc_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscBuilderClass, on_error), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsOscBuilder::append-packet: * @osc_builder: the builder * * The ::append-packet signal is emited during building packet. * * Since: 3.0.0 */ osc_builder_signals[APPEND_PACKET] = g_signal_new("append-packet", G_TYPE_FROM_CLASS(osc_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscBuilderClass, append_packet), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsOscBuilder::append-bundle: * @osc_builder: the builder * @parent_bundle: the parent #AgsOscBuilderBundle-struct or %NULL * @tv_secs: time value secondes since midnight January 1900 * @tv_fraction: time value fractions of second * @immediately: if %TRUE apply immediately, otherwise %FALSE * * The ::append-bundle signal is emited during building bundle. * * Since: 3.0.0 */ osc_builder_signals[APPEND_BUNDLE] = g_signal_new("append-bundle", G_TYPE_FROM_CLASS(osc_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscBuilderClass, append_bundle), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN, G_TYPE_NONE, 4, G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT, G_TYPE_BOOLEAN); /** * AgsOscBuilder::append-message: * @osc_builder: the builder * @parent_bundle: the parent #AgsOscBuilderBundle-struct or %NULL * @address_pattern: the address pattern string * @type_tag: the type tag string * * The ::append-message signal is emited during building message. * * Since: 3.0.0 */ osc_builder_signals[APPEND_MESSAGE] = g_signal_new("append-message", G_TYPE_FROM_CLASS(osc_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscBuilderClass, append_message), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); /** * AgsOscBuilder::append-value: * @osc_builder: the builder * @message: the message * @v_type: the type as ASCII char * @value: the #GValue-struct * * The ::append-value signal is emited during building value. * * Since: 3.0.0 */ osc_builder_signals[APPEND_VALUE] = g_signal_new("append-value", G_TYPE_FROM_CLASS(osc_builder), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsOscBuilderClass, append_value), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_INT_POINTER, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER); } void ags_osc_builder_init(AgsOscBuilder *osc_builder) { osc_builder->flags = 0; /* osc builder mutex */ g_rec_mutex_init(&(osc_builder->obj_mutex)); osc_builder->data = NULL; osc_builder->length = 0; osc_builder->offset = 0; osc_builder->packet = NULL; osc_builder->current_type_tag = NULL; osc_builder->offset_type_tag = NULL; } void ags_osc_builder_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsOscBuilder *osc_builder; GRecMutex *osc_builder_mutex; osc_builder = AGS_OSC_BUILDER(gobject); /* get osc builder mutex */ osc_builder_mutex = AGS_OSC_BUILDER_GET_OBJ_MUTEX(osc_builder); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_builder_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsOscBuilder *osc_builder; GRecMutex *osc_builder_mutex; osc_builder = AGS_OSC_BUILDER(gobject); /* get osc builder mutex */ osc_builder_mutex = AGS_OSC_BUILDER_GET_OBJ_MUTEX(osc_builder); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_osc_builder_finalize(GObject *gobject) { AgsOscBuilder *osc_builder; osc_builder = (AgsOscBuilder *) gobject; if(osc_builder->data != NULL){ free(osc_builder->data); } g_list_free_full(osc_builder->packet, (GDestroyNotify) ags_osc_builder_packet_free); /* call parent */ G_OBJECT_CLASS(ags_osc_builder_parent_class)->finalize(gobject); } void ags_osc_builder_skip_empty_types(AgsOscBuilder *osc_builder) { gchar *iter; if(!AGS_IS_OSC_BUILDER(osc_builder)){ return; } for(iter = osc_builder->offset_type_tag; iter[0] != '\0'; iter++){ if(!(iter[0] == 'T' || iter[0] == 'F' || iter[0] == 'N' || iter[0] == 'I' || iter[0] == '[' || iter[0] == ']')){ break; } } if(iter[0] != '\0'){ osc_builder->offset_type_tag = iter; }else{ osc_builder->current_type_tag = NULL; osc_builder->offset_type_tag = NULL; } } void ags_osc_builder_bundle_resize(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gsize grow_data) { if(parent_bundle == NULL){ return; } do{ parent_bundle->bundle_size += grow_data; parent_bundle = parent_bundle->parent_bundle; }while(parent_bundle->parent_bundle != NULL); parent_bundle->packet->packet_size += grow_data; } void ags_osc_builder_message_check_resize(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gsize append_size) { if(message->data_length + append_size > message->data_allocated_length){ gsize new_data_allocated_length; new_data_allocated_length = message->data_allocated_length + AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE; if(message->data == NULL){ message->data = (unsigned char *) malloc(AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); memset(message->data, 0, AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); }else{ message->data = (unsigned char *) realloc(message->data, new_data_allocated_length * sizeof(unsigned char)); memset(message->data + (new_data_allocated_length - AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE), 0, AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE * sizeof(unsigned char)); } message->data_allocated_length = new_data_allocated_length; } } /** * ags_osc_builder_packet_alloc: * @offset: the current offset * * Allocate #AgsOscBuilderPacket-struct. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsOscBuilderPacket-struct * * Since: 3.0.0 */ AgsOscBuilderPacket* ags_osc_builder_packet_alloc(guint64 offset) { AgsOscBuilderPacket *packet; packet = (AgsOscBuilderPacket *) malloc(sizeof(AgsOscBuilderPacket)); packet->offset = offset; packet->packet_size = 0; packet->builder = NULL; packet->message = NULL; packet->bundle = NULL; return(packet); } /** * ags_osc_builder_packet_free: * @packet: (type gpointer) (transfer none): the #AgsOscBuilderPacket-struct * * Free @packet. * * Since: 3.0.0 */ void ags_osc_builder_packet_free(AgsOscBuilderPacket *packet) { if(packet == NULL){ return; } g_list_free_full(packet->message, (GDestroyNotify) ags_osc_builder_message_free); g_list_free_full(packet->bundle, (GDestroyNotify) ags_osc_builder_bundle_free); free(packet); } /** * ags_osc_builder_bundle_alloc: * @offset: the current offset * * Allocate #AgsOscBuilderBundle-struct. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsOscBuilderBundle-struct * * Since: 3.0.0 */ AgsOscBuilderBundle* ags_osc_builder_bundle_alloc(guint64 offset) { AgsOscBuilderBundle *bundle; bundle = (AgsOscBuilderBundle *) malloc(sizeof(AgsOscBuilderBundle)); bundle->offset = offset; bundle->tv_secs = -1; bundle->tv_fraction = -1; bundle->immediately = FALSE; bundle->packet = NULL; bundle->parent_bundle = NULL; bundle->message = NULL; bundle->bundle = NULL; return(bundle); } /** * ags_osc_builder_bundle_free: * @bundle: (type gpointer) (transfer none): the #AgsOscBuilderBundle-struct * * Free @bundle. * * Since: 3.0.0 */ void ags_osc_builder_bundle_free(AgsOscBuilderBundle *bundle) { if(bundle == NULL){ return; } g_list_free_full(bundle->message, (GDestroyNotify) ags_osc_builder_message_free); g_list_free_full(bundle->bundle, (GDestroyNotify) ags_osc_builder_bundle_free); free(bundle); } /** * ags_osc_builder_message_alloc: * @offset: the current offset * * Allocate #AgsOscBuilderMessage-struct. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsOscBuilderMessage-struct * * Since: 3.0.0 */ AgsOscBuilderMessage* ags_osc_builder_message_alloc(guint64 offset) { AgsOscBuilderMessage *message; message = (AgsOscBuilderMessage *) malloc(sizeof(AgsOscBuilderMessage)); message->offset = offset; message->address_pattern = NULL; message->type_tag = NULL; message->data_allocated_length = 0; message->data_length = 0; message->data = NULL; message->packet = NULL; message->parent_bundle = NULL; return(message); } /** * ags_osc_builder_message_free: * @message: (type gpointer) (transfer none): the #AgsOscBuilderMessage-struct * * Free @message. * * Since: 3.0.0 */ void ags_osc_builder_message_free(AgsOscBuilderMessage *message) { if(message == NULL){ return; } if(message->address_pattern != NULL){ free(message->address_pattern); } if(message->type_tag != NULL){ free(message->type_tag); } if(message->data != NULL){ free(message->data); } free(message); } void ags_osc_builder_real_osc_putc(AgsOscBuilder *osc_builder, gint c) { //TODO:JK: implement me } /** * ags_osc_builder_osc_putc: * @osc_builder: the #AgsOscBuilder * @c: the character * * Put character * * Since: 3.0.0 */ void ags_osc_builder_osc_putc(AgsOscBuilder *osc_builder, gint c) { g_return_if_fail(AGS_IS_OSC_BUILDER(osc_builder)); g_object_ref((GObject *) osc_builder); g_signal_emit(G_OBJECT(osc_builder), osc_builder_signals[OSC_PUTC], 0, c); g_object_unref((GObject *) osc_builder); } void ags_osc_builder_real_on_error(AgsOscBuilder *osc_builder, GError **error) { if(error != NULL && *error != NULL){ g_warning("%s", (*error)->message); } } /** * ags_osc_builder_on_error: * @osc_builder: the #AgsOscBuilder * @error: the return location of #GError-struct * * Report error. * * Since: 3.0.0 */ void ags_osc_builder_on_error(AgsOscBuilder *osc_builder, GError **error) { g_return_if_fail(AGS_IS_OSC_BUILDER(osc_builder)); g_object_ref((GObject *) osc_builder); g_signal_emit(G_OBJECT(osc_builder), osc_builder_signals[ON_ERROR], 0, error); g_object_unref((GObject *) osc_builder); } void ags_osc_builder_real_append_packet(AgsOscBuilder *osc_builder) { AgsOscBuilderPacket *packet; if(osc_builder->current_type_tag != NULL){ g_critical("current type tag != NULL - complete values first"); return; } packet = ags_osc_builder_packet_alloc(osc_builder->offset); osc_builder->packet = g_list_prepend(osc_builder->packet, packet); osc_builder->offset += 4; } /** * ags_osc_builder_append_packet: * @osc_builder: the #AgsOscBuilder * * Since: 3.0.0 */ void ags_osc_builder_append_packet(AgsOscBuilder *osc_builder) { g_return_if_fail(AGS_IS_OSC_BUILDER(osc_builder)); g_object_ref((GObject *) osc_builder); g_signal_emit(G_OBJECT(osc_builder), osc_builder_signals[APPEND_PACKET], 0); g_object_unref((GObject *) osc_builder); } void ags_osc_builder_real_append_bundle(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gint tv_secs, gint tv_fraction, gboolean immediately) { AgsOscBuilderBundle *bundle; if(osc_builder->current_type_tag != NULL){ g_critical("current type tag != NULL - complete values first"); return; } bundle = ags_osc_builder_bundle_alloc(osc_builder->offset); bundle->tv_secs = tv_secs; bundle->tv_fraction = tv_fraction; bundle->immediately = immediately; if(parent_bundle == NULL){ if(osc_builder->packet != NULL){ bundle->packet = osc_builder->packet->data; bundle->packet->bundle = g_list_prepend(bundle->packet->bundle, bundle); bundle->packet->packet_size += 16; }else{ g_warning("can't append OSC bundle because no package available"); return; } }else{ bundle->parent_bundle = parent_bundle; parent_bundle->bundle = g_list_prepend(parent_bundle->bundle, bundle); ags_osc_builder_bundle_resize(osc_builder, parent_bundle, 16); } } /** * ags_osc_builder_append_bundle: * @osc_builder: the #AgsOscBuilder * @parent_bundle: the parent #AgsOscBuilderBundle-struct or %NULL * @tv_secs: number of seconds since midnight on January 1, 1900 * @tv_fraction: fraction of seconds to a precision of about 200 picoseconds * @immediately: if %TRUE apply immediately, otherwise %FALSE not immediately * * Append bundle. * * Since: 3.0.0 */ void ags_osc_builder_append_bundle(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gint tv_secs, gint tv_fraction, gboolean immediately) { g_return_if_fail(AGS_IS_OSC_BUILDER(osc_builder)); g_object_ref((GObject *) osc_builder); g_signal_emit(G_OBJECT(osc_builder), osc_builder_signals[APPEND_BUNDLE], 0, parent_bundle, tv_secs, tv_fraction, immediately); g_object_unref((GObject *) osc_builder); } void ags_osc_builder_real_append_message(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gchar *address_pattern, gchar *type_tag) { AgsOscBuilderMessage *message; guint64 address_pattern_length; guint64 type_tag_length; if(osc_builder->current_type_tag != NULL){ g_critical("current type tag != NULL - complete values first"); return; } message = ags_osc_builder_message_alloc(osc_builder->offset); message->address_pattern = g_strdup(address_pattern); address_pattern_length = strlen(address_pattern); message->type_tag = g_strdup(type_tag); type_tag_length = strlen(type_tag); osc_builder->current_type_tag = message->type_tag; osc_builder->offset_type_tag = message->type_tag; ags_osc_builder_skip_empty_types(osc_builder); if(parent_bundle == NULL){ if(osc_builder->packet != NULL){ message->packet = osc_builder->packet->data; message->packet->message = g_list_prepend(message->packet->message, message); message->packet->packet_size += (address_pattern_length + 1) + (type_tag_length + 1); }else{ g_warning("can't append OSC message because no package available"); return; } }else{ ags_osc_builder_bundle_resize(osc_builder, parent_bundle, (address_pattern_length + 1) + (type_tag_length + 1)); } } /** * ags_osc_builder_append_message: * @osc_builder: the #AgsOscBuilder * @parent_bundle: the parent #AgsOscBuilderBundle-struct or %NULL * @address_pattern: the address pattern * @type_tag: the type tag * * Append message. * * Since: 3.0.0 */ void ags_osc_builder_append_message(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *parent_bundle, gchar *address_pattern, gchar *type_tag) { g_return_if_fail(AGS_IS_OSC_BUILDER(osc_builder)); g_object_ref((GObject *) osc_builder); g_signal_emit(G_OBJECT(osc_builder), osc_builder_signals[APPEND_MESSAGE], 0, parent_bundle, address_pattern, type_tag); g_object_unref((GObject *) osc_builder); } void ags_osc_builder_real_append_value(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gint v_type, GValue *value) { if(osc_builder->offset_type_tag[0] != v_type){ g_critical("message's value type not matching"); return; } switch(v_type){ case AGS_OSC_UTIL_TYPE_TAG_STRING_INT32: { gint32 val; val = g_value_get_int(value); ags_osc_builder_message_check_resize(osc_builder, message, 4); ags_osc_buffer_util_put_int32(message->data + message->data_length, val); message->data_length += 4; osc_builder->offset += 4; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT: { gfloat val; val = g_value_get_float(value); ags_osc_builder_message_check_resize(osc_builder, message, 4); ags_osc_buffer_util_put_float(message->data + message->data_length, val); message->data_length += 4; osc_builder->offset += 4; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_STRING: { gchar *str; guint64 length; str = g_value_get_string(value); length = strlen(str); ags_osc_builder_message_check_resize(osc_builder, message, length + 1); ags_osc_buffer_util_put_string(message->data + message->data_length, str, -1); message->data_length += (length + 1); osc_builder->offset += (length + 1); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB: { unsigned char *data; gint32 data_size; data_size = g_value_get_int(&(value[0])); data = g_value_get_pointer(&(value[1])); ags_osc_builder_message_check_resize(osc_builder, message, data_size + 4); ags_osc_buffer_util_put_blob(message->data + message->data_length, data_size, data); message->data_length += (data_size + 4); osc_builder->offset += (data_size + 4); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_INT64: { gint64 val; val = g_value_get_int64(value); ags_osc_builder_message_check_resize(osc_builder, message, 8); ags_osc_buffer_util_put_int64(message->data + message->data_length, val); message->data_length += 8; osc_builder->offset += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG: { gint32 tv_secs; gint32 tv_fraction; gboolean immediately; tv_secs = g_value_get_int(&(value[0])); tv_fraction = g_value_get_int(&(value[1])); immediately = g_value_get_boolean(&(value[2])); ags_osc_builder_message_check_resize(osc_builder, message, 8); ags_osc_buffer_util_put_timetag(message->data + message->data_length, tv_secs, tv_fraction, immediately); message->data_length += 8; osc_builder->offset += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE: { gdouble val; val = g_value_get_double(value); ags_osc_builder_message_check_resize(osc_builder, message, 8); ags_osc_buffer_util_put_double(message->data + message->data_length, val); message->data_length += 8; osc_builder->offset += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL: { gchar *str; guint64 length; str = g_value_get_string(value); length = strlen(str); ags_osc_builder_message_check_resize(osc_builder, message, length + 1); ags_osc_buffer_util_put_string(message->data + message->data_length, str, -1); message->data_length += (length + 1); osc_builder->offset += (length + 1); } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR: { gint32 val; val = g_value_get_int(value); ags_osc_builder_message_check_resize(osc_builder, message, 4); ags_osc_buffer_util_put_char(message->data + message->data_length, val); message->data_length += 4; osc_builder->offset += 4; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA: { guint8 r, g, b, a; r = g_value_get_int(&(value[0])); g = g_value_get_int(&(value[1])); b = g_value_get_int(&(value[2])); a = g_value_get_int(&(value[3])); ags_osc_builder_message_check_resize(osc_builder, message, 8); ags_osc_buffer_util_put_rgba(message->data + message->data_length, r, g, b, a); message->data_length += 8; osc_builder->offset += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI: { guint8 port; guint8 status_byte; guint8 data0, data1; port = g_value_get_int(&(value[0])); status_byte = g_value_get_int(&(value[1])); data0 = g_value_get_int(&(value[2])); data1 = g_value_get_int(&(value[3])); ags_osc_builder_message_check_resize(osc_builder, message, 8); ags_osc_buffer_util_put_midi(message->data + message->data_length, port, status_byte, data0, data1); message->data_length += 8; osc_builder->offset += 8; } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_NIL: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START: { //empty } break; case AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END: { //empty } break; default: { g_warning("unknown type"); return; } } osc_builder->offset_type_tag += 1; ags_osc_builder_skip_empty_types(osc_builder); } /** * ags_osc_builder_append_value: * @osc_builder: the #AgsOscBuilder * @message: the message * @v_type: the type as char * @value: the #GValue-struct containinig value * * Append value. * * Since: 3.0.0 */ void ags_osc_builder_append_value(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, gint v_type, GValue *value) { g_return_if_fail(AGS_IS_OSC_BUILDER(osc_builder)); g_object_ref((GObject *) osc_builder); g_signal_emit(G_OBJECT(osc_builder), osc_builder_signals[APPEND_VALUE], 0, message, v_type, value); g_object_unref((GObject *) osc_builder); } void ags_osc_builder_build_bundle(AgsOscBuilder *osc_builder, AgsOscBuilderBundle *current_bundle, unsigned char *data, gsize *offset) { GList *message_start, *message; GList *bundle_start, *bundle; /* #bundle */ ags_osc_buffer_util_put_string(data + offset[0], "#bundle", -1); offset[0] += 8; /* time tag */ ags_osc_buffer_util_put_timetag(data + offset[0], current_bundle->tv_secs, current_bundle->tv_fraction, current_bundle->immediately); offset[0] += 8; /* content */ message_start = g_list_copy(current_bundle->message); message_start = g_list_reverse(message_start); bundle_start = g_list_copy(current_bundle->bundle); bundle_start = g_list_reverse(bundle_start); message = message_start; bundle = bundle_start; while(message != NULL || bundle != NULL){ if(bundle == NULL || (message != NULL && AGS_OSC_BUILDER_MESSAGE(message->data)->offset < AGS_OSC_BUILDER_BUNDLE(bundle->data)->offset)){ ags_osc_builder_build_message(osc_builder, message->data, data, offset); }else{ ags_osc_builder_build_bundle(osc_builder, bundle->data, data, offset); } /* iterate */ if(message != NULL){ message = message->next; } if(bundle != NULL){ bundle = bundle->next; } } g_list_free(message_start); g_list_free(bundle_start); } void ags_osc_builder_build_message(AgsOscBuilder *osc_builder, AgsOscBuilderMessage *message, unsigned char *data, gsize *offset) { guint64 address_pattern_length; guint64 type_tag_length; /* address pattern */ address_pattern_length = strlen(message->address_pattern); ags_osc_buffer_util_put_string(data + offset[0], message->address_pattern, -1); offset[0] += (address_pattern_length + 1); /* type tag */ type_tag_length = strlen(message->type_tag); ags_osc_buffer_util_put_string(data + offset[0], message->type_tag, -1); offset[0] += (type_tag_length + 1); /* data */ memcpy(data + offset[0], message->data, message->data_length * sizeof(unsigned char)); offset[0] += message->data_length; } /** * ags_osc_builder_build: * @osc_builder: the #AgsOscBuilder * * Build the OSC data. * * Since: 3.0.0 */ void ags_osc_builder_build(AgsOscBuilder *osc_builder) { GList *packet_start, *packet; unsigned char *data; gsize data_length; gsize offset; if(!AGS_IS_OSC_BUILDER(osc_builder)){ return; } packet_start = g_list_copy(osc_builder->packet); packet_start = g_list_reverse(packet_start); packet = packet_start; data = NULL; offset = 0; data_length = 0; while(packet != NULL){ GList *message_start, *message; GList *bundle_start, *bundle; /* re-allocate data */ if(data == NULL){ data = (unsigned char *) malloc((4 + AGS_OSC_BUILDER_PACKET(packet->data)->packet_size) * sizeof(unsigned char)); data_length = 4 + AGS_OSC_BUILDER_PACKET(packet->data)->packet_size; }else{ data = (unsigned char *) realloc(data, (data_length + 4 + AGS_OSC_BUILDER_PACKET(packet->data)->packet_size) * sizeof(unsigned char)); data_length += (4 + AGS_OSC_BUILDER_PACKET(packet->data)->packet_size); } /* put packet size */ ags_osc_buffer_util_put_int32(data + offset, AGS_OSC_BUILDER_PACKET(packet->data)->packet_size); /* */ message_start = g_list_copy(AGS_OSC_BUILDER_PACKET(packet->data)->message); message_start = g_list_reverse(message_start); bundle_start = g_list_copy(AGS_OSC_BUILDER_PACKET(packet->data)->bundle); bundle_start = g_list_reverse(bundle_start); message = message_start; bundle = bundle_start; while(message != NULL || bundle != NULL){ if(bundle == NULL || (message != NULL && AGS_OSC_BUILDER_MESSAGE(message->data)->offset < AGS_OSC_BUILDER_BUNDLE(bundle->data)->offset)){ ags_osc_builder_build_message(osc_builder, message->data, data, &offset); }else{ ags_osc_builder_build_bundle(osc_builder, bundle->data, data, &offset); } /* iterate */ if(message != NULL){ message = message->next; } if(bundle != NULL){ bundle = bundle->next; } } g_list_free(message_start); g_list_free(bundle_start); /* iterate */ packet = packet->next; } g_list_free(packet_start); osc_builder->data = data; osc_builder->length = offset; } /** * ags_osc_builder_new: * * Creates a new instance of #AgsOscBuilder * * Returns: the new #AgsOscBuilder * * Since: 3.0.0 */ AgsOscBuilder* ags_osc_builder_new() { AgsOscBuilder *osc_builder; osc_builder = (AgsOscBuilder *) g_object_new(AGS_TYPE_OSC_BUILDER, NULL); return(osc_builder); } gsequencer-3.1.3/ags/audio/osc/ags_osc_util.c0000644000175000017500000001471113607210263016062 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #ifdef __APPLE__ #include #include #endif /** * SECTION:ags_osc_util * @short_description: OSC util * @title: AgsOscUtil * @section_id: * @include: ags/audio/osc/ags_osc_util.h * * Utility functions for OSC. */ /** * ags_osc_util_type_tag_string_count_type: * @type_tag: the type tag string * * Count types in @type_tag. * * Returns: the count of types specified * * Since: 3.0.0 */ guint ags_osc_util_type_tag_string_count_type(gchar *type_tag) { gsize count; if(type_tag == NULL || type_tag[0] != ','){ return(0); } count = strlen(type_tag); if(count <= 0){ return(0); } count -= 1; return(count); } /** * ags_osc_util_meta_data: * @uri: the URI * @meta_data_length: the return location of meta data's length * * Get meta data. * * Returns: the byte array containing meta data * * Since: 3.0.0 */ unsigned char* ags_osc_util_meta_data(gchar *uri, guint *meta_data_length) { unsigned char *meta_data; meta_data = g_strdup_printf("framing=slip\nversion=1.0 | 1.1\nuri=%s\ntypes=%s\n", uri, AGS_OSC_UTIL_TYPE_TAG_STRING_ALL); if(meta_data_length != NULL){ *meta_data_length = strlen(meta_data); } return(meta_data); } /** * ags_osc_util_mime_header: * @uri: the URI * @mime_header_length: the return location of MIME header's length * * Get MIME header. * * Returns: the byte array containing MIME header * * Since: 3.0.0 */ unsigned char* ags_osc_util_mime_header(gchar *uri, guint *mime_header_length) { unsigned char *mime_header; mime_header = g_strdup_printf("MIME-Version: 1.0\nContent-type: application/osc;\nframing=slip\nversion=1.0 | 1.1\nuri=%s\ntypes=%s\n", uri, AGS_OSC_UTIL_TYPE_TAG_STRING_ALL); if(mime_header_length != NULL){ *mime_header_length = strlen(mime_header); } return(mime_header); } /** * ags_osc_util_slip_encode: * @osc_buffer: the OSC buffer * @buffer_length: the OSC buffer's length * @returned_buffer_length: the returned buffer's length * * Encode @osc_buffer to be suitable for network transmission. * See SLIP (RFC1055). * * Returns: the encoded byte array * * Since: 3.0.0 */ unsigned char* ags_osc_util_slip_encode(unsigned char *osc_buffer, guint buffer_length, guint *returned_buffer_length) { unsigned char *slip_buffer; guint slip_buffer_length; guint i, j; slip_buffer_length = (guint) AGS_OSC_UTIL_SLIP_CHUNK_LENGTH + 2; slip_buffer = (unsigned char *) malloc((slip_buffer_length + 2) * sizeof(unsigned char)); slip_buffer[0] = AGS_OSC_UTIL_SLIP_END; for(i = 0, j = 1; i < buffer_length; i++, j++){ if(j + 2 >= slip_buffer_length){ slip_buffer_length = slip_buffer_length + AGS_OSC_UTIL_SLIP_CHUNK_LENGTH; slip_buffer = (unsigned char *) realloc(slip_buffer, (slip_buffer_length + AGS_OSC_UTIL_SLIP_CHUNK_LENGTH) * sizeof(unsigned char)); } switch(osc_buffer[i]){ case AGS_OSC_UTIL_SLIP_END: { slip_buffer[j] = AGS_OSC_UTIL_SLIP_ESC; j++; slip_buffer[j] = AGS_OSC_UTIL_SLIP_ESC_END; } break; case AGS_OSC_UTIL_SLIP_ESC: { slip_buffer[j] = AGS_OSC_UTIL_SLIP_ESC; j++; slip_buffer[j] = AGS_OSC_UTIL_SLIP_ESC_ESC; } break; default: { slip_buffer[j] = osc_buffer[i]; } } } slip_buffer[j] = AGS_OSC_UTIL_SLIP_END; if(returned_buffer_length != NULL){ *returned_buffer_length = j + 1; } return(slip_buffer); } /** * ags_osc_util_slip_decode: * @slip_buffer: the SLIP encoded OSC buffer * @slip_buffer_length: the buffer length of SLIP encoded OSC buffer * @returned_buffer_length: the returned buffer's length * * Decode @slip_buffer from SLIP encoded format. * See SLIP (RFC1055). * * Returns: the OSC buffer as byte array * * Since: 3.0.0 */ unsigned char* ags_osc_util_slip_decode(unsigned char *slip_buffer, guint slip_buffer_length, guint *returned_buffer_length) { unsigned char *osc_buffer; guint buffer_length; guint i, j; buffer_length = slip_buffer_length; osc_buffer = (unsigned char *) malloc(buffer_length * sizeof(unsigned char)); for(i = 0, j = 1; j < slip_buffer_length; i++, j++){ switch(slip_buffer[j]){ case AGS_OSC_UTIL_SLIP_ESC: { j++; if(slip_buffer[j] == AGS_OSC_UTIL_SLIP_ESC_END){ osc_buffer[i] = AGS_OSC_UTIL_SLIP_END; }else if(slip_buffer[j] == AGS_OSC_UTIL_SLIP_ESC_ESC){ osc_buffer[i] = AGS_OSC_UTIL_SLIP_ESC; } } break; default: { osc_buffer[i] = slip_buffer[j]; } } } if(returned_buffer_length != NULL){ *returned_buffer_length = i - 1; } return(osc_buffer); } /** * ags_osc_util_timetag_now: * @tv_sec: the return location of number of seconds since midnight on January 1, 1900 * @tv_fraction: the return location of fraction of seconds to a precision of about 200 picoseconds * * Get current time. * * Since: 3.0.0 */ void ags_osc_util_timetag_now(gint32 *tv_sec, gint32 *tv_fraction) { struct timespec time_now; #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif static const guint sec_since_1900_to_1970 = 2208988800; #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); time_now.tv_sec = mts.tv_sec; time_now.tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, &time_now); #endif if(tv_sec != NULL){ tv_sec[0] = time_now.tv_sec + 2208988800; } if(tv_fraction != NULL){ tv_fraction[0] = 0xfffffffe & (guint) (time_now.tv_nsec * 4.294967296); } } gsequencer-3.1.3/ags/audio/ags_recall_channel.h0000644000175000017500000000505413616617253016426 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RECALL_CHANNEL_H__ #define __AGS_RECALL_CHANNEL_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RECALL_CHANNEL (ags_recall_channel_get_type()) #define AGS_RECALL_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RECALL_CHANNEL, AgsRecallChannel)) #define AGS_RECALL_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_RECALL_CHANNEL, AgsRecallChannelClass)) #define AGS_IS_RECALL_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RECALL_CHANNEL)) #define AGS_IS_RECALL_CHANNEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RECALL_CHANNEL)) #define AGS_RECALL_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_RECALL_CHANNEL, AgsRecallChannelClass)) typedef struct _AgsRecallChannel AgsRecallChannel; typedef struct _AgsRecallChannelClass AgsRecallChannelClass; struct _AgsRecallChannel { AgsRecall recall; AgsRecallAudio *recall_audio; AgsChannel *destination; AgsChannel *source; }; struct _AgsRecallChannelClass { AgsRecallClass recall; }; GType ags_recall_channel_get_type(); AgsChannel* ags_recall_channel_get_destination(AgsRecallChannel *recall_channel); void ags_recall_channel_set_destination(AgsRecallChannel *recall_channel, AgsChannel *destination); AgsChannel* ags_recall_channel_get_source(AgsRecallChannel *recall_channel); void ags_recall_channel_set_source(AgsRecallChannel *recall_channel, AgsChannel *source); GList* ags_recall_channel_find_channel(GList *recall_channel, AgsChannel *source); AgsRecallChannel* ags_recall_channel_new(); G_END_DECLS #endif /*__AGS_RECALL_CHANNEL_H__*/ gsequencer-3.1.3/ags/audio/ags_frequency_map.h0000644000175000017500000000655713607210263016331 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FREQUENCY_MAP_H__ #define __AGS_FREQUENCY_MAP_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FREQUENCY_MAP (ags_frequency_map_get_type()) #define AGS_FREQUENCY_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FREQUENCY_MAP, AgsFrequencyMap)) #define AGS_FREQUENCY_MAP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FREQUENCY_MAP, AgsFrequencyMapClass)) #define AGS_IS_FREQUENCY_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FREQUENCY_MAP)) #define AGS_IS_FREQUENCY_MAP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FREQUENCY_MAP)) #define AGS_FREQUENCY_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FREQUENCY_MAP, AgsFrequencyMapClass)) #define AGS_FREQUENCY_MAP_GET_OBJ_MUTEX(obj) (&(((AgsFrequencyMap *) obj)->obj_mutex)) #define AGS_FREQUENCY_MAP_DEFAULT_FREQ (440.0) typedef struct _AgsFrequencyMap AgsFrequencyMap; typedef struct _AgsFrequencyMapClass AgsFrequencyMapClass; /** * AgsFrequencyMapFlags: * @AGS_FREQUENCY_MAP_PROCESSED: the frequency map was processed */ typedef enum{ AGS_FREQUENCY_MAP_PROCESSED = 1, }AgsFrequencyMapFlags; struct _AgsFrequencyMap { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint z_index; guint window_count; guint samplerate; guint buffer_size; guint frame_count; guint attack; guint oscillator_mode; gdouble freq; AgsComplex *buffer; }; struct _AgsFrequencyMapClass { GObjectClass gobject; void (*process)(AgsFrequencyMap *frequency_map); void (*factorize)(AgsFrequencyMap *frequency_map, AgsFrequencyMap *factorized_frequency_map); void (*compute_max_likelihood)(AgsFrequencyMap *frequency_map, AgsComplex *source, AgsComplex **retval); }; GType ags_frequency_map_get_type(); gint ags_frequency_map_sort_func(gconstpointer a, gconstpointer b); gboolean ags_frequency_map_test_flags(AgsFrequencyMap *frequency_map, guint flags); void ags_frequency_map_set_flags(AgsFrequencyMap *frequency_map, guint flags); void ags_frequency_map_unset_flags(AgsFrequencyMap *frequency_map, guint flags); void ags_frequency_map_process(AgsFrequencyMap *frequency_map); void ags_frequency_map_factorize(AgsFrequencyMap *frequency_map, AgsFrequencyMap *factorized_frequency_map); void ags_frequency_map_compute_max_likelihood(AgsFrequencyMap *frequency_map, AgsComplex *source, AgsComplex **retval); /* instantiate */ AgsFrequencyMap* ags_frequency_map_new(); G_END_DECLS #endif /*__AGS_FREQUENCY_MAP_H__*/ gsequencer-3.1.3/ags/audio/ags_note.h0000644000175000017500000001441313616617253014440 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTE_H__ #define __AGS_NOTE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_NOTE (ags_note_get_type()) #define AGS_NOTE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTE, AgsNote)) #define AGS_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTE, AgsNoteClass)) #define AGS_IS_NOTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_NOTE)) #define AGS_IS_NOTE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_NOTE)) #define AGS_NOTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_NOTE, AgsNoteClass)) #define AGS_NOTE_GET_OBJ_MUTEX(obj) (&(((AgsNote *) obj)->obj_mutex)) #define AGS_NOTE_DEFAULT_TICKS_PER_QUARTER_NOTE (16.0) typedef struct _AgsNote AgsNote; typedef struct _AgsNoteClass AgsNoteClass; /** * AgsNoteFlags: * @AGS_NOTE_GUI: gui format * @AGS_NOTE_RUNTIME: runtime format * @AGS_NOTE_HUMAN_READABLE: human readable format * @AGS_NOTE_DEFAULT_LENGTH: default length * @AGS_NOTE_IS_SELECTED: is selected * @AGS_NOTE_FEED: feed note * @AGS_NOTE_ENVELOPE: do envelope * * Enum values to control the behavior or indicate internal state of #AgsNote by * enable/disable as flags. */ typedef enum{ AGS_NOTE_GUI = 1, AGS_NOTE_RUNTIME = 1 << 1, AGS_NOTE_HUMAN_READABLE = 1 << 2, AGS_NOTE_DEFAULT_LENGTH = 1 << 3, AGS_NOTE_IS_SELECTED = 1 << 4, AGS_NOTE_FEED = 1 << 5, AGS_NOTE_ENVELOPE = 1 << 6, }AgsNoteFlags; struct _AgsNote { GObject gobject; guint flags; GRecMutex obj_mutex; gboolean is_minor; guint sharp_flats; // gui format, convert easy to visualization guint x[2]; guint y; guint64 rt_offset; guint rt_attack; gdouble stream_delay; gdouble stream_attack; guint64 stream_frame_count; AgsComplex attack; AgsComplex decay; AgsComplex sustain; AgsComplex release; AgsComplex ratio; gchar *note_name; gdouble frequency; }; struct _AgsNoteClass { GObjectClass gobject; }; GType ags_note_get_type(); GRecMutex* ags_note_get_obj_mutex(AgsNote *note); gboolean ags_note_test_flags(AgsNote *note, guint flags); void ags_note_set_flags(AgsNote *note, guint flags); void ags_note_unset_flags(AgsNote *note, guint flags); gint ags_note_sort_func(gconstpointer a, gconstpointer b); gboolean ags_note_get_is_minor(AgsNote *note); void ags_note_set_is_minor(AgsNote *note, gboolean is_minor); guint ags_note_get_sharp_flats(AgsNote *note); void ags_note_set_sharp_flats(AgsNote *note, guint sharp_flats); guint ags_note_get_x0(AgsNote *note); void ags_note_set_x0(AgsNote *note, guint x0); guint ags_note_get_x1(AgsNote *note); void ags_note_set_x1(AgsNote *note, guint x1); guint ags_note_get_y(AgsNote *note); void ags_note_set_y(AgsNote *note, guint y); guint64 ags_note_get_rt_offset(AgsNote *note); void ags_note_set_rt_offset(AgsNote *note, guint64 rt_offset); guint ags_note_get_rt_attack(AgsNote *note); void ags_note_set_rt_attack(AgsNote *note, guint rt_attack); AgsComplex* ags_note_get_attack(AgsNote *note); void ags_note_set_attack(AgsNote *note, AgsComplex *attack); AgsComplex* ags_note_get_sustain(AgsNote *note); void ags_note_set_sustain(AgsNote *note, AgsComplex *sustain); AgsComplex* ags_note_get_decay(AgsNote *note); void ags_note_set_decay(AgsNote *note, AgsComplex *decay); AgsComplex* ags_note_get_release(AgsNote *note); void ags_note_set_release(AgsNote *note, AgsComplex *release); AgsComplex* ags_note_get_ratio(AgsNote *note); void ags_note_set_ratio(AgsNote *note, AgsComplex *ratio); GList* ags_note_find_prev(GList *note, guint x0, guint y); GList* ags_note_find_next(GList *note, guint x0, guint y); glong ags_note_length_to_smf_delta_time(guint note_length, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo); guint ags_note_smf_delta_time_to_length(glong delta_time, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor); guchar* ags_note_to_raw_midi(AgsNote *note, gdouble bpm, gdouble delay_factor, guint *buffer_length); guchar* ags_note_to_raw_midi_extended(AgsNote *note, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo, guint *buffer_length); snd_seq_event_t* ags_note_to_seq_event(AgsNote *note, gdouble bpm, gdouble delay_factor, guint *n_events); snd_seq_event_t* ags_note_to_seq_event_extended(AgsNote *note, gdouble bpm, gdouble delay_factor, glong nn, glong dd, glong cc, glong bb, glong tempo, guint *n_events); GList* ags_note_from_raw_midi(guchar *raw_midi, gdouble bpm, gdouble delay_factor, guint length); GList* ags_note_from_raw_midi_extended(guchar *raw_midi, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor, guint length); GList* ags_note_from_seq_event(snd_seq_event_t *event, gdouble bpm, gdouble delay_factor, guint n_events); GList* ags_note_from_seq_event_extended(snd_seq_event_t *event, glong nn, glong dd, glong cc, glong bb, glong tempo, gdouble bpm, gdouble delay_factor, guint n_events); AgsNote* ags_note_duplicate(AgsNote *note); AgsNote* ags_note_new(); AgsNote* ags_note_new_with_offset(guint x0, guint x1, guint y, gdouble stream_delay, gdouble stream_attack); G_END_DECLS #endif /*__AGS_NOTE_H__*/ gsequencer-3.1.3/ags/audio/ags_sequencer_util.c0000644000175000017500000000351613607210263016505 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include /** * SECTION:ags_sequencer_util * @short_description: sequencer util * @title: AgsSequencerUtil * @section_id: * @include: ags/audio/ags_sequencer_util.h * * Sequencer utility functions. */ /** * ags_sequencer_util_get_obj_mutex: * @sequencer: the #GObject sub-type implementing #AgsSoundcard * * Get object mutex of @sequencer. * * Returns: (transfer none): GRecMutex pointer * * Since: 3.0.0 */ GRecMutex* ags_sequencer_util_get_obj_mutex(GObject *sequencer) { GRecMutex *obj_mutex; obj_mutex = NULL; if(AGS_IS_MIDIIN(sequencer)){ obj_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(sequencer); }else if(AGS_IS_JACK_MIDIIN(sequencer)){ obj_mutex = AGS_JACK_MIDIIN_GET_OBJ_MUTEX(sequencer); }else if(AGS_IS_CORE_AUDIO_MIDIIN(sequencer)){ obj_mutex = AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX(sequencer); }else{ g_warning("unknown sequencer implementation"); } return(obj_mutex); } gsequencer-3.1.3/ags/audio/ags_playback_domain.h0000644000175000017500000000714313607210263016600 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLAYBACK_DOMAIN_H__ #define __AGS_PLAYBACK_DOMAIN_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLAYBACK_DOMAIN (ags_playback_domain_get_type()) #define AGS_PLAYBACK_DOMAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLAYBACK_DOMAIN, AgsPlaybackDomain)) #define AGS_PLAYBACK_DOMAIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_PLAYBACK_DOMAIN, AgsPlaybackDomain)) #define AGS_IS_PLAYBACK_DOMAIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLAYBACK_DOMAIN)) #define AGS_IS_PLAYBACK_DOMAIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLAYBACK_DOMAIN)) #define AGS_PLAYBACK_DOMAIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_PLAYBACK_DOMAIN, AgsPlaybackDomainClass)) #define AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX(obj) (&(((AgsPlaybackDomain *) obj)->obj_mutex)) typedef struct _AgsPlaybackDomain AgsPlaybackDomain; typedef struct _AgsPlaybackDomainClass AgsPlaybackDomainClass; /** * AgsPlaybackDomainFlags: * @AGS_PLAYBACK_DOMAIN_CONNECTED: indicates the playback domain was connected by calling #AgsConnectable::connect() * @AGS_PLAYBACK_DOMAIN_SINGLE_THREADED: single threaded * @AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO: super threaded audio * * Enum values to control the behavior or indicate internal state of #AgsPlaybackDomain by * enable/disable as flags. */ typedef enum{ AGS_PLAYBACK_DOMAIN_CONNECTED = 1, AGS_PLAYBACK_DOMAIN_SINGLE_THREADED = 1 << 1, AGS_PLAYBACK_DOMAIN_SUPER_THREADED_AUDIO = 1 << 2, }AgsPlaybackDomainFlags; struct _AgsPlaybackDomain { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *audio; AgsThread **audio_thread; GList *output_playback; GList *input_playback; }; struct _AgsPlaybackDomainClass { GObjectClass gobject; }; GType ags_playback_domain_get_type(); gboolean ags_playback_domain_test_flags(AgsPlaybackDomain *playback_domain, guint flags); void ags_playback_domain_set_flags(AgsPlaybackDomain *playback_domain, guint flags); void ags_playback_domain_unset_flags(AgsPlaybackDomain *playback_domain, guint flags); /* get and set */ void ags_playback_domain_set_audio_thread(AgsPlaybackDomain *playback_domain, AgsThread *thread, gint sound_scope); AgsThread* ags_playback_domain_get_audio_thread(AgsPlaybackDomain *playback_domain, gint sound_scope); /* add and remove */ void ags_playback_domain_add_playback(AgsPlaybackDomain *playback_domain, GObject *playback, GType channel_type); void ags_playback_domain_remove_playback(AgsPlaybackDomain *playback_domain, GObject *playback, GType channel_type); /* instance */ AgsPlaybackDomain* ags_playback_domain_new(GObject *audio); G_END_DECLS #endif /*__AGS_PLAYBACK_DOMAIN_H__*/ gsequencer-3.1.3/ags/audio/ags_midiin.c0000644000175000017500000014770113607210263014734 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #ifndef AGS_W32API #include #include #ifndef __APPLE__ #include #endif #include #endif #ifdef AGS_WITH_ALSA #include #endif #include #include #include #include #include #include /** * SECTION:ags_midiin * @short_description: Input from sequencer * @title: AgsMidiin * @section_id: * @include: ags/audio/ags_midiin.h * * #AgsMidiin represents a sequencer and supports midi input. */ void ags_midiin_class_init(AgsMidiinClass *midiin); void ags_midiin_connectable_interface_init(AgsConnectableInterface *connectable); void ags_midiin_sequencer_interface_init(AgsSequencerInterface *sequencer); void ags_midiin_init(AgsMidiin *midiin); void ags_midiin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_midiin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_midiin_dispose(GObject *gobject); void ags_midiin_finalize(GObject *gobject); AgsUUID* ags_midiin_get_uuid(AgsConnectable *connectable); gboolean ags_midiin_has_resource(AgsConnectable *connectable); gboolean ags_midiin_is_ready(AgsConnectable *connectable); void ags_midiin_add_to_registry(AgsConnectable *connectable); void ags_midiin_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_midiin_list_resource(AgsConnectable *connectable); xmlNode* ags_midiin_xml_compose(AgsConnectable *connectable); void ags_midiin_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_midiin_is_connected(AgsConnectable *connectable); void ags_midiin_connect(AgsConnectable *connectable); void ags_midiin_disconnect(AgsConnectable *connectable); void ags_midiin_set_device(AgsSequencer *sequencer, gchar *device); gchar* ags_midiin_get_device(AgsSequencer *sequencer); void ags_midiin_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name); gboolean ags_midiin_is_starting(AgsSequencer *sequencer); gboolean ags_midiin_is_recording(AgsSequencer *sequencer); void ags_midiin_delegate_record_init(AgsSequencer *sequencer, GError **error); void ags_midiin_delegate_record(AgsSequencer *sequencer, GError **error); void ags_midiin_delegate_stop(AgsSequencer *sequencer); void ags_midiin_oss_init(AgsSequencer *sequencer, GError **error); void ags_midiin_oss_record(AgsSequencer *sequencer, GError **error); void ags_midiin_oss_free(AgsSequencer *sequencer); void ags_midiin_alsa_init(AgsSequencer *sequencer, GError **error); void ags_midiin_alsa_record(AgsSequencer *sequencer, GError **error); void ags_midiin_alsa_free(AgsSequencer *sequencer); void ags_midiin_tic(AgsSequencer *sequencer); void ags_midiin_offset_changed(AgsSequencer *sequencer, guint note_offset); void ags_midiin_set_bpm(AgsSequencer *sequencer, gdouble bpm); gdouble ags_midiin_get_bpm(AgsSequencer *sequencer); void ags_midiin_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor); gdouble ags_midiin_get_delay_factor(AgsSequencer *sequencer); void* ags_midiin_get_buffer(AgsSequencer *sequencer, guint *buffer_length); void* ags_midiin_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length); void ags_midiin_lock_buffer(AgsSequencer *sequencer, void *buffer); void ags_midiin_unlock_buffer(AgsSequencer *sequencer, void *buffer); void ags_midiin_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset); guint ags_midiin_get_start_note_offset(AgsSequencer *sequencer); void ags_midiin_set_note_offset(AgsSequencer *sequencer, guint note_offset); guint ags_midiin_get_note_offset(AgsSequencer *sequencer); enum{ PROP_0, PROP_DEVICE, PROP_BUFFER, PROP_BPM, PROP_DELAY_FACTOR, PROP_ATTACK, }; static gpointer ags_midiin_parent_class = NULL; GType ags_midiin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_midiin = 0; static const GTypeInfo ags_midiin_info = { sizeof(AgsMidiinClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_midiin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsMidiin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_midiin_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_midiin_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sequencer_interface_info = { (GInterfaceInitFunc) ags_midiin_sequencer_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_midiin = g_type_register_static(G_TYPE_OBJECT, "AgsMidiin", &ags_midiin_info, 0); g_type_add_interface_static(ags_type_midiin, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_midiin, AGS_TYPE_SEQUENCER, &ags_sequencer_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_midiin); } return g_define_type_id__volatile; } void ags_midiin_class_init(AgsMidiinClass *midiin) { GObjectClass *gobject; GParamSpec *param_spec; ags_midiin_parent_class = g_type_class_peek_parent(midiin); /* GObjectClass */ gobject = (GObjectClass *) midiin; gobject->set_property = ags_midiin_set_property; gobject->get_property = ags_midiin_get_property; gobject->dispose = ags_midiin_dispose; gobject->finalize = ags_midiin_finalize; /* properties */ /** * AgsMidiin:device: * * The alsa sequencer indentifier * * Since: 3.0.0 */ param_spec = g_param_spec_string("device", i18n_pspec("the device identifier"), i18n_pspec("The device to perform output to"), AGS_MIDIIN_DEFAULT_ALSA_DEVICE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEVICE, param_spec); /** * AgsMidiin:buffer: * * The buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("buffer", i18n_pspec("the buffer"), i18n_pspec("The buffer to record"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_BUFFER, param_spec); /** * AgsMidiin:bpm: * * Beats per minute * * Since: 3.0.0 */ param_spec = g_param_spec_double("bpm", i18n_pspec("beats per minute"), i18n_pspec("Beats per minute to use"), 1.0, 240.0, AGS_SEQUENCER_DEFAULT_BPM, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BPM, param_spec); /** * AgsMidiin:delay-factor: * * tact * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay-factor", i18n_pspec("delay factor"), i18n_pspec("The delay factor"), 0.0, 16.0, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY_FACTOR, param_spec); /** * AgsMidiin:attack: * * Attack of the buffer * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("attack", i18n_pspec("attack of buffer"), i18n_pspec("The attack to use for the buffer"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_ATTACK, param_spec); /* AgsMidiinClass */ } GQuark ags_midiin_error_quark() { return(g_quark_from_static_string("ags-midiin-error-quark")); } void ags_midiin_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_midiin_get_uuid; connectable->has_resource = ags_midiin_has_resource; connectable->is_ready = ags_midiin_is_ready; connectable->add_to_registry = ags_midiin_add_to_registry; connectable->remove_from_registry = ags_midiin_remove_from_registry; connectable->list_resource = ags_midiin_list_resource; connectable->xml_compose = ags_midiin_xml_compose; connectable->xml_parse = ags_midiin_xml_parse; connectable->is_connected = ags_midiin_is_connected; connectable->connect = ags_midiin_connect; connectable->disconnect = ags_midiin_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_midiin_sequencer_interface_init(AgsSequencerInterface *sequencer) { sequencer->set_device = ags_midiin_set_device; sequencer->get_device = ags_midiin_get_device; sequencer->list_cards = ags_midiin_list_cards; sequencer->is_starting = ags_midiin_is_starting; sequencer->is_playing = NULL; sequencer->is_recording = ags_midiin_is_recording; sequencer->play_init = NULL; sequencer->play = NULL; sequencer->record_init = ags_midiin_delegate_record_init; sequencer->record = ags_midiin_delegate_record; sequencer->stop = ags_midiin_delegate_stop; sequencer->record_init = ags_midiin_alsa_init; sequencer->record = ags_midiin_alsa_record; sequencer->stop = ags_midiin_alsa_free; sequencer->tic = ags_midiin_tic; sequencer->offset_changed = ags_midiin_offset_changed; sequencer->set_bpm = ags_midiin_set_bpm; sequencer->get_bpm = ags_midiin_get_bpm; sequencer->set_delay_factor = ags_midiin_set_delay_factor; sequencer->get_delay_factor = ags_midiin_get_delay_factor; sequencer->get_buffer = ags_midiin_get_buffer; sequencer->get_next_buffer = ags_midiin_get_next_buffer; sequencer->lock_buffer = ags_midiin_lock_buffer; sequencer->unlock_buffer = ags_midiin_unlock_buffer; sequencer->set_start_note_offset = ags_midiin_set_start_note_offset; sequencer->get_start_note_offset = ags_midiin_get_start_note_offset; sequencer->set_note_offset = ags_midiin_set_note_offset; sequencer->get_note_offset = ags_midiin_get_note_offset; } void ags_midiin_init(AgsMidiin *midiin) { AgsConfig *config; gchar *str; gchar *segmentation; guint i; guint denominator, numerator; gboolean use_alsa; midiin->flags = 0; /* insert midiin mutex */ g_rec_mutex_init(&(midiin->obj_mutex)); /* uuid */ midiin->uuid = ags_uuid_alloc(); ags_uuid_generate(midiin->uuid); /* flags */ config = ags_config_get_instance(); #ifdef AGS_WITH_ALSA use_alsa = TRUE; #else use_alsa = FALSE; #endif str = ags_config_get_value(config, AGS_CONFIG_SEQUENCER, "backend"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SEQUENCER_0, "backend"); } if(str != NULL && !g_ascii_strncasecmp(str, "oss", 4)){ use_alsa = FALSE; } /* flags */ if(use_alsa){ midiin->flags |= (AGS_MIDIIN_ALSA); }else{ midiin->flags |= (AGS_MIDIIN_OSS); } /* sync flags */ g_atomic_int_set(&(midiin->sync_flags), (AGS_MIDIIN_PASS_THROUGH)); /* device */ if(use_alsa){ midiin->in.alsa.handle = NULL; midiin->in.alsa.device = AGS_MIDIIN_DEFAULT_ALSA_DEVICE; }else{ midiin->in.oss.device_fd = -1; midiin->in.oss.device = AGS_MIDIIN_DEFAULT_OSS_DEVICE; } /* ring buffer */ midiin->ring_buffer = (char **) malloc(2 * sizeof(char *)); midiin->ring_buffer[0] = NULL; midiin->ring_buffer[1] = NULL; midiin->ring_buffer_size[0] = 0; midiin->ring_buffer_size[1] = 0; /* buffer */ midiin->buffer_mutex = (GRecMutex **) malloc(4 * sizeof(GRecMutex *)); for(i = 0; i < 4; i++){ midiin->buffer_mutex[i] = (GRecMutex *) malloc(sizeof(GRecMutex)); g_rec_mutex_init(midiin->buffer_mutex[i]); } midiin->buffer = (char **) malloc(4 * sizeof(char *)); midiin->buffer[0] = NULL; midiin->buffer[1] = NULL; midiin->buffer[2] = NULL; midiin->buffer[3] = NULL; midiin->buffer_size[0] = 0; midiin->buffer_size[1] = 0; midiin->buffer_size[2] = 0; midiin->buffer_size[3] = 0; /* bpm */ midiin->bpm = AGS_SEQUENCER_DEFAULT_BPM; /* delay and delay factor */ midiin->delay = AGS_SEQUENCER_DEFAULT_DELAY; midiin->delay_factor = AGS_SEQUENCER_DEFAULT_DELAY_FACTOR; /* segmentation */ segmentation = ags_config_get_value(config, AGS_CONFIG_GENERIC, "segmentation"); if(segmentation != NULL){ sscanf(segmentation, "%d/%d", &denominator, &numerator); midiin->delay_factor = 1.0 / numerator * (numerator / denominator); g_free(segmentation); } midiin->latency = AGS_NSEC_PER_SEC / 4000.0; /* counters */ midiin->start_note_offset = 0; midiin->note_offset = 0; midiin->note_offset_absolute = 0; midiin->tact_counter = 0.0; midiin->delay_counter = 0; midiin->tic_counter = 0; } void ags_midiin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(gobject); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); switch(prop_id){ case PROP_DEVICE: { char *device; device = (char *) g_value_get_string(value); g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_OSS & (midiin->flags)) != 0){ midiin->in.oss.device = g_strdup(device); }else if((AGS_MIDIIN_ALSA & (midiin->flags)) != 0){ midiin->in.alsa.device = g_strdup(device); } g_rec_mutex_unlock(midiin_mutex); } break; case PROP_BUFFER: { //TODO:JK: implement me } break; case PROP_BPM: { gdouble bpm; bpm = g_value_get_double(value); g_rec_mutex_lock(midiin_mutex); if(bpm == midiin->bpm){ g_rec_mutex_unlock(midiin_mutex); return; } midiin->bpm = bpm; g_rec_mutex_unlock(midiin_mutex); } break; case PROP_DELAY_FACTOR: { gdouble delay_factor; delay_factor = g_value_get_double(value); g_rec_mutex_lock(midiin_mutex); if(delay_factor == midiin->delay_factor){ g_rec_mutex_unlock(midiin_mutex); return; } midiin->delay_factor = delay_factor; g_rec_mutex_unlock(midiin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midiin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(gobject); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); switch(prop_id){ case PROP_DEVICE: { g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_OSS & (midiin->flags)) != 0){ g_value_set_string(value, midiin->in.oss.device); }else if((AGS_MIDIIN_ALSA & (midiin->flags)) != 0){ g_value_set_string(value, midiin->in.alsa.device); } g_rec_mutex_unlock(midiin_mutex); } break; case PROP_BUFFER: { g_rec_mutex_lock(midiin_mutex); g_value_set_pointer(value, midiin->buffer); g_rec_mutex_unlock(midiin_mutex); } break; case PROP_BPM: { g_rec_mutex_lock(midiin_mutex); g_value_set_double(value, midiin->bpm); g_rec_mutex_unlock(midiin_mutex); } break; case PROP_DELAY_FACTOR: { g_rec_mutex_lock(midiin_mutex); g_value_set_double(value, midiin->delay_factor); g_rec_mutex_unlock(midiin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_midiin_dispose(GObject *gobject) { AgsMidiin *midiin; midiin = AGS_MIDIIN(gobject); /* call parent */ G_OBJECT_CLASS(ags_midiin_parent_class)->dispose(gobject); } void ags_midiin_finalize(GObject *gobject) { AgsMidiin *midiin; midiin = AGS_MIDIIN(gobject); ags_uuid_free(midiin->uuid); /* free input buffer */ if(midiin->buffer[0] != NULL){ free(midiin->buffer[0]); } if(midiin->buffer[1] != NULL){ free(midiin->buffer[1]); } if(midiin->buffer[2] != NULL){ free(midiin->buffer[2]); } if(midiin->buffer[3] != NULL){ free(midiin->buffer[3]); } /* free buffer array */ free(midiin->buffer); /* call parent */ G_OBJECT_CLASS(ags_midiin_parent_class)->finalize(gobject); } AgsUUID* ags_midiin_get_uuid(AgsConnectable *connectable) { AgsMidiin *midiin; AgsUUID *ptr; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(connectable); /* get midiin signal mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* get UUID */ g_rec_mutex_lock(midiin_mutex); ptr = midiin->uuid; g_rec_mutex_unlock(midiin_mutex); return(ptr); } gboolean ags_midiin_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_midiin_is_ready(AgsConnectable *connectable) { AgsMidiin *midiin; gboolean is_ready; midiin = AGS_MIDIIN(connectable); /* check is added */ is_ready = ags_midiin_test_flags(midiin, AGS_MIDIIN_ADDED_TO_REGISTRY); return(is_ready); } void ags_midiin_add_to_registry(AgsConnectable *connectable) { AgsMidiin *midiin; if(ags_connectable_is_ready(connectable)){ return; } midiin = AGS_MIDIIN(connectable); ags_midiin_set_flags(midiin, AGS_MIDIIN_ADDED_TO_REGISTRY); } void ags_midiin_remove_from_registry(AgsConnectable *connectable) { AgsMidiin *midiin; if(!ags_connectable_is_ready(connectable)){ return; } midiin = AGS_MIDIIN(connectable); ags_midiin_unset_flags(midiin, AGS_MIDIIN_ADDED_TO_REGISTRY); } xmlNode* ags_midiin_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_midiin_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_midiin_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_midiin_is_connected(AgsConnectable *connectable) { AgsMidiin *midiin; gboolean is_connected; midiin = AGS_MIDIIN(connectable); /* check is connected */ is_connected = ags_midiin_test_flags(midiin, AGS_MIDIIN_CONNECTED); return(is_connected); } void ags_midiin_connect(AgsConnectable *connectable) { AgsMidiin *midiin; if(ags_connectable_is_connected(connectable)){ return; } midiin = AGS_MIDIIN(connectable); ags_midiin_set_flags(midiin, AGS_MIDIIN_CONNECTED); } void ags_midiin_disconnect(AgsConnectable *connectable) { AgsMidiin *midiin; if(!ags_connectable_is_connected(connectable)){ return; } midiin = AGS_MIDIIN(connectable); ags_midiin_unset_flags(midiin, AGS_MIDIIN_CONNECTED); } /** * ags_midiin_test_flags: * @midiin: the #AgsMidiin * @flags: the flags * * Test @flags to be set on @midiin. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_midiin_test_flags(AgsMidiin *midiin, guint flags) { gboolean retval; GRecMutex *midiin_mutex; if(!AGS_IS_MIDIIN(midiin)){ return(FALSE); } /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* test */ g_rec_mutex_lock(midiin_mutex); retval = (flags & (midiin->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(midiin_mutex); return(retval); } /** * ags_midiin_set_flags: * @midiin: the #AgsMidiin * @flags: see #AgsMidiinFlags-enum * * Enable a feature of @midiin. * * Since: 3.0.0 */ void ags_midiin_set_flags(AgsMidiin *midiin, guint flags) { GRecMutex *midiin_mutex; if(!AGS_IS_MIDIIN(midiin)){ return; } /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(midiin_mutex); midiin->flags |= flags; g_rec_mutex_unlock(midiin_mutex); } /** * ags_midiin_unset_flags: * @midiin: the #AgsMidiin * @flags: see #AgsMidiinFlags-enum * * Disable a feature of @midiin. * * Since: 3.0.0 */ void ags_midiin_unset_flags(AgsMidiin *midiin, guint flags) { GRecMutex *midiin_mutex; if(!AGS_IS_MIDIIN(midiin)){ return; } /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(midiin_mutex); midiin->flags &= (~flags); g_rec_mutex_unlock(midiin_mutex); } void ags_midiin_set_device(AgsSequencer *sequencer, gchar *device) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set device */ g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_ALSA & (midiin->flags)) != 0){ midiin->in.alsa.device = g_strdup(device); }else if((AGS_MIDIIN_OSS & (midiin->flags)) != 0){ midiin->in.oss.device = g_strdup(device); } g_rec_mutex_unlock(midiin_mutex); } gchar* ags_midiin_get_device(AgsSequencer *sequencer) { AgsMidiin *midiin; gchar *device; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); device = NULL; g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_ALSA & (midiin->flags)) != 0){ device = g_strdup(midiin->in.alsa.device); }else if((AGS_MIDIIN_OSS & (midiin->flags)) != 0){ device = g_strdup(midiin->in.oss.device); } g_rec_mutex_unlock(midiin_mutex); return(device); } void ags_midiin_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); if(card_id != NULL){ *card_id = NULL; } if(card_name != NULL){ *card_name = NULL; } g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_ALSA & (midiin->flags)) != 0){ #ifdef AGS_WITH_ALSA snd_ctl_t *card_handle; snd_ctl_card_info_t *card_info; char *name; gchar *str; int card_num; int device; int error; card_num = -1; while(TRUE){ char *iface; char **hints, **iter; error = snd_card_next(&card_num); if(card_num < 0){ break; } if(error < 0){ continue; } str = g_strdup_printf("hw:%i", card_num); error = snd_ctl_open(&card_handle, str, 0); if(error < 0){ g_free(str); continue; } snd_ctl_card_info_alloca(&card_info); error = snd_ctl_card_info(card_handle, card_info); if(error < 0){ snd_ctl_close(card_handle); g_free(str); continue; } device = -1; error = snd_ctl_rawmidi_next_device(card_handle, &device); if(error < 0){ snd_ctl_close(card_handle); g_free(str); continue; } iface = "rawmidi"; hints = NULL; error = snd_device_name_hint(card_num, iface, &hints); if(hints != NULL){ for(iter = hints; iter[0] != NULL; iter++){ if(card_id != NULL){ *card_id = g_list_prepend(*card_id, g_strdup(snd_device_name_get_hint(iter[0], "NAME"))); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(snd_ctl_card_info_get_name(card_info))); } } snd_device_name_free_hint(hints); } snd_ctl_close(card_handle); } snd_config_update_free_global(); #endif }else{ #ifdef AGS_WITH_OSS oss_sysinfo sysinfo; oss_midi_info mi; char *mixer_device; int mixerfd = -1; int n; int i; if((mixer_device = getenv("OSS_MIXERDEV")) == NULL){ mixer_device = "/dev/mixer"; } if((mixerfd = open(mixer_device, O_RDONLY, 0)) == -1){ int e = errno; switch(e){ case ENXIO: case ENODEV: { g_warning("Open Sound System is not running in your system."); } break; case ENOENT: { g_warning("No %s device available in your system.\nPerhaps Open Sound System is not installed or running.", mixer_device); } break; default: g_warning("%s", strerror(e)); } } if(ioctl(mixerfd, SNDCTL_SYSINFO, &sysinfo) == -1){ if(errno == ENXIO){ g_warning("OSS has not detected any supported sound hardware in your system."); }else{ g_warning("SNDCTL_SYSINFO"); if(errno == EINVAL){ g_warning("Error: OSS version 4.0 or later is required"); } } n = 0; }else{ n = sysinfo.nummidis; } memset(&mi, 0, sizeof(oss_midi_info)); ioctl(mixerfd, SNDCTL_MIDI_INFO, &mi); for(i = 0; i < n; i++){ mi.dev = i; if(ioctl(mixerfd, SNDCTL_ENGINEINFO, &mi) == -1){ int e = errno; g_warning("Can't get device info for /dev/midi%2d (SNDCTL_AUDIOINFO)\nerrno = %d: %s", i, e, strerror(e)); continue; } if((MIDI_CAP_INPUT & (mi.caps)) != 0){ if(card_id != NULL){ *card_id = g_list_prepend(*card_id, g_strdup_printf("/dev/midi2%i", i)); } if(card_name != NULL){ *card_name = g_list_prepend(*card_name, g_strdup(mi.name)); } } } #endif } g_rec_mutex_unlock(midiin_mutex); if(card_id != NULL){ *card_id = g_list_reverse(*card_id); } if(card_name != NULL){ *card_name = g_list_reverse(*card_name); } } gboolean ags_midiin_is_starting(AgsSequencer *sequencer) { AgsMidiin *midiin; gboolean is_starting; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* check is starting */ g_rec_mutex_lock(midiin_mutex); is_starting = ((AGS_MIDIIN_START_RECORD & (midiin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(midiin_mutex); return(is_starting); } gboolean ags_midiin_is_recording(AgsSequencer *sequencer) { AgsMidiin *midiin; gboolean is_recording; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* check is starting */ g_rec_mutex_lock(midiin_mutex); is_recording = ((AGS_MIDIIN_RECORD & (midiin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(midiin_mutex); return(is_recording); } void ags_midiin_delegate_record_init(AgsSequencer *sequencer, GError **error) { AgsMidiin *midiin; midiin = AGS_MIDIIN(sequencer); if(ags_midiin_test_flags(midiin, AGS_MIDIIN_ALSA)){ ags_midiin_alsa_init(sequencer, error); }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_OSS)){ ags_midiin_oss_init(sequencer, error); } } void ags_midiin_delegate_record(AgsSequencer *sequencer, GError **error) { AgsMidiin *midiin; midiin = AGS_MIDIIN(sequencer); if(ags_midiin_test_flags(midiin, AGS_MIDIIN_ALSA)){ ags_midiin_alsa_record(sequencer, error); }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_OSS)){ ags_midiin_oss_record(sequencer, error); } } void ags_midiin_delegate_stop(AgsSequencer *sequencer) { AgsMidiin *midiin; midiin = AGS_MIDIIN(sequencer); if(ags_midiin_test_flags(midiin, AGS_MIDIIN_ALSA)){ ags_midiin_alsa_free(sequencer); }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_OSS)){ ags_midiin_oss_free(sequencer); } } void ags_midiin_oss_init(AgsSequencer *sequencer, GError **error) { AgsMidiin *midiin; gchar *str; guint word_size; int format; int tmp; GRecMutex *midiin_mutex; if(ags_sequencer_is_recording(sequencer)){ return; } midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* prepare for playback */ g_rec_mutex_lock(midiin_mutex); midiin->flags |= (AGS_MIDIIN_START_RECORD | AGS_MIDIIN_RECORD | AGS_MIDIIN_NONBLOCKING); #ifdef AGS_WITH_OSS /* open device fd */ str = midiin->in.oss.device; midiin->in.oss.device_fd = open(str, O_WRONLY, 0); if(midiin->in.oss.device_fd == -1){ midiin->flags &= (~(AGS_MIDIIN_START_RECORD | AGS_MIDIIN_RECORD | AGS_MIDIIN_NONBLOCKING)); g_rec_mutex_unlock(midiin_mutex); g_warning("couldn't open device %s", midiin->in.oss.device); if(error != NULL){ g_set_error(error, AGS_MIDIIN_ERROR, AGS_MIDIIN_ERROR_LOCKED_SEQUENCER, "unable to open MIDI device: %s\n", str); } return; } #endif midiin->tact_counter = 0.0; midiin->delay_counter = 0.0; midiin->tic_counter = 0; #ifdef AGS_WITH_OSS midiin->flags |= AGS_MIDIIN_INITIALIZED; #endif midiin->flags |= AGS_MIDIIN_BUFFER0; midiin->flags &= (~(AGS_MIDIIN_BUFFER1 | AGS_MIDIIN_BUFFER2 | AGS_MIDIIN_BUFFER3)); g_rec_mutex_unlock(midiin_mutex); } void ags_midiin_oss_record(AgsSequencer *sequencer, GError **error) { AgsMidiin *midiin; AgsTicDevice *tic_device; // AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; char **ring_buffer; char buf[128]; gboolean no_event; guint nth_buffer; guint nth_ring_buffer; guint ring_buffer_size; int device_fd; int num_read; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); application_context = ags_application_context_get_instance(); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* poll MIDI device */ g_rec_mutex_lock(midiin_mutex); midiin->flags &= (~AGS_MIDIIN_START_RECORD); if((AGS_MIDIIN_INITIALIZED & (midiin->flags)) == 0){ g_rec_mutex_unlock(midiin_mutex); return; } device_fd = midiin->in.oss.device_fd; /* nth buffer */ nth_buffer = 0; nth_ring_buffer = 1; if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ nth_buffer = 1; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ nth_buffer = 2; nth_ring_buffer = 1; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ nth_buffer = 3; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ nth_buffer = 0; nth_ring_buffer = 1; } if(midiin->ring_buffer[nth_ring_buffer] != NULL){ free(midiin->ring_buffer[nth_ring_buffer]); } midiin->ring_buffer[nth_ring_buffer] = NULL; midiin->ring_buffer_size[nth_ring_buffer] = 0; ring_buffer = midiin->ring_buffer; ring_buffer_size = midiin->ring_buffer_size[nth_ring_buffer]; g_rec_mutex_unlock(midiin_mutex); num_read = 1; while(num_read > 0){ num_read = 0; #ifdef AGS_WITH_OSS num_read = read(device_fd, buf, sizeof(buf)); if((num_read < 0)){ g_warning("Problem reading MIDI input"); } if(num_read > 0){ if(ceil((ring_buffer_size + num_read) / AGS_MIDIIN_DEFAULT_BUFFER_SIZE) > ceil(ring_buffer_size / AGS_MIDIIN_DEFAULT_BUFFER_SIZE)){ if(ring_buffer[nth_ring_buffer] == NULL){ ring_buffer[nth_ring_buffer] = (char *) malloc(AGS_MIDIIN_DEFAULT_BUFFER_SIZE * sizeof(char)); }else{ ring_buffer[nth_ring_buffer] = (char *) realloc(ring_buffer[nth_ring_buffer], (AGS_MIDIIN_DEFAULT_BUFFER_SIZE * ceil(ring_buffer_size / AGS_MIDIIN_DEFAULT_BUFFER_SIZE) + AGS_MIDIIN_DEFAULT_BUFFER_SIZE) * sizeof(char)); } } memcpy(&(ring_buffer[nth_ring_buffer][ring_buffer_size]), buf, num_read); ring_buffer_size += num_read; } #endif } /* switch buffer */ g_rec_mutex_lock(midiin_mutex); /* update byte array and buffer size */ if(midiin->buffer[nth_buffer] != NULL){ free(midiin->buffer[nth_buffer]); } midiin->buffer[nth_buffer] = NULL; midiin->ring_buffer_size[nth_ring_buffer] = ring_buffer_size; midiin->buffer_size[nth_buffer] = ring_buffer_size; /* fill buffer */ if(ring_buffer_size > 0){ midiin->buffer[nth_buffer] = (char *) malloc(ring_buffer_size * sizeof(char)); memcpy(midiin->buffer[nth_buffer], ring_buffer[nth_ring_buffer], ring_buffer_size * sizeof(char)); } g_rec_mutex_unlock(midiin_mutex); g_rec_mutex_lock(midiin_mutex); ags_midiin_switch_buffer_flag(midiin); device_fd = midiin->in.oss.device_fd; /* nth buffer */ if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ nth_buffer = 1; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ nth_buffer = 2; nth_ring_buffer = 1; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ nth_buffer = 3; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ nth_buffer = 0; nth_ring_buffer = 1; } if(midiin->ring_buffer[nth_ring_buffer] != NULL){ free(midiin->ring_buffer[nth_ring_buffer]); } midiin->ring_buffer[nth_ring_buffer] = NULL; midiin->ring_buffer_size[nth_ring_buffer] = 0; g_rec_mutex_unlock(midiin_mutex); /* update sequencer */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic sequencer */ tic_device = ags_tic_device_new((GObject *) midiin); task = g_list_append(task, tic_device); /* reset - switch buffer flags */ // switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) midiin); // task = g_list_append(task, // switch_buffer_flag); /* add tasks all */ ags_task_launcher_add_task_all(task_launcher, task); g_object_unref(task_launcher); } void ags_midiin_oss_free(AgsSequencer *sequencer) { AgsMidiin *midiin; AgsApplicationContext *application_context; GList *poll_fd; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_INITIALIZED & (midiin->flags)) == 0){ g_rec_mutex_unlock(midiin_mutex); return; } midiin->flags &= (~(AGS_MIDIIN_RECORD | AGS_MIDIIN_INITIALIZED)); g_rec_mutex_unlock(midiin_mutex); /* */ g_rec_mutex_lock(midiin_mutex); close(midiin->in.oss.device_fd); midiin->in.oss.device_fd = -1; midiin->flags &= (~(AGS_MIDIIN_BUFFER0 | AGS_MIDIIN_BUFFER1 | AGS_MIDIIN_BUFFER2 | AGS_MIDIIN_BUFFER3)); g_atomic_int_or(&(midiin->sync_flags), AGS_MIDIIN_PASS_THROUGH); midiin->note_offset = midiin->start_note_offset; midiin->note_offset_absolute = midiin->start_note_offset; g_rec_mutex_unlock(midiin_mutex); } void ags_midiin_alsa_init(AgsSequencer *sequencer, GError **error) { AgsMidiin *midiin; #ifdef AGS_WITH_ALSA int mode = SND_RAWMIDI_NONBLOCK; snd_rawmidi_t* handle = NULL; #endif int err; GRecMutex *midiin_mutex; if(ags_sequencer_is_recording(sequencer)){ return; } midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* */ g_rec_mutex_lock(midiin_mutex); /* prepare for record */ midiin->flags |= (AGS_MIDIIN_START_RECORD | AGS_MIDIIN_RECORD | AGS_MIDIIN_NONBLOCKING); #ifdef AGS_WITH_ALSA mode = SND_RAWMIDI_NONBLOCK; if((err = snd_rawmidi_open(&handle, NULL, midiin->in.alsa.device, mode)) < 0) { midiin->flags &= (~(AGS_MIDIIN_START_RECORD | AGS_MIDIIN_RECORD | AGS_MIDIIN_NONBLOCKING)); g_rec_mutex_unlock(midiin_mutex); printf("Record midi open error: %s\n", snd_strerror(err)); g_set_error(error, AGS_MIDIIN_ERROR, AGS_MIDIIN_ERROR_LOCKED_SEQUENCER, "unable to open midi device: %s\n", snd_strerror(err)); return; } /* */ midiin->in.alsa.handle = handle; #endif midiin->tact_counter = 0.0; midiin->delay_counter = floor(midiin->delay); midiin->tic_counter = 0; #ifdef AGS_WITH_ALSA midiin->flags |= AGS_MIDIIN_INITIALIZED; #endif midiin->flags |= AGS_MIDIIN_BUFFER0; midiin->flags &= (~(AGS_MIDIIN_BUFFER1 | AGS_MIDIIN_BUFFER2 | AGS_MIDIIN_BUFFER3)); g_rec_mutex_unlock(midiin_mutex); } void ags_midiin_alsa_record(AgsSequencer *sequencer, GError **error) { AgsMidiin *midiin; AgsTicDevice *tic_device; // AgsSwitchBufferFlag *switch_buffer_flag; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *task; #ifdef AGS_WITH_ALSA snd_rawmidi_t *device_handle; #else gpointer device_handle; #endif char **ring_buffer; gboolean no_event; guint nth_buffer; guint nth_ring_buffer; guint ring_buffer_size; int status; unsigned char c; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); application_context = ags_application_context_get_instance(); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* prepare poll */ g_rec_mutex_lock(midiin_mutex); midiin->flags &= (~AGS_MIDIIN_START_RECORD); if((AGS_MIDIIN_INITIALIZED & (midiin->flags)) == 0){ g_rec_mutex_unlock(midiin_mutex); return; } device_handle = midiin->in.alsa.handle; /* nth buffer */ nth_buffer = 0; nth_ring_buffer = 1; if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ nth_buffer = 1; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ nth_buffer = 2; nth_ring_buffer = 1; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ nth_buffer = 3; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ nth_buffer = 0; nth_ring_buffer = 1; } if(midiin->ring_buffer[nth_ring_buffer] != NULL){ free(midiin->ring_buffer[nth_ring_buffer]); } midiin->ring_buffer[nth_ring_buffer] = NULL; midiin->ring_buffer_size[nth_ring_buffer] = 0; ring_buffer = midiin->ring_buffer; ring_buffer_size = midiin->ring_buffer_size[nth_ring_buffer]; g_rec_mutex_unlock(midiin_mutex); /* poll MIDI device */ status = 0; while(status >= 0){ status = -1; #ifdef AGS_WITH_ALSA status = snd_rawmidi_read(device_handle, &c, 1); if((status < 0) && (status != -EBUSY) && (status != -EAGAIN)){ g_warning("Problem reading MIDI input: %s", snd_strerror(status)); } if(status >= 0){ if(ring_buffer_size % AGS_MIDIIN_DEFAULT_BUFFER_SIZE == 0){ if(ring_buffer[nth_ring_buffer] == NULL){ ring_buffer[nth_ring_buffer] = (char *) malloc(AGS_MIDIIN_DEFAULT_BUFFER_SIZE * sizeof(char)); }else{ ring_buffer[nth_ring_buffer] = (char *) realloc(ring_buffer[nth_ring_buffer], (ring_buffer_size + AGS_MIDIIN_DEFAULT_BUFFER_SIZE) * sizeof(char)); } } ring_buffer[nth_ring_buffer][ring_buffer_size] = (unsigned char) c; ring_buffer_size += 1; } #endif } /* switch buffer */ g_rec_mutex_lock(midiin_mutex); /* update byte array and buffer size */ if(midiin->buffer[nth_buffer] != NULL){ free(midiin->buffer[nth_buffer]); } midiin->buffer[nth_buffer] = NULL; midiin->ring_buffer_size[nth_ring_buffer] = ring_buffer_size; midiin->buffer_size[nth_buffer] = ring_buffer_size; /* fill buffer */ if(ring_buffer_size > 0){ midiin->buffer[nth_buffer] = (char *) malloc(ring_buffer_size * sizeof(char)); memcpy(midiin->buffer[nth_buffer], ring_buffer[nth_ring_buffer], ring_buffer_size * sizeof(char)); } g_rec_mutex_unlock(midiin_mutex); /* */ g_rec_mutex_lock(midiin_mutex); ags_midiin_switch_buffer_flag(midiin); device_handle = midiin->in.alsa.handle; /* nth buffer */ if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ nth_buffer = 1; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ nth_buffer = 2; nth_ring_buffer = 1; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ nth_buffer = 3; nth_ring_buffer = 0; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ nth_buffer = 0; nth_ring_buffer = 1; } if(midiin->ring_buffer[nth_ring_buffer] != NULL){ free(midiin->ring_buffer[nth_ring_buffer]); } midiin->ring_buffer[nth_ring_buffer] = NULL; midiin->ring_buffer_size[nth_ring_buffer] = 0; g_rec_mutex_unlock(midiin_mutex); /* update sequencer */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); task = NULL; /* tic sequencer */ tic_device = ags_tic_device_new((GObject *) midiin); task = g_list_append(task, tic_device); /* reset - switch buffer flags */ // switch_buffer_flag = ags_switch_buffer_flag_new((GObject *) midiin); // task = g_list_append(task, // switch_buffer_flag); /* add tasks all */ ags_task_launcher_add_task_all(task_launcher, task); } void ags_midiin_alsa_free(AgsSequencer *sequencer) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* */ g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_INITIALIZED & (midiin->flags)) == 0){ g_rec_mutex_unlock(midiin_mutex); return; } midiin->flags &= (~(AGS_MIDIIN_RECORD | AGS_MIDIIN_INITIALIZED)); g_rec_mutex_unlock(midiin_mutex); /* */ g_rec_mutex_lock(midiin_mutex); #ifdef AGS_WITH_ALSA snd_rawmidi_close(midiin->in.alsa.handle); #endif midiin->in.alsa.handle = NULL; midiin->flags &= (~(AGS_MIDIIN_BUFFER0 | AGS_MIDIIN_BUFFER1 | AGS_MIDIIN_BUFFER2 | AGS_MIDIIN_BUFFER3)); g_atomic_int_or(&(midiin->sync_flags), AGS_MIDIIN_PASS_THROUGH); if(midiin->buffer[1] != NULL){ free(midiin->buffer[1]); midiin->buffer_size[1] = 0; } if(midiin->buffer[2] != NULL){ free(midiin->buffer[2]); midiin->buffer_size[2] = 0; } if(midiin->buffer[3] != NULL){ free(midiin->buffer[3]); midiin->buffer_size[3] = 0; } if(midiin->buffer[0] != NULL){ free(midiin->buffer[0]); midiin->buffer_size[0] = 0; } midiin->note_offset = midiin->start_note_offset; midiin->note_offset_absolute = midiin->start_note_offset; g_rec_mutex_unlock(midiin_mutex); } void ags_midiin_tic(AgsSequencer *sequencer) { AgsMidiin *midiin; gdouble delay; gdouble delay_counter; guint note_offset; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* determine if attack should be switched */ g_rec_mutex_lock(midiin_mutex); delay = midiin->delay; delay_counter = midiin->delay_counter; note_offset = midiin->note_offset; g_rec_mutex_unlock(midiin_mutex); if(delay_counter + 1.0 >= delay){ ags_sequencer_set_note_offset(sequencer, note_offset + 1); /* delay */ ags_sequencer_offset_changed(sequencer, note_offset); /* reset - delay counter */ g_rec_mutex_lock(midiin_mutex); midiin->delay_counter = delay_counter + 1.0 - delay; midiin->tact_counter += 1.0; g_rec_mutex_unlock(midiin_mutex); }else{ g_rec_mutex_lock(midiin_mutex); midiin->delay_counter += 1.0; g_rec_mutex_unlock(midiin_mutex); } } void ags_midiin_offset_changed(AgsSequencer *sequencer, guint note_offset) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* offset changed */ g_rec_mutex_lock(midiin_mutex); midiin->tic_counter += 1; if(midiin->tic_counter == AGS_SEQUENCER_DEFAULT_PERIOD){ /* reset - tic counter i.e. modified delay index within period */ midiin->tic_counter = 0; } g_rec_mutex_unlock(midiin_mutex); } void ags_midiin_set_bpm(AgsSequencer *sequencer, gdouble bpm) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set bpm */ g_rec_mutex_lock(midiin_mutex); midiin->bpm = bpm; g_rec_mutex_unlock(midiin_mutex); } gdouble ags_midiin_get_bpm(AgsSequencer *sequencer) { AgsMidiin *midiin; gdouble bpm; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* get bpm */ g_rec_mutex_lock(midiin_mutex); bpm = midiin->bpm; g_rec_mutex_unlock(midiin_mutex); return(bpm); } void ags_midiin_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set delay factor */ g_rec_mutex_lock(midiin_mutex); midiin->delay_factor = delay_factor; g_rec_mutex_unlock(midiin_mutex); } gdouble ags_midiin_get_delay_factor(AgsSequencer *sequencer) { AgsMidiin *midiin; gdouble delay_factor; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* get delay factor */ g_rec_mutex_lock(midiin_mutex); delay_factor = midiin->delay_factor; g_rec_mutex_unlock(midiin_mutex); return(delay_factor); } void* ags_midiin_get_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsMidiin *midiin; char *buffer; midiin = AGS_MIDIIN(sequencer); /* get buffer */ if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ buffer = midiin->buffer[0]; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ buffer = midiin->buffer[1]; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ buffer = midiin->buffer[2]; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ buffer = midiin->buffer[3]; }else{ buffer = NULL; } /* return the buffer's length */ if(buffer_length != NULL){ if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ *buffer_length = midiin->buffer_size[0]; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ *buffer_length = midiin->buffer_size[1]; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ *buffer_length = midiin->buffer_size[2]; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ *buffer_length = midiin->buffer_size[3]; }else{ *buffer_length = 0; } } return(buffer); } void* ags_midiin_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsMidiin *midiin; char *buffer; midiin = AGS_MIDIIN(sequencer); /* get buffer */ if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER0)){ buffer = midiin->buffer[1]; }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER1)){ buffer = midiin->buffer[2]; }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER2)){ buffer = midiin->buffer[3]; }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER3)){ buffer = midiin->buffer[0]; }else{ buffer = NULL; } /* return the buffer's length */ if(buffer_length != NULL){ if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER0)){ *buffer_length = midiin->buffer_size[1]; }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER1)){ *buffer_length = midiin->buffer_size[2]; }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER2)){ *buffer_length = midiin->buffer_size[3]; }else if(ags_midiin_test_flags(midiin, AGS_MIDIIN_BUFFER3)){ *buffer_length = midiin->buffer_size[0]; }else{ *buffer_length = 0; } } return(buffer); } void ags_midiin_lock_buffer(AgsSequencer *sequencer, void *buffer) { AgsMidiin *midiin; GRecMutex *buffer_mutex; midiin = AGS_MIDIIN(sequencer); buffer_mutex = NULL; if(midiin->buffer != NULL){ if(buffer == midiin->buffer[0]){ buffer_mutex = midiin->buffer_mutex[0]; }else if(buffer == midiin->buffer[1]){ buffer_mutex = midiin->buffer_mutex[1]; }else if(buffer == midiin->buffer[2]){ buffer_mutex = midiin->buffer_mutex[2]; }else if(buffer == midiin->buffer[3]){ buffer_mutex = midiin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_lock(buffer_mutex); } } void ags_midiin_unlock_buffer(AgsSequencer *sequencer, void *buffer) { AgsMidiin *midiin; GRecMutex *buffer_mutex; midiin = AGS_MIDIIN(sequencer); buffer_mutex = NULL; if(midiin->buffer != NULL){ if(buffer == midiin->buffer[0]){ buffer_mutex = midiin->buffer_mutex[0]; }else if(buffer == midiin->buffer[1]){ buffer_mutex = midiin->buffer_mutex[1]; }else if(buffer == midiin->buffer[2]){ buffer_mutex = midiin->buffer_mutex[2]; }else if(buffer == midiin->buffer[3]){ buffer_mutex = midiin->buffer_mutex[3]; } } if(buffer_mutex != NULL){ g_rec_mutex_unlock(buffer_mutex); } } void ags_midiin_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set note offset */ g_rec_mutex_lock(midiin_mutex); midiin->start_note_offset = start_note_offset; g_rec_mutex_unlock(midiin_mutex); } guint ags_midiin_get_start_note_offset(AgsSequencer *sequencer) { AgsMidiin *midiin; guint start_note_offset; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set note offset */ g_rec_mutex_lock(midiin_mutex); start_note_offset = midiin->start_note_offset; g_rec_mutex_unlock(midiin_mutex); return(start_note_offset); } void ags_midiin_set_note_offset(AgsSequencer *sequencer, guint note_offset) { AgsMidiin *midiin; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set note offset */ g_rec_mutex_lock(midiin_mutex); midiin->note_offset = note_offset; g_rec_mutex_unlock(midiin_mutex); } guint ags_midiin_get_note_offset(AgsSequencer *sequencer) { AgsMidiin *midiin; guint note_offset; GRecMutex *midiin_mutex; midiin = AGS_MIDIIN(sequencer); /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* set note offset */ g_rec_mutex_lock(midiin_mutex); note_offset = midiin->note_offset; g_rec_mutex_unlock(midiin_mutex); return(note_offset); } /** * ags_midiin_switch_buffer_flag: * @midiin: the #AgsMidiin * * The buffer flag indicates the currently played buffer. * * Since: 3.0.0 */ void ags_midiin_switch_buffer_flag(AgsMidiin *midiin) { GRecMutex *midiin_mutex; if(!AGS_IS_MIDIIN(midiin)){ return; } /* get midiin mutex */ midiin_mutex = AGS_MIDIIN_GET_OBJ_MUTEX(midiin); /* switch buffer flag */ g_rec_mutex_lock(midiin_mutex); if((AGS_MIDIIN_BUFFER0 & (midiin->flags)) != 0){ midiin->flags &= (~AGS_MIDIIN_BUFFER0); midiin->flags |= AGS_MIDIIN_BUFFER1; /* clear buffer */ if(midiin->buffer[3] != NULL){ free(midiin->buffer[3]); } midiin->buffer[3] = NULL; midiin->buffer_size[3] = 0; }else if((AGS_MIDIIN_BUFFER1 & (midiin->flags)) != 0){ midiin->flags &= (~AGS_MIDIIN_BUFFER1); midiin->flags |= AGS_MIDIIN_BUFFER2; /* clear buffer */ if(midiin->buffer[0] != NULL){ free(midiin->buffer[0]); } midiin->buffer[0] = NULL; midiin->buffer_size[0] = 0; }else if((AGS_MIDIIN_BUFFER2 & (midiin->flags)) != 0){ midiin->flags &= (~AGS_MIDIIN_BUFFER2); midiin->flags |= AGS_MIDIIN_BUFFER3; /* clear buffer */ if(midiin->buffer[1] != NULL){ free(midiin->buffer[1]); } midiin->buffer[1] = NULL; midiin->buffer_size[1] = 0; }else if((AGS_MIDIIN_BUFFER3 & (midiin->flags)) != 0){ midiin->flags &= (~AGS_MIDIIN_BUFFER3); midiin->flags |= AGS_MIDIIN_BUFFER0; /* clear buffer */ if(midiin->buffer[2] != NULL){ free(midiin->buffer[2]); } midiin->buffer[2] = NULL; midiin->buffer_size[2] = 0; } g_rec_mutex_unlock(midiin_mutex); } /** * ags_midiin_new: * * Creates a new instance of #AgsMidiin. * * Returns: the new #AgsMidiin * * Since: 3.0.0 */ AgsMidiin* ags_midiin_new() { AgsMidiin *midiin; midiin = (AgsMidiin *) g_object_new(AGS_TYPE_MIDIIN, NULL); return(midiin); } gsequencer-3.1.3/ags/audio/file/0000755000175000017500000000000013622252254013455 500000000000000gsequencer-3.1.3/ags/audio/file/ags_ipatch_gig_reader.h0000644000175000017500000001074513607210263020024 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_IPATCH_GIG_READER_H__ #define __AGS_IPATCH_GIG_READER_H__ #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_IPATCH_GIG_READER (ags_ipatch_gig_reader_get_type()) #define AGS_IPATCH_GIG_READER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_IPATCH_GIG_READER, AgsIpatchGigReader)) #define AGS_IPATCH_GIG_READER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_IPATCH_GIG_READER, AgsIpatchGigReaderClass)) #define AGS_IS_IPATCH_GIG_READER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_IPATCH_GIG_READER)) #define AGS_IS_IPATCH_GIG_READER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_IPATCH_GIG_READER)) #define AGS_IPATCH_GIG_READER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_IPATCH_GIG_READER, AgsIpatchGigReaderClass)) #define AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(obj) (&(((AgsIpatchGigReader *) obj)->obj_mutex)) typedef struct _AgsIpatchGigReader AgsIpatchGigReader; typedef struct _AgsIpatchGigReaderClass AgsIpatchGigReaderClass; /** * AgsIpatchGigReaderFlags: * @AGS_IPATCH_GIG_READER_ADDED_TO_REGISTRY: the ipatch sample was added to registry, see #AgsConnectable::add_to_registry() * @AGS_IPATCH_GIG_READER_CONNECTED: indicates the ipatch sample was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsIpatchGigReader by * enable/disable as flags. */ typedef enum{ AGS_IPATCH_GIG_READER_ADDED_TO_REGISTRY = 1, AGS_IPATCH_GIG_READER_CONNECTED = 1 << 1, }AgsIpatchGigReaderFlags; /** * AgsGigLevel: * @AGS_GIG_FILENAME: filename * @AGS_GIG_IHDR: instrument header * @AGS_GIG_SHDR: sample header * * Enum values to describe the different levels of a Soundfont2 file. */ typedef enum{ AGS_GIG_FILENAME = 0, AGS_GIG_IHDR = 1, AGS_GIG_SHDR = 2, }AgsGigLevel; struct _AgsIpatchGigReader { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint level; AgsIpatch *ipatch; guint *index_selected; gchar **name_selected; #ifdef AGS_WITH_LIBINSTPATCH IpatchDLSReader *reader; IpatchBase *base; IpatchGig *gig; IpatchContainer *instrument; IpatchContainer *sample; #else gpointer reader; gpointer base; gpointer gig; gpointer instrument; gpointer sample; #endif GError *error; }; struct _AgsIpatchGigReaderClass { GObjectClass gobject; }; GType ags_ipatch_gig_reader_get_type(); gboolean ags_ipatch_gig_reader_test_flags(AgsIpatchGigReader *ipatch_gig_reader, guint flags); void ags_ipatch_gig_reader_set_flags(AgsIpatchGigReader *ipatch_gig_reader, guint flags); void ags_ipatch_gig_reader_unset_flags(AgsIpatchGigReader *ipatch_gig_reader, guint flags); #ifdef AGS_WITH_LIBINSTPATCH gboolean ags_ipatch_gig_reader_load(AgsIpatchGigReader *ipatch_gig_reader, IpatchFileHandle *handle); #endif /* select sample */ gboolean ags_ipatch_gig_reader_select_instrument(AgsIpatchGigReader *ipatch_gig_reader, guint instrument_index); gboolean ags_ipatch_gig_reader_select_sample(AgsIpatchGigReader *ipatch_gig_reader, guint sample_index); /* query */ gchar** ags_ipatch_gig_reader_get_instrument_all(AgsIpatchGigReader *ipatch_gig_reader); gchar** ags_ipatch_gig_reader_get_sample_all(AgsIpatchGigReader *ipatch_gig_reader); gchar** ags_ipatch_gig_reader_get_sample_by_instrument_index(AgsIpatchGigReader *ipatch_gig_reader, guint instrument_index); /* instantiate */ AgsIpatchGigReader* ags_ipatch_gig_reader_new(AgsIpatch *ipatch); G_END_DECLS #endif /*__AGS_IPATCH_GIG_READER_H__*/ gsequencer-3.1.3/ags/audio/file/ags_audio_container.h0000644000175000017500000001173013607210263017542 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_CONTAINER_H__ #define __AGS_AUDIO_CONTAINER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_CONTAINER (ags_audio_container_get_type()) #define AGS_AUDIO_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_CONTAINER, AgsAudioContainer)) #define AGS_AUDIO_CONTAINER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIO_CONTAINER, AgsAudioContainerClass)) #define AGS_IS_AUDIO_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUDIO_CONTAINER)) #define AGS_IS_AUDIO_CONTAINER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_AUDIO_CONTAINER)) #define AGS_AUDIO_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_AUDIO_CONTAINER, AgsAudioContainerClass)) #define AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(obj) (&(((AgsAudioContainer *) obj)->obj_mutex)) typedef struct _AgsAudioContainer AgsAudioContainer; typedef struct _AgsAudioContainerClass AgsAudioContainerClass; /** * AgsAudioContainerFlags: * @AGS_AUDIO_CONTAINER_ADDED_TO_REGISTRY: the audio container was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_CONTAINER_CONNECTED: indicates the audio container was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsAudioContainer by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_CONTAINER_ADDED_TO_REGISTRY = 1, AGS_AUDIO_CONTAINER_CONNECTED = 1 << 1, }AgsAudioContainerFlags; struct _AgsAudioContainer { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *soundcard; gchar *filename; gchar *preset; gchar *instrument; gchar *sample; guint file_audio_channels; guint file_samplerate; guint file_frame_count; guint samplerate; guint buffer_size; guint format; gint audio_channel; GObject *sound_container; GList *audio_signal; GList *wave; }; struct _AgsAudioContainerClass { GObjectClass gobject; }; GType ags_audio_container_get_type(); gboolean ags_audio_container_test_flags(AgsAudioContainer *audio_container, guint flags); void ags_audio_container_set_flags(AgsAudioContainer *audio_container, guint flags); void ags_audio_container_unset_flags(AgsAudioContainer *audio_container, guint flags); gboolean ags_audio_container_check_suffix(gchar *filename); GList* ags_audio_container_find_sound_resource(AgsAudioContainer *audio_container, gchar *preset, gchar *instrument, gchar *sample); /* fields */ void ags_audio_container_add_audio_signal(AgsAudioContainer *audio_container, GObject *audio_signal); void ags_audio_container_remove_audio_signal(AgsAudioContainer *audio_container, GObject *audio_signal); void ags_audio_container_add_wave(AgsAudioContainer *audio_container, GObject *wave); void ags_audio_container_remove_wave(AgsAudioContainer *audio_container, GObject *wave); /* IO functions */ gboolean ags_audio_container_open(AgsAudioContainer *audio_container); gboolean ags_audio_container_open_from_data(AgsAudioContainer *audio_container, gchar *data); gboolean ags_audio_container_rw_open(AgsAudioContainer *audio_container, gboolean create); void ags_audio_container_close(AgsAudioContainer *audio_container); void* ags_audio_container_read(AgsAudioContainer *audio_container, guint audio_channel, guint format, GError **error); GList* ags_audio_container_read_audio_signal(AgsAudioContainer *audio_container); GList* ags_audio_container_read_wave(AgsAudioContainer *audio_container, guint64 x_offset, gdouble delay, guint attack); void ags_audio_container_seek(AgsAudioContainer *audio_container, guint frames, gint whence); void ags_audio_container_write(AgsAudioContainer *audio_container, void *buffer, guint buffer_size, guint format); void ags_audio_container_flush(AgsAudioContainer *audio_container); /* instantiate */ AgsAudioContainer* ags_audio_container_new(gchar *filename, gchar *preset, gchar *instrument, gchar *sample, GObject *soundcard, gint audio_channel); G_END_DECLS #endif /*__AGS_AUDIO_CONTAINER_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sfz_region.c0000644000175000017500000004022213607210263016535 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_sfz_region_class_init(AgsSFZRegionClass *sfz_region); void ags_sfz_region_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sfz_region_init(AgsSFZRegion *sfz_region); void ags_sfz_region_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sfz_region_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sfz_region_dispose(GObject *gobject); void ags_sfz_region_finalize(GObject *gobject); AgsUUID* ags_sfz_region_get_uuid(AgsConnectable *connectable); gboolean ags_sfz_region_has_resource(AgsConnectable *connectable); gboolean ags_sfz_region_is_ready(AgsConnectable *connectable); void ags_sfz_region_add_to_registry(AgsConnectable *connectable); void ags_sfz_region_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_sfz_region_list_resource(AgsConnectable *connectable); xmlNode* ags_sfz_region_xml_compose(AgsConnectable *connectable); void ags_sfz_region_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_sfz_region_is_connected(AgsConnectable *connectable); void ags_sfz_region_connect(AgsConnectable *connectable); void ags_sfz_region_disconnect(AgsConnectable *connectable); /** * SECTION:ags_sfz_region * @short_description: interfacing SFZ regions * @title: AgsSFZRegion * @section_id: * @include: ags/audio/file/ags_sfz_region.h * * #AgsSFZRegion is the base object to ineract with SFZ regions. */ enum{ PROP_0, PROP_NTH_REGION, PROP_GROUP, PROP_SAMPLE, }; static gpointer ags_sfz_region_parent_class = NULL; GType ags_sfz_region_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sfz_region = 0; static const GTypeInfo ags_sfz_region_info = { sizeof(AgsSFZRegionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sfz_region_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSFZRegion), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sfz_region_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sfz_region_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sfz_region = g_type_register_static(G_TYPE_OBJECT, "AgsSFZRegion", &ags_sfz_region_info, 0); g_type_add_interface_static(ags_type_sfz_region, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sfz_region); } return g_define_type_id__volatile; } void ags_sfz_region_class_init(AgsSFZRegionClass *sfz_region) { GObjectClass *gobject; GParamSpec *param_spec; ags_sfz_region_parent_class = g_type_class_peek_parent(sfz_region); gobject = (GObjectClass *) sfz_region; gobject->set_property = ags_sfz_region_set_property; gobject->get_property = ags_sfz_region_get_property; gobject->dispose = ags_sfz_region_dispose; gobject->finalize = ags_sfz_region_finalize; /* properties */ /** * AgsSFZRegion:nth-region: * * The nth region. * * Since: 3.0.0 */ param_spec = g_param_spec_int("nth-region", i18n_pspec("nth region"), i18n_pspec("The nth region it belongs to"), -1, G_MAXINT32, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NTH_REGION, param_spec); /** * AgsSFZRegion:group: * * The group assigned with. * * Since: 3.0.0 */ param_spec = g_param_spec_object("group", i18n_pspec("assigned group"), i18n_pspec("The group it is assigned with"), AGS_TYPE_SFZ_GROUP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GROUP, param_spec); /** * AgsSFZRegion:sample: * * The sample assigned with. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sample", i18n_pspec("assigned sample"), i18n_pspec("The sample it is assigned with"), AGS_TYPE_SFZ_SAMPLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); } void ags_sfz_region_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_sfz_region_get_uuid; connectable->has_resource = ags_sfz_region_has_resource; connectable->is_ready = ags_sfz_region_is_ready; connectable->add_to_registry = ags_sfz_region_add_to_registry; connectable->remove_from_registry = ags_sfz_region_remove_from_registry; connectable->list_resource = ags_sfz_region_list_resource; connectable->xml_compose = ags_sfz_region_xml_compose; connectable->xml_parse = ags_sfz_region_xml_parse; connectable->is_connected = ags_sfz_region_is_connected; connectable->connect = ags_sfz_region_connect; connectable->disconnect = ags_sfz_region_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_sfz_region_init(AgsSFZRegion *sfz_region) { AgsConfig *config; sfz_region->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(sfz_region->obj_mutex)); /* uuid */ sfz_region->uuid = ags_uuid_alloc(); ags_uuid_generate(sfz_region->uuid); sfz_region->nth_region = -1; sfz_region->group = NULL; sfz_region->sample = NULL; sfz_region->control = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); } void ags_sfz_region_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSFZRegion *sfz_region; GRecMutex *sfz_region_mutex; sfz_region = AGS_SFZ_REGION(gobject); /* get sfz region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); switch(prop_id){ case PROP_NTH_REGION: { gint nth_region; nth_region = g_value_get_int(value); g_rec_mutex_lock(sfz_region_mutex); if(nth_region == sfz_region->nth_region){ g_rec_mutex_unlock(sfz_region_mutex); return; } sfz_region->nth_region = nth_region; g_rec_mutex_unlock(sfz_region_mutex); } break; case PROP_GROUP: { GObject *group; group = g_value_get_object(value); g_rec_mutex_lock(sfz_region_mutex); if(sfz_region->group == group){ g_rec_mutex_unlock(sfz_region_mutex); return; } if(sfz_region->group != NULL){ g_object_unref(sfz_region->group); } if(group != NULL){ g_object_ref(group); } sfz_region->group = group; g_rec_mutex_unlock(sfz_region_mutex); } break; case PROP_SAMPLE: { GObject *sample; sample = g_value_get_object(value); g_rec_mutex_lock(sfz_region_mutex); if(sfz_region->sample == sample){ g_rec_mutex_unlock(sfz_region_mutex); return; } if(sfz_region->sample != NULL){ g_object_unref(sfz_region->sample); } if(sample != NULL){ g_object_ref(sample); } sfz_region->sample = sample; g_rec_mutex_unlock(sfz_region_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sfz_region_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSFZRegion *sfz_region; GRecMutex *sfz_region_mutex; sfz_region = (AgsSFZRegion *) gobject; /* get sfz region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); switch(prop_id){ case PROP_NTH_REGION: { g_rec_mutex_lock(sfz_region_mutex); g_value_set_int(value, sfz_region->nth_region); g_rec_mutex_unlock(sfz_region_mutex); } break; case PROP_GROUP: { g_rec_mutex_lock(sfz_region_mutex); g_value_set_object(value, sfz_region->group); g_rec_mutex_unlock(sfz_region_mutex); } break; case PROP_SAMPLE: { g_rec_mutex_lock(sfz_region_mutex); g_value_set_object(value, sfz_region->sample); g_rec_mutex_unlock(sfz_region_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sfz_region_dispose(GObject *gobject) { AgsSFZRegion *sfz_region; sfz_region = AGS_SFZ_REGION(gobject); if(sfz_region->sample != NULL){ g_object_unref(sfz_region->sample); sfz_region->sample = NULL; } if(sfz_region->group != NULL){ g_object_unref(sfz_region->group); sfz_region->group = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sfz_region_parent_class)->dispose(gobject); } void ags_sfz_region_finalize(GObject *gobject) { AgsSFZRegion *sfz_region; sfz_region = AGS_SFZ_REGION(gobject); if(sfz_region->sample != NULL){ g_object_unref(sfz_region->sample); } if(sfz_region->group != NULL){ g_object_unref(sfz_region->group); } /* call parent */ G_OBJECT_CLASS(ags_sfz_region_parent_class)->finalize(gobject); } AgsUUID* ags_sfz_region_get_uuid(AgsConnectable *connectable) { AgsSFZRegion *sfz_region; AgsUUID *ptr; GRecMutex *sfz_region_mutex; sfz_region = AGS_SFZ_REGION(connectable); /* get audio file mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); /* get UUID */ g_rec_mutex_lock(sfz_region_mutex); ptr = sfz_region->uuid; g_rec_mutex_unlock(sfz_region_mutex); return(ptr); } gboolean ags_sfz_region_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_sfz_region_is_ready(AgsConnectable *connectable) { AgsSFZRegion *sfz_region; gboolean is_ready; sfz_region = AGS_SFZ_REGION(connectable); /* check is ready */ is_ready = ags_sfz_region_test_flags(sfz_region, AGS_SFZ_REGION_ADDED_TO_REGISTRY); return(is_ready); } void ags_sfz_region_add_to_registry(AgsConnectable *connectable) { AgsSFZRegion *sfz_region; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } sfz_region = AGS_SFZ_REGION(connectable); ags_sfz_region_set_flags(sfz_region, AGS_SFZ_REGION_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) sfz_region); ags_registry_add_entry(registry, entry); } } void ags_sfz_region_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_sfz_region_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_sfz_region_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_sfz_region_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_sfz_region_is_connected(AgsConnectable *connectable) { AgsSFZRegion *sfz_region; gboolean is_connected; sfz_region = AGS_SFZ_REGION(connectable); /* check is connected */ is_connected = ags_sfz_region_test_flags(sfz_region, AGS_SFZ_REGION_CONNECTED); return(is_connected); } void ags_sfz_region_connect(AgsConnectable *connectable) { AgsSFZRegion *sfz_region; if(ags_connectable_is_connected(connectable)){ return; } sfz_region = AGS_SFZ_REGION(connectable); ags_sfz_region_set_flags(sfz_region, AGS_SFZ_REGION_CONNECTED); } void ags_sfz_region_disconnect(AgsConnectable *connectable) { AgsSFZRegion *sfz_region; if(!ags_connectable_is_connected(connectable)){ return; } sfz_region = AGS_SFZ_REGION(connectable); ags_sfz_region_unset_flags(sfz_region, AGS_SFZ_REGION_CONNECTED); } /** * ags_sfz_region_test_flags: * @sfz_region: the #AgsSFZRegion * @flags: the flags * * Test @flags to be set on @sfz_region. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sfz_region_test_flags(AgsSFZRegion *sfz_region, guint flags) { gboolean retval; GRecMutex *sfz_region_mutex; if(!AGS_IS_SFZ_REGION(sfz_region)){ return(FALSE); } /* get sfz_region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); /* test */ g_rec_mutex_lock(sfz_region_mutex); retval = (flags & (sfz_region->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(sfz_region_mutex); return(retval); } /** * ags_sfz_region_set_flags: * @sfz_region: the #AgsSFZRegion * @flags: see #AgsSFZRegionFlags-enum * * Enable a feature of @sfz_region. * * Since: 3.0.0 */ void ags_sfz_region_set_flags(AgsSFZRegion *sfz_region, guint flags) { GRecMutex *sfz_region_mutex; if(!AGS_IS_SFZ_REGION(sfz_region)){ return; } /* get sfz_region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(sfz_region_mutex); sfz_region->flags |= flags; g_rec_mutex_unlock(sfz_region_mutex); } /** * ags_sfz_region_unset_flags: * @sfz_region: the #AgsSFZRegion * @flags: see #AgsSFZRegionFlags-enum * * Disable a feature of @sfz_region. * * Since: 3.0.0 */ void ags_sfz_region_unset_flags(AgsSFZRegion *sfz_region, guint flags) { GRecMutex *sfz_region_mutex; if(!AGS_IS_SFZ_REGION(sfz_region)){ return; } /* get sfz_region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(sfz_region_mutex); sfz_region->flags &= (~flags); g_rec_mutex_unlock(sfz_region_mutex); } /** * ags_sfz_region_insert_control: * @sfz_region: the #AgsSFZRegion * @key: the key * @value: the value * * Insert control specified by @key and @value to @sfz_region. * * Since: 3.0.0 */ void ags_sfz_region_insert_control(AgsSFZRegion *sfz_region, gchar *key, gchar *value) { GRecMutex *sfz_region_mutex; if(!AGS_IS_SFZ_REGION(sfz_region)){ return; } /* get sfz_region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); /* insert */ g_rec_mutex_lock(sfz_region_mutex); g_hash_table_insert(sfz_region->control, key, value); g_rec_mutex_unlock(sfz_region_mutex); } /** * ags_sfz_region_lookup_control: * @sfz_region: the #AgsSFZRegion * @key: the key * * Lookup control specified by @key of @sfz_region. * * Since: 3.0.0 */ gchar* ags_sfz_region_lookup_control(AgsSFZRegion *sfz_region, gchar *key) { gchar *value; GRecMutex *sfz_region_mutex; if(!AGS_IS_SFZ_REGION(sfz_region)){ return(NULL); } /* get sfz_region mutex */ sfz_region_mutex = AGS_SFZ_REGION_GET_OBJ_MUTEX(sfz_region); /* lookup */ g_rec_mutex_lock(sfz_region_mutex); value = g_hash_table_lookup(sfz_region->control, key); value = g_strdup(value); g_rec_mutex_unlock(sfz_region_mutex); return(value); } /** * ags_sfz_region_new: * * Creates a new instance of #AgsSFZRegion. * * Returns: the new #AgsSFZRegion. * * Since: 3.0.0 */ AgsSFZRegion* ags_sfz_region_new() { AgsSFZRegion *sfz_region; sfz_region = (AgsSFZRegion *) g_object_new(AGS_TYPE_SFZ_REGION, NULL); return(sfz_region); } gsequencer-3.1.3/ags/audio/file/ags_audio_file_link.h0000644000175000017500000000405313607210263017514 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_FILE_LINK_H__ #define __AGS_AUDIO_FILE_LINK_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_FILE_LINK (ags_audio_file_link_get_type()) #define AGS_AUDIO_FILE_LINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_FILE_LINK, AgsAudioFileLink)) #define AGS_AUDIO_FILE_LINK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUDIO_FILE_LINK, AgsAudioFileLink)) #define AGS_IS_AUDIO_FILE_LINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUDIO_FILE_LINK)) #define AGS_IS_AUDIO_FILE_LINK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUDIO_FILE_LINK)) #define AGS_AUDIO_FILE_LINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUDIO_FILE_LINK, AgsAudioFileLinkClass)) typedef struct _AgsAudioFileLink AgsAudioFileLink; typedef struct _AgsAudioFileLinkClass AgsAudioFileLinkClass; struct _AgsAudioFileLink { AgsFileLink file_link; gchar *preset; gchar *instrument; gchar *sample; guint audio_channel; AgsTimestamp *timestamp; }; struct _AgsAudioFileLinkClass { AgsFileLinkClass file_link; }; GType ags_audio_file_link_get_type(); AgsAudioFileLink* ags_audio_file_link_new(); G_END_DECLS #endif /*__AGS_AUDIO_FILE_LINK_H__*/ gsequencer-3.1.3/ags/audio/file/ags_ipatch_sample.h0000644000175000017500000000633113607210263017211 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_IPATCH_SAMPLE_H__ #define __AGS_IPATCH_SAMPLE_H__ #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif G_BEGIN_DECLS #define AGS_TYPE_IPATCH_SAMPLE (ags_ipatch_sample_get_type()) #define AGS_IPATCH_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_IPATCH_SAMPLE, AgsIpatchSample)) #define AGS_IPATCH_SAMPLE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_IPATCH_SAMPLE, AgsIpatchSampleClass)) #define AGS_IS_IPATCH_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_IPATCH_SAMPLE)) #define AGS_IS_IPATCH_SAMPLE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_IPATCH_SAMPLE)) #define AGS_IPATCH_SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_IPATCH_SAMPLE, AgsIpatchSampleClass)) #define AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(obj) (&(((AgsIpatchSample *) obj)->obj_mutex)) typedef struct _AgsIpatchSample AgsIpatchSample; typedef struct _AgsIpatchSampleClass AgsIpatchSampleClass; /** * AgsIpatchSampleFlags: * @AGS_IPATCH_SAMPLE_ADDED_TO_REGISTRY: the ipatch sample was added to registry, see #AgsConnectable::add_to_registry() * @AGS_IPATCH_SAMPLE_CONNECTED: indicates the ipatch sample was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsIpatchSample by * enable/disable as flags. */ typedef enum{ AGS_IPATCH_SAMPLE_ADDED_TO_REGISTRY = 1, AGS_IPATCH_SAMPLE_CONNECTED = 1 << 1, }AgsIpatchSampleFlags; struct _AgsIpatchSample { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint audio_channels; gint64 *audio_channel_written; guint buffer_size; guint format; guint offset; guint64 buffer_offset; void *full_buffer; void *buffer; guchar *pointer; guchar *current; gsize length; #ifdef AGS_WITH_LIBINSTPATCH IpatchContainer *sample; #else gpointer sample; #endif }; struct _AgsIpatchSampleClass { GObjectClass gobject; }; GType ags_ipatch_sample_get_type(); gboolean ags_ipatch_sample_test_flags(AgsIpatchSample *ipatch_sample, guint flags); void ags_ipatch_sample_set_flags(AgsIpatchSample *ipatch_sample, guint flags); void ags_ipatch_sample_unset_flags(AgsIpatchSample *ipatch_sample, guint flags); /* instantiate */ AgsIpatchSample* ags_ipatch_sample_new(); G_END_DECLS #endif /*__AGS_IPATCH_SAMPLE_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sfz_group.c0000644000175000017500000003767213613101164016421 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_sfz_group_class_init(AgsSFZGroupClass *sfz_group); void ags_sfz_group_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sfz_group_init(AgsSFZGroup *sfz_group); void ags_sfz_group_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sfz_group_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sfz_group_dispose(GObject *gobject); void ags_sfz_group_finalize(GObject *gobject); AgsUUID* ags_sfz_group_get_uuid(AgsConnectable *connectable); gboolean ags_sfz_group_has_resource(AgsConnectable *connectable); gboolean ags_sfz_group_is_ready(AgsConnectable *connectable); void ags_sfz_group_add_to_registry(AgsConnectable *connectable); void ags_sfz_group_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_sfz_group_list_resource(AgsConnectable *connectable); xmlNode* ags_sfz_group_xml_compose(AgsConnectable *connectable); void ags_sfz_group_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_sfz_group_is_connected(AgsConnectable *connectable); void ags_sfz_group_connect(AgsConnectable *connectable); void ags_sfz_group_disconnect(AgsConnectable *connectable); /** * SECTION:ags_sfz_group * @short_description: interfacing SFZ groups * @title: AgsSFZGroup * @section_id: * @include: ags/audio/file/ags_sfz_group.h * * #AgsSFZGroup is the base object to ineract with SFZ groups. */ enum{ PROP_0, PROP_NTH_GROUP, PROP_REGION, PROP_SAMPLE, }; static gpointer ags_sfz_group_parent_class = NULL; GType ags_sfz_group_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sfz_group = 0; static const GTypeInfo ags_sfz_group_info = { sizeof(AgsSFZGroupClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sfz_group_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSFZGroup), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sfz_group_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sfz_group_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sfz_group = g_type_register_static(G_TYPE_OBJECT, "AgsSFZGroup", &ags_sfz_group_info, 0); g_type_add_interface_static(ags_type_sfz_group, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sfz_group); } return g_define_type_id__volatile; } void ags_sfz_group_class_init(AgsSFZGroupClass *sfz_group) { GObjectClass *gobject; GParamSpec *param_spec; ags_sfz_group_parent_class = g_type_class_peek_parent(sfz_group); gobject = (GObjectClass *) sfz_group; gobject->set_property = ags_sfz_group_set_property; gobject->get_property = ags_sfz_group_get_property; gobject->dispose = ags_sfz_group_dispose; gobject->finalize = ags_sfz_group_finalize; /* properties */ /** * AgsSFZGroup:nth-group: * * The nth group. * * Since: 3.0.0 */ param_spec = g_param_spec_int("nth-group", i18n_pspec("nth group"), i18n_pspec("The nth group it belongs to"), -1, G_MAXINT32, -1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NTH_GROUP, param_spec); /** * AgsSFZGroup:region: (type GList(AgsSFZRegion)) (transfer full) * * The region assigned with. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("region", i18n_pspec("assigned region"), i18n_pspec("The region it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REGION, param_spec); /** * AgsSFZGroup:sample: * * The sample assigned with. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sample", i18n_pspec("assigned sample"), i18n_pspec("The sample it is assigned with"), AGS_TYPE_SFZ_SAMPLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); } void ags_sfz_group_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_sfz_group_get_uuid; connectable->has_resource = ags_sfz_group_has_resource; connectable->is_ready = ags_sfz_group_is_ready; connectable->add_to_registry = ags_sfz_group_add_to_registry; connectable->remove_from_registry = ags_sfz_group_remove_from_registry; connectable->list_resource = ags_sfz_group_list_resource; connectable->xml_compose = ags_sfz_group_xml_compose; connectable->xml_parse = ags_sfz_group_xml_parse; connectable->is_connected = ags_sfz_group_is_connected; connectable->connect = ags_sfz_group_connect; connectable->disconnect = ags_sfz_group_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_sfz_group_init(AgsSFZGroup *sfz_group) { AgsConfig *config; sfz_group->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(sfz_group->obj_mutex)); /* uuid */ sfz_group->uuid = ags_uuid_alloc(); ags_uuid_generate(sfz_group->uuid); sfz_group->nth_group = -1; sfz_group->region = NULL; sfz_group->sample = NULL; sfz_group->control = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); } void ags_sfz_group_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSFZGroup *sfz_group; GRecMutex *sfz_group_mutex; sfz_group = AGS_SFZ_GROUP(gobject); /* get sfz group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); switch(prop_id){ case PROP_NTH_GROUP: { gint nth_group; nth_group = g_value_get_int(value); g_rec_mutex_lock(sfz_group_mutex); if(nth_group == sfz_group->nth_group){ g_rec_mutex_unlock(sfz_group_mutex); return; } sfz_group->nth_group = nth_group; g_rec_mutex_unlock(sfz_group_mutex); } break; case PROP_REGION: { GObject *region; region = g_value_get_pointer(value); g_rec_mutex_lock(sfz_group_mutex); if(region == NULL || g_list_find(sfz_group->region, region) != NULL){ g_rec_mutex_unlock(sfz_group_mutex); return; } g_object_ref(region); sfz_group->region = g_list_prepend(sfz_group->region, region); g_rec_mutex_unlock(sfz_group_mutex); } break; case PROP_SAMPLE: { GObject *sample; sample = g_value_get_object(value); g_rec_mutex_lock(sfz_group_mutex); if(sfz_group->sample == sample){ g_rec_mutex_unlock(sfz_group_mutex); return; } if(sfz_group->sample != NULL){ g_object_unref(sfz_group->sample); } if(sample != NULL){ g_object_ref(sample); } sfz_group->sample = sample; g_rec_mutex_unlock(sfz_group_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sfz_group_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSFZGroup *sfz_group; GRecMutex *sfz_group_mutex; sfz_group = (AgsSFZGroup *) gobject; /* get sfz group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); switch(prop_id){ case PROP_NTH_GROUP: { g_rec_mutex_lock(sfz_group_mutex); g_value_set_int(value, sfz_group->nth_group); g_rec_mutex_unlock(sfz_group_mutex); } break; case PROP_REGION: { g_rec_mutex_lock(sfz_group_mutex); g_value_set_pointer(value, g_list_copy_deep(sfz_group->region, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(sfz_group_mutex); } break; case PROP_SAMPLE: { g_rec_mutex_lock(sfz_group_mutex); g_value_set_object(value, sfz_group->sample); g_rec_mutex_unlock(sfz_group_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sfz_group_dispose(GObject *gobject) { AgsSFZGroup *sfz_group; sfz_group = AGS_SFZ_GROUP(gobject); if(sfz_group->sample != NULL){ g_object_unref(sfz_group->sample); sfz_group->sample = NULL; } if(sfz_group->region != NULL){ g_list_free_full(sfz_group->region, g_object_unref); sfz_group->region = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sfz_group_parent_class)->dispose(gobject); } void ags_sfz_group_finalize(GObject *gobject) { AgsSFZGroup *sfz_group; sfz_group = AGS_SFZ_GROUP(gobject); if(sfz_group->sample != NULL){ g_object_unref(sfz_group->sample); } if(sfz_group->region != NULL){ g_list_free_full(sfz_group->region, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_sfz_group_parent_class)->finalize(gobject); } AgsUUID* ags_sfz_group_get_uuid(AgsConnectable *connectable) { AgsSFZGroup *sfz_group; AgsUUID *ptr; GRecMutex *sfz_group_mutex; sfz_group = AGS_SFZ_GROUP(connectable); /* get audio file mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); /* get UUID */ g_rec_mutex_lock(sfz_group_mutex); ptr = sfz_group->uuid; g_rec_mutex_unlock(sfz_group_mutex); return(ptr); } gboolean ags_sfz_group_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_sfz_group_is_ready(AgsConnectable *connectable) { AgsSFZGroup *sfz_group; gboolean is_ready; sfz_group = AGS_SFZ_GROUP(connectable); /* check is ready */ is_ready = ags_sfz_group_test_flags(sfz_group, AGS_SFZ_GROUP_ADDED_TO_REGISTRY); return(is_ready); } void ags_sfz_group_add_to_registry(AgsConnectable *connectable) { AgsSFZGroup *sfz_group; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } sfz_group = AGS_SFZ_GROUP(connectable); ags_sfz_group_set_flags(sfz_group, AGS_SFZ_GROUP_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) sfz_group); ags_registry_add_entry(registry, entry); } } void ags_sfz_group_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_sfz_group_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_sfz_group_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_sfz_group_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_sfz_group_is_connected(AgsConnectable *connectable) { AgsSFZGroup *sfz_group; gboolean is_connected; sfz_group = AGS_SFZ_GROUP(connectable); /* check is connected */ is_connected = ags_sfz_group_test_flags(sfz_group, AGS_SFZ_GROUP_CONNECTED); return(is_connected); } void ags_sfz_group_connect(AgsConnectable *connectable) { AgsSFZGroup *sfz_group; if(ags_connectable_is_connected(connectable)){ return; } sfz_group = AGS_SFZ_GROUP(connectable); ags_sfz_group_set_flags(sfz_group, AGS_SFZ_GROUP_CONNECTED); } void ags_sfz_group_disconnect(AgsConnectable *connectable) { AgsSFZGroup *sfz_group; if(!ags_connectable_is_connected(connectable)){ return; } sfz_group = AGS_SFZ_GROUP(connectable); ags_sfz_group_unset_flags(sfz_group, AGS_SFZ_GROUP_CONNECTED); } /** * ags_sfz_group_test_flags: * @sfz_group: the #AgsSFZGroup * @flags: the flags * * Test @flags to be set on @sfz_group. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sfz_group_test_flags(AgsSFZGroup *sfz_group, guint flags) { gboolean retval; GRecMutex *sfz_group_mutex; if(!AGS_IS_SFZ_GROUP(sfz_group)){ return(FALSE); } /* get sfz_group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); /* test */ g_rec_mutex_lock(sfz_group_mutex); retval = (flags & (sfz_group->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(sfz_group_mutex); return(retval); } /** * ags_sfz_group_set_flags: * @sfz_group: the #AgsSFZGroup * @flags: see #AgsSFZGroupFlags-enum * * Enable a feature of @sfz_group. * * Since: 3.0.0 */ void ags_sfz_group_set_flags(AgsSFZGroup *sfz_group, guint flags) { GRecMutex *sfz_group_mutex; if(!AGS_IS_SFZ_GROUP(sfz_group)){ return; } /* get sfz_group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(sfz_group_mutex); sfz_group->flags |= flags; g_rec_mutex_unlock(sfz_group_mutex); } /** * ags_sfz_group_unset_flags: * @sfz_group: the #AgsSFZGroup * @flags: see #AgsSFZGroupFlags-enum * * Disable a feature of @sfz_group. * * Since: 3.0.0 */ void ags_sfz_group_unset_flags(AgsSFZGroup *sfz_group, guint flags) { GRecMutex *sfz_group_mutex; if(!AGS_IS_SFZ_GROUP(sfz_group)){ return; } /* get sfz_group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(sfz_group_mutex); sfz_group->flags &= (~flags); g_rec_mutex_unlock(sfz_group_mutex); } /** * ags_sfz_group_insert_control: * @sfz_group: the #AgsSFZGroup * @key: the key * @value: the value * * Insert control specified by @key and @value to @sfz_group. * * Since: 3.0.0 */ void ags_sfz_group_insert_control(AgsSFZGroup *sfz_group, gchar *key, gchar *value) { GRecMutex *sfz_group_mutex; if(!AGS_IS_SFZ_GROUP(sfz_group)){ return; } /* get sfz_group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); /* insert */ g_rec_mutex_lock(sfz_group_mutex); g_hash_table_insert(sfz_group->control, key, value); g_rec_mutex_unlock(sfz_group_mutex); } /** * ags_sfz_group_lookup_control: * @sfz_group: the #AgsSFZGroup * @key: the key * * Lookup control specified by @key of @sfz_group. * * Since: 3.0.0 */ gchar* ags_sfz_group_lookup_control(AgsSFZGroup *sfz_group, gchar *key) { gchar *value; GRecMutex *sfz_group_mutex; if(!AGS_IS_SFZ_GROUP(sfz_group)){ return(NULL); } /* get sfz_group mutex */ sfz_group_mutex = AGS_SFZ_GROUP_GET_OBJ_MUTEX(sfz_group); /* lookup */ g_rec_mutex_lock(sfz_group_mutex); value = g_hash_table_lookup(sfz_group->control, key); value = g_strdup(value); g_rec_mutex_unlock(sfz_group_mutex); return(value); } /** * ags_sfz_group_new: * * Creates a new instance of #AgsSFZGroup. * * Returns: the new #AgsSFZGroup. * * Since: 3.0.0 */ AgsSFZGroup* ags_sfz_group_new() { AgsSFZGroup *sfz_group; sfz_group = (AgsSFZGroup *) g_object_new(AGS_TYPE_SFZ_GROUP, NULL); return(sfz_group); } gsequencer-3.1.3/ags/audio/file/ags_ipatch_dls2_reader.c0000644000175000017500000006107613607210263020120 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_ipatch_dls2_reader_class_init(AgsIpatchDLS2ReaderClass *ipatch_dls2_reader); void ags_ipatch_dls2_reader_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ipatch_dls2_reader_init(AgsIpatchDLS2Reader *ipatch_dls2_reader); void ags_ipatch_dls2_reader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ipatch_dls2_reader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ipatch_dls2_reader_dispose(GObject *gobject); void ags_ipatch_dls2_reader_finalize(GObject *gobject); AgsUUID* ags_ipatch_dls2_reader_get_uuid(AgsConnectable *connectable); gboolean ags_ipatch_dls2_reader_has_resource(AgsConnectable *connectable); gboolean ags_ipatch_dls2_reader_is_ready(AgsConnectable *connectable); void ags_ipatch_dls2_reader_add_to_registry(AgsConnectable *connectable); void ags_ipatch_dls2_reader_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_ipatch_dls2_reader_list_resource(AgsConnectable *connectable); xmlNode* ags_ipatch_dls2_reader_xml_compose(AgsConnectable *connectable); void ags_ipatch_dls2_reader_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_ipatch_dls2_reader_is_connected(AgsConnectable *connectable); void ags_ipatch_dls2_reader_connect(AgsConnectable *connectable); void ags_ipatch_dls2_reader_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ipatch_dls2_reader * @short_description: interfacing DLS2 related API of libinstpatch * @title: AgsIpatchDLS2Reader * @section_id: * @include: ags/audio/file/ags_ipatch_dls2_reader.h * * #AgsIpatchDLS2Reader is the base object to ineract with DLS2 related API. */ static gpointer ags_ipatch_dls2_reader_parent_class = NULL; enum{ PROP_0, PROP_IPATCH, }; GType ags_ipatch_dls2_reader_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ipatch_dls2_reader = 0; static const GTypeInfo ags_ipatch_dls2_reader_info = { sizeof(AgsIpatchDLS2ReaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ipatch_dls2_reader_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsIpatchDLS2Reader), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ipatch_dls2_reader_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ipatch_dls2_reader_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ipatch_dls2_reader = g_type_register_static(G_TYPE_OBJECT, "AgsIpatchDLS2Reader", &ags_ipatch_dls2_reader_info, 0); g_type_add_interface_static(ags_type_ipatch_dls2_reader, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ipatch_dls2_reader); } return g_define_type_id__volatile; } void ags_ipatch_dls2_reader_class_init(AgsIpatchDLS2ReaderClass *ipatch_dls2_reader) { GObjectClass *gobject; GParamSpec *param_spec; ags_ipatch_dls2_reader_parent_class = g_type_class_peek_parent(ipatch_dls2_reader); gobject = (GObjectClass *) ipatch_dls2_reader; gobject->set_property = ags_ipatch_dls2_reader_set_property; gobject->get_property = ags_ipatch_dls2_reader_get_property; gobject->dispose = ags_ipatch_dls2_reader_dispose; gobject->finalize = ags_ipatch_dls2_reader_finalize; /* properties */ /** * AgsIpatchDLS2Reader:ipatch: * * The assigned #AgsIpatch * * Since: 3.0.0 */ param_spec = g_param_spec_object("ipatch", i18n_pspec("the ipatch"), i18n_pspec("The assigned ipatch"), AGS_TYPE_IPATCH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IPATCH, param_spec); } void ags_ipatch_dls2_reader_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_ipatch_dls2_reader_get_uuid; connectable->has_resource = ags_ipatch_dls2_reader_has_resource; connectable->is_ready = ags_ipatch_dls2_reader_is_ready; connectable->add_to_registry = ags_ipatch_dls2_reader_add_to_registry; connectable->remove_from_registry = ags_ipatch_dls2_reader_remove_from_registry; connectable->list_resource = ags_ipatch_dls2_reader_list_resource; connectable->xml_compose = ags_ipatch_dls2_reader_xml_compose; connectable->xml_parse = ags_ipatch_dls2_reader_xml_parse; connectable->is_connected = ags_ipatch_dls2_reader_is_connected; connectable->connect = ags_ipatch_dls2_reader_connect; connectable->disconnect = ags_ipatch_dls2_reader_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_ipatch_dls2_reader_init(AgsIpatchDLS2Reader *ipatch_dls2_reader) { guint i; ipatch_dls2_reader->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(ipatch_dls2_reader->obj_mutex)); /* uuid */ ipatch_dls2_reader->uuid = ags_uuid_alloc(); ags_uuid_generate(ipatch_dls2_reader->uuid); ipatch_dls2_reader->level = 0; ipatch_dls2_reader->ipatch = NULL; /* selected */ ipatch_dls2_reader->index_selected = (guint *) malloc(3 * sizeof(guint)); memset(ipatch_dls2_reader->index_selected, 0, 3 * sizeof(guint)); ipatch_dls2_reader->name_selected = (gchar **) malloc(4 * sizeof(gchar *)); for(i = 0; i < 4; i++){ ipatch_dls2_reader->name_selected[i] = NULL; } /* reader */ ipatch_dls2_reader->reader = NULL; ipatch_dls2_reader->dls2 = NULL; ipatch_dls2_reader->base = NULL; ipatch_dls2_reader->instrument = NULL; ipatch_dls2_reader->sample = NULL; ipatch_dls2_reader->error = NULL; } void ags_ipatch_dls2_reader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsIpatchDLS2Reader *ipatch_dls2_reader; GRecMutex *ipatch_dls2_reader_mutex; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(gobject); /* get ipatch sample mutex */ ipatch_dls2_reader_mutex = AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(ipatch_dls2_reader); switch(prop_id){ case PROP_IPATCH: { AgsIpatch *ipatch; ipatch = (AgsIpatch *) g_value_get_object(value); g_rec_mutex_lock(ipatch_dls2_reader_mutex); if(ipatch_dls2_reader->ipatch == ipatch){ g_rec_mutex_unlock(ipatch_dls2_reader_mutex); return; } if(ipatch_dls2_reader->ipatch != NULL){ g_object_unref(ipatch_dls2_reader->ipatch); } if(ipatch != NULL){ g_object_ref(ipatch); } ipatch_dls2_reader->ipatch = ipatch; g_rec_mutex_unlock(ipatch_dls2_reader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_dls2_reader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsIpatchDLS2Reader *ipatch_dls2_reader; GRecMutex *ipatch_dls2_reader_mutex; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(gobject); /* get ipatch sample mutex */ ipatch_dls2_reader_mutex = AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(ipatch_dls2_reader); switch(prop_id){ case PROP_IPATCH: { g_rec_mutex_lock(ipatch_dls2_reader_mutex); g_value_set_object(value, ipatch_dls2_reader->ipatch); g_rec_mutex_unlock(ipatch_dls2_reader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_dls2_reader_dispose(GObject *gobject) { AgsIpatchDLS2Reader *ipatch_dls2_reader; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(gobject); if(ipatch_dls2_reader->ipatch != NULL){ g_object_unref(ipatch_dls2_reader->ipatch); ipatch_dls2_reader->ipatch = NULL; } /* call parent */ G_OBJECT_CLASS(ags_ipatch_dls2_reader_parent_class)->dispose(gobject); } void ags_ipatch_dls2_reader_finalize(GObject *gobject) { AgsIpatchDLS2Reader *ipatch_dls2_reader; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(gobject); if(ipatch_dls2_reader->ipatch != NULL){ g_object_unref(ipatch_dls2_reader->ipatch); } /* call parent */ G_OBJECT_CLASS(ags_ipatch_dls2_reader_parent_class)->finalize(gobject); } AgsUUID* ags_ipatch_dls2_reader_get_uuid(AgsConnectable *connectable) { AgsIpatchDLS2Reader *ipatch_dls2_reader; AgsUUID *ptr; GRecMutex *ipatch_dls2_reader_mutex; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(connectable); /* get audio file mutex */ ipatch_dls2_reader_mutex = AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(ipatch_dls2_reader); /* get UUID */ g_rec_mutex_lock(ipatch_dls2_reader_mutex); ptr = ipatch_dls2_reader->uuid; g_rec_mutex_unlock(ipatch_dls2_reader_mutex); return(ptr); } gboolean ags_ipatch_dls2_reader_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_ipatch_dls2_reader_is_ready(AgsConnectable *connectable) { AgsIpatchDLS2Reader *ipatch_dls2_reader; gboolean is_ready; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(connectable); /* check is ready */ is_ready = ags_ipatch_dls2_reader_test_flags(ipatch_dls2_reader, AGS_IPATCH_DLS2_READER_ADDED_TO_REGISTRY); return(is_ready); } void ags_ipatch_dls2_reader_add_to_registry(AgsConnectable *connectable) { AgsIpatchDLS2Reader *ipatch_dls2_reader; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(connectable); ags_ipatch_dls2_reader_set_flags(ipatch_dls2_reader, AGS_IPATCH_DLS2_READER_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) ipatch_dls2_reader); ags_registry_add_entry(registry, entry); } } void ags_ipatch_dls2_reader_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_ipatch_dls2_reader_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_ipatch_dls2_reader_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_ipatch_dls2_reader_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_ipatch_dls2_reader_is_connected(AgsConnectable *connectable) { AgsIpatchDLS2Reader *ipatch_dls2_reader; gboolean is_connected; ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(connectable); /* check is connected */ is_connected = ags_ipatch_dls2_reader_test_flags(ipatch_dls2_reader, AGS_IPATCH_DLS2_READER_CONNECTED); return(is_connected); } void ags_ipatch_dls2_reader_connect(AgsConnectable *connectable) { AgsIpatchDLS2Reader *ipatch_dls2_reader; if(ags_connectable_is_connected(connectable)){ return; } ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(connectable); ags_ipatch_dls2_reader_set_flags(ipatch_dls2_reader, AGS_IPATCH_DLS2_READER_CONNECTED); } void ags_ipatch_dls2_reader_disconnect(AgsConnectable *connectable) { AgsIpatchDLS2Reader *ipatch_dls2_reader; if(!ags_connectable_is_connected(connectable)){ return; } ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(connectable); ags_ipatch_dls2_reader_unset_flags(ipatch_dls2_reader, AGS_IPATCH_DLS2_READER_CONNECTED); } /** * ags_ipatch_dls2_reader_test_flags: * @ipatch_dls2_reader: the #AgsIpatchDLS2Reader * @flags: the flags * * Test @flags to be set on @ipatch_dls2_reader. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_ipatch_dls2_reader_test_flags(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint flags) { gboolean retval; GRecMutex *ipatch_dls2_reader_mutex; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(FALSE); } /* get ipatch_dls2_reader mutex */ ipatch_dls2_reader_mutex = AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(ipatch_dls2_reader); /* test */ g_rec_mutex_lock(ipatch_dls2_reader_mutex); retval = (flags & (ipatch_dls2_reader->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(ipatch_dls2_reader_mutex); return(retval); } /** * ags_ipatch_dls2_reader_set_flags: * @ipatch_dls2_reader: the #AgsIpatchDLS2Reader * @flags: see #AgsIpatchDLS2ReaderFlags-enum * * Enable a feature of @ipatch_dls2_reader. * * Since: 3.0.0 */ void ags_ipatch_dls2_reader_set_flags(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint flags) { GRecMutex *ipatch_dls2_reader_mutex; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return; } /* get ipatch_dls2_reader mutex */ ipatch_dls2_reader_mutex = AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(ipatch_dls2_reader); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(ipatch_dls2_reader_mutex); ipatch_dls2_reader->flags |= flags; g_rec_mutex_unlock(ipatch_dls2_reader_mutex); } /** * ags_ipatch_dls2_reader_unset_flags: * @ipatch_dls2_reader: the #AgsIpatchDLS2Reader * @flags: see #AgsIpatchDLS2ReaderFlags-enum * * Disable a feature of @ipatch_dls2_reader. * * Since: 3.0.0 */ void ags_ipatch_dls2_reader_unset_flags(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint flags) { GRecMutex *ipatch_dls2_reader_mutex; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return; } /* get ipatch_dls2_reader mutex */ ipatch_dls2_reader_mutex = AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(ipatch_dls2_reader); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(ipatch_dls2_reader_mutex); ipatch_dls2_reader->flags &= (~flags); g_rec_mutex_unlock(ipatch_dls2_reader_mutex); } gboolean ags_ipatch_dls2_reader_load(AgsIpatchDLS2Reader *ipatch_dls2_reader, IpatchFileHandle *handle) { if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(FALSE); } ipatch_dls2_reader->reader = ipatch_dls_reader_new(handle); ipatch_dls2_reader->error = NULL; ipatch_dls2_reader->base = (IpatchBase *) ipatch_dls_reader_load(ipatch_dls2_reader->reader, &(ipatch_dls2_reader->error)); if(ipatch_dls2_reader->error != NULL){ g_warning("%s", ipatch_dls2_reader->error->message); return(FALSE); } ipatch_dls2_reader->error = NULL; ipatch_dls2_reader->dls2 = (IpatchDLS2 *) ipatch_convert_object_to_type((GObject *) handle->file, IPATCH_TYPE_DLS2, &(ipatch_dls2_reader->error)); if(ipatch_dls2_reader->error != NULL){ g_warning("%s", ipatch_dls2_reader->error->message); return(FALSE); } while(g_static_rec_mutex_unlock_full(((IpatchItem *) (ipatch_dls2_reader->base))->mutex) != 0); return(TRUE); } gboolean ags_ipatch_dls2_reader_select_instrument(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint instrument_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchDLS2 *dls2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter; #endif gboolean success; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH dls2 = ipatch_dls2_reader->dls2; ipatch_list = ipatch_container_get_children((IpatchContainer *) dls2, IPATCH_TYPE_DLS2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); if(instrument_index < ipatch_iter_count(&instrument_iter)){ int bank, program; success = TRUE; ipatch_iter_index(&instrument_iter, instrument_index); ipatch_item = (IpatchItem *) ipatch_dls2_inst_get_regions(ipatch_iter_get(&instrument_iter)); /* selected index and name */ ipatch_dls2_reader->index_selected[AGS_DLS2_IHDR] = instrument_index; ipatch_dls2_reader->index_selected[AGS_DLS2_SHDR] = 0; g_free(ipatch_dls2_reader->name_selected[AGS_DLS2_IHDR]); ipatch_dls2_inst_get_midi_locale((IpatchDLS2Inst *) ipatch_item, &bank, &program); ipatch_dls2_reader->name_selected[AGS_DLS2_IHDR] = g_strdup_printf("bank=%d; program=%d;", bank, program); g_free(ipatch_dls2_reader->name_selected[AGS_DLS2_SHDR]); ipatch_dls2_reader->name_selected[AGS_DLS2_SHDR] = NULL; /* container */ ipatch_dls2_reader->instrument = (IpatchContainer *) ipatch_item; ipatch_dls2_reader->sample = NULL; } } #endif return(success); } gboolean ags_ipatch_dls2_reader_select_sample(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint sample_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchDLS2 *dls2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif gboolean success; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH dls2 = ipatch_dls2_reader->dls2; ipatch_list = ipatch_dls2_inst_get_regions(ipatch_dls2_reader->instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); if(sample_index < ipatch_iter_count(&sample_iter)){ success = TRUE; ipatch_iter_index(&sample_iter, sample_index); ipatch_item = (IpatchItem *) ipatch_dls2_region_get_sample(ipatch_iter_get(&sample_iter)); /* selected index and name */ ipatch_dls2_reader->index_selected[AGS_DLS2_SHDR] = sample_index; g_free(ipatch_dls2_reader->name_selected[AGS_DLS2_SHDR]); if(IPATCH_DLS2_SAMPLE(ipatch_item)->dlid != NULL){ ipatch_dls2_reader->name_selected[AGS_DLS2_SHDR] = g_strdup_printf("id=0x%x%x", IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[1], IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[0]); }else{ ipatch_dls2_reader->name_selected[AGS_DLS2_SHDR] = g_strdup("(null)"); } /* container */ ipatch_dls2_reader->sample = (IpatchContainer *) ipatch_item; } } #endif return(success); } /** * ags_ipatch_dls2_reader_get_instrument_all: * @ipatch_dls2_reader: the #AgsIpatchDLS2Reader * * Get instrument all. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing instrument * * Since: 3.0.0 */ gchar** ags_ipatch_dls2_reader_get_instrument_all(AgsIpatchDLS2Reader *ipatch_dls2_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchDLS2 *dls2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter; #endif gchar **instrument; guint i, i_stop; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(NULL); } instrument = NULL; #ifdef AGS_WITH_LIBINSTPATCH dls2 = ipatch_dls2_reader->dls2; ipatch_list = ipatch_container_get_children((IpatchContainer *) dls2, IPATCH_TYPE_DLS2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); i_stop = ipatch_iter_count(&instrument_iter); if(i_stop > 0){ instrument = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&instrument_iter); for(i = 0; i < i_stop; i++){ int bank, program; ipatch_item = ipatch_iter_get(&instrument_iter); ipatch_dls2_inst_get_midi_locale((IpatchDLS2Inst *) ipatch_item, &bank, &program); instrument[i] = g_strdup_printf("bank=%d; program=%d;", bank, program); /* iterate */ ipatch_iter_next(&instrument_iter); } instrument[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (dls2))->mutex) != 0); #endif return(instrument); } /** * ags_ipatch_dls2_reader_get_sample_all: * @ipatch_dls2_reader: the #AgsIpatchDLS2Reader * * Get sample all. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing sample * * Since: 3.0.0 */ gchar** ags_ipatch_dls2_reader_get_sample_all(AgsIpatchDLS2Reader *ipatch_dls2_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchDLS2 *dls2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif gchar **sample; guint i, i_stop; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(NULL); } sample = NULL; #ifdef AGS_WITH_LIBINSTPATCH dls2 = ipatch_dls2_reader->dls2; ipatch_list = ipatch_container_get_children((IpatchContainer *) dls2, IPATCH_TYPE_DLS2_SAMPLE); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); i_stop = ipatch_iter_count(&sample_iter); if(i_stop > 0){ sample = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&sample_iter); for(i = 0; i < i_stop; i++){ ipatch_item = ipatch_iter_get(&sample_iter); if(IPATCH_DLS2_SAMPLE(ipatch_item)->dlid != NULL){ sample[i] = g_strdup_printf("id=0x%x%x", IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[1], IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[0]); }else{ sample[i] = g_strdup("(null)"); } /* iterate */ ipatch_iter_next(&sample_iter); } sample[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (dls2))->mutex) != 0); #endif return(sample); } /** * ags_ipatch_dls2_reader_get_sample_by_instrument_index: * @ipatch_dls2_reader: the #AgsIpatchDLS2Reader * @instrument_index: the instrument index * * Get sample by instrument index. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing sample * * Since: 3.0.0 */ gchar** ags_ipatch_dls2_reader_get_sample_by_instrument_index(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint instrument_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchDLS2 *dls2; IpatchContainer *instrument; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter, sample_iter; #endif gchar **sample; guint i, i_stop; guint j, j_stop; guint count; if(!AGS_IS_IPATCH_DLS2_READER(ipatch_dls2_reader)){ return(NULL); } sample = NULL; #ifdef AGS_WITH_LIBINSTPATCH dls2 = ipatch_dls2_reader->dls2; /* instruments */ ipatch_list = ipatch_container_get_children((IpatchContainer *) dls2, IPATCH_TYPE_DLS2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); i_stop = ipatch_iter_count(&instrument_iter); if(i_stop > 0 && instrument_index < i_stop){ ipatch_iter_index(&instrument_iter, instrument_index); instrument = ipatch_iter_get(&instrument_iter); /* samples */ ipatch_list = ipatch_dls2_inst_get_regions(instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); j_stop = ipatch_iter_count(&sample_iter); if(j_stop > 0){ sample = (gchar **) malloc((j_stop + 1) * sizeof(gchar *)); for(j = 0, count = 0; j < j_stop; j++){ ipatch_item = (IpatchItem *) ipatch_dls2_region_get_sample(ipatch_iter_get(&sample_iter)); if(IPATCH_DLS2_SAMPLE(ipatch_item)->dlid != NULL){ sample[count] = g_strdup_printf("id=0x%x%x", IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[1], IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[0]); }else{ sample[count] = g_strdup("(null)"); } /* iterate */ ipatch_iter_next(&sample_iter); count++; } sample[count] = NULL; } } } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (dls2))->mutex) != 0); #endif return(sample); } /** * ags_ipatch_dls2_reader_new: * @ipatch: the #AgsIpatch * * Creates an #AgsIpatchDLS2Reader. * * Returns: an empty #AgsIpatchDLS2Reader. * * Since: 3.0.0 */ AgsIpatchDLS2Reader* ags_ipatch_dls2_reader_new(AgsIpatch *ipatch) { AgsIpatchDLS2Reader *ipatch_dls2_reader; ipatch_dls2_reader = (AgsIpatchDLS2Reader *) g_object_new(AGS_TYPE_IPATCH_DLS2_READER, "ipatch", ipatch, NULL); return(ipatch_dls2_reader); } gsequencer-3.1.3/ags/audio/file/ags_audio_file.c0000644000175000017500000011367613613101164016502 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_audio_file_class_init(AgsAudioFileClass *audio_file); void ags_audio_file_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_file_init(AgsAudioFile *audio_file); void ags_audio_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_file_finalize(GObject *object); AgsUUID* ags_audio_file_get_uuid(AgsConnectable *connectable); gboolean ags_audio_file_has_resource(AgsConnectable *connectable); gboolean ags_audio_file_is_ready(AgsConnectable *connectable); void ags_audio_file_add_to_registry(AgsConnectable *connectable); void ags_audio_file_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_file_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_file_xml_compose(AgsConnectable *connectable); void ags_audio_file_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_file_is_connected(AgsConnectable *connectable); void ags_audio_file_connect(AgsConnectable *connectable); void ags_audio_file_disconnect(AgsConnectable *connectable); enum{ PROP_0, PROP_SOUNDCARD, PROP_FILENAME, PROP_FILE_AUDIO_CHANNELS, PROP_FILE_SAMPLERATE, PROP_FILE_FRAME_COUNT, PROP_AUDIO_CHANNEL, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_AUDIO_SIGNAL, PROP_WAVE, }; enum{ READ_BUFFER, LAST_SIGNAL, }; /** * SECTION:ags_audio_file * @short_description: Audio file input/output * @title: AgsAudioFile * @section_id: * @include: ags/audio/file/ags_audio_file.h * * #AgsAudioFile is the base object to read/write audio data. */ static gpointer ags_audio_file_parent_class = NULL; static guint signals[LAST_SIGNAL]; GType ags_audio_file_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_file = 0; static const GTypeInfo ags_audio_file_info = { sizeof (AgsAudioFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_file_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_file_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_file = g_type_register_static(G_TYPE_OBJECT, "AgsAudioFile", &ags_audio_file_info, 0); g_type_add_interface_static(ags_type_audio_file, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_file); } return g_define_type_id__volatile; } void ags_audio_file_class_init(AgsAudioFileClass *audio_file) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_file_parent_class = g_type_class_peek_parent(audio_file); gobject = (GObjectClass *) audio_file; gobject->set_property = ags_audio_file_set_property; gobject->get_property = ags_audio_file_get_property; gobject->finalize = ags_audio_file_finalize; /* properties */ /** * AgsAudioFile:soundcard: * * The assigned soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of audio file"), i18n_pspec("The soundcard what audio file has it's presets"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsAudioFile:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename of audio file"), i18n_pspec("The filename of audio file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsAudioFile:file-audio-channels: * * The audio channel count of this file. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("file-audio-channels", i18n_pspec("file audio channels"), i18n_pspec("The audio channel count of the file"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_AUDIO_CHANNELS, param_spec); /** * AgsAudioFile:file-samplerate: * * The samplerate of this file. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("file-samplerate", i18n_pspec("file samplerate"), i18n_pspec("The samplerate of the file"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_SAMPLERATE, param_spec); /** * AgsAudioFile:file-frame_count: * * The frame count of this file. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("file-frame-count", i18n_pspec("file frame count"), i18n_pspec("The frame count of the file"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_FRAME_COUNT, param_spec); /** * AgsAudioFile:audio-channel: * * The audio channel to be read. * * Since: 3.0.0 */ param_spec = g_param_spec_int("audio-channel", i18n_pspec("read audio channel"), i18n_pspec("The audio channel to be read"), -1, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsAudioFile:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsAudioFile:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsAudioFile:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsAudioFile:audio-signal: (type GList(AgsAudioSignal)) (transfer full) * * The containing #AgsAudioSignal. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("audio-signal", i18n_pspec("containing audio signal"), i18n_pspec("The audio signal it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL, param_spec); /** * AgsAudioFile:wave: (type GList(AgsWave)) (transfer full) * * The containing #AgsWave. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("wave", i18n_pspec("containing wave"), i18n_pspec("The wave it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE, param_spec); } void ags_audio_file_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_file_get_uuid; connectable->has_resource = ags_audio_file_has_resource; connectable->is_ready = ags_audio_file_is_ready; connectable->add_to_registry = ags_audio_file_add_to_registry; connectable->remove_from_registry = ags_audio_file_remove_from_registry; connectable->list_resource = ags_audio_file_list_resource; connectable->xml_compose = ags_audio_file_xml_compose; connectable->xml_parse = ags_audio_file_xml_parse; connectable->is_connected = ags_audio_file_is_connected; connectable->connect = ags_audio_file_connect; connectable->disconnect = ags_audio_file_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_file_init(AgsAudioFile *audio_file) { AgsConfig *config; audio_file->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(audio_file->obj_mutex)); /* uuid */ audio_file->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_file->uuid); audio_file->soundcard = NULL; audio_file->filename = NULL; audio_file->file_audio_channels = 0; audio_file->file_samplerate = 0; audio_file->file_frame_count = 0; config = ags_config_get_instance(); audio_file->samplerate = ags_soundcard_helper_config_get_samplerate(config); audio_file->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); audio_file->format = ags_soundcard_helper_config_get_format(config); audio_file->audio_channel = -1; audio_file->sound_resource = NULL; audio_file->audio_signal = NULL; audio_file->wave = NULL; } void ags_audio_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioFile *audio_file; GRecMutex *audio_file_mutex; audio_file = AGS_AUDIO_FILE(gobject); /* get audio file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(audio_file_mutex); if(soundcard == ((GObject *) audio_file->soundcard)){ g_rec_mutex_unlock(audio_file_mutex); return; } if(audio_file->soundcard != NULL){ g_object_unref(audio_file->soundcard); } if(soundcard != NULL){ g_object_ref(G_OBJECT(soundcard)); } audio_file->soundcard = (GObject *) soundcard; g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = (gchar *) g_value_get_string(value); g_rec_mutex_lock(audio_file_mutex); if(audio_file->filename == filename){ g_rec_mutex_unlock(audio_file_mutex); return; } if(audio_file->filename != NULL){ g_free(audio_file->filename); } audio_file->filename = g_strdup(filename); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILE_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_file_mutex); audio_file->file_audio_channels = g_value_get_uint(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILE_SAMPLERATE: { g_rec_mutex_lock(audio_file_mutex); audio_file->file_samplerate = g_value_get_uint(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILE_FRAME_COUNT: { g_rec_mutex_lock(audio_file_mutex); audio_file->file_frame_count = g_value_get_uint(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_file_mutex); audio_file->samplerate = g_value_get_uint(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_file_mutex); audio_file->buffer_size = g_value_get_uint(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_file_mutex); audio_file->format = g_value_get_uint(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(audio_file_mutex); audio_file->audio_channel = g_value_get_int(value); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_AUDIO_SIGNAL: { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) g_value_get_pointer(value); g_rec_mutex_lock(audio_file_mutex); if(audio_signal == NULL || g_list_find(audio_file->audio_signal, audio_signal) != NULL){ g_rec_mutex_unlock(audio_file_mutex); return; } g_rec_mutex_unlock(audio_file_mutex); ags_audio_file_add_audio_signal(audio_file, (GObject *) audio_signal); } break; case PROP_WAVE: { AgsWave *wave; wave = (AgsWave *) g_value_get_pointer(value); g_rec_mutex_lock(audio_file_mutex); if(wave == NULL || g_list_find(audio_file->wave, wave) != NULL){ g_rec_mutex_unlock(audio_file_mutex); return; } g_rec_mutex_unlock(audio_file_mutex); ags_audio_file_add_wave(audio_file, (GObject *) wave); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioFile *audio_file; GRecMutex *audio_file_mutex; audio_file = AGS_AUDIO_FILE(gobject); /* get audio file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); switch(prop_id){ case PROP_SOUNDCARD: { g_rec_mutex_lock(audio_file_mutex); g_value_set_object(value, audio_file->soundcard); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(audio_file_mutex); g_value_set_string(value, audio_file->filename); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILE_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_file_mutex); g_value_set_uint(value, audio_file->file_audio_channels); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILE_SAMPLERATE: { g_rec_mutex_lock(audio_file_mutex); g_value_set_uint(value, audio_file->file_samplerate); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FILE_FRAME_COUNT: { g_rec_mutex_lock(audio_file_mutex); g_value_set_uint(value, audio_file->file_frame_count); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_file_mutex); g_value_set_uint(value, audio_file->samplerate); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_file_mutex); g_value_set_uint(value, audio_file->buffer_size); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_file_mutex); g_value_set_uint(value, audio_file->format); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(audio_file_mutex); g_value_set_int(value, audio_file->audio_channel); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_AUDIO_SIGNAL: { g_rec_mutex_lock(audio_file_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_file->audio_signal, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_file_mutex); } break; case PROP_WAVE: { g_rec_mutex_lock(audio_file_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_file->wave, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_file_finalize(GObject *gobject) { AgsAudioFile *audio_file; audio_file = AGS_AUDIO_FILE(gobject); /* sound resource */ if(audio_file->sound_resource != NULL){ g_object_unref(audio_file->sound_resource); } /* AgsAudioSignal */ g_list_free_full(audio_file->audio_signal, g_object_unref); /* AgsWave */ g_list_free_full(audio_file->wave, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_audio_file_parent_class)->finalize(gobject); } AgsUUID* ags_audio_file_get_uuid(AgsConnectable *connectable) { AgsAudioFile *audio_file; AgsUUID *ptr; GRecMutex *audio_file_mutex; audio_file = AGS_AUDIO_FILE(connectable); /* get audio file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get UUID */ g_rec_mutex_lock(audio_file_mutex); ptr = audio_file->uuid; g_rec_mutex_unlock(audio_file_mutex); return(ptr); } gboolean ags_audio_file_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_audio_file_is_ready(AgsConnectable *connectable) { AgsAudioFile *audio_file; gboolean is_ready; audio_file = AGS_AUDIO_FILE(connectable); /* check is ready */ is_ready = ags_audio_file_test_flags(audio_file, AGS_AUDIO_FILE_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_file_add_to_registry(AgsConnectable *connectable) { AgsAudioFile *audio_file; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } audio_file = AGS_AUDIO_FILE(connectable); ags_audio_file_set_flags(audio_file, AGS_AUDIO_FILE_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) audio_file); ags_registry_add_entry(registry, entry); } } void ags_audio_file_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_audio_file_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_file_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_file_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_file_is_connected(AgsConnectable *connectable) { AgsAudioFile *audio_file; gboolean is_connected; audio_file = AGS_AUDIO_FILE(connectable); /* check is connected */ is_connected = ags_audio_file_test_flags(audio_file, AGS_AUDIO_FILE_CONNECTED); return(is_connected); } void ags_audio_file_connect(AgsConnectable *connectable) { AgsAudioFile *audio_file; if(ags_connectable_is_connected(connectable)){ return; } audio_file = AGS_AUDIO_FILE(connectable); ags_audio_file_set_flags(audio_file, AGS_AUDIO_FILE_CONNECTED); } void ags_audio_file_disconnect(AgsConnectable *connectable) { AgsAudioFile *audio_file; if(!ags_connectable_is_connected(connectable)){ return; } audio_file = AGS_AUDIO_FILE(connectable); ags_audio_file_unset_flags(audio_file, AGS_AUDIO_FILE_CONNECTED); } /** * ags_audio_file_test_flags: * @audio_file: the #AgsAudioFile * @flags: the flags * * Test @flags to be set on @audio_file. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_file_test_flags(AgsAudioFile *audio_file, guint flags) { gboolean retval; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return(FALSE); } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* test */ g_rec_mutex_lock(audio_file_mutex); retval = (flags & (audio_file->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_file_mutex); return(retval); } /** * ags_audio_file_set_flags: * @audio_file: the #AgsAudioFile * @flags: see #AgsAudioFileFlags-enum * * Enable a feature of @audio_file. * * Since: 3.0.0 */ void ags_audio_file_set_flags(AgsAudioFile *audio_file, guint flags) { GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_file_mutex); audio_file->flags |= flags; g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_unset_flags: * @audio_file: the #AgsAudioFile * @flags: see #AgsAudioFileFlags-enum * * Disable a feature of @audio_file. * * Since: 3.0.0 */ void ags_audio_file_unset_flags(AgsAudioFile *audio_file, guint flags) { GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_file_mutex); audio_file->flags &= (~flags); g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_check_suffix: * @filename: the filename * * Check suffix. * * Returns: %TRUE if suffix supported, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_file_check_suffix(gchar *filename) { if(g_str_has_suffix(filename, ".wav") || g_str_has_suffix(filename, ".ogg") || g_str_has_suffix(filename, ".flac") || g_str_has_suffix(filename, ".aiff")){ return(TRUE); } return(FALSE); } /** * ags_audio_file_add_audio_signal: * @audio_file: the #AgsAudioFile * @audio_signal: the #AgsAudioSignal * * Add @audio_signal to @audio_file. * * Since: 3.0.0 */ void ags_audio_file_add_audio_signal(AgsAudioFile *audio_file, GObject *audio_signal) { GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file) || !AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* */ g_rec_mutex_lock(audio_file_mutex); if(g_list_find(audio_file->audio_signal, audio_signal) == NULL){ g_object_ref(audio_signal); audio_file->audio_signal = g_list_prepend(audio_file->audio_signal, audio_signal); } g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_remove_audio_signal: * @audio_file: the #AgsAudioFile * @audio_signal: the #AgsAudioSignal * * Remove @audio_signal from @audio_file. * * Since: 3.0.0 */ void ags_audio_file_remove_audio_signal(AgsAudioFile *audio_file, GObject *audio_signal) { GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file) || !AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* */ g_rec_mutex_lock(audio_file_mutex); if(g_list_find(audio_file->audio_signal, audio_signal) != NULL){ audio_file->audio_signal = g_list_prepend(audio_file->audio_signal, audio_signal); g_object_unref(audio_signal); } g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_add_wave: * @audio_file: the #AgsAudioFile * @wave: the #AgsWave * * Add @wave to @audio_file. * * Since: 3.0.0 */ void ags_audio_file_add_wave(AgsAudioFile *audio_file, GObject *wave) { GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file) || !AGS_IS_WAVE(wave)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* */ g_rec_mutex_lock(audio_file_mutex); if(g_list_find(audio_file->wave, wave) == NULL){ g_object_ref(wave); audio_file->wave = g_list_prepend(audio_file->wave, wave); } g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_remove_wave: * @audio_file: the #AgsAudioFile * @wave: the #AgsWave * * Remove @wave from @audio_file. * * Since: 3.0.0 */ void ags_audio_file_remove_wave(AgsAudioFile *audio_file, GObject *wave) { GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file) || !AGS_IS_WAVE(wave)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* */ g_rec_mutex_lock(audio_file_mutex); if(g_list_find(audio_file->wave, wave) != NULL){ audio_file->wave = g_list_prepend(audio_file->wave, wave); g_object_unref(wave); } g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_open: * @audio_file: the #AgsAudioFile * * Open the #AgsAudioFile in read mode. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audio_file_open(AgsAudioFile *audio_file) { GObject *sound_resource; gchar *filename; guint file_audio_channels; guint file_samplerate; guint file_frame_count; gboolean retval; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return(FALSE); } #ifdef AGS_DEBUG g_message("ags_audio_file_open: %s", audio_file->filename); #endif /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); sound_resource = NULL; g_object_get(audio_file, "filename", &filename, NULL); retval = FALSE; if(g_file_test(filename, G_FILE_TEST_EXISTS)){ if(ags_audio_file_check_suffix(filename)){ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource = (GObject *) ags_sndfile_new(); g_object_ref(audio_file->sound_resource); g_rec_mutex_unlock(audio_file_mutex); if(ags_sound_resource_open(AGS_SOUND_RESOURCE(sound_resource), filename)){ //FIXME:JK: this call should occure just before reading frames because of the new iterate functions of an AgsPlayable ags_sound_resource_info(AGS_SOUND_RESOURCE(sound_resource), &file_frame_count, NULL, NULL); g_object_set(audio_file, "file-frame-count", file_frame_count, NULL); ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(sound_resource), &file_audio_channels, &file_samplerate, NULL, NULL); g_object_set(audio_file, "file-audio-channels", file_audio_channels, "file-samplerate", file_samplerate, NULL); retval = TRUE; } }else{ g_message("ags_audio_file_open: unknown file type\n"); } } g_free(filename); return(retval); } /** * ags_audio_file_rw_open: * @audio_file: the #AgsAudioFile * @create: create the file * * Open the #AgsAudioFile in read/write mode. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audio_file_rw_open(AgsAudioFile *audio_file, gboolean create) { GObject *sound_resource; gchar *filename; guint file_audio_channels; guint file_samplerate; gboolean retval; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return(FALSE); } #ifdef AGS_DEBUG g_message("ags_audio_file_rw_open: %s", audio_file->filename); #endif /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); sound_resource = NULL; g_object_get(audio_file, "filename", &filename, "file-audio-channels", &file_audio_channels, "file-samplerate", &file_samplerate, NULL); if(!create && !g_file_test(filename, G_FILE_TEST_EXISTS)){ g_free(filename); return(FALSE); } retval = FALSE; if(ags_audio_file_check_suffix(audio_file->filename)){ GError *error; guint loop_start, loop_end; /* sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource = (GObject *) ags_sndfile_new(); g_object_ref(audio_file->sound_resource); g_rec_mutex_unlock(audio_file_mutex); if(ags_sound_resource_rw_open(AGS_SOUND_RESOURCE(sound_resource), filename, file_audio_channels, file_samplerate, create)){ retval = TRUE; } }else{ g_message("ags_audio_file_open: unknown file type\n"); } g_free(filename); return(retval); } /** * ags_audio_file_open_from_data: * @audio_file: the #AgsAudioFile * @data: the audio data * * Open #AgsAudioFile using virtual functions. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audio_file_open_from_data(AgsAudioFile *audio_file, gchar *data) { GObject *sound_resource; gchar *filename; guint file_audio_channels; guint file_samplerate; guint file_frame_count; gboolean retval; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return(FALSE); } #ifdef AGS_DEBUG g_message("ags_audio_file_open_from_data:"); #endif /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); sound_resource = NULL; g_object_get(audio_file, "filename", &filename, NULL); retval = FALSE; if(data != NULL){ if(ags_audio_file_check_suffix(audio_file->filename)){ guint loop_start, loop_end; GError *error; g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource = (GObject *) ags_sndfile_new(); g_object_ref(audio_file->sound_resource); g_rec_mutex_unlock(audio_file_mutex); //TODO:JK: thread-safe way AGS_SNDFILE(audio_file->sound_resource)->flags = AGS_SNDFILE_VIRTUAL; if(ags_sound_resource_open(AGS_SOUND_RESOURCE(sound_resource), filename)){ AGS_SNDFILE(sound_resource)->pointer = g_base64_decode(data, &(AGS_SNDFILE(sound_resource)->length)); AGS_SNDFILE(sound_resource)->current = AGS_SNDFILE(audio_file->sound_resource)->pointer; ags_sound_resource_info(AGS_SOUND_RESOURCE(sound_resource), &file_frame_count, NULL, NULL); g_object_set(audio_file, "file-frame-count", file_frame_count, NULL); ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(sound_resource), &file_audio_channels, &file_samplerate, NULL, NULL); g_object_set(audio_file, "file-audio-channels", file_audio_channels, "file-samplerate", file_samplerate, NULL); retval = TRUE; } }else{ g_message("ags_audio_file_open: unknown file type\n"); } } g_free(filename); return(retval); } /** * ags_audio_file_close: * @audio_file: the #AgsAudioFile * * Close the #AgsAudioFile. * * Since: 3.0.0 */ void ags_audio_file_close(AgsAudioFile *audio_file) { GObject *sound_resource; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; g_rec_mutex_unlock(audio_file_mutex); /* close */ ags_sound_resource_close(AGS_SOUND_RESOURCE(sound_resource)); } /** * ags_audio_file_read: * @audio_file: the #AgsAudioFile * @audio_channel: nth channel * @format: the format * @error: returned error * * Read audio buffer. * * Since: 3.0.0 */ void* ags_audio_file_read(AgsAudioFile *audio_file, guint audio_channel, guint format, GError **error) { GObject *sound_resource; void *buffer; guint file_frame_count; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return(NULL); } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; file_frame_count = audio_file->file_frame_count; g_rec_mutex_unlock(audio_file_mutex); /* read */ buffer = ags_stream_alloc(file_frame_count, format); ags_sound_resource_read(AGS_SOUND_RESOURCE(sound_resource), buffer, 1, audio_channel, file_frame_count, format); return(buffer); } /** * ags_audio_file_read_audio_signal: * @audio_file: the #AgsAudioFile * * Convert the #AgsAudioFile to a #GList-struct of #AgsAudioSignal. * * Since: 3.0.0 */ void ags_audio_file_read_audio_signal(AgsAudioFile *audio_file) { GObject *sound_resource; GObject *soundcard; GList *list; guint audio_channel; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; soundcard = audio_file->soundcard; audio_channel = audio_file->audio_channel; g_rec_mutex_unlock(audio_file_mutex); /* read audio signal */ list = ags_sound_resource_read_audio_signal(AGS_SOUND_RESOURCE(sound_resource), soundcard, audio_channel); /* set audio signal */ g_rec_mutex_lock(audio_file_mutex); audio_file->audio_signal = list; g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_read_wave: * @audio_file: the #AgsAudioFile * @x_offset: the x offset * @delay: the delay * @attack: the attack * * Convert the #AgsAudioFile to a #GList-struct of buffers. * * Since: 3.0.0 */ void ags_audio_file_read_wave(AgsAudioFile *audio_file, guint64 x_offset, gdouble delay, guint attack) { GObject *sound_resource; GObject *soundcard; GList *list; guint audio_channel; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; soundcard = audio_file->soundcard; audio_channel = audio_file->audio_channel; g_rec_mutex_unlock(audio_file_mutex); /* read wave */ list = ags_sound_resource_read_wave(AGS_SOUND_RESOURCE(sound_resource), soundcard, audio_channel, x_offset, delay, attack); /* set wave */ g_rec_mutex_lock(audio_file_mutex); audio_file->wave = list; g_rec_mutex_unlock(audio_file_mutex); } /** * ags_audio_file_seek: * @audio_file: the #AgsAudioFile * @frames: number of frames to seek * @whence: SEEK_SET, SEEK_CUR, or SEEK_END * * Position the #AgsAudioFile's internal data address. * * Since: 3.0.0 */ void ags_audio_file_seek(AgsAudioFile *audio_file, guint frames, gint whence) { GObject *sound_resource; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; g_rec_mutex_unlock(audio_file_mutex); /* seek */ ags_sound_resource_seek(AGS_SOUND_RESOURCE(sound_resource), frames, whence); } /** * ags_audio_file_write: * @audio_file: the #AgsAudioFile * @buffer: the audio data * @buffer_size: the count of frames to write * @format: the format * * Write the buffer to #AgsAudioFile. * * Since: 3.0.0 */ void ags_audio_file_write(AgsAudioFile *audio_file, void *buffer, guint buffer_size, guint format) { GObject *sound_resource; guint file_audio_channels; gint audio_channel; guint i; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file) || buffer == NULL){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; file_audio_channels = audio_file->file_audio_channels; audio_channel = audio_file->audio_channel; g_rec_mutex_unlock(audio_file_mutex); if(audio_channel == -1){ for(i = 0; i < file_audio_channels; i++){ ags_sound_resource_write(AGS_SOUND_RESOURCE(sound_resource), buffer, file_audio_channels, i, buffer_size, format); } }else{ ags_sound_resource_write(AGS_SOUND_RESOURCE(sound_resource), buffer, 1, audio_channel, buffer_size, format); } } /** * ags_audio_file_flush: * @audio_file: the #AgsAudioFile * * Flushes the #AgsAudioFile's internal buffer. * * Since: 3.0.0 */ void ags_audio_file_flush(AgsAudioFile *audio_file) { GObject *sound_resource; GRecMutex *audio_file_mutex; if(!AGS_IS_AUDIO_FILE(audio_file)){ return; } /* get audio_file mutex */ audio_file_mutex = AGS_AUDIO_FILE_GET_OBJ_MUTEX(audio_file); /* get sound resource */ g_rec_mutex_lock(audio_file_mutex); sound_resource = audio_file->sound_resource; g_rec_mutex_unlock(audio_file_mutex); /* flush */ ags_sound_resource_flush(AGS_SOUND_RESOURCE(sound_resource)); } /** * ags_audio_file_new: * @filename: the filename * @soundcard: defaults of #AgsSoundcard * @audio_channel: the audio channel to read * * Create a new instance of #AgsAudioFile. * * Returns: the new #AgsAudioFile. * * Since: 3.0.0 */ AgsAudioFile* ags_audio_file_new(gchar *filename, GObject *soundcard, gint audio_channel) { AgsAudioFile *audio_file; audio_file = (AgsAudioFile *) g_object_new(AGS_TYPE_AUDIO_FILE, "filename", filename, "soundcard", soundcard, "audio-channel", audio_channel, NULL); return(audio_file); } gsequencer-3.1.3/ags/audio/file/ags_sfz_file.h0000644000175000017500000000706613607210263016207 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SFZ_FILE_H__ #define __AGS_SFZ_FILE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SFZ_FILE (ags_sfz_file_get_type()) #define AGS_SFZ_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SFZ_FILE, AgsSFZFile)) #define AGS_SFZ_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SFZ_FILE, AgsSFZFileClass)) #define AGS_IS_SFZ_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SFZ_FILE)) #define AGS_IS_SFZ_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SFZ_FILE)) #define AGS_SFZ_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SFZ_FILE, AgsSFZFileClass)) #define AGS_SFZ_FILE_GET_OBJ_MUTEX(obj) (&(((AgsSFZFile *) obj)->obj_mutex)) #define AGS_SFZ_FILE_DEFAULT_CHANNELS (2) #define AGS_SFZ_FILE_LOOP_MAX (4294967296) #define AGS_SFZ_FILE_READ "r" #define AGS_SFZ_FILE_WRITE "w" typedef struct _AgsSFZFile AgsSFZFile; typedef struct _AgsSFZFileClass AgsSFZFileClass; /** * AgsSFZFileFlags: * @AGS_SFZ_FILE_ADDED_TO_REGISTRY: the sfz_file was added to registry, see #AgsConnectable::add_to_registry() * @AGS_SFZ_FILE_CONNECTED: indicates the sfz_file was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsSFZFile by * enable/disable as flags. */ typedef enum{ AGS_SFZ_FILE_ADDED_TO_REGISTRY = 1, AGS_SFZ_FILE_CONNECTED = 1 << 1, }AgsSFZFileFlags; /** * AgsSFZLevel: * @AGS_SFZ_LEVEL_FILENAME: filename * @AGS_SFZ_LEVEL_SAMPLE: sample * * Enum values to describe the different levels of a SFZ file. */ typedef enum{ AGS_SFZ_LEVEL_FILENAME = 0, AGS_SFZ_LEVEL_SAMPLE = 1, }AgsSFZLevel; struct _AgsSFZFile { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *soundcard; char *filename; char *mode; FILE *file; guint nesting_level; gchar *level_id; guint level_index; GObject *reader; GObject *writer; GList *group; GList *region; GList *sample; guint *index_selected; gchar **name_selected; gpointer current_sample; GList *audio_signal; }; struct _AgsSFZFileClass { GObjectClass gobject; }; GType ags_sfz_file_get_type(); gboolean ags_sfz_file_test_flags(AgsSFZFile *sfz_file, guint flags); void ags_sfz_file_set_flags(AgsSFZFile *sfz_file, guint flags); void ags_sfz_file_unset_flags(AgsSFZFile *sfz_file, guint flags); gboolean ags_sfz_file_select_sample(AgsSFZFile *sfz_file, guint sample_index); void ags_sfz_file_get_range(AgsSFZFile *sfz_file, glong *hikey, glong *lokey); gboolean ags_sfz_file_check_suffix(gchar *filename); void ags_sfz_file_parse(AgsSFZFile *sfz_file); AgsSFZFile* ags_sfz_file_new(); G_END_DECLS #endif /*__AGS_SFZ_FILE_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sound_resource.c0000644000175000017500000005254213607210263017437 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_sound_resource_base_init(AgsSoundResourceInterface *ginterface); /** * SECTION:ags_sound_resource * @short_description: read/write audio * @title: AgsSoundResource * @section_id: * @include: ags/audio/file/ags_sound_resource.h * * The #AgsSoundResource interface gives you a unique access to file related * IO operations. */ GType ags_sound_resource_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sound_resource = 0; static const GTypeInfo ags_sound_resource_info = { sizeof(AgsSoundResourceInterface), (GBaseInitFunc) ags_sound_resource_base_init, NULL, /* base_finalize */ }; ags_type_sound_resource = g_type_register_static(G_TYPE_INTERFACE, "AgsSoundResource", &ags_sound_resource_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sound_resource); } return g_define_type_id__volatile; } void ags_sound_resource_base_init(AgsSoundResourceInterface *ginterface) { /* empty */ } /** * ags_sound_resource_open: * @sound_resource: the #AgsSoundResource * @filename: the filename as string * * Open @sound_resource for reading and assign filename. * * Returns: %TRUE if operation was successful, otherwise %FALSE. * * Since: 3.0.0 */ gboolean ags_sound_resource_open(AgsSoundResource *sound_resource, gchar *filename) { AgsSoundResourceInterface *sound_resource_interface; gboolean retval; g_return_val_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource), FALSE); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_val_if_fail(sound_resource_interface->open, FALSE); retval = sound_resource_interface->open(sound_resource, filename); return(retval); } /** * ags_sound_resource_rw_open: * @sound_resource: the #AgsSoundResource * @filename: the filename as string * @audio_channels: the audio channels count * @samplerate: the samplerate * @create: if %TRUE create file, otherwise don't * * Open @sound_resource for reading/writing and assign filename. Setting * @create to %TRUE causes to create the file if it doesn't exist. * * Returns: %TRUE if operation was successful, otherwise %FALSE. * * Since: 3.0.0 */ gboolean ags_sound_resource_rw_open(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create) { AgsSoundResourceInterface *sound_resource_interface; gboolean retval; g_return_val_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource), FALSE); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_val_if_fail(sound_resource_interface->open, FALSE); retval = sound_resource_interface->rw_open(sound_resource, filename, audio_channels, samplerate, create); return(retval); } /** * ags_sound_resource_load: * @sound_resource: the #AgsSoundResource * * Load audio data of @sound_resource. * * Since: 3.0.0 */ void ags_sound_resource_load(AgsSoundResource *sound_resource) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->load); sound_resource_interface->load(sound_resource); } /** * ags_sound_resource_info: * @sound_resource: the #AgsSoundResource * @frame_count: return location of frame count * @loop_start: return location of loop-start * @loop_end: return location of loop-end * * Get information about @sound_resource. * * Since: 3.0.0 */ void ags_sound_resource_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->info); sound_resource_interface->info(sound_resource, frame_count, loop_start, loop_end); } /** * ags_sound_resource_set_presets: * @sound_resource: the #AgsSoundResource * @channels: channels to set * @samplerate: samplerate to set * @buffer_size: buffer-size to set * @format: format to set * * Set presets of @sound_resource. * * Since: 3.0.0 */ void ags_sound_resource_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->set_presets); sound_resource_interface->set_presets(sound_resource, channels, samplerate, buffer_size, format); } /** * ags_sound_resource_get_presets: * @sound_resource: the #AgsSoundResource * @channels: return location of channels * @samplerate: return location of samplerate * @buffer_size: return location of buffer-size * @format: return location of format * * Get presets of @sound_resource. * * Since: 3.0.0 */ void ags_sound_resource_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->get_presets); sound_resource_interface->get_presets(sound_resource, channels, samplerate, buffer_size, format); } /** * ags_sound_resource_read: * @sound_resource: the #AgsSoundResource * @dbuffer: the destination buffer * @daudio_channels: destination buffer audio channel count * @audio_channel: the audio channel to read * @frame_count: the frame count to read * @format: the format to read * * Read @frame_count number of frames from @sound_resource and copy the data * to @dbuffer using @format by skipping @daudio_channels. * * Returns: the count of frames actually read * * Since: 3.0.0 */ guint ags_sound_resource_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format) { AgsSoundResourceInterface *sound_resource_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource), 0); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_val_if_fail(sound_resource_interface->read, 0); retval = sound_resource_interface->read(sound_resource, dbuffer, daudio_channels, audio_channel, frame_count, format); return(retval); } /** * ags_sound_resource_write: * @sound_resource: the #AgsSoundResource * @sbuffer: the source buffer * @saudio_channels: source buffer audio channel count * @audio_channel: the audio channel * @frame_count: the frame count to write * @format: the format to write * * Write @sbuffer to @sound_resource @frame_count number of * frames having @format by skipping @saudio_channels. * * Since: 3.0.0 */ void ags_sound_resource_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->write); sound_resource_interface->write(sound_resource, sbuffer, saudio_channels, audio_channel, frame_count, format); } /** * ags_sound_resource_flush: * @sound_resource: the #AgsSoundResource * * Flush @sound_resource. * * Since: 3.0.0 */ void ags_sound_resource_flush(AgsSoundResource *sound_resource) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->flush); sound_resource_interface->flush(sound_resource); } /** * ags_sound_resource_seek: * @sound_resource: the #AgsSoundResource * @frame_count: the frame count * @whence: SEEK_SET, SEEK_CUR or SEEK_END * * Seek the @sound_resource @frame_count from @whence. * * Since: 3.0.0 */ void ags_sound_resource_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->seek); sound_resource_interface->seek(sound_resource, frame_count, whence); } /** * ags_sound_resource_close: * @sound_resource: the #AgsSoundResource * * Close @sound_resource. * * Since: 3.0.0 */ void ags_sound_resource_close(AgsSoundResource *sound_resource) { AgsSoundResourceInterface *sound_resource_interface; g_return_if_fail(AGS_IS_SOUND_RESOURCE(sound_resource)); sound_resource_interface = AGS_SOUND_RESOURCE_GET_INTERFACE(sound_resource); g_return_if_fail(sound_resource_interface->close); sound_resource_interface->close(sound_resource); } /** * ags_sound_resource_read_audio_signal: * @sound_resource: the #AgsSoundResource * @soundcard: the #AgsSoundcard * @audio_channel: the audio channel or -1 for all * * Read audio signal from @sound_resource. * * Returns: (element-type AgsAudio.AudioSignal) (transfer full): a #GList-struct containing #AgsAudioSignal * * Since: 3.0.0 */ GList* ags_sound_resource_read_audio_signal(AgsSoundResource *sound_resource, GObject *soundcard, gint audio_channel) { GList *start_list; void *target_data, *data; guint frame_count; guint loop_start, loop_end; guint audio_channels; guint target_samplerate, samplerate; guint target_buffer_size, buffer_size; guint target_format, format; guint copy_mode; guint i, i_start, i_stop; if(!AGS_SOUND_RESOURCE(sound_resource)){ return(NULL); } ags_sound_resource_info(AGS_SOUND_RESOURCE(sound_resource), &frame_count, &loop_start, &loop_end); ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(sound_resource), &audio_channels, &samplerate, &buffer_size, &format); g_object_get(G_OBJECT(sound_resource), "format", &format, NULL); if(soundcard != NULL){ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, &target_samplerate, &target_buffer_size, &target_format); }else{ AgsConfig *config; config = ags_config_get_instance(); target_samplerate = ags_soundcard_helper_config_get_samplerate(config); target_buffer_size = ags_soundcard_helper_config_get_buffer_size(config); target_format = ags_soundcard_helper_config_get_format(config); } start_list = NULL; if(audio_channel == -1){ i_start = 0; i_stop = audio_channels; }else{ i_start = audio_channel; i_stop = i_start + 1; } copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(target_format), ags_audio_buffer_util_format_from_soundcard(format)); data = NULL; target_data = NULL; if(samplerate != target_samplerate){ buffer_size = (guint) ceil((double) target_buffer_size / (double) target_samplerate * (double) samplerate); ags_sound_resource_set_presets(AGS_SOUND_RESOURCE(sound_resource), audio_channels, samplerate, buffer_size, format); data = ags_stream_alloc(buffer_size, format); target_data = ags_stream_alloc(target_buffer_size, format); } for(i = i_start; i < i_stop; i++){ AgsAudioSignal *audio_signal; GList *stream; ags_sound_resource_seek(AGS_SOUND_RESOURCE(sound_resource), 0, G_SEEK_SET); audio_signal = ags_audio_signal_new(soundcard, NULL, NULL); g_object_set(audio_signal, "samplerate", target_samplerate, "buffer-size", target_buffer_size, "format", target_format, "loop-start", target_samplerate * (loop_start / samplerate), "loop-end", target_samplerate * (loop_end / samplerate), NULL); ags_audio_signal_stream_resize(audio_signal, (guint) ceil(frame_count / target_buffer_size) + 1); audio_signal->stream_current = audio_signal->stream; start_list = g_list_prepend(start_list, audio_signal); stream = audio_signal->stream; g_object_set(audio_signal, "last-frame", frame_count, NULL); while(stream != NULL){ if(samplerate != target_samplerate){ if(format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(data, 1, buffer_size); }else if(format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(data, 1, buffer_size); }else{ ags_audio_buffer_util_clear_buffer(data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); } ags_sound_resource_read(AGS_SOUND_RESOURCE(sound_resource), data, 1, i, buffer_size, format); ags_audio_buffer_util_clear_buffer(target_data, 1, target_buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); ags_audio_buffer_util_resample_with_buffer(data, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, target_samplerate, target_buffer_size, target_data); ags_audio_buffer_util_copy_buffer_to_buffer(stream->data, 1, 0, target_data, 1, 0, target_buffer_size, copy_mode); }else{ ags_sound_resource_read(AGS_SOUND_RESOURCE(sound_resource), stream->data, 1, i, target_buffer_size, target_format); } /* iterate */ stream = stream->next; } } if(data != NULL){ free(data); } if(target_data != NULL){ free(target_data); } start_list = g_list_reverse(start_list); g_list_foreach(start_list, (GFunc) g_object_ref, NULL); return(start_list); } /** * ags_sound_resource_read_wave: * @sound_resource: the #AgsSoundResource * @soundcard: the #AgsSoundcard * @audio_channel: the audio channel or -1 for all * @x_offset: the x offset * @delay: the delay * @attack: the attack * * Read wave from @sound_resource. * * Returns: (element-type AgsAudio.Wave) (transfer full): a #GList-struct containing #AgsWave * * Since: 3.0.0 */ GList* ags_sound_resource_read_wave(AgsSoundResource *sound_resource, GObject *soundcard, gint audio_channel, guint64 x_offset, gdouble delay, guint attack) { GList *start_list; void *target_data, *data; guint copy_mode; guint64 relative_offset; guint64 x_point_offset; guint frame_count; guint audio_channels; guint target_samplerate, samplerate; guint target_buffer_size, buffer_size; guint target_format, format; guint i, i_start, i_stop; if(!AGS_SOUND_RESOURCE(sound_resource)){ return(NULL); } ags_sound_resource_info(AGS_SOUND_RESOURCE(sound_resource), &frame_count, NULL, NULL); ags_sound_resource_get_presets(AGS_SOUND_RESOURCE(sound_resource), &audio_channels, &samplerate, &buffer_size, &format); g_object_get(G_OBJECT(sound_resource), "format", &format, NULL); if(soundcard != NULL){ ags_soundcard_get_presets(AGS_SOUNDCARD(soundcard), NULL, &target_samplerate, &target_buffer_size, &target_format); }else{ AgsConfig *config; config = ags_config_get_instance(); target_samplerate = ags_soundcard_helper_config_get_samplerate(config); target_buffer_size = ags_soundcard_helper_config_get_buffer_size(config); target_format = ags_soundcard_helper_config_get_format(config); } start_list = NULL; if(audio_channel == -1){ i_start = 0; i_stop = audio_channels; // g_message("do %d", audio_channels); }else{ i_start = audio_channel; i_stop = i_start + 1; } copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(target_format), ags_audio_buffer_util_format_from_soundcard(format)); data = NULL; target_data = NULL; if(samplerate != target_samplerate){ buffer_size = (guint) ceil((double) target_buffer_size / (double) target_samplerate * (double) samplerate); ags_sound_resource_set_presets(AGS_SOUND_RESOURCE(sound_resource), audio_channels, samplerate, buffer_size, format); data = ags_stream_alloc(buffer_size, format); target_data = ags_stream_alloc(target_buffer_size, format); } for(i = i_start; i < i_stop; i++){ AgsWave *wave; gboolean success; ags_sound_resource_seek(AGS_SOUND_RESOURCE(sound_resource), 0, G_SEEK_SET); wave = ags_wave_new(NULL, i); g_object_set(wave, "samplerate", target_samplerate, "buffer-size", target_buffer_size, "format", target_format, NULL); start_list = ags_wave_add(start_list, wave); relative_offset = AGS_WAVE_DEFAULT_BUFFER_LENGTH * target_samplerate; frame_count = target_buffer_size; x_point_offset = x_offset; success = TRUE; while(success){ AgsBuffer *buffer; guint num_read; gboolean create_wave; create_wave = FALSE; if(x_point_offset + frame_count > relative_offset * floor(x_point_offset / relative_offset) + relative_offset){ frame_count = relative_offset * floor((x_point_offset + frame_count) / relative_offset) - x_point_offset; create_wave = TRUE; }else if(x_point_offset + frame_count == relative_offset * floor(x_point_offset / relative_offset) + relative_offset){ create_wave = TRUE; } buffer = ags_buffer_new(); g_object_set(buffer, "x", x_point_offset, "samplerate", target_samplerate, "buffer-size", target_buffer_size, "format", target_format, NULL); if(samplerate != target_samplerate){ if(format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(data, 1, buffer_size); }else if(format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(data, 1, buffer_size); }else{ ags_audio_buffer_util_clear_buffer(data, 1, buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); } num_read = ags_sound_resource_read(AGS_SOUND_RESOURCE(sound_resource), data, 1, i, buffer_size, format); ags_audio_buffer_util_clear_buffer(target_data, 1, target_buffer_size, ags_audio_buffer_util_format_from_soundcard(format)); ags_audio_buffer_util_resample_with_buffer(data, 1, ags_audio_buffer_util_format_from_soundcard(format), samplerate, buffer_size, target_samplerate, target_buffer_size, target_data); ags_audio_buffer_util_copy_buffer_to_buffer(buffer->data, 1, 0, target_data, 1, 0, frame_count, copy_mode); num_read = (guint) (ceil((double) num_read / (double) buffer_size * (double) frame_count)); }else{ num_read = ags_sound_resource_read(AGS_SOUND_RESOURCE(sound_resource), buffer->data, 1, i, frame_count, target_format); } // g_message("read %d[%d-%d]: %d", frame_count, i, i_stop, num_read); ags_wave_add_buffer(wave, buffer, FALSE); if(create_wave){ AgsTimestamp *timestamp; wave = ags_wave_new(NULL, i); g_object_set(wave, "samplerate", target_samplerate, "buffer-size", target_buffer_size, "format", target_format, NULL); g_object_get(wave, "timestamp", ×tamp, NULL); ags_timestamp_set_ags_offset(timestamp, (guint64) relative_offset * floor((x_point_offset + frame_count) / relative_offset)); g_object_unref(timestamp); start_list = ags_wave_add(start_list, wave); } /* iterate */ x_point_offset += frame_count; if(num_read < frame_count){ success = FALSE; } if(frame_count != target_buffer_size){ frame_count = target_buffer_size; } } } if(data != NULL){ free(data); } if(target_data != NULL){ free(target_data); } g_list_foreach(start_list, (GFunc) g_object_ref, NULL); return(start_list); } gsequencer-3.1.3/ags/audio/file/ags_ipatch_sf2_reader.c0000644000175000017500000010165313607210263017742 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_ipatch_sf2_reader_class_init(AgsIpatchSF2ReaderClass *ipatch_sf2_reader); void ags_ipatch_sf2_reader_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ipatch_sf2_reader_init(AgsIpatchSF2Reader *ipatch_sf2_reader); void ags_ipatch_sf2_reader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ipatch_sf2_reader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ipatch_sf2_reader_dispose(GObject *gobject); void ags_ipatch_sf2_reader_finalize(GObject *gobject); AgsUUID* ags_ipatch_sf2_reader_get_uuid(AgsConnectable *connectable); gboolean ags_ipatch_sf2_reader_has_resource(AgsConnectable *connectable); gboolean ags_ipatch_sf2_reader_is_ready(AgsConnectable *connectable); void ags_ipatch_sf2_reader_add_to_registry(AgsConnectable *connectable); void ags_ipatch_sf2_reader_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_ipatch_sf2_reader_list_resource(AgsConnectable *connectable); xmlNode* ags_ipatch_sf2_reader_xml_compose(AgsConnectable *connectable); void ags_ipatch_sf2_reader_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_ipatch_sf2_reader_is_connected(AgsConnectable *connectable); void ags_ipatch_sf2_reader_connect(AgsConnectable *connectable); void ags_ipatch_sf2_reader_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ipatch_sf2_reader * @short_description: interfacing Soundfont2 related API of libinstpatch * @title: AgsIpatchSF2Reader * @section_id: * @include: ags/audio/file/ags_ipatch_sf2_reader.h * * #AgsIpatchSF2Reader is the base object to ineract with Soundfont2 related API. */ static gpointer ags_ipatch_sf2_reader_parent_class = NULL; enum{ PROP_0, PROP_IPATCH, }; GType ags_ipatch_sf2_reader_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ipatch_sf2_reader = 0; static const GTypeInfo ags_ipatch_sf2_reader_info = { sizeof(AgsIpatchSF2ReaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ipatch_sf2_reader_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsIpatchSF2Reader), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ipatch_sf2_reader_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ipatch_sf2_reader_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ipatch_sf2_reader = g_type_register_static(G_TYPE_OBJECT, "AgsIpatchSF2Reader", &ags_ipatch_sf2_reader_info, 0); g_type_add_interface_static(ags_type_ipatch_sf2_reader, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ipatch_sf2_reader); } return g_define_type_id__volatile; } void ags_ipatch_sf2_reader_class_init(AgsIpatchSF2ReaderClass *ipatch_sf2_reader) { GObjectClass *gobject; GParamSpec *param_spec; ags_ipatch_sf2_reader_parent_class = g_type_class_peek_parent(ipatch_sf2_reader); gobject = (GObjectClass *) ipatch_sf2_reader; gobject->set_property = ags_ipatch_sf2_reader_set_property; gobject->get_property = ags_ipatch_sf2_reader_get_property; gobject->dispose = ags_ipatch_sf2_reader_dispose; gobject->finalize = ags_ipatch_sf2_reader_finalize; /* properties */ /** * AgsIpatchSF2Reader:ipatch: * * The assigned #AgsIpatch * * Since: 3.0.0 */ param_spec = g_param_spec_object("ipatch", i18n_pspec("the ipatch"), i18n_pspec("The assigned ipatch"), AGS_TYPE_IPATCH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IPATCH, param_spec); } void ags_ipatch_sf2_reader_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_ipatch_sf2_reader_get_uuid; connectable->has_resource = ags_ipatch_sf2_reader_has_resource; connectable->is_ready = ags_ipatch_sf2_reader_is_ready; connectable->add_to_registry = ags_ipatch_sf2_reader_add_to_registry; connectable->remove_from_registry = ags_ipatch_sf2_reader_remove_from_registry; connectable->list_resource = ags_ipatch_sf2_reader_list_resource; connectable->xml_compose = ags_ipatch_sf2_reader_xml_compose; connectable->xml_parse = ags_ipatch_sf2_reader_xml_parse; connectable->is_connected = ags_ipatch_sf2_reader_is_connected; connectable->connect = ags_ipatch_sf2_reader_connect; connectable->disconnect = ags_ipatch_sf2_reader_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_ipatch_sf2_reader_init(AgsIpatchSF2Reader *ipatch_sf2_reader) { guint i; ipatch_sf2_reader->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(ipatch_sf2_reader->obj_mutex)); /* uuid */ ipatch_sf2_reader->uuid = ags_uuid_alloc(); ags_uuid_generate(ipatch_sf2_reader->uuid); ipatch_sf2_reader->level = 0; ipatch_sf2_reader->ipatch = NULL; /* selected */ ipatch_sf2_reader->index_selected = (guint *) malloc(4 * sizeof(guint)); memset(ipatch_sf2_reader->index_selected, 0, 4 * sizeof(guint)); ipatch_sf2_reader->name_selected = (gchar **) malloc(5 * sizeof(gchar *)); for(i = 0; i < 5; i++){ ipatch_sf2_reader->name_selected[i] = NULL; } /* reader */ ipatch_sf2_reader->reader = NULL; ipatch_sf2_reader->sf2 = NULL; ipatch_sf2_reader->preset = NULL; ipatch_sf2_reader->instrument = NULL; ipatch_sf2_reader->sample = NULL; ipatch_sf2_reader->error = NULL; } void ags_ipatch_sf2_reader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsIpatchSF2Reader *ipatch_sf2_reader; GRecMutex *ipatch_sf2_reader_mutex; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(gobject); /* get ipatch sample mutex */ ipatch_sf2_reader_mutex = AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(ipatch_sf2_reader); switch(prop_id){ case PROP_IPATCH: { AgsIpatch *ipatch; ipatch = (AgsIpatch *) g_value_get_object(value); g_rec_mutex_lock(ipatch_sf2_reader_mutex); if(ipatch_sf2_reader->ipatch == ipatch){ g_rec_mutex_unlock(ipatch_sf2_reader_mutex); return; } if(ipatch_sf2_reader->ipatch != NULL){ g_object_unref(ipatch_sf2_reader->ipatch); } if(ipatch != NULL){ g_object_ref(ipatch); } ipatch_sf2_reader->ipatch = ipatch; g_rec_mutex_unlock(ipatch_sf2_reader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_sf2_reader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsIpatchSF2Reader *ipatch_sf2_reader; GRecMutex *ipatch_sf2_reader_mutex; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(gobject); /* get ipatch sample mutex */ ipatch_sf2_reader_mutex = AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(ipatch_sf2_reader); switch(prop_id){ case PROP_IPATCH: { g_rec_mutex_lock(ipatch_sf2_reader_mutex); g_value_set_object(value, ipatch_sf2_reader->ipatch); g_rec_mutex_unlock(ipatch_sf2_reader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_sf2_reader_dispose(GObject *gobject) { AgsIpatchSF2Reader *ipatch_sf2_reader; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(gobject); if(ipatch_sf2_reader->ipatch != NULL){ g_object_unref(ipatch_sf2_reader->ipatch); ipatch_sf2_reader->ipatch = NULL; } /* call parent */ G_OBJECT_CLASS(ags_ipatch_sf2_reader_parent_class)->dispose(gobject); } void ags_ipatch_sf2_reader_finalize(GObject *gobject) { AgsIpatchSF2Reader *ipatch_sf2_reader; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(gobject); if(ipatch_sf2_reader->ipatch != NULL){ g_object_unref(ipatch_sf2_reader->ipatch); } /* call parent */ G_OBJECT_CLASS(ags_ipatch_sf2_reader_parent_class)->finalize(gobject); } AgsUUID* ags_ipatch_sf2_reader_get_uuid(AgsConnectable *connectable) { AgsIpatchSF2Reader *ipatch_sf2_reader; AgsUUID *ptr; GRecMutex *ipatch_sf2_reader_mutex; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(connectable); /* get audio file mutex */ ipatch_sf2_reader_mutex = AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(ipatch_sf2_reader); /* get UUID */ g_rec_mutex_lock(ipatch_sf2_reader_mutex); ptr = ipatch_sf2_reader->uuid; g_rec_mutex_unlock(ipatch_sf2_reader_mutex); return(ptr); } gboolean ags_ipatch_sf2_reader_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_ipatch_sf2_reader_is_ready(AgsConnectable *connectable) { AgsIpatchSF2Reader *ipatch_sf2_reader; gboolean is_ready; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(connectable); /* check is ready */ is_ready = ags_ipatch_sf2_reader_test_flags(ipatch_sf2_reader, AGS_IPATCH_SF2_READER_ADDED_TO_REGISTRY); return(is_ready); } void ags_ipatch_sf2_reader_add_to_registry(AgsConnectable *connectable) { AgsIpatchSF2Reader *ipatch_sf2_reader; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } ipatch_sf2_reader = AGS_IPATCH_SF2_READER(connectable); ags_ipatch_sf2_reader_set_flags(ipatch_sf2_reader, AGS_IPATCH_SF2_READER_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) ipatch_sf2_reader); ags_registry_add_entry(registry, entry); } } void ags_ipatch_sf2_reader_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_ipatch_sf2_reader_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_ipatch_sf2_reader_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_ipatch_sf2_reader_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_ipatch_sf2_reader_is_connected(AgsConnectable *connectable) { AgsIpatchSF2Reader *ipatch_sf2_reader; gboolean is_connected; ipatch_sf2_reader = AGS_IPATCH_SF2_READER(connectable); /* check is connected */ is_connected = ags_ipatch_sf2_reader_test_flags(ipatch_sf2_reader, AGS_IPATCH_SF2_READER_CONNECTED); return(is_connected); } void ags_ipatch_sf2_reader_connect(AgsConnectable *connectable) { AgsIpatchSF2Reader *ipatch_sf2_reader; if(ags_connectable_is_connected(connectable)){ return; } ipatch_sf2_reader = AGS_IPATCH_SF2_READER(connectable); ags_ipatch_sf2_reader_set_flags(ipatch_sf2_reader, AGS_IPATCH_SF2_READER_CONNECTED); } void ags_ipatch_sf2_reader_disconnect(AgsConnectable *connectable) { AgsIpatchSF2Reader *ipatch_sf2_reader; if(!ags_connectable_is_connected(connectable)){ return; } ipatch_sf2_reader = AGS_IPATCH_SF2_READER(connectable); ags_ipatch_sf2_reader_unset_flags(ipatch_sf2_reader, AGS_IPATCH_SF2_READER_CONNECTED); } /** * ags_ipatch_sf2_reader_test_flags: * @ipatch_sf2_reader: the #AgsIpatchSF2Reader * @flags: the flags * * Test @flags to be set on @ipatch_sf2_reader. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_ipatch_sf2_reader_test_flags(AgsIpatchSF2Reader *ipatch_sf2_reader, guint flags) { gboolean retval; GRecMutex *ipatch_sf2_reader_mutex; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(FALSE); } /* get ipatch_sf2_reader mutex */ ipatch_sf2_reader_mutex = AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(ipatch_sf2_reader); /* test */ g_rec_mutex_lock(ipatch_sf2_reader_mutex); retval = (flags & (ipatch_sf2_reader->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(ipatch_sf2_reader_mutex); return(retval); } /** * ags_ipatch_sf2_reader_set_flags: * @ipatch_sf2_reader: the #AgsIpatchSF2Reader * @flags: see #AgsIpatchSF2ReaderFlags-enum * * Enable a feature of @ipatch_sf2_reader. * * Since: 3.0.0 */ void ags_ipatch_sf2_reader_set_flags(AgsIpatchSF2Reader *ipatch_sf2_reader, guint flags) { GRecMutex *ipatch_sf2_reader_mutex; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return; } /* get ipatch_sf2_reader mutex */ ipatch_sf2_reader_mutex = AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(ipatch_sf2_reader); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(ipatch_sf2_reader_mutex); ipatch_sf2_reader->flags |= flags; g_rec_mutex_unlock(ipatch_sf2_reader_mutex); } /** * ags_ipatch_sf2_reader_unset_flags: * @ipatch_sf2_reader: the #AgsIpatchSF2Reader * @flags: see #AgsIpatchSF2ReaderFlags-enum * * Disable a feature of @ipatch_sf2_reader. * * Since: 3.0.0 */ void ags_ipatch_sf2_reader_unset_flags(AgsIpatchSF2Reader *ipatch_sf2_reader, guint flags) { GRecMutex *ipatch_sf2_reader_mutex; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return; } /* get ipatch_sf2_reader mutex */ ipatch_sf2_reader_mutex = AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(ipatch_sf2_reader); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(ipatch_sf2_reader_mutex); ipatch_sf2_reader->flags &= (~flags); g_rec_mutex_unlock(ipatch_sf2_reader_mutex); } /** * ags_ipatch_sf2_reader_load: * @ipatch_sf2_reader: the #AgsSF2Reader * @handle: the #IpatchFileHandle * * Load Soundfont2 file. * * Returns: %TRUE on success, else %FALSE on failure * * Since: 3.0.0 */ gboolean ags_ipatch_sf2_reader_load(AgsIpatchSF2Reader *ipatch_sf2_reader, IpatchFileHandle *handle) { if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(FALSE); } ipatch_sf2_reader->reader = ipatch_sf2_reader_new(handle); ipatch_sf2_reader->error = NULL; ipatch_sf2_reader->base = (IpatchBase *) ipatch_sf2_reader_load(ipatch_sf2_reader->reader, &(ipatch_sf2_reader->error)); if(ipatch_sf2_reader->error != NULL){ g_warning("%s", ipatch_sf2_reader->error->message); return(FALSE); } ipatch_sf2_reader->error = NULL; ipatch_sf2_reader->sf2 = (IpatchSF2 *) ipatch_convert_object_to_type((GObject *) handle->file, IPATCH_TYPE_SF2, &(ipatch_sf2_reader->error)); if(ipatch_sf2_reader->error != NULL){ g_warning("%s", ipatch_sf2_reader->error->message); return(FALSE); } while(g_static_rec_mutex_unlock_full(((IpatchItem *) (ipatch_sf2_reader->base))->mutex) != 0); return(TRUE); } /** * ags_ipatch_sf2_reader_select_preset: * @ipatch_sf2_reader: the #AgsSF2Reader * @preset_index: the preset index * * Select preset. * * Returns: %TRUE on success, else %FALSE on failure * * Since: 3.0.0 */ gboolean ags_ipatch_sf2_reader_select_preset(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter preset_iter; #endif gboolean success; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_PRESET); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &preset_iter); if(preset_index < ipatch_iter_count(&preset_iter)){ success = TRUE; ipatch_iter_index(&preset_iter, preset_index); ipatch_item = ipatch_iter_get(&preset_iter); /* selected index and name */ ipatch_sf2_reader->index_selected[AGS_SF2_PHDR] = preset_index; ipatch_sf2_reader->index_selected[AGS_SF2_IHDR] = 0; ipatch_sf2_reader->index_selected[AGS_SF2_SHDR] = 0; ipatch_sf2_reader->name_selected[AGS_SF2_PHDR] = g_strdup(ipatch_sf2_preset_get_name(IPATCH_SF2_PRESET(ipatch_item))); g_free(ipatch_sf2_reader->name_selected[AGS_SF2_IHDR]); ipatch_sf2_reader->name_selected[AGS_SF2_IHDR] = NULL; g_free(ipatch_sf2_reader->name_selected[AGS_SF2_SHDR]); ipatch_sf2_reader->name_selected[AGS_SF2_SHDR] = NULL; /* container */ ipatch_sf2_reader->preset = (IpatchContainer *) ipatch_item; ipatch_sf2_reader->instrument = NULL; ipatch_sf2_reader->sample = NULL; } } #endif return(success); } /** * ags_ipatch_sf2_reader_select_instrument: * @ipatch_sf2_reader: the #AgsSF2Reader * @instrument_index: the instrument index * * Select instrument. * * Returns: %TRUE on success, else %FALSE on failure * * Since: 3.0.0 */ gboolean ags_ipatch_sf2_reader_select_instrument(AgsIpatchSF2Reader *ipatch_sf2_reader, guint instrument_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter; #endif gboolean success; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; ipatch_list = ipatch_sf2_preset_get_zones(ipatch_sf2_reader->preset); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); if(instrument_index < ipatch_iter_count(&instrument_iter)){ success = TRUE; ipatch_iter_index(&instrument_iter, instrument_index); ipatch_item = (IpatchItem *) ipatch_sf2_pzone_get_inst(ipatch_iter_get(&instrument_iter)); /* selected index and name */ ipatch_sf2_reader->index_selected[AGS_SF2_IHDR] = instrument_index; ipatch_sf2_reader->index_selected[AGS_SF2_SHDR] = 0; g_free(ipatch_sf2_reader->name_selected[AGS_SF2_IHDR]); ipatch_sf2_reader->name_selected[AGS_SF2_IHDR] = g_strdup(ipatch_sf2_inst_get_name(IPATCH_SF2_INST(ipatch_item))); g_free(ipatch_sf2_reader->name_selected[AGS_SF2_SHDR]); ipatch_sf2_reader->name_selected[AGS_SF2_SHDR] = NULL; /* container */ ipatch_sf2_reader->instrument = (IpatchContainer *) ipatch_item; ipatch_sf2_reader->sample = NULL; } } #endif return(success); } /** * ags_ipatch_sf2_reader_select_sample: * @ipatch_sf2_reader: the #AgsSF2Reader * @sample_index: the sample index * * Select sample. * * Returns: %TRUE on success, else %FALSE on failure * * Since: 3.0.0 */ gboolean ags_ipatch_sf2_reader_select_sample(AgsIpatchSF2Reader *ipatch_sf2_reader, guint sample_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif gboolean success; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; ipatch_list = ipatch_sf2_inst_get_zones(ipatch_sf2_reader->instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); if(sample_index < ipatch_iter_count(&sample_iter)){ success = TRUE; ipatch_iter_index(&sample_iter, sample_index); ipatch_item = (IpatchItem *) ipatch_sf2_izone_get_sample(ipatch_iter_get(&sample_iter)); /* selected index and name */ ipatch_sf2_reader->index_selected[AGS_SF2_SHDR] = sample_index; g_free(ipatch_sf2_reader->name_selected[AGS_SF2_SHDR]); ipatch_sf2_reader->name_selected[AGS_SF2_SHDR] = g_strdup(ipatch_sf2_sample_get_name((IpatchSF2Sample *) ipatch_item)); /* container */ ipatch_sf2_reader->sample = (IpatchContainer *) ipatch_item; } } #endif return(success); } /** * ags_ipatch_sf2_reader_get_preset_all: * @ipatch_sf2_reader: the #AgsSF2Reader * * Get all preset names. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector cotaining preset names or %NULL on failure * * Since: 3.0.0 */ gchar** ags_ipatch_sf2_reader_get_preset_all(AgsIpatchSF2Reader *ipatch_sf2_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter preset_iter; #endif gchar **preset; guint i, i_stop; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(NULL); } preset = NULL; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_PRESET); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &preset_iter); i_stop = ipatch_iter_count(&preset_iter); if(i_stop > 0){ preset = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&preset_iter); for(i = 0; i < i_stop; i++){ ipatch_item = ipatch_iter_get(&preset_iter); preset[i] = g_strdup(ipatch_sf2_preset_get_name(IPATCH_SF2_PRESET(ipatch_item))); /* iterate */ ipatch_iter_next(&preset_iter); } preset[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (sf2))->mutex) != 0); #endif return(preset); } /** * ags_ipatch_sf2_reader_get_instrument_all: * @ipatch_sf2_reader: the #AgsSF2Reader * * Get all instrument names. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector cotaining instrument names or %NULL on failure * * Since: 3.0.0 */ gchar** ags_ipatch_sf2_reader_get_instrument_all(AgsIpatchSF2Reader *ipatch_sf2_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter; #endif gchar **instrument; guint i, i_stop; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(NULL); } instrument = NULL; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); i_stop = ipatch_iter_count(&instrument_iter); if(i_stop > 0){ instrument = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&instrument_iter); for(i = 0; i < i_stop; i++){ ipatch_item = ipatch_iter_get(&instrument_iter); instrument[i] = g_strdup(ipatch_sf2_inst_get_name(IPATCH_SF2_INST(ipatch_item))); /* iterate */ ipatch_iter_next(&instrument_iter); } instrument[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (sf2))->mutex) != 0); #endif return(instrument); } /** * ags_ipatch_sf2_reader_get_sample_all: * @ipatch_sf2_reader: the #AgsSF2Reader * * Get all sample names. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector cotaining sample names or %NULL on failure * * Since: 3.0.0 */ gchar** ags_ipatch_sf2_reader_get_sample_all(AgsIpatchSF2Reader *ipatch_sf2_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif gchar **sample; guint i, i_stop; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(NULL); } sample = NULL; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_SAMPLE); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); i_stop = ipatch_iter_count(&sample_iter); if(i_stop > 0){ sample = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&sample_iter); for(i = 0; i < i_stop; i++){ ipatch_item = ipatch_iter_get(&sample_iter); sample[i] = g_strdup(ipatch_sf2_sample_get_name(IPATCH_SF2_SAMPLE(ipatch_item))); /* iterate */ ipatch_iter_next(&sample_iter); } sample[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (sf2))->mutex) != 0); #endif return(sample); } /** * ags_ipatch_sf2_reader_get_instrument_by_preset_index: * @ipatch_sf2_reader: the #AgsSF2Reader * @preset_index: the preset index * * Get instrument by preset index. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector cotaining instrument names or %NULL on failure * * Since: 3.0.0 */ gchar** ags_ipatch_sf2_reader_get_instrument_by_preset_index(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchContainer *preset; IpatchContainer *instrument; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter preset_iter, instrument_iter, sample_iter; #endif gchar **instrument_strv; guint i, i_stop; guint j, j_stop; guint k, k_stop; guint count; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(NULL); } instrument_strv = NULL; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; /* presets */ ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_PRESET); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &preset_iter); i_stop = ipatch_iter_count(&preset_iter); if(i_stop > 0 && preset_index < i_stop){ ipatch_iter_first(&preset_iter); ipatch_iter_index(&preset_iter, preset_index); preset = (IpatchContainer *) ipatch_iter_get(&preset_iter); /* instruments */ ipatch_list = ipatch_sf2_preset_get_zones(preset); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); j_stop = ipatch_iter_count(&instrument_iter); ipatch_iter_first(&instrument_iter); if(j_stop > 0){ instrument_strv = (gchar **) malloc((j_stop + 1) * sizeof(gchar *)); for(j = 0, count = 0; j < j_stop; j++){ instrument = (IpatchContainer *) ipatch_sf2_pzone_get_inst(ipatch_iter_get(&instrument_iter)); instrument_strv[count] = g_strdup(ipatch_sf2_inst_get_name((IpatchSF2Inst *) instrument)); /* iterate */ ipatch_iter_next(&instrument_iter); count++; } instrument_strv[count] = NULL; } } } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (sf2))->mutex) != 0); #endif return(instrument_strv); } /** * ags_ipatch_sf2_reader_get_sample_by_preset_index: * @ipatch_sf2_reader: the #AgsSF2Reader * @preset_index: the preset index * * Get sample by preset index. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector cotaining sample names or %NULL on failure * * Since: 3.0.0 */ gchar** ags_ipatch_sf2_reader_get_sample_by_preset_index(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchContainer *preset; IpatchContainer *instrument; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter preset_iter, instrument_iter, sample_iter; #endif gchar **sample_strv; guint i, i_stop; guint j, j_stop; guint k, k_stop; guint count; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(NULL); } sample_strv = NULL; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; /* presets */ ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_PRESET); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &preset_iter); i_stop = ipatch_iter_count(&preset_iter); if(i_stop > 0){ ipatch_iter_index(&preset_iter, preset_index); preset = (IpatchContainer *) ipatch_iter_get(&preset_iter); /* instruments */ ipatch_list = ipatch_sf2_preset_get_zones(preset); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); j_stop = ipatch_iter_count(&instrument_iter); if(j_stop > 0){ for(j = 0, count = 0; j < j_stop; j++){ instrument = (IpatchContainer *) ipatch_sf2_pzone_get_inst(ipatch_iter_get(&instrument_iter)); /* samples */ ipatch_list = ipatch_sf2_inst_get_zones(preset); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); k_stop = ipatch_iter_count(&sample_iter); if(k_stop > 0){ if(sample_strv == NULL){ sample_strv = (gchar **) malloc((k_stop + 1) * sizeof(gchar *)); }else{ sample_strv = (gchar **) realloc(sample_strv, (count + k_stop + 1) * sizeof(gchar *)); } for(k = 0; k < k_stop; k++){ ipatch_item = (IpatchItem *) ipatch_sf2_izone_get_sample(ipatch_iter_get(&sample_iter)); sample_strv[count] = g_strdup(ipatch_sf2_sample_get_name((IpatchSF2Sample *) ipatch_item)); /* iterate */ ipatch_iter_next(&sample_iter); count++; } } } /* iterate */ ipatch_iter_next(&instrument_iter); } } } if(sample_strv != NULL){ sample_strv[count] = NULL; } } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (sf2))->mutex) != 0); #endif return(sample_strv); } /** * ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index: * @ipatch_sf2_reader: the #AgsSF2Reader * @preset_index: the preset index * @instrument_index: the instrument index * * Get sample by preset and instrument index. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector cotaining sample names or %NULL on failure * * Since: 3.0.0 */ gchar** ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index, guint instrument_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2 *sf2; IpatchContainer *preset; IpatchContainer *instrument; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter preset_iter, instrument_iter, sample_iter; #endif gchar **sample; guint i, i_stop; guint j, j_stop; guint k, k_stop; guint count; if(!AGS_IS_IPATCH_SF2_READER(ipatch_sf2_reader)){ return(NULL); } sample = NULL; #ifdef AGS_WITH_LIBINSTPATCH sf2 = ipatch_sf2_reader->sf2; /* presets */ ipatch_list = ipatch_container_get_children((IpatchContainer *) sf2, IPATCH_TYPE_SF2_PRESET); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &preset_iter); i_stop = ipatch_iter_count(&preset_iter); if(i_stop > 0 && preset_index < i_stop){ ipatch_iter_index(&preset_iter, preset_index); preset = (IpatchContainer *) ipatch_iter_get(&preset_iter); /* instruments */ ipatch_list = ipatch_sf2_preset_get_zones(preset); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); j_stop = ipatch_iter_count(&instrument_iter); if(j_stop > 0 && instrument_index < j_stop){ ipatch_iter_index(&instrument_iter, instrument_index); instrument = (IpatchContainer *) ipatch_sf2_pzone_get_inst(ipatch_iter_get(&instrument_iter)); /* samples */ ipatch_list = ipatch_sf2_inst_get_zones(instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); k_stop = ipatch_iter_count(&sample_iter); if(k_stop > 0){ sample = (gchar **) malloc((k_stop + 1) * sizeof(gchar *)); for(k = 0, count = 0; k < k_stop; k++){ ipatch_item = (IpatchItem *) ipatch_sf2_izone_get_sample(ipatch_iter_get(&sample_iter)); sample[count] = g_strdup(ipatch_sf2_sample_get_name((IpatchSF2Sample *) ipatch_item)); /* iterate */ ipatch_iter_next(&sample_iter); count++; } sample[count] = NULL; } } } } } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (sf2))->mutex) != 0); #endif return(sample); } /** * ags_ipatch_sf2_reader_new: * @ipatch: the #AgsIpatch * * Creates a new instance of #AgsIpatchSF2Reader. * * Returns: the new #AgsIpatchSF2Reader. * * Since: 3.0.0 */ AgsIpatchSF2Reader* ags_ipatch_sf2_reader_new(AgsIpatch *ipatch) { AgsIpatchSF2Reader *ipatch_sf2_reader; ipatch_sf2_reader = (AgsIpatchSF2Reader *) g_object_new(AGS_TYPE_IPATCH_SF2_READER, "ipatch", ipatch, NULL); return(ipatch_sf2_reader); } gsequencer-3.1.3/ags/audio/file/ags_sfz_sample.h0000644000175000017500000000605413607210263016545 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SFZ_SAMPLE_H__ #define __AGS_SFZ_SAMPLE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SFZ_SAMPLE (ags_sfz_sample_get_type()) #define AGS_SFZ_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SFZ_SAMPLE, AgsSFZSample)) #define AGS_SFZ_SAMPLE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SFZ_SAMPLE, AgsSFZSampleClass)) #define AGS_IS_SFZ_SAMPLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SFZ_SAMPLE)) #define AGS_IS_SFZ_SAMPLE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SFZ_SAMPLE)) #define AGS_SFZ_SAMPLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SFZ_SAMPLE, AgsSFZSampleClass)) #define AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(obj) (&(((AgsSFZSample *) obj)->obj_mutex)) typedef struct _AgsSFZSample AgsSFZSample; typedef struct _AgsSFZSampleClass AgsSFZSampleClass; /** * AgsSFZSampleFlags: * @AGS_SFZ_SAMPLE_ADDED_TO_REGISTRY: the sfz sample was added to registry, see #AgsConnectable::add_to_registry() * @AGS_SFZ_SAMPLE_CONNECTED: indicates the sfz sample was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsSFZSample by * enable/disable as flags. */ typedef enum{ AGS_SFZ_SAMPLE_ADDED_TO_REGISTRY = 1, AGS_SFZ_SAMPLE_CONNECTED = 1 << 1, }AgsSFZSampleFlags; struct _AgsSFZSample { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gchar *filename; guint audio_channels; gint64 *audio_channel_written; guint buffer_size; guint format; guint loop_start; guint loop_end; guint offset; guint64 buffer_offset; void *full_buffer; void *buffer; guchar *pointer; guchar *current; gsize length; SF_INFO *info; SNDFILE *file; GObject *group; GObject *region; }; struct _AgsSFZSampleClass { GObjectClass gobject; }; GType ags_sfz_sample_get_type(); gboolean ags_sfz_sample_test_flags(AgsSFZSample *sfz_sample, guint flags); void ags_sfz_sample_set_flags(AgsSFZSample *sfz_sample, guint flags); void ags_sfz_sample_unset_flags(AgsSFZSample *sfz_sample, guint flags); /* instantiate */ AgsSFZSample* ags_sfz_sample_new(); G_END_DECLS #endif /*__AGS_SFZ_SAMPLE_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sndfile.h0000644000175000017500000000573713607210263016035 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SNDFILE_H__ #define __AGS_SNDFILE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SNDFILE (ags_sndfile_get_type()) #define AGS_SNDFILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SNDFILE, AgsSndfile)) #define AGS_SNDFILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SNDFILE, AgsSndfileClass)) #define AGS_IS_SNDFILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SNDFILE)) #define AGS_IS_SNDFILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SNDFILE)) #define AGS_SNDFILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SNDFILE, AgsSndfileClass)) #define AGS_SNDFILE_GET_OBJ_MUTEX(obj) (&(((AgsSndfile *) obj)->obj_mutex)) typedef struct _AgsSndfile AgsSndfile; typedef struct _AgsSndfileClass AgsSndfileClass; /** * AgsSndfileFlags: * @AGS_SNDFILE_ADDED_TO_REGISTRY: the sndfile was added to registry, see #AgsConnectable::add_to_registry() * @AGS_SNDFILE_CONNECTED: indicates the sndfile was connected by calling #AgsConnectable::connect() * @AGS_SNDFILE_VIRTUAL: virtual IO * @AGS_SNDFILE_FILL_CACHE: fill cache * * Enum values to control the behavior or indicate internal state of #AgsSndfile by * enable/disable as flags. */ typedef enum{ AGS_SNDFILE_ADDED_TO_REGISTRY = 1, AGS_SNDFILE_CONNECTED = 1 << 1, AGS_SNDFILE_VIRTUAL = 1 << 2, AGS_SNDFILE_FILL_CACHE = 1 << 3, }AgsSndfileFlags; struct _AgsSndfile { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint audio_channels; gint64 *audio_channel_written; guint buffer_size; guint format; guint64 offset; guint64 buffer_offset; void *full_buffer; void *buffer; guchar *pointer; guchar *current; gsize length; SF_INFO *info; SNDFILE *file; }; struct _AgsSndfileClass { GObjectClass gobject; }; GType ags_sndfile_get_type(); gboolean ags_sndfile_test_flags(AgsSndfile *sndfile, guint flags); void ags_sndfile_set_flags(AgsSndfile *sndfile, guint flags); void ags_sndfile_unset_flags(AgsSndfile *sndfile, guint flags); AgsSndfile* ags_sndfile_new(); G_END_DECLS #endif /*__AGS_SNDFILE_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sfz_file.c0000644000175000017500000012057613613101164016200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include void ags_sfz_file_class_init(AgsSFZFileClass *sfz_file); void ags_sfz_file_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sfz_file_sound_container_interface_init(AgsSoundContainerInterface *sound_container); void ags_sfz_file_init(AgsSFZFile *sfz_file); void ags_sfz_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sfz_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sfz_file_dispose(GObject *gobject); void ags_sfz_file_finalize(GObject *gobject); AgsUUID* ags_sfz_file_get_uuid(AgsConnectable *connectable); gboolean ags_sfz_file_has_resource(AgsConnectable *connectable); gboolean ags_sfz_file_is_ready(AgsConnectable *connectable); void ags_sfz_file_add_to_registry(AgsConnectable *connectable); void ags_sfz_file_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_sfz_file_list_resource(AgsConnectable *connectable); xmlNode* ags_sfz_file_xml_compose(AgsConnectable *connectable); void ags_sfz_file_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_sfz_file_is_connected(AgsConnectable *connectable); void ags_sfz_file_connect(AgsConnectable *connectable); void ags_sfz_file_disconnect(AgsConnectable *connectable); gboolean ags_sfz_file_open(AgsSoundContainer *sound_container, gchar *filename); guint ags_sfz_file_get_level_count(AgsSoundContainer *sound_container); guint ags_sfz_file_get_nesting_level(AgsSoundContainer *sound_container); gchar* ags_sfz_file_get_level_id(AgsSoundContainer *sound_container); guint ags_sfz_file_get_level_index(AgsSoundContainer *sound_container); guint ags_sfz_file_level_up(AgsSoundContainer *sound_container, guint level_count); guint ags_sfz_file_select_level_by_id(AgsSoundContainer *sound_container, gchar *level_id); guint ags_sfz_file_select_level_by_index(AgsSoundContainer *sound_container, guint level_index); gchar** ags_sfz_file_get_sublevel_name(AgsSoundContainer *sound_container); GList* ags_sfz_file_get_resource_all(AgsSoundContainer *sound_container); GList* ags_sfz_file_get_resource_by_name(AgsSoundContainer *sound_container, gchar *resource_name); GList* ags_sfz_file_get_resource_by_index(AgsSoundContainer *sound_container, guint resource_index); GList* ags_sfz_file_get_resource_current(AgsSoundContainer *sound_container); void ags_sfz_file_close(AgsSoundContainer *sound_container); gchar* ags_sfz_file_parse_skip_comments_and_blanks(gchar *buffer, gsize buffer_length, gchar **iter); /** * SECTION:ags_sfz_file * @short_description: SFZ file * @title: AgsSFZFile * @section_id: * @include: ags/audio/file/ags_sfz_file.h * * #AgsSFZFile is the base object to ineract with SFZ files. */ enum{ PROP_0, PROP_SOUNDCARD, PROP_FILENAME, PROP_MODE, PROP_GROUP, PROP_REGION, PROP_SAMPLE, }; static gpointer ags_sfz_file_parent_class = NULL; static GMutex regex_mutex; GType ags_sfz_file_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sfz_file = 0; static const GTypeInfo ags_sfz_file_info = { sizeof (AgsSFZFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sfz_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSFZFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sfz_file_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sfz_file_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_container_interface_info = { (GInterfaceInitFunc) ags_sfz_file_sound_container_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sfz_file = g_type_register_static(G_TYPE_OBJECT, "AgsSFZFile", &ags_sfz_file_info, 0); g_type_add_interface_static(ags_type_sfz_file, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_sfz_file, AGS_TYPE_SOUND_CONTAINER, &ags_sound_container_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sfz_file); } return g_define_type_id__volatile; } void ags_sfz_file_class_init(AgsSFZFileClass *sfz_file) { GObjectClass *gobject; GParamSpec *param_spec; ags_sfz_file_parent_class = g_type_class_peek_parent(sfz_file); /* GObjectClass */ gobject = (GObjectClass *) sfz_file; gobject->set_property = ags_sfz_file_set_property; gobject->get_property = ags_sfz_file_get_property; gobject->dispose = ags_sfz_file_dispose; gobject->finalize = ags_sfz_file_finalize; /* properties */ /** * AgsSFZFile:soundcard: * * The assigned soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of sfz_file"), i18n_pspec("The soundcard what sfz_file has it's presets"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsSFZFile:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename to open"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsSFZFile:mode: * * The assigned mode. * * Since: 3.0.0 */ param_spec = g_param_spec_string("mode", i18n_pspec("the mode"), i18n_pspec("The mode to open the file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MODE, param_spec); /** * AgsSFZFile:group: (type GList(AgsSFZGroup)) (transfer full) * * The containing groups. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("group", i18n_pspec("containing group"), i18n_pspec("The containing groups"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GROUP, param_spec); /** * AgsSFZFile:region: (type GList(AgsSFZRegion)) (transfer full) * * The containing regions. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("region", i18n_pspec("containing region"), i18n_pspec("The containing regions"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REGION, param_spec); /** * AgsSFZFile:sample: (type GList(AgsSFZSample)) (transfer full) * * The containing samples. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("sample", i18n_pspec("containing sample"), i18n_pspec("The containing samples"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); } void ags_sfz_file_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_sfz_file_get_uuid; connectable->has_resource = ags_sfz_file_has_resource; connectable->is_ready = ags_sfz_file_is_ready; connectable->add_to_registry = ags_sfz_file_add_to_registry; connectable->remove_from_registry = ags_sfz_file_remove_from_registry; connectable->list_resource = ags_sfz_file_list_resource; connectable->xml_compose = ags_sfz_file_xml_compose; connectable->xml_parse = ags_sfz_file_xml_parse; connectable->is_connected = ags_sfz_file_is_connected; connectable->connect = ags_sfz_file_connect; connectable->disconnect = ags_sfz_file_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_sfz_file_sound_container_interface_init(AgsSoundContainerInterface *sound_container) { sound_container->open = ags_sfz_file_open; sound_container->get_level_count = ags_sfz_file_get_level_count; sound_container->get_nesting_level = ags_sfz_file_get_nesting_level; sound_container->get_level_id = ags_sfz_file_get_level_id; sound_container->get_level_index = ags_sfz_file_get_level_index; sound_container->get_sublevel_name = ags_sfz_file_get_sublevel_name; sound_container->level_up = ags_sfz_file_level_up; sound_container->select_level_by_id = ags_sfz_file_select_level_by_id; sound_container->select_level_by_index = ags_sfz_file_select_level_by_index; sound_container->get_resource_all = ags_sfz_file_get_resource_all; sound_container->get_resource_by_name = ags_sfz_file_get_resource_by_name; sound_container->get_resource_by_index = ags_sfz_file_get_resource_by_index; sound_container->get_resource_current = ags_sfz_file_get_resource_current; sound_container->close = ags_sfz_file_close; } void ags_sfz_file_init(AgsSFZFile *sfz_file) { guint i; sfz_file->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(sfz_file->obj_mutex)); /* uuid */ sfz_file->uuid = ags_uuid_alloc(); ags_uuid_generate(sfz_file->uuid); sfz_file->soundcard = NULL; sfz_file->filename = NULL; sfz_file->mode = AGS_SFZ_FILE_READ; sfz_file->file = NULL; sfz_file->nesting_level = 0; sfz_file->level_id = NULL; sfz_file->level_index = 0; sfz_file->reader = NULL; sfz_file->writer = NULL; sfz_file->group = NULL; sfz_file->region = NULL; sfz_file->sample = NULL; /* selected */ sfz_file->index_selected = (guint *) malloc(2 * sizeof(guint)); memset(sfz_file->index_selected, 0, 2 * sizeof(guint)); sfz_file->name_selected = (gchar **) malloc(3 * sizeof(gchar *)); for(i = 0; i < 3; i++){ sfz_file->name_selected[i] = NULL; } sfz_file->current_sample = NULL; sfz_file->audio_signal= NULL; } void ags_sfz_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSFZFile *sfz_file; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(gobject); /* get audio file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(sfz_file_mutex); if(soundcard == ((GObject *) sfz_file->soundcard)){ g_rec_mutex_unlock(sfz_file_mutex); return; } if(sfz_file->soundcard != NULL){ g_object_unref(sfz_file->soundcard); } if(soundcard != NULL){ g_object_ref(G_OBJECT(soundcard)); } sfz_file->soundcard = (GObject *) soundcard; g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = (gchar *) g_value_get_string(value); ags_sound_container_open(AGS_SOUND_CONTAINER(sfz_file), filename); } break; case PROP_MODE: { gchar *mode; mode = (gchar *) g_value_get_string(value); g_rec_mutex_lock(sfz_file_mutex); sfz_file->mode = mode; g_rec_mutex_lock(sfz_file_mutex); } break; case PROP_GROUP: { GObject *group; group = g_value_get_pointer(value); g_rec_mutex_lock(sfz_file_mutex); if(group == NULL || g_list_find(sfz_file->group, group) != NULL){ g_rec_mutex_unlock(sfz_file_mutex); return; } g_object_ref(group); sfz_file->group = g_list_prepend(sfz_file->group, group); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_REGION: { GObject *region; region = g_value_get_pointer(value); g_rec_mutex_lock(sfz_file_mutex); if(region == NULL || g_list_find(sfz_file->region, region) != NULL){ g_rec_mutex_unlock(sfz_file_mutex); return; } g_object_ref(region); sfz_file->region = g_list_prepend(sfz_file->region, region); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_SAMPLE: { GObject *sample; sample = g_value_get_pointer(value); g_rec_mutex_lock(sfz_file_mutex); if(sample == NULL || g_list_find(sfz_file->sample, sample) != NULL){ g_rec_mutex_unlock(sfz_file_mutex); return; } g_object_ref(sample); sfz_file->sample = g_list_prepend(sfz_file->sample, sample); g_rec_mutex_unlock(sfz_file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sfz_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSFZFile *sfz_file; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(gobject); /* get audio file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); switch(prop_id){ case PROP_SOUNDCARD: { g_rec_mutex_lock(sfz_file_mutex); g_value_set_object(value, sfz_file->soundcard); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(sfz_file_mutex); g_value_set_string(value, sfz_file->filename); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_MODE: { g_rec_mutex_lock(sfz_file_mutex); g_value_set_string(value, sfz_file->mode); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_GROUP: { g_rec_mutex_lock(sfz_file_mutex); g_value_set_pointer(value, g_list_copy_deep(sfz_file->group, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_REGION: { g_rec_mutex_lock(sfz_file_mutex); g_value_set_pointer(value, g_list_copy_deep(sfz_file->region, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(sfz_file_mutex); } break; case PROP_SAMPLE: { g_rec_mutex_lock(sfz_file_mutex); g_value_set_pointer(value, g_list_copy_deep(sfz_file->sample, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(sfz_file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_sfz_file_dispose(GObject *gobject) { AgsSFZFile *sfz_file; sfz_file = AGS_SFZ_FILE(gobject); if(sfz_file->group != NULL){ g_list_free_full(sfz_file->group, g_object_unref); sfz_file->group = NULL; } if(sfz_file->region != NULL){ g_list_free_full(sfz_file->region, g_object_unref); sfz_file->region = NULL; } if(sfz_file->sample != NULL){ g_list_free_full(sfz_file->sample, g_object_unref); sfz_file->sample = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sfz_file_parent_class)->dispose(gobject); } void ags_sfz_file_finalize(GObject *gobject) { AgsSFZFile *sfz_file; sfz_file = AGS_SFZ_FILE(gobject); if(sfz_file->soundcard != NULL){ g_object_unref(sfz_file->soundcard); } g_free(sfz_file->filename); g_free(sfz_file->mode); if(sfz_file->reader != NULL){ g_object_unref(sfz_file->reader); } if(sfz_file->group != NULL){ g_list_free_full(sfz_file->group, g_object_unref); } if(sfz_file->region != NULL){ g_list_free_full(sfz_file->region, g_object_unref); } if(sfz_file->sample != NULL){ g_list_free_full(sfz_file->sample, g_object_unref); } g_list_free_full(sfz_file->audio_signal, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_sfz_file_parent_class)->finalize(gobject); } AgsUUID* ags_sfz_file_get_uuid(AgsConnectable *connectable) { AgsSFZFile *sfz_file; AgsUUID *ptr; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(connectable); /* get audio file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* get UUID */ g_rec_mutex_lock(sfz_file_mutex); ptr = sfz_file->uuid; g_rec_mutex_unlock(sfz_file_mutex); return(ptr); } gboolean ags_sfz_file_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_sfz_file_is_ready(AgsConnectable *connectable) { AgsSFZFile *sfz_file; gboolean is_ready; sfz_file = AGS_SFZ_FILE(connectable); /* check is ready */ is_ready = ags_sfz_file_test_flags(sfz_file, AGS_SFZ_FILE_ADDED_TO_REGISTRY); return(is_ready); } void ags_sfz_file_add_to_registry(AgsConnectable *connectable) { AgsSFZFile *sfz_file; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } sfz_file = AGS_SFZ_FILE(connectable); ags_sfz_file_set_flags(sfz_file, AGS_SFZ_FILE_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) sfz_file); ags_registry_add_entry(registry, entry); } } void ags_sfz_file_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_sfz_file_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_sfz_file_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_sfz_file_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_sfz_file_is_connected(AgsConnectable *connectable) { AgsSFZFile *sfz_file; gboolean is_connected; sfz_file = AGS_SFZ_FILE(connectable); /* check is connected */ is_connected = ags_sfz_file_test_flags(sfz_file, AGS_SFZ_FILE_CONNECTED); return(is_connected); } void ags_sfz_file_connect(AgsConnectable *connectable) { AgsSFZFile *sfz_file; if(ags_connectable_is_connected(connectable)){ return; } sfz_file = AGS_SFZ_FILE(connectable); ags_sfz_file_set_flags(sfz_file, AGS_SFZ_FILE_CONNECTED); } void ags_sfz_file_disconnect(AgsConnectable *connectable) { AgsSFZFile *sfz_file; if(!ags_connectable_is_connected(connectable)){ return; } sfz_file = AGS_SFZ_FILE(connectable); ags_sfz_file_unset_flags(sfz_file, AGS_SFZ_FILE_CONNECTED); } gboolean ags_sfz_file_open(AgsSoundContainer *sound_container, gchar *filename) { AgsSFZFile *sfz_file; FILE *file; gchar *old_filename; gboolean retval; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* get some fields */ g_rec_mutex_lock(sfz_file_mutex); old_filename = sfz_file->filename; g_rec_mutex_unlock(sfz_file_mutex); /* close current */ if(old_filename != NULL){ ags_sound_container_close(sound_container); g_free(old_filename); } /* check suffix */ sfz_file->filename = g_strdup(filename); if(!ags_sfz_file_check_suffix(filename)){ g_message("unsupported suffix"); return(FALSE); } /* open file */ file = fopen(filename, "r"); g_rec_mutex_lock(sfz_file_mutex); sfz_file->file = file; g_rec_mutex_unlock(sfz_file_mutex); if(file == NULL){ g_message("failed to open file"); return(FALSE); } /* load samples */ retval = TRUE; ags_sfz_file_parse(sfz_file); return(retval); } guint ags_sfz_file_get_level_count(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; sfz_file = AGS_SFZ_FILE(sound_container); return(3); } guint ags_sfz_file_get_nesting_level(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; guint nesting_level; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* get nesting level */ g_rec_mutex_lock(sfz_file_mutex); nesting_level = sfz_file->nesting_level; g_rec_mutex_unlock(sfz_file_mutex); return(nesting_level); } gchar* ags_sfz_file_get_level_id(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; gchar *level_id; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* get level id */ g_rec_mutex_lock(sfz_file_mutex); level_id = sfz_file->level_id; g_rec_mutex_unlock(sfz_file_mutex); return(level_id); } guint ags_sfz_file_get_level_index(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; guint level_index; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* get nesting level */ g_rec_mutex_lock(sfz_file_mutex); level_index = sfz_file->level_index; g_rec_mutex_unlock(sfz_file_mutex); return(level_index); } gchar** ags_sfz_file_get_sublevel_name(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; guint sublevel; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* sublevel */ sublevel = ags_sound_container_get_nesting_level(AGS_SOUND_CONTAINER(sfz_file)); switch(sublevel){ case AGS_SFZ_LEVEL_FILENAME: { gchar **sublevel_name; sublevel_name = (gchar **) malloc(2 * sizeof(gchar*)); sublevel_name[0] = g_strdup(sfz_file->filename); sublevel_name[1] = NULL; return(sublevel_name); } case AGS_SFZ_LEVEL_SAMPLE: { GList *start_list, *list; gchar **sublevel_name; guint sample_count; guint i; g_object_get(sfz_file, "sample", &start_list, NULL); list = start_list; sample_count = g_list_length(start_list); sublevel_name = (gchar **) malloc((sample_count + 1) * sizeof(gchar*)); for(i = 0; i < sample_count; i++){ gchar *str; g_object_get(list->data, "filename", &str, NULL); sublevel_name[i] = str; list = list->next; } sublevel_name[i] = NULL; g_list_free_full(start_list, g_object_unref); return(sublevel_name); } }; return(NULL); } guint ags_sfz_file_level_up(AgsSoundContainer *sound_container, guint level_count) { AgsSFZFile *sfz_file; guint retval; GRecMutex *sfz_file_mutex; if(level_count == 0){ return(0); } sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* check boundaries */ if(ags_sound_container_get_nesting_level(AGS_SOUND_CONTAINER(sfz_file)) >= level_count){ /* level up */ g_rec_mutex_lock(sfz_file_mutex); retval = level_count; sfz_file->nesting_level -= level_count; g_rec_mutex_unlock(sfz_file_mutex); }else{ /* level up */ g_rec_mutex_lock(sfz_file_mutex); retval = sfz_file->nesting_level; sfz_file->nesting_level = 0; g_rec_mutex_unlock(sfz_file_mutex); } return(retval); } guint ags_sfz_file_select_level_by_id(AgsSoundContainer *sound_container, gchar *level_id) { return(0); } guint ags_sfz_file_select_level_by_index(AgsSoundContainer *sound_container, guint level_index) { AgsSFZFile *sfz_file; guint sublevel; guint retval; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* sublevel */ sublevel = ags_sound_container_get_nesting_level(AGS_SOUND_CONTAINER(sfz_file)); retval = 0; switch(sublevel){ case AGS_SFZ_LEVEL_FILENAME: { if(ags_sfz_file_select_sample(sfz_file, level_index)){ retval = AGS_SFZ_LEVEL_FILENAME; } } break; case AGS_SFZ_LEVEL_SAMPLE: { retval = AGS_SFZ_LEVEL_SAMPLE; } break; }; return(retval); } GList* ags_sfz_file_get_resource_all(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; GList *resource; sfz_file = AGS_SFZ_FILE(sound_container); resource = NULL; //TODO:JK: implement me return(resource); } GList* ags_sfz_file_get_resource_by_name(AgsSoundContainer *sound_container, gchar *resource_name) { //TODO:JK: implement me return(NULL); } GList* ags_sfz_file_get_resource_by_index(AgsSoundContainer *sound_container, guint resource_index) { //TODO:JK: implement me return(NULL); } GList* ags_sfz_file_get_resource_current(AgsSoundContainer *sound_container) { AgsSFZFile *sfz_file; GList *sound_resource; GRecMutex *sfz_file_mutex; sfz_file = AGS_SFZ_FILE(sound_container); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* get sound resource */ sound_resource = NULL; g_object_get(sfz_file, "sample", &sound_resource, NULL); return(sound_resource); } void ags_sfz_file_close(AgsSoundContainer *sound_container) { //TODO:JK: implement me } /** * ags_sfz_file_test_flags: * @sfz_file: the #AgsSFZFile * @flags: the flags * * Test @flags to be set on @sfz_file. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sfz_file_test_flags(AgsSFZFile *sfz_file, guint flags) { gboolean retval; GRecMutex *sfz_file_mutex; if(!AGS_IS_SFZ_FILE(sfz_file)){ return(FALSE); } /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* test */ g_rec_mutex_lock(sfz_file_mutex); retval = (flags & (sfz_file->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(sfz_file_mutex); return(retval); } /** * ags_sfz_file_set_flags: * @sfz_file: the #AgsSFZFile * @flags: see #AgsSFZFileFlags-enum * * Enable a feature of @sfz_file. * * Since: 3.0.0 */ void ags_sfz_file_set_flags(AgsSFZFile *sfz_file, guint flags) { GRecMutex *sfz_file_mutex; if(!AGS_IS_SFZ_FILE(sfz_file)){ return; } /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(sfz_file_mutex); sfz_file->flags |= flags; g_rec_mutex_unlock(sfz_file_mutex); } /** * ags_sfz_file_unset_flags: * @sfz_file: the #AgsSFZFile * @flags: see #AgsSFZFileFlags-enum * * Disable a feature of @sfz_file. * * Since: 3.0.0 */ void ags_sfz_file_unset_flags(AgsSFZFile *sfz_file, guint flags) { GRecMutex *sfz_file_mutex; if(!AGS_IS_SFZ_FILE(sfz_file)){ return; } /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(sfz_file_mutex); sfz_file->flags &= (~flags); g_rec_mutex_unlock(sfz_file_mutex); } /** * ags_sfz_file_select_sample: * @sfz_file: the #AgsSFZFile * @sample_index: the sample index * * Select sample. * * Returns: %TRUE on success, else %FALSE on failure * * Since: 3.0.0 */ gboolean ags_sfz_file_select_sample(AgsSFZFile *sfz_file, guint sample_index) { GList *start_list, *list; gboolean success; if(!AGS_IS_SFZ_FILE(sfz_file)){ return(FALSE); } success = FALSE; g_object_get(sfz_file, "sample", &start_list, NULL); if(start_list != NULL){ list = start_list; if(sample_index < g_list_length(start_list)){ gchar *filename; success = TRUE; list = g_list_nth(start_list, sample_index); /* selected index and name */ sfz_file->index_selected[AGS_SFZ_LEVEL_SAMPLE] = sample_index; g_free(sfz_file->name_selected[AGS_SFZ_LEVEL_SAMPLE]); g_object_get(list->data, "filename", &filename, NULL); sfz_file->name_selected[AGS_SFZ_LEVEL_SAMPLE] = filename; /* container */ sfz_file->current_sample = (AgsSFZSample *) list->data; } } return(success); } /** * ags_sfz_file_get_range: * @sfz_file: the #AgsSFZFile * @hikey: (out): the return location of key high * @lokey: (out): the return location of key low * * Get range of @sfz_file, set return location @hikey and @lokey. * * Since: 3.0.0 */ void ags_sfz_file_get_range(AgsSFZFile *sfz_file, glong *hikey, glong *lokey) { GList *start_group, *group; GList *start_region, *region; gchar *str; glong upper, lower; glong value; int retval; if(!AGS_IS_SFZ_FILE(sfz_file)){ return; } g_object_get(sfz_file, "group", &start_group, "region", &start_region, NULL); upper = 0; lower = AGS_SFZ_FILE_LOOP_MAX; group = start_group; while(group != NULL){ /* hikey */ str = ags_sfz_group_lookup_control(group->data, "hikey"); value = 0; if(str != NULL){ retval = sscanf(str, "%lu", &value); if(retval <= 0){ glong tmp; guint tmp_retval; tmp_retval = ags_diatonic_scale_note_to_midi_key(str, &tmp); if(retval > 0){ value = tmp; } } } if(value > upper){ upper = value; } /* lokey */ str = ags_sfz_group_lookup_control(group->data, "hikey"); value = AGS_SFZ_FILE_LOOP_MAX; if(str != NULL){ retval = sscanf(str, "%lu", &value); if(retval <= 0){ glong tmp; guint tmp_retval; tmp_retval = ags_diatonic_scale_note_to_midi_key(str, &tmp); if(retval > 0){ value = tmp; } } } if(value < lower){ lower = value; } /* iterate */ group = group->next; } region = start_region; while(region != NULL){ /* hikey */ str = ags_sfz_region_lookup_control(region->data, "hikey"); value = 0; if(str != NULL){ retval = sscanf(str, "%lu", &value); if(retval <= 0){ glong tmp; guint tmp_retval; tmp_retval = ags_diatonic_scale_note_to_midi_key(str, &tmp); if(retval > 0){ value = tmp; } } } if(value > upper){ upper = value; } /* lokey */ str = ags_sfz_region_lookup_control(region->data, "hikey"); value = AGS_SFZ_FILE_LOOP_MAX; if(str != NULL){ retval = sscanf(str, "%lu", &value); if(retval <= 0){ glong tmp; guint tmp_retval; tmp_retval = ags_diatonic_scale_note_to_midi_key(str, &tmp); if(retval > 0){ value = tmp; } } } if(value < lower){ lower = value; } /* iterate */ region = region->next; } /* set return location */ if(lokey < hikey){ if(lokey != NULL){ lokey[0] = lower; } if(hikey != NULL){ hikey[0] = upper; } }else{ if(lokey != NULL){ lokey[0] = 49; } if(hikey != NULL){ hikey[0] = 49; } } } /** * ags_sfz_file_check_suffix: * @filename: the filename * * Check @filename's suffix to be supported. * * Returns: %TRUE if supported, else %FALSE * * Since: 3.0.0 */ gboolean ags_sfz_file_check_suffix(gchar *filename) { if(g_str_has_suffix(filename, ".sfz")){ return(TRUE); } return(FALSE); } gchar* ags_sfz_file_parse_skip_comments_and_blanks(gchar *buffer, gsize buffer_length, gchar **iter) { gchar *look_ahead; gchar *next; if(iter == NULL){ return(NULL); } look_ahead = *iter; if(look_ahead == NULL){ return(NULL); } /* skip whitespaces and comments */ for(; (look_ahead < &(buffer[buffer_length])) && *look_ahead != '\0';){ /* skip comments */ if(buffer == look_ahead){ if(look_ahead + 1 < &(buffer[buffer_length]) && buffer[0] == '/' && buffer[1] == '/'){ next = strchr(look_ahead, '\n'); if(next != NULL){ look_ahead = next + 1; }else{ look_ahead = &(buffer[buffer_length]); break; } continue; } }else if(buffer[look_ahead - buffer - 1] == '\n' && look_ahead + 1 < &(buffer[buffer_length]) && look_ahead[0] == '/' && look_ahead[1] == '/'){ next = strchr(look_ahead, '\n'); if(next != NULL){ look_ahead = next + 1; }else{ look_ahead = &(buffer[buffer_length]); break; } continue; } /* spaces */ if(!(look_ahead[0] == ' ' || look_ahead[0] == '\t' || look_ahead[0] == '\n' || look_ahead[0] == '\r')){ break; }else{ look_ahead++; } } return(look_ahead); } /** * ags_sfz_file_parse: * @sfz_file: the #AgsSFZFile * * Parse @sfz_file. * * Since: 3.0.0 */ void ags_sfz_file_parse(AgsSFZFile *sfz_file) { AgsSFZGroup *current_group; AgsSFZRegion *current_region; AgsSFZSample *current_sample; FILE *file; struct stat *sb; GList *start_list, *list; regmatch_t match_arr[2]; gchar *filename; gchar *buffer, *iter; size_t n_read; gint nth_group; gint nth_region; gboolean group_active; gboolean region_active; gboolean sample_active; GRecMutex *sfz_file_mutex; static regex_t opcode_regex; static regex_t opcode_regex_next; static const gchar *opcode_pattern = "^([a-zA-Z_]+)\\="; static const gchar *opcode_pattern_next = "([a-zA-Z_]+)\\="; static const size_t max_matches = 2; static gboolean regex_compiled = FALSE; if(!AGS_IS_SFZ_FILE(sfz_file)){ return; } g_message("SFZ parse"); /* get sfz_file mutex */ sfz_file_mutex = AGS_SFZ_FILE_GET_OBJ_MUTEX(sfz_file); /* stat file */ g_object_get(sfz_file, "filename", &filename, NULL); sb = (struct stat *) malloc(sizeof(struct stat)); stat(filename, sb); if(sb->st_size == 0){ g_free(filename); free(sb); return; } g_free(filename); /* read SFZ */ g_rec_mutex_lock(sfz_file_mutex); file = sfz_file->file; g_rec_mutex_unlock(sfz_file_mutex); buffer = (gchar *) malloc((sb->st_size + 1) * sizeof(gchar)); if(buffer == NULL){ free(sb); return; } n_read = fread(buffer, sizeof(gchar), sb->st_size, file); if(n_read != sb->st_size){ g_critical("number of read bytes doesn't match buffer size"); } buffer[sb->st_size] = '\0'; iter = buffer; current_group = NULL; current_region = NULL; current_sample = NULL; nth_group = -1; nth_region = -1; group_active = FALSE; region_active = FALSE; sample_active = FALSE; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&opcode_regex, opcode_pattern, REG_EXTENDED); ags_regcomp(&opcode_regex_next, opcode_pattern_next, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); do{ /* skip blanks and comments */ iter = ags_sfz_file_parse_skip_comments_and_blanks(buffer, sb->st_size, &iter); if(iter >= &(buffer[sb->st_size])){ break; } if(!g_ascii_strncasecmp(iter, "", 7)){ g_message("SFZ group"); nth_group++; group_active = TRUE; region_active = FALSE; sample_active = FALSE; current_group = ags_sfz_group_new(); g_object_set(sfz_file, "group", current_group, NULL); iter += 7; }else if(!g_ascii_strncasecmp(iter, "", 8)){ g_message("SFZ region"); nth_region++; region_active = TRUE; sample_active = FALSE; current_region = ags_sfz_region_new(); g_object_set(sfz_file, "region", current_region, NULL); iter += 8; }else if(ags_regexec(&opcode_regex, iter, max_matches, match_arr, 0) == 0){ gchar *opcode; gchar *str; gchar *next, *tmp0_next, *tmp1_next; iter += match_arr[1].rm_so; opcode = g_strndup(iter, match_arr[1].rm_eo - match_arr[1].rm_so); iter += strlen(opcode) + 1; if(ags_regexec(&opcode_regex_next, iter, max_matches, match_arr, 0) == 0){ tmp0_next = strchr(iter, '\n'); tmp1_next = strchr(iter, '\r'); if((tmp0_next != NULL || tmp1_next != NULL) && ((tmp0_next != NULL && tmp0_next < iter + match_arr[1].rm_so) || (tmp1_next != NULL && tmp1_next < iter + match_arr[1].rm_so))){ if(tmp0_next != NULL && (tmp1_next == NULL || tmp0_next < tmp1_next)){ next = tmp0_next; }else{ next = tmp1_next; } }else{ next = iter + match_arr[1].rm_so; } }else{ tmp0_next = strchr(iter, '\n'); tmp1_next = strchr(iter, '\r'); if(tmp0_next != NULL || tmp1_next != NULL){ if(tmp0_next != NULL && (tmp1_next == NULL || tmp0_next < tmp1_next)){ next = tmp0_next; }else{ next = tmp1_next; } }else{ next = &(buffer[sb->st_size]); } } while(next > iter){ if((next - 1)[0] == ' '){ next--; }else{ break; } } str = g_strndup(iter, next - iter); iter = next; g_message("opcode - %s=%s", opcode, str); if(!g_ascii_strncasecmp(opcode, "sample", 6)){ gchar *filename; gchar *tmp; gboolean success; tmp = str; while((tmp = strchr(tmp, '\\')) != NULL){ tmp[0] = '/'; tmp++; } sample_active = TRUE; if(g_path_is_absolute(str)){ filename = g_strdup(str); }else{ gchar *path; path = g_path_get_dirname(sfz_file->filename); filename = g_strdup_printf("%s/%s", path, str); } current_sample = ags_sfz_sample_new(); g_object_set(current_sample, "group", current_group, "region", current_region, NULL); success = ags_sound_resource_open(AGS_SOUND_RESOURCE(current_sample), filename); if(!success){ g_message("failed to open %s", filename); } g_object_set(sfz_file, "sample", current_sample, NULL); if(region_active){ g_object_set(current_region, "sample", current_sample, NULL); }else if(group_active){ g_object_set(current_group, "sample", current_sample, NULL); } g_free(filename); } if(region_active){ ags_sfz_region_insert_control(current_region, opcode, str); }else if(group_active){ ags_sfz_group_insert_control(current_group, opcode, str); }else{ g_warning("SFZ neither group nor region defined"); } }else{ /* bad byte */ iter++; } }while(iter < &(buffer[sb->st_size])); free(sb); free(buffer); /* apply loop start/end */ g_object_get(sfz_file, "sample", &start_list, NULL); list = start_list; while(list != NULL){ AgsSFZGroup *group; AgsSFZRegion *region; AgsSFZSample *sample; guint loop_start, loop_end; sample = (AgsSFZSample *) list->data; loop_start = 0; loop_end = 0; g_object_get(sample, "group", &group, "region", ®ion, NULL); /* check group */ if(group != NULL){ gchar *str; str = ags_sfz_group_lookup_control(group, "loop_start"); if(str != NULL){ loop_start = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_sfz_group_lookup_control(group, "loop_end"); if(str != NULL){ loop_end = g_ascii_strtoull(str, NULL, 10); g_free(str); } } /* check region */ if(region != NULL){ gchar *str; str = ags_sfz_region_lookup_control(region, "loop_start"); if(str != NULL){ loop_start = g_ascii_strtoull(str, NULL, 10); g_free(str); } str = ags_sfz_region_lookup_control(region, "loop_end"); if(str != NULL){ loop_end = g_ascii_strtoull(str, NULL, 10); g_free(str); } } g_object_set(sample, "loop-start", loop_start, "loop-end", loop_end, NULL); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); } /** * ags_sfz_file_new: * * Creates an #AgsSFZFile. * * Returns: an empty #AgsSFZFile. * * Since: 3.0.0 */ AgsSFZFile* ags_sfz_file_new() { AgsSFZFile *sfz_file; sfz_file = (AgsSFZFile *) g_object_new(AGS_TYPE_SFZ_FILE, NULL); return(sfz_file); } gsequencer-3.1.3/ags/audio/file/ags_ipatch_sample.c0000644000175000017500000007043713607326656017232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_ipatch_sample_class_init(AgsIpatchSampleClass *ipatch_sample); void ags_ipatch_sample_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ipatch_sample_sound_resource_interface_init(AgsSoundResourceInterface *sound_resource); void ags_ipatch_sample_init(AgsIpatchSample *ipatch_sample); void ags_ipatch_sample_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ipatch_sample_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ipatch_sample_dispose(GObject *gobject); void ags_ipatch_sample_finalize(GObject *gobject); AgsUUID* ags_ipatch_sample_get_uuid(AgsConnectable *connectable); gboolean ags_ipatch_sample_has_resource(AgsConnectable *connectable); gboolean ags_ipatch_sample_is_ready(AgsConnectable *connectable); void ags_ipatch_sample_add_to_registry(AgsConnectable *connectable); void ags_ipatch_sample_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_ipatch_sample_list_resource(AgsConnectable *connectable); xmlNode* ags_ipatch_sample_xml_compose(AgsConnectable *connectable); void ags_ipatch_sample_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_ipatch_sample_is_connected(AgsConnectable *connectable); void ags_ipatch_sample_connect(AgsConnectable *connectable); void ags_ipatch_sample_disconnect(AgsConnectable *connectable); gboolean ags_ipatch_sample_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end); void ags_ipatch_sample_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format); void ags_ipatch_sample_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format); guint ags_ipatch_sample_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format); void ags_ipatch_sample_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format); void ags_ipatch_sample_flush(AgsSoundResource *sound_resource); void ags_ipatch_sample_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence); /** * SECTION:ags_ipatch_sample * @short_description: interfacing Soundfont2 related API of libinstpatch * @title: AgsIpatchSample * @section_id: * @include: ags/audio/file/ags_ipatch_sample.h * * #AgsIpatchSample is the base object to ineract with Soundfont2 related API. */ enum{ PROP_0, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_SAMPLE, }; static gpointer ags_ipatch_sample_parent_class = NULL; GType ags_ipatch_sample_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ipatch_sample = 0; static const GTypeInfo ags_ipatch_sample_info = { sizeof(AgsIpatchSampleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ipatch_sample_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsIpatchSample), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ipatch_sample_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ipatch_sample_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_resource_interface_info = { (GInterfaceInitFunc) ags_ipatch_sample_sound_resource_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ipatch_sample = g_type_register_static(G_TYPE_OBJECT, "AgsIpatchSample", &ags_ipatch_sample_info, 0); g_type_add_interface_static(ags_type_ipatch_sample, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_ipatch_sample, AGS_TYPE_SOUND_RESOURCE, &ags_sound_resource_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ipatch_sample); } return g_define_type_id__volatile; } void ags_ipatch_sample_class_init(AgsIpatchSampleClass *ipatch_sample) { GObjectClass *gobject; GParamSpec *param_spec; ags_ipatch_sample_parent_class = g_type_class_peek_parent(ipatch_sample); gobject = (GObjectClass *) ipatch_sample; gobject->set_property = ags_ipatch_sample_set_property; gobject->get_property = ags_ipatch_sample_get_property; gobject->dispose = ags_ipatch_sample_dispose; gobject->finalize = ags_ipatch_sample_finalize; /* properties */ /** * AgsIpatchSample:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsIpatchSample:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsIpatchSample:sample: * * The assigned output #IpatchSample. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sample", i18n_pspec("assigned sample"), i18n_pspec("The assigned sample"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); } void ags_ipatch_sample_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_ipatch_sample_get_uuid; connectable->has_resource = ags_ipatch_sample_has_resource; connectable->is_ready = ags_ipatch_sample_is_ready; connectable->add_to_registry = ags_ipatch_sample_add_to_registry; connectable->remove_from_registry = ags_ipatch_sample_remove_from_registry; connectable->list_resource = ags_ipatch_sample_list_resource; connectable->xml_compose = ags_ipatch_sample_xml_compose; connectable->xml_parse = ags_ipatch_sample_xml_parse; connectable->is_connected = ags_ipatch_sample_is_connected; connectable->connect = ags_ipatch_sample_connect; connectable->disconnect = ags_ipatch_sample_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_ipatch_sample_sound_resource_interface_init(AgsSoundResourceInterface *sound_resource) { sound_resource->open = NULL; sound_resource->rw_open = NULL; sound_resource->load = NULL; sound_resource->info = ags_ipatch_sample_info; sound_resource->set_presets = ags_ipatch_sample_set_presets; sound_resource->get_presets = ags_ipatch_sample_get_presets; sound_resource->read = ags_ipatch_sample_read; sound_resource->write = ags_ipatch_sample_write; sound_resource->flush = ags_ipatch_sample_flush; sound_resource->seek = ags_ipatch_sample_seek; sound_resource->close = NULL; } void ags_ipatch_sample_init(AgsIpatchSample *ipatch_sample) { AgsConfig *config; ipatch_sample->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(ipatch_sample->obj_mutex)); /* uuid */ ipatch_sample->uuid = ags_uuid_alloc(); ags_uuid_generate(ipatch_sample->uuid); config = ags_config_get_instance(); ipatch_sample->audio_channels = 1; ipatch_sample->audio_channel_written = (gint64 *) malloc(ipatch_sample->audio_channels * sizeof(gint64)); ipatch_sample->audio_channel_written[0] = -1; ipatch_sample->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); ipatch_sample->format = AGS_SOUNDCARD_DOUBLE; ipatch_sample->offset = 0; ipatch_sample->buffer_offset = 0; ipatch_sample->full_buffer = NULL; ipatch_sample->buffer = ags_stream_alloc(ipatch_sample->audio_channels * ipatch_sample->buffer_size, ipatch_sample->format); ipatch_sample->pointer = NULL; ipatch_sample->current = NULL; ipatch_sample->length = 0; ipatch_sample->sample = NULL; } void ags_ipatch_sample_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsIpatchSample *ipatch_sample; GRecMutex *ipatch_sample_mutex; ipatch_sample = AGS_IPATCH_SAMPLE(gobject); /* get ipatch sample mutex */ ipatch_sample_mutex = AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(ipatch_sample); switch(prop_id){ case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(ipatch_sample_mutex); if(buffer_size == ipatch_sample->buffer_size){ g_rec_mutex_unlock(ipatch_sample_mutex); return; } ags_stream_free(ipatch_sample->buffer); ipatch_sample->buffer_size = buffer_size; ipatch_sample->buffer = ags_stream_alloc(ipatch_sample->buffer_size, ipatch_sample->format); g_rec_mutex_unlock(ipatch_sample_mutex); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(ipatch_sample_mutex); if(format == ipatch_sample->format){ g_rec_mutex_unlock(ipatch_sample_mutex); return; } ags_stream_free(ipatch_sample->buffer); ipatch_sample->format = format; ipatch_sample->buffer = ags_stream_alloc(ipatch_sample->buffer_size, ipatch_sample->format); g_rec_mutex_unlock(ipatch_sample_mutex); } break; case PROP_SAMPLE: { #ifdef AGS_WITH_LIBINSTPATCH IpatchContainer *sample; sample = g_value_get_object(value); g_rec_mutex_lock(ipatch_sample_mutex); if(ipatch_sample->sample == sample){ g_rec_mutex_unlock(ipatch_sample_mutex); return; } if(ipatch_sample->sample != NULL){ g_object_unref(ipatch_sample->sample); } if(sample != NULL){ g_object_ref(sample); } ipatch_sample->sample = sample; g_rec_mutex_unlock(ipatch_sample_mutex); #endif } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_ipatch_sample_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsIpatchSample *ipatch_sample; GRecMutex *ipatch_sample_mutex; ipatch_sample = (AgsIpatchSample *) gobject; /* get ipatch sample mutex */ ipatch_sample_mutex = AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(ipatch_sample); switch(prop_id){ case PROP_BUFFER_SIZE: { g_rec_mutex_lock(ipatch_sample_mutex); g_value_set_uint(value, ipatch_sample->buffer_size); g_rec_mutex_unlock(ipatch_sample_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(ipatch_sample_mutex); g_value_set_uint(value, ipatch_sample->format); g_rec_mutex_unlock(ipatch_sample_mutex); } break; case PROP_SAMPLE: { g_rec_mutex_lock(ipatch_sample_mutex); g_value_set_object(value, ipatch_sample->sample); g_rec_mutex_unlock(ipatch_sample_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_ipatch_sample_dispose(GObject *gobject) { AgsIpatchSample *ipatch_sample; ipatch_sample = AGS_IPATCH_SAMPLE(gobject); if(ipatch_sample->sample != NULL){ g_object_unref(ipatch_sample->sample); ipatch_sample->sample = NULL; } /* call parent */ G_OBJECT_CLASS(ags_ipatch_sample_parent_class)->dispose(gobject); } void ags_ipatch_sample_finalize(GObject *gobject) { AgsIpatchSample *ipatch_sample; ipatch_sample = AGS_IPATCH_SAMPLE(gobject); ags_stream_free(ipatch_sample->buffer); if(ipatch_sample->sample != NULL){ g_object_unref(ipatch_sample->sample); } /* call parent */ G_OBJECT_CLASS(ags_ipatch_sample_parent_class)->finalize(gobject); } AgsUUID* ags_ipatch_sample_get_uuid(AgsConnectable *connectable) { AgsIpatchSample *ipatch_sample; AgsUUID *ptr; GRecMutex *ipatch_sample_mutex; ipatch_sample = AGS_IPATCH_SAMPLE(connectable); /* get audio file mutex */ ipatch_sample_mutex = AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(ipatch_sample); /* get UUID */ g_rec_mutex_lock(ipatch_sample_mutex); ptr = ipatch_sample->uuid; g_rec_mutex_unlock(ipatch_sample_mutex); return(ptr); } gboolean ags_ipatch_sample_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_ipatch_sample_is_ready(AgsConnectable *connectable) { AgsIpatchSample *ipatch_sample; gboolean is_ready; ipatch_sample = AGS_IPATCH_SAMPLE(connectable); /* check is ready */ is_ready = ags_ipatch_sample_test_flags(ipatch_sample, AGS_IPATCH_SAMPLE_ADDED_TO_REGISTRY); return(is_ready); } void ags_ipatch_sample_add_to_registry(AgsConnectable *connectable) { AgsIpatchSample *ipatch_sample; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } ipatch_sample = AGS_IPATCH_SAMPLE(connectable); ags_ipatch_sample_set_flags(ipatch_sample, AGS_IPATCH_SAMPLE_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) ipatch_sample); ags_registry_add_entry(registry, entry); } } void ags_ipatch_sample_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_ipatch_sample_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_ipatch_sample_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_ipatch_sample_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_ipatch_sample_is_connected(AgsConnectable *connectable) { AgsIpatchSample *ipatch_sample; gboolean is_connected; ipatch_sample = AGS_IPATCH_SAMPLE(connectable); /* check is connected */ is_connected = ags_ipatch_sample_test_flags(ipatch_sample, AGS_IPATCH_SAMPLE_CONNECTED); return(is_connected); } void ags_ipatch_sample_connect(AgsConnectable *connectable) { AgsIpatchSample *ipatch_sample; if(ags_connectable_is_connected(connectable)){ return; } ipatch_sample = AGS_IPATCH_SAMPLE(connectable); ags_ipatch_sample_set_flags(ipatch_sample, AGS_IPATCH_SAMPLE_CONNECTED); } void ags_ipatch_sample_disconnect(AgsConnectable *connectable) { AgsIpatchSample *ipatch_sample; if(!ags_connectable_is_connected(connectable)){ return; } ipatch_sample = AGS_IPATCH_SAMPLE(connectable); ags_ipatch_sample_unset_flags(ipatch_sample, AGS_IPATCH_SAMPLE_CONNECTED); } gboolean ags_ipatch_sample_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end) { AgsIpatchSample *ipatch_sample; guint sample_frame_count; guint sample_loop_start, sample_loop_end; ipatch_sample = AGS_IPATCH_SAMPLE(sound_resource); sample_frame_count = 0; sample_loop_start = 0; sample_loop_end = 0; #ifdef AGS_WITH_LIBINSTPATCH g_object_get(ipatch_sample->sample, "sample-size", &sample_frame_count, "loop-start", &sample_loop_start, "loop-end", &sample_loop_end, NULL); #endif if(frame_count != NULL){ *frame_count = sample_frame_count; } if(loop_start != NULL){ *loop_start = sample_loop_start; } if(loop_end != NULL){ *loop_end = sample_loop_end; } return(TRUE); } void ags_ipatch_sample_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format) { AgsIpatchSample *ipatch_sample; gint sample_format; ipatch_sample = AGS_IPATCH_SAMPLE(sound_resource); if(channels > IPATCH_SAMPLE_MAX_CHANNELS){ g_critical("max channels exceeded"); return; } #ifdef AGS_WITH_LIBINSTPATCH g_object_get(ipatch_sample->sample, "sample-format", &sample_format, NULL); //NOTE:JK: this won't work // sample_format &= (~IPATCH_SAMPLE_CHANNEL_MASK); // sample_format |= (IPATCH_SAMPLE_CHANNEL_MASK & ((channels - 1) << IPATCH_SAMPLE_CHANNEL_SHIFT)); g_object_set(ipatch_sample->sample, "sample-rate", samplerate, // "sample-format", sample_format, NULL); #endif g_object_set(ipatch_sample, "buffer-size", buffer_size, "format", format, NULL); } void ags_ipatch_sample_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format) { AgsIpatchSample *ipatch_sample; gint sample_format; guint sample_channels; guint sample_samplerate; ipatch_sample = AGS_IPATCH_SAMPLE(sound_resource); sample_format = 0; sample_samplerate = 0; #ifdef AGS_WITH_LIBINSTPATCH g_object_get(ipatch_sample->sample, "sample-format", &sample_format, "sample-rate", &sample_samplerate, NULL); #endif if(channels != NULL){ *channels = IPATCH_SAMPLE_FORMAT_GET_CHANNEL_COUNT(sample_format); } if(samplerate != NULL){ *samplerate = sample_samplerate; } if(buffer_size != NULL){ *buffer_size = ipatch_sample->buffer_size; } if(format != NULL){ *format = ipatch_sample->format; } } guint ags_ipatch_sample_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format) { AgsIpatchSample *ipatch_sample; guint total_frame_count; guint copy_mode; GError *error; ipatch_sample = AGS_IPATCH_SAMPLE(sound_resource); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(ipatch_sample->format)); #ifdef AGS_WITH_LIBINSTPATCH ags_sound_resource_info(sound_resource, &total_frame_count, NULL, NULL); if(ipatch_sample->offset >= total_frame_count){ return(0); } if(ipatch_sample->offset + frame_count >= total_frame_count){ frame_count = total_frame_count - ipatch_sample->offset; } error = NULL; switch(ipatch_sample->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { ipatch_sample_read_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_8BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(0, audio_channel), &error); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { ipatch_sample_read_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_16BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(0, audio_channel), &error); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ipatch_sample_read_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_24BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(0, audio_channel), &error); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ipatch_sample_read_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_32BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(0, audio_channel), &error); } break; case AGS_SOUNDCARD_FLOAT: { ipatch_sample_read_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_FLOAT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(0, audio_channel), &error); } break; case AGS_SOUNDCARD_DOUBLE: { ipatch_sample_read_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_DOUBLE | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(0, audio_channel), &error); } break; default: { g_warning("unsupported format"); } } if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ags_audio_buffer_util_copy_buffer_to_buffer(dbuffer, daudio_channels, 0, ipatch_sample->buffer, 1, 0, frame_count, copy_mode); ipatch_sample->offset += frame_count; #else frame_count = 0; #endif return(frame_count); } void ags_ipatch_sample_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format) { AgsIpatchSample *ipatch_sample; guint copy_mode; GError *error; ipatch_sample = AGS_IPATCH_SAMPLE(sound_resource); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(ipatch_sample->format), ags_audio_buffer_util_format_from_soundcard(format)); ags_audio_buffer_util_copy_buffer_to_buffer(ipatch_sample->buffer, 1, audio_channel, sbuffer, saudio_channels, 0, frame_count, copy_mode); error = NULL; switch(ipatch_sample->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { ipatch_sample_write_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_8BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(audio_channel, 0), &error); } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { ipatch_sample_write_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_16BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(audio_channel, 0), &error); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { ipatch_sample_write_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_24BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(audio_channel, 0), &error); } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { ipatch_sample_write_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_32BIT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(audio_channel, 0), &error); } break; case AGS_SOUNDCARD_FLOAT: { ipatch_sample_write_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_FLOAT | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(audio_channel, 0), &error); } break; case AGS_SOUNDCARD_DOUBLE: { ipatch_sample_write_transform(IPATCH_SAMPLE(ipatch_sample->sample), ipatch_sample->offset, frame_count, ipatch_sample->buffer, IPATCH_SAMPLE_DOUBLE | IPATCH_SAMPLE_MONO, IPATCH_SAMPLE_MAP_CHANNEL(audio_channel, 0), &error); } break; } if(error != NULL){ g_message("%s", error->message); g_error_free(error); } ipatch_sample->offset += frame_count; } void ags_ipatch_sample_flush(AgsSoundResource *sound_resource) { //TODO:JK: implement me } void ags_ipatch_sample_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence) { AgsIpatchSample *ipatch_sample; guint total_frame_count; ipatch_sample = AGS_IPATCH_SAMPLE(sound_resource); ags_sound_resource_info(sound_resource, &total_frame_count, NULL, NULL); if(whence == G_SEEK_CUR){ if(frame_count >= 0){ if(ipatch_sample->offset + frame_count < total_frame_count){ ipatch_sample->offset += total_frame_count; }else{ ipatch_sample->offset = total_frame_count; } }else{ if(ipatch_sample->offset + frame_count >= 0){ ipatch_sample->offset += total_frame_count; }else{ ipatch_sample->offset = 0; } } }else if(whence == G_SEEK_SET){ if(frame_count >= 0){ if(frame_count < total_frame_count){ ipatch_sample->offset = frame_count; }else{ ipatch_sample->offset = total_frame_count; } }else{ ipatch_sample->offset = 0; } }else if(whence == G_SEEK_END){ if(frame_count > 0){ ipatch_sample->offset = total_frame_count; }else{ if(total_frame_count + frame_count > 0){ ipatch_sample->offset = total_frame_count + total_frame_count; }else{ ipatch_sample->offset = 0; } } } } /** * ags_ipatch_sample_test_flags: * @ipatch_sample: the #AgsIpatchSample * @flags: the flags * * Test @flags to be set on @ipatch_sample. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_ipatch_sample_test_flags(AgsIpatchSample *ipatch_sample, guint flags) { gboolean retval; GRecMutex *ipatch_sample_mutex; if(!AGS_IS_IPATCH_SAMPLE(ipatch_sample)){ return(FALSE); } /* get ipatch_sample mutex */ ipatch_sample_mutex = AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(ipatch_sample); /* test */ g_rec_mutex_lock(ipatch_sample_mutex); retval = (flags & (ipatch_sample->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(ipatch_sample_mutex); return(retval); } /** * ags_ipatch_sample_set_flags: * @ipatch_sample: the #AgsIpatchSample * @flags: see #AgsIpatchSampleFlags-enum * * Enable a feature of @ipatch_sample. * * Since: 3.0.0 */ void ags_ipatch_sample_set_flags(AgsIpatchSample *ipatch_sample, guint flags) { GRecMutex *ipatch_sample_mutex; if(!AGS_IS_IPATCH_SAMPLE(ipatch_sample)){ return; } /* get ipatch_sample mutex */ ipatch_sample_mutex = AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(ipatch_sample); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(ipatch_sample_mutex); ipatch_sample->flags |= flags; g_rec_mutex_unlock(ipatch_sample_mutex); } /** * ags_ipatch_sample_unset_flags: * @ipatch_sample: the #AgsIpatchSample * @flags: see #AgsIpatchSampleFlags-enum * * Disable a feature of @ipatch_sample. * * Since: 3.0.0 */ void ags_ipatch_sample_unset_flags(AgsIpatchSample *ipatch_sample, guint flags) { GRecMutex *ipatch_sample_mutex; if(!AGS_IS_IPATCH_SAMPLE(ipatch_sample)){ return; } /* get ipatch_sample mutex */ ipatch_sample_mutex = AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX(ipatch_sample); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(ipatch_sample_mutex); ipatch_sample->flags &= (~flags); g_rec_mutex_unlock(ipatch_sample_mutex); } /** * ags_ipatch_sample_new: * * Creates a new instance of #AgsIpatchSample. * * Returns: the new #AgsIpatchSample. * * Since: 3.0.0 */ AgsIpatchSample* ags_ipatch_sample_new() { AgsIpatchSample *ipatch_sample; ipatch_sample = (AgsIpatchSample *) g_object_new(AGS_TYPE_IPATCH_SAMPLE, NULL); return(ipatch_sample); } gsequencer-3.1.3/ags/audio/file/ags_audio_container.c0000644000175000017500000011557713613101164017547 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_audio_container_class_init(AgsAudioContainerClass *audio_container); void ags_audio_container_connectable_interface_init(AgsConnectableInterface *connectable); void ags_audio_container_init(AgsAudioContainer *audio_container); void ags_audio_container_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_container_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_container_finalize(GObject *object); AgsUUID* ags_audio_container_get_uuid(AgsConnectable *connectable); gboolean ags_audio_container_has_resource(AgsConnectable *connectable); gboolean ags_audio_container_is_ready(AgsConnectable *connectable); void ags_audio_container_add_to_registry(AgsConnectable *connectable); void ags_audio_container_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_audio_container_list_resource(AgsConnectable *connectable); xmlNode* ags_audio_container_xml_compose(AgsConnectable *connectable); void ags_audio_container_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_audio_container_is_connected(AgsConnectable *connectable); void ags_audio_container_connect(AgsConnectable *connectable); void ags_audio_container_disconnect(AgsConnectable *connectable); enum{ PROP_0, PROP_SOUNDCARD, PROP_FILENAME, PROP_PRESET, PROP_INSTRUMENT, PROP_SAMPLE, PROP_FILE_AUDIO_CHANNELS, PROP_FILE_SAMPLERATE, PROP_FILE_FRAME_COUNT, PROP_AUDIO_CHANNEL, PROP_SAMPLERATE, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_AUDIO_SIGNAL, PROP_WAVE, }; /** * SECTION:ags_audio_container * @short_description: Audio container input/output * @title: AgsAudioContainer * @section_id: * @include: ags/audio/file/ags_audio_container.h * * #AgsAudioContainer is the base object to read/write audio data. */ static gpointer ags_audio_container_parent_class = NULL; static AgsConnectableInterface *ags_audio_container_parent_connectable_interface; GType ags_audio_container_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_container = 0; static const GTypeInfo ags_audio_container_info = { sizeof (AgsAudioContainerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_container_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioContainer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_container_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_audio_container_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_audio_container = g_type_register_static(G_TYPE_OBJECT, "AgsAudioContainer", &ags_audio_container_info, 0); g_type_add_interface_static(ags_type_audio_container, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_container); } return g_define_type_id__volatile; } void ags_audio_container_class_init(AgsAudioContainerClass *audio_container) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_container_parent_class = g_type_class_peek_parent(audio_container); gobject = (GObjectClass *) audio_container; gobject->set_property = ags_audio_container_set_property; gobject->get_property = ags_audio_container_get_property; gobject->finalize = ags_audio_container_finalize; /* properties */ /** * AgsAudioContainer:soundcard: * * The assigned soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of audio container"), i18n_pspec("The soundcard what audio container has it's presets"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsAudioContainer:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename of audio container"), i18n_pspec("The filename of audio container"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsAudioContainer:preset: * * The assigned preset. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset", i18n_pspec("preset of audio container"), i18n_pspec("The preset of audio container"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /** * AgsAudioContainer:instrument: * * The assigned instrument. * * Since: 3.0.0 */ param_spec = g_param_spec_string("instrument", i18n_pspec("instrument of audio container"), i18n_pspec("The instrument of audio container"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INSTRUMENT, param_spec); /** * AgsAudioContainer:sample: * * The assigned sample. * * Since: 3.0.0 */ param_spec = g_param_spec_string("sample", i18n_pspec("sample of audio container"), i18n_pspec("The sample of audio container"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); /** * AgsAudioContainer:file-audio-channels: * * The audio channel count of this file. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("file-audio-channels", i18n_pspec("file audio channels"), i18n_pspec("The audio channel count of the file"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_AUDIO_CHANNELS, param_spec); /** * AgsAudioContainer:file-samplerate: * * The samplerate of this file. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("file-samplerate", i18n_pspec("file samplerate"), i18n_pspec("The samplerate of the file"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_SAMPLERATE, param_spec); /** * AgsAudioContainer:file-frame_count: * * The frame count of this file. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("file-frame-count", i18n_pspec("file frame count"), i18n_pspec("The frame count of the file"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE_FRAME_COUNT, param_spec); /** * AgsAudioContainer:audio-channel: * * The audio channel to be read. * * Since: 3.0.0 */ param_spec = g_param_spec_int("audio-channel", i18n_pspec("read audio channel"), i18n_pspec("The audio channel to be read"), -1, G_MAXINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsAudioContainer:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsAudioContainer:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsAudioContainer:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsAudioContainer:audio-signal: (type GList(AgsAudioSignal)) (transfer full) * * The containing #AgsAudioSignal. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("audio-signal", i18n_pspec("containing audio signal"), i18n_pspec("The audio signal it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_SIGNAL, param_spec); /** * AgsAudioContainer:wave: (type GList(AgsWave)) (transfer full) * * The containing #AgsWave. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("wave", i18n_pspec("containing wave"), i18n_pspec("The wave it contains"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WAVE, param_spec); } void ags_audio_container_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_audio_container_get_uuid; connectable->has_resource = ags_audio_container_has_resource; connectable->is_ready = ags_audio_container_is_ready; connectable->add_to_registry = ags_audio_container_add_to_registry; connectable->remove_from_registry = ags_audio_container_remove_from_registry; connectable->list_resource = ags_audio_container_list_resource; connectable->xml_compose = ags_audio_container_xml_compose; connectable->xml_parse = ags_audio_container_xml_parse; connectable->is_connected = ags_audio_container_is_connected; connectable->connect = ags_audio_container_connect; connectable->disconnect = ags_audio_container_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_audio_container_init(AgsAudioContainer *audio_container) { AgsConfig *config; audio_container->flags = 0; /* add audio container mutex */ g_rec_mutex_init(&(audio_container->obj_mutex)); /* uuid */ audio_container->uuid = ags_uuid_alloc(); ags_uuid_generate(audio_container->uuid); audio_container->soundcard = NULL; audio_container->filename = NULL; audio_container->preset = NULL; audio_container->instrument = NULL; audio_container->sample = NULL; audio_container->file_audio_channels = 0; audio_container->file_samplerate = 0; audio_container->file_frame_count = 0; audio_container->samplerate = 0; audio_container->buffer_size = 0; audio_container->format = 0; audio_container->audio_channel = -1; audio_container->sound_container = NULL; audio_container->audio_signal = NULL; audio_container->wave = NULL; } void ags_audio_container_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioContainer *audio_container; GRecMutex *audio_container_mutex; audio_container = AGS_AUDIO_CONTAINER(gobject); /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(audio_container_mutex); if(soundcard == ((GObject *) audio_container->soundcard)){ g_rec_mutex_unlock(audio_container_mutex); return; } if(audio_container->soundcard != NULL){ g_object_unref(audio_container->soundcard); } if(soundcard != NULL){ g_object_ref(G_OBJECT(soundcard)); } audio_container->soundcard = (GObject *) soundcard; g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = (gchar *) g_value_get_string(value); g_rec_mutex_lock(audio_container_mutex); if(audio_container->filename == filename){ g_rec_mutex_unlock(audio_container_mutex); return; } if(audio_container->filename != NULL){ g_free(audio_container->filename); } audio_container->filename = g_strdup(filename); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_PRESET: { gchar *preset; preset = (gchar *) g_value_get_string(value); g_rec_mutex_lock(audio_container_mutex); if(audio_container->preset == preset){ g_rec_mutex_unlock(audio_container_mutex); return; } if(audio_container->preset != NULL){ g_free(audio_container->preset); } audio_container->preset = g_strdup(preset); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_INSTRUMENT: { gchar *instrument; instrument = (gchar *) g_value_get_string(value); g_rec_mutex_lock(audio_container_mutex); if(audio_container->instrument == instrument){ g_rec_mutex_unlock(audio_container_mutex); return; } if(audio_container->instrument != NULL){ g_free(audio_container->instrument); } audio_container->instrument = g_strdup(instrument); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_SAMPLE: { gchar *sample; sample = (gchar *) g_value_get_string(value); g_rec_mutex_lock(audio_container_mutex); if(audio_container->sample == sample){ g_rec_mutex_unlock(audio_container_mutex); return; } if(audio_container->sample != NULL){ g_free(audio_container->sample); } audio_container->sample = g_strdup(sample); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILE_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_container_mutex); audio_container->file_audio_channels = g_value_get_uint(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILE_SAMPLERATE: { g_rec_mutex_lock(audio_container_mutex); audio_container->file_samplerate = g_value_get_uint(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILE_FRAME_COUNT: { g_rec_mutex_lock(audio_container_mutex); audio_container->file_frame_count = g_value_get_uint(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_container_mutex); audio_container->samplerate = g_value_get_uint(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_container_mutex); audio_container->buffer_size = g_value_get_uint(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_container_mutex); audio_container->format = g_value_get_uint(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(audio_container_mutex); audio_container->audio_channel = g_value_get_int(value); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_AUDIO_SIGNAL: { AgsAudioSignal *audio_signal; audio_signal = (AgsAudioSignal *) g_value_get_pointer(value); g_rec_mutex_lock(audio_container_mutex); if(audio_signal == NULL || g_list_find(audio_container->audio_signal, audio_signal) != NULL){ g_rec_mutex_unlock(audio_container_mutex); return; } g_rec_mutex_unlock(audio_container_mutex); ags_audio_container_add_audio_signal(audio_container, (GObject *) audio_signal); } break; case PROP_WAVE: { AgsWave *wave; wave = (AgsWave *) g_value_get_pointer(value); g_rec_mutex_lock(audio_container_mutex); if(wave == NULL || g_list_find(audio_container->wave, wave) != NULL){ g_rec_mutex_unlock(audio_container_mutex); return; } g_rec_mutex_unlock(audio_container_mutex); ags_audio_container_add_wave(audio_container, (GObject *) wave); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_container_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioContainer *audio_container; GRecMutex *audio_container_mutex; audio_container = AGS_AUDIO_CONTAINER(gobject); /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); switch(prop_id){ case PROP_SOUNDCARD: { g_rec_mutex_lock(audio_container_mutex); g_value_set_object(value, audio_container->soundcard); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(audio_container_mutex); g_value_set_string(value, audio_container->filename); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_PRESET: { g_rec_mutex_lock(audio_container_mutex); g_value_set_string(value, audio_container->preset); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_INSTRUMENT: { g_rec_mutex_lock(audio_container_mutex); g_value_set_string(value, audio_container->instrument); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_SAMPLE: { g_rec_mutex_lock(audio_container_mutex); g_value_set_string(value, audio_container->sample); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILE_AUDIO_CHANNELS: { g_rec_mutex_lock(audio_container_mutex); g_value_set_uint(value, audio_container->file_audio_channels); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILE_SAMPLERATE: { g_rec_mutex_lock(audio_container_mutex); g_value_set_uint(value, audio_container->file_samplerate); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FILE_FRAME_COUNT: { g_rec_mutex_lock(audio_container_mutex); g_value_set_uint(value, audio_container->file_frame_count); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_SAMPLERATE: { g_rec_mutex_lock(audio_container_mutex); g_value_set_uint(value, audio_container->samplerate); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(audio_container_mutex); g_value_set_uint(value, audio_container->buffer_size); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(audio_container_mutex); g_value_set_uint(value, audio_container->format); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(audio_container_mutex); g_value_set_int(value, audio_container->audio_channel); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_AUDIO_SIGNAL: { g_rec_mutex_lock(audio_container_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_container->audio_signal, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_container_mutex); } break; case PROP_WAVE: { g_rec_mutex_lock(audio_container_mutex); g_value_set_pointer(value, g_list_copy_deep(audio_container->wave, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(audio_container_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_container_finalize(GObject *gobject) { AgsAudioContainer *audio_container; audio_container = AGS_AUDIO_CONTAINER(gobject); /* sound resource */ if(audio_container->sound_container != NULL){ g_object_unref(audio_container->sound_container); } /* AgsAudioSignal */ g_list_free_full(audio_container->audio_signal, g_object_unref); /* AgsWave */ g_list_free_full(audio_container->wave, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_audio_container_parent_class)->finalize(gobject); } AgsUUID* ags_audio_container_get_uuid(AgsConnectable *connectable) { AgsAudioContainer *audio_container; AgsUUID *ptr; GRecMutex *audio_container_mutex; audio_container = AGS_AUDIO_CONTAINER(connectable); /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* get UUID */ g_rec_mutex_lock(audio_container_mutex); ptr = audio_container->uuid; g_rec_mutex_unlock(audio_container_mutex); return(ptr); } gboolean ags_audio_container_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_audio_container_is_ready(AgsConnectable *connectable) { AgsAudioContainer *audio_container; gboolean is_ready; audio_container = AGS_AUDIO_CONTAINER(connectable); /* check is ready */ is_ready = ags_audio_container_test_flags(audio_container, AGS_AUDIO_CONTAINER_ADDED_TO_REGISTRY); return(is_ready); } void ags_audio_container_add_to_registry(AgsConnectable *connectable) { AgsAudioContainer *audio_container; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } audio_container = AGS_AUDIO_CONTAINER(connectable); ags_audio_container_set_flags(audio_container, AGS_AUDIO_CONTAINER_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) audio_container); ags_registry_add_entry(registry, entry); } } void ags_audio_container_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_audio_container_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_audio_container_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_audio_container_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_audio_container_is_connected(AgsConnectable *connectable) { AgsAudioContainer *audio_container; gboolean is_connected; audio_container = AGS_AUDIO_CONTAINER(connectable); /* check is connected */ is_connected = ags_audio_container_test_flags(audio_container, AGS_AUDIO_CONTAINER_CONNECTED); return(is_connected); } void ags_audio_container_connect(AgsConnectable *connectable) { AgsAudioContainer *audio_container; if(ags_connectable_is_connected(connectable)){ return; } audio_container = AGS_AUDIO_CONTAINER(connectable); ags_audio_container_set_flags(audio_container, AGS_AUDIO_CONTAINER_CONNECTED); } void ags_audio_container_disconnect(AgsConnectable *connectable) { AgsAudioContainer *audio_container; if(!ags_connectable_is_connected(connectable)){ return; } audio_container = AGS_AUDIO_CONTAINER(connectable); ags_audio_container_unset_flags(audio_container, AGS_AUDIO_CONTAINER_CONNECTED); } /** * ags_audio_container_test_flags: * @audio_container: the #AgsAudioContainer * @flags: the flags * * Test @flags to be set on @audio_container. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_container_test_flags(AgsAudioContainer *audio_container, guint flags) { gboolean retval; GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return(FALSE); } /* get audio_container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* test */ g_rec_mutex_lock(audio_container_mutex); retval = (flags & (audio_container->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(audio_container_mutex); return(retval); } /** * ags_audio_container_set_flags: * @audio_container: the #AgsAudioContainer * @flags: see #AgsAudioContainerFlags-enum * * Enable a feature of @audio_container. * * Since: 3.0.0 */ void ags_audio_container_set_flags(AgsAudioContainer *audio_container, guint flags) { GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return; } /* get audio_container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(audio_container_mutex); audio_container->flags |= flags; g_rec_mutex_unlock(audio_container_mutex); } /** * ags_audio_container_unset_flags: * @audio_container: the #AgsAudioContainer * @flags: see #AgsAudioContainerFlags-enum * * Disable a feature of @audio_container. * * Since: 3.0.0 */ void ags_audio_container_unset_flags(AgsAudioContainer *audio_container, guint flags) { GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return; } /* get audio_container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(audio_container_mutex); audio_container->flags &= (~flags); g_rec_mutex_unlock(audio_container_mutex); } /** * ags_audio_container_check_suffix: * @filename: the filename * * Check suffix. * * Returns: %TRUE if suffix supported, else %FALSE * * Since: 3.0.0 */ gboolean ags_audio_container_check_suffix(gchar *filename) { if(g_str_has_suffix(filename, ".sf2") || g_str_has_suffix(filename, ".gig") || g_str_has_suffix(filename, ".dls") || g_str_has_suffix(filename, ".sfz")){ return(TRUE); } return(FALSE); } /** * ags_audio_container_find_sound_resource: * @audio_container: the #AgsAudioContainer * @preset: the preset * @instrument: the instrument * @sample: the sample * * Find resource specified by parameters. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #GObject sample or %NULL. WARNING the parameters need to be valid in order * to return the correct list. * * Since: 3.0.0 */ GList* ags_audio_container_find_sound_resource(AgsAudioContainer *audio_container, gchar *preset, gchar *instrument, gchar *sample) { GList *retval; gchar **strv; guint i; ags_sound_container_level_up(AGS_SOUND_CONTAINER(audio_container->sound_container), 5); /* preset */ if(preset != NULL){ strv = ags_sound_container_get_sublevel_name(AGS_SOUND_CONTAINER(audio_container->sound_container)); i = ags_strv_index(strv, preset); ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(audio_container->sound_container), i); g_strfreev(strv); } /* instrument */ if(instrument != NULL){ strv = ags_sound_container_get_sublevel_name(AGS_SOUND_CONTAINER(audio_container->sound_container)); i = ags_strv_index(strv, instrument); ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(audio_container->sound_container), i); g_strfreev(strv); } /* sample */ if(sample != NULL){ strv = ags_sound_container_get_sublevel_name(AGS_SOUND_CONTAINER(audio_container->sound_container)); i = ags_strv_index(strv, sample); ags_sound_container_select_level_by_index(AGS_SOUND_CONTAINER(audio_container->sound_container), i); g_strfreev(strv); } retval = ags_sound_container_get_resource_current(AGS_SOUND_CONTAINER(audio_container->sound_container)); return(retval); } /** * ags_audio_container_add_audio_signal: * @audio_container: the #AgsAudioContainer * @audio_signal: the #AgsAudioSignal * * Add @audio_signal to @audio_container. * * Since: 3.0.0 */ void ags_audio_container_add_audio_signal(AgsAudioContainer *audio_container, GObject *audio_signal) { GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container) || !AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* check add */ g_rec_mutex_lock(audio_container_mutex); if(g_list_find(audio_container->audio_signal, audio_signal) == NULL){ g_object_ref(audio_signal); audio_container->audio_signal = g_list_prepend(audio_container->audio_signal, audio_signal); } g_rec_mutex_unlock(audio_container_mutex); } /** * ags_audio_container_remove_audio_signal: * @audio_container: the #AgsAudioContainer * @audio_signal: the #AgsAudioSignal * * Remove @audio_signal from @audio_container. * * Since: 3.0.0 */ void ags_audio_container_remove_audio_signal(AgsAudioContainer *audio_container, GObject *audio_signal) { GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container) || !AGS_IS_AUDIO_SIGNAL(audio_signal)){ return; } /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* check remove */ g_rec_mutex_lock(audio_container_mutex); if(g_list_find(audio_container->audio_signal, audio_signal) != NULL){ audio_container->audio_signal = g_list_prepend(audio_container->audio_signal, audio_signal); g_object_unref(audio_signal); } g_rec_mutex_unlock(audio_container_mutex); } /** * ags_audio_container_add_wave: * @audio_container: the #AgsAudioContainer * @wave: the #AgsWave * * Add @wave to @audio_container. * * Since: 3.0.0 */ void ags_audio_container_add_wave(AgsAudioContainer *audio_container, GObject *wave) { GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container) || !AGS_IS_WAVE(wave)){ return; } /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* check add */ g_rec_mutex_lock(audio_container_mutex); if(g_list_find(audio_container->wave, wave) == NULL){ g_object_ref(wave); audio_container->wave = g_list_prepend(audio_container->wave, wave); } g_rec_mutex_unlock(audio_container_mutex); } /** * ags_audio_container_remove_wave: * @audio_container: the #AgsAudioContainer * @wave: the #AgsWave * * Remove @wave from @audio_container. * * Since: 3.0.0 */ void ags_audio_container_remove_wave(AgsAudioContainer *audio_container, GObject *wave) { GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container) || !AGS_IS_WAVE(wave)){ return; } /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* check remove */ g_rec_mutex_lock(audio_container_mutex); if(g_list_find(audio_container->wave, wave) != NULL){ audio_container->wave = g_list_prepend(audio_container->wave, wave); g_object_unref(wave); } g_rec_mutex_unlock(audio_container_mutex); } /** * ags_audio_container_open: * @audio_container: the #AgsAudioContainer * * Open the #AgsAudioContainer in read mode. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_audio_container_open(AgsAudioContainer *audio_container) { GObject *sound_container; GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return(FALSE); } /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); sound_container = NULL; #ifdef AGS_DEBUG g_message("ags_audio_container_open: %s", audio_container->filename); #endif if(g_file_test(audio_container->filename, G_FILE_TEST_EXISTS)){ if(ags_audio_container_check_suffix(audio_container->filename)){ if(ags_ipatch_check_suffix(audio_container->filename)){ /* ipatch sound resource */ g_rec_mutex_lock(audio_container_mutex); sound_container = audio_container->sound_container = (GObject *) ags_ipatch_new(); g_object_ref(audio_container->sound_container); g_rec_mutex_unlock(audio_container_mutex); }else if(ags_sfz_file_check_suffix(audio_container->filename)){ /* SFZ file sound resource */ g_rec_mutex_lock(audio_container_mutex); sound_container = audio_container->sound_container = (GObject *) ags_sfz_file_new(); g_object_ref(audio_container->sound_container); g_rec_mutex_unlock(audio_container_mutex); } if(ags_sound_container_open(AGS_SOUND_CONTAINER(sound_container), audio_container->filename)){ return(TRUE); } }else{ g_message("ags_audio_container_open: unknown file type"); } } return(FALSE); } gboolean ags_audio_container_open_from_data(AgsAudioContainer *audio_container, gchar *data) { g_message("missing implementation"); //TODO:JK: implement me return(FALSE); } gboolean ags_audio_container_rw_open(AgsAudioContainer *audio_container, gboolean create) { g_message("missing implementation"); //TODO:JK: implement me return(FALSE); } /** * ags_audio_container_close: * @audio_container: the #AgsAudioContainer * * Close the #AgsAudioContainer. * * Since: 3.0.0 */ void ags_audio_container_close(AgsAudioContainer *audio_container) { GObject *sound_container; GRecMutex *audio_container_mutex; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return; } /* get audio container mutex */ audio_container_mutex = AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX(audio_container); /* sound container */ g_rec_mutex_lock(audio_container_mutex); sound_container = audio_container->sound_container; g_rec_mutex_unlock(audio_container_mutex); /* close */ ags_sound_container_close(AGS_SOUND_CONTAINER(sound_container)); } /** * ags_audio_container_read: * @audio_container: the #AgsAudioContainer * @audio_channel: nth channel * @format: the format * @error: returned error * * Read audio buffer. * * Since: 3.0.0 */ void* ags_audio_container_read(AgsAudioContainer *audio_container, guint audio_channel, guint format, GError **error) { GList *start_sound_resource; void *buffer; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return(NULL); } start_sound_resource = ags_sound_container_get_resource_current(AGS_SOUND_CONTAINER(audio_container->sound_container)); if(start_sound_resource == NULL){ return(NULL); } ags_sound_resource_info(AGS_SOUND_RESOURCE(start_sound_resource->data), &(audio_container->file_frame_count), NULL, NULL); buffer = ags_stream_alloc(audio_container->file_frame_count, format); ags_sound_resource_read(AGS_SOUND_RESOURCE(start_sound_resource->data), buffer, 1, audio_channel, audio_container->file_frame_count, format); #if 0 #endif return(buffer); } /** * ags_audio_container_read_audio_signal: * @audio_container: the #AgsAudioContainer * * Convert the #AgsAudioContainer to a #GList-struct of #AgsAudioSignal. * * Returns: (element-type AgsAudio.AudioSignal) (transfer full): the new #GList-struct containing #AgsAudioSignal or %NULL * * Since: 3.0.0 */ GList* ags_audio_container_read_audio_signal(AgsAudioContainer *audio_container) { GList *start_sound_resource, *sound_resource; GList *list; if(!AGS_IS_AUDIO_CONTAINER(audio_container)){ return(NULL); } sound_resource = start_sound_resource = ags_sound_container_get_resource_current(AGS_SOUND_CONTAINER(audio_container->sound_container)); list = NULL; while(sound_resource != NULL){ GList *current; current = ags_sound_resource_read_audio_signal(AGS_SOUND_RESOURCE(sound_resource->data), audio_container->soundcard, audio_container->audio_channel); if(current != NULL){ if(list == NULL){ list = current; }else{ list = g_list_concat(list, current); } } sound_resource = sound_resource->next; } g_list_free(start_sound_resource); audio_container->audio_signal = list; return(g_list_copy(list)); } /** * ags_audio_container_read_wave: * @audio_container: the #AgsAudioContainer * @x_offset: the x offset * @delay: the delay * @attack: the attack * * Convert the #AgsAudioContainer to a #GList-struct of #AgsWave. * * Returns: (element-type AgsAudio.Wave) (transfer full): the new #GList-struct containing #AgsWave or %NULL * * Since: 3.0.0 */ GList* ags_audio_container_read_wave(AgsAudioContainer *audio_container, guint64 x_offset, gdouble delay, guint attack) { g_message("missing implementation"); //TODO:JK: implement me return(NULL); } void ags_audio_container_seek(AgsAudioContainer *audio_container, guint frames, gint whence) { g_message("missing implementation"); //TODO:JK: implement me } void ags_audio_container_write(AgsAudioContainer *audio_container, void *buffer, guint buffer_size, guint format) { g_message("missing implementation"); //TODO:JK: implement me } void ags_audio_container_flush(AgsAudioContainer *audio_container) { g_message("missing implementation"); //TODO:JK: implement me } /** * ags_audio_container_new: * @filename: the filename * @preset: the preset * @instrument: the instrument * @sample: the sample * @soundcard: defaults of #AgsSoundcard * @audio_channel: the audio channel to read * * Create a new instance of #AgsAudioContainer. * * Returns: the new #AgsAudioContainer. * * Since: 3.0.0 */ AgsAudioContainer* ags_audio_container_new(gchar *filename, gchar *preset, gchar *instrument, gchar *sample, GObject *soundcard, gint audio_channel) { AgsAudioContainer *audio_container; audio_container = (AgsAudioContainer *) g_object_new(AGS_TYPE_AUDIO_CONTAINER, "filename", filename, "soundcard", soundcard, "audio-channel", audio_channel, NULL); return(audio_container); } gsequencer-3.1.3/ags/audio/file/ags_sound_container.c0000644000175000017500000002721713607210263017573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_sound_container_base_init(AgsSoundContainerInterface *ginterface); /** * SECTION:ags_sound_container * @short_description: read/write audio * @title: AgsSoundContainer * @section_id: * @include: ags/audio/file/ags_sound_container.h * * The #AgsSoundContainer interface gives you a unique access to file related * IO operations. */ GType ags_sound_container_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sound_container = 0; static const GTypeInfo ags_sound_container_info = { sizeof(AgsSoundContainerInterface), (GBaseInitFunc) ags_sound_container_base_init, NULL, /* base_finalize */ }; ags_type_sound_container = g_type_register_static(G_TYPE_INTERFACE, "AgsSoundContainer", &ags_sound_container_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sound_container); } return g_define_type_id__volatile; } void ags_sound_container_base_init(AgsSoundContainerInterface *ginterface) { /* empty */ } /** * ags_sound_container_open: * @sound_container: the #AgsSoundcontainer * @filename: the filename * * Open @sound_container. * * Returns: %TRUE if open succeeded, else %FALSE * * Since: 3.0.0 */ gboolean ags_sound_container_open(AgsSoundContainer *sound_container, gchar *filename) { AgsSoundContainerInterface *sound_container_interface; gboolean retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), FALSE); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->open, FALSE); retval = sound_container_interface->open(sound_container, filename); return(retval); } /** * ags_sound_container_get_level_count: * @sound_container: the #AgsSoundcontainer * * Get level count. * * Returns: the level count * * Since: 3.0.0 */ guint ags_sound_container_get_level_count(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), 0); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_level_count, 0); retval = sound_container_interface->get_level_count(sound_container); return(retval); } /** * ags_sound_container_get_nesting_level: * @sound_container: the #AgsSoundcontainer * * Get nesting level. * * Returns: the nesting level * * Since: 3.0.0 */ guint ags_sound_container_get_nesting_level(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), 0); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_nesting_level, 0); retval = sound_container_interface->get_nesting_level(sound_container); return(retval); } /** * ags_sound_container_get_level_id: * @sound_container: the #AgsSoundcontainer * * Get level id. * * Returns: the level id as string * * Since: 3.0.0 */ gchar* ags_sound_container_get_level_id(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; gchar *retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), NULL); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_level_id, NULL); retval = sound_container_interface->get_level_id(sound_container); return(retval); } /** * ags_sound_container_get_level_index: * @sound_container: the #AgsSoundcontainer * * Get level index. * * Returns: the level index unsigned integer * * Since: 3.0.0 */ guint ags_sound_container_get_level_index(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), 0); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_level_index, 0); retval = sound_container_interface->get_level_index(sound_container); return(retval); } /** * ags_sound_container_get_sublevel_name: * @sound_container: the #AgsSoundcontainer * * Get sublevel names. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing sublevel names * * Since: 3.0.0 */ gchar** ags_sound_container_get_sublevel_name(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; gchar **retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), NULL); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_sublevel_name, NULL); retval = sound_container_interface->get_sublevel_name(sound_container); return(retval); } /** * ags_sound_container_level_up: * @sound_container: the #AgsSoundcontainer * @level_count: the count of levels to go up * * Level up. * * Returns: the level count went up * * Since: 3.0.0 */ guint ags_sound_container_level_up(AgsSoundContainer *sound_container, guint level_count) { AgsSoundContainerInterface *sound_container_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), 0); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->level_up, 0); retval = sound_container_interface->level_up(sound_container, level_count); return(retval); } /** * ags_sound_container_select_level_by_id: * @sound_container: the #AgsSoundcontainer * @level_id: the level id as string * * Select level by id. * * Returns: the index of level as unsigned integer * * Since: 3.0.0 */ guint ags_sound_container_select_level_by_id(AgsSoundContainer *sound_container, gchar *level_id) { AgsSoundContainerInterface *sound_container_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), 0); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->select_level_by_id, 0); retval = sound_container_interface->select_level_by_id(sound_container, level_id); return(retval); } /** * ags_sound_container_select_level_by_index: * @sound_container: the #AgsSoundcontainer * @level_index: the level index unsigned integer * * Select level by index. * * Returns: the index of level as unsigned integer * * Since: 3.0.0 */ guint ags_sound_container_select_level_by_index(AgsSoundContainer *sound_container, guint level_index) { AgsSoundContainerInterface *sound_container_interface; guint retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), 0); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->select_level_by_index, 0); retval = sound_container_interface->select_level_by_index(sound_container, level_index); return(retval); } /** * ags_sound_container_get_resource_all: * @sound_container: the #AgsSoundcontainer * * Get all resources as a #GList-struct. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #AgsResource * * Since: 3.0.0 */ GList* ags_sound_container_get_resource_all(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; GList *retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), NULL); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_resource_all, NULL); retval = sound_container_interface->get_resource_all(sound_container); return(retval); } /** * ags_sound_container_get_resource_by_name: * @sound_container: the #AgsSoundcontainer * @resource_name: the resource name * * Get resources by name as a #GList-struct. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #AgsResource * * Since: 3.0.0 */ GList* ags_sound_container_get_resource_by_name(AgsSoundContainer *sound_container, gchar *resource_name) { AgsSoundContainerInterface *sound_container_interface; GList *retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), NULL); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_resource_by_name, NULL); retval = sound_container_interface->get_resource_by_name(sound_container, resource_name); return(retval); } /** * ags_sound_container_get_resource_by_index: * @sound_container: the #AgsSoundcontainer * @resource_index: the index * * Get resources by index as a #GList-struct. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #AgsResource * * Since: 3.0.0 */ GList* ags_sound_container_get_resource_by_index(AgsSoundContainer *sound_container, guint resource_index) { AgsSoundContainerInterface *sound_container_interface; GList *retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), NULL); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_resource_by_index, NULL); retval = sound_container_interface->get_resource_by_index(sound_container, resource_index); return(retval); } /** * ags_sound_container_get_resource_current: * @sound_container: the #AgsSoundcontainer * * Get resources by index as a #GList-struct. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #AgsResource * * Since: 3.0.0 */ GList* ags_sound_container_get_resource_current(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; GList *retval; g_return_val_if_fail(AGS_IS_SOUND_CONTAINER(sound_container), NULL); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_val_if_fail(sound_container_interface->get_resource_current, NULL); retval = sound_container_interface->get_resource_current(sound_container); return(retval); } /** * ags_sound_container_close: * @sound_container: the #AgsSoundcontainer * * Close @sound_container. * * Since: 3.0.0 */ void ags_sound_container_close(AgsSoundContainer *sound_container) { AgsSoundContainerInterface *sound_container_interface; g_return_if_fail(AGS_IS_SOUND_CONTAINER(sound_container)); sound_container_interface = AGS_SOUND_CONTAINER_GET_INTERFACE(sound_container); g_return_if_fail(sound_container_interface->close); sound_container_interface->close(sound_container); } gsequencer-3.1.3/ags/audio/file/ags_sfz_sample.c0000644000175000017500000011770213607210263016543 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_sfz_sample_class_init(AgsSFZSampleClass *sfz_sample); void ags_sfz_sample_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sfz_sample_sound_resource_interface_init(AgsSoundResourceInterface *sound_resource); void ags_sfz_sample_init(AgsSFZSample *sfz_sample); void ags_sfz_sample_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sfz_sample_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sfz_sample_dispose(GObject *gobject); void ags_sfz_sample_finalize(GObject *gobject); AgsUUID* ags_sfz_sample_get_uuid(AgsConnectable *connectable); gboolean ags_sfz_sample_has_resource(AgsConnectable *connectable); gboolean ags_sfz_sample_is_ready(AgsConnectable *connectable); void ags_sfz_sample_add_to_registry(AgsConnectable *connectable); void ags_sfz_sample_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_sfz_sample_list_resource(AgsConnectable *connectable); xmlNode* ags_sfz_sample_xml_compose(AgsConnectable *connectable); void ags_sfz_sample_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_sfz_sample_is_connected(AgsConnectable *connectable); void ags_sfz_sample_connect(AgsConnectable *connectable); void ags_sfz_sample_disconnect(AgsConnectable *connectable); gboolean ags_sfz_sample_open(AgsSoundResource *sound_resource, gchar *filename); gboolean ags_sfz_sample_rw_open(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create); gboolean ags_sfz_sample_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end); void ags_sfz_sample_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format); void ags_sfz_sample_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format); guint ags_sfz_sample_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format); void ags_sfz_sample_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format); void ags_sfz_sample_flush(AgsSoundResource *sound_resource); void ags_sfz_sample_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence); void ags_sfz_sample_close(AgsSoundResource *sound_resource); /** * SECTION:ags_sfz_sample * @short_description: interfacing SFZ samples * @title: AgsSFZSample * @section_id: * @include: ags/audio/file/ags_sfz_sample.h * * #AgsSFZSample is the base object to ineract with SFZ samples. */ enum{ PROP_0, PROP_AUDIO_CHANNELS, PROP_FILENAME, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_LOOP_START, PROP_LOOP_END, PROP_GROUP, PROP_REGION, }; static gpointer ags_sfz_sample_parent_class = NULL; GType ags_sfz_sample_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sfz_sample = 0; static const GTypeInfo ags_sfz_sample_info = { sizeof(AgsSFZSampleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sfz_sample_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsSFZSample), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sfz_sample_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sfz_sample_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_resource_interface_info = { (GInterfaceInitFunc) ags_sfz_sample_sound_resource_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sfz_sample = g_type_register_static(G_TYPE_OBJECT, "AgsSFZSample", &ags_sfz_sample_info, 0); g_type_add_interface_static(ags_type_sfz_sample, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_sfz_sample, AGS_TYPE_SOUND_RESOURCE, &ags_sound_resource_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sfz_sample); } return g_define_type_id__volatile; } void ags_sfz_sample_class_init(AgsSFZSampleClass *sfz_sample) { GObjectClass *gobject; GParamSpec *param_spec; ags_sfz_sample_parent_class = g_type_class_peek_parent(sfz_sample); gobject = (GObjectClass *) sfz_sample; gobject->set_property = ags_sfz_sample_set_property; gobject->get_property = ags_sfz_sample_get_property; gobject->dispose = ags_sfz_sample_dispose; gobject->finalize = ags_sfz_sample_finalize; /* properties */ /** * AgsSFZSample:audio-channels: * * The audio channels to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channels", i18n_pspec("using audio channels"), i18n_pspec("The audio channels to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNELS, param_spec); /** * AgsSFZSample:filename: * * The filename to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("using filename"), i18n_pspec("The filename to be used"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsSFZSample:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsSFZSample:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsSFZSample:loop-start: * * The loop start to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("loop-start", i18n_pspec("using loop start"), i18n_pspec("The loop start to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_START, param_spec); /** * AgsSFZSample:loop-end: * * The loop end to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("loop-end", i18n_pspec("using loop end"), i18n_pspec("The loop end to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOOP_END, param_spec); /** * AgsSFZSample:group: * * The group assigned with. * * Since: 3.0.0 */ param_spec = g_param_spec_object("group", i18n_pspec("assigned group"), i18n_pspec("The group it is assigned with"), AGS_TYPE_SFZ_GROUP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GROUP, param_spec); /** * AgsSFZSample:region: * * The region assigned with. * * Since: 3.0.0 */ param_spec = g_param_spec_object("region", i18n_pspec("assigned region"), i18n_pspec("The region it is assigned with"), AGS_TYPE_SFZ_REGION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REGION, param_spec); } void ags_sfz_sample_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_sfz_sample_get_uuid; connectable->has_resource = ags_sfz_sample_has_resource; connectable->is_ready = ags_sfz_sample_is_ready; connectable->add_to_registry = ags_sfz_sample_add_to_registry; connectable->remove_from_registry = ags_sfz_sample_remove_from_registry; connectable->list_resource = ags_sfz_sample_list_resource; connectable->xml_compose = ags_sfz_sample_xml_compose; connectable->xml_parse = ags_sfz_sample_xml_parse; connectable->is_connected = ags_sfz_sample_is_connected; connectable->connect = ags_sfz_sample_connect; connectable->disconnect = ags_sfz_sample_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_sfz_sample_sound_resource_interface_init(AgsSoundResourceInterface *sound_resource) { sound_resource->open = ags_sfz_sample_open; sound_resource->rw_open = ags_sfz_sample_rw_open; sound_resource->load = NULL; sound_resource->info = ags_sfz_sample_info; sound_resource->set_presets = ags_sfz_sample_set_presets; sound_resource->get_presets = ags_sfz_sample_get_presets; sound_resource->read = ags_sfz_sample_read; sound_resource->write = ags_sfz_sample_write; sound_resource->flush = ags_sfz_sample_flush; sound_resource->seek = ags_sfz_sample_seek; sound_resource->close = ags_sfz_sample_close; } void ags_sfz_sample_init(AgsSFZSample *sfz_sample) { AgsConfig *config; sfz_sample->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(sfz_sample->obj_mutex)); /* uuid */ sfz_sample->uuid = ags_uuid_alloc(); ags_uuid_generate(sfz_sample->uuid); config = ags_config_get_instance(); sfz_sample->filename = NULL; sfz_sample->audio_channels = 1; sfz_sample->audio_channel_written = (gint64 *) malloc(sfz_sample->audio_channels * sizeof(gint64)); sfz_sample->audio_channel_written[0] = -1; sfz_sample->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); sfz_sample->format = AGS_SOUNDCARD_DOUBLE; sfz_sample->loop_start = 0; sfz_sample->loop_end = 0; sfz_sample->offset = 0; sfz_sample->buffer_offset = 0; sfz_sample->full_buffer = NULL; sfz_sample->buffer = ags_stream_alloc(sfz_sample->audio_channels * sfz_sample->buffer_size, sfz_sample->format); sfz_sample->pointer = NULL; sfz_sample->current = NULL; sfz_sample->length = 0; sfz_sample->info = NULL; sfz_sample->file = NULL; sfz_sample->group = NULL; sfz_sample->region = NULL; } void ags_sfz_sample_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSFZSample *sfz_sample; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(gobject); /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); switch(prop_id){ case PROP_AUDIO_CHANNELS: { guint audio_channels; guint i; audio_channels = g_value_get_uint(value); g_rec_mutex_lock(sfz_sample_mutex); if(audio_channels == sfz_sample->audio_channels){ g_rec_mutex_unlock(sfz_sample_mutex); return; } ags_stream_free(sfz_sample->buffer); if(audio_channels > 0){ sfz_sample->audio_channel_written = (gint64 *) realloc(sfz_sample->audio_channel_written, audio_channels * sizeof(gint64)); for(i = sfz_sample->audio_channels; i < audio_channels; i++){ sfz_sample->audio_channel_written[i] = -1; } }else{ free(sfz_sample->audio_channel_written); } sfz_sample->audio_channels = audio_channels; sfz_sample->buffer = ags_stream_alloc(sfz_sample->audio_channels * sfz_sample->buffer_size, sfz_sample->format); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(sfz_sample_mutex); if(filename == sfz_sample->filename){ g_rec_mutex_unlock(sfz_sample_mutex); return; } g_free(sfz_sample->filename); sfz_sample->filename = g_strdup(filename); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(sfz_sample_mutex); if(buffer_size == sfz_sample->buffer_size){ g_rec_mutex_unlock(sfz_sample_mutex); return; } ags_stream_free(sfz_sample->buffer); sfz_sample->buffer_size = buffer_size; sfz_sample->buffer = ags_stream_alloc(sfz_sample->audio_channels * sfz_sample->buffer_size, sfz_sample->format); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(sfz_sample_mutex); if(format == sfz_sample->format){ g_rec_mutex_unlock(sfz_sample_mutex); return; } ags_stream_free(sfz_sample->buffer); sfz_sample->format = format; sfz_sample->buffer = ags_stream_alloc(sfz_sample->audio_channels * sfz_sample->buffer_size, sfz_sample->format); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_LOOP_START: { gint loop_start; loop_start = g_value_get_uint(value); g_rec_mutex_lock(sfz_sample_mutex); if(loop_start == sfz_sample->loop_start){ g_rec_mutex_unlock(sfz_sample_mutex); return; } sfz_sample->loop_start = loop_start; g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_LOOP_END: { gint loop_end; loop_end = g_value_get_uint(value); g_rec_mutex_lock(sfz_sample_mutex); if(loop_end == sfz_sample->loop_end){ g_rec_mutex_unlock(sfz_sample_mutex); return; } sfz_sample->loop_end = loop_end; g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_GROUP: { GObject *group; group = g_value_get_object(value); g_rec_mutex_lock(sfz_sample_mutex); if(group == sfz_sample->group){ g_rec_mutex_unlock(sfz_sample_mutex); return; } if(sfz_sample->group != NULL){ g_object_unref(sfz_sample->group); } if(group != NULL){ g_object_ref(group); } sfz_sample->group = group; g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_REGION: { GObject *region; region = g_value_get_object(value); g_rec_mutex_lock(sfz_sample_mutex); if(region == sfz_sample->region){ g_rec_mutex_unlock(sfz_sample_mutex); return; } if(sfz_sample->region != NULL){ g_object_unref(sfz_sample->region); } if(region != NULL){ g_object_ref(region); } sfz_sample->region = region; g_rec_mutex_unlock(sfz_sample_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sfz_sample_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSFZSample *sfz_sample; GRecMutex *sfz_sample_mutex; sfz_sample = (AgsSFZSample *) gobject; /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); switch(prop_id){ case PROP_AUDIO_CHANNELS: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_uint(value, sfz_sample->audio_channels); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_string(value, sfz_sample->filename); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_uint(value, sfz_sample->buffer_size); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_uint(value, sfz_sample->format); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_LOOP_START: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_uint(value, sfz_sample->loop_start); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_LOOP_END: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_uint(value, sfz_sample->loop_end); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_GROUP: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_object(value, sfz_sample->group); g_rec_mutex_unlock(sfz_sample_mutex); } break; case PROP_REGION: { g_rec_mutex_lock(sfz_sample_mutex); g_value_set_object(value, sfz_sample->region); g_rec_mutex_unlock(sfz_sample_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sfz_sample_dispose(GObject *gobject) { AgsSFZSample *sfz_sample; sfz_sample = AGS_SFZ_SAMPLE(gobject); if(sfz_sample->region != NULL){ g_object_unref(sfz_sample->region); sfz_sample->region = NULL; } if(sfz_sample->group != NULL){ g_object_unref(sfz_sample->group); sfz_sample->group = NULL; } /* call parent */ G_OBJECT_CLASS(ags_sfz_sample_parent_class)->dispose(gobject); } void ags_sfz_sample_finalize(GObject *gobject) { AgsSFZSample *sfz_sample; sfz_sample = AGS_SFZ_SAMPLE(gobject); g_free(sfz_sample->filename); ags_stream_free(sfz_sample->buffer); if(sfz_sample->region != NULL){ g_object_unref(sfz_sample->region); } if(sfz_sample->group != NULL){ g_object_unref(sfz_sample->group); } /* call parent */ G_OBJECT_CLASS(ags_sfz_sample_parent_class)->finalize(gobject); } AgsUUID* ags_sfz_sample_get_uuid(AgsConnectable *connectable) { AgsSFZSample *sfz_sample; AgsUUID *ptr; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(connectable); /* get audio file mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); /* get UUID */ g_rec_mutex_lock(sfz_sample_mutex); ptr = sfz_sample->uuid; g_rec_mutex_unlock(sfz_sample_mutex); return(ptr); } gboolean ags_sfz_sample_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_sfz_sample_is_ready(AgsConnectable *connectable) { AgsSFZSample *sfz_sample; gboolean is_ready; sfz_sample = AGS_SFZ_SAMPLE(connectable); /* check is ready */ is_ready = ags_sfz_sample_test_flags(sfz_sample, AGS_SFZ_SAMPLE_ADDED_TO_REGISTRY); return(is_ready); } void ags_sfz_sample_add_to_registry(AgsConnectable *connectable) { AgsSFZSample *sfz_sample; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } sfz_sample = AGS_SFZ_SAMPLE(connectable); ags_sfz_sample_set_flags(sfz_sample, AGS_SFZ_SAMPLE_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) sfz_sample); ags_registry_add_entry(registry, entry); } } void ags_sfz_sample_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_sfz_sample_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_sfz_sample_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_sfz_sample_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_sfz_sample_is_connected(AgsConnectable *connectable) { AgsSFZSample *sfz_sample; gboolean is_connected; sfz_sample = AGS_SFZ_SAMPLE(connectable); /* check is connected */ is_connected = ags_sfz_sample_test_flags(sfz_sample, AGS_SFZ_SAMPLE_CONNECTED); return(is_connected); } void ags_sfz_sample_connect(AgsConnectable *connectable) { AgsSFZSample *sfz_sample; if(ags_connectable_is_connected(connectable)){ return; } sfz_sample = AGS_SFZ_SAMPLE(connectable); ags_sfz_sample_set_flags(sfz_sample, AGS_SFZ_SAMPLE_CONNECTED); } void ags_sfz_sample_disconnect(AgsConnectable *connectable) { AgsSFZSample *sfz_sample; if(!ags_connectable_is_connected(connectable)){ return; } sfz_sample = AGS_SFZ_SAMPLE(connectable); ags_sfz_sample_unset_flags(sfz_sample, AGS_SFZ_SAMPLE_CONNECTED); } gboolean ags_sfz_sample_open(AgsSoundResource *sound_resource, gchar *filename) { AgsSFZSample *sfz_sample; guint format; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); /* info */ g_rec_mutex_lock(sfz_sample_mutex); if(sfz_sample->info != NULL){ g_rec_mutex_unlock(sfz_sample_mutex); return(FALSE); } sfz_sample->info = (SF_INFO *) malloc(sizeof(SF_INFO)); sfz_sample->info->format = 0; sfz_sample->info->channels = 0; sfz_sample->info->samplerate = 0; g_rec_mutex_unlock(sfz_sample_mutex); if(filename != NULL){ sfz_sample->file = (SNDFILE *) sf_open(filename, SFM_READ, sfz_sample->info); } if(sfz_sample->file == NULL){ return(FALSE); } format = AGS_SOUNDCARD_DOUBLE; switch(((SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_16 | SF_FORMAT_PCM_24 | SF_FORMAT_PCM_32 | SF_FORMAT_FLOAT | SF_FORMAT_DOUBLE) & sfz_sample->info->format)){ case SF_FORMAT_PCM_S8: { //TODO:JK: implement me //format = AGS_SOUNDCARD_SIGNED_8_BIT; format = AGS_SOUNDCARD_DOUBLE; } break; case SF_FORMAT_PCM_16: { format = AGS_SOUNDCARD_SIGNED_16_BIT; } break; case SF_FORMAT_PCM_24: { //TODO:JK: implement me //format = AGS_SOUNDCARD_SIGNED_24_BIT; format = AGS_SOUNDCARD_DOUBLE; } break; case SF_FORMAT_PCM_32: { //TODO:JK: implement me //format = AGS_SOUNDCARD_SIGNED_32_BIT; format = AGS_SOUNDCARD_DOUBLE; } break; case SF_FORMAT_FLOAT: { format = AGS_SOUNDCARD_FLOAT; } break; case SF_FORMAT_DOUBLE: { format = AGS_SOUNDCARD_DOUBLE; } break; } g_object_set(sfz_sample, "filename", filename, "audio-channels", sfz_sample->info->channels, "format", format, NULL); #ifdef AGS_DEBUG g_message("ags_sfz_sample_open(): channels %d frames %d", sfz_sample->info->channels, sfz_sample->info->frames); #endif return(TRUE); } gboolean ags_sfz_sample_rw_open(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create) { AgsSFZSample *sfz_sample; guint major_format; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); /* info */ g_rec_mutex_lock(sfz_sample_mutex); if(sfz_sample->info != NULL){ g_rec_mutex_unlock(sfz_sample_mutex); return(FALSE); } if(!create && !g_file_test(filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ g_rec_mutex_unlock(sfz_sample_mutex); return(FALSE); } sfz_sample->info = (SF_INFO *) malloc(sizeof(SF_INFO)); memset(sfz_sample->info, 0, sizeof(SF_INFO)); sfz_sample->info->samplerate = (int) samplerate; sfz_sample->info->channels = (int) audio_channels; g_rec_mutex_unlock(sfz_sample_mutex); if(g_str_has_suffix(filename, ".wav")){ major_format = SF_FORMAT_WAV; sfz_sample->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sfz_sample, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); }else if(g_str_has_suffix(filename, ".flac")){ major_format = SF_FORMAT_FLAC; sfz_sample->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sfz_sample, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); }else if(g_str_has_suffix(filename, ".aiff")){ major_format = SF_FORMAT_AIFF; sfz_sample->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sfz_sample, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); }else if(g_str_has_suffix(filename, ".ogg")){ major_format = SF_FORMAT_OGG; sfz_sample->info->format = major_format | SF_FORMAT_VORBIS; g_object_set(sfz_sample, "format", AGS_SOUNDCARD_DOUBLE, NULL); }else{ major_format = SF_FORMAT_WAV; sfz_sample->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sfz_sample, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); } sfz_sample->info->frames = 0; sfz_sample->info->seekable = 0; sfz_sample->info->sections = 0; if(!sf_format_check(sfz_sample->info)){ g_warning("invalid format"); } if(filename != NULL){ sfz_sample->file = (SNDFILE *) sf_open(filename, SFM_RDWR, sfz_sample->info); } g_object_set(sfz_sample, "filename", filename, "audio-channels", audio_channels, NULL); if(sfz_sample->file == NULL){ return(FALSE); } #ifdef AGS_DEBUG g_message("ags_sfz_sample_rw_open(): channels %d frames %d", sfz_sample->info->channels, sfz_sample->info->frames); #endif return(TRUE); } gboolean ags_sfz_sample_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end) { AgsSFZSample *sfz_sample; guint sample_frame_count; guint sample_loop_start, sample_loop_end; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); /* info */ sample_frame_count = 0; g_rec_mutex_lock(sfz_sample_mutex); if(sfz_sample->info != NULL){ sample_frame_count = sfz_sample->info->frames; } g_rec_mutex_unlock(sfz_sample_mutex); g_object_get(sfz_sample, "loop-start", &sample_loop_start, "loop-end", &sample_loop_end, NULL); if(frame_count != NULL){ *frame_count = sample_frame_count; } if(loop_start != NULL){ *loop_start = sample_loop_start; } if(loop_end != NULL){ *loop_end = sample_loop_end; } return(TRUE); } void ags_sfz_sample_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format) { AgsSFZSample *sfz_sample; gint sample_format; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); g_object_set(sfz_sample, "buffer-size", buffer_size, "format", format, NULL); if(sfz_sample->info == NULL){ return; } sfz_sample->info->channels = channels; sfz_sample->info->samplerate = samplerate; sfz_sample->info->format &= (~(SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_16 | SF_FORMAT_PCM_24 | SF_FORMAT_PCM_32 | SF_FORMAT_FLOAT | SF_FORMAT_DOUBLE)); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { sfz_sample->info->format |= SF_FORMAT_PCM_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { sfz_sample->info->format |= SF_FORMAT_PCM_16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { sfz_sample->info->format |= SF_FORMAT_PCM_24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { sfz_sample->info->format |= SF_FORMAT_PCM_32; } break; case AGS_SOUNDCARD_FLOAT: { sfz_sample->info->format |= SF_FORMAT_FLOAT; } break; case AGS_SOUNDCARD_DOUBLE: { sfz_sample->info->format |= SF_FORMAT_DOUBLE; } break; } } void ags_sfz_sample_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format) { AgsSFZSample *sfz_sample; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); if(sfz_sample->info == NULL){ if(channels != NULL){ *channels = 0; } if(samplerate != NULL){ *samplerate = 0; } if(buffer_size != NULL){ *buffer_size = 0; } if(format != NULL){ *format = 0; } return; } g_rec_mutex_lock(sfz_sample_mutex); if(channels != NULL){ *channels = sfz_sample->info->channels; } if(samplerate != NULL){ *samplerate = sfz_sample->info->samplerate; } if(buffer_size != NULL){ *buffer_size = sfz_sample->buffer_size; } if(format != NULL){ switch(((SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_16 | SF_FORMAT_PCM_24 | SF_FORMAT_PCM_32 | SF_FORMAT_FLOAT | SF_FORMAT_DOUBLE) & sfz_sample->info->format)){ case SF_FORMAT_PCM_S8: { *format = AGS_SOUNDCARD_SIGNED_8_BIT; } break; case SF_FORMAT_PCM_16: { *format = AGS_SOUNDCARD_SIGNED_16_BIT; } break; case SF_FORMAT_PCM_24: { *format = AGS_SOUNDCARD_SIGNED_24_BIT; } break; case SF_FORMAT_PCM_32: { *format = AGS_SOUNDCARD_SIGNED_32_BIT; } break; case SF_FORMAT_FLOAT: { *format = AGS_SOUNDCARD_FLOAT; } break; case SF_FORMAT_DOUBLE: { *format = AGS_SOUNDCARD_DOUBLE; } break; } } g_rec_mutex_unlock(sfz_sample_mutex); } guint ags_sfz_sample_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format) { AgsSFZSample *sfz_sample; sf_count_t multi_frames; guint total_frame_count; guint read_count; guint copy_mode; gboolean use_cache; guint i; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz_sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); ags_sound_resource_info(sound_resource, &total_frame_count, NULL, NULL); g_rec_mutex_lock(sfz_sample_mutex); if(sfz_sample->offset >= total_frame_count){ g_rec_mutex_unlock(sfz_sample_mutex); return(0); } if(sfz_sample->offset + frame_count >= total_frame_count){ if(total_frame_count > sfz_sample->offset){ frame_count = total_frame_count - sfz_sample->offset; }else{ g_rec_mutex_unlock(sfz_sample_mutex); return(0); } } #if 0 use_cache = FALSE; if(sfz_sample->buffer_offset == sfz_sample->offset && frame_count <= sfz_sample->buffer_size){ use_cache = TRUE; } #endif sfz_sample->buffer_offset = sfz_sample->offset; read_count = sfz_sample->buffer_size; copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(sfz_sample->format)); g_rec_mutex_unlock(sfz_sample_mutex); for(i = 0; i < frame_count && sfz_sample->offset + i < total_frame_count; ){ sf_count_t retval; if(sfz_sample->offset + frame_count > total_frame_count){ read_count = total_frame_count - sfz_sample->offset; } multi_frames = read_count * sfz_sample->info->channels; retval = -1; // if(!use_cache){ // g_message("read %d %d", sfz_sample->offset, sfz_sample->buffer_size); switch(sfz_sample->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { //TODO:JK: implement me retval = 0; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { retval = sf_read_short(sfz_sample->file, sfz_sample->buffer, multi_frames); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //TODO:JK: implement me retval = 0; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { //TODO:JK: implement me retval = 0; } break; case AGS_SOUNDCARD_FLOAT: { retval = sf_read_float(sfz_sample->file, sfz_sample->buffer, multi_frames); } break; case AGS_SOUNDCARD_DOUBLE: { retval = sf_read_double(sfz_sample->file, sfz_sample->buffer, multi_frames); } break; } sfz_sample->offset += read_count; if(retval == -1){ g_warning("read failed"); } if(retval != multi_frames){ break; } // } ags_audio_buffer_util_copy_buffer_to_buffer(dbuffer, daudio_channels, (i * daudio_channels), sfz_sample->buffer, sfz_sample->info->channels, audio_channel, read_count, copy_mode); // g_message("[%d] %d", audio_channel, ags_synth_util_get_xcross_count_s16(dbuffer, read_count)); i += read_count; } return(frame_count); } void ags_sfz_sample_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format) { AgsSFZSample *sfz_sample; guint copy_mode; sf_count_t multi_frames; guint i; gboolean do_write; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz_sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); g_rec_mutex_lock(sfz_sample_mutex); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(sfz_sample->format), ags_audio_buffer_util_format_from_soundcard(format)); ags_audio_buffer_util_copy_buffer_to_buffer(sfz_sample->buffer, sfz_sample->info->channels, audio_channel, sbuffer, saudio_channels, audio_channel, frame_count, copy_mode); sfz_sample->audio_channel_written[audio_channel] = frame_count; do_write = TRUE; for(i = 0; i < sfz_sample->audio_channels; i++){ if(sfz_sample->audio_channel_written[i] == -1){ do_write = FALSE; break; } } g_rec_mutex_unlock(sfz_sample_mutex); if(do_write){ multi_frames = frame_count * sfz_sample->info->channels; switch(sfz_sample->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { //TODO:JK: implement me } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { sf_write_short(sfz_sample->file, sfz_sample->buffer, multi_frames); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //TODO:JK: implement me } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { //TODO:JK: implement me } break; case AGS_SOUNDCARD_FLOAT: { sf_write_float(sfz_sample->file, sfz_sample->buffer, multi_frames); } break; case AGS_SOUNDCARD_DOUBLE: { sf_write_double(sfz_sample->file, sfz_sample->buffer, multi_frames); } break; } for(i = 0; i < sfz_sample->audio_channels; i++){ sfz_sample->audio_channel_written[i] = -1; } if(sfz_sample->format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(sfz_sample->buffer, sfz_sample->info->channels, frame_count); }else if(sfz_sample->format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(sfz_sample->buffer, sfz_sample->info->channels, frame_count); }else{ ags_audio_buffer_util_clear_buffer(sfz_sample->buffer, sfz_sample->info->channels, frame_count, ags_audio_buffer_util_format_from_soundcard(sfz_sample->format)); } sfz_sample->offset += frame_count; } } void ags_sfz_sample_flush(AgsSoundResource *sound_resource) { AgsSFZSample *sfz_sample; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); if(sfz_sample->file == NULL){ return; } sf_write_sync(sfz_sample->file); } void ags_sfz_sample_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence) { AgsSFZSample *sfz_sample; guint total_frame_count; sf_count_t retval; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz_sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); ags_sound_resource_info(sound_resource, &total_frame_count, NULL, NULL); g_rec_mutex_lock(sfz_sample_mutex); if(whence == G_SEEK_CUR){ if(frame_count >= 0){ if(sfz_sample->offset + frame_count < total_frame_count){ sfz_sample->offset += total_frame_count; }else{ sfz_sample->offset = total_frame_count; } }else{ if(sfz_sample->offset + frame_count >= 0){ sfz_sample->offset += total_frame_count; }else{ sfz_sample->offset = 0; } } }else if(whence == G_SEEK_SET){ if(frame_count >= 0){ if(frame_count < total_frame_count){ sfz_sample->offset = frame_count; }else{ sfz_sample->offset = total_frame_count; } }else{ sfz_sample->offset = 0; } }else if(whence == G_SEEK_END){ if(frame_count > 0){ sfz_sample->offset = total_frame_count; }else{ if(total_frame_count + frame_count > 0){ sfz_sample->offset = total_frame_count + total_frame_count; }else{ sfz_sample->offset = 0; } } } g_rec_mutex_unlock(sfz_sample_mutex); retval = sf_seek(sfz_sample->file, sfz_sample->offset, SEEK_SET); if(retval == -1){ g_warning("seek failed"); } } void ags_sfz_sample_close(AgsSoundResource *sound_resource) { AgsSFZSample *sfz_sample; GRecMutex *sfz_sample_mutex; sfz_sample = AGS_SFZ_SAMPLE(sound_resource); /* get sfz sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); if(sfz_sample->file == NULL){ return; } sf_close(sfz_sample->file); g_rec_mutex_lock(sfz_sample_mutex); if(sfz_sample->info != NULL){ free(sfz_sample->info); } sfz_sample->file = NULL; sfz_sample->info = NULL; g_rec_mutex_unlock(sfz_sample_mutex); } /** * ags_sfz_sample_test_flags: * @sfz_sample: the #AgsSFZSample * @flags: the flags * * Test @flags to be set on @sfz_sample. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sfz_sample_test_flags(AgsSFZSample *sfz_sample, guint flags) { gboolean retval; GRecMutex *sfz_sample_mutex; if(!AGS_IS_SFZ_SAMPLE(sfz_sample)){ return(FALSE); } /* get sfz_sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); /* test */ g_rec_mutex_lock(sfz_sample_mutex); retval = (flags & (sfz_sample->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(sfz_sample_mutex); return(retval); } /** * ags_sfz_sample_set_flags: * @sfz_sample: the #AgsSFZSample * @flags: see #AgsSFZSampleFlags-enum * * Enable a feature of @sfz_sample. * * Since: 3.0.0 */ void ags_sfz_sample_set_flags(AgsSFZSample *sfz_sample, guint flags) { GRecMutex *sfz_sample_mutex; if(!AGS_IS_SFZ_SAMPLE(sfz_sample)){ return; } /* get sfz_sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(sfz_sample_mutex); sfz_sample->flags |= flags; g_rec_mutex_unlock(sfz_sample_mutex); } /** * ags_sfz_sample_unset_flags: * @sfz_sample: the #AgsSFZSample * @flags: see #AgsSFZSampleFlags-enum * * Disable a feature of @sfz_sample. * * Since: 3.0.0 */ void ags_sfz_sample_unset_flags(AgsSFZSample *sfz_sample, guint flags) { GRecMutex *sfz_sample_mutex; if(!AGS_IS_SFZ_SAMPLE(sfz_sample)){ return; } /* get sfz_sample mutex */ sfz_sample_mutex = AGS_SFZ_SAMPLE_GET_OBJ_MUTEX(sfz_sample); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(sfz_sample_mutex); sfz_sample->flags &= (~flags); g_rec_mutex_unlock(sfz_sample_mutex); } /** * ags_sfz_sample_new: * * Creates a new instance of #AgsSFZSample. * * Returns: the new #AgsSFZSample. * * Since: 3.0.0 */ AgsSFZSample* ags_sfz_sample_new() { AgsSFZSample *sfz_sample; sfz_sample = (AgsSFZSample *) g_object_new(AGS_TYPE_SFZ_SAMPLE, NULL); return(sfz_sample); } gsequencer-3.1.3/ags/audio/file/ags_sound_resource.h0000644000175000017500000001170713607210263017442 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUND_RESOURCE_H__ #define __AGS_SOUND_RESOURCE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUND_RESOURCE (ags_sound_resource_get_type()) #define AGS_SOUND_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUND_RESOURCE, AgsSoundResource)) #define AGS_SOUND_RESOURCE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SOUND_RESOURCE, AgsSoundResourceInterface)) #define AGS_IS_SOUND_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SOUND_RESOURCE)) #define AGS_IS_SOUND_RESOURCE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SOUND_RESOURCE)) #define AGS_SOUND_RESOURCE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SOUND_RESOURCE, AgsSoundResourceInterface)) typedef struct _AgsSoundResource AgsSoundResource; typedef struct _AgsSoundResourceInterface AgsSoundResourceInterface; struct _AgsSoundResourceInterface { GTypeInterface ginterface; gboolean (*open)(AgsSoundResource *sound_resource, gchar *filename); gboolean (*rw_open)(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create); void (*load)(AgsSoundResource *sound_resource); void (*info)(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end); void (*set_presets)(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format); void (*get_presets)(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format); /* read sample data */ guint (*read)(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format); /* write sample data */ void (*write)(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format); void (*flush)(AgsSoundResource *sound_resource); /* position */ void (*seek)(AgsSoundResource *sound_resource, gint64 frame_count, gint whence); /* close */ void (*close)(AgsSoundResource *sound_resource); }; GType ags_sound_resource_get_type(); gboolean ags_sound_resource_open(AgsSoundResource *sound_resource, gchar *filename); gboolean ags_sound_resource_rw_open(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create); void ags_sound_resource_load(AgsSoundResource *sound_resource); void ags_sound_resource_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end); void ags_sound_resource_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format); void ags_sound_resource_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format); /* read sample data */ guint ags_sound_resource_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format); /* write sample data */ void ags_sound_resource_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format); void ags_sound_resource_flush(AgsSoundResource *sound_resource); /* position */ void ags_sound_resource_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence); /* read audio signal */ GList* ags_sound_resource_read_audio_signal(AgsSoundResource *sound_resource, GObject *soundcard, gint audio_channel); GList* ags_sound_resource_read_wave(AgsSoundResource *sound_resource, GObject *soundcard, gint audio_channel, guint64 x_offset, gdouble delay, guint attack); /* close */ void ags_sound_resource_close(AgsSoundResource *sound_resource); G_END_DECLS #endif /*__AGS_SOUND_RESOURCE_H__*/ gsequencer-3.1.3/ags/audio/file/ags_audio_file_link.c0000644000175000017500000003266513607210263017521 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include void ags_audio_file_link_class_init(AgsAudioFileLinkClass *audio_file_link); void ags_audio_file_link_init(AgsAudioFileLink *audio_file_link); void ags_audio_file_link_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_audio_file_link_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_audio_file_link_finalize(GObject *gobject); void ags_audio_file_link_read_launch(AgsFileLaunch *file_launch, AgsAudioFileLink *audio_file_link); /** * SECTION:ags_audio_file_link * @short_description: link objects read of file. * @title: AgsAudioFileLink * @section_id: * @include: ags/file/ags_audio_file_link.h * * The #AgsAudioFileLink links read objects of file. */ enum{ PROP_0, PROP_PRESET, PROP_INSTRUMENT, PROP_SAMPLE, PROP_AUDIO_CHANNEL, PROP_TIMESTAMP, }; static gpointer ags_audio_file_link_parent_class = NULL; GType ags_audio_file_link_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_audio_file_link = 0; static const GTypeInfo ags_audio_file_link_info = { sizeof (AgsAudioFileLinkClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_audio_file_link_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAudioFileLink), 0, /* n_preallocs */ (GInstanceInitFunc) ags_audio_file_link_init, }; ags_type_audio_file_link = g_type_register_static(AGS_TYPE_FILE_LINK, "AgsAudioFileLink", &ags_audio_file_link_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_audio_file_link); } return g_define_type_id__volatile; } void ags_audio_file_link_class_init(AgsAudioFileLinkClass *audio_file_link) { GObjectClass *gobject; GParamSpec *param_spec; ags_audio_file_link_parent_class = g_type_class_peek_parent(audio_file_link); /* GObjectClass */ gobject = (GObjectClass *) audio_file_link; gobject->set_property = ags_audio_file_link_set_property; gobject->get_property = ags_audio_file_link_get_property; gobject->finalize = ags_audio_file_link_finalize; /* properties */ /** * AgsAudioFileLink:preset: * * The assigned preset. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset", i18n_pspec("the preset"), i18n_pspec("The preset to locate the file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /** * AgsAudioFileLink:instrument: * * The assigned instrument. * * Since: 3.0.0 */ param_spec = g_param_spec_string("instrument", i18n_pspec("the instrument"), i18n_pspec("The instrument to locate the file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_INSTRUMENT, param_spec); /** * AgsAudioFileLink:sample: * * The assigned sample. * * Since: 3.0.0 */ param_spec = g_param_spec_string("sample", i18n_pspec("the sample"), i18n_pspec("The sample to locate the file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLE, param_spec); /** * AgsAudioFileLink:audio-channel: * * The assigned audio channel. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channel", i18n_pspec("audio channel to read"), i18n_pspec("The selected audio channel to read"), 0, 256, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNEL, param_spec); /** * AgsAudioFileLink:timestamp: * * The assigned timestamp. * * Since: 3.0.0 */ param_spec = g_param_spec_object("timestamp", i18n_pspec("timestamp"), i18n_pspec("The timestamp"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TIMESTAMP, param_spec); } void ags_audio_file_link_init(AgsAudioFileLink *audio_file_link) { audio_file_link->preset = NULL; audio_file_link->instrument = NULL; audio_file_link->sample = NULL; audio_file_link->audio_channel = 0; audio_file_link->timestamp = NULL; } void ags_audio_file_link_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsAudioFileLink *audio_file_link; GRecMutex *file_link_mutex; audio_file_link = AGS_AUDIO_FILE_LINK(gobject); /* get file link mutex */ file_link_mutex = AGS_FILE_LINK_GET_OBJ_MUTEX(audio_file_link); switch(prop_id){ case PROP_PRESET: { char *preset; preset = (char *) g_value_get_string(value); g_rec_mutex_lock(file_link_mutex); if(preset == audio_file_link->preset){ g_rec_mutex_unlock(file_link_mutex); return; } if(audio_file_link->preset != NULL){ free(audio_file_link->preset); } audio_file_link->preset = g_strdup(preset); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_INSTRUMENT: { char *instrument; instrument = (char *) g_value_get_string(value); g_rec_mutex_lock(file_link_mutex); if(instrument == audio_file_link->instrument){ g_rec_mutex_unlock(file_link_mutex); return; } if(audio_file_link->instrument != NULL){ free(audio_file_link->instrument); } audio_file_link->instrument = g_strdup(instrument); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_SAMPLE: { char *sample; sample = (char *) g_value_get_string(value); g_rec_mutex_lock(file_link_mutex); if(sample == audio_file_link->sample){ g_rec_mutex_unlock(file_link_mutex); return; } if(audio_file_link->sample != NULL){ free(audio_file_link->sample); } audio_file_link->sample = g_strdup(sample); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(file_link_mutex); audio_file_link->audio_channel = g_value_get_uint(value); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_TIMESTAMP: { GObject *timestamp; timestamp = (GObject *) g_value_get_object(value); g_rec_mutex_lock(file_link_mutex); if((AgsTimestamp *) timestamp == audio_file_link->timestamp){ g_rec_mutex_unlock(file_link_mutex); return; } if(audio_file_link->timestamp != NULL){ g_object_unref(audio_file_link->timestamp); } if(timestamp != NULL){ g_object_ref(timestamp); } audio_file_link->timestamp = (AgsTimestamp *) timestamp; g_rec_mutex_unlock(file_link_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_file_link_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsAudioFileLink *audio_file_link; GRecMutex *file_link_mutex; audio_file_link = AGS_AUDIO_FILE_LINK(gobject); /* get file link mutex */ file_link_mutex = AGS_FILE_LINK_GET_OBJ_MUTEX(audio_file_link); switch(prop_id){ case PROP_PRESET: { g_rec_mutex_lock(file_link_mutex); g_value_set_string(value, audio_file_link->preset); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_INSTRUMENT: { g_rec_mutex_lock(file_link_mutex); g_value_set_string(value, audio_file_link->instrument); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_SAMPLE: { g_rec_mutex_lock(file_link_mutex); g_value_set_string(value, audio_file_link->sample); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_AUDIO_CHANNEL: { g_rec_mutex_lock(file_link_mutex); g_value_set_uint(value, audio_file_link->audio_channel); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_TIMESTAMP: { g_rec_mutex_lock(file_link_mutex); g_value_set_object(value, audio_file_link->timestamp); g_rec_mutex_unlock(file_link_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_audio_file_link_finalize(GObject *gobject) { AgsAudioFileLink *audio_file_link; audio_file_link = AGS_AUDIO_FILE_LINK(gobject); if(audio_file_link->timestamp != NULL){ g_object_unref(audio_file_link->timestamp); } } void ags_audio_file_link_read_launch(AgsFileLaunch *file_launch, AgsAudioFileLink *audio_file_link) { AgsChannel *input; AgsAudioFile *audio_file; AgsFileIdRef *id_ref; GObject *soundcard; GList *audio_signal; xmlNode *node, *child; xmlChar *type; xmlChar *filename; xmlChar *encoding, *demuxer; guint audio_channel; node = file_launch->node; soundcard = NULL; audio_channel = audio_file_link->audio_channel; filename = NULL; /* retrieve input */ input = NULL; id_ref = (AgsFileIdRef *) ags_file_find_id_ref_by_node((AgsFile *) file_launch->file, node->parent->parent->parent); if(id_ref != NULL){ input = (AgsChannel *) id_ref->ref; soundcard = input->output_soundcard; } /* read file link using URL or embedded */ type = xmlGetProp(node->parent, "type"); if(!xmlStrncmp(type, "url", 4)){ //TODO:JK: add missing /* instantiat audio file */ filename = AGS_FILE_LINK(audio_file_link)->filename; audio_file = ags_audio_file_new((gchar *) filename, soundcard, audio_channel); /* open file and read audio signal */ ags_audio_file_open(audio_file); ags_audio_file_read_audio_signal(audio_file); /* retrieve audio signal */ if(audio_file->audio_signal == NULL){ return; } audio_signal = audio_file->audio_signal; /* set template flag */ AGS_AUDIO_SIGNAL(audio_signal->data)->flags |= AGS_AUDIO_SIGNAL_TEMPLATE; /* unlink if needed */ if(input != NULL && input->link != NULL){ GError *error; error = NULL; ags_channel_set_link(input, NULL, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } /* set file link */ g_object_set(G_OBJECT(input), "file-link", g_object_new(AGS_TYPE_FILE_LINK, "filename", filename, NULL), NULL); if(input == NULL || audio_signal == NULL){ return; } /* add audio signal */ ags_recycling_add_audio_signal(input->first_recycling, AGS_AUDIO_SIGNAL(audio_signal->data)); }else if(!xmlStrncmp(type, "embedded", 9)){ xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; /* */ xpath_context = xmlXPathNewContext(AGS_FILE(file_launch->file)->doc); // xmlXPathSetContextNode(node, // xpath_context); xpath_context->node = node; xpath_object = xmlXPathEval("./ags-embedded-audio", xpath_context); child = NULL; if(xpath_object->nodesetval != NULL && xpath_object->nodesetval->nodeTab != NULL){ guint i; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(xpath_object->nodesetval->nodeTab[i]->type == XML_ELEMENT_NODE){ child = xpath_object->nodesetval->nodeTab[i]; break; } } } if(child != NULL){ /**/ encoding = xmlGetProp(child, "encoding"); demuxer = xmlGetProp(child, "demuxer"); if(!xmlStrncmp(encoding, "base64", 7)){ if(!xmlStrncmp(demuxer, "raw", 4)){ gchar *data; audio_file = ags_audio_file_new(NULL, soundcard, audio_channel); data = child->content; ags_audio_file_open_from_data(audio_file, data); ags_audio_file_read_audio_signal(audio_file); audio_signal = audio_file->audio_signal; if(input == NULL || audio_signal == NULL){ return; } ags_recycling_add_audio_signal(input->first_recycling, AGS_AUDIO_SIGNAL(audio_signal->data)); } } } } } /** * ags_audio_file_link_new: * * Create a new instance of #AgsAudioFileLink * * Returns: the new #AgsAudioFileLink * * Since: 3.0.0 */ AgsAudioFileLink* ags_audio_file_link_new() { AgsAudioFileLink *audio_file_link; audio_file_link = (AgsAudioFileLink *) g_object_new(AGS_TYPE_AUDIO_FILE_LINK, NULL); return(audio_file_link); } gsequencer-3.1.3/ags/audio/file/ags_ipatch.h0000644000175000017500000000637513607210263015660 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_IPATCH_H__ #define __AGS_IPATCH_H__ #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif G_BEGIN_DECLS #define AGS_TYPE_IPATCH (ags_ipatch_get_type()) #define AGS_IPATCH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_IPATCH, AgsIpatch)) #define AGS_IPATCH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_IPATCH, AgsIpatchClass)) #define AGS_IS_IPATCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_IPATCH)) #define AGS_IS_IPATCH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_IPATCH)) #define AGS_IPATCH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_IPATCH, AgsIpatchClass)) #define AGS_IPATCH_GET_OBJ_MUTEX(obj) (&(((AgsIpatch *) obj)->obj_mutex)) #define AGS_IPATCH_DEFAULT_CHANNELS (2) #define AGS_IPATCH_READ "r" #define AGS_IPATCH_WRITE "w" typedef struct _AgsIpatch AgsIpatch; typedef struct _AgsIpatchClass AgsIpatchClass; /** * AgsIpatchFlags: * @AGS_IPATCH_ADDED_TO_REGISTRY: the ipatch was added to registry, see #AgsConnectable::add_to_registry() * @AGS_IPATCH_CONNECTED: indicates the ipatch was connected by calling #AgsConnectable::connect() * @AGS_IPATCH_DLS2: DLS2 format * @AGS_IPATCH_SF2: Soundfont2 format * @AGS_IPATCH_GIG: Gigasampler format * * Enum values to control the behavior or indicate internal state of #AgsFifoout by * enable/disable as flags. */ typedef enum{ AGS_IPATCH_ADDED_TO_REGISTRY = 1, AGS_IPATCH_CONNECTED = 1 << 1, AGS_IPATCH_DLS2 = 1 << 2, AGS_IPATCH_SF2 = 1 << 3, AGS_IPATCH_GIG = 1 << 4, }AgsIpatchFlags; struct _AgsIpatch { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *soundcard; char *filename; char *mode; #ifdef AGS_WITH_LIBINSTPATCH IpatchFile *file; IpatchFileHandle *handle; #else gpointer file; gpointer handle; #endif guint nesting_level; gchar *level_id; guint level_index; GObject *reader; GObject *writer; GList *audio_signal; }; struct _AgsIpatchClass { GObjectClass gobject; }; GType ags_ipatch_get_type(); gboolean ags_ipatch_test_flags(AgsIpatch *ipatch, guint flags); void ags_ipatch_set_flags(AgsIpatch *ipatch, guint flags); void ags_ipatch_unset_flags(AgsIpatch *ipatch, guint flags); gboolean ags_ipatch_check_suffix(gchar *filename); AgsIpatch* ags_ipatch_new(); G_END_DECLS #endif /*__AGS_IPATCH_H__*/ gsequencer-3.1.3/ags/audio/file/ags_ipatch_sf2_reader.h0000644000175000017500000001205613607210263017745 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_IPATCH_SF2_READER_H__ #define __AGS_IPATCH_SF2_READER_H__ #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_IPATCH_SF2_READER (ags_ipatch_sf2_reader_get_type()) #define AGS_IPATCH_SF2_READER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_IPATCH_SF2_READER, AgsIpatchSF2Reader)) #define AGS_IPATCH_SF2_READER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_IPATCH_SF2_READER, AgsIpatchSF2ReaderClass)) #define AGS_IS_IPATCH_SF2_READER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_IPATCH_SF2_READER)) #define AGS_IS_IPATCH_SF2_READER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_IPATCH_SF2_READER)) #define AGS_IPATCH_SF2_READER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_IPATCH_SF2_READER, AgsIpatchSF2ReaderClass)) #define AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX(obj) (&(((AgsIpatchSF2Reader *) obj)->obj_mutex)) typedef struct _AgsIpatchSF2Reader AgsIpatchSF2Reader; typedef struct _AgsIpatchSF2ReaderClass AgsIpatchSF2ReaderClass; /** * AgsIpatchSF2ReaderFlags: * @AGS_IPATCH_SF2_READER_ADDED_TO_REGISTRY: the ipatch sample was added to registry, see #AgsConnectable::add_to_registry() * @AGS_IPATCH_SF2_READER_CONNECTED: indicates the ipatch sample was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsIpatchSF2Reader by * enable/disable as flags. */ typedef enum{ AGS_IPATCH_SF2_READER_ADDED_TO_REGISTRY = 1, AGS_IPATCH_SF2_READER_CONNECTED = 1 << 1, }AgsIpatchSF2ReaderFlags; /** * AgsSF2Level: * @AGS_SF2_FILENAME: filename * @AGS_SF2_PHDR: preset header * @AGS_SF2_IHDR: instrument header * @AGS_SF2_SHDR: sample header * * Enum values to describe the different levels of a Soundfont2 file. */ typedef enum{ AGS_SF2_FILENAME = 0, AGS_SF2_PHDR = 1, AGS_SF2_IHDR = 2, AGS_SF2_SHDR = 3, }AgsSF2Level; struct _AgsIpatchSF2Reader { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint level; AgsIpatch *ipatch; guint *index_selected; gchar **name_selected; #ifdef AGS_WITH_LIBINSTPATCH IpatchSF2Reader *reader; IpatchBase *base; IpatchSF2 *sf2; IpatchContainer *preset; IpatchContainer *instrument; IpatchContainer *sample; #else gpointer reader; gpointer base; gpointer sf2; gpointer preset; gpointer instrument; gpointer sample; #endif GError *error; }; struct _AgsIpatchSF2ReaderClass { GObjectClass gobject; }; GType ags_ipatch_sf2_reader_get_type(); gboolean ags_ipatch_sf2_reader_test_flags(AgsIpatchSF2Reader *ipatch_sf2_reader, guint flags); void ags_ipatch_sf2_reader_set_flags(AgsIpatchSF2Reader *ipatch_sf2_reader, guint flags); void ags_ipatch_sf2_reader_unset_flags(AgsIpatchSF2Reader *ipatch_sf2_reader, guint flags); #ifdef AGS_WITH_LIBINSTPATCH gboolean ags_ipatch_sf2_reader_load(AgsIpatchSF2Reader *ipatch_sf2_reader, IpatchFileHandle *handle); #endif /* select sample */ gboolean ags_ipatch_sf2_reader_select_preset(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index); gboolean ags_ipatch_sf2_reader_select_instrument(AgsIpatchSF2Reader *ipatch_sf2_reader, guint instrument_index); gboolean ags_ipatch_sf2_reader_select_sample(AgsIpatchSF2Reader *ipatch_sf2_reader, guint sample_index); /* query */ gchar** ags_ipatch_sf2_reader_get_preset_all(AgsIpatchSF2Reader *ipatch_sf2_reader); gchar** ags_ipatch_sf2_reader_get_instrument_all(AgsIpatchSF2Reader *ipatch_sf2_reader); gchar** ags_ipatch_sf2_reader_get_sample_all(AgsIpatchSF2Reader *ipatch_sf2_reader); gchar** ags_ipatch_sf2_reader_get_instrument_by_preset_index(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index); gchar** ags_ipatch_sf2_reader_get_sample_by_preset_index(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index); gchar** ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index(AgsIpatchSF2Reader *ipatch_sf2_reader, guint preset_index, guint instrument_index); /* instantiate */ AgsIpatchSF2Reader* ags_ipatch_sf2_reader_new(AgsIpatch *ipatch); G_END_DECLS #endif /*__AGS_IPATCH_SF2_READER_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sfz_region.h0000644000175000017500000000566313607210263016554 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SFZ_REGION_H__ #define __AGS_SFZ_REGION_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SFZ_REGION (ags_sfz_region_get_type()) #define AGS_SFZ_REGION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SFZ_REGION, AgsSFZRegion)) #define AGS_SFZ_REGION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SFZ_REGION, AgsSFZRegionClass)) #define AGS_IS_SFZ_REGION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SFZ_REGION)) #define AGS_IS_SFZ_REGION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SFZ_REGION)) #define AGS_SFZ_REGION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SFZ_REGION, AgsSFZRegionClass)) #define AGS_SFZ_REGION_GET_OBJ_MUTEX(obj) (&(((AgsSFZRegion *) obj)->obj_mutex)) typedef struct _AgsSFZRegion AgsSFZRegion; typedef struct _AgsSFZRegionClass AgsSFZRegionClass; /** * AgsSFZRegionFlags: * @AGS_SFZ_REGION_ADDED_TO_REGISTRY: the sfz region was added to registry, see #AgsConnectable::add_to_registry() * @AGS_SFZ_REGION_CONNECTED: indicates the sfz region was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsSFZRegion by * enable/disable as flags. */ typedef enum{ AGS_SFZ_REGION_ADDED_TO_REGISTRY = 1, AGS_SFZ_REGION_CONNECTED = 1 << 1, }AgsSFZRegionFlags; struct _AgsSFZRegion { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gint nth_region; GObject *group; GObject *sample; GHashTable *control; }; struct _AgsSFZRegionClass { GObjectClass gobject; }; GType ags_sfz_region_get_type(); gboolean ags_sfz_region_test_flags(AgsSFZRegion *sfz_region, guint flags); void ags_sfz_region_set_flags(AgsSFZRegion *sfz_region, guint flags); void ags_sfz_region_unset_flags(AgsSFZRegion *sfz_region, guint flags); void ags_sfz_region_insert_control(AgsSFZRegion *sfz_region, gchar *key, gchar *value); gchar* ags_sfz_region_lookup_control(AgsSFZRegion *sfz_region, gchar *key); /* instantiate */ AgsSFZRegion* ags_sfz_region_new(); G_END_DECLS #endif /*__AGS_SFZ_REGION_H__*/ gsequencer-3.1.3/ags/audio/file/ags_audio_file.h0000644000175000017500000001030313607210263016472 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUDIO_FILE_H__ #define __AGS_AUDIO_FILE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUDIO_FILE (ags_audio_file_get_type()) #define AGS_AUDIO_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUDIO_FILE, AgsAudioFile)) #define AGS_AUDIO_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUDIO_FILE, AgsAudioFileClass)) #define AGS_IS_AUDIO_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUDIO_FILE)) #define AGS_IS_AUDIO_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_AUDIO_FILE)) #define AGS_AUDIO_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_AUDIO_FILE, AgsAudioFileClass)) #define AGS_AUDIO_FILE_GET_OBJ_MUTEX(obj) (&(((AgsAudioFile *) obj)->obj_mutex)) typedef struct _AgsAudioFile AgsAudioFile; typedef struct _AgsAudioFileClass AgsAudioFileClass; /** * AgsAudioFileFlags: * @AGS_AUDIO_FILE_ADDED_TO_REGISTRY: the audio file was added to registry, see #AgsConnectable::add_to_registry() * @AGS_AUDIO_FILE_CONNECTED: indicates the audio file was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsAudioFile by * enable/disable as flags. */ typedef enum{ AGS_AUDIO_FILE_ADDED_TO_REGISTRY = 1, AGS_AUDIO_FILE_CONNECTED = 1 << 1, }AgsAudioFileFlags; struct _AgsAudioFile { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *soundcard; gchar *filename; guint file_audio_channels; guint file_samplerate; guint file_frame_count; guint samplerate; guint buffer_size; guint format; gint audio_channel; GObject *sound_resource; GList *audio_signal; GList *wave; }; struct _AgsAudioFileClass { GObjectClass gobject; }; GType ags_audio_file_get_type(); gboolean ags_audio_file_test_flags(AgsAudioFile *audio_file, guint flags); void ags_audio_file_set_flags(AgsAudioFile *audio_file, guint flags); void ags_audio_file_unset_flags(AgsAudioFile *audio_file, guint flags); gboolean ags_audio_file_check_suffix(gchar *filename); /* fields */ void ags_audio_file_add_audio_signal(AgsAudioFile *audio_file, GObject *audio_signal); void ags_audio_file_remove_audio_signal(AgsAudioFile *audio_file, GObject *audio_signal); void ags_audio_file_add_wave(AgsAudioFile *audio_file, GObject *wave); void ags_audio_file_remove_wave(AgsAudioFile *audio_file, GObject *wave); /* IO functions */ gboolean ags_audio_file_open(AgsAudioFile *audio_file); gboolean ags_audio_file_open_from_data(AgsAudioFile *audio_file, gchar *data); gboolean ags_audio_file_rw_open(AgsAudioFile *audio_file, gboolean create); void ags_audio_file_close(AgsAudioFile *audio_file); void* ags_audio_file_read(AgsAudioFile *audio_file, guint audio_channel, guint format, GError **error); void ags_audio_file_read_audio_signal(AgsAudioFile *audio_file); void ags_audio_file_read_wave(AgsAudioFile *audio_file, guint64 x_offset, gdouble delay, guint attack); void ags_audio_file_seek(AgsAudioFile *audio_file, guint frames, gint whence); void ags_audio_file_write(AgsAudioFile *audio_file, void *buffer, guint buffer_size, guint format); void ags_audio_file_flush(AgsAudioFile *audio_file); /* instantiate */ AgsAudioFile* ags_audio_file_new(gchar *filename, GObject *soundcard, gint audio_channel); G_END_DECLS #endif /*__AGS_AUDIO_FILE_H__*/ gsequencer-3.1.3/ags/audio/file/ags_ipatch.c0000644000175000017500000007703513607210263015654 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_ipatch_class_init(AgsIpatchClass *ipatch); void ags_ipatch_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ipatch_sound_container_interface_init(AgsSoundContainerInterface *sound_container); void ags_ipatch_init(AgsIpatch *ipatch); void ags_ipatch_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ipatch_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ipatch_finalize(GObject *gobject); AgsUUID* ags_ipatch_get_uuid(AgsConnectable *connectable); gboolean ags_ipatch_has_resource(AgsConnectable *connectable); gboolean ags_ipatch_is_ready(AgsConnectable *connectable); void ags_ipatch_add_to_registry(AgsConnectable *connectable); void ags_ipatch_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_ipatch_list_resource(AgsConnectable *connectable); xmlNode* ags_ipatch_xml_compose(AgsConnectable *connectable); void ags_ipatch_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_ipatch_is_connected(AgsConnectable *connectable); void ags_ipatch_connect(AgsConnectable *connectable); void ags_ipatch_disconnect(AgsConnectable *connectable); gboolean ags_ipatch_open(AgsSoundContainer *sound_container, gchar *filename); guint ags_ipatch_get_level_count(AgsSoundContainer *sound_container); guint ags_ipatch_get_nesting_level(AgsSoundContainer *sound_container); gchar* ags_ipatch_get_level_id(AgsSoundContainer *sound_container); guint ags_ipatch_get_level_index(AgsSoundContainer *sound_container); guint ags_ipatch_level_up(AgsSoundContainer *sound_container, guint level_count); guint ags_ipatch_select_level_by_id(AgsSoundContainer *sound_container, gchar *level_id); guint ags_ipatch_select_level_by_index(AgsSoundContainer *sound_container, guint level_index); gchar** ags_ipatch_get_sublevel_name(AgsSoundContainer *sound_container); GList* ags_ipatch_get_resource_all(AgsSoundContainer *sound_container); GList* ags_ipatch_get_resource_by_name(AgsSoundContainer *sound_container, gchar *resource_name); GList* ags_ipatch_get_resource_by_index(AgsSoundContainer *sound_container, guint resource_index); GList* ags_ipatch_get_resource_current(AgsSoundContainer *sound_container); void ags_ipatch_close(AgsSoundContainer *sound_container); /** * SECTION:ags_ipatch * @short_description: Libinstpatch wrapper * @title: AgsIpatch * @section_id: * @include: ags/audio/file/ags_ipatch.h * * #AgsIpatch is the base object to ineract with libinstpatch. */ enum{ PROP_0, PROP_SOUNDCARD, PROP_FILENAME, PROP_MODE, }; static gpointer ags_ipatch_parent_class = NULL; GType ags_ipatch_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ipatch = 0; static const GTypeInfo ags_ipatch_info = { sizeof (AgsIpatchClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ipatch_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsIpatch), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ipatch_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ipatch_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_container_interface_info = { (GInterfaceInitFunc) ags_ipatch_sound_container_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ipatch = g_type_register_static(G_TYPE_OBJECT, "AgsIpatch", &ags_ipatch_info, 0); g_type_add_interface_static(ags_type_ipatch, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_ipatch, AGS_TYPE_SOUND_CONTAINER, &ags_sound_container_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ipatch); } return g_define_type_id__volatile; } void ags_ipatch_class_init(AgsIpatchClass *ipatch) { GObjectClass *gobject; GParamSpec *param_spec; ags_ipatch_parent_class = g_type_class_peek_parent(ipatch); /* GObjectClass */ gobject = (GObjectClass *) ipatch; gobject->set_property = ags_ipatch_set_property; gobject->get_property = ags_ipatch_get_property; gobject->finalize = ags_ipatch_finalize; /* properties */ /** * AgsIpatch:soundcard: * * The assigned soundcard. * * Since: 3.0.0 */ param_spec = g_param_spec_object("soundcard", i18n_pspec("soundcard of ipatch"), i18n_pspec("The soundcard what ipatch has it's presets"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOUNDCARD, param_spec); /** * AgsIpatch:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename to open"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsIpatch:mode: * * The assigned mode. * * Since: 3.0.0 */ param_spec = g_param_spec_string("mode", i18n_pspec("the mode"), i18n_pspec("The mode to open the file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MODE, param_spec); } void ags_ipatch_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_ipatch_get_uuid; connectable->has_resource = ags_ipatch_has_resource; connectable->is_ready = ags_ipatch_is_ready; connectable->add_to_registry = ags_ipatch_add_to_registry; connectable->remove_from_registry = ags_ipatch_remove_from_registry; connectable->list_resource = ags_ipatch_list_resource; connectable->xml_compose = ags_ipatch_xml_compose; connectable->xml_parse = ags_ipatch_xml_parse; connectable->is_connected = ags_ipatch_is_connected; connectable->connect = ags_ipatch_connect; connectable->disconnect = ags_ipatch_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_ipatch_sound_container_interface_init(AgsSoundContainerInterface *sound_container) { sound_container->open = ags_ipatch_open; sound_container->get_level_count = ags_ipatch_get_level_count; sound_container->get_nesting_level = ags_ipatch_get_nesting_level; sound_container->get_level_id = ags_ipatch_get_level_id; sound_container->get_level_index = ags_ipatch_get_level_index; sound_container->get_sublevel_name = ags_ipatch_get_sublevel_name; sound_container->level_up = ags_ipatch_level_up; sound_container->select_level_by_id = ags_ipatch_select_level_by_id; sound_container->select_level_by_index = ags_ipatch_select_level_by_index; sound_container->get_resource_all = ags_ipatch_get_resource_all; sound_container->get_resource_by_name = ags_ipatch_get_resource_by_name; sound_container->get_resource_by_index = ags_ipatch_get_resource_by_index; sound_container->get_resource_current = ags_ipatch_get_resource_current; sound_container->close = ags_ipatch_close; } void ags_ipatch_init(AgsIpatch *ipatch) { ipatch->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(ipatch->obj_mutex)); /* uuid */ ipatch->uuid = ags_uuid_alloc(); ags_uuid_generate(ipatch->uuid); ipatch->soundcard = NULL; ipatch->filename = NULL; ipatch->mode = AGS_IPATCH_READ; ipatch->file = NULL; ipatch->handle = NULL; ipatch->nesting_level = 0; ipatch->level_id = NULL; ipatch->level_index = 0; ipatch->reader = NULL; ipatch->writer = NULL; ipatch->audio_signal= NULL; } void ags_ipatch_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsIpatch *ipatch; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(gobject); /* get audio file mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); switch(prop_id){ case PROP_SOUNDCARD: { GObject *soundcard; soundcard = (GObject *) g_value_get_object(value); g_rec_mutex_lock(ipatch_mutex); if(soundcard == ((GObject *) ipatch->soundcard)){ g_rec_mutex_unlock(ipatch_mutex); return; } if(ipatch->soundcard != NULL){ g_object_unref(ipatch->soundcard); } if(soundcard != NULL){ g_object_ref(G_OBJECT(soundcard)); } ipatch->soundcard = (GObject *) soundcard; g_rec_mutex_unlock(ipatch_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = (gchar *) g_value_get_string(value); ags_sound_container_open(AGS_SOUND_CONTAINER(ipatch), filename); } break; case PROP_MODE: { #ifdef AGS_WITH_LIBINSTPATCH IpatchFileHandle *handle; #else gpointer handle; #endif gchar *mode; mode = (gchar *) g_value_get_string(value); g_rec_mutex_lock(ipatch_mutex); ipatch->mode = mode; handle = ipatch->handle; g_rec_mutex_lock(ipatch_mutex); #ifdef AGS_WITH_LIBINSTPATCH if(handle != NULL){ GError *error; error = NULL; ipatch_file_default_open_method(handle, mode, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } #endif } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsIpatch *ipatch; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(gobject); /* get audio file mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); switch(prop_id){ case PROP_SOUNDCARD: { g_rec_mutex_lock(ipatch_mutex); g_value_set_object(value, ipatch->soundcard); g_rec_mutex_unlock(ipatch_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(ipatch_mutex); g_value_set_string(value, ipatch->filename); g_rec_mutex_unlock(ipatch_mutex); } break; case PROP_MODE: { g_rec_mutex_lock(ipatch_mutex); g_value_set_string(value, ipatch->mode); g_rec_mutex_unlock(ipatch_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_finalize(GObject *gobject) { AgsIpatch *ipatch; ipatch = AGS_IPATCH(gobject); if(ipatch->soundcard != NULL){ g_object_unref(ipatch->soundcard); } g_free(ipatch->filename); g_free(ipatch->mode); if(ipatch->reader != NULL){ g_object_unref(ipatch->reader); } g_list_free_full(ipatch->audio_signal, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_ipatch_parent_class)->finalize(gobject); } AgsUUID* ags_ipatch_get_uuid(AgsConnectable *connectable) { AgsIpatch *ipatch; AgsUUID *ptr; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(connectable); /* get audio file mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* get UUID */ g_rec_mutex_lock(ipatch_mutex); ptr = ipatch->uuid; g_rec_mutex_unlock(ipatch_mutex); return(ptr); } gboolean ags_ipatch_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_ipatch_is_ready(AgsConnectable *connectable) { AgsIpatch *ipatch; gboolean is_ready; ipatch = AGS_IPATCH(connectable); /* check is ready */ is_ready = ags_ipatch_test_flags(ipatch, AGS_IPATCH_ADDED_TO_REGISTRY); return(is_ready); } void ags_ipatch_add_to_registry(AgsConnectable *connectable) { AgsIpatch *ipatch; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } ipatch = AGS_IPATCH(connectable); ags_ipatch_set_flags(ipatch, AGS_IPATCH_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) ipatch); ags_registry_add_entry(registry, entry); } } void ags_ipatch_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_ipatch_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_ipatch_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_ipatch_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_ipatch_is_connected(AgsConnectable *connectable) { AgsIpatch *ipatch; gboolean is_connected; ipatch = AGS_IPATCH(connectable); /* check is connected */ is_connected = ags_ipatch_test_flags(ipatch, AGS_IPATCH_CONNECTED); return(is_connected); } void ags_ipatch_connect(AgsConnectable *connectable) { AgsIpatch *ipatch; if(ags_connectable_is_connected(connectable)){ return; } ipatch = AGS_IPATCH(connectable); ags_ipatch_set_flags(ipatch, AGS_IPATCH_CONNECTED); } void ags_ipatch_disconnect(AgsConnectable *connectable) { AgsIpatch *ipatch; if(!ags_connectable_is_connected(connectable)){ return; } ipatch = AGS_IPATCH(connectable); ags_ipatch_unset_flags(ipatch, AGS_IPATCH_CONNECTED); } /** * ags_ipatch_test_flags: * @ipatch: the #AgsIpatch * @flags: the flags * * Test @flags to be set on @ipatch. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_ipatch_test_flags(AgsIpatch *ipatch, guint flags) { gboolean retval; GRecMutex *ipatch_mutex; if(!AGS_IS_IPATCH(ipatch)){ return(FALSE); } /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* test */ g_rec_mutex_lock(ipatch_mutex); retval = (flags & (ipatch->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(ipatch_mutex); return(retval); } /** * ags_ipatch_set_flags: * @ipatch: the #AgsIpatch * @flags: see #AgsIpatchFlags-enum * * Enable a feature of @ipatch. * * Since: 3.0.0 */ void ags_ipatch_set_flags(AgsIpatch *ipatch, guint flags) { GRecMutex *ipatch_mutex; if(!AGS_IS_IPATCH(ipatch)){ return; } /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(ipatch_mutex); ipatch->flags |= flags; g_rec_mutex_unlock(ipatch_mutex); } /** * ags_ipatch_unset_flags: * @ipatch: the #AgsIpatch * @flags: see #AgsIpatchFlags-enum * * Disable a feature of @ipatch. * * Since: 3.0.0 */ void ags_ipatch_unset_flags(AgsIpatch *ipatch, guint flags) { GRecMutex *ipatch_mutex; if(!AGS_IS_IPATCH(ipatch)){ return; } /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(ipatch_mutex); ipatch->flags &= (~flags); g_rec_mutex_unlock(ipatch_mutex); } gboolean ags_ipatch_open(AgsSoundContainer *sound_container, gchar *filename) { AgsIpatch *ipatch; #ifdef AGS_WITH_LIBINSTPATCH IpatchFileHandle *handle; IpatchFileIOFuncs *io_funcs; #endif GObject *reader; gchar *old_filename; gboolean retval; GError *error; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* get some fields */ g_rec_mutex_lock(ipatch_mutex); old_filename = ipatch->filename; g_rec_mutex_unlock(ipatch_mutex); /* close current */ if(old_filename != NULL){ ags_sound_container_close(sound_container); g_free(old_filename); } /* check suffix */ ipatch->filename = g_strdup(filename); if(!ags_ipatch_check_suffix(filename)){ return(FALSE); } error = NULL; #ifdef AGS_WITH_LIBINSTPATCH handle = ipatch_file_identify_open(filename, &error); g_rec_mutex_lock(ipatch_mutex); ipatch->handle = handle; g_rec_mutex_unlock(ipatch_mutex); #endif if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(handle == NULL){ return(FALSE); } reader = NULL; retval = FALSE; if(IPATCH_IS_DLS_FILE(handle->file)){ ags_ipatch_set_flags(ipatch, AGS_IPATCH_DLS2); /* dls2 */ reader = (GObject *) ags_ipatch_dls2_reader_new(ipatch); if(ags_ipatch_dls2_reader_load((AgsIpatchDLS2Reader *) reader, handle)){ retval = TRUE; } }else if(IPATCH_IS_SF2_FILE(handle->file)){ ags_ipatch_set_flags(ipatch, AGS_IPATCH_SF2); /* sf2 */ reader = (GObject *) ags_ipatch_sf2_reader_new(ipatch); if(ags_ipatch_sf2_reader_load((AgsIpatchSF2Reader *) reader, handle)){ retval = TRUE; } }else if(IPATCH_IS_GIG_FILE(handle->file)){ ags_ipatch_set_flags(ipatch, AGS_IPATCH_GIG); /* gig */ reader = (GObject *) ags_ipatch_gig_reader_new(ipatch); if(ags_ipatch_gig_reader_load((AgsIpatchGigReader *) reader, handle)){ retval = TRUE; } } g_rec_mutex_lock(ipatch_mutex); ipatch->reader = reader; g_rec_mutex_unlock(ipatch_mutex); return(retval); } guint ags_ipatch_get_level_count(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; ipatch = AGS_IPATCH(sound_container); if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_DLS2)){ return(3); }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_SF2)){ return(4); }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_GIG)){ return(3); } return(0); } guint ags_ipatch_get_nesting_level(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; guint nesting_level; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* get nesting level */ g_rec_mutex_lock(ipatch_mutex); nesting_level = ipatch->nesting_level; g_rec_mutex_unlock(ipatch_mutex); return(nesting_level); } gchar* ags_ipatch_get_level_id(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; gchar *level_id; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* get level id */ g_rec_mutex_lock(ipatch_mutex); level_id = ipatch->level_id; g_rec_mutex_unlock(ipatch_mutex); return(level_id); } guint ags_ipatch_get_level_index(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; guint level_index; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* get nesting level */ g_rec_mutex_lock(ipatch_mutex); level_index = ipatch->level_index; g_rec_mutex_unlock(ipatch_mutex); return(level_index); } gchar** ags_ipatch_get_sublevel_name(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; guint sublevel; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* sublevel */ sublevel = ags_sound_container_get_nesting_level(AGS_SOUND_CONTAINER(ipatch)); #ifdef AGS_WITH_LIBINSTPATCH if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_DLS2)){ AgsIpatchDLS2Reader *ipatch_dls2_reader; g_rec_mutex_lock(ipatch_mutex); ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); switch(sublevel){ case AGS_DLS2_FILENAME: { gchar **sublevel_name; sublevel_name = (gchar **) malloc(2 * sizeof(gchar*)); sublevel_name[0] = g_strdup(ipatch->filename); sublevel_name[1] = NULL; return(sublevel_name); } case AGS_DLS2_IHDR: { return(ags_ipatch_dls2_reader_get_instrument_all(ipatch_dls2_reader)); } case AGS_DLS2_SHDR: { return(ags_ipatch_dls2_reader_get_sample_by_instrument_index(ipatch_dls2_reader, ipatch_dls2_reader->index_selected[1])); } }; }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_SF2)){ AgsIpatchSF2Reader *ipatch_sf2_reader; g_rec_mutex_lock(ipatch_mutex); ipatch_sf2_reader = AGS_IPATCH_SF2_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); switch(sublevel){ case AGS_SF2_FILENAME: { gchar **sublevel_name; sublevel_name = (gchar **) malloc(2 * sizeof(gchar*)); sublevel_name[0] = g_strdup(ipatch->filename); sublevel_name[1] = NULL; return(sublevel_name); } case AGS_SF2_PHDR: { return(ags_ipatch_sf2_reader_get_preset_all(ipatch_sf2_reader)); } case AGS_SF2_IHDR: { return(ags_ipatch_sf2_reader_get_instrument_by_preset_index(ipatch_sf2_reader, ipatch_sf2_reader->index_selected[1])); } case AGS_SF2_SHDR: { return(ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index(ipatch_sf2_reader, ipatch_sf2_reader->index_selected[1], ipatch_sf2_reader->index_selected[2])); } }; }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_GIG)){ AgsIpatchGigReader *ipatch_gig_reader; g_rec_mutex_lock(ipatch_mutex); ipatch_gig_reader = AGS_IPATCH_GIG_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); switch(sublevel){ case AGS_GIG_FILENAME: { gchar **sublevel_name; sublevel_name = (gchar **) malloc(2 * sizeof(gchar*)); sublevel_name[0] = g_strdup(ipatch->filename); sublevel_name[1] = NULL; return(sublevel_name); } case AGS_GIG_IHDR: { return(ags_ipatch_gig_reader_get_instrument_all(ipatch_gig_reader)); } case AGS_GIG_SHDR: { return(ags_ipatch_gig_reader_get_sample_by_instrument_index(ipatch_gig_reader, ipatch_gig_reader->index_selected[1])); } }; } #endif return(NULL); } guint ags_ipatch_level_up(AgsSoundContainer *sound_container, guint level_count) { AgsIpatch *ipatch; guint retval; GRecMutex *ipatch_mutex; if(level_count == 0){ return(0); } ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* check boundaries */ if(ags_sound_container_get_nesting_level(AGS_SOUND_CONTAINER(ipatch)) >= level_count){ /* level up */ g_rec_mutex_lock(ipatch_mutex); retval = level_count; ipatch->nesting_level -= level_count; g_rec_mutex_unlock(ipatch_mutex); }else{ /* level up */ g_rec_mutex_lock(ipatch_mutex); retval = ipatch->nesting_level; ipatch->nesting_level = 0; g_rec_mutex_unlock(ipatch_mutex); } return(retval); } guint ags_ipatch_select_level_by_id(AgsSoundContainer *sound_container, gchar *level_id) { return(0); } guint ags_ipatch_select_level_by_index(AgsSoundContainer *sound_container, guint level_index) { AgsIpatch *ipatch; guint sublevel; guint retval; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* sublevel */ sublevel = ags_sound_container_get_nesting_level(AGS_SOUND_CONTAINER(ipatch)); retval = 0; #ifdef AGS_WITH_LIBINSTPATCH if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_DLS2)){ AgsIpatchDLS2Reader *ipatch_dls2_reader; g_rec_mutex_lock(ipatch_mutex); ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); switch(sublevel){ case AGS_DLS2_FILENAME: { if(ags_ipatch_dls2_reader_select_instrument(ipatch_dls2_reader, level_index)){ retval = AGS_DLS2_FILENAME; } } break; case AGS_DLS2_IHDR: { if(ags_ipatch_dls2_reader_select_sample(ipatch_dls2_reader, level_index)){ retval = AGS_DLS2_IHDR; } } break; case AGS_DLS2_SHDR: { retval = AGS_DLS2_SHDR; } break; }; }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_SF2)){ AgsIpatchSF2Reader *ipatch_sf2_reader; g_rec_mutex_lock(ipatch_mutex); ipatch_sf2_reader = AGS_IPATCH_SF2_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); switch(sublevel){ case AGS_SF2_FILENAME: { if(ags_ipatch_sf2_reader_select_preset(ipatch_sf2_reader, level_index)){ retval = AGS_SF2_FILENAME; } } break; case AGS_SF2_PHDR: { if(ags_ipatch_sf2_reader_select_instrument(ipatch_sf2_reader, level_index)){ retval = AGS_SF2_PHDR; } } break; case AGS_SF2_IHDR: { if(ags_ipatch_sf2_reader_select_sample(ipatch_sf2_reader, level_index)){ retval = AGS_SF2_IHDR; } } break; case AGS_SF2_SHDR: { retval = AGS_SF2_SHDR; } break; }; }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_GIG)){ AgsIpatchGigReader *ipatch_gig_reader; g_rec_mutex_lock(ipatch_mutex); ipatch_gig_reader = AGS_IPATCH_GIG_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); switch(sublevel){ case AGS_GIG_FILENAME: { if(ags_ipatch_gig_reader_select_instrument(ipatch_gig_reader, level_index)){ retval = AGS_GIG_FILENAME; } } break; case AGS_GIG_IHDR: { if(ags_ipatch_gig_reader_select_sample(ipatch_gig_reader, level_index)){ retval = AGS_GIG_IHDR; } } break; case AGS_GIG_SHDR: { retval = AGS_GIG_SHDR; } break; }; } #endif return(retval); } GList* ags_ipatch_get_resource_all(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; GList *resource; ipatch = AGS_IPATCH(sound_container); resource = NULL; #ifdef AGS_WITH_LIBINSTPATCH if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_DLS2)){ //TODO:JK: implement me }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_SF2)){ //TODO:JK: implement me }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_GIG)){ //TODO:JK: implement me } #endif return(resource); } GList* ags_ipatch_get_resource_by_name(AgsSoundContainer *sound_container, gchar *resource_name) { //TODO:JK: implement me return(NULL); } GList* ags_ipatch_get_resource_by_index(AgsSoundContainer *sound_container, guint resource_index) { //TODO:JK: implement me return(NULL); } GList* ags_ipatch_get_resource_current(AgsSoundContainer *sound_container) { AgsIpatch *ipatch; #ifdef AGS_WITH_LIBINSTPATCH IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif GList *sound_resource; guint i, i_stop; GRecMutex *ipatch_mutex; ipatch = AGS_IPATCH(sound_container); /* get ipatch mutex */ ipatch_mutex = AGS_IPATCH_GET_OBJ_MUTEX(ipatch); /* get sound resource */ sound_resource = NULL; if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_DLS2)){ AgsIpatchDLS2Reader *ipatch_dls2_reader; /* get dls2 reader */ g_rec_mutex_lock(ipatch_mutex); ipatch_dls2_reader = AGS_IPATCH_DLS2_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); #ifdef AGS_WITH_LIBINSTPATCH ipatch_list = ipatch_dls2_inst_get_regions(ipatch_dls2_reader->instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); ipatch_iter_first(&sample_iter); i_stop = ipatch_iter_count(&sample_iter); for(i = 0; i < i_stop; i++){ AgsIpatchSample *ipatch_sample; ipatch_item = (IpatchItem *) ipatch_dls2_region_get_sample(ipatch_iter_get(&sample_iter)); ipatch_sample = ags_ipatch_sample_new(); g_object_set(ipatch_sample, "sample", ipatch_item, NULL); sound_resource = g_list_prepend(sound_resource, ipatch_sample); /* iterate */ ipatch_iter_next(&sample_iter); } } #endif }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_SF2)){ AgsIpatchSF2Reader *ipatch_sf2_reader; /* get sf2 reader */ g_rec_mutex_lock(ipatch_mutex); ipatch_sf2_reader = AGS_IPATCH_SF2_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); #ifdef AGS_WITH_LIBINSTPATCH ipatch_list = ipatch_sf2_inst_get_zones(ipatch_sf2_reader->instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); ipatch_iter_first(&sample_iter); i_stop = ipatch_iter_count(&sample_iter); for(i = 0; i < i_stop; i++){ AgsIpatchSample *ipatch_sample; ipatch_item = (IpatchItem *) ipatch_sf2_izone_get_sample(ipatch_iter_get(&sample_iter)); ipatch_sample = ags_ipatch_sample_new(); g_object_set(ipatch_sample, "sample", ipatch_item, NULL); sound_resource = g_list_prepend(sound_resource, ipatch_sample); /* iterate */ ipatch_iter_next(&sample_iter); } } #endif }else if(ags_ipatch_test_flags(ipatch, AGS_IPATCH_GIG)){ AgsIpatchGigReader *ipatch_gig_reader; /* get gig reader */ g_rec_mutex_lock(ipatch_mutex); ipatch_gig_reader = AGS_IPATCH_GIG_READER(ipatch->reader); g_rec_mutex_unlock(ipatch_mutex); #ifdef AGS_WITH_LIBINSTPATCH ipatch_list = ipatch_dls2_inst_get_regions(ipatch_gig_reader->instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); ipatch_iter_first(&sample_iter); i_stop = ipatch_iter_count(&sample_iter); for(i = 0; i < i_stop; i++){ AgsIpatchSample *ipatch_sample; ipatch_item = (IpatchItem *) ipatch_dls2_region_get_sample(ipatch_iter_get(&sample_iter)); ipatch_sample = ags_ipatch_sample_new(); g_object_set(ipatch_sample, "sample", ipatch_item, NULL); sound_resource = g_list_prepend(sound_resource, ipatch_sample); /* iterate */ ipatch_iter_next(&sample_iter); } } #endif } sound_resource = g_list_reverse(sound_resource); g_list_foreach(sound_resource, (GFunc) g_object_ref, NULL); return(sound_resource); } void ags_ipatch_close(AgsSoundContainer *sound_container) { //TODO:JK: implement me } /** * ags_ipatch_check_suffix: * @filename: the filename * * Check @filename's suffix to be supported. * * Returns: %TRUE if supported, else %FALSE * * Since: 3.0.0 */ gboolean ags_ipatch_check_suffix(gchar *filename) { if(g_str_has_suffix(filename, ".sf2") || g_str_has_suffix(filename, ".dls") || g_str_has_suffix(filename, ".gig")){ return(TRUE); } return(FALSE); } /** * ags_ipatch_new: * * Creates an #AgsIpatch. * * Returns: an empty #AgsIpatch. * * Since: 3.0.0 */ AgsIpatch* ags_ipatch_new() { AgsIpatch *ipatch; ipatch = (AgsIpatch *) g_object_new(AGS_TYPE_IPATCH, NULL); return(ipatch); } gsequencer-3.1.3/ags/audio/file/ags_sfz_group.h0000644000175000017500000000557313607210263016425 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SFZ_GROUP_H__ #define __AGS_SFZ_GROUP_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SFZ_GROUP (ags_sfz_group_get_type()) #define AGS_SFZ_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SFZ_GROUP, AgsSFZGroup)) #define AGS_SFZ_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SFZ_GROUP, AgsSFZGroupClass)) #define AGS_IS_SFZ_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SFZ_GROUP)) #define AGS_IS_SFZ_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SFZ_GROUP)) #define AGS_SFZ_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_SFZ_GROUP, AgsSFZGroupClass)) #define AGS_SFZ_GROUP_GET_OBJ_MUTEX(obj) (&(((AgsSFZGroup *) obj)->obj_mutex)) typedef struct _AgsSFZGroup AgsSFZGroup; typedef struct _AgsSFZGroupClass AgsSFZGroupClass; /** * AgsSFZGroupFlags: * @AGS_SFZ_GROUP_ADDED_TO_REGISTRY: the sfz group was added to registry, see #AgsConnectable::add_to_registry() * @AGS_SFZ_GROUP_CONNECTED: indicates the sfz group was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsSFZGroup by * enable/disable as flags. */ typedef enum{ AGS_SFZ_GROUP_ADDED_TO_REGISTRY = 1, AGS_SFZ_GROUP_CONNECTED = 1 << 1, }AgsSFZGroupFlags; struct _AgsSFZGroup { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gint nth_group; GList *region; GObject *sample; GHashTable *control; }; struct _AgsSFZGroupClass { GObjectClass gobject; }; GType ags_sfz_group_get_type(); gboolean ags_sfz_group_test_flags(AgsSFZGroup *sfz_group, guint flags); void ags_sfz_group_set_flags(AgsSFZGroup *sfz_group, guint flags); void ags_sfz_group_unset_flags(AgsSFZGroup *sfz_group, guint flags); void ags_sfz_group_insert_control(AgsSFZGroup *sfz_group, gchar *key, gchar *value); gchar* ags_sfz_group_lookup_control(AgsSFZGroup *sfz_group, gchar *key); /* instantiate */ AgsSFZGroup* ags_sfz_group_new(); G_END_DECLS #endif /*__AGS_SFZ_GROUP_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sound_container.h0000644000175000017500000001041613607210263017571 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUND_CONTAINER_H__ #define __AGS_SOUND_CONTAINER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUND_CONTAINER (ags_sound_container_get_type()) #define AGS_SOUND_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUND_CONTAINER, AgsSoundContainer)) #define AGS_SOUND_CONTAINER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SOUND_CONTAINER, AgsSoundContainerInterface)) #define AGS_IS_SOUND_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SOUND_CONTAINER)) #define AGS_IS_SOUND_CONTAINER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SOUND_CONTAINER)) #define AGS_SOUND_CONTAINER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SOUND_CONTAINER, AgsSoundContainerInterface)) typedef struct _AgsSoundContainer AgsSoundContainer; typedef struct _AgsSoundContainerInterface AgsSoundContainerInterface; struct _AgsSoundContainerInterface { GTypeInterface ginterface; gboolean (*open)(AgsSoundContainer *sound_container, gchar *filename); /* level information */ guint (*get_level_count)(AgsSoundContainer *sound_container); guint (*get_nesting_level)(AgsSoundContainer *sound_container); gchar* (*get_level_id)(AgsSoundContainer *sound_container); guint (*get_level_index)(AgsSoundContainer *sound_container); gchar** (*get_sublevel_name)(AgsSoundContainer *sound_container); /* levels */ guint (*level_up)(AgsSoundContainer *sound_container, guint level_count); guint (*select_level_by_id)(AgsSoundContainer *sound_container, gchar *level_id); guint (*select_level_by_index)(AgsSoundContainer *sound_container, guint level_index); /* get sound resource */ GList* (*get_resource_all)(AgsSoundContainer *sound_container); GList* (*get_resource_by_name)(AgsSoundContainer *sound_container, gchar *resource_name); GList* (*get_resource_by_index)(AgsSoundContainer *sound_container, guint resource_index); GList* (*get_resource_current)(AgsSoundContainer *sound_container); /* close */ void (*close)(AgsSoundContainer *sound_container); }; GType ags_sound_container_get_type(); gboolean ags_sound_container_open(AgsSoundContainer *sound_container, gchar *filename); guint ags_sound_container_get_level_count(AgsSoundContainer *sound_container); guint ags_sound_container_get_nesting_level(AgsSoundContainer *sound_container); gchar* ags_sound_container_get_level_id(AgsSoundContainer *sound_container); guint ags_sound_container_get_level_index(AgsSoundContainer *sound_container); gchar** ags_sound_container_get_sublevel_name(AgsSoundContainer *sound_container); guint ags_sound_container_level_up(AgsSoundContainer *sound_container, guint level_count); guint ags_sound_container_select_level_by_id(AgsSoundContainer *sound_container, gchar *level_id); guint ags_sound_container_select_level_by_index(AgsSoundContainer *sound_container, guint level_index); GList* ags_sound_container_get_resource_all(AgsSoundContainer *sound_container); GList* ags_sound_container_get_resource_by_name(AgsSoundContainer *sound_container, gchar *resource_name); GList* ags_sound_container_get_resource_by_index(AgsSoundContainer *sound_container, guint resource_index); GList* ags_sound_container_get_resource_current(AgsSoundContainer *sound_container); void ags_sound_container_close(AgsSoundContainer *sound_container); G_END_DECLS #endif /*__AGS_SOUND_CONTAINER_H__*/ gsequencer-3.1.3/ags/audio/file/ags_ipatch_dls2_reader.h0000644000175000017500000001105413607210263020114 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_IPATCH_DLS2_READER_H__ #define __AGS_IPATCH_DLS2_READER_H__ #include #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #endif #include G_BEGIN_DECLS #define AGS_TYPE_IPATCH_DLS2_READER (ags_ipatch_dls2_reader_get_type()) #define AGS_IPATCH_DLS2_READER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_IPATCH_DLS2_READER, AgsIpatchDLS2Reader)) #define AGS_IPATCH_DLS2_READER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_IPATCH_DLS2_READER, AgsIpatchDLS2ReaderClass)) #define AGS_IS_IPATCH_DLS2_READER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_IPATCH_DLS2_READER)) #define AGS_IS_IPATCH_DLS2_READER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_IPATCH_DLS2_READER)) #define AGS_IPATCH_DLS2_READER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_IPATCH_DLS2_READER, AgsIpatchDLS2ReaderClass)) #define AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX(obj) (&(((AgsIpatchDLS2Reader *) obj)->obj_mutex)) typedef struct _AgsIpatchDLS2Reader AgsIpatchDLS2Reader; typedef struct _AgsIpatchDLS2ReaderClass AgsIpatchDLS2ReaderClass; /** * AgsIpatchDLS2ReaderFlags: * @AGS_IPATCH_DLS2_READER_ADDED_TO_REGISTRY: the ipatch sample was added to registry, see #AgsConnectable::add_to_registry() * @AGS_IPATCH_DLS2_READER_CONNECTED: indicates the ipatch sample was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsIpatchDLS2Reader by * enable/disable as flags. */ typedef enum{ AGS_IPATCH_DLS2_READER_ADDED_TO_REGISTRY = 1, AGS_IPATCH_DLS2_READER_CONNECTED = 1 << 1, }AgsIpatchDLS2ReaderFlags; /** * AgsDLS2Level: * @AGS_DLS2_FILENAME: filename * @AGS_DLS2_IHDR: instrument header * @AGS_DLS2_SHDR: sample header * * Enum values to describe the different levels of a DLS2 file. */ typedef enum{ AGS_DLS2_FILENAME = 0, AGS_DLS2_IHDR = 1, AGS_DLS2_SHDR = 2, }AgsDLS2Level; struct _AgsIpatchDLS2Reader { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; guint level; AgsIpatch *ipatch; guint *index_selected; gchar **name_selected; #ifdef AGS_WITH_LIBINSTPATCH IpatchDLSReader *reader; IpatchBase *base; IpatchDLS2 *dls2; IpatchContainer *instrument; IpatchContainer *sample; #else gpointer reader; gpointer base; gpointer gig; gpointer instrument; gpointer sample; #endif GError *error; }; struct _AgsIpatchDLS2ReaderClass { GObjectClass gobject; }; GType ags_ipatch_dls2_reader_get_type(); gboolean ags_ipatch_dls2_reader_test_flags(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint flags); void ags_ipatch_dls2_reader_set_flags(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint flags); void ags_ipatch_dls2_reader_unset_flags(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint flags); #ifdef AGS_WITH_LIBINSTPATCH gboolean ags_ipatch_dls2_reader_load(AgsIpatchDLS2Reader *ipatch_dls2_reader, IpatchFileHandle *handle); #endif /* select sample */ gboolean ags_ipatch_dls2_reader_select_instrument(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint instrument_index); gboolean ags_ipatch_dls2_reader_select_sample(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint sample_index); /* query */ gchar** ags_ipatch_dls2_reader_get_instrument_all(AgsIpatchDLS2Reader *ipatch_dls2_reader); gchar** ags_ipatch_dls2_reader_get_sample_all(AgsIpatchDLS2Reader *ipatch_dls2_reader); gchar** ags_ipatch_dls2_reader_get_sample_by_instrument_index(AgsIpatchDLS2Reader *ipatch_dls2_reader, guint instrument_index); /* instantiate */ AgsIpatchDLS2Reader* ags_ipatch_dls2_reader_new(AgsIpatch *ipatch); G_END_DECLS #endif /*__AGS_IPATCH_DLS2_READER_H__*/ gsequencer-3.1.3/ags/audio/file/ags_sndfile.c0000644000175000017500000011043113607210263016014 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_sndfile_class_init(AgsSndfileClass *sndfile); void ags_sndfile_connectable_interface_init(AgsConnectableInterface *connectable); void ags_sndfile_sound_resource_interface_init(AgsSoundResourceInterface *sound_resource); void ags_sndfile_init(AgsSndfile *sndfile); void ags_sndfile_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_sndfile_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_sndfile_dispose(GObject *gobject); void ags_sndfile_finalize(GObject *gobject); AgsUUID* ags_sndfile_get_uuid(AgsConnectable *connectable); gboolean ags_sndfile_has_resource(AgsConnectable *connectable); gboolean ags_sndfile_is_ready(AgsConnectable *connectable); void ags_sndfile_add_to_registry(AgsConnectable *connectable); void ags_sndfile_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_sndfile_list_resource(AgsConnectable *connectable); xmlNode* ags_sndfile_xml_compose(AgsConnectable *connectable); void ags_sndfile_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_sndfile_is_connected(AgsConnectable *connectable); void ags_sndfile_connect(AgsConnectable *connectable); void ags_sndfile_disconnect(AgsConnectable *connectable); gboolean ags_sndfile_open(AgsSoundResource *sound_resource, gchar *filename); gboolean ags_sndfile_rw_open(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create); gboolean ags_sndfile_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end); void ags_sndfile_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format); void ags_sndfile_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format); guint ags_sndfile_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format); void ags_sndfile_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format); void ags_sndfile_flush(AgsSoundResource *sound_resource); void ags_sndfile_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence); void ags_sndfile_close(AgsSoundResource *sound_resource); sf_count_t ags_sndfile_vio_get_filelen(void *user_data); sf_count_t ags_sndfile_vio_seek(sf_count_t offset, int whence, void *user_data); sf_count_t ags_sndfile_vio_read(void *ptr, sf_count_t count, void *user_data); sf_count_t ags_sndfile_vio_write(const void *ptr, sf_count_t count, void *user_data); sf_count_t ags_sndfile_vio_tell(const void *ptr, sf_count_t count, void *user_data); /** * SECTION:ags_sndfile * @short_description: Libsndfile wrapper * @title: AgsSndfile * @section_id: * @include: ags/audio/file/ags_sndfile.h * * #AgsSndfile is the base object to ineract with libsndfile. */ enum{ PROP_0, PROP_AUDIO_CHANNELS, PROP_BUFFER_SIZE, PROP_FORMAT, PROP_FILE, }; static gpointer ags_sndfile_parent_class = NULL; static AgsSoundResourceInterface *ags_sndfile_parent_sound_resource_interface; static SF_VIRTUAL_IO *ags_sndfile_virtual_io = NULL; GType ags_sndfile_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sndfile = 0; static const GTypeInfo ags_sndfile_info = { sizeof (AgsSndfileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_sndfile_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSndfile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_sndfile_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_sndfile_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_sound_resource_interface_info = { (GInterfaceInitFunc) ags_sndfile_sound_resource_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_sndfile = g_type_register_static(G_TYPE_OBJECT, "AgsSndfile", &ags_sndfile_info, 0); g_type_add_interface_static(ags_type_sndfile, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_sndfile, AGS_TYPE_SOUND_RESOURCE, &ags_sound_resource_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_sndfile); } return g_define_type_id__volatile; } void ags_sndfile_class_init(AgsSndfileClass *sndfile) { GObjectClass *gobject; GParamSpec *param_spec; ags_sndfile_parent_class = g_type_class_peek_parent(sndfile); gobject = (GObjectClass *) sndfile; gobject->set_property = ags_sndfile_set_property; gobject->get_property = ags_sndfile_get_property; gobject->dispose = ags_sndfile_dispose; gobject->finalize = ags_sndfile_finalize; /* sndfile callbacks */ if(ags_sndfile_virtual_io == NULL){ ags_sndfile_virtual_io = (SF_VIRTUAL_IO *) malloc(sizeof(SF_VIRTUAL_IO)); ags_sndfile_virtual_io->get_filelen = ags_sndfile_vio_get_filelen; ags_sndfile_virtual_io->seek = ags_sndfile_vio_seek; ags_sndfile_virtual_io->read = ags_sndfile_vio_read; ags_sndfile_virtual_io->write = ags_sndfile_vio_write; ags_sndfile_virtual_io->tell = ags_sndfile_vio_tell; } /* properties */ /** * AgsSndfile:audio-channels: * * The audio channels to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("audio-channels", i18n_pspec("using audio channels"), i18n_pspec("The audio channels to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_CHANNELS, param_spec); /** * AgsSndfile:buffer-size: * * The buffer size to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("buffer-size", i18n_pspec("using buffer size"), i18n_pspec("The buffer size to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUFFER_SIZE, param_spec); /** * AgsSndfile:format: * * The format to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("format", i18n_pspec("using format"), i18n_pspec("The format to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FORMAT, param_spec); /** * AgsSndfile:file: * * The assigned output #SNDFILE-struct. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("file", i18n_pspec("assigned file"), i18n_pspec("The assigned file"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); } void ags_sndfile_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_sndfile_get_uuid; connectable->has_resource = ags_sndfile_has_resource; connectable->is_ready = ags_sndfile_is_ready; connectable->add_to_registry = ags_sndfile_add_to_registry; connectable->remove_from_registry = ags_sndfile_remove_from_registry; connectable->list_resource = ags_sndfile_list_resource; connectable->xml_compose = ags_sndfile_xml_compose; connectable->xml_parse = ags_sndfile_xml_parse; connectable->is_connected = ags_sndfile_is_connected; connectable->connect = ags_sndfile_connect; connectable->disconnect = ags_sndfile_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_sndfile_sound_resource_interface_init(AgsSoundResourceInterface *sound_resource) { ags_sndfile_parent_sound_resource_interface = g_type_interface_peek_parent(sound_resource); sound_resource->open = ags_sndfile_open; sound_resource->rw_open = ags_sndfile_rw_open; sound_resource->load = NULL; sound_resource->info = ags_sndfile_info; sound_resource->set_presets = ags_sndfile_set_presets; sound_resource->get_presets = ags_sndfile_get_presets; sound_resource->read = ags_sndfile_read; sound_resource->write = ags_sndfile_write; sound_resource->flush = ags_sndfile_flush; sound_resource->seek = ags_sndfile_seek; sound_resource->close = ags_sndfile_close; } void ags_sndfile_init(AgsSndfile *sndfile) { AgsConfig *config; sndfile->flags = AGS_SNDFILE_FILL_CACHE; /* add audio file mutex */ g_rec_mutex_init(&(sndfile->obj_mutex)); /* uuid */ sndfile->uuid = ags_uuid_alloc(); ags_uuid_generate(sndfile->uuid); config = ags_config_get_instance(); sndfile->audio_channels = 1; sndfile->audio_channel_written = (gint64 *) malloc(sndfile->audio_channels * sizeof(gint64)); sndfile->audio_channel_written[0] = -1; sndfile->buffer_size = ags_soundcard_helper_config_get_buffer_size(config); sndfile->format = AGS_SOUNDCARD_DOUBLE; sndfile->offset = 0; sndfile->buffer_offset = 0; sndfile->full_buffer = NULL; sndfile->buffer = ags_stream_alloc(sndfile->audio_channels * sndfile->buffer_size, sndfile->format); sndfile->pointer = NULL; sndfile->current = NULL; sndfile->length = 0; sndfile->info = NULL; sndfile->file = NULL; } void ags_sndfile_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSndfile *sndfile; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(gobject); /* get audio file mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); switch(prop_id){ case PROP_AUDIO_CHANNELS: { guint audio_channels; guint i; audio_channels = g_value_get_uint(value); g_rec_mutex_lock(sndfile_mutex); if(audio_channels == sndfile->audio_channels){ g_rec_mutex_unlock(sndfile_mutex); return; } ags_stream_free(sndfile->buffer); if(audio_channels > 0){ sndfile->audio_channel_written = (gint64 *) realloc(sndfile->audio_channel_written, audio_channels * sizeof(gint64)); for(i = sndfile->audio_channels; i < audio_channels; i++){ sndfile->audio_channel_written[i] = -1; } }else{ free(sndfile->audio_channel_written); } sndfile->audio_channels = audio_channels; sndfile->buffer = ags_stream_alloc(sndfile->audio_channels * sndfile->buffer_size, sndfile->format); g_rec_mutex_unlock(sndfile_mutex); } break; case PROP_BUFFER_SIZE: { guint buffer_size; buffer_size = g_value_get_uint(value); g_rec_mutex_lock(sndfile_mutex); if(buffer_size == sndfile->buffer_size){ g_rec_mutex_unlock(sndfile_mutex); return; } ags_stream_free(sndfile->buffer); sndfile->buffer_size = buffer_size; sndfile->buffer = ags_stream_alloc(sndfile->audio_channels * sndfile->buffer_size, sndfile->format); g_rec_mutex_unlock(sndfile_mutex); } break; case PROP_FORMAT: { guint format; format = g_value_get_uint(value); g_rec_mutex_lock(sndfile_mutex); if(format == sndfile->format){ g_rec_mutex_unlock(sndfile_mutex); return; } ags_stream_free(sndfile->buffer); sndfile->format = format; sndfile->buffer = ags_stream_alloc(sndfile->audio_channels * sndfile->buffer_size, sndfile->format); g_rec_mutex_unlock(sndfile_mutex); } break; case PROP_FILE: { SNDFILE *file; file = g_value_get_pointer(value); g_rec_mutex_lock(sndfile_mutex); if(sndfile->file == file){ g_rec_mutex_unlock(sndfile_mutex); return; } sndfile->file = file; g_rec_mutex_unlock(sndfile_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sndfile_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSndfile *sndfile; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(gobject); /* get audio file mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); switch(prop_id){ case PROP_AUDIO_CHANNELS: { g_rec_mutex_lock(sndfile_mutex); g_value_set_uint(value, sndfile->audio_channels); g_rec_mutex_unlock(sndfile_mutex); } break; case PROP_BUFFER_SIZE: { g_rec_mutex_lock(sndfile_mutex); g_value_set_uint(value, sndfile->buffer_size); g_rec_mutex_unlock(sndfile_mutex); } break; case PROP_FORMAT: { g_rec_mutex_lock(sndfile_mutex); g_value_set_uint(value, sndfile->format); g_rec_mutex_unlock(sndfile_mutex); } break; case PROP_FILE: { g_rec_mutex_lock(sndfile_mutex); g_value_set_pointer(value, sndfile->file); g_rec_mutex_unlock(sndfile_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); } } void ags_sndfile_dispose(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_sndfile_parent_class)->dispose(gobject); } void ags_sndfile_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_sndfile_parent_class)->finalize(gobject); } AgsUUID* ags_sndfile_get_uuid(AgsConnectable *connectable) { AgsSndfile *sndfile; AgsUUID *ptr; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(connectable); /* get audio file mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); /* get UUID */ g_rec_mutex_lock(sndfile_mutex); ptr = sndfile->uuid; g_rec_mutex_unlock(sndfile_mutex); return(ptr); } gboolean ags_sndfile_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_sndfile_is_ready(AgsConnectable *connectable) { AgsSndfile *sndfile; gboolean is_ready; sndfile = AGS_SNDFILE(connectable); /* check is ready */ is_ready = ags_sndfile_test_flags(sndfile, AGS_SNDFILE_ADDED_TO_REGISTRY); return(is_ready); } void ags_sndfile_add_to_registry(AgsConnectable *connectable) { AgsSndfile *sndfile; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } sndfile = AGS_SNDFILE(connectable); ags_sndfile_set_flags(sndfile, AGS_SNDFILE_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) sndfile); ags_registry_add_entry(registry, entry); } } void ags_sndfile_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_sndfile_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_sndfile_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_sndfile_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_sndfile_is_connected(AgsConnectable *connectable) { AgsSndfile *sndfile; gboolean is_connected; sndfile = AGS_SNDFILE(connectable); /* check is connected */ is_connected = ags_sndfile_test_flags(sndfile, AGS_SNDFILE_CONNECTED); return(is_connected); } void ags_sndfile_connect(AgsConnectable *connectable) { AgsSndfile *sndfile; if(ags_connectable_is_connected(connectable)){ return; } sndfile = AGS_SNDFILE(connectable); ags_sndfile_set_flags(sndfile, AGS_SNDFILE_CONNECTED); } void ags_sndfile_disconnect(AgsConnectable *connectable) { AgsSndfile *sndfile; if(!ags_connectable_is_connected(connectable)){ return; } sndfile = AGS_SNDFILE(connectable); ags_sndfile_unset_flags(sndfile, AGS_SNDFILE_CONNECTED); } /** * ags_sndfile_test_flags: * @sndfile: the #AgsSndfile * @flags: the flags * * Test @flags to be set on @sndfile. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_sndfile_test_flags(AgsSndfile *sndfile, guint flags) { gboolean retval; GRecMutex *sndfile_mutex; if(!AGS_IS_SNDFILE(sndfile)){ return(FALSE); } /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); /* test */ g_rec_mutex_lock(sndfile_mutex); retval = (flags & (sndfile->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(sndfile_mutex); return(retval); } /** * ags_sndfile_set_flags: * @sndfile: the #AgsSndfile * @flags: see #AgsSndfileFlags-enum * * Enable a feature of @sndfile. * * Since: 3.0.0 */ void ags_sndfile_set_flags(AgsSndfile *sndfile, guint flags) { GRecMutex *sndfile_mutex; if(!AGS_IS_SNDFILE(sndfile)){ return; } /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(sndfile_mutex); sndfile->flags |= flags; g_rec_mutex_unlock(sndfile_mutex); } /** * ags_sndfile_unset_flags: * @sndfile: the #AgsSndfile * @flags: see #AgsSndfileFlags-enum * * Disable a feature of @sndfile. * * Since: 3.0.0 */ void ags_sndfile_unset_flags(AgsSndfile *sndfile, guint flags) { GRecMutex *sndfile_mutex; if(!AGS_IS_SNDFILE(sndfile)){ return; } /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(sndfile_mutex); sndfile->flags &= (~flags); g_rec_mutex_unlock(sndfile_mutex); } gboolean ags_sndfile_open(AgsSoundResource *sound_resource, gchar *filename) { AgsSndfile *sndfile; guint format; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); /* info */ g_rec_mutex_lock(sndfile_mutex); if(sndfile->info != NULL){ g_rec_mutex_unlock(sndfile_mutex); return(FALSE); } sndfile->info = (SF_INFO *) malloc(sizeof(SF_INFO)); sndfile->info->format = 0; sndfile->info->channels = 0; sndfile->info->samplerate = 0; g_rec_mutex_unlock(sndfile_mutex); if(!ags_sndfile_test_flags(sndfile, AGS_SNDFILE_VIRTUAL)){ if(filename != NULL){ sndfile->file = (SNDFILE *) sf_open(filename, SFM_READ, sndfile->info); } }else{ sndfile->file = (SNDFILE *) sf_open_virtual(ags_sndfile_virtual_io, SFM_READ, sndfile->info, sndfile); } if(sndfile->file == NULL){ return(FALSE); } format = AGS_SOUNDCARD_DOUBLE; switch(((SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_16 | SF_FORMAT_PCM_24 | SF_FORMAT_PCM_32 | SF_FORMAT_FLOAT | SF_FORMAT_DOUBLE) & sndfile->info->format)){ case SF_FORMAT_PCM_S8: { //TODO:JK: implement me //format = AGS_SOUNDCARD_SIGNED_8_BIT; format = AGS_SOUNDCARD_DOUBLE; } break; case SF_FORMAT_PCM_16: { format = AGS_SOUNDCARD_SIGNED_16_BIT; } break; case SF_FORMAT_PCM_24: { //TODO:JK: implement me //format = AGS_SOUNDCARD_SIGNED_24_BIT; format = AGS_SOUNDCARD_DOUBLE; } break; case SF_FORMAT_PCM_32: { //TODO:JK: implement me //format = AGS_SOUNDCARD_SIGNED_32_BIT; format = AGS_SOUNDCARD_DOUBLE; } break; case SF_FORMAT_FLOAT: { format = AGS_SOUNDCARD_FLOAT; } break; case SF_FORMAT_DOUBLE: { format = AGS_SOUNDCARD_DOUBLE; } break; } g_object_set(sndfile, "audio-channels", sndfile->info->channels, "format", format, NULL); #ifdef AGS_DEBUG g_message("ags_sndfile_open(): channels %d frames %d", sndfile->info->channels, sndfile->info->frames); #endif return(TRUE); } gboolean ags_sndfile_rw_open(AgsSoundResource *sound_resource, gchar *filename, guint audio_channels, guint samplerate, gboolean create) { AgsSndfile *sndfile; guint major_format; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); /* info */ g_rec_mutex_lock(sndfile_mutex); if(sndfile->info != NULL){ g_rec_mutex_unlock(sndfile_mutex); return(FALSE); } if(!create && !g_file_test(filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ g_rec_mutex_unlock(sndfile_mutex); return(FALSE); } sndfile->info = (SF_INFO *) malloc(sizeof(SF_INFO)); memset(sndfile->info, 0, sizeof(SF_INFO)); sndfile->info->samplerate = (int) samplerate; sndfile->info->channels = (int) audio_channels; g_rec_mutex_unlock(sndfile_mutex); if(g_str_has_suffix(filename, ".wav")){ major_format = SF_FORMAT_WAV; sndfile->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sndfile, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); }else if(g_str_has_suffix(filename, ".flac")){ major_format = SF_FORMAT_FLAC; sndfile->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sndfile, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); }else if(g_str_has_suffix(filename, ".aiff")){ major_format = SF_FORMAT_AIFF; sndfile->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sndfile, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); }else if(g_str_has_suffix(filename, ".ogg")){ major_format = SF_FORMAT_OGG; sndfile->info->format = major_format | SF_FORMAT_VORBIS; g_object_set(sndfile, "format", AGS_SOUNDCARD_DOUBLE, NULL); }else{ major_format = SF_FORMAT_WAV; sndfile->info->format = major_format | SF_FORMAT_PCM_16; g_object_set(sndfile, "format", AGS_SOUNDCARD_SIGNED_16_BIT, NULL); } sndfile->info->frames = 0; sndfile->info->seekable = 0; sndfile->info->sections = 0; if(!sf_format_check(sndfile->info)){ g_warning("invalid format"); } if((AGS_SNDFILE_VIRTUAL & (sndfile->flags)) == 0){ if(filename != NULL){ sndfile->file = (SNDFILE *) sf_open(filename, SFM_RDWR, sndfile->info); } }else{ sndfile->file = (SNDFILE *) sf_open_virtual(ags_sndfile_virtual_io, SFM_RDWR, sndfile->info, sndfile); } g_object_set(sndfile, "audio-channels", audio_channels, NULL); if(sndfile->file == NULL){ return(FALSE); } #ifdef AGS_DEBUG g_message("ags_sndfile_rw_open(): channels %d frames %d", sndfile->info->channels, sndfile->info->frames); #endif return(TRUE); } gboolean ags_sndfile_info(AgsSoundResource *sound_resource, guint *frame_count, guint *loop_start, guint *loop_end) { AgsSndfile *sndfile; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); if(loop_start != NULL){ *loop_start = 0; } if(loop_end != NULL){ *loop_end = 0; } if(sndfile->info == NULL){ if(frame_count != NULL){ *frame_count = 0; } return(FALSE); } g_rec_mutex_lock(sndfile_mutex); if(frame_count != NULL){ if(sndfile->info != NULL){ *frame_count = sndfile->info->frames; }else{ *frame_count = 0; } } g_rec_mutex_unlock(sndfile_mutex); return(TRUE); } void ags_sndfile_set_presets(AgsSoundResource *sound_resource, guint channels, guint samplerate, guint buffer_size, guint format) { AgsSndfile *sndfile; sndfile = AGS_SNDFILE(sound_resource); g_object_set(sndfile, "buffer-size", buffer_size, "format", format, NULL); if(sndfile->info == NULL){ return; } sndfile->info->channels = channels; sndfile->info->samplerate = samplerate; sndfile->info->format &= (~(SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_16 | SF_FORMAT_PCM_24 | SF_FORMAT_PCM_32 | SF_FORMAT_FLOAT | SF_FORMAT_DOUBLE)); switch(format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { sndfile->info->format |= SF_FORMAT_PCM_S8; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { sndfile->info->format |= SF_FORMAT_PCM_16; } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { sndfile->info->format |= SF_FORMAT_PCM_24; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { sndfile->info->format |= SF_FORMAT_PCM_32; } break; case AGS_SOUNDCARD_FLOAT: { sndfile->info->format |= SF_FORMAT_FLOAT; } break; case AGS_SOUNDCARD_DOUBLE: { sndfile->info->format |= SF_FORMAT_DOUBLE; } break; } } void ags_sndfile_get_presets(AgsSoundResource *sound_resource, guint *channels, guint *samplerate, guint *buffer_size, guint *format) { AgsSndfile *sndfile; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); if(sndfile->info == NULL){ if(channels != NULL){ *channels = 0; } if(samplerate != NULL){ *samplerate = 0; } if(buffer_size != NULL){ *buffer_size = 0; } if(format != NULL){ *format = 0; } return; } g_rec_mutex_lock(sndfile_mutex); if(channels != NULL){ *channels = sndfile->info->channels; } if(samplerate != NULL){ *samplerate = sndfile->info->samplerate; } if(buffer_size != NULL){ *buffer_size = sndfile->buffer_size; } if(format != NULL){ switch(((SF_FORMAT_PCM_S8 | SF_FORMAT_PCM_16 | SF_FORMAT_PCM_24 | SF_FORMAT_PCM_32 | SF_FORMAT_FLOAT | SF_FORMAT_DOUBLE) & sndfile->info->format)){ case SF_FORMAT_PCM_S8: { *format = AGS_SOUNDCARD_SIGNED_8_BIT; } break; case SF_FORMAT_PCM_16: { *format = AGS_SOUNDCARD_SIGNED_16_BIT; } break; case SF_FORMAT_PCM_24: { *format = AGS_SOUNDCARD_SIGNED_24_BIT; } break; case SF_FORMAT_PCM_32: { *format = AGS_SOUNDCARD_SIGNED_32_BIT; } break; case SF_FORMAT_FLOAT: { *format = AGS_SOUNDCARD_FLOAT; } break; case SF_FORMAT_DOUBLE: { *format = AGS_SOUNDCARD_DOUBLE; } break; } } g_rec_mutex_unlock(sndfile_mutex); } guint ags_sndfile_read(AgsSoundResource *sound_resource, void *dbuffer, guint daudio_channels, guint audio_channel, guint frame_count, guint format) { AgsSndfile *sndfile; sf_count_t multi_frames; guint total_frame_count; guint read_count; guint copy_mode; gboolean use_cache; guint i; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); ags_sound_resource_info(sound_resource, &total_frame_count, NULL, NULL); g_rec_mutex_lock(sndfile_mutex); if(sndfile->offset >= total_frame_count){ g_rec_mutex_unlock(sndfile_mutex); return(0); } if(sndfile->offset + frame_count >= total_frame_count){ if(total_frame_count > sndfile->offset){ frame_count = total_frame_count - sndfile->offset; }else{ g_rec_mutex_unlock(sndfile_mutex); return(0); } } #if 0 use_cache = FALSE; if(sndfile->buffer_offset == sndfile->offset && frame_count <= sndfile->buffer_size){ use_cache = TRUE; } #endif sndfile->buffer_offset = sndfile->offset; read_count = sndfile->buffer_size; copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(format), ags_audio_buffer_util_format_from_soundcard(sndfile->format)); g_rec_mutex_unlock(sndfile_mutex); for(i = 0; i < frame_count && sndfile->offset + i < total_frame_count; ){ sf_count_t retval; if(sndfile->offset + read_count > total_frame_count){ read_count = total_frame_count - sndfile->offset; } if(i + read_count > frame_count){ read_count = frame_count - i; } multi_frames = read_count * sndfile->info->channels; retval = -1; // if(!use_cache){ // g_message("read %d %d", sndfile->offset, sndfile->buffer_size); switch(sndfile->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { //TODO:JK: implement me retval = 0; } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { retval = sf_read_short(sndfile->file, sndfile->buffer, multi_frames); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //TODO:JK: implement me retval = 0; } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { //TODO:JK: implement me retval = 0; } break; case AGS_SOUNDCARD_FLOAT: { retval = sf_read_float(sndfile->file, sndfile->buffer, multi_frames); } break; case AGS_SOUNDCARD_DOUBLE: { retval = sf_read_double(sndfile->file, sndfile->buffer, multi_frames); } break; } sndfile->offset += read_count; if(retval == -1){ g_warning("read failed"); } if(retval != multi_frames){ break; } // } ags_audio_buffer_util_copy_buffer_to_buffer(dbuffer, daudio_channels, (i * daudio_channels), sndfile->buffer, sndfile->info->channels, audio_channel, read_count, copy_mode); // g_message("[%d] %d", audio_channel, ags_synth_util_get_xcross_count_s16(dbuffer, read_count)); i += read_count; } return(frame_count); } void ags_sndfile_write(AgsSoundResource *sound_resource, void *sbuffer, guint saudio_channels, guint audio_channel, guint frame_count, guint format) { AgsSndfile *sndfile; guint copy_mode; sf_count_t multi_frames; guint i; gboolean do_write; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); g_rec_mutex_lock(sndfile_mutex); copy_mode = ags_audio_buffer_util_get_copy_mode(ags_audio_buffer_util_format_from_soundcard(sndfile->format), ags_audio_buffer_util_format_from_soundcard(format)); ags_audio_buffer_util_copy_buffer_to_buffer(sndfile->buffer, sndfile->info->channels, audio_channel, sbuffer, saudio_channels, audio_channel, frame_count, copy_mode); sndfile->audio_channel_written[audio_channel] = frame_count; do_write = TRUE; for(i = 0; i < sndfile->audio_channels; i++){ if(sndfile->audio_channel_written[i] == -1){ do_write = FALSE; break; } } g_rec_mutex_unlock(sndfile_mutex); if(do_write){ multi_frames = frame_count * sndfile->info->channels; switch(sndfile->format){ case AGS_SOUNDCARD_SIGNED_8_BIT: { //TODO:JK: implement me } break; case AGS_SOUNDCARD_SIGNED_16_BIT: { sf_write_short(sndfile->file, sndfile->buffer, multi_frames); } break; case AGS_SOUNDCARD_SIGNED_24_BIT: { //TODO:JK: implement me } break; case AGS_SOUNDCARD_SIGNED_32_BIT: { //TODO:JK: implement me } break; case AGS_SOUNDCARD_FLOAT: { sf_write_float(sndfile->file, sndfile->buffer, multi_frames); } break; case AGS_SOUNDCARD_DOUBLE: { sf_write_double(sndfile->file, sndfile->buffer, multi_frames); } break; } for(i = 0; i < sndfile->audio_channels; i++){ sndfile->audio_channel_written[i] = -1; } if(sndfile->format == AGS_SOUNDCARD_DOUBLE){ ags_audio_buffer_util_clear_double(sndfile->buffer, sndfile->info->channels, frame_count); }else if(sndfile->format == AGS_SOUNDCARD_FLOAT){ ags_audio_buffer_util_clear_float(sndfile->buffer, sndfile->info->channels, frame_count); }else{ ags_audio_buffer_util_clear_buffer(sndfile->buffer, sndfile->info->channels, frame_count, ags_audio_buffer_util_format_from_soundcard(sndfile->format)); } sndfile->offset += frame_count; } } void ags_sndfile_flush(AgsSoundResource *sound_resource) { AgsSndfile *sndfile; sndfile = AGS_SNDFILE(sound_resource); if(sndfile->file == NULL){ return; } sf_write_sync(sndfile->file); } void ags_sndfile_seek(AgsSoundResource *sound_resource, gint64 frame_count, gint whence) { AgsSndfile *sndfile; guint total_frame_count; sf_count_t retval; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); ags_sound_resource_info(sound_resource, &total_frame_count, NULL, NULL); g_rec_mutex_lock(sndfile_mutex); if(whence == G_SEEK_CUR){ if(frame_count >= 0){ if(sndfile->offset + frame_count < total_frame_count){ sndfile->offset += total_frame_count; }else{ sndfile->offset = total_frame_count; } }else{ if(sndfile->offset + frame_count >= 0){ sndfile->offset += total_frame_count; }else{ sndfile->offset = 0; } } }else if(whence == G_SEEK_SET){ if(frame_count >= 0){ if(frame_count < total_frame_count){ sndfile->offset = frame_count; }else{ sndfile->offset = total_frame_count; } }else{ sndfile->offset = 0; } }else if(whence == G_SEEK_END){ if(frame_count > 0){ sndfile->offset = total_frame_count; }else{ if(total_frame_count + frame_count > 0){ sndfile->offset = total_frame_count + total_frame_count; }else{ sndfile->offset = 0; } } } g_rec_mutex_unlock(sndfile_mutex); retval = sf_seek(sndfile->file, sndfile->offset, SEEK_SET); if(retval == -1){ g_warning("seek failed"); } } void ags_sndfile_close(AgsSoundResource *sound_resource) { AgsSndfile *sndfile; GRecMutex *sndfile_mutex; sndfile = AGS_SNDFILE(sound_resource); /* get sndfile mutex */ sndfile_mutex = AGS_SNDFILE_GET_OBJ_MUTEX(sndfile); if(sndfile->file == NULL){ return; } sf_close(sndfile->file); g_rec_mutex_lock(sndfile_mutex); if(sndfile->info != NULL){ free(sndfile->info); } sndfile->file = NULL; sndfile->info = NULL; g_rec_mutex_unlock(sndfile_mutex); } sf_count_t ags_sndfile_vio_get_filelen(void *user_data) { return(AGS_SNDFILE(user_data)->length); } sf_count_t ags_sndfile_vio_seek(sf_count_t offset, int whence, void *user_data) { switch(whence){ case SEEK_CUR: AGS_SNDFILE(user_data)->current += offset; break; case SEEK_SET: AGS_SNDFILE(user_data)->current = &(AGS_SNDFILE(user_data)->pointer[offset]); break; case SEEK_END: AGS_SNDFILE(user_data)->current = &(AGS_SNDFILE(user_data)->pointer[AGS_SNDFILE(user_data)->length - offset]); break; } return(AGS_SNDFILE(user_data)->current - AGS_SNDFILE(user_data)->pointer); } sf_count_t ags_sndfile_vio_read(void *ptr, sf_count_t count, void *user_data) { guchar *retval; retval = memcpy(ptr, AGS_SNDFILE(user_data)->current, count * sizeof(guchar)); return(retval - AGS_SNDFILE(user_data)->pointer); } sf_count_t ags_sndfile_vio_write(const void *ptr, sf_count_t count, void *user_data) { guchar *retval; retval = memcpy(AGS_SNDFILE(user_data)->current, ptr, count * sizeof(guchar)); return(retval - AGS_SNDFILE(user_data)->pointer); } sf_count_t ags_sndfile_vio_tell(const void *ptr, sf_count_t count, void *user_data) { return(AGS_SNDFILE(user_data)->current - AGS_SNDFILE(user_data)->pointer); } /** * ags_sndfile_new: * * Creates a new instance of #AgsSndfile. * * Returns: the new #AgsSndfile. * * Since: 3.0.0 */ AgsSndfile* ags_sndfile_new() { AgsSndfile *sndfile; sndfile = (AgsSndfile *) g_object_new(AGS_TYPE_SNDFILE, NULL); return(sndfile); } gsequencer-3.1.3/ags/audio/file/ags_ipatch_gig_reader.c0000644000175000017500000006022213607210263020012 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_ipatch_gig_reader_class_init(AgsIpatchGigReaderClass *ipatch_gig_reader); void ags_ipatch_gig_reader_connectable_interface_init(AgsConnectableInterface *connectable); void ags_ipatch_gig_reader_init(AgsIpatchGigReader *ipatch_gig_reader); void ags_ipatch_gig_reader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ipatch_gig_reader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ipatch_gig_reader_dispose(GObject *gobject); void ags_ipatch_gig_reader_finalize(GObject *gobject); AgsUUID* ags_ipatch_gig_reader_get_uuid(AgsConnectable *connectable); gboolean ags_ipatch_gig_reader_has_resource(AgsConnectable *connectable); gboolean ags_ipatch_gig_reader_is_ready(AgsConnectable *connectable); void ags_ipatch_gig_reader_add_to_registry(AgsConnectable *connectable); void ags_ipatch_gig_reader_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_ipatch_gig_reader_list_resource(AgsConnectable *connectable); xmlNode* ags_ipatch_gig_reader_xml_compose(AgsConnectable *connectable); void ags_ipatch_gig_reader_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_ipatch_gig_reader_is_connected(AgsConnectable *connectable); void ags_ipatch_gig_reader_connect(AgsConnectable *connectable); void ags_ipatch_gig_reader_disconnect(AgsConnectable *connectable); /** * SECTION:ags_ipatch_gig_reader * @short_description: interfacing GIG related API of libinstpatch * @title: AgsIpatchGigReader * @section_id: * @include: ags/audio/file/ags_ipatch_gig_reader.h * * #AgsIpatchGigReader is the base object to ineract with GIG related API. */ static gpointer ags_ipatch_gig_reader_parent_class = NULL; enum{ PROP_0, PROP_IPATCH, }; GType ags_ipatch_gig_reader_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ipatch_gig_reader = 0; static const GTypeInfo ags_ipatch_gig_reader_info = { sizeof(AgsIpatchGigReaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ipatch_gig_reader_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsIpatchGigReader), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ipatch_gig_reader_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_ipatch_gig_reader_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_ipatch_gig_reader = g_type_register_static(G_TYPE_OBJECT, "AgsIpatchGigReader", &ags_ipatch_gig_reader_info, 0); g_type_add_interface_static(ags_type_ipatch_gig_reader, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_ipatch_gig_reader); } return g_define_type_id__volatile; } void ags_ipatch_gig_reader_class_init(AgsIpatchGigReaderClass *ipatch_gig_reader) { GObjectClass *gobject; GParamSpec *param_spec; ags_ipatch_gig_reader_parent_class = g_type_class_peek_parent(ipatch_gig_reader); gobject = (GObjectClass *) ipatch_gig_reader; gobject->set_property = ags_ipatch_gig_reader_set_property; gobject->get_property = ags_ipatch_gig_reader_get_property; gobject->dispose = ags_ipatch_gig_reader_dispose; gobject->finalize = ags_ipatch_gig_reader_finalize; /* properties */ /** * AgsIpatchGigReader:ipatch: * * The assigned #AgsIpatch * * Since: 3.0.0 */ param_spec = g_param_spec_object("ipatch", i18n_pspec("the ipatch"), i18n_pspec("The assigned ipatch"), AGS_TYPE_IPATCH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IPATCH, param_spec); } void ags_ipatch_gig_reader_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_ipatch_gig_reader_get_uuid; connectable->has_resource = ags_ipatch_gig_reader_has_resource; connectable->is_ready = ags_ipatch_gig_reader_is_ready; connectable->add_to_registry = ags_ipatch_gig_reader_add_to_registry; connectable->remove_from_registry = ags_ipatch_gig_reader_remove_from_registry; connectable->list_resource = ags_ipatch_gig_reader_list_resource; connectable->xml_compose = ags_ipatch_gig_reader_xml_compose; connectable->xml_parse = ags_ipatch_gig_reader_xml_parse; connectable->is_connected = ags_ipatch_gig_reader_is_connected; connectable->connect = ags_ipatch_gig_reader_connect; connectable->disconnect = ags_ipatch_gig_reader_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_ipatch_gig_reader_init(AgsIpatchGigReader *ipatch_gig_reader) { guint i; ipatch_gig_reader->flags = 0; /* add audio file mutex */ g_rec_mutex_init(&(ipatch_gig_reader->obj_mutex)); /* uuid */ ipatch_gig_reader->uuid = ags_uuid_alloc(); ags_uuid_generate(ipatch_gig_reader->uuid); ipatch_gig_reader->level = 0; ipatch_gig_reader->ipatch = NULL; /* selected */ ipatch_gig_reader->index_selected = (guint *) malloc(3 * sizeof(guint)); memset(ipatch_gig_reader->index_selected, 0, 3 * sizeof(guint)); ipatch_gig_reader->name_selected = (gchar **) malloc(4 * sizeof(gchar *)); for(i = 0; i < 4; i++){ ipatch_gig_reader->name_selected[i] = NULL; } /* reader */ ipatch_gig_reader->reader = NULL; ipatch_gig_reader->gig = NULL; ipatch_gig_reader->instrument = NULL; ipatch_gig_reader->sample = NULL; ipatch_gig_reader->error = NULL; } void ags_ipatch_gig_reader_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsIpatchGigReader *ipatch_gig_reader; GRecMutex *ipatch_gig_reader_mutex; ipatch_gig_reader = AGS_IPATCH_GIG_READER(gobject); /* get ipatch sample mutex */ ipatch_gig_reader_mutex = AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(ipatch_gig_reader); switch(prop_id){ case PROP_IPATCH: { AgsIpatch *ipatch; ipatch = (AgsIpatch *) g_value_get_object(value); g_rec_mutex_lock(ipatch_gig_reader_mutex); if(ipatch_gig_reader->ipatch == ipatch){ g_rec_mutex_unlock(ipatch_gig_reader_mutex); return; } if(ipatch_gig_reader->ipatch != NULL){ g_object_unref(ipatch_gig_reader->ipatch); } if(ipatch != NULL){ g_object_ref(ipatch); } ipatch_gig_reader->ipatch = ipatch; g_rec_mutex_unlock(ipatch_gig_reader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_gig_reader_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsIpatchGigReader *ipatch_gig_reader; GRecMutex *ipatch_gig_reader_mutex; ipatch_gig_reader = AGS_IPATCH_GIG_READER(gobject); /* get ipatch sample mutex */ ipatch_gig_reader_mutex = AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(ipatch_gig_reader); switch(prop_id){ case PROP_IPATCH: { g_rec_mutex_lock(ipatch_gig_reader_mutex); g_value_set_object(value, ipatch_gig_reader->ipatch); g_rec_mutex_unlock(ipatch_gig_reader_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ipatch_gig_reader_dispose(GObject *gobject) { AgsIpatchGigReader *ipatch_gig_reader; ipatch_gig_reader = AGS_IPATCH_GIG_READER(gobject); if(ipatch_gig_reader->ipatch != NULL){ g_object_unref(ipatch_gig_reader->ipatch); ipatch_gig_reader->ipatch = NULL; } /* call parent */ G_OBJECT_CLASS(ags_ipatch_gig_reader_parent_class)->dispose(gobject); } void ags_ipatch_gig_reader_finalize(GObject *gobject) { AgsIpatchGigReader *ipatch_gig_reader; ipatch_gig_reader = AGS_IPATCH_GIG_READER(gobject); if(ipatch_gig_reader->ipatch != NULL){ g_object_unref(ipatch_gig_reader->ipatch); } /* call parent */ G_OBJECT_CLASS(ags_ipatch_gig_reader_parent_class)->finalize(gobject); } AgsUUID* ags_ipatch_gig_reader_get_uuid(AgsConnectable *connectable) { AgsIpatchGigReader *ipatch_gig_reader; AgsUUID *ptr; GRecMutex *ipatch_gig_reader_mutex; ipatch_gig_reader = AGS_IPATCH_GIG_READER(connectable); /* get audio file mutex */ ipatch_gig_reader_mutex = AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(ipatch_gig_reader); /* get UUID */ g_rec_mutex_lock(ipatch_gig_reader_mutex); ptr = ipatch_gig_reader->uuid; g_rec_mutex_unlock(ipatch_gig_reader_mutex); return(ptr); } gboolean ags_ipatch_gig_reader_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_ipatch_gig_reader_is_ready(AgsConnectable *connectable) { AgsIpatchGigReader *ipatch_gig_reader; gboolean is_ready; ipatch_gig_reader = AGS_IPATCH_GIG_READER(connectable); /* check is ready */ is_ready = ags_ipatch_gig_reader_test_flags(ipatch_gig_reader, AGS_IPATCH_GIG_READER_ADDED_TO_REGISTRY); return(is_ready); } void ags_ipatch_gig_reader_add_to_registry(AgsConnectable *connectable) { AgsIpatchGigReader *ipatch_gig_reader; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } ipatch_gig_reader = AGS_IPATCH_GIG_READER(connectable); ags_ipatch_gig_reader_set_flags(ipatch_gig_reader, AGS_IPATCH_GIG_READER_ADDED_TO_REGISTRY); application_context = ags_application_context_get_instance(); registry = (AgsRegistry *) ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); if(registry != NULL){ entry = ags_registry_entry_alloc(registry); g_value_set_object(entry->entry, (gpointer) ipatch_gig_reader); ags_registry_add_entry(registry, entry); } } void ags_ipatch_gig_reader_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_ipatch_gig_reader_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_ipatch_gig_reader_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_ipatch_gig_reader_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_ipatch_gig_reader_is_connected(AgsConnectable *connectable) { AgsIpatchGigReader *ipatch_gig_reader; gboolean is_connected; ipatch_gig_reader = AGS_IPATCH_GIG_READER(connectable); /* check is connected */ is_connected = ags_ipatch_gig_reader_test_flags(ipatch_gig_reader, AGS_IPATCH_GIG_READER_CONNECTED); return(is_connected); } void ags_ipatch_gig_reader_connect(AgsConnectable *connectable) { AgsIpatchGigReader *ipatch_gig_reader; if(ags_connectable_is_connected(connectable)){ return; } ipatch_gig_reader = AGS_IPATCH_GIG_READER(connectable); ags_ipatch_gig_reader_set_flags(ipatch_gig_reader, AGS_IPATCH_GIG_READER_CONNECTED); } void ags_ipatch_gig_reader_disconnect(AgsConnectable *connectable) { AgsIpatchGigReader *ipatch_gig_reader; if(!ags_connectable_is_connected(connectable)){ return; } ipatch_gig_reader = AGS_IPATCH_GIG_READER(connectable); ags_ipatch_gig_reader_unset_flags(ipatch_gig_reader, AGS_IPATCH_GIG_READER_CONNECTED); } /** * ags_ipatch_gig_reader_test_flags: * @ipatch_gig_reader: the #AgsIpatchGigReader * @flags: the flags * * Test @flags to be set on @ipatch_gig_reader. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_ipatch_gig_reader_test_flags(AgsIpatchGigReader *ipatch_gig_reader, guint flags) { gboolean retval; GRecMutex *ipatch_gig_reader_mutex; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(FALSE); } /* get ipatch gig reader mutex */ ipatch_gig_reader_mutex = AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(ipatch_gig_reader); /* test */ g_rec_mutex_lock(ipatch_gig_reader_mutex); retval = (flags & (ipatch_gig_reader->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(ipatch_gig_reader_mutex); return(retval); } /** * ags_ipatch_gig_reader_set_flags: * @ipatch_gig_reader: the #AgsIpatchGigReader * @flags: see #AgsIpatchGigReaderFlags-enum * * Enable a feature of @ipatch_gig_reader. * * Since: 3.0.0 */ void ags_ipatch_gig_reader_set_flags(AgsIpatchGigReader *ipatch_gig_reader, guint flags) { GRecMutex *ipatch_gig_reader_mutex; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return; } /* get ipatch gig reader mutex */ ipatch_gig_reader_mutex = AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(ipatch_gig_reader); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(ipatch_gig_reader_mutex); ipatch_gig_reader->flags |= flags; g_rec_mutex_unlock(ipatch_gig_reader_mutex); } /** * ags_ipatch_gig_reader_unset_flags: * @ipatch_gig_reader: the #AgsIpatchGigReader * @flags: see #AgsIpatchGigReaderFlags-enum * * Disable a feature of @ipatch_gig_reader. * * Since: 3.0.0 */ void ags_ipatch_gig_reader_unset_flags(AgsIpatchGigReader *ipatch_gig_reader, guint flags) { GRecMutex *ipatch_gig_reader_mutex; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return; } /* get ipatch gig reader mutex */ ipatch_gig_reader_mutex = AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX(ipatch_gig_reader); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(ipatch_gig_reader_mutex); ipatch_gig_reader->flags &= (~flags); g_rec_mutex_unlock(ipatch_gig_reader_mutex); } gboolean ags_ipatch_gig_reader_load(AgsIpatchGigReader *ipatch_gig_reader, IpatchFileHandle *handle) { if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(FALSE); } ipatch_gig_reader->reader = ipatch_dls_reader_new(handle); ipatch_gig_reader->error = NULL; ipatch_gig_reader->base = (IpatchBase *) ipatch_dls_reader_load(ipatch_gig_reader->reader, &(ipatch_gig_reader->error)); if(ipatch_gig_reader->error != NULL){ g_warning("%s", ipatch_gig_reader->error->message); return(FALSE); } ipatch_gig_reader->error = NULL; ipatch_gig_reader->gig = (IpatchGig *) ipatch_convert_object_to_type((GObject *) handle->file, IPATCH_TYPE_GIG, &(ipatch_gig_reader->error)); if(ipatch_gig_reader->error != NULL){ g_warning("%s", ipatch_gig_reader->error->message); return(FALSE); } while(g_static_rec_mutex_unlock_full(((IpatchItem *) (ipatch_gig_reader->base))->mutex) != 0); return(TRUE); } gboolean ags_ipatch_gig_reader_select_instrument(AgsIpatchGigReader *ipatch_gig_reader, guint instrument_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchGig *gig; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter; #endif gboolean success; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH gig = ipatch_gig_reader->gig; ipatch_list = ipatch_container_get_children((IpatchContainer *) gig, IPATCH_TYPE_DLS2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); if(instrument_index < ipatch_iter_count(&instrument_iter)){ int bank, program; success = TRUE; ipatch_iter_index(&instrument_iter, instrument_index); ipatch_item = (IpatchItem *) ipatch_dls2_inst_get_regions(ipatch_iter_get(&instrument_iter)); /* selected index and name */ ipatch_gig_reader->index_selected[AGS_GIG_IHDR] = instrument_index; ipatch_gig_reader->index_selected[AGS_GIG_SHDR] = 0; g_free(ipatch_gig_reader->name_selected[AGS_GIG_IHDR]); ipatch_dls2_inst_get_midi_locale((IpatchDLS2Inst *) ipatch_item, &bank, &program); ipatch_gig_reader->name_selected[AGS_GIG_IHDR] = g_strdup_printf("bank=%d; program=%d;", bank, program); g_free(ipatch_gig_reader->name_selected[AGS_GIG_SHDR]); ipatch_gig_reader->name_selected[AGS_GIG_SHDR] = NULL; /* container */ ipatch_gig_reader->instrument = (IpatchContainer *) ipatch_item; ipatch_gig_reader->sample = NULL; } } #endif return(success); } gboolean ags_ipatch_gig_reader_select_sample(AgsIpatchGigReader *ipatch_gig_reader, guint sample_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchGig *gig; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif gboolean success; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(FALSE); } success = FALSE; #ifdef AGS_WITH_LIBINSTPATCH gig = ipatch_gig_reader->gig; ipatch_list = ipatch_dls2_inst_get_regions(ipatch_gig_reader->instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); if(sample_index < ipatch_iter_count(&sample_iter)){ success = TRUE; ipatch_iter_index(&sample_iter, sample_index); ipatch_item = (IpatchItem *) ipatch_dls2_region_get_sample(ipatch_iter_get(&sample_iter)); /* selected index and name */ ipatch_gig_reader->index_selected[AGS_GIG_SHDR] = sample_index; g_free(ipatch_gig_reader->name_selected[AGS_GIG_SHDR]); if(IPATCH_DLS2_SAMPLE(ipatch_item)->dlid != NULL){ ipatch_gig_reader->name_selected[AGS_GIG_SHDR] = g_strdup_printf("id=0x%x%x", IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[1], IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[0]); }else{ ipatch_gig_reader->name_selected[AGS_GIG_SHDR] = g_strdup("(null)"); } /* container */ ipatch_gig_reader->sample = (IpatchContainer *) ipatch_item; } } #endif return(success); } /** * ags_ipatch_gig_reader_get_instrument_all: * @ipatch_gig_reader: the #AgsIpatchGigReader * * Get instrument all. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing instrument * * Since: 3.0.0 */ gchar** ags_ipatch_gig_reader_get_instrument_all(AgsIpatchGigReader *ipatch_gig_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchGig *gig; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter; #endif gchar **instrument; guint i, i_stop; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(NULL); } instrument = NULL; #ifdef AGS_WITH_LIBINSTPATCH gig = ipatch_gig_reader->gig; ipatch_list = ipatch_container_get_children((IpatchContainer *) gig, IPATCH_TYPE_DLS2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); i_stop = ipatch_iter_count(&instrument_iter); if(i_stop > 0){ instrument = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&instrument_iter); for(i = 0; i < i_stop; i++){ int bank, program; ipatch_item = ipatch_iter_get(&instrument_iter); ipatch_dls2_inst_get_midi_locale((IpatchDLS2Inst *) ipatch_item, &bank, &program); instrument[i] = g_strdup_printf("bank=%d; program=%d;", bank, program); /* iterate */ ipatch_iter_next(&instrument_iter); } instrument[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (gig))->mutex) != 0); #endif return(instrument); } /** * ags_ipatch_gig_reader_get_sample_all: * @ipatch_gig_reader: the #AgsIpatchGigReader * * Get sample all. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing sample * * Since: 3.0.0 */ gchar** ags_ipatch_gig_reader_get_sample_all(AgsIpatchGigReader *ipatch_gig_reader) { #ifdef AGS_WITH_LIBINSTPATCH IpatchGig *gig; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter sample_iter; #endif gchar **sample; guint i, i_stop; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(NULL); } sample = NULL; #ifdef AGS_WITH_LIBINSTPATCH gig = ipatch_gig_reader->gig; ipatch_list = ipatch_container_get_children(gig, IPATCH_TYPE_DLS2_SAMPLE); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); i_stop = ipatch_iter_count(&sample_iter); if(i_stop > 0){ sample = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); ipatch_iter_first(&sample_iter); for(i = 0; i < i_stop; i++){ ipatch_item = ipatch_iter_get(&sample_iter); if(IPATCH_DLS2_SAMPLE(ipatch_item)->dlid != NULL){ sample[i] = g_strdup_printf("id=0x%x%x", IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[1], IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[0]); }else{ sample[i] = g_strdup("(null)"); } /* iterate */ ipatch_iter_next(&sample_iter); } sample[i] = NULL; } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (gig))->mutex) != 0); #endif return(sample); } /** * ags_ipatch_gig_reader_get_sample_by_instrument_index: * @ipatch_gig_reader: the #AgsIpatchGigReader * @instrument_index: the instrument index * * Get sample by instrument index. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing sample * * Since: 3.0.0 */ gchar** ags_ipatch_gig_reader_get_sample_by_instrument_index(AgsIpatchGigReader *ipatch_gig_reader, guint instrument_index) { #ifdef AGS_WITH_LIBINSTPATCH IpatchGig *gig; IpatchContainer *instrument; IpatchItem *ipatch_item; IpatchList *ipatch_list; IpatchIter instrument_iter, sample_iter; #endif gchar **sample; guint i, i_stop; guint j, j_stop; guint count; if(!AGS_IS_IPATCH_GIG_READER(ipatch_gig_reader)){ return(NULL); } sample = NULL; #ifdef AGS_WITH_LIBINSTPATCH gig = ipatch_gig_reader->gig; /* instruments */ ipatch_list = ipatch_container_get_children((IpatchContainer *) gig, IPATCH_TYPE_DLS2_INST); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &instrument_iter); i_stop = ipatch_iter_count(&instrument_iter); if(i_stop > 0 && instrument_index < i_stop){ ipatch_iter_index(&instrument_iter, instrument_index); instrument = ipatch_iter_get(&instrument_iter); /* samples */ ipatch_list = ipatch_dls2_inst_get_regions(instrument); if(ipatch_list != NULL){ ipatch_list_init_iter(ipatch_list, &sample_iter); j_stop = ipatch_iter_count(&sample_iter); if(j_stop > 0){ sample = (gchar **) malloc((j_stop + 1) * sizeof(gchar *)); for(j = 0, count = 0; j < j_stop; j++){ ipatch_item = (IpatchItem *) ipatch_dls2_region_get_sample(ipatch_iter_get(&sample_iter)); if(IPATCH_DLS2_SAMPLE(ipatch_item)->dlid != NULL){ sample[count] = g_strdup_printf("id=0x%x%x", IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[1], IPATCH_DLS2_SAMPLE(ipatch_item)->dlid[0]); }else{ sample[count] = g_strdup("(null)"); } /* iterate */ ipatch_iter_next(&sample_iter); count++; } sample[count] = NULL; } } } } //FIXME:JK: still needed? while(g_static_rec_mutex_unlock_full(((IpatchItem *) (gig))->mutex) != 0); #endif return(sample); } /** * ags_ipatch_gig_reader_new: * @ipatch: the #AgsIpatch * * Creates a new instance of #AgsIpatchGigReader. * * Returns: the new #AgsIpatchGigReader. * * Since: 3.0.0 */ AgsIpatchGigReader* ags_ipatch_gig_reader_new(AgsIpatch *ipatch) { AgsIpatchGigReader *ipatch_gig_reader; ipatch_gig_reader = (AgsIpatchGigReader *) g_object_new(AGS_TYPE_IPATCH_GIG_READER, "ipatch", ipatch, NULL); return(ipatch_gig_reader); } gsequencer-3.1.3/ags/audio/ags_synth_generator.h0000644000175000017500000001713613616617253016713 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SYNTH_GENERATOR_H__ #define __AGS_SYNTH_GENERATOR_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SYNTH_GENERATOR (ags_synth_generator_get_type()) #define AGS_SYNTH_GENERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SYNTH_GENERATOR, AgsSynthGenerator)) #define AGS_SYNTH_GENERATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SYNTH_GENERATOR, AgsSynthGeneratorClass)) #define AGS_IS_SYNTH_GENERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SYNTH_GENERATOR)) #define AGS_IS_SYNTH_GENERATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_SYNTH_GENERATOR)) #define AGS_SYNTH_GENERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_SYNTH_GENERATOR, AgsSynthGeneratorClass)) #define AGS_SYNTH_GENERATOR_GET_OBJ_MUTEX(obj) (&(((AgsSynthGenerator *) obj)->obj_mutex)) #define AGS_SYNTH_GENERATOR_DEFAULT_SAMPLERATE ((guint) AGS_SOUNDCARD_DEFAULT_SAMPLERATE) #define AGS_SYNTH_GENERATOR_DEFAULT_BUFFER_SIZE (AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) #define AGS_SYNTH_GENERATOR_DEFAULT_FORMAT (AGS_SOUNDCARD_DEFAULT_FORMAT) #define AGS_SYNTH_GENERATOR_DEFAULT_OSCILLATOR (AGS_SYNTH_GENERATOR_OSCILLATOR_SIN) #define AGS_SYNTH_GENERATOR_DEFAULT_FREQUENCY (440.0) #define AGS_SYNTH_GENERATOR_DEFAULT_PHASE (0.0) #define AGS_SYNTH_GENERATOR_DEFAULT_VOLUME (1.0) #define AGS_SYNTH_GENERATOR_DEFAULT_LFO_DEPTH (1.0) #define AGS_SYNTH_GENERATOR_DEFAULT_TUNING (0.0) #define AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_FREQUENCY (6.0) #define AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_DEPTH (1.0) #define AGS_SYNTH_GENERATOR_DEFAULT_FM_TUNING (0.0) typedef struct _AgsSynthGenerator AgsSynthGenerator; typedef struct _AgsSynthGeneratorClass AgsSynthGeneratorClass; /** * AgsSynthGeneratorOscillator: * @AGS_SYNTH_GENERATOR_OSCILLATOR_SIN: sinus * @AGS_SYNTH_GENERATOR_OSCILLATOR_SAWTOOTH: sawtooth * @AGS_SYNTH_GENERATOR_OSCILLATOR_TRIANGLE: triangle * @AGS_SYNTH_GENERATOR_OSCILLATOR_SQUARE: square * @AGS_SYNTH_GENERATOR_OSCILLATOR_IMPULSE: impulse * * Enum values to specify oscillator. */ typedef enum{ AGS_SYNTH_GENERATOR_OSCILLATOR_SIN, AGS_SYNTH_GENERATOR_OSCILLATOR_SAWTOOTH, AGS_SYNTH_GENERATOR_OSCILLATOR_TRIANGLE, AGS_SYNTH_GENERATOR_OSCILLATOR_SQUARE, AGS_SYNTH_GENERATOR_OSCILLATOR_IMPULSE, }AgsSynthGeneratorOscillator; struct _AgsSynthGenerator { AgsFunction function; guint flags; GRecMutex obj_mutex; guint samplerate; guint buffer_size; guint format; guint frame_count; guint loop_start; guint loop_end; gdouble delay; guint attack; gboolean do_lfo; guint oscillator; gdouble frequency; gdouble phase; gdouble volume; gdouble lfo_depth; gdouble tuning; gboolean sync_relative; AgsComplex **sync_point; guint sync_point_count; gboolean do_fm_synth; guint fm_lfo_oscillator; gdouble fm_lfo_frequency; gdouble fm_lfo_depth; gdouble fm_tuning; AgsComplex *damping; AgsComplex *vibration; GObject *timestamp; }; struct _AgsSynthGeneratorClass { AgsFunctionClass function; }; GType ags_synth_generator_get_type(); GRecMutex* ags_synth_generator_get_obj_mutex(AgsSynthGenerator *synth_generator); guint ags_synth_generator_get_samplerate(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_samplerate(AgsSynthGenerator *synth_generator, guint samplerate); guint ags_synth_generator_get_buffer_size(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_buffer_size(AgsSynthGenerator *synth_generator, guint buffer_size); guint ags_synth_generator_get_format(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_format(AgsSynthGenerator *synth_generator, guint format); gdouble ags_synth_generator_get_delay(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_delay(AgsSynthGenerator *synth_generator, gdouble delay); guint ags_synth_generator_get_frame_count(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_frame_count(AgsSynthGenerator *synth_generator, guint frame_count); guint ags_synth_generator_get_loop_start(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_loop_start(AgsSynthGenerator *synth_generator, guint loop_start); guint ags_synth_generator_get_loop_end(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_loop_end(AgsSynthGenerator *synth_generator, guint loop_end); gboolean ags_synth_generator_get_do_lfo(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_do_lfo(AgsSynthGenerator *synth_generator, gboolean do_lfo); guint ags_synth_generator_get_oscillator(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_oscillator(AgsSynthGenerator *synth_generator, guint oscillator); gdouble ags_synth_generator_get_frequency(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_frequency(AgsSynthGenerator *synth_generator, gdouble frequency); gdouble ags_synth_generator_get_phase(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_phase(AgsSynthGenerator *synth_generator, gdouble phase); gdouble ags_synth_generator_get_volume(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_volume(AgsSynthGenerator *synth_generator, gdouble volume); gdouble ags_synth_generator_get_lfo_depth(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_lfo_depth(AgsSynthGenerator *synth_generator, gdouble lfo_depth); gdouble ags_synth_generator_get_tuning(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_tuning(AgsSynthGenerator *synth_generator, gdouble tuning); gboolean ags_synth_generator_get_do_fm_synth(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_do_fm_synth(AgsSynthGenerator *synth_generator, gboolean do_fm_synth); guint ags_synth_generator_get_fm_lfo_oscillator(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_fm_lfo_oscillator(AgsSynthGenerator *synth_generator, guint fm_lfo_oscillator); gdouble ags_synth_generator_get_fm_lfo_frequency(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_fm_lfo_frequency(AgsSynthGenerator *synth_generator, gdouble fm_lfo_frequency); gdouble ags_synth_generator_get_fm_lfo_depth(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_fm_lfo_depth(AgsSynthGenerator *synth_generator, gdouble fm_lfo_depth); gdouble ags_synth_generator_get_fm_tuning(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_fm_tuning(AgsSynthGenerator *synth_generator, gdouble fm_tuning); AgsTimestamp* ags_synth_generator_get_timestamp(AgsSynthGenerator *synth_generator); void ags_synth_generator_set_timestamp(AgsSynthGenerator *synth_generator, AgsTimestamp *timestamp); void ags_synth_generator_compute(AgsSynthGenerator *synth_generator, GObject *audio_signal, gdouble note); AgsSynthGenerator* ags_synth_generator_new(); G_END_DECLS #endif /*__AGS_SYNTH_GENERATOR_H__*/ gsequencer-3.1.3/ags/plugin/0000755000175000017500000000000013622252255012734 500000000000000gsequencer-3.1.3/ags/plugin/ags_lv2_plugin.c0000644000175000017500000014131113616617253015742 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include //#define _LIBINTL_H #include void ags_lv2_plugin_class_init(AgsLv2PluginClass *lv2_plugin); void ags_lv2_plugin_init (AgsLv2Plugin *lv2_plugin); void ags_lv2_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_plugin_dispose(GObject *gobject); void ags_lv2_plugin_finalize(GObject *gobject); gpointer ags_lv2_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size); void ags_lv2_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void ags_lv2_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_lv2_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_lv2_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void ags_lv2_plugin_load_plugin(AgsBasePlugin *base_plugin); void ags_lv2_plugin_real_change_program(AgsLv2Plugin *lv2_plugin, gpointer ladspa_handle, guint bank_index, guint program_index); /** * SECTION:ags_lv2_plugin * @short_description: The lv2 plugin class * @title: AgsLv2Plugin * @section_id: * @include: ags/plugin/ags_lv2_plugin.h * * The #AgsLv2Plugin loads/unloads a Lv2 plugin. */ enum{ PROP_0, PROP_PNAME, PROP_URI, PROP_UI_URI, PROP_MANIFEST, PROP_TURTLE, PROP_DOAP_NAME, PROP_FOAF_NAME, PROP_FOAF_HOMEPAGE, PROP_FOAF_MBOX, PROP_PRESET, }; enum{ CHANGE_PROGRAM, LAST_SIGNAL, }; static gpointer ags_lv2_plugin_parent_class = NULL; static guint lv2_plugin_signals[LAST_SIGNAL]; GType ags_lv2_plugin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_plugin = 0; static const GTypeInfo ags_lv2_plugin_info = { sizeof (AgsLv2PluginClass), NULL, /* lv2_init */ NULL, /* lv2_finalize */ (GClassInitFunc) ags_lv2_plugin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2Plugin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_plugin_init, }; ags_type_lv2_plugin = g_type_register_static(AGS_TYPE_BASE_PLUGIN, "AgsLv2Plugin", &ags_lv2_plugin_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_plugin); } return g_define_type_id__volatile; } void ags_lv2_plugin_class_init(AgsLv2PluginClass *lv2_plugin) { AgsBasePluginClass *base_plugin; GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_plugin_parent_class = g_type_class_peek_parent(lv2_plugin); /* GObjectClass */ gobject = (GObjectClass *) lv2_plugin; gobject->set_property = ags_lv2_plugin_set_property; gobject->get_property = ags_lv2_plugin_get_property; gobject->dispose = ags_lv2_plugin_dispose; gobject->finalize = ags_lv2_plugin_finalize; /* properties */ /** * AgsLv2Plugin:pname: * * The assigned pname. * * Since: 3.0.0 */ param_spec = g_param_spec_string("pname", i18n_pspec("pname of the plugin"), i18n_pspec("The pname this plugin is associated with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PNAME, param_spec); /** * AgsLv2Plugin:uri: * * The assigned uri. * * Since: 3.0.0 */ param_spec = g_param_spec_string("uri", i18n_pspec("uri of the plugin"), i18n_pspec("The uri this plugin is located in"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URI, param_spec); /** * AgsLv2Plugin:ui-uri: * * The assigned ui-uri. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ui-uri", i18n_pspec("ui-uri of the plugin"), i18n_pspec("The ui-uri this plugin has"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_URI, param_spec); /** * AgsLv2Plugin:manifest: * * The assigned manifest. * * Since: 3.0.0 */ param_spec = g_param_spec_object("manifest", i18n_pspec("manifest of the plugin"), i18n_pspec("The manifest this plugin is located in"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MANIFEST, param_spec); /** * AgsLv2Plugin:turtle: * * The assigned turtle. * * Since: 3.0.0 */ param_spec = g_param_spec_object("turtle", i18n_pspec("turtle of the plugin"), i18n_pspec("The turtle this plugin is located in"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TURTLE, param_spec); /** * AgsLv2Plugin:doap-name: * * The assigned doap name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("doap-name", i18n_pspec("doap name"), i18n_pspec("The doap name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DOAP_NAME, param_spec); /** * AgsLv2Plugin:foaf-name: * * The assigned foaf name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("foaf-name", i18n_pspec("foaf name"), i18n_pspec("The foaf name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FOAF_NAME, param_spec); /** * AgsLv2Plugin:foaf-homepage: * * The assigned foaf homepage. * * Since: 3.0.0 */ param_spec = g_param_spec_string("foaf-homepage", i18n_pspec("foaf homepage"), i18n_pspec("The foaf homepage"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FOAF_HOMEPAGE, param_spec); /** * AgsLv2Plugin:foaf-mbox: * * The assigned foaf mbox. * * Since: 3.0.0 */ param_spec = g_param_spec_string("foaf-mbox", i18n_pspec("foaf mbox"), i18n_pspec("The foaf mbox"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FOAF_MBOX, param_spec); /** * AgsLv2Plugin:preset: (type GList(AgsLv2Preset)) (transfer full) * * The assigned preset. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("preset", i18n_pspec("preset of the plugin"), i18n_pspec("The preset of this plugin"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); /* AgsBasePluginClass */ base_plugin = (AgsBasePluginClass *) lv2_plugin; base_plugin->instantiate = ags_lv2_plugin_instantiate; base_plugin->connect_port = ags_lv2_plugin_connect_port; base_plugin->activate = ags_lv2_plugin_activate; base_plugin->deactivate = ags_lv2_plugin_deactivate; base_plugin->run = ags_lv2_plugin_run; base_plugin->load_plugin = ags_lv2_plugin_load_plugin; /* AgsLv2PluginClass */ lv2_plugin->change_program = ags_lv2_plugin_real_change_program; /** * AgsLv2Plugin::change-program: * @lv2_plugin: the plugin to change-program * @lv2_handle: the Lv2 handle * @bank: the bank number * @program: the program number * * The ::change-program signal creates a new instance of plugin. * * Since: 3.0.0 */ lv2_plugin_signals[CHANGE_PROGRAM] = g_signal_new("change-program", G_TYPE_FROM_CLASS (lv2_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsLv2PluginClass, change_program), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_UINT, G_TYPE_UINT); } void ags_lv2_plugin_init(AgsLv2Plugin *lv2_plugin) { lv2_plugin->flags = 0; lv2_plugin->pname = NULL; lv2_plugin->uri = NULL; lv2_plugin->ui_uri = NULL; lv2_plugin->manifest = NULL; lv2_plugin->turtle = NULL; lv2_plugin->doap_name = NULL; lv2_plugin->foaf_name = NULL; lv2_plugin->foaf_homepage = NULL; lv2_plugin->foaf_mbox = NULL; lv2_plugin->feature = NULL; lv2_plugin->program = NULL; lv2_plugin->preset = NULL; } void ags_lv2_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2Plugin *lv2_plugin; GRecMutex *base_plugin_mutex; lv2_plugin = AGS_LV2_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); switch(prop_id){ case PROP_PNAME: { gchar *pname; pname = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->pname == pname){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->pname != NULL){ g_free(lv2_plugin->pname); } lv2_plugin->pname = g_strdup(pname); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_URI: { gchar *uri; uri = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->uri == uri){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->uri != NULL){ g_free(lv2_plugin->uri); } lv2_plugin->uri = g_strdup(uri); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_URI: { gchar *ui_uri; ui_uri = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->ui_uri == ui_uri){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->ui_uri != NULL){ g_free(lv2_plugin->ui_uri); } lv2_plugin->ui_uri = g_strdup(ui_uri); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_MANIFEST: { AgsTurtle *manifest; manifest = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->manifest == manifest){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->manifest != NULL){ g_object_unref(lv2_plugin->manifest); } if(manifest != NULL){ g_object_ref(manifest); } lv2_plugin->manifest = manifest; g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_TURTLE: { AgsTurtle *turtle; turtle = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->turtle == turtle){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->turtle != NULL){ g_object_unref(lv2_plugin->turtle); } if(turtle != NULL){ g_object_ref(turtle); } lv2_plugin->turtle = turtle; g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_DOAP_NAME: { gchar *doap_name; doap_name = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->doap_name == doap_name){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->doap_name != NULL){ g_free(lv2_plugin->doap_name); } lv2_plugin->doap_name = g_strdup(doap_name); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FOAF_NAME: { gchar *foaf_name; foaf_name = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->foaf_name == foaf_name){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->foaf_name != NULL){ g_free(lv2_plugin->foaf_name); } lv2_plugin->foaf_name = g_strdup(foaf_name); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FOAF_HOMEPAGE: { gchar *foaf_homepage; foaf_homepage = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->foaf_homepage == foaf_homepage){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->foaf_homepage != NULL){ g_free(lv2_plugin->foaf_homepage); } lv2_plugin->foaf_homepage = g_strdup(foaf_homepage); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FOAF_MBOX: { gchar *foaf_mbox; foaf_mbox = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_plugin->foaf_mbox == foaf_mbox){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2_plugin->foaf_mbox != NULL){ g_free(lv2_plugin->foaf_mbox); } lv2_plugin->foaf_mbox = g_strdup(foaf_mbox); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PRESET: { AgsLv2Preset *lv2_preset; lv2_preset = g_value_get_pointer(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2_preset == NULL || g_list_find(lv2_plugin->preset, lv2_preset) != NULL){ g_rec_mutex_unlock(base_plugin_mutex); return; } lv2_plugin->preset = g_list_append(lv2_plugin->preset, lv2_preset); g_object_ref(lv2_preset); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2Plugin *lv2_plugin; GRecMutex *base_plugin_mutex; lv2_plugin = AGS_LV2_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); switch(prop_id){ case PROP_PNAME: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->pname); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_URI: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->uri); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_URI: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->ui_uri); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_MANIFEST: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_object(value, lv2_plugin->manifest); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_TURTLE: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_object(value, lv2_plugin->turtle); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_DOAP_NAME: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->doap_name); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FOAF_NAME: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->foaf_name); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FOAF_HOMEPAGE: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->foaf_homepage); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FOAF_MBOX: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2_plugin->foaf_mbox); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PRESET: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_pointer(value, g_list_copy_deep(lv2_plugin->preset, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_plugin_dispose(GObject *gobject) { AgsLv2Plugin *lv2_plugin; lv2_plugin = AGS_LV2_PLUGIN(gobject); if(lv2_plugin->manifest != NULL){ g_object_unref(lv2_plugin->manifest); lv2_plugin->manifest = NULL; } if(lv2_plugin->turtle != NULL){ g_object_unref(lv2_plugin->turtle); lv2_plugin->turtle = NULL; } if(lv2_plugin->preset != NULL){ g_list_free_full(lv2_plugin->preset, g_object_unref); lv2_plugin->preset = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_plugin_parent_class)->dispose(gobject); } void ags_lv2_plugin_finalize(GObject *gobject) { AgsLv2Plugin *lv2_plugin; lv2_plugin = AGS_LV2_PLUGIN(gobject); g_free(lv2_plugin->uri); g_free(lv2_plugin->ui_uri); if(lv2_plugin->manifest != NULL){ g_object_unref(lv2_plugin->manifest); } if(lv2_plugin->turtle != NULL){ g_object_unref(lv2_plugin->turtle); } if(lv2_plugin->feature != NULL){ guint i; for(i = 0; lv2_plugin->feature[i] != NULL; i++){ free(lv2_plugin->feature[i]->data); free(lv2_plugin->feature[i]); } free(lv2_plugin->feature); } if(lv2_plugin->preset != NULL){ g_list_free_full(lv2_plugin->preset, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_lv2_plugin_parent_class)->finalize(gobject); } gpointer ags_lv2_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size) { AgsLv2Plugin *lv2_plugin; AgsConfig *config; void *plugin_so; LV2_Descriptor_Function lv2_descriptor; LV2_Descriptor *plugin_descriptor; LV2_Handle *lv2_handle; LV2_URI_Map_Feature *uri_map_feature; LV2_Worker_Schedule_Handle worker_handle; LV2_Worker_Schedule *worker_schedule; LV2_Log_Log *log_feature; LV2_Event_Feature *event_feature; LV2_URID_Map *urid_map; LV2_URID_Unmap *urid_unmap; LV2_Options_Interface *options_interface; LV2_Options_Option *options; LV2_Feature **feature; gchar *filename; char *path; gchar *str; float *ptr_samplerate; float *ptr_buffer_size; uint32_t effect_index; guint conf_buffer_size; guint conf_samplerate; double rate; guint total_feature; guint nth; guint i; gboolean initial_call; LV2_Handle (*instantiate)(const struct _LV2_Descriptor * descriptor, double sample_rate, const char *bundle_path, const LV2_Feature *const *features); GRecMutex *base_plugin_mutex; lv2_plugin = AGS_LV2_PLUGIN(base_plugin); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); // xmlSaveFormatFileEnc("-", lv2_plugin->turtle->doc, "UTF-8", 1); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); plugin_so = base_plugin->plugin_so; if(plugin_so == NULL){ gboolean success; g_message("open %s", base_plugin->filename); #ifdef AGS_W32API plugin_so = LoadLibrary(base_plugin->filename); #else plugin_so = dlopen(base_plugin->filename, RTLD_NOW); #endif g_object_set(lv2_plugin, "plugin-so", plugin_so, NULL); success = FALSE; #ifdef AGS_W32API base_plugin->plugin_handle = lv2_descriptor = (LV2_Descriptor_Function) GetProcAddress(plugin_so, "lv2_descriptor"); success = (!lv2_descriptor) ? FALSE: TRUE; #else base_plugin->plugin_handle = lv2_descriptor = (LV2_Descriptor_Function) dlsym(plugin_so, "lv2_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && lv2_descriptor){ for(i = 0; (plugin_descriptor = lv2_descriptor((unsigned long) i)) != NULL; i++){ if(!g_ascii_strcasecmp(plugin_descriptor->URI, lv2_plugin->uri)){ base_plugin->plugin_descriptor = plugin_descriptor; effect_index = i; g_object_set(lv2_plugin, "effect-index", effect_index, NULL); break; } } } } lv2_descriptor = base_plugin->plugin_handle; plugin_descriptor = base_plugin->plugin_descriptor; feature = lv2_plugin->feature; path = g_path_get_dirname(base_plugin->filename); effect_index = base_plugin->effect_index; g_rec_mutex_unlock(base_plugin_mutex); if(plugin_so == NULL){ g_free(path); return(NULL); } /* get some config values */ initial_call = FALSE; config = ags_config_get_instance(); conf_samplerate = ags_soundcard_helper_config_get_samplerate(config); conf_buffer_size = ags_soundcard_helper_config_get_buffer_size(config); worker_handle = NULL; if(feature == NULL){ initial_call = TRUE; /**/ total_feature = 8; nth = 0; feature = (LV2_Feature **) malloc(total_feature * sizeof(LV2_Feature *)); /* URI map feature */ uri_map_feature = (LV2_URI_Map_Feature *) malloc(sizeof(LV2_URI_Map_Feature)); uri_map_feature->callback_data = NULL; uri_map_feature->uri_to_id = ags_lv2_uri_map_manager_uri_to_id; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_URI_MAP_URI; feature[nth]->data = uri_map_feature; nth++; /* worker feature */ if(ags_lv2_plugin_test_flags(lv2_plugin, AGS_LV2_PLUGIN_NEEDS_WORKER)){ worker_handle = ags_lv2_worker_manager_pull_worker(ags_lv2_worker_manager_get_instance()); worker_schedule = (LV2_Worker_Schedule *) malloc(sizeof(LV2_Worker_Schedule)); worker_schedule->handle = worker_handle; worker_schedule->schedule_work = ags_lv2_worker_schedule_work; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_WORKER__schedule; feature[nth]->data = worker_schedule; nth++; } /* log feature */ #if 0 { log_feature = (LV2_Log_Log *) malloc(sizeof(LV2_Log_Log)); log_feature->handle = NULL; log_feature->printf = ags_lv2_log_manager_printf; log_feature->vprintf = ags_lv2_log_manager_vprintf; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_LOG__log; feature[nth]->data = log_feature; nth++; } #endif /* event feature */ event_feature = (LV2_Event_Feature *) malloc(sizeof(LV2_Event_Feature)); event_feature->callback_data = NULL; event_feature->lv2_event_ref = ags_lv2_event_manager_lv2_event_ref; event_feature->lv2_event_unref = ags_lv2_event_manager_lv2_event_unref; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_EVENT_URI; feature[nth]->data = event_feature; nth++; /* URID map feature */ urid_map = (LV2_URID_Map *) malloc(sizeof(LV2_URID_Map)); urid_map->handle = NULL; urid_map->map = ags_lv2_urid_manager_map; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_URID_MAP_URI; feature[nth]->data = urid_map; nth++; /* URID unmap feature */ urid_unmap = (LV2_URID_Unmap *) malloc(sizeof(LV2_URID_Unmap)); urid_unmap->handle = NULL; urid_unmap->unmap = ags_lv2_urid_manager_unmap; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_URID_UNMAP_URI; feature[nth]->data = urid_unmap; nth++; /* Options interface */ options_interface = (LV2_Options_Interface *) malloc(sizeof(LV2_Options_Interface)); options_interface->set = ags_lv2_option_manager_lv2_options_set; options_interface->get = ags_lv2_option_manager_lv2_options_get; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_OPTIONS_URI; feature[nth]->data = options_interface; nth++; /* terminate */ for(; nth < total_feature; nth++){ feature[nth] = NULL; } g_rec_mutex_lock(base_plugin_mutex); lv2_plugin->feature = feature; g_rec_mutex_unlock(base_plugin_mutex); } instantiate = NULL; if(plugin_so != NULL){ gboolean success; success = FALSE; #ifdef AGS_W32API lv2_descriptor = (LV2_Descriptor_Function) GetProcAddress(plugin_so, "lv2_descriptor"); success = (!lv2_descriptor) ? FALSE: TRUE; #else lv2_descriptor = (LV2_Descriptor_Function) dlsym(plugin_so, "lv2_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && lv2_descriptor){ g_rec_mutex_lock(base_plugin_mutex); base_plugin->plugin_descriptor = plugin_descriptor = lv2_descriptor(effect_index); instantiate = plugin_descriptor->instantiate; g_rec_mutex_unlock(base_plugin_mutex); } } /* alloc handle */ lv2_handle = (LV2_Handle *) malloc(sizeof(LV2_Handle)); lv2_handle[0] = NULL; /* instantiate */ rate = (double) samplerate; if(instantiate != NULL){ lv2_handle[0] = instantiate(plugin_descriptor, rate, path, feature); } if(initial_call){ /* some options */ options = (LV2_Options_Option *) malloc(6 * sizeof(LV2_Options_Option)); /* samplerate */ options[0].context = LV2_OPTIONS_INSTANCE; options[0].subject = 0; options[0].key = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_PARAMETERS__sampleRate); ptr_samplerate = (float *) malloc(sizeof(float)); ptr_samplerate[0] = conf_samplerate; options[0].size = sizeof(float); options[0].type = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_ATOM__Float); options[0].value = ptr_samplerate; /* min-block-length */ options[1].context = LV2_OPTIONS_INSTANCE; options[1].subject = 0; options[1].key = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_BUF_SIZE__minBlockLength); ptr_buffer_size = (float *) malloc(sizeof(float)); ptr_buffer_size[0] = conf_buffer_size; options[1].size = sizeof(float); options[1].type = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_ATOM__Int); options[1].value = ptr_buffer_size; /* max-block-length */ options[2].context = LV2_OPTIONS_INSTANCE; options[2].subject = 0; options[2].key = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_BUF_SIZE__maxBlockLength); ptr_buffer_size = (float *) malloc(sizeof(float)); ptr_buffer_size[0] = conf_buffer_size; options[2].size = sizeof(float); options[2].type = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_ATOM__Int); options[2].value = ptr_buffer_size; /* bounded-block-length */ options[3].context = LV2_OPTIONS_INSTANCE; options[3].subject = 0; options[3].key = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_BUF_SIZE__boundedBlockLength); ptr_buffer_size = (float *) malloc(sizeof(float)); ptr_buffer_size[0] = conf_buffer_size; options[3].size = sizeof(float); options[3].type = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_ATOM__Int); options[3].value = ptr_buffer_size; /* fixed-block-length */ options[4].context = LV2_OPTIONS_INSTANCE; options[4].subject = 0; options[4].key = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_BUF_SIZE__fixedBlockLength); ptr_buffer_size = (float *) malloc(sizeof(float)); ptr_buffer_size[0] = conf_buffer_size; options[4].size = sizeof(float); options[4].type = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), LV2_ATOM__Int); options[4].value = ptr_buffer_size; /* instance */ options[5].context = LV2_OPTIONS_INSTANCE; options[5].subject = 0; options[5].key = 0; options[5].size = 0; options[5].type = 0; options[5].value = NULL; /* set options */ ags_lv2_option_manager_lv2_options_set(lv2_handle[0], options); } /* */ if(worker_handle != NULL){ if(plugin_descriptor->extension_data != NULL){ AGS_LV2_WORKER(worker_handle)->worker_interface = plugin_descriptor->extension_data("http://lv2plug.in/ns/ext/worker#interface"); } g_object_set(worker_handle, "handle", lv2_handle[0], NULL); } g_free(path); return(lv2_handle); } void ags_lv2_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location) { void (*connect_port)(LV2_Handle instance, uint32_t port, void *data_location); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); connect_port = AGS_LV2_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->connect_port; g_rec_mutex_unlock(base_plugin_mutex); /* connect port */ connect_port((LV2_Handle) plugin_handle, (uint32_t) port_index, (float *) data_location); } void ags_lv2_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { void (*activate)(LV2_Handle instance); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); activate = AGS_LV2_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->activate; g_rec_mutex_unlock(base_plugin_mutex); /* activate */ if(activate != NULL){ activate((LV2_Handle) plugin_handle); } } void ags_lv2_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { void (*deactivate)(LV2_Handle instance); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); deactivate = AGS_LV2_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->deactivate; g_rec_mutex_unlock(base_plugin_mutex); /* deactivate */ if(deactivate != NULL){ deactivate((LV2_Handle) plugin_handle); } } void ags_lv2_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count) { void (*run)(LV2_Handle instance, uint32_t sample_count); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); run = AGS_LV2_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->run; g_rec_mutex_unlock(base_plugin_mutex); /* run */ run((LV2_Handle) plugin_handle, (uint32_t) frame_count); } void ags_lv2_plugin_load_plugin(AgsBasePlugin *base_plugin) { //NOTE:JK: deprecated } /** * ags_lv2_plugin_test_flags: * @lv2_plugin: the #AgsLv2Plugin * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_plugin_test_flags(AgsLv2Plugin *lv2_plugin, guint flags) { gboolean retval; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2_PLUGIN(lv2_plugin)){ return(FALSE); } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* test flags */ g_rec_mutex_lock(base_plugin_mutex); retval = ((flags & (lv2_plugin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); return(retval); } /** * ags_lv2_plugin_set_flags: * @lv2_plugin: the #AgsLv2Plugin * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_lv2_plugin_set_flags(AgsLv2Plugin *lv2_plugin, guint flags) { GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2_PLUGIN(lv2_plugin)){ return; } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* set flags */ g_rec_mutex_lock(base_plugin_mutex); lv2_plugin->flags |= flags; g_rec_mutex_unlock(base_plugin_mutex); } /** * ags_lv2_plugin_unset_flags: * @lv2_plugin: the #AgsLv2Plugin * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_lv2_plugin_unset_flags(AgsLv2Plugin *lv2_plugin, guint flags) { GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2_PLUGIN(lv2_plugin)){ return; } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* unset flags */ g_rec_mutex_lock(base_plugin_mutex); lv2_plugin->flags &= (~flags); g_rec_mutex_unlock(base_plugin_mutex); } /** * ags_lv2_plugin_event_buffer_alloc: * @buffer_size: the data's buffer size * * Allocate LV2_Event_Buffer struct. * * Returns: (type gpointer) (transfer none): a new allocated LV2_Event_Buffer * * Since: 3.0.0 */ LV2_Event_Buffer* ags_lv2_plugin_event_buffer_alloc(guint buffer_size) { LV2_Event_Buffer *event_buffer; void *data; uint32_t padded_buffer_size; if(buffer_size > G_MAXUINT16){ return(NULL); } if(buffer_size < 8){ padded_buffer_size = 8; }else{ padded_buffer_size = buffer_size; } event_buffer = (LV2_Event_Buffer *) malloc(sizeof(LV2_Event_Buffer)); data = (void *) malloc(sizeof(LV2_Event) + padded_buffer_size * sizeof(uint8_t)); memset(data, 0, sizeof(LV2_Event) + padded_buffer_size * sizeof(uint8_t)); event_buffer->data = data; event_buffer->header_size = sizeof(LV2_Event_Buffer); event_buffer->stamp_type = 0; event_buffer->capacity = padded_buffer_size; event_buffer->event_count = 0; event_buffer->size = 0; return(event_buffer); } /** * ags_lv2_plugin_event_buffer_realloc_data: * @event_buffer: (type gpointer) (transfer none): the LV2_Event_Buffer struct * @buffer_size: the data's buffer size * * Reallocate LV2_Event_Buffer struct's data field. * * Since: 3.0.0 */ void ags_lv2_plugin_event_buffer_realloc_data(LV2_Event_Buffer *event_buffer, guint buffer_size) { void *data; uint32_t padded_buffer_size; if(buffer_size > G_MAXUINT16){ return; } if(buffer_size < 8){ padded_buffer_size = 8; }else{ padded_buffer_size = buffer_size; } data = event_buffer->data; data = (void *) realloc(data, sizeof(LV2_Event) + padded_buffer_size * sizeof(uint8_t)); event_buffer->data = data; } /** * ags_lv2_plugin_event_buffer_concat: * @event_buffer: (type gpointer) (transfer none): the first buffer * @...: %NULL terminated variadict arguments * * Concats the event buffers. * * Returns: (type gpointer) (transfer none): The newly allocated event buffer * * Since: 3.0.0 */ LV2_Event_Buffer* ags_lv2_plugin_event_buffer_concat(LV2_Event_Buffer *event_buffer, ...) { LV2_Event_Buffer *buffer; LV2_Event_Buffer *current; void *offset; va_list ap; guint i; buffer = (LV2_Event_Buffer *) malloc(sizeof(LV2_Event_Buffer)); memcpy(buffer, event_buffer, sizeof(LV2_Event_Buffer)); va_start(ap, event_buffer); i = 1; while(TRUE){ current = va_arg(ap, LV2_Event_Buffer *); if(current == NULL){ break; } buffer = (LV2_Event_Buffer *) realloc(buffer, (i + 1) * sizeof(LV2_Event_Buffer)); offset = buffer; offset += (i * sizeof(LV2_Event_Buffer)); memcpy(offset, current, sizeof(LV2_Event_Buffer)); i++; } va_end(ap); return(buffer); } /** * ags_lv2_plugin_event_buffer_append_midi: * @event_buffer: the event buffer * @buffer_size: the event buffer size * @events: (type gpointer) (transfer none): the events to write * @event_count: the number of events to write * * Append MIDI data to event buffer. * * Returns: %TRUE on success otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_plugin_event_buffer_append_midi(gpointer event_buffer, guint buffer_size, snd_seq_event_t *events, guint event_count) { void *offset; unsigned char midi_buffer[8]; guint padded_buffer_size; guint count; guint i; gboolean success; if(event_buffer == NULL){ return(FALSE); } /* find offset */ offset = AGS_LV2_EVENT_BUFFER(event_buffer)->data; offset += AGS_LV2_EVENT_BUFFER(event_buffer)->size; /* append midi */ success = TRUE; for(i = 0; i < event_count; i++){ if(offset >= (void *) AGS_LV2_EVENT_BUFFER(event_buffer)->data + buffer_size){ return(FALSE); } /* decode midi sequencer event */ count = ags_midi_buffer_util_decode(midi_buffer, &(events[i])); if(count < 8){ padded_buffer_size = 8; }else{ padded_buffer_size = count; } if(AGS_LV2_EVENT_BUFFER(event_buffer)->size + padded_buffer_size >= buffer_size){ return(FALSE); } AGS_LV2_EVENT_BUFFER(event_buffer)->size += (padded_buffer_size + sizeof(LV2_Event)); AGS_LV2_EVENT_BUFFER(event_buffer)->event_count += 1; AGS_LV2_EVENT(offset)->frames = 0; AGS_LV2_EVENT(offset)->subframes = 0; AGS_LV2_EVENT(offset)->type = ags_lv2_uri_map_manager_uri_to_id(NULL, LV2_EVENT_URI, LV2_MIDI__MidiEvent); AGS_LV2_EVENT(offset)->size = count; memcpy(offset + sizeof(LV2_Event), midi_buffer, count * sizeof(unsigned char)); offset += (padded_buffer_size + sizeof(LV2_Event)); } return(success); } /** * ags_lv2_plugin_event_buffer_remove_midi: * @event_buffer: the event buffer * @buffer_size: the event buffer size * @note: the key to remove * * Remove MIDI data from event buffer. * * Returns: %TRUE on success otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_plugin_event_buffer_remove_midi(gpointer event_buffer, guint buffer_size, guint note) { void *offset; guint padded_buffer_size; guint count; guint i; gboolean success; if(event_buffer == NULL){ return(FALSE); } /* find offset */ offset = AGS_LV2_EVENT_BUFFER(event_buffer)->data; /* append midi */ success = FALSE; while(offset < offset + AGS_LV2_EVENT_BUFFER(event_buffer)->size){ if(((unsigned char *) (offset + sizeof(LV2_Event)))[1] == (0x7f & note)){ success = TRUE; break; } count = AGS_LV2_EVENT(offset)->size; if(count < 8){ padded_buffer_size = 8; }else{ padded_buffer_size = count; } offset += (padded_buffer_size + sizeof(LV2_Event)); } if(success){ count = AGS_LV2_EVENT(offset)->size; if(count < 8){ padded_buffer_size = 8; }else{ padded_buffer_size = count; } memmove(offset, offset + (padded_buffer_size + sizeof(LV2_Event)), ((void *) AGS_LV2_EVENT_BUFFER(event_buffer)->data + buffer_size) - (offset + padded_buffer_size + sizeof(LV2_Event))); memset(AGS_LV2_EVENT_BUFFER(event_buffer)->data + buffer_size - (padded_buffer_size + sizeof(LV2_Event)), 0, (padded_buffer_size + sizeof(LV2_Event))); AGS_LV2_EVENT_BUFFER(event_buffer)->size -= (padded_buffer_size + sizeof(LV2_Event)); AGS_LV2_EVENT_BUFFER(event_buffer)->event_count -= 1; } return(success); } /** * ags_lv2_plugin_clear_event_buffer: * @event_buffer: the event buffer * @buffer_size: size of @event_buffer * * Clear the event buffer. * * Since: 3.0.0 */ void ags_lv2_plugin_clear_event_buffer(gpointer event_buffer, guint buffer_size) { void *offset; guint padded_buffer_size; if(event_buffer == NULL){ return; } offset = AGS_LV2_EVENT_BUFFER(event_buffer)->data; if(buffer_size < 8){ padded_buffer_size = 8; }else{ padded_buffer_size = buffer_size; } memset(offset, 0, padded_buffer_size); } /** * ags_lv2_plugin_alloc_atom_sequence: * @sequence_size: the requested size * * Allocates a LV2_Atom_Sequence * * Returns: the new atom sequence * * Since: 3.0.0 */ gpointer ags_lv2_plugin_alloc_atom_sequence(guint sequence_size) { LV2_Atom_Sequence *aseq; LV2_Atom_Event *aev; aseq = (LV2_Atom_Sequence *) malloc(sizeof(LV2_Atom_Sequence) + sequence_size); aseq->atom.size = sizeof(LV2_Atom_Sequence_Body); aseq->atom.type = ags_lv2_urid_manager_map(NULL, LV2_ATOM__Sequence); aseq->body.unit = ags_lv2_urid_manager_map(NULL, LV2_MIDI__MidiEvent); aseq->body.pad = 0; aev = (LV2_Atom_Event*) ((char*) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); aev->body.size = 0; aev->body.type = 0; return(aseq); } /** * ags_lv2_plugin_atom_sequence_append_midi: * @atom_sequence: the atom sequence * @sequence_size: the atom sequence size * @events: (type gpointer) (transfer none): the events to write * @event_count: the number of events to write * * Append MIDI data to atom sequence. * * Returns: %TRUE on success otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_plugin_atom_sequence_append_midi(gpointer atom_sequence, guint sequence_size, snd_seq_event_t *events, guint event_count) { AgsLv2UriMapManager *uri_map_manager; LV2_Atom_Sequence *aseq; LV2_Atom_Event *aev; unsigned char midi_buffer[8]; guint count, size; guint padded_size; guint i; gboolean success; if(atom_sequence == NULL){ return(FALSE); } aseq = (LV2_Atom_Sequence *) atom_sequence; /* find offset */ aev = (LV2_Atom_Event*) ((char*) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); while((void *) aev < atom_sequence + sequence_size){ if(aev->body.size == 0){ break; } size = aev->body.size; aev += ((size + 7) & (~7)); } /* append midi */ success = TRUE; for(i = 0; i < event_count; i++){ if((void *) aev >= atom_sequence + sequence_size){ return(FALSE); } /* decode midi sequencer event */ if((count = ags_midi_buffer_util_decode(midi_buffer, &(events[i]))) <= 8){ aev->time.frames = 0; aev->body.size = count; aev->body.type = ags_lv2_urid_manager_map(NULL, LV2_MIDI__MidiEvent); memcpy(LV2_ATOM_BODY(&(aev->body)), midi_buffer, count * sizeof(char)); aseq->atom.size += ((count + 7) & (~7)); aev += ((count + 7) & (~7)); }else{ success = FALSE; break; } } /* set last empty */ aev->body.size = 0; aev->body.type = 0; return(success); } /** * ags_lv2_plugin_atom_sequence_remove_midi: * @atom_sequence: the atom sequence * @sequence_size: the atom sequence size * @note: the key to remove * * Remove MIDI data from atom sequence. * * Returns: %TRUE on success otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_plugin_atom_sequence_remove_midi(gpointer atom_sequence, guint sequence_size, guint note) { AgsLv2UriMapManager *uri_map_manager; LV2_Atom_Sequence *aseq; LV2_Atom_Event *aev, *current_aev; unsigned char midi_buffer[8]; guint count, size, current_size; guint padded_size; guint i; gboolean success; if(atom_sequence == NULL){ return(FALSE); } aseq = (LV2_Atom_Sequence *) atom_sequence; /* find offset */ aev = (LV2_Atom_Event*) ((char*) LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)); success = FALSE; while((void *) aev < atom_sequence + sequence_size){ if(aev->body.size == 0){ break; } if(((unsigned char *) LV2_ATOM_BODY(&(aev->body)))[1] == (0x7f & note)){ current_aev = aev; current_size = aev->body.size; success = TRUE; break; } size = aev->body.size; aev += ((size + 7) & (~7)); } /* remove midi */ if(success){ /* set empty */ current_aev->body.size = 0; current_aev->body.type = 0; memmove(current_aev, current_aev + ((current_size + 7) & (~7)), (atom_sequence + sequence_size) - (((void *) current_aev) + ((current_size + 7) & (~7)))); memset(atom_sequence + sequence_size - ((current_size + 7) & (~7)), 0, ((current_size + 7) & (~7))); aseq->atom.size -= ((current_size + 7) & (~7)); } return(success); } /** * ags_lv2_plugin_clear_atom_sequence: * @atom_sequence: the atom sequence * @sequence_size: size of @atom_sequence * * Clear the atom sequence. * * Since: 3.0.0 */ void ags_lv2_plugin_clear_atom_sequence(gpointer atom_sequence, guint sequence_size) { if(atom_sequence == NULL){ return; } memset(atom_sequence, 0, sequence_size); } /** * ags_lv2_plugin_find_uri: * @lv2_plugin: (element-type AgsAudio.Lv2Plugin) (transfer none): a #GList-struct containig #AgsLv2Plugin * @uri: the uri to find * * Find uri in @lv2_plugin #GList-struct * * Returns: (element-type AgsAudio.Lv2Plugin) (transfer none): the matching #GList-struct containing #AgsLv2Plugin * * Since: 3.0.0 */ GList* ags_lv2_plugin_find_uri(GList *lv2_plugin, gchar *uri) { gboolean success; GRecMutex *base_plugin_mutex; if(uri == NULL){ return(NULL); } while(lv2_plugin != NULL){ /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin->data); /* check uri */ g_rec_mutex_lock(base_plugin_mutex); success = (AGS_LV2_PLUGIN(lv2_plugin->data)->uri != NULL && !g_ascii_strcasecmp(uri, AGS_LV2_PLUGIN(lv2_plugin->data)->uri)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ return(lv2_plugin); } lv2_plugin = lv2_plugin->next; } return(NULL); } /** * ags_lv2_plugin_find_pname: * @lv2_plugin: (element-type AgsAudio.Lv2Plugin) (transfer none): a #GList-struct containig #AgsLv2Plugin * @pname: the pname to find * * Find pname in @lv2_plugin #GList-struct * * Returns: (element-type AgsAudio.Lv2Plugin) (transfer none): the matching #GList-struct containing #AgsLv2Plugin * * Since: 3.0.0 */ GList* ags_lv2_plugin_find_pname(GList *lv2_plugin, gchar *pname) { gboolean success; GRecMutex *base_plugin_mutex; if(pname == NULL){ return(NULL); } while(lv2_plugin != NULL){ /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin->data); /* check pname */ g_rec_mutex_lock(base_plugin_mutex); success = (AGS_LV2_PLUGIN(lv2_plugin->data)->pname != NULL && !g_ascii_strcasecmp(pname, AGS_LV2_PLUGIN(lv2_plugin->data)->pname)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ return(lv2_plugin); } lv2_plugin = lv2_plugin->next; } return(NULL); } void ags_lv2_plugin_real_change_program(AgsLv2Plugin *lv2_plugin, gpointer lv2_handle, guint bank_index, guint program_index) { LV2_Descriptor *plugin_descriptor; LV2_Programs_Interface *program_interface; plugin_descriptor = AGS_BASE_PLUGIN(lv2_plugin)->plugin_descriptor; if(plugin_descriptor != NULL && plugin_descriptor->extension_data != NULL && (program_interface = plugin_descriptor->extension_data(LV2_PROGRAMS__Interface)) != NULL){ program_interface->select_program(((LV2_Handle *) lv2_handle)[0], (uint32_t) bank_index, (uint32_t) program_index); } } /** * ags_lv2_plugin_change_program: * @lv2_plugin: the #AgsLv2Plugin * @lv2_handle: the lv2 handle * @bank_index: the bank index * @program_index: the program index * * Change program of @lv2_handle. * * Since: 3.0.0 */ void ags_lv2_plugin_change_program(AgsLv2Plugin *lv2_plugin, gpointer lv2_handle, guint bank_index, guint program_index) { g_return_if_fail(AGS_IS_LV2_PLUGIN(lv2_plugin)); g_object_ref(G_OBJECT(lv2_plugin)); g_signal_emit(G_OBJECT(lv2_plugin), lv2_plugin_signals[CHANGE_PROGRAM], 0, lv2_handle, bank_index, program_index); g_object_unref(G_OBJECT(lv2_plugin)); } /** * ags_lv2_plugin_new: * @turtle: the #AgsTurtle * @filename: the plugin .so * @effect: the effect's string representation * @uri: the effect's uri * @effect_index: the effect's index * * Creates an #AgsLv2Plugin * * Returns: a new #AgsLv2Plugin * * Since: 3.0.0 */ AgsLv2Plugin* ags_lv2_plugin_new(AgsTurtle *turtle, gchar *filename, gchar *effect, gchar *uri, guint effect_index) { AgsLv2Plugin *lv2_plugin; lv2_plugin = (AgsLv2Plugin *) g_object_new(AGS_TYPE_LV2_PLUGIN, "turtle", turtle, "filename", filename, "effect", effect, "uri", uri, "effect-index", effect_index, NULL); return(lv2_plugin); } gsequencer-3.1.3/ags/plugin/ags_plugin_stock.h0000644000175000017500000000167613540163167016374 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_STOCK_H__ #define __AGS_PLUGIN_STOCK_H__ #include #include #define AGS_PLUGIN_NAME_VOLUME "ags-volume\0" #endif /*__AGS_PLUGIN_STOCK_H__*/ gsequencer-3.1.3/ags/plugin/ags_plugin_port.c0000644000175000017500000006523013616617253016230 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_plugin_port_class_init(AgsPluginPortClass *plugin_port); void ags_plugin_port_init(AgsPluginPort *plugin_port); void ags_plugin_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_plugin_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_plugin_port_dispose(GObject *gobject); void ags_plugin_port_finalize(GObject *gobject); /** * SECTION:ags_plugin_port * @short_description: The plugin port class * @title: AgsPluginPort * @section_id: * @include: ags/plugin/ags_plugin_port.h * * The #AgsPluginPort describes a plugin's port. For real ports used by the * processing tree please take a look at #AgsPort. */ enum{ PROP_0, PROP_PORT_INDEX, PROP_PORT_NAME, PROP_PORT_SYMBOL, PROP_SCALE_STEPS, PROP_SCALE_POINT, PROP_SCALE_VALUE, PROP_LOWER_VALUE, PROP_UPPER_VALUE, PROP_DEFAULT_VALUE, }; static gpointer ags_plugin_port_parent_class = NULL; GType ags_plugin_port_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_plugin_port = 0; static const GTypeInfo ags_plugin_port_info = { sizeof(AgsPluginPortClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_plugin_port_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPluginPort), 0, /* n_preallocs */ (GInstanceInitFunc) ags_plugin_port_init, }; ags_type_plugin_port = g_type_register_static(G_TYPE_OBJECT, "AgsPluginPort", &ags_plugin_port_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin_port); } return g_define_type_id__volatile; } void ags_plugin_port_class_init(AgsPluginPortClass *plugin_port) { GObjectClass *gobject; GParamSpec *param_spec; ags_plugin_port_parent_class = g_type_class_peek_parent(plugin_port); /* GObjectClass */ gobject = (GObjectClass *) plugin_port; gobject->set_property = ags_plugin_port_set_property; gobject->get_property = ags_plugin_port_get_property; gobject->dispose = ags_plugin_port_dispose; gobject->finalize = ags_plugin_port_finalize; /* properties */ /** * AgsPluginPort:port-index: * * The assigned port-index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("port-index", i18n_pspec("port index of the plugin"), i18n_pspec("The port's index of the plugin"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_INDEX, param_spec); /** * AgsPluginPort:port-name: * * The port's name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("port-name", i18n_pspec("name of the port"), i18n_pspec("The port's name"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_NAME, param_spec); /** * AgsPluginPort:port-symbol: * * The port's symbol. * * Since: 3.0.0 */ param_spec = g_param_spec_string("port-symbol", i18n_pspec("symbol of the port"), i18n_pspec("The port's symbol"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PORT_SYMBOL, param_spec); /** * AgsPluginPort:scale-steps: * * The number of scale steps. * * Since: 3.0.0 */ param_spec = g_param_spec_int("scale-steps", i18n_pspec("port index of the plugin"), i18n_pspec("The port's index of the plugin"), -1, G_MAXINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_STEPS, param_spec); /** * AgsPluginPort:scale-point: * * The scale point string vector. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("scale-point", i18n_pspec("string vector of scale points"), i18n_pspec("The string vector of scale points"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_SCALE_POINT, param_spec); /** * AgsPluginPort:scale-value: * * The scale value array. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("scale-value", i18n_pspec("array of scale values"), i18n_pspec("The array of scale values"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_SCALE_VALUE, param_spec); /** * AgsPluginPort:lower-value: * * The lower value. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("lower-value", i18n_pspec("lower value"), i18n_pspec("The lower value"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER_VALUE, param_spec); /** * AgsPluginPort:upper-value: * * The upper value. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("upper-value", i18n_pspec("upper value"), i18n_pspec("The upper value"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER_VALUE, param_spec); /** * AgsPluginPort:default-value: * * The default value. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("default-value", i18n_pspec("default value"), i18n_pspec("The default value"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_VALUE, param_spec); } void ags_plugin_port_init(AgsPluginPort *plugin_port) { plugin_port->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(plugin_port->obj_mutex)); plugin_port->port_index = 0; plugin_port->port_name = NULL; plugin_port->port_symbol = NULL; plugin_port->scale_steps = -1; plugin_port->scale_point = NULL; plugin_port->scale_value = NULL; plugin_port->lower_value = g_new0(GValue, 1); plugin_port->upper_value = g_new0(GValue, 1); plugin_port->default_value = g_new0(GValue, 1); plugin_port->user_data = NULL; } void ags_plugin_port_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPluginPort *plugin_port; GRecMutex *plugin_port_mutex; plugin_port = AGS_PLUGIN_PORT(gobject); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); switch(prop_id){ case PROP_PORT_INDEX: { g_rec_mutex_lock(plugin_port_mutex); plugin_port->port_index = g_value_get_uint(value); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_PORT_NAME: { gchar *port_name; port_name = g_value_get_string(value); g_rec_mutex_lock(plugin_port_mutex); if(port_name == plugin_port->port_name){ g_rec_mutex_unlock(plugin_port_mutex); return; } plugin_port->port_name = g_strdup(port_name); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_PORT_SYMBOL: { gchar *port_symbol; port_symbol = g_value_get_string(value); g_rec_mutex_lock(plugin_port_mutex); if(port_symbol == plugin_port->port_symbol){ g_rec_mutex_unlock(plugin_port_mutex); return; } plugin_port->port_symbol = g_strdup(port_symbol); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_SCALE_STEPS: { gint scale_steps; guint i; scale_steps = g_value_get_int(value); g_rec_mutex_lock(plugin_port_mutex); if(scale_steps == plugin_port->scale_steps){ g_rec_mutex_unlock(plugin_port_mutex); return; } if(scale_steps > 0){ /* scale point */ if(plugin_port->scale_point == NULL){ plugin_port->scale_point = (gchar **) malloc((scale_steps + 1) * sizeof(gchar *)); }else{ plugin_port->scale_point = (gchar **) realloc(plugin_port->scale_point, (scale_steps + 1) * sizeof(gchar *)); } for(i = scale_steps; i < plugin_port->scale_steps; i++){ plugin_port->scale_point[i] = NULL; } plugin_port->scale_point[scale_steps] = NULL; /* scale value */ if(plugin_port->scale_value == NULL){ plugin_port->scale_value = (gdouble *) malloc(scale_steps * sizeof(gdouble)); }else{ plugin_port->scale_value = (gdouble *) realloc(plugin_port->scale_value, scale_steps * sizeof(gdouble)); } for(i = scale_steps; i < plugin_port->scale_steps; i++){ plugin_port->scale_value[i] = 0.0; } }else{ g_free(plugin_port->scale_point); g_free(plugin_port->scale_value); plugin_port->scale_point = NULL; plugin_port->scale_value = NULL; } plugin_port->scale_steps = scale_steps; g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_LOWER_VALUE: { GValue *lower_value; lower_value = (GValue *) g_value_get_pointer(value); g_rec_mutex_lock(plugin_port_mutex); g_value_copy(plugin_port->lower_value, lower_value); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_UPPER_VALUE: { GValue *upper_value; upper_value = (GValue *) g_value_get_pointer(value); g_rec_mutex_lock(plugin_port_mutex); g_value_copy(plugin_port->upper_value, upper_value); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_DEFAULT_VALUE: { GValue *default_value; default_value = (GValue *) g_value_get_pointer(value); g_rec_mutex_lock(plugin_port_mutex); g_value_copy(plugin_port->default_value, default_value); g_rec_mutex_unlock(plugin_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_plugin_port_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPluginPort *plugin_port; GRecMutex *plugin_port_mutex; plugin_port = AGS_PLUGIN_PORT(gobject); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); switch(prop_id){ case PROP_PORT_INDEX: { g_rec_mutex_lock(plugin_port_mutex); g_value_set_uint(value, plugin_port->port_index); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_PORT_NAME: { g_rec_mutex_lock(plugin_port_mutex); g_value_set_string(value, plugin_port->port_name); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_PORT_SYMBOL: { g_rec_mutex_lock(plugin_port_mutex); g_value_set_string(value, plugin_port->port_symbol); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_SCALE_STEPS: { g_rec_mutex_lock(plugin_port_mutex); g_value_set_int(value, plugin_port->scale_steps); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_SCALE_POINT: { g_rec_mutex_lock(plugin_port_mutex); g_value_set_pointer(value, g_strdupv(plugin_port->scale_point)); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_SCALE_VALUE: { gdouble *scale_value; g_rec_mutex_lock(plugin_port_mutex); scale_value = (gdouble *) malloc(plugin_port->scale_steps * sizeof(gdouble)); memcpy(scale_value, plugin_port->scale_value, plugin_port->scale_steps * sizeof(gdouble)); g_value_set_pointer(value, scale_value); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_LOWER_VALUE: { GValue *lower_value; g_rec_mutex_lock(plugin_port_mutex); lower_value = g_new0(GValue, 1); g_value_init(lower_value, G_VALUE_TYPE(plugin_port->lower_value)); g_value_copy(plugin_port->lower_value, lower_value); g_value_set_pointer(value, lower_value); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_UPPER_VALUE: { GValue *upper_value; g_rec_mutex_lock(plugin_port_mutex); upper_value = g_new0(GValue, 1); g_value_init(upper_value, G_VALUE_TYPE(plugin_port->upper_value)); g_value_copy(plugin_port->upper_value, upper_value); g_value_set_pointer(value, upper_value); g_rec_mutex_unlock(plugin_port_mutex); } break; case PROP_DEFAULT_VALUE: { GValue *default_value; g_rec_mutex_lock(plugin_port_mutex); default_value = g_new0(GValue, 1); g_value_init(default_value, G_VALUE_TYPE(plugin_port->default_value)); g_value_copy(plugin_port->default_value, default_value); g_value_set_pointer(value, default_value); g_rec_mutex_unlock(plugin_port_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_plugin_port_dispose(GObject *gobject) { AgsPluginPort *plugin_port; plugin_port = AGS_PLUGIN_PORT(gobject); /* call parent */ G_OBJECT_CLASS(ags_plugin_port_parent_class)->dispose(gobject); } void ags_plugin_port_finalize(GObject *gobject) { AgsPluginPort *plugin_port; plugin_port = AGS_PLUGIN_PORT(gobject); if(plugin_port->port_name != NULL){ g_free(plugin_port->port_name); } if(plugin_port->port_symbol != NULL){ g_free(plugin_port->port_symbol); } if(plugin_port->scale_point != NULL){ g_free(plugin_port->scale_point); } g_free(plugin_port->lower_value); g_free(plugin_port->upper_value); g_free(plugin_port->default_value); /* call parent */ G_OBJECT_CLASS(ags_plugin_port_parent_class)->finalize(gobject); } /** * ags_plugin_port_get_obj_mutex: * @plugin_port: the #AgsPluginPort * * Get object mutex. * * Returns: the #GRecMutex to lock @plugin_port * * Since: 3.1.0 */ GRecMutex* ags_plugin_port_get_obj_mutex(AgsPluginPort *plugin_port) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } return(AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port)); } /** * ags_plugin_port_test_flags: * @plugin_port: the #AgsPluginPort * @flags: the flags * * Test @flags to be set on @plugin_port. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_plugin_port_test_flags(AgsPluginPort *plugin_port, guint flags) { gboolean retval; GRecMutex *plugin_port_mutex; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(FALSE); } /* get plugin_port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); /* test */ g_rec_mutex_lock(plugin_port_mutex); retval = (flags & (plugin_port->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(plugin_port_mutex); return(retval); } /** * ags_plugin_port_set_flags: * @plugin_port: the #AgsPluginPort * @flags: the flags * * Set @flags on @plugin_port. * * Since: 3.0.0 */ void ags_plugin_port_set_flags(AgsPluginPort *plugin_port, guint flags) { GRecMutex *plugin_port_mutex; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } /* get plugin_port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); /* set */ g_rec_mutex_lock(plugin_port_mutex); plugin_port->flags |= flags; g_rec_mutex_unlock(plugin_port_mutex); } /** * ags_plugin_port_unset_flags: * @plugin_port: the #AgsPluginPort * @flags: the flags * * Unset @flags on @plugin_port. * * Since: 3.0.0 */ void ags_plugin_port_unset_flags(AgsPluginPort *plugin_port, guint flags) { GRecMutex *plugin_port_mutex; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } /* get plugin_port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); /* unset */ g_rec_mutex_lock(plugin_port_mutex); plugin_port->flags &= (~flags); g_rec_mutex_unlock(plugin_port_mutex); } /** * ags_plugin_port_get_port_index: * @plugin_port: the #AgsPluginPort * * Get port index. * * Returns: the port index * * Since: 3.1.0 */ guint ags_plugin_port_get_port_index(AgsPluginPort *plugin_port) { guint port_index; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "port-index", &port_index, NULL); return(port_index); } /** * ags_plugin_port_set_port_index: * @plugin_port: the #AgsPluginPort * @port_index: the port index * * Set port index. * * Since: 3.1.0 */ void ags_plugin_port_set_port_index(AgsPluginPort *plugin_port, guint port_index) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "port-index", port_index, NULL); } /** * ags_plugin_port_get_port_name: * @plugin_port: the #AgsPluginPort * * Get port name. * * Returns: the port name * * Since: 3.1.0 */ gchar* ags_plugin_port_get_port_name(AgsPluginPort *plugin_port) { gchar *port_name; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "port-name", &port_name, NULL); return(port_name); } /** * ags_plugin_port_set_port_name: * @plugin_port: the #AgsPluginPort * @port_name: the port name * * Set port name. * * Since: 3.1.0 */ void ags_plugin_port_set_port_name(AgsPluginPort *plugin_port, gchar *port_name) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "port-name", port_name, NULL); } /** * ags_plugin_port_get_port_symbol: * @plugin_port: the #AgsPluginPort * * Get port symbol. * * Returns: the port symbol * * Since: 3.1.0 */ gchar* ags_plugin_port_get_port_symbol(AgsPluginPort *plugin_port) { gchar *port_symbol; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "port-symbol", &port_symbol, NULL); return(port_symbol); } /** * ags_plugin_port_set_port_symbol: * @plugin_port: the #AgsPluginPort * @port_symbol: the port symbol * * Set port symbol. * * Since: 3.1.0 */ void ags_plugin_port_set_port_symbol(AgsPluginPort *plugin_port, gchar *port_symbol) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "port-symbol", port_symbol, NULL); } /** * ags_plugin_port_get_scale_steps: * @plugin_port: the #AgsPluginPort * * Get scale steps. * * Returns: the scale steps * * Since: 3.1.0 */ gint ags_plugin_port_get_scale_steps(AgsPluginPort *plugin_port) { guint scale_steps; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "scale-steps", &scale_steps, NULL); return(scale_steps); } /** * ags_plugin_port_set_scale_steps: * @plugin_port: the #AgsPluginPort * @scale_steps: the scale steps * * Set scale steps. * * Since: 3.1.0 */ void ags_plugin_port_set_scale_steps(AgsPluginPort *plugin_port, gint scale_steps) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "scale-steps", scale_steps, NULL); } /** * ags_plugin_port_get_scale_point: * @plugin_port: the #AgsPluginPort * * Get scale point. * * Returns: the scale point * * Since: 3.1.0 */ gchar** ags_plugin_port_get_scale_point(AgsPluginPort *plugin_port) { gchar **scale_point; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "scale-point", &scale_point, NULL); return(scale_point); } /** * ags_plugin_port_set_scale_point: * @plugin_port: the #AgsPluginPort * @scale_point: the scale point * * Set scale point. * * Since: 3.1.0 */ void ags_plugin_port_set_scale_point(AgsPluginPort *plugin_port, gchar **scale_point) { GRecMutex *plugin_port_mutex; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); g_rec_mutex_lock(plugin_port_mutex); g_strfreev(plugin_port->scale_point); plugin_port->scale_point = scale_point; g_rec_mutex_unlock(plugin_port_mutex); } /** * ags_plugin_port_get_scale_value: * @plugin_port: the #AgsPluginPort * * Get scale value. * * Returns: the scale value * * Since: 3.1.0 */ gdouble* ags_plugin_port_get_scale_value(AgsPluginPort *plugin_port) { gdouble *scale_value; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "scale-value", &scale_value, NULL); return(scale_value); } /** * ags_plugin_port_set_scale_value: * @plugin_port: the #AgsPluginPort * @scale_value: the scale value * * Set scale value. * * Since: 3.1.0 */ void ags_plugin_port_set_scale_value(AgsPluginPort *plugin_port, gdouble *scale_value) { GRecMutex *plugin_port_mutex; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(plugin_port); g_rec_mutex_lock(plugin_port_mutex); if(plugin_port->scale_value != NULL){ free(plugin_port->scale_value); } plugin_port->scale_value = scale_value; g_rec_mutex_unlock(plugin_port_mutex); } /** * ags_plugin_port_get_lower_value: * @plugin_port: the #AgsPluginPort * * Get lower value. * * Returns: the lower value * * Since: 3.1.0 */ GValue* ags_plugin_port_get_lower_value(AgsPluginPort *plugin_port) { GValue *lower_value; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "lower-value", &lower_value, NULL); return(lower_value); } /** * ags_plugin_port_set_lower_value: * @plugin_port: the #AgsPluginPort * @lower_value: the lower value * * Set lower value. * * Since: 3.1.0 */ void ags_plugin_port_set_lower_value(AgsPluginPort *plugin_port, GValue *lower_value) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "lower-value", lower_value, NULL); } /** * ags_plugin_port_get_upper_value: * @plugin_port: the #AgsPluginPort * * Get upper value. * * Returns: the upper value * * Since: 3.1.0 */ GValue* ags_plugin_port_get_upper_value(AgsPluginPort *plugin_port) { GValue *upper_value; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "upper-value", &upper_value, NULL); return(upper_value); } /** * ags_plugin_port_set_upper_value: * @plugin_port: the #AgsPluginPort * @upper_value: the upper value * * Set upper value. * * Since: 3.1.0 */ void ags_plugin_port_set_upper_value(AgsPluginPort *plugin_port, GValue *upper_value) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "upper-value", upper_value, NULL); } /** * ags_plugin_port_get_default_value: * @plugin_port: the #AgsPluginPort * * Get default value. * * Returns: the default value * * Since: 3.1.0 */ GValue* ags_plugin_port_get_default_value(AgsPluginPort *plugin_port) { GValue *default_value; if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return(NULL); } g_object_get(plugin_port, "default-value", &default_value, NULL); return(default_value); } /** * ags_plugin_port_set_default_value: * @plugin_port: the #AgsPluginPort * @default_value: the default value * * Set default value. * * Since: 3.1.0 */ void ags_plugin_port_set_default_value(AgsPluginPort *plugin_port, GValue *default_value) { if(!AGS_IS_PLUGIN_PORT(plugin_port)){ return; } g_object_set(plugin_port, "default-value", default_value, NULL); } /** * ags_plugin_port_find_symbol: * @plugin_port: (element-type AgsAudio.PluginPort) (transfer none): the #GList-struct containing #AgsPluginPort * @port_symbol: the port symbol * * Find @port_symbol within @plugin_port. * * Returns: (element-type AgsAudio.PluginPort) (transfer none): the matching #GList-struct containing #AgsPluginPort * * Since: 3.0.0 */ GList* ags_plugin_port_find_symbol(GList *plugin_port, gchar *port_symbol) { AgsPluginPort *current_plugin_port; gboolean success; GRecMutex *plugin_port_mutex; if(port_symbol == NULL){ return(NULL); } while(plugin_port != NULL){ current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); /* check port symbol */ g_rec_mutex_lock(plugin_port_mutex); success = (!g_strcmp0(port_symbol, current_plugin_port->port_symbol)) ? TRUE: FALSE; g_rec_mutex_unlock(plugin_port_mutex); if(success){ return(plugin_port); } plugin_port = plugin_port->next; } return(NULL); } /** * ags_plugin_port_find_port_index: * @plugin_port: (element-type AgsAudio.PluginPort) (transfer none): the #GList-struct containing #AgsPluginPort * @port_index: the port index * * Find @port_index within @plugin_port. * * Returns: (element-type AgsAudio.PluginPort) (transfer none): the matching #GList-struct containing #AgsPluginPort * * Since: 3.0.0 */ GList* ags_plugin_port_find_port_index(GList *plugin_port, guint port_index) { AgsPluginPort *current_plugin_port; gboolean success; GRecMutex *plugin_port_mutex; while(plugin_port != NULL){ current_plugin_port = AGS_PLUGIN_PORT(plugin_port->data); /* get plugin port mutex */ plugin_port_mutex = AGS_PLUGIN_PORT_GET_OBJ_MUTEX(current_plugin_port); /* check port symbol */ g_rec_mutex_lock(plugin_port_mutex); success = (port_index == current_plugin_port->port_index) ? TRUE: FALSE; g_rec_mutex_unlock(plugin_port_mutex); if(success){ return(plugin_port); } plugin_port = plugin_port->next; } return(NULL); } /** * ags_plugin_port_new: * * Creates an #AgsPluginPort * * Returns: a new #AgsPluginPort * * Since: 3.0.0 */ AgsPluginPort* ags_plugin_port_new() { AgsPluginPort *plugin_port; plugin_port = (AgsPluginPort *) g_object_new(AGS_TYPE_PLUGIN_PORT, NULL); return(plugin_port); } gsequencer-3.1.3/ags/plugin/ags_lv2_option_manager.c0000644000175000017500000005060113607210263017435 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_lv2_option_manager_class_init(AgsLv2OptionManagerClass *lv2_option_manager); void ags_lv2_option_manager_init(AgsLv2OptionManager *lv2_option_manager); void ags_lv2_option_manager_finalize(GObject *gobject); void ags_lv2_option_manager_real_get_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer options, gpointer retval); void ags_lv2_option_manager_real_set_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer options, gpointer retval); void ags_lv2_option_manager_destroy_data(gpointer data); gboolean ags_lv2_option_ressource_equal(gpointer a, gpointer b); gboolean ags_lv2_option_ressource_finder(gpointer key, gpointer value, gpointer user_data); /** * SECTION:ags_lv2_option_manager * @short_description: option manager * @title: AgsLv2OptionManager * @section_id: * @include: ags/plugin/ags_lv2_option_manager.h * * The #AgsLv2OptionManager gives you access to plugin instances global * configuration. And stores instance related ressources. */ enum{ GET_OPTION, SET_OPTION, LAST_SIGNAL, }; static gpointer ags_lv2_option_manager_parent_class = NULL; static guint lv2_option_manager_signals[LAST_SIGNAL]; AgsLv2OptionManager *ags_lv2_option_manager = NULL; GType ags_lv2_option_manager_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_option_manager = 0; const GTypeInfo ags_lv2_option_manager_info = { sizeof (AgsLv2OptionManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_option_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2OptionManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_option_manager_init, }; ags_type_lv2_option_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2OptionManager", &ags_lv2_option_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_option_manager); } return g_define_type_id__volatile; } void ags_lv2_option_manager_class_init(AgsLv2OptionManagerClass *lv2_option_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_option_manager_parent_class = g_type_class_peek_parent(lv2_option_manager); /* GObject */ gobject = (GObjectClass *) lv2_option_manager; gobject->finalize = ags_lv2_option_manager_finalize; /* AgsLv2OptionManager */ lv2_option_manager->get_option = ags_lv2_option_manager_real_get_option; lv2_option_manager->set_option = ags_lv2_option_manager_real_set_option; /* signals */ /** * AgsLv2OptionManager::get-option: * @lv2_option_manager: the plugin to instantiate * @intstance: the LV2 plugin instance * @option: the LV2 option pointer * @retval: the location of the return value * * The ::get-option signal gets options of the manager. * * Since: 3.0.0 */ lv2_option_manager_signals[GET_OPTION] = g_signal_new("get-option", G_TYPE_FROM_CLASS(lv2_option_manager), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLv2OptionManagerClass, get_option), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); /** * AgsLv2OptionManager::set-option: * @lv2_option_manager: the plugin to instantiate * @intstance: the LV2 plugin instance * @option: the LV2 option pointer * @retval: the location of the return value * * The ::set-option signal sets options for the manager. * * Since: 3.0.0 */ lv2_option_manager_signals[SET_OPTION] = g_signal_new("set-option", G_TYPE_FROM_CLASS(lv2_option_manager), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLv2OptionManagerClass, set_option), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); } void ags_lv2_option_manager_init(AgsLv2OptionManager *lv2_option_manager) { /* lv2 option manager mutex */ g_rec_mutex_init(&(lv2_option_manager->obj_mutex)); lv2_option_manager->ressource = g_hash_table_new_full(g_direct_hash, (GEqualFunc) ags_lv2_option_ressource_equal, NULL, (GDestroyNotify) ags_lv2_option_manager_destroy_data); g_hash_table_ref(lv2_option_manager->ressource); } void ags_lv2_option_manager_finalize(GObject *gobject) { AgsLv2OptionManager *lv2_option_manager; lv2_option_manager = AGS_LV2_OPTION_MANAGER(gobject); g_hash_table_destroy(lv2_option_manager->ressource); if(lv2_option_manager == ags_lv2_option_manager){ ags_lv2_option_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_option_manager_parent_class)->finalize(gobject); } void ags_lv2_option_manager_destroy_data(gpointer data) { /* empty */ } gboolean ags_lv2_option_ressource_equal(gpointer a, gpointer b) { AgsLv2OptionRessource *lv2_option_ressource, *requested_lv2_option_ressource; GRecMutex *lv2_option_manager_mutex; if(a == NULL || b == NULL){ return(FALSE); } lv2_option_ressource = AGS_LV2_OPTION_RESSOURCE(a); requested_lv2_option_ressource = AGS_LV2_OPTION_RESSOURCE(b); if(lv2_option_ressource->instance == requested_lv2_option_ressource->instance && lv2_option_ressource->option != NULL && requested_lv2_option_ressource->option != NULL && lv2_option_ressource->option->subject == requested_lv2_option_ressource->option->subject && lv2_option_ressource->option->key == requested_lv2_option_ressource->option->key){ return(TRUE); } return(FALSE); } gboolean ags_lv2_option_ressource_finder(gpointer key, gpointer value, gpointer user_data) { AgsLv2OptionRessource *lv2_option_ressource, *requested_lv2_option_ressource; LV2_Options_Option *option; lv2_option_ressource = AGS_LV2_OPTION_RESSOURCE(key); requested_lv2_option_ressource = AGS_LV2_OPTION_RESSOURCE(user_data); if(lv2_option_ressource->instance == requested_lv2_option_ressource->instance && lv2_option_ressource->option->subject == requested_lv2_option_ressource->option->subject && lv2_option_ressource->option->key == requested_lv2_option_ressource->option->key){ return(TRUE); } return(FALSE); } /** * ags_lv2_option_ressource_alloc: * * Allocate an #AgsLv2OptionRessource. * * Returns: (type gpointer) (transfer none): the newly created #AgsLv2OptionRessource-struct * * Since: 3.0.0 */ AgsLv2OptionRessource* ags_lv2_option_ressource_alloc() { AgsLv2OptionRessource *lv2_option_ressource; lv2_option_ressource = (AgsLv2OptionRessource *) malloc(sizeof(AgsLv2OptionRessource)); lv2_option_ressource->instance = NULL; lv2_option_ressource->option = (LV2_Options_Option *) malloc(sizeof(LV2_Options_Option)); lv2_option_ressource->option->context = 0; lv2_option_ressource->option->subject = 0; lv2_option_ressource->option->key = 0; lv2_option_ressource->option->size = 0; lv2_option_ressource->option->type = 0; lv2_option_ressource->option->value = NULL; return(lv2_option_ressource); } /** * ags_lv2_option_manager_ressource_insert: * @lv2_option_manager: the #AgsLv2OptionManager * @lv2_option_ressource: (type gpointer) (transfer none): the #AgsLv2OptionRessource-struct as key * @data: the data * * Inserts a data into hash associated with @lv2_option_ressource. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_option_manager_ressource_insert(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource, gpointer data) { GRecMutex *lv2_option_manager_mutex; if(!AGS_IS_LV2_OPTION_MANAGER(lv2_option_manager) || lv2_option_ressource == NULL || data == NULL){ return(FALSE); } /* get lv2 option manager mutex */ lv2_option_manager_mutex = AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX(lv2_option_manager); /* */ g_rec_mutex_lock(lv2_option_manager_mutex); g_hash_table_insert(lv2_option_manager->ressource, (gpointer) lv2_option_ressource, data); g_rec_mutex_unlock(lv2_option_manager_mutex); return(TRUE); } /** * ags_lv2_option_manager_ressource_remove: * @lv2_option_manager: the #AgsLv2OptionManager * @lv2_option_ressource: (type gpointer) (transfer none): the struct to remove * * Removes an entry associated with @lv2_option_ressource. * * Returns: %TRUE as successfully removed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_option_manager_ressource_remove(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource) { gpointer data; GRecMutex *lv2_option_manager_mutex; if(!AGS_IS_LV2_OPTION_MANAGER(lv2_option_manager) || lv2_option_ressource == NULL){ return(FALSE); } /* get lv2 option manager mutex */ lv2_option_manager_mutex = AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX(lv2_option_manager); /* */ g_rec_mutex_lock(lv2_option_manager_mutex); g_hash_table_remove(lv2_option_manager->ressource, lv2_option_ressource); g_rec_mutex_unlock(lv2_option_manager_mutex); return(TRUE); } /** * ags_lv2_option_manager_ressource_lookup: * @lv2_option_manager: the #AgsLv2OptionManager * @lv2_option_ressource: (type gpointer) (transfer none): the #AgsLv2OptionRessource to lookup * * Lookup a ressource associated with @lv2_option_ressource in * @lv2_option_manager. * * Returns: the pointer on success, else NULL * * Since: 3.0.0 */ gpointer ags_lv2_option_manager_ressource_lookup(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource) { GList *key, *key_start; gpointer data, tmp; GRecMutex *lv2_option_manager_mutex; if(!AGS_IS_LV2_OPTION_MANAGER(lv2_option_manager) || lv2_option_ressource == NULL){ return(NULL); } /* get lv2 option manager mutex */ lv2_option_manager_mutex = AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX(lv2_option_manager); /* */ g_rec_mutex_lock(lv2_option_manager_mutex); key_start = key = g_hash_table_get_keys(lv2_option_manager->ressource); data = NULL; while(key != NULL){ tmp = (gpointer) g_hash_table_lookup(lv2_option_manager->ressource, key->data); if(ags_lv2_option_ressource_equal(lv2_option_ressource, key->data)){ data = tmp; break; } key = key->next; } g_list_free(key_start); g_rec_mutex_unlock(lv2_option_manager_mutex); return(data); } /** * ags_lv2_option_manager_ressource_lookup_extended: * @lv2_option_manager: the #AgsLv2OptionManager * @lv2_option_ressource: the #AgsLv2OptionRessource to lookup * @orig_key: the original key found * @value: the matched value * * Lookup a ressource associated with @lv2_option_ressource in * @lv2_option_manager. * * Returns: %TRUE if ressource found, else %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_option_manager_ressource_lookup_extended(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource, gpointer *orig_key, gpointer *value) { GList *key, *key_start; gpointer data, tmp; GRecMutex *lv2_option_manager_mutex; if(orig_key != NULL){ *orig_key = NULL; } if(value != NULL){ *value = NULL; } if(!AGS_IS_LV2_OPTION_MANAGER(lv2_option_manager) || lv2_option_ressource == NULL){ return(FALSE); } /* get lv2 option manager mutex */ lv2_option_manager_mutex = AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX(lv2_option_manager); /* */ g_rec_mutex_lock(lv2_option_manager_mutex); key_start = key = g_hash_table_get_keys(lv2_option_manager->ressource); data = NULL; while(key != NULL){ tmp = (gpointer) g_hash_table_lookup(lv2_option_manager->ressource, key->data); if(ags_lv2_option_ressource_equal(lv2_option_ressource, key->data)){ data = tmp; break; } key = key->next; } if(orig_key != NULL && key != NULL){ *orig_key = key->data; } if(value != NULL && data != NULL){ *value = data; } g_list_free(key_start); g_rec_mutex_unlock(lv2_option_manager_mutex); return(((data != NULL) ? TRUE: FALSE)); } void ags_lv2_option_manager_real_get_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval) { AgsLv2OptionRessource *lookup_ressource; gpointer data; gpointer key_ptr, value_ptr; uint32_t *ret; /* initial set to success */ ret = (uint32_t *) retval; if(ret != NULL){ *ret = 0; } /* check option to be non NULL */ if(option == NULL){ if(ret != NULL){ *ret |= (LV2_OPTIONS_ERR_BAD_SUBJECT | LV2_OPTIONS_ERR_BAD_KEY); } return; } /* get option */ if(AGS_LV2_OPTIONS_OPTION(option)->context == LV2_OPTIONS_RESOURCE){ key_ptr = NULL; value_ptr = NULL; lookup_ressource = (AgsLv2OptionRessource *) malloc(sizeof(AgsLv2OptionRessource)); lookup_ressource->instance = (LV2_Handle) instance; lookup_ressource->option = (LV2_Options_Option *) option; if(ags_lv2_option_manager_ressource_lookup_extended(lv2_option_manager, lookup_ressource, &key_ptr, &value_ptr)){ /* set requested fields */ AGS_LV2_OPTIONS_OPTION(option)->type = AGS_LV2_OPTION_RESSOURCE(key_ptr)->option->type; AGS_LV2_OPTIONS_OPTION(option)->size = AGS_LV2_OPTION_RESSOURCE(key_ptr)->option->size; AGS_LV2_OPTIONS_OPTION(option)->value = value_ptr; }else{ /* do error reporting */ if(ret != NULL){ *ret |= (LV2_OPTIONS_ERR_BAD_SUBJECT | LV2_OPTIONS_ERR_BAD_KEY); } } free(lookup_ressource); } } /** * ags_lv2_option_manager_get_option: * @lv2_option_manager: the #AgsLv2OptionManager * @instance: the instance * @option: the option * @retval: return value for #LV2_Options_Status-enum * * Get option. * * Since: 3.0.0 */ void ags_lv2_option_manager_get_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval) { g_return_if_fail(AGS_IS_LV2_OPTION_MANAGER(lv2_option_manager)); g_object_ref(G_OBJECT(lv2_option_manager)); g_signal_emit(G_OBJECT(lv2_option_manager), lv2_option_manager_signals[GET_OPTION], 0, instance, option, retval); g_object_unref(G_OBJECT(lv2_option_manager)); } void ags_lv2_option_manager_real_set_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval) { AgsLv2OptionRessource *lookup_ressource; gpointer data; gpointer key_ptr, value_ptr; uint32_t *ret; /* initial set to success */ ret = (uint32_t *) retval; if(ret != NULL){ *ret = 0; } /* check option to be non NULL */ if(option == NULL){ *ret |= (LV2_OPTIONS_ERR_BAD_SUBJECT | LV2_OPTIONS_ERR_BAD_KEY); return; } /* set option */ if(AGS_LV2_OPTIONS_OPTION(option)->context == LV2_OPTIONS_RESOURCE){ key_ptr = NULL; value_ptr = NULL; lookup_ressource = (AgsLv2OptionRessource *) malloc(sizeof(AgsLv2OptionRessource)); lookup_ressource->instance = (LV2_Handle) instance; lookup_ressource->option = (LV2_Options_Option *) option; if(ags_lv2_option_manager_ressource_lookup_extended(lv2_option_manager, lookup_ressource, &key_ptr, &value_ptr)){ /* set fields */ AGS_LV2_OPTION_RESSOURCE(key_ptr)->option->type = AGS_LV2_OPTIONS_OPTION(option)->type; AGS_LV2_OPTION_RESSOURCE(key_ptr)->option->size = AGS_LV2_OPTIONS_OPTION(option)->size; AGS_LV2_OPTION_RESSOURCE(key_ptr)->option->value = AGS_LV2_OPTIONS_OPTION(option)->value; }else{ AgsLv2OptionRessource *lv2_option_ressource; /* allocate new */ lv2_option_ressource = ags_lv2_option_ressource_alloc(); /* set fields */ lv2_option_ressource->instance = instance; lv2_option_ressource->option->context = AGS_LV2_OPTIONS_OPTION(option)->context; lv2_option_ressource->option->subject = AGS_LV2_OPTIONS_OPTION(option)->subject; lv2_option_ressource->option->key = AGS_LV2_OPTIONS_OPTION(option)->key; lv2_option_ressource->option->type = AGS_LV2_OPTIONS_OPTION(option)->type; lv2_option_ressource->option->size = AGS_LV2_OPTIONS_OPTION(option)->size; lv2_option_ressource->option->value = AGS_LV2_OPTIONS_OPTION(option)->value; ags_lv2_option_manager_ressource_insert(lv2_option_manager, lv2_option_ressource, (gpointer) AGS_LV2_OPTIONS_OPTION(option)->value); } free(lookup_ressource); } } /** * ags_lv2_option_manager_set_option: * @lv2_option_manager: the #AgsLv2OptionManager * @instance: the instance * @option: the option * @retval: return value for #LV2_Options_Status-enum * * Set option. * * Since: 3.0.0 */ void ags_lv2_option_manager_set_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval) { g_return_if_fail(AGS_IS_LV2_OPTION_MANAGER(lv2_option_manager)); g_object_ref(G_OBJECT(lv2_option_manager)); g_signal_emit(G_OBJECT(lv2_option_manager), lv2_option_manager_signals[SET_OPTION], 0, instance, option, retval); g_object_unref(G_OBJECT(lv2_option_manager)); } /** * ags_lv2_option_manager_lv2_options_get: * @instance: the lv2 instance * @options: the LV2_Options * * The LV2 options interface's get method. * * Since: 3.0.0 */ uint32_t ags_lv2_option_manager_lv2_options_get(LV2_Handle instance, LV2_Options_Option *options) { guint retval, tmpval; guint i; if(options == NULL){ return(LV2_OPTIONS_ERR_BAD_SUBJECT | LV2_OPTIONS_ERR_BAD_KEY); } retval = 0; for(i = 0; ; i++){ if(options[i].subject == 0 && options[i].key == 0 && options[i].type == 0 && options[i].size == 0 && options[i].value == NULL){ break; } ags_lv2_option_manager_get_option(ags_lv2_option_manager_get_instance(), instance, &(options[i]), &tmpval); retval |= tmpval; } return(retval); } /** * ags_lv2_option_manager_lv2_options_set: * @instance: the lv2 instance * @options: the LV2_Options * * The LV2 options interface's set method. * * Since: 3.0.0 */ uint32_t ags_lv2_option_manager_lv2_options_set(LV2_Handle instance, LV2_Options_Option* options) { guint retval, tmpval; guint i; if(options == NULL){ return(LV2_OPTIONS_ERR_BAD_SUBJECT | LV2_OPTIONS_ERR_BAD_KEY); } retval = 0; for(i = 0; ; i++){ if(options[i].subject == 0 && options[i].key == 0 && options[i].type == 0 && options[i].size == 0 && options[i].value == NULL){ break; } ags_lv2_option_manager_set_option(ags_lv2_option_manager_get_instance(), instance, &(options[i]), &tmpval); retval |= tmpval; } return(retval); } /** * ags_lv2_option_manager_get_instance: * * Singleton function to optain the id manager instance. * * Returns: (transfer none): an instance of #AgsLv2OptionManager * * Since: 3.0.0 */ AgsLv2OptionManager* ags_lv2_option_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2_option_manager == NULL){ ags_lv2_option_manager = ags_lv2_option_manager_new(); // ags_lv2_option_manager_load_default(ags_lv2_option_manager); } g_mutex_unlock(&mutex); return(ags_lv2_option_manager); } /** * ags_lv2_option_manager_new: * * Instantiate a id manager. * * Returns: a new #AgsLv2OptionManager * * Since: 3.0.0 */ AgsLv2OptionManager* ags_lv2_option_manager_new() { AgsLv2OptionManager *lv2_option_manager; lv2_option_manager = (AgsLv2OptionManager *) g_object_new(AGS_TYPE_LV2_OPTION_MANAGER, NULL); return(lv2_option_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2_turtle_parser.h0000644000175000017500000000471213607210263017335 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_TURTLE_PARSER_H__ #define __AGS_LV2_TURTLE_PARSER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_TURTLE_PARSER (ags_lv2_turtle_parser_get_type()) #define AGS_LV2_TURTLE_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_TURTLE_PARSER, AgsLv2TurtleParser)) #define AGS_LV2_TURTLE_PARSER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_TURTLE_PARSER, AgsLv2TurtleParserClass)) #define AGS_IS_LV2_TURTLE_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_TURTLE_PARSER)) #define AGS_IS_LV2_TURTLE_PARSER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_TURTLE_PARSER)) #define AGS_LV2_TURTLE_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_TURTLE_PARSER, AgsLv2TurtleParserClass)) #define AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX(obj) (&(((AgsLv2TurtleParser *) obj)->obj_mutex)) typedef struct _AgsLv2TurtleParser AgsLv2TurtleParser; typedef struct _AgsLv2TurtleParserClass AgsLv2TurtleParserClass; struct _AgsLv2TurtleParser { GObject gobject; guint flags; GRecMutex obj_mutex; GList *turtle; GList *plugin; GList *ui_plugin; GList *preset; }; struct _AgsLv2TurtleParserClass { GObjectClass gobject; }; GType ags_lv2_turtle_parser_get_type(void); void ags_lv2_turtle_parser_parse_names(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle **turtle, guint n_turtle); void ags_lv2_turtle_parser_parse(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle **turtle, guint n_turtle); AgsLv2TurtleParser* ags_lv2_turtle_parser_new(AgsTurtle *manifest); G_END_DECLS #endif /*__AGS_LV2_TURTLE_PARSER_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_manager.c0000644000175000017500000004657613607210263016065 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include #include void ags_lv2_manager_class_init(AgsLv2ManagerClass *lv2_manager); void ags_lv2_manager_init (AgsLv2Manager *lv2_manager); void ags_lv2_manager_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_manager_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_manager_dispose(GObject *gobject); void ags_lv2_manager_finalize(GObject *gobject); /** * SECTION:ags_lv2_manager * @short_description: Singleton pattern to organize LV2 * @title: AgsLv2Manager * @section_id: * @include: ags/plugin/ags_lv2_manager.h * * The #AgsLv2Manager loads/unloads LV2 plugins. */ enum{ PROP_0, PROP_LOCALE, }; static gpointer ags_lv2_manager_parent_class = NULL; AgsLv2Manager *ags_lv2_manager = NULL; gchar **ags_lv2_default_path = NULL; static gboolean ags_lv2_manager_global_parse_names = TRUE; static gboolean ags_lv2_manager_global_preserve_turtle = TRUE; GType ags_lv2_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_manager = 0; static const GTypeInfo ags_lv2_manager_info = { sizeof (AgsLv2ManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2Manager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_manager_init, }; ags_type_lv2_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2Manager", &ags_lv2_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_manager); } return g_define_type_id__volatile; } void ags_lv2_manager_class_init(AgsLv2ManagerClass *lv2_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_manager_parent_class = g_type_class_peek_parent(lv2_manager); /* GObjectClass */ gobject = (GObjectClass *) lv2_manager; gobject->set_property = ags_lv2_manager_set_property; gobject->get_property = ags_lv2_manager_get_property; gobject->dispose = ags_lv2_manager_dispose; gobject->finalize = ags_lv2_manager_finalize; /* properties */ /** * AgsLv2Manager:locale: * * The assigned locale. * * Since: 3.0.0 */ param_spec = g_param_spec_string("locale", "locale of lv2 manager", "The locale this lv2 manager is assigned to", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOCALE, param_spec); } void ags_lv2_manager_init(AgsLv2Manager *lv2_manager) { /* lv2 manager mutex */ g_mutex_init(&(lv2_manager->obj_mutex)); /* initialize lv2 plugin blacklist */ lv2_manager->lv2_plugin_blacklist = NULL; /* initialize lv2 plugin GList */ lv2_manager->lv2_plugin = NULL; /* current plugin node */ lv2_manager->current_plugin_node = NULL; /* initiliaze ags_lv2_default_path string vector */ if(ags_lv2_default_path == NULL){ gchar *lv2_env; if((lv2_env = getenv("LV2_PATH")) != NULL){ gchar *iter, *next; guint i; ags_lv2_default_path = (gchar **) malloc(sizeof(gchar *)); iter = lv2_env; i = 0; while((next = strchr(iter, G_SEARCHPATH_SEPARATOR)) != NULL){ ags_lv2_default_path = (gchar **) realloc(ags_lv2_default_path, (i + 2) * sizeof(gchar *)); ags_lv2_default_path[i] = g_strndup(iter, next - iter); iter = next + 1; i++; } if(*iter != '\0'){ ags_lv2_default_path = (gchar **) realloc(ags_lv2_default_path, (i + 2) * sizeof(gchar *)); ags_lv2_default_path[i] = g_strdup(iter); i++; } ags_lv2_default_path[i] = NULL; }else{ #if defined(AGS_W32API) AgsApplicationContext *application_context; gchar *app_dir; gchar *path; guint i; i = 0; application_context = ags_application_context_get_instance(); app_dir = NULL; if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } ags_lv2_default_path = (gchar **) malloc(2 * sizeof(gchar *)); path = g_strdup_printf("%s\\lv2", g_get_current_dir()); if(g_file_test(path, G_FILE_TEST_IS_DIR)){ ags_lv2_default_path[i++] = path; }else{ g_free(path); if(g_path_is_absolute(app_dir)){ ags_lv2_default_path[i++] = g_strdup_printf("%s\\lv2", app_dir); }else{ ags_lv2_default_path[i++] = g_strdup_printf("%s\\%s\\lv2", g_get_current_dir(), app_dir); } } ags_lv2_default_path[i++] = NULL; g_free(app_dir); #else gchar *home_dir; guint i; #ifdef __APPLE__ if((home_dir = getenv("HOME")) != NULL){ ags_lv2_default_path = (gchar **) malloc(5 * sizeof(gchar *)); }else{ ags_lv2_default_path = (gchar **) malloc(4 * sizeof(gchar *)); } i = 0; ags_lv2_default_path[i++] = g_strdup("/Library/Audio/Plug-Ins/LV2"); ags_lv2_default_path[i++] = g_strdup("/usr/lib/lv2"); ags_lv2_default_path[i++] = g_strdup("/usr/local/lib/lv2"); if(home_dir != NULL){ ags_lv2_default_path[i++] = g_strdup_printf("%s/Library/Audio/Plug-Ins/LV2", home_dir); } ags_lv2_default_path[i++] = NULL; #else if((home_dir = getenv("HOME")) != NULL){ ags_lv2_default_path = (gchar **) malloc(6 * sizeof(gchar *)); }else{ ags_lv2_default_path = (gchar **) malloc(5 * sizeof(gchar *)); } i = 0; ags_lv2_default_path[i++] = g_strdup("/usr/lib64/lv2"); ags_lv2_default_path[i++] = g_strdup("/usr/local/lib64/lv2"); ags_lv2_default_path[i++] = g_strdup("/usr/lib/lv2"); ags_lv2_default_path[i++] = g_strdup("/usr/local/lib/lv2"); if(home_dir != NULL){ ags_lv2_default_path[i++] = g_strdup_printf("%s/.lv2", home_dir); } ags_lv2_default_path[i++] = NULL; #endif #endif } } } void ags_lv2_manager_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2Manager *lv2_manager; lv2_manager = AGS_LV2_MANAGER(gobject); switch(prop_id){ case PROP_LOCALE: { gchar *locale; locale = (gchar *) g_value_get_string(value); if(lv2_manager->locale == locale){ return; } if(lv2_manager->locale != NULL){ g_free(lv2_manager->locale); } lv2_manager->locale = g_strdup(locale); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_manager_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2Manager *lv2_manager; lv2_manager = AGS_LV2_MANAGER(gobject); switch(prop_id){ case PROP_LOCALE: { g_value_set_string(value, lv2_manager->locale); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_manager_dispose(GObject *gobject) { AgsLv2Manager *lv2_manager; lv2_manager = AGS_LV2_MANAGER(gobject); if(lv2_manager->lv2_plugin != NULL){ g_list_free_full(lv2_manager->lv2_plugin, g_object_unref); lv2_manager->lv2_plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_manager_parent_class)->dispose(gobject); } void ags_lv2_manager_finalize(GObject *gobject) { AgsLv2Manager *lv2_manager; GList *lv2_plugin; lv2_manager = AGS_LV2_MANAGER(gobject); lv2_plugin = lv2_manager->lv2_plugin; g_list_free_full(lv2_plugin, g_object_unref); if(lv2_manager == ags_lv2_manager){ ags_lv2_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_manager_parent_class)->finalize(gobject); } /** * ags_lv2_manager_global_get_parse_names: * * Get global config value parse names. * * Returns: if %TRUE parse only names, else not * * Since: 3.0.0 */ gboolean ags_lv2_manager_global_get_parse_names() { gboolean parse_names; // g_rec_mutex_lock(ags_lv2_manager_get_class_mutex()); parse_names = ags_lv2_manager_global_parse_names; // g_rec_mutex_unlock(ags_lv2_manager_get_class_mutex()); return(parse_names); } /** * ags_lv2_manager_global_get_preserve_turtle: * * Get global config value preserve turtle. * * Returns: if %TRUE preserve turtles, else not * * Since: 3.0.0 */ gboolean ags_lv2_manager_global_get_preserve_turtle() { gboolean preserve_turtle; // g_rec_mutex_lock(ags_lv2_manager_get_class_mutex()); preserve_turtle = ags_lv2_manager_global_preserve_turtle; // g_rec_mutex_unlock(ags_lv2_manager_get_class_mutex()); return(preserve_turtle); } /** * ags_lv2_manager_get_default_path: * * Get lv2 manager default plugin path. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer none): the plugin default search path as a string vector * * Since: 3.0.0 */ gchar** ags_lv2_manager_get_default_path() { return(ags_lv2_default_path); } /** * ags_lv2_manager_set_default_path: * @default_path: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector array to use as default path * * Set lv2 manager default plugin path. * * Since: 3.0.0 */ void ags_lv2_manager_set_default_path(gchar** default_path) { ags_lv2_default_path = default_path; } /** * ags_lv2_manager_get_filenames: * @lv2_manager: the #AgsLv2Manager * * Retrieve all filenames * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL-terminated array of filenames * * Since: 3.0.0 */ gchar** ags_lv2_manager_get_filenames(AgsLv2Manager *lv2_manager) { GList *start_lv2_plugin, *lv2_plugin; gchar **filenames; guint i; gboolean contains_filename; GRecMutex *lv2_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2_MANAGER(lv2_manager)){ return(NULL); } /* get lv2 manager mutex */ lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager); /* collect */ g_rec_mutex_lock(lv2_manager_mutex); lv2_plugin = start_lv2_plugin = g_list_copy(lv2_manager->lv2_plugin); g_rec_mutex_unlock(lv2_manager_mutex); filenames = NULL; for(i = 0; lv2_plugin != NULL;){ gchar *filename; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin->data); /* duplicate filename */ g_rec_mutex_lock(base_plugin_mutex); filename = g_strdup(AGS_BASE_PLUGIN(lv2_plugin->data)->filename); g_rec_mutex_unlock(base_plugin_mutex); if(filename == NULL){ lv2_plugin = lv2_plugin->next; continue; } if(filenames == NULL){ filenames = (gchar **) malloc(2 * sizeof(gchar *)); filenames[i] = filename; filenames[i + 1] = NULL; i++; }else{ #ifdef HAVE_GLIB_2_44 contains_filename = g_strv_contains(filenames, filename); #else contains_filename = ags_strv_contains(filenames, filename); #endif if(!contains_filename){ filenames = (gchar **) realloc(filenames, (i + 2) * sizeof(gchar *)); filenames[i] = filename; filenames[i + 1] = NULL; i++; }else{ g_free(filename); } } lv2_plugin = lv2_plugin->next; } g_list_free(start_lv2_plugin); return(filenames); } /** * ags_lv2_manager_find_lv2_plugin: * @lv2_manager: the #AgsLv2Manager * @filename: the filename of the plugin * @effect: the effect's name * * Lookup filename in loaded plugins. * * Returns: (transfer none): the #AgsLv2Plugin * * Since: 3.0.0 */ AgsLv2Plugin* ags_lv2_manager_find_lv2_plugin(AgsLv2Manager *lv2_manager, gchar *filename, gchar *effect) { AgsLv2Plugin *lv2_plugin; GList *start_list, *list; gboolean success; GRecMutex *lv2_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2_MANAGER(lv2_manager) || filename == NULL || effect == NULL){ return(NULL); } /* get lv2 manager mutex */ lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager); /* collect */ g_rec_mutex_lock(lv2_manager_mutex); list = start_list = g_list_copy(lv2_manager->lv2_plugin); g_rec_mutex_unlock(lv2_manager_mutex); success = FALSE; while(list != NULL){ lv2_plugin = AGS_LV2_PLUGIN(list->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2_plugin); /* check filename and effect */ g_rec_mutex_lock(base_plugin_mutex); success = (AGS_BASE_PLUGIN(lv2_plugin)->filename != NULL && AGS_BASE_PLUGIN(lv2_plugin)->effect != NULL && !g_strcmp0(AGS_BASE_PLUGIN(lv2_plugin)->filename, filename) && !g_strcmp0(AGS_BASE_PLUGIN(lv2_plugin)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ break; } list = list->next; } g_list_free(start_list); if(!success){ lv2_plugin = NULL; } return(lv2_plugin); } /** * ags_lv2_manager_load_blacklist: * @lv2_manager: the #AgsLv2Manager * @blacklist_filename: the filename as string * * Load blacklisted plugin filenames. * * Since: 3.0.0 */ void ags_lv2_manager_load_blacklist(AgsLv2Manager *lv2_manager, gchar *blacklist_filename) { GRecMutex *lv2_manager_mutex; if(!AGS_IS_LV2_MANAGER(lv2_manager) || blacklist_filename == NULL){ return; } /* get lv2 manager mutex */ lv2_manager_mutex = AGS_LV2_MANAGER_GET_OBJ_MUTEX(lv2_manager); /* fill in */ g_rec_mutex_lock(lv2_manager_mutex); if(g_file_test(blacklist_filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ FILE *file; gchar *str; file = fopen(blacklist_filename, "r"); #ifndef AGS_W32API while(getline(&str, NULL, file) != -1){ lv2_manager->lv2_plugin_blacklist = g_list_prepend(lv2_manager->lv2_plugin_blacklist, str); } #endif } g_rec_mutex_unlock(lv2_manager_mutex); } /** * ags_lv2_manager_load_file: * @lv2_manager: the #AgsLv2Manager * @manifest: the manifest * @turtle: the loaded turtle * @lv2_path: the lv2 path * @filename: the filename of the plugin * * Load @filename specified plugin. * * Since: 3.0.0 */ void ags_lv2_manager_load_file(AgsLv2Manager *lv2_manager, AgsTurtle *manifest, AgsTurtle *turtle, gchar *lv2_path, gchar *filename) { } /** * ags_lv2_manager_load_preset: * @lv2_manager: the #AgsLv2Manager * @lv2_plugin: the #AgsLv2Plugin * @preset: the #AgsTurtle * * Load preset. * * Since: 3.0.0 */ void ags_lv2_manager_load_preset(AgsLv2Manager *lv2_manager, AgsLv2Plugin *lv2_plugin, AgsTurtle *preset) { } /** * ags_lv2_manager_load_default_directory: * @lv2_manager: the #AgsLv2Manager * * Loads all available plugins. * * Since: 3.0.0 */ void ags_lv2_manager_load_default_directory(AgsLv2Manager *lv2_manager) { AgsTurtleManager *turtle_manager; GDir *dir; GList *start_list, *list; gchar **lv2_path; gchar *path, *plugin_path; gchar *str; GError *error; if(!AGS_IS_LV2_MANAGER(lv2_manager)){ return; } turtle_manager = ags_turtle_manager_get_instance(); xmlInitParser(); lv2_path = ags_lv2_default_path; while(*lv2_path != NULL){ if(!g_file_test(*lv2_path, G_FILE_TEST_EXISTS)){ lv2_path++; continue; } error = NULL; dir = g_dir_open(*lv2_path, 0, &error); if(error != NULL){ g_warning("%s", error->message); lv2_path++; g_error_free(error); continue; } while((path = g_dir_read_name(dir)) != NULL){ if(!g_ascii_strncasecmp(path, "..", 3) || !g_ascii_strncasecmp(path, ".", 2)){ continue; } plugin_path = g_strdup_printf("%s%c%s", *lv2_path, G_DIR_SEPARATOR, path); if(g_file_test(plugin_path, G_FILE_TEST_IS_DIR)){ AgsLv2TurtleParser *lv2_turtle_parser; AgsTurtle *manifest; AgsTurtle **turtle; gchar *manifest_filename; guint n_turtle; manifest_filename = g_strdup_printf("%s%c%s", plugin_path, G_DIR_SEPARATOR, "manifest.ttl"); if(!g_file_test(manifest_filename, G_FILE_TEST_EXISTS)){ g_free(manifest_filename); continue; } g_message("new turtle [Manifest] - %s", manifest_filename); manifest = ags_turtle_new(manifest_filename); ags_turtle_load(manifest, NULL); ags_turtle_manager_add(turtle_manager, (GObject *) manifest); lv2_turtle_parser = ags_lv2_turtle_parser_new(manifest); n_turtle = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; if(!ags_lv2_manager_global_get_preserve_turtle()){ ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); g_object_get(lv2_turtle_parser, "turtle", &start_list, NULL); list = start_list; while(list != NULL){ turtle_manager->turtle = g_list_remove(turtle_manager->turtle, list->data); g_object_unref(list->data); list = list->next; } g_list_free_full(start_list, g_object_unref); }else{ if(!ags_lv2_manager_global_get_parse_names()){ ags_lv2_turtle_parser_parse(lv2_turtle_parser, turtle, n_turtle); }else{ ags_lv2_turtle_parser_parse_names(lv2_turtle_parser, turtle, n_turtle); } } g_object_run_dispose(lv2_turtle_parser); g_object_unref(lv2_turtle_parser); g_object_unref(manifest); g_free(manifest_filename); free(turtle); } } lv2_path++; } } /** * ags_lv2_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsLv2Manager * * Since: 3.0.0 */ AgsLv2Manager* ags_lv2_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2_manager == NULL){ ags_lv2_manager = ags_lv2_manager_new(AGS_LV2_MANAGER_DEFAULT_LOCALE); } g_mutex_unlock(&mutex); return(ags_lv2_manager); } /** * ags_lv2_manager_new: * @locale: the default locale * * Create a new instance of #AgsLv2Manager * * Returns: the new #AgsLv2Manager * * Since: 3.0.0 */ AgsLv2Manager* ags_lv2_manager_new(gchar *locale) { AgsLv2Manager *lv2_manager; lv2_manager = (AgsLv2Manager *) g_object_new(AGS_TYPE_LV2_MANAGER, "locale", locale, NULL); return(lv2_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2_plugin.h0000644000175000017500000001263613607210263015744 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_PLUGIN_H__ #define __AGS_LV2_PLUGIN_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_PLUGIN (ags_lv2_plugin_get_type()) #define AGS_LV2_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_PLUGIN, AgsLv2Plugin)) #define AGS_LV2_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_PLUGIN, AgsLv2PluginClass)) #define AGS_IS_LV2_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_PLUGIN)) #define AGS_IS_LV2_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_PLUGIN)) #define AGS_LV2_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_PLUGIN, AgsLv2PluginClass)) #define AGS_LV2_PLUGIN_DESCRIPTOR(ptr) ((LV2_Descriptor *)(ptr)) #define AGS_LV2_EVENT_BUFFER(ptr) ((LV2_Event_Buffer *)(ptr)) #define AGS_LV2_EVENT(ptr) ((LV2_Event *)(ptr)) #define AGS_LV2_EVENT_DATA(ptr) ((void *)(ptr + sizeof(LV2_Event))) #define AGS_LV2_ATOM_SEQUENCE(ptr) ((LV2_Atom_Sequence *)(ptr)) #define AGS_LV2_ATOM_EVENT(ptr) ((LV2_Atom_Event *)(ptr)) typedef struct _AgsLv2Plugin AgsLv2Plugin; typedef struct _AgsLv2PluginClass AgsLv2PluginClass; /** * AgsLv2PluginFlags: * @AGS_LV2_PLUGIN_IS_SYNTHESIZER: plugin is synthesizer * @AGS_LV2_PLUGIN_NEEDS_WORKER: plugin needs worker * @AGS_LV2_PLUGIN_HAS_PROGRAM_INTERFACE: plugin has program interface * * Enum values to control the behavior or indicate internal state of #AgsLv2Plugin by * enable/disable as flags. */ typedef enum{ AGS_LV2_PLUGIN_IS_SYNTHESIZER = 1, AGS_LV2_PLUGIN_NEEDS_WORKER = 1 << 1, AGS_LV2_PLUGIN_HAS_PROGRAM_INTERFACE = 1 << 2, }AgsLv2PluginFlags; struct _AgsLv2Plugin { AgsBasePlugin base_plugin; guint flags; gchar *pname; gchar *uri; gchar *ui_uri; AgsTurtle *manifest; AgsTurtle *turtle; gchar *doap_name; gchar *foaf_name; gchar *foaf_homepage; gchar *foaf_mbox; LV2_Feature **feature; gchar *program; GList *preset; }; struct _AgsLv2PluginClass { AgsBasePluginClass base_plugin; void (*change_program)(AgsLv2Plugin *lv2_plugin, gpointer lv2_handle, guint bank_index, guint program_index); }; GType ags_lv2_plugin_get_type(void); gboolean ags_lv2_plugin_test_flags(AgsLv2Plugin *lv2_plugin, guint flags); void ags_lv2_plugin_set_flags(AgsLv2Plugin *lv2_plugin, guint flags); void ags_lv2_plugin_unset_flags(AgsLv2Plugin *lv2_plugin, guint flags); LV2_Event_Buffer* ags_lv2_plugin_event_buffer_alloc(guint buffer_size); void ags_lv2_plugin_event_buffer_realloc_data(LV2_Event_Buffer *event_buffer, guint buffer_size); LV2_Event_Buffer* ags_lv2_plugin_event_buffer_concat(LV2_Event_Buffer *event_buffer, ...); gboolean ags_lv2_plugin_event_buffer_append_midi(gpointer event_buffer, guint buffer_size, snd_seq_event_t *events, guint event_count); gboolean ags_lv2_plugin_event_buffer_remove_midi(gpointer event_buffer, guint buffer_size, guint note); void ags_lv2_plugin_clear_event_buffer(gpointer event_buffer, guint buffer_size); gpointer ags_lv2_plugin_alloc_atom_sequence(guint sequence_size); gboolean ags_lv2_plugin_atom_sequence_append_midi(gpointer atom_sequence, guint sequence_size, snd_seq_event_t *events, guint event_count); gboolean ags_lv2_plugin_atom_sequence_remove_midi(gpointer atom_sequence, guint sequence_size, guint note); void ags_lv2_plugin_clear_atom_sequence(gpointer atom_sequence, guint sequence_size); GList* ags_lv2_plugin_find_uri(GList *lv2_plugin, gchar *uri); GList* ags_lv2_plugin_find_pname(GList *lv2_plugin, gchar *pname); void ags_lv2_plugin_change_program(AgsLv2Plugin *lv2_plugin, gpointer lv2_handle, guint bank_index, guint program_index); AgsLv2Plugin* ags_lv2_plugin_new(AgsTurtle *turtle, gchar *filename, gchar *effect, gchar *uri, guint effect_index); G_END_DECLS #endif /*__AGS_LV2_PLUGIN_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_worker_manager.h0000644000175000017500000000462513607210263017450 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_WORKER_MANAGER_H__ #define __AGS_LV2_WORKER_MANAGER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_WORKER_MANAGER (ags_lv2_worker_manager_get_type()) #define AGS_LV2_WORKER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_WORKER_MANAGER, AgsLv2WorkerManager)) #define AGS_LV2_WORKER_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_WORKER_MANAGER, AgsLv2WorkerManagerClass)) #define AGS_IS_LV2_WORKER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_WORKER_MANAGER)) #define AGS_IS_LV2_WORKER_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_WORKER_MANAGER)) #define AGS_LV2_WORKER_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_WORKER_MANAGER, AgsLv2WorkerManagerClass)) #define AGS_LV2_WORKER_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLv2WorkerManager *) obj)->obj_mutex)) typedef struct _AgsLv2WorkerManager AgsLv2WorkerManager; typedef struct _AgsLv2WorkerManagerClass AgsLv2WorkerManagerClass; struct _AgsLv2WorkerManager { GObject gobject; GRecMutex obj_mutex; AgsThreadPool *thread_pool; volatile GList *worker; }; struct _AgsLv2WorkerManagerClass { GObjectClass gobject; }; GType ags_lv2_worker_manager_get_type(void); GObject* ags_lv2_worker_manager_pull_worker(AgsLv2WorkerManager *worker_manager); AgsLv2WorkerManager* ags_lv2_worker_manager_get_instance(); AgsLv2WorkerManager* ags_lv2_worker_manager_new(); G_END_DECLS #endif /*__AGS_LV2_WORKER_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_plugin_port.h0000644000175000017500000001272513616617253016236 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_PORT_H__ #define __AGS_PLUGIN_PORT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLUGIN_PORT (ags_plugin_port_get_type()) #define AGS_PLUGIN_PORT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLUGIN_PORT, AgsPluginPort)) #define AGS_PLUGIN_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PLUGIN_PORT, AgsPluginPortClass)) #define AGS_IS_PLUGIN_PORT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PLUGIN_PORT)) #define AGS_IS_PLUGIN_PORT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PLUGIN_PORT)) #define AGS_PLUGIN_PORT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PLUGIN_PORT, AgsPluginPortClass)) #define AGS_PLUGIN_PORT_GET_OBJ_MUTEX(obj) (&(((AgsPluginPort *) obj)->obj_mutex)) typedef struct _AgsPluginPort AgsPluginPort; typedef struct _AgsPluginPortClass AgsPluginPortClass; /** * AgsPluginPortFlags: * @AGS_PLUGIN_PORT_ATOM: atom port * @AGS_PLUGIN_PORT_AUDIO: audio port * @AGS_PLUGIN_PORT_CONTROL: control port * @AGS_PLUGIN_PORT_MIDI: MIDI port * @AGS_PLUGIN_PORT_EVENT: event port * @AGS_PLUGIN_PORT_OUTPUT: is output * @AGS_PLUGIN_PORT_INPUT: is input * @AGS_PLUGIN_PORT_TOGGLED: toggle control * @AGS_PLUGIN_PORT_ENUMERATION: enumerated * @AGS_PLUGIN_PORT_LOGARITHMIC: logarithmic * @AGS_PLUGIN_PORT_INTEGER: integer * @AGS_PLUGIN_PORT_SAMPLERATE: samplerate * @AGS_PLUGIN_PORT_BOUNDED_BELOW: bounded below * @AGS_PLUGIN_PORT_BOUNDED_ABOVE: bounded above * @AGS_PLUGIN_PORT_UI_NOTIFICATION: ui notification * * Common port attributes. */ typedef enum{ AGS_PLUGIN_PORT_ATOM = 1, AGS_PLUGIN_PORT_AUDIO = 1 << 1, AGS_PLUGIN_PORT_CONTROL = 1 << 2, AGS_PLUGIN_PORT_MIDI = 1 << 3, AGS_PLUGIN_PORT_EVENT = 1 << 4, AGS_PLUGIN_PORT_OUTPUT = 1 << 5, AGS_PLUGIN_PORT_INPUT = 1 << 6, AGS_PLUGIN_PORT_TOGGLED = 1 << 7, AGS_PLUGIN_PORT_ENUMERATION = 1 << 8, AGS_PLUGIN_PORT_LOGARITHMIC = 1 << 9, AGS_PLUGIN_PORT_INTEGER = 1 << 10, AGS_PLUGIN_PORT_SAMPLERATE = 1 << 11, AGS_PLUGIN_PORT_BOUNDED_BELOW = 1 << 12, AGS_PLUGIN_PORT_BOUNDED_ABOVE = 1 << 13, AGS_PLUGIN_PORT_UI_NOTIFICATION = 1 << 14, }AgsPluginPortFlags; struct _AgsPluginPort { GObject gobject; guint flags; GRecMutex obj_mutex; guint port_index; gchar *port_name; gchar *port_symbol; gint scale_steps; gchar **scale_point; gdouble *scale_value; GValue *lower_value; GValue *upper_value; GValue *default_value; gpointer user_data; }; struct _AgsPluginPortClass { GObjectClass gobject; }; GType ags_plugin_port_get_type(void); GRecMutex* ags_plugin_port_get_obj_mutex(AgsPluginPort *plugin_port); gboolean ags_plugin_port_test_flags(AgsPluginPort *plugin_port, guint flags); void ags_plugin_port_set_flags(AgsPluginPort *plugin_port, guint flags); void ags_plugin_port_unset_flags(AgsPluginPort *plugin_port, guint flags); guint ags_plugin_port_get_port_index(AgsPluginPort *plugin_port); void ags_plugin_port_set_port_index(AgsPluginPort *plugin_port, guint port_index); gchar* ags_plugin_port_get_port_name(AgsPluginPort *plugin_port); void ags_plugin_port_set_port_name(AgsPluginPort *plugin_port, gchar *port_name); gchar* ags_plugin_port_get_port_symbol(AgsPluginPort *plugin_port); void ags_plugin_port_set_port_symbol(AgsPluginPort *plugin_port, gchar *port_symbol); gint ags_plugin_port_get_scale_steps(AgsPluginPort *plugin_port); void ags_plugin_port_set_scale_steps(AgsPluginPort *plugin_port, gint scale_steps); gchar** ags_plugin_port_get_scale_point(AgsPluginPort *plugin_port); void ags_plugin_port_set_scale_point(AgsPluginPort *plugin_port, gchar **scale_point); gdouble* ags_plugin_port_get_scale_value(AgsPluginPort *plugin_port); void ags_plugin_port_set_scale_value(AgsPluginPort *plugin_port, gdouble *scale_value); GValue* ags_plugin_port_get_lower_value(AgsPluginPort *plugin_port); void ags_plugin_port_set_lower_value(AgsPluginPort *plugin_port, GValue *lower_value); GValue* ags_plugin_port_get_upper_value(AgsPluginPort *plugin_port); void ags_plugin_port_set_upper_value(AgsPluginPort *plugin_port, GValue *upper_value); GValue* ags_plugin_port_get_default_value(AgsPluginPort *plugin_port); void ags_plugin_port_set_default_value(AgsPluginPort *plugin_port, GValue *default_value); GList* ags_plugin_port_find_symbol(GList *plugin_port, gchar *port_symbol); GList* ags_plugin_port_find_port_index(GList *plugin_port, guint port_index); AgsPluginPort* ags_plugin_port_new(); G_END_DECLS #endif /*__AGS_PLUGIN_PORT_H__*/ gsequencer-3.1.3/ags/plugin/ags_dssi_manager.h0000644000175000017500000000531113607210263016307 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DSSI_MANAGER_H__ #define __AGS_DSSI_MANAGER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DSSI_MANAGER (ags_dssi_manager_get_type()) #define AGS_DSSI_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DSSI_MANAGER, AgsDssiManager)) #define AGS_DSSI_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DSSI_MANAGER, AgsDssiManagerClass)) #define AGS_IS_DSSI_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DSSI_MANAGER)) #define AGS_IS_DSSI_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DSSI_MANAGER)) #define AGS_DSSI_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_DSSI_MANAGER, AgsDssiManagerClass)) #define AGS_DSSI_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsDssiManager *) obj)->obj_mutex)) typedef struct _AgsDssiManager AgsDssiManager; typedef struct _AgsDssiManagerClass AgsDssiManagerClass; struct _AgsDssiManager { GObject gobject; GRecMutex obj_mutex; GList *dssi_plugin_blacklist; GList *dssi_plugin; }; struct _AgsDssiManagerClass { GObjectClass gobject; }; GType ags_dssi_manager_get_type(void); gchar** ags_dssi_manager_get_default_path(); void ags_dssi_manager_set_default_path(gchar** default_path); gchar** ags_dssi_manager_get_filenames(AgsDssiManager *dssi_manager); AgsDssiPlugin* ags_dssi_manager_find_dssi_plugin(AgsDssiManager *dssi_manager, gchar *filename, gchar *effect); void ags_dssi_manager_load_blacklist(AgsDssiManager *dssi_manager, gchar *blacklist_filename); void ags_dssi_manager_load_file(AgsDssiManager *dssi_manager, gchar *dssi_path, gchar *filename); void ags_dssi_manager_load_default_directory(AgsDssiManager *dssi_manager); /* */ AgsDssiManager* ags_dssi_manager_get_instance(); AgsDssiManager* ags_dssi_manager_new(); G_END_DECLS #endif /*__AGS_DSSI_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_dssi_manager.c0000644000175000017500000003730313607210263016310 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include #include #include void ags_dssi_manager_class_init(AgsDssiManagerClass *dssi_manager); void ags_dssi_manager_init (AgsDssiManager *dssi_manager); void ags_dssi_manager_dispose(GObject *gobject); void ags_dssi_manager_finalize(GObject *gobject); /** * SECTION:ags_dssi_manager * @short_description: Singleton pattern to organize DSSI * @title: AgsDssiManager * @section_id: * @include: ags/plugin/ags_dssi_manager.h * * The #AgsDssiManager loads/unloads DSSI plugins. */ static gpointer ags_dssi_manager_parent_class = NULL; AgsDssiManager *ags_dssi_manager = NULL; gchar **ags_dssi_default_path = NULL; GType ags_dssi_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_dssi_manager = 0; static const GTypeInfo ags_dssi_manager_info = { sizeof (AgsDssiManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_dssi_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsDssiManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_dssi_manager_init, }; ags_type_dssi_manager = g_type_register_static(G_TYPE_OBJECT, "AgsDssiManager", &ags_dssi_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_dssi_manager); } return g_define_type_id__volatile; } void ags_dssi_manager_class_init(AgsDssiManagerClass *dssi_manager) { GObjectClass *gobject; ags_dssi_manager_parent_class = g_type_class_peek_parent(dssi_manager); /* GObjectClass */ gobject = (GObjectClass *) dssi_manager; gobject->dispose = ags_dssi_manager_dispose; gobject->finalize = ags_dssi_manager_finalize; } void ags_dssi_manager_init(AgsDssiManager *dssi_manager) { /* dssi manager mutex */ g_rec_mutex_init(&(dssi_manager->obj_mutex)); /* dssi plugin and path */ dssi_manager->dssi_plugin = NULL; if(ags_dssi_default_path == NULL){ gchar *dssi_env; if((dssi_env = getenv("DSSI_PATH")) != NULL){ gchar *iter, *next; guint i; ags_dssi_default_path = (gchar **) malloc(sizeof(gchar *)); iter = dssi_env; i = 0; while((next = strchr(iter, G_SEARCHPATH_SEPARATOR)) != NULL){ ags_dssi_default_path = (gchar **) realloc(ags_dssi_default_path, (i + 2) * sizeof(gchar *)); ags_dssi_default_path[i] = g_strndup(iter, next - iter); iter = next + 1; i++; } if(*iter != '\0'){ ags_dssi_default_path = (gchar **) realloc(ags_dssi_default_path, (i + 2) * sizeof(gchar *)); ags_dssi_default_path[i] = g_strdup(iter); i++; } ags_dssi_default_path[i] = NULL; }else{ #if defined(AGS_W32API) AgsApplicationContext *application_context; gchar *app_dir; gchar *path; guint i; i = 0; application_context = ags_application_context_get_instance(); app_dir = NULL; if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } ags_dssi_default_path = (gchar **) malloc(2 * sizeof(gchar *)); path = g_strdup_printf("%s\\dssi", g_get_current_dir()); if(g_file_test(path, G_FILE_TEST_IS_DIR)){ ags_dssi_default_path[i++] = path; }else{ g_free(path); if(g_path_is_absolute(app_dir)){ ags_dssi_default_path[i++] = g_strdup_printf("%s\\dssi", app_dir); }else{ ags_dssi_default_path[i++] = g_strdup_printf("%s\\%s\\dssi", g_get_current_dir(), app_dir); } } ags_dssi_default_path[i++] = NULL; g_free(app_dir); #else gchar *home_dir; guint i; #ifdef AGS_MAC_BUNDLE if((home_dir = getenv("HOME")) != NULL){ ags_dssi_default_path = (gchar **) malloc(7 * sizeof(gchar *)); }else{ ags_dssi_default_path = (gchar **) malloc(6 * sizeof(gchar *)); } #else if((home_dir = getenv("HOME")) != NULL){ ags_dssi_default_path = (gchar **) malloc(6 * sizeof(gchar *)); }else{ ags_dssi_default_path = (gchar **) malloc(5 * sizeof(gchar *)); } #endif i = 0; #ifdef AGS_MAC_BUNDLE ags_dssi_default_path[i++] = g_strdup_printf("%s/dssi", getenv("GSEQUENCER_PLUGIN_DIR")); #endif ags_dssi_default_path[i++] = g_strdup("/usr/lib64/dssi"); ags_dssi_default_path[i++] = g_strdup("/usr/local/lib64/dssi"); ags_dssi_default_path[i++] = g_strdup("/usr/lib/dssi"); ags_dssi_default_path[i++] = g_strdup("/usr/local/lib/dssi"); if(home_dir != NULL){ ags_dssi_default_path[i++] = g_strdup_printf("%s/.dssi", home_dir); } ags_dssi_default_path[i++] = NULL; #endif } } } void ags_dssi_manager_dispose(GObject *gobject) { AgsDssiManager *dssi_manager; dssi_manager = AGS_DSSI_MANAGER(gobject); if(dssi_manager->dssi_plugin != NULL){ g_list_free_full(dssi_manager->dssi_plugin, (GDestroyNotify) g_object_unref); dssi_manager->dssi_plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_dssi_manager_parent_class)->dispose(gobject); } void ags_dssi_manager_finalize(GObject *gobject) { AgsDssiManager *dssi_manager; GList *dssi_plugin; dssi_manager = AGS_DSSI_MANAGER(gobject); dssi_plugin = dssi_manager->dssi_plugin; g_list_free_full(dssi_plugin, (GDestroyNotify) g_object_unref); if(dssi_manager == ags_dssi_manager){ ags_dssi_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_dssi_manager_parent_class)->finalize(gobject); } /** * ags_dssi_manager_get_default_path: * * Get dssi manager default plugin path. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer none): the plugin default search path as a string vector * * Since: 3.0.0 */ gchar** ags_dssi_manager_get_default_path() { return(ags_dssi_default_path); } /** * ags_dssi_manager_set_default_path: * @default_path: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector array to use as default path * * Set dssi manager default plugin path. * * Since: 3.0.0 */ void ags_dssi_manager_set_default_path(gchar** default_path) { ags_dssi_default_path = default_path; } /** * ags_dssi_manager_get_filenames: * @dssi_manager: the #AgsDssiManager * * Retrieve all filenames * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL-terminated array of filenames * * Since: 3.0.0 */ gchar** ags_dssi_manager_get_filenames(AgsDssiManager *dssi_manager) { GList *start_dssi_plugin, *dssi_plugin; gchar **filenames; guint i; gboolean contains_filename; GRecMutex *dssi_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_DSSI_MANAGER(dssi_manager)){ return(NULL); } /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* collect */ g_rec_mutex_lock(dssi_manager_mutex); dssi_plugin = start_dssi_plugin = g_list_copy(dssi_manager->dssi_plugin); g_rec_mutex_unlock(dssi_manager_mutex); filenames = NULL; for(i = 0; dssi_plugin != NULL;){ gchar *filename; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin->data); /* duplicate filename */ g_rec_mutex_lock(base_plugin_mutex); filename = g_strdup(AGS_BASE_PLUGIN(dssi_plugin->data)->filename); g_rec_mutex_unlock(base_plugin_mutex); if(filenames == NULL){ filenames = (gchar **) malloc(2 * sizeof(gchar *)); /* set filename */ filenames[i] = filename; /* terminate */ filenames[i + 1] = NULL; i++; }else{ #ifdef HAVE_GLIB_2_44 contains_filename = g_strv_contains(filenames, filename); #else contains_filename = ags_strv_contains(filenames, filename); #endif if(!contains_filename){ filenames = (gchar **) realloc(filenames, (i + 2) * sizeof(gchar *)); filenames[i] = filename; filenames[i + 1] = NULL; i++; }else{ g_free(filename); } } dssi_plugin = dssi_plugin->next; } g_list_free(start_dssi_plugin); return(filenames); } /** * ags_dssi_manager_find_dssi_plugin: * @dssi_manager: the #AgsDssiManager * @filename: the filename of the plugin * @effect: the effect's name * * Lookup filename in loaded plugins. * * Returns: (transfer none): the matching #AgsDssiPlugin * * Since: 3.0.0 */ AgsDssiPlugin* ags_dssi_manager_find_dssi_plugin(AgsDssiManager *dssi_manager, gchar *filename, gchar *effect) { AgsDssiPlugin *dssi_plugin; GList *start_list, *list; gboolean success; GRecMutex *dssi_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_DSSI_MANAGER(dssi_manager)){ return(NULL); } /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* collect */ g_rec_mutex_lock(dssi_manager_mutex); list = start_list = g_list_copy(dssi_manager->dssi_plugin); g_rec_mutex_unlock(dssi_manager_mutex); success = FALSE; while(list != NULL){ dssi_plugin = AGS_DSSI_PLUGIN(list->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* check filename and effect */ g_rec_mutex_lock(base_plugin_mutex); success = (!g_strcmp0(AGS_BASE_PLUGIN(dssi_plugin)->filename, filename) && !g_strcmp0(AGS_BASE_PLUGIN(dssi_plugin)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ break; } list = list->next; } g_list_free(start_list); if(!success){ dssi_plugin = NULL; } return(dssi_plugin); } /** * ags_dssi_manager_load_blacklist: * @dssi_manager: the #AgsDssiManager * @blacklist_filename: the filename as string * * Load blacklisted plugin filenames. * * Since: 3.0.0 */ void ags_dssi_manager_load_blacklist(AgsDssiManager *dssi_manager, gchar *blacklist_filename) { GRecMutex *dssi_manager_mutex; if(!AGS_DSSI_MANAGER(dssi_manager) || blacklist_filename == NULL){ return; } /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* fill in */ g_rec_mutex_lock(dssi_manager_mutex); if(g_file_test(blacklist_filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ FILE *file; gchar *str; file = fopen(blacklist_filename, "r"); #ifndef AGS_W32API while(getline(&str, NULL, file) != -1){ dssi_manager->dssi_plugin_blacklist = g_list_prepend(dssi_manager->dssi_plugin_blacklist, str); } #endif } g_rec_mutex_unlock(dssi_manager_mutex); } /** * ags_dssi_manager_load_file: * @dssi_manager: the #AgsDssiManager * @dssi_path: the dssi path * @filename: the filename of the plugin * * Load @filename specified plugin. * * Since: 3.0.0 */ void ags_dssi_manager_load_file(AgsDssiManager *dssi_manager, gchar *dssi_path, gchar *filename) { AgsDssiPlugin *dssi_plugin; gchar *path; gchar *effect; void *plugin_so; DSSI_Descriptor_Function dssi_descriptor; DSSI_Descriptor *plugin_descriptor; unsigned long i; gboolean success; GRecMutex *dssi_manager_mutex; if(!AGS_IS_DSSI_MANAGER(dssi_manager) || dssi_path == NULL || filename == NULL){ return; } /* get dssi manager mutex */ dssi_manager_mutex = AGS_DSSI_MANAGER_GET_OBJ_MUTEX(dssi_manager); /* load */ g_rec_mutex_lock(dssi_manager_mutex); path = g_strdup_printf("%s%c%s", dssi_path, G_DIR_SEPARATOR, filename); g_message("ags_dssi_manager.c loading - %s", path); #ifdef AGS_W32API plugin_so = LoadLibrary(path); #else plugin_so = dlopen(path, RTLD_NOW); #endif if(plugin_so == NULL){ g_warning("ags_dssi_manager.c - failed to load static object file"); #ifndef AGS_W32API dlerror(); #endif g_rec_mutex_unlock(dssi_manager_mutex); return; } success = FALSE; #ifdef AGS_W32API dssi_descriptor = (DSSI_Descriptor_Function) GetProcAddress(plugin_so, "dssi_descriptor"); success = (!dssi_descriptor) ? FALSE: TRUE; #else dssi_descriptor = (DSSI_Descriptor_Function) dlsym(plugin_so, "dssi_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && dssi_descriptor){ for(i = 0; (plugin_descriptor = dssi_descriptor(i)) != NULL; i++){ if(ags_base_plugin_find_effect(dssi_manager->dssi_plugin, path, plugin_descriptor->LADSPA_Plugin->Name) == NULL){ dssi_plugin = ags_dssi_plugin_new(path, plugin_descriptor->LADSPA_Plugin->Name, i); ags_base_plugin_load_plugin((AgsBasePlugin *) dssi_plugin); dssi_manager->dssi_plugin = g_list_prepend(dssi_manager->dssi_plugin, dssi_plugin); } } } g_rec_mutex_unlock(dssi_manager_mutex); g_free(path); } /** * ags_dssi_manager_load_default_directory: * @dssi_manager: the #AgsDssiManager * * Loads all available plugins. * * Since: 3.0.0 */ void ags_dssi_manager_load_default_directory(AgsDssiManager *dssi_manager) { AgsDssiPlugin *dssi_plugin; GDir *dir; gchar **dssi_path; gchar *filename; GError *error; if(!AGS_DSSI_MANAGER(dssi_manager)){ return; } dssi_path = ags_dssi_default_path; while(*dssi_path != NULL){ if(!g_file_test(*dssi_path, G_FILE_TEST_EXISTS)){ dssi_path++; continue; } error = NULL; dir = g_dir_open(*dssi_path, 0, &error); if(error != NULL){ g_warning("%s", error->message); dssi_path++; g_error_free(error); continue; } while((filename = g_dir_read_name(dir)) != NULL){ if(g_str_has_suffix(filename, AGS_LIBRARY_SUFFIX) && !g_list_find_custom(dssi_manager->dssi_plugin_blacklist, filename, strcmp)){ ags_dssi_manager_load_file(dssi_manager, *dssi_path, filename); } } dssi_path++; } } /** * ags_dssi_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsDssiManager * * Since: 3.0.0 */ AgsDssiManager* ags_dssi_manager_get_instance() { static GMutex mutex; g_mutex_lock(&(mutex)); if(ags_dssi_manager == NULL){ ags_dssi_manager = ags_dssi_manager_new(); } g_mutex_unlock(&(mutex)); return(ags_dssi_manager); } /** * ags_dssi_manager_new: * * Create a new instance of #AgsDssiManager * * Returns: the new #AgsDssiManager * * Since: 3.0.0 */ AgsDssiManager* ags_dssi_manager_new() { AgsDssiManager *dssi_manager; dssi_manager = (AgsDssiManager *) g_object_new(AGS_TYPE_DSSI_MANAGER, NULL); return(dssi_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2ui_manager.c0000644000175000017500000003717313607210263016414 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include #include #include void ags_lv2ui_manager_class_init(AgsLv2uiManagerClass *lv2ui_manager); void ags_lv2ui_manager_init (AgsLv2uiManager *lv2ui_manager); void ags_lv2ui_manager_dispose(GObject *gobject); void ags_lv2ui_manager_finalize(GObject *gobject); /** * SECTION:ags_lv2ui_manager * @short_description: Singleton pattern to organize LV2UI * @title: AgsLv2uiManager * @section_id: * @include: ags/plugin/ags_lv2ui_manager.h * * The #AgsLv2uiManager loads/unloads LV2UI plugins. */ static gpointer ags_lv2ui_manager_parent_class = NULL; AgsLv2uiManager *ags_lv2ui_manager = NULL; gchar **ags_lv2ui_default_path = NULL; GType ags_lv2ui_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2ui_manager = 0; static const GTypeInfo ags_lv2ui_manager_info = { sizeof (AgsLv2uiManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2ui_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2uiManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2ui_manager_init, }; ags_type_lv2ui_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2uiManager", &ags_lv2ui_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2ui_manager); } return g_define_type_id__volatile; } void ags_lv2ui_manager_class_init(AgsLv2uiManagerClass *lv2ui_manager) { GObjectClass *gobject; ags_lv2ui_manager_parent_class = g_type_class_peek_parent(lv2ui_manager); /* GObjectClass */ gobject = (GObjectClass *) lv2ui_manager; gobject->dispose = ags_lv2ui_manager_dispose; gobject->finalize = ags_lv2ui_manager_finalize; } void ags_lv2ui_manager_init(AgsLv2uiManager *lv2ui_manager) { /* lv2ui manager mutex */ g_rec_mutex_init(&(lv2ui_manager->obj_mutex)); lv2ui_manager->lv2ui_plugin = NULL; if(ags_lv2ui_default_path == NULL){ gchar *lv2ui_env; if((lv2ui_env = getenv("LV2_PATH")) != NULL){ gchar *iter, *next; guint i; ags_lv2ui_default_path = (gchar **) malloc(sizeof(gchar *)); iter = lv2ui_env; i = 0; while((next = strchr(iter, G_SEARCHPATH_SEPARATOR)) != NULL){ ags_lv2ui_default_path = (gchar **) realloc(ags_lv2ui_default_path, (i + 2) * sizeof(gchar *)); ags_lv2ui_default_path[i] = g_strndup(iter, next - iter); iter = next + 1; i++; } if(*iter != '\0'){ ags_lv2ui_default_path = (gchar **) realloc(ags_lv2ui_default_path, (i + 2) * sizeof(gchar *)); ags_lv2ui_default_path[i] = g_strdup(iter); i++; } ags_lv2ui_default_path[i] = NULL; }else{ #if defined(AGS_W32API) AgsApplicationContext *application_context; gchar *app_dir; gchar *path; guint i; i = 0; application_context = ags_application_context_get_instance(); app_dir = NULL; if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } ags_lv2ui_default_path = (gchar **) malloc(2 * sizeof(gchar *)); path = g_strdup_printf("%s\\lv2ui", g_get_current_dir()); if(g_file_test(path, G_FILE_TEST_IS_DIR)){ ags_lv2ui_default_path[i++] = path; }else{ g_free(path); if(g_path_is_absolute(app_dir)){ ags_lv2ui_default_path[i++] = g_strdup_printf("%s\\lv2ui", app_dir); }else{ ags_lv2ui_default_path[i++] = g_strdup_printf("%s\\%s\\lv2ui", g_get_current_dir(), app_dir); } } ags_lv2ui_default_path[i++] = NULL; g_free(app_dir); #else gchar *home_dir; guint i; #ifdef __APPLE__ #ifdef AGS_MAC_BUNDLE if((home_dir = getenv("HOME")) != NULL){ ags_lv2ui_default_path = (gchar **) malloc(6 * sizeof(gchar *)); }else{ ags_lv2ui_default_path = (gchar **) malloc(5 * sizeof(gchar *)); } #else if((home_dir = getenv("HOME")) != NULL){ ags_lv2ui_default_path = (gchar **) malloc(5 * sizeof(gchar *)); }else{ ags_lv2ui_default_path = (gchar **) malloc(4 * sizeof(gchar *)); } #endif i = 0; #ifdef AGS_MAC_BUNDLE ags_lv2ui_default_path[i++] = g_strdup_printf("%s/lv2", getenv("GSEQUENCER_PLUGIN_DIR")); #endif ags_lv2ui_default_path[i++] = g_strdup("/Library/Audio/Plug-Ins/LV2"); ags_lv2ui_default_path[i++] = g_strdup("/usr/lib/lv2"); ags_lv2ui_default_path[i++] = g_strdup("/usr/local/lib/lv2"); if(home_dir != NULL){ ags_lv2ui_default_path[i++] = g_strdup_printf("%s/Library/Audio/Plug-Ins/LV2", home_dir); } ags_lv2ui_default_path[i++] = NULL; #else if((home_dir = getenv("HOME")) != NULL){ ags_lv2ui_default_path = (gchar **) malloc(6 * sizeof(gchar *)); }else{ ags_lv2ui_default_path = (gchar **) malloc(5 * sizeof(gchar *)); } i = 0; ags_lv2ui_default_path[i++] = g_strdup("/usr/lib64/lv2"); ags_lv2ui_default_path[i++] = g_strdup("/usr/local/lib64/lv2"); ags_lv2ui_default_path[i++] = g_strdup("/usr/lib/lv2"); ags_lv2ui_default_path[i++] = g_strdup("/usr/local/lib/lv2"); if(home_dir != NULL){ ags_lv2ui_default_path[i++] = g_strdup_printf("%s/.lv2", home_dir); } ags_lv2ui_default_path[i++] = NULL; #endif #endif } } } void ags_lv2ui_manager_dispose(GObject *gobject) { AgsLv2uiManager *lv2ui_manager; lv2ui_manager = AGS_LV2UI_MANAGER(gobject); if(lv2ui_manager->lv2ui_plugin != NULL){ g_list_free_full(lv2ui_manager->lv2ui_plugin, g_object_unref); lv2ui_manager->lv2ui_plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2ui_manager_parent_class)->dispose(gobject); } void ags_lv2ui_manager_finalize(GObject *gobject) { AgsLv2uiManager *lv2ui_manager; GList *lv2ui_plugin; lv2ui_manager = AGS_LV2UI_MANAGER(gobject); lv2ui_plugin = lv2ui_manager->lv2ui_plugin; g_list_free_full(lv2ui_plugin, g_object_unref); if(lv2ui_manager == ags_lv2ui_manager){ ags_lv2ui_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2ui_manager_parent_class)->finalize(gobject); } /** * ags_lv2ui_manager_get_default_path: * * Get lv2ui manager default plugin path. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer none): the plugin default search path as a string vector * * Since: 3.0.0 */ gchar** ags_lv2ui_manager_get_default_path() { return(ags_lv2ui_default_path); } /** * ags_lv2ui_manager_set_default_path: * @default_path: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector array to use as default path * * Set lv2ui manager default plugin path. * * Since: 3.0.0 */ void ags_lv2ui_manager_set_default_path(gchar** default_path) { ags_lv2ui_default_path = default_path; } /** * ags_lv2ui_manager_get_filenames: * @lv2ui_manager: the #AgsLv2uiManager * * Retrieve all filenames * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL-terminated array of filenames * * Since: 3.0.0 */ gchar** ags_lv2ui_manager_get_filenames(AgsLv2uiManager *lv2ui_manager) { GList *start_lv2ui_plugin, *lv2ui_plugin; gchar **filenames; guint i; gboolean contains_filename; GRecMutex *lv2ui_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2UI_MANAGER(lv2ui_manager)){ return(NULL); } /* get lv2ui manager mutex */ lv2ui_manager_mutex = AGS_LV2UI_MANAGER_GET_OBJ_MUTEX(lv2ui_manager); /* collect */ g_rec_mutex_lock(lv2ui_manager_mutex); lv2ui_plugin = start_lv2ui_plugin = g_list_copy(lv2ui_manager->lv2ui_plugin); g_rec_mutex_unlock(lv2ui_manager_mutex); filenames = NULL; for(i = 0; lv2ui_plugin != NULL;){ gchar *ui_filename; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin->data); /* duplicate filename */ g_rec_mutex_lock(base_plugin_mutex); ui_filename = g_strdup(AGS_BASE_PLUGIN(lv2ui_plugin->data)->ui_filename); g_rec_mutex_unlock(base_plugin_mutex); if(ui_filename == NULL){ lv2ui_plugin = lv2ui_plugin->next; continue; } if(filenames == NULL){ filenames = (gchar **) malloc(2 * sizeof(gchar *)); filenames[i] = ui_filename; filenames[i + 1] = NULL; i++; }else{ #ifdef HAVE_GLIB_2_44 contains_filename = g_strv_contains(filenames, ui_filename); #else contains_filename = ags_strv_contains(filenames, ui_filename); #endif if(!contains_filename){ filenames = (gchar **) realloc(filenames, (i + 2) * sizeof(gchar *)); filenames[i] = ui_filename; filenames[i + 1] = NULL; i++; }else{ g_free(ui_filename); } } lv2ui_plugin = lv2ui_plugin->next; } g_list_free(start_lv2ui_plugin); return(filenames); } /** * ags_lv2ui_manager_find_lv2ui_plugin: * @lv2ui_manager: the #AgsLv2uiManager * @ui_filename: the UI filename of the plugin * @ui_effect: the UI effect's name * * Lookup UI filename in loaded plugins. * * Returns: (transfer none): the #AgsLv2uiPlugin * * Since: 3.0.0 */ AgsLv2uiPlugin* ags_lv2ui_manager_find_lv2ui_plugin(AgsLv2uiManager *lv2ui_manager, gchar *ui_filename, gchar *ui_effect) { AgsLv2uiPlugin *lv2ui_plugin; GList *start_list, *list; gboolean success; GRecMutex *lv2ui_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2UI_MANAGER(lv2ui_manager) || ui_filename == NULL || ui_effect == NULL){ return(NULL); } /* get lv2 manager mutex */ lv2ui_manager_mutex = AGS_LV2UI_MANAGER_GET_OBJ_MUTEX(lv2ui_manager); /* collect */ g_rec_mutex_lock(lv2ui_manager_mutex); list = start_list = g_list_copy(lv2ui_manager->lv2ui_plugin); g_rec_mutex_unlock(lv2ui_manager_mutex); success = FALSE; while(list != NULL){ lv2ui_plugin = AGS_LV2UI_PLUGIN(list->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); /* check filename and effect */ g_rec_mutex_lock(base_plugin_mutex); success = (!g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, ui_filename) && !g_strcmp0(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_effect, ui_effect)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ break; } list = list->next; } g_list_free(start_list); if(!success){ lv2ui_plugin = NULL; } return(lv2ui_plugin); } /** * ags_lv2ui_manager_find_lv2ui_plugin_with_index: * @lv2ui_manager: the #AgsLv2uiManager * @ui_filename: the UI filename of the plugin * @ui_effect_index: the UI index * * Lookup @ui_filename with @ui_effect_index in loaded plugins. * * Returns: (transfer none): the #AgsLv2uiPlugin * * Since: 3.0.0 */ AgsLv2uiPlugin* ags_lv2ui_manager_find_lv2ui_plugin_with_index(AgsLv2uiManager *lv2ui_manager, gchar *ui_filename, guint ui_effect_index) { AgsLv2uiPlugin *lv2ui_plugin; GList *start_list, *list; gboolean success; GRecMutex *lv2ui_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2UI_MANAGER(lv2ui_manager) || ui_filename == NULL){ return(NULL); } /* get lv2 manager mutex */ lv2ui_manager_mutex = AGS_LV2UI_MANAGER_GET_OBJ_MUTEX(lv2ui_manager); /* collect */ g_rec_mutex_lock(lv2ui_manager_mutex); list = start_list = g_list_copy(lv2ui_manager->lv2ui_plugin); g_rec_mutex_unlock(lv2ui_manager_mutex); success = FALSE; while(list != NULL){ lv2ui_plugin = AGS_LV2UI_PLUGIN(list->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); /* check filename and ui effect index */ g_rec_mutex_lock(base_plugin_mutex); if(!g_ascii_strcasecmp(AGS_BASE_PLUGIN(lv2ui_plugin)->ui_filename, ui_filename) && AGS_BASE_PLUGIN(lv2ui_plugin)->ui_effect_index == ui_effect_index){ success = TRUE; } g_rec_mutex_unlock(base_plugin_mutex); if(success){ break; } list = list->next; } g_list_free(start_list); if(!success){ lv2ui_plugin = NULL; } return(lv2ui_plugin); } /** * ags_lv2ui_manager_load_blacklist: * @lv2ui_manager: the #AgsLv2uiManager * @blacklist_filename: the filename as string * * Load blacklisted plugin filenames. * * Since: 3.0.0 */ void ags_lv2ui_manager_load_blacklist(AgsLv2uiManager *lv2ui_manager, gchar *blacklist_filename) { GRecMutex *lv2ui_manager_mutex; if(!AGS_IS_LV2UI_MANAGER(lv2ui_manager) || blacklist_filename == NULL){ return; } /* get lv2 manager mutex */ lv2ui_manager_mutex = AGS_LV2UI_MANAGER_GET_OBJ_MUTEX(lv2ui_manager); /* fill in */ g_rec_mutex_lock(lv2ui_manager_mutex); if(g_file_test(blacklist_filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ FILE *file; gchar *str; file = fopen(blacklist_filename, "r"); #ifndef AGS_W32API while(getline(&str, NULL, file) != -1){ lv2ui_manager->lv2ui_plugin_blacklist = g_list_prepend(lv2ui_manager->lv2ui_plugin_blacklist, str); } #endif } g_rec_mutex_unlock(lv2ui_manager_mutex); } /** * ags_lv2ui_manager_load_file: * @lv2ui_manager: the #AgsLv2uiManager * @manifest: the manifest * @turtle: the #AgsTurtle * @lv2ui_path: the lv2ui path * @filename: the filename of the plugin * * Load @filename specified plugin. * * Since: 3.0.0 */ void ags_lv2ui_manager_load_file(AgsLv2uiManager *lv2ui_manager, AgsTurtle *manifest, AgsTurtle *turtle, gchar *lv2ui_path, gchar *filename) { } /** * ags_lv2ui_manager_load_default_directory: * @lv2ui_manager: the #AgsLv2uiManager * * Loads all available plugins. * * Since: 3.0.0 */ void ags_lv2ui_manager_load_default_directory(AgsLv2uiManager *lv2ui_manager) { } /** * ags_lv2ui_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsLv2uiManager * * Since: 3.0.0 */ AgsLv2uiManager* ags_lv2ui_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2ui_manager == NULL){ ags_lv2ui_manager = ags_lv2ui_manager_new(); } g_mutex_unlock(&mutex); return(ags_lv2ui_manager); } /** * ags_lv2ui_manager_new: * * Creates an #AgsLv2uiManager * * Returns: a new #AgsLv2uiManager * * Since: 3.0.0 */ AgsLv2uiManager* ags_lv2ui_manager_new() { AgsLv2uiManager *lv2ui_manager; lv2ui_manager = (AgsLv2uiManager *) g_object_new(AGS_TYPE_LV2UI_MANAGER, NULL); return(lv2ui_manager); } gsequencer-3.1.3/ags/plugin/ags_ladspa_conversion.c0000644000175000017500000002761313607210263017370 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_ladspa_conversion_class_init(AgsLadspaConversionClass *conversion); void ags_ladspa_conversion_init (AgsLadspaConversion *conversion); void ags_ladspa_conversion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ladspa_conversion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ladspa_conversion_finalize(GObject *gobject); gdouble ags_ladspa_conversion_convert(AgsConversion *conversion, gdouble value, gboolean reverse); /** * SECTION:ags_ladspa_conversion * @short_description: Conversion of values * @title: AgsLadspaConversion * @section_id: * @include: ags/plugin/ags_ladspa_conversion.h * * The #AgsLadspaConversion converts values. */ enum{ PROP_0, PROP_SAMPLERATE, PROP_LOWER, PROP_UPPER, PROP_STEP_COUNT, }; static gpointer ags_ladspa_conversion_parent_class = NULL; GType ags_ladspa_conversion_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ladspa_conversion = 0; static const GTypeInfo ags_ladspa_conversion_info = { sizeof (AgsLadspaConversionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ladspa_conversion_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLadspaConversion), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ladspa_conversion_init, }; ags_type_ladspa_conversion = g_type_register_static(AGS_TYPE_CONVERSION, "AgsLadspaConversion", &ags_ladspa_conversion_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_ladspa_conversion); } return g_define_type_id__volatile; } void ags_ladspa_conversion_class_init(AgsLadspaConversionClass *ladspa_conversion) { AgsConversionClass *conversion; GObjectClass *gobject; GParamSpec *param_spec; ags_ladspa_conversion_parent_class = g_type_class_peek_parent(ladspa_conversion); /* GObjectClass */ gobject = (GObjectClass *) ladspa_conversion; gobject->set_property = ags_ladspa_conversion_set_property; gobject->get_property = ags_ladspa_conversion_get_property; gobject->finalize = ags_ladspa_conversion_finalize; /* properties */ /** * AgsLadspaConversion:samplerate: * * The samplerate to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("samplerate", i18n_pspec("using samplerate"), i18n_pspec("The samplerate to be used"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SAMPLERATE, param_spec); /** * AgsLadspaConversion:lower: * * The lower to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lower", i18n_pspec("using lower"), i18n_pspec("The lower to be used"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER, param_spec); /** * AgsLadspaConversion:upper: * * The upper to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("upper", i18n_pspec("using upper"), i18n_pspec("The upper to be used"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER, param_spec); /** * AgsLadspaConversion:step-count: * * The step count to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("step-count", i18n_pspec("using step count"), i18n_pspec("The step count to be used"), 0.0, G_MAXDOUBLE, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STEP_COUNT, param_spec); /* AgsConversionClass */ conversion = (AgsConversionClass *) ladspa_conversion; conversion->convert = ags_ladspa_conversion_convert; } void ags_ladspa_conversion_init(AgsLadspaConversion *ladspa_conversion) { AgsConfig *config; ladspa_conversion->flags = 0; config = ags_config_get_instance(); ladspa_conversion->samplerate = ags_soundcard_helper_config_get_samplerate(config); ladspa_conversion->lower = AGS_LADSPA_CONVERSION_DEFAULT_LOWER; ladspa_conversion->upper = AGS_LADSPA_CONVERSION_DEFAULT_UPPER; ladspa_conversion->step_count = AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT; } void ags_ladspa_conversion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLadspaConversion *ladspa_conversion; GRecMutex *conversion_mutex; ladspa_conversion = AGS_LADSPA_CONVERSION(gobject); /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(ladspa_conversion); switch(prop_id){ case PROP_SAMPLERATE: { guint samplerate; samplerate = g_value_get_uint(value); g_rec_mutex_lock(conversion_mutex); ladspa_conversion->samplerate = samplerate; g_rec_mutex_unlock(conversion_mutex); } break; case PROP_LOWER: { gdouble lower; lower = g_value_get_double(value); g_rec_mutex_lock(conversion_mutex); ladspa_conversion->lower = lower; g_rec_mutex_unlock(conversion_mutex); } break; case PROP_UPPER: { gdouble upper; upper = g_value_get_double(value); g_rec_mutex_lock(conversion_mutex); ladspa_conversion->upper = upper; g_rec_mutex_unlock(conversion_mutex); } break; case PROP_STEP_COUNT: { gdouble step_count; step_count = g_value_get_double(value); g_rec_mutex_lock(conversion_mutex); ladspa_conversion->step_count = step_count; g_rec_mutex_unlock(conversion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ladspa_conversion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLadspaConversion *ladspa_conversion; GRecMutex *conversion_mutex; ladspa_conversion = AGS_LADSPA_CONVERSION(gobject); /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(ladspa_conversion); switch(prop_id){ case PROP_SAMPLERATE: { g_rec_mutex_lock(conversion_mutex); g_value_set_uint(value, ladspa_conversion->samplerate); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_LOWER: { g_rec_mutex_lock(conversion_mutex); g_value_set_double(value, ladspa_conversion->lower); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_UPPER: { g_rec_mutex_lock(conversion_mutex); g_value_set_double(value, ladspa_conversion->upper); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_STEP_COUNT: { g_rec_mutex_lock(conversion_mutex); g_value_set_double(value, ladspa_conversion->step_count); g_rec_mutex_unlock(conversion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ladspa_conversion_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_ladspa_conversion_parent_class)->finalize(gobject); } /** * ags_ladspa_conversion_test_flags: * @ladspa_conversion: the #AgsLadspaConversion * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_ladspa_conversion_test_flags(AgsLadspaConversion *ladspa_conversion, guint flags) { gboolean retval; GRecMutex *conversion_mutex; if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ return(FALSE); } /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(ladspa_conversion); /* test flags */ g_rec_mutex_lock(conversion_mutex); retval = ((flags & (ladspa_conversion->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(conversion_mutex); return(retval); } /** * ags_ladspa_conversion_set_flags: * @ladspa_conversion: the #AgsLadspaConversion * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_ladspa_conversion_set_flags(AgsLadspaConversion *ladspa_conversion, guint flags) { GRecMutex *conversion_mutex; if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ return; } /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(ladspa_conversion); /* set flags */ g_rec_mutex_lock(conversion_mutex); ladspa_conversion->flags |= flags; g_rec_mutex_unlock(conversion_mutex); } /** * ags_ladspa_conversion_unset_flags: * @ladspa_conversion: the #AgsLadspaConversion * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_ladspa_conversion_unset_flags(AgsLadspaConversion *ladspa_conversion, guint flags) { GRecMutex *conversion_mutex; if(!AGS_IS_LADSPA_CONVERSION(ladspa_conversion)){ return; } /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(ladspa_conversion); /* unset flags */ g_rec_mutex_lock(conversion_mutex); ladspa_conversion->flags &= (~flags); g_rec_mutex_unlock(conversion_mutex); } gdouble ags_ladspa_conversion_convert(AgsConversion *conversion, gdouble x, gboolean reverse) { AgsLadspaConversion *ladspa_conversion; gdouble value, step; gdouble upper, lower, step_count; gdouble retval; ladspa_conversion = AGS_LADSPA_CONVERSION(conversion); retval = x; if(reverse){ if(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE)){ guint samplerate; g_object_get(ladspa_conversion, "samplerate", &samplerate, NULL); retval = x / samplerate; } if(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC)){ g_object_get(ladspa_conversion, "lower", &lower, "upper", &upper, "step_count", &step_count, NULL); value = x; step = retval = (step_count - 1) * log(value / lower) / log(upper / lower); } }else{ if(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_SAMPLERATE)){ guint samplerate; g_object_get(ladspa_conversion, "samplerate", &samplerate, NULL); value = x * samplerate; } if(ags_ladspa_conversion_test_flags(ladspa_conversion, AGS_LADSPA_CONVERSION_LOGARITHMIC)){ g_object_get(ladspa_conversion, "lower", &lower, "upper", &upper, "step_count", &step_count, NULL); step = x; value = retval = lower * pow(upper / lower, step / (step_count - 1)); } } return(retval); } /** * ags_ladspa_conversion_new: * * Create a new instance of #AgsLadspaConversion. * * Returns: the new #AgsLadspaConversion. * * Since: 3.0.0 */ AgsLadspaConversion* ags_ladspa_conversion_new() { AgsLadspaConversion *conversion; conversion = g_object_new(AGS_TYPE_LADSPA_CONVERSION, NULL); return(conversion); } gsequencer-3.1.3/ags/plugin/ags_lv2ui_plugin.c0000644000175000017500000005514113607210263016273 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include #include #include #include void ags_lv2ui_plugin_class_init(AgsLv2uiPluginClass *lv2ui_plugin); void ags_lv2ui_plugin_init (AgsLv2uiPlugin *lv2ui_plugin); void ags_lv2ui_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2ui_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2ui_plugin_dispose(GObject *gobject); void ags_lv2ui_plugin_finalize(GObject *gobject); gpointer ags_lv2ui_plugin_instantiate_with_params(AgsBasePlugin *base_plugin, guint *n_params, gchar ***parameter_name, GValue **value); void ags_lv2ui_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void ags_lv2ui_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_lv2ui_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_lv2ui_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void ags_lv2ui_plugin_load_plugin(AgsBasePlugin *base_plugin); /** * SECTION:ags_lv2ui_plugin * @short_description: The lv2ui plugin class * @title: AgsLv2uiPlugin * @section_id: * @include: ags/plugin/ags_lv2ui_plugin.h * * The #AgsLv2uiPlugin loads/unloads a Lv2ui plugin. */ enum{ PROP_0, PROP_GUI_FILENAME, PROP_GUI_URI, PROP_MANIFEST, PROP_GUI_TURTLE, PROP_LV2_PLUGIN, }; static gpointer ags_lv2ui_plugin_parent_class = NULL; GType ags_lv2ui_plugin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2ui_plugin = 0; static const GTypeInfo ags_lv2ui_plugin_info = { sizeof (AgsLv2uiPluginClass), NULL, /* lv2ui_init */ NULL, /* lv2ui_finalize */ (GClassInitFunc) ags_lv2ui_plugin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2uiPlugin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2ui_plugin_init, }; ags_type_lv2ui_plugin = g_type_register_static(AGS_TYPE_BASE_PLUGIN, "AgsLv2uiPlugin", &ags_lv2ui_plugin_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2ui_plugin); } return g_define_type_id__volatile; } void ags_lv2ui_plugin_class_init(AgsLv2uiPluginClass *lv2ui_plugin) { AgsBasePluginClass *base_plugin; GObjectClass *gobject; GParamSpec *param_spec; ags_lv2ui_plugin_parent_class = g_type_class_peek_parent(lv2ui_plugin); /* GObjectClass */ gobject = (GObjectClass *) lv2ui_plugin; gobject->set_property = ags_lv2ui_plugin_set_property; gobject->get_property = ags_lv2ui_plugin_get_property; gobject->dispose = ags_lv2ui_plugin_dispose; gobject->finalize = ags_lv2ui_plugin_finalize; /* properties */ /** * AgsLv2uiPlugin:gui-uri: * * The assigned GUI URI. * * Since: 3.0.0 */ param_spec = g_param_spec_string("gui-uri", i18n_pspec("GUI URI of the plugin"), i18n_pspec("The GUI URI this plugin is located in"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GUI_URI, param_spec); /** * AgsLv2uiPlugin:manifest: * * The assigned manifest. * * Since: 3.0.0 */ param_spec = g_param_spec_object("manifest", i18n_pspec("manifest of the plugin"), i18n_pspec("The manifest this plugin is located in"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MANIFEST, param_spec); /** * AgsLv2uiPlugin:gui-turtle: * * The assigned GUI turtle. * * Since: 3.0.0 */ param_spec = g_param_spec_object("gui-turtle", i18n_pspec("GUI turtle of the plugin"), i18n_pspec("The GUI turtle this plugin is located in"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_GUI_TURTLE, param_spec); /** * AgsLv2uiPlugin:lv2-plugin: * * The assigned LV2 plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lv2-plugin", i18n_pspec("LV2 plugin of the plugin"), i18n_pspec("The LV2 plugin this plugin is located in"), AGS_TYPE_LV2_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LV2_PLUGIN, param_spec); /* AgsBasePluginClass */ base_plugin = (AgsBasePluginClass *) lv2ui_plugin; base_plugin->instantiate_with_params = ags_lv2ui_plugin_instantiate_with_params; base_plugin->load_plugin = ags_lv2ui_plugin_load_plugin; } void ags_lv2ui_plugin_init(AgsLv2uiPlugin *lv2ui_plugin) { lv2ui_plugin->flags = 0; lv2ui_plugin->gui_uri = NULL; lv2ui_plugin->manifest = NULL; lv2ui_plugin->gui_turtle = NULL; lv2ui_plugin->lv2_plugin = NULL; lv2ui_plugin->feature = NULL; } void ags_lv2ui_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2uiPlugin *lv2ui_plugin; GRecMutex *base_plugin_mutex; lv2ui_plugin = AGS_LV2UI_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); switch(prop_id){ case PROP_GUI_URI: { gchar *gui_uri; gui_uri = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2ui_plugin->gui_uri == gui_uri){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2ui_plugin->gui_uri != NULL){ g_free(lv2ui_plugin->gui_uri); } lv2ui_plugin->gui_uri = g_strdup(gui_uri); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_MANIFEST: { AgsTurtle *manifest; manifest = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2ui_plugin->manifest == manifest){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2ui_plugin->manifest != NULL){ g_object_unref(lv2ui_plugin->manifest); } if(manifest != NULL){ g_object_ref(manifest); } lv2ui_plugin->manifest = manifest; g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_GUI_TURTLE: { AgsTurtle *gui_turtle; gui_turtle = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2ui_plugin->gui_turtle == gui_turtle){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2ui_plugin->gui_turtle != NULL){ g_object_unref(lv2ui_plugin->gui_turtle); } if(gui_turtle != NULL){ g_object_ref(gui_turtle); } lv2ui_plugin->gui_turtle = gui_turtle; g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_LV2_PLUGIN: { GObject *lv2_plugin; lv2_plugin = (GObject *) g_value_get_object(value); g_rec_mutex_lock(base_plugin_mutex); if(lv2ui_plugin->lv2_plugin == lv2_plugin){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(lv2ui_plugin->lv2_plugin != NULL){ g_object_unref(lv2ui_plugin->lv2_plugin); } if(lv2_plugin != NULL){ g_object_ref(lv2_plugin); } lv2ui_plugin->lv2_plugin = lv2_plugin; g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2ui_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2uiPlugin *lv2ui_plugin; GRecMutex *base_plugin_mutex; lv2ui_plugin = AGS_LV2UI_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); switch(prop_id){ case PROP_GUI_URI: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, lv2ui_plugin->gui_uri); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_MANIFEST: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_object(value, lv2ui_plugin->manifest); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_GUI_TURTLE: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_object(value, lv2ui_plugin->gui_turtle); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_LV2_PLUGIN: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_object(value, lv2ui_plugin->lv2_plugin); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2ui_plugin_dispose(GObject *gobject) { AgsLv2uiPlugin *lv2ui_plugin; lv2ui_plugin = AGS_LV2UI_PLUGIN(gobject); if(lv2ui_plugin->manifest != NULL){ g_object_unref(lv2ui_plugin->manifest); lv2ui_plugin->manifest = NULL; } if(lv2ui_plugin->gui_turtle != NULL){ g_object_unref(lv2ui_plugin->gui_turtle); lv2ui_plugin->gui_turtle = NULL; } if(lv2ui_plugin->lv2_plugin != NULL){ g_object_unref(lv2ui_plugin->lv2_plugin); lv2ui_plugin->lv2_plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2ui_plugin_parent_class)->dispose(gobject); } void ags_lv2ui_plugin_finalize(GObject *gobject) { AgsLv2uiPlugin *lv2ui_plugin; lv2ui_plugin = AGS_LV2UI_PLUGIN(gobject); g_free(lv2ui_plugin->gui_uri); if(lv2ui_plugin->manifest != NULL){ g_object_unref(lv2ui_plugin->manifest); } if(lv2ui_plugin->gui_turtle != NULL){ g_object_unref(lv2ui_plugin->gui_turtle); } if(lv2ui_plugin->lv2_plugin != NULL){ g_object_unref(lv2ui_plugin->lv2_plugin); } /* call parent */ G_OBJECT_CLASS(ags_lv2ui_plugin_parent_class)->finalize(gobject); } void ags_lv2ui_plugin_load_plugin(AgsBasePlugin *base_plugin) { //NOTE:JK: deprecated } gpointer ags_lv2ui_plugin_instantiate_with_params(AgsBasePlugin *base_plugin, guint *n_params, gchar ***parameter_name, GValue **value) { AgsLv2uiPlugin *lv2ui_plugin; LV2UI_Controller controller; LV2UI_Widget widget; void *ui_plugin_so; LV2UI_DescriptorFunction lv2ui_descriptor; LV2UI_Descriptor *plugin_descriptor; LV2_Handle *lv2_handle; LV2UI_Handle *ui_handle; LV2_URI_Map_Feature *uri_map_feature; LV2_Log_Log *log_feature; LV2_Event_Feature *event_feature; LV2_URID_Map *urid_map; LV2_URID_Unmap *urid_unmap; LV2UI_Write_Function write_function; LV2_Feature **feature; gchar *uri; gchar *filename; char *path; gchar *str; float *ptr_samplerate; float *ptr_buffer_size; uint32_t ui_effect_index; guint local_n_params; guint total_feature; guint nth; guint i; gboolean initial_call; LV2UI_Handle (*instantiate)(const struct _LV2UI_Descriptor* descriptor, const char *plugin_uri, const char *bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget *widget, const LV2_Feature *const *features); GRecMutex *base_plugin_mutex; lv2ui_plugin = AGS_LV2UI_PLUGIN(base_plugin); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); local_n_params = 0; if(n_params == NULL){ n_params = &local_n_params; } /* get some fields */ g_rec_mutex_lock(base_plugin_mutex); ui_plugin_so = base_plugin->ui_plugin_so; ui_effect_index = 0; if(ui_plugin_so == NULL){ gboolean success; g_message("open %s", base_plugin->ui_filename); #ifdef AGS_W32API ui_plugin_so = LoadLibrary(base_plugin->filename); #else ui_plugin_so = dlopen(base_plugin->filename, RTLD_NOW); #endif g_object_set(lv2ui_plugin, "ui-plugin-so", ui_plugin_so, NULL); success = FALSE; #ifdef AGS_W32API base_plugin->ui_plugin_handle = lv2ui_descriptor = (LV2_Descriptor_Function) GetProcAddress(ui_plugin_so, "lv2ui_descriptor"); success = (!lv2_descriptor) ? FALSE: TRUE; #else base_plugin->ui_plugin_handle = lv2ui_descriptor = (LV2_Descriptor_Function) dlsym(ui_plugin_so, "lv2ui_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && lv2_descriptor){ for(i = 0; (plugin_descriptor = lv2ui_descriptor((uint32_t) i)) != NULL; i++){ if(!g_ascii_strcasecmp(plugin_descriptor->URI, lv2ui_plugin->gui_uri)){ base_plugin->ui_plugin_descriptor = plugin_descriptor; ui_effect_index = i; g_object_set(lv2ui_plugin, "ui-effect-index", ui_effect_index, NULL); break; } } } } lv2ui_descriptor = base_plugin->ui_plugin_handle; plugin_descriptor = base_plugin->ui_plugin_descriptor; feature = lv2ui_plugin->feature; path = g_path_get_dirname(base_plugin->ui_filename); ui_effect_index = base_plugin->ui_effect_index; g_rec_mutex_unlock(base_plugin_mutex); if(ui_plugin_so == NULL){ g_free(path); return(NULL); } /* check args */ uri = NULL; controller = NULL; widget = NULL; write_function = NULL; lv2_handle = NULL; if(n_params != NULL && parameter_name != NULL && parameter_name[0] != NULL && value != NULL && value[0] != NULL){ for(i = 0; i < n_params[0] && parameter_name[0][i] != NULL; i++){ if(!g_ascii_strncasecmp(parameter_name[0][i], "uri", 4)){ uri = g_value_get_pointer(&(value[0][i])); }else if(!g_ascii_strncasecmp(parameter_name[0][i], "controller", 11)){ controller = g_value_get_pointer(&(value[0][i])); }else if(!g_ascii_strncasecmp(parameter_name[0][i], "write-function", 15)){ write_function = g_value_get_pointer(&(value[0][i])); }else if(!g_ascii_strncasecmp(parameter_name[0][i], "instance", 9)){ lv2_handle = g_value_get_pointer(&(value[0][i])); } } } /* features */ initial_call = FALSE; if(feature == NULL){ initial_call = TRUE; /**/ total_feature = 9; nth = 0; feature = (LV2_Feature **) malloc(total_feature * sizeof(LV2_Feature *)); /* idle interface */ feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_UI__idleInterface; feature[nth]->data = NULL; nth++; /* show interface */ feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_UI__showInterface; feature[nth]->data = NULL; nth++; /* instance access */ feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_INSTANCE_ACCESS_URI; feature[nth]->data = NULL; if(lv2_handle != NULL){ feature[nth]->data = lv2_handle[0]; } nth++; /* URI map feature */ uri_map_feature = (LV2_URI_Map_Feature *) malloc(sizeof(LV2_URI_Map_Feature)); uri_map_feature->callback_data = NULL; uri_map_feature->uri_to_id = ags_lv2_uri_map_manager_uri_to_id; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_URI_MAP_URI; feature[nth]->data = uri_map_feature; nth++; /* log feature */ #if 0 log_feature = (LV2_Log_Log *) malloc(sizeof(LV2_Log_Log)); log_feature->handle = NULL; log_feature->printf = ags_lv2_log_manager_printf; log_feature->vprintf = ags_lv2_log_manager_vprintf; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_LOG__log; feature[nth]->data = log_feature; nth++; #endif /* event feature */ event_feature = (LV2_Event_Feature *) malloc(sizeof(LV2_Event_Feature)); event_feature->callback_data = NULL; event_feature->lv2_event_ref = ags_lv2_event_manager_lv2_event_ref; event_feature->lv2_event_unref = ags_lv2_event_manager_lv2_event_unref; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_EVENT_URI; feature[nth]->data = event_feature; nth++; /* URID map feature */ urid_map = (LV2_URID_Map *) malloc(sizeof(LV2_URID_Map)); urid_map->handle = NULL; urid_map->map = ags_lv2_urid_manager_map; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_URID_MAP_URI; feature[nth]->data = urid_map; nth++; /* URID unmap feature */ urid_unmap = (LV2_URID_Unmap *) malloc(sizeof(LV2_URID_Unmap)); urid_unmap->handle = NULL; urid_unmap->unmap = ags_lv2_urid_manager_unmap; feature[nth] = (LV2_Feature *) malloc(sizeof(LV2_Feature)); feature[nth]->URI = LV2_URID_UNMAP_URI; feature[nth]->data = urid_unmap; nth++; /* terminate */ for(; nth < total_feature; nth++){ feature[nth] = NULL; } g_rec_mutex_lock(base_plugin_mutex); lv2ui_plugin->feature = feature; g_rec_mutex_unlock(base_plugin_mutex); } instantiate = NULL; if(plugin_descriptor != NULL){ g_rec_mutex_lock(base_plugin_mutex); instantiate = plugin_descriptor->instantiate; g_rec_mutex_unlock(base_plugin_mutex); } /* instantiate */ ui_handle = (LV2UI_Handle *) malloc(sizeof(LV2UI_Handle)); ui_handle[0] = NULL; if(instantiate != NULL){ ui_handle[0] = instantiate(plugin_descriptor, uri, path, write_function, controller, &widget, feature); } g_message("LV2UI handle = %p", ui_handle[0]); if(parameter_name != NULL && value != NULL){ if(n_params[0] == 0){ parameter_name[0] = (gchar **) malloc(2 * sizeof(gchar *)); value[0] = g_new0(GValue, 1); }else{ parameter_name[0] = (gchar **) realloc(parameter_name[0], (n_params[0] + 2) * sizeof(gchar *)); value[0] = g_renew(GValue, value[0], n_params[0] + 1); } parameter_name[0][n_params[0]] = g_strdup("widget"); g_value_init(&(value[0][n_params[0]]), G_TYPE_POINTER); g_value_set_pointer(&(value[0][n_params[0]]), widget); parameter_name[0][n_params[0] + 1] = NULL; n_params[0] += 1; } return(ui_handle); } /** * ags_lv2ui_plugin_test_flags: * @lv2ui_plugin: the #AgsLv2uiPlugin * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_lv2ui_plugin_test_flags(AgsLv2uiPlugin *lv2ui_plugin, guint flags) { gboolean retval; GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2UI_PLUGIN(lv2ui_plugin)){ return(FALSE); } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); /* test flags */ g_rec_mutex_lock(base_plugin_mutex); retval = ((flags & (lv2ui_plugin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); return(retval); } /** * ags_lv2ui_plugin_set_flags: * @lv2ui_plugin: the #AgsLv2uiPlugin * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_lv2ui_plugin_set_flags(AgsLv2uiPlugin *lv2ui_plugin, guint flags) { GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2UI_PLUGIN(lv2ui_plugin)){ return; } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); /* set flags */ g_rec_mutex_lock(base_plugin_mutex); lv2ui_plugin->flags |= flags; g_rec_mutex_unlock(base_plugin_mutex); } /** * ags_lv2ui_plugin_unset_flags: * @lv2ui_plugin: the #AgsLv2uiPlugin * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_lv2ui_plugin_unset_flags(AgsLv2uiPlugin *lv2ui_plugin, guint flags) { GRecMutex *base_plugin_mutex; if(!AGS_IS_LV2UI_PLUGIN(lv2ui_plugin)){ return; } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(lv2ui_plugin); /* unset flags */ g_rec_mutex_lock(base_plugin_mutex); lv2ui_plugin->flags &= (~flags); g_rec_mutex_unlock(base_plugin_mutex); } /** * ags_lv2ui_plugin_find_gui_uri: * @lv2ui_plugin: (element-type AgsAudio.Lv2uiPlugin) (transfer none): the #GList-struct containing #AgsLv2uiPlugin * @gui_uri: the gui-uri as string * * Find next matching gui-uri in @lv2ui_plugin. * * Returns: (element-type AgsAudio.Lv2uiPlugin) (transfer none): the next matching #GList-struct * * Since: 3.0.0 */ GList* ags_lv2ui_plugin_find_gui_uri(GList *lv2ui_plugin, gchar *gui_uri) { if(gui_uri == NULL){ return(NULL); } while(lv2ui_plugin != NULL){ if(AGS_LV2UI_PLUGIN(lv2ui_plugin->data)->gui_uri != NULL && !g_ascii_strcasecmp(AGS_LV2UI_PLUGIN(lv2ui_plugin->data)->gui_uri, gui_uri)){ return(lv2ui_plugin); } lv2ui_plugin = lv2ui_plugin->next; } return(NULL); } /** * ags_lv2ui_plugin_new: * @gui_turtle: the #AgsTurtle * @filename: the plugin .so * @effect: the effect's string representation * @gui_uri: the effect's gui_uri * @effect_index: the effect's index * * Creates an #AgsLv2uiPlugin * * Returns: a new #AgsLv2uiPlugin * * Since: 3.0.0 */ AgsLv2uiPlugin* ags_lv2ui_plugin_new(AgsTurtle *gui_turtle, gchar *filename, gchar *effect, gchar *gui_uri, guint effect_index) { AgsLv2uiPlugin *lv2ui_plugin; lv2ui_plugin = (AgsLv2uiPlugin *) g_object_new(AGS_TYPE_LV2UI_PLUGIN, "gui-turtle", gui_turtle, "filename", filename, "effect", effect, "gui-uri", gui_uri, "effect-index", effect_index, NULL); return(lv2ui_plugin); } gsequencer-3.1.3/ags/plugin/ags_lv2_preset_manager.h0000644000175000017500000000433613607210263017440 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_PRESET_MANAGER_H__ #define __AGS_LV2_PRESET_MANAGER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_PRESET_MANAGER (ags_lv2_preset_manager_get_type()) #define AGS_LV2_PRESET_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_PRESET_MANAGER, AgsLv2PresetManager)) #define AGS_LV2_PRESET_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_PRESET_MANAGER, AgsLv2PresetManagerClass)) #define AGS_IS_LV2_PRESET_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_PRESET_MANAGER)) #define AGS_IS_LV2_PRESET_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_PRESET_MANAGER)) #define AGS_LV2_PRESET_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_PRESET_MANAGER, AgsLv2PresetManagerClass)) #define AGS_LV2_PRESET_MANAGER_GET_OBJ_MUTEX(obj) (((AgsLv2PresetManager *) obj)->obj_mutex) typedef struct _AgsLv2PresetManager AgsLv2PresetManager; typedef struct _AgsLv2PresetManagerClass AgsLv2PresetManagerClass; struct _AgsLv2PresetManager { GObject gobject; GRecMutex obj_mutex; GList *lv2_preset; }; struct _AgsLv2PresetManagerClass { GObjectClass gobject; }; GType ags_lv2_preset_manager_get_type(void); /* */ AgsLv2PresetManager* ags_lv2_preset_manager_get_instance(); AgsLv2PresetManager* ags_lv2_preset_manager_new(); G_END_DECLS #endif /*__AGS_LV2_PRESET_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_dssi_plugin.c0000644000175000017500000005114513607210263016174 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include void ags_dssi_plugin_class_init(AgsDssiPluginClass *dssi_plugin); void ags_dssi_plugin_init (AgsDssiPlugin *dssi_plugin); void ags_dssi_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_dssi_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_dssi_plugin_finalize(GObject *gobject); gpointer ags_dssi_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size); void ags_dssi_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void ags_dssi_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_dssi_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_dssi_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void ags_dssi_plugin_load_plugin(AgsBasePlugin *base_plugin); void ags_dssi_plugin_real_change_program(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index); /** * SECTION:ags_dssi_plugin * @short_description: The dssi plugin class * @title: AgsDssiPlugin * @section_id: * @include: ags/plugin/ags_dssi_plugin.h * * The #AgsDssiPlugin loads/unloads a Dssi plugin. */ enum{ PROP_0, PROP_UNIQUE_ID, PROP_PROGRAM, }; enum{ CHANGE_PROGRAM, LAST_SIGNAL, }; static gpointer ags_dssi_plugin_parent_class = NULL; static guint dssi_plugin_signals[LAST_SIGNAL]; GType ags_dssi_plugin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_dssi_plugin = 0; static const GTypeInfo ags_dssi_plugin_info = { sizeof (AgsDssiPluginClass), NULL, /* dssi_init */ NULL, /* dssi_finalize */ (GClassInitFunc) ags_dssi_plugin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsDssiPlugin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_dssi_plugin_init, }; ags_type_dssi_plugin = g_type_register_static(AGS_TYPE_BASE_PLUGIN, "AgsDssiPlugin", &ags_dssi_plugin_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_dssi_plugin); } return g_define_type_id__volatile; } void ags_dssi_plugin_class_init(AgsDssiPluginClass *dssi_plugin) { AgsBasePluginClass *base_plugin; GObjectClass *gobject; GParamSpec *param_spec; ags_dssi_plugin_parent_class = g_type_class_peek_parent(dssi_plugin); /* GObjectClass */ gobject = (GObjectClass *) dssi_plugin; gobject->set_property = ags_dssi_plugin_set_property; gobject->get_property = ags_dssi_plugin_get_property; gobject->finalize = ags_dssi_plugin_finalize; /* properties */ /** * AgsDssiPlugin:unique-id: * * The assigned unique-id. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("unique-id", i18n_pspec("unique-id of the plugin"), i18n_pspec("The unique-id this plugin is assigned with"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UNIQUE_ID, param_spec); /** * AgsBasePlugin:program: * * The assigned program. * * Since: 3.0.0 */ param_spec = g_param_spec_string("program", i18n_pspec("program of the plugin"), i18n_pspec("The program this plugin is located in"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PROGRAM, param_spec); /* AgsBasePluginClass */ base_plugin = (AgsBasePluginClass *) dssi_plugin; base_plugin->instantiate = ags_dssi_plugin_instantiate; base_plugin->connect_port = ags_dssi_plugin_connect_port; base_plugin->activate = ags_dssi_plugin_activate; base_plugin->deactivate = ags_dssi_plugin_deactivate; base_plugin->run = ags_dssi_plugin_run; base_plugin->load_plugin = ags_dssi_plugin_load_plugin; /* AgsDssiPluginClass */ dssi_plugin->change_program = ags_dssi_plugin_real_change_program; /** * AgsDssiPlugin::change-program: * @dssi_plugin: the plugin to change-program * @ladspa_handle: the LADSPA handle * @bank: the bank number * @program: the program number * * The ::change-program signal creates a new instance of plugin. * * Since: 3.0.0 */ dssi_plugin_signals[CHANGE_PROGRAM] = g_signal_new("change-program", G_TYPE_FROM_CLASS (dssi_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsDssiPluginClass, change_program), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_UINT_UINT, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_UINT, G_TYPE_UINT); } void ags_dssi_plugin_init(AgsDssiPlugin *dssi_plugin) { dssi_plugin->unique_id = 0; dssi_plugin->program = NULL; } void ags_dssi_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsDssiPlugin *dssi_plugin; GRecMutex *base_plugin_mutex; dssi_plugin = AGS_DSSI_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); switch(prop_id){ case PROP_UNIQUE_ID: { g_rec_mutex_lock(base_plugin_mutex); dssi_plugin->unique_id = g_value_get_uint(value); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PROGRAM: { gchar *program; program = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(dssi_plugin->program == program){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(dssi_plugin->program != NULL){ g_free(dssi_plugin->program); } dssi_plugin->program = g_strdup(program); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_dssi_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsDssiPlugin *dssi_plugin; GRecMutex *base_plugin_mutex; dssi_plugin = AGS_DSSI_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); switch(prop_id){ case PROP_UNIQUE_ID: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_uint(value, dssi_plugin->unique_id); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PROGRAM: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, dssi_plugin->program); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_dssi_plugin_finalize(GObject *gobject) { AgsDssiPlugin *dssi_plugin; dssi_plugin = AGS_DSSI_PLUGIN(gobject); g_free(dssi_plugin->program); /* call parent */ G_OBJECT_CLASS(ags_dssi_plugin_parent_class)->finalize(gobject); } gpointer ags_dssi_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size) { LADSPA_Descriptor *ladspa_descriptor; gpointer ptr; LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor *descriptor, unsigned long ramplerate); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get instantiate */ g_rec_mutex_lock(base_plugin_mutex); ladspa_descriptor = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin; instantiate = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->instantiate; g_rec_mutex_unlock(base_plugin_mutex); /* instantiate */ ptr = instantiate(ladspa_descriptor, (unsigned long) samplerate); return(ptr); } void ags_dssi_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location) { void (*connect_port)(LADSPA_Handle instance, unsigned long port_index, LADSPA_Data *data_location); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get connect port */ g_rec_mutex_lock(base_plugin_mutex); connect_port = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->connect_port; g_rec_mutex_unlock(base_plugin_mutex); /* connect port */ connect_port((LADSPA_Handle) plugin_handle, (unsigned long) port_index, (LADSPA_Data *) data_location); } void ags_dssi_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { void (*activate)(LADSPA_Handle instance); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* activate */ g_rec_mutex_lock(base_plugin_mutex); activate = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->activate; g_rec_mutex_unlock(base_plugin_mutex); if(activate != NULL){ activate((LADSPA_Handle) plugin_handle); } } void ags_dssi_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { void (*deactivate)(LADSPA_Handle instance); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* deactivate */ g_rec_mutex_lock(base_plugin_mutex); deactivate = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->deactivate; g_rec_mutex_unlock(base_plugin_mutex); if(deactivate != NULL){ deactivate((LADSPA_Handle) plugin_handle); } } void ags_dssi_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count) { void (*run_synth)(LADSPA_Handle instance, unsigned long sample_count, snd_seq_event_t *events, unsigned long event_count); void (*run)(LADSPA_Handle instance, unsigned long sample_count); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* run */ g_rec_mutex_lock(base_plugin_mutex); run_synth = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->run_synth; run = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->run; g_rec_mutex_unlock(base_plugin_mutex); if(run_synth != NULL){ run_synth((LADSPA_Handle) plugin_handle, (unsigned long) frame_count, seq_event, (unsigned long) 1); }else{ run((LADSPA_Handle) plugin_handle, (unsigned long) frame_count); } } void ags_dssi_plugin_load_plugin(AgsBasePlugin *base_plugin) { AgsDssiPlugin *dssi_plugin; AgsPluginPort *current_plugin_port; GList *plugin_port; gchar *str; DSSI_Descriptor_Function dssi_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortRangeHint *range_hint; LADSPA_PortRangeHintDescriptor hint_descriptor; unsigned long effect_index; unsigned long port_count; unsigned long i; gboolean success; GRecMutex *base_plugin_mutex; dssi_plugin = AGS_DSSI_PLUGIN(base_plugin); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* dlopen */ g_rec_mutex_lock(base_plugin_mutex); #ifdef AGS_W32API base_plugin->plugin_so = LoadLibrary(base_plugin->filename); #else base_plugin->plugin_so = dlopen(base_plugin->filename, RTLD_NOW); #endif if(base_plugin->plugin_so == NULL){ g_warning("ags_dssi_plugin.c - failed to load static object file"); #ifndef AGS_W32API dlerror(); #endif g_rec_mutex_unlock(base_plugin_mutex); return; } success = FALSE; #ifdef AGS_W32API base_plugin->plugin_handle = dssi_descriptor = (DSSI_Descriptor_Function) GetProcAddress(base_plugin->plugin_so, "dssi_descriptor"); success = (!dssi_descriptor) ? FALSE: TRUE; #else base_plugin->plugin_handle = dssi_descriptor = (DSSI_Descriptor_Function) dlsym(base_plugin->plugin_so, "dssi_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif g_rec_mutex_unlock(base_plugin_mutex); if(success && dssi_descriptor){ gpointer plugin_descriptor; guint unique_id; g_rec_mutex_lock(base_plugin_mutex); effect_index = base_plugin->effect_index; plugin_descriptor = base_plugin->plugin_descriptor = dssi_descriptor(effect_index); g_rec_mutex_unlock(base_plugin_mutex); if(plugin_descriptor != NULL){ g_rec_mutex_lock(base_plugin_mutex); unique_id = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->UniqueID; port_count = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->PortCount; port_descriptor = AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->PortDescriptors; g_rec_mutex_unlock(base_plugin_mutex); g_object_set(base_plugin, "unique-id", unique_id, NULL); plugin_port = NULL; for(i = 0; i < port_count; i++){ /* create plugin port */ current_plugin_port = ags_plugin_port_new(); g_object_ref(current_plugin_port); plugin_port = g_list_prepend(plugin_port, current_plugin_port); g_rec_mutex_lock(base_plugin_mutex); /* set flags */ if(LADSPA_IS_PORT_INPUT(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_INPUT; }else if(LADSPA_IS_PORT_OUTPUT(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_OUTPUT; } if(LADSPA_IS_PORT_CONTROL(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_CONTROL; }else if(LADSPA_IS_PORT_AUDIO(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_AUDIO; } /* set index and name */ current_plugin_port->port_index = i; current_plugin_port->port_name = g_strdup(AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->PortNames[i]); range_hint = &(AGS_DSSI_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->LADSPA_Plugin->PortRangeHints[i]); hint_descriptor = range_hint->HintDescriptor; g_value_init(current_plugin_port->default_value, G_TYPE_FLOAT); g_value_init(current_plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(current_plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(current_plugin_port->default_value, 0.0); if(LADSPA_IS_HINT_TOGGLED(hint_descriptor)){ /* is toggled */ current_plugin_port->flags |= AGS_PLUGIN_PORT_TOGGLED; /* set default */ if(LADSPA_IS_HINT_DEFAULT_0(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 0.0); }else if(LADSPA_IS_HINT_DEFAULT_1(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 1.0); } }else{ /* set lower */ g_value_set_float(current_plugin_port->lower_value, range_hint->LowerBound); /* set upper */ g_value_set_float(current_plugin_port->upper_value, range_hint->UpperBound); /* set default */ g_value_set_float(current_plugin_port->default_value, range_hint->LowerBound); /* bounds */ if(LADSPA_IS_HINT_BOUNDED_BELOW(hint_descriptor)){ if(LADSPA_IS_HINT_SAMPLE_RATE(hint_descriptor)){ current_plugin_port->flags |= (AGS_PLUGIN_PORT_SAMPLERATE | AGS_PLUGIN_PORT_BOUNDED_BELOW); g_value_set_float(current_plugin_port->lower_value, range_hint->LowerBound); } } if(LADSPA_IS_HINT_BOUNDED_ABOVE(hint_descriptor)){ if(LADSPA_IS_HINT_SAMPLE_RATE(hint_descriptor)){ current_plugin_port->flags |= (AGS_PLUGIN_PORT_SAMPLERATE | AGS_PLUGIN_PORT_BOUNDED_ABOVE); g_value_set_float(current_plugin_port->upper_value, range_hint->UpperBound); } } /* integer */ if(LADSPA_IS_HINT_INTEGER(hint_descriptor)){ current_plugin_port->flags |= AGS_PLUGIN_PORT_INTEGER; current_plugin_port->scale_steps = range_hint->UpperBound - range_hint->LowerBound; } /* logarithmic */ if(LADSPA_IS_HINT_LOGARITHMIC(hint_descriptor)){ current_plugin_port->flags |= AGS_PLUGIN_PORT_LOGARITHMIC; } /* set default value */ if(LADSPA_IS_HINT_DEFAULT_0(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 0.0); }else if(LADSPA_IS_HINT_DEFAULT_1(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 1.0); }else if(LADSPA_IS_HINT_DEFAULT_MINIMUM(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, range_hint->LowerBound); }else if(LADSPA_IS_HINT_DEFAULT_LOW(hint_descriptor)){ float default_value; default_value = 0.75 * range_hint->LowerBound + 0.25 * range_hint->UpperBound; g_value_set_float(current_plugin_port->default_value, default_value); }else if(LADSPA_IS_HINT_DEFAULT_MIDDLE(hint_descriptor)){ float default_value; default_value = (0.5 * range_hint->LowerBound) + (0.5 * range_hint->UpperBound); g_value_set_float(current_plugin_port->default_value, default_value); }else if(LADSPA_IS_HINT_DEFAULT_HIGH(hint_descriptor)){ float default_value; default_value = 0.25 * range_hint->LowerBound + 0.75 * range_hint->UpperBound; g_value_set_float(current_plugin_port->default_value, default_value); }else if(LADSPA_IS_HINT_DEFAULT_MAXIMUM(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, range_hint->UpperBound); }else if(LADSPA_IS_HINT_DEFAULT_100(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 100.0); }else if(LADSPA_IS_HINT_DEFAULT_440(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 440.0); } } g_rec_mutex_unlock(base_plugin_mutex); } base_plugin->plugin_port = g_list_reverse(plugin_port); } } } void ags_dssi_plugin_real_change_program(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index) { void (*select_program)(LADSPA_Handle instance, unsigned long bank, unsigned long program); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(dssi_plugin); /* get change program */ g_rec_mutex_lock(base_plugin_mutex); select_program = AGS_DSSI_PLUGIN_DESCRIPTOR(AGS_BASE_PLUGIN(dssi_plugin)->plugin_descriptor)->select_program; g_rec_mutex_unlock(base_plugin_mutex); /* change program */ if(select_program != NULL){ select_program((void *) ladspa_handle, (unsigned long) bank_index, (unsigned long) program_index); } } void ags_dssi_plugin_change_program(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index) { g_return_if_fail(AGS_IS_DSSI_PLUGIN(dssi_plugin)); g_object_ref(G_OBJECT(dssi_plugin)); g_signal_emit(G_OBJECT(dssi_plugin), dssi_plugin_signals[CHANGE_PROGRAM], 0, ladspa_handle, bank_index, program_index); g_object_unref(G_OBJECT(dssi_plugin)); } /** * ags_dssi_plugin_new: * @filename: the plugin .so * @effect: the effect's string representation * @effect_index: the effect's index * * Create a new instance of #AgsDssiPlugin * * Returns: the new #AgsDssiPlugin * * Since: 3.0.0 */ AgsDssiPlugin* ags_dssi_plugin_new(gchar *filename, gchar *effect, guint effect_index) { AgsDssiPlugin *dssi_plugin; dssi_plugin = (AgsDssiPlugin *) g_object_new(AGS_TYPE_DSSI_PLUGIN, "filename", filename, "effect", effect, "effect-index", effect_index, NULL); return(dssi_plugin); } gsequencer-3.1.3/ags/plugin/ags_lv2_worker.h0000644000175000017500000000650713607210263015757 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_WORKER_H__ #define __AGS_LV2_WORKER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_WORKER (ags_lv2_worker_get_type()) #define AGS_LV2_WORKER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_WORKER, AgsLv2Worker)) #define AGS_LV2_WORKER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_WORKER, AgsLv2WorkerClass)) #define AGS_IS_LV2_WORKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_WORKER)) #define AGS_IS_LV2_WORKER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_WORKER)) #define AGS_LV2_WORKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_WORKER, AgsLv2WorkerClass)) #define AGS_LV2_WORKER_GET_OBJ_MUTEX(obj) (&(((AgsLv2Worker *) obj)->obj_mutex)) #define AGS_LV2_WORKER_RESPONSE_DATA(ptr) ((AgsLv2WorkerResponseData *)(ptr)) typedef struct _AgsLv2Worker AgsLv2Worker; typedef struct _AgsLv2WorkerClass AgsLv2WorkerClass; typedef struct _AgsLv2WorkerResponseData AgsLv2WorkerResponseData; /** * AgsLv2WorkerFlags: * @AGS_LV2_WORKER_RUN: the worker is running * * Enum values to control the behavior or indicate internal state of #AgsLv2Worker by * enable/disable as flags. */ typedef enum{ AGS_LV2_WORKER_RUN = 1, }AgsLv2WorkerFlags; struct _AgsLv2Worker { GObject gobject; guint flags; GRecMutex obj_mutex; LV2_Handle handle; LV2_Worker_Interface *worker_interface; guint work_size; void *work_data; GList *response_data; AgsThread *worker_thread; }; struct _AgsLv2WorkerClass { GObjectClass gobject; }; struct _AgsLv2WorkerResponseData { uint32_t data_size; void *data; }; GType ags_lv2_worker_get_type(void); gboolean ags_lv2_worker_test_flags(AgsLv2Worker *lv2_worker, guint flags); void ags_lv2_worker_set_flags(AgsLv2Worker *lv2_worker, guint flags); void ags_lv2_worker_unset_flags(AgsLv2Worker *lv2_worker, guint flags); AgsLv2WorkerResponseData* ags_lv2_worker_alloc_response_data(); void ags_lv2_worker_free_response_data(AgsLv2WorkerResponseData *response_data); LV2_Worker_Status ags_lv2_worker_respond(LV2_Worker_Respond_Handle handle, uint32_t data_size, const void* data); LV2_Worker_Status ags_lv2_worker_schedule_work(LV2_Worker_Schedule_Handle handle, uint32_t data_size, const void* data); void ags_lv2_worker_do_poll(AgsWorkerThread *worker_thread, gpointer data); AgsLv2Worker* ags_lv2_worker_new(); G_END_DECLS #endif /*__AGS_LV2_WORKER_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_conversion.c0000644000175000017500000002411013607210263016614 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_lv2_conversion_class_init(AgsLv2ConversionClass *conversion); void ags_lv2_conversion_init (AgsLv2Conversion *conversion); void ags_lv2_conversion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_conversion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_conversion_finalize(GObject *gobject); gdouble ags_lv2_conversion_convert(AgsConversion *conversion, gdouble value, gboolean reverse); /** * SECTION:ags_lv2_conversion * @short_description: Conversion of values * @title: AgsLv2Conversion * @section_id: * @include: ags/plugin/ags_lv2_conversion.h * * The #AgsLv2Conversion converts values. */ enum{ PROP_0, PROP_LOWER, PROP_UPPER, PROP_STEP_COUNT, }; static gpointer ags_lv2_conversion_parent_class = NULL; GType ags_lv2_conversion_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_conversion = 0; static const GTypeInfo ags_lv2_conversion_info = { sizeof (AgsLv2ConversionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_conversion_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2Conversion), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_conversion_init, }; ags_type_lv2_conversion = g_type_register_static(AGS_TYPE_CONVERSION, "AgsLv2Conversion", &ags_lv2_conversion_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_conversion); } return g_define_type_id__volatile; } void ags_lv2_conversion_class_init(AgsLv2ConversionClass *lv2_conversion) { AgsConversionClass *conversion; GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_conversion_parent_class = g_type_class_peek_parent(lv2_conversion); /* GObjectClass */ gobject = (GObjectClass *) lv2_conversion; gobject->set_property = ags_lv2_conversion_set_property; gobject->get_property = ags_lv2_conversion_get_property; gobject->finalize = ags_lv2_conversion_finalize; /* properties */ /** * AgsLv2Conversion:lower: * * The lower to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lower", i18n_pspec("using lower"), i18n_pspec("The lower to be used"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, AGS_LV2_CONVERSION_DEFAULT_LOWER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER, param_spec); /** * AgsLv2Conversion:upper: * * The upper to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("upper", i18n_pspec("using upper"), i18n_pspec("The upper to be used"), -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, AGS_LV2_CONVERSION_DEFAULT_UPPER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER, param_spec); /** * AgsLv2Conversion:step-count: * * The step count to be used. * * Since: 3.0.0 */ param_spec = g_param_spec_double("step-count", i18n_pspec("using step count"), i18n_pspec("The step count to be used"), 0.0, G_MAXDOUBLE, AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STEP_COUNT, param_spec); /* AgsConversionClass */ conversion = (AgsConversionClass *) lv2_conversion; conversion->convert = ags_lv2_conversion_convert; } void ags_lv2_conversion_init(AgsLv2Conversion *lv2_conversion) { lv2_conversion->flags = 0; lv2_conversion->lower = AGS_LV2_CONVERSION_DEFAULT_LOWER; lv2_conversion->upper = AGS_LV2_CONVERSION_DEFAULT_UPPER; lv2_conversion->step_count = AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT; } void ags_lv2_conversion_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_lv2_conversion_parent_class)->finalize(gobject); } void ags_lv2_conversion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2Conversion *lv2_conversion; GRecMutex *conversion_mutex; lv2_conversion = AGS_LV2_CONVERSION(gobject); /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(lv2_conversion); switch(prop_id){ case PROP_LOWER: { gdouble lower; lower = g_value_get_double(value); g_rec_mutex_lock(conversion_mutex); lv2_conversion->lower = lower; g_rec_mutex_unlock(conversion_mutex); } break; case PROP_UPPER: { gdouble upper; upper = g_value_get_double(value); g_rec_mutex_lock(conversion_mutex); lv2_conversion->upper = upper; g_rec_mutex_unlock(conversion_mutex); } break; case PROP_STEP_COUNT: { gdouble step_count; step_count = g_value_get_double(value); g_rec_mutex_lock(conversion_mutex); lv2_conversion->step_count = step_count; g_rec_mutex_unlock(conversion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_conversion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2Conversion *lv2_conversion; GRecMutex *conversion_mutex; lv2_conversion = AGS_LV2_CONVERSION(gobject); /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(lv2_conversion); switch(prop_id){ case PROP_LOWER: { g_rec_mutex_lock(conversion_mutex); g_value_set_double(value, lv2_conversion->lower); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_UPPER: { g_rec_mutex_lock(conversion_mutex); g_value_set_double(value, lv2_conversion->upper); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_STEP_COUNT: { g_rec_mutex_lock(conversion_mutex); g_value_set_double(value, lv2_conversion->step_count); g_rec_mutex_unlock(conversion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } /** * ags_lv2_conversion_test_flags: * @lv2_conversion: the #AgsLv2Conversion * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_conversion_test_flags(AgsLv2Conversion *lv2_conversion, guint flags) { gboolean retval; GRecMutex *conversion_mutex; if(!AGS_IS_LV2_CONVERSION(lv2_conversion)){ return(FALSE); } /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(lv2_conversion); /* test flags */ g_rec_mutex_lock(conversion_mutex); retval = ((flags & (lv2_conversion->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(conversion_mutex); return(retval); } /** * ags_lv2_conversion_set_flags: * @lv2_conversion: the #AgsLv2Conversion * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_lv2_conversion_set_flags(AgsLv2Conversion *lv2_conversion, guint flags) { GRecMutex *conversion_mutex; if(!AGS_IS_LV2_CONVERSION(lv2_conversion)){ return; } /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(lv2_conversion); /* set flags */ g_rec_mutex_lock(conversion_mutex); lv2_conversion->flags |= flags; g_rec_mutex_unlock(conversion_mutex); } /** * ags_lv2_conversion_unset_flags: * @lv2_conversion: the #AgsLv2Conversion * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_lv2_conversion_unset_flags(AgsLv2Conversion *lv2_conversion, guint flags) { GRecMutex *conversion_mutex; if(!AGS_IS_LV2_CONVERSION(lv2_conversion)){ return; } /* get base plugin mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(lv2_conversion); /* unset flags */ g_rec_mutex_lock(conversion_mutex); lv2_conversion->flags &= (~flags); g_rec_mutex_unlock(conversion_mutex); } gdouble ags_lv2_conversion_convert(AgsConversion *conversion, gdouble x, gboolean reverse) { AgsLv2Conversion *lv2_conversion; gdouble value, step; gdouble upper, lower, step_count; gdouble retval; lv2_conversion = AGS_LV2_CONVERSION(conversion); retval = x; if(reverse){ if(ags_lv2_conversion_test_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC)){ g_object_get(lv2_conversion, "lower", &lower, "upper", &upper, "step_count", &step_count, NULL); value = x; step = retval = (step_count - 1) * log(value / lower) / log(upper / lower); } }else{ if(ags_lv2_conversion_test_flags(lv2_conversion, AGS_LV2_CONVERSION_LOGARITHMIC)){ g_object_get(lv2_conversion, "lower", &lower, "upper", &upper, "step_count", &step_count, NULL); step = x; value = retval = lower * pow(upper / lower, step / (step_count - 1)); } } return(retval); } /** * ags_lv2_conversion_new: * * Create a new instance of #AgsLv2Conversion. * * Returns: the new #AgsLv2Conversion * * Since: 3.0.0 */ AgsLv2Conversion* ags_lv2_conversion_new() { AgsLv2Conversion *conversion; conversion = g_object_new(AGS_TYPE_LV2_CONVERSION, NULL); return(conversion); } gsequencer-3.1.3/ags/plugin/ags_lv2_preset.c0000644000175000017500000004032413607210263015736 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_lv2_preset_class_init(AgsLv2PresetClass *lv2_preset); void ags_lv2_preset_init(AgsLv2Preset *lv2_preset); void ags_lv2_preset_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_preset_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_preset_finalize(GObject *gobject); /** * SECTION:ags_lv2_preset * @short_description: LV2 presets * @title: AgsLv2Preset * @section_id: * @include: ags/plugin/ags_lv2_preset.h * * The #AgsLv2Preset handles LV2 presets mapped to a bank. */ enum{ PROP_0, PROP_LV2_PLUGIN, PROP_URI, PROP_APPLIES_TO, PROP_BANK, PROP_PRESET_LABEL, PROP_MANIFEST, PROP_TURTLE, PROP_PORT_PRESET, }; static gpointer ags_lv2_preset_parent_class = NULL; GType ags_lv2_preset_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_preset = 0; static const GTypeInfo ags_lv2_preset_info = { sizeof (AgsLv2PresetClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_preset_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2Preset), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_preset_init, }; ags_type_lv2_preset = g_type_register_static(G_TYPE_OBJECT, "AgsLv2Preset", &ags_lv2_preset_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_preset); } return g_define_type_id__volatile; } void ags_lv2_preset_class_init(AgsLv2PresetClass *lv2_preset) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_preset_parent_class = g_type_class_peek_parent(lv2_preset); /* GObject */ gobject = (GObjectClass *) lv2_preset; gobject->set_property = ags_lv2_preset_set_property; gobject->get_property = ags_lv2_preset_get_property; gobject->finalize = ags_lv2_preset_finalize; /* properties */ /** * AgsLv2Preset:lv2-plugin: * * The assigned lv2 plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("lv2-plugin", i18n_pspec("lv2 plugin of the preset"), i18n_pspec("The lv2 plugin this preset is located in"), AGS_TYPE_LV2_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LV2_PLUGIN, param_spec); /** * AgsLv2Preset:uri: * * The assigned uri. * * Since: 3.0.0 */ param_spec = g_param_spec_string("uri", i18n_pspec("uri of the preset"), i18n_pspec("The uri this preset is located in"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_URI, param_spec); /** * AgsLv2Preset:applies-to: * * The assigned applies to. * * Since: 3.0.0 */ param_spec = g_param_spec_string("applies-to", i18n_pspec("applies to plugin"), i18n_pspec("The applies to plugin"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_APPLIES_TO, param_spec); /** * AgsLv2Preset:bank: * * The assigned bank. * * Since: 3.0.0 */ param_spec = g_param_spec_string("bank", i18n_pspec("bank of the preset"), i18n_pspec("The bank this preset is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BANK, param_spec); /** * AgsLv2Preset:preset-label: * * The preset label. * * Since: 3.0.0 */ param_spec = g_param_spec_string("preset-label", i18n_pspec("preset label"), i18n_pspec("The preset label"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET_LABEL, param_spec); /** * AgsLv2Preset:manifest: * * The assigned manifest. * * Since: 3.0.0 */ param_spec = g_param_spec_object("manifest", i18n_pspec("manifest of the preset"), i18n_pspec("The manifest this preset is referred by"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MANIFEST, param_spec); /** * AgsLv2Preset:turtle: * * The assigned turtle. * * Since: 3.0.0 */ param_spec = g_param_spec_object("turtle", i18n_pspec("turtle of the preset"), i18n_pspec("The turtle this preset is located in"), AGS_TYPE_TURTLE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TURTLE, param_spec); /** * AgsLv2Preset:port-preset: * * The port preset. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("port-preset", i18n_pspec("port-preset of the preset"), i18n_pspec("The port-preset this preset is located in"), G_PARAM_READABLE); g_object_class_install_property(gobject, PROP_PORT_PRESET, param_spec); } void ags_lv2_preset_init(AgsLv2Preset *lv2_preset) { lv2_preset->flags = 0; /* add lv2 preset mutex */ g_rec_mutex_init(&(lv2_preset->obj_mutex)); lv2_preset->lv2_plugin = NULL; lv2_preset->uri = NULL; lv2_preset->applies_to = NULL; lv2_preset->bank = NULL; lv2_preset->preset_label = NULL; lv2_preset->manifest = NULL; lv2_preset->turtle = NULL; lv2_preset->port_preset = NULL; } void ags_lv2_preset_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2Preset *lv2_preset; GRecMutex *lv2_preset_mutex; lv2_preset = AGS_LV2_PRESET(gobject); /* get base plugin mutex */ lv2_preset_mutex = AGS_LV2_PRESET_GET_OBJ_MUTEX(lv2_preset); switch(prop_id){ case PROP_LV2_PLUGIN: { AgsLv2Plugin *lv2_plugin; lv2_plugin = (AgsLv2Plugin *) g_value_get_object(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->lv2_plugin == (GObject *) lv2_plugin){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->lv2_plugin != NULL){ g_object_unref(lv2_preset->lv2_plugin); } if(lv2_plugin != NULL){ g_object_ref(lv2_plugin); } lv2_preset->lv2_plugin = lv2_plugin; g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_URI: { gchar *uri; uri = (gchar *) g_value_get_string(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->uri == uri){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->uri != NULL){ g_free(lv2_preset->uri); } lv2_preset->uri = g_strdup(uri); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_APPLIES_TO: { gchar *applies_to; applies_to = (gchar *) g_value_get_string(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->applies_to == applies_to){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->applies_to != NULL){ g_free(lv2_preset->applies_to); } lv2_preset->applies_to = g_strdup(applies_to); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_BANK: { gchar *bank; bank = (gchar *) g_value_get_string(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->bank == bank){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->bank != NULL){ g_free(lv2_preset->bank); } lv2_preset->bank = g_strdup(bank); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_PRESET_LABEL: { gchar *preset_label; preset_label = (gchar *) g_value_get_string(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->preset_label == preset_label){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->preset_label != NULL){ g_free(lv2_preset->preset_label); } lv2_preset->preset_label = g_strdup(preset_label); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_MANIFEST: { AgsTurtle *manifest; manifest = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->manifest == manifest){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->manifest != NULL){ g_object_unref(lv2_preset->manifest); } if(manifest != NULL){ g_object_ref(manifest); } lv2_preset->manifest = manifest; g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_TURTLE: { AgsTurtle *turtle; turtle = (AgsTurtle *) g_value_get_object(value); g_rec_mutex_lock(lv2_preset_mutex); if(lv2_preset->turtle == turtle){ g_rec_mutex_unlock(lv2_preset_mutex); return; } if(lv2_preset->turtle != NULL){ g_object_unref(lv2_preset->turtle); } if(turtle != NULL){ g_object_ref(turtle); } lv2_preset->turtle = turtle; g_rec_mutex_unlock(lv2_preset_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_preset_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2Preset *lv2_preset; GRecMutex *lv2_preset_mutex; lv2_preset = AGS_LV2_PRESET(gobject); /* get base plugin mutex */ lv2_preset_mutex = AGS_LV2_PRESET_GET_OBJ_MUTEX(lv2_preset); switch(prop_id){ case PROP_LV2_PLUGIN: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_object(value, lv2_preset->lv2_plugin); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_URI: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_string(value, lv2_preset->uri); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_APPLIES_TO: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_string(value, lv2_preset->applies_to); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_BANK: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_string(value, lv2_preset->bank); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_PRESET_LABEL: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_string(value, lv2_preset->preset_label); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_MANIFEST: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_object(value, lv2_preset->manifest); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_TURTLE: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_object(value, lv2_preset->turtle); g_rec_mutex_unlock(lv2_preset_mutex); } break; case PROP_PORT_PRESET: { g_rec_mutex_lock(lv2_preset_mutex); g_value_set_pointer(value, g_list_copy(lv2_preset->port_preset)); g_rec_mutex_unlock(lv2_preset_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_preset_finalize(GObject *gobject) { AgsLv2Preset *lv2_preset; lv2_preset = AGS_LV2_PRESET(gobject); /* lv2 plugin */ if(lv2_preset->lv2_plugin != NULL){ g_object_unref(lv2_preset->lv2_plugin); } /* uri */ if(lv2_preset->uri != NULL){ free(lv2_preset->uri); } /* applies to */ if(lv2_preset->applies_to != NULL){ free(lv2_preset->applies_to); } /* bank and preset label */ if(lv2_preset->bank != NULL){ free(lv2_preset->bank); } if(lv2_preset->preset_label != NULL){ free(lv2_preset->preset_label); } /* turtle */ if(lv2_preset->turtle != NULL){ g_object_unref(lv2_preset->turtle); } /* port preset */ if(lv2_preset->port_preset != NULL){ g_list_free_full(lv2_preset->port_preset, (GDestroyNotify) ags_lv2_port_preset_free); } /* call parent */ G_OBJECT_CLASS(ags_lv2_preset_parent_class)->finalize(gobject); } /** * ags_lv2_port_preset_alloc: * @port_symbol: the port symbol * @port_type: the port type * * Allocated #AgsLv2PortPreset-struct. * * Returns: (type gpointer) (transfer none): the new #AgsLv2PortPreset-struct. * * Since: 3.0.0 */ AgsLv2PortPreset* ags_lv2_port_preset_alloc(gchar *port_symbol, GType port_type) { AgsLv2PortPreset *lv2_port_preset; lv2_port_preset = (AgsLv2PortPreset *) malloc(sizeof(AgsLv2PortPreset)); lv2_port_preset->port_symbol = port_symbol; lv2_port_preset->port_value = g_new0(GValue, 1); if(port_type != G_TYPE_NONE){ g_value_init(lv2_port_preset->port_value, port_type); } return(lv2_port_preset); } /** * ags_lv2_port_preset_free: * @lv2_port_preset: (type gpointer) (transfer none): the #AgsLv2PortPreset-struct * * Free @lv2_port_preset. * * Since: 3.0.0 */ void ags_lv2_port_preset_free(AgsLv2PortPreset *lv2_port_preset) { if(lv2_port_preset == NULL){ return; } if(lv2_port_preset->port_symbol != NULL){ free(lv2_port_preset->port_symbol); } if(lv2_port_preset->port_value != NULL){ g_value_unset(lv2_port_preset->port_value); free(lv2_port_preset->port_value); } free(lv2_port_preset); } /** * ags_lv2_preset_parse_turtle: * @lv2_preset: the #AgsLv2Preset * * Parse @lv2_preset. * * Since: 3.0.0 */ void ags_lv2_preset_parse_turtle(AgsLv2Preset *lv2_preset) { //NOTE:JK: deprecated } /** * ags_lv2_preset_find_preset_uri: * @lv2_preset: (element-type AgsAudio.Lv2Preset) (transfer none): the #GList-struct containing #AgsLv2Preset * @preset_uri: the preset URI * * Find @preset_uri within @lv2_preset. * * Returns: (element-type AgsAudio.Lv2Preset) (transfer none): the matching #GList-struct containing #AgsLv2Preset * * Since: 3.0.0 */ GList* ags_lv2_preset_find_preset_uri(GList *lv2_preset, gchar *preset_uri) { if(preset_uri == NULL){ return(NULL); } while(lv2_preset != NULL){ if(AGS_LV2_PRESET(lv2_preset->data)->uri != NULL && !g_ascii_strcasecmp(preset_uri, AGS_LV2_PRESET(lv2_preset->data)->uri)){ return(lv2_preset); } lv2_preset = lv2_preset->next; } return(NULL); } /** * ags_lv2_preset_find_preset_label: * @lv2_preset: (element-type AgsAudio.Lv2Preset) (transfer none): the #GList-struct containing #AgsLv2Preset * @preset_label: the preset label * * Find @preset_label within @lv2_preset. * * Returns: (element-type AgsAudio.Lv2Preset) (transfer none): the matching #GList-struct containing #AgsLv2Preset * * Since: 3.0.0 */ GList* ags_lv2_preset_find_preset_label(GList *lv2_preset, gchar *preset_label) { if(preset_label == NULL){ return(NULL); } while(lv2_preset != NULL){ if(!g_strcmp0(preset_label, AGS_LV2_PRESET(lv2_preset->data)->preset_label)){ return(lv2_preset); } lv2_preset = lv2_preset->next; } return(NULL); } /** * ags_lv2_preset_new: * @lv2_plugin: an #AgsLv2Plugin * @turtle: the #AgsTurtle * @uri: the URI as string * * Create a new instance of #AgsLv2Preset. * * Returns: the new #AgsLv2Preset * * Since: 3.0.0 */ AgsLv2Preset* ags_lv2_preset_new(GObject *lv2_plugin, AgsTurtle *turtle, gchar *uri) { AgsLv2Preset *lv2_preset; lv2_preset = (AgsLv2Preset *) g_object_new(AGS_TYPE_LV2_PRESET, "lv2-plugin", lv2_plugin, "turtle", turtle, "uri", uri, NULL); return(lv2_preset); } gsequencer-3.1.3/ags/plugin/ags_lv2_log_manager.c0000644000175000017500000001067313607210263016713 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_lv2_log_manager_class_init(AgsLv2LogManagerClass *lv2_log_manager); void ags_lv2_log_manager_init(AgsLv2LogManager *lv2_log_manager); void ags_lv2_log_manager_finalize(GObject *gobject); /** * SECTION:ags_lv2_log_manager * @short_description: allow lv2 plugins to log * @title: AgsLv2LogManager * @section_id: * @include: ags/plugin/ags_lv2_log_manager.h * * The #AgsLv2LogManager handles console IO. */ static gpointer ags_lv2_log_manager_parent_class = NULL; AgsLv2LogManager *ags_lv2_log_manager = NULL; GType ags_lv2_log_manager_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_log_manager = 0; const GTypeInfo ags_lv2_log_manager_info = { sizeof (AgsLv2LogManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_log_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2LogManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_log_manager_init, }; ags_type_lv2_log_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2LogManager", &ags_lv2_log_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_log_manager); } return g_define_type_id__volatile; } void ags_lv2_log_manager_class_init(AgsLv2LogManagerClass *lv2_log_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_log_manager_parent_class = g_type_class_peek_parent(lv2_log_manager); /* GObject */ gobject = (GObjectClass *) lv2_log_manager; gobject->finalize = ags_lv2_log_manager_finalize; } void ags_lv2_log_manager_init(AgsLv2LogManager *lv2_log_manager) { /* empty */ } void ags_lv2_log_manager_finalize(GObject *gobject) { /* empty */ /* call parent */ G_OBJECT_CLASS(ags_lv2_log_manager_parent_class)->finalize(gobject); } /** * ags_lv2_log_manager_printf: * @handle: (type gpointer) (transfer none): the log handle * @type: (type gpointer) (transfer none): LV2 URID * @fmt: format * @...: %NULL terminated variable arguments * * Print formatted. * * Returns: 0 * * Since: 3.0.0 */ int ags_lv2_log_manager_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...) { va_list ap; int retval; va_start(ap, fmt); retval = ags_lv2_log_manager_vprintf(handle, type, fmt, ap); va_end(ap); return(retval); } /** * ags_lv2_log_manager_vprintf: * @handle: (type gpointer) (transfer none): the log handle * @type: (type gpointer) (transfer none): LV2 URID * @fmt: format * @ap: argument pointer * * Variadict print formatted. * * Returns: 0 * * Since: 3.0.0 */ int ags_lv2_log_manager_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap) { g_logv(G_LOG_DOMAIN, 0, fmt, ap); return(0); } /** * ags_lv2_log_manager_get_instance: * * Singleton function to optain the id manager instance. * * Returns: (transfer none): an instance of #AgsLv2LogManager * * Since: 3.0.0 */ AgsLv2LogManager* ags_lv2_log_manager_get_instance() { if(ags_lv2_log_manager == NULL){ ags_lv2_log_manager = ags_lv2_log_manager_new(); // ags_lv2_log_manager_load_default(ags_lv2_log_manager); } return(ags_lv2_log_manager); } /** * ags_lv2_log_manager_new: * * Instantiate a id manager. * * Returns: a new #AgsLv2LogManager * * Since: 3.0.0 */ AgsLv2LogManager* ags_lv2_log_manager_new() { AgsLv2LogManager *lv2_log_manager; lv2_log_manager = (AgsLv2LogManager *) g_object_new(AGS_TYPE_LV2_LOG_MANAGER, NULL); return(lv2_log_manager); } gsequencer-3.1.3/ags/plugin/ags_ladspa_plugin.c0000644000175000017500000004155613607210263016503 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include #include #include void ags_ladspa_plugin_class_init(AgsLadspaPluginClass *ladspa_plugin); void ags_ladspa_plugin_init (AgsLadspaPlugin *ladspa_plugin); void ags_ladspa_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ladspa_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ladspa_plugin_finalize(GObject *gobject); gpointer ags_ladspa_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size); void ags_ladspa_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void ags_ladspa_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_ladspa_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_ladspa_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void ags_ladspa_plugin_load_plugin(AgsBasePlugin *base_plugin); /** * SECTION:ags_ladspa_plugin * @short_description: The ladspa plugin class * @title: AgsLadspaPlugin * @section_id: * @include: ags/plugin/ags_ladspa_plugin.h * * The #AgsLadspaPlugin loads/unloads a Ladspa plugin. */ enum{ PROP_0, PROP_UNIQUE_ID, }; static gpointer ags_ladspa_plugin_parent_class = NULL; GType ags_ladspa_plugin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ladspa_plugin = 0; static const GTypeInfo ags_ladspa_plugin_info = { sizeof (AgsLadspaPluginClass), NULL, /* ladspa_init */ NULL, /* ladspa_finalize */ (GClassInitFunc) ags_ladspa_plugin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLadspaPlugin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ladspa_plugin_init, }; ags_type_ladspa_plugin = g_type_register_static(AGS_TYPE_BASE_PLUGIN, "AgsLadspaPlugin", &ags_ladspa_plugin_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_ladspa_plugin); } return g_define_type_id__volatile; } void ags_ladspa_plugin_class_init(AgsLadspaPluginClass *ladspa_plugin) { AgsBasePluginClass *base_plugin; GObjectClass *gobject; GParamSpec *param_spec; ags_ladspa_plugin_parent_class = g_type_class_peek_parent(ladspa_plugin); /* GObjectClass */ gobject = (GObjectClass *) ladspa_plugin; gobject->set_property = ags_ladspa_plugin_set_property; gobject->get_property = ags_ladspa_plugin_get_property; gobject->finalize = ags_ladspa_plugin_finalize; /* properties */ /** * AgsLadspaPlugin:unique-id: * * The assigned unique-id. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("unique-id", i18n_pspec("unique-id of the plugin"), i18n_pspec("The unique-id this plugin is assigned with"), 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UNIQUE_ID, param_spec); /* AgsBasePluginClass */ base_plugin = (AgsBasePluginClass *) ladspa_plugin; base_plugin->instantiate = ags_ladspa_plugin_instantiate; base_plugin->connect_port = ags_ladspa_plugin_connect_port; base_plugin->activate = ags_ladspa_plugin_activate; base_plugin->deactivate = ags_ladspa_plugin_deactivate; base_plugin->run = ags_ladspa_plugin_run; base_plugin->load_plugin = ags_ladspa_plugin_load_plugin; } void ags_ladspa_plugin_init(AgsLadspaPlugin *ladspa_plugin) { ladspa_plugin->unique_id = 0; } void ags_ladspa_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLadspaPlugin *ladspa_plugin; GRecMutex *base_plugin_mutex; ladspa_plugin = AGS_LADSPA_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(ladspa_plugin); switch(prop_id){ case PROP_UNIQUE_ID: { g_rec_mutex_lock(base_plugin_mutex); ladspa_plugin->unique_id = g_value_get_uint(value); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ladspa_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLadspaPlugin *ladspa_plugin; GRecMutex *base_plugin_mutex; ladspa_plugin = AGS_LADSPA_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(ladspa_plugin); switch(prop_id){ case PROP_UNIQUE_ID: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_uint(value, ladspa_plugin->unique_id); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ladspa_plugin_finalize(GObject *gobject) { G_OBJECT_CLASS(ags_ladspa_plugin_parent_class)->finalize(gobject); } gpointer ags_ladspa_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size) { LADSPA_Descriptor *ladspa_descriptor; gpointer ptr; LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor *descriptor, unsigned long ramplerate); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get instantiate */ g_rec_mutex_lock(base_plugin_mutex); ladspa_descriptor = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor); instantiate = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->instantiate; g_rec_mutex_unlock(base_plugin_mutex); /* instantiate */ ptr = instantiate(ladspa_descriptor, (unsigned long) samplerate); return(ptr); } void ags_ladspa_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location) { void (*connect_port)(LADSPA_Handle instance, unsigned long port_index, LADSPA_Data *data_location); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* get connect port */ g_rec_mutex_lock(base_plugin_mutex); connect_port = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->connect_port; g_rec_mutex_unlock(base_plugin_mutex); /* connect port */ connect_port((LADSPA_Handle) plugin_handle, (unsigned long) port_index, (LADSPA_Data *) data_location); } void ags_ladspa_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { void (*activate)(LADSPA_Handle instance); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* activate */ g_rec_mutex_lock(base_plugin_mutex); activate = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->activate; g_rec_mutex_unlock(base_plugin_mutex); if(activate != NULL){ activate((LADSPA_Handle) plugin_handle); } } void ags_ladspa_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { void (*deactivate)(LADSPA_Handle instance); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* deactivate */ g_rec_mutex_lock(base_plugin_mutex); deactivate = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->deactivate; g_rec_mutex_unlock(base_plugin_mutex); if(deactivate != NULL){ deactivate((LADSPA_Handle) plugin_handle); } } void ags_ladspa_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count) { void (*run)(LADSPA_Handle instance, unsigned long sample_count); GRecMutex *base_plugin_mutex; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* run */ g_rec_mutex_lock(base_plugin_mutex); run = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->run; g_rec_mutex_unlock(base_plugin_mutex); run((LADSPA_Handle) plugin_handle, (unsigned long) frame_count); } void ags_ladspa_plugin_load_plugin(AgsBasePlugin *base_plugin) { AgsLadspaPlugin *ladspa_plugin; AgsPluginPort *current_plugin_port; GList *plugin_port; LADSPA_Descriptor_Function ladspa_descriptor; LADSPA_PortDescriptor *port_descriptor; LADSPA_PortRangeHint *range_hint; LADSPA_PortRangeHintDescriptor hint_descriptor; unsigned long effect_index; unsigned long port_count; unsigned long i; gboolean success; GRecMutex *base_plugin_mutex; ladspa_plugin = AGS_LADSPA_PLUGIN(base_plugin); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* dlopen */ g_rec_mutex_lock(base_plugin_mutex); #ifdef AGS_W32API base_plugin->plugin_so = LoadLibrary(base_plugin->filename); #else base_plugin->plugin_so = dlopen(base_plugin->filename, RTLD_NOW); #endif if(base_plugin->plugin_so == NULL){ g_warning("ags_ladspa_plugin.c - failed to load static object file"); #ifndef AGS_W32API dlerror(); #endif g_rec_mutex_unlock(base_plugin_mutex); return; } success = FALSE; #ifdef AGS_W32API base_plugin->plugin_handle = ladspa_descriptor = (LADSPA_Descriptor_Function) GetProcAddress((void *) base_plugin->plugin_so, "ladspa_descriptor"); success = (!ladspa_descriptor) ? FALSE: TRUE; #else base_plugin->plugin_handle = ladspa_descriptor = (LADSPA_Descriptor_Function) dlsym((void *) base_plugin->plugin_so, "ladspa_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif g_rec_mutex_unlock(base_plugin_mutex); if(success && ladspa_descriptor){ gpointer plugin_descriptor; guint unique_id; g_rec_mutex_lock(base_plugin_mutex); effect_index = base_plugin->effect_index; plugin_descriptor = base_plugin->plugin_descriptor = ladspa_descriptor((unsigned long) effect_index); g_rec_mutex_unlock(base_plugin_mutex); if(plugin_descriptor != NULL){ g_rec_mutex_lock(base_plugin_mutex); unique_id = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->UniqueID; port_count = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->PortCount; port_descriptor = AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->PortDescriptors; g_rec_mutex_unlock(base_plugin_mutex); g_object_set(base_plugin, "unique-id", unique_id, NULL); plugin_port = NULL; for(i = 0; i < port_count; i++){ /* create plugin port */ current_plugin_port = ags_plugin_port_new(); g_object_ref(current_plugin_port); plugin_port = g_list_prepend(plugin_port, current_plugin_port); g_rec_mutex_lock(base_plugin_mutex); /* set flags */ if(LADSPA_IS_PORT_INPUT(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_INPUT; }else if(LADSPA_IS_PORT_OUTPUT(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_OUTPUT; } if(LADSPA_IS_PORT_CONTROL(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_CONTROL; }else if(LADSPA_IS_PORT_AUDIO(port_descriptor[i])){ current_plugin_port->flags |= AGS_PLUGIN_PORT_AUDIO; } /* set index and name */ current_plugin_port->port_index = i; current_plugin_port->port_name = g_strdup(AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->PortNames[i]); range_hint = &(AGS_LADSPA_PLUGIN_DESCRIPTOR(base_plugin->plugin_descriptor)->PortRangeHints[i]); hint_descriptor = range_hint->HintDescriptor; g_value_init(current_plugin_port->default_value, G_TYPE_FLOAT); g_value_init(current_plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(current_plugin_port->upper_value, G_TYPE_FLOAT); g_value_set_float(current_plugin_port->default_value, 0.0); if(LADSPA_IS_HINT_TOGGLED(hint_descriptor)){ /* is toggled */ current_plugin_port->flags |= AGS_PLUGIN_PORT_TOGGLED; /* set default */ if(LADSPA_IS_HINT_DEFAULT_0(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 0.0); }else if(LADSPA_IS_HINT_DEFAULT_1(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 1.0); } }else{ /* set lower */ g_value_set_float(current_plugin_port->lower_value, range_hint->LowerBound); /* set upper */ g_value_set_float(current_plugin_port->upper_value, range_hint->UpperBound); /* set default */ g_value_set_float(current_plugin_port->default_value, range_hint->LowerBound); /* bounds */ if(LADSPA_IS_HINT_BOUNDED_BELOW(hint_descriptor)){ if(LADSPA_IS_HINT_SAMPLE_RATE(hint_descriptor)){ current_plugin_port->flags |= (AGS_PLUGIN_PORT_SAMPLERATE | AGS_PLUGIN_PORT_BOUNDED_BELOW); g_value_set_float(current_plugin_port->lower_value, range_hint->LowerBound); } } if(LADSPA_IS_HINT_BOUNDED_ABOVE(hint_descriptor)){ if(LADSPA_IS_HINT_SAMPLE_RATE(hint_descriptor)){ current_plugin_port->flags |= (AGS_PLUGIN_PORT_SAMPLERATE | AGS_PLUGIN_PORT_BOUNDED_ABOVE); g_value_set_float(current_plugin_port->upper_value, range_hint->UpperBound); } } /* integer */ if(LADSPA_IS_HINT_INTEGER(hint_descriptor)){ current_plugin_port->flags |= AGS_PLUGIN_PORT_INTEGER; current_plugin_port->scale_steps = range_hint->UpperBound - range_hint->LowerBound; } /* logarithmic */ if(LADSPA_IS_HINT_LOGARITHMIC(hint_descriptor)){ current_plugin_port->flags |= AGS_PLUGIN_PORT_LOGARITHMIC; } /* set default value */ if(LADSPA_IS_HINT_DEFAULT_MINIMUM(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, range_hint->LowerBound); }else if(LADSPA_IS_HINT_DEFAULT_LOW(hint_descriptor)){ float default_value; default_value = 0.75 * range_hint->LowerBound + 0.25 * range_hint->UpperBound; g_value_set_float(current_plugin_port->default_value, default_value); }else if(LADSPA_IS_HINT_DEFAULT_MIDDLE(hint_descriptor)){ float default_value; default_value = (0.5 * range_hint->LowerBound) + (0.5 * range_hint->UpperBound); g_value_set_float(current_plugin_port->default_value, default_value); }else if(LADSPA_IS_HINT_DEFAULT_HIGH(hint_descriptor)){ float default_value; default_value = 0.25 * range_hint->LowerBound + 0.75 * range_hint->UpperBound; g_value_set_float(current_plugin_port->default_value, default_value); }else if(LADSPA_IS_HINT_DEFAULT_MAXIMUM(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, range_hint->UpperBound); }else if(LADSPA_IS_HINT_DEFAULT_100(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 100.0); }else if(LADSPA_IS_HINT_DEFAULT_440(hint_descriptor)){ g_value_set_float(current_plugin_port->default_value, 440.0); } } g_rec_mutex_unlock(base_plugin_mutex); } base_plugin->plugin_port = g_list_reverse(plugin_port); } } } /** * ags_ladspa_plugin_new: * @filename: the plugin .so * @effect: the effect's string representation * @effect_index: the effect's index * * Creates an #AgsLadspaPlugin * * Returns: a new #AgsLadspaPlugin * * Since: 3.0.0 */ AgsLadspaPlugin* ags_ladspa_plugin_new(gchar *filename, gchar *effect, guint effect_index) { AgsLadspaPlugin *ladspa_plugin; ladspa_plugin = (AgsLadspaPlugin *) g_object_new(AGS_TYPE_LADSPA_PLUGIN, "filename", filename, "effect", effect, "effect-index", effect_index, NULL); return(ladspa_plugin); } gsequencer-3.1.3/ags/plugin/ags_lv2_preset.h0000644000175000017500000000615513607210263015747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_PRESET_H__ #define __AGS_LV2_PRESET_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_PRESET (ags_lv2_preset_get_type()) #define AGS_LV2_PRESET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_PRESET, AgsLv2Preset)) #define AGS_LV2_PRESET_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_PRESET, AgsLv2PresetClass)) #define AGS_IS_LV2_PRESET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_PRESET)) #define AGS_IS_LV2_PRESET_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_PRESET)) #define AGS_LV2_PRESET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_PRESET, AgsLv2PresetClass)) #define AGS_LV2_PRESET_GET_OBJ_MUTEX(obj) (&(((AgsLv2Preset *) obj)->obj_mutex)) #define AGS_LV2_PORT_PRESET(ptr) ((AgsLv2PortPreset*)(ptr)) typedef struct _AgsLv2Preset AgsLv2Preset; typedef struct _AgsLv2PresetClass AgsLv2PresetClass; typedef struct _AgsLv2PortPreset AgsLv2PortPreset; /** * AgsLv2PresetFlags: * @AGS_LV2_PRESET_CONNECTED: indicates the port was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsLv2Preset by * enable/disable as flags. */ typedef enum{ AGS_LV2_PRESET_CONNECTED = 1, }AgsLv2PresetFlags; struct _AgsLv2Preset { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *lv2_plugin; gchar *uri; gchar *applies_to; gchar *bank; gchar *preset_label; AgsTurtle *manifest; AgsTurtle *turtle; GList *port_preset; }; struct _AgsLv2PresetClass { GObjectClass gobject; }; struct _AgsLv2PortPreset { gchar *port_symbol; GValue *port_value; }; GType ags_lv2_preset_get_type(void); AgsLv2PortPreset* ags_lv2_port_preset_alloc(gchar *port_symbol, GType port_type); void ags_lv2_port_preset_free(AgsLv2PortPreset *lv2_port_preset); void ags_lv2_preset_parse_turtle(AgsLv2Preset *lv2_preset); GList* ags_lv2_preset_find_preset_uri(GList *lv2_preset, gchar *preset_uri); GList* ags_lv2_preset_find_preset_label(GList *lv2_preset, gchar *preset_label); AgsLv2Preset* ags_lv2_preset_new(GObject *lv2_plugin, AgsTurtle *turtle, gchar *uri); G_END_DECLS #endif /*__AGS_LV2_PRESET_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_uri_map_manager.c0000644000175000017500000002030613607210263017560 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_lv2_uri_map_manager_class_init(AgsLv2UriMapManagerClass *lv2_uri_map_manager); void ags_lv2_uri_map_manager_init(AgsLv2UriMapManager *lv2_uri_map_manager); void ags_lv2_uri_map_manager_finalize(GObject *gobject); void ags_lv2_uri_map_manager_destroy_data(gpointer data); /** * SECTION:ags_lv2_uri_map_manager * @short_description: lv2 uri map manager * @title: AgsLv2UriMapManager * @section_id: * @include: ags/plugin/ags_lv2_uri_map_manager.h * * The #AgsLv2UriMapManager keeps your uri in a hash table where you can lookup your * ids. */ static gpointer ags_lv2_uri_map_manager_parent_class = NULL; AgsLv2UriMapManager *ags_lv2_uri_map_manager = NULL; GType ags_lv2_uri_map_manager_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_uri_map_manager = 0; const GTypeInfo ags_lv2_uri_map_manager_info = { sizeof (AgsLv2UriMapManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_uri_map_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2UriMapManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_uri_map_manager_init, }; ags_type_lv2_uri_map_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2UriMapManager", &ags_lv2_uri_map_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_uri_map_manager); } return g_define_type_id__volatile; } void ags_lv2_uri_map_manager_class_init(AgsLv2UriMapManagerClass *lv2_uri_map_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_uri_map_manager_parent_class = g_type_class_peek_parent(lv2_uri_map_manager); /* GObject */ gobject = (GObjectClass *) lv2_uri_map_manager; gobject->finalize = ags_lv2_uri_map_manager_finalize; } void ags_lv2_uri_map_manager_init(AgsLv2UriMapManager *lv2_uri_map_manager) { /* lv2 uri map manager mutex */ g_rec_mutex_init(&(lv2_uri_map_manager->obj_mutex)); lv2_uri_map_manager->id_counter = 1; lv2_uri_map_manager->uri_map = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify) ags_lv2_uri_map_manager_destroy_data); } void ags_lv2_uri_map_manager_finalize(GObject *gobject) { AgsLv2UriMapManager *lv2_uri_map_manager; lv2_uri_map_manager = AGS_LV2_URI_MAP_MANAGER(gobject); g_hash_table_destroy(lv2_uri_map_manager->uri_map); if(lv2_uri_map_manager == ags_lv2_uri_map_manager){ ags_lv2_uri_map_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_uri_map_manager_parent_class)->finalize(gobject); } void ags_lv2_uri_map_manager_destroy_data(gpointer data) { /* empty */ } /** * ags_lv2_uri_map_manager_insert: * @lv2_uri_map_manager: the #AgsLv2UriMapManager * @uri: the object as key * @id: the id to insert * * Inserts a id into hash map associated with @uri. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_uri_map_manager_insert(AgsLv2UriMapManager *lv2_uri_map_manager, gchar *uri, GValue *id) { GRecMutex *lv2_uri_map_manager_mutex; if(!AGS_LV2_URI_MAP_MANAGER(lv2_uri_map_manager) || uri == NULL || id == NULL){ return(FALSE); } /* get lv2 uri map manager mutex */ lv2_uri_map_manager_mutex = AGS_LV2_URI_MAP_MANAGER_GET_OBJ_MUTEX(lv2_uri_map_manager); /* */ g_rec_mutex_lock(lv2_uri_map_manager_mutex); g_hash_table_insert(lv2_uri_map_manager->uri_map, uri, id); g_rec_mutex_unlock(lv2_uri_map_manager_mutex); return(TRUE); } /** * ags_lv2_uri_map_manager_remove: * @lv2_uri_map_manager: the #AgsLv2UriMapManager * @uri: the object to remove * * Removes a lock associated with @uri.3 * * Returns: %TRUE as successfully removed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_uri_map_manager_remove(AgsLv2UriMapManager *lv2_uri_map_manager, gchar *uri) { GValue *id; GRecMutex *lv2_uri_map_manager_mutex; if(!AGS_LV2_URI_MAP_MANAGER(lv2_uri_map_manager)){ return(FALSE); } /* get lv2 uri map manager mutex */ lv2_uri_map_manager_mutex = AGS_LV2_URI_MAP_MANAGER_GET_OBJ_MUTEX(lv2_uri_map_manager); /* */ g_rec_mutex_lock(lv2_uri_map_manager_mutex); id = g_hash_table_lookup(lv2_uri_map_manager->uri_map, uri); if(id != NULL){ g_hash_table_remove(lv2_uri_map_manager->uri_map, uri); } g_rec_mutex_unlock(lv2_uri_map_manager_mutex); return(TRUE); } /** * ags_lv2_uri_map_manager_lookup: * @lv2_uri_map_manager: the #AgsLv2UriMapManager * @uri: the object to lookup * * Lookup a id associated with @uri in @lv2_uri_map_manager * * Returns: the id on success, else G_MAXUINT32 * * Since: 3.0.0 */ GValue* ags_lv2_uri_map_manager_lookup(AgsLv2UriMapManager *lv2_uri_map_manager, gchar *uri) { GValue *value; GRecMutex *lv2_uri_map_manager_mutex; if(!AGS_LV2_URI_MAP_MANAGER(lv2_uri_map_manager)){ return(NULL); } /* get lv2 uri map manager mutex */ lv2_uri_map_manager_mutex = AGS_LV2_URI_MAP_MANAGER_GET_OBJ_MUTEX(lv2_uri_map_manager); /* */ g_rec_mutex_lock(lv2_uri_map_manager_mutex); value = (GValue *) g_hash_table_lookup(lv2_uri_map_manager->uri_map, uri); if(value == NULL){ g_message("new uri %s", uri); value = g_new0(GValue, 1); g_value_init(value, G_TYPE_ULONG); g_value_set_ulong(value, lv2_uri_map_manager->id_counter); ags_lv2_uri_map_manager_insert(lv2_uri_map_manager, uri, value); lv2_uri_map_manager->id_counter++; } g_rec_mutex_unlock(lv2_uri_map_manager_mutex); return(value); } void ags_lv2_uri_map_manager_load_default(AgsLv2UriMapManager *lv2_uri_map_manager) { GValue *value; gchar **str; static const gchar *default_uri[] = { NULL, }; str = default_uri; while(str[0] != NULL){ value = g_new0(GValue, 1); g_value_init(value, G_TYPE_ULONG); g_value_set_ulong(value, lv2_uri_map_manager->id_counter); ags_lv2_uri_map_manager_insert(lv2_uri_map_manager, *str, value); lv2_uri_map_manager->id_counter++; str++; } } uint32_t ags_lv2_uri_map_manager_uri_to_id(LV2_URI_Map_Callback_Data callback_data, char *map, char *uri) { GValue *value; uint32_t id; if(map != NULL){ uri = g_strdup_printf("%s<%s>", map, uri); } value = ags_lv2_uri_map_manager_lookup(ags_lv2_uri_map_manager_get_instance(), uri); id = g_value_get_ulong(value); return(id); } /** * ags_lv2_uri_map_manager_get_instance: * * Singleton function to optain the id manager instance. * * Returns: (transfer none): an instance of #AgsLv2UriMapManager * * Since: 3.0.0 */ AgsLv2UriMapManager* ags_lv2_uri_map_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2_uri_map_manager == NULL){ ags_lv2_uri_map_manager = ags_lv2_uri_map_manager_new(); // ags_lv2_uri_map_manager_load_default(ags_lv2_uri_map_manager); } g_mutex_unlock(&mutex); return(ags_lv2_uri_map_manager); } /** * ags_lv2_uri_map_manager_new: * * Instantiate a id manager. * * Returns: a new #AgsLv2UriMapManager * * Since: 3.0.0 */ AgsLv2UriMapManager* ags_lv2_uri_map_manager_new() { AgsLv2UriMapManager *lv2_uri_map_manager; lv2_uri_map_manager = (AgsLv2UriMapManager *) g_object_new(AGS_TYPE_LV2_URI_MAP_MANAGER, NULL); return(lv2_uri_map_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2_urid_manager.c0000644000175000017500000002103513616617253017101 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_lv2_urid_manager_class_init(AgsLv2UridManagerClass *lv2_urid_manager); void ags_lv2_urid_manager_init(AgsLv2UridManager *lv2_urid_manager); void ags_lv2_urid_manager_finalize(GObject *gobject); void ags_lv2_urid_manager_destroy_data(gpointer data); gboolean ags_lv2_urid_manager_finder(gpointer key, gpointer value, gpointer user_data); /** * SECTION:ags_lv2_urid_manager * @short_description: LV2 urid manager * @title: AgsLv2UridManager * @section_id: * @include: ags/plugin/ags_lv2_urid_manager.h * * The #AgsLv2UridManager keeps your urid in a hash table where you can lookup your * ids. */ static gpointer ags_lv2_urid_manager_parent_class = NULL; AgsLv2UridManager *ags_lv2_urid_manager = NULL; GType ags_lv2_urid_manager_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_urid_manager = 0; const GTypeInfo ags_lv2_urid_manager_info = { sizeof (AgsLv2UridManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_urid_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2UridManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_urid_manager_init, }; ags_type_lv2_urid_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2UridManager", &ags_lv2_urid_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_urid_manager); } return g_define_type_id__volatile; } void ags_lv2_urid_manager_class_init(AgsLv2UridManagerClass *lv2_urid_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_urid_manager_parent_class = g_type_class_peek_parent(lv2_urid_manager); /* GObject */ gobject = (GObjectClass *) lv2_urid_manager; gobject->finalize = ags_lv2_urid_manager_finalize; } void ags_lv2_urid_manager_init(AgsLv2UridManager *lv2_urid_manager) { /* lv2 urid manager mutex */ g_rec_mutex_init(&(lv2_urid_manager->obj_mutex)); lv2_urid_manager->id_counter = 1; lv2_urid_manager->urid = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify) ags_lv2_urid_manager_destroy_data); } void ags_lv2_urid_manager_finalize(GObject *gobject) { AgsLv2UridManager *lv2_urid_manager; lv2_urid_manager = AGS_LV2_URID_MANAGER(gobject); g_hash_table_destroy(lv2_urid_manager->urid); if(lv2_urid_manager == ags_lv2_urid_manager){ ags_lv2_urid_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_urid_manager_parent_class)->finalize(gobject); } void ags_lv2_urid_manager_destroy_data(gpointer data) { /* empty */ } gboolean ags_lv2_urid_manager_finder(gpointer key, gpointer value, gpointer user_data) { if((uint32_t) g_value_get_uint((GValue *) value) == (uint32_t) g_value_get_uint((GValue *) user_data)){ return(TRUE); } return(FALSE); } /** * ags_lv2_urid_manager_insert: * @lv2_urid_manager: the #AgsLv2UridManager * @uri: the object as key * @id: the id to insert * * Inserts a id into hash associated with @urid. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_urid_manager_insert(AgsLv2UridManager *lv2_urid_manager, gchar *uri, GValue *id) { GRecMutex *lv2_urid_manager_mutex; if(lv2_urid_manager == NULL || uri == NULL || id == NULL){ return(FALSE); } /* get lv2 uri map manager mutex */ lv2_urid_manager_mutex = AGS_LV2_URID_MANAGER_GET_OBJ_MUTEX(lv2_urid_manager); /* */ g_rec_mutex_lock(lv2_urid_manager_mutex); g_hash_table_insert(lv2_urid_manager->urid, uri, id); g_rec_mutex_unlock(lv2_urid_manager_mutex); return(TRUE); } /** * ags_lv2_urid_manager_remove: * @lv2_urid_manager: the #AgsLv2UridManager * @uri: the object to remove * * Removes an entry associated with @urid. * * Returns: %TRUE as successfully removed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_urid_manager_remove(AgsLv2UridManager *lv2_urid_manager, gchar *uri) { GValue *id; GRecMutex *lv2_urid_manager_mutex; /* get lv2 uri map manager mutex */ lv2_urid_manager_mutex = AGS_LV2_URID_MANAGER_GET_OBJ_MUTEX(lv2_urid_manager); /* */ g_rec_mutex_lock(lv2_urid_manager_mutex); id = g_hash_table_lookup(lv2_urid_manager->urid, uri); if(id != NULL){ g_hash_table_remove(lv2_urid_manager->urid, uri); } g_rec_mutex_unlock(lv2_urid_manager_mutex); return(TRUE); } /** * ags_lv2_urid_manager_lookup: * @lv2_urid_manager: the #AgsLv2UridManager * @uri: the object to lookup * * Lookup a id associated with @urid in @lv2_urid_manager * * Returns: the id on success, else the newly created id * * Since: 3.0.0 */ GValue* ags_lv2_urid_manager_lookup(AgsLv2UridManager *lv2_urid_manager, gchar *uri) { GValue *value; GRecMutex *lv2_urid_manager_mutex; /* get lv2 uri map manager mutex */ lv2_urid_manager_mutex = AGS_LV2_URID_MANAGER_GET_OBJ_MUTEX(lv2_urid_manager); /* */ g_rec_mutex_lock(lv2_urid_manager_mutex); value = (GValue *) g_hash_table_lookup(lv2_urid_manager->urid, uri); if(value == NULL){ g_message("new uri %s", uri); value = g_new0(GValue, 1); g_value_init(value, G_TYPE_ULONG); g_value_set_ulong(value, lv2_urid_manager->id_counter); ags_lv2_urid_manager_insert(lv2_urid_manager, g_strdup(uri), value); lv2_urid_manager->id_counter++; } g_rec_mutex_unlock(lv2_urid_manager_mutex); return(value); } void ags_lv2_urid_manager_load_default(AgsLv2UridManager *lv2_urid_manager) { GValue *value; gchar **str; static const gchar *default_uri[] = { NULL, }; str = default_uri; while(str[0] != NULL){ value = g_new0(GValue, 1); g_value_init(value, G_TYPE_ULONG); g_value_set_ulong(value, lv2_urid_manager->id_counter); ags_lv2_urid_manager_insert(lv2_urid_manager, g_strdup(str[0]), value); lv2_urid_manager->id_counter++; str++; } } uint32_t ags_lv2_urid_manager_map(LV2_URID_Map_Handle handle, char *uri) { GValue *value; uint32_t id; value = ags_lv2_urid_manager_lookup(ags_lv2_urid_manager_get_instance(), uri); id = g_value_get_ulong(value); return(id); } const char* ags_lv2_urid_manager_unmap(LV2_URID_Map_Handle handle, uint32_t urid) { AgsLv2UridManager *lv2_urid_manager; GList *key, *key_start; gpointer data, tmp; lv2_urid_manager = ags_lv2_urid_manager_get_instance(); key_start = key = g_hash_table_get_keys(lv2_urid_manager->urid); data = NULL; while(key != NULL){ tmp = (gpointer) g_hash_table_lookup(lv2_urid_manager->urid, key->data); if(urid == g_value_get_ulong((GValue *) tmp)){ ags_lv2_urid_manager_remove(lv2_urid_manager, key->data); data = tmp; break; } key = key->next; } g_list_free(key_start); return(data); } /** * ags_lv2_urid_manager_get_instance: * * Singleton function to optain the id manager instance. * * Returns: (transfer none): an instance of #AgsLv2UridManager * * Since: 3.0.0 */ AgsLv2UridManager* ags_lv2_urid_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2_urid_manager == NULL){ ags_lv2_urid_manager = ags_lv2_urid_manager_new(); // ags_lv2_urid_manager_load_default(ags_lv2_urid_manager); } g_mutex_unlock(&mutex); return(ags_lv2_urid_manager); } /** * ags_lv2_urid_manager_new: * * Instantiate a id manager. * * Returns: a new #AgsLv2UridManager * * Since: 3.0.0 */ AgsLv2UridManager* ags_lv2_urid_manager_new() { AgsLv2UridManager *lv2_urid_manager; lv2_urid_manager = (AgsLv2UridManager *) g_object_new(AGS_TYPE_LV2_URID_MANAGER, NULL); return(lv2_urid_manager); } gsequencer-3.1.3/ags/plugin/ags_ladspa_manager.c0000644000175000017500000004056513607210263016616 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #if defined(AGS_W32API) #include #else #include #endif #include #include #include #include #include #include #include #include #include void ags_ladspa_manager_class_init(AgsLadspaManagerClass *ladspa_manager); void ags_ladspa_manager_init (AgsLadspaManager *ladspa_manager); void ags_ladspa_manager_dispose(GObject *gobject); void ags_ladspa_manager_finalize(GObject *gobject); /** * SECTION:ags_ladspa_manager * @short_description: Singleton pattern to organize LADSPA * @title: AgsLadspaManager * @section_id: * @include: ags/plugin/ags_ladspa_manager.h * * The #AgsLadspaManager loads/unloads LADSPA plugins. */ enum{ ADD, CREATE, LAST_SIGNAL, }; static gpointer ags_ladspa_manager_parent_class = NULL; AgsLadspaManager *ags_ladspa_manager = NULL; gchar **ags_ladspa_default_path = NULL; GType ags_ladspa_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ladspa_manager = 0; static const GTypeInfo ags_ladspa_manager_info = { sizeof (AgsLadspaManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ladspa_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLadspaManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ladspa_manager_init, }; ags_type_ladspa_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLadspaManager", &ags_ladspa_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_ladspa_manager); } return g_define_type_id__volatile; } void ags_ladspa_manager_class_init(AgsLadspaManagerClass *ladspa_manager) { GObjectClass *gobject; ags_ladspa_manager_parent_class = g_type_class_peek_parent(ladspa_manager); /* GObjectClass */ gobject = (GObjectClass *) ladspa_manager; gobject->dispose = ags_ladspa_manager_dispose; gobject->finalize = ags_ladspa_manager_finalize; } void ags_ladspa_manager_init(AgsLadspaManager *ladspa_manager) { /* ladspa manager mutex */ g_rec_mutex_init(&(ladspa_manager->obj_mutex)); /* ladspa plugin and path */ ladspa_manager->ladspa_plugin = NULL; if(ags_ladspa_default_path == NULL){ gchar *ladspa_env; if((ladspa_env = getenv("LADSPA_PATH")) != NULL){ gchar *iter, *next; guint i; ags_ladspa_default_path = (gchar **) malloc(sizeof(gchar *)); iter = ladspa_env; i = 0; while((next = strchr(iter, G_SEARCHPATH_SEPARATOR)) != NULL){ ags_ladspa_default_path = (gchar **) realloc(ags_ladspa_default_path, (i + 2) * sizeof(gchar *)); ags_ladspa_default_path[i] = g_strndup(iter, next - iter); iter = next + 1; i++; } if(*iter != '\0'){ ags_ladspa_default_path = (gchar **) realloc(ags_ladspa_default_path, (i + 2) * sizeof(gchar *)); ags_ladspa_default_path[i] = g_strdup(iter); i++; } ags_ladspa_default_path[i] = NULL; }else{ #if defined(AGS_W32API) AgsApplicationContext *application_context; gchar *app_dir; gchar *path; guint i; i = 0; application_context = ags_application_context_get_instance(); app_dir = NULL; if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } ags_ladspa_default_path = (gchar **) malloc(2 * sizeof(gchar *)); path = g_strdup_printf("%s\\ladspa", g_get_current_dir()); if(g_file_test(path, G_FILE_TEST_IS_DIR)){ ags_ladspa_default_path[i++] = path; }else{ g_free(path); if(g_path_is_absolute(app_dir)){ ags_ladspa_default_path[i++] = g_strdup_printf("%s\\ladspa", app_dir); }else{ ags_ladspa_default_path[i++] = g_strdup_printf("%s\\%s\\ladspa", g_get_current_dir(), app_dir); } } ags_ladspa_default_path[i++] = NULL; g_free(app_dir); #else gchar *home_dir; guint i; #ifdef AGS_MAC_BUNDLE if((home_dir = getenv("HOME")) != NULL){ ags_ladspa_default_path = (gchar **) malloc(7 * sizeof(gchar *)); }else{ ags_ladspa_default_path = (gchar **) malloc(6 * sizeof(gchar *)); } #else if((home_dir = getenv("HOME")) != NULL){ ags_ladspa_default_path = (gchar **) malloc(6 * sizeof(gchar *)); }else{ ags_ladspa_default_path = (gchar **) malloc(5 * sizeof(gchar *)); } #endif i = 0; #ifdef AGS_MAC_BUNDLE ags_ladspa_default_path[i++] = g_strdup_printf("%s/ladspa", getenv("GSEQUENCER_PLUGIN_DIR")); #endif ags_ladspa_default_path[i++] = g_strdup("/usr/lib64/ladspa"); ags_ladspa_default_path[i++] = g_strdup("/usr/local/lib64/ladspa"); ags_ladspa_default_path[i++] = g_strdup("/usr/lib/ladspa"); ags_ladspa_default_path[i++] = g_strdup("/usr/local/lib/ladspa"); if(home_dir != NULL){ ags_ladspa_default_path[i++] = g_strdup_printf("%s/.ladspa", home_dir); } ags_ladspa_default_path[i++] = NULL; #endif } } } void ags_ladspa_manager_dispose(GObject *gobject) { AgsLadspaManager *ladspa_manager; ladspa_manager = AGS_LADSPA_MANAGER(gobject); if(ladspa_manager->ladspa_plugin != NULL){ g_list_free_full(ladspa_manager->ladspa_plugin, (GDestroyNotify) g_object_unref); ladspa_manager->ladspa_plugin = NULL; } /* call parent */ G_OBJECT_CLASS(ags_ladspa_manager_parent_class)->dispose(gobject); } void ags_ladspa_manager_finalize(GObject *gobject) { AgsLadspaManager *ladspa_manager; GList *ladspa_plugin; ladspa_manager = AGS_LADSPA_MANAGER(gobject); ladspa_plugin = ladspa_manager->ladspa_plugin; g_list_free_full(ladspa_plugin, (GDestroyNotify) g_object_unref); if(ladspa_manager == ags_ladspa_manager){ ags_ladspa_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_ladspa_manager_parent_class)->finalize(gobject); } /** * ags_ladspa_manager_get_default_path: * * Get ladspa manager default plugin path. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer none): the plugin default search path as a string vector * * Since: 3.0.0 */ gchar** ags_ladspa_manager_get_default_path() { return(ags_ladspa_default_path); } /** * ags_ladspa_manager_set_default_path: * @default_path: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector array to use as default path * * Set ladspa manager default plugin path. * * Since: 3.0.0 */ void ags_ladspa_manager_set_default_path(gchar** default_path) { ags_ladspa_default_path = default_path; } /** * ags_ladspa_manager_get_filenames: * @ladspa_manager: the #AgsLadspaManager * * Retrieve all filenames * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL-terminated array of filenames * * Since: 3.0.0 */ gchar** ags_ladspa_manager_get_filenames(AgsLadspaManager *ladspa_manager) { GList *start_ladspa_plugin, *ladspa_plugin; gchar **filenames; guint i; gboolean contains_filename; GRecMutex *ladspa_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LADSPA_MANAGER(ladspa_manager)){ return(NULL); } /* get ladspa manager mutex */ ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager); /* collect */ g_rec_mutex_lock(ladspa_manager_mutex); ladspa_plugin = start_ladspa_plugin = g_list_copy(ladspa_manager->ladspa_plugin); g_rec_mutex_unlock(ladspa_manager_mutex); filenames = NULL; for(i = 0; ladspa_plugin != NULL;){ gchar *filename; /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(ladspa_plugin->data); /* duplicate filename */ g_rec_mutex_lock(base_plugin_mutex); filename = g_strdup(AGS_BASE_PLUGIN(ladspa_plugin->data)->filename); g_rec_mutex_unlock(base_plugin_mutex); if(filenames == NULL){ filenames = (gchar **) malloc(2 * sizeof(gchar *)); /* set filename */ filenames[i] = filename; /* terminate */ filenames[i + 1] = NULL; i++; }else{ #ifdef HAVE_GLIB_2_44 contains_filename = g_strv_contains(filenames, AGS_BASE_PLUGIN(ladspa_plugin->data)->filename); #else contains_filename = ags_strv_contains(filenames, AGS_BASE_PLUGIN(ladspa_plugin->data)->filename); #endif if(!contains_filename){ filenames = (gchar **) realloc(filenames, (i + 2) * sizeof(gchar *)); filenames[i] = filename; filenames[i + 1] = NULL; i++; }else{ g_free(filename); } } ladspa_plugin = ladspa_plugin->next; } g_list_free(start_ladspa_plugin); return(filenames); } /** * ags_ladspa_manager_find_ladspa_plugin: * @ladspa_manager: the #AgsLadspaManager * @filename: the filename of the plugin * @effect: the effect's name * * Lookup filename in loaded plugins. * * Returns: (transfer none): the #AgsLadspaPlugin * * Since: 3.0.0 */ AgsLadspaPlugin* ags_ladspa_manager_find_ladspa_plugin(AgsLadspaManager *ladspa_manager, gchar *filename, gchar *effect) { AgsLadspaPlugin *ladspa_plugin; GList *start_list, *list; gboolean success; GRecMutex *ladspa_manager_mutex; GRecMutex *base_plugin_mutex; if(!AGS_IS_LADSPA_MANAGER(ladspa_manager)){ return(NULL); } /* get ladspa manager mutex */ ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager); /* collect */ g_rec_mutex_lock(ladspa_manager_mutex); list = start_list = g_list_copy(ladspa_manager->ladspa_plugin); g_rec_mutex_unlock(ladspa_manager_mutex); success = FALSE; while(list != NULL){ ladspa_plugin = AGS_LADSPA_PLUGIN(list->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(ladspa_plugin); /* check filename and effect */ g_rec_mutex_lock(base_plugin_mutex); success = (!g_strcmp0(AGS_BASE_PLUGIN(ladspa_plugin)->filename, filename) && !g_strcmp0(AGS_BASE_PLUGIN(ladspa_plugin)->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ break; } list = list->next; } g_list_free(start_list); if(!success){ ladspa_plugin = NULL; } return(ladspa_plugin); } /** * ags_ladspa_manager_load_blacklist: * @ladspa_manager: the #AgsLadspaManager * @blacklist_filename: the filename as string * * Load blacklisted plugin filenames. * * Since: 3.0.0 */ void ags_ladspa_manager_load_blacklist(AgsLadspaManager *ladspa_manager, gchar *blacklist_filename) { GRecMutex *ladspa_manager_mutex; if(!AGS_IS_LADSPA_MANAGER(ladspa_manager) || blacklist_filename == NULL){ return; } /* get ladspa manager mutex */ ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager); /* fill in */ g_rec_mutex_lock(ladspa_manager_mutex); if(g_file_test(blacklist_filename, (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))){ FILE *file; gchar *str; file = fopen(blacklist_filename, "r"); #ifndef AGS_W32API while(getline(&str, NULL, file) != -1){ ladspa_manager->ladspa_plugin_blacklist = g_list_prepend(ladspa_manager->ladspa_plugin_blacklist, str); } #endif } g_rec_mutex_unlock(ladspa_manager_mutex); } /** * ags_ladspa_manager_load_file: * @ladspa_manager: the #AgsLadspaManager * @ladspa_path: the LADSPA path * @filename: the filename of the plugin * * Load @filename specified plugin. * * Since: 3.0.0 */ void ags_ladspa_manager_load_file(AgsLadspaManager *ladspa_manager, gchar *ladspa_path, gchar *filename) { AgsLadspaPlugin *ladspa_plugin; gchar *path; gchar *effect; void *plugin_so; LADSPA_Descriptor_Function ladspa_descriptor; LADSPA_Descriptor *plugin_descriptor; unsigned long i; gboolean success; GRecMutex *ladspa_manager_mutex; if(!AGS_IS_LADSPA_MANAGER(ladspa_manager) || ladspa_path == NULL || filename == NULL){ return; } /* get ladspa manager mutex */ ladspa_manager_mutex = AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(ladspa_manager); /* load */ g_rec_mutex_lock(ladspa_manager_mutex); path = g_strdup_printf("%s%c%s", ladspa_path, G_DIR_SEPARATOR, filename); g_message("ags_ladspa_manager.c loading - %s", path); #ifdef AGS_W32API plugin_so = LoadLibrary(path); #else plugin_so = dlopen(path, RTLD_NOW); #endif if(plugin_so == NULL){ g_warning("ags_ladspa_manager.c - failed to load static object file"); #ifndef AGS_W32API dlerror(); #endif g_rec_mutex_unlock(ladspa_manager_mutex); return; } success = FALSE; #ifdef AGS_W32API ladspa_descriptor = (LADSPA_Descriptor_Function) GetProcAddress((void *) plugin_so, "ladspa_descriptor"); success = (!ladspa_descriptor) ? FALSE: TRUE; #else ladspa_descriptor = (LADSPA_Descriptor_Function) dlsym((void *) plugin_so, "ladspa_descriptor"); success = (dlerror() == NULL) ? TRUE: FALSE; #endif if(success && ladspa_descriptor){ for(i = 0; (plugin_descriptor = ladspa_descriptor(i)) != NULL; i++){ if(ags_base_plugin_find_effect(ladspa_manager->ladspa_plugin, path, plugin_descriptor->Name) == NULL){ ladspa_plugin = ags_ladspa_plugin_new(path, plugin_descriptor->Name, i); ags_base_plugin_load_plugin((AgsBasePlugin *) ladspa_plugin); ladspa_manager->ladspa_plugin = g_list_prepend(ladspa_manager->ladspa_plugin, ladspa_plugin); } } } g_rec_mutex_unlock(ladspa_manager_mutex); g_free(path); } /** * ags_ladspa_manager_load_default_directory: * @ladspa_manager: the #AgsLadspaManager * * Loads all available plugins. * * Since: 3.0.0 */ void ags_ladspa_manager_load_default_directory(AgsLadspaManager *ladspa_manager) { AgsLadspaPlugin *ladspa_plugin; GDir *dir; gchar **ladspa_path; gchar *filename; GError *error; if(!AGS_IS_LADSPA_MANAGER(ladspa_manager)){ return; } ladspa_path = ags_ladspa_default_path; while(*ladspa_path != NULL){ if(!g_file_test(*ladspa_path, G_FILE_TEST_EXISTS)){ ladspa_path++; continue; } error = NULL; dir = g_dir_open(*ladspa_path, 0, &error); if(error != NULL){ g_warning("%s", error->message); ladspa_path++; g_error_free(error); continue; } while((filename = g_dir_read_name(dir)) != NULL){ if(g_str_has_suffix(filename, AGS_LIBRARY_SUFFIX) && !g_list_find_custom(ladspa_manager->ladspa_plugin_blacklist, filename, strcmp)){ ags_ladspa_manager_load_file(ladspa_manager, *ladspa_path, filename); } } ladspa_path++; } } /** * ags_ladspa_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsLadspaManager * * Since: 3.0.0 */ AgsLadspaManager* ags_ladspa_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_ladspa_manager == NULL){ ags_ladspa_manager = ags_ladspa_manager_new(); } g_mutex_unlock(&mutex); return(ags_ladspa_manager); } /** * ags_ladspa_manager_new: * * Create a new instance of #AgsLadspaManager * * Returns: the new #AgsLadspaManager * * Since: 3.0.0 */ AgsLadspaManager* ags_ladspa_manager_new() { AgsLadspaManager *ladspa_manager; ladspa_manager = (AgsLadspaManager *) g_object_new(AGS_TYPE_LADSPA_MANAGER, NULL); return(ladspa_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2_uri_map_manager.h0000644000175000017500000000554013607210263017570 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_URI_MAP_MANAGER_H__ #define __AGS_LV2_URI_MAP_MANAGER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_URI_MAP_MANAGER (ags_lv2_uri_map_manager_get_type()) #define AGS_LV2_URI_MAP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_URI_MAP_MANAGER, AgsLv2UriMapManager)) #define AGS_LV2_URI_MAP_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_URI_MAP_MANAGER, AgsLv2UriMapManagerClass)) #define AGS_IS_LV2_URI_MAP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_URI_MAP_MANAGER)) #define AGS_IS_LV2_URI_MAP_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_URI_MAP_MANAGER)) #define AGS_LV2_URI_MAP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_URI_MAP_MANAGER, AgsLv2UriMapManagerClass)) #define AGS_LV2_URI_MAP_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLv2UriMapManager *) obj)->obj_mutex)) typedef struct _AgsLv2UriMapManager AgsLv2UriMapManager; typedef struct _AgsLv2UriMapManagerClass AgsLv2UriMapManagerClass; struct _AgsLv2UriMapManager { GObject gobject; GRecMutex obj_mutex; uint32_t id_counter; GHashTable *uri_map; }; struct _AgsLv2UriMapManagerClass { GObjectClass gobject; }; GType ags_lv2_uri_map_manager_get_type(void); gboolean ags_lv2_uri_map_manager_insert(AgsLv2UriMapManager *lv2_uri_map_manager, gchar *uri, GValue *id); gboolean ags_lv2_uri_map_manager_remove(AgsLv2UriMapManager *lv2_uri_map_manager, gchar *uri); GValue* ags_lv2_uri_map_manager_lookup(AgsLv2UriMapManager *lv2_uri_map_manager, gchar *uri); void ags_lv2_uri_map_manager_load_default(AgsLv2UriMapManager *lv2_uri_map_manager); uint32_t ags_lv2_uri_map_manager_uri_to_id(LV2_URI_Map_Callback_Data callback_data, char *map, char *uri); AgsLv2UriMapManager* ags_lv2_uri_map_manager_get_instance(); AgsLv2UriMapManager* ags_lv2_uri_map_manager_new(); G_END_DECLS #endif /*__AGS_LV2_URI_MAP_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_base_plugin.c0000644000175000017500000012067513616617253016163 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_base_plugin_class_init(AgsBasePluginClass *base_plugin); void ags_base_plugin_init (AgsBasePlugin *base_plugin); void ags_base_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_base_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_base_plugin_dispose(GObject *gobject); void ags_base_plugin_finalize(GObject *gobject); /** * SECTION:ags_base_plugin * @short_description: The base plugin class * @title: AgsBasePlugin * @section_id: * @include: ags/plugin/ags_base_plugin.h * * The #AgsBasePlugin loads/unloads plugins on a abstraction level. */ enum{ INSTANTIATE, INSTANTIATE_WITH_PARAMS, CONNECT_PORT, ACTIVATE, DEACTIVATE, RUN, LOAD_PLUGIN, LAST_SIGNAL, }; enum{ PROP_0, PROP_UUID, PROP_FILENAME, PROP_EFFECT, PROP_PLUGIN_PORT, PROP_EFFECT_INDEX, PROP_PLUGIN_SO, PROP_UI_FILENAME, PROP_UI_EFFECT, PROP_UI_EFFECT_INDEX, PROP_UI_PLUGIN_SO, PROP_UI_PLUGIN, }; static gpointer ags_base_plugin_parent_class = NULL; static guint base_plugin_signals[LAST_SIGNAL]; GType ags_base_plugin_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_base_plugin = 0; static const GTypeInfo ags_base_plugin_info = { sizeof(AgsBasePluginClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_base_plugin_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsBasePlugin), 0, /* n_preallocs */ (GInstanceInitFunc) ags_base_plugin_init, }; ags_type_base_plugin = g_type_register_static(G_TYPE_OBJECT, "AgsBasePlugin", &ags_base_plugin_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_base_plugin); } return g_define_type_id__volatile; } void ags_base_plugin_class_init(AgsBasePluginClass *base_plugin) { GObjectClass *gobject; GParamSpec *param_spec; ags_base_plugin_parent_class = g_type_class_peek_parent(base_plugin); /* GObjectClass */ gobject = (GObjectClass *) base_plugin; gobject->set_property = ags_base_plugin_set_property; gobject->get_property = ags_base_plugin_get_property; gobject->dispose = ags_base_plugin_dispose; gobject->finalize = ags_base_plugin_finalize; /* properties */ /** * AgsBasePlugin:uuid: * * The assigned AgsUUID * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("uuid", i18n_pspec("UUID"), i18n_pspec("The UUID"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UUID, param_spec); /** * AgsBasePlugin:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename of the plugin"), i18n_pspec("The filename this plugin is located in"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsBasePlugin:effect: * * The assigned effect. * * Since: 3.0.0 */ param_spec = g_param_spec_string("effect", i18n_pspec("effect of the plugin"), i18n_pspec("The effect this plugin is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT, param_spec); /** * AgsBasePlugin:plugin-port: (type GList(AgsPluginPort)) (transfer full) * * The assigned #GList-struct containing #AgsPluginPort * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("plugin-port", i18n_pspec("plugin port of base plugin"), i18n_pspec("The plugin port of base plugin"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN_PORT, param_spec); /** * AgsBasePlugin:effect-index: * * The assigned effect-index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("effect-index", i18n_pspec("effect index of the plugin"), i18n_pspec("The effect's index this plugin is assigned with"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_EFFECT_INDEX, param_spec); /** * AgsBasePlugin:plugin-so: * * The assigned plugin.so * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("plugin-so", i18n_pspec("plugin.so"), i18n_pspec("The plugin.so"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN_SO, param_spec); /** * AgsBasePlugin:ui-filename: * * The assigned UI filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ui-filename", i18n_pspec("UI filename of the plugin"), i18n_pspec("The UI filename this plugin is located in"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_FILENAME, param_spec); /** * AgsBasePlugin:ui-effect: * * The assigned ui-effect. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ui-effect", i18n_pspec("UI effect of the plugin"), i18n_pspec("The UI effect this plugin is assigned with"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_EFFECT, param_spec); /** * AgsBasePlugin:ui-effect-index: * * The assigned ui-effect-index. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("ui-effect-index", i18n_pspec("UI effect-index of the plugin"), i18n_pspec("The UI effect-index this plugin is assigned with"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_EFFECT_INDEX, param_spec); /** * AgsBasePlugin:ui-plugin-so: * * The assigned ui_plugin.so * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("ui-plugin-so", i18n_pspec("ui_plugin.so"), i18n_pspec("The ui_plugin.so"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_PLUGIN_SO, param_spec); /** * AgsBasePlugin:ui-plugin: * * The assigned ui-plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_object("ui-plugin", i18n_pspec("ui-plugin of the plugin"), i18n_pspec("The ui-plugin this plugin is assigned with"), AGS_TYPE_BASE_PLUGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_PLUGIN, param_spec); /* AgsBasePluginClass */ base_plugin->instantiate = NULL; base_plugin->instantiate_with_params = NULL; base_plugin->connect_port = NULL; base_plugin->activate = NULL; base_plugin->deactivate = NULL; base_plugin->run = NULL; base_plugin->load_plugin = NULL; /* signals */ /** * AgsBasePlugin::instantiate: * @base_plugin: the plugin to instantiate * @samplerate: the samplerate * @buffer_size: the fixed buffer size * * The ::instantiate signal creates a new instance of plugin. * * Returns: the new plugin instance * * Since: 3.0.0 */ base_plugin_signals[INSTANTIATE] = g_signal_new("instantiate", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, instantiate), NULL, NULL, ags_cclosure_marshal_POINTER__UINT_UINT, G_TYPE_POINTER, 2, G_TYPE_UINT, G_TYPE_UINT); /** * AgsBasePlugin::instantiate-with-params: * @base_plugin: the plugin to instantiate * @n_params: pointer to array length * @parameter_name: parameter name string vector * @value: the #GValue-struct array * * The ::instantiate-with-params signal creates a new instance of plugin. * * Returns: the new plugin instance * * Since: 3.0.0 */ base_plugin_signals[INSTANTIATE_WITH_PARAMS] = g_signal_new("instantiate-with-params", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, instantiate_with_params), NULL, NULL, ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER, G_TYPE_POINTER, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); /** * AgsBasePlugin::connect-port: * @base_plugin: the plugin to connect-port * @plugin_handle: the plugin handle * @port_index: the port index * @data_location: the data location * * The ::connect-port signal creates a new instance of plugin. * * Since: 3.0.0 */ base_plugin_signals[CONNECT_PORT] = g_signal_new("connect-port", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, connect_port), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_UINT_POINTER, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_UINT, G_TYPE_POINTER); /** * AgsBasePlugin::activate: * @base_plugin: the plugin to activate * @plugin_handle: the plugin handle * * The ::activate signal creates a new instance of plugin. * * Since: 3.0.0 */ base_plugin_signals[ACTIVATE] = g_signal_new("activate", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, activate), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsBasePlugin::deactivate: * @base_plugin: the plugin to deactivate * @plugin_handle: the plugin handle * * The ::deactivate signal creates a new instance of plugin. * * Since: 3.0.0 */ base_plugin_signals[DEACTIVATE] = g_signal_new("deactivate", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, deactivate), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsBasePlugin::run: * @base_plugin: the plugin to run * @plugin_handle: the plugin handle * @seq_event: the MIDI data * @frame_count: the frame count * * The ::run signal creates a new instance of plugin. * * Since: 3.0.0 */ base_plugin_signals[RUN] = g_signal_new("run", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, run), NULL, NULL, ags_cclosure_marshal_VOID__POINTER_POINTER_UINT, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_UINT); /** * AgsBasePlugin::load-plugin: * @base_plugin: the plugin to load_plugin * * The ::load-plugin signal creates a new instance of plugin. * * Since: 3.0.0 */ base_plugin_signals[LOAD_PLUGIN] = g_signal_new("load-plugin", G_TYPE_FROM_CLASS (base_plugin), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsBasePluginClass, load_plugin), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_base_plugin_init(AgsBasePlugin *base_plugin) { base_plugin->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(base_plugin->obj_mutex)); /* */ base_plugin->uuid = NULL; base_plugin->filename = NULL; base_plugin->effect = NULL; base_plugin->port_group_count = 0; base_plugin->port_group = NULL; base_plugin->plugin_port = NULL; base_plugin->effect_index = 0; base_plugin->plugin_so = NULL; base_plugin->plugin_descriptor = NULL; base_plugin->plugin_handle = NULL; base_plugin->ui_filename = NULL; base_plugin->ui_effect = NULL; base_plugin->ui_effect_index = 0; base_plugin->ui_plugin_so = NULL; base_plugin->ui_plugin_descriptor = NULL; base_plugin->ui_plugin_handle = NULL; base_plugin->ui_plugin = NULL; } void ags_base_plugin_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsBasePlugin *base_plugin; GRecMutex *base_plugin_mutex; base_plugin = AGS_BASE_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); switch(prop_id){ case PROP_UUID: { g_rec_mutex_lock(base_plugin_mutex); base_plugin->uuid = (AgsUUID *) g_value_get_pointer(value); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FILENAME: { gchar *filename; filename = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(base_plugin->filename == filename){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(base_plugin->filename != NULL){ g_free(base_plugin->filename); } base_plugin->filename = g_strdup(filename); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_EFFECT: { gchar *effect; effect = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(base_plugin->effect == effect){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(base_plugin->effect != NULL){ g_free(base_plugin->effect); } base_plugin->effect = g_strdup(effect); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PLUGIN_PORT: { AgsPluginPort *plugin_port; plugin_port = (AgsPluginPort *) g_value_get_pointer(value); g_rec_mutex_lock(base_plugin_mutex); if(!AGS_IS_PLUGIN_PORT(plugin_port) || g_list_find(base_plugin->plugin_port, plugin_port) != NULL){ g_rec_mutex_unlock(base_plugin_mutex); return; } g_object_ref(plugin_port); base_plugin->plugin_port = g_list_prepend(base_plugin->plugin_port, plugin_port); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_EFFECT_INDEX: { guint effect_index; effect_index = g_value_get_uint(value); g_rec_mutex_lock(base_plugin_mutex); base_plugin->effect_index = effect_index; g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PLUGIN_SO: { g_rec_mutex_lock(base_plugin_mutex); base_plugin->plugin_so = g_value_get_pointer(value); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_FILENAME: { gchar *ui_filename; ui_filename = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(base_plugin->ui_filename == ui_filename){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(base_plugin->ui_filename != NULL){ g_free(base_plugin->ui_filename); } base_plugin->ui_filename = g_strdup(ui_filename); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_EFFECT: { gchar *ui_effect; ui_effect = (gchar *) g_value_get_string(value); g_rec_mutex_lock(base_plugin_mutex); if(base_plugin->ui_effect == ui_effect){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(base_plugin->ui_effect != NULL){ g_free(base_plugin->ui_effect); } base_plugin->ui_effect = g_strdup(ui_effect); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_EFFECT_INDEX: { guint ui_effect_index; ui_effect_index = g_value_get_uint(value); g_rec_mutex_lock(base_plugin_mutex); base_plugin->ui_effect_index = ui_effect_index; g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_PLUGIN_SO: { g_rec_mutex_lock(base_plugin_mutex); base_plugin->ui_plugin_so = g_value_get_pointer(value); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_PLUGIN: { GObject *ui_plugin; ui_plugin = g_value_get_object(value); g_rec_mutex_lock(base_plugin_mutex); if(base_plugin->ui_plugin == ui_plugin){ g_rec_mutex_unlock(base_plugin_mutex); return; } if(base_plugin->ui_plugin != NULL){ g_object_unref(base_plugin->ui_plugin); } if(ui_plugin != NULL){ g_object_ref(ui_plugin); } base_plugin->ui_plugin = ui_plugin; g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_base_plugin_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsBasePlugin *base_plugin; GRecMutex *base_plugin_mutex; base_plugin = AGS_BASE_PLUGIN(gobject); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); switch(prop_id){ case PROP_UUID: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_pointer(value, base_plugin->uuid); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_FILENAME: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, base_plugin->filename); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_EFFECT: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, base_plugin->effect); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PLUGIN_PORT: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_pointer(value, g_list_copy_deep(base_plugin->plugin_port, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_EFFECT_INDEX: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_uint(value, base_plugin->effect_index); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_PLUGIN_SO: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_pointer(value, base_plugin->plugin_so); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_FILENAME: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, base_plugin->ui_filename); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_EFFECT: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_string(value, base_plugin->ui_effect); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_EFFECT_INDEX: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_uint(value, base_plugin->ui_effect_index); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_PLUGIN_SO: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_pointer(value, base_plugin->ui_plugin_so); g_rec_mutex_unlock(base_plugin_mutex); } break; case PROP_UI_PLUGIN: { g_rec_mutex_lock(base_plugin_mutex); g_value_set_object(value, base_plugin->ui_plugin); g_rec_mutex_unlock(base_plugin_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_base_plugin_dispose(GObject *gobject) { AgsBasePlugin *base_plugin; base_plugin = AGS_BASE_PLUGIN(gobject); if(base_plugin->ui_plugin != NULL){ g_object_unref(base_plugin->ui_plugin); base_plugin->ui_plugin = NULL; } /* plugin port */ if(base_plugin->plugin_port != NULL){ g_list_free_full(base_plugin->plugin_port, g_object_unref); base_plugin->plugin_port = NULL; } /* call parent */ G_OBJECT_CLASS(ags_base_plugin_parent_class)->dispose(gobject); } void ags_base_plugin_finalize(GObject *gobject) { AgsBasePlugin *base_plugin; base_plugin = AGS_BASE_PLUGIN(gobject); /* uuid */ if(base_plugin->uuid != NULL){ ags_uuid_free(base_plugin->uuid); } /* filename and effect */ g_free(base_plugin->filename); g_free(base_plugin->effect); /* UI filename and effect */ g_free(base_plugin->ui_filename); g_free(base_plugin->ui_effect); /* plugin port */ g_list_free_full(base_plugin->plugin_port, g_object_unref); /* ui-plugin */ if(base_plugin->ui_plugin != NULL){ g_object_unref(base_plugin->ui_plugin); } /* call parent */ G_OBJECT_CLASS(ags_base_plugin_parent_class)->finalize(gobject); } /** * ags_base_plugin_get_obj_mutex: * @base_plugin: the #AgsBasePlugin * * Get object mutex. * * Returns: the #GRecMutex to lock @base_plugin * * Since: 3.1.0 */ GRecMutex* ags_base_plugin_get_obj_mutex(AgsBasePlugin *base_plugin) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } return(AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin)); } /** * ags_base_plugin_test_flags: * @base_plugin: the #AgsBasePlugin * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_base_plugin_test_flags(AgsBasePlugin *base_plugin, guint flags) { gboolean retval; GRecMutex *base_plugin_mutex; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(FALSE); } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* test flags */ g_rec_mutex_lock(base_plugin_mutex); retval = ((flags & (base_plugin->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); return(retval); } /** * ags_base_plugin_set_flags: * @base_plugin: the #AgsBasePlugin * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_base_plugin_set_flags(AgsBasePlugin *base_plugin, guint flags) { GRecMutex *base_plugin_mutex; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* set flags */ g_rec_mutex_lock(base_plugin_mutex); base_plugin->flags |= flags; g_rec_mutex_unlock(base_plugin_mutex); } /** * ags_base_plugin_unset_flags: * @base_plugin: the #AgsBasePlugin * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_base_plugin_unset_flags(AgsBasePlugin *base_plugin, guint flags) { GRecMutex *base_plugin_mutex; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); /* unset flags */ g_rec_mutex_lock(base_plugin_mutex); base_plugin->flags &= (~flags); g_rec_mutex_unlock(base_plugin_mutex); } /** * ags_base_plugin_get_filename: * @base_plugin: the #AgsBasePlugin * * Get filename. * * Returns: the filename * * Since: 3.1.0 */ gchar* ags_base_plugin_get_filename(AgsBasePlugin *base_plugin) { gchar *filename; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "filename", &filename, NULL); return(filename); } /** * ags_base_plugin_set_filename: * @base_plugin: the #AgsBasePlugin * @filename: the filename * * Set filename. * * Since: 3.1.0 */ void ags_base_plugin_set_filename(AgsBasePlugin *base_plugin, gchar *filename) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "filename", filename, NULL); } /** * ags_base_plugin_get_effect: * @base_plugin: the #AgsBasePlugin * * Get effect. * * Returns: the effect * * Since: 3.1.0 */ gchar* ags_base_plugin_get_effect(AgsBasePlugin *base_plugin) { gchar *effect; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "effect", &effect, NULL); return(effect); } /** * ags_base_plugin_set_effect: * @base_plugin: the #AgsBasePlugin * @effect: the effect * * Set effect. * * Since: 3.1.0 */ void ags_base_plugin_set_effect(AgsBasePlugin *base_plugin, gchar *effect) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "effect", effect, NULL); } /** * ags_base_plugin_get_effect_index: * @base_plugin: the #AgsBasePlugin * * Get effect index. * * Returns: the effect index * * Since: 3.1.0 */ guint ags_base_plugin_get_effect_index(AgsBasePlugin *base_plugin) { guint effect_index; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "effect-index", &effect_index, NULL); return(effect_index); } /** * ags_base_plugin_set_effect_index: * @base_plugin: the #AgsBasePlugin * @effect_index: the effect index * * Set effect index. * * Since: 3.1.0 */ void ags_base_plugin_set_effect_index(AgsBasePlugin *base_plugin, guint effect_index) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "effect-index", effect_index, NULL); } /** * ags_base_plugin_get_plugin_so: * @base_plugin: the #AgsBasePlugin * * Get plugin so. * * Returns: the plugin so * * Since: 3.1.0 */ gpointer ags_base_plugin_get_plugin_so(AgsBasePlugin *base_plugin) { gpointer plugin_so; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "plugin-so", &plugin_so, NULL); return(plugin_so); } /** * ags_base_plugin_set_plugin_so: * @base_plugin: the #AgsBasePlugin * @plugin_so: the plugin so * * Set plugin_so. * * Since: 3.1.0 */ void ags_base_plugin_set_plugin_so(AgsBasePlugin *base_plugin, gpointer plugin_so) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "plugin-so", plugin_so, NULL); } /** * ags_base_plugin_get_base_plugin_dependency: * @base_plugin: the #AgsBasePlugin * * Get recall dependency. * * Returns: (element-type AgsAudio.PluginPort) (transfer full): the #GList-struct containig #AgsPluginPort * * Since: 3.1.0 */ GList* ags_base_plugin_get_plugin_port(AgsBasePlugin *base_plugin) { GList *plugin_port; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "recall-dependency", &plugin_port, NULL); return(plugin_port); } /** * ags_base_plugin_set_plugin_port: * @base_plugin: the #AgsBasePlugin * @plugin_port: (element-type AgsAudio.PluginPort) (transfer full): the #GList-struct containing #AgsPluginPort * * Set recall dependency by replacing existing. * * Since: 3.1.0 */ void ags_base_plugin_set_plugin_port(AgsBasePlugin *base_plugin, GList *plugin_port) { GList *start_plugin_port; GRecMutex *base_plugin_mutex; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } /* get base_plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(base_plugin); g_rec_mutex_lock(base_plugin_mutex); start_plugin_port = base_plugin->plugin_port; base_plugin->plugin_port = plugin_port; g_rec_mutex_unlock(base_plugin_mutex); g_list_free_full(start_plugin_port, (GDestroyNotify) g_object_unref); } /** * ags_base_plugin_get_ui_filename: * @base_plugin: the #AgsBasePlugin * * Get UI filename. * * Returns: the UI filename * * Since: 3.1.0 */ gchar* ags_base_plugin_get_ui_filename(AgsBasePlugin *base_plugin) { gchar *ui_filename; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "ui-filename", &ui_filename, NULL); return(ui_filename); } /** * ags_base_plugin_set_ui_filename: * @base_plugin: the #AgsBasePlugin * @ui_filename: the UI filename * * Set UI filename. * * Since: 3.1.0 */ void ags_base_plugin_set_ui_filename(AgsBasePlugin *base_plugin, gchar *ui_filename) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "ui-filename", ui_filename, NULL); } /** * ags_base_plugin_get_ui_effect: * @base_plugin: the #AgsBasePlugin * * Get UI effect. * * Returns: the UI effect * * Since: 3.1.0 */ gchar* ags_base_plugin_get_ui_effect(AgsBasePlugin *base_plugin) { gchar *ui_effect; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "ui-effect", &ui_effect, NULL); return(ui_effect); } /** * ags_base_plugin_set_ui_effect: * @base_plugin: the #AgsBasePlugin * @ui_effect: the UI effect * * Set UI effect. * * Since: 3.1.0 */ void ags_base_plugin_set_ui_effect(AgsBasePlugin *base_plugin, gchar *ui_effect) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "ui-effect", ui_effect, NULL); } /** * ags_base_plugin_get_ui_effect_index: * @base_plugin: the #AgsBasePlugin * * Get UI effect index. * * Returns: the UI effect index * * Since: 3.1.0 */ guint ags_base_plugin_get_ui_effect_index(AgsBasePlugin *base_plugin) { guint ui_effect_index; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "ui-effect-index", &ui_effect_index, NULL); return(ui_effect_index); } /** * ags_base_plugin_set_ui_effect_index: * @base_plugin: the #AgsBasePlugin * @ui_effect_index: the UI effect index * * Set UI effect index. * * Since: 3.1.0 */ void ags_base_plugin_set_ui_effect_index(AgsBasePlugin *base_plugin, guint ui_effect_index) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "ui-effect-index", ui_effect_index, NULL); } /** * ags_base_plugin_get_ui_plugin_so: * @base_plugin: the #AgsBasePlugin * * Get plugin so. * * Returns: the plugin so * * Since: 3.1.0 */ gpointer ags_base_plugin_get_ui_plugin_so(AgsBasePlugin *base_plugin) { gpointer ui_plugin_so; if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return(NULL); } g_object_get(base_plugin, "ui-plugin-so", &ui_plugin_so, NULL); return(ui_plugin_so); } /** * ags_base_plugin_set_ui_plugin_so: * @base_plugin: the #AgsBasePlugin * @ui_plugin_so: the plugin so * * Set ui_plugin_so. * * Since: 3.1.0 */ void ags_base_plugin_set_ui_plugin_so(AgsBasePlugin *base_plugin, gpointer ui_plugin_so) { if(!AGS_IS_BASE_PLUGIN(base_plugin)){ return; } g_object_set(base_plugin, "ui-plugin-so", ui_plugin_so, NULL); } /** * ags_base_plugin_find_filename: * @base_plugin: (element-type AgsAudio.BasePlugin): the #GList-struct containing #AgsBasePlugin * @filename: the filename as string * * Find filename in @base_plugin #GList-struct of #AgsBasePlugin. * * Returns: (element-type AgsAudio.BasePlugin) (transfer none): the next matching #GList-struct * * Since: 3.0.0 */ GList* ags_base_plugin_find_filename(GList *base_plugin, gchar *filename) { AgsBasePlugin *current_base_plugin; gboolean success; GRecMutex *base_plugin_mutex; if(filename == NULL){ return(NULL); } while(base_plugin != NULL){ current_base_plugin = AGS_BASE_PLUGIN(base_plugin->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(current_base_plugin); /* check filename */ g_rec_mutex_lock(base_plugin_mutex); success = (current_base_plugin->filename != NULL && !g_ascii_strcasecmp(current_base_plugin->filename, filename)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ return(base_plugin); } base_plugin = base_plugin->next; } return(NULL); } /** * ags_base_plugin_find_effect: * @base_plugin: (element-type AgsAudio.BasePlugin): the #GList-struct containing #AgsBasePlugin * @filename: the filename as string * @effect: the effect as string * * Find @filename and @effect in @base_plugin #GList-struct of #AgsBasePlugin. * * Returns: (element-type AgsAudio.BasePlugin) (transfer none): the next matching #GList-struct * * Since: 3.0.0 */ GList* ags_base_plugin_find_effect(GList *base_plugin, gchar *filename, gchar *effect) { AgsBasePlugin *current_base_plugin; gboolean success; GRecMutex *base_plugin_mutex; while(base_plugin != NULL){ current_base_plugin = AGS_BASE_PLUGIN(base_plugin->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(current_base_plugin); /* check filename and effect*/ g_rec_mutex_lock(base_plugin_mutex); success = (!g_ascii_strcasecmp(current_base_plugin->filename, filename) && !g_ascii_strcasecmp(current_base_plugin->effect, effect)) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ return(base_plugin); } base_plugin = base_plugin->next; } return(NULL); } /** * ags_base_plugin_find_ui_effect_index: * @base_plugin: (element-type AgsAudio.BasePlugin): the #GList-struct containing #AgsBasePlugin * @ui_filename: the UI filename as string * @ui_effect_index: the UI effect index * * Find @ui_filename and @ui_effect_index in @base_plugin #GList-struct of #AgsBasePlugin. * * Returns: (element-type AgsAudio.BasePlugin) (transfer none): the next matching #GList-struct * * Since: 3.0.0 */ GList* ags_base_plugin_find_ui_effect_index(GList *base_plugin, gchar *ui_filename, guint ui_effect_index) { AgsBasePlugin *current_base_plugin; gboolean success; GRecMutex *base_plugin_mutex; while(base_plugin != NULL){ current_base_plugin = AGS_BASE_PLUGIN(base_plugin->data); /* get base plugin mutex */ base_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(current_base_plugin); /* check UI filename and effect index */ g_rec_mutex_lock(base_plugin_mutex); success = (!g_ascii_strcasecmp(current_base_plugin->ui_filename, ui_filename) && current_base_plugin->ui_effect_index == ui_effect_index) ? TRUE: FALSE; g_rec_mutex_unlock(base_plugin_mutex); if(success){ return(base_plugin); } base_plugin = base_plugin->next; } return(NULL); } /** * ags_base_plugin_sort_func: * @a: a #AgsBasePlugin * @b: an other #AgsBasePlugin * * Sort function. * * Returns: a value smaller to, equal to or greater to 0 like strcmp * * Since: 3.0.0 */ gint ags_base_plugin_sort_func(gpointer a, gpointer b) { AgsBasePlugin *a_plugin; AgsBasePlugin *b_plugin; gchar *a_effect; gchar *b_effect; gint retval; GRecMutex *a_plugin_mutex; GRecMutex *b_plugin_mutex; /* a and b */ a_plugin = AGS_BASE_PLUGIN(a); b_plugin = AGS_BASE_PLUGIN(b); /* get base plugin mutex - a and b */ a_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(a_plugin); b_plugin_mutex = AGS_BASE_PLUGIN_GET_OBJ_MUTEX(b_plugin); /* duplicate effect - a */ g_rec_mutex_lock(a_plugin_mutex); a_effect = g_strdup(a_plugin->effect); g_rec_mutex_unlock(a_plugin_mutex); /* duplicate effect - b */ g_rec_mutex_lock(b_plugin_mutex); b_effect = g_strdup(b_plugin->effect); g_rec_mutex_unlock(b_plugin_mutex); if(a_effect == NULL || b_effect == 0){ return(-1); } /* compare and free */ retval = strcmp(a_effect, b_effect); g_free(a_effect); g_free(b_effect); return(retval); } /** * ags_base_plugin_sort: * @base_plugin: (element-type AgsAudio.BasePlugin) (transfer none): the #GList-struct containing #AgsBasePlugin * * Sort @base_plugin alphabetically. * * Returns: (element-type AgsAudio.BasePlugin) (transfer none): the sorted #GList-struct * * Since: 3.0.0 */ GList* ags_base_plugin_sort(GList *base_plugin) { GList *start; if(base_plugin == NULL){ return(NULL); } start = NULL; while(base_plugin != NULL){ start = g_list_insert_sorted(start, base_plugin->data, (GCompareFunc) ags_base_plugin_sort_func); base_plugin = base_plugin->next; } return(start); } void ags_base_plugin_apply_port_group_by_prefix(AgsBasePlugin *base_plugin) { //TODO:JK: implement me } /** * ags_base_plugin_instantiate: * @base_plugin: the #AgsBasePlugin * @samplerate: the samplerate * @buffer_size: the fixed buffer size * * Instantiate the plugin * * Returns: the new plugin instance handle * * Since: 3.0.0 */ gpointer ags_base_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size) { gpointer retval; g_return_val_if_fail(AGS_IS_BASE_PLUGIN(base_plugin), NULL); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[INSTANTIATE], 0, samplerate, buffer_size, &retval); g_object_unref(G_OBJECT(base_plugin)); return(retval); } /** * ags_base_plugin_instantiate_with_params: * @base_plugin: the #AgsBasePlugin * @n_params: guint pointer to parameter count * @parameter_name: string vector containing parameter names * @value: the #GValue-struct array * * Instantiate the plugin * * Returns: the new plugin instance handle * * Since: 3.0.0 */ gpointer ags_base_plugin_instantiate_with_params(AgsBasePlugin *base_plugin, guint *n_params, gchar ***parameter_name, GValue **value) { gpointer retval; g_return_val_if_fail(AGS_IS_BASE_PLUGIN(base_plugin), NULL); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[INSTANTIATE_WITH_PARAMS], 0, n_params, parameter_name, value, &retval); g_object_unref(G_OBJECT(base_plugin)); return(retval); } /** * ags_base_plugin_connect_port: * @base_plugin: the #AgsBasePlugin * @plugin_handle: the plugin instance handle * @port_index: the port's index to connect * @data_location: the data location to connect * * Connect a plugin instance. * * Since: 3.0.0 */ void ags_base_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location) { g_return_if_fail(AGS_IS_BASE_PLUGIN(base_plugin)); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[CONNECT_PORT], 0, plugin_handle, port_index, data_location); g_object_unref(G_OBJECT(base_plugin)); } /** * ags_base_plugin_activate: * @base_plugin: the #AgsBasePlugin * @plugin_handle: the plugin instance handle * * Activate a plugin instance * * Since: 3.0.0 */ void ags_base_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { g_return_if_fail(AGS_IS_BASE_PLUGIN(base_plugin)); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[ACTIVATE], 0, plugin_handle); g_object_unref(G_OBJECT(base_plugin)); } /** * ags_base_plugin_deactivate: * @base_plugin: the #AgsBasePlugin * @plugin_handle: the plugin instance handle * * Deactivat a plugin instance * * Since: 3.0.0 */ void ags_base_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle) { g_return_if_fail(AGS_IS_BASE_PLUGIN(base_plugin)); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[DEACTIVATE], 0, plugin_handle); g_object_unref(G_OBJECT(base_plugin)); } /** * ags_base_plugin_run: * @base_plugin: the #AgsBasePlugin * @plugin_handle: the plugin instance handle * @seq_event: (type gpointer) (transfer none): the alsa sequencer events * @frame_count: the frame counts * * Deactivat a plugin instance * * Since: 3.0.0 */ void ags_base_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count) { g_return_if_fail(AGS_IS_BASE_PLUGIN(base_plugin)); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[RUN], 0, plugin_handle, seq_event, frame_count); g_object_unref(G_OBJECT(base_plugin)); } /** * ags_base_plugin_load_plugin: * @base_plugin: the #AgsBasePlugin * * Load the plugin * * Since: 3.0.0 */ void ags_base_plugin_load_plugin(AgsBasePlugin *base_plugin) { g_return_if_fail(AGS_IS_BASE_PLUGIN(base_plugin)); g_object_ref(G_OBJECT(base_plugin)); g_signal_emit(G_OBJECT(base_plugin), base_plugin_signals[LOAD_PLUGIN], 0); g_object_unref(G_OBJECT(base_plugin)); } /** * ags_base_plugin_new: * @filename: the plugin .so * @effect: the effect's string representation * @effect_index: the effect's index * * Creates an #AgsBasePlugin * * Returns: a new #AgsBasePlugin * * Since: 3.0.0 */ AgsBasePlugin* ags_base_plugin_new(gchar *filename, gchar *effect, guint effect_index) { AgsBasePlugin *base_plugin; base_plugin = (AgsBasePlugin *) g_object_new(AGS_TYPE_BASE_PLUGIN, "filename", filename, "effect", effect, "effect-index", effect_index, NULL); return(base_plugin); } gsequencer-3.1.3/ags/plugin/ags_ladspa_conversion.h0000644000175000017500000000616413607210263017373 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_CONVERSION_H__ #define __AGS_LADSPA_CONVERSION_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LADSPA_CONVERSION (ags_ladspa_conversion_get_type()) #define AGS_LADSPA_CONVERSION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONVERSION, AgsLadspaConversion)) #define AGS_LADSPA_CONVERSION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CONVERSION, AgsLadspaConversionClass)) #define AGS_IS_LADSPA_CONVERSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CONVERSION)) #define AGS_IS_LADSPA_CONVERSION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CONVERSION)) #define AGS_LADSPA_CONVERSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_CONVERSION, AgsLadspaConversionClass)) #define AGS_LADSPA_CONVERSION_DEFAULT_LOWER (0.00001) #define AGS_LADSPA_CONVERSION_DEFAULT_UPPER (1.0) #define AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT (1025.0) typedef struct _AgsLadspaConversion AgsLadspaConversion; typedef struct _AgsLadspaConversionClass AgsLadspaConversionClass; /** * AgsLadspaConversionFlags: * @AGS_LADSPA_CONVERSION_SAMPLERATE: samplerate * @AGS_LADSPA_CONVERSION_BOUNDED_BELOW: bounded below * @AGS_LADSPA_CONVERSION_BOUNDED_ABOVE: bounded above * @AGS_LADSPA_CONVERSION_LOGARITHMIC: logarithmic * * Enum values to control the behavior or indicate internal state of #AgsLadspaConversion by * enable/disable as flags. */ typedef enum{ AGS_LADSPA_CONVERSION_SAMPLERATE = 1, AGS_LADSPA_CONVERSION_BOUNDED_BELOW = 1 << 1, AGS_LADSPA_CONVERSION_BOUNDED_ABOVE = 1 << 2, AGS_LADSPA_CONVERSION_LOGARITHMIC = 1 << 3, }AgsLadspaConversionFlags; struct _AgsLadspaConversion { AgsConversion conversion; guint flags; guint samplerate; gdouble lower; gdouble upper; gdouble step_count; }; struct _AgsLadspaConversionClass { AgsConversionClass conversion; }; GType ags_ladspa_conversion_get_type(void); gboolean ags_ladspa_conversion_test_flags(AgsLadspaConversion *ladspa_conversion, guint flags); void ags_ladspa_conversion_set_flags(AgsLadspaConversion *ladspa_conversion, guint flags); void ags_ladspa_conversion_unset_flags(AgsLadspaConversion *ladspa_conversion, guint flags); AgsLadspaConversion* ags_ladspa_conversion_new(); G_END_DECLS #endif /*__AGS_LADSPA_CONVERSION_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_event_manager.c0000644000175000017500000000763413607210263017256 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_lv2_event_manager_class_init(AgsLv2EventManagerClass *lv2_event_manager); void ags_lv2_event_manager_init(AgsLv2EventManager *lv2_event_manager); void ags_lv2_event_manager_finalize(GObject *gobject); /** * SECTION:ags_lv2_event_manager * @short_description: event manager * @title: AgsLv2EventManager * @section_id: * @include: ags/plugin/ags_lv2_event_manager.h * * The #AgsLv2EventManager allows you to do memory management with LV2_Event's. */ static gpointer ags_lv2_event_manager_parent_class = NULL; AgsLv2EventManager *ags_lv2_event_manager = NULL; GType ags_lv2_event_manager_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_event_manager = 0; const GTypeInfo ags_lv2_event_manager_info = { sizeof (AgsLv2EventManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_event_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2EventManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_event_manager_init, }; ags_type_lv2_event_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2EventManager", &ags_lv2_event_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_event_manager); } return g_define_type_id__volatile; } void ags_lv2_event_manager_class_init(AgsLv2EventManagerClass *lv2_event_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_event_manager_parent_class = g_type_class_peek_parent(lv2_event_manager); /* GObject */ gobject = (GObjectClass *) lv2_event_manager; gobject->finalize = ags_lv2_event_manager_finalize; } void ags_lv2_event_manager_init(AgsLv2EventManager *event_manager) { /* empty */ } void ags_lv2_event_manager_finalize(GObject *gobject) { /* empty */ /* call parent */ G_OBJECT_CLASS(ags_lv2_event_manager_parent_class)->finalize(gobject); } uint32_t ags_lv2_event_manager_lv2_event_ref(LV2_Event_Callback_Data callback_data, LV2_Event *event) { //TODO:JK: implement me return(1); } uint32_t ags_lv2_event_manager_lv2_event_unref(LV2_Event_Callback_Data callback_data, LV2_Event *event) { //TODO:JK: implement me return(1); } /** * ags_lv2_event_manager_get_instance: * * Singleton function to optain the id manager instance. * * Returns: (transfer none): an instance of #AgsLv2EventManager * * Since: 3.0.0 */ AgsLv2EventManager* ags_lv2_event_manager_get_instance() { if(ags_lv2_event_manager == NULL){ ags_lv2_event_manager = ags_lv2_event_manager_new(); // ags_lv2_event_manager_load_default(ags_lv2_event_manager); } return(ags_lv2_event_manager); } /** * ags_lv2_event_manager_new: * * Instantiate a id manager. * * Returns: a new #AgsLv2EventManager * * Since: 3.0.0 */ AgsLv2EventManager* ags_lv2_event_manager_new() { AgsLv2EventManager *lv2_event_manager; lv2_event_manager = (AgsLv2EventManager *) g_object_new(AGS_TYPE_LV2_EVENT_MANAGER, NULL); return(lv2_event_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2_preset_manager.c0000644000175000017500000001336613607210263017436 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_lv2_preset_manager_class_init(AgsLv2PresetManagerClass *lv2_preset_manager); void ags_lv2_preset_manager_init(AgsLv2PresetManager *lv2_preset_manager); void ags_lv2_preset_manager_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_preset_manager_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_preset_manager_dispose(GObject *gobject); void ags_lv2_preset_manager_finalize(GObject *gobject); /** * SECTION:ags_lv2_preset_manager * @short_description: Singleton pattern to organize LV2 presets * @title: AgsLv2PresetManager * @section_id: * @include: ags/plugin/ags_lv2_preset_manager.h * * The #AgsLv2PresetManager loads/unloads LV2 presets. */ enum{ PROP_0, }; static gpointer ags_lv2_preset_manager_parent_class = NULL; AgsLv2PresetManager *ags_lv2_preset_manager = NULL; GType ags_lv2_preset_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_preset_manager = 0; static const GTypeInfo ags_lv2_preset_manager_info = { sizeof (AgsLv2PresetManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_preset_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2PresetManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_preset_manager_init, }; ags_type_lv2_preset_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2PresetManager", &ags_lv2_preset_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_preset_manager); } return g_define_type_id__volatile; } void ags_lv2_preset_manager_class_init(AgsLv2PresetManagerClass *lv2_preset_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_preset_manager_parent_class = g_type_class_peek_parent(lv2_preset_manager); /* GObjectClass */ gobject = (GObjectClass *) lv2_preset_manager; gobject->set_property = ags_lv2_preset_manager_set_property; gobject->get_property = ags_lv2_preset_manager_get_property; gobject->dispose = ags_lv2_preset_manager_dispose; gobject->finalize = ags_lv2_preset_manager_finalize; /* properties */ } void ags_lv2_preset_manager_init(AgsLv2PresetManager *lv2_preset_manager) { /* lv2 manager mutex */ g_rec_mutex_init(&(lv2_preset_manager->obj_mutex)); /* initialize lv2 plugin GList */ lv2_preset_manager->lv2_preset = NULL; } void ags_lv2_preset_manager_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2PresetManager *lv2_preset_manager; lv2_preset_manager = AGS_LV2_PRESET_MANAGER(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_preset_manager_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2PresetManager *lv2_preset_manager; lv2_preset_manager = AGS_LV2_PRESET_MANAGER(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_preset_manager_dispose(GObject *gobject) { AgsLv2PresetManager *lv2_preset_manager; lv2_preset_manager = AGS_LV2_PRESET_MANAGER(gobject); if(lv2_preset_manager->lv2_preset != NULL){ g_list_free_full(lv2_preset_manager->lv2_preset, g_object_unref); lv2_preset_manager->lv2_preset = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_preset_manager_parent_class)->dispose(gobject); } void ags_lv2_preset_manager_finalize(GObject *gobject) { AgsLv2PresetManager *lv2_preset_manager; GList *lv2_preset; lv2_preset_manager = AGS_LV2_PRESET_MANAGER(gobject); lv2_preset = lv2_preset_manager->lv2_preset; g_list_free_full(lv2_preset, g_object_unref); if(lv2_preset_manager == ags_lv2_preset_manager){ ags_lv2_preset_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_preset_manager_parent_class)->finalize(gobject); } /** * ags_lv2_preset_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsLv2PresetManager * * Since: 3.0.0 */ AgsLv2PresetManager* ags_lv2_preset_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2_preset_manager == NULL){ ags_lv2_preset_manager = ags_lv2_preset_manager_new(); } g_mutex_unlock(&mutex); return(ags_lv2_preset_manager); } /** * ags_lv2_preset_manager_new: * * Create a new instance of #AgsLv2PresetManager * * Returns: the new #AgsLv2PresetManager * * Since: 3.0.0 */ AgsLv2PresetManager* ags_lv2_preset_manager_new() { AgsLv2PresetManager *lv2_preset_manager; lv2_preset_manager = (AgsLv2PresetManager *) g_object_new(AGS_TYPE_LV2_PRESET_MANAGER, NULL); return(lv2_preset_manager); } gsequencer-3.1.3/ags/plugin/ags_lv2_turtle_parser.c0000644000175000017500000036232413613101164017332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_lv2_turtle_parser_class_init(AgsLv2TurtleParserClass *lv2_turtle_parser); void ags_lv2_turtle_parser_init (AgsLv2TurtleParser *lv2_turtle_parser); void ags_lv2_turtle_parser_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_turtle_parser_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_turtle_parser_dispose(GObject *gobject); void ags_lv2_turtle_parser_finalize(GObject *gobject); void ags_lv2_turtle_parser_parse_names_statement(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also); void ags_lv2_turtle_parser_parse_names_triple(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also); void ags_lv2_turtle_parser_parse_names_predicate_object_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle); void ags_lv2_turtle_parser_parse_names_predicate_object_list_see_also(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle); void ags_lv2_turtle_parser_parse_names_blank_node_property_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle); void ags_lv2_turtle_parser_parse_statement(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also); void ags_lv2_turtle_parser_parse_triple(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also); void ags_lv2_turtle_parser_parse_predicate_object_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle); void ags_lv2_turtle_parser_parse_predicate_object_list_see_also(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle); void ags_lv2_turtle_parser_parse_blank_node_property_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle); /** * SECTION:ags_lv2_turtle_parser * @short_description: The lv2 turtle parser class * @title: AgsLv2TurtleParser * @section_id: * @include: ags/plugin/ags_lv2_turtle_parser.h * * The #AgsLv2TurtleParser parses RDF Turtle files. */ static gpointer ags_lv2_turtle_parser_parent_class = NULL; enum{ PROP_0, PROP_TURTLE, PROP_PLUGIN, PROP_UI_PLUGIN, PROP_PRESET, }; GType ags_lv2_turtle_parser_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_turtle_parser = 0; static const GTypeInfo ags_lv2_turtle_parser_info = { sizeof(AgsLv2TurtleParserClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_turtle_parser_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLv2TurtleParser), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_turtle_parser_init, }; ags_type_lv2_turtle_parser = g_type_register_static(G_TYPE_OBJECT, "AgsLv2TurtleParser", &ags_lv2_turtle_parser_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_turtle_parser); } return g_define_type_id__volatile; } void ags_lv2_turtle_parser_class_init(AgsLv2TurtleParserClass *lv2_turtle_parser) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_turtle_parser_parent_class = g_type_class_peek_parent(lv2_turtle_parser); /* GObjectClass */ gobject = (GObjectClass *) lv2_turtle_parser; gobject->set_property = ags_lv2_turtle_parser_set_property; gobject->get_property = ags_lv2_turtle_parser_get_property; gobject->dispose = ags_lv2_turtle_parser_dispose; gobject->finalize = ags_lv2_turtle_parser_finalize; /* properties */ /** * AgsLv2TurtleParser:turtle: (type GList(AgsTurtle)) (transfer full) * * The assigned #GList-struct containing #AgsTurtle. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("turtle", i18n_pspec("related turtles"), i18n_pspec("The related turtles"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TURTLE, param_spec); /** * AgsLv2TurtleParser:plugin: (type GList(AgsLv2Plugin)) (transfer full) * * The assigned #GList-struct containing #AgsLv2Plugin. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("plugin", i18n_pspec("lv2 plugins"), i18n_pspec("The parsed lv2 plugins"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PLUGIN, param_spec); /** * AgsLv2TurtleParser:ui-pluin: (type GList(AgsLv2uiPlugin)) (transfer full) * * The assigned #GList-struct containing #AgsLv2uiPlugin. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("ui-plugin", i18n_pspec("lv2 UI plugins"), i18n_pspec("The parsed lv2 UI plugins"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UI_PLUGIN, param_spec); /** * AgsLv2TurtleParser:preset: (type GList(AgsLv2Preset)) (transfer full) * * The assigned #GList-struct containing #AgsLv2Preset. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("preset", i18n_pspec("lv2 presets"), i18n_pspec("The parsed lv2 presets"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PRESET, param_spec); } void ags_lv2_turtle_parser_init(AgsLv2TurtleParser *lv2_turtle_parser) { lv2_turtle_parser->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(lv2_turtle_parser->obj_mutex)); /* */ lv2_turtle_parser->turtle = NULL; lv2_turtle_parser->plugin = NULL; lv2_turtle_parser->ui_plugin = NULL; lv2_turtle_parser->preset = NULL; } void ags_lv2_turtle_parser_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2TurtleParser *lv2_turtle_parser; GRecMutex *lv2_turtle_parser_mutex; lv2_turtle_parser = AGS_LV2_TURTLE_PARSER(gobject); /* get lv2 turtle parser mutex */ lv2_turtle_parser_mutex = AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX(lv2_turtle_parser); switch(prop_id){ case PROP_TURTLE: { AgsTurtle *turtle; turtle = (AgsTurtle *) g_value_get_pointer(value); g_rec_mutex_lock(lv2_turtle_parser_mutex); if(!AGS_IS_TURTLE(turtle) || g_list_find(lv2_turtle_parser->turtle, turtle) != NULL){ g_rec_mutex_unlock(lv2_turtle_parser_mutex); return; } g_object_ref(turtle); lv2_turtle_parser->turtle = g_list_prepend(lv2_turtle_parser->turtle, turtle); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; case PROP_PLUGIN: { AgsLv2Plugin *lv2_plugin; lv2_plugin = (AgsLv2Plugin *) g_value_get_pointer(value); g_rec_mutex_lock(lv2_turtle_parser_mutex); if(!AGS_IS_LV2_PLUGIN(lv2_plugin) || g_list_find(lv2_turtle_parser->plugin, lv2_plugin) != NULL){ g_rec_mutex_unlock(lv2_turtle_parser_mutex); return; } g_object_ref(lv2_plugin); lv2_turtle_parser->plugin = g_list_prepend(lv2_turtle_parser->plugin, lv2_plugin); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; case PROP_UI_PLUGIN: { AgsLv2uiPlugin *lv2ui_plugin; lv2ui_plugin = (AgsLv2uiPlugin *) g_value_get_pointer(value); g_rec_mutex_lock(lv2_turtle_parser_mutex); if(!AGS_IS_LV2UI_PLUGIN(lv2ui_plugin) || g_list_find(lv2_turtle_parser->ui_plugin, lv2ui_plugin) != NULL){ g_rec_mutex_unlock(lv2_turtle_parser_mutex); return; } g_object_ref(lv2ui_plugin); lv2_turtle_parser->ui_plugin = g_list_prepend(lv2_turtle_parser->ui_plugin, lv2ui_plugin); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; case PROP_PRESET: { AgsLv2Preset *lv2_preset; lv2_preset = (AgsLv2Preset *) g_value_get_pointer(value); g_rec_mutex_lock(lv2_turtle_parser_mutex); if(!AGS_IS_LV2_PRESET(lv2_preset) || g_list_find(lv2_turtle_parser->preset, lv2_preset) != NULL){ g_rec_mutex_unlock(lv2_turtle_parser_mutex); return; } g_object_ref(lv2_preset); lv2_turtle_parser->preset = g_list_prepend(lv2_turtle_parser->preset, lv2_preset); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_turtle_parser_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2TurtleParser *lv2_turtle_parser; GRecMutex *lv2_turtle_parser_mutex; lv2_turtle_parser = AGS_LV2_TURTLE_PARSER(gobject); /* get lv2 turtle parser mutex */ lv2_turtle_parser_mutex = AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX(lv2_turtle_parser); switch(prop_id){ case PROP_TURTLE: { g_rec_mutex_lock(lv2_turtle_parser_mutex); g_value_set_pointer(value, g_list_copy_deep(lv2_turtle_parser->turtle, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; case PROP_PLUGIN: { g_rec_mutex_lock(lv2_turtle_parser_mutex); g_value_set_pointer(value, g_list_copy_deep(lv2_turtle_parser->plugin, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; case PROP_UI_PLUGIN: { g_rec_mutex_lock(lv2_turtle_parser_mutex); g_value_set_pointer(value, g_list_copy_deep(lv2_turtle_parser->ui_plugin, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; case PROP_PRESET: { g_rec_mutex_lock(lv2_turtle_parser_mutex); g_value_set_pointer(value, g_list_copy_deep(lv2_turtle_parser->preset, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(lv2_turtle_parser_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_turtle_parser_dispose(GObject *gobject) { AgsLv2TurtleParser *lv2_turtle_parser; lv2_turtle_parser = AGS_LV2_TURTLE_PARSER(gobject); if(lv2_turtle_parser->turtle != NULL){ g_list_free_full(lv2_turtle_parser->turtle, g_object_unref); lv2_turtle_parser->turtle = NULL; } if(lv2_turtle_parser->plugin != NULL){ g_list_free_full(lv2_turtle_parser->plugin, g_object_unref); lv2_turtle_parser->plugin = NULL; } if(lv2_turtle_parser->ui_plugin != NULL){ g_list_free_full(lv2_turtle_parser->ui_plugin, g_object_unref); lv2_turtle_parser->ui_plugin = NULL; } if(lv2_turtle_parser->preset != NULL){ g_list_free_full(lv2_turtle_parser->preset, g_object_unref); lv2_turtle_parser->preset = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_turtle_parser_parent_class)->dispose(gobject); } void ags_lv2_turtle_parser_finalize(GObject *gobject) { AgsLv2TurtleParser *lv2_turtle_parser; lv2_turtle_parser = AGS_LV2_TURTLE_PARSER(gobject); /* destroy object mutex */ if(lv2_turtle_parser->turtle != NULL){ g_list_free_full(lv2_turtle_parser->turtle, g_object_unref); } if(lv2_turtle_parser->plugin != NULL){ g_list_free_full(lv2_turtle_parser->plugin, g_object_unref); } if(lv2_turtle_parser->ui_plugin != NULL){ g_list_free_full(lv2_turtle_parser->ui_plugin, g_object_unref); } if(lv2_turtle_parser->preset != NULL){ g_list_free_full(lv2_turtle_parser->preset, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_lv2_turtle_parser_parent_class)->finalize(gobject); } void ags_lv2_turtle_parser_parse_names_statement(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also) { xmlNode *child; if(node == NULL){ return; } child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "rdf-triple", 11)){ ags_lv2_turtle_parser_parse_names_triple(lv2_turtle_parser, current_turtle, child, turtle, n_turtle, see_also); } } child = child->next; } } void ags_lv2_turtle_parser_parse_names_triple(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also) { xmlNode *child; gchar *subject_iriref; if(node == NULL){ return; } child = node->children; subject_iriref = NULL; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "rdf-subject", 12)){ GList *xpath_result; gchar *xpath; xpath = "./rdf-iri/rdf-iriref"; xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) child); if(xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) xpath_result->data); if(strlen(str) > 2){ subject_iriref = g_strndup(str + 1, strlen(str) - 2); } if(str != NULL){ xmlFree(str); } }else{ AgsTurtle **turtle_iter; gchar *pname; xpath = "./rdf-iri/rdf-prefixed-name/rdf-pname-ln"; xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) child); if(xpath_result != NULL){ pname = xmlNodeGetContent((xmlNode *) xpath_result->data); for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ GList *start_list, *list; gchar *str; gchar *prefix, *suffix; prefix = NULL; suffix = strchr(pname, ':'); if(suffix != NULL){ prefix = g_strndup(pname, suffix - pname + 1); suffix = g_strdup(suffix + 1); } list = start_list = g_hash_table_get_keys(turtle_iter[0]->prefix_id); str = NULL; while(list != NULL){ gchar *value; value = g_hash_table_lookup(turtle_iter[0]->prefix_id, list->data); if(!g_ascii_strcasecmp(prefix, value)){ str = list->data; break; } list = list->next; } g_list_free(start_list); if(str != NULL && suffix != NULL){ subject_iriref = g_strdup_printf("%s%s", str, suffix); } g_free(prefix); g_free(suffix); if(turtle_iter[0] == current_turtle){ break; } } if(pname != NULL){ xmlFree(pname); } } } g_list_free(xpath_result); }else if(!g_ascii_strncasecmp(child->name, "rdf-predicate-object-list", 27)){ if(!see_also){ ags_lv2_turtle_parser_parse_names_predicate_object_list(lv2_turtle_parser, current_turtle, subject_iriref, child, turtle, n_turtle); }else{ ags_lv2_turtle_parser_parse_names_predicate_object_list_see_also(lv2_turtle_parser, current_turtle, subject_iriref, child, turtle, n_turtle); } }else if(!g_ascii_strncasecmp(child->name, "rdf-blank-node-property-list", 29)){ ags_lv2_turtle_parser_parse_names_blank_node_property_list(lv2_turtle_parser, current_turtle, subject_iriref, child, turtle, n_turtle); } } child = child->next; } } void ags_lv2_turtle_parser_parse_names_predicate_object_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle) { AgsLv2Manager *lv2_manager; AgsLv2Plugin *lv2_plugin; AgsTurtle **turtle_iter; xmlNode *child; GList *start_xpath_result, *xpath_result; gchar *prefix_id_doap; gchar *prefix_id_rdfs; gchar *prefix_id_lv2_core; gchar *xpath; gboolean is_plugin; gboolean is_instrument; if(node == NULL){ return; } prefix_id_doap = NULL; prefix_id_rdfs = NULL; prefix_id_lv2_core = NULL; for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ gchar *str; if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://usefulinc.com/ns/doap#")) != NULL){ prefix_id_doap = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://www.w3.org/2000/01/rdf-schema#")) != NULL){ prefix_id_rdfs = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/lv2core#")) != NULL){ prefix_id_lv2_core = str; } if(turtle_iter[0] == current_turtle){ break; } } lv2_manager = ags_lv2_manager_get_instance(); lv2_plugin = NULL; is_plugin = FALSE; is_instrument = FALSE; /* parse verbs */ xpath = "./rdf-verb[@verb = 'a']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); while(xpath_result != NULL){ xmlNode *current; GList *current_start_xpath_result; gchar *current_xpath; current = (xmlNode *) xpath_result->data; do{ current = current->next; }while(current != NULL && current->type != XML_ELEMENT_NODE); /* check plugin */ current_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_plugin = TRUE; break; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; current_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "plugin"); current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_plugin = TRUE; } g_free(current_xpath); } g_list_free(current_start_xpath_result); /* check instrument */ current_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_instrument = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; current_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "instrumentplugin"); current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_instrument = TRUE; } g_free(current_xpath); } if(current_start_xpath_result != NULL){ g_list_free(current_start_xpath_result); } /* iterate */ xpath_result = xpath_result->next; } g_list_free(start_xpath_result); /* plugin create instance */ if(is_plugin){ GList *list; list = ags_lv2_plugin_find_uri(lv2_manager->lv2_plugin, subject_iriref); if(list != NULL){ lv2_plugin = list->data; } if(lv2_plugin == NULL){ AgsUUID *current_uuid; xmlNode *node_binary; gchar *path; gchar *so_filename; gchar *filename; current_uuid = ags_uuid_alloc(); ags_uuid_generate(current_uuid); /* so filename */ node_binary = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(xpath_result != NULL){ node_binary = ((xmlNode *) xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "binary"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(xpath_result != NULL){ node_binary = ((xmlNode *) xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); path = NULL; if(turtle != NULL && turtle[0] != NULL){ path = g_path_get_dirname(turtle[0]->filename); } so_filename = NULL; if(node_binary != NULL){ xmlNode *current; GList *current_start_xpath_result, *current_xpath_result; gchar *current_xpath; current_xpath = "./rdf-object/rdf-iri/rdf-iriref"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node_binary); if(current_start_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent(current_start_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ so_filename = g_strndup(str + 1, strlen(str) - 2); } xmlFree(str); } } g_list_free(current_start_xpath_result); } filename = NULL; if(path != NULL && so_filename != NULL){ filename = g_strdup_printf("%s%c%s", path, G_DIR_SEPARATOR, so_filename); } #if AGS_DEBUG g_message("new lv2 plugin - %s", subject_iriref); #endif lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "uuid", current_uuid, "filename", filename, "uri", subject_iriref, NULL); g_object_set(lv2_plugin, "manifest", turtle[0], "turtle", turtle[n_turtle - 1], NULL); lv2_manager->lv2_plugin = g_list_prepend(lv2_manager->lv2_plugin, lv2_plugin); g_object_set(lv2_turtle_parser, "plugin", lv2_plugin, NULL); g_free(filename); } if(lv2_plugin == NULL){ g_warning("no plugin"); } } if(is_instrument){ ags_lv2_plugin_set_flags(lv2_plugin, AGS_LV2_PLUGIN_IS_SYNTHESIZER); } /* plugin - read metadata */ if(is_plugin){ xmlNode *current; GList *current_start_xpath_result, *current_xpath_result; gchar *current_xpath; /* effect */ current = NULL; current_xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_doap != NULL){ gchar *prefix_id; prefix_id = prefix_id_doap; current_xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "name"); current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); g_free(current_xpath); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(current_start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-literal/rdf-string"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; tmp = g_strndup(str + 1, strlen(str) - 2); #if AGS_DEBUG g_message(" `-- effect %s %s %s", AGS_BASE_PLUGIN(lv2_plugin)->filename, subject_iriref, tmp); #endif g_object_set(lv2_plugin, "effect", tmp, NULL); g_free(tmp); } xmlFree(str); } } g_list_free(start_label_xpath_result); } } } void ags_lv2_turtle_parser_parse_names_predicate_object_list_see_also(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle) { AgsTurtle **turtle_iter; xmlNode *current; GList *start_xpath_result, *xpath_result; gchar *prefix_id_rdfs; gchar *xpath; prefix_id_rdfs = NULL; for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ gchar *str; if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://www.w3.org/2000/01/rdf-schema#")) != NULL){ prefix_id_rdfs = str; } if(turtle_iter[0] == current_turtle){ break; } } /* label */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_rdfs != NULL){ gchar *prefix_id; prefix_id = prefix_id_rdfs; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "seealso"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_iriref_xpath_result, *iriref_xpath_result; gchar *iriref_xpath; iriref_xpath = "./rdf-object/rdf-iri/rdf-iriref"; iriref_xpath_result = start_iriref_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, iriref_xpath, (xmlNode *) current); if(start_iriref_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_iriref_xpath_result->data); if(str != NULL){ if(g_str_has_suffix(str, ".ttl>")){ AgsTurtle **next_turtle; AgsTurtle *next; gchar *path; gchar *filename; int ttl_length; guint next_n_turtle; gboolean skip; path = NULL; if(turtle != NULL && turtle[0] != NULL){ path = g_path_get_dirname(turtle[0]->filename); } ttl_length = strlen(str) - 2; filename = g_strdup_printf("%s%c%.*s", path, G_DIR_SEPARATOR, ttl_length, &(str[1])); skip = TRUE; next = ags_turtle_manager_find(ags_turtle_manager_get_instance(), filename); if(next == NULL){ g_message("new turtle - %s", filename); next = ags_turtle_new(filename); g_object_set(lv2_turtle_parser, "turtle", next, NULL); ags_turtle_load(next, NULL); ags_turtle_manager_add(ags_turtle_manager_get_instance(), (GObject *) next); skip = FALSE; g_object_unref(next); } if(next != NULL && !skip){ next_n_turtle = n_turtle + 1; next_turtle = (AgsTurtle **) malloc((next_n_turtle + 1) * sizeof(AgsTurtle *)); memcpy(next_turtle, turtle, n_turtle * sizeof(AgsTurtle *)); next_turtle[n_turtle] = next; next_turtle[n_turtle + 1] = NULL; ags_lv2_turtle_parser_parse_names(lv2_turtle_parser, next_turtle, next_n_turtle); free(next_turtle); } g_free(path); g_free(filename); } xmlFree(str); } } g_list_free(start_iriref_xpath_result); } } void ags_lv2_turtle_parser_parse_names_blank_node_property_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle) { } /** * ags_lv2_turtle_parser_parse_names: * @lv2_turtle_parser: the #AgsLv2TurtleParser * @turtle: the %NULL terminated array of #AgsTurtle * @n_turtle: the turtle count * * Parse names only from manifest and referred turtles. * * Since: 3.0.0 */ void ags_lv2_turtle_parser_parse_names(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle **turtle, guint n_turtle) { AgsTurtle *manifest; AgsTurtle *current_turtle; xmlNode *root_node; xmlNode *node; GList *list; GList *start_plugin, *plugin; GRecMutex *lv2_turtle_parser_mutex; if(!AGS_IS_LV2_TURTLE_PARSER(lv2_turtle_parser)){ return; } /* get lv2 turtle parser mutex */ lv2_turtle_parser_mutex = AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX(lv2_turtle_parser); /* get manifest */ manifest = NULL; g_rec_mutex_lock(lv2_turtle_parser_mutex); list = g_list_last(lv2_turtle_parser->turtle); if(list != NULL){ manifest = list->data; } g_rec_mutex_unlock(lv2_turtle_parser_mutex); if(turtle == NULL){ if(manifest == NULL){ return; }else{ guint turtle_count; turtle_count = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; n_turtle = turtle_count; } } if(n_turtle == 0){ g_warning("missing argument"); return; } current_turtle = turtle[n_turtle - 1]; /* get root node */ root_node = xmlDocGetRootElement(current_turtle->doc); /* start parse */ node = NULL; if(root_node != NULL){ node = root_node->children; } while(node != NULL){ if(node->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(node->name, "rdf-statement", 14)){ ags_lv2_turtle_parser_parse_names_statement(lv2_turtle_parser, current_turtle, node, turtle, n_turtle, FALSE); } } node = node->next; } /* parse see also */ if(root_node != NULL){ node = root_node->children; } while(node != NULL){ if(node->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(node->name, "rdf-statement", 14)){ ags_lv2_turtle_parser_parse_names_statement(lv2_turtle_parser, current_turtle, node, turtle, n_turtle, TRUE); } } node = node->next; } } void ags_lv2_turtle_parser_parse_statement(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also) { xmlNode *child; if(node == NULL){ return; } child = node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "rdf-triple", 11)){ ags_lv2_turtle_parser_parse_triple(lv2_turtle_parser, current_turtle, child, turtle, n_turtle, see_also); } } child = child->next; } } void ags_lv2_turtle_parser_parse_triple(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, xmlNode *node, AgsTurtle **turtle, guint n_turtle, gboolean see_also) { xmlNode *child; gchar *subject_iriref; if(node == NULL){ return; } child = node->children; subject_iriref = NULL; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "rdf-subject", 12)){ GList *xpath_result; gchar *xpath; xpath = "./rdf-iri/rdf-iriref"; xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) child); if(xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) xpath_result->data); if(strlen(str) > 2){ subject_iriref = g_strndup(str + 1, strlen(str) - 2); } if(str != NULL){ xmlFree(str); } }else{ AgsTurtle **turtle_iter; gchar *pname; xpath = "./rdf-iri/rdf-prefixed-name/rdf-pname-ln"; xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) child); if(xpath_result != NULL){ pname = xmlNodeGetContent((xmlNode *) xpath_result->data); for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ GList *start_list, *list; gchar *str; gchar *prefix, *suffix; prefix = NULL; suffix = strchr(pname, ':'); if(suffix != NULL){ prefix = g_strndup(pname, suffix - pname + 1); suffix = g_strdup(suffix + 1); } list = start_list = g_hash_table_get_keys(turtle_iter[0]->prefix_id); str = NULL; while(list != NULL){ gchar *value; value = g_hash_table_lookup(turtle_iter[0]->prefix_id, list->data); if(!g_ascii_strcasecmp(prefix, value)){ str = list->data; break; } list = list->next; } g_list_free(start_list); if(str != NULL && suffix != NULL){ subject_iriref = g_strdup_printf("%s%s", str, suffix); } g_free(prefix); g_free(suffix); if(turtle_iter[0] == current_turtle){ break; } } if(pname != NULL){ g_free(pname); } } } g_list_free(xpath_result); }else if(!g_ascii_strncasecmp(child->name, "rdf-predicate-object-list", 27)){ if(!see_also){ ags_lv2_turtle_parser_parse_predicate_object_list(lv2_turtle_parser, current_turtle, subject_iriref, child, turtle, n_turtle); }else{ ags_lv2_turtle_parser_parse_predicate_object_list_see_also(lv2_turtle_parser, current_turtle, subject_iriref, child, turtle, n_turtle); } }else if(!g_ascii_strncasecmp(child->name, "rdf-blank-node-property-list", 29)){ ags_lv2_turtle_parser_parse_blank_node_property_list(lv2_turtle_parser, current_turtle, subject_iriref, child, turtle, n_turtle); } } child = child->next; } } void ags_lv2_turtle_parser_parse_predicate_object_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle) { AgsLv2Manager *lv2_manager; AgsLv2uiManager *lv2ui_manager; AgsLv2PresetManager *lv2_preset_manager; AgsLv2Plugin *lv2_plugin; AgsLv2uiPlugin *lv2ui_plugin; AgsLv2Preset *lv2_preset; AgsTurtle **turtle_iter; xmlNode *child; GList *start_xpath_result, *xpath_result; gchar *prefix_id_doap; gchar *prefix_id_foaf; gchar *prefix_id_rdfs; gchar *prefix_id_rdf; gchar *prefix_id_lv2_core; gchar *prefix_id_lv2ui; gchar *prefix_id_lv2p; gchar *prefix_id_lv2_worker; gchar *prefix_id_lv2_atom; gchar *prefix_id_lv2_midi; gchar *prefix_id_lv2_port_info; gchar *xpath; gboolean is_plugin, is_ui_plugin; gboolean is_instrument; gboolean is_preset; if(node == NULL){ return; } prefix_id_doap = NULL; prefix_id_foaf = NULL; prefix_id_rdfs = NULL; prefix_id_rdf = NULL; prefix_id_lv2_core = NULL; prefix_id_lv2ui = NULL; prefix_id_lv2p = NULL; prefix_id_lv2_worker = NULL; prefix_id_lv2_atom = NULL; prefix_id_lv2_midi = NULL; prefix_id_lv2_port_info = NULL; for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ gchar *str; if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://usefulinc.com/ns/doap#")) != NULL){ prefix_id_doap = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://xmlns.com/foaf/0.1/#")) != NULL){ prefix_id_foaf = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://www.w3.org/2000/01/rdf-schema#")) != NULL){ prefix_id_rdfs = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://www.w3.org/1999/02/22-rdf-syntax-ns#")) != NULL){ prefix_id_rdf = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/lv2core#")) != NULL){ prefix_id_lv2_core = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/extensions/ui#")) != NULL){ prefix_id_lv2ui = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/ext/presets#")) != NULL){ prefix_id_lv2p = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/ext/worker#")) != NULL){ prefix_id_lv2_worker = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/ext/atom#")) != NULL){ prefix_id_lv2_atom = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/ext/midi#")) != NULL){ prefix_id_lv2_midi = str; } if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://lv2plug.in/ns/dev/extportinfo#")) != NULL){ prefix_id_lv2_port_info = str; } if(turtle_iter[0] == current_turtle){ break; } } lv2_manager = ags_lv2_manager_get_instance(); lv2ui_manager = ags_lv2ui_manager_get_instance(); lv2_preset_manager = ags_lv2_preset_manager_get_instance(); lv2_plugin = NULL; lv2ui_plugin = NULL; lv2_preset = NULL; child = node->children; is_plugin = FALSE; is_ui_plugin = FALSE; is_instrument = FALSE; is_preset = FALSE; /* parse verbs */ xpath = "./rdf-verb[@verb = 'a']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); while(xpath_result != NULL){ xmlNode *current; GList *current_start_xpath_result; gchar *current_xpath; current = (xmlNode *) xpath_result->data; do{ current = current->next; }while(current != NULL && current->type != XML_ELEMENT_NODE); /* check plugin */ current_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_plugin = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; current_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "plugin"); current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_plugin = TRUE; } g_free(current_xpath); } if(current_start_xpath_result != NULL){ g_list_free(current_start_xpath_result); } /* check instrument */ current_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_instrument = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; current_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "instrumentplugin"); current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_instrument = TRUE; } g_free(current_xpath); } if(current_start_xpath_result != NULL){ g_list_free(current_start_xpath_result); } /* check UI plugin */ current_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_ui_plugin = TRUE; }else if(prefix_id_lv2ui != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2ui; current_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "gtkui"); current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_ui_plugin = TRUE; } g_free(current_xpath); } if(current_start_xpath_result != NULL){ g_list_free(current_start_xpath_result); } /* check preset */ current_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_preset = TRUE; }else if(prefix_id_lv2p != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2p; current_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "preset"); current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) current); if(current_start_xpath_result != NULL){ is_preset = TRUE; } g_free(current_xpath); } if(current_start_xpath_result != NULL){ g_list_free(current_start_xpath_result); } /* iterate */ xpath_result = xpath_result->next; } g_list_free(start_xpath_result); /* plugin create instance */ if(is_plugin){ GList *list; list = ags_lv2_plugin_find_uri(lv2_manager->lv2_plugin, subject_iriref); if(list != NULL){ lv2_plugin = list->data; g_object_set(lv2_turtle_parser, "plugin", lv2_plugin, NULL); #if AGS_DEBUG g_message("found lv2 plugin - %s", subject_iriref); #endif } if(lv2_plugin == NULL){ AgsUUID *current_uuid; xmlNode *node_binary; gchar *path; gchar *so_filename; gchar *filename; current_uuid = ags_uuid_alloc(); ags_uuid_generate(current_uuid); /* so filename */ node_binary = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(xpath_result != NULL){ node_binary = ((xmlNode *) xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "binary"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(xpath_result != NULL){ node_binary = ((xmlNode *) xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); path = g_path_get_dirname(turtle[0]->filename); so_filename = NULL; if(node_binary != NULL){ xmlNode *current; GList *current_start_xpath_result, *current_xpath_result; gchar *current_xpath; current_xpath = "./rdf-object/rdf-iri/rdf-iriref"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node_binary); if(current_start_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent(current_start_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ so_filename = g_strndup(str + 1, strlen(str) - 2); } xmlFree(str); } } g_list_free(current_start_xpath_result); } filename = NULL; if(path != NULL && so_filename != NULL){ filename = g_strdup_printf("%s%c%s", path, G_DIR_SEPARATOR, so_filename); } #if AGS_DEBUG g_message("new lv2 plugin - %s", subject_iriref); #endif lv2_plugin = g_object_new(AGS_TYPE_LV2_PLUGIN, "uuid", current_uuid, "filename", filename, "uri", subject_iriref, NULL); if(ags_lv2_manager_global_get_preserve_turtle()){ g_object_set(lv2_plugin, "manifest", turtle[0], "turtle", turtle[n_turtle - 1], NULL); } lv2_manager->lv2_plugin = g_list_prepend(lv2_manager->lv2_plugin, lv2_plugin); g_object_set(lv2_turtle_parser, "plugin", lv2_plugin, NULL); g_free(filename); } if(lv2_plugin == NULL){ g_warning("no plugin"); } } if(is_instrument){ ags_lv2_plugin_set_flags(lv2_plugin, AGS_LV2_PLUGIN_IS_SYNTHESIZER); } if(is_ui_plugin){ GList *list; list = ags_lv2ui_plugin_find_gui_uri(lv2ui_manager->lv2ui_plugin, subject_iriref); if(list != NULL){ lv2ui_plugin = list->data; g_object_set(lv2_turtle_parser, "ui-plugin", lv2ui_plugin, NULL); } if(lv2ui_plugin == NULL){ AgsUUID *current_uuid; xmlNode *node_binary; gchar *path; gchar *so_filename; gchar *filename; current_uuid = ags_uuid_alloc(); ags_uuid_generate(current_uuid); /* so filename */ node_binary = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(xpath_result != NULL){ node_binary = ((xmlNode *) xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2ui != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2ui; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "binary"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(xpath_result != NULL){ node_binary = ((xmlNode *) xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); path = g_path_get_dirname(turtle[0]->filename); so_filename = NULL; if(node_binary != NULL){ xmlNode *current; GList *current_start_xpath_result, *current_xpath_result; gchar *current_xpath; current_xpath = "./rdf-object/rdf-iri/rdf-iriref"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node_binary); if(current_start_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent(current_start_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ so_filename = g_strndup(str + 1, strlen(str) - 2); } xmlFree(str); } } g_list_free(current_start_xpath_result); } filename = g_strdup_printf("%s%c%s", path, G_DIR_SEPARATOR, so_filename); #if AGS_DEBUG g_message("new lv2ui plugin - %s", subject_iriref); #endif lv2ui_plugin = g_object_new(AGS_TYPE_LV2UI_PLUGIN, "uuid", current_uuid, "ui-filename", filename, "gui-uri", subject_iriref, NULL); lv2ui_manager->lv2ui_plugin = g_list_prepend(lv2ui_manager->lv2ui_plugin, lv2ui_plugin); if(ags_lv2_manager_global_get_preserve_turtle()){ g_object_set(lv2ui_plugin, "manifest", turtle[0], "gui-turtle", turtle[n_turtle - 1], NULL); } g_object_set(lv2_turtle_parser, "ui-plugin", lv2ui_plugin, NULL); g_free(filename); } } if(is_preset){ GList *list; list = ags_lv2_preset_find_preset_uri(lv2_preset_manager->lv2_preset, subject_iriref); if(list != NULL){ lv2_preset = AGS_LV2_PRESET(list->data); g_object_set(lv2_turtle_parser, "preset", lv2_preset, NULL); } if(lv2_preset == NULL){ #if AGS_DEBUG g_message("new lv2 preset - %s", subject_iriref); #endif lv2_preset = g_object_new(AGS_TYPE_LV2_PRESET, "uri", subject_iriref, NULL); lv2_preset_manager->lv2_preset = g_list_prepend(lv2_preset_manager->lv2_preset, lv2_preset); if(ags_lv2_manager_global_get_preserve_turtle()){ g_object_set(lv2_preset, "manifest", turtle[0], "turtle", turtle[n_turtle - 1], NULL); } g_object_set(lv2_turtle_parser, "preset", lv2_preset, NULL); } if(lv2_preset == NULL){ g_critical("preset not found %s", subject_iriref); } } /* plugin - read metadata */ if(is_plugin){ xmlNode *current; GList *current_start_xpath_result, *current_xpath_result; gchar *current_xpath; /* effect */ current = NULL; current_xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_doap != NULL){ gchar *prefix_id; prefix_id = prefix_id_doap; current_xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "name"); current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); g_free(current_xpath); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(current_start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-literal/rdf-string"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; #if AGS_DEBUG g_message(" `-- effect %s", str); #endif tmp = g_strndup(str + 1, strlen(str) - 2); g_object_set(lv2_plugin, "effect", tmp, NULL); g_free(tmp); } xmlFree(str); } } g_list_free(start_label_xpath_result); } /* ui */ current = NULL; current_xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_doap != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2ui; current_xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "ui"); current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); g_free(current_xpath); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(current_start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-iri/rdf-iriref"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; #if AGS_DEBUG g_message(" `-- ui %s", str); #endif tmp = g_strndup(str + 1, strlen(str) - 2); g_object_set(lv2_plugin, "ui-uri", tmp, NULL); g_free(tmp); } xmlFree(str); } } g_list_free(start_label_xpath_result); } /* worker */ current = NULL; current_xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_doap != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; current_xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "requiredfeature"); current_xpath_result = current_start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_xpath, (xmlNode *) node); g_free(current_xpath); if(current_start_xpath_result != NULL){ current = ((xmlNode *) current_start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(current_start_xpath_result); if(current != NULL){ GList *start_worker_xpath_result, *worker_xpath_result; gchar *worker_xpath; worker_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = 'http://lv2plug.in/ns/ext/worker#schedule']"; worker_xpath_result = start_worker_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, worker_xpath, (xmlNode *) current); if(start_worker_xpath_result != NULL){ ags_lv2_plugin_set_flags(lv2_plugin, AGS_LV2_PLUGIN_NEEDS_WORKER); }else if(prefix_id_lv2_worker != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_worker; xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "schedule"); start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) current); if(start_xpath_result != NULL){ ags_lv2_plugin_set_flags(lv2_plugin, AGS_LV2_PLUGIN_NEEDS_WORKER); } g_list_free(start_xpath_result); g_free(xpath); } g_list_free(start_worker_xpath_result); } /* name */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_foaf != NULL){ gchar *prefix_id; prefix_id = prefix_id_foaf; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "name"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-literal/rdf-string"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ g_object_set(lv2_plugin, "foaf-name", str, NULL); xmlFree(str); } } g_list_free(start_label_xpath_result); } /* homepage */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_foaf != NULL){ gchar *prefix_id; prefix_id = prefix_id_foaf; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "homepage"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-iri/rdf-iriref"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ g_object_set(lv2_plugin, "foaf-homepage", str, NULL); xmlFree(str); } } g_list_free(start_label_xpath_result); } /* mbox */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_foaf != NULL){ gchar *prefix_id; prefix_id = prefix_id_foaf; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "mbox"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-iri/rdf-iriref"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ g_object_set(lv2_plugin, "foaf-mbox", str, NULL); xmlFree(str); } } g_list_free(start_label_xpath_result); } } /* plugin - read ports */ if(is_plugin){ xmlNode *current; gboolean is_pname; current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); is_pname = FALSE; if(start_xpath_result != NULL){ is_pname = FALSE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "port"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ is_pname = TRUE; } } if(xpath_result != NULL){ if(!is_pname){ current = ((xmlNode *) xpath_result->data)->parent->parent->parent->next; }else{ current = ((xmlNode *) xpath_result->data)->parent->parent->parent->parent->next; } while(current != NULL){ if(!g_ascii_strncasecmp(current->name, "rdf-object-list", 16)){ xmlNode *current_child; GList *current_child_start_xpath_result, *current_child_xpath_result; gchar *current_child_xpath; current_child = NULL; if(current != NULL){ current_child = current->children; } while(current_child != NULL){ if(current_child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(current_child->name, "rdf-object", 12)){ AgsPluginPort *plugin_port; xmlNode *current_predicate; GList *start_port_predicate_xpath_result, *port_predicate_xpath_result; GList *start_property_xpath_result, *property_xpath_result; gchar *port_predicate_xpath; gchar *property_xpath; guint port_index; gboolean is_audio_port, is_control_port; gboolean is_atom_port, is_event_port; gboolean is_output_port, is_input_port; guint scale_point_count; gboolean scale_point_has_pname; is_audio_port = FALSE; is_control_port = FALSE; is_atom_port = FALSE; is_event_port = FALSE; is_output_port = FALSE; is_input_port = FALSE; /* port index */ plugin_port = NULL; port_index = 0; current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "index"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-numeric"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ GList *start_list, *list; port_index = g_ascii_strtoull(str, NULL, 10); xmlFree(str); g_object_get(lv2_plugin, "plugin-port", &start_list, NULL); list = ags_plugin_port_find_port_index(start_list, port_index); if(list != NULL){ #if AGS_DEBUG g_message("found LV2 plugin port"); #endif plugin_port = list->data; g_object_ref(plugin_port); g_list_free_full(start_list, g_object_unref); } } } g_list_free(start_value_xpath_result); } if(plugin_port == NULL){ #if AGS_DEBUG g_message("new LV2 plugin port"); #endif /* add plugin port */ plugin_port = ags_plugin_port_new(); g_object_set(plugin_port, "port-index", port_index, NULL); g_object_set(lv2_plugin, "plugin-port", plugin_port, NULL); /* init range value */ g_value_init(plugin_port->upper_value, G_TYPE_FLOAT); g_value_init(plugin_port->lower_value, G_TYPE_FLOAT); g_value_init(plugin_port->default_value, G_TYPE_FLOAT); /* init range */ g_value_set_float(plugin_port->upper_value, 0.0); g_value_set_float(plugin_port->lower_value, 0.0); g_value_set_float(plugin_port->default_value, 0.0); } /* port type */ port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb[@verb = 'a']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); while(port_predicate_xpath_result != NULL){ xmlNode *node_port_type; GList *start_port_type_xpath_result, *port_type_xpath_result; gchar *port_type_xpath; node_port_type = ((xmlNode *) port_predicate_xpath_result->data)->next; /* check audio port */ port_type_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); if(start_port_type_xpath_result != NULL){ is_audio_port = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_type_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "audioport"); port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); g_free(port_type_xpath); if(start_port_type_xpath_result != NULL){ is_audio_port = TRUE; } } g_list_free(start_port_type_xpath_result); /* check control port */ port_type_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); if(start_port_type_xpath_result != NULL){ is_control_port = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_type_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "controlport"); port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); g_free(port_type_xpath); if(start_port_type_xpath_result != NULL){ is_control_port = TRUE; } } g_list_free(start_port_type_xpath_result); /* check atom port */ port_type_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); if(start_port_type_xpath_result != NULL){ is_atom_port = TRUE; }else if(prefix_id_lv2_atom != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_atom; port_type_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "atomport"); port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); g_free(port_type_xpath); if(start_port_type_xpath_result != NULL){ is_atom_port = TRUE; } } g_list_free(start_port_type_xpath_result); /* check event port */ port_type_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); if(start_port_type_xpath_result != NULL){ is_event_port = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_type_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "eventport"); port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); g_free(port_type_xpath); if(start_port_type_xpath_result != NULL){ is_event_port = TRUE; } } g_list_free(start_port_type_xpath_result); /* check output port */ port_type_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); if(start_port_type_xpath_result != NULL){ is_output_port = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_type_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "outputport"); port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); g_free(port_type_xpath); if(start_port_type_xpath_result != NULL){ is_output_port = TRUE; } } g_list_free(start_port_type_xpath_result); /* check input port */ port_type_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); if(start_port_type_xpath_result != NULL){ is_input_port = TRUE; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_type_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "inputport"); port_type_xpath_result = start_port_type_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_type_xpath, (xmlNode *) node_port_type); g_free(port_type_xpath); if(start_port_type_xpath_result != NULL){ is_input_port = TRUE; } } g_list_free(start_port_type_xpath_result); /* iterate */ port_predicate_xpath_result = port_predicate_xpath_result->next; } g_list_free(start_port_predicate_xpath_result); /* set flags */ if(is_audio_port){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_AUDIO); } if(is_atom_port){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_ATOM); } if(is_event_port){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_EVENT); } if(is_control_port){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_CONTROL); } if(is_output_port){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_OUTPUT); } if(is_input_port){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_INPUT); } /* port name */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "name"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-string"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; tmp = g_strndup(str + 1, strlen(str) - 2); g_object_set(plugin_port, "port-name", tmp, NULL); g_free(tmp); } xmlFree(str); } } g_list_free(start_value_xpath_result); } /* port symbol */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "symbol"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-string"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; tmp = g_strndup(str + 1, strlen(str) - 2); g_object_set(plugin_port, "port-symbol", tmp, NULL); g_free(tmp); } xmlFree(str); } } g_list_free(start_value_xpath_result); } /* port property */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "portproperty"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ /* toggled */ property_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED); }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; property_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "toggled"); property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); g_free(property_xpath); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_TOGGLED); } } g_list_free(start_property_xpath_result); /* enumeration */ property_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_ENUMERATION); }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; property_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "enumeration"); property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); g_free(property_xpath); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_ENUMERATION); } } g_list_free(start_property_xpath_result); /* logarithmic */ property_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC); }else if(prefix_id_lv2_port_info != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_port_info; property_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "logarithmic"); property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); g_free(property_xpath); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_LOGARITHMIC); } } g_list_free(start_property_xpath_result); /* integer */ property_xpath = "./rdf-object/rdf-iri/rdf-iriref[text() = '']"; property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER); }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; property_xpath = g_strdup_printf("./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "integer"); property_xpath_result = start_property_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, property_xpath, (xmlNode *) current_predicate); g_free(property_xpath); if(start_property_xpath_result != NULL){ ags_plugin_port_set_flags(plugin_port, AGS_PLUGIN_PORT_INTEGER); } } g_list_free(start_property_xpath_result); } /* default */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "default"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-numeric"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ gfloat default_value; default_value = g_ascii_strtod(str, NULL); g_value_set_float(plugin_port->default_value, default_value); xmlFree(str); } } g_list_free(start_value_xpath_result); } /* minimum */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "minimum"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-numeric"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ gfloat minimum_value; minimum_value = g_ascii_strtod(str, NULL); g_value_set_float(plugin_port->lower_value, minimum_value); xmlFree(str); } } g_list_free(start_value_xpath_result); } /* maximum */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "maximum"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-numeric"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ gfloat maximum_value; maximum_value = g_ascii_strtod(str, NULL); g_value_set_float(plugin_port->upper_value, maximum_value); xmlFree(str); } } g_list_free(start_value_xpath_result); } /* scale point */ scale_point_has_pname = FALSE; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ //empty }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "scalepoint"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ scale_point_has_pname = TRUE; } } for(scale_point_count = 0; port_predicate_xpath_result != NULL; scale_point_count++){ xmlNode *scale_point_predicate; GList *start_current_predicate_xpath_result, *current_predicate_xpath_result; GList *start_label_xpath_result, *label_xpath_result; GList *start_value_xpath_result, *value_xpath_result; gchar *current_predicate_xpath; gchar *label_xpath; gchar *value_xpath; plugin_port->scale_steps = scale_point_count + 1; if(plugin_port->scale_point == NULL){ plugin_port->scale_point = (gchar **) malloc(2 * sizeof(gchar *)); plugin_port->scale_point[0] = NULL; plugin_port->scale_point[1] = NULL; plugin_port->scale_value = (gdouble *) malloc(1 * sizeof(gdouble)); plugin_port->scale_value[0] = 0.0; }else{ plugin_port->scale_point = (gchar **) realloc(plugin_port->scale_point, (scale_point_count + 2) * sizeof(gchar *)); plugin_port->scale_point[scale_point_count] = NULL; plugin_port->scale_point[scale_point_count + 1] = NULL; plugin_port->scale_value = (gdouble *) realloc(plugin_port->scale_value, (scale_point_count + 1) * sizeof(gdouble)); plugin_port->scale_value[scale_point_count] = 0.0; } current_predicate = NULL; if(!scale_point_has_pname){ current_predicate = ((xmlNode *) port_predicate_xpath_result->data)->parent->parent->parent->next; }else{ current_predicate = ((xmlNode *) port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } /* label */ scale_point_predicate = NULL; current_predicate_xpath = "./rdf-object/rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; current_predicate_xpath_result = start_current_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_predicate_xpath, (xmlNode *) current_predicate); if(start_current_predicate_xpath_result != NULL){ scale_point_predicate = ((xmlNode *) start_current_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_rdfs != NULL){ gchar *prefix_id; prefix_id = prefix_id_rdfs; current_predicate_xpath = g_strdup_printf("./rdf-object/rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "label"); current_predicate_xpath_result = start_current_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_predicate_xpath, (xmlNode *) current_predicate); g_free(current_predicate_xpath); if(start_current_predicate_xpath_result != NULL){ scale_point_predicate = ((xmlNode *) start_current_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_current_predicate_xpath_result); if(scale_point_predicate != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-literal/rdf-string"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) scale_point_predicate); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ plugin_port->scale_point[scale_point_count] = g_strdup(str); xmlFree(str); } } g_list_free(start_label_xpath_result); } /* value */ scale_point_predicate = NULL; current_predicate_xpath = "./rdf-object/rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; current_predicate_xpath_result = start_current_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_predicate_xpath, (xmlNode *) current_predicate); if(start_current_predicate_xpath_result != NULL){ scale_point_predicate = ((xmlNode *) start_current_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_rdf != NULL){ gchar *prefix_id; prefix_id = prefix_id_rdf; current_predicate_xpath = g_strdup_printf("./rdf-object/rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "value"); current_predicate_xpath_result = start_current_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, current_predicate_xpath, (xmlNode *) current_predicate); g_free(current_predicate_xpath); if(start_current_predicate_xpath_result != NULL){ scale_point_predicate = ((xmlNode *) start_current_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_current_predicate_xpath_result); if(scale_point_predicate != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-literal/rdf-string"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) scale_point_predicate); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ plugin_port->scale_value[scale_point_count] = g_ascii_strtod(str, NULL); xmlFree(str); } } g_list_free(start_label_xpath_result); } /* iterate */ port_predicate_xpath_result = port_predicate_xpath_result->next; } g_list_free(start_port_predicate_xpath_result); g_object_unref(plugin_port); } } current_child = current_child->next; } } current = current->next; } // xpath_result = xpath_result->next; } g_list_free(start_xpath_result); } if(is_ui_plugin){ //TODO:JK: implement me } if(is_preset){ xmlNode *current; /* label */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_rdfs != NULL){ gchar *prefix_id; prefix_id = prefix_id_rdfs; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "label"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_label_xpath_result, *label_xpath_result; gchar *label_xpath; label_xpath = "./rdf-object/rdf-literal/rdf-string"; label_xpath_result = start_label_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, label_xpath, (xmlNode *) current); if(start_label_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_label_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; tmp = g_strndup(str + 1, strlen(str) - 2); g_object_set(lv2_preset, "preset-label", str, NULL); g_free(tmp); } xmlFree(str); } } g_list_free(start_label_xpath_result); } /* bank */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2p != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2p; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "bank"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_bank_xpath_result, *bank_xpath_result; gchar *bank_xpath; bank_xpath = "./rdf-object/rdf-literal/rdf-string"; bank_xpath_result = start_bank_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, bank_xpath, (xmlNode *) current); if(start_bank_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_bank_xpath_result->data); if(str != NULL){ g_object_set(lv2_preset, "bank", str, NULL); xmlFree(str); } } g_list_free(start_bank_xpath_result); } /* applies to */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "appliesto"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_applies_to_xpath_result, *applies_to_xpath_result; gchar *applies_to_xpath; applies_to_xpath = "./rdf-object/rdf-iri/rdf-iriref"; applies_to_xpath_result = start_applies_to_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, applies_to_xpath, (xmlNode *) current); if(start_applies_to_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_applies_to_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ gchar *tmp; tmp = g_strndup(str + 1, strlen(str) - 2); g_object_set(lv2_preset, "applies-to", tmp, NULL); g_free(tmp); } xmlFree(str); } }else{ applies_to_xpath = "./rdf-object/rdf-iri/rdf-prefixed-name/rdf-pname-ln"; applies_to_xpath_result = start_applies_to_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, applies_to_xpath, (xmlNode *) current); if(start_applies_to_xpath_result != NULL){ AgsTurtle **turtle_iter; gchar *applies_to_pname; gchar *applies_to_iriref; applies_to_pname = xmlNodeGetContent(start_applies_to_xpath_result->data); applies_to_iriref = NULL; for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ GList *start_list, *list; gchar *str; gchar *prefix, *suffix; prefix = NULL; suffix = strchr(applies_to_pname, ':'); if(suffix != NULL){ prefix = g_strndup(applies_to_pname, suffix - applies_to_pname + 1); suffix = g_strdup(suffix + 1); } list = start_list = g_hash_table_get_keys(turtle_iter[0]->prefix_id); str = NULL; while(list != NULL){ gchar *value; value = g_hash_table_lookup(turtle_iter[0]->prefix_id, list->data); if(!g_ascii_strcasecmp(prefix, value)){ str = list->data; break; } list = list->next; } g_list_free(start_list); if(str != NULL && suffix != NULL){ applies_to_iriref = g_strdup_printf("%s%s", str, suffix); } g_free(prefix); g_free(suffix); if(turtle_iter[0] == current_turtle){ break; } } g_object_set(lv2_preset, "applies-to", applies_to_iriref, NULL); if(applies_to_pname){ xmlFree(applies_to_pname); } g_free(applies_to_iriref); } } g_list_free(start_applies_to_xpath_result); } /* port */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "port"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL && !g_ascii_strncasecmp(current->name, "rdf-object-list", 16)){ xmlNode *current_child; current_child = NULL; if(current != NULL){ current_child = current->children; } while(current_child != NULL){ if(current_child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(current_child->name, "rdf-object", 12)){ AgsLv2PortPreset *port_preset; xmlNode *current_predicate; GList *start_port_predicate_xpath_result, *port_predicate_xpath_result; gchar *port_predicate_xpath; gchar *port_symbol; gfloat value; port_symbol = NULL; value = 0.0; /* port symbol */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2_core != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2_core; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "symbol"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-string"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ if(strlen(str) > 2){ port_symbol = g_strndup(str + 1, strlen(str) - 2); } xmlFree(str); } } g_list_free(start_value_xpath_result); } /* value */ current_predicate = NULL; port_predicate_xpath = "./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_lv2p != NULL){ gchar *prefix_id; prefix_id = prefix_id_lv2p; port_predicate_xpath = g_strdup_printf("./rdf-blank-node-property-list/rdf-predicate-object-list/rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "value"); port_predicate_xpath_result = start_port_predicate_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, port_predicate_xpath, (xmlNode *) current_child); g_free(port_predicate_xpath); if(start_port_predicate_xpath_result != NULL){ current_predicate = ((xmlNode *) start_port_predicate_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_port_predicate_xpath_result); if(current_predicate != NULL){ GList *start_value_xpath_result, *value_xpath_result; gchar *value_xpath; value_xpath = "./rdf-object/rdf-literal/rdf-numeric"; value_xpath_result = start_value_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, value_xpath, (xmlNode *) current_predicate); if(start_value_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_value_xpath_result->data); if(str != NULL){ value = g_ascii_strtod(str, NULL); xmlFree(str); } } g_list_free(start_value_xpath_result); } if(port_symbol != NULL){ port_preset = ags_lv2_port_preset_alloc(port_symbol, G_TYPE_FLOAT); lv2_preset->port_preset = g_list_prepend(lv2_preset->port_preset, port_preset); g_value_set_float(port_preset->port_value, value); } } } current_child = current_child->next; } } } } void ags_lv2_turtle_parser_parse_predicate_object_list_see_also(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle) { AgsTurtle **turtle_iter; xmlNode *current; GList *start_xpath_result, *xpath_result; gchar *prefix_id_rdfs; gchar *xpath; prefix_id_rdfs = NULL; for(turtle_iter = turtle; turtle_iter[0] != NULL; turtle_iter++){ gchar *str; if((str = g_hash_table_lookup(turtle_iter[0]->prefix_id, "http://www.w3.org/2000/01/rdf-schema#")) != NULL){ prefix_id_rdfs = str; } if(turtle_iter[0] == current_turtle){ break; } } /* label */ current = NULL; xpath = "./rdf-verb/rdf-predicate/rdf-iri/rdf-iriref[text() = '']"; xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->next; }else if(prefix_id_rdfs != NULL){ gchar *prefix_id; prefix_id = prefix_id_rdfs; xpath = g_strdup_printf("./rdf-verb/rdf-predicate/rdf-iri/rdf-prefixed-name/rdf-pname-ln[text() = '%s%s']", prefix_id, "seealso"); xpath_result = start_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, xpath, (xmlNode *) node); g_free(xpath); if(start_xpath_result != NULL){ current = ((xmlNode *) start_xpath_result->data)->parent->parent->parent->parent->next; } } g_list_free(start_xpath_result); if(current != NULL){ GList *start_iriref_xpath_result, *iriref_xpath_result; gchar *iriref_xpath; iriref_xpath = "./rdf-object/rdf-iri/rdf-iriref"; iriref_xpath_result = start_iriref_xpath_result = ags_turtle_find_xpath_with_context_node(current_turtle, iriref_xpath, (xmlNode *) current); if(start_iriref_xpath_result != NULL){ gchar *str; str = xmlNodeGetContent((xmlNode *) start_iriref_xpath_result->data); if(str != NULL && g_str_has_suffix(str, ".ttl>")){ AgsTurtle **next_turtle; AgsTurtle *next; gchar *path; gchar *filename; int ttl_length; guint next_n_turtle; gboolean skip; path = g_path_get_dirname(turtle[0]->filename); ttl_length = strlen(str) - 2; filename = g_strdup_printf("%s%c%.*s", path, G_DIR_SEPARATOR, ttl_length, &(str[1])); if(ags_lv2_manager_global_get_parse_names()){ skip = FALSE; }else{ skip = TRUE; } next = ags_turtle_manager_find(ags_turtle_manager_get_instance(), filename); if(next == NULL){ g_message("new turtle - %s", filename); next = ags_turtle_new(filename); g_object_set(lv2_turtle_parser, "turtle", next, NULL); ags_turtle_load(next, NULL); ags_turtle_manager_add(ags_turtle_manager_get_instance(), (GObject *) next); skip = FALSE; g_object_unref(next); } if(next != NULL && !skip){ next_n_turtle = n_turtle + 1; next_turtle = (AgsTurtle **) malloc((next_n_turtle + 1) * sizeof(AgsTurtle *)); memcpy(next_turtle, turtle, n_turtle * sizeof(AgsTurtle *)); next_turtle[n_turtle] = next; next_turtle[n_turtle + 1] = NULL; ags_lv2_turtle_parser_parse(lv2_turtle_parser, next_turtle, next_n_turtle); free(next_turtle); } g_free(path); g_free(filename); } if(str != NULL){ xmlFree(str); } } g_list_free(start_iriref_xpath_result); } } void ags_lv2_turtle_parser_parse_blank_node_property_list(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle *current_turtle, gchar *subject_iriref, xmlNode *node, AgsTurtle **turtle, guint n_turtle) { } /** * ags_lv2_turtle_parser_parse: * @lv2_turtle_parser: the #AgsLv2TurtleParser * @turtle: (element-type Ags.Turtle) (array zero-terminated=1) (inout): the %NULL terminated array of #AgsTurtle * @n_turtle: the turtle count * * Parse manifest and referred turtles. * * Since: 3.0.0 */ void ags_lv2_turtle_parser_parse(AgsLv2TurtleParser *lv2_turtle_parser, AgsTurtle **turtle, guint n_turtle) { AgsTurtle *manifest; AgsTurtle *current_turtle; xmlNode *root_node; xmlNode *node; GList *list; GList *start_plugin, *plugin; GList *start_ui_plugin, *ui_plugin; GList *start_preset, *preset; GRecMutex *lv2_turtle_parser_mutex; if(!AGS_IS_LV2_TURTLE_PARSER(lv2_turtle_parser)){ return; } /* get lv2 turtle parser mutex */ lv2_turtle_parser_mutex = AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX(lv2_turtle_parser); /* get manifest */ manifest = NULL; g_rec_mutex_lock(lv2_turtle_parser_mutex); list = g_list_last(lv2_turtle_parser->turtle); if(list != NULL){ manifest = list->data; } g_rec_mutex_unlock(lv2_turtle_parser_mutex); if(turtle == NULL){ if(manifest == NULL){ return; }else{ guint turtle_count; turtle_count = 1; turtle = (AgsTurtle **) malloc(2 * sizeof(AgsTurtle *)); turtle[0] = manifest; turtle[1] = NULL; n_turtle = turtle_count; } } if(n_turtle == 0){ g_warning("missing argument"); return; } current_turtle = turtle[n_turtle - 1]; /* get root node */ root_node = xmlDocGetRootElement(current_turtle->doc); /* start parse */ node = NULL; if(root_node != NULL){ node = root_node->children; } while(node != NULL){ if(node->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(node->name, "rdf-statement", 14)){ ags_lv2_turtle_parser_parse_statement(lv2_turtle_parser, current_turtle, node, turtle, n_turtle, FALSE); } } node = node->next; } if(root_node != NULL){ node = root_node->children; } while(node != NULL){ if(node->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(node->name, "rdf-statement", 14)){ ags_lv2_turtle_parser_parse_statement(lv2_turtle_parser, current_turtle, node, turtle, n_turtle, TRUE); } } node = node->next; } /* post-process */ if(current_turtle == turtle[0]){ g_object_get(lv2_turtle_parser, "plugin", &start_plugin, NULL); /* post-process - preset */ g_object_get(lv2_turtle_parser, "preset", &start_preset, NULL); preset = start_preset; while(preset != NULL){ gchar *applies_to; g_object_get(preset->data, "applies-to", &applies_to, NULL); plugin = ags_lv2_plugin_find_uri(start_plugin, applies_to); if(plugin != NULL){ g_object_set(plugin->data, "preset", preset->data, NULL); }else{ g_warning("plugin not found %s", applies_to); } g_free(applies_to); preset = preset->next; } g_list_free_full(start_preset, g_object_unref); /* post-process - ui plugin */ #if 0 g_object_get(lv2_turtle_parser, "ui-plugin", &start_ui_plugin, NULL); ui_plugin = start_ui_plugin; while(ui_plugin != NULL){ ui_plugin = ui_plugin->next; } g_list_free_full(start_ui_plugin, g_object_unref); #endif g_list_free_full(start_plugin, g_object_unref); } #if 0 if(strstr(current_turtle->filename, "swh") != NULL){ xmlSaveFormatFileEnc("-", current_turtle->doc, "UTF-8", 1); } #endif // xmlCleanupParser(); } /** * ags_lv2_turtle_parser_new: * @manifest: the manifest as #AgsTurtle * * Creates an #AgsLv2TurtleParser * * Returns: a new #AgsLv2TurtleParser * * Since: 3.0.0 */ AgsLv2TurtleParser* ags_lv2_turtle_parser_new(AgsTurtle *manifest) { AgsLv2TurtleParser *lv2_turtle_parser; lv2_turtle_parser = (AgsLv2TurtleParser *) g_object_new(AGS_TYPE_LV2_TURTLE_PARSER, "turtle", manifest, NULL); return(lv2_turtle_parser); } gsequencer-3.1.3/ags/plugin/ags_lv2_manager.h0000644000175000017500000000616313607210263016056 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_MANAGER_H__ #define __AGS_LV2_MANAGER_H__ #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_MANAGER (ags_lv2_manager_get_type()) #define AGS_LV2_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_MANAGER, AgsLv2Manager)) #define AGS_LV2_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_MANAGER, AgsLv2ManagerClass)) #define AGS_IS_LV2_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_MANAGER)) #define AGS_IS_LV2_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_MANAGER)) #define AGS_LV2_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_MANAGER, AgsLv2ManagerClass)) #define AGS_LV2_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLv2Manager *) obj)->obj_mutex)) #define AGS_LV2_MANAGER_DEFAULT_LOCALE "en-gb" typedef struct _AgsLv2Manager AgsLv2Manager; typedef struct _AgsLv2ManagerClass AgsLv2ManagerClass; struct _AgsLv2Manager { GObject gobject; GRecMutex obj_mutex; gchar *locale; GList *lv2_plugin_blacklist; GList *lv2_plugin; GHashTable *current_plugin_node; }; struct _AgsLv2ManagerClass { GObjectClass gobject; }; GType ags_lv2_manager_get_type(void); gboolean ags_lv2_manager_global_get_parse_names(); gboolean ags_lv2_manager_global_get_preserve_turtle(); gchar** ags_lv2_manager_get_default_path(); void ags_lv2_manager_set_default_path(gchar** default_path); gchar** ags_lv2_manager_get_filenames(AgsLv2Manager *lv2_manager); AgsLv2Plugin* ags_lv2_manager_find_lv2_plugin(AgsLv2Manager *lv2_manager, gchar *filename, gchar *effect); void ags_lv2_manager_load_blacklist(AgsLv2Manager *lv2_manager, gchar *blacklist_filename); void ags_lv2_manager_load_file(AgsLv2Manager *lv2_manager, AgsTurtle *manifest, AgsTurtle *turtle, gchar *lv2_path, gchar *filename); void ags_lv2_manager_load_preset(AgsLv2Manager *lv2_manager, AgsLv2Plugin *lv2_plugin, AgsTurtle *preset); void ags_lv2_manager_load_default_directory(AgsLv2Manager *lv2_manager); /* */ AgsLv2Manager* ags_lv2_manager_get_instance(); AgsLv2Manager* ags_lv2_manager_new(gchar *locale); G_END_DECLS #endif /*__AGS_LV2_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_base_plugin.h0000644000175000017500000001472613616617253016167 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BASE_PLUGIN_H__ #define __AGS_BASE_PLUGIN_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BASE_PLUGIN (ags_base_plugin_get_type()) #define AGS_BASE_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BASE_PLUGIN, AgsBasePlugin)) #define AGS_BASE_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BASE_PLUGIN, AgsBasePluginClass)) #define AGS_IS_BASE_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_BASE_PLUGIN)) #define AGS_IS_BASE_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_BASE_PLUGIN)) #define AGS_BASE_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_BASE_PLUGIN, AgsBasePluginClass)) #define AGS_BASE_PLUGIN_GET_OBJ_MUTEX(obj) (&(((AgsBasePlugin *) obj)->obj_mutex)) typedef struct _AgsBasePlugin AgsBasePlugin; typedef struct _AgsBasePluginClass AgsBasePluginClass; /** * AgsBasePluginFlags: * @AGS_BASE_PLUGIN_IS_INSTRUMENT: plugin is instrument * * Enum values to control the behavior or indicate internal state of #AgsBasePlugin by * enable/disable as flags. */ typedef enum{ AGS_BASE_PLUGIN_IS_INSTRUMENT = 1, }AgsBasePluginFlags; struct _AgsBasePlugin { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gchar *filename; gchar *effect; guint port_group_count; guint *port_group; GList *plugin_port; guint effect_index; void *plugin_so; void *plugin_descriptor; void *plugin_handle; gchar *ui_filename; gchar *ui_effect; guint ui_effect_index; void *ui_plugin_so; void *ui_plugin_descriptor; void *ui_plugin_handle; GObject *ui_plugin; }; struct _AgsBasePluginClass { GObjectClass gobject; gpointer (*instantiate)(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size); gpointer (*instantiate_with_params)(AgsBasePlugin *base_plugin, guint *n_params, gchar ***parameter_name, GValue **value); void (*connect_port)(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void (*activate)(AgsBasePlugin *base_plugin, gpointer plugin_handle); void (*deactivate)(AgsBasePlugin *base_plugin, gpointer plugin_handle); void (*run)(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void (*load_plugin)(AgsBasePlugin *base_plugin); }; GType ags_base_plugin_get_type(void); GRecMutex* ags_base_plugin_get_obj_mutex(AgsBasePlugin *base_plugin); gboolean ags_base_plugin_test_flags(AgsBasePlugin *base_plugin, guint flags); void ags_base_plugin_set_flags(AgsBasePlugin *base_plugin, guint flags); void ags_base_plugin_unset_flags(AgsBasePlugin *base_plugin, guint flags); gchar* ags_base_plugin_get_filename(AgsBasePlugin *base_plugin); void ags_base_plugin_set_filename(AgsBasePlugin *base_plugin, gchar *filename); gchar* ags_base_plugin_get_effect(AgsBasePlugin *base_plugin); void ags_base_plugin_set_effect(AgsBasePlugin *base_plugin, gchar *effect); guint ags_base_plugin_get_effect_index(AgsBasePlugin *base_plugin); void ags_base_plugin_set_effect_index(AgsBasePlugin *base_plugin, guint effect_index); gpointer ags_base_plugin_get_plugin_so(AgsBasePlugin *base_plugin); void ags_base_plugin_set_plugin_so(AgsBasePlugin *base_plugin, gpointer plugin_so); GList* ags_base_plugin_get_plugin_port(AgsBasePlugin *base_plugin); void ags_base_plugin_set_plugin_port(AgsBasePlugin *base_plugin, GList *plugin_port); gchar* ags_base_plugin_get_ui_filename(AgsBasePlugin *base_plugin); void ags_base_plugin_set_ui_filename(AgsBasePlugin *base_plugin, gchar *ui_filename); gchar* ags_base_plugin_get_ui_effect(AgsBasePlugin *base_plugin); void ags_base_plugin_set_ui_effect(AgsBasePlugin *base_plugin, gchar *ui_effect); guint ags_base_plugin_get_ui_effect_index(AgsBasePlugin *base_plugin); void ags_base_plugin_set_ui_effect_index(AgsBasePlugin *base_plugin, guint ui_effect_index); gpointer ags_base_plugin_get_ui_plugin_so(AgsBasePlugin *base_plugin); void ags_base_plugin_set_ui_plugin_so(AgsBasePlugin *base_plugin, gpointer ui_plugin_so); GObject* ags_base_plugin_get_ui_plugin(AgsBasePlugin *base_plugin); void ags_base_plugin_set_ui_plugin(AgsBasePlugin *base_plugin, GObject *ui_plugin); GList* ags_base_plugin_find_filename(GList *base_plugin, gchar *filename); GList* ags_base_plugin_find_effect(GList *base_plugin, gchar *filename, gchar *effect); GList* ags_base_plugin_find_ui_effect_index(GList *base_plugin, gchar *ui_filename, guint ui_effect_index); gint ags_base_plugin_sort_func(gpointer a, gpointer b); GList* ags_base_plugin_sort(GList *base_plugin); void ags_base_plugin_apply_port_group_by_prefix(AgsBasePlugin *base_plugin); gpointer ags_base_plugin_instantiate(AgsBasePlugin *base_plugin, guint samplerate, guint buffer_size); gpointer ags_base_plugin_instantiate_with_params(AgsBasePlugin *base_plugin, guint *n_params, gchar ***parameter_name, GValue **value); void ags_base_plugin_connect_port(AgsBasePlugin *base_plugin, gpointer plugin_handle, guint port_index, gpointer data_location); void ags_base_plugin_activate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_base_plugin_deactivate(AgsBasePlugin *base_plugin, gpointer plugin_handle); void ags_base_plugin_run(AgsBasePlugin *base_plugin, gpointer plugin_handle, snd_seq_event_t *seq_event, guint frame_count); void ags_base_plugin_load_plugin(AgsBasePlugin *base_plugin); AgsBasePlugin* ags_base_plugin_new(gchar *filename, gchar *effect, guint effect_index); G_END_DECLS #endif /*__AGS_BASE_PLUGIN_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_log_manager.h0000644000175000017500000000443313607210263016715 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_LOG_MANAGER_H__ #define __AGS_LV2_LOG_MANAGER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_LOG_MANAGER (ags_lv2_log_manager_get_type()) #define AGS_LV2_LOG_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_LOG_MANAGER, AgsLv2LogManager)) #define AGS_LV2_LOG_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_LOG_MANAGER, AgsLv2LogManagerClass)) #define AGS_IS_LV2_LOG_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_LOG_MANAGER)) #define AGS_IS_LV2_LOG_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_LOG_MANAGER)) #define AGS_LV2_LOG_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_LOG_MANAGER, AgsLv2LogManagerClass)) typedef struct _AgsLv2LogManager AgsLv2LogManager; typedef struct _AgsLv2LogManagerClass AgsLv2LogManagerClass; struct _AgsLv2LogManager { GObject gobject; }; struct _AgsLv2LogManagerClass { GObjectClass gobject; }; GType ags_lv2_log_manager_get_type(void); int ags_lv2_log_manager_printf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, ...); int ags_lv2_log_manager_vprintf(LV2_Log_Handle handle, LV2_URID type, const char* fmt, va_list ap); AgsLv2LogManager* ags_lv2_log_manager_get_instance(); AgsLv2LogManager* ags_lv2_log_manager_new(); G_END_DECLS #endif /*__AGS_LV2_LOG_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2ui_plugin.h0000644000175000017500000000635413607210263016302 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2UI_PLUGIN_H__ #define __AGS_LV2UI_PLUGIN_H__ #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2UI_PLUGIN (ags_lv2ui_plugin_get_type()) #define AGS_LV2UI_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2UI_PLUGIN, AgsLv2uiPlugin)) #define AGS_LV2UI_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2UI_PLUGIN, AgsLv2uiPluginClass)) #define AGS_IS_LV2UI_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2UI_PLUGIN)) #define AGS_IS_LV2UI_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2UI_PLUGIN)) #define AGS_LV2UI_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2UI_PLUGIN, AgsLv2uiPluginClass)) #define AGS_LV2UI_PLUGIN_DESCRIPTOR(ptr) ((LV2UI_Descriptor *)(ptr)) typedef struct _AgsLv2uiPlugin AgsLv2uiPlugin; typedef struct _AgsLv2uiPluginClass AgsLv2uiPluginClass; /** * AgsLv2uiPluginFlags: * @AGS_LV2UI_PLUGIN_IS_SYNTHESIZER: is synthesizer * @AGS_LV2UI_PLUGIN_GTK2: has Gtk+-2.0 UI * @AGS_LV2UI_PLUGIN_GTK3: has Gtk3 UI * @AGS_LV2UI_PLUGIN_QT4: has Qt4 UI * @AGS_LV2UI_PLUGIN_QT5: has Qt5 UI * * Enum values to control the behavior or indicate internal state of #AgsLv2uiPlugin by * enable/disable as flags. */ typedef enum{ AGS_LV2UI_PLUGIN_IS_SYNTHESIZER = 1, AGS_LV2UI_PLUGIN_GTK2 = 1 << 1, AGS_LV2UI_PLUGIN_GTK3 = 1 << 2, AGS_LV2UI_PLUGIN_QT4 = 1 << 3, AGS_LV2UI_PLUGIN_QT5 = 1 << 4, }AgsLv2uiPluginFlags; struct _AgsLv2uiPlugin { AgsBasePlugin base_plugin; guint flags; gchar *gui_uri; AgsTurtle *manifest; AgsTurtle *gui_turtle; GObject *lv2_plugin; LV2_Feature **feature; }; struct _AgsLv2uiPluginClass { AgsBasePluginClass base_plugin; }; GType ags_lv2ui_plugin_get_type(void); gboolean ags_lv2ui_plugin_test_flags(AgsLv2uiPlugin *lv2ui_plugin, guint flags); void ags_lv2ui_plugin_set_flags(AgsLv2uiPlugin *lv2ui_plugin, guint flags); void ags_lv2ui_plugin_unset_flags(AgsLv2uiPlugin *lv2ui_plugin, guint flags); GList* ags_lv2ui_plugin_find_gui_uri(GList *lv2ui_plugin, gchar *gui_uri); AgsLv2uiPlugin* ags_lv2ui_plugin_new(AgsTurtle *gui_turtle, gchar *filename, gchar *effect, gchar *gui_uri, guint effect_index); G_END_DECLS #endif /*__AGS_LV2UI_PLUGIN_H__*/ gsequencer-3.1.3/ags/plugin/ags_dssi_plugin.h0000644000175000017500000000454513616617253016215 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DSSI_PLUGIN_H__ #define __AGS_DSSI_PLUGIN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_DSSI_PLUGIN (ags_dssi_plugin_get_type()) #define AGS_DSSI_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DSSI_PLUGIN, AgsDssiPlugin)) #define AGS_DSSI_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DSSI_PLUGIN, AgsDssiPluginClass)) #define AGS_IS_DSSI_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DSSI_PLUGIN)) #define AGS_IS_DSSI_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DSSI_PLUGIN)) #define AGS_DSSI_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_DSSI_PLUGIN, AgsDssiPluginClass)) #define AGS_DSSI_PLUGIN_DESCRIPTOR(ptr) ((DSSI_Descriptor *)(ptr)) typedef struct _AgsDssiPlugin AgsDssiPlugin; typedef struct _AgsDssiPluginClass AgsDssiPluginClass; struct _AgsDssiPlugin { AgsBasePlugin base_plugin; guint unique_id; gchar *program; }; struct _AgsDssiPluginClass { AgsBasePluginClass base_plugin; void (*change_program)(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index); }; GType ags_dssi_plugin_get_type(void); void ags_dssi_plugin_change_program(AgsDssiPlugin *dssi_plugin, gpointer ladspa_handle, guint bank_index, guint program_index); AgsDssiPlugin* ags_dssi_plugin_new(gchar *filename, gchar *effect, guint effect_index); G_END_DECLS #endif /*__AGS_DSSI_PLUGIN_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2ui_manager.h0000644000175000017500000000612513607210263016412 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2UI_MANAGER_H__ #define __AGS_LV2UI_MANAGER_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2UI_MANAGER (ags_lv2ui_manager_get_type()) #define AGS_LV2UI_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2UI_MANAGER, AgsLv2uiManager)) #define AGS_LV2UI_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2UI_MANAGER, AgsLv2uiManagerClass)) #define AGS_IS_LV2UI_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2UI_MANAGER)) #define AGS_IS_LV2UI_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2UI_MANAGER)) #define AGS_LV2UI_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2UI_MANAGER, AgsLv2uiManagerClass)) #define AGS_LV2UI_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLv2uiManager *) obj)->obj_mutex)) typedef struct _AgsLv2uiManager AgsLv2uiManager; typedef struct _AgsLv2uiManagerClass AgsLv2uiManagerClass; struct _AgsLv2uiManager { GObject gobject; GRecMutex obj_mutex; GList *lv2ui_plugin_blacklist; GList *lv2ui_plugin; }; struct _AgsLv2uiManagerClass { GObjectClass gobject; }; GType ags_lv2ui_manager_get_type(void); gchar** ags_lv2ui_manager_get_default_path(); void ags_lv2ui_manager_set_default_path(gchar** default_path); gchar** ags_lv2ui_manager_get_filenames(AgsLv2uiManager *lv2ui_manager); AgsLv2uiPlugin* ags_lv2ui_manager_find_lv2ui_plugin(AgsLv2uiManager *lv2ui_manager, gchar *ui_filename, gchar *ui_effect); AgsLv2uiPlugin* ags_lv2ui_manager_find_lv2ui_plugin_with_index(AgsLv2uiManager *lv2ui_manager, gchar *ui_filename, guint ui_effect_index); void ags_lv2ui_manager_load_blacklist(AgsLv2uiManager *lv2ui_manager, gchar *blacklist_filename); void ags_lv2ui_manager_load_file(AgsLv2uiManager *lv2ui_manager, AgsTurtle *manifest, AgsTurtle *turtle, gchar *lv2ui_path, gchar *filename); void ags_lv2ui_manager_load_default_directory(AgsLv2uiManager *lv2ui_manager); /* */ AgsLv2uiManager* ags_lv2ui_manager_get_instance(); AgsLv2uiManager* ags_lv2ui_manager_new(); G_END_DECLS #endif /*__AGS_LV2UI_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_worker.c0000644000175000017500000004173013607210263015747 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_lv2_worker_class_init(AgsLv2WorkerClass *lv2_worker); void ags_lv2_worker_connectable_interface_init(AgsConnectableInterface *connectable); void ags_lv2_worker_init(AgsLv2Worker *lv2_worker); void ags_lv2_worker_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_lv2_worker_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_lv2_worker_dispose(GObject *gobject); void ags_lv2_worker_finalize(GObject *gobject); /** * SECTION:ags_lv2_worker * @short_description: LV2 worker thread * @title: AgsLv2Worker * @section_id: * @include: ags/plugin/ags_lv2_worker.h * * The #AgsLv2Worker acts as task queue thread. */ enum{ PROP_0, PROP_HANDLE, PROP_WORK_SIZE, PROP_WORK_DATA, PROP_RESPONSE_DATA, PROP_WORKER_THREAD, }; static gpointer ags_lv2_worker_parent_class = NULL; static AgsConnectableInterface *ags_lv2_worker_parent_connectable_interface; GType ags_lv2_worker_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_worker = 0; static const GTypeInfo ags_lv2_worker_info = { sizeof(AgsLv2WorkerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_worker_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLv2Worker), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_worker_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_lv2_worker_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_lv2_worker = g_type_register_static(G_TYPE_OBJECT, "AgsLv2Worker", &ags_lv2_worker_info, 0); g_type_add_interface_static(ags_type_lv2_worker, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_worker); } return g_define_type_id__volatile; } void ags_lv2_worker_class_init(AgsLv2WorkerClass *lv2_worker) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_worker_parent_class = g_type_class_peek_parent(lv2_worker); /* GObject */ gobject = (GObjectClass *) lv2_worker; gobject->set_property = ags_lv2_worker_set_property; gobject->get_property = ags_lv2_worker_get_property; gobject->dispose = ags_lv2_worker_dispose; gobject->finalize = ags_lv2_worker_finalize; /* properties */ /** * AgsLv2Worker:handle: * * The assigned #LV2_Handle-struct * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("handle", i18n_pspec("handle"), i18n_pspec("The handle"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_HANDLE, param_spec); /** * AgsLv2Worker:work-size: * * The work size. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("work-size", i18n_pspec("work size"), i18n_pspec("The work size"), 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WORK_SIZE, param_spec); /** * AgsLv2Worker:work-data: * * The assigned work data * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("work-data", i18n_pspec("work data"), i18n_pspec("The work data"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WORK_DATA, param_spec); /** * AgsLv2Worker:response-data: * * The assigned #GList-struct containing #AgsLv2WorkerResponseData-struct * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("response-data", i18n_pspec("response data"), i18n_pspec("The response data"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RESPONSE_DATA, param_spec); /** * AgsLv2Worker:worker-thread: * * The assigned worker-thread. * * Since: 3.0.0 */ param_spec = g_param_spec_object("worker-thread", i18n_pspec("worker thread"), i18n_pspec("The worker thread"), AGS_TYPE_WORKER_THREAD, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WORKER_THREAD, param_spec); } void ags_lv2_worker_connectable_interface_init(AgsConnectableInterface *connectable) { ags_lv2_worker_parent_connectable_interface = g_type_interface_peek_parent(connectable); } void ags_lv2_worker_init(AgsLv2Worker *lv2_worker) { lv2_worker->flags = 0; /* add base plugin mutex */ g_rec_mutex_init(&(lv2_worker->obj_mutex)); /* fields */ lv2_worker->handle = NULL; lv2_worker->worker_interface = NULL; lv2_worker->work_size = 0; lv2_worker->work_data = NULL; lv2_worker->response_data = NULL; lv2_worker->worker_thread = NULL; } void ags_lv2_worker_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLv2Worker *lv2_worker; GRecMutex *lv2_worker_mutex; lv2_worker = AGS_LV2_WORKER(gobject); /* get base plugin mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); switch(prop_id){ case PROP_HANDLE: { g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->handle = g_value_get_pointer(value); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_WORK_SIZE: { g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->work_size = g_value_get_uint(value); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_WORK_DATA: { g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->work_data = g_value_get_pointer(value); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_RESPONSE_DATA: { gpointer response_data; response_data = g_value_get_pointer(value); g_rec_mutex_lock(lv2_worker_mutex); if(response_data == NULL || g_list_find(lv2_worker->response_data, response_data) != NULL){ g_rec_mutex_unlock(lv2_worker_mutex); return; } lv2_worker->response_data = g_list_prepend(lv2_worker->response_data, response_data); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_WORKER_THREAD: { AgsWorkerThread *worker_thread; worker_thread = g_value_get_object(value); g_rec_mutex_lock(lv2_worker_mutex); if(lv2_worker->worker_thread == worker_thread){ g_rec_mutex_unlock(lv2_worker_mutex); return; } if(lv2_worker->worker_thread != NULL){ g_object_unref(lv2_worker->worker_thread); } if(worker_thread != NULL){ g_object_ref(worker_thread); } lv2_worker->worker_thread = worker_thread; g_rec_mutex_unlock(lv2_worker_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_worker_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLv2Worker *lv2_worker; GRecMutex *lv2_worker_mutex; lv2_worker = AGS_LV2_WORKER(gobject); /* get base plugin mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); switch(prop_id){ case PROP_HANDLE: { g_rec_mutex_lock(lv2_worker_mutex); g_value_set_pointer(value, lv2_worker->handle); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_WORK_SIZE: { g_rec_mutex_lock(lv2_worker_mutex); g_value_set_uint(value, lv2_worker->work_size); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_WORK_DATA: { g_rec_mutex_lock(lv2_worker_mutex); g_value_set_pointer(value, lv2_worker->work_data); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_RESPONSE_DATA: { g_rec_mutex_lock(lv2_worker_mutex); g_value_set_pointer(value, g_list_copy_deep(lv2_worker->response_data, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(lv2_worker_mutex); } break; case PROP_WORKER_THREAD: { g_rec_mutex_lock(lv2_worker_mutex); g_value_set_object(value, lv2_worker->worker_thread); g_rec_mutex_unlock(lv2_worker_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_lv2_worker_dispose(GObject *gobject) { AgsLv2Worker *lv2_worker; lv2_worker = AGS_LV2_WORKER(gobject); if(lv2_worker->worker_thread != NULL){ g_object_unref(lv2_worker->worker_thread); lv2_worker->worker_thread = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_worker_parent_class)->dispose(gobject); } void ags_lv2_worker_finalize(GObject *gobject) { AgsLv2Worker *lv2_worker; lv2_worker = AGS_LV2_WORKER(gobject); /* destroy object mutex */ g_list_free_full(lv2_worker->response_data, (GDestroyNotify) ags_lv2_worker_free_response_data); if(lv2_worker->worker_thread != NULL){ g_object_unref(lv2_worker->worker_thread); } /* call parent */ G_OBJECT_CLASS(ags_lv2_worker_parent_class)->finalize(gobject); } /** * ags_lv2_worker_test_flags: * @lv2_worker: the #AgsLv2Worker * @flags: the flags * * Test @flags to be set on @recall. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_lv2_worker_test_flags(AgsLv2Worker *lv2_worker, guint flags) { gboolean retval; GRecMutex *lv2_worker_mutex; if(!AGS_IS_LV2_WORKER(lv2_worker)){ return(FALSE); } /* get lv2 worker mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); /* test flags */ g_rec_mutex_lock(lv2_worker_mutex); retval = ((flags & (lv2_worker->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(lv2_worker_mutex); return(retval); } /** * ags_lv2_worker_set_flags: * @lv2_worker: the #AgsLv2Worker * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_lv2_worker_set_flags(AgsLv2Worker *lv2_worker, guint flags) { GRecMutex *lv2_worker_mutex; if(!AGS_IS_LV2_WORKER(lv2_worker)){ return; } /* get lv2 worker mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); /* set flags */ g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->flags |= flags; g_rec_mutex_unlock(lv2_worker_mutex); } /** * ags_lv2_worker_unset_flags: * @lv2_worker: the #AgsLv2Worker * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_lv2_worker_unset_flags(AgsLv2Worker *lv2_worker, guint flags) { GRecMutex *lv2_worker_mutex; if(!AGS_IS_LV2_WORKER(lv2_worker)){ return; } /* get lv2 worker mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); /* unset flags */ g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->flags &= (~flags); g_rec_mutex_unlock(lv2_worker_mutex); } /** * ags_lv2_worker_alloc_response_data: * * Allocate a new #AgsLv2WorkerResponseData-struct. * * Returns: the new #AgsLv2WorkerResponseData-struct * * Since: 3.0.0 */ AgsLv2WorkerResponseData* ags_lv2_worker_alloc_response_data() { AgsLv2WorkerResponseData *response_data; response_data = (AgsLv2WorkerResponseData *) malloc(sizeof(AgsLv2WorkerResponseData)); response_data->data_size = 0; response_data->data = NULL; return(response_data); } /** * ags_lv2_worker_free_response_data: * @response_data: the #AgsLv2WorkerResponseData-struct * * Free @response_data. * * Since: 3.0.0 */ void ags_lv2_worker_free_response_data(AgsLv2WorkerResponseData *response_data) { g_free(response_data); } /** * ags_lv2_worker_respond: * @handle: the LV2_Worker_Respond_Handle * @data_size: the data size * @data: the data * * Respond lv2 worker @handle. * * Returns: LV2_Worker_Status * * Since: 3.0.0 */ LV2_Worker_Status ags_lv2_worker_respond(LV2_Worker_Respond_Handle handle, uint32_t data_size, const void* data) { AgsLv2Worker *lv2_worker; AgsLv2WorkerResponseData *response_data; GRecMutex *lv2_worker_mutex; lv2_worker = AGS_LV2_WORKER(handle); /* get lv2 worker mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); /* allocate response data */ response_data = ags_lv2_worker_alloc_response_data(); response_data->data_size = data_size; response_data->data = data; g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->response_data = g_list_prepend(lv2_worker->response_data, response_data); g_rec_mutex_unlock(lv2_worker_mutex); return(LV2_WORKER_SUCCESS); } /** * ags_lv2_worker_schedule_work: * @handle: the LV2_Worker_Respond_Handle * @data_size: the data size * @data: the data * * Schedule work of lv2 worker @handle. * * Returns: LV2_Worker_Status * * Since: 3.0.0 */ LV2_Worker_Status ags_lv2_worker_schedule_work(LV2_Worker_Schedule_Handle handle, uint32_t data_size, const void* data) { AgsLv2Worker *lv2_worker; GRecMutex *lv2_worker_mutex; lv2_worker = AGS_LV2_WORKER(handle); /* get lv2 worker mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); /* apply work data and size */ g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->work_size = (guint) data_size; lv2_worker->work_data = data; g_rec_mutex_unlock(lv2_worker_mutex); /* set flags */ ags_lv2_worker_set_flags(lv2_worker, AGS_LV2_WORKER_RUN); return(LV2_WORKER_SUCCESS); } /** * ags_lv2_worker_do_poll: * @worker_thread: the #AgsWorkerThread * @data: the data * * Safe run callback. * * Since: 3.0.0 */ void ags_lv2_worker_do_poll(AgsWorkerThread *worker_thread, gpointer data) { AgsLv2Worker *lv2_worker; LV2_Handle handle; GList *response_data_start, *response_data; guint work_size; gpointer work_data; LV2_Worker_Status (*work)(LV2_Handle instance, LV2_Worker_Respond_Function respond, LV2_Worker_Respond_Handle handle, uint32_t data_size, const void* data); LV2_Worker_Status (*work_response)(LV2_Handle instance, uint32_t size, const void* body); LV2_Worker_Status (*end_run)(LV2_Handle instance); GRecMutex *lv2_worker_mutex; lv2_worker = data; /* get lv2 worker mutex */ lv2_worker_mutex = AGS_LV2_WORKER_GET_OBJ_MUTEX(lv2_worker); /* get some fields */ g_rec_mutex_lock(lv2_worker_mutex); handle = lv2_worker->handle; work_size = lv2_worker->work_size; work_data = lv2_worker->work_data; if(lv2_worker->worker_interface == NULL){ g_rec_mutex_unlock(lv2_worker_mutex); return; } work = lv2_worker->worker_interface->work; work_response = lv2_worker->worker_interface->work_response; end_run = lv2_worker->worker_interface->end_run; g_rec_mutex_unlock(lv2_worker_mutex); /* work */ if(ags_lv2_worker_test_flags(lv2_worker, AGS_LV2_WORKER_RUN)){ work(handle, ags_lv2_worker_respond, lv2_worker, (uint32_t) (work_size), work_data); g_rec_mutex_lock(lv2_worker_mutex); lv2_worker->work_size = 0; lv2_worker->work_data = NULL; g_rec_mutex_unlock(lv2_worker_mutex); /* response data */ g_rec_mutex_lock(lv2_worker_mutex); response_data = response_data_start = g_list_copy(lv2_worker->response_data); g_rec_mutex_lock(lv2_worker_mutex); while(response_data != NULL){ work_response(handle, AGS_LV2_WORKER_RESPONSE_DATA(response_data->data)->data_size, AGS_LV2_WORKER_RESPONSE_DATA(response_data->data)->data); response_data = response_data->next; } /* free response data */ g_rec_mutex_lock(lv2_worker_mutex); g_list_free_full(response_data_start, (GDestroyNotify) ags_lv2_worker_free_response_data); g_list_free(lv2_worker->response_data); lv2_worker->response_data = NULL; g_rec_mutex_unlock(lv2_worker_mutex); /* end run */ end_run(handle); /* reset */ ags_lv2_worker_unset_flags(lv2_worker, AGS_LV2_WORKER_RUN); } } /** * ags_lv2_worker_new: * * Create a new instance of #AgsLv2Worker. * * Returns: the new #AgsLv2Worker * * Since: 3.0.0 */ AgsLv2Worker* ags_lv2_worker_new() { AgsLv2Worker *lv2_worker; lv2_worker = (AgsLv2Worker *) g_object_new(AGS_TYPE_LV2_WORKER, NULL); return(lv2_worker); } gsequencer-3.1.3/ags/plugin/ags_lv2_event_manager.h0000644000175000017500000000452513607210263017257 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_EVENT_MANAGER_H__ #define __AGS_LV2_EVENT_MANAGER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_EVENT_MANAGER (ags_lv2_event_manager_get_type()) #define AGS_LV2_EVENT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_EVENT_MANAGER, AgsLv2EventManager)) #define AGS_LV2_EVENT_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_EVENT_MANAGER, AgsLv2EventManagerClass)) #define AGS_IS_LV2_EVENT_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_EVENT_MANAGER)) #define AGS_IS_LV2_EVENT_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_EVENT_MANAGER)) #define AGS_LV2_EVENT_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_EVENT_MANAGER, AgsLv2EventManagerClass)) typedef struct _AgsLv2EventManager AgsLv2EventManager; typedef struct _AgsLv2EventManagerClass AgsLv2EventManagerClass; struct _AgsLv2EventManager { GObject gobject; }; struct _AgsLv2EventManagerClass { GObjectClass gobject; }; GType ags_lv2_event_manager_get_type(void); uint32_t ags_lv2_event_manager_lv2_event_ref(LV2_Event_Callback_Data callback_data, LV2_Event *event); uint32_t ags_lv2_event_manager_lv2_event_unref(LV2_Event_Callback_Data callback_data, LV2_Event *event); AgsLv2EventManager* ags_lv2_event_manager_get_instance(); AgsLv2EventManager* ags_lv2_event_manager_new(); G_END_DECLS #endif /*__AGS_LV2_EVENT_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_ladspa_manager.h0000644000175000017500000000547713607210263016626 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_MANAGER_H__ #define __AGS_LADSPA_MANAGER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LADSPA_MANAGER (ags_ladspa_manager_get_type()) #define AGS_LADSPA_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LADSPA_MANAGER, AgsLadspaManager)) #define AGS_LADSPA_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LADSPA_MANAGER, AgsLadspaManagerClass)) #define AGS_IS_LADSPA_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LADSPA_MANAGER)) #define AGS_IS_LADSPA_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LADSPA_MANAGER)) #define AGS_LADSPA_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LADSPA_MANAGER, AgsLadspaManagerClass)) #define AGS_LADSPA_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLadspaManager *) obj)->obj_mutex)) typedef struct _AgsLadspaManager AgsLadspaManager; typedef struct _AgsLadspaManagerClass AgsLadspaManagerClass; struct _AgsLadspaManager { GObject gobject; GRecMutex obj_mutex; GList *ladspa_plugin_blacklist; GList *ladspa_plugin; }; struct _AgsLadspaManagerClass { GObjectClass gobject; }; GType ags_ladspa_manager_get_type(void); gchar** ags_ladspa_manager_get_default_path(); void ags_ladspa_manager_set_default_path(gchar** default_path); gchar** ags_ladspa_manager_get_filenames(AgsLadspaManager *ladspa_manager); AgsLadspaPlugin* ags_ladspa_manager_find_ladspa_plugin(AgsLadspaManager *ladspa_manager, gchar *filename, gchar *effect); void ags_ladspa_manager_load_blacklist(AgsLadspaManager *ladspa_manager, gchar *blacklist_filename); void ags_ladspa_manager_load_file(AgsLadspaManager *ladspa_manager, gchar *ladspa_path, gchar *filename); void ags_ladspa_manager_load_default_directory(AgsLadspaManager *ladspa_manager); /* */ AgsLadspaManager* ags_ladspa_manager_get_instance(); AgsLadspaManager* ags_ladspa_manager_new(); G_END_DECLS #endif /*__AGS_LADSPA_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_conversion.h0000644000175000017500000000525113607210263016626 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_CONVERSION_H__ #define __AGS_LV2_CONVERSION_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_CONVERSION (ags_lv2_conversion_get_type()) #define AGS_LV2_CONVERSION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONVERSION, AgsLv2Conversion)) #define AGS_LV2_CONVERSION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CONVERSION, AgsLv2ConversionClass)) #define AGS_IS_LV2_CONVERSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CONVERSION)) #define AGS_IS_LV2_CONVERSION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CONVERSION)) #define AGS_LV2_CONVERSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_CONVERSION, AgsLv2ConversionClass)) #define AGS_LV2_CONVERSION_DEFAULT_LOWER (0.00001) #define AGS_LV2_CONVERSION_DEFAULT_UPPER (1.0) #define AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT (1025.0) typedef struct _AgsLv2Conversion AgsLv2Conversion; typedef struct _AgsLv2ConversionClass AgsLv2ConversionClass; /** * AgsLv2ConversionFlags: * @AGS_LV2_CONVERSION_LOGARITHMIC: logarithmic * * Enum values to control the behavior or indicate internal state of #AgsLv2Conversion by * enable/disable as flags. */ typedef enum{ AGS_LV2_CONVERSION_LOGARITHMIC = 1, }AgsLv2ConversionFlags; struct _AgsLv2Conversion { AgsConversion conversion; guint flags; gdouble lower; gdouble upper; gdouble step_count; }; struct _AgsLv2ConversionClass { AgsConversionClass conversion; }; GType ags_lv2_conversion_get_type(void); gboolean ags_lv2_conversion_test_flags(AgsLv2Conversion *lv2_conversion, guint flags); void ags_lv2_conversion_set_flags(AgsLv2Conversion *lv2_conversion, guint flags); void ags_lv2_conversion_unset_flags(AgsLv2Conversion *lv2_conversion, guint flags); AgsLv2Conversion* ags_lv2_conversion_new(); G_END_DECLS #endif /*__AGS_LV2_CONVERSION_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_urid_manager.h0000644000175000017500000000543613607210263017103 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_URID_MANAGER_H__ #define __AGS_LV2_URID_MANAGER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_URID_MANAGER (ags_lv2_urid_manager_get_type()) #define AGS_LV2_URID_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_URID_MANAGER, AgsLv2UridManager)) #define AGS_LV2_URID_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_URID_MANAGER, AgsLv2UridManagerClass)) #define AGS_IS_LV2_URID_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_URID_MANAGER)) #define AGS_IS_LV2_URID_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_URID_MANAGER)) #define AGS_LV2_URID_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_URID_MANAGER, AgsLv2UridManagerClass)) #define AGS_LV2_URID_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLv2UridManager *) obj)->obj_mutex)) typedef struct _AgsLv2UridManager AgsLv2UridManager; typedef struct _AgsLv2UridManagerClass AgsLv2UridManagerClass; struct _AgsLv2UridManager { GObject gobject; GRecMutex obj_mutex; uint32_t id_counter; GHashTable *urid; }; struct _AgsLv2UridManagerClass { GObjectClass gobject; }; GType ags_lv2_urid_manager_get_type(void); gboolean ags_lv2_urid_manager_insert(AgsLv2UridManager *lv2_urid_manager, gchar *uri, GValue *id); gboolean ags_lv2_urid_manager_remove(AgsLv2UridManager *lv2_urid_manager, gchar *uri); GValue* ags_lv2_urid_manager_lookup(AgsLv2UridManager *lv2_urid_manager, gchar *uri); void ags_lv2_urid_manager_load_default(AgsLv2UridManager *lv2_urid_manager); uint32_t ags_lv2_urid_manager_map(LV2_URID_Map_Handle handle, char *uri); const char* ags_lv2_urid_manager_unmap(LV2_URID_Map_Handle handle, uint32_t urid); AgsLv2UridManager* ags_lv2_urid_manager_get_instance(); AgsLv2UridManager* ags_lv2_urid_manager_new(); G_END_DECLS #endif /*__AGS_LV2_URID_MANAGER_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_worker_manager.c0000644000175000017500000001152313607210263017436 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_lv2_worker_manager_class_init(AgsLv2WorkerManagerClass *lv2_worker_manager); void ags_lv2_worker_manager_init(AgsLv2WorkerManager *lv2_worker_manager); void ags_lv2_worker_manager_finalize(GObject *gobject); /** * SECTION:ags_lv2_worker_manager * @short_description: manage workers * @title: AgsLv2WorkerManager * @section_id: * @include: ags/plugin/ags_lv2_worker_manager.h * * The #AgsLv2WorkerManager tracks your workers. */ static gpointer ags_lv2_worker_manager_parent_class = NULL; AgsLv2WorkerManager *ags_lv2_worker_manager = NULL; GType ags_lv2_worker_manager_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_lv2_worker_manager = 0; const GTypeInfo ags_lv2_worker_manager_info = { sizeof (AgsLv2WorkerManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_lv2_worker_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLv2WorkerManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_lv2_worker_manager_init, }; ags_type_lv2_worker_manager = g_type_register_static(G_TYPE_OBJECT, "AgsLv2WorkerManager", &ags_lv2_worker_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_lv2_worker_manager); } return g_define_type_id__volatile; } void ags_lv2_worker_manager_class_init(AgsLv2WorkerManagerClass *lv2_worker_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_lv2_worker_manager_parent_class = g_type_class_peek_parent(lv2_worker_manager); /* GObject */ gobject = (GObjectClass *) lv2_worker_manager; gobject->finalize = ags_lv2_worker_manager_finalize; } void ags_lv2_worker_manager_init(AgsLv2WorkerManager *worker_manager) { worker_manager->thread_pool = NULL; g_atomic_pointer_set(&(worker_manager->worker), NULL); /* empty */ } void ags_lv2_worker_manager_finalize(GObject *gobject) { AgsLv2WorkerManager *lv2_worker_manager; lv2_worker_manager = AGS_LV2_WORKER_MANAGER(gobject); g_list_free_full(g_atomic_pointer_get(&(lv2_worker_manager->worker)), g_object_unref); if(lv2_worker_manager == ags_lv2_worker_manager){ ags_lv2_worker_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_lv2_worker_manager_parent_class)->finalize(gobject); } /** * ags_lv2_worker_manager_pull_worker: * @worker_manager: the #AgsLv2WorkerManager * * Pull worker. * * Returns: (transfer full): the #AgsWorkerThread * * Since: 3.0.0 */ GObject* ags_lv2_worker_manager_pull_worker(AgsLv2WorkerManager *worker_manager) { AgsLv2Worker *lv2_worker; AgsThread *thread; if(!AGS_IS_LV2_WORKER_MANAGER(worker_manager)){ return(NULL); } thread = ags_worker_thread_new(); lv2_worker = g_object_new(AGS_TYPE_LV2_WORKER, "worker-thread", thread, NULL); g_signal_connect(thread, "do-poll", G_CALLBACK(ags_lv2_worker_do_poll), lv2_worker); ags_thread_start(thread); return(lv2_worker); } /** * ags_lv2_worker_manager_get_instance: * * Singleton function to optain the id manager instance. * * Returns: (transfer none): an instance of #AgsLv2WorkerManager * * Since: 3.0.0 */ AgsLv2WorkerManager* ags_lv2_worker_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_lv2_worker_manager == NULL){ ags_lv2_worker_manager = ags_lv2_worker_manager_new(); // ags_lv2_worker_manager_load_default(ags_lv2_worker_manager); } g_mutex_unlock(&mutex); return(ags_lv2_worker_manager); } /** * ags_lv2_worker_manager_new: * * Instantiate a id manager. * * Returns: a new #AgsLv2WorkerManager * * Since: 3.0.0 */ AgsLv2WorkerManager* ags_lv2_worker_manager_new() { AgsLv2WorkerManager *lv2_worker_manager; lv2_worker_manager = (AgsLv2WorkerManager *) g_object_new(AGS_TYPE_LV2_WORKER_MANAGER, NULL); return(lv2_worker_manager); } gsequencer-3.1.3/ags/plugin/ags_ladspa_plugin.h0000644000175000017500000000416113607210263016477 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LADSPA_PLUGIN_H__ #define __AGS_LADSPA_PLUGIN_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LADSPA_PLUGIN (ags_ladspa_plugin_get_type()) #define AGS_LADSPA_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LADSPA_PLUGIN, AgsLadspaPlugin)) #define AGS_LADSPA_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LADSPA_PLUGIN, AgsLadspaPluginClass)) #define AGS_IS_LADSPA_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LADSPA_PLUGIN)) #define AGS_IS_LADSPA_PLUGIN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LADSPA_PLUGIN)) #define AGS_LADSPA_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LADSPA_PLUGIN, AgsLadspaPluginClass)) #define AGS_LADSPA_PLUGIN_DESCRIPTOR(ptr) ((LADSPA_Descriptor *)(ptr)) typedef struct _AgsLadspaPlugin AgsLadspaPlugin; typedef struct _AgsLadspaPluginClass AgsLadspaPluginClass; struct _AgsLadspaPlugin { AgsBasePlugin base_plugin; guint unique_id; }; struct _AgsLadspaPluginClass { AgsBasePluginClass base_plugin; }; GType ags_ladspa_plugin_get_type(void); AgsLadspaPlugin* ags_ladspa_plugin_new(gchar *filename, gchar *effect, guint effect_index); G_END_DECLS #endif /*__AGS_LADSPA_PLUGIN_H__*/ gsequencer-3.1.3/ags/plugin/ags_lv2_option_manager.h0000644000175000017500000001020513607210263017436 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LV2_OPTION_MANAGER_H__ #define __AGS_LV2_OPTION_MANAGER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_LV2_OPTION_MANAGER (ags_lv2_option_manager_get_type()) #define AGS_LV2_OPTION_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LV2_OPTION_MANAGER, AgsLv2OptionManager)) #define AGS_LV2_OPTION_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LV2_OPTION_MANAGER, AgsLv2OptionManagerClass)) #define AGS_IS_LV2_OPTION_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LV2_OPTION_MANAGER)) #define AGS_IS_LV2_OPTION_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LV2_OPTION_MANAGER)) #define AGS_LV2_OPTION_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_LV2_OPTION_MANAGER, AgsLv2OptionManagerClass)) #define AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsLv2OptionManager *) obj)->obj_mutex)) #define AGS_LV2_OPTION_RESSOURCE(ptr) ((AgsLv2OptionRessource *)(ptr)) #define AGS_LV2_OPTIONS_OPTION(ptr) ((LV2_Options_Option *)(ptr)) typedef struct _AgsLv2OptionManager AgsLv2OptionManager; typedef struct _AgsLv2OptionManagerClass AgsLv2OptionManagerClass; typedef struct _AgsLv2OptionRessource AgsLv2OptionRessource; struct _AgsLv2OptionManager { GObject gobject; GRecMutex obj_mutex; GHashTable *ressource; }; struct _AgsLv2OptionManagerClass { GObjectClass gobject; void (*get_option)(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval); void (*set_option)(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval); }; struct _AgsLv2OptionRessource{ LV2_Handle instance; LV2_Options_Option *option; }; GType ags_lv2_option_manager_get_type(void); /* option ressource */ AgsLv2OptionRessource* ags_lv2_option_ressource_alloc(); gboolean ags_lv2_option_manager_ressource_insert(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource, gpointer data); gboolean ags_lv2_option_manager_ressource_remove(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource); gpointer ags_lv2_option_manager_ressource_lookup(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource); gboolean ags_lv2_option_manager_ressource_lookup_extended(AgsLv2OptionManager *lv2_option_manager, AgsLv2OptionRessource *lv2_option_ressource, gpointer *orig_key, gpointer *value); /* get and set option */ void ags_lv2_option_manager_get_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval); void ags_lv2_option_manager_set_option(AgsLv2OptionManager *lv2_option_manager, gpointer instance, gpointer option, gpointer retval); /* the lv2 interface */ uint32_t ags_lv2_option_manager_lv2_options_get(LV2_Handle instance, LV2_Options_Option *options); uint32_t ags_lv2_option_manager_lv2_options_set(LV2_Handle instance, LV2_Options_Option *options); /* */ AgsLv2OptionManager* ags_lv2_option_manager_get_instance(); AgsLv2OptionManager* ags_lv2_option_manager_new(); G_END_DECLS #endif /*__AGS_LV2_OPTION_MANAGER_H__*/ gsequencer-3.1.3/ags/config.h.in0000644000175000017500000002214013622252203013371 00000000000000/* ags/config.h.in. Generated from configure.ac by autoheader. */ /* OS X api enabled */ #undef AGS_OSXAPI /* striping rt-events enabled */ #undef AGS_STRIP_RT_EVENTS /* w32api enabled */ #undef AGS_W32API /* ALSA enabled */ #undef AGS_WITH_ALSA /* audio-unit enabled */ #undef AGS_WITH_AUDIO_UNIT /* core-audio enabled */ #undef AGS_WITH_CORE_AUDIO /* JACK enabled */ #undef AGS_WITH_JACK /* Disable if you don't want libinstpatch */ #undef AGS_WITH_LIBINSTPATCH /* OSS enabled */ #undef AGS_WITH_OSS /* public libgsequencer enabled */ #undef AGS_WITH_PUBLIC_LIBGSEQUENCER /* PULSE enabled */ #undef AGS_WITH_PULSE /* quartz enabled */ #undef AGS_WITH_QUARTZ /* rt enabled */ #undef AGS_WITH_RT /* single documentation directory enabled */ #undef AGS_WITH_SINGLE_DOCDIR /* upstream API reference directory enabled */ #undef AGS_WITH_UPSTREAM_GTK_DOC /* VST3 enabled */ #undef AGS_WITH_VST3 /* wasapi enabled */ #undef AGS_WITH_WASAPI /* X11 enabled */ #undef AGS_WITH_X11 /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* ALSA sequencer event available */ #undef HAVE_ALSA_SEQ_EVENT_H /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Atk 2.12 available */ #undef HAVE_ATK_2_12 /* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_DSSI_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* GLib 2.44 available */ #undef HAVE_GLIB_2_44 /* GLib 2.54 available */ #undef HAVE_GLIB_2_54 /* GLib 2.6 available */ #undef HAVE_GLIB_2_6 /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Jack port uuid available */ #undef HAVE_JACK_PORT_UUID /* Define to 1 if you have the header file. */ #undef HAVE_LADSPA_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `rt' library (-lrt). */ #undef HAVE_LIBRT /* Define to 1 if you have the `X11' library (-lX11). */ #undef HAVE_LIBX11 /* Define to 1 if you have the header file. */ #undef HAVE_LV2_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the `regcomp' function. */ #undef HAVE_REGCOMP /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the `__argz_count' function. */ #undef HAVE___ARGZ_COUNT /* Define to 1 if you have the `__argz_next' function. */ #undef HAVE___ARGZ_NEXT /* Define to 1 if you have the `__argz_stringify' function. */ #undef HAVE___ARGZ_STRINGIFY /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to `int' if doesn't define. */ #undef gid_t /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `int' if does not define. */ #undef pid_t /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if doesn't define. */ #undef uid_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t gsequencer-3.1.3/ags/i18n.h0000644000175000017500000000155013540163167012311 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "config.h" #include "gettext.h" #define i18n(x) gettext(x) #define i18n_pspec(x) gettext(x) gsequencer-3.1.3/ags/README0000644000175000017500000000010113607210263012222 00000000000000* config.h.in (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) gsequencer-3.1.3/ags/widget/0000755000175000017500000000000013622252264012721 500000000000000gsequencer-3.1.3/ags/widget/ags_led.c0000644000175000017500000002057113607210263014404 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_led.h" #include #include void ags_led_class_init(AgsLedClass *led); void ags_led_init(AgsLed *led); void ags_led_realize(GtkWidget *widget); void ags_led_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_led_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_led_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_led_send_configure(AgsLed *led); void ags_led_draw(AgsLed *led, cairo_t *cr); /** * SECTION:ags_led * @short_description: A led widget * @title: AgsLed * @section_id: * @include: ags/widget/ags_led.h * * #AgsLed is a widget visualizing a #gboolean value. */ static gpointer ags_led_parent_class = NULL; GType ags_led_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_led = 0; static const GTypeInfo ags_led_info = { sizeof(AgsLedClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_led_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLed), 0, /* n_preallocs */ (GInstanceInitFunc) ags_led_init, }; ags_type_led = g_type_register_static(GTK_TYPE_WIDGET, "AgsLed", &ags_led_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_led); } return g_define_type_id__volatile; } void ags_led_class_init(AgsLedClass *led) { GtkWidgetClass *widget; ags_led_parent_class = g_type_class_peek_parent(led); widget = (GtkWidgetClass *) led; widget->realize = ags_led_realize; widget->get_preferred_width = ags_led_get_preferred_width; widget->get_preferred_height = ags_led_get_preferred_height; widget->size_allocate = ags_led_size_allocate; widget->draw = ags_led_draw; } void ags_led_init(AgsLed *led) { g_object_set(G_OBJECT(led), "app-paintable", TRUE, NULL); led->flags = 0; } void ags_led_realize(GtkWidget *widget) { AgsLed *led; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_LED(widget)); led = AGS_LED(widget); gtk_widget_set_realized(widget, TRUE); gtk_widget_get_allocation(widget, &allocation); /* */ //TODO:JK: apply borders of container widgets attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); ags_led_send_configure(led); } void ags_led_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsLed *led; g_return_if_fail(AGS_IS_LED(widget)); g_return_if_fail(allocation != NULL); led = AGS_LED(widget); allocation->width = AGS_LED_DEFAULT_WIDTH; allocation->height = AGS_LED_DEFAULT_HEIGHT; gtk_widget_set_allocation(widget, allocation); if(gtk_widget_get_realized(widget)){ gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); ags_led_send_configure(led); } } void ags_led_send_configure(AgsLed *led) { GtkAllocation allocation; GtkWidget *widget; GdkEvent *event = gdk_event_new (GDK_CONFIGURE); widget = GTK_WIDGET(led); gtk_widget_get_allocation(widget, &allocation); event->configure.window = g_object_ref(gtk_widget_get_window (widget)); event->configure.send_event = TRUE; event->configure.x = allocation.x; event->configure.y = allocation.y; event->configure.width = allocation.width; event->configure.height = allocation.height; gtk_widget_event(widget, event); gdk_event_free(event); } void ags_led_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width[0] = natural_width[0] = AGS_LED_DEFAULT_WIDTH; } void ags_led_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height[0] = natural_height[0] = AGS_LED_DEFAULT_HEIGHT; } void ags_led_draw(AgsLed *led, cairo_t *cr) { GtkWidget *widget; GtkStyleContext *led_style_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; GValue value = {0,}; widget = GTK_WIDGET(led); gtk_widget_get_allocation(widget, &allocation); // g_message("led %d|%d %d|%d", allocation.x, allocation.y, allocation.width, allocation.height); /* style context */ led_style_context = gtk_widget_get_style_context(GTK_WIDGET(led)); gtk_style_context_get_property(led_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(led_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(led_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); /* */ // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); if((AGS_LED_ACTIVE & (led->flags)) != 0){ /* active */ cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); }else{ /* normal */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); } cairo_rectangle(cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); cairo_fill(cr); /* outline */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_set_line_width(cr, 1.25); cairo_rectangle(cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); cairo_stroke(cr); cairo_pop_group_to_source(cr); cairo_paint(cr); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_led_set_active: * @led: the #AgsLed * * Set @led to active state. * * Since: 3.0.0 */ void ags_led_set_active(AgsLed *led) { if(!AGS_IS_LED(led)){ return; } if((AGS_LED_ACTIVE & (led->flags)) == 0){ led->flags |= AGS_LED_ACTIVE; gtk_widget_queue_draw((GtkWidget *) led); } } /** * ags_led_unset_active: * @led: the #AgsLed * * Unset @led active state. * * Since: 3.0.0 */ void ags_led_unset_active(AgsLed *led) { if(!AGS_IS_LED(led)){ return; } if((AGS_LED_ACTIVE & (led->flags)) != 0){ led->flags &= (~AGS_LED_ACTIVE); gtk_widget_queue_draw((GtkWidget *) led); } } /** * ags_led_new: * * Create a new instance of #AgsLed. * * Returns: the new #AgsLed * * Since: 3.0.0 */ AgsLed* ags_led_new() { AgsLed *led; led = (AgsLed *) g_object_new(AGS_TYPE_LED, NULL); return(led); } gsequencer-3.1.3/ags/widget/ags_dial.h0000644000175000017500000000641613607210263014560 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DIAL_H__ #define __AGS_DIAL_H__ #include #include #include #define AGS_TYPE_DIAL (ags_dial_get_type()) #define AGS_DIAL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DIAL, AgsDial)) #define AGS_DIAL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_DIAL, AgsDialClass)) #define AGS_IS_DIAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_DIAL)) #define AGS_IS_DIAL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_DIAL)) #define AGS_DIAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_DIAL, AgsDialClass)) #define AGS_DIAL_DEFAULT_PRECISION (8.0) #define AGS_DIAL_DEFAULT_RADIUS (8) #define AGS_DIAL_DEFAULT_OUTLINE_STRENGTH (4) #define AGS_DIAL_DEFAULT_FONT_SIZE (6) #define AGS_DIAL_DEFAULT_BUTTON_WIDTH (12) #define AGS_DIAL_DEFAULT_BUTTON_HEIGHT (8) #define AGS_DIAL_DEFAULT_MARGIN (4.0) #define AGS_DIAL_DEFAULT_MARGIN_LEFT (AGS_DIAL_DEFAULT_MARGIN) #define AGS_DIAL_DEFAULT_MARGIN_RIGHT (AGS_DIAL_DEFAULT_MARGIN) #define AGS_DIAL_DEFAULT_HEIGHT (2 * (AGS_DIAL_DEFAULT_RADIUS + AGS_DIAL_DEFAULT_OUTLINE_STRENGTH + 1)) #define AGS_DIAL_DEFAULT_WIDTH (2 * (AGS_DIAL_DEFAULT_BUTTON_WIDTH + AGS_DIAL_DEFAULT_MARGIN + AGS_DIAL_DEFAULT_RADIUS + AGS_DIAL_DEFAULT_OUTLINE_STRENGTH + 2)) typedef struct _AgsDial AgsDial; typedef struct _AgsDialClass AgsDialClass; typedef enum{ AGS_DIAL_WITH_BUTTONS = 1, AGS_DIAL_MOUSE_BUTTON_PRESSED = 1 << 1, AGS_DIAL_BUTTON_DOWN_PRESSED = 1 << 2, AGS_DIAL_BUTTON_UP_PRESSED = 1 << 3, AGS_DIAL_MOTION_CAPTURING_INIT = 1 << 4, AGS_DIAL_MOTION_CAPTURING = 1 << 5, AGS_DIAL_SEEMLESS_MODE = 1 << 6, AGS_DIAL_INVERSE_LIGHT = 1 << 7, }AgsDialFlags; typedef enum{ AGS_DIAL_INCREMENT, AGS_DIAL_DECREMENT, }AgsDialAction; struct _AgsDial { GtkWidget widget; guint flags; guint radius; guint outline_strength; guint scale_precision; guint scale_max_precision; guint font_size; gint button_width; gint button_height; gint margin_left; gint margin_right; gdouble tolerance; gdouble negated_tolerance; GtkAdjustment *adjustment; gdouble gravity_x; gdouble gravity_y; gdouble current_x; gdouble current_y; }; struct _AgsDialClass { GtkWidgetClass widget; void (*value_changed)(AgsDial *dial); }; GType ags_dial_get_type(void); void ags_dial_value_changed(AgsDial *dial); void ags_dial_set_value(AgsDial *dial, gdouble value); AgsDial* ags_dial_new(); #endif /*__AGS_DIAL_H__*/ gsequencer-3.1.3/ags/widget/ags_led_array.c0000644000175000017500000002067713607210263015611 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_led_array.h" #include void ags_led_array_class_init(AgsLedArrayClass *led_array); void ags_led_array_init(AgsLedArray *led_array); void ags_led_array_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_led_array_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_led_array_realize(GtkWidget *widget); /** * SECTION:ags_led_array * @short_description: A led array widget * @title: AgsLedArray * @section_id: * @include: ags/widget/ags_led_array.h * * #AgsLedArray is a widget representing an array of leds. */ enum{ PROP_0, PROP_LED_WIDTH, PROP_LED_HEIGHT, PROP_LED_COUNT, }; static gpointer ags_led_array_parent_class = NULL; GType ags_led_array_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_led_array = 0; static const GTypeInfo ags_led_array_info = { sizeof(AgsLedArrayClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_led_array_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLedArray), 0, /* n_preallocs */ (GInstanceInitFunc) ags_led_array_init, }; ags_type_led_array = g_type_register_static(GTK_TYPE_BIN, "AgsLedArray", &ags_led_array_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_led_array); } return g_define_type_id__volatile; } void ags_led_array_class_init(AgsLedArrayClass *led_array) { GtkWidgetClass *widget; GObjectClass *gobject; GParamSpec *param_spec; ags_led_array_parent_class = g_type_class_peek_parent(led_array); /* GObjectClass */ gobject = (GObjectClass *) led_array; gobject->set_property = ags_led_array_set_property; gobject->get_property = ags_led_array_get_property; /* properties */ /** * AgsLedArray:led-width: * * The width of one led. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("led-width", "width of led", "The width of one led", 0, G_MAXUINT, AGS_LED_ARRAY_DEFAULT_LED_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LED_WIDTH, param_spec); /** * AgsLedArray:led-height: * * The height of one led. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("led-height", "height of led", "The height of one led", 0, G_MAXUINT, AGS_LED_ARRAY_DEFAULT_LED_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LED_HEIGHT, param_spec); /** * AgsLedArray:led-count: * * The count of leds available. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("led-count", "count of leds", "The count of leds available", 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LED_COUNT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) led_array; widget->realize = ags_led_array_realize; } void ags_led_array_init(AgsLedArray *led_array) { led_array->led_width = AGS_LED_ARRAY_DEFAULT_LED_WIDTH; led_array->led_height = AGS_LED_ARRAY_DEFAULT_LED_HEIGHT; led_array->led = NULL; led_array->led_count = 0; } void ags_led_array_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLedArray *led_array; led_array = AGS_LED_ARRAY(gobject); switch(prop_id){ case PROP_LED_COUNT: { guint led_count; led_count = g_value_get_uint(value); ags_led_array_set_led_count(led_array, led_count); } break; case PROP_LED_WIDTH: { guint led_width; guint i; led_array->led_width = g_value_get_uint(value); for(i = 0; i < led_array->led_count; i++){ gtk_widget_set_size_request((GtkWidget *) led_array->led[i], led_array->led_width, led_array->led_height); } } break; case PROP_LED_HEIGHT: { guint led_height; guint i; led_array->led_height = g_value_get_uint(value); for(i = 0; i < led_array->led_count; i++){ gtk_widget_set_size_request((GtkWidget *) led_array->led[i], led_array->led_width, led_array->led_height); } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_led_array_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLedArray *led_array; led_array = AGS_LED_ARRAY(gobject); switch(prop_id){ case PROP_LED_COUNT: { g_value_set_uint(value, led_array->led_count); } break; case PROP_LED_WIDTH: { g_value_set_uint(value, led_array->led_width); } break; case PROP_LED_HEIGHT: { g_value_set_uint(value, led_array->led_height); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_led_array_realize(GtkWidget *widget) { AgsLedArray *led_array; led_array = (AgsLedArray *) widget; /* call parent */ GTK_WIDGET_CLASS(ags_led_array_parent_class)->realize(widget); } /** * ags_led_array_set_led_count: * @led_array: the #AgsLedArray * @led_count: the led count * * Set led count of @led_array. * * Since: 3.0.0 */ void ags_led_array_set_led_count(AgsLedArray *led_array, guint led_count) { guint i; if(!AGS_IS_LED_ARRAY(led_array) || led_array->led_count == led_count){ return; } if(led_count < led_array->led_count){ /* shrink */ for(i = led_count; i < led_array->led_count; i++){ gtk_widget_destroy((GtkWidget *) led_array->led[i]); } if(led_array->led == NULL){ led_array->led = (AgsLed **) malloc(led_count * sizeof(AgsLed *)); }else{ led_array->led = (AgsLed **) realloc(led_array->led, led_count * sizeof(AgsLed *)); } }else{ /* grow */ if(led_array->led == NULL){ led_array->led = (AgsLed **) malloc(led_count * sizeof(AgsLed *)); }else{ led_array->led = (AgsLed **) realloc(led_array->led, led_count * sizeof(AgsLed *)); } for(i = led_array->led_count; i < led_count; i++){ led_array->led[i] = ags_led_new(); gtk_widget_set_size_request((GtkWidget *) led_array->led[i], led_array->led_width, led_array->led_height); gtk_box_pack_start(led_array->box, (GtkWidget *) led_array->led[i], TRUE, FALSE, 0); gtk_widget_show((GtkWidget *) led_array->led[i]); } } led_array->led_count = led_count; } /** * ags_led_array_unset_all: * @led_array: the #AgsLedArray * * Unset all led active. * * Since: 3.0.0 */ void ags_led_array_unset_all(AgsLedArray *led_array) { guint i; if(!AGS_IS_LED_ARRAY(led_array)){ return; } for(i = 0; i < led_array->led_count; i++){ ags_led_unset_active(led_array->led[i]); } } /** * ags_led_array_set_nth: * @led_array: the #AgsLedArray * @nth: the nth led * * Set @nth led active. * * Since: 3.0.0 */ void ags_led_array_set_nth(AgsLedArray *led_array, guint nth) { if(!AGS_IS_LED_ARRAY(led_array) || nth >= led_array->led_count){ return; } ags_led_set_active(led_array->led[nth]); } /** * ags_led_array_new: * * Create a new instance of #AgsLedArray. Note, use rather its implementation #AgsVLedArray or * #AgsHLedArray. * * Returns: the new #AgsLedArray * * Since: 3.0.0 */ AgsLedArray* ags_led_array_new() { AgsLedArray *led_array; led_array = (AgsLedArray *) g_object_new(AGS_TYPE_LED_ARRAY, NULL); return(led_array); } gsequencer-3.1.3/ags/widget/ags_scrolled_level_box.c0000644000175000017500000002315613607210263017510 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_scrolled_level_box_class_init(AgsScrolledLevelBoxClass *scrolled_level_box); void ags_scrolled_level_box_init(AgsScrolledLevelBox *scrolled_level_box); void ags_scrolled_level_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_scrolled_level_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_scrolled_level_box_finalize(GObject *gobject); void ags_scrolled_level_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_scrolled_level_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_scrolled_level_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation); /** * SECTION:ags_scrolled_level_box * @short_description: scrolled level box widget * @title: AgsScrolledLevelBox * @section_id: * @include: ags/widget/ags_scrolled_level_box.h * * The #AgsScrolledLevelBox lets you to have a scrolled level box widget. */ enum{ PROP_0, PROP_MARGIN_TOP, PROP_MARGIN_BOTTOM, PROP_MARGIN_LEFT, PROP_MARGIN_RIGHT, }; static gpointer ags_scrolled_level_box_parent_class = NULL; GType ags_scrolled_level_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scrolled_level_box = 0; static const GTypeInfo ags_scrolled_level_box_info = { sizeof (AgsScrolledLevelBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scrolled_level_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsScrolledLevelBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scrolled_level_box_init, }; ags_type_scrolled_level_box = g_type_register_static(GTK_TYPE_BIN, "AgsScrolledLevelBox", &ags_scrolled_level_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scrolled_level_box); } return g_define_type_id__volatile; } void ags_scrolled_level_box_class_init(AgsScrolledLevelBoxClass *scrolled_level_box) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_scrolled_level_box_parent_class = g_type_class_peek_parent(scrolled_level_box); /* GObjectClass */ gobject = (GObjectClass *) scrolled_level_box; gobject->set_property = ags_scrolled_level_box_set_property; gobject->get_property = ags_scrolled_level_box_get_property; gobject->finalize = ags_scrolled_level_box_finalize; /* properties */ /** * AgsScrolledLevelBox:margin-top: * * The margin top. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-top", "margin top", "The margin top", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_TOP, param_spec); /** * AgsScrolledLevelBox:margin-bottom: * * The margin bottom. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-bottom", "margin bottom", "The margin bottom", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_BOTTOM, param_spec); /** * AgsScrolledLevelBox:margin-left: * * The margin left. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-left", "margin left", "The margin left", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_LEFT, param_spec); /** * AgsScrolledLevelBox:margin-right: * * The margin right. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-right", "margin right", "The margin right", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_RIGHT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) scrolled_level_box; // widget->get_preferred_width = ags_scrolled_level_get_preferred_width; // widget->get_preferred_height = ags_scrolled_level_get_preferred_height; // widget->size_allocate = ags_scrolled_level_box_size_allocate; } void ags_scrolled_level_box_init(AgsScrolledLevelBox *scrolled_level_box) { scrolled_level_box->margin_top = 0; scrolled_level_box->margin_bottom = 0; scrolled_level_box->margin_left = 0; scrolled_level_box->margin_right = 0; /* viewport */ scrolled_level_box->viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); g_object_set(scrolled_level_box->viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_container_add((GtkContainer *) scrolled_level_box, (GtkWidget *) scrolled_level_box->viewport); /* level box */ scrolled_level_box->level_box = NULL; #if 0 scrolled_level_box->level_box = ags_vlevel_box_new(); gtk_container_add((GtkContainer *) scrolled_level_box->viewport, (GtkWidget *) scrolled_level_box->level_box); #endif } void ags_scrolled_level_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsScrolledLevelBox *scrolled_level_box; scrolled_level_box = AGS_SCROLLED_LEVEL_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { scrolled_level_box->margin_top = g_value_get_uint(value); } break; case PROP_MARGIN_BOTTOM: { scrolled_level_box->margin_bottom = g_value_get_uint(value); } break; case PROP_MARGIN_LEFT: { scrolled_level_box->margin_left = g_value_get_uint(value); } break; case PROP_MARGIN_RIGHT: { scrolled_level_box->margin_right = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_level_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsScrolledLevelBox *scrolled_level_box; scrolled_level_box = AGS_SCROLLED_LEVEL_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { g_value_set_uint(value, scrolled_level_box->margin_top); } break; case PROP_MARGIN_BOTTOM: { g_value_set_uint(value, scrolled_level_box->margin_bottom); } break; case PROP_MARGIN_LEFT: { g_value_set_uint(value, scrolled_level_box->margin_left); } break; case PROP_MARGIN_RIGHT: { g_value_set_uint(value, scrolled_level_box->margin_right); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_level_box_finalize(GObject *gobject) { AgsScrolledLevelBox *scrolled_level_box; scrolled_level_box = AGS_SCROLLED_LEVEL_BOX(gobject); /* call parent */ G_OBJECT_CLASS(ags_scrolled_level_box_parent_class)->finalize(gobject); } void ags_scrolled_level_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width[0] = natural_width[0] = AGS_LEVEL_DEFAULT_LEVEL_WIDTH; } void ags_scrolled_level_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height = natural_height = NULL; } void ags_scrolled_level_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsScrolledLevelBox *scrolled_level_box; GtkAllocation child_allocation; GtkRequisition child_requisition; scrolled_level_box = AGS_SCROLLED_LEVEL_BOX(widget); /* viewport allocation */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_level_box->viewport, &child_requisition); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = allocation->width; child_allocation.height = allocation->height; gtk_widget_size_allocate((GtkWidget *) scrolled_level_box->viewport, &child_allocation); /* box */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_level_box->level_box, &child_requisition); child_allocation.x = 0; child_allocation.y = 0; child_allocation.width = allocation->width; child_allocation.height = child_requisition.height; gtk_widget_size_allocate((GtkWidget *) scrolled_level_box->level_box, &child_allocation); } /** * ags_scrolled_level_box_new: * * Create a new #AgsScrolledLevelBox. * * Returns: a new #AgsScrolledLevelBox * * Since: 3.0.0 */ AgsScrolledLevelBox* ags_scrolled_level_box_new() { AgsScrolledLevelBox *scrolled_level_box; scrolled_level_box = (AgsScrolledLevelBox *) g_object_new(AGS_TYPE_SCROLLED_LEVEL_BOX, NULL); return(scrolled_level_box); } gsequencer-3.1.3/ags/widget/ags_scale_box.c0000644000175000017500000001345113607210263015576 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_scale_box_class_init(AgsScaleBoxClass *scale_box); void ags_scale_box_init(AgsScaleBox *scale_box); void ags_scale_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_scale_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_scale_box_finalize(GObject *gobject); GType ags_scale_box_child_type(GtkContainer *container); /** * SECTION:ags_scale_box * @short_description: abstract box widget * @title: AgsScaleBox * @section_id: * @include: ags/widget/ags_scale_box.h * * The #AgsScaleBox is an abstract box widget containing #AgsScale. */ enum{ PROP_0, PROP_FIXED_SCALE_WIDTH, PROP_FIXED_SCALE_HEIGHT, }; static gpointer ags_scale_box_parent_class = NULL; GType ags_scale_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scale_box = 0; static const GTypeInfo ags_scale_box_info = { sizeof (AgsScaleBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scale_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsScaleBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scale_box_init, }; ags_type_scale_box = g_type_register_static(GTK_TYPE_BOX, "AgsScaleBox", &ags_scale_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scale_box); } return g_define_type_id__volatile; } void ags_scale_box_class_init(AgsScaleBoxClass *scale_box) { GObjectClass *gobject; GtkWidgetClass *widget; GtkContainerClass *container; GParamSpec *param_spec; ags_scale_box_parent_class = g_type_class_peek_parent(scale_box); /* GObjectClass */ gobject = (GObjectClass *) scale_box; gobject->set_property = ags_scale_box_set_property; gobject->get_property = ags_scale_box_get_property; gobject->finalize = ags_scale_box_finalize; /* properties */ /** * AgsScaleBox:fixed-scale-width: * * The fixed width of a scale. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fixed-scale-width", "fixed scale width", "The fixed width of a scale", 0, G_MAXUINT, AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_SCALE_WIDTH, param_spec); /** * AgsScaleBox:fixed-scale-height: * * The fixed height of a scale. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fixed-scale-height", "fixed scale height", "The fixed height of a scale", 0, G_MAXUINT, AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_SCALE_HEIGHT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) scale_box; /* GtkContainerClass */ container = (GtkWidgetClass *) scale_box; container->child_type = ags_scale_box_child_type; } void ags_scale_box_init(AgsScaleBox *scale_box) { g_object_set(scale_box, "homogeneous", FALSE, "spacing", 0, NULL); scale_box->flags = 0; scale_box->fixed_scale_width = AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH; scale_box->fixed_scale_height = AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT; } void ags_scale_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsScaleBox *scale_box; scale_box = AGS_SCALE_BOX(gobject); switch(prop_id){ case PROP_FIXED_SCALE_WIDTH: { scale_box->fixed_scale_width = g_value_get_uint(value); } break; case PROP_FIXED_SCALE_HEIGHT: { scale_box->fixed_scale_height = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scale_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsScaleBox *scale_box; scale_box = AGS_SCALE_BOX(gobject); switch(prop_id){ case PROP_FIXED_SCALE_WIDTH: { g_value_set_uint(value, scale_box->fixed_scale_width); } break; case PROP_FIXED_SCALE_HEIGHT: { g_value_set_uint(value, scale_box->fixed_scale_height); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scale_box_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_scale_box_parent_class)->finalize(gobject); } GType ags_scale_box_child_type(GtkContainer *container) { return(AGS_TYPE_SCALE); } /** * ags_scale_box_new: * * Create a new instance of #AgsScaleBox. * * Returns: the new #AgsScaleBox instance * * Since: 3.0.0 */ AgsScaleBox* ags_scale_box_new() { AgsScaleBox *scale_box; scale_box = (AgsScaleBox *) g_object_new(AGS_TYPE_SCALE_BOX, NULL); return(scale_box); } gsequencer-3.1.3/ags/widget/ags_vlevel_box.h0000644000175000017500000000352213540163167016015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VLEVEL_BOX_H__ #define __AGS_VLEVEL_BOX_H__ #include #include #include #include #define AGS_TYPE_VLEVEL_BOX (ags_vlevel_box_get_type()) #define AGS_VLEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VLEVEL_BOX, AgsVLevelBox)) #define AGS_VLEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VLEVEL_BOX, AgsVLevelBoxClass)) #define AGS_IS_VLEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VLEVEL_BOX)) #define AGS_IS_VLEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VLEVEL_BOX)) #define AGS_VLEVEL_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_VLEVEL_BOX, AgsVLevelBoxClass)) typedef struct _AgsVLevelBox AgsVLevelBox; typedef struct _AgsVLevelBoxClass AgsVLevelBoxClass; struct _AgsVLevelBox { AgsLevelBox level_box; }; struct _AgsVLevelBoxClass { AgsLevelBoxClass level_box; }; GType ags_vlevel_box_get_type(void); AgsVLevelBox* ags_vlevel_box_new(); #endif /*__AGS_VLEVEL_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_level_box.h0000644000175000017500000000377013540163167015634 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LEVEL_BOX_H__ #define __AGS_LEVEL_BOX_H__ #include #include #include #define AGS_TYPE_LEVEL_BOX (ags_level_box_get_type()) #define AGS_LEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LEVEL_BOX, AgsLevelBox)) #define AGS_LEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LEVEL_BOX, AgsLevelBoxClass)) #define AGS_IS_LEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LEVEL_BOX)) #define AGS_IS_LEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LEVEL_BOX)) #define AGS_LEVEL_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_LEVEL_BOX, AgsLevelBoxClass)) #define AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH (60) #define AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT (128) typedef struct _AgsLevelBox AgsLevelBox; typedef struct _AgsLevelBoxClass AgsLevelBoxClass; typedef enum{ AGS_LEVEL_BOX_FIXED_LEVEL_SIZE = 1, }AgsLevelBoxFlags; struct _AgsLevelBox { GtkBox box; guint flags; guint fixed_level_width; guint fixed_level_height; }; struct _AgsLevelBoxClass { GtkBoxClass box; }; GType ags_level_box_get_type(void); AgsLevelBox* ags_level_box_new(); #endif /*__AGS_LEVEL_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_indicator.c0000644000175000017500000002604313607210263015614 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_indicator.h" void ags_indicator_class_init(AgsIndicatorClass *indicator); void ags_indicator_init(AgsIndicator *indicator); void ags_indicator_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_indicator_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_indicator_show(GtkWidget *widget); void ags_indicator_map(GtkWidget *widget); void ags_indicator_realize(GtkWidget *widget); void ags_indicator_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_indicator_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_indicator_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); /** * SECTION:ags_indicator * @short_description: A indicator widget * @title: AgsIndicator * @section_id: * @include: ags/widget/ags_indicator.h * * #AgsIndicator is a widget representing a #GtkAdjustment. */ enum{ PROP_0, PROP_SEGMENT_WIDTH, PROP_SEGMENT_HEIGHT, PROP_SEGMENT_PADDING, PROP_SEGMENT_COUNT, PROP_ADJUSTMENT, }; static gpointer ags_indicator_parent_class = NULL; GType ags_indicator_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_indicator = 0; static const GTypeInfo ags_indicator_info = { sizeof(AgsIndicatorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_indicator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsIndicator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_indicator_init, }; ags_type_indicator = g_type_register_static(GTK_TYPE_WIDGET, "AgsIndicator", &ags_indicator_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_indicator); } return g_define_type_id__volatile; } void ags_indicator_class_init(AgsIndicatorClass *indicator) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_indicator_parent_class = g_type_class_peek_parent(indicator); /* GObjectClass */ gobject = (GObjectClass *) indicator; gobject->set_property = ags_indicator_set_property; gobject->get_property = ags_indicator_get_property; /* GtkWidgetClass */ widget = (GtkWidgetClass *) indicator; widget->realize = ags_indicator_realize; widget->size_allocate = ags_indicator_size_allocate; widget->get_preferred_width = ags_indicator_get_preferred_width; widget->get_preferred_height = ags_indicator_get_preferred_height; widget->show = ags_indicator_show; /* properties */ /** * AgsIndicator:segment-width: * * The indicator's segment width. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("segment-width", "segment width", "The indicator's segment width", 1, G_MAXUINT, AGS_INDICATOR_DEFAULT_SEGMENT_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEGMENT_WIDTH, param_spec); /** * AgsIndicator:segment-height: * * The indicator's segment height. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("segment-height", "segment height", "The indicator's segment height", 1, G_MAXUINT, AGS_INDICATOR_DEFAULT_SEGMENT_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEGMENT_HEIGHT, param_spec); /** * AgsIndicator:segment-padding: * * The indicator's segment padding. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("segment-padding", "segment padding", "The indicator's segment padding", 0, G_MAXUINT, AGS_INDICATOR_DEFAULT_SEGMENT_PADDING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEGMENT_PADDING, param_spec); /** * AgsIndicator:segment-count: * * The indicator's segment count. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("segment-count", "segment count", "The indicator's segment count", 1, G_MAXUINT, AGS_INDICATOR_DEFAULT_SEGMENT_COUNT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SEGMENT_COUNT, param_spec); /** * AgsIndicator:adjustment: * * The adjustment giving indicator value. * * Since: 3.0.0 */ param_spec = g_param_spec_object("adjustment", "assigned adjustment", "The adjustment it is assigned with", G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ADJUSTMENT, param_spec); } void ags_indicator_init(AgsIndicator *indicator) { g_object_set(G_OBJECT(indicator), "app-paintable", TRUE, NULL); /* segment alignment */ indicator->segment_width = AGS_INDICATOR_DEFAULT_SEGMENT_WIDTH; indicator->segment_height = AGS_INDICATOR_DEFAULT_SEGMENT_HEIGHT; indicator->segment_padding = AGS_INDICATOR_DEFAULT_SEGMENT_PADDING; indicator->segment_count = AGS_INDICATOR_DEFAULT_SEGMENT_COUNT; /* adjustment */ indicator->adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 10.0, 0.01, 0.01, 0.01); g_object_ref(indicator->adjustment); } void ags_indicator_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsIndicator *indicator; indicator = AGS_INDICATOR(gobject); switch(prop_id){ case PROP_SEGMENT_WIDTH: { indicator->segment_width = g_value_get_uint(value); } break; case PROP_SEGMENT_HEIGHT: { indicator->segment_height = g_value_get_uint(value); } break; case PROP_SEGMENT_PADDING: { indicator->segment_padding = g_value_get_uint(value); } break; case PROP_SEGMENT_COUNT: { indicator->segment_count = g_value_get_uint(value); } break; case PROP_ADJUSTMENT: { GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) g_value_get_object(value); if(indicator->adjustment == adjustment){ return; } if(indicator->adjustment != NULL){ g_object_unref(G_OBJECT(indicator->adjustment)); } if(adjustment != NULL){ g_object_ref(G_OBJECT(adjustment)); } indicator->adjustment = adjustment; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_indicator_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsIndicator *indicator; indicator = AGS_INDICATOR(gobject); switch(prop_id){ case PROP_SEGMENT_WIDTH: { g_value_set_uint(value, indicator->segment_width); } break; case PROP_SEGMENT_HEIGHT: { g_value_set_uint(value, indicator->segment_height); } break; case PROP_SEGMENT_PADDING: { g_value_set_uint(value, indicator->segment_padding); } break; case PROP_SEGMENT_COUNT: { g_value_set_uint(value, indicator->segment_count); } break; case PROP_ADJUSTMENT: { g_value_set_object(value, indicator->adjustment); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_indicator_map(GtkWidget *widget) { if (gtk_widget_get_realized (widget) && !gtk_widget_get_mapped (widget)) { GTK_WIDGET_CLASS (ags_indicator_parent_class)->map(widget); gdk_window_show(gtk_widget_get_window(widget)); // ags_indicator_draw(widget); } } void ags_indicator_realize(GtkWidget *widget) { AgsIndicator *indicator; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; gint buttons_width; gint border_left, border_top; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_INDICATOR(widget)); indicator = AGS_INDICATOR(widget); gtk_widget_set_realized(widget, TRUE); gtk_widget_get_allocation(widget, &allocation); /* */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.window_type = GDK_WINDOW_CHILD; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); window = gdk_window_new(gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); gtk_widget_queue_resize(widget); } void ags_indicator_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { GTK_WIDGET_CLASS(ags_indicator_parent_class)->size_allocate(widget, allocation); /* implement me */ //TODO:JK: } void ags_indicator_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { GTK_WIDGET_CLASS(ags_indicator_parent_class)->get_preferred_width(widget, minimal_width, natural_width); } void ags_indicator_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { GTK_WIDGET_CLASS(ags_indicator_parent_class)->get_preferred_height(widget, minimal_height, natural_height); } void ags_indicator_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_indicator_parent_class)->show(widget); } /** * ags_indicator_new: * * Creates an #AgsIndicator. Note, use rather its implementation #AgsVIndicator or * #AgsHIndicator. * * Returns: a new #AgsIndicator * * Since: 3.0.0 */ AgsIndicator* ags_indicator_new() { AgsIndicator *indicator; indicator = (AgsIndicator *) g_object_new(AGS_TYPE_INDICATOR, NULL); return(indicator); } gsequencer-3.1.3/ags/widget/ags_hlevel_box.h0000644000175000017500000000352213540163167015777 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_HLEVEL_BOX_H__ #define __AGS_HLEVEL_BOX_H__ #include #include #include #include #define AGS_TYPE_HLEVEL_BOX (ags_hlevel_box_get_type()) #define AGS_HLEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_HLEVEL_BOX, AgsHLevelBox)) #define AGS_HLEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_HLEVEL_BOX, AgsHLevelBoxClass)) #define AGS_IS_HLEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_HLEVEL_BOX)) #define AGS_IS_HLEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_HLEVEL_BOX)) #define AGS_HLEVEL_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_HLEVEL_BOX, AgsHLevelBoxClass)) typedef struct _AgsHLevelBox AgsHLevelBox; typedef struct _AgsHLevelBoxClass AgsHLevelBoxClass; struct _AgsHLevelBox { AgsLevelBox level_box; }; struct _AgsHLevelBoxClass { AgsLevelBoxClass level_box; }; GType ags_hlevel_box_get_type(void); AgsHLevelBox* ags_hlevel_box_new(); #endif /*__AGS_HLEVEL_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_scale_box.h0000644000175000017500000000377013540163167015614 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCALE_BOX_H__ #define __AGS_SCALE_BOX_H__ #include #include #include #define AGS_TYPE_SCALE_BOX (ags_scale_box_get_type()) #define AGS_SCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCALE_BOX, AgsScaleBox)) #define AGS_SCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCALE_BOX, AgsScaleBoxClass)) #define AGS_IS_SCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCALE_BOX)) #define AGS_IS_SCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCALE_BOX)) #define AGS_SCALE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCALE_BOX, AgsScaleBoxClass)) #define AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH (60) #define AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT (128) typedef struct _AgsScaleBox AgsScaleBox; typedef struct _AgsScaleBoxClass AgsScaleBoxClass; typedef enum{ AGS_SCALE_BOX_FIXED_SCALE_SIZE = 1, }AgsScaleBoxFlags; struct _AgsScaleBox { GtkBox box; guint flags; guint fixed_scale_width; guint fixed_scale_height; }; struct _AgsScaleBoxClass { GtkBoxClass box; }; GType ags_scale_box_get_type(void); AgsScaleBox* ags_scale_box_new(); #endif /*__AGS_SCALE_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_indicator.h0000644000175000017500000000412713540163167015626 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_INDICATOR_H__ #define __AGS_INDICATOR_H__ #include #include #include #define AGS_TYPE_INDICATOR (ags_indicator_get_type()) #define AGS_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_INDICATOR, AgsIndicator)) #define AGS_INDICATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_INDICATOR, AgsIndicatorClass)) #define AGS_IS_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_INDICATOR)) #define AGS_IS_INDICATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_INDICATOR)) #define AGS_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_INDICATOR, AgsIndicatorClass)) #define AGS_INDICATOR_DEFAULT_SEGMENT_WIDTH (7) #define AGS_INDICATOR_DEFAULT_SEGMENT_HEIGHT (7) #define AGS_INDICATOR_DEFAULT_SEGMENT_PADDING (3) #define AGS_INDICATOR_DEFAULT_SEGMENT_COUNT (10) typedef struct _AgsIndicator AgsIndicator; typedef struct _AgsIndicatorClass AgsIndicatorClass; struct _AgsIndicator { GtkWidget widget; guint segment_width; guint segment_height; guint segment_padding; guint segment_count; GtkAdjustment *adjustment; }; struct _AgsIndicatorClass { GtkWidgetClass widget; }; GType ags_indicator_get_type(void); AgsIndicator* ags_indicator_new(); #endif /*__AGS_INDICATOR_H__*/ gsequencer-3.1.3/ags/widget/ags_hscale_box.c0000644000175000017500000000477213607210263015754 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_hscale_box_class_init(AgsHScaleBoxClass *hscale_box); void ags_hscale_box_init(AgsHScaleBox *hscale_box); /** * SECTION:ags_hscale_box * @short_description: horizontal box widget * @title: AgsHScaleBox * @section_id: * @include: ags/widget/ags_hscale_box.h * * The #AgsHScaleBox is an horizontal box widget containing #AgsScale. */ static gpointer ags_hscale_box_parent_class = NULL; GType ags_hscale_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_hscale_box = 0; static const GTypeInfo ags_hscale_box_info = { sizeof (AgsHScaleBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_hscale_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsHScaleBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_hscale_box_init, }; ags_type_hscale_box = g_type_register_static(AGS_TYPE_SCALE_BOX, "AgsHScaleBox", &ags_hscale_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_hscale_box); } return g_define_type_id__volatile; } void ags_hscale_box_class_init(AgsHScaleBoxClass *hscale_box) { } void ags_hscale_box_init(AgsHScaleBox *hscale_box) { gtk_orientable_set_orientation(GTK_ORIENTABLE(hscale_box), GTK_ORIENTATION_HORIZONTAL); } /** * ags_hscale_box_new: * * Create a new instance of #AgsHScaleBox. * * Returns: the new #AgsHScaleBox instance * * Since: 3.0.0 */ AgsHScaleBox* ags_hscale_box_new() { AgsHScaleBox *hscale_box; hscale_box = (AgsHScaleBox *) g_object_new(AGS_TYPE_HSCALE_BOX, NULL); return(hscale_box); } gsequencer-3.1.3/ags/widget/ags_vled_array.h0000644000175000017500000000350613540163167016002 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VLED_ARRAY_H__ #define __AGS_VLED_ARRAY_H__ #include #include #include #include "ags_led_array.h" #define AGS_TYPE_VLED_ARRAY (ags_vled_array_get_type()) #define AGS_VLED_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VLED_ARRAY, AgsVLedArray)) #define AGS_VLED_ARRAY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VLED_ARRAY, AgsVLedArrayClass)) #define AGS_IS_VLED_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_VLED_ARRAY)) #define AGS_IS_VLED_ARRAY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_VLED_ARRAY)) #define AGS_VLED_ARRAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_VLED_ARRAY, AgsVLedArrayClass)) typedef struct _AgsVLedArray AgsVLedArray; typedef struct _AgsVLedArrayClass AgsVLedArrayClass; struct _AgsVLedArray { AgsLedArray led_array; }; struct _AgsVLedArrayClass { AgsLedArrayClass led_array; }; GType ags_vled_array_get_type(void); AgsVLedArray* ags_vled_array_new(); #endif /*__AGS_VLED_ARRAY_H__*/ gsequencer-3.1.3/ags/widget/ags_vscale_box.c0000644000175000017500000000467713607210263015776 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_vscale_box_class_init(AgsVScaleBoxClass *vscale_box); void ags_vscale_box_init(AgsVScaleBox *vscale_box); /** * SECTION:ags_vscale_box * @short_description: vertical box widget * @title: AgsVScaleBox * @section_id: * @include: ags/widget/ags_vscale_box.h * * The #AgsVScaleBox is an vertical box widget containing #AgsScale. */ GType ags_vscale_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_vscale_box = 0; static const GTypeInfo ags_vscale_box_info = { sizeof (AgsVScaleBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_vscale_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVScaleBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_vscale_box_init, }; ags_type_vscale_box = g_type_register_static(AGS_TYPE_SCALE_BOX, "AgsVScaleBox", &ags_vscale_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_vscale_box); } return g_define_type_id__volatile; } void ags_vscale_box_class_init(AgsVScaleBoxClass *vscale_box) { } void ags_vscale_box_init(AgsVScaleBox *vscale_box) { gtk_orientable_set_orientation(GTK_ORIENTABLE(vscale_box), GTK_ORIENTATION_VERTICAL); } /** * ags_vscale_box_new: * * Create a new instance of #AgsVScaleBox. * * Returns: the new #AgsVScaleBox instance * * Since: 3.0.0 */ AgsVScaleBox* ags_vscale_box_new() { AgsVScaleBox *vscale_box; vscale_box = (AgsVScaleBox *) g_object_new(AGS_TYPE_VSCALE_BOX, NULL); return(vscale_box); } gsequencer-3.1.3/ags/widget/ags_vled_array.c0000644000175000017500000000522213607210263015764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_vled_array.h" void ags_vled_array_class_init(AgsVLedArrayClass *vled_array); void ags_vled_array_init(AgsVLedArray *vled_array); /** * SECTION:ags_vled_array * @short_description: A vertical led array widget * @title: AgsVLedArray * @section_id: * @include: ags/widget/ags_vled_array.h * * #AgsVLedArray is a widget representing an array of vertical leds. */ static gpointer ags_vled_array_parent_class = NULL; GType ags_vled_array_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_vled_array = 0; static const GTypeInfo ags_vled_array_info = { sizeof(AgsVLedArrayClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_vled_array_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsVLedArray), 0, /* n_preallocs */ (GInstanceInitFunc) ags_vled_array_init, }; ags_type_vled_array = g_type_register_static(AGS_TYPE_LED_ARRAY, "AgsVLedArray", &ags_vled_array_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_vled_array); } return g_define_type_id__volatile; } void ags_vled_array_class_init(AgsVLedArrayClass *vled_array) { /* empty */ } void ags_vled_array_init(AgsVLedArray *vled_array) { AGS_LED_ARRAY(vled_array)->box = (GtkBox *) gtk_vbox_new(FALSE, 0); gtk_container_add((GtkContainer *) vled_array, (GtkWidget *) AGS_LED_ARRAY(vled_array)->box); gtk_widget_show((GtkWidget *) AGS_LED_ARRAY(vled_array)->box); } /** * ags_vled_array_new: * * Create a new instance of #AgsVLedArray. * * Returns: the new #AgsVLedArray * * Since: 3.0.0 */ AgsVLedArray* ags_vled_array_new() { AgsVLedArray *vled_array; vled_array = (AgsVLedArray *) g_object_new(AGS_TYPE_VLED_ARRAY, NULL); return(vled_array); } gsequencer-3.1.3/ags/widget/ags_hindicator.h0000644000175000017500000000366713540163167016006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_HINDICATOR_H__ #define __AGS_HINDICATOR_H__ #include #include #include #include "ags_indicator.h" #define AGS_TYPE_HINDICATOR (ags_hindicator_get_type()) #define AGS_HINDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_HINDICATOR, AgsHIndicator)) #define AGS_HINDICATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_HINDICATOR, AgsHIndicatorClass)) #define AGS_IS_HINDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_HINDICATOR)) #define AGS_IS_HINDICATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_HINDICATOR)) #define AGS_HINDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_HINDICATOR, AgsHIndicatorClass)) #define AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH (7) #define AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT (16) typedef struct _AgsHIndicator AgsHIndicator; typedef struct _AgsHIndicatorClass AgsHIndicatorClass; struct _AgsHIndicator { AgsIndicator indicator; }; struct _AgsHIndicatorClass { AgsIndicatorClass indicator; }; GType ags_hindicator_get_type(void); AgsHIndicator* ags_hindicator_new(); #endif /*__AGS_HINDICATOR_H__*/ gsequencer-3.1.3/ags/widget/ags_level.h0000644000175000017500000000641213540163167014760 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LEVEL_H__ #define __AGS_LEVEL_H__ #include #include #include #define AGS_TYPE_LEVEL (ags_level_get_type()) #define AGS_LEVEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LEVEL, AgsLevel)) #define AGS_LEVEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LEVEL, AgsLevelClass)) #define AGS_IS_LEVEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LEVEL)) #define AGS_IS_LEVEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LEVEL)) #define AGS_LEVEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_LEVEL, AgsLevelClass)) #define AGS_LEVEL_DEFAULT_LEVEL_WIDTH (60) #define AGS_LEVEL_DEFAULT_LEVEL_HEIGHT (256) #define AGS_LEVEL_DEFAULT_LOWER (0.0) #define AGS_LEVEL_DEFAULT_UPPER (1.0) #define AGS_LEVEL_DEFAULT_NORMALIZED_VOLUME (0.0) #define AGS_LEVEL_DEFAULT_STEP_COUNT (0.1) #define AGS_LEVEL_DEFAULT_PAGE_SIZE (0.25) #define AGS_LEVEL_DEFAULT_SAMPLERATE (44100) typedef struct _AgsLevel AgsLevel; typedef struct _AgsLevelClass AgsLevelClass; typedef enum{ AGS_LEVEL_PCM_S8 = 1, AGS_LEVEL_PCM_S16 = 1 << 1, AGS_LEVEL_PCM_S24 = 1 << 2, AGS_LEVEL_PCM_S32 = 1 << 3, AGS_LEVEL_PCM_S64 = 1 << 4, AGS_LEVEL_PCM_FLOAT = 1 << 5, AGS_LEVEL_PCM_DOUBLE = 1 << 6, }AgsLevelFlags; typedef enum{ AGS_LEVEL_BUTTON_1_PRESSED = 1, }AgsLevelButtonState; typedef enum{ AGS_LEVEL_KEY_L_CONTROL = 1, AGS_LEVEL_KEY_R_CONTROL = 1 << 1, AGS_LEVEL_KEY_L_SHIFT = 1 << 2, AGS_LEVEL_KEY_R_SHIFT = 1 << 3, }AgsLevelKeyMask; typedef enum{ AGS_LEVEL_LAYOUT_VERTICAL, AGS_LEVEL_LAYOUT_HORIZONTAL, }AgsLevelLayout; typedef enum{ AGS_LEVEL_STEP_UP, AGS_LEVEL_STEP_DOWN, AGS_LEVEL_PAGE_UP, AGS_LEVEL_PAGE_DOWN, }AgsLevelAction; struct _AgsLevel { GtkWidget widget; guint flags; guint key_mask; guint button_state; guint layout; guint font_size; guint level_width; guint level_height; gdouble lower; gdouble upper; gdouble normalized_volume; guint step_count; gdouble page_size; guint samplerate; guint *audio_channel; guint audio_channel_count; }; struct _AgsLevelClass { GtkWidgetClass widget; void (*value_changed)(AgsLevel *level, gdouble normalized_volume); }; GType ags_level_get_type(void); void ags_level_value_changed(AgsLevel *level, gdouble normalized_volume); AgsLevel* ags_level_new(); #endif /*__AGS_LEVEL_H__*/ gsequencer-3.1.3/ags/widget/ags_ruler.h0000644000175000017500000000407413566554515015015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RULER_H__ #define __AGS_RULER_H__ #include #include #include #define AGS_TYPE_RULER (ags_ruler_get_type()) #define AGS_RULER(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, AGS_TYPE_RULER, AgsRuler)) #define AGS_RULER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_RULER, AgsRulerClass)) #define AGS_IS_RULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_RULER)) #define AGS_IS_RULER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_RULER)) #define AGS_RULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_RULER, AgsRulerClass)) #define AGS_RULER_FONT_SIZE (12) #define AGS_RULER_FREE_SPACE (4.0) #define AGS_RULER_DEFAULT_HEIGHT (24) #define AGS_RULER_DEFAULT_STEP (16) #define AGS_RULER_DEFAULT_LARGE_STEP (8.0) #define AGS_RULER_DEFAULT_SMALL_STEP (6.0) typedef struct _AgsRuler AgsRuler; typedef struct _AgsRulerClass AgsRulerClass; struct _AgsRuler { GtkWidget widget; guint flags; guint font_size; GtkAdjustment *adjustment; guint step; guint large_step; guint small_step; gdouble factor; gdouble precision; gdouble scale_precision; }; struct _AgsRulerClass { GtkWidgetClass widget; }; GType ags_ruler_get_type(); AgsRuler* ags_ruler_new(); #endif /*__AGS_RULER_H__*/ gsequencer-3.1.3/ags/widget/ags_hled_array.c0000644000175000017500000000521013607210263015743 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_hled_array.h" void ags_hled_array_class_init(AgsHLedArrayClass *hled_array); void ags_hled_array_init(AgsHLedArray *hled_array); /** * SECTION:ags_hled_array * @short_description: A horizontal led array widget * @title: AgsHLedArray * @section_id: * @include: ags/widget/ags_hled_array.h * * #AgsHLedArray is a widget representing an array of horizontal leds. */ static gpointer ags_hled_array_parent_class = NULL; GType ags_hled_array_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_hled_array = 0; static const GTypeInfo ags_hled_array_info = { sizeof(AgsHLedArrayClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_hled_array_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsHLedArray), 0, /* n_preallocs */ (GInstanceInitFunc) ags_hled_array_init, }; ags_type_hled_array = g_type_register_static(AGS_TYPE_LED_ARRAY, "AgsHLedArray", &ags_hled_array_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_hled_array); } return g_define_type_id__volatile; } void ags_hled_array_class_init(AgsHLedArrayClass *hled_array) { /* empty */ } void ags_hled_array_init(AgsHLedArray *hled_array) { AGS_LED_ARRAY(hled_array)->box = (GtkBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) hled_array, (GtkWidget *) AGS_LED_ARRAY(hled_array)->box); gtk_widget_show((GtkWidget *) AGS_LED_ARRAY(hled_array)->box); } /** * ags_hled_array_new: * * Creates an #AgsHLedArray. * * Returns: a new #AgsHLedArray * * Since: 3.0.0 */ AgsHLedArray* ags_hled_array_new() { AgsHLedArray *hled_array; hled_array = (AgsHLedArray *) g_object_new(AGS_TYPE_HLED_ARRAY, NULL); return(hled_array); } gsequencer-3.1.3/ags/widget/ags_hscale_box.h0000644000175000017500000000352213540163167015757 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_HSCALE_BOX_H__ #define __AGS_HSCALE_BOX_H__ #include #include #include #include #define AGS_TYPE_HSCALE_BOX (ags_hscale_box_get_type()) #define AGS_HSCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_HSCALE_BOX, AgsHScaleBox)) #define AGS_HSCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_HSCALE_BOX, AgsHScaleBoxClass)) #define AGS_IS_HSCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_HSCALE_BOX)) #define AGS_IS_HSCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_HSCALE_BOX)) #define AGS_HSCALE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_HSCALE_BOX, AgsHScaleBoxClass)) typedef struct _AgsHScaleBox AgsHScaleBox; typedef struct _AgsHScaleBoxClass AgsHScaleBoxClass; struct _AgsHScaleBox { AgsScaleBox scale_box; }; struct _AgsHScaleBoxClass { AgsScaleBoxClass scale_box; }; GType ags_hscale_box_get_type(void); AgsHScaleBox* ags_hscale_box_new(); #endif /*__AGS_HSCALE_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_vscale_box.h0000644000175000017500000000352213540163167015775 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VSCALE_BOX_H__ #define __AGS_VSCALE_BOX_H__ #include #include #include #include #define AGS_TYPE_VSCALE_BOX (ags_vscale_box_get_type()) #define AGS_VSCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VSCALE_BOX, AgsVScaleBox)) #define AGS_VSCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VSCALE_BOX, AgsVScaleBoxClass)) #define AGS_IS_VSCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_VSCALE_BOX)) #define AGS_IS_VSCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_VSCALE_BOX)) #define AGS_VSCALE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_VSCALE_BOX, AgsVScaleBoxClass)) typedef struct _AgsVScaleBox AgsVScaleBox; typedef struct _AgsVScaleBoxClass AgsVScaleBoxClass; struct _AgsVScaleBox { AgsScaleBox scale_box; }; struct _AgsVScaleBoxClass { AgsScaleBoxClass scale_box; }; GType ags_vscale_box_get_type(void); AgsVScaleBox* ags_vscale_box_new(); #endif /*__AGS_VSCALE_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_hindicator.c0000644000175000017500000001741013607210263015762 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_hindicator.h" void ags_hindicator_class_init(AgsHIndicatorClass *indicator); void ags_hindicator_init(AgsHIndicator *indicator); void ags_hindicator_show(GtkWidget *widget); void ags_hindicator_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_hindicator_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_hindicator_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_hindicator_draw(AgsHIndicator *indicator, cairo_t *cr); /** * SECTION:ags_hindicator * @short_description: A horizontal indicator widget * @title: AgsHIndicator * @section_id: * @include: ags/widget/ags_hindicator.h * * #AgsHIndicator is a widget visualizing a #GtkAdjustment. */ static gpointer ags_hindicator_parent_class = NULL; GType ags_hindicator_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_hindicator = 0; static const GTypeInfo ags_hindicator_info = { sizeof(AgsHIndicatorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_hindicator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsHIndicator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_hindicator_init, }; ags_type_hindicator = g_type_register_static(AGS_TYPE_INDICATOR, "AgsHIndicator", &ags_hindicator_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_hindicator); } return g_define_type_id__volatile; } void ags_hindicator_class_init(AgsHIndicatorClass *indicator) { GtkWidgetClass *widget; ags_hindicator_parent_class = g_type_class_peek_parent(indicator); /* GtkWidgetClass */ widget = (GtkWidgetClass *) indicator; widget->get_preferred_width = ags_hindicator_get_preferred_width; widget->get_preferred_height = ags_hindicator_get_preferred_height; widget->size_allocate = ags_hindicator_size_allocate; widget->draw = ags_hindicator_draw; } void ags_hindicator_init(AgsHIndicator *indicator) { g_object_set(indicator, "segment-width", AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH, "segment-height", AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT, NULL); } void ags_hindicator_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsIndicator *indicator; indicator = AGS_INDICATOR(widget); minimal_width[0] = natural_width[0] = (indicator->segment_count * indicator->segment_width) + (indicator->segment_count * indicator->segment_padding); } void ags_hindicator_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsIndicator *indicator; indicator = AGS_INDICATOR(widget); minimal_height[0] = natural_height[0] = indicator->segment_height; } void ags_hindicator_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsIndicator *indicator; indicator = AGS_INDICATOR(widget); allocation->width = (indicator->segment_count * indicator->segment_width) + ((indicator->segment_count - 1) * indicator->segment_padding); if(allocation->height < indicator->segment_height){ allocation->height = indicator->segment_height; } GTK_WIDGET_CLASS(ags_hindicator_parent_class)->size_allocate(widget, allocation); } void ags_hindicator_draw(AgsHIndicator *hindicator, cairo_t *cr) { GtkWidget *widget; GtkAdjustment *adjustment; GtkStyleContext *hindicator_style_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; guint width, height; guint padding_top, padding_left; guint segment_width, segment_height; guint padding; guint i; GValue value = {0,}; widget = GTK_WIDGET(hindicator); adjustment = AGS_INDICATOR(hindicator)->adjustment; if(adjustment == NULL){ return; } gtk_widget_get_allocation(GTK_WIDGET(hindicator), &allocation); /* style context */ hindicator_style_context = gtk_widget_get_style_context(GTK_WIDGET(hindicator)); gtk_style_context_get_property(hindicator_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(hindicator_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(hindicator_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); width = (AGS_INDICATOR(hindicator)->segment_count * AGS_INDICATOR(hindicator)->segment_width) + ((AGS_INDICATOR(hindicator)->segment_count - 1) * AGS_INDICATOR(hindicator)->segment_padding); height = AGS_INDICATOR(hindicator)->segment_height; padding_top = (allocation.height - height) / 2; padding_left = (allocation.width - width) / 2; segment_width = AGS_INDICATOR(hindicator)->segment_width; segment_height = AGS_INDICATOR(hindicator)->segment_height; padding = AGS_INDICATOR(hindicator)->segment_padding; // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* clear bg */ gtk_render_background(hindicator_style_context, cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); for(i = 0; i < AGS_INDICATOR(hindicator)->segment_count; i++){ if(gtk_adjustment_get_value(adjustment) > 0.0 && (1.0 / gtk_adjustment_get_value(adjustment) * i < AGS_INDICATOR(hindicator)->segment_count)){ /* active */ cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); }else{ /* normal */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); } cairo_rectangle(cr, width - i * (segment_width + padding) - segment_width, 0, segment_width, segment_height); cairo_fill(cr); /* outline */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_rectangle(cr, width - i * (segment_width + padding) - segment_width, 0, segment_width, segment_height); cairo_stroke(cr); } cairo_pop_group_to_source(cr); cairo_paint(cr); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_hindicator_new: * * Creates an #AgsHIndicator. * * Returns: a new #AgsHIndicator * * Since: 3.0.0 */ AgsHIndicator* ags_hindicator_new() { AgsHIndicator *indicator; GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); indicator = (AgsHIndicator *) g_object_new(AGS_TYPE_HINDICATOR, "adjustment", adjustment, NULL); return(indicator); } gsequencer-3.1.3/ags/widget/ags_vlevel_box.c0000644000175000017500000000467713607210263016016 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_vlevel_box_class_init(AgsVLevelBoxClass *vlevel_box); void ags_vlevel_box_init(AgsVLevelBox *vlevel_box); /** * SECTION:ags_vlevel_box * @short_description: vertical box widget * @title: AgsVLevelBox * @section_id: * @include: ags/widget/ags_vlevel_box.h * * The #AgsVLevelBox is an vertical box widget containing #AgsLevel. */ GType ags_vlevel_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_vlevel_box = 0; static const GTypeInfo ags_vlevel_box_info = { sizeof (AgsVLevelBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_vlevel_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsVLevelBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_vlevel_box_init, }; ags_type_vlevel_box = g_type_register_static(AGS_TYPE_LEVEL_BOX, "AgsVLevelBox", &ags_vlevel_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_vlevel_box); } return g_define_type_id__volatile; } void ags_vlevel_box_class_init(AgsVLevelBoxClass *vlevel_box) { } void ags_vlevel_box_init(AgsVLevelBox *vlevel_box) { gtk_orientable_set_orientation(GTK_ORIENTABLE(vlevel_box), GTK_ORIENTATION_VERTICAL); } /** * ags_vlevel_box_new: * * Create a new instance of #AgsVLevelBox. * * Returns: the new #AgsVLevelBox instance * * Since: 3.0.0 */ AgsVLevelBox* ags_vlevel_box_new() { AgsVLevelBox *vlevel_box; vlevel_box = (AgsVLevelBox *) g_object_new(AGS_TYPE_VLEVEL_BOX, NULL); return(vlevel_box); } gsequencer-3.1.3/ags/widget/ags_scrolled_level_box.h0000644000175000017500000000423013540163167017513 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCROLLED_LEVEL_BOX_H__ #define __AGS_SCROLLED_LEVEL_BOX_H__ #include #include #include #include #define AGS_TYPE_SCROLLED_LEVEL_BOX (ags_scrolled_level_box_get_type()) #define AGS_SCROLLED_LEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCROLLED_LEVEL_BOX, AgsScrolledLevelBox)) #define AGS_SCROLLED_LEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCROLLED_LEVEL_BOX, AgsScrolledLevelBoxClass)) #define AGS_IS_SCROLLED_LEVEL_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCROLLED_LEVEL_BOX)) #define AGS_IS_SCROLLED_LEVEL_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCROLLED_LEVEL_BOX)) #define AGS_SCROLLED_LEVEL_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCROLLED_LEVEL_BOX, AgsScrolledLevelBoxClass)) typedef struct _AgsScrolledLevelBox AgsScrolledLevelBox; typedef struct _AgsScrolledLevelBoxClass AgsScrolledLevelBoxClass; struct _AgsScrolledLevelBox { GtkBin bin; guint margin_top; guint margin_bottom; guint margin_left; guint margin_right; GtkViewport *viewport; AgsLevelBox *level_box; }; struct _AgsScrolledLevelBoxClass { GtkBinClass bin; }; GType ags_scrolled_level_box_get_type(void); AgsScrolledLevelBox* ags_scrolled_level_box_new(); #endif /*__AGS_SCROLLED_LEVEL_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_scrolled_piano.c0000644000175000017500000001767013607210263016643 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_scrolled_piano_class_init(AgsScrolledPianoClass *scrolled_piano); void ags_scrolled_piano_init(AgsScrolledPiano *scrolled_piano); void ags_scrolled_piano_finalize(GObject *gobject); void ags_scrolled_piano_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_scrolled_piano_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_scrolled_piano_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_scrolled_piano_allocate_viewport(GtkWidget *widget); /** * SECTION:ags_scrolled_piano * @short_description: scrolled piano widget * @title: AgsScrolledPiano * @section_id: * @include: ags/widget/ags_scrolled_piano.h * * The #AgsScrolledPiano lets you to have a scrolled piano widget. */ enum{ PROP_0, }; static gpointer ags_scrolled_piano_parent_class = NULL; GType ags_scrolled_piano_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scrolled_piano = 0; static const GTypeInfo ags_scrolled_piano_info = { sizeof (AgsScrolledPianoClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scrolled_piano_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsScrolledPiano), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scrolled_piano_init, }; ags_type_scrolled_piano = g_type_register_static(GTK_TYPE_BIN, "AgsScrolledPiano", &ags_scrolled_piano_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scrolled_piano); } return g_define_type_id__volatile; } void ags_scrolled_piano_class_init(AgsScrolledPianoClass *scrolled_piano) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_scrolled_piano_parent_class = g_type_class_peek_parent(scrolled_piano); /* GObjectClass */ gobject = (GObjectClass *) scrolled_piano; gobject->finalize = ags_scrolled_piano_finalize; /* properties */ /* GtkWidgetClass */ widget = (GtkWidgetClass *) scrolled_piano; widget->get_preferred_width = ags_scrolled_piano_get_preferred_width; widget->get_preferred_height = ags_scrolled_piano_get_preferred_height; widget->size_allocate = ags_scrolled_piano_size_allocate; } void ags_scrolled_piano_init(AgsScrolledPiano *scrolled_piano) { GtkAdjustment *hadjustment, *vadjustment; gtk_widget_set_events(GTK_WIDGET(scrolled_piano), GDK_EXPOSURE_MASK); /* viewport */ hadjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, AGS_PIANO_DEFAULT_KEY_WIDTH, 1.0); vadjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 1.0, AGS_PIANO_DEFAULT_KEY_HEIGHT, 1.0); scrolled_piano->viewport = gtk_viewport_new(hadjustment, vadjustment); g_object_set(scrolled_piano->viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_container_add((GtkContainer *) scrolled_piano, (GtkWidget *) scrolled_piano->viewport); /* piano */ scrolled_piano->piano = ags_piano_new(); gtk_container_add((GtkContainer *) scrolled_piano->viewport, (GtkWidget *) scrolled_piano->piano); } void ags_scrolled_piano_finalize(GObject *gobject) { AgsScrolledPiano *scrolled_piano; scrolled_piano = AGS_SCROLLED_PIANO(gobject); /* call parent */ G_OBJECT_CLASS(ags_scrolled_piano_parent_class)->finalize(gobject); } void ags_scrolled_piano_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsScrolledPiano *scrolled_piano; scrolled_piano = AGS_SCROLLED_PIANO(widget); if(scrolled_piano->piano == NULL){ minimal_width = natural_width = NULL; return; } if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ minimal_width[0] = natural_width[0] = scrolled_piano->piano->key_width; }else if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ minimal_width = natural_width = NULL; } } void ags_scrolled_piano_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsScrolledPiano *scrolled_piano; scrolled_piano = AGS_SCROLLED_PIANO(widget); if(scrolled_piano->piano == NULL){ minimal_height = natural_height = NULL; return; } if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ minimal_height = natural_height = NULL; }else if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ minimal_height[0] = natural_height[0] = scrolled_piano->piano->key_width; } } void ags_scrolled_piano_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsScrolledPiano *scrolled_piano; GtkAdjustment *piano_adjustment; GtkAllocation child_allocation; gdouble upper; scrolled_piano = AGS_SCROLLED_PIANO(widget); if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ allocation->width = scrolled_piano->piano->key_width; }else if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ allocation->height = scrolled_piano->piano->key_width; } gtk_widget_set_allocation(widget, allocation); /* viewport allocation */ ags_scrolled_piano_allocate_viewport(widget); } void ags_scrolled_piano_allocate_viewport(GtkWidget *widget) { AgsScrolledPiano *scrolled_piano; GtkAdjustment *piano_adjustment; GdkWindow *viewport_window; GtkAllocation allocation; GtkAllocation child_allocation; gint width, height; scrolled_piano = AGS_SCROLLED_PIANO(widget); gtk_widget_get_allocation(widget, &allocation); /* viewport allocation */ child_allocation.x = allocation.x; child_allocation.y = allocation.y; width = 1; height = 1; if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ height = allocation.height; }else{ width = allocation.width; } if(height < 1){ height = 1; } if(width < 1){ width = 1; } if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ child_allocation.width = scrolled_piano->piano->key_width; if(height > scrolled_piano->piano->key_count * scrolled_piano->piano->key_height){ child_allocation.height = scrolled_piano->piano->key_count * scrolled_piano->piano->key_height; }else{ child_allocation.height = height; } }else if(scrolled_piano->piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ if(width > scrolled_piano->piano->key_count * scrolled_piano->piano->key_height){ child_allocation.width = scrolled_piano->piano->key_count * scrolled_piano->piano->key_height; }else{ child_allocation.width = width; } child_allocation.height = scrolled_piano->piano->key_width; } gtk_widget_size_allocate((GtkWidget *) scrolled_piano->viewport, &child_allocation); } /** * ags_scrolled_piano_new: * * Create a new #AgsScrolledPiano. * * Returns: a new #AgsScrolledPiano * * Since: 3.0.0 */ AgsScrolledPiano* ags_scrolled_piano_new() { AgsScrolledPiano *scrolled_piano; scrolled_piano = (AgsScrolledPiano *) g_object_new(AGS_TYPE_SCROLLED_PIANO, NULL); return(scrolled_piano); } gsequencer-3.1.3/ags/widget/ags_widget_marshallers.list.in0000644000175000017500000000137713521306053020657 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2019 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . VOID:STRING,INT gsequencer-3.1.3/ags/widget/ags_widget_marshal.h0000644000175000017500000000331513577417057016654 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ /* This file is generated by glib-genmarshal, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ #ifndef __AGS_WIDGET_CCLOSURE_MARSHAL_MARSHAL_H__ #define __AGS_WIDGET_CCLOSURE_MARSHAL_MARSHAL_H__ #include G_BEGIN_DECLS /* VOID:STRING,INT (ags/widget/ags_widget_marshallers.list:1) */ extern void ags_widget_cclosure_marshal_VOID__STRING_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); G_END_DECLS #endif /* __AGS_WIDGET_CCLOSURE_MARSHAL_MARSHAL_H__ */ gsequencer-3.1.3/ags/widget/ags_container.c0000644000175000017500000000263013607210263015616 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include /** * SECTION:ags_container * @short_description: Complete GtkContainer * @title: AgsContainer * @section_id: * @include: ags/widget/ags_container.h * * Functions completing #GtkContainer API. */ /** * ags_container_add_all: * @container: the #GtkContainer * @list: (element-type Gtk.Widget): the #GList-struct containing #GtkWidget * * Adds all #GtkWidget pointed by #GList to @container. * * Since: 3.0.0 */ void ags_container_add_all(GtkContainer *container, GList *list) { while(list != NULL){ gtk_container_add(container, GTK_WIDGET(list->data)); list = list->next; } } gsequencer-3.1.3/ags/widget/ags_piano_keys.h0000644000175000017500000001444313540163167016015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * Th file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PIANO_KEYS_H__ #define __AGS_PIANO_KEYS_H__ #define AGS_PIANO_KEYS_OCTAVE_0_C "C,," #define AGS_PIANO_KEYS_OCTAVE_0_CIS "C#,," #define AGS_PIANO_KEYS_OCTAVE_0_D "D,," #define AGS_PIANO_KEYS_OCTAVE_0_DIS "D#,," #define AGS_PIANO_KEYS_OCTAVE_0_E "E,," #define AGS_PIANO_KEYS_OCTAVE_0_F "F,," #define AGS_PIANO_KEYS_OCTAVE_0_FIS "F#,," #define AGS_PIANO_KEYS_OCTAVE_0_G "G,," #define AGS_PIANO_KEYS_OCTAVE_0_GIS "G#,," #define AGS_PIANO_KEYS_OCTAVE_0_A "A,," #define AGS_PIANO_KEYS_OCTAVE_0_AIS "A#,," #define AGS_PIANO_KEYS_OCTAVE_0_H "H,," #define AGS_PIANO_KEYS_OCTAVE_1_C "C," #define AGS_PIANO_KEYS_OCTAVE_1_CIS "C#," #define AGS_PIANO_KEYS_OCTAVE_1_D "D," #define AGS_PIANO_KEYS_OCTAVE_1_DIS "D#," #define AGS_PIANO_KEYS_OCTAVE_1_E "E," #define AGS_PIANO_KEYS_OCTAVE_1_F "F," #define AGS_PIANO_KEYS_OCTAVE_1_FIS "F#," #define AGS_PIANO_KEYS_OCTAVE_1_G "G," #define AGS_PIANO_KEYS_OCTAVE_1_GIS "G#," #define AGS_PIANO_KEYS_OCTAVE_1_A "A," #define AGS_PIANO_KEYS_OCTAVE_1_AIS "A#," #define AGS_PIANO_KEYS_OCTAVE_1_H "H," #define AGS_PIANO_KEYS_OCTAVE_2_C "C" #define AGS_PIANO_KEYS_OCTAVE_2_CIS "C#" #define AGS_PIANO_KEYS_OCTAVE_2_D "D" #define AGS_PIANO_KEYS_OCTAVE_2_DIS "D#" #define AGS_PIANO_KEYS_OCTAVE_2_E "E" #define AGS_PIANO_KEYS_OCTAVE_2_F "F" #define AGS_PIANO_KEYS_OCTAVE_2_FIS "F#" #define AGS_PIANO_KEYS_OCTAVE_2_G "G" #define AGS_PIANO_KEYS_OCTAVE_2_GIS "G#" #define AGS_PIANO_KEYS_OCTAVE_2_A "A" #define AGS_PIANO_KEYS_OCTAVE_2_AIS "A#" #define AGS_PIANO_KEYS_OCTAVE_2_H "H" #define AGS_PIANO_KEYS_OCTAVE_3_C "c" #define AGS_PIANO_KEYS_OCTAVE_3_CIS "c#" #define AGS_PIANO_KEYS_OCTAVE_3_D "d" #define AGS_PIANO_KEYS_OCTAVE_3_DIS "d#" #define AGS_PIANO_KEYS_OCTAVE_3_E "e" #define AGS_PIANO_KEYS_OCTAVE_3_F "f" #define AGS_PIANO_KEYS_OCTAVE_3_FIS "f#" #define AGS_PIANO_KEYS_OCTAVE_3_G "g" #define AGS_PIANO_KEYS_OCTAVE_3_GIS "g#" #define AGS_PIANO_KEYS_OCTAVE_3_A "a" #define AGS_PIANO_KEYS_OCTAVE_3_AIS "a#" #define AGS_PIANO_KEYS_OCTAVE_3_H "h" #define AGS_PIANO_KEYS_OCTAVE_4_C "c'" #define AGS_PIANO_KEYS_OCTAVE_4_CIS "c#'" #define AGS_PIANO_KEYS_OCTAVE_4_D "d'" #define AGS_PIANO_KEYS_OCTAVE_4_DIS "d#'" #define AGS_PIANO_KEYS_OCTAVE_4_E "e'" #define AGS_PIANO_KEYS_OCTAVE_4_F "f'" #define AGS_PIANO_KEYS_OCTAVE_4_FIS "f#'" #define AGS_PIANO_KEYS_OCTAVE_4_G "g'" #define AGS_PIANO_KEYS_OCTAVE_4_GIS "g#'" #define AGS_PIANO_KEYS_OCTAVE_4_A "a'" #define AGS_PIANO_KEYS_OCTAVE_4_AIS "a#'" #define AGS_PIANO_KEYS_OCTAVE_4_H "h'" #define AGS_PIANO_KEYS_OCTAVE_5_C "c''" #define AGS_PIANO_KEYS_OCTAVE_5_CIS "c#''" #define AGS_PIANO_KEYS_OCTAVE_5_D "d''" #define AGS_PIANO_KEYS_OCTAVE_5_DIS "d#''" #define AGS_PIANO_KEYS_OCTAVE_5_E "e''" #define AGS_PIANO_KEYS_OCTAVE_5_F "f''" #define AGS_PIANO_KEYS_OCTAVE_5_FIS "f#''" #define AGS_PIANO_KEYS_OCTAVE_5_G "g''" #define AGS_PIANO_KEYS_OCTAVE_5_GIS "g#''" #define AGS_PIANO_KEYS_OCTAVE_5_A "a''" #define AGS_PIANO_KEYS_OCTAVE_5_AIS "a#''" #define AGS_PIANO_KEYS_OCTAVE_5_H "h''" #define AGS_PIANO_KEYS_OCTAVE_6_C "c'''" #define AGS_PIANO_KEYS_OCTAVE_6_CIS "c#'''" #define AGS_PIANO_KEYS_OCTAVE_6_D "d'''" #define AGS_PIANO_KEYS_OCTAVE_6_DIS "d#'''" #define AGS_PIANO_KEYS_OCTAVE_6_E "e'''" #define AGS_PIANO_KEYS_OCTAVE_6_F "f'''" #define AGS_PIANO_KEYS_OCTAVE_6_FIS "f#'''" #define AGS_PIANO_KEYS_OCTAVE_6_G "g'''" #define AGS_PIANO_KEYS_OCTAVE_6_GIS "g#'''" #define AGS_PIANO_KEYS_OCTAVE_6_A "a'''" #define AGS_PIANO_KEYS_OCTAVE_6_AIS "a#'''" #define AGS_PIANO_KEYS_OCTAVE_6_H "h'''" #define AGS_PIANO_KEYS_OCTAVE_7_C "c''''" #define AGS_PIANO_KEYS_OCTAVE_7_CIS "c#''''" #define AGS_PIANO_KEYS_OCTAVE_7_D "d''''" #define AGS_PIANO_KEYS_OCTAVE_7_DIS "d#''''" #define AGS_PIANO_KEYS_OCTAVE_7_E "e''''" #define AGS_PIANO_KEYS_OCTAVE_7_F "f''''" #define AGS_PIANO_KEYS_OCTAVE_7_FIS "f#''''" #define AGS_PIANO_KEYS_OCTAVE_7_G "g''''" #define AGS_PIANO_KEYS_OCTAVE_7_GIS "g#''''" #define AGS_PIANO_KEYS_OCTAVE_7_A "a''''" #define AGS_PIANO_KEYS_OCTAVE_7_AIS "a#''''" #define AGS_PIANO_KEYS_OCTAVE_7_H "h''''" #define AGS_PIANO_KEYS_OCTAVE_8_C "c'''''" #define AGS_PIANO_KEYS_OCTAVE_8_CIS "c#'''''" #define AGS_PIANO_KEYS_OCTAVE_8_D "d'''''" #define AGS_PIANO_KEYS_OCTAVE_8_DIS "d#'''''" #define AGS_PIANO_KEYS_OCTAVE_8_E "e'''''" #define AGS_PIANO_KEYS_OCTAVE_8_F "f'''''" #define AGS_PIANO_KEYS_OCTAVE_8_FIS "f#'''''" #define AGS_PIANO_KEYS_OCTAVE_8_G "g'''''" #define AGS_PIANO_KEYS_OCTAVE_8_GIS "g#'''''" #define AGS_PIANO_KEYS_OCTAVE_8_A "a'''''" #define AGS_PIANO_KEYS_OCTAVE_8_AIS "a#'''''" #define AGS_PIANO_KEYS_OCTAVE_8_H "h'''''" #define AGS_PIANO_KEYS_OCTAVE_9_C "c''''''" #define AGS_PIANO_KEYS_OCTAVE_9_CIS "c#''''''" #define AGS_PIANO_KEYS_OCTAVE_9_D "d''''''" #define AGS_PIANO_KEYS_OCTAVE_9_DIS "d#''''''" #define AGS_PIANO_KEYS_OCTAVE_9_E "e''''''" #define AGS_PIANO_KEYS_OCTAVE_9_F "f''''''" #define AGS_PIANO_KEYS_OCTAVE_9_FIS "f#''''''" #define AGS_PIANO_KEYS_OCTAVE_9_G "g''''''" #define AGS_PIANO_KEYS_OCTAVE_9_GIS "g#''''''" #define AGS_PIANO_KEYS_OCTAVE_9_A "a''''''" #define AGS_PIANO_KEYS_OCTAVE_9_AIS "a#''''''" #define AGS_PIANO_KEYS_OCTAVE_9_H "h''''''" #define AGS_PIANO_KEYS_OCTAVE_10_C "c'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_CIS "c#'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_D "d'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_DIS "d#'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_E "e'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_F "f'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_FIS "f#'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_G "g'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_GIS "g#'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_A "a'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_AIS "a#'''''''" #define AGS_PIANO_KEYS_OCTAVE_10_H "h'''''''" #endif /*__AGS_PIANO_KEYS_H__*/ gsequencer-3.1.3/ags/widget/ags_scale.h0000644000175000017500000000573413540163167014746 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCALE_H__ #define __AGS_SCALE_H__ #include #include #include #define AGS_TYPE_SCALE (ags_scale_get_type()) #define AGS_SCALE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCALE, AgsScale)) #define AGS_SCALE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCALE, AgsScaleClass)) #define AGS_IS_SCALE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCALE)) #define AGS_IS_SCALE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCALE)) #define AGS_SCALE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCALE, AgsScaleClass)) #define AGS_SCALE_DEFAULT_SCALE_WIDTH (60) #define AGS_SCALE_DEFAULT_SCALE_HEIGHT (128) #define AGS_SCALE_DEFAULT_LOWER (0.0) #define AGS_SCALE_DEFAULT_UPPER (1.0) #define AGS_SCALE_DEFAULT_VALUE (0.0) #define AGS_SCALE_DEFAULT_STEP_COUNT (16.0) #define AGS_SCALE_DEFAULT_PAGE_SIZE (8.0) typedef struct _AgsScale AgsScale; typedef struct _AgsScaleClass AgsScaleClass; typedef enum{ AGS_SCALE_LOGARITHMIC = 1, }AgsScaleFlags; typedef enum{ AGS_SCALE_BUTTON_1_PRESSED = 1, }AgsScaleButtonState; typedef enum{ AGS_SCALE_KEY_L_CONTROL = 1, AGS_SCALE_KEY_R_CONTROL = 1 << 1, AGS_SCALE_KEY_L_SHIFT = 1 << 2, AGS_SCALE_KEY_R_SHIFT = 1 << 3, }AgsScaleKeyMask; typedef enum{ AGS_SCALE_LAYOUT_VERTICAL, AGS_SCALE_LAYOUT_HORIZONTAL, }AgsScaleLayout; typedef enum{ AGS_SCALE_STEP_UP, AGS_SCALE_STEP_DOWN, AGS_SCALE_PAGE_UP, AGS_SCALE_PAGE_DOWN, }AgsScaleAction; struct _AgsScale { GtkWidget widget; guint flags; guint key_mask; guint button_state; guint layout; guint font_size; guint scale_width; guint scale_height; gchar *control_name; gdouble lower; gdouble upper; gdouble default_value; guint step_count; gdouble page_size; gint scale_step_count; gchar **scale_point; gdouble *scale_value; }; struct _AgsScaleClass { GtkWidgetClass widget; void (*value_changed)(AgsScale *scale, gdouble default_value); }; GType ags_scale_get_type(void); void ags_scale_value_changed(AgsScale *scale, gdouble default_value); AgsScale* ags_scale_new(); #endif /*__AGS_SCALE_H__*/ gsequencer-3.1.3/ags/widget/ags_notebook.c0000644000175000017500000005143113607210263015457 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_notebook_class_init(AgsNotebookClass *notebook); void ags_notebook_init(AgsNotebook *notebook); void ags_notebook_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_notebook_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_notebook_finalize(GObject *gobject); void ags_notebook_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_notebook_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_notebook_size_allocate(AgsNotebook *notebook, GtkAllocation *allocation); void ags_notebook_scroll_prev_callback(GtkWidget *button, AgsNotebook *notebook); void ags_notebook_scroll_next_callback(GtkWidget *button, AgsNotebook *notebook); /** * SECTION:ags_notebook * @short_description: selection widget * @title: AgsNotebook * @section_id: * @include: ags/widget/ags_notebook.h * * The #AgsNotebook lets you select/deselect tabs and assign data to them. */ enum{ PROP_0, PROP_PREFIX, }; static gpointer ags_notebook_parent_class = NULL; GType ags_notebook_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_notebook = 0; static const GTypeInfo ags_notebook_info = { sizeof (AgsNotebookClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_notebook_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsNotebook), 0, /* n_preallocs */ (GInstanceInitFunc) ags_notebook_init, }; ags_type_notebook = g_type_register_static(GTK_TYPE_VBOX, "AgsNotebook", &ags_notebook_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_notebook); } return g_define_type_id__volatile; } void ags_notebook_class_init(AgsNotebookClass *notebook) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_notebook_parent_class = g_type_class_peek_parent(notebook); /* GObjectClass */ gobject = (GObjectClass *) notebook; gobject->set_property = ags_notebook_set_property; gobject->get_property = ags_notebook_get_property; gobject->finalize = ags_notebook_finalize; /** * AgsNotebook:prefix: * * The prefix used to do enumerated labels. * * Since: 3.0.0 */ param_spec = g_param_spec_string("prefix", "enumeration prefix", "The label's enumeration prefix", AGS_NOTEBOOK_TAB_DEFAULT_PREFIX, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PREFIX, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) notebook; widget->get_preferred_width = ags_notebook_get_preferred_width; widget->get_preferred_height = ags_notebook_get_preferred_height; widget->size_allocate = ags_notebook_size_allocate; } void ags_notebook_init(AgsNotebook *notebook) { GtkArrow *arrow; notebook->flags = 0; notebook->tab_width = AGS_NOTEBOOK_TAB_DEFAULT_WIDTH; notebook->tab_height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; notebook->prefix = g_strdup(AGS_NOTEBOOK_TAB_DEFAULT_PREFIX); /* navigation */ notebook->navigation = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(notebook), GTK_WIDGET(notebook->navigation), FALSE, FALSE, 0); /* arrow left */ arrow = (GtkArrow *) gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE); notebook->scroll_prev = g_object_new(GTK_TYPE_BUTTON, "child", arrow, "relief", GTK_RELIEF_NONE, NULL); gtk_box_pack_start(GTK_BOX(notebook->navigation), GTK_WIDGET(notebook->scroll_prev), FALSE, FALSE, 0); g_signal_connect(G_OBJECT(notebook->scroll_prev), "clicked", G_CALLBACK(ags_notebook_scroll_prev_callback), notebook); /* arrow right */ arrow = (GtkArrow *) gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); notebook->scroll_next = g_object_new(GTK_TYPE_BUTTON, "child", arrow, "relief", GTK_RELIEF_NONE, NULL); gtk_box_pack_start(GTK_BOX(notebook->navigation), GTK_WIDGET(notebook->scroll_next), FALSE, FALSE, 0); g_signal_connect(G_OBJECT(notebook->scroll_next), "clicked", G_CALLBACK(ags_notebook_scroll_next_callback), notebook); /* viewport with selection */ notebook->viewport = (GtkViewport *) gtk_viewport_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(notebook->navigation), GTK_WIDGET(notebook->viewport)); notebook->hbox = (GtkHBox *) gtk_hbox_new(FALSE, 0); gtk_container_add((GtkContainer *) notebook->viewport, (GtkWidget *) notebook->hbox); notebook->tab = NULL; notebook->tab_free_func = ags_notebook_tab_free; } void ags_notebook_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsNotebook *notebook; notebook = AGS_NOTEBOOK(gobject); switch(prop_id){ case PROP_PREFIX: { gchar *prefix; prefix = g_value_get_string(value); if(notebook->prefix == prefix){ return; } g_free(notebook->prefix); notebook->prefix = g_strdup(prefix); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_notebook_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsNotebook *notebook; notebook = AGS_NOTEBOOK(gobject); switch(prop_id){ case PROP_PREFIX: { g_value_set_string(value, notebook->prefix); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_notebook_finalize(GObject *gobject) { AgsNotebook *notebook; notebook = AGS_NOTEBOOK(gobject); g_free(notebook->prefix); if(notebook->tab_free_func != NULL){ g_list_free_full(notebook->tab, (GDestroyNotify) notebook->tab_free_func); }else{ g_list_free_full(notebook->tab, g_free); } /* call parent */ G_OBJECT_CLASS(ags_notebook_parent_class)->finalize(gobject); } void ags_notebook_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width = natural_width = NULL; } void ags_notebook_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height[0] = natural_height[0] = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; } void ags_notebook_size_allocate(AgsNotebook *notebook, GtkAllocation *allocation) { GtkAllocation child_allocation; GtkRequisition child_requisition; GList *list, *list_start; guint x; if(allocation->width < (2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT) + (5 * AGS_NOTEBOOK_TAB_DEFAULT_WIDTH)){ allocation->width = (2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT) + (5 * AGS_NOTEBOOK_TAB_DEFAULT_WIDTH); } allocation->height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; GTK_WIDGET_CLASS(ags_notebook_parent_class)->size_allocate(notebook, allocation); /* */ gtk_widget_get_child_requisition((GtkWidget *) notebook->navigation, &child_requisition); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = 2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; gtk_widget_size_allocate((GtkWidget *) notebook->navigation, &child_allocation); /* */ gtk_widget_get_child_requisition((GtkWidget *) notebook->scroll_prev, &child_requisition); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; gtk_widget_size_allocate((GtkWidget *) notebook->scroll_prev, &child_allocation); gtk_widget_get_child_requisition(gtk_bin_get_child((GtkBin *) notebook->scroll_prev), &child_requisition); child_allocation.x = allocation->x + 4; child_allocation.y = allocation->y + 4; child_allocation.width = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT - 8; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT - 8; gtk_widget_size_allocate(gtk_bin_get_child((GtkBin *) notebook->scroll_prev), &child_allocation); /* */ gtk_widget_get_child_requisition((GtkWidget *) notebook->scroll_next, &child_requisition); child_allocation.x = allocation->x + AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; child_allocation.y = allocation->y; child_allocation.width = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; gtk_widget_size_allocate((GtkWidget *) notebook->scroll_next, &child_allocation); gtk_widget_get_child_requisition(gtk_bin_get_child((GtkBin *) notebook->scroll_next), &child_requisition); child_allocation.x = allocation->x + AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT + 4; child_allocation.y = allocation->y + 4; child_allocation.width = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT - 8; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT - 8; gtk_widget_size_allocate(gtk_bin_get_child((GtkBin *) notebook->scroll_next), &child_allocation); /* */ gtk_widget_get_child_requisition((GtkWidget *) notebook->viewport, &child_requisition); child_allocation.x = allocation->x + 2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; child_allocation.y = allocation->y; child_allocation.width = allocation->width - 2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; gtk_widget_size_allocate((GtkWidget *) notebook->viewport, &child_allocation); /* */ list_start = list = gtk_container_get_children((GtkContainer *) notebook->hbox); /* */ gtk_widget_get_child_requisition((GtkWidget *) notebook->hbox, &child_requisition); child_allocation.x = 0; child_allocation.y = 0; child_allocation.width = g_list_length(list) * AGS_NOTEBOOK_TAB_DEFAULT_WIDTH; if(child_allocation.width < allocation->width - 2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT){ child_allocation.width = allocation->width - 2 * AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; } child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; gtk_widget_size_allocate((GtkWidget *) notebook->hbox, &child_allocation); x = 0; while(list != NULL){ gtk_widget_get_child_requisition((GtkWidget *) list->data, &child_requisition); child_allocation.x = x; child_allocation.y = 0; child_allocation.width = AGS_NOTEBOOK_TAB_DEFAULT_WIDTH; child_allocation.height = AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT; gtk_widget_size_allocate(list->data, &child_allocation); x += AGS_NOTEBOOK_TAB_DEFAULT_WIDTH; list = list->next; } g_list_free(list_start); // gtk_widget_size_allocate(notebook->hbox); } void ags_notebook_scroll_prev_callback(GtkWidget *button, AgsNotebook *notebook) { GtkAdjustment *adjustment; adjustment = gtk_viewport_get_hadjustment(notebook->viewport); if(gtk_adjustment_get_value(adjustment) - gtk_adjustment_get_step_increment(adjustment) > 0){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) - gtk_adjustment_get_step_increment(adjustment)); }else{ gtk_adjustment_set_value(adjustment, 0.0); } gtk_widget_show_all((GtkWidget *) notebook->hbox); } void ags_notebook_scroll_next_callback(GtkWidget *button, AgsNotebook *notebook) { GtkAdjustment *adjustment; adjustment = gtk_viewport_get_hadjustment(notebook->viewport); if(gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_step_increment(adjustment) < gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_step_increment(adjustment)); }else{ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)); } gtk_widget_show_all((GtkWidget *) notebook->hbox); } /** * ags_notebook_tab_alloc: * * Allocate #AgsNotebookTab-struct. * * Returns: the newly allocated #AgsNotebookTab-struct * * Since: 3.0.0 */ AgsNotebookTab* ags_notebook_tab_alloc() { AgsNotebookTab *notebook_tab; notebook_tab = (AgsNotebookTab *) malloc(sizeof(AgsNotebookTab)); notebook_tab->data = NULL; notebook_tab->toggle = NULL; return(notebook_tab); } /** * ags_notebook_tab_free: * @tab: the #AgsNotebookTab-struct * * Free @tab's memory. * * Since: 3.0.0 */ void ags_notebook_tab_free(AgsNotebookTab *tab) { if(tab == NULL){ return; } g_free(tab->data); g_free(tab); } /** * ags_notebook_tab_set_data: * @notebook: the #AgsNotebook * @position: the tab's position * @data: the data to set * * Set the data field of #AgsNotebookTab-struct at @position. * * Since: 3.0.0 */ void ags_notebook_tab_set_data(AgsNotebook *notebook, gint position, gpointer data) { GList *tab; if(!AGS_IS_NOTEBOOK(notebook) || position < 0){ return; } tab = g_list_nth(notebook->tab, position); if(tab != NULL && tab->data != NULL){ AGS_NOTEBOOK_TAB(tab->data)->data = data; } } /** * ags_notebook_tab_index: * @notebook: the #AgsNotebook * @data: the assigned data * * Retrieve tab index assigned with @data. * * Returns: the position as integer * * Since: 3.0.0 */ gint ags_notebook_tab_index(AgsNotebook *notebook, gpointer data) { GList *list; gint i; if(!AGS_IS_NOTEBOOK(notebook)){ return(-1); } list = notebook->tab; for(i = g_list_length(notebook->tab) - 1; list != NULL; i--){ if(AGS_NOTEBOOK_TAB(list->data)->data == data){ return(i); } list = list->next; } return(-1); } /** * ags_notebook_next_active_tab: * @notebook: the #AgsNotebook * @position: the position as integer * * Get next active tab following @position. * * Returns: the position of next active tab as integer * * Since: 3.0.0 */ gint ags_notebook_next_active_tab(AgsNotebook *notebook, gint position) { GList *list, *list_start; gint i; if(!AGS_IS_NOTEBOOK(notebook)){ return(-1); } list_start = g_list_copy(notebook->tab); list_start = list = g_list_reverse(list_start); list = g_list_nth(list, position); for(i = 0; list != NULL;){ if(gtk_toggle_button_get_active(AGS_NOTEBOOK_TAB(list->data)->toggle)){ g_list_free(list_start); return(position + i); } /* iterate */ list = list->next; i++; } g_list_free(list_start); return(-1); } /** * ags_notebook_add_tab: * @notebook: the #AgsNotebook * * Add a new #AgsNotebookTab-struct to @notebook. * * Returns: the position as integer * * Since: 3.0.0 */ gint ags_notebook_add_tab(AgsNotebook *notebook) { AgsNotebookTab *tab; GtkViewport *viewport; GtkAdjustment *adjustment; gchar *str; gint tab_index; gint length; guint width; if(!AGS_IS_NOTEBOOK(notebook)){ return(-1); } /* new tab */ tab = ags_notebook_tab_alloc(); notebook->tab = g_list_prepend(notebook->tab, tab); tab_index = g_list_length(notebook->tab); str = NULL; if((AGS_NOTEBOOK_TAB_PREFIXED_LABEL & (notebook->flags)) != 0 && (AGS_NOTEBOOK_TAB_ENUMERATE & (notebook->flags)) != 0){ str = g_strdup_printf("%s %d", notebook->prefix, tab_index); }else if((AGS_NOTEBOOK_TAB_PREFIXED_LABEL & (notebook->flags)) != 0){ str = g_strdup_printf("%s", notebook->prefix); }else if((AGS_NOTEBOOK_TAB_ENUMERATE & (notebook->flags)) != 0){ str = g_strdup_printf("%d", tab_index); } tab->toggle = (GtkToggleButton *) g_object_new(GTK_TYPE_TOGGLE_BUTTON, "label", str, "xalign", 0.0, "yalign", 0.0, "active", TRUE, NULL); gtk_widget_set_size_request((GtkWidget *) tab->toggle, AGS_NOTEBOOK_TAB_DEFAULT_WIDTH, AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT); gtk_box_pack_start(GTK_BOX(notebook->hbox), GTK_WIDGET(tab->toggle), FALSE, FALSE, 0); gtk_widget_show_all((GtkWidget *) notebook->hbox); g_free(str); return(tab_index); } /** * ags_notebook_add_tab_with_label: * @notebook: the #AgsNotebook * @data: the assigned data * * Add a new #AgsNotebookTab-struct to @notebook and set specified @label. * * Returns: the position as integer * * Since: 3.0.0 */ gint ags_notebook_add_tab_with_label(AgsNotebook *notebook, gchar *label) { GList *tab; gint position; if(!AGS_IS_NOTEBOOK(notebook)){ return(-1); } position = ags_notebook_add_tab(notebook); tab = g_list_nth(notebook->tab, position); if(tab != NULL){ g_object_set(AGS_NOTEBOOK_TAB(tab->data)->toggle, "label", label, NULL); } return(position); } /** * ags_notebook_insert_tab: * @notebook: the #AgsNotebook * @position: the position as integer * * Insert a new #AgsNotebookTab-struct to @notebook. * * Since: 3.0.0 */ void ags_notebook_insert_tab(AgsNotebook *notebook, gint position) { AgsNotebookTab *tab; GtkAdjustment *adjustment; gint length; guint width; if(!AGS_IS_NOTEBOOK(notebook)){ return; } /* insert tab */ length = g_list_length(notebook->tab); tab = ags_notebook_tab_alloc(); notebook->tab = g_list_insert(notebook->tab, tab, length - position); tab->toggle = (GtkToggleButton *) gtk_toggle_button_new_with_label(g_strdup_printf("%s %d", notebook->prefix, position + 1)); g_object_set(tab->toggle, "xalign", 0.0, "yalign", 0.0, NULL); gtk_widget_set_size_request((GtkWidget *) tab->toggle, AGS_NOTEBOOK_TAB_DEFAULT_WIDTH, AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT); gtk_box_pack_start(GTK_BOX(notebook->hbox), GTK_WIDGET(tab->toggle), FALSE, FALSE, 0); gtk_box_reorder_child(GTK_BOX(notebook->hbox), GTK_WIDGET(tab->toggle), position); gtk_widget_show_all((GtkWidget *) notebook->hbox); } /** * ags_notebook_insert_tab_with_label: * @notebook: the #AgsNotebook * @label: the label as string * @position: the position as integer * * Insert a new #AgsNotebookTab-struct to @notebook at @position and set specified @label. * * Since: 3.0.0 */ void ags_notebook_insert_tab_with_label(AgsNotebook *notebook, gchar *label, gint position) { GList *tab; if(!AGS_IS_NOTEBOOK(notebook)){ return; } ags_notebook_insert_tab(notebook, position); tab = g_list_nth(notebook->tab, position); if(tab != NULL){ g_object_set(AGS_NOTEBOOK_TAB(tab->data)->toggle, "label", label, NULL); } } /** * ags_notebook_remove_tab: * @notebook: the #AgsNotebook * @position: the position of the tab * * Remove #AgsNotebookTab at @position. * * Since: 3.0.0 */ void ags_notebook_remove_tab(AgsNotebook *notebook, gint position) { AgsNotebookTab *tab; gint length; if(!AGS_IS_NOTEBOOK(notebook) || notebook->tab == NULL || position < 0){ return; } length = g_list_length(notebook->tab); tab = g_list_nth_data(notebook->tab, length - position - 1); if(tab != NULL){ notebook->tab = g_list_remove(notebook->tab, tab); gtk_widget_destroy(GTK_WIDGET(tab->toggle)); if(notebook->tab_free_func != NULL){ notebook->tab_free_func(tab); } } } /** * ags_notebook_remove_tab_with_data: * @notebook: the #AgsNotebook * @data: the data to lookup * * Remove #AgsNotebookTab assigned with @data. * * Since: 3.0.0 */ void ags_notebook_remove_tab_with_data(AgsNotebook *notebook, gpointer data) { gint position; if(!AGS_IS_NOTEBOOK(notebook)){ return; } position = ags_notebook_tab_index(notebook, data); ags_notebook_remove_tab(notebook, position); } /** * ags_notebook_new: * * Create a new #AgsNotebook. * * Returns: a new #AgsNotebook * * Since: 3.0.0 */ AgsNotebook* ags_notebook_new() { AgsNotebook *notebook; notebook = (AgsNotebook *) g_object_new(AGS_TYPE_NOTEBOOK, NULL); return(notebook); } gsequencer-3.1.3/ags/widget/ags_scrolled_scale_box.c0000644000175000017500000002315113607210263017463 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_scrolled_scale_box_class_init(AgsScrolledScaleBoxClass *scrolled_scale_box); void ags_scrolled_scale_box_init(AgsScrolledScaleBox *scrolled_scale_box); void ags_scrolled_scale_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_scrolled_scale_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_scrolled_scale_box_finalize(GObject *gobject); void ags_scrolled_scale_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_scrolled_scale_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_scrolled_scale_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation); /** * SECTION:ags_scrolled_scale_box * @short_description: scrolled scale box widget * @title: AgsScrolledScaleBox * @section_id: * @include: ags/widget/ags_scrolled_scale_box.h * * The #AgsScrolledScaleBox lets you to have a scrolled scale box widget. */ enum{ PROP_0, PROP_MARGIN_TOP, PROP_MARGIN_BOTTOM, PROP_MARGIN_LEFT, PROP_MARGIN_RIGHT, }; static gpointer ags_scrolled_scale_box_parent_class = NULL; GType ags_scrolled_scale_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scrolled_scale_box = 0; static const GTypeInfo ags_scrolled_scale_box_info = { sizeof (AgsScrolledScaleBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scrolled_scale_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsScrolledScaleBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scrolled_scale_box_init, }; ags_type_scrolled_scale_box = g_type_register_static(GTK_TYPE_BIN, "AgsScrolledScaleBox", &ags_scrolled_scale_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scrolled_scale_box); } return g_define_type_id__volatile; } void ags_scrolled_scale_box_class_init(AgsScrolledScaleBoxClass *scrolled_scale_box) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_scrolled_scale_box_parent_class = g_type_class_peek_parent(scrolled_scale_box); /* GObjectClass */ gobject = (GObjectClass *) scrolled_scale_box; gobject->set_property = ags_scrolled_scale_box_set_property; gobject->get_property = ags_scrolled_scale_box_get_property; gobject->finalize = ags_scrolled_scale_box_finalize; /* properties */ /** * AgsScrolledScaleBox:margin-top: * * The margin top. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-top", "margin top", "The margin top", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_TOP, param_spec); /** * AgsScrolledScaleBox:margin-bottom: * * The margin bottom. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-bottom", "margin bottom", "The margin bottom", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_BOTTOM, param_spec); /** * AgsScrolledScaleBox:margin-left: * * The margin left. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-left", "margin left", "The margin left", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_LEFT, param_spec); /** * AgsScrolledScaleBox:margin-right: * * The margin right. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("margin-right", "margin right", "The margin right", 0, G_MAXUINT32, 0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_RIGHT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) scrolled_scale_box; // widget->get_preferred_width = ags_scrolled_scale_get_preferred_width; // widget->get_preferred_height = ags_scrolled_scale_get_preferred_height; // widget->size_allocate = ags_scrolled_scale_box_size_allocate; } void ags_scrolled_scale_box_init(AgsScrolledScaleBox *scrolled_scale_box) { scrolled_scale_box->margin_top = 0; scrolled_scale_box->margin_bottom = 0; scrolled_scale_box->margin_left = 0; scrolled_scale_box->margin_right = 0; /* viewport */ scrolled_scale_box->viewport = gtk_viewport_new(NULL, NULL); g_object_set(scrolled_scale_box->viewport, "shadow-type", GTK_SHADOW_NONE, NULL); gtk_container_add((GtkContainer *) scrolled_scale_box, (GtkWidget *) scrolled_scale_box->viewport); /* scale box */ scrolled_scale_box->scale_box = NULL; #if 0 scrolled_scale_box->scale_box = ags_vscale_box_new(); gtk_container_add((GtkContainer *) scrolled_scale_box->viewport, (GtkWidget *) scrolled_scale_box->scale_box); #endif } void ags_scrolled_scale_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsScrolledScaleBox *scrolled_scale_box; scrolled_scale_box = AGS_SCROLLED_SCALE_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { scrolled_scale_box->margin_top = g_value_get_uint(value); } break; case PROP_MARGIN_BOTTOM: { scrolled_scale_box->margin_bottom = g_value_get_uint(value); } break; case PROP_MARGIN_LEFT: { scrolled_scale_box->margin_left = g_value_get_uint(value); } break; case PROP_MARGIN_RIGHT: { scrolled_scale_box->margin_right = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_scale_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsScrolledScaleBox *scrolled_scale_box; scrolled_scale_box = AGS_SCROLLED_SCALE_BOX(gobject); switch(prop_id){ case PROP_MARGIN_TOP: { g_value_set_uint(value, scrolled_scale_box->margin_top); } break; case PROP_MARGIN_BOTTOM: { g_value_set_uint(value, scrolled_scale_box->margin_bottom); } break; case PROP_MARGIN_LEFT: { g_value_set_uint(value, scrolled_scale_box->margin_left); } break; case PROP_MARGIN_RIGHT: { g_value_set_uint(value, scrolled_scale_box->margin_right); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scrolled_scale_box_finalize(GObject *gobject) { AgsScrolledScaleBox *scrolled_scale_box; scrolled_scale_box = AGS_SCROLLED_SCALE_BOX(gobject); /* call parent */ G_OBJECT_CLASS(ags_scrolled_scale_box_parent_class)->finalize(gobject); } void ags_scrolled_scale_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { minimal_width[0] = natural_width[0] = AGS_SCALE_DEFAULT_SCALE_WIDTH; } void ags_scrolled_scale_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height = natural_height = NULL; } void ags_scrolled_scale_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsScrolledScaleBox *scrolled_scale_box; GtkAllocation child_allocation; GtkRequisition child_requisition; scrolled_scale_box = AGS_SCROLLED_SCALE_BOX(widget); /* viewport allocation */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_scale_box->viewport, &child_requisition); child_allocation.x = allocation->x; child_allocation.y = allocation->y; child_allocation.width = allocation->width; child_allocation.height = allocation->height; gtk_widget_size_allocate((GtkWidget *) scrolled_scale_box->viewport, &child_allocation); /* box */ gtk_widget_get_child_requisition((GtkWidget *) scrolled_scale_box->scale_box, &child_requisition); child_allocation.x = 0; child_allocation.y = 0; child_allocation.width = allocation->width; child_allocation.height = child_requisition.height; gtk_widget_size_allocate((GtkWidget *) scrolled_scale_box->scale_box, &child_allocation); } /** * ags_scrolled_scale_box_new: * * Create a new instance of #AgsScrolledScaleBox. * * Returns: the new #AgsScrolledScaleBox * * Since: 3.0.0 */ AgsScrolledScaleBox* ags_scrolled_scale_box_new() { AgsScrolledScaleBox *scrolled_scale_box; scrolled_scale_box = (AgsScrolledScaleBox *) g_object_new(AGS_TYPE_SCROLLED_SCALE_BOX, NULL); return(scrolled_scale_box); } gsequencer-3.1.3/ags/widget/ags_scrolled_scale_box.h0000644000175000017500000000423013540163167017473 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCROLLED_SCALE_BOX_H__ #define __AGS_SCROLLED_SCALE_BOX_H__ #include #include #include #include #define AGS_TYPE_SCROLLED_SCALE_BOX (ags_scrolled_scale_box_get_type()) #define AGS_SCROLLED_SCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCROLLED_SCALE_BOX, AgsScrolledScaleBox)) #define AGS_SCROLLED_SCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCROLLED_SCALE_BOX, AgsScrolledScaleBoxClass)) #define AGS_IS_SCROLLED_SCALE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCROLLED_SCALE_BOX)) #define AGS_IS_SCROLLED_SCALE_BOX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCROLLED_SCALE_BOX)) #define AGS_SCROLLED_SCALE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCROLLED_SCALE_BOX, AgsScrolledScaleBoxClass)) typedef struct _AgsScrolledScaleBox AgsScrolledScaleBox; typedef struct _AgsScrolledScaleBoxClass AgsScrolledScaleBoxClass; struct _AgsScrolledScaleBox { GtkBin bin; guint margin_top; guint margin_bottom; guint margin_left; guint margin_right; GtkViewport *viewport; AgsScaleBox *scale_box; }; struct _AgsScrolledScaleBoxClass { GtkBinClass bin; }; GType ags_scrolled_scale_box_get_type(void); AgsScrolledScaleBox* ags_scrolled_scale_box_new(); #endif /*__AGS_SCROLLED_SCALE_BOX_H__*/ gsequencer-3.1.3/ags/widget/ags_expander_set.h0000644000175000017500000000565313540163167016340 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPANDER_SET_H__ #define __AGS_EXPANDER_SET_H__ #include #include #include #define AGS_TYPE_EXPANDER_SET (ags_expander_set_get_type()) #define AGS_EXPANDER_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EXPANDER_SET, AgsExpanderSet)) #define AGS_EXPANDER_SET_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EXPANDER_SET, AgsExpanderSetClass)) #define AGS_IS_EXPANDER_SET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EXPANDER_SET)) #define AGS_IS_EXPANDER_SET_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EXPANDER_SET)) #define AGS_EXPANDER_SET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EXPANDER_SET, AgsExpanderSetClass)) #define AGS_EXPANDER_SET_CHILD(ptr) ((AgsExpanderSetChild *)(ptr)) typedef struct _AgsExpanderSet AgsExpanderSet; typedef struct _AgsExpanderSetClass AgsExpanderSetClass; typedef struct _AgsExpanderSetChild AgsExpanderSetChild; typedef enum{ AGS_EXPANDER_SET_DRAW_GHOST = 1, AGS_EXPANDER_SET_DRAW_LEFT_ENDING = 1 << 1, AGS_EXPANDER_SET_DRAW_RIGHT_ENDING = 1 << 2, AGS_EXPANDER_SET_DRAW_LEFT_CONNECTOR = 1 << 3, AGS_EXPANDER_SET_DRAW_RIGHT_CONNECTOR = 1 << 4, }AgsExpanderSetFlags; struct _AgsExpanderSet { GtkTable table; guint flags; GList *ghost; GList *location; }; struct _AgsExpanderSetClass { GtkTableClass table; }; struct _AgsExpanderSetChild { GtkWidget *child; guint x; guint y; guint width; guint height; }; GType ags_expander_set_get_type(void); AgsExpanderSetChild* ags_expander_set_child_alloc(guint x, guint y, guint width, guint height); AgsExpanderSetChild* ags_expander_set_child_find(AgsExpanderSet *expander_set, GtkWidget *child); void ags_expander_set_set_flags(AgsExpanderSet *expander_set, guint flags); void ags_expander_set_add(AgsExpanderSet *expander_set, GtkWidget *widget, guint x, guint y, guint width, guint height); void ags_expander_set_remove(AgsExpanderSet *expander_set, GtkWidget *widget); AgsExpanderSet* ags_expander_set_new(guint width, guint height); #endif /*__AGS_EXPANDER_SET_H__*/ gsequencer-3.1.3/ags/widget/ags_widget_marshal.c0000644000175000017500000001176613605312647016647 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ /* This file is generated by glib-genmarshal, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ #include #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_schar (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #define g_marshal_value_peek_variant(v) g_value_get_variant (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_long #define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* VOID:STRING,INT (ags/widget/ags_widget_marshallers.list:1) */ void ags_widget_cclosure_marshal_VOID__STRING_INT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_INT) (gpointer data1, gpointer arg1, gint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_INT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_INT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_int (param_values + 2), data2); } gsequencer-3.1.3/ags/widget/ags_cartesian.h0000644000175000017500000001643213540163167015625 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CARTESIAN_H__ #define __AGS_CARTESIAN_H__ #include #include #include #include #define AGS_TYPE_CARTESIAN (ags_cartesian_get_type()) #define AGS_CARTESIAN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CARTESIAN, AgsCartesian)) #define AGS_CARTESIAN_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CARTESIAN, AgsCartesianClass)) #define AGS_IS_CARTESIAN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CARTESIAN)) #define AGS_IS_CARTESIAN_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CARTESIAN)) #define AGS_CARTESIAN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CARTESIAN, AgsCartesianClass)) #define AGS_PLOT(ptr) ((AgsPlot *)(ptr)) #define AGS_CARTESIAN_STEP_CONVERSION_FUNC(current, is_abscissae, data) ((AgsCartesianStepConversionFunc)(current, is_abscissae, data)) #define AGS_CARTESIAN_TRANSLATE_FUNCT(x, y, ret_x, ret_y, data) ((AgsCartesianTranslateFunc)(x, y, ret_x, ret_y, data)) #define AGS_CARTESIAN_SCALE_FUNC(value, data) ((AgsCartesianScaleFunc)(value, data)) #define AGS_CARTESIAN_LABEL_FUNC(value, data) ((AgsCartesianLabelFunc)(value, data)) #define AGS_CARTESIAN_DEFAULT_X_MARGIN (24.0) #define AGS_CARTESIAN_DEFAULT_Y_MARGIN (24.0) #define AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH (10.0) #define AGS_CARTESIAN_DEFAULT_Y_STEP_HEIGHT (10.0) #define AGS_CARTESIAN_DEFAULT_X_SCALE_STEP_WIDTH (10.0) #define AGS_CARTESIAN_DEFAULT_Y_SCALE_STEP_HEIGHT (10.0) #define AGS_CARTESIAN_DEFAULT_X_STEP (1.0) #define AGS_CARTESIAN_DEFAULT_Y_STEP (1.0) #define AGS_CARTESIAN_DEFAULT_X_START (-60.0) #define AGS_CARTESIAN_DEFAULT_X_END (199.0) #define AGS_CARTESIAN_DEFAULT_Y_START (-70.0) #define AGS_CARTESIAN_DEFAULT_Y_END (99.0) #define AGS_CARTESIAN_DEFAULT_X_LABEL_START (10.0) #define AGS_CARTESIAN_DEFAULT_X_LABEL_STEP_WIDTH (50.0) #define AGS_CARTESIAN_DEFAULT_Y_LABEL_START (20.0) #define AGS_CARTESIAN_DEFAULT_Y_LABEL_STEP_HEIGHT (50.0) typedef struct _AgsCartesian AgsCartesian; typedef struct _AgsCartesianClass AgsCartesianClass; typedef struct _AgsPlot AgsPlot; typedef gdouble (*AgsCartesianStepConversionFunc)(gdouble current, gboolean is_abscissae, gpointer data); typedef void (*AgsCartesianTranslateFunc)(gdouble x, gdouble y, gdouble *ret_x, gdouble *ret_y, gpointer data); typedef gdouble (*AgsCartesianScaleFunc)(gdouble value, gpointer data); typedef gchar* (*AgsCartesianLabelFunc)(gdouble value, gpointer data); typedef enum{ AGS_CARTESIAN_ABSCISSAE = 1, AGS_CARTESIAN_ORDINATE = 1 << 1, AGS_CARTESIAN_X_SCALE = 1 << 2, AGS_CARTESIAN_Y_SCALE = 1 << 3, AGS_CARTESIAN_X_UNIT = 1 << 4, AGS_CARTESIAN_Y_UNIT = 1 << 5, AGS_CARTESIAN_X_LABEL = 1 << 6, AGS_CARTESIAN_Y_LABEL = 1 << 7, }AgsCartesianFlags; typedef enum{ AGS_PLOT_FILL_REPLACE = 1, //TODO:JK: implement me AGS_PLOT_FILL_ADDITIVE = 1 << 1, }AgsPlotFillFlags; struct _AgsCartesian { GtkWidget widget; guint flags; gdouble x_margin; gdouble y_margin; gdouble center; gdouble line_width; gdouble point_radius; gdouble font_size; gdouble x_step_width; gdouble y_step_height; gdouble x_scale_step_width; gdouble y_scale_step_height; gdouble x_step; gdouble y_step; gdouble x_start; gdouble x_end; gdouble y_start; gdouble y_end; gdouble x_unit_x0; gdouble x_unit_y0; gdouble x_unit_size; gchar *x_unit; gdouble y_unit_x0; gdouble y_unit_y0; gdouble y_unit_size; gchar *y_unit; gdouble x_label_start; gdouble x_label_step_width; gchar **x_label; gdouble y_label_start; gdouble y_label_step_height; gchar **y_label; gdouble (*step_conversion_func)(gdouble current, gboolean is_abscissae, gpointer data); void (*translate_func)(gdouble x, gdouble y, gdouble *ret_x, gdouble *ret_y, gpointer data); gdouble (*x_small_scale_func)(gdouble value, gpointer data); gdouble (*x_big_scale_func)(gdouble value, gpointer data); gdouble (*y_small_scale_func)(gdouble value, gpointer data); gdouble (*y_big_scale_func)(gdouble value, gpointer data); gchar* (*x_label_func)(gdouble value, gpointer data); gchar* (*y_label_func)(gdouble value, gpointer data); gpointer x_step_data; gdouble x_step_factor; gpointer y_step_data; gdouble y_step_factor; gpointer translate_data; gdouble x_translate_point; gdouble y_translate_point; gpointer x_scale_data; gdouble x_small_scale_factor; gdouble x_big_scale_factor; gpointer y_scale_data; gdouble y_small_scale_factor; gdouble y_big_scale_factor; gpointer x_label_data; gdouble x_label_factor; gdouble x_label_precision; gpointer y_label_data; gdouble y_label_factor; gdouble y_label_precision; cairo_surface_t *surface; GList *plot; }; struct _AgsCartesianClass { GtkWidgetClass widget; }; struct _AgsPlot { guint fill_flags; guint n_points; gboolean join_points; gdouble **point; gdouble **point_color; gchar **point_label; guint n_bitmaps; unsigned char **bitmap; gdouble **bitmap_color; guint n_pixmaps; gdouble ***pixmap; }; GType ags_cartesian_get_type(void); /* plot data */ AgsPlot* ags_plot_alloc(guint n_points, guint n_bitmaps, guint n_pixmaps); void ags_plot_free(AgsPlot *plot); void ags_cartesian_add_plot(AgsCartesian *cartesian, AgsPlot *plot); void ags_cartesian_remove_plot(AgsCartesian *cartesian, AgsPlot *plot); /* predefined linear system */ gdouble ags_cartesian_linear_step_conversion_func(gdouble current, gboolean is_abscissae, gpointer data); void ags_cartesian_linear_translate_func(gdouble x, gdouble y, gdouble *ret_x, gdouble *ret_y, gpointer data); gdouble ags_cartesian_linear_x_small_scale_func(gdouble value, gpointer data); gdouble ags_cartesian_linear_x_big_scale_func(gdouble value, gpointer data); gdouble ags_cartesian_linear_y_small_scale_func(gdouble value, gpointer data); gdouble ags_cartesian_linear_y_big_scale_func(gdouble value, gpointer data); gchar* ags_cartesian_linear_x_label_func(gdouble value, gpointer data); gchar* ags_cartesian_linear_y_label_func(gdouble value, gpointer data); /* label functions */ void ags_cartesian_reallocate_label(AgsCartesian *cartesian, gboolean do_x_label); void ags_cartesian_fill_label(AgsCartesian *cartesian, gboolean do_x_label); AgsCartesian* ags_cartesian_new(); #endif /*__AGS_CARTESIAN_H__*/ gsequencer-3.1.3/ags/widget/ags_container.h0000644000175000017500000000174613540163167015640 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONTAINER_H__ #define __AGS_CONTAINER_H__ #include #include #include void ags_container_add_all(GtkContainer *container, GList *list); #endif /*__AGS_CONTAINER_H__*/ gsequencer-3.1.3/ags/widget/ags_level_box.c0000644000175000017500000001345113607210263015616 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_level_box_class_init(AgsLevelBoxClass *level_box); void ags_level_box_init(AgsLevelBox *level_box); void ags_level_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_level_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_level_box_finalize(GObject *gobject); GType ags_level_box_child_type(GtkContainer *container); /** * SECTION:ags_level_box * @short_description: abstract box widget * @title: AgsLevelBox * @section_id: * @include: ags/widget/ags_level_box.h * * The #AgsLevelBox is an abstract box widget containing #AgsLevel. */ enum{ PROP_0, PROP_FIXED_LEVEL_WIDTH, PROP_FIXED_LEVEL_HEIGHT, }; static gpointer ags_level_box_parent_class = NULL; GType ags_level_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_level_box = 0; static const GTypeInfo ags_level_box_info = { sizeof (AgsLevelBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_level_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLevelBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_level_box_init, }; ags_type_level_box = g_type_register_static(GTK_TYPE_BOX, "AgsLevelBox", &ags_level_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_level_box); } return g_define_type_id__volatile; } void ags_level_box_class_init(AgsLevelBoxClass *level_box) { GObjectClass *gobject; GtkWidgetClass *widget; GtkContainerClass *container; GParamSpec *param_spec; ags_level_box_parent_class = g_type_class_peek_parent(level_box); /* GObjectClass */ gobject = (GObjectClass *) level_box; gobject->set_property = ags_level_box_set_property; gobject->get_property = ags_level_box_get_property; gobject->finalize = ags_level_box_finalize; /* properties */ /** * AgsLevelBox:fixed-level-width: * * The fixed width of a level. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fixed-level-width", "fixed level width", "The fixed width of a level", 0, G_MAXUINT, AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_LEVEL_WIDTH, param_spec); /** * AgsLevelBox:fixed-level-height: * * The fixed height of a level. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("fixed-level-height", "fixed level height", "The fixed height of a level", 0, G_MAXUINT, AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FIXED_LEVEL_HEIGHT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) level_box; /* GtkContainerClass */ container = (GtkWidgetClass *) level_box; container->child_type = ags_level_box_child_type; } void ags_level_box_init(AgsLevelBox *level_box) { g_object_set(level_box, "homogeneous", FALSE, "spacing", 0, NULL); level_box->flags = 0; level_box->fixed_level_width = AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH; level_box->fixed_level_height = AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT; } void ags_level_box_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLevelBox *level_box; level_box = AGS_LEVEL_BOX(gobject); switch(prop_id){ case PROP_FIXED_LEVEL_WIDTH: { level_box->fixed_level_width = g_value_get_uint(value); } break; case PROP_FIXED_LEVEL_HEIGHT: { level_box->fixed_level_height = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_level_box_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLevelBox *level_box; level_box = AGS_LEVEL_BOX(gobject); switch(prop_id){ case PROP_FIXED_LEVEL_WIDTH: { g_value_set_uint(value, level_box->fixed_level_width); } break; case PROP_FIXED_LEVEL_HEIGHT: { g_value_set_uint(value, level_box->fixed_level_height); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_level_box_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_level_box_parent_class)->finalize(gobject); } GType ags_level_box_child_type(GtkContainer *container) { return(AGS_TYPE_LEVEL); } /** * ags_level_box_new: * * Create a new instance of #AgsLevelBox. * * Returns: the new #AgsLevelBox instance * * Since: 3.0.0 */ AgsLevelBox* ags_level_box_new() { AgsLevelBox *level_box; level_box = (AgsLevelBox *) g_object_new(AGS_TYPE_LEVEL_BOX, NULL); return(level_box); } gsequencer-3.1.3/ags/widget/ags_expander.h0000644000175000017500000000477413540163167015470 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_EXPANDER_H__ #define __AGS_EXPANDER_H__ #include #include #include #define AGS_TYPE_EXPANDER (ags_expander_get_type()) #define AGS_EXPANDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EXPANDER, AgsExpander)) #define AGS_EXPANDER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EXPANDER, AgsExpanderClass)) #define AGS_IS_EXPANDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_EXPANDER)) #define AGS_IS_EXPANDER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_EXPANDER)) #define AGS_EXPANDER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_EXPANDER, AgsExpanderClass)) #define AGS_EXPANDER_CHILD(ptr) ((AgsExpanderChild *)(ptr)) typedef struct _AgsExpander AgsExpander; typedef struct _AgsExpanderClass AgsExpanderClass; typedef struct _AgsExpanderChild AgsExpanderChild; typedef enum{ AGS_EXPANDER_DRAW_BORDER = 1, }AgsExpanderFlags; struct _AgsExpander { GtkExpander expander; guint flags; GtkTable *table; GList *children; }; struct _AgsExpanderClass { GtkExpanderClass expander; }; struct _AgsExpanderChild { GtkWidget *child; guint x; guint y; guint width; guint height; }; GType ags_expander_get_type(void); AgsExpanderChild* ags_expander_child_alloc(guint x, guint y, guint width, guint height); AgsExpanderChild* ags_expander_child_find(AgsExpander *expander, GtkWidget *child); void ags_expander_add(AgsExpander *expander, GtkWidget *widget, guint x, guint y, guint width, guint height); void ags_expander_remove(AgsExpander *expander, GtkWidget *widget); AgsExpander* ags_expander_new(guint width, guint height); #endif /*__AGS_EXPANDER_H__*/ gsequencer-3.1.3/ags/widget/ags_scale.c0000644000175000017500000007735313607210263014741 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #ifndef __APPLE__ #include #endif #include #include #include static GType ags_accessible_scale_get_type(void); void ags_scale_class_init(AgsScaleClass *scale); void ags_scale_init(AgsScale *scale); void ags_accessible_scale_class_init(AtkObject *object); void ags_accessible_scale_value_interface_init(AtkValueIface *value); void ags_accessible_scale_action_interface_init(AtkActionIface *action); void ags_scale_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_scale_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_scale_finalize(GObject *gobject); AtkObject* ags_scale_get_accessible(GtkWidget *widget); void ags_scale_show(GtkWidget *widget); void ags_accessible_scale_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text); #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_scale_get_range(AtkValue *value); #endif gdouble ags_accessible_scale_get_increment(AtkValue *value); void ags_accessible_scale_set_value(AtkValue *value, gdouble new_value); gboolean ags_accessible_scale_do_action(AtkAction *action, gint i); gint ags_accessible_scale_get_n_actions(AtkAction *action); const gchar* ags_accessible_scale_get_description(AtkAction *action, gint i); const gchar* ags_accessible_scale_get_name(AtkAction *action, gint i); const gchar* ags_accessible_scale_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_scale_set_description(AtkAction *action, gint i); gchar* ags_accessible_scale_get_localized_name(AtkAction *action, gint i); void ags_scale_map(GtkWidget *widget); void ags_scale_realize(GtkWidget *widget); void ags_scale_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_scale_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_scale_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); gboolean ags_scale_button_press(GtkWidget *widget, GdkEventButton *event); gboolean ags_scale_button_release(GtkWidget *widget, GdkEventButton *event); gboolean ags_scale_key_press(GtkWidget *widget, GdkEventKey *event); gboolean ags_scale_key_release(GtkWidget *widget, GdkEventKey *event); gboolean ags_scale_motion_notify(GtkWidget *widget, GdkEventMotion *event); void ags_scale_send_configure(AgsScale *scale); void ags_scale_draw(AgsScale *scale, cairo_t *cr); /** * SECTION:ags_scale * @short_description: A scale widget * @title: AgsScale * @section_id: * @include: ags/widget/ags_scale.h * * #AgsScale is a widget that shows you a meter. */ enum{ VALUE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, PROP_SCALE_WIDTH, PROP_SCALE_HEIGHT, PROP_CONTROL_NAME, PROP_LOWER, PROP_UPPER, PROP_DEFAULT_VALUE, }; static gpointer ags_scale_parent_class = NULL; static guint scale_signals[LAST_SIGNAL]; static GQuark quark_accessible_object = 0; GType ags_scale_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_scale = 0; static const GTypeInfo ags_scale_info = { sizeof(AgsScaleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_scale_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsScale), 0, /* n_preallocs */ (GInstanceInitFunc) ags_scale_init, }; ags_type_scale = g_type_register_static(GTK_TYPE_WIDGET, "AgsScale", &ags_scale_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_scale); } return g_define_type_id__volatile; } static GType ags_accessible_scale_get_type(void) { static GType ags_type_accessible_scale = 0; if(!ags_type_accessible_scale){ const GTypeInfo ags_accesssible_scale_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_scale_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_value_interface_info = { (GInterfaceInitFunc) ags_accessible_scale_value_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_scale_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_scale = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleScale", &ags_accesssible_scale_info, 0); g_type_add_interface_static(ags_type_accessible_scale, ATK_TYPE_VALUE, &atk_value_interface_info); g_type_add_interface_static(ags_type_accessible_scale, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_scale); } void ags_scale_class_init(AgsScaleClass *scale) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_scale_parent_class = g_type_class_peek_parent(scale); quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); /* GObjectClass */ gobject = (GObjectClass *) scale; gobject->set_property = ags_scale_set_property; gobject->get_property = ags_scale_get_property; gobject->finalize = ags_scale_finalize; /* properties */ /** * AgsScale:scale-width: * * The scale width to use for drawing a scale. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("scale-width", "scale width", "The scale width to use for drawing", 0, G_MAXUINT, AGS_SCALE_DEFAULT_SCALE_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_WIDTH, param_spec); /** * AgsScale:scale-height: * * The scale height to use for drawing a scale. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("scale-height", "scale height", "The scale height to use for drawing", 0, G_MAXUINT, AGS_SCALE_DEFAULT_SCALE_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_HEIGHT, param_spec); /** * AgsScale:control-name: * * The scale's control name. * * Since: 3.0.0 */ param_spec = g_param_spec_string("control-name", "control name", "The control name of scale", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROL_NAME, param_spec); /** * AgsScale:lower: * * The scale's lower range. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lower", "lower", "The lower of scale", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_SCALE_DEFAULT_LOWER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER, param_spec); /** * AgsScale:upper: * * The scale's upper range. * * Since: 3.0.0 */ param_spec = g_param_spec_double("upper", "upper", "The upper of scale", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_SCALE_DEFAULT_UPPER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER, param_spec); /** * AgsScale:default-value: * * The scale's default value. * * Since: 3.0.0 */ param_spec = g_param_spec_double("default-value", "default value", "The default value of scale", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_SCALE_DEFAULT_VALUE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DEFAULT_VALUE, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) scale; widget->get_accessible = ags_scale_get_accessible; // widget->map = ags_scale_map; widget->realize = ags_scale_realize; widget->size_allocate = ags_scale_size_allocate; widget->get_preferred_width = ags_scale_get_preferred_width; widget->get_preferred_height = ags_scale_get_preferred_height; widget->button_press_event = ags_scale_button_press; widget->button_release_event = ags_scale_button_release; widget->key_press_event = ags_scale_key_press; widget->key_release_event = ags_scale_key_release; widget->motion_notify_event = ags_scale_motion_notify; widget->draw = ags_scale_draw; widget->show = ags_scale_show; /* AgsScaleClass */ scale->value_changed = NULL; /* signals */ /** * AgsScale::value-changed: * @scale: the #AgsScale * @default_value: the changed default value * * The ::value-changed signal notifies about modified default value. * * Since: 3.0.0 */ scale_signals[VALUE_CHANGED] = g_signal_new("value-changed", G_TYPE_FROM_CLASS(scale), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsScaleClass, value_changed), NULL, NULL, g_cclosure_marshal_VOID__DOUBLE, G_TYPE_NONE, 1, G_TYPE_DOUBLE); } void ags_accessible_scale_class_init(AtkObject *object) { /* empty */ } void ags_accessible_scale_value_interface_init(AtkValueIface *value) { value->get_current_value = NULL; value->get_maximum_value = NULL; value->get_minimum_value = NULL; value->set_current_value = NULL; value->get_minimum_increment = NULL; #ifdef HAVE_ATK_2_12 value->get_value_and_text = ags_accessible_scale_get_value_and_text; value->get_range = ags_accessible_scale_get_range; value->get_increment = ags_accessible_scale_get_increment; value->get_sub_ranges = NULL; value->set_value = ags_accessible_scale_set_value; #endif } void ags_accessible_scale_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_scale_do_action; action->get_n_actions = ags_accessible_scale_get_n_actions; action->get_description = ags_accessible_scale_get_description; action->get_name = ags_accessible_scale_get_name; action->get_keybinding = ags_accessible_scale_get_keybinding; action->set_description = ags_accessible_scale_set_description; action->get_localized_name = ags_accessible_scale_get_localized_name; } void ags_scale_init(AgsScale *scale) { AtkObject *accessible; g_object_set(G_OBJECT(scale), "app-paintable", TRUE, "can-focus", TRUE, NULL); accessible = gtk_widget_get_accessible((GtkWidget *) scale); g_object_set(accessible, "accessible-name", "scale", "accessible-description", "Specify a default value", NULL); scale->flags = 0; scale->key_mask = 0; scale->button_state = 0; scale->layout = AGS_SCALE_LAYOUT_VERTICAL; scale->font_size = 11; scale->scale_width = AGS_SCALE_DEFAULT_SCALE_WIDTH; scale->scale_height = AGS_SCALE_DEFAULT_SCALE_HEIGHT; scale->control_name = NULL; scale->lower = AGS_SCALE_DEFAULT_LOWER; scale->upper = AGS_SCALE_DEFAULT_UPPER; scale->default_value = AGS_SCALE_DEFAULT_VALUE; scale->step_count = AGS_SCALE_DEFAULT_STEP_COUNT; scale->page_size = AGS_SCALE_DEFAULT_PAGE_SIZE; scale->scale_step_count = -1; scale->scale_point = NULL; scale->scale_value = NULL; } void ags_scale_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsScale *scale; scale = AGS_SCALE(gobject); switch(prop_id){ case PROP_SCALE_WIDTH: { scale->scale_width = g_value_get_uint(value); } break; case PROP_SCALE_HEIGHT: { scale->scale_height = g_value_get_uint(value); } break; case PROP_CONTROL_NAME: { gchar *control_name; control_name = g_value_get_string(value); g_free(scale->control_name); scale->control_name = g_strdup(control_name); } break; case PROP_LOWER: { scale->lower = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) scale); } break; case PROP_UPPER: { scale->upper = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) scale); } break; case PROP_DEFAULT_VALUE: { scale->default_value = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) scale); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scale_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsScale *scale; scale = AGS_SCALE(gobject); switch(prop_id){ case PROP_SCALE_WIDTH: { g_value_set_uint(value, scale->scale_width); } break; case PROP_SCALE_HEIGHT: { g_value_set_uint(value, scale->scale_height); } break; case PROP_CONTROL_NAME: { g_value_set_string(value, scale->control_name); } break; case PROP_LOWER: { g_value_set_double(value, scale->lower); } break; case PROP_UPPER: { g_value_set_double(value, scale->upper); } break; case PROP_DEFAULT_VALUE: { g_value_set_double(value, scale->default_value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_scale_finalize(GObject *gobject) { AgsScale *scale; scale = AGS_SCALE(gobject); g_free(scale->control_name); /* call parent */ G_OBJECT_CLASS(ags_scale_parent_class)->finalize(gobject); } void ags_accessible_scale_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text) { AgsScale *scale; scale = (AgsScale *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); if(current_value != NULL){ *current_value = scale->default_value; } if(text != NULL){ *text = g_strdup_printf("%f", scale->default_value); } } #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_scale_get_range(AtkValue *value) { AgsScale *scale; AtkRange *range; scale = (AgsScale *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); range = atk_range_new(scale->lower, scale->upper, "Valid lower and upper input range of this scale"); return(range); } #endif gdouble ags_accessible_scale_get_increment(AtkValue *value) { AgsScale *scale; scale = (AgsScale *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); return((scale->upper - scale->lower) / scale->step_count); } void ags_accessible_scale_set_value(AtkValue *value, gdouble new_value) { AgsScale *scale; scale = (AgsScale *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); scale->default_value = new_value; gtk_widget_queue_draw((GtkWidget *) scale); } gboolean ags_accessible_scale_do_action(AtkAction *action, gint i) { AgsScale *scale; GdkEventKey *key_press, *key_release; if(!(i >= 0 && i < 4)){ return(FALSE); } scale = (AgsScale *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = gdk_event_new(GDK_KEY_PRESS); key_release = gdk_event_new(GDK_KEY_RELEASE); switch(i){ case AGS_SCALE_STEP_UP: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_release); } break; case AGS_SCALE_STEP_DOWN: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_release); } break; case AGS_SCALE_PAGE_UP: { key_press->keyval = key_release->keyval = GDK_KEY_Page_Up; /* send event */ gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_release); } break; case AGS_SCALE_PAGE_DOWN: { key_press->keyval = key_release->keyval = GDK_KEY_Page_Down; /* send event */ gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) scale, (GdkEvent *) key_release); } break; } return(TRUE); } gint ags_accessible_scale_get_n_actions(AtkAction *action) { return(4); } const gchar* ags_accessible_scale_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "step up scale default value", "step down scale default value", "page up scale default value", "page down scale default value", }; if(i >= 0 && i < 4){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_scale_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "step-up", "step-down", "page-up", "page-down", }; if(i >= 0 && i < 4){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_scale_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "up", "down", "page-up", "page-down", }; if(i >= 0 && i < 4){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_scale_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_scale_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_scale_map(GtkWidget *widget) { if(gtk_widget_get_realized (widget) && !gtk_widget_get_mapped(widget)){ GTK_WIDGET_CLASS(ags_scale_parent_class)->map(widget); gdk_window_show(gtk_widget_get_window(widget)); } } void ags_scale_realize(GtkWidget *widget) { AgsScale *scale; GtkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_SCALE(widget)); scale = AGS_SCALE(widget); gtk_widget_set_realized(widget, TRUE); gtk_widget_get_allocation(widget, &allocation); /* */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = scale->scale_width; attributes.height = scale->scale_height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK); window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); ags_scale_send_configure(scale); } void ags_scale_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsScale *scale; GdkWindow *window; g_return_if_fail(AGS_IS_SCALE(widget)); g_return_if_fail(allocation != NULL); scale = AGS_SCALE(widget); if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ allocation->width = scale->scale_width; allocation->height = scale->scale_height; }else if(scale->layout == AGS_SCALE_LAYOUT_HORIZONTAL){ allocation->width = scale->scale_height; allocation->height = scale->scale_width; } gtk_widget_set_allocation(widget, allocation); if(gtk_widget_get_realized(widget)){ gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); ags_scale_send_configure(scale); } } void ags_scale_send_configure(AgsScale *scale) { GtkAllocation allocation; GtkWidget *widget; GdkEvent *event = gdk_event_new (GDK_CONFIGURE); widget = GTK_WIDGET(scale); gtk_widget_get_allocation(widget, &allocation); event->configure.window = g_object_ref(gtk_widget_get_window (widget)); event->configure.send_event = TRUE; event->configure.x = allocation.x; event->configure.y = allocation.y; event->configure.width = allocation.width; event->configure.height = allocation.height; gtk_widget_event(widget, event); gdk_event_free(event); } void ags_scale_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsScale *scale; scale = AGS_SCALE(widget); if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ minimal_width[0] = natural_width[0] = scale->scale_width; }else if(scale->layout == AGS_SCALE_LAYOUT_HORIZONTAL){ minimal_width[0] = natural_width[0] = scale->scale_height; } } void ags_scale_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsScale *scale; scale = AGS_SCALE(widget); if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ minimal_height[0] = natural_height[0] = scale->scale_height; }else if(scale->layout == AGS_SCALE_LAYOUT_HORIZONTAL){ minimal_height[0] = natural_height[0] = scale->scale_width; } } AtkObject* ags_scale_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_scale_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_scale_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_scale_parent_class)->show(widget); } gboolean ags_scale_button_press(GtkWidget *widget, GdkEventButton *event) { AgsScale *scale; GtkAllocation allocation; guint width, height; guint x_start, y_start; scale = AGS_SCALE(widget); gtk_widget_get_allocation(widget, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; if(event->x >= x_start && event->x < width && event->y >= y_start && event->y < height){ if(event->button == 1){ gdouble c_range; gdouble default_value; scale->button_state |= AGS_SCALE_BUTTON_1_PRESSED; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } default_value = 0.0; if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ default_value = event->y / c_range; }else if(scale->layout == AGS_SCALE_LAYOUT_HORIZONTAL){ default_value = event->x / c_range; } scale->default_value = default_value; gtk_widget_queue_draw((GtkWidget *) scale); ags_scale_value_changed(scale, default_value); } } return(FALSE); } gboolean ags_scale_button_release(GtkWidget *widget, GdkEventButton *event) { AgsScale *scale; gtk_widget_grab_focus(widget); scale = AGS_SCALE(widget); if(event->button == 1){ if((AGS_SCALE_BUTTON_1_PRESSED & (scale->button_state)) != 0){ gdouble c_range; gdouble default_value; scale->button_state |= AGS_SCALE_BUTTON_1_PRESSED; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } default_value = 0.0; if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ default_value = event->y / c_range; }else if(scale->layout == AGS_SCALE_LAYOUT_HORIZONTAL){ default_value = event->x / c_range; } scale->default_value = default_value; gtk_widget_queue_draw((GtkWidget *) scale); ags_scale_value_changed(scale, default_value); } scale->button_state &= (~AGS_SCALE_BUTTON_1_PRESSED); } return(FALSE); } gboolean ags_scale_key_press(GtkWidget *widget, GdkEventKey *event) { if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_scale_parent_class)->key_press_event(widget, event)); } return(TRUE); } gboolean ags_scale_key_release(GtkWidget *widget, GdkEventKey *event) { AgsScale *scale; //TODO:JK: implement me if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_scale_parent_class)->key_release_event(widget, event)); } scale = AGS_SCALE(widget); switch(event->keyval){ case GDK_KEY_Up: case GDK_KEY_uparrow: { gdouble c_range; gdouble step; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } step = c_range / scale->step_count; if(scale->default_value + log(step) > scale->upper){ scale->default_value = scale->upper; }else{ scale->default_value += log(step); } gtk_widget_queue_draw(widget); ags_scale_value_changed(scale, scale->default_value); } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { gdouble c_range; gdouble step; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } step = c_range / scale->step_count; if(scale->default_value - log(step) < scale->lower){ scale->default_value = scale->lower; }else{ scale->default_value -= log(step); } gtk_widget_queue_draw(widget); ags_scale_value_changed(scale, scale->default_value); } break; case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up: { gdouble c_range; gdouble page; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } page = scale->page_size * (c_range / scale->step_count); if(scale->default_value + log(page) > scale->upper){ scale->default_value = scale->upper; }else{ scale->default_value += log(page); } gtk_widget_queue_draw(widget); ags_scale_value_changed(scale, scale->default_value); } break; case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down: { gdouble c_range; gdouble page; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } page = scale->page_size * (c_range / scale->step_count); if(scale->default_value - log(page) < scale->lower){ scale->default_value = scale->lower; }else{ scale->default_value -= log(page); } gtk_widget_queue_draw(widget); ags_scale_value_changed(scale, scale->default_value); } break; } return(TRUE); } gboolean ags_scale_motion_notify(GtkWidget *widget, GdkEventMotion *event) { AgsScale *scale; GtkAllocation allocation; guint width, height; guint x_start, y_start; scale = AGS_SCALE(widget); gtk_widget_get_allocation(widget, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; if((AGS_SCALE_BUTTON_1_PRESSED & (scale->button_state)) != 0){ gdouble c_range; gdouble new_default_value; scale->button_state |= AGS_SCALE_BUTTON_1_PRESSED; if((AGS_SCALE_LOGARITHMIC & (scale->flags)) != 0){ c_range = exp(scale->upper) - exp(scale->lower); }else{ c_range = scale->upper - scale->lower; } new_default_value = 0.0; if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ new_default_value = event->y / c_range; }else if(scale->layout == AGS_SCALE_LAYOUT_HORIZONTAL){ new_default_value = event->x / c_range; } if(new_default_value != scale->default_value){ scale->default_value = new_default_value; gtk_widget_queue_draw((GtkWidget *) scale); ags_scale_value_changed(scale, new_default_value); } } return(FALSE); } void ags_scale_draw(AgsScale *scale, cairo_t *cr) { PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; GtkAllocation allocation; gchar *font_name; guint width, height; guint x_start, y_start; g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); gtk_widget_get_allocation(scale, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* background */ cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_rectangle(cr, (gdouble) x_start, (gdouble) y_start, (gdouble) width, (gdouble) height); cairo_fill(cr); /* box */ cairo_set_source_rgb(cr, 0.5, 0.4, 0.0); cairo_set_line_width(cr, 1.0); cairo_rectangle(cr, (gdouble) x_start, (gdouble) y_start, (gdouble) width, (gdouble) height); cairo_stroke(cr); /* draw scale */ //TODO:JK: implement me /* show control name */ layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, scale->control_name, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, scale->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); if(scale->layout == AGS_SCALE_LAYOUT_VERTICAL){ cairo_move_to(cr, x_start + scale->font_size, y_start + height - 1.0); cairo_rotate(cr, 2 * M_PI * 0.75); }else{ cairo_move_to(cr, x_start + scale->font_size, y_start + 1.0); } pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(font_name); cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_scale_value_changed: * @scale: the #AgsScale * @default_value: the default value * * Emits ::value-changed event. * * Since: 3.0.0 */ void ags_scale_value_changed(AgsScale *scale, gdouble default_value) { g_return_if_fail(AGS_IS_SCALE(scale)); g_object_ref((GObject *) scale); g_signal_emit(G_OBJECT(scale), scale_signals[VALUE_CHANGED], 0, default_value); g_object_unref((GObject *) scale); } /** * ags_scale_new: * * Create a new instance of #AgsScale. * * Returns: the new #AgsScale instance * * Since: 3.0.0 */ AgsScale* ags_scale_new() { AgsScale *scale; scale = (AgsScale *) g_object_new(AGS_TYPE_SCALE, NULL); return(scale); } gsequencer-3.1.3/ags/widget/ags_vindicator.h0000644000175000017500000000367113540163167016017 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_VINDICATOR_H__ #define __AGS_VINDICATOR_H__ #include #include #include #include "ags_indicator.h" #define AGS_TYPE_VINDICATOR (ags_vindicator_get_type()) #define AGS_VINDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_VINDICATOR, AgsVIndicator)) #define AGS_VINDICATOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_VINDICATOR, AgsVIndicatorClass)) #define AGS_IS_VINDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_VINDICATOR)) #define AGS_IS_VINDICATOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_VINDICATOR)) #define AGS_VINDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_VINDICATOR, AgsVIndicatorClass)) #define AGS_VINDICATOR_DEFAULT_SEGMENT_WIDTH (16) #define AGS_VINDICATOR_DEFAULT_SEGMENT_HEIGHT (7) typedef struct _AgsVIndicator AgsVIndicator; typedef struct _AgsVIndicatorClass AgsVIndicatorClass; struct _AgsVIndicator { AgsIndicator indicator; }; struct _AgsVIndicatorClass { AgsIndicatorClass indicator; }; GType ags_vindicator_get_type(void); AgsVIndicator* ags_vindicator_new(); #endif /*__AGS_VINDICATOR_H__*/ gsequencer-3.1.3/ags/widget/ags_led_array.h0000644000175000017500000000435313607210263015607 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LED_ARRAY_H__ #define __AGS_LED_ARRAY_H__ #include #include #include #include "ags_led.h" #define AGS_TYPE_LED_ARRAY (ags_led_array_get_type()) #define AGS_LED_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LED_ARRAY, AgsLedArray)) #define AGS_LED_ARRAY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LED_ARRAY, AgsLedArrayClass)) #define AGS_IS_LED_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LED_ARRAY)) #define AGS_IS_LED_ARRAY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LED_ARRAY)) #define AGS_LED_ARRAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LED_ARRAY, AgsLedArrayClass)) #define AGS_LED_ARRAY_DEFAULT_LED_WIDTH (10) #define AGS_LED_ARRAY_DEFAULT_LED_HEIGHT (10) typedef struct _AgsLedArray AgsLedArray; typedef struct _AgsLedArrayClass AgsLedArrayClass; typedef enum{ AGS_LED_ARRAY_ACTIVE = 1, }AgsLedArrayFlags; struct _AgsLedArray { GtkBin bin; guint flags; GtkBox *box; guint led_width; guint led_height; AgsLed **led; guint led_count; }; struct _AgsLedArrayClass { GtkBinClass bin; }; GType ags_led_array_get_type(void); void ags_led_array_set_led_count(AgsLedArray *led_array, guint led_count); void ags_led_array_unset_all(AgsLedArray *led_array); void ags_led_array_set_nth(AgsLedArray *led_array, guint nth); AgsLedArray* ags_led_array_new(); #endif /*__AGS_LED_ARRAY_H__*/ gsequencer-3.1.3/ags/widget/ags_expander_set.c0000644000175000017500000002547713607210263016333 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_expander_set.h" #include void ags_expander_set_class_init(AgsExpanderSetClass *expander_set); void ags_expander_set_init(AgsExpanderSet *expander_set); void ags_expander_set_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_expander_set_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_expander_set_finalize(GObject *gobject); void ags_expander_set_show(GtkWidget *widget); void ags_expander_set_realize(GtkWidget *widget); void ags_expander_set_size_request(GtkWidget *widget, GtkRequisition *requisition); void ags_expander_set_size_allocate(GtkWidget *widget, GtkAllocation *allocation); gboolean ags_expander_set_expose(GtkWidget *widget, GdkEventExpose *event); void ags_expander_set_width_changed(GObject *gobject, GParamSpec *pspec, AgsExpanderSet *expander_set); void ags_expander_set_height_changed(GObject *gobject, GParamSpec *pspec, AgsExpanderSet *expander_set); void ags_expander_set_draw(AgsExpanderSet *expander_set); void ags_expander_set_insert_child(AgsExpanderSet *expander_set, AgsExpanderSetChild *child, gboolean ghost); void ags_expander_set_remove_child(AgsExpanderSet *expander_set, AgsExpanderSetChild *child, gboolean ghost); /** * SECTION:ags_expander_set * @short_description: A container * @title: AgsExpanderSet * @section_id: * @include: ags/widget/ags_expander_set.h * * #AgsExpanderSet is a composite widget containing a #GtkTable. */ enum{ PROP_0, PROP_GHOST, PROP_LOCATION, }; static gpointer ags_expander_set_parent_class = NULL; GType ags_expander_set_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_expander_set = 0; static const GTypeInfo ags_expander_set_info = { sizeof(AgsExpanderSetClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_expander_set_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsExpanderSet), 0, /* n_preallocs */ (GInstanceInitFunc) ags_expander_set_init, }; ags_type_expander_set = g_type_register_static(GTK_TYPE_TABLE, "AgsExpanderSet", &ags_expander_set_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_expander_set); } return g_define_type_id__volatile; } void ags_expander_set_class_init(AgsExpanderSetClass *expander_set) { GObjectClass *gobject; // GtkWidgetClass *widget; GParamSpec *param_spec; ags_expander_set_parent_class = g_type_class_peek_parent(expander_set); /* GObjectClass */ gobject = G_OBJECT_CLASS(expander_set); gobject->set_property = ags_expander_set_set_property; gobject->get_property = ags_expander_set_get_property; gobject->finalize = ags_expander_set_finalize; /* GtkWidgetClass */ // widget = (GtkWidgetClass *) expander_set; // widget->realize = ags_expander_set_realize; // widget->expose_event = ags_expander_set_expose; // widget->size_request = ags_expander_set_size_request; // widget->size_allocate = ags_expander_set_size_allocate; } void ags_expander_set_init(AgsExpanderSet *expander_set) { g_object_set(G_OBJECT(expander_set), "app-paintable\0", TRUE, "homogeneous", FALSE, NULL); g_signal_connect(expander_set, "notify::n-columns\0", G_CALLBACK(ags_expander_set_width_changed), expander_set); g_signal_connect(expander_set, "notify::n-rows\0", G_CALLBACK(ags_expander_set_height_changed), expander_set); expander_set->flags = 0; expander_set->ghost = NULL; expander_set->location = NULL; } void ags_expander_set_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsExpanderSet *expander_set; expander_set = AGS_EXPANDER_SET(gobject); switch(prop_id){ case PROP_GHOST: { AgsExpanderSetChild *ghost; ghost = (AgsExpanderSetChild *) g_value_get_pointer(value); ags_expander_set_insert_child(expander_set, ghost, TRUE); } break; case PROP_LOCATION: { AgsExpanderSetChild *location; location = (AgsExpanderSetChild *) g_value_get_pointer(value); ags_expander_set_insert_child(expander_set, location, FALSE); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_expander_set_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsExpanderSet *expander_set; expander_set = AGS_EXPANDER_SET(gobject); switch(prop_id){ case PROP_GHOST: g_value_set_pointer(value, expander_set->ghost); break; case PROP_LOCATION: g_value_set_pointer(value, expander_set->location); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_expander_set_finalize(GObject *gobject) { AgsExpanderSet *expander_set; expander_set = AGS_EXPANDER_SET(gobject); if(expander_set->ghost != NULL){ g_list_free_full(expander_set->ghost, g_free); } if(expander_set->location != NULL){ g_list_free_full(expander_set->location, g_free); } /* call parent */ G_OBJECT_CLASS(ags_expander_set_parent_class)->finalize(gobject); } void ags_expander_set_realize(GtkWidget *widget) { //TODO:JK: implement me } void ags_expander_set_size_request(GtkWidget *widget, GtkRequisition *requisition) { //TODO:JK: implement me } void ags_expander_set_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { //TODO:JK: implement me } gboolean ags_expander_set_expose(GtkWidget *widget, GdkEventExpose *event) { //TODO:JK: implement me return(FALSE); } void ags_expander_set_width_changed(GObject *gobject, GParamSpec *pspec, AgsExpanderSet *expander_set) { //TODO:JK: implement me } void ags_expander_set_height_changed(GObject *gobject, GParamSpec *pspec, AgsExpanderSet *expander_set) { //TODO:JK: implement me } void ags_expander_set_set_flags(AgsExpanderSet *expander_set, guint flags) { //TODO:JK: implement me } AgsExpanderSetChild* ags_expander_set_child_alloc(guint x, guint y, guint width, guint height) { AgsExpanderSetChild *child; child = (AgsExpanderSetChild *) malloc(sizeof(AgsExpanderSetChild)); child->x = x; child->y = y; child->width = width; child->height = height; return(child); } AgsExpanderSetChild* ags_expander_set_child_find(AgsExpanderSet *expander_set, GtkWidget *child) { GList *list; list = expander_set->location; while(list != NULL){ if(AGS_EXPANDER_SET_CHILD(list->data)->child == child){ return((AgsExpanderSetChild *) list->data); } list = list->next; } return(NULL); } void ags_expander_set_draw(AgsExpanderSet *expander_set) { //TODO:JK: implement me } void ags_expander_set_insert_child(AgsExpanderSet *expander_set, AgsExpanderSetChild *child, gboolean ghost) { GList *list; guint i; if(ghost){ list = expander_set->ghost; }else{ list = expander_set->location; } i = 0; while(list != NULL){ if(AGS_EXPANDER_SET_CHILD(list->data)->x > child->x){ break; } if(AGS_EXPANDER_SET_CHILD(list->data)->x == child->x){ while(list != NULL){ if(AGS_EXPANDER_SET_CHILD(list->data)->x > child->x){ break; } if(AGS_EXPANDER_SET_CHILD(list->data)->x == child->x && AGS_EXPANDER_SET_CHILD(list->data)->y >= child->y){ break; } i++; list = list->next; } break; } i++; list = list->next; } gtk_table_attach(GTK_TABLE(expander_set), child->child, child->x, child->x + child->width, child->y, child->y + child->height, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); if(ghost){ expander_set->ghost = g_list_insert(expander_set->ghost, child, i); }else{ expander_set->location = g_list_insert(expander_set->location, child, i); } } void ags_expander_set_remove_child(AgsExpanderSet *expander_set, AgsExpanderSetChild *child, gboolean ghost) { gtk_container_remove(GTK_CONTAINER(expander_set), child->child); if(ghost){ expander_set->ghost = g_list_remove(expander_set->ghost, child); }else{ expander_set->location = g_list_remove(expander_set->location, child); } free(child); } /** * ags_expander_set_add: * @expander_set: the #AgsExpanderSet * @widget: the child #GtkWidget * @x: x-position * @y: y-position * @width: allocation width * @height: allocation height * * Adds a #GtkWidget to #AgsExpanderSet * * Since: 3.0.0 */ void ags_expander_set_add(AgsExpanderSet *expander_set, GtkWidget *widget, guint x, guint y, guint width, guint height) { AgsExpanderSetChild *child; child = ags_expander_set_child_alloc(x, y, width, height); child->child = widget; if(widget != NULL){ ags_expander_set_insert_child(expander_set, child, FALSE); }else{ ags_expander_set_insert_child(expander_set, child, TRUE); } } /** * ags_expander_set_remove: * @expander_set: the #AgsExpanderSet * @widget: the child #GtkWidget * * Removes a #GtkWidget of #AgsExpanderSet * * Since: 3.0.0 */ void ags_expander_set_remove(AgsExpanderSet *expander_set, GtkWidget *widget) { ags_expander_set_remove_child(expander_set, ags_expander_set_child_find(expander_set, widget), FALSE); } /** * ags_expander_set_new: * @height: the table's height * @width: the table's width * * Creates an #AgsExpanderSet * * Returns: a new #AgsExpanderSet * * Since: 3.0.0 */ AgsExpanderSet* ags_expander_set_new(guint width, guint height) { AgsExpanderSet *expander_set; expander_set = (AgsExpanderSet *) g_object_new(AGS_TYPE_EXPANDER_SET, "n-columns\0", width, "n-rows\0", height, NULL); return(expander_set); } gsequencer-3.1.3/ags/widget/ags_led.h0000644000175000017500000000351513607210263014410 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LED_H__ #define __AGS_LED_H__ #include #include #include #define AGS_TYPE_LED (ags_led_get_type()) #define AGS_LED(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LED, AgsLed)) #define AGS_LED_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LED, AgsLedClass)) #define AGS_IS_LED(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_LED)) #define AGS_IS_LED_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_LED)) #define AGS_LED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_LED, AgsLedClass)) #define AGS_LED_DEFAULT_WIDTH (12) #define AGS_LED_DEFAULT_HEIGHT (8) typedef struct _AgsLed AgsLed; typedef struct _AgsLedClass AgsLedClass; typedef enum{ AGS_LED_ACTIVE = 1, }AgsLedFlags; struct _AgsLed { GtkWidget widget; guint flags; }; struct _AgsLedClass { GtkWidgetClass widget; }; GType ags_led_get_type(void); void ags_led_set_active(AgsLed *led); void ags_led_unset_active(AgsLed *led); AgsLed* ags_led_new(); #endif /*__AGS_LED_H__*/ gsequencer-3.1.3/ags/widget/ags_scrolled_piano.h0000644000175000017500000000405313553424517016650 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SCROLLED_PIANO_H__ #define __AGS_SCROLLED_PIANO_H__ #include #include #include #include #define AGS_TYPE_SCROLLED_PIANO (ags_scrolled_piano_get_type()) #define AGS_SCROLLED_PIANO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SCROLLED_PIANO, AgsScrolledPiano)) #define AGS_SCROLLED_PIANO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SCROLLED_PIANO, AgsScrolledPianoClass)) #define AGS_IS_SCROLLED_PIANO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SCROLLED_PIANO)) #define AGS_IS_SCROLLED_PIANO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SCROLLED_PIANO)) #define AGS_SCROLLED_PIANO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SCROLLED_PIANO, AgsScrolledPianoClass)) typedef struct _AgsScrolledPiano AgsScrolledPiano; typedef struct _AgsScrolledPianoClass AgsScrolledPianoClass; struct _AgsScrolledPiano { GtkBin bin; guint margin_top; guint margin_bottom; guint margin_left; guint margin_right; GtkViewport *viewport; AgsPiano *piano; }; struct _AgsScrolledPianoClass { GtkBinClass bin; }; GType ags_scrolled_piano_get_type(void); AgsScrolledPiano* ags_scrolled_piano_new(); #endif /*__AGS_SCROLLED_PIANO_H__*/ gsequencer-3.1.3/ags/widget/ags_hled_array.h0000644000175000017500000000350613540163167015764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_HLED_ARRAY_H__ #define __AGS_HLED_ARRAY_H__ #include #include #include #include "ags_led_array.h" #define AGS_TYPE_HLED_ARRAY (ags_hled_array_get_type()) #define AGS_HLED_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_HLED_ARRAY, AgsHLedArray)) #define AGS_HLED_ARRAY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_HLED_ARRAY, AgsHLedArrayClass)) #define AGS_IS_HLED_ARRAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_HLED_ARRAY)) #define AGS_IS_HLED_ARRAY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_HLED_ARRAY)) #define AGS_HLED_ARRAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_HLED_ARRAY, AgsHLedArrayClass)) typedef struct _AgsHLedArray AgsHLedArray; typedef struct _AgsHLedArrayClass AgsHLedArrayClass; struct _AgsHLedArray { AgsLedArray led_array; }; struct _AgsHLedArrayClass { AgsLedArrayClass led_array; }; GType ags_hled_array_get_type(void); AgsHLedArray* ags_hled_array_new(); #endif /*__AGS_HLED_ARRAY_H__*/ gsequencer-3.1.3/ags/widget/ags_expander.c0000644000175000017500000002710513607210263015446 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_expander.h" #include void ags_expander_class_init(AgsExpanderClass *expander); void ags_expander_init(AgsExpander *expander); void ags_expander_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_expander_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_expander_finalize(GObject *gobject); void ags_expander_show(GtkWidget *widget); void ags_expander_realize(GtkWidget *widget); void ags_expander_size_request(GtkWidget *widget, GtkRequisition *requisition); void ags_expander_size_allocate(GtkWidget *widget, GtkAllocation *allocation); gboolean ags_expander_expose(GtkWidget *widget, GdkEventExpose *event); void ags_expander_activate(GtkExpander *expander); void ags_expander_width_changed(GObject *gobject, GParamSpec *pspec, AgsExpander *expander); void ags_expander_height_changed(GObject *gobject, GParamSpec *pspec, AgsExpander *expander); void ags_expander_draw(AgsExpander *expander); void ags_expander_insert_child(AgsExpander *expander, AgsExpanderChild *child); void ags_expander_remove_child(AgsExpander *expander, AgsExpanderChild *child); /** * SECTION:ags_expander * @short_description: A expander widget * @title: AgsExpander * @section_id: * @include: ags/widget/ags_expander.h * * #AgsExpander is a composite widget containing a #GtkTable. It * is mainly used to layout childs in rows and columns that can * be expanded. */ enum{ PROP_0, PROP_WIDTH, PROP_HEIGHT, PROP_CHILD, }; static gpointer ags_expander_parent_class = NULL; GType ags_expander_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_expander = 0; static const GTypeInfo ags_expander_info = { sizeof(AgsExpanderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_expander_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsExpander), 0, /* n_preallocs */ (GInstanceInitFunc) ags_expander_init, }; ags_type_expander = g_type_register_static(GTK_TYPE_EXPANDER, "AgsExpander", &ags_expander_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_expander); } return g_define_type_id__volatile; } void ags_expander_class_init(AgsExpanderClass *expander) { GObjectClass *gobject; // GtkWidgetClass *widget; GtkExpanderClass *parent; GParamSpec *param_spec; ags_expander_parent_class = g_type_class_peek_parent(expander); /* GObjectClass */ gobject = G_OBJECT_CLASS(expander); gobject->set_property = ags_expander_set_property; gobject->get_property = ags_expander_get_property; gobject->finalize = ags_expander_finalize; /* properties */ param_spec = g_param_spec_uint("width\0", "width of expander grid\0", "The width of the expander's grid\0", 0, G_MAXUINT, 1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_WIDTH, param_spec); param_spec = g_param_spec_uint("height\0", "height of expander\0", "The height which this expander is packed into\0", 0, G_MAXUINT, 1, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_HEIGHT, param_spec); param_spec = g_param_spec_object("child\0", "child of expander\0", "The child which this expander is packed into\0", GTK_TYPE_WIDGET, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CHILD, param_spec); /* GtkWidgetClass */ // widget = (GtkWidgetClass *) expander; // widget->realize = ags_expander_realize; // widget->expose_event = ags_expander_expose; // widget->size_request = ags_expander_size_request; // widget->size_allocate = ags_expander_size_allocate; /* GtkExpanderClass */ parent = (GtkExpanderClass *) expander; parent->activate = ags_expander_activate; } void ags_expander_init(AgsExpander *expander) { g_object_set(G_OBJECT(expander), "app-paintable\0", TRUE, NULL); g_signal_connect(expander, "notify::width\0", G_CALLBACK(ags_expander_width_changed), expander); g_signal_connect(expander, "notify::height\0", G_CALLBACK(ags_expander_height_changed), expander); expander->flags = 0; expander->table = (GtkTable *) gtk_table_new(2, 2, FALSE); gtk_container_add(GTK_CONTAINER(expander), GTK_WIDGET(expander->table)); expander->children = NULL; } void ags_expander_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsExpander *expander; expander = AGS_EXPANDER(gobject); switch(prop_id){ case PROP_WIDTH: { guint width, height; gtk_table_get_size(expander->table, &width, &height); width = g_value_get_uint(value); gtk_table_resize(expander->table, width, height); } break; case PROP_HEIGHT: { guint width, height; gtk_table_get_size(expander->table, &width, &height); height = g_value_get_uint(value); gtk_table_resize(expander->table, width, height); } break; case PROP_CHILD: { AgsExpanderChild *child; child = (AgsExpanderChild *) g_value_get_pointer(value); ags_expander_insert_child(expander, child); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_expander_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsExpander *expander; expander = AGS_EXPANDER(gobject); switch(prop_id){ case PROP_WIDTH: { guint width, height; gtk_table_get_size(expander->table, &width, &height); g_value_set_uint(value, width); } break; case PROP_HEIGHT: { guint width, height; gtk_table_get_size(expander->table, &width, &height); g_value_set_uint(value, height); } break; case PROP_CHILD: g_value_set_pointer(value, expander->children); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_expander_finalize(GObject *gobject) { AgsExpander *expander; expander = AGS_EXPANDER(gobject); if(expander->children != NULL){ g_list_free_full(expander->children, g_free); } /* call parent */ G_OBJECT_CLASS(ags_expander_parent_class)->finalize(gobject); } void ags_expander_realize(GtkWidget *widget) { //TODO:JK: implement me } void ags_expander_size_request(GtkWidget *widget, GtkRequisition *requisition) { //TODO:JK: implement me } void ags_expander_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { //TODO:JK: implement me } gboolean ags_expander_expose(GtkWidget *widget, GdkEventExpose *event) { //TODO:JK: implement me return(FALSE); } void ags_expander_activate(GtkExpander *expander) { GTK_EXPANDER_CLASS(ags_expander_parent_class)->activate(expander); if(gtk_expander_get_expanded(expander)){ gtk_widget_show_all(GTK_WIDGET(AGS_EXPANDER(expander)->table)); }else{ gtk_widget_hide(GTK_WIDGET(AGS_EXPANDER(expander)->table)); } } void ags_expander_width_changed(GObject *gobject, GParamSpec *pspec, AgsExpander *expander) { //TODO:JK: implement me } void ags_expander_height_changed(GObject *gobject, GParamSpec *pspec, AgsExpander *expander) { //TODO:JK: implement me } void ags_expander_flags(AgsExpander *expander, guint flags) { //TODO:JK: implement me } AgsExpanderChild* ags_expander_child_alloc(guint x, guint y, guint width, guint height) { AgsExpanderChild *child; child = (AgsExpanderChild *) malloc(sizeof(AgsExpanderChild)); child->x = x; child->y = y; child->width = width; child->height = height; return(child); } void ags_expander_draw(AgsExpander *expander) { //TODO:JK: implement me } AgsExpanderChild* ags_expander_child_find(AgsExpander *expander, GtkWidget *child) { GList *list; list = expander->children; while(list != NULL){ if(AGS_EXPANDER_CHILD(list->data)->child == child){ return((AgsExpanderChild *) list->data); } list = list->next; } return(NULL); } void ags_expander_insert_child(AgsExpander *expander, AgsExpanderChild *child) { GList *list; guint i; list = expander->children; i = 0; while(list != NULL){ if(AGS_EXPANDER_CHILD(list->data)->x > child->x){ break; } if(AGS_EXPANDER_CHILD(list->data)->x == child->x){ while(list != NULL){ if(AGS_EXPANDER_CHILD(list->data)->x > child->x){ break; } if(AGS_EXPANDER_CHILD(list->data)->x == child->x && AGS_EXPANDER_CHILD(list->data)->y >= child->y){ break; } i++; list = list->next; } break; } i++; list = list->next; } gtk_table_attach(expander->table, child->child, child->x, child->x + child->width, child->y, child->y + child->height, GTK_FILL, GTK_FILL, 0, 0); expander->children = g_list_insert(expander->children, child, i); } void ags_expander_remove_child(AgsExpander *expander, AgsExpanderChild *child) { gtk_container_remove(GTK_CONTAINER(expander->table), child->child); expander->children = g_list_remove(expander->children, child); free(child); } /** * ags_expander_add: * @expander: the #AgsExpander * @widget: the child #GtkWidget * @x: x-position * @y: y-position * @width: allocation width * @height: allocation height * * Adds a #GtkWidget to #AgsExpander * * Since: 3.0.0 */ void ags_expander_add(AgsExpander *expander, GtkWidget *widget, guint x, guint y, guint width, guint height) { AgsExpanderChild *child; child = ags_expander_child_alloc(x, y, width, height); child->child = widget; ags_expander_insert_child(expander, child); if(gtk_widget_is_visible(expander)){ gtk_widget_show_all(child->child); } } /** * ags_expander_remove: * @expander: the #AgsExpander * @widget: the child #GtkWidget * * Removes a #GtkWidget of #AgsExpander * * Since: 3.0.0 */ void ags_expander_remove(AgsExpander *expander, GtkWidget *widget) { ags_expander_remove_child(expander, ags_expander_child_find(expander, widget)); } /** * ags_expander_new: * @height: the table's height * @width: the table's width * * Creates an #AgsExpander * * Returns: a new #AgsExpander * * Since: 3.0.0 */ AgsExpander* ags_expander_new(guint width, guint height) { AgsExpander *expander; expander = (AgsExpander *) g_object_new(AGS_TYPE_EXPANDER, "width\0", width, "height\0", height, NULL); return(expander); } gsequencer-3.1.3/ags/widget/ags_notebook.h0000644000175000017500000000633213540163167015472 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_NOTEBOOK_H__ #define __AGS_NOTEBOOK_H__ #include #include #include #define AGS_TYPE_NOTEBOOK (ags_notebook_get_type()) #define AGS_NOTEBOOK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_NOTEBOOK, AgsNotebook)) #define AGS_NOTEBOOK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_NOTEBOOK, AgsNotebookClass)) #define AGS_IS_NOTEBOOK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_NOTEBOOK)) #define AGS_IS_NOTEBOOK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_NOTEBOOK)) #define AGS_NOTEBOOK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_NOTEBOOK, AgsNotebookClass)) #define AGS_NOTEBOOK_TAB(x) ((AgsNotebookTab *)(x)) #define AGS_NOTEBOOK_TAB_DEFAULT_WIDTH (100) #define AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT (32) #define AGS_NOTEBOOK_TAB_DEFAULT_PREFIX "tab" typedef struct _AgsNotebook AgsNotebook; typedef struct _AgsNotebookClass AgsNotebookClass; typedef struct _AgsNotebookTab AgsNotebookTab; typedef enum{ AGS_NOTEBOOK_TAB_PREFIXED_LABEL = 1, AGS_NOTEBOOK_TAB_ENUMERATE = 1 << 1, }AgsNotebookFlags; struct _AgsNotebook { GtkVBox vbox; guint flags; guint tab_width; guint tab_height; gchar *prefix; GtkHBox *navigation; GtkButton *scroll_prev; GtkButton *scroll_next; GtkViewport *viewport; GtkHBox *hbox; GList *tab; GDestroyNotify tab_free_func; }; struct _AgsNotebookClass { GtkVBoxClass vbox; }; struct _AgsNotebookTab { gpointer data; GtkToggleButton *toggle; }; GType ags_notebook_get_type(void); AgsNotebookTab* ags_notebook_tab_alloc(); void ags_notebook_tab_free(AgsNotebookTab *tab); void ags_notebook_tab_set_data(AgsNotebook *notebook, gint position, gpointer data); gint ags_notebook_tab_index(AgsNotebook *notebook, gpointer data); gint ags_notebook_next_active_tab(AgsNotebook *notebook, gint position); gint ags_notebook_add_tab(AgsNotebook *notebook); gint ags_notebook_add_tab_with_label(AgsNotebook *notebook, gchar *label); void ags_notebook_insert_tab(AgsNotebook *notebook, gint position); void ags_notebook_insert_tab_with_label(AgsNotebook *notebook, gchar *label, gint position); void ags_notebook_remove_tab(AgsNotebook *notebook, gint position); void ags_notebook_remove_tab_with_data(AgsNotebook *notebook, gpointer data); AgsNotebook* ags_notebook_new(); #endif /*__AGS_NOTEBOOK_H__*/ gsequencer-3.1.3/ags/widget/ags_piano.h0000644000175000017500000000671113540163167014761 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PIANO_H__ #define __AGS_PIANO_H__ #include #include #include #include #define AGS_TYPE_PIANO (ags_piano_get_type()) #define AGS_PIANO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PIANO, AgsPiano)) #define AGS_PIANO_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PIANO, AgsPianoClass)) #define AGS_IS_PIANO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PIANO)) #define AGS_IS_PIANO_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PIANO)) #define AGS_PIANO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PIANO, AgsPianoClass)) #define AGS_PIANO_DEFAULT_BASE_NOTE AGS_PIANO_KEYS_OCTAVE_0_C #define AGS_PIANO_DEFAULT_BASE_KEY_CODE (0) #define AGS_PIANO_DEFAULT_KEY_WIDTH (60) #define AGS_PIANO_DEFAULT_KEY_HEIGHT (14) #define AGS_PIANO_DEFAULT_KEY_COUNT (128) typedef struct _AgsPiano AgsPiano; typedef struct _AgsPianoClass AgsPianoClass; typedef enum{ AGS_PIANO_DRAW_FULL_SCALE = 1, AGS_PIANO_DRAW_OCTAVE_SCALE = 1 << 1, }AgsPianoFlags; typedef enum{ AGS_PIANO_BUTTON_1_PRESSED = 1, }AgsPianoButtonState; typedef enum{ AGS_PIANO_LAYOUT_VERTICAL, AGS_PIANO_LAYOUT_HORIZONTAL, }AgsPianoLayout; typedef enum{ AGS_PIANO_MOVE_CURSOR_UP, AGS_PIANO_MOVE_CURSOR_DOWN, AGS_PIANO_HIT_KEY, }AgsPianoAction; typedef enum{ AGS_PIANO_NOTE_C, AGS_PIANO_NOTE_CIS, AGS_PIANO_NOTE_D, AGS_PIANO_NOTE_DIS, AGS_PIANO_NOTE_E, AGS_PIANO_NOTE_F, AGS_PIANO_NOTE_FIS, AGS_PIANO_NOTE_G, AGS_PIANO_NOTE_GIS, AGS_PIANO_NOTE_A, AGS_PIANO_NOTE_AIS, AGS_PIANO_NOTE_H, }AgsPianoOctave; struct _AgsPiano { GtkWidget widget; guint flags; guint button_state; guint layout; guint font_size; gchar *base_note; gint base_key_code; guint key_width; guint key_height; guint key_count; gint cursor_position; gint current_key; gint *active_key; guint active_key_count; }; struct _AgsPianoClass { GtkWidgetClass widget; void (*key_pressed)(AgsPiano *piano, gchar *note, gint key_code); void (*key_released)(AgsPiano *piano, gchar *note, gint key_code); void (*key_clicked)(AgsPiano *piano, gchar *note, gint key_code); }; GType ags_piano_get_type(void); gchar* ags_piano_key_code_to_note(gint key_code); void ags_piano_key_pressed(AgsPiano *piano, gchar *note, gint key_code); void ags_piano_key_released(AgsPiano *piano, gchar *note, gint key_code); void ags_piano_key_clicked(AgsPiano *piano, gchar *note, gint key_code); gint* ags_piano_get_active_key(AgsPiano *piano, guint *active_key_count); AgsPiano* ags_piano_new(); #endif /*__AGS_PIANO_H__*/ gsequencer-3.1.3/ags/widget/ags_ruler.c0000644000175000017500000003363013607210263014771 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #ifndef __APPLE__ #include #endif #include void ags_ruler_class_init(AgsRulerClass *ruler); void ags_ruler_init(AgsRuler *ruler); void ags_ruler_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_ruler_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_ruler_show(GtkWidget *widget); void ags_ruler_realize(GtkWidget *widget); void ags_ruler_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_ruler_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_ruler_send_configure(AgsRuler *ruler); void ags_ruler_draw(AgsRuler *ruler, cairo_t *cr); /** * SECTION:ags_ruler * @short_description: A ruler widget * @title: AgsRuler * @section_id: * @include: ags/widget/ags_ruler.h * * #AgsRuler is a widget representing a #GtkAdjustment. */ enum{ PROP_0, PROP_STEP, PROP_LARGE_STEP, PROP_SMALL_STEP, PROP_ADJUSTMENT, }; static gpointer ags_ruler_parent_class = NULL; GType ags_ruler_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_ruler = 0; static const GTypeInfo ags_ruler_info = { sizeof(AgsRulerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_ruler_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsRuler), 0, /* n_preallocs */ (GInstanceInitFunc) ags_ruler_init, }; ags_type_ruler = g_type_register_static(GTK_TYPE_WIDGET, "AgsRuler", &ags_ruler_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_ruler); } return g_define_type_id__volatile; } void ags_ruler_class_init(AgsRulerClass *ruler) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_ruler_parent_class = g_type_class_peek_parent(ruler); /* GObjectClass */ gobject = (GObjectClass *) ruler; gobject->set_property = ags_ruler_set_property; gobject->get_property = ags_ruler_get_property; /* GtkWidgetClass */ widget = (GtkWidgetClass *) ruler; widget->realize = ags_ruler_realize; widget->size_allocate = ags_ruler_size_allocate; widget->get_preferred_height = ags_ruler_get_preferred_height; widget->draw = ags_ruler_draw; widget->show = ags_ruler_show; /* properties */ param_spec = g_param_spec_object("adjustment", "assigned adjustment", "The adjustment it is assigned with", G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ADJUSTMENT, param_spec); /** * AgsRuler:step: * * The step's width. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("step", "step", "The width of a step", 0, G_MAXUINT, AGS_RULER_DEFAULT_STEP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_STEP, param_spec); /** * AgsRuler:large-step: * * The large step's width. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("large-step", "large step", "The width of a large step", 0, G_MAXUINT, AGS_RULER_DEFAULT_LARGE_STEP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LARGE_STEP, param_spec); /** * AgsRuler:small-step: * * The small step's width. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("small-step", "small step", "The width of a small step", 0, G_MAXUINT, AGS_RULER_DEFAULT_SMALL_STEP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SMALL_STEP, param_spec); } void ags_ruler_init(AgsRuler *ruler) { g_object_set(G_OBJECT(ruler), "app-paintable", TRUE, NULL); ruler->flags = 0; ruler->font_size = AGS_RULER_FONT_SIZE; ruler->adjustment = NULL; ruler->step = AGS_RULER_DEFAULT_STEP; ruler->large_step = AGS_RULER_DEFAULT_LARGE_STEP; ruler->small_step = AGS_RULER_DEFAULT_SMALL_STEP; ruler->factor = 16.0; ruler->precision = 1.0; ruler->scale_precision = 1.0; } void ags_ruler_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRuler *ruler; ruler = AGS_RULER(gobject); switch(prop_id){ case PROP_STEP: { ruler->step = g_value_get_uint(value); } break; case PROP_LARGE_STEP: { ruler->large_step = g_value_get_uint(value); } break; case PROP_SMALL_STEP: { ruler->small_step = g_value_get_uint(value); } break; case PROP_ADJUSTMENT: { GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) g_value_get_object(value); if(ruler->adjustment == adjustment) return; if(ruler->adjustment != NULL){ g_object_unref(G_OBJECT(ruler->adjustment)); } if(adjustment != NULL){ g_object_ref(G_OBJECT(adjustment)); } ruler->adjustment = adjustment; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ruler_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRuler *ruler; ruler = AGS_RULER(gobject); switch(prop_id){ case PROP_STEP: { g_value_set_uint(value, ruler->step); } break; case PROP_LARGE_STEP: { g_value_set_uint(value, ruler->large_step); } break; case PROP_SMALL_STEP: { g_value_set_uint(value, ruler->small_step); } break; case PROP_ADJUSTMENT: { g_value_set_object(value, ruler->adjustment); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_ruler_realize(GtkWidget *widget) { AgsRuler *ruler; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; gint border_left, border_top; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_RULER(widget)); ruler = AGS_RULER(widget); // GTK_WIDGET_CLASS(ags_ruler_parent_class)->realize(widget); gtk_widget_set_realized(widget, TRUE); gtk_widget_get_allocation(widget, &allocation); /* */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.event_mask = gtk_widget_get_events(widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); ags_ruler_send_configure(ruler); } void ags_ruler_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsRuler *ruler; g_return_if_fail(AGS_IS_RULER(widget)); g_return_if_fail(allocation != NULL); ruler = AGS_RULER(widget); gtk_widget_set_allocation(widget, allocation); if(gtk_widget_get_realized(widget)){ gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); ags_ruler_send_configure(ruler); } } void ags_ruler_send_configure(AgsRuler *ruler) { GtkAllocation allocation; GtkWidget *widget; GdkEvent *event = gdk_event_new (GDK_CONFIGURE); widget = GTK_WIDGET(ruler); gtk_widget_get_allocation(widget, &allocation); event->configure.window = g_object_ref(gtk_widget_get_window (widget)); event->configure.send_event = TRUE; event->configure.x = allocation.x; event->configure.y = allocation.y; event->configure.width = allocation.width; event->configure.height = allocation.height; gtk_widget_event(widget, event); gdk_event_free(event); } void ags_ruler_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_ruler_parent_class)->show(widget); } void ags_ruler_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { minimal_height[0] = natural_height[0] = (gint) AGS_RULER_DEFAULT_HEIGHT; } /** * ags_ruler_draw: * @ruler an #AgsRuler * * draws the widget */ void ags_ruler_draw(AgsRuler *ruler, cairo_t *cr) { GtkWidget *widget; GtkAllocation allocation; gchar *font_name; gdouble tact_factor, zoom_factor; gdouble tact; guint offset; guint step; guint x0; guint z; guint i, i_stop; widget = GTK_WIDGET(ruler); // GTK_WIDGET_CLASS(ags_ruler_parent_class)->draw(widget, cr); g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); gtk_widget_get_allocation(widget, &allocation); // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* calculate base step */ tact = ruler->precision; step = ruler->step * 0.25 * ruler->factor * ruler->precision; /* draw bg */ cairo_set_source_rgba(cr, 0.0, 0.0, 0.125, 1.0); cairo_rectangle(cr, 0.0, 0.0, (double) allocation.width, (double) allocation.height); cairo_fill(cr); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); cairo_set_line_width(cr, 1.25); /* draw scale */ offset = (gtk_adjustment_get_value(ruler->adjustment) * step); x0 = offset % step; z = (guint) floor((offset - x0) / step); i_stop = (guint) ceil((double) (allocation.width + (step + x0)) / (double) step); for(i = 0; i < i_stop; i++, z++){ cairo_move_to(cr, (double) (i * step - x0), (double) (allocation.height)); if(tact < 1.0){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; gchar *text; text = g_strdup_printf("%u", (guint) ((gdouble) z / tact)); layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, text, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, ruler->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); /* draw large step */ cairo_set_line_width(cr, 1.75); cairo_line_to(cr, (double) (i * step - x0), (double) (allocation.height - ruler->large_step)); /* draw scale step */ cairo_move_to(cr, (double) (i * step - x0), (double) (allocation.height - ruler->large_step - (ruler->font_size + AGS_RULER_FREE_SPACE))); pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(text); }else{ if(z % (guint) floor(tact) == 0){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; gchar *text; text = g_strdup_printf("%u", (guint) ((gdouble) z / tact)); layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, text, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, ruler->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); /* draw large step */ cairo_set_line_width(cr, 1.75); cairo_line_to(cr, (double) (i * step - x0), (double) (allocation.height - ruler->large_step)); /* draw scale step */ cairo_move_to(cr, (double) (i * step - x0), (double) (allocation.height - ruler->large_step - (ruler->font_size + AGS_RULER_FREE_SPACE))); pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(text); }else{ /* draw small step */ cairo_set_line_width(cr, 1.25); cairo_line_to(cr, (double) (i * step - x0), (double) (allocation.height - ruler->small_step)); } } cairo_stroke(cr); } g_free(font_name); cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_ruler_new: * * Create a new instance of #AgsRuler * * Returns: the new #AgsRuler * * Since: 3.0.0 */ AgsRuler* ags_ruler_new() { AgsRuler *ruler; GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); ruler = (AgsRuler *) g_object_new(AGS_TYPE_RULER, "adjustment", adjustment, NULL); return(ruler); } gsequencer-3.1.3/ags/widget/ags_cartesian.c0000644000175000017500000014130713607210263015612 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_cartesian_class_init(AgsCartesianClass *cartesian); void ags_cartesian_init(AgsCartesian *cartesian); void ags_cartesian_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_cartesian_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_cartesian_finalize(GObject *gobject); void ags_cartesian_show(GtkWidget *widget); void ags_cartesian_map(GtkWidget *widget); void ags_cartesian_realize(GtkWidget *widget); void ags_cartesian_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_cartesian_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width); void ags_cartesian_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height); void ags_cartesian_draw_putpixel(unsigned char *data, gdouble width, gdouble height, guint stride, int x, int y, unsigned long int pixel); void ags_cartesian_draw(AgsCartesian *cartesian, cairo_t *cr); /** * SECTION:ags_cartesian * @short_description: A cartesian widget * @title: AgsCartesian * @section_id: * @include: ags/widget/ags_cartesian.h * * #AgsCartesian enables you to plot data and shows a grid pattern and * some scales. */ enum{ PROP_0, PROP_X_MARGIN, PROP_Y_MARGIN, PROP_CENTER, PROP_LINE_WIDTH, PROP_POINT_RADIUS, PROP_FONT_SIZE, PROP_X_STEP_WIDTH, PROP_Y_STEP_HEIGHT, PROP_X_SCALE_STEP_WIDTH, PROP_Y_SCALE_STEP_HEIGHT, PROP_X_UNIT_X0, PROP_X_UNIT_Y0, PROP_X_UNIT_SIZE, PROP_Y_UNIT_X0, PROP_Y_UNIT_Y0, PROP_Y_UNIT_SIZE, PROP_X_LABEL_START, PROP_X_LABEL_STEP_WIDTH, PROP_Y_LABEL_START, PROP_Y_LABEL_STEP_HEIGHT, PROP_X_STEP, PROP_Y_STEP, PROP_X_START, PROP_X_END, PROP_Y_START, PROP_Y_END, PROP_X_UNIT, PROP_Y_UNIT, PROP_X_LABEL, PROP_Y_LABEL, PROP_X_STEP_DATA, PROP_X_STEP_FACTOR, PROP_Y_STEP_DATA, PROP_Y_STEP_FACTOR, PROP_TRANSLATE_DATA, PROP_X_TRANSLATE_POINT, PROP_Y_TRANSLATE_POINT, PROP_X_SCALE_DATA, PROP_X_SMALL_SCALE_FACTOR, PROP_X_BIG_SCALE_FACTOR, PROP_Y_SCALE_DATA, PROP_Y_SMALL_SCALE_FACTOR, PROP_Y_BIG_SCALE_FACTOR, PROP_X_LABEL_DATA, PROP_X_LABEL_FACTOR, PROP_X_LABEL_PRECISISON, PROP_Y_LABEL_DATA, PROP_Y_LABEL_FACTOR, PROP_Y_LABEL_PRECISISON, PROP_SURFACE, PROP_PLOT, }; static gpointer ags_cartesian_parent_class = NULL; GType ags_cartesian_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_cartesian; static const GTypeInfo ags_cartesian_info = { sizeof(AgsCartesianClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_cartesian_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsCartesian), 0, /* n_preallocs */ (GInstanceInitFunc) ags_cartesian_init, }; ags_type_cartesian = g_type_register_static(GTK_TYPE_WIDGET, "AgsCartesian", &ags_cartesian_info, 0); g_once_init_leave (&g_define_type_id__volatile, ags_type_cartesian); } return g_define_type_id__volatile; } void ags_cartesian_class_init(AgsCartesianClass *cartesian) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_cartesian_parent_class = g_type_class_peek_parent(cartesian); /* GObjectClass */ gobject = (GObjectClass *) cartesian; gobject->set_property = ags_cartesian_set_property; gobject->get_property = ags_cartesian_get_property; gobject->finalize = ags_cartesian_finalize; /* properties */ /** * AgsCartesian:x-margin: * * The horizontal x margin. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-margin", "x margin", "The horizontal x margin", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_MARGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_MARGIN, param_spec); /** * AgsCartesian:y-margin: * * The horizontal y margin. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-margin", "y margin", "The vertical y margin", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_MARGIN, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_MARGIN, param_spec); /** * AgsCartesian:center: * * The center of lines * * Since: 3.0.0 */ param_spec = g_param_spec_double("center", "center of lines", "The center of lines", 0.0, G_MAXDOUBLE, 0.5, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CENTER, param_spec); /** * AgsCartesian:line-width: * * The line width. * * Since: 3.0.0 */ param_spec = g_param_spec_double("line-width", "line width", "The line width", 0.0, G_MAXDOUBLE, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LINE_WIDTH, param_spec); /** * AgsCartesian:point-radius: * * The points radius. * * Since: 3.0.0 */ param_spec = g_param_spec_double("point-radius", "point radius", "The points radius", 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_POINT_RADIUS, param_spec); /** * AgsCartesian:font-size: * * The font's size to draw labels and units. * * Since: 3.0.0 */ param_spec = g_param_spec_double("font-size", "font size", "The font's size", 0.0, G_MAXDOUBLE, 12.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FONT_SIZE, param_spec); /** * AgsCartesian:x-step-width: * * The width of a x step. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-step-width", "x step width", "The x step width", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_STEP_WIDTH, param_spec); /** * AgsCartesian:y-step-height: * * The height of a y step. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-step-height", "y step height", "The y step height", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_STEP_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_STEP_HEIGHT, param_spec); /** * AgsCartesian:x-scale-step-width: * * The width of a x scale step. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-scale-step-width", "x scale step width", "The x step width", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_SCALE_STEP_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_SCALE_STEP_WIDTH, param_spec); /** * AgsCartesian:y-scale-step-height: * * The height of a y scale step. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-scale-step-height", "y scale step height", "The y scale step height", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_SCALE_STEP_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_SCALE_STEP_HEIGHT, param_spec); /** * AgsCartesian:x-step: * * The x step. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-step", "x step", "The x step", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_STEP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_STEP, param_spec); /** * AgsCartesian:y-step: * * The y step. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-step", "y step", "The y step", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_STEP, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_STEP, param_spec); /** * AgsCartesian:x-start: * * The x start. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-start", "x start", "The x start", -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_START, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_START, param_spec); /** * AgsCartesian:x-end: * * The x end. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-end", "x end", "The x end", -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_END, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_END, param_spec); /** * AgsCartesian:y-start: * * The y start. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-start", "y start", "The y start", -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_START, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_START, param_spec); /** * AgsCartesian:y-end: * * The y end. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-end", "y end", "The y end", -1.0 * G_MAXDOUBLE, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_END, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_END, param_spec); /** * AgsCartesian:x-unit-x0: * * The x unit's x0 position. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-unit-x0", "x unit x0", "The x unit's x0 position", 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_UNIT_X0, param_spec); /** * AgsCartesian:x-unit-y0: * * The x unit's y0 position. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-unit-y0", "x unit y0", "The x unit's y0 position", 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_UNIT_Y0, param_spec); /** * AgsCartesian:x-unit: * * The x unit label. * * Since: 3.0.0 */ param_spec = g_param_spec_string("x-unit", "x unit", "The x unit label", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_UNIT, param_spec); /** * AgsCartesian:y-unit-x0: * * The y unit's x0 position. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-unit-x0", "y unit x0", "The y unit's x0 position", 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_UNIT_X0, param_spec); /** * AgsCartesian:y-unit-y0: * * The y unit's y0 position. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-unit-y0", "y unit y0", "The y unit's y0 position", 0.0, G_MAXDOUBLE, 0.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_UNIT_Y0, param_spec); /** * AgsCartesian:y-unit: * * The y unit label. * * Since: 3.0.0 */ param_spec = g_param_spec_string("y-unit", "y unit", "The y unit label", NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_UNIT, param_spec); /** * AgsCartesian:x-label-start: * * The x label start position. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-label-start", "x label start", "The x label start position", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_LABEL_START, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_LABEL_START, param_spec); /** * AgsCartesian:x-label-step-width: * * The x label step width. * * Since: 3.0.0 */ param_spec = g_param_spec_double("x-label-step-width", "x label step width", "The x label step width", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_X_LABEL_STEP_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_LABEL_STEP_WIDTH, param_spec); /** * AgsCartesian:x-label: * * The x labels as a string array. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("x-label", "x label", "The x labels as string array", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_X_LABEL, param_spec); /** * AgsCartesian:y-label-start: * * The y label start position. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-label-start", "y label start", "The y label start position", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_LABEL_START, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_LABEL_START, param_spec); /** * AgsCartesian:y-label-step-height: * * The y label step height. * * Since: 3.0.0 */ param_spec = g_param_spec_double("y-label-step-height", "y label step height", "The y label step height", 0.0, G_MAXDOUBLE, AGS_CARTESIAN_DEFAULT_Y_LABEL_STEP_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_LABEL_STEP_HEIGHT, param_spec); /** * AgsCartesian:y-label: * * The y labels as a string array. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("y-label", "y label", "The y labels as string array", G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_Y_LABEL, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) cartesian; // widget->map = ags_cartesian_map; widget->realize = ags_cartesian_realize; widget->size_allocate = ags_cartesian_size_allocate; widget->get_preferred_width = ags_cartesian_get_preferred_width; widget->get_preferred_height = ags_cartesian_get_preferred_height; widget->show = ags_cartesian_show; widget->draw = ags_cartesian_draw; } void ags_cartesian_init(AgsCartesian *cartesian) { guint i, i_stop; g_object_set(G_OBJECT(cartesian), "app-paintable", TRUE, NULL); /* flags */ cartesian->flags = (AGS_CARTESIAN_ABSCISSAE | AGS_CARTESIAN_ORDINATE | AGS_CARTESIAN_X_SCALE | AGS_CARTESIAN_Y_SCALE | AGS_CARTESIAN_X_UNIT | AGS_CARTESIAN_Y_UNIT | AGS_CARTESIAN_X_LABEL | AGS_CARTESIAN_Y_LABEL); /* margin */ cartesian->x_margin = AGS_CARTESIAN_DEFAULT_X_MARGIN; cartesian->y_margin = AGS_CARTESIAN_DEFAULT_Y_MARGIN; /* line width */ cartesian->center = 0.5; cartesian->line_width = 1.0; cartesian->point_radius = 1.2; cartesian->font_size = 8.0; /* step */ cartesian->x_step_width = AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH; cartesian->y_step_height = AGS_CARTESIAN_DEFAULT_Y_STEP_HEIGHT; /* scale step */ cartesian->x_scale_step_width = AGS_CARTESIAN_DEFAULT_X_SCALE_STEP_WIDTH; cartesian->y_scale_step_height = AGS_CARTESIAN_DEFAULT_Y_SCALE_STEP_HEIGHT; /* x unit position and font size */ cartesian->x_unit_x0 = (AGS_CARTESIAN_DEFAULT_X_END + AGS_CARTESIAN_DEFAULT_X_MARGIN) - 12.0; cartesian->x_unit_y0 = 0.0; cartesian->x_unit_size = 12.0; /* y unit position and font size */ cartesian->y_unit_x0 = 0.0; cartesian->y_unit_y0 = (AGS_CARTESIAN_DEFAULT_Y_END + AGS_CARTESIAN_DEFAULT_Y_MARGIN) - 12.0; cartesian->y_unit_size = 12.0; /* label step width */ cartesian->x_label_start = AGS_CARTESIAN_DEFAULT_X_LABEL_START; cartesian->x_label_step_width = AGS_CARTESIAN_DEFAULT_X_LABEL_STEP_WIDTH; cartesian->y_label_start = AGS_CARTESIAN_DEFAULT_Y_LABEL_START; cartesian->y_label_step_height = AGS_CARTESIAN_DEFAULT_Y_LABEL_STEP_HEIGHT; /* region alignment */ cartesian->x_step = AGS_CARTESIAN_DEFAULT_X_STEP; cartesian->y_step = AGS_CARTESIAN_DEFAULT_Y_STEP; cartesian->x_start = AGS_CARTESIAN_DEFAULT_X_START; cartesian->x_end = AGS_CARTESIAN_DEFAULT_X_END; cartesian->y_start = AGS_CARTESIAN_DEFAULT_Y_START; cartesian->y_end = AGS_CARTESIAN_DEFAULT_Y_END; /* unit */ cartesian->x_unit = "x"; cartesian->y_unit = "y"; /* label */ cartesian->x_label = NULL; cartesian->y_label = NULL; /* * Here are some common conversion and translate functions. * As well functions to calculate scale and fill their labels. */ /* conversion function */ cartesian->step_conversion_func = ags_cartesian_linear_step_conversion_func; /* translate function */ cartesian->translate_func = ags_cartesian_linear_translate_func; /* scale functions */ cartesian->x_small_scale_func = ags_cartesian_linear_x_small_scale_func; cartesian->x_big_scale_func = ags_cartesian_linear_x_big_scale_func; cartesian->y_small_scale_func = ags_cartesian_linear_y_small_scale_func; cartesian->y_big_scale_func = ags_cartesian_linear_y_big_scale_func; /* label functions */ cartesian->x_label_func = ags_cartesian_linear_x_label_func; cartesian->y_label_func = ags_cartesian_linear_y_label_func; /* factors */ cartesian->x_step_data = cartesian; cartesian->x_step_factor = 1.0; cartesian->y_step_data = cartesian; cartesian->y_step_factor = 1.0; cartesian->x_scale_data = cartesian; cartesian->x_small_scale_factor = 1.0; cartesian->x_big_scale_factor = 5.0; cartesian->y_scale_data = cartesian; cartesian->y_small_scale_factor = 1.0; cartesian->y_big_scale_factor = 5.0; cartesian->x_label_data = cartesian; cartesian->x_label_factor = 5.0; cartesian->x_label_precision = 3.0; cartesian->y_label_data = cartesian; cartesian->y_label_factor = 5.0; cartesian->y_label_precision = 3.0; /* plot */ cartesian->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, cartesian->x_end - cartesian->x_start, cartesian->y_end - cartesian->y_start); cartesian->plot = NULL; /* * reallocate and fill label */ ags_cartesian_reallocate_label(cartesian, TRUE); ags_cartesian_reallocate_label(cartesian, FALSE); ags_cartesian_fill_label(cartesian, TRUE); ags_cartesian_fill_label(cartesian, FALSE); } void ags_cartesian_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { //TODO:JK: implement me } void ags_cartesian_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { //TODO:JK: implement me } void ags_cartesian_finalize(GObject *gobject) { //TODO:JK: implement me G_OBJECT_CLASS(ags_cartesian_parent_class)->finalize(gobject); } void ags_cartesian_map(GtkWidget *widget) { if(gtk_widget_get_realized (widget) && !gtk_widget_get_mapped(widget)){ GTK_WIDGET_CLASS(ags_cartesian_parent_class)->map(widget); gdk_window_show(gtk_widget_get_window(widget)); // ags_cartesian_draw((AgsCartesian *) widget); } } void ags_cartesian_realize(GtkWidget *widget) { AgsCartesian *cartesian; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_CARTESIAN(widget)); cartesian = AGS_CARTESIAN(widget); gtk_widget_set_realized(widget, TRUE); /* */ attributes.window_type = GDK_WINDOW_CHILD; gtk_widget_get_allocation(widget, &allocation); attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.window_type = GDK_WINDOW_CHILD; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK); window = gdk_window_new(gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gtk_widget_set_window(widget, window); gdk_window_set_user_data(window, cartesian); gtk_widget_queue_resize(widget); } void ags_cartesian_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_cartesian_parent_class)->show(widget); } void ags_cartesian_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { GTK_WIDGET_CLASS(ags_cartesian_parent_class)->size_allocate(widget, allocation); //TODO:JK: implement me } void ags_cartesian_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width) { GTK_WIDGET_CLASS(ags_cartesian_parent_class)->get_preferred_width(widget, minimum_width, natural_width); //TODO:JK: implement me } void ags_cartesian_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height) { GTK_WIDGET_CLASS(ags_cartesian_parent_class)->get_preferred_height(widget, minimum_height, natural_height); //TODO:JK: implement me } void ags_cartesian_draw_putpixel(unsigned char *data, gdouble width, gdouble height, guint stride, int x, int y, unsigned long int pixel) { int bpp = stride / width; /* Here p is the address to the pixel we want to set */ unsigned char *p = data + y * stride + x * bpp; switch(bpp) { case 1: *p = pixel; break; case 2: *(gint16 *)p = pixel; break; case 3: p[0] = pixel & 0xff; p[1] = (pixel >> 8) & 0xff; p[2] = (pixel >> 16) & 0xff; break; case 4: *(gint32 *)p = pixel; break; } } void ags_cartesian_draw(AgsCartesian *cartesian, cairo_t *cr) { GtkWidget *widget; GtkStyleContext *cartesian_style_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *fg_color_active; GdkRGBA *bg_color; GdkRGBA *border_color; GList *list; unsigned char *data; guint32 *data_ptr; gchar *font_name; gdouble x, y; gdouble x_offset, y_offset; gdouble width, height; gdouble factor; gdouble scale_point; guint32 clear_color; guint stride; guint i_stop; guint i; GValue value = {0,}; /* entry point */ if(!AGS_IS_CARTESIAN(cartesian)){ return; } widget = GTK_WIDGET(cartesian); gtk_widget_get_allocation(GTK_WIDGET(cartesian), &allocation); /* style context */ cartesian_style_context = gtk_widget_get_style_context(GTK_WIDGET(cartesian)); gtk_style_context_get_property(cartesian_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(cartesian_style_context, "color", GTK_STATE_FLAG_ACTIVE, &value); fg_color_active = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(cartesian_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(cartesian_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); /* clear bg */ #if 0 cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, 0.0, allocation.width, allocation.height); cairo_fill(cr); #else gtk_render_background(cartesian_style_context, cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); #endif /* cartesian offset, width and height */ width = (cartesian->x_end - cartesian->x_start); height = (cartesian->y_end - cartesian->y_start); x_offset = cartesian->x_margin - cartesian->x_start - cartesian->center; y_offset = cartesian->y_margin + cartesian->y_start + height + cartesian->center; /* clear surface */ data = cairo_image_surface_get_data(cartesian->surface); stride = cairo_image_surface_get_stride(cartesian->surface); data_ptr = data; clear_color = (((guint) (255.0 * bg_color->red) << 16) | ((guint) (255.0 * bg_color->green) << 8) | ((guint) (255.0 * bg_color->blue))); // memset(data, clear_color, (4 * width * height * sizeof(unsigned char))); for(i = 0; i < width * height; i++){ data_ptr[i] = clear_color; } // cairo_surface_flush(cartesian->surface); /* surface */ cairo_set_source_surface(cr, cartesian->surface, cartesian->x_margin, cartesian->y_margin); cairo_surface_mark_dirty(cartesian->surface); cairo_paint(cr); /* draw plot */ list = cartesian->plot; while(list != NULL){ AgsPlot *plot; guint i; plot = list->data; cairo_set_source_rgba(cr, fg_color_active->red, fg_color_active->blue, fg_color_active->green, fg_color_active->alpha); /* points */ for(i = 0; i < plot->n_points; i++){ if(plot->point[i] != NULL){ if(plot->point_color != NULL && plot->point_color[i] != NULL){ cairo_set_source_rgb(cr, plot->point_color[i][0], plot->point_color[i][1], plot->point_color[i][2]); } #ifdef AGS_DEBUG g_message("%f %f", plot->point[i][0], plot->point[i][1]); #endif cairo_arc(cr, x_offset + plot->point[i][0] - cartesian->point_radius, y_offset - (plot->point[i][1] - cartesian->point_radius), cartesian->point_radius, -1.0 * M_PI, 1.0 * M_PI); if(plot->join_points){ if(i == 0){ cairo_move_to(cr, x_offset, y_offset); cairo_line_to(cr, x_offset + plot->point[i][0], y_offset - plot->point[i][1]); }else{ cairo_line_to(cr, x_offset + plot->point[i][0], y_offset - plot->point[i][1]); } } } } cairo_stroke(cr); cairo_fill(cr); /* bitmaps */ for(i = 0; i < plot->n_bitmaps; i++){ if(plot->bitmap[i] != NULL){ unsigned long int pixel; guint nth; guint x, y; if(plot->bitmap_color != NULL && plot->bitmap_color[i] != NULL){ pixel = ((255 << 16) * plot->bitmap_color[i][0] + (255 << 8) * plot->bitmap_color[i][1] + 255 * plot->bitmap_color[i][0]); }else{ pixel = 0xffffff; } for(y = 0, nth = 0; y < height; y++){ for(x = 0; x < width; x++, nth++){ if(((1 << (nth % 8)) & (plot->bitmap[i][(guint) floor(nth / 8.0)])) != 0){ ags_cartesian_draw_putpixel(data, width, height, stride, x, y, pixel); } } } } } /* pixmaps */ for(i = 0; i < plot->n_pixmaps; i++){ if(plot->pixmap[i] != NULL){ guint nth; guint x, y; for(y = 0, nth = 0; y < height; y++){ for(x = 0; x < width; x++, nth++){ if(plot->pixmap[i][nth] != NULL){ unsigned long int pixel; pixel = ((255 << 16) * plot->pixmap[i][nth][0] + (255 << 8) * plot->pixmap[i][nth][1] + 255 * plot->pixmap[i][nth][0]); ags_cartesian_draw_putpixel(data, width, height, stride, x, y, pixel); } } } } } list = list->next; } /* push group */ cairo_push_group(cr); { static const double dashes[] = { 2.0, 3.0 }; /* line width */ cairo_set_line_width(cr, cartesian->line_width); /* color */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); /* dash */ cairo_set_dash(cr, dashes, 2, 0.0); /* draw small area steps */ factor = (cartesian->x_scale_step_width / cartesian->x_step_width); for(x = cartesian->x_start; ; ){ scale_point = cartesian->x_small_scale_func(x, cartesian->x_scale_data); if(scale_point < factor * cartesian->x_start){ x += cartesian->x_step_width; continue; } if(scale_point < factor * cartesian->x_end + cartesian->x_scale_step_width){ /* draw scale step */ cairo_move_to(cr, x_offset + scale_point, y_offset - cartesian->y_start - height); cairo_line_to(cr, x_offset + scale_point, y_offset - cartesian->y_start); cairo_stroke(cr); }else{ break; } x += cartesian->x_step_width; } /* draw small scale steps */ factor = (cartesian->y_scale_step_height / cartesian->y_step_height); for(y = cartesian->y_start; ; ){ scale_point = cartesian->y_small_scale_func(y, cartesian->y_scale_data); if(scale_point < factor * cartesian->y_start){ y += cartesian->y_step_height; continue; } if(scale_point < factor * cartesian->y_end + cartesian->y_scale_step_height){ /* draw scale step */ cairo_move_to(cr, x_offset + cartesian->x_start, y_offset - scale_point); cairo_line_to(cr, x_offset + cartesian->x_start + width, y_offset - scale_point); cairo_stroke(cr); }else{ break; } y += cartesian->y_step_height; } /* undash */ cairo_set_dash(cr, NULL, 0, 0.0); /* draw big area steps */ factor = (cartesian->x_scale_step_width / cartesian->x_step_width); for(x = cartesian->x_start; ; ){ scale_point = cartesian->x_big_scale_func(x, cartesian->x_scale_data); if(scale_point <= factor * cartesian->x_start){ x += cartesian->x_step_width; continue; } if(scale_point < factor * cartesian->x_end + cartesian->x_scale_step_width){ /* draw scale step */ cairo_move_to(cr, x_offset + scale_point, y_offset - cartesian->y_start - height); cairo_line_to(cr, x_offset + scale_point, y_offset - cartesian->y_start); cairo_stroke(cr); }else{ break; } x += cartesian->x_step_width; } /* draw big scale steps */ factor = (cartesian->y_scale_step_height / cartesian->y_step_height); for(y = cartesian->y_start; ; ){ scale_point = cartesian->y_big_scale_func(y, cartesian->y_scale_data); if(scale_point < factor * cartesian->y_start){ y += cartesian->y_step_height; continue; } if(scale_point < factor * cartesian->y_end + cartesian->y_scale_step_height){ /* draw scale step */ cairo_move_to(cr, x_offset + cartesian->x_start, y_offset - scale_point); cairo_line_to(cr, x_offset + cartesian->x_start + width, y_offset - scale_point); cairo_stroke(cr); }else{ break; } y += cartesian->y_step_height; } } /* abscissae */ if((AGS_CARTESIAN_ABSCISSAE & (cartesian->flags)) != 0){ if((cartesian->x_end == 0.0) || (cartesian->x_start == 0.0) || (cartesian->x_start < 0.0 && cartesian->x_end > 0.0)){ /* small scale */ { /* line width */ cairo_set_line_width(cr, cartesian->line_width); /* color */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); /* draw line */ cairo_move_to(cr, x_offset + cartesian->x_start, y_offset); cairo_line_to(cr, x_offset + cartesian->x_start + width, y_offset); cairo_stroke(cr); /* draw small scale steps */ factor = (cartesian->x_scale_step_width / cartesian->x_step_width); for(x = cartesian->x_start; ; ){ scale_point = cartesian->x_small_scale_func(x, cartesian->x_scale_data); if(scale_point < factor * cartesian->x_start){ x += cartesian->x_step_width; continue; } if(scale_point < factor * cartesian->x_end + cartesian->x_scale_step_width){ /* draw scale step */ cairo_move_to(cr, x_offset + scale_point, y_offset - 4.0); cairo_line_to(cr, x_offset + scale_point, y_offset + 4.0); cairo_stroke(cr); }else{ break; } x += cartesian->x_step_width; } } /* big scale */ { /* line width */ cairo_set_line_width(cr, cartesian->line_width); /* color */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); /* draw big scale steps */ factor = (cartesian->x_scale_step_width / cartesian->x_step_width); for(x = cartesian->x_start; ; ){ scale_point = cartesian->x_big_scale_func(x, cartesian->x_scale_data); if(scale_point < factor * cartesian->x_start){ x += cartesian->x_step_width; continue; } if(scale_point < factor * cartesian->x_end + cartesian->x_scale_step_width){ /* draw scale step */ cairo_move_to(cr, x_offset + scale_point, y_offset - 6.0); cairo_line_to(cr, x_offset + scale_point, y_offset + 6.0); cairo_stroke(cr); }else{ break; } x += cartesian->x_step_width; } } } } /* ordinate */ if((AGS_CARTESIAN_ORDINATE & (cartesian->flags)) != 0){ if((cartesian->y_end == 0.0) || (cartesian->y_start == 0.0) || (cartesian->y_start < 0.0 && cartesian->y_end > 0.0)){ /* small scale */ { /* color and line width */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); cairo_set_line_width(cr, cartesian->line_width); /* draw line */ cairo_move_to(cr, x_offset, y_offset - cartesian->y_start); cairo_line_to(cr, x_offset, y_offset - cartesian->y_start - height); cairo_stroke(cr); /* draw small scale steps */ factor = (cartesian->y_scale_step_height / cartesian->y_step_height); for(y = cartesian->y_start; ; ){ scale_point = cartesian->y_small_scale_func(y, cartesian->y_scale_data); if(scale_point < factor * cartesian->y_start){ y += cartesian->y_step_height; continue; } if(scale_point < factor * cartesian->y_end + cartesian->y_scale_step_height){ /* draw scale step */ cairo_move_to(cr, x_offset - 4.0, y_offset - scale_point); cairo_line_to(cr, x_offset + 4.0, y_offset - scale_point); cairo_stroke(cr); }else{ break; } y += cartesian->y_step_height; } } /* big scale */ { /* line width */ cairo_set_line_width(cr, cartesian->line_width); /* color */ cairo_set_source_rgba(cr, fg_color->red, fg_color->blue, fg_color->green, fg_color->alpha); /* draw big scale steps */ factor = (cartesian->y_scale_step_height / cartesian->y_step_height); for(y = cartesian->y_start; ; ){ scale_point = cartesian->y_big_scale_func(y, cartesian->y_scale_data); if(scale_point < factor * cartesian->y_start){ y += cartesian->y_step_height; continue; } if(scale_point < factor * cartesian->y_end + cartesian->y_scale_step_height){ /* draw scale step */ cairo_move_to(cr, x_offset - 6.0, y_offset - scale_point); cairo_line_to(cr, x_offset + 6.0, y_offset - scale_point); cairo_stroke(cr); }else{ break; } y += cartesian->y_step_height; } } } } /* x and y label */ if((AGS_CARTESIAN_X_LABEL & (cartesian->flags)) != 0){ guint i; for(i = 0; i < width / cartesian->x_label_step_width; i++){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; if(cartesian->x_label[i] == NULL){ break; } layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, cartesian->x_label[i], -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, cartesian->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_move_to(cr, cartesian->x_margin + cartesian->x_label_start + (i * cartesian->x_label_step_width) + cartesian->font_size / 3.0, cartesian->y_margin + height + cartesian->y_start + cartesian->font_size + (logical_rect.height / PANGO_SCALE)); pango_cairo_show_layout(cr, layout); g_object_unref(layout); } } if((AGS_CARTESIAN_Y_LABEL & (cartesian->flags)) != 0){ guint i; for(i = 0; i < height / cartesian->y_label_step_height; i++){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; if(cartesian->y_label[i] == NULL){ break; } layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, cartesian->y_label[i], -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, cartesian->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_move_to(cr, cartesian->x_margin - cartesian->x_start + cartesian->font_size / 2.0, cartesian->y_margin + height - cartesian->y_label_start - (i * cartesian->y_label_step_height) - cartesian->font_size / 3.0); pango_cairo_show_layout(cr, layout); g_object_unref(layout); } cairo_stroke(cr); } /* x unit */ if((AGS_CARTESIAN_X_UNIT & (cartesian->flags)) != 0){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, cartesian->x_unit, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, cartesian->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_move_to(cr, cartesian->x_margin - (logical_rect.width / PANGO_SCALE) - 3.0, cartesian->y_margin + height + cartesian->y_start); pango_cairo_show_layout(cr, layout); g_object_unref(layout); } /* y unit */ if((AGS_CARTESIAN_Y_UNIT & (cartesian->flags)) != 0){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, cartesian->y_unit, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, cartesian->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_move_to(cr, cartesian->x_margin - cartesian->x_start, cartesian->y_margin + height + (logical_rect.height / PANGO_SCALE) + 3.0); pango_cairo_show_layout(cr, layout); g_object_unref(layout); } g_free(font_name); /* pop group */ cairo_pop_group_to_source(cr); /* paint */ cairo_paint(cr); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, fg_color_active); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); // cairo_surface_mark_dirty(cairo_get_target(cr)); } AgsPlot* ags_plot_alloc(guint n_points, guint n_bitmaps, guint n_pixmaps) { AgsPlot *plot; guint i; plot = (AgsPlot *) malloc(sizeof(AgsPlot)); plot->fill_flags = AGS_PLOT_FILL_REPLACE; /* points */ plot->n_points = n_points; plot->join_points = FALSE; if(n_points == 0){ plot->point = NULL; plot->point_color = NULL; }else{ plot->point = (gdouble **) malloc(n_points * sizeof(gdouble *)); plot->point_color = (gdouble **) malloc(n_points * sizeof(gdouble *)); plot->point_label = (gchar **) malloc((n_points + 1) * sizeof(gchar *)); for(i = 0; i < n_points; i++){ plot->point[i] = (gdouble *) malloc(2 * sizeof(gdouble)); plot->point[i][0] = 0.0; plot->point[i][1] = 0.0; plot->point_color[i] = (gdouble *) malloc(3 * sizeof(gdouble)); plot->point_color[i][0] = 0.0; plot->point_color[i][1] = 0.0; plot->point_color[i][2] = 0.0; plot->point_label[i] = NULL; } plot->point_label[i] = NULL; } /* bitmaps */ plot->n_bitmaps = n_bitmaps; if(n_bitmaps == 0){ plot->bitmap = NULL; plot->bitmap_color = NULL; }else{ plot->bitmap = (unsigned char **) malloc(n_bitmaps * sizeof(unsigned char *)); plot->bitmap_color = (gdouble **) malloc(n_bitmaps * sizeof(gdouble *)); for(i = 0; i < n_bitmaps; i++){ plot->bitmap[i] = NULL; plot->bitmap_color[i] = (gdouble *) malloc(3 * sizeof(gdouble)); plot->bitmap_color[i][0] = 1.0; plot->bitmap_color[i][1] = 0.0; plot->bitmap_color[i][2] = 0.0; } } /* pixmaps */ plot->n_pixmaps = n_pixmaps; if(n_pixmaps == 0){ plot->pixmap = NULL; }else{ plot->pixmap = (gdouble ***) malloc(n_pixmaps * sizeof(gdouble **)); for(i = 0; i < n_pixmaps; i++){ plot->pixmap[i] = NULL; } } return(plot); } void ags_plot_free(AgsPlot *plot) { //TODO:JK: implement me } void ags_cartesian_add_plot(AgsCartesian *cartesian, AgsPlot *plot) { if(!AGS_IS_CARTESIAN(cartesian)){ return; } cartesian->plot = g_list_prepend(cartesian->plot, plot); } void ags_cartesian_remove_plot(AgsCartesian *cartesian, AgsPlot *plot) { if(!AGS_IS_CARTESIAN(cartesian)){ return; } cartesian->plot = g_list_remove(cartesian->plot, plot); } gdouble ags_cartesian_linear_step_conversion_func(gdouble current, gboolean is_abscissae, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(current); } if(is_abscissae){ return(AGS_CARTESIAN(data)->x_step_factor * current); }else{ return(AGS_CARTESIAN(data)->y_step_factor * current); } } void ags_cartesian_linear_translate_func(gdouble x, gdouble y, gdouble *ret_x, gdouble *ret_y, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ if(ret_x != NULL){ *ret_x = x; } if(ret_y != NULL){ *ret_y = y; } return; } if(ret_x != NULL){ *ret_x = (AGS_CARTESIAN(data)->x_translate_point) - (x - AGS_CARTESIAN(data)->x_translate_point); } if(ret_y != NULL){ *ret_y = (AGS_CARTESIAN(data)->y_translate_point) - (y - AGS_CARTESIAN(data)->y_translate_point); } } gdouble ags_cartesian_linear_x_small_scale_func(gdouble value, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(value); } return(AGS_CARTESIAN(data)->x_small_scale_factor * value); } gdouble ags_cartesian_linear_x_big_scale_func(gdouble value, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(value); } return(AGS_CARTESIAN(data)->x_big_scale_factor * value); } gdouble ags_cartesian_linear_y_small_scale_func(gdouble value, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(value); } return(AGS_CARTESIAN(data)->y_small_scale_factor * value); } gdouble ags_cartesian_linear_y_big_scale_func(gdouble value, gpointer data) { if(data == NULL || !AGS_IS_CARTESIAN(data)){ return(value); } return(AGS_CARTESIAN(data)->y_big_scale_factor * value); } gchar* ags_cartesian_linear_x_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; if(data == NULL || !AGS_IS_CARTESIAN(data)){ str = g_strdup_printf("%f", value); return(str); } format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->x_label_precision)); str = g_strdup_printf(format, value); g_free(format); return(str); } gchar* ags_cartesian_linear_y_label_func(gdouble value, gpointer data) { gchar *format; gchar *str; if(data == NULL || !AGS_IS_CARTESIAN(data)){ str = g_strdup_printf("%f", value); return(str); } format = g_strdup_printf("%%.%df", (guint) ceil(AGS_CARTESIAN(data)->y_label_precision)); str = g_strdup_printf(format, value); g_free(format); return(str); } void ags_cartesian_reallocate_label(AgsCartesian *cartesian, gboolean do_x_label) { guint i_start, i_stop; guint i; if(cartesian == NULL || !AGS_IS_CARTESIAN(cartesian)){ return; } if(do_x_label){ i_stop = (guint) ceil((1.0 / cartesian->x_label_step_width) * (cartesian->x_end - cartesian->x_start)); if(cartesian->x_label == NULL){ /* allocate */ cartesian->x_label = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); /* iteration control */ i_start = 0; i = 0; }else{ /* reallocate */ cartesian->x_label = (gchar **) realloc(cartesian->x_label, (i_stop + 1) * sizeof(gchar *)); /* iteration control */ i_start = g_strv_length(cartesian->x_label); if(i_start < i_stop){ i = i_start; }else{ i = i_stop; if(i_stop == 0){ /* set label to NULL */ cartesian->x_label = NULL; } } } if(cartesian->x_label != NULL){ for(; i < i_stop; i++){ /* initialize array to NULL */ cartesian->x_label[i] = NULL; } /* NULL terminated end */ cartesian->x_label[i] = NULL; } }else{ i_stop = (guint) ceil((1.0 / cartesian->y_label_step_height) * (cartesian->y_end - cartesian->y_start)); if(cartesian->y_label == NULL){ /* allocate */ cartesian->y_label = (gchar **) malloc((i_stop + 1) * sizeof(gchar *)); /* iteration control */ i_start = 0; i = 0; }else{ /* reallocate */ cartesian->y_label = (gchar **) realloc(cartesian->y_label, (i_stop + 1) * sizeof(gchar *)); /* iteration control */ i_start = g_strv_length(cartesian->y_label); if(i_start < i_stop){ i = i_start; }else{ i = i_stop; if(i_stop == 0){ /* set label to NULL */ cartesian->y_label = NULL; } } } if(cartesian->y_label != NULL){ for(; i < i_stop; i++){ /* initialize array to NULL */ cartesian->y_label[i] = NULL; } /* NULL terminated end */ cartesian->y_label[i] = NULL; } } } void ags_cartesian_fill_label(AgsCartesian *cartesian, gboolean do_x_label) { guint i_stop; guint i; if(cartesian == NULL || !AGS_IS_CARTESIAN(cartesian)){ return; } if(do_x_label){ i_stop = (guint) ceil((1.0 / cartesian->x_label_step_width) * (cartesian->x_end - cartesian->x_start)); if(cartesian->x_label != NULL && cartesian->x_label_func != NULL){ for(i = 0; i < i_stop; i++){ /* fill x label */ cartesian->x_label[i] = cartesian->x_label_func((cartesian->x_label_factor * (gdouble) i + (cartesian->x_start / cartesian->x_step_width) + (cartesian->x_label_start / cartesian->x_step_width)), cartesian->x_label_data); } } }else{ i_stop = (guint) ceil((1.0 / cartesian->y_label_step_height) * (cartesian->y_end - cartesian->y_start)); if(cartesian->y_label != NULL && cartesian->y_label_func != NULL){ for(i = 0; i < i_stop; i++){ /* fill y label */ cartesian->y_label[i] = cartesian->y_label_func((cartesian->y_label_factor * (gdouble) i + (cartesian->y_start / cartesian->y_step_height) + (cartesian->y_label_start / cartesian->y_step_height)), cartesian->y_label_data); } } } } /** * ags_cartesian_new: * * Create a new instance of #AgsCartesian * * Returns: the new #AgsCartesian * * Since: 3.0.0 */ AgsCartesian* ags_cartesian_new() { AgsCartesian *cartesian; cartesian = (AgsCartesian *) g_object_new(AGS_TYPE_CARTESIAN, NULL); return(cartesian); } gsequencer-3.1.3/ags/widget/ags_piano.c0000644000175000017500000011415213607210263014745 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include static GType ags_accessible_piano_get_type(void); void ags_piano_class_init(AgsPianoClass *piano); void ags_piano_init(AgsPiano *piano); void ags_accessible_piano_class_init(AtkObject *object); void ags_accessible_piano_value_interface_init(AtkValueIface *value); void ags_accessible_piano_action_interface_init(AtkActionIface *action); void ags_piano_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_piano_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_piano_finalize(GObject *gobject); AtkObject* ags_piano_get_accessible(GtkWidget *widget); void ags_piano_show(GtkWidget *widget); void ags_accessible_piano_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text); #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_piano_get_range(AtkValue *value); #endif gdouble ags_accessible_piano_get_increment(AtkValue *value); void ags_accessible_piano_set_value(AtkValue *value, gdouble new_value); gboolean ags_accessible_piano_do_action(AtkAction *action, gint i); gint ags_accessible_piano_get_n_actions(AtkAction *action); const gchar* ags_accessible_piano_get_description(AtkAction *action, gint i); const gchar* ags_accessible_piano_get_name(AtkAction *action, gint i); const gchar* ags_accessible_piano_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_piano_set_description(AtkAction *action, gint i); gchar* ags_accessible_piano_get_localized_name(AtkAction *action, gint i); void ags_piano_map(GtkWidget *widget); void ags_piano_realize(GtkWidget *widget); void ags_piano_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_piano_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_piano_size_allocate(GtkWidget *widget, GtkAllocation *allocation); gboolean ags_piano_button_press(GtkWidget *widget, GdkEventButton *event); gboolean ags_piano_button_release(GtkWidget *widget, GdkEventButton *event); gboolean ags_piano_key_press(GtkWidget *widget, GdkEventKey *event); gboolean ags_piano_key_release(GtkWidget *widget, GdkEventKey *event); gboolean ags_piano_motion_notify(GtkWidget *widget, GdkEventMotion *event); void ags_piano_draw(AgsPiano *piano, cairo_t *cr); void ags_piano_real_key_pressed(AgsPiano *piano, gchar *note, gint key_code); void ags_piano_real_key_released(AgsPiano *piano, gchar *note, gint key_code); void ags_piano_real_key_clicked(AgsPiano *piano, gchar *note, gint key_code); /** * SECTION:ags_piano * @short_description: A piano widget * @title: AgsPiano * @section_id: * @include: ags/widget/ags_piano.h * * #AgsPiano is a widget representing a clavier. */ enum{ KEY_PRESSED, KEY_RELEASED, KEY_CLICKED, LAST_SIGNAL, }; enum{ PROP_0, PROP_BASE_NOTE, PROP_BASE_KEY_CODE, PROP_KEY_WIDTH, PROP_KEY_HEIGHT, PROP_KEY_COUNT, }; static gpointer ags_piano_parent_class = NULL; static guint piano_signals[LAST_SIGNAL]; static GQuark quark_accessible_object = 0; GType ags_piano_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_piano = 0; static const GTypeInfo ags_piano_info = { sizeof(AgsPianoClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_piano_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsPiano), 0, /* n_preallocs */ (GInstanceInitFunc) ags_piano_init, }; ags_type_piano = g_type_register_static(GTK_TYPE_WIDGET, "AgsPiano", &ags_piano_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_piano); } return g_define_type_id__volatile; } static GType ags_accessible_piano_get_type(void) { static GType ags_type_accessible_piano = 0; if(!ags_type_accessible_piano){ const GTypeInfo ags_accesssible_piano_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_piano_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_value_interface_info = { (GInterfaceInitFunc) ags_accessible_piano_value_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_piano_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_piano = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessiblePiano", &ags_accesssible_piano_info, 0); g_type_add_interface_static(ags_type_accessible_piano, ATK_TYPE_VALUE, &atk_value_interface_info); g_type_add_interface_static(ags_type_accessible_piano, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_piano); } void ags_piano_class_init(AgsPianoClass *piano) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_piano_parent_class = g_type_class_peek_parent(piano); quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); /* GObjectClass */ gobject = (GObjectClass *) piano; gobject->set_property = ags_piano_set_property; gobject->get_property = ags_piano_get_property; gobject->finalize = ags_piano_finalize; /* properties */ /** * AgsPiano:base-note: * * The base note to use as lower. * * Since: 3.0.0 */ param_spec = g_param_spec_string("base-note", "base note", "The base note to use as lower", AGS_PIANO_DEFAULT_BASE_NOTE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BASE_NOTE, param_spec); /** * AgsPiano:base-key-code: * * The base key code. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("base-key-code", "base key code", "The base key code", 0, G_MAXUINT, AGS_PIANO_DEFAULT_BASE_KEY_CODE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BASE_KEY_CODE, param_spec); /** * AgsPiano:key-width: * * The key width to use for drawing a key. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("key-width", "key width", "The key width to use for drawing", 0, G_MAXUINT, AGS_PIANO_DEFAULT_KEY_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_KEY_WIDTH, param_spec); /** * AgsPiano:key-height: * * The key height to use for drawing a key. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("key-height", "key height", "The key height to use for drawing", 0, G_MAXUINT, AGS_PIANO_DEFAULT_KEY_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_KEY_HEIGHT, param_spec); /** * AgsPiano:key-count: * * The count of keys to be drawn. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("key-count", "key count", "The count of keys to draw", 0, G_MAXUINT, AGS_PIANO_DEFAULT_KEY_COUNT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_KEY_COUNT, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) piano; widget->get_accessible = ags_piano_get_accessible; // widget->map = ags_piano_map; widget->realize = ags_piano_realize; widget->get_preferred_width = ags_piano_get_preferred_width; widget->get_preferred_height = ags_piano_get_preferred_height; widget->size_allocate = ags_piano_size_allocate; widget->button_press_event = ags_piano_button_press; widget->button_release_event = ags_piano_button_release; widget->key_press_event = ags_piano_key_press; widget->key_release_event = ags_piano_key_release; widget->motion_notify_event = ags_piano_motion_notify; widget->draw = ags_piano_draw; widget->show = ags_piano_show; /* AgsPianoClass */ piano->key_pressed = ags_piano_real_key_pressed; piano->key_released = ags_piano_real_key_released; piano->key_clicked = NULL; /* signals */ /** * AgsPiano::key-pressed: * @piano: the #AgsPiano * @note: the note as string * @key_code: the numeric representation of the note * * The ::key-pressed signal notifies about key pressed. * * Since: 3.0.0 */ piano_signals[KEY_PRESSED] = g_signal_new("key-pressed", G_TYPE_FROM_CLASS(piano), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPianoClass, key_pressed), NULL, NULL, ags_widget_cclosure_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); /** * AgsPiano::key-released: * @piano: the #AgsPiano * @note: the note as string * @key_code: the numeric representation of the note * * The ::key-released signal notifies about key released. * * Since: 3.0.0 */ piano_signals[KEY_RELEASED] = g_signal_new("key-released", G_TYPE_FROM_CLASS(piano), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPianoClass, key_released), NULL, NULL, ags_widget_cclosure_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); /** * AgsPiano::key-clicked: * @piano: the #AgsPiano * @note: the note as string * @key_code: the numeric representation of the note * * The ::key-clicked signal notifies about key clicked. * * Since: 3.0.0 */ piano_signals[KEY_CLICKED] = g_signal_new("key-clicked", G_TYPE_FROM_CLASS(piano), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsPianoClass, key_clicked), NULL, NULL, ags_widget_cclosure_marshal_VOID__STRING_INT, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT); } void ags_accessible_piano_class_init(AtkObject *object) { /* empty */ } void ags_accessible_piano_value_interface_init(AtkValueIface *value) { value->get_current_value = NULL; value->get_maximum_value = NULL; value->get_minimum_value = NULL; value->set_current_value = NULL; value->get_minimum_increment = NULL; #ifdef HAVE_ATK_2_12 value->get_value_and_text = ags_accessible_piano_get_value_and_text; value->get_range = ags_accessible_piano_get_range; value->get_increment = ags_accessible_piano_get_increment; value->get_sub_ranges = NULL; value->set_value = ags_accessible_piano_set_value; #endif } void ags_accessible_piano_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_piano_do_action; action->get_n_actions = ags_accessible_piano_get_n_actions; action->get_description = ags_accessible_piano_get_description; action->get_name = ags_accessible_piano_get_name; action->get_keybinding = ags_accessible_piano_get_keybinding; action->set_description = ags_accessible_piano_set_description; action->get_localized_name = ags_accessible_piano_get_localized_name; } void ags_piano_init(AgsPiano *piano) { AtkObject *accessible; g_object_set(G_OBJECT(piano), "app-paintable", TRUE, "can-focus", TRUE, NULL); accessible = gtk_widget_get_accessible((GtkWidget *) piano); g_object_set(accessible, "accessible-name", "piano", "accessible-description", "Hit a key at cursor position", NULL); piano->flags = 0; piano->button_state = 0; piano->layout = AGS_PIANO_LAYOUT_VERTICAL; piano->font_size = 12; piano->base_note = g_strdup(AGS_PIANO_DEFAULT_BASE_NOTE); piano->base_key_code = AGS_PIANO_DEFAULT_BASE_KEY_CODE; piano->key_width = AGS_PIANO_DEFAULT_KEY_WIDTH; piano->key_height = AGS_PIANO_DEFAULT_KEY_HEIGHT; piano->key_count = AGS_PIANO_DEFAULT_KEY_COUNT; piano->cursor_position = -1; piano->current_key = 0; piano->active_key = NULL; piano->active_key_count = 0; } void ags_piano_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPiano *piano; piano = AGS_PIANO(gobject); switch(prop_id){ case PROP_BASE_NOTE: { gchar *base_note; base_note = g_value_get_string(value); if(base_note == piano->base_note){ return; } g_free(piano->base_note); piano->base_note = g_strdup(base_note); } break; case PROP_BASE_KEY_CODE: { piano->base_key_code = g_value_get_uint(value); } break; case PROP_KEY_WIDTH: { piano->key_width = g_value_get_uint(value); } break; case PROP_KEY_HEIGHT: { piano->key_height = g_value_get_uint(value); } break; case PROP_KEY_COUNT: { piano->key_count = g_value_get_uint(value); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_piano_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPiano *piano; piano = AGS_PIANO(gobject); switch(prop_id){ case PROP_BASE_NOTE: { g_value_set_string(value, piano->base_note); } break; case PROP_BASE_KEY_CODE: { g_value_set_uint(value, piano->base_key_code); } break; case PROP_KEY_WIDTH: { g_value_set_uint(value, piano->key_width); } break; case PROP_KEY_HEIGHT: { g_value_set_uint(value, piano->key_height); } break; case PROP_KEY_COUNT: { g_value_set_uint(value, piano->key_count); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_piano_finalize(GObject *gobject) { AgsPiano *piano; piano = AGS_PIANO(gobject); g_free(piano->base_note); /* call parent */ G_OBJECT_CLASS(ags_piano_parent_class)->finalize(gobject); } void ags_accessible_piano_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text) { AgsPiano *piano; piano = (AgsPiano *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); if(current_value != NULL){ *current_value = (gdouble) piano->cursor_position; } if(text != NULL){ *text = g_strdup_printf("%d", piano->cursor_position); } } #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_piano_get_range(AtkValue *value) { AgsPiano *piano; AtkRange *range; piano = (AgsPiano *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); range = atk_range_new((gdouble) piano->base_key_code, (gdouble) (piano->base_key_code + piano->key_count), "Valid lower and upper input range of this piano"); return(range); } #endif gdouble ags_accessible_piano_get_increment(AtkValue *value) { AgsPiano *piano; piano = (AgsPiano *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); return(1.0); } void ags_accessible_piano_set_value(AtkValue *value, gdouble new_value) { AgsPiano *piano; piano = (AgsPiano *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); piano->cursor_position = (gint) new_value; gtk_widget_queue_draw((GtkWidget *) piano); } gboolean ags_accessible_piano_do_action(AtkAction *action, gint i) { AgsPiano *piano; GdkEventKey *key_press, *key_release; if(!(i >= 0 && i < 3)){ return(FALSE); } piano = (AgsPiano *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = gdk_event_new(GDK_KEY_PRESS); key_release = gdk_event_new(GDK_KEY_RELEASE); switch(i){ case AGS_PIANO_MOVE_CURSOR_UP: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) piano, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) piano, (GdkEvent *) key_release); } break; case AGS_PIANO_MOVE_CURSOR_DOWN: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) piano, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) piano, (GdkEvent *) key_release); } break; case AGS_PIANO_HIT_KEY: { key_press->keyval = key_release->keyval = GDK_KEY_space; /* send event */ gtk_widget_event((GtkWidget *) piano, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) piano, (GdkEvent *) key_release); } break; } return(TRUE); } gint ags_accessible_piano_get_n_actions(AtkAction *action) { return(3); } const gchar* ags_accessible_piano_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "move up one piano key", "move down one piano key", "hit current piano key", }; if(i >= 0 && i < 3){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_piano_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "move-up", "move-down", "hit-key", }; if(i >= 0 && i < 3){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_piano_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "up", "down", "space" }; if(i >= 0 && i < 3){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_piano_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_piano_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_piano_map(GtkWidget *widget) { if(gtk_widget_get_realized (widget) && !gtk_widget_get_mapped(widget)){ GTK_WIDGET_CLASS(ags_piano_parent_class)->map(widget); gdk_window_show(gtk_widget_get_window(widget)); } } void ags_piano_realize(GtkWidget *widget) { AgsPiano *piano; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_PIANO(widget)); piano = AGS_PIANO(widget); gtk_widget_set_realized(widget, TRUE); gtk_widget_get_allocation(widget, &allocation); /* */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.event_mask = gtk_widget_get_events(widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); gtk_widget_queue_resize(widget); } AtkObject* ags_piano_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_piano_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_piano_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_piano_parent_class)->show(widget); } void ags_piano_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsPiano *piano; piano = AGS_PIANO(widget); if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ minimal_width[0] = natural_width[0] = piano->key_width; }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ minimal_width[0] = natural_width[0] = piano->key_count * piano->key_height; } } void ags_piano_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsPiano *piano; piano = AGS_PIANO(widget); if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ minimal_height[0] = natural_height[0] = piano->key_count * piano->key_height; }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ minimal_height[0] = natural_height[0] = piano->key_width; } } void ags_piano_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsPiano *piano; piano = AGS_PIANO(widget); if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ allocation->width = piano->key_width; allocation->height = piano->key_count * piano->key_height; }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ allocation->width = piano->key_count * piano->key_height; allocation->height = piano->key_width; } gtk_widget_set_allocation(widget, allocation); } gboolean ags_piano_button_press(GtkWidget *widget, GdkEventButton *event) { AgsPiano *piano; GtkAllocation allocation; guint width, height; guint x_start, y_start; piano = AGS_PIANO(widget); gtk_widget_get_allocation(widget, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; if(event->x >= x_start && event->x < width && event->y >= y_start && event->y < height){ if(event->button == 1){ gchar *note; piano->button_state |= AGS_PIANO_BUTTON_1_PRESSED; if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ piano->current_key = floor(event->y / piano->key_height); }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ piano->current_key = floor(event->x / piano->key_height); } note = ags_piano_key_code_to_note(piano->current_key); ags_piano_key_pressed(piano, note, piano->current_key); g_free(note); } } return(FALSE); } gboolean ags_piano_button_release(GtkWidget *widget, GdkEventButton *event) { AgsPiano *piano; gtk_widget_grab_focus(widget); piano = AGS_PIANO(widget); if(event->button == 1){ if((AGS_PIANO_BUTTON_1_PRESSED & (piano->button_state)) != 0){ gchar *note; note = ags_piano_key_code_to_note(piano->current_key); ags_piano_key_released(piano, note, piano->current_key); ags_piano_key_clicked(piano, note, piano->current_key); g_free(note); } piano->button_state &= (~AGS_PIANO_BUTTON_1_PRESSED); } return(FALSE); } gboolean ags_piano_key_press(GtkWidget *widget, GdkEventKey *event) { if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_piano_parent_class)->key_press_event(widget, event)); } return(TRUE); } gboolean ags_piano_key_release(GtkWidget *widget, GdkEventKey *event) { AgsPiano *piano; //TODO:JK: implement me if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_piano_parent_class)->key_release_event(widget, event)); } piano = AGS_PIANO(widget); switch(event->keyval){ case GDK_KEY_Up: case GDK_KEY_uparrow: { guint value, step, upper; value = piano->cursor_position; step = 1; upper = piano->base_key_code + piano->key_count; if(value + step > upper){ piano->cursor_position = upper; }else{ piano->cursor_position = value + step; } gtk_widget_queue_draw(widget); } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { guint value, step, lower; value = piano->cursor_position; step = 1; lower = piano->base_key_code; if(value - step < lower){ piano->cursor_position = lower; }else{ piano->cursor_position = value - step; } gtk_widget_queue_draw(widget); } break; case GDK_KEY_space: { gchar *note; guint key_code; note = ags_piano_key_code_to_note(piano->cursor_position); key_code = piano->cursor_position; ags_piano_key_pressed(piano, note, key_code); ags_piano_key_released(piano, note, key_code); ags_piano_key_clicked(piano, note, key_code); } break; } return(TRUE); } gboolean ags_piano_motion_notify(GtkWidget *widget, GdkEventMotion *event) { AgsPiano *piano; GtkAllocation allocation; guint width, height; guint x_start, y_start; gint new_current_key; piano = AGS_PIANO(widget); gtk_widget_get_allocation(widget, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; if((AGS_PIANO_BUTTON_1_PRESSED & (piano->button_state)) != 0){ new_current_key = 0; if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ new_current_key = floor(event->y / piano->key_height); }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ new_current_key = floor(event->x / piano->key_height); } /* emit released */ if(new_current_key != piano->current_key){ gchar *note; note = ags_piano_key_code_to_note(piano->current_key); ags_piano_key_released(piano, note, piano->current_key); ags_piano_key_clicked(piano, note, piano->current_key); g_free(note); } /* emit pressed */ if(event->x >= x_start && event->x < width && event->y >= y_start && event->y < height){ gchar *note; piano->current_key = new_current_key; note = ags_piano_key_code_to_note(new_current_key); ags_piano_key_pressed(piano, note, new_current_key); g_free(note); } } return(FALSE); } void ags_piano_draw(AgsPiano *piano, cairo_t *cr) { GtkStyleContext *piano_style_context; GtkAllocation allocation; guint width, height; guint x_start, y_start; guint big_control_width, big_control_height; guint small_control_width, small_control_height; guint control_x0, control_y0; gint *active_key; guint active_key_count; gint active_position; gboolean current_is_active; guint i, j; static const guint bitmap = 0x52a52a; if(!AGS_IS_PIANO(piano)){ return; } gtk_widget_get_allocation(piano, &allocation); /* style context */ piano_style_context = gtk_widget_get_style_context(GTK_WIDGET(piano)); width = 0; height = 0; if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ width = allocation.width; if(piano->key_count * piano->key_height < allocation.height){ height = piano->key_count * piano->key_height; }else{ height = allocation.height; } }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ if(piano->key_count * piano->key_height < allocation.width){ width = piano->key_count * piano->key_height; }else{ width = allocation.width; } height = allocation.height; } x_start = 0; y_start = 0; // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* clear bg */ gtk_render_background(piano_style_context, cr, 0.0, 0.0, (gdouble) x_start, (gdouble) y_start); gtk_render_background(piano_style_context, cr, (double) x_start + width, (double) y_start + height, (gdouble) allocation.width, (gdouble) allocation.height); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_rectangle(cr, (double) x_start, (double) y_start, (double) width, (double) height); cairo_fill(cr); /* draw */ control_x0 = x_start; control_y0 = y_start; big_control_width = 0; big_control_height = 0; small_control_width = 0; small_control_height = 0; if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ big_control_width = piano->key_width; big_control_height = piano->key_height; small_control_width = (2.0 / 3.0) * piano->key_width; small_control_height = piano->key_height; }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ big_control_width = piano->key_height; big_control_height = piano->key_width; small_control_width = piano->key_height; small_control_height = (2.0 / 3.0) * piano->key_width; } active_key = ags_piano_get_active_key(piano, &active_key_count); active_position = -1; cairo_set_line_width(cr, 1.0); /* apply base note */ j = piano->base_key_code % 12; for(i = 0; i < piano->key_count; i++){ /* check active */ current_is_active = FALSE; if(active_key != NULL && active_position + 1 < active_key_count && active_key[active_position] == piano->base_key_code + i){ current_is_active = TRUE; active_position++; } if(((1 << j) & bitmap) != 0){ /* draw semi tone key */ cairo_set_source_rgb(cr, 0.2, 0.2, 0.2); cairo_rectangle(cr, (double) control_x0, (double) control_y0, small_control_width, (double) small_control_height); cairo_fill(cr); cairo_set_source_rgb(cr, 0.68, 0.68, 0.68); cairo_move_to(cr, (double) (control_x0 + small_control_width), (double) (control_y0 + small_control_height / 2)); cairo_line_to(cr, (double) (control_x0 + big_control_width), (double) (control_y0 + small_control_height / 2)); cairo_stroke(cr); cairo_move_to(cr, (double) (control_x0 + big_control_width), (double) control_y0); cairo_line_to(cr, (double) (control_x0 + big_control_width), (double) (control_y0 + big_control_height)); cairo_stroke(cr); }else{ /* draw no semi tone key */ cairo_set_source_rgb(cr, 0.68, 0.68, 0.68); if(((1 << (j + 1)) & bitmap) == 0){ cairo_move_to(cr, (double) control_x0, (double) (control_y0 + big_control_height)); cairo_line_to(cr, (double) (control_x0 + big_control_width), (double) (control_y0 + big_control_height)); cairo_stroke(cr); } cairo_move_to(cr, (double) (control_x0 + big_control_width), (double) control_y0); cairo_line_to(cr, (double) (control_x0 + big_control_width), (double) (control_y0 + big_control_height)); cairo_stroke(cr); } /* iterate - offset */ if(piano->layout == AGS_PIANO_LAYOUT_VERTICAL){ control_y0 += piano->key_height; }else if(piano->layout == AGS_PIANO_LAYOUT_HORIZONTAL){ control_x0 += piano->key_height; } /* iterate - bitmap */ if(j == 11){ j = 0; }else{ j++; } } g_free(active_key); cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_piano_key_code_to_note: * @key_code: the key code * * Get note from key code. * * Returns: the note as string * * Since: 3.0.0 */ gchar* ags_piano_key_code_to_note(gint key_code) { gchar *note; gchar *prefix; gchar *suffix; guint tic_count; guint i; static const gchar* note_map[] = { AGS_PIANO_KEYS_OCTAVE_2_C, AGS_PIANO_KEYS_OCTAVE_2_CIS, AGS_PIANO_KEYS_OCTAVE_2_D, AGS_PIANO_KEYS_OCTAVE_2_DIS, AGS_PIANO_KEYS_OCTAVE_2_E, AGS_PIANO_KEYS_OCTAVE_2_F, AGS_PIANO_KEYS_OCTAVE_2_FIS, AGS_PIANO_KEYS_OCTAVE_2_G, AGS_PIANO_KEYS_OCTAVE_2_GIS, AGS_PIANO_KEYS_OCTAVE_2_A, AGS_PIANO_KEYS_OCTAVE_2_AIS, AGS_PIANO_KEYS_OCTAVE_2_H, AGS_PIANO_KEYS_OCTAVE_3_C, AGS_PIANO_KEYS_OCTAVE_3_CIS, AGS_PIANO_KEYS_OCTAVE_3_D, AGS_PIANO_KEYS_OCTAVE_3_DIS, AGS_PIANO_KEYS_OCTAVE_3_E, AGS_PIANO_KEYS_OCTAVE_3_F, AGS_PIANO_KEYS_OCTAVE_3_FIS, AGS_PIANO_KEYS_OCTAVE_3_G, AGS_PIANO_KEYS_OCTAVE_3_GIS, AGS_PIANO_KEYS_OCTAVE_3_A, AGS_PIANO_KEYS_OCTAVE_3_AIS, AGS_PIANO_KEYS_OCTAVE_3_H, }; note = NULL; if(key_code < 2 * 12){ /* prefix */ if(key_code >= 0){ prefix = note_map[key_code % 12]; }else{ prefix = note_map[(12 + (key_code % 12)) % 12]; } /* suffix */ tic_count = floor((24.0 - key_code) / 12.0); suffix = (gchar *) malloc((tic_count + 1) * sizeof(gchar)); for(i = 0; i < tic_count; i++){ suffix[i] = ','; } suffix[i] = '\0'; /* note */ note = g_strdup_printf("%s%s", prefix, suffix); }else if(key_code >= 2 * 12 && key_code < 3 * 12){ note = g_strdup(note_map[key_code - 2 * 12]); }else if(key_code >= 3 * 12 && key_code < 4 * 12){ note = g_strdup(note_map[key_code - 3 * 12]); }else{ /* prefix */ prefix = note_map[(key_code % 12) + 12]; /* suffix */ tic_count = floor((key_code - 48.0) / 12.0); suffix = (gchar *) malloc((tic_count + 1) * sizeof(gchar)); for(i = 0; i < tic_count; i++){ suffix[i] = '\''; } suffix[i] = '\0'; /* note */ note = g_strdup_printf("%s%s", prefix, suffix); } return(note); } void ags_piano_real_key_pressed(AgsPiano *piano, gchar *note, gint key_code) { guint i; i = piano->active_key_count; if(piano->active_key == NULL){ piano->active_key = (gint *) malloc(sizeof(gint)); }else{ piano->active_key = (gint *) realloc(piano->active_key, (i + 1) * sizeof(gint)); } piano->active_key[i] = key_code; piano->active_key_count += 1; /* queue draw */ gtk_widget_queue_draw((GtkWidget *) piano); } /** * ags_piano_key_pressed: * @piano: the #AgsPiano * @note: the string representation of key * @key_code: the key code * * Emits ::key-pressed event. * * Since: 3.0.0 */ void ags_piano_key_pressed(AgsPiano *piano, gchar *note, gint key_code) { g_return_if_fail(AGS_IS_PIANO(piano)); g_object_ref((GObject *) piano); g_signal_emit(G_OBJECT(piano), piano_signals[KEY_PRESSED], 0, note, key_code); g_object_unref((GObject *) piano); } void ags_piano_real_key_released(AgsPiano *piano, gchar *note, gint key_code) { gint position; position = -1; while(position < piano->active_key_count){ position++; if(piano->active_key[position] == key_code){ break; } } if(position != -1 && position < piano->active_key_count){ if(piano->active_key_count > 1){ gint *old_active_key; old_active_key = ags_piano_get_active_key(piano, NULL); piano->active_key = (gint *) realloc(piano->active_key, (piano->active_key_count - 1) * sizeof(gint)); if(position < piano->active_key_count - 1){ memcpy(&(piano->active_key[position]), &(old_active_key[position + 1]), (piano->active_key_count - position - 1) * sizeof(gint)); } free(old_active_key); }else{ free(piano->active_key); piano->active_key = NULL; } piano->active_key_count -= 1; } /* queue draw */ gtk_widget_queue_draw((GtkWidget *) piano); } /** * ags_piano_key_released: * @piano: the #AgsPiano * @note: the string representation of key * @key_code: the key code * * Emits ::key-released event. * * Since: 3.0.0 */ void ags_piano_key_released(AgsPiano *piano, gchar *note, gint key_code) { g_return_if_fail(AGS_IS_PIANO(piano)); g_object_ref((GObject *) piano); g_signal_emit(G_OBJECT(piano), piano_signals[KEY_RELEASED], 0, note, key_code); g_object_unref((GObject *) piano); } /** * ags_piano_key_clicked: * @piano: the #AgsPiano * @note: the string representation of key * @key_code: the key code * * Emits ::key-clicked event. * * Since: 3.0.0 */ void ags_piano_key_clicked(AgsPiano *piano, gchar *note, gint key_code) { g_return_if_fail(AGS_IS_PIANO(piano)); g_object_ref((GObject *) piano); g_signal_emit(G_OBJECT(piano), piano_signals[KEY_CLICKED], 0, note, key_code); g_object_unref((GObject *) piano); } /** * ags_piano_get_active_key: * @piano: the #AgsPiano * @active_key_count: return location of count of active keys * * Get active keys. * * Returns: the active keys as gint array * * Since: 3.0.0 */ gint* ags_piano_get_active_key(AgsPiano *piano, guint *active_key_count) { gint *active_key; if(!AGS_IS_PIANO(piano)){ if(active_key_count != NULL){ *active_key_count = 0; } return(NULL); } if(piano->active_key_count > 0){ active_key = (gint *) malloc(piano->active_key_count * sizeof(gint)); memcpy(active_key, piano->active_key, piano->active_key_count * sizeof(gint)); }else{ active_key = NULL; } if(active_key_count != NULL){ *active_key_count = piano->active_key_count; } return(active_key); } /** * ags_piano_new: * * Create a new instance of #AgsPiano. * * Returns: the new #AgsPiano instance * * Since: 3.0.0 */ AgsPiano* ags_piano_new() { AgsPiano *piano; piano = (AgsPiano *) g_object_new(AGS_TYPE_PIANO, NULL); return(piano); } gsequencer-3.1.3/ags/widget/ags_vindicator.c0000644000175000017500000001745413607210263016010 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_vindicator.h" void ags_vindicator_class_init(AgsVIndicatorClass *indicator); void ags_vindicator_init(AgsVIndicator *indicator); void ags_vindicator_show(GtkWidget *widget); void ags_vindicator_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_vindicator_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_vindicator_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_vindicator_draw(AgsVIndicator *indicator, cairo_t *cr); /** * SECTION:ags_vindicator * @short_description: A vertical indicator widget * @title: AgsVIndicator * @section_id: * @include: ags/widget/ags_vindicator.h * * #AgsVIndicator is a widget visualizing a #GtkAdjustment. */ static gpointer ags_vindicator_parent_class = NULL; GType ags_vindicator_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_vindicator = 0; static const GTypeInfo ags_vindicator_info = { sizeof(AgsVIndicatorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_vindicator_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsVIndicator), 0, /* n_preallocs */ (GInstanceInitFunc) ags_vindicator_init, }; ags_type_vindicator = g_type_register_static(AGS_TYPE_INDICATOR, "AgsVIndicator", &ags_vindicator_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_vindicator); } return g_define_type_id__volatile; } void ags_vindicator_class_init(AgsVIndicatorClass *indicator) { GtkWidgetClass *widget; ags_vindicator_parent_class = g_type_class_peek_parent(indicator); /* GtkWidgetClass */ widget = (GtkWidgetClass *) indicator; widget->get_preferred_width = ags_vindicator_get_preferred_width; widget->get_preferred_height = ags_vindicator_get_preferred_height; widget->size_allocate = ags_vindicator_size_allocate; widget->draw = ags_vindicator_draw; } void ags_vindicator_init(AgsVIndicator *indicator) { g_object_set(indicator, "segment-width", AGS_VINDICATOR_DEFAULT_SEGMENT_WIDTH, "segment-height", AGS_VINDICATOR_DEFAULT_SEGMENT_HEIGHT, NULL); } void ags_vindicator_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsIndicator *indicator; indicator = AGS_INDICATOR(widget); minimal_width[0] = natural_width[0] = indicator->segment_width; } void ags_vindicator_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsIndicator *indicator; indicator = AGS_INDICATOR(widget); minimal_height[0] = natural_height[0] = (indicator->segment_count * indicator->segment_height) + ((indicator->segment_count - 1) * indicator->segment_padding); } void ags_vindicator_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsIndicator *indicator; indicator = AGS_INDICATOR(widget); allocation->width = indicator->segment_width; allocation->height = (indicator->segment_count * indicator->segment_height) + ((indicator->segment_count - 1) * indicator->segment_padding); GTK_WIDGET_CLASS(ags_vindicator_parent_class)->size_allocate(widget, allocation); } void ags_vindicator_draw(AgsVIndicator *vindicator, cairo_t *cr) { GtkWidget *widget; GtkAdjustment *adjustment; GtkStyleContext *vindicator_style_context; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; guint width, height; guint padding_top, padding_left; guint segment_width, segment_height; guint padding; guint i; GValue value = {0,}; widget = GTK_WIDGET(vindicator); adjustment = AGS_INDICATOR(vindicator)->adjustment; if(adjustment == NULL){ return; } gtk_widget_get_allocation(GTK_WIDGET(vindicator), &allocation); /* style context */ vindicator_style_context = gtk_widget_get_style_context(GTK_WIDGET(vindicator)); gtk_style_context_get_property(vindicator_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(vindicator_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(vindicator_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); width = AGS_INDICATOR(vindicator)->segment_width; height = (AGS_INDICATOR(vindicator)->segment_count * AGS_INDICATOR(vindicator)->segment_height) + ((AGS_INDICATOR(vindicator)->segment_count - 1) * AGS_INDICATOR(vindicator)->segment_padding); padding_top = (allocation.height - height) / 2; padding_left = (allocation.width - width) / 2; segment_width = AGS_INDICATOR(vindicator)->segment_width; segment_height = AGS_INDICATOR(vindicator)->segment_height; padding = AGS_INDICATOR(vindicator)->segment_padding; // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* clear bg */ gtk_render_background(vindicator_style_context, cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); for(i = 0; i < AGS_INDICATOR(vindicator)->segment_count; i++){ if(gtk_adjustment_get_value(adjustment) > 0.0 && gtk_adjustment_get_value(adjustment) > (gdouble) i){ // printf("#"); /* active */ cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); }else{ // printf("."); /* normal */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); } cairo_rectangle(cr, padding_left, padding_top + (height - i * (segment_height + padding) - segment_height), segment_width, segment_height); cairo_fill(cr); /* outline */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_rectangle(cr, padding_left, padding_top + (height - i * (segment_height + padding) - segment_height), segment_width, segment_height); cairo_stroke(cr); } // printf("\n"); cairo_pop_group_to_source(cr); cairo_paint(cr); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_vindicator_new: * * Create a new instance of #AgsVIndicator. * * Returns: the new #AgsVIndicator * * Since: 3.0.0 */ AgsVIndicator* ags_vindicator_new() { AgsVIndicator *indicator; GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); indicator = (AgsVIndicator *) g_object_new(AGS_TYPE_VINDICATOR, "adjustment", adjustment, NULL); return(indicator); } gsequencer-3.1.3/ags/widget/ags_level.c0000644000175000017500000007511013607210263014746 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #ifndef __APPLE__ #include #endif #include #include #include static GType ags_accessible_level_get_type(void); void ags_level_class_init(AgsLevelClass *level); void ags_level_init(AgsLevel *level); void ags_accessible_level_class_init(AtkObject *object); void ags_accessible_level_value_interface_init(AtkValueIface *value); void ags_accessible_level_action_interface_init(AtkActionIface *action); void ags_level_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_level_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_level_finalize(GObject *gobject); AtkObject* ags_level_get_accessible(GtkWidget *widget); void ags_level_show(GtkWidget *widget); void ags_accessible_level_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text); #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_level_get_range(AtkValue *value); #endif gdouble ags_accessible_level_get_increment(AtkValue *value); void ags_accessible_level_set_value(AtkValue *value, gdouble new_value); gboolean ags_accessible_level_do_action(AtkAction *action, gint i); gint ags_accessible_level_get_n_actions(AtkAction *action); const gchar* ags_accessible_level_get_description(AtkAction *action, gint i); const gchar* ags_accessible_level_get_name(AtkAction *action, gint i); const gchar* ags_accessible_level_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_level_set_description(AtkAction *action, gint i); gchar* ags_accessible_level_get_localized_name(AtkAction *action, gint i); void ags_level_map(GtkWidget *widget); void ags_level_realize(GtkWidget *widget); void ags_level_size_allocate(GtkWidget *widget, GtkAllocation *allocation); void ags_level_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_level_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); gboolean ags_level_button_press(GtkWidget *widget, GdkEventButton *event); gboolean ags_level_button_release(GtkWidget *widget, GdkEventButton *event); gboolean ags_level_key_press(GtkWidget *widget, GdkEventKey *event); gboolean ags_level_key_release(GtkWidget *widget, GdkEventKey *event); gboolean ags_level_motion_notify(GtkWidget *widget, GdkEventMotion *event); void ags_level_send_configure(AgsLevel *level); void ags_level_draw(AgsLevel *level, cairo_t *cr); /** * SECTION:ags_level * @short_description: A level widget * @title: AgsLevel * @section_id: * @include: ags/widget/ags_level.h * * #AgsLevel is a widget that shows you a meter. */ enum{ VALUE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, PROP_LEVEL_WIDTH, PROP_LEVEL_HEIGHT, PROP_LOWER, PROP_UPPER, PROP_NORMALIZED_VOLUME, }; static gpointer ags_level_parent_class = NULL; static guint level_signals[LAST_SIGNAL]; static GQuark quark_accessible_object = 0; GType ags_level_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_level = 0; static const GTypeInfo ags_level_info = { sizeof(AgsLevelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_level_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsLevel), 0, /* n_preallocs */ (GInstanceInitFunc) ags_level_init, }; ags_type_level = g_type_register_static(GTK_TYPE_WIDGET, "AgsLevel", &ags_level_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_level); } return g_define_type_id__volatile; } static GType ags_accessible_level_get_type(void) { static GType ags_type_accessible_level = 0; if(!ags_type_accessible_level){ const GTypeInfo ags_accesssible_level_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_level_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_value_interface_info = { (GInterfaceInitFunc) ags_accessible_level_value_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_level_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_level = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleLevel", &ags_accesssible_level_info, 0); g_type_add_interface_static(ags_type_accessible_level, ATK_TYPE_VALUE, &atk_value_interface_info); g_type_add_interface_static(ags_type_accessible_level, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_level); } void ags_level_class_init(AgsLevelClass *level) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_level_parent_class = g_type_class_peek_parent(level); quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); /* GObjectClass */ gobject = (GObjectClass *) level; gobject->set_property = ags_level_set_property; gobject->get_property = ags_level_get_property; gobject->finalize = ags_level_finalize; /* properties */ /** * AgsLevel:level-width: * * The level width to use for drawing a level. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("level-width", "level width", "The level width to use for drawing", 0, G_MAXUINT, AGS_LEVEL_DEFAULT_LEVEL_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LEVEL_WIDTH, param_spec); /** * AgsLevel:level-height: * * The level height to use for drawing a level. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("level-height", "level height", "The level height to use for drawing", 0, G_MAXUINT, AGS_LEVEL_DEFAULT_LEVEL_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LEVEL_HEIGHT, param_spec); /** * AgsLevel:lower: * * The level's lower range. * * Since: 3.0.0 */ param_spec = g_param_spec_double("lower", "lower", "The lower of level", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_LEVEL_DEFAULT_LOWER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_LOWER, param_spec); /** * AgsLevel:upper: * * The level's upper range. * * Since: 3.0.0 */ param_spec = g_param_spec_double("upper", "upper", "The upper of level", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_LEVEL_DEFAULT_UPPER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_UPPER, param_spec); /** * AgsLevel:normalized-volume: * * The level's default value. * * Since: 3.0.0 */ param_spec = g_param_spec_double("normalized-volume", "normalized volume", "The normalized volume of level", -G_MAXDOUBLE, G_MAXDOUBLE, AGS_LEVEL_DEFAULT_NORMALIZED_VOLUME, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NORMALIZED_VOLUME, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) level; widget->get_accessible = ags_level_get_accessible; // widget->map = ags_level_map; widget->realize = ags_level_realize; widget->size_allocate = ags_level_size_allocate; widget->get_preferred_width = ags_level_get_preferred_width; widget->get_preferred_height = ags_level_get_preferred_height; widget->button_press_event = ags_level_button_press; widget->button_release_event = ags_level_button_release; widget->key_press_event = ags_level_key_press; widget->key_release_event = ags_level_key_release; widget->motion_notify_event = ags_level_motion_notify; widget->draw = ags_level_draw; widget->show = ags_level_show; /* AgsLevelClass */ level->value_changed = NULL; /* signals */ /** * AgsLevel::value-changed: * @level: the #AgsLevel * @normalized_volume: the changed default value * * The ::value-changed signal notifies about modified default value. * * Since: 3.0.0 */ level_signals[VALUE_CHANGED] = g_signal_new("value-changed", G_TYPE_FROM_CLASS(level), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsLevelClass, value_changed), NULL, NULL, g_cclosure_marshal_VOID__DOUBLE, G_TYPE_NONE, 1, G_TYPE_DOUBLE); } void ags_accessible_level_class_init(AtkObject *object) { /* empty */ } void ags_accessible_level_value_interface_init(AtkValueIface *value) { value->get_current_value = NULL; value->get_maximum_value = NULL; value->get_minimum_value = NULL; value->set_current_value = NULL; value->get_minimum_increment = NULL; #ifdef HAVE_ATK_2_12 value->get_value_and_text = ags_accessible_level_get_value_and_text; value->get_range = ags_accessible_level_get_range; value->get_increment = ags_accessible_level_get_increment; value->get_sub_ranges = NULL; value->set_value = ags_accessible_level_set_value; #endif } void ags_accessible_level_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_level_do_action; action->get_n_actions = ags_accessible_level_get_n_actions; action->get_description = ags_accessible_level_get_description; action->get_name = ags_accessible_level_get_name; action->get_keybinding = ags_accessible_level_get_keybinding; action->set_description = ags_accessible_level_set_description; action->get_localized_name = ags_accessible_level_get_localized_name; } void ags_level_init(AgsLevel *level) { AtkObject *accessible; g_object_set(G_OBJECT(level), "app-paintable", TRUE, "can-focus", TRUE, NULL); accessible = gtk_widget_get_accessible((GtkWidget *) level); g_object_set(accessible, "accessible-name", "level", "accessible-description", "Specify a default value", NULL); level->flags = 0; level->key_mask = 0; level->button_state = 0; level->layout = AGS_LEVEL_LAYOUT_VERTICAL; level->font_size = 11; level->level_width = AGS_LEVEL_DEFAULT_LEVEL_WIDTH; level->level_height = AGS_LEVEL_DEFAULT_LEVEL_HEIGHT; level->lower = AGS_LEVEL_DEFAULT_LOWER; level->upper = AGS_LEVEL_DEFAULT_UPPER; level->normalized_volume = AGS_LEVEL_DEFAULT_NORMALIZED_VOLUME; level->step_count = AGS_LEVEL_DEFAULT_STEP_COUNT; level->page_size = AGS_LEVEL_DEFAULT_PAGE_SIZE; level->samplerate = AGS_LEVEL_DEFAULT_SAMPLERATE; level->audio_channel = NULL; level->audio_channel_count = 0; } void ags_level_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsLevel *level; level = AGS_LEVEL(gobject); switch(prop_id){ case PROP_LEVEL_WIDTH: { level->level_width = g_value_get_uint(value); } break; case PROP_LEVEL_HEIGHT: { level->level_height = g_value_get_uint(value); } break; case PROP_LOWER: { level->lower = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) level); } break; case PROP_UPPER: { level->upper = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) level); } break; case PROP_NORMALIZED_VOLUME: { level->normalized_volume = g_value_get_double(value); gtk_widget_queue_draw((GtkWidget *) level); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_level_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsLevel *level; level = AGS_LEVEL(gobject); switch(prop_id){ case PROP_LEVEL_WIDTH: { g_value_set_uint(value, level->level_width); } break; case PROP_LEVEL_HEIGHT: { g_value_set_uint(value, level->level_height); } break; case PROP_LOWER: { g_value_set_double(value, level->lower); } break; case PROP_UPPER: { g_value_set_double(value, level->upper); } break; case PROP_NORMALIZED_VOLUME: { g_value_set_double(value, level->normalized_volume); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_level_finalize(GObject *gobject) { AgsLevel *level; level = AGS_LEVEL(gobject); /* call parent */ G_OBJECT_CLASS(ags_level_parent_class)->finalize(gobject); } void ags_accessible_level_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text) { AgsLevel *level; level = (AgsLevel *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); if(current_value != NULL){ *current_value = level->normalized_volume; } if(text != NULL){ *text = g_strdup_printf("%f", level->normalized_volume); } } #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_level_get_range(AtkValue *value) { AgsLevel *level; AtkRange *range; level = (AgsLevel *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); range = atk_range_new(level->lower, level->upper, "Valid lower and upper input range of this level"); return(range); } #endif gdouble ags_accessible_level_get_increment(AtkValue *value) { AgsLevel *level; level = (AgsLevel *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); return((level->upper - level->lower) / level->step_count); } void ags_accessible_level_set_value(AtkValue *value, gdouble new_value) { AgsLevel *level; level = (AgsLevel *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); level->normalized_volume = new_value; gtk_widget_queue_draw((GtkWidget *) level); } gboolean ags_accessible_level_do_action(AtkAction *action, gint i) { AgsLevel *level; GdkEventKey *key_press, *key_release; if(!(i >= 0 && i < 4)){ return(FALSE); } level = (AgsLevel *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = gdk_event_new(GDK_KEY_PRESS); key_release = gdk_event_new(GDK_KEY_RELEASE); switch(i){ case AGS_LEVEL_STEP_UP: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_release); } break; case AGS_LEVEL_STEP_DOWN: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_release); } break; case AGS_LEVEL_PAGE_UP: { key_press->keyval = key_release->keyval = GDK_KEY_Page_Up; /* send event */ gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_release); } break; case AGS_LEVEL_PAGE_DOWN: { key_press->keyval = key_release->keyval = GDK_KEY_Page_Down; /* send event */ gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) level, (GdkEvent *) key_release); } break; } return(TRUE); } gint ags_accessible_level_get_n_actions(AtkAction *action) { return(4); } const gchar* ags_accessible_level_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "step up level default value", "step down level default value", "page up level default value", "page down level default value", }; if(i >= 0 && i < 4){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_level_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "step-up", "step-down", "page-up", "page-down", }; if(i >= 0 && i < 4){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_level_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "up", "down", "page-up", "page-down", }; if(i >= 0 && i < 4){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_level_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_level_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_level_map(GtkWidget *widget) { if(gtk_widget_get_realized (widget) && !gtk_widget_get_mapped(widget)){ GTK_WIDGET_CLASS(ags_level_parent_class)->map(widget); gdk_window_show(gtk_widget_get_window(widget)); } } void ags_level_realize(GtkWidget *widget) { AgsLevel *level; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_LEVEL(widget)); level = AGS_LEVEL(widget); gtk_widget_set_realized(widget, TRUE); gtk_widget_get_allocation(widget, &allocation); /* */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = level->level_width; attributes.height = level->level_height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.event_mask = gtk_widget_get_events(widget); attributes.event_mask |= (GDK_EXPOSURE_MASK); window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); ags_level_send_configure(level); } void ags_level_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsLevel *level; GdkWindow *window; g_return_if_fail(AGS_IS_LEVEL(widget)); g_return_if_fail(allocation != NULL); level = AGS_LEVEL(widget); if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ allocation->height = level->level_height; allocation->width = level->level_width; }else if(level->layout == AGS_LEVEL_LAYOUT_HORIZONTAL){ allocation->width = level->level_height; allocation->height = level->level_width; } gtk_widget_set_allocation(widget, allocation); if(gtk_widget_get_realized(widget)){ gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); ags_level_send_configure(level); } } void ags_level_send_configure(AgsLevel *level) { GtkAllocation allocation; GtkWidget *widget; GdkEvent *event = gdk_event_new (GDK_CONFIGURE); widget = GTK_WIDGET(level); gtk_widget_get_allocation(widget, &allocation); event->configure.window = g_object_ref(gtk_widget_get_window (widget)); event->configure.send_event = TRUE; event->configure.x = allocation.x; event->configure.y = allocation.y; event->configure.width = allocation.width; event->configure.height = allocation.height; gtk_widget_event(widget, event); gdk_event_free(event); } void ags_level_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsLevel *level; level = AGS_LEVEL(widget); if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ minimal_width[0] = natural_width[0] = level->level_width; }else if(level->layout == AGS_LEVEL_LAYOUT_HORIZONTAL){ minimal_width[0] = natural_width[0] = level->level_height; } } void ags_level_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsLevel *level; level = AGS_LEVEL(widget); if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ minimal_height[0] = natural_height[0] = level->level_height; }else if(level->layout == AGS_LEVEL_LAYOUT_HORIZONTAL){ minimal_height[0] = natural_height[0] = level->level_width; } } AtkObject* ags_level_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_level_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_level_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_level_parent_class)->show(widget); } gboolean ags_level_button_press(GtkWidget *widget, GdkEventButton *event) { AgsLevel *level; GtkAllocation allocation; guint width, height; guint x_start, y_start; level = AGS_LEVEL(widget); gtk_widget_get_allocation(widget, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; if(event->x >= x_start && event->x < width && event->y >= y_start && event->y < height){ if(event->button == 1){ gdouble c_range; gdouble normalized_volume; level->button_state |= AGS_LEVEL_BUTTON_1_PRESSED; c_range = level->upper - level->lower; normalized_volume = 0.0; if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ normalized_volume = event->y / c_range; }else if(level->layout == AGS_LEVEL_LAYOUT_HORIZONTAL){ normalized_volume = event->x / c_range; } level->normalized_volume = normalized_volume; gtk_widget_queue_draw((GtkWidget *) level); ags_level_value_changed(level, normalized_volume); } } return(FALSE); } gboolean ags_level_button_release(GtkWidget *widget, GdkEventButton *event) { AgsLevel *level; gtk_widget_grab_focus(widget); level = AGS_LEVEL(widget); if(event->button == 1){ if((AGS_LEVEL_BUTTON_1_PRESSED & (level->button_state)) != 0){ gdouble c_range; gdouble normalized_volume; level->button_state |= AGS_LEVEL_BUTTON_1_PRESSED; c_range = level->upper - level->lower; normalized_volume = 0.0; if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ normalized_volume = event->y / c_range; }else if(level->layout == AGS_LEVEL_LAYOUT_HORIZONTAL){ normalized_volume = event->x / c_range; } level->normalized_volume = normalized_volume; gtk_widget_queue_draw((GtkWidget *) level); ags_level_value_changed(level, normalized_volume); } level->button_state &= (~AGS_LEVEL_BUTTON_1_PRESSED); } return(FALSE); } gboolean ags_level_key_press(GtkWidget *widget, GdkEventKey *event) { if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_level_parent_class)->key_press_event(widget, event)); } return(TRUE); } gboolean ags_level_key_release(GtkWidget *widget, GdkEventKey *event) { AgsLevel *level; //TODO:JK: implement me if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_level_parent_class)->key_release_event(widget, event)); } level = AGS_LEVEL(widget); switch(event->keyval){ case GDK_KEY_Up: case GDK_KEY_uparrow: { gdouble c_range; gdouble step; c_range = level->upper - level->lower; step = c_range / level->step_count; if(level->normalized_volume + log(step) > level->upper){ level->normalized_volume = level->upper; }else{ level->normalized_volume += log(step); } gtk_widget_queue_draw(widget); ags_level_value_changed(level, level->normalized_volume); } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { gdouble c_range; gdouble step; c_range = level->upper - level->lower; step = c_range / level->step_count; if(level->normalized_volume - log(step) < level->lower){ level->normalized_volume = level->lower; }else{ level->normalized_volume -= log(step); } gtk_widget_queue_draw(widget); ags_level_value_changed(level, level->normalized_volume); } break; case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up: { gdouble c_range; gdouble page; c_range = level->upper - level->lower; page = level->page_size * (c_range / level->step_count); if(level->normalized_volume + log(page) > level->upper){ level->normalized_volume = level->upper; }else{ level->normalized_volume += log(page); } gtk_widget_queue_draw(widget); ags_level_value_changed(level, level->normalized_volume); } break; case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down: { gdouble c_range; gdouble page; c_range = level->upper - level->lower; page = level->page_size * (c_range / level->step_count); if(level->normalized_volume - log(page) < level->lower){ level->normalized_volume = level->lower; }else{ level->normalized_volume -= log(page); } gtk_widget_queue_draw(widget); ags_level_value_changed(level, level->normalized_volume); } break; } return(TRUE); } gboolean ags_level_motion_notify(GtkWidget *widget, GdkEventMotion *event) { AgsLevel *level; GtkAllocation allocation; guint width, height; guint x_start, y_start; level = AGS_LEVEL(widget); gtk_widget_get_allocation(widget, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; if((AGS_LEVEL_BUTTON_1_PRESSED & (level->button_state)) != 0){ gdouble c_range; gdouble new_normalized_volume; level->button_state |= AGS_LEVEL_BUTTON_1_PRESSED; c_range = level->upper - level->lower; new_normalized_volume = 0.0; if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ new_normalized_volume = event->y / c_range; }else if(level->layout == AGS_LEVEL_LAYOUT_HORIZONTAL){ new_normalized_volume = event->x / c_range; } if(new_normalized_volume != level->normalized_volume){ level->normalized_volume = new_normalized_volume; gtk_widget_queue_draw((GtkWidget *) level); ags_level_value_changed(level, new_normalized_volume); } } return(FALSE); } void ags_level_draw(AgsLevel *level, cairo_t *cr) { PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; GtkAllocation allocation; gchar *font_name; gchar *text; guint width, height; guint x_start, y_start; g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); gtk_widget_get_allocation(level, &allocation); width = allocation.width; height = allocation.height; x_start = 0; y_start = 0; // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* background */ cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_rectangle(cr, (gdouble) x_start, (gdouble) y_start, (gdouble) width, (gdouble) height); cairo_fill(cr); /* box */ cairo_set_source_rgb(cr, 0.5, 0.4, 0.0); cairo_set_line_width(cr, 1.0); cairo_rectangle(cr, (gdouble) x_start, (gdouble) y_start, (gdouble) width, (gdouble) height); cairo_stroke(cr); /* draw level */ //TODO:JK: implement me /* show samplerate */ text = g_strdup_printf("%u [Hz]", level->samplerate); layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, text, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, level->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); if(level->layout == AGS_LEVEL_LAYOUT_VERTICAL){ cairo_move_to(cr, x_start + (logical_rect.height / PANGO_SCALE) / 2.0, y_start + height - 1.0); cairo_rotate(cr, 2 * M_PI * 0.75); }else{ cairo_move_to(cr, x_start, y_start + (logical_rect.height / PANGO_SCALE) / 2.0 + 1.0); } pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(font_name); g_free(text); cairo_pop_group_to_source(cr); cairo_paint(cr); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_level_value_changed: * @level: the #AgsLevel * @normalized_volume: the normalized volume * * Emits ::value-changed event. * * Since: 3.0.0 */ void ags_level_value_changed(AgsLevel *level, gdouble normalized_volume) { g_return_if_fail(AGS_IS_LEVEL(level)); g_object_ref((GObject *) level); g_signal_emit(G_OBJECT(level), level_signals[VALUE_CHANGED], 0, normalized_volume); g_object_unref((GObject *) level); } /** * ags_level_new: * * Create a new instance of #AgsLevel. * * Returns: the new #AgsLevel instance * * Since: 3.0.0 */ AgsLevel* ags_level_new() { AgsLevel *level; level = (AgsLevel *) g_object_new(AGS_TYPE_LEVEL, NULL); return(level); } gsequencer-3.1.3/ags/widget/ags_dial.c0000644000175000017500000014666313607210263014564 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include "ags_dial.h" #include #include #include #include static GType ags_accessible_dial_get_type(void); void ags_dial_class_init(AgsDialClass *dial); void ags_accessible_dial_class_init(AtkObject *object); void ags_accessible_dial_value_interface_init(AtkValueIface *value); void ags_accessible_dial_action_interface_init(AtkActionIface *action); void ags_dial_init(AgsDial *dial); void ags_dial_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_dial_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); AtkObject* ags_dial_get_accessible(GtkWidget *widget); void ags_dial_show(GtkWidget *widget); void ags_accessible_dial_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text); #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_dial_get_range(AtkValue *value); #endif gdouble ags_accessible_dial_get_increment(AtkValue *value); void ags_accessible_dial_set_value(AtkValue *value, gdouble new_value); gboolean ags_accessible_dial_do_action(AtkAction *action, gint i); gint ags_accessible_dial_get_n_actions(AtkAction *action); const gchar* ags_accessible_dial_get_description(AtkAction *action, gint i); const gchar* ags_accessible_dial_get_name(AtkAction *action, gint i); const gchar* ags_accessible_dial_get_keybinding(AtkAction *action, gint i); gboolean ags_accessible_dial_set_description(AtkAction *action, gint i); gchar* ags_accessible_dial_get_localized_name(AtkAction *action, gint i); void ags_dial_map(GtkWidget *widget); void ags_dial_realize(GtkWidget *widget); void ags_dial_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width); void ags_dial_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height); void ags_dial_size_allocate(GtkWidget *widget, GtkAllocation *allocation); gboolean ags_dial_button_press(GtkWidget *widget, GdkEventButton *event); gboolean ags_dial_button_release(GtkWidget *widget, GdkEventButton *event); gboolean ags_dial_key_press(GtkWidget *widget, GdkEventKey *event); gboolean ags_dial_key_release(GtkWidget *widget, GdkEventKey *event); gboolean ags_dial_motion_notify(GtkWidget *widget, GdkEventMotion *event); void ags_dial_send_configure(AgsDial *dial); void ags_dial_draw(AgsDial *dial, cairo_t *cr); void ags_dial_adjustment_changed_callback(GtkAdjustment *adjustment, AgsDial *dial); gboolean ags_dial_button_press_is_down_event(AgsDial *dial, GdkEventButton *event, gint padding_left, guint padding_top); gboolean ags_dial_button_press_is_up_event(AgsDial *dial, GdkEventButton *event, gint padding_left, guint padding_top); gboolean ags_dial_button_press_is_dial_event(AgsDial *dial, GdkEventButton *event, gint padding_left, guint padding_top, gint dial_left_position); void ags_dial_motion_notify_do_dial(AgsDial *dial, GdkEventMotion *event); void ags_dial_motion_notify_do_seemless_dial(AgsDial *dial, GdkEventMotion *event); /** * SECTION:ags_dial * @short_description: A dial widget * @title: AgsDial * @section_id: * @include: ags/widget/ags_dial.h * * #AgsDial is a widget representing a #GtkAdjustment. */ enum{ VALUE_CHANGED, LAST_SIGNAL, }; enum{ PROP_0, PROP_RADIUS, PROP_OUTLINE_STRENGTH, PROP_FONT_SIZE, PROP_BUTTON_WIDTH, PROP_BUTTON_HEIGHT, PROP_MARGIN_LEFT, PROP_MARGIN_RIGHT, PROP_ADJUSTMENT, PROP_SCALE_PRECISION, }; static gpointer ags_dial_parent_class = NULL; static guint dial_signals[LAST_SIGNAL]; static GQuark quark_accessible_object = 0; GType ags_dial_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_dial = 0; static const GTypeInfo ags_dial_info = { sizeof(AgsDialClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_dial_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsDial), 0, /* n_preallocs */ (GInstanceInitFunc) ags_dial_init, }; ags_type_dial = g_type_register_static(GTK_TYPE_WIDGET, "AgsDial", &ags_dial_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_dial); } return g_define_type_id__volatile; } static GType ags_accessible_dial_get_type(void) { static GType ags_type_accessible_dial = 0; if(!ags_type_accessible_dial){ const GTypeInfo ags_accesssible_dial_info = { sizeof(GtkAccessibleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_accessible_dial_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GtkAccessible), 0, /* n_preallocs */ NULL, NULL }; static const GInterfaceInfo atk_value_interface_info = { (GInterfaceInitFunc) ags_accessible_dial_value_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo atk_action_interface_info = { (GInterfaceInitFunc) ags_accessible_dial_action_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_accessible_dial = g_type_register_static(GTK_TYPE_ACCESSIBLE, "AgsAccessibleDial", &ags_accesssible_dial_info, 0); g_type_add_interface_static(ags_type_accessible_dial, ATK_TYPE_VALUE, &atk_value_interface_info); g_type_add_interface_static(ags_type_accessible_dial, ATK_TYPE_ACTION, &atk_action_interface_info); } return(ags_type_accessible_dial); } void ags_dial_class_init(AgsDialClass *dial) { GObjectClass *gobject; GtkWidgetClass *widget; GParamSpec *param_spec; ags_dial_parent_class = g_type_class_peek_parent(dial); quark_accessible_object = g_quark_from_static_string("ags-accessible-object"); /* GObjectClass */ gobject = (GObjectClass *) dial; gobject->set_property = ags_dial_set_property; gobject->get_property = ags_dial_get_property; /* properties */ /** * AgsDial:radius: * * The radius of the knob. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("radius", "radius", "The knob's radius", 0, G_MAXUINT, AGS_DIAL_DEFAULT_RADIUS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RADIUS, param_spec); /** * AgsDial:outline-strength: * * The outline strength of the knob. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("outline-strength", "outline strength", "The knob's outline strength", 0, G_MAXUINT, AGS_DIAL_DEFAULT_OUTLINE_STRENGTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_OUTLINE_STRENGTH, param_spec); /** * AgsDial:font-size: * * The font size of the buttons. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("font-size", "font size", "The buttons font-size", 0, G_MAXUINT, AGS_DIAL_DEFAULT_FONT_SIZE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FONT_SIZE, param_spec); /** * AgsDial:button-width: * * The buttons width. * * Since: 3.0.0 */ param_spec = g_param_spec_int("button-width", "buttons width", "The buttons width", -1, G_MAXINT, AGS_DIAL_DEFAULT_BUTTON_WIDTH, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUTTON_WIDTH, param_spec); /** * AgsDial:button-height: * * The buttons height. * * Since: 3.0.0 */ param_spec = g_param_spec_int("button-height", "buttons height", "The buttons height", -1, G_MAXINT, AGS_DIAL_DEFAULT_BUTTON_HEIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_BUTTON_HEIGHT, param_spec); /** * AgsDial:margin-left: * * The button's margin left. * * Since: 3.0.0 */ param_spec = g_param_spec_int("margin-left", "button's margin left", "The button's margin left", -1, G_MAXINT, AGS_DIAL_DEFAULT_MARGIN_LEFT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_LEFT, param_spec); /** * AgsDial:margin-right: * * The button's margin right. * * Since: 3.0.0 */ param_spec = g_param_spec_int("margin-right", "button's margin right", "The button's margin right", -1, G_MAXINT, AGS_DIAL_DEFAULT_MARGIN_RIGHT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MARGIN_RIGHT, param_spec); /** * AgsDial:adjustment: * * The adjustment storing current value and boundaries. * * Since: 3.0.0 */ param_spec = g_param_spec_object("adjustment", "assigned adjustment", "The adjustment it is assigned with", G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ADJUSTMENT, param_spec); /** * AgsDial:scale-precision: * * The precision of the scale. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("scale-precision", "scale precision", "The precision of the scale", 0, G_MAXUINT, AGS_DIAL_DEFAULT_PRECISION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SCALE_PRECISION, param_spec); /* GtkWidgetClass */ widget = (GtkWidgetClass *) dial; widget->get_accessible = ags_dial_get_accessible; // widget->map = ags_dial_map; widget->realize = ags_dial_realize; widget->size_allocate = ags_dial_size_allocate; widget->get_preferred_width = ags_dial_get_preferred_width; widget->get_preferred_height = ags_dial_get_preferred_height; widget->button_press_event = ags_dial_button_press; widget->button_release_event = ags_dial_button_release; widget->key_press_event = ags_dial_key_press; widget->key_release_event = ags_dial_key_release; widget->motion_notify_event = ags_dial_motion_notify; widget->show = ags_dial_show; widget->draw = ags_dial_draw; /* AgsDialClass */ dial->value_changed = NULL; /* signals */ /** * AgsDial::value-changed: * @dial: the #AgsDial * * The ::value-changed signal notifies adjustment value changed. * * Since: 3.0.0 */ dial_signals[VALUE_CHANGED] = g_signal_new("value-changed", G_TYPE_FROM_CLASS(dial), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsDialClass, value_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_accessible_dial_class_init(AtkObject *object) { /* empty */ } void ags_accessible_dial_value_interface_init(AtkValueIface *value) { value->get_current_value = NULL; value->get_maximum_value = NULL; value->get_minimum_value = NULL; value->set_current_value = NULL; value->get_minimum_increment = NULL; #ifdef HAVE_ATK_2_12 value->get_value_and_text = ags_accessible_dial_get_value_and_text; value->get_range = ags_accessible_dial_get_range; value->get_increment = ags_accessible_dial_get_increment; value->get_sub_ranges = NULL; value->set_value = ags_accessible_dial_set_value; #endif } void ags_accessible_dial_action_interface_init(AtkActionIface *action) { action->do_action = ags_accessible_dial_do_action; action->get_n_actions = ags_accessible_dial_get_n_actions; action->get_description = ags_accessible_dial_get_description; action->get_name = ags_accessible_dial_get_name; action->get_keybinding = ags_accessible_dial_get_keybinding; action->set_description = ags_accessible_dial_set_description; action->get_localized_name = ags_accessible_dial_get_localized_name; } void ags_dial_init(AgsDial *dial) { AtkObject *accessible; gtk_widget_set_can_focus((GtkWidget *) dial, TRUE); accessible = gtk_widget_get_accessible((GtkWidget *) dial); g_object_set(accessible, "accessible-name", "dial", "accessible-description", "Adjust a value", NULL); g_object_set(G_OBJECT(dial), "app-paintable", TRUE, "can-focus", TRUE, NULL); dial->flags = (AGS_DIAL_WITH_BUTTONS | AGS_DIAL_SEEMLESS_MODE | AGS_DIAL_INVERSE_LIGHT); dial->radius = AGS_DIAL_DEFAULT_RADIUS; dial->scale_precision = AGS_DIAL_DEFAULT_PRECISION; dial->scale_max_precision = AGS_DIAL_DEFAULT_PRECISION; dial->outline_strength = AGS_DIAL_DEFAULT_OUTLINE_STRENGTH; dial->font_size = AGS_DIAL_DEFAULT_FONT_SIZE; dial->button_width = AGS_DIAL_DEFAULT_BUTTON_WIDTH; dial->button_height = AGS_DIAL_DEFAULT_BUTTON_HEIGHT; dial->margin_left = AGS_DIAL_DEFAULT_MARGIN_LEFT; dial->margin_right = AGS_DIAL_DEFAULT_MARGIN_RIGHT; dial->tolerance = 0.9; dial->negated_tolerance = 1.1; dial->adjustment = NULL; dial->gravity_x = 0.0; dial->gravity_y = 0.0; dial->current_x = 0.0; dial->current_y = 0.0; } void ags_dial_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsDial *dial; dial = AGS_DIAL(gobject); switch(prop_id){ case PROP_RADIUS: { dial->radius = g_value_get_uint(value); } break; case PROP_OUTLINE_STRENGTH: { dial->outline_strength = g_value_get_uint(value); } break; case PROP_FONT_SIZE: { dial->font_size = g_value_get_uint(value); } break; case PROP_BUTTON_WIDTH: { dial->button_width = g_value_get_int(value); } break; case PROP_BUTTON_HEIGHT: { dial->button_height = g_value_get_int(value); } break; case PROP_MARGIN_LEFT: { dial->margin_left = g_value_get_int(value); } break; case PROP_MARGIN_RIGHT: { dial->margin_right = g_value_get_int(value); } break; case PROP_ADJUSTMENT: { GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) g_value_get_object(value); if(dial->adjustment == adjustment){ return; } if(dial->adjustment != NULL){ g_object_unref(G_OBJECT(dial->adjustment)); } if(adjustment != NULL){ g_object_ref(G_OBJECT(adjustment)); g_signal_connect(adjustment, "value-changed", G_CALLBACK(ags_dial_adjustment_changed_callback), dial); } dial->adjustment = adjustment; } break; case PROP_SCALE_PRECISION: { guint scale_precision; scale_precision = g_value_get_uint(value); if(scale_precision > dial->scale_max_precision){ dial->scale_precision = dial->scale_max_precision; }else if(scale_precision == 0){ dial->scale_precision = 1; }else{ dial->scale_precision = scale_precision; } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_dial_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsDial *dial; dial = AGS_DIAL(gobject); switch(prop_id){ case PROP_RADIUS: { g_value_set_uint(value, dial->radius); } break; case PROP_OUTLINE_STRENGTH: { g_value_set_uint(value, dial->outline_strength); } break; case PROP_FONT_SIZE: { g_value_set_uint(value, dial->font_size); } break; case PROP_BUTTON_WIDTH: { g_value_set_int(value, dial->button_width); } break; case PROP_BUTTON_HEIGHT: { g_value_set_int(value, dial->button_height); } break; case PROP_MARGIN_LEFT: { g_value_set_int(value, dial->margin_left); } break; case PROP_MARGIN_RIGHT: { g_value_set_int(value, dial->margin_right); } break; case PROP_ADJUSTMENT: { g_value_set_object(value, dial->adjustment); } break; case PROP_SCALE_PRECISION: { g_value_set_uint(value, dial->scale_precision); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_accessible_dial_get_value_and_text(AtkValue *value, gdouble *current_value, gchar **text) { AgsDial *dial; dial = (AgsDial *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); if(current_value != NULL){ *current_value = gtk_adjustment_get_value(dial->adjustment); } if(text != NULL){ *text = g_strdup_printf("%f", gtk_adjustment_get_value(dial->adjustment)); } } #ifdef HAVE_ATK_2_12 AtkRange* ags_accessible_dial_get_range(AtkValue *value) { AgsDial *dial; AtkRange *range; dial = (AgsDial *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); range = atk_range_new(gtk_adjustment_get_lower(dial->adjustment), gtk_adjustment_get_upper(dial->adjustment), "Valid lower and upper input range of this dial"); return(range); } #endif gdouble ags_accessible_dial_get_increment(AtkValue *value) { AgsDial *dial; dial = (AgsDial *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); return(gtk_adjustment_get_step_increment(dial->adjustment)); } void ags_accessible_dial_set_value(AtkValue *value, gdouble new_value) { AgsDial *dial; dial = (AgsDial *) gtk_accessible_get_widget(GTK_ACCESSIBLE(value)); gtk_adjustment_set_value(dial->adjustment, new_value); gtk_widget_queue_draw((GtkWidget *) dial); } gboolean ags_accessible_dial_do_action(AtkAction *action, gint i) { AgsDial *dial; GdkEventKey *key_press, *key_release; if(!(i >= 0 && i < 2)){ return(FALSE); } dial = (AgsDial *) gtk_accessible_get_widget(GTK_ACCESSIBLE(action)); key_press = gdk_event_new(GDK_KEY_PRESS); key_release = gdk_event_new(GDK_KEY_RELEASE); switch(i){ case AGS_DIAL_INCREMENT: { key_press->keyval = key_release->keyval = GDK_KEY_Up; /* send event */ gtk_widget_event((GtkWidget *) dial, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) dial, (GdkEvent *) key_release); } break; case AGS_DIAL_DECREMENT: { key_press->keyval = key_release->keyval = GDK_KEY_Down; /* send event */ gtk_widget_event((GtkWidget *) dial, (GdkEvent *) key_press); gtk_widget_event((GtkWidget *) dial, (GdkEvent *) key_release); } break; } return(TRUE); } gint ags_accessible_dial_get_n_actions(AtkAction *action) { return(2); } const gchar* ags_accessible_dial_get_description(AtkAction *action, gint i) { static const gchar *actions[] = { "increment dial value", "decrement dial value", }; if(i >= 0 && i < 2){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_dial_get_name(AtkAction *action, gint i) { static const gchar *actions[] = { "increment", "decrement", }; if(i >= 0 && i < 2){ return(actions[i]); }else{ return(NULL); } } const gchar* ags_accessible_dial_get_keybinding(AtkAction *action, gint i) { static const gchar *actions[] = { "up", "down", }; if(i >= 0 && i < 2){ return(actions[i]); }else{ return(NULL); } } gboolean ags_accessible_dial_set_description(AtkAction *action, gint i) { //TODO:JK: implement me return(FALSE); } gchar* ags_accessible_dial_get_localized_name(AtkAction *action, gint i) { //TODO:JK: implement me return(NULL); } void ags_dial_map(GtkWidget *widget) { if (gtk_widget_get_realized (widget) && !gtk_widget_get_mapped (widget)) { GTK_WIDGET_CLASS (ags_dial_parent_class)->map(widget); gdk_window_show(gtk_widget_get_window(widget)); } } void ags_dial_realize(GtkWidget *widget) { AgsDial *dial; GdkWindow *window; GtkAllocation allocation; GdkWindowAttr attributes; gint attributes_mask; gint buttons_width; gint border_left, border_top; g_return_if_fail(widget != NULL); g_return_if_fail(AGS_IS_DIAL (widget)); dial = AGS_DIAL(widget); gtk_widget_set_realized(widget, TRUE); /* calculate some display dependend fields */ buttons_width = 0; #if 0 if((AGS_DIAL_WITH_BUTTONS & (dial->flags)) != 0){ cairo_t *cr; cairo_text_extents_t te_up, te_down; cr = gdk_cairo_create(widget->parent->window); if(cr == NULL){ return; } cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, (gdouble) dial->font_size); cairo_text_extents (cr, "-", &te_down); cairo_text_extents (cr, "+", &te_up); if(te_down.width < te_up.width){ dial->button_width = te_up.width * 3; }else{ dial->button_width = te_down.width * 3; } buttons_width = 2 * dial->button_width; if(te_down.height < te_up.height){ dial->button_height = te_up.height * 2; }else{ dial->button_height = te_down.height * 2; } cairo_destroy(cr); } #endif gtk_widget_get_allocation(widget, &allocation); /* */ attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; attributes.height = allocation.height; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.event_mask = gtk_widget_get_events(widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gtk_widget_register_window(widget, window); gtk_widget_set_window(widget, window); ags_dial_send_configure(dial); } void ags_dial_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { AgsDial *dial; guint min_width; dial = AGS_DIAL(widget); g_return_if_fail(AGS_IS_DIAL(widget)); g_return_if_fail(allocation != NULL); min_width = 2 * (dial->button_width + dial->radius + dial->outline_strength + 2) + (dial->margin_left + dial->margin_right); if(allocation->width < min_width){ allocation->width = min_width; } allocation->height = 2 * (dial->radius + dial->outline_strength + 1); //TODO:JK: improve me gtk_widget_set_allocation(widget, allocation); if(gtk_widget_get_realized(widget)){ gdk_window_move_resize(gtk_widget_get_window(widget), allocation->x, allocation->y, allocation->width, allocation->height); ags_dial_send_configure(dial); } } void ags_dial_send_configure(AgsDial *dial) { GtkAllocation allocation; GtkWidget *widget; GdkEvent *event = gdk_event_new (GDK_CONFIGURE); widget = GTK_WIDGET(dial); gtk_widget_get_allocation(widget, &allocation); event->configure.window = g_object_ref(gtk_widget_get_window (widget)); event->configure.send_event = TRUE; event->configure.x = allocation.x; event->configure.y = allocation.y; event->configure.width = allocation.width; event->configure.height = allocation.height; gtk_widget_event(widget, event); gdk_event_free(event); } void ags_dial_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width) { AgsDial *dial; dial = AGS_DIAL(widget); minimal_width[0] = natural_width[0] = 2 * (dial->button_width + dial->radius + dial->outline_strength + 2) + (dial->margin_left + dial->margin_right); } void ags_dial_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height) { AgsDial *dial; dial = AGS_DIAL(widget); minimal_height[0] = natural_height[0] = 2 * (dial->radius + dial->outline_strength + 1); } AtkObject* ags_dial_get_accessible(GtkWidget *widget) { AtkObject* accessible; accessible = g_object_get_qdata(G_OBJECT(widget), quark_accessible_object); if(!accessible){ accessible = g_object_new(ags_accessible_dial_get_type(), NULL); g_object_set_qdata(G_OBJECT(widget), quark_accessible_object, accessible); gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), widget); } return(accessible); } void ags_dial_show(GtkWidget *widget) { GTK_WIDGET_CLASS(ags_dial_parent_class)->show(widget); } gboolean ags_dial_button_press_is_down_event(AgsDial *dial, GdkEventButton *event, gint padding_left, guint padding_top) { if(event->x >= padding_left && event->x <= padding_left + dial->button_width && event->y >= padding_top + 2 * dial->radius + 2 * dial->outline_strength - dial->button_height && event->y <= padding_top + 2 * dial->radius + 2 * dial->outline_strength){ return(TRUE); }else{ return(FALSE); } } gboolean ags_dial_button_press_is_up_event(AgsDial *dial, GdkEventButton *event, gint padding_left, guint padding_top) { gint offset; offset = padding_left + dial->button_width + 2 * dial->radius + dial->margin_left + dial->margin_right; if(event->x >= offset && event->x <= offset + dial->button_width && event->y >= padding_top + 2 * dial->radius + 2 * dial->outline_strength - dial->button_height && event->y <= padding_top + 2 * dial->radius + 2 * dial->outline_strength){ return(TRUE); }else{ return(FALSE); } } gboolean ags_dial_button_press_is_dial_event(AgsDial *dial, GdkEventButton *event, gint padding_left, guint padding_top, gint dial_left_position) { if(event->x >= dial_left_position && event->x <= dial_left_position + 2 * dial->radius + 2 * dial->outline_strength){ if((cos(event->y) < 0.0 && cos(event->y) >= -1.0) || (sin(event->y) > 0.0 && sin(event->y) <= 1.0) || (cos(event->y) < 0.0 && sin(event->y) >= -1.0) || (sin(event->y) < 0.0 && cos(event->y) >= -1.0)){ return(TRUE); }else{ return(FALSE); } }else{ return(FALSE); } } gboolean ags_dial_button_press(GtkWidget *widget, GdkEventButton *event) { AgsDial *dial; GtkAllocation allocation; gdouble button_width, button_height, margin_left, margin_right; gdouble radius, outline_strength; guint width, height; gint padding_left, padding_top; gint dial_left_position; // GTK_WIDGET_CLASS(ags_dial_parent_class)->button_press_event(widget, event); dial = AGS_DIAL(widget); dial->flags |= AGS_DIAL_MOUSE_BUTTON_PRESSED; gtk_widget_get_allocation(widget, &allocation); button_width = dial->button_width; button_height = dial->button_height; margin_left = (gdouble) dial->margin_left; margin_right = (gdouble) dial->margin_right; radius = (gdouble) dial->radius; outline_strength = (gdouble) dial->outline_strength; width = 2 * (button_height + radius + outline_strength + 2) + (margin_left + margin_right); height = 2 * (radius + outline_strength + 1); padding_top = (allocation.height - height) / 2; padding_left = (allocation.width - width) / 2; if((AGS_DIAL_WITH_BUTTONS & (dial->flags)) != 0){ if(ags_dial_button_press_is_down_event(dial, event, padding_left, padding_top)){ dial->flags |= AGS_DIAL_BUTTON_DOWN_PRESSED; }else if(ags_dial_button_press_is_up_event(dial, event, padding_left, padding_top)){ dial->flags |= AGS_DIAL_BUTTON_UP_PRESSED; }else{ dial_left_position = padding_left + dial->button_width; if(ags_dial_button_press_is_dial_event(dial, event, padding_left, padding_top, dial_left_position)){ dial->flags |= AGS_DIAL_MOTION_CAPTURING; } } }else{ dial_left_position = padding_left; if(ags_dial_button_press_is_dial_event(dial, event, padding_left, padding_top, dial_left_position)){ dial->gravity_x = event->x; dial->gravity_y = event->y; dial->current_x = event->x; dial->current_y = event->y; dial->flags |= AGS_DIAL_MOTION_CAPTURING_INIT; dial->flags |= AGS_DIAL_MOTION_CAPTURING; } } return(FALSE); } gboolean ags_dial_button_release(GtkWidget *widget, GdkEventButton *event) { AgsDial *dial; // GTK_WIDGET_CLASS(ags_dial_parent_class)->button_release_event(widget, event); gtk_widget_grab_focus(widget); dial = AGS_DIAL(widget); dial->flags &= (~AGS_DIAL_MOUSE_BUTTON_PRESSED); if((AGS_DIAL_BUTTON_DOWN_PRESSED & (dial->flags)) != 0){ GtkAdjustment *adjustment; adjustment = dial->adjustment; if(gtk_adjustment_get_value(adjustment) > gtk_adjustment_get_lower(adjustment)){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) - gtk_adjustment_get_step_increment(adjustment)); gtk_widget_queue_draw(dial); } dial->flags &= (~AGS_DIAL_BUTTON_DOWN_PRESSED); }else if((AGS_DIAL_BUTTON_UP_PRESSED & (dial->flags)) != 0){ GtkAdjustment *adjustment; adjustment = dial->adjustment; if(gtk_adjustment_get_value(adjustment) < gtk_adjustment_get_upper(adjustment)){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_step_increment(adjustment)); gtk_widget_queue_draw(dial); } dial->flags &= (~AGS_DIAL_BUTTON_UP_PRESSED); }else if((AGS_DIAL_MOTION_CAPTURING & (dial->flags)) != 0){ dial->flags &= (~AGS_DIAL_MOTION_CAPTURING); } return(FALSE); } gboolean ags_dial_key_press(GtkWidget *widget, GdkEventKey *event) { if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_dial_parent_class)->key_press_event(widget, event)); } return(TRUE); } gboolean ags_dial_key_release(GtkWidget *widget, GdkEventKey *event) { AgsDial *dial; if(event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_ISO_Left_Tab || event->keyval == GDK_KEY_Shift_L || event->keyval == GDK_KEY_Shift_R || event->keyval == GDK_KEY_Alt_L || event->keyval == GDK_KEY_Alt_R || event->keyval == GDK_KEY_Control_L || event->keyval == GDK_KEY_Control_R ){ return(GTK_WIDGET_CLASS(ags_dial_parent_class)->key_release_event(widget, event)); } dial = AGS_DIAL(widget); switch(event->keyval){ case GDK_KEY_Up: case GDK_KEY_uparrow: { gdouble value, step, upper; value = gtk_adjustment_get_value(dial->adjustment); step = gtk_adjustment_get_step_increment(dial->adjustment); upper = gtk_adjustment_get_upper(dial->adjustment); if(value + step > upper){ gtk_adjustment_set_value(dial->adjustment, upper); }else{ gtk_adjustment_set_value(dial->adjustment, value + step); } gtk_widget_queue_draw(widget); } break; case GDK_KEY_Down: case GDK_KEY_downarrow: { gdouble value, step, lower; value = gtk_adjustment_get_value(dial->adjustment); step = gtk_adjustment_get_step_increment(dial->adjustment); lower = gtk_adjustment_get_lower(dial->adjustment); if(value - step < lower){ gtk_adjustment_set_value(dial->adjustment, lower); }else{ gtk_adjustment_set_value(dial->adjustment, value - step); } gtk_widget_queue_draw(widget); } break; } return(TRUE); } void ags_dial_motion_notify_do_dial(AgsDial *dial, GdkEventMotion *event) { GtkAdjustment *adjustment; guint i; gint sign_one; gboolean gravity_up; static const gboolean movement_matrix[] = { FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, }; adjustment = dial->adjustment; gravity_up = FALSE; for(i = 0; i < 8 ; i++){ if(!movement_matrix[i]){ sign_one = -1; }else{ sign_one = 1; } if((movement_matrix[i] && (sign_one * (dial->gravity_x - dial->current_x) < sign_one * (dial->gravity_y - dial->current_y))) || (!movement_matrix[i] && (sign_one * (dial->gravity_x - dial->current_x) > sign_one * (dial->gravity_y - dial->current_y)))){ gravity_up = TRUE; break; } } if(!gravity_up){ if(gtk_adjustment_get_value(adjustment) > gtk_adjustment_get_lower(adjustment)){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) - gtk_adjustment_get_step_increment(adjustment)); gtk_widget_queue_draw(dial); } }else{ if(gtk_adjustment_get_value(adjustment) < gtk_adjustment_get_lower(adjustment)){ gtk_adjustment_set_value(adjustment, gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_step_increment(adjustment)); gtk_widget_queue_draw(dial); } } } void ags_dial_motion_notify_do_seemless_dial(AgsDial *dial, GdkEventMotion *event) { GtkAdjustment *adjustment; GtkAllocation allocation; cairo_t *cr; gdouble button_width, button_height, margin_left, margin_right; gdouble radius, outline_strength; guint width, height; gdouble padding_left, padding_top; gdouble range; gdouble a0, quarter; gdouble x0, y0, x1, y1; gdouble translated_x; gboolean x_toggled, y_toggled; //TODO:JK: optimize me adjustment = dial->adjustment; range = (gtk_adjustment_get_upper(dial->adjustment) - gtk_adjustment_get_lower(dial->adjustment)); if(range == 0.0){ return; } gtk_widget_get_allocation(dial, &allocation); button_width = dial->button_width; button_height = dial->button_height; margin_left = (gdouble) dial->margin_left; margin_right = (gdouble) dial->margin_right; radius = (gdouble) dial->radius; outline_strength = (gdouble) dial->outline_strength; width = 2 * (button_height + radius + outline_strength + 2) + (margin_left + margin_right); height = 2 * (radius + outline_strength + 1); padding_top = (allocation.height - height) / 2; padding_left = (allocation.width - width) / 2; x1 = event->x - (1.0 + dial->button_width + dial->margin_left + radius + padding_left); y1 = event->y - (dial->outline_strength + radius + padding_top); y1 *= -1.0; x_toggled = FALSE; y_toggled = FALSE; if(x1 < 0.0){ x_toggled = TRUE; } if(y1 < 0.0){ y_toggled = TRUE; } if(radius == 0.0){ return; } //FIXME:JK: ugly hack x1 = round(x1 + 1.0); y1 = round(y1 - 1.0); if(x1 == 0.0 && y1 == 0.0){ return; }else if(x1 == 0.0){ a0 = 1.0; #if 0 x0 = 0.0; y0 = 1.0 * radius; #endif }else if(y1 == 0.0){ a0 = 0.0; #if 0 x0 = 1.0 * radius; y0 = 0.0; #endif }else{ a0 = y1 / x1; #if 0 x0 = cos(a0) * radius; y0 = sin(a0) * radius; #endif } /* origin correction */ #if 0 if(x_toggled && y_toggled){ if(x0 > 0.0){ x0 *= -1.0; } if(y0 > 0.0){ y0 *= -1.0; } }else if(y_toggled){ if(x0 < 0.0){ x0 *= -1.0; } if(y0 > 0.0){ y0 *= -1.0; } }else if(x_toggled){ if(y0 < 0.0){ y0 *= -1.0; } if(x0 > 0.0){ x0 *= -1.0; } }else{ if(x0 < 0.0){ x0 *= -1.0; } if(y0 < 0.0){ y0 *= -1.0; } } #endif if(a0 > 2.0 * M_PI / 4.0){ a0 = (2.0 * M_PI / 4.0); }else if(a0 < -2.0 * M_PI / 4.0){ a0 = (-2.0 * M_PI / 4.0); } /* translated_x */ translated_x = a0 * radius; quarter = (2.0 * M_PI / 4.0) * radius; if(x_toggled && y_toggled){ if(translated_x < 0.0){ translated_x = quarter + translated_x; }else{ translated_x = quarter - translated_x; } }else if(y_toggled){ if(translated_x < 0.0){ translated_x *= -1.0; } translated_x += 3.0 * quarter; }else if(x_toggled){ if(translated_x < 0.0){ translated_x *= -1.0; } translated_x += quarter; }else{ if(translated_x < 0.0){ translated_x = quarter + translated_x; }else{ translated_x = quarter - translated_x; } translated_x += 2.0 * quarter; } translated_x = ((4.0 / 3.0) * range) / (4.0 * quarter) * translated_x; translated_x -= (range / 3.0 / 2.0); translated_x = gtk_adjustment_get_lower(adjustment) + translated_x; if(translated_x < gtk_adjustment_get_lower(adjustment)){ translated_x = gtk_adjustment_get_lower(adjustment); }else if(translated_x > gtk_adjustment_get_upper(adjustment)){ translated_x = gtk_adjustment_get_upper(adjustment); } gtk_adjustment_set_value(adjustment, translated_x); gtk_widget_queue_draw(dial); } gboolean ags_dial_motion_notify(GtkWidget *widget, GdkEventMotion *event) { AgsDial *dial; GtkAllocation allocation; // GTK_WIDGET_CLASS(ags_dial_parent_class)->motion_notify_event(widget, event); dial = AGS_DIAL(widget); gtk_widget_get_allocation(widget, &allocation); if((AGS_DIAL_MOTION_CAPTURING & (dial->flags)) != 0){ if((AGS_DIAL_SEEMLESS_MODE & (dial->flags)) != 0){ if((AGS_DIAL_MOTION_CAPTURING_INIT & (dial->flags)) != 0){ dial->current_x = event->x; dial->current_y = event->y; }else{ dial->gravity_x = dial->current_x; dial->gravity_y = dial->current_y; dial->current_x = event->x; dial->current_y = event->y; } ags_dial_motion_notify_do_seemless_dial(dial, event); }else{ if((AGS_DIAL_MOTION_CAPTURING_INIT & (dial->flags)) != 0){ dial->current_x = event->x; dial->current_y = event->y; dial->flags &= (~AGS_DIAL_MOTION_CAPTURING_INIT); ags_dial_motion_notify_do_dial(dial, event); }else{ dial->gravity_x = dial->current_x; dial->gravity_y = dial->current_y; dial->current_x = event->x; dial->current_y = event->y; ags_dial_motion_notify_do_dial(dial, event); } } } return(FALSE); } /** * ags_dial_draw: * @dial: an #AgsDial * * draws the widget * * Since: 3.0.0 */ void ags_dial_draw(AgsDial *dial, cairo_t *cr) { GtkWidget *widget; GtkStyleContext *dial_style_context; cairo_text_extents_t te_up, te_down; GtkAllocation allocation; GdkRGBA *fg_color; GdkRGBA *bg_color; GdkRGBA *border_color; GdkRGBA *font_color; gdouble button_width, button_height, margin_left, margin_right; gdouble radius, outline_strength; guint width, height; guint padding_top, padding_left; gdouble unused; gdouble scale_area, scale_width, scale_inverted_width; gdouble starter_angle; gdouble translated_value; gdouble range; guint scale_precision; guint i; GValue value = {0,}; widget = GTK_WIDGET(dial); gtk_widget_get_allocation(GTK_WIDGET(dial), &allocation); /* style context */ dial_style_context = gtk_widget_get_style_context(GTK_WIDGET(dial)); gtk_style_context_get_property(dial_style_context, "color", GTK_STATE_FLAG_NORMAL, &value); fg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(dial_style_context, "background-color", GTK_STATE_FLAG_NORMAL, &value); bg_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(dial_style_context, "border-color", GTK_STATE_FLAG_NORMAL, &value); border_color = g_value_dup_boxed(&value); g_value_unset(&value); gtk_style_context_get_property(dial_style_context, "font", GTK_STATE_FLAG_NORMAL, &value); font_color = g_value_dup_boxed(&value); g_value_unset(&value); /* dimension */ button_width = dial->button_width; button_height = dial->button_height; margin_left = (gdouble) dial->margin_left; margin_right = (gdouble) dial->margin_right; radius = (gdouble) dial->radius; outline_strength = (gdouble) dial->outline_strength; width = 2 * (button_width + radius + outline_strength + 1); height = 2 * (radius + outline_strength + 1); padding_top = (allocation.height - height) / 2; padding_left = (allocation.width - width) / 2; /* */ // cairo_surface_flush(cairo_get_target(cr)); cairo_push_group(cr); /* clear bg */ #if 0 cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_rectangle(cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); cairo_fill(cr); #else gtk_render_background(dial_style_context, cr, 0.0, 0.0, (gdouble) allocation.width, (gdouble) allocation.height); #endif if((AGS_DIAL_WITH_BUTTONS & (dial->flags)) != 0){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; gchar *font_name; static const gchar *text = "-"; g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); /* draw controller button down */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_set_line_width(cr, 2.0); cairo_rectangle(cr, (gdouble) padding_left + 1.0, (gdouble) padding_top + (2.0 * radius) - button_height + outline_strength, (gdouble) button_width, (gdouble) button_height); cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER); cairo_stroke(cr); /* text */ cairo_set_source_rgba(cr, font_color->red, font_color->green, font_color->blue, font_color->alpha); layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, text, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, dial->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_move_to(cr, padding_left + 1.0 + 0.5 - (logical_rect.width / PANGO_SCALE) / 2.0 + button_width / 2.25, padding_top + 0.5 - (logical_rect.height / PANGO_SCALE) / 2.0 + (radius * 2.0) - button_height / 2.0 + outline_strength - 1.0); pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(font_name); } if((AGS_DIAL_WITH_BUTTONS & (dial->flags)) != 0){ PangoLayout *layout; PangoFontDescription *desc; PangoRectangle ink_rect, logical_rect; gchar *font_name; static const gchar *text = "+"; g_object_get(gtk_settings_get_default(), "gtk-font-name", &font_name, NULL); /* draw controller button up */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_set_line_width(cr, 2.0); cairo_rectangle(cr, padding_left + 1.0 + (2.0 * radius) + button_width + margin_left + margin_right, padding_top + (2.0 * radius) - button_height + outline_strength, button_width, button_height); cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER); cairo_stroke(cr); /* text */ cairo_set_source_rgba(cr, font_color->red, font_color->green, font_color->blue, font_color->alpha); layout = pango_cairo_create_layout(cr); pango_layout_set_text(layout, text, -1); desc = pango_font_description_from_string(font_name); pango_font_description_set_size(desc, dial->font_size * PANGO_SCALE); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_get_extents(layout, &ink_rect, &logical_rect); cairo_move_to(cr, padding_left + 1.0 + 0.5 - (logical_rect.width / PANGO_SCALE) / 2.0 + (radius * 2.0) + margin_left + margin_right + button_width + button_width / 2.25, padding_top + 0.5 - (logical_rect.height / PANGO_SCALE) / 2.0 + (radius * 2.0) - button_height / 2.0 + outline_strength - 1.0); pango_cairo_show_layout(cr, layout); g_object_unref(layout); g_free(font_name); } /* border fill * / cairo_set_source_rgb(cr, dial_style->fg[0].red / white_gc, dial_style->fg[0].green / white_gc, dial_style->fg[0].blue / white_gc); cairo_arc(cr, 1.0 + button_width + margin_left + radius, radius + outline_strength, radius + 2.0, -1.0 * M_PI, 1.0 * M_PI); cairo_stroke(cr); */ /* dial disk */ cairo_set_source_rgba(cr, bg_color->red, bg_color->green, bg_color->blue, bg_color->alpha); cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius + outline_strength - 1.25, -1.0 * M_PI, 1.0 * M_PI); cairo_fill(cr); /* dial disk border */ cairo_set_source_rgba(cr, border_color->red, border_color->green, border_color->blue, border_color->alpha); cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius, -1.0 * M_PI, 1.0 * M_PI); cairo_stroke(cr); /* light effect */ if((AGS_DIAL_INVERSE_LIGHT & (dial->flags)) != 0){ cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0 / 3.0); }else{ cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0 / 3.0); } cairo_line_to(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + 2.0 * outline_strength - 2.0 - outline_strength); cairo_line_to(cr, padding_left + 1.0 + sin(-1 * (0.35 * M_PI) / (0.65 * M_PI)) + button_width + margin_left + radius, padding_top + cos((0.65 * M_PI) / (0.35 * M_PI)) + radius + 2.0 * outline_strength - 1.0); cairo_line_to(cr, padding_left + 1.0 + sin((0.65 * M_PI) / (0.35 * M_PI)) + button_width + margin_left + radius, padding_top + -1 * cos((0.35 * M_PI) / (0.65 * M_PI)) + radius + 2.0 * outline_strength - 1.0); cairo_close_path(cr); cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius, 0.35 * M_PI, 0.65 * M_PI); cairo_fill(cr); cairo_line_to(cr, padding_left + 1.0 + cos((0.65 * M_PI) / (0.35 * M_PI)) + button_width + margin_left + radius, padding_top + -1 * sin((0.35 * M_PI) / (0.65 * M_PI)) + radius + 2.0 * outline_strength - 1.0); cairo_line_to(cr, padding_left + 1.0 + -1 * cos((0.35 * M_PI) / (0.65 * M_PI)) + button_width + margin_left + radius, padding_top + sin((0.65 * M_PI) / (0.35 * M_PI)) + radius + 2.0 * outline_strength - 1.0); cairo_line_to(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + 2.0 * outline_strength - 1.0); cairo_close_path(cr); cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius, -0.65 * M_PI, -0.35 * M_PI); cairo_fill(cr); /* outline */ cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0); // cairo_set_line_width(cr, 1.0 - (2.0 / M_PI)); cairo_set_line_width(cr, 1.0); cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius, -1.0 * M_PI, 1.0 * M_PI); cairo_stroke(cr); /* scale */ cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); cairo_set_line_width(cr, 3.0); unused = 0.25 * 2.0 * M_PI; starter_angle = (2.0 * M_PI - unused) * 0.5; scale_precision = (gdouble) dial->scale_precision; scale_inverted_width = (2.0 * (radius + outline_strength) * M_PI - ((radius + outline_strength) * unused)) / scale_precision - 4.0; scale_width = (2.0 * (radius + outline_strength) * M_PI - ((radius + outline_strength) * unused)) / scale_precision - scale_inverted_width; scale_inverted_width /= (radius + outline_strength); scale_width /= (radius + outline_strength); for(i = 0; i <= scale_precision; i++){ cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius + outline_strength / M_PI, starter_angle + ((gdouble) i * scale_inverted_width) + ((gdouble) i * scale_width), starter_angle + ((gdouble) i * scale_inverted_width) + ((gdouble) i * scale_width) + scale_width); cairo_stroke(cr); } /* draw value */ range = (gtk_adjustment_get_upper(dial->adjustment) - gtk_adjustment_get_lower(dial->adjustment)); if(range != 0.0 && gtk_adjustment_get_upper(dial->adjustment) > gtk_adjustment_get_lower(dial->adjustment)){ /* this is odd */ translated_value = (gtk_adjustment_get_value(dial->adjustment) - gtk_adjustment_get_lower(dial->adjustment)); translated_value = (gdouble) scale_precision * (translated_value / range); // g_message("value: %f\nupper: %f\ntranslated_value: %f\n", GTK_RANGE(dial)->adjustment->value, GTK_RANGE(dial)->adjustment->upper, translated_value); cairo_set_line_width(cr, 4.0); cairo_set_source_rgba(cr, fg_color->red, fg_color->green, fg_color->blue, fg_color->alpha); cairo_arc(cr, padding_left + 1.0 + button_width + margin_left + radius, padding_top + radius + outline_strength, radius - (outline_strength + 4.0) / M_PI, starter_angle + (translated_value * scale_inverted_width) + (translated_value * scale_width), starter_angle + (translated_value * scale_inverted_width) + (translated_value * scale_width) + scale_width); cairo_stroke(cr); }else{ g_warning("ags_dial.c - invalid range"); } cairo_pop_group_to_source(cr); cairo_paint(cr); g_boxed_free(GDK_TYPE_RGBA, fg_color); g_boxed_free(GDK_TYPE_RGBA, bg_color); g_boxed_free(GDK_TYPE_RGBA, border_color); g_boxed_free(GDK_TYPE_RGBA, font_color); // cairo_surface_mark_dirty(cairo_get_target(cr)); } /** * ags_dial_value_changed: * @dial: an #AgsDial * * draws the widget * * Since: 3.0.0 */ void ags_dial_value_changed(AgsDial *dial) { g_return_if_fail(AGS_IS_DIAL(dial)); g_object_ref((GObject *) dial); g_signal_emit(G_OBJECT(dial), dial_signals[VALUE_CHANGED], 0); g_object_unref((GObject *) dial); } void ags_dial_adjustment_changed_callback(GtkAdjustment *adjustment, AgsDial *dial) { ags_dial_value_changed(dial); } /** * ags_dial_set_value: * @dial: an #AgsDial * @value: the value to set * * Set value * * Since: 3.0.0 */ void ags_dial_set_value(AgsDial *dial, gdouble value) { if(!AGS_IS_DIAL(dial)){ return; } gtk_adjustment_set_value(dial->adjustment, value); gtk_widget_queue_draw((GtkWidget *) dial); } /** * ags_dial_new: * * Creates an #AgsDial * * Returns: a new #AgsDial * * Since: 3.0.0 */ AgsDial* ags_dial_new() { AgsDial *dial; GtkAdjustment *adjustment; adjustment = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 1.0, 0.1, 0.1, 0.0); dial = (AgsDial *) g_object_new(AGS_TYPE_DIAL, "adjustment", adjustment, NULL); return(dial); } gsequencer-3.1.3/ags/widget/ags_hlevel_box.c0000644000175000017500000000477213607210263015774 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_hlevel_box_class_init(AgsHLevelBoxClass *hlevel_box); void ags_hlevel_box_init(AgsHLevelBox *hlevel_box); /** * SECTION:ags_hlevel_box * @short_description: horizontal box widget * @title: AgsHLevelBox * @section_id: * @include: ags/widget/ags_hlevel_box.h * * The #AgsHLevelBox is an horizontal box widget containing #AgsLevel. */ static gpointer ags_hlevel_box_parent_class = NULL; GType ags_hlevel_box_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_hlevel_box = 0; static const GTypeInfo ags_hlevel_box_info = { sizeof (AgsHLevelBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_hlevel_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsHLevelBox), 0, /* n_preallocs */ (GInstanceInitFunc) ags_hlevel_box_init, }; ags_type_hlevel_box = g_type_register_static(AGS_TYPE_LEVEL_BOX, "AgsHLevelBox", &ags_hlevel_box_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_hlevel_box); } return g_define_type_id__volatile; } void ags_hlevel_box_class_init(AgsHLevelBoxClass *hlevel_box) { } void ags_hlevel_box_init(AgsHLevelBox *hlevel_box) { gtk_orientable_set_orientation(GTK_ORIENTABLE(hlevel_box), GTK_ORIENTATION_HORIZONTAL); } /** * ags_hlevel_box_new: * * Create a new instance of #AgsHLevelBox. * * Returns: the new #AgsHLevelBox instance * * Since: 3.0.0 */ AgsHLevelBox* ags_hlevel_box_new() { AgsHLevelBox *hlevel_box; hlevel_box = (AgsHLevelBox *) g_object_new(AGS_TYPE_HLEVEL_BOX, NULL); return(hlevel_box); } gsequencer-3.1.3/ags/libags-audio.h0000644000175000017500000003475313607210263014077 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __LIBAGS_AUDIO_H__ #define __LIBAGS_AUDIO_H__ /* plugin */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* audio */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* audio thread */ #include #include #include #include #include #include #include #include #include /* audio file */ #include #include #include #ifdef AGS_WITH_LIBINSTPATCH #include #include #include #include #include #endif #include #include #include #include #include #include #include /* audio midi */ #include #include #include #include #include /* audio osc */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* audio wasapi */ #include #include /* audio core-audio */ #include #include #include #include #include #include /* audio audio-unit */ #include #include #include #include #include /* audio pulse */ #include #include #include #include #include /* audio jack */ #include #include #include #include #include #include /* audio recall */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* audio task */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* audio recall task */ #include #include #include #include #endif /*__LIBAGS_AUDIO_H__*/ gsequencer-3.1.3/ags/thread/0000755000175000017500000000000013622252255012705 500000000000000gsequencer-3.1.3/ags/thread/ags_concurrency_provider.h0000644000175000017500000000730413607210263020074 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONCURRENCY_PROVIDER_H__ #define __AGS_CONCURRENCY_PROVIDER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CONCURRENCY_PROVIDER (ags_concurrency_provider_get_type()) #define AGS_CONCURRENCY_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONCURRENCY_PROVIDER, AgsConcurrencyProvider)) #define AGS_CONCURRENCY_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_CONCURRENCY_PROVIDER, AgsConcurrencyProviderInterface)) #define AGS_IS_CONCURRENCY_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CONCURRENCY_PROVIDER)) #define AGS_IS_CONCURRENCY_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_CONCURRENCY_PROVIDER)) #define AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_CONCURRENCY_PROVIDER, AgsConcurrencyProviderInterface)) typedef struct _AgsConcurrencyProvider AgsConcurrencyProvider; typedef struct _AgsConcurrencyProviderInterface AgsConcurrencyProviderInterface; struct _AgsConcurrencyProviderInterface { GTypeInterface ginterface; AgsThread* (*get_main_loop)(AgsConcurrencyProvider *concurrency_provider); void (*set_main_loop)(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop); AgsTaskLauncher* (*get_task_launcher)(AgsConcurrencyProvider *concurrency_provider); void (*set_task_launcher)(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher); AgsThreadPool* (*get_thread_pool)(AgsConcurrencyProvider *concurrency_provider); void (*set_thread_pool)(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool); GList* (*get_worker)(AgsConcurrencyProvider *concurrency_provider); void (*set_worker)(AgsConcurrencyProvider *concurrency_provider, GList *worker); }; GType ags_concurrency_provider_get_type(); AgsThread* ags_concurrency_provider_get_main_loop(AgsConcurrencyProvider *concurrency_provider); void ags_concurrency_provider_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop); AgsTaskLauncher* ags_concurrency_provider_get_task_launcher(AgsConcurrencyProvider *concurrency_provider); void ags_concurrency_provider_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher); AgsThreadPool* ags_concurrency_provider_get_thread_pool(AgsConcurrencyProvider *concurrency_provider); void ags_concurrency_provider_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool); GList* ags_concurrency_provider_get_worker(AgsConcurrencyProvider *concurrency_provider); void ags_concurrency_provider_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker); G_END_DECLS #endif /*__AGS_CONCURRENCY_PROVIDER_H__*/ gsequencer-3.1.3/ags/thread/ags_returnable_thread.h0000644000175000017500000000672313607210263017326 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_RETURNABLE_THREAD_H__ #define __AGS_RETURNABLE_THREAD_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_RETURNABLE_THREAD (ags_returnable_thread_get_type()) #define AGS_RETURNABLE_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_RETURNABLE_THREAD, AgsReturnableThread)) #define AGS_RETURNABLE_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_RETURNABLE_THREAD, AgsReturnableThreadClass)) #define AGS_IS_RETURNABLE_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_RETURNABLE_THREAD)) #define AGS_IS_RETURNABLE_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_RETURNABLE_THREAD)) #define AGS_RETURNABLE_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_RETURNABLE_THREAD, AgsReturnableThreadClass)) #define AGS_RETURNABLE_THREAD_DEFAULT_JIFFIE (AGS_THREAD_DEFAULT_MAX_PRECISION) typedef struct _AgsReturnableThread AgsReturnableThread; typedef struct _AgsReturnableThreadClass AgsReturnableThreadClass; typedef void (*AgsReturnableThreadCallback)(AgsReturnableThread *returnable_thread, gpointer data); /** * AgsReturnableThreadFlags: * @AGS_RETURNABLE_THREAD_IN_USE: the thread is in use * @AGS_RETURNABLE_THREAD_RESET: not used * @AGS_RETURNABLE_THREAD_RUN_ONCE: call #AgsThread::run() only one time * * Enum values to control the behavior or indicate internal state of #AgsReturnableThread by * enable/disable as flags. */ typedef enum{ AGS_RETURNABLE_THREAD_IN_USE = 1, AGS_RETURNABLE_THREAD_RESET = 1 << 1, AGS_RETURNABLE_THREAD_RUN_ONCE = 1 << 2, }AgsReturnableThreadFlags; struct _AgsReturnableThread { AgsThread thread; volatile guint flags; GObject *thread_pool; GRecMutex reset_mutex; volatile void *safe_data; gulong handler; }; struct _AgsReturnableThreadClass { AgsThreadClass thread; void (*safe_run)(AgsReturnableThread *returnable_thread); }; GType ags_returnable_thread_get_type(); gboolean ags_returnable_thread_test_flags(AgsReturnableThread *returnable_thread, guint flags); void ags_returnable_thread_set_flags(AgsReturnableThread *returnable_thread, guint flags); void ags_returnable_thread_unset_flags(AgsReturnableThread *returnable_thread, guint flags); void ags_returnable_thread_safe_run(AgsReturnableThread *returnable_thread); void ags_returnable_thread_connect_safe_run(AgsReturnableThread *returnable_thread, AgsReturnableThreadCallback callback); void ags_returnable_thread_disconnect_safe_run(AgsReturnableThread *returnable_thread); AgsReturnableThread* ags_returnable_thread_new(GObject *thread_pool); G_END_DECLS #endif /*__AGS_RETURNABLE_THREAD_H__*/ gsequencer-3.1.3/ags/thread/ags_thread_pool.c0000644000175000017500000004006713614062654016135 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include void ags_thread_pool_class_init(AgsThreadPoolClass *thread_pool); void ags_thread_pool_init(AgsThreadPool *thread_pool); void ags_thread_pool_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_thread_pool_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_thread_pool_finalize(GObject *gobject); void* ags_thread_pool_creation_thread(void *ptr); void ags_thread_pool_real_start(AgsThreadPool *thread_pool); /** * SECTION:ags_thread_pool * @short_description: thread pool * @title: AgsThreadPool * @section_id: * @include: ags/thread/ags_thread_pool.h * * The #AgsThreadPool acts as preinstantiated threads store. * This can achieve enormeous performance. */ enum{ PROP_0, PROP_MAX_UNUSED_THREADS, PROP_MAX_THREADS, }; enum{ START, LAST_SIGNAL, }; static gpointer ags_thread_pool_parent_class = NULL; static guint thread_pool_signals[LAST_SIGNAL]; GType ags_thread_pool_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_thread_pool = 0; static const GTypeInfo ags_thread_pool_info = { sizeof (AgsThreadPoolClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_thread_pool_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsThreadPool), 0, /* n_preallocs */ (GInstanceInitFunc) ags_thread_pool_init, }; ags_type_thread_pool = g_type_register_static(G_TYPE_OBJECT, "AgsThreadPool", &ags_thread_pool_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_thread_pool); } return g_define_type_id__volatile; } void ags_thread_pool_class_init(AgsThreadPoolClass *thread_pool) { GObjectClass *gobject; GParamSpec *param_spec; ags_thread_pool_parent_class = g_type_class_peek_parent(thread_pool); /* GObjectClass */ gobject = (GObjectClass *) thread_pool; gobject->set_property = ags_thread_pool_set_property; gobject->get_property = ags_thread_pool_get_property; gobject->finalize = ags_thread_pool_finalize; /* properties */ /** * AgsThreadPool:max-unused-threads: * * The maximum amount of unused threads available. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("max-unused-threads", i18n_pspec("maximum unused threads"), i18n_pspec("The maximum of unused threads"), 1, 65535, AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAX_UNUSED_THREADS, param_spec); /** * AgsThreadPool:max-threads: * * The maximum amount of threads available. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("max-threads", i18n_pspec("maximum threads to use"), i18n_pspec("The maximum of threads to be created"), 1, 65535, AGS_THREAD_POOL_DEFAULT_MAX_THREADS, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAX_THREADS, param_spec); /* AgsThreadPoolClass */ thread_pool->start = ags_thread_pool_real_start; /* signals */ /** * AgsThreadPool::start: * @thread_pool: the #AgsThreadPool * * The ::start() signal is invoked in order to started the pool. * * Since: 3.0.0 */ thread_pool_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS (thread_pool), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsThreadPoolClass, start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_thread_pool_init(AgsThreadPool *thread_pool) { AgsThread *thread; AgsConfig *config; GList *list; gchar *str; guint i; config = ags_config_get_instance(); g_atomic_int_set(&(thread_pool->flags), 0); /* max unused threads */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "thread-pool-max-unused-threads"); if(str != NULL){ g_atomic_int_set(&(thread_pool->max_unused_threads), g_ascii_strtoull(str, NULL, 10)); }else{ g_atomic_int_set(&(thread_pool->max_unused_threads), AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS); } /* max threads */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "thread-pool-max-threads"); if(str != NULL){ g_atomic_int_set(&(thread_pool->max_threads), g_ascii_strtoull(str, NULL, 10)); }else{ g_atomic_int_set(&(thread_pool->max_threads), AGS_THREAD_POOL_DEFAULT_MAX_THREADS); } thread_pool->thread = NULL; /* creation mutex and condition */ g_atomic_int_set(&(thread_pool->queued), 0); g_mutex_init(&(thread_pool->creation_mutex)); g_cond_init(&(thread_pool->creation_cond)); /* idle mutex and condition */ g_atomic_int_set(&(thread_pool->create_threads), FALSE); g_atomic_int_set(&(thread_pool->idle), FALSE); g_mutex_init(&(thread_pool->idle_mutex)); g_cond_init(&(thread_pool->idle_cond)); /* returnable thread */ thread_pool->parent = NULL; list = NULL; for(i = 0; i < g_atomic_int_get(&(thread_pool->max_unused_threads)); i++){ thread = (AgsThread *) ags_returnable_thread_new((GObject *) thread_pool); g_object_ref(thread); list = g_list_prepend(list, thread); } g_atomic_pointer_set(&(thread_pool->returnable_thread), list); } void ags_thread_pool_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsThreadPool *thread_pool; thread_pool = AGS_THREAD_POOL(gobject); switch(prop_id){ case PROP_MAX_UNUSED_THREADS: { g_atomic_int_set(&(thread_pool->max_unused_threads), g_value_get_uint(value)); } break; case PROP_MAX_THREADS: { g_atomic_int_set(&(thread_pool->max_threads), g_value_get_uint(value)); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_thread_pool_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsThreadPool *thread_pool; thread_pool = AGS_THREAD_POOL(gobject); switch(prop_id){ case PROP_MAX_UNUSED_THREADS: { g_value_set_uint(value, g_atomic_int_get(&(thread_pool->max_unused_threads))); } break; case PROP_MAX_THREADS: { g_value_set_uint(value, g_atomic_int_get(&(thread_pool->max_threads))); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_thread_pool_finalize(GObject *gobject) { AgsThreadPool *thread_pool; thread_pool = AGS_THREAD_POOL(gobject); /* returnable thread */ g_list_free_full(g_atomic_pointer_get(&(thread_pool->returnable_thread)), g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_thread_pool_parent_class)->finalize(gobject); } void* ags_thread_pool_creation_thread(void *ptr) { AgsThreadPool *thread_pool; AgsThread *returnable_thread; GList *start_queue; guint n_threads; guint i, i_stop; GRecMutex *parent_mutex; thread_pool = AGS_THREAD_POOL(ptr); /* get parent mutex */ if(thread_pool->parent != NULL){ parent_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread_pool->parent); }else{ parent_mutex = NULL; } /* real-time setup */ #ifdef AGS_WITH_RT if((AGS_THREAD_POOL_RT_SETUP & (g_atomic_int_get(&(thread_pool->flags)))) == 0){ AgsPriority *priority; struct sched_param param; gchar *str; priority = ags_priority_get_instance(); /* Declare ourself as a real time task */ param.sched_priority = 45; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_LIBAGS); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); g_atomic_int_or(&(thread_pool->flags), AGS_THREAD_POOL_RT_SETUP); } #endif #ifdef AGS_DEBUG g_message("ags_thread_pool_creation_thread"); #endif while((AGS_THREAD_POOL_RUNNING & (g_atomic_int_get(&(thread_pool->flags)))) != 0){ #ifdef AGS_DEBUG g_message("ags_thread_pool_creation_thread@loopStart"); #endif g_mutex_lock(&(thread_pool->idle_mutex)); if(!g_atomic_int_get(&(thread_pool->create_threads))){ g_atomic_int_set(&(thread_pool->idle), TRUE); while(g_atomic_int_get(&(thread_pool->idle)) && !g_atomic_int_get(&(thread_pool->create_threads))){ g_cond_wait(&(thread_pool->idle_cond), &(thread_pool->idle_mutex)); } } g_atomic_int_set(&(thread_pool->idle), FALSE); g_atomic_int_set(&(thread_pool->create_threads), FALSE); g_mutex_unlock(&(thread_pool->idle_mutex)); g_mutex_lock(&(thread_pool->creation_mutex)); n_threads = g_list_length(g_atomic_pointer_get(&(thread_pool->returnable_thread))); if(n_threads < g_atomic_int_get(&(thread_pool->max_threads)) && n_threads < g_atomic_int_get(&(thread_pool->max_unused_threads))){ i_stop = g_atomic_int_get(&(thread_pool->max_unused_threads)) - n_threads; }else{ i_stop = 0; } start_queue = NULL; for(i = 0; i < i_stop; i++){ guint val; returnable_thread = (AgsThread *) ags_returnable_thread_new((GObject *) thread_pool); g_object_ref(returnable_thread); ags_thread_add_child_extended(thread_pool->parent, returnable_thread, TRUE, TRUE); ags_connectable_connect(AGS_CONNECTABLE(returnable_thread)); #if 0 ags_thread_start(returnable_thread); /* wait returnable_thread */ g_mutex_lock(&(returnable_thread->start_mutex)); ags_thread_set_status_flags(returnable_thread, AGS_THREAD_STATUS_START_WAIT); if(ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_START_DONE)){ while(ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(returnable_thread, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(&(returnable_thread->start_cond), &(returnable_thread->start_mutex)); } } g_mutex_unlock(&(returnable_thread->start_mutex)); #endif start_queue = g_list_prepend(start_queue, returnable_thread); g_atomic_pointer_set(&(thread_pool->returnable_thread), g_list_prepend(g_atomic_pointer_get(&(thread_pool->returnable_thread)), returnable_thread)); } if(g_atomic_int_get(&(thread_pool->queued)) != 0){ g_cond_signal(&(thread_pool->creation_cond)); } g_mutex_unlock(&(thread_pool->creation_mutex)); if(thread_pool->parent != NULL){ g_rec_mutex_lock(parent_mutex); ags_thread_add_start_queue_all(thread_pool->parent, start_queue); g_rec_mutex_unlock(parent_mutex); } #ifdef AGS_DEBUG g_message("ags_thread_pool_creation_thread@loopEND"); #endif } return(NULL); } /** * ags_thread_pool_pull: * @thread_pool: the #AgsThreadPool * * Pull a previously instantiated #AgsReturnableThread. Note this * function may block until a new thread is available. * * Returns: (transfer full): a new #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_pool_pull(AgsThreadPool *thread_pool) { AgsThread *returnable_thread; GList *list; static GMutex mutex; if(!AGS_IS_THREAD_POOL(thread_pool)){ return(NULL); } returnable_thread = NULL; g_mutex_lock(&mutex); /* */ g_mutex_lock(&(thread_pool->creation_mutex)); if(g_atomic_pointer_get(&(thread_pool->returnable_thread)) == NULL){ g_atomic_int_inc(&(thread_pool->queued)); while(g_atomic_int_get(&(thread_pool->queued)) != 0 && g_atomic_pointer_get(&(thread_pool->returnable_thread)) == NULL){ g_cond_wait(&(thread_pool->creation_cond), &(thread_pool->creation_mutex)); } } list = g_list_last(g_atomic_pointer_get(&(thread_pool->returnable_thread))); returnable_thread = list->data; g_atomic_pointer_set(&(thread_pool->returnable_thread), g_list_remove(g_atomic_pointer_get(&(thread_pool->returnable_thread)), returnable_thread)); g_atomic_int_dec_and_test(&(thread_pool->queued)); g_mutex_unlock(&(thread_pool->creation_mutex)); g_mutex_unlock(&mutex); /* signal create threads */ if(g_list_length(g_atomic_pointer_get(&(thread_pool->returnable_thread))) < g_atomic_int_get(&(thread_pool->max_unused_threads)) / 2){ g_mutex_lock(&(thread_pool->idle_mutex)); g_atomic_int_set(&(thread_pool->create_threads), TRUE); if(g_atomic_int_get(&(thread_pool->idle))){ g_cond_signal(&(thread_pool->idle_cond)); } g_mutex_unlock(&(thread_pool->idle_mutex)); } return(AGS_THREAD(returnable_thread)); } void ags_thread_pool_real_start(AgsThreadPool *thread_pool) { GList *list; GList *start_queue; gint n_threads; gint i; GRecMutex *parent_mutex; /* get parent mutex */ if(thread_pool->parent != NULL){ parent_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread_pool->parent); }else{ parent_mutex = NULL; } /* set running */ g_atomic_int_or(&(thread_pool->flags), AGS_THREAD_POOL_RUNNING); thread_pool->thread = g_thread_new("Advanced Gtk+ Sequencer - thread pool", ags_thread_pool_creation_thread, thread_pool); list = g_atomic_pointer_get(&(thread_pool->returnable_thread)); start_queue = NULL; while(list != NULL){ if(thread_pool->parent != NULL){ ags_thread_add_child_extended(AGS_THREAD(thread_pool->parent), AGS_THREAD(list->data), TRUE, TRUE); }else{ ags_thread_start(list->data); } ags_connectable_connect(AGS_CONNECTABLE(list->data)); // ags_thread_start(AGS_THREAD(list->data)); start_queue = g_list_prepend(start_queue, list->data); list = list->next; } if(parent_mutex != NULL){ g_rec_mutex_lock(parent_mutex); ags_thread_add_start_queue_all(thread_pool->parent, start_queue); g_rec_mutex_unlock(parent_mutex); } } /** * ags_thread_pool_start: * @thread_pool: the #AgsThreadPool * * Start the thread pool. * * Since: 3.0.0 */ void ags_thread_pool_start(AgsThreadPool *thread_pool) { g_return_if_fail(AGS_IS_THREAD_POOL(thread_pool)); g_object_ref(G_OBJECT(thread_pool)); g_signal_emit(G_OBJECT(thread_pool), thread_pool_signals[START], 0); g_object_unref(G_OBJECT(thread_pool)); } /** * ags_thread_pool_new: * @parent: the parent #AgsThread of returnable threads * * Create a new #AgsThreadPool. * * Returns: the new #AgsThreadPool * * Since: 3.0.0 */ AgsThreadPool* ags_thread_pool_new(AgsThread *parent) { AgsThreadPool *thread_pool; thread_pool = (AgsThreadPool *) g_object_new(AGS_TYPE_THREAD_POOL, NULL); thread_pool->parent = parent; if(parent != NULL){ g_object_ref(parent); } return(thread_pool); } gsequencer-3.1.3/ags/thread/ags_message_envelope.c0000644000175000017500000003353513607210263017151 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_message_envelope_class_init(AgsMessageEnvelopeClass *message_envelope); void ags_message_envelope_init(AgsMessageEnvelope *message_envelope); void ags_message_envelope_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_message_envelope_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_message_envelope_dispose(GObject *gobject); void ags_message_envelope_finalize(GObject *gobject); /** * SECTION:ags_message_envelope * @short_description: message envelope * @title: AgsMessageEnvelope * @section_id: * @include: ags/thread/ags_message_envelope.h * * The #AgsMessageEnvelope acts as messages passing system. */ enum{ PROP_0, PROP_SENDER, PROP_RECIPIENT, PROP_XML_DOC, }; static gpointer ags_message_envelope_parent_class = NULL; GType ags_message_envelope_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_message_envelope = 0; static const GTypeInfo ags_message_envelope_info = { sizeof (AgsMessageEnvelopeClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_message_envelope_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMessageEnvelope), 0, /* n_preallocs */ (GInstanceInitFunc) ags_message_envelope_init, }; ags_type_message_envelope = g_type_register_static(G_TYPE_OBJECT, "AgsMessageEnvelope", &ags_message_envelope_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_message_envelope); } return g_define_type_id__volatile; } void ags_message_envelope_class_init(AgsMessageEnvelopeClass *message_envelope) { GObjectClass *gobject; GParamSpec *param_spec; ags_message_envelope_parent_class = g_type_class_peek_parent(message_envelope); /* GObjectClass */ gobject = (GObjectClass *) message_envelope; gobject->set_property = ags_message_envelope_set_property; gobject->get_property = ags_message_envelope_get_property; gobject->dispose = ags_message_envelope_dispose; gobject->finalize = ags_message_envelope_finalize; /* properties */ /** * AgsMessageEnvelope:sender: * * The assigned sender. * * Since: 3.0.0 */ param_spec = g_param_spec_object("sender", i18n_pspec("sender of message envelope"), i18n_pspec("The sender of message envelope"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SENDER, param_spec); /** * AgsMessageEnvelope:recipient: * * The assigned recipient. * * Since: 3.0.0 */ param_spec = g_param_spec_object("recipient", i18n_pspec("recipient of message envelope"), i18n_pspec("The recipient of message envelope"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECIPIENT, param_spec); /** * AgsMessageEnvelope:xml-doc: * * The assigned xml-doc. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("xml-doc", i18n_pspec("xml document of message envelope"), i18n_pspec("The xml document provided by message envelope"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_XML_DOC, param_spec); } void ags_message_envelope_init(AgsMessageEnvelope *message_envelope) { g_rec_mutex_init(&(message_envelope->obj_mutex)); message_envelope->sender = NULL; message_envelope->recipient = NULL; message_envelope->doc = NULL; message_envelope->n_params = 0; message_envelope->parameter_name = NULL; message_envelope->value = NULL; } void ags_message_envelope_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMessageEnvelope *message_envelope; GRecMutex *message_envelope_mutex; message_envelope = AGS_MESSAGE_ENVELOPE(gobject); /* get message envelope mutex */ message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope); switch(prop_id){ case PROP_SENDER: { GObject *sender; sender = g_value_get_object(value); g_rec_mutex_lock(message_envelope_mutex); if(message_envelope->sender == sender){ g_rec_mutex_unlock(message_envelope_mutex); return; } if(message_envelope->sender != NULL){ g_object_unref(G_OBJECT(message_envelope->sender)); } if(sender != NULL){ g_object_ref(G_OBJECT(sender)); } message_envelope->sender = (GObject *) sender; g_rec_mutex_unlock(message_envelope_mutex); } break; case PROP_RECIPIENT: { GObject *recipient; recipient = g_value_get_object(value); g_rec_mutex_lock(message_envelope_mutex); if(message_envelope->recipient == recipient){ g_rec_mutex_unlock(message_envelope_mutex); return; } if(message_envelope->recipient != NULL){ g_object_unref(G_OBJECT(message_envelope->recipient)); } if(recipient != NULL){ g_object_ref(G_OBJECT(recipient)); } message_envelope->recipient = (GObject *) recipient; g_rec_mutex_unlock(message_envelope_mutex); } break; case PROP_XML_DOC: { xmlDoc *doc; doc = (xmlDoc *) g_value_get_pointer(value); g_rec_mutex_lock(message_envelope_mutex); message_envelope->doc = doc; g_rec_mutex_unlock(message_envelope_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_message_envelope_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMessageEnvelope *message_envelope; GRecMutex *message_envelope_mutex; message_envelope = AGS_MESSAGE_ENVELOPE(gobject); /* get message envelope mutex */ message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope); switch(prop_id){ case PROP_SENDER: { g_rec_mutex_lock(message_envelope_mutex); g_value_set_object(value, message_envelope->sender); g_rec_mutex_unlock(message_envelope_mutex); } break; case PROP_RECIPIENT: { g_rec_mutex_lock(message_envelope_mutex); g_value_set_object(value, message_envelope->recipient); g_rec_mutex_unlock(message_envelope_mutex); } break; case PROP_XML_DOC: { g_rec_mutex_lock(message_envelope_mutex); g_value_set_pointer(value, message_envelope->doc); g_rec_mutex_unlock(message_envelope_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_message_envelope_dispose(GObject *gobject) { AgsMessageEnvelope *message_envelope; message_envelope = AGS_MESSAGE_ENVELOPE(gobject); /* call parent */ G_OBJECT_CLASS(ags_message_envelope_parent_class)->dispose(gobject); } void ags_message_envelope_finalize(GObject *gobject) { AgsMessageEnvelope *message_envelope; guint i; message_envelope = AGS_MESSAGE_ENVELOPE(gobject); if(message_envelope->sender != NULL){ g_object_unref(message_envelope->sender); } if(message_envelope->recipient != NULL){ g_object_unref(message_envelope->recipient); } if(message_envelope->doc != NULL){ xmlFreeDoc(message_envelope->doc); } g_strfreev(message_envelope->parameter_name); for(i = 0; i < message_envelope->n_params; i++){ gpointer data; data = NULL; if(G_VALUE_HOLDS_STRING(&(message_envelope->value[i]))){ data = g_value_get_string(&(message_envelope->value[i])); }else if(G_VALUE_HOLDS_BOXED(&(message_envelope->value[i]))){ data = g_value_get_boxed(&(message_envelope->value[i])); }else if(G_VALUE_HOLDS_POINTER(&(message_envelope->value[i]))){ data = g_value_get_pointer(&(message_envelope->value[i])); }else if(G_VALUE_HOLDS_OBJECT(&(message_envelope->value[i]))){ data = g_value_get_object(&(message_envelope->value[i])); } if(message_envelope->free_func != NULL && message_envelope->free_func[i] != NULL){ message_envelope->free_func[i](data); } g_value_unset(&(message_envelope->value[i])); } g_free(message_envelope->value); g_free(message_envelope->free_func); /* call parent */ G_OBJECT_CLASS(ags_message_envelope_parent_class)->finalize(gobject); } /** * ags_message_envelope_get_sender: * @message_envelope: the #AgsMessageEnvelope * * Get sender. * * Returns: (transfer full): the sender * * Since: 3.0.0 */ GObject* ags_message_envelope_get_sender(AgsMessageEnvelope *message_envelope) { GObject *sender; GRecMutex *message_envelope_mutex; if(!AGS_IS_MESSAGE_ENVELOPE(message_envelope)){ return(NULL); } message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope); /* get sender */ g_rec_mutex_lock(message_envelope_mutex); sender = message_envelope->sender; if(sender != NULL){ g_object_ref(sender); } g_rec_mutex_unlock(message_envelope_mutex); return(sender); } /** * ags_message_envelope_get_recipient: * @message_envelope: the #AgsMessageEnvelope * * Get recipient. * * Returns: (transfer full): the recipient * * Since: 3.0.0 */ GObject* ags_message_envelope_get_recipient(AgsMessageEnvelope *message_envelope) { GObject *recipient; GRecMutex *message_envelope_mutex; if(!AGS_IS_MESSAGE_ENVELOPE(message_envelope)){ return(NULL); } message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope); /* get recipient */ g_rec_mutex_lock(message_envelope_mutex); recipient = message_envelope->recipient; if(recipient != NULL){ g_object_ref(recipient); } g_rec_mutex_unlock(message_envelope_mutex); return(recipient); } /** * ags_message_envelope_get_doc: * @message_envelope: the #AgsMessageEnvelope * * Get xmlDoc. * * Returns: (transfer none): the doc * * Since: 3.0.0 */ xmlDoc* ags_message_envelope_get_doc(AgsMessageEnvelope *message_envelope) { xmlDoc *doc; GRecMutex *message_envelope_mutex; if(!AGS_IS_MESSAGE_ENVELOPE(message_envelope)){ return(NULL); } message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope); /* get doc */ g_rec_mutex_lock(message_envelope_mutex); doc = message_envelope->doc; g_rec_mutex_unlock(message_envelope_mutex); return(doc); } /** * ags_message_envelope_get_parameter: * @message_envelope: the #AgsMessageEnvelope * @n_params: return location of parameter count * @parameter_name: return location %NULL terminated string vector containing parameter name * @value: return location of #GValue-struct array containing values * * Get parameters. * * Since: 3.0.0 */ void ags_message_envelope_get_parameter(AgsMessageEnvelope *message_envelope, guint *n_params, gchar ***parameter_name, GValue **value) { GRecMutex *message_envelope_mutex; if(!AGS_IS_MESSAGE_ENVELOPE(message_envelope)){ return; } message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope); /* get parameter */ g_rec_mutex_lock(message_envelope_mutex); if(n_params != NULL){ n_params[0] = message_envelope->n_params; } if(parameter_name != NULL){ parameter_name[0] = message_envelope->parameter_name; } if(value != NULL){ value[0] = message_envelope->value; } g_rec_mutex_unlock(message_envelope_mutex); } /** * ags_message_envelope_new: * @sender: the #GObject as sender * @recipient: the #GObject as recipient * @doc: the xmlDoc * * Create a new instance of #AgsMessageEnvelope. * * Returns: the new #AgsMessageEnvelope * * Since: 3.0.0 */ AgsMessageEnvelope* ags_message_envelope_new(GObject *sender, GObject *recipient, xmlDoc *doc) { AgsMessageEnvelope *message_envelope; message_envelope = (AgsMessageEnvelope *) g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, "sender", sender, "recipient", recipient, "xml-doc", doc, NULL); return(message_envelope); } /** * ags_message_envelope_new_with_params: * @sender: the #GObject as sender * @recipient: the #GObject as recipient * @doc: the xmlDoc * @n_params: n params * @parameter_name: %NULL terminated string vector containing parameter names * @value: the #GValue-struct array containing values * * Create a new instance of #AgsMessageEnvelope. * * Returns: the new #AgsMessageEnvelope * * Since: 3.0.0 */ AgsMessageEnvelope* ags_message_envelope_new_with_params(GObject *sender, GObject *recipient, xmlDoc *doc, guint n_params, gchar **parameter_name, GValue *value) { AgsMessageEnvelope *message_envelope; message_envelope = (AgsMessageEnvelope *) g_object_new(AGS_TYPE_MESSAGE_ENVELOPE, "sender", sender, "recipient", recipient, "xml-doc", doc, NULL); message_envelope->n_params = n_params; message_envelope->parameter_name = parameter_name; message_envelope->value = value; return(message_envelope); } gsequencer-3.1.3/ags/thread/ags_destroy_worker.c0000644000175000017500000001612613607210263016707 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_destroy_worker_class_init(AgsDestroyWorkerClass *destroy_worker); void ags_destroy_worker_init(AgsDestroyWorker *destroy_worker); void ags_destroy_worker_finalize(GObject *gobject); void ags_destroy_worker_start(AgsThread *thread); void ags_destroy_worker_stop(AgsThread *thread); void ags_destroy_worker_do_poll(AgsWorkerThread *worker_thread); /** * SECTION:ags_destroy_worker * @short_description: destroy worker * @title: AgsDestroyWorker * @section_id: * @include: ags/worker/ags_destroy_worker.h * * The #AgsDestroyWorker does non-realtime work. You might want * give it the responsibility to destroy your objects. */ static gpointer ags_destroy_worker_parent_class = NULL; AgsDestroyWorker *ags_destroy_worker = NULL; GType ags_destroy_worker_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_destroy_worker = 0; static const GTypeInfo ags_destroy_worker_info = { sizeof (AgsDestroyWorkerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_destroy_worker_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsDestroyWorker), 0, /* n_preallocs */ (GInstanceInitFunc) ags_destroy_worker_init, }; ags_type_destroy_worker = g_type_register_static(AGS_TYPE_WORKER_THREAD, "AgsDestroyWorker", &ags_destroy_worker_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_destroy_worker); } return g_define_type_id__volatile; } void ags_destroy_worker_class_init(AgsDestroyWorkerClass *destroy_worker) { GObjectClass *gobject; AgsThreadClass *thread; AgsWorkerThreadClass *worker_thread; ags_destroy_worker_parent_class = g_type_class_peek_parent(destroy_worker); /* GObject */ gobject = (GObjectClass *) destroy_worker; gobject->finalize = ags_destroy_worker_finalize; /* AgsThread */ thread = (AgsThreadClass *) destroy_worker; thread->start = ags_destroy_worker_start; thread->run = NULL; thread->stop = ags_destroy_worker_stop; /* AgsDestroyWorker */ worker_thread = (AgsWorkerThreadClass *) destroy_worker; worker_thread->do_poll = ags_destroy_worker_do_poll; } void ags_destroy_worker_init(AgsDestroyWorker *destroy_worker) { destroy_worker->destroy_interval = (struct timespec *) malloc(sizeof(struct timespec)); destroy_worker->destroy_interval->tv_sec = 1; destroy_worker->destroy_interval->tv_nsec = 0; /* lock destroy list */ g_rec_mutex_init(&(destroy_worker->destroy_mutex)); /* destroy list */ destroy_worker->destroy_list = NULL; } void ags_destroy_worker_finalize(GObject *gobject) { AgsDestroyWorker *destroy_worker; destroy_worker = AGS_DESTROY_WORKER(gobject); if(destroy_worker->destroy_interval != NULL){ free(destroy_worker->destroy_interval); } /* call parent */ G_OBJECT_CLASS(ags_destroy_worker_parent_class)->finalize(gobject); } void ags_destroy_worker_start(AgsThread *thread) { AgsWorkerThread *worker_thread; worker_thread = AGS_WORKER_THREAD(thread); ags_worker_thread_set_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUNNING); worker_thread->worker_thread = g_thread_new("Advanced Gtk+ Sequencer - destroy worker", ags_woker_thread_do_poll_loop, worker_thread); } void ags_destroy_worker_stop(AgsThread *thread) { AgsWorkerThread *worker_thread; worker_thread = AGS_WORKER_THREAD(thread); ags_worker_thread_set_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUNNING); } void ags_destroy_worker_do_poll(AgsWorkerThread *worker_thread) { AgsDestroyWorker *destroy_worker; GList *list, *list_start; destroy_worker = AGS_DESTROY_WORKER(worker_thread); g_rec_mutex_lock(&(destroy_worker->destroy_mutex)); list_start = list = destroy_worker->destroy_list; destroy_worker->destroy_list = NULL; g_rec_mutex_unlock(&(destroy_worker->destroy_mutex)); while(list != NULL){ AGS_DESTROY_ENTRY(list->data)->destroy_func(AGS_DESTROY_ENTRY(list->data)->ptr); list = list->next; } g_list_free_full(list_start, g_free); nanosleep(destroy_worker->destroy_interval, NULL); } /** * ags_destroy_entry_alloc: * @ptr: a pointer * @destroy_func: (scope call): the @ptr's destroy function * * Allocated a destroy entry. * * Returns: (type gpointer) (transfer none): the allocated #AgsDestroyEntry * * Since: 3.0.0 */ AgsDestroyEntry* ags_destroy_entry_alloc(gpointer ptr, AgsDestroyFunc destroy_func) { AgsDestroyEntry *destroy_entry; destroy_entry = (AgsDestroyEntry *) malloc(sizeof(AgsDestroyEntry)); destroy_entry->ptr = ptr; destroy_entry->destroy_func = destroy_func; return(destroy_entry); } /** * ags_destroy_worker_add: * @destroy_worker: (type gpointer): the #AgsDestroyWorker * @ptr: the gpointer to destroy * @destroy_func: (scope call): the AgsDestroyFunc * * Add @ptr for destruction using @destroy_func. * * Since: 3.0.0 */ void ags_destroy_worker_add(AgsDestroyWorker *destroy_worker, gpointer ptr, AgsDestroyFunc destroy_func) { AgsDestroyEntry *destroy_entry; if(!AGS_IS_DESTROY_WORKER(destroy_worker) || ptr == NULL || destroy_func == NULL){ return; } destroy_entry = ags_destroy_entry_alloc(ptr, destroy_func); g_rec_mutex_lock(&(destroy_worker->destroy_mutex)); destroy_worker->destroy_list = g_list_prepend(destroy_worker->destroy_list, destroy_entry); g_rec_mutex_unlock(&(destroy_worker->destroy_mutex)); } /** * ags_destroy_worker_get_instance: * * Get your destroy worker instance. * * Returns: (transfer none): the #AgsDestroyWorker instance * * Since: 3.0.0 */ AgsDestroyWorker* ags_destroy_worker_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_destroy_worker == NULL){ ags_destroy_worker = ags_destroy_worker_new(); } g_mutex_unlock(&mutex); return(ags_destroy_worker); } /** * ags_destroy_worker_new: * * Create a new #AgsDestroyWorker. * * Returns: the new #AgsDestroyWorker * * Since: 3.0.0 */ AgsDestroyWorker* ags_destroy_worker_new() { AgsDestroyWorker *destroy_worker; destroy_worker = (AgsDestroyWorker *) g_object_new(AGS_TYPE_DESTROY_WORKER, NULL); return(destroy_worker); } gsequencer-3.1.3/ags/thread/ags_timestamp.c0000644000175000017500000001602113607210263015622 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_timestamp_class_init(AgsTimestampClass *timestamp); void ags_timestamp_init (AgsTimestamp *timestamp); void ags_timestamp_finalize(GObject *gobject); /** * SECTION:ags_timestamp * @short_description: Timestamp unix and alike * @title: AgsTimestamp * @section_id: * @include: ags/thread/ags_timestamp.h * * #AgsTimestamp measure of time. */ static gpointer ags_timestamp_parent_class = NULL; GType ags_timestamp_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_timestamp = 0; static const GTypeInfo ags_timestamp_info = { sizeof(AgsTimestampClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_timestamp_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsTimestamp), 0, /* n_preallocs */ (GInstanceInitFunc) ags_timestamp_init, }; ags_type_timestamp = g_type_register_static(G_TYPE_OBJECT, "AgsTimestamp", &ags_timestamp_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_timestamp); } return g_define_type_id__volatile; } void ags_timestamp_class_init(AgsTimestampClass *timestamp) { GObjectClass *gobject; ags_timestamp_parent_class = g_type_class_peek_parent(timestamp); /* GObjectClass */ gobject = (GObjectClass *) timestamp; gobject->finalize = ags_timestamp_finalize; } void ags_timestamp_init(AgsTimestamp *timestamp) { timestamp->flags = AGS_TIMESTAMP_UNIX; /* add timestamp mutex */ g_rec_mutex_init(&(timestamp->obj_mutex)); /* common fields */ time(&(timestamp->timer.unix_time.time_val)); timestamp->delay = 0.0; timestamp->attack = 0; } void ags_timestamp_finalize(GObject *gobject) { AgsTimestamp *timestamp; timestamp = AGS_TIMESTAMP(gobject); /* call parent */ G_OBJECT_CLASS(ags_timestamp_parent_class)->finalize(gobject); } /** * ags_timestamp_test_flags: * @timestamp: the #AgsTimestamp * @flags: the flags * * Test @flags to be set. * * Returns: if @flags set returning %TRUE otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_timestamp_test_flags(AgsTimestamp *timestamp, guint flags) { gboolean success; GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return(FALSE); } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* test flags */ g_rec_mutex_lock(timestamp_mutex); success = ((flags & (timestamp->flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(timestamp_mutex); return(success); } /** * ags_timestamp_set_flags: * @timestamp: the #AgsTimestamp * @flags: the flags * * Set @flags of @timestamp. * * Since: 3.0.0 */ void ags_timestamp_set_flags(AgsTimestamp *timestamp, guint flags) { GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return; } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* set flags */ g_rec_mutex_lock(timestamp_mutex); timestamp->flags |= flags; g_rec_mutex_unlock(timestamp_mutex); } /** * ags_timestamp_unset_flags: * @timestamp: the #AgsTimestamp * @flags: the flags * * Unset @flags of @timestamp. * * Since: 3.0.0 */ void ags_timestamp_unset_flags(AgsTimestamp *timestamp, guint flags) { GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return; } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* unset flags */ g_rec_mutex_lock(timestamp_mutex); timestamp->flags &= (~flags); g_rec_mutex_unlock(timestamp_mutex); } /** * ags_timestamp_get_unix_time: * @timestamp: the #AgsTimestamp * * Get unix time. * * Returns: the unix time as time_t value * * Since: 3.0.0 */ time_t ags_timestamp_get_unix_time(AgsTimestamp *timestamp) { time_t unix_time; GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return(0); } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* get ags offset */ g_rec_mutex_lock(timestamp_mutex); unix_time = timestamp->timer.unix_time.time_val; g_rec_mutex_unlock(timestamp_mutex); return(unix_time); } /** * ags_timestamp_set_unix_time: * @timestamp: the #AgsTimestamp * @unix_time: the unix time value * * Set unix time. * * Since: 3.0.0 */ void ags_timestamp_set_unix_time(AgsTimestamp *timestamp, time_t unix_time) { GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return; } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* get ags offset */ g_rec_mutex_lock(timestamp_mutex); timestamp->timer.unix_time.time_val = unix_time; g_rec_mutex_unlock(timestamp_mutex); } /** * ags_timestamp_get_ags_offset: * @timestamp: the #AgsTimestamp * * Get AGS offset. * * Returns: the AGS offset as unsigned 64 bit integer * * Since: 3.0.0 */ guint64 ags_timestamp_get_ags_offset(AgsTimestamp *timestamp) { guint64 ags_offset; GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return(0); } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* get ags offset */ g_rec_mutex_lock(timestamp_mutex); ags_offset = timestamp->timer.ags_offset.offset; g_rec_mutex_unlock(timestamp_mutex); return(ags_offset); } /** * ags_timestamp_set_ags_offset: * @timestamp: the #AgsTimestamp * @ags_offset: the AGS offset * * Set AGS offset as unsigned 64 bit integer. * * Since: 3.0.0 */ void ags_timestamp_set_ags_offset(AgsTimestamp *timestamp, guint64 ags_offset) { GRecMutex *timestamp_mutex; if(!AGS_IS_TIMESTAMP(timestamp)){ return; } /* get timestamp mutex */ timestamp_mutex = AGS_TIMESTAMP_GET_OBJ_MUTEX(timestamp); /* get ags offset */ g_rec_mutex_lock(timestamp_mutex); timestamp->timer.ags_offset.offset = ags_offset; g_rec_mutex_unlock(timestamp_mutex); } /** * ags_timestamp_new: * * Creates an #AgsTimestamp * * Returns: a new #AgsTimestamp * * Since: 3.0.0 */ AgsTimestamp* ags_timestamp_new() { AgsTimestamp *timestamp; timestamp = (AgsTimestamp *) g_object_new(AGS_TYPE_TIMESTAMP, NULL); return(timestamp); } gsequencer-3.1.3/ags/thread/ags_message_envelope.h0000644000175000017500000000557313607210263017157 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MESSAGE_ENVELOPE_H__ #define __AGS_MESSAGE_ENVELOPE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MESSAGE_ENVELOPE (ags_message_envelope_get_type()) #define AGS_MESSAGE_ENVELOPE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MESSAGE_ENVELOPE, AgsMessageEnvelope)) #define AGS_MESSAGE_ENVELOPE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MESSAGE_ENVELOPE, AgsMessageEnvelope)) #define AGS_IS_MESSAGE_ENVELOPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MESSAGE_ENVELOPE)) #define AGS_IS_MESSAGE_ENVELOPE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MESSAGE_ENVELOPE)) #define AGS_MESSAGE_ENVELOPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_MESSAGE_ENVELOPE, AgsMessageEnvelopeClass)) #define AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(obj) (&(((AgsMessageEnvelope *) obj)->obj_mutex)) typedef struct _AgsMessageEnvelope AgsMessageEnvelope; typedef struct _AgsMessageEnvelopeClass AgsMessageEnvelopeClass; struct _AgsMessageEnvelope { GObject gobject; GRecMutex obj_mutex; GObject *sender; GObject *recipient; xmlDoc *doc; guint n_params; gchar **parameter_name; GValue *value; GDestroyNotify *free_func; }; struct _AgsMessageEnvelopeClass { GObjectClass gobject; }; GType ags_message_envelope_get_type(); GObject* ags_message_envelope_get_sender(AgsMessageEnvelope *message_envelope); GObject* ags_message_envelope_get_recipient(AgsMessageEnvelope *message_envelope); xmlDoc* ags_message_envelope_get_doc(AgsMessageEnvelope *message_envelope); void ags_message_envelope_get_parameter(AgsMessageEnvelope *message_envelope, guint *n_params, gchar ***parameter_name, GValue **value); AgsMessageEnvelope* ags_message_envelope_new(GObject *sender, GObject *recipient, xmlDoc *doc); AgsMessageEnvelope* ags_message_envelope_new_with_params(GObject *sender, GObject *recipient, xmlDoc *doc, guint n_params, gchar **parameter_name, GValue *value); G_END_DECLS #endif /*__AGS_MESSAGE_ENVELOPE_H__*/ gsequencer-3.1.3/ags/thread/ags_generic_main_loop.h0000644000175000017500000000431313607210263017276 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_GENERIC_MAIN_LOOP_H__ #define __AGS_GENERIC_MAIN_LOOP_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_GENERIC_MAIN_LOOP (ags_generic_main_loop_get_type()) #define AGS_GENERIC_MAIN_LOOP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_GENERIC_MAIN_LOOP, AgsGenericMainLoop)) #define AGS_GENERIC_MAIN_LOOP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_GENERIC_MAIN_LOOP, AgsGenericMainLoopClass)) #define AGS_IS_GENERIC_MAIN_LOOP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_GENERIC_MAIN_LOOP)) #define AGS_IS_GENERIC_MAIN_LOOP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_GENERIC_MAIN_LOOP)) #define AGS_GENERIC_MAIN_LOOP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_GENERIC_MAIN_LOOP, AgsGenericMainLoopClass)) #define AGS_GENERIC_MAIN_LOOP_DEFAULT_JIFFIE (AGS_THREAD_DEFAULT_JIFFIE) typedef struct _AgsGenericMainLoop AgsGenericMainLoop; typedef struct _AgsGenericMainLoopClass AgsGenericMainLoopClass; struct _AgsGenericMainLoop { AgsThread thread; GRecMutex tree_lock; volatile gboolean is_syncing; volatile gboolean is_critical_region; volatile guint critical_region_ref; }; struct _AgsGenericMainLoopClass { AgsThreadClass thread; }; GType ags_generic_main_loop_get_type(); AgsGenericMainLoop* ags_generic_main_loop_new(); G_END_DECLS #endif /*__AGS_GENERIC_MAIN_LOOP_H__*/ gsequencer-3.1.3/ags/thread/ags_timestamp.h0000644000175000017500000000600613607210263015631 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TIMESTAMP_H__ #define __AGS_TIMESTAMP_H__ #include #include #define AGS_TYPE_TIMESTAMP (ags_timestamp_get_type()) #define AGS_TIMESTAMP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TIMESTAMP, AgsTimestamp)) #define AGS_TIMESTAMP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TIMESTAMP, AgsTimestampClass)) #define AGS_IS_TIMESTAMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TIMESTAMP)) #define AGS_IS_TIMESTAMP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TIMESTAMP)) #define AGS_TIMESTAMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_TIMESTAMP, AgsTimestampClass)) #define AGS_TIMESTAMP_GET_OBJ_MUTEX(obj) (&(((AgsTimestamp *) obj)->obj_mutex)) typedef struct _AgsTimestamp AgsTimestamp; typedef struct _AgsTimestampClass AgsTimestampClass; /** * AgsTimestampFlags: * @AGS_TIMESTAMP_UNIX: unix timestamp is used * @AGS_TIMESTAMP_OFFSET: internal offset is used * @AGS_TIMESTAMP_OUTDATED: the timestamp is outdated * * Enum values to control the behavior or indicate internal state of #AgsTimestamp by * enable/disable as sync_flags. */ typedef enum{ AGS_TIMESTAMP_UNIX = 1, AGS_TIMESTAMP_OFFSET = 1 << 1, AGS_TIMESTAMP_OUTDATED = 1 << 2, }AgsTimestampFlags; struct _AgsTimestamp { GObject gobject; guint flags; GRecMutex obj_mutex; union{ struct _unix{ time_t time_val; }unix_time; struct _ags{ guint64 offset; }ags_offset; }timer; gdouble delay; guint attack; }; struct _AgsTimestampClass { GObjectClass gobject; }; GType ags_timestamp_get_type(void); /* flags */ gboolean ags_timestamp_test_flags(AgsTimestamp *timestamp, guint flags); void ags_timestamp_set_flags(AgsTimestamp *timestamp, guint flags); void ags_timestamp_unset_flags(AgsTimestamp *timestamp, guint flags); /* query */ time_t ags_timestamp_get_unix_time(AgsTimestamp *timestamp); void ags_timestamp_set_unix_time(AgsTimestamp *timestamp, time_t unix_time); guint64 ags_timestamp_get_ags_offset(AgsTimestamp *timestamp); void ags_timestamp_set_ags_offset(AgsTimestamp *timestamp, guint64 ags_offset); /* */ AgsTimestamp* ags_timestamp_new(); #endif /*__AGS_TIMESTAMP_H__*/ gsequencer-3.1.3/ags/thread/ags_task.h0000644000175000017500000000465713607210263014602 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TASK_H__ #define __AGS_TASK_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_TASK (ags_task_get_type()) #define AGS_TASK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TASK, AgsTask)) #define AGS_TASK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TASK, AgsTaskClass)) #define AGS_IS_TASK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_TASK)) #define AGS_IS_TASK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_TASK)) #define AGS_TASK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_TASK, AgsTaskClass)) #define AGS_TASK_GET_OBJ_MUTEX(obj) (&(((AgsTask *) obj)->obj_mutex)) typedef struct _AgsTask AgsTask; typedef struct _AgsTaskClass AgsTaskClass; /** * AgsTaskFlags: * @AGS_TASK_LOCKED: the task is locked * @AGS_TASK_CYCLIC: call task repeatedly * * Enum values to control the behavior or indicate internal state of #AgsTask by * enable/disable as flags. */ typedef enum{ AGS_TASK_LOCKED = 1, AGS_TASK_CYCLIC = 1 << 1, }AgsTaskFlags; struct _AgsTask { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *task_name; GObject *task_launcher; }; struct _AgsTaskClass { GObjectClass gobject; void (*launch)(AgsTask *task); void (*failure)(AgsTask *task, GError *error); }; GType ags_task_get_type(); gboolean ags_task_test_flags(AgsTask *task, guint flags); void ags_task_set_flags(AgsTask *task, guint flags); void ags_task_unset_flags(AgsTask *task, guint flags); void ags_task_launch(AgsTask *task); void ags_task_failure(AgsTask *task, GError *error); AgsTask* ags_task_new(); G_END_DECLS #endif /*__AGS_TASK_H__*/ gsequencer-3.1.3/ags/thread/ags_message_delivery.c0000644000175000017500000004016313607210263017152 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_message_delivery_class_init(AgsMessageDeliveryClass *message_delivery); void ags_message_delivery_init(AgsMessageDelivery *message_delivery); void ags_message_delivery_dispose(GObject *gobject); void ags_message_delivery_finalize(GObject *gobject); /** * SECTION:ags_message_delivery * @short_description: message delivery * @title: AgsMessageDelivery * @section_id: * @include: ags/thread/ags_message_delivery.h * * The #AgsMessageDelivery acts as messages passing system. */ AgsMessageDelivery *ags_message_delivery = NULL; static gpointer ags_message_delivery_parent_class = NULL; GType ags_message_delivery_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_message_delivery = 0; static const GTypeInfo ags_message_delivery_info = { sizeof (AgsMessageDeliveryClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_message_delivery_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMessageDelivery), 0, /* n_preallocs */ (GInstanceInitFunc) ags_message_delivery_init, }; ags_type_message_delivery = g_type_register_static(G_TYPE_OBJECT, "AgsMessageDelivery", &ags_message_delivery_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_message_delivery); } return g_define_type_id__volatile; } void ags_message_delivery_class_init(AgsMessageDeliveryClass *message_delivery) { GObjectClass *gobject; ags_message_delivery_parent_class = g_type_class_peek_parent(message_delivery); /* GObjectClass */ gobject = (GObjectClass *) message_delivery; gobject->dispose = ags_message_delivery_dispose; gobject->finalize = ags_message_delivery_finalize; } void ags_message_delivery_init(AgsMessageDelivery *message_delivery) { g_rec_mutex_init(&(message_delivery->obj_mutex)); message_delivery->message_queue = NULL; } void ags_message_delivery_dispose(GObject *gobject) { AgsMessageDelivery *message_delivery; message_delivery = AGS_MESSAGE_DELIVERY(gobject); /* message queue */ if(message_delivery->message_queue != NULL){ g_list_free_full(message_delivery->message_queue, g_object_unref); message_delivery->message_queue = NULL; } /* call parent */ G_OBJECT_CLASS(ags_message_delivery_parent_class)->dispose(gobject); } void ags_message_delivery_finalize(GObject *gobject) { AgsMessageDelivery *message_delivery; message_delivery = AGS_MESSAGE_DELIVERY(gobject); /* message queue */ if(message_delivery->message_queue != NULL){ g_list_free_full(message_delivery->message_queue, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_message_delivery_parent_class)->finalize(gobject); } /** * ags_message_delivery_add_message_queue: * @message_delivery: the #AgsMessageDelivery * @message_queue: the #AgsMessageQueue * * Add @message_queue to @message_delivery. * * Since: 3.0.0 */ void ags_message_delivery_add_message_queue(AgsMessageDelivery *message_delivery, GObject *message_queue) { if(!AGS_IS_MESSAGE_DELIVERY(message_delivery) || !AGS_IS_MESSAGE_QUEUE(message_queue)){ return; } g_rec_mutex_lock(&(message_delivery->obj_mutex)); if(g_list_find(message_delivery->message_queue, message_queue) == NULL){ g_object_ref(message_queue); message_delivery->message_queue = g_list_prepend(message_delivery->message_queue, message_queue); } g_rec_mutex_unlock(&(message_delivery->obj_mutex)); } /** * ags_message_delivery_remove_message_queue: * @message_delivery: the #AgsMessageDelivery * @message_queue: the #AgsMessageQueue * * Remove @message_queue to @message_delivery. * * Since: 3.0.0 */ void ags_message_delivery_remove_message_queue(AgsMessageDelivery *message_delivery, GObject *message_queue) { if(!AGS_IS_MESSAGE_DELIVERY(message_delivery) || !AGS_IS_MESSAGE_QUEUE(message_queue)){ return; } g_rec_mutex_lock(&(message_delivery->obj_mutex)); if(g_list_find(message_delivery->message_queue, message_queue) != NULL){ message_delivery->message_queue = g_list_remove(message_delivery->message_queue, message_queue); g_object_unref(message_queue); } g_rec_mutex_unlock(&(message_delivery->obj_mutex)); } /** * ags_message_delivery_find_sender_namespace: * @message_delivery: the #AgsMessageDelivery to search * @sender_namespace: the sender namespace as string to find * * Find sender namespace of #AgsMessageQueue in @message_delivery. * * Returns: (element-type Ags.MessageQueue) (transfer full): the matching #GList-struct containing #AgsMessageQueue or %NULL * * Since: 3.0.0 */ GList* ags_message_delivery_find_sender_namespace(AgsMessageDelivery *message_delivery, gchar *sender_namespace) { AgsMessageQueue *current_message_queue; GList *start_list, *list; GList *start_message_queue; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery) || sender_namespace == NULL){ return(NULL); } g_rec_mutex_lock(&(message_delivery->obj_mutex)); list = start_list = g_list_copy_deep(message_delivery->message_queue, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_delivery->obj_mutex)); start_message_queue = NULL; while(list != NULL){ current_message_queue = AGS_MESSAGE_QUEUE(list->data); /* compare sender_namespace */ g_rec_mutex_lock(&(current_message_queue->obj_mutex)); if(!g_strcmp0(sender_namespace, current_message_queue->sender_namespace)){ start_message_queue = g_list_prepend(start_message_queue, current_message_queue); g_object_ref(current_message_queue); } g_rec_mutex_unlock(&(current_message_queue->obj_mutex)); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); return(start_message_queue); } /** * ags_message_delivery_find_recipient_namespace: * @message_delivery: the #AgsMessageDelivery to search * @recipient_namespace: the recipient namespace as string to find * * Find recipient namespace of #AgsMessageQueue in @message_delivery. * * Returns: (element-type Ags.MessageQueue) (transfer full): the matching #GList-struct containing #AgsMessageQueue or %NULL * * Since: 3.0.0 */ GList* ags_message_delivery_find_recipient_namespace(AgsMessageDelivery *message_delivery, gchar *recipient_namespace) { AgsMessageQueue *current_message_queue; GList *start_list, *list; GList *start_message_queue; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery) || recipient_namespace == NULL){ return(NULL); } g_rec_mutex_lock(&(message_delivery->obj_mutex)); list = start_list = g_list_copy_deep(message_delivery->message_queue, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_delivery->obj_mutex)); start_message_queue = NULL; while(list != NULL){ current_message_queue = AGS_MESSAGE_QUEUE(list->data); /* compare recipient_namespace */ g_rec_mutex_lock(&(current_message_queue->obj_mutex)); if(!g_strcmp0(recipient_namespace, current_message_queue->recipient_namespace)){ start_message_queue = g_list_prepend(start_message_queue, current_message_queue); g_object_ref(current_message_queue); } g_rec_mutex_unlock(&(current_message_queue->obj_mutex)); /* iterate */ list = list->next; } g_list_free_full(start_list, g_object_unref); return(start_message_queue); } /** * ags_message_delivery_add_message_envelope: * @message_delivery: the #AgsMessageDelivery * @sender_namespace: the sender namespace as string * @message_envelope: the #AgsMessageEnvelope * * Add @message to an #AgsMessageQueue specified by @sender_namespace. * * Since: 3.0.0 */ void ags_message_delivery_add_message_envelope(AgsMessageDelivery *message_delivery, gchar *sender_namespace, GObject *message_envelope) { GList *start_message_queue, *message_queue; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery) || !AGS_IS_MESSAGE_ENVELOPE(message_envelope) || sender_namespace == NULL){ return; } message_queue = start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, sender_namespace); while(message_queue != NULL){ ags_message_queue_add_message_envelope(message_queue->data, message_envelope); message_queue = message_queue->next; } g_list_free_full(start_message_queue, g_object_unref); } /** * ags_message_delivery_remove_message_envelope: * @message_delivery: the #AgsMessageDelivery * @sender_namespace: the sender namespace as string * @message_envelope: the #AgsMessageEnvelope * * Remove @message from an #AgsMessageQueue specified by @sender_namespace. * * Since: 3.0.0 */ void ags_message_delivery_remove_message_envelope(AgsMessageDelivery *message_delivery, gchar *sender_namespace, GObject *message_envelope) { GList *start_message_queue, *message_queue; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery) || !AGS_IS_MESSAGE_ENVELOPE(message_envelope) || sender_namespace == NULL){ return; } message_queue = start_message_queue = ags_message_delivery_find_sender_namespace(message_delivery, sender_namespace); while(message_queue != NULL){ ags_message_queue_remove_message_envelope(message_queue->data, message_envelope); message_queue = message_queue->next; } g_list_free_full(start_message_queue, g_object_unref); } /** * ags_message_delivery_find_sender: * @message_delivery: the #AgsMessageDelivery * @recipient_namespace: the recipient namespace as string, maybe %NULL * @sender: the sender as #GObject * * Find @sender for @recipient_namespace matching #AgsMessageQueue. If @recipient_namespace equals %NULL match * all available message queues. * * Returns: (element-type Ags.MessageEnvelope) (transfer full): all matching #AgsMessageEnvelope as #GList-struct * * Since: 3.0.0 */ GList* ags_message_delivery_find_sender(AgsMessageDelivery *message_delivery, gchar *recipient_namespace, GObject *sender) { GList *start_message_queue, *message_queue; GList *start_list, *list; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery)){ return(NULL); } if(recipient_namespace == NULL){ g_rec_mutex_lock(&(message_delivery->obj_mutex)); message_queue = start_message_queue = g_list_copy_deep(message_delivery->message_queue, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_delivery->obj_mutex)); }else{ message_queue = start_message_queue = ags_message_delivery_find_recipient_namespace(message_delivery, recipient_namespace); } start_list = NULL; while(message_queue != NULL){ list = ags_message_queue_find_sender(message_queue->data, sender); if(list != NULL){ if(start_list == NULL){ start_list = list; }else{ start_list = g_list_concat(list, start_list); } } /* iterate */ message_queue = message_queue->next; } g_list_free_full(start_message_queue, g_object_unref); return(start_list); } /** * ags_message_delivery_find_recipient: * @message_delivery: the #AgsMessageDelivery * @recipient_namespace: the recipient namespace as string, maybe %NULL * @recipient: the recipient as #GObject * * Find @recipient for @recipient_namespace matching #AgsMessageQueue. If @recipient_namespace equals %NULL match * all available message queues. * * Returns: (element-type Ags.MessageEnvelope) (transfer full): all matching #AgsMessageEnvelope as #GList-struct * * Since: 3.0.0 */ GList* ags_message_delivery_find_recipient(AgsMessageDelivery *message_delivery, gchar *recipient_namespace, GObject *recipient) { GList *start_message_queue, *message_queue; GList *start_list, *list; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery)){ return(NULL); } if(recipient_namespace == NULL){ g_rec_mutex_lock(&(message_delivery->obj_mutex)); message_queue = start_message_queue = g_list_copy_deep(message_delivery->message_queue, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_delivery->obj_mutex)); }else{ message_queue = start_message_queue = ags_message_delivery_find_recipient_namespace(message_delivery, recipient_namespace); } start_list = NULL; while(message_queue != NULL){ list = ags_message_queue_find_recipient(message_queue->data, recipient); if(list != NULL){ if(start_list == NULL){ start_list = list; }else{ start_list = g_list_concat(list, start_list); } } /* iterate */ message_queue = message_queue->next; } g_list_free_full(start_message_queue, g_object_unref); return(start_list); } /** * ags_message_delivery_query_message: * @message_delivery: the #AgsMessageDelivery * @recipient_namespace: the recipient namespace as string, maybe %NULL * @xpath: the xpath to query * * Query @xpath for @recipient_namespace matching #AgsMessageQueue. If @recipient_namespace equals %NULL match * all available message queues. * * Returns: (element-type Ags.MessageEnvelope) (transfer full): all matching #AgsMessageEnvelope as #GList-struct * * Since: 3.0.0 */ GList* ags_message_delivery_query_message(AgsMessageDelivery *message_delivery, gchar *recipient_namespace, gchar *xpath) { GList *start_message_queue, *message_queue; GList *start_list, *list; if(!AGS_IS_MESSAGE_DELIVERY(message_delivery)){ return(NULL); } if(recipient_namespace == NULL){ g_rec_mutex_lock(&(message_delivery->obj_mutex)); message_queue = start_message_queue = g_list_copy_deep(message_delivery->message_queue, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_delivery->obj_mutex)); }else{ message_queue = start_message_queue = ags_message_delivery_find_recipient_namespace(message_delivery, recipient_namespace); } start_list = NULL; while(message_queue != NULL){ list = ags_message_queue_query_message(message_queue, xpath); if(list != NULL){ if(start_list == NULL){ start_list = list; }else{ start_list = g_list_concat(list, start_list); } } /* iterate */ message_queue = message_queue->next; } g_list_free_full(start_message_queue, g_object_unref); return(start_list); } /** * ags_message_delivery_get_instance: * * Get the #AgsMessageDelivery instance. * * Returns: (transfer none): the #AgsMessageDelivery * * Since: 3.0.0 */ AgsMessageDelivery* ags_message_delivery_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_message_delivery == NULL){ ags_message_delivery = ags_message_delivery_new(); } g_mutex_unlock(&mutex); return(ags_message_delivery); } /** * ags_message_delivery_new: * * Create a new #AgsMessageDelivery. * * Returns: the new #AgsMessageDelivery * * Since: 3.0.0 */ AgsMessageDelivery* ags_message_delivery_new() { AgsMessageDelivery *message_delivery; message_delivery = (AgsMessageDelivery *) g_object_new(AGS_TYPE_MESSAGE_DELIVERY, NULL); return(message_delivery); } gsequencer-3.1.3/ags/thread/ags_message_delivery.h0000644000175000017500000000655713607210263017170 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MESSAGE_DELIVERY_H__ #define __AGS_MESSAGE_DELIVERY_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MESSAGE_DELIVERY (ags_message_delivery_get_type()) #define AGS_MESSAGE_DELIVERY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MESSAGE_DELIVERY, AgsMessageDelivery)) #define AGS_MESSAGE_DELIVERY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MESSAGE_DELIVERY, AgsMessageDelivery)) #define AGS_IS_MESSAGE_DELIVERY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MESSAGE_DELIVERY)) #define AGS_IS_MESSAGE_DELIVERY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MESSAGE_DELIVERY)) #define AGS_MESSAGE_DELIVERY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_MESSAGE_DELIVERY, AgsMessageDeliveryClass)) #define AGS_MESSAGE_DELIVERY_GET_OBJ_MUTEX(obj) (&(((AgsMessageDelivery *) obj)->obj_mutex)) typedef struct _AgsMessageDelivery AgsMessageDelivery; typedef struct _AgsMessageDeliveryClass AgsMessageDeliveryClass; struct _AgsMessageDelivery { GObject gobject; GRecMutex obj_mutex; GList *message_queue; }; struct _AgsMessageDeliveryClass { GObjectClass gobject; }; GType ags_message_delivery_get_type(); void ags_message_delivery_add_message_queue(AgsMessageDelivery *message_delivery, GObject *message_queue); void ags_message_delivery_remove_message_queue(AgsMessageDelivery *message_delivery, GObject *message_queue); GList* ags_message_delivery_find_sender_namespace(AgsMessageDelivery *message_delivery, gchar *sender_namespace); GList* ags_message_delivery_find_recipient_namespace(AgsMessageDelivery *message_delivery, gchar *recipient_namespace); void ags_message_delivery_add_message_envelope(AgsMessageDelivery *message_delivery, gchar *sender_namespace, GObject *message_envelope); void ags_message_delivery_remove_message_envelope(AgsMessageDelivery *message_delivery, gchar *sender_namespace, GObject *message_envelope); GList* ags_message_delivery_find_sender(AgsMessageDelivery *message_delivery, gchar *recipient_namespace, GObject *sender); GList* ags_message_delivery_find_recipient(AgsMessageDelivery *message_delivery, gchar *recipient_namespace, GObject *recipient); GList* ags_message_delivery_query_message(AgsMessageDelivery *message_delivery, gchar *recipient_namespace, gchar *xpath); AgsMessageDelivery* ags_message_delivery_get_instance(); AgsMessageDelivery* ags_message_delivery_new(); G_END_DECLS #endif /*__AGS_MESSAGE_DELIVERY_H__*/ gsequencer-3.1.3/ags/thread/ags_thread_pool.h0000644000175000017500000000553713607210263016136 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_THREAD_POOL_H__ #define __AGS_THREAD_POOL_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_THREAD_POOL (ags_thread_pool_get_type()) #define AGS_THREAD_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_THREAD_POOL, AgsThreadPool)) #define AGS_THREAD_POOL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_THREAD_POOL, AgsThreadPoolClass)) #define AGS_IS_THREAD_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_THREAD_POOL)) #define AGS_IS_THREAD_POOL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_THREAD_POOL)) #define AGS_THREAD_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_THREAD_POOL, AgsThreadPoolClass)) #define AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS (8) #define AGS_THREAD_POOL_DEFAULT_MAX_THREADS (1024) typedef struct _AgsThreadPool AgsThreadPool; typedef struct _AgsThreadPoolClass AgsThreadPoolClass; /** * AgsThreadPoolFlags: * @AGS_THREAD_POOL_RUNNING: the thread pool is running * @AGS_THREAD_POOL_RT_SETUP: realtime setup has been performed * * Enum values to control the behavior or indicate internal state of #AgsThreadPool by * enable/disable as sync_flags. */ typedef enum{ AGS_THREAD_POOL_RUNNING = 1, AGS_THREAD_POOL_RT_SETUP = 1 << 1, }AgsThreadPoolFlags; struct _AgsThreadPool { GObject gobject; volatile guint flags; volatile guint max_unused_threads; volatile guint max_threads; GThread *thread; volatile guint queued; GMutex creation_mutex; GCond creation_cond; volatile gboolean create_threads; volatile gboolean idle; GMutex idle_mutex; GCond idle_cond; AgsThread *parent; volatile GList *returnable_thread; }; struct _AgsThreadPoolClass { GObjectClass gobject; void (*start)(AgsThreadPool *thread_pool); }; GType ags_thread_pool_get_type(); AgsThread* ags_thread_pool_pull(AgsThreadPool *thread_pool); void ags_thread_pool_start(AgsThreadPool *thread_pool); AgsThreadPool* ags_thread_pool_new(AgsThread *parent); G_END_DECLS #endif /*__AGS_THREAD_POOL_H__*/ gsequencer-3.1.3/ags/thread/ags_concurrency_provider.c0000644000175000017500000001734213607210263020072 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_concurrency_provider_class_init(AgsConcurrencyProviderInterface *ginterface); /** * SECTION:ags_concurrency_provider * @short_description: concurrency provider interface * @title: AgsConcurrencyProvider * @section_id: AgsConcurrencyProvider * @include: ags/thread/ags_concurrency_provider.h * * The #AgsConcurrencyProvider gives you unique access to threads. */ GType ags_concurrency_provider_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_concurrency_provider = 0; ags_type_concurrency_provider = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsConcurrencyProvider", sizeof(AgsConcurrencyProviderInterface), (GClassInitFunc) ags_concurrency_provider_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_concurrency_provider); } return g_define_type_id__volatile; } void ags_concurrency_provider_class_init(AgsConcurrencyProviderInterface *ginterface) { /* empty */ } /** * ags_concurrency_provider_get_main_loop: * @concurrency_provider: the #AgsConcurrencyProvider * * Get main loop of application context. * * Returns: (transfer full): the #AgsThread implementing #AgsMainLoop * * Since: 3.0.0 */ AgsThread* ags_concurrency_provider_get_main_loop(AgsConcurrencyProvider *concurrency_provider) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_val_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider), NULL); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_val_if_fail(concurrency_provider_interface->get_main_loop, NULL); return(concurrency_provider_interface->get_main_loop(concurrency_provider)); } /** * ags_concurrency_provider_set_main_loop: * @concurrency_provider: the #AgsConcurrencyProvider * @main_loop: the #AgsThread implementing #AgsMainLoop * * Set main loop of application context. * * Since: 3.0.0 */ void ags_concurrency_provider_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider)); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_if_fail(concurrency_provider_interface->set_main_loop); concurrency_provider_interface->set_main_loop(concurrency_provider, main_loop); } /** * ags_concurrency_provider_get_task_launcher: * @concurrency_provider: the #AgsConcurrencyProvider * * Get task launcher of application context. * * Returns: (transfer full): the #AgsTaskLauncher * * Since: 3.0.0 */ AgsTaskLauncher* ags_concurrency_provider_get_task_launcher(AgsConcurrencyProvider *concurrency_provider) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_val_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider), NULL); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_val_if_fail(concurrency_provider_interface->get_task_launcher, NULL); return(concurrency_provider_interface->get_task_launcher(concurrency_provider)); } /** * ags_concurrency_provider_set_task_launcher: * @concurrency_provider: the #AgsConcurrencyProvider * @task_launcher: the #AgsTaskLauncher * * Set task launcher of application context. * * Since: 3.0.0 */ void ags_concurrency_provider_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider)); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_if_fail(concurrency_provider_interface->set_task_launcher); concurrency_provider_interface->set_task_launcher(concurrency_provider, task_launcher); } /** * ags_concurrency_provider_get_thread_pool: * @concurrency_provider: the #AgsConcurrencyProvider * * Get thread pool of application context. * * Returns: (transfer full): the #AgsThreadPool * * Since: 3.0.0 */ AgsThreadPool* ags_concurrency_provider_get_thread_pool(AgsConcurrencyProvider *concurrency_provider) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_val_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider), NULL); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_val_if_fail(concurrency_provider_interface->get_thread_pool, NULL); return(concurrency_provider_interface->get_thread_pool(concurrency_provider)); } /** * ags_concurrency_provider_set_thread_pool: * @concurrency_provider: the #AgsConcurrencyProvider * @thread_pool: the #AgsThreadPool * * Set thread pool of application context. * * Since: 3.0.0 */ void ags_concurrency_provider_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider)); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_if_fail(concurrency_provider_interface->set_thread_pool); concurrency_provider_interface->set_thread_pool(concurrency_provider, thread_pool); } /** * ags_concurrency_provider_get_worker: * @concurrency_provider: the #AgsConcurrencyProvider * * Get workers of application context. * * Returns: (element-type Ags.WorkerThread) (transfer full): the #GList-struct containing workers * * Since: 3.0.0 */ GList* ags_concurrency_provider_get_worker(AgsConcurrencyProvider *concurrency_provider) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_val_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider), NULL); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_val_if_fail(concurrency_provider_interface->get_worker, NULL); return(concurrency_provider_interface->get_worker(concurrency_provider)); } /** * ags_concurrency_provider_set_worker: * @concurrency_provider: the #AgsConcurrencyProvider * @worker: (element-type Ags.WorkerThread): the #GList-struct containing workers * * Set workers of application context. * * Since: 3.0.0 */ void ags_concurrency_provider_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker) { AgsConcurrencyProviderInterface *concurrency_provider_interface; g_return_if_fail(AGS_IS_CONCURRENCY_PROVIDER(concurrency_provider)); concurrency_provider_interface = AGS_CONCURRENCY_PROVIDER_GET_INTERFACE(concurrency_provider); g_return_if_fail(concurrency_provider_interface->set_worker); concurrency_provider_interface->set_worker(concurrency_provider, worker); } gsequencer-3.1.3/ags/thread/ags_task.c0000644000175000017500000002123113607210263014560 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_task_class_init(AgsTaskClass *task); void ags_task_init(AgsTask *task); void ags_task_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_task_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_task_dispose(GObject *gobject); void ags_task_finalize(GObject *gobject); /** * SECTION:ags_task * @short_description: thread safe task * @title: AgsTask * @section_id: * @include: ags/thread/ags_task.h * * #AgsTask object acts an interceptor in a thread safe context. */ enum{ PROP_0, PROP_TASK_LAUNCHER, }; enum{ LAUNCH, FAILURE, LAST_SIGNAL, }; static gpointer ags_task_parent_class = NULL; static guint task_signals[LAST_SIGNAL]; GType ags_task_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_task = 0; static const GTypeInfo ags_task_info = { sizeof (AgsTaskClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_task_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTask), 0, /* n_preallocs */ (GInstanceInitFunc) ags_task_init, }; ags_type_task = g_type_register_static(G_TYPE_OBJECT, "AgsTask", &ags_task_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_task); } return g_define_type_id__volatile; } void ags_task_class_init(AgsTaskClass *task) { GObjectClass *gobject; GParamSpec *param_spec; ags_task_parent_class = g_type_class_peek_parent(task); /* GObjectClass */ gobject = (GObjectClass *) task; gobject->set_property = ags_task_set_property; gobject->get_property = ags_task_get_property; gobject->dispose = ags_task_dispose; gobject->finalize = ags_task_finalize; /* properties */ /** * AgsTask:task-launcher: * * The assigned #AgsTaskLauncher * * Since: 3.0.0 */ param_spec = g_param_spec_object("task-launcher", i18n_pspec("the task launcher object"), i18n_pspec("The task launcher object"), AGS_TYPE_TASK_LAUNCHER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TASK_LAUNCHER, param_spec); /* AgsTaskClass */ task->launch = NULL; task->failure = NULL; /* signals */ /** * AgsTask::launch: * @task: the #AgsTask to launch * * The ::launch signal is emited in a thread safe context * * Since: 3.0.0 */ task_signals[LAUNCH] = g_signal_new("launch", G_TYPE_FROM_CLASS (task), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsTaskClass, launch), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsTask::failure: * @task: the #AgsTask failed to do its work. * @error: the #GError-struct * * The ::failure signal is emited if ::launch fails * * Since: 3.0.0 */ task_signals[FAILURE] = g_signal_new("failure", G_TYPE_FROM_CLASS (task), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsTaskClass, failure), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); } void ags_task_init(AgsTask *task) { int err; task->flags = 0; /* task mutex */ g_rec_mutex_init(&(task->obj_mutex)); task->task_name = NULL; task->task_launcher = NULL; } void ags_task_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTask *task; GRecMutex *task_mutex; task = AGS_TASK(gobject); /* get task mutex */ task_mutex = AGS_TASK_GET_OBJ_MUTEX(task); switch(prop_id){ case PROP_TASK_LAUNCHER: { AgsTaskLauncher *task_launcher; task_launcher = (AgsTaskLauncher *) g_value_get_object(value); g_rec_mutex_lock(task_mutex); if(task->task_launcher == (GObject *) task_launcher){ g_rec_mutex_unlock(task_mutex); return; } if(task->task_launcher != NULL){ g_object_unref(G_OBJECT(task->task_launcher)); } if(task_launcher != NULL){ g_object_ref(G_OBJECT(task_launcher)); } task->task_launcher = (GObject *) task_launcher; g_rec_mutex_unlock(task_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_task_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTask *task; GRecMutex *task_mutex; task = AGS_TASK(gobject); /* get task mutex */ task_mutex = AGS_TASK_GET_OBJ_MUTEX(task); switch(prop_id){ case PROP_TASK_LAUNCHER: { g_rec_mutex_lock(task_mutex); g_value_set_object(value, task->task_launcher); g_rec_mutex_unlock(task_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_task_dispose(GObject *gobject) { AgsTask *task; task = AGS_TASK(gobject); if(task->task_launcher != NULL){ g_object_unref(task->task_launcher); task->task_launcher = NULL; } /* call parent */ G_OBJECT_CLASS(ags_task_parent_class)->dispose(gobject); } void ags_task_finalize(GObject *gobject) { AgsTask *task; task = AGS_TASK(gobject); g_free(task->task_name); if(task->task_launcher != NULL){ g_object_unref(task->task_launcher); } /* call parent */ G_OBJECT_CLASS(ags_task_parent_class)->finalize(gobject); } /** * ags_task_test_flags: * @task: the #AgsTask * @flags: the flags * * Test @flags to be set on @task. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_task_test_flags(AgsTask *task, guint flags) { gboolean retval; GRecMutex *task_mutex; if(!AGS_IS_TASK(task)){ return(FALSE); } /* get task mutex */ task_mutex = AGS_TASK_GET_OBJ_MUTEX(task); /* test */ g_rec_mutex_lock(task_mutex); retval = (flags & (task->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(task_mutex); return(retval); } /** * ags_task_set_flags: * @task: the #AgsTask * @flags: see enum AgsTaskFlags * * Enable a feature of #AgsTask. * * Since: 3.0.0 */ void ags_task_set_flags(AgsTask *task, guint flags) { guint task_flags; GRecMutex *task_mutex; if(!AGS_IS_TASK(task)){ return; } /* get task mutex */ task_mutex = AGS_TASK_GET_OBJ_MUTEX(task); /* set flags */ g_rec_mutex_lock(task_mutex); task->flags |= flags; g_rec_mutex_unlock(task_mutex); } /** * ags_task_unset_flags: * @task: the #AgsTask * @flags: see enum AgsTaskFlags * * Disable a feature of AgsTask. * * Since: 3.0.0 */ void ags_task_unset_flags(AgsTask *task, guint flags) { guint task_flags; GRecMutex *task_mutex; if(!AGS_IS_TASK(task)){ return; } /* get task mutex */ task_mutex = AGS_TASK_GET_OBJ_MUTEX(task); /* unset flags */ g_rec_mutex_lock(task_mutex); task->flags &= (~flags); g_rec_mutex_unlock(task_mutex); } /** * ags_task_launch: * @task: an #AgsTask * * Intercept task. * * Since: 3.0.0 */ void ags_task_launch(AgsTask *task) { g_return_if_fail(AGS_IS_TASK(task)); g_object_ref(G_OBJECT(task)); g_signal_emit(G_OBJECT(task), task_signals[LAUNCH], 0); g_object_unref(G_OBJECT(task)); } /** * ags_task_failure: * @task: an #AgsTask * @error: is %NULL on success * * Signals failure of task. * * Since: 3.0.0 */ void ags_task_failure(AgsTask *task, GError *error) { g_return_if_fail(AGS_IS_TASK(task)); g_object_ref(G_OBJECT(task)); g_signal_emit(G_OBJECT(task), task_signals[FAILURE], 0, error); g_object_unref(G_OBJECT(task)); } /** * ags_task_new: * * Create a new #AgsTask. * * Returns: the new #AgsTask * * Since: 3.0.0 */ AgsTask* ags_task_new() { AgsTask *task; task = (AgsTask *) g_object_new(AGS_TYPE_TASK, NULL); return(task); } gsequencer-3.1.3/ags/thread/ags_task_completion.c0000644000175000017500000003655213607210263017025 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_task_completion_class_init(AgsTaskCompletionClass *task_completion); void ags_task_completion_connectable_interface_init(AgsConnectableInterface *connectable); void ags_task_completion_init(AgsTaskCompletion *task_completion); void ags_task_completion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_task_completion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_task_completion_finalize(GObject *gobject); AgsUUID* ags_task_completion_get_uuid(AgsConnectable *connectable); gboolean ags_task_completion_has_resource(AgsConnectable *connectable); gboolean ags_task_completion_is_ready(AgsConnectable *connectable); void ags_task_completion_add_to_registry(AgsConnectable *connectable); void ags_task_completion_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_task_completion_list_resource(AgsConnectable *connectable); xmlNode* ags_task_completion_xml_compose(AgsConnectable *connectable); void ags_task_completion_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_task_completion_is_connected(AgsConnectable *connectable); void ags_task_completion_connect(AgsConnectable *connectable); void ags_task_completion_disconnect(AgsConnectable *connectable); void ags_task_completion_launch_callback(AgsTask *task, AgsTaskCompletion *task_completion); /** * SECTION:ags_task_completion * @short_description: task completion * @title: AgsTaskCompletion * @section_id: * @include: ags/thread/ags_task_completion.h * * The #AgsTaskCompletion should be used to complete tasks from caller thread. */ enum{ PROP_0, PROP_TASK, }; enum{ COMPLETE, LAST_SIGNAL, }; static gpointer ags_task_completion_parent_class = NULL; static guint task_completion_signals[LAST_SIGNAL]; GType ags_task_completion_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_task_completion = 0; static const GTypeInfo ags_task_completion_info = { sizeof (AgsTaskCompletionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_task_completion_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTaskCompletion), 0, /* n_preallocs */ (GInstanceInitFunc) ags_task_completion_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_task_completion_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_task_completion = g_type_register_static(G_TYPE_OBJECT, "AgsTaskCompletion", &ags_task_completion_info, 0); g_type_add_interface_static(ags_type_task_completion, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_task_completion); } return g_define_type_id__volatile; } void ags_task_completion_class_init(AgsTaskCompletionClass *task_completion) { GObjectClass *gobject; GParamSpec *param_spec; ags_task_completion_parent_class = g_type_class_peek_parent(task_completion); /* GObject */ gobject = (GObjectClass *) task_completion; gobject->set_property = ags_task_completion_set_property; gobject->get_property = ags_task_completion_get_property; gobject->finalize = ags_task_completion_finalize; /* properties */ /** * AgsTaskCompletion:task: * * The assigned task. * * Since: 3.0.0 */ param_spec = g_param_spec_object("task", i18n_pspec("assigned task"), i18n_pspec("The task to complete"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TASK, param_spec); /* AgsTaskClass */ task_completion->complete = NULL; /* signals */ /** * AgsTaskCompletion::complete: * @task_completion: the object to complete. * * The ::complete signal is emited as a task was finished * * Since: 3.0.0 */ task_completion_signals[COMPLETE] = g_signal_new("complete", G_TYPE_FROM_CLASS(task_completion), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTaskCompletionClass, complete), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_task_completion_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_task_completion_get_uuid; connectable->has_resource = ags_task_completion_has_resource; connectable->is_ready = ags_task_completion_is_ready; connectable->add_to_registry = ags_task_completion_add_to_registry; connectable->remove_from_registry = ags_task_completion_remove_from_registry; connectable->list_resource = ags_task_completion_list_resource; connectable->xml_compose = ags_task_completion_xml_compose; connectable->xml_parse = ags_task_completion_xml_parse; connectable->is_connected = ags_task_completion_is_connected; connectable->connect = ags_task_completion_connect; connectable->disconnect = ags_task_completion_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_task_completion_init(AgsTaskCompletion *task_completion) { int err; g_atomic_int_set(&(task_completion->flags), 0); /* task completion mutex */ g_rec_mutex_init(&(task_completion->obj_mutex)); /* uuid */ task_completion->uuid = ags_uuid_alloc(); ags_uuid_generate(task_completion->uuid); task_completion->task = NULL; task_completion->data = NULL; } void ags_task_completion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTaskCompletion *task_completion; GRecMutex *task_completion_mutex; task_completion = AGS_TASK_COMPLETION(gobject); /* get task completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); switch(prop_id){ case PROP_TASK: { AgsTask *task; task = g_value_get_object(value); g_rec_mutex_lock(task_completion_mutex); if(task == task_completion->task){ g_rec_mutex_unlock(task_completion_mutex); return; } if(task_completion->task != NULL){ g_object_unref(task_completion->task); } if(task != NULL){ g_object_ref(task); } task_completion->task = task; g_rec_mutex_unlock(task_completion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_task_completion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTaskCompletion *task_completion; GRecMutex *task_completion_mutex; task_completion = AGS_TASK_COMPLETION(gobject); /* get task completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); switch(prop_id){ case PROP_TASK: { g_rec_mutex_lock(task_completion_mutex); g_value_set_object(value, task_completion->task); g_rec_mutex_unlock(task_completion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_task_completion_finalize(GObject *gobject) { AgsTaskCompletion *task_completion; task_completion = (AgsTaskCompletion *) gobject; if(task_completion->task != NULL){ g_object_unref(task_completion->task); } /* call parent */ G_OBJECT_CLASS(ags_task_completion_parent_class)->finalize(gobject); } AgsUUID* ags_task_completion_get_uuid(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; AgsUUID *ptr; GRecMutex *task_completion_mutex; task_completion = AGS_TASK_COMPLETION(connectable); /* get task_completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); /* get UUID */ g_rec_mutex_lock(task_completion_mutex); ptr = task_completion->uuid; g_rec_mutex_unlock(task_completion_mutex); return(ptr); } gboolean ags_task_completion_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_task_completion_is_ready(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; gboolean is_ready; GRecMutex *task_completion_mutex; task_completion = AGS_TASK_COMPLETION(connectable); /* get task_completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); /* check is added */ g_rec_mutex_lock(task_completion_mutex); is_ready = (((AGS_TASK_COMPLETION_ADDED_TO_REGISTRY & (task_completion->flags)) != 0) ? TRUE: FALSE); g_rec_mutex_unlock(task_completion_mutex); return(is_ready); } void ags_task_completion_add_to_registry(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; if(ags_connectable_is_ready(connectable)){ return; } task_completion = AGS_TASK_COMPLETION(connectable); ags_task_completion_set_flags(task_completion, AGS_TASK_COMPLETION_ADDED_TO_REGISTRY); } void ags_task_completion_remove_from_registry(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; if(!ags_connectable_is_ready(connectable)){ return; } task_completion = AGS_TASK_COMPLETION(connectable); ags_task_completion_unset_flags(task_completion, AGS_TASK_COMPLETION_ADDED_TO_REGISTRY); } xmlNode* ags_task_completion_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_task_completion_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_task_completion_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_task_completion_is_connected(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; gboolean is_connected; GRecMutex *task_completion_mutex; task_completion = AGS_TASK_COMPLETION(connectable); /* get task_completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); /* check is connected */ g_rec_mutex_lock(task_completion_mutex); is_connected = (((AGS_TASK_COMPLETION_CONNECTED & (task_completion->flags)) != 0) ? TRUE: FALSE); g_rec_mutex_unlock(task_completion_mutex); return(is_connected); } void ags_task_completion_connect(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; if(ags_connectable_is_connected(connectable)){ return; } task_completion = AGS_TASK_COMPLETION(connectable); ags_task_completion_set_flags(task_completion, AGS_TASK_COMPLETION_QUEUED); g_signal_connect_after(task_completion->task, "launch", G_CALLBACK(ags_task_completion_launch_callback), task_completion); } void ags_task_completion_disconnect(AgsConnectable *connectable) { AgsTaskCompletion *task_completion; if(!ags_connectable_is_connected(connectable)){ return; } task_completion = AGS_TASK_COMPLETION(connectable); g_object_disconnect(task_completion->task, "any_signal::launch", G_CALLBACK(ags_task_completion_launch_callback), task_completion, NULL); } /** * ags_task_completion_test_flags: * @task_completion: the #AgsTaskCompletion * @flags: the flags * * Test @flags to be set on @task_completion. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_task_completion_test_flags(AgsTaskCompletion *task_completion, guint flags) { gboolean retval; GRecMutex *task_completion_mutex; if(!AGS_IS_TASK_COMPLETION(task_completion)){ return(FALSE); } /* get task_completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); /* test */ g_rec_mutex_lock(task_completion_mutex); retval = (flags & (task_completion->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(task_completion_mutex); return(retval); } /** * ags_task_completion_set_flags: * @task_completion: the #AgsTaskCompletion * @flags: see enum AgsTaskCompletionFlags * * Enable a feature of #AgsTaskCompletion. * * Since: 3.0.0 */ void ags_task_completion_set_flags(AgsTaskCompletion *task_completion, guint flags) { guint task_completion_flags; GRecMutex *task_completion_mutex; if(!AGS_IS_TASK_COMPLETION(task_completion)){ return; } /* get task_completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); /* set flags */ g_rec_mutex_lock(task_completion_mutex); task_completion->flags |= flags; g_rec_mutex_unlock(task_completion_mutex); } /** * ags_task_completion_unset_flags: * @task_completion: the #AgsTaskCompletion * @flags: see enum AgsTaskCompletionFlags * * Disable a feature of AgsTaskCompletion. * * Since: 3.0.0 */ void ags_task_completion_unset_flags(AgsTaskCompletion *task_completion, guint flags) { guint task_completion_flags; GRecMutex *task_completion_mutex; if(!AGS_IS_TASK_COMPLETION(task_completion)){ return; } /* get task_completion mutex */ task_completion_mutex = AGS_TASK_COMPLETION_GET_OBJ_MUTEX(task_completion); /* unset flags */ g_rec_mutex_lock(task_completion_mutex); task_completion->flags &= (~flags); g_rec_mutex_unlock(task_completion_mutex); } /** * ags_task_completion_complete: * @task_completion: the #AgsTaskCompletion * * Emit ::complete signal * * Since: 3.0.0 */ void ags_task_completion_complete(AgsTaskCompletion *task_completion) { g_return_if_fail(AGS_IS_TASK_COMPLETION(task_completion)); g_object_ref(G_OBJECT(task_completion)); g_signal_emit(G_OBJECT(task_completion), task_completion_signals[COMPLETE], 0); g_object_unref(G_OBJECT(task_completion)); } void ags_task_completion_launch_callback(AgsTask *task, AgsTaskCompletion *task_completion) { ags_task_completion_unset_flags(task_completion, (AGS_TASK_COMPLETION_QUEUED | AGS_TASK_COMPLETION_BUSY)); ags_task_completion_set_flags(task_completion, AGS_TASK_COMPLETION_READY); } /** * ags_task_completion_new: * @task: the #AgsTask * @data: pointer to user data * * Create a new instance of #AgsTaskCompletion. * * Returns: the new #AgsTaskCompletion * * Since: 3.0.0 */ AgsTaskCompletion* ags_task_completion_new(GObject *task, gpointer data) { AgsTaskCompletion *task_completion; task_completion = (AgsTaskCompletion *) g_object_new(AGS_TYPE_TASK_COMPLETION, "task", task, NULL); task_completion->data = data; return(task_completion); } gsequencer-3.1.3/ags/thread/ags_message_queue.c0000644000175000017500000003411713607210263016455 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_message_queue_class_init(AgsMessageQueueClass *message_queue); void ags_message_queue_init(AgsMessageQueue *message_queue); void ags_message_queue_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_message_queue_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_message_queue_dispose(GObject *gobject); void ags_message_queue_finalize(GObject *gobject); /** * SECTION:ags_message_queue * @short_description: message queue * @title: AgsMessageQueue * @section_id: * @include: ags/thread/ags_message_queue.h * * The #AgsMessageQueue acts as messages passing system. */ enum{ PROP_0, PROP_SENDER_NAMESPACE, PROP_RECIPIENT_NAMESPACE, }; static gpointer ags_message_queue_parent_class = NULL; GType ags_message_queue_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_message_queue = 0; static const GTypeInfo ags_message_queue_info = { sizeof (AgsMessageQueueClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_message_queue_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsMessageQueue), 0, /* n_preallocs */ (GInstanceInitFunc) ags_message_queue_init, }; ags_type_message_queue = g_type_register_static(G_TYPE_OBJECT, "AgsMessageQueue", &ags_message_queue_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_message_queue); } return g_define_type_id__volatile; } void ags_message_queue_class_init(AgsMessageQueueClass *message_queue) { GObjectClass *gobject; GParamSpec *param_spec; ags_message_queue_parent_class = g_type_class_peek_parent(message_queue); /* GObjectClass */ gobject = (GObjectClass *) message_queue; gobject->set_property = ags_message_queue_set_property; gobject->get_property = ags_message_queue_get_property; gobject->dispose = ags_message_queue_dispose; gobject->finalize = ags_message_queue_finalize; /* properties */ /** * AgsMessageQueue:sender-namespace: * * The assigned namespace of sender. * * Since: 3.0.0 */ param_spec = g_param_spec_string("sender-namespace", i18n_pspec("sender namespace of message queue"), i18n_pspec("The sender's namespace this message queue is assigned to"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SENDER_NAMESPACE, param_spec); /** * AgsMessageQueue:recipient-namespace: * * The assigned namespace of recipient. * * Since: 3.0.0 */ param_spec = g_param_spec_string("recipient-namespace", i18n_pspec("recipient namespace of message queue"), i18n_pspec("The recipient's namespace this message queue is assigned to"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_RECIPIENT_NAMESPACE, param_spec); } void ags_message_queue_init(AgsMessageQueue *message_queue) { g_rec_mutex_init(&(message_queue->obj_mutex)); message_queue->sender_namespace = NULL; message_queue->recipient_namespace = NULL; message_queue->message_envelope = NULL; } void ags_message_queue_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsMessageQueue *message_queue; GRecMutex *message_queue_mutex; message_queue = AGS_MESSAGE_QUEUE(gobject); /* get message queue mutex */ message_queue_mutex = AGS_MESSAGE_QUEUE_GET_OBJ_MUTEX(message_queue); switch(prop_id){ case PROP_SENDER_NAMESPACE: { gchar *sender_namespace; sender_namespace = (gchar *) g_value_get_string(value); g_rec_mutex_lock(message_queue_mutex); if(message_queue->sender_namespace == sender_namespace){ g_rec_mutex_unlock(message_queue_mutex); return; } if(message_queue->sender_namespace != NULL){ g_free(message_queue->sender_namespace); } message_queue->sender_namespace = g_strdup(sender_namespace); g_rec_mutex_unlock(message_queue_mutex); } break; case PROP_RECIPIENT_NAMESPACE: { gchar *recipient_namespace; recipient_namespace = (gchar *) g_value_get_string(value); g_rec_mutex_lock(message_queue_mutex); if(message_queue->recipient_namespace == recipient_namespace){ g_rec_mutex_unlock(message_queue_mutex); return; } if(message_queue->recipient_namespace != NULL){ g_free(message_queue->recipient_namespace); } message_queue->recipient_namespace = g_strdup(recipient_namespace); g_rec_mutex_unlock(message_queue_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_message_queue_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsMessageQueue *message_queue; GRecMutex *message_queue_mutex; message_queue = AGS_MESSAGE_QUEUE(gobject); /* get message queue mutex */ message_queue_mutex = AGS_MESSAGE_QUEUE_GET_OBJ_MUTEX(message_queue); switch(prop_id){ case PROP_SENDER_NAMESPACE: { g_rec_mutex_lock(message_queue_mutex); g_value_set_string(value, message_queue->sender_namespace); g_rec_mutex_unlock(message_queue_mutex); } break; case PROP_RECIPIENT_NAMESPACE: { g_rec_mutex_lock(message_queue_mutex); g_value_set_string(value, message_queue->recipient_namespace); g_rec_mutex_unlock(message_queue_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_message_queue_dispose(GObject *gobject) { AgsMessageQueue *message_queue; message_queue = AGS_MESSAGE_QUEUE(gobject); /* message */ if(message_queue->message_envelope != NULL){ g_list_free_full(message_queue->message_envelope, (GDestroyNotify) g_object_unref); message_queue->message_envelope = NULL; } /* call parent */ G_OBJECT_CLASS(ags_message_queue_parent_class)->dispose(gobject); } void ags_message_queue_finalize(GObject *gobject) { AgsMessageQueue *message_queue; message_queue = AGS_MESSAGE_QUEUE(gobject); g_free(message_queue->sender_namespace); g_free(message_queue->recipient_namespace); /* message */ if(message_queue->message_envelope != NULL){ g_list_free_full(message_queue->message_envelope, (GDestroyNotify) g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_message_queue_parent_class)->finalize(gobject); } /** * ags_message_queue_add_message_envelope: * @message_queue: the #AgsMessageQueue * @message_envelope: the #AgsMessageEnvelope * * Add @message to @message_queue. * * Since: 3.0.0 */ void ags_message_queue_add_message_envelope(AgsMessageQueue *message_queue, GObject *message_envelope) { if(!AGS_IS_MESSAGE_QUEUE(message_queue) || !AGS_IS_MESSAGE_ENVELOPE(message_envelope)){ return; } g_rec_mutex_lock(&(message_queue->obj_mutex)); if(g_list_find(message_queue->message_envelope, message_envelope) == NULL){ message_queue->message_envelope = g_list_prepend(message_queue->message_envelope, message_envelope); g_object_ref(message_envelope); } g_rec_mutex_unlock(&(message_queue->obj_mutex)); } /** * ags_message_queue_remove_message_envelope: * @message_queue: the #AgsMessageQueue * @message_envelope: the #AgsMessageEnvelope * * Remove @message from @message_queue. * * Since: 3.0.0 */ void ags_message_queue_remove_message_envelope(AgsMessageQueue *message_queue, GObject *message_envelope) { if(!AGS_IS_MESSAGE_QUEUE(message_queue) || !AGS_IS_MESSAGE_ENVELOPE(message_envelope)){ return; } g_rec_mutex_lock(&(message_queue->obj_mutex)); if(g_list_find(message_queue->message_envelope, message_envelope) != NULL){ message_queue->message_envelope = g_list_remove(message_queue->message_envelope, message_envelope); g_object_unref(message_envelope); } g_rec_mutex_unlock(&(message_queue->obj_mutex)); } /** * ags_message_queue_find_sender: * @message_queue: the #AgsMessageQueue * @sender: the sender as #GObject * * Find @sender in @message_queue's messages. * * Returns: (element-type Ags.MessageEnvelope) (transfer full): all matching #AgsMessageEnvelope as #GList-struct * * Since: 3.0.0 */ GList* ags_message_queue_find_sender(AgsMessageQueue *message_queue, GObject *sender) { GList *start_message_envelope, *message_envelope; GList *match; if(!AGS_IS_MESSAGE_QUEUE(message_queue)){ return(NULL); } g_rec_mutex_lock(&(message_queue->obj_mutex)); message_envelope = start_message_envelope = g_list_copy_deep(message_queue->message_envelope, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_queue->obj_mutex)); match = NULL; while(message_envelope != NULL){ GRecMutex *message_envelope_mutex; message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope->data); g_rec_mutex_lock(message_envelope_mutex); if(AGS_MESSAGE_ENVELOPE(message_envelope->data)->sender == sender){ match = g_list_prepend(match, message_envelope->data); g_object_ref(message_envelope->data); } g_rec_mutex_unlock(message_envelope_mutex); message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, g_object_unref); return(match); } /** * ags_message_queue_find_recipient: * @message_queue: the #AgsMessageQueue * @recipient: the recipient as #GObject * * Find @recipient in @message_queue's messages. * * Returns: (element-type Ags.MessageEnvelope) (transfer full): all matching #AgsMessageEnvelope as #GList-struct * * Since: 3.0.0 */ GList* ags_message_queue_find_recipient(AgsMessageQueue *message_queue, GObject *recipient) { GList *start_message_envelope, *message_envelope; GList *match; if(!AGS_IS_MESSAGE_QUEUE(message_queue)){ return(NULL); } match = NULL; g_rec_mutex_lock(&(message_queue->obj_mutex)); message_envelope = start_message_envelope = g_list_copy_deep(message_queue->message_envelope, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_queue->obj_mutex)); while(message_envelope != NULL){ GRecMutex *message_envelope_mutex; message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope->data); g_rec_mutex_lock(message_envelope_mutex); if(AGS_MESSAGE_ENVELOPE(message_envelope->data)->recipient == recipient){ match = g_list_prepend(match, message_envelope->data); g_object_ref(message_envelope->data); } g_rec_mutex_unlock(message_envelope_mutex); message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, g_object_unref); return(match); } /** * ags_message_queue_query_message: * @message_queue: the #AgsMessageQueue * @xpath: the XPath as string * * Query @xpath in @message_queue's messages. * * Returns: (element-type Ags.MessageEnvelope) (transfer full): all matching #AgsMessageEnvelope as #GList-struct * * Since: 3.0.0 */ GList* ags_message_queue_query_message(AgsMessageQueue *message_queue, gchar *xpath) { GList *start_message_envelope, *message_envelope; GList *match; if(!AGS_IS_MESSAGE_QUEUE(message_queue)){ return(NULL); } match = NULL; g_rec_mutex_lock(&(message_queue->obj_mutex)); message_envelope = start_message_envelope = g_list_copy_deep(message_queue->message_envelope, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(&(message_queue->obj_mutex)); while(message_envelope != NULL){ xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; guint i; GRecMutex *message_envelope_mutex; message_envelope_mutex = AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX(message_envelope->data); g_rec_mutex_lock(message_envelope_mutex); xpath_context = xmlXPathNewContext(AGS_MESSAGE_ENVELOPE(message_envelope->data)->doc); xpath_object = xmlXPathEval((xmlChar *) xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ match = g_list_prepend(match, message_envelope->data); break; } } } g_rec_mutex_unlock(message_envelope_mutex); message_envelope = message_envelope->next; } g_list_free_full(start_message_envelope, g_object_unref); return(match); } /** * ags_message_queue_new: * @sender_namespace: the sender namespace * * Create a new instance of #AgsMessageQueue. * * Returns: the new #AgsMessageQueue * * Since: 3.0.0 */ AgsMessageQueue* ags_message_queue_new(gchar *sender_namespace) { AgsMessageQueue *message_queue; message_queue = (AgsMessageQueue *) g_object_new(AGS_TYPE_MESSAGE_QUEUE, "sender-namespace", sender_namespace, NULL); return(message_queue); } gsequencer-3.1.3/ags/thread/ags_thread_application_context.c0000644000175000017500000005520113607210263021220 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_thread_application_context_class_init(AgsThreadApplicationContextClass *thread_application_context); void ags_thread_application_context_connectable_interface_init(AgsConnectableInterface *connectable); void ags_thread_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider); void ags_thread_application_context_init(AgsThreadApplicationContext *thread_application_context); void ags_thread_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_thread_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_thread_application_context_finalize(GObject *gobject); void ags_thread_application_context_connect(AgsConnectable *connectable); void ags_thread_application_context_disconnect(AgsConnectable *connectable); AgsThread* ags_thread_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider); void ags_thread_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop); AgsTaskLauncher* ags_thread_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider); void ags_thread_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher); AgsThreadPool* ags_thread_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider); void ags_thread_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool); GList* ags_thread_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider); void ags_thread_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker); void ags_thread_application_context_prepare(AgsApplicationContext *application_context); void ags_thread_application_context_setup(AgsApplicationContext *application_context); void ags_thread_application_context_set_value_callback(AgsConfig *config, gchar *group, gchar *key, gchar *value, AgsThreadApplicationContext *thread_application_context); /** * SECTION:ags_thread_application_context * @short_description: threaded application context * @title: AgsThreadApplicationContext * @section_id: * @include: ags/thread/ags_thread_application_context.h * * The #AgsThreadApplicationContext provides you multi-threaded functionality. */ enum{ PROP_0, PROP_THREAD_POOL, }; static gpointer ags_thread_application_context_parent_class = NULL; static AgsConnectableInterface* ags_thread_application_context_parent_connectable_interface; extern AgsApplicationContext *ags_application_context; GType ags_thread_application_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_thread_application_context = 0; static const GTypeInfo ags_thread_application_context_info = { sizeof (AgsThreadApplicationContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_thread_application_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsThreadApplicationContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_thread_application_context_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_thread_application_context_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_concurrency_provider_interface_info = { (GInterfaceInitFunc) ags_thread_application_context_concurrency_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_thread_application_context = g_type_register_static(AGS_TYPE_APPLICATION_CONTEXT, "AgsThreadApplicationContext", &ags_thread_application_context_info, 0); g_type_add_interface_static(ags_type_thread_application_context, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_thread_application_context, AGS_TYPE_CONCURRENCY_PROVIDER, &ags_concurrency_provider_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_thread_application_context); } return g_define_type_id__volatile; } void ags_thread_application_context_class_init(AgsThreadApplicationContextClass *thread_application_context) { GObjectClass *gobject; AgsApplicationContextClass *application_context; GParamSpec *param_spec; ags_thread_application_context_parent_class = g_type_class_peek_parent(thread_application_context); /* GObjectClass */ gobject = (GObjectClass *) thread_application_context; gobject->set_property = ags_thread_application_context_set_property; gobject->get_property = ags_thread_application_context_get_property; gobject->finalize = ags_thread_application_context_finalize; /* AgsApplicationContextClass */ application_context = (AgsApplicationContextClass *) thread_application_context; application_context->prepare = ags_thread_application_context_prepare; application_context->setup = ags_thread_application_context_setup; /* properties */ /** * AgsThreadApplicationContext:thread-pool: * * The assigned thread pool. * * Since: 3.0.0 */ param_spec = g_param_spec_object("thread-pool", i18n_pspec("thread pool of thread application context"), i18n_pspec("The thread pool which this thread application context assigned to"), AGS_TYPE_THREAD_POOL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_THREAD_POOL, param_spec); /* AgsThreadApplicationContextClass */ application_context = (AgsApplicationContextClass *) thread_application_context; application_context->register_types = ags_thread_application_context_register_types; } void ags_thread_application_context_connectable_interface_init(AgsConnectableInterface *connectable) { ags_thread_application_context_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_thread_application_context_connect; connectable->disconnect = ags_thread_application_context_disconnect; } void ags_thread_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider) { concurrency_provider->get_main_loop = ags_thread_application_context_get_main_loop; concurrency_provider->set_main_loop = ags_thread_application_context_set_main_loop; concurrency_provider->get_task_launcher = ags_thread_application_context_get_task_launcher; concurrency_provider->set_task_launcher = ags_thread_application_context_set_task_launcher; concurrency_provider->get_thread_pool = ags_thread_application_context_get_thread_pool; concurrency_provider->set_thread_pool = ags_thread_application_context_set_thread_pool; concurrency_provider->get_worker = ags_thread_application_context_get_worker; concurrency_provider->set_worker = ags_thread_application_context_set_worker; } void ags_thread_application_context_init(AgsThreadApplicationContext *thread_application_context) { AgsConfig *config; AgsLog *log; if(ags_application_context == NULL){ ags_application_context = (AgsApplicationContext *) thread_application_context; } /* fundamental instances */ config = ags_config_get_instance(); AGS_APPLICATION_CONTEXT(thread_application_context)->config = config; g_object_ref(config); log = (GObject *) ags_log_get_instance(); AGS_APPLICATION_CONTEXT(thread_application_context)->log = log; g_object_ref(log); /* Thread application context */ thread_application_context->thread_pool = NULL; thread_application_context->worker = NULL; } void ags_thread_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsThreadApplicationContext *thread_application_context; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(gobject); switch(prop_id){ case PROP_THREAD_POOL: { AgsThreadPool *thread_pool; thread_pool = (AgsThreadPool *) g_value_get_object(value); if(thread_pool == thread_application_context->thread_pool) return; if(thread_application_context->thread_pool != NULL) g_object_unref(thread_application_context->thread_pool); if(thread_pool != NULL) g_object_ref(G_OBJECT(thread_pool)); thread_application_context->thread_pool = thread_pool; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_thread_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsThreadApplicationContext *thread_application_context; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(gobject); switch(prop_id){ case PROP_THREAD_POOL: { g_value_set_object(value, thread_application_context->thread_pool); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_thread_application_context_finalize(GObject *gobject) { AgsThreadApplicationContext *thread_application_context; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(gobject); if(thread_application_context->thread_pool != NULL){ g_object_unref(thread_application_context->thread_pool); } /* call parent */ G_OBJECT_CLASS(ags_thread_application_context_parent_class)->finalize(gobject); } void ags_thread_application_context_connect(AgsConnectable *connectable) { AgsThreadApplicationContext *thread_application_context; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(connectable); if((AGS_APPLICATION_CONTEXT_CONNECTED & (AGS_APPLICATION_CONTEXT(thread_application_context)->flags)) != 0){ return; } ags_thread_application_context_parent_connectable_interface->connect(connectable); ags_connectable_connect(AGS_CONNECTABLE(AGS_APPLICATION_CONTEXT(thread_application_context)->main_loop)); ags_connectable_connect(AGS_CONNECTABLE(thread_application_context->thread_pool)); } void ags_thread_application_context_disconnect(AgsConnectable *connectable) { AgsThreadApplicationContext *thread_application_context; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(connectable); if((AGS_APPLICATION_CONTEXT_CONNECTED & (AGS_APPLICATION_CONTEXT(thread_application_context)->flags)) == 0){ return; } ags_connectable_disconnect(AGS_CONNECTABLE(AGS_APPLICATION_CONTEXT(thread_application_context)->main_loop)); ags_connectable_disconnect(AGS_CONNECTABLE(thread_application_context->thread_pool)); ags_thread_application_context_parent_connectable_interface->disconnect(connectable); } AgsThread* ags_thread_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider) { AgsThread *main_loop; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); main_loop = (AgsThread *) application_context->main_loop; if(main_loop != NULL){ g_object_ref(main_loop); } g_rec_mutex_unlock(application_context_mutex); return(main_loop); } void ags_thread_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->main_loop == main_loop){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); } if(main_loop != NULL){ g_object_ref(main_loop); } application_context->main_loop = (GObject *) main_loop; g_rec_mutex_unlock(application_context_mutex); } AgsTaskLauncher* ags_thread_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider) { AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); task_launcher = (AgsThread *) application_context->task_launcher; if(task_launcher != NULL){ g_object_ref(task_launcher); } g_rec_mutex_unlock(application_context_mutex); return(task_launcher); } void ags_thread_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->task_launcher == task_launcher){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); } if(task_launcher != NULL){ g_object_ref(task_launcher); } application_context->task_launcher = (GObject *) task_launcher; g_rec_mutex_unlock(application_context_mutex); } AgsThreadPool* ags_thread_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider) { AgsThreadPool *thread_pool; AgsThreadApplicationContext *thread_application_context; GRecMutex *application_context_mutex; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(thread_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); thread_pool = thread_application_context->thread_pool; if(thread_pool != NULL){ g_object_ref(thread_pool); } g_rec_mutex_unlock(application_context_mutex); return(thread_pool); } void ags_thread_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool) { AgsThreadApplicationContext *thread_application_context; GRecMutex *application_context_mutex; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(thread_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(thread_application_context->thread_pool == thread_pool){ g_rec_mutex_unlock(application_context_mutex); return; } if(thread_application_context->thread_pool != NULL){ g_object_unref(thread_application_context->thread_pool); } if(thread_pool != NULL){ g_object_ref(thread_pool); } thread_application_context->thread_pool = (GObject *) thread_pool; g_rec_mutex_unlock(application_context_mutex); } GList* ags_thread_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider) { AgsThreadApplicationContext *thread_application_context; GList *worker; GRecMutex *application_context_mutex; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(thread_application_context); /* get worker */ g_rec_mutex_lock(application_context_mutex); worker = g_list_copy_deep(thread_application_context->worker, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(worker); } void ags_thread_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker) { AgsThreadApplicationContext *thread_application_context; GRecMutex *application_context_mutex; thread_application_context = AGS_THREAD_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(thread_application_context); /* set worker */ g_rec_mutex_lock(application_context_mutex); if(thread_application_context->worker == worker){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(thread_application_context->worker, g_object_unref); thread_application_context->worker = worker; g_rec_mutex_unlock(application_context_mutex); } void ags_thread_application_context_prepare(AgsApplicationContext *application_context) { AgsThreadApplicationContext *thread_application_context; AgsThread *generic_main_loop; AgsTaskLauncher *task_launcher; GList *start_queue; thread_application_context = (AgsThreadApplicationContext *) application_context; /* call parent */ // AGS_APPLICATION_CONTEXT_CLASS(ags_thread_application_context_parent_class)->prepare(application_context); /* register types */ ags_application_context_register_types(application_context); /* * fundamental thread setup */ /* AgsGenericMainLoop */ generic_main_loop = (AgsThread *) ags_generic_main_loop_new(); g_object_ref(generic_main_loop); application_context->main_loop = (GObject *) generic_main_loop; ags_connectable_connect(AGS_CONNECTABLE(generic_main_loop)); /* AgsTaskLauncher */ task_launcher = ags_task_launcher_new(); g_object_ref(task_launcher); application_context->task_launcher = (GObject *) task_launcher; ags_connectable_connect(AGS_CONNECTABLE(task_launcher)); ags_task_launcher_attach(task_launcher, g_main_context_default()); /* start generic main loop and thread pool*/ ags_thread_start(generic_main_loop); /* wait for generic thread loop */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(generic_main_loop)); if(ags_thread_test_status_flags(generic_main_loop, AGS_THREAD_STATUS_START_WAIT)){ ags_thread_unset_status_flags(generic_main_loop, AGS_THREAD_STATUS_START_DONE); while(ags_thread_test_status_flags(generic_main_loop, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(generic_main_loop, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(AGS_THREAD_GET_START_COND(generic_main_loop), AGS_THREAD_GET_START_MUTEX(generic_main_loop)); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(generic_main_loop)); #if 0 /* main loop run */ g_main_loop_run(g_main_loop_new(g_main_context_default(), TRUE)); #endif } void ags_thread_application_context_setup(AgsApplicationContext *application_context) { AgsThreadApplicationContext *thread_application_context; AgsThread *main_loop; AgsTaskLauncher *task_launcher; AgsLog *log; AgsConfig *config; GList *list; thread_application_context = (AgsThreadApplicationContext *) application_context; /* config and log */ config = ags_config_get_instance(); log = ags_log_get_instance(); /* main loop and task launcher */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); /* launch thread */ ags_log_add_message(log, "* Launch thread"); /* AgsWorkerThread */ thread_application_context->worker = NULL; /* AgsThreadPool */ thread_application_context->thread_pool = NULL; /* unref */ g_object_unref(main_loop); g_object_unref(task_launcher); } void ags_thread_application_context_register_types(AgsApplicationContext *application_context) { ags_thread_get_type(); ags_task_launcher_get_type(); ags_thread_pool_get_type(); ags_returnable_thread_get_type(); } void ags_thread_application_context_set_value_callback(AgsConfig *config, gchar *group, gchar *key, gchar *value, AgsThreadApplicationContext *thread_application_context) { if(!g_ascii_strncasecmp(group, AGS_CONFIG_GENERIC, 8)){ }else if(!g_ascii_strncasecmp(group, AGS_CONFIG_THREAD, 7)){ if(!g_ascii_strncasecmp(key, "model", 6)){ //TODO:JK: implement me }else if(!g_ascii_strncasecmp(key, "lock-global", 11)){ //TODO:JK: implement me }else if(!g_ascii_strncasecmp(key, "lock-parent", 11)){ //TODO:JK: implement me } } } /** * ags_thread_application_context_new: * * Create a new instance of #AgsThreadApplicationContext. * * Returns: the new #AgsThreadApplicationContext * * Since: 3.0.0 */ AgsThreadApplicationContext* ags_thread_application_context_new() { AgsThreadApplicationContext *thread_application_context; thread_application_context = (AgsThreadApplicationContext *) g_object_new(AGS_TYPE_THREAD_APPLICATION_CONTEXT, NULL); return(thread_application_context); } gsequencer-3.1.3/ags/thread/ags_returnable_thread.c0000644000175000017500000002774713607210263017332 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include void ags_returnable_thread_class_init(AgsReturnableThreadClass *returnable_thread); void ags_returnable_thread_init(AgsReturnableThread *returnable_thread); void ags_returnable_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_returnable_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_returnable_thread_dispose(GObject *gobject); void ags_returnable_thread_finalize(GObject *gobject); void ags_returnable_thread_start(AgsThread *thread); void ags_returnable_thread_run(AgsThread *thread); void ags_returnable_thread_stop(AgsThread *thread); void ags_returnable_thread_resume(AgsThread *thread); /** * SECTION:ags_returnable_thread * @short_description: returnable thread * @title: AgsReturnableThread * @section_id: * @include: ags/thread/ags_returnable_thread.h * * The #AgsReturnableThread acts as thread. It should return after a short * while because of limited thread pool. */ enum{ PROP_0, PROP_THREAD_POOL, PROP_SAFE_DATA, }; enum{ SAFE_RUN, LAST_SIGNAL, }; static gpointer ags_returnable_thread_parent_class = NULL; static guint returnable_thread_signals[LAST_SIGNAL]; GType ags_returnable_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_returnable_thread = 0; static const GTypeInfo ags_returnable_thread_info = { sizeof (AgsReturnableThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_returnable_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsReturnableThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_returnable_thread_init, }; ags_type_returnable_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsReturnableThread", &ags_returnable_thread_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_returnable_thread); } return g_define_type_id__volatile; } void ags_returnable_thread_class_init(AgsReturnableThreadClass *returnable_thread) { AgsThreadClass *thread; GObjectClass *gobject; GParamSpec *param_spec; ags_returnable_thread_parent_class = g_type_class_peek_parent(returnable_thread); /* GObjectClass */ gobject = (GObjectClass *) returnable_thread; gobject->set_property = ags_returnable_thread_set_property; gobject->get_property = ags_returnable_thread_get_property; gobject->dispose = ags_returnable_thread_dispose; gobject->finalize = ags_returnable_thread_finalize; /* properties */ /** * AgsReturnableThread:thread-pool: * * The assigned #AgsThreadPool providing default settings. * * Since: 3.0.0 */ param_spec = g_param_spec_object("thread-pool", i18n_pspec("assigned thread pool"), i18n_pspec("The thread pool it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_THREAD_POOL, param_spec); /* AgsThreadClass */ thread = (AgsThreadClass *) returnable_thread; thread->start = ags_returnable_thread_start; thread->run = ags_returnable_thread_run; thread->stop = ags_returnable_thread_stop; /* AgsReturnableThreadClass */ returnable_thread->safe_run = NULL; /* signals */ /** * AgsReturnableThread::safe-run: * @returnable_thread: the #AgsReturnableThread * * The ::safe-run is invoked durin AgsThread::run as * a context safe wrapper. * * Since: 3.0.0 */ returnable_thread_signals[SAFE_RUN] = g_signal_new("safe-run", G_TYPE_FROM_CLASS (returnable_thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsReturnableThreadClass, safe_run), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_returnable_thread_init(AgsReturnableThread *returnable_thread) { AgsThread *thread; thread = AGS_THREAD(returnable_thread); ags_thread_set_flags(thread, AGS_THREAD_UNREF_ON_EXIT); g_object_set(thread, "frequency", AGS_RETURNABLE_THREAD_DEFAULT_JIFFIE, NULL); g_atomic_int_set(&(returnable_thread->flags), AGS_RETURNABLE_THREAD_RUN_ONCE); returnable_thread->thread_pool = NULL; g_rec_mutex_init(&(returnable_thread->reset_mutex)); g_atomic_pointer_set(&(returnable_thread->safe_data), NULL); returnable_thread->handler = 0; } void ags_returnable_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsReturnableThread *returnable_thread; returnable_thread = AGS_RETURNABLE_THREAD(gobject); switch(prop_id){ case PROP_THREAD_POOL: { GObject *thread_pool; thread_pool = g_value_get_object(value); if(returnable_thread->thread_pool == thread_pool) return; if(returnable_thread->thread_pool != NULL){ g_object_unref(returnable_thread->thread_pool); } if(thread_pool != NULL){ g_object_ref(thread_pool); } returnable_thread->thread_pool = thread_pool; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_returnable_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsReturnableThread *returnable_thread; returnable_thread = AGS_RETURNABLE_THREAD(gobject); switch(prop_id){ case PROP_THREAD_POOL: { g_value_set_object(value, returnable_thread->thread_pool); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_returnable_thread_dispose(GObject *gobject) { AgsReturnableThread *returnable_thread; returnable_thread = (AgsReturnableThread *) gobject; /* thread pool */ if(returnable_thread->thread_pool != NULL){ g_object_unref(returnable_thread->thread_pool); returnable_thread->thread_pool = NULL; } /* call parent */ G_OBJECT_CLASS(ags_returnable_thread_parent_class)->dispose(gobject); } void ags_returnable_thread_finalize(GObject *gobject) { AgsReturnableThread *returnable_thread; returnable_thread = (AgsReturnableThread *) gobject; /* thread pool */ if(returnable_thread->thread_pool != NULL){ g_object_unref(returnable_thread->thread_pool); } /* call parent */ G_OBJECT_CLASS(ags_returnable_thread_parent_class)->finalize(gobject); } void ags_returnable_thread_start(AgsThread *thread) { AGS_THREAD_CLASS(ags_returnable_thread_parent_class)->start(thread); } void ags_returnable_thread_run(AgsThread *thread) { AgsThreadPool *thread_pool; AgsReturnableThread *returnable_thread; GRecMutex *thread_mutex; // g_message("reset:0"); /* retrieve some variables */ returnable_thread = AGS_RETURNABLE_THREAD(thread); /* safe run */ if((AGS_RETURNABLE_THREAD_IN_USE & (g_atomic_int_get(&(returnable_thread->flags)))) != 0){ ags_returnable_thread_safe_run(returnable_thread); if((AGS_RETURNABLE_THREAD_RUN_ONCE & (g_atomic_int_get(&(returnable_thread->flags)))) != 0){ g_atomic_int_and(&(returnable_thread->flags), (~AGS_RETURNABLE_THREAD_IN_USE)); /* return to thread pool */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); thread_pool = returnable_thread->thread_pool; g_rec_mutex_unlock(thread_mutex); /* give returnable thread back to thread pool */ g_atomic_pointer_set(&(returnable_thread->safe_data), NULL); ags_returnable_thread_disconnect_safe_run(returnable_thread); g_atomic_pointer_set(&(thread_pool->returnable_thread), g_list_prepend(g_atomic_pointer_get(&(thread_pool->returnable_thread)), returnable_thread)); } } } void ags_returnable_thread_safe_run(AgsReturnableThread *returnable_thread) { guint returnable_thread_signal; returnable_thread_signal = returnable_thread_signals[SAFE_RUN]; g_return_if_fail(AGS_IS_RETURNABLE_THREAD(returnable_thread)); g_object_ref(returnable_thread); g_signal_emit(returnable_thread, returnable_thread_signal, 0); g_object_unref(returnable_thread); } void ags_returnable_thread_stop(AgsThread *thread) { AGS_THREAD_CLASS(ags_returnable_thread_parent_class)->stop(thread); } void ags_returnable_thread_resume(AgsThread *thread) { /* empty */ } /** * ags_returnable_thread_test_flags: * @returnable_thread: the #AgsReturnableThread * @flags: the flags * * Test @flags to be set on @returnable_thread. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_returnable_thread_test_flags(AgsReturnableThread *returnable_thread, guint flags) { gboolean retval; if(!AGS_IS_RETURNABLE_THREAD(returnable_thread)){ return(FALSE); } retval = ((flags & (g_atomic_int_get(&(returnable_thread->flags)))) != 0) ? TRUE: FALSE; return(retval); } /** * ags_returnable_thread_set_flags: * @returnable_thread: the #AgsReturnableThread * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_returnable_thread_set_flags(AgsReturnableThread *returnable_thread, guint flags) { if(!AGS_IS_RETURNABLE_THREAD(returnable_thread)){ return; } g_atomic_int_or(&(returnable_thread->flags), flags); } /** * ags_returnable_thread_unset_flags: * @returnable_thread: the #AgsReturnableThread * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_returnable_thread_unset_flags(AgsReturnableThread *returnable_thread, guint flags) { if(!AGS_IS_RETURNABLE_THREAD(returnable_thread)){ return; } g_atomic_int_and(&(returnable_thread->flags), (~flags)); } /** * ags_returnable_thread_connect_safe_run: * @returnable_thread: the thread to connect * @callback: (scope call): the callback * * Connects @callback to @thread. * * Since: 3.0.0 */ void ags_returnable_thread_connect_safe_run(AgsReturnableThread *returnable_thread, AgsReturnableThreadCallback callback) { if(returnable_thread->handler > 0){ return; } returnable_thread->handler = g_signal_connect(G_OBJECT(returnable_thread), "safe-run", G_CALLBACK(callback), returnable_thread); } /** * ags_returnable_thread_disconnect_safe_run: * @returnable_thread: the thread to disconnect * * Disconnects callback of @thread. * * Since: 3.0.0 */ void ags_returnable_thread_disconnect_safe_run(AgsReturnableThread *returnable_thread) { if(returnable_thread->handler == 0){ return; } g_signal_handler_disconnect(G_OBJECT(returnable_thread), returnable_thread->handler); returnable_thread->handler = 0; } /** * ags_returnable_thread_new: * @thread_pool: the #AgsThreadPool * * Create a new instance of #AgsReturnableThread. * * Returns: the new #AgsReturnableThread * * Since: 3.0.0 */ AgsReturnableThread* ags_returnable_thread_new(GObject *thread_pool) { AgsReturnableThread *returnable_thread; returnable_thread = (AgsReturnableThread *) g_object_new(AGS_TYPE_RETURNABLE_THREAD, "thread-pool", thread_pool, NULL); return(returnable_thread); } gsequencer-3.1.3/ags/thread/ags_thread_application_context.h0000644000175000017500000000600313607210263021221 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_THREAD_APPLICATION_CONTEXT_H__ #define __AGS_THREAD_APPLICATION_CONTEXT_H__ #include #include #include #include #include #define AGS_TYPE_THREAD_APPLICATION_CONTEXT (ags_thread_application_context_get_type()) #define AGS_THREAD_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_THREAD_APPLICATION_CONTEXT, AgsThreadApplicationContext)) #define AGS_THREAD_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_THREAD_APPLICATION_CONTEXT, AgsThreadApplicationContextClass)) #define AGS_IS_THREAD_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_THREAD_APPLICATION_CONTEXT)) #define AGS_IS_THREAD_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_THREAD_APPLICATION_CONTEXT)) #define AGS_THREAD_APPLICATION_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_THREAD_APPLICATION_CONTEXT, AgsThreadApplicationContextClass)) #define AGS_THREAD_DEFAULT_VERSION "0.7.122.8" #define AGS_THREAD_BUILD_ID "Tue Mar 21 20:03:29 CET 2017" typedef struct _AgsThreadApplicationContext AgsThreadApplicationContext; typedef struct _AgsThreadApplicationContextClass AgsThreadApplicationContextClass; /** * AgsThreadApplicationContextFlags: * @AGS_THREAD_APPLICATION_CONTEXT_SINGLE_THREAD: run as threads in one single loop * * Enum values to control the behavior or indicate internal state of #AgsThreadApplicationContext by * enable/disable as sync_flags. */ typedef enum{ AGS_THREAD_APPLICATION_CONTEXT_SINGLE_THREAD = 1, }AgsThreadApplicationContextFlags; struct _AgsThreadApplicationContext { AgsApplicationContext application_context; guint flags; gchar *version; gchar *build_id; AgsThreadPool *thread_pool; GList *worker; }; struct _AgsThreadApplicationContextClass { AgsApplicationContextClass application_context; }; GType ags_thread_application_context_get_type(); void ags_thread_application_context_register_types(AgsApplicationContext *application_context); AgsThreadApplicationContext* ags_thread_application_context_new(); #endif /*__AGS_THREAD_APPLICATION_CONTEXT_H__*/ gsequencer-3.1.3/ags/thread/ags_generic_main_loop.c0000644000175000017500000002335013607210263017273 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_generic_main_loop_class_init(AgsGenericMainLoopClass *generic_main_loop); void ags_generic_main_loop_main_loop_interface_init(AgsMainLoopInterface *main_loop); void ags_generic_main_loop_init(AgsGenericMainLoop *generic_main_loop); void ags_generic_main_loop_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_generic_main_loop_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_generic_main_loop_finalize(GObject *gobject); GRecMutex* ags_generic_main_loop_get_tree_lock(AgsMainLoop *main_loop); void ags_generic_main_loop_set_syncing(AgsMainLoop *main_loop, gboolean is_syncing); gboolean ags_generic_main_loop_is_syncing(AgsMainLoop *main_loop); void ags_generic_main_loop_set_critical_region(AgsMainLoop *main_loop, gboolean is_critical_region); gboolean ags_generic_main_loop_is_critical_region(AgsMainLoop *main_loop); void ags_generic_main_loop_inc_queued_critical_region(AgsMainLoop *main_loop); void ags_generic_main_loop_dec_queued_critical_region(AgsMainLoop *main_loop); guint ags_generic_main_loop_test_queued_critical_region(AgsMainLoop *main_loop); void ags_generic_main_loop_change_frequency(AgsMainLoop *main_loop, gdouble frequency); void ags_generic_main_loop_start(AgsThread *thread); /** * SECTION:ags_generic_main_loop * @short_description: generic loop * @title: AgsGenericMainLoop * @section_id: * @include: ags/thread/ags_generic_main_loop.h * * The #AgsGenericMainLoop is suitable as #AgsMainLoop and does * generic processing. */ static gpointer ags_generic_main_loop_parent_class = NULL; enum{ PROP_0, }; GType ags_generic_main_loop_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_generic_main_loop = 0; static const GTypeInfo ags_generic_main_loop_info = { sizeof (AgsGenericMainLoopClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_generic_main_loop_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsGenericMainLoop), 0, /* n_preallocs */ (GInstanceInitFunc) ags_generic_main_loop_init, }; static const GInterfaceInfo ags_main_loop_interface_info = { (GInterfaceInitFunc) ags_generic_main_loop_main_loop_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_generic_main_loop = g_type_register_static(AGS_TYPE_THREAD, "AgsGenericMainLoop", &ags_generic_main_loop_info, 0); g_type_add_interface_static(ags_type_generic_main_loop, AGS_TYPE_MAIN_LOOP, &ags_main_loop_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_generic_main_loop); } return g_define_type_id__volatile; } void ags_generic_main_loop_class_init(AgsGenericMainLoopClass *generic_main_loop) { GObjectClass *gobject; AgsThreadClass *thread; GParamSpec *param_spec; ags_generic_main_loop_parent_class = g_type_class_peek_parent(generic_main_loop); /* GObject */ gobject = (GObjectClass *) generic_main_loop; gobject->set_property = ags_generic_main_loop_set_property; gobject->get_property = ags_generic_main_loop_get_property; gobject->finalize = ags_generic_main_loop_finalize; /* properties */ /* AgsThread */ thread = (AgsThreadClass *) generic_main_loop; thread->start = ags_generic_main_loop_start; /* AgsGenericMainLoop */ } void ags_generic_main_loop_main_loop_interface_init(AgsMainLoopInterface *main_loop) { main_loop->get_tree_lock = ags_generic_main_loop_get_tree_lock; main_loop->set_syncing = ags_generic_main_loop_set_syncing; main_loop->is_syncing = ags_generic_main_loop_is_syncing; main_loop->set_critical_region = ags_generic_main_loop_set_critical_region; main_loop->is_critical_region = ags_generic_main_loop_is_critical_region; main_loop->inc_queued_critical_region = ags_generic_main_loop_inc_queued_critical_region; main_loop->dec_queued_critical_region = ags_generic_main_loop_dec_queued_critical_region; main_loop->test_queued_critical_region = ags_generic_main_loop_test_queued_critical_region; main_loop->change_frequency = ags_generic_main_loop_change_frequency; } void ags_generic_main_loop_init(AgsGenericMainLoop *generic_main_loop) { AgsThread *thread; guint i; /* calculate frequency */ thread = (AgsThread *) generic_main_loop; ags_thread_set_flags(thread, AGS_THREAD_TIME_ACCOUNTING); g_object_set(thread, "frequency", AGS_GENERIC_MAIN_LOOP_DEFAULT_JIFFIE, NULL); /* tree lock mutex */ g_rec_mutex_init(&(generic_main_loop->tree_lock)); ags_main_loop_set_syncing(AGS_MAIN_LOOP(generic_main_loop), FALSE); ags_main_loop_set_critical_region(AGS_MAIN_LOOP(generic_main_loop), FALSE); g_atomic_int_set(&(generic_main_loop->critical_region_ref), 0); } void ags_generic_main_loop_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsGenericMainLoop *generic_main_loop; GRecMutex *thread_mutex; generic_main_loop = AGS_GENERIC_MAIN_LOOP(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(generic_main_loop); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_generic_main_loop_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsGenericMainLoop *generic_main_loop; GRecMutex *thread_mutex; generic_main_loop = AGS_GENERIC_MAIN_LOOP(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(generic_main_loop); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_generic_main_loop_finalize(GObject *gobject) { /* call parent */ G_OBJECT_CLASS(ags_generic_main_loop_parent_class)->finalize(gobject); } GRecMutex* ags_generic_main_loop_get_tree_lock(AgsMainLoop *main_loop) { GRecMutex *tree_lock; /* get tree lock mutex */ tree_lock = &(AGS_GENERIC_MAIN_LOOP(main_loop)->tree_lock); return(tree_lock); } void ags_generic_main_loop_set_syncing(AgsMainLoop *main_loop, gboolean is_syncing) { AgsGenericMainLoop *generic_main_loop; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* set syncing */ g_atomic_int_set(&(generic_main_loop->is_syncing), is_syncing); } gboolean ags_generic_main_loop_is_syncing(AgsMainLoop *main_loop) { AgsGenericMainLoop *generic_main_loop; gboolean is_syncing; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* is syncing */ is_syncing = g_atomic_int_get(&(generic_main_loop->is_syncing)); return(is_syncing); } void ags_generic_main_loop_set_critical_region(AgsMainLoop *main_loop, gboolean is_critical_region) { AgsGenericMainLoop *generic_main_loop; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* set critical region */ g_atomic_int_set(&(generic_main_loop->is_critical_region), is_critical_region); } gboolean ags_generic_main_loop_is_critical_region(AgsMainLoop *main_loop) { AgsGenericMainLoop *generic_main_loop; gboolean is_critical_region; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* is critical region */ is_critical_region = g_atomic_int_get(&(generic_main_loop->is_critical_region)); return(is_critical_region); } void ags_generic_main_loop_inc_queued_critical_region(AgsMainLoop *main_loop) { AgsGenericMainLoop *generic_main_loop; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* increment critical region */ g_atomic_int_inc(&(generic_main_loop->critical_region_ref)); } void ags_generic_main_loop_dec_queued_critical_region(AgsMainLoop *main_loop) { AgsGenericMainLoop *generic_main_loop; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* decrement critical region */ g_atomic_int_dec_and_test(&(generic_main_loop->critical_region_ref)); } guint ags_generic_main_loop_test_queued_critical_region(AgsMainLoop *main_loop) { AgsGenericMainLoop *generic_main_loop; guint critical_region_ref; generic_main_loop = AGS_GENERIC_MAIN_LOOP(main_loop); /* set critical region */ critical_region_ref = g_atomic_int_get(&(generic_main_loop->is_critical_region)); return(critical_region_ref); } void ags_generic_main_loop_change_frequency(AgsMainLoop *main_loop, gdouble frequency) { //empty } void ags_generic_main_loop_start(AgsThread *thread) { AGS_THREAD_CLASS(ags_generic_main_loop_parent_class)->start(thread); } /** * ags_generic_main_loop_new: * * Create a new #AgsGenericMainLoop. * * Returns: the new #AgsGenericMainLoop * * Since: 3.0.0 */ AgsGenericMainLoop* ags_generic_main_loop_new() { AgsGenericMainLoop *generic_main_loop; generic_main_loop = (AgsGenericMainLoop *) g_object_new(AGS_TYPE_GENERIC_MAIN_LOOP, NULL); return(generic_main_loop); } gsequencer-3.1.3/ags/thread/ags_thread.h0000644000175000017500000002631513610725037015106 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_THREAD_H__ #define __AGS_THREAD_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_THREAD (ags_thread_get_type()) #define AGS_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_THREAD, AgsThread)) #define AGS_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_THREAD, AgsThreadClass)) #define AGS_IS_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_THREAD)) #define AGS_IS_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_THREAD)) #define AGS_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_THREAD, AgsThreadClass)) #define AGS_THREAD_GET_OBJ_MUTEX(obj) (&(((AgsThread *) obj)->obj_mutex)) #define AGS_THREAD_GET_WAIT_MUTEX(obj) (&(((AgsThread *) obj)->wait_mutex)) #define AGS_THREAD_GET_WAIT_COND(obj) (&(((AgsThread *) obj)->wait_cond)) #define AGS_THREAD_GET_TIC_MUTEX(obj) (&(((AgsThread *) obj)->tic_mutex)) #define AGS_THREAD_GET_TIC_COND(obj) (&(((AgsThread *) obj)->tic_cond)) #define AGS_THREAD_GET_START_MUTEX(obj) (&(((AgsThread *) obj)->start_mutex)) #define AGS_THREAD_GET_START_COND(obj) (&(((AgsThread *) obj)->start_cond)) #define AGS_THREAD_HERTZ_JIFFIE (1000.0) #define AGS_THREAD_YIELD_JIFFIE (2.0) #define AGS_THREAD_DEFAULT_JIFFIE (250.0) #define AGS_THREAD_DEFAULT_MAX_PRECISION (1000.0) #define AGS_THREAD_MAX_PRECISION (1000.0) #define AGS_THREAD_DEFAULT_ATTACK (1.0) #define AGS_THREAD_TOLERANCE (0.0) typedef struct _AgsThread AgsThread; typedef struct _AgsThreadClass AgsThreadClass; /** * AgsThreadFlags: * @AGS_THREAD_ADDED_TO_REGISTRY: the thread was added to registry, see #AgsConnectable::add_to_registry() * @AGS_THREAD_CONNECTED: the thread was connected by #AgsConnectable::connect() * @AGS_THREAD_UNREF_ON_EXIT: call g_object_unref() before g_thread_exit() * @AGS_THREAD_IMMEDIATE_SYNC: do sync immediately * @AGS_THREAD_INTERMEDIATE_PRE_SYNC: intermediate pre sync to parent thread * @AGS_THREAD_INTERMEDIATE_POST_SYNC: intermediate post sync to parent thread * @AGS_THREAD_START_SYNCED_FREQ: sync frequency as starting thread * @AGS_THREAD_MARK_SYNCED: mark thread synced * @AGS_THREAD_TIME_ACCOUNTING: time accounting causes to track time * * Enum values to control the behavior or indicate internal state of #AgsThread by * enable/disable as flags. */ typedef enum{ AGS_THREAD_ADDED_TO_REGISTRY = 1, AGS_THREAD_CONNECTED = 1 << 1, AGS_THREAD_UNREF_ON_EXIT = 1 << 2, AGS_THREAD_IMMEDIATE_SYNC = 1 << 3, AGS_THREAD_INTERMEDIATE_PRE_SYNC = 1 << 4, AGS_THREAD_INTERMEDIATE_POST_SYNC = 1 << 5, AGS_THREAD_START_SYNCED_FREQ = 1 << 6, AGS_THREAD_MARK_SYNCED = 1 << 7, AGS_THREAD_TIME_ACCOUNTING = 1 << 8, }AgsThreadFlags; /** * AgsThreadStatusFlags: * @AGS_THREAD_STATUS_RT_SETUP: realtime setup was performed * @AGS_THREAD_STATUS_INITIAL_SYNC: initial sync indicates the thread wasn't synced before * @AGS_THREAD_STATUS_INITIAL_RUN: the first call to #AgsThread:run() * @AGS_THREAD_STATUS_IS_CHAOS_TREE: the thread is not synced * @AGS_THREAD_STATUS_START_WAIT: the thread start is waiting * @AGS_THREAD_STATUS_START_DONE: the thread start is done * @AGS_THREAD_STATUS_READY: the thread is ready * @AGS_THREAD_STATUS_WAITING: the thread is waiting * @AGS_THREAD_STATUS_RUNNING: the thread is running * @AGS_THREAD_STATUS_LOCKED: the thread is locked * @AGS_THREAD_STATUS_BUSY: the thread is busy * @AGS_THREAD_STATUS_SYNCED: the thread joined the tic based system, it is synced * @AGS_THREAD_STATUS_SYNCED_FREQ: the frequency was synced * * Enum values to control the behavior or indicate internal state of #AgsThread by * enable/disable as status flags. */ typedef enum{ AGS_THREAD_STATUS_RT_SETUP = 1, AGS_THREAD_STATUS_INITIAL_SYNC = 1 << 1, AGS_THREAD_STATUS_INITIAL_RUN = 1 << 2, AGS_THREAD_STATUS_IS_CHAOS_TREE = 1 << 3, AGS_THREAD_STATUS_START_WAIT = 1 << 4, AGS_THREAD_STATUS_START_DONE = 1 << 5, AGS_THREAD_STATUS_READY = 1 << 6, AGS_THREAD_STATUS_WAITING = 1 << 7, AGS_THREAD_STATUS_RUNNING = 1 << 8, AGS_THREAD_STATUS_LOCKED = 1 << 9, AGS_THREAD_STATUS_BUSY = 1 << 10, AGS_THREAD_STATUS_SYNCED = 1 << 11, AGS_THREAD_STATUS_SYNCED_FREQ = 1 << 12, }AgsThreadStatusFlags; /** * AgsThreadSyncTicFlags: * @AGS_THREAD_SYNC_TIC_WAIT_0: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_0: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_1: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_1: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_2: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_2: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_3: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_3: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_4: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_4: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_5: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_5: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_6: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_6: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_7: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_7: done tree to be synced * @AGS_THREAD_SYNC_TIC_WAIT_8: wait tree to be synced * @AGS_THREAD_SYNC_TIC_DONE_8: done tree to be synced * * Enum values to control the behavior or indicate internal state of #AgsThread by * enable/disable as sync tic flags. */ typedef enum{ AGS_THREAD_SYNC_TIC_WAIT_0 = 1, AGS_THREAD_SYNC_TIC_DONE_0 = 1 << 1, AGS_THREAD_SYNC_TIC_WAIT_1 = 1 << 2, AGS_THREAD_SYNC_TIC_DONE_1 = 1 << 3, AGS_THREAD_SYNC_TIC_WAIT_2 = 1 << 4, AGS_THREAD_SYNC_TIC_DONE_2 = 1 << 5, AGS_THREAD_SYNC_TIC_WAIT_3 = 1 << 6, AGS_THREAD_SYNC_TIC_DONE_3 = 1 << 7, AGS_THREAD_SYNC_TIC_WAIT_4 = 1 << 8, AGS_THREAD_SYNC_TIC_DONE_4 = 1 << 9, AGS_THREAD_SYNC_TIC_WAIT_5 = 1 << 10, AGS_THREAD_SYNC_TIC_DONE_5 = 1 << 11, AGS_THREAD_SYNC_TIC_WAIT_6 = 1 << 12, AGS_THREAD_SYNC_TIC_DONE_6 = 1 << 13, AGS_THREAD_SYNC_TIC_WAIT_7 = 1 << 14, AGS_THREAD_SYNC_TIC_DONE_7 = 1 << 15, AGS_THREAD_SYNC_TIC_WAIT_8 = 1 << 16, AGS_THREAD_SYNC_TIC_DONE_8 = 1 << 17, }AgsThreadSyncTicFlags; struct _AgsThread { GObject gobject; guint my_flags; volatile guint status_flags; volatile guint sync_tic_flags; GRecMutex obj_mutex; AgsUUID *uuid; volatile guint current_sync_tic; gdouble delay; gdouble tic_delay; gdouble frequency; gdouble max_precision; gint64 last_run_start; gint64 last_run_end; GThread *thread; GMutex wait_mutex; GCond wait_cond; GMutex tic_mutex; GCond tic_cond; GList *start_queue; GMutex *start_mutex; GCond *start_cond; AgsThread *parent; AgsThread *next; AgsThread *prev; AgsThread *children; }; struct _AgsThreadClass { GObjectClass gobject; guint (*clock)(AgsThread *thread); void (*start)(AgsThread *thread); void (*run)(AgsThread *thread); void (*stop)(AgsThread *thread); }; GType ags_thread_get_type(); gboolean ags_thread_global_get_use_sync_counter(); gboolean ags_thread_test_flags(AgsThread *thread, guint flags); void ags_thread_set_flags(AgsThread *thread, guint flags); void ags_thread_unset_flags(AgsThread *thread, guint flags); gboolean ags_thread_test_status_flags(AgsThread *thread, guint status_flags); void ags_thread_set_status_flags(AgsThread *thread, guint status_flags); void ags_thread_unset_status_flags(AgsThread *thread, guint status_flags); void ags_thread_clear_status_flags(AgsThread *thread); gboolean ags_thread_test_sync_tic_flags(AgsThread *thread, guint sync_tic_flags); void ags_thread_set_sync_tic_flags(AgsThread *thread, guint sync_tic_flags); void ags_thread_unset_sync_tic_flags(AgsThread *thread, guint sync_tic_flags); void ags_thread_clear_sync_tic_flags(AgsThread *thread); void ags_thread_set_current_sync_tic(AgsThread *thread, guint current_sync_tic); guint ags_thread_get_current_sync_tic(AgsThread *thread); void ags_thread_set_delay(AgsThread *thread, gdouble delay); gdouble ags_thread_get_delay(AgsThread *thread); void ags_thread_set_frequency(AgsThread *thread, gdouble frequency); gdouble ags_thread_get_frequency(AgsThread *thread); void ags_thread_set_max_precision(AgsThread *thread, gdouble max_precision); gdouble ags_thread_get_max_precision(AgsThread *thread); AgsThread* ags_thread_find_type(AgsThread *thread, GType gtype); AgsThread* ags_thread_self(void); AgsThread* ags_thread_parent(AgsThread *thread); AgsThread* ags_thread_next(AgsThread *thread); AgsThread* ags_thread_prev(AgsThread *thread); AgsThread* ags_thread_children(AgsThread *thread); AgsThread* ags_thread_get_toplevel(AgsThread *thread); AgsThread* ags_thread_first(AgsThread *thread); AgsThread* ags_thread_last(AgsThread *thread); void ags_thread_lock(AgsThread *thread); gboolean ags_thread_trylock(AgsThread *thread); void ags_thread_unlock(AgsThread *thread); void ags_thread_remove_child(AgsThread *thread, AgsThread *child); void ags_thread_add_child(AgsThread *thread, AgsThread *child); void ags_thread_add_child_extended(AgsThread *thread, AgsThread *child, gboolean no_start, gboolean no_wait); gboolean ags_thread_is_current_ready(AgsThread *current, guint current_sync_tic); gboolean ags_thread_is_tree_ready_recursive(AgsThread *thread, guint current_sync_tic); void ags_thread_prepare_current_sync(AgsThread *current, guint current_sync_tic); void ags_thread_prepare_tree_sync_recursive(AgsThread *thread, guint current_sync_tic); void ags_thread_set_current_sync(AgsThread *current, guint current_sync_tic); void ags_thread_set_tree_sync_recursive(AgsThread *thread, guint current_sync_tic); guint ags_thread_clock(AgsThread *thread); void ags_thread_add_start_queue(AgsThread *thread, AgsThread *child); void ags_thread_add_start_queue_all(AgsThread *thread, GList *child); void ags_thread_start(AgsThread *thread); void ags_thread_run(AgsThread *thread); void ags_thread_stop(AgsThread *thread); AgsThread* ags_thread_new(); G_END_DECLS #endif /*__AGS_THREAD_H__*/ gsequencer-3.1.3/ags/thread/ags_task_launcher.c0000644000175000017500000005305013613101164016441 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_task_launcher_class_init(AgsTaskLauncherClass *task_launcher); void ags_task_launcher_connectable_interface_init(AgsConnectableInterface *connectable); void ags_task_launcher_init(AgsTaskLauncher *task_launcher); void ags_task_launcher_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_task_launcher_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_task_launcher_dispose(GObject *gobject); void ags_task_launcher_finalize(GObject *gobject); AgsUUID* ags_task_launcher_get_uuid(AgsConnectable *connectable); gboolean ags_task_launcher_has_resource(AgsConnectable *connectable); gboolean ags_task_launcher_is_ready(AgsConnectable *connectable); void ags_task_launcher_add_to_registry(AgsConnectable *connectable); void ags_task_launcher_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_task_launcher_list_resource(AgsConnectable *connectable); xmlNode* ags_task_launcher_xml_compose(AgsConnectable *connectable); void ags_task_launcher_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_task_launcher_is_connected(AgsConnectable *connectable); void ags_task_launcher_connect(AgsConnectable *connectable); void ags_task_launcher_disconnect(AgsConnectable *connectable); void ags_task_launcher_real_run(AgsTaskLauncher *task_launcher); gboolean ags_task_launcher_source_func(AgsTaskLauncher *task_launcher); /** * SECTION:ags_task_launcher * @short_description: task launcher * @title: AgsTaskLauncher * @section_id: * @include: ags/thread/ags_task_launcher.h * * The #AgsTaskLauncher acts as task launcher. */ enum{ RUN, LAST_SIGNAL, }; enum{ PROP_0, PROP_TASK, PROP_CYCLIC_TASK, }; static gpointer ags_task_launcher_parent_class = NULL; static guint task_launcher_signals[LAST_SIGNAL]; GType ags_task_launcher_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_task_launcher = 0; static const GTypeInfo ags_task_launcher_info = { sizeof (AgsTaskLauncherClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_task_launcher_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTaskLauncher), 0, /* n_preallocs */ (GInstanceInitFunc) ags_task_launcher_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_task_launcher_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_task_launcher = g_type_register_static(G_TYPE_OBJECT, "AgsTaskLauncher", &ags_task_launcher_info, 0); g_type_add_interface_static(ags_type_task_launcher, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_task_launcher); } return g_define_type_id__volatile; } void ags_task_launcher_class_init(AgsTaskLauncherClass *task_launcher) { GObjectClass *gobject; GParamSpec *param_spec; ags_task_launcher_parent_class = g_type_class_peek_parent(task_launcher); /* GObject */ gobject = (GObjectClass *) task_launcher; gobject->set_property = ags_task_launcher_set_property; gobject->get_property = ags_task_launcher_get_property; gobject->dispose = ags_task_launcher_dispose; gobject->finalize = ags_task_launcher_finalize; /* properties */ /** * AgsTaskLauncher:task: (type GList(AgsRecall)) (transfer full) * * The assigned #AgsTask to launch. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("task", i18n_pspec("assigned tasks"), i18n_pspec("The tasks assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TASK, param_spec); /** * AgsTaskLauncher:cyclic-task: (type GList(AgsRecall)) (transfer full) * * The assigned cyclic #AgsTask to launch. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("cyclic-task", i18n_pspec("assigned cyclic tasks"), i18n_pspec("The cyclic tasks assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CYCLIC_TASK, param_spec); /* AgsTaskLauncher */ task_launcher->run = ags_task_launcher_real_run; /* signals */ /** * AgsTaskLauncher::run: * @task_launcher: the #AgsTaskLauncher * * The ::run signal is invoked to run #AgsTaskLauncher:task * * Since: 3.0.0 */ task_launcher_signals[RUN] = g_signal_new("run", G_TYPE_FROM_CLASS (task_launcher), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsTaskLauncherClass, run), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_task_launcher_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_task_launcher_get_uuid; connectable->has_resource = ags_task_launcher_has_resource; connectable->is_ready = ags_task_launcher_is_ready; connectable->add_to_registry = ags_task_launcher_add_to_registry; connectable->remove_from_registry = ags_task_launcher_remove_from_registry; connectable->list_resource = ags_task_launcher_list_resource; connectable->xml_compose = ags_task_launcher_xml_compose; connectable->xml_parse = ags_task_launcher_xml_parse; connectable->is_connected = ags_task_launcher_is_connected; connectable->connect = ags_task_launcher_connect; connectable->disconnect = ags_task_launcher_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_task_launcher_init(AgsTaskLauncher *task_launcher) { task_launcher->flags = 0; /* the obj mutex */ g_rec_mutex_init(&(task_launcher->obj_mutex)); /* uuid */ task_launcher->uuid = ags_uuid_alloc(); ags_uuid_generate(task_launcher->uuid); task_launcher->main_context = NULL; task_launcher->task = NULL; task_launcher->cyclic_task = NULL; /* wait */ g_atomic_int_set(&(task_launcher->is_running), FALSE); g_atomic_int_set(&(task_launcher->wait_count), 0); g_mutex_init(&(task_launcher->wait_mutex)); g_cond_init(&(task_launcher->wait_cond)); } void ags_task_launcher_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTaskLauncher *task_launcher; GRecMutex *task_launcher_mutex; task_launcher = AGS_TASK_LAUNCHER(gobject); /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); switch(prop_id){ case PROP_TASK: { AgsTask *task; task = (AgsTask *) g_value_get_pointer(value); ags_task_launcher_add_task(task_launcher, task); } break; case PROP_CYCLIC_TASK: { AgsTask *cyclic_task; cyclic_task = (AgsTask *) g_value_get_pointer(value); ags_task_launcher_add_cyclic_task(task_launcher, cyclic_task); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_task_launcher_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTaskLauncher *task_launcher; GRecMutex *task_launcher_mutex; task_launcher = AGS_TASK_LAUNCHER(gobject); /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); switch(prop_id){ case PROP_TASK: { g_rec_mutex_lock(task_launcher_mutex); g_value_set_pointer(value, g_list_copy_deep(task_launcher->task, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(task_launcher_mutex); } break; case PROP_CYCLIC_TASK: { g_rec_mutex_lock(task_launcher_mutex); g_value_set_pointer(value, g_list_copy_deep(task_launcher->cyclic_task, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(task_launcher_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_task_launcher_dispose(GObject *gobject) { AgsTaskLauncher *task_launcher; task_launcher = AGS_TASK_LAUNCHER(gobject); if(task_launcher->main_context != NULL){ g_main_context_unref(task_launcher->main_context); task_launcher->main_context = NULL; } if(task_launcher->task != NULL){ g_list_free_full(task_launcher->task, g_object_unref); task_launcher->task = NULL; } if(task_launcher->cyclic_task != NULL){ g_list_free_full(task_launcher->cyclic_task, g_object_unref); task_launcher->cyclic_task = NULL; } /* call parent */ G_OBJECT_CLASS(ags_task_launcher_parent_class)->dispose(gobject); } void ags_task_launcher_finalize(GObject *gobject) { AgsTaskLauncher *task_launcher; task_launcher = AGS_TASK_LAUNCHER(gobject); /* UUID */ ags_uuid_free(task_launcher->uuid); if(task_launcher->main_context != NULL){ g_main_context_unref(task_launcher->main_context); } g_list_free_full(task_launcher->task, g_object_unref); g_list_free_full(task_launcher->cyclic_task, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_task_launcher_parent_class)->finalize(gobject); } AgsUUID* ags_task_launcher_get_uuid(AgsConnectable *connectable) { AgsTaskLauncher *task_launcher; AgsUUID *ptr; GRecMutex *task_launcher_mutex; task_launcher = AGS_TASK_LAUNCHER(connectable); /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); /* get UUID */ g_rec_mutex_lock(task_launcher_mutex); ptr = task_launcher->uuid; g_rec_mutex_unlock(task_launcher_mutex); return(ptr); } gboolean ags_task_launcher_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_task_launcher_is_ready(AgsConnectable *connectable) { AgsTaskLauncher *task_launcher; gboolean is_ready; task_launcher = AGS_TASK_LAUNCHER(connectable); /* check is added */ is_ready = ags_task_launcher_test_flags(task_launcher, AGS_TASK_LAUNCHER_ADDED_TO_REGISTRY); return(is_ready); } void ags_task_launcher_add_to_registry(AgsConnectable *connectable) { AgsTaskLauncher *task_launcher; if(ags_connectable_is_ready(connectable)){ return; } task_launcher = AGS_TASK_LAUNCHER(connectable); ags_task_launcher_set_flags(task_launcher, AGS_TASK_LAUNCHER_ADDED_TO_REGISTRY); } void ags_task_launcher_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_task_launcher_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_task_launcher_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_task_launcher_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_task_launcher_is_connected(AgsConnectable *connectable) { AgsTaskLauncher *task_launcher; gboolean is_connected; task_launcher = AGS_TASK_LAUNCHER(connectable); /* check is connected */ is_connected = ags_task_launcher_test_flags(task_launcher, AGS_TASK_LAUNCHER_CONNECTED); return(is_connected); } void ags_task_launcher_connect(AgsConnectable *connectable) { AgsTaskLauncher *task_launcher; if(ags_connectable_is_connected(connectable)){ return; } task_launcher = AGS_TASK_LAUNCHER(connectable); ags_task_launcher_set_flags(task_launcher, AGS_TASK_LAUNCHER_CONNECTED); } void ags_task_launcher_disconnect(AgsConnectable *connectable) { AgsTaskLauncher *task_launcher; if(!ags_connectable_is_connected(connectable)){ return; } task_launcher = AGS_TASK_LAUNCHER(connectable); ags_task_launcher_unset_flags(task_launcher, AGS_TASK_LAUNCHER_CONNECTED); } /** * ags_task_launcher_test_flags: * @task_launcher: the #AgsTaskLauncher * @flags: the flags * * Test @flags to be set on @task_launcher. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_task_launcher_test_flags(AgsTaskLauncher *task_launcher, guint flags) { gboolean retval; GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher)){ return(FALSE); } /* get task_launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); /* test */ g_rec_mutex_lock(task_launcher_mutex); retval = (flags & (task_launcher->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(task_launcher_mutex); return(retval); } /** * ags_task_launcher_set_flags: * @task_launcher: the #AgsTaskLauncher * @flags: see enum AgsTaskLauncherFlags * * Enable a feature of #AgsTaskLauncher. * * Since: 3.0.0 */ void ags_task_launcher_set_flags(AgsTaskLauncher *task_launcher, guint flags) { guint task_launcher_flags; GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher)){ return; } /* get task_launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); /* set flags */ g_rec_mutex_lock(task_launcher_mutex); task_launcher->flags |= flags; g_rec_mutex_unlock(task_launcher_mutex); } /** * ags_task_launcher_unset_flags: * @task_launcher: the #AgsTaskLauncher * @flags: see enum AgsTaskLauncherFlags * * Disable a feature of AgsTaskLauncher. * * Since: 3.0.0 */ void ags_task_launcher_unset_flags(AgsTaskLauncher *task_launcher, guint flags) { guint task_launcher_flags; GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher)){ return; } /* get task_launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); /* unset flags */ g_rec_mutex_lock(task_launcher_mutex); task_launcher->flags &= (~flags); g_rec_mutex_unlock(task_launcher_mutex); } /** * ags_task_launcher_attach: * @task_launcher: the #AgsTaskLauncher * @main_context: the #GMainContext-struct * * Attach @task_launcher to @main_context. * * Since: 3.0.0 */ void ags_task_launcher_attach(AgsTaskLauncher *task_launcher, GMainContext *main_context) { GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher) || main_context == NULL){ return; } /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); g_rec_mutex_lock(task_launcher_mutex); task_launcher->main_context = main_context; g_main_context_ref(main_context); g_rec_mutex_unlock(task_launcher_mutex); } /** * ags_task_launcher_add_task: * @task_launcher: the #AgsTaskLauncher * @task: the #AgsTask * * Add @task to @task_launcher. * * Since: 3.0.0 */ void ags_task_launcher_add_task(AgsTaskLauncher *task_launcher, AgsTask *task) { GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher) || !AGS_IS_TASK(task)){ return; } /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); g_rec_mutex_lock(task_launcher_mutex); task_launcher->task = g_list_prepend(task_launcher->task, task); g_object_ref(task); g_rec_mutex_unlock(task_launcher_mutex); } /** * ags_task_launcher_add_task_all: * @task_launcher: the #AgsTaskLauncher * @list: (element-type Ags.Task) (transfer none): the #GList-struct containing #AgsTask * * Add all @list to @task_launcher. * * Since: 3.0.0 */ void ags_task_launcher_add_task_all(AgsTaskLauncher *task_launcher, GList *list) { GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher) || list == NULL){ return; } /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); g_rec_mutex_lock(task_launcher_mutex); if(task_launcher->task != NULL){ task_launcher->task = g_list_concat(task_launcher->task, g_list_copy_deep(list, (GCopyFunc) g_object_ref, NULL)); }else{ task_launcher->task = g_list_copy_deep(list, (GCopyFunc) g_object_ref, NULL); } g_rec_mutex_unlock(task_launcher_mutex); } /** * ags_task_launcher_add_cyclic_task: * @task_launcher: the #AgsTaskLauncher * @cyclic_task: the cyclic #AgsTask * * Add @cyclic_task to @task_launcher. * * Since: 3.0.0 */ void ags_task_launcher_add_cyclic_task(AgsTaskLauncher *task_launcher, AgsTask *cyclic_task) { GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher) || !AGS_IS_TASK(cyclic_task)){ return; } /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); g_rec_mutex_lock(task_launcher_mutex); task_launcher->cyclic_task = g_list_prepend(task_launcher->cyclic_task, cyclic_task); g_object_ref(cyclic_task); g_rec_mutex_unlock(task_launcher_mutex); } /** * ags_task_launcher_remove_cyclic_task: * @task_launcher: the #AgsTaskLauncher * @cyclic_task: the cyclic #AgsTask * * Remove @cyclic_task from @task_launcher. * * Since: 3.0.0 */ void ags_task_launcher_remove_cyclic_task(AgsTaskLauncher *task_launcher, AgsTask *cyclic_task) { GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher)){ return; } /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); g_rec_mutex_lock(task_launcher_mutex); if(g_list_find(task_launcher->task, cyclic_task) != NULL){ task_launcher->cyclic_task = g_list_remove(task_launcher->cyclic_task, cyclic_task); g_object_unref(cyclic_task); } g_rec_mutex_unlock(task_launcher_mutex); } void ags_task_launcher_real_run(AgsTaskLauncher *task_launcher) { GList *start_task, *task; GList *start_cyclic_task, *cyclic_task; GRecMutex *task_launcher_mutex; /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); g_rec_mutex_lock(task_launcher_mutex); g_object_get(task_launcher, "task", &start_task, "cyclic-task", &start_cyclic_task, NULL); g_list_free_full(task_launcher->task, g_object_unref); task_launcher->task = NULL; g_rec_mutex_unlock(task_launcher_mutex); /* one shot task */ task = start_task; while(task != NULL){ ags_task_launch(task->data); /* iterate */ task = task->next; } g_list_free_full(start_task, g_object_unref); /* cyclic task */ cyclic_task = start_cyclic_task; while(cyclic_task != NULL){ ags_task_launch(cyclic_task->data); /* iterate */ cyclic_task = cyclic_task->next; } g_list_free_full(start_cyclic_task, g_object_unref); } /** * ags_task_launcher_run: * @task_launcher: the #AgsTaskLauncher * * Run tasks. * * Since: 3.0.0 */ void ags_task_launcher_run(AgsTaskLauncher *task_launcher) { g_return_if_fail(AGS_IS_TASK_LAUNCHER(task_launcher)); g_object_ref(task_launcher); g_signal_emit(task_launcher, task_launcher_signals[RUN], 0); g_object_unref(task_launcher); } gboolean ags_task_launcher_source_func(AgsTaskLauncher *task_launcher) { ags_task_launcher_run(task_launcher); return(FALSE); } /** * ags_task_launcher_sync_run: * @task_launcher: the #AgsTaskLauncher * * Sync run tasks. * * Since: 3.0.0 */ void ags_task_launcher_sync_run(AgsTaskLauncher *task_launcher) { GMainContext *main_context; GRecMutex *task_launcher_mutex; if(!AGS_IS_TASK_LAUNCHER(task_launcher)){ return; } g_mutex_lock(&(task_launcher->wait_mutex)); g_atomic_int_set(&(task_launcher->is_running), TRUE); g_mutex_unlock(&(task_launcher->wait_mutex)); /* get task launcher mutex */ task_launcher_mutex = AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(task_launcher); /* get main context */ g_rec_mutex_lock(task_launcher_mutex); main_context = task_launcher->main_context; g_main_context_ref(main_context); g_rec_mutex_unlock(task_launcher_mutex); /* invoke */ g_object_ref(task_launcher); g_main_context_invoke_full(main_context, G_PRIORITY_HIGH, ags_task_launcher_source_func, task_launcher, (GDestroyNotify) g_object_unref); /* unref */ g_main_context_unref(main_context); g_mutex_lock(&(task_launcher->wait_mutex)); g_atomic_int_set(&(task_launcher->is_running), FALSE); g_atomic_int_set(&(task_launcher->wait_count), 0); if(g_atomic_int_get(&(task_launcher->wait_count)) > 0){ g_cond_broadcast(&(task_launcher->wait_cond)); } g_mutex_unlock(&(task_launcher->wait_mutex)); } /** * ags_task_launcher_new: * * Create a new #AgsTaskLauncher. * * Returns: the new #AgsTaskLauncher * * Since: 3.0.0 */ AgsTaskLauncher* ags_task_launcher_new() { AgsTaskLauncher *task_launcher; task_launcher = (AgsTaskLauncher *) g_object_new(AGS_TYPE_TASK_LAUNCHER, NULL); return(task_launcher); } gsequencer-3.1.3/ags/thread/ags_worker_thread.h0000644000175000017500000000611013607210263016462 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_WORKER_THREAD_H__ #define __AGS_WORKER_THREAD_H__ #include #include #include #define AGS_TYPE_WORKER_THREAD (ags_worker_thread_get_type()) #define AGS_WORKER_THREAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_WORKER_THREAD, AgsWorkerThread)) #define AGS_WORKER_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_WORKER_THREAD, AgsWorkerThreadClass)) #define AGS_IS_WORKER_THREAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_WORKER_THREAD)) #define AGS_IS_WORKER_THREAD_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_WORKER_THREAD)) #define AGS_WORKER_THREAD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_WORKER_THREAD, AgsWorkerThreadClass)) #define AGS_WORKER_THREAD_DEFAULT_JIFFIE (AGS_THREAD_DEFAULT_MAX_PRECISION) typedef struct _AgsWorkerThread AgsWorkerThread; typedef struct _AgsWorkerThreadClass AgsWorkerThreadClass; /** * AgsWorkerThreadStatusFlags: * @AGS_WORKER_THREAD_STATUS_RUNNING: the worker is running * @AGS_WORKER_THREAD_STATUS_RUN_WAIT: sync wait * @AGS_WORKER_THREAD_STATUS_RUN_DONE: sync done * @AGS_WORKER_THREAD_STATUS_RUN_SYNC: do sync * * Enum values to control the behavior or indicate internal state of #AgsWorkerThread by * enable/disable as sync_flags. */ typedef enum{ AGS_WORKER_THREAD_STATUS_RUNNING = 1, AGS_WORKER_THREAD_STATUS_RUN_WAIT = 1 << 1, AGS_WORKER_THREAD_STATUS_RUN_DONE = 1 << 2, AGS_WORKER_THREAD_STATUS_RUN_SYNC = 1 << 3, }AgsWorkerThreadStatusFlags; struct _AgsWorkerThread { AgsThread thread; volatile guint status_flags; GMutex run_mutex; GCond run_cond; GThread *worker_thread; }; struct _AgsWorkerThreadClass { AgsThreadClass thread; void (*do_poll)(AgsWorkerThread *worker_thread); }; GType ags_worker_thread_get_type(); gboolean ags_worker_thread_test_status_flags(AgsWorkerThread *worker_thread, guint status_flags); void ags_worker_thread_set_status_flags(AgsWorkerThread *worker_thread, guint status_flags); void ags_worker_thread_unset_status_flags(AgsWorkerThread *worker_thread, guint status_flags); void* ags_woker_thread_do_poll_loop(void *ptr); void ags_worker_thread_do_poll(AgsWorkerThread *worker_thread); AgsWorkerThread* ags_worker_thread_new(); #endif /*__AGS_WORKER_THREAD_H__*/ gsequencer-3.1.3/ags/thread/ags_task_launcher.h0000644000175000017500000000717213613101102016442 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TASK_LAUNCHER_H__ #define __AGS_TASK_LAUNCHER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TASK_LAUNCHER (ags_task_launcher_get_type()) #define AGS_TASK_LAUNCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TASK_LAUNCHER, AgsTaskLauncher)) #define AGS_TASK_LAUNCHER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_TASK_LAUNCHER, AgsTaskLauncher)) #define AGS_IS_TASK_LAUNCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TASK_LAUNCHER)) #define AGS_IS_TASK_LAUNCHER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TASK_LAUNCHER)) #define AGS_TASK_LAUNCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_TASK_LAUNCHER, AgsTaskLauncherClass)) #define AGS_TASK_LAUNCHER_GET_OBJ_MUTEX(obj) (&(((AgsTaskLauncher *) obj)->obj_mutex)) typedef struct _AgsTaskLauncher AgsTaskLauncher; typedef struct _AgsTaskLauncherClass AgsTaskLauncherClass; /** * AgsTaskLauncherFlags: * @AGS_TASK_LAUNCHER_ADDED_TO_REGISTRY: the task launcher was added to registry, see #AgsConnectable::add_to_registry() * @AGS_TASK_LAUNCHER_CONNECTED: the task launcher was connected by #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsTaskLauncher by * enable/disable as flags. */ typedef enum{ AGS_TASK_LAUNCHER_ADDED_TO_REGISTRY = 1, AGS_TASK_LAUNCHER_CONNECTED = 1 << 1, }AgsTaskLauncherFlags; struct _AgsTaskLauncher { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GMainContext *main_context; GList *task; GList *cyclic_task; volatile gboolean is_running; volatile gint wait_count; GMutex wait_mutex; GCond wait_cond; }; struct _AgsTaskLauncherClass { GObjectClass gobject; void (*run)(AgsTaskLauncher *task_launcher); }; GType ags_task_launcher_get_type(); gboolean ags_task_launcher_test_flags(AgsTaskLauncher *task_launcher, guint flags); void ags_task_launcher_set_flags(AgsTaskLauncher *task_launcher, guint flags); void ags_task_launcher_unset_flags(AgsTaskLauncher *task_launcher, guint flags); void ags_task_launcher_attach(AgsTaskLauncher *task_launcher, GMainContext *main_context); void ags_task_launcher_add_task(AgsTaskLauncher *task_launcher, AgsTask *task); void ags_task_launcher_add_task_all(AgsTaskLauncher *task_launcher, GList *list); void ags_task_launcher_add_cyclic_task(AgsTaskLauncher *task_launcher, AgsTask *cyclic_task); void ags_task_launcher_remove_cyclic_task(AgsTaskLauncher *task_launcher, AgsTask *cyclic_task); void ags_task_launcher_run(AgsTaskLauncher *task_launcher); void ags_task_launcher_sync_run(AgsTaskLauncher *task_launcher); AgsTaskLauncher* ags_task_launcher_new(); G_END_DECLS #endif /*__AGS_TASK_LAUNCHER_H__*/ gsequencer-3.1.3/ags/thread/ags_destroy_worker.h0000644000175000017500000000525013607210263016710 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DESTROY_WORKER_H__ #define __AGS_DESTROY_WORKER_H__ #include #include #include #include #define AGS_TYPE_DESTROY_WORKER (ags_destroy_worker_get_type()) #define AGS_DESTROY_WORKER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_DESTROY_WORKER, AgsDestroyWorker)) #define AGS_DESTROY_WORKER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_DESTROY_WORKER, AgsDestroyWorkerClass)) #define AGS_IS_DESTROY_WORKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_DESTROY_WORKER)) #define AGS_IS_DESTROY_WORKER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_DESTROY_WORKER)) #define AGS_DESTROY_WORKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_DESTROY_WORKER, AgsDestroyWorkerClass)) #define AGS_DESTROY_ENTRY(ptr) ((AgsDestroyEntry *) (ptr)) typedef struct _AgsDestroyWorker AgsDestroyWorker; typedef struct _AgsDestroyWorkerClass AgsDestroyWorkerClass; typedef struct _AgsDestroyEntry AgsDestroyEntry; typedef void (*AgsDestroyFunc)(gpointer ptr); struct _AgsDestroyWorker { AgsWorkerThread worker_thread; struct timespec *destroy_interval; GRecMutex destroy_mutex; GList *destroy_list; }; struct _AgsDestroyWorkerClass { AgsWorkerThreadClass worker_thread; }; /** * AgsDestroyEntry: * @ptr: the entry to destroy * @destroy_func: the destroy function * * The struct to specify an entry to destroy. */ struct _AgsDestroyEntry { gpointer ptr; void (*destroy_func)(gpointer ptr); }; GType ags_destroy_worker_get_type(); AgsDestroyEntry* ags_destroy_entry_alloc(gpointer ptr, AgsDestroyFunc destroy_func); void ags_destroy_worker_add(AgsDestroyWorker *destroy_worker, gpointer ptr, AgsDestroyFunc destroy_func); AgsDestroyWorker* ags_destroy_worker_get_instance(); AgsDestroyWorker* ags_destroy_worker_new(); #endif /*__AGS_DESTROY_WORKER_H__*/ gsequencer-3.1.3/ags/thread/ags_message_queue.h0000644000175000017500000000516413607210263016462 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MESSAGE_QUEUE_H__ #define __AGS_MESSAGE_QUEUE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_MESSAGE_QUEUE (ags_message_queue_get_type()) #define AGS_MESSAGE_QUEUE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MESSAGE_QUEUE, AgsMessageQueue)) #define AGS_MESSAGE_QUEUE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_MESSAGE_QUEUE, AgsMessageQueue)) #define AGS_IS_MESSAGE_QUEUE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_MESSAGE_QUEUE)) #define AGS_IS_MESSAGE_QUEUE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_MESSAGE_QUEUE)) #define AGS_MESSAGE_QUEUE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_MESSAGE_QUEUE, AgsMessageQueueClass)) #define AGS_MESSAGE_QUEUE_GET_OBJ_MUTEX(obj) (&(((AgsMessageQueue *) obj)->obj_mutex)) typedef struct _AgsMessageQueue AgsMessageQueue; typedef struct _AgsMessageQueueClass AgsMessageQueueClass; struct _AgsMessageQueue { GObject gobject; GRecMutex obj_mutex; gchar *sender_namespace; gchar *recipient_namespace; GList *message_envelope; }; struct _AgsMessageQueueClass { GObjectClass gobject; }; GType ags_message_queue_get_type(); void ags_message_queue_add_message_envelope(AgsMessageQueue *message_queue, GObject *message_envelope); void ags_message_queue_remove_message_envelope(AgsMessageQueue *message_queue, GObject *message_envelope); GList* ags_message_queue_find_sender(AgsMessageQueue *message_queue, GObject *sender); GList* ags_message_queue_find_recipient(AgsMessageQueue *message_queue, GObject *recipient); GList* ags_message_queue_query_message(AgsMessageQueue *message_queue, gchar *xpath); AgsMessageQueue* ags_message_queue_new(gchar *sender_namespace); G_END_DECLS #endif /*__AGS_MESSAGE_QUEUE_H__*/ gsequencer-3.1.3/ags/thread/ags_worker_thread.c0000644000175000017500000002124213607210263016460 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_worker_thread_class_init(AgsWorkerThreadClass *worker_thread); void ags_worker_thread_init(AgsWorkerThread *worker_thread); void ags_worker_thread_finalize(GObject *gobject); void ags_worker_thread_start(AgsThread *thread); void ags_worker_thread_run(AgsThread *thread); void ags_worker_thread_stop(AgsThread *thread); void* ags_woker_thread_do_poll_loop(void *ptr); /** * SECTION:ags_worker_thread * @short_description: worker thread * @title: AgsWorkerThread * @section_id: * @include: ags/thread/ags_worker_thread.h * * The #AgsWorkerThread does non-realtime work. You might want * to synchronize to the run signal within your ::do_poll() method. */ enum{ DO_POLL, LAST_SIGNAL, }; static gpointer ags_worker_thread_parent_class = NULL; static guint worker_thread_signals[LAST_SIGNAL]; GType ags_worker_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_worker_thread = 0; static const GTypeInfo ags_worker_thread_info = { sizeof (AgsWorkerThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_worker_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsWorkerThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_worker_thread_init, }; ags_type_worker_thread = g_type_register_static(AGS_TYPE_THREAD, "AgsWorkerThread", &ags_worker_thread_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_worker_thread); } return g_define_type_id__volatile; } void ags_worker_thread_class_init(AgsWorkerThreadClass *worker_thread) { GObjectClass *gobject; AgsThreadClass *thread; ags_worker_thread_parent_class = g_type_class_peek_parent(worker_thread); /* GObject */ gobject = (GObjectClass *) worker_thread; gobject->finalize = ags_worker_thread_finalize; /* AgsThread */ thread = (AgsThreadClass *) worker_thread; thread->start = ags_worker_thread_start; thread->run = ags_worker_thread_run; thread->stop = ags_worker_thread_stop; /* AgsWorkerThread */ worker_thread->do_poll = NULL; /* signals */ /** * AgsWorkerThread::do-poll: * @thread: the #AgsWorkerThread * * The ::do_poll() signal runs independently of ::run() but * might be synchronized using a conditional lock. * * Since: 3.0.0 */ worker_thread_signals[DO_POLL] = g_signal_new("do-poll", G_TYPE_FROM_CLASS (thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsWorkerThreadClass, do_poll), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_worker_thread_init(AgsWorkerThread *worker_thread) { AgsThread *thread; thread = (AgsThread *) worker_thread; g_object_set(thread, "frequency", AGS_WORKER_THREAD_DEFAULT_JIFFIE, NULL); g_atomic_int_set(&(worker_thread->status_flags), 0); /* synchronization */ g_mutex_init(&(worker_thread->run_mutex)); g_cond_init(&(worker_thread->run_cond)); /* worker thread */ worker_thread->worker_thread = NULL; } void ags_worker_thread_finalize(GObject *gobject) { AgsWorkerThread *worker_thread; gboolean running; gboolean do_exit; worker_thread = AGS_WORKER_THREAD(gobject); if(worker_thread == ags_thread_self()){ do_exit = TRUE; }else{ do_exit = FALSE; } running = ags_worker_thread_test_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUNNING); /* call parent */ G_OBJECT_CLASS(ags_worker_thread_parent_class)->finalize(gobject); if(do_exit){ g_thread_exit(NULL); } } void ags_worker_thread_start(AgsThread *thread) { AgsWorkerThread *worker_thread; worker_thread = AGS_WORKER_THREAD(thread); /* */ AGS_THREAD_CLASS(ags_worker_thread_parent_class)->start(thread); ags_worker_thread_set_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUNNING); worker_thread->worker_thread = g_thread_new("Advanced Gtk+ Sequencer - worker", ags_woker_thread_do_poll_loop, worker_thread); } void ags_worker_thread_run(AgsThread *thread) { AgsWorkerThread *worker_thread; worker_thread = AGS_WORKER_THREAD(thread); /* synchronization point */ if(ags_worker_thread_test_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUN_WAIT) && !ags_worker_thread_test_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUN_DONE)){ g_mutex_lock(&(worker_thread->run_mutex)); ags_worker_thread_set_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUN_SYNC); while(ags_worker_thread_test_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUN_WAIT) && !ags_worker_thread_test_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUN_DONE)){ g_cond_wait(&(worker_thread->run_cond), &(worker_thread->run_mutex)); } ags_worker_thread_set_status_flags(worker_thread, (AGS_WORKER_THREAD_STATUS_RUN_WAIT | AGS_WORKER_THREAD_STATUS_RUN_DONE)); g_mutex_unlock(&(worker_thread->run_mutex)); } } void ags_worker_thread_stop(AgsThread *thread) { AgsWorkerThread *worker_thread; worker_thread = AGS_WORKER_THREAD(thread); ags_worker_thread_unset_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUNNING); /* call parent */ AGS_THREAD_CLASS(ags_worker_thread_parent_class)->stop(thread); } /** * ags_worker_thread_test_status_flags: * @worker_thread: the #AgsWorkerThread * @status_flags: status flags * * Test @status_flags of @worker_thread. * * Returns: %TRUE if status flags set, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_worker_thread_test_status_flags(AgsWorkerThread *worker_thread, guint status_flags) { gboolean retval; if(!AGS_IS_WORKER_THREAD(worker_thread)){ return(FALSE); } retval = ((status_flags & (g_atomic_int_get(&(worker_thread->status_flags)))) != 0) ? TRUE: FALSE; return(retval); } /** * ags_worker_thread_set_status_flags: * @worker_thread: the #AgsWorkerThread * @status_flags: status flags * * Set status flags. * * Since: 3.0.0 */ void ags_worker_thread_set_status_flags(AgsWorkerThread *worker_thread, guint status_flags) { if(!AGS_IS_WORKER_THREAD(worker_thread)){ return; } g_atomic_int_or(&(worker_thread->status_flags), status_flags); } /** * ags_worker_thread_unset_status_flags: * @worker_thread: the #AgsWorkerThread * @status_flags: status flags * * Unset status flags. * * Since: 3.0.0 */ void ags_worker_thread_unset_status_flags(AgsWorkerThread *worker_thread, guint status_flags) { if(!AGS_IS_WORKER_THREAD(worker_thread)){ return; } g_atomic_int_and(&(worker_thread->status_flags), (~status_flags)); } /** * ags_woker_thread_do_poll_loop: * @ptr: the #AgsWorkerThread * * Do loop and invoke ags_worker_thread_do_poll() unless flag * AGS_WORKER_THREAD_RUNNING was unset. * * Since: 3.0.0 */ void* ags_woker_thread_do_poll_loop(void *ptr) { AgsWorkerThread *worker_thread; worker_thread = (AgsWorkerThread *) ptr; while(ags_worker_thread_test_status_flags(worker_thread, AGS_WORKER_THREAD_STATUS_RUNNING)){ ags_worker_thread_do_poll(worker_thread); } g_thread_exit(NULL); return(NULL); } /** * ags_worker_thread_do_poll: * @worker_thread: the #AgsWorkerThread * * Do poll your work. It is called of the worker thread. * * Since: 3.0.0 */ void ags_worker_thread_do_poll(AgsWorkerThread *worker_thread) { g_return_if_fail(AGS_IS_WORKER_THREAD(worker_thread)); g_object_ref(worker_thread); g_signal_emit(worker_thread, worker_thread_signals[DO_POLL], 0); g_object_unref(worker_thread); } /** * ags_worker_thread_new: * * Create a new instance of #AgsWorkerThread. * * Returns: the new #AgsWorkerThread * * Since: 3.0.0 */ AgsWorkerThread* ags_worker_thread_new() { AgsWorkerThread *worker_thread; worker_thread = (AgsWorkerThread *) g_object_new(AGS_TYPE_WORKER_THREAD, NULL); return(worker_thread); } gsequencer-3.1.3/ags/thread/ags_thread.c0000644000175000017500000017620113613101102015061 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_thread_class_init(AgsThreadClass *thread); void ags_thread_connectable_interface_init(AgsConnectableInterface *connectable); void ags_thread_init(AgsThread *thread); void ags_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_thread_finalize(GObject *gobject); AgsUUID* ags_thread_get_uuid(AgsConnectable *connectable); gboolean ags_thread_has_resource(AgsConnectable *connectable); gboolean ags_thread_is_ready(AgsConnectable *connectable); void ags_thread_add_to_registry(AgsConnectable *connectable); void ags_thread_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_thread_list_resource(AgsConnectable *connectable); xmlNode* ags_thread_xml_compose(AgsConnectable *connectable); void ags_thread_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_thread_is_connected(AgsConnectable *connectable); void ags_thread_connect(AgsConnectable *connectable); void ags_thread_disconnect(AgsConnectable *connectable); guint ags_thread_real_clock(AgsThread *thread); void ags_thread_real_start(AgsThread *thread); void ags_thread_real_stop(AgsThread *thread); void* ags_thread_loop(void *ptr); /** * SECTION:ags_thread * @short_description: threads * @title: AgsThread * @section_id: * @include: ags/thread/ags_thread.h * * The #AgsThread base class. It supports organizing them within a tree, * perform syncing and frequencies. */ enum{ PROP_0, PROP_FREQUENCY, PROP_MAX_PRECISION, PROP_DELAY, }; enum{ CLOCK, START, RUN, STOP, LAST_SIGNAL, }; static gpointer ags_thread_parent_class = NULL; static guint thread_signals[LAST_SIGNAL]; static GPrivate ags_thread_key; static gboolean ags_thread_global_use_sync_counter = TRUE; GType ags_thread_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_thread = 0; const GTypeInfo ags_thread_info = { sizeof (AgsThreadClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_thread_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsThread), 0, /* n_preallocs */ (GInstanceInitFunc) ags_thread_init, }; const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_thread_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_thread = g_type_register_static(G_TYPE_OBJECT, "AgsThread", &ags_thread_info, 0); g_type_add_interface_static(ags_type_thread, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_thread); } return g_define_type_id__volatile; } void ags_thread_class_init(AgsThreadClass *thread) { GObjectClass *gobject; GParamSpec *param_spec; ags_thread_parent_class = g_type_class_peek_parent(thread); /* GObject */ gobject = (GObjectClass *) thread; gobject->set_property = ags_thread_set_property; gobject->get_property = ags_thread_get_property; gobject->finalize = ags_thread_finalize; /* properties */ /** * AgsThread:frequency: * * The frequency to run at in Hz. * * Since: 3.0.0 */ param_spec = g_param_spec_double("frequency", i18n_pspec("frequency as JIFFIE"), i18n_pspec("frequency as JIFFIE"), 0.01, AGS_THREAD_DEFAULT_MAX_PRECISION, AGS_THREAD_DEFAULT_JIFFIE, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FREQUENCY, param_spec); /** * AgsThread:max-precision: * * The max-frequency to run at in Hz. * * Since: 3.0.0 */ param_spec = g_param_spec_double("max-precision", i18n_pspec("max precision as JIFFIE"), i18n_pspec("The max precision as JIFFIE"), 0.01, AGS_THREAD_MAX_PRECISION, AGS_THREAD_DEFAULT_MAX_PRECISION, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAX_PRECISION, param_spec); /** * AgsThread:delay: * * The delay until next tic. * * Since: 3.0.0 */ param_spec = g_param_spec_double("delay", i18n_pspec("delay"), i18n_pspec("The delay until next tic"), 1.0, AGS_THREAD_DEFAULT_MAX_PRECISION, 1.0, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DELAY, param_spec); /* AgsThread */ thread->clock = ags_thread_real_clock; thread->start = ags_thread_real_start; thread->run = NULL; thread->stop = ags_thread_real_stop; /* signals */ /** * AgsThread::clock: * @thread: the #AgsThread * * The ::clock() signal is invoked every thread tic. * * Returns: the number of cycles to perform * * Since: 3.0.0 */ thread_signals[CLOCK] = g_signal_new("clock", G_TYPE_FROM_CLASS (thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsThreadClass, clock), NULL, NULL, ags_cclosure_marshal_UINT__VOID, G_TYPE_UINT, 0); /** * AgsThread::start: * @thread: the #AgsThread * * The ::start() signal is invoked as thread started. * * Since: 3.0.0 */ thread_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS (thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsThreadClass, start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsThread::run: * @thread: the #AgsThread * * The ::run() signal is invoked during run loop. * * Since: 3.0.0 */ thread_signals[RUN] = g_signal_new("run", G_TYPE_FROM_CLASS (thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsThreadClass, run), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsThread::stop: * @thread: the #AgsThread * * The ::stop() signal is invoked as @thread stopped. * * Since: 3.0.0 */ thread_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS (thread), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsThreadClass, stop), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_thread_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_thread_get_uuid; connectable->has_resource = ags_thread_has_resource; connectable->is_ready = ags_thread_is_ready; connectable->add_to_registry = ags_thread_add_to_registry; connectable->remove_from_registry = ags_thread_remove_from_registry; connectable->list_resource = ags_thread_list_resource; connectable->xml_compose = ags_thread_xml_compose; connectable->xml_parse = ags_thread_xml_parse; connectable->is_connected = ags_thread_is_connected; connectable->connect = ags_thread_connect; connectable->disconnect = ags_thread_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_thread_init(AgsThread *thread) { AgsConfig *config; gchar *str; int err; config = ags_config_get_instance(); /* the obj mutex */ g_rec_mutex_init(&(thread->obj_mutex)); /* flags and status flags */ thread->my_flags = 0; g_atomic_int_set(&(thread->status_flags), 0); g_atomic_int_set(&(thread->sync_tic_flags), 0); /* uuid */ thread->uuid = ags_uuid_alloc(); ags_uuid_generate(thread->uuid); /* clock */ g_atomic_int_set(&(thread->current_sync_tic), 0); thread->delay = 1.0; thread->tic_delay = 0.0; thread->frequency = AGS_THREAD_DEFAULT_JIFFIE; thread->max_precision = AGS_THREAD_DEFAULT_MAX_PRECISION; /* max precision */ str = ags_config_get_value(config, AGS_CONFIG_THREAD, "max-precision"); if(str != NULL){ thread->max_precision = g_ascii_strtod(str, NULL); g_free(str); } /* the wait mutex and cond */ g_mutex_init(&(thread->wait_mutex)); g_cond_init(&(thread->wait_cond)); /* thread, tic mutex and cond */ thread->thread = NULL; g_mutex_init(&(thread->tic_mutex)); g_cond_init(&(thread->tic_cond)); /* start notify */ thread->start_queue = NULL; g_mutex_init(&(thread->start_mutex)); g_cond_init(&(thread->start_cond)); /* tree */ thread->parent = NULL; thread->next = NULL; thread->prev = NULL; thread->children = NULL; } void ags_thread_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsThread *thread; GRecMutex *thread_mutex; thread = AGS_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); switch(prop_id){ case PROP_FREQUENCY: { gdouble frequency; frequency = g_value_get_double(value); ags_thread_set_frequency(thread, frequency); } break; case PROP_MAX_PRECISION: { gdouble max_precision; max_precision = g_value_get_double(value); ags_thread_set_max_precision(thread, max_precision); } break; case PROP_DELAY: { gdouble delay; delay = g_value_get_double(value); ags_thread_set_delay(thread, delay); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_thread_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsThread *thread; GRecMutex *thread_mutex; thread = AGS_THREAD(gobject); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); switch(prop_id){ case PROP_FREQUENCY: { g_rec_mutex_lock(thread_mutex); g_value_set_double(value, thread->frequency); g_rec_mutex_unlock(thread_mutex); } break; case PROP_MAX_PRECISION: { g_rec_mutex_lock(thread_mutex); g_value_set_double(value, thread->max_precision); g_rec_mutex_unlock(thread_mutex); } break; case PROP_DELAY: { g_rec_mutex_lock(thread_mutex); g_value_set_double(value, thread->delay); g_rec_mutex_unlock(thread_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_thread_finalize(GObject *gobject) { AgsThread *thread, *parent; GThread *thread_ptr; gboolean running; gboolean do_exit; thread = AGS_THREAD(gobject); #ifdef AGS_DEBUG g_message("fin"); #endif if(thread == ags_thread_self()){ do_exit = TRUE; }else{ do_exit = FALSE; } thread_ptr = thread->thread; running = ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING); #ifdef AGS_DEBUG g_message("fin %s", G_OBJECT_TYPE_NAME(gobject)); #endif //FIXME:JK: may dead-lock g_list_free(thread->start_queue); if((parent = thread->parent) != NULL){ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(parent)); parent->start_queue = g_list_remove(parent->start_queue, thread); g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(parent)); ags_thread_remove_child(parent, thread); } /* UUID */ ags_uuid_free(thread->uuid); /* call parent */ G_OBJECT_CLASS(ags_thread_parent_class)->finalize(gobject); if(do_exit){ g_thread_exit(NULL); } } AgsUUID* ags_thread_get_uuid(AgsConnectable *connectable) { AgsThread *thread; AgsUUID *ptr; GRecMutex *thread_mutex; thread = AGS_THREAD(connectable); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* get UUID */ g_rec_mutex_lock(thread_mutex); ptr = thread->uuid; g_rec_mutex_unlock(thread_mutex); return(ptr); } gboolean ags_thread_has_resource(AgsConnectable *connectable) { return(FALSE); } gboolean ags_thread_is_ready(AgsConnectable *connectable) { AgsThread *thread; gboolean is_ready; thread = AGS_THREAD(connectable); /* check is added */ is_ready = ags_thread_test_flags(thread, AGS_THREAD_ADDED_TO_REGISTRY); return(is_ready); } void ags_thread_add_to_registry(AgsConnectable *connectable) { AgsThread *thread; if(ags_connectable_is_ready(connectable)){ return; } thread = AGS_THREAD(connectable); ags_thread_set_flags(thread, AGS_THREAD_ADDED_TO_REGISTRY); } void ags_thread_remove_from_registry(AgsConnectable *connectable) { if(!ags_connectable_is_ready(connectable)){ return; } //TODO:JK: implement me } xmlNode* ags_thread_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_thread_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_thread_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_thread_is_connected(AgsConnectable *connectable) { AgsThread *thread; gboolean is_connected; thread = AGS_THREAD(connectable); /* check is connected */ is_connected = ags_thread_test_flags(thread, AGS_THREAD_CONNECTED); return(is_connected); } void ags_thread_connect(AgsConnectable *connectable) { AgsThread *thread; AgsThread *children, *current_child, *next_child; if(ags_connectable_is_connected(connectable)){ return; } thread = AGS_THREAD(connectable); ags_thread_set_flags(thread, AGS_THREAD_CONNECTED); /* recursive connect */ children = ags_thread_children(thread); if(children != NULL){ current_child = children; g_object_ref(current_child); while(current_child != NULL){ ags_connectable_connect(AGS_CONNECTABLE(current_child)); /* iterate */ next_child = ags_thread_next(current_child); g_object_unref(current_child); current_child = next_child; } g_object_unref(children); } } void ags_thread_disconnect(AgsConnectable *connectable) { AgsThread *thread; AgsThread *children, *current_child, *next_child; if(!ags_connectable_is_connected(connectable)){ return; } thread = AGS_THREAD(connectable); ags_thread_unset_flags(thread, AGS_THREAD_CONNECTED); /* recursive connect */ children = ags_thread_children(thread); if(children != NULL){ current_child = children; g_object_ref(current_child); while(current_child != NULL){ ags_connectable_disconnect(AGS_CONNECTABLE(current_child)); /* iterate */ next_child = ags_thread_next(current_child); g_object_unref(current_child); current_child = next_child; } g_object_unref(children); } } /** * ags_thread_global_get_use_sync_counter: * * Get global config value use sync counter. * * Returns: if %TRUE use sync counter, else not * * Since: 3.0.0 */ gboolean ags_thread_global_get_use_sync_counter() { gboolean use_sync_counter; // g_rec_mutex_lock(ags_thread_get_class_mutex()); use_sync_counter = ags_thread_global_use_sync_counter; // g_rec_mutex_unlock(ags_thread_get_class_mutex()); return(use_sync_counter); } /** * ags_thread_test_flags: * @thread: the #AgsThread * @flags: the flags * * Test @flags to be set on @thread. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_thread_test_flags(AgsThread *thread, guint flags) { gboolean retval; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(FALSE); } /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* test flags */ g_rec_mutex_lock(thread_mutex); retval = ((flags & (thread->my_flags)) != 0) ? TRUE: FALSE; g_rec_mutex_unlock(thread_mutex); return(retval); } /** * ags_thread_set_flags: * @thread: the #AgsThread * @flags: the flags * * Set flags. * * Since: 3.0.0 */ void ags_thread_set_flags(AgsThread *thread, guint flags) { GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return; } /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* set flags */ g_rec_mutex_lock(thread_mutex); thread->my_flags |= flags; g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_unset_flags: * @thread: the #AgsThread * @flags: the flags * * Unset flags. * * Since: 3.0.0 */ void ags_thread_unset_flags(AgsThread *thread, guint flags) { GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return; } /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* set flags */ g_rec_mutex_lock(thread_mutex); thread->my_flags &= (~flags); g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_test_status_flags: * @thread: the #AgsThread * @status_flags: the status flags * * Test @status_flags to be set on @thread. * * Returns: %TRUE if status flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_thread_test_status_flags(AgsThread *thread, guint status_flags) { gboolean retval; if(!AGS_IS_THREAD(thread)){ return(FALSE); } retval = ((status_flags & (g_atomic_int_get(&(thread->status_flags)))) != 0) ? TRUE: FALSE; return(retval); } /** * ags_thread_set_status_flags: * @thread: the #AgsThread * @status_flags: the status flags * * Set status flags. * * Since: 3.0.0 */ void ags_thread_set_status_flags(AgsThread *thread, guint status_flags) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_or(&(thread->status_flags), status_flags); } /** * ags_thread_unset_status_flags: * @thread: the #AgsThread * @status_flags: the status flags * * Unset status flags. * * Since: 3.0.0 */ void ags_thread_unset_status_flags(AgsThread *thread, guint status_flags) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_and(&(thread->status_flags), (~status_flags)); } /** * ags_thread_clear_status_flags: * @thread: the #AgsThread * * Clear status flags. * * Since: 3.0.0 */ void ags_thread_clear_status_flags(AgsThread *thread) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_set(&(thread->status_flags), 0); } /** * ags_thread_test_sync_tic_flags: * @thread: the #AgsThread * @sync_tic_flags: the sync-tic flags * * Test @sync_tic_flags to be set on @thread. * * Returns: %TRUE if sync-tic flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_thread_test_sync_tic_flags(AgsThread *thread, guint sync_tic_flags) { gboolean retval; if(!AGS_IS_THREAD(thread)){ return(FALSE); } retval = ((sync_tic_flags & (g_atomic_int_get(&(thread->sync_tic_flags)))) != 0) ? TRUE: FALSE; return(retval); } /** * ags_thread_set_sync_tic_flags: * @thread: the #AgsThread * @sync_tic_flags: the sync-tic flags * * Set sync-tic flags. * * Since: 3.0.0 */ void ags_thread_set_sync_tic_flags(AgsThread *thread, guint sync_tic_flags) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_or(&(thread->sync_tic_flags), sync_tic_flags); } /** * ags_thread_unset_sync_tic_flags: * @thread: the #AgsThread * @sync_tic_flags: the sync-tic flags * * Unset sync-tic flags. * * Since: 3.0.0 */ void ags_thread_unset_sync_tic_flags(AgsThread *thread, guint sync_tic_flags) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_and(&(thread->sync_tic_flags), (~sync_tic_flags)); } /** * ags_thread_clear_sync_tic_flags: * @thread: the #AgsThread * * Clear sync-tic flags. * * Since: 3.0.0 */ void ags_thread_clear_sync_tic_flags(AgsThread *thread) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_set(&(thread->sync_tic_flags), 0); } /** * ags_thread_set_current_sync_tic: * @thread: the #AgsThread * @current_sync_tic: the current sync-tic * * Set current sync-tic. * * Since: 3.0.0 */ void ags_thread_set_current_sync_tic(AgsThread *thread, guint current_sync_tic) { if(!AGS_IS_THREAD(thread)){ return; } g_atomic_int_set(&(thread->current_sync_tic), current_sync_tic); } /** * ags_thread_get_current_sync_tic: * @thread: the #AgsThread * * Get current sync-tic. * * Returns: the current sync-tic * * Since: 3.0.0 */ guint ags_thread_get_current_sync_tic(AgsThread *thread) { guint current_sync_tic; if(!AGS_IS_THREAD(thread)){ return(G_MAXUINT); } current_sync_tic = g_atomic_int_get(&(thread->current_sync_tic)); return(current_sync_tic); } /** * ags_thread_set_delay: * @thread: the #AgsThread * @delay: the delay * * Set delay. * * Since: 3.0.0 */ void ags_thread_set_delay(AgsThread *thread, gdouble delay) { GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); thread->delay = delay; g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_get_delay: * @thread: the #AgsThread * * Get delay. * * Returns: the delay * * Since: 3.0.0 */ gdouble ags_thread_get_delay(AgsThread *thread) { gdouble delay; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(0.0); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); delay = thread->delay; g_rec_mutex_unlock(thread_mutex); return(delay); } /** * ags_thread_set_frequency: * @thread: the #AgsThread * @frequency: the frequency * * Set frequency. * * Since: 3.0.0 */ void ags_thread_set_frequency(AgsThread *thread, gdouble frequency) { GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); if(frequency == thread->frequency){ g_rec_mutex_unlock(thread_mutex); return; } thread->frequency = frequency; thread->delay = (guint) ceil((AGS_THREAD_HERTZ_JIFFIE / thread->frequency) / (AGS_THREAD_HERTZ_JIFFIE / thread->max_precision)); thread->tic_delay = 0.0; if(ags_thread_test_flags(thread, AGS_THREAD_INTERMEDIATE_POST_SYNC)){ thread->tic_delay = thread->delay; }else if(ags_thread_test_flags(thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC)){ thread->tic_delay = 1.0; }else{ thread->tic_delay = 0.0; } g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_get_frequency: * @thread: the #AgsThread * * Get frequency. * * Returns: the frequency * * Since: 3.0.0 */ gdouble ags_thread_get_frequency(AgsThread *thread) { gdouble frequency; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(-1.0); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); frequency = thread->frequency; g_rec_mutex_unlock(thread_mutex); return(frequency); } /** * ags_thread_set_max_precision: * @thread: the #AgsThread * @max_precision: the max-precision * * Set max-precision. * * Since: 3.0.0 */ void ags_thread_set_max_precision(AgsThread *thread, gdouble max_precision) { gdouble old_max_precision; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return; } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); old_max_precision = thread->max_precision; if(max_precision == old_max_precision){ g_rec_mutex_unlock(thread_mutex); return; } thread->max_precision = max_precision; thread->frequency = thread->frequency / old_max_precision * max_precision; thread->delay = (AGS_THREAD_HERTZ_JIFFIE / thread->frequency) / (AGS_THREAD_HERTZ_JIFFIE / thread->max_precision); thread->tic_delay = 0.0; if(ags_thread_test_flags(thread, AGS_THREAD_INTERMEDIATE_POST_SYNC)){ thread->tic_delay = floor(thread->delay); // thread->delay; }else if(ags_thread_test_flags(thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC)){ thread->tic_delay = 1.0; }else{ thread->tic_delay = 0.0; } g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_get_max_precision: * @thread: the #AgsThread * * Get max-precision. * * Returns: the max-precision * * Since: 3.0.0 */ gdouble ags_thread_get_max_precision(AgsThread *thread) { gdouble max_precision; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(-1.0); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); max_precision = thread->max_precision; g_rec_mutex_unlock(thread_mutex); return(max_precision); } /** * ags_thread_parent: * @thread: the #AgsThread * * Get parent thread. * * Returns: (transfer full): the parent #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_parent(AgsThread *thread) { AgsThread *parent; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(NULL); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); parent = thread->parent; g_rec_mutex_unlock(thread_mutex); if(parent != NULL){ g_object_ref(parent); } return(parent); } /** * ags_thread_next: * @thread: the #AgsThread * * Get next thread. * * Returns: (transfer full): the next #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_next(AgsThread *thread) { AgsThread *next; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(NULL); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); next = thread->next; if(next != NULL){ g_object_ref(next); } g_rec_mutex_unlock(thread_mutex); return(next); } /** * ags_thread_prev: * @thread: the #AgsThread * * Get prev thread. * * Returns: (transfer full): the prev #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_prev(AgsThread *thread) { AgsThread *prev; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(NULL); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); prev = thread->prev; if(prev != NULL){ g_object_ref(prev); } g_rec_mutex_unlock(thread_mutex); return(prev); } /** * ags_thread_children: * @thread: the #AgsThread * * Get children thread. * * Returns: (transfer full): the children #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_children(AgsThread *thread) { AgsThread *children; GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread)){ return(NULL); } thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); g_rec_mutex_lock(thread_mutex); children = thread->children; if(children != NULL){ g_object_ref(children); } g_rec_mutex_unlock(thread_mutex); return(children); } /** * ags_thread_get_toplevel: * @thread: the #AgsThread * * Retrieve toplevel thread. * * Returns: (transfer full): the toplevevel #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_get_toplevel(AgsThread *thread) { AgsThread *current, *current_parent; if(!AGS_IS_THREAD(thread)){ return(NULL); } current = thread; g_object_ref(current); while((current_parent = ags_thread_parent(current)) != NULL){ /* iterate */ g_object_unref(current); current = current_parent; } return(current); } /** * ags_thread_first: * @thread: the #AgsThread * * Retrieve first sibling. * * Returns: (transfer full): the very first #AgsThread within same tree level * * Since: 3.0.0 */ AgsThread* ags_thread_first(AgsThread *thread) { AgsThread *current, *current_prev; if(!AGS_IS_THREAD(thread)){ return(NULL); } current = thread; g_object_ref(current); while((current_prev = ags_thread_prev(current)) != NULL){ /* iterate */ g_object_unref(current); current = current_prev; } return(current); } /** * ags_thread_last: * @thread: the #AgsThread * * Retrieve last sibling. * * Returns: (transfer full): the very last @AgsThread within same tree level * * Since: 3.0.0 */ AgsThread* ags_thread_last(AgsThread *thread) { AgsThread *current, *current_next; if(!AGS_IS_THREAD(thread)){ return(NULL); } current = thread; g_object_ref(current); while((current_next = ags_thread_next(current)) != NULL){ /* iterate */ g_object_unref(current); current = current_next; } return(current); } /** * ags_thread_lock: * @thread: the #AgsThread * * Locks the threads own mutex and sets the appropriate flag. * * Since: 3.0.0 */ void ags_thread_lock(AgsThread *thread) { GRecMutex *mutex; if(!AGS_IS_THREAD(thread)){ return; } /* mutex */ mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* lock */ g_rec_mutex_lock(mutex); } /** * ags_thread_trylock: * @thread: the #AgsThread * * Locks the threads own mutex if available and sets the * appropriate flag and returning %TRUE. Otherwise return %FALSE * without lock. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_thread_trylock(AgsThread *thread) { GRecMutex *mutex; if(!AGS_IS_THREAD(thread)){ return(FALSE); } /* lookup mutices */ mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* lock */ if(!g_rec_mutex_trylock(mutex)){ return(FALSE); } return(TRUE); } /** * ags_thread_unlock: * @thread: the #AgsThread * * Unlocks the threads own mutex and unsets the appropriate flag. * * Since: 3.0.0 */ void ags_thread_unlock(AgsThread *thread) { GRecMutex *mutex; if(!AGS_IS_THREAD(thread)){ return; } /* mutex */ mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* unlock */ g_rec_mutex_unlock(mutex); } /** * ags_thread_remove_child: * @thread: the #AgsThread * @child: the child to remove * * Remove child of thread. * * Since: 3.0.0 */ void ags_thread_remove_child(AgsThread *thread, AgsThread *child) { AgsThread *children, *current_child, *next_child, *prev_child; gboolean found_child; if(!AGS_IS_THREAD(thread) || !AGS_IS_THREAD(child)){ return; } children = ags_thread_children(thread); if(children == NULL){ return; } current_child = children; g_object_ref(current_child); found_child = FALSE; while(current_child != NULL){ if(current_child == child){ found_child = TRUE; break; } /* iterate */ next_child = ags_thread_next(current_child); g_object_unref(current_child); current_child = next_child; } g_object_unref(children); if(found_child){ gboolean is_first, is_last; g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(child)); is_first = (child->prev == NULL) ? TRUE: FALSE; is_last = (child->next == NULL) ? TRUE: FALSE; child->parent = NULL; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(child)); if(is_first){ next_child = ags_thread_next(child); g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(thread)); thread->children = next_child; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(thread)); } next_child = ags_thread_next(child); prev_child = ags_thread_prev(child); /* reset child */ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(child)); child->next = NULL; child->prev = NULL; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(child)); if(next_child != NULL){ g_object_unref(next_child); } if(prev_child != NULL){ g_object_unref(prev_child); } /* relink */ if(next_child != NULL){ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(next_child)); next_child->prev = prev_child; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(next_child)); } if(prev_child != NULL){ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(prev_child)); prev_child->next = next_child; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(prev_child)); } g_object_unref(thread); } } /** * ags_thread_add_child: * @thread: the #AgsThread * @child: the child to remove * * Add child to thread. * * Since: 3.0.0 */ void ags_thread_add_child(AgsThread *thread, AgsThread *child) { ags_thread_add_child_extended(thread, child, FALSE, TRUE); } /** * ags_thread_add_child_extended: * @thread: the #AgsThread * @child: the child to remove * @no_start: don't start thread * @no_wait: don't wait until started * * Add child to thread. * * Since: 3.0.0 */ void ags_thread_add_child_extended(AgsThread *thread, AgsThread *child, gboolean no_start, gboolean no_wait) { AgsThread *main_loop; AgsThread *current_parent; AgsThread *children; AgsThread *last_child; GRecMutex *tree_lock; if(!AGS_IS_THREAD(thread) || !AGS_IS_THREAD(child)){ return; } /* check current parent */ current_parent = ags_thread_parent(child); if(current_parent == thread){ #if 0 if(current_parent != NULL){ g_object_unref(current_parent); } #endif return; } main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(ags_application_context_get_instance())); tree_lock = NULL; if(main_loop != NULL){ tree_lock = ags_main_loop_get_tree_lock(AGS_MAIN_LOOP(main_loop)); } if(tree_lock != NULL){ g_rec_mutex_lock(tree_lock); } if(current_parent != NULL){ g_object_unref(current_parent); } g_object_ref(thread); g_object_ref(child); g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(child)); child->parent = thread; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(child)); children = ags_thread_children(thread); if(children == NULL){ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(thread)); thread->children = child; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(thread)); }else{ last_child = ags_thread_last(children); /* next */ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(last_child)); last_child->next = child; g_object_ref(child); g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(last_child)); /* prev */ g_rec_mutex_lock(AGS_THREAD_GET_OBJ_MUTEX(child)); child->prev = last_child; g_rec_mutex_unlock(AGS_THREAD_GET_OBJ_MUTEX(child)); /* unref */ g_object_unref(children); } if(tree_lock != NULL){ g_rec_mutex_unlock(tree_lock); } if(main_loop != NULL){ g_object_unref(main_loop); } if(!no_start){ if(!ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING)){ /* start child */ ags_thread_start(child); if(!no_wait){ guint val; /* wait child */ g_mutex_lock(AGS_THREAD_GET_START_MUTEX(child)); ags_thread_set_status_flags(child, AGS_THREAD_STATUS_START_WAIT); if(ags_thread_test_status_flags(child, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(child, AGS_THREAD_STATUS_START_DONE)){ while(ags_thread_test_status_flags(child, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(child, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(AGS_THREAD_GET_START_COND(child), AGS_THREAD_GET_START_MUTEX(child)); } } g_mutex_unlock(AGS_THREAD_GET_START_MUTEX(child)); } } } } gboolean ags_thread_is_current_ready(AgsThread *current, guint current_sync_tic) { guint sync_tic; gboolean is_current_ready; if(!AGS_IS_THREAD(current)){ return(TRUE); } if((!ags_thread_test_status_flags(current, AGS_THREAD_STATUS_RUNNING) && !ags_thread_test_status_flags(current, AGS_THREAD_STATUS_READY)) || ags_thread_test_status_flags(current, AGS_THREAD_STATUS_IS_CHAOS_TREE)){ return(TRUE); } is_current_ready = TRUE; /* check current sync tic */ sync_tic = ags_thread_get_current_sync_tic(current); if(current_sync_tic == sync_tic){ if(!ags_thread_test_status_flags(current, AGS_THREAD_STATUS_WAITING)){ is_current_ready = FALSE; } } return(is_current_ready); } gboolean ags_thread_is_tree_ready_recursive(AgsThread *thread, guint current_sync_tic) { AgsThread *child, *next_child; gboolean is_tree_ready; if(!AGS_IS_THREAD(thread)){ return(TRUE); } is_tree_ready = ags_thread_is_current_ready(thread, current_sync_tic); if(!is_tree_ready){ return(FALSE); } /* set tree sync recursive */ child = ags_thread_children(thread); while(child != NULL){ is_tree_ready = ags_thread_is_tree_ready_recursive(child, current_sync_tic); if(!is_tree_ready){ g_object_unref(child); return(FALSE); } /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } return(TRUE); } void ags_thread_prepare_current_sync(AgsThread *current, guint current_sync_tic) { if(!AGS_IS_THREAD(current)){ return; } /* get current mutex */ if((!ags_thread_test_status_flags(current, AGS_THREAD_STATUS_RUNNING) && !ags_thread_test_status_flags(current, AGS_THREAD_STATUS_READY)) || ags_thread_test_status_flags(current, AGS_THREAD_STATUS_IS_CHAOS_TREE)){ return; } if(ags_thread_get_current_sync_tic(current) != current_sync_tic){ g_critical("out-of-sync - main sync-tic != current sync-tic"); return; } ags_thread_set_status_flags(current, AGS_THREAD_STATUS_SYNCED); } void ags_thread_prepare_tree_sync_recursive(AgsThread *thread, guint current_sync_tic) { AgsThread *child, *next_child; if(!AGS_IS_THREAD(thread)){ return; } ags_thread_prepare_current_sync(thread, current_sync_tic); /* set tree sync recursive */ child = ags_thread_children(thread); while(child != NULL){ ags_thread_prepare_tree_sync_recursive(child, current_sync_tic); /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } } void ags_thread_set_current_sync(AgsThread *current, guint current_sync_tic) { guint next_current_sync_tic; guint sync_tic_wait, sync_tic_done; GMutex *wait_mutex; GCond *wait_cond; if(!AGS_IS_THREAD(current)){ return; } /* get current mutex */ if((!ags_thread_test_status_flags(current, AGS_THREAD_STATUS_RUNNING) && !ags_thread_test_status_flags(current, AGS_THREAD_STATUS_READY)) || ags_thread_test_status_flags(current, AGS_THREAD_STATUS_IS_CHAOS_TREE)){ return; } if(ags_thread_get_current_sync_tic(current) != current_sync_tic){ g_critical("out-of-sync - main sync-tic != current sync-tic"); return; } wait_mutex = AGS_THREAD_GET_WAIT_MUTEX(current); wait_cond = AGS_THREAD_GET_WAIT_COND(current); next_current_sync_tic = G_MAXUINT; sync_tic_wait = 0; sync_tic_done = 0; switch(current_sync_tic){ case 0: { next_current_sync_tic = 1; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_0; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_0; } break; case 1: { next_current_sync_tic = 2; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_1; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_1; } break; case 2: { next_current_sync_tic = 3; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_2; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_2; } break; case 3: { next_current_sync_tic = 4; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_3; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_3; } break; case 4: { next_current_sync_tic = 5; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_4; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_4; } break; case 5: { next_current_sync_tic = 6; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_5; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_5; } break; case 6: { next_current_sync_tic = 7; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_6; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_6; } break; case 7: { next_current_sync_tic = 8; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_7; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_7; } break; case 8: { next_current_sync_tic = 0; sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_8; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_8; } break; default: g_critical("invalid current sync-tic"); } ags_thread_unset_status_flags(current, AGS_THREAD_STATUS_WAITING); /* apply next current sync tic */ ags_thread_set_current_sync_tic(current, next_current_sync_tic); g_mutex_lock(wait_mutex); ags_thread_set_sync_tic_flags(current, sync_tic_done); if(ags_thread_test_sync_tic_flags(current, sync_tic_wait)){ g_cond_signal(wait_cond); } g_mutex_unlock(wait_mutex); } void ags_thread_set_tree_sync_recursive(AgsThread *thread, guint current_sync_tic) { AgsThread *child, *next_child; if(!AGS_IS_THREAD(thread)){ return; } ags_thread_set_current_sync(thread, current_sync_tic); /* set tree sync recursive */ child = ags_thread_children(thread); while(child != NULL){ ags_thread_set_tree_sync_recursive(child, current_sync_tic); /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } } guint ags_thread_real_clock(AgsThread *thread) { AgsThread *main_loop; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; guint main_sync_tic, current_sync_tic, next_main_sync_tic; gdouble next_tic_delay, prev_tic_delay; guint sync_tic_wait, sync_tic_done; guint next_sync_tic_wait, next_sync_tic_done; guint clocked_steps; gboolean initial_sync; GRecMutex *thread_mutex; GRecMutex *main_loop_mutex; GRecMutex *tree_mutex; GMutex *thread_start_mutex; GCond *thread_start_cond; GMutex *wait_mutex; GCond *wait_cond; application_context = ags_application_context_get_instance(); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* get main loop */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); main_loop_mutex = AGS_THREAD_GET_OBJ_MUTEX(main_loop); tree_mutex = ags_main_loop_get_tree_lock(AGS_MAIN_LOOP(main_loop)); /* wait */ wait_mutex = AGS_THREAD_GET_WAIT_MUTEX(thread); wait_cond = AGS_THREAD_GET_WAIT_COND(thread); /* check initial sync */ initial_sync = FALSE; if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_INITIAL_SYNC)){ initial_sync = TRUE; while(ags_main_loop_is_critical_region(AGS_MAIN_LOOP(main_loop))){ #if !defined(AGS_WITH_RT) g_usleep(4); #endif } /* increment queued critical region */ ags_main_loop_inc_queued_critical_region(AGS_MAIN_LOOP(main_loop)); } thread_start_mutex = AGS_THREAD_GET_START_MUTEX(thread); thread_start_cond = AGS_THREAD_GET_START_COND(thread); /* notify start */ g_mutex_lock(thread_start_mutex); ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_START_DONE); if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_START_WAIT)){ ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_START_WAIT); g_cond_broadcast(thread_start_cond); } g_mutex_unlock(thread_start_mutex); g_rec_mutex_lock(tree_mutex); if(thread == main_loop){ while(ags_main_loop_test_queued_critical_region(AGS_MAIN_LOOP(main_loop)) != 0){ g_rec_mutex_unlock(tree_mutex); g_rec_mutex_lock(tree_mutex); } ags_main_loop_set_critical_region(AGS_MAIN_LOOP(main_loop), TRUE); } if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_IS_CHAOS_TREE)){ while(ags_main_loop_is_syncing(AGS_MAIN_LOOP(main_loop))){ g_rec_mutex_unlock(tree_mutex); #if !defined(AGS_WITH_RT) g_usleep(4); #endif g_rec_mutex_lock(tree_mutex); } ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_IS_CHAOS_TREE); } /* sync tic */ main_sync_tic = ags_thread_get_current_sync_tic(main_loop); current_sync_tic = ags_thread_get_current_sync_tic(thread); if(initial_sync){ current_sync_tic = main_sync_tic; ags_thread_set_current_sync_tic(thread, main_sync_tic); } sync_tic_wait = 0; sync_tic_done = 0; switch(current_sync_tic){ case 0: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_0; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_0; } break; case 1: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_1; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_1; } break; case 2: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_2; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_2; } break; case 3: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_3; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_3; } break; case 4: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_4; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_4; } break; case 5: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_5; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_5; } break; case 6: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_6; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_6; } break; case 7: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_7; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_7; } break; case 8: { sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_8; sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_8; } break; default: g_critical("invalid current sync-tic"); } next_main_sync_tic = G_MAXUINT; next_sync_tic_wait = 0; next_sync_tic_done = 0; switch(main_sync_tic){ case 0: { next_main_sync_tic = 1; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_1; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_1; } break; case 1: { next_main_sync_tic = 2; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_2; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_2; } break; case 2: { next_main_sync_tic = 3; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_3; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_3; } break; case 3: { next_main_sync_tic = 4; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_4; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_4; } break; case 4: { next_main_sync_tic = 5; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_5; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_5; } break; case 5: { next_main_sync_tic = 6; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_6; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_6; } break; case 6: { next_main_sync_tic = 7; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_7; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_7; } break; case 7: { next_main_sync_tic = 8; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_8; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_8; } break; case 8: { next_main_sync_tic = 0; next_sync_tic_wait = AGS_THREAD_SYNC_TIC_WAIT_0; next_sync_tic_done = AGS_THREAD_SYNC_TIC_DONE_0; } break; default: g_critical("invalid main sync-tic"); } /* do initial sync */ if(initial_sync){ gdouble main_delay; gdouble main_tic_delay, next_main_tic_delay, prev_main_tic_delay; g_rec_mutex_lock(main_loop_mutex); main_delay = main_loop->delay; main_tic_delay = main_loop->tic_delay; g_rec_mutex_unlock(main_loop_mutex); if(main_tic_delay + 1.0 < main_delay){ next_main_tic_delay = main_tic_delay + 1.0; }else{ next_main_tic_delay = 0.0; //(main_tic_delay + 1.0) - floor(main_delay); // (main_tic_delay + 1.0) - main_delay; } if(main_tic_delay - 1.0 > 0.0){ prev_main_tic_delay = main_tic_delay - 1.0; }else{ prev_main_tic_delay = main_delay - 1.0; // (floor(main_delay) + 1.0) - (floor(main_delay) + main_tic_delay); // (main_delay + 1.0) - (main_delay + main_tic_delay); } ags_thread_set_sync_tic_flags(thread, sync_tic_wait); ags_thread_unset_sync_tic_flags(thread, sync_tic_done); /* mark synced */ if(ags_thread_test_flags(thread, AGS_THREAD_IMMEDIATE_SYNC)){ thread->tic_delay = main_tic_delay; }else if(ags_thread_test_flags(thread, AGS_THREAD_INTERMEDIATE_PRE_SYNC)){ thread->tic_delay = next_main_tic_delay; }else if(ags_thread_test_flags(thread, AGS_THREAD_INTERMEDIATE_POST_SYNC)){ thread->tic_delay = prev_main_tic_delay; }else{ thread->tic_delay = 0.0; } ags_thread_set_flags(thread, AGS_THREAD_MARK_SYNCED); ags_thread_set_status_flags(thread, (AGS_THREAD_STATUS_SYNCED_FREQ)); /* unset status flags */ ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_INITIAL_SYNC); /* decrement queued critical region */ ags_main_loop_dec_queued_critical_region(AGS_MAIN_LOOP(main_loop)); } /* synchronize */ ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_WAITING); if(current_sync_tic != main_sync_tic || !ags_thread_is_tree_ready_recursive(main_loop, current_sync_tic)){ gboolean unlock_tree; unlock_tree = TRUE; g_mutex_lock(wait_mutex); if(ags_thread_test_sync_tic_flags(thread, sync_tic_wait) && !ags_thread_test_sync_tic_flags(thread, sync_tic_done)){ ags_thread_set_sync_tic_flags(thread, sync_tic_wait); while(ags_thread_test_sync_tic_flags(thread, sync_tic_wait) && !ags_thread_test_sync_tic_flags(thread, sync_tic_done)){ if(unlock_tree){ unlock_tree = FALSE; g_rec_mutex_unlock(tree_mutex); } g_cond_wait(wait_cond, wait_mutex); } } ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_WAITING); if(unlock_tree){ unlock_tree = FALSE; g_rec_mutex_unlock(tree_mutex); } ags_thread_unset_sync_tic_flags(thread, sync_tic_wait); ags_thread_unset_sync_tic_flags(thread, sync_tic_done); ags_thread_set_sync_tic_flags(thread, next_sync_tic_wait); ags_thread_unset_sync_tic_flags(thread, next_sync_tic_done); g_mutex_unlock(wait_mutex); }else{ ags_main_loop_set_syncing(AGS_MAIN_LOOP(main_loop), TRUE); ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_WAITING); /* get task launcher */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); /* run task launcher */ ags_task_launcher_sync_run(task_launcher); /* signal */ #if 1 if(main_sync_tic == current_sync_tic){ }else{ g_critical("out-of-sync - main sync-tic != current sync-tic"); } ags_thread_prepare_tree_sync_recursive(main_loop, main_sync_tic); ags_thread_set_tree_sync_recursive(main_loop, main_sync_tic); #else ags_thread_prepare_tree_sync_recursive(main_loop, main_sync_tic); ags_thread_set_tree_sync_recursive(main_loop, main_sync_tic); #endif ags_main_loop_set_syncing(AGS_MAIN_LOOP(main_loop), FALSE); ags_thread_unset_sync_tic_flags(thread, sync_tic_wait); ags_thread_unset_sync_tic_flags(thread, sync_tic_done); ags_thread_set_sync_tic_flags(thread, next_sync_tic_wait); ags_thread_unset_sync_tic_flags(thread, next_sync_tic_done); g_rec_mutex_unlock(tree_mutex); } /* get task launcher */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); g_mutex_lock(&(task_launcher->wait_mutex)); if(g_atomic_int_get(&(task_launcher->is_running))){ g_atomic_int_inc(&(task_launcher->wait_count)); while(g_atomic_int_get(&(task_launcher->is_running)) && g_atomic_int_get(&(task_launcher->wait_count)) != 0){ g_cond_wait(&(task_launcher->wait_cond), &(task_launcher->wait_mutex)); } } g_mutex_unlock(&(task_launcher->wait_mutex)); /* compute clocked steps */ clocked_steps = 0; g_rec_mutex_lock(thread_mutex); if(thread->delay >= 1.0){ thread->tic_delay += 1.0; if(thread->tic_delay >= thread->delay){ clocked_steps = 1; thread->tic_delay = 0.0; // thread->delay; } if(initial_sync){ /* prepare initial run */ ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_INITIAL_RUN); } }else{ clocked_steps = (guint) floor((1.0 + thread->tic_delay) / thread->delay); thread->tic_delay = 0.0; // (1.0 / thread->delay) - floor(1.0 / thread->delay); } g_rec_mutex_unlock(thread_mutex); if(thread == main_loop){ ags_main_loop_set_critical_region(AGS_MAIN_LOOP(main_loop), FALSE); } return(clocked_steps); } /** * ags_thread_clock: * @thread: the #AgsThread instance * * Clock the thread. * * Returns: the cycles to be performed * * Since: 3.0.0 */ guint ags_thread_clock(AgsThread *thread) { guint cycles; g_return_val_if_fail(AGS_IS_THREAD(thread), 0); g_object_ref(thread); g_signal_emit(thread, thread_signals[CLOCK], 0, &cycles); g_object_unref(thread); return(cycles); } void* ags_thread_loop(void *ptr) { AgsThread *main_loop; AgsThread *thread; AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GList *start_start_queue, *start_queue; guint main_sync_tic, current_sync_tic; guint i, i_stop; GRecMutex *tree_mutex; GRecMutex *thread_mutex; thread = (AgsThread *) ptr; application_context = ags_application_context_get_instance(); /* set private for ags_thread_self() */ g_object_ref(thread); g_private_set(&ags_thread_key, thread); if(!AGS_IS_MAIN_LOOP(thread)){ ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_IS_CHAOS_TREE); } /* set/unset run flags */ ags_thread_unset_status_flags(thread, (AGS_THREAD_STATUS_RT_SETUP | AGS_THREAD_STATUS_WAITING | AGS_THREAD_STATUS_SYNCED | AGS_THREAD_STATUS_SYNCED_FREQ)); ags_thread_unset_sync_tic_flags(thread, (AGS_THREAD_SYNC_TIC_WAIT_0 | AGS_THREAD_SYNC_TIC_DONE_0 | AGS_THREAD_SYNC_TIC_WAIT_1 | AGS_THREAD_SYNC_TIC_DONE_1 | AGS_THREAD_SYNC_TIC_WAIT_2 | AGS_THREAD_SYNC_TIC_DONE_2 | AGS_THREAD_SYNC_TIC_WAIT_3 | AGS_THREAD_SYNC_TIC_DONE_3 | AGS_THREAD_SYNC_TIC_WAIT_4 | AGS_THREAD_SYNC_TIC_DONE_4 | AGS_THREAD_SYNC_TIC_WAIT_5 | AGS_THREAD_SYNC_TIC_DONE_5 | AGS_THREAD_SYNC_TIC_WAIT_6 | AGS_THREAD_SYNC_TIC_DONE_6 | AGS_THREAD_SYNC_TIC_WAIT_7 | AGS_THREAD_SYNC_TIC_DONE_7 | AGS_THREAD_SYNC_TIC_WAIT_8 | AGS_THREAD_SYNC_TIC_DONE_8)); ags_thread_unset_flags(thread, (AGS_THREAD_MARK_SYNCED)); ags_thread_set_status_flags(thread, (AGS_THREAD_STATUS_RUNNING | AGS_THREAD_STATUS_READY | AGS_THREAD_STATUS_INITIAL_RUN | AGS_THREAD_STATUS_INITIAL_SYNC)); /* get thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); while(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING)){ /* start queue */ g_rec_mutex_lock(thread_mutex); start_queue = start_start_queue = thread->start_queue; thread->start_queue = NULL; g_rec_mutex_unlock(thread_mutex); while(start_queue != NULL){ AgsThread *queued_thread; GMutex *queued_thread_start_mutex; GCond *queued_thread_start_cond; queued_thread = (AgsThread *) start_queue->data; g_object_ref(queued_thread); /* */ ags_thread_start(queued_thread); queued_thread_start_mutex = AGS_THREAD_GET_START_MUTEX(queued_thread); queued_thread_start_cond = AGS_THREAD_GET_START_COND(queued_thread); g_mutex_lock(queued_thread_start_mutex); if(ags_thread_test_status_flags(queued_thread, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(queued_thread, AGS_THREAD_STATUS_START_DONE)){ ags_thread_set_status_flags(queued_thread, AGS_THREAD_STATUS_START_WAIT); while(ags_thread_test_status_flags(queued_thread, AGS_THREAD_STATUS_START_WAIT) && !ags_thread_test_status_flags(queued_thread, AGS_THREAD_STATUS_START_DONE)){ g_cond_wait(queued_thread_start_cond, queued_thread_start_mutex); } } g_mutex_unlock(queued_thread_start_mutex); g_object_unref(queued_thread); /* iterate */ start_queue = start_queue->next; } start_queue = start_start_queue; while(start_queue != NULL){ while(!ags_thread_test_status_flags(start_queue->data, AGS_THREAD_STATUS_SYNCED_FREQ)); /* iterate */ start_queue = start_queue->next; } g_list_free_full(start_start_queue, g_object_unref); /* run with clock synchronization */ i_stop = ags_thread_clock(thread); /* set busy flag */ if(i_stop > 0){ ags_thread_set_status_flags(thread, AGS_THREAD_STATUS_BUSY); } for(i = 0; i < i_stop && ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING); i++){ #if 0 g_message("run thread 0x%x", thread); #endif /* run */ ags_thread_run(thread); } /* unset busy flag */ if(i_stop > 0){ if(ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_INITIAL_RUN)){ ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_INITIAL_RUN); } ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_BUSY); } } /* get main loop */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); tree_mutex = ags_main_loop_get_tree_lock(AGS_MAIN_LOOP(main_loop)); g_rec_mutex_lock(tree_mutex); /* sync tic */ main_sync_tic = ags_thread_get_current_sync_tic(main_loop); current_sync_tic = ags_thread_get_current_sync_tic(thread); #ifdef AGS_DEBUG g_message("thread finish %d %d", main_sync_tic, current_sync_tic); #endif ags_thread_clear_status_flags(thread); ags_thread_clear_sync_tic_flags(thread); if(!ags_thread_is_tree_ready_recursive(main_loop, current_sync_tic) || current_sync_tic != main_sync_tic){ if(main_sync_tic != current_sync_tic){ g_critical("out-of-sync - main sync-tic != current sync-tic"); } g_rec_mutex_unlock(tree_mutex); }else{ AgsTaskLauncher *task_launcher; ags_main_loop_set_syncing(AGS_MAIN_LOOP(main_loop), TRUE); /* get task launcher */ task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); /* run task launcher */ ags_task_launcher_sync_run(task_launcher); /* signal */ #if 1 if(main_sync_tic == current_sync_tic){ }else{ g_critical("out-of-sync - main sync-tic != current sync-tic"); } ags_thread_prepare_tree_sync_recursive(main_loop, main_sync_tic); ags_thread_set_tree_sync_recursive(main_loop, main_sync_tic); #else ags_thread_prepare_tree_sync_recursive(main_loop, main_sync_tic); ags_thread_set_tree_sync_recursive(main_loop, main_sync_tic); #endif ags_main_loop_set_syncing(AGS_MAIN_LOOP(main_loop), FALSE); g_rec_mutex_unlock(tree_mutex); } /* exit thread */ ags_thread_unset_flags(thread, AGS_THREAD_MARK_SYNCED); thread->thread = NULL; g_thread_exit(NULL); return(NULL); } void ags_thread_real_start(AgsThread *thread) { if(thread->thread != NULL || ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING)){ return; } #ifdef AGS_DEBUG g_message("thread start: %s", G_OBJECT_TYPE_NAME(thread)); #endif /* */ thread->thread = g_thread_new("Advanced Gtk+ Sequencer - clock", ags_thread_loop, thread); } /** * ags_thread_start: * @thread: the #AgsThread instance * * Start the thread. * * Since: 3.0.0 */ void ags_thread_start(AgsThread *thread) { g_return_if_fail(AGS_IS_THREAD(thread)); g_object_ref(thread); g_signal_emit(thread, thread_signals[START], 0); g_object_unref(thread); } /** * ags_thread_add_start_queue: * @thread: the #AgsThread * @child: the child #AgsThread to start * * Add @child to @thread's start queue. * * Since: 3.0.0 */ void ags_thread_add_start_queue(AgsThread *thread, AgsThread *child) { GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread) || !AGS_IS_THREAD(child)){ return; } /* thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* add */ g_rec_mutex_lock(thread_mutex); thread->start_queue = g_list_prepend(thread->start_queue, child); g_object_ref(child); g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_add_start_queue_all: * @thread: the #AgsThread * @child: (element-type Ags.Thread): the children as #GList-struct containing #AgsThread to start * * Add @child to @thread's start queue. * * Since: 3.0.0 */ void ags_thread_add_start_queue_all(AgsThread *thread, GList *child) { GRecMutex *thread_mutex; if(!AGS_IS_THREAD(thread) || child == NULL){ return; } /* thread mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); /* add all */ g_rec_mutex_lock(thread_mutex); if(thread->start_queue == NULL){ thread->start_queue = g_list_copy_deep(child, (GCopyFunc) g_object_ref, NULL); }else{ thread->start_queue = g_list_concat(thread->start_queue, g_list_copy_deep(child, (GCopyFunc) g_object_ref, NULL)); } g_rec_mutex_unlock(thread_mutex); } /** * ags_thread_run: * @thread: the #AgsThread * * Only for internal use of ags_thread_loop but you may want to set the your very own * class function namely your thread's routine. * * Since: 3.0.0 */ void ags_thread_run(AgsThread *thread) { g_return_if_fail(AGS_IS_THREAD(thread)); g_object_ref(thread); g_signal_emit(thread, thread_signals[RUN], 0); g_object_unref(thread); } void ags_thread_real_stop(AgsThread *thread) { if(thread->thread == NULL || !ags_thread_test_status_flags(thread, AGS_THREAD_STATUS_RUNNING)){ return; } ags_thread_unset_status_flags(thread, AGS_THREAD_STATUS_RUNNING); } /** * ags_thread_stop: * @thread: the #AgsThread * * Stop the threads loop by unsetting AGS_THREAD_STATUS_RUNNING flag. * * Since: 3.0.0 */ void ags_thread_stop(AgsThread *thread) { g_return_if_fail(AGS_IS_THREAD(thread)); g_object_ref(G_OBJECT(thread)); g_signal_emit(G_OBJECT(thread), thread_signals[STOP], 0); g_object_unref(G_OBJECT(thread)); } /** * ags_thread_find_type: * @thread: the #AgsThread * @gtype: the #GType-struct * * Find @gtype as descendant of @thread. If its a descendant thread, * the ref-count is increased. * * Returns: (transfer full): the matching #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_find_type(AgsThread *thread, GType gtype) { AgsThread *child, *next_child; AgsThread *retval; if(!AGS_IS_THREAD(thread) || gtype == G_TYPE_NONE){ return(NULL); } if(g_type_is_a(G_OBJECT_TYPE(thread), gtype)){ return(thread); } child = ags_thread_children(thread); while(child != NULL){ if((retval = ags_thread_find_type(child, gtype)) != NULL){ return(retval); } /* iterate */ next_child = ags_thread_next(child); g_object_unref(child); child = next_child; } return(NULL); } /** * ags_thread_self: * * Thread self. * * Returns: (transfer full): the running #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_self(void) { AgsThread *self; self = (AgsThread *) g_private_get(&ags_thread_key); g_object_ref(self); return(self); } /** * ags_thread_new: * * Create a new instance of #AgsThread. * * Returns: the new #AgsThread * * Since: 3.0.0 */ AgsThread* ags_thread_new() { AgsThread *thread; thread = (AgsThread *) g_object_new(AGS_TYPE_THREAD, NULL); return(thread); } gsequencer-3.1.3/ags/thread/ags_task_completion.h0000644000175000017500000000676113607210263017031 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TASK_COMPLETION_H__ #define __AGS_TASK_COMPLETION_H__ #include #include #include #include #define AGS_TYPE_TASK_COMPLETION (ags_task_completion_get_type()) #define AGS_TASK_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TASK_COMPLETION, AgsTaskCompletion)) #define AGS_TASK_COMPLETION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_TASK_COMPLETION, AgsTaskCompletionClass)) #define AGS_IS_TASK_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TASK_COMPLETION)) #define AGS_IS_TASK_COMPLETION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TASK_COMPLETION)) #define AGS_TASK_COMPLETION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_TASK_COMPLETION, AgsTaskCompletionClass)) #define AGS_TASK_COMPLETION_GET_OBJ_MUTEX(obj) (&(((AgsTaskCompletion *) obj)->obj_mutex)) typedef struct _AgsTaskCompletion AgsTaskCompletion; typedef struct _AgsTaskCompletionClass AgsTaskCompletionClass; /** * AgsTaskCompletionFlags: * @AGS_TASK_COMPLETION_ADDED_TO_REGISTRY: indicates the task completion was added to #AgsRegistry * @AGS_TASK_COMPLETION_CONNECTED: indicates the task completion was connected by calling #AgsConnectable::connect() * @AGS_TASK_COMPLETION_QUEUED: the assigned task has been queued * @AGS_TASK_COMPLETION_BUSY: the assigned task is busy * @AGS_TASK_COMPLETION_READY: the assigned task is ready * @AGS_TASK_COMPLETION_COMPLETED: the assigned task has been completed * * Enum values to control the behavior or indicate internal state of #AgsTaskCompletion by * enable/disable as flags. */ typedef enum{ AGS_TASK_COMPLETION_ADDED_TO_REGISTRY = 1, AGS_TASK_COMPLETION_CONNECTED = 1 << 1, AGS_TASK_COMPLETION_QUEUED = 1 << 2, AGS_TASK_COMPLETION_BUSY = 1 << 3, AGS_TASK_COMPLETION_READY = 1 << 4, AGS_TASK_COMPLETION_COMPLETED = 1 << 5, }AgsTaskCompletionFlags; struct _AgsTaskCompletion { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; GObject *task; gpointer data; }; struct _AgsTaskCompletionClass { GObjectClass gobject; void (*complete)(AgsTaskCompletion *task_completion); }; GType ags_task_completion_get_type(); gboolean ags_task_completion_test_flags(AgsTaskCompletion *task_completion, guint flags); void ags_task_completion_set_flags(AgsTaskCompletion *task_completion, guint flags); void ags_task_completion_unset_flags(AgsTaskCompletion *task_completion, guint flags); void ags_task_completion_complete(AgsTaskCompletion *task_completion); AgsTaskCompletion* ags_task_completion_new(GObject *task, gpointer data); #endif /*__AGS_TASK_COMPLETION_H__*/ gsequencer-3.1.3/ags/midi2xml_main.c0000644000175000017500000000423313605312647014260 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include int main(int argc, char **argv) { AgsMidiParser *midi_parser; FILE *out; FILE *file; xmlChar *buffer; gchar *filename; size_t length; if(argc == 2){ if(!g_ascii_strncasecmp(argv[1], "--help", 7)){ printf("midi2xml converts MIDI to XML\n\n"); printf("Usage:\n\t%s\n\t%s\n\t%s\n\t%s\n\n", "Report bugs to \n", "--help display this help and exit", "--version output version information and exit", " the file to be processed"); exit(0); }else if(!g_ascii_strncasecmp(argv[1], "--version", 10)){ printf("midi2xml 1.0.0\n\n"); printf("%s\n%s\n%s\n\n", "Copyright (C) 2015 Joël Krähemann", "This is free software; see the source for copying conditions. There is NO", "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); printf("Written by Joël Krähemann\n"); exit(0); }else{ filename = argv[1]; } }else{ return(-1); } file = fopen(filename, "r"); fseek(file, 0, SEEK_SET); midi_parser = ags_midi_parser_new(file); ags_midi_parser_parse_full(midi_parser); xmlSaveFormatFileEnc("-", midi_parser->doc, "UTF-8", 1); return(0); } gsequencer-3.1.3/ags/lib/0000755000175000017500000000000013622252263012203 500000000000000gsequencer-3.1.3/ags/lib/ags_time.c0000644000175000017500000000753213613101102014047 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #ifdef __APPLE__ #include #include #endif /** * SECTION:ags_time * @short_description: utility functions of time * @title: AgsTime * @section_id: * @include: ags/lib/ags_time.h * * Functions to help you dealing with time. */ /** * ags_time_get_uptime_from_offset: * @offset: the offset in tics * @bpm: the beats per minute * @delay: the buffer time as delay * @delay_factor: tact segmentation * * Calculates uptime from @offset by applying factors @bpm, @delay and @delay_factor * giving you the result as string. * * Returns: (transfer full): the string containing the time, a minus sign is prepend if factors * are invalid * * Since: 3.0.0 */ gchar* ags_time_get_uptime_from_offset(guint offset, gdouble bpm, gdouble delay, gdouble delay_factor) { gchar *uptime; gdouble delay_min, delay_sec, delay_msec; gdouble tact_redux; guint min, sec, msec; if(bpm <= 0.0 || delay <= 0.0 || delay_factor <= 0.0){ return(g_strdup_printf("-%s", AGS_TIME_ZERO)); } /* translate to time string */ tact_redux = offset; delay_sec = 16.0 * delay_factor * bpm / 60.0; delay_min = delay_sec * 60.0; delay_msec = delay_sec / 1000.0; min = (guint) floor(tact_redux / delay_min); if(min > 0){ tact_redux = tact_redux - (min * delay_min); } sec = (guint) floor(tact_redux / delay_sec); if(sec > 0){ tact_redux = tact_redux - (sec * delay_sec); } msec = (guint) floor(tact_redux / delay_msec); uptime = g_strdup_printf("%.4d:%.2d.%.3d", min, sec, msec); return(uptime); } /** * ags_time_timeout_expired: * @start_time: the start time #timespec-struct * @timeout_delay: the delay #timespec-struct * * Check @start_time plus @timeout_delay against current time. * * Returns: %TRUE if timeout expired, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_time_timeout_expired(struct timespec *start_time, struct timespec *timeout_delay) { struct timespec current_time; struct timespec deadline; #ifdef __APPLE__ clock_serv_t cclock; mach_timespec_t mts; #endif if(start_time == NULL || timeout_delay == NULL){ return(TRUE); } #ifdef __APPLE__ host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &mts); mach_port_deallocate(mach_task_self(), cclock); current_time.tv_sec = mts.tv_sec; current_time.tv_nsec = mts.tv_nsec; #else clock_gettime(CLOCK_MONOTONIC, ¤t_time); #endif if(start_time->tv_nsec + timeout_delay->tv_nsec > AGS_NSEC_PER_SEC){ deadline.tv_sec = start_time->tv_sec + timeout_delay->tv_sec + 1; deadline.tv_nsec = (start_time->tv_nsec + timeout_delay->tv_nsec) - AGS_NSEC_PER_SEC; }else{ deadline.tv_sec = start_time->tv_sec + timeout_delay->tv_sec; deadline.tv_nsec = start_time->tv_nsec + timeout_delay->tv_nsec; } if(current_time.tv_sec > deadline.tv_sec){ return(TRUE); }else{ if(current_time.tv_sec == deadline.tv_sec && current_time.tv_nsec > deadline.tv_nsec){ return(TRUE); } } return(FALSE); } gsequencer-3.1.3/ags/lib/ags_function.h0000644000175000017500000001065013607210263014752 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FUNCTION_H__ #define __AGS_FUNCTION_H__ #include #include #include #include #define AGS_TYPE_FUNCTION (ags_function_get_type()) #define AGS_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FUNCTION, AgsFunction)) #define AGS_FUNCTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FUNCTION, AgsFunctionClass)) #define AGS_IS_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FUNCTION)) #define AGS_IS_FUNCTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FUNCTION)) #define AGS_FUNCTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_FUNCTION, AgsFunctionClass)) #define AGS_FUNCTION_GET_OBJ_MUTEX(obj) (&(((AgsFunction *) obj)->obj_mutex)) #define AGS_SYMBOLIC_EULER "ℯ" #define AGS_SYMBOLIC_PI "𝜋" #define AGS_SYMBOLIC_INFINIT "∞" #define AGS_SYMBOLIC_COMPLEX_UNIT "𝑖" typedef struct _AgsFunction AgsFunction; typedef struct _AgsFunctionClass AgsFunctionClass; /** * AgsFunctionFlags: * @AGS_FUNCTION_LINEAR: the function is linear * @AGS_FUNCTION_EXPONENTIAL: the function is exponential * @AGS_FUNCTION_LOGARITHMIC: the function is logarithmic * @AGS_FUNCTION_IS_UNIQUE: the function is unique * @AGS_FUNCTION_SOLVE_PIVOT_TABLE: do solve using pivot table * @AGS_FUNCTION_SOLVE_MAXIMUM_COLON: solve using maximum colon strategy * @AGS_FUNCTION_SOLVE_GAUSS: solve using gauss strategy * * Enum values to control the behavior or indicate internal state of #AgsFunction by * enable/disable as flags. */ typedef enum{ AGS_FUNCTION_LINEAR = 1, AGS_FUNCTION_EXPONENTIAL = 1 << 1, AGS_FUNCTION_LOGARITHMIC = 1 << 2, AGS_FUNCTION_IS_UNIQUE = 1 << 3, AGS_FUNCTION_SOLVE_PIVOT_TABLE = 1 << 4, AGS_FUNCTION_SOLVE_MAXIMUM_COLON = 1 << 5, AGS_FUNCTION_SOLVE_GAUSS = 1 << 6, }AgsFunctionFlags; struct _AgsFunction { AgsConversion conversion; guint flags; GRecMutex obj_mutex; gboolean is_pushing; gchar **equation; guint equation_count; gchar **transformed_equation; guint transformed_equation_count; gchar *source_function; gchar *normalized_function; gchar **symbol; guint symbol_count; GList *solver_matrix; guint pivot_table_count; guint *row_count; guint *column_count; AgsComplex*** pivot_table; guint solver_level; AgsComplex **solver_vector; }; struct _AgsFunctionClass { AgsConversionClass conversion; void (*literal_solve)(AgsFunction *function); }; GType ags_function_get_type(void); gchar** ags_function_collapse_parantheses(AgsFunction *function, guint *function_count); gchar** ags_function_find_literals(AgsFunction *function, guint *symbol_count); void ags_function_literal_solve(AgsFunction *function); gboolean ags_function_push_equation(AgsFunction *function, gchar *equation); void ags_function_pop_equation(AgsFunction *function, GError **error); gchar* ags_function_get_expanded(AgsFunction *function, gchar **symbol, guint symbol_count); gchar* ags_function_get_normalized(AgsFunction *function); AgsComplex* ags_function_compute_term(gchar *term, gchar *substitute_symbol, AgsComplex *substitute_value); AgsComplex** ags_function_symbolic_translate_value(AgsFunction *function, gchar *symbol, AgsComplex *value); gboolean ags_function_substitute_values(AgsFunction *function, gchar *symbol, ...); AgsComplex* ags_function_translate_value(AgsFunction *function, AgsComplex *value); AgsFunction* ags_function_new(gchar *source_function); G_END_DECLS #endif /*__AGS_FUNCTION_H__*/ gsequencer-3.1.3/ags/lib/ags_buffer_util.c0000644000175000017500000012540613607210263015434 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include /** * SECTION:ags_buffer_util * @short_description: buffer util * @title: AgsBufferUtil * @section_id: * @include: ags/lib/ags_buffer_util.h * * Common utility functions related to char buffers. */ /** * ags_buffer_util_s8_to_char_buffer: * @buffer: the gint8 buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_s8_to_char_buffer(gint8 *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; guint limit; guint i; start_cbuffer = cbuffer = (guchar *) malloc(buffer_length * sizeof(guchar)); i = 0; if(buffer_length > 8){ limit = buffer_length - 8; for(; i < limit; i += 8){ cbuffer[0] = (guchar) (0xff & buffer[0]); cbuffer[1] = (guchar) (0xff & buffer[1]); cbuffer[2] = (guchar) (0xff & buffer[2]); cbuffer[3] = (guchar) (0xff & buffer[3]); cbuffer[4] = (guchar) (0xff & buffer[4]); cbuffer[5] = (guchar) (0xff & buffer[5]); cbuffer[6] = (guchar) (0xff & buffer[6]); cbuffer[7] = (guchar) (0xff & buffer[7]); buffer += 8; cbuffer += 8; } } for(; i < buffer_length; i++){ cbuffer[0] = (guchar) (0xff & buffer[0]); buffer++; cbuffer++; } return(start_cbuffer); } /** * ags_buffer_util_s16_to_char_buffer: * @buffer: the gint16 buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_s16_to_char_buffer(gint16 *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; guint limit; guint i; start_cbuffer = cbuffer = (guchar *) malloc((2 * buffer_length) * sizeof(guchar)); i = 0; if(buffer_length > 8){ limit = buffer_length - 8; for(; i < limit; i += 8){ cbuffer[0] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[1] = (guchar) (0xff & buffer[0]); cbuffer[2] = (guchar) ((0xff00 & buffer[1]) >> 8); cbuffer[3] = (guchar) (0xff & buffer[1]); cbuffer[4] = (guchar) ((0xff00 & buffer[2]) >> 8); cbuffer[5] = (guchar) (0xff & buffer[2]); cbuffer[6] = (guchar) ((0xff00 & buffer[3]) >> 8); cbuffer[7] = (guchar) (0xff & buffer[3]); cbuffer[8] = (guchar) ((0xff00 & buffer[4]) >> 8); cbuffer[9] = (guchar) (0xff & buffer[4]); cbuffer[10] = (guchar) ((0xff00 & buffer[5]) >> 8); cbuffer[11] = (guchar) (0xff & buffer[5]); cbuffer[12] = (guchar) ((0xff00 & buffer[6]) >> 8); cbuffer[13] = (guchar) (0xff & buffer[6]); cbuffer[14] = (guchar) ((0xff00 & buffer[7]) >> 8); cbuffer[15] = (guchar) (0xff & buffer[7]); buffer += 8; cbuffer += (2 * 8); } } for(; i < buffer_length; i++){ cbuffer[0] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[1] = (guchar) (0xff & buffer[0]); buffer++; cbuffer += 2; } return(start_cbuffer); } /** * ags_buffer_util_s24_to_char_buffer: * @buffer: the gint32 buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_s24_to_char_buffer(gint32 *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; guint limit; guint i; start_cbuffer = cbuffer = (guchar *) malloc((4 * buffer_length) * sizeof(guchar)); i = 0; if(buffer_length > 8){ limit = buffer_length - 8; for(; i < limit; i += 8){ cbuffer[0] = (guchar) ((0xff000000 & buffer[0]) >> 24); cbuffer[1] = (guchar) ((0xff0000 & buffer[0]) >> 16); cbuffer[2] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[3] = (guchar) (0xff & buffer[0]); cbuffer[4] = (guchar) ((0xff000000 & buffer[1]) >> 24); cbuffer[5] = (guchar) ((0xff0000 & buffer[1]) >> 16); cbuffer[6] = (guchar) ((0xff00 & buffer[1]) >> 8); cbuffer[7] = (guchar) (0xff & buffer[1]); cbuffer[8] = (guchar) ((0xff000000 & buffer[2]) >> 24); cbuffer[9] = (guchar) ((0xff0000 & buffer[2]) >> 16); cbuffer[10] = (guchar) ((0xff00 & buffer[2]) >> 8); cbuffer[11] = (guchar) (0xff & buffer[2]); cbuffer[12] = (guchar) ((0xff000000 & buffer[3]) >> 24); cbuffer[13] = (guchar) ((0xff0000 & buffer[3]) >> 16); cbuffer[14] = (guchar) ((0xff00 & buffer[3]) >> 8); cbuffer[15] = (guchar) (0xff & buffer[3]); cbuffer[16] = (guchar) ((0xff000000 & buffer[4]) >> 24); cbuffer[17] = (guchar) ((0xff0000 & buffer[4]) >> 16); cbuffer[18] = (guchar) ((0xff00 & buffer[4]) >> 8); cbuffer[19] = (guchar) (0xff & buffer[4]); cbuffer[20] = (guchar) ((0xff000000 & buffer[5]) >> 24); cbuffer[21] = (guchar) ((0xff0000 & buffer[5]) >> 16); cbuffer[22] = (guchar) ((0xff00 & buffer[5]) >> 8); cbuffer[23] = (guchar) (0xff & buffer[5]); cbuffer[24] = (guchar) ((0xff000000 & buffer[6]) >> 24); cbuffer[25] = (guchar) ((0xff0000 & buffer[6]) >> 16); cbuffer[26] = (guchar) ((0xff00 & buffer[6]) >> 8); cbuffer[27] = (guchar) (0xff & buffer[6]); cbuffer[28] = (guchar) ((0xff000000 & buffer[7]) >> 24); cbuffer[29] = (guchar) ((0xff0000 & buffer[7]) >> 16); cbuffer[30] = (guchar) ((0xff00 & buffer[7]) >> 8); cbuffer[31] = (guchar) (0xff & buffer[7]); buffer += 8; cbuffer += (4 * 8); } } for(; i < buffer_length; i++){ cbuffer[0] = (guchar) ((0xff000000 & buffer[0]) >> 24); cbuffer[1] = (guchar) ((0xff0000 & buffer[0]) >> 16); cbuffer[2] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[3] = (guchar) (0xff & buffer[0]); buffer++; cbuffer += 4; } return(start_cbuffer); } /** * ags_buffer_util_s32_to_char_buffer: * @buffer: the gint32 buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_s32_to_char_buffer(gint32 *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; guint limit; guint i; start_cbuffer = cbuffer = (guchar *) malloc((4 * buffer_length) * sizeof(guchar)); i = 0; if(buffer_length > 8){ limit = buffer_length - 8; for(; i < limit; i += 8){ cbuffer[0] = (guchar) ((0xff000000 & buffer[0]) >> 24); cbuffer[1] = (guchar) ((0xff0000 & buffer[0]) >> 16); cbuffer[2] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[3] = (guchar) (0xff & buffer[0]); cbuffer[4] = (guchar) ((0xff000000 & buffer[1]) >> 24); cbuffer[5] = (guchar) ((0xff0000 & buffer[1]) >> 16); cbuffer[6] = (guchar) ((0xff00 & buffer[1]) >> 8); cbuffer[7] = (guchar) (0xff & buffer[1]); cbuffer[8] = (guchar) ((0xff000000 & buffer[2]) >> 24); cbuffer[9] = (guchar) ((0xff0000 & buffer[2]) >> 16); cbuffer[10] = (guchar) ((0xff00 & buffer[2]) >> 8); cbuffer[11] = (guchar) (0xff & buffer[2]); cbuffer[12] = (guchar) ((0xff000000 & buffer[3]) >> 24); cbuffer[13] = (guchar) ((0xff0000 & buffer[3]) >> 16); cbuffer[14] = (guchar) ((0xff00 & buffer[3]) >> 8); cbuffer[15] = (guchar) (0xff & buffer[3]); cbuffer[16] = (guchar) ((0xff000000 & buffer[4]) >> 24); cbuffer[17] = (guchar) ((0xff0000 & buffer[4]) >> 16); cbuffer[18] = (guchar) ((0xff00 & buffer[4]) >> 8); cbuffer[19] = (guchar) (0xff & buffer[4]); cbuffer[20] = (guchar) ((0xff000000 & buffer[5]) >> 24); cbuffer[21] = (guchar) ((0xff0000 & buffer[5]) >> 16); cbuffer[22] = (guchar) ((0xff00 & buffer[5]) >> 8); cbuffer[23] = (guchar) (0xff & buffer[5]); cbuffer[24] = (guchar) ((0xff000000 & buffer[6]) >> 24); cbuffer[25] = (guchar) ((0xff0000 & buffer[6]) >> 16); cbuffer[26] = (guchar) ((0xff00 & buffer[6]) >> 8); cbuffer[27] = (guchar) (0xff & buffer[6]); cbuffer[28] = (guchar) ((0xff000000 & buffer[7]) >> 24); cbuffer[29] = (guchar) ((0xff0000 & buffer[7]) >> 16); cbuffer[30] = (guchar) ((0xff00 & buffer[7]) >> 8); cbuffer[31] = (guchar) (0xff & buffer[7]); buffer += 8; cbuffer += (4 * 8); } } for(; i < buffer_length; i++){ cbuffer[0] = (guchar) ((0xff000000 & buffer[0]) >> 24); cbuffer[1] = (guchar) ((0xff0000 & buffer[0]) >> 16); cbuffer[2] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[3] = (guchar) (0xff & buffer[0]); buffer++; cbuffer += 4; } return(start_cbuffer); } /** * ags_buffer_util_s64_to_char_buffer: * @buffer: the gint64 buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_s64_to_char_buffer(gint64 *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; guint limit; guint i; start_cbuffer = cbuffer = (guchar *) malloc((8 * buffer_length) * sizeof(guchar)); i = 0; if(buffer_length > 8){ limit = buffer_length - 8; for(; i < limit; i += 8){ cbuffer[0] = (guchar) ((0xff00000000000000 & buffer[0]) >> 56); cbuffer[1] = (guchar) ((0xff000000000000 & buffer[0]) >> 48); cbuffer[2] = (guchar) ((0xff0000000000 & buffer[0]) >> 40); cbuffer[3] = (guchar) ((0xff00000000 & buffer[0]) >> 32); cbuffer[4] = (guchar) ((0xff000000 & buffer[0]) >> 24); cbuffer[5] = (guchar) ((0xff0000 & buffer[0]) >> 16); cbuffer[6] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[7] = (guchar) (0xff & buffer[0]); cbuffer[8] = (guchar) ((0xff00000000000000 & buffer[1]) >> 56); cbuffer[9] = (guchar) ((0xff000000000000 & buffer[1]) >> 48); cbuffer[10] = (guchar) ((0xff0000000000 & buffer[1]) >> 40); cbuffer[11] = (guchar) ((0xff00000000 & buffer[1]) >> 32); cbuffer[12] = (guchar) ((0xff000000 & buffer[1]) >> 24); cbuffer[13] = (guchar) ((0xff0000 & buffer[1]) >> 16); cbuffer[14] = (guchar) ((0xff00 & buffer[1]) >> 8); cbuffer[15] = (guchar) (0xff & buffer[1]); cbuffer[16] = (guchar) ((0xff00000000000000 & buffer[2]) >> 56); cbuffer[17] = (guchar) ((0xff000000000000 & buffer[2]) >> 48); cbuffer[18] = (guchar) ((0xff0000000000 & buffer[2]) >> 40); cbuffer[19] = (guchar) ((0xff00000000 & buffer[2]) >> 32); cbuffer[20] = (guchar) ((0xff000000 & buffer[2]) >> 24); cbuffer[21] = (guchar) ((0xff0000 & buffer[2]) >> 16); cbuffer[22] = (guchar) ((0xff00 & buffer[2]) >> 8); cbuffer[23] = (guchar) (0xff & buffer[2]); cbuffer[24] = (guchar) ((0xff00000000000000 & buffer[3]) >> 56); cbuffer[25] = (guchar) ((0xff000000000000 & buffer[3]) >> 48); cbuffer[26] = (guchar) ((0xff0000000000 & buffer[3]) >> 40); cbuffer[27] = (guchar) ((0xff00000000 & buffer[3]) >> 32); cbuffer[28] = (guchar) ((0xff000000 & buffer[3]) >> 24); cbuffer[29] = (guchar) ((0xff0000 & buffer[3]) >> 16); cbuffer[30] = (guchar) ((0xff00 & buffer[3]) >> 8); cbuffer[31] = (guchar) (0xff & buffer[3]); cbuffer[32] = (guchar) ((0xff00000000000000 & buffer[4]) >> 56); cbuffer[33] = (guchar) ((0xff000000000000 & buffer[4]) >> 48); cbuffer[34] = (guchar) ((0xff0000000000 & buffer[4]) >> 40); cbuffer[35] = (guchar) ((0xff00000000 & buffer[4]) >> 32); cbuffer[36] = (guchar) ((0xff000000 & buffer[4]) >> 24); cbuffer[37] = (guchar) ((0xff0000 & buffer[4]) >> 16); cbuffer[38] = (guchar) ((0xff00 & buffer[4]) >> 8); cbuffer[39] = (guchar) (0xff & buffer[4]); cbuffer[40] = (guchar) ((0xff00000000000000 & buffer[5]) >> 56); cbuffer[41] = (guchar) ((0xff000000000000 & buffer[5]) >> 48); cbuffer[42] = (guchar) ((0xff0000000000 & buffer[5]) >> 40); cbuffer[43] = (guchar) ((0xff00000000 & buffer[5]) >> 32); cbuffer[44] = (guchar) ((0xff000000 & buffer[5]) >> 24); cbuffer[45] = (guchar) ((0xff0000 & buffer[5]) >> 16); cbuffer[46] = (guchar) ((0xff00 & buffer[5]) >> 8); cbuffer[47] = (guchar) (0xff & buffer[5]); cbuffer[48] = (guchar) ((0xff00000000000000 & buffer[6]) >> 56); cbuffer[49] = (guchar) ((0xff000000000000 & buffer[6]) >> 48); cbuffer[50] = (guchar) ((0xff0000000000 & buffer[6]) >> 40); cbuffer[51] = (guchar) ((0xff00000000 & buffer[6]) >> 32); cbuffer[52] = (guchar) ((0xff000000 & buffer[6]) >> 24); cbuffer[53] = (guchar) ((0xff0000 & buffer[6]) >> 16); cbuffer[54] = (guchar) ((0xff00 & buffer[6]) >> 8); cbuffer[55] = (guchar) (0xff & buffer[6]); cbuffer[56] = (guchar) ((0xff00000000000000 & buffer[7]) >> 56); cbuffer[57] = (guchar) ((0xff000000000000 & buffer[7]) >> 48); cbuffer[58] = (guchar) ((0xff0000000000 & buffer[7]) >> 40); cbuffer[59] = (guchar) ((0xff00000000 & buffer[7]) >> 32); cbuffer[60] = (guchar) ((0xff000000 & buffer[7]) >> 24); cbuffer[61] = (guchar) ((0xff0000 & buffer[7]) >> 16); cbuffer[62] = (guchar) ((0xff00 & buffer[7]) >> 8); cbuffer[63] = (guchar) (0xff & buffer[7]); buffer += 8; cbuffer += (8 * 8); } } for(; i < buffer_length; i++){ cbuffer[0] = (guchar) ((0xff00000000000000 & buffer[0]) >> 56); cbuffer[1] = (guchar) ((0xff000000000000 & buffer[0]) >> 48); cbuffer[2] = (guchar) ((0xff0000000000 & buffer[0]) >> 40); cbuffer[3] = (guchar) ((0xff00000000 & buffer[0]) >> 32); cbuffer[4] = (guchar) ((0xff000000 & buffer[0]) >> 24); cbuffer[5] = (guchar) ((0xff0000 & buffer[0]) >> 16); cbuffer[6] = (guchar) ((0xff00 & buffer[0]) >> 8); cbuffer[7] = (guchar) (0xff & buffer[0]); buffer++; cbuffer += 8; } return(start_cbuffer); } /** * ags_buffer_util_float_to_char_buffer: * @buffer: the gfloat buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_float_to_char_buffer(gfloat *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; start_cbuffer = cbuffer = (guchar *) malloc((buffer_length * sizeof(gfloat)) * sizeof(guchar)); memcpy(cbuffer, buffer, buffer_length * sizeof(gfloat)); return(start_cbuffer); } /** * ags_buffer_util_double_to_char_buffer: * @buffer: the gdouble buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_double_to_char_buffer(gdouble *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; start_cbuffer = cbuffer = (guchar *) malloc((buffer_length * sizeof(gdouble)) * sizeof(guchar)); memcpy(cbuffer, buffer, buffer_length * sizeof(gdouble)); return(start_cbuffer); } /** * ags_buffer_util_complex_to_char_buffer: * @buffer: the #AgsComplex buffer * @buffer_length: the buffer length * * Pack @buffer into an guchar buffer. * * Returns: (transfer full): the guchar buffer * * Since: 3.0.0 */ guchar* ags_buffer_util_complex_to_char_buffer(AgsComplex *buffer, guint buffer_length) { guchar *cbuffer, *start_cbuffer; start_cbuffer = cbuffer = (guchar *) malloc((buffer_length * sizeof(AgsComplex)) * sizeof(guchar)); memcpy(cbuffer, buffer, buffer_length * sizeof(AgsComplex)); return(start_cbuffer); } /** * ags_buffer_util_char_buffer_to_s8: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gint8 buffer * * Returns: (transfer full): the gint8 buffer * * Since: 3.0.0 */ gint8* ags_buffer_util_char_buffer_to_s8(guchar *cbuffer, guint buffer_size) { gint8 *buffer, *start_buffer; guint limit; guint i; start_buffer = buffer = (gint8 *) malloc(buffer_size * sizeof(gint8)); memset(buffer, 0, buffer_size * sizeof(gint8)); i = 0; if(buffer_size > 8){ limit = buffer_size - 8; for(; i < limit; i += 8){ buffer[0] |= (0xff & cbuffer[0]); buffer[1] |= (0xff & cbuffer[1]); buffer[2] |= (0xff & cbuffer[2]); buffer[3] |= (0xff & cbuffer[3]); buffer[4] |= (0xff & cbuffer[4]); buffer[5] |= (0xff & cbuffer[5]); buffer[6] |= (0xff & cbuffer[6]); buffer[7] |= (0xff & cbuffer[7]); buffer += 8; cbuffer += 8; } } for(; i < buffer_size; i++){ buffer[0] |= (0xff & cbuffer[0]); buffer++; cbuffer++; } return(start_buffer); } /** * ags_buffer_util_char_buffer_to_s16: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gint16 buffer * * Returns: (transfer full): the gint16 buffer * * Since: 3.0.0 */ gint16* ags_buffer_util_char_buffer_to_s16(guchar *cbuffer, guint buffer_size) { gint16 *buffer, *start_buffer; guint limit; guint i; start_buffer = buffer = (gint16 *) malloc((buffer_size / 2) * sizeof(gint16)); memset(buffer, 0, (buffer_size / 2) * sizeof(gint16)); buffer_size = (guint) (2 * floor(buffer_size / 2.0)); i = 0; if(buffer_size / 2 > 8){ limit = (buffer_size / 2) - 8; for(; i < limit; i += 8){ buffer[0] |= ((gint16) (0xff & cbuffer[0]) << 8); buffer[0] |= ((gint16) 0xff & cbuffer[1]); buffer[1] |= ((gint16) (0xff & cbuffer[2]) << 8); buffer[1] |= ((gint16) 0xff & cbuffer[3]); buffer[2] |= ((gint16) (0xff & cbuffer[4]) << 8); buffer[2] |= ((gint16) 0xff & cbuffer[5]); buffer[3] |= ((gint16) (0xff & cbuffer[6]) << 8); buffer[3] |= ((gint16) 0xff & cbuffer[7]); buffer[4] |= ((gint16) (0xff & cbuffer[8]) << 8); buffer[4] |= ((gint16) 0xff & cbuffer[9]); buffer[5] |= ((gint16) (0xff & cbuffer[10]) << 8); buffer[5] |= ((gint16) 0xff & cbuffer[11]); buffer[6] |= ((gint16) (0xff & cbuffer[12]) << 8); buffer[6] |= ((gint16) 0xff & cbuffer[13]); buffer[7] |= ((gint16) (0xff & cbuffer[14]) << 8); buffer[7] |= ((gint16) 0xff & cbuffer[15]); buffer += 8; cbuffer += (2 * 8); } } for(; i < buffer_size / 2; i++){ buffer[0] |= ((gint16) (0xff & cbuffer[0]) << 8); buffer[0] |= ((gint16) 0xff & cbuffer[1]); buffer++; cbuffer += 2; } return(start_buffer); } /** * ags_buffer_util_char_buffer_to_s24: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gint32 buffer * * Returns: (transfer full): the gint32 buffer * * Since: 3.0.0 */ gint32* ags_buffer_util_char_buffer_to_s24(guchar *cbuffer, guint buffer_size) { gint32 *buffer, *start_buffer; guint limit; guint i; start_buffer = buffer = (gint32 *) malloc((buffer_size / 4) * sizeof(gint32)); memset(buffer, 0, (buffer_size / 4) * sizeof(gint32)); buffer_size = (guint) (4 * floor(buffer_size / 4.0)); i = 0; if(buffer_size / 4 > 8){ limit = (buffer_size / 4) - 8; for(; i < limit; i += 8){ buffer[0] |= ((0xff & cbuffer[0]) << 24); buffer[0] |= ((0xff & cbuffer[1]) << 16); buffer[0] |= ((0xff & cbuffer[2]) << 8); buffer[0] |= (0xff & cbuffer[3]); buffer[1] |= ((0xff & cbuffer[4]) << 24); buffer[1] |= ((0xff & cbuffer[5]) << 16); buffer[1] |= ((0xff & cbuffer[6]) << 8); buffer[1] |= (0xff & cbuffer[7]); buffer[2] |= ((0xff & cbuffer[8]) << 24); buffer[2] |= ((0xff & cbuffer[9]) << 16); buffer[2] |= ((0xff & cbuffer[10]) << 8); buffer[2] |= (0xff & cbuffer[11]); buffer[3] |= ((0xff & cbuffer[12]) << 24); buffer[3] |= ((0xff & cbuffer[13]) << 16); buffer[3] |= ((0xff & cbuffer[14]) << 8); buffer[3] |= (0xff & cbuffer[15]); buffer[4] |= ((0xff & cbuffer[16]) << 24); buffer[4] |= ((0xff & cbuffer[17]) << 16); buffer[4] |= ((0xff & cbuffer[18]) << 8); buffer[4] |= (0xff & cbuffer[19]); buffer[5] |= ((0xff & cbuffer[20]) << 24); buffer[5] |= ((0xff & cbuffer[21]) << 16); buffer[5] |= ((0xff & cbuffer[22]) << 8); buffer[5] |= (0xff & cbuffer[23]); buffer[6] |= ((0xff & cbuffer[24]) << 24); buffer[6] |= ((0xff & cbuffer[25]) << 16); buffer[6] |= ((0xff & cbuffer[26]) << 8); buffer[6] |= (0xff & cbuffer[27]); buffer[7] |= ((0xff & cbuffer[28]) << 24); buffer[7] |= ((0xff & cbuffer[29]) << 16); buffer[7] |= ((0xff & cbuffer[30]) << 8); buffer[7] |= (0xff & cbuffer[31]); buffer += 8; cbuffer += (4 * 8); } } for(; i < buffer_size / 4; i++){ buffer[0] |= ((0xff & cbuffer[0]) << 24); buffer[0] |= ((0xff & cbuffer[1]) << 16); buffer[0] |= ((0xff & cbuffer[2]) << 8); buffer[0] |= (0xff & cbuffer[3]); buffer++; cbuffer += 4; } return(start_buffer); } /** * ags_buffer_util_char_buffer_to_s32: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gint32 buffer * * Returns: (transfer full): the gint32 buffer * * Since: 3.0.0 */ gint32* ags_buffer_util_char_buffer_to_s32(guchar *cbuffer, guint buffer_size) { gint32 *buffer, *start_buffer; guint limit; guint i; start_buffer = buffer = (gint32 *) malloc((buffer_size / 4) * sizeof(gint32)); memset(buffer, 0, (buffer_size / 4) * sizeof(gint32)); buffer_size = (guint) (4 * floor(buffer_size / 4.0)); i = 0; if((buffer_size / 4) > 8){ limit = (buffer_size / 4) - 8; for(; i < limit; i += 8){ buffer[0] |= ((0xff & cbuffer[0]) << 24); buffer[0] |= ((0xff & cbuffer[1]) << 16); buffer[0] |= ((0xff & cbuffer[2]) << 8); buffer[0] |= (0xff & cbuffer[3]); buffer[1] |= ((0xff & cbuffer[4]) << 24); buffer[1] |= ((0xff & cbuffer[5]) << 16); buffer[1] |= ((0xff & cbuffer[6]) << 8); buffer[1] |= (0xff & cbuffer[7]); buffer[2] |= ((0xff & cbuffer[8]) << 24); buffer[2] |= ((0xff & cbuffer[9]) << 16); buffer[2] |= ((0xff & cbuffer[10]) << 8); buffer[2] |= (0xff & cbuffer[11]); buffer[3] |= ((0xff & cbuffer[12]) << 24); buffer[3] |= ((0xff & cbuffer[13]) << 16); buffer[3] |= ((0xff & cbuffer[14]) << 8); buffer[3] |= (0xff & cbuffer[15]); buffer[4] |= ((0xff & cbuffer[16]) << 24); buffer[4] |= ((0xff & cbuffer[17]) << 16); buffer[4] |= ((0xff & cbuffer[18]) << 8); buffer[4] |= (0xff & cbuffer[19]); buffer[5] |= ((0xff & cbuffer[20]) << 24); buffer[5] |= ((0xff & cbuffer[21]) << 16); buffer[5] |= ((0xff & cbuffer[22]) << 8); buffer[5] |= (0xff & cbuffer[23]); buffer[6] |= ((0xff & cbuffer[24]) << 24); buffer[6] |= ((0xff & cbuffer[25]) << 16); buffer[6] |= ((0xff & cbuffer[26]) << 8); buffer[6] |= (0xff & cbuffer[27]); buffer[7] |= ((0xff & cbuffer[28]) << 24); buffer[7] |= ((0xff & cbuffer[29]) << 16); buffer[7] |= ((0xff & cbuffer[30]) << 8); buffer[7] |= (0xff & cbuffer[31]); buffer += 8; cbuffer += (4 * 8); } } for(; i < buffer_size / 4; i++){ buffer[0] |= ((0xff & cbuffer[0]) << 24); buffer[0] |= ((0xff & cbuffer[1]) << 16); buffer[0] |= ((0xff & cbuffer[2]) << 8); buffer[0] |= (0xff & cbuffer[3]); buffer++; cbuffer += 4; } return(start_buffer); } /** * ags_buffer_util_char_buffer_to_s64: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gint64 buffer * * Returns: (transfer full): the gint64 buffer * * Since: 3.0.0 */ gint64* ags_buffer_util_char_buffer_to_s64(guchar *cbuffer, guint buffer_size) { gint64 *buffer, *start_buffer; guint limit; guint i; start_buffer = buffer = (gint64 *) malloc((buffer_size / 8) * sizeof(gint64)); memset(buffer, 0, (buffer_size / 8) * sizeof(gint64)); buffer_size = (guint) (8 * floor(buffer_size / 8.0)); i = 0; if(buffer_size / 8 > 8){ limit = (buffer_size / 8) - 8; for(; i < limit; i += 8){ buffer[0] |= ((gint64) (0xff & cbuffer[0]) << 56); buffer[0] |= ((gint64) (0xff & cbuffer[1]) << 48); buffer[0] |= ((gint64) (0xff & cbuffer[2]) << 40); buffer[0] |= ((gint64) (0xff & cbuffer[3]) << 32); buffer[0] |= ((gint64) (0xff & cbuffer[4]) << 24); buffer[0] |= ((gint64) (0xff & cbuffer[5]) << 16); buffer[0] |= ((gint64) (0xff & cbuffer[6]) << 8); buffer[0] |= (gint64) (0xff & cbuffer[7]); buffer[1] |= ((gint64) (0xff & cbuffer[8]) << 56); buffer[1] |= ((gint64) (0xff & cbuffer[9]) << 48); buffer[1] |= ((gint64) (0xff & cbuffer[10]) << 40); buffer[1] |= ((gint64) (0xff & cbuffer[11]) << 32); buffer[1] |= ((gint64) (0xff & cbuffer[12]) << 24); buffer[1] |= ((gint64) (0xff & cbuffer[13]) << 16); buffer[1] |= ((gint64) (0xff & cbuffer[14]) << 8); buffer[1] |= (gint64) (0xff & cbuffer[15]); buffer[2] |= ((gint64) (0xff & cbuffer[16]) << 56); buffer[2] |= ((gint64) (0xff & cbuffer[17]) << 48); buffer[2] |= ((gint64) (0xff & cbuffer[18]) << 40); buffer[2] |= ((gint64) (0xff & cbuffer[19]) << 32); buffer[2] |= ((gint64) (0xff & cbuffer[20]) << 24); buffer[2] |= ((gint64) (0xff & cbuffer[21]) << 16); buffer[2] |= ((gint64) (0xff & cbuffer[22]) << 8); buffer[2] |= (gint64) (0xff & cbuffer[23]); buffer[3] |= ((gint64) (0xff & cbuffer[24]) << 56); buffer[3] |= ((gint64) (0xff & cbuffer[25]) << 48); buffer[3] |= ((gint64) (0xff & cbuffer[26]) << 40); buffer[3] |= ((gint64) (0xff & cbuffer[27]) << 32); buffer[3] |= ((gint64) (0xff & cbuffer[28]) << 24); buffer[3] |= ((gint64) (0xff & cbuffer[29]) << 16); buffer[3] |= ((gint64) (0xff & cbuffer[30]) << 8); buffer[3] |= (gint64) (0xff & cbuffer[31]); buffer[4] |= ((gint64) (0xff & cbuffer[32]) << 56); buffer[4] |= ((gint64) (0xff & cbuffer[33]) << 48); buffer[4] |= ((gint64) (0xff & cbuffer[34]) << 40); buffer[4] |= ((gint64) (0xff & cbuffer[35]) << 32); buffer[4] |= ((gint64) (0xff & cbuffer[36]) << 24); buffer[4] |= ((gint64) (0xff & cbuffer[37]) << 16); buffer[4] |= ((gint64) (0xff & cbuffer[38]) << 8); buffer[4] |= (gint64) (0xff & cbuffer[39]); buffer[5] |= ((gint64) (0xff & cbuffer[40]) << 56); buffer[5] |= ((gint64) (0xff & cbuffer[41]) << 48); buffer[5] |= ((gint64) (0xff & cbuffer[42]) << 40); buffer[5] |= ((gint64) (0xff & cbuffer[43]) << 32); buffer[5] |= ((gint64) (0xff & cbuffer[44]) << 24); buffer[5] |= ((gint64) (0xff & cbuffer[45]) << 16); buffer[5] |= ((gint64) (0xff & cbuffer[46]) << 8); buffer[5] |= (gint64) (0xff & cbuffer[47]); buffer[6] |= ((gint64) (0xff & cbuffer[48]) << 56); buffer[6] |= ((gint64) (0xff & cbuffer[49]) << 48); buffer[6] |= ((gint64) (0xff & cbuffer[50]) << 32); buffer[6] |= ((gint64) (0xff & cbuffer[52]) << 24); buffer[6] |= ((gint64) (0xff & cbuffer[51]) << 16); buffer[6] |= ((gint64) (0xff & cbuffer[52]) << 40); buffer[6] |= ((gint64) (0xff & cbuffer[53]) << 8); buffer[6] |= (gint64) (0xff & cbuffer[54]); buffer[7] |= ((gint64) (0xff & cbuffer[56]) << 56); buffer[7] |= ((gint64) (0xff & cbuffer[57]) << 48); buffer[7] |= ((gint64) (0xff & cbuffer[58]) << 40); buffer[7] |= ((gint64) (0xff & cbuffer[59]) << 32); buffer[7] |= ((gint64) (0xff & cbuffer[60]) << 24); buffer[7] |= ((gint64) (0xff & cbuffer[61]) << 16); buffer[7] |= ((gint64) (0xff & cbuffer[62]) << 8); buffer[7] |= (gint64) (0xff & cbuffer[63]); buffer += 8; cbuffer += (8 * 8); } } for(; i < buffer_size / 8; i++){ buffer[0] |= ((gint64) (0xff & cbuffer[0]) << 56); buffer[0] |= ((gint64) (0xff & cbuffer[1]) << 48); buffer[0] |= ((gint64) (0xff & cbuffer[2]) << 40); buffer[0] |= ((gint64) (0xff & cbuffer[3]) << 32); buffer[0] |= ((gint64) (0xff & cbuffer[4]) << 24); buffer[0] |= ((gint64) (0xff & cbuffer[5]) << 16); buffer[0] |= ((gint64) (0xff & cbuffer[6]) << 8); buffer[0] |= (gint64) (0xff & cbuffer[7]); buffer++; cbuffer += 8; } return(start_buffer); } /** * ags_buffer_util_char_buffer_to_float: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gfloat buffer * * Returns: (transfer full): the gfloat buffer * * Since: 3.0.0 */ gfloat* ags_buffer_util_char_buffer_to_float(guchar *cbuffer, guint buffer_size) { gfloat *buffer, *start_buffer; start_buffer = buffer = (gfloat *) malloc((buffer_size / sizeof(gfloat)) * sizeof(gfloat)); buffer_size = (guint) (sizeof(gfloat) * floor(buffer_size / sizeof(gfloat))); memcpy(buffer, cbuffer, buffer_size * sizeof(guchar)); return(start_buffer); } /** * ags_buffer_util_char_buffer_to_double: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a gdouble buffer * * Returns: (transfer full): the gdouble buffer * * Since: 3.0.0 */ gdouble* ags_buffer_util_char_buffer_to_double(guchar *cbuffer, guint buffer_size) { gdouble *buffer, *start_buffer; start_buffer = buffer = (gdouble *) malloc((buffer_size / sizeof(gdouble)) * sizeof(gdouble)); buffer_size = (guint) (sizeof(gdouble) * floor(buffer_size / sizeof(gdouble))); memcpy(buffer, cbuffer, buffer_size * sizeof(guchar)); return(start_buffer); } /** * ags_buffer_util_char_buffer_to_complex: * @cbuffer: the guchar buffer * @buffer_size: the buffer size * * Unpack @cbuffer to a #AgsComplex buffer * * Returns: (transfer full): the #AgsComplex buffer * * Since: 3.0.0 */ AgsComplex* ags_buffer_util_char_buffer_to_complex(guchar *cbuffer, guint buffer_size) { AgsComplex *buffer, *start_buffer; start_buffer = buffer = (AgsComplex *) malloc((buffer_size / sizeof(AgsComplex)) * sizeof(AgsComplex)); buffer_size = (guint) (sizeof(AgsComplex) * floor(buffer_size / sizeof(AgsComplex))); memcpy(buffer, cbuffer, buffer_size * sizeof(guchar)); return(start_buffer); } /** * ags_buffer_util_char_buffer_read_s8: * @cbuffer: the character buffer * @byte_order: reverse order, ignored here * * Read a gint8 quantity of @cbuffer. * * Returns: the gint8 value * * Since: 3.0.0 */ gint8 ags_buffer_util_char_buffer_read_s8(guchar *cbuffer, guint byte_order) { gint8 val; val = 0; val |= cbuffer[0]; return(val); } /** * ags_buffer_util_char_buffer_read_s16: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a gint16 quantity of @cbuffer. * * Returns: the gint16 value * * Since: 3.0.0 */ gint16 ags_buffer_util_char_buffer_read_s16(guchar *cbuffer, guint byte_order) { gint16 val; val = 0; if(byte_order == AGS_BYTE_ORDER_BE){ val |= (cbuffer[0]); val |= (cbuffer[1] << 8); }else{ val |= (cbuffer[0] << 8); val |= (cbuffer[1]); } return(val); } /** * ags_buffer_util_char_buffer_read_s24: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a gint32 24 bit quantity of @cbuffer. * * Returns: the gint32 value * * Since: 3.0.0 */ gint32 ags_buffer_util_char_buffer_read_s24(guchar *cbuffer, guint byte_order) { gint32 val; val = 0; if(byte_order == AGS_BYTE_ORDER_BE){ val |= (cbuffer[0]); val |= (cbuffer[1] << 8); val |= (cbuffer[2] << 16); }else{ val |= (cbuffer[0] << 16); val |= (cbuffer[1] << 8); val |= (cbuffer[2]); } return(val); } /** * ags_buffer_util_char_buffer_read_s32: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a gint32 32 bit quantity of @cbuffer. * * Returns: the gint32 value * * Since: 3.0.0 */ gint32 ags_buffer_util_char_buffer_read_s32(guchar *cbuffer, guint byte_order) { gint32 val; val = 0; if(byte_order == AGS_BYTE_ORDER_BE){ val |= (cbuffer[0]); val |= (cbuffer[1] << 8); val |= (cbuffer[2] << 16); val |= (cbuffer[3] << 24); }else{ val |= (cbuffer[0] << 24); val |= (cbuffer[1] << 16); val |= (cbuffer[2] << 8); val |= (cbuffer[3]); } return(val); } /** * ags_buffer_util_char_buffer_read_s64: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a gint64 64 bit quantity of @cbuffer. * * Returns: the gint64 value * * Since: 3.0.0 */ gint64 ags_buffer_util_char_buffer_read_s64(guchar *cbuffer, guint byte_order) { gint64 val; val = 0; if(byte_order == AGS_BYTE_ORDER_BE){ val |= ((gint64) cbuffer[0]); val |= ((gint64) cbuffer[1] << 8); val |= ((gint64) cbuffer[2] << 16); val |= ((gint64) cbuffer[3] << 24); val |= ((gint64) cbuffer[4] << 32); val |= ((gint64) cbuffer[5] << 40); val |= ((gint64) cbuffer[6] << 48); val |= ((gint64) cbuffer[7] << 56); }else{ val |= ((gint64) cbuffer[0] << 56); val |= ((gint64) cbuffer[1] << 48); val |= ((gint64) cbuffer[2] << 40); val |= ((gint64) cbuffer[3] << 32); val |= ((gint64) cbuffer[4] << 24); val |= ((gint64) cbuffer[5] << 16); val |= ((gint64) cbuffer[6] << 8); val |= ((gint64) cbuffer[7]); } return(val); } /** * ags_buffer_util_char_buffer_read_float: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a gfloat quantity of @cbuffer. * * Returns: the gfloat value * * Since: 3.0.0 */ gfloat ags_buffer_util_char_buffer_read_float(guchar *cbuffer, guint byte_order) { union{ guint32 val; GFloatIEEE754 ieee_float; }data; data.val = 0; if(byte_order == AGS_BYTE_ORDER_BE){ data.val |= (cbuffer[0]); data.val |= (cbuffer[1] << 8); data.val |= (cbuffer[2] << 16); data.val |= (cbuffer[3] << 24); }else{ data.val |= (cbuffer[0] << 24); data.val |= (cbuffer[1] << 16); data.val |= (cbuffer[2] << 8); data.val |= (cbuffer[3]); } return(data.ieee_float.v_float); } /** * ags_buffer_util_char_buffer_read_double: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a gdouble quantity of @cbuffer. * * Returns: the gdouble value * * Since: 3.0.0 */ gdouble ags_buffer_util_char_buffer_read_double(guchar *cbuffer, guint byte_order) { union{ guint64 val; GDoubleIEEE754 ieee_double; }data; data.val = 0; if(byte_order == AGS_BYTE_ORDER_BE){ data.val |= ((guint64) cbuffer[0]); data.val |= ((guint64) cbuffer[1] << 8); data.val |= ((guint64) cbuffer[2] << 16); data.val |= ((guint64) cbuffer[3] << 24); data.val |= ((guint64) cbuffer[4] << 32); data.val |= ((guint64) cbuffer[5] << 40); data.val |= ((guint64) cbuffer[6] << 48); data.val |= ((guint64) cbuffer[7] << 56); }else{ data.val |= ((guint64) cbuffer[0] << 56); data.val |= ((guint64) cbuffer[1] << 48); data.val |= ((guint64) cbuffer[2] << 40); data.val |= ((guint64) cbuffer[3] << 32); data.val |= ((guint64) cbuffer[4] << 24); data.val |= ((guint64) cbuffer[5] << 16); data.val |= ((guint64) cbuffer[6] << 8); data.val |= ((guint64) cbuffer[7]); } return(data.ieee_double.v_double); } /** * ags_buffer_util_char_buffer_read_complex: * @cbuffer: the character buffer * @byte_order: reverse order * * Read a #AgsComplex quantity of @cbuffer. * * Returns: the #AgsComplex value * * Since: 3.0.0 */ AgsComplex* ags_buffer_util_char_buffer_read_complex(guchar *cbuffer, guint byte_order) { union{ guchar val[sizeof(AgsComplex)]; AgsComplex c_val; }data; guint i; for(i = 0; i < sizeof(AgsComplex); i++){ if(byte_order == AGS_BYTE_ORDER_BE){ data.val[i] = cbuffer[i]; }else{ data.val[i] = cbuffer[sizeof(AgsComplex) - i - 1]; } } return(ags_complex_copy(&(data.c_val))); } /** * ags_buffer_util_char_buffer_write_s8: * @cbuffer: the character buffer * @value: the gint8 value * @byte_order: reverse order * * Write a gint8 quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_s8(guchar *cbuffer, gint8 value, guint byte_order) { cbuffer[0] = value; } /** * ags_buffer_util_char_buffer_write_s16: * @cbuffer: the character buffer * @value: the gint16 value * @byte_order: reverse order * * Write a gint16 quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_s16(guchar *cbuffer, gint16 value, guint byte_order) { if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[0] = (0xff & value); cbuffer[1] = (0xff00 & value) >> 8; }else{ cbuffer[0] = (0xff00 & value) >> 8; cbuffer[1] = (0xff & value); } } /** * ags_buffer_util_char_buffer_write_s24: * @cbuffer: the character buffer * @value: the gint32 value * @byte_order: reverse order * * Write a gint32 quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_s24(guchar *cbuffer, gint32 value, guint byte_order) { if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[0] = (0xff & value); cbuffer[1] = (0xff00 & value) >> 8; cbuffer[2] = (0xff0000 & value) >> 16; }else{ cbuffer[0] = (0xff0000 & value) >> 16; cbuffer[1] = (0xff00 & value) >> 8; cbuffer[2] = (0xff & value); } } /** * ags_buffer_util_char_buffer_write_s32: * @cbuffer: the character buffer * @value: the gint32 value * @byte_order: reverse order * * Write a gint32 quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_s32(guchar *cbuffer, gint32 value, guint byte_order) { if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[0] = (0xff & value); cbuffer[1] = (0xff00 & value) >> 8; cbuffer[2] = (0xff0000 & value) >> 16; cbuffer[3] = (0xff000000 & value) >> 24; }else{ cbuffer[0] = (0xff000000 & value) >> 24; cbuffer[1] = (0xff0000 & value) >> 16; cbuffer[2] = (0xff00 & value) >> 8; cbuffer[3] = (0xff & value); } } /** * ags_buffer_util_char_buffer_write_s64: * @cbuffer: the character buffer * @value: the gint64 value * @byte_order: reverse order * * Write a gint64 quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_s64(guchar *cbuffer, gint64 value, guint byte_order) { if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[0] = (0xff & value); cbuffer[1] = (0xff00 & value) >> 8; cbuffer[2] = (0xff0000 & value) >> 16; cbuffer[3] = (0xff000000 & value) >> 24; cbuffer[4] = (0xff00000000 & value) >> 32; cbuffer[5] = (0xff0000000000 & value) >> 40; cbuffer[6] = (0xff000000000000 & value) >> 48; cbuffer[7] = (0xff00000000000000 & value) >> 56; }else{ cbuffer[0] = (0xff00000000000000 & value) >> 56; cbuffer[1] = (0xff000000000000 & value) >> 48; cbuffer[2] = (0xff0000000000 & value) >> 40; cbuffer[3] = (0xff00000000 & value) >> 32; cbuffer[4] = (0xff000000 & value) >> 24; cbuffer[5] = (0xff0000 & value) >> 16; cbuffer[6] = (0xff00 & value) >> 8; cbuffer[7] = (0xff & value); } } /** * ags_buffer_util_char_buffer_write_float: * @cbuffer: the character buffer * @value: the gfloat value * @byte_order: reverse order * * Write a gfloat quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_float(guchar *cbuffer, gfloat value, guint byte_order) { union{ guint32 val; GFloatIEEE754 ieee_float; }data; data.ieee_float.v_float = value; if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[0] = (0xff & data.val); cbuffer[1] = (0xff00 & data.val) >> 8; cbuffer[2] = (0xff0000 & data.val) >> 16; cbuffer[3] = (0xff000000 & data.val) >> 24; }else{ cbuffer[0] = (0xff000000 & data.val) >> 24; cbuffer[1] = (0xff0000 & data.val) >> 16; cbuffer[2] = (0xff00 & data.val) >> 8; cbuffer[3] = (0xff & data.val); } } /** * ags_buffer_util_char_buffer_write_double: * @cbuffer: the character buffer * @value: the gdouble value * @byte_order: reverse order * * Write a gdouble quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_double(guchar *cbuffer, gdouble value, guint byte_order) { union{ guint64 val; GDoubleIEEE754 ieee_double; }data; data.ieee_double.v_double = value; if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[0] = (0xff & data.val); cbuffer[1] = (0xff00 & data.val) >> 8; cbuffer[2] = (0xff0000 & data.val) >> 16; cbuffer[3] = (0xff000000 & data.val) >> 24; cbuffer[4] = (0xff00000000 & data.val) >> 32; cbuffer[5] = (0xff0000000000 & data.val) >> 40; cbuffer[6] = (0xff000000000000 & data.val) >> 48; cbuffer[7] = (0xff00000000000000 & data.val) >> 56; }else{ cbuffer[0] = (0xff00000000000000 & data.val) >> 56; cbuffer[1] = (0xff000000000000 & data.val) >> 48; cbuffer[2] = (0xff0000000000 & data.val) >> 40; cbuffer[3] = (0xff00000000 & data.val) >> 32; cbuffer[4] = (0xff000000 & data.val) >> 24; cbuffer[5] = (0xff0000 & data.val) >> 16; cbuffer[6] = (0xff00 & data.val) >> 8; cbuffer[7] = (0xff & data.val); } } /** * ags_buffer_util_char_buffer_write_complex: * @cbuffer: the character buffer * @value: the #AgsComplex value * @byte_order: reverse order * * Write a #AgsComplex quantity to @cbuffer. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_write_complex(guchar *cbuffer, AgsComplex *value, guint byte_order) { union{ guchar val[sizeof(AgsComplex)]; AgsComplex c_val; }data; guint i; ags_complex_set(&(data.c_val), ags_complex_get(value)); for(i = 0; i < sizeof(AgsComplex); i++){ if(byte_order == AGS_BYTE_ORDER_BE){ cbuffer[i] = data.val[i]; }else{ cbuffer[i] = data.val[sizeof(AgsComplex) - i - 1]; } } } /** * ags_buffer_util_char_buffer_swap_bytes: * @cbuffer: the buffer to swap * @word_size: the word size * @buffer_size: the buffer size * * Swap bytes in view of Little/Big-Endian. * * Since: 3.0.0 */ void ags_buffer_util_char_buffer_swap_bytes(guchar *cbuffer, guint word_size, guint buffer_size) { guchar tmp_buffer[8]; guint i, j; if(word_size <= 1){ return; } buffer_size = (guint) (word_size * floor(buffer_size / word_size)); for(i = 0; i < buffer_size; i += word_size){ for(j = 0; j < word_size; j++){ tmp_buffer[j] = cbuffer[i + (word_size - j - 1)]; } for(j = 0; j < word_size; j++){ cbuffer[i + j] = tmp_buffer[j]; } } } gsequencer-3.1.3/ags/lib/ags_complex.h0000644000175000017500000000265313607210263014600 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COMPLEX__ #define __AGS_COMPLEX__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_COMPLEX (ags_complex_get_type()) #define AGS_COMPLEX_M_E (M_E + I * 0.0) #define AGS_COMPLEX_M_PI (M_PI + I * 0.0) typedef struct _AgsComplex AgsComplex; struct _AgsComplex { gdouble real; gdouble imag; }; GType ags_complex_get_type(void); AgsComplex* ags_complex_alloc(); gpointer ags_complex_copy(AgsComplex *ptr); void ags_complex_free(AgsComplex *ptr); complex ags_complex_get(AgsComplex *ptr); void ags_complex_set(AgsComplex *ptr, complex z); G_END_DECLS #endif /*__AGS_COMPLEX__*/ gsequencer-3.1.3/ags/lib/AUTHORS0000644000175000017500000000010613461636434013177 00000000000000Joël Krähemann Spencer Kimball Peter Mattis gsequencer-3.1.3/ags/lib/ags_solver_vector.h0000644000175000017500000000420713607210263016022 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOLVER_VECTOR_H__ #define __AGS_SOLVER_VECTOR_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SOLVER_VECTOR (ags_solver_vector_get_type()) #define AGS_SOLVER_VECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOLVER_VECTOR, AgsSolverVector)) #define AGS_SOLVER_VECTOR_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SOLVER_VECTOR, AgsSolverVectorClass)) #define AGS_IS_SOLVER_VECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SOLVER_VECTOR)) #define AGS_IS_SOLVER_VECTOR_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SOLVER_VECTOR)) #define AGS_SOLVER_VECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SOLVER_VECTOR, AgsSolverVectorClass)) #define AGS_SOLVER_VECTOR_GET_OBJ_MUTEX(obj) (&(((AgsSolverVector *) obj)->obj_mutex)) typedef struct _AgsSolverVector AgsSolverVector; typedef struct _AgsSolverVectorClass AgsSolverVectorClass; struct _AgsSolverVector { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *term; gchar *term_exp; AgsComplex *numeric_value; gchar *symbol; AgsComplex *exp_value; }; struct _AgsSolverVectorClass { GObjectClass gobject; }; GType ags_solver_vector_get_type(void); AgsSolverVector* ags_solver_vector_new(); G_END_DECLS #endif /*__AGS_SOLVER_VECTOR_H__*/ gsequencer-3.1.3/ags/lib/ags_conversion.c0000644000175000017500000002036213607210263015306 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_conversion_class_init(AgsConversionClass *conversion); void ags_conversion_init (AgsConversion *conversion); void ags_conversion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_conversion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_conversion_finalize(GObject *gobject); gdouble ags_conversion_real_convert(AgsConversion *conversion, gdouble x, gboolean reverse); /** * SECTION:ags_conversion * @short_description: abstract conversion * @title: AgsConversion * @section_id: * @include: ags/lib/ags_conversion.h * * AgsConversion does a zero conversion it returns * during ::convert() the very same value. */ enum{ CONVERT, LAST_SIGNAL, }; enum{ PROP_0, PROP_NAME, PROP_DESCRIPTION, }; static gpointer ags_conversion_parent_class = NULL; static guint conversion_signals[LAST_SIGNAL]; GType ags_conversion_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_conversion = 0; static const GTypeInfo ags_conversion_info = { sizeof (AgsConversionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_conversion_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsConversion), 0, /* n_preallocs */ (GInstanceInitFunc) ags_conversion_init, }; ags_type_conversion = g_type_register_static(G_TYPE_OBJECT, "AgsConversion", &ags_conversion_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_conversion); } return g_define_type_id__volatile; } void ags_conversion_class_init(AgsConversionClass *conversion) { GObjectClass *gobject; GParamSpec *param_spec; ags_conversion_parent_class = g_type_class_peek_parent(conversion); /* GObjectClass */ gobject = (GObjectClass *) conversion; gobject->set_property = ags_conversion_set_property; gobject->get_property = ags_conversion_get_property; gobject->finalize = ags_conversion_finalize; /* properties */ /** * AgsConversion:name: * * The name of the conversion. * * Since: 3.0.0 */ param_spec = g_param_spec_string("name", i18n_pspec("name of conversion"), i18n_pspec("The name of the conversion"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NAME, param_spec); /** * AgsConversion:description: * * The description of the conversion. * * Since: 3.0.0 */ param_spec = g_param_spec_string("description", i18n_pspec("description of conversion"), i18n_pspec("The description of the conversion"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DESCRIPTION, param_spec); /* AgsConversionClass */ conversion->convert = ags_conversion_real_convert; /* signals */ /** * AgsConversion::convert: * @conversion: the #AgsConversion to modify * @x: the value to convert * @reverse: the direction to translate * * The ::convert signal notifies about converted value. * * Returns: the converted value * * Since: 3.0.0 */ conversion_signals[CONVERT] = g_signal_new("convert", G_TYPE_FROM_CLASS(conversion), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsConversionClass, convert), NULL, NULL, ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN, G_TYPE_DOUBLE, 2, G_TYPE_DOUBLE, G_TYPE_BOOLEAN); } void ags_conversion_init(AgsConversion *conversion) { g_rec_mutex_init(&(conversion->obj_mutex)); conversion->name = NULL; conversion->description = NULL; } void ags_conversion_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsConversion *conversion; GRecMutex *conversion_mutex; conversion = AGS_CONVERSION(gobject); /* get conversion mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(conversion); switch(prop_id){ case PROP_NAME: { gchar *name; name = (gchar *) g_value_get_string(value); g_rec_mutex_lock(conversion_mutex); if(conversion->name == name){ g_rec_mutex_unlock(conversion_mutex); return; } if(conversion->name != NULL){ g_free(conversion->name); } conversion->name = g_strdup(name); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_DESCRIPTION: { gchar *description; description = (gchar *) g_value_get_string(value); g_rec_mutex_lock(conversion_mutex); if(conversion->description == description){ g_rec_mutex_unlock(conversion_mutex); return; } if(conversion->description != NULL){ g_free(conversion->description); } conversion->description = g_strdup(description); g_rec_mutex_unlock(conversion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_conversion_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsConversion *conversion; GRecMutex *conversion_mutex; conversion = AGS_CONVERSION(gobject); /* get conversion mutex */ conversion_mutex = AGS_CONVERSION_GET_OBJ_MUTEX(conversion); switch(prop_id){ case PROP_NAME: { g_rec_mutex_lock(conversion_mutex); g_value_set_string(value, conversion->name); g_rec_mutex_unlock(conversion_mutex); } break; case PROP_DESCRIPTION: { g_rec_mutex_lock(conversion_mutex); g_value_set_string(value, conversion->description); g_rec_mutex_unlock(conversion_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_conversion_finalize(GObject *gobject) { AgsConversion *conversion; conversion = AGS_CONVERSION(gobject); /* name */ if(conversion->name != NULL){ g_free(conversion->name); } /* description */ if(conversion->description != NULL){ g_free(conversion->description); } /* call parent */ G_OBJECT_CLASS(ags_conversion_parent_class)->finalize(gobject); } gdouble ags_conversion_real_convert(AgsConversion *conversion, gdouble value, gboolean reverse) { return(value); } /** * ags_conversion_convert: * @conversion: the #AgsConversion * @x: the value to convert * @reverse: the direction to convert * * Convert a value if @reverse is %FALSE then use the target format * otherwise if %TRUE convert back to original format. * * Returns: the converted value as gdouble * * Since: 3.0.0 */ gdouble ags_conversion_convert(AgsConversion *conversion, gdouble x, gboolean reverse) { gdouble retval; g_return_val_if_fail(AGS_IS_CONVERSION(conversion), x); g_object_ref((GObject *) conversion); g_signal_emit(G_OBJECT(conversion), conversion_signals[CONVERT], 0, x, reverse, &retval); g_object_unref((GObject *) conversion); return(retval); } /** * ags_conversion_new: * * Instantiate a new #AgsConversion. * * Returns: the new instance * * Since: 3.0.0 */ AgsConversion* ags_conversion_new() { AgsConversion *conversion; conversion = g_object_new(AGS_TYPE_CONVERSION, NULL); return(conversion); } gsequencer-3.1.3/ags/lib/ags_string_util.h0000644000175000017500000000220213607210263015462 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_STRING_UTIL__ #define __AGS_STRING_UTIL__ #include #include G_BEGIN_DECLS gchar* ags_string_util_escape_single_quote(gchar *str); guint ags_strv_length(gchar **str_array); gboolean ags_strv_contains(gchar **str_array, gchar *str); gint ags_strv_index(gchar **str_array, gchar *str); G_END_DECLS #endif /*__AGS_STRING_UTIL__*/ gsequencer-3.1.3/ags/lib/ags_endian.h0000644000175000017500000000227313607210263014365 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ENDIAN__ #define __AGS_ENDIAN__ #include #include G_BEGIN_DECLS /** * AgsByteOrder: * @AGS_BYTE_ORDER_LE: little endian * @AGS_BYTE_ORDER_BE: big endian * * Endianess. */ typedef enum{ AGS_BYTE_ORDER_LE, AGS_BYTE_ORDER_BE, }AgsByteOrder; gboolean ags_endian_host_is_le(); gboolean ags_endian_host_is_be(); gfloat ags_endian_swap_float(gfloat x); G_END_DECLS #endif /*__AGS_ENDIAN__*/ gsequencer-3.1.3/ags/lib/ags_log.c0000644000175000017500000000743713607210263013712 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_log_class_init(AgsLogClass *log); void ags_log_init (AgsLog *log); void ags_log_finalize(GObject *gobject); /** * SECTION:ags_log * @short_description: Log * @title: AgsLog * @section_id: * @include: ags/lib/ags_log.h * * The #AgsLog logging class. */ static gpointer ags_log_parent_class = NULL; AgsLog *ags_log = NULL; GType ags_log_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_log = 0; static const GTypeInfo ags_log_info = { sizeof (AgsLogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_log_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsLog), 0, /* n_preallocs */ (GInstanceInitFunc) ags_log_init, }; ags_type_log = g_type_register_static(G_TYPE_OBJECT, "AgsLog", &ags_log_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_log); } return g_define_type_id__volatile; } void ags_log_class_init(AgsLogClass *log) { GObjectClass *gobject; ags_log_parent_class = g_type_class_peek_parent(log); /* GObjectClass */ gobject = (GObjectClass *) log; gobject->finalize = ags_log_finalize; } void ags_log_init(AgsLog *log) { log->flags = 0; /* create mutex */ g_rec_mutex_init(&(log->obj_mutex)); log->messages = NULL; } void ags_log_finalize(GObject *gobject) { AgsLog *log; log = AGS_LOG(gobject); /* free messages and list */ g_list_free_full(g_atomic_pointer_get(&(log->messages)), g_free); if(log == ags_log){ ags_log = NULL; } /* call parent */ G_OBJECT_CLASS(ags_log_parent_class)->finalize(gobject); } /** * ags_log_get_instance: * * Get your logging instance. * * Returns: (transfer none): the #AgsLog instance * * Since: 3.0.0 */ AgsLog* ags_log_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_log == NULL){ ags_log = ags_log_new(); } g_mutex_unlock(&mutex); return(ags_log); } /** * ags_log_add_message: * @log: the #AgsLog * @str: (transfer full): the message * * Add a message to @log. * * Since: 3.0.0 */ void ags_log_add_message(AgsLog *log, gchar *str) { g_rec_mutex_lock(&(log->obj_mutex)); g_atomic_pointer_set(&(log->messages), g_list_prepend(g_atomic_pointer_get(&(log->messages)), g_strdup(str))); g_rec_mutex_unlock(&(log->obj_mutex)); } /** * ags_log_get_messages: * @log: the #AgsLog * * Get log messages as #GList-struct containing strings. * * Returns: (element-type utf8) (transfer none): the #GList-struct containing log messages * * Since: 3.0.0 */ GList* ags_log_get_messages(AgsLog *log) { return(g_atomic_pointer_get(&(log->messages))); } /** * ags_log_new: * * Instantiate a new #AgsLog. * * Returns: the new instance * * Since: 3.0.0 */ AgsLog* ags_log_new() { AgsLog *log; log = g_object_new(AGS_TYPE_LOG, NULL); return(log); } gsequencer-3.1.3/ags/lib/ags_log.h0000644000175000017500000000360113607210263013704 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LOG_H__ #define __AGS_LOG_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_LOG (ags_log_get_type()) #define AGS_LOG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_LOG, AgsLog)) #define AGS_LOG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_LOG, AgsLogClass)) #define AGS_IS_LOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_LOG)) #define AGS_IS_LOG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_LOG)) #define AGS_LOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_LOG, AgsLogClass)) #define AGS_LOG_GET_OBJ_MUTEX(obj) (&(((AgsLog *) obj)->obj_mutex)) typedef struct _AgsLog AgsLog; typedef struct _AgsLogClass AgsLogClass; struct _AgsLog { GObject gobject; guint flags; GRecMutex obj_mutex; volatile GList *messages; }; struct _AgsLogClass { GObjectClass gobject; }; GType ags_log_get_type(void); void ags_log_add_message(AgsLog *log, gchar *str); GList* ags_log_get_messages(AgsLog *log); AgsLog* ags_log_get_instance(); AgsLog* ags_log_new(); G_END_DECLS #endif /*__AGS_LOG_H__*/ gsequencer-3.1.3/ags/lib/ags_uuid.c0000644000175000017500000000703713614062654014102 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include /** * SECTION:ags_uuid * @short_description: Boxed type of uuid * @title: AgsUUID * @section_id: * @include: ags/lib/ags_uuid.h * * Boxed type of uuid_t data type. */ GType ags_uuid_get_type(void) { static GType ags_type_uuid = 0; if(!ags_type_uuid){ ags_type_uuid = g_boxed_type_register_static("AgsUUID", (GBoxedCopyFunc) ags_uuid_copy, (GBoxedFreeFunc) ags_uuid_free); } return(ags_type_uuid); } /** * ags_uuid_alloc: * * Allocate #AgsUUID. * * Returns: a new #AgsUUID * * Since: 3.0.0 */ AgsUUID* ags_uuid_alloc() { AgsUUID *ptr; ptr = (AgsUUID *) malloc(sizeof(AgsUUID)); memset(ptr, 0, sizeof(AgsUUID)); return(ptr); } /** * ags_uuid_copy: * @ptr: the original #AgsUUID * * Create a copy of @ptr. * * Returns: a pointer of the new #AgsUUID * * Since: 3.0.0 */ gpointer ags_uuid_copy(AgsUUID *ptr) { AgsUUID *new_ptr; new_ptr = (AgsUUID *) malloc(sizeof(AgsUUID)); memcpy(new_ptr->data, ptr->data, sizeof(AgsUUID)); return(new_ptr); } /** * ags_uuid_free: * @ptr: the #AgsUUID * * Free the memory of @ptr. * * Since: 3.0.0 */ void ags_uuid_free(AgsUUID *ptr) { g_free(ptr); } /** * ags_uuid_generate: * @ptr: the #AgsUUID * * Generate random UUID. * * Since: 3.0.0 */ void ags_uuid_generate(AgsUUID *ptr) { if(ptr == NULL){ return; } #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) uuid_generate_time(ptr->data); #else uuid_generate_time_safe(ptr->data); #endif } /** * ags_uuid_compare: * @a: an #AgsUUID * @b: another #AgsUUID * * Compare @a with @b. * * Returns: 0 on success, otherwise a value less or greater than 0 * * Since: 3.0.0 */ gint ags_uuid_compare(AgsUUID *a, AgsUUID *b) { gint retval; retval = uuid_compare(a->data, b->data); return(retval); } /** * ags_uuid_to_string: * @ptr: the #AgsUUID * * Get string representation of @ptr. * * Returns: (transfer full): the UUID as string if @ptr not %NULL, else %NULL * * Since: 3.0.0 */ gchar* ags_uuid_to_string(AgsUUID *ptr) { gchar *uuid_str; if(ptr == NULL){ return(NULL); } uuid_str = (gchar *) malloc((AGS_UUID_STRING_DEFAULT_LENGTH + 1) * sizeof(gchar)); uuid_unparse(ptr->data, uuid_str); return(uuid_str); } /** * ags_uuid_from_string: * @str: the UUID as string * * Retrieve #AgsUUID by parsing @str. * * Returns: the new #AgsUUID on success, otherwise %NULL * * Since: 3.0.0 */ AgsUUID* ags_uuid_from_string(gchar *str) { AgsUUID *id; int retval; if(str == NULL){ return(NULL); } id = ags_uuid_alloc(); retval = uuid_parse(str, id->data); if(retval != 0){ ags_uuid_free(id); return(NULL); } return(id); } gsequencer-3.1.3/ags/lib/ags_turtle_manager.h0000644000175000017500000000440613607210263016140 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TURTLE_MANAGER_H__ #define __AGS_TURTLE_MANAGER_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_TURTLE_MANAGER (ags_turtle_manager_get_type()) #define AGS_TURTLE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TURTLE_MANAGER, AgsTurtleManager)) #define AGS_TURTLE_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TURTLE_MANAGER, AgsTurtleManagerClass)) #define AGS_IS_TURTLE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TURTLE_MANAGER)) #define AGS_IS_TURTLE_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TURTLE_MANAGER)) #define AGS_TURTLE_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_TURTLE_MANAGER, AgsTurtleManagerClass)) #define AGS_TURTLE_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsTurtleManager *) obj)->obj_mutex)) typedef struct _AgsTurtleManager AgsTurtleManager; typedef struct _AgsTurtleManagerClass AgsTurtleManagerClass; struct _AgsTurtleManager { GObject gobject; GRecMutex obj_mutex; GList *turtle; }; struct _AgsTurtleManagerClass { GObjectClass gobject; }; GType ags_turtle_manager_get_type(void); GObject* ags_turtle_manager_find(AgsTurtleManager *turtle_manager, gchar *filename); void ags_turtle_manager_add(AgsTurtleManager *turtle_manager, GObject *turtle); /* */ AgsTurtleManager* ags_turtle_manager_get_instance(); AgsTurtleManager* ags_turtle_manager_new(); G_END_DECLS #endif /*__AGS_TURTLE_MANAGER_H__*/ gsequencer-3.1.3/ags/lib/ags_regex.c0000644000175000017500000000643013607210263014233 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #define _GNU_SOURCE #include #include #include #include /** * SECTION:ags_regex * @short_description: coding-neutral regex * @title: AgsRegex * @section_id: * @include: ags/lib/ags_regex.h * * Wrapper around glibc regex functions to provide language coding-neutral * processing. */ static GMutex locale_mutex; #if defined __APPLE__ || AGS_W32API static char *locale_env; #else static locale_t c_locale; #endif static gboolean locale_initialized = FALSE; /** * ags_regcomp: * @preg: pattern buffer storage area * @regex: regular expression as string * @cflags: flags * * Compile regular expression language independent. It sets temporaly * the locale to C and then reverts it. * * Since: 3.0.0 */ int ags_regcomp(regex_t *preg, const char *regex, int cflags) { int retval; #if defined __APPLE__ || AGS_W32API #else locale_t current; #endif g_mutex_lock(&locale_mutex); if(!locale_initialized){ #if defined __APPLE__ || AGS_W32API locale_env = getenv("LC_ALL"); #else c_locale = newlocale(LC_ALL_MASK, "C", (locale_t) 0); #endif locale_initialized = TRUE; } g_mutex_unlock(&locale_mutex); #if defined __APPLE__ || AGS_W32API setlocale(LC_ALL, "C"); #else current = uselocale(c_locale); #endif retval = regcomp(preg, regex, cflags); #if defined __APPLE__ || AGS_W32API setlocale(LC_ALL, locale_env); #else uselocale(current); #endif return(retval); } /** * ags_regexec: * @preg: pattern buffer storage area * @string: the string to match * @nmatch: match count * @pmatch: match array * @eflags: error flags * * Execute regular expression language independent. It sets temporaly * the locale to C and then reverts it. * * Since: 3.0.0 */ int ags_regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) { int retval; #if defined __APPLE__ || AGS_W32API #else locale_t current; #endif g_mutex_lock(&locale_mutex); if(!locale_initialized){ #if defined __APPLE__ || AGS_W32API locale_env = getenv("LC_ALL"); #else c_locale = newlocale(LC_ALL_MASK, "C", (locale_t) 0); #endif locale_initialized = TRUE; } g_mutex_unlock(&locale_mutex); #if defined __APPLE__ || AGS_W32API setlocale(LC_ALL, "C"); #else current = uselocale(c_locale); #endif retval = regexec(preg, string, nmatch, pmatch, eflags); #if defined __APPLE__ || AGS_W32API setlocale(LC_ALL, locale_env); #else uselocale(current); #endif return(retval); } gsequencer-3.1.3/ags/lib/ags_string_util.c0000644000175000017500000000750313607210263015466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include /** * SECTION:ags_string_util * @short_description: string util * @title: AgsStringUtil * @section_id: * @include: ags/lib/ags_string_util.h * * Common string utility functions. */ /** * ags_string_util_escape_single_quote: * @str: the string to escape * * Escape all occurence of single quotes. * * Returns: (transfer full): the newly allocated string * * Since: 3.0.0 */ gchar* ags_string_util_escape_single_quote(gchar *str) { gchar *retval; gchar *iter, *prev; guint count; guint n_chars; guint offset; iter = str; count = 0; while((iter = strchr(iter, '\'')) != NULL){ count++; iter++; } if(count > 0){ n_chars = strlen(str); retval = (gchar *) malloc((n_chars + (5 * count) + 1) * sizeof(gchar)); retval[n_chars + (5 * count)] = '\0'; iter = str; prev = str; offset = 0; while((iter = strchr(iter, '\'')) != NULL){ memcpy(&(retval[offset]), prev, (iter - prev) * sizeof(char)); retval[offset + (iter - prev)] = '&'; retval[offset + (iter - prev + 1)] = 'a'; retval[offset + (iter - prev + 2)] = 'p'; retval[offset + (iter - prev + 3)] = 'o'; retval[offset + (iter - prev + 4)] = 's'; retval[offset + (iter - prev + 5)] = ';'; offset += (iter - prev + 6); iter++; prev = iter; } memcpy(&(retval[offset]), prev, (strchr(str, '\0') - prev) * sizeof(char)); }else{ retval = g_strdup(str); } return(retval); } /** * ags_strv_length: * @str_array: (element-type utf8) (array zero-terminated=1) (transfer none): the string vector * * Count the number of non-%NULL entries in the array. * * Returns: the length of the vector * * Since: 3.0.0 */ guint ags_strv_length(gchar **str_array) { guint i; if(str_array == NULL){ return(0); } for(i = 0; *str_array != NULL; i++, str_array++); return(i); } /** * ags_strv_contains: * @str_array: (element-type utf8) (array zero-terminated=1) (transfer none): the string vector * @str: the string to match * * Check occurence of @str within @str_array * * Returns: %TRUE if found, else %FALSE * * Since: 3.0.0 */ gboolean ags_strv_contains(gchar **str_array, gchar *str) { guint i; if(str_array == NULL){ return(FALSE); } for(i = 0; str_array[0] != NULL; i++, str_array++){ if(str_array[0] == str || !g_strcmp0(str_array[0], str)){ return(TRUE); } } return(FALSE); } /** * ags_strv_index: * @str_array: (element-type utf8) (array zero-terminated=1) (transfer none): the string vector * @str: the string to match * * Check by comparing @str against @str_array items. * * Returns: the first matching position or -1, if not found * * Since: 3.0.0 */ gint ags_strv_index(gchar **str_array, gchar *str) { gint i; if(str_array == NULL){ return(-1); } for(i = 0; str_array[0] != NULL; i++, str_array++){ if(!g_strcmp0(str_array[0], str)){ return(i); } } return(-1); } gsequencer-3.1.3/ags/lib/ags_turtle.c0000644000175000017500000023124113607210263014440 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * SECTION:ags_turtle * @short_description: Terse RDF Triple Language * @title: AgsTurtle * @section_id: * @include: ags/lib/ags_turtle.h * * The #AgsTurtle object converts Terse RDF Triple Language files * into XML. */ void ags_turtle_class_init(AgsTurtleClass *turtle); void ags_turtle_init (AgsTurtle *turtle); void ags_turtle_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_turtle_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_turtle_finalize(GObject *gobject); gchar* ags_turtle_load_skip_comments_and_blanks(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_iriref(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_anon(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_pname_ns(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_pname_ln(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_numeric(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_string(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_langtag(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_literal(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_iri(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_prefix_id(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_base(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_sparql_prefix(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_sparql_base(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_prefixed_name(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_blank_node(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_statement(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_verb(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_predicate(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_object(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_directive(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_triple(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_subject(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_object_list(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_collection(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_blank_node_property_list(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); xmlNode* ags_turtle_load_read_predicate_object_list(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter); enum{ PROP_0, PROP_FILENAME, PROP_XML_DOC, }; static gpointer ags_turtle_parent_class = NULL; static GMutex regex_mutex; GType ags_turtle_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_turtle = 0; static const GTypeInfo ags_turtle_info = { sizeof (AgsTurtleClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_turtle_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTurtle), 0, /* n_preallocs */ (GInstanceInitFunc) ags_turtle_init, }; ags_type_turtle = g_type_register_static(G_TYPE_OBJECT, "AgsTurtle", &ags_turtle_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_turtle); } return g_define_type_id__volatile; } void ags_turtle_class_init(AgsTurtleClass *turtle) { GObjectClass *gobject; GParamSpec *param_spec; ags_turtle_parent_class = g_type_class_peek_parent(turtle); /* GObjectClass */ gobject = (GObjectClass *) turtle; gobject->set_property = ags_turtle_set_property; gobject->get_property = ags_turtle_get_property; gobject->finalize = ags_turtle_finalize; /* properties */ /** * AgsTurtle:filename: * * The assigned filename. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename of turtle"), i18n_pspec("The filename this turtle is assigned to"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsTurtle:xml-doc: * * The assigned xml-doc. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("xml-doc", i18n_pspec("xml document of turtle"), i18n_pspec("The xml document turtle was converted to"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_XML_DOC, param_spec); } void ags_turtle_init(AgsTurtle *turtle) { turtle->flags = AGS_TURTLE_TOLOWER; /* add turtle mutex */ g_rec_mutex_init(&(turtle->obj_mutex)); /* fields */ turtle->filename = NULL; turtle->doc = NULL; turtle->prefix_id = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } void ags_turtle_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsTurtle *turtle; GRecMutex *turtle_mutex; turtle = AGS_TURTLE(gobject); /* get turtle mutex */ turtle_mutex = AGS_TURTLE_GET_OBJ_MUTEX(turtle); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = (gchar *) g_value_get_string(value); g_rec_mutex_lock(turtle_mutex); if(turtle->filename == filename){ g_rec_mutex_unlock(turtle_mutex); return; } if(turtle->filename != NULL){ g_free(turtle->filename); } turtle->filename = g_strdup(filename); g_rec_mutex_unlock(turtle_mutex); } break; case PROP_XML_DOC: { xmlDoc *doc; doc = (xmlDoc *) g_value_get_pointer(value); g_rec_mutex_lock(turtle_mutex); turtle->doc = doc; g_rec_mutex_unlock(turtle_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_turtle_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsTurtle *turtle; GRecMutex *turtle_mutex; turtle = AGS_TURTLE(gobject); /* get turtle mutex */ turtle_mutex = AGS_TURTLE_GET_OBJ_MUTEX(turtle); switch(prop_id){ case PROP_FILENAME: { g_rec_mutex_lock(turtle_mutex); g_value_set_string(value, turtle->filename); g_rec_mutex_unlock(turtle_mutex); } break; case PROP_XML_DOC: { g_rec_mutex_lock(turtle_mutex); g_value_set_pointer(value, turtle->doc); g_rec_mutex_unlock(turtle_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_turtle_finalize(GObject *gobject) { AgsTurtle *turtle; gchar **str; turtle = AGS_TURTLE(gobject); if(turtle->filename != NULL){ g_free(turtle->filename); } if(turtle->doc != NULL){ xmlFreeDoc(turtle->doc); } g_hash_table_destroy(turtle->prefix_id); /* call parent */ G_OBJECT_CLASS(ags_turtle_parent_class)->finalize(gobject); } /** * ags_turtle_read_iriref: * @offset: the string pointer * @end_ptr: the end of @offset * * Read iriref value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_iriref(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t iriref_regex; static gboolean regex_compiled = FALSE; //FIXME:JK: do like in specs explained static const gchar *iriref_pattern = "^(<([^>\x20]*)>)"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&iriref_regex, iriref_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&iriref_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); #ifdef AGS_DEBUG g_message("iriref %s", str); #endif } return(str); } /** * ags_turtle_read_pname_ns: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed-name namespace value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pname_ns(gchar *offset, gchar *end_ptr) { gchar *pn_prefix; gchar *str; pn_prefix = ags_turtle_read_pn_prefix(offset, end_ptr); if(pn_prefix != NULL && &(offset[strlen(pn_prefix)]) < end_ptr && offset[strlen(pn_prefix)] == ':'){ str = g_strdup_printf("%s:", pn_prefix); }else{ if(offset[0] == ':'){ str = g_strdup(":"); }else{ str = NULL; } } if(pn_prefix != NULL){ free(pn_prefix); } return(str); } /** * ags_turtle_read_pname_ln: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed-name localized name value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pname_ln(gchar *offset, gchar *end_ptr) { gchar *pname_ns, *pn_local; gchar *str; str = NULL; pname_ns = ags_turtle_read_pname_ns(offset, end_ptr); pn_local = NULL; if(pname_ns != NULL){ offset += strlen(pname_ns); pn_local = ags_turtle_read_pn_local(offset, end_ptr); if(pn_local != NULL){ str = g_strdup_printf("%s%s", pname_ns, pn_local); } } if(pname_ns != NULL){ free(pname_ns); } if(pn_local != NULL){ free(pn_local); } return(str); } /** * ags_turtle_read_blank_node_label: * @offset: the string pointer * @end_ptr: the end of @offset * * Read blank node label value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_blank_node_label(gchar *offset, gchar *end_ptr) { gchar *str; gchar *tmp, *tmp_str; gboolean initial_find, found_str; gboolean last_is_point; if(offset + 2 >= end_ptr){ return(NULL); } str = NULL; tmp_str = NULL; if(!g_str_has_prefix(offset, "_:")){ return(NULL); } if((tmp = ags_turtle_read_pn_chars_u(offset + 2, end_ptr)) != NULL || g_ascii_isdigit(offset[2])){ if(tmp == NULL){ str = g_strdup_printf("_:%c", offset[2]); offset += 3; }else{ str = g_strdup_printf("_:%s", tmp); offset += (2 + strlen(tmp)); free(tmp); } } initial_find = TRUE; found_str = FALSE; last_is_point = FALSE; while(initial_find || found_str){ initial_find = FALSE; found_str = FALSE; last_is_point = FALSE; tmp = ags_turtle_read_pn_chars(offset, end_ptr); if(tmp == NULL){ if(*offset == '.'){ tmp_str = g_strdup_printf("%s.", str); free(str); str = tmp_str; offset++; found_str = TRUE; last_is_point = TRUE; }else{ if(initial_find){ return(NULL); }else{ break; } } }else{ tmp_str = g_strdup_printf("%s%s", str, tmp); offset += strlen(tmp); free(str); free(tmp); str = tmp_str; found_str = TRUE; } } if(last_is_point){ g_warning("ags_turtle.c - syntax error"); } return(str); } /** * ags_turtle_read_langtag: * @offset: the string pointer * @end_ptr: the end of @offset * * Read langtag value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_langtag(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t langtag_regex; static gboolean regex_compiled = FALSE; static const char *langtag_pattern = "^(@[a-zA-Z]+(-[a-zA-Z0-9]+)*)"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&langtag_regex, langtag_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&langtag_regex, offset, max_matches, match_arr, 0) == 0){ if(match_arr[0].rm_eo > match_arr[0].rm_so){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } } return(str); } /** * ags_turtle_read_boolean: * @offset: the string pointer * @end_ptr: the end of @offset * * Read boolean value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_boolean(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t boolean_literal_regex; static gboolean regex_compiled = FALSE; static const char *boolean_literal_pattern = "^(true|false)"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&boolean_literal_regex, boolean_literal_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&boolean_literal_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_integer: * @offset: the string pointer * @end_ptr: the end of @offset * * Read integer value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_integer(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t integer_literal_regex; static gboolean regex_compiled = FALSE; static const char *integer_literal_pattern = "^([+-]?[0-9]+)"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&integer_literal_regex, integer_literal_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&integer_literal_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_decimal: * @offset: the string pointer * @end_ptr: the end of @offset * * Read decimal value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_decimal(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t decimal_literal_regex; static gboolean regex_compiled = FALSE; static const char *decimal_literal_pattern = "^([\\+\\-]?[0-9]*\\.[0-9]+)"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&decimal_literal_regex, decimal_literal_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&decimal_literal_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_double: * @offset: the string pointer * @end_ptr: the end of @offset * * Read double value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_double(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t double_literal_regex; static gboolean regex_compiled = FALSE; static const char *double_literal_pattern = "^([\\+\\-]?(([0-9]+\\.[0-9]*[eE][\\+\\-]?[0-9]+)|(\\.[0-9]+[eE][\\+\\-]?[0-9]+)|([0-9]+[eE][+-]?[0-9]+)))"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&double_literal_regex, double_literal_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&double_literal_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_exponent: * @offset: the string pointer * @end_ptr: the end of @offset * * Read exponent value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_exponent(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t exponent_literal_regex; static gboolean regex_compiled = FALSE; static const char *exponent_literal_pattern = "^([eE][+-]?[0-9]+)"; static const size_t max_matches = 1; str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&exponent_literal_regex, exponent_literal_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&exponent_literal_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_string: * @offset: the string pointer * @end_ptr: the end of @offset * * Read string value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_string(gchar *offset, gchar *end_ptr) { gchar *str; str = ags_turtle_read_string_literal_long_quote(offset, end_ptr); if(str != NULL){ return(str); } str = ags_turtle_read_string_literal_long_single_quote(offset, end_ptr); if(str != NULL){ return(str); } str = ags_turtle_read_string_literal_quote(offset, end_ptr); if(str != NULL){ return(str); } str = ags_turtle_read_string_literal_single_quote(offset, end_ptr); if(str != NULL){ return(str); } return(NULL); } /** * ags_turtle_read_string_literal_quote: * @offset: the string pointer * @end_ptr: the end of @offset * * Read string literal quote value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_string_literal_quote(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t string_literal_double_quote_regex; static gboolean regex_compiled = FALSE; static const char *string_literal_double_quote_pattern = "^(\"((([\\\\]['])|[^\"])*)\")"; static const size_t max_matches = 1; if(offset >= end_ptr){ return(NULL); } str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&string_literal_double_quote_regex, string_literal_double_quote_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&string_literal_double_quote_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_string_literal_single_quote: * @offset: the string pointer * @end_ptr: the end of @offset * * Read string literal single quote value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_string_literal_single_quote(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t string_literal_single_quote_regex; static gboolean regex_compiled = FALSE; static const char *string_literal_single_quote_pattern = "^('((([\\\\]['])|[^'])*)')"; static const size_t max_matches = 1; if(offset >= end_ptr){ return(NULL); } str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&string_literal_single_quote_regex, string_literal_single_quote_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&string_literal_single_quote_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } return(str); } /** * ags_turtle_read_string_literal_long_quote: * @offset: the string pointer * @end_ptr: the end of @offset * * Read string literal long quote value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_string_literal_long_quote(gchar *offset, gchar *end_ptr) { gchar *str, *end; str = NULL; if(g_str_has_prefix(offset, "\"\"\"")){ end = offset + 3; while((end = strstr(end, "\"\"\"")) != NULL && *(end - 1) == '\\'){ end++; } if(end != NULL && end > offset){ str = g_strndup(offset, end - offset + 3); } } return(str); } /** * ags_turtle_read_string_literal_long_single_quote: * @offset: the string pointer * @end_ptr: the end of @offset * * Read string literal long single quote value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_string_literal_long_single_quote(gchar *offset, gchar *end_ptr) { gchar *str, *end; str = NULL; if(g_str_has_prefix(offset, "'''")){ end = offset + 3; while((end = strstr(end, "'''")) != NULL && *(end - 1) == '\\'){ end++; } if(end != NULL && end > offset){ str = g_strndup(offset, end - offset + 3); } } return(str); } /** * ags_turtle_read_uchar: * @offset: the string pointer * @end_ptr: the end of @offset * * Read uchar value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_uchar(gchar *offset, gchar *end_ptr) { gchar *str; guint hex_digit_count; guint i; gboolean success; if(offset + 1 >= end_ptr){ return(NULL); } str = NULL; if(g_str_has_prefix(offset, "\\u")){ hex_digit_count = 4; }else if(g_str_has_prefix(offset, "\\U")){ hex_digit_count = 8; }else{ return(NULL); } success = TRUE; for(i = 0; i < hex_digit_count; i++){ if(!g_ascii_isxdigit(offset[i + 2])){ success = FALSE; break; } } if(success){ str = g_strndup(offset, hex_digit_count + 2); } return(str); } /** * ags_turtle_read_echar: * @offset: the string pointer * @end_ptr: the end of @offset * * Read echar value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_echar(gchar *offset, gchar *end_ptr) { gchar *str; static const gchar *echar = "tbnrf\""; if(offset + 1 >= end_ptr){ return(NULL); } str = NULL; if(*offset == '\\'){ if(strchr(echar, offset[1]) != NULL){ str = g_strndup(offset, 2); } } return(str); } /** * ags_turtle_read_ws: * @offset: the string pointer * @end_ptr: the end of @offset * * Read ws value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_ws(gchar *offset, gchar *end_ptr) { gchar *str; static const gchar *ws = "\x20\x09\x0D\x0A"; str = NULL; if(offset < end_ptr && strchr(ws, *offset) != NULL){ str = g_strndup(offset, 1); } return(str); } /** * ags_turtle_read_anon: * @offset: the string pointer * @end_ptr: the end of @offset * * Read anon value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_anon(gchar *offset, gchar *end_ptr) { gchar *str; gchar *tmp, *tmp_str; gboolean success; static const gchar *ws = "\x20\x09\x0D\x0A"; if(offset >= end_ptr){ return(NULL); } str = NULL; success = FALSE; if(*offset == '['){ tmp = strchr(offset + 1, ']'); if(tmp != NULL){ success = TRUE; for(tmp_str = offset + 1; tmp_str < tmp; tmp_str++){ if(strchr(ws, *tmp_str) == NULL){ success = FALSE; break; } } } } if(success){ str = g_strndup(offset, tmp - offset + 1); } return(str); } #define AGS_TURTLE_UTF8_RANGE_0 "([A-Za-z])" #define AGS_TURTLE_UTF8_RANGE_1 "(\xC3[\x80-\x96])" #define AGS_TURTLE_UTF8_RANGE_2 "(\xC3[\x98-\xB6])" #define AGS_TURTLE_UTF8_RANGE_3 "((\xC3[\xB8-\xBF])|([\xC3-\xCA][\x80-\xBF])|(\xCB[\x80-\xBF]))" #define AGS_TURTLE_UTF8_RANGE_4 "(\xCD[\xB0-\xBD])" #define AGS_TURTLE_UTF8_RANGE_5 "((\xCD[\xBF-\xDF])|([\xCE-\xDF][\x80-\xBF])|([\xE0-\xE1][\x80-\xBF][\x80-\xBF]))" #define AGS_TURTLE_UTF8_RANGE_6 "(\xE2\x80[\x8C-\x8D])" #define AGS_TURTLE_UTF8_RANGE_7 "((\xE2\x81[\xB0-\xBF])|(\xE2[\x81-\x85][\x80-\xBF])|(\xE2\x86[\x80-\x8F]))" #define AGS_TURTLE_UTF8_RANGE_8 "((\xE2[\xB0-\xBE][\x80-\xBF])|(\xE2\xBF[\x80-\xAF]))" #define AGS_TURTLE_UTF8_RANGE_9 "((\xE3[\x80-\xBF][\x81-\xBF])|([\xE4-\xEC][\x80-\x9F][\x80-\xBF]))" #define AGS_TURTLE_UTF8_RANGE_10 "((\xEF[\xA4-\xB6][\x80-\xBF])|(\xEF\xB7[\x80-\x8F]))" #define AGS_TURTLE_UTF8_RANGE_11 "((\xEF\xB7[\xB0-\xBF])|(\xEF[\xB8-\xBE][\x80-\xBF])|(\xEF\xBF[\x80-\xBD]))" #define AGS_TURTLE_UTF8_RANGE_12 "(([\xF0-\xF3][\x90-\xAF][\x80-\xBF][\x80-\xBF]))" #define AGS_TURTLE_UTF8_RANGE_ALL "(" AGS_TURTLE_UTF8_RANGE_0 "|" \ AGS_TURTLE_UTF8_RANGE_1 "|" \ AGS_TURTLE_UTF8_RANGE_2 "|" \ AGS_TURTLE_UTF8_RANGE_3 "|" \ AGS_TURTLE_UTF8_RANGE_4 "|" \ AGS_TURTLE_UTF8_RANGE_5 "|" \ AGS_TURTLE_UTF8_RANGE_6 "|" \ AGS_TURTLE_UTF8_RANGE_7 "|" \ AGS_TURTLE_UTF8_RANGE_8 "|" \ AGS_TURTLE_UTF8_RANGE_9 "|" \ AGS_TURTLE_UTF8_RANGE_10 "|" \ AGS_TURTLE_UTF8_RANGE_11 "|" \ AGS_TURTLE_UTF8_RANGE_12 ")" #define AGS_TURLTE_UTF8_RANGE_ALL_PATTERN "^" AGS_TURTLE_UTF8_RANGE_ALL /** * ags_turtle_read_pn_chars_base: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed-name chars base value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pn_chars_base(gchar *offset, gchar *end_ptr) { #if 0 regmatch_t match_arr[1]; gchar *str; static regex_t chars_base_regex; static gboolean regex_compiled = FALSE; static const char *chars_base_pattern = AGS_TURLTE_UTF8_RANGE_ALL_PATTERN; static const size_t max_matches = 1; if(offset == NULL || offset >= end_ptr){ return(NULL); } str = NULL; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; if(ags_regcomp(&chars_base_regex, chars_base_pattern, REG_EXTENDED)){ g_warning("failed to compile regex: %s", chars_base_pattern); } } g_mutex_unlock(®ex_mutex); if(ags_regexec(&chars_base_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } #else gchar *str; gchar *look_ahead; gboolean success; if(offset == NULL || offset >= end_ptr){ return(NULL); } look_ahead = offset; str = NULL; success = TRUE; while(success && look_ahead < end_ptr){ if((look_ahead[0] >= 'a' && look_ahead[0] <= 'z') || (look_ahead[0] >= 'A' && look_ahead[0] <= 'Z')){ look_ahead++; }else if(look_ahead + 2 < end_ptr && ((look_ahead[0] == '\xC3' && ((look_ahead[1] >= '\x80' && look_ahead[1] <= '\x96') || (look_ahead[1] >= '\x98' && look_ahead[1] <= '\xB6') || (look_ahead[1] >= '\xB8' && look_ahead[1] <= '\xBF'))) || ((look_ahead[0] >= '\xC3' && look_ahead[0] <= '\xCA') && (look_ahead[1] >= '\x80' && look_ahead[1] <= '\xBF')) || (look_ahead[0] == '\xCB' && (look_ahead[1] >= '\x80' && look_ahead[1] <= '\xBF')) || (look_ahead[0] == '\xCD' && (look_ahead[1] >= '\xB0' && look_ahead[1] <= '\xBD')) || (look_ahead[0] == '\xCD' && (look_ahead[1] >= '\xBF' && look_ahead[1] <= '\xDF')) || ((look_ahead[0] >= '\xCE' && look_ahead[0] <= '\xDF') && (look_ahead[1] >= '\x80' && look_ahead[1] <= '\xBF')))){ look_ahead += 2; }else if(look_ahead + 3 < end_ptr && (((look_ahead[0] >= '\xE0' && look_ahead[0] <= '\xE1') && (look_ahead[1] >= '\x80' && look_ahead[1] <= '\xBF') && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xE2' && look_ahead[1] == '\x80' && (look_ahead[2] >= '\x8C' && look_ahead[2] <= '\x8D')) || (look_ahead[0] == '\xE2' && look_ahead[1] == '\x81' && (look_ahead[2] >= '\xB0' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xE2' && (look_ahead[1] >= '\x81' && look_ahead[1] <= '\x85') && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xE2' && look_ahead[1] == '\x86' && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\x8F')) || (look_ahead[0] == '\xE2' && (look_ahead[1] >= '\xB0' && look_ahead[1] <= '\xBE') && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xE2' && look_ahead[1] == '\xBF' && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xAF')) || (look_ahead[0] == '\xE3' && (look_ahead[1] >= '\xB0' && look_ahead[1] <= '\xBF') && (look_ahead[2] >= '\x81' && look_ahead[2] <= '\xBF')) || ((look_ahead[0] >= '\xE4') && look_ahead[0] <= '\xEC') && (look_ahead[1] >= '\x80' && look_ahead[1] <= '\x9F') && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xEF' && (look_ahead[1] >= '\xA4' && look_ahead[1] <= '\xB6') && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xEF' && look_ahead[1] == '\xB7' && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\x8F')) || (look_ahead[0] == '\xEF' && look_ahead[1] == '\xB7' && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xEF' && (look_ahead[1] >= '\xB8' && look_ahead[1] <= '\xBE') && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBF')) || (look_ahead[0] == '\xEF' && look_ahead[1] == '\xBF' && (look_ahead[2] >= '\x80' && look_ahead[2] <= '\xBD'))){ look_ahead += 3; }else if(look_ahead + 4 < end_ptr && ((look_ahead[0] == '\xF0' && look_ahead[0] == '\xF3') && (look_ahead[1] == '\x90' && look_ahead[1] == '\xAF') && (look_ahead[2] == '\x80' && look_ahead[2] == '\xBF') && (look_ahead[3] == '\x80' && look_ahead[3] == '\xBF'))){ look_ahead += 4; }else{ success = FALSE; } } if(look_ahead != offset){ str = g_strndup(offset, look_ahead - offset); } #endif return(str); } /** * ags_turtle_read_pn_chars_u: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed-name chars underscore value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pn_chars_u(gchar *offset, gchar *end_ptr) { gchar *str; str = ags_turtle_read_pn_chars_base(offset, end_ptr); if(str == NULL && offset < end_ptr && *offset == '_'){ str = g_strdup("_"); } return(str); } /** * ags_turtle_read_pn_chars: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed-name chars value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pn_chars(gchar *offset, gchar *end_ptr) { regmatch_t match_arr[1]; gchar *str; static regex_t chars_regex; static gboolean regex_compiled = FALSE; static const char *chars_pattern = "^(([0-9])|(\xC2\xB7)|((\xCC[\x80-\xBF])|(\xCD[\x80-\xAF]))|((\xE2\x80\xBF)|(\xE2\x81\x80)))"; static const size_t max_matches = 1; str = ags_turtle_read_pn_chars_u(offset, end_ptr); if(str == NULL && offset < end_ptr && *offset == '-'){ str = g_strdup("-"); } if(str == NULL && offset < end_ptr){ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&chars_regex, chars_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); if(ags_regexec(&chars_regex, offset, max_matches, match_arr, 0) == 0){ str = g_strndup(offset, match_arr[0].rm_eo - match_arr[0].rm_so); } } return(str); } /** * ags_turtle_read_pn_prefix: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixe-name prefix value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pn_prefix(gchar *offset, gchar *end_ptr) { gchar *str; gchar *tmp, *str_tmp; gboolean last_is_point; if(offset == NULL || offset >= end_ptr){ return(NULL); } str = ags_turtle_read_pn_chars_base(offset, end_ptr); if(str != NULL){ offset += strlen(str); last_is_point = FALSE; while((tmp = ags_turtle_read_pn_chars(offset, end_ptr)) != NULL || *offset == '.'){ if(tmp == NULL){ last_is_point = TRUE; }else{ last_is_point = FALSE; } if(tmp != NULL){ str_tmp = g_strdup_printf("%s%s", str, tmp); offset += strlen(tmp); free(str); free(tmp); str = str_tmp; }else{ str_tmp = g_strdup_printf("%s.", str); offset++; free(str); str = str_tmp; } } } return(str); } /** * ags_turtle_read_pn_local: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed-name local value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pn_local(gchar *offset, gchar *end_ptr) { gchar *str; gchar *tmp_str, *tmp; gboolean initial_find, found_str; gboolean last_is_point; if(offset >= end_ptr){ return(NULL); } tmp_str = NULL; found_str = FALSE; tmp = ags_turtle_read_pn_chars_u(offset, end_ptr); if(tmp == NULL && *offset == ':'){ tmp = g_strdup(":"); } if(tmp == NULL && g_ascii_isdigit(*offset)){ tmp = g_strndup(offset, 1); } if(tmp == NULL){ tmp = ags_turtle_read_plx(offset, end_ptr); } str = tmp; if(str != NULL){ offset += strlen(str); initial_find = TRUE; last_is_point = FALSE; while(initial_find || found_str){ found_str = FALSE; initial_find = FALSE; last_is_point = FALSE; tmp = ags_turtle_read_pn_chars(offset, end_ptr); if(tmp == NULL && *offset == '.'){ tmp = g_strdup("."); last_is_point = TRUE; } if(tmp == NULL && *offset == ':'){ tmp = g_strdup(":"); } if(tmp == NULL){ tmp = ags_turtle_read_plx(offset, end_ptr); } /* concat new strings */ if(tmp != NULL){ found_str = TRUE; if(str != NULL){ tmp_str = g_strdup_printf("%s%s", str, tmp); offset += strlen(tmp); free(str); free(tmp); str = tmp_str; }else{ str = tmp; offset += strlen(tmp); } } } } return(str); } /** * ags_turtle_read_plx: * @offset: the string pointer * @end_ptr: the end of @offset * * Read plx value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_plx(gchar *offset, gchar *end_ptr) { gchar *str; str = ags_turtle_read_percent(offset, end_ptr); if(str == NULL){ str = ags_turtle_read_pn_local_esc(offset, end_ptr); } return(str); } /** * ags_turtle_read_percent: * @offset: the string pointer * @end_ptr: the end of @offset * * Read percent value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_percent(gchar *offset, gchar *end_ptr) { gchar *str; str = NULL; if(offset != NULL && offset + 2 < end_ptr && offset[0] == '%' && g_ascii_isxdigit(offset[1]) && g_ascii_isxdigit(offset[2])){ str = g_strndup(offset, 3); } return(str); } /** * ags_turtle_read_hex: * @offset: the string pointer * @end_ptr: the end of @offset * * Read hex value. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_hex(gchar *offset, gchar *end_ptr) { gchar *str; str = NULL; if(g_ascii_isxdigit(*offset)){ str = g_strndup(offset, 1); } return(str); } /** * ags_turtle_read_pn_local_esc: * @offset: the string pointer * @end_ptr: the end of @offset * * Read prefixed name local escapes. * * Returns: (transfer full): a string on success otherwise %NULL * * Since: 3.0.0 */ gchar* ags_turtle_read_pn_local_esc(gchar *offset, gchar *end_ptr) { static const gchar *escapes = "_~.-!$&'()*+,;=/?#@%"; gchar *str; str = NULL; if(offset != NULL && offset + 1 < end_ptr && *offset == '\\' && (strchr(escapes, offset[1])) != NULL){ str = g_strndup(offset, 2); } return(str); } /** * ags_turtle_find_xpath: * @turtle: the #AgsTurtle * @xpath: a XPath expression as string * * Lookup XPath expression withing @turtle. * * Returns: (element-type libxml2.Node) (transfer container): a #GList-struct containing xmlNode * * Since: 3.0.0 */ GList* ags_turtle_find_xpath(AgsTurtle *turtle, gchar *xpath) { xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; GList *list; guint i; xpath_context = xmlXPathNewContext(turtle->doc); xpath_object = xmlXPathEval((xmlChar *) xpath, xpath_context); list = NULL; if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ list = g_list_prepend(list, node[i]); } } } xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); list = g_list_reverse(list); return(list); } /** * ags_turtle_find_xpath_with_context_node: * @turtle: the #AgsTurtle * @xpath: a XPath expression as string * @context_node: a #xmlNode-struct * * Lookup XPath expression from @context_node withing @turtle. * * Returns: (element-type libxml2.Node) (transfer container): a #GList-struct containing xmlNode * * Since: 3.0.0 */ GList* ags_turtle_find_xpath_with_context_node(AgsTurtle *turtle, gchar *xpath, xmlNode *context_node) { xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; GList *list; guint i; if(!AGS_IS_TURTLE(turtle) || turtle->doc == NULL || xpath == NULL || context_node == NULL){ return(NULL); } xpath_context = xmlXPathNewContext(turtle->doc); //xpath_context->node = context_node; xpath_object = xmlXPathNodeEval(context_node, (xmlChar *) xpath, xpath_context); list = NULL; if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ list = g_list_prepend(list, node[i]); } } } xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); if(list != NULL){ list = g_list_reverse(list); } return(list); } gchar* ags_turtle_string_convert(AgsTurtle *turtle, gchar *str) { if((AGS_TURTLE_TOLOWER & (turtle->flags)) != 0){ str = g_ascii_strdown(str, -1); } return(str); } gchar* ags_turtle_load_skip_comments_and_blanks(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { gchar *look_ahead; gchar *next; if(iter == NULL){ return(NULL); } look_ahead = *iter; if(look_ahead == NULL){ return(NULL); } /* skip whitespaces and comments */ for(; (look_ahead < &(buffer[buffer_length])) && *look_ahead != '\0'; look_ahead++){ /* skip comments */ if(buffer == look_ahead){ if(*buffer == '#'){ next = strchr(look_ahead, '\n'); if(next != NULL){ look_ahead = next + 1; }else{ look_ahead = &(buffer[buffer_length]); break; } continue; } }else if(buffer[look_ahead - buffer - 1] == '\n' && *look_ahead == '#'){ next = strchr(look_ahead, '\n'); if(next != NULL){ look_ahead = next + 1; }else{ look_ahead = &(buffer[buffer_length]); break; } continue; } /* spaces */ if(!(*look_ahead == ' ' || *look_ahead == '\t' || *look_ahead == '\n')){ break; } } return(look_ahead); } xmlNode* ags_turtle_load_read_iriref(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read iriref */ str = ags_turtle_read_iriref(look_ahead, &(buffer[buffer_length])); if(str != NULL){ node = xmlNewNode(NULL, "rdf-iriref"); xmlNodeSetContent(node, str); // xmlNodeSetContent(node, // g_ascii_strdown(str, // -1)); #ifdef AGS_DEBUG g_message("iriref = %s", str); #endif *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_anon(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read anon */ str = ags_turtle_read_anon(look_ahead, &(buffer[buffer_length])); if(str != NULL){ node = xmlNewNode(NULL, "rdf-anon"); xmlNodeSetContent(node, g_ascii_strdown(str, -1)); #ifdef AGS_DEBUG g_message("anon - %s", str); #endif *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_pname_ns(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read pname-ns */ str = ags_turtle_read_pname_ns(look_ahead, &(buffer[buffer_length])); if(str != NULL){ node = xmlNewNode(NULL, "rdf-pname-ns"); xmlNodeSetContent(node, g_ascii_strdown(str, -1)); #ifdef AGS_DEBUG g_message("pname-ns - %s", str); #endif *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_pname_ln(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read pname-ln */ str = ags_turtle_read_pname_ln(look_ahead, &(buffer[buffer_length])); if(str != NULL){ node = xmlNewNode(NULL, "rdf-pname-ln"); xmlNodeSetContent(node, g_ascii_strdown(str, -1)); #ifdef AGS_DEBUG g_message("pname-ln - %s", str); #endif *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_numeric(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read numeric */ str = NULL; if(str == NULL){ str = ags_turtle_read_decimal(look_ahead, &(buffer[buffer_length])); } if(str == NULL){ str = ags_turtle_read_double(look_ahead, &(buffer[buffer_length])); } if(str == NULL){ str = ags_turtle_read_integer(look_ahead, &(buffer[buffer_length])); } if(str == NULL){ str = ags_turtle_read_boolean(look_ahead, &(buffer[buffer_length])); } if(str != NULL){ node = xmlNewNode(NULL, "rdf-numeric"); xmlNodeSetContent(node, g_ascii_strdown(str, -1)); #ifdef AGS_DEBUG g_message("numeric - %s", str); #endif *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_string(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; gchar *encoded_str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read pname-ns */ str = ags_turtle_read_string(look_ahead, &(buffer[buffer_length])); if(str != NULL){ node = xmlNewNode(NULL, "rdf-string"); encoded_str = xmlEncodeSpecialChars(turtle->doc, str); xmlNodeSetContent(node, encoded_str); #ifdef AGS_DEBUG g_message("string - %s", str); #endif g_free(encoded_str); *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_langtag(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; gchar *look_ahead; gchar *str; node = NULL; look_ahead = *iter; /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* read langtag */ str = ags_turtle_read_langtag(look_ahead, &(buffer[buffer_length])); if(str != NULL){ node = xmlNewNode(NULL, "rdf-langtag"); xmlNodeSetContent(node, g_ascii_strdown(str, -1)); #ifdef AGS_DEBUG g_message("langtag - %s", str); #endif *iter = look_ahead + strlen(str); g_free(str); } return(node); } xmlNode* ags_turtle_load_read_literal(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_string_node, *rdf_langtag_node, *rdf_iri_node; gchar *look_ahead; node = NULL; look_ahead = *iter; /* read string */ rdf_string_node = ags_turtle_load_read_string(turtle, buffer, buffer_length, &look_ahead); if(rdf_string_node != NULL){ node = xmlNewNode(NULL, "rdf-literal"); xmlAddChild(node, rdf_string_node); *iter = look_ahead; /* read optional langtag */ rdf_langtag_node = ags_turtle_load_read_langtag(turtle, buffer, buffer_length, &look_ahead); if(rdf_langtag_node != NULL){ xmlAddChild(node, rdf_langtag_node); *iter = look_ahead; }else{ /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); if(look_ahead + 2 < &(buffer[buffer_length]) && look_ahead[0] == '^' && look_ahead[1] == '^'){ /* alternate r2ead optional iri */ rdf_iri_node = ags_turtle_load_read_iri(turtle, buffer, buffer_length, &look_ahead); if(rdf_iri_node != NULL){ xmlAddChild(node, rdf_iri_node); *iter = look_ahead; } } } }else{ xmlNode *rdf_numeric_node; rdf_numeric_node = ags_turtle_load_read_numeric(turtle, buffer, buffer_length, &look_ahead); if(rdf_numeric_node != NULL){ node = xmlNewNode(NULL, "rdf-literal"); xmlAddChild(node, rdf_numeric_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_iri(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_iriref_node, *rdf_prefixed_name_node; gchar *look_ahead; node = NULL; look_ahead = *iter; /* read iriref */ rdf_iriref_node = ags_turtle_load_read_iriref(turtle, buffer, buffer_length, &look_ahead); if(rdf_iriref_node != NULL){ node = xmlNewNode(NULL, "rdf-iri"); xmlAddChild(node, rdf_iriref_node); *iter = look_ahead; }else{ /* alternate read prefixed name */ rdf_prefixed_name_node = ags_turtle_load_read_prefixed_name(turtle, buffer, buffer_length, &look_ahead); if(rdf_prefixed_name_node != NULL){ node = xmlNewNode(NULL, "rdf-iri"); xmlAddChild(node, rdf_prefixed_name_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_prefix_id(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_pname_ns_node, *rdf_iriref_node; regmatch_t match_arr[1]; gchar *look_ahead; static regex_t prefix_id_regex; static gboolean regex_compiled = FALSE; static const char *prefix_id_pattern = "^(@prefix)"; static const size_t max_matches = 1; node = NULL; look_ahead = *iter; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&prefix_id_regex, prefix_id_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* match @prefix */ if(ags_regexec(&prefix_id_regex, look_ahead, max_matches, match_arr, 0) == 0){ look_ahead += (match_arr[0].rm_eo - match_arr[0].rm_so); rdf_pname_ns_node = ags_turtle_load_read_pname_ns(turtle, buffer, buffer_length, &look_ahead); rdf_iriref_node = ags_turtle_load_read_iriref(turtle, buffer, buffer_length, &look_ahead); /* create node if complete prefix id */ if(rdf_pname_ns_node != NULL && rdf_iriref_node != NULL){ gchar *str; node = xmlNewNode(NULL, "rdf-prefix-id"); xmlAddChild(node, rdf_pname_ns_node); xmlAddChild(node, rdf_iriref_node); str = xmlNodeGetContent(rdf_iriref_node); if(str != NULL && strlen(str) > 2){ gchar *iriref; iriref = g_strndup(str + 1, strlen(str) - 2); g_hash_table_insert(turtle->prefix_id, iriref, g_strdup(xmlNodeGetContent(rdf_pname_ns_node))); } *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_base(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_iriref_node; regmatch_t match_arr[1]; gchar *look_ahead; static regex_t base_regex; static gboolean regex_compiled = FALSE; static const char *base_pattern = "^(@base)"; static const size_t max_matches = 1; node = NULL; look_ahead = *iter; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&base_regex, base_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* match @base */ if(ags_regexec(&base_regex, look_ahead, max_matches, match_arr, 0) == 0){ look_ahead += (match_arr[0].rm_eo - match_arr[0].rm_so); rdf_iriref_node = ags_turtle_load_read_iriref(turtle, buffer, buffer_length, &look_ahead); /* create node if complete base */ if(rdf_iriref_node != NULL){ node = xmlNewNode(NULL, "rdf-base"); xmlAddChild(node, rdf_iriref_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_sparql_prefix(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_pname_ns_node, *rdf_iriref_node; regmatch_t match_arr[1]; gchar *look_ahead; static regex_t sparql_prefix_regex; static gboolean regex_compiled = FALSE; static const char *sparql_prefix_pattern = "^(\"PREFIX\")"; static const size_t max_matches = 1; node = NULL; look_ahead = *iter; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&sparql_prefix_regex, sparql_prefix_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* match @prefix */ if(ags_regexec(&sparql_prefix_regex, look_ahead, max_matches, match_arr, 0) == 0){ look_ahead += (match_arr[0].rm_eo - match_arr[0].rm_so); rdf_pname_ns_node = ags_turtle_load_read_pname_ns(turtle, buffer, buffer_length, &look_ahead); rdf_iriref_node = ags_turtle_load_read_iriref(turtle, buffer, buffer_length, &look_ahead);; /* create node if complete sparql prefix */ if(rdf_pname_ns_node != NULL && rdf_iriref_node != NULL){ node = xmlNewNode(NULL, "rdf-sparql-prefix"); xmlAddChild(node, rdf_pname_ns_node); xmlAddChild(node, rdf_iriref_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_sparql_base(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_iriref_node; regmatch_t match_arr[1]; gchar *look_ahead; static regex_t sparql_base_regex; static gboolean regex_compiled = FALSE; static const char *sparql_base_pattern = "^(\"BASE\")"; static const size_t max_matches = 1; node = NULL; look_ahead = *iter; g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; ags_regcomp(&sparql_base_regex, sparql_base_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* match @base */ if(ags_regexec(&sparql_base_regex, look_ahead, max_matches, match_arr, 0) == 0){ look_ahead += (match_arr[0].rm_eo - match_arr[0].rm_so); rdf_iriref_node = ags_turtle_load_read_iriref(turtle, buffer, buffer_length, &look_ahead);; /* create node if complete sparqle base */ if(rdf_iriref_node != NULL){ node = xmlNewNode(NULL, "rdf-sparql-base"); xmlAddChild(node, rdf_iriref_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_prefixed_name(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_pname_ns_node, *rdf_pname_ln_node; gchar *look_ahead; node = NULL; look_ahead = *iter; rdf_pname_ln_node = ags_turtle_load_read_pname_ln(turtle, buffer, buffer_length, &look_ahead); if(rdf_pname_ln_node != NULL){ node = xmlNewNode(NULL, "rdf-prefixed-name"); xmlAddChild(node, rdf_pname_ln_node); *iter = look_ahead; }else{ rdf_pname_ns_node = ags_turtle_load_read_pname_ns(turtle, buffer, buffer_length, &look_ahead); if(rdf_pname_ns_node != NULL){ node = xmlNewNode(NULL, "rdf-prefixed-name"); xmlAddChild(node, rdf_pname_ns_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_blank_node(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_anon_node; gchar *rdf_blank_node_label; gchar *look_ahead; node = NULL; look_ahead = *iter; rdf_blank_node_label = ags_turtle_read_blank_node_label(look_ahead, &(buffer[buffer_length])); if(rdf_blank_node_label != NULL){ node = xmlNewNode(NULL, "rdf-blank-node"); xmlNodeSetContent(node, g_ascii_strdown(rdf_blank_node_label, -1)); g_free(rdf_blank_node_label); *iter = look_ahead; }else{ rdf_anon_node = ags_turtle_load_read_anon(turtle, buffer, buffer_length, &look_ahead); if(rdf_anon_node != NULL){ node = xmlNewNode(NULL, "rdf-blank-node"); xmlAddChild(node, rdf_anon_node); *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_statement(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_directive_node, *rdf_triple_node; gchar *look_ahead; gchar *next; node = NULL; look_ahead = *iter; rdf_directive_node = ags_turtle_load_read_directive(turtle, buffer, buffer_length, &look_ahead); if(rdf_directive_node != NULL){ node = xmlNewNode(NULL, "rdf-statement"); xmlAddChild(node, rdf_directive_node); #ifdef AGS_DEBUG g_message("===="); #endif next = strchr(look_ahead, '.'); if(next != NULL){ *iter = next + 1; }else{ *iter = &(buffer[buffer_length]); g_critical("malformed RDF Turtle"); } }else{ rdf_triple_node = ags_turtle_load_read_triple(turtle, buffer, buffer_length, &look_ahead); if(rdf_triple_node != NULL){ node = xmlNewNode(NULL, "rdf-statement"); xmlAddChild(node, rdf_triple_node); #ifdef AGS_DEBUG g_message("-----"); #endif next = strchr(look_ahead, '.'); if(next != NULL){ *iter = next + 1; }else{ *iter = &(buffer[buffer_length]); g_critical("malformed RDF Turtle"); } } } return(node); } xmlNode* ags_turtle_load_read_verb(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *predicate_node; gchar *look_ahead; node = NULL; look_ahead = *iter; /* predicate */ predicate_node = ags_turtle_load_read_predicate(turtle, buffer, buffer_length, &look_ahead); if(predicate_node != NULL){ #ifdef AGS_DEBUG g_message("read rdf-verb"); #endif node = xmlNewNode(NULL, "rdf-verb"); xmlAddChild(node, predicate_node); *iter = look_ahead; }else{ /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); if(*look_ahead == 'a'){ #ifdef AGS_DEBUG g_message("read - verb: a"); #endif node = xmlNewNode(NULL, "rdf-verb"); /* verb - a */ xmlNewProp(node, "verb", "a"); look_ahead += 1; *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_predicate(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *iri_node; gchar *look_ahead; node = NULL; look_ahead = *iter; /* iri - IRIREF */ iri_node = ags_turtle_load_read_iri(turtle, buffer, buffer_length, &look_ahead); if(iri_node != NULL){ #ifdef AGS_DEBUG g_message("read rdf-predicate"); #endif node = xmlNewNode(NULL, "rdf-predicate"); xmlAddChild(node, iri_node); *iter = look_ahead; } return(node); } xmlNode* ags_turtle_load_read_object(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *iri_node; xmlNode *blank_node; xmlNode *collection_node; xmlNode *blank_node_property_list_node; xmlNode *literal_node; gchar *look_ahead; node = NULL; iri_node = NULL; blank_node = NULL; collection_node = NULL; blank_node_property_list_node = NULL; literal_node = NULL; look_ahead = *iter; /* iri - IRIREF */ iri_node = ags_turtle_load_read_iri(turtle, buffer, buffer_length, &look_ahead); if(iri_node != NULL){ goto ags_turtle_load_read_object_CREATE_NODE; } /* read blank node */ blank_node = ags_turtle_load_read_blank_node(turtle, buffer, buffer_length, &look_ahead); if(blank_node != NULL){ goto ags_turtle_load_read_object_CREATE_NODE; } /* skip blanks and comments */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); /* collection */ if(*look_ahead == '('){ collection_node = ags_turtle_load_read_collection(turtle, buffer, buffer_length, &look_ahead); goto ags_turtle_load_read_object_CREATE_NODE; } /* blank node property listimplemented ags_turtle_load_read_object() */ if(*look_ahead == '['){ blank_node_property_list_node = ags_turtle_load_read_blank_node_property_list(turtle, buffer, buffer_length, &look_ahead); goto ags_turtle_load_read_object_CREATE_NODE; } /* literal */ #ifdef AGS_DEBUG g_message("*** PASS ***"); #endif literal_node = ags_turtle_load_read_literal(turtle, buffer, buffer_length, &look_ahead); if(literal_node != NULL){ goto ags_turtle_load_read_object_CREATE_NODE; } /* create node */ ags_turtle_load_read_object_CREATE_NODE: if(iri_node != NULL){ node = xmlNewNode(NULL, "rdf-object"); xmlAddChild(node, iri_node); *iter = look_ahead; }else if(blank_node != NULL){ node = xmlNewNode(NULL, "rdf-object"); xmlAddChild(node, blank_node); *iter = look_ahead; }else if(collection_node != NULL){ node = xmlNewNode(NULL, "rdf-object"); xmlAddChild(node, collection_node); *iter = look_ahead; }else if(blank_node_property_list_node != NULL){ node = xmlNewNode(NULL, "rdf-object"); xmlAddChild(node, blank_node_property_list_node); *iter = look_ahead; }else if(literal_node != NULL){ node = xmlNewNode(NULL, "rdf-object"); xmlAddChild(node, literal_node); *iter = look_ahead; } #ifdef AGS_DEBUG if(node != NULL){ g_message("read rdf-object"); } #endif return(node); } xmlNode* ags_turtle_load_read_directive(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *rdf_prefix_id_node, *rdf_base_node, *rdf_sparql_prefix_node, *rdf_sparql_base_node; gchar *look_ahead, *current; node = NULL; look_ahead = *iter; rdf_prefix_id_node = ags_turtle_load_read_prefix_id(turtle, buffer, buffer_length, &look_ahead); if(rdf_prefix_id_node != NULL){ goto ags_turtle_load_read_directive_CREATE_NODE; } rdf_base_node = ags_turtle_load_read_base(turtle, buffer, buffer_length, &look_ahead); if(rdf_base_node != NULL){ goto ags_turtle_load_read_directive_CREATE_NODE; } rdf_sparql_prefix_node = ags_turtle_load_read_sparql_prefix(turtle, buffer, buffer_length, &look_ahead); if(rdf_sparql_prefix_node != NULL){ goto ags_turtle_load_read_directive_CREATE_NODE; } rdf_sparql_base_node = ags_turtle_load_read_sparql_base(turtle, buffer, buffer_length, &look_ahead); if(rdf_sparql_base_node != NULL){ goto ags_turtle_load_read_directive_CREATE_NODE; } /* create node */ ags_turtle_load_read_directive_CREATE_NODE: if(rdf_prefix_id_node != NULL){ #ifdef AGS_DEBUG g_message("read - rdf-directive"); #endif node = xmlNewNode(NULL, "rdf-directive"); xmlAddChild(node, rdf_prefix_id_node); *iter = look_ahead; }else if(rdf_base_node != NULL){ #ifdef AGS_DEBUG g_message("read - rdf-directive"); #endif node = xmlNewNode(NULL, "rdf-directive"); xmlAddChild(node, rdf_base_node); *iter = look_ahead; }else if(rdf_sparql_prefix_node != NULL){ #ifdef AGS_DEBUG g_message("read - rdf-directive"); #endif node = xmlNewNode(NULL, "rdf-directive"); xmlAddChild(node, rdf_sparql_prefix_node); *iter = look_ahead; }else if(rdf_sparql_base_node != NULL){ #ifdef AGS_DEBUG g_message("read - rdf-directive"); #endif node = xmlNewNode(NULL, "rdf-directive"); xmlAddChild(node, rdf_sparql_base_node); *iter = look_ahead; } return(node); } xmlNode* ags_turtle_load_read_triple(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *subject_node, *predicate_object_list_node_0, *blank_node_object_list_node, *predicate_object_list_node_1; gchar *look_ahead, *current; node = NULL; look_ahead = *iter; /* subject */ subject_node = ags_turtle_load_read_subject(turtle, buffer, buffer_length, &look_ahead); /* create triple node */ if(subject_node != NULL){ /* first predicate object list */ predicate_object_list_node_0 = ags_turtle_load_read_predicate_object_list(turtle, buffer, buffer_length, &look_ahead); if(predicate_object_list_node_0 != NULL){ node = xmlNewNode(NULL, "rdf-triple"); xmlAddChild(node, subject_node); xmlAddChild(node, predicate_object_list_node_0); /* second predicate object list */ predicate_object_list_node_1 = ags_turtle_load_read_predicate_object_list(turtle, buffer, buffer_length, &look_ahead); if(predicate_object_list_node_1 != NULL){ xmlAddChild(node, predicate_object_list_node_1); } #ifdef AGS_DEBUG g_message("read rdf-triple"); #endif *iter = look_ahead; }else{ /* alternate first blank node object list */ blank_node_object_list_node = ags_turtle_load_read_blank_node_property_list(turtle, buffer, buffer_length, &look_ahead); if(blank_node_object_list_node != NULL){ node = xmlNewNode(NULL, "rdf-triple"); xmlAddChild(node, blank_node_object_list_node); /* predicate object list */ predicate_object_list_node_1 = ags_turtle_load_read_predicate_object_list(turtle, buffer, buffer_length, &look_ahead); if(predicate_object_list_node_1 != NULL){ xmlAddChild(node, predicate_object_list_node_1); } #ifdef AGS_DEBUG g_message("read rdf-triple"); #endif *iter = look_ahead; } } } return(node); } xmlNode* ags_turtle_load_read_subject(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *iri_node; xmlNode *blank_node; xmlNode *collection_node; gchar *look_ahead; node = NULL; iri_node = NULL; blank_node = NULL; collection_node = NULL; look_ahead = *iter; /* iri - IRIREF */ iri_node = ags_turtle_load_read_iri(turtle, buffer, buffer_length, &look_ahead); if(iri_node != NULL){ goto ags_turtle_load_read_subject_CREATE_NODE; } /* read blank node */ blank_node = ags_turtle_load_read_blank_node(turtle, buffer, buffer_length, &look_ahead); if(blank_node != NULL){ goto ags_turtle_load_read_subject_CREATE_NODE; } /* collection */ if(*look_ahead == '('){ collection_node = ags_turtle_load_read_collection(turtle, buffer, buffer_length, &look_ahead); goto ags_turtle_load_read_subject_CREATE_NODE; } /* create node */ ags_turtle_load_read_subject_CREATE_NODE: if(iri_node != NULL){ node = xmlNewNode(NULL, "rdf-subject"); xmlAddChild(node, iri_node); *iter = look_ahead; }else if(blank_node != NULL){ node = xmlNewNode(NULL, "rdf-subject"); xmlAddChild(node, blank_node); *iter = look_ahead; }else if(collection_node != NULL){ node = xmlNewNode(NULL, "rdf-subject"); xmlAddChild(node, collection_node); *iter = look_ahead; } #ifdef AGS_DEBUG if(node != NULL){ g_message("read rdf-subject"); } #endif return(node); } xmlNode* ags_turtle_load_read_object_list(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *object_node; gchar *look_ahead; gchar *start_ptr, *end_ptr; node = NULL; look_ahead = *iter; /* read first object */ object_node = ags_turtle_load_read_object(turtle, buffer, buffer_length, &look_ahead); if(object_node != NULL){ /* create node */ node = xmlNewNode(NULL, "rdf-object-list"); xmlAddChild(node, object_node); /* iterate */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); while(*look_ahead == ','){ look_ahead++; object_node = ags_turtle_load_read_object(turtle, buffer, buffer_length, &look_ahead); if(object_node != NULL){ xmlAddChild(node, object_node); look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); } } *iter = look_ahead; } #ifdef AGS_DEBUG if(node != NULL){ g_message("read rdf-object-list"); } #endif return(node); } xmlNode* ags_turtle_load_read_collection(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *object_node; gchar *look_ahead; gchar *start_ptr, *end_ptr; node = NULL; look_ahead = *iter; look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); if(*look_ahead == '\0'){ return(NULL); } if(*look_ahead == '('){ start_ptr = look_ahead; look_ahead++; /* create node */ node = xmlNewNode(NULL, "rdf-collection"); /* read objects */ while((object_node = ags_turtle_load_read_object(turtle, buffer, buffer_length, &look_ahead)) != NULL){ #ifdef AGS_DEBUG g_message("read rdf-collection"); #endif xmlAddChild(node, object_node); } end_ptr = strchr(look_ahead, ')'); if(end_ptr != NULL){ *iter = end_ptr + 1; }else{ *iter = &(buffer[buffer_length]); } } return(node); } xmlNode* ags_turtle_load_read_predicate_object_list(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *current_verb_node, *current_object_list_node; gchar *look_ahead; node = NULL; look_ahead = *iter; current_verb_node = ags_turtle_load_read_verb(turtle, buffer, buffer_length, &look_ahead); if(current_verb_node != NULL){ current_object_list_node = ags_turtle_load_read_object_list(turtle, buffer, buffer_length, &look_ahead); if(current_object_list_node != NULL){ node = xmlNewNode(NULL, "rdf-predicate-object-list"); xmlAddChild(node, current_verb_node); xmlAddChild(node, current_object_list_node); /* iterate */ look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); while(*look_ahead == ';'){ look_ahead++; current_verb_node = ags_turtle_load_read_verb(turtle, buffer, buffer_length, &look_ahead); if(current_verb_node != NULL){ current_object_list_node = ags_turtle_load_read_object_list(turtle, buffer, buffer_length, &look_ahead); if(current_object_list_node != NULL){ xmlAddChild(node, current_verb_node); xmlAddChild(node, current_object_list_node); look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); }else{ break; } }else{ break; } } *iter = look_ahead; } } return(node); } xmlNode* ags_turtle_load_read_blank_node_property_list(AgsTurtle *turtle, gchar *buffer, gsize buffer_length, gchar **iter) { xmlNode *node; xmlNode *predicate_object_list_node; gchar *look_ahead; gchar *start_ptr, *end_ptr; node = NULL; look_ahead = *iter; look_ahead = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, buffer_length, &look_ahead); if(*look_ahead == '['){ start_ptr = look_ahead; look_ahead++; predicate_object_list_node = ags_turtle_load_read_predicate_object_list(turtle, buffer, buffer_length, &look_ahead); if(predicate_object_list_node != NULL){ #ifdef AGS_DEBUG g_message("read rdf-blank-node-property-list"); #endif node = xmlNewNode(NULL, "rdf-blank-node-property-list"); xmlAddChild(node, predicate_object_list_node); end_ptr = strchr(look_ahead, ']'); if(end_ptr != NULL){ *iter = end_ptr + 1; }else{ *iter = &(buffer[buffer_length]); } } } return(node); } /** * ags_turtle_load: * @turtle: the #AgsTurtle * @error: a pointer to a #GError * * Loads a RDF triple file into an XML Document. * * Returns: (transfer none): a #xmlDoc pointer * * Since: 3.0.0 */ xmlDoc* ags_turtle_load(AgsTurtle *turtle, GError **error) { xmlDoc *doc; xmlNode *root_node, *rdf_statement_node; FILE *file; struct stat *sb; gchar *buffer, *iter; size_t n_read; #ifdef AGS_DEBUG g_message("file: %s", turtle->filename); #endif /* entry point - open file and read it */ sb = (struct stat *) malloc(sizeof(struct stat)); stat(turtle->filename, sb); file = fopen(turtle->filename, "r"); if(file == NULL || sb->st_size <= 0){ free(sb); return(NULL); } buffer = (gchar *) malloc((sb->st_size + 1) * sizeof(gchar)); if(buffer == NULL){ free(sb); return(NULL); } n_read = fread(buffer, sizeof(gchar), sb->st_size, file); if(n_read != sb->st_size){ g_critical("number of read bytes doesn't match buffer size"); } buffer[sb->st_size] = '\0'; fclose(file); /* alloc document */ doc = turtle->doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "rdf-turtle-doc"); xmlDocSetRootElement(doc, root_node); xmlNewProp(root_node, "version", AGS_TURTLE_DEFAULT_VERSION); iter = buffer; do{ /* skip blanks and comments */ iter = ags_turtle_load_skip_comments_and_blanks(turtle, buffer, sb->st_size, &iter); if(iter >= &(buffer[sb->st_size])){ break; } rdf_statement_node = ags_turtle_load_read_statement(turtle, buffer, sb->st_size, &iter); if(rdf_statement_node != NULL){ xmlAddChild(root_node, rdf_statement_node); } if(rdf_statement_node == NULL){ iter++; } }while(iter < &(buffer[sb->st_size])); free(sb); free(buffer); // xmlCleanupParser(); // xmlMemoryDump(); return(doc); } /** * ags_turtle_new: * @filename: (nullable): the filename as string * * Instantiate a new #AgsTurtle. * * Returns: the new instance * * Since: 3.0.0 */ AgsTurtle* ags_turtle_new(gchar *filename) { AgsTurtle *turtle; turtle = g_object_new(AGS_TYPE_TURTLE, "filename", filename, NULL); return(turtle); } gsequencer-3.1.3/ags/lib/ags_buffer_util.h0000644000175000017500000001034413607210263015433 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUFFER_UTIL_H__ #define __AGS_BUFFER_UTIL_H__ #include #include #include #include G_BEGIN_DECLS /* signed integers to char buffer */ guchar* ags_buffer_util_s8_to_char_buffer(gint8 *buffer, guint buffer_length); guchar* ags_buffer_util_s16_to_char_buffer(gint16 *buffer, guint buffer_length); guchar* ags_buffer_util_s24_to_char_buffer(gint32 *buffer, guint buffer_length); guchar* ags_buffer_util_s32_to_char_buffer(gint32 *buffer, guint buffer_length); guchar* ags_buffer_util_s64_to_char_buffer(gint64 *buffer, guint buffer_length); guchar* ags_buffer_util_float_to_char_buffer(gfloat *buffer, guint buffer_length); guchar* ags_buffer_util_double_to_char_buffer(gdouble *buffer, guint buffer_length); guchar* ags_buffer_util_complex_to_char_buffer(AgsComplex *buffer, guint buffer_length); /* char buffer to signed integers */ gint8* ags_buffer_util_char_buffer_to_s8(guchar *cbuffer, guint buffer_size); gint16* ags_buffer_util_char_buffer_to_s16(guchar *cbuffer, guint buffer_size); gint32* ags_buffer_util_char_buffer_to_s24(guchar *cbuffer, guint buffer_size); gint32* ags_buffer_util_char_buffer_to_s32(guchar *cbuffer, guint buffer_size); gint64* ags_buffer_util_char_buffer_to_s64(guchar *cbuffer, guint buffer_size); gfloat* ags_buffer_util_char_buffer_to_float(guchar *cbuffer, guint buffer_size); gdouble* ags_buffer_util_char_buffer_to_double(guchar *cbuffer, guint buffer_size); AgsComplex* ags_buffer_util_char_buffer_to_complex(guchar *cbuffer, guint buffer_size); /* read integers */ gint8 ags_buffer_util_char_buffer_read_s8(guchar *cbuffer, guint byte_order); gint16 ags_buffer_util_char_buffer_read_s16(guchar *cbuffer, guint byte_order); gint32 ags_buffer_util_char_buffer_read_s24(guchar *cbuffer, guint byte_order); gint32 ags_buffer_util_char_buffer_read_s32(guchar *cbuffer, guint byte_order); gint64 ags_buffer_util_char_buffer_read_s64(guchar *cbuffer, guint byte_order); gfloat ags_buffer_util_char_buffer_read_float(guchar *cbuffer, guint byte_order); gdouble ags_buffer_util_char_buffer_read_double(guchar *cbuffer, guint byte_order); AgsComplex* ags_buffer_util_char_buffer_read_complex(guchar *cbuffer, guint byte_order); /* write integers */ void ags_buffer_util_char_buffer_write_s8(guchar *cbuffer, gint8 value, guint byte_order); void ags_buffer_util_char_buffer_write_s16(guchar *cbuffer, gint16 value, guint byte_order); void ags_buffer_util_char_buffer_write_s24(guchar *cbuffer, gint32 value, guint byte_order); void ags_buffer_util_char_buffer_write_s32(guchar *cbuffer, gint32 value, guint byte_order); void ags_buffer_util_char_buffer_write_s64(guchar *cbuffer, gint64 value, guint byte_order); void ags_buffer_util_char_buffer_write_float(guchar *cbuffer, gfloat value, guint byte_order); void ags_buffer_util_char_buffer_write_double(guchar *cbuffer, gdouble value, guint byte_order); void ags_buffer_util_char_buffer_write_complex(guchar *cbuffer, AgsComplex *value, guint byte_order); /* swap bytes */ void ags_buffer_util_char_buffer_swap_bytes(guchar *cbuffer, guint word_size, guint buffer_size); G_END_DECLS #endif /*__AGS_BUFFER_UTIL_H__*/ gsequencer-3.1.3/ags/lib/ags_time.h0000644000175000017500000000247113607210263014065 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TIME__ #define __AGS_TIME__ #include #include G_BEGIN_DECLS #define AGS_TIME_ZERO "0000:00.000" #define AGS_USEC_PER_SEC (1000000) /* The number of msecs per sec. */ #define AGS_NSEC_PER_SEC (1000000000) /* The number of nsecs per sec. */ gchar* ags_time_get_uptime_from_offset(guint offset, gdouble bpm, gdouble delay, gdouble delay_factor); gboolean ags_time_timeout_expired(struct timespec *start_time, struct timespec *timeout_delay); G_END_DECLS #endif /*__AGS_TIME__*/ gsequencer-3.1.3/ags/lib/ags_turtle.h0000644000175000017500000001133613607210263014446 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TURTLE_H__ #define __AGS_TURTLE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_TURTLE (ags_turtle_get_type()) #define AGS_TURTLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TURTLE, AgsTurtle)) #define AGS_TURTLE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_TURTLE, AgsTurtleClass)) #define AGS_IS_TURTLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_TURTLE)) #define AGS_IS_TURTLE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_TURTLE)) #define AGS_TURTLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_TURTLE, AgsTurtleClass)) #define AGS_TURTLE_GET_OBJ_MUTEX(obj) (&(((AgsTurtle *) obj)->obj_mutex)) #define AGS_TURTLE_DEFAULT_ENCODING "UTF-8" #define AGS_TURTLE_DEFAULT_VERSION "0.7.3" typedef struct _AgsTurtle AgsTurtle; typedef struct _AgsTurtleClass AgsTurtleClass; /** * AgsTurtleFlags: * @AGS_TURTLE_TOLOWER: make all tags and attributes lower case * * Enum values to control the behavior or indicate internal state of #AgsTurtle by * enable/disable as sync_flags. */ typedef enum{ AGS_TURTLE_TOLOWER = 1, }AgsTurtleFlags; struct _AgsTurtle { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *filename; xmlDoc *doc; GHashTable *prefix_id; }; struct _AgsTurtleClass { GObjectClass gobject; }; GType ags_turtle_get_type(void); /* iri, pname, label and langtag */ gchar* ags_turtle_read_iriref(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pname_ns(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pname_ln(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_blank_node_label(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_langtag(gchar *offset, gchar *end_ptr); /* numbers */ gchar* ags_turtle_read_boolean(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_integer(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_decimal(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_double(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_exponent(gchar *offset, gchar *end_ptr); /* literals */ gchar* ags_turtle_read_string(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_string_literal_quote(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_string_literal_single_quote(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_string_literal_long_quote(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_string_literal_long_single_quote(gchar *offset, gchar *end_ptr); /* character ranges might return multi-byte */ gchar* ags_turtle_read_uchar(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_echar(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_ws(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_anon(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pn_chars_base(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pn_chars_u(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pn_chars(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pn_prefix(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pn_local(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_plx(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_percent(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_hex(gchar *offset, gchar *end_ptr); gchar* ags_turtle_read_pn_local_esc(gchar *offset, gchar *end_ptr); /* XML related */ GList* ags_turtle_find_xpath(AgsTurtle *turtle, gchar *xpath); GList* ags_turtle_find_xpath_with_context_node(AgsTurtle *turtle, gchar *xpath, xmlNode *context_node); gchar* ags_turtle_string_convert(AgsTurtle *turtle, gchar *str); xmlDoc* ags_turtle_load(AgsTurtle *turtle, GError **error); AgsTurtle* ags_turtle_new(gchar *filename); G_END_DECLS #endif /*__AGS_TURTLE_H__*/ gsequencer-3.1.3/ags/lib/ags_uuid.h0000644000175000017500000000263713607210263014101 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_UUID__ #define __AGS_UUID__ #include #include G_BEGIN_DECLS #define AGS_TYPE_UUID (ags_uuid_get_type()) #define AGS_UUID_DEFAULT_LENGTH (16) #define AGS_UUID_STRING_DEFAULT_LENGTH (36) typedef struct _AgsUUID AgsUUID; struct _AgsUUID { guchar data[16]; }; GType ags_uuid_get_type(void); AgsUUID* ags_uuid_alloc(); gpointer ags_uuid_copy(AgsUUID *ptr); void ags_uuid_free(AgsUUID *ptr); void ags_uuid_generate(AgsUUID *ptr); gint ags_uuid_compare(AgsUUID *a, AgsUUID *b); gchar* ags_uuid_to_string(AgsUUID *ptr); AgsUUID* ags_uuid_from_string(gchar *str); G_END_DECLS #endif /*__AGS_UUID__*/ gsequencer-3.1.3/ags/lib/ags_solver_vector.c0000644000175000017500000001017213607210263016013 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_solver_vector_class_init(AgsSolverVectorClass *solver_vector); void ags_solver_vector_init (AgsSolverVector *solver_vector); void ags_solver_vector_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_solver_vector_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_solver_vector_finalize(GObject *gobject); /** * SECTION:ags_solver_vector * @short_description: solver vector * @title: AgsSolverVector * @section_id: * @include: ags/lib/ags_solver_vector.h * * The #AgsSolverVector contains the solver vectors. */ enum{ PROP_0, }; static gpointer ags_solver_vector_parent_class = NULL; GType ags_solver_vector_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_solver_vector = 0; static const GTypeInfo ags_solver_vector_info = { sizeof (AgsSolverVectorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_solver_vector_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSolverVector), 0, /* n_preallocs */ (GInstanceInitFunc) ags_solver_vector_init, }; ags_type_solver_vector = g_type_register_static(G_TYPE_OBJECT, "AgsSolverVector", &ags_solver_vector_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_solver_vector); } return g_define_type_id__volatile; } void ags_solver_vector_class_init(AgsSolverVectorClass *solver_vector) { GObjectClass *gobject; GParamSpec *param_spec; ags_solver_vector_parent_class = g_type_class_peek_parent(solver_vector); /* GObjectClass */ gobject = (GObjectClass *) solver_vector; gobject->set_property = ags_solver_vector_set_property; gobject->get_property = ags_solver_vector_get_property; gobject->finalize = ags_solver_vector_finalize; /* properties */ } void ags_solver_vector_init(AgsSolverVector *solver_vector) { //TODO:JK: implement me } void ags_solver_vector_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSolverVector *solver_vector; solver_vector = AGS_SOLVER_VECTOR(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_solver_vector_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSolverVector *solver_vector; solver_vector = AGS_SOLVER_VECTOR(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_solver_vector_finalize(GObject *gobject) { AgsSolverVector *solver_vector; solver_vector = AGS_SOLVER_VECTOR(gobject); /* call parent */ G_OBJECT_CLASS(ags_solver_vector_parent_class)->finalize(gobject); } /** * ags_solver_vector_new: * * Instantiate a new #AgsSolverVector. * * Returns: the new instance * * Since: 3.0.0 */ AgsSolverVector* ags_solver_vector_new() { AgsSolverVector *solver_vector; solver_vector = g_object_new(AGS_TYPE_SOLVER_VECTOR, NULL); return(solver_vector); } gsequencer-3.1.3/ags/lib/ags_endian.c0000644000175000017500000000364713607210263014366 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include /** * SECTION:ags_endian * @short_description: dealing with endiannes * @title: AgsEndian * @section_id: * @include: ags/lib/ags_endian.h * * Some common routines dealing with endiannes. */ /** * ags_endian_host_is_le: * * Check host is Little Endian. * * Returns: %TRUE if LE, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_endian_host_is_le() { int i = 1; return(*((char *)&i)); } /** * ags_endian_host_is_be: * * Check host is Big Endian. * * Returns: %TRUE if BE, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_endian_host_is_be() { int i = 1; return(!(*((char *)&i))); } /** * ags_endian_swap_float: * @x: the float to swap * * Swaps the floating point numbers endianness. * * Returns: the byte-swapped float * * Since: 3.0.0 */ gfloat ags_endian_swap_float(gfloat x) { char c; union{ gfloat float_data; char char_data[4]; }data; data.float_data = x; c = data.char_data[0]; data.char_data[0] = data.char_data[3]; data.char_data[3] = c; c = data.char_data[1]; data.char_data[1] = data.char_data[2]; data.char_data[2] = c; return(data.float_data); } gsequencer-3.1.3/ags/lib/ags_solver_matrix.c0000644000175000017500000001017213607210263016015 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_solver_matrix_class_init(AgsSolverMatrixClass *solver_matrix); void ags_solver_matrix_init (AgsSolverMatrix *solver_matrix); void ags_solver_matrix_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_solver_matrix_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_solver_matrix_finalize(GObject *gobject); /** * SECTION:ags_solver_matrix * @short_description: solver matrix * @title: AgsSolverMatrix * @section_id: * @include: ags/lib/ags_solver_matrix.h * * The #AgsSolverMatrix contains the solver vectors. */ enum{ PROP_0, }; static gpointer ags_solver_matrix_parent_class = NULL; GType ags_solver_matrix_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_solver_matrix = 0; static const GTypeInfo ags_solver_matrix_info = { sizeof (AgsSolverMatrixClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_solver_matrix_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSolverMatrix), 0, /* n_preallocs */ (GInstanceInitFunc) ags_solver_matrix_init, }; ags_type_solver_matrix = g_type_register_static(G_TYPE_OBJECT, "AgsSolverMatrix", &ags_solver_matrix_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_solver_matrix); } return g_define_type_id__volatile; } void ags_solver_matrix_class_init(AgsSolverMatrixClass *solver_matrix) { GObjectClass *gobject; GParamSpec *param_spec; ags_solver_matrix_parent_class = g_type_class_peek_parent(solver_matrix); /* GObjectClass */ gobject = (GObjectClass *) solver_matrix; gobject->set_property = ags_solver_matrix_set_property; gobject->get_property = ags_solver_matrix_get_property; gobject->finalize = ags_solver_matrix_finalize; /* properties */ } void ags_solver_matrix_init(AgsSolverMatrix *solver_matrix) { //TODO:JK: implement me } void ags_solver_matrix_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSolverMatrix *solver_matrix; solver_matrix = AGS_SOLVER_MATRIX(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_solver_matrix_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSolverMatrix *solver_matrix; solver_matrix = AGS_SOLVER_MATRIX(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_solver_matrix_finalize(GObject *gobject) { AgsSolverMatrix *solver_matrix; solver_matrix = AGS_SOLVER_MATRIX(gobject); /* call parent */ G_OBJECT_CLASS(ags_solver_matrix_parent_class)->finalize(gobject); } /** * ags_solver_matrix_new: * * Instantiate a new #AgsSolverMatrix. * * Returns: the new instance * * Since: 3.0.0 */ AgsSolverMatrix* ags_solver_matrix_new() { AgsSolverMatrix *solver_matrix; solver_matrix = g_object_new(AGS_TYPE_SOLVER_MATRIX, NULL); return(solver_matrix); } gsequencer-3.1.3/ags/lib/ags_regex.h0000644000175000017500000000215513607210263014240 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_REGEX_H__ #define __AGS_REGEX_H__ #include #include #include #include G_BEGIN_DECLS int ags_regcomp(regex_t *preg, const char *regex, int cflags); int ags_regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); G_END_DECLS #endif /*__AGS_REGEX_H__*/ gsequencer-3.1.3/ags/lib/ags_conversion.h0000644000175000017500000000421213607210263015307 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONVERSION_H__ #define __AGS_CONVERSION_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_CONVERSION (ags_conversion_get_type()) #define AGS_CONVERSION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONVERSION, AgsConversion)) #define AGS_CONVERSION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CONVERSION, AgsConversionClass)) #define AGS_IS_CONVERSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CONVERSION)) #define AGS_IS_CONVERSION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CONVERSION)) #define AGS_CONVERSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_CONVERSION, AgsConversionClass)) #define AGS_CONVERSION_GET_OBJ_MUTEX(obj) (&(((AgsConversion *) obj)->obj_mutex)) typedef struct _AgsConversion AgsConversion; typedef struct _AgsConversionClass AgsConversionClass; struct _AgsConversion { GObject gobject; GRecMutex obj_mutex; gchar *name; gchar *description; }; struct _AgsConversionClass { GObjectClass gobject; gdouble (*convert)(AgsConversion *conversion, gdouble x, gboolean reverse); }; GType ags_conversion_get_type(void); gdouble ags_conversion_convert(AgsConversion *conversion, gdouble x, gboolean reverse); AgsConversion* ags_conversion_new(); G_END_DECLS #endif /*__AGS_CONVERSION_H__*/ gsequencer-3.1.3/ags/lib/ags_solver_matrix.h0000644000175000017500000000430713607210263016025 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOLVER_MATRIX_H__ #define __AGS_SOLVER_MATRIX_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SOLVER_MATRIX (ags_solver_matrix_get_type()) #define AGS_SOLVER_MATRIX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOLVER_MATRIX, AgsSolverMatrix)) #define AGS_SOLVER_MATRIX_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_SOLVER_MATRIX, AgsSolverMatrixClass)) #define AGS_IS_SOLVER_MATRIX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SOLVER_MATRIX)) #define AGS_IS_SOLVER_MATRIX_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SOLVER_MATRIX)) #define AGS_SOLVER_MATRIX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, AGS_TYPE_SOLVER_MATRIX, AgsSolverMatrixClass)) #define AGS_SOLVER_MATRIX_GET_OBJ_MUTEX(obj) (&(((AgsSolverMatrix *) obj)->obj_mutex)) typedef struct _AgsSolverMatrix AgsSolverMatrix; typedef struct _AgsSolverMatrixClass AgsSolverMatrixClass; struct _AgsSolverMatrix { GObject gobject; guint flags; GRecMutex obj_mutex; gchar **function_history; gchar *source_function; AgsSolverVector **term_table; guint row_count; guint column_count; }; struct _AgsSolverMatrixClass { GObjectClass gobject; }; GType ags_solver_matrix_get_type(void); AgsSolverMatrix* ags_solver_matrix_new(); G_END_DECLS #endif /*__AGS_SOLVER_MATRIX_H__*/ gsequencer-3.1.3/ags/lib/ags_complex.c0000644000175000017500000000530613607210263014571 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include /** * SECTION:ags_complex * @short_description: Boxed type of complex * @title: AgsComplex * @section_id: * @include: ags/lib/ags_complex.h * * Boxed type of complex data type. */ GType ags_complex_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_complex = 0; ags_type_complex = g_boxed_type_register_static("AgsComplex", (GBoxedCopyFunc) ags_complex_copy, (GBoxedFreeFunc) ags_complex_free); g_once_init_leave(&g_define_type_id__volatile, ags_type_complex); } return g_define_type_id__volatile; } /** * ags_complex_alloc: * * Allocate #AgsComplex * * Returns: a new #AgsComplex * * Since: 3.0.0 */ AgsComplex* ags_complex_alloc() { AgsComplex *ptr; ptr = (AgsComplex *) malloc(sizeof(AgsComplex)); ptr[0].real = 0.0; ptr[0].imag = 0.0; return(ptr); } /** * ags_complex_copy: * @ptr: the original #AgsComplex * * Create a copy of @ptr. * * Returns: a pointer of the new #AgsComplex * * Since: 3.0.0 */ gpointer ags_complex_copy(AgsComplex *ptr) { AgsComplex *new_ptr; new_ptr = (AgsComplex *) malloc(sizeof(AgsComplex)); new_ptr->real = ptr->real; new_ptr->imag = ptr->imag; return(new_ptr); } /** * ags_complex_free: * @ptr: the #AgsComplex * * Free the memory of @ptr. * * Since: 3.0.0 */ void ags_complex_free(AgsComplex *ptr) { g_free(ptr); } /** * ags_complex_get: * @ptr: the #AgsComplex * * Get complex number. * * Returns: number as complex data type * * Since: 3.0.0 */ complex ags_complex_get(AgsComplex *ptr) { complex z; z = ptr->real + I * ptr->imag; return(z); } /** * ags_complex_set: * @ptr: the #AgsComplex * @z: the complex data to set * * Set complex number. * * Since: 3.0.0 */ void ags_complex_set(AgsComplex *ptr, complex z) { ptr->real = creal(z); ptr->imag = cimag(z); } gsequencer-3.1.3/ags/lib/ags_turtle_manager.c0000644000175000017500000001426113607210263016133 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_turtle_manager_class_init(AgsTurtleManagerClass *turtle_manager); void ags_turtle_manager_init (AgsTurtleManager *turtle_manager); void ags_turtle_manager_dispose(GObject *gobject); void ags_turtle_manager_finalize(GObject *gobject); /** * SECTION:ags_turtle_manager * @short_description: Singleton pattern to organize turtles * @title: AgsTurtleManager * @section_id: * @include: ags/lib/ags_turtle_manager.h * * The #AgsTurtleManager keeps track of your turtles. */ static gpointer ags_turtle_manager_parent_class = NULL; AgsTurtleManager *ags_turtle_manager = NULL; GType ags_turtle_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_turtle_manager = 0; static const GTypeInfo ags_turtle_manager_info = { sizeof (AgsTurtleManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_turtle_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsTurtleManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_turtle_manager_init, }; ags_type_turtle_manager = g_type_register_static(G_TYPE_OBJECT, "AgsTurtleManager", &ags_turtle_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_turtle_manager); } return g_define_type_id__volatile; } void ags_turtle_manager_class_init(AgsTurtleManagerClass *turtle_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_turtle_manager_parent_class = g_type_class_peek_parent(turtle_manager); /* GObjectClass */ gobject = (GObjectClass *) turtle_manager; gobject->dispose = ags_turtle_manager_dispose; gobject->finalize = ags_turtle_manager_finalize; } void ags_turtle_manager_init(AgsTurtleManager *turtle_manager) { g_rec_mutex_init(&(turtle_manager->obj_mutex)); turtle_manager->turtle = NULL; } void ags_turtle_manager_dispose(GObject *gobject) { AgsTurtleManager *turtle_manager; GList *turtle; turtle_manager = AGS_TURTLE_MANAGER(gobject); turtle = turtle_manager->turtle; turtle_manager->turtle = NULL; g_list_free_full(turtle, g_object_unref); /* call parent */ G_OBJECT_CLASS(ags_turtle_manager_parent_class)->dispose(gobject); } void ags_turtle_manager_finalize(GObject *gobject) { AgsTurtleManager *turtle_manager; GList *turtle; turtle_manager = AGS_TURTLE_MANAGER(gobject); /* turtle */ turtle = turtle_manager->turtle; if(turtle != NULL){ g_list_free_full(turtle, g_object_unref); } if(turtle_manager == ags_turtle_manager){ ags_turtle_manager = NULL; } /* call parent */ G_OBJECT_CLASS(ags_turtle_manager_parent_class)->finalize(gobject); } /** * ags_turtle_manager_find: * @turtle_manager: the #AgsTurtleManager * @filename: the filename as string * * Find @filename in @turtle_manager. * * Returns: (transfer full): the matching #AgsTurtle, or %NULL * * Since: 3.0.0 */ GObject* ags_turtle_manager_find(AgsTurtleManager *turtle_manager, gchar *filename) { GObject *retval; GList *start_turtle, *turtle; gboolean success; GRecMutex *turtle_manager_mutex; GRecMutex *turtle_mutex; if(!AGS_IS_TURTLE_MANAGER(turtle_manager) || filename == NULL){ return(NULL); } turtle_manager_mutex = AGS_TURTLE_MANAGER_GET_OBJ_MUTEX(turtle_manager); g_rec_mutex_lock(turtle_manager_mutex); turtle = start_turtle = g_list_copy_deep(turtle_manager->turtle, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(turtle_manager_mutex); retval = NULL; while(turtle != NULL){ turtle_mutex = AGS_TURTLE_GET_OBJ_MUTEX(turtle->data); g_rec_mutex_lock(turtle_mutex); success = (!g_ascii_strcasecmp(AGS_TURTLE(turtle->data)->filename, filename)) ? TRUE: FALSE; g_rec_mutex_unlock(turtle_mutex); if(success){ retval = turtle->data; g_object_ref(retval); break; } turtle = turtle->next; } g_list_free_full(start_turtle, g_object_unref); return(retval); } /** * ags_turtle_manager_add: * @turtle_manager: the #AgsTurtleManager * @turtle: (transfer full): the #AgsTurtle * * Adds @turtle to @turtle_manager. * * Since: 3.0.0 */ void ags_turtle_manager_add(AgsTurtleManager *turtle_manager, GObject *turtle) { if(!AGS_IS_TURTLE_MANAGER(turtle_manager) || !AGS_IS_TURTLE(turtle)){ return; } if(g_list_find(turtle_manager->turtle, turtle) == NULL){ turtle_manager->turtle = g_list_prepend(turtle_manager->turtle, turtle); g_object_ref(turtle); } } /** * ags_turtle_manager_get_instance: * * Get instance of #AgsTurtleManager. * * Returns: (transfer none): the #AgsTurtleManager * * Since: 3.0.0 */ AgsTurtleManager* ags_turtle_manager_get_instance() { static GMutex mutex; g_mutex_lock(&(mutex)); if(ags_turtle_manager == NULL){ ags_turtle_manager = ags_turtle_manager_new(); } g_mutex_unlock(&(mutex)); return(ags_turtle_manager); } /** * ags_turtle_manager_new: * * Creates an #AgsTurtleManager * * Returns: a new #AgsTurtleManager * * Since: 3.0.0 */ AgsTurtleManager* ags_turtle_manager_new() { AgsTurtleManager *turtle_manager; turtle_manager = (AgsTurtleManager *) g_object_new(AGS_TYPE_TURTLE_MANAGER, NULL); return(turtle_manager); } gsequencer-3.1.3/ags/lib/ags_function.c0000644000175000017500000005620013607210263014746 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include void ags_function_class_init(AgsFunctionClass *function); void ags_function_init (AgsFunction *function); void ags_function_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_function_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_function_finalize(GObject *gobject); gchar* ags_function_literal_solve_expand_functions(gchar *transformed_function); gchar* ags_function_literal_solve_numeric_exponent_only(gchar *transformed_function); guint ags_function_literal_solve_find_max_exponent(gchar *transformed_function); /** * SECTION:ags_function * @short_description: Function to translate values * @title: AgsFunction * @section_id: * @include: ags/lib/ags_function.h * * The #AgsFunction translates values from linear math to a given * function. */ #define AGS_FUNCTION_EXPONENT_PATTERN "^((exp\\()(([0-9]|" \ AGS_SYMBOLIC_EULER "|" \ AGS_SYMBOLIC_PI "|" \ AGS_SYMBOLIC_INFINIT "|" \ AGS_SYMBOLIC_COMPLEX_UNIT ")+)(\\)))" #define ags_function_print_sin(term) (g_strdup_printf("1 / 2 * %s * exp(- %s * (%s) * log(%s)) - 1 / 2 * %s * exp(%s * (%s) * log(%s))", \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER)) #define ags_function_print_cos(term) (g_strdup_printf("(%s * exp(- %s * (%s) * log(%s))) / 2 + (%s * exp(%s * (%s) * log(%s))) / 2", \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER)) #define ags_function_print_tan(term) (g_strdup_printf("(%s * (exp(- %s * (%s) * log(%s)) - exp(%s * (%s) * log(%s)))) / (exp(- %s * (%s) * log(%s)) + exp(%s * (%s) * log(%s)))", \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_EULER)) #define ags_function_print_asin(term) (g_strdup_printf("(-%s * (log(exp(0.5 * log(1 - exp(2 * (%s)))) + %s * (%s))))", \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term)) #define ags_function_print_acos(term) (g_strdup_printf("(%s / 2 + %s * log(exp(0.5 * log(1 - exp(2 * (%s)))) + %s * (%s))))", \ AGS_SYMBOLIC_PI, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term)) #define ags_function_print_atan(term) (g_strdup_printf("(0.5 * %s * log(1 - %s * %s) - 0.5 * %s * log(1 + %s * %s))", \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ AGS_SYMBOLIC_COMPLEX_UNIT, \ term)) enum{ PROP_0, PROP_SOURCE_FUNCTION, PROP_NORMALIZED_FUNCTION, PROP_PIVOT_TABLE, PROP_FUNCTION_VECTOR_TABLE, PROP_SOLVER_LEVEL, }; static gpointer ags_function_parent_class = NULL; static GMutex regex_mutex; GType ags_function_get_type(void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_function = 0; static const GTypeInfo ags_function_info = { sizeof (AgsFunctionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_function_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFunction), 0, /* n_preallocs */ (GInstanceInitFunc) ags_function_init, }; ags_type_function = g_type_register_static(AGS_TYPE_CONVERSION, "AgsFunction", &ags_function_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_function); } return g_define_type_id__volatile; } void ags_function_class_init(AgsFunctionClass *function) { GObjectClass *gobject; GParamSpec *param_spec; ags_function_parent_class = g_type_class_peek_parent(function); /* GObjectClass */ gobject = (GObjectClass *) function; gobject->set_property = ags_function_set_property; gobject->get_property = ags_function_get_property; gobject->finalize = ags_function_finalize; /* properties */ /** * AgsFunction:source-function: * * The source function. * * Since: 3.0.0 */ param_spec = g_param_spec_string("source-function", i18n_pspec("function as string"), i18n_pspec("The function to use to translate values"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SOURCE_FUNCTION, param_spec); /** * AgsFunction:normalized-function: * * The normalized function. * * Since: 3.0.0 */ param_spec = g_param_spec_string("normalized-function", i18n_pspec("normalized form of function as string"), i18n_pspec("The normalized form of function to use to translate values"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NORMALIZED_FUNCTION, param_spec); /** * AgsFunction:pivot-table: * * The pivot table. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("pivot-table", i18n_pspec("pivot table representation"), i18n_pspec("The original pivot table representation"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_PIVOT_TABLE, param_spec); } void ags_function_init(AgsFunction *function) { function->flags = 0; function->is_pushing = TRUE; function->equation = NULL; function->transformed_equation = NULL; function->equation_count = 0; function->source_function = NULL; function->normalized_function = NULL; function->symbol = NULL; function->symbol_count = 0; function->solver_matrix = NULL; function->pivot_table_count = 0; function->column_count = NULL; function->row_count = NULL; function->pivot_table = NULL; function->solver_level = 0; function->solver_vector = NULL; } void ags_function_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFunction *function; function = AGS_FUNCTION(gobject); switch(prop_id){ case PROP_SOURCE_FUNCTION: { gchar *source_function; source_function = (gchar *) g_value_get_string(value); if(function->source_function == source_function){ return; } if(function->source_function != NULL){ g_free(function->source_function); } function->source_function = g_strdup(source_function); } break; case PROP_NORMALIZED_FUNCTION: { gchar *normalized_function; normalized_function = (gchar *) g_value_get_string(value); if(function->normalized_function == normalized_function){ return; } if(function->normalized_function != NULL){ g_free(function->normalized_function); } function->normalized_function = g_strdup(normalized_function); } break; case PROP_PIVOT_TABLE: { AgsComplex ***pivot_table; pivot_table = (AgsComplex ***) g_value_get_pointer(value); if(pivot_table == function->pivot_table){ return; } function->pivot_table = pivot_table; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_function_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFunction *function; function = AGS_FUNCTION(gobject); switch(prop_id){ case PROP_SOURCE_FUNCTION: g_value_set_string(value, function->source_function); break; case PROP_NORMALIZED_FUNCTION: g_value_set_string(value, function->normalized_function); break; case PROP_PIVOT_TABLE: g_value_set_pointer(value, function->pivot_table); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_function_finalize(GObject *gobject) { AgsFunction *function; guint i, j, k; function = AGS_FUNCTION(gobject); if(function->equation != NULL){ for(i = 0; i < function->equation_count; i++){ free(function->equation[i]); } free(function->equation); } if(function->source_function != NULL){ free(function->source_function); } if(function->normalized_function != NULL){ free(function->normalized_function); } if(function->symbol != NULL){ for(i = 0; i < function->symbol_count; i++){ free(function->symbol[i]); } free(function->symbol); } if(function->pivot_table != NULL){ for(i = 0; i < function->pivot_table_count; i++){ for(j = 0; j < function->row_count[i]; j++){ ags_complex_free(function->pivot_table[i][j]); free(function->pivot_table[i][j]); } free(function->pivot_table[i]); } free(function->pivot_table); } /* call parent */ G_OBJECT_CLASS(ags_function_parent_class)->finalize(gobject); } /** * ags_function_collapse_parantheses: * @function: the @AgsFunction * @function_count: return location of count of possible functions * * Collapse parantheses by respecting many possibilities. * * Returns: the one-dimensional array of possible functions as strings * * Since: 3.0.0 */ gchar** ags_function_collapse_parantheses(AgsFunction *function, guint *function_count) { gchar **functions; functions = NULL; //TODO:JK: implement me return(functions); } /** * ags_function_find_literals: * @function: The #AgsFunction * @symbol_count: return location of symbols count * * Find literal symbols i.e. variable names. * * Returns: The string vector containing symbols * * Since: 3.0.0 */ gchar** ags_function_find_literals(AgsFunction *function, guint *symbol_count) { regmatch_t match_arr[1]; gchar **literals; gchar *str; guint n_literals; static gboolean regex_compiled = FALSE; static regex_t literal_regex; static const char *literal_pattern = "^((?!log|exp|sin|cos|tan|asin|acos|atan)([a-zA-Z][0-9]*))"; static const size_t max_matches = 1; literals = NULL; n_literals = 0; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; regcomp(&literal_regex, literal_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); /* find literals */ str = function->source_function; while(str != NULL && *str != '\0'){ if(regexec(&literal_regex, str, max_matches, match_arr, 0) == 0){ if(literals == NULL){ literals = (gchar **) malloc((n_literals + 1) * sizeof(gchar *)); literals[n_literals] = g_strndup(str, match_arr[0].rm_eo - match_arr[0].rm_so); n_literals++; }else{ gchar *current_literal; current_literal = g_strndup(str, match_arr[0].rm_eo - match_arr[0].rm_so); if(!g_strv_contains(literals, current_literal)){ literals = (gchar **) realloc(literals, (n_literals + 1) * sizeof(gchar *)); literals[n_literals] = current_literal; n_literals++; }else{ g_free(current_literal); } } if(str[match_arr[0].rm_eo - match_arr[0].rm_so] != '\0'){ str += (match_arr[0].rm_eo - match_arr[0].rm_so); }else{ break; } }else{ break; } } /* return symbols and its count*/ if(symbol_count != NULL){ *symbol_count = n_literals; } return(literals); } gchar* ags_function_literal_solve_expand_functions(gchar *transformed_function) { regmatch_t match_arr[1]; gchar *expanded_functions; gchar *offset, *close_offset; gchar *str; gchar *open_paranthesis, *close_paranthesis, *tmp_paranthesis; int regexec_result; static gboolean regex_compiled = FALSE; static regex_t function_regex; static const char *function_pattern = "^(sin|cos|tan|asin|acos|atan)"; static const size_t max_matches = 1; /* compile regex */ g_mutex_lock(®ex_mutex); if(!regex_compiled){ regex_compiled = TRUE; regcomp(&function_regex, function_pattern, REG_EXTENDED); } g_mutex_unlock(®ex_mutex); /* */ expanded_functions = NULL; str = offset = g_strdup(transformed_function); close_offset = NULL; close_paranthesis = NULL; regexec_result = 0; while(regexec_result != REG_NOMATCH){ if((regexec_result = regexec(&function_regex, offset, max_matches, match_arr, 0)) == 0){ if(close_offset == NULL || close_offset > match_arr[0].rm_so){ offset = (gchar *) match_arr[0].rm_so; /* find close paranthesis */ open_paranthesis = offset; while((open_paranthesis = strchr(open_paranthesis, '(')) != NULL && close_paranthesis == NULL){ close_paranthesis = strchr(open_paranthesis, ')'); tmp_paranthesis = strchr(open_paranthesis, '('); if(tmp_paranthesis < close_paranthesis){ close_paranthesis = NULL; } } close_offset = close_paranthesis; }else{ if(close_offset != NULL){ if(!g_strcmp0(offset, "sin")){ }else if(!g_strcmp0(offset, "cos")){ }else if(!g_strcmp0(offset, "tan")){ }else if(!g_strcmp0(offset, "asin")){ }else if(!g_strcmp0(offset, "acos")){ }else if(!g_strcmp0(offset, "atan")){ } }else{ //NOTE:JK: you should report paranthesis mismatch break; } } } } return(expanded_functions); } gchar* ags_function_literal_solve_numeric_exponent_only(gchar *transformed_function) { gchar *numeric_exponent_only; guint n_terms; numeric_exponent_only = NULL; return(numeric_exponent_only); } guint ags_function_literal_solve_find_max_exponent(gchar *transformed_function) { regmatch_t match_arr[5]; guint max_exponent; static gboolean regex_compiled = FALSE; static regex_t exponent_regex; static const char *exponent_pattern = AGS_FUNCTION_EXPONENT_PATTERN; static const size_t max_matches = 5; max_exponent = 1; return(max_exponent); } /** * ags_function_literal_solve: * @function: the #AgsFunction * * Solves :source-function literally, allocates the pivot table and * creates the normalized function. * * Since: 3.0.0 */ void ags_function_literal_solve(AgsFunction *function) { gchar *transformed_function; gchar *normalized_function; gchar *str; guint max_exponent, available_exponent; guint i, j; normalized_function = NULL; /* compute dimensions */ transformed_function = g_strdup(function->source_function); max_exponent = function->symbol_count; /* step #0 of normalization - eliminate trigonometric functions */ str = transformed_function; transformed_function = ags_function_literal_solve_expand_functions(transformed_function); g_free(str); /* step #1 of normalization - numeric only exponents */ str = transformed_function; transformed_function = ags_function_literal_solve_numeric_exponent_only(transformed_function); g_free(str); /* find maximum exponent */ available_exponent = ags_function_literal_solve_find_max_exponent(transformed_function); if(max_exponent < available_exponent){ max_exponent = available_exponent; } //TODO:JK: implement me /* parse and merge terms */ //TODO:JK: implement me function->normalized_function = normalized_function; } /** * ags_function_push_equation: * @function: the #AgsFunction * @equation: an equation as string * * Push an equation to the solver stack. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_function_push_equation(AgsFunction *function, gchar *equation) { gchar *str; guint i; if(!AGS_IS_FUNCTION(function)){ return(FALSE); } i = function->equation_count; if(function->equation_count == 0){ function->equation = (gchar **) malloc(sizeof(gchar*)); function->transformed_equation = (gchar **) malloc(sizeof(gchar*)); }else{ function->equation = (gchar **) realloc(function->equation, (i + 1) * sizeof(gchar*)); function->transformed_equation = (gchar **) realloc(function->equation, (i + 1) * sizeof(gchar*)); } /* assume normalized else use right side as term - use subtraction */ if((str = strchr(equation, '=')) == NULL){ function->equation[i] = g_strdup(equation); }else{ gchar *offset; guint num_bytes; guint tmp0, tmp1; tmp0 = num_bytes = strlen(equation); num_bytes += 5; function->equation[i] = (gchar *) malloc(sizeof(gchar)); function->equation[i][num_bytes - 1] = '\0'; offset = function->equation[i]; *offset = '('; offset++; tmp1 = (str - equation); memcpy(offset, equation, tmp1 * sizeof(gchar)); offset += tmp1; *offset = ')'; offset++; *offset = '-'; offset++; *offset = '('; offset++; tmp0 = tmp0 - tmp1 - 1; memcpy(offset, equation + tmp1 + 1, tmp0 * sizeof(gchar)); *offset = ')'; offset++; } function->transformed_equation[i] = NULL; function->equation_count += 1; return(TRUE); } /** * ags_function_pop_equation: * @function: the #AgsFunction * @error: a #GError * * Pops the functions of the equation stack. Call this function as you're * finished with pushing equations. * * Since: 3.0.0 */ void ags_function_pop_equation(AgsFunction *function, GError **error) { guint length; guint i; if(!AGS_IS_FUNCTION(function)){ return; } /* retrieve of all equations string length */ length = 0; for(i = 0; i < function->equation_count; i++){ length += strlen(function->equation[i]); } /* allocate source function and memcpy equations - use addition */ if(function->equation_count > 0){ if(function->equation_count > 1){ length += (function->equation_count * 2) + (function->equation_count - 1) + 1; }else{ length += 1; } function->source_function = (gchar *) malloc(length * sizeof(gchar)); function->source_function[length - 1] = '\0'; if(function->equation_count > 1){ gchar *offset; guint num_bytes; offset = function->source_function; for(i = 0; i < function->equation_count; i++){ if(i != 0){ *offset = '+'; offset++; } *offset = '('; offset++; num_bytes = strlen(function->equation[i]); memcpy(offset, function->equation[i], num_bytes * sizeof(gchar)); offset += num_bytes; *offset = ')'; offset++; } }else{ memcpy(function->source_function, function->equation[0], strlen(function->equation[0]) * sizeof(gchar)); } }else{ function->source_function = NULL; return; } /* find literals and literal solve */ function->symbol = ags_function_find_literals(function, &(function->symbol_count)); ags_function_literal_solve(function); function->is_pushing = FALSE; } /** * ags_function_get_expanded: * @function: the #AgsFunction * @symbol: the symbols to compute * @symbol_count: the count of symbols * * Expands @symbols to normalized form. * * Returns: the normalized form as string * * Since: 3.0.0 */ gchar* ags_function_get_expanded(AgsFunction *function, gchar **symbol, guint symbol_count) { //TODO:JK: implement me return(NULL); } /** * ags_function_get_normalized: * @function: the #AgsFunction * * Get internal normalized string. * * Returns: the normalized string * * Since: 3.0.0 */ gchar* ags_function_get_normalized(AgsFunction *function) { if(!AGS_IS_FUNCTION(function)){ return(NULL); } return(function->normalized_function); } /** * ags_function_compute_term: * @term: the term as string to compute * @substitute_symbol: a variable to substitute * @substitute_value: the #AgsComplex value representing @substitute_symbol * * Compute term by substituting @substitute_symbol with @substitue_value and do basic * solving. * * Returns: the #AgsComplex value resulted by substitution * * Since: 3.0.0 */ AgsComplex* ags_function_compute_term(gchar *term, gchar *substitute_symbol, AgsComplex *substitute_value) { AgsComplex *complex_value; complex_value = ags_complex_alloc(); //TODO:JK: implement me return(complex_value); } /** * ags_function_symbolic_translate_value: * @function: the #AgsFunction * @symbol: the symbol to translate * @value: the value to substitute * * Symbolic translate to @value for @symbol and compute resulting * vector. * * Returns: the new #AgsComplex vector * * Since: 3.0.0 */ AgsComplex** ags_function_symbolic_translate_value(AgsFunction *function, gchar *symbol, AgsComplex *value) { //TODO:JK: implement me return(NULL); } /** * ags_function_substitute_values: * @function: the #AgsFunction * @symbol: the first symbol as string, or %NULL if no more symbol and value pair. * @...: %NULL terminated symbol and value pairs of list. * * Verify :source-function to be %TRUE or %FALSE by substitution. * * Returns: %TRUE if function evaluates, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_function_substitute_values(AgsFunction *function, gchar *symbol, ...) { //TODO:JK: implement me return(TRUE); } /** * ags_function_translate_value: * @function: the #AgsFunction * @value: the #AgsComplex value to translate * * Translates @value by source function. * * Returns: the solution as #AgsComplex boxed-type. * * Since: 3.0.0 */ AgsComplex* ags_function_translate_value(AgsFunction *function, AgsComplex *value) { AgsComplex *retval; retval = NULL; //TODO:JK: implement me return(retval); } /** * ags_function_new: * @source_function: the source function * * Instantiate a new #AgsFunction. * * Returns: the new instance * * Since: 3.0.0 */ AgsFunction* ags_function_new(gchar *source_function) { AgsFunction *function; function = g_object_new(AGS_TYPE_FUNCTION, "source-function", source_function, NULL); return(function); } gsequencer-3.1.3/ags/libags-gui.h0000644000175000017500000000360513540163170013552 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __LIBAGS_GUI_H__ #define __LIBAGS_GUI_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /*__LIBAGS_GUI_H__*/ gsequencer-3.1.3/ags/object/0000755000175000017500000000000013622252264012704 500000000000000gsequencer-3.1.3/ags/object/ags_soundcard.c0000644000175000017500000006610213616617253015617 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_soundcard_class_init(AgsSoundcardInterface *ginterface); /** * SECTION:ags_soundcard * @short_description: unique access to soundcards * @title: AgsSoundcard * @section_id: AgsSoundcard * @include: ags/object/ags_soundcard.h * * The #AgsSoundcard interface gives you a unique access to audio devices. */ enum { TIC, OFFSET_CHANGED, STOP, LAST_SIGNAL, }; static guint soundcard_signals[LAST_SIGNAL]; GType ags_soundcard_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_soundcard = 0; ags_type_soundcard = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsSoundcard", sizeof(AgsSoundcardInterface), (GClassInitFunc) ags_soundcard_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_soundcard); } return g_define_type_id__volatile; } GQuark ags_soundcard_error_quark() { return(g_quark_from_static_string("ags-soundcard-error-quark")); } void ags_soundcard_class_init(AgsSoundcardInterface *ginterface) { /** * AgsSoundcard::tic: * @soundcard: the #AgsSoundcard object * * The ::tic signal is emitted every tic of the soundcard. This notifies * about a newly played buffer. * * Since: 3.0.0 */ soundcard_signals[TIC] = g_signal_new("tic", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSoundcardInterface, tic), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsSoundcard::offset-changed: * @soundcard: the #AgsSoundcard object * @note_offset: new notation offset * * The ::offset-changed signal notifies about changed position within * notation. * * Since: 3.0.0 */ soundcard_signals[OFFSET_CHANGED] = g_signal_new("offset-changed", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSoundcardInterface, offset_changed), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); /** * AgsSoundcard::stop: * @soundcard: the #AgsSoundcard object * * The ::stop signal is emitted every stop of the soundcard. This notifies * about a newly played buffer. * * Since: 3.0.0 */ soundcard_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSoundcardInterface, stop), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } /** * ags_soundcard_set_device: * @soundcard: the #AgsSoundcard * @card_id: the device to set * * Set device. * * Since: 3.0.0 */ void ags_soundcard_set_device(AgsSoundcard *soundcard, gchar *card_id) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_device); soundcard_interface->set_device(soundcard, card_id); } /** * ags_soundcard_get_device: * @soundcard: the #AgsSoundcard * * Get device. * * Returns: the device's identifier * * Since: 3.0.0 */ gchar* ags_soundcard_get_device(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), NULL); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_device, NULL); return(soundcard_interface->get_device(soundcard)); } /** * ags_soundcard_get_presets: * @soundcard: the #AgsSoundcard * @channels: (out): the audio channels * @rate: (out): the samplerate * @buffer_size: (out): the buffer size * @format: (out): the format * * Get presets. * * Since: 3.0.0 */ void ags_soundcard_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->get_presets); soundcard_interface->get_presets(soundcard, channels, rate, buffer_size, format); } /** * ags_soundcard_set_presets: * @soundcard: the #AgsSoundcard * @channels: the audio channels * @rate: the samplerate * @buffer_size: the buffer size * @format: the format * * Set presets. * * Since: 3.0.0 */ void ags_soundcard_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_presets); soundcard_interface->set_presets(soundcard, channels, rate, buffer_size, format); } /** * ags_soundcard_list_cards: * @soundcard: the #AgsSoundcard * @card_id: (element-type utf8) (out callee-allocates) (array zero-terminated=1) (transfer full): a list containing card ids * @card_name: (element-type utf8) (out callee-allocates) (array zero-terminated=1) (transfer full): a list containing card names * * Retrieve @card_id and @card_name as a list of strings. * * Since: 3.0.0 */ void ags_soundcard_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->list_cards); soundcard_interface->list_cards(soundcard, card_id, card_name); } /** * ags_soundcard_pcm_info: * @soundcard: the #AgsSoundcard * @card_id: the selected soundcard by its string identifier * @channels_min: (out): min channels supported * @channels_max: (out): max channels supported * @rate_min: (out): min samplerate supported * @rate_max: (out): max samplerate supported * @buffer_size_min: (out): min buffer size supported by soundcard * @buffer_size_max: (out): max buffer size supported by soundcard * @error: an error that may occure * * Retrieve detailed information of @card_id soundcard. * * Since: 3.0.0 */ void ags_soundcard_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->pcm_info); soundcard_interface->pcm_info(soundcard, card_id, channels_min, channels_max, rate_min, rate_max, buffer_size_min, buffer_size_max, error); } /** * ags_soundcard_get_capability: * @soundcard: the #AgsSoundcard * * Retrieve #AgsSoundcardCapability-enum information. * * Returns: the capablities flags * * Since: 3.0.0 */ guint ags_soundcard_get_capability(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; guint capability; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), 0); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->pcm_info, 0); capability = soundcard_interface->get_capability(soundcard); return(capability); } /** * ags_soundcard_is_available: * @soundcard: the #AgsSoundcard * * Get available. * * Returns: %TRUE if available, else %FALSE * * Since: 3.0.0 */ gboolean ags_soundcard_is_available(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), FALSE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->is_available, FALSE); return(soundcard_interface->is_available(soundcard)); } /** * ags_soundcard_is_starting: * @soundcard: the #AgsSoundcard * * Get starting. * * Returns: %TRUE if starting, else %FALSE * * Since: 3.0.0 */ gboolean ags_soundcard_is_starting(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), FALSE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->is_starting, FALSE); return(soundcard_interface->is_starting(soundcard)); } /** * ags_soundcard_is_playing: * @soundcard: the #AgsSoundcard * * Get playing. * * Returns: %TRUE if playing, else %FALSE * * Since: 3.0.0 */ gboolean ags_soundcard_is_playing(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), FALSE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->is_playing, FALSE); return(soundcard_interface->is_playing(soundcard)); } /** * ags_soundcard_is_recording: * @soundcard: the #AgsSoundcard * * Get recording. * * Returns: %TRUE if recording, else %FALSE * * Since: 3.0.0 */ gboolean ags_soundcard_is_recording(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), FALSE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->is_recording, FALSE); return(soundcard_interface->is_recording(soundcard)); } /** * ags_soundcard_get_uptime: * @soundcard: the #AgsSoundcard * * Get playback time as string. * * Returns: playback time as string * * Since: 3.0.0 */ gchar* ags_soundcard_get_uptime(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), NULL); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_uptime, NULL); return(soundcard_interface->get_uptime(soundcard)); } /** * ags_soundcard_play_init: * @soundcard: the #AgsSoundcard * @error: an error that may occure * * Initializes the soundcard for playback. * * Since: 3.0.0 */ void ags_soundcard_play_init(AgsSoundcard *soundcard, GError **error) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->play_init); soundcard_interface->play_init(soundcard, error); } /** * ags_soundcard_play: * @soundcard: the #AgsSoundcard * @error: an error that may occure * * Plays the current buffer of soundcard. * * Since: 3.0.0 */ void ags_soundcard_play(AgsSoundcard *soundcard, GError **error) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->play); soundcard_interface->play(soundcard, error); } /** * ags_soundcard_record_init: * @soundcard: the #AgsSoundcard * @error: an error that may occure * * Initializes the soundcard for recordback. * * Since: 3.0.0 */ void ags_soundcard_record_init(AgsSoundcard *soundcard, GError **error) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->record_init); soundcard_interface->record_init(soundcard, error); } /** * ags_soundcard_record: * @soundcard: the #AgsSoundcard * @error: an error that may occure * * Records the current buffer of soundcard. * * Since: 3.0.0 */ void ags_soundcard_record(AgsSoundcard *soundcard, GError **error) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->record); soundcard_interface->record(soundcard, error); } /** * ags_soundcard_stop: * @soundcard: the #AgsSoundcard * * Stops the soundcard from playing to it. * * Since: 3.0.0 */ void ags_soundcard_stop(AgsSoundcard *soundcard) { g_signal_emit(soundcard, soundcard_signals[STOP], 0); } /** * ags_soundcard_tic: * @soundcard: the #AgsSoundcard * * Every call to play may generate a tic. * * Since: 3.0.0 */ void ags_soundcard_tic(AgsSoundcard *soundcard) { g_signal_emit(soundcard, soundcard_signals[TIC], 0); } /** * ags_soundcard_offset_changed: * @soundcard: the #AgsSoundcard * @note_offset: the current note offset * * Callback when counter expires minor note offset. * * Since: 3.0.0 */ void ags_soundcard_offset_changed(AgsSoundcard *soundcard, guint note_offset) { g_signal_emit(soundcard, soundcard_signals[OFFSET_CHANGED], 0, note_offset); } /** * ags_soundcard_get_buffer: * @soundcard: the #AgsSoundcard * * Get current playback buffer. * * Returns: current playback buffer * * Since: 3.0.0 */ void* ags_soundcard_get_buffer(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), NULL); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_buffer, NULL); return(soundcard_interface->get_buffer(soundcard)); } /** * ags_soundcard_get_next_buffer: * @soundcard: the #AgsSoundcard * * Get future playback buffer. * * Returns: next playback buffer * * Since: 3.0.0 */ void* ags_soundcard_get_next_buffer(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), NULL); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_next_buffer, NULL); return(soundcard_interface->get_next_buffer(soundcard)); } /** * ags_soundcard_get_prev_buffer: * @soundcard: the #AgsSoundcard * * Get future playback buffer. * * Returns: prev playback buffer * * Since: 3.0.0 */ void* ags_soundcard_get_prev_buffer(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), NULL); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_prev_buffer, NULL); return(soundcard_interface->get_prev_buffer(soundcard)); } /** * ags_soundcard_lock_buffer: * @soundcard: the #AgsSoundcard * @buffer: the buffer to lock * * Lock @buffer. * * Since: 3.0.0 */ void ags_soundcard_lock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->lock_buffer); soundcard_interface->lock_buffer(soundcard, buffer); } /** * ags_soundcard_unlock_buffer: * @soundcard: the #AgsSoundcard * @buffer: the buffer to unlock * * Unlock @buffer. * * Since: 3.0.0 */ void ags_soundcard_unlock_buffer(AgsSoundcard *soundcard, void *buffer) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->unlock_buffer); soundcard_interface->unlock_buffer(soundcard, buffer); } /** * ags_soundcard_set_bpm: * @soundcard: the #AgsSoundcard * @bpm: the bpm to set * * Set current playback bpm. * * Since: 3.0.0 */ void ags_soundcard_set_bpm(AgsSoundcard *soundcard, gdouble bpm) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_bpm); soundcard_interface->set_bpm(soundcard, bpm); } /** * ags_soundcard_get_bpm: * @soundcard: the #AgsSoundcard * * Get current playback bpm. * * Returns: bpm * * Since: 3.0.0 */ gdouble ags_soundcard_get_bpm(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXUINT); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_bpm, G_MAXUINT); return(soundcard_interface->get_bpm(soundcard)); } /** * ags_soundcard_set_delay_factor: * @soundcard: the #AgsSoundcard * @delay_factor: the delay factor to set * * Set current playback delay factor. * * Since: 3.0.0 */ void ags_soundcard_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_delay_factor); soundcard_interface->set_delay_factor(soundcard, delay_factor); } /** * ags_soundcard_get_delay_factor: * @soundcard: the #AgsSoundcard * * Get current playback delay factor. * * Returns: delay factor * * Since: 3.0.0 */ gdouble ags_soundcard_get_delay_factor(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXDOUBLE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_delay_factor, G_MAXDOUBLE); return(soundcard_interface->get_delay_factor(soundcard)); } /** * ags_soundcard_get_absolute_delay: * @soundcard: the #AgsSoundcard * * Get current playback delay. * * Returns: delay * * Since: 3.0.0 */ gdouble ags_soundcard_get_absolute_delay(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXDOUBLE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_absolute_delay, G_MAXDOUBLE); return(soundcard_interface->get_absolute_delay(soundcard)); } /** * ags_soundcard_get_delay: * @soundcard: the #AgsSoundcard * * Get current playback delay. * * Returns: delay * * Since: 3.0.0 */ gdouble ags_soundcard_get_delay(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXDOUBLE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_delay, G_MAXDOUBLE); return(soundcard_interface->get_delay(soundcard)); } /** * ags_soundcard_get_attack: * @soundcard: the #AgsSoundcard * * Get current playback attack. * * Returns: attack * * Since: 3.0.0 */ guint ags_soundcard_get_attack(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXUINT); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_attack, G_MAXUINT); return(soundcard_interface->get_attack(soundcard)); } /** * ags_soundcard_get_delay_counter: * @soundcard: the #AgsSoundcard * * Get current playback note offset. * * Returns: offset * * Since: 3.0.0 */ guint ags_soundcard_get_delay_counter(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXUINT); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_delay_counter, G_MAXUINT); return(soundcard_interface->get_delay_counter(soundcard)); } /** * ags_soundcard_set_start_note_offset: * @soundcard: the #AgsSoundcard * @start_note_offset: the start note offset to set * * Set start playback note offset. * * Since: 3.0.0 */ void ags_soundcard_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_start_note_offset); soundcard_interface->set_start_note_offset(soundcard, start_note_offset); } /** * ags_soundcard_get_start_note_offset: * @soundcard: the #AgsSoundcard * * Get start playback note offset. * * Returns: the start note offset * * Since: 3.0.0 */ guint ags_soundcard_get_start_note_offset(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXUINT); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_start_note_offset, G_MAXUINT); return(soundcard_interface->get_start_note_offset(soundcard)); } /** * ags_soundcard_set_note_offset: * @soundcard: the #AgsSoundcard * @note_offset: the note offset to set * * Set current playback note offset. * * Since: 3.0.0 */ void ags_soundcard_set_note_offset(AgsSoundcard *soundcard, guint note_offset) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_note_offset); soundcard_interface->set_note_offset(soundcard, note_offset); } /** * ags_soundcard_get_note_offset: * @soundcard: the #AgsSoundcard * * Get current playback note offset. * * Returns: the current note offset * * Since: 3.0.0 */ guint ags_soundcard_get_note_offset(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXUINT); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_note_offset, G_MAXUINT); return(soundcard_interface->get_note_offset(soundcard)); } /** * ags_soundcard_set_note_offset_absolute: * @soundcard: the #AgsSoundcard * @note_offset: the note offset to set * * Set current playback note offset. * * Since: 3.0.0 */ void ags_soundcard_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_note_offset_absolute); soundcard_interface->set_note_offset_absolute(soundcard, note_offset); } /** * ags_soundcard_get_note_offset_absolute: * @soundcard: the #AgsSoundcard * * Get current playback note offset. * * Returns: offset * * Since: 3.0.0 */ guint ags_soundcard_get_note_offset_absolute(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), G_MAXUINT); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_note_offset_absolute, G_MAXUINT); return(soundcard_interface->get_note_offset_absolute(soundcard)); } /** * ags_soundcard_set_loop: * @soundcard: the #AgsSoundcard * @loop_left: loop position of region * @loop_right: loop position of region * @do_loop: if %TRUE do loop, else don't loop * * Set loop parameters of @soundcard. * * Since: 3.0.0 */ void ags_soundcard_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->set_loop); soundcard_interface->set_loop(soundcard, loop_left, loop_right, do_loop); } /** * ags_soundcard_get_loop: * @soundcard: the #AgsSoundcard * @loop_left: (out): return location of loop position's region * @loop_right: (out): return location of loop position's region * @do_loop: (out): return location of do loop * * Get loop parameters of @soundcard. * * Since: 3.0.0 */ void ags_soundcard_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->get_loop); soundcard_interface->get_loop(soundcard, loop_left, loop_right, do_loop); } /** * ags_soundcard_get_loop_offset: * @soundcard: the #AgsSoundcard * * Get current playback loop offset. * * Returns: offset * * Since: 3.0.0 */ guint ags_soundcard_get_loop_offset(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), 0); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_loop_offset, 0); return(soundcard_interface->get_loop_offset(soundcard)); } /** * ags_soundcard_get_sub_block_count: * @soundcard: the #AgsSoundcard * * Get sub block count. * * Returns: the sub block count * * Since: 3.0.0 */ guint ags_soundcard_get_sub_block_count(AgsSoundcard *soundcard) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), 0); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->get_sub_block_count, 0); return(soundcard_interface->get_sub_block_count(soundcard)); } /** * ags_soundcard_trylock_sub_block: * @soundcard: the #AgsSoundcard * @buffer: the buffer to lock * @sub_block: and its sub block * * Trylock sub block. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_soundcard_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsSoundcardInterface *soundcard_interface; g_return_val_if_fail(AGS_IS_SOUNDCARD(soundcard), FALSE); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_val_if_fail(soundcard_interface->trylock_sub_block, FALSE); return(soundcard_interface->trylock_sub_block(soundcard, buffer, sub_block)); } /** * ags_soundcard_unlock_sub_block: * @soundcard: the #AgsSoundcard * @buffer: the buffer to lock * @sub_block: and its sub block * * Unlock sub block. * * Since: 3.0.0 */ void ags_soundcard_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block) { AgsSoundcardInterface *soundcard_interface; g_return_if_fail(AGS_IS_SOUNDCARD(soundcard)); soundcard_interface = AGS_SOUNDCARD_GET_INTERFACE(soundcard); g_return_if_fail(soundcard_interface->unlock_sub_block); soundcard_interface->unlock_sub_block(soundcard, buffer, sub_block); } gsequencer-3.1.3/ags/object/ags_connectable.h0000644000175000017500000000707313607210263016107 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONNECTABLE_H__ #define __AGS_CONNECTABLE_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CONNECTABLE (ags_connectable_get_type()) #define AGS_CONNECTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONNECTABLE, AgsConnectable)) #define AGS_CONNECTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_CONNECTABLE, AgsConnectableInterface)) #define AGS_IS_CONNECTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CONNECTABLE)) #define AGS_IS_CONNECTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_CONNECTABLE)) #define AGS_CONNECTABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_CONNECTABLE, AgsConnectableInterface)) typedef struct _AgsConnectable AgsConnectable; typedef struct _AgsConnectableInterface AgsConnectableInterface; struct _AgsConnectableInterface { GTypeInterface ginterface; AgsUUID* (*get_uuid)(AgsConnectable *connectable); gboolean (*has_resource)(AgsConnectable *connectable); gboolean (*is_ready)(AgsConnectable *connectable); void (*add_to_registry)(AgsConnectable *connectable); void (*remove_from_registry)(AgsConnectable *connectable); xmlNode* (*list_resource)(AgsConnectable *connectable); xmlNode* (*xml_compose)(AgsConnectable *connectable); void (*xml_parse)(AgsConnectable *connectable, xmlNode *node); gboolean (*is_connected)(AgsConnectable *connectable); void (*connect)(AgsConnectable *connectable); void (*disconnect)(AgsConnectable *connectable); void (*connect_connection)(AgsConnectable *connectable, GObject *connection); void (*disconnect_connection)(AgsConnectable *connectable, GObject *connection); }; GType ags_connectable_get_type(); AgsUUID* ags_connectable_get_uuid(AgsConnectable *connectable); gboolean ags_connectable_has_resource(AgsConnectable *connectable); gboolean ags_connectable_is_ready(AgsConnectable *connectable); void ags_connectable_add_to_registry(AgsConnectable *connectable); void ags_connectable_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_connectable_list_resource(AgsConnectable *connectable); xmlNode* ags_connectable_xml_compose(AgsConnectable *connectable); void ags_connectable_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_connectable_is_connected(AgsConnectable *connectable); void ags_connectable_connect(AgsConnectable *connectable); void ags_connectable_disconnect(AgsConnectable *connectable); void ags_connectable_connect_connection(AgsConnectable *connectable, GObject *connection); void ags_connectable_disconnect_connection(AgsConnectable *connectable, GObject *connection); G_END_DECLS #endif /*__AGS_CONNECTABLE_H__*/ gsequencer-3.1.3/ags/object/ags_soundcard.h0000644000175000017500000002644413607210263015617 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNDCARD_H__ #define __AGS_SOUNDCARD_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUNDCARD (ags_soundcard_get_type()) #define AGS_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUNDCARD, AgsSoundcard)) #define AGS_SOUNDCARD_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SOUNDCARD, AgsSoundcardInterface)) #define AGS_IS_SOUNDCARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SOUNDCARD)) #define AGS_IS_SOUNDCARD_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SOUNDCARD)) #define AGS_SOUNDCARD_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SOUNDCARD, AgsSoundcardInterface)) #define AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS (2) #define AGS_SOUNDCARD_MIN_DSP_CHANNELS (1) #define AGS_SOUNDCARD_MAX_DSP_CHANNELS (64) #define AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS (2) #define AGS_SOUNDCARD_MIN_PCM_CHANNELS (1) #define AGS_SOUNDCARD_MAX_PCM_CHANNELS (64) #define AGS_SOUNDCARD_DEFAULT_SAMPLERATE (48000.0) #define AGS_SOUNDCARD_MIN_SAMPLERATE (8000.0) #define AGS_SOUNDCARD_MAX_SAMPLERATE (5644800.0) #define AGS_SOUNDCARD_DEFAULT_FORMAT (AGS_SOUNDCARD_SIGNED_16_BIT) #define AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE (1024) #define AGS_SOUNDCARD_MIN_BUFFER_SIZE (16) #define AGS_SOUNDCARD_MAX_BUFFER_SIZE (16384) #define AGS_SOUNDCARD_DEFAULT_BPM (120.0) #define AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR (1.0 / 4.0) #define AGS_SOUNDCARD_DEFAULT_JIFFIE ((double) AGS_SOUNDCARD_DEFAULT_SAMPLERATE / (double) AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) #define AGS_SOUNDCARD_DEFAULT_TACT (1.0 / 1.0) #define AGS_SOUNDCARD_DEFAULT_TACT_JIFFIE (60.0 / AGS_SOUNDCARD_DEFAULT_BPM * AGS_SOUNDCARD_DEFAULT_TACT) #define AGS_SOUNDCARD_DEFAULT_TACTRATE (1.0 / AGS_SOUNDCARD_DEFAULT_TACT_JIFFIE) #define AGS_SOUNDCARD_DEFAULT_SCALE (1.0) #define AGS_SOUNDCARD_DEFAULT_DELAY ((60.0 * ((AGS_SOUNDCARD_DEFAULT_SAMPLERATE / AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE) / AGS_SOUNDCARD_DEFAULT_BPM)) * ((1.0 / 16.0) * (1.0 / AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR))) #define AGS_SOUNDCARD_DEFAULT_PERIOD (64.0) #define AGS_SOUNDCARD_DEFAULT_LOOP_LEFT (0) #define AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT (64) #ifdef __APPLE__ #define AGS_SOUNDCARD_DEFAULT_OVERCLOCK (2.0) #else #define AGS_SOUNDCARD_DEFAULT_OVERCLOCK (0.0) #endif #define AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT (8) typedef struct _AgsSoundcard AgsSoundcard; typedef struct _AgsSoundcardInterface AgsSoundcardInterface; /** * AgsSoundcardFormat: * @AGS_SOUNDCARD_SIGNED_8_BIT: signed 8 bit raw pcm data * @AGS_SOUNDCARD_SIGNED_16_BIT: signed 16 bit raw pcm data * @AGS_SOUNDCARD_SIGNED_24_BIT: signed 24 bit raw pcm data * @AGS_SOUNDCARD_SIGNED_32_BIT: signed 32 bit raw pcm data * @AGS_SOUNDCARD_SIGNED_64_BIT: signed 64 bit raw pcm data * @AGS_SOUNDCARD_FLOAT: float raw pcm data * @AGS_SOUNDCARD_DOUBLE: double raw pcm data * @AGS_SOUNDCARD_COMPLEX: complex audio data * * #AgsSoundcardFormat specifies the audio data representation to be used. */ typedef enum{ AGS_SOUNDCARD_SIGNED_8_BIT = 0x8, AGS_SOUNDCARD_SIGNED_16_BIT = 0x10, AGS_SOUNDCARD_SIGNED_24_BIT = 0x18, AGS_SOUNDCARD_SIGNED_32_BIT = 0x20, AGS_SOUNDCARD_SIGNED_64_BIT = 0x40, AGS_SOUNDCARD_FLOAT = 0xfffffff0, AGS_SOUNDCARD_DOUBLE = 0xfffffff1, AGS_SOUNDCARD_COMPLEX = 0xfffffff8, }AgsSoundcardFormat; /** * AgsSoundcardCapability: * @AGS_SOUNDCARD_CAPABILITY_PLAYBACK: capability playback * @AGS_SOUNDCARD_CAPABILITY_CAPTURE: capability capture * @AGS_SOUNDCARD_CAPABILITY_DUPLEX: capability duplex * * Enum values to tell about capability. */ typedef enum{ AGS_SOUNDCARD_CAPABILITY_PLAYBACK = 1, AGS_SOUNDCARD_CAPABILITY_CAPTURE = 1 << 1, AGS_SOUNDCARD_CAPABILITY_DUPLEX = 1 << 2, }AgsSoundcardCapability; struct _AgsSoundcardInterface { GTypeInterface ginterface; void (*set_device)(AgsSoundcard *soundcard, gchar *card_id); gchar* (*get_device)(AgsSoundcard *soundcard); void (*pcm_info)(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint (*get_capability)(AgsSoundcard *soundcard); void (*set_presets)(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void (*get_presets)(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void (*list_cards)(AgsSoundcard *soundcard, GList **card_id, GList **card_name); gboolean (*is_available)(AgsSoundcard *soundcard); gboolean (*is_starting)(AgsSoundcard *soundcard); gboolean (*is_playing)(AgsSoundcard *soundcard); gboolean (*is_recording)(AgsSoundcard *soundcard); gchar* (*get_uptime)(AgsSoundcard *soundcard); void (*play_init)(AgsSoundcard *soundcard, GError **error); void (*play)(AgsSoundcard *soundcard, GError **error); void (*record_init)(AgsSoundcard *soundcard, GError **error); void (*record)(AgsSoundcard *soundcard, GError **error); void (*stop)(AgsSoundcard *soundcard); void (*tic)(AgsSoundcard *soundcard); void (*offset_changed)(AgsSoundcard *soundcard, guint note_offset); void* (*get_buffer)(AgsSoundcard *soundcard); void* (*get_next_buffer)(AgsSoundcard *soundcard); void* (*get_prev_buffer)(AgsSoundcard *soundcard); void (*lock_buffer)(AgsSoundcard *soundcard, void *buffer); void (*unlock_buffer)(AgsSoundcard *soundcard, void *buffer); void (*set_bpm)(AgsSoundcard *soundcard, gdouble bpm); gdouble (*get_bpm)(AgsSoundcard *soundcard); void (*set_delay_factor)(AgsSoundcard *soundcard, gdouble delay_factor); gdouble (*get_delay_factor)(AgsSoundcard *soundcard); gdouble (*get_absolute_delay)(AgsSoundcard *soundcard); gdouble (*get_delay)(AgsSoundcard *soundcard); guint (*get_attack)(AgsSoundcard *soundcard); guint (*get_delay_counter)(AgsSoundcard *soundcard); void (*set_start_note_offset)(AgsSoundcard *soundcard, guint start_note_offset); guint (*get_start_note_offset)(AgsSoundcard *soundcard); void (*set_note_offset)(AgsSoundcard *soundcard, guint note_offset); guint (*get_note_offset)(AgsSoundcard *soundcard); void (*set_note_offset_absolute)(AgsSoundcard *soundcard, guint note_offset); guint (*get_note_offset_absolute)(AgsSoundcard *soundcard); void (*set_loop)(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void (*get_loop)(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint (*get_loop_offset)(AgsSoundcard *soundcard); guint (*get_sub_block_count)(AgsSoundcard *soundcard); gboolean (*trylock_sub_block)(AgsSoundcard *soundcard, void *buffer, guint sub_block); void (*unlock_sub_block)(AgsSoundcard *soundcard, void *buffer, guint sub_block); }; GType ags_soundcard_get_type(); void ags_soundcard_set_device(AgsSoundcard *soundcard, gchar *card_id); gchar* ags_soundcard_get_device(AgsSoundcard *soundcard); void ags_soundcard_set_presets(AgsSoundcard *soundcard, guint channels, guint rate, guint buffer_size, guint format); void ags_soundcard_get_presets(AgsSoundcard *soundcard, guint *channels, guint *rate, guint *buffer_size, guint *format); void ags_soundcard_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name); void ags_soundcard_pcm_info(AgsSoundcard *soundcard, gchar *card_id, guint *channels_min, guint *channels_max, guint *rate_min, guint *rate_max, guint *buffer_size_min, guint *buffer_size_max, GError **error); guint ags_soundcard_get_capability(AgsSoundcard *soundcard); gboolean ags_soundcard_is_available(AgsSoundcard *soundcard); gboolean ags_soundcard_is_starting(AgsSoundcard *soundcard); gboolean ags_soundcard_is_playing(AgsSoundcard *soundcard); gboolean ags_soundcard_is_recording(AgsSoundcard *soundcard); gchar* ags_soundcard_get_uptime(AgsSoundcard *soundcard); void ags_soundcard_play_init(AgsSoundcard *soundcard, GError **error); void ags_soundcard_play(AgsSoundcard *soundcard, GError **error); void ags_soundcard_record_init(AgsSoundcard *soundcard, GError **error); void ags_soundcard_record(AgsSoundcard *soundcard, GError **error); void ags_soundcard_stop(AgsSoundcard *soundcard); void ags_soundcard_tic(AgsSoundcard *soundcard); void ags_soundcard_offset_changed(AgsSoundcard *soundcard, guint note_offset); void* ags_soundcard_get_buffer(AgsSoundcard *soundcard); void* ags_soundcard_get_next_buffer(AgsSoundcard *soundcard); void* ags_soundcard_get_prev_buffer(AgsSoundcard *soundcard); void ags_soundcard_lock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_soundcard_unlock_buffer(AgsSoundcard *soundcard, void *buffer); void ags_soundcard_set_bpm(AgsSoundcard *soundcard, gdouble bpm); gdouble ags_soundcard_get_bpm(AgsSoundcard *soundcard); void ags_soundcard_set_delay_factor(AgsSoundcard *soundcard, gdouble delay_factor); gdouble ags_soundcard_get_delay_factor(AgsSoundcard *soundcard); gdouble ags_soundcard_get_absolute_delay(AgsSoundcard *soundcard); gdouble ags_soundcard_get_delay(AgsSoundcard *soundcard); guint ags_soundcard_get_attack(AgsSoundcard *soundcard); guint ags_soundcard_get_delay_counter(AgsSoundcard *soundcard); void ags_soundcard_set_start_note_offset(AgsSoundcard *soundcard, guint start_note_offset); guint ags_soundcard_get_start_note_offset(AgsSoundcard *soundcard); void ags_soundcard_set_note_offset(AgsSoundcard *soundcard, guint note_offset); guint ags_soundcard_get_note_offset(AgsSoundcard *soundcard); void ags_soundcard_set_note_offset_absolute(AgsSoundcard *soundcard, guint note_offset); guint ags_soundcard_get_note_offset_absolute(AgsSoundcard *soundcard); void ags_soundcard_set_loop(AgsSoundcard *soundcard, guint loop_left, guint loop_right, gboolean do_loop); void ags_soundcard_get_loop(AgsSoundcard *soundcard, guint *loop_left, guint *loop_right, gboolean *do_loop); guint ags_soundcard_get_loop_offset(AgsSoundcard *soundcard); guint ags_soundcard_get_sub_block_count(AgsSoundcard *soundcard); gboolean ags_soundcard_trylock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); void ags_soundcard_unlock_sub_block(AgsSoundcard *soundcard, void *buffer, guint sub_block); G_END_DECLS #endif /*__AGS_SOUNDCARD_H__*/ gsequencer-3.1.3/ags/object/ags_priority.c0000644000175000017500000003372213614062654015515 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #ifndef AGS_W32API #include #endif #include #include void ags_priority_class_init(AgsPriorityClass *priority_class); void ags_priority_init(AgsPriority *priority); void ags_priority_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_priority_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_priority_dispose(GObject *gobject); void ags_priority_finalize(GObject *gobject); gchar* ags_priority_get_version(AgsPriority *priority); void ags_priority_set_version(AgsPriority *priority, gchar *version); gchar* ags_priority_get_build_id(AgsPriority *priority); void ags_priority_set_build_id(AgsPriority *priority, gchar *build_id); void ags_priority_real_load_defaults(AgsPriority *priority); void ags_priority_real_set_value(AgsPriority *priority, gchar *group, gchar *key, gchar *value); gchar* ags_priority_real_get_value(AgsPriority *priority, gchar *group, gchar *key); /** * SECTION:ags_priority * @short_description: Priority Advanced Gtk+ Sequencer * @title: AgsPriority * @section_id: * @include: ags/object/ags_priority.h * * #AgsPriority provides priorities to Advanced Gtk+ Sequencer. */ enum{ LOAD_DEFAULTS, SET_VALUE, GET_VALUE, LAST_SIGNAL, }; enum{ PROP_0, }; static gpointer ags_priority_parent_class = NULL; static guint priority_signals[LAST_SIGNAL]; AgsPriority *ags_priority = NULL; GType ags_priority_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_priority = 0; static const GTypeInfo ags_priority_info = { sizeof (AgsPriorityClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_priority_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPriority), 0, /* n_preallocs */ (GInstanceInitFunc) ags_priority_init, }; ags_type_priority = g_type_register_static(G_TYPE_OBJECT, "AgsPriority", &ags_priority_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_priority); } return g_define_type_id__volatile; } void ags_priority_class_init(AgsPriorityClass *priority) { GObjectClass *gobject; GParamSpec *param_spec; ags_priority_parent_class = g_type_class_peek_parent(priority); /* GObjectClass */ gobject = (GObjectClass *) priority; gobject->set_property = ags_priority_set_property; gobject->get_property = ags_priority_get_property; gobject->dispose = ags_priority_dispose; gobject->finalize = ags_priority_finalize; /* properties */ /* AgsPriorityClass */ priority->load_defaults = ags_priority_real_load_defaults; priority->set_value = ags_priority_real_set_value; priority->get_value = ags_priority_real_get_value; /* signals */ /** * AgsPriority::load-defaults: * @priority: the object to resolve * * The ::load-defaults signal notifies about loading defaults * * Since: 3.0.0 */ priority_signals[LOAD_DEFAULTS] = g_signal_new("load-defaults", G_TYPE_FROM_CLASS (priority), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPriorityClass, load_defaults), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsPriority::set-value: * @priority: the object to resolve * @group: the group to apply to * @key: the key to set * @value: the value to apply * * The ::set-value signal notifies about value been setting. * * Since: 3.0.0 */ priority_signals[SET_VALUE] = g_signal_new("set-value", G_TYPE_FROM_CLASS (priority), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPriorityClass, set_value), NULL, NULL, ags_cclosure_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); /** * AgsPriority::get-value: * @priority: the object to resolve * @group: the group to retrieve from * @key: the key to get * * The ::get-value signal notifies about value been getting. * * Returns: the value * * Since: 3.0.0 */ priority_signals[GET_VALUE] = g_signal_new("get-value", G_TYPE_FROM_CLASS (priority), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsPriorityClass, get_value), NULL, NULL, ags_cclosure_marshal_STRING__STRING_STRING, G_TYPE_STRING, 2, G_TYPE_STRING, G_TYPE_STRING); } void ags_priority_init(AgsPriority *priority) { priority->flags = 0; g_rec_mutex_init(&(priority->obj_mutex)); /* version and build id */ priority->version = g_strdup(AGS_PRIORITY_DEFAULT_VERSION); priority->build_id = g_strdup(AGS_PRIORITY_DEFAULT_BUILD_ID); priority->key_file = g_key_file_new(); g_key_file_ref(priority->key_file); } void ags_priority_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsPriority *priority; GRecMutex *priority_mutex; priority = AGS_PRIORITY(gobject); /* get priority mutex */ priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_priority_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsPriority *priority; GRecMutex *priority_mutex; priority = AGS_PRIORITY(gobject); /* get priority mutex */ priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_priority_dispose(GObject *gobject) { AgsPriority *priority; priority = (AgsPriority *) gobject; /* call parent */ G_OBJECT_CLASS(ags_priority_parent_class)->dispose(gobject); } void ags_priority_finalize(GObject *gobject) { AgsPriority *priority; priority = (AgsPriority *) gobject; /* key file */ if(priority->key_file != NULL){ g_key_file_unref(priority->key_file); } /* global variable */ if(ags_priority == priority){ ags_priority = NULL; } /* call parent */ G_OBJECT_CLASS(ags_priority_parent_class)->finalize(gobject); } gchar* ags_priority_get_version(AgsPriority *priority) { gchar *version; GRecMutex *priority_mutex; if(!AGS_IS_PRIORITY(priority)){ return(NULL); } priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* get version */ g_rec_mutex_lock(priority_mutex); version = priority->version; g_rec_mutex_unlock(priority_mutex); return(version); } void ags_priority_set_version(AgsPriority *priority, gchar *version) { GRecMutex *priority_mutex; if(!AGS_IS_PRIORITY(priority)){ return; } priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* set version */ g_rec_mutex_lock(priority_mutex); priority->version = g_strdup(version); g_rec_mutex_unlock(priority_mutex); } gchar* ags_priority_get_build_id(AgsPriority *priority) { gchar *build_id; GRecMutex *priority_mutex; if(!AGS_IS_PRIORITY(priority)){ return(NULL); } priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* get build id */ g_rec_mutex_lock(priority_mutex); build_id = priority->build_id; g_rec_mutex_unlock(priority_mutex); return(build_id); } void ags_priority_set_build_id(AgsPriority *priority, gchar *build_id) { GRecMutex *priority_mutex; if(!AGS_IS_PRIORITY(priority)){ return; } priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* set version */ g_rec_mutex_lock(priority_mutex); priority->build_id = g_strdup(build_id); g_rec_mutex_unlock(priority_mutex); } void ags_priority_real_load_defaults(AgsPriority *priority) { GRecMutex *priority_mutex; priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* load defaults */ g_rec_mutex_lock(priority_mutex); ags_priority_set_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_LIBAGS, "0"); // 45 ags_priority_set_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_SERVER_MAIN_LOOP, "0"); // 15 ags_priority_set_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO_MAIN_LOOP, "0"); // 15 ags_priority_set_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_AUDIO, "0"); // 45 ags_priority_set_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_OSC_SERVER_MAIN_LOOP, "0"); // 15 ags_priority_set_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_GUI_MAIN_LOOP, "0"); // 15 g_rec_mutex_unlock(priority_mutex); } /** * ags_priority_load_defaults: * @priority: the #AgsPriority * * Load priorities from default values. * * Since: 3.0.0 */ void ags_priority_load_defaults(AgsPriority *priority) { g_return_if_fail(AGS_IS_PRIORITY(priority)); g_object_ref(G_OBJECT(priority)); g_signal_emit(G_OBJECT(priority), priority_signals[LOAD_DEFAULTS], 0); g_object_unref(G_OBJECT(priority)); } /** * ags_priority_load_from_file: * @priority: the #AgsPriority * @filename: the priorityuration file * * Load priorities from @filename. * * Since: 3.0.0 */ void ags_priority_load_from_file(AgsPriority *priority, gchar *filename) { GFile *file; GRecMutex *priority_mutex; if(!AGS_IS_PRIORITY(priority)){ return; } priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); file = g_file_new_for_path(filename); g_message("loading priorities for: %s", filename); if(!g_file_query_exists(file, NULL)){ ags_priority_load_defaults(priority); }else{ GKeyFile *key_file; gchar **groups, **groups_start; gchar **keys, **keys_start; gchar *value; GError *error; g_rec_mutex_lock(priority_mutex); error = NULL; key_file = g_key_file_new(); g_key_file_load_from_file(key_file, filename, G_KEY_FILE_NONE, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } groups = groups_start = g_key_file_get_groups(key_file, NULL); while(*groups != NULL){ keys = keys_start = g_key_file_get_keys(key_file, *groups, NULL, NULL); while(*keys != NULL){ value = g_key_file_get_value(key_file, *groups, *keys, NULL); ags_priority_set_value(priority, *groups, *keys, value); keys++; } g_strfreev(keys_start); groups++; } g_strfreev(groups_start); g_key_file_unref(key_file); g_rec_mutex_unlock(priority_mutex); } g_object_unref(file); } void ags_priority_real_set_value(AgsPriority *priority, gchar *group, gchar *key, gchar *value) { GRecMutex *priority_mutex; priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* set value */ g_rec_mutex_lock(priority_mutex); g_key_file_set_value(priority->key_file, group, key, value); g_rec_mutex_unlock(priority_mutex); } /** * ags_priority_set_value: * @priority: the #AgsPriority * @group: the priority group identifier * @key: the key of the property * @value: the value to set * * Set priority by @group and @key, applying @value. * * Since: 3.0.0 */ void ags_priority_set_value(AgsPriority *priority, gchar *group, gchar *key, gchar *value) { g_return_if_fail(AGS_IS_PRIORITY(priority)); g_object_ref(G_OBJECT(priority)); g_signal_emit(G_OBJECT(priority), priority_signals[SET_VALUE], 0, group, key, value); g_object_unref(G_OBJECT(priority)); } gchar* ags_priority_real_get_value(AgsPriority *priority, gchar *group, gchar *key) { gchar *str; GError *error; GRecMutex *priority_mutex; priority_mutex = AGS_PRIORITY_GET_OBJ_MUTEX(priority); /* get value */ g_rec_mutex_lock(priority_mutex); error = NULL; str = g_key_file_get_value(priority->key_file, group, key, &error); if(error != NULL){ // g_warning("%s", error->message); g_error_free(error); } g_rec_mutex_unlock(priority_mutex); return(str); } /** * ags_priority_get_value: * @priority: the #AgsPriority * @group: the priority group identifier * @key: the key of the property * * Retrieve priority by @group and @key. * * Returns: (transfer full): the property's value * * Since: 3.0.0 */ gchar* ags_priority_get_value(AgsPriority *priority, gchar *group, gchar *key) { gchar *value; g_return_val_if_fail(AGS_IS_PRIORITY(priority), NULL); g_object_ref(G_OBJECT(priority)); g_signal_emit(G_OBJECT(priority), priority_signals[GET_VALUE], 0, group, key, &value); g_object_unref(G_OBJECT(priority)); return(value); } /** * ags_priority_get_instance: * * Get priority instance. * * Returns: (transfer none): the priority instance * * Since: 3.0.0 */ AgsPriority* ags_priority_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_priority == NULL){ ags_priority = ags_priority_new(NULL); } g_mutex_unlock(&mutex); return(ags_priority); } /** * ags_priority_new: * * Create a new instance of #AgsPriority. * * Returns: the new #AgsPriority. * * Since: 3.0.0 */ AgsPriority* ags_priority_new() { AgsPriority *priority; priority = (AgsPriority *) g_object_new(AGS_TYPE_PRIORITY, NULL); return(priority); } gsequencer-3.1.3/ags/object/ags_sequencer.c0000644000175000017500000003746313616617253015637 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_sequencer_class_init(AgsSequencerInterface *ginterface); /** * SECTION:ags_sequencer * @short_description: unique access to sequencers * @title: AgsSequencer * @section_id: AgsSequencer * @include: ags/object/ags_sequencer.h * * The #AgsSequencer interface gives you a unique access to MIDI devices. */ GType ags_sequencer_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sequencer = 0; ags_type_sequencer = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsSequencer", sizeof(AgsSequencerInterface), (GClassInitFunc) ags_sequencer_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sequencer); } return g_define_type_id__volatile; } GQuark ags_sequencer_error_quark() { return(g_quark_from_static_string("ags-sequencer-error-quark")); } void ags_sequencer_class_init(AgsSequencerInterface *ginterface) { /** * AgsSequencer::tic: * @sequencer: the #AgsSequencer object * * The ::tic signal is emitted every tic of the sequencer. This notifies * about a newly played buffer. * * Since: 3.0.0 */ g_signal_new("tic", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSequencerInterface, tic), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsSequencer::offset-changed: * @sequencer: the #AgsSequencer object * @note_offset: new notation offset * * The ::offset-changed signal notifies about changed position within * notation. * * Since: 3.0.0 */ g_signal_new("offset-changed", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSequencerInterface, offset_changed), NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); } /** * ags_sequencer_set_device: * @sequencer: the #AgsSequencer * @card_id: the device to set * * Set device. * * Since: 3.0.0 */ void ags_sequencer_set_device(AgsSequencer *sequencer, gchar *card_id) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->set_device); sequencer_interface->set_device(sequencer, card_id); } /** * ags_sequencer_get_device: * @sequencer: the #AgsSequencer * * Get device. * * Returns: the device's identifier * * Since: 3.0.0 */ gchar* ags_sequencer_get_device(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), NULL); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_device, NULL); return(sequencer_interface->get_device(sequencer)); } /** * ags_sequencer_list_cards: * @sequencer: the #AgsSequencer * @card_id: (element-type utf8) (out callee-allocates) (array zero-terminated=1) (transfer full): a list containing card ids * @card_name: (element-type utf8) (out callee-allocates) (array zero-terminated=1) (transfer full): a list containing card names * * Retrieve @card_id and @card_name as a list of strings. * * Since: 3.0.0 */ void ags_sequencer_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->list_cards); sequencer_interface->list_cards(sequencer, card_id, card_name); } /** * ags_sequencer_is_starting: * @sequencer: the #AgsSequencer * * Get starting. * * Returns: %TRUE if starting, else %FALSE * * Since: 3.0.0 */ gboolean ags_sequencer_is_starting(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), FALSE); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->is_starting, FALSE); return(sequencer_interface->is_starting(sequencer)); } /** * ags_sequencer_is_playing: * @sequencer: the #AgsSequencer * * Get playing. * * Returns: %TRUE if playing, else %FALSE * * Since: 3.0.0 */ gboolean ags_sequencer_is_playing(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), FALSE); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->is_playing, FALSE); return(sequencer_interface->is_playing(sequencer)); } /** * ags_sequencer_is_recording: * @sequencer: the #AgsSequencer * * Get recording. * * Returns: %TRUE if recording, else %FALSE * * Since: 3.0.0 */ gboolean ags_sequencer_is_recording(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), FALSE); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->is_recording, FALSE); return(sequencer_interface->is_recording(sequencer)); } /** * ags_sequencer_play_init: * @sequencer: the #AgsSequencer * @error: an error that may occure * * Initializes the sequencer for playback. * * Since: 3.0.0 */ void ags_sequencer_play_init(AgsSequencer *sequencer, GError **error) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->play_init); sequencer_interface->play_init(sequencer, error); } /** * ags_sequencer_play: * @sequencer: the #AgsSequencer * @error: an error that may occure * * Plays the current buffer of sequencer. * * Since: 3.0.0 */ void ags_sequencer_play(AgsSequencer *sequencer, GError **error) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->play); sequencer_interface->play(sequencer, error); } /** * ags_sequencer_record_init: * @sequencer: the #AgsSequencer * @error: an error that may occure * * Initializes the sequencer for recordback. * * Since: 3.0.0 */ void ags_sequencer_record_init(AgsSequencer *sequencer, GError **error) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->record_init); sequencer_interface->record_init(sequencer, error); } /** * ags_sequencer_record: * @sequencer: the #AgsSequencer * @error: an error that may occure * * Records the current buffer of sequencer. * * Since: 3.0.0 */ void ags_sequencer_record(AgsSequencer *sequencer, GError **error) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->record); sequencer_interface->record(sequencer, error); } /** * ags_sequencer_stop: * @sequencer: the #AgsSequencer * * Stops the sequencer from playing to it. * * Since: 3.0.0 */ void ags_sequencer_stop(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->stop); sequencer_interface->stop(sequencer); } /** * ags_sequencer_tic: * @sequencer: the #AgsSequencer * * Every call to play may generate a tic. * * Since: 3.0.0 */ void ags_sequencer_tic(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->tic); sequencer_interface->tic(sequencer); } /** * ags_sequencer_offset_changed: * @sequencer: the #AgsSequencer * @note_offset: the note offset * * Callback when counter expires minor note offset. * * Since: 3.0.0 */ void ags_sequencer_offset_changed(AgsSequencer *sequencer, guint note_offset) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->offset_changed); sequencer_interface->offset_changed(sequencer, note_offset); } /** * ags_sequencer_get_buffer: * @sequencer: the #AgsSequencer * @buffer_length: the buffer's length * * Get current playback buffer. * * Returns: current playback buffer * * Since: 3.0.0 */ void* ags_sequencer_get_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), NULL); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_buffer, NULL); return(sequencer_interface->get_buffer(sequencer, buffer_length)); } /** * ags_sequencer_get_next_buffer: * @sequencer: the #AgsSequencer * @buffer_length: the buffer's length * * Get future playback buffer. * * Returns: next playback buffer * * Since: 3.0.0 */ void* ags_sequencer_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), NULL); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_next_buffer, NULL); return(sequencer_interface->get_next_buffer(sequencer, buffer_length)); } /** * ags_sequencer_lock_buffer: * @sequencer: the #AgsSequencer * @buffer: the buffer to lock * * Lock @buffer. * * Since: 3.0.0 */ void ags_sequencer_lock_buffer(AgsSequencer *sequencer, void *buffer) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->lock_buffer); sequencer_interface->lock_buffer(sequencer, buffer); } /** * ags_sequencer_unlock_buffer: * @sequencer: the #AgsSequencer * @buffer: the buffer to unlock * * Unlock @buffer. * * Since: 3.0.0 */ void ags_sequencer_unlock_buffer(AgsSequencer *sequencer, void *buffer) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->unlock_buffer); sequencer_interface->unlock_buffer(sequencer, buffer); } /** * ags_sequencer_set_bpm: * @sequencer: the #AgsSequencer * @bpm: the bpm to set * * Set current playback bpm. * * Since: 3.0.0 */ void ags_sequencer_set_bpm(AgsSequencer *sequencer, gdouble bpm) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->set_bpm); sequencer_interface->set_bpm(sequencer, bpm); } /** * ags_sequencer_get_bpm: * @sequencer: the #AgsSequencer * * Get current playback bpm. * * Returns: bpm * * Since: 3.0.0 */ gdouble ags_sequencer_get_bpm(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), G_MAXUINT); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_bpm, G_MAXUINT); return(sequencer_interface->get_bpm(sequencer)); } /** * ags_sequencer_set_delay_factor: * @sequencer: the #AgsSequencer * @delay_factor: the delay factor to set * * Set current playback delay factor. * * Since: 3.0.0 */ void ags_sequencer_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->set_delay_factor); sequencer_interface->set_delay_factor(sequencer, delay_factor); } /** * ags_sequencer_get_delay_factor: * @sequencer: the #AgsSequencer * * Get current playback delay factor. * * Returns: delay factor * * Since: 3.0.0 */ gdouble ags_sequencer_get_delay_factor(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), G_MAXUINT); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_delay_factor, G_MAXUINT); return(sequencer_interface->get_delay_factor(sequencer)); } /** * ags_sequencer_get_start_note_offset: * @sequencer: the #AgsSequencer * * Get start playback note offset. * * Returns: the start note offset * * Since: 3.0.0 */ guint ags_sequencer_get_start_note_offset(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), G_MAXUINT); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_start_note_offset, G_MAXUINT); return(sequencer_interface->get_start_note_offset(sequencer)); } /** * ags_sequencer_set_start_note_offset: * @sequencer: the #AgsSequencer * @start_note_offset: the start note offset to set * * Set start playback note offset. * * Since: 3.0.0 */ void ags_sequencer_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->set_start_note_offset); sequencer_interface->set_start_note_offset(sequencer, start_note_offset); } /** * ags_sequencer_get_note_offset: * @sequencer: the #AgsSequencer * * Get current playback note offset. * * Returns: offset * * Since: 3.0.0 */ guint ags_sequencer_get_note_offset(AgsSequencer *sequencer) { AgsSequencerInterface *sequencer_interface; g_return_val_if_fail(AGS_IS_SEQUENCER(sequencer), G_MAXUINT); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_val_if_fail(sequencer_interface->get_note_offset, G_MAXUINT); return(sequencer_interface->get_note_offset(sequencer)); } /** * ags_sequencer_set_note_offset: * @sequencer: the #AgsSequencer * @note_offset: the note offset to set * * Set current playback note offset. * * Since: 3.0.0 */ void ags_sequencer_set_note_offset(AgsSequencer *sequencer, guint note_offset) { AgsSequencerInterface *sequencer_interface; g_return_if_fail(AGS_IS_SEQUENCER(sequencer)); sequencer_interface = AGS_SEQUENCER_GET_INTERFACE(sequencer); g_return_if_fail(sequencer_interface->set_note_offset); sequencer_interface->set_note_offset(sequencer, note_offset); } gsequencer-3.1.3/ags/object/ags_plugin.c0000644000175000017500000001711413607210263015120 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_plugin_base_init(AgsPluginInterface *ginterface); /** * SECTION:ags_plugin * @short_description: interfacing plugins * @title: AgsPlugin * @section_id: AgsPlugin * @include: ags/object/ags_plugin.h * * The #AgsPlugin interface gives you a unique access to classes. It * can be used by #AgsFile and solves some of the serialization. */ GType ags_plugin_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_plugin = 0; static const GTypeInfo ags_plugin_info = { sizeof(AgsPluginInterface), (GBaseInitFunc) ags_plugin_base_init, NULL, /* base_finalize */ }; ags_type_plugin = g_type_register_static(G_TYPE_INTERFACE, "AgsPlugin", &ags_plugin_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin); } return g_define_type_id__volatile; } void ags_plugin_base_init(AgsPluginInterface *ginterface) { /* empty */ } /** * ags_plugin_get_name: * @plugin: an @AgsPlugin * * Retrieve the name of the plugin. * * Returns: the plugins name * * Since: 3.0.0 */ gchar* ags_plugin_get_name(AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; gchar *ret_val; g_return_val_if_fail(AGS_IS_PLUGIN(plugin), NULL); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_val_if_fail(plugin_interface->get_name, NULL); ret_val = plugin_interface->get_name(plugin); return(ret_val); } /** * ags_plugin_set_name: * @plugin: an @AgsPlugin * @name: the name of plugin * * Set the name of the plugin. * * Since: 3.0.0 */ void ags_plugin_set_name(AgsPlugin *plugin, gchar *name) { AgsPluginInterface *plugin_interface; g_return_if_fail(AGS_IS_PLUGIN(plugin)); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_if_fail(plugin_interface->set_name); plugin_interface->set_name(plugin, name); } /** * ags_plugin_get_version: * @plugin: an @AgsPlugin * * Retrieve the version of the plugin. * * Returns: the plugins version * * Since: 3.0.0 */ gchar* ags_plugin_get_version(AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; gchar *ret_val; g_return_val_if_fail(AGS_IS_PLUGIN(plugin), NULL); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_val_if_fail(plugin_interface->get_version, NULL); ret_val = plugin_interface->get_version(plugin); return(ret_val); } /** * ags_plugin_set_version: * @plugin: an @AgsPlugin * @version: the version of plugin * * Set the version of the plugin. * * Since: 3.0.0 */ void ags_plugin_set_version(AgsPlugin *plugin, gchar *version) { AgsPluginInterface *plugin_interface; g_return_if_fail(AGS_IS_PLUGIN(plugin)); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_if_fail(plugin_interface->set_version); plugin_interface->set_version(plugin, version); } /** * ags_plugin_get_build_id: * @plugin: an @AgsPlugin * * Retrieve the build id of the plugin. * * Returns: the plugins build id * * Since: 3.0.0 */ gchar* ags_plugin_get_build_id(AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; gchar *ret_val; g_return_val_if_fail(AGS_IS_PLUGIN(plugin), NULL); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_val_if_fail(plugin_interface->get_build_id, NULL); ret_val = plugin_interface->get_build_id(plugin); return(ret_val); } /** * ags_plugin_set_build_id: * @plugin: an @AgsPlugin * @build_id: the build id of plugin * * Set the build id of the plugin. * * Since: 3.0.0 */ void ags_plugin_set_build_id(AgsPlugin *plugin, gchar *build_id) { AgsPluginInterface *plugin_interface; g_return_if_fail(AGS_IS_PLUGIN(plugin)); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_if_fail(plugin_interface->set_build_id); plugin_interface->set_build_id(plugin, build_id); } /** * ags_plugin_get_xml_type: * @plugin: an @AgsPlugin * * Retrieve the xml type of the plugin. * * Returns: the plugins xml type * * Since: 3.0.0 */ gchar* ags_plugin_get_xml_type(AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; gchar *ret_val; g_return_val_if_fail(AGS_IS_PLUGIN(plugin), NULL); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_val_if_fail(plugin_interface->get_xml_type, NULL); ret_val = plugin_interface->get_xml_type(plugin); return(ret_val); } /** * ags_plugin_set_xml_type: * @plugin: an @AgsPlugin * @xml_type: the build id of plugin * * Set the build id of the plugin. * * Since: 3.0.0 */ void ags_plugin_set_xml_type(AgsPlugin *plugin, gchar *xml_type) { AgsPluginInterface *plugin_interface; g_return_if_fail(AGS_IS_PLUGIN(plugin)); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_if_fail(plugin_interface->set_xml_type); plugin_interface->set_xml_type(plugin, xml_type); } /** * ags_plugin_get_ports: * @plugin: an @AgsPlugin * * Retrieve the ports of the plugin. * * Returns: (element-type GObject) (transfer full): the plugins ports * * Since: 3.0.0 */ GList* ags_plugin_get_ports(AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; GList *ret_val; g_return_val_if_fail(AGS_IS_PLUGIN(plugin), NULL); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_val_if_fail(plugin_interface->get_ports, NULL); ret_val = plugin_interface->get_ports(plugin); return(ret_val); } /** * ags_plugin_set_ports: * @plugin: an @AgsPlugin * @ports: (element-type GObject) (transfer none): the build id of plugin * * Set the build id of the plugin. * * Since: 3.0.0 */ void ags_plugin_set_ports(AgsPlugin *plugin, GList *ports) { AgsPluginInterface *plugin_interface; g_return_if_fail(AGS_IS_PLUGIN(plugin)); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_if_fail(plugin_interface->set_ports); plugin_interface->set_ports(plugin, ports); } /** * ags_plugin_read: * @file: the #GObject * @node: the node * @plugin: the #AgsPlugin * * Read of file. * * Since: 3.0.0 */ void ags_plugin_read(GObject *file, xmlNode *node, AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; g_return_if_fail(AGS_IS_PLUGIN(plugin)); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_if_fail(plugin_interface->read); plugin_interface->read(file, node, plugin); } /** * ags_plugin_write: * @file: the #GObject * @parent: the parent node * @plugin: the #AgsPlugin * * Write to file. * * Returns: (transfer none): the new node you created * * Since: 3.0.0 */ xmlNode* ags_plugin_write(GObject *file, xmlNode *parent, AgsPlugin *plugin) { AgsPluginInterface *plugin_interface; xmlNode *retval; g_return_val_if_fail(AGS_IS_PLUGIN(plugin), NULL); plugin_interface = AGS_PLUGIN_GET_INTERFACE(plugin); g_return_val_if_fail(plugin_interface->write, NULL); retval = plugin_interface->write(file, parent, plugin); return(retval); } gsequencer-3.1.3/ags/object/ags_applicable.c0000644000175000017500000000626213607210263015720 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_applicable_base_init(AgsApplicableInterface *ginterface); /** * SECTION:ags_applicable * @short_description: unique access to applicable objects * @title: AgsApplicable * @section_id: AgsApplicable * @include: ags/object/ags_applicable.h * * The #AgsApplicable interface gives you a unique access to applicable objects. */ GType ags_applicable_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_applicable = 0; static const GTypeInfo ags_applicable_info = { sizeof(AgsApplicableInterface), (GBaseInitFunc) ags_applicable_base_init, NULL, /* base_finalize */ }; ags_type_applicable = g_type_register_static(G_TYPE_INTERFACE, "AgsApplicable", &ags_applicable_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_applicable); } return g_define_type_id__volatile; } void ags_applicable_base_init(AgsApplicableInterface *ginterface) { /* empty */ } /** * ags_applicable_set_update: * @applicable: an #AgsApplicable * @update: if %TRUE do ::reset after ::apply * * Update behaviour. * * Since: 3.0.0 */ void ags_applicable_set_update(AgsApplicable *applicable, gboolean update) { AgsApplicableInterface *applicable_interface; g_return_if_fail(AGS_IS_APPLICABLE(applicable)); applicable_interface = AGS_APPLICABLE_GET_INTERFACE(applicable); g_return_if_fail(applicable_interface->set_update); applicable_interface->set_update(applicable, update); } /** * ags_applicable_apply: * @applicable: an #AgsApplicable * * Apply all changes done so far. * * Since: 3.0.0 */ void ags_applicable_apply(AgsApplicable *applicable) { AgsApplicableInterface *applicable_interface; g_return_if_fail(AGS_IS_APPLICABLE(applicable)); applicable_interface = AGS_APPLICABLE_GET_INTERFACE(applicable); g_return_if_fail(applicable_interface->apply); applicable_interface->apply(applicable); } /** * ags_applicable_reset: * @applicable: an #AgsApplicable * * Reset all changes within the user interface. * * Since: 3.0.0 */ void ags_applicable_reset(AgsApplicable *applicable) { AgsApplicableInterface *applicable_interface; g_return_if_fail(AGS_IS_APPLICABLE(applicable)); applicable_interface = AGS_APPLICABLE_GET_INTERFACE(applicable); g_return_if_fail(applicable_interface->reset); applicable_interface->reset(applicable); } gsequencer-3.1.3/ags/object/ags_applicable.h0000644000175000017500000000414213607210263015720 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLICABLE_H__ #define __AGS_APPLICABLE_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLICABLE (ags_applicable_get_type()) #define AGS_APPLICABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLICABLE, AgsApplicable)) #define AGS_APPLICABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_APPLICABLE, AgsApplicableInterface)) #define AGS_IS_APPLICABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_APPLICABLE)) #define AGS_IS_APPLICABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_APPLICABLE)) #define AGS_APPLICABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_APPLICABLE, AgsApplicableInterface)) typedef struct _AgsApplicable AgsApplicable; typedef struct _AgsApplicableInterface AgsApplicableInterface; struct _AgsApplicableInterface { GTypeInterface ginterface; void (*set_update)(AgsApplicable *applicable, gboolean update); void (*apply)(AgsApplicable *applicable); void (*reset)(AgsApplicable *applicable); }; GType ags_applicable_get_type(); void ags_applicable_set_update(AgsApplicable *applicable, gboolean update); void ags_applicable_apply(AgsApplicable *applicable); void ags_applicable_reset(AgsApplicable *applicable); G_END_DECLS #endif /*__AGS_APPLICABLE_H__*/ gsequencer-3.1.3/ags/object/ags_marshal.h0000644000175000017500000014345313607210263015264 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ /* This file is generated by glib-genmarshal, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ #ifndef __AGS_CCLOSURE_MARSHAL_MARSHAL_H__ #define __AGS_CCLOSURE_MARSHAL_MARSHAL_H__ #include G_BEGIN_DECLS /* VOID:UINT64 (ags/object/ags_marshallers.list:1) */ extern void ags_cclosure_marshal_VOID__UINT64 (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:BOOLEAN,POINTER (ags/object/ags_marshallers.list:2) */ extern void ags_cclosure_marshal_VOID__BOOLEAN_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:INT,UINT (ags/object/ags_marshallers.list:3) */ extern void ags_cclosure_marshal_VOID__INT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:INT,POINTER (ags/object/ags_marshallers.list:4) */ extern void ags_cclosure_marshal_VOID__INT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:INT,UINT,POINTER (ags/object/ags_marshallers.list:5) */ extern void ags_cclosure_marshal_VOID__INT_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,BOOLEAN (ags/object/ags_marshallers.list:6) */ extern void ags_cclosure_marshal_VOID__UINT_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT (ags/object/ags_marshallers.list:7) */ extern void ags_cclosure_marshal_VOID__UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT,BOOLEAN (ags/object/ags_marshallers.list:8) */ extern void ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT,UINT (ags/object/ags_marshallers.list:9) */ extern void ags_cclosure_marshal_VOID__UINT_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:10) */ extern void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:11) */ extern void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT,UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:12) */ extern void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,UINT,UINT,UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:13) */ extern void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,DOUBLE,UINT (ags/object/ags_marshallers.list:14) */ extern void ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,INT (ags/object/ags_marshallers.list:15) */ extern void ags_cclosure_marshal_VOID__UINT_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,DOUBLE (ags/object/ags_marshallers.list:16) */ extern void ags_cclosure_marshal_VOID__UINT_DOUBLE (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,STRING,UINT (ags/object/ags_marshallers.list:17) */ extern void ags_cclosure_marshal_VOID__UINT_STRING_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:UINT,POINTER,UINT (ags/object/ags_marshallers.list:18) */ extern void ags_cclosure_marshal_VOID__UINT_POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:INT64,UINT (ags/object/ags_marshallers.list:19) */ extern void ags_cclosure_marshal_VOID__INT64_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:ULONG,UINT (ags/object/ags_marshallers.list:20) */ extern void ags_cclosure_marshal_VOID__ULONG_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:ULONG,UINT,BOOLEAN (ags/object/ags_marshallers.list:21) */ extern void ags_cclosure_marshal_VOID__ULONG_UINT_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:DOUBLE,DOUBLE (ags/object/ags_marshallers.list:22) */ extern void ags_cclosure_marshal_VOID__DOUBLE_DOUBLE (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:ULONG,UINT,UINT (ags/object/ags_marshallers.list:23) */ extern void ags_cclosure_marshal_VOID__ULONG_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:STRING,UINT (ags/object/ags_marshallers.list:24) */ extern void ags_cclosure_marshal_VOID__STRING_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:STRING,UINT,DOUBLE (ags/object/ags_marshallers.list:25) */ extern void ags_cclosure_marshal_VOID__STRING_UINT_DOUBLE (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:STRING,UINT,POINTER (ags/object/ags_marshallers.list:26) */ extern void ags_cclosure_marshal_VOID__STRING_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:STRING,UINT,STRING,DOUBLE (ags/object/ags_marshallers.list:27) */ extern void ags_cclosure_marshal_VOID__STRING_UINT_STRING_DOUBLE (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:STRING,POINTER (ags/object/ags_marshallers.list:28) */ extern void ags_cclosure_marshal_VOID__STRING_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:STRING,STRING,STRING (ags/object/ags_marshallers.list:29) */ extern void ags_cclosure_marshal_VOID__STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,INT (ags/object/ags_marshallers.list:30) */ extern void ags_cclosure_marshal_VOID__POINTER_INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,INT,POINTER (ags/object/ags_marshallers.list:31) */ extern void ags_cclosure_marshal_VOID__POINTER_INT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,INT,INT,BOOLEAN (ags/object/ags_marshallers.list:32) */ extern void ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,UINT (ags/object/ags_marshallers.list:33) */ extern void ags_cclosure_marshal_VOID__POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,POINTER (ags/object/ags_marshallers.list:34) */ extern void ags_cclosure_marshal_VOID__POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,UINT,UINT (ags/object/ags_marshallers.list:35) */ extern void ags_cclosure_marshal_VOID__POINTER_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,UINT,POINTER (ags/object/ags_marshallers.list:36) */ extern void ags_cclosure_marshal_VOID__POINTER_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,POINTER,UINT (ags/object/ags_marshallers.list:37) */ extern void ags_cclosure_marshal_VOID__POINTER_POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:POINTER,POINTER,POINTER (ags/object/ags_marshallers.list:38) */ extern void ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,UINT (ags/object/ags_marshallers.list:39) */ extern void ags_cclosure_marshal_VOID__OBJECT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,UINT,UINT,UINT (ags/object/ags_marshallers.list:40) */ extern void ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,OBJECT (ags/object/ags_marshallers.list:41) */ extern void ags_cclosure_marshal_VOID__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,OBJECT,OBJECT,INT,BOOLEAN (ags/object/ags_marshallers.list:42) */ extern void ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,UINT,INT,BOOLEAN (ags/object/ags_marshallers.list:43) */ extern void ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT (ags/object/ags_marshallers.list:44) */ extern void ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* ULONG:VOID (ags/object/ags_marshallers.list:45) */ extern void ags_cclosure_marshal_ULONG__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* INT:VOID (ags/object/ags_marshallers.list:46) */ extern void ags_cclosure_marshal_INT__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* INT64:OBJECT (ags/object/ags_marshallers.list:47) */ extern void ags_cclosure_marshal_INT64__OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* UINT:VOID (ags/object/ags_marshallers.list:48) */ extern void ags_cclosure_marshal_UINT__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:VOID (ags/object/ags_marshallers.list:49) */ extern void ags_cclosure_marshal_BOOLEAN__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:UINT,POINTER (ags/object/ags_marshallers.list:50) */ extern void ags_cclosure_marshal_BOOLEAN__UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:POINTER,UINT (ags/object/ags_marshallers.list:51) */ extern void ags_cclosure_marshal_BOOLEAN__POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:OBJECT,OBJECT (ags/object/ags_marshallers.list:52) */ extern void ags_cclosure_marshal_BOOLEAN__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* UINT:INT,UINT,POINTER (ags/object/ags_marshallers.list:53) */ extern void ags_cclosure_marshal_UINT__INT_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* DOUBLE:DOUBLE,BOOLEAN (ags/object/ags_marshallers.list:54) */ extern void ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* STRING:STRING,STRING (ags/object/ags_marshallers.list:55) */ extern void ags_cclosure_marshal_STRING__STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* STRING:ULONG,STRING,STRING,STRING,STRING,UINT,POINTER (ags/object/ags_marshallers.list:56) */ extern void ags_cclosure_marshal_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:VOID (ags/object/ags_marshallers.list:57) */ extern void ags_cclosure_marshal_POINTER__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:INT (ags/object/ags_marshallers.list:58) */ extern void ags_cclosure_marshal_POINTER__INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:UINT (ags/object/ags_marshallers.list:59) */ extern void ags_cclosure_marshal_POINTER__UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:POINTER (ags/object/ags_marshallers.list:60) */ extern void ags_cclosure_marshal_POINTER__POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:INT,UINT (ags/object/ags_marshallers.list:61) */ extern void ags_cclosure_marshal_POINTER__INT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:UINT,UINT (ags/object/ags_marshallers.list:62) */ extern void ags_cclosure_marshal_POINTER__UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:UINT,POINTER (ags/object/ags_marshallers.list:63) */ extern void ags_cclosure_marshal_POINTER__UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:POINTER,POINTER,POINTER (ags/object/ags_marshallers.list:64) */ extern void ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:POINTER,UINT (ags/object/ags_marshallers.list:65) */ extern void ags_cclosure_marshal_POINTER__POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:STRING,STRING (ags/object/ags_marshallers.list:66) */ extern void ags_cclosure_marshal_POINTER__STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:STRING,STRING,STRING (ags/object/ags_marshallers.list:67) */ extern void ags_cclosure_marshal_POINTER__STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:STRING,STRING,STRING,STRING (ags/object/ags_marshallers.list:68) */ extern void ags_cclosure_marshal_POINTER__STRING_STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:ULONG,POINTER,UINT (ags/object/ags_marshallers.list:69) */ extern void ags_cclosure_marshal_POINTER__ULONG_POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:ULONG,UINT,POINTER,POINTER (ags/object/ags_marshallers.list:70) */ extern void ags_cclosure_marshal_POINTER__ULONG_UINT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT (ags/object/ags_marshallers.list:71) */ extern void ags_cclosure_marshal_POINTER__OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,POINTER,UINT (ags/object/ags_marshallers.list:72) */ extern void ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,POINTER,INT64 (ags/object/ags_marshallers.list:73) */ extern void ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64 (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,OBJECT (ags/object/ags_marshallers.list:74) */ extern void ags_cclosure_marshal_POINTER__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,STRING,STRING,STRING,POINTER (ags/object/ags_marshallers.list:75) */ extern void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,STRING,STRING,STRING,STRING,POINTER (ags/object/ags_marshallers.list:76) */ extern void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,STRING,STRING,STRING,UINT,POINTER,POINTER (ags/object/ags_marshallers.list:77) */ extern void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,STRING,STRING,STRING,STRING,UINT,POINTER,POINTER (ags/object/ags_marshallers.list:78) */ extern void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,POINTER,OBJECT,OBJECT,STRING,STRING,STRING (ags/object/ags_marshallers.list:79) */ extern void ags_cclosure_marshal_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:OBJECT,POINTER,POINTER,OBJECT,STRING,STRING,STRING (ags/object/ags_marshallers.list:80) */ extern void ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* POINTER:POINTER,STRING,STRING (ags/object/ags_marshallers.list:81) */ extern void ags_cclosure_marshal_POINTER__POINTER_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:VOID (ags/object/ags_marshallers.list:82) */ extern void ags_cclosure_marshal_OBJECT__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:UINT,POINTER (ags/object/ags_marshallers.list:83) */ extern void ags_cclosure_marshal_OBJECT__UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:STRING,STRING,STRING (ags/object/ags_marshallers.list:84) */ extern void ags_cclosure_marshal_OBJECT__STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:OBJECT (ags/object/ags_marshallers.list:85) */ extern void ags_cclosure_marshal_OBJECT__OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:OBJECT,POINTER,POINTER (ags/object/ags_marshallers.list:86) */ extern void ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:OBJECT,POINTER,POINTER,POINTER (ags/object/ags_marshallers.list:87) */ extern void ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* OBJECT:OBJECT,OBJECT (ags/object/ags_marshallers.list:88) */ extern void ags_cclosure_marshal_OBJECT__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); G_END_DECLS #endif /* __AGS_CCLOSURE_MARSHAL_MARSHAL_H__ */ gsequencer-3.1.3/ags/object/ags_sequencer.h0000644000175000017500000001372513607210263015625 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SEQUENCER_H__ #define __AGS_SEQUENCER_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_SEQUENCER (ags_sequencer_get_type()) #define AGS_SEQUENCER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SEQUENCER, AgsSequencer)) #define AGS_SEQUENCER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SEQUENCER, AgsSequencerInterface)) #define AGS_IS_SEQUENCER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SEQUENCER)) #define AGS_IS_SEQUENCER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SEQUENCER)) #define AGS_SEQUENCER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SEQUENCER, AgsSequencerInterface)) typedef struct _AgsSequencer AgsSequencer; typedef struct _AgsSequencerInterface AgsSequencerInterface; #define AGS_SEQUENCER_DEFAULT_SAMPLERATE (44100.0) #define AGS_SEQUENCER_DEFAULT_BUFFER_SIZE (944) #define AGS_SEQUENCER_DEFAULT_DEVICE "hw:0" #define AGS_SEQUENCER_DEFAULT_BPM (120.0) #define AGS_SEQUENCER_DEFAULT_DELAY_FACTOR (1.0 / 4.0) #define AGS_SEQUENCER_DEFAULT_JIFFIE ((double) AGS_SEQUENCER_DEFAULT_SAMPLERATE / (double) AGS_SEQUENCER_DEFAULT_BUFFER_SIZE) #define AGS_SEQUENCER_DEFAULT_TACT (1.0 / 1.0) #define AGS_SEQUENCER_DEFAULT_TACT_JIFFIE (60.0 / AGS_SEQUENCER_DEFAULT_BPM * AGS_SEQUENCER_DEFAULT_TACT) #define AGS_SEQUENCER_DEFAULT_TACTRATE (1.0 / AGS_SEQUENCER_DEFAULT_TACT_JIFFIE) #define AGS_SEQUENCER_DEFAULT_SCALE (1.0) #define AGS_SEQUENCER_DEFAULT_DELAY (AGS_SEQUENCER_DEFAULT_JIFFIE * (60.0 / AGS_SEQUENCER_DEFAULT_BPM)) #define AGS_SEQUENCER_DEFAULT_PERIOD (64.0) #define AGS_SEQUENCER_DEFAULT_LATENCY (400) struct _AgsSequencerInterface { GTypeInterface ginterface; void (*set_device)(AgsSequencer *sequencer, gchar *card_id); gchar* (*get_device)(AgsSequencer *sequencer); void (*list_cards)(AgsSequencer *sequencer, GList **card_id, GList **card_name); gboolean (*is_starting)(AgsSequencer *sequencer); gboolean (*is_playing)(AgsSequencer *sequencer); gboolean (*is_recording)(AgsSequencer *sequencer); void (*play_init)(AgsSequencer *sequencer, GError **error); void (*play)(AgsSequencer *sequencer, GError **error); void (*record_init)(AgsSequencer *sequencer, GError **error); void (*record)(AgsSequencer *sequencer, GError **error); void (*stop)(AgsSequencer *sequencer); void (*tic)(AgsSequencer *sequencer); void (*offset_changed)(AgsSequencer *sequencer, guint note_offset); void* (*get_buffer)(AgsSequencer *sequencer, guint *buffer_length); void* (*get_next_buffer)(AgsSequencer *sequencer, guint *buffer_length); void (*lock_buffer)(AgsSequencer *sequencer, void *buffer); void (*unlock_buffer)(AgsSequencer *sequencer, void *buffer); void (*set_bpm)(AgsSequencer *sequencer, gdouble bpm); gdouble (*get_bpm)(AgsSequencer *sequencer); void (*set_delay_factor)(AgsSequencer *sequencer, gdouble delay_factor); gdouble (*get_delay_factor)(AgsSequencer *sequencer); void (*set_start_note_offset)(AgsSequencer *sequencer, guint start_note_offset); guint (*get_start_note_offset)(AgsSequencer *sequencer); void (*set_note_offset)(AgsSequencer *sequencer, guint note_offset); guint (*get_note_offset)(AgsSequencer *sequencer); }; GType ags_sequencer_get_type(); void ags_sequencer_set_device(AgsSequencer *sequencer, gchar *card_id); gchar* ags_sequencer_get_device(AgsSequencer *sequencer); void ags_sequencer_list_cards(AgsSequencer *sequencer, GList **card_id, GList **card_name); gboolean ags_sequencer_is_starting(AgsSequencer *sequencer); gboolean ags_sequencer_is_playing(AgsSequencer *sequencer); gboolean ags_sequencer_is_recording(AgsSequencer *sequencer); void ags_sequencer_play_init(AgsSequencer *sequencer, GError **error); void ags_sequencer_play(AgsSequencer *sequencer, GError **error); void ags_sequencer_record_init(AgsSequencer *sequencer, GError **error); void ags_sequencer_record(AgsSequencer *sequencer, GError **error); void ags_sequencer_stop(AgsSequencer *sequencer); void ags_sequencer_tic(AgsSequencer *sequencer); void ags_sequencer_offset_changed(AgsSequencer *sequencer, guint note_offset); void* ags_sequencer_get_buffer(AgsSequencer *sequencer, guint *buffer_length); void* ags_sequencer_get_next_buffer(AgsSequencer *sequencer, guint *buffer_length); void ags_sequencer_lock_buffer(AgsSequencer *sequencer, void *buffer); void ags_sequencer_unlock_buffer(AgsSequencer *sequencer, void *buffer); void ags_sequencer_set_bpm(AgsSequencer *sequencer, gdouble bpm); gdouble ags_sequencer_get_bpm(AgsSequencer *sequencer); void ags_sequencer_set_delay_factor(AgsSequencer *sequencer, gdouble delay_factor); gdouble ags_sequencer_get_delay_factor(AgsSequencer *sequencer); void ags_sequencer_set_start_note_offset(AgsSequencer *sequencer, guint start_note_offset); guint ags_sequencer_get_start_note_offset(AgsSequencer *sequencer); void ags_sequencer_set_note_offset(AgsSequencer *sequencer, guint note_offset); guint ags_sequencer_get_note_offset(AgsSequencer *sequencer); G_END_DECLS #endif /*__AGS_SEQUENCER_H__*/ gsequencer-3.1.3/ags/object/ags_portlet.c0000644000175000017500000001045313607210263015312 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_portlet_base_init(AgsPortletInterface *ginterface); /** * SECTION:ags_portlet * @short_description: interfacing portlets * @title: AgsPortlet * @section_id: AgsPortlet * @include: ags/object/ags_portlet.h * * The #AgsPortlet interface is intended to use with ports containing #GObject. * Whereas its should implement this interface. */ GType ags_portlet_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_portlet = 0; static const GTypeInfo ags_portlet_info = { sizeof(AgsPortletInterface), (GBaseInitFunc) ags_portlet_base_init, NULL, /* base_finalize */ }; ags_type_portlet = g_type_register_static(G_TYPE_INTERFACE, "AgsPortlet", &ags_portlet_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_portlet); } return g_define_type_id__volatile; } void ags_portlet_base_init(AgsPortletInterface *ginterface) { /* empty */ } /** * ags_portlet_set_port: * @portlet: the #AgsPortlet * @port: the #GObject * * Set port. * * Since: 3.0.0 */ void ags_portlet_set_port(AgsPortlet *portlet, GObject *port) { AgsPortletInterface *portlet_interface; g_return_if_fail(AGS_IS_PORTLET(portlet)); portlet_interface = AGS_PORTLET_GET_INTERFACE(portlet); g_return_if_fail(portlet_interface->set_port); portlet_interface->set_port(portlet, port); } /** * ags_portlet_get_port: * @portlet: the #AgsPortlet * * Get port. * * Returns: (transfer full): the #GObject * * Since: 3.0.0 */ GObject* ags_portlet_get_port(AgsPortlet *portlet) { AgsPortletInterface *portlet_interface; g_return_val_if_fail(AGS_IS_PORTLET(portlet), NULL); portlet_interface = AGS_PORTLET_GET_INTERFACE(portlet); g_return_val_if_fail(portlet_interface->get_port, NULL); return(portlet_interface->get_port(portlet)); } /** * ags_portlet_list_safe_properties: * @portlet: the #AgsPortlet * * Retrieve thread-safe properties. * * Returns: (element-type utf8) (transfer full): a #GList containing properties * * Since: 3.0.0 */ GList* ags_portlet_list_safe_properties(AgsPortlet *portlet) { AgsPortletInterface *portlet_interface; g_return_val_if_fail(AGS_IS_PORTLET(portlet), NULL); portlet_interface = AGS_PORTLET_GET_INTERFACE(portlet); g_return_val_if_fail(portlet_interface->list_safe_properties, NULL); return(portlet_interface->list_safe_properties(portlet)); } /** * ags_portlet_safe_get_property: * @portlet: the #AgsPortlet * @property_name: propertie's name * @value: the #GValue * * Get property thread safe. * * Since: 3.0.0 */ void ags_portlet_safe_get_property(AgsPortlet *portlet, gchar *property_name, GValue *value) { AgsPortletInterface *portlet_interface; g_return_if_fail(AGS_IS_PORTLET(portlet)); portlet_interface = AGS_PORTLET_GET_INTERFACE(portlet); g_return_if_fail(portlet_interface->safe_get_property); portlet_interface->safe_get_property(portlet, property_name, value); } /** * ags_portlet_safe_set_property: * @portlet: the #AgsPortlet * @property_name: propertie's name * @value: the #GValue * * Set property thread safe. * * Since: 3.0.0 */ void ags_portlet_safe_set_property(AgsPortlet *portlet, gchar *property_name, GValue *value) { AgsPortletInterface *portlet_interface; g_return_if_fail(AGS_IS_PORTLET(portlet)); portlet_interface = AGS_PORTLET_GET_INTERFACE(portlet); g_return_if_fail(portlet_interface->safe_set_property); portlet_interface->safe_set_property(portlet, property_name, value); } gsequencer-3.1.3/ags/object/ags_tactable.h0000644000175000017500000000663613607210263015415 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_TACTABLE_H__ #define __AGS_TACTABLE_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_TACTABLE (ags_tactable_get_type()) #define AGS_TACTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_TACTABLE, AgsTactable)) #define AGS_TACTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_TACTABLE, AgsTactableInterface)) #define AGS_IS_TACTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_TACTABLE)) #define AGS_IS_TACTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_TACTABLE)) #define AGS_TACTABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_TACTABLE, AgsTactableInterface)) typedef struct _AgsTactable AgsTactable; typedef struct _AgsTactableInterface AgsTactableInterface; struct _AgsTactableInterface { GTypeInterface ginterface; guint64 (*get_sequencer_duration)(AgsTactable *tactable); guint64 (*get_notation_duration)(AgsTactable *tactable); guint64 (*get_wave_duration)(AgsTactable *tactable); guint64 (*get_midi_duration)(AgsTactable *tactable); gdouble (*get_bpm)(AgsTactable *tactable); gdouble (*get_tact)(AgsTactable *tactable); void (*change_sequencer_duration)(AgsTactable *tactable, guint64 sequencer_duration); void (*change_notation_duration)(AgsTactable *tactable, guint64 notation_duration); void (*change_wave_duration)(AgsTactable *tactable, guint64 wave_duration); void (*change_midi_duration)(AgsTactable *tactable, guint64 midi_duration); void (*change_bpm)(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm); void (*change_tact)(AgsTactable *tactable, gdouble new_tact, gdouble old_tact); }; GType ags_tactable_get_type(); guint64 ags_tactable_get_sequencer_duration(AgsTactable *tactable); guint64 ags_tactable_get_notation_duration(AgsTactable *tactable); guint64 ags_tactable_get_wave_duration(AgsTactable *tactable); guint64 ags_tactable_get_midi_duration(AgsTactable *tactable); gdouble ags_tactable_get_bpm(AgsTactable *tactable); gdouble ags_tactable_get_tact(AgsTactable *tactable); void ags_tactable_change_sequencer_duration(AgsTactable *tactable, guint64 sequencer_duration); void ags_tactable_change_notation_duration(AgsTactable *tactable, guint64 notation_duration); void ags_tactable_change_wave_duration(AgsTactable *tactable, guint64 wave_duration); void ags_tactable_change_midi_duration(AgsTactable *tactable, guint64 midi_duration); void ags_tactable_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm); void ags_tactable_change_tact(AgsTactable *tactable, gdouble new_tact, gdouble old_tact); G_END_DECLS #endif /*__AGS_TACTABLE_H__*/ gsequencer-3.1.3/ags/object/ags_main_loop.h0000644000175000017500000000572513607210263015611 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MAIN_LOOP_H__ #define __AGS_MAIN_LOOP_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_MAIN_LOOP (ags_main_loop_get_type()) #define AGS_MAIN_LOOP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MAIN_LOOP, AgsMainLoop)) #define AGS_MAIN_LOOP_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_MAIN_LOOP, AgsMainLoopInterface)) #define AGS_IS_MAIN_LOOP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MAIN_LOOP)) #define AGS_IS_MAIN_LOOP_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_MAIN_LOOP)) #define AGS_MAIN_LOOP_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_MAIN_LOOP, AgsMainLoopInterface)) typedef struct _AgsMainLoop AgsMainLoop; typedef struct _AgsMainLoopInterface AgsMainLoopInterface; struct _AgsMainLoopInterface { GTypeInterface ginterface; GRecMutex* (*get_tree_lock)(AgsMainLoop *main_loop); void (*set_syncing)(AgsMainLoop *main_loop, gboolean is_syncing); gboolean (*is_syncing)(AgsMainLoop *main_loop); void (*set_critical_region)(AgsMainLoop *main_loop, gboolean is_critical_region); gboolean (*is_critical_region)(AgsMainLoop *main_loop); void (*inc_queued_critical_region)(AgsMainLoop *main_loop); void (*dec_queued_critical_region)(AgsMainLoop *main_loop); guint (*test_queued_critical_region)(AgsMainLoop *main_loop); void (*change_frequency)(AgsMainLoop *main_loop, gdouble frequency); }; GType ags_main_loop_get_type(); GRecMutex* ags_main_loop_get_tree_lock(AgsMainLoop *main_loop); void ags_main_loop_set_syncing(AgsMainLoop *main_loop, gboolean is_syncing); gboolean ags_main_loop_is_syncing(AgsMainLoop *main_loop); void ags_main_loop_set_critical_region(AgsMainLoop *main_loop, gboolean is_critical_region); gboolean ags_main_loop_is_critical_region(AgsMainLoop *main_loop); void ags_main_loop_inc_queued_critical_region(AgsMainLoop *main_loop); void ags_main_loop_dec_queued_critical_region(AgsMainLoop *main_loop); guint ags_main_loop_test_queued_critical_region(AgsMainLoop *main_loop); void ags_main_loop_change_frequency(AgsMainLoop *main_loop, gdouble frequency); G_END_DECLS #endif /*__AGS_MAIN_LOOP_H__*/ gsequencer-3.1.3/ags/object/ags_seekable.h0000644000175000017500000000414613607210263015403 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SEEKABLE_H__ #define __AGS_SEEKABLE_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_SEEKABLE (ags_seekable_get_type()) #define AGS_SEEKABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SEEKABLE, AgsSeekable)) #define AGS_SEEKABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SEEKABLE, AgsSeekableInterface)) #define AGS_IS_SEEKABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SEEKABLE)) #define AGS_IS_SEEKABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SEEKABLE)) #define AGS_SEEKABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SEEKABLE, AgsSeekableInterface)) typedef struct _AgsSeekable AgsSeekable; typedef struct _AgsSeekableInterface AgsSeekableInterface; /** * AgsSeekType: * @AGS_SEEK_CUR: seek from current position * @AGS_SEEK_SET: seek by setting absolute position * @AGS_SEEK_END: seek from end * * Seek type. */ typedef enum{ AGS_SEEK_CUR, AGS_SEEK_SET, AGS_SEEK_END, }AgsSeekType; struct _AgsSeekableInterface { GTypeInterface ginterface; void (*seek)(AgsSeekable *seekable, gint64 offset, guint whence); }; GType ags_seekable_get_type(); void ags_seekable_seek(AgsSeekable *seekable, gint64 offset, guint whence); G_END_DECLS #endif /*__AGS_SEEKABLE_H__*/ gsequencer-3.1.3/ags/object/ags_cursor.h0000644000175000017500000000546013607210263015145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CURSOR_H__ #define __AGS_CURSOR_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_CURSOR (ags_cursor_get_type()) #define AGS_CURSOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CURSOR, AgsCursor)) #define AGS_CURSOR_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_CURSOR, AgsCursorInterface)) #define AGS_IS_CURSOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CURSOR)) #define AGS_IS_CURSOR_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_CURSOR)) #define AGS_CURSOR_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_CURSOR, AgsCursorInterface)) typedef struct _AgsCursor AgsCursor; typedef struct _AgsCursorInterface AgsCursorInterface; struct _AgsCursorInterface { GTypeInterface ginterface; gdouble (*get_default_offset)(AgsCursor *cursor); gdouble (*get_tact)(AgsCursor *cursor); gdouble (*get_bpm)(AgsCursor *cursor); guint (*get_rate)(AgsCursor *cursor); gdouble (*get_delay)(AgsCursor *cursor); guint64 (*get_duration)(AgsCursor *cursor); gdouble (*get_delay_counter)(AgsCursor *cursor); guint64 (*get_offset)(AgsCursor *cursor); GList* (*get_prev)(AgsCursor *cursor); GList* (*get_next)(AgsCursor *cursor); GList* (*get_current_copy)(AgsCursor *cursor); GList* (*get_current)(AgsCursor *cursor); }; GType ags_cursor_get_type(); gdouble ags_cursor_get_default_offset(AgsCursor *cursor); gdouble ags_cursor_get_tact(AgsCursor *cursor); gdouble ags_cursor_get_bpm(AgsCursor *cursor); guint ags_cursor_get_rate(AgsCursor *cursor); gdouble ags_cursor_get_delay(AgsCursor *cursor); guint64 ags_cursor_get_duration(AgsCursor *cursor); gdouble ags_cursor_get_delay_counter(AgsCursor *cursor); guint64 ags_cursor_get_offset(AgsCursor *cursor); GList* ags_cursor_get_prev(AgsCursor *cursor); GList* ags_cursor_get_next(AgsCursor *cursor); GList* ags_cursor_get_current_copy(AgsCursor *cursor); GList* ags_cursor_get_current(AgsCursor *cursor); G_END_DECLS #endif /*__AGS_CURSOR_H__*/ gsequencer-3.1.3/ags/object/ags_sound_server.h0000644000175000017500000000773013607210263016350 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUND_SERVER_H__ #define __AGS_SOUND_SERVER_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_SOUND_SERVER (ags_sound_server_get_type()) #define AGS_SOUND_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SOUND_SERVER, AgsSoundServer)) #define AGS_SOUND_SERVER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SOUND_SERVER, AgsSoundServerInterface)) #define AGS_IS_SOUND_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SOUND_SERVER)) #define AGS_IS_SOUND_SERVER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SOUND_SERVER)) #define AGS_SOUND_SERVER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SOUND_SERVER, AgsSoundServerInterface)) typedef struct _AgsSoundServer AgsSoundServer; typedef struct _AgsSoundServerInterface AgsSoundServerInterface; struct _AgsSoundServerInterface { GTypeInterface ginterface; void (*set_url)(AgsSoundServer *sound_server, gchar *url); gchar* (*get_url)(AgsSoundServer *sound_server); void (*set_ports)(AgsSoundServer *sound_server, guint *ports, guint port_count); guint* (*get_ports)(AgsSoundServer *sound_server, guint *port_count); void (*set_soundcard)(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard); GList* (*get_soundcard)(AgsSoundServer *sound_server, gchar *client_uuid); void (*set_sequencer)(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer); GList* (*get_sequencer)(AgsSoundServer *sound_server, gchar *client_uuid); GObject* (*register_soundcard)(AgsSoundServer *sound_server, gboolean is_output); void (*unregister_soundcard)(AgsSoundServer *sound_server, GObject *soundcard); GObject* (*register_sequencer)(AgsSoundServer *sound_server, gboolean is_output); void (*unregister_sequencer)(AgsSoundServer *sound_server, GObject *sequencer); }; GType ags_sound_server_get_type(); void ags_sound_server_set_url(AgsSoundServer *sound_server, gchar *url); gchar* ags_sound_server_get_url(AgsSoundServer *sound_server); void ags_sound_server_set_ports(AgsSoundServer *sound_server, guint *port, guint port_count); guint* ags_sound_server_get_ports(AgsSoundServer *sound_server, guint *port_count); void ags_sound_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard); GList* ags_sound_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid); void ags_sound_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer); GList* ags_sound_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid); GObject* ags_sound_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output); void ags_sound_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard); GObject* ags_sound_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output); void ags_sound_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer); G_END_DECLS #endif /*__AGS_SOUND_SERVER_H__*/ gsequencer-3.1.3/ags/object/ags_globals.c0000644000175000017500000000420513607210263015242 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include GHashTable *ags_globals = NULL; static GMutex ags_globals_mutex; /** * ags_globals_get_hash_table: * * Get globals hash table. * * Returns: (element-type utf8 GObject.Value) (transfer none): the #GHashTable containig globals * * Since: 3.0.0 */ GHashTable* ags_globals_get_hash_table() { g_mutex_lock(&ags_globals_mutex); if(ags_globals == NULL){ ags_globals = g_hash_table_new_full(g_direct_hash, g_string_equal, NULL, NULL); } g_mutex_unlock(&ags_globals_mutex); return(ags_globals); } /** * ags_globals_set: * @key: the key as string * @value: the #GValue-struct * * Set global key/value. * * Since: 3.0.0 */ void ags_globals_set(gchar *key, GValue *value) { GHashTable *globals; globals = ags_globals_get_hash_table(); g_mutex_lock(&ags_globals_mutex); g_hash_table_insert(globals, key, value); g_mutex_unlock(&ags_globals_mutex); } /** * ags_globals_get: * @key: the key as string * * Get global value for @key. * * Returns: the #GValue-struct if @key found, otherwise %NULL * * Since: 3.0.0 */ GValue* ags_globals_get(gchar *key) { GHashTable *globals; GValue *value; globals = ags_globals_get_hash_table(); g_mutex_lock(&ags_globals_mutex); value = g_hash_table_lookup(globals, key); g_mutex_unlock(&ags_globals_mutex); return(value); } gsequencer-3.1.3/ags/object/ags_sound_server.c0000644000175000017500000002276613607210263016351 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_sound_server_class_init(AgsSoundServerInterface *ginterface); /** * SECTION:ags_sound_server * @short_description: access sound servers * @title: AgsSoundServer * @section_id: * @include: ags/object/ags_sound_server.h * * The #AgsSoundServer interface gives you a unique access sound servers. */ GType ags_sound_server_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_sound_server = 0; ags_type_sound_server = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsSoundServer", sizeof(AgsSoundServerInterface), (GClassInitFunc) ags_sound_server_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_sound_server); } return g_define_type_id__volatile; } void ags_sound_server_class_init(AgsSoundServerInterface *ginterface) { /* empty */ } /** * ags_sound_server_set_url: * @sound_server: The #AgsSoundServer * @url: the url to set * * Sets the url of @sound_server. * * Since: 3.0.0 */ void ags_sound_server_set_url(AgsSoundServer *sound_server, gchar *url) { AgsSoundServerInterface *sound_server_interface; g_return_if_fail(AGS_IS_SOUND_SERVER(sound_server)); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_if_fail(sound_server_interface->set_url); sound_server_interface->set_url(sound_server, url); } /** * ags_sound_server_get_url: * @sound_server: the #AgsSoundServer * * Gets the URL of @sound_server. * * Returns: the URL as string * * Since: 3.0.0 */ gchar* ags_sound_server_get_url(AgsSoundServer *sound_server) { AgsSoundServerInterface *sound_server_interface; g_return_val_if_fail(AGS_IS_SOUND_SERVER(sound_server), NULL); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_val_if_fail(sound_server_interface->get_url, NULL); return(sound_server_interface->get_url(sound_server)); } /** * ags_sound_server_set_port: * @sound_server: The #AgsSoundServer * @port: the ports to set * @port_count: the number of ports * * Sets the ports of @sound_server. * * Since: 3.0.0 */ void ags_sound_server_set_ports(AgsSoundServer *sound_server, guint *port, guint port_count) { AgsSoundServerInterface *sound_server_interface; g_return_if_fail(AGS_IS_SOUND_SERVER(sound_server)); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_if_fail(sound_server_interface->set_ports); sound_server_interface->set_ports(sound_server, port, port_count); } /** * ags_sound_server_get_ports: * @sound_server: the #AgsSoundServer * @port_count: the number of ports returned * * Gets the ports of @sound_server. * * Returns: the port as string %NULL-terminated array * * Since: 3.0.0 */ guint* ags_sound_server_get_ports(AgsSoundServer *sound_server, guint *port_count) { AgsSoundServerInterface *sound_server_interface; g_return_val_if_fail(AGS_IS_SOUND_SERVER(sound_server), NULL); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_val_if_fail(sound_server_interface->get_ports, NULL); return(sound_server_interface->get_ports(sound_server, port_count)); } /** * ags_sound_server_set_soundcard: * @sound_server: The #AgsSoundServer * @client_uuid: the location to fetch from * @soundcard: (element-type GObject) (transfer full): the soundcard to set * * Sets the soundcard at @client_uuid. * * Since: 3.0.0 */ void ags_sound_server_set_soundcard(AgsSoundServer *sound_server, gchar *client_uuid, GList *soundcard) { AgsSoundServerInterface *sound_server_interface; g_return_if_fail(AGS_IS_SOUND_SERVER(sound_server)); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_if_fail(sound_server_interface->set_soundcard); sound_server_interface->set_soundcard(sound_server, client_uuid, soundcard); } /** * ags_sound_server_get_soundcard: * @client_uuid: the client uuid * @sound_server: the #AgsSoundServer * * Gets the soundcard of @sound_server associated with @client_uuid. * * Returns: (element-type GObject) (transfer full): the soundcard as #GList-struct * * Since: 3.0.0 */ GList* ags_sound_server_get_soundcard(AgsSoundServer *sound_server, gchar *client_uuid) { AgsSoundServerInterface *sound_server_interface; g_return_val_if_fail(AGS_IS_SOUND_SERVER(sound_server), NULL); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_val_if_fail(sound_server_interface->get_soundcard, NULL); return(sound_server_interface->get_soundcard(sound_server, client_uuid)); } /** * ags_sound_server_set_sequencer: * @sound_server: The #AgsSoundServer * @client_uuid: the location to fetch from * @sequencer: (element-type GObject) (transfer full): the sequencer to set * * Sets the sequencer at @client_uuid. * * Since: 3.0.0 */ void ags_sound_server_set_sequencer(AgsSoundServer *sound_server, gchar *client_uuid, GList *sequencer) { AgsSoundServerInterface *sound_server_interface; g_return_if_fail(AGS_IS_SOUND_SERVER(sound_server)); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_if_fail(sound_server_interface->set_sequencer); sound_server_interface->set_sequencer(sound_server, client_uuid, sequencer); } /** * ags_sound_server_get_sequencer: * @client_uuid: the client uuid * @sound_server: the #AgsSoundServer * * Gets the sequencer of @sound_server associated with @client_uuid. * * Returns: (element-type GObject) (transfer full): the sequencer as #GList-struct * * Since: 3.0.0 */ GList* ags_sound_server_get_sequencer(AgsSoundServer *sound_server, gchar *client_uuid) { AgsSoundServerInterface *sound_server_interface; g_return_val_if_fail(AGS_IS_SOUND_SERVER(sound_server), NULL); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_val_if_fail(sound_server_interface->get_sequencer, NULL); return(sound_server_interface->get_sequencer(sound_server, client_uuid)); } /** * ags_sound_server_register_soundcard: * @sound_server: The #AgsSoundServer * @is_output: if %TRUE the used as sink, else as source * * Fetches @soundcard of @sound_server. * * Returns: (transfer full): a new #AgsSoundcard * * Since: 3.0.0 */ GObject* ags_sound_server_register_soundcard(AgsSoundServer *sound_server, gboolean is_output) { AgsSoundServerInterface *sound_server_interface; g_return_val_if_fail(AGS_IS_SOUND_SERVER(sound_server), NULL); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_val_if_fail(sound_server_interface->register_soundcard, NULL); return(sound_server_interface->register_soundcard(sound_server, is_output)); } /** * ags_sound_server_unregister_soundcard: * @sound_server: The #AgsSoundServer * @soundcard: the #AgsSoundcard * * Releases @soundcard in @sound_server. * * Since: 3.0.0 */ void ags_sound_server_unregister_soundcard(AgsSoundServer *sound_server, GObject *soundcard) { AgsSoundServerInterface *sound_server_interface; g_return_if_fail(AGS_IS_SOUND_SERVER(sound_server)); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_if_fail(sound_server_interface->unregister_soundcard); sound_server_interface->unregister_soundcard(sound_server, soundcard); } /** * ags_sound_server_register_sequencer: * @sound_server: The #AgsSoundServer * @is_output: if %TRUE the used as sink, else as source * * Fetches @sequencer of @sound_server. * * Returns: (transfer full): a new #AgsSequencer * * Since: 3.0.0 */ GObject* ags_sound_server_register_sequencer(AgsSoundServer *sound_server, gboolean is_output) { AgsSoundServerInterface *sound_server_interface; g_return_val_if_fail(AGS_IS_SOUND_SERVER(sound_server), NULL); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_val_if_fail(sound_server_interface->register_sequencer, NULL); return(sound_server_interface->register_sequencer(sound_server, is_output)); } /** * ags_sound_server_unregister_sequencer: * @sound_server: The #AgsSoundServer * @sequencer: the #AgsSequencer * * Releases @sequencer in @sound_server. * * Since: 3.0.0 */ void ags_sound_server_unregister_sequencer(AgsSoundServer *sound_server, GObject *sequencer) { AgsSoundServerInterface *sound_server_interface; g_return_if_fail(AGS_IS_SOUND_SERVER(sound_server)); sound_server_interface = AGS_SOUND_SERVER_GET_INTERFACE(sound_server); g_return_if_fail(sound_server_interface->unregister_sequencer); sound_server_interface->unregister_sequencer(sound_server, sequencer); } gsequencer-3.1.3/ags/object/ags_marshallers.list.in0000644000175000017500000000565713607210263017306 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2018 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . VOID:UINT64 VOID:BOOLEAN,POINTER VOID:INT,UINT VOID:INT,POINTER VOID:INT,UINT,POINTER VOID:UINT,BOOLEAN VOID:UINT,UINT VOID:UINT,UINT,BOOLEAN VOID:UINT,UINT,UINT VOID:UINT,UINT,UINT,UINT VOID:UINT,UINT,UINT,UINT,UINT VOID:UINT,UINT,UINT,UINT,UINT,UINT VOID:UINT,UINT,UINT,UINT,UINT,UINT,UINT VOID:UINT,DOUBLE,UINT VOID:UINT,INT VOID:UINT,DOUBLE VOID:UINT,STRING,UINT VOID:UINT,POINTER,UINT VOID:INT64,UINT VOID:ULONG,UINT VOID:ULONG,UINT,BOOLEAN VOID:DOUBLE,DOUBLE VOID:ULONG,UINT,UINT VOID:STRING,UINT VOID:STRING,UINT,DOUBLE VOID:STRING,UINT,POINTER VOID:STRING,UINT,STRING,DOUBLE VOID:STRING,POINTER VOID:STRING,STRING,STRING VOID:POINTER,INT VOID:POINTER,INT,POINTER VOID:POINTER,INT,INT,BOOLEAN VOID:POINTER,UINT VOID:POINTER,POINTER VOID:POINTER,UINT,UINT VOID:POINTER,UINT,POINTER VOID:POINTER,POINTER,UINT VOID:POINTER,POINTER,POINTER VOID:OBJECT,UINT VOID:OBJECT,UINT,UINT,UINT VOID:OBJECT,OBJECT VOID:OBJECT,OBJECT,OBJECT,INT,BOOLEAN VOID:OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,UINT,INT,BOOLEAN VOID:OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT ULONG:VOID INT:VOID INT64:OBJECT UINT:VOID BOOLEAN:VOID BOOLEAN:UINT,POINTER BOOLEAN:POINTER,UINT BOOLEAN:OBJECT,OBJECT UINT:INT,UINT,POINTER DOUBLE:DOUBLE,BOOLEAN STRING:STRING,STRING STRING:ULONG,STRING,STRING,STRING,STRING,UINT,POINTER POINTER:VOID POINTER:INT POINTER:UINT POINTER:POINTER POINTER:INT,UINT POINTER:UINT,UINT POINTER:UINT,POINTER POINTER:POINTER,POINTER,POINTER POINTER:POINTER,UINT POINTER:STRING,STRING POINTER:STRING,STRING,STRING POINTER:STRING,STRING,STRING,STRING POINTER:ULONG,POINTER,UINT POINTER:ULONG,UINT,POINTER,POINTER POINTER:OBJECT POINTER:OBJECT,POINTER,UINT POINTER:OBJECT,POINTER,INT64 POINTER:OBJECT,OBJECT POINTER:OBJECT,STRING,STRING,STRING,POINTER POINTER:OBJECT,STRING,STRING,STRING,STRING,POINTER POINTER:OBJECT,STRING,STRING,STRING,UINT,POINTER,POINTER POINTER:OBJECT,STRING,STRING,STRING,STRING,UINT,POINTER,POINTER POINTER:OBJECT,POINTER,OBJECT,OBJECT,STRING,STRING,STRING POINTER:OBJECT,POINTER,POINTER,OBJECT,STRING,STRING,STRING POINTER:POINTER,STRING,STRING OBJECT:VOID OBJECT:UINT,POINTER OBJECT:STRING,STRING,STRING OBJECT:OBJECT OBJECT:OBJECT,POINTER,POINTER OBJECT:OBJECT,POINTER,POINTER,POINTER OBJECT:OBJECT,OBJECT gsequencer-3.1.3/ags/object/ags_marshal.c0000644000175000017500000046304513607210263015261 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ /* This file is generated by glib-genmarshal, do not modify it. This code is licensed under the same license as the containing project. Note that it links to GLib, so must comply with the LGPL linking clauses. */ #include #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_schar (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #define g_marshal_value_peek_variant(v) g_value_get_variant (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_long #define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* VOID:UINT64 (ags/object/ags_marshallers.list:1) */ void ags_cclosure_marshal_VOID__UINT64 (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT64) (gpointer data1, guint64 arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT64 callback; g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT64) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint64 (param_values + 1), data2); } /* VOID:BOOLEAN,POINTER (ags/object/ags_marshallers.list:2) */ void ags_cclosure_marshal_VOID__BOOLEAN_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__BOOLEAN_POINTER) (gpointer data1, gboolean arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__BOOLEAN_POINTER callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__BOOLEAN_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_boolean (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); } /* VOID:INT,UINT (ags/object/ags_marshallers.list:3) */ void ags_cclosure_marshal_VOID__INT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__INT_UINT) (gpointer data1, gint arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__INT_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__INT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:INT,POINTER (ags/object/ags_marshallers.list:4) */ void ags_cclosure_marshal_VOID__INT_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__INT_POINTER) (gpointer data1, gint arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__INT_POINTER callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__INT_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); } /* VOID:INT,UINT,POINTER (ags/object/ags_marshallers.list:5) */ void ags_cclosure_marshal_VOID__INT_UINT_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__INT_UINT_POINTER) (gpointer data1, gint arg1, guint arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__INT_UINT_POINTER callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__INT_UINT_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); } /* VOID:UINT,BOOLEAN (ags/object/ags_marshallers.list:6) */ void ags_cclosure_marshal_VOID__UINT_BOOLEAN (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_BOOLEAN) (gpointer data1, guint arg1, gboolean arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_BOOLEAN callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_boolean (param_values + 2), data2); } /* VOID:UINT,UINT (ags/object/ags_marshallers.list:7) */ void ags_cclosure_marshal_VOID__UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT) (gpointer data1, guint arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:UINT,UINT,BOOLEAN (ags/object/ags_marshallers.list:8) */ void ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_BOOLEAN) (gpointer data1, guint arg1, guint arg2, gboolean arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT_BOOLEAN callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_boolean (param_values + 3), data2); } /* VOID:UINT,UINT,UINT (ags/object/ags_marshallers.list:9) */ void ags_cclosure_marshal_VOID__UINT_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT) (gpointer data1, guint arg1, guint arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:10) */ void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT) (gpointer data1, guint arg1, guint arg2, guint arg3, guint arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT_UINT_UINT callback; g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), g_marshal_value_peek_uint (param_values + 4), data2); } /* VOID:UINT,UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:11) */ void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT) (gpointer data1, guint arg1, guint arg2, guint arg3, guint arg4, guint arg5, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT callback; g_return_if_fail (n_param_values == 6); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), g_marshal_value_peek_uint (param_values + 4), g_marshal_value_peek_uint (param_values + 5), data2); } /* VOID:UINT,UINT,UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:12) */ void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_UINT) (gpointer data1, guint arg1, guint arg2, guint arg3, guint arg4, guint arg5, guint arg6, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_UINT callback; g_return_if_fail (n_param_values == 7); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), g_marshal_value_peek_uint (param_values + 4), g_marshal_value_peek_uint (param_values + 5), g_marshal_value_peek_uint (param_values + 6), data2); } /* VOID:UINT,UINT,UINT,UINT,UINT,UINT,UINT (ags/object/ags_marshallers.list:13) */ void ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT) (gpointer data1, guint arg1, guint arg2, guint arg3, guint arg4, guint arg5, guint arg6, guint arg7, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT callback; g_return_if_fail (n_param_values == 8); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), g_marshal_value_peek_uint (param_values + 4), g_marshal_value_peek_uint (param_values + 5), g_marshal_value_peek_uint (param_values + 6), g_marshal_value_peek_uint (param_values + 7), data2); } /* VOID:UINT,DOUBLE,UINT (ags/object/ags_marshallers.list:14) */ void ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_DOUBLE_UINT) (gpointer data1, guint arg1, gdouble arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_DOUBLE_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_DOUBLE_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_double (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:UINT,INT (ags/object/ags_marshallers.list:15) */ void ags_cclosure_marshal_VOID__UINT_INT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_INT) (gpointer data1, guint arg1, gint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_INT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_INT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_int (param_values + 2), data2); } /* VOID:UINT,DOUBLE (ags/object/ags_marshallers.list:16) */ void ags_cclosure_marshal_VOID__UINT_DOUBLE (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_DOUBLE) (gpointer data1, guint arg1, gdouble arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_DOUBLE callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_DOUBLE) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_double (param_values + 2), data2); } /* VOID:UINT,STRING,UINT (ags/object/ags_marshallers.list:17) */ void ags_cclosure_marshal_VOID__UINT_STRING_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_STRING_UINT) (gpointer data1, guint arg1, gpointer arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_STRING_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_STRING_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:UINT,POINTER,UINT (ags/object/ags_marshallers.list:18) */ void ags_cclosure_marshal_VOID__UINT_POINTER_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__UINT_POINTER_UINT) (gpointer data1, guint arg1, gpointer arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__UINT_POINTER_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__UINT_POINTER_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:INT64,UINT (ags/object/ags_marshallers.list:19) */ void ags_cclosure_marshal_VOID__INT64_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__INT64_UINT) (gpointer data1, gint64 arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__INT64_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__INT64_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int64 (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:ULONG,UINT (ags/object/ags_marshallers.list:20) */ void ags_cclosure_marshal_VOID__ULONG_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__ULONG_UINT) (gpointer data1, gulong arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__ULONG_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__ULONG_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:ULONG,UINT,BOOLEAN (ags/object/ags_marshallers.list:21) */ void ags_cclosure_marshal_VOID__ULONG_UINT_BOOLEAN (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__ULONG_UINT_BOOLEAN) (gpointer data1, gulong arg1, guint arg2, gboolean arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__ULONG_UINT_BOOLEAN callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__ULONG_UINT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_boolean (param_values + 3), data2); } /* VOID:DOUBLE,DOUBLE (ags/object/ags_marshallers.list:22) */ void ags_cclosure_marshal_VOID__DOUBLE_DOUBLE (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__DOUBLE_DOUBLE) (gpointer data1, gdouble arg1, gdouble arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__DOUBLE_DOUBLE callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__DOUBLE_DOUBLE) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_double (param_values + 1), g_marshal_value_peek_double (param_values + 2), data2); } /* VOID:ULONG,UINT,UINT (ags/object/ags_marshallers.list:23) */ void ags_cclosure_marshal_VOID__ULONG_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__ULONG_UINT_UINT) (gpointer data1, gulong arg1, guint arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__ULONG_UINT_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__ULONG_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:STRING,UINT (ags/object/ags_marshallers.list:24) */ void ags_cclosure_marshal_VOID__STRING_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_UINT) (gpointer data1, gpointer arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:STRING,UINT,DOUBLE (ags/object/ags_marshallers.list:25) */ void ags_cclosure_marshal_VOID__STRING_UINT_DOUBLE (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_UINT_DOUBLE) (gpointer data1, gpointer arg1, guint arg2, gdouble arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_UINT_DOUBLE callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_UINT_DOUBLE) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_double (param_values + 3), data2); } /* VOID:STRING,UINT,POINTER (ags/object/ags_marshallers.list:26) */ void ags_cclosure_marshal_VOID__STRING_UINT_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_UINT_POINTER) (gpointer data1, gpointer arg1, guint arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_UINT_POINTER callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_UINT_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); } /* VOID:STRING,UINT,STRING,DOUBLE (ags/object/ags_marshallers.list:27) */ void ags_cclosure_marshal_VOID__STRING_UINT_STRING_DOUBLE (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_UINT_STRING_DOUBLE) (gpointer data1, gpointer arg1, guint arg2, gpointer arg3, gdouble arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_UINT_STRING_DOUBLE callback; g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_UINT_STRING_DOUBLE) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_double (param_values + 4), data2); } /* VOID:STRING,POINTER (ags/object/ags_marshallers.list:28) */ void ags_cclosure_marshal_VOID__STRING_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_POINTER callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); } /* VOID:STRING,STRING,STRING (ags/object/ags_marshallers.list:29) */ void ags_cclosure_marshal_VOID__STRING_STRING_STRING (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__STRING_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__STRING_STRING_STRING callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), data2); } /* VOID:POINTER,INT (ags/object/ags_marshallers.list:30) */ void ags_cclosure_marshal_VOID__POINTER_INT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_INT) (gpointer data1, gpointer arg1, gint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_INT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_INT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_int (param_values + 2), data2); } /* VOID:POINTER,INT,POINTER (ags/object/ags_marshallers.list:31) */ void ags_cclosure_marshal_VOID__POINTER_INT_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_INT_POINTER) (gpointer data1, gpointer arg1, gint arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_INT_POINTER callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_INT_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_int (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); } /* VOID:POINTER,INT,INT,BOOLEAN (ags/object/ags_marshallers.list:32) */ void ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_INT_INT_BOOLEAN) (gpointer data1, gpointer arg1, gint arg2, gint arg3, gboolean arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_INT_INT_BOOLEAN callback; g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_INT_INT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_int (param_values + 2), g_marshal_value_peek_int (param_values + 3), g_marshal_value_peek_boolean (param_values + 4), data2); } /* VOID:POINTER,UINT (ags/object/ags_marshallers.list:33) */ void ags_cclosure_marshal_VOID__POINTER_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_UINT) (gpointer data1, gpointer arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:POINTER,POINTER (ags/object/ags_marshallers.list:34) */ void ags_cclosure_marshal_VOID__POINTER_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_POINTER callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); } /* VOID:POINTER,UINT,UINT (ags/object/ags_marshallers.list:35) */ void ags_cclosure_marshal_VOID__POINTER_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_UINT_UINT) (gpointer data1, gpointer arg1, guint arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_UINT_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:POINTER,UINT,POINTER (ags/object/ags_marshallers.list:36) */ void ags_cclosure_marshal_VOID__POINTER_UINT_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_UINT_POINTER) (gpointer data1, gpointer arg1, guint arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_UINT_POINTER callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_UINT_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); } /* VOID:POINTER,POINTER,UINT (ags/object/ags_marshallers.list:37) */ void ags_cclosure_marshal_VOID__POINTER_POINTER_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_POINTER_UINT) (gpointer data1, gpointer arg1, gpointer arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_POINTER_UINT callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_POINTER_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); } /* VOID:POINTER,POINTER,POINTER (ags/object/ags_marshallers.list:38) */ void ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__POINTER_POINTER_POINTER callback; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); } /* VOID:OBJECT,UINT (ags/object/ags_marshallers.list:39) */ void ags_cclosure_marshal_VOID__OBJECT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_UINT) (gpointer data1, gpointer arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__OBJECT_UINT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); } /* VOID:OBJECT,UINT,UINT,UINT (ags/object/ags_marshallers.list:40) */ void ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_UINT_UINT_UINT) (gpointer data1, gpointer arg1, guint arg2, guint arg3, guint arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__OBJECT_UINT_UINT_UINT callback; g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_UINT_UINT_UINT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_uint (param_values + 3), g_marshal_value_peek_uint (param_values + 4), data2); } /* VOID:OBJECT,OBJECT (ags/object/ags_marshallers.list:41) */ void ags_cclosure_marshal_VOID__OBJECT_OBJECT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__OBJECT_OBJECT callback; g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), data2); } /* VOID:OBJECT,OBJECT,OBJECT,INT,BOOLEAN (ags/object/ags_marshallers.list:42) */ void ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gint arg4, gboolean arg5, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN callback; g_return_if_fail (n_param_values == 6); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), g_marshal_value_peek_object (param_values + 3), g_marshal_value_peek_int (param_values + 4), g_marshal_value_peek_boolean (param_values + 5), data2); } /* VOID:OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,UINT,INT,BOOLEAN (ags/object/ags_marshallers.list:43) */ void ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, gpointer arg6, guint arg7, gint arg8, gboolean arg9, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN callback; g_return_if_fail (n_param_values == 10); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), g_marshal_value_peek_object (param_values + 3), g_marshal_value_peek_object (param_values + 4), g_marshal_value_peek_object (param_values + 5), g_marshal_value_peek_object (param_values + 6), g_marshal_value_peek_uint (param_values + 7), g_marshal_value_peek_int (param_values + 8), g_marshal_value_peek_boolean (param_values + 9), data2); } /* VOID:OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT,OBJECT (ags/object/ags_marshallers.list:44) */ void ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, gpointer arg6, gpointer arg7, gpointer arg8, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT callback; g_return_if_fail (n_param_values == 9); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), g_marshal_value_peek_object (param_values + 3), g_marshal_value_peek_object (param_values + 4), g_marshal_value_peek_object (param_values + 5), g_marshal_value_peek_object (param_values + 6), g_marshal_value_peek_object (param_values + 7), g_marshal_value_peek_object (param_values + 8), data2); } /* ULONG:VOID (ags/object/ags_marshallers.list:45) */ void ags_cclosure_marshal_ULONG__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gulong (*GMarshalFunc_ULONG__VOID) (gpointer data1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_ULONG__VOID callback; gulong v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_ULONG__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_set_ulong (return_value, v_return); } /* INT:VOID (ags/object/ags_marshallers.list:46) */ void ags_cclosure_marshal_INT__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gint (*GMarshalFunc_INT__VOID) (gpointer data1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_INT__VOID callback; gint v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_INT__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_set_int (return_value, v_return); } /* INT64:OBJECT (ags/object/ags_marshallers.list:47) */ void ags_cclosure_marshal_INT64__OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gint64 (*GMarshalFunc_INT64__OBJECT) (gpointer data1, gpointer arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_INT64__OBJECT callback; gint64 v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_INT64__OBJECT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), data2); g_value_set_int64 (return_value, v_return); } /* UINT:VOID (ags/object/ags_marshallers.list:48) */ void ags_cclosure_marshal_UINT__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef guint (*GMarshalFunc_UINT__VOID) (gpointer data1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_UINT__VOID callback; guint v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_UINT__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_set_uint (return_value, v_return); } /* BOOLEAN:VOID (ags/object/ags_marshallers.list:49) */ void ags_cclosure_marshal_BOOLEAN__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__VOID) (gpointer data1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_BOOLEAN__VOID callback; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_set_boolean (return_value, v_return); } /* BOOLEAN:UINT,POINTER (ags/object/ags_marshallers.list:50) */ void ags_cclosure_marshal_BOOLEAN__UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__UINT_POINTER) (gpointer data1, guint arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_BOOLEAN__UINT_POINTER callback; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } /* BOOLEAN:POINTER,UINT (ags/object/ags_marshallers.list:51) */ void ags_cclosure_marshal_BOOLEAN__POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_UINT) (gpointer data1, gpointer arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_BOOLEAN__POINTER_UINT callback; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__POINTER_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } /* BOOLEAN:OBJECT,OBJECT (ags/object/ags_marshallers.list:52) */ void ags_cclosure_marshal_BOOLEAN__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__OBJECT_OBJECT) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_BOOLEAN__OBJECT_OBJECT callback; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } /* UINT:INT,UINT,POINTER (ags/object/ags_marshallers.list:53) */ void ags_cclosure_marshal_UINT__INT_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef guint (*GMarshalFunc_UINT__INT_UINT_POINTER) (gpointer data1, gint arg1, guint arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_UINT__INT_UINT_POINTER callback; guint v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_UINT__INT_UINT_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); g_value_set_uint (return_value, v_return); } /* DOUBLE:DOUBLE,BOOLEAN (ags/object/ags_marshallers.list:54) */ void ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gdouble (*GMarshalFunc_DOUBLE__DOUBLE_BOOLEAN) (gpointer data1, gdouble arg1, gboolean arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_DOUBLE__DOUBLE_BOOLEAN callback; gdouble v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_DOUBLE__DOUBLE_BOOLEAN) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_double (param_values + 1), g_marshal_value_peek_boolean (param_values + 2), data2); g_value_set_double (return_value, v_return); } /* STRING:STRING,STRING (ags/object/ags_marshallers.list:55) */ void ags_cclosure_marshal_STRING__STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gchar* (*GMarshalFunc_STRING__STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_STRING__STRING_STRING callback; gchar* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_STRING__STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), data2); g_value_take_string (return_value, v_return); } /* STRING:ULONG,STRING,STRING,STRING,STRING,UINT,POINTER (ags/object/ags_marshallers.list:56) */ void ags_cclosure_marshal_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gchar* (*GMarshalFunc_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER) (gpointer data1, gulong arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, guint arg6, gpointer arg7, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER callback; gchar* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 8); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_string (param_values + 4), g_marshal_value_peek_string (param_values + 5), g_marshal_value_peek_uint (param_values + 6), g_marshal_value_peek_pointer (param_values + 7), data2); g_value_take_string (return_value, v_return); } /* POINTER:VOID (ags/object/ags_marshallers.list:57) */ void ags_cclosure_marshal_POINTER__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__VOID) (gpointer data1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__VOID callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_set_pointer (return_value, v_return); } /* POINTER:INT (ags/object/ags_marshallers.list:58) */ void ags_cclosure_marshal_POINTER__INT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__INT) (gpointer data1, gint arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__INT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__INT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_int (param_values + 1), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:UINT (ags/object/ags_marshallers.list:59) */ void ags_cclosure_marshal_POINTER__UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__UINT) (gpointer data1, guint arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__UINT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_uint (param_values + 1), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:POINTER (ags/object/ags_marshallers.list:60) */ void ags_cclosure_marshal_POINTER__POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__POINTER) (gpointer data1, gpointer arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_pointer (param_values + 1), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:INT,UINT (ags/object/ags_marshallers.list:61) */ void ags_cclosure_marshal_POINTER__INT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__INT_UINT) (gpointer data1, gint arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__INT_UINT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__INT_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:UINT,UINT (ags/object/ags_marshallers.list:62) */ void ags_cclosure_marshal_POINTER__UINT_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__UINT_UINT) (gpointer data1, guint arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__UINT_UINT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__UINT_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:UINT,POINTER (ags/object/ags_marshallers.list:63) */ void ags_cclosure_marshal_POINTER__UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__UINT_POINTER) (gpointer data1, guint arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__UINT_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:POINTER,POINTER,POINTER (ags/object/ags_marshallers.list:64) */ void ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__POINTER_POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__POINTER_POINTER_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:POINTER,UINT (ags/object/ags_marshallers.list:65) */ void ags_cclosure_marshal_POINTER__POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__POINTER_UINT) (gpointer data1, gpointer arg1, guint arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__POINTER_UINT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__POINTER_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_uint (param_values + 2), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:STRING,STRING (ags/object/ags_marshallers.list:66) */ void ags_cclosure_marshal_POINTER__STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__STRING_STRING callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:STRING,STRING,STRING (ags/object/ags_marshallers.list:67) */ void ags_cclosure_marshal_POINTER__STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__STRING_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__STRING_STRING_STRING callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:STRING,STRING,STRING,STRING (ags/object/ags_marshallers.list:68) */ void ags_cclosure_marshal_POINTER__STRING_STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__STRING_STRING_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__STRING_STRING_STRING_STRING callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__STRING_STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_string (param_values + 4), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:ULONG,POINTER,UINT (ags/object/ags_marshallers.list:69) */ void ags_cclosure_marshal_POINTER__ULONG_POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__ULONG_POINTER_UINT) (gpointer data1, gulong arg1, gpointer arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__ULONG_POINTER_UINT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__ULONG_POINTER_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:ULONG,UINT,POINTER,POINTER (ags/object/ags_marshallers.list:70) */ void ags_cclosure_marshal_POINTER__ULONG_UINT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__ULONG_UINT_POINTER_POINTER) (gpointer data1, gulong arg1, guint arg2, gpointer arg3, gpointer arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__ULONG_UINT_POINTER_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__ULONG_UINT_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_uint (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), g_marshal_value_peek_pointer (param_values + 4), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT (ags/object/ags_marshallers.list:71) */ void ags_cclosure_marshal_POINTER__OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT) (gpointer data1, gpointer arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,POINTER,UINT (ags/object/ags_marshallers.list:72) */ void ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_POINTER_UINT) (gpointer data1, gpointer arg1, gpointer arg2, guint arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_POINTER_UINT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_POINTER_UINT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_uint (param_values + 3), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,POINTER,INT64 (ags/object/ags_marshallers.list:73) */ void ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64 (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_POINTER_INT64) (gpointer data1, gpointer arg1, gpointer arg2, gint64 arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_POINTER_INT64 callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_POINTER_INT64) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_int64 (param_values + 3), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,OBJECT (ags/object/ags_marshallers.list:74) */ void ags_cclosure_marshal_POINTER__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_OBJECT) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_OBJECT callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,STRING,STRING,STRING,POINTER (ags/object/ags_marshallers.list:75) */ void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 6); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_string (param_values + 4), g_marshal_value_peek_pointer (param_values + 5), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,STRING,STRING,STRING,STRING,POINTER (ags/object/ags_marshallers.list:76) */ void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, gpointer arg6, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 7); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_string (param_values + 4), g_marshal_value_peek_string (param_values + 5), g_marshal_value_peek_pointer (param_values + 6), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,STRING,STRING,STRING,UINT,POINTER,POINTER (ags/object/ags_marshallers.list:77) */ void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, guint arg5, gpointer arg6, gpointer arg7, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 8); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_string (param_values + 4), g_marshal_value_peek_uint (param_values + 5), g_marshal_value_peek_pointer (param_values + 6), g_marshal_value_peek_pointer (param_values + 7), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,STRING,STRING,STRING,STRING,UINT,POINTER,POINTER (ags/object/ags_marshallers.list:78) */ void ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, guint arg6, gpointer arg7, gpointer arg8, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 9); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), g_marshal_value_peek_string (param_values + 4), g_marshal_value_peek_string (param_values + 5), g_marshal_value_peek_uint (param_values + 6), g_marshal_value_peek_pointer (param_values + 7), g_marshal_value_peek_pointer (param_values + 8), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,POINTER,OBJECT,OBJECT,STRING,STRING,STRING (ags/object/ags_marshallers.list:79) */ void ags_cclosure_marshal_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, gpointer arg6, gpointer arg7, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 8); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_object (param_values + 3), g_marshal_value_peek_object (param_values + 4), g_marshal_value_peek_string (param_values + 5), g_marshal_value_peek_string (param_values + 6), g_marshal_value_peek_string (param_values + 7), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:OBJECT,POINTER,POINTER,OBJECT,STRING,STRING,STRING (ags/object/ags_marshallers.list:80) */ void ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer arg5, gpointer arg6, gpointer arg7, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 8); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), g_marshal_value_peek_object (param_values + 4), g_marshal_value_peek_string (param_values + 5), g_marshal_value_peek_string (param_values + 6), g_marshal_value_peek_string (param_values + 7), data2); g_value_set_pointer (return_value, v_return); } /* POINTER:POINTER,STRING,STRING (ags/object/ags_marshallers.list:81) */ void ags_cclosure_marshal_POINTER__POINTER_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gpointer (*GMarshalFunc_POINTER__POINTER_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_POINTER__POINTER_STRING_STRING callback; gpointer v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_POINTER__POINTER_STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), data2); g_value_set_pointer (return_value, v_return); } /* OBJECT:VOID (ags/object/ags_marshallers.list:82) */ void ags_cclosure_marshal_OBJECT__VOID (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__VOID) (gpointer data1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__VOID callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 1); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__VOID) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, data2); g_value_take_object (return_value, v_return); } /* OBJECT:UINT,POINTER (ags/object/ags_marshallers.list:83) */ void ags_cclosure_marshal_OBJECT__UINT_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__UINT_POINTER) (gpointer data1, guint arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__UINT_POINTER callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_uint (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), data2); g_value_take_object (return_value, v_return); } /* OBJECT:STRING,STRING,STRING (ags/object/ags_marshallers.list:84) */ void ags_cclosure_marshal_OBJECT__STRING_STRING_STRING (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__STRING_STRING_STRING) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__STRING_STRING_STRING callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__STRING_STRING_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_string (param_values + 1), g_marshal_value_peek_string (param_values + 2), g_marshal_value_peek_string (param_values + 3), data2); g_value_take_object (return_value, v_return); } /* OBJECT:OBJECT (ags/object/ags_marshallers.list:85) */ void ags_cclosure_marshal_OBJECT__OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__OBJECT) (gpointer data1, gpointer arg1, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__OBJECT callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__OBJECT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), data2); g_value_take_object (return_value, v_return); } /* OBJECT:OBJECT,POINTER,POINTER (ags/object/ags_marshallers.list:86) */ void ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__OBJECT_POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__OBJECT_POINTER_POINTER callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__OBJECT_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), data2); g_value_take_object (return_value, v_return); } /* OBJECT:OBJECT,POINTER,POINTER,POINTER (ags/object/ags_marshallers.list:87) */ void ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__OBJECT_POINTER_POINTER_POINTER) (gpointer data1, gpointer arg1, gpointer arg2, gpointer arg3, gpointer arg4, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__OBJECT_POINTER_POINTER_POINTER callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 5); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__OBJECT_POINTER_POINTER_POINTER) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_pointer (param_values + 3), g_marshal_value_peek_pointer (param_values + 4), data2); g_value_take_object (return_value, v_return); } /* OBJECT:OBJECT,OBJECT (ags/object/ags_marshallers.list:88) */ void ags_cclosure_marshal_OBJECT__OBJECT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef GObject* (*GMarshalFunc_OBJECT__OBJECT_OBJECT) (gpointer data1, gpointer arg1, gpointer arg2, gpointer data2); GCClosure *cc = (GCClosure *) closure; gpointer data1, data2; GMarshalFunc_OBJECT__OBJECT_OBJECT callback; GObject* v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_OBJECT__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_object (param_values + 2), data2); g_value_take_object (return_value, v_return); } gsequencer-3.1.3/ags/object/ags_application_context.c0000644000175000017500000006766013607210263017704 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include void ags_application_context_class_init(AgsApplicationContextClass *application_context); void ags_application_context_connectable_interface_init(AgsConnectableInterface *connectable); void ags_application_context_init(AgsApplicationContext *application_context); void ags_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_application_context_dispose(GObject *gobject); void ags_application_context_finalize(GObject *gobject); AgsUUID* ags_application_context_get_uuid(AgsConnectable *connectable); gboolean ags_application_context_has_resource(AgsConnectable *connectable); gboolean ags_application_context_is_ready(AgsConnectable *connectable); void ags_application_context_add_to_registry(AgsConnectable *connectable); void ags_application_context_remove_from_registry(AgsConnectable *connectable); xmlNode* ags_application_context_list_resource(AgsConnectable *connectable); xmlNode* ags_application_context_xml_compose(AgsConnectable *connectable); void ags_application_context_xml_parse(AgsConnectable *connectable, xmlNode *node); gboolean ags_application_context_is_connected(AgsConnectable *connectable); void ags_application_context_connect(AgsConnectable *connectable); void ags_application_context_disconnect(AgsConnectable *connectable); void ags_application_context_real_load_config(AgsApplicationContext *application_context); void ags_application_context_real_prepare(AgsApplicationContext *application_context); void ags_application_context_real_setup(AgsApplicationContext *application_context); void ags_application_context_real_register_types(AgsApplicationContext *application_context); void ags_application_context_real_quit(AgsApplicationContext *application_context); /** * SECTION:ags_application_context * @short_description: The application context * @title: AgsApplicationContext * @section_id: * @include: ags/object/ags_application_context.h * * #AgsApplicationContext is a context provider is your and libraries entry * point to the application. You might subtype it to implement your own contices. * Thus you should consider to create a provider interface for reusability. */ enum{ LOAD_CONFIG, PREPARE, SETUP, REGISTER_TYPES, QUIT, LAST_SIGNAL, }; enum{ PROP_0, PROP_MAIN_LOOP, PROP_TASK_LAUNCHER, PROP_CONFIG, PROP_FILE, }; static gpointer ags_application_context_parent_class = NULL; static guint application_context_signals[LAST_SIGNAL]; AgsApplicationContext *ags_application_context = NULL; GType ags_application_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_application_context = 0; static const GTypeInfo ags_application_context_info = { sizeof (AgsApplicationContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_application_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsApplicationContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_application_context_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_application_context_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_application_context = g_type_register_static(G_TYPE_OBJECT, "AgsApplicationContext", &ags_application_context_info, 0); g_type_add_interface_static(ags_type_application_context, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_application_context); } return g_define_type_id__volatile; } void ags_application_context_class_init(AgsApplicationContextClass *application_context) { GObjectClass *gobject; GParamSpec *param_spec; ags_application_context_parent_class = g_type_class_peek_parent(application_context); /* GObjectClass */ gobject = (GObjectClass *) application_context; gobject->set_property = ags_application_context_set_property; gobject->get_property = ags_application_context_get_property; gobject->dispose = ags_application_context_dispose; gobject->finalize = ags_application_context_finalize; /* properties */ /** * AgsApplicationContext:main-loop: * * The assigned main-loop. * * Since: 3.0.0 */ param_spec = g_param_spec_object("main-loop", i18n_pspec("main loop of application context"), i18n_pspec("The main loop of application context running"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_MAIN_LOOP, param_spec); /** * AgsApplicationContext:task-launcher: * * The assigned task launcher. * * Since: 3.0.0 */ param_spec = g_param_spec_object("task-launcher", i18n_pspec("task launcher"), i18n_pspec("The task launcher"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_TASK_LAUNCHER, param_spec); /** * AgsApplicationContext:config: * * The assigned config. * * Since: 3.0.0 */ param_spec = g_param_spec_object("config", i18n_pspec("config of application context"), i18n_pspec("The config what application context is running in"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONFIG, param_spec); /** * AgsApplicationContext:file: * * The assigned file. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file", i18n_pspec("file of application context"), i18n_pspec("The file what application context does persist"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); /* AgsApplicationContextClass */ application_context->load_config = ags_application_context_real_load_config; application_context->prepare = ags_application_context_real_prepare; application_context->setup = ags_application_context_real_setup; application_context->register_types = ags_application_context_real_register_types; application_context->quit = ags_application_context_real_quit; /* signals */ /** * AgsApplicationContext::load-config: * @application_context: the #AgsApplicationContext * * The ::load-config notifies to load configuration. * * Since: 3.0.0 */ application_context_signals[LOAD_CONFIG] = g_signal_new("load-config", G_TYPE_FROM_CLASS (application_context), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsApplicationContextClass, load_config), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsApplicationContext::prepare: * @application_context: the #AgsApplicationContext * * The ::prepare signal should be implemented to prepare * your application context. * * Since: 3.0.0 */ application_context_signals[PREPARE] = g_signal_new("prepare", G_TYPE_FROM_CLASS (application_context), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsApplicationContextClass, prepare), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsApplicationContext::setup: * @application_context: the #AgsApplicationContext * * The ::setup signal should be implemented to setup * your application context. * * Since: 3.0.0 */ application_context_signals[SETUP] = g_signal_new("setup", G_TYPE_FROM_CLASS (application_context), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsApplicationContextClass, setup), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsApplicationContext::register-types: * @application_context: the #AgsApplicationContext * * The ::register-types signal should be implemented to load * your types. * * Since: 3.0.0 */ application_context_signals[REGISTER_TYPES] = g_signal_new("register-types", G_TYPE_FROM_CLASS (application_context), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsApplicationContextClass, register_types), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsApplicationContext::quit: * @application_context: the #AgsApplicationContext * * The ::quit notifies to load configuration. * * Since: 3.0.0 */ application_context_signals[QUIT] = g_signal_new("quit", G_TYPE_FROM_CLASS (application_context), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsApplicationContextClass, quit), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_application_context_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->get_uuid = ags_application_context_get_uuid; connectable->has_resource = ags_application_context_has_resource; connectable->is_ready = ags_application_context_is_ready; connectable->add_to_registry = ags_application_context_add_to_registry; connectable->remove_from_registry = ags_application_context_remove_from_registry; connectable->list_resource = ags_application_context_list_resource; connectable->xml_compose = ags_application_context_xml_compose; connectable->xml_parse = ags_application_context_xml_parse; connectable->is_connected = ags_application_context_is_connected; connectable->connect = ags_application_context_connect; connectable->disconnect = ags_application_context_disconnect; connectable->connect_connection = NULL; connectable->disconnect_connection = NULL; } void ags_application_context_init(AgsApplicationContext *application_context) { GFile *file; application_context->flags = 0; g_rec_mutex_init(&(application_context->obj_mutex)); /* uuid */ application_context->uuid = ags_uuid_alloc(); ags_uuid_generate(application_context->uuid); application_context->argc = 0; application_context->argv = NULL; application_context->version = g_strdup(AGS_VERSION); application_context->build_id = g_strdup(AGS_BUILD_ID); application_context->log = NULL; application_context->domain = NULL; application_context->config = NULL; application_context->main_loop = NULL; application_context->task_launcher = NULL; application_context->file = NULL; application_context->history = NULL; } void ags_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(gobject); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); switch(prop_id){ case PROP_MAIN_LOOP: { GObject *main_loop; main_loop = (GObject *) g_value_get_object(value); g_rec_mutex_lock(application_context_mutex); if(main_loop == application_context->main_loop){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); } if(main_loop != NULL){ g_object_ref(G_OBJECT(main_loop)); } application_context->main_loop = main_loop; g_rec_mutex_unlock(application_context_mutex); } break; case PROP_TASK_LAUNCHER: { GObject *task_launcher; task_launcher = (GObject *) g_value_get_object(value); g_rec_mutex_lock(application_context_mutex); if(task_launcher == application_context->task_launcher){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); } if(task_launcher != NULL){ g_object_ref(G_OBJECT(task_launcher)); } application_context->task_launcher = task_launcher; g_rec_mutex_unlock(application_context_mutex); } break; case PROP_CONFIG: { AgsConfig *config; config = (AgsConfig *) g_value_get_object(value); g_rec_mutex_lock(application_context_mutex); if(config == application_context->config){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->config != NULL){ g_object_unref(application_context->config); } if(config != NULL){ g_object_ref(G_OBJECT(config)); } application_context->config = config; g_rec_mutex_unlock(application_context_mutex); } break; case PROP_FILE: { AgsFile *file; file = (AgsFile *) g_value_get_object(value); g_rec_mutex_lock(application_context_mutex); if(file == application_context->file){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->file != NULL){ g_object_unref(application_context->file); } if(file != NULL){ g_object_ref(G_OBJECT(file)); } application_context->file = (AgsFile *) file; g_rec_mutex_unlock(application_context_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(gobject); /* get application context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); switch(prop_id){ case PROP_MAIN_LOOP: { g_rec_mutex_lock(application_context_mutex); g_value_set_object(value, application_context->main_loop); g_rec_mutex_unlock(application_context_mutex); } break; case PROP_TASK_LAUNCHER: { g_rec_mutex_lock(application_context_mutex); g_value_set_object(value, application_context->task_launcher); g_rec_mutex_unlock(application_context_mutex); } break; case PROP_CONFIG: { g_rec_mutex_lock(application_context_mutex); g_value_set_object(value, application_context->config); g_rec_mutex_unlock(application_context_mutex); } break; case PROP_FILE: { g_rec_mutex_lock(application_context_mutex); g_value_set_object(value, application_context->file); g_rec_mutex_unlock(application_context_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_application_context_dispose(GObject *gobject) { AgsApplicationContext *application_context; application_context = AGS_APPLICATION_CONTEXT(gobject); /* log */ if(application_context->log != NULL){ g_object_unref(application_context->log); application_context->log = NULL; } /* config */ if(application_context->config != NULL){ g_object_unref(application_context->config); application_context->config = NULL; } /* main loop */ if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); application_context->main_loop = NULL; } /* task launcher */ if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); application_context->task_launcher = NULL; } /* file */ if(application_context->file != NULL){ g_object_unref(application_context->file); application_context->file = NULL; } /* call parent */ G_OBJECT_CLASS(ags_application_context_parent_class)->dispose(gobject); } void ags_application_context_finalize(GObject *gobject) { AgsApplicationContext *application_context; application_context = AGS_APPLICATION_CONTEXT(gobject); g_free(application_context->version); g_free(application_context->build_id); /* log */ if(application_context->log != NULL){ g_object_unref(application_context->log); } /* config */ if(application_context->config != NULL){ g_object_unref(application_context->config); } /* main loop */ if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); } /* task launcher */ if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); } /* file */ if(application_context->file != NULL){ g_object_unref(application_context->file); } if(application_context == ags_application_context){ ags_application_context = NULL; } /* call parent */ G_OBJECT_CLASS(ags_application_context_parent_class)->finalize(gobject); } AgsUUID* ags_application_context_get_uuid(AgsConnectable *connectable) { AgsApplicationContext *application_context; AgsUUID *ptr; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(connectable); /* get application_context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get UUID */ g_rec_mutex_lock(application_context_mutex); ptr = application_context->uuid; g_rec_mutex_unlock(application_context_mutex); return(ptr); } gboolean ags_application_context_has_resource(AgsConnectable *connectable) { return(TRUE); } gboolean ags_application_context_is_ready(AgsConnectable *connectable) { AgsApplicationContext *application_context; gboolean is_ready; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(connectable); /* get application_context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* check is added */ g_rec_mutex_lock(application_context_mutex); is_ready = (((AGS_APPLICATION_CONTEXT_ADDED_TO_REGISTRY & (application_context->flags)) != 0) ? TRUE: FALSE); g_rec_mutex_unlock(application_context_mutex); return(is_ready); } void ags_application_context_add_to_registry(AgsConnectable *connectable) { AgsApplicationContext *application_context; if(ags_connectable_is_ready(connectable)){ return; } application_context = AGS_APPLICATION_CONTEXT(connectable); ags_application_context_set_flags(application_context, AGS_APPLICATION_CONTEXT_ADDED_TO_REGISTRY); } void ags_application_context_remove_from_registry(AgsConnectable *connectable) { AgsApplicationContext *application_context; if(!ags_connectable_is_ready(connectable)){ return; } application_context = AGS_APPLICATION_CONTEXT(connectable); ags_application_context_unset_flags(application_context, AGS_APPLICATION_CONTEXT_ADDED_TO_REGISTRY); } xmlNode* ags_application_context_list_resource(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } xmlNode* ags_application_context_xml_compose(AgsConnectable *connectable) { xmlNode *node; node = NULL; //TODO:JK: implement me return(node); } void ags_application_context_xml_parse(AgsConnectable *connectable, xmlNode *node) { //TODO:JK: implement me } gboolean ags_application_context_is_connected(AgsConnectable *connectable) { AgsApplicationContext *application_context; gboolean is_connected; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(connectable); /* get application_context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* check is connected */ g_rec_mutex_lock(application_context_mutex); is_connected = (((AGS_APPLICATION_CONTEXT_CONNECTED & (application_context->flags)) != 0) ? TRUE: FALSE); g_rec_mutex_unlock(application_context_mutex); return(is_connected); } void ags_application_context_connect(AgsConnectable *connectable) { AgsApplicationContext *application_context; if(ags_connectable_is_connected(connectable)){ return; } application_context = AGS_APPLICATION_CONTEXT(connectable); ags_application_context_set_flags(application_context, AGS_APPLICATION_CONTEXT_CONNECTED); } void ags_application_context_disconnect(AgsConnectable *connectable) { AgsApplicationContext *application_context; if(!ags_connectable_is_connected(connectable)){ return; } application_context = AGS_APPLICATION_CONTEXT(connectable); ags_application_context_unset_flags(application_context, AGS_APPLICATION_CONTEXT_CONNECTED); } /** * ags_application_context_test_flags: * @application_context: the #AgsApplicationContext * @flags: the flags * * Test @flags to be set on @application_context. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_application_context_test_flags(AgsApplicationContext *application_context, guint flags) { gboolean retval; GRecMutex *application_context_mutex; if(!AGS_IS_APPLICATION_CONTEXT(application_context)){ return(FALSE); } /* get application_context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* test */ g_rec_mutex_lock(application_context_mutex); retval = (flags & (application_context->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(application_context_mutex); return(retval); } /** * ags_application_context_set_flags: * @application_context: the #AgsApplicationContext * @flags: see enum AgsApplicationContextFlags * * Enable a feature of #AgsApplicationContext. * * Since: 3.0.0 */ void ags_application_context_set_flags(AgsApplicationContext *application_context, guint flags) { guint application_context_flags; GRecMutex *application_context_mutex; if(!AGS_IS_APPLICATION_CONTEXT(application_context)){ return; } /* get application_context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* set flags */ g_rec_mutex_lock(application_context_mutex); application_context->flags |= flags; g_rec_mutex_unlock(application_context_mutex); } /** * ags_application_context_unset_flags: * @application_context: the #AgsApplicationContext * @flags: see enum AgsApplicationContextFlags * * Disable a feature of AgsApplicationContext. * * Since: 3.0.0 */ void ags_application_context_unset_flags(AgsApplicationContext *application_context, guint flags) { guint application_context_flags; GRecMutex *application_context_mutex; if(!AGS_IS_APPLICATION_CONTEXT(application_context)){ return; } /* get application_context mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* unset flags */ g_rec_mutex_lock(application_context_mutex); application_context->flags &= (~flags); g_rec_mutex_unlock(application_context_mutex); } void ags_application_context_real_load_config(AgsApplicationContext *application_context) { //TODO:JK: implement me } /** * ags_application_context_load_config: * @application_context: the #AgsApplicationContext * * Signal to load and parse configuration. * * Since: 3.0.0 */ void ags_application_context_load_config(AgsApplicationContext *application_context) { g_return_if_fail(AGS_IS_APPLICATION_CONTEXT(application_context)); g_object_ref(G_OBJECT(application_context)); g_signal_emit(G_OBJECT(application_context), application_context_signals[LOAD_CONFIG], 0); g_object_unref(G_OBJECT(application_context)); } void ags_application_context_real_prepare(AgsApplicationContext *application_context) { ags_log_add_message(ags_log_get_instance(), "prepare Advanced Gtk+ Sequencer"); } /** * ags_application_context_prepare: * @application_context: the #AgsApplicationContext * * Prepare @application_context. * * Since: 3.0.0 */ void ags_application_context_prepare(AgsApplicationContext *application_context) { g_return_if_fail(AGS_IS_APPLICATION_CONTEXT(application_context)); g_object_ref(G_OBJECT(application_context)); g_signal_emit(G_OBJECT(application_context), application_context_signals[PREPARE], 0); g_object_unref(G_OBJECT(application_context)); } void ags_application_context_real_setup(AgsApplicationContext *application_context) { ags_log_add_message(ags_log_get_instance(), "setup Advanced Gtk+ Sequencer"); } /** * ags_application_context_setup: * @application_context: the #AgsApplicationContext * * Setup @application_context. * * Since: 3.0.0 */ void ags_application_context_setup(AgsApplicationContext *application_context) { g_return_if_fail(AGS_IS_APPLICATION_CONTEXT(application_context)); g_object_ref(G_OBJECT(application_context)); g_signal_emit(G_OBJECT(application_context), application_context_signals[SETUP], 0); g_object_unref(G_OBJECT(application_context)); } void ags_application_context_real_register_types(AgsApplicationContext *application_context) { //TODO:JK: implement me } /** * ags_application_context_register_types: * @application_context: the #AgsApplicationContext * * Notification to register your types. * * Since: 3.0.0 */ void ags_application_context_register_types(AgsApplicationContext *application_context) { g_return_if_fail(AGS_IS_APPLICATION_CONTEXT(application_context)); g_object_ref(G_OBJECT(application_context)); g_signal_emit(G_OBJECT(application_context), application_context_signals[REGISTER_TYPES], 0); g_object_unref(G_OBJECT(application_context)); } void ags_application_context_real_quit(AgsApplicationContext *application_context) { //TODO:JK: enhance me exit(0); } /** * ags_application_context_quit: * @application_context: the #AgsApplicationContext * * Calls exit() * * Since: 3.0.0 */ void ags_application_context_quit(AgsApplicationContext *application_context) { g_return_if_fail(AGS_IS_APPLICATION_CONTEXT(application_context)); g_object_ref(G_OBJECT(application_context)); g_signal_emit(G_OBJECT(application_context), application_context_signals[QUIT], 0); g_object_unref(G_OBJECT(application_context)); } /** * ags_application_context_get_instance: * * Get your application context instance. * * Returns: (transfer none): the #AgsApplicationContext instance * * Since: 3.0.0 */ AgsApplicationContext* ags_application_context_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_application_context == NULL){ ags_application_context = ags_application_context_new(NULL, NULL); } g_mutex_unlock(&mutex); return(ags_application_context); } /** * ags_application_context_new: * @main_loop: (nullable): the #AgsMainLoop * @config: (nullable): the #AgsConfig * * Create a new instance of #AgsApplicationContext * * Returns: the #AgsApplicationContext instance * * Since: 3.0.0 */ AgsApplicationContext* ags_application_context_new(GObject *main_loop, AgsConfig *config) { AgsApplicationContext *application_context; application_context = (AgsApplicationContext *) g_object_new(AGS_TYPE_APPLICATION_CONTEXT, "main-loop", main_loop, "config", config, NULL); return(application_context); } gsequencer-3.1.3/ags/object/ags_countable.h0000644000175000017500000000435413607210263015605 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_COUNTABLE_H__ #define __AGS_COUNTABLE_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_COUNTABLE (ags_countable_get_type()) #define AGS_COUNTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_COUNTABLE, AgsCountable)) #define AGS_COUNTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_COUNTABLE, AgsCountableInterface)) #define AGS_IS_COUNTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_COUNTABLE)) #define AGS_IS_COUNTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_COUNTABLE)) #define AGS_COUNTABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_COUNTABLE, AgsCountableInterface)) typedef struct _AgsCountable AgsCountable; typedef struct _AgsCountableInterface AgsCountableInterface; struct _AgsCountableInterface { GTypeInterface ginterface; guint64 (*get_sequencer_counter)(AgsCountable *countable); guint64 (*get_notation_counter)(AgsCountable *countable); guint64 (*get_wave_counter)(AgsCountable *countable); guint64 (*get_midi_counter)(AgsCountable *countable); }; GType ags_countable_get_type(); guint64 ags_countable_get_sequencer_counter(AgsCountable *countable); guint64 ags_countable_get_notation_counter(AgsCountable *countable); guint64 ags_countable_get_wave_counter(AgsCountable *countable); guint64 ags_countable_get_midi_counter(AgsCountable *countable); G_END_DECLS #endif /*__AGS_COUNTABLE_H__*/ gsequencer-3.1.3/ags/object/ags_portlet.h0000644000175000017500000000460113607210263015315 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PORTLET_H__ #define __AGS_PORTLET_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_PORTLET (ags_portlet_get_type()) #define AGS_PORTLET(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PORTLET, AgsPortlet)) #define AGS_PORTLET_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_PORTLET, AgsPortletInterface)) #define AGS_IS_PORTLET(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PORTLET)) #define AGS_IS_PORTLET_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_PORTLET)) #define AGS_PORTLET_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_PORTLET, AgsPortletInterface)) typedef struct _AgsPortlet AgsPortlet; typedef struct _AgsPortletInterface AgsPortletInterface; struct _AgsPortletInterface { GTypeInterface ginterface; GObject* (*get_port)(AgsPortlet *portlet); void (*set_port)(AgsPortlet *portlet, GObject *port); GList* (*list_safe_properties)(AgsPortlet *portlet); void (*safe_get_property)(AgsPortlet *portlet, gchar *property_name, GValue *value); void (*safe_set_property)(AgsPortlet *portlet, gchar *property_name, GValue *value); }; GType ags_portlet_get_type(); GObject* ags_portlet_get_port(AgsPortlet *portlet); void ags_portlet_set_port(AgsPortlet *portlet, GObject *port); GList* ags_portlet_list_safe_properties(AgsPortlet *portlet); void ags_portlet_safe_get_property(AgsPortlet *portlet, gchar *property_name, GValue *value); void ags_portlet_safe_set_property(AgsPortlet *portlet, gchar *property_name, GValue *value); G_END_DECLS #endif /*__AGS_PORTLET_H__*/ gsequencer-3.1.3/ags/object/ags_globals.h0000644000175000017500000000204513607210263015247 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2018 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_GLOBALS_H__ #define __AGS_GLOBALS_H__ #include #include G_BEGIN_DECLS GHashTable* ags_globals_get_hash_table(); void ags_globals_set(gchar *key, GValue *value); GValue* ags_globals_get(gchar *key); G_END_DECLS #endif /*__AGS_GLOBALS_H__*/ gsequencer-3.1.3/ags/object/ags_countable.c0000644000175000017500000001014613607210263015574 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_countable_base_init(AgsCountableInterface *ginterface); /** * SECTION:ags_countable * @short_description: a counter interface * @title: AgsCountable * @section_id: * @include: ags/object/ags_countable.h * * The #AgsCountable interface gives you a unique access to counters. Generally we * distinguish between notation and sequencer counters. Those may have their own * relative positions, especially the sequencers may loop. */ GType ags_countable_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_countable = 0; static const GTypeInfo ags_countable_info = { sizeof(AgsCountableInterface), (GBaseInitFunc) ags_countable_base_init, NULL, /* base_finalize */ }; ags_type_countable = g_type_register_static(G_TYPE_INTERFACE, "AgsCountable", &ags_countable_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_countable); } return g_define_type_id__volatile; } void ags_countable_base_init(AgsCountableInterface *ginterface) { /* empty */ } /** * ags_countable_get_sequencer_counter: * @countable: an #AgsCountable * * Retrieve current position of sequencer. * * Returns: the current position * * Since: 3.0.0 */ guint64 ags_countable_get_sequencer_counter(AgsCountable *countable) { AgsCountableInterface *countable_interface; g_return_val_if_fail(AGS_IS_COUNTABLE(countable), G_MAXUINT64); countable_interface = AGS_COUNTABLE_GET_INTERFACE(countable); g_return_val_if_fail(countable_interface->get_sequencer_counter, G_MAXUINT64); return(countable_interface->get_sequencer_counter(countable)); } /** * ags_countable_get_notation_counter: * @countable: an #AgsCountable * * Retrieve current position of notation. * * Returns: the current position * * Since: 3.0.0 */ guint64 ags_countable_get_notation_counter(AgsCountable *countable) { AgsCountableInterface *countable_interface; g_return_val_if_fail(AGS_IS_COUNTABLE(countable), G_MAXUINT64); countable_interface = AGS_COUNTABLE_GET_INTERFACE(countable); g_return_val_if_fail(countable_interface->get_notation_counter, G_MAXUINT64); return(countable_interface->get_notation_counter(countable)); } /** * ags_countable_get_wave_counter: * @countable: an #AgsCountable * * Retrieve current position of wave. * * Returns: the current position * * Since: 3.0.0 */ guint64 ags_countable_get_wave_counter(AgsCountable *countable) { AgsCountableInterface *countable_interface; g_return_val_if_fail(AGS_IS_COUNTABLE(countable), G_MAXUINT64); countable_interface = AGS_COUNTABLE_GET_INTERFACE(countable); g_return_val_if_fail(countable_interface->get_wave_counter, G_MAXUINT64); return(countable_interface->get_wave_counter(countable)); } /** * ags_countable_get_midi_counter: * @countable: an #AgsCountable * * Retrieve current position of MIDI. * * Returns: the current position * * Since: 3.0.0 */ guint64 ags_countable_get_midi_counter(AgsCountable *countable) { AgsCountableInterface *countable_interface; g_return_val_if_fail(AGS_IS_COUNTABLE(countable), G_MAXUINT64); countable_interface = AGS_COUNTABLE_GET_INTERFACE(countable); g_return_val_if_fail(countable_interface->get_midi_counter, G_MAXUINT64); return(countable_interface->get_midi_counter(countable)); } gsequencer-3.1.3/ags/object/ags_main_loop.c0000644000175000017500000001563613607210263015606 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_main_loop_class_init(AgsMainLoopInterface *ginterface); /** * SECTION:ags_main_loop * @short_description: main loop interface * @title: AgsMainLoop * @section_id: AgsMainLoop * @include: ags/object/ags_main_loop.h * * The #AgsMainLoop interface gives you a unique access to * the main loop. */ enum { CHANGE_FREQUENCY, LAST_SIGNAL, }; static guint main_loop_signals[LAST_SIGNAL]; GType ags_main_loop_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_main_loop = 0; ags_type_main_loop = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsMainLoop", sizeof (AgsMainLoopInterface), (GClassInitFunc) ags_main_loop_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_main_loop); } return g_define_type_id__volatile; } void ags_main_loop_class_init(AgsMainLoopInterface *ginterface) { /** * AgsMainLoop::change-frequency: * @main_loop: the #AgsMainLoop * @frequency: the new frequency * * Change frequency. * * Since: 3.0.0 */ main_loop_signals[CHANGE_FREQUENCY] = g_signal_new("change-frequency", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsMainLoopInterface, change_frequency), NULL, NULL, g_cclosure_marshal_VOID__DOUBLE, G_TYPE_NONE, 1, G_TYPE_DOUBLE); } /** * ags_main_loop_get_tree_lock: * @main_loop: the #AgsMainLoop * * Retrieve the tree mutex. * * Returns: (transfer none): the mutex * * Since: 3.0.0 */ GRecMutex* ags_main_loop_get_tree_lock(AgsMainLoop *main_loop) { AgsMainLoopInterface *main_loop_interface; g_return_val_if_fail(AGS_IS_MAIN_LOOP(main_loop), NULL); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_val_if_fail(main_loop_interface->get_tree_lock, NULL); return(main_loop_interface->get_tree_lock(main_loop)); } /** * ags_main_loop_set_syncing: * @main_loop: the #AgsMainLoop * @is_syncing: set %TRUE if syncing * * Set thread tree is syncing. * * Since: 3.0.0 */ void ags_main_loop_set_syncing(AgsMainLoop *main_loop, gboolean is_syncing) { AgsMainLoopInterface *main_loop_interface; g_return_if_fail(AGS_IS_MAIN_LOOP(main_loop)); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_if_fail(main_loop_interface->set_syncing); main_loop_interface->set_syncing(main_loop, is_syncing); } /** * ags_main_loop_is_syncing: * @main_loop: the #AgsMainLoop * * Check if thread tree is syncing. * * Returns: %TRUE if sync in progress, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_main_loop_is_syncing(AgsMainLoop *main_loop) { AgsMainLoopInterface *main_loop_interface; g_return_val_if_fail(AGS_IS_MAIN_LOOP(main_loop), FALSE); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_val_if_fail(main_loop_interface->is_syncing, FALSE); return(main_loop_interface->is_syncing(main_loop)); } /** * ags_main_loop_set_critical_region: * @main_loop: the #AgsMainLoop * @is_critical_region: set %TRUE if critical region * * Set main loop is in critical region. * * Since: 3.0.0 */ void ags_main_loop_set_critical_region(AgsMainLoop *main_loop, gboolean is_critical_region) { AgsMainLoopInterface *main_loop_interface; g_return_if_fail(AGS_IS_MAIN_LOOP(main_loop)); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_if_fail(main_loop_interface->set_critical_region); main_loop_interface->set_critical_region(main_loop, is_critical_region); } /** * ags_main_loop_is_critical_region: * @main_loop: the #AgsMainLoop * * Check if main loop is in critical region. * * Returns: %TRUE if sync in progress, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_main_loop_is_critical_region(AgsMainLoop *main_loop) { AgsMainLoopInterface *main_loop_interface; g_return_val_if_fail(AGS_IS_MAIN_LOOP(main_loop), FALSE); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_val_if_fail(main_loop_interface->is_critical_region, FALSE); return(main_loop_interface->is_critical_region(main_loop)); } /** * ags_main_loop_inc_queued_critical_region: * @main_loop: the #AgsMainLoop * * Increment thread needs access to main loop's critical region field. * * Since: 3.0.0 */ void ags_main_loop_inc_queued_critical_region(AgsMainLoop *main_loop) { AgsMainLoopInterface *main_loop_interface; g_return_if_fail(AGS_IS_MAIN_LOOP(main_loop)); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_if_fail(main_loop_interface->inc_queued_critical_region); main_loop_interface->inc_queued_critical_region(main_loop); } /** * ags_main_loop_dec_queued_critical_region: * @main_loop: the #AgsMainLoop * * Decrement thread needs access to main loop's critical region field. * * Since: 3.0.0 */ void ags_main_loop_dec_queued_critical_region(AgsMainLoop *main_loop) { AgsMainLoopInterface *main_loop_interface; g_return_if_fail(AGS_IS_MAIN_LOOP(main_loop)); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_if_fail(main_loop_interface->dec_queued_critical_region); main_loop_interface->dec_queued_critical_region(main_loop); } /** * ags_main_loop_test_queued_critical_region: * @main_loop: the #AgsMainLoop * * Test main loop may enter critical region. * * Returns: 0 if main loop may enter critical region, otherwise not * * Since: 3.0.0 */ guint ags_main_loop_test_queued_critical_region(AgsMainLoop *main_loop) { AgsMainLoopInterface *main_loop_interface; g_return_val_if_fail(AGS_IS_MAIN_LOOP(main_loop), FALSE); main_loop_interface = AGS_MAIN_LOOP_GET_INTERFACE(main_loop); g_return_val_if_fail(main_loop_interface->test_queued_critical_region, 0); return(main_loop_interface->test_queued_critical_region(main_loop)); } /** * ags_main_loop_change_frequency: * @main_loop: the #AgsMainLoop * @frequency: the new frequency * * Change frequency. * * Since: 3.0.0 */ void ags_main_loop_change_frequency(AgsMainLoop *main_loop, gdouble frequency) { g_signal_emit(main_loop, main_loop_signals[CHANGE_FREQUENCY], 0, frequency); } gsequencer-3.1.3/ags/object/ags_application_context.h0000644000175000017500000001125213607210263017673 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_APPLICATION_CONTEXT_H__ #define __AGS_APPLICATION_CONTEXT_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_APPLICATION_CONTEXT (ags_application_context_get_type()) #define AGS_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_APPLICATION_CONTEXT, AgsApplicationContext)) #define AGS_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_APPLICATION_CONTEXT, AgsApplicationContextClass)) #define AGS_IS_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_APPLICATION_CONTEXT)) #define AGS_IS_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_APPLICATION_CONTEXT)) #define AGS_APPLICATION_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_APPLICATION_CONTEXT, AgsApplicationContextClass)) #define AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(obj) (&(((AgsApplicationContext *) obj)->obj_mutex)) #ifndef PACKAGE_VERSION #define AGS_VERSION "3.0.0" #else #define AGS_VERSION PACKAGE_VERSION #endif #define AGS_BUILD_ID "Wed Nov 6 18:28:15 UTC 2019" #define AGS_DEFAULT_DIRECTORY ".gsequencer" #define AGS_DEFAULT_CONFIG "ags.conf" typedef struct _AgsApplicationContext AgsApplicationContext; typedef struct _AgsApplicationContextClass AgsApplicationContextClass; /** * AgsApplicationContextFlags: * @AGS_APPLICATION_CONTEXT_ADDED_TO_REGISTRY: indicates the application context was added to #AgsRegistry * @AGS_APPLICATION_CONTEXT_CONNECTED: indicates the application context was connected by calling #AgsConnectable::connect() * @AGS_APPLICATION_CONTEXT_TYPES_REGISTERED: indicates the types have been registered * * Enum values to control the behavior or indicate internal state of #AgsApplicationContext by * enable/disable as flags. */ typedef enum{ AGS_APPLICATION_CONTEXT_ADDED_TO_REGISTRY = 1, AGS_APPLICATION_CONTEXT_CONNECTED = 1 << 1, AGS_APPLICATION_CONTEXT_TYPES_REGISTERED = 1 << 2, }AgsApplicationContextFlags; struct _AgsApplicationContext { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; gchar *version; gchar *build_id; int argc; char **argv; GObject *log; gchar *domain; AgsConfig *config; GObject *main_loop; GObject *task_launcher; GObject *file; GObject *history; }; struct _AgsApplicationContextClass { GObjectClass gobject; void (*load_config)(AgsApplicationContext *application_context); void (*prepare)(AgsApplicationContext *application_context); void (*setup)(AgsApplicationContext *application_context); void (*register_types)(AgsApplicationContext *application_context); void (*read)(GObject *file, xmlNodePtr node, GObject **gobject); xmlNodePtr (*write)(GObject *file, xmlNodePtr parent, GObject *gobject); void (*quit)(AgsApplicationContext *application_context); }; GType ags_application_context_get_type(); gboolean ags_application_context_test_flags(AgsApplicationContext *application_context, guint flags); void ags_application_context_set_flags(AgsApplicationContext *application_context, guint flags); void ags_application_context_unset_flags(AgsApplicationContext *application_context, guint flags); void ags_application_context_load_config(AgsApplicationContext *application_context); void ags_application_context_prepare(AgsApplicationContext *application_context); void ags_application_context_setup(AgsApplicationContext *application_context); void ags_application_context_register_types(AgsApplicationContext *application_context); void ags_application_context_quit(AgsApplicationContext *application_context); AgsApplicationContext* ags_application_context_get_instance(); AgsApplicationContext* ags_application_context_new(GObject *main_loop, AgsConfig *config); G_END_DECLS #endif /*__AGS_APPLICATION_CONTEXT_H__*/ gsequencer-3.1.3/ags/object/ags_mutable.c0000644000175000017500000000434413607210263015254 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_mutable_base_init(AgsMutableInterface *ginterface); /** * SECTION:ags_mutable * @short_description: unique access to recalls * @title: AgsMutable * @section_id: AgsMutable * @include: ags/object/ags_mutable.h * * The #AgsMutable interface gives you a unique access to mutable classes Its * purpose is to set muted. */ GType ags_mutable_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_mutable = 0; static const GTypeInfo ags_mutable_info = { sizeof(AgsMutableInterface), (GBaseInitFunc) ags_mutable_base_init, NULL, /* base_finalize */ }; ags_type_mutable = g_type_register_static(G_TYPE_INTERFACE, "AgsMutable", &ags_mutable_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_mutable); } return g_define_type_id__volatile; } void ags_mutable_base_init(AgsMutableInterface *ginterface) { /* empty */ } /** * ags_mutable_set_muted: * @mutable: an #AgsMutable * @muted: if %TRUE then muted, else playing * * Mute a class instance. * * Since: 3.0.0 */ void ags_mutable_set_muted(AgsMutable *mutable, gboolean muted) { AgsMutableInterface *mutable_interface; g_return_if_fail(AGS_IS_MUTABLE(mutable)); mutable_interface = AGS_MUTABLE_GET_INTERFACE(mutable); g_return_if_fail(mutable_interface->set_muted); mutable_interface->set_muted(mutable, muted); } gsequencer-3.1.3/ags/object/ags_tactable.c0000644000175000017500000002405013607210263015376 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_tactable_class_init(AgsTactableInterface *ginterface); /** * SECTION:ags_tactable * @short_description: Unique tempo set or attributes access * @title: AgsTactable * @section_id: AgsTactable * @include: ags/object/ags_tactable.h * * The #AgsTactable interface gives you a unique access to modify tempo. */ enum { CHANGE_SEQUENCER_DURATION, CHANGE_NOTATION_DURATION, CHANGE_WAVE_DURATION, CHANGE_MIDI_DURATION, CHANGE_TACT, CHANGE_BPM, LAST_SIGNAL, }; static guint tactable_signals[LAST_SIGNAL]; GType ags_tactable_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_tactable = 0; ags_type_tactable = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsTactable", sizeof (AgsTactableInterface), (GClassInitFunc) ags_tactable_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_tactable); } return g_define_type_id__volatile; } void ags_tactable_class_init(AgsTactableInterface *ginterface) { /** * AgsTactable::change-sequencer-duration: * @tactable: the #AgsTactable object * @sequencer_duration: new duration * * The ::change-sequencer-duration signal notifies about changed duration * of sequencer. * * Since: 3.0.0 */ tactable_signals[CHANGE_SEQUENCER_DURATION] = g_signal_new("change-sequencer-duration", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTactableInterface, change_sequencer_duration), NULL, NULL, ags_cclosure_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); /** * AgsTactable::change-notation-duration: * @tactable: the #AgsTactable object * @notation_duration: new duration * * The ::change-notation-duration signal notifies about changed duration * of notation. * * Since: 3.0.0 */ tactable_signals[CHANGE_NOTATION_DURATION] = g_signal_new("change-notation-duration", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTactableInterface, change_notation_duration), NULL, NULL, ags_cclosure_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); /** * AgsTactable::change-wave-duration: * @tactable: the #AgsTactable object * @wave_duration: new duration * * The ::change-wave-duration signal notifies about changed duration * of wave. * * Since: 3.0.0 */ tactable_signals[CHANGE_WAVE_DURATION] = g_signal_new("change-wave-duration", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTactableInterface, change_wave_duration), NULL, NULL, ags_cclosure_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); /** * AgsTactable::change-midi-duration: * @tactable: the #AgsTactable object * @midi_duration: new duration * * The ::change-midi-duration signal notifies about changed duration * of midi. * * Since: 3.0.0 */ tactable_signals[CHANGE_MIDI_DURATION] = g_signal_new("change-midi-duration", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTactableInterface, change_midi_duration), NULL, NULL, ags_cclosure_marshal_VOID__UINT64, G_TYPE_NONE, 1, G_TYPE_UINT64); /** * AgsTactable::change-tact * @tactable: the #AgsTactable object * @new_tact: new tact * @old_tact: old tact * * The ::change-tact signal notifies about changed tact. * * Since: 3.0.0 */ tactable_signals[CHANGE_TACT] = g_signal_new("change-tact", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTactableInterface, change_tact), NULL, NULL, ags_cclosure_marshal_VOID__DOUBLE_DOUBLE, G_TYPE_NONE, 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE); /** * AgsTactable::change-bpm: * @tactable: the #AgsTactable object * @new_bpm: new BPM * @old_bpm: old BPM * * The ::change-bpm signal notifies about changed bpm. * * Since: 3.0.0 */ tactable_signals[CHANGE_BPM] = g_signal_new("change-bpm", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsTactableInterface, change_bpm), NULL, NULL, ags_cclosure_marshal_VOID__DOUBLE_DOUBLE, G_TYPE_NONE, 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE); } /** * ags_tactable_get_sequencer_duration: * @tactable: the #AgsTactable * * Get sequencer duration. * * Returns: the sequencer duration * * Since: 3.0.0 */ guint64 ags_tactable_get_sequencer_duration(AgsTactable *tactable) { AgsTactableInterface *tactable_interface; g_return_val_if_fail(AGS_IS_TACTABLE(tactable), 0); tactable_interface = AGS_TACTABLE_GET_INTERFACE(tactable); g_return_val_if_fail(tactable_interface->get_sequencer_duration, 0); return(tactable_interface->get_sequencer_duration(tactable)); } /** * ags_tactable_get_notation_duration: * @tactable: the #AgsTactable * * Get notation duration. * * Returns: the notation duration * * Since: 3.0.0 */ guint64 ags_tactable_get_notation_duration(AgsTactable *tactable) { AgsTactableInterface *tactable_interface; g_return_val_if_fail(AGS_IS_TACTABLE(tactable), 0); tactable_interface = AGS_TACTABLE_GET_INTERFACE(tactable); g_return_val_if_fail(tactable_interface->get_notation_duration, 0); return(tactable_interface->get_notation_duration(tactable)); } /** * ags_tactable_get_wave_duration: * @tactable: the #AgsTactable * * Get wave duration. * * Returns: the wave duration * * Since: 3.0.0 */ guint64 ags_tactable_get_wave_duration(AgsTactable *tactable) { AgsTactableInterface *tactable_interface; g_return_val_if_fail(AGS_IS_TACTABLE(tactable), 0); tactable_interface = AGS_TACTABLE_GET_INTERFACE(tactable); g_return_val_if_fail(tactable_interface->get_wave_duration, 0); return(tactable_interface->get_wave_duration(tactable)); } /** * ags_tactable_get_midi_duration: * @tactable: the #AgsTactable * * Get midi duration. * * Returns: the midi duration * * Since: 3.0.0 */ guint64 ags_tactable_get_midi_duration(AgsTactable *tactable) { AgsTactableInterface *tactable_interface; g_return_val_if_fail(AGS_IS_TACTABLE(tactable), 0); tactable_interface = AGS_TACTABLE_GET_INTERFACE(tactable); g_return_val_if_fail(tactable_interface->get_midi_duration, 0); return(tactable_interface->get_midi_duration(tactable)); } /** * ags_tactable_get_bpm: * @tactable: the #AgsTactable * * Get bpm. * * Returns: the bpm * * Since: 3.0.0 */ gdouble ags_tactable_get_bpm(AgsTactable *tactable) { AgsTactableInterface *tactable_interface; g_return_val_if_fail(AGS_IS_TACTABLE(tactable), -1.0); tactable_interface = AGS_TACTABLE_GET_INTERFACE(tactable); g_return_val_if_fail(tactable_interface->get_bpm, -1.0); return(tactable_interface->get_bpm(tactable)); } /** * ags_tactable_get_tact: * @tactable: the #AgsTactable * * Get tact. * * Returns: the tact * * Since: 3.0.0 */ gdouble ags_tactable_get_tact(AgsTactable *tactable) { AgsTactableInterface *tactable_interface; g_return_val_if_fail(AGS_IS_TACTABLE(tactable), -1.0); tactable_interface = AGS_TACTABLE_GET_INTERFACE(tactable); g_return_val_if_fail(tactable_interface->get_tact, -1.0); return(tactable_interface->get_tact(tactable)); } /** * ags_tactable_change_sequencer_duration: * @tactable: the #AgsTactable * @sequencer_duration: the duration * * Change sequencer duration. * * Since: 3.0.0 */ void ags_tactable_change_sequencer_duration(AgsTactable *tactable, guint64 sequencer_duration) { g_signal_emit(tactable, tactable_signals[CHANGE_SEQUENCER_DURATION], 0, sequencer_duration); } /** * ags_tactable_change_notation_duration: * @tactable: the #AgsTactable * @notation_duration: the duration * * Change notation duration. * * Since: 3.0.0 */ void ags_tactable_change_notation_duration(AgsTactable *tactable, guint64 notation_duration) { g_signal_emit(tactable, tactable_signals[CHANGE_NOTATION_DURATION], 0, notation_duration); } /** * ags_tactable_change_wave_duration: * @tactable: the #AgsTactable * @wave_duration: the duration * * Change wave duration. * * Since: 3.0.0 */ void ags_tactable_change_wave_duration(AgsTactable *tactable, guint64 wave_duration) { g_signal_emit(tactable, tactable_signals[CHANGE_WAVE_DURATION], 0, wave_duration); } /** * ags_tactable_change_midi_duration: * @tactable: the #AgsTactable * @midi_duration: the duration * * Change midi duration. * * Since: 3.0.0 */ void ags_tactable_change_midi_duration(AgsTactable *tactable, guint64 midi_duration) { g_signal_emit(tactable, tactable_signals[CHANGE_MIDI_DURATION], 0, midi_duration); } /** * ags_tactable_change_tact: * @tactable: the #AgsTactable * @new_tact: the new tact * @old_tact: the old tact * * Change tact. * * Since: 3.0.0 */ void ags_tactable_change_tact(AgsTactable *tactable, gdouble new_tact, gdouble old_tact) { g_signal_emit(tactable, tactable_signals[CHANGE_TACT], 0, new_tact, old_tact); } /** * ags_tactable_change_bpm: * @tactable: the #AgsTactable * @new_bpm: the new bpm * @old_bpm: the old bpm * * Change bpm. * * Since: 3.0.0 */ void ags_tactable_change_bpm(AgsTactable *tactable, gdouble new_bpm, gdouble old_bpm) { g_signal_emit(tactable, tactable_signals[CHANGE_BPM], 0, new_bpm, old_bpm); } gsequencer-3.1.3/ags/object/ags_seekable.c0000644000175000017500000000543513607210263015400 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_seekable_class_init(AgsSeekableInterface *ginterface); /** * SECTION:ags_seekable * @short_description: unique access to seekable classes * @title: AgsSeekable * @section_id: AgsSeekable * @include: ags/object/ags_seekable.h * * The #AgsSeekable interface gives you the #AgsSeekable::seek() signal * what notifies about changed offset of pattern or notation. */ enum { SEEK, LAST_SIGNAL, }; static guint seekable_signals[LAST_SIGNAL]; GType ags_seekable_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_seekable = 0; ags_type_seekable = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsSeekable", sizeof (AgsSeekableInterface), (GClassInitFunc) ags_seekable_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_seekable); } return g_define_type_id__volatile; } void ags_seekable_class_init(AgsSeekableInterface *ginterface) { /** * AgsSeekable::seek: * @seekable: the #GObject sub-type implementing #AgsSeekable * @offset: the offset * @whence: the direction, see #AgsSeekType-enum * * The ::seek signal notifies about changed position * of sequencer. * * Since: 3.0.0 */ seekable_signals[SEEK] = g_signal_new("seek", G_TYPE_FROM_INTERFACE(ginterface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsSeekableInterface, seek), NULL, NULL, ags_cclosure_marshal_VOID__INT64_UINT, G_TYPE_NONE, 2, G_TYPE_INT64, G_TYPE_UINT); } void ags_seekable_base_init(AgsSeekableInterface *ginterface) { /* empty */ } /** * ags_seekable_seek: * @seekable: the #AgsSeekable interface * @offset: the offset * @whence: the direction, see #AgsSeekType-enum * * Seek. * * Since: 3.0.0 */ void ags_seekable_seek(AgsSeekable *seekable, gint64 offset, guint whence) { g_signal_emit(seekable, seekable_signals[SEEK], 0, offset, whence); } gsequencer-3.1.3/ags/object/ags_config.c0000644000175000017500000005225313610734477015106 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #ifndef AGS_W32API #include #endif #include #include void ags_config_class_init(AgsConfigClass *config_class); void ags_config_init(AgsConfig *config); void ags_config_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_config_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_config_dispose(GObject *gobject); void ags_config_finalize(GObject *gobject); gchar* ags_config_get_version(AgsConfig *config); void ags_config_set_version(AgsConfig *config, gchar *version); gchar* ags_config_get_build_id(AgsConfig *config); void ags_config_set_build_id(AgsConfig *config, gchar *build_id); void ags_config_real_load_defaults(AgsConfig *config); void ags_config_real_set_value(AgsConfig *config, gchar *group, gchar *key, gchar *value); gchar* ags_config_real_get_value(AgsConfig *config, gchar *group, gchar *key); /** * SECTION:ags_config * @short_description: Config Advanced Gtk+ Sequencer * @title: AgsConfig * @section_id: * @include: ags/object/ags_config.h * * #AgsConfig provides configuration to Advanced Gtk+ Sequencer. */ enum{ LOAD_DEFAULTS, SET_VALUE, GET_VALUE, LAST_SIGNAL, }; enum{ PROP_0, }; static gpointer ags_config_parent_class = NULL; static guint config_signals[LAST_SIGNAL]; AgsConfig *ags_config = NULL; GType ags_config_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_config = 0; static const GTypeInfo ags_config_info = { sizeof (AgsConfigClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_config_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsConfig), 0, /* n_preallocs */ (GInstanceInitFunc) ags_config_init, }; ags_type_config = g_type_register_static(G_TYPE_OBJECT, "AgsConfig", &ags_config_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_config); } return g_define_type_id__volatile; } void ags_config_class_init(AgsConfigClass *config) { GObjectClass *gobject; GParamSpec *param_spec; ags_config_parent_class = g_type_class_peek_parent(config); /* GObjectClass */ gobject = (GObjectClass *) config; gobject->set_property = ags_config_set_property; gobject->get_property = ags_config_get_property; gobject->dispose = ags_config_dispose; gobject->finalize = ags_config_finalize; /* properties */ /* AgsConfigClass */ config->load_defaults = ags_config_real_load_defaults; config->set_value = ags_config_real_set_value; config->get_value = ags_config_real_get_value; /* signals */ /** * AgsConfig::load-defaults: * @config: the object to resolve * * The ::load-defaults signal notifies about loading defaults * * Since: 3.0.0 */ config_signals[LOAD_DEFAULTS] = g_signal_new("load-defaults", G_TYPE_FROM_CLASS (config), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsConfigClass, load_defaults), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsConfig::set-value: * @config: the object to resolve * @group: the group to apply to * @key: the key to set * @value: the value to apply * * The ::set-value signal notifies about value been setting. * * Since: 3.0.0 */ config_signals[SET_VALUE] = g_signal_new("set-value", G_TYPE_FROM_CLASS (config), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsConfigClass, set_value), NULL, NULL, ags_cclosure_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); /** * AgsConfig::get-value: * @config: the object to resolve * @group: the group to retrieve from * @key: the key to get * * The ::get-value signal notifies about value been getting. * * Returns: the value * * Since: 3.0.0 */ config_signals[GET_VALUE] = g_signal_new("get-value", G_TYPE_FROM_CLASS (config), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (AgsConfigClass, get_value), NULL, NULL, ags_cclosure_marshal_STRING__STRING_STRING, G_TYPE_STRING, 2, G_TYPE_STRING, G_TYPE_STRING); } void ags_config_init(AgsConfig *config) { config->flags = 0; g_rec_mutex_init(&(config->obj_mutex)); /* version and build id */ config->version = g_strdup(AGS_CONFIG_DEFAULT_VERSION); config->build_id = g_strdup(AGS_CONFIG_DEFAULT_BUILD_ID); config->key_file = g_key_file_new(); g_key_file_ref(config->key_file); } void ags_config_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsConfig *config; GRecMutex *config_mutex; config = AGS_CONFIG(gobject); /* get config mutex */ config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_config_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsConfig *config; GRecMutex *config_mutex; config = AGS_CONFIG(gobject); /* get config mutex */ config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_config_dispose(GObject *gobject) { AgsConfig *config; config = (AgsConfig *) gobject; /* call parent */ G_OBJECT_CLASS(ags_config_parent_class)->dispose(gobject); } void ags_config_finalize(GObject *gobject) { AgsConfig *config; config = (AgsConfig *) gobject; g_free(config->version); g_free(config->build_id); /* key file */ if(config->key_file != NULL){ g_key_file_unref(config->key_file); } /* global variable */ if(ags_config == config){ ags_config = NULL; } /* call parent */ G_OBJECT_CLASS(ags_config_parent_class)->finalize(gobject); } gchar* ags_config_get_version(AgsConfig *config) { gchar *version; GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return(NULL); } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* get version */ g_rec_mutex_lock(config_mutex); version = config->version; g_rec_mutex_unlock(config_mutex); return(version); } void ags_config_set_version(AgsConfig *config, gchar *version) { GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* set version */ g_rec_mutex_lock(config_mutex); config->version = g_strdup(version); g_rec_mutex_unlock(config_mutex); } gchar* ags_config_get_build_id(AgsConfig *config) { gchar *build_id; GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return(NULL); } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* get build id */ g_rec_mutex_lock(config_mutex); build_id = config->build_id; g_rec_mutex_unlock(config_mutex); return(build_id); } void ags_config_set_build_id(AgsConfig *config, gchar *build_id) { GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* set version */ g_rec_mutex_lock(config_mutex); config->build_id = g_strdup(build_id); g_rec_mutex_unlock(config_mutex); } void ags_config_real_load_defaults(AgsConfig *config) { GRecMutex *config_mutex; config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* load defaults */ g_rec_mutex_lock(config_mutex); ags_config_set_value(config, AGS_CONFIG_GENERIC, "autosave-thread", "false"); ags_config_set_value(config, AGS_CONFIG_GENERIC, "simple-file", "true"); ags_config_set_value(config, AGS_CONFIG_GENERIC, "disable-feature", "experimental"); ags_config_set_value(config, AGS_CONFIG_GENERIC, "engine-mode", "performance"); ags_config_set_value(config, AGS_CONFIG_GENERIC, "gui-scale", "1.0"); ags_config_set_value(config, AGS_CONFIG_THREAD, "model", "super-threaded"); ags_config_set_value(config, AGS_CONFIG_THREAD, "super-threaded-scope", "audio"); ags_config_set_value(config, AGS_CONFIG_THREAD, "lock-global", "ags-thread"); ags_config_set_value(config, AGS_CONFIG_THREAD, "lock-parent", "ags-recycling-thread"); ags_config_set_value(config, AGS_CONFIG_THREAD, "max-precision", "250"); #if defined(AGS_WITH_WASAPI) ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "backend", "wasapi"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "device", NULL); #elif defined(AGS_WITH_CORE_AUDIO) ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "backend", "core-audio"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "device", "ags-core-audio-devout-0"); #elif defined(AGS_WITH_PULSE) ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "backend", "pulse"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "device", "ags-pulse-devout-0"); #elif defined(AGS_WITH_ALSA) ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "backend", "alsa"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "device", "default"); #elif defined(AGS_WITH_OSS) ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "backend", "oss"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "device", "/dev/dsp"); #endif #if defined(AGS_WITH_WASAPI) ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "pcm-channels", "2"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "samplerate", "44100"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "buffer-size", "512"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "use-cache", "false"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "cache-buffer-size", "4096"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "format", "16"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "wasapi-buffer-size", "2048"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "wasapi-share-mode", "exclusive"); #else ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "pcm-channels", "2"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "samplerate", "48000"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "buffer-size", "512"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "use-cache", "true"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "cache-buffer-size", "4096"); ags_config_set_value(config, AGS_CONFIG_SOUNDCARD_0, "format", "16"); #endif //ags_config_set_value(config, AGS_CONFIG_SEQUENCER_0, "backend", "jack"); //ags_config_set_value(config, AGS_CONFIG_SEQUENCER_0, "device", "ags-jack-midiin-0"); ags_config_set_value(config, AGS_CONFIG_RECALL, "auto-sense", "true"); g_rec_mutex_unlock(config_mutex); } /** * ags_config_load_defaults: * @config: the #AgsConfig * * Load configuration from default values. * * Since: 3.0.0 */ void ags_config_load_defaults(AgsConfig *config) { g_return_if_fail(AGS_IS_CONFIG(config)); g_object_ref(G_OBJECT(config)); g_signal_emit(G_OBJECT(config), config_signals[LOAD_DEFAULTS], 0); g_object_unref(G_OBJECT(config)); } /** * ags_config_load_from_file: * @config: the #AgsConfig * @filename: the configuration file * * Load configuration from @filename. * * Since: 3.0.0 */ void ags_config_load_from_file(AgsConfig *config, gchar *filename) { GFile *file; GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); file = g_file_new_for_path(filename); g_message("loading preferences for: %s", filename); if(!g_file_query_exists(file, NULL)){ ags_config_load_defaults(config); }else{ GKeyFile *key_file; gchar **groups, **groups_start; gchar **keys, **keys_start; gchar *value; GError *error; g_rec_mutex_lock(config_mutex); error = NULL; key_file = g_key_file_new(); g_key_file_load_from_file(key_file, filename, G_KEY_FILE_NONE, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } groups = groups_start = g_key_file_get_groups(key_file, NULL); while(*groups != NULL){ keys = keys_start = g_key_file_get_keys(key_file, *groups, NULL, NULL); while(*keys != NULL){ value = g_key_file_get_value(key_file, *groups, *keys, NULL); ags_config_set_value(config, *groups, *keys, value); keys++; } g_strfreev(keys_start); groups++; } g_strfreev(groups_start); g_key_file_unref(key_file); g_rec_mutex_unlock(config_mutex); } g_object_unref(file); } /** * ags_config_load_from_data: * @config: the #AgsConfig * @buffer: the data buffer * @buffer_length: the size of the buffer * * Read configuration in memory. * * Since: 3.0.0 */ void ags_config_load_from_data(AgsConfig *config, char *buffer, gsize buffer_length) { GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* load from data */ //#ifdef AGS_DEBUG g_message("loading preferences from data[0x%x]", (unsigned int) buffer); //#endif if(buffer == NULL){ ags_config_load_defaults(config); }else{ GKeyFile *key_file; gchar **groups, **groups_start; gchar **keys, **keys_start; gchar *value; GError *error; g_rec_mutex_lock(config_mutex); error = NULL; key_file = g_key_file_new(); g_key_file_load_from_data(key_file, buffer, buffer_length, G_KEY_FILE_NONE, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } groups = groups_start = g_key_file_get_groups(key_file, NULL); while(*groups != NULL){ keys = keys_start = g_key_file_get_keys(key_file, *groups, NULL, NULL); while(*keys != NULL){ value = g_key_file_get_value(key_file, *groups, *keys, NULL); ags_config_set_value(config, *groups, *keys, value); keys++; } g_strfreev(keys_start); groups++; } g_strfreev(groups_start); g_key_file_unref(key_file); g_rec_mutex_unlock(config_mutex); } } /** * ags_config_to_data: * @config: the #AgsConfig * @buffer: the data buffer * @buffer_length: the size of the buffer * * Save configuration. * * Since: 3.0.0 */ void ags_config_to_data(AgsConfig *config, char **buffer, gsize *buffer_length) { gchar *data; gsize length; GError *error; GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* to data */ g_rec_mutex_lock(config_mutex); error = NULL; data = g_key_file_to_data(config->key_file, &length, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(buffer != NULL){ *buffer = data; } if(buffer_length != NULL){ *buffer_length = length; } g_rec_mutex_unlock(config_mutex); } /** * ags_config_save: * @config: the #AgsConfig * * Save configuration. * * Since: 3.0.0 */ void ags_config_save(AgsConfig *config) { #ifdef AGS_W32API AgsApplicationContext *application_context; #else struct passwd *pw; uid_t uid; #endif gchar *path, *filename; gchar *content; #if defined(AGS_W32API) gchar *app_dir; #endif gsize length; GError *error; GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* save */ g_rec_mutex_lock(config_mutex); /* open conf dir */ #ifdef AGS_W32API app_dir = NULL; application_context = ags_application_context_get_instance(); if(strlen(application_context->argv[0]) > strlen("\\gsequencer.exe")){ app_dir = g_strndup(application_context->argv[0], strlen(application_context->argv[0]) - strlen("\\gsequencer.exe")); } path = g_strdup_printf("%s\\etc\\gsequencer", g_get_current_dir()); if(!g_file_test(path, G_FILE_TEST_IS_DIR)){ g_free(path); if(g_path_is_absolute(app_dir)){ path = g_strdup_printf("%s\\%s", app_dir, "\\etc\\gsequencer"); }else{ path = g_strdup_printf("%s\\%s\\%s", g_get_current_dir(), app_dir, "\\etc\\gsequencer"); } } g_free(app_dir); filename = g_strdup_printf("%s\\%s", path, AGS_DEFAULT_CONFIG); #else uid = getuid(); pw = getpwuid(uid); path = g_strdup_printf("%s/%s", pw->pw_dir, AGS_DEFAULT_DIRECTORY); filename = g_strdup_printf("%s/%s", path, AGS_DEFAULT_CONFIG); #endif if(!g_mkdir_with_parents(path, 0755)){ /* get content */ error = NULL; content = g_key_file_to_data(config->key_file, &length, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); //TODO:JK: do recovery goto ags_config_save_END; } /* write content */ error = NULL; g_file_set_contents(filename, content, length, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } ags_config_save_END: g_free(filename); g_free(path); g_rec_mutex_unlock(config_mutex); } void ags_config_real_set_value(AgsConfig *config, gchar *group, gchar *key, gchar *value) { GRecMutex *config_mutex; config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* set value */ g_rec_mutex_lock(config_mutex); g_key_file_set_value(config->key_file, group, key, value); g_rec_mutex_unlock(config_mutex); } /** * ags_config_set_value: * @config: the #AgsConfig * @group: the config group identifier * @key: the key of the property * @value: the value to set * * Set config by @group and @key, applying @value. * * Since: 3.0.0 */ void ags_config_set_value(AgsConfig *config, gchar *group, gchar *key, gchar *value) { g_return_if_fail(AGS_IS_CONFIG(config)); g_object_ref(G_OBJECT(config)); g_signal_emit(G_OBJECT(config), config_signals[SET_VALUE], 0, group, key, value); g_object_unref(G_OBJECT(config)); } gchar* ags_config_real_get_value(AgsConfig *config, gchar *group, gchar *key) { gchar *str; GError *error; GRecMutex *config_mutex; config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* get value */ g_rec_mutex_lock(config_mutex); error = NULL; str = g_key_file_get_value(config->key_file, group, key, &error); if(error != NULL){ // g_warning("%s", error->message); g_error_free(error); } g_rec_mutex_unlock(config_mutex); return(str); } /** * ags_config_get_value: * @config: the #AgsConfig * @group: the config group identifier * @key: the key of the property * * Retrieve config by @group and @key. * * Returns: (transfer full): the property's value * * Since: 3.0.0 */ gchar* ags_config_get_value(AgsConfig *config, gchar *group, gchar *key) { gchar *value; g_return_val_if_fail(AGS_IS_CONFIG(config), NULL); g_object_ref(G_OBJECT(config)); g_signal_emit(G_OBJECT(config), config_signals[GET_VALUE], 0, group, key, &value); g_object_unref(G_OBJECT(config)); return(value); } /** * ags_config_clear: * @config: the #AgsConfig * * Clears configuration. * * Since: 3.0.0 */ void ags_config_clear(AgsConfig *config) { gchar **group; gsize n_group; guint i; GRecMutex *config_mutex; if(!AGS_IS_CONFIG(config)){ return; } config_mutex = AGS_CONFIG_GET_OBJ_MUTEX(config); /* clear */ g_rec_mutex_lock(config_mutex); group = g_key_file_get_groups(config->key_file, &n_group); for(i = 0; i < n_group; i++){ g_key_file_remove_group(config->key_file, group[i], NULL); } g_rec_mutex_unlock(config_mutex); } /** * ags_config_get_instance: * * Get config instance. * * Returns: (transfer none): the config instance * * Since: 3.0.0 */ AgsConfig* ags_config_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_config == NULL){ ags_config = ags_config_new(); } g_mutex_unlock(&mutex); return(ags_config); } /** * ags_config_new: * * Create a new instance of #AgsConfig. * * Returns: the new #AgsConfig. * * Since: 3.0.0 */ AgsConfig* ags_config_new() { AgsConfig *config; config = (AgsConfig *) g_object_new(AGS_TYPE_CONFIG, NULL); return(config); } gsequencer-3.1.3/ags/object/ags_cursor.c0000644000175000017500000001644113607210263015141 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_cursor_class_init(AgsCursorInterface *ginterface); /** * SECTION:ags_cursor * @short_description: unique access to cursor classes * @title: AgsCursor * @section_id: AgsCursor * @include: ags/object/ags_cursor.h * * The #AgsCursor interface does cursor position abstraction. */ GType ags_cursor_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_cursor = 0; ags_type_cursor = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsCursor", sizeof (AgsCursorInterface), (GClassInitFunc) ags_cursor_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_cursor); } return g_define_type_id__volatile; } void ags_cursor_class_init(AgsCursorInterface *ginterface) { /* empty */ } void ags_cursor_base_init(AgsCursorInterface *ginterface) { /* empty */ } /** * ags_cursor_get_default_offset: * @cursor: the #AgsCursor interface * * Get the default offset. * * Returns: the default offset * * Since: 3.0.0 */ gdouble ags_cursor_get_default_offset(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0.0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_default_offset, 0.0); return(cursor_interface->get_default_offset(cursor)); } /** * ags_cursor_get_tact: * @cursor: the #AgsCursor interface * * Get the tact. * * Returns: the tact * * Since: 3.0.0 */ gdouble ags_cursor_get_tact(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0.0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_tact, 0.0); return(cursor_interface->get_tact(cursor)); } /** * ags_cursor_get_bpm: * @cursor: the #AgsCursor interface * * Get BPM. * * Returns: the BPM * * Since: 3.0.0 */ gdouble ags_cursor_get_bpm(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0.0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_bpm, 0.0); return(cursor_interface->get_bpm(cursor)); } /** * ags_cursor_get_rate: * @cursor: the #AgsCursor interface * * Get offset counter rate. * * Returns: * * Since: 3.0.0 */ guint ags_cursor_get_rate(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_rate, 0); return(cursor_interface->get_rate(cursor)); } /** * ags_cursor_get_delay: * @cursor: the #AgsCursor interface * * Get delay. * * Returns: the delay * * Since: 3.0.0 */ gdouble ags_cursor_get_delay(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0.0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_delay, 0.0); return(cursor_interface->get_delay(cursor)); } /** * ags_cursor_get_duration: * @cursor: the #AgsCursor interface * * Get duration. * * Returns: the duration * * Since: 3.0.0 */ guint64 ags_cursor_get_duration(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_duration, 0); return(cursor_interface->get_duration(cursor)); } /** * ags_cursor_get_delay_counter: * @cursor: the #AgsCursor interface * * Get delay counter. * * Returns: the delay counter * * Since: 3.0.0 */ gdouble ags_cursor_get_delay_counter(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0.0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_delay_counter, 0.0); return(cursor_interface->get_delay_counter(cursor)); } /** * ags_cursor_get_offset: * @cursor: the #AgsCursor interface * * Get offset. * * Returns: the offset * * Since: 3.0.0 */ guint64 ags_cursor_get_offset(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), 0); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_offset, 0); return(cursor_interface->get_offset(cursor)); } /** * ags_cursor_get_prev: * @cursor: the #AgsCursor interface * * Get prev. * * Returns: (element-type GObject) (transfer full): the #GList-struct pointing to previous * * Since: 3.0.0 */ GList* ags_cursor_get_prev(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), NULL); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_prev, NULL); return(cursor_interface->get_prev(cursor)); } /** * ags_cursor_get_next: * @cursor: the #AgsCursor interface * * Get next. * * Returns: (element-type GObject) (transfer full): the #GList-struct pointing to next * * Since: 3.0.0 */ GList* ags_cursor_get_next(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), NULL); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_next, NULL); return(cursor_interface->get_next(cursor)); } /** * ags_cursor_get_current_copy: * @cursor: the #AgsCursor interface * * Get current as copy. * * Returns: (element-type GObject) (transfer full): the #GList-struct of current as copy * * Since: 3.0.0 */ GList* ags_cursor_get_current_copy(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), NULL); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_current_copy, NULL); return(cursor_interface->get_current_copy(cursor)); } /** * ags_cursor_get_current: * @cursor: the #AgsCursor interface * * Get current. * * Returns: (element-type GObject) (transfer none): the #GList-struct pointing to current * * Since: 3.0.0 */ GList* ags_cursor_get_current(AgsCursor *cursor) { AgsCursorInterface *cursor_interface; g_return_val_if_fail(AGS_IS_CURSOR(cursor), NULL); cursor_interface = AGS_CURSOR_GET_INTERFACE(cursor); g_return_val_if_fail(cursor_interface->get_current, NULL); return(cursor_interface->get_current(cursor)); } gsequencer-3.1.3/ags/object/ags_connectable.c0000644000175000017500000002152613607210263016101 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_connectable_base_init(AgsConnectableInterface *ginterface); /** * SECTION:ags_connectable * @short_description: unique access to objects * @title: AgsConnectable * @section_id: AgsConnectable * @include: ags/object/ags_connectable.h * * The #AgsConnectable interface gives you a unique access to all objects * and is responsible to set up signal handlers. */ GType ags_connectable_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_connectable = 0; static const GTypeInfo ags_connectable_info = { sizeof(AgsConnectableInterface), (GBaseInitFunc) ags_connectable_base_init, NULL, /* base_finalize */ }; ags_type_connectable = g_type_register_static(G_TYPE_INTERFACE, "AgsConnectable", &ags_connectable_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_connectable); } return g_define_type_id__volatile; } void ags_connectable_base_init(AgsConnectableInterface *ginterface) { /* empty */ } /** * ags_connectable_get_uuid: * @connectable: the #AgsConnectable * * Get UUID of @connectable. * * Returns: the assigned #AgsUUID * * Since: 3.0.0 */ AgsUUID* ags_connectable_get_uuid(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), NULL); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_val_if_fail(connectable_interface->get_uuid, NULL); return(connectable_interface->get_uuid(connectable)); } /** * ags_connectable_has_resource: * @connectable: the #AgsConnectable * * Check the connectable to have resources. * * Returns: %TRUE if @connectable can be added to registry, otherwise %FALSE. * * Since: 3.0.0 */ gboolean ags_connectable_has_resource(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), FALSE); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_val_if_fail(connectable_interface->has_resource, FALSE); return(connectable_interface->has_resource(connectable)); } /** * ags_connectable_is_ready: * @connectable: the #AgsConnectable * * Connect the connectable. * * Returns: %TRUE if is added to registry, otherwise %FALSE. * * Since: 3.0.0 */ gboolean ags_connectable_is_ready(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), TRUE); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_val_if_fail(connectable_interface->is_ready, TRUE); return(connectable_interface->is_ready(connectable)); } /** * ags_connectable_add_to_registry: * @connectable: the #AgsConnectable * * Add connectable to registry. * * Since: 3.0.0 */ void ags_connectable_add_to_registry(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->add_to_registry); connectable_interface->add_to_registry(connectable); } /** * ags_connectable_remove_from_registry: * @connectable: the #AgsConnectable * * Remove connectable from registry. * * Since: 3.0.0 */ void ags_connectable_remove_from_registry(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->remove_from_registry); connectable_interface->remove_from_registry(connectable); } /** * ags_connectable_list_resource: * @connectable: the #AgsConnectable * * List resources as an XML element and return it. * * Returns: (transfer none): the #xmlNode-struct * * Since: 3.0.0 */ xmlNode* ags_connectable_list_resource(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), NULL); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_val_if_fail(connectable_interface->list_resource, NULL); return(connectable_interface->list_resource(connectable)); } /** * ags_connectable_xml_compose: * @connectable: the #AgsConnectable * * Compose an XML element and return it. * * Returns: (transfer none): the #xmlNode-struct * * Since: 3.0.0 */ xmlNode* ags_connectable_xml_compose(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), NULL); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_val_if_fail(connectable_interface->xml_compose, NULL); return(connectable_interface->xml_compose(connectable)); } /** * ags_connectable_xml_parse: * @connectable: the #AgsConnectable * @node: (transfer none): the #xmlNode-struct * * Parse @node as XML element and apply it. * * Since: 3.0.0 */ void ags_connectable_xml_parse(AgsConnectable *connectable, xmlNode *node) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->xml_parse); connectable_interface->xml_parse(connectable, node); } /** * ags_connectable_is_connected: * @connectable: the #AgsConnectable * * Check if the @connectable was connected. * * Returns: %TRUE if is connected, otherwise %FALSE. * * Since: 3.0.0 */ gboolean ags_connectable_is_connected(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_val_if_fail(AGS_IS_CONNECTABLE(connectable), FALSE); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_val_if_fail(connectable_interface->is_connected, FALSE); return(connectable_interface->is_connected(connectable)); } /** * ags_connectable_connect: * @connectable: the #AgsConnectable * * Connect the connectable. * * Since: 3.0.0 */ void ags_connectable_connect(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->connect); connectable_interface->connect(connectable); } /** * ags_connectable_disconnect: * @connectable: the #AgsConnectable * * Disconnect the connectable. * * Since: 3.0.0 */ void ags_connectable_disconnect(AgsConnectable *connectable) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->disconnect); connectable_interface->disconnect(connectable); } /** * ags_connectable_connect_connection: * @connectable: the #AgsConnectable * @connection: the connection * * Disconnect the connectable. * * Since: 3.0.0 */ void ags_connectable_connect_connection(AgsConnectable *connectable, GObject *connection) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->connect_connection); connectable_interface->connect_connection(connectable, connection); } /** * ags_connectable_disconnect_connection: * @connectable: the #AgsConnectable * @connection: the connection * * Disconnect the connectable. * * Since: 3.0.0 */ void ags_connectable_disconnect_connection(AgsConnectable *connectable, GObject *connection) { AgsConnectableInterface *connectable_interface; g_return_if_fail(AGS_IS_CONNECTABLE(connectable)); connectable_interface = AGS_CONNECTABLE_GET_INTERFACE(connectable); g_return_if_fail(connectable_interface->disconnect_connection); connectable_interface->disconnect_connection(connectable, connection); } gsequencer-3.1.3/ags/object/ags_priority.h0000644000175000017500000000635413607210263015514 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PRIORITY_H__ #define __AGS_PRIORITY_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_PRIORITY (ags_priority_get_type ()) #define AGS_PRIORITY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PRIORITY, AgsPriority)) #define AGS_PRIORITY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PRIORITY, AgsPriorityClass)) #define AGS_IS_PRIORITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PRIORITY)) #define AGS_IS_PRIORITY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_PRIORITY)) #define AGS_PRIORITY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_PRIORITY, AgsPriorityClass)) #define AGS_PRIORITY_GET_OBJ_MUTEX(obj) (&(((AgsPriority *) obj)->obj_mutex)) #define AGS_PRIORITY_DEFAULT_VERSION "2.4.2" #define AGS_PRIORITY_DEFAULT_BUILD_ID "Mon Dec 2 08:15:02 UTC 2019" #define AGS_PRIORITY_RT_THREAD "rt-thread" #define AGS_PRIORITY_KEY_LIBAGS "libags" #define AGS_PRIORITY_KEY_SERVER_MAIN_LOOP "server-main-loop" #define AGS_PRIORITY_KEY_AUDIO_MAIN_LOOP "audio-main-loop" #define AGS_PRIORITY_KEY_AUDIO "audio" #define AGS_PRIORITY_KEY_OSC_SERVER_MAIN_LOOP "osc-server-main-loop" #define AGS_PRIORITY_KEY_GUI_MAIN_LOOP "gui-main-loop" typedef struct _AgsPriority AgsPriority; typedef struct _AgsPriorityClass AgsPriorityClass; /** * AgsPriorityFlags: * @AGS_PRIORITY_CONNECTED: the priority was connected by calling #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsPriority by * enable/disable as flags. */ typedef enum{ AGS_PRIORITY_CONNECTED = 1, }AgsPriorityFlags; struct _AgsPriority { GObject gobject; guint flags; GRecMutex obj_mutex; gchar *version; gchar *build_id; GKeyFile *key_file; }; struct _AgsPriorityClass { GObjectClass gobject; void (*load_defaults)(AgsPriority *priority); void (*set_value)(AgsPriority *priority, gchar *group, gchar *key, gchar *value); gchar* (*get_value)(AgsPriority *priority, gchar *group, gchar *key); }; GType ags_priority_get_type(); void ags_priority_load_defaults(AgsPriority *priority); void ags_priority_load_from_file(AgsPriority *priority, gchar *filename); void ags_priority_set_value(AgsPriority *priority, gchar *group, gchar *key, gchar *value); gchar* ags_priority_get_value(AgsPriority *priority, gchar *group, gchar *key); AgsPriority* ags_priority_get_instance(); AgsPriority* ags_priority_new(); G_END_DECLS #endif /*__AGS_PRIORITY_H__*/ gsequencer-3.1.3/ags/object/ags_macros.h0000644000175000017500000000353013607210263015110 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MACROS_H__ #define __AGS_MACROS_H__ #include #include G_BEGIN_DECLS #define AGS_DECLARE_INTERFACE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, PrerequisiteName) \ GType module_obj_name##_get_type (void); \ G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ typedef struct _##ModuleObjName ModuleObjName; \ typedef struct _##ModuleObjName##Interface ModuleObjName##Interface; \ \ _GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, PrerequisiteName) \ \ static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \ return G_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); } \ static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \ return G_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); } \ static inline ModuleObjName##Interface * MODULE##_##OBJ_NAME##_GET_INTERFACE (gpointer ptr) { \ return G_TYPE_INSTANCE_GET_INTERFACE (ptr, module_obj_name##_get_type (), ModuleObjName##Interface); } \ G_GNUC_END_IGNORE_DEPRECATIONS G_END_DECLS #endif /*__AGS_MACROS_H__*/ gsequencer-3.1.3/ags/object/ags_mutable.h0000644000175000017500000000350113607210263015253 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_MUTABLE_H__ #define __AGS_MUTABLE_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_MUTABLE (ags_mutable_get_type()) #define AGS_MUTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_MUTABLE, AgsMutable)) #define AGS_MUTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_MUTABLE, AgsMutableInterface)) #define AGS_IS_MUTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_MUTABLE)) #define AGS_IS_MUTABLE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_MUTABLE)) #define AGS_MUTABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_MUTABLE, AgsMutableInterface)) typedef struct _AgsMutable AgsMutable; typedef struct _AgsMutableInterface AgsMutableInterface; struct _AgsMutableInterface { GTypeInterface ginterface; void (*set_muted)(AgsMutable *mutable, gboolean muted); }; GType ags_mutable_get_type(); void ags_mutable_set_muted(AgsMutable *mutable, gboolean muted); G_END_DECLS #endif /*__AGS_MUTABLE_H__*/ gsequencer-3.1.3/ags/object/ags_plugin.h0000644000175000017500000000611613607210263015125 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_H__ #define __AGS_PLUGIN_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLUGIN (ags_plugin_get_type()) #define AGS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLUGIN, AgsPlugin)) #define AGS_PLUGIN_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_PLUGIN, AgsPluginInterface)) #define AGS_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLUGIN)) #define AGS_IS_PLUGIN_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_PLUGIN)) #define AGS_PLUGIN_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_PLUGIN, AgsPluginInterface)) typedef struct _AgsPlugin AgsPlugin; typedef struct _AgsPluginInterface AgsPluginInterface; struct _AgsPluginInterface { GTypeInterface ginterface; gchar* (*get_name)(AgsPlugin *plugin); void (*set_name)(AgsPlugin *plugin, gchar *name); gchar* (*get_version)(AgsPlugin *plugin); void (*set_version)(AgsPlugin *plugin, gchar *version); gchar* (*get_build_id)(AgsPlugin *plugin); void (*set_build_id)(AgsPlugin *plugin, gchar *build_id); gchar* (*get_xml_type)(AgsPlugin *plugin); void (*set_xml_type)(AgsPlugin *plugin, gchar *xml_type); GList* (*get_ports)(AgsPlugin *plugin); void (*set_ports)(AgsPlugin *plugin, GList *ports); void (*read)(GObject *file, xmlNode *node, AgsPlugin *plugin); xmlNode* (*write)(GObject *file, xmlNode *parent, AgsPlugin *plugin); }; GType ags_plugin_get_type(); gchar* ags_plugin_get_name(AgsPlugin *plugin); void ags_plugin_set_name(AgsPlugin *plugin, gchar *name); gchar* ags_plugin_get_version(AgsPlugin *plugin); void ags_plugin_set_version(AgsPlugin *plugin, gchar *version); gchar* ags_plugin_get_build_id(AgsPlugin *plugin); void ags_plugin_set_build_id(AgsPlugin *plugin, gchar *build_id); gchar* ags_plugin_get_xml_type(AgsPlugin *plugin); void ags_plugin_set_xml_type(AgsPlugin *plugin, gchar *xml_type); GList* ags_plugin_get_ports(AgsPlugin *plugin); void ags_plugin_set_ports(AgsPlugin *plugin, GList *ports); void ags_plugin_read(GObject *file, xmlNode *node, AgsPlugin *plugin); xmlNode* ags_plugin_write(GObject *file, xmlNode *parent, AgsPlugin *plugin); G_END_DECLS #endif /*__AGS_PLUGIN_H__*/ gsequencer-3.1.3/ags/object/ags_config.h0000644000175000017500000000617213607210263015076 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONFIG_H__ #define __AGS_CONFIG_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_CONFIG (ags_config_get_type ()) #define AGS_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONFIG, AgsConfig)) #define AGS_CONFIG_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CONFIG, AgsConfigClass)) #define AGS_IS_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CONFIG)) #define AGS_IS_CONFIG_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CONFIG)) #define AGS_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CONFIG, AgsConfigClass)) #define AGS_CONFIG_GET_OBJ_MUTEX(obj) (&(((AgsConfig *) obj)->obj_mutex)) #define AGS_CONFIG_DEFAULT_VERSION "0.7.0" #define AGS_CONFIG_DEFAULT_BUILD_ID "CEST 13-10-2015 01:19" #define AGS_CONFIG_GENERIC "generic" #define AGS_CONFIG_THREAD "thread" #define AGS_CONFIG_SERVER "server" #define AGS_CONFIG_SOUNDCARD "soundcard" #define AGS_CONFIG_SOUNDCARD_0 "soundcard-0" #define AGS_CONFIG_SEQUENCER "sequencer" #define AGS_CONFIG_SEQUENCER_0 "sequencer-0" #define AGS_CONFIG_RECALL "recall" #define AGS_CONFIG_OSC_SERVER "osc-server" #define AGS_CONFIG_OSC_SERVER_0 "osc-server-0" typedef struct _AgsConfig AgsConfig; typedef struct _AgsConfigClass AgsConfigClass; struct _AgsConfig { GObject gobject; guint flags; GRecMutex *obj_mutex; gchar *version; gchar *build_id; GKeyFile *key_file; }; struct _AgsConfigClass { GObjectClass gobject; void (*load_defaults)(AgsConfig *config); void (*set_value)(AgsConfig *config, gchar *group, gchar *key, gchar *value); gchar* (*get_value)(AgsConfig *config, gchar *group, gchar *key); }; GType ags_config_get_type(); void ags_config_load_defaults(AgsConfig *config); void ags_config_load_from_file(AgsConfig *config, gchar *filename); void ags_config_load_from_data(AgsConfig *config, char *buffer, gsize buffer_length); void ags_config_set_value(AgsConfig *config, gchar *group, gchar *key, gchar *value); gchar* ags_config_get_value(AgsConfig *config, gchar *group, gchar *key); void ags_config_to_data(AgsConfig *config, char **buffer, gsize *buffer_length); void ags_config_save(AgsConfig *config); void ags_config_clear(AgsConfig *config); AgsConfig* ags_config_get_instance(); AgsConfig* ags_config_new(); G_END_DECLS #endif /*__AGS_CONFIG_H__*/ gsequencer-3.1.3/ags/util/0000755000175000017500000000000013622252253012411 500000000000000gsequencer-3.1.3/ags/util/ags_soundcard_helper.c0000644000175000017500000001160013607210263016644 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include /** * SECTION:ags_soundcard_helper * @short_description: soundcard helper * @title: AgsSoundcardHelper * @section_id: * @include: ags/util/ags_soundcard_helper.h * * Common helper functions related to #AgsSoundcard. */ /** * ags_soundcard_helper_config_get_dsp_channels: * @config: the #AgsConfig * * Get dsp channels count. * * Returns: the count of dsp channels * * Since: 3.0.0 */ guint ags_soundcard_helper_config_get_dsp_channels(AgsConfig *config) { gchar *str; guint dsp_channels; if(!AGS_IS_CONFIG(config)){ return(AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS); } /* dsp-channels */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "dsp-channels"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "dsp-channels"); } if(str != NULL){ dsp_channels = g_ascii_strtoull(str, NULL, 10); g_free(str); }else{ dsp_channels = AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS; } return(dsp_channels); } /** * ags_soundcard_helper_config_get_pcm_channels: * @config: the #AgsConfig * * Get pcm channels count. * * Returns: the count of pcm channels * * Since: 3.0.0 */ guint ags_soundcard_helper_config_get_pcm_channels(AgsConfig *config) { gchar *str; guint pcm_channels; if(!AGS_IS_CONFIG(config)){ return(AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS); } /* pcm-channels */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "pcm-channels"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "pcm-channels"); } if(str != NULL){ pcm_channels = g_ascii_strtoull(str, NULL, 10); g_free(str); }else{ pcm_channels = AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS; } return(pcm_channels); } /** * ags_soundcard_helper_config_get_samplerate: * @config: the #AgsConfig * * Get samplerate. * * Returns: the samplerate * * Since: 3.0.0 */ gdouble ags_soundcard_helper_config_get_samplerate(AgsConfig *config) { gchar *str; gdouble samplerate; if(!AGS_IS_CONFIG(config)){ return(AGS_SOUNDCARD_DEFAULT_SAMPLERATE); } /* samplerate */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "samplerate"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "samplerate"); } if(str != NULL){ samplerate = g_ascii_strtod(str, NULL); g_free(str); }else{ samplerate = AGS_SOUNDCARD_DEFAULT_SAMPLERATE; } return(samplerate); } /** * ags_soundcard_helper_config_get_buffer_size: * @config: the #AgsConfig * * Get buffer size. * * Returns: the buffer size * * Since: 3.0.0 */ guint ags_soundcard_helper_config_get_buffer_size(AgsConfig *config) { gchar *str; guint buffer_size; if(!AGS_IS_CONFIG(config)){ return(AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE); } /* buffer-size */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "buffer-size"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "buffer-size"); } if(str != NULL){ buffer_size = g_ascii_strtoull(str, NULL, 10); g_free(str); }else{ buffer_size = AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE; } return(buffer_size); } /** * ags_soundcard_helper_config_get_format: * @config: the #AgsConfig * * Get format as #AgsSoundcardFormat-enum. * * Returns: the format * * Since: 3.0.0 */ guint ags_soundcard_helper_config_get_format(AgsConfig *config) { gchar *str; guint format; if(!AGS_IS_CONFIG(config)){ return(AGS_SOUNDCARD_DEFAULT_FORMAT); } /* format */ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD, "format"); if(str == NULL){ str = ags_config_get_value(config, AGS_CONFIG_SOUNDCARD_0, "format"); } if(str != NULL){ format = g_ascii_strtoull(str, NULL, 10); g_free(str); }else{ format = AGS_SOUNDCARD_DEFAULT_FORMAT; } return(format); } gsequencer-3.1.3/ags/util/ags_id_generator.h0000644000175000017500000000172313607210263015777 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_ID_GENERATOR_H__ #define __AGS_ID_GENERATOR_H__ #include #include G_BEGIN_DECLS gchar* ags_id_generator_create_uuid(); G_END_DECLS #endif /*__AGS_ID_GENERATOR_H__*/ gsequencer-3.1.3/ags/util/ags_destroy_util.h0000644000175000017500000000174713607210263016071 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_DESTROY_UTIL_H__ #define __AGS_DESTROY_UTIL_H__ #include #include G_BEGIN_DECLS void ags_destroy_util_dispose_and_unref(GObject *gobject); G_END_DECLS #endif /*__AGS_DESTROY_UTIL_H__*/ gsequencer-3.1.3/ags/util/ags_soundcard_helper.h0000644000175000017500000000247113607210263016657 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SOUNDCARD_HELPER_H__ #define __AGS_SOUNDCARD_HELPER_H__ #include #include #include G_BEGIN_DECLS guint ags_soundcard_helper_config_get_dsp_channels(AgsConfig *config); guint ags_soundcard_helper_config_get_pcm_channels(AgsConfig *config); gdouble ags_soundcard_helper_config_get_samplerate(AgsConfig *config); guint ags_soundcard_helper_config_get_buffer_size(AgsConfig *config); guint ags_soundcard_helper_config_get_format(AgsConfig *config); G_END_DECLS #endif /*__AGS_SOUNDCARD_HELPER_H__*/ gsequencer-3.1.3/ags/util/ags_id_generator.c0000644000175000017500000000345713613101102015764 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include /** * SECTION:ags_id_generator * @short_description: UUID util functions * @title: AgsIdGenerator * @section_id: * @include: ags/util/ags_id_generator.h * * Functions related to UUID. */ #define AGS_ID_GENERATOR_DEFAULT_UUID_LENGTH (36) /** * ags_id_generator_create_uuid: * * Creates a new string containing an UUID. * * Returns: (transfer full): the UUID as string * * Since: 3.0.0 */ gchar* ags_id_generator_create_uuid() { uuid_t out; gchar *uuid_str; /* make sure uuid is really unique */ #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) uuid_generate_time(out); #else //FIXME:JK: uncomment me // while(uuid_generate_time_safe(out) != 0); uuid_generate_time_safe(out); #endif /* create a string representation */ uuid_str = (gchar *) malloc((AGS_ID_GENERATOR_DEFAULT_UUID_LENGTH + 1) * sizeof(gchar)); uuid_unparse(out, uuid_str); uuid_str[AGS_ID_GENERATOR_DEFAULT_UUID_LENGTH] = '\0'; return(uuid_str); } gsequencer-3.1.3/ags/util/ags_list_util.c0000644000175000017500000000277613607210263015351 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include /** * SECTION:ags_list_util * @short_description: list util * @title: AgsListUtil * @section_id: * @include: ags/util/ags_list_util.h * * List utility. */ /** * ags_list_util_find_type: * @list: (transfer none) (element-type GObject): the #GList-struct * @gtype: the #GType to find * * Find @gtype within @list. * * Returns: (transfer none) (element-type GObject): the next matching #GList-struct * * Since: 3.0.0 */ GList* ags_list_util_find_type(GList *list, GType gtype) { if(gtype == G_TYPE_NONE){ return(NULL); } while(list != NULL){ if(g_type_is_a(G_OBJECT_TYPE(G_OBJECT(list->data)), gtype)){ return(list); } list = list->next; } return(NULL); } gsequencer-3.1.3/ags/util/ags_list_util.h0000644000175000017500000000174713607210263015353 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_LIST_UTIL_H__ #define __AGS_LIST_UTIL_H__ #include #include G_BEGIN_DECLS GList* ags_list_util_find_type(GList *list, GType gtype); G_END_DECLS #endif /*__AGS_LIST_UTIL_H__*/ gsequencer-3.1.3/ags/util/ags_destroy_util.c0000644000175000017500000000250713607210263016057 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include /** * SECTION:ags_destroy_util * @short_description: destroy util * @title: AgsDestroyUtil * @section_id: * @include: ags/util/ags_destroy_util.h * * Destroying items utility. */ /** * ags_destroy_util_dispose_and_unref: * @gobject: (transfer full): the #GObject to destroy * * Run dispose and unref @gobject. * * Since: 3.0.0 */ void ags_destroy_util_dispose_and_unref(GObject *gobject) { if(gobject == NULL || !G_IS_OBJECT(gobject)){ return; } g_object_run_dispose(gobject); g_object_unref(gobject); } gsequencer-3.1.3/ags/gettext.h0000644000175000017500000002366413556560220013226 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2016 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # undef gettext # define gettext(Msgid) ((const char *) (Msgid)) # undef dgettext # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # undef dcgettext # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # undef dngettext # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # undef dcngettext # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N)) # undef textdomain # define textdomain(Domainname) ((const char *) (Domainname)) # undef bindtextdomain # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # undef bind_textdomain_codeset # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* Prefer gnulib's setlocale override over libintl's setlocale override. */ #ifdef GNULIB_defined_setlocale # undef setlocale # define setlocale rpl_setlocale #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include #if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \ /* || __STDC_VERSION__ >= 199901L */ ) # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1 #else # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0 #endif #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { int found_translation; memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); found_translation = (translation != msg_ctxt_id); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (found_translation) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { int found_translation; memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); found_translation = !(translation == msg_ctxt_id || translation == msgid_plural); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (found_translation) return translation; } return (n == 1 ? msgid : msgid_plural); } #endif /* _LIBGETTEXT_H */ gsequencer-3.1.3/ags/vst3-capi/0000755000175000017500000000000013622252250013242 500000000000000gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/0000755000175000017500000000000013622252250016255 500000000000000gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/0000755000175000017500000000000013622252256017175 500000000000000gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp0000644000175000017500000000235513521306053024213 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { AgsVstDirection ags_vst_geo_constants_to_oposite(AgsVstDirection dir) { //TODO:JK: implement me } AgsVstOrientation ags_vst_geo_constants_to_orientation(AgsVstDirection dir) { //TODO:JK: implement me } AgsVstOrientation ags_vst_geo_constants_to_orthogonal_orientation(AgsVstOrientation dir) { //TODO:JK: implement me } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp0000644000175000017500000000227613521306053025232 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { AgsVstConstStringTable* ags_vst_const_string_table_new() { //TODO:JK: implement me } gunichar2* get_string_from_char_buffer(gchar *str) { //TODO:JK: implement me } gunichar2 get_string_from_char_byte(gchar str) { //TODO:JK: implement me } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp0000644000175000017500000000733613521306105022655 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { void ags_vst_util_min_int32(gint32 a, gint32 b, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::Min(a, b); } } void ags_vst_util_min_float(gfloat a, gfloat b, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::Min(a, b); } } void ags_vst_util_max_int32(gint32 a, gint32 b, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::Max(a, b); } } void ags_vst_util_max_float(gfloat a, gfloat b, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::Max(a, b); } } void ags_vst_util_abs_int32(gint32 value, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::Abs(value); } } void ags_vst_util_abs_float(gfloat value, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::Abs(value); } } void ags_vst_util_sign_int32(gint32 value, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::Sign(value); } } void ags_vst_util_sign_float(gfloat value, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::Sign(value); } } void ags_vst_util_bound_int32(gint32 minval, gint32 maxval, gint32 x, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::Bound(minval, maxval, x); } } void ags_vst_util_bound_float(gfloat minval, gfloat maxval, gfloat x, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::Bound(minval, maxval, x); } } void ags_vst_util_swap_int32(gint32 *t1, gint32 *t2) { Steinberg::Swap(t1, t2); } void ags_vst_util_swap_float(gfloat *t1, gfloat *t2) { Steinberg::Swap(t1, t2); } gboolean ags_vst_util_is_approximate_equal_int32(gint32 t1, gint32 t2, gint32 epsilon) { return(Steinberg::IsApproximateEqual(t1, t2, epsilon)); } gboolean ags_vst_util_is_approximate_equal_float(gfloat t1, gfloat t2, gfloat epsilon) { return(Steinberg::IsApproximateEqual(t1, t2, epsilon)); } void ags_vst_util_to_normalized_int32(gint32 value, gint32 num_steps, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::ToNormalized(value, num_steps); } } void ags_vst_util_to_normalized_float(gfloat value, gfloat num_steps, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::ToNormalized(value, num_steps); } } void ags_vst_util_from_normalized_int32(gint32 norm, gint32 num_steps, gint32 *retval) { if(retval != NULL){ retval[0] = Steinberg::FromNormalized(norm, num_steps); } } void ags_vst_util_from_normalized_float(gfloat norm, gfloat num_steps, gfloat *retval) { if(retval != NULL){ retval[0] = Steinberg::FromNormalized(norm, num_steps); } } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp0000644000175000017500000000665513521306105023172 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { gint32 ags_vst_tstrlen(ags_vst_tchar *str) { return(tstrlen((tchar *) str)); } gint32 ags_vst_strlen8(gchar *str) { return(strlen8((char8 *) str)); } gint32 ags_vst_strlen16(char16_t *str) { return(strlen16((char16 *) str)); } gint32 ags_vst_tstrcmp(ags_vst_tchar *src, ags_vst_tchar *dst) { return(tstrcmp((tchar *) src, (tchar *) dst)); } gint32 ags_vst_strcmp8(gchar *src, gchar *dst) { return(strcmp8((char8 *) src, (char8 *) dst)); } gint32 ags_vst_strcmp16(char16_t *src, char16_t *dst) { return(strcmp16((char16 *) src, (char16 *) dst)); } gint32 ags_vst_tstrncmp(ags_vst_tchar *first, ags_vst_tchar *last, guint32 count) { return(tstrncmp((tchar *) first, (tchar *) last, count)); } gint32 ags_vst_strncmp8(gchar *first, gchar *last, guint32 count) { return(strncmp8((char8 *) first, (char8 *) last, count)); } gint32 ags_vst_strncmp16(char16_t *first, char16_t *last, guint32 count) { return(strncmp16((char16 *) first, (char16 *) last, count)); } ags_vst_tchar* ags_vst_tstrcpy(ags_vst_tchar *dst, ags_vst_tchar *src) { return(tstrcpy((tchar *) dst, (tchar *) src)); } gchar* ags_vst_strcpy8(gchar *dst, gchar *src) { return(strcpy8((char8 *) dst, (char8 *) src)); } char16_t* ags_vst_strcpy16(char16_t *dst, char16_t *src) { return(strcpy16((char16 *) dst, (char16 *) src)); } ags_vst_tchar* ags_vst_tstrncpy(ags_vst_tchar* dest, ags_vst_tchar* source, guint32 count) { return(tstrncpy((tchar *) dest, (tchar *) source, count)); } gchar* ags_vst_strncpy8(gchar* dest, gchar* source, guint32 count) { return(strncpy8((char8 *) dest, (char8 *) source, count)); } char16_t* ags_vst_strncpy16(char16_t* dest, char16_t* source, guint32 count) { return(strncpy16((char16 *) dest, (char16 *) source, count)); } ags_vst_tchar* ags_vst_tstrcat(ags_vst_tchar *dst, ags_vst_tchar *src) { return(tstrcat((tchar *) dst, (tchar *) src)); } gchar* ags_vst_strcat8(gchar *dst, gchar *src) { return(strcat8((char8 *) dst, (char8 *) src)); } char16_t* ags_vst_strcat16(char16_t *dst, char16_t *src) { return(strcat16((char16 *) dst, (char16 *) src)); } void ags_vst_str8_to_str16(char16_t *dst, gchar *src, gint32 n) { return(str8ToStr16((char16 *) dst, (char8 *) src, (int32) n)); } gboolean ags_vst_fid_strings_equal(AgsVstFIDString id1, AgsVstFIDString id2) { return(FIDStringsEqual((FIDString) id1, (FIDString) id2)); } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp0000644000175000017500000000227013521306105023145 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { AgsVstTUID* ags_vst_ibstream_get_iid() { extern const Steinberg::TUID IBStream__iid; return((AgsVstTUID *) (&IBStream__iid)); } AgsVstTUID* ags_vst_isizeable_stream_get_iid() { extern const Steinberg::TUID ISizeableStream__iid; return((AgsVstTUID *) (&ISizeableStream__iid)); } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp0000644000175000017500000001434213521306053023211 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { gboolean ags_vst_funknown_private_iid_equal(const void* iid1, const void* iid2) { //TODO:JK: implement me } gint32 ags_vst_funknown_private_atomic_add(gint32 *value, gint32 amount) { //TODO:JK: implement me } AgsVstFUID* ags_vst_fuid_new() { return((AgsVstFUID *) new Steinberg::FUID()); } AgsVstFUID* ags_vst_fuid_new_with_iid(guint32 l1, guint32 l2, guint32 l3, guint32 l4) { return((AgsVstFUID *) new Steinberg::FUID(l1, l2, l3, l4)); } AgsVstFUID* ags_vst_fuid_new_from_fuid(AgsVstFUID *fuid) { const Steinberg::FUID &this_fuid = (Steinberg::FUID &) fuid; return((AgsVstFUID *) new Steinberg::FUID(this_fuid)); } void ags_vst_fuid_delete(AgsVstFUID *fuid) { delete fuid; } gboolean ags_vst_fuid_generate(AgsVstFUID *fuid) { return(static_cast(((Steinberg::FUID *) fuid)->generate())); } gboolean ags_vst_fuid_is_valid(AgsVstFUID *fuid) { return(static_cast(((Steinberg::FUID *) fuid)->isValid())); } AgsVstFUID* ags_vst_fuid_equal(AgsVstFUID *destination_fuid, AgsVstFUID *source_fuid) { return((destination_fuid = source_fuid)); } gboolean ags_vst_fuid_equals(AgsVstFUID *fuid_a, AgsVstFUID *fuid_b) { return(static_cast(fuid_a == fuid_b)); } gboolean ags_vst_fuid_smaller(AgsVstFUID *fuid_a, AgsVstFUID *fuid_b) { return(static_cast(fuid_a < fuid_b)); } gboolean ags_vst_fuid_not_equals(AgsVstFUID *fuid_a, AgsVstFUID *fuid_b) { return(static_cast(fuid_a != fuid_b)); } guint32 ags_vst_fuid_get_long1(AgsVstFUID *fuid) { return(((Steinberg::FUID *) fuid)->getLong1()); } guint32 ags_vst_fuid_get_long2(AgsVstFUID *fuid) { return(((Steinberg::FUID *) fuid)->getLong2()); } guint32 ags_vst_fuid_get_long3(AgsVstFUID *fuid) { return(((Steinberg::FUID *) fuid)->getLong3()); } guint32 ags_vst_fuid_get_long4(AgsVstFUID *fuid) { return(((Steinberg::FUID *) fuid)->getLong4()); } void ags_vst_fuid_from_uint32(AgsVstFUID *fuid, guint32 d1, guint32 d2, guint32 d3, guint32 d4) { ((Steinberg::FUID *) fuid)->from4Int(d1, d2, d3, d4); } void ags_vst_fuid_to_uint32(AgsVstFUID *fuid, guint32 *d1, guint32 *d2, guint32 *d3, guint32 *d4) { ((Steinberg::FUID *) fuid)->to4Int(static_cast(d1[0]), static_cast(d2[0]), static_cast(d3[0]), static_cast(d4[0])); } void ags_vst_fuid_to_string(AgsVstFUID *fuid, gchar *string) { ((Steinberg::FUID *) fuid)->toString(string); } gboolean ags_vst_fuid_from_string(AgsVstFUID *fuid, gchar *string) { return(static_cast(((Steinberg::FUID *) fuid)->fromString(string))); } void ags_vst_fuid_to_registry_string(AgsVstFUID *fuid, gchar *string) { ((Steinberg::FUID *) fuid)->toRegistryString(string); } gboolean ags_vst_fuid_from_registry_string(AgsVstFUID *fuid, gchar *string) { return(static_cast(((Steinberg::FUID *) fuid)->fromRegistryString(string))); } void ags_vst_fuid_print(AgsVstFUID *fuid, gchar *string, gint32 style) { ((Steinberg::FUID *) fuid)->print(string, style); } void ags_vst_fuid_to_tuid_with_result(AgsVstFUID *fuid, AgsVstTUID *result) { ((Steinberg::FUID *) fuid)->toTUID(*(reinterpret_cast(result))); } AgsVstTUID* ags_vst_fuid_to_tuid(AgsVstFUID *fuid) { return((AgsVstTUID *)(&(((Steinberg::FUID *) fuid)->toTUID()))); } AgsVstFUID* ags_vst_fuid_from_tuid(AgsVstFUID *fuid, AgsVstTUID *tuid) { Steinberg::FUID *retval; retval = (Steinberg::FUID *) new Steinberg::FUID(); retval[0] = ((Steinberg::FUID *) fuid)->fromTUID(((Steinberg::TUID *) tuid)[0]); return((AgsVstFUID *) retval); } const AgsVstTUID* ags_vst_funknown_get_iid() { return(reinterpret_cast(&INLINE_UID_OF(Steinberg::FUnknown))); } gint32 ags_vst_funknown_query_interface(AgsVstFUnknown *funknown, AgsVstTUID *_iid, void **obj) { return(((Steinberg::FUnknown *) funknown)->queryInterface(((Steinberg::TUID *) _iid)[0], obj)); } guint32 ags_vst_funknown_add_ref(AgsVstFUnknown *funknown) { return(((Steinberg::FUnknown *) funknown)->addRef()); } guint32 ags_vst_funknown_release(AgsVstFUnknown *funknown) { return(((Steinberg::FUnknown *) funknown)->release()); } #if 0 AgsVstFUnknownPtr* ags_vst_funknown_ptr_new_from_funknown(AgsVstFUnknown *funknown, AgsVstTUID *tuid) { //TODO:JK: implement me } AgsVstI* ags_funknown_ptr_get_interface(AgsVstFUnknownPtr *funknown_ptr, AgsVstTUID *tuid) { //TODO:JK: implement me } void ags_vst_funknown_ptr_set_funknown(AgsVstFUnknownPtr *funknown_ptr, AgsVstFUnknown *funknown) { //TODO:JK: implement me } void ags_vst_funknown_ptr_set_funknown_interface(AgsVstFUnknownPtr *funknown_ptr, AgsVstFUnknown *funknown, AgsVstI *vst_interface) { //TODO:JK: implement me } #endif AgsVstFReleaser* ags_freleaser_alloc(AgsVstFUnknown *funknown) { return((AgsVstFReleaser *) new Steinberg::FReleaser((Steinberg::FUnknown *) funknown)); } void ags_freleaser_free(AgsVstFReleaser *freleaser) { delete freleaser; } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp0000644000175000017500000000245313521306105022654 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { gboolean ags_vst_str_empty(ags_vst_tchar *str) { return(static_cast(strEmpty(reinterpret_cast(str)))); } gboolean ags_vst_str8_empty(gchar *str) { return(static_cast(str8Empty(reinterpret_cast(str)))); } gboolean ags_vst_str16_empty(char16_t *str) { return(static_cast(str16Empty(reinterpret_cast(str)))); } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp0000644000175000017500000000223013521306053023432 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { const AgsVstTUID* ags_vst_icloneable_get_iid() { return(reinterpret_cast(&INLINE_UID_OF(Steinberg::ICloneable))); } #if 0 AgsVstFUnknown* ags_vst_icloneable_clone(AgsVstICloneable *cloneable) { return(cloneable->clone()); } #endif } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp0000644000175000017500000000326613521306105024006 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { AgsVstTUID* ags_vst_iplugin_base_get_iid() { extern const Steinberg::TUID IPluginBase__iid; return((AgsVstTUID *) (&IPluginBase__iid)); } AgsVstTUID* ags_vst_iplugin_factory_get_iid() { extern const Steinberg::TUID IPluginFactory__iid; return((AgsVstTUID *) (&IPluginFactory__iid)); } AgsVstTUID* ags_vst_iplugin_factory2_get_iid() { extern const Steinberg::TUID IPluginFactory2__iid; return((AgsVstTUID *) (&IPluginFactory2__iid)); } AgsVstTUID* ags_vst_iplugin_factory3_get_iid() { extern const Steinberg::TUID IPluginFactory3__iid; return((AgsVstTUID *) (&IPluginFactory3__iid)); } AgsVstIPluginFactory* ags_vst_get_plugin_factory() { return((AgsVstIPluginFactory *) GetPluginFactory()); } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp0000644000175000017500000000647113521306053023721 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { AgsVstTUID ags_vst_ipersistent_get_iid() { return(IPersistent__iid); } gint32 ags_vst_ipersistent_load_attributes(AgsVstIPersistent *persistent, AgsVstIAttributes *attributes) { return(persistent->loadAttributes(attributes)); } AgsVstTUID ags_vst_iattributes_get_iid() { return(IAttributes__iid); } gint32 ags_vst_iattributes_set(AgsVstIAttributes *attr, AgsVstIAttrID attr_id, const AgsVstFVariant **data) { return(attr->set(attr_id, static_cast(data[0]))); } gint32 ags_vst_iattributes_queue(AgsVstIAttributes *attr, AgsVstIAttrID list_id, const AgsVstFVariant **data) { return(attr->queue(list_id, static_cast(data[0]))); } gint32 ags_vst_iattributes_set_binary_data(AgsVstIAttributes *attr, AgsVstIAttrID attr_id, void *data, guint32 bytes, gboolean copy_bytes) { return(attr->setBinaryData(attr_id, data, bytes, copy_bytes)); } gint32 ags_vst_iattributes_get(AgsVstIAttributes *attr, AgsVstIAttrID attr_id, AgsVstFVariant **data) { return(attr->get(attr_id, static_cast(data[0]))); } gint32 ags_vst_iattributes_unqueue(AgsVstIAttributes *attr, AgsVstIAttrID list_id, AgsVstFVariant **data) { return(attr->unqueue(list_id, static_cast(data[0]))); } gint32 ags_vst_iattributes_get_queue_item_count(AgsVstIAttributes *attr, AgsVstIAttrID attr_id) { return(attr->getQueueItemCount(attr_id)); } gint32 ags_vst_iattributes_reset_queue(AgsVstIAttributes *attr, AgsVstIAttrID attr_id) { return(attr->resetQueue(attr_id)); } gint32 ags_vst_iattributes_reset_all_queues(AgsVstIAttributes *attr) { return(attr->resetAllQueues()); } gint32 ags_vst_iattributes_get_binary_data(AgsVstIAttributes *attr, AgsVstIAttrID attr_id, void *data, guint32 bytes) { return(attr->getBinaryData(attr_id, data, bytes)); } guint32 ags_vst_iattributes_get_binary_data_size(AgsVstIAttributes *attr, AgsVstIAttrID attr_id) { return(attr->getBinaryDataSize(attr_id)); } AgsVstTUID ags_vst_iattributes2_get_iid() { return(IAttributes2__iid); } gint32 ags_vst_iattributes2_count_attributes(AgsVstIAttributes2 *attr) { return(attr->countAttributes()); } AgsVstIAttrID ags_vst_iattributes2_get_attribute_id(AgsVstIAttributes2 *attr, gint32 index) { return(attr->getAttributeID(index)); } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp0000644000175000017500000000245213521306053024411 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { const AgsVstTUID* ags_vst_ierror_context_get_iid() { return(reinterpret_cast(&INLINE_UID_OF(Steinberg::IErrorContext))); } gint32 ags_vst_ierror_context_get_error_message(AgsVstIErrorContext *error_context, AgsVstIString *message) { return(((Steinberg::IErrorContext *) error_context)->getErrorMessage((Steinberg::IString *) message)); } } gsequencer-3.1.3/ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp0000644000175000017500000001227113521306053023155 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include using namespace Steinberg; extern "C" { AgsVstFVariant* ags_vst_fvariant_new() { return((AgsVstFVariant *) new Steinberg::FVariant()); } AgsVstFVariant* ags_vst_fvariant_new_boolean(gboolean val) { return((AgsVstFVariant *) new Steinberg::FVariant(static_cast(val))); } AgsVstFVariant* ags_vst_fvariant_new_uint32(guint32 val) { return((AgsVstFVariant *) new Steinberg::FVariant(static_cast(val))); } AgsVstFVariant* ags_vst_fvariant_new_int64(gint64 val) { return((AgsVstFVariant *) new Steinberg::FVariant(static_cast(val))); } AgsVstFVariant* ags_vst_fvariant_new_double(gdouble val) { return((AgsVstFVariant *) new Steinberg::FVariant(static_cast(val))); } AgsVstFVariant* ags_vst_fvariant_new_string(gchar *str) { return((AgsVstFVariant *) new Steinberg::FVariant(static_cast(str))); } AgsVstFVariant* ags_vst_fvariant_new_wstring(gunichar2 *str) { return((AgsVstFVariant *) new Steinberg::FVariant(str)); } AgsVstFVariant* ags_vst_fvariant_new_funknown(AgsVstFUnknown *funknown, gboolean owner) { return((AgsVstFVariant *) new Steinberg::FVariant((Steinberg::FUnknown *) funknown, static_cast(owner))); } void ags_vst_fvariant_delete(AgsVstFVariant *fvariant) { delete fvariant; } void ags_vst_fvariant_set_boolean(AgsVstFVariant *fvariant, gboolean val) { ((Steinberg::FVariant *) fvariant)->set(static_cast(val)); } void ags_vst_fvariant_set_uin32(AgsVstFVariant *fvariant, guint32 val) { ((Steinberg::FVariant *) fvariant)->set(static_cast(val)); } void ags_vst_fvariant_set_int64(AgsVstFVariant *fvariant, gint64 val) { ((Steinberg::FVariant *) fvariant)->set(static_cast(val)); } void ags_vst_fvariant_set_double(AgsVstFVariant *fvariant, gdouble val) { ((Steinberg::FVariant *) fvariant)->set(static_cast(val)); } void ags_vst_fvariant_set_string(AgsVstFVariant *fvariant, gchar *str) { ((Steinberg::FVariant *) fvariant)->set(static_cast(str)); } void ags_vst_fvariant_set_wstring(AgsVstFVariant *fvariant, gunichar2 *str) { ((Steinberg::FVariant *) fvariant)->set(reinterpret_cast(str)); } void ags_vst_fvariant_set_object(AgsVstFVariant *fvariant, AgsVstFUnknown *obj) { ((Steinberg::FVariant *) fvariant)->set((Steinberg::FUnknown *) obj); } gboolean ags_vst_fvariant_get_boolean(AgsVstFVariant *fvariant) { return(((Steinberg::FVariant *) fvariant)->get()); } guint32 ags_vst_fvariant_get_uint32(AgsVstFVariant *fvariant) { return(((Steinberg::FVariant *) fvariant)->get()); } gint64 ags_vst_fvariant_get_int64(AgsVstFVariant *fvariant) { return(((Steinberg::FVariant *) fvariant)->get()); } gdouble ags_vst_fvariant_get_double(AgsVstFVariant *fvariant) { return(((Steinberg::FVariant *) fvariant)->get()); } gchar* ags_vst_fvariant_get_string(AgsVstFVariant *fvariant) { return(((Steinberg::FVariant *) fvariant)->get()); } gunichar2* ags_vst_fvariant_get_wstring(AgsVstFVariant *fvariant) { return(reinterpret_cast(((Steinberg::FVariant *) fvariant)->get())); } AgsVstFUnknown* ags_vst_fvariant_get_object(AgsVstFVariant *fvariant) { return((AgsVstFUnknown *) ((Steinberg::FVariant *) fvariant)->getObject()); } guint16 ags_vst_fvariant_get_type(AgsVstFVariant *fvariant) { return(((Steinberg::FVariant *) fvariant)->getType()); } gboolean ags_vst_fvariant_is_empty(AgsVstFVariant *fvariant) { return(static_cast(((Steinberg::FVariant *) fvariant)->isEmpty())); } gboolean ags_vst_fvariant_is_owner(AgsVstFVariant *fvariant) { return(static_cast(((Steinberg::FVariant *) fvariant)->isOwner())); } gboolean ags_vst_fvariant_is_string(AgsVstFVariant *fvariant) { return(static_cast(((Steinberg::FVariant *) fvariant)->isString())); } void ags_vst_fvariant_set_owner(AgsVstFVariant *fvariant, gboolean state) { ((Steinberg::FVariant *) fvariant)->setOwner(static_cast(state)); } void ags_vst_fvariant_empty(AgsVstFVariant *fvariant) { ((Steinberg::FVariant *) fvariant)->empty(); } } gsequencer-3.1.3/ags/vst3-capi/public.sdk/0000755000175000017500000000000013622252250015300 500000000000000gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/0000755000175000017500000000000013622252250016600 500000000000000gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/0000755000175000017500000000000013622252256017422 500000000000000gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp0000644000175000017500000004332413521306053024763 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include extern "C" { AgsVstEditController* ags_vst_edit_controller_new() { return(new EditController()); } void ags_vst_edit_controller_delete(AgsVstEditController *edit_controller) { delete edit_controller; } tresult PLUGIN_API ags_vst_edit_controller_set_component_state(AgsVstEditController *edit_controller, AgsVstIBStream *state) { return(edit_controller->setComponentState(state)); } tresult PLUGIN_API ags_vst_edit_controller_set_state(AgsVstEditController *edit_controller, AgsVstIBStream *state) { return(edit_controller->setState(state)); } tresult PLUGIN_API ags_vst_edit_controller_get_state(AgsVstEditController *edit_controller, AgsVstIBStream *state) { return(edit_controller->getState(state)); } gint32 PLUGIN_API ags_vst_edit_controller_get_parameter_count(AgsVstEditController *edit_controller) { return(edit_controller->getParameterCount()); } tresult PLUGIN_API ags_vst_edit_controller_get_parameter_info(AgsVstEditController *edit_controller, gint32 param_index, AgsVstParameterInfo **info) { return(edit_controller->getParameterInfo(param_index, static_cast(info[0]))); } tresult PLUGIN_API ags_vst_edit_controller_get_param_string_by_value(AgsVstEditController *edit_controller, guint32 tag, gdouble value_normalized, gchar *str) { return(edit_controller->getParamStringByValue(tag, value_normalized, str)); } tresult PLUGIN_API ags_vst_edit_controller_get_param_value_by_string(AgsVstEditController *edit_controller, guint32 tag, gchar *string, gdouble *value_normalized) { return(edit_controller->getParamValueByString(tag, string, static_cast(value_normalized[0]))); } gdouble PLUGIN_API ags_vst_edit_controller_normalized_param_to_plain(AgsVstEditController *edit_controller, guint32 tag, gdouble value_normalized) { return(edit_controller->normalizedParamToPlain(tag, value_normalized)); } gdouble PLUGIN_API ags_vst_edit_controller_plain_param_to_normalized(AgsVstEditController *edit_controller, guint32 tag, gdouble plain_value) { return(edit_controller->plainParamToNormalized(tag, plain_value)); } gdouble PLUGIN_API ags_vst_edit_controller_get_param_normalized(AgsVstEditController *edit_controller, guint32 tag) { return(edit_controller->getParamNormalized(tag)); } tresult PLUGIN_API ags_vst_edit_controller_set_param_normalized(AgsVstEditController *edit_controller, guint32 tag, gdouble value) { return(edit_controller->setParamNormalized(tag, value)); } tresult PLUGIN_API ags_vst_edit_controller_set_component_handler(AgsVstEditController *edit_controller, AgsVstIComponentHandler *handler) { return(edit_controller->setComponentHandler(handler)); } AgsVstIPlugView* PLUGIN_API ags_vst_edit_controller_create_view(AgsVstEditController *edit_controller, gchar *view_name) { return(edit_controller->createView(view_name)); } tresult PLUGIN_API ags_vst_edit_controller_set_knob_mode(AgsVstEditController *edit_controller, guint mode) { return(edit_controller->setKnowMode(mode)); } tresult PLUGIN_API ags_vst_edit_controller_open_help(AgsVstEditController *edit_controller, gboolean only_check) { return(edit_controller->openHelp(only_check)); } tresult PLUGIN_API ags_vst_edit_controller_open_about_box(AgsVstEditController *edit_controller, gboolean only_check) { return(edit_controller->openAboutBox(only_check)); } tresult PLUGIN_API ags_vst_edit_controller_initialize(AgsVstEditController *edit_controller, AgsVstFUnknown *context) { return(edit_controller->initialize(context)); } tresult PLUGIN_API ags_vst_edit_controller_terminate(AgsVstEditController *edit_controller) { return(edit_controller->terminate()); } tresult ags_vst_edit_controller_begin_edit(AgsVstEditController *edit_controller, guint32 tag) { return(edit_controller->beginEdit(tag)); } tresult ags_vst_edit_controller_perform_edit(AgsVstEditController *edit_controller, guint32 tag, gdouble value_normalized) { return(edit_controller->performEdit(tag, value_normalized)); } tresult ags_vst_edit_controller_end_edit(AgsVstEditController *edit_controller, guint32 tag) { return(edit_controller->endEdit(tag)); } tresult ags_vst_edit_controller_start_group_edit(AgsVstEditController *edit_controller) { return(edit_controller->startGroupEdit()); } tresult ags_vst_edit_controller_finish_group_edit(AgsVstEditController *edit_controller) { return(edit_controller->finishGroupEdit()); } void ags_vst_edit_controller_editor_destroyed(AgsVstEditController *edit_controller, AgsVstEditorView *editor) { return(edit_controller->editorDestroyed(editor)); } void ags_vst_edit_controller_editor_attached(AgsVstEditController *edit_controller, AgsVstEditorView *editor) { return(edit_controller->editorAttached(editor)); } void ags_vst_edit_controller_editor_removed(AgsVstEditController *edit_controller, AgsVstEditorView *editor) { return(edit_controller->editorRemoved(editor)); } guint ags_vst_edit_controller_get_host_knob_mode(AgsVstEditController *edit_controller) { return(edit_controller->getHostKnobMode()); } AgsVstParameter* ags_vst_edit_controller_get_parameter_object(AgsVstEditController *edit_controller, guint32 tag) { return(edit_controller->getParameterObject(tag)); } tresult ags_vst_edit_controller_get_parameter_info_by_tag(AgsVstEditController *edit_controller, guint32 tag, AgsVstParameterInfo **info) { return(edit_controller->getParameterInfoByTag(tag, static_cast(info[0]))); } tresult ags_vst_edit_controller_set_dirty(AgsVstEditController *edit_controller, gboolean state) { return(edit_controller->setDirty(state)); } tresult ags_vst_edit_controller_request_open_editor(AgsVstEditController *edit_controller, gchar *editor_name) { return(edit_controller->openEditor(editor_name)); } AgsVstIComponentHandler* ags_vst_edit_controller_get_component_handler(AgsVstEditController *edit_controller) { return(edit_controller->getComponentHandler()); } AgsVstEditorView* ags_vst_editor_view_new(AgsVstEditController *controller, AgsVstViewRect *size) { return(new EditorView(controller, size)); } void ags_vst_editor_view_delete(AgsVstEditorView *editor_view) { delete editor_view; } AgsVstEditController* ags_vst_editor_view_get_controller(AgsVstEditorView *editor_view) { return(editor_view->getController()); } void ags_vst_editor_view_attached_to_parent(AgsVstEditorView *editor_view) { return(editor_view->attachedToParent()); } void ags_vst_editor_view_removed_from_parent(AgsVstEditorView *editor_view) { return(editor_view->removedFromParent()); } AgsVstUnit* ags_vst_unit_new(gchar *unit_name, AgsVstUnitID unit_id, gint32 parent_unit_id, gint32 program_list_id) { return(new Unit(unit_name, unit_id, parent_unit_id, program_list_id)); } void ags_vst_unit_delete(AgsVstUnit *unit) { delete unit; } AgsVstUnitInfo* ags_vst_unit_get_info(AgsVstUnit *unit) { return(unit->getInfo()); } gint32 ags_vst_unit_get_id(AgsVstUnit *unit) { return(unit->getId()); } void ags_vst_unit_set_id(AgsVstUnit *unit, gint32 new_id) { return(unit->setId(new_id)); } gchar *ags_vst_unit_get_name(AgsVstUnit *unit) { return(unit->getName()); } void ags_vst_unit_set_name(AgsVstUnit *unit, gchar *new_name) { return(unit->setName(new_name)); } gint32 ags_vst_unit_get_program_list_id(AgsVstUnit *unit) { return(unit->getProgramListId()); } void ags_vst_unit_set_program_list_id(AgsVstUnit *unit, gint32 new_id) { return(unit->setProgramListId(new_id)); } AgsVstProgramList* ags_vst_program_list_new(gchar *name, gint32 list_id, AgsVstUnitID unit_id) { return(new ProgramList(name, list_id, unit_id)); } AgsVstProgramList* ags_vst_program_list_new_from_program_list(AgsVstProgramList **program_list) { return(new ProgramList(static_cast(program_list[0]))); } void ags_vst_program_list_delete(AgsVstProgramList *program_list) { delete program_list; } AgsVstProgramListInfo* ags_vst_program_list_get_info(AgsVstProgramList *program_list) { return(program_list->getInfo()); } gint32 ags_vst_program_list_get_id(AgsVstProgramList *program_list) { return(program_list->getId()); } gchar* ags_vst_program_list_get_name(AgsVstProgramList *program_list) { return(program_list->getName()); } gint32 ags_vst_program_list_get_count(AgsVstProgramList *program_list) { return(program_list->getCount()); } tresult ags_vst_program_list_get_program_name(AgsVstProgramList *program_list, gint32 program_index, gchar *out_name) { return(program_list->getProgramName(program_index, out_name)); } tresult ags_vst_program_list_set_program_name(AgsVstProgramList *program_list, gint32 program_index, gchar *in_name) { return(program_list->setProgramName(program_index, in_name)); } tresult ags_vst_program_list_get_program_info(AgsVstProgramList *program_list, gint32 program_index, gchar *attribute_id, gchar *out_value) { return(program_list->getProgramInfo(program_index, attribute_id, out_value)); } tresult ags_vst_program_list_has_pitch_names(AgsVstProgramList *program_list, gint32 program_index) { return(program_list->hasPitchNames(program_index)); } tresult ags_vst_program_list_get_pitch_name(AgsVstProgramList *program_list, gint32 program_index, gint16 midi_pitch, gchar *out_name) { return(program_list->getPitchName(program_index, midi_pitch, out_name)); } gint32 ags_vst_program_list_add_program(AgsVstProgramList *program_list, gchar *name) { return(program_list->addProgram(name)); } gboolean ags_vst_program_list_set_program_info(AgsVstProgramList *program_list, gint32 program_index, gchar *attribute_id, gchar *value) { return(program_list->setProgramInfo(program_index, attribute_id, value)); } AgsVstParameter* ags_vst_program_list_get_parameter(AgsVstProgramList *program_list) { return(program_list->getParameter()); } AgsVstProgramListWithPitchNames* ags_vst_program_list_with_pitch_names_new(gchar *name, gint32 list_id, AgsVstUnitID unit_id) { return(new ProgramListWithPitchNames(name, list_id, unit_id)); } void ags_vst_program_list_with_pitch_names_delete(AgsVstProgramListWithPitchNames *program_list_with_pitch_names) { delete program_list_with_pitch_names; } gboolean ags_vst_program_list_with_pitch_names_set_pitch_name(AgsVstProgramListWithPitchNames *program_list_with_pitch_names, gint32 program_index, gint16 pitch, gchar *pitch_name) { return(program_list_with_pitch_names->setPitchName(program_index, pitch, pitch_name)); } gboolean ags_vst_program_list_with_pitch_names_remove_pitch_name(AgsVstProgramListWithPitchNames *program_list_with_pitch_names, gint32 program_index, gint16 pitch) { return(program_list_with_pitch_names->removePitchName(program_index, pitch)); } gint32 ags_vst_program_list_with_pitch_names_add_program(AgsVstProgramListWithPitchNames *program_list_with_pitch_names, gchar *name) { return(program_list_with_pitch_names->addProgram(name)); } tresult ags_vst_program_list_with_pitch_names_has_pitch_names(AgsVstProgramListWithPitchNames *program_list_with_pitch_names, gint32 program_index) { return(program_list_with_pitch_names->hasPitchNames(program_index)); } tresult ags_vst_program_list_with_pitch_names_get_pitch_name(AgsVstProgramListWithPitchNames *program_list_with_pitch_names, gint32 program_index, gint16 midi_pitch, gchar *name) { return(program_list_with_pitch_names->getPitchName(program_index, midi_pitch, name)); } AgsVstEditControllerEx1* ags_vst_edit_controller_ex1_new() { return(new EditControllerEx1()); } void ags_vst_edit_controller_ex1_delete(AgsVstEditControllerEx1 *edit_controller_ex1) { delete edit_controller_ex1; } gboolean ags_vst_edit_controller_ex1_add_unit(AgsVstEditControllerEx1 *edit_controller_ex1, AgsVstUnit *unit) { return(edit_controller_ex1->addUnit(unit)); } gboolean ags_vst_edit_controller_ex1_add_program_list(AgsVstEditControllerEx1 *edit_controller_ex1, AgsVstProgramList *list) { return(edit_controller_ex1->addProgramList(list)); } AgsVstProgramList* ags_vst_edit_controller_ex1_get_program_list(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id) { return(edit_controller_ex1->getProgramList(list_id)); } tresult ags_vst_edit_controller_ex1_notify_program_list_change(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id, gint32 program_index) { return(edit_controller_ex1->notify_program_list_change(list_id, program_index)); } gint32 PLUGIN_API ags_vst_edit_controller_ex1_get_unit_count(AgsVstEditControllerEx1 *edit_controller_ex1) { return(edit_controller_ex1->getUnitCount()); } tresult PLUGIN_API ags_vst_edit_controller_ex1_get_unit_info(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 unit_index, AgsVstUnitInfo **info) { return(edit_controller_ex1->getUnitInfo(unit_index, static_cast(info[0]))); } gint32 PLUGIN_API ags_vst_edit_controller_ex1_get_program_list_count(AgsVstEditControllerEx1 *edit_controller_ex1) { return(edit_controller_ex1->getProgramListCount()); } tresult PLUGIN_API ags_vst_edit_controller_ex1_get_program_list_info(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_index, AgsVstProgramListInfo **info) { return(edit_controller_ex1->getProgramListInfo(list_index, static_cast(info[0]))); } tresult PLUGIN_API ags_vst_edit_controller_ex1_get_program_name(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id, gint32 program_index, gchar *name) { return(edit_controller_ex1->getProgramName(list_id, program_index, name)); } tresult PLUGIN_API ags_vst_edit_controller_ex1_get_program_info(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id, gint32 program_index, gchar *attribute_id, gchar *attribute_value) { return(edit_controller_ex1->getProgramInfo(list_id, program_index, attribtue_id, attribute_value)); } tresult PLUGIN_API ags_vst_edit_controller_ex1_has_program_pitch_names(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id, gint32 program_index) { return(edit_controller_ex1->hasProgramPitchNames(list_id, program_index)); } tresult PLUGIN_API ags_vst_edit_controller_ex1_get_program_pitch_name(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id, gint32 program_index, gint16 midi_pitch, gchar *name) { return(edit_controller_ex1->getProgramPitchName(list_id, program_index, midi_pitch, name)); } tresult ags_vst_edit_controller_ex1_set_program_name(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_id, gint32 program_index, gchar *name) { return(edit_controller_ex1->setProgramName(list_id, program_index, name)); } gint32 PLUGIN_API ags_vst_edit_controller_ex1_get_selected_unit(AgsVstEditControllerEx1 *edit_controller_ex1) { return(edit_controller_ex1->getSelectedUnit()); } tresult PLUGIN_API ags_vst_edit_controller_ex1_select_unit(AgsVstEditControllerEx1 *edit_controller_ex1, AgsVstUnitID unit_id) { return(edit_controller_ex1->selectUnit(unit_id)); } tresult PLUGIN_API ags_vst_edit_controller_ex1_get_unit_by_bus(AgsVstEditControllerEx1 *edit_controller_ex1, guint type, guint dir, gint32 bus_index, gint32 channel, gint32 *unit_id) { return(edit_controller_ex1->getUnitByBus(type, dir, bus_index, channel, unit_id)); } tresult PLUGIN_API ags_vst_edit_controller_ex1_set_unit_program_data(AgsVstEditControllerEx1 *edit_controller_ex1, gint32 list_or_unit_id, gint32 program_index, AgsVstIBStream *data) { return(edit_controller_ex1->setUnitProgramData(list_or_unit_id, program_index, data)); } tresult ags_vst_edit_controller_ex1_notify_unit_selection(AgsVstEditControllerEx1 *edit_controller_ex1) { return(edit_controller_ex1->notifyUnitSelection()); } void PLUGIN_API ags_vst_edit_controller_ex1_update(AgsVstFUnknown *changedUnknown, gint32 message) { return(edit_controller_ex1->update(message)); } } gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp0000644000175000017500000000571013521306053024564 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include extern "C" { AgsVstComponentBase* ags_vst_component_base_new() { return(new ComponentBase()); } void ags_vst_component_base_delete(AgsVstComponentBase *component_base) { delete component_base; } AgsVstFUnknown* ags_vst_component_base_get_host_context(AgsVstComponentBase *component_base) { return(component_base->getHostContext()); } AgsVstIConnectionPoint* ags_vst_component_base_get_peer(AgsVstComponentBase *component_base) { return(component_base->getPeer()); } AgsVstIMessage* ags_vst_component_base_allocate_message(AgsVstComponentBase *component_base) { return(component_base->allocateMessage()); } tresult ags_vst_component_base_send_message(AgsVstComponentBase *component_base, AgsVstIMessage* message) { return(component_base->sendMessage(message)); } tresult ags_vst_component_base_send_text_message(AgsVstComponentBase *component_base, gchar *text) { return(component_base->sendTextMessage(static_cast(text))); } tresult ags_vst_component_base_receive_text(AgsVstComponentBase *component_base, gchar *text) { return(component_base->receiveText(static_cast(text))); } tresult PLUGIN_API ags_vst_component_base_initialize(AgsVstComponentBase *component_base, AgsVstFUnknown* context) { return(component_base->initialize(context)); } tresult PLUGIN_API ags_vst_component_base_terminate(AgsVstComponentBase *component_base) { return(component_base->terminate()); } tresult PLUGIN_API ags_vst_component_base_connect(AgsVstComponentBase *component_base, AgsVstIConnectionPoint* other) { return(component_base->connect(other)); } tresult PLUGIN_API ags_vst_component_base_disconnect(AgsVstComponentBase *component_base, AgsVstIConnectionPoint* other) { return(component_base->disconnect(other)); } tresult PLUGIN_API ags_vst_component_base_notify(AgsVstComponentBase *component_base, AgsVstIMessage* message) { return(component_base->notify(message)); } } gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp0000644000175000017500000000764313521306053023601 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include extern "C" { AgsVstComponent* ags_vst_component_new() { return(new Component()); } void ags_vst_component_delete(AgsVstComponent *component) { delete component; } void ags_vst_component_set_controller_class(AgsVstComponent *component, AgsVstFUID **cid) { component->setControllerClass(static_cast(cid[0])); } gint32 ags_vst_component_remove_audio_buses(AgsVstComponent *component) { return(component->removeAudioBuses()); } gint32 ags_vst_component_remove_event_buses(AgsVstComponent *component) { return(component->removeEventBuses()); } gint32 ags_vst_component_rename_bus(AgsVstComponent *component, AgsVstMediaType type, AgsVstBusDirection dir, gint32 index, AgsVstString128 new_name) { return(component->renameBus(static_cast(type), static_cast(dir), index, new_name)); } gint32 ags_vst_component_get_controller_class_id(AgsVstComponent *component, AgsVstTUID class_id) { return(component->getControllerClassId(static_cast(class_id))); } gint32 ags_vst_component_set_io_mode(AgsVstComponent *component, AgsVstIoMode mode) { return(component->setIoMode(static_cast(mode))); } gint32 ags_vst_component_get_bus_count(AgsVstComponent *component, AgsVstMediaType type, AgsVstBusDirection dir) { return(component->getBusCount(static_cast(type), static_cast(dir))); } gint32 ags_vst_component_get_bus_info(AgsVstComponent *component, AgsVstMediaType type, AgsVstBusDirection dir, gint32 index, AgsVstBusInfo **info) { return(component->getBusInfo(static_cast(type), static_cast(dir), index, static_cast(info[0]))); } gint32 ags_vst_component_get_routing_info(AgsVstComponent *component, AgsVstRoutingInfo **in_info, AgsVstRoutingInfo **out_info) { return(component->getRoutingInfo(static_cast(in_info[0]), static_cast(out_info[0]))); } gint32 ags_vst_component_activate_bus(AgsVstComponent *component, AgsVstMediaType type, AgsVstBusDirection dir, gint32 index, gboolean state) { return(component->activateBus(static_cast(type), static_cast(dir), index, static_cast(state))); } gint32 ags_vst_component_set_active(AgsVstComponent *component, gboolean state) { return(component->setActive(static_cast(state))); } gint32 ags_vst_component_set_state(AgsVstComponent *component, AgsVstIBStream *state) { return(component->setState(state)); } gint32 ags_vst_component_get_state(AgsVstComponent *component, AgsVstIBStream *state) { return(component->getState(state)); } gint32 ags_vst_component_initialize(AgsVstComponent *component, AgsVstFUnknown *context) { return(component->initialize(context)); } gint32 ags_vst_component_terminate(AgsVstComponent *component) { return(component->terminate()); } } gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp0000644000175000017500000002214713521306053023736 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include extern "C" { AgsVstParameter* ags_vst_parameter_new() { return(new Parameter()); } AgsVstParameter* ags_vst_parameter_new_with_info(AgsVstParameterInfo **info) { return(new Parameter(static_cast(info[0]))); } AgsVstParameter* ags_vst_parameter_new_full(gchar *title, guint32 tag, gchar *units, gdouble default_value_normalized, gint32 step_count, gint32 flags, gint32 unit_id, gchar *short_title) { return(new Parameter(title, tag, units, default_value_normalized, step_count, flags, unit_id, short_title)); } void ags_vst_parameters_delete(AgsVstParameter *parameter) { delete parameter; } AgsVstParameterInfo* ags_vst_parameter_get_info(AgsVstParameter *parameter) { return(static_cast(parameter->getInfo())); } void ags_vst_parameter_set_unit_id(AgsVstParameter *parameter, gint32 id) { parameter->setUnitID(id); } gint32 ags_vst_parameter_get_unit_id(AgsVstParameter *parameter) { return(parameter->getUnitID()); } gdouble ags_vst_parameter_get_normalized(AgsVstParameter *parameter) { return(parameter->getNormalized()); } gboolean ags_vst_parameter_set_normalized(AgsVstParameter *parameter, gdouble v) { return(parameter->setNormalized(v)); } void ags_vst_parameter_to_string(AgsVstParameter *parameter, gdouble value_normalized, gchar *string) { parameter->toString(value_normalized, string); } gboolean ags_vst_parameter_from_string(AgsVstParameter *parameter, gchar *string, gdouble *value_normalized) { return(parameter->fromString(string, static_cast(value_normalized[0]))); } gdouble ags_vst_parameter_to_plain(AgsVstParameter *parameter, gdouble value_normalized) { return(parameter->toPlain(value_normalized)); } gdouble ags_vst_parameter_to_normalized(AgsVstParameter *parameter, gdouble plain_value) { return(parameter->toNormalized(plain_value)); } gint32 ags_vst_parameter_get_precision(AgsVstParameter *parameter) { return(parameter->getPrecision()); } void ags_vst_parameter_set_precision(AgsVstParameter *parameter, gint32 val) { parameter->setPrecision(val); } AgsVstRangeParameter* ags_vst_range_parameter_new() { return(new RangeParameter()); } AgsVstRangeParameter* ags_vst_range_parameter_new_with_info(AgsVstParameterInfo **param_info, gdouble min, gdouble max) { return(new RangeParameter(static_cast(param_info[0]), min, max)); } AgsVstRangeParameter* ags_vst_range_parameter_new_full(gchar *title, guint32 tag, gchar *units, gdouble min_plain, gdouble max_plain, gdouble default_value_plain, gint32 step_count, gint32 flags, gint32 unit_id, gchar *short_title) { return(new RangeParameter(title, tag, units, min_plain, max_plain, default_value_plain, step_count, flags, unit_id, short_title)); } gdouble ags_vst_range_parameter_get_min(AgsVstRangeParameter *range_parameter) { return(range_parameter->getMin()); } void ags_vst_range_parameter_set_min(AgsVstRangeParameter *range_parameter, gdouble value) { range_parameter->setMin(value); } gdouble ags_vst_range_parameter_get_max(AgsVstRangeParameter *range_parameter) { return(range_parameter->getMax()); } void ags_vst_range_parameter_set_max(AgsVstRangeParameter *range_parameter, gdouble value) { range_parameter->setMax(value); } void ags_vst_range_parameter_to_string(AgsVstRangeParameter *range_parameter, gdouble _value_normalized, gchar *string) { range_parameter->toString(_value_normalized, string); } gboolean ags_vst_range_parameter_from_string(AgsVstRangeParameter *range_parameter, gchar *string, gdouble *_value_normalized) { return(range_parameter->fromString(string, static_cast(_value_normalized[0]))); } gdouble ags_vst_range_parameter_to_plain(AgsVstRangeParameter *range_parameter, gdouble _value_normalized) { return(range_parameter->toPlain(_value_normalized)); } gdouble ags_vst_range_parameter_to_normalized(AgsVstRangeParameter *range_parameter, gdouble plain_value) { return(range_parameter->toNormalized(plain_value)); } AgsVstStringListParameter* ags_vst_string_list_parameter_new() { return(new StringListParameter()); } AgsVstStringListParameter* ags_vst_string_list_parameter_new_with_info(AgsVstParameterInfo **param_info) { return(new StringListParameter(static_cast(param_info[0]))); } AgsVstStringListParameter* ags_vst_string_list_parameter_new_full(gchar *title, guint32 tag, gchar *units, gint32 flags, gint32 unit_id, gchar *short_title) { return(new StringListParameter(title, tag, units, flags, unit_id, short_title)); } void ags_vst_string_list_parameter_append_string(AgsVstStringListParameter *string_list_parameter, gchar *string) { string_list_parameter->appendString(string); } gboolean ags_vst_string_list_parameter_replace_string(AgsVstStringListParameter *string_list_parameter, gint32 index, gchar *string) { return(string_list_parameter->replaceString(index, string); } void ags_vst_string_list_parameter_to_string(AgsVstStringListParameter *string_list_parameter, gdouble _value_normalized, gchar *string) { string_list_parameter->toString(_value_normalized, string); } gboolean ags_vst_string_list_parameter_from_string(AgsVstStringListParameter *string_list_parameter, gchar *string, gdouble *_value_normalized) { return(string_list_parameter->fromString(string, static_cast(_value_normalized[0]))); } gdouble ags_vst_string_list_parameter_to_plain(AgsVstStringListParameter *string_list_parameter, gdouble _value_normalized) { return(string_list_parameter->toPlain(_value_normalized)); } gdouble ags_vst_string_list_parameter_to_normalized(AgsVstStringListParameter *string_list_parameter, gdouble plain_value) { return(string_list_parameter->toNormalized(plain_value)); } AgsVstParameterContainer* ags_vst_parameter_container_new() { return(new ParameterContainer()); } void ags_vst_parameter_container_init(AgsVstParameterContainer *parameter_container, gint32 initial_size, gint32 resize_delta) { parameter_container->init(initial_size, resize_delta); } AgsVstParameter* ags_vst_parameter_container_add_parameter_with_info(AgsVstParameterContainer *parameter_container, AgsVstParameterInfo **info) { return(parameter_container->addParameterWithInfo(static_cast(info[0]))); } AgsVstParameter* ags_vst_parameter_container_add_parameter_extended(AgsVstParameterContainer *parameter_container, gchar *title, gchar *units, gint32 step_count, gdouble default_value_normalized, gint32 flags, gint32 tag, gint32 unit_id, gchar *short_title) { return(parameter_container->addParameterExtended(title, units, step_count, default_value_normalized, flags, tag, unit_id, short_title)); } AgsVstParameter* ags_vst_parameter_container_add_parameter(AgsVstParameterContainer *parameter_container, AgsVstParameter *p) { return(parameter_container->addParameter(p)); } gint32 ags_vst_parameter_container_get_parameter_count(AgsVstParameterContainer *parameter_container) { return(parameter_container->getParameterCount()); } AgsVstParameter* ags_vst_parameter_container_get_parameter_by_index(AgsVstParameterContainer *parameter_container, gint32 index) { return(parameter_container->getParameterByIndex(index)); } void ags_vst_parameter_container_remove_all(AgsVstParameterContainer *parameter_container) { return(parameter_container->removeAll()); } AgsVstParameter* ags_vst_parameter_container_get_parameter(AgsVstParameterContainer *parameter_container, guint32 tag) { return(parameter_container->getParameter(tag)); } } gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp0000644000175000017500000001113313521306053024201 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { AgsVstAudioEffect* ags_vst_audio_effect_new() { return(new AudioEffect()); } void ags_vst_audio_effect_delete(AgsVstAudioEffect *audio_effect) { delete audio_effect; } AgsVstAudioBus* ags_vst_audio_effect_add_audio_input(AgsVstAudioEffect *audio_effect, AgsVstTChar *name, AgsVstSpeakerArrangement arr, AgsVstBusType bus_type, gint32 flags) { return(audio_effect->addAudioInput(name, arr, static_cast(bus_type), flags)); } AgsVstAudioBus* ags_vst_audio_effect_add_audio_output(AgsVstAudioEffect *audio_effect, AgsVstTChar *name, AgsVstSpeakerArrangement arr, AgsVstBusType bus_type, gint32 flags) { return(audio_effect->addAudioOutput(name, arr, static_cast(bus_type), flags)); } AgsVstAudioBus* ags_vst_audio_effect_get_audio_input(AgsVstAudioEffect *audio_effect, gint32 index) { return(audio_effect->getAudioInput(index)); } AgsVstAudioBus* ags_vst_audio_effect_get_audio_output(AgsVstAudioEffect *audio_effect, gint32 index) { return(audio_effect->getAudioOutput(index)); } AgsVstEventBus* ags_vst_audio_effect_add_event_input(AgsVstAudioEffect *audio_effect, AgsVstTChar *name, gint32 channels, AgsVstBusType bus_type, gint32 flags) { return(audio_effect->addEventInput(name, channels, static_cast(bus_type), flags)); } AgsVstEventBus* ags_vst_audio_effect_add_event_output(AgsVstAudioEffect *audio_effect, AgsVstTChar *name, gint32 channels, AgsVstBusType bus_type, gint32 flags) { return(audio_effect->addEventOutput(name, channels, static_cast(bus_type), flags)); } AgsVstEventBus* ags_vst_audio_effect_get_event_input(AgsVstAudioEffect *audio_effect, gint32 index) { return(audio_effect->getEventInput(index)); } AgsVstEventBus* ags_vst_audio_effect_get_event_output(AgsVstAudioEffect *audio_effect, gint32 index) { return(audio_effect->getEventOutput(index)); } gint32 ags_vst_audio_effect_set_bus_arrangements(AgsVstAudioEffect *audio_effect, AgsVstSpeakerArrangement *inputs, gint32 num_ins, AgsVstSpeakerArrangement *outputs, gint32 num_outs) { return(audio_effect->setBusArrangements(inputs, num_ins, outputs, num_outs); } gint32 ags_vst_audio_effect_get_bus_arrangements(AgsVstAudioEffect *audio_effect, AgsVstBusDirection bus_direction, gint32 bus_index, AgsVstSpeakerArrangement *arr) { return(audio_effect->getBusArrangements(static_cast(bus_direction), bus_index, static_cast(arr))); } gint32 ags_vst_audio_effect_can_process_sample_size(AgsVstAudioEffect *audio_effect, gint32 symbolic_sample_size) { return(audio_effect->canProcessSampleSize(symbolic_sample_size)); } guint32 ags_vst_audio_effect_get_latency_samples(AgsVstAudioEffect *audio_effect) { return(audio_effect->getLatencySamples()); } gint32 ags_vst_audio_effect_setup_processing(AgsVstAudioEffect *audio_effect, AgsVstProcessSetup **setup) { return(audio_effect->setupProcessing(static_cast(setup[0]))); } gint32 ags_vst_audio_effect_set_processing(AgsVstAudioEffect *audio_effect, gboolean state) { return(audio_effect->setProcessing(static_cast(state))); } gint32 ags_vst_audio_effect_process(AgsVstAudioEffect *audio_effect, AgsVstProcessData **data) { return(audio_effect->process(static_cast(data[0]))); } guint32 ags_vst_audio_effect_get_tail_samples(AgsVstAudioEffect *audio_effect) { return(audio_effect->getTailSamples()); } } gsequencer-3.1.3/ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp0000644000175000017500000000720113521306053022356 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { AgsVstBus* ags_vst_bus_new(AgsVstTChar *name, AgsVstBusType bus_type, gint32 flags) { return(new Bus()); } void ags_vst_bus_delete(AgsVstBus *bus) { delete bus; } gboolean ags_vst_bus_is_active(AgsVstBus *bus) { return(static_cast(bus->isActive())); } void ags_vst_bus_set_active(AgsVstBus *bus, gboolean state) { bus->setActive(static_cast(state)); } void ags_vst_bus_set_name(AgsVstBus *bus, AgsVstString new_name) { bus->setName(reinterpret_cast(new_name)); } void ags_vst_bus_set_bus_type(AgsVstBus *bus, AgsVstBusType new_bus_type) { bus->setBusType(static_cast(new_bus_type)); } void ags_vst_bus_set_flags(AgsVstBus *bus, guint32 new_flags) { bus->setFlags(static_cast(new_flags)); } gboolean ags_vst_bus_get_info(AgsVstBus *bus, AgsVstBusInfo **info) { return(static_cast(bus->getInfo(static_cast(info[0]))); } AgsVstEventBus* ags_vst_event_bus_new(AgsVstTChar *name, AgsVstBusType bus_type, gint32 flags, gint32 channel_count) { return(new EventBus(static_cast(name), static_cast(bus_type), static_cast(flags), static_cast(channel_count))); } void ags_vst_event_bus_delete(AgsVstEventBus *event_bus) { delete event_bus; } gboolean ags_vst_event_bus_get_info(AgsVstEventBus *event_bus, AgsVstBusInfo **info) { return(static_cast(event_bus->getInfo(static_cast(info[0])))); } AgsVstAudioBus* ags_vst_audio_bus_new(AgsVstTChar *name, AgsVstBusType bus_type, gint32 flags, AgsVstSpeakerArrangement arr) { return(new AudioBus(static_cast(name), static_cast(bus_type), static_cast(flags), arr)); } void ags_vst_audio_bus_delete(AgsVstAudioBus *audio_bus) { delete audio_bus; } AgsVstSpeakerArrangement ags_vst_audio_bus_get_arrangement(AgsVstAudioBus *audio_bus) { return(audio_bus->getArrangement()); } void ags_vst_audio_bus_set_arrangement(AgsVstAudioBus *audio_bus, AgsVstSpeakerArrangement *arr) { audio_bus->setArrangement(arr); } gboolean ags_vst_audio_bus_get_info(AgsVstAudioBus *audio_bus, AgsVstBusInfo **info) { return(static_cast(audio_bus->getInfo(static_cast(info[0])))); } AgsVstBusList* ags_vst_bus_list_new(AgsVstMediaType type, AgsVstBusDirection dir) { return(new BusList(type, dir)); } void ags_vst_bus_list_delete(AgsVstBusList *bus_list) { delete bus_list; } AgsVstMediaType ags_vst_bus_list_get_type(AgsVstBusList *bus_list) { return(static_cast(bus_list->getType())); } AgsVstBusDirection ags_vst_bus_list_get_direction(AgsVstBusList *bus_list) { return(static_cast(bus_list->getDirection())); } } gsequencer-3.1.3/ags/vst3-capi/base/0000755000175000017500000000000013622252250014154 500000000000000gsequencer-3.1.3/ags/vst3-capi/base/source/0000755000175000017500000000000013622252256015462 500000000000000gsequencer-3.1.3/ags/vst3-capi/base/source/ags_vst_fbuffer.cpp0000644000175000017500000002533613521306053021255 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include extern "C" { AgsVstBuffer* ags_vst_buffer_new() { return(new Buffer()); } AgsVstBuffer* ags_vst_buffer_new_from_string(void *b, guint32 size) { return(new Buffer(b, size)); } AgsVstBuffer* ags_vst_buffer_new_and_fill_up(guint32 size, guint8 init_val) { return(new Buffer(size, init_val)); } AgsVstBuffer* ags_vst_buffer_new_with_size(guint32 size) { return(new Buffer(size)); } AgsVstBuffer* ags_vst_buffer_new_from_buffer(AgsVstBuffer **buffer) { return(new Buffer(static_cast(buffer))); } void ags_vst_buffer_delete(AgsVstBuffer *buffer) { delete buffer; } void ags_vst_buffer_equal(AgsVstBuffer *destination_buffer, AgsVstBuffer *source_buffer) { destination_buffer = source_buffer; } gboolean ags_vst_buffer_equals(AgsVstBuffer *buffer_a, AgsVstBuffer *buffer_b) { return(buffer_a == buffer_b); } guint32 ags_vst_buffer_get_size(AgsVstBuffer *buffer) { return(buffer->getSize()); } gboolean ags_vst_buffer_set_size(AgsVstBuffer *buffer, guint32 new_size) { return(static_cast(buffer->setSize(new_size))); } gboolean ags_vst_buffer_grow(AgsVstBuffer *buffer, guint32 mem_size) { return(static_cast(buffer->grow(mem_size))); } gboolean ags_vst_buffer_set_max_size(AgsVstBuffer *buffer, guint32 size) { return(static_cast(buffer->setMaxSize(size))); } void ags_vst_buffer_fillup(AgsVstBuffer *buffer, guint8 init_val) { buffer->fillup(init_value); } guint32 ags_vst_buffer_get_fill_size(AgsVstBuffer *buffer) { return(buffer->getFillSize()); } gboolean ags_vst_buffer_set_fill_size(AgsVstBuffer *buffer, guint32 c) { return(static_cast(buffer->setFillSize(c))); } void ags_vst_buffer_flush(AgsVstBuffer *buffer) { buffer->flush() } gboolean ags_vst_buffer_truncate_to_fill_size(AgsVstBuffer *buffer) { return(static_cast(buffer->truncateToFillSize())); } gboolean ags_vst_buffer_is_full(AgsVstBuffer *buffer) { return(static_cast(buffer->isFull())); } guint32 ags_vst_buffer_get_free(AgsVstBuffer *buffer) { return(buffer->getFree()); } void ags_vst_buffer_shift_start(AgsVstBuffer *buffer, gint32 amount) { buffer->shiftStart(amount); } void ags_vst_buffer_shift_at(AgsVstBuffer *buffer, guint32 position, gint32 amount) { buffer->shiftAt(position, amount); } void ags_vst_buffer_move(AgsVstBuffer *buffer, gint32 amount, guint8 init_val) { buffer->move(amount, init_val); } gboolean ags_vst_buffer_copy(AgsVstBuffer *buffer, guint32 from, guint32 to, guint32 bytes) { return(static_cast(buffer->copy(from, to, bytes))); } guint32 ags_vst_buffer_get(AgsVstBuffer *buffer, void *b, guint32 size) { return(buffer->get(b, size)); } void ags_vst_buffer_set_delta(AgsVstBuffer *buffer, guint32 d) { buffer->setDelta(d); } gboolean ags_vst_buffer_put_from_uint8(AgsVstBuffer *buffer, guint8 val) { return(static_cast(buffer->put(val))); } gboolean ags_vst_buffer_put_from_unichar2(AgsVstBuffer *buffer, gunichar2 c) { return(static_cast(buffer->put(c))); } gboolean ags_vst_buffer_put_from_char(AgsVstBuffer *buffer, gchar c) { return(static_cast(buffer->put(c))); } gboolean ags_vst_buffer_put_from_buffer(AgsVstBuffer *buffer, void *buffer, guint32 size) { return(static_cast(buffer->put(buffer, size))); } gboolean ags_vst_buffer_put_from_uint8_buffer(AgsVstBuffer *buffer, guint8 *buffer, guint32 size) { return(static_cast(buffer->put(buffer, size))); } gboolean ags_vst_buffer_put_from_char_buffer(AgsVstBuffer *buffer, gchar *buffer, guint32 size) { return(static_cast(buffer->put(buffer, size))); } gboolean ags_vst_buffer_put_from_string(AgsVstBuffer *buffer, gchar **string) { return(static_cast(buffer->put(static_cast(string[0])))); } void ags_vst_buffer_set(AgsVstBuffer *buffer, guint8 value) { buffer->set(value); } gboolean ags_vst_buffer_append_string(AgsVstBuffer *buffer, ags_vst_tchar *s) { return(static_cast(buffer->append(s))); } gboolean ags_vst_buffer_append_char(AgsVstBuffer *buffer, ags_vst_tchar c) { return(static_cast(buffer->append(c))); } gboolean ags_vst_buffer_append_string_from_char_buffer(AgsVstBuffer *buffer, gchar *s) { return(static_cast(buffer->appendString8(s))); } gboolean ags_vst_buffer_append_string_from_uchar_buffer(AgsVstBuffer *buffer, guchar *s) { return(static_cast(buffer->appendString8(s))); } gboolean ags_vst_buffer_append_string_from_unichar2_buffer(AgsVstBuffer *buffer, gunichar2 *s) { return(static_cast(buffer->appendString16(s))); } gboolean ags_vst_buffer_append_string_from_char_byte(AgsVstBuffer *buffer, gchar c) { return(static_cast(buffer->appendString8(c))); } gboolean ags_vst_buffer_append_string_from_uchar_byte(AgsVstBuffer *buffer, guchar c) { return(static_cast(buffer->appendString8(c))); } gboolean ags_vst_buffer_append_string_from_unichar2_byte(AgsVstBuffer *buffer, gunichar2 c) { return(static_cast(buffer->appendString16())); } gboolean ags_vst_buffer_prepend_string(AgsVstBuffer *buffer, ags_vst_tchar *s) { return(static_cast(buffer->prependString(s))); } gboolean ags_vst_buffer_prepend_char(AgsVstBuffer *buffer, ags_vst_tchar c) { return(static_cast(buffer->prependString8())); } gboolean ags_vst_buffer_prepend_string_from_char_buffer(AgsVstBuffer *buffer, gchar *s) { return(static_cast(buffer->prependString8(s))); } gboolean ags_vst_buffer_prepend_string_from_uchar_buffer(AgsVstBuffer *buffer, guchar *s) { return(static_cast(buffer->prependString8(s))); } gboolean ags_vst_buffer_prepend_string_from_unichar2_buffer(AgsVstBuffer *buffer, gunichar2 *s) { return(static_cast(buffer->prependString16(s))); } gboolean ags_vst_buffer_prepend_string_from_char_byte(AgsVstBuffer *buffer, gchar c) { return(static_cast(buffer->prependString8(c))); } gboolean ags_vst_buffer_prepend_string_from_uchar_byte(AgsVstBuffer *buffer, guchar c) { return(static_cast(buffer->prependString8(c))); } gboolean ags_vst_buffer_prepend_string_from_unichar2_byte(AgsVstBuffer *buffer, gunichar2 c) { return(static_cast(buffer->prependString16(c))); } void ags_vst_buffer_end_string(AgsVstBuffer *buffer) { buffer->endString(); } void ags_vst_buffer_end_string_char(AgsVstBuffer *buffer) { buffer->endString8(); } void ags_vst_buffer_end_string_unichar2(AgsVstBuffer *buffer) { buffer->endString16(); } gboolean ags_vst_buffer_make_hex_string(AgsVstBuffer *buffer, gchar **result) { return(static_cast(buffer->makeHexString(static_cast(result[0])))); } gboolean ags_vst_buffer_from_hex_string(AgsVstBuffer *buffer, gchar *string) { return(static_cast(buffer->fromHexString(string))); } void* ags_vst_buffer_to_buffer(AgsVstBuffer *buffer) { return(buffer); } ags_vst_tchar* ags_vst_buffer_to_str(AgsVstBuffer *buffer) { return(buffer->str()); } gchar* ags_vst_buffer_to_str8(AgsVstBuffer *buffer) { return(buffer->str8()); } gunichar2* ags_vst_buffer_to_str16(AgsVstBuffer *buffer) { return(buffer->str16()); } gint8* ags_vst_buffer_to_int8_ptr(AgsVstBuffer *buffer) { return(buffer->int8Ptr()); } guint8* ags_vst_buffer_to_uint8_ptr(AgsVstBuffer *buffer) { return(buffer->uint8Ptr()); } gint16* ags_vst_buffer_to_int16_ptr(AgsVstBuffer *buffer) { return(buffer->int16Ptr()); } guint16* ags_vst_buffer_to_uint16_ptr(AgsVstBuffer *buffer) { return(buffer->uint16Ptr()); } gint32* ags_vst_buffer_to_int32_ptr(AgsVstBuffer *buffer) { return(buffer->int32Ptr()); } guint32* ags_vst_buffer_to_uint32_ptr(AgsVstBuffer *buffer) { return(buffer->uint32Ptr()); } gfloat* ags_vst_buffer_to_float_ptr(AgsVstBuffer *buffer) { return(buffer->floatPtr()); } gdouble* ags_vst_buffer_to_double_ptr(AgsVstBuffer *buffer) { return(buffer->doublePtr()); } gunichar2* ags_vst_buffer_to_wchar_ptr(AgsVstBuffer *buffer) { return(buffer->wcharPtr()); } gint8 ags_vst_buffer_offset(AgsVstBuffer *buffer, guint32 i) { return(buffer->offset(i)); } gint8 ags_vst_buffer_is_empty(AgsVstBuffer *buffer, guint32 i) { return(buffer->isEmpty(i)); } gboolean ags_vst_buffer_swap(AgsVstBuffer *buffer, gint16 swap_size) { return(static_cast(buffer->swap(swap_size))); } gboolean ags_vst_buffer_swap_buffer(AgsVstBuffer *buffer, void* buffer, guint32 buffer_size, gint16 swap_size) { return(static_cast(buffer->swapBuffer(buffer, buffer_size, swap_size))); } void ags_vst_buffer_take(AgsVstBuffer **bufferBuffer) { buffer->take(); } gint8* ags_vst_buffer_pass(AgsVstBuffer *buffer) { return(buffer->pass()); } gboolean ags_vst_buffer_to_wide_string(AgsVstBuffer *buffer, gint32 source_code_page) { return(static_cast(buffer->toWideString(source_code_page))); } gboolean ags_vst_buffer_to_multibyte_string(AgsVstBuffer *buffer, gint32 dest_code_page) { return(static_cast(buffer->toMultibyteString(dest_code_page))); } } gsequencer-3.1.3/ags/vst3-capi/util/0000755000175000017500000000000013622252256014225 500000000000000gsequencer-3.1.3/ags/vst3-capi/util/ags_vst_string_util.cpp0000644000175000017500000000517513521306053020743 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include extern "C" { gunichar2* ags_vst_string_util_to_unicode16(gchar *source_str) { gunichar2 *destination_str; gsize destination_length; destination_str = NULL; destination_length = -1; ags_vst_string_util_to_unicode16_extended(str, &destination_str, &destination_length); return(destination_str); } void ags_vst_string_util_to_unicode16_extended(gchar *source_str, gunichar2 **destination_str, gsize *destination_length) { gunichar2 *str; glong items_written; GError *error; if(source_str == NULL){ if(destination_str != NULL){ destination_str[0] = NULL; } if(destination_length != NULL){ destination_length[0] = 0; } return; } error = NULL; if(destination_length != NULL){ str = g_utf8_to_utf16(source_str, destination_length[0], NULL, &items_written, &error); }else{ str = g_utf8_to_utf16(source_str, -1, NULL, &items_written, &error); } if(error != NULL){ g_message("%s", error->message); g_error_free(error); } if(destination_str != NULL){ if(destination_str[0] != NULL){ gsize length; memcpy(destination_str[0], str, length * sizeof(gunichar2)); destination_str[length] = 0x0; }else{ destination_str[0] = str; } }else{ g_free(str); } if(destination_length != NULL){ destination_length[0] = items_written; } } gchar* ags_vst_string_util_from_unicode16(gunichar2 *source_str) { gchar *str; GError *error; error = NULL; str = g_utf16_to_utf8(source_str, -1, NULL, NULL, &error); if(error != NULL){ g_message("%s", error->message); g_error_free(error); } return(str); } } gsequencer-3.1.3/ags/server/0000755000175000017500000000000013622252255012744 500000000000000gsequencer-3.1.3/ags/server/ags_service_provider.h0000644000175000017500000000575513607210263017251 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SERVICE_PROVIDER_H__ #define __AGS_SERVICE_PROVIDER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SERVICE_PROVIDER (ags_service_provider_get_type()) #define AGS_SERVICE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SERVICE_PROVIDER, AgsServiceProvider)) #define AGS_SERVICE_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_SERVICE_PROVIDER, AgsServiceProviderInterface)) #define AGS_IS_SERVICE_PROVIDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_SERVICE_PROVIDER)) #define AGS_IS_SERVICE_PROVIDER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_SERVICE_PROVIDER)) #define AGS_SERVICE_PROVIDER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_SERVICE_PROVIDER, AgsServiceProviderInterface)) typedef struct _AgsServiceProvider AgsServiceProvider; typedef struct _AgsServiceProviderInterface AgsServiceProviderInterface; struct _AgsServiceProviderInterface { GTypeInterface ginterface; gboolean (*is_operating)(AgsServiceProvider *service_provider); AgsServerStatus* (*server_status)(AgsServiceProvider *service_provider); void (*set_registry)(AgsServiceProvider *service_provider, AgsRegistry *registry); AgsRegistry* (*get_registry)(AgsServiceProvider *service_provider); void (*set_server)(AgsServiceProvider *service_provider, GList *server); GList* (*get_server)(AgsServiceProvider *service_provider); }; GType ags_service_provider_get_type(); gboolean ags_service_provider_is_operating(AgsServiceProvider *service_provider); AgsServerStatus* ags_service_provider_server_status(AgsServiceProvider *service_provider); void ags_service_provider_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry); AgsRegistry* ags_service_provider_get_registry(AgsServiceProvider *service_provider); void ags_service_provider_set_server(AgsServiceProvider *service_provider, GList *server); GList* ags_service_provider_get_server(AgsServiceProvider *service_provider); G_END_DECLS #endif /*__AGS_SERVICE_PROVIDER_H__*/ gsequencer-3.1.3/ags/server/controller/0000755000175000017500000000000013622252255015127 500000000000000gsequencer-3.1.3/ags/server/controller/ags_controller.c0000644000175000017500000003004713607210263020230 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include void ags_controller_class_init(AgsControllerClass *controller); void ags_controller_init(AgsController *controller); void ags_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_controller_dispose(GObject *gobject); void ags_controller_finalize(GObject *gobject); /** * SECTION:ags_controller * @short_description: base controller * @title: AgsController * @section_id: * @include: ags/server/controller/ags_controller.h * * The #AgsController is a base object to implement controllers. */ enum{ PROP_0, PROP_SERVER, PROP_CONTEXT_PATH, }; static gpointer ags_controller_parent_class = NULL; GType ags_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_controller = 0; static const GTypeInfo ags_controller_info = { sizeof (AgsControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_controller_init, }; ags_type_controller = g_type_register_static(G_TYPE_OBJECT, "AgsController", &ags_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_controller); } return g_define_type_id__volatile; } void ags_controller_class_init(AgsControllerClass *controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_controller_parent_class = g_type_class_peek_parent(controller); /* GObjectClass */ gobject = (GObjectClass *) controller; gobject->set_property = ags_controller_set_property; gobject->get_property = ags_controller_get_property; gobject->dispose = ags_controller_dispose; gobject->finalize = ags_controller_finalize; /* properties */ /** * AgsController:server: * * The assigned #AgsServer * * Since: 3.0.0 */ param_spec = g_param_spec_object("server", i18n("assigned server"), i18n("The assigned server"), AGS_TYPE_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SERVER, param_spec); /** * AgsController:context-path: * * The context path provided. * * Since: 3.0.0 */ param_spec = g_param_spec_string("context-path", i18n_pspec("context path to provide"), i18n_pspec("The context path provided by this controller"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTEXT_PATH, param_spec); } void ags_controller_init(AgsController *controller) { g_rec_mutex_init(&(controller->obj_mutex)); controller->server = NULL; controller->context_path = NULL; controller->resource = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify) ags_controller_resource_unref); } void ags_controller_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsController *controller; GRecMutex *controller_mutex; controller = AGS_CONTROLLER(gobject); /* get controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(controller); switch(prop_id){ case PROP_SERVER: { AgsServer *server; server = (AgsServer *) g_value_get_object(value); g_rec_mutex_lock(controller_mutex); if(controller->server == (GObject *) server){ g_rec_mutex_unlock(controller_mutex); return; } if(controller->server != NULL){ g_object_unref(G_OBJECT(controller->server)); } if(server != NULL){ g_object_ref(G_OBJECT(server)); } controller->server = server; g_rec_mutex_unlock(controller_mutex); } break; case PROP_CONTEXT_PATH: { char *context_path; context_path = (char *) g_value_get_string(value); g_rec_mutex_lock(controller_mutex); controller->context_path = g_strdup(context_path); g_rec_mutex_unlock(controller_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_controller_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsController *controller; GRecMutex *controller_mutex; controller = AGS_CONTROLLER(gobject); /* get controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(controller); switch(prop_id){ case PROP_SERVER: { g_rec_mutex_lock(controller_mutex); g_value_set_object(value, controller->server); g_rec_mutex_unlock(controller_mutex); } break; case PROP_CONTEXT_PATH: { g_rec_mutex_lock(controller_mutex); g_value_set_string(value, controller->context_path); g_rec_mutex_unlock(controller_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_controller_dispose(GObject *gobject) { AgsController *controller; controller = AGS_CONTROLLER(gobject); if(controller->server != NULL){ g_object_unref(controller->server); controller->server = NULL; } /* call parent */ G_OBJECT_CLASS(ags_controller_parent_class)->dispose(gobject); } void ags_controller_finalize(GObject *gobject) { AgsController *controller; controller = AGS_CONTROLLER(gobject); if(controller->server != NULL){ g_object_unref(controller->server); } g_free(controller->context_path); g_hash_table_destroy(controller->resource); /* call parent */ G_OBJECT_CLASS(ags_controller_parent_class)->finalize(gobject); } /** * ags_controller_resource_alloc: * @group_id: the group id * @user_id: the user id * @access_mode: the access mode * * Allocated #AgsControllerResource-struct. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsControllerResource-struct * * Since: 3.0.0 */ AgsControllerResource* ags_controller_resource_alloc(gchar *group_id, gchar *user_id, guint access_mode) { AgsControllerResource *controller_resource; controller_resource = (AgsControllerResource *) malloc(sizeof(AgsControllerResource)); controller_resource->ref_count = 1; controller_resource->group_id = g_strdup(group_id); controller_resource->user_id = g_strdup(user_id); controller_resource->access_mode = access_mode; return(controller_resource); } /** * ags_controller_resource_free: * @controller_resource: (type gpointer): the #AgsControllerResource-struct * * Free @controller_resource. * * Since: 3.0.0 */ void ags_controller_resource_free(AgsControllerResource *controller_resource) { if(controller_resource == NULL){ return; } g_free(controller_resource->group_id); g_free(controller_resource->user_id); g_free(controller_resource); } /** * ags_controller_resource_ref: * @controller_resource: (type gpointer): the #AgsControllerResource-struct * * Increase ref-count of @controller_resource. * * Since: 3.0.0 */ void ags_controller_resource_ref(AgsControllerResource *controller_resource) { if(controller_resource == NULL){ return; } controller_resource->ref_count += 1; } /** * ags_controller_resource_unref: * @controller_resource: (type gpointer): the #AgsControllerResource-struct * * Decrease ref-count of @controller_resource and free it if ref-count drops to 0. * * Since: 3.0.0 */ void ags_controller_resource_unref(AgsControllerResource *controller_resource) { if(controller_resource == NULL){ return; } controller_resource->ref_count -= 1; if(controller_resource->ref_count <= 0){ ags_controller_resource_free(controller_resource); } } /** * ags_controller_add_resource: * @controller: the #AgsController * @resource_name: the resource name as string * @controller_resource: (type gpointer): the #AgsControllerResource-struct * * Add @controller_resource with key @resource_name to hash table. * * Since: 3.0.0 */ void ags_controller_add_resource(AgsController *controller, gchar *resource_name, AgsControllerResource *controller_resource) { GRecMutex *controller_mutex; if(!AGS_IS_CONTROLLER(controller) || resource_name == NULL || controller_resource == NULL){ return; } /* get controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(controller); /* add resource */ g_rec_mutex_lock(controller_mutex); ags_controller_resource_ref(controller_resource); g_hash_table_insert(controller->resource, g_strdup(resource_name), controller_resource); g_rec_mutex_unlock(controller_mutex); } /** * ags_controller_remove_resource: * @controller: the #AgsController * @resource_name: the resource name as string * * Remove key @resource_name from hash table. * * Since: 3.0.0 */ void ags_controller_remove_resource(AgsController *controller, gchar *resource_name) { GRecMutex *controller_mutex; if(!AGS_IS_CONTROLLER(controller) || resource_name == NULL){ return; } /* get controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(controller); /* remove resource */ g_rec_mutex_lock(controller_mutex); g_hash_table_remove(controller->resource, resource_name); g_rec_mutex_unlock(controller_mutex); } /** * ags_controller_lookup_resource: * @controller: the #AgsController * @resource_name: the resource name as string * * Lookup key @resource_name in hash table. * * Returns: (type gpointer) (transfer none): the matching #AgsControllerResource-struct * * Since: 3.0.0 */ AgsControllerResource* ags_controller_lookup_resource(AgsController *controller, gchar *resource_name) { AgsControllerResource *controller_resource; GRecMutex *controller_mutex; if(!AGS_IS_CONTROLLER(controller) || resource_name == NULL){ return(NULL); } /* get controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(controller); /* lookup resource */ g_rec_mutex_lock(controller_mutex); controller_resource = (AgsControllerResource *) g_hash_table_lookup(controller->resource, resource_name); ags_controller_resource_ref(controller_resource); g_rec_mutex_unlock(controller_mutex); return(controller_resource); } /** * ags_controller_query_security_context: * @controller: the #AgsController * @security_context: the #AgsSecurityContext * @login: the login to query * * Query @security_context for @login. * * Returns: %TRUE if allowed to proceed, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_controller_query_security_context(AgsController *controller, GObject *security_context, gchar *login) { //TODO:JK: implement me return(FALSE); } /** * ags_controller_new: * * Instantiate new #AgsController * * Returns: the #AgsController * * Since: 3.0.0 */ AgsController* ags_controller_new() { AgsController *controller; controller = (AgsController *) g_object_new(AGS_TYPE_CONTROLLER, NULL); return(controller); } gsequencer-3.1.3/ags/server/controller/ags_front_controller.c0000644000175000017500000002034513613101102021424 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_front_controller_class_init(AgsFrontControllerClass *front_controller); void ags_front_controller_init(AgsFrontController *front_controller); void ags_front_controller_finalize(GObject *gobject); gpointer ags_front_controller_real_do_request(AgsFrontController *front_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *context_path, gchar *login, gchar *security_token); /** * SECTION:ags_front_controller * @short_description: handle all XMLRPC requests * @title: AgsFrontController * @section_id: * @include: ags/server/controller/ags_front_controller.h * * The #AgsFrontController is an object to handle XMLRPC requests. */ enum{ DO_REQUEST, LAST_SIGNAL, }; static gpointer ags_front_controller_parent_class = NULL; static guint front_controller_signals[LAST_SIGNAL]; GType ags_front_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_front_controller = 0; static const GTypeInfo ags_front_controller_info = { sizeof (AgsFrontControllerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_front_controller_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFrontController), 0, /* n_preallocs */ (GInstanceInitFunc) ags_front_controller_init, }; ags_type_front_controller = g_type_register_static(AGS_TYPE_CONTROLLER, "AgsFrontController", &ags_front_controller_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_front_controller); } return g_define_type_id__volatile; } void ags_front_controller_class_init(AgsFrontControllerClass *front_controller) { GObjectClass *gobject; GParamSpec *param_spec; ags_front_controller_parent_class = g_type_class_peek_parent(front_controller); /* GObjectClass */ gobject = (GObjectClass *) front_controller; gobject->finalize = ags_front_controller_finalize; /* AgsFrontController */ front_controller->do_request = ags_front_controller_real_do_request; /* signals */ /** * AgsFrontController::do-request: * @front_controller: the #AgsFrontController * @msg: the #SoupMessage * @query: the #GHashTable * @client: the #SoupClient * @security_context: the #AgsSecurityContext * @context_path: the context path to access * @user: the user's UUID * @security_token: the security token * * Do a request on the front controller. * * Returns: the response * * Since: 3.0.0 */ front_controller_signals[DO_REQUEST] = g_signal_new("do-request", G_TYPE_FROM_CLASS(front_controller), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFrontControllerClass, do_request), NULL, NULL, ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING, G_TYPE_POINTER, 7, G_TYPE_OBJECT, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } void ags_front_controller_init(AgsFrontController *front_controller) { //TODO:JK: implement me } void ags_front_controller_finalize(GObject *gobject) { AgsFrontController *front_controller; front_controller = AGS_FRONT_CONTROLLER(gobject); /* call parent */ G_OBJECT_CLASS(ags_front_controller_parent_class)->finalize(gobject); } gpointer ags_front_controller_real_do_request(AgsFrontController *front_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token) { AgsServer *server; AgsAuthenticationManager *authentication_manager; GList *start_controller, *controller; gpointer start_response; gchar *delimiter; gboolean found_controller; if(!AGS_IS_SECURITY_CONTEXT(security_context) || path == NULL || login == NULL || security_token == NULL){ return(NULL); } //TODO:JK: use certs start_response = NULL; g_object_get(front_controller, "server", &server, NULL); start_controller = NULL; g_object_get(server, "controller", &start_controller, NULL); controller = start_controller; delimiter = strrchr(path, '/'); found_controller = FALSE; if(delimiter != NULL){ while(controller != NULL){ gboolean success; GRecMutex *controller_mutex; /* get controller mutex */ controller_mutex = AGS_CONTROLLER_GET_OBJ_MUTEX(controller->data); /* match path */ success = FALSE; g_rec_mutex_lock(controller_mutex); if(AGS_CONTROLLER(controller->data)->context_path != NULL){ success = !strncmp(AGS_CONTROLLER(controller->data)->context_path, path, delimiter - path - 1); } g_rec_mutex_unlock(controller_mutex); if(success){ if(AGS_IS_PLUGIN_CONTROLLER(controller->data)){ found_controller = TRUE; start_response = ags_plugin_controller_do_request(AGS_PLUGIN_CONTROLLER(controller->data), msg, query, client, security_context, path, login, security_token); } } controller = controller->next; } } if(!found_controller){ soup_message_set_status(msg, 200); soup_message_set_response(msg, "text/plain", SOUP_MEMORY_STATIC, "OK", 2); } return(start_response); } /** * ags_front_controller_do_request: * @front_controller: the #AgsFrontController * @msg: the #SoupMessage * @query: the #GHashTable * @client: the #SoupClientContext * @security_context: the #AgsSecurityContext * @path: the context path to access * @login: the login * @security_token: the security token * * Do a XML-RPC request for the given @path with @query. * * Returns: the response on success, otherwise %NULL. * * Since: 3.0.0 */ gpointer ags_front_controller_do_request(AgsFrontController *front_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token) { gpointer retval; g_return_val_if_fail(AGS_IS_FRONT_CONTROLLER(front_controller), NULL); g_object_ref((GObject *) front_controller); g_signal_emit(G_OBJECT(front_controller), front_controller_signals[DO_REQUEST], 0, msg, query, client, security_context, path, login, security_token, &retval); g_object_unref((GObject *) front_controller); return(retval); } /** * ags_front_controller_new: * * Instantiate new #AgsFrontController * * Returns: the #AgsFrontController * * Since: 3.0.0 */ AgsFrontController* ags_front_controller_new() { AgsFrontController *front_controller; front_controller = (AgsFrontController *) g_object_new(AGS_TYPE_FRONT_CONTROLLER, NULL); return(front_controller); } gsequencer-3.1.3/ags/server/controller/ags_plugin_controller.c0000644000175000017500000000610713607210263021606 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include void ags_plugin_controller_class_init(AgsPluginControllerInterface *ginterface); /** * SECTION:ags_plugin_controller * @short_description: provide abstract controller * @title: AgsPluginController * @section_id: AgsPluginController * @include: ags/server/controller/ags_plugin_controller.h * * The #AgsPluginController provides you an abstraction of controller implementation. */ GType ags_plugin_controller_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_plugin_controller = 0; ags_type_plugin_controller = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsPluginController", sizeof(AgsPluginControllerInterface), (GClassInitFunc) ags_plugin_controller_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_plugin_controller); } return g_define_type_id__volatile; } void ags_plugin_controller_class_init(AgsPluginControllerInterface *ginterface) { /* empty */ } /** * ags_plugin_controller_do_request: * @plugin_controller: the #AgsPluginController * @msg: the #SoupMessage * @query: the #GHashTable * @client: the #SoupClientContext * @security_context: the #AgsSecurityContext * @path: the context path to access * @login: the login * @security_token: the security token * * Do request. * * Returns: the #GList-struct containing #AgsResponse * * Since: 3.0.0 */ gpointer ags_plugin_controller_do_request(AgsPluginController *plugin_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token) { AgsPluginControllerInterface *plugin_controller_interface; gpointer response; g_return_val_if_fail(AGS_IS_PLUGIN_CONTROLLER(plugin_controller), NULL); plugin_controller_interface = AGS_PLUGIN_CONTROLLER_GET_INTERFACE(plugin_controller); g_return_val_if_fail(plugin_controller_interface->do_request, NULL); response = plugin_controller_interface->do_request(plugin_controller, msg, query, client, security_context, path, login, security_token); return(response); } gsequencer-3.1.3/ags/server/controller/ags_front_controller.h0000644000175000017500000000507513607210263021450 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FRONT_CONTROLLER_H__ #define __AGS_FRONT_CONTROLLER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FRONT_CONTROLLER (ags_front_controller_get_type()) #define AGS_FRONT_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FRONT_CONTROLLER, AgsFrontController)) #define AGS_FRONT_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FRONT_CONTROLLER, AgsFrontControllerClass)) #define AGS_IS_FRONT_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FRONT_CONTROLLER)) #define AGS_IS_FRONT_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FRONT_CONTROLLER)) #define AGS_FRONT_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_FRONT_CONTROLLER, AgsFrontControllerClass)) typedef struct _AgsFrontController AgsFrontController; typedef struct _AgsFrontControllerClass AgsFrontControllerClass; struct _AgsFrontController { AgsController controller; }; struct _AgsFrontControllerClass { AgsControllerClass controller; gpointer (*do_request)(AgsFrontController *front_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token); }; GType ags_front_controller_get_type(); gpointer ags_front_controller_do_request(AgsFrontController *front_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token); AgsFrontController* ags_front_controller_new(); G_END_DECLS #endif /*__AGS_FRONT_CONTROLLER_H__*/ gsequencer-3.1.3/ags/server/controller/ags_controller.h0000644000175000017500000000656213607210263020242 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CONTROLLER_H__ #define __AGS_CONTROLLER_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_CONTROLLER (ags_controller_get_type()) #define AGS_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CONTROLLER, AgsController)) #define AGS_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_CONTROLLER, AgsControllerClass)) #define AGS_IS_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CONTROLLER)) #define AGS_IS_CONTROLLER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CONTROLLER)) #define AGS_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_CONTROLLER, AgsControllerClass)) #define AGS_CONTROLLER_GET_OBJ_MUTEX(obj) (&(((AgsController *) obj)->obj_mutex)) #define AGS_CONTROLLER_BASE_PATH "/ags-xmlrpc" typedef struct _AgsController AgsController; typedef struct _AgsControllerClass AgsControllerClass; typedef struct _AgsControllerResource AgsControllerResource; struct _AgsController { GObject gobject; GRecMutex obj_mutex; GObject *server; gchar *context_path; GHashTable *resource; }; struct _AgsControllerClass { GObjectClass gobject; gboolean (*query_security_context)(AgsController *controller, GObject *security_context, gchar *login); }; /** * AgsControllerResource: * @ref_count: the reference count * @group_id: the group id of permissions * @user_id: the user id of permissions * @access_mode: the access mode of permissions * * Specifing attributes of resources. */ struct _AgsControllerResource { gint ref_count; gchar *group_id; gchar *user_id; guint access_mode; }; GType ags_controller_get_type(); AgsControllerResource* ags_controller_resource_alloc(gchar *group_id, gchar *user_id, guint access_mode); void ags_controller_resource_free(AgsControllerResource *controller_resource); void ags_controller_resource_ref(AgsControllerResource *controller_resource); void ags_controller_resource_unref(AgsControllerResource *controller_resource); void ags_controller_add_resource(AgsController *controller, gchar *resource_name, AgsControllerResource *controller_resource); void ags_controller_remove_resource(AgsController *controller, gchar *resource_name); AgsControllerResource* ags_controller_lookup_resource(AgsController *controller, gchar *resource_name); gboolean ags_controller_query_security_context(AgsController *controller, GObject *security_context, gchar *login); AgsController* ags_controller_new(); G_END_DECLS #endif /*__AGS_CONTROLLER_H__*/ gsequencer-3.1.3/ags/server/controller/ags_plugin_controller.h0000644000175000017500000000473313607210263021616 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PLUGIN_CONTROLLER_H__ #define __AGS_PLUGIN_CONTROLLER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PLUGIN_CONTROLLER (ags_plugin_controller_get_type()) #define AGS_PLUGIN_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PLUGIN_CONTROLLER, AgsPluginController)) #define AGS_PLUGIN_CONTROLLER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_PLUGIN_CONTROLLER, AgsPluginControllerInterface)) #define AGS_IS_PLUGIN_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PLUGIN_CONTROLLER)) #define AGS_IS_PLUGIN_CONTROLLER_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_PLUGIN_CONTROLLER)) #define AGS_PLUGIN_CONTROLLER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_PLUGIN_CONTROLLER, AgsPluginControllerInterface)) typedef struct _AgsPluginController AgsPluginController; typedef struct _AgsPluginControllerInterface AgsPluginControllerInterface; struct _AgsPluginControllerInterface { GTypeInterface ginterface; gpointer (*do_request)(AgsPluginController *plugin_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token); }; GType ags_plugin_controller_get_type(); gpointer ags_plugin_controller_do_request(AgsPluginController *plugin_controller, SoupMessage *msg, GHashTable *query, SoupClientContext *client, GObject *security_context, gchar *path, gchar *login, gchar *security_token); G_END_DECLS #endif /*__AGS_PLUGIN_CONTROLLER_H__*/ gsequencer-3.1.3/ags/server/ags_server_status.c0000644000175000017500000001160413607210263016571 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2017 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include void ags_server_status_class_init(AgsServerStatusClass *server_status); void ags_server_status_connectable_interface_init(AgsConnectableInterface *connectable); void ags_server_status_init(AgsServerStatus *server_status); void ags_server_status_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_server_status_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_server_status_connect(AgsConnectable *connectable); void ags_server_status_disconnect(AgsConnectable *connectable); void ags_server_status_finalize(GObject *gobject); enum{ PROP_0, PROP_MAXIMUM_CONNECTIONS, PROP_CONNECTION_COUNT, }; static gpointer ags_server_status_parent_class = NULL; GType ags_server_status_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_server_status = 0; static const GTypeInfo ags_server_status_info = { sizeof (AgsServerStatusClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_server_status_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsServerStatus), 0, /* n_preallocs */ (GInstanceInitFunc) ags_server_status_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_server_status_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_server_status = g_type_register_static(G_TYPE_OBJECT, "AgsServerStatus", &ags_server_status_info, 0); g_type_add_interface_static(ags_type_server_status, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_server_status); } return g_define_type_id__volatile; } void ags_server_status_class_init(AgsServerStatusClass *server_status) { GObjectClass *gobject; GParamSpec *param_spec; ags_server_status_parent_class = g_type_class_peek_parent(server_status); /* GObjectClass */ gobject = (GObjectClass *) server_status; gobject->set_property = ags_server_status_set_property; gobject->get_property = ags_server_status_get_property; gobject->finalize = ags_server_status_finalize; } void ags_server_status_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->connect = ags_server_status_connect; connectable->disconnect = ags_server_status_disconnect; } void ags_server_status_init(AgsServerStatus *server_status) { server_status->flags = 0; } void ags_server_status_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsServerStatus *server_status; server_status = AGS_SERVER_STATUS(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_server_status_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsServerStatus *server_status; server_status = AGS_SERVER_STATUS(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_server_status_connect(AgsConnectable *connectable) { /* empty */ } void ags_server_status_disconnect(AgsConnectable *connectable) { /* empty */ } void ags_server_status_finalize(GObject *gobject) { AgsServerStatus *server_status; server_status = AGS_SERVER_STATUS(gobject); /* call parent */ G_OBJECT_CLASS(ags_server_status_parent_class)->finalize(gobject); } /** * ags_server_status_new: * * Instantiate #AgsServerStatus. * * Returns: a new #AgsServerStatus * * Since: 3.0.0 */ AgsServerStatus* ags_server_status_new() { AgsServerStatus *server_status; server_status = (AgsServerStatus *) g_object_new(AGS_TYPE_SERVER_STATUS, NULL); return(server_status); } gsequencer-3.1.3/ags/server/security/0000755000175000017500000000000013622252264014613 500000000000000gsequencer-3.1.3/ags/server/security/ags_security_context.c0000644000175000017500000003275713613101102021142 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_security_context_class_init(AgsSecurityContextClass *security_context); void ags_security_context_init(AgsSecurityContext *security_context); void ags_security_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_security_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_security_context_finalize(GObject *gobject); /** * SECTION:ags_security_context * @short_description: current security context * @title: AgsSecurityContext * @section_id: * @include: ags/server/security/ags_security_context.h * * The #AgsSecurityContext is an object to track active server contices. */ enum{ PROP_0, PROP_CERTS, }; static gpointer ags_security_context_parent_class = NULL; GType ags_security_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_security_context = 0; static const GTypeInfo ags_security_context_info = { sizeof (AgsSecurityContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_security_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsSecurityContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_security_context_init, }; ags_type_security_context = g_type_register_static(G_TYPE_OBJECT, "AgsSecurityContext", &ags_security_context_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_security_context); } return g_define_type_id__volatile; } void ags_security_context_class_init(AgsSecurityContextClass *security_context) { GObjectClass *gobject; GParamSpec *param_spec; ags_security_context_parent_class = g_type_class_peek_parent(security_context); /* GObjectClass */ gobject = (GObjectClass *) security_context; gobject->set_property = ags_security_context_set_property; gobject->get_property = ags_security_context_get_property; gobject->finalize = ags_security_context_finalize; /* properties */ /** * AgsSecurityContext:certs: * * The assigned certificates as string. * * Since: 3.0.0 */ param_spec = g_param_spec_string("certs", i18n("certificates as string"), i18n("The certificates as string"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CERTS, param_spec); } void ags_security_context_init(AgsSecurityContext *security_context) { g_rec_mutex_init(&(security_context->obj_mutex)); security_context->certs = NULL; security_context->server_context_umask = (AGS_SECURITY_CONTEXT_RPC_READ | AGS_SECURITY_CONTEXT_RPC_WRITE); security_context->business_group = NULL; security_context->server_context = NULL; } void ags_security_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsSecurityContext *security_context; GRecMutex *security_context_mutex; security_context = AGS_SECURITY_CONTEXT(gobject); /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); switch(prop_id){ case PROP_CERTS: { gchar *certs; certs = g_value_get_string(value); g_rec_mutex_lock(security_context_mutex); security_context->certs = g_strdup(certs); g_rec_mutex_unlock(security_context_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_security_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsSecurityContext *security_context; GRecMutex *security_context_mutex; security_context = AGS_SECURITY_CONTEXT(gobject); /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); switch(prop_id){ case PROP_CERTS: { g_rec_mutex_lock(security_context_mutex); g_value_set_string(value, security_context->certs); g_rec_mutex_unlock(security_context_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_security_context_finalize(GObject *gobject) { AgsSecurityContext *security_context; gchar **strv; security_context = AGS_SECURITY_CONTEXT(gobject); g_free(security_context->certs); /* business group */ if(security_context->business_group != NULL){ strv = security_context->business_group; for(; strv[0] != NULL; strv++){ g_free(strv[0]); } free(security_context->business_group); } /* server context */ if(security_context->server_context != NULL){ strv = security_context->server_context; for(; strv[0] != NULL; strv++){ g_free(strv[0]); } free(security_context->server_context); } /* call parent */ G_OBJECT_CLASS(ags_security_context_parent_class)->finalize(gobject); } /** * ags_security_context_parse_business_group: * @security_context: the #AgsSecurityContext * @xml_doc: the xmlDoc containing groups * @user_uuid: the user's UUID * * Parse @business_group and apply to @security_context. * * Since: 3.0.0 */ void ags_security_context_parse_business_group(AgsSecurityContext *security_context, xmlDoc *xml_doc, gchar *user_uuid) { xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; gchar *xpath; guint i, j; GRecMutex *security_context_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context)){ return; } /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); /* clear business group */ g_rec_mutex_lock(security_context_mutex); if(security_context->business_group != NULL){ gchar **strv; strv = security_context->business_group; for(; strv[0] != NULL; strv++){ g_free(strv[0]); } free(security_context->business_group); security_context->business_group = NULL; } g_rec_mutex_unlock(security_context_mutex); if(xml_doc == NULL || user_uuid == NULL){ return; } /* read server business group name */ xpath = g_strdup_printf("(/ags-server-business-group/ags-srv-group-list/ags-srv-group/ags-srv-group-name)/../ags-srv-group-user-list/ags-srv-group-user[text() = '%s']", user_uuid); g_rec_mutex_lock(security_context_mutex); xpath_context = xmlXPathNewContext(xml_doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0, j = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *group_name; group_name = xmlNodeGetContent(node[i]); if(j == 0){ security_context->business_group = (gchar **) malloc(2 * sizeof(gchar *)); }else{ security_context->business_group = (gchar **) realloc(security_context->business_group, (j + 2) * sizeof(gchar *)); } security_context->business_group[j] = g_strdup(group_name); xmlFree(group_name); j++; } } if(j > 0){ security_context->business_group[j] = NULL; } } g_rec_mutex_unlock(security_context_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } /** * ags_security_context_get_business_group: * @security_context: the #AgsSecurityContext * * Get business group of @security_context. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing business group or %NULL * * Since: 3.0.0 */ gchar** ags_security_context_get_business_group(AgsSecurityContext *security_context) { gchar **business_group; GRecMutex *security_context_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context)){ return(NULL); } /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); /* dup business group */ business_group = NULL; g_rec_mutex_lock(security_context_mutex); if(security_context->business_group != NULL){ business_group = g_strdupv(security_context->business_group); } g_rec_mutex_unlock(security_context_mutex); return(business_group); } /** * ags_security_context_add_server_context: * @security_context: the #AgsSecurityContext * @server_context: the server context * * Add @server_context to @security_context. * * Since: 3.0.0 */ void ags_security_context_add_server_context(AgsSecurityContext *security_context, gchar *server_context) { guint i; GRecMutex *security_context_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || server_context == NULL){ return; } /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); /* add server context */ g_rec_mutex_lock(security_context_mutex); i = 0; if(security_context->server_context != NULL){ i = g_strv_length(security_context->server_context); } if(i == 0){ security_context->server_context = (gchar **) malloc(2 * sizeof(gchar *)); }else{ security_context->server_context = (gchar **) realloc(security_context->server_context, (i + 2) * sizeof(gchar *)); } security_context->server_context[i] = g_strdup(server_context); security_context->server_context[i + 1] = NULL; g_rec_mutex_unlock(security_context_mutex); } /** * ags_security_context_remove_server_context: * @security_context: the #AgsSecurityContext * @server_context: the server context * * Remove @server_context from @security_context. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_security_context_remove_server_context(AgsSecurityContext *security_context, gchar *server_context) { gint position; guint length; guint i, j; GRecMutex *security_context_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || server_context == NULL){ return(FALSE); } /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); /* remove server context */ g_rec_mutex_lock(security_context_mutex); position = ags_strv_index(security_context->server_context, server_context); if(position >= 0){ length = g_strv_length(security_context->server_context); if(length == 1){ g_free(security_context->server_context[0]); free(security_context->server_context); security_context->server_context = NULL; }else{ gchar **strv; strv = (gchar **) malloc(length * sizeof(gchar *)); for(i = 0, j = 0; i < length - 1; i++, j++){ if(i == position){ g_free(security_context->server_context[j]); j++; } strv[i] = security_context->server_context[j]; } strv[i] = NULL; /* free old strv */ free(security_context->server_context); security_context->server_context = strv; } } g_rec_mutex_unlock(security_context_mutex); return(TRUE); } /** * ags_security_context_get_server_context: * @security_context: the #AgsSecurityContext * * Get business group of @security_context. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the string vector containing business group or %NULL * * Since: 3.0.0 */ gchar** ags_security_context_get_server_context(AgsSecurityContext *security_context) { gchar **server_context; GRecMutex *security_context_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context)){ return(NULL); } /* get security context mutex */ security_context_mutex = AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(security_context); /* dup business group */ server_context = NULL; g_rec_mutex_lock(security_context_mutex); if(security_context->server_context != NULL){ server_context = g_strdupv(security_context->server_context); } g_rec_mutex_unlock(security_context_mutex); return(server_context); } /** * ags_security_context_new: * * Create #AgsSecurityContext. * * Returns: the new #AgsSecurityContext instance * * Since: 3.0.0 */ AgsSecurityContext* ags_security_context_new() { AgsSecurityContext *security_context; security_context = (AgsSecurityContext *) g_object_new(AGS_TYPE_SECURITY_CONTEXT, NULL); return(security_context); } gsequencer-3.1.3/ags/server/security/ags_certificate.dtd0000644000175000017500000000171313607210263020342 00000000000000 gsequencer-3.1.3/ags/server/security/ags_authentication_manager.h0000644000175000017500000001135213607210263022245 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTHENTICATION_MANAGER_H__ #define __AGS_AUTHENTICATION_MANAGER_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTHENTICATION_MANAGER (ags_authentication_manager_get_type()) #define AGS_AUTHENTICATION_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTHENTICATION_MANAGER, AgsAuthenticationManager)) #define AGS_AUTHENTICATION_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_AUTHENTICATION_MANAGER, AgsAuthenticationManagerClass)) #define AGS_IS_AUTHENTICATION_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTHENTICATION_MANAGER)) #define AGS_IS_AUTHENTICATION_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTHENTICATION_MANAGER)) #define AGS_AUTHENTICATION_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_AUTHENTICATION_MANAGER, AgsAuthenticationManagerClass)) #define AGS_LOGIN_INFO(ptr) ((AgsLoginInfo *) ptr) #define AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsAuthenticationManager *) obj)->obj_mutex)) #define AGS_AUTHENTICATION_MANAGER_DEFAULT_SESSION_TIMEOUT (2 * G_TIME_SPAN_HOUR) typedef struct _AgsAuthenticationManager AgsAuthenticationManager; typedef struct _AgsAuthenticationManagerClass AgsAuthenticationManagerClass; typedef struct _AgsLoginInfo AgsLoginInfo; struct _AgsAuthenticationManager { GObject gobject; GRecMutex obj_mutex; GList *authentication; gint64 session_timeout; GHashTable *login; }; struct _AgsAuthenticationManagerClass { GObjectClass gobject; }; struct _AgsLoginInfo { gint ref_count; gint active_session_count; gchar *user_uuid; AgsSecurityContext *security_context; }; GType ags_authentication_manager_get_type(void); AgsLoginInfo* ags_login_info_alloc(); void ags_login_info_free(AgsLoginInfo *login_info); void ags_login_info_ref(AgsLoginInfo *login_info); void ags_login_info_unref(AgsLoginInfo *login_info); GList* ags_authentication_manager_get_authentication(AgsAuthenticationManager *authentication_manager); void ags_authentication_manager_add_authentication(AgsAuthenticationManager *authentication_manager, GObject *authentication); void ags_authentication_manager_remove_authentication(AgsAuthenticationManager *authentication_manager, GObject *authentication); gint64 ags_authentication_manager_get_session_timeout(AgsAuthenticationManager *authentication_manager); /* login */ AgsLoginInfo* ags_authentication_manager_lookup_login(AgsAuthenticationManager *authentication_manager, gchar *login); void ags_authentication_manager_insert_login(AgsAuthenticationManager *authentication_manager, gchar *login, AgsLoginInfo *login_info); void ags_authentication_manager_remove_login(AgsAuthenticationManager *authentication_manager, gchar *login); /* */ gboolean ags_authentication_manager_login(AgsAuthenticationManager *authentication_manager, gchar *authentication_module, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token); gboolean ags_authentication_manager_logout(AgsAuthenticationManager *authentication_manager, GObject *security_context, gchar *login, gchar *security_token); gchar* ags_authentication_manager_get_digest(AgsAuthenticationManager *authentication_manager, gchar *authentication_module, gchar *realm, gchar *login, gchar *security_token); gboolean ags_authentication_manager_is_session_active(AgsAuthenticationManager *authentication_manager, GObject *security_context, gchar *user_uuid, gchar *security_token); /* */ AgsAuthenticationManager* ags_authentication_manager_get_instance(); AgsAuthenticationManager* ags_authentication_manager_new(); G_END_DECLS #endif /*__AGS_AUTHENTICATION_MANAGER_H__*/ gsequencer-3.1.3/ags/server/security/ags_password_store_manager.c0000644000175000017500000002337013607210263022302 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include void ags_password_store_manager_class_init(AgsPasswordStoreManagerClass *password_store_manager); void ags_password_store_manager_init (AgsPasswordStoreManager *password_store_manager); void ags_password_store_manager_finalize(GObject *gobject); /** * SECTION:ags_password_store_manager * @short_description: Singleton pattern to organize password stores * @title: AgsPasswordStoreManager * @section_id: * @include: ags/server/security/ags_password_store_manager.h * * The #AgsPasswordStoreManager manages your password stores. */ static gpointer ags_password_store_manager_parent_class = NULL; AgsPasswordStoreManager *ags_password_store_manager = NULL; GType ags_password_store_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_password_store_manager = 0; static const GTypeInfo ags_password_store_manager_info = { sizeof (AgsPasswordStoreManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_password_store_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsPasswordStoreManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_password_store_manager_init, }; ags_type_password_store_manager = g_type_register_static(G_TYPE_OBJECT, "AgsPasswordStoreManager", &ags_password_store_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_password_store_manager); } return g_define_type_id__volatile; } void ags_password_store_manager_class_init(AgsPasswordStoreManagerClass *password_store_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_password_store_manager_parent_class = g_type_class_peek_parent(password_store_manager); /* GObjectClass */ gobject = (GObjectClass *) password_store_manager; gobject->finalize = ags_password_store_manager_finalize; } void ags_password_store_manager_init(AgsPasswordStoreManager *password_store_manager) { g_rec_mutex_init(&(password_store_manager->obj_mutex)); password_store_manager->salt = NULL; password_store_manager->password_store = NULL; } void ags_password_store_manager_finalize(GObject *gobject) { AgsPasswordStoreManager *password_store_manager; password_store_manager = AGS_PASSWORD_STORE_MANAGER(gobject); if(password_store_manager->password_store != NULL){ g_list_free_full(password_store_manager->password_store, g_object_unref); } G_OBJECT_CLASS(ags_password_store_manager_parent_class)->finalize(gobject); } /** * ags_password_store_manager_get_password_store: * @password_store_manager: the #AgsPasswordStoreManager * * Get password_store. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #GObject implementing #AgsPasswordStore * * Since: 3.0.0 */ GList* ags_password_store_manager_get_password_store(AgsPasswordStoreManager *password_store_manager) { GList *password_store; GRecMutex *password_store_manager_mutex; if(!AGS_IS_PASSWORD_STORE_MANAGER(password_store_manager)){ return(NULL); } /* get password_store manager mutex */ password_store_manager_mutex = AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX(password_store_manager); /* get password_store */ g_rec_mutex_lock(password_store_manager_mutex); password_store = g_list_copy_deep(password_store_manager->password_store, g_object_ref, NULL); g_rec_mutex_unlock(password_store_manager_mutex); return(password_store); } /** * ags_password_store_manager_add_password_store: * @password_store_manager: the #AgsPasswordStoreManager * @password_store: the #GObject implementing #AgsPasswordStore * * Add @password_store to @password_store_manager. * * Since: 3.0.0 */ void ags_password_store_manager_add_password_store(AgsPasswordStoreManager *password_store_manager, GObject *password_store) { GRecMutex *password_store_manager_mutex; if(!AGS_IS_PASSWORD_STORE_MANAGER(password_store_manager) || !AGS_IS_PASSWORD_STORE(password_store)){ return; } /* get password_store manager mutex */ password_store_manager_mutex = AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX(password_store_manager); /* add password_store */ g_rec_mutex_lock(password_store_manager_mutex); if(g_list_find(password_store_manager->password_store, password_store) == NULL){ password_store_manager->password_store = g_list_prepend(password_store_manager->password_store, password_store); g_object_ref(password_store); } g_rec_mutex_unlock(password_store_manager_mutex); } /** * ags_password_store_manager_remove_password_store: * @password_store_manager: the #AgsPasswordStoreManager * @password_store: the #GObject implementing #AgsPasswordStore * * Remove @password_store from @password_store_manager. * * Since: 3.0.0 */ void ags_password_store_manager_remove_password_store(AgsPasswordStoreManager *password_store_manager, GObject *password_store) { GRecMutex *password_store_manager_mutex; if(!AGS_IS_PASSWORD_STORE_MANAGER(password_store_manager) || !AGS_IS_PASSWORD_STORE(password_store)){ return; } /* get password_store manager mutex */ password_store_manager_mutex = AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX(password_store_manager); /* remove password_store */ g_rec_mutex_lock(password_store_manager_mutex); if(g_list_find(password_store_manager->password_store, password_store) != NULL){ password_store_manager->password_store = g_list_remove(password_store_manager->password_store, password_store); g_object_unref(password_store); } g_rec_mutex_unlock(password_store_manager_mutex); } /** * ags_password_store_manager_check_password: * @password_store_manager: the #AgsPasswordStoreManager * @user_uuid: the user uuid * @password: the password * * Check @password to be valid for @user_uuid. * * Returns: %TRUE if password matches, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_password_store_manager_check_password(AgsPasswordStoreManager *password_store_manager, gchar *user_uuid, gchar *password) { GList *start_password_store, *password_store; gchar *salt; gchar *encrypted_password; gboolean success; GError *error; GRecMutex *password_store_manager_mutex; if(!AGS_IS_PASSWORD_STORE_MANAGER(password_store_manager) || user_uuid == NULL || password == NULL){ return(FALSE); } /* get password_store manager mutex */ password_store_manager_mutex = AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX(password_store_manager); /* get salt */ g_rec_mutex_lock(password_store_manager_mutex); salt = g_strdup(password_store_manager->salt); g_rec_mutex_unlock(password_store_manager_mutex); /* check password */ password_store = start_password_store = ags_password_store_manager_get_password_store(password_store_manager); success = FALSE; while(password_store != NULL){ gchar *current_password; error = NULL; current_password = ags_password_store_get_password(AGS_PASSWORD_STORE(password_store->data), ags_auth_security_context_get_instance(), user_uuid, NULL, &error); if(error != NULL){ g_critical("%s", error->message); g_error_free(error); } if(salt != NULL){ error = NULL; encrypted_password = ags_password_store_encrypt_password(AGS_PASSWORD_STORE(password_store->data), password, salt, &error); if(error != NULL){ g_critical("%s", error->message); g_error_free(error); } }else{ encrypted_password = g_strdup(password); } success = (current_password != NULL && !g_strcmp0(encrypted_password, current_password)) ? TRUE: FALSE; g_free(encrypted_password); g_free(current_password); if(success){ break; } password_store = password_store->next; } g_list_free_full(start_password_store, g_object_unref); g_free(salt); return(success); } /** * ags_password_store_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsPasswordStoreManager * * Since: 3.0.0 */ AgsPasswordStoreManager* ags_password_store_manager_get_instance() { static GRecMutex mutex; g_mutex_lock(&mutex); if(ags_password_store_manager == NULL){ ags_password_store_manager = ags_password_store_manager_new(); } g_mutex_unlock(&mutex); return(ags_password_store_manager); } /** * ags_password_store_manager_new: * * Creates an #AgsPasswordStoreManager * * Returns: a new #AgsPasswordStoreManager * * Since: 3.0.0 */ AgsPasswordStoreManager* ags_password_store_manager_new() { AgsPasswordStoreManager *password_store_manager; password_store_manager = (AgsPasswordStoreManager *) g_object_new(AGS_TYPE_PASSWORD_STORE_MANAGER, NULL); return(password_store_manager); } gsequencer-3.1.3/ags/server/security/ags_business_group.dtd0000644000175000017500000000160213607210263021124 00000000000000 gsequencer-3.1.3/ags/server/security/ags_xml_certificate.c0000644000175000017500000007156313607210263020703 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_xml_certificate_class_init(AgsXmlCertificateClass *xml_certificate); void ags_xml_certificate_certificate_interface_init(AgsCertificateInterface *certificate); void ags_xml_certificate_init(AgsXmlCertificate *xml_certificate); void ags_xml_certificate_finalize(GObject *gobject); gchar** ags_xml_certificate_get_cert_uuid(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void ags_xml_certificate_set_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *domain, GError **error); gchar* ags_xml_certificate_get_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void ags_xml_certificate_set_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *key_type, GError **error); gchar* ags_xml_certificate_get_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void ags_xml_certificate_set_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *public_key_file, GError **error); gchar* ags_xml_certificate_get_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void ags_xml_certificate_set_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *private_key_file, GError **error); gchar* ags_xml_certificate_get_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); /** * SECTION:ags_xml_certificate * @short_description: certificate by XML file * @title: AgsXmlCertificate * @section_id: * @include: ags/server/security/ags_xml_certificate.h * * The #AgsXmlCertificate is an object to verify certificates. */ static gpointer ags_xml_certificate_parent_class = NULL; GType ags_xml_certificate_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_xml_certificate = 0; static const GTypeInfo ags_xml_certificate_info = { sizeof (AgsXmlCertificateClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_xml_certificate_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsXmlCertificate), 0, /* n_preallocs */ (GInstanceInitFunc) ags_xml_certificate_init, }; static const GInterfaceInfo ags_certificate_interface_info = { (GInterfaceInitFunc) ags_xml_certificate_certificate_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_xml_certificate = g_type_register_static(G_TYPE_OBJECT, "AgsXmlCertificate", &ags_xml_certificate_info, 0); g_type_add_interface_static(ags_type_xml_certificate, AGS_TYPE_CERTIFICATE, &ags_certificate_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_xml_certificate); } return g_define_type_id__volatile; } void ags_xml_certificate_class_init(AgsXmlCertificateClass *xml_certificate) { GObjectClass *gobject; GParamSpec *param_spec; ags_xml_certificate_parent_class = g_type_class_peek_parent(xml_certificate); /* GObjectClass */ gobject = (GObjectClass *) xml_certificate; gobject->finalize = ags_xml_certificate_finalize; } void ags_xml_certificate_certificate_interface_init(AgsCertificateInterface *certificate) { certificate->get_cert_uuid = ags_xml_certificate_get_cert_uuid; certificate->set_domain = ags_xml_certificate_set_domain; certificate->get_domain = ags_xml_certificate_get_domain; certificate->set_key_type = ags_xml_certificate_set_key_type; certificate->get_key_type = ags_xml_certificate_get_key_type; certificate->set_public_key_file = ags_xml_certificate_set_public_key_file; certificate->get_public_key_file = ags_xml_certificate_get_public_key_file; certificate->set_private_key_file = ags_xml_certificate_set_private_key_file; certificate->get_private_key_file = ags_xml_certificate_get_private_key_file; } void ags_xml_certificate_init(AgsXmlCertificate *xml_certificate) { g_rec_mutex_init(&(xml_certificate->obj_mutex)); xml_certificate->filename = NULL; xml_certificate->encoding = NULL; xml_certificate->dtd = NULL; xml_certificate->doc = NULL; xml_certificate->root_node = NULL; } void ags_xml_certificate_finalize(GObject *gobject) { AgsXmlCertificate *xml_certificate; xml_certificate = AGS_XML_CERTIFICATE(gobject); g_free(xml_certificate->filename); g_free(xml_certificate->encoding); g_free(xml_certificate->dtd); if(xml_certificate->doc != NULL){ xmlFreeDoc(xml_certificate->doc); } /* call parent */ G_OBJECT_CLASS(ags_xml_certificate_parent_class)->finalize(gobject); } gchar** ags_xml_certificate_get_cert_uuid(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; gchar *xpath; gchar **cert_uuid; guint i; guint j; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context)){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return(NULL); } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_uuid = NULL; xpath = "/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid"; g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathNodeEval(xml_certificate->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0, j = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *current_user_uuid; current_user_uuid = xmlNodeGetContent(node[i]); if(j == 0){ cert_uuid = (gchar **) malloc(2 * sizeof(gchar *)); }else{ cert_uuid = (gchar **) realloc(cert_uuid, (j + 2) * sizeof(gchar *)); } cert_uuid[j] = g_strdup(current_user_uuid); xmlFree(current_user_uuid); j++; } } if(j > 0){ cert_uuid[j] = NULL; } } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); return(cert_uuid); } void ags_xml_certificate_set_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *domain, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *domain_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return; } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } if(cert_node != NULL){ domain_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-domain", 20)){ domain_node = child; break; } } child = child->next; } if(domain_node == NULL){ domain_node = xmlNewNode(NULL, "ags-srv-cert-domain"); xmlAddChild(cert_node, domain_node); } xmlNodeSetContent(domain_node, domain); } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } gchar* ags_xml_certificate_get_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *domain_node; xmlNode *child; gchar *xpath; gchar *domain; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return(NULL); } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathNodeEval(xml_certificate->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } domain = NULL; if(cert_node != NULL){ domain_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-domain", 20)){ domain_node = child; break; } } child = child->next; } if(domain_node != NULL){ xmlChar *tmp_domain; tmp_domain = xmlNodeGetContent(domain_node); domain = g_strdup(tmp_domain); xmlFree(tmp_domain); } } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); return(domain); } void ags_xml_certificate_set_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *key_type, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *key_type_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return; } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } if(cert_node != NULL){ key_type_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-key-type", 22)){ key_type_node = child; break; } } child = child->next; } if(key_type_node == NULL){ key_type_node = xmlNewNode(NULL, "ags-srv-cert-key-type"); xmlAddChild(cert_node, key_type_node); } xmlNodeSetContent(key_type_node, key_type); } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } gchar* ags_xml_certificate_get_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *key_type_node; xmlNode *child; gchar *xpath; gchar *key_type; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return(NULL); } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathNodeEval(xml_certificate->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } key_type = NULL; if(cert_node != NULL){ key_type_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-key-type", 22)){ key_type_node = child; break; } } child = child->next; } if(key_type_node != NULL){ xmlChar *tmp_key_type; tmp_key_type = xmlNodeGetContent(key_type_node); key_type = g_strdup(tmp_key_type); xmlFree(tmp_key_type); } } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); return(key_type); } void ags_xml_certificate_set_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *public_key_file, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *public_key_file_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return; } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } if(cert_node != NULL){ public_key_file_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-public-key-file", 29)){ public_key_file_node = child; break; } } child = child->next; } if(public_key_file_node == NULL){ public_key_file_node = xmlNewNode(NULL, "ags-srv-cert-public-key-file"); xmlAddChild(cert_node, public_key_file_node); } xmlNodeSetContent(public_key_file_node, public_key_file); } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } gchar* ags_xml_certificate_get_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *public_key_file_node; xmlNode *child; gchar *xpath; gchar *public_key_file; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return(NULL); } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathNodeEval(xml_certificate->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } public_key_file = NULL; if(cert_node != NULL){ public_key_file_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-public-key-file", 29)){ public_key_file_node = child; break; } } child = child->next; } if(public_key_file_node != NULL){ xmlChar *tmp_public_key_file; tmp_public_key_file = xmlNodeGetContent(public_key_file_node); public_key_file = g_strdup(tmp_public_key_file); xmlFree(tmp_public_key_file); } } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); return(public_key_file); } void ags_xml_certificate_set_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *private_key_file, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *private_key_file_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return; } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } if(cert_node != NULL){ private_key_file_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-private-key-file", 30)){ private_key_file_node = child; break; } } child = child->next; } if(private_key_file_node == NULL){ private_key_file_node = xmlNewNode(NULL, "ags-srv-cert-private-key-file"); xmlAddChild(cert_node, private_key_file_node); } xmlNodeSetContent(private_key_file_node, private_key_file); } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } gchar* ags_xml_certificate_get_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsXmlCertificate *xml_certificate; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *cert_node; xmlNode *private_key_file_node; xmlNode *child; gchar *xpath; gchar *private_key_file; guint i; GRecMutex *xml_certificate_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || cert_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_certificate = AGS_XML_CERTIFICATE(certificate); if(xml_certificate->doc == NULL || xml_certificate->root_node == NULL){ return(NULL); } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); cert_node = NULL; xpath = g_strdup_printf("/ags-server-certificate/ags-srv-cert-list/ags-srv-cert/ags-srv-cert-uuid[text() = '%s']", cert_uuid); g_rec_mutex_lock(xml_certificate_mutex); xpath_context = xmlXPathNewContext(xml_certificate->doc); xpath_object = xmlXPathNodeEval(xml_certificate->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ cert_node = node[i]->parent; break; } } } private_key_file = NULL; if(cert_node != NULL){ private_key_file_node = NULL; child = cert_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-cert-private-key-file", 30)){ private_key_file_node = child; break; } } child = child->next; } if(private_key_file_node != NULL){ xmlChar *tmp_private_key_file; tmp_private_key_file = xmlNodeGetContent(private_key_file_node); private_key_file = g_strdup(tmp_private_key_file); xmlFree(tmp_private_key_file); } } g_rec_mutex_unlock(xml_certificate_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); return(private_key_file); } /** * ags_xml_certificate_open_filename: * @xml_certificate: the #AgsXmlCertificate * @filename: the filename * * Open @filename. * * Since: 3.0.0 */ void ags_xml_certificate_open_filename(AgsXmlCertificate *xml_certificate, gchar *filename) { xmlDoc *doc; GRecMutex *xml_certificate_mutex; if(!AGS_IS_XML_CERTIFICATE(xml_certificate) || filename == NULL){ return; } xml_certificate_mutex = AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(xml_certificate); /* open XML */ doc = xmlReadFile(filename, NULL, 0); g_rec_mutex_lock(xml_certificate_mutex); xml_certificate->filename = g_strdup(filename); xml_certificate->doc = doc; if(doc == NULL){ g_warning("AgsXmlCertificate - failed to read XML document %s", filename); }else{ /* get the root node */ xml_certificate->root_node = xmlDocGetRootElement(doc); } g_rec_mutex_unlock(xml_certificate_mutex); } /** * ags_xml_certificate_new: * * Create #AgsXmlCertificate. * * Returns: the new #AgsXmlCertificate instance * * Since: 3.0.0 */ AgsXmlCertificate* ags_xml_certificate_new() { AgsXmlCertificate *xml_certificate; xml_certificate = (AgsXmlCertificate *) g_object_new(AGS_TYPE_XML_CERTIFICATE, NULL); return(xml_certificate); } gsequencer-3.1.3/ags/server/security/ags_authentication.dtd0000644000175000017500000000204413607210263021075 00000000000000 gsequencer-3.1.3/ags/server/security/ags_password_store_manager.h0000644000175000017500000000570313607210263022307 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PASSWORD_STORE_MANAGER_H__ #define __AGS_PASSWORD_STORE_MANAGER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PASSWORD_STORE_MANAGER (ags_password_store_manager_get_type()) #define AGS_PASSWORD_STORE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PASSWORD_STORE_MANAGER, AgsPasswordStoreManager)) #define AGS_PASSWORD_STORE_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_PASSWORD_STORE_MANAGER, AgsPasswordStoreManagerClass)) #define AGS_IS_PASSWORD_STORE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_PASSWORD_STORE_MANAGER)) #define AGS_IS_PASSWORD_STORE_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_PASSWORD_STORE_MANAGER)) #define AGS_PASSWORD_STORE_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_PASSWORD_STORE_MANAGER, AgsPasswordStoreManagerClass)) #define AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsPasswordStoreManager *) obj)->obj_mutex)) typedef struct _AgsPasswordStoreManager AgsPasswordStoreManager; typedef struct _AgsPasswordStoreManagerClass AgsPasswordStoreManagerClass; struct _AgsPasswordStoreManager { GObject gobject; GRecMutex obj_mutex; gchar *salt; GList *password_store; }; struct _AgsPasswordStoreManagerClass { GObjectClass gobject; }; GType ags_password_store_manager_get_type(void); GList* ags_password_store_manager_get_password_store(AgsPasswordStoreManager *password_store_manager); void ags_password_store_manager_add_password_store(AgsPasswordStoreManager *password_store_manager, GObject *password_store); void ags_password_store_manager_remove_password_store(AgsPasswordStoreManager *password_store_manager, GObject *password_store); /* */ gboolean ags_password_store_manager_check_password(AgsPasswordStoreManager *password_store_manager, gchar *user_uuid, gchar *password); /* */ AgsPasswordStoreManager* ags_password_store_manager_get_instance(); AgsPasswordStoreManager* ags_password_store_manager_new(); G_END_DECLS #endif /*__AGS_PASSWORD_STORE_MANAGER_H__*/ gsequencer-3.1.3/ags/server/security/AUTHORS0000644000175000017500000000013313461636434015606 00000000000000Joël Krähemann Yuri Victorovich (tiny change) gsequencer-3.1.3/ags/server/security/ags_password_store.c0000644000175000017500000001445213607210263020611 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include void ags_password_store_base_init(AgsPasswordStoreInterface *ginterface); /** * SECTION:ags_password_store * @short_description: password storage * @title: AgsPasswordStore * @section_id: AgsPasswordStore * @include: ags/server/security/ags_password_store.h * * The #AgsPasswordStore interface gives you password storage. */ GType ags_password_store_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_password_store = 0; static const GTypeInfo ags_password_store_info = { sizeof(AgsPasswordStoreInterface), (GBaseInitFunc) ags_password_store_base_init, NULL, /* base_finalize */ }; ags_type_password_store = g_type_register_static(G_TYPE_INTERFACE, "AgsPasswordStore", &ags_password_store_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_password_store); } return g_define_type_id__volatile; } void ags_password_store_base_init(AgsPasswordStoreInterface *ginterface) { /* empty */ } /** * ags_password_store_set_login_name: * @password_store: the #AgsPasswordStore * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @login_name: the login name * @error: the #GError-struct * * Set login name. * * Since: 3.0.0 */ void ags_password_store_set_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *login_name, GError **error) { AgsPasswordStoreInterface *password_store_interface; g_return_if_fail(AGS_IS_PASSWORD_STORE(password_store)); password_store_interface = AGS_PASSWORD_STORE_GET_INTERFACE(password_store); g_return_if_fail(password_store_interface->set_login_name); password_store_interface->set_login_name(password_store, security_context, user_uuid, security_token, login_name, error); } /** * ags_password_store_get_login_name: * @password_store: the #AgsPasswordStore * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @error: the #GError-struct * * Get login name. * * Returns: (transfer full): the login name * * Since: 3.0.0 */ gchar* ags_password_store_get_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsPasswordStoreInterface *password_store_interface; g_return_val_if_fail(AGS_IS_PASSWORD_STORE(password_store), NULL); password_store_interface = AGS_PASSWORD_STORE_GET_INTERFACE(password_store); g_return_val_if_fail(password_store_interface->get_login_name, NULL); return(password_store_interface->get_login_name(password_store, security_context, user_uuid, security_token, error)); } /** * ags_password_store_set_password: * @password_store: the #AgsPasswordStore * @security_context: the #AgsSecurityContext * @user_uuid: the user UUID * @security_token: the security token * @password: the password * @error: the #GError-struct * * Set password. * * Since: 3.0.0 */ void ags_password_store_set_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *password, GError **error) { AgsPasswordStoreInterface *password_store_interface; g_return_if_fail(AGS_IS_PASSWORD_STORE(password_store)); password_store_interface = AGS_PASSWORD_STORE_GET_INTERFACE(password_store); g_return_if_fail(password_store_interface->set_password); password_store_interface->set_password(password_store, security_context, user_uuid, security_token, password, error); } /** * ags_password_store_get_password: * @password_store: the #AgsPasswordStore * @security_context: the #AgsSecurityContext * @user_uuid: the user UUID * @security_token: the security token * @error: the #GError-struct * * Get password. * * Returns: (transfer full): the password * * Since: 3.0.0 */ gchar* ags_password_store_get_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsPasswordStoreInterface *password_store_interface; g_return_val_if_fail(AGS_IS_PASSWORD_STORE(password_store), NULL); password_store_interface = AGS_PASSWORD_STORE_GET_INTERFACE(password_store); g_return_val_if_fail(password_store_interface->get_password, NULL); return(password_store_interface->get_password(password_store, security_context, user_uuid, security_token, error)); } /** * ags_password_store_encrypt_password: * @password_store: the #AgsPasswordStore * @password: the password * @salt: your salt * @error: the #GError-struct * * Encrypt password. * * Returns: (transfer full): the encrypted bytes * * Since: 3.0.0 */ gchar* ags_password_store_encrypt_password(AgsPasswordStore *password_store, gchar *password, gchar *salt, GError **error) { AgsPasswordStoreInterface *password_store_interface; g_return_val_if_fail(AGS_IS_PASSWORD_STORE(password_store), NULL); password_store_interface = AGS_PASSWORD_STORE_GET_INTERFACE(password_store); g_return_val_if_fail(password_store_interface->encrypt_password, NULL); return(password_store_interface->encrypt_password(password_store, password, salt, error)); } gsequencer-3.1.3/ags/server/security/ags_auth_security_context.h0000644000175000017500000000456513607210263022200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTH_SECURITY_CONTEXT_H__ #define __AGS_AUTH_SECURITY_CONTEXT_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTH_SECURITY_CONTEXT (ags_auth_security_context_get_type()) #define AGS_AUTH_SECURITY_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTH_SECURITY_CONTEXT, AgsAuthSecurityContext)) #define AGS_AUTH_SECURITY_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_AUTH_SECURITY_CONTEXT, AgsAuthSecurityContextClass)) #define AGS_IS_AUTH_SECURITY_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_AUTH_SECURITY_CONTEXT)) #define AGS_IS_AUTH_SECURITY_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_AUTH_SECURITY_CONTEXT)) #define AGS_AUTH_SECURITY_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_AUTH_SECURITY_CONTEXT, AgsAuthSecurityContextClass)) #define AGS_AUTH_SECURITY_CONTEXT_GET_OBJ_MUTEX(obj) (&(((AgsAuthSecurityContext *) obj)->obj_mutex)) typedef struct _AgsAuthSecurityContext AgsAuthSecurityContext; typedef struct _AgsAuthSecurityContextClass AgsAuthSecurityContextClass; struct _AgsAuthSecurityContext { AgsSecurityContext security_context; }; struct _AgsAuthSecurityContextClass { AgsSecurityContextClass security_context; }; GType ags_auth_security_context_get_type(); AgsAuthSecurityContext* ags_auth_security_context_get_instance(); AgsAuthSecurityContext* ags_auth_security_context_new(); G_END_DECLS #endif /*__AGS_AUTH_SECURITY_CONTEXT_H__*/ gsequencer-3.1.3/ags/server/security/ags_certificate_manager.c0000644000175000017500000002513413607210263021506 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include void ags_certificate_manager_class_init(AgsCertificateManagerClass *certificate_manager); void ags_certificate_manager_init (AgsCertificateManager *certificate_manager); void ags_certificate_manager_finalize(GObject *gobject); /** * SECTION:ags_certificate_manager * @short_description: Singleton pattern to organize certificate * @title: AgsCertificateManager * @section_id: * @include: ags/server/security/ags_certificate_manager.h * * The #AgsCertificateManager manages your certificate. */ static gpointer ags_certificate_manager_parent_class = NULL; AgsCertificateManager *ags_certificate_manager = NULL; GType ags_certificate_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_certificate_manager = 0; static const GTypeInfo ags_certificate_manager_info = { sizeof (AgsCertificateManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_certificate_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsCertificateManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_certificate_manager_init, }; ags_type_certificate_manager = g_type_register_static(G_TYPE_OBJECT, "AgsCertificateManager", &ags_certificate_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_certificate_manager); } return g_define_type_id__volatile; } void ags_certificate_manager_class_init(AgsCertificateManagerClass *certificate_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_certificate_manager_parent_class = g_type_class_peek_parent(certificate_manager); /* GObjectClass */ gobject = (GObjectClass *) certificate_manager; gobject->finalize = ags_certificate_manager_finalize; } void ags_certificate_manager_init(AgsCertificateManager *certificate_manager) { g_rec_mutex_init(&(certificate_manager->obj_mutex)); certificate_manager->certificate = NULL; } void ags_certificate_manager_finalize(GObject *gobject) { AgsCertificateManager *certificate_manager; certificate_manager = AGS_CERTIFICATE_MANAGER(gobject); if(certificate_manager->certificate != NULL){ g_list_free_full(certificate_manager->certificate, g_object_unref); } G_OBJECT_CLASS(ags_certificate_manager_parent_class)->finalize(gobject); } /** * ags_certificate_manager_get_certificate: * @certificate_manager: the #AgsCertificateManager * * Get certificate. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #GObject implementing #AgsCertificate * * Since: 3.0.0 */ GList* ags_certificate_manager_get_certificate(AgsCertificateManager *certificate_manager) { GList *certificate; GRecMutex *certificate_manager_mutex; if(!AGS_IS_CERTIFICATE_MANAGER(certificate_manager)){ return(NULL); } /* get certificate manager mutex */ certificate_manager_mutex = AGS_CERTIFICATE_MANAGER_GET_OBJ_MUTEX(certificate_manager); /* get certificate */ g_rec_mutex_lock(certificate_manager_mutex); certificate = g_list_copy_deep(certificate_manager->certificate, g_object_ref, NULL); g_rec_mutex_unlock(certificate_manager_mutex); return(certificate); } /** * ags_certificate_manager_add_certificate: * @certificate_manager: the #AgsCertificateManager * @certificate: the #GObject implementing #AgsCertificate * * Add @certificate to @certificate_manager. * * Since: 3.0.0 */ void ags_certificate_manager_add_certificate(AgsCertificateManager *certificate_manager, GObject *certificate) { GRecMutex *certificate_manager_mutex; if(!AGS_IS_CERTIFICATE_MANAGER(certificate_manager) || !AGS_IS_CERTIFICATE(certificate)){ return; } /* get certificate manager mutex */ certificate_manager_mutex = AGS_CERTIFICATE_MANAGER_GET_OBJ_MUTEX(certificate_manager); /* add certificate */ g_rec_mutex_lock(certificate_manager_mutex); if(g_list_find(certificate_manager->certificate, certificate) == NULL){ certificate_manager->certificate = g_list_prepend(certificate_manager->certificate, certificate); g_object_ref(certificate); } g_rec_mutex_unlock(certificate_manager_mutex); } /** * ags_certificate_manager_remove_certificate: * @certificate_manager: the #AgsCertificateManager * @certificate: the #GObject implementing #AgsCertificate * * Remove @certificate from @certificate_manager. * * Since: 3.0.0 */ void ags_certificate_manager_remove_certificate(AgsCertificateManager *certificate_manager, GObject *certificate) { GRecMutex *certificate_manager_mutex; if(!AGS_IS_CERTIFICATE_MANAGER(certificate_manager) || !AGS_IS_CERTIFICATE(certificate)){ return; } /* get certificate manager mutex */ certificate_manager_mutex = AGS_CERTIFICATE_MANAGER_GET_OBJ_MUTEX(certificate_manager); /* remove certificate */ g_rec_mutex_lock(certificate_manager_mutex); if(g_list_find(certificate_manager->certificate, certificate) != NULL){ certificate_manager->certificate = g_list_remove(certificate_manager->certificate, certificate); g_object_unref(certificate); } g_rec_mutex_unlock(certificate_manager_mutex); } /** * ags_certificate_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsCertificateManager * * Since: 3.0.0 */ AgsCertificateManager* ags_certificate_manager_get_instance() { static GRecMutex mutex; g_mutex_lock(&mutex); if(ags_certificate_manager == NULL){ ags_certificate_manager = ags_certificate_manager_new(); } g_mutex_unlock(&mutex); return(ags_certificate_manager); } /** * ags_certificate_manager_get_key_file: * @certificate_manager: the #AgsCertificateManager * @security_context: the #AgsSecurityContext * @user_uuid: the user's UUID * @security_token: the security token * @domain: the domain to find * @key_type: the key type to find * @public_key_file: (out) (transfer full): return location of public key filename * @private_key_file: (out) (transfer full): return location of private key filename * * Get public and private key file. * * Since: 3.0.0 */ void ags_certificate_manager_get_key_file(AgsCertificateManager *certificate_manager, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *domain, gchar *key_type, gchar **public_key_file, gchar **private_key_file) { GList *start_certificate, *certificate; gchar *current_public_key_file, *current_private_key_file; gboolean success; GError *error; if(public_key_file != NULL){ public_key_file[0] = NULL; } if(private_key_file != NULL){ private_key_file[0] = NULL; } if(!AGS_IS_CERTIFICATE_MANAGER(certificate_manager) || domain == NULL || key_type == NULL){ return; } current_public_key_file = NULL; current_private_key_file = NULL; certificate = start_certificate = ags_certificate_manager_get_certificate(certificate_manager); success = FALSE; while(certificate != NULL){ gchar **tmp_cert_uuid; gchar *tmp_domain, *tmp_key_type; guint i; error = NULL; tmp_cert_uuid = ags_certificate_get_cert_uuid(AGS_CERTIFICATE(certificate->data), security_context, user_uuid, security_token, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(tmp_cert_uuid != NULL){ for(i = 0; !success && tmp_cert_uuid[i] != NULL; i++){ error = NULL; tmp_domain = ags_certificate_get_domain(AGS_CERTIFICATE(certificate->data), security_context, user_uuid, security_token, tmp_cert_uuid[i], &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } error = NULL; tmp_key_type = ags_certificate_get_key_type(AGS_CERTIFICATE(certificate->data), security_context, user_uuid, security_token, tmp_cert_uuid[i], &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(!g_ascii_strcasecmp(domain, tmp_domain) && !g_ascii_strcasecmp(key_type, tmp_key_type)){ success = TRUE; error = NULL; current_public_key_file = ags_certificate_get_public_key_file(AGS_CERTIFICATE(certificate->data), security_context, user_uuid, security_token, tmp_cert_uuid[i], &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } error = NULL; current_private_key_file = ags_certificate_get_private_key_file(AGS_CERTIFICATE(certificate->data), security_context, user_uuid, security_token, tmp_cert_uuid[i], &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } g_free(tmp_domain); g_free(tmp_key_type); } g_strfreev(tmp_cert_uuid); } if(success){ break; } /* iterate */ certificate = certificate->next; } g_list_free_full(start_certificate, (GDestroyNotify) g_object_unref); if(public_key_file != NULL){ public_key_file[0] = current_public_key_file; } if(private_key_file != NULL){ private_key_file[0] = current_private_key_file; } } /** * ags_certificate_manager_new: * * Creates an #AgsCertificateManager * * Returns: a new #AgsCertificateManager * * Since: 3.0.0 */ AgsCertificateManager* ags_certificate_manager_new() { AgsCertificateManager *certificate_manager; certificate_manager = (AgsCertificateManager *) g_object_new(AGS_TYPE_CERTIFICATE_MANAGER, NULL); return(certificate_manager); } gsequencer-3.1.3/ags/server/security/ags_business_group_manager.c0000644000175000017500000001656313607210263022301 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include void ags_business_group_manager_class_init(AgsBusinessGroupManagerClass *business_group_manager); void ags_business_group_manager_init (AgsBusinessGroupManager *business_group_manager); void ags_business_group_manager_finalize(GObject *gobject); /** * SECTION:ags_business_group_manager * @short_description: Singleton pattern to organize business group * @title: AgsBusinessGroupManager * @section_id: * @include: ags/server/security/ags_business_group_manager.h * * The #AgsBusinessGroupManager manages your business group. */ static gpointer ags_business_group_manager_parent_class = NULL; AgsBusinessGroupManager *ags_business_group_manager = NULL; GType ags_business_group_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_business_group_manager = 0; static const GTypeInfo ags_business_group_manager_info = { sizeof (AgsBusinessGroupManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_business_group_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsBusinessGroupManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_business_group_manager_init, }; ags_type_business_group_manager = g_type_register_static(G_TYPE_OBJECT, "AgsBusinessGroupManager", &ags_business_group_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_business_group_manager); } return g_define_type_id__volatile; } void ags_business_group_manager_class_init(AgsBusinessGroupManagerClass *business_group_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_business_group_manager_parent_class = g_type_class_peek_parent(business_group_manager); /* GObjectClass */ gobject = (GObjectClass *) business_group_manager; gobject->finalize = ags_business_group_manager_finalize; } void ags_business_group_manager_init(AgsBusinessGroupManager *business_group_manager) { g_rec_mutex_init(&(business_group_manager->obj_mutex)); business_group_manager->business_group = NULL; } void ags_business_group_manager_finalize(GObject *gobject) { AgsBusinessGroupManager *business_group_manager; business_group_manager = AGS_BUSINESS_GROUP_MANAGER(gobject); if(business_group_manager->business_group != NULL){ g_list_free_full(business_group_manager->business_group, g_object_unref); } G_OBJECT_CLASS(ags_business_group_manager_parent_class)->finalize(gobject); } /** * ags_business_group_manager_get_business_group: * @business_group_manager: the #AgsBusinessGroupManager * * Get business_group. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #GObject implementing #AgsBusinessGroup * * Since: 3.0.0 */ GList* ags_business_group_manager_get_business_group(AgsBusinessGroupManager *business_group_manager) { GList *business_group; GRecMutex *business_group_manager_mutex; if(!AGS_IS_BUSINESS_GROUP_MANAGER(business_group_manager)){ return(NULL); } /* get business_group manager mutex */ business_group_manager_mutex = AGS_BUSINESS_GROUP_MANAGER_GET_OBJ_MUTEX(business_group_manager); /* get business_group */ g_rec_mutex_lock(business_group_manager_mutex); business_group = g_list_copy_deep(business_group_manager->business_group, g_object_ref, NULL); g_rec_mutex_unlock(business_group_manager_mutex); return(business_group); } /** * ags_business_group_manager_add_business_group: * @business_group_manager: the #AgsBusinessGroupManager * @business_group: the #GObject implementing #AgsBusinessGroup * * Add @business_group to @business_group_manager. * * Since: 3.0.0 */ void ags_business_group_manager_add_business_group(AgsBusinessGroupManager *business_group_manager, GObject *business_group) { GRecMutex *business_group_manager_mutex; if(!AGS_IS_BUSINESS_GROUP_MANAGER(business_group_manager) || !AGS_IS_BUSINESS_GROUP(business_group)){ return; } /* get business_group manager mutex */ business_group_manager_mutex = AGS_BUSINESS_GROUP_MANAGER_GET_OBJ_MUTEX(business_group_manager); /* add business_group */ g_rec_mutex_lock(business_group_manager_mutex); if(g_list_find(business_group_manager->business_group, business_group) == NULL){ business_group_manager->business_group = g_list_prepend(business_group_manager->business_group, business_group); g_object_ref(business_group); } g_rec_mutex_unlock(business_group_manager_mutex); } /** * ags_business_group_manager_remove_business_group: * @business_group_manager: the #AgsBusinessGroupManager * @business_group: the #GObject implementing #AgsBusinessGroup * * Remove @business_group from @business_group_manager. * * Since: 3.0.0 */ void ags_business_group_manager_remove_business_group(AgsBusinessGroupManager *business_group_manager, GObject *business_group) { GRecMutex *business_group_manager_mutex; if(!AGS_IS_BUSINESS_GROUP_MANAGER(business_group_manager) || !AGS_IS_BUSINESS_GROUP(business_group)){ return; } /* get business_group manager mutex */ business_group_manager_mutex = AGS_BUSINESS_GROUP_MANAGER_GET_OBJ_MUTEX(business_group_manager); /* remove business_group */ g_rec_mutex_lock(business_group_manager_mutex); if(g_list_find(business_group_manager->business_group, business_group) != NULL){ business_group_manager->business_group = g_list_remove(business_group_manager->business_group, business_group); g_object_unref(business_group); } g_rec_mutex_unlock(business_group_manager_mutex); } /** * ags_business_group_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsBusinessGroupManager * * Since: 3.0.0 */ AgsBusinessGroupManager* ags_business_group_manager_get_instance() { static GRecMutex mutex; g_mutex_lock(&mutex); if(ags_business_group_manager == NULL){ ags_business_group_manager = ags_business_group_manager_new(); } g_mutex_unlock(&mutex); return(ags_business_group_manager); } /** * ags_business_group_manager_new: * * Creates an #AgsBusinessGroupManager * * Returns: a new #AgsBusinessGroupManager * * Since: 3.0.0 */ AgsBusinessGroupManager* ags_business_group_manager_new() { AgsBusinessGroupManager *business_group_manager; business_group_manager = (AgsBusinessGroupManager *) g_object_new(AGS_TYPE_BUSINESS_GROUP_MANAGER, NULL); return(business_group_manager); } gsequencer-3.1.3/ags/server/security/ags_authentication.h0000644000175000017500000000720513607210263020555 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_AUTHENTICATION_H__ #define __AGS_AUTHENTICATION_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_AUTHENTICATION (ags_authentication_get_type()) #define AGS_AUTHENTICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_AUTHENTICATION, AgsAuthentication)) #define AGS_AUTHENTICATION_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_AUTHENTICATION, AgsAuthenticationInterface)) #define AGS_IS_AUTHENTICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_AUTHENTICATION)) #define AGS_IS_AUTHENTICATION_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_AUTHENTICATION)) #define AGS_AUTHENTICATION_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_AUTHENTICATION, AgsAuthenticationInterface)) typedef struct _AgsAuthentication AgsAuthentication; typedef struct _AgsAuthenticationInterface AgsAuthenticationInterface; struct _AgsAuthenticationInterface { GTypeInterface ginterface; gchar** (*get_authentication_module)(AgsAuthentication *authentication); gboolean (*login)(AgsAuthentication *authentication, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token, GError **error); gboolean (*logout)(AgsAuthentication *authentication, GObject *security_context, gchar *login, gchar *security_token, GError **error); gchar* (*generate_token)(AgsAuthentication *authentication, GError **error); gchar* (*get_digest)(AgsAuthentication *authentication, gchar *realm, gchar *login, gchar *security_token, GError **error); gboolean (*is_session_active)(AgsAuthentication *authentication, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); }; GType ags_authentication_get_type(); gchar** ags_authentication_get_authentication_module(AgsAuthentication *authentication); gboolean ags_authentication_login(AgsAuthentication *authentication, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token, GError **error); gboolean ags_authentication_logout(AgsAuthentication *authentication, GObject *security_context, gchar *login, gchar *security_token, GError **error); gchar* ags_authentication_generate_token(AgsAuthentication *authentication, GError **error); gchar* ags_authentication_get_digest(AgsAuthentication *authentication, gchar *realm, gchar *login, gchar *security_token, GError **error); gboolean ags_authentication_is_session_active(AgsAuthentication *authentication, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); G_END_DECLS #endif /*__AGS_AUTHENTICATION_H__*/ gsequencer-3.1.3/ags/server/security/ags_business_group.h0000644000175000017500000000763113607210263020610 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUSINESS_GROUP_H__ #define __AGS_BUSINESS_GROUP_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_BUSINESS_GROUP (ags_business_group_get_type()) #define AGS_BUSINESS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUSINESS_GROUP, AgsBusinessGroup)) #define AGS_BUSINESS_GROUP_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_BUSINESS_GROUP, AgsBusinessGroupInterface)) #define AGS_IS_BUSINESS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_BUSINESS_GROUP)) #define AGS_IS_BUSINESS_GROUP_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_BUSINESS_GROUP)) #define AGS_BUSINESS_GROUP_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_BUSINESS_GROUP, AgsBusinessGroupInterface)) typedef struct _AgsBusinessGroup AgsBusinessGroup; typedef struct _AgsBusinessGroupInterface AgsBusinessGroupInterface; struct _AgsBusinessGroupInterface { GTypeInterface ginterface; gchar** (*get_group_uuid)(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void (*set_group_name)(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar *group_name, GError **error); gchar* (*get_group_name)(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error); void (*set_user)(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar **user, GError **error); gchar** (*get_user)(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error); }; GType ags_business_group_get_type(); gchar** ags_business_group_get_group_uuid(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void ags_business_group_set_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar *group_name, GError **error); gchar* ags_business_group_get_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error); void ags_business_group_set_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar **user, GError **error); gchar** ags_business_group_get_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error); G_END_DECLS #endif /*__AGS_BUSINESS_GROUP_H__*/ gsequencer-3.1.3/ags/server/security/ags_authentication_manager.c0000644000175000017500000005024513607210263022244 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include void ags_authentication_manager_class_init(AgsAuthenticationManagerClass *authentication_manager); void ags_authentication_manager_init (AgsAuthenticationManager *authentication_manager); void ags_authentication_manager_finalize(GObject *gobject); /** * SECTION:ags_authentication_manager * @short_description: Singleton pattern to organize authentication * @title: AgsAuthenticationManager * @section_id: * @include: ags/server/security/ags_authentication_manager.h * * The #AgsAuthenticationManager manages your authentication. */ static gpointer ags_authentication_manager_parent_class = NULL; AgsAuthenticationManager *ags_authentication_manager = NULL; GType ags_authentication_manager_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_authentication_manager = 0; static const GTypeInfo ags_authentication_manager_info = { sizeof (AgsAuthenticationManagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_authentication_manager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAuthenticationManager), 0, /* n_preallocs */ (GInstanceInitFunc) ags_authentication_manager_init, }; ags_type_authentication_manager = g_type_register_static(G_TYPE_OBJECT, "AgsAuthenticationManager", &ags_authentication_manager_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_authentication_manager); } return g_define_type_id__volatile; } void ags_authentication_manager_class_init(AgsAuthenticationManagerClass *authentication_manager) { GObjectClass *gobject; GParamSpec *param_spec; ags_authentication_manager_parent_class = g_type_class_peek_parent(authentication_manager); /* GObjectClass */ gobject = (GObjectClass *) authentication_manager; gobject->finalize = ags_authentication_manager_finalize; } void ags_authentication_manager_init(AgsAuthenticationManager *authentication_manager) { g_rec_mutex_init(&(authentication_manager->obj_mutex)); authentication_manager->authentication = NULL; authentication_manager->session_timeout = AGS_AUTHENTICATION_MANAGER_DEFAULT_SESSION_TIMEOUT; authentication_manager->login = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, ags_login_info_unref); } void ags_authentication_manager_finalize(GObject *gobject) { AgsAuthenticationManager *authentication_manager; authentication_manager = AGS_AUTHENTICATION_MANAGER(gobject); if(authentication_manager->authentication != NULL){ g_list_free_full(authentication_manager->authentication, g_object_unref); } if(authentication_manager->login != NULL){ g_hash_table_destroy(authentication_manager->login); } /* call parent */ G_OBJECT_CLASS(ags_authentication_manager_parent_class)->finalize(gobject); } /** * ags_login_info_alloc: * * Alloc #AgsLoginInfo-struct. * * Returns: (type gpointer) (transfer none): the newly allocated #AgsLoginInfo-struct * * Since: 3.0.0 */ AgsLoginInfo* ags_login_info_alloc() { AgsLoginInfo *login_info; login_info = (AgsLoginInfo *) malloc(sizeof(AgsLoginInfo)); login_info->ref_count = 1; login_info->active_session_count = 0; login_info->user_uuid = NULL; login_info->security_context = NULL; return(login_info); } /** * ags_login_info_free: * @login_info: (type gpointer): the #AgsLoginInfo-struct * * Free @login_info. * * Since: 3.0.0 */ void ags_login_info_free(AgsLoginInfo *login_info) { if(login_info == NULL){ return; } g_free(login_info->user_uuid); if(login_info->security_context != NULL){ g_object_unref(login_info->security_context); } } /** * ags_login_info_ref: * @login_info: (type gpointer): the #AgsLoginInfo-struct * * Increase ref-count of @login_info. * * Since: 3.0.0 */ void ags_login_info_ref(AgsLoginInfo *login_info) { if(login_info == NULL){ return; } login_info->ref_count += 1; } /** * ags_login_info_unref: * @login_info: (type gpointer): the #AgsLoginInfo-struct * * Decrease ref-count of @login_info and free it if ref-count drops to 0. * * Since: 3.0.0 */ void ags_login_info_unref(AgsLoginInfo *login_info) { if(login_info == NULL){ return; } login_info->ref_count -= 1; if(login_info->ref_count <= 0){ ags_login_info_free(login_info); } } /** * ags_authentication_manager_get_authentication: * @authentication_manager: the #AgsAuthenticationManager * * Get authentication. * * Returns: (element-type GObject) (transfer full): the #GList-struct containing #GObject implementing #AgsAuthentication * * Since: 3.0.0 */ GList* ags_authentication_manager_get_authentication(AgsAuthenticationManager *authentication_manager) { GList *authentication; GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager)){ return(NULL); } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* get authentication */ g_rec_mutex_lock(authentication_manager_mutex); authentication = g_list_copy_deep(authentication_manager->authentication, g_object_ref, NULL); g_rec_mutex_unlock(authentication_manager_mutex); return(authentication); } /** * ags_authentication_manager_add_authentication: * @authentication_manager: the #AgsAuthenticationManager * @authentication: the #GObject implementing #AgsAuthentication * * Add @authentication to @authentication_manager. * * Since: 3.0.0 */ void ags_authentication_manager_add_authentication(AgsAuthenticationManager *authentication_manager, GObject *authentication) { GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || !AGS_IS_AUTHENTICATION(authentication)){ return; } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* add authentication */ g_rec_mutex_lock(authentication_manager_mutex); if(g_list_find(authentication_manager->authentication, authentication) == NULL){ authentication_manager->authentication = g_list_prepend(authentication_manager->authentication, authentication); g_object_ref(authentication); } g_rec_mutex_unlock(authentication_manager_mutex); } /** * ags_authentication_manager_remove_authentication: * @authentication_manager: the #AgsAuthenticationManager * @authentication: the #GObject implementing #AgsAuthentication * * Remove @authentication from @authentication_manager. * * Since: 3.0.0 */ void ags_authentication_manager_remove_authentication(AgsAuthenticationManager *authentication_manager, GObject *authentication) { GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || !AGS_IS_AUTHENTICATION(authentication)){ return; } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* remove authentication */ g_rec_mutex_lock(authentication_manager_mutex); if(g_list_find(authentication_manager->authentication, authentication) != NULL){ authentication_manager->authentication = g_list_remove(authentication_manager->authentication, authentication); g_object_unref(authentication); } g_rec_mutex_unlock(authentication_manager_mutex); } /** * ags_authentication_manager_get_session_timeout: * @authentication_manager: the #AgsAuthenticationManager * * Get session timeout. * * Returns: the session timeout * * Since: 3.0.0 */ gint64 ags_authentication_manager_get_session_timeout(AgsAuthenticationManager *authentication_manager) { gint64 session_timeout; GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager)){ return(0); } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* get sesssion timeout */ g_rec_mutex_lock(authentication_manager_mutex); session_timeout = authentication_manager->session_timeout; g_rec_mutex_unlock(authentication_manager_mutex); return(session_timeout); } /** * ags_authentication_manager_lookup_login: * @authentication_manager: the #AgsAuthenticationManager * @login: the login * * Lookup @login. * * Returns: (type gpointer) (transfer none): the user #AgsLoginInfo-struct or %NULL * * Since: 3.0.0 */ AgsLoginInfo* ags_authentication_manager_lookup_login(AgsAuthenticationManager *authentication_manager, gchar *login) { AgsLoginInfo *login_info; GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || login == NULL){ return(NULL); } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* lookup login */ g_rec_mutex_lock(authentication_manager_mutex); login_info = g_hash_table_lookup(authentication_manager->login, login); if(login_info != NULL){ ags_login_info_ref(login_info); } g_rec_mutex_unlock(authentication_manager_mutex); return(login_info); } /** * ags_authentication_manager_insert_login: * @authentication_manager: the #AgsAuthenticationManager * @login: the login * @login_info: the #AgsLoginInfo-struct * * Insert @login as key and @login_info as its value. * * Since: 3.0.0 */ void ags_authentication_manager_insert_login(AgsAuthenticationManager *authentication_manager, gchar *login, AgsLoginInfo *login_info) { GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || login == NULL || login_info == NULL){ return; } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* insert login and user uuid */ g_rec_mutex_lock(authentication_manager_mutex); ags_login_info_ref(login_info); g_hash_table_insert(authentication_manager->login, g_strdup(login), login_info); g_rec_mutex_unlock(authentication_manager_mutex); } /** * ags_authentication_manager_remove_login: * @authentication_manager: the #AgsAuthenticationManager * @login: the login * * Remove @login. * * Since: 3.0.0 */ void ags_authentication_manager_remove_login(AgsAuthenticationManager *authentication_manager, gchar *login) { GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || login == NULL){ return; } /* get authentication manager mutex */ authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* remove login */ g_rec_mutex_lock(authentication_manager_mutex); g_hash_table_remove(authentication_manager->login, login); g_rec_mutex_unlock(authentication_manager_mutex); } /** * ags_authentication_manager_login: * @authentication_manager: the #AgsAuthenticationManager * @authentication_module: the authentication module * @login: the login * @password: the password * @user_uuid: (out) (transfer full): return location of user UUID * @security_token: (out) (transfer full): return location of security token * * Login. * * Returns: %TRUE if login was successful, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_authentication_manager_login(AgsAuthenticationManager *authentication_manager, gchar *authentication_module, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token) { AgsSecurityContext *current_security_context; GList *start_authentication, *authentication; gchar *current_security_token, *current_user_uuid; gboolean success; GError *error; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || login == NULL || password == NULL){ return(FALSE); } authentication = start_authentication = ags_authentication_manager_get_authentication(authentication_manager); success = FALSE; if(user_uuid != NULL){ user_uuid[0] = NULL; } if(security_token != NULL){ security_token[0] = NULL; } current_user_uuid = NULL; current_security_token = NULL; while(authentication != NULL){ gchar **strv; strv = ags_authentication_get_authentication_module(AGS_AUTHENTICATION(authentication->data)); if(g_strv_contains(strv, authentication_module)){ error = NULL; success = ags_authentication_login(AGS_AUTHENTICATION(authentication->data), login, password, ¤t_user_uuid, ¤t_security_token, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(success){ if(user_uuid != NULL){ user_uuid[0] = current_user_uuid; } if(security_token != NULL){ security_token[0] = current_security_token; } break; } } authentication = authentication->next; } g_list_free_full(start_authentication, g_object_unref); return(success); } /** * ags_authentication_manager_logout: * @authentication_manager: the #AgsAuthenticationManager * @security_context: the #AgsSecurityContext * @login: the login * @security_token: the security token * * Logout. * * Returns: %TRUE if logout was successful, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_authentication_manager_logout(AgsAuthenticationManager *authentication_manager, GObject *security_context, gchar *login, gchar *security_token) { AgsSecurityContext *current_security_context; AgsLoginInfo *login_info; GList *start_authentication, *authentication; gchar *user_uuid; gboolean is_session_active; GRecMutex *authentication_manager_mutex; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || login == NULL || security_token == NULL){ return(FALSE); } authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); login_info = ags_authentication_manager_lookup_login(authentication_manager, login); user_uuid = NULL; is_session_active = FALSE; if(login_info != NULL){ g_rec_mutex_lock(authentication_manager_mutex); user_uuid = g_strdup(login_info->user_uuid); g_rec_mutex_unlock(authentication_manager_mutex); }else{ return(FALSE); } authentication = start_authentication = ags_authentication_manager_get_authentication(authentication_manager); while(authentication != NULL){ GError *error; error = NULL; is_session_active = ags_authentication_is_session_active(AGS_AUTHENTICATION(authentication->data), security_context, user_uuid, security_token, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(is_session_active){ error = NULL; ags_authentication_logout(AGS_AUTHENTICATION(authentication->data), security_context, login, security_token, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } break; } authentication = authentication->next; } g_list_free_full(start_authentication, g_object_unref); ags_login_info_unref(login_info); g_free(user_uuid); return(is_session_active); } /** * ags_authentication_manager_get_digest: * @authentication_manager: the #AgsAuthenticationManager * @authentication_module: the authentication module * @realm: the realm * @login: the login * @security_token: the security token * * Get digest of @login. * * Returns: (transfer full): the digest as string, or %NULL if not available * * Since: 3.0.0 */ gchar* ags_authentication_manager_get_digest(AgsAuthenticationManager *authentication_manager, gchar *authentication_module, gchar *realm, gchar *login, gchar *security_token) { GList *start_authentication, *authentication; gchar *current_digest; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || login == NULL || security_token == NULL){ return(NULL); } current_digest = NULL; authentication = start_authentication = ags_authentication_manager_get_authentication(authentication_manager); while(authentication != NULL){ if(g_strv_contains(ags_authentication_get_authentication_module(AGS_AUTHENTICATION(authentication->data)), authentication_module)){ GError *error; error = NULL; current_digest = ags_authentication_get_digest(AGS_AUTHENTICATION(authentication->data), realm, login, security_token, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } break; } authentication = authentication->next; } g_list_free_full(start_authentication, g_object_unref); return(current_digest); } /** * ags_authentication_manager_is_session_active: * @authentication_manager: the #AgsAuthenticationManager * @security_context: the security context * @user_uuid: the user's UUID * @security_token: the security token * * Check if session is active. * * Returns: %TRUE if active, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_authentication_manager_is_session_active(AgsAuthenticationManager *authentication_manager, GObject *security_context, gchar *user_uuid, gchar *security_token) { GList *start_authentication, *authentication; gboolean is_session_active; if(!AGS_IS_AUTHENTICATION_MANAGER(authentication_manager) || user_uuid == NULL){ return(FALSE); } is_session_active = FALSE; authentication = start_authentication = ags_authentication_manager_get_authentication(authentication_manager); while(authentication != NULL){ GError *error; error = NULL; is_session_active = ags_authentication_is_session_active(AGS_AUTHENTICATION(authentication->data), security_context, user_uuid, security_token, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } if(is_session_active){ break; } authentication = authentication->next; } g_list_free_full(start_authentication, g_object_unref); return(is_session_active); } /** * ags_authentication_manager_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsAuthenticationManager * * Since: 3.0.0 */ AgsAuthenticationManager* ags_authentication_manager_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_authentication_manager == NULL){ ags_authentication_manager = ags_authentication_manager_new(); } g_mutex_unlock(&mutex); return(ags_authentication_manager); } /** * ags_authentication_manager_new: * * Creates an #AgsAuthenticationManager * * Returns: a new #AgsAuthenticationManager * * Since: 3.0.0 */ AgsAuthenticationManager* ags_authentication_manager_new() { AgsAuthenticationManager *authentication_manager; authentication_manager = (AgsAuthenticationManager *) g_object_new(AGS_TYPE_AUTHENTICATION_MANAGER, NULL); return(authentication_manager); } gsequencer-3.1.3/ags/server/security/ags_xml_business_group.h0000644000175000017500000000453413607210263021467 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_XML_BUSINESS_GROUP_H__ #define __AGS_XML_BUSINESS_GROUP_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_XML_BUSINESS_GROUP (ags_xml_business_group_get_type()) #define AGS_XML_BUSINESS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_XML_BUSINESS_GROUP, AgsXmlBusinessGroup)) #define AGS_XML_BUSINESS_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_XML_BUSINESS_GROUP, AgsXmlBusinessGroupClass)) #define AGS_IS_XML_BUSINESS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_XML_BUSINESS_GROUP)) #define AGS_IS_XML_BUSINESS_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_XML_BUSINESS_GROUP)) #define AGS_XML_BUSINESS_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_XML_BUSINESS_GROUP, AgsXmlBusinessGroupClass)) #define AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(obj) (&(((AgsXmlBusinessGroup *) obj)->obj_mutex)) typedef struct _AgsXmlBusinessGroup AgsXmlBusinessGroup; typedef struct _AgsXmlBusinessGroupClass AgsXmlBusinessGroupClass; struct _AgsXmlBusinessGroup { GObject gobject; GRecMutex obj_mutex; gchar *filename; gchar *encoding; gchar *dtd; xmlDoc *doc; xmlNode *root_node; }; struct _AgsXmlBusinessGroupClass { GObjectClass gobject; }; GType ags_xml_business_group_get_type(); void ags_xml_business_group_open_filename(AgsXmlBusinessGroup *xml_business_group, gchar *filename); AgsXmlBusinessGroup* ags_xml_business_group_new(); G_END_DECLS #endif /*__AGS_XML_BUSINESS_GROUP_H__*/ gsequencer-3.1.3/ags/server/security/ags_password_store.dtd0000644000175000017500000000145513607210263021141 00000000000000 gsequencer-3.1.3/ags/server/security/ags_xml_password_store.c0000644000175000017500000004631713607210263021476 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . * * Yuri Victorovich (tiny change) - provided FreeBSD and * DragonFly macros. */ #include #include #include #include #include #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__DragonFly__) && !defined(AGS_W32API) #define __USE_GNU #define _GNU_SOURCE #include #endif #include #include #include #include #include #include #include void ags_xml_password_store_class_init(AgsXmlPasswordStoreClass *xml_password_store); void ags_xml_password_store_password_store_interface_init(AgsPasswordStoreInterface *password_store); void ags_xml_password_store_init(AgsXmlPasswordStore *xml_password_store); void ags_xml_password_store_finalize(GObject *gobject); gchar* ags_xml_password_store_get_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void ags_xml_password_store_set_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *login_name, GError **error); gchar* ags_xml_password_store_get_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user, gchar *security_token, GError **error); void ags_xml_password_store_set_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user, gchar *security_token, gchar *password, GError **error); char* ags_xml_password_store_encrypt_password(AgsPasswordStore *password_store, gchar *password, gchar *salt, GError **error); /** * SECTION:ags_xml_password_store * @short_description: password store by XML file * @title: AgsXmlPasswordStore * @section_id: * @include: ags/server/security/ags_xml_password_store.h * * The #AgsXmlPasswordStore is an object to keep passwords. */ static gpointer ags_xml_password_store_parent_class = NULL; GType ags_xml_password_store_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_xml_password_store = 0; static const GTypeInfo ags_xml_password_store_info = { sizeof (AgsXmlPasswordStoreClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_xml_password_store_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsXmlPasswordStore), 0, /* n_preallocs */ (GInstanceInitFunc) ags_xml_password_store_init, }; static const GInterfaceInfo ags_password_store_interface_info = { (GInterfaceInitFunc) ags_xml_password_store_password_store_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_xml_password_store = g_type_register_static(G_TYPE_OBJECT, "AgsXmlPasswordStore", &ags_xml_password_store_info, 0); g_type_add_interface_static(ags_type_xml_password_store, AGS_TYPE_PASSWORD_STORE, &ags_password_store_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_xml_password_store); } return g_define_type_id__volatile; } void ags_xml_password_store_class_init(AgsXmlPasswordStoreClass *xml_password_store) { GObjectClass *gobject; GParamSpec *param_spec; ags_xml_password_store_parent_class = g_type_class_peek_parent(xml_password_store); /* GObjectClass */ gobject = (GObjectClass *) xml_password_store; gobject->finalize = ags_xml_password_store_finalize; } void ags_xml_password_store_password_store_interface_init(AgsPasswordStoreInterface *password_store) { password_store->get_login_name = ags_xml_password_store_get_login_name; password_store->set_login_name = ags_xml_password_store_set_login_name; password_store->get_password = ags_xml_password_store_get_password; password_store->set_password = ags_xml_password_store_set_password; password_store->encrypt_password = ags_xml_password_store_encrypt_password; } void ags_xml_password_store_init(AgsXmlPasswordStore *xml_password_store) { g_rec_mutex_init(&(xml_password_store->obj_mutex)); xml_password_store->filename = NULL; xml_password_store->encoding = NULL; xml_password_store->dtd = NULL; xml_password_store->doc = NULL; xml_password_store->root_node = NULL; } void ags_xml_password_store_finalize(GObject *gobject) { AgsXmlPasswordStore *xml_password_store; xml_password_store = AGS_XML_PASSWORD_STORE(gobject); g_free(xml_password_store->filename); g_free(xml_password_store->encoding); g_free(xml_password_store->dtd); if(xml_password_store->doc != NULL){ xmlFreeDoc(xml_password_store->doc); } /* call parent */ G_OBJECT_CLASS(ags_xml_password_store_parent_class)->finalize(gobject); } void ags_xml_password_store_set_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *login, GError **error) { AgsXmlPasswordStore *xml_password_store; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *user_node; xmlNode *login_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_password_store_mutex; /* authentication */ if(!AGS_IS_SECURITY_CONTEXT(security_context) || user_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_password_store = AGS_XML_PASSWORD_STORE(password_store); if(xml_password_store->doc == NULL || xml_password_store->root_node == NULL){ return; } xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); user_node = NULL; xpath = g_strdup_printf("/ags-server-password-store/ags-srv-user-list/ags-srv-user/ags-srv-user-uuid[text() = '%s']", user_uuid); g_rec_mutex_lock(xml_password_store_mutex); xpath_context = xmlXPathNewContext(xml_password_store->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ user_node = node[i]->parent; break; } } } g_rec_mutex_unlock(xml_password_store_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); if(user_node != NULL){ login_node = NULL; child = user_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-user-login", 19)){ login_node = child; break; } } child = child->next; } if(login_node == NULL){ login_node = xmlNewNode(NULL, "ags-srv-user-login"); xmlAddChild(user_node, login_node); } xmlNodeSetContent(login_node, login); } } gchar* ags_xml_password_store_get_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsXmlPasswordStore *xml_password_store; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *user_node; xmlNode *login_node; xmlNode *child; gchar *xpath; gchar *login; guint i; GRecMutex *xml_password_store_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || user_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_password_store = AGS_XML_PASSWORD_STORE(password_store); if(xml_password_store->doc == NULL || xml_password_store->root_node == NULL){ return(NULL); } xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); user_node = NULL; xpath = g_strdup_printf("/ags-server-password-store/ags-srv-user-list/ags-srv-user/ags-srv-user-uuid[text() = '%s']", user_uuid); g_rec_mutex_lock(xml_password_store_mutex); xpath_context = xmlXPathNewContext(xml_password_store->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ user_node = node[i]->parent; break; } } } g_rec_mutex_unlock(xml_password_store_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); login = NULL; if(user_node != NULL){ login_node = NULL; child = user_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-user-login", 19)){ login_node = child; break; } } child = child->next; } if(login_node != NULL){ xmlChar *tmp_login; tmp_login = xmlNodeGetContent(login_node); login = g_strdup(tmp_login); xmlFree(tmp_login); } } return(login); } void ags_xml_password_store_set_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *password, GError **error) { AgsXmlPasswordStore *xml_password_store; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *user_node; xmlNode *password_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_password_store_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || user_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_password_store = AGS_XML_PASSWORD_STORE(password_store); if(xml_password_store->doc == NULL || xml_password_store->root_node == NULL){ return; } xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); user_node = NULL; xpath = g_strdup_printf("/ags-server-password-store/ags-srv-user-list/ags-srv-user/ags-srv-user-uuid[text() = '%s']", user_uuid); g_rec_mutex_lock(xml_password_store_mutex); xpath_context = xmlXPathNewContext(xml_password_store->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ user_node = node[i]->parent; break; } } } if(user_node != NULL){ password_node = NULL; child = user_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-user-password", 22)){ password_node = child; break; } } child = child->next; } if(password_node == NULL){ password_node = xmlNewNode(NULL, "ags-srv-user-password"); xmlAddChild(user_node, password_node); } xmlNodeSetContent(password_node, password); } g_rec_mutex_unlock(xml_password_store_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } gchar* ags_xml_password_store_get_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsXmlPasswordStore *xml_password_store; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *user_node; xmlNode *password_node; xmlNode *child; gchar *xpath; gchar *password; guint i; GRecMutex *xml_password_store_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || user_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_password_store = AGS_XML_PASSWORD_STORE(password_store); if(xml_password_store->doc == NULL || xml_password_store->root_node == NULL){ return(NULL); } xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); user_node = NULL; xpath = g_strdup_printf("/ags-server-password-store/ags-srv-user-list/ags-srv-user/ags-srv-user-uuid[text() = '%s']", user_uuid); g_rec_mutex_lock(xml_password_store_mutex); xpath_context = xmlXPathNewContext(xml_password_store->doc); xpath_object = xmlXPathNodeEval(xml_password_store->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ user_node = node[i]->parent; break; } } } password = NULL; if(user_node != NULL){ password_node = NULL; child = user_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-user-password", 22)){ password_node = child; break; } } child = child->next; } if(password_node != NULL){ xmlChar *tmp_password; tmp_password = xmlNodeGetContent(password_node); password = g_strdup(tmp_password); xmlFree(tmp_password); } } g_rec_mutex_unlock(xml_password_store_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); return(password); } gchar* ags_xml_password_store_encrypt_password(AgsPasswordStore *password_store, gchar *password, gchar *salt, GError **error) { #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__DragonFly__) && !defined(AGS_W32API) struct crypt_data *data; #endif gchar *password_hash; #if 0 // !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__DragonFly__) && !defined(AGS_W32API) data = (struct crypt_data *) malloc(sizeof(struct crypt_data)); data->initialized = 0; password_hash = (gchar *) malloc((CRYPT_OUTPUT_SIZE + 1) * sizeof(gchar)); crypt_r(password, salt, data); memcpy(password_hash, data->output, CRYPT_OUTPUT_SIZE * sizeof(gchar)); password_hash[CRYPT_OUTPUT_SIZE] = '\0'; free(data); #else password_hash = crypt(password, salt); #endif return(password_hash); } /** * ags_xml_password_store_open_filename: * @xml_password_store: the #AgsXmlPasswordStore * @filename: the filename * * Open @filename. * * Since: 3.0.0 */ void ags_xml_password_store_open_filename(AgsXmlPasswordStore *xml_password_store, gchar *filename) { xmlDoc *doc; GRecMutex *xml_password_store_mutex; if(!AGS_IS_XML_PASSWORD_STORE(xml_password_store) || filename == NULL){ return; } xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); /* open XML */ doc = xmlReadFile(filename, NULL, 0); g_rec_mutex_lock(xml_password_store_mutex); xml_password_store->filename = g_strdup(filename); xml_password_store->doc = doc; if(doc == NULL){ g_warning("AgsXmlPasswordStore - failed to read XML document %s", filename); }else{ /* get the root node */ xml_password_store->root_node = xmlDocGetRootElement(doc); } g_rec_mutex_unlock(xml_password_store_mutex); } /** * ags_xml_password_store_find_login: * @xml_password_store: the #AgsXmlPasswordStore * @login: the login * * Find ags-srv-user xmlNode containing @login. * * Returns: (transfer none): the matching xmlNode or %NULL * * Since: 3.0.0 */ xmlNode* ags_xml_password_store_find_login(AgsXmlPasswordStore *xml_password_store, gchar *login) { xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *user_node; gchar *xpath; guint i; GRecMutex *xml_password_store_mutex; if(!AGS_IS_XML_PASSWORD_STORE(xml_password_store) || login == NULL){ return(NULL); } xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); g_rec_mutex_lock(xml_password_store_mutex); /* retrieve user node */ xpath = g_strdup_printf("(/ags-server-password-store/ags-srv-user-list/ags-srv-user)/ags-srv-user-login[text() = '%s']", login); /* Create xpath evaluation context */ xpath_context = xmlXPathNewContext(xml_password_store->doc); if(xpath_context == NULL) { g_rec_mutex_unlock(xml_password_store_mutex); g_warning("Error: unable to create new XPath context"); return(NULL); } /* Evaluate xpath expression */ xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object == NULL) { g_rec_mutex_unlock(xml_password_store_mutex); g_warning("Error: unable to evaluate xpath expression"); xmlXPathFreeContext(xpath_context); return(NULL); } /* find node */ node = xpath_object->nodesetval->nodeTab; user_node = NULL; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ user_node = node[i]; break; } } g_rec_mutex_unlock(xml_password_store_mutex); /* free xpath and return */ g_free(xpath); return(user_node); } /** * ags_xml_password_store_new: * * Create #AgsXmlPasswordStore. * * Returns: the new #AgsXmlPasswordStore instance * * Since: 3.0.0 */ AgsXmlPasswordStore* ags_xml_password_store_new() { AgsXmlPasswordStore *xml_password_store; xml_password_store = (AgsXmlPasswordStore *) g_object_new(AGS_TYPE_XML_PASSWORD_STORE, NULL); return(xml_password_store); } gsequencer-3.1.3/ags/server/security/ags_password_store.h0000644000175000017500000000734513607210263020621 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_PASSWORD_STORE_H__ #define __AGS_PASSWORD_STORE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_PASSWORD_STORE (ags_password_store_get_type()) #define AGS_PASSWORD_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_PASSWORD_STORE, AgsPasswordStore)) #define AGS_PASSWORD_STORE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_PASSWORD_STORE, AgsPasswordStoreInterface)) #define AGS_IS_PASSWORD_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_PASSWORD_STORE)) #define AGS_IS_PASSWORD_STORE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_PASSWORD_STORE)) #define AGS_PASSWORD_STORE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_PASSWORD_STORE, AgsPasswordStoreInterface)) typedef struct _AgsPasswordStore AgsPasswordStore; typedef struct _AgsPasswordStoreInterface AgsPasswordStoreInterface; struct _AgsPasswordStoreInterface { GTypeInterface ginterface; void (*set_login_name)(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *login_name, GError **error); gchar* (*get_login_name)(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void (*set_password)(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *password, GError **error); gchar* (*get_password)(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); gchar* (*encrypt_password)(AgsPasswordStore *password_store, gchar *password, gchar *salt, GError **error); }; GType ags_password_store_get_type(); void ags_password_store_set_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *login_name, GError **error); gchar* ags_password_store_get_login_name(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void ags_password_store_set_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *password, GError **error); gchar* ags_password_store_get_password(AgsPasswordStore *password_store, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); gchar* ags_password_store_encrypt_password(AgsPasswordStore *password_store, gchar *password, gchar *salt, GError **error); G_END_DECLS #endif /*__AGS_PASSWORD_STORE_H__*/ gsequencer-3.1.3/ags/server/security/ags_business_group.c0000644000175000017500000001620713607210263020602 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include void ags_business_group_base_init(AgsBusinessGroupInterface *ginterface); /** * SECTION:ags_business_group * @short_description: base group permissions * @title: AgsBusinessGroup * @section_id: AgsBusinessGroup * @include: ags/server/security/ags_business_group.h * * The #AgsBusinessGroup interface gives you base group permissions. */ GType ags_business_group_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_business_group = 0; static const GTypeInfo ags_business_group_info = { sizeof(AgsBusinessGroupInterface), (GBaseInitFunc) ags_business_group_base_init, NULL, /* base_finalize */ }; ags_type_business_group = g_type_register_static(G_TYPE_INTERFACE, "AgsBusinessGroup", &ags_business_group_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_business_group); } return g_define_type_id__volatile; } void ags_business_group_base_init(AgsBusinessGroupInterface *ginterface) { /* empty */ } /** * ags_business_group_get_group_uuid: * @business_group: the #AgsBusinessGroup * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @error: the #GError-struct * * Get group UUID as string vector. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the group UUIDs as %NULL terminated string array * * Since: 3.0.0 */ gchar** ags_business_group_get_group_uuid(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsBusinessGroupInterface *business_group_interface; g_return_val_if_fail(AGS_IS_BUSINESS_GROUP(business_group), NULL); business_group_interface = AGS_BUSINESS_GROUP_GET_INTERFACE(business_group); g_return_val_if_fail(business_group_interface->get_group_uuid, NULL); return(business_group_interface->get_group_uuid(business_group, security_context, user_uuid, security_token, error)); } /** * ags_business_group_set_group_name: * @business_group: the #AgsBusinessGroup * @security_context: the #AgsSecurityContext * @user_uuid: the user's UUID * @security_token: the security token * @group_uuid: the group's UUID * @group_name: the business group's name to set * @error: the #GError-struct * * Set business group name. * * Since: 3.0.0 */ void ags_business_group_set_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar *group_name, GError **error) { AgsBusinessGroupInterface *business_group_interface; g_return_if_fail(AGS_IS_BUSINESS_GROUP(business_group)); business_group_interface = AGS_BUSINESS_GROUP_GET_INTERFACE(business_group); g_return_if_fail(business_group_interface->set_group_name); business_group_interface->set_group_name(business_group, security_context, user_uuid, security_token, group_uuid, group_name, error); } /** * ags_business_group_get_group_name: * @business_group: the #AgsBusinessGroup * @security_context: the #AgsSecurityContext * @user_uuid: the user's UUID * @security_token: the security token * @group_uuid: the group's UUID * @error: the #GError-struct * * Get business group name. * * Returns: the business group's name as string * * Since: 3.0.0 */ gchar* ags_business_group_get_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error) { AgsBusinessGroupInterface *business_group_interface; g_return_val_if_fail(AGS_IS_BUSINESS_GROUP(business_group), NULL); business_group_interface = AGS_BUSINESS_GROUP_GET_INTERFACE(business_group); g_return_val_if_fail(business_group_interface->get_group_name, NULL); return(business_group_interface->get_group_name(business_group, security_context, user_uuid, security_token, group_uuid, error)); } /** * ags_business_group_set_user: * @business_group: the #AgsBusinessGroup * @security_context: the #AgsSecurityContext * @user_uuid: the user's UUID * @security_token: the security token * @group_uuid: the business group's UUID * @user: (element-type utf8) (array zero-terminated=1): the string array containing user names * @error: the #GError-struct * * Set business group of user names as %NULL terminated string array. * * Since: 3.0.0 */ void ags_business_group_set_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar **user, GError **error) { AgsBusinessGroupInterface *business_group_interface; g_return_if_fail(AGS_IS_BUSINESS_GROUP(business_group)); business_group_interface = AGS_BUSINESS_GROUP_GET_INTERFACE(business_group); g_return_if_fail(business_group_interface->set_user); business_group_interface->set_user(business_group, security_context, user_uuid, security_token, group_uuid, user, error); } /** * ags_business_group_get_user: * @business_group: the #AgsBusinessGroup * @security_context: the #AgsSecurityContext * @user_uuid: the user's UUID * @security_token: the security token * @group_uuid: the business group's UUID * @error: the #GError-struct * * Get business group name as %NULL terminated string array. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the business group's user names as string vector * * Since: 3.0.0 */ gchar** ags_business_group_get_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error) { AgsBusinessGroupInterface *business_group_interface; g_return_val_if_fail(AGS_IS_BUSINESS_GROUP(business_group), NULL); business_group_interface = AGS_BUSINESS_GROUP_GET_INTERFACE(business_group); g_return_val_if_fail(business_group_interface->get_user, NULL); return(business_group_interface->get_user(business_group, security_context, user_uuid, security_token, group_uuid, error)); } gsequencer-3.1.3/ags/server/security/ags_xml_authentication.c0000644000175000017500000007062513607210263021436 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_xml_authentication_class_init(AgsXmlAuthenticationClass *xml_authentication); void ags_xml_authentication_authentication_interface_init(AgsAuthenticationInterface *authentication); void ags_xml_authentication_init(AgsXmlAuthentication *xml_authentication); void ags_xml_authentication_finalize(GObject *gobject); gchar** ags_xml_authentication_get_authentication_module(AgsAuthentication *authentication); gboolean ags_xml_authentication_login(AgsAuthentication *authentication, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token, GError **error); gboolean ags_xml_authentication_logout(AgsAuthentication *authentication, GObject *security_context, gchar *login, gchar *security_token, GError **error); gchar* ags_xml_authentication_generate_token(AgsAuthentication *authentication, GError **error); gchar* ags_xml_authentication_get_digest(AgsAuthentication *authentication, gchar *realm, gchar *login, gchar *security_token, GError **error); gboolean ags_xml_authentication_is_session_active(AgsAuthentication *authentication, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); /** * SECTION:ags_xml_authentication * @short_description: authentication by XML file * @title: AgsXmlAuthentication * @section_id: * @include: ags/server/security/ags_xml_authentication.h * * The #AgsXmlAuthentication is an object to authenticate to Advanced Gtk+ Sequencer's * server. */ static gpointer ags_xml_authentication_parent_class = NULL; GType ags_xml_authentication_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_xml_authentication = 0; static const GTypeInfo ags_xml_authentication_info = { sizeof (AgsXmlAuthenticationClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_xml_authentication_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsXmlAuthentication), 0, /* n_preallocs */ (GInstanceInitFunc) ags_xml_authentication_init, }; static const GInterfaceInfo ags_authentication_interface_info = { (GInterfaceInitFunc) ags_xml_authentication_authentication_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_xml_authentication = g_type_register_static(G_TYPE_OBJECT, "AgsXmlAuthentication", &ags_xml_authentication_info, 0); g_type_add_interface_static(ags_type_xml_authentication, AGS_TYPE_AUTHENTICATION, &ags_authentication_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_xml_authentication); } return g_define_type_id__volatile; } void ags_xml_authentication_class_init(AgsXmlAuthenticationClass *xml_authentication) { GObjectClass *gobject; GParamSpec *param_spec; ags_xml_authentication_parent_class = g_type_class_peek_parent(xml_authentication); /* GObjectClass */ gobject = (GObjectClass *) xml_authentication; gobject->finalize = ags_xml_authentication_finalize; } void ags_xml_authentication_authentication_interface_init(AgsAuthenticationInterface *authentication) { authentication->get_authentication_module = ags_xml_authentication_get_authentication_module; authentication->login = ags_xml_authentication_login; authentication->logout = ags_xml_authentication_logout; authentication->generate_token = ags_xml_authentication_generate_token; authentication->get_digest = ags_xml_authentication_get_digest; authentication->is_session_active = ags_xml_authentication_is_session_active; } void ags_xml_authentication_init(AgsXmlAuthentication *xml_authentication) { g_rec_mutex_init(&(xml_authentication->obj_mutex)); xml_authentication->filename = NULL; xml_authentication->encoding = NULL; xml_authentication->dtd = NULL; xml_authentication->doc = NULL; xml_authentication->root_node = NULL; } void ags_xml_authentication_finalize(GObject *gobject) { AgsXmlAuthentication *xml_authentication; xml_authentication = AGS_XML_AUTHENTICATION(gobject); g_free(xml_authentication->filename); g_free(xml_authentication->encoding); g_free(xml_authentication->dtd); if(xml_authentication->doc != NULL){ xmlFreeDoc(xml_authentication->doc); } /* call parent */ G_OBJECT_CLASS(ags_xml_authentication_parent_class)->finalize(gobject); } gchar** ags_xml_authentication_get_authentication_module(AgsAuthentication *authentication) { static gchar **authentication_module = NULL; static GMutex mutex; g_mutex_lock(&mutex); if(authentication_module == NULL){ authentication_module = (gchar **) malloc(4 * sizeof(gchar *)); authentication_module[0] = "ags-basic-authentication"; authentication_module[1] = "ags-digest-authentication"; authentication_module[2] = "ags-xml-authentication"; authentication_module[3] = NULL; } g_mutex_unlock(&mutex); return(authentication_module); } gboolean ags_xml_authentication_login(AgsAuthentication *authentication, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token, GError **error) { AgsAuthenticationManager *authentication_manager; AgsPasswordStoreManager *password_store_manager; AgsXmlAuthentication *xml_authentication; AgsXmlPasswordStore *xml_password_store; AgsSecurityContext *security_context; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *auth_node; xmlNode *user_node; xmlNode *child; GList *start_password_store, *password_store; gchar *current_user_uuid; gchar *current_security_token; gchar *xpath; guint i; gboolean success; GRecMutex *xml_authentication_mutex; GRecMutex *xml_password_store_mutex; if(user_uuid != NULL){ user_uuid[0] = NULL; } if(security_token != NULL){ security_token[0] = NULL; } if(login == NULL || password == NULL){ return(FALSE); } xml_authentication = AGS_XML_AUTHENTICATION(authentication); if(xml_authentication->doc == NULL || xml_authentication->root_node == NULL){ return(FALSE); } password_store_manager = ags_password_store_manager_get_instance(); security_context = NULL; current_user_uuid = NULL; current_security_token = NULL; /* password store */ xml_password_store = NULL; password_store = start_password_store = ags_password_store_manager_get_password_store(password_store_manager); while(password_store != NULL){ if(AGS_IS_XML_PASSWORD_STORE(password_store->data)){ xml_password_store = password_store->data; break; } password_store = password_store->next; } /* uuid */ user_node = NULL; if(xml_password_store != NULL){ xml_password_store_mutex = AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(xml_password_store); xpath = g_strdup_printf("/ags-server-password-store/ags-srv-user-list/ags-srv-user/ags-srv-user-login[text() = '%s']", login); g_rec_mutex_lock(xml_password_store_mutex); xpath_context = xmlXPathNewContext(xml_password_store->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ user_node = node[i]->parent; break; } } } g_rec_mutex_unlock(xml_password_store_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } g_list_free_full(start_password_store, g_object_unref); if(user_node != NULL){ g_rec_mutex_lock(xml_password_store_mutex); child = user_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-user-uuid", 18)){ xmlChar *tmp_user_uuid; tmp_user_uuid = xmlNodeGetContent(child); current_user_uuid = g_strdup(tmp_user_uuid); xmlFree(tmp_user_uuid); break; } } child = child->next; } g_rec_mutex_unlock(xml_password_store_mutex); } success = FALSE; if(current_user_uuid != NULL){ success = ags_password_store_manager_check_password(password_store_manager, current_user_uuid, password); } if(success){ /* session */ auth_node = NULL; xml_authentication_mutex = AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(xml_authentication); xpath = g_strdup_printf("/ags-server-authentication/ags-srv-auth-list/ags-srv-auth/ags-srv-user-uuid[text() = '%s']", current_user_uuid); g_rec_mutex_lock(xml_authentication_mutex); xpath_context = xmlXPathNewContext(xml_authentication->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ auth_node = node[i]->parent; break; } } } g_rec_mutex_unlock(xml_authentication_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); /* login info */ if(auth_node != NULL){ AgsLoginInfo *login_info; xmlNode *auth_group_list_node; authentication_manager = ags_authentication_manager_get_instance(); /* get business group */ auth_group_list_node = NULL; child = auth_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-group-list", 24)){ auth_group_list_node = child; break; } } child = child->next; } /* login info */ login_info = ags_authentication_manager_lookup_login(authentication_manager, login); if(login_info == NULL){ AgsBusinessGroupManager *business_group_manager; GList *start_business_group, *business_group; business_group_manager = ags_business_group_manager_get_instance(); /* login info */ login_info = ags_login_info_alloc(); login_info->active_session_count = 1; login_info->user_uuid = g_strdup(current_user_uuid); /* security context */ security_context = login_info->security_context = ags_security_context_new(); /* parse business group */ business_group = start_business_group = ags_business_group_manager_get_business_group(business_group_manager); while(business_group != NULL){ if(AGS_IS_XML_BUSINESS_GROUP(business_group->data)){ GRecMutex *xml_business_group_mutex; xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(business_group->data); g_rec_mutex_lock(xml_business_group_mutex); ags_security_context_parse_business_group(login_info->security_context, AGS_XML_BUSINESS_GROUP(business_group->data)->doc, current_user_uuid); g_rec_mutex_unlock(xml_business_group_mutex); } business_group = business_group->next; } /* insert login */ ags_authentication_manager_insert_login(authentication_manager, login, login_info); ags_login_info_unref(login_info); }else{ login_info->active_session_count += 1; } } /* session */ if(auth_node != NULL){ xmlNode *session_list_node; xmlNode *group_list_node; xmlNode *session_node; xmlNode *group_node; gchar **business_group; session_list_node = NULL; session_node = NULL; g_rec_mutex_lock(xml_authentication_mutex); child = auth_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-session-list", 26)){ session_list_node = child; break; } } child = child->next; } if(session_list_node == NULL){ session_list_node = xmlNewNode(NULL, "ags-srv-auth-session-list"); xmlAddChild(auth_node, session_list_node); } if(session_list_node != NULL){ session_node = xmlNewNode(NULL, "ags-srv-auth-session"); xmlAddChild(session_list_node, session_node); current_security_token = g_uuid_string_random(); xmlNodeSetContent(session_node, current_security_token); } /* session */ if(session_node != NULL){ GDateTime *date_time; gchar *str; date_time = g_date_time_new_now_utc(); #if 0 str = g_date_time_format_iso8601(date_time); #else str = g_date_time_format(date_time, "%Y-%m-%dT%H:%M:%SZ"); #endif xmlNewProp(session_node, "last-active", str); g_date_time_unref(date_time); g_free(str); } g_rec_mutex_unlock(xml_authentication_mutex); /* persist groups */ group_list_node = NULL; group_node = NULL; business_group = ags_security_context_get_business_group(security_context); if(business_group != NULL){ g_rec_mutex_lock(xml_authentication_mutex); child = auth_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-group-list", 26)){ group_list_node = child; break; } } child = child->next; } if(group_list_node == NULL){ group_list_node = xmlNewNode(NULL, "ags-srv-auth-group-list"); xmlAddChild(auth_node, group_list_node); } if(group_list_node != NULL){ gchar **iter; iter = business_group; for(; iter[0] != NULL; iter++){ group_node = xmlNewNode(NULL, "ags-srv-auth-group"); xmlAddChild(group_list_node, group_node); xmlNodeSetContent(group_node, iter[0]); } } g_rec_mutex_unlock(xml_authentication_mutex); g_strfreev(business_group); } } } if(current_user_uuid == NULL || current_security_token == NULL){ success = FALSE; } if(user_uuid != NULL){ user_uuid[0] = current_user_uuid; } if(security_token != NULL){ security_token[0] = current_security_token; } return(success); } gboolean ags_xml_authentication_logout(AgsAuthentication *authentication, GObject *security_context, gchar *login, gchar *security_token, GError **error) { AgsAuthenticationManager *authentication_manager; AgsPasswordStoreManager *password_store_manager; AgsXmlAuthentication *xml_authentication; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *auth_node; xmlNode *child; AgsLoginInfo *login_info; GList *start_password_store, *password_store; gchar *current_user_uuid; gchar *xpath; guint i; gboolean is_session_active; GRecMutex *authentication_manager_mutex; GRecMutex *xml_authentication_mutex; if(login == NULL || security_token == NULL){ return(FALSE); } xml_authentication = AGS_XML_AUTHENTICATION(authentication); if(xml_authentication->doc == NULL || xml_authentication->root_node == NULL){ return(FALSE); } xml_authentication_mutex = AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(xml_authentication); current_user_uuid = NULL; is_session_active = FALSE; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); /* get login info */ login_info = ags_authentication_manager_lookup_login(authentication_manager, login); if(login_info != NULL){ g_rec_mutex_lock(authentication_manager_mutex); current_user_uuid = g_strdup(login_info->user_uuid); g_rec_mutex_unlock(authentication_manager_mutex); }else{ return(FALSE); } is_session_active = ags_authentication_manager_is_session_active(authentication_manager, security_context, current_user_uuid, security_token); if(!is_session_active){ g_free(current_user_uuid); return(FALSE); } /* session */ auth_node = NULL; xml_authentication_mutex = AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(xml_authentication); xpath = g_strdup_printf("/ags-server-authentication/ags-srv-auth-list/ags-srv-auth/ags-srv-user-uuid[text() = '%s']", current_user_uuid); g_rec_mutex_lock(xml_authentication_mutex); xpath_context = xmlXPathNewContext(xml_authentication->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ auth_node = node[i]->parent; break; } } } g_rec_mutex_unlock(xml_authentication_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); if(auth_node != NULL){ xmlNode *session_list_node; xmlNode *session_node; session_list_node = NULL; session_node = NULL; g_rec_mutex_lock(xml_authentication_mutex); /* find session list */ child = auth_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-session-list", 26)){ session_list_node = child; break; } } child = child->next; } /* find session */ if(session_list_node != NULL){ child = session_list_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-session", 21)){ xmlChar *current_security_token; current_security_token = xmlNodeGetContent(child); if(!g_strcmp0(security_token, current_security_token)){ session_node = child; } xmlFree(current_security_token); if(session_node != NULL){ break; } } } child = child->next; } } if(session_node != NULL){ xmlUnlinkNode(session_node); xmlFreeNode(session_node); } g_rec_mutex_unlock(xml_authentication_mutex); /* login info - decrement active session count */ g_rec_mutex_lock(authentication_manager_mutex); login_info->active_session_count -= 1; if(login_info->active_session_count <= 0){ ags_authentication_manager_remove_login(authentication_manager, login); } g_rec_mutex_unlock(authentication_manager_mutex); } ags_login_info_unref(login_info); g_free(current_user_uuid); return(is_session_active); } gchar* ags_xml_authentication_generate_token(AgsAuthentication *authentication, GError **error) { return(g_uuid_string_random()); } gchar* ags_xml_authentication_get_digest(AgsAuthentication *authentication, gchar *realm, gchar *login, gchar *security_token, GError **error) { AgsPasswordStoreManager *password_store_manager; AgsXmlAuthentication *xml_authentication; AgsXmlPasswordStore *xml_password_store; GList *start_password_store, *password_store; gchar *password; gchar *digest; GError *this_error; if(realm == NULL || login == NULL || security_token == NULL){ return(NULL); } xml_authentication = AGS_XML_AUTHENTICATION(authentication); password_store_manager = ags_password_store_manager_get_instance(); /* password store */ xml_password_store = NULL; password_store = start_password_store = ags_password_store_manager_get_password_store(password_store_manager); while(password_store != NULL){ if(AGS_IS_XML_PASSWORD_STORE(password_store->data)){ xml_password_store = password_store->data; break; } password_store = password_store->next; } digest = NULL; if(xml_password_store != NULL){ this_error = NULL; password = ags_password_store_get_password(AGS_PASSWORD_STORE(xml_password_store), NULL, login, security_token, &this_error); if(this_error != NULL){ g_warning("%s", this_error->message); g_error_free(this_error); } digest = soup_auth_domain_digest_encode_password(login, realm, password); g_free(password); } return(digest); } gboolean ags_xml_authentication_is_session_active(AgsAuthentication *authentication, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsXmlAuthentication *xml_authentication; AgsAuthenticationManager *authentication_manager; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *auth_node; xmlNode *child; GList *start_password_store, *password_store; gchar *xpath; guint i; gboolean success; GRecMutex *authentication_manager_mutex; GRecMutex *xml_authentication_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || user_uuid == NULL || security_token == NULL){ return(FALSE); } xml_authentication = AGS_XML_AUTHENTICATION(authentication); if(xml_authentication->doc == NULL || xml_authentication->root_node == NULL){ return(FALSE); } xml_authentication_mutex = AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(xml_authentication); success = FALSE; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); auth_node = NULL; xpath = g_strdup_printf("/ags-server-authentication/ags-srv-auth-list/ags-srv-auth/ags-srv-user-uuid[text() = '%s']", user_uuid); g_rec_mutex_lock(xml_authentication_mutex); xpath_context = xmlXPathNewContext(xml_authentication->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ auth_node = node[i]->parent; break; } } } g_rec_mutex_unlock(xml_authentication_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); if(auth_node != NULL){ xmlNode *session_list_node; xmlNode *session_node; session_list_node = NULL; session_node = NULL; g_rec_mutex_lock(xml_authentication_mutex); /* find session list */ child = auth_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-session-list", 26)){ session_list_node = child; break; } } child = child->next; } /* find session */ if(session_list_node != NULL){ child = session_list_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-auth-session", 21)){ xmlChar *current_security_token; current_security_token = xmlNodeGetContent(child); if(!g_strcmp0(security_token, current_security_token)){ session_node = child; } xmlFree(current_security_token); if(session_node != NULL){ break; } } } child = child->next; } } if(session_node != NULL){ GDateTime *date_time, *last_active; gchar *str; gint64 session_timeout; date_time = g_date_time_new_now_utc(); str = xmlGetProp(session_node, "last-active"); last_active = g_date_time_new_from_iso8601(str, NULL); xmlFree(str); session_timeout = ags_authentication_manager_get_session_timeout(authentication_manager); if(g_date_time_to_unix(last_active) + session_timeout > g_date_time_to_unix(date_time)){ success = TRUE; } g_date_time_unref(date_time); g_date_time_unref(last_active); } } return(success); } /** * ags_xml_authentication_open_filename: * @xml_authentication: the #AgsXmlAuthentication * @filename: the filename * * Open @filename. * * Since: 3.0.0 */ void ags_xml_authentication_open_filename(AgsXmlAuthentication *xml_authentication, gchar *filename) { xmlDoc *doc; GRecMutex *xml_authentication_mutex; if(!AGS_IS_XML_AUTHENTICATION(xml_authentication) || filename == NULL){ return; } xml_authentication_mutex = AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(xml_authentication); /* open XML */ doc = xmlReadFile(filename, NULL, 0); g_rec_mutex_lock(xml_authentication_mutex); xml_authentication->filename = g_strdup(filename); xml_authentication->doc = doc; if(doc == NULL){ g_warning("AgsXmlAuthentication - failed to read XML document %s", filename); }else{ /* get the root node */ xml_authentication->root_node = xmlDocGetRootElement(doc); } g_rec_mutex_unlock(xml_authentication_mutex); } /** * ags_xml_authentication_find_user_uuid: * @xml_authentication: the #AgsXmlAuthentication * @user_uuid: the user UUID * * Find ags-srv-auth xmlNode containing @user_uuid. * * Returns: (transfer none): the matching xmlNode or %NULL * * Since: 3.0.0 */ xmlNode* ags_xml_authentication_find_user_uuid(AgsXmlAuthentication *xml_authentication, gchar *user_uuid) { xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *auth_node; gchar *xpath; guint i; GRecMutex *xml_authentication_mutex; if(!AGS_IS_XML_AUTHENTICATION(xml_authentication) || user_uuid == NULL){ return(NULL); } xml_authentication_mutex = AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(xml_authentication); /* retrieve auth node */ xpath = g_strdup_printf("(/ags-server-authentication/ags-srv-auth-list/ags-srv-auth)/ags-srv-user-uuid[content()='%s']", user_uuid); g_rec_mutex_lock(xml_authentication_mutex); /* Create xpath evaluation context */ xpath_context = xmlXPathNewContext(xml_authentication->doc); if(xpath_context == NULL){ g_rec_mutex_unlock(xml_authentication_mutex); g_warning("Error: unable to create new XPath context"); return(NULL); } /* Evaluate xpath expression */ xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object == NULL){ g_rec_mutex_unlock(xml_authentication_mutex); g_warning("Error: unable to evaluate xpath expression"); xmlXPathFreeContext(xpath_context); return(NULL); } /* find node */ node = xpath_object->nodesetval->nodeTab; auth_node = NULL; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ auth_node = node[i]; break; } } g_rec_mutex_unlock(xml_authentication_mutex); /* free xpath and return */ g_free(xpath); return(auth_node); } /** * ags_xml_authentication_new: * * Create #AgsXmlAuthentication. * * Returns: the new #AgsXmlAuthentication instance * * Since: 3.0.0 */ AgsXmlAuthentication* ags_xml_authentication_new() { AgsXmlAuthentication *xml_authentication; xml_authentication = (AgsXmlAuthentication *) g_object_new(AGS_TYPE_XML_AUTHENTICATION, NULL); return(xml_authentication); } gsequencer-3.1.3/ags/server/security/ags_xml_business_group.c0000644000175000017500000004475013607210263021466 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include void ags_xml_business_group_class_init(AgsXmlBusinessGroupClass *xml_business_group); void ags_xml_business_group_business_group_interface_init(AgsBusinessGroupInterface *business_group); void ags_xml_business_group_init(AgsXmlBusinessGroup *xml_business_group); void ags_xml_business_group_finalize(GObject *gobject); gchar** ags_xml_business_group_get_group_uuid(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void ags_xml_business_group_set_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar *group_name, GError **error); gchar* ags_xml_business_group_get_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error); void ags_xml_business_group_set_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar **user, GError **error); gchar** ags_xml_business_group_get_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error); /** * SECTION:ags_xml_business_group * @short_description: password store by XML file * @title: AgsXmlBusinessGroup * @section_id: * @include: ags/server/security/ags_xml_business_group.h * * The #AgsXmlBusinessGroup is an object to keep passwords. */ static gpointer ags_xml_business_group_parent_class = NULL; GType ags_xml_business_group_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_xml_business_group = 0; static const GTypeInfo ags_xml_business_group_info = { sizeof (AgsXmlBusinessGroupClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_xml_business_group_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsXmlBusinessGroup), 0, /* n_preallocs */ (GInstanceInitFunc) ags_xml_business_group_init, }; static const GInterfaceInfo ags_business_group_interface_info = { (GInterfaceInitFunc) ags_xml_business_group_business_group_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_xml_business_group = g_type_register_static(G_TYPE_OBJECT, "AgsXmlBusinessGroup", &ags_xml_business_group_info, 0); g_type_add_interface_static(ags_type_xml_business_group, AGS_TYPE_BUSINESS_GROUP, &ags_business_group_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_xml_business_group); } return g_define_type_id__volatile; } void ags_xml_business_group_class_init(AgsXmlBusinessGroupClass *xml_business_group) { GObjectClass *gobject; GParamSpec *param_spec; ags_xml_business_group_parent_class = g_type_class_peek_parent(xml_business_group); /* GObjectClass */ gobject = (GObjectClass *) xml_business_group; gobject->finalize = ags_xml_business_group_finalize; } void ags_xml_business_group_business_group_interface_init(AgsBusinessGroupInterface *business_group) { business_group->get_group_uuid = ags_xml_business_group_get_group_uuid; business_group->get_group_name = ags_xml_business_group_get_group_name; business_group->set_group_name = ags_xml_business_group_set_group_name; business_group->get_user = ags_xml_business_group_get_user; business_group->set_user = ags_xml_business_group_set_user; } void ags_xml_business_group_init(AgsXmlBusinessGroup *xml_business_group) { g_rec_mutex_init(&(xml_business_group->obj_mutex)); xml_business_group->filename = NULL; xml_business_group->encoding = NULL; xml_business_group->dtd = NULL; xml_business_group->doc = NULL; xml_business_group->root_node = NULL; } void ags_xml_business_group_finalize(GObject *gobject) { AgsXmlBusinessGroup *xml_business_group; xml_business_group = AGS_XML_BUSINESS_GROUP(gobject); g_free(xml_business_group->filename); g_free(xml_business_group->encoding); g_free(xml_business_group->dtd); if(xml_business_group->doc != NULL){ xmlFreeDoc(xml_business_group->doc); } /* call parent */ G_OBJECT_CLASS(ags_xml_business_group_parent_class)->finalize(gobject); } gchar** ags_xml_business_group_get_group_uuid(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsXmlBusinessGroup *xml_business_group; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; gchar *xpath; gchar **group_uuid; guint i; guint j; GRecMutex *xml_business_group_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context)){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_business_group = AGS_XML_BUSINESS_GROUP(business_group); if(xml_business_group->doc == NULL || xml_business_group->root_node == NULL){ return(NULL); } xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(xml_business_group); group_uuid = NULL; xpath = "/ags-server-business-group/ags-srv-group-list/ags-srv-group/ags-srv-group-uuid"; g_rec_mutex_lock(xml_business_group_mutex); xpath_context = xmlXPathNewContext(xml_business_group->doc); xpath_object = xmlXPathNodeEval(xml_business_group->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0, j = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *current_user_uuid; current_user_uuid = xmlNodeGetContent(node[i]); if(j == 0){ group_uuid = (gchar **) malloc(2 * sizeof(gchar *)); }else{ group_uuid = (gchar **) realloc(group_uuid, (j + 2) * sizeof(gchar *)); } group_uuid[j] = g_strdup(current_user_uuid); xmlFree(current_user_uuid); j++; } } if(j > 0){ group_uuid[j] = NULL; } } g_rec_mutex_unlock(xml_business_group_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); return(group_uuid); } void ags_xml_business_group_set_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar *group_name, GError **error) { AgsXmlBusinessGroup *xml_business_group; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *group_node; xmlNode *group_name_node; xmlNode *child; gchar *xpath; guint i; GRecMutex *xml_business_group_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || group_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_business_group = AGS_XML_BUSINESS_GROUP(business_group); if(xml_business_group->doc == NULL || xml_business_group->root_node == NULL){ return; } xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(xml_business_group); group_node = NULL; xpath = g_strdup_printf("/ags-server-business-group/ags-srv-group-list/ags-srv-group/ags-srv-group-uuid[text() = '%s']", group_uuid); g_rec_mutex_lock(xml_business_group_mutex); xpath_context = xmlXPathNewContext(xml_business_group->doc); xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ group_node = node[i]->parent; break; } } } if(group_node != NULL){ group_name_node = NULL; child = group_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-group-name", 21)){ group_name_node = child; break; } } child = child->next; } if(group_name_node == NULL){ group_name_node = xmlNewNode(NULL, "ags-srv-group-name"); xmlAddChild(group_node, group_name_node); } xmlNodeSetContent(group_name_node, group_name); } g_rec_mutex_unlock(xml_business_group_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); } gchar* ags_xml_business_group_get_group_name(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error) { AgsXmlBusinessGroup *xml_business_group; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *group_node; xmlNode *group_name_node; xmlNode *child; gchar *xpath; gchar *group_name; guint i; GRecMutex *xml_business_group_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || group_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_business_group = AGS_XML_BUSINESS_GROUP(business_group); if(xml_business_group->doc == NULL || xml_business_group->root_node == NULL){ return(NULL); } xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(xml_business_group); group_node = NULL; xpath = g_strdup_printf("/ags-server-business-group/ags-srv-group-list/ags-srv-group/ags-srv-group-uuid[text() = '%s']", group_uuid); g_rec_mutex_lock(xml_business_group_mutex); xpath_context = xmlXPathNewContext(xml_business_group->doc); xpath_object = xmlXPathNodeEval(xml_business_group->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ group_node = node[i]->parent; break; } } } group_name = NULL; if(group_node != NULL){ group_name_node = NULL; child = group_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-group-name", 21)){ group_name_node = child; break; } } child = child->next; } if(group_name_node != NULL){ xmlChar *tmp_group_name; tmp_group_name = xmlNodeGetContent(group_name_node); group_name = g_strdup(tmp_group_name); xmlFree(tmp_group_name); } } g_rec_mutex_unlock(xml_business_group_mutex); xmlXPathFreeObject(xpath_object); xmlXPathFreeContext(xpath_context); g_free(xpath); return(group_name); } void ags_xml_business_group_set_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, gchar **user, GError **error) { AgsXmlBusinessGroup *xml_business_group; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; xmlNode *group_node; xmlNode *user_list_node; xmlNode *user_node; xmlNode *child; gchar *xpath; gchar **iter; guint i; GRecMutex *xml_business_group_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || group_uuid == NULL){ return; } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return; } } xml_business_group = AGS_XML_BUSINESS_GROUP(business_group); if(xml_business_group->doc == NULL || xml_business_group->root_node == NULL){ return; } xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(xml_business_group); group_node = NULL; xpath = g_strdup_printf("/ags-server-business-group/ags-srv-group-list/ags-srv-group/ags-srv-group-uuid[text() = '%s']", group_uuid); g_rec_mutex_lock(xml_business_group_mutex); xpath_context = xmlXPathNewContext(xml_business_group->doc); xpath_object = xmlXPathNodeEval(xml_business_group->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ group_node = node[i]->parent; break; } } } if(group_node != NULL){ /* remove user list */ child = group_node->children; while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!g_ascii_strncasecmp(child->name, "ags-srv-group-user-list", 24)){ xmlUnlinkNode(child); xmlFreeNode(child); break; } } child = child->next; } /* add user list */ user_list_node = xmlNewNode(NULL, "ags-srv-group-user-list"); xmlAddChild(group_node, user_list_node); if(user != NULL){ for(iter = user; iter[0] != NULL; iter++){ user_node = xmlNewNode(NULL, "ags-srv-group-user"); xmlAddChild(user_list_node, user_node); xmlNodeSetContent(user_node, iter[0]); } } } g_rec_mutex_unlock(xml_business_group_mutex); } gchar** ags_xml_business_group_get_user(AgsBusinessGroup *business_group, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *group_uuid, GError **error) { AgsXmlBusinessGroup *xml_business_group; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; gchar *xpath; gchar **user; guint i; guint j; GRecMutex *xml_business_group_mutex; if(!AGS_IS_SECURITY_CONTEXT(security_context) || group_uuid == NULL){ return(NULL); } if(!AGS_IS_AUTH_SECURITY_CONTEXT(security_context)){ if(!ags_authentication_manager_is_session_active(ags_authentication_manager_get_instance(), security_context, user_uuid, security_token)){ return(NULL); } } xml_business_group = AGS_XML_BUSINESS_GROUP(business_group); if(xml_business_group->doc == NULL || xml_business_group->root_node == NULL){ return(NULL); } xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(xml_business_group); user = NULL; xpath = g_strdup_printf("(/ags-server-business-group/ags-srv-group-list/ags-srv-group/ags-srv-group-uuid[text() = '%s'])/../ags-srv-group-user-list/ags-srv-group-user", group_uuid); g_rec_mutex_lock(xml_business_group_mutex); xpath_context = xmlXPathNewContext(xml_business_group->doc); xpath_object = xmlXPathNodeEval(xml_business_group->root_node, xpath, xpath_context); if(xpath_object->nodesetval != NULL){ node = xpath_object->nodesetval->nodeTab; for(i = 0, j = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ xmlChar *user_name; user_name = xmlNodeGetContent(node[i]); if(j == 0){ user = (gchar **) malloc(2 * sizeof(gchar *)); }else{ user = (gchar **) realloc(user, (j + 2) * sizeof(gchar *)); } user[j] = g_strdup(user_name); xmlFree(user_name); j++; } } if(j > 0){ user[j] = NULL; } } g_rec_mutex_unlock(xml_business_group_mutex); return(user); } /** * ags_xml_business_group_open_filename: * @xml_business_group: the #AgsXmlBusinessGroup * @filename: the filename * * Open @filename. * * Since: 3.0.0 */ void ags_xml_business_group_open_filename(AgsXmlBusinessGroup *xml_business_group, gchar *filename) { xmlDoc *doc; GRecMutex *xml_business_group_mutex; if(!AGS_IS_XML_BUSINESS_GROUP(xml_business_group) || filename == NULL){ return; } xml_business_group_mutex = AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX(xml_business_group); /* open XML */ doc = xmlReadFile(filename, NULL, 0); g_rec_mutex_lock(xml_business_group_mutex); xml_business_group->filename = g_strdup(filename); xml_business_group->doc = doc; if(doc == NULL){ g_warning("AgsXmlBusinessGroup - failed to read XML document %s", filename); }else{ /* get the root node */ xml_business_group->root_node = xmlDocGetRootElement(doc); } g_rec_mutex_unlock(xml_business_group_mutex); } /** * ags_xml_business_group_new: * * Create #AgsXmlBusinessGroup. * * Returns: the new #AgsXmlBusinessGroup instance * * Since: 3.0.0 */ AgsXmlBusinessGroup* ags_xml_business_group_new() { AgsXmlBusinessGroup *xml_business_group; xml_business_group = (AgsXmlBusinessGroup *) g_object_new(AGS_TYPE_XML_BUSINESS_GROUP, NULL); return(xml_business_group); } gsequencer-3.1.3/ags/server/security/ags_xml_certificate.h0000644000175000017500000000441413607210263020677 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_XML_CERTIFICATE_H__ #define __AGS_XML_CERTIFICATE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_XML_CERTIFICATE (ags_xml_certificate_get_type()) #define AGS_XML_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_XML_CERTIFICATE, AgsXmlCertificate)) #define AGS_XML_CERTIFICATE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_XML_CERTIFICATE, AgsXmlCertificateClass)) #define AGS_IS_XML_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_XML_CERTIFICATE)) #define AGS_IS_XML_CERTIFICATE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_XML_CERTIFICATE)) #define AGS_XML_CERTIFICATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_XML_CERTIFICATE, AgsXmlCertificateClass)) #define AGS_XML_CERTIFICATE_GET_OBJ_MUTEX(obj) (&(((AgsXmlCertificate *) obj)->obj_mutex)) typedef struct _AgsXmlCertificate AgsXmlCertificate; typedef struct _AgsXmlCertificateClass AgsXmlCertificateClass; struct _AgsXmlCertificate { GObject gobject; GRecMutex obj_mutex; gchar *filename; gchar *encoding; gchar *dtd; xmlDoc *doc; xmlNode *root_node; }; struct _AgsXmlCertificateClass { GObjectClass gobject; }; GType ags_xml_certificate_get_type(); void ags_xml_certificate_open_filename(AgsXmlCertificate *xml_certificate, gchar *filename); AgsXmlCertificate* ags_xml_certificate_new(); G_END_DECLS #endif /*__AGS_XML_CERTIFICATE_H__*/ gsequencer-3.1.3/ags/server/security/ags_xml_authentication.h0000644000175000017500000000477413613101102021431 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_XML_AUTHENTICATION_H__ #define __AGS_XML_AUTHENTICATION_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_XML_AUTHENTICATION (ags_xml_authentication_get_type()) #define AGS_XML_AUTHENTICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_XML_AUTHENTICATION, AgsXmlAuthentication)) #define AGS_XML_AUTHENTICATION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_XML_AUTHENTICATION, AgsXmlAuthenticationClass)) #define AGS_IS_XML_AUTHENTICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_XML_AUTHENTICATION)) #define AGS_IS_XML_AUTHENTICATION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_XML_AUTHENTICATION)) #define AGS_XML_AUTHENTICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_XML_AUTHENTICATION, AgsXmlAuthenticationClass)) #define AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX(obj) (&(((AgsXmlAuthentication *) obj)->obj_mutex)) typedef struct _AgsXmlAuthentication AgsXmlAuthentication; typedef struct _AgsXmlAuthenticationClass AgsXmlAuthenticationClass; struct _AgsXmlAuthentication { GObject gobject; GRecMutex obj_mutex; gchar *filename; gchar *encoding; gchar *dtd; xmlDoc *doc; xmlNode *root_node; }; struct _AgsXmlAuthenticationClass { GObjectClass gobject; }; GType ags_xml_authentication_get_type(); void ags_xml_authentication_open_filename(AgsXmlAuthentication *xml_authentication, gchar *filename); xmlNode* ags_xml_authentication_find_user_uuid(AgsXmlAuthentication *xml_authentication, gchar *user_uuid); AgsXmlAuthentication* ags_xml_authentication_new(); G_END_DECLS #endif /*__AGS_XML_AUTHENTICATION_H__*/ gsequencer-3.1.3/ags/server/security/ags_certificate.h0000644000175000017500000001277513607210263020030 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CERTIFICATE_H__ #define __AGS_CERTIFICATE_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_CERTIFICATE (ags_certificate_get_type()) #define AGS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CERTIFICATE, AgsCertificate)) #define AGS_CERTIFICATE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), AGS_TYPE_CERTIFICATE, AgsCertificateInterface)) #define AGS_IS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CERTIFICATE)) #define AGS_IS_CERTIFICATE_INTERFACE(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), AGS_TYPE_CERTIFICATE)) #define AGS_CERTIFICATE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE((obj), AGS_TYPE_CERTIFICATE, AgsCertificateInterface)) typedef struct _AgsCertificate AgsCertificate; typedef struct _AgsCertificateInterface AgsCertificateInterface; struct _AgsCertificateInterface { GTypeInterface ginterface; gchar** (*get_cert_uuid)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void (*set_domain)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *domain, GError **error); gchar* (*get_domain)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void (*set_key_type)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *key_type, GError **error); gchar* (*get_key_type)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void (*set_public_key_file)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *public_key_file, GError **error); gchar* (*get_public_key_file)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void (*set_private_key_file)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *private_key_file, GError **error); gchar* (*get_private_key_file)(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); }; GType ags_certificate_get_type(); gchar** ags_certificate_get_cert_uuid(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error); void ags_certificate_set_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *domain, GError **error); gchar* ags_certificate_get_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void ags_certificate_set_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *key_type, GError **error); gchar* ags_certificate_get_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void ags_certificate_set_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *public_key_file, GError **error); gchar* ags_certificate_get_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); void ags_certificate_set_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *private_key_file, GError **error); gchar* ags_certificate_get_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error); G_END_DECLS #endif /*__AGS_CERTIFICATE_H__*/ gsequencer-3.1.3/ags/server/security/ags_certificate_manager.h0000644000175000017500000000566513607210263021522 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_CERTIFICATE_MANAGER_H__ #define __AGS_CERTIFICATE_MANAGER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_CERTIFICATE_MANAGER (ags_certificate_manager_get_type()) #define AGS_CERTIFICATE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CERTIFICATE_MANAGER, AgsCertificateManager)) #define AGS_CERTIFICATE_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CERTIFICATE_MANAGER, AgsCertificateManagerClass)) #define AGS_IS_CERTIFICATE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_CERTIFICATE_MANAGER)) #define AGS_IS_CERTIFICATE_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_CERTIFICATE_MANAGER)) #define AGS_CERTIFICATE_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_CERTIFICATE_MANAGER, AgsCertificateManagerClass)) #define AGS_CERTIFICATE_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsCertificateManager *) obj)->obj_mutex)) typedef struct _AgsCertificateManager AgsCertificateManager; typedef struct _AgsCertificateManagerClass AgsCertificateManagerClass; struct _AgsCertificateManager { GObject gobject; GRecMutex obj_mutex; GList *certificate; }; struct _AgsCertificateManagerClass { GObjectClass gobject; }; GType ags_certificate_manager_get_type(void); GList* ags_certificate_manager_get_certificate(AgsCertificateManager *certificate_manager); void ags_certificate_manager_add_certificate(AgsCertificateManager *certificate_manager, GObject *certificate); void ags_certificate_manager_remove_certificate(AgsCertificateManager *certificate_manager, GObject *certificate); /* */ void ags_certificate_manager_get_key_file(AgsCertificateManager *certificate_manager, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *domain, gchar *key_type, gchar **public_key_file, gchar **private_key_file); /* */ AgsCertificateManager* ags_certificate_manager_get_instance(); AgsCertificateManager* ags_certificate_manager_new(); G_END_DECLS #endif /*__AGS_CERTIFICATE_MANAGER_H__*/ gsequencer-3.1.3/ags/server/security/ags_xml_password_store.h0000644000175000017500000000471013607210263021472 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_XML_PASSWORD_STORE_H__ #define __AGS_XML_PASSWORD_STORE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_XML_PASSWORD_STORE (ags_xml_password_store_get_type()) #define AGS_XML_PASSWORD_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_XML_PASSWORD_STORE, AgsXmlPasswordStore)) #define AGS_XML_PASSWORD_STORE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_XML_PASSWORD_STORE, AgsXmlPasswordStoreClass)) #define AGS_IS_XML_PASSWORD_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_XML_PASSWORD_STORE)) #define AGS_IS_XML_PASSWORD_STORE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_XML_PASSWORD_STORE)) #define AGS_XML_PASSWORD_STORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_XML_PASSWORD_STORE, AgsXmlPasswordStoreClass)) #define AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX(obj) (&(((AgsXmlPasswordStore *) obj)->obj_mutex)) typedef struct _AgsXmlPasswordStore AgsXmlPasswordStore; typedef struct _AgsXmlPasswordStoreClass AgsXmlPasswordStoreClass; struct _AgsXmlPasswordStore { GObject gobject; GRecMutex obj_mutex; gchar *filename; gchar *encoding; gchar *dtd; xmlDoc *doc; xmlNode *root_node; }; struct _AgsXmlPasswordStoreClass { GObjectClass gobject; }; GType ags_xml_password_store_get_type(); void ags_xml_password_store_open_filename(AgsXmlPasswordStore *xml_password_store, gchar *filename); xmlNode* ags_xml_password_store_find_login(AgsXmlPasswordStore *xml_password_store, gchar *login); AgsXmlPasswordStore* ags_xml_password_store_new(); G_END_DECLS #endif /*__AGS_XML_PASSWORD_STORE_H__*/ gsequencer-3.1.3/ags/server/security/ags_security_context.h0000644000175000017500000000673413607210263021157 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SECURITY_CONTEXT_H__ #define __AGS_SECURITY_CONTEXT_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SECURITY_CONTEXT (ags_security_context_get_type()) #define AGS_SECURITY_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SECURITY_CONTEXT, AgsSecurityContext)) #define AGS_SECURITY_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SECURITY_CONTEXT, AgsSecurityContextClass)) #define AGS_IS_SECURITY_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SECURITY_CONTEXT)) #define AGS_IS_SECURITY_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SECURITY_CONTEXT)) #define AGS_SECURITY_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SECURITY_CONTEXT, AgsSecurityContextClass)) #define AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX(obj) (&(((AgsSecurityContext *) obj)->obj_mutex)) typedef struct _AgsSecurityContext AgsSecurityContext; typedef struct _AgsSecurityContextClass AgsSecurityContextClass; /** * AgsSecurityContextMode: * @AGS_SECURITY_CONTEXT_RPC_READ: allowed to read using RPC * @AGS_SECURITY_CONTEXT_RPC_WRITE: allowed to write using RPC * @AGS_SECURITY_CONTEXT_RPC_EXECUTE: allowed to execute using RPC * @AGS_SECURITY_CONTEXT_ACCOUNT_READ: allowed to read account information * @AGS_SECURITY_CONTEXT_ACCOUNT_WRITE: allowed to write account information * * The #AgsSecurityContextMode specifies basic account permissions. */ typedef enum{ AGS_SECURITY_CONTEXT_RPC_READ = 1, AGS_SECURITY_CONTEXT_RPC_WRITE = 1 << 1, AGS_SECURITY_CONTEXT_RPC_EXECUTE = 1 << 2, AGS_SECURITY_CONTEXT_ACCOUNT_READ = 1 << 3, AGS_SECURITY_CONTEXT_ACCOUNT_WRITE = 1 << 4, }AgsSecurityContextMode; struct _AgsSecurityContext { GObject gobject; GRecMutex obj_mutex; gchar *certs; guint server_context_umask; gchar **business_group; gchar **server_context; }; struct _AgsSecurityContextClass { GObjectClass gobject; }; GType ags_security_context_get_type(); void ags_security_context_parse_business_group(AgsSecurityContext *security_context, xmlDoc *xml_doc, gchar *user_uuid); gchar** ags_security_context_get_business_group(AgsSecurityContext *security_context); void ags_security_context_add_server_context(AgsSecurityContext *security_context, gchar *server_context); gboolean ags_security_context_remove_server_context(AgsSecurityContext *security_context, gchar *server_context); gchar** ags_security_context_get_server_context(AgsSecurityContext *security_context); AgsSecurityContext* ags_security_context_new(); G_END_DECLS #endif /*__AGS_SECURITY_CONTEXT_H__*/ gsequencer-3.1.3/ags/server/security/ags_certificate.c0000644000175000017500000002542213607210263020014 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include void ags_certificate_base_init(AgsCertificateInterface *ginterface); /** * SECTION:ags_certificate * @short_description: base password certificate * @title: AgsCertificate * @section_id: AgsCertificate * @include: ags/server/security/ags_certificate.h * * The #AgsCertificate interface gives you a unique access to all objects * and is responsible to set up signal handlers. */ GType ags_certificate_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_certificate = 0; static const GTypeInfo ags_certificate_info = { sizeof(AgsCertificateInterface), (GBaseInitFunc) ags_certificate_base_init, NULL, /* base_finalize */ }; ags_type_certificate = g_type_register_static(G_TYPE_INTERFACE, "AgsCertificate", &ags_certificate_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_certificate); } return g_define_type_id__volatile; } void ags_certificate_base_init(AgsCertificateInterface *ginterface) { /* empty */ } /** * ags_certificate_get_cert_uuid: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @error: the #GError-struct * * Get cert UUID as string vector. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): the cert UUIDs as %NULL terminated string array * * Since: 3.0.0 */ gchar** ags_certificate_get_cert_uuid(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsCertificateInterface *certificate_interface; g_return_val_if_fail(AGS_IS_CERTIFICATE(certificate), NULL); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_val_if_fail(certificate_interface->get_cert_uuid, NULL); return(certificate_interface->get_cert_uuid(certificate, security_context, user_uuid, security_token, error)); } /** * ags_certificate_set_domain: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @domain: the domain * @error: the #GError-struct * * Set domain. * * Since: 3.0.0 */ void ags_certificate_set_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *domain, GError **error) { AgsCertificateInterface *certificate_interface; g_return_if_fail(AGS_IS_CERTIFICATE(certificate)); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_if_fail(certificate_interface->set_domain); certificate_interface->set_domain(certificate, security_context, user_uuid, security_token, cert_uuid, domain, error); } /** * ags_certificate_get_domain: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @error: the #GError-struct * * Get domain. * * Returns: (transfer full): the domain * * Since: 3.0.0 */ gchar* ags_certificate_get_domain(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsCertificateInterface *certificate_interface; g_return_val_if_fail(AGS_IS_CERTIFICATE(certificate), NULL); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_val_if_fail(certificate_interface->get_domain, NULL); return(certificate_interface->get_domain(certificate, security_context, user_uuid, security_token, cert_uuid, error)); } /** * ags_certificate_set_key_type: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @key_type: the key type * @error: the #GError-struct * * Set key type. * * Since: 3.0.0 */ void ags_certificate_set_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *key_type, GError **error) { AgsCertificateInterface *certificate_interface; g_return_if_fail(AGS_IS_CERTIFICATE(certificate)); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_if_fail(certificate_interface->set_key_type); certificate_interface->set_key_type(certificate, security_context, user_uuid, security_token, cert_uuid, key_type, error); } /** * ags_certificate_get_key_type: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @error: the #GError-struct * * Get key type. * * Returns: (transfer full): the key type * * Since: 3.0.0 */ gchar* ags_certificate_get_key_type(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsCertificateInterface *certificate_interface; g_return_val_if_fail(AGS_IS_CERTIFICATE(certificate), NULL); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_val_if_fail(certificate_interface->get_key_type, NULL); return(certificate_interface->get_key_type(certificate, security_context, user_uuid, security_token, cert_uuid, error)); } /** * ags_certificate_set_public_key_file: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @public_key_file: the public key file * @error: the #GError-struct * * Set public key file. * * Since: 3.0.0 */ void ags_certificate_set_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *public_key_file, GError **error) { AgsCertificateInterface *certificate_interface; g_return_if_fail(AGS_IS_CERTIFICATE(certificate)); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_if_fail(certificate_interface->set_public_key_file); certificate_interface->set_public_key_file(certificate, security_context, user_uuid, security_token, cert_uuid, public_key_file, error); } /** * ags_certificate_get_public_key_file: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @error: the #GError-struct * * Get public key file. * * Returns: (transfer full): the public key file * * Since: 3.0.0 */ gchar* ags_certificate_get_public_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsCertificateInterface *certificate_interface; g_return_val_if_fail(AGS_IS_CERTIFICATE(certificate), NULL); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_val_if_fail(certificate_interface->get_public_key_file, NULL); return(certificate_interface->get_public_key_file(certificate, security_context, user_uuid, security_token, cert_uuid, error)); } /** * ags_certificate_set_private_key_file: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @private_key_file: the private key file * @error: the #GError-struct * * Set private key file. * * Since: 3.0.0 */ void ags_certificate_set_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, gchar *private_key_file, GError **error) { AgsCertificateInterface *certificate_interface; g_return_if_fail(AGS_IS_CERTIFICATE(certificate)); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_if_fail(certificate_interface->set_private_key_file); certificate_interface->set_private_key_file(certificate, security_context, user_uuid, security_token, cert_uuid, private_key_file, error); } /** * ags_certificate_get_private_key_file: * @certificate: the #AgsCertificate * @security_context: the #AgsSecurityContext * @user_uuid: the users unique identifier * @security_token: the security token * @cert_uuid: the cert's UUID * @error: the #GError-struct * * Get private key file. * * Returns: (transfer full): the private key file * * Since: 3.0.0 */ gchar* ags_certificate_get_private_key_file(AgsCertificate *certificate, GObject *security_context, gchar *user_uuid, gchar *security_token, gchar *cert_uuid, GError **error) { AgsCertificateInterface *certificate_interface; g_return_val_if_fail(AGS_IS_CERTIFICATE(certificate), NULL); certificate_interface = AGS_CERTIFICATE_GET_INTERFACE(certificate); g_return_val_if_fail(certificate_interface->get_private_key_file, NULL); return(certificate_interface->get_private_key_file(certificate, security_context, user_uuid, security_token, cert_uuid, error)); } gsequencer-3.1.3/ags/server/security/ags_authentication.c0000644000175000017500000001574313607210263020556 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include void ags_authentication_base_init(AgsAuthenticationInterface *ginterface); /** * SECTION:ags_authentication * @short_description: base password authentication * @title: AgsAuthentication * @section_id: * @include: ags/server/security/ags_authentication.h * * The #AgsAuthentication interface gives you base authentication functions. */ GType ags_authentication_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_authentication = 0; static const GTypeInfo ags_authentication_info = { sizeof(AgsAuthenticationInterface), (GBaseInitFunc) ags_authentication_base_init, NULL, /* base_finalize */ }; ags_type_authentication = g_type_register_static(G_TYPE_INTERFACE, "AgsAuthentication", &ags_authentication_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_authentication); } return g_define_type_id__volatile; } void ags_authentication_base_init(AgsAuthenticationInterface *ginterface) { /* empty */ } /** * ags_authentication_get_authentication_module: * @authentication: the #AgsAuthentication * * Available authentication modules. * * Returns: (element-type utf8) (array zero-terminated=1) (transfer full): a %NULL terminated array of strings of available authentication modules * * Since: 3.0.0 */ gchar** ags_authentication_get_authentication_module(AgsAuthentication *authentication) { AgsAuthenticationInterface *authentication_interface; g_return_val_if_fail(AGS_IS_AUTHENTICATION(authentication), NULL); authentication_interface = AGS_AUTHENTICATION_GET_INTERFACE(authentication); g_return_val_if_fail(authentication_interface->get_authentication_module, NULL); return(authentication_interface->get_authentication_module(authentication)); } /** * ags_authentication_login: * @authentication: the #AgsAuthentication * @login: the login * @password: the password * @user_uuid: (out) (transfer full): return location of the user's uuid * @security_token: (out) (transfer full): return location of the security token * @error: the #GError-struct * * Login. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_authentication_login(AgsAuthentication *authentication, gchar *login, gchar *password, gchar **user_uuid, gchar **security_token, GError **error) { AgsAuthenticationInterface *authentication_interface; g_return_val_if_fail(AGS_IS_AUTHENTICATION(authentication), NULL); authentication_interface = AGS_AUTHENTICATION_GET_INTERFACE(authentication); g_return_val_if_fail(authentication_interface->login, NULL); return(authentication_interface->login(authentication, login, password, user_uuid, security_token, error)); } /** * ags_authentication_get_digest: * @authentication: the #AgsAuthentication * @realm: the realm * @login: the login * @security_token: the security token * @error: the #GError-struct * * Get digest of @login. * * Returns: (transfer full): the encrypted password * * Since: 3.0.0 */ gchar* ags_authentication_get_digest(AgsAuthentication *authentication, gchar *realm, gchar *login, gchar *security_token, GError **error) { AgsAuthenticationInterface *authentication_interface; g_return_val_if_fail(AGS_IS_AUTHENTICATION(authentication), NULL); authentication_interface = AGS_AUTHENTICATION_GET_INTERFACE(authentication); g_return_val_if_fail(authentication_interface->get_digest, NULL); return(authentication_interface->get_digest(authentication, realm, login, security_token, error)); } /** * ags_authentication_logout: * @authentication: the #AgsAuthentication * @security_context: the #AgsSecurityContext * @login: the login * @security_token: the security token * @error: the #GError-struct * * Logout. * * Returns: %TRUE on success, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_authentication_logout(AgsAuthentication *authentication, GObject *security_context, gchar *login, gchar *security_token, GError **error) { AgsAuthenticationInterface *authentication_interface; g_return_val_if_fail(AGS_IS_AUTHENTICATION(authentication), FALSE); authentication_interface = AGS_AUTHENTICATION_GET_INTERFACE(authentication); g_return_val_if_fail(authentication_interface->logout, FALSE); return(authentication_interface->logout(authentication, security_context, login, security_token, error)); } /** * ags_authentication_generate_token: * @authentication: the #AgsAuthentication * @error: the #GError-struct * * Generate token. * * Returns: (transfer full): the generated token * * Since: 3.0.0 */ gchar* ags_authentication_generate_token(AgsAuthentication *authentication, GError **error) { AgsAuthenticationInterface *authentication_interface; g_return_val_if_fail(AGS_IS_AUTHENTICATION(authentication), NULL); authentication_interface = AGS_AUTHENTICATION_GET_INTERFACE(authentication); g_return_val_if_fail(authentication_interface->generate_token, NULL); return(authentication_interface->generate_token(authentication, error)); } /** * ags_authentication_is_session_active: * @authentication: the #AgsAuthentication * @security_context: the #AgsSecurityContext * @user_uuid: the user's UUID * @security_token: the security token * @error: the #GError-struct * * Check session. * * Returns: %TRUE if session active, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_authentication_is_session_active(AgsAuthentication *authentication, GObject *security_context, gchar *user_uuid, gchar *security_token, GError **error) { AgsAuthenticationInterface *authentication_interface; g_return_val_if_fail(AGS_IS_AUTHENTICATION(authentication), FALSE); authentication_interface = AGS_AUTHENTICATION_GET_INTERFACE(authentication); g_return_val_if_fail(authentication_interface->is_session_active, FALSE); return(authentication_interface->is_session_active(authentication, security_context, user_uuid, security_token, error)); } gsequencer-3.1.3/ags/server/security/ags_auth_security_context.c0000644000175000017500000000776413607210263022177 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include void ags_auth_security_context_class_init(AgsAuthSecurityContextClass *auth_security_context); void ags_auth_security_context_init(AgsAuthSecurityContext *auth_security_context); void ags_auth_security_context_finalize(GObject *gobject); /** * SECTION:ags_auth_security_context * @short_description: auth security context * @title: AgsAuthSecurityContext * @section_id: * @include: ags/server/security/ags_auth_security_context.h * * The #AgsAuthSecurityContext has got all available privileges to do anything. */ static gpointer ags_auth_security_context_parent_class = NULL; AgsAuthSecurityContext *ags_auth_security_context = NULL; GType ags_auth_security_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_auth_security_context = 0; static const GTypeInfo ags_auth_security_context_info = { sizeof (AgsAuthSecurityContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_auth_security_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsAuthSecurityContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_auth_security_context_init, }; ags_type_auth_security_context = g_type_register_static(AGS_TYPE_SECURITY_CONTEXT, "AgsAuthSecurityContext", &ags_auth_security_context_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_auth_security_context); } return g_define_type_id__volatile; } void ags_auth_security_context_class_init(AgsAuthSecurityContextClass *auth_security_context) { GObjectClass *gobject; ags_auth_security_context_parent_class = g_type_class_peek_parent(auth_security_context); /* GObjectClass */ gobject = (GObjectClass *) auth_security_context; gobject->finalize = ags_auth_security_context_finalize; /* properties */ } void ags_auth_security_context_init(AgsAuthSecurityContext *auth_security_context) { //empty } void ags_auth_security_context_finalize(GObject *gobject) { AgsAuthSecurityContext *auth_security_context; auth_security_context = AGS_AUTH_SECURITY_CONTEXT(gobject); /* call parent */ G_OBJECT_CLASS(ags_auth_security_context_parent_class)->finalize(gobject); } /** * ags_auth_security_context_get_instance: * * Get instance. * * Returns: (transfer none): the #AgsAuthSecurityContext * * Since: 3.0.0 */ AgsAuthSecurityContext* ags_auth_security_context_get_instance() { static GMutex mutex; g_mutex_lock(&mutex); if(ags_auth_security_context == NULL){ ags_auth_security_context = ags_auth_security_context_new(); } g_mutex_unlock(&mutex); return(ags_auth_security_context); } /** * ags_auth_security_context_new: * * Create #AgsAuthSecurityContext. * * Returns: the new #AgsAuthSecurityContext instance * * Since: 3.0.0 */ AgsAuthSecurityContext* ags_auth_security_context_new() { AgsAuthSecurityContext *auth_security_context; auth_security_context = (AgsAuthSecurityContext *) g_object_new(AGS_TYPE_AUTH_SECURITY_CONTEXT, NULL); return(auth_security_context); } gsequencer-3.1.3/ags/server/security/ags_business_group_manager.h0000644000175000017500000000542113607210263022275 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_BUSINESS_GROUP_MANAGER_H__ #define __AGS_BUSINESS_GROUP_MANAGER_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_BUSINESS_GROUP_MANAGER (ags_business_group_manager_get_type()) #define AGS_BUSINESS_GROUP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_BUSINESS_GROUP_MANAGER, AgsBusinessGroupManager)) #define AGS_BUSINESS_GROUP_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_BUSINESS_GROUP_MANAGER, AgsBusinessGroupManagerClass)) #define AGS_IS_BUSINESS_GROUP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_BUSINESS_GROUP_MANAGER)) #define AGS_IS_BUSINESS_GROUP_MANAGER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_BUSINESS_GROUP_MANAGER)) #define AGS_BUSINESS_GROUP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_BUSINESS_GROUP_MANAGER, AgsBusinessGroupManagerClass)) #define AGS_BUSINESS_GROUP_MANAGER_GET_OBJ_MUTEX(obj) (&(((AgsBusinessGroupManager *) obj)->obj_mutex)) typedef struct _AgsBusinessGroupManager AgsBusinessGroupManager; typedef struct _AgsBusinessGroupManagerClass AgsBusinessGroupManagerClass; struct _AgsBusinessGroupManager { GObject gobject; GRecMutex obj_mutex; GList *business_group; }; struct _AgsBusinessGroupManagerClass { GObjectClass gobject; }; GType ags_business_group_manager_get_type(void); GList* ags_business_group_manager_get_business_group(AgsBusinessGroupManager *business_group_manager); void ags_business_group_manager_add_business_group(AgsBusinessGroupManager *business_group_manager, GObject *business_group); void ags_business_group_manager_remove_business_group(AgsBusinessGroupManager *business_group_manager, GObject *business_group); /* */ AgsBusinessGroupManager* ags_business_group_manager_get_instance(); AgsBusinessGroupManager* ags_business_group_manager_new(); G_END_DECLS #endif /*__AGS_BUSINESS_GROUP_MANAGER_H__*/ gsequencer-3.1.3/ags/server/ags_registry.c0000644000175000017500000002437113607210263015535 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_registry_class_init(AgsRegistryClass *registry); void ags_registry_connectable_interface_init(AgsConnectableInterface *connectable); void ags_registry_init(AgsRegistry *registry); void ags_registry_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_registry_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_registry_add_to_registry(AgsConnectable *connectable); void ags_registry_remove_from_registry(AgsConnectable *connectable); void ags_registry_connect(AgsConnectable *connectable); void ags_registry_disconnect(AgsConnectable *connectable); void ags_registry_dispose(GObject *gobject); void ags_registry_finalize(GObject *gobject); /** * SECTION:ags_registry * @short_description: remote control registry * @title: AgsRegistry * @section_id: * @include: ags/server/ags_registry.h * * The #AgsRegistry is a registry where you are able to lookup objects. */ enum{ PROP_0, PROP_SERVER, }; static gpointer ags_registry_parent_class = NULL; GType ags_registry_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_registry = 0; static const GTypeInfo ags_registry_info = { sizeof (AgsRegistryClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_registry_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsRegistry), 0, /* n_preallocs */ (GInstanceInitFunc) ags_registry_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_registry_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_registry = g_type_register_static(G_TYPE_OBJECT, "AgsRegistry", &ags_registry_info, 0); g_type_add_interface_static(ags_type_registry, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_registry); } return g_define_type_id__volatile; } void ags_registry_class_init(AgsRegistryClass *registry) { GObjectClass *gobject; GParamSpec *param_spec; ags_registry_parent_class = g_type_class_peek_parent(registry); /* GObjectClass */ gobject = (GObjectClass *) registry; gobject->set_property = ags_registry_set_property; gobject->get_property = ags_registry_get_property; gobject->dispose = ags_registry_dispose; gobject->finalize = ags_registry_finalize; /* properties */ /** * AgsRegistry:server: * * The assigned #AgsServer * * Since: 3.0.0 */ param_spec = g_param_spec_object("server", i18n("assigned server"), i18n("The assigned server"), AGS_TYPE_SERVER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SERVER, param_spec); } void ags_registry_connectable_interface_init(AgsConnectableInterface *connectable) { connectable->add_to_registry = ags_registry_add_to_registry; connectable->remove_from_registry = ags_registry_remove_from_registry; connectable->connect = ags_registry_connect; connectable->disconnect = ags_registry_disconnect; } void ags_registry_init(AgsRegistry *registry) { AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); registry->flags = 0; g_rec_mutex_init(&(registry->obj_mutex)); registry->counter = 0; registry->entry = NULL; } void ags_registry_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsRegistry *registry; registry = AGS_REGISTRY(gobject); switch(prop_id){ case PROP_SERVER: { AgsServer *server; server = (AgsServer *) g_value_get_object(value); if(registry->server == (GObject *) server){ return; } if(registry->server != NULL){ g_object_unref(G_OBJECT(registry->server)); } if(server != NULL){ g_object_ref(G_OBJECT(server)); } registry->server = server; } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_registry_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsRegistry *registry; registry = AGS_REGISTRY(gobject); switch(prop_id){ case PROP_SERVER: { g_value_set_object(value, registry->server); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_registry_add_to_registry(AgsConnectable *connectable) { AgsRegistry *registry; registry = AGS_REGISTRY(connectable); //TODO:JK: implement me } void ags_registry_remove_from_registry(AgsConnectable *connectable) { //TODO:JK: implement me } void ags_registry_connect(AgsConnectable *connectable) { /* empty */ } void ags_registry_disconnect(AgsConnectable *connectable) { /* empty */ } void ags_registry_dispose(GObject *gobject) { AgsRegistry *registry; registry = AGS_REGISTRY(gobject); if(registry->server != NULL){ g_object_unref(registry->server); registry->server = NULL; } g_list_free_full(registry->entry, (GDestroyNotify) ags_registry_entry_free); registry->entry = NULL; /* call parent */ G_OBJECT_CLASS(ags_registry_parent_class)->dispose(gobject); } void ags_registry_finalize(GObject *gobject) { AgsRegistry *registry; registry = AGS_REGISTRY(gobject); if(registry->server != NULL){ g_object_unref(registry->server); } g_list_free_full(registry->entry, (GDestroyNotify) ags_registry_entry_free); /* call parent */ G_OBJECT_CLASS(ags_registry_parent_class)->finalize(gobject); } /** * ags_registry_entry_alloc: * * Allocated #AgsRegistryEntry-struct. * * Returns: the newly allocated #AgsRegistryEntry-struct * * Since: 3.0.0 */ AgsRegistryEntry* ags_registry_entry_alloc() { AgsRegistryEntry *registry_entry; registry_entry = (AgsRegistryEntry *) malloc(sizeof(AgsRegistryEntry)); registry_entry->id = NULL; registry_entry->entry = g_new0(GValue, 1); g_value_init(registry_entry->entry, G_TYPE_OBJECT); return(registry_entry); } /** * ags_registry_entry_free: * @registry_entry: the #AgsRegistryEntry-struct * * Free @registry_entry * * Since: 3.0.0 */ void ags_registry_entry_free(AgsRegistryEntry *registry_entry) { GObject *gobject; gobject = g_value_get_object(&(registry_entry->entry)); if(gobject != NULL){ g_object_unref(gobject); } g_value_unset(registry_entry->entry); g_free(registry_entry->entry); free(registry_entry); } /** * ags_registry_add_entry: * @registry: the #AgsRegistry * @registry_entry: the #AgsRegistryEntry-struct to add * * Add @registry_entry to @registry. * * Since: 3.0.0 */ void ags_registry_add_entry(AgsRegistry *registry, AgsRegistryEntry *registry_entry) { GRecMutex *registry_mutex; if(!AGS_IS_REGISTRY(registry) || registry_entry == NULL){ return; } registry_mutex = AGS_REGISTRY_GET_OBJ_MUTEX(registry); g_rec_mutex_lock(registry_mutex); registry->entry = g_list_prepend(registry->entry, registry_entry); g_rec_mutex_unlock(registry_mutex); } /** * ags_registry_find_entry: * @registry: the #AgsRegistry * @id: the #AgsUUID to find * * Find @id as #AgsRegistryEntry-struct in @registry. * * Since: 3.0.0 */ AgsRegistryEntry* ags_registry_find_entry(AgsRegistry *registry, AgsUUID *id) { GList *current; AgsRegistryEntry *entry; GRecMutex *registry_mutex; if(!AGS_IS_REGISTRY(registry)){ return(NULL); } registry_mutex = AGS_REGISTRY_GET_OBJ_MUTEX(registry); g_rec_mutex_lock(registry_mutex); current = registry->entry; while(current != NULL){ entry = (AgsRegistryEntry *) current->data; if(!ags_uuid_compare(entry->id, id)){ g_rec_mutex_unlock(registry_mutex); return(entry); } current = current->next; } g_rec_mutex_unlock(registry_mutex); return(NULL); } #ifdef AGS_WITH_XMLRPC_C xmlrpc_value* ags_registry_entry_bulk(xmlrpc_env *env, xmlrpc_value *param_array, void *server_info) { AgsServer *server; AgsRegistry *registry; AgsRegistryEntry *entry; AgsApplicationContext *application_context; GList *current; xmlrpc_value *bulk; xmlrpc_value *item; GRecMutex *registry_mutex; server = ags_server_lookup(server_info); application_context = ags_application_context_get_instance(); registry = ags_service_provider_get_registry(AGS_SERVICE_PROVIDER(application_context)); registry_mutex = AGS_REGISTRY_GET_OBJ_MUTEX(registry); bulk = xmlrpc_array_new(env); g_rec_mutex_lock(registry_mutex); current = registry->entry; while(current != NULL){ entry = (AgsRegistryEntry *) current->data; item = xmlrpc_string_new(env, entry->id); xmlrpc_array_append_item(env, bulk, item); current = current->next; } g_rec_mutex_unlock(registry_mutex); return(bulk); } #endif /* AGS_WITH_XMLRPC_C */ AgsRegistry* ags_registry_new() { AgsRegistry *registry; registry = (AgsRegistry *) g_object_new(AGS_TYPE_REGISTRY, NULL); return(registry); } gsequencer-3.1.3/ags/server/ags_server.h0000644000175000017500000001051713607210263015175 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SERVER_H__ #define __AGS_SERVER_H__ #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SERVER (ags_server_get_type()) #define AGS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SERVER, AgsServer)) #define AGS_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SERVER, AgsServerClass)) #define AGS_IS_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SERVER)) #define AGS_IS_SERVER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SERVER)) #define AGS_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SERVER, AgsServerClass)) #define AGS_SERVER_GET_OBJ_MUTEX(obj) (&(((AgsServer *) obj)->obj_mutex)) #define AGS_SERVER_DEFAULT_SERVER_PORT (8080) #define AGS_SERVER_DEFAULT_DOMAIN "localhost" #define AGS_SERVER_DEFAULT_INET4_ADDRESS "127.0.0.1" #define AGS_SERVER_DEFAULT_INET6_ADDRESS "::1" #define AGS_SERVER_DEFAULT_AUTH_MODULE "ags-xml-authentication" #define AGS_SERVER_DEFAULT_BACKLOG (512) typedef struct _AgsServer AgsServer; typedef struct _AgsServerClass AgsServerClass; typedef struct _AgsServerInfo AgsServerInfo; /** * AgsServerFlags: * @AGS_SERVER_STARTED: the server was started * @AGS_SERVER_RUNNING: the server is up and running * @AGS_SERVER_TERMINATING: the server is closing connections and terminating * @AGS_SERVER_INET4: use IPv4 * @AGS_SERVER_INET6: use IPv6 * @AGS_SERVER_ANY_ADDRESS: listen on any address * @AGS_SERVER_AUTO_START: start the server * * Enum values to control the behavior or indicate internal state of #AgsServer by * enable/disable as flags. */ typedef enum{ AGS_SERVER_STARTED = 1, AGS_SERVER_RUNNING = 1 << 1, AGS_SERVER_TERMINATING = 1 << 2, AGS_SERVER_INET4 = 1 << 3, AGS_SERVER_INET6 = 1 << 4, AGS_SERVER_ANY_ADDRESS = 1 << 5, AGS_SERVER_AUTO_START = 1 << 6, }AgsServerFlags; struct _AgsServer { GObject gobject; guint flags; GRecMutex obj_mutex; AgsUUID *uuid; AgsServerInfo *server_info; gchar *ip4; gchar *ip6; gchar *domain; guint server_port; int ip4_fd; int ip6_fd; GSocket *ip4_socket; GSocket *ip6_socket; GSocketAddress *ip4_address; GSocketAddress *ip6_address; gchar *realm; SoupServer *soup_server; gchar *auth_module; SoupAuthDomain *auth_domain; GObject *front_controller; GList *controller; }; struct _AgsServerClass { GObjectClass gobject; void (*start)(AgsServer *server); void (*stop)(AgsServer *server); gboolean (*listen)(AgsServer *server); }; /** * AgsServerInfo: * @uuid: the assigned uuid * @server_name: the server's name * * #AgsServerInfo does identify the server and provides some basic information about it. */ struct _AgsServerInfo { gchar *uuid; gchar *server_name; }; GType ags_server_get_type(); gboolean ags_server_test_flags(AgsServer *server, guint flags); void ags_server_set_flags(AgsServer *server, guint flags); void ags_server_unset_flags(AgsServer *server, guint flags); AgsServerInfo* ags_server_info_alloc(gchar *server_name, gchar *uuid); /* fields */ void ags_server_add_controller(AgsServer *server, GObject *controller); void ags_server_remove_controller(AgsServer *server, GObject *controller); void ags_server_start(AgsServer *server); void ags_server_stop(AgsServer *server); gboolean ags_server_listen(AgsServer *server); AgsServer* ags_server_new(); G_END_DECLS #endif /*__AGS_SERVER_H__*/ gsequencer-3.1.3/ags/server/ags_registry.h0000644000175000017500000000572413607210263015543 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_REGISTRY_H__ #define __AGS_REGISTRY_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_REGISTRY (ags_registry_get_type()) #define AGS_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_REGISTRY, AgsRegistry)) #define AGS_REGISTRY_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_REGISTRY, AgsRegistryClass)) #define AGS_IS_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_REGISTRY)) #define AGS_IS_REGISTRY_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_REGISTRY)) #define AGS_REGISTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_REGISTRY, AgsRegistryClass)) #define AGS_REGISTRY_GET_OBJ_MUTEX(obj) (&(((AgsRegistry *) obj)->obj_mutex)) typedef struct _AgsRegistry AgsRegistry; typedef struct _AgsRegistryClass AgsRegistryClass; typedef struct _AgsRegistryEntry AgsRegistryEntry; /** * AgsRegistryFlags: * @AGS_REGISTRY_ADDED_TO_REGISTRY: the registry was added to registry, see #AgsConnectable::add_to_registry() * @AGS_REGISTRY_CONNECTED: the registry was connected by #AgsConnectable::connect() * * Enum values to control the behavior or indicate internal state of #AgsRegistry by * enable/disable as flags. */ typedef enum{ AGS_REGISTRY_ADDED_TO_REGISTRY = 1, AGS_REGISTRY_CONNECTED = 1 << 1, }AgsRegistryFlags; struct _AgsRegistry { GObject gobject; guint flags; GRecMutex obj_mutex; GObject *server; guint counter; GList *entry; }; struct _AgsRegistryClass { GObjectClass gobject; }; /** * AgsRegistryEntry: * @id: the #AgsUUID * @entry: the actual entry * * #AgsRegistryEntry is an entry that you might want to lookup remotely. */ struct _AgsRegistryEntry { AgsUUID *id; GValue *entry; }; GType ags_registry_get_type(); AgsRegistryEntry* ags_registry_entry_alloc(); void ags_registry_entry_free(AgsRegistryEntry *registry_entry); void ags_registry_add_entry(AgsRegistry *registry, AgsRegistryEntry *registry_entry); AgsRegistryEntry* ags_registry_find_entry(AgsRegistry *registry, AgsUUID *id); AgsRegistry* ags_registry_new(); G_END_DECLS #endif /*__AGS_REGISTRY_H__*/ gsequencer-3.1.3/ags/server/ags_server_application_context.c0000644000175000017500000007500113614062654021325 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_server_application_context_class_init(AgsServerApplicationContextClass *server_application_context); void ags_server_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider); void ags_server_application_context_service_provider_interface_init(AgsServiceProviderInterface *service_provider); void ags_server_application_context_connectable_interface_init(AgsConnectableInterface *connectable); void ags_server_application_context_init(AgsServerApplicationContext *server_application_context); void ags_server_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_server_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_server_application_context_connect(AgsConnectable *connectable); void ags_server_application_context_disconnect(AgsConnectable *connectable); void ags_server_application_context_finalize(GObject *gobject); AgsThread* ags_server_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider); void ags_server_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop); AgsTaskLauncher* ags_server_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider); void ags_server_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher); AgsThreadPool* ags_server_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider); void ags_server_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool); GList* ags_server_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider); void ags_server_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker); gboolean ags_server_application_context_is_operating(AgsServiceProvider *service_provider); AgsServerStatus* ags_server_application_context_server_status(AgsServiceProvider *service_provider); void ags_server_application_context_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry); AgsRegistry* ags_server_application_context_get_registry(AgsServiceProvider *service_provider); void ags_server_application_context_set_server(AgsServiceProvider *service_provider, GList *server); GList* ags_server_application_context_get_server(AgsServiceProvider *service_provider); void ags_server_application_context_prepare(AgsApplicationContext *application_context); void ags_server_application_context_setup(AgsApplicationContext *application_context); void* ags_server_application_context_server_main_loop_thread(GMainLoop *main_loop); static gpointer ags_server_application_context_parent_class = NULL; static AgsConnectableInterface* ags_server_application_context_parent_connectable_interface; extern AgsApplicationContext *ags_application_context; GType ags_server_application_context_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_server_application_context = 0; static const GTypeInfo ags_server_application_context_info = { sizeof (AgsServerApplicationContextClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_server_application_context_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsServerApplicationContext), 0, /* n_preallocs */ (GInstanceInitFunc) ags_server_application_context_init, }; static const GInterfaceInfo ags_connectable_interface_info = { (GInterfaceInitFunc) ags_server_application_context_connectable_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_concurrency_provider_interface_info = { (GInterfaceInitFunc) ags_server_application_context_concurrency_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; static const GInterfaceInfo ags_service_provider_interface_info = { (GInterfaceInitFunc) ags_server_application_context_service_provider_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_server_application_context = g_type_register_static(AGS_TYPE_APPLICATION_CONTEXT, "AgsServerApplicationContext", &ags_server_application_context_info, 0); g_type_add_interface_static(ags_type_server_application_context, AGS_TYPE_CONNECTABLE, &ags_connectable_interface_info); g_type_add_interface_static(ags_type_server_application_context, AGS_TYPE_CONCURRENCY_PROVIDER, &ags_concurrency_provider_interface_info); g_type_add_interface_static(ags_type_server_application_context, AGS_TYPE_SERVICE_PROVIDER, &ags_service_provider_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_server_application_context); } return g_define_type_id__volatile; } void ags_server_application_context_class_init(AgsServerApplicationContextClass *server_application_context) { GObjectClass *gobject; AgsApplicationContextClass *application_context; ags_server_application_context_parent_class = g_type_class_peek_parent(server_application_context); /* GObjectClass */ gobject = (GObjectClass *) server_application_context; gobject->set_property = ags_server_application_context_set_property; gobject->get_property = ags_server_application_context_get_property; gobject->finalize = ags_server_application_context_finalize; /* AgsServerApplicationContextClass */ application_context = (AgsApplicationContextClass *) server_application_context; application_context->load_config = NULL; application_context->prepare = ags_server_application_context_prepare; application_context->setup = ags_server_application_context_setup; application_context->register_types = NULL; } void ags_server_application_context_concurrency_provider_interface_init(AgsConcurrencyProviderInterface *concurrency_provider) { concurrency_provider->get_main_loop = ags_server_application_context_get_main_loop; concurrency_provider->set_main_loop = ags_server_application_context_set_main_loop; concurrency_provider->get_task_launcher = ags_server_application_context_get_task_launcher; concurrency_provider->set_task_launcher = ags_server_application_context_set_task_launcher; concurrency_provider->get_thread_pool = ags_server_application_context_get_thread_pool; concurrency_provider->set_thread_pool = ags_server_application_context_set_thread_pool; concurrency_provider->get_worker = ags_server_application_context_get_worker; concurrency_provider->set_worker = ags_server_application_context_set_worker; } void ags_server_application_context_service_provider_interface_init(AgsServiceProviderInterface *service_provider) { service_provider->is_operating = ags_server_application_context_is_operating; service_provider->server_status = ags_server_application_context_server_status; service_provider->set_registry = ags_server_application_context_set_registry; service_provider->get_registry = ags_server_application_context_get_registry; service_provider->set_server = ags_server_application_context_set_server; service_provider->get_server = ags_server_application_context_get_server; } void ags_server_application_context_connectable_interface_init(AgsConnectableInterface *connectable) { ags_server_application_context_parent_connectable_interface = g_type_interface_peek_parent(connectable); connectable->connect = ags_server_application_context_connect; connectable->disconnect = ags_server_application_context_disconnect; } void ags_server_application_context_init(AgsServerApplicationContext *server_application_context) { AgsConfig *config; AgsLog *log; if(ags_application_context == NULL){ ags_application_context = (AgsApplicationContext *) server_application_context; } /* fundamental instances */ config = ags_config_get_instance(); AGS_APPLICATION_CONTEXT(server_application_context)->config = config; g_object_ref(config); log = (GObject *) ags_log_get_instance(); AGS_APPLICATION_CONTEXT(server_application_context)->log = log; g_object_ref(log); /* server application context */ server_application_context->thread_pool = NULL; server_application_context->worker = NULL; server_application_context->is_operating = FALSE; server_application_context->server_status = NULL; server_application_context->registry = NULL; server_application_context->server = NULL; } void ags_server_application_context_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsServerApplicationContext *server_application_context; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_server_application_context_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsServerApplicationContext *server_application_context; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(gobject); switch(prop_id){ default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_server_application_context_connect(AgsConnectable *connectable) { AgsServerApplicationContext *server_application_context; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(connectable); if((AGS_APPLICATION_CONTEXT_CONNECTED & (AGS_APPLICATION_CONTEXT(server_application_context)->flags)) != 0){ return; } ags_server_application_context_parent_connectable_interface->connect(connectable); } void ags_server_application_context_disconnect(AgsConnectable *connectable) { AgsServerApplicationContext *server_application_context; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(connectable); if((AGS_APPLICATION_CONTEXT_CONNECTED & (AGS_APPLICATION_CONTEXT(server_application_context)->flags)) == 0){ return; } ags_server_application_context_parent_connectable_interface->disconnect(connectable); } void ags_server_application_context_finalize(GObject *gobject) { AgsServerApplicationContext *server_application_context; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(gobject); /* call parent */ G_OBJECT_CLASS(ags_server_application_context_parent_class)->finalize(gobject); } AgsThread* ags_server_application_context_get_main_loop(AgsConcurrencyProvider *concurrency_provider) { AgsThread *main_loop; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); main_loop = (AgsThread *) application_context->main_loop; if(main_loop != NULL){ g_object_ref(main_loop); } g_rec_mutex_unlock(application_context_mutex); return(main_loop); } void ags_server_application_context_set_main_loop(AgsConcurrencyProvider *concurrency_provider, AgsThread *main_loop) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->main_loop == main_loop){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->main_loop != NULL){ g_object_unref(application_context->main_loop); } if(main_loop != NULL){ g_object_ref(main_loop); } application_context->main_loop = (GObject *) main_loop; g_rec_mutex_unlock(application_context_mutex); } AgsTaskLauncher* ags_server_application_context_get_task_launcher(AgsConcurrencyProvider *concurrency_provider) { AgsTaskLauncher *task_launcher; AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); task_launcher = (AgsThread *) application_context->task_launcher; if(task_launcher != NULL){ g_object_ref(task_launcher); } g_rec_mutex_unlock(application_context_mutex); return(task_launcher); } void ags_server_application_context_set_task_launcher(AgsConcurrencyProvider *concurrency_provider, AgsTaskLauncher *task_launcher) { AgsApplicationContext *application_context; GRecMutex *application_context_mutex; application_context = AGS_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(application_context->task_launcher == task_launcher){ g_rec_mutex_unlock(application_context_mutex); return; } if(application_context->task_launcher != NULL){ g_object_unref(application_context->task_launcher); } if(task_launcher != NULL){ g_object_ref(task_launcher); } application_context->task_launcher = (GObject *) task_launcher; g_rec_mutex_unlock(application_context_mutex); } AgsThreadPool* ags_server_application_context_get_thread_pool(AgsConcurrencyProvider *concurrency_provider) { AgsThreadPool *thread_pool; AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); thread_pool = server_application_context->thread_pool; if(thread_pool != NULL){ g_object_ref(thread_pool); } g_rec_mutex_unlock(application_context_mutex); return(thread_pool); } void ags_server_application_context_set_thread_pool(AgsConcurrencyProvider *concurrency_provider, AgsThreadPool *thread_pool) { AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(server_application_context->thread_pool == thread_pool){ g_rec_mutex_unlock(application_context_mutex); return; } if(server_application_context->thread_pool != NULL){ g_object_unref(server_application_context->thread_pool); } if(thread_pool != NULL){ g_object_ref(thread_pool); } server_application_context->thread_pool = (GObject *) thread_pool; g_rec_mutex_unlock(application_context_mutex); } GList* ags_server_application_context_get_worker(AgsConcurrencyProvider *concurrency_provider) { AgsServerApplicationContext *server_application_context; GList *worker; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get worker */ g_rec_mutex_lock(application_context_mutex); worker = g_list_copy_deep(server_application_context->worker, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(worker); } void ags_server_application_context_set_worker(AgsConcurrencyProvider *concurrency_provider, GList *worker) { AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(concurrency_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* set worker */ g_rec_mutex_lock(application_context_mutex); if(server_application_context->worker == worker){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(server_application_context->worker, g_object_unref); server_application_context->worker = worker; g_rec_mutex_unlock(application_context_mutex); } gboolean ags_server_application_context_is_operating(AgsServiceProvider *service_provider) { AgsServerApplicationContext *server_application_context; gboolean is_operating; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get gui ready */ g_rec_mutex_lock(application_context_mutex); is_operating = server_application_context->is_operating; g_rec_mutex_unlock(application_context_mutex); return(is_operating); } AgsServerStatus* ags_server_application_context_server_status(AgsServiceProvider *service_provider) { AgsServerStatus *server_status; AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); server_status = server_application_context->server_status; if(server_status != NULL){ g_object_ref(server_status); } g_rec_mutex_unlock(application_context_mutex); return(server_status); } AgsRegistry* ags_server_application_context_get_registry(AgsServiceProvider *service_provider) { AgsRegistry *registry; AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get thread pool */ g_rec_mutex_lock(application_context_mutex); registry = server_application_context->registry; if(registry != NULL){ g_object_ref(registry); } g_rec_mutex_unlock(application_context_mutex); return(registry); } void ags_server_application_context_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry) { AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get main loop */ g_rec_mutex_lock(application_context_mutex); if(server_application_context->registry == registry){ g_rec_mutex_unlock(application_context_mutex); return; } if(server_application_context->registry != NULL){ g_object_unref(server_application_context->registry); } if(registry != NULL){ g_object_ref(registry); } server_application_context->registry = (GObject *) registry; g_rec_mutex_unlock(application_context_mutex); } GList* ags_server_application_context_get_server(AgsServiceProvider *service_provider) { AgsServerApplicationContext *server_application_context; GList *server; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* get server */ g_rec_mutex_lock(application_context_mutex); server = g_list_copy_deep(server_application_context->server, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(application_context_mutex); return(server); } void ags_server_application_context_set_server(AgsServiceProvider *service_provider, GList *server) { AgsServerApplicationContext *server_application_context; GRecMutex *application_context_mutex; server_application_context = AGS_SERVER_APPLICATION_CONTEXT(service_provider); /* get mutex */ application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(server_application_context); /* set server */ g_rec_mutex_lock(application_context_mutex); if(server_application_context->server == server){ g_rec_mutex_unlock(application_context_mutex); return; } g_list_free_full(server_application_context->server, g_object_unref); server_application_context->server = server; g_rec_mutex_unlock(application_context_mutex); } void ags_server_application_context_prepare(AgsApplicationContext *application_context) { AgsServerApplicationContext *server_application_context; AgsThread *generic_main_loop; AgsTaskLauncher *task_launcher; GMainContext *server_main_context; GMainLoop *main_loop; server_application_context = (AgsServerApplicationContext *) application_context; /* call parent */ // AGS_APPLICATION_CONTEXT_CLASS(ags_server_application_context_parent_class)->prepare(application_context); /* register types */ ags_application_context_register_types(application_context); /* * fundamental thread setup */ /* server main context and main loop */ server_main_context = g_main_context_new(); g_main_context_ref(server_main_context); server_application_context->server_main_context = server_main_context; main_loop = g_main_loop_new(server_main_context, TRUE); g_thread_new("Advanced Gtk+ Sequencer - server main loop", ags_server_application_context_server_main_loop_thread, main_loop); /* AgsGenericMainLoop */ generic_main_loop = (AgsThread *) ags_generic_main_loop_new(); g_object_ref(generic_main_loop); application_context->main_loop = (GObject *) generic_main_loop; ags_connectable_connect(AGS_CONNECTABLE(generic_main_loop)); /* AgsTaskLauncher */ task_launcher = ags_task_launcher_new(); g_object_ref(task_launcher); application_context->task_launcher = (GObject *) task_launcher; ags_connectable_connect(AGS_CONNECTABLE(task_launcher)); ags_task_launcher_attach(task_launcher, server_main_context); } void ags_server_application_context_setup(AgsApplicationContext *application_context) { AgsServerApplicationContext *server_application_context; AgsServer *server; AgsThread *main_loop; AgsTaskLauncher *task_launcher; AgsLog *log; AgsConfig *config; gchar *server_group; gchar *str; guint i; GRecMutex *application_context_mutex; server_application_context = (AgsServerApplicationContext *) application_context; application_context_mutex = AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX(application_context); /* config and log */ config = ags_config_get_instance(); log = ags_log_get_instance(); /* main loop and task launcher */ main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); task_launcher = ags_concurrency_provider_get_task_launcher(AGS_CONCURRENCY_PROVIDER(application_context)); /* AgsWorkerThread */ server_application_context->worker = NULL; /* AgsThreadPool */ server_application_context->thread_pool = NULL; /* AgsServer */ server_application_context->server = NULL; server = NULL; server_group = g_strdup("server"); for(i = 0; ; i++){ gchar *ip4, *ip6; guint server_port; gboolean auto_start; gboolean any_address; gboolean enable_ip4, enable_ip6; if(!g_key_file_has_group(config->key_file, server_group)){ if(i == 0){ g_free(server_group); server_group = g_strdup_printf("%s-%d", AGS_CONFIG_SERVER, i); continue; }else{ break; } } server = ags_server_new(); server_application_context->server = g_list_append(server_application_context->server, server); g_object_ref(server); /* realm */ str = ags_config_get_value(config, server_group, "realm"); if(str != NULL){ g_object_set(server, "realm", str, NULL); g_free(str); } /* any address */ any_address = FALSE; str = ags_config_get_value(config, server_group, "any-address"); if(str != NULL){ any_address = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(any_address){ ags_server_set_flags(server, (AGS_SERVER_ANY_ADDRESS)); } /* enable ip4 and ip6 */ enable_ip4 = FALSE; enable_ip6 = FALSE; str = ags_config_get_value(config, server_group, "enable-ip4"); if(str != NULL){ enable_ip4 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } str = ags_config_get_value(config, server_group, "enable-ip6"); if(str != NULL){ enable_ip6 = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(enable_ip4){ ags_server_set_flags(server, (AGS_SERVER_INET4)); } if(enable_ip6){ ags_server_set_flags(server, (AGS_SERVER_INET6)); } /* ip4 and ip6 address */ str = ags_config_get_value(config, server_group, "ip4-address"); if(str != NULL){ g_object_set(server, "ip4", str, NULL); g_free(str); } str = ags_config_get_value(config, server_group, "ip6-address"); if(str != NULL){ g_object_set(server, "ip6", str, NULL); g_free(str); } /* server port */ str = ags_config_get_value(config, server_group, "server-port"); if(str != NULL){ server_port = (guint) g_ascii_strtoull(str, NULL, 10); g_object_set(server, "server-port", server_port, NULL); } /* auto-start */ auto_start = FALSE; str = ags_config_get_value(config, server_group, "auto-start"); if(str != NULL){ auto_start = (!g_ascii_strncasecmp(str, "true", 5)) ? TRUE: FALSE; g_free(str); } if(auto_start){ ags_server_set_flags(server, AGS_SERVER_AUTO_START); } g_free(server_group); server_group = g_strdup_printf("%s-%d", AGS_CONFIG_SERVER, i); } if(server == NULL){ server = ags_server_new(); ags_server_set_flags(server, (AGS_SERVER_INET4)); server_application_context->server = g_list_append(server_application_context->server, server); g_object_ref(server); } g_rec_mutex_lock(application_context_mutex); server_application_context->is_operating = TRUE; g_rec_mutex_unlock(application_context_mutex); /* unref */ g_object_unref(main_loop); g_object_unref(task_launcher); } void* ags_server_application_context_server_main_loop_thread(GMainLoop *main_loop) { AgsApplicationContext *application_context; GList *start_list, *list; #ifdef AGS_WITH_RT AgsPriority *priority; struct sched_param param; gchar *str; #endif g_main_context_push_thread_default(g_main_loop_get_context(main_loop)); application_context = ags_application_context_get_instance(); while(!ags_service_provider_is_operating(AGS_SERVICE_PROVIDER(application_context))){ usleep(G_USEC_PER_SEC / 30); } /* real-time setup */ #ifdef AGS_WITH_RT priority = ags_priority_get_instance(); param.sched_priority = 15; str = ags_priority_get_value(priority, AGS_PRIORITY_RT_THREAD, AGS_PRIORITY_KEY_SERVER_MAIN_LOOP); if(str != NULL){ param.sched_priority = (int) g_ascii_strtoull(str, NULL, 10); } if(str == NULL || ((!g_ascii_strncasecmp(str, "0", 2)) != TRUE)){ if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); } } g_free(str); #endif list = start_list = ags_service_provider_get_server(AGS_SERVICE_PROVIDER(application_context)); while(list != NULL){ if(ags_server_test_flags(list->data, AGS_SERVER_AUTO_START)){ ags_server_start(AGS_SERVER(list->data)); } list = list->next; } g_list_free_full(start_list, g_object_unref); g_main_loop_run(main_loop); g_thread_exit(NULL); return(NULL); } /** * ags_server_application_context_new: * * Instantiate server application context. * * Returns: the new #AgsServerApplicationContext * * Since: 3.0.0 */ AgsServerApplicationContext* ags_server_application_context_new() { AgsServerApplicationContext *server_application_context; server_application_context = (AgsServerApplicationContext *) g_object_new(AGS_TYPE_SERVER_APPLICATION_CONTEXT, NULL); return(server_application_context); } gsequencer-3.1.3/ags/server/ags_server.c0000644000175000017500000007517613613101164015200 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #ifndef AGS_W32API #include #include #include #endif #include #include void ags_server_class_init(AgsServerClass *server); void ags_server_init(AgsServer *server); void ags_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_server_dispose(GObject *gobject); void ags_server_finalize(GObject *gobject); void ags_server_real_start(AgsServer *server); void ags_server_real_stop(AgsServer *server); gboolean ags_server_real_listen(AgsServer *server); gboolean ags_server_xmlrpc_auth_callback(SoupAuthDomain *domain, SoupMessage *msg, const char *username, const char *password, AgsServer *server); char* ags_server_xmlrpc_digest_auth_callback(SoupAuthDomain *domain, SoupMessage *msg, const char *username, AgsServer *server); void ags_server_xmlrpc_callback(SoupServer *soup_server, SoupMessage *msg, const char *path, GHashTable *query, SoupClientContext *client, AgsServer *server); /** * SECTION:ags_server * @short_description: remote control server * @title: AgsServer * @section_id: * @include: ags/server/ags_server.h * * The #AgsServer is a XML-RPC server. */ enum{ PROP_0, PROP_DOMAIN, PROP_SERVER_PORT, PROP_IP4, PROP_IP6, PROP_REALM, PROP_FRONT_CONTROLLER, PROP_CONTROLLER, }; enum{ START, STOP, LISTEN, LAST_SIGNAL, }; static gpointer ags_server_parent_class = NULL; static guint server_signals[LAST_SIGNAL]; GType ags_server_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_server = 0; static const GTypeInfo ags_server = { sizeof(AgsServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AgsServer), 0, /* n_preallocs */ (GInstanceInitFunc) ags_server_init, }; ags_type_server = g_type_register_static(G_TYPE_OBJECT, "AgsServer", &ags_server, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_server); } return g_define_type_id__volatile; } void ags_server_class_init(AgsServerClass *server) { GObjectClass *gobject; GParamSpec *param_spec; ags_server_parent_class = g_type_class_peek_parent(server); /* GObjectClass */ gobject = (GObjectClass *) server; gobject->set_property = ags_server_set_property; gobject->get_property = ags_server_get_property; gobject->dispose = ags_server_dispose; gobject->finalize = ags_server_finalize; /* properties */ /** * AgsServer:domain: * * The domain to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("domain", i18n_pspec("domain"), i18n_pspec("The domain to use"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DOMAIN, param_spec); /** * AgsServer:server-port: * * The server port to use. * * Since: 3.0.0 */ param_spec = g_param_spec_uint("server-port", i18n_pspec("server port"), i18n_pspec("The server port to use"), 0, G_MAXUINT32, AGS_SERVER_DEFAULT_SERVER_PORT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_SERVER_PORT, param_spec); /** * AgsServer:ip4: * * The IPv4 address as string of the server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip4", i18n_pspec("ip4"), i18n_pspec("The IPv4 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP4, param_spec); /** * AgsServer:ip6: * * The IPv6 address as string of the server. * * Since: 3.0.0 */ param_spec = g_param_spec_string("ip6", i18n_pspec("ip6"), i18n_pspec("The IPv6 address of the server"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_IP6, param_spec); /** * AgsServer:realm: * * The realm to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("realm", i18n_pspec("realm"), i18n_pspec("The realm to use"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REALM, param_spec); /** * AgsServer:front-controller: * * The assigned #AgsFrontController. * * Since: 3.0.0 */ param_spec = g_param_spec_object("front-controller", i18n_pspec("assigned front controller"), i18n_pspec("The front controller it is assigned with"), AGS_TYPE_FRONT_CONTROLLER, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FRONT_CONTROLLER, param_spec); /** * AgsServer:controller: (type GList(AgsController)) (transfer full) * * The assigned #AgsController providing default settings. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("controller", i18n_pspec("assigned controller"), i18n_pspec("The controller it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_CONTROLLER, param_spec); /* AgsServer */ server->start = ags_server_real_start; server->stop = ags_server_real_stop; server->listen = ags_server_real_listen; /* signals */ /** * AgsServer::start: * @server: the #AgsServer * * The ::start signal is emitted as the server starts. * * Since: 3.0.0 */ server_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS(server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsServerClass, start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsServer::stop: * @server: the #AgsServer * * The ::stop signal is emitted as the server stops. * * Since: 3.0.0 */ server_signals[STOP] = g_signal_new("stop", G_TYPE_FROM_CLASS(server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsServerClass, stop), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsServer::listen: * @server: the #AgsServer * * The ::listen signal is emited during listen of server. * * Returns: %TRUE as a new connection was initiated, otherwise %FALSE * * Since: 3.0.0 */ server_signals[LISTEN] = g_signal_new("listen", G_TYPE_FROM_CLASS(server), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsServerClass, listen), NULL, NULL, ags_cclosure_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); } void ags_server_init(AgsServer *server) { server->flags = 0; g_rec_mutex_init(&(server->obj_mutex)); /* uuid */ server->uuid = ags_uuid_alloc(); ags_uuid_generate(server->uuid); /* */ server->server_info = ags_server_info_alloc("localhost", ags_uuid_to_string(server->uuid)); server->ip4 = g_strdup(AGS_SERVER_DEFAULT_INET4_ADDRESS); server->ip6 = g_strdup(AGS_SERVER_DEFAULT_INET6_ADDRESS); server->domain = g_strdup(AGS_SERVER_DEFAULT_DOMAIN); server->server_port = AGS_SERVER_DEFAULT_SERVER_PORT; server->ip4_fd = -1; server->ip6_fd = -1; server->ip4_socket = NULL; server->ip6_socket = NULL; server->ip4_address = NULL; server->ip6_address = NULL; server->realm = NULL; server->soup_server = NULL; server->auth_module = g_strdup(AGS_SERVER_DEFAULT_AUTH_MODULE); server->front_controller = NULL; server->controller = NULL; } void ags_server_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsServer *server; GRecMutex *server_mutex; server = AGS_SERVER(gobject); /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); switch(prop_id){ case PROP_DOMAIN: { gchar *domain; domain = g_value_get_string(value); g_rec_mutex_lock(server_mutex); if(server->domain == domain){ g_rec_mutex_unlock(server_mutex); return; } g_free(server->domain); server->domain = g_strdup(domain); g_rec_mutex_unlock(server_mutex); } break; case PROP_SERVER_PORT: { guint server_port; server_port = g_value_get_uint(value); g_rec_mutex_lock(server_mutex); server->server_port = server_port; g_rec_mutex_unlock(server_mutex); } break; case PROP_IP4: { gchar *ip4; ip4 = g_value_get_string(value); g_rec_mutex_lock(server_mutex); if(server->ip4 == ip4){ g_rec_mutex_unlock(server_mutex); return; } g_free(server->ip4); server->ip4 = g_strdup(ip4); g_rec_mutex_unlock(server_mutex); } break; case PROP_IP6: { gchar *ip6; ip6 = g_value_get_string(value); g_rec_mutex_lock(server_mutex); if(server->ip6 == ip6){ g_rec_mutex_unlock(server_mutex); return; } g_free(server->ip6); server->ip6 = g_strdup(ip6); g_rec_mutex_unlock(server_mutex); } break; case PROP_REALM: { gchar *realm; realm = g_value_get_string(value); g_rec_mutex_lock(server_mutex); if(server->realm == realm){ g_rec_mutex_unlock(server_mutex); return; } g_free(server->realm); server->realm = g_strdup(realm); g_rec_mutex_unlock(server_mutex); } break; case PROP_FRONT_CONTROLLER: { GObject *front_controller; front_controller = g_value_get_object(value); g_rec_mutex_lock(server_mutex); if(server->front_controller == front_controller){ g_rec_mutex_unlock(server_mutex); return; } if(server->front_controller != NULL){ g_object_unref(server->front_controller); } if(front_controller != NULL){ g_object_ref(front_controller); } server->front_controller = front_controller; g_rec_mutex_unlock(server_mutex); } break; case PROP_CONTROLLER: { GObject *controller; controller = g_value_get_pointer(value); g_rec_mutex_lock(server_mutex); if(g_list_find(server->controller, controller) != NULL){ g_rec_mutex_unlock(server_mutex); return; } g_rec_mutex_unlock(server_mutex); ags_server_add_controller(server, controller); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_server_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsServer *server; GRecMutex *server_mutex; server = AGS_SERVER(gobject); /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); switch(prop_id){ case PROP_DOMAIN: { g_rec_mutex_lock(server_mutex); g_value_set_string(value, server->domain); g_rec_mutex_unlock(server_mutex); } break; case PROP_SERVER_PORT: { g_rec_mutex_lock(server_mutex); g_value_set_uint(value, server->server_port); g_rec_mutex_unlock(server_mutex); } break; case PROP_IP4: { g_rec_mutex_lock(server_mutex); g_value_set_string(value, server->ip4); g_rec_mutex_unlock(server_mutex); } break; case PROP_IP6: { g_rec_mutex_lock(server_mutex); g_value_set_string(value, server->ip6); g_rec_mutex_unlock(server_mutex); } break; case PROP_REALM: { g_rec_mutex_lock(server_mutex); g_value_set_string(value, server->realm); g_rec_mutex_unlock(server_mutex); } break; case PROP_FRONT_CONTROLLER: { g_rec_mutex_lock(server_mutex); g_value_set_object(value, server->front_controller); g_rec_mutex_unlock(server_mutex); } break; case PROP_CONTROLLER: { g_rec_mutex_lock(server_mutex); g_value_set_pointer(value, g_list_copy_deep(server->controller, (GCopyFunc) g_object_ref, NULL)); g_rec_mutex_unlock(server_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_server_dispose(GObject *gobject) { AgsServer *server; server = AGS_SERVER(gobject); if(server->front_controller != NULL){ g_object_unref(server->front_controller); server->front_controller = NULL; } if(server->controller != NULL){ g_list_free_full(server->controller, g_object_unref); server->controller = NULL; } /* call parent */ G_OBJECT_CLASS(ags_server_parent_class)->dispose(gobject); } void ags_server_finalize(GObject *gobject) { AgsServer *server; server = AGS_SERVER(gobject); g_free(server->domain); g_free(server->realm); if(server->front_controller != NULL){ g_object_unref(server->front_controller); } if(server->controller != NULL){ g_list_free_full(server->controller, g_object_unref); } /* call parent */ G_OBJECT_CLASS(ags_server_parent_class)->finalize(gobject); } /** * ags_server_test_flags: * @server: the #AgsServer * @flags: the flags * * Test @flags to be set on @server. * * Returns: %TRUE if flags are set, else %FALSE * * Since: 3.0.0 */ gboolean ags_server_test_flags(AgsServer *server, guint flags) { gboolean retval; GRecMutex *server_mutex; if(!AGS_IS_SERVER(server)){ return(FALSE); } /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); /* test */ g_rec_mutex_lock(server_mutex); retval = (flags & (server->flags)) ? TRUE: FALSE; g_rec_mutex_unlock(server_mutex); return(retval); } /** * ags_server_set_flags: * @server: the #AgsServer * @flags: see #AgsServerFlags-enum * * Enable a feature of @server. * * Since: 3.0.0 */ void ags_server_set_flags(AgsServer *server, guint flags) { GRecMutex *server_mutex; if(!AGS_IS_SERVER(server)){ return; } /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); //TODO:JK: add more? /* set flags */ g_rec_mutex_lock(server_mutex); server->flags |= flags; g_rec_mutex_unlock(server_mutex); } /** * ags_server_unset_flags: * @server: the #AgsServer * @flags: see #AgsServerFlags-enum * * Disable a feature of @server. * * Since: 3.0.0 */ void ags_server_unset_flags(AgsServer *server, guint flags) { GRecMutex *server_mutex; if(!AGS_IS_SERVER(server)){ return; } /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); //TODO:JK: add more? /* unset flags */ g_rec_mutex_lock(server_mutex); server->flags &= (~flags); g_rec_mutex_unlock(server_mutex); } /** * ags_server_info_alloc: * @server_name: the server name * @uuid: the uuid * * Allocate server info. * * Returns: the allocated #AgsServerInfo-struct * * Since: 3.0.0 */ AgsServerInfo* ags_server_info_alloc(gchar *server_name, gchar *uuid) { AgsServerInfo *server_info; server_info = (AgsServerInfo *) malloc(sizeof(AgsServerInfo)); server_info->uuid = uuid; server_info->server_name = server_name; return(server_info); } /** * ags_server_add_controller: * @server: the #AgsServer * @controller: the #AgsController * * Add @controller to @server. * * Since: 3.0.0 */ void ags_server_add_controller(AgsServer *server, GObject *controller) { if(!AGS_IS_SERVER(server) || !AGS_IS_CONTROLLER(controller)){ return; } if(g_list_find(server->controller, controller) == NULL){ g_object_ref(controller); server->controller = g_list_prepend(server->controller, controller); g_object_set(controller, "server", server, NULL); } } /** * ags_server_remove_controller: * @server: the #AgsServer * @controller: the #AgsController * * Remove @controller from @server. * * Since: 3.0.0 */ void ags_server_remove_controller(AgsServer *server, GObject *controller) { if(!AGS_IS_SERVER(server) || !AGS_IS_CONTROLLER(controller)){ return; } if(g_list_find(server->controller, controller) != NULL){ server->controller = g_list_remove(server->controller, controller); g_object_set(controller, "server", NULL, NULL); g_object_unref(controller); } } void ags_server_real_start(AgsServer *server) { AgsFrontController *front_controller; gboolean any_address; gboolean ip4_success, ip6_success; GError *error; GRecMutex *server_mutex; if(ags_server_test_flags(server, AGS_SERVER_STARTED)){ return; } ags_server_set_flags(server, AGS_SERVER_STARTED); /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); any_address = ags_server_test_flags(server, AGS_SERVER_ANY_ADDRESS); ip4_success = FALSE; ip6_success = FALSE; if(ags_server_test_flags(server, AGS_SERVER_INET4)){ ip4_success = TRUE; /* create socket */ g_rec_mutex_lock(server_mutex); error = NULL; server->ip4_socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error); server->ip4_fd = g_socket_get_fd(server->ip4_socket); g_socket_set_listen_backlog(server->ip4_socket, AGS_SERVER_DEFAULT_BACKLOG); g_rec_mutex_unlock(server_mutex); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } /* get ip4 */ if(any_address){ g_rec_mutex_lock(server_mutex); server->ip4_address = g_inet_socket_address_new(g_inet_address_new_any(G_SOCKET_FAMILY_IPV4), server->server_port); g_rec_mutex_unlock(server_mutex); }else{ g_rec_mutex_lock(server_mutex); server->ip4_address = g_inet_socket_address_new(g_inet_address_new_from_string(server->ip4), server->server_port); g_rec_mutex_unlock(server_mutex); } } if(ags_server_test_flags(server, AGS_SERVER_INET6)){ ip6_success = TRUE; /* create socket */ g_rec_mutex_lock(server_mutex); error = NULL; server->ip6_socket = g_socket_new(G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_TCP, &error); server->ip6_fd = g_socket_get_fd(server->ip6_socket); g_socket_set_listen_backlog(server->ip6_socket, AGS_SERVER_DEFAULT_BACKLOG); g_rec_mutex_unlock(server_mutex); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } /* get ip6 */ if(any_address){ g_rec_mutex_lock(server_mutex); server->ip6_address = g_inet_socket_address_new(g_inet_address_new_any(G_SOCKET_FAMILY_IPV6), server->server_port); g_rec_mutex_unlock(server_mutex); }else{ g_rec_mutex_lock(server_mutex); server->ip6_address = g_inet_socket_address_new(g_inet_address_new_from_string(server->ip6), server->server_port); g_rec_mutex_unlock(server_mutex); } } if(ip4_success != TRUE && ip6_success != TRUE){ g_critical("no protocol family"); return; } if(ip4_success){ error = NULL; g_socket_bind(server->ip4_socket, server->ip4_address, TRUE, &error); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } } if(ip6_success){ error = NULL; g_socket_bind(server->ip6_socket, server->ip6_address, TRUE, &error); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } } front_controller = ags_front_controller_new(); g_object_set(front_controller, "server", server, NULL); g_object_set(server, "front-controller", front_controller, NULL); ags_server_set_flags(server, AGS_SERVER_RUNNING); g_message("starting to listen on XMLRPC"); /* create listen thread */ server->soup_server = soup_server_new(NULL); server->auth_domain = soup_auth_domain_basic_new(SOUP_AUTH_DOMAIN_REALM, server->realm, SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, ags_server_xmlrpc_auth_callback, SOUP_AUTH_DOMAIN_BASIC_AUTH_DATA, server, SOUP_AUTH_DOMAIN_ADD_PATH, AGS_CONTROLLER_BASE_PATH, NULL); soup_server_add_auth_domain(server->soup_server, server->auth_domain); soup_server_add_handler(server->soup_server, AGS_CONTROLLER_BASE_PATH, ags_server_xmlrpc_callback, server, NULL); ags_server_listen(server); } /** * ags_server_start: * @server: the #AgsServer * * Start the XMLRPC-C abyss server. * * Since: 3.0.0 */ void ags_server_start(AgsServer *server) { g_return_if_fail(AGS_IS_SERVER(server)); g_object_ref((GObject *) server); g_signal_emit(G_OBJECT(server), server_signals[START], 0); g_object_unref((GObject *) server); } void ags_server_real_stop(AgsServer *server) { GError *error; GRecMutex *server_mutex; if(!ags_server_test_flags(server, AGS_SERVER_RUNNING)){ return; } /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); /* stop */ ags_server_set_flags(server, AGS_SERVER_TERMINATING); ags_server_unset_flags(server, AGS_SERVER_RUNNING); /* close fd */ g_rec_mutex_lock(server_mutex); soup_server_disconnect(server->soup_server); if(server->ip4_fd != -1){ error = NULL; g_socket_close(server->ip4_socket, &error); g_object_unref(server->ip4_socket); server->ip4_socket = NULL; server->ip4_fd = -1; } if(server->ip6_fd != -1){ error = NULL; g_socket_close(server->ip6_socket, &error); g_object_unref(server->ip6_socket); server->ip6_socket = NULL; server->ip6_fd = -1; } g_rec_mutex_unlock(server_mutex); ags_server_unset_flags(server, (AGS_SERVER_STARTED | AGS_SERVER_TERMINATING)); } /** * ags_server_stop: * @server: the #AgsServer * * Stop the XMLRPC-C abyss server. * * Since: 3.0.0 */ void ags_server_stop(AgsServer *server) { g_return_if_fail(AGS_IS_SERVER(server)); g_object_ref((GObject *) server); g_signal_emit(G_OBJECT(server), server_signals[STOP], 0); g_object_unref((GObject *) server); } gboolean ags_server_real_listen(AgsServer *server) { GError *error; GRecMutex *server_mutex; if(!ags_server_test_flags(server, AGS_SERVER_STARTED)){ return(FALSE); } /* get server mutex */ server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); if(server->ip4_fd != -1){ g_rec_mutex_lock(server_mutex); error = NULL; g_socket_listen(server->ip4_socket, &error); g_rec_mutex_unlock(server_mutex); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } g_rec_mutex_lock(server_mutex); error = NULL; soup_server_listen_socket(server->soup_server, server->ip4_socket, 0, &error); g_rec_mutex_unlock(server_mutex); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } } if(server->ip6_fd != -1){ g_rec_mutex_lock(server_mutex); error = NULL; g_socket_listen(server->ip6_socket, &error); g_rec_mutex_unlock(server_mutex); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } g_rec_mutex_lock(server_mutex); error = NULL; soup_server_listen_socket(server->soup_server, server->ip6_socket, 0, &error); g_rec_mutex_unlock(server_mutex); if(error != NULL){ g_critical("AgsServer - %s", error->message); g_error_free(error); } } return(FALSE); } /** * ags_server_listen: * @server: the #AgsServer * * Listen as server. * * Returns: %TRUE as a new connection was initiated, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_server_listen(AgsServer *server) { gboolean created_connection; g_return_val_if_fail(AGS_IS_SERVER(server), FALSE); g_object_ref((GObject *) server); g_signal_emit(G_OBJECT(server), server_signals[LISTEN], 0, &created_connection); g_object_unref((GObject *) server); return(created_connection); } gboolean ags_server_xmlrpc_auth_callback(SoupAuthDomain *domain, SoupMessage *msg, const char *username, const char *password, AgsServer *server) { AgsAuthenticationManager *authentication_manager; gchar *security_token; gboolean success; if(!AGS_IS_SERVER(server)){ return(FALSE); } authentication_manager = ags_authentication_manager_get_instance(); success = ags_authentication_manager_login(authentication_manager, server->auth_module, username, password, NULL, &security_token); if(success){ SoupCookie *login_cookie; SoupCookie *session_cookie; GSList *cookie; gchar *domain; gchar *path; GRecMutex *server_mutex; server_mutex = AGS_SERVER_GET_OBJ_MUTEX(server); domain = NULL; path = NULL; g_rec_mutex_lock(server_mutex); if(server->domain != NULL && strchr(server->domain, '.') != NULL){ domain = g_strdup(server->domain); path = "/"; } g_rec_mutex_unlock(server_mutex); /* request */ cookie = NULL; login_cookie = soup_cookie_new("ags-srv-login", username, domain, path, -1); cookie = g_slist_prepend(cookie, login_cookie); session_cookie = soup_cookie_new("ags-srv-security-token", security_token, domain, path, -1); cookie = g_slist_prepend(cookie, session_cookie); soup_cookies_to_request(cookie, msg); /* response */ cookie = NULL; login_cookie = soup_cookie_new("ags-srv-login", username, domain, path, -1); cookie = g_slist_prepend(cookie, login_cookie); session_cookie = soup_cookie_new("ags-srv-security-token", security_token, domain, path, -1); cookie = g_slist_prepend(cookie, session_cookie); soup_cookies_to_response(cookie, msg); g_free(domain); } return(success); } char* ags_server_xmlrpc_digest_auth_callback(SoupAuthDomain *domain, SoupMessage *msg, const char *username, AgsServer *server) { AgsAuthenticationManager *authentication_manager; GSList *cookie; gchar *security_token; char *digest; if(!AGS_IS_SERVER(server)){ return(FALSE); } authentication_manager = ags_authentication_manager_get_instance(); cookie = soup_cookies_from_request(msg); security_token = NULL; while(cookie != NULL){ char *cookie_name; cookie_name = soup_cookie_get_name(cookie->data); if(!g_ascii_strncasecmp(cookie_name, "ags-srv-security-token", 23)){ security_token = soup_cookie_get_value(cookie->data); break; } cookie = cookie->next; } digest = ags_authentication_manager_get_digest(authentication_manager, server->auth_module, server->realm, username, security_token); return(digest); } void ags_server_xmlrpc_callback(SoupServer *soup_server, SoupMessage *msg, const char *path, GHashTable *query, SoupClientContext *client, AgsServer *server) { AgsAuthenticationManager *authentication_manager; AgsFrontController *front_controller; AgsSecurityContext *security_context; AgsLoginInfo *login_info; GSList *cookie; gchar *login; gchar *user_uuid; gchar *security_token; GRecMutex *authentication_manager_mutex; authentication_manager = ags_authentication_manager_get_instance(); authentication_manager_mutex = AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX(authentication_manager); cookie = soup_cookies_from_request(msg); login = NULL; security_token = NULL; while(cookie != NULL){ char *cookie_name; cookie_name = soup_cookie_get_name(cookie->data); if(!g_ascii_strncasecmp(cookie_name, "ags-srv-login", 14)){ login = soup_cookie_get_value(cookie->data); }else if(!g_ascii_strncasecmp(cookie_name, "ags-srv-security-token", 23)){ security_token = soup_cookie_get_value(cookie->data); } if(login != NULL && security_token != NULL){ break; } cookie = cookie->next; } login_info = ags_authentication_manager_lookup_login(authentication_manager, login); if(login_info != NULL){ g_object_get(server, "front-controller", &front_controller, NULL); g_rec_mutex_lock(authentication_manager_mutex); security_context = login_info->security_context; g_object_ref(security_context); user_uuid = g_strdup(login_info->user_uuid); g_rec_mutex_unlock(authentication_manager_mutex); if(ags_authentication_manager_is_session_active(authentication_manager, security_context, user_uuid, security_token)){ ags_front_controller_do_request(front_controller, msg, query, client, security_context, path, login, security_token); }else{ g_message("AgsServer - session not active"); } g_object_unref(front_controller); g_object_unref(security_context); ags_login_info_unref(login_info); g_free(user_uuid); } } /** * ags_server_new: * * Instantiate #AgsServer. * * Returns: a new #AgsServer * * Since: 3.0.0 */ AgsServer* ags_server_new() { AgsServer *server; server = (AgsServer *) g_object_new(AGS_TYPE_SERVER, NULL); return(server); } gsequencer-3.1.3/ags/server/ags_server_status.h0000644000175000017500000000414013607210263016573 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SERVER_STATUS_H__ #define __AGS_SERVER_STATUS_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_SERVER_STATUS (ags_server_status_get_type()) #define AGS_SERVER_STATUS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SERVER_STATUS, AgsServerStatus)) #define AGS_SERVER_STATUS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SERVER_STATUS, AgsServerStatusClass)) #define AGS_IS_SERVER_STATUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SERVER_STATUS)) #define AGS_IS_SERVER_STATUS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SERVER_STATUS)) #define AGS_SERVER_STATUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SERVER_STATUS, AgsServerStatusClass)) #define AGS_SERVER_STATUS_GET_OBJ_MUTEX(obj) (&(((AgsServerStatus *) obj)->obj_mutex)) typedef struct _AgsServerStatus AgsServerStatus; typedef struct _AgsServerStatusClass AgsServerStatusClass; struct _AgsServerStatus { GObject gobject; guint flags; GRecMutex obj_mutex; gchar **authentication_module; guint maximum_connections; guint connection_count; }; struct _AgsServerStatusClass { GObjectClass gobject; }; GType ags_server_status_get_type(); AgsServerStatus* ags_server_status_new(); G_END_DECLS #endif /*__AGS_SERVER_STATUS_H__*/ gsequencer-3.1.3/ags/server/ags_service_provider.c0000644000175000017500000001244413607210263017235 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #include void ags_service_provider_class_init(AgsServiceProviderInterface *ginterface); GType ags_service_provider_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_service_provider = 0; ags_type_service_provider = g_type_register_static_simple(G_TYPE_INTERFACE, "AgsServiceProvider", sizeof(AgsServiceProviderInterface), (GClassInitFunc) ags_service_provider_class_init, 0, NULL, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_service_provider); } return g_define_type_id__volatile; } void ags_service_provider_class_init(AgsServiceProviderInterface *ginterface) { /* empty */ } /** * ags_service_provider_is_operating: * @service_provider: the #AgsServiceProvider * * Check if is operating. * * Returns: %TRUE if operating, otherwise %FALSE * * Since: 3.0.0 */ gboolean ags_service_provider_is_operating(AgsServiceProvider *service_provider) { AgsServiceProviderInterface *service_provider_interface; g_return_val_if_fail(AGS_IS_SERVICE_PROVIDER(service_provider), NULL); service_provider_interface = AGS_SERVICE_PROVIDER_GET_INTERFACE(service_provider); g_return_val_if_fail(service_provider_interface->is_operating, NULL); return(service_provider_interface->is_operating(service_provider)); } /** * ags_service_provider_server_status: * @service_provider: the #AgsServiceProvider * * Get server status. * * Returns: the #AgsServerStatus * * Since: 3.0.0 */ AgsServerStatus* ags_service_provider_server_status(AgsServiceProvider *service_provider) { AgsServiceProviderInterface *service_provider_interface; g_return_val_if_fail(AGS_IS_SERVICE_PROVIDER(service_provider), NULL); service_provider_interface = AGS_SERVICE_PROVIDER_GET_INTERFACE(service_provider); g_return_val_if_fail(service_provider_interface->server_status, NULL); return(service_provider_interface->server_status(service_provider)); } /** * ags_service_provider_set_registry: * @service_provider: the #AgsServiceProvider * @registry: the #AgsRegistry * * Set registry. * * Since: 3.0.0 */ void ags_service_provider_set_registry(AgsServiceProvider *service_provider, AgsRegistry *registry) { AgsServiceProviderInterface *service_provider_interface; g_return_if_fail(AGS_IS_SERVICE_PROVIDER(service_provider)); service_provider_interface = AGS_SERVICE_PROVIDER_GET_INTERFACE(service_provider); g_return_if_fail(service_provider_interface->set_registry); service_provider_interface->set_registry(service_provider, registry); } /** * ags_service_provider_get_registry: * @service_provider: the #AgsServiceProvider * * Get registry. * * Returns: the #AgsRegistry * * Since: 3.0.0 */ AgsRegistry* ags_service_provider_get_registry(AgsServiceProvider *service_provider) { AgsServiceProviderInterface *service_provider_interface; g_return_val_if_fail(AGS_IS_SERVICE_PROVIDER(service_provider), NULL); service_provider_interface = AGS_SERVICE_PROVIDER_GET_INTERFACE(service_provider); g_return_val_if_fail(service_provider_interface->get_registry, NULL); return(service_provider_interface->get_registry(service_provider)); } /** * ags_service_provider_set_server: * @service_provider: the #AgsServiceProvider * @server: (element-type Ags.Server): the #GList-struct containing #AgsServer * * Set server. * * Since: 3.0.0 */ void ags_service_provider_set_server(AgsServiceProvider *service_provider, GList *server) { AgsServiceProviderInterface *service_provider_interface; g_return_if_fail(AGS_IS_SERVICE_PROVIDER(service_provider)); service_provider_interface = AGS_SERVICE_PROVIDER_GET_INTERFACE(service_provider); g_return_if_fail(service_provider_interface->set_server); service_provider_interface->set_server(service_provider, server); } /** * ags_service_provider_get_server: * @service_provider: the #AgsServiceProvider * * Get server. * * Returns: (element-type Ags.Server) (transfer full): the #GList-struct containing #AgsServer * * Since: 3.0.0 */ GList* ags_service_provider_get_server(AgsServiceProvider *service_provider) { AgsServiceProviderInterface *service_provider_interface; g_return_val_if_fail(AGS_IS_SERVICE_PROVIDER(service_provider), NULL); service_provider_interface = AGS_SERVICE_PROVIDER_GET_INTERFACE(service_provider); g_return_val_if_fail(service_provider_interface->get_server, NULL); return(service_provider_interface->get_server(service_provider)); } gsequencer-3.1.3/ags/server/ags_server_application_context.h0000644000175000017500000000546713607210263021334 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_SERVER_APPLICATION_CONTEXT_H__ #define __AGS_SERVER_APPLICATION_CONTEXT_H__ #include #include #include #include #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_SERVER_APPLICATION_CONTEXT (ags_server_application_context_get_type()) #define AGS_SERVER_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_SERVER_APPLICATION_CONTEXT, AgsServerApplicationContext)) #define AGS_SERVER_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_SERVER_APPLICATION_CONTEXT, AgsServerApplicationContextClass)) #define AGS_IS_SERVER_APPLICATION_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_SERVER_APPLICATION_CONTEXT)) #define AGS_IS_SERVER_APPLICATION_CONTEXT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_SERVER_APPLICATION_CONTEXT)) #define AGS_SERVER_APPLICATION_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_SERVER_APPLICATION_CONTEXT, AgsServerApplicationContextClass)) #define AGS_SERVER_VERSION "3.0.0" #define AGS_SERVER_BUILD_ID "Sat Dec 7 10:02:36 UTC 2019" typedef struct _AgsServerApplicationContext AgsServerApplicationContext; typedef struct _AgsServerApplicationContextClass AgsServerApplicationContextClass; struct _AgsServerApplicationContext { AgsApplicationContext application_context; guint flags; AgsThreadPool *thread_pool; GList *worker; GMainContext *server_main_context; gboolean is_operating; AgsServerStatus *server_status; AgsRegistry *registry; GList *server; }; struct _AgsServerApplicationContextClass { AgsApplicationContextClass application_context; }; GType ags_server_application_context_get_type(); AgsServerApplicationContext* ags_server_application_context_new(); G_END_DECLS #endif /*__AGS_SERVER_APPLICATION_CONTEXT_H__*/ gsequencer-3.1.3/ags/gsequencer_main.h0000644000175000017500000000226213607210263014672 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2015 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __GSEQUENCER_MAIN_H__ #define __GSEQUENCER_MAIN_H__ #include #include #include #include #include #include #include #include #include //#include #include #include #ifndef AGS_W32API #include #endif #define ALSA_PCM_NEW_HW_PARAMS_API #endif /*__GSEQUENCER_MAIN_H__*/ gsequencer-3.1.3/ags/file/0000755000175000017500000000000013622252264012355 500000000000000gsequencer-3.1.3/ags/file/ags_file.h0000644000175000017500000001235013607210263014214 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FILE_H__ #define __AGS_FILE_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FILE (ags_file_get_type()) #define AGS_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FILE, AgsFile)) #define AGS_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FILE, AgsFileClass)) #define AGS_IS_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FILE)) #define AGS_IS_FILE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FILE)) #define AGS_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FILE, AgsFileClass)) #define AGS_FILE_GET_OBJ_MUTEX(obj) (&(((AgsFile *) obj)->obj_mutex)) #define AGS_FILE_DEFAULT_ENCODING "UTF-8" #define AGS_FILE_DEFAULT_DTD "ags_file.dtd" #define AGS_FILE_CHECKSUM_LENGTH (32) #define AGS_FILE_DEFAULT_AUDIO_FORMAT "raw" #define AGS_FILE_DEFAULT_AUDIO_ENCODING "base64" typedef struct _AgsFile AgsFile; typedef struct _AgsFileClass AgsFileClass; /** * AgsFileFlags: * @AGS_FILE_READ: opened file for reading * @AGS_FILE_READ_AUDIO_SIGNAL: read audio signal * @AGS_FILE_READ_EMBEDDED_AUDIO: read embedded audio data * @AGS_FILE_WRITE: opened file for writing * @AGS_FILE_WRITE_AUDIO_SIGNAL: write audio signal * @AGS_FILE_WRITE_EMBEDDED_AUDIO: write embedded audio data * * Enum values to control the behavior or indicate internal state of #AgsFile by * enable/disable as flags. */ typedef enum{ AGS_FILE_READ = 1, AGS_FILE_READ_AUDIO_SIGNAL = 1 << 1, AGS_FILE_READ_EMBEDDED_AUDIO = 1 << 2, AGS_FILE_WRITE = 1 << 3, AGS_FILE_WRITE_AUDIO_SIGNAL = 1 << 4, AGS_FILE_WRITE_EMBEDDED_AUDIO = 1 << 5, }AgsFileFlags; #define AGS_FILE_ERROR (ags_file_error_quark()) /** * AgsFileError: * @AGS_FILE_ERROR_PARSER_FAILURE: the parser failed * * Enum values to indicated failures to used with #GError-struct. */ typedef enum{ AGS_FILE_ERROR_PARSER_FAILURE, }AgsFileError; struct _AgsFile { GObject gobject; guint flags; GRecMutex obj_mutex; FILE *out; xmlChar *buffer; gchar *filename; gchar *encoding; gchar *dtd; gchar *audio_format; gchar *audio_encoding; xmlDoc *doc; xmlNode *root_node; GList *id_refs; GList *lookup; GList *launch; GObject *clipboard; GList *property; GList *script; GObject *cluster; GObject *client; GObject *server; GObject *history; GList *embedded_audio; GList *file_link; }; struct _AgsFileClass { GObjectClass gobject; void (*open)(AgsFile *file, GError **error); void (*open_from_data)(AgsFile *file, gchar *data, guint length, GError **error); void (*rw_open)(AgsFile *file, gboolean create, GError **error); void (*write)(AgsFile *file); void (*write_concurrent)(AgsFile *file); void (*write_resolve)(AgsFile *file); void (*read)(AgsFile *file); void (*read_resolve)(AgsFile *file); void (*read_start)(AgsFile *file); }; GType ags_file_get_type(void); gchar* ags_file_str2md5(gchar *content, guint content_length); void ags_file_add_id_ref(AgsFile *file, GObject *id_ref); GObject* ags_file_find_id_ref_by_node(AgsFile *file, xmlNode *node); GObject* ags_file_find_id_ref_by_xpath(AgsFile *file, gchar *xpath); GObject* ags_file_find_id_ref_by_reference(AgsFile *file, gpointer ref); void ags_file_add_lookup(AgsFile *file, GObject *file_lookup); void ags_file_add_launch(AgsFile *file, GObject *file_launch); /* */ void ags_file_open(AgsFile *file, GError **error); void ags_file_open_from_data(AgsFile *file, gchar *data, guint length, GError **error); void ags_file_rw_open(AgsFile *file, gboolean create, GError **error); void ags_file_open_filename(AgsFile *file, gchar *filename); void ags_file_close(AgsFile *file); /* */ void ags_file_write(AgsFile *file); void ags_file_write_concurrent(AgsFile *file); void ags_file_write_resolve(AgsFile *file); void ags_file_read(AgsFile *file); void ags_file_read_resolve(AgsFile *file); void ags_file_read_start(AgsFile *file); void ags_file_read_config(AgsFile *file, xmlNode *node, GObject **ags_config); void ags_file_write_config(AgsFile *file, xmlNode *parent, GObject *ags_config); /* */ void ags_file_read_application_context(AgsFile *file, xmlNode *node, GObject **application_context); void ags_file_write_application_context(AgsFile *file, xmlNode *parent, GObject *application_context); /* */ AgsFile* ags_file_new(); G_END_DECLS #endif /*__AGS_FILE_H__*/ gsequencer-3.1.3/ags/file/ags_file.dtd0000644000175000017500000012037413461636434014560 00000000000000 buffer-size NMTOKEN 940 format PCDATA #REQUIRED bpm NMTOKEN 120.0 delay-factor NMTOKEN 0.25 note-offset NMTOKEN 0 > delay NMTOKEN #REQUIRED attack NMTOKEN #REQUIRED > > gsequencer-3.1.3/ags/file/ags_file_lookup.c0000644000175000017500000002257513607210263015612 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_file_lookup_class_init(AgsFileLookupClass *file_lookup); void ags_file_lookup_init (AgsFileLookup *file_lookup); void ags_file_lookup_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_file_lookup_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_file_lookup_finalize(GObject *gobject); /** * SECTION:ags_file_lookup * @short_description: resolve objects read of file. * @title: AgsFileLookup * @section_id: * @include: ags/file/ags_file_lookup.h * * The #AgsFileLookup resolve objects of file. */ enum{ RESOLVE, LAST_SIGNAL, }; enum{ PROP_0, PROP_FILE, PROP_NODE, PROP_REFERENCE, }; static gpointer ags_file_lookup_parent_class = NULL; static guint file_lookup_signals[LAST_SIGNAL]; GType ags_file_lookup_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_file_lookup = 0; static const GTypeInfo ags_file_lookup_info = { sizeof (AgsFileLookupClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_file_lookup_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFileLookup), 0, /* n_preallocs */ (GInstanceInitFunc) ags_file_lookup_init, }; ags_type_file_lookup = g_type_register_static(G_TYPE_OBJECT, "AgsFileLookup", &ags_file_lookup_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_file_lookup); } return g_define_type_id__volatile; } void ags_file_lookup_class_init(AgsFileLookupClass *file_lookup) { GObjectClass *gobject; GParamSpec *param_spec; ags_file_lookup_parent_class = g_type_class_peek_parent(file_lookup); /* GObjectClass */ gobject = (GObjectClass *) file_lookup; gobject->get_property = ags_file_lookup_get_property; gobject->set_property = ags_file_lookup_set_property; gobject->finalize = ags_file_lookup_finalize; /* properties */ /** * AgsFile:file: * * The assigned #AgsFile to resolve. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file", i18n_pspec("assigned file"), i18n_pspec("The file it is assigned with"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); /** * AgsFile:node: * * The assigned #xmlNode to resolve. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("node", i18n_pspec("assigned node"), i18n_pspec("The node it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NODE, param_spec); /** * AgsFile:reference: * * The assigned #gpointer to resolve. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("reference", i18n_pspec("assigned reference"), i18n_pspec("The reference it is assigned with"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REFERENCE, param_spec); /* AgsFileLookupClass */ file_lookup->resolve = NULL; /** * AgsFile::resolve: * @file_lookup: the #AgsFileLookup * * Resolve @file_lookup either for reading or writing XPath and retrieving * appropriate UUID. * * Since: 3.0.0 */ file_lookup_signals[RESOLVE] = g_signal_new("resolve", G_TYPE_FROM_CLASS(file_lookup), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileLookupClass, resolve), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_file_lookup_init(AgsFileLookup *file_lookup) { /* file lookup mutex */ g_rec_mutex_init(&(file_lookup->obj_mutex)); file_lookup->file = NULL; file_lookup->node = NULL; file_lookup->ref = NULL; } void ags_file_lookup_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFileLookup *file_lookup; GRecMutex *file_lookup_mutex; file_lookup = AGS_FILE_LOOKUP(gobject); /* get file id ref mutex */ file_lookup_mutex = AGS_FILE_LOOKUP_GET_OBJ_MUTEX(file_lookup); switch(prop_id){ case PROP_FILE: { AgsFile *file; file = (AgsFile *) g_value_get_object(value); g_rec_mutex_lock(file_lookup_mutex); if(file_lookup->file == file){ g_rec_mutex_unlock(file_lookup_mutex); return; } if(file_lookup->file != NULL){ g_object_unref(G_OBJECT(file_lookup->file)); } if(file != NULL){ g_object_ref(file); } file_lookup->file = file; g_rec_mutex_unlock(file_lookup_mutex); } break; case PROP_NODE: { xmlNode *node; node = (xmlNode *) g_value_get_pointer(value); g_rec_mutex_lock(file_lookup_mutex); file_lookup->node = node; g_rec_mutex_unlock(file_lookup_mutex); } break; case PROP_REFERENCE: { gpointer ref; ref = (gpointer) g_value_get_pointer(value); g_rec_mutex_lock(file_lookup_mutex); file_lookup->ref = ref; g_rec_mutex_unlock(file_lookup_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_lookup_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFileLookup *file_lookup; GRecMutex *file_lookup_mutex; file_lookup = AGS_FILE_LOOKUP(gobject); /* get file id ref mutex */ file_lookup_mutex = AGS_FILE_LOOKUP_GET_OBJ_MUTEX(file_lookup); switch(prop_id){ case PROP_FILE: { g_rec_mutex_lock(file_lookup_mutex); g_value_set_object(value, file_lookup->file); g_rec_mutex_unlock(file_lookup_mutex); } break; case PROP_NODE: { g_rec_mutex_lock(file_lookup_mutex); g_value_set_pointer(value, file_lookup->node); g_rec_mutex_unlock(file_lookup_mutex); } break; case PROP_REFERENCE: { g_rec_mutex_lock(file_lookup_mutex); g_value_set_pointer(value, file_lookup->ref); g_rec_mutex_unlock(file_lookup_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_lookup_finalize(GObject *gobject) { AgsFileLookup *file_lookup; file_lookup = AGS_FILE_LOOKUP(gobject); if(file_lookup->file != NULL){ g_object_unref(G_OBJECT(file_lookup->file)); } /* call parent */ G_OBJECT_CLASS(ags_file_lookup_parent_class)->finalize(gobject); } /** * ags_file_lookup_resolve: * @file_lookup: the #AgsFileLookup * * The ::resolve signal. * * Since: 3.0.0 */ void ags_file_lookup_resolve(AgsFileLookup *file_lookup) { g_return_if_fail(AGS_IS_FILE_LOOKUP(file_lookup)); g_object_ref((GObject *) file_lookup); g_signal_emit(G_OBJECT(file_lookup), file_lookup_signals[RESOLVE], 0); g_object_unref((GObject *) file_lookup); } /** * ags_file_lookup_find_by_node: * @file_lookup: (element-type Ags.FileLookup) (transfer none): the #GList-struct containing #AgsFileLookup * @node: a #xmlNode * * Find #AgsFileLookup by #xmlNode * * Returns: (element-type Ags.FileLookup) (transfer none): The matching list containing #AgsFileLookup if found otherwise %NULL * * Since: 3.0.0 */ GList* ags_file_lookup_find_by_node(GList *file_lookup, xmlNode *node) { while(file_lookup != NULL){ xmlNode *current_node; g_object_get(file_lookup->data, "node", ¤t_node, NULL); if(current_node == node){ break; } file_lookup = file_lookup->next; } return(file_lookup); } /** * ags_file_lookup_find_by_reference: * @file_lookup: (element-type Ags.FileLookup) (transfer none): the #GList-struct containing #AgsFileLookup * @ref: a #gpointer * * Find #AgsFileLookup by @ref * * Returns: (element-type Ags.FileLookup) (transfer none): The matching list containing #AgsFileLookup if found otherwise %NULL * * Since: 3.0.0 */ GList* ags_file_lookup_find_by_reference(GList *file_lookup, gpointer ref) { while(file_lookup != NULL){ gpointer current_ref; g_object_get(file_lookup->data, "reference", ¤t_ref, NULL); if(current_ref == ref){ break; } file_lookup = file_lookup->next; } return(file_lookup); } /** * ags_file_lookup_new: * * Creates an #AgsFileLookup * * Returns: a new #AgsFileLookup * * Since: 3.0.0 */ AgsFileLookup* ags_file_lookup_new() { AgsFileLookup *file_lookup; file_lookup = (AgsFileLookup *) g_object_new(AGS_TYPE_FILE_LOOKUP, NULL); return(file_lookup); } gsequencer-3.1.3/ags/file/ags_file_launch.h0000644000175000017500000000414413607210263015550 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FILE_LAUNCH_H__ #define __AGS_FILE_LAUNCH_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FILE_LAUNCH (ags_file_launch_get_type()) #define AGS_FILE_LAUNCH(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FILE_LAUNCH, AgsFileLaunch)) #define AGS_FILE_LAUNCH_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FILE_LAUNCH, AgsFileLaunchClass)) #define AGS_IS_FILE_LAUNCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FILE_LAUNCH)) #define AGS_IS_FILE_LAUNCH_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FILE_LAUNCH)) #define AGS_FILE_LAUNCH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FILE_LAUNCH, AgsFileLaunchClass)) #define AGS_FILE_LAUNCH_GET_OBJ_MUTEX(obj) (&(((AgsFileLaunch *) obj)->obj_mutex)) typedef struct _AgsFileLaunch AgsFileLaunch; typedef struct _AgsFileLaunchClass AgsFileLaunchClass; struct _AgsFileLaunch { GObject gobject; GRecMutex obj_mutex; gpointer reference; xmlNode *node; GObject *file; }; struct _AgsFileLaunchClass { GObjectClass gobject; void (*start)(AgsFileLaunch *file_launch); }; GType ags_file_launch_get_type(void); void ags_file_launch_start(AgsFileLaunch *file_launch); /* */ AgsFileLaunch* ags_file_launch_new(); #endif /*__AGS_FILE_LAUNCH_H__*/ gsequencer-3.1.3/ags/file/ags_file_link.c0000644000175000017500000002341113607210263015224 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include void ags_file_link_class_init(AgsFileLinkClass *file_link); void ags_file_link_plugin_interface_init(AgsPluginInterface *plugin); void ags_file_link_init(AgsFileLink *file_link); void ags_file_link_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_file_link_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); gchar* ags_file_link_get_name(AgsPlugin *plugin); void ags_file_link_set_name(AgsPlugin *plugin, gchar *name); gchar* ags_file_link_get_version(AgsPlugin *plugin); void ags_file_link_set_version(AgsPlugin *plugin, gchar *version); gchar* ags_file_link_get_build_id(AgsPlugin *plugin); void ags_file_link_set_build_id(AgsPlugin *plugin, gchar *build_id); gchar* ags_file_link_get_xml_type(AgsPlugin *plugin); void ags_file_link_set_xml_type(AgsPlugin *plugin, gchar *xml_type); void ags_file_link_read(AgsFile *file, xmlNode *node, AgsPlugin *plugin); xmlNode* ags_file_link_write(AgsFile *file, xmlNode *parent, AgsPlugin *plugin); void ags_file_link_finalize(GObject *gobject); /** * SECTION:ags_file_link * @short_description: link objects read of file. * @title: AgsFileLink * @section_id: * @include: ags/file/ags_file_link.h * * The #AgsFileLink links read objects of file. */ enum{ PROP_0, PROP_FILENAME, PROP_DATA, }; static gpointer ags_file_link_parent_class = NULL; GType ags_file_link_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_file_link = 0; static const GTypeInfo ags_file_link_info = { sizeof (AgsFileLinkClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_file_link_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFileLink), 0, /* n_preallocs */ (GInstanceInitFunc) ags_file_link_init, }; static const GInterfaceInfo ags_plugin_interface_info = { (GInterfaceInitFunc) ags_file_link_plugin_interface_init, NULL, /* interface_finalize */ NULL, /* interface_data */ }; ags_type_file_link = g_type_register_static(G_TYPE_OBJECT, "AgsFileLink", &ags_file_link_info, 0); g_type_add_interface_static(ags_type_file_link, AGS_TYPE_PLUGIN, &ags_plugin_interface_info); g_once_init_leave(&g_define_type_id__volatile, ags_type_file_link); } return g_define_type_id__volatile; } void ags_file_link_class_init(AgsFileLinkClass *file_link) { GObjectClass *gobject; GParamSpec *param_spec; ags_file_link_parent_class = g_type_class_peek_parent(file_link); /* GObjectClass */ gobject = (GObjectClass *) file_link; gobject->set_property = ags_file_link_set_property; gobject->get_property = ags_file_link_get_property; gobject->finalize = ags_file_link_finalize; /* properties */ /** * AgsFileLink:filename: * * The filename this #AgsFileLink refers. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("the filename"), i18n_pspec("The filename to locate the file"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsFileLink:data: * * The data this #AgsFileLink contains. * * Since: 3.0.0 */ param_spec = g_param_spec_string("data", i18n_pspec("the data"), i18n_pspec("The embedded data"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_DATA, param_spec); } void ags_file_link_plugin_interface_init(AgsPluginInterface *plugin) { plugin->get_name = ags_file_link_get_name; plugin->set_name = ags_file_link_set_name; plugin->get_version = ags_file_link_get_version; plugin->set_version = ags_file_link_set_version; plugin->get_build_id = ags_file_link_get_build_id; plugin->set_build_id = ags_file_link_set_build_id; plugin->get_xml_type = ags_file_link_get_xml_type; plugin->set_xml_type = ags_file_link_set_xml_type; plugin->get_ports = NULL; plugin->read = ags_file_link_read; plugin->write = ags_file_link_write; plugin->set_ports = NULL; } void ags_file_link_init(AgsFileLink *file_link) { /* file link mutex */ g_rec_mutex_init(&(file_link->obj_mutex)); file_link->version = NULL; file_link->build_id = NULL; file_link->name = NULL; file_link->xml_type = NULL; file_link->filename = NULL; file_link->data = NULL; } void ags_file_link_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFileLink *file_link; GRecMutex *file_link_mutex; file_link = AGS_FILE_LINK(gobject); /* get file link mutex */ file_link_mutex = AGS_FILE_LINK_GET_OBJ_MUTEX(file_link); switch(prop_id){ case PROP_FILENAME: { char *filename; filename = (char *) g_value_get_string(value); g_rec_mutex_lock(file_link_mutex); if(filename == file_link->filename){ g_rec_mutex_unlock(file_link_mutex); return; } if(file_link->filename != NULL){ free(file_link->filename); } file_link->filename = g_strdup(filename); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_DATA: { char *data; data = (char *) g_value_get_string(value); g_rec_mutex_lock(file_link_mutex); if(data == file_link->data){ g_rec_mutex_unlock(file_link_mutex); return; } file_link->data = g_strdup(data); g_rec_mutex_unlock(file_link_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_link_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFileLink *file_link; GRecMutex *file_link_mutex; file_link = AGS_FILE_LINK(gobject); /* get file link mutex */ file_link_mutex = AGS_FILE_LINK_GET_OBJ_MUTEX(file_link); switch(prop_id){ case PROP_FILENAME: { g_rec_mutex_lock(file_link_mutex); g_value_set_string(value, file_link->filename); g_rec_mutex_unlock(file_link_mutex); } break; case PROP_DATA: { g_rec_mutex_lock(file_link_mutex); g_value_set_string(value, file_link->data); g_rec_mutex_unlock(file_link_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_link_finalize(GObject *gobject) { AgsFileLink *file_link; file_link = AGS_FILE_LINK(gobject); /* filename */ if(file_link->filename != NULL){ g_free(file_link->filename); } /* data */ if(file_link->data != NULL){ g_free(file_link->data); } /* call parent */ G_OBJECT_CLASS(ags_file_link_parent_class)->finalize(gobject); } gchar* ags_file_link_get_name(AgsPlugin *plugin) { return(AGS_FILE_LINK(plugin)->name); } void ags_file_link_set_name(AgsPlugin *plugin, gchar *name) { AGS_FILE_LINK(plugin)->name = name; } gchar* ags_file_link_get_version(AgsPlugin *plugin) { return(AGS_FILE_LINK(plugin)->version); } void ags_file_link_set_version(AgsPlugin *plugin, gchar *version) { AGS_FILE_LINK(plugin)->version = version; } gchar* ags_file_link_get_build_id(AgsPlugin *plugin) { return(AGS_FILE_LINK(plugin)->build_id); } void ags_file_link_set_build_id(AgsPlugin *plugin, gchar *build_id) { AGS_FILE_LINK(plugin)->build_id = build_id; } gchar* ags_file_link_get_xml_type(AgsPlugin *plugin) { return(AGS_FILE_LINK(plugin)->xml_type); } void ags_file_link_set_xml_type(AgsPlugin *plugin, gchar *xml_type) { AGS_FILE_LINK(plugin)->xml_type = xml_type; } void ags_file_link_read(AgsFile *file, xmlNode *node, AgsPlugin *plugin) { AgsFileLink *file_link; file_link = AGS_FILE_LINK(plugin); ags_file_add_id_ref(file, g_object_new(AGS_TYPE_FILE_ID_REF, "node", node, "xpath", g_strdup_printf("xpath=//*[@id='%s']", xmlGetProp(node, "id")), "reference", file_link, NULL)); } xmlNode* ags_file_link_write(AgsFile *file, xmlNode *parent, AgsPlugin *plugin) { AgsFileLink *file_link; xmlNode *node; gchar *id; file_link = AGS_FILE_LINK(plugin); id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, AGS_FILE_LINK(plugin)->xml_type); xmlNewProp(node, "id", id); ags_file_add_id_ref(file, g_object_new(AGS_TYPE_FILE_ID_REF, "node", node, "xpath", g_strdup_printf("xpath=//*[@id='%s']", id), "reference", file_link, NULL)); xmlAddChild(parent, node); return(node); } /** * ags_file_link_new: * * Creates an #AgsFileLink * * Returns: a new #AgsFileLink * * Since: 3.0.0 */ AgsFileLink* ags_file_link_new() { AgsFileLink *file_link; file_link = (AgsFileLink *) g_object_new(AGS_TYPE_FILE_LINK, NULL); return(file_link); } gsequencer-3.1.3/ags/file/ags_file_launch.c0000644000175000017500000001771613607210263015554 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_file_launch_class_init(AgsFileLaunchClass *file_launch); void ags_file_launch_init (AgsFileLaunch *file_launch); void ags_file_launch_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_file_launch_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_file_launch_finalize(GObject *gobject); /** * SECTION:ags_file_launch * @short_description: launch objects read of file. * @title: AgsFileLaunch * @section_id: * @include: ags/file/ags_file_launch.h * * The #AgsFileLaunch launches read objects of file. */ enum{ START, LAST_SIGNAL, }; enum{ PROP_0, PROP_REFERENCE, PROP_NODE, PROP_FILE, }; static gpointer ags_file_launch_parent_class = NULL; static guint file_launch_signals[LAST_SIGNAL]; GType ags_file_launch_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_file_launch = 0; static const GTypeInfo ags_file_launch_info = { sizeof (AgsFileLaunchClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_file_launch_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFileLaunch), 0, /* n_preallocs */ (GInstanceInitFunc) ags_file_launch_init, }; ags_type_file_launch = g_type_register_static(G_TYPE_OBJECT, "AgsFileLaunch", &ags_file_launch_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_file_launch); } return g_define_type_id__volatile; } void ags_file_launch_class_init(AgsFileLaunchClass *file_launch) { GObjectClass *gobject; GParamSpec *param_spec; ags_file_launch_parent_class = g_type_class_peek_parent(file_launch); /* GObjectClass */ gobject = (GObjectClass *) file_launch; gobject->set_property = ags_file_launch_set_property; gobject->get_property = ags_file_launch_get_property; gobject->finalize = ags_file_launch_finalize; /* properties */ /** * AgsFileLaunch:node: * * The assigned xmlNode being referred by this #AgsFileLaunch. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("node", i18n_pspec("the node"), i18n_pspec("The node to find the element"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NODE, param_spec); /** * AgsFileLaunch:reference: * * The object referred by this #AgsFileLaunch. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("reference", i18n_pspec("the reference"), i18n_pspec("The reference to find the element"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REFERENCE, param_spec); /** * AgsFileLaunch:file: * * The #AgsFile this #AgsFileLaunch belongs to. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file", i18n_pspec("file assigned to"), i18n_pspec("The entire file assigned to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); /* AgsFileLaunchClass */ file_launch->start = NULL; /** * AgsFileLaunch::start: * @file_id_ref: the #AgsFileLaunch * * Signal ::start to notify about start :reference. * * Since: 3.0.0 */ file_launch_signals[START] = g_signal_new("start", G_TYPE_FROM_CLASS(file_launch), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileLaunchClass, start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_file_launch_init(AgsFileLaunch *file_launch) { /* file launch mutex */ g_rec_mutex_init(&(file_launch->obj_mutex)); file_launch->reference = NULL; file_launch->node = NULL; file_launch->file = NULL; } void ags_file_launch_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFileLaunch *file_launch; GRecMutex *file_launch_mutex; file_launch = AGS_FILE_LAUNCH(gobject); /* get file id ref mutex */ file_launch_mutex = AGS_FILE_LAUNCH_GET_OBJ_MUTEX(file_launch); switch(prop_id){ case PROP_NODE: { xmlNode *node; node = (xmlNode *) g_value_get_pointer(value); g_rec_mutex_lock(file_launch_mutex); file_launch->node = node; g_rec_mutex_unlock(file_launch_mutex); } break; case PROP_REFERENCE: { gpointer ref; ref = g_value_get_pointer(value); g_rec_mutex_lock(file_launch_mutex); file_launch->reference = ref; g_rec_mutex_unlock(file_launch_mutex); } break; case PROP_FILE: { GObject *file; file = (GObject *) g_value_get_object(value); g_rec_mutex_lock(file_launch_mutex); if(file_launch->file != NULL){ g_object_unref(file_launch->file); } if(file != NULL){ g_object_ref(file); } file_launch->file = file; g_rec_mutex_unlock(file_launch_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_launch_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFileLaunch *file_launch; GRecMutex *file_launch_mutex; file_launch = AGS_FILE_LAUNCH(gobject); /* get file id ref mutex */ file_launch_mutex = AGS_FILE_LAUNCH_GET_OBJ_MUTEX(file_launch); switch(prop_id){ case PROP_NODE: { g_rec_mutex_lock(file_launch_mutex); g_value_set_pointer(value, file_launch->node); g_rec_mutex_unlock(file_launch_mutex); } break; case PROP_REFERENCE: { g_rec_mutex_lock(file_launch_mutex); g_value_set_pointer(value, file_launch->reference); g_rec_mutex_unlock(file_launch_mutex); } break; case PROP_FILE: { g_rec_mutex_lock(file_launch_mutex); g_value_set_object(value, file_launch->file); g_rec_mutex_unlock(file_launch_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_launch_finalize(GObject *gobject) { AgsFileLaunch *file_launch; file_launch = AGS_FILE_LAUNCH(gobject); if(file_launch->file != NULL){ g_object_unref(file_launch->file); } /* call parent */ G_OBJECT_CLASS(ags_file_launch_parent_class)->finalize(gobject); } /** * ags_file_launch_start: * @file_launch: the #AgsFileLaunch * * Start #AgsFileLaunch to fulfill a task. * * Since: 3.0.0 */ void ags_file_launch_start(AgsFileLaunch *file_launch) { g_return_if_fail(AGS_IS_FILE_LAUNCH(file_launch)); g_object_ref((GObject *) file_launch); g_signal_emit(G_OBJECT(file_launch), file_launch_signals[START], 0); g_object_unref((GObject *) file_launch); } /** * ags_file_launch_new: * * Create a new instance of #AgsFileLaunch * * Returns: the new #AgsFileLaunch * * Since: 3.0.0 */ AgsFileLaunch* ags_file_launch_new() { AgsFileLaunch *file_launch; file_launch = (AgsFileLaunch *) g_object_new(AGS_TYPE_FILE_LAUNCH, NULL); return(file_launch); } gsequencer-3.1.3/ags/file/ags_file_id_ref.c0000644000175000017500000002174713607210263015531 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include void ags_file_id_ref_class_init(AgsFileIdRefClass *file_id_ref); void ags_file_id_ref_init(AgsFileIdRef *file_id_ref); void ags_file_id_ref_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_file_id_ref_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_file_id_ref_finalize(GObject *gobject); /** * SECTION:ags_file_id_ref * @short_description: file id reference * @title: AgsFileIdRef * @section_id: * @include: ags/file/ags_file_id_ref.h * * The #AgsFileIdRef referes a XML node by its ID. It's used * to perform XPath lookup. */ enum{ RESOLVED, LAST_SIGNAL, }; enum{ PROP_0, PROP_NODE, PROP_XPATH, PROP_REFERENCE, PROP_FILE, }; static gpointer ags_file_id_ref_parent_class = NULL; static guint file_id_ref_signals[LAST_SIGNAL]; GType ags_file_id_ref_get_type() { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_file_id_ref = 0; static const GTypeInfo ags_file_id_ref_info = { sizeof (AgsFileIdRefClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_file_id_ref_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFileIdRef), 0, /* n_preallocs */ (GInstanceInitFunc) ags_file_id_ref_init, }; ags_type_file_id_ref = g_type_register_static(G_TYPE_OBJECT, "AgsFileIdRef", &ags_file_id_ref_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_file_id_ref); } return g_define_type_id__volatile; } void ags_file_id_ref_class_init(AgsFileIdRefClass *file_id_ref) { GObjectClass *gobject; GParamSpec *param_spec; ags_file_id_ref_parent_class = g_type_class_peek_parent(file_id_ref); /* GObjectClass */ gobject = (GObjectClass *) file_id_ref; gobject->set_property = ags_file_id_ref_set_property; gobject->get_property = ags_file_id_ref_get_property; gobject->finalize = ags_file_id_ref_finalize; /* properties */ /** * AgsFileIdRef:node: * * The assigned xmlNode being referred by this #AgsFileIdRef. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("node", i18n_pspec("the node"), i18n_pspec("The node to find the element"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_NODE, param_spec); /** * AgsFileIdRef:xpath: * * The XPath short-cut that can be used with this #AgsFileIdRef. * * Since: 3.0.0 */ param_spec = g_param_spec_string("xpath", i18n_pspec("the xpath"), i18n_pspec("The xpath to find the element"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_XPATH, param_spec); /** * AgsFileIdRef:reference: * * The object referred by this #AgsFileIdRef. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("reference", i18n_pspec("reference of the locator"), i18n_pspec("The reference resulted by the xpath locator"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_REFERENCE, param_spec); /** * AgsFileIdRef:file: * * The #AgsFile this #AgsFileIdRef belongs to. * * Since: 3.0.0 */ param_spec = g_param_spec_object("file", i18n_pspec("file assigned to"), i18n_pspec("The entire file assigned to"), G_TYPE_OBJECT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILE, param_spec); /* signals */ /** * AgsFileIdRef::resolved: * @file_id_ref: the #AgsFileIdRef * * Signal ::resolved to notify about resolved :reference. * * Since: 3.0.0 */ file_id_ref_signals[RESOLVED] = g_signal_new("resolved", G_TYPE_FROM_CLASS(file_id_ref), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileIdRefClass, resolved), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } void ags_file_id_ref_init(AgsFileIdRef *file_id_ref) { /* add file id ref mutex */ g_rec_mutex_init(&(file_id_ref->obj_mutex)); file_id_ref->file = NULL; file_id_ref->node = NULL; file_id_ref->xpath = NULL; file_id_ref->ref = NULL; } void ags_file_id_ref_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFileIdRef *file_id_ref; GRecMutex *file_id_ref_mutex; file_id_ref = AGS_FILE_ID_REF(gobject); /* get file id ref mutex */ file_id_ref_mutex = AGS_FILE_ID_REF_GET_OBJ_MUTEX(file_id_ref); switch(prop_id){ case PROP_NODE: { xmlNode *node; node = (xmlNode *) g_value_get_pointer(value); g_rec_mutex_lock(file_id_ref_mutex); file_id_ref->node = node; g_rec_mutex_unlock(file_id_ref_mutex); } break; case PROP_XPATH: { char *xpath; xpath = (char *) g_value_get_string(value); g_rec_mutex_lock(file_id_ref_mutex); if(file_id_ref->xpath != NULL){ g_free(file_id_ref->xpath); } file_id_ref->xpath = xpath; g_rec_mutex_unlock(file_id_ref_mutex); } break; case PROP_REFERENCE: { gpointer ref; ref = (gpointer) g_value_get_pointer(value); g_rec_mutex_lock(file_id_ref_mutex); file_id_ref->ref = ref; g_rec_mutex_unlock(file_id_ref_mutex); } break; case PROP_FILE: { GObject *file; file = (GObject *) g_value_get_object(value); g_rec_mutex_lock(file_id_ref_mutex); if(file_id_ref->file != NULL){ g_object_unref(file_id_ref->file); } if(file != NULL){ g_object_ref(file); } file_id_ref->file = file; g_rec_mutex_unlock(file_id_ref_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_id_ref_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFileIdRef *file_id_ref; GRecMutex *file_id_ref_mutex; file_id_ref = AGS_FILE_ID_REF(gobject); /* get file id ref mutex */ file_id_ref_mutex = AGS_FILE_ID_REF_GET_OBJ_MUTEX(file_id_ref); switch(prop_id){ case PROP_NODE: { g_rec_mutex_lock(file_id_ref_mutex); g_value_set_pointer(value, file_id_ref->node); g_rec_mutex_unlock(file_id_ref_mutex); } break; case PROP_XPATH: { g_rec_mutex_lock(file_id_ref_mutex); g_value_set_string(value, file_id_ref->xpath); g_rec_mutex_unlock(file_id_ref_mutex); } break; case PROP_REFERENCE: { g_rec_mutex_lock(file_id_ref_mutex); g_value_set_pointer(value, file_id_ref->ref); g_rec_mutex_unlock(file_id_ref_mutex); } break; case PROP_FILE: { g_rec_mutex_lock(file_id_ref_mutex); g_value_set_object(value, file_id_ref->file); g_rec_mutex_unlock(file_id_ref_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_id_ref_finalize(GObject *gobject) { AgsFileIdRef *file_id_ref; file_id_ref = AGS_FILE_ID_REF(gobject); if(file_id_ref->xpath != NULL){ g_free(file_id_ref->xpath); } if(file_id_ref->ref != NULL){ g_object_unref(file_id_ref->ref); } if(file_id_ref->file != NULL){ g_object_unref(file_id_ref->file); } /* call parent */ G_OBJECT_CLASS(ags_file_id_ref_parent_class)->finalize(gobject); } /** * ags_file_id_ref_resolved: * @file_id_ref: the #AgsFileIdRef * * Notify about resolved reference. * * Since: 3.0.0 */ void ags_file_id_ref_resolved(AgsFileIdRef *file_id_ref) { g_return_if_fail(AGS_IS_FILE_ID_REF(file_id_ref)); g_object_ref((GObject *) file_id_ref); g_signal_emit(G_OBJECT(file_id_ref), file_id_ref_signals[RESOLVED], 0); g_object_unref((GObject *) file_id_ref); } /** * ags_file_id_ref_new: * * Creates an #AgsFileIdRef * * Returns: a new #AgsFileIdRef * * Since: 3.0.0 */ AgsFileIdRef* ags_file_id_ref_new() { AgsFileIdRef *file_id_ref; file_id_ref = (AgsFileIdRef *) g_object_new(AGS_TYPE_FILE_ID_REF, NULL); return(file_id_ref); } gsequencer-3.1.3/ags/file/ags_file_lookup.h0000644000175000017500000000446013607210263015610 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FILE_LOOKUP_H__ #define __AGS_FILE_LOOKUP_H__ #include #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FILE_LOOKUP (ags_file_lookup_get_type()) #define AGS_FILE_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FILE_LOOKUP, AgsFileLookup)) #define AGS_FILE_LOOKUP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_FILE_LOOKUP, AgsFileLookupClass)) #define AGS_IS_FILE_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FILE_LOOKUP)) #define AGS_IS_FILE_LOOKUP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FILE_LOOKUP)) #define AGS_FILE_LOOKUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_FILE_LOOKUP, AgsFileLookupClass)) #define AGS_FILE_LOOKUP_GET_OBJ_MUTEX(obj) (&(((AgsFileLookup *) obj)->obj_mutex)) typedef struct _AgsFileLookup AgsFileLookup; typedef struct _AgsFileLookupClass AgsFileLookupClass; struct _AgsFileLookup { GObject gobject; GRecMutex obj_mutex; AgsFile *file; xmlNode *node; gpointer ref; }; struct _AgsFileLookupClass { GObjectClass gobject; void (*resolve)(AgsFileLookup *file_lookup); }; GType ags_file_lookup_get_type(void); GList* ags_file_lookup_find_by_node(GList *file_lookup, xmlNode *node); GList* ags_file_lookup_find_by_reference(GList *file_lookup, gpointer ref); void ags_file_lookup_resolve(AgsFileLookup *file_lookup); /* */ AgsFileLookup* ags_file_lookup_new(); G_END_DECLS #endif /*__AGS_FILE_LOOKUP_H__*/ gsequencer-3.1.3/ags/file/ags_file_id_ref.h0000644000175000017500000000451713607210263015532 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FILE_ID_REF_H__ #define __AGS_FILE_ID_REF_H__ #include #include #include G_BEGIN_DECLS #define AGS_TYPE_FILE_ID_REF (ags_file_id_ref_get_type()) #define AGS_FILE_ID_REF(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FILE_ID_REF, AgsFileIdRef)) #define AGS_FILE_ID_REF_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FILE_ID_REF, AgsFileIdRef)) #define AGS_IS_FILE_ID_REF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FILE_ID_REF)) #define AGS_IS_FILE_ID_REF_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FILE_ID_REF)) #define AGS_FILE_ID_REF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_FILE_ID_REF, AgsFileIdRefClass)) #define AGS_FILE_ID_REF_GET_OBJ_MUTEX(obj) (&(((AgsFileIdRef *) obj)->obj_mutex)) #define AGS_FILE_RESOLVE(f) ((AgsFileResolve)(f)) #define AGS_FILE_ID_REF_SERIALIZE_DATA "ags-file-id-ref-serizalize-data" #define AGS_FILE_ID_REF_RESOLVE_DATA "ags-file-id-ref-resolve-data" typedef struct _AgsFileIdRef AgsFileIdRef; typedef struct _AgsFileIdRefClass AgsFileIdRefClass; typedef void (*AgsFileResolve)(void); struct _AgsFileIdRef { GObject gobject; GRecMutex obj_mutex; GObject *file; xmlNode *node; gchar *xpath; gpointer ref; }; struct _AgsFileIdRefClass { GObjectClass gobject; void (*resolved)(AgsFileIdRef *file_id_ref); }; GType ags_file_id_ref_get_type(); void ags_file_id_ref_resolved(AgsFileIdRef *file_id_ref); AgsFileIdRef* ags_file_id_ref_new(); G_END_DECLS #endif /*__AGS_FILE_ID_REF_H__*/ gsequencer-3.1.3/ags/file/ags_file_link.h0000644000175000017500000000410613607210263015231 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2019 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #ifndef __AGS_FILE_LINK_H__ #define __AGS_FILE_LINK_H__ #include #include G_BEGIN_DECLS #define AGS_TYPE_FILE_LINK (ags_file_link_get_type()) #define AGS_FILE_LINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_FILE_LINK, AgsFileLink)) #define AGS_FILE_LINK_CLASS(class) (G_TYPE_CHECK_CLASS_CAST(class, AGS_TYPE_FILE_LINK, AgsFileLink)) #define AGS_IS_FILE_LINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_FILE_LINK)) #define AGS_IS_FILE_LINK_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_FILE_LINK)) #define AGS_FILE_LINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS(obj, AGS_TYPE_FILE_LINK, AgsFileLinkClass)) #define AGS_FILE_LINK_GET_OBJ_MUTEX(obj) (&(((AgsFileLink *) obj)->obj_mutex)) #define AGS_FILE_LINK_DEFAULT_VERSION "0.7.0" #define AGS_FILE_LINK_DEFAULT_BUILD_ID "CEST 13-10-2015 15:53" typedef struct _AgsFileLink AgsFileLink; typedef struct _AgsFileLinkClass AgsFileLinkClass; struct _AgsFileLink { GObject gobject; GRecMutex obj_mutex; gchar *version; gchar *build_id; gchar *name; gchar *xml_type; gchar *filename; gchar *data; }; struct _AgsFileLinkClass { GObjectClass gobject; }; GType ags_file_link_get_type(); AgsFileLink* ags_file_link_new(); G_END_DECLS #endif /*__AGS_FILE_LINK_H__*/ gsequencer-3.1.3/ags/file/ags_file.c0000644000175000017500000010452313613101164014207 00000000000000/* GSequencer - Advanced GTK Sequencer * Copyright (C) 2005-2020 Joël Krähemann * * This file is part of GSequencer. * * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GSequencer. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ags_file_class_init(AgsFileClass *file); void ags_file_init(AgsFile *file); void ags_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec); void ags_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec); void ags_file_finalize(GObject *gobject); void ags_file_real_open(AgsFile *file, GError **error); void ags_file_real_open_from_data(AgsFile *file, gchar *data, guint length, GError **error); void ags_file_real_rw_open(AgsFile *file, gboolean create, GError **error); void ags_file_real_write(AgsFile *file); void ags_file_real_write_concurrent(AgsFile *file); void ags_file_real_write_resolve(AgsFile *file); void ags_file_real_read(AgsFile *file); void ags_file_real_read_resolve(AgsFile *file); void ags_file_real_read_start(AgsFile *file); /** * SECTION:ags_file * @short_description: read/write XML file * @title: AgsFile * @section_id: * @include: ags/file/ags_file.h * * The #AgsFile is an object to read or write files using XML. It * is the persisting layer of Advanced Gtk+ Sequencer. */ enum{ PROP_0, PROP_FILENAME, PROP_ENCODING, PROP_AUDIO_FORMAT, PROP_AUDIO_ENCODING, PROP_XML_DOC, }; enum{ OPEN, OPEN_FROM_DATA, RW_OPEN, WRITE, WRITE_CONCURRENT, WRITE_RESOLVE, READ, READ_RESOLVE, READ_START, LAST_SIGNAL, }; static gpointer ags_file_parent_class = NULL; static guint file_signals[LAST_SIGNAL] = { 0 }; GType ags_file_get_type (void) { static volatile gsize g_define_type_id__volatile = 0; if(g_once_init_enter (&g_define_type_id__volatile)){ GType ags_type_file = 0; static const GTypeInfo ags_file_info = { sizeof (AgsFileClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) ags_file_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (AgsFile), 0, /* n_preallocs */ (GInstanceInitFunc) ags_file_init, }; ags_type_file = g_type_register_static(G_TYPE_OBJECT, "AgsFile", &ags_file_info, 0); g_once_init_leave(&g_define_type_id__volatile, ags_type_file); } return g_define_type_id__volatile; } void ags_file_class_init(AgsFileClass *file) { GObjectClass *gobject; GParamSpec *param_spec; ags_file_parent_class = g_type_class_peek_parent(file); /* GObjectClass */ gobject = (GObjectClass *) file; gobject->get_property = ags_file_get_property; gobject->set_property = ags_file_set_property; gobject->finalize = ags_file_finalize; /* properties */ /** * AgsFile:filename: * * The assigned filename to open and read from. * * Since: 3.0.0 */ param_spec = g_param_spec_string("filename", i18n_pspec("filename to read or write"), i18n_pspec("The filename to read or write to"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_FILENAME, param_spec); /** * AgsFile:encoding: * * The charset encoding to use. * * Since: 3.0.0 */ param_spec = g_param_spec_string("encoding", i18n_pspec("encoding to use"), i18n_pspec("The encoding of the XML document"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_ENCODING, param_spec); /** * AgsFile:audio-format: * * The format of embedded audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_string("audio-format", i18n_pspec("audio format to use"), i18n_pspec("The audio format used by embedded audio"), AGS_FILE_DEFAULT_AUDIO_FORMAT, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_FORMAT, param_spec); /** * AgsFile:audio-encoding: * * The encoding to use for embedding audio data. * * Since: 3.0.0 */ param_spec = g_param_spec_string("audio-encoding", i18n_pspec("audio encoding to use"), i18n_pspec("The audio encoding used by embedded audio"), AGS_FILE_DEFAULT_AUDIO_ENCODING, G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_AUDIO_ENCODING, param_spec); /** * AgsFile:xml-doc: * * The assigned xml-doc. * * Since: 3.0.0 */ param_spec = g_param_spec_pointer("xml-doc", i18n_pspec("xml document of file"), i18n_pspec("The xml document assigned with file"), G_PARAM_READABLE | G_PARAM_WRITABLE); g_object_class_install_property(gobject, PROP_XML_DOC, param_spec); /* AgsFileClass */ file->open = ags_file_real_open; file->rw_open = ags_file_real_rw_open; file->open_from_data = ags_file_real_open_from_data; file->write = ags_file_real_write; file->write_concurrent = ags_file_real_write_concurrent; file->write_resolve = ags_file_real_write_resolve; file->read = ags_file_real_read; file->read_resolve = ags_file_real_read_resolve; file->read_start = ags_file_real_read_start; /* signals */ /** * AgsFile::open: * @file: the #AgsFile * @error: a #GError-struct pointer to return error * * Open @file with appropriate filename. * * Since: 3.0.0 */ file_signals[OPEN] = g_signal_new("open", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, open), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); /** * AgsFile::open-from-data: * @file: the #AgsFile * @data: the buffer containing the file * @length: the buffer length * @error: a #GError-struct pointer to return error * * Open @file from a buffer containing the file. * * Since: 3.0.0 */ file_signals[OPEN_FROM_DATA] = g_signal_new("open-from-data", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, open_from_data), NULL, NULL, ags_cclosure_marshal_VOID__STRING_UINT_POINTER, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_POINTER); /** * AgsFile::rw-data: * @file: the #AgsFile * @create: if %TRUE the file will be created if not exists * @error: a #GError-struct pointer to return error * * Open @file in read-write mode. * * Since: 3.0.0 */ file_signals[RW_OPEN] = g_signal_new("rw-open", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, rw_open), NULL, NULL, ags_cclosure_marshal_VOID__BOOLEAN_POINTER, G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_POINTER); /** * AgsFile::write: * @file: the #AgsFile * * Write XML Document to disk. * * Since: 3.0.0 */ file_signals[WRITE] = g_signal_new("write", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, write), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); file_signals[WRITE_CONCURRENT] = g_signal_new("write-concurrent", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, write_concurrent), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsFile::write-resolve: * @file: the #AgsFile * * Resolve references and generate thus XPath expressions just * before writing to disk. * * Since: 3.0.0 */ file_signals[WRITE_RESOLVE] = g_signal_new("write-resolve", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, write_resolve), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsFile::read: * @file: the #AgsFile * * Read a XML document from disk with specified filename. * * Since: 3.0.0 */ file_signals[READ] = g_signal_new("read", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, read), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsFile::read-resolve: * @file: the #AgsFile * * Resolve XPath expressions to their counterpart the newly created * instances refering to. * * Since: 3.0.0 */ file_signals[READ_RESOLVE] = g_signal_new("read-resolve", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, read_resolve), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * AgsFile::read-start: * @file: the #AgsFile * * Hook after reading XML document to update or start the application. * * Since: 3.0.0 */ file_signals[READ_START] = g_signal_new("read-start", G_TYPE_FROM_CLASS(file), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(AgsFileClass, read_start), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } GQuark ags_file_error_quark() { return(g_quark_from_static_string("ags-file-error-quark")); } void ags_file_init(AgsFile *file) { file->flags = 0; /* add file mutex */ g_rec_mutex_init(&(file->obj_mutex)); file->out = NULL; file->buffer = NULL; file->filename = NULL; file->encoding = AGS_FILE_DEFAULT_ENCODING; file->dtd = AGS_FILE_DEFAULT_DTD; file->audio_format = AGS_FILE_DEFAULT_AUDIO_FORMAT; file->audio_encoding = AGS_FILE_DEFAULT_AUDIO_ENCODING; file->doc = NULL; file->id_refs = NULL; file->lookup = NULL; file->launch = NULL; file->clipboard = NULL; file->property = NULL; file->script = NULL; file->cluster = NULL; file->client = NULL; file->server = NULL; file->history = NULL; file->embedded_audio = NULL; file->file_link = NULL; } void ags_file_set_property(GObject *gobject, guint prop_id, const GValue *value, GParamSpec *param_spec) { AgsFile *file; GRecMutex *file_mutex; file = AGS_FILE(gobject); /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); switch(prop_id){ case PROP_FILENAME: { gchar *filename; filename = g_value_get_string(value); g_rec_mutex_lock(file_mutex); if(file->filename == filename){ g_rec_mutex_unlock(file_mutex); return; } if(file->filename != NULL){ g_free(file->filename); } file->filename = g_strdup(filename); g_rec_mutex_unlock(file_mutex); } break; case PROP_ENCODING: { gchar *encoding; encoding = g_value_get_string(value); g_rec_mutex_lock(file_mutex); file->encoding = encoding; g_rec_mutex_unlock(file_mutex); } break; case PROP_AUDIO_FORMAT: { gchar *audio_format; audio_format = g_value_get_string(value); g_rec_mutex_lock(file_mutex); file->audio_format = audio_format; g_rec_mutex_unlock(file_mutex); } break; case PROP_AUDIO_ENCODING: { gchar *audio_encoding; audio_encoding = g_value_get_string(value); g_rec_mutex_lock(file_mutex); file->audio_encoding = audio_encoding; g_rec_mutex_unlock(file_mutex); } break; case PROP_XML_DOC: { xmlDoc *doc; doc = (xmlDoc *) g_value_get_pointer(value); g_rec_mutex_lock(file_mutex); file->doc = doc; g_rec_mutex_unlock(file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_get_property(GObject *gobject, guint prop_id, GValue *value, GParamSpec *param_spec) { AgsFile *file; GRecMutex *file_mutex; file = AGS_FILE(gobject); /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); switch(prop_id){ case PROP_FILENAME: { g_rec_mutex_lock(file_mutex); g_value_set_string(value, file->filename); g_rec_mutex_unlock(file_mutex); } break; case PROP_ENCODING: { g_rec_mutex_lock(file_mutex); g_value_set_string(value, file->encoding); g_rec_mutex_unlock(file_mutex); } break; case PROP_AUDIO_FORMAT: { g_rec_mutex_lock(file_mutex); g_value_set_string(value, file->audio_format); g_rec_mutex_unlock(file_mutex); } break; case PROP_AUDIO_ENCODING: { g_rec_mutex_lock(file_mutex); g_value_set_string(value, file->audio_encoding); g_rec_mutex_unlock(file_mutex); } break; case PROP_XML_DOC: { g_rec_mutex_lock(file_mutex); g_value_set_pointer(value, file->doc); g_rec_mutex_unlock(file_mutex); } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec); break; } } void ags_file_finalize(GObject *gobject) { AgsFile *file; file = (AgsFile *) gobject; if((AGS_FILE_READ & (file->flags)) != 0){ }else if((AGS_FILE_WRITE & (file->flags)) != 0){ }else{ return; } xmlFreeDoc(file->doc); // xmlCleanupParser(); // xmlMemoryDump(); G_OBJECT_CLASS(ags_file_parent_class)->finalize(gobject); } /** * ags_file_str2md5: * @content: the string buffer * @content_length: the length of the string * * Compute MD5 sums of a buffer. * * Returns: (transfer full): the md5 checksum * * Since: 3.0.0 */ gchar* ags_file_str2md5(gchar *content, guint content_length) { GChecksum *checksum; gchar *str; str = g_compute_checksum_for_string(G_CHECKSUM_MD5, content, content_length); return(str); } /** * ags_file_add_id_ref: * @file: the @AgsFile * @id_ref: a reference * * Adds @id_ref to @file. * * Since: 3.0.0 */ void ags_file_add_id_ref(AgsFile *file, GObject *id_ref) { GRecMutex *file_mutex; if(!AGS_IS_FILE(file) || !AGS_IS_FILE_ID_REF(id_ref)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* add */ g_rec_mutex_lock(file_mutex); if(g_list_find(file->id_refs, id_ref) == NULL){ g_object_ref(id_ref); file->id_refs = g_list_prepend(file->id_refs, id_ref); } g_rec_mutex_unlock(file_mutex); } /** * ags_file_find_id_ref_by_node: * @file: the @AgsFile * @node: a XML node * * Find a reference by its XML node. * * Returns: (transfer full): the matching #GObject * * Since: 3.0.0 */ GObject* ags_file_find_id_ref_by_node(AgsFile *file, xmlNode *node) { AgsFileIdRef *file_id_ref; xmlNode *current_node; GList *start_list, *list; GRecMutex *file_mutex; if(!AGS_IS_FILE(file) || node == NULL){ return(NULL); } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* find */ file_id_ref = NULL; g_rec_mutex_lock(file_mutex); list = start_list = g_list_copy_deep(file->id_refs, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(file_mutex); while(list != NULL){ g_object_get(list->data, "node", ¤t_node, NULL); if(current_node == node){ file_id_ref = AGS_FILE_ID_REF(list->data); g_object_ref(file_id_ref); break; } list = list->next; } g_list_free_full(start_list, (GDestroyNotify) g_object_unref); return((GObject *) file_id_ref); } /** * ags_file_find_id_ref_by_xpath: * @file: the #AgsFile * @xpath: a XPath expression * * Lookup a reference by @xpath. * * Returns: (transfer full): the matching #GObject * * Since: 3.0.0 */ GObject* ags_file_find_id_ref_by_xpath(AgsFile *file, gchar *xpath) { AgsFileIdRef *file_id_ref; xmlXPathContext *xpath_context; xmlXPathObject *xpath_object; xmlNode **node; guint i; if(!AGS_IS_FILE(file) || xpath == NULL || !g_str_has_prefix(xpath, "xpath=")){ g_message("invalid xpath: %s", xpath); return(NULL); } xpath = &(xpath[6]); /* Create xpath evaluation context */ xpath_context = xmlXPathNewContext(file->doc); if(xpath_context == NULL) { g_warning("Error: unable to create new XPath context"); return(NULL); } /* Evaluate xpath expression */ xpath_object = xmlXPathEval(xpath, xpath_context); if(xpath_object == NULL) { g_warning("Error: unable to evaluate xpath expression \"%s\"", xpath); xmlXPathFreeContext(xpath_context); return(NULL); } node = xpath_object->nodesetval->nodeTab; for(i = 0; i < xpath_object->nodesetval->nodeNr; i++){ if(node[i]->type == XML_ELEMENT_NODE){ return(ags_file_find_id_ref_by_node(file, node[i])); } } g_message("no xpath match: %s", xpath); return(NULL); } /** * ags_file_find_id_ref_by_reference: * @file: the #AgsFile * @ref: a %gpointer * * Find a reference matching @ref. * * Returns: (transfer full): the matching #GObject * * Since: 3.0.0 */ GObject* ags_file_find_id_ref_by_reference(AgsFile *file, gpointer ref) { AgsFileIdRef *file_id_ref; GList *start_list, *list; gpointer current_ref; GRecMutex *file_mutex; if(!AGS_IS_FILE(file)){ return(NULL); } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* find */ file_id_ref = NULL; g_rec_mutex_lock(file_mutex); list = start_list = g_list_copy_deep(file->id_refs, (GCopyFunc) g_object_ref, NULL); g_rec_mutex_unlock(file_mutex); while(list != NULL){ g_object_get(list->data, "reference", ¤t_ref, NULL); if(current_ref == ref){ file_id_ref = AGS_FILE_ID_REF(list->data); g_object_ref(file_id_ref); break; } list = list->next; } g_list_free_full(start_list, (GDestroyNotify) g_object_unref); return((GObject *) file_id_ref); } /** * ags_file_add_lookup: * @file: the #AgsFile * @file_lookup: a #AgsFileLookup * * Add @file_lookup for later invoking. * * Since: 3.0.0 */ void ags_file_add_lookup(AgsFile *file, GObject *file_lookup) { GRecMutex *file_mutex; if(!AGS_IS_FILE(file) || !AGS_IS_FILE_LOOKUP(file_lookup)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* add */ g_rec_mutex_lock(file_mutex); if(g_list_find(file->lookup, file_lookup) == NULL){ g_object_ref(G_OBJECT(file_lookup)); file->lookup = g_list_prepend(file->lookup, file_lookup); } g_rec_mutex_unlock(file_mutex); } /** * ags_file_add_launch: * @file: the #AgsFile * @file_launch: a #AgsFileLaunch * * Add @file_launch for later invoking. * * Since: 3.0.0 */ void ags_file_add_launch(AgsFile *file, GObject *file_launch) { GRecMutex *file_mutex; if(!AGS_IS_FILE(file) || !AGS_IS_FILE_LAUNCH(file_launch)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* add */ g_rec_mutex_lock(file_mutex); if(g_list_find(file->launch, file_launch) == NULL){ g_object_ref(G_OBJECT(file_launch)); file->launch = g_list_prepend(file->launch, file_launch); } g_rec_mutex_unlock(file_mutex); } void ags_file_real_open(AgsFile *file, GError **error) { xmlDoc *doc; GRecMutex *file_mutex; if(!AGS_IS_FILE(file)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* parse the file and get the DOM */ doc = xmlReadFile(file->filename, NULL, 0); g_rec_mutex_lock(file_mutex); file->doc = doc; if(doc == NULL){ g_warning("ags_file.c - failed to read XML document %s", file->filename); if(error != NULL){ g_set_error(error, AGS_FILE_ERROR, AGS_FILE_ERROR_PARSER_FAILURE, "unable to parse document: %s\n", file->filename); } }else{ /* get the root node */ file->root_node = xmlDocGetRootElement(file->doc); } g_rec_mutex_unlock(file_mutex); } /** * ags_file_open: * @file: the #AgsFile * @error: the return location for errors * * Opens the file specified by :filename property. * * Since: 3.0.0 */ void ags_file_open(AgsFile *file, GError **error) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[OPEN], 0, error); g_object_unref(G_OBJECT(file)); } void ags_file_real_open_from_data(AgsFile *file, gchar *data, guint length, GError **error) { xmlDoc *doc; GRecMutex *file_mutex; if(!AGS_IS_FILE(file)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* parse */ doc = xmlReadMemory(data, length, file->filename, NULL, 0); g_rec_mutex_lock(file_mutex); file->doc = doc; if(file->doc == NULL){ g_warning("ags_file.c - failed to read XML document %s", file->filename); if(error != NULL){ g_set_error(error, AGS_FILE_ERROR, AGS_FILE_ERROR_PARSER_FAILURE, "unable to parse document from data: %s\n", file->filename); } }else{ /*Get the root element node */ file->root_node = xmlDocGetRootElement(file->doc); } g_rec_mutex_unlock(file_mutex); } /** * ags_file_open_from_data: * @file: the #AgsFile * @data: a buffer containing the XML document * @length: the buffer length * @error: the return location for errors * * Opens the file provided by @data. * * Since: 3.0.0 */ void ags_file_open_from_data(AgsFile *file, gchar *data, guint length, GError **error) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[OPEN_FROM_DATA], 0, data, length, error); g_object_unref(G_OBJECT(file)); } void ags_file_real_rw_open(AgsFile *file, gboolean create, GError **error) { GRecMutex *file_mutex; if(!AGS_IS_FILE(file)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* create */ g_rec_mutex_lock(file_mutex); file->out = fopen(file->filename, "w+"); file->doc = xmlNewDoc("1.0"); file->root_node = xmlNewNode(NULL, "ags"); xmlDocSetRootElement(file->doc, file->root_node); g_rec_mutex_unlock(file_mutex); } /** * ags_file_rw_open: * @file: the #AgsFile * @create: if %TRUE create the file as needed * @error: the return location for errors * * Opens the file specified by :filename property in read-write mode. * * Since: 3.0.0 */ void ags_file_rw_open(AgsFile *file, gboolean create, GError **error) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[RW_OPEN], 0, create, error); g_object_unref(G_OBJECT(file)); } /** * ags_file_open_filename: * @file: the #AgsFile * @filename: a path * * Opens the file specified by @filename property. * * Since: 3.0.0 */ void ags_file_open_filename(AgsFile *file, gchar *filename) { gchar *current_filename; GError *error; GRecMutex *file_mutex; if(!AGS_IS_FILE(file)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* check close */ g_rec_mutex_lock(file_mutex); current_filename = file->filename; g_rec_mutex_unlock(file_mutex); if(current_filename != NULL){ ags_file_close(file); } g_object_set(file, "filename", filename, NULL); error = NULL; ags_file_open(file, &error); if(error != NULL){ g_warning("%s", error->message); g_error_free(error); } } /** * ags_file_close: * @file: the #AgsFile * * Closes @file. * * Since: 3.0.0 */ void ags_file_close(AgsFile *file) { GRecMutex *file_mutex; if(!AGS_IS_FILE(file)){ return; } /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* close */ g_rec_mutex_lock(file_mutex); if(file->out != NULL){ fclose(file->out); } /* free the document */ xmlFreeDoc(file->doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); file->filename = NULL; g_rec_mutex_unlock(file_mutex); } void ags_file_real_write(AgsFile *file) { AgsApplicationContext *application_context; GList *list; int size; GRecMutex *file_mutex; /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); // ags_file_rw_open(file, // TRUE); /* write clip board */ //TODO:JK: implement me /* write scripts */ //TODO:JK: implement me /* write cluster */ //TODO:JK: implement me /* write client */ //TODO:JK: implement me /* write server */ //TODO:JK: implement me /* write application context */ ags_file_write_application_context(file, file->root_node, ags_application_context_get_instance()); /* write embedded audio */ //TODO:JK: implement me /* write file link */ //TODO:JK: implement me /* write history */ //TODO:JK: implement me /* resolve */ ags_file_write_resolve(file); /* * Dumping document to file */ // xmlSaveFormatFileEnc(file->filename, file->doc, "UTF-8", 1); xmlDocDumpFormatMemoryEnc(file->doc, &(file->buffer), &size, file->encoding, TRUE); fwrite(file->buffer, size, sizeof(xmlChar), file->out); fflush(file->out); } /** * ags_file_write: * @file: the #AgsFile * * Write the XML document to disk. * * Since: 3.0.0 */ void ags_file_write(AgsFile *file) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[WRITE], 0); g_object_unref(G_OBJECT(file)); } void ags_file_real_write_concurrent(AgsFile *file) { AgsApplicationContext *application_context; AgsThread *main_loop, *gui_thread, *task_thread; xmlNode *root_node; FILE *file_out; GList *list; xmlChar *buffer; int size; xmlNode *parent, *node, *child; gchar *id; application_context = ags_application_context_get_instance(); main_loop = (AgsThread *) AGS_APPLICATION_CONTEXT(application_context)->main_loop; //gui_thread = AGS_AUDIO_LOOP(main_loop)->gui_thread; //task_thread = AGS_AUDIO_LOOP(main_loop)->task_thread; file->doc = xmlNewDoc("1.0"); root_node = xmlNewNode(NULL, "ags"); xmlDocSetRootElement(file->doc, root_node); parent = root_node; /* write clip board */ //TODO:JK: implement me /* write scripts */ //TODO:JK: implement me /* write cluster */ //TODO:JK: implement me /* write client */ //TODO:JK: implement me /* write server */ //TODO:JK: implement me /* the main code - write main */ //TODO:JK: implement me /* write embedded audio */ //TODO:JK: implement me /* write file link */ //TODO:JK: implement me /* write history */ //TODO:JK: implement me /* resolve */ ags_file_write_resolve(file); /* * Dumping document to file */ // xmlSaveFormatFileEnc(file->filename, file->doc, "UTF-8", 1); xmlDocDumpFormatMemoryEnc(file->doc, &buffer, &size, file->encoding, TRUE); file_out = fopen(file->filename, "w+"); fwrite(buffer, size, sizeof(xmlChar), file_out); fflush(file_out); fclose(file_out); /*free the document */ xmlFreeDoc(file->doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); /* * this is to debug memory for regression tests */ xmlMemoryDump(); } void ags_file_write_concurrent(AgsFile *file) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[WRITE_CONCURRENT], 0); g_object_unref(G_OBJECT(file)); } void ags_file_real_write_resolve(AgsFile *file) { GList *start_list, *list; GRecMutex *file_mutex; /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* resolve */ g_rec_mutex_lock(file_mutex); file->lookup = g_list_prepend(file->lookup, NULL); list = start_list = g_list_copy(file->lookup); g_rec_mutex_unlock(file_mutex); while(list != NULL){ ags_file_lookup_resolve(AGS_FILE_LOOKUP(list->data)); list = list->next; } g_list_free(start_list); } /** * ags_file_write_resolve: * @file: the #AgsFile * * Resolve references to XPath expressions. * * Since: 3.0.0 */ void ags_file_write_resolve(AgsFile *file) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[WRITE_RESOLVE], 0); g_object_unref(G_OBJECT(file)); } void ags_file_real_read(AgsFile *file) { AgsApplicationContext *application_context; xmlNode *root_node, *child; GRecMutex *file_mutex; /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* child elements */ g_rec_mutex_lock(file_mutex); root_node = file->root_node; child = root_node->children; application_context = ags_application_context_get_instance(); g_rec_mutex_unlock(file_mutex); while(child != NULL){ if(child->type == XML_ELEMENT_NODE){ if(!xmlStrncmp("ags-main", child->name, 9)){ ags_file_read_application_context(file, child, (GObject **) &application_context); }else if(!xmlStrncmp("ags-embedded-audio-list", child->name, 24)){ //TODO:JK: implement me }else if(!xmlStrncmp("ags-file-link-list", child->name, 19)){ //TODO:JK: implement me }else if(!xmlStrncmp("ags-history", child->name, 12)){ //TODO:JK: implement me } } child = child->next; } /* resolve */ ags_file_read_resolve(file); g_message("XML file resolved"); ags_connectable_connect(AGS_CONNECTABLE(application_context)); g_message("XML file connected"); /* start */ ags_file_read_start(file); } /** * ags_file_read: * @file: the #AgsFile * * Read XML document from disk. * * Since: 3.0.0 */ void ags_file_read(AgsFile *file) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[READ], 0); g_object_unref(G_OBJECT(file)); } void ags_file_real_read_resolve(AgsFile *file) { GList *start_list, *list; GRecMutex *file_mutex; /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* resolve */ g_rec_mutex_lock(file_mutex); file->lookup = g_list_prepend(file->lookup, NULL); list = start_list = g_list_reverse(g_list_copy(file->lookup)); g_rec_mutex_unlock(file_mutex); while(list != NULL){ ags_file_lookup_resolve(AGS_FILE_LOOKUP(list->data)); list = list->next; } g_list_free(start_list); } /** * ags_file_resolve: * @file: the #AgsFile * * Resolve XPath expressions to references. * * Since: 3.0.0 */ void ags_file_read_resolve(AgsFile *file) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[READ_RESOLVE], 0); g_object_unref(G_OBJECT(file)); } void ags_file_real_read_start(AgsFile *file) { GList *start_list, *list; GRecMutex *file_mutex; /* get file mutex */ file_mutex = AGS_FILE_GET_OBJ_MUTEX(file); /* start */ g_rec_mutex_lock(file_mutex); list = start_list = g_list_reverse(g_list_copy(file->launch)); g_rec_mutex_unlock(file_mutex); while(list != NULL){ ags_file_launch_start(AGS_FILE_LAUNCH(list->data)); list = list->next; } g_list_free(start_list); } /** * ags_file_read_start: * @file: the #AgsFile * * Update or start the application. * * Since: 3.0.0 */ void ags_file_read_start(AgsFile *file) { g_return_if_fail(AGS_IS_FILE(file)); g_object_ref(G_OBJECT(file)); g_signal_emit(G_OBJECT(file), file_signals[READ_START], 0); g_object_unref(G_OBJECT(file)); } void ags_file_read_config(AgsFile *file, xmlNode *node, GObject **config) { AgsConfig *gobject; gchar *id; char *buffer; gsize buffer_length; gobject = (AgsConfig *) *config; gobject->version = xmlGetProp(node, "version"); gobject->build_id = xmlGetProp(node, "id"); buffer = xmlNodeGetContent(node); buffer_length = xmlStrlen(buffer); ags_config_load_from_data(gobject, buffer, buffer_length); } void ags_file_write_config(AgsFile *file, xmlNode *parent, GObject *config) { xmlNode *node; xmlNode *cdata; gchar *id; char *buffer; gsize buffer_length; id = ags_id_generator_create_uuid(); node = xmlNewNode(NULL, "ags-config"); ags_file_add_id_ref(file, g_object_new(AGS_TYPE_FILE_ID_REF, "file", file, "node", node, "xpath", g_strdup_printf("xpath=//*[@id='%s']", id), "reference", config, NULL)); xmlNewProp(node, "id", id); xmlNewProp(node, "version", AGS_CONFIG(config)->version); xmlNewProp(node, "build-id", AGS_CONFIG(config)->build_id); xmlAddChild(parent, node); /* cdata */ ags_config_to_data(AGS_CONFIG(config), &buffer, &buffer_length); cdata = xmlNewCDataBlock(file->doc, buffer, buffer_length); xmlAddChild(node, cdata); } void ags_file_read_application_context(AgsFile *file, xmlNode *node, GObject **application_context) { AgsApplicationContext *current_application_context; GList *list; gchar *context; current_application_context = ags_application_context_get_instance(); context = xmlGetProp(node, "context"); AGS_APPLICATION_CONTEXT_GET_CLASS(current_application_context)->register_types(AGS_APPLICATION_CONTEXT(current_application_context)); AGS_APPLICATION_CONTEXT_GET_CLASS(current_application_context)->read(file, node, application_context); } void ags_file_write_application_context(AgsFile *file, xmlNode *parent, GObject *application_context) { AGS_APPLICATION_CONTEXT_GET_CLASS(application_context)->register_types(AGS_APPLICATION_CONTEXT(application_context)); AGS_APPLICATION_CONTEXT_GET_CLASS(application_context)->write(file, parent, application_context); } /** * ags_file_new: * * Creates an #AgsFile * * Returns: a new #AgsFile * * Since: 3.0.0 */ AgsFile* ags_file_new() { AgsFile *file; file = (AgsFile *) g_object_new(AGS_TYPE_FILE, NULL); return(file); } gsequencer-3.1.3/ags_functional_server_test_password_store.xml0000644000175000017500000000066413607210263022107 00000000000000 ags-test-user-uuid-0 ags-test-login ags-test-password gsequencer-3.1.3/ChangeLog0000644000175000017500000046421713622252242012370 00000000000000ags (3.1.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential integer overflow in ags_osc_front_controller_do_request() * minor improvements ags (3.1.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_automation_meta.c channel_type variable to use proper GType ags (3.1.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * updated user manual ags (3.1.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * work-in-progress implemented getter and setter functions of properties * implemented meta widget of AgsNotationEditor * implemented meta widget of AgsAutomationEditor * implemented meta widget of AgsWaveEditor * implemented acoustic feedback of ags-recall-dssi * implemented acoustic feedback of ags-recall-lv2 * fixed ref-count of AgsRecallDssi:count-beats-audio-run * fixed AgsAutomationEdit not shown again * fixed AgsAutomationEdit cursor x-position * added missing gtk-doc to ags_audio_buffer_util.c ags (3.0.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * replaced UTF-8 character sequence from build files * added missing parantheses in configure.ac * wiped m4 directory and recreated it ags (3.0.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved unit-tests to call ags_priority_load_defaults() ags (3.0.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed broken WebKit2Gtk-4.0 configure ags (3.0.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented disable realtime priorities by AgsPriority ags (3.0.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added --enable-single-docdir configure option to meet FreeBSD demands ags (3.0.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added GObject-Introspection annotations for GList type properties * improved online help browser to respect --docdir configure parameter * fixes to WASAPI backend * fixes to CoreAudio backend ags (3.0.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Makefile.am missing DESTDIR ags (3.0.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Makefile.am wrong destination directory variables of gtk-doc ags (3.0.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed 64 bit portability issue with ags_functional_pitch_test.c * fixed 64 bit portability issue with ags_functional_fourier_transform_test.c * fixed ags_start_audio_test.c to run task within thread tree * fixed ags_start_channel_test.c to run task within thread tree * improved pulseaudio connect timeout * improved Makefile.am to deal with different gtk-doc locations ags (3.0.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_audio_start() and ags_channel_start() to have sync timeout * fixed some issues from build log * fixed potential SIGSEGV by flaging AgsRecallID terminating state * fixed potential data-race related to AgsTaskLauncher ags (3.0.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing prefix in autoconf option ags (3.0.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved Makefile.am to be more portable * updated libags.pc, libags_audio.pc, libags_gui.pc and libgsequencer.pc ags (3.0.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential recursive callback call * fixed potential data-race in ags_audio_stop() by stop thread first * fixed potential data-race in ags_channel_stop() by stop thread first ags (3.0.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * migrated to Gtk3 * migrated AgsOscServer and AgsOscClient to GIO sockets * migrated AgsServer to Libsoup XMLRPC * migrated AgsThread to GThread API * implemented introspection support * added G_BEGIN_DECLS and G_END_DECLS to header files * moved ags_thread-posix.[ch] to ags_thread.[ch] * removed ags_thread_file_xml.[ch], ags_audio_file_xml.[ch] and ags_gui_file_xml.[ch] * removed AgsTaskThread * removed AgsPollingThread * removed AgsPollFD * removed AgsAsyncQueue * removed AgsSingleThread * removed AgsNotifySoundcard * removed barriers of AgsThread * replaced nested functions * stripped AgsPlugin from machines ags (2.4.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved performance by omitting determinism ags (2.4.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed appdata.xml ags (2.4.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_audio_buffer_util_resample_with_buffer() and related * fixed potential buffer-overflow in ags_sfz_sample.c * fixed potential SIGSEGV in ags_sound_resource.c doing resample ags (2.4.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved alphabetically sorted plugin filenames in AgsLadspaBrowser and AgsLv2Browser * improved AgsEffectBridge removing effects ags (2.4.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential SIGSEGV related to AgsFFPlayer's effect bulk * fixed accessing freed memory of AgsBulkMember ags (2.4.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potentially freed env pointer ags (2.4.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsPriority to configure RT threads ags (2.4.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved idle CPU usage * implemented ags_cell_pattern_play() * fixed AgsNotationEdit position cursor by using left or right key ags (2.4.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented playback as clicking AgsPiano of AgsNotationEditor * implemented missing feedback of AgsNotationEditor * implemented ags_machine_playback_set_active() * implemented AgsResetNote * implemented AgsSF2Loader * implemented ags_audio_loop_test_flags(), ags_audio_loop_set_flags() and ags_audio_loop_unset_flags() * refactored ags_pad_play() to use ags_machine_playback_set_active() * refactored AgsStartAudio task to use ags_audio_start() * refactored AgsStartChannel task to use ags_channel_start() * refactored AgsCancelAudio task to use ags_audio_stop() * refactored AgsCancelChannel task to use ags_channel_stop() * improved AgsFFPlayer to use AgsSF2Loader * improved AgsPiano missing event mask * improved ags_audio_start() to start audio and channel thread * improved ags_channel_start() to start audio and channel thread * updated the API reference manual * fixed ags_piano_key_code_to_note() static const array note_map * fixed ref count in ags_notation_editor_do_feedback() * fixed ags_recycling_get_property() missing break * minor improvements * m4/lib-ld.m4: Upgrade to gettext-0.19.8.1. * m4/lib-link.m4: Upgrade to gettext-0.19.8.1. * m4/lib-prefix.m4: Upgrade to gettext-0.19.8.1. ags (2.3.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_strv_contains() to compare strings * fixed AgsApplySoundConfig task to setup AgsWasapiDevout's AgsNotifySoundcard and AgsExportThread * fixed ags_sound_resource_read_wave() to deal with different samplerates * minor improvements ags (2.3.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsAudioUnitDevout and AgsAudioUnitDevin * improved AgsScrolledPiano to draw properly on Win64 ags (2.3.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed WASAPI audio export in ags_export_thread.c ags (2.3.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsPitchSampler missing filename after restore from XML ags (2.3.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsPitchSampler to save filename in XML * fixed open project file on win64 * minor improvements ags (2.3.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing WASAPI export backend * fixed AgsApplySoundConfig accessing invalid pointer ags (2.3.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed WASAPI size of buffer request * fixed AgsPreferences missing delete-event callback ags (2.3.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed libags-audio API reference manual ags (2.3.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed WASAPI friendly name * fixed don't initialize device if its already playing/recording ags (2.3.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved hide WASAPI related configuration controls if not needed ags (2.3.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented WASAPI configuration options to adjust system buffer size and share mode * improved WASAPI IO ags (2.3.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsWasapiDevout and AgsWasapiDevin * improved AgsDial invalid range * fixed memory leaks related to g_strdup_printf() in ags_simple_file.c ags (2.3.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing includes ags (2.3.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_fourier_transform_util_test.c ags (2.3.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed don't rebuild types while make html ags (2.3.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsFMSynth * implemented AgsFMSyncSynth * implemented AgsFMOscillator * implemented AgsPitchSampler and AgsPitchSamplerFile * implemented AgsSFZFile, AgsSFZGroup, AgsSFZRegion and AgsSFZSample * implemented AgsSFZLoader * implemented ags-lfo recall * implemented AgsComplex buffer type * implemented AgsFrequencyMapManager * implemented AgsFrequencyMap to compute max likelihood * implemented ags_fm_synth_util.h supporting FM synthesis * implemented ags_lfo_synth_util.h supporting LFO amplification * implemented ags_fourier_transform_util.c * implemented ags_filter_util.c * extended ags_simple_file.c * extended ags_audio_buffer_util.h to support complex data type * extended ags_synth_util.h to support complex data type * extended ags_synth_util.h to support impulse oscillator * added ags_fourier_transform_util_test.c * added ags_fm_synth_util_test.c * added ags_filter_util_test.c ags (2.2.39) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * extended ags_audio_buffer_util.h prototype to complete Float32 support ags (2.2.38) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved iterating buffer in ags_audio_buffer_util.c * fixed unitialized values related to FreeBSD ags (2.2.37) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed more unitialized values ags (2.2.36) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved iterating buffer in ags_audio_buffer_util.c * work-around for broken lock-free audio buffer, reverted see below * reverted ags_devout.c to 2.2.25 * reverted ags_play_audio_signal.c to 2.2.25 ags (2.2.35) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * replaced regular expression by while loop in ags_turtle_read_pn_chars_base() ags (2.2.34) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored scheduling tasks to be done by AgsXorgApplicationContext * improved AgsAnimationWindow draw only as needed * improved AgsSoundcardEditor set sensitive * improved ref-count of AgsReturnableThread * improved resetting AgsReturnableThread ags (2.2.33) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsAnimationWindow * fixed memory-leaks in ags_turtle.c * fixed memory-leaks in ags_lv2_turtle_parser.c * fixed memory-leaks in ags_simple_file.c ags (2.2.32) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed uninitialized values for FreeBSD ags (2.2.31) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed uninitialized values ags (2.2.30) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsMainLoop ::sync-counter-inc() and ::sync-counter-dec() no return type ags (2.2.29) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsThreadPool make AgsReturnableThread returning * minor improvements added -Werror=return-type ags (2.2.28) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_audio_buffer_util_peak_*() to handle 0.0 correct * fixed dead-lock AgsPulseDevout provide for each buffer sub-block lock * fixed dead-lock AgsCoreAudioDevout provide for each buffer sub-block lock * fixed AgsSimpleFile audio loop start/end of AgsSyncsynth to round ags (2.2.27) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored get object mutex ags (2.2.26) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented lock-free soundcard buffer in ags-play recall * implemented ags_soundcard_get_sub_block_count() * implemented ags_soundcard_trylock_sub_block() * implemented ags_soundcard_unlock_sub_block() * improved AgsDevout, AgsPulseDevout, AgsJackDevout and AgsCoreAudioDevout ags (2.2.25) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored ags_audio_buffer_util.c to support builtin vector functions * fixed ags_char_buffer_util.c ags (2.2.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed SIGSEGV as open file ags (2.2.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed relative counters and time fraction issues * improved replacing hard-coded font * refactored AgsDial to use PangoLayout * refactored AgsLevel to use PangoLayout * refactored AgsScale to use PangoLayout * refactored AgsRuler to use PangoLayout * refactored AgsCartesian to use PangoLayout ags (2.2.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsNotationEditor to use GUI scale factor * implemented AgsWaveEditor to use GUI scale factor * implemented AgsAutomationEditor to use GUI scale factor * implemented AgsRuler properties * implemented AgsFFPlayer to use GUI scale factor * improved AgsCellPattern to use GUI scale factor ags (2.2.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsCellPattern and AgsPatternBox to use GUI scale factor * implemented GtkVScrollbar and GtkHScrollbar to GUI scale using slider-width and stepper-size * implemented GtkVScale and GtkHScale to GUI scale using slider-width ags (2.2.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented GUI scale factor * implemented AgsIndicator properties * implemented AgsDial properties * improved ags_vindicator_draw() and ags_hindicator_draw() to use properties * improved ags_dial_draw() properties ags (2.2.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented instance access from LV2UI * minor improvements ags (2.2.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_lv2ui_plugin_test_flags(), ags_lv2ui_plugin_set_flags() and ags_lv2ui_plugin_get_flags() * implemented ags_base_plugin_instantiate_with_params() * implemented ags_lv2ui_plugin_instantiate_with_params() * refactored AgsLv2Bridge and AgsLiveLv2Bridge * improved AgsAudioApplicationContext and AgsXorgApplicationContext * improved lv2 plugin set flag AGS_LV2_PLUGIN_IS_SYNTHESIZER as parsing names gs (2.2.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * reenabled sync counter increment before decrement fixes a race condition ags (2.2.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * reverted sync counter by using conditional build ags (2.2.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_main_loop_set_sync_tic() and ags_main_loop_get_sync_tic() ags (2.2.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential dead-lock, it is some procedural code that makes paralellism work * reverted previous tree lock change ags (2.2.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsAudioLoop and AgsGenericMainLoop to use :obj-mutex as tree lock ags (2.2.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential dead-lock gs (2.2.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_simple_file.c to apply logarithmic port fixup * improved developer's book * fixed spelling errors * fixed ags_functional_notation_editor_workflow_test_edit_all() in order to pass again ags (2.2.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_thread_global_get_use_sync_counter() synchronize threads with reduced overhead * implemented ags_main_loop_sync_counter_inc() * implemented ags_main_loop_sync_counter_dec() * implemented ags_main_loop_sync_counter_test() * fixed memory-leak in ags_message_envelope_free() ags (2.2.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved Lv2 program and preset logarithmic conversion ags (2.2.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsEffectBulk and AgsBulkMember to support logarithmic ports * improved AgsLine, AgsEffectLine and AgsLineMember to support logarithmic ports * improved AgsAutomationArea to support logarithmic ports * improved AgsLine to properly support GtkRange and GtkSpinButton * fixed synced Lv2ui controls ags (2.2.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved check if plugin port already exists ags (2.2.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_lv2_turtle_parser_parse_names() * implemented partial parse of lv2 plugins * fixed some memory-leaks in ags_turtle_finalize() ags (2.2.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed port index of audio port for ags-play-lv2 recall * fixed load of plugin for ags-play-lv2 recall ags (2.2.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved LV2 RDF Turtle parser to handle applies to ags (2.2.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed check NULL of filename and effect in ags_lv2_manager_find_lv2_plugin() * fixed check NULL of filename in ags_base_plugin_find_filename() * improved LV2 RDF Turtle parser to handle prefixed names ags (2.2.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AppStream metadata license * fixed ags/test/X/libgsequencer.h removed include ags (2.2.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed API Reference manual ags (2.2.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsLv2TurtleParser * implemented AgsCursor interface * implemented AgsOscExportController * fixed potential SIGSEGV as reading malformed RDF Turtle * improved license and copyright notices for various files * minor improvements and fixes * added NEWS entry ags (2.1.78) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented prefix id hash table of AgsTurtle ags (2.1.77) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential SIGSEGV in ags_simple_file.c ags (2.1.76) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved running integration tests using automake conditional * improved mutexes with AgsUiProvider in ags_xorg_application_context.c * improved mutex in ags_playback_domain_get_audio_thread() * improved mutexes in ags_recall_set_staging_flags() ags (2.1.75) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed developer's handbook deprecated use of AgsGroupId, replaced by AgsRecallID * fixed developer's handbook deprecated use of AgsRecall ::resolve-dependencies(), it is now ::resolve-dependency() * improved ags_sound_card_editor_reset() to apply backend properly ags (2.1.74) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags-copy-pattern recall to proper free GError * fixed ags_recycling_finalize() to free AgsUUID * fixed ags_thread_finalize() to free AgsUUID and other memory-leaks * fixed potential SIGSEGV in ags_simple_file.c ags (2.1.73) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented use g_error_free() * improved ref-count of AgsInput:file-link in ags_audio_open_file_as_channel() * improved ref-count of AgsInput:file-link in ags_open_sf2_instrument.c * improved ref-count of AgsInput:file-link in ags_open_sf2_sample.c * improved ref-count of AgsInput:file-link in ags_open_single_file.c * fixed potential SIGSEGV cause by attack larger than buffer size in ags_synth_generator.c ags (2.1.72) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented OSC meter refresh rate option ags (2.1.71) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed OSC server meter controller type tag boundaries * fixed potential SIGSEGV as expanding OSC meter path ags (2.1.70) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing ags_sound_enums.h in API reference manual * fixed OSC server path in docs/oscBook/chap6.xml ags (2.1.69) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.19.8. * fixed non thread-safe ags_audio_loop_get_type() * fixed non thread-safe ags_audio_thread_get_type() * fixed non thread-safe ags_channel_thread_get_type() * fixed non thread-safe ags_soundcard_thread_get_type() * fixed non thread-safe ags_sequencer_thread_get_type() * fixed non thread-safe ags_export_thread_get_type() * fixed missing apply of AgsFileLink for create_channels in ags_audio_open_audio_file_as_channel() * fixed type float for modifying pattern bank index of AgsDrum and AgsMatrix ags (2.1.68) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * disabled defaulted AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING of AgsDrum * fixed missing unset of AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING in ags_simple_file.c ags (2.1.67) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong argument to g_object_unref() in ags_start_sequencer.c * fixed 64 bit issue in ags_copy_pattern_channel_run.c * fixed 64 bit issue in ags_play_notation_audio_run.c ags (2.1.66) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong tag in OSC server manual chap6.xml * improved API reference manual ags (2.1.65) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_mutex_manager_remove() to not destroy data at all * fixed dead-lock on kfreebsd as ags_cond_manager_remove() destroys data twice * improved API reference manual structure of libags_audio.xml * improved API reference manual structure of libgsequencer.xml ags (2.1.64) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed accessing using wrong property name in ags_channel_get_level() * minor improvements and fixed memory-leaks ags (2.1.63) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ref count of return value and calls from/to ags_audio_collect_all_audio_ports() * fixed ref count of return value and calls from/to ags_audio_collect_all_audio_ports_by_specifier_and_context() * fixed ref count of return value and calls from/to ags_channel_collect_all_channel_ports() * fixed ref count of return value and calls from/to ags_channel_collect_all_channel_ports_by_specifier_and_context() * fixed ref count of return value and calls from/to ags_channel_get_level() * fixed ref count of return value from ags_recycling_find_next_channel() * fixed ref count of return value and calls from/to ags_audio_signal_get_template() * fixed ref count of return value and calls from/to ags_audio_signal_get_rt_template() * fixed ref count of return value and calls from/to ags_recall_get_by_effect() * fixed memory-leak in ags_recycling_set_samplerate(), ags_recycling_set_buffer_size() and ags_recycling_set_format() ags (2.1.62) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential unitialized pointer passing to g_object_unref() ags (2.1.61) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_channel_next() and ags_channel_prev() * implemented ags_channel_next_pad() and ags_channel_prev_pad() * implemented ags_recycling_next() and ags_recycling_prev() * improved ags_channel_first() and alike to return referenced AgsChannel * improved many ref counts related to iterating AgsChannel * fixed memory-leak in ags_channel_recursive_setup_run_stage_down() ags (2.1.60) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented reposition AgsAudio in AgsSoundProvider within UI * improved ags_simple_file_read_machine() to use g_list_append() to add AgsAudio * improved ags_add_audio_launch() to use g_list_append() to add AgsAudio * fixed missing mutex locks of AgsThreadApplicationContext * fixed missing ref count of AgsSoundProvider's getter functions * fixed missing ref count of AgsConcurrencyProvider's getter functions * minor improvements ags (2.1.59) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing AUTHORS files * fixed ChangeLog missing mention of patch author * fixed missing contribution description in ags_eq10_audio_signal.c * fixed ags_parameter.c license header ags (2.1.58) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_automation_get_value() * fixed missing flags during resize audio channels and pads of AgsEffectBridge ags (2.1.57) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_effect_bulk_indicator_queue_draw_timeout() updating bulk member * disabled ladspa, dssi and lv2 for unit-tests by setting appropriate path * improved ags_devin.c to use ALSA hints * improved AgsAudioSignal access in ags_recycling.c * improved usage of g_value_unset() * improved removing threads in ags_apply_sound_config.c * fixed memory leak in ags_recycling.c as retrieving audio signal template * fixed accessing AgsConnectable::connect() of AgsOutputListingEditor and AgsInputListingEditor during disconnect * fixed missing object unref in ags_buffer_audio_signal_run_init_pre() ags (2.1.56) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_devout.c and ags_midiin.c to use ALSA hints * enabled third mode of ags-envelope by audio signal length * enabled ags-envelope mode use-note-length of AgsSyncsynth and AgsFFPlayer * fixed potential SIGSEGV of LV2 presets in AgsLv2Bridge and AgsLiveLv2Bridge callbacks ags (2.1.55) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_lv2_plugin.c to check UI iriref * improved LV2 presets to check iri ags (2.1.54) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_simple_file_read_config() to modify AgsThread:max-precision and main loops frequency * fixed AgsThread:max-precision property specification * fixed wrong warning during ags_recall_dependency_resolve() * improved MIDI playback of ags-play-lv2 and ags-play-dssi recall to check AGS_NOTE_FEED * improved ags_audio_signal_feed() to use new loop algorithm ags (2.1.53) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsSequencer::lock-buffer() and AgsSequencer::unlock-buffer() * added plugin property to AgsRecallLadspa, AgsRecallDssi and AgsRecallLv2 * fixed ags_recall_lv2_run_run_inter() to test if instrument by AGS_LV2_PLUGIN_IS_SYNTHESIZER flag * fixed double free in ags_jack_port_finalize() and ags_pulse_port_finalize() * 2019-02-12 Yuri Victorovich (tiny change) - applied patches for FreeBSD * replaced shell expansion of directory lists in Makefile.am ags (2.1.52) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed accessing uninitialized pointer in ags_recall_lv2_run.c * fixed accessing uninitialized pointer in ags_recall_ladspa_run.c * fixed XPath accessor to read LV2 UIs ags (2.1.51) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed bisect algorithm of AgsNotation, AgsAutomation and AgsWave * fixed wrong ref-count in ags-eq10 recall ags (2.1.50) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unit-test ags_notation_test.c ags (2.1.49) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved bisection of AgsNotation, AgsAutomation and AgsWave * fixed use ags_notation_add() in ags_simple_file.c * fixed use ags_automation_add() in ags_simple_file.c ags (2.1.48) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * reworked object properties and accessors * implemented object mutex of AgsTurtle * fixed missing clear during set samplerate and buffer size of AgsAudioSignal * fixed missing clear during set samplerate and buffer size of AgsWave ags (2.1.47) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved read machines in AgsSimpleFile before editors * improved hihgly inneficient ags_notation_find_offset() * improved bisection code * work-around fix default XML namespace with XPath ags (2.1.46) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_notation_find_offset() bisection x offset of notes * improved ags-play-notation recall to use ags_notation_find_offset() * refactored ags_automation_get_value() to bisection x offset of accelerations * fixed AgsApplySoundConfig task to run dispose after replacing soundcard/sequencer * fixed set property default-output-soundcard thread of AgsChannelThread in ags_channel.c * fixed ags offset of timestamp during paste in AgsNotationEditor, AgsAutomationEditor and AgsWaveEditor ags (2.1.45) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed memory-leak during monitor by osc server ags (2.1.44) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed SIGSEGV introduced in 2.1.42 related to ags_functional_osc_server_test_meter_controller() * fixed project_license in gsequencer.appdata.xml ags (2.1.43) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ref-count in ags_xorg_application_context_test.c * fixed project_license in gsequencer.appdata.xml ags (2.1.42) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential SIGSEGV during grow buffer size in ags_audio_signal_set_buffer_size() * fixed potential SIGSEGV during grow buffer size in ags_wave_set_buffer_size() * fixed potential SIGSEGV during grow samplerate in ags_audio_signal_set_samplerate() * fixed potential SIGSEGV during grow samplerate in ags_wave_set_samplerate() * improved ags_functional_osc_server_test_meter_controller() to free data * added ags_functional_audio_config_test.c ags (2.1.41) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsCellPattern get sequencer counter and set active led * improved AgsPatternBox get sequencer counter and set active led * improved ags_recall_find_type() and ags_recall_template_find_type() to use g_type_is_a() * improved CoreAudio output to use cache * removed calls to pango_fc_font_map_cache_clear() * fixed ags_pulse_audio_get_next_buffer() index excess * fixed AgsOscConnection and AgsOscClient missing variable on apple ags (2.1.40) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed resample of AgsAudioSignal and AgsWave only as needed * fixed realloc buffer size of AgsAudioSignal and AgsWave only as needed ags (2.1.39) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed typo in functional-system-tests.mk.am ags (2.1.38) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored ags_wave_find_point() to do bisect * added unit-system-tests.mk.am ags (2.1.37) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed remove message monitor on AgsMachine implementation finalize ags (2.1.36) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing seekable interface to AgsCaptureWaveChannelRun * fixed initial seek in AgsAudiorec * fixed wrong format during resample in ags_audio_signal.c * fixed wrong format during resample in ags_wave.c * fixed desktop-id in gsequencer.appdata.xml ags (2.1.35) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsMachine signals ::samplerate-changed, ::buffer-size-changed and ::format-changed * implemented AgsPad signals ::samplerate-changed, ::buffer-size-changed and ::format-changed * implemented AgsLine signals ::samplerate-changed, ::buffer-size-changed and ::format-changed * implemented AgsEffectBridge signals ::samplerate-changed, ::buffer-size-changed and ::format-changed * implemented AgsEffectPad signals ::samplerate-changed, ::buffer-size-changed and ::format-changed * implemented AgsEffectLine signals ::samplerate-changed, ::buffer-size-changed and ::format-changed * implemented emitting message of AgsAudio's samplerate, buffer-size and format change * implemented emitting message of AgsChannel's samplerate, buffer-size and format change * implemented proper resample of AgsAudioSignal as adjusting buffer size and samplerate * implemented proper resample of AgsWave as adjusting buffer size and samplerate * fixed applying samplerate, buffer size and format to AgsSynthGenerator * fixed update AgsSynth and AgsSyncsynth after modifying samplerate * fixed adjust loop information to samplerate * fixed check if EBADFD available in ags_osc_client.c and ags_osc_connection.c ags (2.1.34) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing integration test ags_check_system_functional_osc_server_test * improved AgsSoundcardEditor use cache option * improved AgsXorgApplicationContext to set cache buffer size as a multiple of buffer size * improved AgsApplySoundConfig to set cache buffer size as a multiple of buffer size ags (2.1.33) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented cache options of AgsSoundcardEditor * implemented pulseaudio cache ags (2.1.32) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved gsequencer.desktop * improved ags_xorg_application_context_prepare() open file * added gsequencer.appdata.xml ags (2.1.31) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed compiler error ags (2.1.30) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes ags (2.1.29) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing datadir prefix in Makefile.am ags (2.1.28) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented write xmlns to files * improved gsequencer.destkop.in * added application-x-gsequencer.xml to specify MIME handler ags (2.1.27) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added gsequencer.png icons for hicolor icon theme ags (2.1.26) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added OSC server documentation ags (2.1.25) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed typo in prototype declaration ags (2.1.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_soundcard_set_start_note_offset() * implemented ags_soundcard_get_start_note_offset() * implemented ags_sequencer_set_start_note_offset() * implemented ags_sequencer_get_start_note_offset() * implemented AgsSeekable of ags-play-wave recall * implemented AgsSeekable of ags-capture-wave recall * improved apply min/max audio channels and pads to instruments * improved AgsResizeEditor to respect min/max channel alignment * improved AgsResizeAudio task to resize audio channels prior to pads * fixed missing initial loop position of instruments ags (2.1.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing initial loop of notation as adding AgsDssiBridge and AgsLiveDssiBridge * fixed missing initial loop of notation as adding AgsLv2Bridge and AgsLiveLv2Bridge * fixed ags_recycling_create_audio_signal_with_frame_count() ags (2.1.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor improvements and 2nd attempt of targeting compiler warnings ags (2.1.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_start_audio_test.c and ags_start_channel_test.c ags (2.1.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor improvements and targeting compiler warnings * increased pulseaudio default buffer size * disabled pulseaudio empty buffer compensation on underflow * fixed potential dead-lock in ags_recall_set_property() * fixed potential dead-lock in ags_recall_dssi_run_set_property() * fixed potential dead-lock in ags_recall_lv2_run_set_property() * fixed potential dead-lock in ags_eq10_channel_get_property() ags (2.1.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor improvements and targeting compiler warnings * added ags_start_audio_test.c * added ags_start_channel_test.c ags (2.1.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved code of AgsSetBufferSize task * improved code of AgsSetSamplerate task * fixed AgsSeekSoundcard:offset set/get property * fixed AgsSetDevice:device set property * added ags_resize_audio_test.c * added ags_seek_soundcard_test.c * added ags_set_audio_channels_test.c * added ags_set_buffer_size_test.c * added ags_set_device_test.c * added ags_set_format_test.c * added ags_set_muted_test.c * added ags_set_samplerate_test.c ags (2.1.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsMessageEnvelope missing struct for API comments * fixed potential string read boundary excess in ags_simple_file_read_oscillator() * improved ref count of ags_message_delivery_add_queue() and ags_message_delivery_remove_queue() ags (2.1.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved always show add/remove port of AgsSoundcardEditor * fixed reading/writing AgsOscillator sync-point * fixed division by zero in ags_synth_util.c ags (2.1.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * decoupled AgsJackClient for input from JACK ags (2.1.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented reset soundcard property of AgsWindow * fixed AgsXorgApplicationContext ref counting * fixed AgsAudioApplicationContext ref counting * fixed add/remove pulseaudio soundcard by configuration * fixed add/remove JACK soundcard by configuration ags (2.1.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsFunctionalDrumTest and AgsFunctionalFFPlayerTest to assert if directory exists * completed ags_functional_osc_server_test.c * fixed missing include in ags_play_wave_channel_run.c * fixed memory leaks of AgsOscFrontController * fixed memory leaks of AgsOscActionController * fixed memory leaks of AgsOscConfigController * fixed memory leaks of AgsOscMeterController * fixed memory leaks of AgsOscNodeController * fixed memory leaks of AgsOscRenewController * fixed memory leaks of AgsOscStatusController ags (2.1.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_osc_util_decode() to return correct size ags (2.1.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsOscServerPreferences * implemented parse OSC server config in ags_xorg_application_context_setup() * implemented data cache of OSC connection and client * implemented missing persistence of AgsAudio:audio-name property * improved read bytes of OSC connection and client ags (2.1.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added ags_osc_client_test.c * added ags_osc_connection_test.c * added ags_functional_osc_server_test.c ags (2.1.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing include of signal.h in ags_audio_application_context.c * fixed ags_thread_add_start_queue() and ags_thread_add_start_queue_all() to use correct mutex * fixed ags_functional_audio_test.c removed wrong code starting threads twice ags (2.1.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_osc_server_add_default_controller() * improved AgsOscServer ::start() and ::stop() * fixed timeout of ags_osc_front_controller_delegate_thread() * fixed ags_play_channel_run_master_remap_dependencies() to check if AgsRecallID present * added ags_osc_status_controller_test.c * added ags_osc_front_controller_test.c * added ags_osc_server_test.c ags (2.1.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsMidiin, AgsJackMidiin and AgsCoreMidiing unitialized pointer * added ags_osc_config_controller_test.c * added ags_osc_info_controller_test.c ags (2.1.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored AgsOscRenewController allowing you to use ranges and wildcards * refactored AgsOscNodeController allowing you to use ranges and wildcards * refactored AgsOscMeterController allowing you to use ranges and wildcards * fixed OSC controllers missing path matching recall * fixed ags_osc_buffer_util.c to do shift operator using guint64 * fixed ags_osc_buffer_util_get_rgba() to access using correct index * fixed ags_osc_buffer_util_get_midi() to access using correct index * fixed ags_osc_buffer_util_get_packet() to read packet size * added ags_osc_buffer_util_test.c * added ags_osc_renew_controller_test.c * added ags_osc_node_controller_test.c * added ags_osc_meter_controller_test.c * added ags_osc_action_controller_test.c ags (2.1.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes ags (2.1.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes ags (2.1.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented rename audio in context menu * fixed ags-delay recall to listen to AgsSoundcard::tic() event * minor improvements ags (2.1.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing symbol export ags (2.1.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing symbol ags (2.1.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsAudio:audio-name property * implemented AgsSetDevice task * implemented AgsStopSoundcard task * implemented AgsStopSequencer task * implemented AgsApplySoundConfig task * implemented ags_osc_util.c * implemented ags_osc_buffer_util.c * implemented ags_osc_parser.c * implemented ags_osc_builder.c * implemented ags_osc_client.c * implemented ags_osc_server.c * implemented ags_osc_connection.c * implemented ags_osc_response.c * implemented ags_osc_front_controller.c * implemented ags_osc_info_controller.c * implemented ags_osc_status_controller.c * implemented ags_osc_config_controller.c * implemented ags_osc_action_controller.c * implemented ags_osc_meter_controller.c * implemented ags_osc_node_controller.c * implemented ags_osc_renew_controller.c * fixed ags_front_controller_do_request() prototype declaration * fixed ags_local_factory_controller_create_instance() prototype declaration ags (2.0.38) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed configure argument enable_run_functional_tests ags (2.0.37) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing symbols ags (2.0.36) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * install ags/config.h in include directory * implemented AgsIpatchDLS2Reader and AgsIpatchGigReader * implemented AgsConnectable interface of AgsAudioContainer and AgsAudioFile * implemented AgsConnectable interface of AgsIpatch and AgsSndfile * implemented AgsConnectable interface of AgsIpatchDLS2Reader, AgsIpatchGigReader and AgsIpatchSF2Reader * implemented thread-safety of AgsAudioContainer and AgsAudioFile * implemented thread-safety of AgsIpatch and AgsSndfile * implemented thread-safety of AgsIpatchDLS2Reader, AgsIpatchGigReader and AgsIpatchSF2Reader * implemented ags_char_buffer_util.c * improved conditional compilation with libinstpatch and exclude AgsFFPlayer * added configure option to enable functional tests * added ags_connectable_test.c * added ags_soundcard_test.c * added ags_reset_peak_test.c * added ags_reset_amplitude_test.c ags (2.0.35) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_apply_bpm_recall() wrong parameter order * fixed AgsRemoveNote task * modified default buffer size in config * modified default buffer size in ags_soundcard.h * added ags_add_audio_test.c * added ags_add_audio_signal_test.c * added ags_add_effect_test.c * added ags_add_note_test.c * added ags_add_soundcard_test.c * added ags_apply_bpm_test.c * added ags_apply_presets_test.c * added ags_apply_sequencer_length_test.c * added ags_apply_synth_test.c * added ags_apply_tact_test.c * added ags_cancel_audio_test.c * added ags_cancel_channel_test.c * added ags_clear_audio_signal_test.c * added ags_clear_buffer_test.c * added ags_crop_note_test.c * added ags_export_output_test.c * added ags_free_selection_test.c * added ags_link_channel_test.c * added ags_move_note_test.c * added ags_notify_soundcard_test.c * added ags_remove_audio_test.c * added ags_remove_audio_signal_test.c * added ags_remove_note_test.c * added ags_remove_soundcard_test.c ags (2.0.34) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing ags-feed recall in factory * fixed missing property AgsAnalyseChannel:buffer-cleared * fixed ags_copy_channel_new() to use correct property AgsRecallChannel:source * fixed ags_copy_pattern_audio_new() to use correct type to set bank-index-0 and bank-index-1 * fixed ags_peak_channel_new() to use correct property AgsRecallChannel:source * added ags_recall_recycling_test.c * added ags_envelope_audio_signal_test.c * added ags_eq10_audio_signal_test.c * added ags_feed_audio_signal_test.c * added ags_mute_audio_signal_test.c * added ags_peak_audio_signal_test.c * added ags_play_audio_signal_test.c * added ags_prepare_audio_signal_test.c * added ags_stream_audio_signal_test.c * added ags_volume_audio_signal_test.c * added ags_analyse_channel_test.c * added ags_buffer_channel_test.c * added ags_capture_wave_audio_test.c * added ags_capture_wave_channel_test.c * added ags_copy_channel_test.c * added ags_copy_pattern_audio_test.c * added ags_copy_pattern_channel_test.c * added ags_count_beats_audio_test.c * added ags_delay_audio_test.c * added ags_envelope_channel_test.c * added ags_eq10_channel_test.c * added ags_mute_audio_test.c * added ags_mute_channel_test.c * added ags_peak_channel_test.c * added ags_play_audio_test.c * added ags_play_channel_test.c * added ags_play_wave_audio_test.c * added ags_play_wave_channel_test.c * added ags_record_midi_audio_test.c * added ags_route_dssi_audio_test.c * added ags_route_lv2_audio_test.c * added ags_volume_channel_test.c ags (2.0.33) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed 32/64 bit issues in ags_recycling_context.c * fixed ags-copy recall * added ags_buffer_audio_signal_test.c * added ags_copy_audio_signal_test.c ags (2.0.32) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsSpectrometer and AgsEqualizer10 missing recall factory effects * fixed possible infinite loop in ags_recycling_context.c * fixed possible floating point exception in ags_synth_generator.c * completed ags_recycling_context_test.c * renamed ags_functional_editor_workflow_test.c to ags_functional_notation_editor_workflow_test.c * added ags_functional_automation_editor_workflow_test.c * added ags_synth_generator_test.c * added ags_analyse_audio_signal_test.c ags (2.0.31) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented missing properties AgsAudio:min-audio-channels, AgsAudio:min-output-pads and AgsAudio:min-input-pads * fixed ags_recycling_context_remove() potential memory corruption * populated ags_audio_buffer_util_test.c * added ags_char_buffer_util_test.c skelleton * added ags_devin_test.c * added ags_fifoout_test.c * added ags_midi_test.c * added ags_track_test.c * added ags_recall_id_test.c * added ags_recycling_context_test.c ags (2.0.30) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed compiler error ags (2.0.29) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_buffer_test_duplicate() to pass on x86 systems ags (2.0.28) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong types in ags_buffer.c * fixed wrong types in ags_jack_client.c * populated partially ags_audio_buffer_util_test.c ags (2.0.27) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_ladspa_browser_callbacks.c to obtain GtkComboBox model * fixed missing property AgsLadspaConversion:samplerate * fixed prototypes in ags_synth_util.h * added ags_buffer_util_test.c * added ags_ladspa_conversion_test.c * added ags_lv2_conversion_test.c * added ags_plugin_port_test.c ags (2.0.26) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added ags_conversion_test.c * added ags_wave_test.c * added ags_buffer_test.c ags (2.0.25) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added shortcuts to fluid soundfonts and hydrogen drumkits * improved default size of AgsConnectionEditor * improved all labels upper-case of AgsNotationToolbar, AgsAutomationToolbar and AgsWaveToolbar * fixed check child == NULL in ags_output_listing_editor.c and ags_input_listing_editor.c * fixed missing include in gsequencer_main.c ags (2.0.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed compiler errors ags (2.0.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * disabled gtk fatal mask * improved AgsRampAccelerationDialog to use proper step count ags (2.0.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing includes * fixed missing thread-safe properties of AgsTask ags (2.0.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing chapter * added missing image wave toolbar of user's handbook * minor improvements ags (2.0.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * updated the docs user's and developer's handbook * added new AgsSpectrometer, AgsEqualizer10 and AgsAudiorec machines to the user's handbook * replaced most of the screenshot for the user's handbook * fixed missing gtkrc entry of AgsSelectBufferDialog and AgsPositionWaveCursorDialog * fixed ags_pattern_envelope_set_preset_property() * fixed AgsRampAccelerationDialog ags (2.0.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed notation editor missing segments as zoom bigger than 1:1 * fixed timestamp issue in notation eidtor ags (2.0.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed audio export's bad behaviour on sequencer termination after ags (2.0.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unsafe child access in ags_recall.c * fixed ags-route-lv2 recall no playback * fixed ags-dssi recall no playback for note length 1 * fixed ags-lv2 recall no playback for note length 1 ags (2.0.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_audio_buffer_util_envelope_*() to compute correct current volume * fixed ags-envelope recall read missing ratio value * fixed AgsEnvelopeDialog initial values ags (2.0.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong one more offset calculation problem in ags-capture-wave and ags-play-wave ags (2.0.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags-capture-wave and ags-play-wave recall to use correct offset ags (2.0.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsWaveLoader * implemented AgsAudiorec file loading animation * fixed set property of AgsLv2Worker:returnable-thread ags (2.0.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * enabled recursive property reset during ags_channel_set_link() and fixed apply on output ags (2.0.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing AGS_SOUND_ABILITY_PLAYBACK of plugin bridge's AgsAudio * partial rewrite of ags_envelope_audio_signal_run_inter() * fixed to many calls to the dispatcher * disable recursive property reset during ags_channel_set_link() ags (2.0.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsMidiDialog non existing property use correct one "input-sequencer" * fixed free of unitialized GList in ags_effect_bridge.c * fixed DSSI and LV2 machines to use correct recall context * fixed dead-lock in ags_lv2_urid_manager.c * implemented missing properties AgsPlayDssi:bank and AgsPlayDssi:program * added missing AGS_SOUND_ABILITY_PLAYBACK of instrument's AgsAudio ags (2.0.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * reverted previously introduced but in ags-capture-wave * fixed ags-play-wave wrong offset calculation * fixed output/input soundcard editor to reset audio channel to -1 if no soundcard * fixed automation editor SIGSEGV due to NULL pointer dereference * fixed missing port in automation editor * fixed all sorts of automation related issues ags (2.0.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing ability flags in sound generator machines related to channel scope ags (2.0.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed some properties of AgsJackServer and AgsJackClient * fixed some properties of AgsPulseServer and AgsJackClient * fixed some properties of AgsCoreAudioServer * work-around for jack_port_set_name() resulting conflict as ags_soundcard_set_device() ags (2.0.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed not thread-safe access to recall in ags_lv2_bridge.c * fixed freed not duplicated string * fixed double free in ags_bulk_member_finalize() ags (2.0.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing audio data after capture default duration ags (2.0.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing trailing audio after open wave ags (2.0.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong recall access in AgsDssiBridge, AgsLv2Bridge, AgsLiveDssiBridge and AgsLiveLv2Bridge ags (2.0.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_note_new_with_offset() prototype * fixed ags_recall_factory_create_buffer() to do safe iteration * fixed ags_functional_ffplayer_test to use correct parameter for pthread_join() * fixed ags_functional_test_util.c to check if realized * fixed use of unitialized value in ags_effect_bulk_real_resize_pads() * fixed NULL pointer dereference of AgsApplicationClass in ags_xorg_application_context.c * implemented ags_functional_test_util_idle_test_widget_realized() ags (2.0.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor bug-fixes ags (2.0.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsChannel to listen to AgsRecall::child-done() * implemented AgsInputCollectionEditor, AgsInputListingEditor and AgsInputEditor * implemented ags_soundcard_lock_buffer() and ags_soundcard_unlock_buffer() * implemented audio input properties * implemented AgsWaveWindow, AgsWaveEditor, AgsWaveToolbar and AgsWaveEdit * implemented AgsSelectBuffer and AgsPositionWaveCursor * implemented AgsWave and AgsBuffer * implemented ags-play-wave recall * implemented ags-capture-wave recall * implemented ags-copy-pattern recall plugin port for automation * implemented AgsAudiorec * new ags_globals.[ch] * new ags_uuid.[ch] * new ags_midi.[ch] * new ags_track.[ch] * new ags_char_buffer_util.[ch] * new ags_sound_container.[ch] * new ags_sound_resource.[ch] * new ags_wav_file.[ch] * new ags_soundcard_util.[ch] * new ags_plugin_port.[ch] * incompatible AgsBasePlugin::instantiate() function prototype * added ags_connectable_has_resource() * added ags_audio_done_recall() * replaced AgsDistributedManager by AgsSoundServer * added propertiy :output-soundcard to AgsAudio, AgsChannel, AgsRecycling, AgsAudioSignal and AgsRecall * added propertiy :input-soundcard to AgsAudio, AgsChannel, AgsRecycling, AgsAudioSignal and AgsRecall * replaced use of GParameter by string vector and value array of AgsMessageEnvelope * replaced use of GParameter by string vector and value array of AgsPreset * replaced AgsPortDescriptor struct by AgsPluginPort object * modified prototype of ags_audio_collect_all_audio_ports_by_specifier_and_context() * modified prototype of ags_midi_file_read_*() * modified prototype of ags_synth_generator_compute() * modified return type of ags_channel_add_effect() to AgsRecall * renamed g_cclosure_user_marshal_* to ags_cclosure_marshal_* * renamed ags_connectable_connect_scope() to ags_connectable_connect_connection() * renamed ags_connectable_disconnect_scope() to ags_connectable_disconnect_connection() * renamed AgsRecallChannelDummyRun to AgsGenericRecallChannelRun * renamed AgsRecallRecyclingDummy to AgsGenericRecallRecycling * renamed ags_audio_play_recall() * renamed ags_audio_cancel_recall() * renamed ags_audio_signal_find_by_recall_id() * renamed ags_audio_signal_find_stream_current() * removed ags_connection_manager.[ch] * removed ags_connection.[ch] * removed ags_packable.[ch] * removed ags_recall_load_automation() and ags_recall_unload_automation() * removed property :soundcard from AgsAudio, AgsChannel, AgsRecycling, AgsAudioSignal and AgsRecall * removed ags_audio_connection.[ch] * removed ags_message.[ch] * removed ags_playable.[ch] * removed ags_audio_remove() * removed ags_channel_safe_resize_audio_signal() * removed ags_channel_recursive_play_init() * removed ags_channel_tillrecycling_cancel() * removed ags_channel_recursive_reset_recall_ids() * removed ags_channel_recursive_reset_recycling_context * removed ags_channel_recursive_reset_recall_id * removed ags_channel_recursive_init * removed ags_channel_recursive_run * removed ags_channel_recursive_cancel * removed ags_channel_recursive_play_threaded * removed ags_channel_recursive_play * removed ags_audio_signal_realloc_buffer_size() * removed ags_audio_signal_tile() * removed ags_audio_signal_scale() * removed ags_synth_generator_compute_extended() * removed ags_synth_generator_compute_with_audio_signal() * removed ags_play_note.[ch] * removed ags_play_audio_file.[ch] ags (1.4.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * work-around reverted pulseaudio GMainLoop integration * implemented property AgsBasePlugin:id * improved ags_lv2_manager.c to be faster ags (1.4.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_functional_audio_test.c to create notation as needed * defaulted to disable OSS4 dependency ags (1.4.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_audio_set_audio_channels() to remove unneeded notation, automation and wave objects ags (1.4.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed copy to clipboard in AgsMatrix and AgsDrum ags (1.4.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed playback scope * fixed wrong count of runs and init code in ags_channel.c * minor-fixes ags (1.4.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential SIGSEGV during ags_recall_dssi_run_finalize() * fixed potential SIGSEGV during ags_recall_lv2_run_finalize() * removed redundant code in ags_simple_file.c ags (1.4.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * replaced pa_mainloop_new() by pa_glib_main_loop_new() * minor changes ags (1.4.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsLiveDssiBridge and AgsLiveLv2Bridge notation editor channel mapping ags (1.4.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed restore of AgsPattern * fixed ags_open_file.c to use correct file link * fixed async-safe ags_simple_file_read_machine() ags (1.4.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_apply_synth.c to update rt-template * improved ags_clear_audio_signal.c to update rt-template ags (1.4.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsRecallID:recycling property * improved mutex lookup of rt-safe functions gs (1.4.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor-fixes to updating AGS_AUDIO_SIGNAL_RT_TEMPLATE ags (1.4.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AGS_AUDIO_SIGNAL_RT_TEMPLATE * implemented AgsAudioSignal::rt-template property * improved rt-safe option ags (1.4.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing rt-safe configuration option ags (1.4.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented configuration of AgsThreadPool:max-unused-threads and AgsThreadPool:max-threads * improved ags_performance_preferences_reset() to reset super-threaded scope ags (1.4.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsPreferences to apply conservative default configuration ags (1.4.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * conservative default configuration * fixed SIGSEGV as configuring super-threaded scope audio * fixed SIGSEGV during ags_channel_recursive_cancel() ags (1.4.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed mutex access in ags_apply_bpm.c * fixed crash during ags_recycling_context_reset() and ags_channel_recursive_play_down() * updated gtk-doc related files ags (1.4.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed looped audio signal ags (1.4.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * more-fixes to return from unneeded processing ags (1.4.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed return from unneeded processing ags (1.4.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented rt-safe mode * implemented ags-rt-stream recall * implemented AgsLevel, AgsLevelBox, AgsVLevelBox, AgsHScaleBox and AgsScrolledScaleBox in libags-gui * fixed potential SIGSEGV in ags_devout_pcm_info() ags (1.3.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved use of paned widgets to use GtkViewport ags (1.3.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_notation.c and ags_automation.c to always match timestamp * increased timeouts of functional tests because build environment might have not much power ags (1.3.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed paste only as within defined offset of AgsNotation and AgsAutomation * fixed ags_notation_edit_draw_selection() to use vscrollbar to determine y offset * improved selection to select only within area ags (1.3.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed buffer-overflow in ags_synth_generator.c * improved ags.rc ags (1.3.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible unitialized AgsAudioSignal in AgsApplySynth * fixed all wrong string vector static initializers from char **strv to char *strv[] * fixed arbritary return in drawing functions without destroying cairo_t ags (1.3.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed accessing uninitialized pointer in ags_simple_file.c * fixed cursor positioning in AgsAutomationEditor * improved position labels of AgsNotationToolbar and AgsAutomationToolbar * updated ags_notation_test_find_near_timestamp() and ags_automation_test_find_near_timestamp() * minor-fixes in ags.rc ags (1.3.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented 4 paste modes of notation and automation editor * implemented AgsScale, AgsScaleBox, AgsVScaleBox, AgsHScaleBox and AgsScrolledScaleBox in libags-gui * implemented segmented automation * refactored AgsAutomationEditor * extended chap1.xml added sections about AgsMainLoop and common interfaces * extended all chapters to provide code tag to functions and added parameter types * fixed direct callback connect from libags-audio in ags_notation_editor.c * fixed missing callback AgsMachine::resize-audio-channels connect in ags_notation_editor.c ags (1.2.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_channel_get_level() * implemented ags_channel_recursive_reset_recall_id() * implemented ags_channel_recursive_init() * implemented ags_channel_recursive_run() * implemented ags_channel_recursive_cancel() * refactored ags_channel_recursive_play_init() * refactored ags_channel_recursive_play() * refactored ags_channel_recursive_play_threaded() * refactored ags_channel_recursive_reset_recall_ids() * improved ags_channel_set_recycling() * improved ags_channel_recursive_reset_recycling_context() ags (1.2.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * disable fatal mask * minor fixes ags (1.2.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential SIGSEGV due to NULL pointer dereference in ags_append_audio.c task ags (1.2.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor-fixes ags (1.2.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed SIGSEGV in ags_channel_set_recycling() and make ags_functional_machine_link_test pass * rollback ags_channel_recursive_play_init(), ags_channel_recursive_play() and ags_channel_tillrecycling_cancel() ags (1.2.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented async message AgsConnection:data-object and AgsAudioConnection:mapped-line * implemented ags_audio_disconnect() * improved thread-safety to AgsLine:channel and AgsEffectLine:channel properties * improved thread-safety AgsPatternBox and AgsCellPattern * improved thread-safety all audio tasks * improved thread-safety during ags_channel_set_link() and related * improved thread-safety during ags_channel_recursive_play_init() and related * improved thread-safety during ags_channel_recursive_cancel() * improved tasks which need to lock audio especially using AgsCropNote and AgsMoveNote * fixed change soundcard task since data-object was resetted for all connections * fixed AgsMoveNote and AgsCropNote to support segmented notation * fixed various NULL pointer dereference of mutices * minor-fixes ags (1.2.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed remaining launch callback of AgsTask while destroy AgsMachine * minor-fixes ags (1.2.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsNotationEditor and AgsNotationEdit * replaced AgsEditor by AgsNotationEditor and supporting segmented notation * replaced AgsNoteEdit and AgsPatternEdit by AgsNotationEdit * implemented AgsMessageDelivery and AgsMessageQueue * implemented messages of AgsAudio ::set-audio-channels, ::set-pads and ::done * implemented messages of AgsChannel ::add-effect, ::remove-effect and ::done * implemented AgsPiano and AgsScrolledPiano * implemented AgsDevin * implemented AgsJackDevin * implemented AgsPulseDevin * refactored direct callbacks to UI by replacing with messages * refactored ::set-audio-channels and ::set-pads of AgsAudio callbacks to be thread-safe * disabled AgsGuiThread synchronization with AgsTaskThread * extended AgsJackServer and AgsJackClient to support AgsJackDevin * extended AgsPulseServer, AgsPulseClient and AgsPulsePort to support AgsPulseDevin * extended AgsSwitchBufferFlag and AgsClearBuffer to support AgsDevin, AgsJackDevin and AgsPulseDevin * refactored AgsNotebook to be generic and move to libags-gui * improved ags-play-notation to support segmented notation * improved ags-record-midi to support segmented notation * improved ags-route-dssi to support segmented notation * improved ags-route-lv2 to support segmented notation * improved AgsSimpleFile to support segmented notation * fixed missing any_signal:: prefix of strings passing as pspec to g_object_disconnect() * use $(docdir) in Makefile.am ags (1.1.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * moved GtkStyle allocation to GtkWidget::realize() * fixed potential infinite loop during audio port related automation * fixed ags.rc * increased AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS ags (1.1.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing style initializer of some widgets ags (1.1.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added support for ALSA default device * modified functional tests to use default device * modified ags_devout.c to apply device identifier fixup * minor bug-fixes ags (1.1.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_synth_generator_compute_extended() to deal with x <= 0.0 using floor() * fixed if-statements in ags_synth_generator_compute_extended() not to do array index excess ags (1.1.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_synth_generator_compute_extended() to deal with x <= 0.0 ags (1.1.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_cancel_audio_new() to use properties * fixed ags_set_samplerate_new() to use properties ags (1.1.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed SIGSEGV in ags_synth_generator_compute_extended() because NULL pointer dereference * fixed SIGSEGV in ags_oscillator.c caused by wrong assigned array index ags (1.1.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_synth_generator_compute_extended() * implemented AgsSynthGenerator:delay property * implemented needed properties of AgsApplySynth in order to use ags_synth_generator_compute_extended() * implemented AgsPositionNotationCursor * implemented AgsPositionAutomationCursor * refactored AgsApplySynth to use ags_synth_generator_compute_extended() * refactored ags_syncsynth_update() and ags_synth_update() to apply triple sync * refactored AgsOscillator to have triple sync * refactored AgsOscillator persistence in ags_simple_file.c * refactored ags_oscillator_disconnect() to use g_object_disconnect() * fixed possible SIGSEGV due to AgsXorgApplicationContext::dispose() as not using property in ags_start_soundcard_new() ags (1.0.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * extended documentation of libags and libags-audio to have comments for enums * fixed missing xinclude ags (1.0.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing ags-prepare recall related gtk-doc * fixed all interfaces to name inherited type field ginterface instead of interface * fixed gtk-doc fixup to do sed using globbing * fixed following additional / by gtk-doc fixup ags (1.0.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible SIGSEGV in ags_synth_generator_compute_with_audio_signal() * fixed missing includes of stdlib.h * fixed user's handbook removed unneeded column in tables ags (1.0.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added missing screenshots to tarball ags (1.0.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved max-precision configuration preferences to proper reset * improved ags_notebook_size_request() to always use -1 as requisition width * improved AgsRampAccelerationDialog to use 2 digits after decimal point * improved AgsSelectAccelerationDialog to use 2 digits after decimal point * extended user's manual and replaced all screenshots * added section "Envelope editor" to chapter 2 * added section "Envelope info" to chapter 2 * added section "Envelope pattern" to chapter 2 * added section "Move notes" to chapter 3 * added section "Crop notes" to chapter 3 * added section "Select notes" to chapter 3 * added section "Select acceleration" to chapter 5 * added section "Ramp acceleration" to chapter 5 * updated gtk-doc related Since field to have value 1.0.0 * fixed missing ags.rc entries of AgsSelectNoteDialog, AgsMoveAccelerationDialog, AgsSelectAccelerationDialog and AgsRampAccelerationDialog ags (1.0.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented :thread-pool property of AgsReturnableThread * implemented :max-precision of AgsThread * implemented configuration option of thread's max-precision property * implemented sticky controls * improved LV2UI plugin support to set controls value * fixed wrecked widget allocation of AgsEditor and AgsAutomationEditor ags (1.0.0-beta) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsPasswordStore and AgsAuthentication interfaces * TODO:JK: implemented destroy functions * TODO:JK: implemented iterator and recycling thread * TODO:JK: implemented AgsAbstractBasePluginManager * TODO:JK: implemented AgsPluginFactory * TODO:JK: implemented missing interface functions of AgsConnectable, ... * TODO:JK: implemented MIDI and sequencer API * TODO:JK: refactored AgsLadspaManager, AgsDssiManager, AgsLv2Manager and AgsLv2uiManager to inherit of AgsAbstractBasePluginManager * TODO:JK: extended AgsSoundProvider interface to provide plugin managers * extended AgsServiceProvider interface to provide managers ags (0.9.29) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsRampAccelerationDialog * implemented AgsSelectAccelerationDialog * implemented AgsSelectNoteDialog * improved functional-tests.mk to solve linker issue with circular dependency * improved unit-tests.mk to linker issue with circular dependency * added AGS_RECALL_RUN_FIRST and AGS_RECALL_RUN_LAST flags * fixed ags_turtle_load() buffer index excess * fixed ags_functional_note_edit_test.c array index excess in main() * fixed double free of string in ags_lv2_browser_plugin_uri_callback() ags (0.9.28) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsGuiThread minimum sync count with AgsTaskThread ags (0.9.27) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved conversion to floating point numbers by division instead of multiplication ags (0.9.26) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * non-destructive soundcard/sequencer preferences notify about restart GSequencer * removed all calls to gdk_threads_enter() and gdk_threads_leave() because the GSource it is synced with owns the lock. * full gtk_main() support by calling ags_gui_thread_do_run() * refactored ags_gui_thread.[ch] * refactored functional tests to run with gtk_main() ags (0.9.25) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved JACK latency but may cause bigger load ags (0.9.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented core-audio related code but without MIDI instrument support * refactored UI to schedule tasks by AgsGuiThread * fixed memory-leaks related to cairo_t * improved plugins search path you may now specify by environment variable ags (0.9.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible SIGSEGV as accessing removed soundcard or midi sequencer ags (0.9.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * trick pulseaudio pass to pa_stream_begin_write() n_bytes 0 ags (0.9.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved pulseaudio restart stream ags (0.9.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved pulseaudio eliminate feedback ags (0.9.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * provide quadratic and practical icon size * improved pulseaudio underflow detection * fixed pulseaudio non-initialized value might be a buffer-overflow ags (0.9.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags-oscillator-list restore failed due to typo ags (0.9.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed read of not finished write buffer during export audio file * fixed AgsExportWindow file exists response * fixed AgsExportWindow dead-lock during cancel of not existing playback * improved gsequencer.desktop to provide png file ags (0.9.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * provide context menu ags (0.9.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved gtk-doc installation and introduced fix-local-html and fix-online-html target * fixed missing check for NULL of gtk_combo_box_text_append_text() parameter in all source code * fixed missing LV2_UI cleanup handling * fixed missing pulseaudio backend in AgsExportSoundcard ags (0.9.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_pulse_port_get_latency() * improved throughput of pulseaudio by timed cond on stream request callback * fixed possible SIGSEGV as ags_channel_reset_recall_id() ags (0.9.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags_devout_adjust_delay_and_attack() and related * improved AgsPulsePort to omit polling thread twice * fixed missing volatile of AgsPollingThread's flags * fixed destroy machine crash during playback ags (0.9.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added mutices to AgsJackServer and AgsPulseServer * fixed memory leaks of mutices in AgsPulseClient, AgsJackClient, AgsPulsePort and AgsJackPort * fixed wrong parent class of dispose in ags_pulse_server.c and ags_jack_server.c * fixed data-race during playback termination in ags_pulse_devout_port_free() * fixed ags_application_context initialization if NULL (note might be reverted, soon) ags (0.9.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing initial configuration of pulseaudio * improved throughput of pulseaudio by using maxlength of stream -1 * improved clear buffer task to let ring-buffer being valid longer ags (0.9.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_pulse_server.c, ags_pulse_client.c and ags_pulse_port.c * implemented ags_pulse_devout.c * refactored AgsSoundcardEditor to work with pulseaudio, too * fixed memory leak related to mutex and its attributes for AgsDevout, AgsMidiin, AgsJackDevout and AgsJackMidiin * fixed missing paranthesis to check flags in ags_devout.c, ags_midiin.c, ags_jack_devout.c and ags_clear_buffer.c ags (0.9.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_input_apply_synth() and ags_input_apply_synth_extended() * fixed ags_syncsynth_reset_loop() to use attack to calculate loop upper * fixed ags_recall_container_find() and its flags to enumerate correctly * fixed ags_thread_pool_creation_thread() to check parent for NULL * enabled unit-test ags_input_test.c because not tested * new unit-test ags_midiin_test.c * new unit-test ags_output_test.c * new unit-test ags_playback_domain_test.c * new unit-test ags_playback_test.c * new unit-test ags_preset_test.c * new unit-test ags_recall_channel_test.c * new unit-test ags_recall_channel_run_test.c * new unit-test ags_recall_container_test.c * new unit-test ags_recall_dependency_test.c ags (0.9.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented pass base-note to AgsApplySynth * fixed missing base-note, audio-loop-start and audio-loop-end while read/write XML * fixed missing attack as calculating stream size * fixed ags_synth_util_get_xcross_count() and related functions ags (0.9.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_lv2_option_manager_lookup_extended() * implemented ags_lv2_plugin_event_buffer_alloc() * implemented ags_lv2_plugin_event_buffer_realloc_data() * implemented ags_lv2_plugin_event_buffer_concat() * implemented ags_synth_util_get_xcross_count() and related type specific implementations * implemented ags_synth_generator_compute() * implemented ags_synth_generator_compute_with_audio_signal() * deprecated ags_lv2_plugin_alloc_event_buffer() * deprecated ags_lv2_plugin_concat_event_buffer() * implemented ags_lv2_urid_manager_unmap() * implemented AgsSyncsynth in order to have true notation available to a synth * implemented ags_synth_generator_compute() * implemented ags_synth_generator_compute_with_audio_signal() * refactored AgsOscillator in order to be reusable * refactored AgsApplySynth task to use new synth generator functions * completed missing gtk-doc comments in ags_input.c and other files * fixed AgsExportSoundcard to don't add device as being NULL * fixed ags_lv2_option_manager_get_option() to lookup correctly * fixed ags_lv2_option_manager_set_option() to lookup correctly * new unit-test ags_lv2_option_manager_test.c * new unit-test ags_lv2_plugin_test.c * new unit-test ags_lv2_preset_test.c * new unit-test ags_lv2_uri_map_manager_test.c * new unit-test ags_lv2_urid_manager_test.c * new unit-test ags_lv2_worker_manager_test.c * new unit-test ags_lv2ui_manager_test.c * new unit-test ags_lv2ui_plugin_test.c * new unit-test ags_audio_connection_test.c * disabled new unit-test ags_input_test.c because not tested ags (0.9.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented new task AgsResetPeak * implemented ags_audio_buffer_util_peak() and related * refactored ags-peak recall to use above and compute only as needed ags (0.9.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed memory leak related to mutex attributes * fixed deny multi-start of AgsChannelThread or AgsAudioThread * fixed deny multi-stop of AgsChannelThread or AgsAudioThread * minor code improvements ags (0.9.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed many missing return values * fixed some unitialized pointers * fixed 64 bit portability issue in ags_recall_template_find_all_type() ags (0.9.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unitialized pointer in AgsCellPattern and AgsPatternBox animation ags (0.9.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible concurrent access in ags-peak related code * fixed led array related bug that didn't show animation of AgsCellPattern and AgsPatternBox ags (0.9.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash after drum restore and doing sequencer playback ags (0.9.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible concurrent access in ags_cell_pattern.c * fixed finalize to call parent class of managers * fixed finalize to reset global variable after finalize of managers * fixed g_list_position() call to have nested g_list_find() in ags_polling_thread.c * fixed missing return in ags_destroy_entry_alloc() * fixed AGS_TASK_GET_CLASS() macro to remove not opened paranthesis * fixed ags_thread_init() to correct assign condition manager * fixed AGS_FILE_CHECKSUM_LENGTH macro to use string representation length * fixed missing serialization of thread frequency * fixed missing return of ags_file_write_thread() * extended chap3.xml to include documentation about workers * extended chap3.xml to include documentation about poll fds * extended chap3.xml to include documentation about mutex and condition manager * provide new prototypes in ags_notation.c and ags_note.c to work with SMF * new unit-test ags_complex_test.c * new unit-test ags_turtle_manager_test.c * new unit-test ags_log_test.c * new unit-test ags_application_context_test.c * new unit-test ags_connection_manager_test.c * new unit-test ags_config_test.c * new unit-test ags_condition_manager_test.c * new unit-test ags_mutex_manager_test.c * new unit-test ags_destroy_worker_test.c * new unit-test ags_polling_thread_test.c * new unit-test ags_poll_fd_test.c * new unit-test ags_returnable_thread_test.c * new unit-test ags_task_test.c * new unit-test ags_thread_pool_test * new unit-test ags_worker_thread_test * new unit-test ags_file_test * new unit-test ags_file_id_ref_test * new unit-test ags_file_launch_test * new unit-test ags_base_plugin_test.c * new unit-test ags_dssi_plugin_test.c * new unit-test ags_dssi_manager_test.c * new unit-test ags_ladspa_manager_test.c * new unit-test ags_lv2_manager_test.c * new unit-test ags_note_test.c * new unit-test ags_acceleration_test.c ags (0.8.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed orphaned AgsAudio after removing all soundcards to add again ags (0.8.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented move note task * implmeneted crop note task * implemented all task's finalize function * improved all task's to use properties to instantiate ags (0.8.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsMoveNoteDialog as additional editing tool * implemented AgsCropNoteDialog as additional editing tool * implmeneted missing ags_toolbar_disconnect() function ags (0.8.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsEnvelopeInfo plot * enable grid lines of tree view * added property AgsMachine:machine-name and thus did a small refactoring ags (0.8.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags-envelope to apply ratio * fixed various issues related to AgsEnvelopeDialog ags (0.8.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsPreset applicable to line ranges and store parameters * implemented to persist AgsLiveDssiBridge and AgsLiveLv2Bridge * implemented to store presets in AgsSimpleFile * extended ags-copy-pattern to use preset scope ags-envelope * extended AgsEnvelopeDialog to support presets and apply to pattern * improved ags-envelope to read frame count once ags (0.8.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsAddSoundcardEditor and AgsAddSequencerEditor dereference to wrong type * fixed not showing AgsPad as resize from 0 * fixed crash in AgsMeter as resize to 0 * fixed resize of AgsNotebook in AgsPatternEdit and AgsNoteEdit related resize to/from 0 * fixed shrink of AgsNotebook in AgsAutomationEdit ags (0.8.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsMidiParser to don't skip length of status messages * fixed libags-audio.h to not include removed header * fixed Makefile.am to use correct symlink of gtk-doc ags (0.8.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved ags.rc to support AgsMidiExportWizard and AgsMidiImportWizard * improved ags.rc to provide better color of active text * improved Makefile.am * added gettext support ags (0.8.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * optional libinstpatch dependency * implemented AgsEnvelopeDialog * refactored ags-envelope recall to use AgsComplex fields of AgsNote * added AgsEnvelopeDialog to AgsDrum, AgsMatrix, AgsDssiBridge and AgsLv2Bridge * added ags-envelope recall to ags_recall_factory.c * fixed unavailable AgsMidiDialog as doing delete-event * fixed functional test timed access to widget ags (0.8.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented MIDI import tracks * implemented MIDI export tracks * fixed AgsMidiBuilder serious problems * fixed ags_midi_buffer_util_seek() * fixed AgsMidiParser using wrong tempo and time signature allocation * fixed ags_midi_buffer_util.c same issue as above with tempo and time signature ags (0.7.136) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved performance of AgsGuiThread to consume less power * improved AgsMidiin to don't poll anymore in dedicated thread * improved AgsLog to have a mutex and use it during splash-screen ags (0.7.135) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented Lv2 program interface * implemented ags-play-dssi and ags-play-lv2 recall * implemented AgsLiveDssiBridge and AgsLiveLv2Bridge * fixed non-interleave lv2 audio data processing * support NULL input ags (0.7.134) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * merge stable * ? ags (0.7.133) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing reset of connection editor field of machine * fixed wrong subtract one of audio channels in bulk connection * fixed configuration to clear old config * fixed soundcard editor pcm info fails if soundcard busy, use default values ags (0.7.132) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented seperator within AgsLine and AgsEffectLine * implemented seemless mode of AgsDial * improved theme, dial style to have dark background ags (0.7.131) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented output listing editor to assign soundcard * improved theme and disable option ags (0.7.130) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved stability ags (0.7.129) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags-simple.xsl * improved mutices in ags_pad_play() and ags_line_channel_done_callback() * fixed missing persisting of machine name ags (0.7.128) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsLv2OptionManager * implemented passing options for AgsRecallLv2Run * modified UI to show visualization widgets for plugin output ports * modified ags-peak, ags-volume and ags-mute recalls to use float ports * disabled loading automation of output ports * fixed buggy code in ags_machine_selector_remove_index() by a work-around has a need for refactoring ags (0.7.127) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented LV2UI related code to do idle and show interface * improved splash picture to refresh frequently ags (0.7.126) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved mutices for recalls * improved AGS_THREAD_INTERMEDIATE_POST_SYNC * disabled ags_main_loop_interrupt() in ags_jack_client_process_callback() ags (0.7.125) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash in ags_jack_midiin_port_free() NULL pointer access * improved mutices doing playback ags (0.7.124) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed asynchronous ALSA output by incrementing ring-buffer size * fixed proper use of ppoll() with AgsDevout prior events wasn't set * implemented wait playback until device is available with AgsDevout * implemented AgsClearBuffer task * refactored AgsDevout and AgsJackDevout to use AgsClearBuffer task ags (0.7.123) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed distorted sound by clearing buffer that just was memcpy to ring buffer ags (0.7.122.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed NULL input * fixed non-interleaved Lv2 audio data ags (0.7.122.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented missing ags_route_lv2_audio_run_dispose() * fixed in ags-route-dssi use of parent ::finalize() during ::dispose() * fixed switch buffer flag to be done during poll MIDI device ags (0.7.122.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed LIBADD nad LDADD of GSequencer system check automake file ags (0.7.122.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing length of pattern ags (0.7.122.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed automation to use previous value if range doesn't match * added functional test to check editor workflow ags (0.7.122.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsEffectSeparator for AgsLine and AgsEffectLine * removed gtk separator in AgsLine and AgsEffectLine * disabled AgsDestroyWorker ags (0.7.122.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed dead-lock as removing line member * improved plugin browser to reset plugin type * improved the speed of functional tests * added functional test to check line member sanity ags (0.7.122.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsClearAudioSignal task * fixed ags_synth_update() it didn't clear the buffers correctly * added functional test to check link sanity ags (0.7.122.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed memory corruption of AgsFFPlayer destruction * fixed some AgsConnectable::disconnect() of machines * fixed potential infinite loop in ags_machine_resize_audio_channels() * added functional test add and destroy machine * added functional tests resize pads and audio channels ags (0.7.122.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing connect of AgsOscillator * fixed noise creation in AgsSynth * fixed SIGSEGV as adding plugin to AgsLine ags (0.7.122.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented notebook resize in automation editor * fixed NULL pointer dereference in ags_matrix.c * fixed resize pad to distinguish between input and output ags (0.7.122.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * stability improvements ags (0.7.122.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * decoupled gui thread ags (0.7.122.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixes to configuration in place * fixes to audio connection editor ags (0.7.122.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * TODO:JK: implemented ags-play-pattern recall * fixed broken optical feedback of peak * removed auto-scroll feature because it costs too much performance ags (0.7.122.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented non-deterministic mode i.e. performance mode * implemented ags_input_next_active() and ags_input_is_active() * implemented restore and persist of AgsLv2Bridge preset * disabled lv2 worker feature if not requested by plugin * fixed memory leak related to AgsReturnableThread * fixed crash related to notation offset cached * note disabled some signals ags (0.7.122.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored ags-copy recall to instantiate like ags-buffer * implemented LV2 presets * implemented presets in AgsLv2Bridge * implemented ags-prepare recall * implemented AgsConditionManager to use with AgsThread tree lock functions * implemented worker threads * implemented destroy worker * improved AgsDelayAudio port instantiation to use default values * fixed using default values as no soundcard available * fixed crash as no soundcard configured within GUI * fixed AgsThread tree lock functions * added more unit tests in ags_thread_test.c ags (0.7.122.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsHLedArray and AgsVLedArray * implemented missing properties of AgsPlaybackDomain and AgsPlayback * implemented GObject::dispose() * refactored AgsCellPattern and AgsPatternBox to use AgsHLedArray * fixed reference counting of libags, libags_audio * fixed division by zero caused by AgsOscillator * fixed serious memory corruption in ags_pattern_set_dim() * fixed segmentation fault of AgsFFPlayer restore * fixed missing connection menu of AgsLv2Bridge after restore * extended unit tests ags (0.7.122.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * back-ported seemless mode of AgsDial * back-ported Lv2ui support * improved default theme * fixed configuration to use default values as soundcard busy * fixed clear configuration and provide default values as applying ags (0.7.122.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * providing default theme * fixed ags.rc support * fixed cell pattern painting * minor fixes ags (0.7.122.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes ags (0.7.122.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes ags (0.7.122.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * back-ported enable output ports to plugins * back-ported disable output ports on automation * back-ported enable built-in effects to do automation * fixed configuration in-place to reset frequency of appropriate thread * minor fixes ags (0.7.122.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes ags (0.7.122) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented intermediate pre and post sync * refactored interfacing soundcard to do intermediate post sync * refactored interfacing sequencer to do intermediate pre sync * refactored ags_devout.c tightened the code and intermediate post sync * refactored ags_midiin.c intermediate pre sync * improved XPath doing lv2 turtle * fixed stop export and sequencer thread during soundcard stop * fixed ags_start_soundcard_finalize() without configured sequencer crashing * fixed potential dead-lock in ags_midiin_oss_poll() and ags_midiin_alsa_poll() * fixed proper termination of OSS and ALSA poll ags (0.7.121) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Makefile.am to use -p and -m 644 parameter ags (0.7.120) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved Makefile.am use install instead of cp ags (0.7.119) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_export_window_reload_soundcard_editor() * implemented AgsExportSoundcard UI * refactored AgsExportWindow to allow export multiple soundcards * improved mutices in ags_record_midi_audio_run.c * improved mutices in ags_route_dssi_audio_run.c * improved mutices in ags_route_lv2_audio_run.c * fixed ags-audio.h to remove unused headers * fixed AgsSoundcardEditor and AgsSequencerEditor to remove JACK device ags (0.7.118) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed API reference removed unused objects * added COPYING.docs ags (0.7.117) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsAudio:midi-channel * implemented midi channel in AgsMidiDialog * implemented using midi channel in ags-record-midi * back-ported properties of tasks of branch 1.0 * fixed ags-record-midi recall to proper key-on and key-off ags (0.7.116) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_midiin_alsa_poll() and ags_midiin_oss_poll() * fixed possible NULL pointer access in ags_midiin_list_cards() * fixed AgsMidiin to always set nth_buffer during record * fixed in ags_midiin_set_device() to duplicate string and handle OSS4 >>>>>>> master ags (0.7.115) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed copyright statements replaced deprecated * fixed exclude OSS in GUI if not provided ags (0.7.114) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * disabled unused buttons yet * improved ags-record-midi recall ags (0.7.113) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed API docs and updated sections gs (0.7.112) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * providing headers libags.h, libags-audio.h and libags-gui.h * improved API reference ags (0.7.111) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented experimental MIDI support for ALSA, OSS4 and JACK ags (0.7.110) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * critical bug-fix data-race in ags_thread-posix.c resume interrupted threads after AgsAsyncQueue run * implemented ags_thread_reset_all() see above ags (0.7.109) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed data-race of AgsCellPattern and AgsMatrix callbacks ags (0.7.108) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented blacklist of plugins for AgsLadspaManager, AgsDssiManager, AgsLv2Manager and AgsLv2uiManager ags (0.7.107) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_base_plugin_sort() alphabetically plugins by effect name * improved AgsMenuBar to have sorted plugins by effect name see above ags (0.7.106) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsCartesian * fixed case-sensitive iriref in ags_turtle.c * added additional parameter to ags_lv2_manager_load_file() and ags_lv2ui_manager_load_file() in order to provide manifest ags (0.7.105) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsTicSoundcard task and fixed thereby data-race ags (0.7.104) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented splash-screen ags (0.7.103) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_soundcard_get_note_offset_absolute() * improved mutices in ags_navigation.c * fixed possible access of uninitialized memory in ags_cell_pattern_led_queue_draw_timeout() * fixed possible access of uninitialized memory in ags_pattern_box_led_queue_draw_timeout() * simplified seeking ags (0.7.102) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed use AgsSwitchBufferFlag task in ags_jack_client.c ags (0.7.101) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed rounding fault in ags_devout.c and ags_jack_devout.c ags (0.7.100) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed devhelp link to docs use underscore instead of minus * fixed in ags_lv2_plugin.c XPath no .// rather // as expression * improved timing issue as exporting audio data ags (0.7.99) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_turtle_read_langtag() for not being greedy. ags (0.7.98) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixes to ags_turtle.c UTF-8 ranges and other issues * added ags_turtle_test unit test ags (0.7.97) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_midi_buffer_util_test.c using wrong variable * improved test suite to have LC_ALL and LANG set to C ags (0.7.96) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed in ags_midi_buffer_util.c some missing return values and other issues * improved test coverage of ags_midi_buffer_util.c to almost completed ags (0.7.95) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unit test ags_midi_buffer_util_get_song_select() ags (0.7.94) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unit test ags_recall_test_duplicate() to have proper type in callback * extended ags_midi_test.c to provide more unit tests ags (0.7.93) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed automation edit restore from simple file ags (0.7.92) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added unit tests of ags_midi_buffer_util.c * fixed ags_midi_buffer_put_varlength(), it was defunctional * fixed missing check of AgsRecallDssi in ags_channel.c ags (0.7.91) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added unit tests in ags_automation_test.c and ags_recall_test.c * fixed automation toolbar to toggle port correctly and added empty port * fixed ags_midi_buffer_util.c, ags_midi_builder.c and ags_midi_parser.c to conform MIDI specs * NOTE arguments are shifted for MIDI SMTPE related functions ags (0.7.90) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed handle NULL pointer client don't pass it to JACK * back-ported ags_midi_buffer_util.[ch] from 1.0 * back-ported ags_midi_builder.[ch] from 1.0 ags (0.7.89) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash after opening file with unavailable audio file link * improved mutices in ags_editor_tic_callback() ags (0.7.88) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing usage of attack affects BPM * fixed code performance issue in ags-play-notation recall * removed free-wheel within jack client because not supported * modified default buffer size to 1024 ags (0.7.87) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsSoundcardEditor not allowed free of string * fixed ags_soundcard_editor_add_soundcard() ignore AgsJackDevout * fixed ags_soundcard_editor_remove_soundcard() ignore AgsJackDevout ags (0.7.86) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsNotifySoundcard to fast lock AgsSoundcard * implemented cyclic tasks in ags_task_thread_run() * implemented ags_task_thread_append_cyclic_task() * implemented ags_task_thread_remove_cyclic_task() * refactored ags_thread-posix.c to set AgsThread->tic_delay to be reset synced ags (0.7.85) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsThread detach thread if not running while finalize * fixed AgsReturnableThread is not detached by default * fixed detach thread as calling AgsThread::stop() ags (0.7.84) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong type of ags_recycling_context_new()'s function argument * fixed integer overflow in ags_channel.c while allocating AgsRecyclingContext ags (0.7.83) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential infinite-loop * fixed race-condition as resizing audio channels and pads within gui thread ags (0.7.82) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_playable_read_audio_signal() without resampling frame count ags (0.7.81) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed not negated if condition in ags_ladspa_manager_get_filenames() * fixed non-synth lv2 plugins accessing NULL pointer ags-count-beats recall * fixed potential NULL pointer access in ags_recall_lv2_run_finalize() * fixed AgsRecallLv2Run to have :run-inter() for non-synths * fixed AgsRecallLadpsaRun, AgsRecallDssiRun and AgsRecallLv2Run to use correct copy mode * implemented ags_audio_buffer_util_clear_buffer() ags (0.7.80) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed restore of AgsBulkMember toggle button ags (0.7.79) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed potential NULL pointer access in ags_recycling_create_audio_signal_with_frame_count() ags (0.7.78) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_audio_file_write() to have additional format parameter * fixed potential NULL pointer in ags_audio_file_write() ags (0.7.77) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsCellPattern to shrink vertical scrollbar in AgsMatrix * fixed AgsMidiDialog reset * improved clear JACK buffer during no playback ags (0.7.76) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed sample selection of AgsIpatch * improved open multi-channel samples in ags_ffplayer_callbacks.c ags (0.7.75) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed synth generator * fixed ags_recall_find_all_type() ags (0.7.74) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_midi_buffer_util_put_varlength() to encode multi-byte properly * reverted AgsThread frequency * added additional parameter to ags_ladspa_manager.c to pass instance * added additional parameter to ags_dssi_manager.c to pass instance * added additional parameter to ags_lv2_manager.c to pass instance * added additional parameter to ags_lv2ui_manager.c to pass instance * improved AgsFFPlayer to resize audio channels * fixed relevant clang scan-build errors ags (0.7.73) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed removed types of libags_gui.types of gtkdoc * fixed return value to be void * of ags_stream_alloc() * fixed ags_audio_set_pads() to shrink correctly * improved ags_recycling_create_audio_signal_with_frame_count() to reduce overhead * improved JACK synchronization ags (0.7.72) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed configuration ags (0.7.71) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed restore JACK from file ags (0.7.70) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed most compiler warnings ags (0.7.69) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor fixes to API removed non-existing symbols and alike * added symbols file libags.sym, libags_audio.sym and libags_gui.sym ags (0.7.69) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed stop all soundcard threads because only one was stopped ags (0.7.68) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed close JACK client while ags_application_context_quit() * fixed configure.ac to check for atk-1.0 with AC_CHECK_LIB * fixed add/remove soundcards using AgsAudioPreferences * modified on file open failure to call ags_application_context_quit() instead of exit(-1) because JACK needs clean-up * improved configure.ac to give hint that ALSA and OSS is enabled * added --enable-oss argument to configure.ac ags (0.7.67) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing soundcard info of ags-sf-line * updated ags_simple_file.dtd ags (0.7.66) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed chrash while reading configuration with AgsSimpleFile * fixed persisting/restore of AgsSoundcard from configuration with AgsSimpleFile ags (0.7.65) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented JACK audio output support * implemented configuration of multiple soundcard support * implemented AgsAudioSettings to configure your soundcards * implemented AgsConnectionEditor to assign your soundcards * implemented ags_jack_devout.c missing functions ags_jack_devout_list_cards() and ags_jack_devout_pcm_info() * implemented ags_jack_devout.c adjusting pcm channels * implemented ags_time_get_uptime_from_offset() * implemented AgsConnectionManager and AgsConnection * implemented AgsAudioConnection to assign ressources to channels * implemented ags_jack_server_connect_client() to connect at an arbitrary time * implemented AgsChangeSoundcard task to reset AgsAudioConnection * implemented AgsAddSoundcard and AgsRemoveSoundcard task * implemented resampling in ags-buffer, ags-copy and ags-play recalls * refactored configuration access and minor fixes to it * refactored AgsAudioPreferences to use AgsAudioSettings * refactored AgsAudioApplicationContext and AgsXorgApplicationContext to load multiple soundcards * extended AgsAudio to use AgsAudioConnection * extended AgsChannel to use AgsRemoteChannel * minor-fixes caused accessing NULL pointers ags (0.7.64) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented OSS support ags_devout_oss_init(), ags_devout_oss_play() and ags_devout_oss_stop() * implemented OSS part of ags_devout_get_poll_fd() and ags_devout_get_pcm_info() * fixed potential dead-locks in ags_devout.c * fixed string format in ags_devout.c * replaced ALSA MIDI decoder with ags_midi_buffer_util_decode() * added library completion routines ags_strv_contains() and ags_strv_length() * improvded configure.ac to partially disable ALSA support ags (0.7.63) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible NULL pointer access caused by ags_audio_application_context.c and ags_xorg_application_context.c * fixed possible dead-lock in ags_play_audio_signal.c * fixed format configuration issues in ags_audio_signal.c * fixed ags_functional_audio_test.c * fixed ags_audio_test.c * fixed ags_channel_test.c * fixed ags_notation_test.c * fixed ags_pattern_test.c * fixed ags_recycling_test.c * fixed ags_thread_test.c * improved ags_devout.c to not allow set non-existing soundcard except default hw:0 ags (0.7.62) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved build system * improved ags_functional_audio_test.c to provide configuration ags (0.7.61) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed build system ags (0.7.60) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed spelling error unknow to unknown * fixed underscore to score of installation directories * modified libgsequencer to be private ags (0.7.59) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed package name in .pc files ags (0.7.58) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * split API reference ags (0.7.57) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * relicensed docs to be GFDL+3 without invariant sections ags (0.7.56) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Makefile.am to install libags-1.0.pc * improved developer manual * improved set AgsApplicationContext's instance in gsequencer_main.c * implemented timestamp property of AgsAutomation * implemented ags_thread_add_start_queue() and ags_thread_add_start_queue_all() ags (0.7.55) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash on missing poll descriptor * fixed first connect and then reset AgsPreferences in order to get valid configuration * improved error setting and handling in ags_devout_alsa_init() handling now wrong configuration * disabled Lv2 context menu of AgsMachine * added libags.pc.in file ags (0.7.54) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing addition of overclock value of soundcard in ags_simple_file.c * fixed wrong sequencer duration calculated by wrong delay now it gets it of AgsSoundcard * fixed use of uninitialized value in ags_cell_pattern.c and ags_pattern_box.c * fixed persist virtual audio and midi mapping * fixed reset buffer-size and samplerate of AgsAudio as setting AgsSoundcard * fixed default frequency of AgsAudioThread and AgsChannelThread * implemented character ring-buffer in ags_devout.c * implemented to interrupt AgsLv2Worker thread * implemented time_late field of AgsThread and thereby reduced distortion * updated ags_simple_file.dtd in order to enable midi mapping ags (0.7.53) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed readjust delay as modify buffer size or samplerate of soundcard * fixed tempo divide delay by 16.0 and corrected bpm calculation * implemented ags_soundcard_get_uptime() * implemented ags_cell_pattern_led_queue_draw_timeout() and ags_pattern_box_led_queue_draw_timeout() ags (0.7.52) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed resetting buffer size and samplerate because threads might not have been added to the tree, yet * implemented midi mapping of DSSI and Lv2 synths ags (0.7.51) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed freed overwritten temporary string in ags_set_output_device.c * fixed reset frequency of main loop in ags_apply_presets.c ags (0.7.50) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_polling_thread.[ch] and ags_poll_fd.[ch] * implemented ags_soundcard_get_poll_fd() and ags_soundcard_is_avialable() * using AgsPollingThread in ags_soundcard_thread.c and ags_gui_thread.c * fixed use of freed string in ags_audio_preferences.c as apply soundcard * improved priorities ags (0.7.49) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed data-race of resetting soundcard device and apply presets * improved API reference manual * deleted ags_perform_automation_audio.[ch] and ags_perform_automation_audio_run.[ch] because it is not needed, see AgsRecall::automate ags (0.7.48) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed restart soundcard playback as doing ags_apply_presets_launch() * implemented AgsNote in AgsAudioSignal * improved gtk-doc related files ags (0.7.47) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * modified Makefile.am to use -Wformat and -Werror=format-security * modified Makefile.am to include docs/images/ags_automation_window_dssi_xsynth.png * fixed format security errors ags (0.7.46) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsMainLoop::interrupt and AgsMainLoop::monitor * implemented AgsThread::interrupted and use it in ags_gui_thread.c * implemented ags_audio_loop_timing_thread() to emit AgsMainLoop::interrupt * fixed configuration in place of AgsSynth and AgsFFPlayer by using AgsSynthGenerator repectively AgsAudioFileLink * fixed AgsTactable signals to be emitted * fixed configuration in place to reset thread frequency * added thread posix signals to AgsGuiThread ags (0.7.45) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented resetting samplerate, buffer size and format. Thus added properties to AgsAudio and AgsChannel. * implemented ags_audio_file_check_suffix() and ags_ipatch_check_suffix() * implemented ags_input_open_file() * implemented soundcard property of AgsIpatch * implemented preset, instrument and sample property of AgsAudioFileLink * implemented AgsSynthGenerator and ags_synth_util.c * implemented copy functions in ags_audio_buffer_util.c * implemented AgsApplyPresets recall * refactored replacing template AgsAudioSignal as adding new template * improved mutices in ags_audio_open_files() * fixed ags_devout_realloc_buffer() to use pcm_channels instead of dsp_channels ags (0.7.44) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing parsing of alsa-handle key of configuration within AGS simple file * fixed AgsExportThread JIFFIE and AGS_THREAD_START_SYNCED_FREQ flag * fine-tuned performance and thus providing some fixes ags (0.7.43) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags-count-beats recall to ommit tics * fixed timing issue of toplevel AgsThread limit nanosleep() to band * fixed missing read of config values in ags_soundcard_thread() to calculate its frequency * improved ref/unref AgsAudioSignal because it wasn't properly done * modified ags_recall_recycling.c to not cache AgsAudioSignal * modified default frequency to 1000 Hz and buffer size of 512 ags (0.7.42) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed dead-lock caused by adjusting buffer size or samplerate as reading config from file * fixed really bad memory leak during playback of audio signal on AgsInput because of missing g_object_unref() * fixed ags_notation_test.c - it crashed because of wrong data type for ags_note_new_with_offset() * implemented properties of AgsNote ags (0.7.41) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ommiting delayed playback in ags_play_notation_audio_run.c * fixed crash during load of lv2 directories without manifest.ttl * fixed don't queue draw destroyed widgets * fixed remove audio from soundcard as destroying AgsMachine * fixed crash during playback after destroy of AgsMachine NOTE: see below * NOTE: you have to do proper clean the audio tree ags (0.7.40) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed zero-length notes in ags_note_duplicate() and return NULL * fixed negative-length notes in ags_note_duplicate() by swapping x values * fixed encoding special char of strings in ags_turtle.c * fixed AgsNotebook fixed width to resizeable * fixed use of previous value on reenter loop in automation * improved regexp to read string literals in ags_turtle.c * improved AgsLineMember and AgsBulkMember to escape their strings * implemented resize of AgsNotebook previously it was fixed size * implemented abort on not present plugin during file open since you will damage your file ags (0.7.39) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsLv2Worker to return from AgsReturnableThread * fixed some memory leaks in ags_recall_lv2_run.c * fixed annoying painting mistake in ags_meter.c missing padding caused ugly effect on top * fixed AGS_MACHINE_SELECTOR_SHOW_REVERSE_MAPPING and AGS_MACHINE_SELECTOR_SHOW_SHIFT_PIANO are removed from ags_automation_editor.c because it is not supported * improved AgsThreadPool to take from the end of the list because previously it took the ones just instantiated ags (0.7.38) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed remove of effects because refactoring broke it * fixed remove of automation as removing effect because before it was left there * fixed remove automation as shrink audio channels or pads * fixed XPath and xmlNode names of turtles to lower-case * fixed XPath expressions in ags_lv2_plugin.c to access plugin correctly because it returned all plugins instead of one * implemented update automation editor on add/remove effect look at ags_automation_editor_reset_port(), it is new * implemented prefix of AgsNotebook now for automation line and notation channel * added mutices to ags_toolbar.c ags (0.7.37) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed infinite loop in ags_automation_editor.c - line = line++ * fixed restore of controls * fixed AgsNavigation set bpm * fixed missing length of AgsDrum and AgsMatrix * optimized XML file output ags (0.7.36) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash in ags_recycling_create_audio_signal_with_frame_count() because premature end wasn't handled * fixed dead-lock caused by AgsNavigation callbacks * fixed missing AgsThreadPool for AgsLv2WorkerManager in ags_setup() * fixed unlock libinstpatch mutices in ags_ipatch.c because else ending in dead-lock * fixed looped AgsRecallDssiRun and AgsRecallLv2Run * improved AgsLadspaBrowser and AgsLv2Browser to not load default directory every time ags (0.7.35) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed clip-board by merging values since automation ports can occur multiple times * fixed map width of automation editor * fixed clipped selection * fixed reset automation editor position * fixed ruler widget because the previous code obviously did wrong use of ceil() * fixed translate values in automation editor * fixed line member editor hide bulk * fixed not available line member port it was broke because of refactoring * implemented Atk interfaces in ags_automation_edit.c * implemented selection of automation editor * implemented ags_soundcard_get_loop(), ags_soundcard_set_loop() and ags_soundcard_get_loop_offset() * improved loop mode * improved AgsPad mutices in ags_pad_init_channel_launch_callback() * improved remove line effect and effect line effect * improved remove effect bulk effect * improved ags_channel_remove_effect() to work with LADSPA and Lv2 because it was only usable with LADSPA * added mutices automation editor * added missing mutices to ags_navigation_callbacks.c * added mutices in ags_effect_bulk.c * added mutices in ags_line.c and ags_effect_line.c ags (0.7.34) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed disapearing automation caused by missing tact factor appliance * fixed y value in ags_automation.c to gdouble because it was y previously * fixed missing souncard identifier in audio preferences * improved remove of notes by specify number of attempts until giving up * implemented cursor in automation editor * implemented copy, cut and paste in AgsAutomationEditor * implemented key-strokes in ags_automation_edit_callbacks.c * introduced new config key disable-feature because you don't want experimental code in production ags (0.7.33) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * using AgsConversion in ags_line_member.c and ags_bulk_member.c if available * using bypass flag in ags_recall_audio_automate() and ags_recall_channel_automate() * using AgsConversion in automation editor * implemented reset of AGS_AUTOMATION_BYPASS in automation toolbar ags (0.7.32) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed remove of menu after rename of AgsMachine * fixed update editor and automation editor after rename * fixed automation data * fixed missing XPath preamble of automation editor's machine radio button * fixed NULL pointer access in ags_automation_toolbar_apply_port() * implemented save/restore of ports within automation editor ags (0.7.31) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed automation editor drawing while setting value with a different lower bound than 0.0 * fixed setting value on AgsAcceleration likewise above * fixed freed name string of AgsMachine * optimized drawing of values by ommiting already drawn values within AgsAutomationArea ags (0.7.30) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented loading automation ports of LADSPA, DSSI and Lv2 plugins * implemented adding automation data * implemented removing automation data ags (0.7.29) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_audio_set_audio_channels() to do proper setup * fixed ags_lv2_bridge_set_audio_channels() and ags_dssi_bridge_set_audio_channels() to iterate correctly * fixed show of newly created AgsLine as calling ags_machine_resize_audio_channels() * fixed scroll of AgsNotebook ags (0.7.28) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed worst memory leaks * refactored gsequencer_main.c because it was a mess * refactored peak callback to use g_timeout_add() giving better performance * improved timer support * provided example file ags (0.7.27) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed format string ags (0.7.26) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * removed wrong envelop information from notation in ags_simple_file.c * fixed Makefile.am to include aclocal.m4 ags (0.7.25) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsLadspaBridge, AgsDssiBridge and AgsLv2Bridge restore from XML * implemented AgsSimpleFile which is much faster than AgsFile * implemented AgsSimpleFileRead task for reading files using simple API * implemented AgsSimpleFileWrite task for writing files using simple API * implemented AgsSimpleAutosaveThread that makes use of AgsSimpleFile to save its files * implemented :control_type_name parameter of ags_line_add_effect() * fixed duplicated entries in plugins manager: AgsLadspaManager, AgsDssiManager and AgsLv2Manager ags (0.7.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Makefile.am to include entire documentation and having a build * fixed ags_config.c to use working default values ags (0.7.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed proper license information and notes in README * included ags_marshallers.list in tarball ags (0.7.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_update_bulk_member.c to work with DSSI and improved the code * fixed Lv2 playback * fixed Lv2 atom sequence type and Lv2 atom body access in ags_lv2_plugin.c ags (0.7.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented support for integer adjustments of LADSPA, DSSI and Lv2 * improved configure.ac * fixed DSSI playback and bank selection * fixed finding AgsBulkMember ports ags (0.7.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed proper version information of *.so, *.a and *.la * fixed version information in --version to use AGS_VERSION macro * improved ags_dial.c by clearing background ags (0.7.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed dead-lock in ags_thread_loop() * fixed inresponsive AgsDrumInputPad * fixed unset AGS_DEVOUT_INITIALIZED flag as stopping the device ags (0.7.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed not nul-terminated string in ags_export_window.c * fixed missing include in ags_export_window.c * fixed initialization and reference count of async_queue in AgsAudioLoop * set environment variables LANG and LC_ALL programmatically to C ags (0.7.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong reference count in ags_recycling_real_add_audio_signal() * refactored ags_thread_pool.c due to performance impact of new code * refactored AgsThread flags * implemented threads to start synced * implemented AgsSwitchBufferFlag task because of data-race * implemented ags_thread_chaos_tree() ags (0.7.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed uninitialized values in ags_ipatch_sf2_reader.c * fixed Soundfont2 playback ags (0.7.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Soundfont2 support * fixed dead-lock while stop multi-channel playback * fixed open WAV files within AgsDrum * implemented ags_open_sf2_sample.c ags (0.7.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented AgsConcurrentTree in ags_devout.c and using it in ags_channel.c * added task_completion_mutex to AgsGuiThread * fixed memory-leak in ags_thread_pool.c ags (0.7.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * reverted changes of AgsTaskThread and AgsThreadPool * extended developers book * fixed dead-lock with AgsTaskThread ags (0.7.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed all unit tests * fixed ags_recycling_create_audio_signal_with_frame_count() * implemented timestamp property of AgsPattern and AgsNotation ags (0.7.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unit tests * fixed editor bug * refactored ags_recycling_create_audio_signal_with_frame_count() * implemented AgsGenericMainLoop * added many unit tests in ags_thread_test.c ags (0.7.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed XML IO * implemented read and write functions of AgsLadspaBridge, AgsDssiBridge and AgsLv2Bridge * fixed lock AgsPort as running recall ags (0.7.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented conversion objects AgsLadspaConversion and AgsLv2Conversion * implemended lv2 feature AgsLv2UridManager * improved AgsLadspaPlugin, AgsDssiPlugin and AgsLv2Plugin to relay on conversion objects * removed JACK server functions because of duplicated symbols * fixed integer support of plugins in ags_line_member.c and ags_bulk_member.c * fixed editing notation especially ags_notation_add_note() that was broken ags (0.7.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed lv2 event buffer functions * fixed wrong property mapping in ags_recall_lv2.c * implemented ags_lv2_uri_map_manager.c * implemented ags_lv2_log_manager.c * implemented ags_lv2_worker_manager.c * implemented ags_lv2_event_manager.c * implemented ::find-port in ags_machine.c, ags_pad.c ags_line.c, ags_line_member.c, ags_effect_bridge.c, ags_effect_bulk.c, ags_bulk_member.c, ags_effect_pad.c and ags_effect_line.c * refactored ags_machine_set_audio_channels() to ags_machine_set_audio_channels_callback() and added ags_machine_resize_audio_channels() in order to have a straight forward API * refactored ags_machine_set_pads() to ags_machine_set_pads_callback() and added ags_machine_resize_pads() in order to have a straight forward API * implemented XML IO of ags_effect_bridge.c and related * implemented XML IO of ags_automation_window.c and related * added AgsConversion prototype ags (0.7.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed XML IO * implemented ags_route_lv2_audio.c and ags_route_lv2_audio_run.c ags (0.7.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed Lv2 XPath and thus refactored code * implemented ags_base_plugin.c, ags_ladpsa_plugin.c, ags_dssi_plugin.c and ags_lv2_plugin.c to reduce over-head * implemented contextual XPath lookup in ags_turtle.c * refactored ags_recall_ladspa{,_run}.c, ags_recall_dssi{,_run}.c and ags_recall_lv2{,_run}.c to use the new plugins API * refactored ags_effect_bulk.c, ags_effect_line.c and ags_line.c to use the new plugins API * added ags_string_util.c ags (0.7.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed DSSI support ags (0.7.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * forwarded changes since 0.6.18 * fixed dead-lock, initial run of thread won't skipped anymore * migrated lv2 related XPath queries to new DTD * implemented adding dssi plugin to effect bulk within the effect bridge * implemented effect bridge menus of ladspa, dssi and lv2 * implemented ags_thread_clock() as signal * implemented ags_dssi_bridge.c ags (0.7.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved AgsMidiDialog * implemented many properties get and set functionality * implemented JACK support * refactored ags_turtle.c * added AgsFunction prototype ags (0.7.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags_midi_file.c * implemented ags-route-dssi recall to route MIDI events to DSSI * implemented ags_midi_dialog{,_callbacks}.[ch] to select MIDI input device * fixed some of the API Documentation ags (0.7.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added AgsComplex boxed type * added skelletons to interface with JACK * implemented DSSI support * added AgsMidiBuilder prototype * improved AgsMachineSelector ags (0.7.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * refactored renaming AgsRecyclingContainer to AgsRecyclingContext * refactored implenting AgsApplicationContext to superseed AgsMain * implemented providing library support ags (0.6.56) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed do proper unlink channel as destroying it ags (0.6.55) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed don't do pthread_yield() at the end of last tic per cycle * fixed removed struct in struct of AgsThread * fixed ags_config_get() non-static mutex with static initializer ags (0.6.54) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed optimal through-put strategy to achieve better performance, by skipping very first cycle's nanosleep() call ags (0.6.53) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed distortion because of false recycling context allocation * fixed restore from XML removed inverted audio channel ags (0.6.52) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing call to gdk_threads_enter() and gdk_threads_leave() in main.c ags (0.6.51) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed NULL pointer access during main() by waiting gui thread to be started * fixed two race-conditions by editing ags_thread_pool.c ags (0.6.50) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * grained timing in ags_thread_clock() * fixed dead-lock during initial thread run of AgsAsyncQueue see ags_task_thread.c and ags_thread-posix.c ags (0.6.49) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed find child recall in ags_play_notation_audio_run.c ags (0.6.48) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong parameter to nanosleep() in ags_thread_real_clock() ags (0.6.47) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * definitely-fixed wrong parameter to nanosleep() in ags_thread_real_clock() * fixed data-race in ::tact callback of AgsDrum and AgsMatrix and possible NULL pointer access ags (0.6.46) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong parameter to nanosleep() in ags_thread_real_clock() ags (0.6.45) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed recently introduced bug that caused AgsMixer to be muted ags (0.6.44) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed call to nanosleep() to use correct tact information ags (0.6.43) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed seeking playable after read in order to work with libsndfile * fixed usage of gdk_threads_enter() and gdk_threads_leave() because some were missing ags (0.6.42) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved performance by optimizing computing time ags (0.6.41) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed proper restore of GtkVScale digits * fixed proper restore of edit button of AgsDrum ags (0.6.40) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed memory leak in ags_generic_preferences.c but wasn't that bad * fixed using prefered gtk_main_iteration_do() what gives you better program stability ags (0.6.39) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed stack-corruption caused by integer overflow while doing variable typo ags (0.6.38) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * work-around dead-lock as doing ipatch_file_identify_open() from different threads ags (0.6.37) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing GMainContext acquire in ags_gui_thread.c * fixed NULL pointer accessing by moving code * fixed buffer-overflow because of swapped indices in ags_recycling.c ags (0.6.36) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed introduced bug in ags_ffplayer.c because of missing mapping recalls ags (0.6.35) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed SIGINT while accessing recycling_container being NULL in ags_channel_init_recall() ags (0.6.34) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed wrong acquisition of AgsAudioSignal in ags_recall_recycling.c ags (0.6.33) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed restore of AgsFFPlayer * implemented AgsStartReadFile task * modified startup of thread and file launch as reading from files ags (0.6.32) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing offset of loop audio data with lower frame count ags (0.6.31) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed loop audio data with lower frame count than buffer size * fixed memory corruption with freed list in ags_notation_cut_selection() * fixed toggling toolbar editing tool after restoring from XML file * work-around deleting GList notes of AgsNotation ags (0.6.30) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsFFPlayer loading Soundfont2 ags (0.6.29) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed dead-lock while selecting notes within note edit * fixed integer-overflow in ags_delay_audio_run_notation_alloc_output(), ags_delay_audio_run_notation_alloc_input() and ags_delay_audio_run_notation_count() * fixed wrong-lock order in ags_play_notation_audio_run.c * fixed buffer-overflow in ags_audio_signal_create_audio_signal_with_frame_count() ags (0.6.28) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed non-atomic access to atomic flags of AgsThread in ags_start_devout.c * reverted ags_gui_thread_run() functionality * fixed initial value of LADSPA plugin as reading from file ags (0.6.27) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * work-around in ags_notation_remove_note_at_position() to fix memory corruption ags (0.6.26) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed NULL pointer during key editing in editor * fixed race conditions in pattern and note edit * fixed missing reset link in ags_notation_add_note() * fixed access to invalidated pointer in ags_notation_remove_note_at_position() ags (0.6.25) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_thread_find_type() and ::run of all thread implementations to be safer * fixed dead-lock while pasting notes that caused application to crash ags (0.6.24) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed dead-lock while open XML files * fixed misconfigured port ags (0.6.23) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed REVERSE_TAB to escape focus of AgsDial by forward control keys * fixed _File mnemonic in menubar ags (0.6.22) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed relative path to gsequencer while applying properties ags (0.6.21) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed restoring and allocation of AgsLineMember dimensions * fixed SIGINT while reading XML files including AgsRecallLadspa ags (0.6.20) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed unrolled functions to have correct stop * fixed selection in ags_pattern_edit_callbacks.c and ags_note_edit_callbacks.c because it used wrong context * fixed ags_recall_real_cancel() because children field might have changed ags (0.6.19) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed accessing NULL pointer in ags_synth.c * fixed accessing NULL pointer in ags_ipatch.c * fixed accessing NULL pointer in ags_ffplayer_callbacks.c * fixed missing lock of mutex in ags_playable.c ags (0.6.18) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed volatile thread tree accessors * refactored by removing AgsAudioLoop fields and replacing with ags_thread_find_type() * work-around for resetting link and causing crash ags (0.6.17) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * enrolled built-in functions ags (0.6.16) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed refactored code of ags_channel.c because of bugs ags (0.6.15) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash while unlink channel and then do playback because recycling wasn't updated properly * fixed dead-lock while muting pad * enhaced AgsMachineEditor to be thread-safe * modified ags_audio_loop.c and ags_gui_thread.c to process in parallel ags (0.6.14) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed NULL pointer in ags_line.c as accessing mutex manager * fixed NULL pointer in ags_drum_output_line.c as accessing machine while setting channel ags (0.6.13) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added even more mutices to guarantee thread-safety ags (0.6.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added more mutices to guarantee thread-safety ags (0.6.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed race condition caused as stopping the engine ended in a dead-lock ags (0.6.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed startup dead-lock * implemented ags_main_loop_get_tree_lock() ags (0.6.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed missing notation due to refactoring of 0.6.8 ags (0.6.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed super-threaded scope audio and channel to be thread-safe * refactored ags_audio_set_audio_channels() and ags_audio_set_pads() * improved ags_channel_set_recycling() to instantiate AgsRecallID * enhanced super-threaded scope recycling but is probably not yet ready * enhanced ags_recycling.c to use mutices in view of super-threaded computing * enhanced ags_audio.c and ags_channel.c the use of mutices ags (0.6.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash related to XML IO of AgsFileLink * implemented ags-envelope recall but it's not tested, yet ags (0.6.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed modified default thread model in ags_config.c what caused certain crashes without ECC * extended AgsFileLink with field audio_channel see next * improved link editor file chooser to let you select audio channel ags (0.6.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_pad_play() to contain cancel code instead of playing again on toggle * modified default thread model in ags_config.c what caused certain crashes without ECC * implemented loading GTKRC from $(HOME)/.gsequencer/ags.rc ags (0.6.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed audible feedback of note edit to play actual length of note * fixed not connected line member * fixed missing value_changed event in ags_dial.c * removed built-in styles ags (0.6.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed to shrink of notes by keyboard to enable initial size * improved user's manual docbook XML documentation * implemented AtkAction interface in ags_dial.c and key-bindings ags (0.6.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed buffer attack in ags_buffer_audio_signal_run_inter() * fixed NULL link within link editor to be shown correctly * fixed playback of linked input * implemented file link in link editor * implemented audible feedback of AgsPatternBox, AgsCellPattern, AgsPatternEdit and AgsNoteEdit ags (0.6.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash while clicking AgsPatternBox pad * fixed toggling all selected pads of AgsPatternBox pattern * enhanced prelight of focused AgsPatternBox pad ags (0.6.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * Implemented basic accessibility thus refactored AgsDrum and AgsMatrix. Further enhanced AgsPatternEdit and AgsNoteEdit. ags (0.5.12) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags_channel_set_link() and ags_channel_set_recycling() * fixed unlink while ags_audio_set_pads() and ags_audio_set_audio_channels() ags (0.5.11) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed time calculation using absolute position for AgsExportWindow and AgsNavigation * fixed fundamental timing issue which caused the engine to be delayed ags (0.5.10) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed grained control range * fixed more precise time calculation * fixed AgsDial wrong arithmetic expression * fixed time calculation * fixed crash while open unsupported files * implemented AgsAsyncQueue interface in ags_task_thread.c to avoid race-conditions * fixed AgsDrumInputPad playback ags (0.5.9) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed cliped LADSPA data ags (0.5.8) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed auto-scroll * fixed time calculation * fixed copy & paste * fixed ruler * fixed crash during extensive scrolling * fixed export duration and difference to playback time ags (0.5.7) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash during unavailable audio file * fixed buffer size preference for thread frequencies ags (0.5.6) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed memory leaks related to GValue in recalls * fixed memory leaks in ags_display_tact_launch() as well for ags_toggle_led_launch() and in some GUI callbacks of them * fixed memory leak AgsReturnableThread to clean disconnect handler * fixed thread frequencies and delays * implemented code alter macro AGS_USE_TIMER ags (0.5.5) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * enhanced thread-safety * fixed ags.conf per file base * reducing thread-cycles per second in order to target performance problems * fixed allocation of ags-buffer ags (0.5.4) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented ags.conf per file base * cleaned-up recalls allocation ags (0.5.3) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed export duration * fixed improved AgsDial * fixed dead-lock for to many calls to AgsChannelThread ags (0.5.2) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed memory leaks accessing AgsConfig * fixed dead-lock while stop playback * improved drawing of animations ags (0.5.1) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed ags.xsl removed wrong division, note use segmentation to adjust appropriate playback rate * fixed file open dialog callback * fxied calculate time by segmentation * fixed pattern mode hint for notation * fixed reading bpm setting from ags.xsl generated files ags (0.5.0) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemnted first super-threaded context for AgsAudio and AgsChannel * fixed replace deprecated GtkFileSelector for opening files ags (0.4.2.92) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed crash while hot-link matrix and synth with multi-output * implemnted segmentation ags (0.4.2.91) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed multiple occurence of recalls * fixed potential infinite loop while reset recall ids * migrated away from hide references to recall id status * fixed proper unlink as adjusting channels * fixed allocation of ags-buffer * fixed selective creation of recalls in ags_recall_recycling.c * fixed remap of recycling recalls for available destination in ags_recall_channel_run.c * minor bug-fixes * note speed may differ for now ags (0.4.2.90) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed led in sequencers * fixed missing mutex in matrix tact callback * fixed cut to nowhere * fixed ags.xsl notation translate * fixed redraw of piano * fixed redraw of matrix * fixed deny output pads to be resize for mixer ags (0.4.2.89) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed bug in ags_recall_channel_run.c that caused destination not being mapped ags (0.4.2.88) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * improved auto-scroll to be loop aware ags (0.4.2.87) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed auto-scroll ags (0.4.2.86) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed version string from autoconf * fixed chrash during removing not existing machine selector * added experimental auto-scroll capabilities ags (0.4.2.85) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed allocation of piano * fixed grained mutices for accessing notation * fixed cursor in edit widgets ags (0.4.2.84) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed dialog owned by machines to destroy * fixed make machine selection dialog modal ags (0.4.2.83) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed playback within AgsDrumInputPad * fixed thread-safety of editor with AgsMutexManager * hided playback button of AgsDrumInputPad open dialog * fixed spin button in AgsDrumInputPad open dialog ags (0.4.2.82) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed default device as reading XML files * fixed floor to round in XSL for reading MIDI notes * fixed unlink AgsAudio on remove * fixed termination of sequencer in ags_machine_play_callback() * fixed crash during channel resize if not shown in editor, hide widgets instead of remove * fixed destroying of machines removing editor widget * fixed paste notes * added flag to AgsDevout to fix unavailable soundcard ags (0.4.2.81) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * removed useless controls add/remove in machine property editor * fixed navigation duration * fixed seeking * fixed crash according not properbly cleaning up after playing ags (0.4.2.80) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed renaming * fixed audio channel bug in notation recall ags (0.4.2.79) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * renamed binary and project * added missing copyright notice ags (0.4.2-78) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented distinct between sequencer and notation loop * fixed unnecessary return if notation reaches notation-loop-end * fixed selection for pattern and notation editor * refactored fix auto-scroll * added exclude sequencer for export dialog ags (0.4.2-77) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed possible NULL pointer in ags_play_notation.c * fixed editor crash and missing notebook * implemented AGS_AUDIO_REVERSE_MAPPING flag, it indicates channel mapping should be interpreted in reverse order * implemented invert tool for notation editor ags (0.4.2-76) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed boundary for matrix clipboard * fixed paste to mono or different audio allocation * fixed piano shift to correct direction * fixed reset vscrollbar in editor widgets * refactored ags_editor.c * fixed already selected machines in editor not to add again * fixed audio channel resize for mono machines, disabled it in machine properties dialog * enhanced LADSPA browser refresh ags (0.4.2-75) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed deactivate led in AgsDrum and AgsMatrix * fixed multi-output * fixed adjusting audio channels for tabs of editor * implemented shift piano thereby fixed piano allocation ags (0.4.2-74) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * fixed AgsPatternEdit focus, selection, coloring of selected notes and a crash related to wrong function call * added exclusion for sequencers by using "exclude sequencers" checkbutton in navigation * added copy & paste pattern context menu items to drum and matrix * fixed AgsMatrix input * fixed NULL pointer error in ags_count_beats_audio_run.c ags (0.4.2-73) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * back-ported AgsPatternEdit * implemented basic editing key strokes like Ctrl-c, Ctrl-v and Ctrl-x for AgsPatternEdit ags (0.4.2-72) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * implemented basic editing key strokes like Ctrl-c, Ctrl-v and Ctrl-x * implemented seeking for paste if position tool is selected * updated clipboard version to 0.4.2 ags (0.4.2-71) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * commented-out two unimplemented menu entries in editor's machine selector. Add and remove tab you may do so by using resize tab of machine properties dialog. * implemented select-all in editor * fixed multi-channel editing mode * fixed refresh of GUI after cut or paste * fixed crash related to XML IO ags (0.4.2-70) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * minor bug-fixes ags (0.4.2-69) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added XSL file to transform output of `midi2xml` using `xsltproc` ags (0.4.2-68) [ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ] * added `midi2xml` the MIDI file to XML parser Copyright (C) 2005-2019 Joël Krähemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". gsequencer-3.1.3/clean-gtk-doc.sh0000755000175000017500000000742213607210263013554 00000000000000#!/bin/bash # # Copyright (C) 2005-2018 Joël Krähemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. rm -rf docs/reference/libags-audio/.libs/ rm -f docs/reference/libags-audio/html-build.stamp rm -f docs/reference/libags-audio/html.stamp rm -f docs/reference/libags-audio/libags_audio-decl-list.txt rm -f docs/reference/libags-audio/libags_audio-decl-list.txt.bak rm -f docs/reference/libags-audio/libags_audio-decl.txt rm -f docs/reference/libags-audio/libags_audio-decl.txt.bak rm -f docs/reference/libags-audio/libags_audio-undeclared.txt rm -f docs/reference/libags-audio/libags_audio-undocumented.txt rm -f docs/reference/libags-audio/libags_audio-unused.txt rm -f docs/reference/libags-audio/libags_audio.args rm -f docs/reference/libags-audio/libags_audio.hierarchy rm -f docs/reference/libags-audio/libags_audio.prerequisites rm -f docs/reference/libags-audio/libags_audio.signals rm -f docs/reference/libags-audio/libags_audio.types.bak rm -f docs/reference/libags-audio/scan-build.stamp rm -f docs/reference/libags-audio/setup-build.stamp rm -f docs/reference/libags-audio/sgml-build.stamp rm -f docs/reference/libags-audio/sgml.stamp rm -rf docs/reference/libags-gui/.libs/ rm -f docs/reference/libags-gui/html-build.stamp rm -f docs/reference/libags-gui/html.stamp rm -f docs/reference/libags-gui/libags_gui-decl-list.txt rm -f docs/reference/libags-gui/libags_gui-decl.txt rm -f docs/reference/libags-gui/libags_gui-undeclared.txt rm -f docs/reference/libags-gui/libags_gui-undocumented.txt rm -f docs/reference/libags-gui/libags_gui-unused.txt rm -f docs/reference/libags-gui/libags_gui.args rm -f docs/reference/libags-gui/libags_gui.hierarchy rm -f docs/reference/libags-gui/libags_gui.prerequisites rm -f docs/reference/libags-gui/libags_gui.signals rm -f docs/reference/libags-gui/scan-build.stamp rm -f docs/reference/libags-gui/setup-build.stamp rm -f docs/reference/libags-gui/sgml-build.stamp rm -f docs/reference/libags-gui/sgml.stamp rm -rf docs/reference/libags/.libs/ rm -f docs/reference/libags/html-build.stamp rm -f docs/reference/libags/html.stamp rm -f docs/reference/libags/libags-decl-list.txt rm -f docs/reference/libags/libags-decl.txt rm -f docs/reference/libags/libags-undeclared.txt rm -f docs/reference/libags/libags-undocumented.txt rm -f docs/reference/libags/libags-unused.txt rm -f docs/reference/libags/libags.args rm -f docs/reference/libags/libags.hierarchy rm -f docs/reference/libags/libags.prerequisites rm -f docs/reference/libags/libags.signals rm -f docs/reference/libags/libags.types.bak rm -f docs/reference/libags/scan-build.stamp rm -f docs/reference/libags/setup-build.stamp rm -f docs/reference/libags/sgml-build.stamp rm -f docs/reference/libags/sgml.stamp rm -rf docs/reference/libgsequencer/.libs/ rm -f docs/reference/libgsequencer/html-build.stamp rm -f docs/reference/libgsequencer/html.stamp rm -f docs/reference/libgsequencer/libgsequencer-decl-list.txt rm -f docs/reference/libgsequencer/libgsequencer-decl.txt rm -f docs/reference/libgsequencer/libgsequencer-undeclared.txt rm -f docs/reference/libgsequencer/libgsequencer-undocumented.txt rm -f docs/reference/libgsequencer/libgsequencer-unused.txt rm -f docs/reference/libgsequencer/libgsequencer.args rm -f docs/reference/libgsequencer/libgsequencer.hierarchy rm -f docs/reference/libgsequencer/libgsequencer.prerequisites rm -f docs/reference/libgsequencer/libgsequencer.signals rm -f docs/reference/libgsequencer/libgsequencer.types.bak rm -f docs/reference/libgsequencer/scan-build.stamp rm -f docs/reference/libgsequencer/setup-build.stamp rm -f docs/reference/libgsequencer/sgml-build.stamp rm -f docs/reference/libgsequencer/sgml.stamp gsequencer-3.1.3/ABOUT-NLS0000644000175000017500000026747413556560122012060 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this 'ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU 'gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU 'gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. 1.1 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU 'gettext'. Other packages have their own ways to internationalization, predating GNU 'gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU 'gettext' functions. Installers may use special options at configuration time for changing the default behaviour. The command: ./configure --disable-nls will _totally_ disable translation of messages. When you already have GNU 'gettext' installed on your system and run configure without an option for your new package, 'configure' will probably detect the previously built and installed 'libintl' library and will decide to use it. If not, you may have to to use the '--with-libintl-prefix' option to tell 'configure' where to look for it. Internationalized packages usually have many 'po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at 'configure' time by using the '--disable-nls' switch, all available translations are installed together with the package. However, the environment variable 'LINGUAS' may be set, prior to configuration, to limit the installed set. 'LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.2 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the 'LANG' environment variable to the appropriate 'LL_CC' combination. If you happen to have the 'LC_ALL' or some other 'LC_xxx' environment variables set, you should unset them before setting 'LANG', otherwise the setting of 'LANG' will not have the desired effect. Here 'LL' is an ISO 639 two-letter language code, and 'CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute 'setenv LANG de_DE' (in 'csh'), 'export LANG; LANG=de_DE' (in 'sh') or 'export LANG=de_DE' (in 'bash'). This can be done from your '.login' or '.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, 'de_AT' is used for Austria, and 'pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of 'LL_CC', with 'LL' denoting the language and 'CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as 'LL' or 'LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command 'locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called 'LANGUAGE'. GNU 'gettext' gives preference to 'LANGUAGE' over 'LANG' for the purpose of message handling, but you still need to have 'LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set 'LANGUAGE' to 'sv:de' while leaving 'LANG' to 'sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from 'no' to 'nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under 'nb' and some older ones under 'no', it's recommended for Norwegian users to set 'LANGUAGE' to 'nb:no' so that both newer and older translations are used. In the 'LANGUAGE' environment variable, but not in the 'LANG' environment variable, 'LL_CC' combinations can be abbreviated as 'LL' to denote the language's main dialect. For example, 'de' is equivalent to 'de_DE' (German as spoken in Germany), and 'pt' to 'pt_PT' (Portuguese as spoken in Portugal) in this context. 1.3 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, 'http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has '-request' appended. For example, speakers of Swedish can send a message to 'sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to 'coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.4 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of Jun 2014. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am an ar as ast az be bg bn bn_IN bs ca crh cs +---------------------------------------------------+ a2ps | [] [] [] | aegis | | anubis | | aspell | [] [] [] | bash | [] [] [] | bfd | | binutils | [] | bison | | bison-runtime | [] | buzztrax | [] | ccd2cue | | ccide | | cflow | | clisp | | coreutils | [] [] | cpio | | cppi | | cpplib | [] | cryptsetup | [] | datamash | | denemo | [] [] | dfarc | [] | dialog | [] [] [] | dico | | diffutils | [] | dink | [] | direvent | | doodle | [] | dos2unix | | dos2unix-man | | e2fsprogs | [] [] | enscript | [] | exif | [] | fetchmail | [] [] | findutils | [] | flex | [] | freedink | [] [] | fusionforge | | gas | | gawk | [] | gcal | [] | gcc | | gdbm | | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gjay | | glunarclock | [] [] [] | gnubiff | [] | gnubik | [] | gnucash | () () [] | gnuchess | | gnulib | [] | gnunet | | gnunet-gtk | | gold | | gphoto2 | [] | gprof | [] | gramadoir | | grep | [] [] [] | grub | [] | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] | gst-plugins-ugly | [] [] [] | gstreamer | [] [] [] [] | gtick | [] | gtkam | [] [] | gtkspell | [] [] [] [] [] | guix | | guix-packages | | gutenprint | [] | hello | [] | help2man | | help2man-texi | | hylafax | | idutils | | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | iso_639_5 | | jwhois | | kbd | [] | klavaro | [] [] [] [] [] | ld | [] | leafpad | [] [] [] [] | libc | [] [] [] | libexif | () | libextractor | | libgnutls | [] | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | | libiconv | [] [] | libidn | [] | liferea | [] [] [] [] | lilypond | [] [] | lordsawar | [] | lprng | | lynx | [] [] | m4 | [] | mailfromd | | mailutils | | make | [] | man-db | [] [] | man-db-manpages | | midi-instruments | [] [] [] | minicom | [] | mkisofs | [] | myserver | [] | nano | [] [] [] | opcodes | | parted | [] | pies | | pnmixer | | popt | [] | procps-ng | | procps-ng-man | | psmisc | [] | pspp | [] | pushover | [] | pwdutils | | pyspread | | radius | [] | recode | [] [] [] | recutils | | rpm | | rush | | sarg | | sed | [] [] [] [] | sharutils | [] | shishi | | skribilo | | solfege | [] [] | solfege-manual | | spotmachine | | sudo | [] [] | sudoers | [] [] | sysstat | [] | tar | [] [] [] | texinfo | [] [] | texinfo_document | [] [] | tigervnc | [] | tin | | tin-man | | tracgoogleappsa... | | trader | | util-linux | [] | ve | | vice | | vmm | | vorbis-tools | [] | wastesedge | | wcd | | wcd-man | | wdiff | [] [] | wget | [] | wyslij-po | | xboard | | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +---------------------------------------------------+ af am an ar as ast az be bg bn bn_IN bs ca crh cs 4 0 2 5 3 11 0 8 25 3 3 1 55 4 74 da de el en en_GB en_ZA eo es et eu fa fi fr +--------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] [] | aegis | [] [] [] [] | anubis | [] [] [] [] [] | aspell | [] [] [] [] [] [] [] | bash | [] [] [] | bfd | [] [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] [] [] [] | buzztrax | [] [] [] [] | ccd2cue | [] [] [] [] | ccide | [] [] [] [] [] [] | cflow | [] [] [] [] [] | clisp | [] [] [] [] [] | coreutils | [] [] [] [] [] | cpio | [] [] [] [] [] | cppi | [] [] [] [] [] | cpplib | [] [] [] [] [] [] | cryptsetup | [] [] [] [] [] | datamash | [] [] [] [] | denemo | [] | dfarc | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] [] [] | dico | [] [] [] [] | diffutils | [] [] [] [] [] [] | dink | [] [] [] [] [] [] | direvent | [] [] [] [] | doodle | [] [] [] [] | dos2unix | [] [] [] [] [] | dos2unix-man | [] [] [] | e2fsprogs | [] [] [] [] [] | enscript | [] [] [] [] [] [] | exif | [] [] [] [] [] [] | fetchmail | [] () [] [] [] [] [] | findutils | [] [] [] [] [] [] [] [] | flex | [] [] [] [] [] [] | freedink | [] [] [] [] [] [] [] [] | fusionforge | [] [] [] | gas | [] [] [] | gawk | [] [] [] [] [] | gcal | [] [] [] [] | gcc | [] | gdbm | [] [] [] [] [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] | gjay | [] [] [] [] | glunarclock | [] [] [] [] [] | gnubiff | () [] [] () | gnubik | [] [] [] [] [] | gnucash | [] () () () () () () | gnuchess | [] [] [] [] | gnulib | [] [] [] [] [] [] [] | gnunet | [] | gnunet-gtk | [] | gold | [] [] [] | gphoto2 | [] () [] [] | gprof | [] [] [] [] [] [] | gramadoir | [] [] [] [] [] | grep | [] [] [] [] [] [] [] | grub | [] [] [] [] [] | gsasl | [] [] [] [] [] | gss | [] [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | [] () [] [] [] | gtkam | [] () [] [] [] [] | gtkspell | [] [] [] [] [] [] [] [] | guix | [] [] | guix-packages | | gutenprint | [] [] [] [] | hello | [] [] [] [] [] [] [] [] | help2man | [] [] [] [] [] [] [] | help2man-texi | [] [] [] | hylafax | [] [] | idutils | [] [] [] [] [] | iso_15924 | [] () [] [] () [] () | iso_3166 | [] () [] [] [] [] () [] () | iso_3166_2 | [] () () () | iso_4217 | [] () [] [] [] () [] () | iso_639 | [] () [] [] () [] () | iso_639_3 | () () () | iso_639_5 | () () () | jwhois | [] [] [] [] [] | kbd | [] [] [] [] [] [] | klavaro | [] [] [] [] [] [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] [] () [] [] | libextractor | [] | libgnutls | [] [] [] [] | libgphoto2 | [] () [] | libgphoto2_port | [] () [] [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] [] [] | libidn | [] [] [] [] [] | liferea | [] () [] [] [] [] [] | lilypond | [] [] [] [] [] [] | lordsawar | [] [] | lprng | | lynx | [] [] [] [] [] [] | m4 | [] [] [] [] [] [] | mailfromd | [] | mailutils | [] [] [] [] | make | [] [] [] [] [] | man-db | [] [] [] [] | man-db-manpages | [] [] | midi-instruments | [] [] [] [] [] [] [] [] [] | minicom | [] [] [] [] [] | mkisofs | [] [] [] | myserver | [] [] [] [] | nano | [] [] [] [] [] [] [] | opcodes | [] [] [] [] [] | parted | [] [] [] | pies | [] | pnmixer | [] [] | popt | [] [] [] [] [] [] | procps-ng | [] [] | procps-ng-man | [] [] | psmisc | [] [] [] [] [] [] [] | pspp | [] [] [] | pushover | () [] [] [] | pwdutils | [] [] [] | pyspread | [] [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | recutils | [] [] [] [] | rpm | [] [] [] [] [] | rush | [] [] [] | sarg | [] [] | sed | [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] [] [] | skribilo | [] [] [] | solfege | [] [] [] [] [] [] [] [] | solfege-manual | [] [] [] [] [] | spotmachine | [] [] [] [] [] | sudo | [] [] [] [] [] [] | sudoers | [] [] [] [] [] [] | sysstat | [] [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] [] [] [] | texinfo_document | [] [] [] [] | tigervnc | [] [] [] [] [] [] | tin | [] [] [] [] | tin-man | [] | tracgoogleappsa... | [] [] [] [] [] | trader | [] [] [] [] [] [] | util-linux | [] [] [] [] | ve | [] [] [] [] [] | vice | () () () | vmm | [] [] | vorbis-tools | [] [] [] [] | wastesedge | [] | wcd | [] [] [] [] | wcd-man | [] | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] | wyslij-po | [] [] [] [] | xboard | [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] [] | +--------------------------------------------------+ da de el en en_GB en_ZA eo es et eu fa fi fr 119 131 32 1 6 0 94 95 22 13 4 102 139 ga gd gl gu he hi hr hu hy ia id is it ja ka kk +-------------------------------------------------+ a2ps | [] [] [] [] | aegis | [] | anubis | [] [] [] [] | aspell | [] [] [] [] [] | bash | [] [] [] [] | bfd | [] [] | binutils | [] [] [] | bison | [] | bison-runtime | [] [] [] [] [] [] [] [] | buzztrax | | ccd2cue | [] | ccide | [] [] | cflow | [] [] [] | clisp | | coreutils | [] [] | cpio | [] [] [] [] [] [] | cppi | [] [] [] [] [] | cpplib | [] [] | cryptsetup | [] | datamash | | denemo | [] | dfarc | [] [] [] | dialog | [] [] [] [] [] [] [] [] [] [] | dico | | diffutils | [] [] [] [] | dink | [] | direvent | [] | doodle | [] [] | dos2unix | [] [] | dos2unix-man | | e2fsprogs | [] [] | enscript | [] [] [] | exif | [] [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] [] [] [] [] | flex | [] | freedink | [] [] [] [] | fusionforge | | gas | [] | gawk | [] () [] | gcal | | gcc | | gdbm | | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] | gettext-tools | [] [] [] | gjay | [] | glunarclock | [] [] [] [] [] [] | gnubiff | [] [] () | gnubik | [] [] [] | gnucash | () () () () () | gnuchess | | gnulib | [] [] [] [] [] | gnunet | | gnunet-gtk | | gold | [] [] | gphoto2 | [] [] [] [] | gprof | [] [] [] [] | gramadoir | [] [] [] | grep | [] [] [] [] [] [] [] | grub | [] [] [] | gsasl | [] [] [] [] [] | gss | [] [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] [] [] | gtkam | [] [] [] [] [] | gtkspell | [] [] [] [] [] [] [] [] [] [] | guix | | guix-packages | | gutenprint | [] [] [] | hello | [] [] [] [] [] | help2man | [] [] [] | help2man-texi | | hylafax | [] | idutils | [] [] | iso_15924 | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | [] [] | iso_4217 | [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | iso_639_5 | | jwhois | [] [] [] [] | kbd | [] [] [] | klavaro | [] [] [] [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] [] () | libc | [] [] [] [] [] | libexif | [] | libextractor | | libgnutls | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] [] [] [] [] | libidn | [] [] [] [] | liferea | [] [] [] [] [] | lilypond | [] | lordsawar | | lprng | [] | lynx | [] [] [] [] | m4 | [] [] [] [] [] | mailfromd | | mailutils | | make | [] [] [] [] | man-db | [] [] | man-db-manpages | [] [] | midi-instruments | [] [] [] [] [] [] [] [] [] | minicom | [] [] [] | mkisofs | [] [] | myserver | [] | nano | [] [] [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] [] [] | pies | | pnmixer | [] [] | popt | [] [] [] [] [] [] [] [] [] [] | procps-ng | | procps-ng-man | | psmisc | [] [] [] [] | pspp | [] [] | pushover | [] | pwdutils | [] | pyspread | | radius | [] | recode | [] [] [] [] [] [] [] | recutils | | rpm | [] | rush | [] | sarg | | sed | [] [] [] [] [] [] [] | sharutils | | shishi | | skribilo | [] | solfege | [] [] | solfege-manual | | spotmachine | | sudo | [] [] [] [] | sudoers | [] [] [] | sysstat | [] [] [] [] | tar | [] [] [] [] [] [] | texinfo | [] [] [] | texinfo_document | [] [] [] | tigervnc | | tin | | tin-man | | tracgoogleappsa... | [] [] [] [] | trader | [] [] | util-linux | [] | ve | [] | vice | () () | vmm | | vorbis-tools | [] [] | wastesedge | [] | wcd | | wcd-man | | wdiff | [] [] [] | wget | [] [] [] [] | wyslij-po | [] [] [] | xboard | | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] | +-------------------------------------------------+ ga gd gl gu he hi hr hu hy ia id is it ja ka kk 35 2 47 4 8 2 60 71 2 6 81 11 87 57 0 3 kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl +--------------------------------------------------+ a2ps | [] [] | aegis | [] | anubis | [] [] [] | aspell | [] [] | bash | [] [] | bfd | | binutils | | bison | [] | bison-runtime | [] [] [] [] [] [] | buzztrax | | ccd2cue | | ccide | [] [] | cflow | [] | clisp | [] | coreutils | [] [] | cpio | [] | cppi | | cpplib | [] | cryptsetup | [] | datamash | [] [] | denemo | | dfarc | [] [] | dialog | [] [] [] [] [] [] | dico | | diffutils | [] [] [] | dink | [] | direvent | [] | doodle | [] | dos2unix | [] [] | dos2unix-man | [] | e2fsprogs | [] | enscript | [] | exif | [] [] [] | fetchmail | [] | findutils | [] [] | flex | [] | freedink | [] [] | fusionforge | | gas | | gawk | [] | gcal | | gcc | | gdbm | | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] | gjay | | glunarclock | [] [] | gnubiff | [] | gnubik | [] [] | gnucash | () () () () () () () [] | gnuchess | [] [] | gnulib | [] | gnunet | | gnunet-gtk | | gold | | gphoto2 | [] | gprof | [] [] | gramadoir | [] | grep | [] [] | grub | [] [] [] | gsasl | [] | gss | | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] | gtkspell | [] [] [] [] [] [] [] | guix | | guix-packages | | gutenprint | [] | hello | [] [] [] | help2man | [] | help2man-texi | | hylafax | [] | idutils | [] | iso_15924 | () [] [] | iso_3166 | [] [] [] () [] [] [] [] [] [] | iso_3166_2 | () [] | iso_4217 | () [] [] [] | iso_639 | [] [] () [] [] [] [] | iso_639_3 | [] () [] | iso_639_5 | () | jwhois | [] [] | kbd | [] | klavaro | [] [] | ld | | leafpad | [] [] [] [] [] | libc | [] [] | libexif | [] | libextractor | [] | libgnutls | [] [] | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | [] [] | libidn | [] | liferea | [] [] [] | lilypond | [] | lordsawar | | lprng | | lynx | [] | m4 | [] | mailfromd | | mailutils | | make | [] [] | man-db | [] | man-db-manpages | [] | midi-instruments | [] [] [] [] [] [] [] | minicom | [] | mkisofs | [] | myserver | | nano | [] [] [] | opcodes | [] | parted | [] [] | pies | | pnmixer | [] | popt | [] [] [] [] [] | procps-ng | | procps-ng-man | | psmisc | [] | pspp | [] [] | pushover | | pwdutils | [] | pyspread | | radius | [] | recode | [] [] | recutils | [] | rpm | [] | rush | [] | sarg | | sed | [] [] | sharutils | [] | shishi | | skribilo | | solfege | [] [] | solfege-manual | [] | spotmachine | [] | sudo | [] [] [] | sudoers | [] [] [] | sysstat | [] [] | tar | [] [] [] | texinfo | [] | texinfo_document | [] | tigervnc | [] | tin | | tin-man | | tracgoogleappsa... | [] [] [] | trader | [] | util-linux | [] | ve | [] | vice | [] | vmm | [] | vorbis-tools | [] | wastesedge | [] | wcd | [] | wcd-man | [] | wdiff | [] | wget | [] [] | wyslij-po | [] | xboard | [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +--------------------------------------------------+ kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl 5 15 4 6 0 13 23 3 3 3 4 11 2 42 1 125 nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr +------------------------------------------------+ a2ps | [] [] [] [] [] [] [] | aegis | [] [] | anubis | [] [] [] | aspell | [] [] [] [] [] [] [] | bash | [] [] [] [] [] [] | bfd | [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] [] [] [] | buzztrax | [] | ccd2cue | [] [] | ccide | [] [] [] | cflow | [] [] [] | clisp | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cppi | [] [] [] | cpplib | [] [] [] | cryptsetup | [] [] [] | datamash | [] [] | denemo | | dfarc | [] [] [] | dialog | [] [] [] [] [] [] [] | dico | [] | diffutils | [] [] [] | dink | | direvent | [] [] [] | doodle | [] [] | dos2unix | [] [] [] [] | dos2unix-man | [] [] | e2fsprogs | [] | enscript | [] [] [] [] [] [] | exif | [] [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | freedink | [] [] [] [] [] | fusionforge | | gas | | gawk | [] | gcal | | gcc | | gdbm | [] [] [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gjay | [] | glunarclock | [] [] [] [] [] [] | gnubiff | [] | gnubik | [] [] [] [] | gnucash | () () () () () [] | gnuchess | [] [] | gnulib | [] [] [] [] [] | gnunet | | gnunet-gtk | | gold | | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] | gramadoir | [] [] | grep | [] [] [] [] [] [] | grub | [] [] [] [] [] | gsasl | [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | [] [] [] [] [] | gtkam | [] [] [] [] [] [] | gtkspell | [] [] [] [] [] [] [] [] [] | guix | | guix-packages | | gutenprint | [] [] | hello | [] [] [] [] [] [] | help2man | [] [] [] [] | help2man-texi | [] | hylafax | | idutils | [] [] [] | iso_15924 | [] () [] [] [] [] | iso_3166 | [] [] [] [] () [] [] [] [] [] [] [] [] | iso_3166_2 | [] () [] | iso_4217 | [] [] () [] [] [] [] [] | iso_639 | [] [] [] () [] [] [] [] [] [] | iso_639_3 | [] () | iso_639_5 | () [] | jwhois | [] [] [] [] | kbd | [] [] | klavaro | [] [] [] [] [] | ld | | leafpad | [] [] [] [] [] [] [] [] | libc | [] [] [] | libexif | [] () [] | libextractor | [] | libgnutls | [] | libgphoto2 | [] | libgphoto2_port | [] [] [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] [] | liferea | [] [] [] [] () [] [] | lilypond | | lordsawar | | lprng | [] | lynx | [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] | make | [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] [] | midi-instruments | [] [] [] [] [] [] [] [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | [] [] | nano | [] [] [] [] [] [] | opcodes | | parted | [] [] [] [] [] [] | pies | [] | pnmixer | [] | popt | [] [] [] [] [] [] | procps-ng | [] | procps-ng-man | [] | psmisc | [] [] [] [] | pspp | [] [] | pushover | | pwdutils | [] | pyspread | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | recutils | [] [] | rpm | [] | rush | [] [] [] | sarg | [] [] | sed | [] [] [] [] [] [] [] [] | sharutils | [] [] [] | shishi | [] [] | skribilo | [] | solfege | [] [] [] | solfege-manual | [] [] | spotmachine | [] [] | sudo | [] [] [] [] [] [] | sudoers | [] [] [] [] | sysstat | [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | texinfo_document | [] [] | tigervnc | [] [] [] | tin | [] | tin-man | | tracgoogleappsa... | [] [] [] [] | trader | [] [] | util-linux | [] [] | ve | [] [] [] | vice | | vmm | | vorbis-tools | [] [] [] | wastesedge | | wcd | | wcd-man | | wdiff | [] [] [] [] [] | wget | [] [] [] [] [] | wyslij-po | [] [] [] [] | xboard | [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | +------------------------------------------------+ nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr 7 3 6 114 1 12 88 32 82 3 40 45 7 101 sv sw ta te tg th tr uk ur vi wa wo zh_CN +----------------------------------------------+ a2ps | [] [] [] [] [] | aegis | [] | anubis | [] [] [] [] | aspell | [] [] [] [] [] | bash | [] [] [] [] | bfd | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] | bison-runtime | [] [] [] [] [] [] | buzztrax | [] [] [] | ccd2cue | [] [] [] | ccide | [] [] [] [] | cflow | [] [] [] [] | clisp | | coreutils | [] [] [] | cpio | [] [] [] [] [] | cppi | [] [] [] [] | cpplib | [] [] [] [] [] | cryptsetup | [] [] [] | datamash | [] [] [] | denemo | [] | dfarc | [] [] | dialog | [] [] [] [] [] [] | dico | [] | diffutils | [] [] [] [] [] | dink | [] | direvent | [] [] | doodle | [] [] | dos2unix | [] [] [] [] | dos2unix-man | [] [] [] | e2fsprogs | [] [] [] [] | enscript | [] [] [] [] | exif | [] [] [] [] [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] | freedink | [] [] [] | fusionforge | | gas | [] | gawk | [] [] [] | gcal | [] [] [] | gcc | [] | gdbm | [] [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] [] [] | gjay | [] [] [] | glunarclock | [] [] [] [] | gnubiff | [] [] | gnubik | [] [] [] [] | gnucash | () () () () [] | gnuchess | [] [] [] | gnulib | [] [] [] [] | gnunet | | gnunet-gtk | | gold | [] [] | gphoto2 | [] [] [] [] | gprof | [] [] [] [] | gramadoir | [] [] [] | grep | [] [] [] [] [] | grub | [] [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkspell | [] [] [] [] [] [] [] | guix | | guix-packages | | gutenprint | [] [] [] [] | hello | [] [] [] [] [] [] | help2man | [] [] [] | help2man-texi | [] | hylafax | [] | idutils | [] [] [] | iso_15924 | [] () [] [] () [] | iso_3166 | [] [] () [] [] () [] [] | iso_3166_2 | () [] [] () [] | iso_4217 | [] () [] [] () [] | iso_639 | [] [] [] () [] [] () [] [] | iso_639_3 | [] () [] [] () | iso_639_5 | () [] () | jwhois | [] [] [] [] | kbd | [] [] [] [] | klavaro | [] [] [] [] [] [] | ld | [] [] [] [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] [] () | libextractor | [] [] | libgnutls | [] [] [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] [] [] | libidn | () [] [] [] | liferea | [] [] [] [] [] | lilypond | [] | lordsawar | | lprng | [] | lynx | [] [] [] [] | m4 | [] [] [] | mailfromd | [] [] | mailutils | [] | make | [] [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] | midi-instruments | [] [] [] [] [] [] | minicom | [] [] | mkisofs | [] [] [] | myserver | [] | nano | [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] [] [] | pies | [] [] | pnmixer | [] [] [] | popt | [] [] [] [] [] [] [] | procps-ng | [] [] | procps-ng-man | [] | psmisc | [] [] [] [] | pspp | [] [] [] | pushover | [] | pwdutils | [] [] | pyspread | [] | radius | [] [] | recode | [] [] [] [] | recutils | [] [] [] | rpm | [] [] [] [] | rush | [] [] | sarg | | sed | [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] [] | skribilo | [] [] | solfege | [] [] [] [] | solfege-manual | [] | spotmachine | [] [] [] | sudo | [] [] [] [] [] | sudoers | [] [] [] [] | sysstat | [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | texinfo_document | [] | tigervnc | [] [] [] | tin | [] | tin-man | | tracgoogleappsa... | [] [] [] [] [] | trader | [] | util-linux | [] [] [] [] | ve | [] [] [] [] | vice | () () | vmm | | vorbis-tools | [] [] | wastesedge | | wcd | [] [] [] | wcd-man | [] | wdiff | [] [] [] [] | wget | [] [] [] | wyslij-po | [] [] | xboard | [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | +----------------------------------------------+ sv sw ta te tg th tr uk ur vi wa wo zh_CN 106 1 4 3 0 13 51 115 1 125 7 1 100 zh_HK zh_TW +-------------+ a2ps | | 30 aegis | | 9 anubis | | 19 aspell | | 29 bash | [] | 23 bfd | | 11 binutils | | 12 bison | [] | 18 bison-runtime | [] | 38 buzztrax | | 9 ccd2cue | | 10 ccide | | 17 cflow | | 16 clisp | | 10 coreutils | | 18 cpio | | 20 cppi | | 17 cpplib | [] | 19 cryptsetup | | 14 datamash | | 11 denemo | | 5 dfarc | | 17 dialog | [] | 42 dico | | 6 diffutils | | 22 dink | | 10 direvent | | 11 doodle | | 12 dos2unix | [] | 18 dos2unix-man | | 9 e2fsprogs | | 15 enscript | | 21 exif | | 27 fetchmail | | 19 findutils | | 29 flex | [] | 19 freedink | | 24 fusionforge | | 3 gas | | 5 gawk | | 13 gcal | | 8 gcc | | 2 gdbm | | 10 gettext-examples | [] [] | 40 gettext-runtime | [] [] | 35 gettext-tools | [] | 24 gjay | | 9 glunarclock | [] | 27 gnubiff | | 9 gnubik | | 19 gnucash | () | 6 gnuchess | | 11 gnulib | | 23 gnunet | | 1 gnunet-gtk | | 1 gold | | 7 gphoto2 | [] | 19 gprof | | 21 gramadoir | | 14 grep | [] | 31 grub | | 21 gsasl | [] | 19 gss | | 17 gst-plugins-bad | | 21 gst-plugins-base | | 27 gst-plugins-good | | 32 gst-plugins-ugly | | 34 gstreamer | [] | 32 gtick | | 19 gtkam | | 24 gtkspell | [] [] | 48 guix | | 2 guix-packages | | 0 gutenprint | | 15 hello | [] | 30 help2man | | 18 help2man-texi | | 5 hylafax | | 5 idutils | | 14 iso_15924 | [] | 23 iso_3166 | [] [] | 58 iso_3166_2 | | 9 iso_4217 | [] [] | 28 iso_639 | [] [] | 46 iso_639_3 | | 10 iso_639_5 | | 2 jwhois | [] | 20 kbd | | 17 klavaro | | 30 ld | [] | 15 leafpad | [] | 39 libc | [] | 24 libexif | | 10 libextractor | | 5 libgnutls | | 13 libgphoto2 | | 10 libgphoto2_port | [] | 19 libgsasl | | 18 libiconv | [] | 29 libidn | | 17 liferea | | 29 lilypond | | 11 lordsawar | | 3 lprng | | 3 lynx | | 19 m4 | [] | 22 mailfromd | | 4 mailutils | | 6 make | | 19 man-db | | 15 man-db-manpages | | 10 midi-instruments | [] | 43 minicom | [] | 17 mkisofs | | 13 myserver | | 9 nano | [] | 30 opcodes | | 12 parted | [] | 23 pies | | 4 pnmixer | | 9 popt | [] | 36 procps-ng | | 5 procps-ng-man | | 4 psmisc | [] | 22 pspp | | 13 pushover | | 6 pwdutils | | 8 pyspread | | 6 radius | | 9 recode | | 31 recutils | | 10 rpm | [] | 13 rush | | 10 sarg | | 4 sed | [] | 35 sharutils | | 13 shishi | | 7 skribilo | | 7 solfege | | 21 solfege-manual | | 9 spotmachine | | 11 sudo | | 26 sudoers | | 22 sysstat | | 23 tar | [] | 30 texinfo | | 17 texinfo_document | | 13 tigervnc | | 14 tin | [] | 7 tin-man | | 1 tracgoogleappsa... | [] | 22 trader | | 12 util-linux | | 13 ve | | 14 vice | | 1 vmm | | 3 vorbis-tools | | 13 wastesedge | | 3 wcd | | 8 wcd-man | | 3 wdiff | [] | 23 wget | | 21 wyslij-po | | 14 xboard | | 10 xdg-user-dirs | [] [] | 68 xkeyboard-config | [] | 28 +-------------+ 89 teams zh_HK zh_TW 166 domains 7 42 2809 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If Jun 2014 seems to be old, you may fetch a more recent copy of this 'ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at 'http://translationproject.org/extra/matrix.html'. 1.5 Using 'gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU 'gettext' in your package. Of course you have to respect the GNU Lesser General Public License which covers the use of the GNU 'gettext' library. This means in particular that even non-free programs can use 'libintl' as a shared library, whereas only free software can use 'libintl' as a static library or use modified versions of 'libintl'. Once the sources are changed appropriately and the setup can handle the use of 'gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact 'coordinator@translationproject.org' to make the '.pot' files available to the translation teams. gsequencer-3.1.3/libags_gui.sym0000644000175000017500000000450113622252234013440 00000000000000ags_dial_get_type ags_dial_value_changed ags_dial_set_value ags_dial_new ags_vlevel_box_get_type ags_vlevel_box_new ags_level_box_get_type ags_level_box_new ags_hlevel_box_get_type ags_hlevel_box_new ags_scale_box_get_type ags_scale_box_new ags_indicator_get_type ags_indicator_new ags_vled_array_get_type ags_vled_array_new ags_hindicator_get_type ags_hindicator_new ags_level_get_type ags_level_value_changed ags_level_new ags_ruler_get_type ags_ruler_new ags_hscale_box_get_type ags_hscale_box_new ags_vscale_box_get_type ags_vscale_box_new ags_scrolled_level_box_get_type ags_scrolled_level_box_new ags_scale_get_type ags_scale_value_changed ags_scale_new ags_scrolled_scale_box_get_type ags_scrolled_scale_box_new ags_expander_set_get_type ags_expander_set_child_alloc ags_expander_set_child_find ags_expander_set_set_flags ags_expander_set_add ags_expander_set_remove ags_expander_set_new ags_cartesian_get_type ags_plot_alloc ags_plot_free ags_cartesian_add_plot ags_cartesian_remove_plot ags_cartesian_linear_step_conversion_func ags_cartesian_linear_translate_func ags_cartesian_linear_x_small_scale_func ags_cartesian_linear_x_big_scale_func ags_cartesian_linear_y_small_scale_func ags_cartesian_linear_y_big_scale_func ags_cartesian_linear_x_label_func ags_cartesian_linear_y_label_func ags_cartesian_reallocate_label ags_cartesian_fill_label ags_cartesian_new ags_container_add_all ags_expander_get_type ags_expander_child_alloc ags_expander_child_find ags_expander_add ags_expander_remove ags_expander_new ags_vindicator_get_type ags_vindicator_new ags_led_array_get_type ags_led_array_set_led_count ags_led_array_unset_all ags_led_array_set_nth ags_led_array_new ags_led_get_type ags_led_set_active ags_led_unset_active ags_led_new ags_scrolled_piano_get_type ags_scrolled_piano_new ags_hled_array_get_type ags_hled_array_new ags_notebook_get_type ags_notebook_tab_alloc ags_notebook_tab_free ags_notebook_tab_set_data ags_notebook_tab_index ags_notebook_next_active_tab ags_notebook_add_tab ags_notebook_add_tab_with_label ags_notebook_insert_tab ags_notebook_insert_tab_with_label ags_notebook_remove_tab ags_notebook_remove_tab_with_data ags_notebook_new ags_piano_get_type ags_piano_key_code_to_note ags_piano_key_pressed ags_piano_key_released ags_piano_key_clicked ags_piano_get_active_key ags_piano_new ags_widget_cclosure_marshal_VOID__STRING_INT gsequencer-3.1.3/README0000644000175000017500000001202213613101164011451 00000000000000Advanced Gtk+ Sequencer ==== The gsequencer binary provides you a user interface. It allows you to play, capture and create music. There is a piano roll, automation and wave form editor. It has machines for playing drum samples, Soundfont2 sound containers and synthesizers. They usually can be connected to a MIDI input source (instrument). All sources need to be connected to the sink provided by AgsPanel, thus the properties dialog from machine's context menu is responsible. The engine is extensible by following plugin formats: LADSPA, DSSI and LV2. It has support for various audio backends like ALSA, Pulseaudio, JACK, OSSv4 and CoreAudio. Copyright (C) 2005-2020 Joël Krähemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". jkraehemann@gmail.com It is recommended to have a realtime kernel in conjunction with ags in order to do more computing expensive synthesis. Please visit http://rt.wiki.kernel.org for more information. Following site gives you advice in configuring ALSA http://www.alsa-project.org/main/index.php/Low_latency_howto You might want to disable systemd accounting. https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html $ systemd-run -p CPUAccounting=false -p MemoryAccounting=false -p TasksAccounting=false -p IOAccounting=false -p BlockIOAccounting=false --scope gsequencer If you have pulseaudio running you might run `gsequencer` with pasuspender like: $ pasuspender -- gsequencer Purpose ==== The Advanced Gtk+ Sequencer framework is related to audio computation by representing it within a tree structure. It does various abstraction and the base library can serve as fundament of any application. libags provides an application context and a threaded tree. Which is synchronized by hard-realtime fashion. In terms of deterministic dead-line. Each tic of the used threads has to fulfill its work in order to proceed. The file object might be used for light-weight composition or persistency. libags-audio is built upon libags and provides a tree of audio signals. They can be computed in parallel. One key feature is the nested recycling tree. It allows to share audio data across channels. Further it avoids to wedge the parallel tree. There is support for free plugin standards like LADPSA, DSSI and Lv2. So it does give support to read or write MIDI data. libags-gui is a standalone library providing additional Gtk+-2.0 widgets. GSequencer is the main application providing a Gtk+-2.0 GUI. Allowing you to edit or record notation. It is designed to be accessible you should be able to control the entire application by keyboard. Likewise it implements various Atk interfaces. The frontend to AGS requires to add machines by menubar and link them appropriately with properties dialog. It is available of the context menu. Note you can't create any loops within the tree. Build using mingw ==== The commands below might compile a native build of gsequencer on x86_64-mingw32 architecture using MinGW compiler assuming installing to home directory. To perform a parallel build using 8 threads, invoke following commands in shell: Follow the instructions on screen, edit configure.ac and Makefile.am or apply win32.patch. $ git clone git://git.sv.gnu.org/gnulib.git $ ./gnulib/gnulib-tool --import langinfo regex signal-h sigaction strings sys_types memcpy $ autoreconf -fi $ ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes ./configure --host=x86_64-w64-mingw32 --prefix=${HOME}/mingw64/target --disable-rt --enable-w32api --disable-alsa --disable-pulse --disable-jack --enable-wasapi --disable-x11 $ make -j8 $ make install General Notes on Licensing ==== The Advanced Gtk+ Sequencer code base uses copyright year ranges for its source files. There was much effort on implementing the API since 2005 as of today in year 2019. The source code was developed by Joël Krähemann and is the copyright holder. Third-party files of autotools permissive licensed see specific files for warranty disclaimer and a notice preservation requirement, copyright provided by http://www.fsf.org: * aclocal.m4 * acsite.m4 (missing copyright) * compile (missing copyright) * compile.guess * config.rpath * config.sub * configure * INSTALL * install-sh * ltmain.sh * Makefile.in * missing * mkinstalldirs * stamp-h1 * test-driver Notes on copyrighted files listed: * AUTHORS (Copyright (C) 2005-2018 Joël Krähemann, permissive) * COPYING (this is the GNU GPLv3+ license) * COPYING.docs (this is the GNU FDL-1.3 license) * COPYING.server (this is the GNU AGPL-3+ license) * COPYING.stk-4.3 (this is the STK-3.3 license) * ags_license_header (this is the GPLv3+ license header for *.c and *.h files) * depcomp (generated by autotools) * functional-system-tests.mk.in (generated by autotools) * stamp-h1 (generated by automake) gsequencer-3.1.3/libags_audio.pc.in0000644000175000017500000000077313613101103014147 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libags-audio Description: Advanced Gtk+ Sequencer audio processing engine URL: http://nongnu.org/gsequencer Version: @PACKAGE_VERSION@ Requires: uuid >= 1.0.1 libxml-2.0 >= 2.8.0 sndfile >= 1.0.25 libinstpatch-1.0 >= 1.0 gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0 gio-2.0 >= 2.56.0 libsoup-2.4 >= 2.52.0 libags >= 0.7.62 Libs: -L${libdir} -lags_audio Cflags: -I${includedir} gsequencer-3.1.3/Makefile.in0000644000175000017500001242601613622252207012662 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ #Copyright (C) 2005-2020 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # Copyright (C) 2005-2019 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # Copyright (C) 2005-2019 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @WITH_W32API_TRUE@am__append_1 = -DAGS_W32API=1 -DHAVE_GLIB_2_6=1 -DHAVE_GLIB_2_44=1 -DHAVE_GLIB_2_54=1 -DAGS_LIBRARY_SUFFIX=\".dll\" -DAGS_VECTORIZED_BUILTIN_FUNCTIONS=1 -include $(top_srcdir)/ags/config.h -I$(top_srcdir) -I$(top_srcdir)/lib -I/usr/lib/gcc/x86_64-w64-mingw32/8.3-win32/include-fixed -I/usr/lib/gcc/x86_64-w64-mingw32/8.3-win32/include -I/usr/x86_64-w64-mingw32/include -I/home/joelkraehemann/mingw64/target/include -I/home/joelkraehemann/mingw64/target/include/dssi -Werror=return-type -Werror=uninitialized -Werror=maybe-uninitialized @WITH_OSXAPI_TRUE@@WITH_W32API_FALSE@am__append_2 = -fnested-functions -DAGS_OSXAPI=1 -I/usr/include -I/opt/local/include -I/opt/local/include/dssi -DAGS_LIBRARY_SUFFIX=\".dylib\" @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_3 = -include errno.h -DAGS_VECTORIZED_BUILTIN_FUNCTIONS=1 -I/usr/include -DAGS_LIBRARY_SUFFIX=\".so\" -Werror=return-type -Werror=uninitialized -Werror=maybe-uninitialized @WITH_W32API_FALSE@am__append_4 = -D_FORTIFY_SOURCE=2 -Wall -Wformat -Werror=format-security @WITH_LIBINSTPATCH_TRUE@am__append_5 = -DAGS_WITH_LIBINSTPATCH=1 @WITH_W32API_TRUE@am__append_6 = -no-undefined -L$(top_builddir)/lib -lgnu @WITH_VST3_TRUE@am__append_7 = libags_vst.la bin_PROGRAMS = gsequencer$(EXEEXT) midi2xml$(EXEEXT) @HAVE_INTROSPECTION_TRUE@am__append_8 = Ags-3.0.gir AgsAudio-3.0.gir \ @HAVE_INTROSPECTION_TRUE@ AgsGui-3.0.gir @HAVE_INTROSPECTION_TRUE@am__append_9 = $(gir_DATA) $(typelib_DATA) @AGS_WITH_PUBLIC_LIBGSEQUENCER_TRUE@am__append_10 = libgsequencer.pc @WITH_W32API_TRUE@am__append_11 = -Wl,--export-all-symbols,--out-implib=libags.dll.a @WITH_OSXAPI_TRUE@@WITH_W32API_FALSE@am__append_12 = -export-symbols libags.sym -Wl,-install_name,libags.dylib @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_13 = -export-symbols libags.sym -Wl,-soname,libags.so @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_14 = -ldl -lcrypt @WITH_W32API_TRUE@am__append_15 = -Wl,--export-all-symbols,--out-implib=libags_thread.dll.a @WITH_OSXAPI_TRUE@@WITH_W32API_FALSE@am__append_16 = -export-symbols libags_thread.sym -Wl,-install_name,libags_thread.dylib @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_17 = -export-symbols libags_thread.sym -Wl,-soname,libags_thread.so @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_18 = -ldl -lcrypt @WITH_W32API_TRUE@am__append_19 = -Wl,--export-all-symbols,--out-implib=libags_server.dll.a @WITH_OSXAPI_TRUE@@WITH_W32API_FALSE@am__append_20 = -export-symbols libags_server.sym -Wl,-install_name,libags_server.dylib @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_21 = -export-symbols libags_server.sym -Wl,-soname,libags_server.so @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_22 = -ldl -lcrypt @WITH_W32API_TRUE@am__append_23 = -Wl,--export-all-symbols,--out-implib=libags_audio.dll.a @WITH_OSXAPI_TRUE@@WITH_W32API_FALSE@am__append_24 = -export-symbols libags_audio.sym -Wl,-install_name,libags_audio.dylib @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_25 = -export-symbols libags_audio.sym -Wl,-soname,libags_audio.so @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_26 = -ldl @WITH_W32API_TRUE@am__append_27 = -Wl,--export-all-symbols,--out-implib=libags_gui.dll.a @WITH_OSXAPI_TRUE@@WITH_W32API_FALSE@am__append_28 = -export-symbols libags_gui.sym -Wl,-install_name,libags_gui.dylib @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_29 = -export-symbols libags_gui.sym -Wl,-soname,libags_gui.so @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_30 = -ldl @WITH_W32API_TRUE@am__append_31 = -Wl,--export-all-symbols,--out-implib=libgsequencer.dll.a @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_32 = -ldl @WITH_VST3_TRUE@@WITH_W32API_TRUE@am__append_33 = -Wl,--export-all-symbols,--out-implib=libags_vst.dll.a @WITH_OSXAPI_TRUE@@WITH_VST3_TRUE@@WITH_W32API_FALSE@am__append_34 = -export-symbols libags_vst.sym -Wl,-install_name,libags_vst.dylib @WITH_OSXAPI_FALSE@@WITH_VST3_TRUE@@WITH_W32API_FALSE@am__append_35 = -export-symbols libags_vst.sym -Wl,-soname,libags_vst.so @WITH_OSXAPI_FALSE@@WITH_VST3_TRUE@@WITH_W32API_FALSE@am__append_36 = -ldl @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_37 = -ldl check_PROGRAMS = ags_buffer_util_test$(EXEEXT) \ ags_complex_test$(EXEEXT) ags_conversion_test$(EXEEXT) \ ags_log_test$(EXEEXT) ags_time_test$(EXEEXT) \ ags_turtle_manager_test$(EXEEXT) ags_turtle_test$(EXEEXT) \ ags_application_context_test$(EXEEXT) ags_config_test$(EXEEXT) \ ags_connectable_test$(EXEEXT) ags_soundcard_test$(EXEEXT) \ ags_destroy_worker_test$(EXEEXT) \ ags_returnable_thread_test$(EXEEXT) ags_task_test$(EXEEXT) \ ags_thread_test$(EXEEXT) ags_thread_pool_test$(EXEEXT) \ ags_worker_thread_test$(EXEEXT) ags_file_test$(EXEEXT) \ ags_file_id_ref_test$(EXEEXT) ags_file_launch_test$(EXEEXT) \ ags_file_lookup_test$(EXEEXT) \ ags_server_application_context_test$(EXEEXT) \ ags_server_test$(EXEEXT) ags_controller_test$(EXEEXT) \ ags_front_controller_test$(EXEEXT) \ ags_authentication_manager_test$(EXEEXT) \ ags_business_group_manager_test$(EXEEXT) \ ags_certificate_manager_test$(EXEEXT) \ ags_password_store_manager_test$(EXEEXT) \ ags_xml_authentication_test$(EXEEXT) \ ags_xml_business_group_test$(EXEEXT) \ ags_xml_certificate_test$(EXEEXT) \ ags_xml_password_store_test$(EXEEXT) \ ags_security_context_test$(EXEEXT) \ ags_base_plugin_test$(EXEEXT) ags_dssi_manager_test$(EXEEXT) \ ags_dssi_plugin_test$(EXEEXT) \ ags_ladspa_conversion_test$(EXEEXT) \ ags_ladspa_manager_test$(EXEEXT) \ ags_lv2_conversion_test$(EXEEXT) ags_lv2_manager_test$(EXEEXT) \ ags_lv2_option_manager_test$(EXEEXT) \ ags_lv2_plugin_test$(EXEEXT) ags_lv2_preset_test$(EXEEXT) \ ags_lv2_uri_map_manager_test$(EXEEXT) \ ags_lv2_urid_manager_test$(EXEEXT) \ ags_lv2_worker_manager_test$(EXEEXT) \ ags_lv2ui_manager_test$(EXEEXT) ags_lv2ui_plugin_test$(EXEEXT) \ ags_plugin_port_test$(EXEEXT) \ ags_audio_application_context_test$(EXEEXT) \ ags_devin_test$(EXEEXT) ags_devout_test$(EXEEXT) \ ags_fifoout_test$(EXEEXT) ags_midiin_test$(EXEEXT) \ ags_audio_test$(EXEEXT) ags_playback_domain_test$(EXEEXT) \ ags_playback_test$(EXEEXT) ags_preset_test$(EXEEXT) \ ags_channel_test$(EXEEXT) ags_input_test$(EXEEXT) \ ags_output_test$(EXEEXT) ags_recycling_test$(EXEEXT) \ ags_audio_signal_test$(EXEEXT) \ ags_audio_buffer_util_test$(EXEEXT) \ ags_char_buffer_util_test$(EXEEXT) \ ags_filter_util_test$(EXEEXT) ags_fm_synth_util_test$(EXEEXT) \ ags_fourier_transform_util_test$(EXEEXT) \ ags_recall_test$(EXEEXT) ags_recall_channel_test$(EXEEXT) \ ags_recall_channel_run_test$(EXEEXT) \ ags_recall_container_test$(EXEEXT) \ ags_recall_dependency_test$(EXEEXT) \ ags_recall_id_test$(EXEEXT) ags_recall_recycling_test$(EXEEXT) \ ags_recycling_context_test$(EXEEXT) \ ags_synth_generator_test$(EXEEXT) ags_port_test$(EXEEXT) \ ags_pattern_test$(EXEEXT) ags_notation_test$(EXEEXT) \ ags_note_test$(EXEEXT) ags_automation_test$(EXEEXT) \ ags_acceleration_test$(EXEEXT) ags_wave_test$(EXEEXT) \ ags_buffer_test$(EXEEXT) ags_midi_test$(EXEEXT) \ ags_track_test$(EXEEXT) ags_midi_buffer_util_test$(EXEEXT) \ ags_midi_builder_test$(EXEEXT) \ ags_osc_buffer_util_test$(EXEEXT) ags_osc_client_test$(EXEEXT) \ ags_osc_connection_test$(EXEEXT) ags_osc_message_test$(EXEEXT) \ ags_osc_server_test$(EXEEXT) \ ags_osc_websocket_connection_test$(EXEEXT) \ ags_osc_xmlrpc_message_test$(EXEEXT) \ ags_osc_xmlrpc_server_test$(EXEEXT) \ ags_osc_action_controller_test$(EXEEXT) \ ags_osc_config_controller_test$(EXEEXT) \ ags_osc_front_controller_test$(EXEEXT) \ ags_osc_renew_controller_test$(EXEEXT) \ ags_osc_info_controller_test$(EXEEXT) \ ags_osc_meter_controller_test$(EXEEXT) \ ags_osc_node_controller_test$(EXEEXT) \ ags_osc_status_controller_test$(EXEEXT) \ ags_osc_xmlrpc_controller_test$(EXEEXT) \ ags_analyse_audio_signal_test$(EXEEXT) \ ags_analyse_channel_test$(EXEEXT) \ ags_buffer_audio_signal_test$(EXEEXT) \ ags_buffer_channel_test$(EXEEXT) \ ags_capture_wave_audio_test$(EXEEXT) \ ags_capture_wave_channel_test$(EXEEXT) \ ags_copy_audio_signal_test$(EXEEXT) \ ags_copy_channel_test$(EXEEXT) \ ags_copy_pattern_audio_test$(EXEEXT) \ ags_copy_pattern_channel_test$(EXEEXT) \ ags_count_beats_audio_test$(EXEEXT) \ ags_delay_audio_test$(EXEEXT) \ ags_envelope_audio_signal_test$(EXEEXT) \ ags_envelope_channel_test$(EXEEXT) \ ags_eq10_audio_signal_test$(EXEEXT) \ ags_eq10_channel_test$(EXEEXT) \ ags_feed_audio_signal_test$(EXEEXT) \ ags_mute_audio_test$(EXEEXT) \ ags_mute_audio_signal_test$(EXEEXT) \ ags_mute_channel_test$(EXEEXT) \ ags_peak_audio_signal_test$(EXEEXT) \ ags_peak_channel_test$(EXEEXT) ags_play_audio_test$(EXEEXT) \ ags_play_audio_signal_test$(EXEEXT) \ ags_play_channel_test$(EXEEXT) \ ags_play_wave_audio_test$(EXEEXT) \ ags_play_wave_channel_test$(EXEEXT) \ ags_prepare_audio_signal_test$(EXEEXT) \ ags_record_midi_audio_test$(EXEEXT) \ ags_route_dssi_audio_test$(EXEEXT) \ ags_route_lv2_audio_test$(EXEEXT) \ ags_stream_audio_signal_test$(EXEEXT) \ ags_volume_audio_signal_test$(EXEEXT) \ ags_volume_channel_test$(EXEEXT) ags_add_audio_test$(EXEEXT) \ ags_add_audio_signal_test$(EXEEXT) \ ags_add_effect_test$(EXEEXT) ags_add_note_test$(EXEEXT) \ ags_add_soundcard_test$(EXEEXT) ags_apply_bpm_test$(EXEEXT) \ ags_apply_presets_test$(EXEEXT) \ ags_apply_sequencer_length_test$(EXEEXT) \ ags_apply_synth_test$(EXEEXT) ags_apply_tact_test$(EXEEXT) \ ags_cancel_audio_test$(EXEEXT) \ ags_cancel_channel_test$(EXEEXT) \ ags_clear_audio_signal_test$(EXEEXT) \ ags_clear_buffer_test$(EXEEXT) ags_crop_note_test$(EXEEXT) \ ags_export_output_test$(EXEEXT) \ ags_free_selection_test$(EXEEXT) \ ags_link_channel_test$(EXEEXT) ags_move_note_test$(EXEEXT) \ ags_remove_audio_test$(EXEEXT) \ ags_remove_audio_signal_test$(EXEEXT) \ ags_remove_note_test$(EXEEXT) \ ags_remove_soundcard_test$(EXEEXT) \ ags_reset_amplitude_test$(EXEEXT) ags_reset_peak_test$(EXEEXT) \ ags_resize_audio_test$(EXEEXT) \ ags_seek_soundcard_test$(EXEEXT) \ ags_set_audio_channels_test$(EXEEXT) \ ags_set_buffer_size_test$(EXEEXT) ags_set_device_test$(EXEEXT) \ ags_set_format_test$(EXEEXT) ags_set_muted_test$(EXEEXT) \ ags_set_samplerate_test$(EXEEXT) ags_start_audio_test$(EXEEXT) \ ags_start_channel_test$(EXEEXT) \ ags_xorg_application_context_test$(EXEEXT) $(am__EXEEXT_1) #TODO:JK: fix tests after refactoring # functional tests @RUN_FUNCTIONAL_TESTS_TRUE@am__append_38 = \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_server_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_audio_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_pitch_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_fourier_transform_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_osc_server_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_osc_xmlrpc_server_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_machine_add_and_destroy_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_machine_link_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_line_member_add_and_destroy_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_notation_editor_workflow_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_automation_editor_workflow_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_panel_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_mixer_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_drum_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_matrix_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_synth_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_ffplayer_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_notation_edit_test \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_audio_config_test @FAST_TEST_MODE_TRUE@@RUN_FUNCTIONAL_TESTS_TRUE@am__append_39 = -DAGS_FAST_FUNCTIONAL_TESTS=1 @WITH_LIBINSTPATCH_TRUE@am__append_40 = \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch.h \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_sample.h \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_dls2_reader.h \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_gig_reader.h \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_sf2_reader.h @WITH_LIBINSTPATCH_TRUE@am__append_41 = \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch.c \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_sample.c \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_dls2_reader.c \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_gig_reader.c \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/ags_ipatch_sf2_reader.c @WITH_LIBINSTPATCH_TRUE@am__append_42 = \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/task/ags_open_sf2_instrument.h \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/task/ags_open_sf2_sample.h @WITH_LIBINSTPATCH_TRUE@am__append_43 = \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/task/ags_open_sf2_instrument.c \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/task/ags_open_sf2_sample.c @WITH_LIBINSTPATCH_TRUE@am__append_44 = \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_callbacks.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bridge_callbacks.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bridge.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bulk_input_callbacks.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bulk_input.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_line_callbacks.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_line.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_pad_callbacks.h \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_pad.h @WITH_LIBINSTPATCH_TRUE@am__append_45 = \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_callbacks.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bridge.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bridge_callbacks.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bulk_input.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_bulk_input_callbacks.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_line.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_line_callbacks.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_pad.c \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/ags_ffplayer_input_pad_callbacks.c @WITH_OSXAPI_FALSE@@WITH_W32API_FALSE@am__append_46 = -ldl subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__nobase_include_HEADERS_DIST) \ $(noinst_HEADERS) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = libags.pc libags_audio.pc libags_gui.pc \ libgsequencer.pc CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ "$(DESTDIR)$(libgsequencerdir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(includedir)" @RUN_FUNCTIONAL_TESTS_TRUE@am__EXEEXT_1 = ags_functional_server_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_audio_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_pitch_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_fourier_transform_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_osc_server_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_osc_xmlrpc_server_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_machine_add_and_destroy_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_machine_link_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_line_member_add_and_destroy_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_notation_editor_workflow_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_automation_editor_workflow_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_panel_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_mixer_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_drum_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_matrix_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_synth_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_ffplayer_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_notation_edit_test$(EXEEXT) \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags_functional_audio_config_test$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } LTLIBRARIES = $(lib_LTLIBRARIES) $(libgsequencer_LTLIBRARIES) am__DEPENDENCIES_1 = libags_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__objects_1 = am__dirstamp = $(am__leading_dot)dirstamp am__objects_2 = $(am__objects_1) ags/lib/libags_la-ags_buffer_util.lo \ ags/lib/libags_la-ags_complex.lo \ ags/lib/libags_la-ags_conversion.lo \ ags/lib/libags_la-ags_endian.lo \ ags/lib/libags_la-ags_function.lo ags/lib/libags_la-ags_log.lo \ ags/lib/libags_la-ags_regex.lo \ ags/lib/libags_la-ags_solver_matrix.lo \ ags/lib/libags_la-ags_solver_vector.lo \ ags/lib/libags_la-ags_string_util.lo \ ags/lib/libags_la-ags_time.lo ags/lib/libags_la-ags_turtle.lo \ ags/lib/libags_la-ags_turtle_manager.lo \ ags/lib/libags_la-ags_uuid.lo am__objects_3 = $(am__objects_1) \ ags/util/libags_la-ags_destroy_util.lo \ ags/util/libags_la-ags_id_generator.lo \ ags/util/libags_la-ags_list_util.lo \ ags/util/libags_la-ags_soundcard_helper.lo am__objects_4 = $(am__objects_1) \ ags/object/libags_la-ags_applicable.lo \ ags/object/libags_la-ags_application_context.lo \ ags/object/libags_la-ags_config.lo \ ags/object/libags_la-ags_connectable.lo \ ags/object/libags_la-ags_countable.lo \ ags/object/libags_la-ags_cursor.lo \ ags/object/libags_la-ags_globals.lo \ ags/object/libags_la-ags_main_loop.lo \ ags/object/libags_la-ags_marshal.lo \ ags/object/libags_la-ags_mutable.lo \ ags/object/libags_la-ags_plugin.lo \ ags/object/libags_la-ags_portlet.lo \ ags/object/libags_la-ags_priority.lo \ ags/object/libags_la-ags_seekable.lo \ ags/object/libags_la-ags_sequencer.lo \ ags/object/libags_la-ags_soundcard.lo \ ags/object/libags_la-ags_sound_server.lo \ ags/object/libags_la-ags_tactable.lo am__objects_5 = $(am__objects_1) ags/file/libags_la-ags_file.lo \ ags/file/libags_la-ags_file_id_ref.lo \ ags/file/libags_la-ags_file_launch.lo \ ags/file/libags_la-ags_file_link.lo \ ags/file/libags_la-ags_file_lookup.lo am_libags_la_OBJECTS = $(am__objects_2) $(am__objects_3) \ $(am__objects_4) $(am__objects_5) libags_la_OBJECTS = $(am_libags_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libags_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libags_la_CFLAGS) \ $(CFLAGS) $(libags_la_LDFLAGS) $(LDFLAGS) -o $@ libags_audio_la_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libags_audio_la_SOURCES_DIST = ags/audio/ags_acceleration.c \ ags/audio/ags_audio.c \ ags/audio/ags_audio_application_context.c \ ags/audio/ags_audio_buffer_util.c ags/audio/ags_audio_signal.c \ ags/audio/ags_automation.c ags/audio/ags_buffer.c \ ags/audio/ags_channel.c ags/audio/ags_char_buffer_util.c \ ags/audio/ags_devout.c ags/audio/ags_devin.c \ ags/audio/ags_diatonic_scale.c ags/audio/ags_input.c \ ags/audio/ags_filter_util.c ags/audio/ags_fifoout.c \ ags/audio/ags_fm_synth_util.c \ ags/audio/ags_fourier_transform_util.c \ ags/audio/ags_frequency_map.c \ ags/audio/ags_frequency_map_manager.c \ ags/audio/ags_generic_recall_channel_run.c \ ags/audio/ags_generic_recall_recycling.c \ ags/audio/ags_lfo_synth_util.c ags/audio/ags_midi.c \ ags/audio/ags_midiin.c ags/audio/ags_notation.c \ ags/audio/ags_note.c ags/audio/ags_output.c \ ags/audio/ags_pattern.c ags/audio/ags_playback.c \ ags/audio/ags_playback_domain.c ags/audio/ags_port.c \ ags/audio/ags_preset.c ags/audio/ags_recall_audio.c \ ags/audio/ags_recall_audio_run.c \ ags/audio/ags_recall_audio_signal.c ags/audio/ags_recall.c \ ags/audio/ags_recall_channel.c \ ags/audio/ags_recall_channel_run.c \ ags/audio/ags_recall_container.c \ ags/audio/ags_recall_dependency.c \ ags/audio/ags_recall_factory.c ags/audio/ags_recall_dssi.c \ ags/audio/ags_recall_dssi_run.c ags/audio/ags_recall_id.c \ ags/audio/ags_recall_ladspa.c \ ags/audio/ags_recall_ladspa_run.c ags/audio/ags_recall_lv2.c \ ags/audio/ags_recall_lv2_run.c \ ags/audio/ags_recall_recycling.c ags/audio/ags_recycling.c \ ags/audio/ags_recycling_context.c \ ags/audio/ags_sound_provider.c ags/audio/ags_sequencer_util.c \ ags/audio/ags_soundcard_util.c ags/audio/ags_synth_generator.c \ ags/audio/ags_synth_util.c ags/audio/ags_track.c \ ags/audio/ags_wave.c ags/audio/thread/ags_audio_loop.c \ ags/audio/thread/ags_audio_thread.c \ ags/audio/thread/ags_channel_thread.c \ ags/audio/thread/ags_sequencer_thread.c \ ags/audio/thread/ags_soundcard_thread.c \ ags/audio/thread/ags_export_thread.c \ ags/audio/thread/ags_sf2_loader.c \ ags/audio/thread/ags_sfz_loader.c \ ags/audio/thread/ags_wave_loader.c \ ags/audio/file/ags_audio_container.c \ ags/audio/file/ags_audio_file.c \ ags/audio/file/ags_audio_file_link.c \ ags/audio/file/ags_sound_container.c \ ags/audio/file/ags_sound_resource.c \ ags/audio/file/ags_sndfile.c ags/audio/file/ags_sfz_file.c \ ags/audio/file/ags_sfz_group.c ags/audio/file/ags_sfz_region.c \ ags/audio/file/ags_sfz_sample.c ags/audio/file/ags_ipatch.c \ ags/audio/file/ags_ipatch_sample.c \ ags/audio/file/ags_ipatch_dls2_reader.c \ ags/audio/file/ags_ipatch_gig_reader.c \ ags/audio/file/ags_ipatch_sf2_reader.c \ ags/audio/midi/ags_midi_buffer_util.c \ ags/audio/midi/ags_midi_util.c \ ags/audio/midi/ags_midi_builder.c \ ags/audio/midi/ags_midi_file.c \ ags/audio/midi/ags_midi_parser.c \ ags/audio/osc/ags_osc_buffer_util.c \ ags/audio/osc/ags_osc_builder.c ags/audio/osc/ags_osc_client.c \ ags/audio/osc/ags_osc_connection.c \ ags/audio/osc/ags_osc_message.c ags/audio/osc/ags_osc_parser.c \ ags/audio/osc/ags_osc_response.c \ ags/audio/osc/ags_osc_server.c ags/audio/osc/ags_osc_util.c \ ags/audio/osc/ags_osc_websocket_connection.c \ ags/audio/osc/ags_osc_xmlrpc_message.c \ ags/audio/osc/ags_osc_xmlrpc_server.c \ ags/audio/osc/controller/ags_osc_controller.c \ ags/audio/osc/controller/ags_osc_action_controller.c \ ags/audio/osc/controller/ags_osc_config_controller.c \ ags/audio/osc/controller/ags_osc_export_controller.c \ ags/audio/osc/controller/ags_osc_front_controller.c \ ags/audio/osc/controller/ags_osc_info_controller.c \ ags/audio/osc/controller/ags_osc_meter_controller.c \ ags/audio/osc/controller/ags_osc_node_controller.c \ ags/audio/osc/controller/ags_osc_plugin_controller.c \ ags/audio/osc/controller/ags_osc_renew_controller.c \ ags/audio/osc/controller/ags_osc_status_controller.c \ ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c \ ags/audio/jack/ags_jack_client.c \ ags/audio/jack/ags_jack_midiin.c \ ags/audio/jack/ags_jack_devout.c \ ags/audio/jack/ags_jack_devin.c ags/audio/jack/ags_jack_port.c \ ags/audio/jack/ags_jack_server.c \ ags/audio/pulse/ags_pulse_client.c \ ags/audio/pulse/ags_pulse_devout.c \ ags/audio/pulse/ags_pulse_devin.c \ ags/audio/pulse/ags_pulse_port.c \ ags/audio/pulse/ags_pulse_server.c \ ags/audio/core-audio/ags_core_audio_client.c \ ags/audio/core-audio/ags_core_audio_midiin.c \ ags/audio/core-audio/ags_core_audio_devout.c \ ags/audio/core-audio/ags_core_audio_devin.c \ ags/audio/core-audio/ags_core_audio_port.c \ ags/audio/core-audio/ags_core_audio_server.c \ ags/audio/audio-unit/ags_audio_unit_client.c \ ags/audio/audio-unit/ags_audio_unit_devin.c \ ags/audio/audio-unit/ags_audio_unit_devout.c \ ags/audio/audio-unit/ags_audio_unit_port.c \ ags/audio/audio-unit/ags_audio_unit_server.c \ ags/audio/wasapi/ags_wasapi_devout.c \ ags/audio/wasapi/ags_wasapi_devin.c \ ags/audio/task/ags_add_audio.c \ ags/audio/task/ags_add_audio_signal.c \ ags/audio/task/ags_add_effect.c ags/audio/task/ags_add_note.c \ ags/audio/task/ags_add_soundcard.c \ ags/audio/task/ags_apply_presets.c \ ags/audio/task/ags_apply_sound_config.c \ ags/audio/task/ags_apply_synth.c \ ags/audio/task/ags_cancel_audio.c \ ags/audio/task/ags_cancel_channel.c \ ags/audio/task/ags_clear_audio_signal.c \ ags/audio/task/ags_clear_buffer.c \ ags/audio/task/ags_crop_note.c \ ags/audio/task/ags_export_output.c \ ags/audio/task/ags_free_selection.c \ ags/audio/task/ags_link_channel.c \ ags/audio/task/ags_move_note.c ags/audio/task/ags_open_file.c \ ags/audio/task/ags_open_single_file.c \ ags/audio/task/ags_open_wave.c \ ags/audio/task/ags_remove_audio.c \ ags/audio/task/ags_remove_audio_signal.c \ ags/audio/task/ags_remove_note.c \ ags/audio/task/ags_remove_soundcard.c \ ags/audio/task/ags_resize_audio.c \ ags/audio/task/ags_seek_soundcard.c \ ags/audio/task/ags_set_audio_channels.c \ ags/audio/task/ags_set_buffer_size.c \ ags/audio/task/ags_set_device.c \ ags/audio/task/ags_set_format.c \ ags/audio/task/ags_set_samplerate.c \ ags/audio/task/ags_start_audio.c \ ags/audio/task/ags_start_channel.c \ ags/audio/task/ags_start_sequencer.c \ ags/audio/task/ags_start_soundcard.c \ ags/audio/task/ags_stop_sequencer.c \ ags/audio/task/ags_stop_soundcard.c \ ags/audio/task/ags_switch_buffer_flag.c \ ags/audio/task/ags_tic_device.c \ ags/audio/task/ags_toggle_pattern_bit.c \ ags/audio/task/ags_apply_bpm.c \ ags/audio/task/ags_apply_sequencer_length.c \ ags/audio/task/ags_apply_tact.c \ ags/audio/task/ags_reset_amplitude.c \ ags/audio/task/ags_reset_note.c \ ags/audio/task/ags_reset_peak.c ags/audio/task/ags_set_muted.c \ ags/audio/task/ags_open_sf2_instrument.c \ ags/audio/task/ags_open_sf2_sample.c \ ags/audio/recall/ags_analyse_audio_signal.c \ ags/audio/recall/ags_analyse_channel.c \ ags/audio/recall/ags_analyse_channel_run.c \ ags/audio/recall/ags_analyse_recycling.c \ ags/audio/recall/ags_buffer_audio_signal.c \ ags/audio/recall/ags_buffer_channel.c \ ags/audio/recall/ags_buffer_channel_run.c \ ags/audio/recall/ags_buffer_recycling.c \ ags/audio/recall/ags_capture_wave_audio.c \ ags/audio/recall/ags_capture_wave_audio_run.c \ ags/audio/recall/ags_capture_wave_channel.c \ ags/audio/recall/ags_capture_wave_channel_run.c \ ags/audio/recall/ags_copy_audio_signal.c \ ags/audio/recall/ags_copy_channel.c \ ags/audio/recall/ags_copy_channel_run.c \ ags/audio/recall/ags_copy_pattern_audio.c \ ags/audio/recall/ags_copy_pattern_audio_run.c \ ags/audio/recall/ags_copy_pattern_channel.c \ ags/audio/recall/ags_copy_pattern_channel_run.c \ ags/audio/recall/ags_copy_recycling.c \ ags/audio/recall/ags_count_beats_audio.c \ ags/audio/recall/ags_count_beats_audio_run.c \ ags/audio/recall/ags_delay_audio.c \ ags/audio/recall/ags_delay_audio_run.c \ ags/audio/recall/ags_envelope_audio_signal.c \ ags/audio/recall/ags_envelope_channel.c \ ags/audio/recall/ags_envelope_channel_run.c \ ags/audio/recall/ags_envelope_recycling.c \ ags/audio/recall/ags_eq10_audio_signal.c \ ags/audio/recall/ags_eq10_channel.c \ ags/audio/recall/ags_eq10_channel_run.c \ ags/audio/recall/ags_eq10_recycling.c \ ags/audio/recall/ags_feed_audio_signal.c \ ags/audio/recall/ags_feed_channel.c \ ags/audio/recall/ags_feed_channel_run.c \ ags/audio/recall/ags_feed_recycling.c \ ags/audio/recall/ags_lfo_audio_signal.c \ ags/audio/recall/ags_lfo_channel.c \ ags/audio/recall/ags_lfo_channel_run.c \ ags/audio/recall/ags_lfo_recycling.c \ ags/audio/recall/ags_loop_channel.c \ ags/audio/recall/ags_loop_channel_run.c \ ags/audio/recall/ags_mute_audio.c \ ags/audio/recall/ags_mute_audio_run.c \ ags/audio/recall/ags_mute_audio_signal.c \ ags/audio/recall/ags_mute_channel.c \ ags/audio/recall/ags_mute_channel_run.c \ ags/audio/recall/ags_mute_recycling.c \ ags/audio/recall/ags_peak_audio_signal.c \ ags/audio/recall/ags_peak_channel.c \ ags/audio/recall/ags_peak_channel_run.c \ ags/audio/recall/ags_peak_recycling.c \ ags/audio/recall/ags_play_audio.c \ ags/audio/recall/ags_play_audio_signal.c \ ags/audio/recall/ags_play_channel.c \ ags/audio/recall/ags_play_channel_run.c \ ags/audio/recall/ags_play_channel_run_master.c \ ags/audio/recall/ags_play_dssi_audio.c \ ags/audio/recall/ags_play_dssi_audio_run.c \ ags/audio/recall/ags_play_lv2_audio.c \ ags/audio/recall/ags_play_lv2_audio_run.c \ ags/audio/recall/ags_play_notation_audio.c \ ags/audio/recall/ags_play_notation_audio_run.c \ ags/audio/recall/ags_play_recycling.c \ ags/audio/recall/ags_play_wave_audio.c \ ags/audio/recall/ags_play_wave_audio_run.c \ ags/audio/recall/ags_play_wave_channel.c \ ags/audio/recall/ags_play_wave_channel_run.c \ ags/audio/recall/ags_prepare_audio_signal.c \ ags/audio/recall/ags_prepare_channel.c \ ags/audio/recall/ags_prepare_channel_run.c \ ags/audio/recall/ags_prepare_recycling.c \ ags/audio/recall/ags_record_midi_audio.c \ ags/audio/recall/ags_record_midi_audio_run.c \ ags/audio/recall/ags_route_dssi_audio.c \ ags/audio/recall/ags_route_dssi_audio_run.c \ ags/audio/recall/ags_route_lv2_audio.c \ ags/audio/recall/ags_route_lv2_audio_run.c \ ags/audio/recall/ags_rt_stream_audio_signal.c \ ags/audio/recall/ags_rt_stream_channel.c \ ags/audio/recall/ags_rt_stream_channel_run.c \ ags/audio/recall/ags_rt_stream_recycling.c \ ags/audio/recall/ags_stream_audio_signal.c \ ags/audio/recall/ags_stream_channel.c \ ags/audio/recall/ags_stream_channel_run.c \ ags/audio/recall/ags_stream_recycling.c \ ags/audio/recall/ags_volume_audio_signal.c \ ags/audio/recall/ags_volume_channel.c \ ags/audio/recall/ags_volume_channel_run.c \ ags/audio/recall/ags_volume_recycling.c \ ags/plugin/ags_base_plugin.c ags/plugin/ags_dssi_manager.c \ ags/plugin/ags_dssi_plugin.c \ ags/plugin/ags_ladspa_conversion.c \ ags/plugin/ags_ladspa_manager.c ags/plugin/ags_ladspa_plugin.c \ ags/plugin/ags_lv2_conversion.c ags/plugin/ags_lv2_manager.c \ ags/plugin/ags_lv2_turtle_parser.c ags/plugin/ags_lv2_plugin.c \ ags/plugin/ags_lv2_preset_manager.c \ ags/plugin/ags_lv2_preset.c ags/plugin/ags_lv2_log_manager.c \ ags/plugin/ags_lv2_event_manager.c \ ags/plugin/ags_lv2_option_manager.c \ ags/plugin/ags_lv2_uri_map_manager.c \ ags/plugin/ags_lv2_urid_manager.c \ ags/plugin/ags_lv2_worker_manager.c \ ags/plugin/ags_lv2_worker.c ags/plugin/ags_lv2ui_manager.c \ ags/plugin/ags_lv2ui_plugin.c ags/plugin/ags_plugin_port.c am__objects_6 = $(am__objects_1) \ ags/audio/libags_audio_la-ags_acceleration.lo \ ags/audio/libags_audio_la-ags_audio.lo \ ags/audio/libags_audio_la-ags_audio_application_context.lo \ ags/audio/libags_audio_la-ags_audio_buffer_util.lo \ ags/audio/libags_audio_la-ags_audio_signal.lo \ ags/audio/libags_audio_la-ags_automation.lo \ ags/audio/libags_audio_la-ags_buffer.lo \ ags/audio/libags_audio_la-ags_channel.lo \ ags/audio/libags_audio_la-ags_char_buffer_util.lo \ ags/audio/libags_audio_la-ags_devout.lo \ ags/audio/libags_audio_la-ags_devin.lo \ ags/audio/libags_audio_la-ags_diatonic_scale.lo \ ags/audio/libags_audio_la-ags_input.lo \ ags/audio/libags_audio_la-ags_filter_util.lo \ ags/audio/libags_audio_la-ags_fifoout.lo \ ags/audio/libags_audio_la-ags_fm_synth_util.lo \ ags/audio/libags_audio_la-ags_fourier_transform_util.lo \ ags/audio/libags_audio_la-ags_frequency_map.lo \ ags/audio/libags_audio_la-ags_frequency_map_manager.lo \ ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo \ ags/audio/libags_audio_la-ags_generic_recall_recycling.lo \ ags/audio/libags_audio_la-ags_lfo_synth_util.lo \ ags/audio/libags_audio_la-ags_midi.lo \ ags/audio/libags_audio_la-ags_midiin.lo \ ags/audio/libags_audio_la-ags_notation.lo \ ags/audio/libags_audio_la-ags_note.lo \ ags/audio/libags_audio_la-ags_output.lo \ ags/audio/libags_audio_la-ags_pattern.lo \ ags/audio/libags_audio_la-ags_playback.lo \ ags/audio/libags_audio_la-ags_playback_domain.lo \ ags/audio/libags_audio_la-ags_port.lo \ ags/audio/libags_audio_la-ags_preset.lo \ ags/audio/libags_audio_la-ags_recall_audio.lo \ ags/audio/libags_audio_la-ags_recall_audio_run.lo \ ags/audio/libags_audio_la-ags_recall_audio_signal.lo \ ags/audio/libags_audio_la-ags_recall.lo \ ags/audio/libags_audio_la-ags_recall_channel.lo \ ags/audio/libags_audio_la-ags_recall_channel_run.lo \ ags/audio/libags_audio_la-ags_recall_container.lo \ ags/audio/libags_audio_la-ags_recall_dependency.lo \ ags/audio/libags_audio_la-ags_recall_factory.lo \ ags/audio/libags_audio_la-ags_recall_dssi.lo \ ags/audio/libags_audio_la-ags_recall_dssi_run.lo \ ags/audio/libags_audio_la-ags_recall_id.lo \ ags/audio/libags_audio_la-ags_recall_ladspa.lo \ ags/audio/libags_audio_la-ags_recall_ladspa_run.lo \ ags/audio/libags_audio_la-ags_recall_lv2.lo \ ags/audio/libags_audio_la-ags_recall_lv2_run.lo \ ags/audio/libags_audio_la-ags_recall_recycling.lo \ ags/audio/libags_audio_la-ags_recycling.lo \ ags/audio/libags_audio_la-ags_recycling_context.lo \ ags/audio/libags_audio_la-ags_sound_provider.lo \ ags/audio/libags_audio_la-ags_sequencer_util.lo \ ags/audio/libags_audio_la-ags_soundcard_util.lo \ ags/audio/libags_audio_la-ags_synth_generator.lo \ ags/audio/libags_audio_la-ags_synth_util.lo \ ags/audio/libags_audio_la-ags_track.lo \ ags/audio/libags_audio_la-ags_wave.lo am__objects_7 = $(am__objects_1) \ ags/audio/thread/libags_audio_la-ags_audio_loop.lo \ ags/audio/thread/libags_audio_la-ags_audio_thread.lo \ ags/audio/thread/libags_audio_la-ags_channel_thread.lo \ ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo \ ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo \ ags/audio/thread/libags_audio_la-ags_export_thread.lo \ ags/audio/thread/libags_audio_la-ags_sf2_loader.lo \ ags/audio/thread/libags_audio_la-ags_sfz_loader.lo \ ags/audio/thread/libags_audio_la-ags_wave_loader.lo @WITH_LIBINSTPATCH_TRUE@am__objects_8 = ags/audio/file/libags_audio_la-ags_ipatch.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/libags_audio_la-ags_ipatch_sample.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo am__objects_9 = $(am__objects_1) \ ags/audio/file/libags_audio_la-ags_audio_container.lo \ ags/audio/file/libags_audio_la-ags_audio_file.lo \ ags/audio/file/libags_audio_la-ags_audio_file_link.lo \ ags/audio/file/libags_audio_la-ags_sound_container.lo \ ags/audio/file/libags_audio_la-ags_sound_resource.lo \ ags/audio/file/libags_audio_la-ags_sndfile.lo \ ags/audio/file/libags_audio_la-ags_sfz_file.lo \ ags/audio/file/libags_audio_la-ags_sfz_group.lo \ ags/audio/file/libags_audio_la-ags_sfz_region.lo \ ags/audio/file/libags_audio_la-ags_sfz_sample.lo \ $(am__objects_8) am__objects_10 = $(am__objects_1) \ ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo \ ags/audio/midi/libags_audio_la-ags_midi_util.lo \ ags/audio/midi/libags_audio_la-ags_midi_builder.lo \ ags/audio/midi/libags_audio_la-ags_midi_file.lo \ ags/audio/midi/libags_audio_la-ags_midi_parser.lo am__objects_11 = $(am__objects_1) \ ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo \ ags/audio/osc/libags_audio_la-ags_osc_builder.lo \ ags/audio/osc/libags_audio_la-ags_osc_client.lo \ ags/audio/osc/libags_audio_la-ags_osc_connection.lo \ ags/audio/osc/libags_audio_la-ags_osc_message.lo \ ags/audio/osc/libags_audio_la-ags_osc_parser.lo \ ags/audio/osc/libags_audio_la-ags_osc_response.lo \ ags/audio/osc/libags_audio_la-ags_osc_server.lo \ ags/audio/osc/libags_audio_la-ags_osc_util.lo \ ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo \ ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo \ ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo am__objects_12 = ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo \ ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo am__objects_13 = ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo am__objects_14 = $(am__objects_1) \ ags/audio/jack/libags_audio_la-ags_jack_client.lo \ ags/audio/jack/libags_audio_la-ags_jack_midiin.lo \ ags/audio/jack/libags_audio_la-ags_jack_devout.lo \ ags/audio/jack/libags_audio_la-ags_jack_devin.lo \ ags/audio/jack/libags_audio_la-ags_jack_port.lo \ ags/audio/jack/libags_audio_la-ags_jack_server.lo am__objects_15 = $(am__objects_1) \ ags/audio/pulse/libags_audio_la-ags_pulse_client.lo \ ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo \ ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo \ ags/audio/pulse/libags_audio_la-ags_pulse_port.lo \ ags/audio/pulse/libags_audio_la-ags_pulse_server.lo am__objects_16 = $(am__objects_1) \ ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo \ ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo \ ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo \ ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo \ ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo \ ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo am__objects_17 = $(am__objects_1) \ ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo \ ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo \ ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo \ ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo \ ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo am__objects_18 = $(am__objects_1) \ ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo \ ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo @WITH_LIBINSTPATCH_TRUE@am__objects_19 = ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo am__objects_20 = $(am__objects_1) \ ags/audio/task/libags_audio_la-ags_add_audio.lo \ ags/audio/task/libags_audio_la-ags_add_audio_signal.lo \ ags/audio/task/libags_audio_la-ags_add_effect.lo \ ags/audio/task/libags_audio_la-ags_add_note.lo \ ags/audio/task/libags_audio_la-ags_add_soundcard.lo \ ags/audio/task/libags_audio_la-ags_apply_presets.lo \ ags/audio/task/libags_audio_la-ags_apply_sound_config.lo \ ags/audio/task/libags_audio_la-ags_apply_synth.lo \ ags/audio/task/libags_audio_la-ags_cancel_audio.lo \ ags/audio/task/libags_audio_la-ags_cancel_channel.lo \ ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo \ ags/audio/task/libags_audio_la-ags_clear_buffer.lo \ ags/audio/task/libags_audio_la-ags_crop_note.lo \ ags/audio/task/libags_audio_la-ags_export_output.lo \ ags/audio/task/libags_audio_la-ags_free_selection.lo \ ags/audio/task/libags_audio_la-ags_link_channel.lo \ ags/audio/task/libags_audio_la-ags_move_note.lo \ ags/audio/task/libags_audio_la-ags_open_file.lo \ ags/audio/task/libags_audio_la-ags_open_single_file.lo \ ags/audio/task/libags_audio_la-ags_open_wave.lo \ ags/audio/task/libags_audio_la-ags_remove_audio.lo \ ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo \ ags/audio/task/libags_audio_la-ags_remove_note.lo \ ags/audio/task/libags_audio_la-ags_remove_soundcard.lo \ ags/audio/task/libags_audio_la-ags_resize_audio.lo \ ags/audio/task/libags_audio_la-ags_seek_soundcard.lo \ ags/audio/task/libags_audio_la-ags_set_audio_channels.lo \ ags/audio/task/libags_audio_la-ags_set_buffer_size.lo \ ags/audio/task/libags_audio_la-ags_set_device.lo \ ags/audio/task/libags_audio_la-ags_set_format.lo \ ags/audio/task/libags_audio_la-ags_set_samplerate.lo \ ags/audio/task/libags_audio_la-ags_start_audio.lo \ ags/audio/task/libags_audio_la-ags_start_channel.lo \ ags/audio/task/libags_audio_la-ags_start_sequencer.lo \ ags/audio/task/libags_audio_la-ags_start_soundcard.lo \ ags/audio/task/libags_audio_la-ags_stop_sequencer.lo \ ags/audio/task/libags_audio_la-ags_stop_soundcard.lo \ ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo \ ags/audio/task/libags_audio_la-ags_tic_device.lo \ ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo \ ags/audio/task/libags_audio_la-ags_apply_bpm.lo \ ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo \ ags/audio/task/libags_audio_la-ags_apply_tact.lo \ ags/audio/task/libags_audio_la-ags_reset_amplitude.lo \ ags/audio/task/libags_audio_la-ags_reset_note.lo \ ags/audio/task/libags_audio_la-ags_reset_peak.lo \ ags/audio/task/libags_audio_la-ags_set_muted.lo \ $(am__objects_19) am__objects_21 = $(am__objects_1) \ ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_analyse_channel.lo \ ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo \ ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_buffer_channel.lo \ ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo \ ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo \ ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo \ ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_copy_channel.lo \ ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo \ ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo \ ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_copy_recycling.lo \ ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo \ ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_delay_audio.lo \ ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_envelope_channel.lo \ ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo \ ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_eq10_channel.lo \ ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo \ ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_feed_channel.lo \ ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_feed_recycling.lo \ ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_lfo_channel.lo \ ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo \ ags/audio/recall/libags_audio_la-ags_loop_channel.lo \ ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_mute_audio.lo \ ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_mute_channel.lo \ ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_mute_recycling.lo \ ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_peak_channel.lo \ ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_peak_recycling.lo \ ags/audio/recall/libags_audio_la-ags_play_audio.lo \ ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_play_channel.lo \ ags/audio/recall/libags_audio_la-ags_play_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo \ ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo \ ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo \ ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo \ ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_play_recycling.lo \ ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo \ ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo \ ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_prepare_channel.lo \ ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo \ ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo \ ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo \ ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo \ ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo \ ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo \ ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo \ ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_stream_channel.lo \ ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_stream_recycling.lo \ ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo \ ags/audio/recall/libags_audio_la-ags_volume_channel.lo \ ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo \ ags/audio/recall/libags_audio_la-ags_volume_recycling.lo am__objects_22 = $(am__objects_1) \ ags/plugin/libags_audio_la-ags_base_plugin.lo \ ags/plugin/libags_audio_la-ags_dssi_manager.lo \ ags/plugin/libags_audio_la-ags_dssi_plugin.lo \ ags/plugin/libags_audio_la-ags_ladspa_conversion.lo \ ags/plugin/libags_audio_la-ags_ladspa_manager.lo \ ags/plugin/libags_audio_la-ags_ladspa_plugin.lo \ ags/plugin/libags_audio_la-ags_lv2_conversion.lo \ ags/plugin/libags_audio_la-ags_lv2_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo \ ags/plugin/libags_audio_la-ags_lv2_plugin.lo \ ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_preset.lo \ ags/plugin/libags_audio_la-ags_lv2_log_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_event_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_option_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo \ ags/plugin/libags_audio_la-ags_lv2_worker.lo \ ags/plugin/libags_audio_la-ags_lv2ui_manager.lo \ ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo \ ags/plugin/libags_audio_la-ags_plugin_port.lo am_libags_audio_la_OBJECTS = $(am__objects_6) $(am__objects_7) \ $(am__objects_9) $(am__objects_10) $(am__objects_11) \ $(am__objects_12) $(am__objects_13) $(am__objects_14) \ $(am__objects_15) $(am__objects_16) $(am__objects_17) \ $(am__objects_18) $(am__objects_20) $(am__objects_21) \ $(am__objects_22) libags_audio_la_OBJECTS = $(am_libags_audio_la_OBJECTS) libags_audio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libags_audio_la_CFLAGS) $(CFLAGS) $(libags_audio_la_LDFLAGS) \ $(LDFLAGS) -o $@ libags_gui_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__objects_23 = $(am__objects_1) \ ags/widget/libags_gui_la-ags_cartesian.lo \ ags/widget/libags_gui_la-ags_dial.lo \ ags/widget/libags_gui_la-ags_expander.lo \ ags/widget/libags_gui_la-ags_expander_set.lo \ ags/widget/libags_gui_la-ags_hindicator.lo \ ags/widget/libags_gui_la-ags_hled_array.lo \ ags/widget/libags_gui_la-ags_indicator.lo \ ags/widget/libags_gui_la-ags_led.lo \ ags/widget/libags_gui_la-ags_led_array.lo \ ags/widget/libags_gui_la-ags_level.lo \ ags/widget/libags_gui_la-ags_level_box.lo \ ags/widget/libags_gui_la-ags_hlevel_box.lo \ ags/widget/libags_gui_la-ags_vlevel_box.lo \ ags/widget/libags_gui_la-ags_notebook.lo \ ags/widget/libags_gui_la-ags_piano.lo \ ags/widget/libags_gui_la-ags_scrolled_piano.lo \ ags/widget/libags_gui_la-ags_scale.lo \ ags/widget/libags_gui_la-ags_scale_box.lo \ ags/widget/libags_gui_la-ags_vscale_box.lo \ ags/widget/libags_gui_la-ags_hscale_box.lo \ ags/widget/libags_gui_la-ags_scrolled_scale_box.lo \ ags/widget/libags_gui_la-ags_scrolled_level_box.lo \ ags/widget/libags_gui_la-ags_ruler.lo \ ags/widget/libags_gui_la-ags_vindicator.lo \ ags/widget/libags_gui_la-ags_vled_array.lo \ ags/widget/libags_gui_la-ags_widget_marshal.lo \ ags/widget/libags_gui_la-ags_container.lo am_libags_gui_la_OBJECTS = $(am__objects_23) libags_gui_la_OBJECTS = $(am_libags_gui_la_OBJECTS) libags_gui_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libags_gui_la_CFLAGS) \ $(CFLAGS) $(libags_gui_la_LDFLAGS) $(LDFLAGS) -o $@ libags_server_la_DEPENDENCIES = libags_thread.la libags.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_24 = $(am__objects_1) \ ags/server/libags_server_la-ags_registry.lo \ ags/server/libags_server_la-ags_server.lo \ ags/server/libags_server_la-ags_server_application_context.lo \ ags/server/libags_server_la-ags_server_status.lo \ ags/server/libags_server_la-ags_service_provider.lo am__objects_25 = $(am__objects_1) \ ags/server/security/libags_server_la-ags_auth_security_context.lo \ ags/server/security/libags_server_la-ags_authentication.lo \ ags/server/security/libags_server_la-ags_authentication_manager.lo \ ags/server/security/libags_server_la-ags_business_group.lo \ ags/server/security/libags_server_la-ags_business_group_manager.lo \ ags/server/security/libags_server_la-ags_certificate.lo \ ags/server/security/libags_server_la-ags_certificate_manager.lo \ ags/server/security/libags_server_la-ags_password_store.lo \ ags/server/security/libags_server_la-ags_password_store_manager.lo \ ags/server/security/libags_server_la-ags_security_context.lo \ ags/server/security/libags_server_la-ags_xml_authentication.lo \ ags/server/security/libags_server_la-ags_xml_business_group.lo \ ags/server/security/libags_server_la-ags_xml_certificate.lo \ ags/server/security/libags_server_la-ags_xml_password_store.lo am__objects_26 = $(am__objects_1) \ ags/server/controller/libags_server_la-ags_controller.lo \ ags/server/controller/libags_server_la-ags_front_controller.lo \ ags/server/controller/libags_server_la-ags_plugin_controller.lo am_libags_server_la_OBJECTS = $(am__objects_24) $(am__objects_25) \ $(am__objects_26) libags_server_la_OBJECTS = $(am_libags_server_la_OBJECTS) libags_server_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libags_server_la_CFLAGS) $(CFLAGS) \ $(libags_server_la_LDFLAGS) $(LDFLAGS) -o $@ libags_thread_la_DEPENDENCIES = libags.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_27 = $(am__objects_1) \ ags/thread/libags_thread_la-ags_concurrency_provider.lo \ ags/thread/libags_thread_la-ags_destroy_worker.lo \ ags/thread/libags_thread_la-ags_generic_main_loop.lo \ ags/thread/libags_thread_la-ags_message_delivery.lo \ ags/thread/libags_thread_la-ags_message_envelope.lo \ ags/thread/libags_thread_la-ags_message_queue.lo \ ags/thread/libags_thread_la-ags_returnable_thread.lo \ ags/thread/libags_thread_la-ags_task_completion.lo \ ags/thread/libags_thread_la-ags_task.lo \ ags/thread/libags_thread_la-ags_task_launcher.lo \ ags/thread/libags_thread_la-ags_thread_application_context.lo \ ags/thread/libags_thread_la-ags_thread_pool.lo \ ags/thread/libags_thread_la-ags_thread.lo \ ags/thread/libags_thread_la-ags_timestamp.lo \ ags/thread/libags_thread_la-ags_worker_thread.lo am_libags_thread_la_OBJECTS = $(am__objects_27) libags_thread_la_OBJECTS = $(am_libags_thread_la_OBJECTS) libags_thread_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libags_thread_la_CFLAGS) $(CFLAGS) \ $(libags_thread_la_LDFLAGS) $(LDFLAGS) -o $@ @WITH_VST3_TRUE@libags_vst_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @WITH_VST3_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__libags_vst_la_SOURCES_DIST = \ ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp \ ags/vst3-capi/util/ags_vst_string_util.cpp \ ags/vst3-capi/base/source/ags_vst_fbuffer.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp am__objects_28 = $(am__objects_1) \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo \ ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo \ ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo \ ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo \ ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo \ ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo \ ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo \ ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo \ ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo \ ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo @WITH_VST3_TRUE@am_libags_vst_la_OBJECTS = $(am__objects_28) libags_vst_la_OBJECTS = $(am_libags_vst_la_OBJECTS) libags_vst_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) $(libags_vst_la_LDFLAGS) \ $(LDFLAGS) -o $@ @WITH_VST3_TRUE@am_libags_vst_la_rpath = -rpath $(libdir) libgsequencer_la_DEPENDENCIES = libags_audio.la libags_server.la \ libags_gui.la libags_thread.la libags.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libgsequencer_la_SOURCES_DIST = ags/X/ags_animation_window.h \ ags/X/ags_automation_editor_callbacks.h \ ags/X/ags_automation_editor.h \ ags/X/ags_automation_window_callbacks.h \ ags/X/ags_automation_window.h \ ags/X/ags_audio_preferences_callbacks.h \ ags/X/ags_audio_preferences.h \ ags/X/ags_bulk_member_callbacks.h ags/X/ags_bulk_member.h \ ags/X/ags_connection_editor_callbacks.h \ ags/X/ags_connection_editor.h ags/X/ags_context_menu.h \ ags/X/ags_dssi_browser_callbacks.h ags/X/ags_dssi_browser.h \ ags/X/ags_effect_bridge_callbacks.h ags/X/ags_effect_bridge.h \ ags/X/ags_effect_bulk_callbacks.h ags/X/ags_effect_bulk.h \ ags/X/ags_effect_line_callbacks.h ags/X/ags_effect_line.h \ ags/X/ags_effect_pad_callbacks.h ags/X/ags_effect_pad.h \ ags/X/ags_effect_separator.h \ ags/X/ags_export_soundcard_callbacks.h \ ags/X/ags_export_soundcard.h \ ags/X/ags_export_window_callbacks.h ags/X/ags_export_window.h \ ags/X/ags_generic_preferences_callbacks.h \ ags/X/ags_generic_preferences.h \ ags/X/ags_input_collection_editor_callbacks.h \ ags/X/ags_input_collection_editor.h \ ags/X/ags_input_editor_callbacks.h ags/X/ags_input_editor.h \ ags/X/ags_input_listing_editor_callbacks.h \ ags/X/ags_input_listing_editor.h \ ags/X/ags_ladspa_browser_callbacks.h \ ags/X/ags_ladspa_browser.h ags/X/ags_lv2_browser_callbacks.h \ ags/X/ags_lv2_browser.h ags/X/ags_line_callbacks.h \ ags/X/ags_line_editor_callbacks.h ags/X/ags_line_editor.h \ ags/X/ags_line.h ags/X/ags_line_member_callbacks.h \ ags/X/ags_line_member_editor_callbacks.h \ ags/X/ags_line_member_editor.h ags/X/ags_line_member.h \ ags/X/ags_link_collection_editor_callbacks.h \ ags/X/ags_link_collection_editor.h \ ags/X/ags_link_editor_callbacks.h ags/X/ags_link_editor.h \ ags/X/ags_listing_editor_callbacks.h \ ags/X/ags_listing_editor.h ags/X/ags_machine_callbacks.h \ ags/X/ags_machine_editor_callbacks.h \ ags/X/ags_machine_editor.h ags/X/ags_machine.h \ ags/X/ags_menu_action_callbacks.h ags/X/ags_menu_bar.h \ ags/X/ags_midi_dialog_callbacks.h ags/X/ags_midi_dialog.h \ ags/X/ags_midi_preferences.h \ ags/X/ags_midi_preferences_callbacks.h \ ags/X/ags_navigation_callbacks.h ags/X/ags_navigation.h \ ags/X/ags_notation_editor_callbacks.h \ ags/X/ags_notation_editor.h \ ags/X/ags_osc_server_preferences_callbacks.h \ ags/X/ags_osc_server_preferences.h \ ags/X/ags_output_collection_editor_callbacks.h \ ags/X/ags_output_collection_editor.h \ ags/X/ags_output_editor_callbacks.h ags/X/ags_output_editor.h \ ags/X/ags_output_listing_editor_callbacks.h \ ags/X/ags_output_listing_editor.h ags/X/ags_pad_callbacks.h \ ags/X/ags_pad_editor_callbacks.h ags/X/ags_pad_editor.h \ ags/X/ags_pad.h ags/X/ags_performance_preferences_callbacks.h \ ags/X/ags_performance_preferences.h \ ags/X/ags_playback_window_callbacks.h \ ags/X/ags_playback_window.h \ ags/X/ags_plugin_browser_callbacks.h \ ags/X/ags_plugin_browser.h \ ags/X/ags_plugin_preferences_callbacks.h \ ags/X/ags_plugin_preferences.h \ ags/X/ags_preferences_callbacks.h ags/X/ags_preferences.h \ ags/X/ags_property_collection_editor_callbacks.h \ ags/X/ags_property_collection_editor.h \ ags/X/ags_property_editor_callbacks.h \ ags/X/ags_property_editor.h \ ags/X/ags_property_listing_editor.h ags/X/ags_resize_editor.h \ ags/X/ags_sequencer_editor_callbacks.h \ ags/X/ags_sequencer_editor.h \ ags/X/ags_server_preferences_callbacks.h \ ags/X/ags_server_preferences.h ags/X/ags_sheet_window.h \ ags/X/ags_sheet_window_callbacks.h ags/X/ags_sheet_editor.h \ ags/X/ags_sheet_editor_callbacks.h \ ags/X/ags_soundcard_editor_callbacks.h \ ags/X/ags_soundcard_editor.h ags/X/ags_ui_provider.h \ ags/X/ags_wave_window_callbacks.h ags/X/ags_wave_window.h \ ags/X/ags_wave_editor_callbacks.h ags/X/ags_wave_editor.h \ ags/X/ags_window.h ags/X/ags_window_callbacks.h \ ags/X/ags_xorg_application_context.h \ ags/X/osc/controller/ags_ui_osc_renew_controller.h \ ags/X/file/ags_simple_file.h ags/X/task/ags_simple_file_read.h \ ags/X/task/ags_simple_file_write.h \ ags/X/import/ags_midi_import_wizard.h \ ags/X/import/ags_midi_import_wizard_callbacks.h \ ags/X/import/ags_track_collection.h \ ags/X/import/ags_track_collection_callbacks.h \ ags/X/import/ags_track_collection_mapper.h \ ags/X/import/ags_track_collection_mapper_callbacks.h \ ags/X/export/ags_midi_export_wizard.h \ ags/X/export/ags_midi_export_wizard_callbacks.h \ ags/X/export/ags_machine_collection.h \ ags/X/export/ags_machine_collection_callbacks.h \ ags/X/export/ags_machine_collection_entry.h \ ags/X/export/ags_machine_collection_entry_callbacks.h \ ags/X/export/ags_wave_export_dialog.h \ ags/X/export/ags_wave_export_dialog_callbacks.h \ ags/X/machine/ags_audiorec.h \ ags/X/machine/ags_audiorec_callbacks.h \ ags/X/machine/ags_cell_pattern_callbacks.h \ ags/X/machine/ags_cell_pattern.h \ ags/X/machine/ags_desk_callbacks.h ags/X/machine/ags_desk.h \ ags/X/machine/ags_desk_input_pad_callbacks.h \ ags/X/machine/ags_desk_input_pad.h \ ags/X/machine/ags_drum_callbacks.h ags/X/machine/ags_drum.h \ ags/X/machine/ags_drum_input_line_callbacks.h \ ags/X/machine/ags_drum_input_line.h \ ags/X/machine/ags_drum_input_pad_callbacks.h \ ags/X/machine/ags_drum_input_pad.h \ ags/X/machine/ags_drum_output_line_callbacks.h \ ags/X/machine/ags_drum_output_line.h \ ags/X/machine/ags_drum_output_pad_callbacks.h \ ags/X/machine/ags_drum_output_pad.h \ ags/X/machine/ags_dssi_bridge_callbacks.h \ ags/X/machine/ags_dssi_bridge.h \ ags/X/machine/ags_equalizer10.h \ ags/X/machine/ags_equalizer10_callbacks.h \ ags/X/machine/ags_fm_oscillator_callbacks.h \ ags/X/machine/ags_fm_oscillator.h \ ags/X/machine/ags_fm_syncsynth.h \ ags/X/machine/ags_fm_syncsynth_callbacks.h \ ags/X/machine/ags_fm_synth.h \ ags/X/machine/ags_fm_synth_callbacks.h \ ags/X/machine/ags_fm_synth_input_pad.h \ ags/X/machine/ags_fm_synth_input_line.h \ ags/X/machine/ags_fm_synth_input_line_callbacks.h \ ags/X/machine/ags_ladspa_bridge_callbacks.h \ ags/X/machine/ags_ladspa_bridge.h \ ags/X/machine/ags_live_dssi_bridge_callbacks.h \ ags/X/machine/ags_live_dssi_bridge.h \ ags/X/machine/ags_live_lv2_bridge_callbacks.h \ ags/X/machine/ags_live_lv2_bridge.h \ ags/X/machine/ags_lv2_bridge_callbacks.h \ ags/X/machine/ags_lv2_bridge.h \ ags/X/machine/ags_matrix_callbacks.h \ ags/X/machine/ags_matrix.h \ ags/X/machine/ags_matrix_bridge_callbacks.h \ ags/X/machine/ags_matrix_bridge.h \ ags/X/machine/ags_matrix_bulk_input_callbacks.h \ ags/X/machine/ags_matrix_bulk_input.h \ ags/X/machine/ags_mixer_callbacks.h ags/X/machine/ags_mixer.h \ ags/X/machine/ags_mixer_input_line.h \ ags/X/machine/ags_mixer_input_pad.h \ ags/X/machine/ags_oscillator_callbacks.h \ ags/X/machine/ags_oscillator.h \ ags/X/machine/ags_panel_callbacks.h ags/X/machine/ags_panel.h \ ags/X/machine/ags_panel_input_line.h \ ags/X/machine/ags_panel_input_line_callbacks.h \ ags/X/machine/ags_panel_input_pad.h \ ags/X/machine/ags_pattern_box_callbacks.h \ ags/X/machine/ags_pattern_box.h \ ags/X/machine/ags_pitch_sampler.h \ ags/X/machine/ags_pitch_sampler_callbacks.h \ ags/X/machine/ags_pitch_sampler_file.h \ ags/X/machine/ags_pitch_sampler_file_callbacks.h \ ags/X/machine/ags_synth_callbacks.h \ ags/X/machine/ags_syncsynth.h \ ags/X/machine/ags_syncsynth_callbacks.h \ ags/X/machine/ags_synth.h ags/X/machine/ags_synth_input_line.h \ ags/X/machine/ags_synth_input_line_callbacks.h \ ags/X/machine/ags_synth_input_pad.h \ ags/X/machine/ags_spectrometer.h \ ags/X/machine/ags_spectrometer_callbacks.h \ ags/X/machine/ags_ffplayer_callbacks.h \ ags/X/machine/ags_ffplayer.h \ ags/X/machine/ags_ffplayer_bridge_callbacks.h \ ags/X/machine/ags_ffplayer_bridge.h \ ags/X/machine/ags_ffplayer_bulk_input_callbacks.h \ ags/X/machine/ags_ffplayer_bulk_input.h \ ags/X/machine/ags_ffplayer_input_line_callbacks.h \ ags/X/machine/ags_ffplayer_input_line.h \ ags/X/machine/ags_ffplayer_input_pad_callbacks.h \ ags/X/machine/ags_ffplayer_input_pad.h \ ags/X/editor/ags_automation_edit_callbacks.h \ ags/X/editor/ags_automation_edit_box.h \ ags/X/editor/ags_automation_edit.h \ ags/X/editor/ags_automation_meta_callbacks.h \ ags/X/editor/ags_automation_meta.h \ ags/X/editor/ags_automation_toolbar_callbacks.h \ ags/X/editor/ags_automation_toolbar.h \ ags/X/editor/ags_crop_note_dialog_callbacks.h \ ags/X/editor/ags_crop_note_dialog.h \ ags/X/editor/ags_envelope_dialog_callbacks.h \ ags/X/editor/ags_envelope_dialog.h \ ags/X/editor/ags_envelope_editor_callbacks.h \ ags/X/editor/ags_envelope_editor.h \ ags/X/editor/ags_envelope_info_callbacks.h \ ags/X/editor/ags_envelope_info.h \ ags/X/editor/ags_machine_radio_button.h \ ags/X/editor/ags_machine_radio_button_callbacks.h \ ags/X/editor/ags_machine_selection.h \ ags/X/editor/ags_machine_selector_callbacks.h \ ags/X/editor/ags_machine_selector.h \ ags/X/editor/ags_move_note_dialog_callbacks.h \ ags/X/editor/ags_move_note_dialog.h \ ags/X/editor/ags_notation_edit_callbacks.h \ ags/X/editor/ags_notation_edit.h \ ags/X/editor/ags_notation_meta_callbacks.h \ ags/X/editor/ags_notation_meta.h \ ags/X/editor/ags_notation_toolbar_callbacks.h \ ags/X/editor/ags_notation_toolbar.h \ ags/X/editor/ags_pattern_envelope_callbacks.h \ ags/X/editor/ags_pattern_envelope.h \ ags/X/editor/ags_position_automation_cursor_dialog.h \ ags/X/editor/ags_position_automation_cursor_dialog_callbacks.h \ ags/X/editor/ags_position_notation_cursor_dialog.h \ ags/X/editor/ags_position_notation_cursor_dialog_callbacks.h \ ags/X/editor/ags_position_wave_cursor_dialog.h \ ags/X/editor/ags_position_wave_cursor_dialog_callbacks.h \ ags/X/editor/ags_ramp_acceleration_dialog.h \ ags/X/editor/ags_ramp_acceleration_dialog_callbacks.h \ ags/X/editor/ags_scrolled_automation_edit_box.h \ ags/X/editor/ags_scrolled_wave_edit_box.h \ ags/X/editor/ags_select_acceleration_dialog.h \ ags/X/editor/ags_select_acceleration_dialog_callbacks.h \ ags/X/editor/ags_select_buffer_dialog.h \ ags/X/editor/ags_select_buffer_dialog_callbacks.h \ ags/X/editor/ags_select_note_dialog.h \ ags/X/editor/ags_select_note_dialog_callbacks.h \ ags/X/editor/ags_sheet_edit.h \ ags/X/editor/ags_sheet_edit_callbacks.h \ ags/X/editor/ags_sheet_toolbar.h \ ags/X/editor/ags_sheet_toolbar_callbacks.h \ ags/X/editor/ags_vautomation_edit_box.h \ ags/X/editor/ags_vwave_edit_box.h \ ags/X/editor/ags_wave_edit_callbacks.h \ ags/X/editor/ags_wave_edit.h ags/X/editor/ags_wave_edit_box.h \ ags/X/editor/ags_wave_meta_callbacks.h \ ags/X/editor/ags_wave_meta.h \ ags/X/editor/ags_wave_toolbar_callbacks.h \ ags/X/editor/ags_wave_toolbar.h ags/X/ags_animation_window.c \ ags/X/ags_automation_editor.c \ ags/X/ags_automation_editor_callbacks.c \ ags/X/ags_automation_window.c \ ags/X/ags_automation_window_callbacks.c \ ags/X/ags_audio_preferences.c \ ags/X/ags_audio_preferences_callbacks.c \ ags/X/ags_bulk_member.c ags/X/ags_bulk_member_callbacks.c \ ags/X/ags_connection_editor_callbacks.c \ ags/X/ags_connection_editor.c ags/X/ags_context_menu.c \ ags/X/ags_dssi_browser_callbacks.c ags/X/ags_dssi_browser.c \ ags/X/ags_effect_bridge.c ags/X/ags_effect_bridge_callbacks.c \ ags/X/ags_effect_bulk.c ags/X/ags_effect_bulk_callbacks.c \ ags/X/ags_effect_line.c ags/X/ags_effect_line_callbacks.c \ ags/X/ags_effect_pad.c ags/X/ags_effect_pad_callbacks.c \ ags/X/ags_effect_separator.c ags/X/ags_export_soundcard.c \ ags/X/ags_export_soundcard_callbacks.c \ ags/X/ags_export_window.c ags/X/ags_export_window_callbacks.c \ ags/X/ags_generic_preferences.c \ ags/X/ags_generic_preferences_callbacks.c \ ags/X/ags_ladspa_browser.c \ ags/X/ags_ladspa_browser_callbacks.c ags/X/ags_lv2_browser.c \ ags/X/ags_lv2_browser_callbacks.c \ ags/X/ags_input_collection_editor_callbacks.c \ ags/X/ags_input_collection_editor.c \ ags/X/ags_input_editor_callbacks.c ags/X/ags_input_editor.c \ ags/X/ags_input_listing_editor_callbacks.c \ ags/X/ags_input_listing_editor.c ags/X/ags_line.c \ ags/X/ags_line_callbacks.c ags/X/ags_line_editor.c \ ags/X/ags_line_editor_callbacks.c ags/X/ags_line_member.c \ ags/X/ags_line_member_callbacks.c \ ags/X/ags_line_member_editor.c \ ags/X/ags_line_member_editor_callbacks.c \ ags/X/ags_link_collection_editor.c \ ags/X/ags_link_collection_editor_callbacks.c \ ags/X/ags_link_editor.c ags/X/ags_link_editor_callbacks.c \ ags/X/ags_listing_editor.c \ ags/X/ags_listing_editor_callbacks.c ags/X/ags_machine.c \ ags/X/ags_machine_callbacks.c ags/X/ags_machine_editor.c \ ags/X/ags_machine_editor_callbacks.c \ ags/X/ags_menu_action_callbacks.c ags/X/ags_menu_bar.c \ ags/X/ags_midi_dialog.c ags/X/ags_midi_dialog_callbacks.c \ ags/X/ags_midi_preferences.c \ ags/X/ags_midi_preferences_callbacks.c ags/X/ags_navigation.c \ ags/X/ags_navigation_callbacks.c ags/X/ags_notation_editor.c \ ags/X/ags_notation_editor_callbacks.c \ ags/X/ags_osc_server_preferences_callbacks.c \ ags/X/ags_osc_server_preferences.c \ ags/X/ags_output_collection_editor_callbacks.c \ ags/X/ags_output_collection_editor.c \ ags/X/ags_output_editor_callbacks.c ags/X/ags_output_editor.c \ ags/X/ags_output_listing_editor_callbacks.c \ ags/X/ags_output_listing_editor.c ags/X/ags_pad.c \ ags/X/ags_pad_callbacks.c ags/X/ags_pad_editor.c \ ags/X/ags_pad_editor_callbacks.c \ ags/X/ags_performance_preferences.c \ ags/X/ags_performance_preferences_callbacks.c \ ags/X/ags_playback_window.c \ ags/X/ags_playback_window_callbacks.c \ ags/X/ags_plugin_browser.c \ ags/X/ags_plugin_browser_callbacks.c \ ags/X/ags_plugin_preferences.c \ ags/X/ags_plugin_preferences_callbacks.c \ ags/X/ags_preferences.c ags/X/ags_preferences_callbacks.c \ ags/X/ags_property_collection_editor.c \ ags/X/ags_property_collection_editor_callbacks.c \ ags/X/ags_property_editor.c \ ags/X/ags_property_editor_callbacks.c \ ags/X/ags_property_listing_editor.c ags/X/ags_resize_editor.c \ ags/X/ags_sequencer_editor_callbacks.c \ ags/X/ags_sequencer_editor.c ags/X/ags_server_preferences.c \ ags/X/ags_server_preferences_callbacks.c \ ags/X/ags_sheet_window.c ags/X/ags_sheet_window_callbacks.c \ ags/X/ags_sheet_editor.c ags/X/ags_sheet_editor_callbacks.c \ ags/X/ags_ui_provider.c ags/X/ags_wave_window_callbacks.c \ ags/X/ags_wave_window.c ags/X/ags_wave_editor.c \ ags/X/ags_wave_editor_callbacks.c ags/X/ags_window.c \ ags/X/ags_soundcard_editor_callbacks.c \ ags/X/ags_soundcard_editor.c ags/X/ags_window_callbacks.c \ ags/X/ags_xorg_application_context.c \ ags/X/osc/controller/ags_ui_osc_renew_controller.c \ ags/X/file/ags_simple_file.c ags/X/task/ags_simple_file_read.c \ ags/X/task/ags_simple_file_write.c \ ags/X/import/ags_midi_import_wizard.c \ ags/X/import/ags_midi_import_wizard_callbacks.c \ ags/X/import/ags_track_collection.c \ ags/X/import/ags_track_collection_callbacks.c \ ags/X/import/ags_track_collection_mapper.c \ ags/X/import/ags_track_collection_mapper_callbacks.c \ ags/X/export/ags_midi_export_wizard.c \ ags/X/export/ags_midi_export_wizard_callbacks.c \ ags/X/export/ags_machine_collection.c \ ags/X/export/ags_machine_collection_callbacks.c \ ags/X/export/ags_machine_collection_entry.c \ ags/X/export/ags_machine_collection_entry_callbacks.c \ ags/X/export/ags_wave_export_dialog.c \ ags/X/export/ags_wave_export_dialog_callbacks.c \ ags/X/machine/ags_audiorec.c \ ags/X/machine/ags_audiorec_callbacks.c \ ags/X/machine/ags_cell_pattern.c \ ags/X/machine/ags_cell_pattern_callbacks.c \ ags/X/machine/ags_desk_callbacks.c ags/X/machine/ags_desk.c \ ags/X/machine/ags_desk_input_pad_callbacks.c \ ags/X/machine/ags_desk_input_pad.c ags/X/machine/ags_drum.c \ ags/X/machine/ags_drum_callbacks.c \ ags/X/machine/ags_drum_input_line.c \ ags/X/machine/ags_drum_input_line_callbacks.c \ ags/X/machine/ags_drum_input_pad.c \ ags/X/machine/ags_drum_input_pad_callbacks.c \ ags/X/machine/ags_drum_output_line.c \ ags/X/machine/ags_drum_output_line_callbacks.c \ ags/X/machine/ags_drum_output_pad.c \ ags/X/machine/ags_drum_output_pad_callbacks.c \ ags/X/machine/ags_dssi_bridge.c \ ags/X/machine/ags_dssi_bridge_callbacks.c \ ags/X/machine/ags_equalizer10.c \ ags/X/machine/ags_equalizer10_callbacks.c \ ags/X/machine/ags_fm_oscillator_callbacks.c \ ags/X/machine/ags_fm_oscillator.c \ ags/X/machine/ags_fm_syncsynth.c \ ags/X/machine/ags_fm_syncsynth_callbacks.c \ ags/X/machine/ags_fm_synth.c \ ags/X/machine/ags_fm_synth_callbacks.c \ ags/X/machine/ags_fm_synth_input_pad.c \ ags/X/machine/ags_fm_synth_input_line.c \ ags/X/machine/ags_fm_synth_input_line_callbacks.c \ ags/X/machine/ags_ladspa_bridge.c \ ags/X/machine/ags_ladspa_bridge_callbacks.c \ ags/X/machine/ags_live_dssi_bridge.c \ ags/X/machine/ags_live_dssi_bridge_callbacks.c \ ags/X/machine/ags_live_lv2_bridge.c \ ags/X/machine/ags_live_lv2_bridge_callbacks.c \ ags/X/machine/ags_lv2_bridge.c \ ags/X/machine/ags_lv2_bridge_callbacks.c \ ags/X/machine/ags_matrix.c \ ags/X/machine/ags_matrix_callbacks.c \ ags/X/machine/ags_matrix_bridge.c \ ags/X/machine/ags_matrix_bridge_callbacks.c \ ags/X/machine/ags_matrix_bulk_input.c \ ags/X/machine/ags_matrix_bulk_input_callbacks.c \ ags/X/machine/ags_mixer.c ags/X/machine/ags_mixer_callbacks.c \ ags/X/machine/ags_mixer_input_line.c \ ags/X/machine/ags_mixer_input_pad.c \ ags/X/machine/ags_oscillator.c \ ags/X/machine/ags_oscillator_callbacks.c \ ags/X/machine/ags_panel.c ags/X/machine/ags_panel_callbacks.c \ ags/X/machine/ags_panel_input_line.c \ ags/X/machine/ags_panel_input_line_callbacks.c \ ags/X/machine/ags_panel_input_pad.c \ ags/X/machine/ags_pattern_box_callbacks.c \ ags/X/machine/ags_pattern_box.c \ ags/X/machine/ags_pitch_sampler.c \ ags/X/machine/ags_pitch_sampler_callbacks.c \ ags/X/machine/ags_pitch_sampler_file.c \ ags/X/machine/ags_pitch_sampler_file_callbacks.c \ ags/X/machine/ags_syncsynth.c \ ags/X/machine/ags_syncsynth_callbacks.c \ ags/X/machine/ags_synth.c ags/X/machine/ags_synth_callbacks.c \ ags/X/machine/ags_synth_input_line.c \ ags/X/machine/ags_synth_input_line_callbacks.c \ ags/X/machine/ags_synth_input_pad.c \ ags/X/machine/ags_spectrometer.c \ ags/X/machine/ags_spectrometer_callbacks.c \ ags/X/machine/ags_ffplayer.c \ ags/X/machine/ags_ffplayer_callbacks.c \ ags/X/machine/ags_ffplayer_bridge.c \ ags/X/machine/ags_ffplayer_bridge_callbacks.c \ ags/X/machine/ags_ffplayer_bulk_input.c \ ags/X/machine/ags_ffplayer_bulk_input_callbacks.c \ ags/X/machine/ags_ffplayer_input_line.c \ ags/X/machine/ags_ffplayer_input_line_callbacks.c \ ags/X/machine/ags_ffplayer_input_pad.c \ ags/X/machine/ags_ffplayer_input_pad_callbacks.c \ ags/X/editor/ags_automation_edit.c \ ags/X/editor/ags_automation_edit_box.c \ ags/X/editor/ags_automation_edit_callbacks.c \ ags/X/editor/ags_automation_meta.c \ ags/X/editor/ags_automation_meta_callbacks.c \ ags/X/editor/ags_automation_toolbar.c \ ags/X/editor/ags_automation_toolbar_callbacks.c \ ags/X/editor/ags_crop_note_dialog_callbacks.c \ ags/X/editor/ags_crop_note_dialog.c \ ags/X/editor/ags_envelope_dialog_callbacks.c \ ags/X/editor/ags_envelope_dialog.c \ ags/X/editor/ags_envelope_editor_callbacks.c \ ags/X/editor/ags_envelope_editor.c \ ags/X/editor/ags_envelope_info_callbacks.c \ ags/X/editor/ags_envelope_info.c \ ags/X/editor/ags_machine_radio_button.c \ ags/X/editor/ags_machine_radio_button_callbacks.c \ ags/X/editor/ags_machine_selection.c \ ags/X/editor/ags_machine_selector.c \ ags/X/editor/ags_machine_selector_callbacks.c \ ags/X/editor/ags_move_note_dialog_callbacks.c \ ags/X/editor/ags_move_note_dialog.c \ ags/X/editor/ags_notation_edit.c \ ags/X/editor/ags_notation_edit_callbacks.c \ ags/X/editor/ags_notation_meta.c \ ags/X/editor/ags_notation_meta_callbacks.c \ ags/X/editor/ags_notation_toolbar.c \ ags/X/editor/ags_notation_toolbar_callbacks.c \ ags/X/editor/ags_pattern_envelope_callbacks.c \ ags/X/editor/ags_pattern_envelope.c \ ags/X/editor/ags_position_automation_cursor_dialog.c \ ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c \ ags/X/editor/ags_position_notation_cursor_dialog.c \ ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c \ ags/X/editor/ags_position_wave_cursor_dialog.c \ ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c \ ags/X/editor/ags_ramp_acceleration_dialog.c \ ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c \ ags/X/editor/ags_scrolled_automation_edit_box.c \ ags/X/editor/ags_scrolled_wave_edit_box.c \ ags/X/editor/ags_select_acceleration_dialog.c \ ags/X/editor/ags_select_acceleration_dialog_callbacks.c \ ags/X/editor/ags_select_buffer_dialog.c \ ags/X/editor/ags_select_buffer_dialog_callbacks.c \ ags/X/editor/ags_select_note_dialog.c \ ags/X/editor/ags_select_note_dialog_callbacks.c \ ags/X/editor/ags_sheet_edit.c \ ags/X/editor/ags_sheet_edit_callbacks.c \ ags/X/editor/ags_sheet_toolbar.c \ ags/X/editor/ags_sheet_toolbar_callbacks.c \ ags/X/editor/ags_vautomation_edit_box.c \ ags/X/editor/ags_vwave_edit_box.c ags/X/editor/ags_wave_edit.c \ ags/X/editor/ags_wave_edit_box.c \ ags/X/editor/ags_wave_edit_callbacks.c \ ags/X/editor/ags_wave_meta.c \ ags/X/editor/ags_wave_meta_callbacks.c \ ags/X/editor/ags_wave_toolbar.c \ ags/X/editor/ags_wave_toolbar_callbacks.c am__objects_29 = $(am__objects_1) am__objects_30 = $(am__objects_1) $(am__objects_1) am__objects_31 = $(am__objects_29) $(am__objects_29) $(am__objects_29) \ $(am__objects_29) $(am__objects_29) $(am__objects_29) \ $(am__objects_30) $(am__objects_29) am__objects_32 = $(am__objects_1) \ ags/X/libgsequencer_la-ags_animation_window.lo \ ags/X/libgsequencer_la-ags_automation_editor.lo \ ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_automation_window.lo \ ags/X/libgsequencer_la-ags_automation_window_callbacks.lo \ ags/X/libgsequencer_la-ags_audio_preferences.lo \ ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_bulk_member.lo \ ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo \ ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_connection_editor.lo \ ags/X/libgsequencer_la-ags_context_menu.lo \ ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo \ ags/X/libgsequencer_la-ags_dssi_browser.lo \ ags/X/libgsequencer_la-ags_effect_bridge.lo \ ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo \ ags/X/libgsequencer_la-ags_effect_bulk.lo \ ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo \ ags/X/libgsequencer_la-ags_effect_line.lo \ ags/X/libgsequencer_la-ags_effect_line_callbacks.lo \ ags/X/libgsequencer_la-ags_effect_pad.lo \ ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo \ ags/X/libgsequencer_la-ags_effect_separator.lo \ ags/X/libgsequencer_la-ags_export_soundcard.lo \ ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo \ ags/X/libgsequencer_la-ags_export_window.lo \ ags/X/libgsequencer_la-ags_export_window_callbacks.lo \ ags/X/libgsequencer_la-ags_generic_preferences.lo \ ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_ladspa_browser.lo \ ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo \ ags/X/libgsequencer_la-ags_lv2_browser.lo \ ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo \ ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_input_collection_editor.lo \ ags/X/libgsequencer_la-ags_input_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_input_editor.lo \ ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_input_listing_editor.lo \ ags/X/libgsequencer_la-ags_line.lo \ ags/X/libgsequencer_la-ags_line_callbacks.lo \ ags/X/libgsequencer_la-ags_line_editor.lo \ ags/X/libgsequencer_la-ags_line_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_line_member.lo \ ags/X/libgsequencer_la-ags_line_member_callbacks.lo \ ags/X/libgsequencer_la-ags_line_member_editor.lo \ ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_link_collection_editor.lo \ ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_link_editor.lo \ ags/X/libgsequencer_la-ags_link_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_listing_editor.lo \ ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_machine.lo \ ags/X/libgsequencer_la-ags_machine_callbacks.lo \ ags/X/libgsequencer_la-ags_machine_editor.lo \ ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_menu_action_callbacks.lo \ ags/X/libgsequencer_la-ags_menu_bar.lo \ ags/X/libgsequencer_la-ags_midi_dialog.lo \ ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo \ ags/X/libgsequencer_la-ags_midi_preferences.lo \ ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_navigation.lo \ ags/X/libgsequencer_la-ags_navigation_callbacks.lo \ ags/X/libgsequencer_la-ags_notation_editor.lo \ ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_osc_server_preferences.lo \ ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_output_collection_editor.lo \ ags/X/libgsequencer_la-ags_output_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_output_editor.lo \ ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_output_listing_editor.lo \ ags/X/libgsequencer_la-ags_pad.lo \ ags/X/libgsequencer_la-ags_pad_callbacks.lo \ ags/X/libgsequencer_la-ags_pad_editor.lo \ ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_performance_preferences.lo \ ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_playback_window.lo \ ags/X/libgsequencer_la-ags_playback_window_callbacks.lo \ ags/X/libgsequencer_la-ags_plugin_browser.lo \ ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo \ ags/X/libgsequencer_la-ags_plugin_preferences.lo \ ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_preferences.lo \ ags/X/libgsequencer_la-ags_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_property_collection_editor.lo \ ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_property_editor.lo \ ags/X/libgsequencer_la-ags_property_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_property_listing_editor.lo \ ags/X/libgsequencer_la-ags_resize_editor.lo \ ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_sequencer_editor.lo \ ags/X/libgsequencer_la-ags_server_preferences.lo \ ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo \ ags/X/libgsequencer_la-ags_sheet_window.lo \ ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo \ ags/X/libgsequencer_la-ags_sheet_editor.lo \ ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_ui_provider.lo \ ags/X/libgsequencer_la-ags_wave_window_callbacks.lo \ ags/X/libgsequencer_la-ags_wave_window.lo \ ags/X/libgsequencer_la-ags_wave_editor.lo \ ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_window.lo \ ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo \ ags/X/libgsequencer_la-ags_soundcard_editor.lo \ ags/X/libgsequencer_la-ags_window_callbacks.lo \ ags/X/libgsequencer_la-ags_xorg_application_context.lo am__objects_33 = $(am__objects_1) \ ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo am__objects_34 = $(am__objects_1) \ ags/X/file/libgsequencer_la-ags_simple_file.lo am__objects_35 = $(am__objects_1) \ ags/X/task/libgsequencer_la-ags_simple_file_read.lo \ ags/X/task/libgsequencer_la-ags_simple_file_write.lo am__objects_36 = $(am__objects_1) \ ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo \ ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo \ ags/X/import/libgsequencer_la-ags_track_collection.lo \ ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo \ ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo \ ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo am__objects_37 = $(am__objects_1) \ ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo \ ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo \ ags/X/export/libgsequencer_la-ags_machine_collection.lo \ ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo \ ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo \ ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo \ ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo \ ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo @WITH_LIBINSTPATCH_TRUE@am__objects_38 = ags/X/machine/libgsequencer_la-ags_ffplayer.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo \ @WITH_LIBINSTPATCH_TRUE@ ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo am__objects_39 = $(am__objects_1) \ ags/X/machine/libgsequencer_la-ags_audiorec.lo \ ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_cell_pattern.lo \ ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_desk.lo \ ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo \ ags/X/machine/libgsequencer_la-ags_drum.lo \ ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_drum_input_line.lo \ ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo \ ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_drum_output_line.lo \ ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo \ ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo \ ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_equalizer10.lo \ ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo \ ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo \ ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_fm_synth.lo \ ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo \ ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo \ ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo \ ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo \ ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo \ ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo \ ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_matrix.lo \ ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo \ ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo \ ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_mixer.lo \ ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo \ ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo \ ags/X/machine/libgsequencer_la-ags_oscillator.lo \ ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_panel.lo \ ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_panel_input_line.lo \ ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo \ ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_pattern_box.lo \ ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo \ ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo \ ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_syncsynth.lo \ ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_synth.lo \ ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_synth_input_line.lo \ ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo \ ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo \ ags/X/machine/libgsequencer_la-ags_spectrometer.lo \ ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo \ $(am__objects_38) am__objects_40 = $(am__objects_1) \ ags/X/editor/libgsequencer_la-ags_automation_edit.lo \ ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo \ ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_automation_meta.lo \ ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo \ ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo \ ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo \ ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_envelope_editor.lo \ ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_envelope_info.lo \ ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo \ ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_machine_selection.lo \ ags/X/editor/libgsequencer_la-ags_machine_selector.lo \ ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo \ ags/X/editor/libgsequencer_la-ags_notation_edit.lo \ ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_notation_meta.lo \ ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo \ ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo \ ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo \ ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo \ ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo \ ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo \ ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo \ ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo \ ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo \ ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo \ ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo \ ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_sheet_edit.lo \ ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo \ ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo \ ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo \ ags/X/editor/libgsequencer_la-ags_wave_edit.lo \ ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo \ ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_wave_meta.lo \ ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo \ ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo \ ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo am_libgsequencer_la_OBJECTS = $(am__objects_31) $(am__objects_32) \ $(am__objects_33) $(am__objects_34) $(am__objects_35) \ $(am__objects_36) $(am__objects_37) $(am__objects_39) \ $(am__objects_40) libgsequencer_la_OBJECTS = $(am_libgsequencer_la_OBJECTS) libgsequencer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libgsequencer_la_CFLAGS) $(CFLAGS) \ $(libgsequencer_la_LDFLAGS) $(LDFLAGS) -o $@ @RUN_FUNCTIONAL_TESTS_TRUE@am__DEPENDENCIES_2 = libgsequencer.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_gui.la libags_audio.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_server.la libags_thread.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags.la libags_thread.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_la_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_2) am__libgsequencer_test_la_SOURCES_DIST = \ ags/test/X/gsequencer_setup_util.c \ ags/test/X/gsequencer_setup_util.h \ ags/test/X/ags_functional_test_util.c \ ags/test/X/ags_functional_test_util.h \ ags/test/X/libgsequencer.h @RUN_FUNCTIONAL_TESTS_TRUE@am_libgsequencer_test_la_OBJECTS = ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo \ @RUN_FUNCTIONAL_TESTS_TRUE@ ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo libgsequencer_test_la_OBJECTS = $(am_libgsequencer_test_la_OBJECTS) libgsequencer_test_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libgsequencer_test_la_CFLAGS) $(CFLAGS) \ $(libgsequencer_test_la_LDFLAGS) $(LDFLAGS) -o $@ @RUN_FUNCTIONAL_TESTS_TRUE@am_libgsequencer_test_la_rpath = am_ags_acceleration_test_OBJECTS = ags/test/audio/acceleration_test-ags_acceleration_test.$(OBJEXT) ags_acceleration_test_OBJECTS = $(am_ags_acceleration_test_OBJECTS) ags_acceleration_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_acceleration_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_acceleration_test_CFLAGS) $(CFLAGS) \ $(ags_acceleration_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_add_audio_signal_test_OBJECTS = ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.$(OBJEXT) ags_add_audio_signal_test_OBJECTS = \ $(am_ags_add_audio_signal_test_OBJECTS) ags_add_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_add_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_add_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_add_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_add_audio_test_OBJECTS = ags/test/audio/task/add_audio_test-ags_add_audio_test.$(OBJEXT) ags_add_audio_test_OBJECTS = $(am_ags_add_audio_test_OBJECTS) ags_add_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_add_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_add_audio_test_CFLAGS) $(CFLAGS) \ $(ags_add_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_add_effect_test_OBJECTS = ags/test/audio/task/add_effect_test-ags_add_effect_test.$(OBJEXT) ags_add_effect_test_OBJECTS = $(am_ags_add_effect_test_OBJECTS) ags_add_effect_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_add_effect_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_add_effect_test_CFLAGS) $(CFLAGS) \ $(ags_add_effect_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_add_note_test_OBJECTS = \ ags/test/audio/task/add_note_test-ags_add_note_test.$(OBJEXT) ags_add_note_test_OBJECTS = $(am_ags_add_note_test_OBJECTS) ags_add_note_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_add_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_add_note_test_CFLAGS) $(CFLAGS) \ $(ags_add_note_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_add_soundcard_test_OBJECTS = ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.$(OBJEXT) ags_add_soundcard_test_OBJECTS = $(am_ags_add_soundcard_test_OBJECTS) ags_add_soundcard_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_add_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_add_soundcard_test_CFLAGS) $(CFLAGS) \ $(ags_add_soundcard_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_analyse_audio_signal_test_OBJECTS = ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.$(OBJEXT) ags_analyse_audio_signal_test_OBJECTS = \ $(am_ags_analyse_audio_signal_test_OBJECTS) ags_analyse_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_analyse_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_analyse_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_analyse_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_analyse_channel_test_OBJECTS = ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.$(OBJEXT) ags_analyse_channel_test_OBJECTS = \ $(am_ags_analyse_channel_test_OBJECTS) ags_analyse_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_analyse_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_analyse_channel_test_CFLAGS) $(CFLAGS) \ $(ags_analyse_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_application_context_test_OBJECTS = ags/test/object/application_context_test-ags_application_context_test.$(OBJEXT) ags_application_context_test_OBJECTS = \ $(am_ags_application_context_test_OBJECTS) ags_application_context_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_application_context_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_application_context_test_CFLAGS) $(CFLAGS) \ $(ags_application_context_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_apply_bpm_test_OBJECTS = ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.$(OBJEXT) ags_apply_bpm_test_OBJECTS = $(am_ags_apply_bpm_test_OBJECTS) ags_apply_bpm_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_apply_bpm_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_apply_bpm_test_CFLAGS) $(CFLAGS) \ $(ags_apply_bpm_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_apply_presets_test_OBJECTS = ags/test/audio/task/apply_presets_test-ags_apply_presets_test.$(OBJEXT) ags_apply_presets_test_OBJECTS = $(am_ags_apply_presets_test_OBJECTS) ags_apply_presets_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_apply_presets_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_apply_presets_test_CFLAGS) $(CFLAGS) \ $(ags_apply_presets_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_apply_sequencer_length_test_OBJECTS = ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.$(OBJEXT) ags_apply_sequencer_length_test_OBJECTS = \ $(am_ags_apply_sequencer_length_test_OBJECTS) ags_apply_sequencer_length_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_apply_sequencer_length_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_apply_sequencer_length_test_CFLAGS) $(CFLAGS) \ $(ags_apply_sequencer_length_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_apply_synth_test_OBJECTS = ags/test/audio/task/apply_synth_test-ags_apply_synth_test.$(OBJEXT) ags_apply_synth_test_OBJECTS = $(am_ags_apply_synth_test_OBJECTS) ags_apply_synth_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_apply_synth_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_apply_synth_test_CFLAGS) $(CFLAGS) \ $(ags_apply_synth_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_apply_tact_test_OBJECTS = ags/test/audio/task/apply_tact_test-ags_apply_tact_test.$(OBJEXT) ags_apply_tact_test_OBJECTS = $(am_ags_apply_tact_test_OBJECTS) ags_apply_tact_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_apply_tact_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_apply_tact_test_CFLAGS) $(CFLAGS) \ $(ags_apply_tact_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_audio_application_context_test_OBJECTS = ags/test/audio/audio_application_context_test-ags_audio_application_context_test.$(OBJEXT) ags_audio_application_context_test_OBJECTS = \ $(am_ags_audio_application_context_test_OBJECTS) ags_audio_application_context_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_audio_application_context_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_audio_application_context_test_CFLAGS) $(CFLAGS) \ $(ags_audio_application_context_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_audio_buffer_util_test_OBJECTS = ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.$(OBJEXT) ags_audio_buffer_util_test_OBJECTS = \ $(am_ags_audio_buffer_util_test_OBJECTS) ags_audio_buffer_util_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_audio_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_audio_buffer_util_test_CFLAGS) $(CFLAGS) \ $(ags_audio_buffer_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_audio_signal_test_OBJECTS = ags/test/audio/audio_signal_test-ags_audio_signal_test.$(OBJEXT) ags_audio_signal_test_OBJECTS = $(am_ags_audio_signal_test_OBJECTS) ags_audio_signal_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_audio_test_OBJECTS = \ ags/test/audio/audio_test-ags_audio_test.$(OBJEXT) ags_audio_test_OBJECTS = $(am_ags_audio_test_OBJECTS) ags_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_audio_test_CFLAGS) $(CFLAGS) $(ags_audio_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_authentication_manager_test_OBJECTS = ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.$(OBJEXT) ags_authentication_manager_test_OBJECTS = \ $(am_ags_authentication_manager_test_OBJECTS) ags_authentication_manager_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_authentication_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_authentication_manager_test_CFLAGS) $(CFLAGS) \ $(ags_authentication_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_automation_test_OBJECTS = \ ags/test/audio/automation_test-ags_automation_test.$(OBJEXT) ags_automation_test_OBJECTS = $(am_ags_automation_test_OBJECTS) ags_automation_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_automation_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_automation_test_CFLAGS) $(CFLAGS) \ $(ags_automation_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_base_plugin_test_OBJECTS = ags/test/plugin/base_plugin_test-ags_base_plugin_test.$(OBJEXT) ags_base_plugin_test_OBJECTS = $(am_ags_base_plugin_test_OBJECTS) ags_base_plugin_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_base_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_base_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_base_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_buffer_audio_signal_test_OBJECTS = ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.$(OBJEXT) ags_buffer_audio_signal_test_OBJECTS = \ $(am_ags_buffer_audio_signal_test_OBJECTS) ags_buffer_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_buffer_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_buffer_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_buffer_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_buffer_channel_test_OBJECTS = ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.$(OBJEXT) ags_buffer_channel_test_OBJECTS = \ $(am_ags_buffer_channel_test_OBJECTS) ags_buffer_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_buffer_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_buffer_channel_test_CFLAGS) $(CFLAGS) \ $(ags_buffer_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_buffer_test_OBJECTS = \ ags/test/audio/buffer_test-ags_buffer_test.$(OBJEXT) ags_buffer_test_OBJECTS = $(am_ags_buffer_test_OBJECTS) ags_buffer_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_buffer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_buffer_test_CFLAGS) $(CFLAGS) $(ags_buffer_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_buffer_util_test_OBJECTS = \ ags/test/lib/buffer_util_test-ags_buffer_util_test.$(OBJEXT) ags_buffer_util_test_OBJECTS = $(am_ags_buffer_util_test_OBJECTS) ags_buffer_util_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_buffer_util_test_CFLAGS) $(CFLAGS) \ $(ags_buffer_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_business_group_manager_test_OBJECTS = ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.$(OBJEXT) ags_business_group_manager_test_OBJECTS = \ $(am_ags_business_group_manager_test_OBJECTS) ags_business_group_manager_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_business_group_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_business_group_manager_test_CFLAGS) $(CFLAGS) \ $(ags_business_group_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_cancel_audio_test_OBJECTS = ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.$(OBJEXT) ags_cancel_audio_test_OBJECTS = $(am_ags_cancel_audio_test_OBJECTS) ags_cancel_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_cancel_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_cancel_audio_test_CFLAGS) $(CFLAGS) \ $(ags_cancel_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_cancel_channel_test_OBJECTS = ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.$(OBJEXT) ags_cancel_channel_test_OBJECTS = \ $(am_ags_cancel_channel_test_OBJECTS) ags_cancel_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_cancel_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_cancel_channel_test_CFLAGS) $(CFLAGS) \ $(ags_cancel_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_capture_wave_audio_test_OBJECTS = ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.$(OBJEXT) ags_capture_wave_audio_test_OBJECTS = \ $(am_ags_capture_wave_audio_test_OBJECTS) ags_capture_wave_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_capture_wave_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_capture_wave_audio_test_CFLAGS) $(CFLAGS) \ $(ags_capture_wave_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_capture_wave_channel_test_OBJECTS = ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.$(OBJEXT) ags_capture_wave_channel_test_OBJECTS = \ $(am_ags_capture_wave_channel_test_OBJECTS) ags_capture_wave_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_capture_wave_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_capture_wave_channel_test_CFLAGS) $(CFLAGS) \ $(ags_capture_wave_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_certificate_manager_test_OBJECTS = ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.$(OBJEXT) ags_certificate_manager_test_OBJECTS = \ $(am_ags_certificate_manager_test_OBJECTS) ags_certificate_manager_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_certificate_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_certificate_manager_test_CFLAGS) $(CFLAGS) \ $(ags_certificate_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_channel_test_OBJECTS = \ ags/test/audio/channel_test-ags_channel_test.$(OBJEXT) ags_channel_test_OBJECTS = $(am_ags_channel_test_OBJECTS) ags_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_channel_test_CFLAGS) $(CFLAGS) \ $(ags_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_char_buffer_util_test_OBJECTS = ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.$(OBJEXT) ags_char_buffer_util_test_OBJECTS = \ $(am_ags_char_buffer_util_test_OBJECTS) ags_char_buffer_util_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_char_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_char_buffer_util_test_CFLAGS) $(CFLAGS) \ $(ags_char_buffer_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_clear_audio_signal_test_OBJECTS = ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.$(OBJEXT) ags_clear_audio_signal_test_OBJECTS = \ $(am_ags_clear_audio_signal_test_OBJECTS) ags_clear_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_clear_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_clear_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_clear_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_clear_buffer_test_OBJECTS = ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.$(OBJEXT) ags_clear_buffer_test_OBJECTS = $(am_ags_clear_buffer_test_OBJECTS) ags_clear_buffer_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_clear_buffer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_clear_buffer_test_CFLAGS) $(CFLAGS) \ $(ags_clear_buffer_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_complex_test_OBJECTS = \ ags/test/lib/complex_test-ags_complex_test.$(OBJEXT) ags_complex_test_OBJECTS = $(am_ags_complex_test_OBJECTS) ags_complex_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_complex_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_complex_test_CFLAGS) $(CFLAGS) \ $(ags_complex_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_config_test_OBJECTS = \ ags/test/object/config_test-ags_config_test.$(OBJEXT) ags_config_test_OBJECTS = $(am_ags_config_test_OBJECTS) ags_config_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_config_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_config_test_CFLAGS) $(CFLAGS) $(ags_config_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_connectable_test_OBJECTS = ags/test/object/connectable_test-ags_connectable_test.$(OBJEXT) ags_connectable_test_OBJECTS = $(am_ags_connectable_test_OBJECTS) ags_connectable_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_connectable_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_connectable_test_CFLAGS) $(CFLAGS) \ $(ags_connectable_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_controller_test_OBJECTS = ags/test/server/controller/controller_test-ags_controller_test.$(OBJEXT) ags_controller_test_OBJECTS = $(am_ags_controller_test_OBJECTS) ags_controller_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_controller_test_CFLAGS) $(CFLAGS) \ $(ags_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_conversion_test_OBJECTS = \ ags/test/lib/conversion_test-ags_conversion_test.$(OBJEXT) ags_conversion_test_OBJECTS = $(am_ags_conversion_test_OBJECTS) ags_conversion_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_conversion_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_conversion_test_CFLAGS) $(CFLAGS) \ $(ags_conversion_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_copy_audio_signal_test_OBJECTS = ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.$(OBJEXT) ags_copy_audio_signal_test_OBJECTS = \ $(am_ags_copy_audio_signal_test_OBJECTS) ags_copy_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_copy_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_copy_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_copy_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_copy_channel_test_OBJECTS = ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.$(OBJEXT) ags_copy_channel_test_OBJECTS = $(am_ags_copy_channel_test_OBJECTS) ags_copy_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_copy_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_copy_channel_test_CFLAGS) $(CFLAGS) \ $(ags_copy_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_copy_pattern_audio_test_OBJECTS = ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.$(OBJEXT) ags_copy_pattern_audio_test_OBJECTS = \ $(am_ags_copy_pattern_audio_test_OBJECTS) ags_copy_pattern_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_copy_pattern_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_copy_pattern_audio_test_CFLAGS) $(CFLAGS) \ $(ags_copy_pattern_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_copy_pattern_channel_test_OBJECTS = ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.$(OBJEXT) ags_copy_pattern_channel_test_OBJECTS = \ $(am_ags_copy_pattern_channel_test_OBJECTS) ags_copy_pattern_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_copy_pattern_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_copy_pattern_channel_test_CFLAGS) $(CFLAGS) \ $(ags_copy_pattern_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_count_beats_audio_test_OBJECTS = ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.$(OBJEXT) ags_count_beats_audio_test_OBJECTS = \ $(am_ags_count_beats_audio_test_OBJECTS) ags_count_beats_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_count_beats_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_count_beats_audio_test_CFLAGS) $(CFLAGS) \ $(ags_count_beats_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_crop_note_test_OBJECTS = ags/test/audio/task/crop_note_test-ags_crop_note_test.$(OBJEXT) ags_crop_note_test_OBJECTS = $(am_ags_crop_note_test_OBJECTS) ags_crop_note_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_crop_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_crop_note_test_CFLAGS) $(CFLAGS) \ $(ags_crop_note_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_delay_audio_test_OBJECTS = ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.$(OBJEXT) ags_delay_audio_test_OBJECTS = $(am_ags_delay_audio_test_OBJECTS) ags_delay_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_delay_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_delay_audio_test_CFLAGS) $(CFLAGS) \ $(ags_delay_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_destroy_worker_test_OBJECTS = ags/test/thread/destroy_worker_test-ags_destroy_worker_test.$(OBJEXT) ags_destroy_worker_test_OBJECTS = \ $(am_ags_destroy_worker_test_OBJECTS) ags_destroy_worker_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_destroy_worker_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_destroy_worker_test_CFLAGS) $(CFLAGS) \ $(ags_destroy_worker_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_devin_test_OBJECTS = \ ags/test/audio/devin_test-ags_devin_test.$(OBJEXT) ags_devin_test_OBJECTS = $(am_ags_devin_test_OBJECTS) ags_devin_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_devin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_devin_test_CFLAGS) $(CFLAGS) $(ags_devin_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_devout_test_OBJECTS = \ ags/test/audio/devout_test-ags_devout_test.$(OBJEXT) ags_devout_test_OBJECTS = $(am_ags_devout_test_OBJECTS) ags_devout_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_devout_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_devout_test_CFLAGS) $(CFLAGS) $(ags_devout_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_dssi_manager_test_OBJECTS = ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.$(OBJEXT) ags_dssi_manager_test_OBJECTS = $(am_ags_dssi_manager_test_OBJECTS) ags_dssi_manager_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_dssi_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_dssi_manager_test_CFLAGS) $(CFLAGS) \ $(ags_dssi_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_dssi_plugin_test_OBJECTS = ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.$(OBJEXT) ags_dssi_plugin_test_OBJECTS = $(am_ags_dssi_plugin_test_OBJECTS) ags_dssi_plugin_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_dssi_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_dssi_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_dssi_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_envelope_audio_signal_test_OBJECTS = ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.$(OBJEXT) ags_envelope_audio_signal_test_OBJECTS = \ $(am_ags_envelope_audio_signal_test_OBJECTS) ags_envelope_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_envelope_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_envelope_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_envelope_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_envelope_channel_test_OBJECTS = ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.$(OBJEXT) ags_envelope_channel_test_OBJECTS = \ $(am_ags_envelope_channel_test_OBJECTS) ags_envelope_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_envelope_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_envelope_channel_test_CFLAGS) $(CFLAGS) \ $(ags_envelope_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_eq10_audio_signal_test_OBJECTS = ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.$(OBJEXT) ags_eq10_audio_signal_test_OBJECTS = \ $(am_ags_eq10_audio_signal_test_OBJECTS) ags_eq10_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_eq10_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_eq10_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_eq10_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_eq10_channel_test_OBJECTS = ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.$(OBJEXT) ags_eq10_channel_test_OBJECTS = $(am_ags_eq10_channel_test_OBJECTS) ags_eq10_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_eq10_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_eq10_channel_test_CFLAGS) $(CFLAGS) \ $(ags_eq10_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_export_output_test_OBJECTS = ags/test/audio/task/export_output_test-ags_export_output_test.$(OBJEXT) ags_export_output_test_OBJECTS = $(am_ags_export_output_test_OBJECTS) ags_export_output_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_export_output_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_export_output_test_CFLAGS) $(CFLAGS) \ $(ags_export_output_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_feed_audio_signal_test_OBJECTS = ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.$(OBJEXT) ags_feed_audio_signal_test_OBJECTS = \ $(am_ags_feed_audio_signal_test_OBJECTS) ags_feed_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_feed_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_feed_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_feed_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_fifoout_test_OBJECTS = \ ags/test/audio/fifoout_test-ags_fifoout_test.$(OBJEXT) ags_fifoout_test_OBJECTS = $(am_ags_fifoout_test_OBJECTS) ags_fifoout_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_fifoout_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_fifoout_test_CFLAGS) $(CFLAGS) \ $(ags_fifoout_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_file_id_ref_test_OBJECTS = \ ags/test/file/file_id_ref_test-ags_file_id_ref_test.$(OBJEXT) ags_file_id_ref_test_OBJECTS = $(am_ags_file_id_ref_test_OBJECTS) ags_file_id_ref_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_file_id_ref_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_file_id_ref_test_CFLAGS) $(CFLAGS) \ $(ags_file_id_ref_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_file_launch_test_OBJECTS = \ ags/test/file/file_launch_test-ags_file_launch_test.$(OBJEXT) ags_file_launch_test_OBJECTS = $(am_ags_file_launch_test_OBJECTS) ags_file_launch_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_file_launch_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_file_launch_test_CFLAGS) $(CFLAGS) \ $(ags_file_launch_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_file_lookup_test_OBJECTS = \ ags/test/file/file_lookup_test-ags_file_lookup_test.$(OBJEXT) ags_file_lookup_test_OBJECTS = $(am_ags_file_lookup_test_OBJECTS) ags_file_lookup_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_file_lookup_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_file_lookup_test_CFLAGS) $(CFLAGS) \ $(ags_file_lookup_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_file_test_OBJECTS = \ ags/test/file/file_test-ags_file_test.$(OBJEXT) ags_file_test_OBJECTS = $(am_ags_file_test_OBJECTS) ags_file_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_file_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_file_test_CFLAGS) \ $(CFLAGS) $(ags_file_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_filter_util_test_OBJECTS = ags/test/audio/filter_util_test-ags_filter_util_test.$(OBJEXT) ags_filter_util_test_OBJECTS = $(am_ags_filter_util_test_OBJECTS) ags_filter_util_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_filter_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_filter_util_test_CFLAGS) $(CFLAGS) \ $(ags_filter_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_fm_synth_util_test_OBJECTS = ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.$(OBJEXT) ags_fm_synth_util_test_OBJECTS = $(am_ags_fm_synth_util_test_OBJECTS) ags_fm_synth_util_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_fm_synth_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_fm_synth_util_test_CFLAGS) $(CFLAGS) \ $(ags_fm_synth_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_fourier_transform_util_test_OBJECTS = ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.$(OBJEXT) ags_fourier_transform_util_test_OBJECTS = \ $(am_ags_fourier_transform_util_test_OBJECTS) ags_fourier_transform_util_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_fourier_transform_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_fourier_transform_util_test_CFLAGS) $(CFLAGS) \ $(ags_fourier_transform_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_free_selection_test_OBJECTS = ags/test/audio/task/free_selection_test-ags_free_selection_test.$(OBJEXT) ags_free_selection_test_OBJECTS = \ $(am_ags_free_selection_test_OBJECTS) ags_free_selection_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_free_selection_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_free_selection_test_CFLAGS) $(CFLAGS) \ $(ags_free_selection_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_front_controller_test_OBJECTS = ags/test/server/controller/front_controller_test-ags_front_controller_test.$(OBJEXT) ags_front_controller_test_OBJECTS = \ $(am_ags_front_controller_test_OBJECTS) ags_front_controller_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_front_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_front_controller_test_CFLAGS) $(CFLAGS) \ $(ags_front_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_audio_config_test_SOURCES_DIST = \ ags/test/X/ags_functional_audio_config_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_audio_config_test_OBJECTS = ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.$(OBJEXT) ags_functional_audio_config_test_OBJECTS = \ $(am_ags_functional_audio_config_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@am__DEPENDENCIES_3 = libgsequencer.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_gui.la libags_audio.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_server.la libags_thread.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags.la libags_thread.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libgsequencer_test.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_1) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_config_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_audio_config_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_audio_config_test_CFLAGS) $(CFLAGS) \ $(ags_functional_audio_config_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_audio_test_SOURCES_DIST = \ ags/test/audio/ags_functional_audio_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_audio_test_OBJECTS = ags/test/audio/functional_audio_test-ags_functional_audio_test.$(OBJEXT) ags_functional_audio_test_OBJECTS = \ $(am_ags_functional_audio_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_audio_test_CFLAGS) $(CFLAGS) \ $(ags_functional_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_automation_editor_workflow_test_SOURCES_DIST = \ ags/test/X/ags_functional_automation_editor_workflow_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_automation_editor_workflow_test_OBJECTS = ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.$(OBJEXT) ags_functional_automation_editor_workflow_test_OBJECTS = \ $(am_ags_functional_automation_editor_workflow_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_automation_editor_workflow_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_automation_editor_workflow_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_functional_automation_editor_workflow_test_CFLAGS) \ $(CFLAGS) \ $(ags_functional_automation_editor_workflow_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_functional_drum_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_drum_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_drum_test_OBJECTS = ags/test/X/machine/functional_drum_test-ags_functional_drum_test.$(OBJEXT) ags_functional_drum_test_OBJECTS = \ $(am_ags_functional_drum_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_drum_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_drum_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_drum_test_CFLAGS) $(CFLAGS) \ $(ags_functional_drum_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_ffplayer_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_ffplayer_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_ffplayer_test_OBJECTS = ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT) ags_functional_ffplayer_test_OBJECTS = \ $(am_ags_functional_ffplayer_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_ffplayer_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_ffplayer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) \ $(ags_functional_ffplayer_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_fourier_transform_test_SOURCES_DIST = \ ags/test/audio/ags_functional_fourier_transform_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_fourier_transform_test_OBJECTS = ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.$(OBJEXT) ags_functional_fourier_transform_test_OBJECTS = \ $(am_ags_functional_fourier_transform_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_fourier_transform_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_fourier_transform_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_functional_fourier_transform_test_CFLAGS) \ $(CFLAGS) $(ags_functional_fourier_transform_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_functional_line_member_add_and_destroy_test_SOURCES_DIST = \ ags/test/X/ags_functional_line_member_add_and_destroy_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_line_member_add_and_destroy_test_OBJECTS = ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT) ags_functional_line_member_add_and_destroy_test_OBJECTS = \ $(am_ags_functional_line_member_add_and_destroy_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_line_member_add_and_destroy_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_line_member_add_and_destroy_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_functional_line_member_add_and_destroy_test_CFLAGS) \ $(CFLAGS) \ $(ags_functional_line_member_add_and_destroy_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_functional_machine_add_and_destroy_test_SOURCES_DIST = \ ags/test/X/ags_functional_machine_add_and_destroy_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_machine_add_and_destroy_test_OBJECTS = ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT) ags_functional_machine_add_and_destroy_test_OBJECTS = \ $(am_ags_functional_machine_add_and_destroy_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_add_and_destroy_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_machine_add_and_destroy_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_functional_machine_add_and_destroy_test_CFLAGS) \ $(CFLAGS) \ $(ags_functional_machine_add_and_destroy_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_functional_machine_link_test_SOURCES_DIST = \ ags/test/X/ags_functional_machine_link_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_machine_link_test_OBJECTS = ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.$(OBJEXT) ags_functional_machine_link_test_OBJECTS = \ $(am_ags_functional_machine_link_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_link_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_machine_link_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) \ $(ags_functional_machine_link_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_matrix_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_matrix_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_matrix_test_OBJECTS = ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.$(OBJEXT) ags_functional_matrix_test_OBJECTS = \ $(am_ags_functional_matrix_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_matrix_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_matrix_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_matrix_test_CFLAGS) $(CFLAGS) \ $(ags_functional_matrix_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_mixer_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_mixer_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_mixer_test_OBJECTS = ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.$(OBJEXT) ags_functional_mixer_test_OBJECTS = \ $(am_ags_functional_mixer_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_mixer_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_mixer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_mixer_test_CFLAGS) $(CFLAGS) \ $(ags_functional_mixer_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_notation_edit_test_SOURCES_DIST = \ ags/test/X/ags_functional_notation_edit_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_notation_edit_test_OBJECTS = ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.$(OBJEXT) ags_functional_notation_edit_test_OBJECTS = \ $(am_ags_functional_notation_edit_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_edit_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_notation_edit_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_functional_notation_edit_test_CFLAGS) $(CFLAGS) \ $(ags_functional_notation_edit_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_notation_editor_workflow_test_SOURCES_DIST = \ ags/test/X/ags_functional_notation_editor_workflow_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_notation_editor_workflow_test_OBJECTS = ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.$(OBJEXT) ags_functional_notation_editor_workflow_test_OBJECTS = \ $(am_ags_functional_notation_editor_workflow_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_editor_workflow_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_notation_editor_workflow_test_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) \ $(ags_functional_notation_editor_workflow_test_CFLAGS) \ $(CFLAGS) \ $(ags_functional_notation_editor_workflow_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_functional_osc_server_test_SOURCES_DIST = \ ags/test/audio/osc/ags_functional_osc_server_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_osc_server_test_OBJECTS = ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.$(OBJEXT) ags_functional_osc_server_test_OBJECTS = \ $(am_ags_functional_osc_server_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_server_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_osc_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_osc_server_test_CFLAGS) $(CFLAGS) \ $(ags_functional_osc_server_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_osc_xmlrpc_server_test_SOURCES_DIST = \ ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_osc_xmlrpc_server_test_OBJECTS = ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.$(OBJEXT) ags_functional_osc_xmlrpc_server_test_OBJECTS = \ $(am_ags_functional_osc_xmlrpc_server_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_xmlrpc_server_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_osc_xmlrpc_server_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_functional_osc_xmlrpc_server_test_CFLAGS) \ $(CFLAGS) $(ags_functional_osc_xmlrpc_server_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__ags_functional_panel_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_panel_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_panel_test_OBJECTS = ags/test/X/machine/functional_panel_test-ags_functional_panel_test.$(OBJEXT) ags_functional_panel_test_OBJECTS = \ $(am_ags_functional_panel_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_panel_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_panel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_panel_test_CFLAGS) $(CFLAGS) \ $(ags_functional_panel_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_pitch_test_SOURCES_DIST = \ ags/test/audio/ags_functional_pitch_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_pitch_test_OBJECTS = ags/test/audio/functional_pitch_test-ags_functional_pitch_test.$(OBJEXT) ags_functional_pitch_test_OBJECTS = \ $(am_ags_functional_pitch_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_pitch_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_pitch_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_pitch_test_CFLAGS) $(CFLAGS) \ $(ags_functional_pitch_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_server_test_SOURCES_DIST = \ ags/test/server/ags_functional_server_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_server_test_OBJECTS = ags/test/server/functional_server_test-ags_functional_server_test.$(OBJEXT) ags_functional_server_test_OBJECTS = \ $(am_ags_functional_server_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_server_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_server_test_CFLAGS) $(CFLAGS) \ $(ags_functional_server_test_LDFLAGS) $(LDFLAGS) -o $@ am__ags_functional_synth_test_SOURCES_DIST = \ ags/test/X/machine/ags_functional_synth_test.c @RUN_FUNCTIONAL_TESTS_TRUE@am_ags_functional_synth_test_OBJECTS = ags/test/X/machine/functional_synth_test-ags_functional_synth_test.$(OBJEXT) ags_functional_synth_test_OBJECTS = \ $(am_ags_functional_synth_test_OBJECTS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_synth_test_DEPENDENCIES = \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__DEPENDENCIES_3) ags_functional_synth_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_functional_synth_test_CFLAGS) $(CFLAGS) \ $(ags_functional_synth_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_input_test_OBJECTS = \ ags/test/audio/input_test-ags_input_test.$(OBJEXT) ags_input_test_OBJECTS = $(am_ags_input_test_OBJECTS) ags_input_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_input_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_input_test_CFLAGS) $(CFLAGS) $(ags_input_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_ladspa_conversion_test_OBJECTS = ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.$(OBJEXT) ags_ladspa_conversion_test_OBJECTS = \ $(am_ags_ladspa_conversion_test_OBJECTS) ags_ladspa_conversion_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_ladspa_conversion_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_ladspa_conversion_test_CFLAGS) $(CFLAGS) \ $(ags_ladspa_conversion_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_ladspa_manager_test_OBJECTS = ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.$(OBJEXT) ags_ladspa_manager_test_OBJECTS = \ $(am_ags_ladspa_manager_test_OBJECTS) ags_ladspa_manager_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_ladspa_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_ladspa_manager_test_CFLAGS) $(CFLAGS) \ $(ags_ladspa_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_link_channel_test_OBJECTS = ags/test/audio/task/link_channel_test-ags_link_channel_test.$(OBJEXT) ags_link_channel_test_OBJECTS = $(am_ags_link_channel_test_OBJECTS) ags_link_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_link_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_link_channel_test_CFLAGS) $(CFLAGS) \ $(ags_link_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_log_test_OBJECTS = \ ags/test/lib/log_test-ags_log_test.$(OBJEXT) ags_log_test_OBJECTS = $(am_ags_log_test_OBJECTS) ags_log_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_log_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_log_test_CFLAGS) \ $(CFLAGS) $(ags_log_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_conversion_test_OBJECTS = ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.$(OBJEXT) ags_lv2_conversion_test_OBJECTS = \ $(am_ags_lv2_conversion_test_OBJECTS) ags_lv2_conversion_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_conversion_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_conversion_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_conversion_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_manager_test_OBJECTS = ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.$(OBJEXT) ags_lv2_manager_test_OBJECTS = $(am_ags_lv2_manager_test_OBJECTS) ags_lv2_manager_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_manager_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_option_manager_test_OBJECTS = ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.$(OBJEXT) ags_lv2_option_manager_test_OBJECTS = \ $(am_ags_lv2_option_manager_test_OBJECTS) ags_lv2_option_manager_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_option_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_option_manager_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_option_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_plugin_test_OBJECTS = \ ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.$(OBJEXT) ags_lv2_plugin_test_OBJECTS = $(am_ags_lv2_plugin_test_OBJECTS) ags_lv2_plugin_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_preset_test_OBJECTS = \ ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.$(OBJEXT) ags_lv2_preset_test_OBJECTS = $(am_ags_lv2_preset_test_OBJECTS) ags_lv2_preset_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_preset_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_preset_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_preset_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_uri_map_manager_test_OBJECTS = ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.$(OBJEXT) ags_lv2_uri_map_manager_test_OBJECTS = \ $(am_ags_lv2_uri_map_manager_test_OBJECTS) ags_lv2_uri_map_manager_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_uri_map_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_uri_map_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_urid_manager_test_OBJECTS = ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.$(OBJEXT) ags_lv2_urid_manager_test_OBJECTS = \ $(am_ags_lv2_urid_manager_test_OBJECTS) ags_lv2_urid_manager_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_urid_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_urid_manager_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_urid_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2_worker_manager_test_OBJECTS = ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.$(OBJEXT) ags_lv2_worker_manager_test_OBJECTS = \ $(am_ags_lv2_worker_manager_test_OBJECTS) ags_lv2_worker_manager_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2_worker_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2_worker_manager_test_CFLAGS) $(CFLAGS) \ $(ags_lv2_worker_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2ui_manager_test_OBJECTS = ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.$(OBJEXT) ags_lv2ui_manager_test_OBJECTS = $(am_ags_lv2ui_manager_test_OBJECTS) ags_lv2ui_manager_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2ui_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2ui_manager_test_CFLAGS) $(CFLAGS) \ $(ags_lv2ui_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_lv2ui_plugin_test_OBJECTS = ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.$(OBJEXT) ags_lv2ui_plugin_test_OBJECTS = $(am_ags_lv2ui_plugin_test_OBJECTS) ags_lv2ui_plugin_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_lv2ui_plugin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_lv2ui_plugin_test_CFLAGS) $(CFLAGS) \ $(ags_lv2ui_plugin_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_midi_buffer_util_test_OBJECTS = ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.$(OBJEXT) ags_midi_buffer_util_test_OBJECTS = \ $(am_ags_midi_buffer_util_test_OBJECTS) ags_midi_buffer_util_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_midi_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_midi_buffer_util_test_CFLAGS) $(CFLAGS) \ $(ags_midi_buffer_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_midi_builder_test_OBJECTS = ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.$(OBJEXT) ags_midi_builder_test_OBJECTS = $(am_ags_midi_builder_test_OBJECTS) ags_midi_builder_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_midi_builder_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_midi_builder_test_CFLAGS) $(CFLAGS) \ $(ags_midi_builder_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_midi_test_OBJECTS = \ ags/test/audio/midi_test-ags_midi_test.$(OBJEXT) ags_midi_test_OBJECTS = $(am_ags_midi_test_OBJECTS) ags_midi_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_midi_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_midi_test_CFLAGS) \ $(CFLAGS) $(ags_midi_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_midiin_test_OBJECTS = \ ags/test/audio/midiin_test-ags_midiin_test.$(OBJEXT) ags_midiin_test_OBJECTS = $(am_ags_midiin_test_OBJECTS) ags_midiin_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_midiin_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_midiin_test_CFLAGS) $(CFLAGS) $(ags_midiin_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_move_note_test_OBJECTS = ags/test/audio/task/move_note_test-ags_move_note_test.$(OBJEXT) ags_move_note_test_OBJECTS = $(am_ags_move_note_test_OBJECTS) ags_move_note_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_move_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_move_note_test_CFLAGS) $(CFLAGS) \ $(ags_move_note_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_mute_audio_signal_test_OBJECTS = ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.$(OBJEXT) ags_mute_audio_signal_test_OBJECTS = \ $(am_ags_mute_audio_signal_test_OBJECTS) ags_mute_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_mute_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_mute_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_mute_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_mute_audio_test_OBJECTS = ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.$(OBJEXT) ags_mute_audio_test_OBJECTS = $(am_ags_mute_audio_test_OBJECTS) ags_mute_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_mute_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_mute_audio_test_CFLAGS) $(CFLAGS) \ $(ags_mute_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_mute_channel_test_OBJECTS = ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.$(OBJEXT) ags_mute_channel_test_OBJECTS = $(am_ags_mute_channel_test_OBJECTS) ags_mute_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_mute_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_mute_channel_test_CFLAGS) $(CFLAGS) \ $(ags_mute_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_notation_test_OBJECTS = \ ags/test/audio/notation_test-ags_notation_test.$(OBJEXT) ags_notation_test_OBJECTS = $(am_ags_notation_test_OBJECTS) ags_notation_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_notation_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_notation_test_CFLAGS) $(CFLAGS) \ $(ags_notation_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_note_test_OBJECTS = \ ags/test/audio/note_test-ags_note_test.$(OBJEXT) ags_note_test_OBJECTS = $(am_ags_note_test_OBJECTS) ags_note_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_note_test_CFLAGS) \ $(CFLAGS) $(ags_note_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_action_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.$(OBJEXT) ags_osc_action_controller_test_OBJECTS = \ $(am_ags_osc_action_controller_test_OBJECTS) ags_osc_action_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_action_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_action_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_action_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_buffer_util_test_OBJECTS = ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.$(OBJEXT) ags_osc_buffer_util_test_OBJECTS = \ $(am_ags_osc_buffer_util_test_OBJECTS) ags_osc_buffer_util_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_buffer_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_buffer_util_test_CFLAGS) $(CFLAGS) \ $(ags_osc_buffer_util_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_client_test_OBJECTS = ags/test/audio/osc/osc_client_test-ags_osc_client_test.$(OBJEXT) ags_osc_client_test_OBJECTS = $(am_ags_osc_client_test_OBJECTS) ags_osc_client_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_client_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_client_test_CFLAGS) $(CFLAGS) \ $(ags_osc_client_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_config_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.$(OBJEXT) ags_osc_config_controller_test_OBJECTS = \ $(am_ags_osc_config_controller_test_OBJECTS) ags_osc_config_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_config_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_config_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_config_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_connection_test_OBJECTS = ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.$(OBJEXT) ags_osc_connection_test_OBJECTS = \ $(am_ags_osc_connection_test_OBJECTS) ags_osc_connection_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_connection_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_connection_test_CFLAGS) $(CFLAGS) \ $(ags_osc_connection_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_front_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.$(OBJEXT) ags_osc_front_controller_test_OBJECTS = \ $(am_ags_osc_front_controller_test_OBJECTS) ags_osc_front_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_front_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_front_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_front_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_info_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.$(OBJEXT) ags_osc_info_controller_test_OBJECTS = \ $(am_ags_osc_info_controller_test_OBJECTS) ags_osc_info_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_info_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_info_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_info_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_message_test_OBJECTS = ags/test/audio/osc/osc_message_test-ags_osc_message_test.$(OBJEXT) ags_osc_message_test_OBJECTS = $(am_ags_osc_message_test_OBJECTS) ags_osc_message_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_message_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_message_test_CFLAGS) $(CFLAGS) \ $(ags_osc_message_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_meter_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.$(OBJEXT) ags_osc_meter_controller_test_OBJECTS = \ $(am_ags_osc_meter_controller_test_OBJECTS) ags_osc_meter_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_meter_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_meter_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_meter_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_node_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.$(OBJEXT) ags_osc_node_controller_test_OBJECTS = \ $(am_ags_osc_node_controller_test_OBJECTS) ags_osc_node_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_node_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_node_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_node_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_renew_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.$(OBJEXT) ags_osc_renew_controller_test_OBJECTS = \ $(am_ags_osc_renew_controller_test_OBJECTS) ags_osc_renew_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_renew_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_renew_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_renew_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_server_test_OBJECTS = ags/test/audio/osc/osc_server_test-ags_osc_server_test.$(OBJEXT) ags_osc_server_test_OBJECTS = $(am_ags_osc_server_test_OBJECTS) ags_osc_server_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_server_test_CFLAGS) $(CFLAGS) \ $(ags_osc_server_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_status_controller_test_OBJECTS = ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.$(OBJEXT) ags_osc_status_controller_test_OBJECTS = \ $(am_ags_osc_status_controller_test_OBJECTS) ags_osc_status_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_status_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_status_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_status_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_websocket_connection_test_OBJECTS = ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.$(OBJEXT) ags_osc_websocket_connection_test_OBJECTS = \ $(am_ags_osc_websocket_connection_test_OBJECTS) ags_osc_websocket_connection_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_websocket_connection_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_osc_websocket_connection_test_CFLAGS) $(CFLAGS) \ $(ags_osc_websocket_connection_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_xmlrpc_controller_test_OBJECTS = ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.$(OBJEXT) ags_osc_xmlrpc_controller_test_OBJECTS = \ $(am_ags_osc_xmlrpc_controller_test_OBJECTS) ags_osc_xmlrpc_controller_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_xmlrpc_controller_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) \ $(ags_osc_xmlrpc_controller_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_xmlrpc_message_test_OBJECTS = ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.$(OBJEXT) ags_osc_xmlrpc_message_test_OBJECTS = \ $(am_ags_osc_xmlrpc_message_test_OBJECTS) ags_osc_xmlrpc_message_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_xmlrpc_message_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) \ $(ags_osc_xmlrpc_message_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_osc_xmlrpc_server_test_OBJECTS = ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.$(OBJEXT) ags_osc_xmlrpc_server_test_OBJECTS = \ $(am_ags_osc_xmlrpc_server_test_OBJECTS) ags_osc_xmlrpc_server_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_osc_xmlrpc_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) \ $(ags_osc_xmlrpc_server_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_output_test_OBJECTS = \ ags/test/audio/output_test-ags_output_test.$(OBJEXT) ags_output_test_OBJECTS = $(am_ags_output_test_OBJECTS) ags_output_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_output_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_output_test_CFLAGS) $(CFLAGS) $(ags_output_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_password_store_manager_test_OBJECTS = ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.$(OBJEXT) ags_password_store_manager_test_OBJECTS = \ $(am_ags_password_store_manager_test_OBJECTS) ags_password_store_manager_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_password_store_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_password_store_manager_test_CFLAGS) $(CFLAGS) \ $(ags_password_store_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_pattern_test_OBJECTS = \ ags/test/audio/pattern_test-ags_pattern_test.$(OBJEXT) ags_pattern_test_OBJECTS = $(am_ags_pattern_test_OBJECTS) ags_pattern_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_pattern_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_pattern_test_CFLAGS) $(CFLAGS) \ $(ags_pattern_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_peak_audio_signal_test_OBJECTS = ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.$(OBJEXT) ags_peak_audio_signal_test_OBJECTS = \ $(am_ags_peak_audio_signal_test_OBJECTS) ags_peak_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_peak_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_peak_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_peak_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_peak_channel_test_OBJECTS = ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.$(OBJEXT) ags_peak_channel_test_OBJECTS = $(am_ags_peak_channel_test_OBJECTS) ags_peak_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_peak_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_peak_channel_test_CFLAGS) $(CFLAGS) \ $(ags_peak_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_play_audio_signal_test_OBJECTS = ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.$(OBJEXT) ags_play_audio_signal_test_OBJECTS = \ $(am_ags_play_audio_signal_test_OBJECTS) ags_play_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_play_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_play_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_play_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_play_audio_test_OBJECTS = ags/test/audio/recall/play_audio_test-ags_play_audio_test.$(OBJEXT) ags_play_audio_test_OBJECTS = $(am_ags_play_audio_test_OBJECTS) ags_play_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_play_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_play_audio_test_CFLAGS) $(CFLAGS) \ $(ags_play_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_play_channel_test_OBJECTS = ags/test/audio/recall/play_channel_test-ags_play_channel_test.$(OBJEXT) ags_play_channel_test_OBJECTS = $(am_ags_play_channel_test_OBJECTS) ags_play_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_play_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_play_channel_test_CFLAGS) $(CFLAGS) \ $(ags_play_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_play_wave_audio_test_OBJECTS = ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.$(OBJEXT) ags_play_wave_audio_test_OBJECTS = \ $(am_ags_play_wave_audio_test_OBJECTS) ags_play_wave_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_play_wave_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_play_wave_audio_test_CFLAGS) $(CFLAGS) \ $(ags_play_wave_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_play_wave_channel_test_OBJECTS = ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.$(OBJEXT) ags_play_wave_channel_test_OBJECTS = \ $(am_ags_play_wave_channel_test_OBJECTS) ags_play_wave_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_play_wave_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_play_wave_channel_test_CFLAGS) $(CFLAGS) \ $(ags_play_wave_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_playback_domain_test_OBJECTS = ags/test/audio/playback_domain_test-ags_playback_domain_test.$(OBJEXT) ags_playback_domain_test_OBJECTS = \ $(am_ags_playback_domain_test_OBJECTS) ags_playback_domain_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_playback_domain_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_playback_domain_test_CFLAGS) $(CFLAGS) \ $(ags_playback_domain_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_playback_test_OBJECTS = \ ags/test/audio/playback_test-ags_playback_test.$(OBJEXT) ags_playback_test_OBJECTS = $(am_ags_playback_test_OBJECTS) ags_playback_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_playback_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_playback_test_CFLAGS) $(CFLAGS) \ $(ags_playback_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_plugin_port_test_OBJECTS = ags/test/plugin/plugin_port_test-ags_plugin_port_test.$(OBJEXT) ags_plugin_port_test_OBJECTS = $(am_ags_plugin_port_test_OBJECTS) ags_plugin_port_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_plugin_port_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_plugin_port_test_CFLAGS) $(CFLAGS) \ $(ags_plugin_port_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_port_test_OBJECTS = \ ags/test/audio/port_test-ags_port_test.$(OBJEXT) ags_port_test_OBJECTS = $(am_ags_port_test_OBJECTS) ags_port_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_port_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_port_test_CFLAGS) \ $(CFLAGS) $(ags_port_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_prepare_audio_signal_test_OBJECTS = ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.$(OBJEXT) ags_prepare_audio_signal_test_OBJECTS = \ $(am_ags_prepare_audio_signal_test_OBJECTS) ags_prepare_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_prepare_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_prepare_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_prepare_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_preset_test_OBJECTS = \ ags/test/audio/preset_test-ags_preset_test.$(OBJEXT) ags_preset_test_OBJECTS = $(am_ags_preset_test_OBJECTS) ags_preset_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_preset_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_preset_test_CFLAGS) $(CFLAGS) $(ags_preset_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_recall_channel_run_test_OBJECTS = ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.$(OBJEXT) ags_recall_channel_run_test_OBJECTS = \ $(am_ags_recall_channel_run_test_OBJECTS) ags_recall_channel_run_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_channel_run_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_channel_run_test_CFLAGS) $(CFLAGS) \ $(ags_recall_channel_run_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recall_channel_test_OBJECTS = ags/test/audio/recall_channel_test-ags_recall_channel_test.$(OBJEXT) ags_recall_channel_test_OBJECTS = \ $(am_ags_recall_channel_test_OBJECTS) ags_recall_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_channel_test_CFLAGS) $(CFLAGS) \ $(ags_recall_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recall_container_test_OBJECTS = ags/test/audio/recall_container_test-ags_recall_container_test.$(OBJEXT) ags_recall_container_test_OBJECTS = \ $(am_ags_recall_container_test_OBJECTS) ags_recall_container_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_container_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_container_test_CFLAGS) $(CFLAGS) \ $(ags_recall_container_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recall_dependency_test_OBJECTS = ags/test/audio/recall_dependency_test-ags_recall_dependency_test.$(OBJEXT) ags_recall_dependency_test_OBJECTS = \ $(am_ags_recall_dependency_test_OBJECTS) ags_recall_dependency_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_dependency_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_dependency_test_CFLAGS) $(CFLAGS) \ $(ags_recall_dependency_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recall_id_test_OBJECTS = \ ags/test/audio/recall_id_test-ags_recall_id_test.$(OBJEXT) ags_recall_id_test_OBJECTS = $(am_ags_recall_id_test_OBJECTS) ags_recall_id_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_id_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_id_test_CFLAGS) $(CFLAGS) \ $(ags_recall_id_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recall_recycling_test_OBJECTS = ags/test/audio/recall_recycling_test-ags_recall_recycling_test.$(OBJEXT) ags_recall_recycling_test_OBJECTS = \ $(am_ags_recall_recycling_test_OBJECTS) ags_recall_recycling_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_recycling_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_recycling_test_CFLAGS) $(CFLAGS) \ $(ags_recall_recycling_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recall_test_OBJECTS = \ ags/test/audio/recall_test-ags_recall_test.$(OBJEXT) ags_recall_test_OBJECTS = $(am_ags_recall_test_OBJECTS) ags_recall_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recall_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recall_test_CFLAGS) $(CFLAGS) $(ags_recall_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_record_midi_audio_test_OBJECTS = ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.$(OBJEXT) ags_record_midi_audio_test_OBJECTS = \ $(am_ags_record_midi_audio_test_OBJECTS) ags_record_midi_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_record_midi_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_record_midi_audio_test_CFLAGS) $(CFLAGS) \ $(ags_record_midi_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recycling_context_test_OBJECTS = ags/test/audio/recycling_context_test-ags_recycling_context_test.$(OBJEXT) ags_recycling_context_test_OBJECTS = \ $(am_ags_recycling_context_test_OBJECTS) ags_recycling_context_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recycling_context_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recycling_context_test_CFLAGS) $(CFLAGS) \ $(ags_recycling_context_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_recycling_test_OBJECTS = \ ags/test/audio/recycling_test-ags_recycling_test.$(OBJEXT) ags_recycling_test_OBJECTS = $(am_ags_recycling_test_OBJECTS) ags_recycling_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_recycling_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_recycling_test_CFLAGS) $(CFLAGS) \ $(ags_recycling_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_remove_audio_signal_test_OBJECTS = ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.$(OBJEXT) ags_remove_audio_signal_test_OBJECTS = \ $(am_ags_remove_audio_signal_test_OBJECTS) ags_remove_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_remove_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_remove_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_remove_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_remove_audio_test_OBJECTS = ags/test/audio/task/remove_audio_test-ags_remove_audio_test.$(OBJEXT) ags_remove_audio_test_OBJECTS = $(am_ags_remove_audio_test_OBJECTS) ags_remove_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_remove_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_remove_audio_test_CFLAGS) $(CFLAGS) \ $(ags_remove_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_remove_note_test_OBJECTS = ags/test/audio/task/remove_note_test-ags_remove_note_test.$(OBJEXT) ags_remove_note_test_OBJECTS = $(am_ags_remove_note_test_OBJECTS) ags_remove_note_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_remove_note_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_remove_note_test_CFLAGS) $(CFLAGS) \ $(ags_remove_note_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_remove_soundcard_test_OBJECTS = ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.$(OBJEXT) ags_remove_soundcard_test_OBJECTS = \ $(am_ags_remove_soundcard_test_OBJECTS) ags_remove_soundcard_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_remove_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_remove_soundcard_test_CFLAGS) $(CFLAGS) \ $(ags_remove_soundcard_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_reset_amplitude_test_OBJECTS = ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.$(OBJEXT) ags_reset_amplitude_test_OBJECTS = \ $(am_ags_reset_amplitude_test_OBJECTS) ags_reset_amplitude_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_reset_amplitude_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_reset_amplitude_test_CFLAGS) $(CFLAGS) \ $(ags_reset_amplitude_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_reset_peak_test_OBJECTS = ags/test/audio/task/reset_peak_test-ags_reset_peak_test.$(OBJEXT) ags_reset_peak_test_OBJECTS = $(am_ags_reset_peak_test_OBJECTS) ags_reset_peak_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_reset_peak_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_reset_peak_test_CFLAGS) $(CFLAGS) \ $(ags_reset_peak_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_resize_audio_test_OBJECTS = ags/test/audio/task/resize_audio_test-ags_resize_audio_test.$(OBJEXT) ags_resize_audio_test_OBJECTS = $(am_ags_resize_audio_test_OBJECTS) ags_resize_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_resize_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_resize_audio_test_CFLAGS) $(CFLAGS) \ $(ags_resize_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_returnable_thread_test_OBJECTS = ags/test/thread/returnable_thread_test-ags_returnable_thread_test.$(OBJEXT) ags_returnable_thread_test_OBJECTS = \ $(am_ags_returnable_thread_test_OBJECTS) ags_returnable_thread_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_returnable_thread_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_returnable_thread_test_CFLAGS) $(CFLAGS) \ $(ags_returnable_thread_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_route_dssi_audio_test_OBJECTS = ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.$(OBJEXT) ags_route_dssi_audio_test_OBJECTS = \ $(am_ags_route_dssi_audio_test_OBJECTS) ags_route_dssi_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_route_dssi_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_route_dssi_audio_test_CFLAGS) $(CFLAGS) \ $(ags_route_dssi_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_route_lv2_audio_test_OBJECTS = ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.$(OBJEXT) ags_route_lv2_audio_test_OBJECTS = \ $(am_ags_route_lv2_audio_test_OBJECTS) ags_route_lv2_audio_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_route_lv2_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_route_lv2_audio_test_CFLAGS) $(CFLAGS) \ $(ags_route_lv2_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_security_context_test_OBJECTS = ags/test/server/security/security_context_test-ags_security_context_test.$(OBJEXT) ags_security_context_test_OBJECTS = \ $(am_ags_security_context_test_OBJECTS) ags_security_context_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_security_context_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_security_context_test_CFLAGS) $(CFLAGS) \ $(ags_security_context_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_seek_soundcard_test_OBJECTS = ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.$(OBJEXT) ags_seek_soundcard_test_OBJECTS = \ $(am_ags_seek_soundcard_test_OBJECTS) ags_seek_soundcard_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_seek_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_seek_soundcard_test_CFLAGS) $(CFLAGS) \ $(ags_seek_soundcard_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_server_application_context_test_OBJECTS = ags/test/server/server_application_context_test-ags_server_application_context_test.$(OBJEXT) ags_server_application_context_test_OBJECTS = \ $(am_ags_server_application_context_test_OBJECTS) ags_server_application_context_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_server_application_context_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_server_application_context_test_CFLAGS) \ $(CFLAGS) $(ags_server_application_context_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_server_test_OBJECTS = \ ags/test/server/server_test-ags_server_test.$(OBJEXT) ags_server_test_OBJECTS = $(am_ags_server_test_OBJECTS) ags_server_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_server_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_server_test_CFLAGS) $(CFLAGS) $(ags_server_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_set_audio_channels_test_OBJECTS = ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.$(OBJEXT) ags_set_audio_channels_test_OBJECTS = \ $(am_ags_set_audio_channels_test_OBJECTS) ags_set_audio_channels_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_set_audio_channels_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_set_audio_channels_test_CFLAGS) $(CFLAGS) \ $(ags_set_audio_channels_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_set_buffer_size_test_OBJECTS = ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.$(OBJEXT) ags_set_buffer_size_test_OBJECTS = \ $(am_ags_set_buffer_size_test_OBJECTS) ags_set_buffer_size_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_set_buffer_size_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_set_buffer_size_test_CFLAGS) $(CFLAGS) \ $(ags_set_buffer_size_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_set_device_test_OBJECTS = ags/test/audio/task/set_device_test-ags_set_device_test.$(OBJEXT) ags_set_device_test_OBJECTS = $(am_ags_set_device_test_OBJECTS) ags_set_device_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_set_device_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_set_device_test_CFLAGS) $(CFLAGS) \ $(ags_set_device_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_set_format_test_OBJECTS = ags/test/audio/task/set_format_test-ags_set_format_test.$(OBJEXT) ags_set_format_test_OBJECTS = $(am_ags_set_format_test_OBJECTS) ags_set_format_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_set_format_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_set_format_test_CFLAGS) $(CFLAGS) \ $(ags_set_format_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_set_muted_test_OBJECTS = ags/test/audio/task/set_muted_test-ags_set_muted_test.$(OBJEXT) ags_set_muted_test_OBJECTS = $(am_ags_set_muted_test_OBJECTS) ags_set_muted_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_set_muted_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_set_muted_test_CFLAGS) $(CFLAGS) \ $(ags_set_muted_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_set_samplerate_test_OBJECTS = ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.$(OBJEXT) ags_set_samplerate_test_OBJECTS = \ $(am_ags_set_samplerate_test_OBJECTS) ags_set_samplerate_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_set_samplerate_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_set_samplerate_test_CFLAGS) $(CFLAGS) \ $(ags_set_samplerate_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_soundcard_test_OBJECTS = \ ags/test/object/soundcard_test-ags_soundcard_test.$(OBJEXT) ags_soundcard_test_OBJECTS = $(am_ags_soundcard_test_OBJECTS) ags_soundcard_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_soundcard_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_soundcard_test_CFLAGS) $(CFLAGS) \ $(ags_soundcard_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_start_audio_test_OBJECTS = ags/test/audio/task/start_audio_test-ags_start_audio_test.$(OBJEXT) ags_start_audio_test_OBJECTS = $(am_ags_start_audio_test_OBJECTS) ags_start_audio_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_start_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_start_audio_test_CFLAGS) $(CFLAGS) \ $(ags_start_audio_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_start_channel_test_OBJECTS = ags/test/audio/task/start_channel_test-ags_start_channel_test.$(OBJEXT) ags_start_channel_test_OBJECTS = $(am_ags_start_channel_test_OBJECTS) ags_start_channel_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_start_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_start_channel_test_CFLAGS) $(CFLAGS) \ $(ags_start_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_stream_audio_signal_test_OBJECTS = ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.$(OBJEXT) ags_stream_audio_signal_test_OBJECTS = \ $(am_ags_stream_audio_signal_test_OBJECTS) ags_stream_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_stream_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_stream_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_stream_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_synth_generator_test_OBJECTS = ags/test/audio/synth_generator_test-ags_synth_generator_test.$(OBJEXT) ags_synth_generator_test_OBJECTS = \ $(am_ags_synth_generator_test_OBJECTS) ags_synth_generator_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_synth_generator_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_synth_generator_test_CFLAGS) $(CFLAGS) \ $(ags_synth_generator_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_task_test_OBJECTS = \ ags/test/thread/task_test-ags_task_test.$(OBJEXT) ags_task_test_OBJECTS = $(am_ags_task_test_OBJECTS) ags_task_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_task_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_task_test_CFLAGS) \ $(CFLAGS) $(ags_task_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_thread_pool_test_OBJECTS = ags/test/thread/thread_pool_test-ags_thread_pool_test.$(OBJEXT) ags_thread_pool_test_OBJECTS = $(am_ags_thread_pool_test_OBJECTS) ags_thread_pool_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_thread_pool_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_thread_pool_test_CFLAGS) $(CFLAGS) \ $(ags_thread_pool_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_thread_test_OBJECTS = \ ags/test/thread/thread_test-ags_thread_test.$(OBJEXT) ags_thread_test_OBJECTS = $(am_ags_thread_test_OBJECTS) ags_thread_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_thread_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_thread_test_CFLAGS) $(CFLAGS) $(ags_thread_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_time_test_OBJECTS = \ ags/test/lib/time_test-ags_time_test.$(OBJEXT) ags_time_test_OBJECTS = $(am_ags_time_test_OBJECTS) ags_time_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_time_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_time_test_CFLAGS) \ $(CFLAGS) $(ags_time_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_track_test_OBJECTS = \ ags/test/audio/track_test-ags_track_test.$(OBJEXT) ags_track_test_OBJECTS = $(am_ags_track_test_OBJECTS) ags_track_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_track_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_track_test_CFLAGS) $(CFLAGS) $(ags_track_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_turtle_manager_test_OBJECTS = ags/test/lib/turtle_manager_test-ags_turtle_manager_test.$(OBJEXT) ags_turtle_manager_test_OBJECTS = \ $(am_ags_turtle_manager_test_OBJECTS) ags_turtle_manager_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_turtle_manager_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_turtle_manager_test_CFLAGS) $(CFLAGS) \ $(ags_turtle_manager_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_turtle_test_OBJECTS = \ ags/test/lib/turtle_test-ags_turtle_test.$(OBJEXT) ags_turtle_test_OBJECTS = $(am_ags_turtle_test_OBJECTS) ags_turtle_test_DEPENDENCIES = libags_server.la libags_thread.la \ libags.la libags_thread.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) ags_turtle_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_turtle_test_CFLAGS) $(CFLAGS) $(ags_turtle_test_LDFLAGS) \ $(LDFLAGS) -o $@ am_ags_volume_audio_signal_test_OBJECTS = ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.$(OBJEXT) ags_volume_audio_signal_test_OBJECTS = \ $(am_ags_volume_audio_signal_test_OBJECTS) ags_volume_audio_signal_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_volume_audio_signal_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_volume_audio_signal_test_CFLAGS) $(CFLAGS) \ $(ags_volume_audio_signal_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_volume_channel_test_OBJECTS = ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.$(OBJEXT) ags_volume_channel_test_OBJECTS = \ $(am_ags_volume_channel_test_OBJECTS) ags_volume_channel_test_DEPENDENCIES = libags_audio.la \ libags_server.la libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_volume_channel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_volume_channel_test_CFLAGS) $(CFLAGS) \ $(ags_volume_channel_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_wave_test_OBJECTS = \ ags/test/audio/wave_test-ags_wave_test.$(OBJEXT) ags_wave_test_OBJECTS = $(am_ags_wave_test_OBJECTS) ags_wave_test_DEPENDENCIES = libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_wave_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ags_wave_test_CFLAGS) \ $(CFLAGS) $(ags_wave_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_worker_thread_test_OBJECTS = ags/test/thread/worker_thread_test-ags_worker_thread_test.$(OBJEXT) ags_worker_thread_test_OBJECTS = $(am_ags_worker_thread_test_OBJECTS) ags_worker_thread_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_worker_thread_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_worker_thread_test_CFLAGS) $(CFLAGS) \ $(ags_worker_thread_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_xml_authentication_test_OBJECTS = ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.$(OBJEXT) ags_xml_authentication_test_OBJECTS = \ $(am_ags_xml_authentication_test_OBJECTS) ags_xml_authentication_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_xml_authentication_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_xml_authentication_test_CFLAGS) $(CFLAGS) \ $(ags_xml_authentication_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_xml_business_group_test_OBJECTS = ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.$(OBJEXT) ags_xml_business_group_test_OBJECTS = \ $(am_ags_xml_business_group_test_OBJECTS) ags_xml_business_group_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_xml_business_group_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_xml_business_group_test_CFLAGS) $(CFLAGS) \ $(ags_xml_business_group_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_xml_certificate_test_OBJECTS = ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.$(OBJEXT) ags_xml_certificate_test_OBJECTS = \ $(am_ags_xml_certificate_test_OBJECTS) ags_xml_certificate_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_xml_certificate_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_xml_certificate_test_CFLAGS) $(CFLAGS) \ $(ags_xml_certificate_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_xml_password_store_test_OBJECTS = ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.$(OBJEXT) ags_xml_password_store_test_OBJECTS = \ $(am_ags_xml_password_store_test_OBJECTS) ags_xml_password_store_test_DEPENDENCIES = libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_xml_password_store_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(ags_xml_password_store_test_CFLAGS) $(CFLAGS) \ $(ags_xml_password_store_test_LDFLAGS) $(LDFLAGS) -o $@ am_ags_xorg_application_context_test_OBJECTS = ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.$(OBJEXT) ags_xorg_application_context_test_OBJECTS = \ $(am_ags_xorg_application_context_test_OBJECTS) ags_xorg_application_context_test_DEPENDENCIES = libgsequencer.la \ libags_gui.la libags_audio.la libags_server.la \ libags_thread.la libags.la libags_thread.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ags_xorg_application_context_test_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(ags_xorg_application_context_test_CFLAGS) $(CFLAGS) \ $(ags_xorg_application_context_test_LDFLAGS) $(LDFLAGS) -o $@ am__objects_41 = ags/gsequencer-gsequencer_main.$(OBJEXT) am_gsequencer_OBJECTS = $(am__objects_41) $(am__objects_1) gsequencer_OBJECTS = $(am_gsequencer_OBJECTS) gsequencer_DEPENDENCIES = libgsequencer.la libags_audio.la \ libags_server.la libags_gui.la libags_thread.la libags.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) gsequencer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(gsequencer_CFLAGS) \ $(CFLAGS) $(gsequencer_LDFLAGS) $(LDFLAGS) -o $@ am_midi2xml_OBJECTS = ags/midi2xml-midi2xml_main.$(OBJEXT) midi2xml_OBJECTS = $(am_midi2xml_OBJECTS) midi2xml_DEPENDENCIES = libags_audio.la libags_server.la libags_gui.la \ libags_thread.la libags.la $(am__DEPENDENCIES_1) midi2xml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(midi2xml_CFLAGS) \ $(CFLAGS) $(midi2xml_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/ags depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ags/$(DEPDIR)/gsequencer-gsequencer_main.Po \ ags/$(DEPDIR)/midi2xml-midi2xml_main.Po \ ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Plo \ ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Plo \ ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Plo \ ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Plo \ ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Plo \ ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Plo \ ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Plo \ ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Plo \ ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Plo \ ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Plo \ ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Plo \ ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Plo \ ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Plo \ ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Plo \ ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Plo \ ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Plo \ ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Plo \ ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Plo \ ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Plo \ ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Plo \ ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Plo \ ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Plo \ ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Plo \ ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Plo \ ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Plo \ ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Plo \ ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Plo \ ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Plo \ ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Plo \ ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Plo \ ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Plo \ ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Plo \ ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Plo \ ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Plo \ ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Plo \ ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Plo \ ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Plo \ ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Plo \ ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Plo \ ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Plo \ ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Plo \ ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Plo \ ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Plo \ ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Plo \ ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Plo \ ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Plo \ ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Plo \ ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Plo \ ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Plo \ ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Plo \ ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Plo \ ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Plo \ ags/file/$(DEPDIR)/libags_la-ags_file.Plo \ ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Plo \ ags/file/$(DEPDIR)/libags_la-ags_file_launch.Plo \ ags/file/$(DEPDIR)/libags_la-ags_file_link.Plo \ ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_complex.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_conversion.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_endian.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_function.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_log.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_regex.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_string_util.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_time.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_turtle.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Plo \ ags/lib/$(DEPDIR)/libags_la-ags_uuid.Plo \ ags/object/$(DEPDIR)/libags_la-ags_applicable.Plo \ ags/object/$(DEPDIR)/libags_la-ags_application_context.Plo \ ags/object/$(DEPDIR)/libags_la-ags_config.Plo \ ags/object/$(DEPDIR)/libags_la-ags_connectable.Plo \ ags/object/$(DEPDIR)/libags_la-ags_countable.Plo \ ags/object/$(DEPDIR)/libags_la-ags_cursor.Plo \ ags/object/$(DEPDIR)/libags_la-ags_globals.Plo \ ags/object/$(DEPDIR)/libags_la-ags_main_loop.Plo \ ags/object/$(DEPDIR)/libags_la-ags_marshal.Plo \ ags/object/$(DEPDIR)/libags_la-ags_mutable.Plo \ ags/object/$(DEPDIR)/libags_la-ags_plugin.Plo \ ags/object/$(DEPDIR)/libags_la-ags_portlet.Plo \ ags/object/$(DEPDIR)/libags_la-ags_priority.Plo \ ags/object/$(DEPDIR)/libags_la-ags_seekable.Plo \ ags/object/$(DEPDIR)/libags_la-ags_sequencer.Plo \ ags/object/$(DEPDIR)/libags_la-ags_sound_server.Plo \ ags/object/$(DEPDIR)/libags_la-ags_soundcard.Plo \ ags/object/$(DEPDIR)/libags_la-ags_tactable.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Plo \ ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Plo \ ags/server/$(DEPDIR)/libags_server_la-ags_registry.Plo \ ags/server/$(DEPDIR)/libags_server_la-ags_server.Plo \ ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Plo \ ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Plo \ ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Plo \ ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Plo \ ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Plo \ ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Plo \ ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Plo \ ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Po \ ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Po \ ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po \ ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po \ ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Po \ ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Po \ ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Po \ ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Plo \ ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Plo \ ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Po \ ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Po \ ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Po \ ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Po \ ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Po \ ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Po \ ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Po \ ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Po \ ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Po \ ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Po \ ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Po \ ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Po \ ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Po \ ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Po \ ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Po \ ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Po \ ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Po \ ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Po \ ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Po \ ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Po \ ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Po \ ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Po \ ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Po \ ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Po \ ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Po \ ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Po \ ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Po \ ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Po \ ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Po \ ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Po \ ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Po \ ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Po \ ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Po \ ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Po \ ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Po \ ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Po \ ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Po \ ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Po \ ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Po \ ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Po \ ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Po \ ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Po \ ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Po \ ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Po \ ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Po \ ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Po \ ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Po \ ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Po \ ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Po \ ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Po \ ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Po \ ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Po \ ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Po \ ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Po \ ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Po \ ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Po \ ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Po \ ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Po \ ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Po \ ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Po \ ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Po \ ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Po \ ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Po \ ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Po \ ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Po \ ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Po \ ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Po \ ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Po \ ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Po \ ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Po \ ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Po \ ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Po \ ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Po \ ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Po \ ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Po \ ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Po \ ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Po \ ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Po \ ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Po \ ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Po \ ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Po \ ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Po \ ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Po \ ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Po \ ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Po \ ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Po \ ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Po \ ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Po \ ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Po \ ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Po \ ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Po \ ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Po \ ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Po \ ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Po \ ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Po \ ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Po \ ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Po \ ags/test/file/$(DEPDIR)/file_test-ags_file_test.Po \ ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Po \ ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Po \ ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Po \ ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Po \ ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Po \ ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Po \ ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Po \ ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Po \ ags/test/object/$(DEPDIR)/config_test-ags_config_test.Po \ ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Po \ ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Po \ ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Po \ ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Po \ ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Po \ ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Po \ ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Po \ ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Po \ ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Po \ ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Po \ ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Po \ ags/test/server/$(DEPDIR)/server_test-ags_server_test.Po \ ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Po \ ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Po \ ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Po \ ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Po \ ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Po \ ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Po \ ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Po \ ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Po \ ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Po \ ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Po \ ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Po \ ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Po \ ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Po \ ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Po \ ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Po \ ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Po \ ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Po \ ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Plo \ ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Plo \ ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Plo \ ags/util/$(DEPDIR)/libags_la-ags_id_generator.Plo \ ags/util/$(DEPDIR)/libags_la-ags_list_util.Plo \ ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Plo \ ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Plo \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Plo \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Plo \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Plo \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Plo \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Plo \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Plo \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Plo \ ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Plo \ ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libags_la_SOURCES) $(libags_audio_la_SOURCES) \ $(libags_gui_la_SOURCES) $(libags_server_la_SOURCES) \ $(libags_thread_la_SOURCES) $(libags_vst_la_SOURCES) \ $(libgsequencer_la_SOURCES) $(libgsequencer_test_la_SOURCES) \ $(ags_acceleration_test_SOURCES) \ $(ags_add_audio_signal_test_SOURCES) \ $(ags_add_audio_test_SOURCES) $(ags_add_effect_test_SOURCES) \ $(ags_add_note_test_SOURCES) $(ags_add_soundcard_test_SOURCES) \ $(ags_analyse_audio_signal_test_SOURCES) \ $(ags_analyse_channel_test_SOURCES) \ $(ags_application_context_test_SOURCES) \ $(ags_apply_bpm_test_SOURCES) \ $(ags_apply_presets_test_SOURCES) \ $(ags_apply_sequencer_length_test_SOURCES) \ $(ags_apply_synth_test_SOURCES) $(ags_apply_tact_test_SOURCES) \ $(ags_audio_application_context_test_SOURCES) \ $(ags_audio_buffer_util_test_SOURCES) \ $(ags_audio_signal_test_SOURCES) $(ags_audio_test_SOURCES) \ $(ags_authentication_manager_test_SOURCES) \ $(ags_automation_test_SOURCES) $(ags_base_plugin_test_SOURCES) \ $(ags_buffer_audio_signal_test_SOURCES) \ $(ags_buffer_channel_test_SOURCES) $(ags_buffer_test_SOURCES) \ $(ags_buffer_util_test_SOURCES) \ $(ags_business_group_manager_test_SOURCES) \ $(ags_cancel_audio_test_SOURCES) \ $(ags_cancel_channel_test_SOURCES) \ $(ags_capture_wave_audio_test_SOURCES) \ $(ags_capture_wave_channel_test_SOURCES) \ $(ags_certificate_manager_test_SOURCES) \ $(ags_channel_test_SOURCES) \ $(ags_char_buffer_util_test_SOURCES) \ $(ags_clear_audio_signal_test_SOURCES) \ $(ags_clear_buffer_test_SOURCES) $(ags_complex_test_SOURCES) \ $(ags_config_test_SOURCES) $(ags_connectable_test_SOURCES) \ $(ags_controller_test_SOURCES) $(ags_conversion_test_SOURCES) \ $(ags_copy_audio_signal_test_SOURCES) \ $(ags_copy_channel_test_SOURCES) \ $(ags_copy_pattern_audio_test_SOURCES) \ $(ags_copy_pattern_channel_test_SOURCES) \ $(ags_count_beats_audio_test_SOURCES) \ $(ags_crop_note_test_SOURCES) $(ags_delay_audio_test_SOURCES) \ $(ags_destroy_worker_test_SOURCES) $(ags_devin_test_SOURCES) \ $(ags_devout_test_SOURCES) $(ags_dssi_manager_test_SOURCES) \ $(ags_dssi_plugin_test_SOURCES) \ $(ags_envelope_audio_signal_test_SOURCES) \ $(ags_envelope_channel_test_SOURCES) \ $(ags_eq10_audio_signal_test_SOURCES) \ $(ags_eq10_channel_test_SOURCES) \ $(ags_export_output_test_SOURCES) \ $(ags_feed_audio_signal_test_SOURCES) \ $(ags_fifoout_test_SOURCES) $(ags_file_id_ref_test_SOURCES) \ $(ags_file_launch_test_SOURCES) \ $(ags_file_lookup_test_SOURCES) $(ags_file_test_SOURCES) \ $(ags_filter_util_test_SOURCES) \ $(ags_fm_synth_util_test_SOURCES) \ $(ags_fourier_transform_util_test_SOURCES) \ $(ags_free_selection_test_SOURCES) \ $(ags_front_controller_test_SOURCES) \ $(ags_functional_audio_config_test_SOURCES) \ $(ags_functional_audio_test_SOURCES) \ $(ags_functional_automation_editor_workflow_test_SOURCES) \ $(ags_functional_drum_test_SOURCES) \ $(ags_functional_ffplayer_test_SOURCES) \ $(ags_functional_fourier_transform_test_SOURCES) \ $(ags_functional_line_member_add_and_destroy_test_SOURCES) \ $(ags_functional_machine_add_and_destroy_test_SOURCES) \ $(ags_functional_machine_link_test_SOURCES) \ $(ags_functional_matrix_test_SOURCES) \ $(ags_functional_mixer_test_SOURCES) \ $(ags_functional_notation_edit_test_SOURCES) \ $(ags_functional_notation_editor_workflow_test_SOURCES) \ $(ags_functional_osc_server_test_SOURCES) \ $(ags_functional_osc_xmlrpc_server_test_SOURCES) \ $(ags_functional_panel_test_SOURCES) \ $(ags_functional_pitch_test_SOURCES) \ $(ags_functional_server_test_SOURCES) \ $(ags_functional_synth_test_SOURCES) $(ags_input_test_SOURCES) \ $(ags_ladspa_conversion_test_SOURCES) \ $(ags_ladspa_manager_test_SOURCES) \ $(ags_link_channel_test_SOURCES) $(ags_log_test_SOURCES) \ $(ags_lv2_conversion_test_SOURCES) \ $(ags_lv2_manager_test_SOURCES) \ $(ags_lv2_option_manager_test_SOURCES) \ $(ags_lv2_plugin_test_SOURCES) $(ags_lv2_preset_test_SOURCES) \ $(ags_lv2_uri_map_manager_test_SOURCES) \ $(ags_lv2_urid_manager_test_SOURCES) \ $(ags_lv2_worker_manager_test_SOURCES) \ $(ags_lv2ui_manager_test_SOURCES) \ $(ags_lv2ui_plugin_test_SOURCES) \ $(ags_midi_buffer_util_test_SOURCES) \ $(ags_midi_builder_test_SOURCES) $(ags_midi_test_SOURCES) \ $(ags_midiin_test_SOURCES) $(ags_move_note_test_SOURCES) \ $(ags_mute_audio_signal_test_SOURCES) \ $(ags_mute_audio_test_SOURCES) \ $(ags_mute_channel_test_SOURCES) $(ags_notation_test_SOURCES) \ $(ags_note_test_SOURCES) \ $(ags_osc_action_controller_test_SOURCES) \ $(ags_osc_buffer_util_test_SOURCES) \ $(ags_osc_client_test_SOURCES) \ $(ags_osc_config_controller_test_SOURCES) \ $(ags_osc_connection_test_SOURCES) \ $(ags_osc_front_controller_test_SOURCES) \ $(ags_osc_info_controller_test_SOURCES) \ $(ags_osc_message_test_SOURCES) \ $(ags_osc_meter_controller_test_SOURCES) \ $(ags_osc_node_controller_test_SOURCES) \ $(ags_osc_renew_controller_test_SOURCES) \ $(ags_osc_server_test_SOURCES) \ $(ags_osc_status_controller_test_SOURCES) \ $(ags_osc_websocket_connection_test_SOURCES) \ $(ags_osc_xmlrpc_controller_test_SOURCES) \ $(ags_osc_xmlrpc_message_test_SOURCES) \ $(ags_osc_xmlrpc_server_test_SOURCES) \ $(ags_output_test_SOURCES) \ $(ags_password_store_manager_test_SOURCES) \ $(ags_pattern_test_SOURCES) \ $(ags_peak_audio_signal_test_SOURCES) \ $(ags_peak_channel_test_SOURCES) \ $(ags_play_audio_signal_test_SOURCES) \ $(ags_play_audio_test_SOURCES) \ $(ags_play_channel_test_SOURCES) \ $(ags_play_wave_audio_test_SOURCES) \ $(ags_play_wave_channel_test_SOURCES) \ $(ags_playback_domain_test_SOURCES) \ $(ags_playback_test_SOURCES) $(ags_plugin_port_test_SOURCES) \ $(ags_port_test_SOURCES) \ $(ags_prepare_audio_signal_test_SOURCES) \ $(ags_preset_test_SOURCES) \ $(ags_recall_channel_run_test_SOURCES) \ $(ags_recall_channel_test_SOURCES) \ $(ags_recall_container_test_SOURCES) \ $(ags_recall_dependency_test_SOURCES) \ $(ags_recall_id_test_SOURCES) \ $(ags_recall_recycling_test_SOURCES) \ $(ags_recall_test_SOURCES) \ $(ags_record_midi_audio_test_SOURCES) \ $(ags_recycling_context_test_SOURCES) \ $(ags_recycling_test_SOURCES) \ $(ags_remove_audio_signal_test_SOURCES) \ $(ags_remove_audio_test_SOURCES) \ $(ags_remove_note_test_SOURCES) \ $(ags_remove_soundcard_test_SOURCES) \ $(ags_reset_amplitude_test_SOURCES) \ $(ags_reset_peak_test_SOURCES) \ $(ags_resize_audio_test_SOURCES) \ $(ags_returnable_thread_test_SOURCES) \ $(ags_route_dssi_audio_test_SOURCES) \ $(ags_route_lv2_audio_test_SOURCES) \ $(ags_security_context_test_SOURCES) \ $(ags_seek_soundcard_test_SOURCES) \ $(ags_server_application_context_test_SOURCES) \ $(ags_server_test_SOURCES) \ $(ags_set_audio_channels_test_SOURCES) \ $(ags_set_buffer_size_test_SOURCES) \ $(ags_set_device_test_SOURCES) $(ags_set_format_test_SOURCES) \ $(ags_set_muted_test_SOURCES) \ $(ags_set_samplerate_test_SOURCES) \ $(ags_soundcard_test_SOURCES) $(ags_start_audio_test_SOURCES) \ $(ags_start_channel_test_SOURCES) \ $(ags_stream_audio_signal_test_SOURCES) \ $(ags_synth_generator_test_SOURCES) $(ags_task_test_SOURCES) \ $(ags_thread_pool_test_SOURCES) $(ags_thread_test_SOURCES) \ $(ags_time_test_SOURCES) $(ags_track_test_SOURCES) \ $(ags_turtle_manager_test_SOURCES) $(ags_turtle_test_SOURCES) \ $(ags_volume_audio_signal_test_SOURCES) \ $(ags_volume_channel_test_SOURCES) $(ags_wave_test_SOURCES) \ $(ags_worker_thread_test_SOURCES) \ $(ags_xml_authentication_test_SOURCES) \ $(ags_xml_business_group_test_SOURCES) \ $(ags_xml_certificate_test_SOURCES) \ $(ags_xml_password_store_test_SOURCES) \ $(ags_xorg_application_context_test_SOURCES) \ $(gsequencer_SOURCES) $(midi2xml_SOURCES) DIST_SOURCES = $(libags_la_SOURCES) \ $(am__libags_audio_la_SOURCES_DIST) $(libags_gui_la_SOURCES) \ $(libags_server_la_SOURCES) $(libags_thread_la_SOURCES) \ $(am__libags_vst_la_SOURCES_DIST) \ $(am__libgsequencer_la_SOURCES_DIST) \ $(am__libgsequencer_test_la_SOURCES_DIST) \ $(ags_acceleration_test_SOURCES) \ $(ags_add_audio_signal_test_SOURCES) \ $(ags_add_audio_test_SOURCES) $(ags_add_effect_test_SOURCES) \ $(ags_add_note_test_SOURCES) $(ags_add_soundcard_test_SOURCES) \ $(ags_analyse_audio_signal_test_SOURCES) \ $(ags_analyse_channel_test_SOURCES) \ $(ags_application_context_test_SOURCES) \ $(ags_apply_bpm_test_SOURCES) \ $(ags_apply_presets_test_SOURCES) \ $(ags_apply_sequencer_length_test_SOURCES) \ $(ags_apply_synth_test_SOURCES) $(ags_apply_tact_test_SOURCES) \ $(ags_audio_application_context_test_SOURCES) \ $(ags_audio_buffer_util_test_SOURCES) \ $(ags_audio_signal_test_SOURCES) $(ags_audio_test_SOURCES) \ $(ags_authentication_manager_test_SOURCES) \ $(ags_automation_test_SOURCES) $(ags_base_plugin_test_SOURCES) \ $(ags_buffer_audio_signal_test_SOURCES) \ $(ags_buffer_channel_test_SOURCES) $(ags_buffer_test_SOURCES) \ $(ags_buffer_util_test_SOURCES) \ $(ags_business_group_manager_test_SOURCES) \ $(ags_cancel_audio_test_SOURCES) \ $(ags_cancel_channel_test_SOURCES) \ $(ags_capture_wave_audio_test_SOURCES) \ $(ags_capture_wave_channel_test_SOURCES) \ $(ags_certificate_manager_test_SOURCES) \ $(ags_channel_test_SOURCES) \ $(ags_char_buffer_util_test_SOURCES) \ $(ags_clear_audio_signal_test_SOURCES) \ $(ags_clear_buffer_test_SOURCES) $(ags_complex_test_SOURCES) \ $(ags_config_test_SOURCES) $(ags_connectable_test_SOURCES) \ $(ags_controller_test_SOURCES) $(ags_conversion_test_SOURCES) \ $(ags_copy_audio_signal_test_SOURCES) \ $(ags_copy_channel_test_SOURCES) \ $(ags_copy_pattern_audio_test_SOURCES) \ $(ags_copy_pattern_channel_test_SOURCES) \ $(ags_count_beats_audio_test_SOURCES) \ $(ags_crop_note_test_SOURCES) $(ags_delay_audio_test_SOURCES) \ $(ags_destroy_worker_test_SOURCES) $(ags_devin_test_SOURCES) \ $(ags_devout_test_SOURCES) $(ags_dssi_manager_test_SOURCES) \ $(ags_dssi_plugin_test_SOURCES) \ $(ags_envelope_audio_signal_test_SOURCES) \ $(ags_envelope_channel_test_SOURCES) \ $(ags_eq10_audio_signal_test_SOURCES) \ $(ags_eq10_channel_test_SOURCES) \ $(ags_export_output_test_SOURCES) \ $(ags_feed_audio_signal_test_SOURCES) \ $(ags_fifoout_test_SOURCES) $(ags_file_id_ref_test_SOURCES) \ $(ags_file_launch_test_SOURCES) \ $(ags_file_lookup_test_SOURCES) $(ags_file_test_SOURCES) \ $(ags_filter_util_test_SOURCES) \ $(ags_fm_synth_util_test_SOURCES) \ $(ags_fourier_transform_util_test_SOURCES) \ $(ags_free_selection_test_SOURCES) \ $(ags_front_controller_test_SOURCES) \ $(am__ags_functional_audio_config_test_SOURCES_DIST) \ $(am__ags_functional_audio_test_SOURCES_DIST) \ $(am__ags_functional_automation_editor_workflow_test_SOURCES_DIST) \ $(am__ags_functional_drum_test_SOURCES_DIST) \ $(am__ags_functional_ffplayer_test_SOURCES_DIST) \ $(am__ags_functional_fourier_transform_test_SOURCES_DIST) \ $(am__ags_functional_line_member_add_and_destroy_test_SOURCES_DIST) \ $(am__ags_functional_machine_add_and_destroy_test_SOURCES_DIST) \ $(am__ags_functional_machine_link_test_SOURCES_DIST) \ $(am__ags_functional_matrix_test_SOURCES_DIST) \ $(am__ags_functional_mixer_test_SOURCES_DIST) \ $(am__ags_functional_notation_edit_test_SOURCES_DIST) \ $(am__ags_functional_notation_editor_workflow_test_SOURCES_DIST) \ $(am__ags_functional_osc_server_test_SOURCES_DIST) \ $(am__ags_functional_osc_xmlrpc_server_test_SOURCES_DIST) \ $(am__ags_functional_panel_test_SOURCES_DIST) \ $(am__ags_functional_pitch_test_SOURCES_DIST) \ $(am__ags_functional_server_test_SOURCES_DIST) \ $(am__ags_functional_synth_test_SOURCES_DIST) \ $(ags_input_test_SOURCES) \ $(ags_ladspa_conversion_test_SOURCES) \ $(ags_ladspa_manager_test_SOURCES) \ $(ags_link_channel_test_SOURCES) $(ags_log_test_SOURCES) \ $(ags_lv2_conversion_test_SOURCES) \ $(ags_lv2_manager_test_SOURCES) \ $(ags_lv2_option_manager_test_SOURCES) \ $(ags_lv2_plugin_test_SOURCES) $(ags_lv2_preset_test_SOURCES) \ $(ags_lv2_uri_map_manager_test_SOURCES) \ $(ags_lv2_urid_manager_test_SOURCES) \ $(ags_lv2_worker_manager_test_SOURCES) \ $(ags_lv2ui_manager_test_SOURCES) \ $(ags_lv2ui_plugin_test_SOURCES) \ $(ags_midi_buffer_util_test_SOURCES) \ $(ags_midi_builder_test_SOURCES) $(ags_midi_test_SOURCES) \ $(ags_midiin_test_SOURCES) $(ags_move_note_test_SOURCES) \ $(ags_mute_audio_signal_test_SOURCES) \ $(ags_mute_audio_test_SOURCES) \ $(ags_mute_channel_test_SOURCES) $(ags_notation_test_SOURCES) \ $(ags_note_test_SOURCES) \ $(ags_osc_action_controller_test_SOURCES) \ $(ags_osc_buffer_util_test_SOURCES) \ $(ags_osc_client_test_SOURCES) \ $(ags_osc_config_controller_test_SOURCES) \ $(ags_osc_connection_test_SOURCES) \ $(ags_osc_front_controller_test_SOURCES) \ $(ags_osc_info_controller_test_SOURCES) \ $(ags_osc_message_test_SOURCES) \ $(ags_osc_meter_controller_test_SOURCES) \ $(ags_osc_node_controller_test_SOURCES) \ $(ags_osc_renew_controller_test_SOURCES) \ $(ags_osc_server_test_SOURCES) \ $(ags_osc_status_controller_test_SOURCES) \ $(ags_osc_websocket_connection_test_SOURCES) \ $(ags_osc_xmlrpc_controller_test_SOURCES) \ $(ags_osc_xmlrpc_message_test_SOURCES) \ $(ags_osc_xmlrpc_server_test_SOURCES) \ $(ags_output_test_SOURCES) \ $(ags_password_store_manager_test_SOURCES) \ $(ags_pattern_test_SOURCES) \ $(ags_peak_audio_signal_test_SOURCES) \ $(ags_peak_channel_test_SOURCES) \ $(ags_play_audio_signal_test_SOURCES) \ $(ags_play_audio_test_SOURCES) \ $(ags_play_channel_test_SOURCES) \ $(ags_play_wave_audio_test_SOURCES) \ $(ags_play_wave_channel_test_SOURCES) \ $(ags_playback_domain_test_SOURCES) \ $(ags_playback_test_SOURCES) $(ags_plugin_port_test_SOURCES) \ $(ags_port_test_SOURCES) \ $(ags_prepare_audio_signal_test_SOURCES) \ $(ags_preset_test_SOURCES) \ $(ags_recall_channel_run_test_SOURCES) \ $(ags_recall_channel_test_SOURCES) \ $(ags_recall_container_test_SOURCES) \ $(ags_recall_dependency_test_SOURCES) \ $(ags_recall_id_test_SOURCES) \ $(ags_recall_recycling_test_SOURCES) \ $(ags_recall_test_SOURCES) \ $(ags_record_midi_audio_test_SOURCES) \ $(ags_recycling_context_test_SOURCES) \ $(ags_recycling_test_SOURCES) \ $(ags_remove_audio_signal_test_SOURCES) \ $(ags_remove_audio_test_SOURCES) \ $(ags_remove_note_test_SOURCES) \ $(ags_remove_soundcard_test_SOURCES) \ $(ags_reset_amplitude_test_SOURCES) \ $(ags_reset_peak_test_SOURCES) \ $(ags_resize_audio_test_SOURCES) \ $(ags_returnable_thread_test_SOURCES) \ $(ags_route_dssi_audio_test_SOURCES) \ $(ags_route_lv2_audio_test_SOURCES) \ $(ags_security_context_test_SOURCES) \ $(ags_seek_soundcard_test_SOURCES) \ $(ags_server_application_context_test_SOURCES) \ $(ags_server_test_SOURCES) \ $(ags_set_audio_channels_test_SOURCES) \ $(ags_set_buffer_size_test_SOURCES) \ $(ags_set_device_test_SOURCES) $(ags_set_format_test_SOURCES) \ $(ags_set_muted_test_SOURCES) \ $(ags_set_samplerate_test_SOURCES) \ $(ags_soundcard_test_SOURCES) $(ags_start_audio_test_SOURCES) \ $(ags_start_channel_test_SOURCES) \ $(ags_stream_audio_signal_test_SOURCES) \ $(ags_synth_generator_test_SOURCES) $(ags_task_test_SOURCES) \ $(ags_thread_pool_test_SOURCES) $(ags_thread_test_SOURCES) \ $(ags_time_test_SOURCES) $(ags_track_test_SOURCES) \ $(ags_turtle_manager_test_SOURCES) $(ags_turtle_test_SOURCES) \ $(ags_volume_audio_signal_test_SOURCES) \ $(ags_volume_channel_test_SOURCES) $(ags_wave_test_SOURCES) \ $(ags_worker_thread_test_SOURCES) \ $(ags_xml_authentication_test_SOURCES) \ $(ags_xml_business_group_test_SOURCES) \ $(ags_xml_certificate_test_SOURCES) \ $(ags_xml_password_store_test_SOURCES) \ $(ags_xorg_application_context_test_SOURCES) \ $(gsequencer_SOURCES) $(midi2xml_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man1_MANS) DATA = $(appdata_DATA) $(doc_DATA) $(gir_DATA) $(pkgconfig_DATA) \ $(typelib_DATA) am__nobase_include_HEADERS_DIST = ags/libags.h \ ags/lib/ags_buffer_util.h ags/lib/ags_complex.h \ ags/lib/ags_conversion.h ags/lib/ags_endian.h \ ags/lib/ags_function.h ags/lib/ags_log.h ags/lib/ags_regex.h \ ags/lib/ags_solver_matrix.h ags/lib/ags_solver_vector.h \ ags/lib/ags_string_util.h ags/lib/ags_time.h \ ags/lib/ags_turtle.h ags/lib/ags_turtle_manager.h \ ags/lib/ags_uuid.h ags/util/ags_destroy_util.h \ ags/util/ags_id_generator.h ags/util/ags_list_util.h \ ags/util/ags_soundcard_helper.h ags/object/ags_applicable.h \ ags/object/ags_application_context.h ags/object/ags_config.h \ ags/object/ags_connectable.h ags/object/ags_countable.h \ ags/object/ags_cursor.h ags/object/ags_globals.h \ ags/object/ags_macros.h ags/object/ags_main_loop.h \ ags/object/ags_marshal.h ags/object/ags_mutable.h \ ags/object/ags_plugin.h ags/object/ags_portlet.h \ ags/object/ags_priority.h ags/object/ags_seekable.h \ ags/object/ags_sequencer.h ags/object/ags_soundcard.h \ ags/object/ags_sound_server.h ags/object/ags_tactable.h \ ags/file/ags_file.h ags/file/ags_file_id_ref.h \ ags/file/ags_file_launch.h ags/file/ags_file_link.h \ ags/file/ags_file_lookup.h \ ags/thread/ags_concurrency_provider.h \ ags/thread/ags_destroy_worker.h \ ags/thread/ags_generic_main_loop.h \ ags/thread/ags_message_delivery.h \ ags/thread/ags_message_envelope.h \ ags/thread/ags_message_queue.h \ ags/thread/ags_returnable_thread.h \ ags/thread/ags_task_completion.h ags/thread/ags_task.h \ ags/thread/ags_task_launcher.h \ ags/thread/ags_thread_application_context.h \ ags/thread/ags_thread_pool.h ags/thread/ags_thread.h \ ags/thread/ags_timestamp.h ags/thread/ags_worker_thread.h \ ags/server/ags_registry.h ags/server/ags_server.h \ ags/server/ags_server_application_context.h \ ags/server/ags_server_status.h \ ags/server/ags_service_provider.h \ ags/server/security/ags_auth_security_context.h \ ags/server/security/ags_authentication.h \ ags/server/security/ags_authentication_manager.h \ ags/server/security/ags_business_group.h \ ags/server/security/ags_business_group_manager.h \ ags/server/security/ags_certificate.h \ ags/server/security/ags_certificate_manager.h \ ags/server/security/ags_password_store.h \ ags/server/security/ags_password_store_manager.h \ ags/server/security/ags_security_context.h \ ags/server/security/ags_xml_authentication.h \ ags/server/security/ags_xml_business_group.h \ ags/server/security/ags_xml_certificate.h \ ags/server/security/ags_xml_password_store.h \ ags/server/controller/ags_controller.h \ ags/server/controller/ags_front_controller.h \ ags/server/controller/ags_plugin_controller.h \ ags/libags-audio.h ags/audio/ags_sound_enums.h \ ags/audio/ags_synth_enums.h ags/audio/ags_acceleration.h \ ags/audio/ags_audio.h \ ags/audio/ags_audio_application_context.h \ ags/audio/ags_audio_buffer_util.h ags/audio/ags_audio_signal.h \ ags/audio/ags_automation.h ags/audio/ags_buffer.h \ ags/audio/ags_channel.h ags/audio/ags_char_buffer_util.h \ ags/audio/ags_devout.h ags/audio/ags_devin.h \ ags/audio/ags_diatonic_scale.h ags/audio/ags_filter_util.h \ ags/audio/ags_fifoout.h ags/audio/ags_fm_synth_util.h \ ags/audio/ags_fourier_transform_util.h \ ags/audio/ags_frequency_map.h \ ags/audio/ags_frequency_map_manager.h \ ags/audio/ags_generic_recall_channel_run.h \ ags/audio/ags_generic_recall_recycling.h ags/audio/ags_input.h \ ags/audio/ags_lfo_synth_util.h ags/audio/ags_midi.h \ ags/audio/ags_midiin.h ags/audio/ags_notation.h \ ags/audio/ags_note.h ags/audio/ags_output.h \ ags/audio/ags_pattern.h ags/audio/ags_playback.h \ ags/audio/ags_playback_domain.h ags/audio/ags_port.h \ ags/audio/ags_preset.h ags/audio/ags_recall_audio.h \ ags/audio/ags_recall_audio_run.h \ ags/audio/ags_recall_audio_signal.h \ ags/audio/ags_recall_channel.h \ ags/audio/ags_recall_channel_run.h \ ags/audio/ags_recall_container.h \ ags/audio/ags_recall_dependency.h \ ags/audio/ags_recall_factory.h ags/audio/ags_recall.h \ ags/audio/ags_recall_dssi.h ags/audio/ags_recall_dssi_run.h \ ags/audio/ags_recall_id.h ags/audio/ags_recall_ladspa.h \ ags/audio/ags_recall_ladspa_run.h ags/audio/ags_recall_lv2.h \ ags/audio/ags_recall_lv2_run.h \ ags/audio/ags_recall_recycling.h \ ags/audio/ags_recycling_context.h ags/audio/ags_recycling.h \ ags/audio/ags_sound_provider.h ags/audio/ags_sequencer_util.h \ ags/audio/ags_soundcard_util.h ags/audio/ags_synth_generator.h \ ags/audio/ags_synth_util.h ags/audio/ags_track.h \ ags/audio/ags_wave.h ags/audio/thread/ags_audio_loop.h \ ags/audio/thread/ags_audio_thread.h \ ags/audio/thread/ags_channel_thread.h \ ags/audio/thread/ags_sequencer_thread.h \ ags/audio/thread/ags_soundcard_thread.h \ ags/audio/thread/ags_export_thread.h \ ags/audio/thread/ags_sf2_loader.h \ ags/audio/thread/ags_sfz_loader.h \ ags/audio/thread/ags_wave_loader.h \ ags/audio/file/ags_audio_container.h \ ags/audio/file/ags_audio_file.h \ ags/audio/file/ags_audio_file_link.h \ ags/audio/file/ags_sound_container.h \ ags/audio/file/ags_sound_resource.h \ ags/audio/file/ags_sndfile.h ags/audio/file/ags_sfz_file.h \ ags/audio/file/ags_sfz_group.h ags/audio/file/ags_sfz_region.h \ ags/audio/file/ags_sfz_sample.h ags/audio/file/ags_ipatch.h \ ags/audio/file/ags_ipatch_sample.h \ ags/audio/file/ags_ipatch_dls2_reader.h \ ags/audio/file/ags_ipatch_gig_reader.h \ ags/audio/file/ags_ipatch_sf2_reader.h \ ags/audio/midi/ags_midi_buffer_util.h \ ags/audio/midi/ags_midi_util.h \ ags/audio/midi/ags_midi_builder.h \ ags/audio/midi/ags_midi_file.h \ ags/audio/midi/ags_midi_parser.h \ ags/audio/osc/ags_osc_buffer_util.h \ ags/audio/osc/ags_osc_builder.h ags/audio/osc/ags_osc_client.h \ ags/audio/osc/ags_osc_connection.h \ ags/audio/osc/ags_osc_message.h ags/audio/osc/ags_osc_parser.h \ ags/audio/osc/ags_osc_response.h \ ags/audio/osc/ags_osc_server.h ags/audio/osc/ags_osc_util.h \ ags/audio/osc/ags_osc_websocket_connection.h \ ags/audio/osc/ags_osc_xmlrpc_message.h \ ags/audio/osc/ags_osc_xmlrpc_server.h \ ags/audio/osc/controller/ags_osc_controller.h \ ags/audio/osc/controller/ags_osc_action_controller.h \ ags/audio/osc/controller/ags_osc_config_controller.h \ ags/audio/osc/controller/ags_osc_export_controller.h \ ags/audio/osc/controller/ags_osc_front_controller.h \ ags/audio/osc/controller/ags_osc_info_controller.h \ ags/audio/osc/controller/ags_osc_meter_controller.h \ ags/audio/osc/controller/ags_osc_node_controller.h \ ags/audio/osc/controller/ags_osc_plugin_controller.h \ ags/audio/osc/controller/ags_osc_renew_controller.h \ ags/audio/osc/controller/ags_osc_status_controller.h \ ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.h \ ags/audio/jack/ags_jack_client.h \ ags/audio/jack/ags_jack_midiin.h \ ags/audio/jack/ags_jack_devout.h \ ags/audio/jack/ags_jack_devin.h ags/audio/jack/ags_jack_port.h \ ags/audio/jack/ags_jack_server.h \ ags/audio/pulse/ags_pulse_client.h \ ags/audio/pulse/ags_pulse_devout.h \ ags/audio/pulse/ags_pulse_devin.h \ ags/audio/pulse/ags_pulse_port.h \ ags/audio/pulse/ags_pulse_server.h \ ags/audio/core-audio/ags_core_audio_client.h \ ags/audio/core-audio/ags_core_audio_midiin.h \ ags/audio/core-audio/ags_core_audio_devout.h \ ags/audio/core-audio/ags_core_audio_devin.h \ ags/audio/core-audio/ags_core_audio_port.h \ ags/audio/core-audio/ags_core_audio_server.h \ ags/audio/audio-unit/ags_audio_unit_client.h \ ags/audio/audio-unit/ags_audio_unit_devin.h \ ags/audio/audio-unit/ags_audio_unit_devout.h \ ags/audio/audio-unit/ags_audio_unit_port.h \ ags/audio/audio-unit/ags_audio_unit_server.h \ ags/audio/wasapi/ags_wasapi_devout.h \ ags/audio/wasapi/ags_wasapi_devin.h \ ags/audio/task/ags_add_audio.h \ ags/audio/task/ags_add_audio_signal.h \ ags/audio/task/ags_add_effect.h ags/audio/task/ags_add_note.h \ ags/audio/task/ags_add_soundcard.h \ ags/audio/task/ags_apply_presets.h \ ags/audio/task/ags_apply_sound_config.h \ ags/audio/task/ags_apply_synth.h \ ags/audio/task/ags_cancel_audio.h \ ags/audio/task/ags_cancel_channel.h \ ags/audio/task/ags_clear_audio_signal.h \ ags/audio/task/ags_clear_buffer.h \ ags/audio/task/ags_crop_note.h \ ags/audio/task/ags_export_output.h \ ags/audio/task/ags_free_selection.h \ ags/audio/task/ags_link_channel.h \ ags/audio/task/ags_move_note.h ags/audio/task/ags_open_file.h \ ags/audio/task/ags_open_single_file.h \ ags/audio/task/ags_open_wave.h \ ags/audio/task/ags_remove_audio.h \ ags/audio/task/ags_remove_audio_signal.h \ ags/audio/task/ags_remove_note.h \ ags/audio/task/ags_remove_soundcard.h \ ags/audio/task/ags_resize_audio.h \ ags/audio/task/ags_seek_soundcard.h \ ags/audio/task/ags_set_audio_channels.h \ ags/audio/task/ags_set_buffer_size.h \ ags/audio/task/ags_set_device.h \ ags/audio/task/ags_set_format.h \ ags/audio/task/ags_set_samplerate.h \ ags/audio/task/ags_start_audio.h \ ags/audio/task/ags_start_channel.h \ ags/audio/task/ags_start_sequencer.h \ ags/audio/task/ags_start_soundcard.h \ ags/audio/task/ags_stop_sequencer.h \ ags/audio/task/ags_stop_soundcard.h \ ags/audio/task/ags_switch_buffer_flag.h \ ags/audio/task/ags_tic_device.h \ ags/audio/task/ags_toggle_pattern_bit.h \ ags/audio/task/ags_apply_bpm.h \ ags/audio/task/ags_apply_sequencer_length.h \ ags/audio/task/ags_apply_tact.h \ ags/audio/task/ags_reset_amplitude.h \ ags/audio/task/ags_reset_note.h \ ags/audio/task/ags_reset_peak.h ags/audio/task/ags_set_muted.h \ ags/audio/task/ags_open_sf2_instrument.h \ ags/audio/task/ags_open_sf2_sample.h \ ags/audio/recall/ags_analyse_audio_signal.h \ ags/audio/recall/ags_analyse_channel.h \ ags/audio/recall/ags_analyse_channel_run.h \ ags/audio/recall/ags_analyse_recycling.h \ ags/audio/recall/ags_buffer_audio_signal.h \ ags/audio/recall/ags_buffer_channel.h \ ags/audio/recall/ags_buffer_channel_run.h \ ags/audio/recall/ags_buffer_recycling.h \ ags/audio/recall/ags_capture_wave_audio.h \ ags/audio/recall/ags_capture_wave_audio_run.h \ ags/audio/recall/ags_capture_wave_channel.h \ ags/audio/recall/ags_capture_wave_channel_run.h \ ags/audio/recall/ags_copy_audio_signal.h \ ags/audio/recall/ags_copy_channel.h \ ags/audio/recall/ags_copy_channel_run.h \ ags/audio/recall/ags_copy_pattern_audio.h \ ags/audio/recall/ags_copy_pattern_audio_run.h \ ags/audio/recall/ags_copy_pattern_channel.h \ ags/audio/recall/ags_copy_pattern_channel_run.h \ ags/audio/recall/ags_copy_recycling.h \ ags/audio/recall/ags_count_beats_audio.h \ ags/audio/recall/ags_count_beats_audio_run.h \ ags/audio/recall/ags_delay_audio.h \ ags/audio/recall/ags_delay_audio_run.h \ ags/audio/recall/ags_envelope_audio_signal.h \ ags/audio/recall/ags_envelope_channel.h \ ags/audio/recall/ags_envelope_channel_run.h \ ags/audio/recall/ags_envelope_recycling.h \ ags/audio/recall/ags_eq10_audio_signal.h \ ags/audio/recall/ags_eq10_channel.h \ ags/audio/recall/ags_eq10_channel_run.h \ ags/audio/recall/ags_eq10_recycling.h \ ags/audio/recall/ags_feed_audio_signal.h \ ags/audio/recall/ags_feed_channel.h \ ags/audio/recall/ags_feed_channel_run.h \ ags/audio/recall/ags_feed_recycling.h \ ags/audio/recall/ags_lfo_audio_signal.h \ ags/audio/recall/ags_lfo_channel.h \ ags/audio/recall/ags_lfo_channel_run.h \ ags/audio/recall/ags_lfo_recycling.h \ ags/audio/recall/ags_loop_channel.h \ ags/audio/recall/ags_loop_channel_run.h \ ags/audio/recall/ags_mute_audio.h \ ags/audio/recall/ags_mute_audio_run.h \ ags/audio/recall/ags_mute_audio_signal.h \ ags/audio/recall/ags_mute_channel.h \ ags/audio/recall/ags_mute_channel_run.h \ ags/audio/recall/ags_mute_recycling.h \ ags/audio/recall/ags_peak_audio_signal.h \ ags/audio/recall/ags_peak_channel.h \ ags/audio/recall/ags_peak_channel_run.h \ ags/audio/recall/ags_peak_recycling.h \ ags/audio/recall/ags_play_audio.h \ ags/audio/recall/ags_play_audio_signal.h \ ags/audio/recall/ags_play_channel.h \ ags/audio/recall/ags_play_channel_run.h \ ags/audio/recall/ags_play_channel_run_master.h \ ags/audio/recall/ags_play_dssi_audio.h \ ags/audio/recall/ags_play_dssi_audio_run.h \ ags/audio/recall/ags_play_lv2_audio.h \ ags/audio/recall/ags_play_lv2_audio_run.h \ ags/audio/recall/ags_play_notation_audio.h \ ags/audio/recall/ags_play_notation_audio_run.h \ ags/audio/recall/ags_play_recycling.h \ ags/audio/recall/ags_play_wave_audio.h \ ags/audio/recall/ags_play_wave_audio_run.h \ ags/audio/recall/ags_play_wave_channel.h \ ags/audio/recall/ags_play_wave_channel_run.h \ ags/audio/recall/ags_prepare_audio_signal.h \ ags/audio/recall/ags_prepare_channel.h \ ags/audio/recall/ags_prepare_channel_run.h \ ags/audio/recall/ags_prepare_recycling.h \ ags/audio/recall/ags_record_midi_audio.h \ ags/audio/recall/ags_record_midi_audio_run.h \ ags/audio/recall/ags_route_dssi_audio.h \ ags/audio/recall/ags_route_dssi_audio_run.h \ ags/audio/recall/ags_route_lv2_audio.h \ ags/audio/recall/ags_route_lv2_audio_run.h \ ags/audio/recall/ags_rt_stream_audio_signal.h \ ags/audio/recall/ags_rt_stream_channel.h \ ags/audio/recall/ags_rt_stream_channel_run.h \ ags/audio/recall/ags_rt_stream_recycling.h \ ags/audio/recall/ags_stream_audio_signal.h \ ags/audio/recall/ags_stream_channel.h \ ags/audio/recall/ags_stream_channel_run.h \ ags/audio/recall/ags_stream_recycling.h \ ags/audio/recall/ags_volume_audio_signal.h \ ags/audio/recall/ags_volume_channel.h \ ags/audio/recall/ags_volume_channel_run.h \ ags/audio/recall/ags_volume_recycling.h \ ags/plugin/ags_base_plugin.h ags/plugin/ags_dssi_manager.h \ ags/plugin/ags_dssi_plugin.h \ ags/plugin/ags_ladspa_conversion.h \ ags/plugin/ags_ladspa_manager.h ags/plugin/ags_ladspa_plugin.h \ ags/plugin/ags_lv2_conversion.h ags/plugin/ags_lv2_manager.h \ ags/plugin/ags_lv2_turtle_parser.h ags/plugin/ags_lv2_plugin.h \ ags/plugin/ags_lv2_preset_manager.h \ ags/plugin/ags_lv2_preset.h ags/plugin/ags_lv2_event_manager.h \ ags/plugin/ags_lv2_log_manager.h \ ags/plugin/ags_lv2_option_manager.h \ ags/plugin/ags_lv2_uri_map_manager.h \ ags/plugin/ags_lv2_urid_manager.h \ ags/plugin/ags_lv2_worker_manager.h \ ags/plugin/ags_lv2_worker.h ags/plugin/ags_lv2ui_manager.h \ ags/plugin/ags_lv2ui_plugin.h ags/plugin/ags_plugin_stock.h \ ags/plugin/ags_plugin_port.h ags/libags-gui.h \ ags/widget/ags_cartesian.h ags/widget/ags_dial.h \ ags/widget/ags_expander.h ags/widget/ags_expander_set.h \ ags/widget/ags_hindicator.h ags/widget/ags_hled_array.h \ ags/widget/ags_indicator.h ags/widget/ags_led.h \ ags/widget/ags_led_array.h ags/widget/ags_level.h \ ags/widget/ags_level_box.h ags/widget/ags_hlevel_box.h \ ags/widget/ags_vlevel_box.h ags/widget/ags_notebook.h \ ags/widget/ags_piano_keys.h ags/widget/ags_piano.h \ ags/widget/ags_scrolled_piano.h ags/widget/ags_scale.h \ ags/widget/ags_scale_box.h ags/widget/ags_vscale_box.h \ ags/widget/ags_hscale_box.h \ ags/widget/ags_scrolled_level_box.h \ ags/widget/ags_scrolled_scale_box.h ags/widget/ags_ruler.h \ ags/widget/ags_vindicator.h ags/widget/ags_vled_array.h \ ags/widget/ags_widget_marshal.h ags/widget/ags_container.h HEADERS = $(nobase_include_HEADERS) $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir distdir-am dist dist-all \ distcheck am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/libags.pc.in \ $(srcdir)/libags_audio.pc.in $(srcdir)/libags_gui.pc.in \ $(srcdir)/libgsequencer.pc.in \ $(top_srcdir)/ags/ags_config.h.in \ $(top_srcdir)/ags/config.h.in \ $(top_srcdir)/functional-tests.mk $(top_srcdir)/unit-tests.mk \ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS README TODO \ compile config.guess config.rpath config.sub depcomp \ install-sh ltmain.sh missing mkinstalldirs test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ # AM_CPPFLAGS += -march=native -O3 -ftree-vectorize -ftree-slp-vectorize -ffast-math -ftree-vectorizer-verbose=2 # what flags you want to pass to the C compiler & linker CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ $(LTLIBINTL) $(am__append_6) LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ # # TARGETS = gsequencer localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign SUBDIRS = po m4 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-introspection ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} AM_CPPFLAGS = -std=gnu99 $(am__append_1) $(am__append_2) \ $(am__append_3) -DSRCDIR=\"$(srcdir)\" \ -DDESTDIR=\"$(datadir)\" -DDOCDIR=\"$(docdir)\" \ -DPACKAGE_VERSION=\"$(PACKAGE_VERSION)\" \ -DAGS_REDUCE_RT_EVENTS=1 $(am__append_4) $(am__append_5) @WITH_W32API_TRUE@AM_LDFLAGS = -no-undefined -L$(top_builddir)/lib -lgnu gsequencer_CFLAGS = @GSEQUENCER_CFLAGS@ $(LIBASOUND2_CFLAGS) \ $(LIBAO_CFLAGS) $(LIBXML2_CFLAGS) $(LIBSOUP_CFLAGS) \ $(SNDFILE_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) \ $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(CAIRO_CFLAGS) \ $(GTK_CFLAGS) $(WEBKITGTK_CFLAGS) \ $(GTK_MAC_INTEGRATION_CFLAGS) $(W32API_CFLAGS) gsequencer_LDFLAGS = @GSEQUENCER_LDFLAGS@ -pthread midi2xml_CFLAGS = @GSEQUENCER_CFLAGS@ -I./ $(LIBXML2_CFLAGS) \ $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(LIBINSTPATCH_CFLAGS) \ $(LIBSOUP_CFLAGS) $(W32API_CFLAGS) midi2xml_LDFLAGS = @GSEQUENCER_LDFLAGS@ $(LIBXML2_LIBS) \ $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(LIBINSTPATCH_LIBS) \ $(W32API_LIBS) # this lists the binaries to produce, the (non-PHONY, binary) targets in # the previous manual Makefile lib_LTLIBRARIES = libags.la libags_thread.la libags_server.la \ libags_audio.la libags_gui.la $(am__append_7) @AGS_WITH_PUBLIC_LIBGSEQUENCER_FALSE@libgsequencerdir = $(libdir)/gsequencer @AGS_WITH_PUBLIC_LIBGSEQUENCER_TRUE@libgsequencerdir = $(libdir) libgsequencer_LTLIBRARIES = libgsequencer.la #EXTRA_DIST += \ # lv2.lib/mda/EPiano-presets.ttl # MIME specification # extra EXTRA_DIST = config.rpath COPYING.server COPYING.docs COPYING.stk-4.3 \ ags/config.h.in ags/ags_config.h.in gtk-doc.make \ gsequencer.share acsite.m4 aclocal.m4 gsequencer.1 README \ ags_example.xml midi2xml.1 ags_authentication_test.xml \ ags_business_group_test.xml ags_certificate_test.xml \ ags_password_store_test.xml \ ags_functional_server_test_authentication.xml \ ags_functional_server_test_password_store.xml \ ags_functional_osc_xmlrpc_server_test_authentication.xml \ ags_functional_osc_xmlrpc_server_test_password_store.xml \ ags_functional_notation_edit_test.xml \ ags_functional_audio_config_test.xml mkinstalldirs \ m4/Makefile.am m4/Makefile.in m4/introspection.m4 ags/i18n.h \ ags/gettext.h ags/README ags/lib/AUTHORS \ ags/server/security/AUTHORS ags/audio/AUTHORS \ ags/audio/recall/AUTHORS docs/images/README \ docs/reference/libags-audio/README \ docs/reference/libags-gui/README docs/reference/libags/README \ docs/reference/libgsequencer/README \ gsequencer.share/icons/README gsequencer.share/images/README \ po/README license-notice-gnu-agpl-3-0+-c.txt \ license-notice-gnu-fdl-1-3-xml.txt \ license-notice-gnu-gpl-3-0+-c.txt \ license-notice-gnu-gpl-3-0+-sym.txt \ license-notice-gnu-agpl-3-0+-sym.txt \ license-notice-permissive-xml.txt libags.sym.in \ libags_thread.sym.in libags_server.sym.in libags_audio.sym.in \ libags_gui.sym.in unit-system-tests.mk.am \ unit-system-tests.mk.in functional-system-tests.mk.am \ functional-system-tests.mk.in \ docs/reference/libags/libags-sections.txt.in \ docs/reference/libags/libags.types.in \ docs/reference/libags/libags.interfaces.in \ docs/reference/libags-audio/libags_audio-sections.txt.in \ docs/reference/libags-audio/libags_audio.types.in \ docs/reference/libags-audio/libags_audio.interfaces.in \ docs/reference/libags-gui/libags_gui-sections.txt.in \ docs/reference/libags-gui/libags_gui.types.in \ docs/reference/libags-gui/libags_gui.interfaces.in \ docs/reference/libgsequencer/libgsequencer-sections.txt.in \ docs/reference/libgsequencer/libgsequencer.types.in \ docs/reference/libgsequencer/libgsequencer.interfaces.in \ clean-gtk-doc.sh lv2/lv2plug.in/ns/lv2ext/lv2_programs.h \ apple_script.sh prepare-distribution.sh libags.pc.in \ libags_audio.pc.in libags_gui.pc.in libgsequencer.pc.in \ gsequencer.desktop.in application-x-gsequencer.xml \ org.nongnu.gsequencer.gsequencer.appdata.xml libags.sym \ libags_thread.sym libags_server.sym libags_audio.sym \ libags_gui.sym docs/reference/libags/git.mk \ docs/reference/libags/gtk-doc.make \ docs/reference/libags/Makefile.am \ docs/reference/libags/Makefile.in \ docs/reference/libags/libags-overrides.txt \ docs/reference/libags/libags-sections.txt \ docs/reference/libags/libags.types \ docs/reference/libags/libags.xml \ docs/reference/libags-audio/git.mk \ docs/reference/libags-audio/gtk-doc.make \ docs/reference/libags-audio/Makefile.am \ docs/reference/libags-audio/Makefile.in \ docs/reference/libags-audio/libags_audio-overrides.txt \ docs/reference/libags-audio/libags_audio-sections.txt \ docs/reference/libags-audio/libags_audio.types \ docs/reference/libags-audio/libags_audio.xml \ docs/reference/libags-gui/git.mk \ docs/reference/libags-gui/gtk-doc.make \ docs/reference/libags-gui/Makefile.am \ docs/reference/libags-gui/Makefile.in \ docs/reference/libags-gui/libags_gui-overrides.txt \ docs/reference/libags-gui/libags_gui-sections.txt \ docs/reference/libags-gui/libags_gui.types \ docs/reference/libags-gui/libags_gui.xml \ docs/reference/libgsequencer/git.mk \ docs/reference/libgsequencer/gtk-doc.make \ docs/reference/libgsequencer/Makefile.am \ docs/reference/libgsequencer/Makefile.in \ docs/reference/libgsequencer/libgsequencer-overrides.txt \ docs/reference/libgsequencer/libgsequencer.xml $(manpages) \ $(userdoc) $(userdocimages) $(devdoc) $(devdocimages) \ $(devdoclistings) $(oscdoc) \ $(top_srcdir)/ags/server/security/ags_authentication.dtd \ $(top_srcdir)/ags/server/security/ags_business_group.dtd \ $(top_srcdir)/ags/server/security/ags_certificate.dtd \ $(top_srcdir)/ags/server/security/ags_password_store.dtd \ $(top_srcdir)/ags/audio/midi/ags_midi_file.dtd \ $(top_srcdir)/ags/audio/osc/ags_osc_file.dtd \ $(top_srcdir)/ags/file/ags_file.dtd \ $(top_srcdir)/ags/X/file/ags_simple_file.dtd \ $(top_srcdir)/ags.xsl $(top_srcdir)/ags-simple.xsl \ $(top_srcdir)/ags/object/ags_marshallers.list.in \ $(top_srcdir)/ags/widget/ags_widget_marshallers.list.in man1_MANS = gsequencer.1 midi2xml.1 # clean CLEANFILES = functional-system-tests.mk m4/Makefile libags.sym \ libags_thread.sym libags_server.sym libags_audio.sym \ libags_gui.sym ags/object/ags_marshallers.list \ ags/widget/ags_widget_marshallers.list \ docs/listings/add_pattern.c docs/listings/application_mutex.c \ docs/listings/audio.c \ docs/listings/audio_application_context.c \ docs/listings/complete_example.c docs/listings/config.c \ docs/listings/effects_echo_audio.c \ docs/listings/effects_echo_audio_run.c \ docs/listings/effects_echo_channel.c \ docs/listings/effects_echo_channel_run.c \ docs/listings/effects_recall_container.c \ docs/listings/file_property.c docs/listings/file_read.c \ docs/listings/file_write.c \ docs/listings/linking_prerequisites.c \ docs/listings/linking_safe.c docs/listings/linking_unsafe.c \ docs/listings/notation_clipboard.c docs/listings/pcm_info.c \ docs/listings/port.c docs/listings/pull_thread.c \ docs/listings/recycling.c docs/listings/start_thread.c \ docs/listings/thread_application_context.c \ docs/listings/thread_obj_mutex.c \ docs/reference/libags/libags-sections.txt \ docs/reference/libags/libags.types \ docs/reference/libags/libags.interfaces \ docs/reference/libags-audio/libags_audio-sections.txt \ docs/reference/libags-audio/libags_audio.types \ docs/reference/libags-audio/libags_audio.interfaces \ docs/reference/libags-gui/libags_gui-sections.txt \ docs/reference/libags-gui/libags_gui.types \ docs/reference/libags-gui/libags_gui.interfaces \ docs/reference/libgsequencer/libgsequencer-sections.txt \ docs/reference/libgsequencer/libgsequencer.types \ docs/reference/libgsequencer/libgsequencer.interfaces \ $(am__append_9) $(appdata_DATA) $(pkgconfig_DATA) INTROSPECTION_GIRS = $(am__append_8) INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir) --includedir=$(top_builddir) @HAVE_INTROSPECTION_TRUE@introspection_sources = $(libags_la_SOURCES) $(libags_audio_la_SOURCES) $(libags_gui_la_SOURCES) @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_INCLUDES = libxml2-2.0 GObject-2.0 Soup-2.4 @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_C_INCLUDES = ags/libags.h @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_CFLAGS = $(INCLUDES) $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(LIBSOUP_CFLAGS) @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_LIBS = libags.la libags_thread.la libags_server.la @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_FILES = $(libags_la_HEADERS_0) $(libags_la_SOURCES) $(libags_thread_la_HEADERS_0) $(libags_thread_la_SOURCES) $(libags_server_la_HEADERS_0) $(libags_server_la_SOURCES) @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_NAMESPACE = Ags @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_VERSION = 3.0 @HAVE_INTROSPECTION_TRUE@Ags_3_0_gir_SCANNERFLAGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all --include=Soup-2.4 --include=GObject-2.0 --include=libxml2-2.0 --namespace=Ags --nsversion=3.0 --identifier-prefix=Ags --symbol-prefix=ags_ --output=$(top_builddir)/Ags-3.0.gir @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_INCLUDES = libxml2-2.0 GObject-2.0 Soup-2.4 Ags-3.0 @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_C_INCLUDES = ags/libags-audio.h @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_CFLAGS = $(INCLUDES) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SAMPLERATE_CFLAGS) $(SNDFILE_CFLAGS) $(FFTW_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_LIBS = libags_audio.la @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_FILES = $(libags_audio_la_HEADERS_0) $(libags_audio_la_SOURCES) @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_NAMESPACE = AgsAudio @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_VERSION = 3.0 @HAVE_INTROSPECTION_TRUE@AgsAudio_3_0_gir_SCANNERFLAGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all --include=Soup-2.4 --include=GObject-2.0 --include=libxml2-2.0 --include=Ags-3.0 --namespace=AgsAudio --nsversion=3.0 --identifier-prefix=Ags --symbol-prefix=ags_ --output=$(top_builddir)/AgsAudio-3.0.gir @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_INCLUDES = GObject-2.0 Gtk-3.0 @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_C_INCLUDES = ags/libags-gui.h @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_CFLAGS = $(INCLUDES) $(GTK_CFLAGS) @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_LIBS = libags_gui.la @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_FILES = $(libags_gui_la_HEADERS_0) $(libags_gui_la_SOURCES) @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_NAMESPACE = AgsGui @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_VERSION = 3.0 @HAVE_INTROSPECTION_TRUE@AgsGui_3_0_gir_SCANNERFLAGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all --include=Gtk-3.0 --namespace=AgsGui --nsversion=3.0 --identifier-prefix=Ags --symbol-prefix=ags_ --output=$(top_builddir)/AgsGui-3.0.gir @HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0 @HAVE_INTROSPECTION_TRUE@gir_DATA = $(INTROSPECTION_GIRS) @HAVE_INTROSPECTION_TRUE@typelibdir = $(libdir)/girepository-1.0 @HAVE_INTROSPECTION_TRUE@typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) # pkg-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libags.pc libags_audio.pc libags_gui.pc \ $(am__append_10) # desktop file appdatadir = $(datadir)/applications appdata_DATA = gsequencer.desktop # EXTRA_DIST += docs/reference/libgsequencer # include otherincludedir = $(includedir)/ags nobase_include_HEADERS = $(libags_la_HEADERS_0) $(libags_thread_la_HEADERS_0) $(libags_server_la_HEADERS_0) $(libags_audio_la_HEADERS_0) $(libags_gui_la_HEADERS_0) # nobase_include_HEADERS += $(libgsequencer_la_HEADERS_0) # doc # docdir = $(datadir)/doc/gsequencer doc_DATA = README ags_example.xml # documentation manpages = \ gsequencer.1.xml \ midi2xml.1.xml userdoc = \ docs/usersBook.xml \ docs/appa.xml \ docs/usersBook/appb.xml \ docs/usersBook/chap1.xml \ docs/usersBook/chap2.xml \ docs/usersBook/chap3.xml \ docs/usersBook/chap4.xml \ docs/usersBook/chap5.xml \ docs/usersBook/chap6.xml \ docs/usersBook/preface.xml devdoc = \ docs/developersBook.xml \ docs/developersBook/preface.xml \ docs/developersBook/chap1.xml \ docs/developersBook/chap2.xml \ docs/developersBook/chap3.xml \ docs/developersBook/chap4.xml \ docs/developersBook/chap5.xml \ docs/developersBook/chap6.xml \ docs/developersBook/chap7.xml \ docs/developersBook/chap8.xml \ docs/developersBook/chap9.xml \ docs/developersBook/chap10.xml \ docs/developersBook/chap11.xml \ docs/developersBook/chap12.xml \ docs/developersBook/appb.xml oscdoc = \ docs/oscBook.xml \ docs/oscBook/appb.xml \ docs/oscBook/chap1.xml \ docs/oscBook/chap2.xml \ docs/oscBook/chap3.xml \ docs/oscBook/chap4.xml \ docs/oscBook/chap5.xml \ docs/oscBook/chap6.xml \ docs/oscBook/chap7.xml \ docs/oscBook/chap8.xml \ docs/oscBook/appb.xml devdoclistings = \ docs/listings/add_pattern.c.in \ docs/listings/application_mutex.c.in \ docs/listings/audio_application_context.c.in \ docs/listings/audio.c.in \ docs/listings/complete_example.c.in \ docs/listings/config.c.in \ docs/listings/effects_echo_audio.c.in \ docs/listings/effects_echo_audio_run.c.in \ docs/listings/effects_echo_channel.c.in \ docs/listings/effects_echo_channel_run.c.in \ docs/listings/effects_recall_container.c.in \ docs/listings/file_property.c.in \ docs/listings/file_read.c.in \ docs/listings/file_write.c.in \ docs/listings/linking_prerequisites.c.in \ docs/listings/linking_safe.c.in \ docs/listings/linking_unsafe.c.in \ docs/listings/notation_clipboard.c.in \ docs/listings/pcm_info.c.in \ docs/listings/pull_thread.c.in \ docs/listings/port.c.in \ docs/listings/recycling.c.in \ docs/listings/start_thread.c.in \ docs/listings/thread_obj_mutex.c.in \ docs/listings/thread_application_context.c.in devdocimages = \ $(top_srcdir)/docs/images/AGS_iterator.png \ $(top_srcdir)/docs/images/AGS_recall_lifecycle.png \ $(top_srcdir)/docs/images/AGS_super-threaded.png \ $(top_srcdir)/docs/images/AGS_linking.png userdocimages = \ $(top_srcdir)/docs/images/ags_audiorec.png \ $(top_srcdir)/docs/images/ags-automation-toolbar.png \ $(top_srcdir)/docs/images/ags_automation_window_drum.png \ $(top_srcdir)/docs/images/ags_equalizer10.png \ $(top_srcdir)/docs/images/ags_export_window.png \ $(top_srcdir)/docs/images/ags_machine_properties-input.png \ $(top_srcdir)/docs/images/ags_machine_properties-resize_channels.png \ $(top_srcdir)/docs/images/ags_navigation.png \ $(top_srcdir)/docs/images/ags_audio_preferences.png \ $(top_srcdir)/docs/images/ags_audio_connection_output_bulk.png \ $(top_srcdir)/docs/images/ags_audio_connection_output_line.png \ $(top_srcdir)/docs/images/ags_audio_connection_input_bulk.png \ $(top_srcdir)/docs/images/ags_audio_connection_input_line.png \ $(top_srcdir)/docs/images/ags_midi_dialog.png \ $(top_srcdir)/docs/images/ags_midi_export_wizard_no1.png \ $(top_srcdir)/docs/images/ags_midi_export_wizard_no2.png \ $(top_srcdir)/docs/images/ags_midi_import_wizard_no1.png \ $(top_srcdir)/docs/images/ags_midi_import_wizard_no2.png \ $(top_srcdir)/docs/images/ags_midi_preferences.png \ $(top_srcdir)/docs/images/ags_ffplayer.png \ $(top_srcdir)/docs/images/ags_fm_synth.png \ $(top_srcdir)/docs/images/ags_fm_syncsynth.png \ $(top_srcdir)/docs/images/ags_ladspa_browser.png \ $(top_srcdir)/docs/images/ags_machine_properties-link_input.png \ $(top_srcdir)/docs/images/ags_matrix.png \ $(top_srcdir)/docs/images/ags_panel.png \ $(top_srcdir)/docs/images/ags_spectrometer.png \ $(top_srcdir)/docs/images/ags_synth.png \ $(top_srcdir)/docs/images/ags_syncsynth.png \ $(top_srcdir)/docs/images/ags-toolbar.png \ $(top_srcdir)/docs/images/ags_drum.png \ $(top_srcdir)/docs/images/ags_generic_preferences.png \ $(top_srcdir)/docs/images/ags_machine_properties-output.png \ $(top_srcdir)/docs/images/ags_mixer.png \ $(top_srcdir)/docs/images/ags_pitch_sampler.png \ $(top_srcdir)/docs/images/ags_performance_preferences.png \ $(top_srcdir)/docs/images/ags_server_preferences.png \ $(top_srcdir)/docs/images/ags_machine_envelope_editor.png \ $(top_srcdir)/docs/images/ags_machine_envelope_info.png \ $(top_srcdir)/docs/images/ags_machine_envelope_pattern.png \ $(top_srcdir)/docs/images/ags_move_notes_dialog.png \ $(top_srcdir)/docs/images/ags_crop_notes_dialog.png \ $(top_srcdir)/docs/images/ags_position_notation_cursor_dialog.png \ $(top_srcdir)/docs/images/ags_position_automation_cursor_dialog.png \ $(top_srcdir)/docs/images/ags_position_wave_cursor_dialog.png \ $(top_srcdir)/docs/images/ags_select_notes_dialog.png \ $(top_srcdir)/docs/images/ags_select_accelerations_dialog.png \ $(top_srcdir)/docs/images/ags_select_buffers_dialog.png \ $(top_srcdir)/docs/images/ags_ramp_accelerations_dialog.png \ $(top_srcdir)/docs/images/ags-wave-toolbar.png \ $(top_srcdir)/docs/images/ags_wave_window_audiorec.png # conditional objects # libraries and gsequencer libags_la_SOURCES = $(libags_c_sources) $(libags_util_c_sources) $(libags_object_c_sources) $(libags_file_c_sources) $(libags_file_task_c_sources) libags_la_HEADERS_0 = ags/libags.h $(libags_h_sources) $(libags_util_h_sources) $(libags_object_h_sources) $(libags_file_h_sources) $(libags_file_task_h_sources) libags_thread_la_SOURCES = $(libags_thread_c_sources) $(libags_thread_task_c_sources) libags_thread_la_HEADERS_0 = $(libags_thread_h_sources) $(libags_thread_task_h_sources) libags_server_la_SOURCES = $(libags_server_c_sources) $(libags_server_security_c_sources) $(libags_server_controller_c_sources) libags_server_la_HEADERS_0 = $(libags_server_h_sources) $(libags_server_security_h_sources) $(libags_server_controller_h_sources) libags_audio_la_SOURCES = $(libags_audio_c_sources) $(libags_audio_thread_c_sources) $(libags_audio_file_c_sources) $(libags_audio_midi_c_sources) $(libags_audio_osc_c_sources) $(libags_audio_osc_controller_c_sources) $(libags_audio_osc_xmlrpc_c_sources) $(libags_audio_jack_c_sources) $(libags_audio_pulse_c_sources) $(libags_audio_core_audio_c_sources) $(libags_audio_audio_unit_c_sources) $(libags_audio_wasapi_c_sources) $(libags_audio_task_c_sources) $(libags_audio_task_recall_c_sources) $(libags_audio_recall_c_sources) $(libags_plugin_c_sources) libags_audio_la_HEADERS_0 = ags/libags-audio.h $(libags_audio_h_sources) $(libags_audio_thread_h_sources) $(libags_audio_file_h_sources) $(libags_audio_midi_h_sources) $(libags_audio_osc_h_sources) $(libags_audio_osc_controller_h_sources) $(libags_audio_osc_xmlrpc_h_sources) $(libags_audio_jack_h_sources) $(libags_audio_pulse_h_sources) $(libags_audio_core_audio_h_sources) $(libags_audio_audio_unit_h_sources) $(libags_audio_wasapi_h_sources) $(libags_audio_task_h_sources) $(libags_audio_task_recall_h_sources) $(libags_audio_recall_h_sources) $(libags_plugin_h_sources) libags_gui_la_SOURCES = $(libags_gui_c_sources) libags_gui_la_HEADERS_0 = ags/libags-gui.h $(libags_gui_h_sources) libgsequencer_la_HEADERS_0 = $(libgsequencer_h_sources) $(libgsequencer_osc_controller_h_sources) $(libgsequencer_file_h_sources) $(libgsequencer_task_h_sources) $(libgsequencer_import_h_sources) $(libgsequencer_export_h_sources) $(libgsequencer_machine_h_sources) $(libgsequencer_editor_h_sources) libgsequencer_la_SOURCES = $(libgsequencer_la_HEADERS_0) $(libgsequencer_c_sources) $(libgsequencer_osc_controller_c_sources) $(libgsequencer_file_c_sources) $(libgsequencer_task_c_sources) $(libgsequencer_import_c_sources) $(libgsequencer_export_c_sources) $(libgsequencer_machine_c_sources) $(libgsequencer_editor_c_sources) @WITH_VST3_TRUE@libags_vst_la_SOURCES = $(libags_vst_c_sources) @WITH_VST3_TRUE@libags_vst_la_HEADERS_0 = ags/libags-vst.h $(libags_vst_h_sources) # library libags libags_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(W32API_CFLAGS) libags_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC \ -pthread $(am__append_11) $(am__append_12) $(am__append_13) libags_la_LIBADD = -lm $(UUID_LIBS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) \ $(GIO_LIBS) $(W32API_LIBS) $(am__append_14) # library libags-thread libags_thread_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(W32API_CFLAGS) libags_thread_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared \ -fPIC -pthread $(am__append_15) $(am__append_16) \ $(am__append_17) libags_thread_la_LIBADD = libags.la -lm $(LIBXML2_LIBS) \ $(GOBJECT_LIBS) $(W32API_LIBS) $(am__append_18) # library libags-server libags_server_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(W32API_CFLAGS) libags_server_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared \ -fPIC -pthread $(am__append_19) $(am__append_20) \ $(am__append_21) libags_server_la_LIBADD = libags_thread.la libags.la -lm \ $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(W32API_LIBS) \ $(am__append_22) # library libags-audio libags_audio_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(CORE_AUDIO_CFLAGS) $(WASAPI_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SAMPLERATE_CFLAGS) $(SNDFILE_CFLAGS) $(FFTW_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) $(W32API_CFLAGS) libags_audio_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC \ -pthread $(am__append_23) $(am__append_24) $(am__append_25) libags_audio_la_LIBADD = libags_server.la libags_thread.la libags.la \ -lm $(CORE_AUDIO_LIBS) $(WASAPI_LIBS) $(LIBASOUND2_LIBS) \ $(LIBXML2_LIBS) $(SAMPLERATE_LIBS) $(SNDFILE_LIBS) \ $(LIBINSTPATCH_LIBS) $(FFTW_LIBS) $(GOBJECT_LIBS) \ $(LIBSOUP_LIBS) $(JACK_LIBS) $(PULSE_LIBS) $(W32API_LIBS) \ $(am__append_26) # library libags-gui libags_gui_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(GOBJECT_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(W32API_CFLAGS) libags_gui_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC \ -pthread $(am__append_27) $(am__append_28) $(am__append_29) libags_gui_la_LIBADD = -lm $(GOBJECT_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) \ $(W32API_LIBS) $(am__append_30) # library libgsequencer libgsequencer_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(CORE_AUDIO_CFLAGS) $(WASAPI_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(FFTW_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(WEBKITGTK_CFLAGS) $(GTK_MAC_INTEGRATION_CFLAGS) $(W32API_CFLAGS) libgsequencer_la_LDFLAGS = $(LDFLAGS) -version-info 0:1:0 -shared \ -fPIC -pthread $(am__append_31) libgsequencer_la_LIBADD = libags_audio.la libags_server.la \ libags_gui.la libags_thread.la libags.la -lm \ $(CORE_AUDIO_LIBS) $(WASAPI_LIBS) $(LIBASOUND2_LIBS) \ $(LIBXML2_LIBS) $(FFTW_LIBS) $(SNDFILE_LIBS) $(JACK_LIBS) \ $(PULSE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) \ $(LIBSOUP_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) $(WEBKITGTK_LIBS) \ $(GTK_MAC_INTEGRATION_LIBS) $(W32API_LIBS) $(am__append_32) # library libags-vst @WITH_VST3_TRUE@libags_vst_la_CXXFLAGS = $(CXXFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(GLIB_CFLAGS) $(VST3_CXXFLAGS) $(W32API_CFLAGS) @WITH_VST3_TRUE@libags_vst_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 \ @WITH_VST3_TRUE@ -shared -fPIC -pthread $(am__append_33) \ @WITH_VST3_TRUE@ $(am__append_34) $(am__append_35) @WITH_VST3_TRUE@libags_vst_la_LIBADD = -lm $(GLIB_LIBS) $(VST3_LIBS) \ @WITH_VST3_TRUE@ $(W32API_LIBS) $(am__append_36) # gsequencer gsequencer_SOURCES = $(gsequencer_c_sources) $(gsequencerheaders) gsequencer_LDADD = libgsequencer.la libags_audio.la libags_server.la \ libags_gui.la libags_thread.la libags.la -lm $(RT_LIBS) \ $(X11_LIBS) $(CORE_AUDIO_CFLAGS) $(WASAPI_CFLAGS) \ $(LIBASOUND2_LIBS) $(LIBAO_LIBS) $(LIBXML2_LIBS) \ $(LIBSOUP_LIBS) $(SNDFILE_LIBS) $(JACK_LIBS) $(PULSE_LIBS) \ $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) \ $(WEBKITGTK_LIBS) $(GTK_MAC_INTEGRATION_LIBS) $(W32API_LIBS) \ $(am__append_37) # buffer util unit test ags_buffer_util_test_SOURCES = ags/test/lib/ags_buffer_util_test.c ags_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_util_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # complex unit test ags_complex_test_SOURCES = ags/test/lib/ags_complex_test.c ags_complex_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_complex_test_LDFLAGS = -pthread $(LDFLAGS) ags_complex_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # conversion unit test ags_conversion_test_SOURCES = ags/test/lib/ags_conversion_test.c ags_conversion_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_conversion_test_LDFLAGS = -pthread $(LDFLAGS) ags_conversion_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # log unit test ags_log_test_SOURCES = ags/test/lib/ags_log_test.c ags_log_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_log_test_LDFLAGS = -pthread $(LDFLAGS) ags_log_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # time unit test ags_time_test_SOURCES = ags/test/lib/ags_time_test.c ags_time_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_time_test_LDFLAGS = -pthread $(LDFLAGS) ags_time_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle_manager unit test ags_turtle_manager_test_SOURCES = ags/test/lib/ags_turtle_manager_test.c ags_turtle_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_turtle_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_turtle_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # turtle unit test ags_turtle_test_SOURCES = ags/test/lib/ags_turtle_test.c ags_turtle_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_turtle_test_LDFLAGS = -pthread $(LDFLAGS) ags_turtle_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # application context unit test ags_application_context_test_SOURCES = ags/test/object/ags_application_context_test.c ags_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_application_context_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # config unit test ags_config_test_SOURCES = ags/test/object/ags_config_test.c ags_config_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_config_test_LDFLAGS = -pthread $(LDFLAGS) ags_config_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # connectable unit test ags_connectable_test_SOURCES = ags/test/object/ags_connectable_test.c ags_connectable_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_connectable_test_LDFLAGS = -pthread $(LDFLAGS) ags_connectable_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # soundcard unit test ags_soundcard_test_SOURCES = ags/test/object/ags_soundcard_test.c ags_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # destroy worker unit test ags_destroy_worker_test_SOURCES = ags/test/thread/ags_destroy_worker_test.c ags_destroy_worker_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_destroy_worker_test_LDFLAGS = -pthread $(LDFLAGS) ags_destroy_worker_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # returnable thread unit test ags_returnable_thread_test_SOURCES = ags/test/thread/ags_returnable_thread_test.c ags_returnable_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_returnable_thread_test_LDFLAGS = -pthread $(LDFLAGS) ags_returnable_thread_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # task unit test ags_task_test_SOURCES = ags/test/thread/ags_task_test.c ags_task_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_task_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) ags_task_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread unit test ags_thread_test_SOURCES = ags/test/thread/ags_thread_test.c ags_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_thread_test_LDFLAGS = -lcunit -lm -pthread -lrt $(LDFLAGS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) ags_thread_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # thread pool unit test ags_thread_pool_test_SOURCES = ags/test/thread/ags_thread_pool_test.c ags_thread_pool_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_thread_pool_test_LDFLAGS = -pthread $(LDFLAGS) ags_thread_pool_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # worker thread unit test ags_worker_thread_test_SOURCES = ags/test/thread/ags_worker_thread_test.c ags_worker_thread_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_worker_thread_test_LDFLAGS = -pthread $(LDFLAGS) ags_worker_thread_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file unit test ags_file_test_SOURCES = ags/test/file/ags_file_test.c ags_file_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file id ref unit test ags_file_id_ref_test_SOURCES = ags/test/file/ags_file_id_ref_test.c ags_file_id_ref_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_id_ref_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_id_ref_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file launch unit test ags_file_launch_test_SOURCES = ags/test/file/ags_file_launch_test.c ags_file_launch_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_launch_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_launch_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # file lookup unit test ags_file_lookup_test_SOURCES = ags/test/file/ags_file_lookup_test.c ags_file_lookup_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_file_lookup_test_LDFLAGS = -pthread $(LDFLAGS) ags_file_lookup_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server application context unit test ags_server_application_context_test_SOURCES = ags/test/server/ags_server_application_context_test.c ags_server_application_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_server_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_server_application_context_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # server unit test ags_server_test_SOURCES = ags/test/server/ags_server_test.c ags_server_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_server_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # controller unit test ags_controller_test_SOURCES = ags/test/server/controller/ags_controller_test.c ags_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_controller_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # front controller unit test ags_front_controller_test_SOURCES = ags/test/server/controller/ags_front_controller_test.c ags_front_controller_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_front_controller_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # authentication manager unit test ags_authentication_manager_test_SOURCES = ags/test/server/security/ags_authentication_manager_test.c ags_authentication_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_authentication_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_authentication_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # business group manager unit test ags_business_group_manager_test_SOURCES = ags/test/server/security/ags_business_group_manager_test.c ags_business_group_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_business_group_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_business_group_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # certificate manager unit test ags_certificate_manager_test_SOURCES = ags/test/server/security/ags_certificate_manager_test.c ags_certificate_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_certificate_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_certificate_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # password store manager unit test ags_password_store_manager_test_SOURCES = ags/test/server/security/ags_password_store_manager_test.c ags_password_store_manager_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_password_store_manager_test_LDFLAGS = -pthread $(LDFLAGS) ags_password_store_manager_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML authentication unit test ags_xml_authentication_test_SOURCES = ags/test/server/security/ags_xml_authentication_test.c ags_xml_authentication_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_authentication_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_authentication_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML business group unit test ags_xml_business_group_test_SOURCES = ags/test/server/security/ags_xml_business_group_test.c ags_xml_business_group_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_business_group_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_business_group_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML certificate unit test ags_xml_certificate_test_SOURCES = ags/test/server/security/ags_xml_certificate_test.c ags_xml_certificate_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_certificate_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_certificate_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # XML password store unit test ags_xml_password_store_test_SOURCES = ags/test/server/security/ags_xml_password_store_test.c ags_xml_password_store_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_xml_password_store_test_LDFLAGS = -pthread $(LDFLAGS) ags_xml_password_store_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # security context unit test ags_security_context_test_SOURCES = ags/test/server/security/ags_security_context_test.c ags_security_context_test_CFLAGS = $(CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) ags_security_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_security_context_test_LDADD = libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) # base plugin unit test ags_base_plugin_test_SOURCES = ags/test/plugin/ags_base_plugin_test.c ags_base_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_base_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_base_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi manager unit test ags_dssi_manager_test_SOURCES = ags/test/plugin/ags_dssi_manager_test.c ags_dssi_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_dssi_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_dssi_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # dssi plugin unit test ags_dssi_plugin_test_SOURCES = ags/test/plugin/ags_dssi_plugin_test.c ags_dssi_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_dssi_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_dssi_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa conversion unit test ags_ladspa_conversion_test_SOURCES = ags/test/plugin/ags_ladspa_conversion_test.c ags_ladspa_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_ladspa_conversion_test_LDFLAGS = $(LDFLAGS) -pthread ags_ladspa_conversion_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # ladspa manager unit test ags_ladspa_manager_test_SOURCES = ags/test/plugin/ags_ladspa_manager_test.c ags_ladspa_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_ladspa_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_ladspa_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 conversion unit test ags_lv2_conversion_test_SOURCES = ags/test/plugin/ags_lv2_conversion_test.c ags_lv2_conversion_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_conversion_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_conversion_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 manager unit test ags_lv2_manager_test_SOURCES = ags/test/plugin/ags_lv2_manager_test.c ags_lv2_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 option manager unit test ags_lv2_option_manager_test_SOURCES = ags/test/plugin/ags_lv2_option_manager_test.c ags_lv2_option_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_option_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_option_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 plugin unit test ags_lv2_plugin_test_SOURCES = ags/test/plugin/ags_lv2_plugin_test.c ags_lv2_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 preset unit test ags_lv2_preset_test_SOURCES = ags/test/plugin/ags_lv2_preset_test.c ags_lv2_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_preset_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_preset_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 uri map manager unit test ags_lv2_uri_map_manager_test_SOURCES = ags/test/plugin/ags_lv2_uri_map_manager_test.c ags_lv2_uri_map_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_uri_map_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_uri_map_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 urid manager unit test ags_lv2_urid_manager_test_SOURCES = ags/test/plugin/ags_lv2_urid_manager_test.c ags_lv2_urid_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_urid_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_urid_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2 worker manager unit test ags_lv2_worker_manager_test_SOURCES = ags/test/plugin/ags_lv2_worker_manager_test.c ags_lv2_worker_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2_worker_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2_worker_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui manager unit test ags_lv2ui_manager_test_SOURCES = ags/test/plugin/ags_lv2ui_manager_test.c ags_lv2ui_manager_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2ui_manager_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2ui_manager_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # lv2ui plugin unit test ags_lv2ui_plugin_test_SOURCES = ags/test/plugin/ags_lv2ui_plugin_test.c ags_lv2ui_plugin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_lv2ui_plugin_test_LDFLAGS = $(LDFLAGS) -pthread ags_lv2ui_plugin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # plugin port unit test ags_plugin_port_test_SOURCES = ags/test/plugin/ags_plugin_port_test.c ags_plugin_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_plugin_port_test_LDFLAGS = $(LDFLAGS) -pthread ags_plugin_port_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio application context unit test ags_audio_application_context_test_SOURCES = ags/test/audio/ags_audio_application_context_test.c ags_audio_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_application_context_test_LDFLAGS = $(LDFLAGS) -pthread ags_audio_application_context_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devin unit test ags_devin_test_SOURCES = ags/test/audio/ags_devin_test.c ags_devin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_devin_test_LDFLAGS = -pthread $(LDFLAGS) ags_devin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # devout unit test ags_devout_test_SOURCES = ags/test/audio/ags_devout_test.c ags_devout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_devout_test_LDFLAGS = -pthread $(LDFLAGS) ags_devout_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fifoout unit test ags_fifoout_test_SOURCES = ags/test/audio/ags_fifoout_test.c ags_fifoout_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_fifoout_test_LDFLAGS = -pthread $(LDFLAGS) ags_fifoout_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midiin unit test ags_midiin_test_SOURCES = ags/test/audio/ags_midiin_test.c ags_midiin_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midiin_test_LDFLAGS = -pthread $(LDFLAGS) ags_midiin_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio unit test ags_audio_test_SOURCES = ags/test/audio/ags_audio_test.c ags_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback domain unit test ags_playback_domain_test_SOURCES = ags/test/audio/ags_playback_domain_test.c ags_playback_domain_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_playback_domain_test_LDFLAGS = -pthread $(LDFLAGS) ags_playback_domain_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # playback unit test ags_playback_test_SOURCES = ags/test/audio/ags_playback_test.c ags_playback_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_playback_test_LDFLAGS = -pthread $(LDFLAGS) ags_playback_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # preset unit test ags_preset_test_SOURCES = ags/test/audio/ags_preset_test.c ags_preset_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_preset_test_LDFLAGS = -pthread $(LDFLAGS) ags_preset_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # channel unit test ags_channel_test_SOURCES = ags/test/audio/ags_channel_test.c ags_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # input unit test ags_input_test_SOURCES = ags/test/audio/ags_input_test.c ags_input_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_input_test_LDFLAGS = -pthread $(LDFLAGS) ags_input_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # output unit test ags_output_test_SOURCES = ags/test/audio/ags_output_test.c ags_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_output_test_LDFLAGS = -pthread $(LDFLAGS) ags_output_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling unit test ags_recycling_test_SOURCES = ags/test/audio/ags_recycling_test.c ags_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recycling_test_LDFLAGS = -pthread $(LDFLAGS) ags_recycling_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio signal unit test ags_audio_signal_test_SOURCES = ags/test/audio/ags_audio_signal_test.c ags_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # audio buffer util unit test ags_audio_buffer_util_test_SOURCES = ags/test/audio/ags_audio_buffer_util_test.c ags_audio_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_audio_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_audio_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # char buffer util unit test ags_char_buffer_util_test_SOURCES = ags/test/audio/ags_char_buffer_util_test.c ags_char_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_char_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_char_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # filter util unit test ags_filter_util_test_SOURCES = ags/test/audio/ags_filter_util_test.c ags_filter_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_filter_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_filter_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # FM synth util unit test ags_fm_synth_util_test_SOURCES = ags/test/audio/ags_fm_synth_util_test.c ags_fm_synth_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_fm_synth_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_fm_synth_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # fourier transform util unit test ags_fourier_transform_util_test_SOURCES = ags/test/audio/ags_fourier_transform_util_test.c ags_fourier_transform_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_fourier_transform_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_fourier_transform_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall unit test ags_recall_test_SOURCES = ags/test/audio/ags_recall_test.c ags_recall_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel unit test ags_recall_channel_test_SOURCES = ags/test/audio/ags_recall_channel_test.c ags_recall_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall channel run unit test ags_recall_channel_run_test_SOURCES = ags/test/audio/ags_recall_channel_run_test.c ags_recall_channel_run_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_channel_run_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_channel_run_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall container unit test ags_recall_container_test_SOURCES = ags/test/audio/ags_recall_container_test.c ags_recall_container_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_container_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_container_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall dependency unit test ags_recall_dependency_test_SOURCES = ags/test/audio/ags_recall_dependency_test.c ags_recall_dependency_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_dependency_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_dependency_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall id unit test ags_recall_id_test_SOURCES = ags/test/audio/ags_recall_id_test.c ags_recall_id_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_id_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_id_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recall recycling unit test ags_recall_recycling_test_SOURCES = ags/test/audio/ags_recall_recycling_test.c ags_recall_recycling_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recall_recycling_test_LDFLAGS = -pthread $(LDFLAGS) ags_recall_recycling_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # recycling context unit test ags_recycling_context_test_SOURCES = ags/test/audio/ags_recycling_context_test.c ags_recycling_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_recycling_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_recycling_context_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # synth generator unit test ags_synth_generator_test_SOURCES = ags/test/audio/ags_synth_generator_test.c ags_synth_generator_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_synth_generator_test_LDFLAGS = -pthread $(LDFLAGS) ags_synth_generator_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # port unit test ags_port_test_SOURCES = ags/test/audio/ags_port_test.c ags_port_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_port_test_LDFLAGS = -pthread $(LDFLAGS) ags_port_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # pattern unit test ags_pattern_test_SOURCES = ags/test/audio/ags_pattern_test.c ags_pattern_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_pattern_test_LDFLAGS = -pthread $(LDFLAGS) ags_pattern_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # notation unit test ags_notation_test_SOURCES = ags/test/audio/ags_notation_test.c ags_notation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_notation_test_LDFLAGS = -pthread $(LDFLAGS) ags_notation_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # note unit test ags_note_test_SOURCES = ags/test/audio/ags_note_test.c ags_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # automation unit test ags_automation_test_SOURCES = ags/test/audio/ags_automation_test.c ags_automation_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_automation_test_LDFLAGS = -pthread $(LDFLAGS) ags_automation_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # acceleration unit test ags_acceleration_test_SOURCES = ags/test/audio/ags_acceleration_test.c ags_acceleration_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_acceleration_test_LDFLAGS = -pthread $(LDFLAGS) ags_acceleration_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # wave unit test ags_wave_test_SOURCES = ags/test/audio/ags_wave_test.c ags_wave_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_wave_test_LDFLAGS = -pthread $(LDFLAGS) ags_wave_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer unit test ags_buffer_test_SOURCES = ags/test/audio/ags_buffer_test.c ags_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_buffer_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi unit test ags_midi_test_SOURCES = ags/test/audio/ags_midi_test.c ags_midi_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midi_test_LDFLAGS = -pthread $(LDFLAGS) ags_midi_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # track unit test ags_track_test_SOURCES = ags/test/audio/ags_track_test.c ags_track_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_track_test_LDFLAGS = -pthread $(LDFLAGS) ags_track_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi buffer util unit test ags_midi_buffer_util_test_SOURCES = ags/test/audio/midi/ags_midi_buffer_util_test.c ags_midi_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midi_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_midi_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # midi builder unit test ags_midi_builder_test_SOURCES = ags/test/audio/midi/ags_midi_builder_test.c ags_midi_builder_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_midi_builder_test_LDFLAGS = -pthread $(LDFLAGS) ags_midi_builder_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc buffer util unit test ags_osc_buffer_util_test_SOURCES = ags/test/audio/osc/ags_osc_buffer_util_test.c ags_osc_buffer_util_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_buffer_util_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_buffer_util_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc client unit test ags_osc_client_test_SOURCES = ags/test/audio/osc/ags_osc_client_test.c ags_osc_client_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_client_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_client_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc connection unit test ags_osc_connection_test_SOURCES = ags/test/audio/osc/ags_osc_connection_test.c ags_osc_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_connection_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_connection_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc message unit test ags_osc_message_test_SOURCES = ags/test/audio/osc/ags_osc_message_test.c ags_osc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_message_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_message_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc server unit test ags_osc_server_test_SOURCES = ags/test/audio/osc/ags_osc_server_test.c ags_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_server_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc websocket connection unit test ags_osc_websocket_connection_test_SOURCES = ags/test/audio/osc/ags_osc_websocket_connection_test.c ags_osc_websocket_connection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_websocket_connection_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_websocket_connection_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC message unit test ags_osc_xmlrpc_message_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_message_test.c ags_osc_xmlrpc_message_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_xmlrpc_message_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_xmlrpc_message_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc XMLRPC server unit test ags_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_osc_xmlrpc_server_test.c ags_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_xmlrpc_server_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc action controller unit test ags_osc_action_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_action_controller_test.c ags_osc_action_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_action_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_action_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc config controller unit test ags_osc_config_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_config_controller_test.c ags_osc_config_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_config_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_config_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc front controller unit test ags_osc_front_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_front_controller_test.c ags_osc_front_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_front_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_front_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc renew controller unit test ags_osc_renew_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_renew_controller_test.c ags_osc_renew_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_renew_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_renew_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc info controller unit test ags_osc_info_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_info_controller_test.c ags_osc_info_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_info_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_info_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc meter controller unit test ags_osc_meter_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_meter_controller_test.c ags_osc_meter_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_meter_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_meter_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc node controller unit test ags_osc_node_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_node_controller_test.c ags_osc_node_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_node_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_node_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc status controller unit test ags_osc_status_controller_test_SOURCES = ags/test/audio/osc/controller/ags_osc_status_controller_test.c ags_osc_status_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_status_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_status_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # osc xmlrpc controller unit test ags_osc_xmlrpc_controller_test_SOURCES = ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c ags_osc_xmlrpc_controller_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_osc_xmlrpc_controller_test_LDFLAGS = -pthread $(LDFLAGS) ags_osc_xmlrpc_controller_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse audio signal unit test ags_analyse_audio_signal_test_SOURCES = ags/test/audio/recall/ags_analyse_audio_signal_test.c ags_analyse_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_analyse_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_analyse_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # analyse channel unit test ags_analyse_channel_test_SOURCES = ags/test/audio/recall/ags_analyse_channel_test.c ags_analyse_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_analyse_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_analyse_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer audio signal unit test ags_buffer_audio_signal_test_SOURCES = ags/test/audio/recall/ags_buffer_audio_signal_test.c ags_buffer_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_buffer_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # buffer channel unit test ags_buffer_channel_test_SOURCES = ags/test/audio/recall/ags_buffer_channel_test.c ags_buffer_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_buffer_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_buffer_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave audio unit test ags_capture_wave_audio_test_SOURCES = ags/test/audio/recall/ags_capture_wave_audio_test.c ags_capture_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_capture_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_capture_wave_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # capture wave channel unit test ags_capture_wave_channel_test_SOURCES = ags/test/audio/recall/ags_capture_wave_channel_test.c ags_capture_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_capture_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_capture_wave_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio signal unit test ags_copy_audio_signal_test_SOURCES = ags/test/audio/recall/ags_copy_audio_signal_test.c ags_copy_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel unit test ags_copy_channel_test_SOURCES = ags/test/audio/recall/ags_copy_channel_test.c ags_copy_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy audio pattern unit test ags_copy_pattern_audio_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_audio_test.c ags_copy_pattern_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_pattern_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_pattern_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # copy channel pattern unit test ags_copy_pattern_channel_test_SOURCES = ags/test/audio/recall/ags_copy_pattern_channel_test.c ags_copy_pattern_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_copy_pattern_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_copy_pattern_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # count beats audio unit test ags_count_beats_audio_test_SOURCES = ags/test/audio/recall/ags_count_beats_audio_test.c ags_count_beats_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_count_beats_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_count_beats_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # delay audio unit test ags_delay_audio_test_SOURCES = ags/test/audio/recall/ags_delay_audio_test.c ags_delay_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_delay_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_delay_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope audio signal unit test ags_envelope_audio_signal_test_SOURCES = ags/test/audio/recall/ags_envelope_audio_signal_test.c ags_envelope_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_envelope_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_envelope_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # envelope channel unit test ags_envelope_channel_test_SOURCES = ags/test/audio/recall/ags_envelope_channel_test.c ags_envelope_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_envelope_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_envelope_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 audio signal unit test ags_eq10_audio_signal_test_SOURCES = ags/test/audio/recall/ags_eq10_audio_signal_test.c ags_eq10_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_eq10_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_eq10_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # eq10 channel unit test ags_eq10_channel_test_SOURCES = ags/test/audio/recall/ags_eq10_channel_test.c ags_eq10_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_eq10_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_eq10_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # feed audio signal unit test ags_feed_audio_signal_test_SOURCES = ags/test/audio/recall/ags_feed_audio_signal_test.c ags_feed_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_feed_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_feed_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio unit test ags_mute_audio_test_SOURCES = ags/test/audio/recall/ags_mute_audio_test.c ags_mute_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_mute_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_mute_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute audio signal unit test ags_mute_audio_signal_test_SOURCES = ags/test/audio/recall/ags_mute_audio_signal_test.c ags_mute_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_mute_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_mute_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # mute channel unit test ags_mute_channel_test_SOURCES = ags/test/audio/recall/ags_mute_channel_test.c ags_mute_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_mute_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_mute_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak audio signal unit test ags_peak_audio_signal_test_SOURCES = ags/test/audio/recall/ags_peak_audio_signal_test.c ags_peak_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_peak_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_peak_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # peak channel unit test ags_peak_channel_test_SOURCES = ags/test/audio/recall/ags_peak_channel_test.c ags_peak_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_peak_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_peak_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio unit test ags_play_audio_test_SOURCES = ags/test/audio/recall/ags_play_audio_test.c ags_play_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play audio signal unit test ags_play_audio_signal_test_SOURCES = ags/test/audio/recall/ags_play_audio_signal_test.c ags_play_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play channel unit test ags_play_channel_test_SOURCES = ags/test/audio/recall/ags_play_channel_test.c ags_play_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave audio unit test ags_play_wave_audio_test_SOURCES = ags/test/audio/recall/ags_play_wave_audio_test.c ags_play_wave_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_wave_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_wave_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # play wave channel unit test ags_play_wave_channel_test_SOURCES = ags/test/audio/recall/ags_play_wave_channel_test.c ags_play_wave_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_play_wave_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_play_wave_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # prepare audio signal unit test ags_prepare_audio_signal_test_SOURCES = ags/test/audio/recall/ags_prepare_audio_signal_test.c ags_prepare_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_prepare_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_prepare_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # record midi audio unit test ags_record_midi_audio_test_SOURCES = ags/test/audio/recall/ags_record_midi_audio_test.c ags_record_midi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_record_midi_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_record_midi_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route dssi audio unit test ags_route_dssi_audio_test_SOURCES = ags/test/audio/recall/ags_route_dssi_audio_test.c ags_route_dssi_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_route_dssi_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_route_dssi_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # route lv2 audio unit test ags_route_lv2_audio_test_SOURCES = ags/test/audio/recall/ags_route_lv2_audio_test.c ags_route_lv2_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_route_lv2_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_route_lv2_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # stream audio signal unit test ags_stream_audio_signal_test_SOURCES = ags/test/audio/recall/ags_stream_audio_signal_test.c ags_stream_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_stream_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_stream_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume audio signal unit test ags_volume_audio_signal_test_SOURCES = ags/test/audio/recall/ags_volume_audio_signal_test.c ags_volume_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_volume_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_volume_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # volume channel unit test ags_volume_channel_test_SOURCES = ags/test/audio/recall/ags_volume_channel_test.c ags_volume_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_volume_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_volume_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio unit test ags_add_audio_test_SOURCES = ags/test/audio/task/ags_add_audio_test.c ags_add_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add audio signal unit test ags_add_audio_signal_test_SOURCES = ags/test/audio/task/ags_add_audio_signal_test.c ags_add_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add effect unit test ags_add_effect_test_SOURCES = ags/test/audio/task/ags_add_effect_test.c ags_add_effect_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_effect_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_effect_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add note unit test ags_add_note_test_SOURCES = ags/test/audio/task/ags_add_note_test.c ags_add_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # add soundcard unit test ags_add_soundcard_test_SOURCES = ags/test/audio/task/ags_add_soundcard_test.c ags_add_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_add_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_add_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply bpm unit test ags_apply_bpm_test_SOURCES = ags/test/audio/task/ags_apply_bpm_test.c ags_apply_bpm_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_bpm_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_bpm_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply presets unit test ags_apply_presets_test_SOURCES = ags/test/audio/task/ags_apply_presets_test.c ags_apply_presets_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_presets_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_presets_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply sequencer length unit test ags_apply_sequencer_length_test_SOURCES = ags/test/audio/task/ags_apply_sequencer_length_test.c ags_apply_sequencer_length_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_sequencer_length_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_sequencer_length_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply synth unit test ags_apply_synth_test_SOURCES = ags/test/audio/task/ags_apply_synth_test.c ags_apply_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_synth_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_synth_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # apply tact unit test ags_apply_tact_test_SOURCES = ags/test/audio/task/ags_apply_tact_test.c ags_apply_tact_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_apply_tact_test_LDFLAGS = -pthread $(LDFLAGS) ags_apply_tact_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel audio unit test ags_cancel_audio_test_SOURCES = ags/test/audio/task/ags_cancel_audio_test.c ags_cancel_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_cancel_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_cancel_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # cancel channel unit test ags_cancel_channel_test_SOURCES = ags/test/audio/task/ags_cancel_channel_test.c ags_cancel_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_cancel_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_cancel_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear audio signal unit test ags_clear_audio_signal_test_SOURCES = ags/test/audio/task/ags_clear_audio_signal_test.c ags_clear_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_clear_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_clear_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # clear buffer unit test ags_clear_buffer_test_SOURCES = ags/test/audio/task/ags_clear_buffer_test.c ags_clear_buffer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_clear_buffer_test_LDFLAGS = -pthread $(LDFLAGS) ags_clear_buffer_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # crop note unit test ags_crop_note_test_SOURCES = ags/test/audio/task/ags_crop_note_test.c ags_crop_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_crop_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_crop_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # export output unit test ags_export_output_test_SOURCES = ags/test/audio/task/ags_export_output_test.c ags_export_output_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_export_output_test_LDFLAGS = -pthread $(LDFLAGS) ags_export_output_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # free selection unit test ags_free_selection_test_SOURCES = ags/test/audio/task/ags_free_selection_test.c ags_free_selection_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_free_selection_test_LDFLAGS = -pthread $(LDFLAGS) ags_free_selection_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # link channel unit test ags_link_channel_test_SOURCES = ags/test/audio/task/ags_link_channel_test.c ags_link_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_link_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_link_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # move note unit test ags_move_note_test_SOURCES = ags/test/audio/task/ags_move_note_test.c ags_move_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_move_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_move_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio unit test ags_remove_audio_test_SOURCES = ags/test/audio/task/ags_remove_audio_test.c ags_remove_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove audio signal unit test ags_remove_audio_signal_test_SOURCES = ags/test/audio/task/ags_remove_audio_signal_test.c ags_remove_audio_signal_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_audio_signal_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_audio_signal_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove note unit test ags_remove_note_test_SOURCES = ags/test/audio/task/ags_remove_note_test.c ags_remove_note_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_note_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_note_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # remove soundcard unit test ags_remove_soundcard_test_SOURCES = ags/test/audio/task/ags_remove_soundcard_test.c ags_remove_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_remove_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_remove_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset amplitude unit test ags_reset_amplitude_test_SOURCES = ags/test/audio/task/ags_reset_amplitude_test.c ags_reset_amplitude_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_reset_amplitude_test_LDFLAGS = -pthread $(LDFLAGS) ags_reset_amplitude_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # reset peak unit test ags_reset_peak_test_SOURCES = ags/test/audio/task/ags_reset_peak_test.c ags_reset_peak_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_reset_peak_test_LDFLAGS = -pthread $(LDFLAGS) ags_reset_peak_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # resize audio unit test ags_resize_audio_test_SOURCES = ags/test/audio/task/ags_resize_audio_test.c ags_resize_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_resize_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_resize_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # seek soundcard unit test ags_seek_soundcard_test_SOURCES = ags/test/audio/task/ags_seek_soundcard_test.c ags_seek_soundcard_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_seek_soundcard_test_LDFLAGS = -pthread $(LDFLAGS) ags_seek_soundcard_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set audio channels unit test ags_set_audio_channels_test_SOURCES = ags/test/audio/task/ags_set_audio_channels_test.c ags_set_audio_channels_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_audio_channels_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_audio_channels_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set buffer size unit test ags_set_buffer_size_test_SOURCES = ags/test/audio/task/ags_set_buffer_size_test.c ags_set_buffer_size_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_buffer_size_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_buffer_size_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set device unit test ags_set_device_test_SOURCES = ags/test/audio/task/ags_set_device_test.c ags_set_device_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_device_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_device_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set format unit test ags_set_format_test_SOURCES = ags/test/audio/task/ags_set_format_test.c ags_set_format_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_format_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_format_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set muted unit test ags_set_muted_test_SOURCES = ags/test/audio/task/ags_set_muted_test.c ags_set_muted_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_muted_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_muted_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # set samplerate unit test ags_set_samplerate_test_SOURCES = ags/test/audio/task/ags_set_samplerate_test.c ags_set_samplerate_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_set_samplerate_test_LDFLAGS = -pthread $(LDFLAGS) ags_set_samplerate_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start audio unit test ags_start_audio_test_SOURCES = ags/test/audio/task/ags_start_audio_test.c ags_start_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_start_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_start_audio_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # start channel unit test ags_start_channel_test_SOURCES = ags/test/audio/task/ags_start_channel_test.c ags_start_channel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_start_channel_test_LDFLAGS = -pthread $(LDFLAGS) ags_start_channel_test_LDADD = libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) # xorg application context unit test ags_xorg_application_context_test_SOURCES = ags/test/X/ags_xorg_application_context_test.c ags_xorg_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_xorg_application_context_test_LDFLAGS = -pthread $(LDFLAGS) ags_xorg_application_context_test_LDADD = libgsequencer.la libags_gui.la libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) # libadd and ldadd @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_LIBADD = \ @RUN_FUNCTIONAL_TESTS_TRUE@ @LIBGSEQUENCER_TEST_LIBADD@ \ @RUN_FUNCTIONAL_TESTS_TRUE@ libgsequencer.la libags_gui.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_audio.la libags_server.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_thread.la libags.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_thread.la -lcunit -lrt -lm \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(LIBAO_LIBS) $(LIBASOUND2_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(LIBXML2_LIBS) $(SNDFILE_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(LIBINSTPATCH_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(GOBJECT_LIBS) $(LIBSOUP_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(JACK_LIBS) $(FONTCONFIG_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(GTK_LIBS) @RUN_FUNCTIONAL_TESTS_TRUE@gsequencer_functional_test_LDADD = \ @RUN_FUNCTIONAL_TESTS_TRUE@ @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ \ @RUN_FUNCTIONAL_TESTS_TRUE@ libgsequencer.la libags_gui.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_audio.la libags_server.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_thread.la libags.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libags_thread.la \ @RUN_FUNCTIONAL_TESTS_TRUE@ libgsequencer_test.la -lcunit -lrt \ @RUN_FUNCTIONAL_TESTS_TRUE@ -lm $(LIBAO_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(SNDFILE_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(LIBINSTPATCH_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(GOBJECT_LIBS) $(LIBSOUP_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(JACK_LIBS) $(FONTCONFIG_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(GTK_LIBS) -lXtst @RUN_FUNCTIONAL_TESTS_TRUE@check_LTLIBRARIES = libgsequencer_test.la # functional test util library @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_la_CPPFLAGS = \ @RUN_FUNCTIONAL_TESTS_TRUE@ -DSRCDIR=\"$(srcdir)\" \ @RUN_FUNCTIONAL_TESTS_TRUE@ -DDESTDIR=\"gsequencer.share\" \ @RUN_FUNCTIONAL_TESTS_TRUE@ $(am__append_39) @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_la_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@libgsequencer_test_la_LIBADD = $(libgsequencer_test_LIBADD) # functional server test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_server_test_SOURCES = ags/test/server/ags_functional_server_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_server_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_server_test_LDADD = $(gsequencer_functional_test_LDADD) # functional audio test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_test_LDADD = $(gsequencer_functional_test_LDADD) # functional pitch test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_pitch_test_SOURCES = ags/test/audio/ags_functional_pitch_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_pitch_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_pitch_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_pitch_test_LDADD = $(gsequencer_functional_test_LDADD) # functional fourier transform test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_fourier_transform_test_SOURCES = ags/test/audio/ags_functional_fourier_transform_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_fourier_transform_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_fourier_transform_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_fourier_transform_test_LDADD = $(gsequencer_functional_test_LDADD) # functional osc server test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_server_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_server_test_LDADD = $(gsequencer_functional_test_LDADD) # functional osc xmlrpc server test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_osc_xmlrpc_server_test_LDADD = $(gsequencer_functional_test_LDADD) # functional machine add and destroy test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD) # functional machine link test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_link_test_SOURCES = ags/test/X/ags_functional_machine_link_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_machine_link_test_LDADD = $(gsequencer_functional_test_LDADD) # functional line member add and destroy test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD) # functional notation editor workflow test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_notation_editor_workflow_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_editor_workflow_test_LDADD = $(gsequencer_functional_test_LDADD) # functional automation editor workflow test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_automation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_automation_editor_workflow_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_automation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_automation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_automation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_automation_editor_workflow_test_LDADD = $(gsequencer_functional_test_LDADD) # functional panel test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_panel_test_LDADD = $(gsequencer_functional_test_LDADD) # functional mixer test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_mixer_test_LDADD = $(gsequencer_functional_test_LDADD) # functional drum test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_drum_test_LDADD = $(gsequencer_functional_test_LDADD) # functional matrix test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_matrix_test_LDADD = $(gsequencer_functional_test_LDADD) # functional synth test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_synth_test_LDADD = $(gsequencer_functional_test_LDADD) # functional ffplayer test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_ffplayer_test_LDADD = $(gsequencer_functional_test_LDADD) # functional note edit test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_edit_test_SOURCES = ags/test/X/ags_functional_notation_edit_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_edit_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_edit_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_notation_edit_test_LDADD = $(gsequencer_functional_test_LDADD) # functional audio config test @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_config_test_SOURCES = ags/test/X/ags_functional_audio_config_test.c @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_config_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_config_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_config_test_LDFLAGS = -pthread $(LDFLAGS) @RUN_FUNCTIONAL_TESTS_TRUE@ags_functional_audio_config_test_LDADD = $(gsequencer_functional_test_LDADD) TESTS = $(check_PROGRAMS) # internationalization noinst_HEADERS = ags/i18n.h # libags all files deprecated_libags_h_sources = libags_h_sources = \ $(deprecated_libags_h_sources) \ ags/lib/ags_buffer_util.h \ ags/lib/ags_complex.h \ ags/lib/ags_conversion.h \ ags/lib/ags_endian.h \ ags/lib/ags_function.h \ ags/lib/ags_log.h \ ags/lib/ags_regex.h \ ags/lib/ags_solver_matrix.h \ ags/lib/ags_solver_vector.h \ ags/lib/ags_string_util.h \ ags/lib/ags_time.h \ ags/lib/ags_turtle.h \ ags/lib/ags_turtle_manager.h \ ags/lib/ags_uuid.h deprecated_libags_c_sources = libags_c_sources = \ $(deprecated_libags_c_sources) \ ags/lib/ags_buffer_util.c \ ags/lib/ags_complex.c \ ags/lib/ags_conversion.c \ ags/lib/ags_endian.c \ ags/lib/ags_function.c \ ags/lib/ags_log.c \ ags/lib/ags_regex.c \ ags/lib/ags_solver_matrix.c \ ags/lib/ags_solver_vector.c \ ags/lib/ags_string_util.c \ ags/lib/ags_time.c \ ags/lib/ags_turtle.c \ ags/lib/ags_turtle_manager.c \ ags/lib/ags_uuid.c deprecated_libags_util_h_sources = # libags - util libags_util_h_sources = \ $(deprecated_libags_util_h_sources) \ ags/util/ags_destroy_util.h \ ags/util/ags_id_generator.h \ ags/util/ags_list_util.h \ ags/util/ags_soundcard_helper.h deprecated_libags_util_c_sources = libags_util_c_sources = \ $(deprecated_libags_util_c_sources) \ ags/util/ags_destroy_util.c \ ags/util/ags_id_generator.c \ ags/util/ags_list_util.c \ ags/util/ags_soundcard_helper.c deprecated_libags_object_h_sources = # libags - object libags_object_h_sources = \ $(deprecated_libags_object_h_sources) \ ags/object/ags_applicable.h \ ags/object/ags_application_context.h \ ags/object/ags_config.h \ ags/object/ags_connectable.h \ ags/object/ags_countable.h \ ags/object/ags_cursor.h \ ags/object/ags_globals.h \ ags/object/ags_macros.h \ ags/object/ags_main_loop.h \ ags/object/ags_marshal.h \ ags/object/ags_mutable.h \ ags/object/ags_plugin.h \ ags/object/ags_portlet.h \ ags/object/ags_priority.h \ ags/object/ags_seekable.h \ ags/object/ags_sequencer.h \ ags/object/ags_soundcard.h \ ags/object/ags_sound_server.h \ ags/object/ags_tactable.h deprecated_libags_object_c_sources = libags_object_c_sources = \ $(deprecated_libags_object_c_sources) \ ags/object/ags_applicable.c \ ags/object/ags_application_context.c \ ags/object/ags_config.c \ ags/object/ags_connectable.c \ ags/object/ags_countable.c \ ags/object/ags_cursor.c \ ags/object/ags_globals.c \ ags/object/ags_main_loop.c \ ags/object/ags_marshal.c \ ags/object/ags_mutable.c \ ags/object/ags_plugin.c \ ags/object/ags_portlet.c \ ags/object/ags_priority.c \ ags/object/ags_seekable.c \ ags/object/ags_sequencer.c \ ags/object/ags_soundcard.c \ ags/object/ags_sound_server.c \ ags/object/ags_tactable.c deprecated_libags_file_h_sources = # libags - file libags_file_h_sources = \ $(deprecated_libags_file_h_sources) \ ags/file/ags_file.h \ ags/file/ags_file_id_ref.h \ ags/file/ags_file_launch.h \ ags/file/ags_file_link.h \ ags/file/ags_file_lookup.h deprecated_libags_file_c_sources = libags_file_c_sources = \ $(deprecated_libags_file_c_sources) \ ags/file/ags_file.c \ ags/file/ags_file_id_ref.c \ ags/file/ags_file_launch.c \ ags/file/ags_file_link.c \ ags/file/ags_file_lookup.c # libags-thread all files deprecated_libags_thread_h_sources = libags_thread_h_sources = \ $(deprecated_libags_thread_h_sources) \ ags/thread/ags_concurrency_provider.h \ ags/thread/ags_destroy_worker.h \ ags/thread/ags_generic_main_loop.h \ ags/thread/ags_message_delivery.h \ ags/thread/ags_message_envelope.h \ ags/thread/ags_message_queue.h \ ags/thread/ags_returnable_thread.h \ ags/thread/ags_task_completion.h \ ags/thread/ags_task.h \ ags/thread/ags_task_launcher.h \ ags/thread/ags_thread_application_context.h \ ags/thread/ags_thread_pool.h \ ags/thread/ags_thread.h \ ags/thread/ags_timestamp.h \ ags/thread/ags_worker_thread.h deprecated_libags_thread_c_sources = libags_thread_c_sources = \ $(deprecated_libags_thread_c_sources) \ ags/thread/ags_concurrency_provider.c \ ags/thread/ags_destroy_worker.c \ ags/thread/ags_generic_main_loop.c \ ags/thread/ags_message_delivery.c \ ags/thread/ags_message_envelope.c \ ags/thread/ags_message_queue.c \ ags/thread/ags_returnable_thread.c \ ags/thread/ags_task_completion.c \ ags/thread/ags_task.c \ ags/thread/ags_task_launcher.c \ ags/thread/ags_thread_application_context.c \ ags/thread/ags_thread_pool.c \ ags/thread/ags_thread.c \ ags/thread/ags_timestamp.c \ ags/thread/ags_worker_thread.c # libags-server all files deprecated_libags_server_h_sources = libags_server_h_sources = \ $(deprecated_libags_server_h_sources) \ ags/server/ags_registry.h \ ags/server/ags_server.h \ ags/server/ags_server_application_context.h \ ags/server/ags_server_status.h \ ags/server/ags_service_provider.h deprecated_libags_server_c_sources = libags_server_c_sources = \ $(deprecated_libags_server_c_sources) \ ags/server/ags_registry.c \ ags/server/ags_server.c \ ags/server/ags_server_application_context.c \ ags/server/ags_server_status.c \ ags/server/ags_service_provider.c # libags-server - security deprecated_libags_server_security_h_sources = libags_server_security_h_sources = \ $(deprecated_libags_server_security_h_sources) \ ags/server/security/ags_auth_security_context.h \ ags/server/security/ags_authentication.h \ ags/server/security/ags_authentication_manager.h \ ags/server/security/ags_business_group.h \ ags/server/security/ags_business_group_manager.h \ ags/server/security/ags_certificate.h \ ags/server/security/ags_certificate_manager.h \ ags/server/security/ags_password_store.h \ ags/server/security/ags_password_store_manager.h \ ags/server/security/ags_security_context.h \ ags/server/security/ags_xml_authentication.h \ ags/server/security/ags_xml_business_group.h \ ags/server/security/ags_xml_certificate.h \ ags/server/security/ags_xml_password_store.h deprecated_libags_server_security_c_sources = libags_server_security_c_sources = \ $(deprecated_libags_server_security_c_sources) \ ags/server/security/ags_auth_security_context.c \ ags/server/security/ags_authentication.c \ ags/server/security/ags_authentication_manager.c \ ags/server/security/ags_business_group.c \ ags/server/security/ags_business_group_manager.c \ ags/server/security/ags_certificate.c \ ags/server/security/ags_certificate_manager.c \ ags/server/security/ags_password_store.c \ ags/server/security/ags_password_store_manager.c \ ags/server/security/ags_security_context.c \ ags/server/security/ags_xml_authentication.c \ ags/server/security/ags_xml_business_group.c \ ags/server/security/ags_xml_certificate.c \ ags/server/security/ags_xml_password_store.c # libags-server - controller deprecated_libags_server_controller_h_sources = libags_server_controller_h_sources = \ $(deprecated_libags_server_controller_h_sources) \ ags/server/controller/ags_controller.h \ ags/server/controller/ags_front_controller.h \ ags/server/controller/ags_plugin_controller.h deprecated_libags_server_controller_c_sources = libags_server_controller_c_sources = \ $(deprecated_libags_server_controller_c_sources) \ ags/server/controller/ags_controller.c \ ags/server/controller/ags_front_controller.c \ ags/server/controller/ags_plugin_controller.c # libags-server - file deprecated_libags_server_file_h_sources = libags_server_file_h_sources = \ $(deprecated_libags_server_file_h_sources) deprecated_libags_server_file_c_sources = libags_server_file_c_sources = \ $(deprecated_libags_server_file_c_sources) # libags-audio all files deprecated_libags_audio_h_sources = libags_audio_h_sources = \ $(deprecated_libags_audio_h_sources) \ ags/audio/ags_sound_enums.h \ ags/audio/ags_synth_enums.h \ ags/audio/ags_acceleration.h \ ags/audio/ags_audio.h \ ags/audio/ags_audio_application_context.h \ ags/audio/ags_audio_buffer_util.h \ ags/audio/ags_audio_signal.h \ ags/audio/ags_automation.h \ ags/audio/ags_buffer.h \ ags/audio/ags_channel.h \ ags/audio/ags_char_buffer_util.h \ ags/audio/ags_devout.h \ ags/audio/ags_devin.h \ ags/audio/ags_diatonic_scale.h \ ags/audio/ags_filter_util.h \ ags/audio/ags_fifoout.h \ ags/audio/ags_fm_synth_util.h \ ags/audio/ags_fourier_transform_util.h \ ags/audio/ags_frequency_map.h \ ags/audio/ags_frequency_map_manager.h \ ags/audio/ags_generic_recall_channel_run.h \ ags/audio/ags_generic_recall_recycling.h \ ags/audio/ags_input.h \ ags/audio/ags_lfo_synth_util.h \ ags/audio/ags_midi.h \ ags/audio/ags_midiin.h \ ags/audio/ags_notation.h \ ags/audio/ags_note.h \ ags/audio/ags_output.h \ ags/audio/ags_pattern.h \ ags/audio/ags_playback.h \ ags/audio/ags_playback_domain.h \ ags/audio/ags_port.h \ ags/audio/ags_preset.h \ ags/audio/ags_recall_audio.h \ ags/audio/ags_recall_audio_run.h \ ags/audio/ags_recall_audio_signal.h \ ags/audio/ags_recall_channel.h \ ags/audio/ags_recall_channel_run.h \ ags/audio/ags_recall_container.h \ ags/audio/ags_recall_dependency.h \ ags/audio/ags_recall_factory.h \ ags/audio/ags_recall.h \ ags/audio/ags_recall_dssi.h \ ags/audio/ags_recall_dssi_run.h \ ags/audio/ags_recall_id.h \ ags/audio/ags_recall_ladspa.h \ ags/audio/ags_recall_ladspa_run.h \ ags/audio/ags_recall_lv2.h \ ags/audio/ags_recall_lv2_run.h \ ags/audio/ags_recall_recycling.h \ ags/audio/ags_recycling_context.h \ ags/audio/ags_recycling.h \ ags/audio/ags_sound_provider.h \ ags/audio/ags_sequencer_util.h \ ags/audio/ags_soundcard_util.h \ ags/audio/ags_synth_generator.h \ ags/audio/ags_synth_util.h \ ags/audio/ags_track.h \ ags/audio/ags_wave.h deprecated_libags_audio_c_sources = libags_audio_c_sources = \ $(deprecated_libags_audio_c_sources) \ ags/audio/ags_acceleration.c \ ags/audio/ags_audio.c \ ags/audio/ags_audio_application_context.c \ ags/audio/ags_audio_buffer_util.c \ ags/audio/ags_audio_signal.c \ ags/audio/ags_automation.c \ ags/audio/ags_buffer.c \ ags/audio/ags_channel.c \ ags/audio/ags_char_buffer_util.c \ ags/audio/ags_devout.c \ ags/audio/ags_devin.c \ ags/audio/ags_diatonic_scale.c \ ags/audio/ags_input.c \ ags/audio/ags_filter_util.c \ ags/audio/ags_fifoout.c \ ags/audio/ags_fm_synth_util.c \ ags/audio/ags_fourier_transform_util.c \ ags/audio/ags_frequency_map.c \ ags/audio/ags_frequency_map_manager.c \ ags/audio/ags_generic_recall_channel_run.c \ ags/audio/ags_generic_recall_recycling.c \ ags/audio/ags_lfo_synth_util.c \ ags/audio/ags_midi.c \ ags/audio/ags_midiin.c \ ags/audio/ags_notation.c \ ags/audio/ags_note.c \ ags/audio/ags_output.c \ ags/audio/ags_pattern.c \ ags/audio/ags_playback.c \ ags/audio/ags_playback_domain.c \ ags/audio/ags_port.c \ ags/audio/ags_preset.c \ ags/audio/ags_recall_audio.c \ ags/audio/ags_recall_audio_run.c \ ags/audio/ags_recall_audio_signal.c \ ags/audio/ags_recall.c \ ags/audio/ags_recall_channel.c \ ags/audio/ags_recall_channel_run.c \ ags/audio/ags_recall_container.c \ ags/audio/ags_recall_dependency.c \ ags/audio/ags_recall_factory.c \ ags/audio/ags_recall_dssi.c \ ags/audio/ags_recall_dssi_run.c \ ags/audio/ags_recall_id.c \ ags/audio/ags_recall_ladspa.c \ ags/audio/ags_recall_ladspa_run.c \ ags/audio/ags_recall_lv2.c \ ags/audio/ags_recall_lv2_run.c \ ags/audio/ags_recall_recycling.c \ ags/audio/ags_recycling.c \ ags/audio/ags_recycling_context.c \ ags/audio/ags_sound_provider.c \ ags/audio/ags_sequencer_util.c \ ags/audio/ags_soundcard_util.c \ ags/audio/ags_synth_generator.c \ ags/audio/ags_synth_util.c \ ags/audio/ags_track.c \ ags/audio/ags_wave.c # libags-audio - thread deprecated_libags_audio_thread_h_sources = libags_audio_thread_h_sources = \ $(deprecated_libags_audio_thread_h_sources) \ ags/audio/thread/ags_audio_loop.h \ ags/audio/thread/ags_audio_thread.h \ ags/audio/thread/ags_channel_thread.h \ ags/audio/thread/ags_sequencer_thread.h \ ags/audio/thread/ags_soundcard_thread.h \ ags/audio/thread/ags_export_thread.h \ ags/audio/thread/ags_sf2_loader.h \ ags/audio/thread/ags_sfz_loader.h \ ags/audio/thread/ags_wave_loader.h deprecated_libags_audio_thread_c_sources = libags_audio_thread_c_sources = \ $(deprecated_libags_audio_thread_c_sources) \ ags/audio/thread/ags_audio_loop.c \ ags/audio/thread/ags_audio_thread.c \ ags/audio/thread/ags_channel_thread.c \ ags/audio/thread/ags_sequencer_thread.c \ ags/audio/thread/ags_soundcard_thread.c \ ags/audio/thread/ags_export_thread.c \ ags/audio/thread/ags_sf2_loader.c \ ags/audio/thread/ags_sfz_loader.c \ ags/audio/thread/ags_wave_loader.c # libags-audio - plugin deprecated_libags_plugin_h_sources = libags_plugin_h_sources = \ $(deprecated_libags_plugin_h_sources) \ ags/plugin/ags_base_plugin.h \ ags/plugin/ags_dssi_manager.h \ ags/plugin/ags_dssi_plugin.h \ ags/plugin/ags_ladspa_conversion.h \ ags/plugin/ags_ladspa_manager.h \ ags/plugin/ags_ladspa_plugin.h \ ags/plugin/ags_lv2_conversion.h \ ags/plugin/ags_lv2_manager.h \ ags/plugin/ags_lv2_turtle_parser.h \ ags/plugin/ags_lv2_plugin.h \ ags/plugin/ags_lv2_preset_manager.h \ ags/plugin/ags_lv2_preset.h \ ags/plugin/ags_lv2_event_manager.h \ ags/plugin/ags_lv2_log_manager.h \ ags/plugin/ags_lv2_option_manager.h \ ags/plugin/ags_lv2_uri_map_manager.h \ ags/plugin/ags_lv2_urid_manager.h \ ags/plugin/ags_lv2_worker_manager.h \ ags/plugin/ags_lv2_worker.h \ ags/plugin/ags_lv2ui_manager.h \ ags/plugin/ags_lv2ui_plugin.h \ ags/plugin/ags_plugin_stock.h \ ags/plugin/ags_plugin_port.h deprecated_libags_plugin_c_sources = libags_plugin_c_sources = \ $(deprecated_libags_plugin_c_sources) \ ags/plugin/ags_base_plugin.c \ ags/plugin/ags_dssi_manager.c \ ags/plugin/ags_dssi_plugin.c \ ags/plugin/ags_ladspa_conversion.c \ ags/plugin/ags_ladspa_manager.c \ ags/plugin/ags_ladspa_plugin.c \ ags/plugin/ags_lv2_conversion.c \ ags/plugin/ags_lv2_manager.c \ ags/plugin/ags_lv2_turtle_parser.c \ ags/plugin/ags_lv2_plugin.c \ ags/plugin/ags_lv2_preset_manager.c \ ags/plugin/ags_lv2_preset.c \ ags/plugin/ags_lv2_log_manager.c \ ags/plugin/ags_lv2_event_manager.c \ ags/plugin/ags_lv2_option_manager.c \ ags/plugin/ags_lv2_uri_map_manager.c \ ags/plugin/ags_lv2_urid_manager.c \ ags/plugin/ags_lv2_worker_manager.c \ ags/plugin/ags_lv2_worker.c \ ags/plugin/ags_lv2ui_manager.c \ ags/plugin/ags_lv2ui_plugin.c \ ags/plugin/ags_plugin_port.c # libags-audio - file deprecated_libags_audio_file_h_sources = libags_audio_file_h_sources = \ $(deprecated_libags_audio_file_h_sources) \ ags/audio/file/ags_audio_container.h \ ags/audio/file/ags_audio_file.h \ ags/audio/file/ags_audio_file_link.h \ ags/audio/file/ags_sound_container.h \ ags/audio/file/ags_sound_resource.h \ ags/audio/file/ags_sndfile.h ags/audio/file/ags_sfz_file.h \ ags/audio/file/ags_sfz_group.h ags/audio/file/ags_sfz_region.h \ ags/audio/file/ags_sfz_sample.h $(am__append_40) deprecated_libags_audio_file_c_sources = libags_audio_file_c_sources = \ $(deprecated_libags_audio_file_c_sources) \ ags/audio/file/ags_audio_container.c \ ags/audio/file/ags_audio_file.c \ ags/audio/file/ags_audio_file_link.c \ ags/audio/file/ags_sound_container.c \ ags/audio/file/ags_sound_resource.c \ ags/audio/file/ags_sndfile.c ags/audio/file/ags_sfz_file.c \ ags/audio/file/ags_sfz_group.c ags/audio/file/ags_sfz_region.c \ ags/audio/file/ags_sfz_sample.c $(am__append_41) # libags-audio - midi deprecated_libags_audio_midi_h_sources = libags_audio_midi_h_sources = \ $(deprecated_libags_audio_midi_h_sources) \ ags/audio/midi/ags_midi_buffer_util.h \ ags/audio/midi/ags_midi_util.h \ ags/audio/midi/ags_midi_builder.h \ ags/audio/midi/ags_midi_file.h \ ags/audio/midi/ags_midi_parser.h deprecated_libags_audio_midi_c_sources = libags_audio_midi_c_sources = \ $(deprecated_libags_audio_midi_c_sources) \ ags/audio/midi/ags_midi_buffer_util.c \ ags/audio/midi/ags_midi_util.c \ ags/audio/midi/ags_midi_builder.c \ ags/audio/midi/ags_midi_file.c \ ags/audio/midi/ags_midi_parser.c # libags-audio - osc deprecated_libags_audio_osc_h_sources = libags_audio_osc_h_sources = \ $(deprecated_libags_audio_osc_h_sources) \ ags/audio/osc/ags_osc_buffer_util.h \ ags/audio/osc/ags_osc_builder.h \ ags/audio/osc/ags_osc_client.h \ ags/audio/osc/ags_osc_connection.h \ ags/audio/osc/ags_osc_message.h \ ags/audio/osc/ags_osc_parser.h \ ags/audio/osc/ags_osc_response.h \ ags/audio/osc/ags_osc_server.h \ ags/audio/osc/ags_osc_util.h \ ags/audio/osc/ags_osc_websocket_connection.h \ ags/audio/osc/ags_osc_xmlrpc_message.h \ ags/audio/osc/ags_osc_xmlrpc_server.h deprecated_libags_audio_osc_c_sources = libags_audio_osc_c_sources = \ $(deprecated_libags_audio_osc_c_sources) \ ags/audio/osc/ags_osc_buffer_util.c \ ags/audio/osc/ags_osc_builder.c \ ags/audio/osc/ags_osc_client.c \ ags/audio/osc/ags_osc_connection.c \ ags/audio/osc/ags_osc_message.c \ ags/audio/osc/ags_osc_parser.c \ ags/audio/osc/ags_osc_response.c \ ags/audio/osc/ags_osc_server.c \ ags/audio/osc/ags_osc_util.c \ ags/audio/osc/ags_osc_websocket_connection.c \ ags/audio/osc/ags_osc_xmlrpc_message.c \ ags/audio/osc/ags_osc_xmlrpc_server.c deprecated_libags_audio_osc_controller_h_sources = libags_audio_osc_controller_h_sources = \ $(deprecated_libags_audio_osc_controller_h_sources) \ ags/audio/osc/controller/ags_osc_controller.h \ ags/audio/osc/controller/ags_osc_action_controller.h \ ags/audio/osc/controller/ags_osc_config_controller.h \ ags/audio/osc/controller/ags_osc_export_controller.h \ ags/audio/osc/controller/ags_osc_front_controller.h \ ags/audio/osc/controller/ags_osc_info_controller.h \ ags/audio/osc/controller/ags_osc_meter_controller.h \ ags/audio/osc/controller/ags_osc_node_controller.h \ ags/audio/osc/controller/ags_osc_plugin_controller.h \ ags/audio/osc/controller/ags_osc_renew_controller.h \ ags/audio/osc/controller/ags_osc_status_controller.h deprecated_libags_audio_osc_controller_c_sources = libags_audio_osc_controller_c_sources = \ $(deprecated_libags_audio_controller_osc_c_sources) \ ags/audio/osc/controller/ags_osc_controller.c \ ags/audio/osc/controller/ags_osc_action_controller.c \ ags/audio/osc/controller/ags_osc_config_controller.c \ ags/audio/osc/controller/ags_osc_export_controller.c \ ags/audio/osc/controller/ags_osc_front_controller.c \ ags/audio/osc/controller/ags_osc_info_controller.c \ ags/audio/osc/controller/ags_osc_meter_controller.c \ ags/audio/osc/controller/ags_osc_node_controller.c \ ags/audio/osc/controller/ags_osc_plugin_controller.c \ ags/audio/osc/controller/ags_osc_renew_controller.c \ ags/audio/osc/controller/ags_osc_status_controller.c deprecated_libags_audio_osc_xmlrpc_h_sources = libags_audio_osc_xmlrpc_h_sources = \ $(deprecated_libags_audio_osc_xmlrpc_h_sources) \ ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.h deprecated_libags_audio_osc_xmlrpc_c_sources = libags_audio_osc_xmlrpc_c_sources = \ $(deprecated_libags_audio_xmlrpc_osc_c_sources) \ ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c # libags-audio - jack deprecated_libags_audio_jack_h_sources = libags_audio_jack_h_sources = \ $(deprecated_libags_audio_jack_h_sources) \ ags/audio/jack/ags_jack_client.h \ ags/audio/jack/ags_jack_midiin.h \ ags/audio/jack/ags_jack_devout.h \ ags/audio/jack/ags_jack_devin.h \ ags/audio/jack/ags_jack_port.h \ ags/audio/jack/ags_jack_server.h deprecated_libags_audio_jack_c_sources = libags_audio_jack_c_sources = \ $(deprecated_libags_audio_jack_c_sources) \ ags/audio/jack/ags_jack_client.c \ ags/audio/jack/ags_jack_midiin.c \ ags/audio/jack/ags_jack_devout.c \ ags/audio/jack/ags_jack_devin.c \ ags/audio/jack/ags_jack_port.c \ ags/audio/jack/ags_jack_server.c # libags-audio - pulse deprecated_libags_audio_pulse_h_sources = libags_audio_pulse_h_sources = \ $(deprecated_libags_audio_pulse_h_sources) \ ags/audio/pulse/ags_pulse_client.h \ ags/audio/pulse/ags_pulse_devout.h \ ags/audio/pulse/ags_pulse_devin.h \ ags/audio/pulse/ags_pulse_port.h \ ags/audio/pulse/ags_pulse_server.h deprecated_libags_audio_pulse_c_sources = libags_audio_pulse_c_sources = \ $(deprecated_libags_audio_pulse_c_sources) \ ags/audio/pulse/ags_pulse_client.c \ ags/audio/pulse/ags_pulse_devout.c \ ags/audio/pulse/ags_pulse_devin.c \ ags/audio/pulse/ags_pulse_port.c \ ags/audio/pulse/ags_pulse_server.c # libags-audio - core-audio deprecated_libags_audio_core_audio_h_sources = libags_audio_core_audio_h_sources = \ $(deprecated_libags_audio_core_audio_h_sources) \ ags/audio/core-audio/ags_core_audio_client.h \ ags/audio/core-audio/ags_core_audio_midiin.h \ ags/audio/core-audio/ags_core_audio_devout.h \ ags/audio/core-audio/ags_core_audio_devin.h \ ags/audio/core-audio/ags_core_audio_port.h \ ags/audio/core-audio/ags_core_audio_server.h deprecated_libags_audio_core_audio_c_sources = libags_audio_core_audio_c_sources = \ $(deprecated_libags_audio_core_audio_c_sources) \ ags/audio/core-audio/ags_core_audio_client.c \ ags/audio/core-audio/ags_core_audio_midiin.c \ ags/audio/core-audio/ags_core_audio_devout.c \ ags/audio/core-audio/ags_core_audio_devin.c \ ags/audio/core-audio/ags_core_audio_port.c \ ags/audio/core-audio/ags_core_audio_server.c # libags-audio - wasapi deprecated_libags_audio_wasapi_h_sources = libags_audio_wasapi_h_sources = \ $(deprecated_libags_audio_wasapi_h_sources) \ ags/audio/wasapi/ags_wasapi_devout.h \ ags/audio/wasapi/ags_wasapi_devin.h deprecated_libags_audio_wasapi_c_sources = libags_audio_wasapi_c_sources = \ $(deprecated_libags_audio_wasapi_c_sources) \ ags/audio/wasapi/ags_wasapi_devout.c \ ags/audio/wasapi/ags_wasapi_devin.c # libags-audio - audio-unit deprecated_libags_audio_audio_unit_h_sources = libags_audio_audio_unit_h_sources = \ $(deprecated_libags_audio_audio_unit_h_sources) \ ags/audio/audio-unit/ags_audio_unit_client.h \ ags/audio/audio-unit/ags_audio_unit_devin.h \ ags/audio/audio-unit/ags_audio_unit_devout.h \ ags/audio/audio-unit/ags_audio_unit_port.h \ ags/audio/audio-unit/ags_audio_unit_server.h deprecated_libags_audio_audio_unit_c_sources = libags_audio_audio_unit_c_sources = \ $(deprecated_libags_audio_audio_unit_c_sources) \ ags/audio/audio-unit/ags_audio_unit_client.c \ ags/audio/audio-unit/ags_audio_unit_devin.c \ ags/audio/audio-unit/ags_audio_unit_devout.c \ ags/audio/audio-unit/ags_audio_unit_port.c \ ags/audio/audio-unit/ags_audio_unit_server.c # libags-audio - recall deprecated_libags_audio_recall_h_sources = libags_audio_recall_h_sources = \ $(deprecated_libags_audio_recall_h_sources) \ ags/audio/recall/ags_analyse_audio_signal.h \ ags/audio/recall/ags_analyse_channel.h \ ags/audio/recall/ags_analyse_channel_run.h \ ags/audio/recall/ags_analyse_recycling.h \ ags/audio/recall/ags_buffer_audio_signal.h \ ags/audio/recall/ags_buffer_channel.h \ ags/audio/recall/ags_buffer_channel_run.h \ ags/audio/recall/ags_buffer_recycling.h \ ags/audio/recall/ags_capture_wave_audio.h \ ags/audio/recall/ags_capture_wave_audio_run.h \ ags/audio/recall/ags_capture_wave_channel.h \ ags/audio/recall/ags_capture_wave_channel_run.h \ ags/audio/recall/ags_copy_audio_signal.h \ ags/audio/recall/ags_copy_channel.h \ ags/audio/recall/ags_copy_channel_run.h \ ags/audio/recall/ags_copy_pattern_audio.h \ ags/audio/recall/ags_copy_pattern_audio_run.h \ ags/audio/recall/ags_copy_pattern_channel.h \ ags/audio/recall/ags_copy_pattern_channel_run.h \ ags/audio/recall/ags_copy_recycling.h \ ags/audio/recall/ags_count_beats_audio.h \ ags/audio/recall/ags_count_beats_audio_run.h \ ags/audio/recall/ags_delay_audio.h \ ags/audio/recall/ags_delay_audio_run.h \ ags/audio/recall/ags_envelope_audio_signal.h \ ags/audio/recall/ags_envelope_channel.h \ ags/audio/recall/ags_envelope_channel_run.h \ ags/audio/recall/ags_envelope_recycling.h \ ags/audio/recall/ags_eq10_audio_signal.h \ ags/audio/recall/ags_eq10_channel.h \ ags/audio/recall/ags_eq10_channel_run.h \ ags/audio/recall/ags_eq10_recycling.h \ ags/audio/recall/ags_feed_audio_signal.h \ ags/audio/recall/ags_feed_channel.h \ ags/audio/recall/ags_feed_channel_run.h \ ags/audio/recall/ags_feed_recycling.h \ ags/audio/recall/ags_lfo_audio_signal.h \ ags/audio/recall/ags_lfo_channel.h \ ags/audio/recall/ags_lfo_channel_run.h \ ags/audio/recall/ags_lfo_recycling.h \ ags/audio/recall/ags_loop_channel.h \ ags/audio/recall/ags_loop_channel_run.h \ ags/audio/recall/ags_mute_audio.h \ ags/audio/recall/ags_mute_audio_run.h \ ags/audio/recall/ags_mute_audio_signal.h \ ags/audio/recall/ags_mute_channel.h \ ags/audio/recall/ags_mute_channel_run.h \ ags/audio/recall/ags_mute_recycling.h \ ags/audio/recall/ags_peak_audio_signal.h \ ags/audio/recall/ags_peak_channel.h \ ags/audio/recall/ags_peak_channel_run.h \ ags/audio/recall/ags_peak_recycling.h \ ags/audio/recall/ags_play_audio.h \ ags/audio/recall/ags_play_audio_signal.h \ ags/audio/recall/ags_play_channel.h \ ags/audio/recall/ags_play_channel_run.h \ ags/audio/recall/ags_play_channel_run_master.h \ ags/audio/recall/ags_play_dssi_audio.h \ ags/audio/recall/ags_play_dssi_audio_run.h \ ags/audio/recall/ags_play_lv2_audio.h \ ags/audio/recall/ags_play_lv2_audio_run.h \ ags/audio/recall/ags_play_notation_audio.h \ ags/audio/recall/ags_play_notation_audio_run.h \ ags/audio/recall/ags_play_recycling.h \ ags/audio/recall/ags_play_wave_audio.h \ ags/audio/recall/ags_play_wave_audio_run.h \ ags/audio/recall/ags_play_wave_channel.h \ ags/audio/recall/ags_play_wave_channel_run.h \ ags/audio/recall/ags_prepare_audio_signal.h \ ags/audio/recall/ags_prepare_channel.h \ ags/audio/recall/ags_prepare_channel_run.h \ ags/audio/recall/ags_prepare_recycling.h \ ags/audio/recall/ags_record_midi_audio.h \ ags/audio/recall/ags_record_midi_audio_run.h \ ags/audio/recall/ags_route_dssi_audio.h \ ags/audio/recall/ags_route_dssi_audio_run.h \ ags/audio/recall/ags_route_lv2_audio.h \ ags/audio/recall/ags_route_lv2_audio_run.h \ ags/audio/recall/ags_rt_stream_audio_signal.h \ ags/audio/recall/ags_rt_stream_channel.h \ ags/audio/recall/ags_rt_stream_channel_run.h \ ags/audio/recall/ags_rt_stream_recycling.h \ ags/audio/recall/ags_stream_audio_signal.h \ ags/audio/recall/ags_stream_channel.h \ ags/audio/recall/ags_stream_channel_run.h \ ags/audio/recall/ags_stream_recycling.h \ ags/audio/recall/ags_volume_audio_signal.h \ ags/audio/recall/ags_volume_channel.h \ ags/audio/recall/ags_volume_channel_run.h \ ags/audio/recall/ags_volume_recycling.h deprecated_libags_audio_recall_c_sources = libags_audio_recall_c_sources = \ $(deprecated_libags_audio_recall_c_sources) \ ags/audio/recall/ags_analyse_audio_signal.c \ ags/audio/recall/ags_analyse_channel.c \ ags/audio/recall/ags_analyse_channel_run.c \ ags/audio/recall/ags_analyse_recycling.c \ ags/audio/recall/ags_buffer_audio_signal.c \ ags/audio/recall/ags_buffer_channel.c \ ags/audio/recall/ags_buffer_channel_run.c \ ags/audio/recall/ags_buffer_recycling.c \ ags/audio/recall/ags_capture_wave_audio.c \ ags/audio/recall/ags_capture_wave_audio_run.c \ ags/audio/recall/ags_capture_wave_channel.c \ ags/audio/recall/ags_capture_wave_channel_run.c \ ags/audio/recall/ags_copy_audio_signal.c \ ags/audio/recall/ags_copy_channel.c \ ags/audio/recall/ags_copy_channel_run.c \ ags/audio/recall/ags_copy_pattern_audio.c \ ags/audio/recall/ags_copy_pattern_audio_run.c \ ags/audio/recall/ags_copy_pattern_channel.c \ ags/audio/recall/ags_copy_pattern_channel_run.c \ ags/audio/recall/ags_copy_recycling.c \ ags/audio/recall/ags_count_beats_audio.c \ ags/audio/recall/ags_count_beats_audio_run.c \ ags/audio/recall/ags_delay_audio.c \ ags/audio/recall/ags_delay_audio_run.c \ ags/audio/recall/ags_envelope_audio_signal.c \ ags/audio/recall/ags_envelope_channel.c \ ags/audio/recall/ags_envelope_channel_run.c \ ags/audio/recall/ags_envelope_recycling.c \ ags/audio/recall/ags_eq10_audio_signal.c \ ags/audio/recall/ags_eq10_channel.c \ ags/audio/recall/ags_eq10_channel_run.c \ ags/audio/recall/ags_eq10_recycling.c \ ags/audio/recall/ags_feed_audio_signal.c \ ags/audio/recall/ags_feed_channel.c \ ags/audio/recall/ags_feed_channel_run.c \ ags/audio/recall/ags_feed_recycling.c \ ags/audio/recall/ags_lfo_audio_signal.c \ ags/audio/recall/ags_lfo_channel.c \ ags/audio/recall/ags_lfo_channel_run.c \ ags/audio/recall/ags_lfo_recycling.c \ ags/audio/recall/ags_loop_channel.c \ ags/audio/recall/ags_loop_channel_run.c \ ags/audio/recall/ags_mute_audio.c \ ags/audio/recall/ags_mute_audio_run.c \ ags/audio/recall/ags_mute_audio_signal.c \ ags/audio/recall/ags_mute_channel.c \ ags/audio/recall/ags_mute_channel_run.c \ ags/audio/recall/ags_mute_recycling.c \ ags/audio/recall/ags_peak_audio_signal.c \ ags/audio/recall/ags_peak_channel.c \ ags/audio/recall/ags_peak_channel_run.c \ ags/audio/recall/ags_peak_recycling.c \ ags/audio/recall/ags_play_audio.c \ ags/audio/recall/ags_play_audio_signal.c \ ags/audio/recall/ags_play_channel.c \ ags/audio/recall/ags_play_channel_run.c \ ags/audio/recall/ags_play_channel_run_master.c \ ags/audio/recall/ags_play_dssi_audio.c \ ags/audio/recall/ags_play_dssi_audio_run.c \ ags/audio/recall/ags_play_lv2_audio.c \ ags/audio/recall/ags_play_lv2_audio_run.c \ ags/audio/recall/ags_play_notation_audio.c \ ags/audio/recall/ags_play_notation_audio_run.c \ ags/audio/recall/ags_play_recycling.c \ ags/audio/recall/ags_play_wave_audio.c \ ags/audio/recall/ags_play_wave_audio_run.c \ ags/audio/recall/ags_play_wave_channel.c \ ags/audio/recall/ags_play_wave_channel_run.c \ ags/audio/recall/ags_prepare_audio_signal.c \ ags/audio/recall/ags_prepare_channel.c \ ags/audio/recall/ags_prepare_channel_run.c \ ags/audio/recall/ags_prepare_recycling.c \ ags/audio/recall/ags_record_midi_audio.c \ ags/audio/recall/ags_record_midi_audio_run.c \ ags/audio/recall/ags_route_dssi_audio.c \ ags/audio/recall/ags_route_dssi_audio_run.c \ ags/audio/recall/ags_route_lv2_audio.c \ ags/audio/recall/ags_route_lv2_audio_run.c \ ags/audio/recall/ags_rt_stream_audio_signal.c \ ags/audio/recall/ags_rt_stream_channel.c \ ags/audio/recall/ags_rt_stream_channel_run.c \ ags/audio/recall/ags_rt_stream_recycling.c \ ags/audio/recall/ags_stream_audio_signal.c \ ags/audio/recall/ags_stream_channel.c \ ags/audio/recall/ags_stream_channel_run.c \ ags/audio/recall/ags_stream_recycling.c \ ags/audio/recall/ags_volume_audio_signal.c \ ags/audio/recall/ags_volume_channel.c \ ags/audio/recall/ags_volume_channel_run.c \ ags/audio/recall/ags_volume_recycling.c # libags-audio - task deprecated_libags_audio_task_h_sources = libags_audio_task_h_sources = \ $(deprecated_libags_audio_task_h_sources) \ ags/audio/task/ags_add_audio.h \ ags/audio/task/ags_add_audio_signal.h \ ags/audio/task/ags_add_effect.h ags/audio/task/ags_add_note.h \ ags/audio/task/ags_add_soundcard.h \ ags/audio/task/ags_apply_presets.h \ ags/audio/task/ags_apply_sound_config.h \ ags/audio/task/ags_apply_synth.h \ ags/audio/task/ags_cancel_audio.h \ ags/audio/task/ags_cancel_channel.h \ ags/audio/task/ags_clear_audio_signal.h \ ags/audio/task/ags_clear_buffer.h \ ags/audio/task/ags_crop_note.h \ ags/audio/task/ags_export_output.h \ ags/audio/task/ags_free_selection.h \ ags/audio/task/ags_link_channel.h \ ags/audio/task/ags_move_note.h ags/audio/task/ags_open_file.h \ ags/audio/task/ags_open_single_file.h \ ags/audio/task/ags_open_wave.h \ ags/audio/task/ags_remove_audio.h \ ags/audio/task/ags_remove_audio_signal.h \ ags/audio/task/ags_remove_note.h \ ags/audio/task/ags_remove_soundcard.h \ ags/audio/task/ags_resize_audio.h \ ags/audio/task/ags_seek_soundcard.h \ ags/audio/task/ags_set_audio_channels.h \ ags/audio/task/ags_set_buffer_size.h \ ags/audio/task/ags_set_device.h \ ags/audio/task/ags_set_format.h \ ags/audio/task/ags_set_samplerate.h \ ags/audio/task/ags_start_audio.h \ ags/audio/task/ags_start_channel.h \ ags/audio/task/ags_start_sequencer.h \ ags/audio/task/ags_start_soundcard.h \ ags/audio/task/ags_stop_sequencer.h \ ags/audio/task/ags_stop_soundcard.h \ ags/audio/task/ags_switch_buffer_flag.h \ ags/audio/task/ags_tic_device.h \ ags/audio/task/ags_toggle_pattern_bit.h \ ags/audio/task/ags_apply_bpm.h \ ags/audio/task/ags_apply_sequencer_length.h \ ags/audio/task/ags_apply_tact.h \ ags/audio/task/ags_reset_amplitude.h \ ags/audio/task/ags_reset_note.h \ ags/audio/task/ags_reset_peak.h ags/audio/task/ags_set_muted.h \ $(am__append_42) deprecated_libags_audio_task_c_sources = libags_audio_task_c_sources = \ $(deprecated_libags_audio_task_c_sources) \ ags/audio/task/ags_add_audio.c \ ags/audio/task/ags_add_audio_signal.c \ ags/audio/task/ags_add_effect.c ags/audio/task/ags_add_note.c \ ags/audio/task/ags_add_soundcard.c \ ags/audio/task/ags_apply_presets.c \ ags/audio/task/ags_apply_sound_config.c \ ags/audio/task/ags_apply_synth.c \ ags/audio/task/ags_cancel_audio.c \ ags/audio/task/ags_cancel_channel.c \ ags/audio/task/ags_clear_audio_signal.c \ ags/audio/task/ags_clear_buffer.c \ ags/audio/task/ags_crop_note.c \ ags/audio/task/ags_export_output.c \ ags/audio/task/ags_free_selection.c \ ags/audio/task/ags_link_channel.c \ ags/audio/task/ags_move_note.c ags/audio/task/ags_open_file.c \ ags/audio/task/ags_open_single_file.c \ ags/audio/task/ags_open_wave.c \ ags/audio/task/ags_remove_audio.c \ ags/audio/task/ags_remove_audio_signal.c \ ags/audio/task/ags_remove_note.c \ ags/audio/task/ags_remove_soundcard.c \ ags/audio/task/ags_resize_audio.c \ ags/audio/task/ags_seek_soundcard.c \ ags/audio/task/ags_set_audio_channels.c \ ags/audio/task/ags_set_buffer_size.c \ ags/audio/task/ags_set_device.c \ ags/audio/task/ags_set_format.c \ ags/audio/task/ags_set_samplerate.c \ ags/audio/task/ags_start_audio.c \ ags/audio/task/ags_start_channel.c \ ags/audio/task/ags_start_sequencer.c \ ags/audio/task/ags_start_soundcard.c \ ags/audio/task/ags_stop_sequencer.c \ ags/audio/task/ags_stop_soundcard.c \ ags/audio/task/ags_switch_buffer_flag.c \ ags/audio/task/ags_tic_device.c \ ags/audio/task/ags_toggle_pattern_bit.c \ ags/audio/task/ags_apply_bpm.c \ ags/audio/task/ags_apply_sequencer_length.c \ ags/audio/task/ags_apply_tact.c \ ags/audio/task/ags_reset_amplitude.c \ ags/audio/task/ags_reset_note.c \ ags/audio/task/ags_reset_peak.c ags/audio/task/ags_set_muted.c \ $(am__append_43) # libags-gui all files deprecated_libags_gui_h_sources = libags_gui_h_sources = \ $(deprecated_libags_gui_h_sources) \ ags/widget/ags_cartesian.h \ ags/widget/ags_dial.h \ ags/widget/ags_expander.h \ ags/widget/ags_expander_set.h \ ags/widget/ags_hindicator.h \ ags/widget/ags_hled_array.h \ ags/widget/ags_indicator.h \ ags/widget/ags_led.h \ ags/widget/ags_led_array.h \ ags/widget/ags_level.h \ ags/widget/ags_level_box.h \ ags/widget/ags_hlevel_box.h \ ags/widget/ags_vlevel_box.h \ ags/widget/ags_notebook.h \ ags/widget/ags_piano_keys.h \ ags/widget/ags_piano.h \ ags/widget/ags_scrolled_piano.h \ ags/widget/ags_scale.h \ ags/widget/ags_scale_box.h \ ags/widget/ags_vscale_box.h \ ags/widget/ags_hscale_box.h \ ags/widget/ags_scrolled_level_box.h \ ags/widget/ags_scrolled_scale_box.h \ ags/widget/ags_ruler.h \ ags/widget/ags_vindicator.h \ ags/widget/ags_vled_array.h \ ags/widget/ags_widget_marshal.h \ ags/widget/ags_container.h deprecated_libags_gui_c_sources = libags_gui_c_sources = \ $(deprecated_libags_gui_c_sources) \ ags/widget/ags_cartesian.c \ ags/widget/ags_dial.c \ ags/widget/ags_expander.c \ ags/widget/ags_expander_set.c \ ags/widget/ags_hindicator.c \ ags/widget/ags_hled_array.c \ ags/widget/ags_indicator.c \ ags/widget/ags_led.c \ ags/widget/ags_led_array.c \ ags/widget/ags_level.c \ ags/widget/ags_level_box.c \ ags/widget/ags_hlevel_box.c \ ags/widget/ags_vlevel_box.c \ ags/widget/ags_notebook.c \ ags/widget/ags_piano.c \ ags/widget/ags_scrolled_piano.c \ ags/widget/ags_scale.c \ ags/widget/ags_scale_box.c \ ags/widget/ags_vscale_box.c \ ags/widget/ags_hscale_box.c \ ags/widget/ags_scrolled_scale_box.c \ ags/widget/ags_scrolled_level_box.c \ ags/widget/ags_ruler.c \ ags/widget/ags_vindicator.c \ ags/widget/ags_vled_array.c \ ags/widget/ags_widget_marshal.c \ ags/widget/ags_container.c # libgsequencer all files deprecated_libgsequencer_h_sources = libgsequencer_h_sources = \ $(deprecated_libgsequencer_h_sources) \ ags/X/ags_animation_window.h \ ags/X/ags_automation_editor_callbacks.h \ ags/X/ags_automation_editor.h \ ags/X/ags_automation_window_callbacks.h \ ags/X/ags_automation_window.h \ ags/X/ags_audio_preferences_callbacks.h \ ags/X/ags_audio_preferences.h \ ags/X/ags_bulk_member_callbacks.h \ ags/X/ags_bulk_member.h \ ags/X/ags_connection_editor_callbacks.h \ ags/X/ags_connection_editor.h \ ags/X/ags_context_menu.h \ ags/X/ags_dssi_browser_callbacks.h \ ags/X/ags_dssi_browser.h \ ags/X/ags_effect_bridge_callbacks.h \ ags/X/ags_effect_bridge.h \ ags/X/ags_effect_bulk_callbacks.h \ ags/X/ags_effect_bulk.h \ ags/X/ags_effect_line_callbacks.h \ ags/X/ags_effect_line.h \ ags/X/ags_effect_pad_callbacks.h \ ags/X/ags_effect_pad.h \ ags/X/ags_effect_separator.h \ ags/X/ags_export_soundcard_callbacks.h \ ags/X/ags_export_soundcard.h \ ags/X/ags_export_window_callbacks.h \ ags/X/ags_export_window.h \ ags/X/ags_generic_preferences_callbacks.h \ ags/X/ags_generic_preferences.h \ ags/X/ags_input_collection_editor_callbacks.h \ ags/X/ags_input_collection_editor.h \ ags/X/ags_input_editor_callbacks.h \ ags/X/ags_input_editor.h \ ags/X/ags_input_listing_editor_callbacks.h \ ags/X/ags_input_listing_editor.h \ ags/X/ags_ladspa_browser_callbacks.h \ ags/X/ags_ladspa_browser.h \ ags/X/ags_lv2_browser_callbacks.h \ ags/X/ags_lv2_browser.h \ ags/X/ags_line_callbacks.h \ ags/X/ags_line_editor_callbacks.h \ ags/X/ags_line_editor.h \ ags/X/ags_line.h \ ags/X/ags_line_member_callbacks.h \ ags/X/ags_line_member_editor_callbacks.h \ ags/X/ags_line_member_editor.h \ ags/X/ags_line_member.h \ ags/X/ags_link_collection_editor_callbacks.h \ ags/X/ags_link_collection_editor.h \ ags/X/ags_link_editor_callbacks.h \ ags/X/ags_link_editor.h \ ags/X/ags_listing_editor_callbacks.h \ ags/X/ags_listing_editor.h \ ags/X/ags_machine_callbacks.h \ ags/X/ags_machine_editor_callbacks.h \ ags/X/ags_machine_editor.h \ ags/X/ags_machine.h \ ags/X/ags_menu_action_callbacks.h \ ags/X/ags_menu_bar.h \ ags/X/ags_midi_dialog_callbacks.h \ ags/X/ags_midi_dialog.h \ ags/X/ags_midi_preferences.h \ ags/X/ags_midi_preferences_callbacks.h \ ags/X/ags_navigation_callbacks.h \ ags/X/ags_navigation.h \ ags/X/ags_notation_editor_callbacks.h \ ags/X/ags_notation_editor.h \ ags/X/ags_osc_server_preferences_callbacks.h \ ags/X/ags_osc_server_preferences.h \ ags/X/ags_output_collection_editor_callbacks.h \ ags/X/ags_output_collection_editor.h \ ags/X/ags_output_editor_callbacks.h \ ags/X/ags_output_editor.h \ ags/X/ags_output_listing_editor_callbacks.h \ ags/X/ags_output_listing_editor.h \ ags/X/ags_pad_callbacks.h \ ags/X/ags_pad_editor_callbacks.h \ ags/X/ags_pad_editor.h \ ags/X/ags_pad.h \ ags/X/ags_performance_preferences_callbacks.h \ ags/X/ags_performance_preferences.h \ ags/X/ags_playback_window_callbacks.h \ ags/X/ags_playback_window.h \ ags/X/ags_plugin_browser_callbacks.h \ ags/X/ags_plugin_browser.h \ ags/X/ags_plugin_preferences_callbacks.h \ ags/X/ags_plugin_preferences.h \ ags/X/ags_preferences_callbacks.h \ ags/X/ags_preferences.h \ ags/X/ags_property_collection_editor_callbacks.h \ ags/X/ags_property_collection_editor.h \ ags/X/ags_property_editor_callbacks.h \ ags/X/ags_property_editor.h \ ags/X/ags_property_listing_editor.h \ ags/X/ags_resize_editor.h \ ags/X/ags_sequencer_editor_callbacks.h \ ags/X/ags_sequencer_editor.h \ ags/X/ags_server_preferences_callbacks.h \ ags/X/ags_server_preferences.h \ ags/X/ags_sheet_window.h \ ags/X/ags_sheet_window_callbacks.h \ ags/X/ags_sheet_editor.h \ ags/X/ags_sheet_editor_callbacks.h \ ags/X/ags_soundcard_editor_callbacks.h \ ags/X/ags_soundcard_editor.h \ ags/X/ags_ui_provider.h \ ags/X/ags_wave_window_callbacks.h \ ags/X/ags_wave_window.h \ ags/X/ags_wave_editor_callbacks.h \ ags/X/ags_wave_editor.h \ ags/X/ags_window.h \ ags/X/ags_window_callbacks.h \ ags/X/ags_xorg_application_context.h deprecated_libgsequencer_c_sources = libgsequencer_c_sources = \ $(deprecated_libgsequencer_c_sources) \ ags/X/ags_animation_window.c \ ags/X/ags_automation_editor.c \ ags/X/ags_automation_editor_callbacks.c \ ags/X/ags_automation_window.c \ ags/X/ags_automation_window_callbacks.c \ ags/X/ags_audio_preferences.c \ ags/X/ags_audio_preferences_callbacks.c \ ags/X/ags_bulk_member.c \ ags/X/ags_bulk_member_callbacks.c \ ags/X/ags_connection_editor_callbacks.c \ ags/X/ags_connection_editor.c \ ags/X/ags_context_menu.c \ ags/X/ags_dssi_browser_callbacks.c \ ags/X/ags_dssi_browser.c \ ags/X/ags_effect_bridge.c \ ags/X/ags_effect_bridge_callbacks.c \ ags/X/ags_effect_bulk.c \ ags/X/ags_effect_bulk_callbacks.c \ ags/X/ags_effect_line.c \ ags/X/ags_effect_line_callbacks.c \ ags/X/ags_effect_pad.c \ ags/X/ags_effect_pad_callbacks.c \ ags/X/ags_effect_separator.c \ ags/X/ags_export_soundcard.c \ ags/X/ags_export_soundcard_callbacks.c \ ags/X/ags_export_window.c \ ags/X/ags_export_window_callbacks.c \ ags/X/ags_generic_preferences.c \ ags/X/ags_generic_preferences_callbacks.c \ ags/X/ags_ladspa_browser.c \ ags/X/ags_ladspa_browser_callbacks.c \ ags/X/ags_lv2_browser.c \ ags/X/ags_lv2_browser_callbacks.c \ ags/X/ags_input_collection_editor_callbacks.c \ ags/X/ags_input_collection_editor.c \ ags/X/ags_input_editor_callbacks.c \ ags/X/ags_input_editor.c \ ags/X/ags_input_listing_editor_callbacks.c \ ags/X/ags_input_listing_editor.c \ ags/X/ags_line.c \ ags/X/ags_line_callbacks.c \ ags/X/ags_line_editor.c \ ags/X/ags_line_editor_callbacks.c \ ags/X/ags_line_member.c \ ags/X/ags_line_member_callbacks.c \ ags/X/ags_line_member_editor.c \ ags/X/ags_line_member_editor_callbacks.c \ ags/X/ags_link_collection_editor.c \ ags/X/ags_link_collection_editor_callbacks.c \ ags/X/ags_link_editor.c \ ags/X/ags_link_editor_callbacks.c \ ags/X/ags_listing_editor.c \ ags/X/ags_listing_editor_callbacks.c \ ags/X/ags_machine.c \ ags/X/ags_machine_callbacks.c \ ags/X/ags_machine_editor.c \ ags/X/ags_machine_editor_callbacks.c \ ags/X/ags_menu_action_callbacks.c \ ags/X/ags_menu_bar.c \ ags/X/ags_midi_dialog.c \ ags/X/ags_midi_dialog_callbacks.c \ ags/X/ags_midi_preferences.c \ ags/X/ags_midi_preferences_callbacks.c \ ags/X/ags_navigation.c \ ags/X/ags_navigation_callbacks.c \ ags/X/ags_notation_editor.c \ ags/X/ags_notation_editor_callbacks.c \ ags/X/ags_osc_server_preferences_callbacks.c \ ags/X/ags_osc_server_preferences.c \ ags/X/ags_output_collection_editor_callbacks.c \ ags/X/ags_output_collection_editor.c \ ags/X/ags_output_editor_callbacks.c \ ags/X/ags_output_editor.c \ ags/X/ags_output_listing_editor_callbacks.c \ ags/X/ags_output_listing_editor.c \ ags/X/ags_pad.c \ ags/X/ags_pad_callbacks.c \ ags/X/ags_pad_editor.c \ ags/X/ags_pad_editor_callbacks.c \ ags/X/ags_performance_preferences.c \ ags/X/ags_performance_preferences_callbacks.c \ ags/X/ags_playback_window.c \ ags/X/ags_playback_window_callbacks.c \ ags/X/ags_plugin_browser.c \ ags/X/ags_plugin_browser_callbacks.c \ ags/X/ags_plugin_preferences.c \ ags/X/ags_plugin_preferences_callbacks.c \ ags/X/ags_preferences.c \ ags/X/ags_preferences_callbacks.c \ ags/X/ags_property_collection_editor.c \ ags/X/ags_property_collection_editor_callbacks.c \ ags/X/ags_property_editor.c \ ags/X/ags_property_editor_callbacks.c \ ags/X/ags_property_listing_editor.c \ ags/X/ags_resize_editor.c \ ags/X/ags_sequencer_editor_callbacks.c \ ags/X/ags_sequencer_editor.c \ ags/X/ags_server_preferences.c \ ags/X/ags_server_preferences_callbacks.c \ ags/X/ags_sheet_window.c \ ags/X/ags_sheet_window_callbacks.c \ ags/X/ags_sheet_editor.c \ ags/X/ags_sheet_editor_callbacks.c \ ags/X/ags_ui_provider.c \ ags/X/ags_wave_window_callbacks.c \ ags/X/ags_wave_window.c \ ags/X/ags_wave_editor.c \ ags/X/ags_wave_editor_callbacks.c \ ags/X/ags_window.c \ ags/X/ags_soundcard_editor_callbacks.c \ ags/X/ags_soundcard_editor.c \ ags/X/ags_window_callbacks.c \ ags/X/ags_xorg_application_context.c # libgsequencer - OSC conotroller deprecated_libgsequencer_osc_controller_h_sources = libgsequencer_osc_controller_h_sources = \ $(deprecated_libgsequencer_osc_controller_h_sources) \ ags/X/osc/controller/ags_ui_osc_renew_controller.h deprecated_libgsequencer_osc_controller_c_sources = libgsequencer_osc_controller_c_sources = \ $(deprecated_libgsequencer_osc_controller_c_sources) \ ags/X/osc/controller/ags_ui_osc_renew_controller.c # libgsequencer - file deprecated_libgsequencer_file_h_sources = libgsequencer_file_h_sources = \ $(deprecated_libgsequencer_file_h_sources) \ ags/X/file/ags_simple_file.h deprecated_libgsequencer_file_c_sources = libgsequencer_file_c_sources = \ $(deprecated_libgsequencer_file_c_sources) \ ags/X/file/ags_simple_file.c # libgsequencer - task deprecated_libgsequencer_task_h_sources = libgsequencer_task_h_sources = \ $(deprecated_libgsequencer_task_h_sources) \ ags/X/task/ags_simple_file_read.h \ ags/X/task/ags_simple_file_write.h deprecated_libgsequencer_task_c_sources = libgsequencer_task_c_sources = \ $(deprecated_libgsequencer_task_c_sources) \ ags/X/task/ags_simple_file_read.c \ ags/X/task/ags_simple_file_write.c # libgsequencer - import deprecated_libgsequencer_import_h_sources = libgsequencer_import_h_sources = \ $(deprecated_libgsequencer_import_h_sources) \ ags/X/import/ags_midi_import_wizard.h \ ags/X/import/ags_midi_import_wizard_callbacks.h \ ags/X/import/ags_track_collection.h \ ags/X/import/ags_track_collection_callbacks.h \ ags/X/import/ags_track_collection_mapper.h \ ags/X/import/ags_track_collection_mapper_callbacks.h deprecated_libgsequencer_import_c_sources = libgsequencer_import_c_sources = \ $(deprecated_libgsequencer_import_c_sources) \ ags/X/import/ags_midi_import_wizard.c \ ags/X/import/ags_midi_import_wizard_callbacks.c \ ags/X/import/ags_track_collection.c \ ags/X/import/ags_track_collection_callbacks.c \ ags/X/import/ags_track_collection_mapper.c \ ags/X/import/ags_track_collection_mapper_callbacks.c # libgsequencer - export deprecated_libgsequencer_export_h_sources = libgsequencer_export_h_sources = \ $(deprecated_libgsequencer_export_h_sources) \ ags/X/export/ags_midi_export_wizard.h \ ags/X/export/ags_midi_export_wizard_callbacks.h \ ags/X/export/ags_machine_collection.h \ ags/X/export/ags_machine_collection_callbacks.h \ ags/X/export/ags_machine_collection_entry.h \ ags/X/export/ags_machine_collection_entry_callbacks.h \ ags/X/export/ags_wave_export_dialog.h \ ags/X/export/ags_wave_export_dialog_callbacks.h deprecated_libgsequencer_export_c_sources = libgsequencer_export_c_sources = \ $(deprecated_libgsequencer_export_c_sources) \ ags/X/export/ags_midi_export_wizard.c \ ags/X/export/ags_midi_export_wizard_callbacks.c \ ags/X/export/ags_machine_collection.c \ ags/X/export/ags_machine_collection_callbacks.c \ ags/X/export/ags_machine_collection_entry.c \ ags/X/export/ags_machine_collection_entry_callbacks.c \ ags/X/export/ags_wave_export_dialog.c \ ags/X/export/ags_wave_export_dialog_callbacks.c # libgsequencer - machine deprecated_libgsequencer_machine_h_sources = libgsequencer_machine_h_sources = \ $(deprecated_libgsequencer_machine_h_sources) \ ags/X/machine/ags_audiorec.h \ ags/X/machine/ags_audiorec_callbacks.h \ ags/X/machine/ags_cell_pattern_callbacks.h \ ags/X/machine/ags_cell_pattern.h \ ags/X/machine/ags_desk_callbacks.h ags/X/machine/ags_desk.h \ ags/X/machine/ags_desk_input_pad_callbacks.h \ ags/X/machine/ags_desk_input_pad.h \ ags/X/machine/ags_drum_callbacks.h ags/X/machine/ags_drum.h \ ags/X/machine/ags_drum_input_line_callbacks.h \ ags/X/machine/ags_drum_input_line.h \ ags/X/machine/ags_drum_input_pad_callbacks.h \ ags/X/machine/ags_drum_input_pad.h \ ags/X/machine/ags_drum_output_line_callbacks.h \ ags/X/machine/ags_drum_output_line.h \ ags/X/machine/ags_drum_output_pad_callbacks.h \ ags/X/machine/ags_drum_output_pad.h \ ags/X/machine/ags_dssi_bridge_callbacks.h \ ags/X/machine/ags_dssi_bridge.h \ ags/X/machine/ags_equalizer10.h \ ags/X/machine/ags_equalizer10_callbacks.h \ ags/X/machine/ags_fm_oscillator_callbacks.h \ ags/X/machine/ags_fm_oscillator.h \ ags/X/machine/ags_fm_syncsynth.h \ ags/X/machine/ags_fm_syncsynth_callbacks.h \ ags/X/machine/ags_fm_synth.h \ ags/X/machine/ags_fm_synth_callbacks.h \ ags/X/machine/ags_fm_synth_input_pad.h \ ags/X/machine/ags_fm_synth_input_line.h \ ags/X/machine/ags_fm_synth_input_line_callbacks.h \ ags/X/machine/ags_ladspa_bridge_callbacks.h \ ags/X/machine/ags_ladspa_bridge.h \ ags/X/machine/ags_live_dssi_bridge_callbacks.h \ ags/X/machine/ags_live_dssi_bridge.h \ ags/X/machine/ags_live_lv2_bridge_callbacks.h \ ags/X/machine/ags_live_lv2_bridge.h \ ags/X/machine/ags_lv2_bridge_callbacks.h \ ags/X/machine/ags_lv2_bridge.h \ ags/X/machine/ags_matrix_callbacks.h \ ags/X/machine/ags_matrix.h \ ags/X/machine/ags_matrix_bridge_callbacks.h \ ags/X/machine/ags_matrix_bridge.h \ ags/X/machine/ags_matrix_bulk_input_callbacks.h \ ags/X/machine/ags_matrix_bulk_input.h \ ags/X/machine/ags_mixer_callbacks.h ags/X/machine/ags_mixer.h \ ags/X/machine/ags_mixer_input_line.h \ ags/X/machine/ags_mixer_input_pad.h \ ags/X/machine/ags_oscillator_callbacks.h \ ags/X/machine/ags_oscillator.h \ ags/X/machine/ags_panel_callbacks.h ags/X/machine/ags_panel.h \ ags/X/machine/ags_panel_input_line.h \ ags/X/machine/ags_panel_input_line_callbacks.h \ ags/X/machine/ags_panel_input_pad.h \ ags/X/machine/ags_pattern_box_callbacks.h \ ags/X/machine/ags_pattern_box.h \ ags/X/machine/ags_pitch_sampler.h \ ags/X/machine/ags_pitch_sampler_callbacks.h \ ags/X/machine/ags_pitch_sampler_file.h \ ags/X/machine/ags_pitch_sampler_file_callbacks.h \ ags/X/machine/ags_synth_callbacks.h \ ags/X/machine/ags_syncsynth.h \ ags/X/machine/ags_syncsynth_callbacks.h \ ags/X/machine/ags_synth.h ags/X/machine/ags_synth_input_line.h \ ags/X/machine/ags_synth_input_line_callbacks.h \ ags/X/machine/ags_synth_input_pad.h \ ags/X/machine/ags_spectrometer.h \ ags/X/machine/ags_spectrometer_callbacks.h $(am__append_44) deprecated_libgsequencer_machine_c_sources = libgsequencer_machine_c_sources = \ $(deprecated_libgsequencer_machine_c_sources) \ ags/X/machine/ags_audiorec.c \ ags/X/machine/ags_audiorec_callbacks.c \ ags/X/machine/ags_cell_pattern.c \ ags/X/machine/ags_cell_pattern_callbacks.c \ ags/X/machine/ags_desk_callbacks.c ags/X/machine/ags_desk.c \ ags/X/machine/ags_desk_input_pad_callbacks.c \ ags/X/machine/ags_desk_input_pad.c ags/X/machine/ags_drum.c \ ags/X/machine/ags_drum_callbacks.c \ ags/X/machine/ags_drum_input_line.c \ ags/X/machine/ags_drum_input_line_callbacks.c \ ags/X/machine/ags_drum_input_pad.c \ ags/X/machine/ags_drum_input_pad_callbacks.c \ ags/X/machine/ags_drum_output_line.c \ ags/X/machine/ags_drum_output_line_callbacks.c \ ags/X/machine/ags_drum_output_pad.c \ ags/X/machine/ags_drum_output_pad_callbacks.c \ ags/X/machine/ags_dssi_bridge.c \ ags/X/machine/ags_dssi_bridge_callbacks.c \ ags/X/machine/ags_equalizer10.c \ ags/X/machine/ags_equalizer10_callbacks.c \ ags/X/machine/ags_fm_oscillator_callbacks.c \ ags/X/machine/ags_fm_oscillator.c \ ags/X/machine/ags_fm_syncsynth.c \ ags/X/machine/ags_fm_syncsynth_callbacks.c \ ags/X/machine/ags_fm_synth.c \ ags/X/machine/ags_fm_synth_callbacks.c \ ags/X/machine/ags_fm_synth_input_pad.c \ ags/X/machine/ags_fm_synth_input_line.c \ ags/X/machine/ags_fm_synth_input_line_callbacks.c \ ags/X/machine/ags_ladspa_bridge.c \ ags/X/machine/ags_ladspa_bridge_callbacks.c \ ags/X/machine/ags_live_dssi_bridge.c \ ags/X/machine/ags_live_dssi_bridge_callbacks.c \ ags/X/machine/ags_live_lv2_bridge.c \ ags/X/machine/ags_live_lv2_bridge_callbacks.c \ ags/X/machine/ags_lv2_bridge.c \ ags/X/machine/ags_lv2_bridge_callbacks.c \ ags/X/machine/ags_matrix.c \ ags/X/machine/ags_matrix_callbacks.c \ ags/X/machine/ags_matrix_bridge.c \ ags/X/machine/ags_matrix_bridge_callbacks.c \ ags/X/machine/ags_matrix_bulk_input.c \ ags/X/machine/ags_matrix_bulk_input_callbacks.c \ ags/X/machine/ags_mixer.c ags/X/machine/ags_mixer_callbacks.c \ ags/X/machine/ags_mixer_input_line.c \ ags/X/machine/ags_mixer_input_pad.c \ ags/X/machine/ags_oscillator.c \ ags/X/machine/ags_oscillator_callbacks.c \ ags/X/machine/ags_panel.c ags/X/machine/ags_panel_callbacks.c \ ags/X/machine/ags_panel_input_line.c \ ags/X/machine/ags_panel_input_line_callbacks.c \ ags/X/machine/ags_panel_input_pad.c \ ags/X/machine/ags_pattern_box_callbacks.c \ ags/X/machine/ags_pattern_box.c \ ags/X/machine/ags_pitch_sampler.c \ ags/X/machine/ags_pitch_sampler_callbacks.c \ ags/X/machine/ags_pitch_sampler_file.c \ ags/X/machine/ags_pitch_sampler_file_callbacks.c \ ags/X/machine/ags_syncsynth.c \ ags/X/machine/ags_syncsynth_callbacks.c \ ags/X/machine/ags_synth.c ags/X/machine/ags_synth_callbacks.c \ ags/X/machine/ags_synth_input_line.c \ ags/X/machine/ags_synth_input_line_callbacks.c \ ags/X/machine/ags_synth_input_pad.c \ ags/X/machine/ags_spectrometer.c \ ags/X/machine/ags_spectrometer_callbacks.c $(am__append_45) # libgsequencer - editor deprecated_libgsequencer_editor_h_sources = libgsequencer_editor_h_sources = \ $(deprecated_libgsequencer_editor_h_sources) \ ags/X/editor/ags_automation_edit_callbacks.h \ ags/X/editor/ags_automation_edit_box.h \ ags/X/editor/ags_automation_edit.h \ ags/X/editor/ags_automation_meta_callbacks.h \ ags/X/editor/ags_automation_meta.h \ ags/X/editor/ags_automation_toolbar_callbacks.h \ ags/X/editor/ags_automation_toolbar.h \ ags/X/editor/ags_crop_note_dialog_callbacks.h \ ags/X/editor/ags_crop_note_dialog.h \ ags/X/editor/ags_envelope_dialog_callbacks.h \ ags/X/editor/ags_envelope_dialog.h \ ags/X/editor/ags_envelope_editor_callbacks.h \ ags/X/editor/ags_envelope_editor.h \ ags/X/editor/ags_envelope_info_callbacks.h \ ags/X/editor/ags_envelope_info.h \ ags/X/editor/ags_machine_radio_button.h \ ags/X/editor/ags_machine_radio_button_callbacks.h \ ags/X/editor/ags_machine_selection.h \ ags/X/editor/ags_machine_selector_callbacks.h \ ags/X/editor/ags_machine_selector.h \ ags/X/editor/ags_move_note_dialog_callbacks.h \ ags/X/editor/ags_move_note_dialog.h \ ags/X/editor/ags_notation_edit_callbacks.h \ ags/X/editor/ags_notation_edit.h \ ags/X/editor/ags_notation_meta_callbacks.h \ ags/X/editor/ags_notation_meta.h \ ags/X/editor/ags_notation_toolbar_callbacks.h \ ags/X/editor/ags_notation_toolbar.h \ ags/X/editor/ags_pattern_envelope_callbacks.h \ ags/X/editor/ags_pattern_envelope.h \ ags/X/editor/ags_position_automation_cursor_dialog.h \ ags/X/editor/ags_position_automation_cursor_dialog_callbacks.h \ ags/X/editor/ags_position_notation_cursor_dialog.h \ ags/X/editor/ags_position_notation_cursor_dialog_callbacks.h \ ags/X/editor/ags_position_wave_cursor_dialog.h \ ags/X/editor/ags_position_wave_cursor_dialog_callbacks.h \ ags/X/editor/ags_ramp_acceleration_dialog.h \ ags/X/editor/ags_ramp_acceleration_dialog_callbacks.h \ ags/X/editor/ags_scrolled_automation_edit_box.h \ ags/X/editor/ags_scrolled_wave_edit_box.h \ ags/X/editor/ags_select_acceleration_dialog.h \ ags/X/editor/ags_select_acceleration_dialog_callbacks.h \ ags/X/editor/ags_select_buffer_dialog.h \ ags/X/editor/ags_select_buffer_dialog_callbacks.h \ ags/X/editor/ags_select_note_dialog.h \ ags/X/editor/ags_select_note_dialog_callbacks.h \ ags/X/editor/ags_sheet_edit.h \ ags/X/editor/ags_sheet_edit_callbacks.h \ ags/X/editor/ags_sheet_toolbar.h \ ags/X/editor/ags_sheet_toolbar_callbacks.h \ ags/X/editor/ags_vautomation_edit_box.h \ ags/X/editor/ags_vwave_edit_box.h \ ags/X/editor/ags_wave_edit_callbacks.h \ ags/X/editor/ags_wave_edit.h \ ags/X/editor/ags_wave_edit_box.h \ ags/X/editor/ags_wave_meta_callbacks.h \ ags/X/editor/ags_wave_meta.h \ ags/X/editor/ags_wave_toolbar_callbacks.h \ ags/X/editor/ags_wave_toolbar.h deprecated_libgsequencer_editor_c_sources = libgsequencer_editor_c_sources = \ $(deprecated_libgsequencer_editor_c_sources) \ ags/X/editor/ags_automation_edit.c \ ags/X/editor/ags_automation_edit_box.c \ ags/X/editor/ags_automation_edit_callbacks.c \ ags/X/editor/ags_automation_meta.c \ ags/X/editor/ags_automation_meta_callbacks.c \ ags/X/editor/ags_automation_toolbar.c \ ags/X/editor/ags_automation_toolbar_callbacks.c \ ags/X/editor/ags_crop_note_dialog_callbacks.c \ ags/X/editor/ags_crop_note_dialog.c \ ags/X/editor/ags_envelope_dialog_callbacks.c \ ags/X/editor/ags_envelope_dialog.c \ ags/X/editor/ags_envelope_editor_callbacks.c \ ags/X/editor/ags_envelope_editor.c \ ags/X/editor/ags_envelope_info_callbacks.c \ ags/X/editor/ags_envelope_info.c \ ags/X/editor/ags_machine_radio_button.c \ ags/X/editor/ags_machine_radio_button_callbacks.c \ ags/X/editor/ags_machine_selection.c \ ags/X/editor/ags_machine_selector.c \ ags/X/editor/ags_machine_selector_callbacks.c \ ags/X/editor/ags_move_note_dialog_callbacks.c \ ags/X/editor/ags_move_note_dialog.c \ ags/X/editor/ags_notation_edit.c \ ags/X/editor/ags_notation_edit_callbacks.c \ ags/X/editor/ags_notation_meta.c \ ags/X/editor/ags_notation_meta_callbacks.c \ ags/X/editor/ags_notation_toolbar.c \ ags/X/editor/ags_notation_toolbar_callbacks.c \ ags/X/editor/ags_pattern_envelope_callbacks.c \ ags/X/editor/ags_pattern_envelope.c \ ags/X/editor/ags_position_automation_cursor_dialog.c \ ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c \ ags/X/editor/ags_position_notation_cursor_dialog.c \ ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c \ ags/X/editor/ags_position_wave_cursor_dialog.c \ ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c \ ags/X/editor/ags_ramp_acceleration_dialog.c \ ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c \ ags/X/editor/ags_scrolled_automation_edit_box.c \ ags/X/editor/ags_scrolled_wave_edit_box.c \ ags/X/editor/ags_select_acceleration_dialog.c \ ags/X/editor/ags_select_acceleration_dialog_callbacks.c \ ags/X/editor/ags_select_buffer_dialog.c \ ags/X/editor/ags_select_buffer_dialog_callbacks.c \ ags/X/editor/ags_select_note_dialog.c \ ags/X/editor/ags_select_note_dialog_callbacks.c \ ags/X/editor/ags_sheet_edit.c \ ags/X/editor/ags_sheet_edit_callbacks.c \ ags/X/editor/ags_sheet_toolbar.c \ ags/X/editor/ags_sheet_toolbar_callbacks.c \ ags/X/editor/ags_vautomation_edit_box.c \ ags/X/editor/ags_vwave_edit_box.c \ ags/X/editor/ags_wave_edit.c \ ags/X/editor/ags_wave_edit_box.c \ ags/X/editor/ags_wave_edit_callbacks.c \ ags/X/editor/ags_wave_meta.c \ ags/X/editor/ags_wave_meta_callbacks.c \ ags/X/editor/ags_wave_toolbar.c \ ags/X/editor/ags_wave_toolbar_callbacks.c # libags-vst deprecated_libags_vst_h_sources = libags_vst_h_sources = \ $(deprecated_libags_vst_h_sources) \ ags/vst3-capi/pluginterfaces/vst/ags_vst_types.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_futils.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_fplatform.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_smart_pointer.h \ ags/vst3-capi/util/ags_vst_string_util.h \ ags/vst3-capi/base/source/ags_vst_fbuffer.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.h deprecated_libags_vst_c_sources = libags_vst_c_sources = \ $(deprecated_libags_vst_c_sources) \ ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp \ ags/vst3-capi/util/ags_vst_string_util.cpp \ ags/vst3-capi/base/source/ags_vst_fbuffer.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp # gsequencer all files gsequencerheaders = \ ags/gsequencer_main.h gsequencer_c_sources = \ ags/gsequencer_main.c midi2xml_LDADD = libags_audio.la libags_server.la libags_gui.la \ libags_thread.la libags.la $(am__append_46) midi2xml_SOURCES = ags/midi2xml_main.c all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/unit-tests.mk $(top_srcdir)/functional-tests.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_srcdir)/unit-tests.mk $(top_srcdir)/functional-tests.mk $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): ags/config.h: ags/stamp-h1 @test -f $@ || rm -f ags/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h1 ags/stamp-h1: $(top_srcdir)/ags/config.h.in $(top_builddir)/config.status @rm -f ags/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status ags/config.h $(top_srcdir)/ags/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f ags/stamp-h1 touch $@ ags/ags_config.h: ags/stamp-h2 @test -f $@ || rm -f ags/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h2 ags/stamp-h2: $(top_srcdir)/ags/ags_config.h.in $(top_builddir)/config.status @rm -f ags/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status ags/ags_config.h distclean-hdr: -rm -f ags/config.h ags/stamp-h1 ags/ags_config.h ags/stamp-h2 libags.pc: $(top_builddir)/config.status $(srcdir)/libags.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libags_audio.pc: $(top_builddir)/config.status $(srcdir)/libags_audio.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libags_gui.pc: $(top_builddir)/config.status $(srcdir)/libags_gui.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libgsequencer.pc: $(top_builddir)/config.status $(srcdir)/libgsequencer.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } install-libgsequencerLTLIBRARIES: $(libgsequencer_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(libgsequencer_LTLIBRARIES)'; test -n "$(libgsequencerdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libgsequencerdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libgsequencerdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libgsequencerdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libgsequencerdir)"; \ } uninstall-libgsequencerLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(libgsequencer_LTLIBRARIES)'; test -n "$(libgsequencerdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libgsequencerdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libgsequencerdir)/$$f"; \ done clean-libgsequencerLTLIBRARIES: -test -z "$(libgsequencer_LTLIBRARIES)" || rm -f $(libgsequencer_LTLIBRARIES) @list='$(libgsequencer_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } ags/lib/$(am__dirstamp): @$(MKDIR_P) ags/lib @: > ags/lib/$(am__dirstamp) ags/lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/lib/$(DEPDIR) @: > ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_buffer_util.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_complex.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_conversion.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_endian.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_function.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_log.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_regex.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_solver_matrix.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_solver_vector.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_string_util.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_time.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_turtle.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_turtle_manager.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/lib/libags_la-ags_uuid.lo: ags/lib/$(am__dirstamp) \ ags/lib/$(DEPDIR)/$(am__dirstamp) ags/util/$(am__dirstamp): @$(MKDIR_P) ags/util @: > ags/util/$(am__dirstamp) ags/util/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/util/$(DEPDIR) @: > ags/util/$(DEPDIR)/$(am__dirstamp) ags/util/libags_la-ags_destroy_util.lo: ags/util/$(am__dirstamp) \ ags/util/$(DEPDIR)/$(am__dirstamp) ags/util/libags_la-ags_id_generator.lo: ags/util/$(am__dirstamp) \ ags/util/$(DEPDIR)/$(am__dirstamp) ags/util/libags_la-ags_list_util.lo: ags/util/$(am__dirstamp) \ ags/util/$(DEPDIR)/$(am__dirstamp) ags/util/libags_la-ags_soundcard_helper.lo: ags/util/$(am__dirstamp) \ ags/util/$(DEPDIR)/$(am__dirstamp) ags/object/$(am__dirstamp): @$(MKDIR_P) ags/object @: > ags/object/$(am__dirstamp) ags/object/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/object/$(DEPDIR) @: > ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_applicable.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_application_context.lo: \ ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_config.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_connectable.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_countable.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_cursor.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_globals.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_main_loop.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_marshal.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_mutable.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_plugin.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_portlet.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_priority.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_seekable.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_sequencer.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_soundcard.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_sound_server.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/object/libags_la-ags_tactable.lo: ags/object/$(am__dirstamp) \ ags/object/$(DEPDIR)/$(am__dirstamp) ags/file/$(am__dirstamp): @$(MKDIR_P) ags/file @: > ags/file/$(am__dirstamp) ags/file/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/file/$(DEPDIR) @: > ags/file/$(DEPDIR)/$(am__dirstamp) ags/file/libags_la-ags_file.lo: ags/file/$(am__dirstamp) \ ags/file/$(DEPDIR)/$(am__dirstamp) ags/file/libags_la-ags_file_id_ref.lo: ags/file/$(am__dirstamp) \ ags/file/$(DEPDIR)/$(am__dirstamp) ags/file/libags_la-ags_file_launch.lo: ags/file/$(am__dirstamp) \ ags/file/$(DEPDIR)/$(am__dirstamp) ags/file/libags_la-ags_file_link.lo: ags/file/$(am__dirstamp) \ ags/file/$(DEPDIR)/$(am__dirstamp) ags/file/libags_la-ags_file_lookup.lo: ags/file/$(am__dirstamp) \ ags/file/$(DEPDIR)/$(am__dirstamp) libags.la: $(libags_la_OBJECTS) $(libags_la_DEPENDENCIES) $(EXTRA_libags_la_DEPENDENCIES) $(AM_V_CCLD)$(libags_la_LINK) -rpath $(libdir) $(libags_la_OBJECTS) $(libags_la_LIBADD) $(LIBS) ags/audio/$(am__dirstamp): @$(MKDIR_P) ags/audio @: > ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/$(DEPDIR) @: > ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_acceleration.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_audio.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_audio_application_context.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_audio_buffer_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_audio_signal.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_automation.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_buffer.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_channel.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_char_buffer_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_devout.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_devin.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_diatonic_scale.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_input.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_filter_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_fifoout.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_fm_synth_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_fourier_transform_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_frequency_map.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_frequency_map_manager.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_generic_recall_recycling.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_lfo_synth_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_midi.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_midiin.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_notation.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_note.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_output.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_pattern.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_playback.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_playback_domain.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_port.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_preset.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_audio.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_audio_run.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_audio_signal.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_channel.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_channel_run.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_container.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_dependency.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_factory.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_dssi.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_dssi_run.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_id.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_ladspa.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_ladspa_run.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_lv2.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_lv2_run.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recall_recycling.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recycling.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_recycling_context.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_sound_provider.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_sequencer_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_soundcard_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_synth_generator.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_synth_util.lo: \ ags/audio/$(am__dirstamp) ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_track.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/libags_audio_la-ags_wave.lo: ags/audio/$(am__dirstamp) \ ags/audio/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/$(am__dirstamp): @$(MKDIR_P) ags/audio/thread @: > ags/audio/thread/$(am__dirstamp) ags/audio/thread/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/thread/$(DEPDIR) @: > ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_audio_loop.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_audio_thread.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_channel_thread.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_export_thread.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_sf2_loader.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_sfz_loader.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/thread/libags_audio_la-ags_wave_loader.lo: \ ags/audio/thread/$(am__dirstamp) \ ags/audio/thread/$(DEPDIR)/$(am__dirstamp) ags/audio/file/$(am__dirstamp): @$(MKDIR_P) ags/audio/file @: > ags/audio/file/$(am__dirstamp) ags/audio/file/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/file/$(DEPDIR) @: > ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_audio_container.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_audio_file.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_audio_file_link.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sound_container.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sound_resource.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sndfile.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sfz_file.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sfz_group.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sfz_region.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_sfz_sample.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_ipatch.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_ipatch_sample.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo: \ ags/audio/file/$(am__dirstamp) \ ags/audio/file/$(DEPDIR)/$(am__dirstamp) ags/audio/midi/$(am__dirstamp): @$(MKDIR_P) ags/audio/midi @: > ags/audio/midi/$(am__dirstamp) ags/audio/midi/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/midi/$(DEPDIR) @: > ags/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo: \ ags/audio/midi/$(am__dirstamp) \ ags/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/audio/midi/libags_audio_la-ags_midi_util.lo: \ ags/audio/midi/$(am__dirstamp) \ ags/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/audio/midi/libags_audio_la-ags_midi_builder.lo: \ ags/audio/midi/$(am__dirstamp) \ ags/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/audio/midi/libags_audio_la-ags_midi_file.lo: \ ags/audio/midi/$(am__dirstamp) \ ags/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/audio/midi/libags_audio_la-ags_midi_parser.lo: \ ags/audio/midi/$(am__dirstamp) \ ags/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/$(am__dirstamp): @$(MKDIR_P) ags/audio/osc @: > ags/audio/osc/$(am__dirstamp) ags/audio/osc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/osc/$(DEPDIR) @: > ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_builder.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_client.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_connection.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_message.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_parser.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_response.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_server.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_util.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo: \ ags/audio/osc/$(am__dirstamp) \ ags/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/$(am__dirstamp): @$(MKDIR_P) ags/audio/osc/controller @: > ags/audio/osc/controller/$(am__dirstamp) ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/osc/controller/$(DEPDIR) @: > ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo: \ ags/audio/osc/controller/$(am__dirstamp) \ ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/xmlrpc/$(am__dirstamp): @$(MKDIR_P) ags/audio/osc/xmlrpc @: > ags/audio/osc/xmlrpc/$(am__dirstamp) ags/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/osc/xmlrpc/$(DEPDIR) @: > ags/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp) ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo: \ ags/audio/osc/xmlrpc/$(am__dirstamp) \ ags/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/$(am__dirstamp): @$(MKDIR_P) ags/audio/jack @: > ags/audio/jack/$(am__dirstamp) ags/audio/jack/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/jack/$(DEPDIR) @: > ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/libags_audio_la-ags_jack_client.lo: \ ags/audio/jack/$(am__dirstamp) \ ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/libags_audio_la-ags_jack_midiin.lo: \ ags/audio/jack/$(am__dirstamp) \ ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/libags_audio_la-ags_jack_devout.lo: \ ags/audio/jack/$(am__dirstamp) \ ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/libags_audio_la-ags_jack_devin.lo: \ ags/audio/jack/$(am__dirstamp) \ ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/libags_audio_la-ags_jack_port.lo: \ ags/audio/jack/$(am__dirstamp) \ ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/jack/libags_audio_la-ags_jack_server.lo: \ ags/audio/jack/$(am__dirstamp) \ ags/audio/jack/$(DEPDIR)/$(am__dirstamp) ags/audio/pulse/$(am__dirstamp): @$(MKDIR_P) ags/audio/pulse @: > ags/audio/pulse/$(am__dirstamp) ags/audio/pulse/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/pulse/$(DEPDIR) @: > ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) ags/audio/pulse/libags_audio_la-ags_pulse_client.lo: \ ags/audio/pulse/$(am__dirstamp) \ ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo: \ ags/audio/pulse/$(am__dirstamp) \ ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo: \ ags/audio/pulse/$(am__dirstamp) \ ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) ags/audio/pulse/libags_audio_la-ags_pulse_port.lo: \ ags/audio/pulse/$(am__dirstamp) \ ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) ags/audio/pulse/libags_audio_la-ags_pulse_server.lo: \ ags/audio/pulse/$(am__dirstamp) \ ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/$(am__dirstamp): @$(MKDIR_P) ags/audio/core-audio @: > ags/audio/core-audio/$(am__dirstamp) ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/core-audio/$(DEPDIR) @: > ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo: \ ags/audio/core-audio/$(am__dirstamp) \ ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo: \ ags/audio/core-audio/$(am__dirstamp) \ ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo: \ ags/audio/core-audio/$(am__dirstamp) \ ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo: \ ags/audio/core-audio/$(am__dirstamp) \ ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo: \ ags/audio/core-audio/$(am__dirstamp) \ ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo: \ ags/audio/core-audio/$(am__dirstamp) \ ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) ags/audio/audio-unit/$(am__dirstamp): @$(MKDIR_P) ags/audio/audio-unit @: > ags/audio/audio-unit/$(am__dirstamp) ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/audio-unit/$(DEPDIR) @: > ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo: \ ags/audio/audio-unit/$(am__dirstamp) \ ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo: \ ags/audio/audio-unit/$(am__dirstamp) \ ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo: \ ags/audio/audio-unit/$(am__dirstamp) \ ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo: \ ags/audio/audio-unit/$(am__dirstamp) \ ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo: \ ags/audio/audio-unit/$(am__dirstamp) \ ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) ags/audio/wasapi/$(am__dirstamp): @$(MKDIR_P) ags/audio/wasapi @: > ags/audio/wasapi/$(am__dirstamp) ags/audio/wasapi/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/wasapi/$(DEPDIR) @: > ags/audio/wasapi/$(DEPDIR)/$(am__dirstamp) ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo: \ ags/audio/wasapi/$(am__dirstamp) \ ags/audio/wasapi/$(DEPDIR)/$(am__dirstamp) ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo: \ ags/audio/wasapi/$(am__dirstamp) \ ags/audio/wasapi/$(DEPDIR)/$(am__dirstamp) ags/audio/task/$(am__dirstamp): @$(MKDIR_P) ags/audio/task @: > ags/audio/task/$(am__dirstamp) ags/audio/task/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/task/$(DEPDIR) @: > ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_add_audio.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_add_audio_signal.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_add_effect.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_add_note.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_add_soundcard.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_apply_presets.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_apply_sound_config.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_apply_synth.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_cancel_audio.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_cancel_channel.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_clear_buffer.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_crop_note.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_export_output.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_free_selection.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_link_channel.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_move_note.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_open_file.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_open_single_file.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_open_wave.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_remove_audio.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_remove_note.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_remove_soundcard.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_resize_audio.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_seek_soundcard.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_set_audio_channels.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_set_buffer_size.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_set_device.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_set_format.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_set_samplerate.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_start_audio.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_start_channel.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_start_sequencer.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_start_soundcard.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_stop_sequencer.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_stop_soundcard.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_tic_device.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_apply_bpm.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_apply_tact.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_reset_amplitude.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_reset_note.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_reset_peak.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_set_muted.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo: \ ags/audio/task/$(am__dirstamp) \ ags/audio/task/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/$(am__dirstamp): @$(MKDIR_P) ags/audio/recall @: > ags/audio/recall/$(am__dirstamp) ags/audio/recall/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/audio/recall/$(DEPDIR) @: > ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_analyse_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_buffer_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_copy_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_delay_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_envelope_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_eq10_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_feed_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_feed_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_lfo_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_loop_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_mute_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_mute_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_mute_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_peak_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_peak_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_prepare_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_stream_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_stream_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_volume_channel.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/audio/recall/libags_audio_la-ags_volume_recycling.lo: \ ags/audio/recall/$(am__dirstamp) \ ags/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/plugin/$(am__dirstamp): @$(MKDIR_P) ags/plugin @: > ags/plugin/$(am__dirstamp) ags/plugin/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/plugin/$(DEPDIR) @: > ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_base_plugin.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_dssi_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_dssi_plugin.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_ladspa_conversion.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_ladspa_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_ladspa_plugin.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_conversion.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_plugin.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_preset.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_log_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_event_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_option_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2_worker.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2ui_manager.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) ags/plugin/libags_audio_la-ags_plugin_port.lo: \ ags/plugin/$(am__dirstamp) \ ags/plugin/$(DEPDIR)/$(am__dirstamp) libags_audio.la: $(libags_audio_la_OBJECTS) $(libags_audio_la_DEPENDENCIES) $(EXTRA_libags_audio_la_DEPENDENCIES) $(AM_V_CCLD)$(libags_audio_la_LINK) -rpath $(libdir) $(libags_audio_la_OBJECTS) $(libags_audio_la_LIBADD) $(LIBS) ags/widget/$(am__dirstamp): @$(MKDIR_P) ags/widget @: > ags/widget/$(am__dirstamp) ags/widget/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/widget/$(DEPDIR) @: > ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_cartesian.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_dial.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_expander.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_expander_set.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_hindicator.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_hled_array.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_indicator.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_led.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_led_array.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_level.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_level_box.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_hlevel_box.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_vlevel_box.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_notebook.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_piano.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_scrolled_piano.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_scale.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_scale_box.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_vscale_box.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_hscale_box.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_scrolled_scale_box.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_scrolled_level_box.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_ruler.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_vindicator.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_vled_array.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_widget_marshal.lo: \ ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) ags/widget/libags_gui_la-ags_container.lo: ags/widget/$(am__dirstamp) \ ags/widget/$(DEPDIR)/$(am__dirstamp) libags_gui.la: $(libags_gui_la_OBJECTS) $(libags_gui_la_DEPENDENCIES) $(EXTRA_libags_gui_la_DEPENDENCIES) $(AM_V_CCLD)$(libags_gui_la_LINK) -rpath $(libdir) $(libags_gui_la_OBJECTS) $(libags_gui_la_LIBADD) $(LIBS) ags/server/$(am__dirstamp): @$(MKDIR_P) ags/server @: > ags/server/$(am__dirstamp) ags/server/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/server/$(DEPDIR) @: > ags/server/$(DEPDIR)/$(am__dirstamp) ags/server/libags_server_la-ags_registry.lo: \ ags/server/$(am__dirstamp) \ ags/server/$(DEPDIR)/$(am__dirstamp) ags/server/libags_server_la-ags_server.lo: ags/server/$(am__dirstamp) \ ags/server/$(DEPDIR)/$(am__dirstamp) ags/server/libags_server_la-ags_server_application_context.lo: \ ags/server/$(am__dirstamp) \ ags/server/$(DEPDIR)/$(am__dirstamp) ags/server/libags_server_la-ags_server_status.lo: \ ags/server/$(am__dirstamp) \ ags/server/$(DEPDIR)/$(am__dirstamp) ags/server/libags_server_la-ags_service_provider.lo: \ ags/server/$(am__dirstamp) \ ags/server/$(DEPDIR)/$(am__dirstamp) ags/server/security/$(am__dirstamp): @$(MKDIR_P) ags/server/security @: > ags/server/security/$(am__dirstamp) ags/server/security/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/server/security/$(DEPDIR) @: > ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_auth_security_context.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_authentication.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_authentication_manager.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_business_group.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_business_group_manager.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_certificate.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_certificate_manager.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_password_store.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_password_store_manager.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_security_context.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_xml_authentication.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_xml_business_group.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_xml_certificate.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/security/libags_server_la-ags_xml_password_store.lo: \ ags/server/security/$(am__dirstamp) \ ags/server/security/$(DEPDIR)/$(am__dirstamp) ags/server/controller/$(am__dirstamp): @$(MKDIR_P) ags/server/controller @: > ags/server/controller/$(am__dirstamp) ags/server/controller/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/server/controller/$(DEPDIR) @: > ags/server/controller/$(DEPDIR)/$(am__dirstamp) ags/server/controller/libags_server_la-ags_controller.lo: \ ags/server/controller/$(am__dirstamp) \ ags/server/controller/$(DEPDIR)/$(am__dirstamp) ags/server/controller/libags_server_la-ags_front_controller.lo: \ ags/server/controller/$(am__dirstamp) \ ags/server/controller/$(DEPDIR)/$(am__dirstamp) ags/server/controller/libags_server_la-ags_plugin_controller.lo: \ ags/server/controller/$(am__dirstamp) \ ags/server/controller/$(DEPDIR)/$(am__dirstamp) libags_server.la: $(libags_server_la_OBJECTS) $(libags_server_la_DEPENDENCIES) $(EXTRA_libags_server_la_DEPENDENCIES) $(AM_V_CCLD)$(libags_server_la_LINK) -rpath $(libdir) $(libags_server_la_OBJECTS) $(libags_server_la_LIBADD) $(LIBS) ags/thread/$(am__dirstamp): @$(MKDIR_P) ags/thread @: > ags/thread/$(am__dirstamp) ags/thread/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/thread/$(DEPDIR) @: > ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_concurrency_provider.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_destroy_worker.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_generic_main_loop.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_message_delivery.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_message_envelope.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_message_queue.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_returnable_thread.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_task_completion.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_task.lo: ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_task_launcher.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_thread_application_context.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_thread_pool.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_thread.lo: ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_timestamp.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) ags/thread/libags_thread_la-ags_worker_thread.lo: \ ags/thread/$(am__dirstamp) \ ags/thread/$(DEPDIR)/$(am__dirstamp) libags_thread.la: $(libags_thread_la_OBJECTS) $(libags_thread_la_DEPENDENCIES) $(EXTRA_libags_thread_la_DEPENDENCIES) $(AM_V_CCLD)$(libags_thread_la_LINK) -rpath $(libdir) $(libags_thread_la_OBJECTS) $(libags_thread_la_LIBADD) $(LIBS) ags/vst3-capi/pluginterfaces/base/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/pluginterfaces/base @: > ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/pluginterfaces/base/$(DEPDIR) @: > ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo: \ ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) \ ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/util/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/util @: > ags/vst3-capi/util/$(am__dirstamp) ags/vst3-capi/util/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/util/$(DEPDIR) @: > ags/vst3-capi/util/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo: \ ags/vst3-capi/util/$(am__dirstamp) \ ags/vst3-capi/util/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/base/source/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/base/source @: > ags/vst3-capi/base/source/$(am__dirstamp) ags/vst3-capi/base/source/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/base/source/$(DEPDIR) @: > ags/vst3-capi/base/source/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo: \ ags/vst3-capi/base/source/$(am__dirstamp) \ ags/vst3-capi/base/source/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/public.sdk/source/vst @: > ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR) @: > ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo: \ ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo: \ ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo: \ ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo: \ ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo: \ ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo: \ ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) \ ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) libags_vst.la: $(libags_vst_la_OBJECTS) $(libags_vst_la_DEPENDENCIES) $(EXTRA_libags_vst_la_DEPENDENCIES) $(AM_V_CXXLD)$(libags_vst_la_LINK) $(am_libags_vst_la_rpath) $(libags_vst_la_OBJECTS) $(libags_vst_la_LIBADD) $(LIBS) ags/X/$(am__dirstamp): @$(MKDIR_P) ags/X @: > ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/$(DEPDIR) @: > ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_animation_window.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_automation_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_automation_window.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_automation_window_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_audio_preferences.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_bulk_member.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_connection_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_context_menu.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_dssi_browser.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_bridge.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_bulk.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_line.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_line_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_pad.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_effect_separator.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_export_soundcard.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_export_window.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_export_window_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_generic_preferences.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_ladspa_browser.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_lv2_browser.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_input_collection_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_input_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_input_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_input_listing_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_callbacks.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_member.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_member_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_member_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_link_collection_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_link_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_link_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_listing_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_machine.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_machine_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_machine_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_menu_action_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_menu_bar.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_midi_dialog.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_midi_preferences.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_navigation.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_navigation_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_notation_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_osc_server_preferences.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_output_collection_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_output_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_output_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_output_listing_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_pad.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_pad_callbacks.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_pad_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_performance_preferences.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_playback_window.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_playback_window_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_plugin_browser.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_plugin_preferences.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_preferences.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_property_collection_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_property_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_property_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_property_listing_editor.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_resize_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_sequencer_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_server_preferences.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_sheet_window.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_sheet_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_ui_provider.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_wave_window_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_wave_window.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_wave_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_window.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_soundcard_editor.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_window_callbacks.lo: ags/X/$(am__dirstamp) \ ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/libgsequencer_la-ags_xorg_application_context.lo: \ ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp) ags/X/osc/controller/$(am__dirstamp): @$(MKDIR_P) ags/X/osc/controller @: > ags/X/osc/controller/$(am__dirstamp) ags/X/osc/controller/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/osc/controller/$(DEPDIR) @: > ags/X/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo: \ ags/X/osc/controller/$(am__dirstamp) \ ags/X/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/X/file/$(am__dirstamp): @$(MKDIR_P) ags/X/file @: > ags/X/file/$(am__dirstamp) ags/X/file/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/file/$(DEPDIR) @: > ags/X/file/$(DEPDIR)/$(am__dirstamp) ags/X/file/libgsequencer_la-ags_simple_file.lo: \ ags/X/file/$(am__dirstamp) \ ags/X/file/$(DEPDIR)/$(am__dirstamp) ags/X/task/$(am__dirstamp): @$(MKDIR_P) ags/X/task @: > ags/X/task/$(am__dirstamp) ags/X/task/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/task/$(DEPDIR) @: > ags/X/task/$(DEPDIR)/$(am__dirstamp) ags/X/task/libgsequencer_la-ags_simple_file_read.lo: \ ags/X/task/$(am__dirstamp) \ ags/X/task/$(DEPDIR)/$(am__dirstamp) ags/X/task/libgsequencer_la-ags_simple_file_write.lo: \ ags/X/task/$(am__dirstamp) \ ags/X/task/$(DEPDIR)/$(am__dirstamp) ags/X/import/$(am__dirstamp): @$(MKDIR_P) ags/X/import @: > ags/X/import/$(am__dirstamp) ags/X/import/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/import/$(DEPDIR) @: > ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo: \ ags/X/import/$(am__dirstamp) \ ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo: \ ags/X/import/$(am__dirstamp) \ ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/import/libgsequencer_la-ags_track_collection.lo: \ ags/X/import/$(am__dirstamp) \ ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo: \ ags/X/import/$(am__dirstamp) \ ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo: \ ags/X/import/$(am__dirstamp) \ ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo: \ ags/X/import/$(am__dirstamp) \ ags/X/import/$(DEPDIR)/$(am__dirstamp) ags/X/export/$(am__dirstamp): @$(MKDIR_P) ags/X/export @: > ags/X/export/$(am__dirstamp) ags/X/export/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/export/$(DEPDIR) @: > ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_machine_collection.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo: \ ags/X/export/$(am__dirstamp) \ ags/X/export/$(DEPDIR)/$(am__dirstamp) ags/X/machine/$(am__dirstamp): @$(MKDIR_P) ags/X/machine @: > ags/X/machine/$(am__dirstamp) ags/X/machine/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/machine/$(DEPDIR) @: > ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_audiorec.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_cell_pattern.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_desk.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_input_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_output_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_equalizer10.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_synth.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_matrix.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_mixer.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_oscillator.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_panel.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_panel_input_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_pattern_box.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_syncsynth.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_synth.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_synth_input_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_spectrometer.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo: \ ags/X/machine/$(am__dirstamp) \ ags/X/machine/$(DEPDIR)/$(am__dirstamp) ags/X/editor/$(am__dirstamp): @$(MKDIR_P) ags/X/editor @: > ags/X/editor/$(am__dirstamp) ags/X/editor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/X/editor/$(DEPDIR) @: > ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_edit.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_meta.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_envelope_editor.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_envelope_info.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_machine_selection.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_machine_selector.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_notation_edit.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_notation_meta.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_sheet_edit.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_edit.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_meta.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo: \ ags/X/editor/$(am__dirstamp) \ ags/X/editor/$(DEPDIR)/$(am__dirstamp) libgsequencer.la: $(libgsequencer_la_OBJECTS) $(libgsequencer_la_DEPENDENCIES) $(EXTRA_libgsequencer_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsequencer_la_LINK) -rpath $(libgsequencerdir) $(libgsequencer_la_OBJECTS) $(libgsequencer_la_LIBADD) $(LIBS) ags/test/X/$(am__dirstamp): @$(MKDIR_P) ags/test/X @: > ags/test/X/$(am__dirstamp) ags/test/X/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/X/$(DEPDIR) @: > ags/test/X/$(DEPDIR)/$(am__dirstamp) ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo: \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo: \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) libgsequencer_test.la: $(libgsequencer_test_la_OBJECTS) $(libgsequencer_test_la_DEPENDENCIES) $(EXTRA_libgsequencer_test_la_DEPENDENCIES) $(AM_V_CCLD)$(libgsequencer_test_la_LINK) $(am_libgsequencer_test_la_rpath) $(libgsequencer_test_la_OBJECTS) $(libgsequencer_test_la_LIBADD) $(LIBS) ags/test/audio/$(am__dirstamp): @$(MKDIR_P) ags/test/audio @: > ags/test/audio/$(am__dirstamp) ags/test/audio/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/$(DEPDIR) @: > ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags/test/audio/acceleration_test-ags_acceleration_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_acceleration_test$(EXEEXT): $(ags_acceleration_test_OBJECTS) $(ags_acceleration_test_DEPENDENCIES) $(EXTRA_ags_acceleration_test_DEPENDENCIES) @rm -f ags_acceleration_test$(EXEEXT) $(AM_V_CCLD)$(ags_acceleration_test_LINK) $(ags_acceleration_test_OBJECTS) $(ags_acceleration_test_LDADD) $(LIBS) ags/test/audio/task/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/task @: > ags/test/audio/task/$(am__dirstamp) ags/test/audio/task/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/task/$(DEPDIR) @: > ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_add_audio_signal_test$(EXEEXT): $(ags_add_audio_signal_test_OBJECTS) $(ags_add_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_add_audio_signal_test_DEPENDENCIES) @rm -f ags_add_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_add_audio_signal_test_LINK) $(ags_add_audio_signal_test_OBJECTS) $(ags_add_audio_signal_test_LDADD) $(LIBS) ags/test/audio/task/add_audio_test-ags_add_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_add_audio_test$(EXEEXT): $(ags_add_audio_test_OBJECTS) $(ags_add_audio_test_DEPENDENCIES) $(EXTRA_ags_add_audio_test_DEPENDENCIES) @rm -f ags_add_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_add_audio_test_LINK) $(ags_add_audio_test_OBJECTS) $(ags_add_audio_test_LDADD) $(LIBS) ags/test/audio/task/add_effect_test-ags_add_effect_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_add_effect_test$(EXEEXT): $(ags_add_effect_test_OBJECTS) $(ags_add_effect_test_DEPENDENCIES) $(EXTRA_ags_add_effect_test_DEPENDENCIES) @rm -f ags_add_effect_test$(EXEEXT) $(AM_V_CCLD)$(ags_add_effect_test_LINK) $(ags_add_effect_test_OBJECTS) $(ags_add_effect_test_LDADD) $(LIBS) ags/test/audio/task/add_note_test-ags_add_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_add_note_test$(EXEEXT): $(ags_add_note_test_OBJECTS) $(ags_add_note_test_DEPENDENCIES) $(EXTRA_ags_add_note_test_DEPENDENCIES) @rm -f ags_add_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_add_note_test_LINK) $(ags_add_note_test_OBJECTS) $(ags_add_note_test_LDADD) $(LIBS) ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_add_soundcard_test$(EXEEXT): $(ags_add_soundcard_test_OBJECTS) $(ags_add_soundcard_test_DEPENDENCIES) $(EXTRA_ags_add_soundcard_test_DEPENDENCIES) @rm -f ags_add_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_add_soundcard_test_LINK) $(ags_add_soundcard_test_OBJECTS) $(ags_add_soundcard_test_LDADD) $(LIBS) ags/test/audio/recall/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/recall @: > ags/test/audio/recall/$(am__dirstamp) ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/recall/$(DEPDIR) @: > ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_analyse_audio_signal_test$(EXEEXT): $(ags_analyse_audio_signal_test_OBJECTS) $(ags_analyse_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_analyse_audio_signal_test_DEPENDENCIES) @rm -f ags_analyse_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_analyse_audio_signal_test_LINK) $(ags_analyse_audio_signal_test_OBJECTS) $(ags_analyse_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_analyse_channel_test$(EXEEXT): $(ags_analyse_channel_test_OBJECTS) $(ags_analyse_channel_test_DEPENDENCIES) $(EXTRA_ags_analyse_channel_test_DEPENDENCIES) @rm -f ags_analyse_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_analyse_channel_test_LINK) $(ags_analyse_channel_test_OBJECTS) $(ags_analyse_channel_test_LDADD) $(LIBS) ags/test/object/$(am__dirstamp): @$(MKDIR_P) ags/test/object @: > ags/test/object/$(am__dirstamp) ags/test/object/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/object/$(DEPDIR) @: > ags/test/object/$(DEPDIR)/$(am__dirstamp) ags/test/object/application_context_test-ags_application_context_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) \ ags/test/object/$(DEPDIR)/$(am__dirstamp) ags_application_context_test$(EXEEXT): $(ags_application_context_test_OBJECTS) $(ags_application_context_test_DEPENDENCIES) $(EXTRA_ags_application_context_test_DEPENDENCIES) @rm -f ags_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_application_context_test_LINK) $(ags_application_context_test_OBJECTS) $(ags_application_context_test_LDADD) $(LIBS) ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_apply_bpm_test$(EXEEXT): $(ags_apply_bpm_test_OBJECTS) $(ags_apply_bpm_test_DEPENDENCIES) $(EXTRA_ags_apply_bpm_test_DEPENDENCIES) @rm -f ags_apply_bpm_test$(EXEEXT) $(AM_V_CCLD)$(ags_apply_bpm_test_LINK) $(ags_apply_bpm_test_OBJECTS) $(ags_apply_bpm_test_LDADD) $(LIBS) ags/test/audio/task/apply_presets_test-ags_apply_presets_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_apply_presets_test$(EXEEXT): $(ags_apply_presets_test_OBJECTS) $(ags_apply_presets_test_DEPENDENCIES) $(EXTRA_ags_apply_presets_test_DEPENDENCIES) @rm -f ags_apply_presets_test$(EXEEXT) $(AM_V_CCLD)$(ags_apply_presets_test_LINK) $(ags_apply_presets_test_OBJECTS) $(ags_apply_presets_test_LDADD) $(LIBS) ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_apply_sequencer_length_test$(EXEEXT): $(ags_apply_sequencer_length_test_OBJECTS) $(ags_apply_sequencer_length_test_DEPENDENCIES) $(EXTRA_ags_apply_sequencer_length_test_DEPENDENCIES) @rm -f ags_apply_sequencer_length_test$(EXEEXT) $(AM_V_CCLD)$(ags_apply_sequencer_length_test_LINK) $(ags_apply_sequencer_length_test_OBJECTS) $(ags_apply_sequencer_length_test_LDADD) $(LIBS) ags/test/audio/task/apply_synth_test-ags_apply_synth_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_apply_synth_test$(EXEEXT): $(ags_apply_synth_test_OBJECTS) $(ags_apply_synth_test_DEPENDENCIES) $(EXTRA_ags_apply_synth_test_DEPENDENCIES) @rm -f ags_apply_synth_test$(EXEEXT) $(AM_V_CCLD)$(ags_apply_synth_test_LINK) $(ags_apply_synth_test_OBJECTS) $(ags_apply_synth_test_LDADD) $(LIBS) ags/test/audio/task/apply_tact_test-ags_apply_tact_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_apply_tact_test$(EXEEXT): $(ags_apply_tact_test_OBJECTS) $(ags_apply_tact_test_DEPENDENCIES) $(EXTRA_ags_apply_tact_test_DEPENDENCIES) @rm -f ags_apply_tact_test$(EXEEXT) $(AM_V_CCLD)$(ags_apply_tact_test_LINK) $(ags_apply_tact_test_OBJECTS) $(ags_apply_tact_test_LDADD) $(LIBS) ags/test/audio/audio_application_context_test-ags_audio_application_context_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_audio_application_context_test$(EXEEXT): $(ags_audio_application_context_test_OBJECTS) $(ags_audio_application_context_test_DEPENDENCIES) $(EXTRA_ags_audio_application_context_test_DEPENDENCIES) @rm -f ags_audio_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_audio_application_context_test_LINK) $(ags_audio_application_context_test_OBJECTS) $(ags_audio_application_context_test_LDADD) $(LIBS) ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_audio_buffer_util_test$(EXEEXT): $(ags_audio_buffer_util_test_OBJECTS) $(ags_audio_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_audio_buffer_util_test_DEPENDENCIES) @rm -f ags_audio_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_audio_buffer_util_test_LINK) $(ags_audio_buffer_util_test_OBJECTS) $(ags_audio_buffer_util_test_LDADD) $(LIBS) ags/test/audio/audio_signal_test-ags_audio_signal_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_audio_signal_test$(EXEEXT): $(ags_audio_signal_test_OBJECTS) $(ags_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_audio_signal_test_DEPENDENCIES) @rm -f ags_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_audio_signal_test_LINK) $(ags_audio_signal_test_OBJECTS) $(ags_audio_signal_test_LDADD) $(LIBS) ags/test/audio/audio_test-ags_audio_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_audio_test$(EXEEXT): $(ags_audio_test_OBJECTS) $(ags_audio_test_DEPENDENCIES) $(EXTRA_ags_audio_test_DEPENDENCIES) @rm -f ags_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_audio_test_LINK) $(ags_audio_test_OBJECTS) $(ags_audio_test_LDADD) $(LIBS) ags/test/server/security/$(am__dirstamp): @$(MKDIR_P) ags/test/server/security @: > ags/test/server/security/$(am__dirstamp) ags/test/server/security/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/server/security/$(DEPDIR) @: > ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_authentication_manager_test$(EXEEXT): $(ags_authentication_manager_test_OBJECTS) $(ags_authentication_manager_test_DEPENDENCIES) $(EXTRA_ags_authentication_manager_test_DEPENDENCIES) @rm -f ags_authentication_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_authentication_manager_test_LINK) $(ags_authentication_manager_test_OBJECTS) $(ags_authentication_manager_test_LDADD) $(LIBS) ags/test/audio/automation_test-ags_automation_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_automation_test$(EXEEXT): $(ags_automation_test_OBJECTS) $(ags_automation_test_DEPENDENCIES) $(EXTRA_ags_automation_test_DEPENDENCIES) @rm -f ags_automation_test$(EXEEXT) $(AM_V_CCLD)$(ags_automation_test_LINK) $(ags_automation_test_OBJECTS) $(ags_automation_test_LDADD) $(LIBS) ags/test/plugin/$(am__dirstamp): @$(MKDIR_P) ags/test/plugin @: > ags/test/plugin/$(am__dirstamp) ags/test/plugin/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/plugin/$(DEPDIR) @: > ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags/test/plugin/base_plugin_test-ags_base_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_base_plugin_test$(EXEEXT): $(ags_base_plugin_test_OBJECTS) $(ags_base_plugin_test_DEPENDENCIES) $(EXTRA_ags_base_plugin_test_DEPENDENCIES) @rm -f ags_base_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_base_plugin_test_LINK) $(ags_base_plugin_test_OBJECTS) $(ags_base_plugin_test_LDADD) $(LIBS) ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_buffer_audio_signal_test$(EXEEXT): $(ags_buffer_audio_signal_test_OBJECTS) $(ags_buffer_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_buffer_audio_signal_test_DEPENDENCIES) @rm -f ags_buffer_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_buffer_audio_signal_test_LINK) $(ags_buffer_audio_signal_test_OBJECTS) $(ags_buffer_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_buffer_channel_test$(EXEEXT): $(ags_buffer_channel_test_OBJECTS) $(ags_buffer_channel_test_DEPENDENCIES) $(EXTRA_ags_buffer_channel_test_DEPENDENCIES) @rm -f ags_buffer_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_buffer_channel_test_LINK) $(ags_buffer_channel_test_OBJECTS) $(ags_buffer_channel_test_LDADD) $(LIBS) ags/test/audio/buffer_test-ags_buffer_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_buffer_test$(EXEEXT): $(ags_buffer_test_OBJECTS) $(ags_buffer_test_DEPENDENCIES) $(EXTRA_ags_buffer_test_DEPENDENCIES) @rm -f ags_buffer_test$(EXEEXT) $(AM_V_CCLD)$(ags_buffer_test_LINK) $(ags_buffer_test_OBJECTS) $(ags_buffer_test_LDADD) $(LIBS) ags/test/lib/$(am__dirstamp): @$(MKDIR_P) ags/test/lib @: > ags/test/lib/$(am__dirstamp) ags/test/lib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/lib/$(DEPDIR) @: > ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags/test/lib/buffer_util_test-ags_buffer_util_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_buffer_util_test$(EXEEXT): $(ags_buffer_util_test_OBJECTS) $(ags_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_buffer_util_test_DEPENDENCIES) @rm -f ags_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_buffer_util_test_LINK) $(ags_buffer_util_test_OBJECTS) $(ags_buffer_util_test_LDADD) $(LIBS) ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_business_group_manager_test$(EXEEXT): $(ags_business_group_manager_test_OBJECTS) $(ags_business_group_manager_test_DEPENDENCIES) $(EXTRA_ags_business_group_manager_test_DEPENDENCIES) @rm -f ags_business_group_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_business_group_manager_test_LINK) $(ags_business_group_manager_test_OBJECTS) $(ags_business_group_manager_test_LDADD) $(LIBS) ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_cancel_audio_test$(EXEEXT): $(ags_cancel_audio_test_OBJECTS) $(ags_cancel_audio_test_DEPENDENCIES) $(EXTRA_ags_cancel_audio_test_DEPENDENCIES) @rm -f ags_cancel_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_cancel_audio_test_LINK) $(ags_cancel_audio_test_OBJECTS) $(ags_cancel_audio_test_LDADD) $(LIBS) ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_cancel_channel_test$(EXEEXT): $(ags_cancel_channel_test_OBJECTS) $(ags_cancel_channel_test_DEPENDENCIES) $(EXTRA_ags_cancel_channel_test_DEPENDENCIES) @rm -f ags_cancel_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_cancel_channel_test_LINK) $(ags_cancel_channel_test_OBJECTS) $(ags_cancel_channel_test_LDADD) $(LIBS) ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_capture_wave_audio_test$(EXEEXT): $(ags_capture_wave_audio_test_OBJECTS) $(ags_capture_wave_audio_test_DEPENDENCIES) $(EXTRA_ags_capture_wave_audio_test_DEPENDENCIES) @rm -f ags_capture_wave_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_capture_wave_audio_test_LINK) $(ags_capture_wave_audio_test_OBJECTS) $(ags_capture_wave_audio_test_LDADD) $(LIBS) ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_capture_wave_channel_test$(EXEEXT): $(ags_capture_wave_channel_test_OBJECTS) $(ags_capture_wave_channel_test_DEPENDENCIES) $(EXTRA_ags_capture_wave_channel_test_DEPENDENCIES) @rm -f ags_capture_wave_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_capture_wave_channel_test_LINK) $(ags_capture_wave_channel_test_OBJECTS) $(ags_capture_wave_channel_test_LDADD) $(LIBS) ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_certificate_manager_test$(EXEEXT): $(ags_certificate_manager_test_OBJECTS) $(ags_certificate_manager_test_DEPENDENCIES) $(EXTRA_ags_certificate_manager_test_DEPENDENCIES) @rm -f ags_certificate_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_certificate_manager_test_LINK) $(ags_certificate_manager_test_OBJECTS) $(ags_certificate_manager_test_LDADD) $(LIBS) ags/test/audio/channel_test-ags_channel_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_channel_test$(EXEEXT): $(ags_channel_test_OBJECTS) $(ags_channel_test_DEPENDENCIES) $(EXTRA_ags_channel_test_DEPENDENCIES) @rm -f ags_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_channel_test_LINK) $(ags_channel_test_OBJECTS) $(ags_channel_test_LDADD) $(LIBS) ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_char_buffer_util_test$(EXEEXT): $(ags_char_buffer_util_test_OBJECTS) $(ags_char_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_char_buffer_util_test_DEPENDENCIES) @rm -f ags_char_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_char_buffer_util_test_LINK) $(ags_char_buffer_util_test_OBJECTS) $(ags_char_buffer_util_test_LDADD) $(LIBS) ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_clear_audio_signal_test$(EXEEXT): $(ags_clear_audio_signal_test_OBJECTS) $(ags_clear_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_clear_audio_signal_test_DEPENDENCIES) @rm -f ags_clear_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_clear_audio_signal_test_LINK) $(ags_clear_audio_signal_test_OBJECTS) $(ags_clear_audio_signal_test_LDADD) $(LIBS) ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_clear_buffer_test$(EXEEXT): $(ags_clear_buffer_test_OBJECTS) $(ags_clear_buffer_test_DEPENDENCIES) $(EXTRA_ags_clear_buffer_test_DEPENDENCIES) @rm -f ags_clear_buffer_test$(EXEEXT) $(AM_V_CCLD)$(ags_clear_buffer_test_LINK) $(ags_clear_buffer_test_OBJECTS) $(ags_clear_buffer_test_LDADD) $(LIBS) ags/test/lib/complex_test-ags_complex_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_complex_test$(EXEEXT): $(ags_complex_test_OBJECTS) $(ags_complex_test_DEPENDENCIES) $(EXTRA_ags_complex_test_DEPENDENCIES) @rm -f ags_complex_test$(EXEEXT) $(AM_V_CCLD)$(ags_complex_test_LINK) $(ags_complex_test_OBJECTS) $(ags_complex_test_LDADD) $(LIBS) ags/test/object/config_test-ags_config_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) \ ags/test/object/$(DEPDIR)/$(am__dirstamp) ags_config_test$(EXEEXT): $(ags_config_test_OBJECTS) $(ags_config_test_DEPENDENCIES) $(EXTRA_ags_config_test_DEPENDENCIES) @rm -f ags_config_test$(EXEEXT) $(AM_V_CCLD)$(ags_config_test_LINK) $(ags_config_test_OBJECTS) $(ags_config_test_LDADD) $(LIBS) ags/test/object/connectable_test-ags_connectable_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) \ ags/test/object/$(DEPDIR)/$(am__dirstamp) ags_connectable_test$(EXEEXT): $(ags_connectable_test_OBJECTS) $(ags_connectable_test_DEPENDENCIES) $(EXTRA_ags_connectable_test_DEPENDENCIES) @rm -f ags_connectable_test$(EXEEXT) $(AM_V_CCLD)$(ags_connectable_test_LINK) $(ags_connectable_test_OBJECTS) $(ags_connectable_test_LDADD) $(LIBS) ags/test/server/controller/$(am__dirstamp): @$(MKDIR_P) ags/test/server/controller @: > ags/test/server/controller/$(am__dirstamp) ags/test/server/controller/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/server/controller/$(DEPDIR) @: > ags/test/server/controller/$(DEPDIR)/$(am__dirstamp) ags/test/server/controller/controller_test-ags_controller_test.$(OBJEXT): \ ags/test/server/controller/$(am__dirstamp) \ ags/test/server/controller/$(DEPDIR)/$(am__dirstamp) ags_controller_test$(EXEEXT): $(ags_controller_test_OBJECTS) $(ags_controller_test_DEPENDENCIES) $(EXTRA_ags_controller_test_DEPENDENCIES) @rm -f ags_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_controller_test_LINK) $(ags_controller_test_OBJECTS) $(ags_controller_test_LDADD) $(LIBS) ags/test/lib/conversion_test-ags_conversion_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_conversion_test$(EXEEXT): $(ags_conversion_test_OBJECTS) $(ags_conversion_test_DEPENDENCIES) $(EXTRA_ags_conversion_test_DEPENDENCIES) @rm -f ags_conversion_test$(EXEEXT) $(AM_V_CCLD)$(ags_conversion_test_LINK) $(ags_conversion_test_OBJECTS) $(ags_conversion_test_LDADD) $(LIBS) ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_copy_audio_signal_test$(EXEEXT): $(ags_copy_audio_signal_test_OBJECTS) $(ags_copy_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_copy_audio_signal_test_DEPENDENCIES) @rm -f ags_copy_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_copy_audio_signal_test_LINK) $(ags_copy_audio_signal_test_OBJECTS) $(ags_copy_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_copy_channel_test$(EXEEXT): $(ags_copy_channel_test_OBJECTS) $(ags_copy_channel_test_DEPENDENCIES) $(EXTRA_ags_copy_channel_test_DEPENDENCIES) @rm -f ags_copy_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_copy_channel_test_LINK) $(ags_copy_channel_test_OBJECTS) $(ags_copy_channel_test_LDADD) $(LIBS) ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_copy_pattern_audio_test$(EXEEXT): $(ags_copy_pattern_audio_test_OBJECTS) $(ags_copy_pattern_audio_test_DEPENDENCIES) $(EXTRA_ags_copy_pattern_audio_test_DEPENDENCIES) @rm -f ags_copy_pattern_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_copy_pattern_audio_test_LINK) $(ags_copy_pattern_audio_test_OBJECTS) $(ags_copy_pattern_audio_test_LDADD) $(LIBS) ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_copy_pattern_channel_test$(EXEEXT): $(ags_copy_pattern_channel_test_OBJECTS) $(ags_copy_pattern_channel_test_DEPENDENCIES) $(EXTRA_ags_copy_pattern_channel_test_DEPENDENCIES) @rm -f ags_copy_pattern_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_copy_pattern_channel_test_LINK) $(ags_copy_pattern_channel_test_OBJECTS) $(ags_copy_pattern_channel_test_LDADD) $(LIBS) ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_count_beats_audio_test$(EXEEXT): $(ags_count_beats_audio_test_OBJECTS) $(ags_count_beats_audio_test_DEPENDENCIES) $(EXTRA_ags_count_beats_audio_test_DEPENDENCIES) @rm -f ags_count_beats_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_count_beats_audio_test_LINK) $(ags_count_beats_audio_test_OBJECTS) $(ags_count_beats_audio_test_LDADD) $(LIBS) ags/test/audio/task/crop_note_test-ags_crop_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_crop_note_test$(EXEEXT): $(ags_crop_note_test_OBJECTS) $(ags_crop_note_test_DEPENDENCIES) $(EXTRA_ags_crop_note_test_DEPENDENCIES) @rm -f ags_crop_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_crop_note_test_LINK) $(ags_crop_note_test_OBJECTS) $(ags_crop_note_test_LDADD) $(LIBS) ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_delay_audio_test$(EXEEXT): $(ags_delay_audio_test_OBJECTS) $(ags_delay_audio_test_DEPENDENCIES) $(EXTRA_ags_delay_audio_test_DEPENDENCIES) @rm -f ags_delay_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_delay_audio_test_LINK) $(ags_delay_audio_test_OBJECTS) $(ags_delay_audio_test_LDADD) $(LIBS) ags/test/thread/$(am__dirstamp): @$(MKDIR_P) ags/test/thread @: > ags/test/thread/$(am__dirstamp) ags/test/thread/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/thread/$(DEPDIR) @: > ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags/test/thread/destroy_worker_test-ags_destroy_worker_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) \ ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags_destroy_worker_test$(EXEEXT): $(ags_destroy_worker_test_OBJECTS) $(ags_destroy_worker_test_DEPENDENCIES) $(EXTRA_ags_destroy_worker_test_DEPENDENCIES) @rm -f ags_destroy_worker_test$(EXEEXT) $(AM_V_CCLD)$(ags_destroy_worker_test_LINK) $(ags_destroy_worker_test_OBJECTS) $(ags_destroy_worker_test_LDADD) $(LIBS) ags/test/audio/devin_test-ags_devin_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_devin_test$(EXEEXT): $(ags_devin_test_OBJECTS) $(ags_devin_test_DEPENDENCIES) $(EXTRA_ags_devin_test_DEPENDENCIES) @rm -f ags_devin_test$(EXEEXT) $(AM_V_CCLD)$(ags_devin_test_LINK) $(ags_devin_test_OBJECTS) $(ags_devin_test_LDADD) $(LIBS) ags/test/audio/devout_test-ags_devout_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_devout_test$(EXEEXT): $(ags_devout_test_OBJECTS) $(ags_devout_test_DEPENDENCIES) $(EXTRA_ags_devout_test_DEPENDENCIES) @rm -f ags_devout_test$(EXEEXT) $(AM_V_CCLD)$(ags_devout_test_LINK) $(ags_devout_test_OBJECTS) $(ags_devout_test_LDADD) $(LIBS) ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_dssi_manager_test$(EXEEXT): $(ags_dssi_manager_test_OBJECTS) $(ags_dssi_manager_test_DEPENDENCIES) $(EXTRA_ags_dssi_manager_test_DEPENDENCIES) @rm -f ags_dssi_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_dssi_manager_test_LINK) $(ags_dssi_manager_test_OBJECTS) $(ags_dssi_manager_test_LDADD) $(LIBS) ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_dssi_plugin_test$(EXEEXT): $(ags_dssi_plugin_test_OBJECTS) $(ags_dssi_plugin_test_DEPENDENCIES) $(EXTRA_ags_dssi_plugin_test_DEPENDENCIES) @rm -f ags_dssi_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_dssi_plugin_test_LINK) $(ags_dssi_plugin_test_OBJECTS) $(ags_dssi_plugin_test_LDADD) $(LIBS) ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_envelope_audio_signal_test$(EXEEXT): $(ags_envelope_audio_signal_test_OBJECTS) $(ags_envelope_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_envelope_audio_signal_test_DEPENDENCIES) @rm -f ags_envelope_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_envelope_audio_signal_test_LINK) $(ags_envelope_audio_signal_test_OBJECTS) $(ags_envelope_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_envelope_channel_test$(EXEEXT): $(ags_envelope_channel_test_OBJECTS) $(ags_envelope_channel_test_DEPENDENCIES) $(EXTRA_ags_envelope_channel_test_DEPENDENCIES) @rm -f ags_envelope_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_envelope_channel_test_LINK) $(ags_envelope_channel_test_OBJECTS) $(ags_envelope_channel_test_LDADD) $(LIBS) ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_eq10_audio_signal_test$(EXEEXT): $(ags_eq10_audio_signal_test_OBJECTS) $(ags_eq10_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_eq10_audio_signal_test_DEPENDENCIES) @rm -f ags_eq10_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_eq10_audio_signal_test_LINK) $(ags_eq10_audio_signal_test_OBJECTS) $(ags_eq10_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_eq10_channel_test$(EXEEXT): $(ags_eq10_channel_test_OBJECTS) $(ags_eq10_channel_test_DEPENDENCIES) $(EXTRA_ags_eq10_channel_test_DEPENDENCIES) @rm -f ags_eq10_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_eq10_channel_test_LINK) $(ags_eq10_channel_test_OBJECTS) $(ags_eq10_channel_test_LDADD) $(LIBS) ags/test/audio/task/export_output_test-ags_export_output_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_export_output_test$(EXEEXT): $(ags_export_output_test_OBJECTS) $(ags_export_output_test_DEPENDENCIES) $(EXTRA_ags_export_output_test_DEPENDENCIES) @rm -f ags_export_output_test$(EXEEXT) $(AM_V_CCLD)$(ags_export_output_test_LINK) $(ags_export_output_test_OBJECTS) $(ags_export_output_test_LDADD) $(LIBS) ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_feed_audio_signal_test$(EXEEXT): $(ags_feed_audio_signal_test_OBJECTS) $(ags_feed_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_feed_audio_signal_test_DEPENDENCIES) @rm -f ags_feed_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_feed_audio_signal_test_LINK) $(ags_feed_audio_signal_test_OBJECTS) $(ags_feed_audio_signal_test_LDADD) $(LIBS) ags/test/audio/fifoout_test-ags_fifoout_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_fifoout_test$(EXEEXT): $(ags_fifoout_test_OBJECTS) $(ags_fifoout_test_DEPENDENCIES) $(EXTRA_ags_fifoout_test_DEPENDENCIES) @rm -f ags_fifoout_test$(EXEEXT) $(AM_V_CCLD)$(ags_fifoout_test_LINK) $(ags_fifoout_test_OBJECTS) $(ags_fifoout_test_LDADD) $(LIBS) ags/test/file/$(am__dirstamp): @$(MKDIR_P) ags/test/file @: > ags/test/file/$(am__dirstamp) ags/test/file/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/file/$(DEPDIR) @: > ags/test/file/$(DEPDIR)/$(am__dirstamp) ags/test/file/file_id_ref_test-ags_file_id_ref_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) \ ags/test/file/$(DEPDIR)/$(am__dirstamp) ags_file_id_ref_test$(EXEEXT): $(ags_file_id_ref_test_OBJECTS) $(ags_file_id_ref_test_DEPENDENCIES) $(EXTRA_ags_file_id_ref_test_DEPENDENCIES) @rm -f ags_file_id_ref_test$(EXEEXT) $(AM_V_CCLD)$(ags_file_id_ref_test_LINK) $(ags_file_id_ref_test_OBJECTS) $(ags_file_id_ref_test_LDADD) $(LIBS) ags/test/file/file_launch_test-ags_file_launch_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) \ ags/test/file/$(DEPDIR)/$(am__dirstamp) ags_file_launch_test$(EXEEXT): $(ags_file_launch_test_OBJECTS) $(ags_file_launch_test_DEPENDENCIES) $(EXTRA_ags_file_launch_test_DEPENDENCIES) @rm -f ags_file_launch_test$(EXEEXT) $(AM_V_CCLD)$(ags_file_launch_test_LINK) $(ags_file_launch_test_OBJECTS) $(ags_file_launch_test_LDADD) $(LIBS) ags/test/file/file_lookup_test-ags_file_lookup_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) \ ags/test/file/$(DEPDIR)/$(am__dirstamp) ags_file_lookup_test$(EXEEXT): $(ags_file_lookup_test_OBJECTS) $(ags_file_lookup_test_DEPENDENCIES) $(EXTRA_ags_file_lookup_test_DEPENDENCIES) @rm -f ags_file_lookup_test$(EXEEXT) $(AM_V_CCLD)$(ags_file_lookup_test_LINK) $(ags_file_lookup_test_OBJECTS) $(ags_file_lookup_test_LDADD) $(LIBS) ags/test/file/file_test-ags_file_test.$(OBJEXT): \ ags/test/file/$(am__dirstamp) \ ags/test/file/$(DEPDIR)/$(am__dirstamp) ags_file_test$(EXEEXT): $(ags_file_test_OBJECTS) $(ags_file_test_DEPENDENCIES) $(EXTRA_ags_file_test_DEPENDENCIES) @rm -f ags_file_test$(EXEEXT) $(AM_V_CCLD)$(ags_file_test_LINK) $(ags_file_test_OBJECTS) $(ags_file_test_LDADD) $(LIBS) ags/test/audio/filter_util_test-ags_filter_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_filter_util_test$(EXEEXT): $(ags_filter_util_test_OBJECTS) $(ags_filter_util_test_DEPENDENCIES) $(EXTRA_ags_filter_util_test_DEPENDENCIES) @rm -f ags_filter_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_filter_util_test_LINK) $(ags_filter_util_test_OBJECTS) $(ags_filter_util_test_LDADD) $(LIBS) ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_fm_synth_util_test$(EXEEXT): $(ags_fm_synth_util_test_OBJECTS) $(ags_fm_synth_util_test_DEPENDENCIES) $(EXTRA_ags_fm_synth_util_test_DEPENDENCIES) @rm -f ags_fm_synth_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_fm_synth_util_test_LINK) $(ags_fm_synth_util_test_OBJECTS) $(ags_fm_synth_util_test_LDADD) $(LIBS) ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_fourier_transform_util_test$(EXEEXT): $(ags_fourier_transform_util_test_OBJECTS) $(ags_fourier_transform_util_test_DEPENDENCIES) $(EXTRA_ags_fourier_transform_util_test_DEPENDENCIES) @rm -f ags_fourier_transform_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_fourier_transform_util_test_LINK) $(ags_fourier_transform_util_test_OBJECTS) $(ags_fourier_transform_util_test_LDADD) $(LIBS) ags/test/audio/task/free_selection_test-ags_free_selection_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_free_selection_test$(EXEEXT): $(ags_free_selection_test_OBJECTS) $(ags_free_selection_test_DEPENDENCIES) $(EXTRA_ags_free_selection_test_DEPENDENCIES) @rm -f ags_free_selection_test$(EXEEXT) $(AM_V_CCLD)$(ags_free_selection_test_LINK) $(ags_free_selection_test_OBJECTS) $(ags_free_selection_test_LDADD) $(LIBS) ags/test/server/controller/front_controller_test-ags_front_controller_test.$(OBJEXT): \ ags/test/server/controller/$(am__dirstamp) \ ags/test/server/controller/$(DEPDIR)/$(am__dirstamp) ags_front_controller_test$(EXEEXT): $(ags_front_controller_test_OBJECTS) $(ags_front_controller_test_DEPENDENCIES) $(EXTRA_ags_front_controller_test_DEPENDENCIES) @rm -f ags_front_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_front_controller_test_LINK) $(ags_front_controller_test_OBJECTS) $(ags_front_controller_test_LDADD) $(LIBS) ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_audio_config_test$(EXEEXT): $(ags_functional_audio_config_test_OBJECTS) $(ags_functional_audio_config_test_DEPENDENCIES) $(EXTRA_ags_functional_audio_config_test_DEPENDENCIES) @rm -f ags_functional_audio_config_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_audio_config_test_LINK) $(ags_functional_audio_config_test_OBJECTS) $(ags_functional_audio_config_test_LDADD) $(LIBS) ags/test/audio/functional_audio_test-ags_functional_audio_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_functional_audio_test$(EXEEXT): $(ags_functional_audio_test_OBJECTS) $(ags_functional_audio_test_DEPENDENCIES) $(EXTRA_ags_functional_audio_test_DEPENDENCIES) @rm -f ags_functional_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_audio_test_LINK) $(ags_functional_audio_test_OBJECTS) $(ags_functional_audio_test_LDADD) $(LIBS) ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_automation_editor_workflow_test$(EXEEXT): $(ags_functional_automation_editor_workflow_test_OBJECTS) $(ags_functional_automation_editor_workflow_test_DEPENDENCIES) $(EXTRA_ags_functional_automation_editor_workflow_test_DEPENDENCIES) @rm -f ags_functional_automation_editor_workflow_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_automation_editor_workflow_test_LINK) $(ags_functional_automation_editor_workflow_test_OBJECTS) $(ags_functional_automation_editor_workflow_test_LDADD) $(LIBS) ags/test/X/machine/$(am__dirstamp): @$(MKDIR_P) ags/test/X/machine @: > ags/test/X/machine/$(am__dirstamp) ags/test/X/machine/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/X/machine/$(DEPDIR) @: > ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags/test/X/machine/functional_drum_test-ags_functional_drum_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) \ ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags_functional_drum_test$(EXEEXT): $(ags_functional_drum_test_OBJECTS) $(ags_functional_drum_test_DEPENDENCIES) $(EXTRA_ags_functional_drum_test_DEPENDENCIES) @rm -f ags_functional_drum_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_drum_test_LINK) $(ags_functional_drum_test_OBJECTS) $(ags_functional_drum_test_LDADD) $(LIBS) ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) \ ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags_functional_ffplayer_test$(EXEEXT): $(ags_functional_ffplayer_test_OBJECTS) $(ags_functional_ffplayer_test_DEPENDENCIES) $(EXTRA_ags_functional_ffplayer_test_DEPENDENCIES) @rm -f ags_functional_ffplayer_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_ffplayer_test_LINK) $(ags_functional_ffplayer_test_OBJECTS) $(ags_functional_ffplayer_test_LDADD) $(LIBS) ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_functional_fourier_transform_test$(EXEEXT): $(ags_functional_fourier_transform_test_OBJECTS) $(ags_functional_fourier_transform_test_DEPENDENCIES) $(EXTRA_ags_functional_fourier_transform_test_DEPENDENCIES) @rm -f ags_functional_fourier_transform_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_fourier_transform_test_LINK) $(ags_functional_fourier_transform_test_OBJECTS) $(ags_functional_fourier_transform_test_LDADD) $(LIBS) ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_line_member_add_and_destroy_test$(EXEEXT): $(ags_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_functional_line_member_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_functional_line_member_add_and_destroy_test_DEPENDENCIES) @rm -f ags_functional_line_member_add_and_destroy_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_line_member_add_and_destroy_test_LINK) $(ags_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_functional_line_member_add_and_destroy_test_LDADD) $(LIBS) ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_machine_add_and_destroy_test$(EXEEXT): $(ags_functional_machine_add_and_destroy_test_OBJECTS) $(ags_functional_machine_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_functional_machine_add_and_destroy_test_DEPENDENCIES) @rm -f ags_functional_machine_add_and_destroy_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_machine_add_and_destroy_test_LINK) $(ags_functional_machine_add_and_destroy_test_OBJECTS) $(ags_functional_machine_add_and_destroy_test_LDADD) $(LIBS) ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_machine_link_test$(EXEEXT): $(ags_functional_machine_link_test_OBJECTS) $(ags_functional_machine_link_test_DEPENDENCIES) $(EXTRA_ags_functional_machine_link_test_DEPENDENCIES) @rm -f ags_functional_machine_link_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_machine_link_test_LINK) $(ags_functional_machine_link_test_OBJECTS) $(ags_functional_machine_link_test_LDADD) $(LIBS) ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) \ ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags_functional_matrix_test$(EXEEXT): $(ags_functional_matrix_test_OBJECTS) $(ags_functional_matrix_test_DEPENDENCIES) $(EXTRA_ags_functional_matrix_test_DEPENDENCIES) @rm -f ags_functional_matrix_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_matrix_test_LINK) $(ags_functional_matrix_test_OBJECTS) $(ags_functional_matrix_test_LDADD) $(LIBS) ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) \ ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags_functional_mixer_test$(EXEEXT): $(ags_functional_mixer_test_OBJECTS) $(ags_functional_mixer_test_DEPENDENCIES) $(EXTRA_ags_functional_mixer_test_DEPENDENCIES) @rm -f ags_functional_mixer_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_mixer_test_LINK) $(ags_functional_mixer_test_OBJECTS) $(ags_functional_mixer_test_LDADD) $(LIBS) ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_notation_edit_test$(EXEEXT): $(ags_functional_notation_edit_test_OBJECTS) $(ags_functional_notation_edit_test_DEPENDENCIES) $(EXTRA_ags_functional_notation_edit_test_DEPENDENCIES) @rm -f ags_functional_notation_edit_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_notation_edit_test_LINK) $(ags_functional_notation_edit_test_OBJECTS) $(ags_functional_notation_edit_test_LDADD) $(LIBS) ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_functional_notation_editor_workflow_test$(EXEEXT): $(ags_functional_notation_editor_workflow_test_OBJECTS) $(ags_functional_notation_editor_workflow_test_DEPENDENCIES) $(EXTRA_ags_functional_notation_editor_workflow_test_DEPENDENCIES) @rm -f ags_functional_notation_editor_workflow_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_notation_editor_workflow_test_LINK) $(ags_functional_notation_editor_workflow_test_OBJECTS) $(ags_functional_notation_editor_workflow_test_LDADD) $(LIBS) ags/test/audio/osc/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc @: > ags/test/audio/osc/$(am__dirstamp) ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/$(DEPDIR) @: > ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_functional_osc_server_test$(EXEEXT): $(ags_functional_osc_server_test_OBJECTS) $(ags_functional_osc_server_test_DEPENDENCIES) $(EXTRA_ags_functional_osc_server_test_DEPENDENCIES) @rm -f ags_functional_osc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_osc_server_test_LINK) $(ags_functional_osc_server_test_OBJECTS) $(ags_functional_osc_server_test_LDADD) $(LIBS) ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_functional_osc_xmlrpc_server_test$(EXEEXT): $(ags_functional_osc_xmlrpc_server_test_OBJECTS) $(ags_functional_osc_xmlrpc_server_test_DEPENDENCIES) $(EXTRA_ags_functional_osc_xmlrpc_server_test_DEPENDENCIES) @rm -f ags_functional_osc_xmlrpc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_osc_xmlrpc_server_test_LINK) $(ags_functional_osc_xmlrpc_server_test_OBJECTS) $(ags_functional_osc_xmlrpc_server_test_LDADD) $(LIBS) ags/test/X/machine/functional_panel_test-ags_functional_panel_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) \ ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags_functional_panel_test$(EXEEXT): $(ags_functional_panel_test_OBJECTS) $(ags_functional_panel_test_DEPENDENCIES) $(EXTRA_ags_functional_panel_test_DEPENDENCIES) @rm -f ags_functional_panel_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_panel_test_LINK) $(ags_functional_panel_test_OBJECTS) $(ags_functional_panel_test_LDADD) $(LIBS) ags/test/audio/functional_pitch_test-ags_functional_pitch_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_functional_pitch_test$(EXEEXT): $(ags_functional_pitch_test_OBJECTS) $(ags_functional_pitch_test_DEPENDENCIES) $(EXTRA_ags_functional_pitch_test_DEPENDENCIES) @rm -f ags_functional_pitch_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_pitch_test_LINK) $(ags_functional_pitch_test_OBJECTS) $(ags_functional_pitch_test_LDADD) $(LIBS) ags/test/server/$(am__dirstamp): @$(MKDIR_P) ags/test/server @: > ags/test/server/$(am__dirstamp) ags/test/server/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/server/$(DEPDIR) @: > ags/test/server/$(DEPDIR)/$(am__dirstamp) ags/test/server/functional_server_test-ags_functional_server_test.$(OBJEXT): \ ags/test/server/$(am__dirstamp) \ ags/test/server/$(DEPDIR)/$(am__dirstamp) ags_functional_server_test$(EXEEXT): $(ags_functional_server_test_OBJECTS) $(ags_functional_server_test_DEPENDENCIES) $(EXTRA_ags_functional_server_test_DEPENDENCIES) @rm -f ags_functional_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_server_test_LINK) $(ags_functional_server_test_OBJECTS) $(ags_functional_server_test_LDADD) $(LIBS) ags/test/X/machine/functional_synth_test-ags_functional_synth_test.$(OBJEXT): \ ags/test/X/machine/$(am__dirstamp) \ ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) ags_functional_synth_test$(EXEEXT): $(ags_functional_synth_test_OBJECTS) $(ags_functional_synth_test_DEPENDENCIES) $(EXTRA_ags_functional_synth_test_DEPENDENCIES) @rm -f ags_functional_synth_test$(EXEEXT) $(AM_V_CCLD)$(ags_functional_synth_test_LINK) $(ags_functional_synth_test_OBJECTS) $(ags_functional_synth_test_LDADD) $(LIBS) ags/test/audio/input_test-ags_input_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_input_test$(EXEEXT): $(ags_input_test_OBJECTS) $(ags_input_test_DEPENDENCIES) $(EXTRA_ags_input_test_DEPENDENCIES) @rm -f ags_input_test$(EXEEXT) $(AM_V_CCLD)$(ags_input_test_LINK) $(ags_input_test_OBJECTS) $(ags_input_test_LDADD) $(LIBS) ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_ladspa_conversion_test$(EXEEXT): $(ags_ladspa_conversion_test_OBJECTS) $(ags_ladspa_conversion_test_DEPENDENCIES) $(EXTRA_ags_ladspa_conversion_test_DEPENDENCIES) @rm -f ags_ladspa_conversion_test$(EXEEXT) $(AM_V_CCLD)$(ags_ladspa_conversion_test_LINK) $(ags_ladspa_conversion_test_OBJECTS) $(ags_ladspa_conversion_test_LDADD) $(LIBS) ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_ladspa_manager_test$(EXEEXT): $(ags_ladspa_manager_test_OBJECTS) $(ags_ladspa_manager_test_DEPENDENCIES) $(EXTRA_ags_ladspa_manager_test_DEPENDENCIES) @rm -f ags_ladspa_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_ladspa_manager_test_LINK) $(ags_ladspa_manager_test_OBJECTS) $(ags_ladspa_manager_test_LDADD) $(LIBS) ags/test/audio/task/link_channel_test-ags_link_channel_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_link_channel_test$(EXEEXT): $(ags_link_channel_test_OBJECTS) $(ags_link_channel_test_DEPENDENCIES) $(EXTRA_ags_link_channel_test_DEPENDENCIES) @rm -f ags_link_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_link_channel_test_LINK) $(ags_link_channel_test_OBJECTS) $(ags_link_channel_test_LDADD) $(LIBS) ags/test/lib/log_test-ags_log_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_log_test$(EXEEXT): $(ags_log_test_OBJECTS) $(ags_log_test_DEPENDENCIES) $(EXTRA_ags_log_test_DEPENDENCIES) @rm -f ags_log_test$(EXEEXT) $(AM_V_CCLD)$(ags_log_test_LINK) $(ags_log_test_OBJECTS) $(ags_log_test_LDADD) $(LIBS) ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_conversion_test$(EXEEXT): $(ags_lv2_conversion_test_OBJECTS) $(ags_lv2_conversion_test_DEPENDENCIES) $(EXTRA_ags_lv2_conversion_test_DEPENDENCIES) @rm -f ags_lv2_conversion_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_conversion_test_LINK) $(ags_lv2_conversion_test_OBJECTS) $(ags_lv2_conversion_test_LDADD) $(LIBS) ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_manager_test$(EXEEXT): $(ags_lv2_manager_test_OBJECTS) $(ags_lv2_manager_test_DEPENDENCIES) $(EXTRA_ags_lv2_manager_test_DEPENDENCIES) @rm -f ags_lv2_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_manager_test_LINK) $(ags_lv2_manager_test_OBJECTS) $(ags_lv2_manager_test_LDADD) $(LIBS) ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_option_manager_test$(EXEEXT): $(ags_lv2_option_manager_test_OBJECTS) $(ags_lv2_option_manager_test_DEPENDENCIES) $(EXTRA_ags_lv2_option_manager_test_DEPENDENCIES) @rm -f ags_lv2_option_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_option_manager_test_LINK) $(ags_lv2_option_manager_test_OBJECTS) $(ags_lv2_option_manager_test_LDADD) $(LIBS) ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_plugin_test$(EXEEXT): $(ags_lv2_plugin_test_OBJECTS) $(ags_lv2_plugin_test_DEPENDENCIES) $(EXTRA_ags_lv2_plugin_test_DEPENDENCIES) @rm -f ags_lv2_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_plugin_test_LINK) $(ags_lv2_plugin_test_OBJECTS) $(ags_lv2_plugin_test_LDADD) $(LIBS) ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_preset_test$(EXEEXT): $(ags_lv2_preset_test_OBJECTS) $(ags_lv2_preset_test_DEPENDENCIES) $(EXTRA_ags_lv2_preset_test_DEPENDENCIES) @rm -f ags_lv2_preset_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_preset_test_LINK) $(ags_lv2_preset_test_OBJECTS) $(ags_lv2_preset_test_LDADD) $(LIBS) ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_uri_map_manager_test$(EXEEXT): $(ags_lv2_uri_map_manager_test_OBJECTS) $(ags_lv2_uri_map_manager_test_DEPENDENCIES) $(EXTRA_ags_lv2_uri_map_manager_test_DEPENDENCIES) @rm -f ags_lv2_uri_map_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_uri_map_manager_test_LINK) $(ags_lv2_uri_map_manager_test_OBJECTS) $(ags_lv2_uri_map_manager_test_LDADD) $(LIBS) ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_urid_manager_test$(EXEEXT): $(ags_lv2_urid_manager_test_OBJECTS) $(ags_lv2_urid_manager_test_DEPENDENCIES) $(EXTRA_ags_lv2_urid_manager_test_DEPENDENCIES) @rm -f ags_lv2_urid_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_urid_manager_test_LINK) $(ags_lv2_urid_manager_test_OBJECTS) $(ags_lv2_urid_manager_test_LDADD) $(LIBS) ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2_worker_manager_test$(EXEEXT): $(ags_lv2_worker_manager_test_OBJECTS) $(ags_lv2_worker_manager_test_DEPENDENCIES) $(EXTRA_ags_lv2_worker_manager_test_DEPENDENCIES) @rm -f ags_lv2_worker_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2_worker_manager_test_LINK) $(ags_lv2_worker_manager_test_OBJECTS) $(ags_lv2_worker_manager_test_LDADD) $(LIBS) ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2ui_manager_test$(EXEEXT): $(ags_lv2ui_manager_test_OBJECTS) $(ags_lv2ui_manager_test_DEPENDENCIES) $(EXTRA_ags_lv2ui_manager_test_DEPENDENCIES) @rm -f ags_lv2ui_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2ui_manager_test_LINK) $(ags_lv2ui_manager_test_OBJECTS) $(ags_lv2ui_manager_test_LDADD) $(LIBS) ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_lv2ui_plugin_test$(EXEEXT): $(ags_lv2ui_plugin_test_OBJECTS) $(ags_lv2ui_plugin_test_DEPENDENCIES) $(EXTRA_ags_lv2ui_plugin_test_DEPENDENCIES) @rm -f ags_lv2ui_plugin_test$(EXEEXT) $(AM_V_CCLD)$(ags_lv2ui_plugin_test_LINK) $(ags_lv2ui_plugin_test_OBJECTS) $(ags_lv2ui_plugin_test_LDADD) $(LIBS) ags/test/audio/midi/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/midi @: > ags/test/audio/midi/$(am__dirstamp) ags/test/audio/midi/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/midi/$(DEPDIR) @: > ags/test/audio/midi/$(DEPDIR)/$(am__dirstamp) ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.$(OBJEXT): \ ags/test/audio/midi/$(am__dirstamp) \ ags/test/audio/midi/$(DEPDIR)/$(am__dirstamp) ags_midi_buffer_util_test$(EXEEXT): $(ags_midi_buffer_util_test_OBJECTS) $(ags_midi_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_midi_buffer_util_test_DEPENDENCIES) @rm -f ags_midi_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_midi_buffer_util_test_LINK) $(ags_midi_buffer_util_test_OBJECTS) $(ags_midi_buffer_util_test_LDADD) $(LIBS) ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.$(OBJEXT): \ ags/test/audio/midi/$(am__dirstamp) \ ags/test/audio/midi/$(DEPDIR)/$(am__dirstamp) ags_midi_builder_test$(EXEEXT): $(ags_midi_builder_test_OBJECTS) $(ags_midi_builder_test_DEPENDENCIES) $(EXTRA_ags_midi_builder_test_DEPENDENCIES) @rm -f ags_midi_builder_test$(EXEEXT) $(AM_V_CCLD)$(ags_midi_builder_test_LINK) $(ags_midi_builder_test_OBJECTS) $(ags_midi_builder_test_LDADD) $(LIBS) ags/test/audio/midi_test-ags_midi_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_midi_test$(EXEEXT): $(ags_midi_test_OBJECTS) $(ags_midi_test_DEPENDENCIES) $(EXTRA_ags_midi_test_DEPENDENCIES) @rm -f ags_midi_test$(EXEEXT) $(AM_V_CCLD)$(ags_midi_test_LINK) $(ags_midi_test_OBJECTS) $(ags_midi_test_LDADD) $(LIBS) ags/test/audio/midiin_test-ags_midiin_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_midiin_test$(EXEEXT): $(ags_midiin_test_OBJECTS) $(ags_midiin_test_DEPENDENCIES) $(EXTRA_ags_midiin_test_DEPENDENCIES) @rm -f ags_midiin_test$(EXEEXT) $(AM_V_CCLD)$(ags_midiin_test_LINK) $(ags_midiin_test_OBJECTS) $(ags_midiin_test_LDADD) $(LIBS) ags/test/audio/task/move_note_test-ags_move_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_move_note_test$(EXEEXT): $(ags_move_note_test_OBJECTS) $(ags_move_note_test_DEPENDENCIES) $(EXTRA_ags_move_note_test_DEPENDENCIES) @rm -f ags_move_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_move_note_test_LINK) $(ags_move_note_test_OBJECTS) $(ags_move_note_test_LDADD) $(LIBS) ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_mute_audio_signal_test$(EXEEXT): $(ags_mute_audio_signal_test_OBJECTS) $(ags_mute_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_mute_audio_signal_test_DEPENDENCIES) @rm -f ags_mute_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_mute_audio_signal_test_LINK) $(ags_mute_audio_signal_test_OBJECTS) $(ags_mute_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_mute_audio_test$(EXEEXT): $(ags_mute_audio_test_OBJECTS) $(ags_mute_audio_test_DEPENDENCIES) $(EXTRA_ags_mute_audio_test_DEPENDENCIES) @rm -f ags_mute_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_mute_audio_test_LINK) $(ags_mute_audio_test_OBJECTS) $(ags_mute_audio_test_LDADD) $(LIBS) ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_mute_channel_test$(EXEEXT): $(ags_mute_channel_test_OBJECTS) $(ags_mute_channel_test_DEPENDENCIES) $(EXTRA_ags_mute_channel_test_DEPENDENCIES) @rm -f ags_mute_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_mute_channel_test_LINK) $(ags_mute_channel_test_OBJECTS) $(ags_mute_channel_test_LDADD) $(LIBS) ags/test/audio/notation_test-ags_notation_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_notation_test$(EXEEXT): $(ags_notation_test_OBJECTS) $(ags_notation_test_DEPENDENCIES) $(EXTRA_ags_notation_test_DEPENDENCIES) @rm -f ags_notation_test$(EXEEXT) $(AM_V_CCLD)$(ags_notation_test_LINK) $(ags_notation_test_OBJECTS) $(ags_notation_test_LDADD) $(LIBS) ags/test/audio/note_test-ags_note_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_note_test$(EXEEXT): $(ags_note_test_OBJECTS) $(ags_note_test_DEPENDENCIES) $(EXTRA_ags_note_test_DEPENDENCIES) @rm -f ags_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_note_test_LINK) $(ags_note_test_OBJECTS) $(ags_note_test_LDADD) $(LIBS) ags/test/audio/osc/controller/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/controller @: > ags/test/audio/osc/controller/$(am__dirstamp) ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/controller/$(DEPDIR) @: > ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_action_controller_test$(EXEEXT): $(ags_osc_action_controller_test_OBJECTS) $(ags_osc_action_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_action_controller_test_DEPENDENCIES) @rm -f ags_osc_action_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_action_controller_test_LINK) $(ags_osc_action_controller_test_OBJECTS) $(ags_osc_action_controller_test_LDADD) $(LIBS) ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_buffer_util_test$(EXEEXT): $(ags_osc_buffer_util_test_OBJECTS) $(ags_osc_buffer_util_test_DEPENDENCIES) $(EXTRA_ags_osc_buffer_util_test_DEPENDENCIES) @rm -f ags_osc_buffer_util_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_buffer_util_test_LINK) $(ags_osc_buffer_util_test_OBJECTS) $(ags_osc_buffer_util_test_LDADD) $(LIBS) ags/test/audio/osc/osc_client_test-ags_osc_client_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_client_test$(EXEEXT): $(ags_osc_client_test_OBJECTS) $(ags_osc_client_test_DEPENDENCIES) $(EXTRA_ags_osc_client_test_DEPENDENCIES) @rm -f ags_osc_client_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_client_test_LINK) $(ags_osc_client_test_OBJECTS) $(ags_osc_client_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_config_controller_test$(EXEEXT): $(ags_osc_config_controller_test_OBJECTS) $(ags_osc_config_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_config_controller_test_DEPENDENCIES) @rm -f ags_osc_config_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_config_controller_test_LINK) $(ags_osc_config_controller_test_OBJECTS) $(ags_osc_config_controller_test_LDADD) $(LIBS) ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_connection_test$(EXEEXT): $(ags_osc_connection_test_OBJECTS) $(ags_osc_connection_test_DEPENDENCIES) $(EXTRA_ags_osc_connection_test_DEPENDENCIES) @rm -f ags_osc_connection_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_connection_test_LINK) $(ags_osc_connection_test_OBJECTS) $(ags_osc_connection_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_front_controller_test$(EXEEXT): $(ags_osc_front_controller_test_OBJECTS) $(ags_osc_front_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_front_controller_test_DEPENDENCIES) @rm -f ags_osc_front_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_front_controller_test_LINK) $(ags_osc_front_controller_test_OBJECTS) $(ags_osc_front_controller_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_info_controller_test$(EXEEXT): $(ags_osc_info_controller_test_OBJECTS) $(ags_osc_info_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_info_controller_test_DEPENDENCIES) @rm -f ags_osc_info_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_info_controller_test_LINK) $(ags_osc_info_controller_test_OBJECTS) $(ags_osc_info_controller_test_LDADD) $(LIBS) ags/test/audio/osc/osc_message_test-ags_osc_message_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_message_test$(EXEEXT): $(ags_osc_message_test_OBJECTS) $(ags_osc_message_test_DEPENDENCIES) $(EXTRA_ags_osc_message_test_DEPENDENCIES) @rm -f ags_osc_message_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_message_test_LINK) $(ags_osc_message_test_OBJECTS) $(ags_osc_message_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_meter_controller_test$(EXEEXT): $(ags_osc_meter_controller_test_OBJECTS) $(ags_osc_meter_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_meter_controller_test_DEPENDENCIES) @rm -f ags_osc_meter_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_meter_controller_test_LINK) $(ags_osc_meter_controller_test_OBJECTS) $(ags_osc_meter_controller_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_node_controller_test$(EXEEXT): $(ags_osc_node_controller_test_OBJECTS) $(ags_osc_node_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_node_controller_test_DEPENDENCIES) @rm -f ags_osc_node_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_node_controller_test_LINK) $(ags_osc_node_controller_test_OBJECTS) $(ags_osc_node_controller_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_renew_controller_test$(EXEEXT): $(ags_osc_renew_controller_test_OBJECTS) $(ags_osc_renew_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_renew_controller_test_DEPENDENCIES) @rm -f ags_osc_renew_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_renew_controller_test_LINK) $(ags_osc_renew_controller_test_OBJECTS) $(ags_osc_renew_controller_test_LDADD) $(LIBS) ags/test/audio/osc/osc_server_test-ags_osc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_server_test$(EXEEXT): $(ags_osc_server_test_OBJECTS) $(ags_osc_server_test_DEPENDENCIES) $(EXTRA_ags_osc_server_test_DEPENDENCIES) @rm -f ags_osc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_server_test_LINK) $(ags_osc_server_test_OBJECTS) $(ags_osc_server_test_LDADD) $(LIBS) ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.$(OBJEXT): \ ags/test/audio/osc/controller/$(am__dirstamp) \ ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) ags_osc_status_controller_test$(EXEEXT): $(ags_osc_status_controller_test_OBJECTS) $(ags_osc_status_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_status_controller_test_DEPENDENCIES) @rm -f ags_osc_status_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_status_controller_test_LINK) $(ags_osc_status_controller_test_OBJECTS) $(ags_osc_status_controller_test_LDADD) $(LIBS) ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_websocket_connection_test$(EXEEXT): $(ags_osc_websocket_connection_test_OBJECTS) $(ags_osc_websocket_connection_test_DEPENDENCIES) $(EXTRA_ags_osc_websocket_connection_test_DEPENDENCIES) @rm -f ags_osc_websocket_connection_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_websocket_connection_test_LINK) $(ags_osc_websocket_connection_test_OBJECTS) $(ags_osc_websocket_connection_test_LDADD) $(LIBS) ags/test/audio/osc/xmlrpc/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/xmlrpc @: > ags/test/audio/osc/xmlrpc/$(am__dirstamp) ags/test/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/test/audio/osc/xmlrpc/$(DEPDIR) @: > ags/test/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp) ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.$(OBJEXT): \ ags/test/audio/osc/xmlrpc/$(am__dirstamp) \ ags/test/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp) ags_osc_xmlrpc_controller_test$(EXEEXT): $(ags_osc_xmlrpc_controller_test_OBJECTS) $(ags_osc_xmlrpc_controller_test_DEPENDENCIES) $(EXTRA_ags_osc_xmlrpc_controller_test_DEPENDENCIES) @rm -f ags_osc_xmlrpc_controller_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_xmlrpc_controller_test_LINK) $(ags_osc_xmlrpc_controller_test_OBJECTS) $(ags_osc_xmlrpc_controller_test_LDADD) $(LIBS) ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_xmlrpc_message_test$(EXEEXT): $(ags_osc_xmlrpc_message_test_OBJECTS) $(ags_osc_xmlrpc_message_test_DEPENDENCIES) $(EXTRA_ags_osc_xmlrpc_message_test_DEPENDENCIES) @rm -f ags_osc_xmlrpc_message_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_xmlrpc_message_test_LINK) $(ags_osc_xmlrpc_message_test_OBJECTS) $(ags_osc_xmlrpc_message_test_LDADD) $(LIBS) ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.$(OBJEXT): \ ags/test/audio/osc/$(am__dirstamp) \ ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) ags_osc_xmlrpc_server_test$(EXEEXT): $(ags_osc_xmlrpc_server_test_OBJECTS) $(ags_osc_xmlrpc_server_test_DEPENDENCIES) $(EXTRA_ags_osc_xmlrpc_server_test_DEPENDENCIES) @rm -f ags_osc_xmlrpc_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_osc_xmlrpc_server_test_LINK) $(ags_osc_xmlrpc_server_test_OBJECTS) $(ags_osc_xmlrpc_server_test_LDADD) $(LIBS) ags/test/audio/output_test-ags_output_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_output_test$(EXEEXT): $(ags_output_test_OBJECTS) $(ags_output_test_DEPENDENCIES) $(EXTRA_ags_output_test_DEPENDENCIES) @rm -f ags_output_test$(EXEEXT) $(AM_V_CCLD)$(ags_output_test_LINK) $(ags_output_test_OBJECTS) $(ags_output_test_LDADD) $(LIBS) ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_password_store_manager_test$(EXEEXT): $(ags_password_store_manager_test_OBJECTS) $(ags_password_store_manager_test_DEPENDENCIES) $(EXTRA_ags_password_store_manager_test_DEPENDENCIES) @rm -f ags_password_store_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_password_store_manager_test_LINK) $(ags_password_store_manager_test_OBJECTS) $(ags_password_store_manager_test_LDADD) $(LIBS) ags/test/audio/pattern_test-ags_pattern_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_pattern_test$(EXEEXT): $(ags_pattern_test_OBJECTS) $(ags_pattern_test_DEPENDENCIES) $(EXTRA_ags_pattern_test_DEPENDENCIES) @rm -f ags_pattern_test$(EXEEXT) $(AM_V_CCLD)$(ags_pattern_test_LINK) $(ags_pattern_test_OBJECTS) $(ags_pattern_test_LDADD) $(LIBS) ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_peak_audio_signal_test$(EXEEXT): $(ags_peak_audio_signal_test_OBJECTS) $(ags_peak_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_peak_audio_signal_test_DEPENDENCIES) @rm -f ags_peak_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_peak_audio_signal_test_LINK) $(ags_peak_audio_signal_test_OBJECTS) $(ags_peak_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_peak_channel_test$(EXEEXT): $(ags_peak_channel_test_OBJECTS) $(ags_peak_channel_test_DEPENDENCIES) $(EXTRA_ags_peak_channel_test_DEPENDENCIES) @rm -f ags_peak_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_peak_channel_test_LINK) $(ags_peak_channel_test_OBJECTS) $(ags_peak_channel_test_LDADD) $(LIBS) ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_play_audio_signal_test$(EXEEXT): $(ags_play_audio_signal_test_OBJECTS) $(ags_play_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_play_audio_signal_test_DEPENDENCIES) @rm -f ags_play_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_play_audio_signal_test_LINK) $(ags_play_audio_signal_test_OBJECTS) $(ags_play_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/play_audio_test-ags_play_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_play_audio_test$(EXEEXT): $(ags_play_audio_test_OBJECTS) $(ags_play_audio_test_DEPENDENCIES) $(EXTRA_ags_play_audio_test_DEPENDENCIES) @rm -f ags_play_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_play_audio_test_LINK) $(ags_play_audio_test_OBJECTS) $(ags_play_audio_test_LDADD) $(LIBS) ags/test/audio/recall/play_channel_test-ags_play_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_play_channel_test$(EXEEXT): $(ags_play_channel_test_OBJECTS) $(ags_play_channel_test_DEPENDENCIES) $(EXTRA_ags_play_channel_test_DEPENDENCIES) @rm -f ags_play_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_play_channel_test_LINK) $(ags_play_channel_test_OBJECTS) $(ags_play_channel_test_LDADD) $(LIBS) ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_play_wave_audio_test$(EXEEXT): $(ags_play_wave_audio_test_OBJECTS) $(ags_play_wave_audio_test_DEPENDENCIES) $(EXTRA_ags_play_wave_audio_test_DEPENDENCIES) @rm -f ags_play_wave_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_play_wave_audio_test_LINK) $(ags_play_wave_audio_test_OBJECTS) $(ags_play_wave_audio_test_LDADD) $(LIBS) ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_play_wave_channel_test$(EXEEXT): $(ags_play_wave_channel_test_OBJECTS) $(ags_play_wave_channel_test_DEPENDENCIES) $(EXTRA_ags_play_wave_channel_test_DEPENDENCIES) @rm -f ags_play_wave_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_play_wave_channel_test_LINK) $(ags_play_wave_channel_test_OBJECTS) $(ags_play_wave_channel_test_LDADD) $(LIBS) ags/test/audio/playback_domain_test-ags_playback_domain_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_playback_domain_test$(EXEEXT): $(ags_playback_domain_test_OBJECTS) $(ags_playback_domain_test_DEPENDENCIES) $(EXTRA_ags_playback_domain_test_DEPENDENCIES) @rm -f ags_playback_domain_test$(EXEEXT) $(AM_V_CCLD)$(ags_playback_domain_test_LINK) $(ags_playback_domain_test_OBJECTS) $(ags_playback_domain_test_LDADD) $(LIBS) ags/test/audio/playback_test-ags_playback_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_playback_test$(EXEEXT): $(ags_playback_test_OBJECTS) $(ags_playback_test_DEPENDENCIES) $(EXTRA_ags_playback_test_DEPENDENCIES) @rm -f ags_playback_test$(EXEEXT) $(AM_V_CCLD)$(ags_playback_test_LINK) $(ags_playback_test_OBJECTS) $(ags_playback_test_LDADD) $(LIBS) ags/test/plugin/plugin_port_test-ags_plugin_port_test.$(OBJEXT): \ ags/test/plugin/$(am__dirstamp) \ ags/test/plugin/$(DEPDIR)/$(am__dirstamp) ags_plugin_port_test$(EXEEXT): $(ags_plugin_port_test_OBJECTS) $(ags_plugin_port_test_DEPENDENCIES) $(EXTRA_ags_plugin_port_test_DEPENDENCIES) @rm -f ags_plugin_port_test$(EXEEXT) $(AM_V_CCLD)$(ags_plugin_port_test_LINK) $(ags_plugin_port_test_OBJECTS) $(ags_plugin_port_test_LDADD) $(LIBS) ags/test/audio/port_test-ags_port_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_port_test$(EXEEXT): $(ags_port_test_OBJECTS) $(ags_port_test_DEPENDENCIES) $(EXTRA_ags_port_test_DEPENDENCIES) @rm -f ags_port_test$(EXEEXT) $(AM_V_CCLD)$(ags_port_test_LINK) $(ags_port_test_OBJECTS) $(ags_port_test_LDADD) $(LIBS) ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_prepare_audio_signal_test$(EXEEXT): $(ags_prepare_audio_signal_test_OBJECTS) $(ags_prepare_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_prepare_audio_signal_test_DEPENDENCIES) @rm -f ags_prepare_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_prepare_audio_signal_test_LINK) $(ags_prepare_audio_signal_test_OBJECTS) $(ags_prepare_audio_signal_test_LDADD) $(LIBS) ags/test/audio/preset_test-ags_preset_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_preset_test$(EXEEXT): $(ags_preset_test_OBJECTS) $(ags_preset_test_DEPENDENCIES) $(EXTRA_ags_preset_test_DEPENDENCIES) @rm -f ags_preset_test$(EXEEXT) $(AM_V_CCLD)$(ags_preset_test_LINK) $(ags_preset_test_OBJECTS) $(ags_preset_test_LDADD) $(LIBS) ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_channel_run_test$(EXEEXT): $(ags_recall_channel_run_test_OBJECTS) $(ags_recall_channel_run_test_DEPENDENCIES) $(EXTRA_ags_recall_channel_run_test_DEPENDENCIES) @rm -f ags_recall_channel_run_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_channel_run_test_LINK) $(ags_recall_channel_run_test_OBJECTS) $(ags_recall_channel_run_test_LDADD) $(LIBS) ags/test/audio/recall_channel_test-ags_recall_channel_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_channel_test$(EXEEXT): $(ags_recall_channel_test_OBJECTS) $(ags_recall_channel_test_DEPENDENCIES) $(EXTRA_ags_recall_channel_test_DEPENDENCIES) @rm -f ags_recall_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_channel_test_LINK) $(ags_recall_channel_test_OBJECTS) $(ags_recall_channel_test_LDADD) $(LIBS) ags/test/audio/recall_container_test-ags_recall_container_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_container_test$(EXEEXT): $(ags_recall_container_test_OBJECTS) $(ags_recall_container_test_DEPENDENCIES) $(EXTRA_ags_recall_container_test_DEPENDENCIES) @rm -f ags_recall_container_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_container_test_LINK) $(ags_recall_container_test_OBJECTS) $(ags_recall_container_test_LDADD) $(LIBS) ags/test/audio/recall_dependency_test-ags_recall_dependency_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_dependency_test$(EXEEXT): $(ags_recall_dependency_test_OBJECTS) $(ags_recall_dependency_test_DEPENDENCIES) $(EXTRA_ags_recall_dependency_test_DEPENDENCIES) @rm -f ags_recall_dependency_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_dependency_test_LINK) $(ags_recall_dependency_test_OBJECTS) $(ags_recall_dependency_test_LDADD) $(LIBS) ags/test/audio/recall_id_test-ags_recall_id_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_id_test$(EXEEXT): $(ags_recall_id_test_OBJECTS) $(ags_recall_id_test_DEPENDENCIES) $(EXTRA_ags_recall_id_test_DEPENDENCIES) @rm -f ags_recall_id_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_id_test_LINK) $(ags_recall_id_test_OBJECTS) $(ags_recall_id_test_LDADD) $(LIBS) ags/test/audio/recall_recycling_test-ags_recall_recycling_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_recycling_test$(EXEEXT): $(ags_recall_recycling_test_OBJECTS) $(ags_recall_recycling_test_DEPENDENCIES) $(EXTRA_ags_recall_recycling_test_DEPENDENCIES) @rm -f ags_recall_recycling_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_recycling_test_LINK) $(ags_recall_recycling_test_OBJECTS) $(ags_recall_recycling_test_LDADD) $(LIBS) ags/test/audio/recall_test-ags_recall_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recall_test$(EXEEXT): $(ags_recall_test_OBJECTS) $(ags_recall_test_DEPENDENCIES) $(EXTRA_ags_recall_test_DEPENDENCIES) @rm -f ags_recall_test$(EXEEXT) $(AM_V_CCLD)$(ags_recall_test_LINK) $(ags_recall_test_OBJECTS) $(ags_recall_test_LDADD) $(LIBS) ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_record_midi_audio_test$(EXEEXT): $(ags_record_midi_audio_test_OBJECTS) $(ags_record_midi_audio_test_DEPENDENCIES) $(EXTRA_ags_record_midi_audio_test_DEPENDENCIES) @rm -f ags_record_midi_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_record_midi_audio_test_LINK) $(ags_record_midi_audio_test_OBJECTS) $(ags_record_midi_audio_test_LDADD) $(LIBS) ags/test/audio/recycling_context_test-ags_recycling_context_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recycling_context_test$(EXEEXT): $(ags_recycling_context_test_OBJECTS) $(ags_recycling_context_test_DEPENDENCIES) $(EXTRA_ags_recycling_context_test_DEPENDENCIES) @rm -f ags_recycling_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_recycling_context_test_LINK) $(ags_recycling_context_test_OBJECTS) $(ags_recycling_context_test_LDADD) $(LIBS) ags/test/audio/recycling_test-ags_recycling_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_recycling_test$(EXEEXT): $(ags_recycling_test_OBJECTS) $(ags_recycling_test_DEPENDENCIES) $(EXTRA_ags_recycling_test_DEPENDENCIES) @rm -f ags_recycling_test$(EXEEXT) $(AM_V_CCLD)$(ags_recycling_test_LINK) $(ags_recycling_test_OBJECTS) $(ags_recycling_test_LDADD) $(LIBS) ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_remove_audio_signal_test$(EXEEXT): $(ags_remove_audio_signal_test_OBJECTS) $(ags_remove_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_remove_audio_signal_test_DEPENDENCIES) @rm -f ags_remove_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_remove_audio_signal_test_LINK) $(ags_remove_audio_signal_test_OBJECTS) $(ags_remove_audio_signal_test_LDADD) $(LIBS) ags/test/audio/task/remove_audio_test-ags_remove_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_remove_audio_test$(EXEEXT): $(ags_remove_audio_test_OBJECTS) $(ags_remove_audio_test_DEPENDENCIES) $(EXTRA_ags_remove_audio_test_DEPENDENCIES) @rm -f ags_remove_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_remove_audio_test_LINK) $(ags_remove_audio_test_OBJECTS) $(ags_remove_audio_test_LDADD) $(LIBS) ags/test/audio/task/remove_note_test-ags_remove_note_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_remove_note_test$(EXEEXT): $(ags_remove_note_test_OBJECTS) $(ags_remove_note_test_DEPENDENCIES) $(EXTRA_ags_remove_note_test_DEPENDENCIES) @rm -f ags_remove_note_test$(EXEEXT) $(AM_V_CCLD)$(ags_remove_note_test_LINK) $(ags_remove_note_test_OBJECTS) $(ags_remove_note_test_LDADD) $(LIBS) ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_remove_soundcard_test$(EXEEXT): $(ags_remove_soundcard_test_OBJECTS) $(ags_remove_soundcard_test_DEPENDENCIES) $(EXTRA_ags_remove_soundcard_test_DEPENDENCIES) @rm -f ags_remove_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_remove_soundcard_test_LINK) $(ags_remove_soundcard_test_OBJECTS) $(ags_remove_soundcard_test_LDADD) $(LIBS) ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_reset_amplitude_test$(EXEEXT): $(ags_reset_amplitude_test_OBJECTS) $(ags_reset_amplitude_test_DEPENDENCIES) $(EXTRA_ags_reset_amplitude_test_DEPENDENCIES) @rm -f ags_reset_amplitude_test$(EXEEXT) $(AM_V_CCLD)$(ags_reset_amplitude_test_LINK) $(ags_reset_amplitude_test_OBJECTS) $(ags_reset_amplitude_test_LDADD) $(LIBS) ags/test/audio/task/reset_peak_test-ags_reset_peak_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_reset_peak_test$(EXEEXT): $(ags_reset_peak_test_OBJECTS) $(ags_reset_peak_test_DEPENDENCIES) $(EXTRA_ags_reset_peak_test_DEPENDENCIES) @rm -f ags_reset_peak_test$(EXEEXT) $(AM_V_CCLD)$(ags_reset_peak_test_LINK) $(ags_reset_peak_test_OBJECTS) $(ags_reset_peak_test_LDADD) $(LIBS) ags/test/audio/task/resize_audio_test-ags_resize_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_resize_audio_test$(EXEEXT): $(ags_resize_audio_test_OBJECTS) $(ags_resize_audio_test_DEPENDENCIES) $(EXTRA_ags_resize_audio_test_DEPENDENCIES) @rm -f ags_resize_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_resize_audio_test_LINK) $(ags_resize_audio_test_OBJECTS) $(ags_resize_audio_test_LDADD) $(LIBS) ags/test/thread/returnable_thread_test-ags_returnable_thread_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) \ ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags_returnable_thread_test$(EXEEXT): $(ags_returnable_thread_test_OBJECTS) $(ags_returnable_thread_test_DEPENDENCIES) $(EXTRA_ags_returnable_thread_test_DEPENDENCIES) @rm -f ags_returnable_thread_test$(EXEEXT) $(AM_V_CCLD)$(ags_returnable_thread_test_LINK) $(ags_returnable_thread_test_OBJECTS) $(ags_returnable_thread_test_LDADD) $(LIBS) ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_route_dssi_audio_test$(EXEEXT): $(ags_route_dssi_audio_test_OBJECTS) $(ags_route_dssi_audio_test_DEPENDENCIES) $(EXTRA_ags_route_dssi_audio_test_DEPENDENCIES) @rm -f ags_route_dssi_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_route_dssi_audio_test_LINK) $(ags_route_dssi_audio_test_OBJECTS) $(ags_route_dssi_audio_test_LDADD) $(LIBS) ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_route_lv2_audio_test$(EXEEXT): $(ags_route_lv2_audio_test_OBJECTS) $(ags_route_lv2_audio_test_DEPENDENCIES) $(EXTRA_ags_route_lv2_audio_test_DEPENDENCIES) @rm -f ags_route_lv2_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_route_lv2_audio_test_LINK) $(ags_route_lv2_audio_test_OBJECTS) $(ags_route_lv2_audio_test_LDADD) $(LIBS) ags/test/server/security/security_context_test-ags_security_context_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_security_context_test$(EXEEXT): $(ags_security_context_test_OBJECTS) $(ags_security_context_test_DEPENDENCIES) $(EXTRA_ags_security_context_test_DEPENDENCIES) @rm -f ags_security_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_security_context_test_LINK) $(ags_security_context_test_OBJECTS) $(ags_security_context_test_LDADD) $(LIBS) ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_seek_soundcard_test$(EXEEXT): $(ags_seek_soundcard_test_OBJECTS) $(ags_seek_soundcard_test_DEPENDENCIES) $(EXTRA_ags_seek_soundcard_test_DEPENDENCIES) @rm -f ags_seek_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_seek_soundcard_test_LINK) $(ags_seek_soundcard_test_OBJECTS) $(ags_seek_soundcard_test_LDADD) $(LIBS) ags/test/server/server_application_context_test-ags_server_application_context_test.$(OBJEXT): \ ags/test/server/$(am__dirstamp) \ ags/test/server/$(DEPDIR)/$(am__dirstamp) ags_server_application_context_test$(EXEEXT): $(ags_server_application_context_test_OBJECTS) $(ags_server_application_context_test_DEPENDENCIES) $(EXTRA_ags_server_application_context_test_DEPENDENCIES) @rm -f ags_server_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_server_application_context_test_LINK) $(ags_server_application_context_test_OBJECTS) $(ags_server_application_context_test_LDADD) $(LIBS) ags/test/server/server_test-ags_server_test.$(OBJEXT): \ ags/test/server/$(am__dirstamp) \ ags/test/server/$(DEPDIR)/$(am__dirstamp) ags_server_test$(EXEEXT): $(ags_server_test_OBJECTS) $(ags_server_test_DEPENDENCIES) $(EXTRA_ags_server_test_DEPENDENCIES) @rm -f ags_server_test$(EXEEXT) $(AM_V_CCLD)$(ags_server_test_LINK) $(ags_server_test_OBJECTS) $(ags_server_test_LDADD) $(LIBS) ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_set_audio_channels_test$(EXEEXT): $(ags_set_audio_channels_test_OBJECTS) $(ags_set_audio_channels_test_DEPENDENCIES) $(EXTRA_ags_set_audio_channels_test_DEPENDENCIES) @rm -f ags_set_audio_channels_test$(EXEEXT) $(AM_V_CCLD)$(ags_set_audio_channels_test_LINK) $(ags_set_audio_channels_test_OBJECTS) $(ags_set_audio_channels_test_LDADD) $(LIBS) ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_set_buffer_size_test$(EXEEXT): $(ags_set_buffer_size_test_OBJECTS) $(ags_set_buffer_size_test_DEPENDENCIES) $(EXTRA_ags_set_buffer_size_test_DEPENDENCIES) @rm -f ags_set_buffer_size_test$(EXEEXT) $(AM_V_CCLD)$(ags_set_buffer_size_test_LINK) $(ags_set_buffer_size_test_OBJECTS) $(ags_set_buffer_size_test_LDADD) $(LIBS) ags/test/audio/task/set_device_test-ags_set_device_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_set_device_test$(EXEEXT): $(ags_set_device_test_OBJECTS) $(ags_set_device_test_DEPENDENCIES) $(EXTRA_ags_set_device_test_DEPENDENCIES) @rm -f ags_set_device_test$(EXEEXT) $(AM_V_CCLD)$(ags_set_device_test_LINK) $(ags_set_device_test_OBJECTS) $(ags_set_device_test_LDADD) $(LIBS) ags/test/audio/task/set_format_test-ags_set_format_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_set_format_test$(EXEEXT): $(ags_set_format_test_OBJECTS) $(ags_set_format_test_DEPENDENCIES) $(EXTRA_ags_set_format_test_DEPENDENCIES) @rm -f ags_set_format_test$(EXEEXT) $(AM_V_CCLD)$(ags_set_format_test_LINK) $(ags_set_format_test_OBJECTS) $(ags_set_format_test_LDADD) $(LIBS) ags/test/audio/task/set_muted_test-ags_set_muted_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_set_muted_test$(EXEEXT): $(ags_set_muted_test_OBJECTS) $(ags_set_muted_test_DEPENDENCIES) $(EXTRA_ags_set_muted_test_DEPENDENCIES) @rm -f ags_set_muted_test$(EXEEXT) $(AM_V_CCLD)$(ags_set_muted_test_LINK) $(ags_set_muted_test_OBJECTS) $(ags_set_muted_test_LDADD) $(LIBS) ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_set_samplerate_test$(EXEEXT): $(ags_set_samplerate_test_OBJECTS) $(ags_set_samplerate_test_DEPENDENCIES) $(EXTRA_ags_set_samplerate_test_DEPENDENCIES) @rm -f ags_set_samplerate_test$(EXEEXT) $(AM_V_CCLD)$(ags_set_samplerate_test_LINK) $(ags_set_samplerate_test_OBJECTS) $(ags_set_samplerate_test_LDADD) $(LIBS) ags/test/object/soundcard_test-ags_soundcard_test.$(OBJEXT): \ ags/test/object/$(am__dirstamp) \ ags/test/object/$(DEPDIR)/$(am__dirstamp) ags_soundcard_test$(EXEEXT): $(ags_soundcard_test_OBJECTS) $(ags_soundcard_test_DEPENDENCIES) $(EXTRA_ags_soundcard_test_DEPENDENCIES) @rm -f ags_soundcard_test$(EXEEXT) $(AM_V_CCLD)$(ags_soundcard_test_LINK) $(ags_soundcard_test_OBJECTS) $(ags_soundcard_test_LDADD) $(LIBS) ags/test/audio/task/start_audio_test-ags_start_audio_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_start_audio_test$(EXEEXT): $(ags_start_audio_test_OBJECTS) $(ags_start_audio_test_DEPENDENCIES) $(EXTRA_ags_start_audio_test_DEPENDENCIES) @rm -f ags_start_audio_test$(EXEEXT) $(AM_V_CCLD)$(ags_start_audio_test_LINK) $(ags_start_audio_test_OBJECTS) $(ags_start_audio_test_LDADD) $(LIBS) ags/test/audio/task/start_channel_test-ags_start_channel_test.$(OBJEXT): \ ags/test/audio/task/$(am__dirstamp) \ ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) ags_start_channel_test$(EXEEXT): $(ags_start_channel_test_OBJECTS) $(ags_start_channel_test_DEPENDENCIES) $(EXTRA_ags_start_channel_test_DEPENDENCIES) @rm -f ags_start_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_start_channel_test_LINK) $(ags_start_channel_test_OBJECTS) $(ags_start_channel_test_LDADD) $(LIBS) ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_stream_audio_signal_test$(EXEEXT): $(ags_stream_audio_signal_test_OBJECTS) $(ags_stream_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_stream_audio_signal_test_DEPENDENCIES) @rm -f ags_stream_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_stream_audio_signal_test_LINK) $(ags_stream_audio_signal_test_OBJECTS) $(ags_stream_audio_signal_test_LDADD) $(LIBS) ags/test/audio/synth_generator_test-ags_synth_generator_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_synth_generator_test$(EXEEXT): $(ags_synth_generator_test_OBJECTS) $(ags_synth_generator_test_DEPENDENCIES) $(EXTRA_ags_synth_generator_test_DEPENDENCIES) @rm -f ags_synth_generator_test$(EXEEXT) $(AM_V_CCLD)$(ags_synth_generator_test_LINK) $(ags_synth_generator_test_OBJECTS) $(ags_synth_generator_test_LDADD) $(LIBS) ags/test/thread/task_test-ags_task_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) \ ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags_task_test$(EXEEXT): $(ags_task_test_OBJECTS) $(ags_task_test_DEPENDENCIES) $(EXTRA_ags_task_test_DEPENDENCIES) @rm -f ags_task_test$(EXEEXT) $(AM_V_CCLD)$(ags_task_test_LINK) $(ags_task_test_OBJECTS) $(ags_task_test_LDADD) $(LIBS) ags/test/thread/thread_pool_test-ags_thread_pool_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) \ ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags_thread_pool_test$(EXEEXT): $(ags_thread_pool_test_OBJECTS) $(ags_thread_pool_test_DEPENDENCIES) $(EXTRA_ags_thread_pool_test_DEPENDENCIES) @rm -f ags_thread_pool_test$(EXEEXT) $(AM_V_CCLD)$(ags_thread_pool_test_LINK) $(ags_thread_pool_test_OBJECTS) $(ags_thread_pool_test_LDADD) $(LIBS) ags/test/thread/thread_test-ags_thread_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) \ ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags_thread_test$(EXEEXT): $(ags_thread_test_OBJECTS) $(ags_thread_test_DEPENDENCIES) $(EXTRA_ags_thread_test_DEPENDENCIES) @rm -f ags_thread_test$(EXEEXT) $(AM_V_CCLD)$(ags_thread_test_LINK) $(ags_thread_test_OBJECTS) $(ags_thread_test_LDADD) $(LIBS) ags/test/lib/time_test-ags_time_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_time_test$(EXEEXT): $(ags_time_test_OBJECTS) $(ags_time_test_DEPENDENCIES) $(EXTRA_ags_time_test_DEPENDENCIES) @rm -f ags_time_test$(EXEEXT) $(AM_V_CCLD)$(ags_time_test_LINK) $(ags_time_test_OBJECTS) $(ags_time_test_LDADD) $(LIBS) ags/test/audio/track_test-ags_track_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_track_test$(EXEEXT): $(ags_track_test_OBJECTS) $(ags_track_test_DEPENDENCIES) $(EXTRA_ags_track_test_DEPENDENCIES) @rm -f ags_track_test$(EXEEXT) $(AM_V_CCLD)$(ags_track_test_LINK) $(ags_track_test_OBJECTS) $(ags_track_test_LDADD) $(LIBS) ags/test/lib/turtle_manager_test-ags_turtle_manager_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_turtle_manager_test$(EXEEXT): $(ags_turtle_manager_test_OBJECTS) $(ags_turtle_manager_test_DEPENDENCIES) $(EXTRA_ags_turtle_manager_test_DEPENDENCIES) @rm -f ags_turtle_manager_test$(EXEEXT) $(AM_V_CCLD)$(ags_turtle_manager_test_LINK) $(ags_turtle_manager_test_OBJECTS) $(ags_turtle_manager_test_LDADD) $(LIBS) ags/test/lib/turtle_test-ags_turtle_test.$(OBJEXT): \ ags/test/lib/$(am__dirstamp) \ ags/test/lib/$(DEPDIR)/$(am__dirstamp) ags_turtle_test$(EXEEXT): $(ags_turtle_test_OBJECTS) $(ags_turtle_test_DEPENDENCIES) $(EXTRA_ags_turtle_test_DEPENDENCIES) @rm -f ags_turtle_test$(EXEEXT) $(AM_V_CCLD)$(ags_turtle_test_LINK) $(ags_turtle_test_OBJECTS) $(ags_turtle_test_LDADD) $(LIBS) ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_volume_audio_signal_test$(EXEEXT): $(ags_volume_audio_signal_test_OBJECTS) $(ags_volume_audio_signal_test_DEPENDENCIES) $(EXTRA_ags_volume_audio_signal_test_DEPENDENCIES) @rm -f ags_volume_audio_signal_test$(EXEEXT) $(AM_V_CCLD)$(ags_volume_audio_signal_test_LINK) $(ags_volume_audio_signal_test_OBJECTS) $(ags_volume_audio_signal_test_LDADD) $(LIBS) ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.$(OBJEXT): \ ags/test/audio/recall/$(am__dirstamp) \ ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) ags_volume_channel_test$(EXEEXT): $(ags_volume_channel_test_OBJECTS) $(ags_volume_channel_test_DEPENDENCIES) $(EXTRA_ags_volume_channel_test_DEPENDENCIES) @rm -f ags_volume_channel_test$(EXEEXT) $(AM_V_CCLD)$(ags_volume_channel_test_LINK) $(ags_volume_channel_test_OBJECTS) $(ags_volume_channel_test_LDADD) $(LIBS) ags/test/audio/wave_test-ags_wave_test.$(OBJEXT): \ ags/test/audio/$(am__dirstamp) \ ags/test/audio/$(DEPDIR)/$(am__dirstamp) ags_wave_test$(EXEEXT): $(ags_wave_test_OBJECTS) $(ags_wave_test_DEPENDENCIES) $(EXTRA_ags_wave_test_DEPENDENCIES) @rm -f ags_wave_test$(EXEEXT) $(AM_V_CCLD)$(ags_wave_test_LINK) $(ags_wave_test_OBJECTS) $(ags_wave_test_LDADD) $(LIBS) ags/test/thread/worker_thread_test-ags_worker_thread_test.$(OBJEXT): \ ags/test/thread/$(am__dirstamp) \ ags/test/thread/$(DEPDIR)/$(am__dirstamp) ags_worker_thread_test$(EXEEXT): $(ags_worker_thread_test_OBJECTS) $(ags_worker_thread_test_DEPENDENCIES) $(EXTRA_ags_worker_thread_test_DEPENDENCIES) @rm -f ags_worker_thread_test$(EXEEXT) $(AM_V_CCLD)$(ags_worker_thread_test_LINK) $(ags_worker_thread_test_OBJECTS) $(ags_worker_thread_test_LDADD) $(LIBS) ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_xml_authentication_test$(EXEEXT): $(ags_xml_authentication_test_OBJECTS) $(ags_xml_authentication_test_DEPENDENCIES) $(EXTRA_ags_xml_authentication_test_DEPENDENCIES) @rm -f ags_xml_authentication_test$(EXEEXT) $(AM_V_CCLD)$(ags_xml_authentication_test_LINK) $(ags_xml_authentication_test_OBJECTS) $(ags_xml_authentication_test_LDADD) $(LIBS) ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_xml_business_group_test$(EXEEXT): $(ags_xml_business_group_test_OBJECTS) $(ags_xml_business_group_test_DEPENDENCIES) $(EXTRA_ags_xml_business_group_test_DEPENDENCIES) @rm -f ags_xml_business_group_test$(EXEEXT) $(AM_V_CCLD)$(ags_xml_business_group_test_LINK) $(ags_xml_business_group_test_OBJECTS) $(ags_xml_business_group_test_LDADD) $(LIBS) ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_xml_certificate_test$(EXEEXT): $(ags_xml_certificate_test_OBJECTS) $(ags_xml_certificate_test_DEPENDENCIES) $(EXTRA_ags_xml_certificate_test_DEPENDENCIES) @rm -f ags_xml_certificate_test$(EXEEXT) $(AM_V_CCLD)$(ags_xml_certificate_test_LINK) $(ags_xml_certificate_test_OBJECTS) $(ags_xml_certificate_test_LDADD) $(LIBS) ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.$(OBJEXT): \ ags/test/server/security/$(am__dirstamp) \ ags/test/server/security/$(DEPDIR)/$(am__dirstamp) ags_xml_password_store_test$(EXEEXT): $(ags_xml_password_store_test_OBJECTS) $(ags_xml_password_store_test_DEPENDENCIES) $(EXTRA_ags_xml_password_store_test_DEPENDENCIES) @rm -f ags_xml_password_store_test$(EXEEXT) $(AM_V_CCLD)$(ags_xml_password_store_test_LINK) $(ags_xml_password_store_test_OBJECTS) $(ags_xml_password_store_test_LDADD) $(LIBS) ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.$(OBJEXT): \ ags/test/X/$(am__dirstamp) \ ags/test/X/$(DEPDIR)/$(am__dirstamp) ags_xorg_application_context_test$(EXEEXT): $(ags_xorg_application_context_test_OBJECTS) $(ags_xorg_application_context_test_DEPENDENCIES) $(EXTRA_ags_xorg_application_context_test_DEPENDENCIES) @rm -f ags_xorg_application_context_test$(EXEEXT) $(AM_V_CCLD)$(ags_xorg_application_context_test_LINK) $(ags_xorg_application_context_test_OBJECTS) $(ags_xorg_application_context_test_LDADD) $(LIBS) ags/$(am__dirstamp): @$(MKDIR_P) ags @: > ags/$(am__dirstamp) ags/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ags/$(DEPDIR) @: > ags/$(DEPDIR)/$(am__dirstamp) ags/gsequencer-gsequencer_main.$(OBJEXT): ags/$(am__dirstamp) \ ags/$(DEPDIR)/$(am__dirstamp) gsequencer$(EXEEXT): $(gsequencer_OBJECTS) $(gsequencer_DEPENDENCIES) $(EXTRA_gsequencer_DEPENDENCIES) @rm -f gsequencer$(EXEEXT) $(AM_V_CCLD)$(gsequencer_LINK) $(gsequencer_OBJECTS) $(gsequencer_LDADD) $(LIBS) ags/midi2xml-midi2xml_main.$(OBJEXT): ags/$(am__dirstamp) \ ags/$(DEPDIR)/$(am__dirstamp) midi2xml$(EXEEXT): $(midi2xml_OBJECTS) $(midi2xml_DEPENDENCIES) $(EXTRA_midi2xml_DEPENDENCIES) @rm -f midi2xml$(EXEEXT) $(AM_V_CCLD)$(midi2xml_LINK) $(midi2xml_OBJECTS) $(midi2xml_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ags/*.$(OBJEXT) -rm -f ags/X/*.$(OBJEXT) -rm -f ags/X/*.lo -rm -f ags/X/editor/*.$(OBJEXT) -rm -f ags/X/editor/*.lo -rm -f ags/X/export/*.$(OBJEXT) -rm -f ags/X/export/*.lo -rm -f ags/X/file/*.$(OBJEXT) -rm -f ags/X/file/*.lo -rm -f ags/X/import/*.$(OBJEXT) -rm -f ags/X/import/*.lo -rm -f ags/X/machine/*.$(OBJEXT) -rm -f ags/X/machine/*.lo -rm -f ags/X/osc/controller/*.$(OBJEXT) -rm -f ags/X/osc/controller/*.lo -rm -f ags/X/task/*.$(OBJEXT) -rm -f ags/X/task/*.lo -rm -f ags/audio/*.$(OBJEXT) -rm -f ags/audio/*.lo -rm -f ags/audio/audio-unit/*.$(OBJEXT) -rm -f ags/audio/audio-unit/*.lo -rm -f ags/audio/core-audio/*.$(OBJEXT) -rm -f ags/audio/core-audio/*.lo -rm -f ags/audio/file/*.$(OBJEXT) -rm -f ags/audio/file/*.lo -rm -f ags/audio/jack/*.$(OBJEXT) -rm -f ags/audio/jack/*.lo -rm -f ags/audio/midi/*.$(OBJEXT) -rm -f ags/audio/midi/*.lo -rm -f ags/audio/osc/*.$(OBJEXT) -rm -f ags/audio/osc/*.lo -rm -f ags/audio/osc/controller/*.$(OBJEXT) -rm -f ags/audio/osc/controller/*.lo -rm -f ags/audio/osc/xmlrpc/*.$(OBJEXT) -rm -f ags/audio/osc/xmlrpc/*.lo -rm -f ags/audio/pulse/*.$(OBJEXT) -rm -f ags/audio/pulse/*.lo -rm -f ags/audio/recall/*.$(OBJEXT) -rm -f ags/audio/recall/*.lo -rm -f ags/audio/task/*.$(OBJEXT) -rm -f ags/audio/task/*.lo -rm -f ags/audio/thread/*.$(OBJEXT) -rm -f ags/audio/thread/*.lo -rm -f ags/audio/wasapi/*.$(OBJEXT) -rm -f ags/audio/wasapi/*.lo -rm -f ags/file/*.$(OBJEXT) -rm -f ags/file/*.lo -rm -f ags/lib/*.$(OBJEXT) -rm -f ags/lib/*.lo -rm -f ags/object/*.$(OBJEXT) -rm -f ags/object/*.lo -rm -f ags/plugin/*.$(OBJEXT) -rm -f ags/plugin/*.lo -rm -f ags/server/*.$(OBJEXT) -rm -f ags/server/*.lo -rm -f ags/server/controller/*.$(OBJEXT) -rm -f ags/server/controller/*.lo -rm -f ags/server/security/*.$(OBJEXT) -rm -f ags/server/security/*.lo -rm -f ags/test/X/*.$(OBJEXT) -rm -f ags/test/X/*.lo -rm -f ags/test/X/machine/*.$(OBJEXT) -rm -f ags/test/audio/*.$(OBJEXT) -rm -f ags/test/audio/midi/*.$(OBJEXT) -rm -f ags/test/audio/osc/*.$(OBJEXT) -rm -f ags/test/audio/osc/controller/*.$(OBJEXT) -rm -f ags/test/audio/osc/xmlrpc/*.$(OBJEXT) -rm -f ags/test/audio/recall/*.$(OBJEXT) -rm -f ags/test/audio/task/*.$(OBJEXT) -rm -f ags/test/file/*.$(OBJEXT) -rm -f ags/test/lib/*.$(OBJEXT) -rm -f ags/test/object/*.$(OBJEXT) -rm -f ags/test/plugin/*.$(OBJEXT) -rm -f ags/test/server/*.$(OBJEXT) -rm -f ags/test/server/controller/*.$(OBJEXT) -rm -f ags/test/server/security/*.$(OBJEXT) -rm -f ags/test/thread/*.$(OBJEXT) -rm -f ags/thread/*.$(OBJEXT) -rm -f ags/thread/*.lo -rm -f ags/util/*.$(OBJEXT) -rm -f ags/util/*.lo -rm -f ags/vst3-capi/base/source/*.$(OBJEXT) -rm -f ags/vst3-capi/base/source/*.lo -rm -f ags/vst3-capi/pluginterfaces/base/*.$(OBJEXT) -rm -f ags/vst3-capi/pluginterfaces/base/*.lo -rm -f ags/vst3-capi/public.sdk/source/vst/*.$(OBJEXT) -rm -f ags/vst3-capi/public.sdk/source/vst/*.lo -rm -f ags/vst3-capi/util/*.$(OBJEXT) -rm -f ags/vst3-capi/util/*.lo -rm -f ags/widget/*.$(OBJEXT) -rm -f ags/widget/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@ags/$(DEPDIR)/gsequencer-gsequencer_main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/$(DEPDIR)/midi2xml-midi2xml_main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/file/$(DEPDIR)/libags_la-ags_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/file/$(DEPDIR)/libags_la-ags_file_launch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/file/$(DEPDIR)/libags_la-ags_file_link.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_complex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_conversion.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_endian.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_function.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_log.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_regex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_string_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_time.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_turtle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/lib/$(DEPDIR)/libags_la-ags_uuid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_applicable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_application_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_config.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_connectable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_countable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_cursor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_globals.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_main_loop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_marshal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_mutable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_portlet.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_priority.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_seekable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_sequencer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_sound_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_soundcard.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/object/$(DEPDIR)/libags_la-ags_tactable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/$(DEPDIR)/libags_server_la-ags_registry.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/$(DEPDIR)/libags_server_la-ags_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/file/$(DEPDIR)/file_test-ags_file_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/object/$(DEPDIR)/config_test-ags_config_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/$(DEPDIR)/server_test-ags_server_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/util/$(DEPDIR)/libags_la-ags_id_generator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/util/$(DEPDIR)/libags_la-ags_list_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< ags/lib/libags_la-ags_buffer_util.lo: ags/lib/ags_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_buffer_util.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Tpo -c -o ags/lib/libags_la-ags_buffer_util.lo `test -f 'ags/lib/ags_buffer_util.c' || echo '$(srcdir)/'`ags/lib/ags_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Tpo ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_buffer_util.c' object='ags/lib/libags_la-ags_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_buffer_util.lo `test -f 'ags/lib/ags_buffer_util.c' || echo '$(srcdir)/'`ags/lib/ags_buffer_util.c ags/lib/libags_la-ags_complex.lo: ags/lib/ags_complex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_complex.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_complex.Tpo -c -o ags/lib/libags_la-ags_complex.lo `test -f 'ags/lib/ags_complex.c' || echo '$(srcdir)/'`ags/lib/ags_complex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_complex.Tpo ags/lib/$(DEPDIR)/libags_la-ags_complex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_complex.c' object='ags/lib/libags_la-ags_complex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_complex.lo `test -f 'ags/lib/ags_complex.c' || echo '$(srcdir)/'`ags/lib/ags_complex.c ags/lib/libags_la-ags_conversion.lo: ags/lib/ags_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_conversion.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_conversion.Tpo -c -o ags/lib/libags_la-ags_conversion.lo `test -f 'ags/lib/ags_conversion.c' || echo '$(srcdir)/'`ags/lib/ags_conversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_conversion.Tpo ags/lib/$(DEPDIR)/libags_la-ags_conversion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_conversion.c' object='ags/lib/libags_la-ags_conversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_conversion.lo `test -f 'ags/lib/ags_conversion.c' || echo '$(srcdir)/'`ags/lib/ags_conversion.c ags/lib/libags_la-ags_endian.lo: ags/lib/ags_endian.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_endian.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_endian.Tpo -c -o ags/lib/libags_la-ags_endian.lo `test -f 'ags/lib/ags_endian.c' || echo '$(srcdir)/'`ags/lib/ags_endian.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_endian.Tpo ags/lib/$(DEPDIR)/libags_la-ags_endian.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_endian.c' object='ags/lib/libags_la-ags_endian.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_endian.lo `test -f 'ags/lib/ags_endian.c' || echo '$(srcdir)/'`ags/lib/ags_endian.c ags/lib/libags_la-ags_function.lo: ags/lib/ags_function.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_function.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_function.Tpo -c -o ags/lib/libags_la-ags_function.lo `test -f 'ags/lib/ags_function.c' || echo '$(srcdir)/'`ags/lib/ags_function.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_function.Tpo ags/lib/$(DEPDIR)/libags_la-ags_function.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_function.c' object='ags/lib/libags_la-ags_function.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_function.lo `test -f 'ags/lib/ags_function.c' || echo '$(srcdir)/'`ags/lib/ags_function.c ags/lib/libags_la-ags_log.lo: ags/lib/ags_log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_log.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_log.Tpo -c -o ags/lib/libags_la-ags_log.lo `test -f 'ags/lib/ags_log.c' || echo '$(srcdir)/'`ags/lib/ags_log.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_log.Tpo ags/lib/$(DEPDIR)/libags_la-ags_log.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_log.c' object='ags/lib/libags_la-ags_log.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_log.lo `test -f 'ags/lib/ags_log.c' || echo '$(srcdir)/'`ags/lib/ags_log.c ags/lib/libags_la-ags_regex.lo: ags/lib/ags_regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_regex.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_regex.Tpo -c -o ags/lib/libags_la-ags_regex.lo `test -f 'ags/lib/ags_regex.c' || echo '$(srcdir)/'`ags/lib/ags_regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_regex.Tpo ags/lib/$(DEPDIR)/libags_la-ags_regex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_regex.c' object='ags/lib/libags_la-ags_regex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_regex.lo `test -f 'ags/lib/ags_regex.c' || echo '$(srcdir)/'`ags/lib/ags_regex.c ags/lib/libags_la-ags_solver_matrix.lo: ags/lib/ags_solver_matrix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_solver_matrix.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Tpo -c -o ags/lib/libags_la-ags_solver_matrix.lo `test -f 'ags/lib/ags_solver_matrix.c' || echo '$(srcdir)/'`ags/lib/ags_solver_matrix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Tpo ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_solver_matrix.c' object='ags/lib/libags_la-ags_solver_matrix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_solver_matrix.lo `test -f 'ags/lib/ags_solver_matrix.c' || echo '$(srcdir)/'`ags/lib/ags_solver_matrix.c ags/lib/libags_la-ags_solver_vector.lo: ags/lib/ags_solver_vector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_solver_vector.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Tpo -c -o ags/lib/libags_la-ags_solver_vector.lo `test -f 'ags/lib/ags_solver_vector.c' || echo '$(srcdir)/'`ags/lib/ags_solver_vector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Tpo ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_solver_vector.c' object='ags/lib/libags_la-ags_solver_vector.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_solver_vector.lo `test -f 'ags/lib/ags_solver_vector.c' || echo '$(srcdir)/'`ags/lib/ags_solver_vector.c ags/lib/libags_la-ags_string_util.lo: ags/lib/ags_string_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_string_util.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_string_util.Tpo -c -o ags/lib/libags_la-ags_string_util.lo `test -f 'ags/lib/ags_string_util.c' || echo '$(srcdir)/'`ags/lib/ags_string_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_string_util.Tpo ags/lib/$(DEPDIR)/libags_la-ags_string_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_string_util.c' object='ags/lib/libags_la-ags_string_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_string_util.lo `test -f 'ags/lib/ags_string_util.c' || echo '$(srcdir)/'`ags/lib/ags_string_util.c ags/lib/libags_la-ags_time.lo: ags/lib/ags_time.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_time.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_time.Tpo -c -o ags/lib/libags_la-ags_time.lo `test -f 'ags/lib/ags_time.c' || echo '$(srcdir)/'`ags/lib/ags_time.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_time.Tpo ags/lib/$(DEPDIR)/libags_la-ags_time.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_time.c' object='ags/lib/libags_la-ags_time.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_time.lo `test -f 'ags/lib/ags_time.c' || echo '$(srcdir)/'`ags/lib/ags_time.c ags/lib/libags_la-ags_turtle.lo: ags/lib/ags_turtle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_turtle.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_turtle.Tpo -c -o ags/lib/libags_la-ags_turtle.lo `test -f 'ags/lib/ags_turtle.c' || echo '$(srcdir)/'`ags/lib/ags_turtle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_turtle.Tpo ags/lib/$(DEPDIR)/libags_la-ags_turtle.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_turtle.c' object='ags/lib/libags_la-ags_turtle.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_turtle.lo `test -f 'ags/lib/ags_turtle.c' || echo '$(srcdir)/'`ags/lib/ags_turtle.c ags/lib/libags_la-ags_turtle_manager.lo: ags/lib/ags_turtle_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_turtle_manager.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Tpo -c -o ags/lib/libags_la-ags_turtle_manager.lo `test -f 'ags/lib/ags_turtle_manager.c' || echo '$(srcdir)/'`ags/lib/ags_turtle_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Tpo ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_turtle_manager.c' object='ags/lib/libags_la-ags_turtle_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_turtle_manager.lo `test -f 'ags/lib/ags_turtle_manager.c' || echo '$(srcdir)/'`ags/lib/ags_turtle_manager.c ags/lib/libags_la-ags_uuid.lo: ags/lib/ags_uuid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/lib/libags_la-ags_uuid.lo -MD -MP -MF ags/lib/$(DEPDIR)/libags_la-ags_uuid.Tpo -c -o ags/lib/libags_la-ags_uuid.lo `test -f 'ags/lib/ags_uuid.c' || echo '$(srcdir)/'`ags/lib/ags_uuid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/lib/$(DEPDIR)/libags_la-ags_uuid.Tpo ags/lib/$(DEPDIR)/libags_la-ags_uuid.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/lib/ags_uuid.c' object='ags/lib/libags_la-ags_uuid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/lib/libags_la-ags_uuid.lo `test -f 'ags/lib/ags_uuid.c' || echo '$(srcdir)/'`ags/lib/ags_uuid.c ags/util/libags_la-ags_destroy_util.lo: ags/util/ags_destroy_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/util/libags_la-ags_destroy_util.lo -MD -MP -MF ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Tpo -c -o ags/util/libags_la-ags_destroy_util.lo `test -f 'ags/util/ags_destroy_util.c' || echo '$(srcdir)/'`ags/util/ags_destroy_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Tpo ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/util/ags_destroy_util.c' object='ags/util/libags_la-ags_destroy_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/util/libags_la-ags_destroy_util.lo `test -f 'ags/util/ags_destroy_util.c' || echo '$(srcdir)/'`ags/util/ags_destroy_util.c ags/util/libags_la-ags_id_generator.lo: ags/util/ags_id_generator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/util/libags_la-ags_id_generator.lo -MD -MP -MF ags/util/$(DEPDIR)/libags_la-ags_id_generator.Tpo -c -o ags/util/libags_la-ags_id_generator.lo `test -f 'ags/util/ags_id_generator.c' || echo '$(srcdir)/'`ags/util/ags_id_generator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/util/$(DEPDIR)/libags_la-ags_id_generator.Tpo ags/util/$(DEPDIR)/libags_la-ags_id_generator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/util/ags_id_generator.c' object='ags/util/libags_la-ags_id_generator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/util/libags_la-ags_id_generator.lo `test -f 'ags/util/ags_id_generator.c' || echo '$(srcdir)/'`ags/util/ags_id_generator.c ags/util/libags_la-ags_list_util.lo: ags/util/ags_list_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/util/libags_la-ags_list_util.lo -MD -MP -MF ags/util/$(DEPDIR)/libags_la-ags_list_util.Tpo -c -o ags/util/libags_la-ags_list_util.lo `test -f 'ags/util/ags_list_util.c' || echo '$(srcdir)/'`ags/util/ags_list_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/util/$(DEPDIR)/libags_la-ags_list_util.Tpo ags/util/$(DEPDIR)/libags_la-ags_list_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/util/ags_list_util.c' object='ags/util/libags_la-ags_list_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/util/libags_la-ags_list_util.lo `test -f 'ags/util/ags_list_util.c' || echo '$(srcdir)/'`ags/util/ags_list_util.c ags/util/libags_la-ags_soundcard_helper.lo: ags/util/ags_soundcard_helper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/util/libags_la-ags_soundcard_helper.lo -MD -MP -MF ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Tpo -c -o ags/util/libags_la-ags_soundcard_helper.lo `test -f 'ags/util/ags_soundcard_helper.c' || echo '$(srcdir)/'`ags/util/ags_soundcard_helper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Tpo ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/util/ags_soundcard_helper.c' object='ags/util/libags_la-ags_soundcard_helper.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/util/libags_la-ags_soundcard_helper.lo `test -f 'ags/util/ags_soundcard_helper.c' || echo '$(srcdir)/'`ags/util/ags_soundcard_helper.c ags/object/libags_la-ags_applicable.lo: ags/object/ags_applicable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_applicable.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_applicable.Tpo -c -o ags/object/libags_la-ags_applicable.lo `test -f 'ags/object/ags_applicable.c' || echo '$(srcdir)/'`ags/object/ags_applicable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_applicable.Tpo ags/object/$(DEPDIR)/libags_la-ags_applicable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_applicable.c' object='ags/object/libags_la-ags_applicable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_applicable.lo `test -f 'ags/object/ags_applicable.c' || echo '$(srcdir)/'`ags/object/ags_applicable.c ags/object/libags_la-ags_application_context.lo: ags/object/ags_application_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_application_context.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_application_context.Tpo -c -o ags/object/libags_la-ags_application_context.lo `test -f 'ags/object/ags_application_context.c' || echo '$(srcdir)/'`ags/object/ags_application_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_application_context.Tpo ags/object/$(DEPDIR)/libags_la-ags_application_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_application_context.c' object='ags/object/libags_la-ags_application_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_application_context.lo `test -f 'ags/object/ags_application_context.c' || echo '$(srcdir)/'`ags/object/ags_application_context.c ags/object/libags_la-ags_config.lo: ags/object/ags_config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_config.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_config.Tpo -c -o ags/object/libags_la-ags_config.lo `test -f 'ags/object/ags_config.c' || echo '$(srcdir)/'`ags/object/ags_config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_config.Tpo ags/object/$(DEPDIR)/libags_la-ags_config.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_config.c' object='ags/object/libags_la-ags_config.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_config.lo `test -f 'ags/object/ags_config.c' || echo '$(srcdir)/'`ags/object/ags_config.c ags/object/libags_la-ags_connectable.lo: ags/object/ags_connectable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_connectable.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_connectable.Tpo -c -o ags/object/libags_la-ags_connectable.lo `test -f 'ags/object/ags_connectable.c' || echo '$(srcdir)/'`ags/object/ags_connectable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_connectable.Tpo ags/object/$(DEPDIR)/libags_la-ags_connectable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_connectable.c' object='ags/object/libags_la-ags_connectable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_connectable.lo `test -f 'ags/object/ags_connectable.c' || echo '$(srcdir)/'`ags/object/ags_connectable.c ags/object/libags_la-ags_countable.lo: ags/object/ags_countable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_countable.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_countable.Tpo -c -o ags/object/libags_la-ags_countable.lo `test -f 'ags/object/ags_countable.c' || echo '$(srcdir)/'`ags/object/ags_countable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_countable.Tpo ags/object/$(DEPDIR)/libags_la-ags_countable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_countable.c' object='ags/object/libags_la-ags_countable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_countable.lo `test -f 'ags/object/ags_countable.c' || echo '$(srcdir)/'`ags/object/ags_countable.c ags/object/libags_la-ags_cursor.lo: ags/object/ags_cursor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_cursor.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_cursor.Tpo -c -o ags/object/libags_la-ags_cursor.lo `test -f 'ags/object/ags_cursor.c' || echo '$(srcdir)/'`ags/object/ags_cursor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_cursor.Tpo ags/object/$(DEPDIR)/libags_la-ags_cursor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_cursor.c' object='ags/object/libags_la-ags_cursor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_cursor.lo `test -f 'ags/object/ags_cursor.c' || echo '$(srcdir)/'`ags/object/ags_cursor.c ags/object/libags_la-ags_globals.lo: ags/object/ags_globals.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_globals.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_globals.Tpo -c -o ags/object/libags_la-ags_globals.lo `test -f 'ags/object/ags_globals.c' || echo '$(srcdir)/'`ags/object/ags_globals.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_globals.Tpo ags/object/$(DEPDIR)/libags_la-ags_globals.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_globals.c' object='ags/object/libags_la-ags_globals.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_globals.lo `test -f 'ags/object/ags_globals.c' || echo '$(srcdir)/'`ags/object/ags_globals.c ags/object/libags_la-ags_main_loop.lo: ags/object/ags_main_loop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_main_loop.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_main_loop.Tpo -c -o ags/object/libags_la-ags_main_loop.lo `test -f 'ags/object/ags_main_loop.c' || echo '$(srcdir)/'`ags/object/ags_main_loop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_main_loop.Tpo ags/object/$(DEPDIR)/libags_la-ags_main_loop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_main_loop.c' object='ags/object/libags_la-ags_main_loop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_main_loop.lo `test -f 'ags/object/ags_main_loop.c' || echo '$(srcdir)/'`ags/object/ags_main_loop.c ags/object/libags_la-ags_marshal.lo: ags/object/ags_marshal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_marshal.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_marshal.Tpo -c -o ags/object/libags_la-ags_marshal.lo `test -f 'ags/object/ags_marshal.c' || echo '$(srcdir)/'`ags/object/ags_marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_marshal.Tpo ags/object/$(DEPDIR)/libags_la-ags_marshal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_marshal.c' object='ags/object/libags_la-ags_marshal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_marshal.lo `test -f 'ags/object/ags_marshal.c' || echo '$(srcdir)/'`ags/object/ags_marshal.c ags/object/libags_la-ags_mutable.lo: ags/object/ags_mutable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_mutable.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_mutable.Tpo -c -o ags/object/libags_la-ags_mutable.lo `test -f 'ags/object/ags_mutable.c' || echo '$(srcdir)/'`ags/object/ags_mutable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_mutable.Tpo ags/object/$(DEPDIR)/libags_la-ags_mutable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_mutable.c' object='ags/object/libags_la-ags_mutable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_mutable.lo `test -f 'ags/object/ags_mutable.c' || echo '$(srcdir)/'`ags/object/ags_mutable.c ags/object/libags_la-ags_plugin.lo: ags/object/ags_plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_plugin.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_plugin.Tpo -c -o ags/object/libags_la-ags_plugin.lo `test -f 'ags/object/ags_plugin.c' || echo '$(srcdir)/'`ags/object/ags_plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_plugin.Tpo ags/object/$(DEPDIR)/libags_la-ags_plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_plugin.c' object='ags/object/libags_la-ags_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_plugin.lo `test -f 'ags/object/ags_plugin.c' || echo '$(srcdir)/'`ags/object/ags_plugin.c ags/object/libags_la-ags_portlet.lo: ags/object/ags_portlet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_portlet.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_portlet.Tpo -c -o ags/object/libags_la-ags_portlet.lo `test -f 'ags/object/ags_portlet.c' || echo '$(srcdir)/'`ags/object/ags_portlet.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_portlet.Tpo ags/object/$(DEPDIR)/libags_la-ags_portlet.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_portlet.c' object='ags/object/libags_la-ags_portlet.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_portlet.lo `test -f 'ags/object/ags_portlet.c' || echo '$(srcdir)/'`ags/object/ags_portlet.c ags/object/libags_la-ags_priority.lo: ags/object/ags_priority.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_priority.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_priority.Tpo -c -o ags/object/libags_la-ags_priority.lo `test -f 'ags/object/ags_priority.c' || echo '$(srcdir)/'`ags/object/ags_priority.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_priority.Tpo ags/object/$(DEPDIR)/libags_la-ags_priority.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_priority.c' object='ags/object/libags_la-ags_priority.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_priority.lo `test -f 'ags/object/ags_priority.c' || echo '$(srcdir)/'`ags/object/ags_priority.c ags/object/libags_la-ags_seekable.lo: ags/object/ags_seekable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_seekable.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_seekable.Tpo -c -o ags/object/libags_la-ags_seekable.lo `test -f 'ags/object/ags_seekable.c' || echo '$(srcdir)/'`ags/object/ags_seekable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_seekable.Tpo ags/object/$(DEPDIR)/libags_la-ags_seekable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_seekable.c' object='ags/object/libags_la-ags_seekable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_seekable.lo `test -f 'ags/object/ags_seekable.c' || echo '$(srcdir)/'`ags/object/ags_seekable.c ags/object/libags_la-ags_sequencer.lo: ags/object/ags_sequencer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_sequencer.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_sequencer.Tpo -c -o ags/object/libags_la-ags_sequencer.lo `test -f 'ags/object/ags_sequencer.c' || echo '$(srcdir)/'`ags/object/ags_sequencer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_sequencer.Tpo ags/object/$(DEPDIR)/libags_la-ags_sequencer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_sequencer.c' object='ags/object/libags_la-ags_sequencer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_sequencer.lo `test -f 'ags/object/ags_sequencer.c' || echo '$(srcdir)/'`ags/object/ags_sequencer.c ags/object/libags_la-ags_soundcard.lo: ags/object/ags_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_soundcard.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_soundcard.Tpo -c -o ags/object/libags_la-ags_soundcard.lo `test -f 'ags/object/ags_soundcard.c' || echo '$(srcdir)/'`ags/object/ags_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_soundcard.Tpo ags/object/$(DEPDIR)/libags_la-ags_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_soundcard.c' object='ags/object/libags_la-ags_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_soundcard.lo `test -f 'ags/object/ags_soundcard.c' || echo '$(srcdir)/'`ags/object/ags_soundcard.c ags/object/libags_la-ags_sound_server.lo: ags/object/ags_sound_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_sound_server.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_sound_server.Tpo -c -o ags/object/libags_la-ags_sound_server.lo `test -f 'ags/object/ags_sound_server.c' || echo '$(srcdir)/'`ags/object/ags_sound_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_sound_server.Tpo ags/object/$(DEPDIR)/libags_la-ags_sound_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_sound_server.c' object='ags/object/libags_la-ags_sound_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_sound_server.lo `test -f 'ags/object/ags_sound_server.c' || echo '$(srcdir)/'`ags/object/ags_sound_server.c ags/object/libags_la-ags_tactable.lo: ags/object/ags_tactable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/object/libags_la-ags_tactable.lo -MD -MP -MF ags/object/$(DEPDIR)/libags_la-ags_tactable.Tpo -c -o ags/object/libags_la-ags_tactable.lo `test -f 'ags/object/ags_tactable.c' || echo '$(srcdir)/'`ags/object/ags_tactable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/object/$(DEPDIR)/libags_la-ags_tactable.Tpo ags/object/$(DEPDIR)/libags_la-ags_tactable.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/object/ags_tactable.c' object='ags/object/libags_la-ags_tactable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/object/libags_la-ags_tactable.lo `test -f 'ags/object/ags_tactable.c' || echo '$(srcdir)/'`ags/object/ags_tactable.c ags/file/libags_la-ags_file.lo: ags/file/ags_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/file/libags_la-ags_file.lo -MD -MP -MF ags/file/$(DEPDIR)/libags_la-ags_file.Tpo -c -o ags/file/libags_la-ags_file.lo `test -f 'ags/file/ags_file.c' || echo '$(srcdir)/'`ags/file/ags_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/file/$(DEPDIR)/libags_la-ags_file.Tpo ags/file/$(DEPDIR)/libags_la-ags_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/file/ags_file.c' object='ags/file/libags_la-ags_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/file/libags_la-ags_file.lo `test -f 'ags/file/ags_file.c' || echo '$(srcdir)/'`ags/file/ags_file.c ags/file/libags_la-ags_file_id_ref.lo: ags/file/ags_file_id_ref.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/file/libags_la-ags_file_id_ref.lo -MD -MP -MF ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Tpo -c -o ags/file/libags_la-ags_file_id_ref.lo `test -f 'ags/file/ags_file_id_ref.c' || echo '$(srcdir)/'`ags/file/ags_file_id_ref.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Tpo ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/file/ags_file_id_ref.c' object='ags/file/libags_la-ags_file_id_ref.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/file/libags_la-ags_file_id_ref.lo `test -f 'ags/file/ags_file_id_ref.c' || echo '$(srcdir)/'`ags/file/ags_file_id_ref.c ags/file/libags_la-ags_file_launch.lo: ags/file/ags_file_launch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/file/libags_la-ags_file_launch.lo -MD -MP -MF ags/file/$(DEPDIR)/libags_la-ags_file_launch.Tpo -c -o ags/file/libags_la-ags_file_launch.lo `test -f 'ags/file/ags_file_launch.c' || echo '$(srcdir)/'`ags/file/ags_file_launch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/file/$(DEPDIR)/libags_la-ags_file_launch.Tpo ags/file/$(DEPDIR)/libags_la-ags_file_launch.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/file/ags_file_launch.c' object='ags/file/libags_la-ags_file_launch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/file/libags_la-ags_file_launch.lo `test -f 'ags/file/ags_file_launch.c' || echo '$(srcdir)/'`ags/file/ags_file_launch.c ags/file/libags_la-ags_file_link.lo: ags/file/ags_file_link.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/file/libags_la-ags_file_link.lo -MD -MP -MF ags/file/$(DEPDIR)/libags_la-ags_file_link.Tpo -c -o ags/file/libags_la-ags_file_link.lo `test -f 'ags/file/ags_file_link.c' || echo '$(srcdir)/'`ags/file/ags_file_link.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/file/$(DEPDIR)/libags_la-ags_file_link.Tpo ags/file/$(DEPDIR)/libags_la-ags_file_link.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/file/ags_file_link.c' object='ags/file/libags_la-ags_file_link.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/file/libags_la-ags_file_link.lo `test -f 'ags/file/ags_file_link.c' || echo '$(srcdir)/'`ags/file/ags_file_link.c ags/file/libags_la-ags_file_lookup.lo: ags/file/ags_file_lookup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -MT ags/file/libags_la-ags_file_lookup.lo -MD -MP -MF ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Tpo -c -o ags/file/libags_la-ags_file_lookup.lo `test -f 'ags/file/ags_file_lookup.c' || echo '$(srcdir)/'`ags/file/ags_file_lookup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Tpo ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/file/ags_file_lookup.c' object='ags/file/libags_la-ags_file_lookup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_la_CFLAGS) $(CFLAGS) -c -o ags/file/libags_la-ags_file_lookup.lo `test -f 'ags/file/ags_file_lookup.c' || echo '$(srcdir)/'`ags/file/ags_file_lookup.c ags/audio/libags_audio_la-ags_acceleration.lo: ags/audio/ags_acceleration.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_acceleration.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Tpo -c -o ags/audio/libags_audio_la-ags_acceleration.lo `test -f 'ags/audio/ags_acceleration.c' || echo '$(srcdir)/'`ags/audio/ags_acceleration.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_acceleration.c' object='ags/audio/libags_audio_la-ags_acceleration.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_acceleration.lo `test -f 'ags/audio/ags_acceleration.c' || echo '$(srcdir)/'`ags/audio/ags_acceleration.c ags/audio/libags_audio_la-ags_audio.lo: ags/audio/ags_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_audio.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Tpo -c -o ags/audio/libags_audio_la-ags_audio.lo `test -f 'ags/audio/ags_audio.c' || echo '$(srcdir)/'`ags/audio/ags_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_audio.c' object='ags/audio/libags_audio_la-ags_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_audio.lo `test -f 'ags/audio/ags_audio.c' || echo '$(srcdir)/'`ags/audio/ags_audio.c ags/audio/libags_audio_la-ags_audio_application_context.lo: ags/audio/ags_audio_application_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_audio_application_context.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Tpo -c -o ags/audio/libags_audio_la-ags_audio_application_context.lo `test -f 'ags/audio/ags_audio_application_context.c' || echo '$(srcdir)/'`ags/audio/ags_audio_application_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_audio_application_context.c' object='ags/audio/libags_audio_la-ags_audio_application_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_audio_application_context.lo `test -f 'ags/audio/ags_audio_application_context.c' || echo '$(srcdir)/'`ags/audio/ags_audio_application_context.c ags/audio/libags_audio_la-ags_audio_buffer_util.lo: ags/audio/ags_audio_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_audio_buffer_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Tpo -c -o ags/audio/libags_audio_la-ags_audio_buffer_util.lo `test -f 'ags/audio/ags_audio_buffer_util.c' || echo '$(srcdir)/'`ags/audio/ags_audio_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_audio_buffer_util.c' object='ags/audio/libags_audio_la-ags_audio_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_audio_buffer_util.lo `test -f 'ags/audio/ags_audio_buffer_util.c' || echo '$(srcdir)/'`ags/audio/ags_audio_buffer_util.c ags/audio/libags_audio_la-ags_audio_signal.lo: ags/audio/ags_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_audio_signal.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Tpo -c -o ags/audio/libags_audio_la-ags_audio_signal.lo `test -f 'ags/audio/ags_audio_signal.c' || echo '$(srcdir)/'`ags/audio/ags_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_audio_signal.c' object='ags/audio/libags_audio_la-ags_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_audio_signal.lo `test -f 'ags/audio/ags_audio_signal.c' || echo '$(srcdir)/'`ags/audio/ags_audio_signal.c ags/audio/libags_audio_la-ags_automation.lo: ags/audio/ags_automation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_automation.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Tpo -c -o ags/audio/libags_audio_la-ags_automation.lo `test -f 'ags/audio/ags_automation.c' || echo '$(srcdir)/'`ags/audio/ags_automation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_automation.c' object='ags/audio/libags_audio_la-ags_automation.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_automation.lo `test -f 'ags/audio/ags_automation.c' || echo '$(srcdir)/'`ags/audio/ags_automation.c ags/audio/libags_audio_la-ags_buffer.lo: ags/audio/ags_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_buffer.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Tpo -c -o ags/audio/libags_audio_la-ags_buffer.lo `test -f 'ags/audio/ags_buffer.c' || echo '$(srcdir)/'`ags/audio/ags_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_buffer.c' object='ags/audio/libags_audio_la-ags_buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_buffer.lo `test -f 'ags/audio/ags_buffer.c' || echo '$(srcdir)/'`ags/audio/ags_buffer.c ags/audio/libags_audio_la-ags_channel.lo: ags/audio/ags_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_channel.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Tpo -c -o ags/audio/libags_audio_la-ags_channel.lo `test -f 'ags/audio/ags_channel.c' || echo '$(srcdir)/'`ags/audio/ags_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_channel.c' object='ags/audio/libags_audio_la-ags_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_channel.lo `test -f 'ags/audio/ags_channel.c' || echo '$(srcdir)/'`ags/audio/ags_channel.c ags/audio/libags_audio_la-ags_char_buffer_util.lo: ags/audio/ags_char_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_char_buffer_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Tpo -c -o ags/audio/libags_audio_la-ags_char_buffer_util.lo `test -f 'ags/audio/ags_char_buffer_util.c' || echo '$(srcdir)/'`ags/audio/ags_char_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_char_buffer_util.c' object='ags/audio/libags_audio_la-ags_char_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_char_buffer_util.lo `test -f 'ags/audio/ags_char_buffer_util.c' || echo '$(srcdir)/'`ags/audio/ags_char_buffer_util.c ags/audio/libags_audio_la-ags_devout.lo: ags/audio/ags_devout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_devout.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Tpo -c -o ags/audio/libags_audio_la-ags_devout.lo `test -f 'ags/audio/ags_devout.c' || echo '$(srcdir)/'`ags/audio/ags_devout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_devout.c' object='ags/audio/libags_audio_la-ags_devout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_devout.lo `test -f 'ags/audio/ags_devout.c' || echo '$(srcdir)/'`ags/audio/ags_devout.c ags/audio/libags_audio_la-ags_devin.lo: ags/audio/ags_devin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_devin.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Tpo -c -o ags/audio/libags_audio_la-ags_devin.lo `test -f 'ags/audio/ags_devin.c' || echo '$(srcdir)/'`ags/audio/ags_devin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_devin.c' object='ags/audio/libags_audio_la-ags_devin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_devin.lo `test -f 'ags/audio/ags_devin.c' || echo '$(srcdir)/'`ags/audio/ags_devin.c ags/audio/libags_audio_la-ags_diatonic_scale.lo: ags/audio/ags_diatonic_scale.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_diatonic_scale.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Tpo -c -o ags/audio/libags_audio_la-ags_diatonic_scale.lo `test -f 'ags/audio/ags_diatonic_scale.c' || echo '$(srcdir)/'`ags/audio/ags_diatonic_scale.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_diatonic_scale.c' object='ags/audio/libags_audio_la-ags_diatonic_scale.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_diatonic_scale.lo `test -f 'ags/audio/ags_diatonic_scale.c' || echo '$(srcdir)/'`ags/audio/ags_diatonic_scale.c ags/audio/libags_audio_la-ags_input.lo: ags/audio/ags_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_input.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Tpo -c -o ags/audio/libags_audio_la-ags_input.lo `test -f 'ags/audio/ags_input.c' || echo '$(srcdir)/'`ags/audio/ags_input.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_input.c' object='ags/audio/libags_audio_la-ags_input.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_input.lo `test -f 'ags/audio/ags_input.c' || echo '$(srcdir)/'`ags/audio/ags_input.c ags/audio/libags_audio_la-ags_filter_util.lo: ags/audio/ags_filter_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_filter_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Tpo -c -o ags/audio/libags_audio_la-ags_filter_util.lo `test -f 'ags/audio/ags_filter_util.c' || echo '$(srcdir)/'`ags/audio/ags_filter_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_filter_util.c' object='ags/audio/libags_audio_la-ags_filter_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_filter_util.lo `test -f 'ags/audio/ags_filter_util.c' || echo '$(srcdir)/'`ags/audio/ags_filter_util.c ags/audio/libags_audio_la-ags_fifoout.lo: ags/audio/ags_fifoout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_fifoout.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Tpo -c -o ags/audio/libags_audio_la-ags_fifoout.lo `test -f 'ags/audio/ags_fifoout.c' || echo '$(srcdir)/'`ags/audio/ags_fifoout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_fifoout.c' object='ags/audio/libags_audio_la-ags_fifoout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_fifoout.lo `test -f 'ags/audio/ags_fifoout.c' || echo '$(srcdir)/'`ags/audio/ags_fifoout.c ags/audio/libags_audio_la-ags_fm_synth_util.lo: ags/audio/ags_fm_synth_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_fm_synth_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Tpo -c -o ags/audio/libags_audio_la-ags_fm_synth_util.lo `test -f 'ags/audio/ags_fm_synth_util.c' || echo '$(srcdir)/'`ags/audio/ags_fm_synth_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_fm_synth_util.c' object='ags/audio/libags_audio_la-ags_fm_synth_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_fm_synth_util.lo `test -f 'ags/audio/ags_fm_synth_util.c' || echo '$(srcdir)/'`ags/audio/ags_fm_synth_util.c ags/audio/libags_audio_la-ags_fourier_transform_util.lo: ags/audio/ags_fourier_transform_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_fourier_transform_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Tpo -c -o ags/audio/libags_audio_la-ags_fourier_transform_util.lo `test -f 'ags/audio/ags_fourier_transform_util.c' || echo '$(srcdir)/'`ags/audio/ags_fourier_transform_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_fourier_transform_util.c' object='ags/audio/libags_audio_la-ags_fourier_transform_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_fourier_transform_util.lo `test -f 'ags/audio/ags_fourier_transform_util.c' || echo '$(srcdir)/'`ags/audio/ags_fourier_transform_util.c ags/audio/libags_audio_la-ags_frequency_map.lo: ags/audio/ags_frequency_map.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_frequency_map.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Tpo -c -o ags/audio/libags_audio_la-ags_frequency_map.lo `test -f 'ags/audio/ags_frequency_map.c' || echo '$(srcdir)/'`ags/audio/ags_frequency_map.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_frequency_map.c' object='ags/audio/libags_audio_la-ags_frequency_map.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_frequency_map.lo `test -f 'ags/audio/ags_frequency_map.c' || echo '$(srcdir)/'`ags/audio/ags_frequency_map.c ags/audio/libags_audio_la-ags_frequency_map_manager.lo: ags/audio/ags_frequency_map_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_frequency_map_manager.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Tpo -c -o ags/audio/libags_audio_la-ags_frequency_map_manager.lo `test -f 'ags/audio/ags_frequency_map_manager.c' || echo '$(srcdir)/'`ags/audio/ags_frequency_map_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_frequency_map_manager.c' object='ags/audio/libags_audio_la-ags_frequency_map_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_frequency_map_manager.lo `test -f 'ags/audio/ags_frequency_map_manager.c' || echo '$(srcdir)/'`ags/audio/ags_frequency_map_manager.c ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo: ags/audio/ags_generic_recall_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Tpo -c -o ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo `test -f 'ags/audio/ags_generic_recall_channel_run.c' || echo '$(srcdir)/'`ags/audio/ags_generic_recall_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_generic_recall_channel_run.c' object='ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_generic_recall_channel_run.lo `test -f 'ags/audio/ags_generic_recall_channel_run.c' || echo '$(srcdir)/'`ags/audio/ags_generic_recall_channel_run.c ags/audio/libags_audio_la-ags_generic_recall_recycling.lo: ags/audio/ags_generic_recall_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_generic_recall_recycling.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Tpo -c -o ags/audio/libags_audio_la-ags_generic_recall_recycling.lo `test -f 'ags/audio/ags_generic_recall_recycling.c' || echo '$(srcdir)/'`ags/audio/ags_generic_recall_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_generic_recall_recycling.c' object='ags/audio/libags_audio_la-ags_generic_recall_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_generic_recall_recycling.lo `test -f 'ags/audio/ags_generic_recall_recycling.c' || echo '$(srcdir)/'`ags/audio/ags_generic_recall_recycling.c ags/audio/libags_audio_la-ags_lfo_synth_util.lo: ags/audio/ags_lfo_synth_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_lfo_synth_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Tpo -c -o ags/audio/libags_audio_la-ags_lfo_synth_util.lo `test -f 'ags/audio/ags_lfo_synth_util.c' || echo '$(srcdir)/'`ags/audio/ags_lfo_synth_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_lfo_synth_util.c' object='ags/audio/libags_audio_la-ags_lfo_synth_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_lfo_synth_util.lo `test -f 'ags/audio/ags_lfo_synth_util.c' || echo '$(srcdir)/'`ags/audio/ags_lfo_synth_util.c ags/audio/libags_audio_la-ags_midi.lo: ags/audio/ags_midi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_midi.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Tpo -c -o ags/audio/libags_audio_la-ags_midi.lo `test -f 'ags/audio/ags_midi.c' || echo '$(srcdir)/'`ags/audio/ags_midi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_midi.c' object='ags/audio/libags_audio_la-ags_midi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_midi.lo `test -f 'ags/audio/ags_midi.c' || echo '$(srcdir)/'`ags/audio/ags_midi.c ags/audio/libags_audio_la-ags_midiin.lo: ags/audio/ags_midiin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_midiin.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Tpo -c -o ags/audio/libags_audio_la-ags_midiin.lo `test -f 'ags/audio/ags_midiin.c' || echo '$(srcdir)/'`ags/audio/ags_midiin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_midiin.c' object='ags/audio/libags_audio_la-ags_midiin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_midiin.lo `test -f 'ags/audio/ags_midiin.c' || echo '$(srcdir)/'`ags/audio/ags_midiin.c ags/audio/libags_audio_la-ags_notation.lo: ags/audio/ags_notation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_notation.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Tpo -c -o ags/audio/libags_audio_la-ags_notation.lo `test -f 'ags/audio/ags_notation.c' || echo '$(srcdir)/'`ags/audio/ags_notation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_notation.c' object='ags/audio/libags_audio_la-ags_notation.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_notation.lo `test -f 'ags/audio/ags_notation.c' || echo '$(srcdir)/'`ags/audio/ags_notation.c ags/audio/libags_audio_la-ags_note.lo: ags/audio/ags_note.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_note.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Tpo -c -o ags/audio/libags_audio_la-ags_note.lo `test -f 'ags/audio/ags_note.c' || echo '$(srcdir)/'`ags/audio/ags_note.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_note.c' object='ags/audio/libags_audio_la-ags_note.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_note.lo `test -f 'ags/audio/ags_note.c' || echo '$(srcdir)/'`ags/audio/ags_note.c ags/audio/libags_audio_la-ags_output.lo: ags/audio/ags_output.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_output.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Tpo -c -o ags/audio/libags_audio_la-ags_output.lo `test -f 'ags/audio/ags_output.c' || echo '$(srcdir)/'`ags/audio/ags_output.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_output.c' object='ags/audio/libags_audio_la-ags_output.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_output.lo `test -f 'ags/audio/ags_output.c' || echo '$(srcdir)/'`ags/audio/ags_output.c ags/audio/libags_audio_la-ags_pattern.lo: ags/audio/ags_pattern.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_pattern.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Tpo -c -o ags/audio/libags_audio_la-ags_pattern.lo `test -f 'ags/audio/ags_pattern.c' || echo '$(srcdir)/'`ags/audio/ags_pattern.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_pattern.c' object='ags/audio/libags_audio_la-ags_pattern.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_pattern.lo `test -f 'ags/audio/ags_pattern.c' || echo '$(srcdir)/'`ags/audio/ags_pattern.c ags/audio/libags_audio_la-ags_playback.lo: ags/audio/ags_playback.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_playback.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Tpo -c -o ags/audio/libags_audio_la-ags_playback.lo `test -f 'ags/audio/ags_playback.c' || echo '$(srcdir)/'`ags/audio/ags_playback.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_playback.c' object='ags/audio/libags_audio_la-ags_playback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_playback.lo `test -f 'ags/audio/ags_playback.c' || echo '$(srcdir)/'`ags/audio/ags_playback.c ags/audio/libags_audio_la-ags_playback_domain.lo: ags/audio/ags_playback_domain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_playback_domain.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Tpo -c -o ags/audio/libags_audio_la-ags_playback_domain.lo `test -f 'ags/audio/ags_playback_domain.c' || echo '$(srcdir)/'`ags/audio/ags_playback_domain.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_playback_domain.c' object='ags/audio/libags_audio_la-ags_playback_domain.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_playback_domain.lo `test -f 'ags/audio/ags_playback_domain.c' || echo '$(srcdir)/'`ags/audio/ags_playback_domain.c ags/audio/libags_audio_la-ags_port.lo: ags/audio/ags_port.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_port.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Tpo -c -o ags/audio/libags_audio_la-ags_port.lo `test -f 'ags/audio/ags_port.c' || echo '$(srcdir)/'`ags/audio/ags_port.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_port.c' object='ags/audio/libags_audio_la-ags_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_port.lo `test -f 'ags/audio/ags_port.c' || echo '$(srcdir)/'`ags/audio/ags_port.c ags/audio/libags_audio_la-ags_preset.lo: ags/audio/ags_preset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_preset.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Tpo -c -o ags/audio/libags_audio_la-ags_preset.lo `test -f 'ags/audio/ags_preset.c' || echo '$(srcdir)/'`ags/audio/ags_preset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_preset.c' object='ags/audio/libags_audio_la-ags_preset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_preset.lo `test -f 'ags/audio/ags_preset.c' || echo '$(srcdir)/'`ags/audio/ags_preset.c ags/audio/libags_audio_la-ags_recall_audio.lo: ags/audio/ags_recall_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_audio.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Tpo -c -o ags/audio/libags_audio_la-ags_recall_audio.lo `test -f 'ags/audio/ags_recall_audio.c' || echo '$(srcdir)/'`ags/audio/ags_recall_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_audio.c' object='ags/audio/libags_audio_la-ags_recall_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_audio.lo `test -f 'ags/audio/ags_recall_audio.c' || echo '$(srcdir)/'`ags/audio/ags_recall_audio.c ags/audio/libags_audio_la-ags_recall_audio_run.lo: ags/audio/ags_recall_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_audio_run.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Tpo -c -o ags/audio/libags_audio_la-ags_recall_audio_run.lo `test -f 'ags/audio/ags_recall_audio_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_audio_run.c' object='ags/audio/libags_audio_la-ags_recall_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_audio_run.lo `test -f 'ags/audio/ags_recall_audio_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_audio_run.c ags/audio/libags_audio_la-ags_recall_audio_signal.lo: ags/audio/ags_recall_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_audio_signal.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Tpo -c -o ags/audio/libags_audio_la-ags_recall_audio_signal.lo `test -f 'ags/audio/ags_recall_audio_signal.c' || echo '$(srcdir)/'`ags/audio/ags_recall_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_audio_signal.c' object='ags/audio/libags_audio_la-ags_recall_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_audio_signal.lo `test -f 'ags/audio/ags_recall_audio_signal.c' || echo '$(srcdir)/'`ags/audio/ags_recall_audio_signal.c ags/audio/libags_audio_la-ags_recall.lo: ags/audio/ags_recall.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Tpo -c -o ags/audio/libags_audio_la-ags_recall.lo `test -f 'ags/audio/ags_recall.c' || echo '$(srcdir)/'`ags/audio/ags_recall.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall.c' object='ags/audio/libags_audio_la-ags_recall.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall.lo `test -f 'ags/audio/ags_recall.c' || echo '$(srcdir)/'`ags/audio/ags_recall.c ags/audio/libags_audio_la-ags_recall_channel.lo: ags/audio/ags_recall_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_channel.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Tpo -c -o ags/audio/libags_audio_la-ags_recall_channel.lo `test -f 'ags/audio/ags_recall_channel.c' || echo '$(srcdir)/'`ags/audio/ags_recall_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_channel.c' object='ags/audio/libags_audio_la-ags_recall_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_channel.lo `test -f 'ags/audio/ags_recall_channel.c' || echo '$(srcdir)/'`ags/audio/ags_recall_channel.c ags/audio/libags_audio_la-ags_recall_channel_run.lo: ags/audio/ags_recall_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_channel_run.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Tpo -c -o ags/audio/libags_audio_la-ags_recall_channel_run.lo `test -f 'ags/audio/ags_recall_channel_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_channel_run.c' object='ags/audio/libags_audio_la-ags_recall_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_channel_run.lo `test -f 'ags/audio/ags_recall_channel_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_channel_run.c ags/audio/libags_audio_la-ags_recall_container.lo: ags/audio/ags_recall_container.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_container.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Tpo -c -o ags/audio/libags_audio_la-ags_recall_container.lo `test -f 'ags/audio/ags_recall_container.c' || echo '$(srcdir)/'`ags/audio/ags_recall_container.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_container.c' object='ags/audio/libags_audio_la-ags_recall_container.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_container.lo `test -f 'ags/audio/ags_recall_container.c' || echo '$(srcdir)/'`ags/audio/ags_recall_container.c ags/audio/libags_audio_la-ags_recall_dependency.lo: ags/audio/ags_recall_dependency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_dependency.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Tpo -c -o ags/audio/libags_audio_la-ags_recall_dependency.lo `test -f 'ags/audio/ags_recall_dependency.c' || echo '$(srcdir)/'`ags/audio/ags_recall_dependency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_dependency.c' object='ags/audio/libags_audio_la-ags_recall_dependency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_dependency.lo `test -f 'ags/audio/ags_recall_dependency.c' || echo '$(srcdir)/'`ags/audio/ags_recall_dependency.c ags/audio/libags_audio_la-ags_recall_factory.lo: ags/audio/ags_recall_factory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_factory.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Tpo -c -o ags/audio/libags_audio_la-ags_recall_factory.lo `test -f 'ags/audio/ags_recall_factory.c' || echo '$(srcdir)/'`ags/audio/ags_recall_factory.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_factory.c' object='ags/audio/libags_audio_la-ags_recall_factory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_factory.lo `test -f 'ags/audio/ags_recall_factory.c' || echo '$(srcdir)/'`ags/audio/ags_recall_factory.c ags/audio/libags_audio_la-ags_recall_dssi.lo: ags/audio/ags_recall_dssi.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_dssi.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Tpo -c -o ags/audio/libags_audio_la-ags_recall_dssi.lo `test -f 'ags/audio/ags_recall_dssi.c' || echo '$(srcdir)/'`ags/audio/ags_recall_dssi.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_dssi.c' object='ags/audio/libags_audio_la-ags_recall_dssi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_dssi.lo `test -f 'ags/audio/ags_recall_dssi.c' || echo '$(srcdir)/'`ags/audio/ags_recall_dssi.c ags/audio/libags_audio_la-ags_recall_dssi_run.lo: ags/audio/ags_recall_dssi_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_dssi_run.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Tpo -c -o ags/audio/libags_audio_la-ags_recall_dssi_run.lo `test -f 'ags/audio/ags_recall_dssi_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_dssi_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_dssi_run.c' object='ags/audio/libags_audio_la-ags_recall_dssi_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_dssi_run.lo `test -f 'ags/audio/ags_recall_dssi_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_dssi_run.c ags/audio/libags_audio_la-ags_recall_id.lo: ags/audio/ags_recall_id.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_id.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Tpo -c -o ags/audio/libags_audio_la-ags_recall_id.lo `test -f 'ags/audio/ags_recall_id.c' || echo '$(srcdir)/'`ags/audio/ags_recall_id.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_id.c' object='ags/audio/libags_audio_la-ags_recall_id.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_id.lo `test -f 'ags/audio/ags_recall_id.c' || echo '$(srcdir)/'`ags/audio/ags_recall_id.c ags/audio/libags_audio_la-ags_recall_ladspa.lo: ags/audio/ags_recall_ladspa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_ladspa.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Tpo -c -o ags/audio/libags_audio_la-ags_recall_ladspa.lo `test -f 'ags/audio/ags_recall_ladspa.c' || echo '$(srcdir)/'`ags/audio/ags_recall_ladspa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_ladspa.c' object='ags/audio/libags_audio_la-ags_recall_ladspa.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_ladspa.lo `test -f 'ags/audio/ags_recall_ladspa.c' || echo '$(srcdir)/'`ags/audio/ags_recall_ladspa.c ags/audio/libags_audio_la-ags_recall_ladspa_run.lo: ags/audio/ags_recall_ladspa_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_ladspa_run.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Tpo -c -o ags/audio/libags_audio_la-ags_recall_ladspa_run.lo `test -f 'ags/audio/ags_recall_ladspa_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_ladspa_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_ladspa_run.c' object='ags/audio/libags_audio_la-ags_recall_ladspa_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_ladspa_run.lo `test -f 'ags/audio/ags_recall_ladspa_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_ladspa_run.c ags/audio/libags_audio_la-ags_recall_lv2.lo: ags/audio/ags_recall_lv2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_lv2.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Tpo -c -o ags/audio/libags_audio_la-ags_recall_lv2.lo `test -f 'ags/audio/ags_recall_lv2.c' || echo '$(srcdir)/'`ags/audio/ags_recall_lv2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_lv2.c' object='ags/audio/libags_audio_la-ags_recall_lv2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_lv2.lo `test -f 'ags/audio/ags_recall_lv2.c' || echo '$(srcdir)/'`ags/audio/ags_recall_lv2.c ags/audio/libags_audio_la-ags_recall_lv2_run.lo: ags/audio/ags_recall_lv2_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_lv2_run.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Tpo -c -o ags/audio/libags_audio_la-ags_recall_lv2_run.lo `test -f 'ags/audio/ags_recall_lv2_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_lv2_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_lv2_run.c' object='ags/audio/libags_audio_la-ags_recall_lv2_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_lv2_run.lo `test -f 'ags/audio/ags_recall_lv2_run.c' || echo '$(srcdir)/'`ags/audio/ags_recall_lv2_run.c ags/audio/libags_audio_la-ags_recall_recycling.lo: ags/audio/ags_recall_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recall_recycling.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Tpo -c -o ags/audio/libags_audio_la-ags_recall_recycling.lo `test -f 'ags/audio/ags_recall_recycling.c' || echo '$(srcdir)/'`ags/audio/ags_recall_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recall_recycling.c' object='ags/audio/libags_audio_la-ags_recall_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recall_recycling.lo `test -f 'ags/audio/ags_recall_recycling.c' || echo '$(srcdir)/'`ags/audio/ags_recall_recycling.c ags/audio/libags_audio_la-ags_recycling.lo: ags/audio/ags_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recycling.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Tpo -c -o ags/audio/libags_audio_la-ags_recycling.lo `test -f 'ags/audio/ags_recycling.c' || echo '$(srcdir)/'`ags/audio/ags_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recycling.c' object='ags/audio/libags_audio_la-ags_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recycling.lo `test -f 'ags/audio/ags_recycling.c' || echo '$(srcdir)/'`ags/audio/ags_recycling.c ags/audio/libags_audio_la-ags_recycling_context.lo: ags/audio/ags_recycling_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_recycling_context.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Tpo -c -o ags/audio/libags_audio_la-ags_recycling_context.lo `test -f 'ags/audio/ags_recycling_context.c' || echo '$(srcdir)/'`ags/audio/ags_recycling_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_recycling_context.c' object='ags/audio/libags_audio_la-ags_recycling_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_recycling_context.lo `test -f 'ags/audio/ags_recycling_context.c' || echo '$(srcdir)/'`ags/audio/ags_recycling_context.c ags/audio/libags_audio_la-ags_sound_provider.lo: ags/audio/ags_sound_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_sound_provider.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Tpo -c -o ags/audio/libags_audio_la-ags_sound_provider.lo `test -f 'ags/audio/ags_sound_provider.c' || echo '$(srcdir)/'`ags/audio/ags_sound_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_sound_provider.c' object='ags/audio/libags_audio_la-ags_sound_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_sound_provider.lo `test -f 'ags/audio/ags_sound_provider.c' || echo '$(srcdir)/'`ags/audio/ags_sound_provider.c ags/audio/libags_audio_la-ags_sequencer_util.lo: ags/audio/ags_sequencer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_sequencer_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Tpo -c -o ags/audio/libags_audio_la-ags_sequencer_util.lo `test -f 'ags/audio/ags_sequencer_util.c' || echo '$(srcdir)/'`ags/audio/ags_sequencer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_sequencer_util.c' object='ags/audio/libags_audio_la-ags_sequencer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_sequencer_util.lo `test -f 'ags/audio/ags_sequencer_util.c' || echo '$(srcdir)/'`ags/audio/ags_sequencer_util.c ags/audio/libags_audio_la-ags_soundcard_util.lo: ags/audio/ags_soundcard_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_soundcard_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Tpo -c -o ags/audio/libags_audio_la-ags_soundcard_util.lo `test -f 'ags/audio/ags_soundcard_util.c' || echo '$(srcdir)/'`ags/audio/ags_soundcard_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_soundcard_util.c' object='ags/audio/libags_audio_la-ags_soundcard_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_soundcard_util.lo `test -f 'ags/audio/ags_soundcard_util.c' || echo '$(srcdir)/'`ags/audio/ags_soundcard_util.c ags/audio/libags_audio_la-ags_synth_generator.lo: ags/audio/ags_synth_generator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_synth_generator.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Tpo -c -o ags/audio/libags_audio_la-ags_synth_generator.lo `test -f 'ags/audio/ags_synth_generator.c' || echo '$(srcdir)/'`ags/audio/ags_synth_generator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_synth_generator.c' object='ags/audio/libags_audio_la-ags_synth_generator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_synth_generator.lo `test -f 'ags/audio/ags_synth_generator.c' || echo '$(srcdir)/'`ags/audio/ags_synth_generator.c ags/audio/libags_audio_la-ags_synth_util.lo: ags/audio/ags_synth_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_synth_util.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Tpo -c -o ags/audio/libags_audio_la-ags_synth_util.lo `test -f 'ags/audio/ags_synth_util.c' || echo '$(srcdir)/'`ags/audio/ags_synth_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_synth_util.c' object='ags/audio/libags_audio_la-ags_synth_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_synth_util.lo `test -f 'ags/audio/ags_synth_util.c' || echo '$(srcdir)/'`ags/audio/ags_synth_util.c ags/audio/libags_audio_la-ags_track.lo: ags/audio/ags_track.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_track.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Tpo -c -o ags/audio/libags_audio_la-ags_track.lo `test -f 'ags/audio/ags_track.c' || echo '$(srcdir)/'`ags/audio/ags_track.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_track.c' object='ags/audio/libags_audio_la-ags_track.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_track.lo `test -f 'ags/audio/ags_track.c' || echo '$(srcdir)/'`ags/audio/ags_track.c ags/audio/libags_audio_la-ags_wave.lo: ags/audio/ags_wave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/libags_audio_la-ags_wave.lo -MD -MP -MF ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Tpo -c -o ags/audio/libags_audio_la-ags_wave.lo `test -f 'ags/audio/ags_wave.c' || echo '$(srcdir)/'`ags/audio/ags_wave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Tpo ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/ags_wave.c' object='ags/audio/libags_audio_la-ags_wave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/libags_audio_la-ags_wave.lo `test -f 'ags/audio/ags_wave.c' || echo '$(srcdir)/'`ags/audio/ags_wave.c ags/audio/thread/libags_audio_la-ags_audio_loop.lo: ags/audio/thread/ags_audio_loop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_audio_loop.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Tpo -c -o ags/audio/thread/libags_audio_la-ags_audio_loop.lo `test -f 'ags/audio/thread/ags_audio_loop.c' || echo '$(srcdir)/'`ags/audio/thread/ags_audio_loop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_audio_loop.c' object='ags/audio/thread/libags_audio_la-ags_audio_loop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_audio_loop.lo `test -f 'ags/audio/thread/ags_audio_loop.c' || echo '$(srcdir)/'`ags/audio/thread/ags_audio_loop.c ags/audio/thread/libags_audio_la-ags_audio_thread.lo: ags/audio/thread/ags_audio_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_audio_thread.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Tpo -c -o ags/audio/thread/libags_audio_la-ags_audio_thread.lo `test -f 'ags/audio/thread/ags_audio_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_audio_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_audio_thread.c' object='ags/audio/thread/libags_audio_la-ags_audio_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_audio_thread.lo `test -f 'ags/audio/thread/ags_audio_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_audio_thread.c ags/audio/thread/libags_audio_la-ags_channel_thread.lo: ags/audio/thread/ags_channel_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_channel_thread.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Tpo -c -o ags/audio/thread/libags_audio_la-ags_channel_thread.lo `test -f 'ags/audio/thread/ags_channel_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_channel_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_channel_thread.c' object='ags/audio/thread/libags_audio_la-ags_channel_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_channel_thread.lo `test -f 'ags/audio/thread/ags_channel_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_channel_thread.c ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo: ags/audio/thread/ags_sequencer_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Tpo -c -o ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo `test -f 'ags/audio/thread/ags_sequencer_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_sequencer_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_sequencer_thread.c' object='ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_sequencer_thread.lo `test -f 'ags/audio/thread/ags_sequencer_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_sequencer_thread.c ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo: ags/audio/thread/ags_soundcard_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Tpo -c -o ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo `test -f 'ags/audio/thread/ags_soundcard_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_soundcard_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_soundcard_thread.c' object='ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_soundcard_thread.lo `test -f 'ags/audio/thread/ags_soundcard_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_soundcard_thread.c ags/audio/thread/libags_audio_la-ags_export_thread.lo: ags/audio/thread/ags_export_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_export_thread.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Tpo -c -o ags/audio/thread/libags_audio_la-ags_export_thread.lo `test -f 'ags/audio/thread/ags_export_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_export_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_export_thread.c' object='ags/audio/thread/libags_audio_la-ags_export_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_export_thread.lo `test -f 'ags/audio/thread/ags_export_thread.c' || echo '$(srcdir)/'`ags/audio/thread/ags_export_thread.c ags/audio/thread/libags_audio_la-ags_sf2_loader.lo: ags/audio/thread/ags_sf2_loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_sf2_loader.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Tpo -c -o ags/audio/thread/libags_audio_la-ags_sf2_loader.lo `test -f 'ags/audio/thread/ags_sf2_loader.c' || echo '$(srcdir)/'`ags/audio/thread/ags_sf2_loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_sf2_loader.c' object='ags/audio/thread/libags_audio_la-ags_sf2_loader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_sf2_loader.lo `test -f 'ags/audio/thread/ags_sf2_loader.c' || echo '$(srcdir)/'`ags/audio/thread/ags_sf2_loader.c ags/audio/thread/libags_audio_la-ags_sfz_loader.lo: ags/audio/thread/ags_sfz_loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_sfz_loader.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Tpo -c -o ags/audio/thread/libags_audio_la-ags_sfz_loader.lo `test -f 'ags/audio/thread/ags_sfz_loader.c' || echo '$(srcdir)/'`ags/audio/thread/ags_sfz_loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_sfz_loader.c' object='ags/audio/thread/libags_audio_la-ags_sfz_loader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_sfz_loader.lo `test -f 'ags/audio/thread/ags_sfz_loader.c' || echo '$(srcdir)/'`ags/audio/thread/ags_sfz_loader.c ags/audio/thread/libags_audio_la-ags_wave_loader.lo: ags/audio/thread/ags_wave_loader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/thread/libags_audio_la-ags_wave_loader.lo -MD -MP -MF ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Tpo -c -o ags/audio/thread/libags_audio_la-ags_wave_loader.lo `test -f 'ags/audio/thread/ags_wave_loader.c' || echo '$(srcdir)/'`ags/audio/thread/ags_wave_loader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Tpo ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/thread/ags_wave_loader.c' object='ags/audio/thread/libags_audio_la-ags_wave_loader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/thread/libags_audio_la-ags_wave_loader.lo `test -f 'ags/audio/thread/ags_wave_loader.c' || echo '$(srcdir)/'`ags/audio/thread/ags_wave_loader.c ags/audio/file/libags_audio_la-ags_audio_container.lo: ags/audio/file/ags_audio_container.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_audio_container.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Tpo -c -o ags/audio/file/libags_audio_la-ags_audio_container.lo `test -f 'ags/audio/file/ags_audio_container.c' || echo '$(srcdir)/'`ags/audio/file/ags_audio_container.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_audio_container.c' object='ags/audio/file/libags_audio_la-ags_audio_container.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_audio_container.lo `test -f 'ags/audio/file/ags_audio_container.c' || echo '$(srcdir)/'`ags/audio/file/ags_audio_container.c ags/audio/file/libags_audio_la-ags_audio_file.lo: ags/audio/file/ags_audio_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_audio_file.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Tpo -c -o ags/audio/file/libags_audio_la-ags_audio_file.lo `test -f 'ags/audio/file/ags_audio_file.c' || echo '$(srcdir)/'`ags/audio/file/ags_audio_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_audio_file.c' object='ags/audio/file/libags_audio_la-ags_audio_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_audio_file.lo `test -f 'ags/audio/file/ags_audio_file.c' || echo '$(srcdir)/'`ags/audio/file/ags_audio_file.c ags/audio/file/libags_audio_la-ags_audio_file_link.lo: ags/audio/file/ags_audio_file_link.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_audio_file_link.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Tpo -c -o ags/audio/file/libags_audio_la-ags_audio_file_link.lo `test -f 'ags/audio/file/ags_audio_file_link.c' || echo '$(srcdir)/'`ags/audio/file/ags_audio_file_link.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_audio_file_link.c' object='ags/audio/file/libags_audio_la-ags_audio_file_link.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_audio_file_link.lo `test -f 'ags/audio/file/ags_audio_file_link.c' || echo '$(srcdir)/'`ags/audio/file/ags_audio_file_link.c ags/audio/file/libags_audio_la-ags_sound_container.lo: ags/audio/file/ags_sound_container.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sound_container.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Tpo -c -o ags/audio/file/libags_audio_la-ags_sound_container.lo `test -f 'ags/audio/file/ags_sound_container.c' || echo '$(srcdir)/'`ags/audio/file/ags_sound_container.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sound_container.c' object='ags/audio/file/libags_audio_la-ags_sound_container.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sound_container.lo `test -f 'ags/audio/file/ags_sound_container.c' || echo '$(srcdir)/'`ags/audio/file/ags_sound_container.c ags/audio/file/libags_audio_la-ags_sound_resource.lo: ags/audio/file/ags_sound_resource.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sound_resource.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Tpo -c -o ags/audio/file/libags_audio_la-ags_sound_resource.lo `test -f 'ags/audio/file/ags_sound_resource.c' || echo '$(srcdir)/'`ags/audio/file/ags_sound_resource.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sound_resource.c' object='ags/audio/file/libags_audio_la-ags_sound_resource.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sound_resource.lo `test -f 'ags/audio/file/ags_sound_resource.c' || echo '$(srcdir)/'`ags/audio/file/ags_sound_resource.c ags/audio/file/libags_audio_la-ags_sndfile.lo: ags/audio/file/ags_sndfile.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sndfile.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Tpo -c -o ags/audio/file/libags_audio_la-ags_sndfile.lo `test -f 'ags/audio/file/ags_sndfile.c' || echo '$(srcdir)/'`ags/audio/file/ags_sndfile.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sndfile.c' object='ags/audio/file/libags_audio_la-ags_sndfile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sndfile.lo `test -f 'ags/audio/file/ags_sndfile.c' || echo '$(srcdir)/'`ags/audio/file/ags_sndfile.c ags/audio/file/libags_audio_la-ags_sfz_file.lo: ags/audio/file/ags_sfz_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sfz_file.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Tpo -c -o ags/audio/file/libags_audio_la-ags_sfz_file.lo `test -f 'ags/audio/file/ags_sfz_file.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sfz_file.c' object='ags/audio/file/libags_audio_la-ags_sfz_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sfz_file.lo `test -f 'ags/audio/file/ags_sfz_file.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_file.c ags/audio/file/libags_audio_la-ags_sfz_group.lo: ags/audio/file/ags_sfz_group.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sfz_group.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Tpo -c -o ags/audio/file/libags_audio_la-ags_sfz_group.lo `test -f 'ags/audio/file/ags_sfz_group.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_group.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sfz_group.c' object='ags/audio/file/libags_audio_la-ags_sfz_group.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sfz_group.lo `test -f 'ags/audio/file/ags_sfz_group.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_group.c ags/audio/file/libags_audio_la-ags_sfz_region.lo: ags/audio/file/ags_sfz_region.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sfz_region.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Tpo -c -o ags/audio/file/libags_audio_la-ags_sfz_region.lo `test -f 'ags/audio/file/ags_sfz_region.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_region.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sfz_region.c' object='ags/audio/file/libags_audio_la-ags_sfz_region.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sfz_region.lo `test -f 'ags/audio/file/ags_sfz_region.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_region.c ags/audio/file/libags_audio_la-ags_sfz_sample.lo: ags/audio/file/ags_sfz_sample.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_sfz_sample.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Tpo -c -o ags/audio/file/libags_audio_la-ags_sfz_sample.lo `test -f 'ags/audio/file/ags_sfz_sample.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_sample.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_sfz_sample.c' object='ags/audio/file/libags_audio_la-ags_sfz_sample.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_sfz_sample.lo `test -f 'ags/audio/file/ags_sfz_sample.c' || echo '$(srcdir)/'`ags/audio/file/ags_sfz_sample.c ags/audio/file/libags_audio_la-ags_ipatch.lo: ags/audio/file/ags_ipatch.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_ipatch.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Tpo -c -o ags/audio/file/libags_audio_la-ags_ipatch.lo `test -f 'ags/audio/file/ags_ipatch.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_ipatch.c' object='ags/audio/file/libags_audio_la-ags_ipatch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_ipatch.lo `test -f 'ags/audio/file/ags_ipatch.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch.c ags/audio/file/libags_audio_la-ags_ipatch_sample.lo: ags/audio/file/ags_ipatch_sample.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_ipatch_sample.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Tpo -c -o ags/audio/file/libags_audio_la-ags_ipatch_sample.lo `test -f 'ags/audio/file/ags_ipatch_sample.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_sample.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_ipatch_sample.c' object='ags/audio/file/libags_audio_la-ags_ipatch_sample.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_ipatch_sample.lo `test -f 'ags/audio/file/ags_ipatch_sample.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_sample.c ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo: ags/audio/file/ags_ipatch_dls2_reader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Tpo -c -o ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo `test -f 'ags/audio/file/ags_ipatch_dls2_reader.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_dls2_reader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_ipatch_dls2_reader.c' object='ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_ipatch_dls2_reader.lo `test -f 'ags/audio/file/ags_ipatch_dls2_reader.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_dls2_reader.c ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo: ags/audio/file/ags_ipatch_gig_reader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Tpo -c -o ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo `test -f 'ags/audio/file/ags_ipatch_gig_reader.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_gig_reader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_ipatch_gig_reader.c' object='ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_ipatch_gig_reader.lo `test -f 'ags/audio/file/ags_ipatch_gig_reader.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_gig_reader.c ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo: ags/audio/file/ags_ipatch_sf2_reader.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo -MD -MP -MF ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Tpo -c -o ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo `test -f 'ags/audio/file/ags_ipatch_sf2_reader.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_sf2_reader.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Tpo ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/file/ags_ipatch_sf2_reader.c' object='ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/file/libags_audio_la-ags_ipatch_sf2_reader.lo `test -f 'ags/audio/file/ags_ipatch_sf2_reader.c' || echo '$(srcdir)/'`ags/audio/file/ags_ipatch_sf2_reader.c ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo: ags/audio/midi/ags_midi_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo -MD -MP -MF ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Tpo -c -o ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo `test -f 'ags/audio/midi/ags_midi_buffer_util.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Tpo ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/midi/ags_midi_buffer_util.c' object='ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/midi/libags_audio_la-ags_midi_buffer_util.lo `test -f 'ags/audio/midi/ags_midi_buffer_util.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_buffer_util.c ags/audio/midi/libags_audio_la-ags_midi_util.lo: ags/audio/midi/ags_midi_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/midi/libags_audio_la-ags_midi_util.lo -MD -MP -MF ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Tpo -c -o ags/audio/midi/libags_audio_la-ags_midi_util.lo `test -f 'ags/audio/midi/ags_midi_util.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Tpo ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/midi/ags_midi_util.c' object='ags/audio/midi/libags_audio_la-ags_midi_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/midi/libags_audio_la-ags_midi_util.lo `test -f 'ags/audio/midi/ags_midi_util.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_util.c ags/audio/midi/libags_audio_la-ags_midi_builder.lo: ags/audio/midi/ags_midi_builder.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/midi/libags_audio_la-ags_midi_builder.lo -MD -MP -MF ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Tpo -c -o ags/audio/midi/libags_audio_la-ags_midi_builder.lo `test -f 'ags/audio/midi/ags_midi_builder.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_builder.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Tpo ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/midi/ags_midi_builder.c' object='ags/audio/midi/libags_audio_la-ags_midi_builder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/midi/libags_audio_la-ags_midi_builder.lo `test -f 'ags/audio/midi/ags_midi_builder.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_builder.c ags/audio/midi/libags_audio_la-ags_midi_file.lo: ags/audio/midi/ags_midi_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/midi/libags_audio_la-ags_midi_file.lo -MD -MP -MF ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Tpo -c -o ags/audio/midi/libags_audio_la-ags_midi_file.lo `test -f 'ags/audio/midi/ags_midi_file.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Tpo ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/midi/ags_midi_file.c' object='ags/audio/midi/libags_audio_la-ags_midi_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/midi/libags_audio_la-ags_midi_file.lo `test -f 'ags/audio/midi/ags_midi_file.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_file.c ags/audio/midi/libags_audio_la-ags_midi_parser.lo: ags/audio/midi/ags_midi_parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/midi/libags_audio_la-ags_midi_parser.lo -MD -MP -MF ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Tpo -c -o ags/audio/midi/libags_audio_la-ags_midi_parser.lo `test -f 'ags/audio/midi/ags_midi_parser.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Tpo ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/midi/ags_midi_parser.c' object='ags/audio/midi/libags_audio_la-ags_midi_parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/midi/libags_audio_la-ags_midi_parser.lo `test -f 'ags/audio/midi/ags_midi_parser.c' || echo '$(srcdir)/'`ags/audio/midi/ags_midi_parser.c ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo: ags/audio/osc/ags_osc_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo `test -f 'ags/audio/osc/ags_osc_buffer_util.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_buffer_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_buffer_util.c' object='ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_buffer_util.lo `test -f 'ags/audio/osc/ags_osc_buffer_util.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_buffer_util.c ags/audio/osc/libags_audio_la-ags_osc_builder.lo: ags/audio/osc/ags_osc_builder.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_builder.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_builder.lo `test -f 'ags/audio/osc/ags_osc_builder.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_builder.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_builder.c' object='ags/audio/osc/libags_audio_la-ags_osc_builder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_builder.lo `test -f 'ags/audio/osc/ags_osc_builder.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_builder.c ags/audio/osc/libags_audio_la-ags_osc_client.lo: ags/audio/osc/ags_osc_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_client.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_client.lo `test -f 'ags/audio/osc/ags_osc_client.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_client.c' object='ags/audio/osc/libags_audio_la-ags_osc_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_client.lo `test -f 'ags/audio/osc/ags_osc_client.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_client.c ags/audio/osc/libags_audio_la-ags_osc_connection.lo: ags/audio/osc/ags_osc_connection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_connection.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_connection.lo `test -f 'ags/audio/osc/ags_osc_connection.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_connection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_connection.c' object='ags/audio/osc/libags_audio_la-ags_osc_connection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_connection.lo `test -f 'ags/audio/osc/ags_osc_connection.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_connection.c ags/audio/osc/libags_audio_la-ags_osc_message.lo: ags/audio/osc/ags_osc_message.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_message.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_message.lo `test -f 'ags/audio/osc/ags_osc_message.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_message.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_message.c' object='ags/audio/osc/libags_audio_la-ags_osc_message.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_message.lo `test -f 'ags/audio/osc/ags_osc_message.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_message.c ags/audio/osc/libags_audio_la-ags_osc_parser.lo: ags/audio/osc/ags_osc_parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_parser.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_parser.lo `test -f 'ags/audio/osc/ags_osc_parser.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_parser.c' object='ags/audio/osc/libags_audio_la-ags_osc_parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_parser.lo `test -f 'ags/audio/osc/ags_osc_parser.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_parser.c ags/audio/osc/libags_audio_la-ags_osc_response.lo: ags/audio/osc/ags_osc_response.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_response.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_response.lo `test -f 'ags/audio/osc/ags_osc_response.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_response.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_response.c' object='ags/audio/osc/libags_audio_la-ags_osc_response.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_response.lo `test -f 'ags/audio/osc/ags_osc_response.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_response.c ags/audio/osc/libags_audio_la-ags_osc_server.lo: ags/audio/osc/ags_osc_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_server.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_server.lo `test -f 'ags/audio/osc/ags_osc_server.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_server.c' object='ags/audio/osc/libags_audio_la-ags_osc_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_server.lo `test -f 'ags/audio/osc/ags_osc_server.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_server.c ags/audio/osc/libags_audio_la-ags_osc_util.lo: ags/audio/osc/ags_osc_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_util.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_util.lo `test -f 'ags/audio/osc/ags_osc_util.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_util.c' object='ags/audio/osc/libags_audio_la-ags_osc_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_util.lo `test -f 'ags/audio/osc/ags_osc_util.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_util.c ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo: ags/audio/osc/ags_osc_websocket_connection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo `test -f 'ags/audio/osc/ags_osc_websocket_connection.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_websocket_connection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_websocket_connection.c' object='ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_websocket_connection.lo `test -f 'ags/audio/osc/ags_osc_websocket_connection.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_websocket_connection.c ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo: ags/audio/osc/ags_osc_xmlrpc_message.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo `test -f 'ags/audio/osc/ags_osc_xmlrpc_message.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_xmlrpc_message.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_xmlrpc_message.c' object='ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_message.lo `test -f 'ags/audio/osc/ags_osc_xmlrpc_message.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_xmlrpc_message.c ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo: ags/audio/osc/ags_osc_xmlrpc_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo -MD -MP -MF ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Tpo -c -o ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo `test -f 'ags/audio/osc/ags_osc_xmlrpc_server.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_xmlrpc_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Tpo ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/ags_osc_xmlrpc_server.c' object='ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/libags_audio_la-ags_osc_xmlrpc_server.lo `test -f 'ags/audio/osc/ags_osc_xmlrpc_server.c' || echo '$(srcdir)/'`ags/audio/osc/ags_osc_xmlrpc_server.c ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo: ags/audio/osc/controller/ags_osc_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo: ags/audio/osc/controller/ags_osc_action_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_action_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_action_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_action_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_action_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_action_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_action_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo: ags/audio/osc/controller/ags_osc_config_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_config_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_config_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_config_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_config_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_config_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_config_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo: ags/audio/osc/controller/ags_osc_export_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_export_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_export_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_export_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_export_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_export_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_export_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo: ags/audio/osc/controller/ags_osc_front_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_front_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_front_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_front_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_front_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_front_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_front_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo: ags/audio/osc/controller/ags_osc_info_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_info_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_info_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_info_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_info_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_info_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_info_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo: ags/audio/osc/controller/ags_osc_meter_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_meter_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_meter_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_meter_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_meter_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_meter_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_meter_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo: ags/audio/osc/controller/ags_osc_node_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_node_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_node_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_node_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_node_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_node_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_node_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo: ags/audio/osc/controller/ags_osc_plugin_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_plugin_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_plugin_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_plugin_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_plugin_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_plugin_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_plugin_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo: ags/audio/osc/controller/ags_osc_renew_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_renew_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_renew_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_renew_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_renew_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_renew_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_renew_controller.c ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo: ags/audio/osc/controller/ags_osc_status_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo -MD -MP -MF ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Tpo -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_status_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_status_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Tpo ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/controller/ags_osc_status_controller.c' object='ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/controller/libags_audio_la-ags_osc_status_controller.lo `test -f 'ags/audio/osc/controller/ags_osc_status_controller.c' || echo '$(srcdir)/'`ags/audio/osc/controller/ags_osc_status_controller.c ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo: ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo -MD -MP -MF ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Tpo -c -o ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo `test -f 'ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c' || echo '$(srcdir)/'`ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Tpo ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c' object='ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/osc/xmlrpc/libags_audio_la-ags_osc_xmlrpc_controller.lo `test -f 'ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c' || echo '$(srcdir)/'`ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c ags/audio/jack/libags_audio_la-ags_jack_client.lo: ags/audio/jack/ags_jack_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/jack/libags_audio_la-ags_jack_client.lo -MD -MP -MF ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Tpo -c -o ags/audio/jack/libags_audio_la-ags_jack_client.lo `test -f 'ags/audio/jack/ags_jack_client.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Tpo ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/jack/ags_jack_client.c' object='ags/audio/jack/libags_audio_la-ags_jack_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/jack/libags_audio_la-ags_jack_client.lo `test -f 'ags/audio/jack/ags_jack_client.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_client.c ags/audio/jack/libags_audio_la-ags_jack_midiin.lo: ags/audio/jack/ags_jack_midiin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/jack/libags_audio_la-ags_jack_midiin.lo -MD -MP -MF ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Tpo -c -o ags/audio/jack/libags_audio_la-ags_jack_midiin.lo `test -f 'ags/audio/jack/ags_jack_midiin.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_midiin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Tpo ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/jack/ags_jack_midiin.c' object='ags/audio/jack/libags_audio_la-ags_jack_midiin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/jack/libags_audio_la-ags_jack_midiin.lo `test -f 'ags/audio/jack/ags_jack_midiin.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_midiin.c ags/audio/jack/libags_audio_la-ags_jack_devout.lo: ags/audio/jack/ags_jack_devout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/jack/libags_audio_la-ags_jack_devout.lo -MD -MP -MF ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Tpo -c -o ags/audio/jack/libags_audio_la-ags_jack_devout.lo `test -f 'ags/audio/jack/ags_jack_devout.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_devout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Tpo ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/jack/ags_jack_devout.c' object='ags/audio/jack/libags_audio_la-ags_jack_devout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/jack/libags_audio_la-ags_jack_devout.lo `test -f 'ags/audio/jack/ags_jack_devout.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_devout.c ags/audio/jack/libags_audio_la-ags_jack_devin.lo: ags/audio/jack/ags_jack_devin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/jack/libags_audio_la-ags_jack_devin.lo -MD -MP -MF ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Tpo -c -o ags/audio/jack/libags_audio_la-ags_jack_devin.lo `test -f 'ags/audio/jack/ags_jack_devin.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_devin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Tpo ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/jack/ags_jack_devin.c' object='ags/audio/jack/libags_audio_la-ags_jack_devin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/jack/libags_audio_la-ags_jack_devin.lo `test -f 'ags/audio/jack/ags_jack_devin.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_devin.c ags/audio/jack/libags_audio_la-ags_jack_port.lo: ags/audio/jack/ags_jack_port.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/jack/libags_audio_la-ags_jack_port.lo -MD -MP -MF ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Tpo -c -o ags/audio/jack/libags_audio_la-ags_jack_port.lo `test -f 'ags/audio/jack/ags_jack_port.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_port.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Tpo ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/jack/ags_jack_port.c' object='ags/audio/jack/libags_audio_la-ags_jack_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/jack/libags_audio_la-ags_jack_port.lo `test -f 'ags/audio/jack/ags_jack_port.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_port.c ags/audio/jack/libags_audio_la-ags_jack_server.lo: ags/audio/jack/ags_jack_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/jack/libags_audio_la-ags_jack_server.lo -MD -MP -MF ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Tpo -c -o ags/audio/jack/libags_audio_la-ags_jack_server.lo `test -f 'ags/audio/jack/ags_jack_server.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Tpo ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/jack/ags_jack_server.c' object='ags/audio/jack/libags_audio_la-ags_jack_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/jack/libags_audio_la-ags_jack_server.lo `test -f 'ags/audio/jack/ags_jack_server.c' || echo '$(srcdir)/'`ags/audio/jack/ags_jack_server.c ags/audio/pulse/libags_audio_la-ags_pulse_client.lo: ags/audio/pulse/ags_pulse_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/pulse/libags_audio_la-ags_pulse_client.lo -MD -MP -MF ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Tpo -c -o ags/audio/pulse/libags_audio_la-ags_pulse_client.lo `test -f 'ags/audio/pulse/ags_pulse_client.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Tpo ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/pulse/ags_pulse_client.c' object='ags/audio/pulse/libags_audio_la-ags_pulse_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/pulse/libags_audio_la-ags_pulse_client.lo `test -f 'ags/audio/pulse/ags_pulse_client.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_client.c ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo: ags/audio/pulse/ags_pulse_devout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo -MD -MP -MF ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Tpo -c -o ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo `test -f 'ags/audio/pulse/ags_pulse_devout.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_devout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Tpo ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/pulse/ags_pulse_devout.c' object='ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/pulse/libags_audio_la-ags_pulse_devout.lo `test -f 'ags/audio/pulse/ags_pulse_devout.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_devout.c ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo: ags/audio/pulse/ags_pulse_devin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo -MD -MP -MF ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Tpo -c -o ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo `test -f 'ags/audio/pulse/ags_pulse_devin.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_devin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Tpo ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/pulse/ags_pulse_devin.c' object='ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/pulse/libags_audio_la-ags_pulse_devin.lo `test -f 'ags/audio/pulse/ags_pulse_devin.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_devin.c ags/audio/pulse/libags_audio_la-ags_pulse_port.lo: ags/audio/pulse/ags_pulse_port.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/pulse/libags_audio_la-ags_pulse_port.lo -MD -MP -MF ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Tpo -c -o ags/audio/pulse/libags_audio_la-ags_pulse_port.lo `test -f 'ags/audio/pulse/ags_pulse_port.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_port.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Tpo ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/pulse/ags_pulse_port.c' object='ags/audio/pulse/libags_audio_la-ags_pulse_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/pulse/libags_audio_la-ags_pulse_port.lo `test -f 'ags/audio/pulse/ags_pulse_port.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_port.c ags/audio/pulse/libags_audio_la-ags_pulse_server.lo: ags/audio/pulse/ags_pulse_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/pulse/libags_audio_la-ags_pulse_server.lo -MD -MP -MF ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Tpo -c -o ags/audio/pulse/libags_audio_la-ags_pulse_server.lo `test -f 'ags/audio/pulse/ags_pulse_server.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Tpo ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/pulse/ags_pulse_server.c' object='ags/audio/pulse/libags_audio_la-ags_pulse_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/pulse/libags_audio_la-ags_pulse_server.lo `test -f 'ags/audio/pulse/ags_pulse_server.c' || echo '$(srcdir)/'`ags/audio/pulse/ags_pulse_server.c ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo: ags/audio/core-audio/ags_core_audio_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo -MD -MP -MF ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Tpo -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo `test -f 'ags/audio/core-audio/ags_core_audio_client.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Tpo ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/core-audio/ags_core_audio_client.c' object='ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_client.lo `test -f 'ags/audio/core-audio/ags_core_audio_client.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_client.c ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo: ags/audio/core-audio/ags_core_audio_midiin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo -MD -MP -MF ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Tpo -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo `test -f 'ags/audio/core-audio/ags_core_audio_midiin.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_midiin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Tpo ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/core-audio/ags_core_audio_midiin.c' object='ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_midiin.lo `test -f 'ags/audio/core-audio/ags_core_audio_midiin.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_midiin.c ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo: ags/audio/core-audio/ags_core_audio_devout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo -MD -MP -MF ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Tpo -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo `test -f 'ags/audio/core-audio/ags_core_audio_devout.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_devout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Tpo ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/core-audio/ags_core_audio_devout.c' object='ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_devout.lo `test -f 'ags/audio/core-audio/ags_core_audio_devout.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_devout.c ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo: ags/audio/core-audio/ags_core_audio_devin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo -MD -MP -MF ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Tpo -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo `test -f 'ags/audio/core-audio/ags_core_audio_devin.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_devin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Tpo ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/core-audio/ags_core_audio_devin.c' object='ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_devin.lo `test -f 'ags/audio/core-audio/ags_core_audio_devin.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_devin.c ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo: ags/audio/core-audio/ags_core_audio_port.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo -MD -MP -MF ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Tpo -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo `test -f 'ags/audio/core-audio/ags_core_audio_port.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_port.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Tpo ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/core-audio/ags_core_audio_port.c' object='ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_port.lo `test -f 'ags/audio/core-audio/ags_core_audio_port.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_port.c ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo: ags/audio/core-audio/ags_core_audio_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo -MD -MP -MF ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Tpo -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo `test -f 'ags/audio/core-audio/ags_core_audio_server.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Tpo ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/core-audio/ags_core_audio_server.c' object='ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/core-audio/libags_audio_la-ags_core_audio_server.lo `test -f 'ags/audio/core-audio/ags_core_audio_server.c' || echo '$(srcdir)/'`ags/audio/core-audio/ags_core_audio_server.c ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo: ags/audio/audio-unit/ags_audio_unit_client.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo -MD -MP -MF ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Tpo -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_client.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_client.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Tpo ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/audio-unit/ags_audio_unit_client.c' object='ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_client.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_client.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_client.c ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo: ags/audio/audio-unit/ags_audio_unit_devin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo -MD -MP -MF ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Tpo -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_devin.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_devin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Tpo ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/audio-unit/ags_audio_unit_devin.c' object='ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devin.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_devin.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_devin.c ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo: ags/audio/audio-unit/ags_audio_unit_devout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo -MD -MP -MF ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Tpo -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_devout.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_devout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Tpo ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/audio-unit/ags_audio_unit_devout.c' object='ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_devout.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_devout.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_devout.c ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo: ags/audio/audio-unit/ags_audio_unit_port.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo -MD -MP -MF ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Tpo -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_port.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_port.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Tpo ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/audio-unit/ags_audio_unit_port.c' object='ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_port.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_port.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_port.c ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo: ags/audio/audio-unit/ags_audio_unit_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo -MD -MP -MF ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Tpo -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_server.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Tpo ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/audio-unit/ags_audio_unit_server.c' object='ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/audio-unit/libags_audio_la-ags_audio_unit_server.lo `test -f 'ags/audio/audio-unit/ags_audio_unit_server.c' || echo '$(srcdir)/'`ags/audio/audio-unit/ags_audio_unit_server.c ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo: ags/audio/wasapi/ags_wasapi_devout.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo -MD -MP -MF ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Tpo -c -o ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo `test -f 'ags/audio/wasapi/ags_wasapi_devout.c' || echo '$(srcdir)/'`ags/audio/wasapi/ags_wasapi_devout.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Tpo ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/wasapi/ags_wasapi_devout.c' object='ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/wasapi/libags_audio_la-ags_wasapi_devout.lo `test -f 'ags/audio/wasapi/ags_wasapi_devout.c' || echo '$(srcdir)/'`ags/audio/wasapi/ags_wasapi_devout.c ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo: ags/audio/wasapi/ags_wasapi_devin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo -MD -MP -MF ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Tpo -c -o ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo `test -f 'ags/audio/wasapi/ags_wasapi_devin.c' || echo '$(srcdir)/'`ags/audio/wasapi/ags_wasapi_devin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Tpo ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/wasapi/ags_wasapi_devin.c' object='ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/wasapi/libags_audio_la-ags_wasapi_devin.lo `test -f 'ags/audio/wasapi/ags_wasapi_devin.c' || echo '$(srcdir)/'`ags/audio/wasapi/ags_wasapi_devin.c ags/audio/task/libags_audio_la-ags_add_audio.lo: ags/audio/task/ags_add_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_add_audio.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Tpo -c -o ags/audio/task/libags_audio_la-ags_add_audio.lo `test -f 'ags/audio/task/ags_add_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_add_audio.c' object='ags/audio/task/libags_audio_la-ags_add_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_add_audio.lo `test -f 'ags/audio/task/ags_add_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_audio.c ags/audio/task/libags_audio_la-ags_add_audio_signal.lo: ags/audio/task/ags_add_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_add_audio_signal.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Tpo -c -o ags/audio/task/libags_audio_la-ags_add_audio_signal.lo `test -f 'ags/audio/task/ags_add_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_add_audio_signal.c' object='ags/audio/task/libags_audio_la-ags_add_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_add_audio_signal.lo `test -f 'ags/audio/task/ags_add_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_audio_signal.c ags/audio/task/libags_audio_la-ags_add_effect.lo: ags/audio/task/ags_add_effect.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_add_effect.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Tpo -c -o ags/audio/task/libags_audio_la-ags_add_effect.lo `test -f 'ags/audio/task/ags_add_effect.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_effect.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_add_effect.c' object='ags/audio/task/libags_audio_la-ags_add_effect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_add_effect.lo `test -f 'ags/audio/task/ags_add_effect.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_effect.c ags/audio/task/libags_audio_la-ags_add_note.lo: ags/audio/task/ags_add_note.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_add_note.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Tpo -c -o ags/audio/task/libags_audio_la-ags_add_note.lo `test -f 'ags/audio/task/ags_add_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_note.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_add_note.c' object='ags/audio/task/libags_audio_la-ags_add_note.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_add_note.lo `test -f 'ags/audio/task/ags_add_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_note.c ags/audio/task/libags_audio_la-ags_add_soundcard.lo: ags/audio/task/ags_add_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_add_soundcard.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Tpo -c -o ags/audio/task/libags_audio_la-ags_add_soundcard.lo `test -f 'ags/audio/task/ags_add_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_add_soundcard.c' object='ags/audio/task/libags_audio_la-ags_add_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_add_soundcard.lo `test -f 'ags/audio/task/ags_add_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_add_soundcard.c ags/audio/task/libags_audio_la-ags_apply_presets.lo: ags/audio/task/ags_apply_presets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_apply_presets.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Tpo -c -o ags/audio/task/libags_audio_la-ags_apply_presets.lo `test -f 'ags/audio/task/ags_apply_presets.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_presets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_apply_presets.c' object='ags/audio/task/libags_audio_la-ags_apply_presets.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_apply_presets.lo `test -f 'ags/audio/task/ags_apply_presets.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_presets.c ags/audio/task/libags_audio_la-ags_apply_sound_config.lo: ags/audio/task/ags_apply_sound_config.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_apply_sound_config.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Tpo -c -o ags/audio/task/libags_audio_la-ags_apply_sound_config.lo `test -f 'ags/audio/task/ags_apply_sound_config.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_sound_config.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_apply_sound_config.c' object='ags/audio/task/libags_audio_la-ags_apply_sound_config.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_apply_sound_config.lo `test -f 'ags/audio/task/ags_apply_sound_config.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_sound_config.c ags/audio/task/libags_audio_la-ags_apply_synth.lo: ags/audio/task/ags_apply_synth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_apply_synth.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Tpo -c -o ags/audio/task/libags_audio_la-ags_apply_synth.lo `test -f 'ags/audio/task/ags_apply_synth.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_synth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_apply_synth.c' object='ags/audio/task/libags_audio_la-ags_apply_synth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_apply_synth.lo `test -f 'ags/audio/task/ags_apply_synth.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_synth.c ags/audio/task/libags_audio_la-ags_cancel_audio.lo: ags/audio/task/ags_cancel_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_cancel_audio.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Tpo -c -o ags/audio/task/libags_audio_la-ags_cancel_audio.lo `test -f 'ags/audio/task/ags_cancel_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_cancel_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_cancel_audio.c' object='ags/audio/task/libags_audio_la-ags_cancel_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_cancel_audio.lo `test -f 'ags/audio/task/ags_cancel_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_cancel_audio.c ags/audio/task/libags_audio_la-ags_cancel_channel.lo: ags/audio/task/ags_cancel_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_cancel_channel.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Tpo -c -o ags/audio/task/libags_audio_la-ags_cancel_channel.lo `test -f 'ags/audio/task/ags_cancel_channel.c' || echo '$(srcdir)/'`ags/audio/task/ags_cancel_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_cancel_channel.c' object='ags/audio/task/libags_audio_la-ags_cancel_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_cancel_channel.lo `test -f 'ags/audio/task/ags_cancel_channel.c' || echo '$(srcdir)/'`ags/audio/task/ags_cancel_channel.c ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo: ags/audio/task/ags_clear_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Tpo -c -o ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo `test -f 'ags/audio/task/ags_clear_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_clear_audio_signal.c' object='ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo `test -f 'ags/audio/task/ags_clear_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_audio_signal.c ags/audio/task/libags_audio_la-ags_clear_buffer.lo: ags/audio/task/ags_clear_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_clear_buffer.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Tpo -c -o ags/audio/task/libags_audio_la-ags_clear_buffer.lo `test -f 'ags/audio/task/ags_clear_buffer.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_clear_buffer.c' object='ags/audio/task/libags_audio_la-ags_clear_buffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_clear_buffer.lo `test -f 'ags/audio/task/ags_clear_buffer.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_buffer.c ags/audio/task/libags_audio_la-ags_crop_note.lo: ags/audio/task/ags_crop_note.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_crop_note.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Tpo -c -o ags/audio/task/libags_audio_la-ags_crop_note.lo `test -f 'ags/audio/task/ags_crop_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_crop_note.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_crop_note.c' object='ags/audio/task/libags_audio_la-ags_crop_note.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_crop_note.lo `test -f 'ags/audio/task/ags_crop_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_crop_note.c ags/audio/task/libags_audio_la-ags_export_output.lo: ags/audio/task/ags_export_output.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_export_output.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Tpo -c -o ags/audio/task/libags_audio_la-ags_export_output.lo `test -f 'ags/audio/task/ags_export_output.c' || echo '$(srcdir)/'`ags/audio/task/ags_export_output.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_export_output.c' object='ags/audio/task/libags_audio_la-ags_export_output.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_export_output.lo `test -f 'ags/audio/task/ags_export_output.c' || echo '$(srcdir)/'`ags/audio/task/ags_export_output.c ags/audio/task/libags_audio_la-ags_free_selection.lo: ags/audio/task/ags_free_selection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_free_selection.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Tpo -c -o ags/audio/task/libags_audio_la-ags_free_selection.lo `test -f 'ags/audio/task/ags_free_selection.c' || echo '$(srcdir)/'`ags/audio/task/ags_free_selection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_free_selection.c' object='ags/audio/task/libags_audio_la-ags_free_selection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_free_selection.lo `test -f 'ags/audio/task/ags_free_selection.c' || echo '$(srcdir)/'`ags/audio/task/ags_free_selection.c ags/audio/task/libags_audio_la-ags_link_channel.lo: ags/audio/task/ags_link_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_link_channel.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Tpo -c -o ags/audio/task/libags_audio_la-ags_link_channel.lo `test -f 'ags/audio/task/ags_link_channel.c' || echo '$(srcdir)/'`ags/audio/task/ags_link_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_link_channel.c' object='ags/audio/task/libags_audio_la-ags_link_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_link_channel.lo `test -f 'ags/audio/task/ags_link_channel.c' || echo '$(srcdir)/'`ags/audio/task/ags_link_channel.c ags/audio/task/libags_audio_la-ags_move_note.lo: ags/audio/task/ags_move_note.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_move_note.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Tpo -c -o ags/audio/task/libags_audio_la-ags_move_note.lo `test -f 'ags/audio/task/ags_move_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_move_note.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_move_note.c' object='ags/audio/task/libags_audio_la-ags_move_note.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_move_note.lo `test -f 'ags/audio/task/ags_move_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_move_note.c ags/audio/task/libags_audio_la-ags_open_file.lo: ags/audio/task/ags_open_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_open_file.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Tpo -c -o ags/audio/task/libags_audio_la-ags_open_file.lo `test -f 'ags/audio/task/ags_open_file.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_open_file.c' object='ags/audio/task/libags_audio_la-ags_open_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_open_file.lo `test -f 'ags/audio/task/ags_open_file.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_file.c ags/audio/task/libags_audio_la-ags_open_single_file.lo: ags/audio/task/ags_open_single_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_open_single_file.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Tpo -c -o ags/audio/task/libags_audio_la-ags_open_single_file.lo `test -f 'ags/audio/task/ags_open_single_file.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_single_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_open_single_file.c' object='ags/audio/task/libags_audio_la-ags_open_single_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_open_single_file.lo `test -f 'ags/audio/task/ags_open_single_file.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_single_file.c ags/audio/task/libags_audio_la-ags_open_wave.lo: ags/audio/task/ags_open_wave.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_open_wave.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Tpo -c -o ags/audio/task/libags_audio_la-ags_open_wave.lo `test -f 'ags/audio/task/ags_open_wave.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_wave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_open_wave.c' object='ags/audio/task/libags_audio_la-ags_open_wave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_open_wave.lo `test -f 'ags/audio/task/ags_open_wave.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_wave.c ags/audio/task/libags_audio_la-ags_remove_audio.lo: ags/audio/task/ags_remove_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_remove_audio.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Tpo -c -o ags/audio/task/libags_audio_la-ags_remove_audio.lo `test -f 'ags/audio/task/ags_remove_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_remove_audio.c' object='ags/audio/task/libags_audio_la-ags_remove_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_remove_audio.lo `test -f 'ags/audio/task/ags_remove_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_audio.c ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo: ags/audio/task/ags_remove_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Tpo -c -o ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo `test -f 'ags/audio/task/ags_remove_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_remove_audio_signal.c' object='ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_remove_audio_signal.lo `test -f 'ags/audio/task/ags_remove_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_audio_signal.c ags/audio/task/libags_audio_la-ags_remove_note.lo: ags/audio/task/ags_remove_note.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_remove_note.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Tpo -c -o ags/audio/task/libags_audio_la-ags_remove_note.lo `test -f 'ags/audio/task/ags_remove_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_note.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_remove_note.c' object='ags/audio/task/libags_audio_la-ags_remove_note.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_remove_note.lo `test -f 'ags/audio/task/ags_remove_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_note.c ags/audio/task/libags_audio_la-ags_remove_soundcard.lo: ags/audio/task/ags_remove_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_remove_soundcard.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Tpo -c -o ags/audio/task/libags_audio_la-ags_remove_soundcard.lo `test -f 'ags/audio/task/ags_remove_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_remove_soundcard.c' object='ags/audio/task/libags_audio_la-ags_remove_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_remove_soundcard.lo `test -f 'ags/audio/task/ags_remove_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_remove_soundcard.c ags/audio/task/libags_audio_la-ags_resize_audio.lo: ags/audio/task/ags_resize_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_resize_audio.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Tpo -c -o ags/audio/task/libags_audio_la-ags_resize_audio.lo `test -f 'ags/audio/task/ags_resize_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_resize_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_resize_audio.c' object='ags/audio/task/libags_audio_la-ags_resize_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_resize_audio.lo `test -f 'ags/audio/task/ags_resize_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_resize_audio.c ags/audio/task/libags_audio_la-ags_seek_soundcard.lo: ags/audio/task/ags_seek_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_seek_soundcard.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Tpo -c -o ags/audio/task/libags_audio_la-ags_seek_soundcard.lo `test -f 'ags/audio/task/ags_seek_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_seek_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_seek_soundcard.c' object='ags/audio/task/libags_audio_la-ags_seek_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_seek_soundcard.lo `test -f 'ags/audio/task/ags_seek_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_seek_soundcard.c ags/audio/task/libags_audio_la-ags_set_audio_channels.lo: ags/audio/task/ags_set_audio_channels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_set_audio_channels.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Tpo -c -o ags/audio/task/libags_audio_la-ags_set_audio_channels.lo `test -f 'ags/audio/task/ags_set_audio_channels.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_audio_channels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_set_audio_channels.c' object='ags/audio/task/libags_audio_la-ags_set_audio_channels.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_set_audio_channels.lo `test -f 'ags/audio/task/ags_set_audio_channels.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_audio_channels.c ags/audio/task/libags_audio_la-ags_set_buffer_size.lo: ags/audio/task/ags_set_buffer_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_set_buffer_size.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Tpo -c -o ags/audio/task/libags_audio_la-ags_set_buffer_size.lo `test -f 'ags/audio/task/ags_set_buffer_size.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_buffer_size.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_set_buffer_size.c' object='ags/audio/task/libags_audio_la-ags_set_buffer_size.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_set_buffer_size.lo `test -f 'ags/audio/task/ags_set_buffer_size.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_buffer_size.c ags/audio/task/libags_audio_la-ags_set_device.lo: ags/audio/task/ags_set_device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_set_device.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Tpo -c -o ags/audio/task/libags_audio_la-ags_set_device.lo `test -f 'ags/audio/task/ags_set_device.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_set_device.c' object='ags/audio/task/libags_audio_la-ags_set_device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_set_device.lo `test -f 'ags/audio/task/ags_set_device.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_device.c ags/audio/task/libags_audio_la-ags_set_format.lo: ags/audio/task/ags_set_format.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_set_format.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Tpo -c -o ags/audio/task/libags_audio_la-ags_set_format.lo `test -f 'ags/audio/task/ags_set_format.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_format.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_set_format.c' object='ags/audio/task/libags_audio_la-ags_set_format.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_set_format.lo `test -f 'ags/audio/task/ags_set_format.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_format.c ags/audio/task/libags_audio_la-ags_set_samplerate.lo: ags/audio/task/ags_set_samplerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_set_samplerate.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Tpo -c -o ags/audio/task/libags_audio_la-ags_set_samplerate.lo `test -f 'ags/audio/task/ags_set_samplerate.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_samplerate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_set_samplerate.c' object='ags/audio/task/libags_audio_la-ags_set_samplerate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_set_samplerate.lo `test -f 'ags/audio/task/ags_set_samplerate.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_samplerate.c ags/audio/task/libags_audio_la-ags_start_audio.lo: ags/audio/task/ags_start_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_start_audio.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Tpo -c -o ags/audio/task/libags_audio_la-ags_start_audio.lo `test -f 'ags/audio/task/ags_start_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_start_audio.c' object='ags/audio/task/libags_audio_la-ags_start_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_start_audio.lo `test -f 'ags/audio/task/ags_start_audio.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_audio.c ags/audio/task/libags_audio_la-ags_start_channel.lo: ags/audio/task/ags_start_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_start_channel.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Tpo -c -o ags/audio/task/libags_audio_la-ags_start_channel.lo `test -f 'ags/audio/task/ags_start_channel.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_start_channel.c' object='ags/audio/task/libags_audio_la-ags_start_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_start_channel.lo `test -f 'ags/audio/task/ags_start_channel.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_channel.c ags/audio/task/libags_audio_la-ags_start_sequencer.lo: ags/audio/task/ags_start_sequencer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_start_sequencer.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Tpo -c -o ags/audio/task/libags_audio_la-ags_start_sequencer.lo `test -f 'ags/audio/task/ags_start_sequencer.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_sequencer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_start_sequencer.c' object='ags/audio/task/libags_audio_la-ags_start_sequencer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_start_sequencer.lo `test -f 'ags/audio/task/ags_start_sequencer.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_sequencer.c ags/audio/task/libags_audio_la-ags_start_soundcard.lo: ags/audio/task/ags_start_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_start_soundcard.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Tpo -c -o ags/audio/task/libags_audio_la-ags_start_soundcard.lo `test -f 'ags/audio/task/ags_start_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_start_soundcard.c' object='ags/audio/task/libags_audio_la-ags_start_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_start_soundcard.lo `test -f 'ags/audio/task/ags_start_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_start_soundcard.c ags/audio/task/libags_audio_la-ags_stop_sequencer.lo: ags/audio/task/ags_stop_sequencer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_stop_sequencer.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Tpo -c -o ags/audio/task/libags_audio_la-ags_stop_sequencer.lo `test -f 'ags/audio/task/ags_stop_sequencer.c' || echo '$(srcdir)/'`ags/audio/task/ags_stop_sequencer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_stop_sequencer.c' object='ags/audio/task/libags_audio_la-ags_stop_sequencer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_stop_sequencer.lo `test -f 'ags/audio/task/ags_stop_sequencer.c' || echo '$(srcdir)/'`ags/audio/task/ags_stop_sequencer.c ags/audio/task/libags_audio_la-ags_stop_soundcard.lo: ags/audio/task/ags_stop_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_stop_soundcard.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Tpo -c -o ags/audio/task/libags_audio_la-ags_stop_soundcard.lo `test -f 'ags/audio/task/ags_stop_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_stop_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_stop_soundcard.c' object='ags/audio/task/libags_audio_la-ags_stop_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_stop_soundcard.lo `test -f 'ags/audio/task/ags_stop_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_stop_soundcard.c ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo: ags/audio/task/ags_switch_buffer_flag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Tpo -c -o ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo `test -f 'ags/audio/task/ags_switch_buffer_flag.c' || echo '$(srcdir)/'`ags/audio/task/ags_switch_buffer_flag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_switch_buffer_flag.c' object='ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_switch_buffer_flag.lo `test -f 'ags/audio/task/ags_switch_buffer_flag.c' || echo '$(srcdir)/'`ags/audio/task/ags_switch_buffer_flag.c ags/audio/task/libags_audio_la-ags_tic_device.lo: ags/audio/task/ags_tic_device.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_tic_device.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Tpo -c -o ags/audio/task/libags_audio_la-ags_tic_device.lo `test -f 'ags/audio/task/ags_tic_device.c' || echo '$(srcdir)/'`ags/audio/task/ags_tic_device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_tic_device.c' object='ags/audio/task/libags_audio_la-ags_tic_device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_tic_device.lo `test -f 'ags/audio/task/ags_tic_device.c' || echo '$(srcdir)/'`ags/audio/task/ags_tic_device.c ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo: ags/audio/task/ags_toggle_pattern_bit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Tpo -c -o ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo `test -f 'ags/audio/task/ags_toggle_pattern_bit.c' || echo '$(srcdir)/'`ags/audio/task/ags_toggle_pattern_bit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_toggle_pattern_bit.c' object='ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_toggle_pattern_bit.lo `test -f 'ags/audio/task/ags_toggle_pattern_bit.c' || echo '$(srcdir)/'`ags/audio/task/ags_toggle_pattern_bit.c ags/audio/task/libags_audio_la-ags_apply_bpm.lo: ags/audio/task/ags_apply_bpm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_apply_bpm.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Tpo -c -o ags/audio/task/libags_audio_la-ags_apply_bpm.lo `test -f 'ags/audio/task/ags_apply_bpm.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_bpm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_apply_bpm.c' object='ags/audio/task/libags_audio_la-ags_apply_bpm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_apply_bpm.lo `test -f 'ags/audio/task/ags_apply_bpm.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_bpm.c ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo: ags/audio/task/ags_apply_sequencer_length.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Tpo -c -o ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo `test -f 'ags/audio/task/ags_apply_sequencer_length.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_sequencer_length.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_apply_sequencer_length.c' object='ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_apply_sequencer_length.lo `test -f 'ags/audio/task/ags_apply_sequencer_length.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_sequencer_length.c ags/audio/task/libags_audio_la-ags_apply_tact.lo: ags/audio/task/ags_apply_tact.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_apply_tact.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Tpo -c -o ags/audio/task/libags_audio_la-ags_apply_tact.lo `test -f 'ags/audio/task/ags_apply_tact.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_tact.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_apply_tact.c' object='ags/audio/task/libags_audio_la-ags_apply_tact.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_apply_tact.lo `test -f 'ags/audio/task/ags_apply_tact.c' || echo '$(srcdir)/'`ags/audio/task/ags_apply_tact.c ags/audio/task/libags_audio_la-ags_reset_amplitude.lo: ags/audio/task/ags_reset_amplitude.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_reset_amplitude.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Tpo -c -o ags/audio/task/libags_audio_la-ags_reset_amplitude.lo `test -f 'ags/audio/task/ags_reset_amplitude.c' || echo '$(srcdir)/'`ags/audio/task/ags_reset_amplitude.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_reset_amplitude.c' object='ags/audio/task/libags_audio_la-ags_reset_amplitude.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_reset_amplitude.lo `test -f 'ags/audio/task/ags_reset_amplitude.c' || echo '$(srcdir)/'`ags/audio/task/ags_reset_amplitude.c ags/audio/task/libags_audio_la-ags_reset_note.lo: ags/audio/task/ags_reset_note.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_reset_note.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Tpo -c -o ags/audio/task/libags_audio_la-ags_reset_note.lo `test -f 'ags/audio/task/ags_reset_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_reset_note.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_reset_note.c' object='ags/audio/task/libags_audio_la-ags_reset_note.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_reset_note.lo `test -f 'ags/audio/task/ags_reset_note.c' || echo '$(srcdir)/'`ags/audio/task/ags_reset_note.c ags/audio/task/libags_audio_la-ags_reset_peak.lo: ags/audio/task/ags_reset_peak.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_reset_peak.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Tpo -c -o ags/audio/task/libags_audio_la-ags_reset_peak.lo `test -f 'ags/audio/task/ags_reset_peak.c' || echo '$(srcdir)/'`ags/audio/task/ags_reset_peak.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_reset_peak.c' object='ags/audio/task/libags_audio_la-ags_reset_peak.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_reset_peak.lo `test -f 'ags/audio/task/ags_reset_peak.c' || echo '$(srcdir)/'`ags/audio/task/ags_reset_peak.c ags/audio/task/libags_audio_la-ags_set_muted.lo: ags/audio/task/ags_set_muted.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_set_muted.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Tpo -c -o ags/audio/task/libags_audio_la-ags_set_muted.lo `test -f 'ags/audio/task/ags_set_muted.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_muted.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_set_muted.c' object='ags/audio/task/libags_audio_la-ags_set_muted.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_set_muted.lo `test -f 'ags/audio/task/ags_set_muted.c' || echo '$(srcdir)/'`ags/audio/task/ags_set_muted.c ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo: ags/audio/task/ags_open_sf2_instrument.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Tpo -c -o ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo `test -f 'ags/audio/task/ags_open_sf2_instrument.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_sf2_instrument.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_open_sf2_instrument.c' object='ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_open_sf2_instrument.lo `test -f 'ags/audio/task/ags_open_sf2_instrument.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_sf2_instrument.c ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo: ags/audio/task/ags_open_sf2_sample.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Tpo -c -o ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo `test -f 'ags/audio/task/ags_open_sf2_sample.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_sf2_sample.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/task/ags_open_sf2_sample.c' object='ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_open_sf2_sample.lo `test -f 'ags/audio/task/ags_open_sf2_sample.c' || echo '$(srcdir)/'`ags/audio/task/ags_open_sf2_sample.c ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo: ags/audio/recall/ags_analyse_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo `test -f 'ags/audio/recall/ags_analyse_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_analyse_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_analyse_audio_signal.lo `test -f 'ags/audio/recall/ags_analyse_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_audio_signal.c ags/audio/recall/libags_audio_la-ags_analyse_channel.lo: ags/audio/recall/ags_analyse_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_analyse_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_analyse_channel.lo `test -f 'ags/audio/recall/ags_analyse_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_analyse_channel.c' object='ags/audio/recall/libags_audio_la-ags_analyse_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_analyse_channel.lo `test -f 'ags/audio/recall/ags_analyse_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_channel.c ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo: ags/audio/recall/ags_analyse_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo `test -f 'ags/audio/recall/ags_analyse_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_analyse_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_analyse_channel_run.lo `test -f 'ags/audio/recall/ags_analyse_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_channel_run.c ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo: ags/audio/recall/ags_analyse_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo `test -f 'ags/audio/recall/ags_analyse_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_analyse_recycling.c' object='ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_analyse_recycling.lo `test -f 'ags/audio/recall/ags_analyse_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_analyse_recycling.c ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo: ags/audio/recall/ags_buffer_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo `test -f 'ags/audio/recall/ags_buffer_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_buffer_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_buffer_audio_signal.lo `test -f 'ags/audio/recall/ags_buffer_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_audio_signal.c ags/audio/recall/libags_audio_la-ags_buffer_channel.lo: ags/audio/recall/ags_buffer_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_buffer_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_buffer_channel.lo `test -f 'ags/audio/recall/ags_buffer_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_buffer_channel.c' object='ags/audio/recall/libags_audio_la-ags_buffer_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_buffer_channel.lo `test -f 'ags/audio/recall/ags_buffer_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_channel.c ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo: ags/audio/recall/ags_buffer_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo `test -f 'ags/audio/recall/ags_buffer_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_buffer_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_buffer_channel_run.lo `test -f 'ags/audio/recall/ags_buffer_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_channel_run.c ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo: ags/audio/recall/ags_buffer_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo `test -f 'ags/audio/recall/ags_buffer_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_buffer_recycling.c' object='ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_buffer_recycling.lo `test -f 'ags/audio/recall/ags_buffer_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_buffer_recycling.c ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo: ags/audio/recall/ags_capture_wave_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo `test -f 'ags/audio/recall/ags_capture_wave_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_capture_wave_audio.c' object='ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_audio.lo `test -f 'ags/audio/recall/ags_capture_wave_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_audio.c ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo: ags/audio/recall/ags_capture_wave_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo `test -f 'ags/audio/recall/ags_capture_wave_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_capture_wave_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_audio_run.lo `test -f 'ags/audio/recall/ags_capture_wave_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_audio_run.c ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo: ags/audio/recall/ags_capture_wave_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo `test -f 'ags/audio/recall/ags_capture_wave_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_capture_wave_channel.c' object='ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_channel.lo `test -f 'ags/audio/recall/ags_capture_wave_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_channel.c ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo: ags/audio/recall/ags_capture_wave_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo `test -f 'ags/audio/recall/ags_capture_wave_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_capture_wave_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_capture_wave_channel_run.lo `test -f 'ags/audio/recall/ags_capture_wave_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_capture_wave_channel_run.c ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo: ags/audio/recall/ags_copy_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo `test -f 'ags/audio/recall/ags_copy_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_audio_signal.lo `test -f 'ags/audio/recall/ags_copy_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_audio_signal.c ags/audio/recall/libags_audio_la-ags_copy_channel.lo: ags/audio/recall/ags_copy_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_channel.lo `test -f 'ags/audio/recall/ags_copy_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_channel.c' object='ags/audio/recall/libags_audio_la-ags_copy_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_channel.lo `test -f 'ags/audio/recall/ags_copy_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_channel.c ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo: ags/audio/recall/ags_copy_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo `test -f 'ags/audio/recall/ags_copy_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_channel_run.lo `test -f 'ags/audio/recall/ags_copy_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_channel_run.c ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo: ags/audio/recall/ags_copy_pattern_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo `test -f 'ags/audio/recall/ags_copy_pattern_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_pattern_audio.c' object='ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_audio.lo `test -f 'ags/audio/recall/ags_copy_pattern_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_audio.c ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo: ags/audio/recall/ags_copy_pattern_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo `test -f 'ags/audio/recall/ags_copy_pattern_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_pattern_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_audio_run.lo `test -f 'ags/audio/recall/ags_copy_pattern_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_audio_run.c ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo: ags/audio/recall/ags_copy_pattern_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo `test -f 'ags/audio/recall/ags_copy_pattern_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_pattern_channel.c' object='ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_channel.lo `test -f 'ags/audio/recall/ags_copy_pattern_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_channel.c ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo: ags/audio/recall/ags_copy_pattern_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo `test -f 'ags/audio/recall/ags_copy_pattern_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_pattern_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_pattern_channel_run.lo `test -f 'ags/audio/recall/ags_copy_pattern_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_pattern_channel_run.c ags/audio/recall/libags_audio_la-ags_copy_recycling.lo: ags/audio/recall/ags_copy_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_copy_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_copy_recycling.lo `test -f 'ags/audio/recall/ags_copy_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_copy_recycling.c' object='ags/audio/recall/libags_audio_la-ags_copy_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_copy_recycling.lo `test -f 'ags/audio/recall/ags_copy_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_copy_recycling.c ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo: ags/audio/recall/ags_count_beats_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo `test -f 'ags/audio/recall/ags_count_beats_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_count_beats_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_count_beats_audio.c' object='ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_count_beats_audio.lo `test -f 'ags/audio/recall/ags_count_beats_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_count_beats_audio.c ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo: ags/audio/recall/ags_count_beats_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo `test -f 'ags/audio/recall/ags_count_beats_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_count_beats_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_count_beats_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_count_beats_audio_run.lo `test -f 'ags/audio/recall/ags_count_beats_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_count_beats_audio_run.c ags/audio/recall/libags_audio_la-ags_delay_audio.lo: ags/audio/recall/ags_delay_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_delay_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_delay_audio.lo `test -f 'ags/audio/recall/ags_delay_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_delay_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_delay_audio.c' object='ags/audio/recall/libags_audio_la-ags_delay_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_delay_audio.lo `test -f 'ags/audio/recall/ags_delay_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_delay_audio.c ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo: ags/audio/recall/ags_delay_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo `test -f 'ags/audio/recall/ags_delay_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_delay_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_delay_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_delay_audio_run.lo `test -f 'ags/audio/recall/ags_delay_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_delay_audio_run.c ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo: ags/audio/recall/ags_envelope_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo `test -f 'ags/audio/recall/ags_envelope_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_envelope_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_envelope_audio_signal.lo `test -f 'ags/audio/recall/ags_envelope_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_audio_signal.c ags/audio/recall/libags_audio_la-ags_envelope_channel.lo: ags/audio/recall/ags_envelope_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_envelope_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_envelope_channel.lo `test -f 'ags/audio/recall/ags_envelope_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_envelope_channel.c' object='ags/audio/recall/libags_audio_la-ags_envelope_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_envelope_channel.lo `test -f 'ags/audio/recall/ags_envelope_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_channel.c ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo: ags/audio/recall/ags_envelope_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo `test -f 'ags/audio/recall/ags_envelope_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_envelope_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_envelope_channel_run.lo `test -f 'ags/audio/recall/ags_envelope_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_channel_run.c ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo: ags/audio/recall/ags_envelope_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo `test -f 'ags/audio/recall/ags_envelope_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_envelope_recycling.c' object='ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_envelope_recycling.lo `test -f 'ags/audio/recall/ags_envelope_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_envelope_recycling.c ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo: ags/audio/recall/ags_eq10_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo `test -f 'ags/audio/recall/ags_eq10_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_eq10_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_eq10_audio_signal.lo `test -f 'ags/audio/recall/ags_eq10_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_audio_signal.c ags/audio/recall/libags_audio_la-ags_eq10_channel.lo: ags/audio/recall/ags_eq10_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_eq10_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_eq10_channel.lo `test -f 'ags/audio/recall/ags_eq10_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_eq10_channel.c' object='ags/audio/recall/libags_audio_la-ags_eq10_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_eq10_channel.lo `test -f 'ags/audio/recall/ags_eq10_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_channel.c ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo: ags/audio/recall/ags_eq10_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo `test -f 'ags/audio/recall/ags_eq10_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_eq10_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_eq10_channel_run.lo `test -f 'ags/audio/recall/ags_eq10_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_channel_run.c ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo: ags/audio/recall/ags_eq10_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo `test -f 'ags/audio/recall/ags_eq10_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_eq10_recycling.c' object='ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_eq10_recycling.lo `test -f 'ags/audio/recall/ags_eq10_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_eq10_recycling.c ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo: ags/audio/recall/ags_feed_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo `test -f 'ags/audio/recall/ags_feed_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_feed_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_feed_audio_signal.lo `test -f 'ags/audio/recall/ags_feed_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_audio_signal.c ags/audio/recall/libags_audio_la-ags_feed_channel.lo: ags/audio/recall/ags_feed_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_feed_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_feed_channel.lo `test -f 'ags/audio/recall/ags_feed_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_feed_channel.c' object='ags/audio/recall/libags_audio_la-ags_feed_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_feed_channel.lo `test -f 'ags/audio/recall/ags_feed_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_channel.c ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo: ags/audio/recall/ags_feed_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo `test -f 'ags/audio/recall/ags_feed_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_feed_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_feed_channel_run.lo `test -f 'ags/audio/recall/ags_feed_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_channel_run.c ags/audio/recall/libags_audio_la-ags_feed_recycling.lo: ags/audio/recall/ags_feed_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_feed_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_feed_recycling.lo `test -f 'ags/audio/recall/ags_feed_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_feed_recycling.c' object='ags/audio/recall/libags_audio_la-ags_feed_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_feed_recycling.lo `test -f 'ags/audio/recall/ags_feed_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_feed_recycling.c ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo: ags/audio/recall/ags_lfo_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo `test -f 'ags/audio/recall/ags_lfo_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_lfo_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_lfo_audio_signal.lo `test -f 'ags/audio/recall/ags_lfo_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_audio_signal.c ags/audio/recall/libags_audio_la-ags_lfo_channel.lo: ags/audio/recall/ags_lfo_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_lfo_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_lfo_channel.lo `test -f 'ags/audio/recall/ags_lfo_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_lfo_channel.c' object='ags/audio/recall/libags_audio_la-ags_lfo_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_lfo_channel.lo `test -f 'ags/audio/recall/ags_lfo_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_channel.c ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo: ags/audio/recall/ags_lfo_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo `test -f 'ags/audio/recall/ags_lfo_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_lfo_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_lfo_channel_run.lo `test -f 'ags/audio/recall/ags_lfo_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_channel_run.c ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo: ags/audio/recall/ags_lfo_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo `test -f 'ags/audio/recall/ags_lfo_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_lfo_recycling.c' object='ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_lfo_recycling.lo `test -f 'ags/audio/recall/ags_lfo_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_lfo_recycling.c ags/audio/recall/libags_audio_la-ags_loop_channel.lo: ags/audio/recall/ags_loop_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_loop_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_loop_channel.lo `test -f 'ags/audio/recall/ags_loop_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_loop_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_loop_channel.c' object='ags/audio/recall/libags_audio_la-ags_loop_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_loop_channel.lo `test -f 'ags/audio/recall/ags_loop_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_loop_channel.c ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo: ags/audio/recall/ags_loop_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo `test -f 'ags/audio/recall/ags_loop_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_loop_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_loop_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_loop_channel_run.lo `test -f 'ags/audio/recall/ags_loop_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_loop_channel_run.c ags/audio/recall/libags_audio_la-ags_mute_audio.lo: ags/audio/recall/ags_mute_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_mute_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_mute_audio.lo `test -f 'ags/audio/recall/ags_mute_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_mute_audio.c' object='ags/audio/recall/libags_audio_la-ags_mute_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_mute_audio.lo `test -f 'ags/audio/recall/ags_mute_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_audio.c ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo: ags/audio/recall/ags_mute_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo `test -f 'ags/audio/recall/ags_mute_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_mute_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_mute_audio_run.lo `test -f 'ags/audio/recall/ags_mute_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_audio_run.c ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo: ags/audio/recall/ags_mute_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo `test -f 'ags/audio/recall/ags_mute_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_mute_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_mute_audio_signal.lo `test -f 'ags/audio/recall/ags_mute_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_audio_signal.c ags/audio/recall/libags_audio_la-ags_mute_channel.lo: ags/audio/recall/ags_mute_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_mute_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_mute_channel.lo `test -f 'ags/audio/recall/ags_mute_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_mute_channel.c' object='ags/audio/recall/libags_audio_la-ags_mute_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_mute_channel.lo `test -f 'ags/audio/recall/ags_mute_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_channel.c ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo: ags/audio/recall/ags_mute_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo `test -f 'ags/audio/recall/ags_mute_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_mute_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_mute_channel_run.lo `test -f 'ags/audio/recall/ags_mute_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_channel_run.c ags/audio/recall/libags_audio_la-ags_mute_recycling.lo: ags/audio/recall/ags_mute_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_mute_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_mute_recycling.lo `test -f 'ags/audio/recall/ags_mute_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_mute_recycling.c' object='ags/audio/recall/libags_audio_la-ags_mute_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_mute_recycling.lo `test -f 'ags/audio/recall/ags_mute_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_mute_recycling.c ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo: ags/audio/recall/ags_peak_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo `test -f 'ags/audio/recall/ags_peak_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_peak_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_peak_audio_signal.lo `test -f 'ags/audio/recall/ags_peak_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_audio_signal.c ags/audio/recall/libags_audio_la-ags_peak_channel.lo: ags/audio/recall/ags_peak_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_peak_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_peak_channel.lo `test -f 'ags/audio/recall/ags_peak_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_peak_channel.c' object='ags/audio/recall/libags_audio_la-ags_peak_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_peak_channel.lo `test -f 'ags/audio/recall/ags_peak_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_channel.c ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo: ags/audio/recall/ags_peak_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo `test -f 'ags/audio/recall/ags_peak_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_peak_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_peak_channel_run.lo `test -f 'ags/audio/recall/ags_peak_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_channel_run.c ags/audio/recall/libags_audio_la-ags_peak_recycling.lo: ags/audio/recall/ags_peak_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_peak_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_peak_recycling.lo `test -f 'ags/audio/recall/ags_peak_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_peak_recycling.c' object='ags/audio/recall/libags_audio_la-ags_peak_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_peak_recycling.lo `test -f 'ags/audio/recall/ags_peak_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_peak_recycling.c ags/audio/recall/libags_audio_la-ags_play_audio.lo: ags/audio/recall/ags_play_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_audio.lo `test -f 'ags/audio/recall/ags_play_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_audio.c' object='ags/audio/recall/libags_audio_la-ags_play_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_audio.lo `test -f 'ags/audio/recall/ags_play_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_audio.c ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo: ags/audio/recall/ags_play_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo `test -f 'ags/audio/recall/ags_play_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_audio_signal.lo `test -f 'ags/audio/recall/ags_play_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_audio_signal.c ags/audio/recall/libags_audio_la-ags_play_channel.lo: ags/audio/recall/ags_play_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_channel.lo `test -f 'ags/audio/recall/ags_play_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_channel.c' object='ags/audio/recall/libags_audio_la-ags_play_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_channel.lo `test -f 'ags/audio/recall/ags_play_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_channel.c ags/audio/recall/libags_audio_la-ags_play_channel_run.lo: ags/audio/recall/ags_play_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_channel_run.lo `test -f 'ags/audio/recall/ags_play_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_play_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_channel_run.lo `test -f 'ags/audio/recall/ags_play_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_channel_run.c ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo: ags/audio/recall/ags_play_channel_run_master.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo `test -f 'ags/audio/recall/ags_play_channel_run_master.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_channel_run_master.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_channel_run_master.c' object='ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_channel_run_master.lo `test -f 'ags/audio/recall/ags_play_channel_run_master.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_channel_run_master.c ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo: ags/audio/recall/ags_play_dssi_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo `test -f 'ags/audio/recall/ags_play_dssi_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_dssi_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_dssi_audio.c' object='ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_dssi_audio.lo `test -f 'ags/audio/recall/ags_play_dssi_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_dssi_audio.c ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo: ags/audio/recall/ags_play_dssi_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo `test -f 'ags/audio/recall/ags_play_dssi_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_dssi_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_dssi_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_dssi_audio_run.lo `test -f 'ags/audio/recall/ags_play_dssi_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_dssi_audio_run.c ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo: ags/audio/recall/ags_play_lv2_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo `test -f 'ags/audio/recall/ags_play_lv2_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_lv2_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_lv2_audio.c' object='ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_lv2_audio.lo `test -f 'ags/audio/recall/ags_play_lv2_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_lv2_audio.c ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo: ags/audio/recall/ags_play_lv2_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo `test -f 'ags/audio/recall/ags_play_lv2_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_lv2_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_lv2_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_lv2_audio_run.lo `test -f 'ags/audio/recall/ags_play_lv2_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_lv2_audio_run.c ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo: ags/audio/recall/ags_play_notation_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo `test -f 'ags/audio/recall/ags_play_notation_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_notation_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_notation_audio.c' object='ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_notation_audio.lo `test -f 'ags/audio/recall/ags_play_notation_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_notation_audio.c ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo: ags/audio/recall/ags_play_notation_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo `test -f 'ags/audio/recall/ags_play_notation_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_notation_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_notation_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_notation_audio_run.lo `test -f 'ags/audio/recall/ags_play_notation_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_notation_audio_run.c ags/audio/recall/libags_audio_la-ags_play_recycling.lo: ags/audio/recall/ags_play_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_recycling.lo `test -f 'ags/audio/recall/ags_play_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_recycling.c' object='ags/audio/recall/libags_audio_la-ags_play_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_recycling.lo `test -f 'ags/audio/recall/ags_play_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_recycling.c ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo: ags/audio/recall/ags_play_wave_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo `test -f 'ags/audio/recall/ags_play_wave_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_wave_audio.c' object='ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_wave_audio.lo `test -f 'ags/audio/recall/ags_play_wave_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_audio.c ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo: ags/audio/recall/ags_play_wave_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo `test -f 'ags/audio/recall/ags_play_wave_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_wave_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_wave_audio_run.lo `test -f 'ags/audio/recall/ags_play_wave_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_audio_run.c ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo: ags/audio/recall/ags_play_wave_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo `test -f 'ags/audio/recall/ags_play_wave_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_wave_channel.c' object='ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_wave_channel.lo `test -f 'ags/audio/recall/ags_play_wave_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_channel.c ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo: ags/audio/recall/ags_play_wave_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo `test -f 'ags/audio/recall/ags_play_wave_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_play_wave_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_play_wave_channel_run.lo `test -f 'ags/audio/recall/ags_play_wave_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_play_wave_channel_run.c ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo: ags/audio/recall/ags_prepare_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo `test -f 'ags/audio/recall/ags_prepare_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_prepare_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_prepare_audio_signal.lo `test -f 'ags/audio/recall/ags_prepare_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_audio_signal.c ags/audio/recall/libags_audio_la-ags_prepare_channel.lo: ags/audio/recall/ags_prepare_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_prepare_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_prepare_channel.lo `test -f 'ags/audio/recall/ags_prepare_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_prepare_channel.c' object='ags/audio/recall/libags_audio_la-ags_prepare_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_prepare_channel.lo `test -f 'ags/audio/recall/ags_prepare_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_channel.c ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo: ags/audio/recall/ags_prepare_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo `test -f 'ags/audio/recall/ags_prepare_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_prepare_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_prepare_channel_run.lo `test -f 'ags/audio/recall/ags_prepare_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_channel_run.c ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo: ags/audio/recall/ags_prepare_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo `test -f 'ags/audio/recall/ags_prepare_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_prepare_recycling.c' object='ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_prepare_recycling.lo `test -f 'ags/audio/recall/ags_prepare_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_prepare_recycling.c ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo: ags/audio/recall/ags_record_midi_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo `test -f 'ags/audio/recall/ags_record_midi_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_record_midi_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_record_midi_audio.c' object='ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_record_midi_audio.lo `test -f 'ags/audio/recall/ags_record_midi_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_record_midi_audio.c ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo: ags/audio/recall/ags_record_midi_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo `test -f 'ags/audio/recall/ags_record_midi_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_record_midi_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_record_midi_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_record_midi_audio_run.lo `test -f 'ags/audio/recall/ags_record_midi_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_record_midi_audio_run.c ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo: ags/audio/recall/ags_route_dssi_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo `test -f 'ags/audio/recall/ags_route_dssi_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_dssi_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_route_dssi_audio.c' object='ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_route_dssi_audio.lo `test -f 'ags/audio/recall/ags_route_dssi_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_dssi_audio.c ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo: ags/audio/recall/ags_route_dssi_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo `test -f 'ags/audio/recall/ags_route_dssi_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_dssi_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_route_dssi_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_route_dssi_audio_run.lo `test -f 'ags/audio/recall/ags_route_dssi_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_dssi_audio_run.c ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo: ags/audio/recall/ags_route_lv2_audio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Tpo -c -o ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo `test -f 'ags/audio/recall/ags_route_lv2_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_lv2_audio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_route_lv2_audio.c' object='ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_route_lv2_audio.lo `test -f 'ags/audio/recall/ags_route_lv2_audio.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_lv2_audio.c ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo: ags/audio/recall/ags_route_lv2_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo `test -f 'ags/audio/recall/ags_route_lv2_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_lv2_audio_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_route_lv2_audio_run.c' object='ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_route_lv2_audio_run.lo `test -f 'ags/audio/recall/ags_route_lv2_audio_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_route_lv2_audio_run.c ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo: ags/audio/recall/ags_rt_stream_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo `test -f 'ags/audio/recall/ags_rt_stream_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_rt_stream_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_audio_signal.lo `test -f 'ags/audio/recall/ags_rt_stream_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_audio_signal.c ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo: ags/audio/recall/ags_rt_stream_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo `test -f 'ags/audio/recall/ags_rt_stream_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_rt_stream_channel.c' object='ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_channel.lo `test -f 'ags/audio/recall/ags_rt_stream_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_channel.c ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo: ags/audio/recall/ags_rt_stream_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo `test -f 'ags/audio/recall/ags_rt_stream_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_rt_stream_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_channel_run.lo `test -f 'ags/audio/recall/ags_rt_stream_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_channel_run.c ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo: ags/audio/recall/ags_rt_stream_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo `test -f 'ags/audio/recall/ags_rt_stream_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_rt_stream_recycling.c' object='ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_rt_stream_recycling.lo `test -f 'ags/audio/recall/ags_rt_stream_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_rt_stream_recycling.c ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo: ags/audio/recall/ags_stream_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo `test -f 'ags/audio/recall/ags_stream_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_stream_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_stream_audio_signal.lo `test -f 'ags/audio/recall/ags_stream_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_audio_signal.c ags/audio/recall/libags_audio_la-ags_stream_channel.lo: ags/audio/recall/ags_stream_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_stream_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_stream_channel.lo `test -f 'ags/audio/recall/ags_stream_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_stream_channel.c' object='ags/audio/recall/libags_audio_la-ags_stream_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_stream_channel.lo `test -f 'ags/audio/recall/ags_stream_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_channel.c ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo: ags/audio/recall/ags_stream_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo `test -f 'ags/audio/recall/ags_stream_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_stream_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_stream_channel_run.lo `test -f 'ags/audio/recall/ags_stream_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_channel_run.c ags/audio/recall/libags_audio_la-ags_stream_recycling.lo: ags/audio/recall/ags_stream_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_stream_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_stream_recycling.lo `test -f 'ags/audio/recall/ags_stream_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_stream_recycling.c' object='ags/audio/recall/libags_audio_la-ags_stream_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_stream_recycling.lo `test -f 'ags/audio/recall/ags_stream_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_stream_recycling.c ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo: ags/audio/recall/ags_volume_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Tpo -c -o ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo `test -f 'ags/audio/recall/ags_volume_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_audio_signal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_volume_audio_signal.c' object='ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_volume_audio_signal.lo `test -f 'ags/audio/recall/ags_volume_audio_signal.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_audio_signal.c ags/audio/recall/libags_audio_la-ags_volume_channel.lo: ags/audio/recall/ags_volume_channel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_volume_channel.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Tpo -c -o ags/audio/recall/libags_audio_la-ags_volume_channel.lo `test -f 'ags/audio/recall/ags_volume_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_channel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_volume_channel.c' object='ags/audio/recall/libags_audio_la-ags_volume_channel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_volume_channel.lo `test -f 'ags/audio/recall/ags_volume_channel.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_channel.c ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo: ags/audio/recall/ags_volume_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Tpo -c -o ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo `test -f 'ags/audio/recall/ags_volume_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_channel_run.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_volume_channel_run.c' object='ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_volume_channel_run.lo `test -f 'ags/audio/recall/ags_volume_channel_run.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_channel_run.c ags/audio/recall/libags_audio_la-ags_volume_recycling.lo: ags/audio/recall/ags_volume_recycling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/recall/libags_audio_la-ags_volume_recycling.lo -MD -MP -MF ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Tpo -c -o ags/audio/recall/libags_audio_la-ags_volume_recycling.lo `test -f 'ags/audio/recall/ags_volume_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_recycling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Tpo ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/audio/recall/ags_volume_recycling.c' object='ags/audio/recall/libags_audio_la-ags_volume_recycling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/recall/libags_audio_la-ags_volume_recycling.lo `test -f 'ags/audio/recall/ags_volume_recycling.c' || echo '$(srcdir)/'`ags/audio/recall/ags_volume_recycling.c ags/plugin/libags_audio_la-ags_base_plugin.lo: ags/plugin/ags_base_plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_base_plugin.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Tpo -c -o ags/plugin/libags_audio_la-ags_base_plugin.lo `test -f 'ags/plugin/ags_base_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_base_plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_base_plugin.c' object='ags/plugin/libags_audio_la-ags_base_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_base_plugin.lo `test -f 'ags/plugin/ags_base_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_base_plugin.c ags/plugin/libags_audio_la-ags_dssi_manager.lo: ags/plugin/ags_dssi_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_dssi_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_dssi_manager.lo `test -f 'ags/plugin/ags_dssi_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_dssi_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_dssi_manager.c' object='ags/plugin/libags_audio_la-ags_dssi_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_dssi_manager.lo `test -f 'ags/plugin/ags_dssi_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_dssi_manager.c ags/plugin/libags_audio_la-ags_dssi_plugin.lo: ags/plugin/ags_dssi_plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_dssi_plugin.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Tpo -c -o ags/plugin/libags_audio_la-ags_dssi_plugin.lo `test -f 'ags/plugin/ags_dssi_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_dssi_plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_dssi_plugin.c' object='ags/plugin/libags_audio_la-ags_dssi_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_dssi_plugin.lo `test -f 'ags/plugin/ags_dssi_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_dssi_plugin.c ags/plugin/libags_audio_la-ags_ladspa_conversion.lo: ags/plugin/ags_ladspa_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_ladspa_conversion.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Tpo -c -o ags/plugin/libags_audio_la-ags_ladspa_conversion.lo `test -f 'ags/plugin/ags_ladspa_conversion.c' || echo '$(srcdir)/'`ags/plugin/ags_ladspa_conversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_ladspa_conversion.c' object='ags/plugin/libags_audio_la-ags_ladspa_conversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_ladspa_conversion.lo `test -f 'ags/plugin/ags_ladspa_conversion.c' || echo '$(srcdir)/'`ags/plugin/ags_ladspa_conversion.c ags/plugin/libags_audio_la-ags_ladspa_manager.lo: ags/plugin/ags_ladspa_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_ladspa_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_ladspa_manager.lo `test -f 'ags/plugin/ags_ladspa_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_ladspa_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_ladspa_manager.c' object='ags/plugin/libags_audio_la-ags_ladspa_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_ladspa_manager.lo `test -f 'ags/plugin/ags_ladspa_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_ladspa_manager.c ags/plugin/libags_audio_la-ags_ladspa_plugin.lo: ags/plugin/ags_ladspa_plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_ladspa_plugin.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Tpo -c -o ags/plugin/libags_audio_la-ags_ladspa_plugin.lo `test -f 'ags/plugin/ags_ladspa_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_ladspa_plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_ladspa_plugin.c' object='ags/plugin/libags_audio_la-ags_ladspa_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_ladspa_plugin.lo `test -f 'ags/plugin/ags_ladspa_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_ladspa_plugin.c ags/plugin/libags_audio_la-ags_lv2_conversion.lo: ags/plugin/ags_lv2_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_conversion.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_conversion.lo `test -f 'ags/plugin/ags_lv2_conversion.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_conversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_conversion.c' object='ags/plugin/libags_audio_la-ags_lv2_conversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_conversion.lo `test -f 'ags/plugin/ags_lv2_conversion.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_conversion.c ags/plugin/libags_audio_la-ags_lv2_manager.lo: ags/plugin/ags_lv2_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_manager.lo `test -f 'ags/plugin/ags_lv2_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_manager.lo `test -f 'ags/plugin/ags_lv2_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_manager.c ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo: ags/plugin/ags_lv2_turtle_parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo `test -f 'ags/plugin/ags_lv2_turtle_parser.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_turtle_parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_turtle_parser.c' object='ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_turtle_parser.lo `test -f 'ags/plugin/ags_lv2_turtle_parser.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_turtle_parser.c ags/plugin/libags_audio_la-ags_lv2_plugin.lo: ags/plugin/ags_lv2_plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_plugin.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_plugin.lo `test -f 'ags/plugin/ags_lv2_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_plugin.c' object='ags/plugin/libags_audio_la-ags_lv2_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_plugin.lo `test -f 'ags/plugin/ags_lv2_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_plugin.c ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo: ags/plugin/ags_lv2_preset_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo `test -f 'ags/plugin/ags_lv2_preset_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_preset_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_preset_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_preset_manager.lo `test -f 'ags/plugin/ags_lv2_preset_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_preset_manager.c ags/plugin/libags_audio_la-ags_lv2_preset.lo: ags/plugin/ags_lv2_preset.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_preset.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_preset.lo `test -f 'ags/plugin/ags_lv2_preset.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_preset.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_preset.c' object='ags/plugin/libags_audio_la-ags_lv2_preset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_preset.lo `test -f 'ags/plugin/ags_lv2_preset.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_preset.c ags/plugin/libags_audio_la-ags_lv2_log_manager.lo: ags/plugin/ags_lv2_log_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_log_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_log_manager.lo `test -f 'ags/plugin/ags_lv2_log_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_log_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_log_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_log_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_log_manager.lo `test -f 'ags/plugin/ags_lv2_log_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_log_manager.c ags/plugin/libags_audio_la-ags_lv2_event_manager.lo: ags/plugin/ags_lv2_event_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_event_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_event_manager.lo `test -f 'ags/plugin/ags_lv2_event_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_event_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_event_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_event_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_event_manager.lo `test -f 'ags/plugin/ags_lv2_event_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_event_manager.c ags/plugin/libags_audio_la-ags_lv2_option_manager.lo: ags/plugin/ags_lv2_option_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_option_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_option_manager.lo `test -f 'ags/plugin/ags_lv2_option_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_option_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_option_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_option_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_option_manager.lo `test -f 'ags/plugin/ags_lv2_option_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_option_manager.c ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo: ags/plugin/ags_lv2_uri_map_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo `test -f 'ags/plugin/ags_lv2_uri_map_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_uri_map_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_uri_map_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_uri_map_manager.lo `test -f 'ags/plugin/ags_lv2_uri_map_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_uri_map_manager.c ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo: ags/plugin/ags_lv2_urid_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo `test -f 'ags/plugin/ags_lv2_urid_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_urid_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_urid_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_urid_manager.lo `test -f 'ags/plugin/ags_lv2_urid_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_urid_manager.c ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo: ags/plugin/ags_lv2_worker_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo `test -f 'ags/plugin/ags_lv2_worker_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_worker_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_worker_manager.c' object='ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_worker_manager.lo `test -f 'ags/plugin/ags_lv2_worker_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_worker_manager.c ags/plugin/libags_audio_la-ags_lv2_worker.lo: ags/plugin/ags_lv2_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2_worker.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2_worker.lo `test -f 'ags/plugin/ags_lv2_worker.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2_worker.c' object='ags/plugin/libags_audio_la-ags_lv2_worker.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2_worker.lo `test -f 'ags/plugin/ags_lv2_worker.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2_worker.c ags/plugin/libags_audio_la-ags_lv2ui_manager.lo: ags/plugin/ags_lv2ui_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2ui_manager.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2ui_manager.lo `test -f 'ags/plugin/ags_lv2ui_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2ui_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2ui_manager.c' object='ags/plugin/libags_audio_la-ags_lv2ui_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2ui_manager.lo `test -f 'ags/plugin/ags_lv2ui_manager.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2ui_manager.c ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo: ags/plugin/ags_lv2ui_plugin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Tpo -c -o ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo `test -f 'ags/plugin/ags_lv2ui_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2ui_plugin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_lv2ui_plugin.c' object='ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_lv2ui_plugin.lo `test -f 'ags/plugin/ags_lv2ui_plugin.c' || echo '$(srcdir)/'`ags/plugin/ags_lv2ui_plugin.c ags/plugin/libags_audio_la-ags_plugin_port.lo: ags/plugin/ags_plugin_port.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/plugin/libags_audio_la-ags_plugin_port.lo -MD -MP -MF ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Tpo -c -o ags/plugin/libags_audio_la-ags_plugin_port.lo `test -f 'ags/plugin/ags_plugin_port.c' || echo '$(srcdir)/'`ags/plugin/ags_plugin_port.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Tpo ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/plugin/ags_plugin_port.c' object='ags/plugin/libags_audio_la-ags_plugin_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/plugin/libags_audio_la-ags_plugin_port.lo `test -f 'ags/plugin/ags_plugin_port.c' || echo '$(srcdir)/'`ags/plugin/ags_plugin_port.c ags/widget/libags_gui_la-ags_cartesian.lo: ags/widget/ags_cartesian.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_cartesian.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Tpo -c -o ags/widget/libags_gui_la-ags_cartesian.lo `test -f 'ags/widget/ags_cartesian.c' || echo '$(srcdir)/'`ags/widget/ags_cartesian.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_cartesian.c' object='ags/widget/libags_gui_la-ags_cartesian.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_cartesian.lo `test -f 'ags/widget/ags_cartesian.c' || echo '$(srcdir)/'`ags/widget/ags_cartesian.c ags/widget/libags_gui_la-ags_dial.lo: ags/widget/ags_dial.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_dial.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Tpo -c -o ags/widget/libags_gui_la-ags_dial.lo `test -f 'ags/widget/ags_dial.c' || echo '$(srcdir)/'`ags/widget/ags_dial.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_dial.c' object='ags/widget/libags_gui_la-ags_dial.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_dial.lo `test -f 'ags/widget/ags_dial.c' || echo '$(srcdir)/'`ags/widget/ags_dial.c ags/widget/libags_gui_la-ags_expander.lo: ags/widget/ags_expander.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_expander.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Tpo -c -o ags/widget/libags_gui_la-ags_expander.lo `test -f 'ags/widget/ags_expander.c' || echo '$(srcdir)/'`ags/widget/ags_expander.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_expander.c' object='ags/widget/libags_gui_la-ags_expander.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_expander.lo `test -f 'ags/widget/ags_expander.c' || echo '$(srcdir)/'`ags/widget/ags_expander.c ags/widget/libags_gui_la-ags_expander_set.lo: ags/widget/ags_expander_set.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_expander_set.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Tpo -c -o ags/widget/libags_gui_la-ags_expander_set.lo `test -f 'ags/widget/ags_expander_set.c' || echo '$(srcdir)/'`ags/widget/ags_expander_set.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_expander_set.c' object='ags/widget/libags_gui_la-ags_expander_set.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_expander_set.lo `test -f 'ags/widget/ags_expander_set.c' || echo '$(srcdir)/'`ags/widget/ags_expander_set.c ags/widget/libags_gui_la-ags_hindicator.lo: ags/widget/ags_hindicator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_hindicator.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Tpo -c -o ags/widget/libags_gui_la-ags_hindicator.lo `test -f 'ags/widget/ags_hindicator.c' || echo '$(srcdir)/'`ags/widget/ags_hindicator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_hindicator.c' object='ags/widget/libags_gui_la-ags_hindicator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_hindicator.lo `test -f 'ags/widget/ags_hindicator.c' || echo '$(srcdir)/'`ags/widget/ags_hindicator.c ags/widget/libags_gui_la-ags_hled_array.lo: ags/widget/ags_hled_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_hled_array.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Tpo -c -o ags/widget/libags_gui_la-ags_hled_array.lo `test -f 'ags/widget/ags_hled_array.c' || echo '$(srcdir)/'`ags/widget/ags_hled_array.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_hled_array.c' object='ags/widget/libags_gui_la-ags_hled_array.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_hled_array.lo `test -f 'ags/widget/ags_hled_array.c' || echo '$(srcdir)/'`ags/widget/ags_hled_array.c ags/widget/libags_gui_la-ags_indicator.lo: ags/widget/ags_indicator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_indicator.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Tpo -c -o ags/widget/libags_gui_la-ags_indicator.lo `test -f 'ags/widget/ags_indicator.c' || echo '$(srcdir)/'`ags/widget/ags_indicator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_indicator.c' object='ags/widget/libags_gui_la-ags_indicator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_indicator.lo `test -f 'ags/widget/ags_indicator.c' || echo '$(srcdir)/'`ags/widget/ags_indicator.c ags/widget/libags_gui_la-ags_led.lo: ags/widget/ags_led.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_led.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Tpo -c -o ags/widget/libags_gui_la-ags_led.lo `test -f 'ags/widget/ags_led.c' || echo '$(srcdir)/'`ags/widget/ags_led.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_led.c' object='ags/widget/libags_gui_la-ags_led.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_led.lo `test -f 'ags/widget/ags_led.c' || echo '$(srcdir)/'`ags/widget/ags_led.c ags/widget/libags_gui_la-ags_led_array.lo: ags/widget/ags_led_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_led_array.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Tpo -c -o ags/widget/libags_gui_la-ags_led_array.lo `test -f 'ags/widget/ags_led_array.c' || echo '$(srcdir)/'`ags/widget/ags_led_array.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_led_array.c' object='ags/widget/libags_gui_la-ags_led_array.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_led_array.lo `test -f 'ags/widget/ags_led_array.c' || echo '$(srcdir)/'`ags/widget/ags_led_array.c ags/widget/libags_gui_la-ags_level.lo: ags/widget/ags_level.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_level.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Tpo -c -o ags/widget/libags_gui_la-ags_level.lo `test -f 'ags/widget/ags_level.c' || echo '$(srcdir)/'`ags/widget/ags_level.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_level.c' object='ags/widget/libags_gui_la-ags_level.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_level.lo `test -f 'ags/widget/ags_level.c' || echo '$(srcdir)/'`ags/widget/ags_level.c ags/widget/libags_gui_la-ags_level_box.lo: ags/widget/ags_level_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_level_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Tpo -c -o ags/widget/libags_gui_la-ags_level_box.lo `test -f 'ags/widget/ags_level_box.c' || echo '$(srcdir)/'`ags/widget/ags_level_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_level_box.c' object='ags/widget/libags_gui_la-ags_level_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_level_box.lo `test -f 'ags/widget/ags_level_box.c' || echo '$(srcdir)/'`ags/widget/ags_level_box.c ags/widget/libags_gui_la-ags_hlevel_box.lo: ags/widget/ags_hlevel_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_hlevel_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Tpo -c -o ags/widget/libags_gui_la-ags_hlevel_box.lo `test -f 'ags/widget/ags_hlevel_box.c' || echo '$(srcdir)/'`ags/widget/ags_hlevel_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_hlevel_box.c' object='ags/widget/libags_gui_la-ags_hlevel_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_hlevel_box.lo `test -f 'ags/widget/ags_hlevel_box.c' || echo '$(srcdir)/'`ags/widget/ags_hlevel_box.c ags/widget/libags_gui_la-ags_vlevel_box.lo: ags/widget/ags_vlevel_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_vlevel_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Tpo -c -o ags/widget/libags_gui_la-ags_vlevel_box.lo `test -f 'ags/widget/ags_vlevel_box.c' || echo '$(srcdir)/'`ags/widget/ags_vlevel_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_vlevel_box.c' object='ags/widget/libags_gui_la-ags_vlevel_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_vlevel_box.lo `test -f 'ags/widget/ags_vlevel_box.c' || echo '$(srcdir)/'`ags/widget/ags_vlevel_box.c ags/widget/libags_gui_la-ags_notebook.lo: ags/widget/ags_notebook.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_notebook.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Tpo -c -o ags/widget/libags_gui_la-ags_notebook.lo `test -f 'ags/widget/ags_notebook.c' || echo '$(srcdir)/'`ags/widget/ags_notebook.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_notebook.c' object='ags/widget/libags_gui_la-ags_notebook.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_notebook.lo `test -f 'ags/widget/ags_notebook.c' || echo '$(srcdir)/'`ags/widget/ags_notebook.c ags/widget/libags_gui_la-ags_piano.lo: ags/widget/ags_piano.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_piano.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Tpo -c -o ags/widget/libags_gui_la-ags_piano.lo `test -f 'ags/widget/ags_piano.c' || echo '$(srcdir)/'`ags/widget/ags_piano.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_piano.c' object='ags/widget/libags_gui_la-ags_piano.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_piano.lo `test -f 'ags/widget/ags_piano.c' || echo '$(srcdir)/'`ags/widget/ags_piano.c ags/widget/libags_gui_la-ags_scrolled_piano.lo: ags/widget/ags_scrolled_piano.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_scrolled_piano.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Tpo -c -o ags/widget/libags_gui_la-ags_scrolled_piano.lo `test -f 'ags/widget/ags_scrolled_piano.c' || echo '$(srcdir)/'`ags/widget/ags_scrolled_piano.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_scrolled_piano.c' object='ags/widget/libags_gui_la-ags_scrolled_piano.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_scrolled_piano.lo `test -f 'ags/widget/ags_scrolled_piano.c' || echo '$(srcdir)/'`ags/widget/ags_scrolled_piano.c ags/widget/libags_gui_la-ags_scale.lo: ags/widget/ags_scale.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_scale.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Tpo -c -o ags/widget/libags_gui_la-ags_scale.lo `test -f 'ags/widget/ags_scale.c' || echo '$(srcdir)/'`ags/widget/ags_scale.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_scale.c' object='ags/widget/libags_gui_la-ags_scale.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_scale.lo `test -f 'ags/widget/ags_scale.c' || echo '$(srcdir)/'`ags/widget/ags_scale.c ags/widget/libags_gui_la-ags_scale_box.lo: ags/widget/ags_scale_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_scale_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Tpo -c -o ags/widget/libags_gui_la-ags_scale_box.lo `test -f 'ags/widget/ags_scale_box.c' || echo '$(srcdir)/'`ags/widget/ags_scale_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_scale_box.c' object='ags/widget/libags_gui_la-ags_scale_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_scale_box.lo `test -f 'ags/widget/ags_scale_box.c' || echo '$(srcdir)/'`ags/widget/ags_scale_box.c ags/widget/libags_gui_la-ags_vscale_box.lo: ags/widget/ags_vscale_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_vscale_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Tpo -c -o ags/widget/libags_gui_la-ags_vscale_box.lo `test -f 'ags/widget/ags_vscale_box.c' || echo '$(srcdir)/'`ags/widget/ags_vscale_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_vscale_box.c' object='ags/widget/libags_gui_la-ags_vscale_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_vscale_box.lo `test -f 'ags/widget/ags_vscale_box.c' || echo '$(srcdir)/'`ags/widget/ags_vscale_box.c ags/widget/libags_gui_la-ags_hscale_box.lo: ags/widget/ags_hscale_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_hscale_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Tpo -c -o ags/widget/libags_gui_la-ags_hscale_box.lo `test -f 'ags/widget/ags_hscale_box.c' || echo '$(srcdir)/'`ags/widget/ags_hscale_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_hscale_box.c' object='ags/widget/libags_gui_la-ags_hscale_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_hscale_box.lo `test -f 'ags/widget/ags_hscale_box.c' || echo '$(srcdir)/'`ags/widget/ags_hscale_box.c ags/widget/libags_gui_la-ags_scrolled_scale_box.lo: ags/widget/ags_scrolled_scale_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_scrolled_scale_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Tpo -c -o ags/widget/libags_gui_la-ags_scrolled_scale_box.lo `test -f 'ags/widget/ags_scrolled_scale_box.c' || echo '$(srcdir)/'`ags/widget/ags_scrolled_scale_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_scrolled_scale_box.c' object='ags/widget/libags_gui_la-ags_scrolled_scale_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_scrolled_scale_box.lo `test -f 'ags/widget/ags_scrolled_scale_box.c' || echo '$(srcdir)/'`ags/widget/ags_scrolled_scale_box.c ags/widget/libags_gui_la-ags_scrolled_level_box.lo: ags/widget/ags_scrolled_level_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_scrolled_level_box.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Tpo -c -o ags/widget/libags_gui_la-ags_scrolled_level_box.lo `test -f 'ags/widget/ags_scrolled_level_box.c' || echo '$(srcdir)/'`ags/widget/ags_scrolled_level_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_scrolled_level_box.c' object='ags/widget/libags_gui_la-ags_scrolled_level_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_scrolled_level_box.lo `test -f 'ags/widget/ags_scrolled_level_box.c' || echo '$(srcdir)/'`ags/widget/ags_scrolled_level_box.c ags/widget/libags_gui_la-ags_ruler.lo: ags/widget/ags_ruler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_ruler.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Tpo -c -o ags/widget/libags_gui_la-ags_ruler.lo `test -f 'ags/widget/ags_ruler.c' || echo '$(srcdir)/'`ags/widget/ags_ruler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_ruler.c' object='ags/widget/libags_gui_la-ags_ruler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_ruler.lo `test -f 'ags/widget/ags_ruler.c' || echo '$(srcdir)/'`ags/widget/ags_ruler.c ags/widget/libags_gui_la-ags_vindicator.lo: ags/widget/ags_vindicator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_vindicator.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Tpo -c -o ags/widget/libags_gui_la-ags_vindicator.lo `test -f 'ags/widget/ags_vindicator.c' || echo '$(srcdir)/'`ags/widget/ags_vindicator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_vindicator.c' object='ags/widget/libags_gui_la-ags_vindicator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_vindicator.lo `test -f 'ags/widget/ags_vindicator.c' || echo '$(srcdir)/'`ags/widget/ags_vindicator.c ags/widget/libags_gui_la-ags_vled_array.lo: ags/widget/ags_vled_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_vled_array.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Tpo -c -o ags/widget/libags_gui_la-ags_vled_array.lo `test -f 'ags/widget/ags_vled_array.c' || echo '$(srcdir)/'`ags/widget/ags_vled_array.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_vled_array.c' object='ags/widget/libags_gui_la-ags_vled_array.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_vled_array.lo `test -f 'ags/widget/ags_vled_array.c' || echo '$(srcdir)/'`ags/widget/ags_vled_array.c ags/widget/libags_gui_la-ags_widget_marshal.lo: ags/widget/ags_widget_marshal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_widget_marshal.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Tpo -c -o ags/widget/libags_gui_la-ags_widget_marshal.lo `test -f 'ags/widget/ags_widget_marshal.c' || echo '$(srcdir)/'`ags/widget/ags_widget_marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_widget_marshal.c' object='ags/widget/libags_gui_la-ags_widget_marshal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_widget_marshal.lo `test -f 'ags/widget/ags_widget_marshal.c' || echo '$(srcdir)/'`ags/widget/ags_widget_marshal.c ags/widget/libags_gui_la-ags_container.lo: ags/widget/ags_container.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -MT ags/widget/libags_gui_la-ags_container.lo -MD -MP -MF ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Tpo -c -o ags/widget/libags_gui_la-ags_container.lo `test -f 'ags/widget/ags_container.c' || echo '$(srcdir)/'`ags/widget/ags_container.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Tpo ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/widget/ags_container.c' object='ags/widget/libags_gui_la-ags_container.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_gui_la_CFLAGS) $(CFLAGS) -c -o ags/widget/libags_gui_la-ags_container.lo `test -f 'ags/widget/ags_container.c' || echo '$(srcdir)/'`ags/widget/ags_container.c ags/server/libags_server_la-ags_registry.lo: ags/server/ags_registry.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/libags_server_la-ags_registry.lo -MD -MP -MF ags/server/$(DEPDIR)/libags_server_la-ags_registry.Tpo -c -o ags/server/libags_server_la-ags_registry.lo `test -f 'ags/server/ags_registry.c' || echo '$(srcdir)/'`ags/server/ags_registry.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/$(DEPDIR)/libags_server_la-ags_registry.Tpo ags/server/$(DEPDIR)/libags_server_la-ags_registry.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/ags_registry.c' object='ags/server/libags_server_la-ags_registry.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/libags_server_la-ags_registry.lo `test -f 'ags/server/ags_registry.c' || echo '$(srcdir)/'`ags/server/ags_registry.c ags/server/libags_server_la-ags_server.lo: ags/server/ags_server.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/libags_server_la-ags_server.lo -MD -MP -MF ags/server/$(DEPDIR)/libags_server_la-ags_server.Tpo -c -o ags/server/libags_server_la-ags_server.lo `test -f 'ags/server/ags_server.c' || echo '$(srcdir)/'`ags/server/ags_server.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/$(DEPDIR)/libags_server_la-ags_server.Tpo ags/server/$(DEPDIR)/libags_server_la-ags_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/ags_server.c' object='ags/server/libags_server_la-ags_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/libags_server_la-ags_server.lo `test -f 'ags/server/ags_server.c' || echo '$(srcdir)/'`ags/server/ags_server.c ags/server/libags_server_la-ags_server_application_context.lo: ags/server/ags_server_application_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/libags_server_la-ags_server_application_context.lo -MD -MP -MF ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Tpo -c -o ags/server/libags_server_la-ags_server_application_context.lo `test -f 'ags/server/ags_server_application_context.c' || echo '$(srcdir)/'`ags/server/ags_server_application_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Tpo ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/ags_server_application_context.c' object='ags/server/libags_server_la-ags_server_application_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/libags_server_la-ags_server_application_context.lo `test -f 'ags/server/ags_server_application_context.c' || echo '$(srcdir)/'`ags/server/ags_server_application_context.c ags/server/libags_server_la-ags_server_status.lo: ags/server/ags_server_status.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/libags_server_la-ags_server_status.lo -MD -MP -MF ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Tpo -c -o ags/server/libags_server_la-ags_server_status.lo `test -f 'ags/server/ags_server_status.c' || echo '$(srcdir)/'`ags/server/ags_server_status.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Tpo ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/ags_server_status.c' object='ags/server/libags_server_la-ags_server_status.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/libags_server_la-ags_server_status.lo `test -f 'ags/server/ags_server_status.c' || echo '$(srcdir)/'`ags/server/ags_server_status.c ags/server/libags_server_la-ags_service_provider.lo: ags/server/ags_service_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/libags_server_la-ags_service_provider.lo -MD -MP -MF ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Tpo -c -o ags/server/libags_server_la-ags_service_provider.lo `test -f 'ags/server/ags_service_provider.c' || echo '$(srcdir)/'`ags/server/ags_service_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Tpo ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/ags_service_provider.c' object='ags/server/libags_server_la-ags_service_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/libags_server_la-ags_service_provider.lo `test -f 'ags/server/ags_service_provider.c' || echo '$(srcdir)/'`ags/server/ags_service_provider.c ags/server/security/libags_server_la-ags_auth_security_context.lo: ags/server/security/ags_auth_security_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_auth_security_context.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Tpo -c -o ags/server/security/libags_server_la-ags_auth_security_context.lo `test -f 'ags/server/security/ags_auth_security_context.c' || echo '$(srcdir)/'`ags/server/security/ags_auth_security_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_auth_security_context.c' object='ags/server/security/libags_server_la-ags_auth_security_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_auth_security_context.lo `test -f 'ags/server/security/ags_auth_security_context.c' || echo '$(srcdir)/'`ags/server/security/ags_auth_security_context.c ags/server/security/libags_server_la-ags_authentication.lo: ags/server/security/ags_authentication.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_authentication.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Tpo -c -o ags/server/security/libags_server_la-ags_authentication.lo `test -f 'ags/server/security/ags_authentication.c' || echo '$(srcdir)/'`ags/server/security/ags_authentication.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_authentication.c' object='ags/server/security/libags_server_la-ags_authentication.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_authentication.lo `test -f 'ags/server/security/ags_authentication.c' || echo '$(srcdir)/'`ags/server/security/ags_authentication.c ags/server/security/libags_server_la-ags_authentication_manager.lo: ags/server/security/ags_authentication_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_authentication_manager.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Tpo -c -o ags/server/security/libags_server_la-ags_authentication_manager.lo `test -f 'ags/server/security/ags_authentication_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_authentication_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_authentication_manager.c' object='ags/server/security/libags_server_la-ags_authentication_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_authentication_manager.lo `test -f 'ags/server/security/ags_authentication_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_authentication_manager.c ags/server/security/libags_server_la-ags_business_group.lo: ags/server/security/ags_business_group.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_business_group.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Tpo -c -o ags/server/security/libags_server_la-ags_business_group.lo `test -f 'ags/server/security/ags_business_group.c' || echo '$(srcdir)/'`ags/server/security/ags_business_group.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_business_group.c' object='ags/server/security/libags_server_la-ags_business_group.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_business_group.lo `test -f 'ags/server/security/ags_business_group.c' || echo '$(srcdir)/'`ags/server/security/ags_business_group.c ags/server/security/libags_server_la-ags_business_group_manager.lo: ags/server/security/ags_business_group_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_business_group_manager.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Tpo -c -o ags/server/security/libags_server_la-ags_business_group_manager.lo `test -f 'ags/server/security/ags_business_group_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_business_group_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_business_group_manager.c' object='ags/server/security/libags_server_la-ags_business_group_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_business_group_manager.lo `test -f 'ags/server/security/ags_business_group_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_business_group_manager.c ags/server/security/libags_server_la-ags_certificate.lo: ags/server/security/ags_certificate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_certificate.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Tpo -c -o ags/server/security/libags_server_la-ags_certificate.lo `test -f 'ags/server/security/ags_certificate.c' || echo '$(srcdir)/'`ags/server/security/ags_certificate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_certificate.c' object='ags/server/security/libags_server_la-ags_certificate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_certificate.lo `test -f 'ags/server/security/ags_certificate.c' || echo '$(srcdir)/'`ags/server/security/ags_certificate.c ags/server/security/libags_server_la-ags_certificate_manager.lo: ags/server/security/ags_certificate_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_certificate_manager.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Tpo -c -o ags/server/security/libags_server_la-ags_certificate_manager.lo `test -f 'ags/server/security/ags_certificate_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_certificate_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_certificate_manager.c' object='ags/server/security/libags_server_la-ags_certificate_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_certificate_manager.lo `test -f 'ags/server/security/ags_certificate_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_certificate_manager.c ags/server/security/libags_server_la-ags_password_store.lo: ags/server/security/ags_password_store.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_password_store.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Tpo -c -o ags/server/security/libags_server_la-ags_password_store.lo `test -f 'ags/server/security/ags_password_store.c' || echo '$(srcdir)/'`ags/server/security/ags_password_store.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_password_store.c' object='ags/server/security/libags_server_la-ags_password_store.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_password_store.lo `test -f 'ags/server/security/ags_password_store.c' || echo '$(srcdir)/'`ags/server/security/ags_password_store.c ags/server/security/libags_server_la-ags_password_store_manager.lo: ags/server/security/ags_password_store_manager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_password_store_manager.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Tpo -c -o ags/server/security/libags_server_la-ags_password_store_manager.lo `test -f 'ags/server/security/ags_password_store_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_password_store_manager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_password_store_manager.c' object='ags/server/security/libags_server_la-ags_password_store_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_password_store_manager.lo `test -f 'ags/server/security/ags_password_store_manager.c' || echo '$(srcdir)/'`ags/server/security/ags_password_store_manager.c ags/server/security/libags_server_la-ags_security_context.lo: ags/server/security/ags_security_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_security_context.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Tpo -c -o ags/server/security/libags_server_la-ags_security_context.lo `test -f 'ags/server/security/ags_security_context.c' || echo '$(srcdir)/'`ags/server/security/ags_security_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_security_context.c' object='ags/server/security/libags_server_la-ags_security_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_security_context.lo `test -f 'ags/server/security/ags_security_context.c' || echo '$(srcdir)/'`ags/server/security/ags_security_context.c ags/server/security/libags_server_la-ags_xml_authentication.lo: ags/server/security/ags_xml_authentication.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_xml_authentication.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Tpo -c -o ags/server/security/libags_server_la-ags_xml_authentication.lo `test -f 'ags/server/security/ags_xml_authentication.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_authentication.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_xml_authentication.c' object='ags/server/security/libags_server_la-ags_xml_authentication.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_xml_authentication.lo `test -f 'ags/server/security/ags_xml_authentication.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_authentication.c ags/server/security/libags_server_la-ags_xml_business_group.lo: ags/server/security/ags_xml_business_group.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_xml_business_group.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Tpo -c -o ags/server/security/libags_server_la-ags_xml_business_group.lo `test -f 'ags/server/security/ags_xml_business_group.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_business_group.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_xml_business_group.c' object='ags/server/security/libags_server_la-ags_xml_business_group.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_xml_business_group.lo `test -f 'ags/server/security/ags_xml_business_group.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_business_group.c ags/server/security/libags_server_la-ags_xml_certificate.lo: ags/server/security/ags_xml_certificate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_xml_certificate.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Tpo -c -o ags/server/security/libags_server_la-ags_xml_certificate.lo `test -f 'ags/server/security/ags_xml_certificate.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_certificate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_xml_certificate.c' object='ags/server/security/libags_server_la-ags_xml_certificate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_xml_certificate.lo `test -f 'ags/server/security/ags_xml_certificate.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_certificate.c ags/server/security/libags_server_la-ags_xml_password_store.lo: ags/server/security/ags_xml_password_store.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/security/libags_server_la-ags_xml_password_store.lo -MD -MP -MF ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Tpo -c -o ags/server/security/libags_server_la-ags_xml_password_store.lo `test -f 'ags/server/security/ags_xml_password_store.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_password_store.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Tpo ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/security/ags_xml_password_store.c' object='ags/server/security/libags_server_la-ags_xml_password_store.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/security/libags_server_la-ags_xml_password_store.lo `test -f 'ags/server/security/ags_xml_password_store.c' || echo '$(srcdir)/'`ags/server/security/ags_xml_password_store.c ags/server/controller/libags_server_la-ags_controller.lo: ags/server/controller/ags_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/controller/libags_server_la-ags_controller.lo -MD -MP -MF ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Tpo -c -o ags/server/controller/libags_server_la-ags_controller.lo `test -f 'ags/server/controller/ags_controller.c' || echo '$(srcdir)/'`ags/server/controller/ags_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Tpo ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/controller/ags_controller.c' object='ags/server/controller/libags_server_la-ags_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/controller/libags_server_la-ags_controller.lo `test -f 'ags/server/controller/ags_controller.c' || echo '$(srcdir)/'`ags/server/controller/ags_controller.c ags/server/controller/libags_server_la-ags_front_controller.lo: ags/server/controller/ags_front_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/controller/libags_server_la-ags_front_controller.lo -MD -MP -MF ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Tpo -c -o ags/server/controller/libags_server_la-ags_front_controller.lo `test -f 'ags/server/controller/ags_front_controller.c' || echo '$(srcdir)/'`ags/server/controller/ags_front_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Tpo ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/controller/ags_front_controller.c' object='ags/server/controller/libags_server_la-ags_front_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/controller/libags_server_la-ags_front_controller.lo `test -f 'ags/server/controller/ags_front_controller.c' || echo '$(srcdir)/'`ags/server/controller/ags_front_controller.c ags/server/controller/libags_server_la-ags_plugin_controller.lo: ags/server/controller/ags_plugin_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -MT ags/server/controller/libags_server_la-ags_plugin_controller.lo -MD -MP -MF ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Tpo -c -o ags/server/controller/libags_server_la-ags_plugin_controller.lo `test -f 'ags/server/controller/ags_plugin_controller.c' || echo '$(srcdir)/'`ags/server/controller/ags_plugin_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Tpo ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/server/controller/ags_plugin_controller.c' object='ags/server/controller/libags_server_la-ags_plugin_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_server_la_CFLAGS) $(CFLAGS) -c -o ags/server/controller/libags_server_la-ags_plugin_controller.lo `test -f 'ags/server/controller/ags_plugin_controller.c' || echo '$(srcdir)/'`ags/server/controller/ags_plugin_controller.c ags/thread/libags_thread_la-ags_concurrency_provider.lo: ags/thread/ags_concurrency_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_concurrency_provider.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Tpo -c -o ags/thread/libags_thread_la-ags_concurrency_provider.lo `test -f 'ags/thread/ags_concurrency_provider.c' || echo '$(srcdir)/'`ags/thread/ags_concurrency_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_concurrency_provider.c' object='ags/thread/libags_thread_la-ags_concurrency_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_concurrency_provider.lo `test -f 'ags/thread/ags_concurrency_provider.c' || echo '$(srcdir)/'`ags/thread/ags_concurrency_provider.c ags/thread/libags_thread_la-ags_destroy_worker.lo: ags/thread/ags_destroy_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_destroy_worker.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Tpo -c -o ags/thread/libags_thread_la-ags_destroy_worker.lo `test -f 'ags/thread/ags_destroy_worker.c' || echo '$(srcdir)/'`ags/thread/ags_destroy_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_destroy_worker.c' object='ags/thread/libags_thread_la-ags_destroy_worker.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_destroy_worker.lo `test -f 'ags/thread/ags_destroy_worker.c' || echo '$(srcdir)/'`ags/thread/ags_destroy_worker.c ags/thread/libags_thread_la-ags_generic_main_loop.lo: ags/thread/ags_generic_main_loop.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_generic_main_loop.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Tpo -c -o ags/thread/libags_thread_la-ags_generic_main_loop.lo `test -f 'ags/thread/ags_generic_main_loop.c' || echo '$(srcdir)/'`ags/thread/ags_generic_main_loop.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_generic_main_loop.c' object='ags/thread/libags_thread_la-ags_generic_main_loop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_generic_main_loop.lo `test -f 'ags/thread/ags_generic_main_loop.c' || echo '$(srcdir)/'`ags/thread/ags_generic_main_loop.c ags/thread/libags_thread_la-ags_message_delivery.lo: ags/thread/ags_message_delivery.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_message_delivery.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Tpo -c -o ags/thread/libags_thread_la-ags_message_delivery.lo `test -f 'ags/thread/ags_message_delivery.c' || echo '$(srcdir)/'`ags/thread/ags_message_delivery.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_message_delivery.c' object='ags/thread/libags_thread_la-ags_message_delivery.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_message_delivery.lo `test -f 'ags/thread/ags_message_delivery.c' || echo '$(srcdir)/'`ags/thread/ags_message_delivery.c ags/thread/libags_thread_la-ags_message_envelope.lo: ags/thread/ags_message_envelope.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_message_envelope.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Tpo -c -o ags/thread/libags_thread_la-ags_message_envelope.lo `test -f 'ags/thread/ags_message_envelope.c' || echo '$(srcdir)/'`ags/thread/ags_message_envelope.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_message_envelope.c' object='ags/thread/libags_thread_la-ags_message_envelope.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_message_envelope.lo `test -f 'ags/thread/ags_message_envelope.c' || echo '$(srcdir)/'`ags/thread/ags_message_envelope.c ags/thread/libags_thread_la-ags_message_queue.lo: ags/thread/ags_message_queue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_message_queue.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Tpo -c -o ags/thread/libags_thread_la-ags_message_queue.lo `test -f 'ags/thread/ags_message_queue.c' || echo '$(srcdir)/'`ags/thread/ags_message_queue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_message_queue.c' object='ags/thread/libags_thread_la-ags_message_queue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_message_queue.lo `test -f 'ags/thread/ags_message_queue.c' || echo '$(srcdir)/'`ags/thread/ags_message_queue.c ags/thread/libags_thread_la-ags_returnable_thread.lo: ags/thread/ags_returnable_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_returnable_thread.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Tpo -c -o ags/thread/libags_thread_la-ags_returnable_thread.lo `test -f 'ags/thread/ags_returnable_thread.c' || echo '$(srcdir)/'`ags/thread/ags_returnable_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_returnable_thread.c' object='ags/thread/libags_thread_la-ags_returnable_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_returnable_thread.lo `test -f 'ags/thread/ags_returnable_thread.c' || echo '$(srcdir)/'`ags/thread/ags_returnable_thread.c ags/thread/libags_thread_la-ags_task_completion.lo: ags/thread/ags_task_completion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_task_completion.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Tpo -c -o ags/thread/libags_thread_la-ags_task_completion.lo `test -f 'ags/thread/ags_task_completion.c' || echo '$(srcdir)/'`ags/thread/ags_task_completion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_task_completion.c' object='ags/thread/libags_thread_la-ags_task_completion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_task_completion.lo `test -f 'ags/thread/ags_task_completion.c' || echo '$(srcdir)/'`ags/thread/ags_task_completion.c ags/thread/libags_thread_la-ags_task.lo: ags/thread/ags_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_task.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Tpo -c -o ags/thread/libags_thread_la-ags_task.lo `test -f 'ags/thread/ags_task.c' || echo '$(srcdir)/'`ags/thread/ags_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_task.c' object='ags/thread/libags_thread_la-ags_task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_task.lo `test -f 'ags/thread/ags_task.c' || echo '$(srcdir)/'`ags/thread/ags_task.c ags/thread/libags_thread_la-ags_task_launcher.lo: ags/thread/ags_task_launcher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_task_launcher.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Tpo -c -o ags/thread/libags_thread_la-ags_task_launcher.lo `test -f 'ags/thread/ags_task_launcher.c' || echo '$(srcdir)/'`ags/thread/ags_task_launcher.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_task_launcher.c' object='ags/thread/libags_thread_la-ags_task_launcher.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_task_launcher.lo `test -f 'ags/thread/ags_task_launcher.c' || echo '$(srcdir)/'`ags/thread/ags_task_launcher.c ags/thread/libags_thread_la-ags_thread_application_context.lo: ags/thread/ags_thread_application_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_thread_application_context.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Tpo -c -o ags/thread/libags_thread_la-ags_thread_application_context.lo `test -f 'ags/thread/ags_thread_application_context.c' || echo '$(srcdir)/'`ags/thread/ags_thread_application_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_thread_application_context.c' object='ags/thread/libags_thread_la-ags_thread_application_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_thread_application_context.lo `test -f 'ags/thread/ags_thread_application_context.c' || echo '$(srcdir)/'`ags/thread/ags_thread_application_context.c ags/thread/libags_thread_la-ags_thread_pool.lo: ags/thread/ags_thread_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_thread_pool.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Tpo -c -o ags/thread/libags_thread_la-ags_thread_pool.lo `test -f 'ags/thread/ags_thread_pool.c' || echo '$(srcdir)/'`ags/thread/ags_thread_pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_thread_pool.c' object='ags/thread/libags_thread_la-ags_thread_pool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_thread_pool.lo `test -f 'ags/thread/ags_thread_pool.c' || echo '$(srcdir)/'`ags/thread/ags_thread_pool.c ags/thread/libags_thread_la-ags_thread.lo: ags/thread/ags_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_thread.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Tpo -c -o ags/thread/libags_thread_la-ags_thread.lo `test -f 'ags/thread/ags_thread.c' || echo '$(srcdir)/'`ags/thread/ags_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_thread.c' object='ags/thread/libags_thread_la-ags_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_thread.lo `test -f 'ags/thread/ags_thread.c' || echo '$(srcdir)/'`ags/thread/ags_thread.c ags/thread/libags_thread_la-ags_timestamp.lo: ags/thread/ags_timestamp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_timestamp.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Tpo -c -o ags/thread/libags_thread_la-ags_timestamp.lo `test -f 'ags/thread/ags_timestamp.c' || echo '$(srcdir)/'`ags/thread/ags_timestamp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_timestamp.c' object='ags/thread/libags_thread_la-ags_timestamp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_timestamp.lo `test -f 'ags/thread/ags_timestamp.c' || echo '$(srcdir)/'`ags/thread/ags_timestamp.c ags/thread/libags_thread_la-ags_worker_thread.lo: ags/thread/ags_worker_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -MT ags/thread/libags_thread_la-ags_worker_thread.lo -MD -MP -MF ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Tpo -c -o ags/thread/libags_thread_la-ags_worker_thread.lo `test -f 'ags/thread/ags_worker_thread.c' || echo '$(srcdir)/'`ags/thread/ags_worker_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Tpo ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/thread/ags_worker_thread.c' object='ags/thread/libags_thread_la-ags_worker_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_thread_la_CFLAGS) $(CFLAGS) -c -o ags/thread/libags_thread_la-ags_worker_thread.lo `test -f 'ags/thread/ags_worker_thread.c' || echo '$(srcdir)/'`ags/thread/ags_worker_thread.c ags/X/libgsequencer_la-ags_animation_window.lo: ags/X/ags_animation_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_animation_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Tpo -c -o ags/X/libgsequencer_la-ags_animation_window.lo `test -f 'ags/X/ags_animation_window.c' || echo '$(srcdir)/'`ags/X/ags_animation_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_animation_window.c' object='ags/X/libgsequencer_la-ags_animation_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_animation_window.lo `test -f 'ags/X/ags_animation_window.c' || echo '$(srcdir)/'`ags/X/ags_animation_window.c ags/X/libgsequencer_la-ags_automation_editor.lo: ags/X/ags_automation_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_automation_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Tpo -c -o ags/X/libgsequencer_la-ags_automation_editor.lo `test -f 'ags/X/ags_automation_editor.c' || echo '$(srcdir)/'`ags/X/ags_automation_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_automation_editor.c' object='ags/X/libgsequencer_la-ags_automation_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_automation_editor.lo `test -f 'ags/X/ags_automation_editor.c' || echo '$(srcdir)/'`ags/X/ags_automation_editor.c ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo: ags/X/ags_automation_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo `test -f 'ags/X/ags_automation_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_automation_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_automation_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_automation_editor_callbacks.lo `test -f 'ags/X/ags_automation_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_automation_editor_callbacks.c ags/X/libgsequencer_la-ags_automation_window.lo: ags/X/ags_automation_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_automation_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Tpo -c -o ags/X/libgsequencer_la-ags_automation_window.lo `test -f 'ags/X/ags_automation_window.c' || echo '$(srcdir)/'`ags/X/ags_automation_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_automation_window.c' object='ags/X/libgsequencer_la-ags_automation_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_automation_window.lo `test -f 'ags/X/ags_automation_window.c' || echo '$(srcdir)/'`ags/X/ags_automation_window.c ags/X/libgsequencer_la-ags_automation_window_callbacks.lo: ags/X/ags_automation_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_automation_window_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_automation_window_callbacks.lo `test -f 'ags/X/ags_automation_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_automation_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_automation_window_callbacks.c' object='ags/X/libgsequencer_la-ags_automation_window_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_automation_window_callbacks.lo `test -f 'ags/X/ags_automation_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_automation_window_callbacks.c ags/X/libgsequencer_la-ags_audio_preferences.lo: ags/X/ags_audio_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_audio_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_audio_preferences.lo `test -f 'ags/X/ags_audio_preferences.c' || echo '$(srcdir)/'`ags/X/ags_audio_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_audio_preferences.c' object='ags/X/libgsequencer_la-ags_audio_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_audio_preferences.lo `test -f 'ags/X/ags_audio_preferences.c' || echo '$(srcdir)/'`ags/X/ags_audio_preferences.c ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo: ags/X/ags_audio_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo `test -f 'ags/X/ags_audio_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_audio_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_audio_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_audio_preferences_callbacks.lo `test -f 'ags/X/ags_audio_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_audio_preferences_callbacks.c ags/X/libgsequencer_la-ags_bulk_member.lo: ags/X/ags_bulk_member.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_bulk_member.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Tpo -c -o ags/X/libgsequencer_la-ags_bulk_member.lo `test -f 'ags/X/ags_bulk_member.c' || echo '$(srcdir)/'`ags/X/ags_bulk_member.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_bulk_member.c' object='ags/X/libgsequencer_la-ags_bulk_member.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_bulk_member.lo `test -f 'ags/X/ags_bulk_member.c' || echo '$(srcdir)/'`ags/X/ags_bulk_member.c ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo: ags/X/ags_bulk_member_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo `test -f 'ags/X/ags_bulk_member_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_bulk_member_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_bulk_member_callbacks.c' object='ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_bulk_member_callbacks.lo `test -f 'ags/X/ags_bulk_member_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_bulk_member_callbacks.c ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo: ags/X/ags_connection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo `test -f 'ags/X/ags_connection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_connection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_connection_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_connection_editor_callbacks.lo `test -f 'ags/X/ags_connection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_connection_editor_callbacks.c ags/X/libgsequencer_la-ags_connection_editor.lo: ags/X/ags_connection_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_connection_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Tpo -c -o ags/X/libgsequencer_la-ags_connection_editor.lo `test -f 'ags/X/ags_connection_editor.c' || echo '$(srcdir)/'`ags/X/ags_connection_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_connection_editor.c' object='ags/X/libgsequencer_la-ags_connection_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_connection_editor.lo `test -f 'ags/X/ags_connection_editor.c' || echo '$(srcdir)/'`ags/X/ags_connection_editor.c ags/X/libgsequencer_la-ags_context_menu.lo: ags/X/ags_context_menu.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_context_menu.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Tpo -c -o ags/X/libgsequencer_la-ags_context_menu.lo `test -f 'ags/X/ags_context_menu.c' || echo '$(srcdir)/'`ags/X/ags_context_menu.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_context_menu.c' object='ags/X/libgsequencer_la-ags_context_menu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_context_menu.lo `test -f 'ags/X/ags_context_menu.c' || echo '$(srcdir)/'`ags/X/ags_context_menu.c ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo: ags/X/ags_dssi_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo `test -f 'ags/X/ags_dssi_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_dssi_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_dssi_browser_callbacks.c' object='ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_dssi_browser_callbacks.lo `test -f 'ags/X/ags_dssi_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_dssi_browser_callbacks.c ags/X/libgsequencer_la-ags_dssi_browser.lo: ags/X/ags_dssi_browser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_dssi_browser.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Tpo -c -o ags/X/libgsequencer_la-ags_dssi_browser.lo `test -f 'ags/X/ags_dssi_browser.c' || echo '$(srcdir)/'`ags/X/ags_dssi_browser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_dssi_browser.c' object='ags/X/libgsequencer_la-ags_dssi_browser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_dssi_browser.lo `test -f 'ags/X/ags_dssi_browser.c' || echo '$(srcdir)/'`ags/X/ags_dssi_browser.c ags/X/libgsequencer_la-ags_effect_bridge.lo: ags/X/ags_effect_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_bridge.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Tpo -c -o ags/X/libgsequencer_la-ags_effect_bridge.lo `test -f 'ags/X/ags_effect_bridge.c' || echo '$(srcdir)/'`ags/X/ags_effect_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_bridge.c' object='ags/X/libgsequencer_la-ags_effect_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_bridge.lo `test -f 'ags/X/ags_effect_bridge.c' || echo '$(srcdir)/'`ags/X/ags_effect_bridge.c ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo: ags/X/ags_effect_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo `test -f 'ags/X/ags_effect_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_bridge_callbacks.c' object='ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_bridge_callbacks.lo `test -f 'ags/X/ags_effect_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_bridge_callbacks.c ags/X/libgsequencer_la-ags_effect_bulk.lo: ags/X/ags_effect_bulk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_bulk.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Tpo -c -o ags/X/libgsequencer_la-ags_effect_bulk.lo `test -f 'ags/X/ags_effect_bulk.c' || echo '$(srcdir)/'`ags/X/ags_effect_bulk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_bulk.c' object='ags/X/libgsequencer_la-ags_effect_bulk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_bulk.lo `test -f 'ags/X/ags_effect_bulk.c' || echo '$(srcdir)/'`ags/X/ags_effect_bulk.c ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo: ags/X/ags_effect_bulk_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo `test -f 'ags/X/ags_effect_bulk_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_bulk_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_bulk_callbacks.c' object='ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_bulk_callbacks.lo `test -f 'ags/X/ags_effect_bulk_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_bulk_callbacks.c ags/X/libgsequencer_la-ags_effect_line.lo: ags/X/ags_effect_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_line.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Tpo -c -o ags/X/libgsequencer_la-ags_effect_line.lo `test -f 'ags/X/ags_effect_line.c' || echo '$(srcdir)/'`ags/X/ags_effect_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_line.c' object='ags/X/libgsequencer_la-ags_effect_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_line.lo `test -f 'ags/X/ags_effect_line.c' || echo '$(srcdir)/'`ags/X/ags_effect_line.c ags/X/libgsequencer_la-ags_effect_line_callbacks.lo: ags/X/ags_effect_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_line_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_effect_line_callbacks.lo `test -f 'ags/X/ags_effect_line_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_line_callbacks.c' object='ags/X/libgsequencer_la-ags_effect_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_line_callbacks.lo `test -f 'ags/X/ags_effect_line_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_line_callbacks.c ags/X/libgsequencer_la-ags_effect_pad.lo: ags/X/ags_effect_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_pad.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Tpo -c -o ags/X/libgsequencer_la-ags_effect_pad.lo `test -f 'ags/X/ags_effect_pad.c' || echo '$(srcdir)/'`ags/X/ags_effect_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_pad.c' object='ags/X/libgsequencer_la-ags_effect_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_pad.lo `test -f 'ags/X/ags_effect_pad.c' || echo '$(srcdir)/'`ags/X/ags_effect_pad.c ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo: ags/X/ags_effect_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo `test -f 'ags/X/ags_effect_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_pad_callbacks.c' object='ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo `test -f 'ags/X/ags_effect_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_pad_callbacks.c ags/X/libgsequencer_la-ags_effect_separator.lo: ags/X/ags_effect_separator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_separator.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Tpo -c -o ags/X/libgsequencer_la-ags_effect_separator.lo `test -f 'ags/X/ags_effect_separator.c' || echo '$(srcdir)/'`ags/X/ags_effect_separator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_effect_separator.c' object='ags/X/libgsequencer_la-ags_effect_separator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_separator.lo `test -f 'ags/X/ags_effect_separator.c' || echo '$(srcdir)/'`ags/X/ags_effect_separator.c ags/X/libgsequencer_la-ags_export_soundcard.lo: ags/X/ags_export_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_export_soundcard.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Tpo -c -o ags/X/libgsequencer_la-ags_export_soundcard.lo `test -f 'ags/X/ags_export_soundcard.c' || echo '$(srcdir)/'`ags/X/ags_export_soundcard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_export_soundcard.c' object='ags/X/libgsequencer_la-ags_export_soundcard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_export_soundcard.lo `test -f 'ags/X/ags_export_soundcard.c' || echo '$(srcdir)/'`ags/X/ags_export_soundcard.c ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo: ags/X/ags_export_soundcard_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo `test -f 'ags/X/ags_export_soundcard_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_export_soundcard_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_export_soundcard_callbacks.c' object='ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo `test -f 'ags/X/ags_export_soundcard_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_export_soundcard_callbacks.c ags/X/libgsequencer_la-ags_export_window.lo: ags/X/ags_export_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_export_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Tpo -c -o ags/X/libgsequencer_la-ags_export_window.lo `test -f 'ags/X/ags_export_window.c' || echo '$(srcdir)/'`ags/X/ags_export_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_export_window.c' object='ags/X/libgsequencer_la-ags_export_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_export_window.lo `test -f 'ags/X/ags_export_window.c' || echo '$(srcdir)/'`ags/X/ags_export_window.c ags/X/libgsequencer_la-ags_export_window_callbacks.lo: ags/X/ags_export_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_export_window_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_export_window_callbacks.lo `test -f 'ags/X/ags_export_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_export_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_export_window_callbacks.c' object='ags/X/libgsequencer_la-ags_export_window_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_export_window_callbacks.lo `test -f 'ags/X/ags_export_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_export_window_callbacks.c ags/X/libgsequencer_la-ags_generic_preferences.lo: ags/X/ags_generic_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_generic_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_generic_preferences.lo `test -f 'ags/X/ags_generic_preferences.c' || echo '$(srcdir)/'`ags/X/ags_generic_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_generic_preferences.c' object='ags/X/libgsequencer_la-ags_generic_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_generic_preferences.lo `test -f 'ags/X/ags_generic_preferences.c' || echo '$(srcdir)/'`ags/X/ags_generic_preferences.c ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo: ags/X/ags_generic_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo `test -f 'ags/X/ags_generic_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_generic_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_generic_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_generic_preferences_callbacks.lo `test -f 'ags/X/ags_generic_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_generic_preferences_callbacks.c ags/X/libgsequencer_la-ags_ladspa_browser.lo: ags/X/ags_ladspa_browser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_ladspa_browser.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Tpo -c -o ags/X/libgsequencer_la-ags_ladspa_browser.lo `test -f 'ags/X/ags_ladspa_browser.c' || echo '$(srcdir)/'`ags/X/ags_ladspa_browser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_ladspa_browser.c' object='ags/X/libgsequencer_la-ags_ladspa_browser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_ladspa_browser.lo `test -f 'ags/X/ags_ladspa_browser.c' || echo '$(srcdir)/'`ags/X/ags_ladspa_browser.c ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo: ags/X/ags_ladspa_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo `test -f 'ags/X/ags_ladspa_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_ladspa_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_ladspa_browser_callbacks.c' object='ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_ladspa_browser_callbacks.lo `test -f 'ags/X/ags_ladspa_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_ladspa_browser_callbacks.c ags/X/libgsequencer_la-ags_lv2_browser.lo: ags/X/ags_lv2_browser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_lv2_browser.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Tpo -c -o ags/X/libgsequencer_la-ags_lv2_browser.lo `test -f 'ags/X/ags_lv2_browser.c' || echo '$(srcdir)/'`ags/X/ags_lv2_browser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_lv2_browser.c' object='ags/X/libgsequencer_la-ags_lv2_browser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_lv2_browser.lo `test -f 'ags/X/ags_lv2_browser.c' || echo '$(srcdir)/'`ags/X/ags_lv2_browser.c ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo: ags/X/ags_lv2_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo `test -f 'ags/X/ags_lv2_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_lv2_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_lv2_browser_callbacks.c' object='ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_lv2_browser_callbacks.lo `test -f 'ags/X/ags_lv2_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_lv2_browser_callbacks.c ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo: ags/X/ags_input_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo `test -f 'ags/X/ags_input_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_input_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_input_collection_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_input_collection_editor_callbacks.lo `test -f 'ags/X/ags_input_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_input_collection_editor_callbacks.c ags/X/libgsequencer_la-ags_input_collection_editor.lo: ags/X/ags_input_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_input_collection_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Tpo -c -o ags/X/libgsequencer_la-ags_input_collection_editor.lo `test -f 'ags/X/ags_input_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_input_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_input_collection_editor.c' object='ags/X/libgsequencer_la-ags_input_collection_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_input_collection_editor.lo `test -f 'ags/X/ags_input_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_input_collection_editor.c ags/X/libgsequencer_la-ags_input_editor_callbacks.lo: ags/X/ags_input_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_input_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_input_editor_callbacks.lo `test -f 'ags/X/ags_input_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_input_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_input_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_input_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_input_editor_callbacks.lo `test -f 'ags/X/ags_input_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_input_editor_callbacks.c ags/X/libgsequencer_la-ags_input_editor.lo: ags/X/ags_input_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_input_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Tpo -c -o ags/X/libgsequencer_la-ags_input_editor.lo `test -f 'ags/X/ags_input_editor.c' || echo '$(srcdir)/'`ags/X/ags_input_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_input_editor.c' object='ags/X/libgsequencer_la-ags_input_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_input_editor.lo `test -f 'ags/X/ags_input_editor.c' || echo '$(srcdir)/'`ags/X/ags_input_editor.c ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo: ags/X/ags_input_listing_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo `test -f 'ags/X/ags_input_listing_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_input_listing_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_input_listing_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_input_listing_editor_callbacks.lo `test -f 'ags/X/ags_input_listing_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_input_listing_editor_callbacks.c ags/X/libgsequencer_la-ags_input_listing_editor.lo: ags/X/ags_input_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_input_listing_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Tpo -c -o ags/X/libgsequencer_la-ags_input_listing_editor.lo `test -f 'ags/X/ags_input_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_input_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_input_listing_editor.c' object='ags/X/libgsequencer_la-ags_input_listing_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_input_listing_editor.lo `test -f 'ags/X/ags_input_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_input_listing_editor.c ags/X/libgsequencer_la-ags_line.lo: ags/X/ags_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Tpo -c -o ags/X/libgsequencer_la-ags_line.lo `test -f 'ags/X/ags_line.c' || echo '$(srcdir)/'`ags/X/ags_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line.c' object='ags/X/libgsequencer_la-ags_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line.lo `test -f 'ags/X/ags_line.c' || echo '$(srcdir)/'`ags/X/ags_line.c ags/X/libgsequencer_la-ags_line_callbacks.lo: ags/X/ags_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_line_callbacks.lo `test -f 'ags/X/ags_line_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_callbacks.c' object='ags/X/libgsequencer_la-ags_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_callbacks.lo `test -f 'ags/X/ags_line_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_callbacks.c ags/X/libgsequencer_la-ags_line_editor.lo: ags/X/ags_line_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Tpo -c -o ags/X/libgsequencer_la-ags_line_editor.lo `test -f 'ags/X/ags_line_editor.c' || echo '$(srcdir)/'`ags/X/ags_line_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_editor.c' object='ags/X/libgsequencer_la-ags_line_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_editor.lo `test -f 'ags/X/ags_line_editor.c' || echo '$(srcdir)/'`ags/X/ags_line_editor.c ags/X/libgsequencer_la-ags_line_editor_callbacks.lo: ags/X/ags_line_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_line_editor_callbacks.lo `test -f 'ags/X/ags_line_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_line_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_editor_callbacks.lo `test -f 'ags/X/ags_line_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_editor_callbacks.c ags/X/libgsequencer_la-ags_line_member.lo: ags/X/ags_line_member.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_member.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Tpo -c -o ags/X/libgsequencer_la-ags_line_member.lo `test -f 'ags/X/ags_line_member.c' || echo '$(srcdir)/'`ags/X/ags_line_member.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_member.c' object='ags/X/libgsequencer_la-ags_line_member.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_member.lo `test -f 'ags/X/ags_line_member.c' || echo '$(srcdir)/'`ags/X/ags_line_member.c ags/X/libgsequencer_la-ags_line_member_callbacks.lo: ags/X/ags_line_member_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_member_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_line_member_callbacks.lo `test -f 'ags/X/ags_line_member_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_member_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_member_callbacks.c' object='ags/X/libgsequencer_la-ags_line_member_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_member_callbacks.lo `test -f 'ags/X/ags_line_member_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_member_callbacks.c ags/X/libgsequencer_la-ags_line_member_editor.lo: ags/X/ags_line_member_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_member_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Tpo -c -o ags/X/libgsequencer_la-ags_line_member_editor.lo `test -f 'ags/X/ags_line_member_editor.c' || echo '$(srcdir)/'`ags/X/ags_line_member_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_member_editor.c' object='ags/X/libgsequencer_la-ags_line_member_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_member_editor.lo `test -f 'ags/X/ags_line_member_editor.c' || echo '$(srcdir)/'`ags/X/ags_line_member_editor.c ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo: ags/X/ags_line_member_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo `test -f 'ags/X/ags_line_member_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_member_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_line_member_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_line_member_editor_callbacks.lo `test -f 'ags/X/ags_line_member_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_line_member_editor_callbacks.c ags/X/libgsequencer_la-ags_link_collection_editor.lo: ags/X/ags_link_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_link_collection_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Tpo -c -o ags/X/libgsequencer_la-ags_link_collection_editor.lo `test -f 'ags/X/ags_link_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_link_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_link_collection_editor.c' object='ags/X/libgsequencer_la-ags_link_collection_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_link_collection_editor.lo `test -f 'ags/X/ags_link_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_link_collection_editor.c ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo: ags/X/ags_link_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo `test -f 'ags/X/ags_link_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_link_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_link_collection_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_link_collection_editor_callbacks.lo `test -f 'ags/X/ags_link_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_link_collection_editor_callbacks.c ags/X/libgsequencer_la-ags_link_editor.lo: ags/X/ags_link_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_link_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Tpo -c -o ags/X/libgsequencer_la-ags_link_editor.lo `test -f 'ags/X/ags_link_editor.c' || echo '$(srcdir)/'`ags/X/ags_link_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_link_editor.c' object='ags/X/libgsequencer_la-ags_link_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_link_editor.lo `test -f 'ags/X/ags_link_editor.c' || echo '$(srcdir)/'`ags/X/ags_link_editor.c ags/X/libgsequencer_la-ags_link_editor_callbacks.lo: ags/X/ags_link_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_link_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_link_editor_callbacks.lo `test -f 'ags/X/ags_link_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_link_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_link_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_link_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_link_editor_callbacks.lo `test -f 'ags/X/ags_link_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_link_editor_callbacks.c ags/X/libgsequencer_la-ags_listing_editor.lo: ags/X/ags_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_listing_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Tpo -c -o ags/X/libgsequencer_la-ags_listing_editor.lo `test -f 'ags/X/ags_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_listing_editor.c' object='ags/X/libgsequencer_la-ags_listing_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_listing_editor.lo `test -f 'ags/X/ags_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_listing_editor.c ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo: ags/X/ags_listing_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo `test -f 'ags/X/ags_listing_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_listing_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_listing_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_listing_editor_callbacks.lo `test -f 'ags/X/ags_listing_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_listing_editor_callbacks.c ags/X/libgsequencer_la-ags_machine.lo: ags/X/ags_machine.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_machine.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Tpo -c -o ags/X/libgsequencer_la-ags_machine.lo `test -f 'ags/X/ags_machine.c' || echo '$(srcdir)/'`ags/X/ags_machine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_machine.c' object='ags/X/libgsequencer_la-ags_machine.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_machine.lo `test -f 'ags/X/ags_machine.c' || echo '$(srcdir)/'`ags/X/ags_machine.c ags/X/libgsequencer_la-ags_machine_callbacks.lo: ags/X/ags_machine_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_machine_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_machine_callbacks.lo `test -f 'ags/X/ags_machine_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_machine_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_machine_callbacks.c' object='ags/X/libgsequencer_la-ags_machine_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_machine_callbacks.lo `test -f 'ags/X/ags_machine_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_machine_callbacks.c ags/X/libgsequencer_la-ags_machine_editor.lo: ags/X/ags_machine_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_machine_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Tpo -c -o ags/X/libgsequencer_la-ags_machine_editor.lo `test -f 'ags/X/ags_machine_editor.c' || echo '$(srcdir)/'`ags/X/ags_machine_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_machine_editor.c' object='ags/X/libgsequencer_la-ags_machine_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_machine_editor.lo `test -f 'ags/X/ags_machine_editor.c' || echo '$(srcdir)/'`ags/X/ags_machine_editor.c ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo: ags/X/ags_machine_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo `test -f 'ags/X/ags_machine_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_machine_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_machine_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_machine_editor_callbacks.lo `test -f 'ags/X/ags_machine_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_machine_editor_callbacks.c ags/X/libgsequencer_la-ags_menu_action_callbacks.lo: ags/X/ags_menu_action_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_menu_action_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_menu_action_callbacks.lo `test -f 'ags/X/ags_menu_action_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_menu_action_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_menu_action_callbacks.c' object='ags/X/libgsequencer_la-ags_menu_action_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_menu_action_callbacks.lo `test -f 'ags/X/ags_menu_action_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_menu_action_callbacks.c ags/X/libgsequencer_la-ags_menu_bar.lo: ags/X/ags_menu_bar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_menu_bar.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Tpo -c -o ags/X/libgsequencer_la-ags_menu_bar.lo `test -f 'ags/X/ags_menu_bar.c' || echo '$(srcdir)/'`ags/X/ags_menu_bar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_menu_bar.c' object='ags/X/libgsequencer_la-ags_menu_bar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_menu_bar.lo `test -f 'ags/X/ags_menu_bar.c' || echo '$(srcdir)/'`ags/X/ags_menu_bar.c ags/X/libgsequencer_la-ags_midi_dialog.lo: ags/X/ags_midi_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_midi_dialog.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Tpo -c -o ags/X/libgsequencer_la-ags_midi_dialog.lo `test -f 'ags/X/ags_midi_dialog.c' || echo '$(srcdir)/'`ags/X/ags_midi_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_midi_dialog.c' object='ags/X/libgsequencer_la-ags_midi_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_midi_dialog.lo `test -f 'ags/X/ags_midi_dialog.c' || echo '$(srcdir)/'`ags/X/ags_midi_dialog.c ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo: ags/X/ags_midi_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo `test -f 'ags/X/ags_midi_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_midi_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_midi_dialog_callbacks.c' object='ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_midi_dialog_callbacks.lo `test -f 'ags/X/ags_midi_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_midi_dialog_callbacks.c ags/X/libgsequencer_la-ags_midi_preferences.lo: ags/X/ags_midi_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_midi_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_midi_preferences.lo `test -f 'ags/X/ags_midi_preferences.c' || echo '$(srcdir)/'`ags/X/ags_midi_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_midi_preferences.c' object='ags/X/libgsequencer_la-ags_midi_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_midi_preferences.lo `test -f 'ags/X/ags_midi_preferences.c' || echo '$(srcdir)/'`ags/X/ags_midi_preferences.c ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo: ags/X/ags_midi_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo `test -f 'ags/X/ags_midi_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_midi_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_midi_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_midi_preferences_callbacks.lo `test -f 'ags/X/ags_midi_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_midi_preferences_callbacks.c ags/X/libgsequencer_la-ags_navigation.lo: ags/X/ags_navigation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_navigation.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Tpo -c -o ags/X/libgsequencer_la-ags_navigation.lo `test -f 'ags/X/ags_navigation.c' || echo '$(srcdir)/'`ags/X/ags_navigation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_navigation.c' object='ags/X/libgsequencer_la-ags_navigation.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_navigation.lo `test -f 'ags/X/ags_navigation.c' || echo '$(srcdir)/'`ags/X/ags_navigation.c ags/X/libgsequencer_la-ags_navigation_callbacks.lo: ags/X/ags_navigation_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_navigation_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_navigation_callbacks.lo `test -f 'ags/X/ags_navigation_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_navigation_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_navigation_callbacks.c' object='ags/X/libgsequencer_la-ags_navigation_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_navigation_callbacks.lo `test -f 'ags/X/ags_navigation_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_navigation_callbacks.c ags/X/libgsequencer_la-ags_notation_editor.lo: ags/X/ags_notation_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_notation_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Tpo -c -o ags/X/libgsequencer_la-ags_notation_editor.lo `test -f 'ags/X/ags_notation_editor.c' || echo '$(srcdir)/'`ags/X/ags_notation_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_notation_editor.c' object='ags/X/libgsequencer_la-ags_notation_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_notation_editor.lo `test -f 'ags/X/ags_notation_editor.c' || echo '$(srcdir)/'`ags/X/ags_notation_editor.c ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo: ags/X/ags_notation_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo `test -f 'ags/X/ags_notation_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_notation_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_notation_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_notation_editor_callbacks.lo `test -f 'ags/X/ags_notation_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_notation_editor_callbacks.c ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo: ags/X/ags_osc_server_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo `test -f 'ags/X/ags_osc_server_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_osc_server_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_osc_server_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_osc_server_preferences_callbacks.lo `test -f 'ags/X/ags_osc_server_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_osc_server_preferences_callbacks.c ags/X/libgsequencer_la-ags_osc_server_preferences.lo: ags/X/ags_osc_server_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_osc_server_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_osc_server_preferences.lo `test -f 'ags/X/ags_osc_server_preferences.c' || echo '$(srcdir)/'`ags/X/ags_osc_server_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_osc_server_preferences.c' object='ags/X/libgsequencer_la-ags_osc_server_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_osc_server_preferences.lo `test -f 'ags/X/ags_osc_server_preferences.c' || echo '$(srcdir)/'`ags/X/ags_osc_server_preferences.c ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo: ags/X/ags_output_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo `test -f 'ags/X/ags_output_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_output_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_output_collection_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_output_collection_editor_callbacks.lo `test -f 'ags/X/ags_output_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_output_collection_editor_callbacks.c ags/X/libgsequencer_la-ags_output_collection_editor.lo: ags/X/ags_output_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_output_collection_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Tpo -c -o ags/X/libgsequencer_la-ags_output_collection_editor.lo `test -f 'ags/X/ags_output_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_output_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_output_collection_editor.c' object='ags/X/libgsequencer_la-ags_output_collection_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_output_collection_editor.lo `test -f 'ags/X/ags_output_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_output_collection_editor.c ags/X/libgsequencer_la-ags_output_editor_callbacks.lo: ags/X/ags_output_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_output_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_output_editor_callbacks.lo `test -f 'ags/X/ags_output_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_output_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_output_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_output_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_output_editor_callbacks.lo `test -f 'ags/X/ags_output_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_output_editor_callbacks.c ags/X/libgsequencer_la-ags_output_editor.lo: ags/X/ags_output_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_output_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Tpo -c -o ags/X/libgsequencer_la-ags_output_editor.lo `test -f 'ags/X/ags_output_editor.c' || echo '$(srcdir)/'`ags/X/ags_output_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_output_editor.c' object='ags/X/libgsequencer_la-ags_output_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_output_editor.lo `test -f 'ags/X/ags_output_editor.c' || echo '$(srcdir)/'`ags/X/ags_output_editor.c ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo: ags/X/ags_output_listing_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo `test -f 'ags/X/ags_output_listing_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_output_listing_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_output_listing_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_output_listing_editor_callbacks.lo `test -f 'ags/X/ags_output_listing_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_output_listing_editor_callbacks.c ags/X/libgsequencer_la-ags_output_listing_editor.lo: ags/X/ags_output_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_output_listing_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Tpo -c -o ags/X/libgsequencer_la-ags_output_listing_editor.lo `test -f 'ags/X/ags_output_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_output_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_output_listing_editor.c' object='ags/X/libgsequencer_la-ags_output_listing_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_output_listing_editor.lo `test -f 'ags/X/ags_output_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_output_listing_editor.c ags/X/libgsequencer_la-ags_pad.lo: ags/X/ags_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_pad.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Tpo -c -o ags/X/libgsequencer_la-ags_pad.lo `test -f 'ags/X/ags_pad.c' || echo '$(srcdir)/'`ags/X/ags_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_pad.c' object='ags/X/libgsequencer_la-ags_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_pad.lo `test -f 'ags/X/ags_pad.c' || echo '$(srcdir)/'`ags/X/ags_pad.c ags/X/libgsequencer_la-ags_pad_callbacks.lo: ags/X/ags_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_pad_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_pad_callbacks.lo `test -f 'ags/X/ags_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_pad_callbacks.c' object='ags/X/libgsequencer_la-ags_pad_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_pad_callbacks.lo `test -f 'ags/X/ags_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_pad_callbacks.c ags/X/libgsequencer_la-ags_pad_editor.lo: ags/X/ags_pad_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_pad_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Tpo -c -o ags/X/libgsequencer_la-ags_pad_editor.lo `test -f 'ags/X/ags_pad_editor.c' || echo '$(srcdir)/'`ags/X/ags_pad_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_pad_editor.c' object='ags/X/libgsequencer_la-ags_pad_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_pad_editor.lo `test -f 'ags/X/ags_pad_editor.c' || echo '$(srcdir)/'`ags/X/ags_pad_editor.c ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo: ags/X/ags_pad_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo `test -f 'ags/X/ags_pad_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_pad_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_pad_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_pad_editor_callbacks.lo `test -f 'ags/X/ags_pad_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_pad_editor_callbacks.c ags/X/libgsequencer_la-ags_performance_preferences.lo: ags/X/ags_performance_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_performance_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_performance_preferences.lo `test -f 'ags/X/ags_performance_preferences.c' || echo '$(srcdir)/'`ags/X/ags_performance_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_performance_preferences.c' object='ags/X/libgsequencer_la-ags_performance_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_performance_preferences.lo `test -f 'ags/X/ags_performance_preferences.c' || echo '$(srcdir)/'`ags/X/ags_performance_preferences.c ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo: ags/X/ags_performance_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo `test -f 'ags/X/ags_performance_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_performance_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_performance_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_performance_preferences_callbacks.lo `test -f 'ags/X/ags_performance_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_performance_preferences_callbacks.c ags/X/libgsequencer_la-ags_playback_window.lo: ags/X/ags_playback_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_playback_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Tpo -c -o ags/X/libgsequencer_la-ags_playback_window.lo `test -f 'ags/X/ags_playback_window.c' || echo '$(srcdir)/'`ags/X/ags_playback_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_playback_window.c' object='ags/X/libgsequencer_la-ags_playback_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_playback_window.lo `test -f 'ags/X/ags_playback_window.c' || echo '$(srcdir)/'`ags/X/ags_playback_window.c ags/X/libgsequencer_la-ags_playback_window_callbacks.lo: ags/X/ags_playback_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_playback_window_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_playback_window_callbacks.lo `test -f 'ags/X/ags_playback_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_playback_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_playback_window_callbacks.c' object='ags/X/libgsequencer_la-ags_playback_window_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_playback_window_callbacks.lo `test -f 'ags/X/ags_playback_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_playback_window_callbacks.c ags/X/libgsequencer_la-ags_plugin_browser.lo: ags/X/ags_plugin_browser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_plugin_browser.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Tpo -c -o ags/X/libgsequencer_la-ags_plugin_browser.lo `test -f 'ags/X/ags_plugin_browser.c' || echo '$(srcdir)/'`ags/X/ags_plugin_browser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_plugin_browser.c' object='ags/X/libgsequencer_la-ags_plugin_browser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_plugin_browser.lo `test -f 'ags/X/ags_plugin_browser.c' || echo '$(srcdir)/'`ags/X/ags_plugin_browser.c ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo: ags/X/ags_plugin_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo `test -f 'ags/X/ags_plugin_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_plugin_browser_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_plugin_browser_callbacks.c' object='ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_plugin_browser_callbacks.lo `test -f 'ags/X/ags_plugin_browser_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_plugin_browser_callbacks.c ags/X/libgsequencer_la-ags_plugin_preferences.lo: ags/X/ags_plugin_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_plugin_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_plugin_preferences.lo `test -f 'ags/X/ags_plugin_preferences.c' || echo '$(srcdir)/'`ags/X/ags_plugin_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_plugin_preferences.c' object='ags/X/libgsequencer_la-ags_plugin_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_plugin_preferences.lo `test -f 'ags/X/ags_plugin_preferences.c' || echo '$(srcdir)/'`ags/X/ags_plugin_preferences.c ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo: ags/X/ags_plugin_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo `test -f 'ags/X/ags_plugin_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_plugin_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_plugin_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_plugin_preferences_callbacks.lo `test -f 'ags/X/ags_plugin_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_plugin_preferences_callbacks.c ags/X/libgsequencer_la-ags_preferences.lo: ags/X/ags_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_preferences.lo `test -f 'ags/X/ags_preferences.c' || echo '$(srcdir)/'`ags/X/ags_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_preferences.c' object='ags/X/libgsequencer_la-ags_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_preferences.lo `test -f 'ags/X/ags_preferences.c' || echo '$(srcdir)/'`ags/X/ags_preferences.c ags/X/libgsequencer_la-ags_preferences_callbacks.lo: ags/X/ags_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_preferences_callbacks.lo `test -f 'ags/X/ags_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_preferences_callbacks.lo `test -f 'ags/X/ags_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_preferences_callbacks.c ags/X/libgsequencer_la-ags_property_collection_editor.lo: ags/X/ags_property_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_property_collection_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Tpo -c -o ags/X/libgsequencer_la-ags_property_collection_editor.lo `test -f 'ags/X/ags_property_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_property_collection_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_property_collection_editor.c' object='ags/X/libgsequencer_la-ags_property_collection_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_property_collection_editor.lo `test -f 'ags/X/ags_property_collection_editor.c' || echo '$(srcdir)/'`ags/X/ags_property_collection_editor.c ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo: ags/X/ags_property_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo `test -f 'ags/X/ags_property_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_property_collection_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_property_collection_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_property_collection_editor_callbacks.lo `test -f 'ags/X/ags_property_collection_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_property_collection_editor_callbacks.c ags/X/libgsequencer_la-ags_property_editor.lo: ags/X/ags_property_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_property_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Tpo -c -o ags/X/libgsequencer_la-ags_property_editor.lo `test -f 'ags/X/ags_property_editor.c' || echo '$(srcdir)/'`ags/X/ags_property_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_property_editor.c' object='ags/X/libgsequencer_la-ags_property_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_property_editor.lo `test -f 'ags/X/ags_property_editor.c' || echo '$(srcdir)/'`ags/X/ags_property_editor.c ags/X/libgsequencer_la-ags_property_editor_callbacks.lo: ags/X/ags_property_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_property_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_property_editor_callbacks.lo `test -f 'ags/X/ags_property_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_property_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_property_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_property_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_property_editor_callbacks.lo `test -f 'ags/X/ags_property_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_property_editor_callbacks.c ags/X/libgsequencer_la-ags_property_listing_editor.lo: ags/X/ags_property_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_property_listing_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Tpo -c -o ags/X/libgsequencer_la-ags_property_listing_editor.lo `test -f 'ags/X/ags_property_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_property_listing_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_property_listing_editor.c' object='ags/X/libgsequencer_la-ags_property_listing_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_property_listing_editor.lo `test -f 'ags/X/ags_property_listing_editor.c' || echo '$(srcdir)/'`ags/X/ags_property_listing_editor.c ags/X/libgsequencer_la-ags_resize_editor.lo: ags/X/ags_resize_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_resize_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Tpo -c -o ags/X/libgsequencer_la-ags_resize_editor.lo `test -f 'ags/X/ags_resize_editor.c' || echo '$(srcdir)/'`ags/X/ags_resize_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_resize_editor.c' object='ags/X/libgsequencer_la-ags_resize_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_resize_editor.lo `test -f 'ags/X/ags_resize_editor.c' || echo '$(srcdir)/'`ags/X/ags_resize_editor.c ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo: ags/X/ags_sequencer_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo `test -f 'ags/X/ags_sequencer_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_sequencer_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_sequencer_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_sequencer_editor_callbacks.lo `test -f 'ags/X/ags_sequencer_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_sequencer_editor_callbacks.c ags/X/libgsequencer_la-ags_sequencer_editor.lo: ags/X/ags_sequencer_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_sequencer_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Tpo -c -o ags/X/libgsequencer_la-ags_sequencer_editor.lo `test -f 'ags/X/ags_sequencer_editor.c' || echo '$(srcdir)/'`ags/X/ags_sequencer_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_sequencer_editor.c' object='ags/X/libgsequencer_la-ags_sequencer_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_sequencer_editor.lo `test -f 'ags/X/ags_sequencer_editor.c' || echo '$(srcdir)/'`ags/X/ags_sequencer_editor.c ags/X/libgsequencer_la-ags_server_preferences.lo: ags/X/ags_server_preferences.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_server_preferences.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Tpo -c -o ags/X/libgsequencer_la-ags_server_preferences.lo `test -f 'ags/X/ags_server_preferences.c' || echo '$(srcdir)/'`ags/X/ags_server_preferences.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_server_preferences.c' object='ags/X/libgsequencer_la-ags_server_preferences.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_server_preferences.lo `test -f 'ags/X/ags_server_preferences.c' || echo '$(srcdir)/'`ags/X/ags_server_preferences.c ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo: ags/X/ags_server_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo `test -f 'ags/X/ags_server_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_server_preferences_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_server_preferences_callbacks.c' object='ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_server_preferences_callbacks.lo `test -f 'ags/X/ags_server_preferences_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_server_preferences_callbacks.c ags/X/libgsequencer_la-ags_sheet_window.lo: ags/X/ags_sheet_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_sheet_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Tpo -c -o ags/X/libgsequencer_la-ags_sheet_window.lo `test -f 'ags/X/ags_sheet_window.c' || echo '$(srcdir)/'`ags/X/ags_sheet_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_sheet_window.c' object='ags/X/libgsequencer_la-ags_sheet_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_sheet_window.lo `test -f 'ags/X/ags_sheet_window.c' || echo '$(srcdir)/'`ags/X/ags_sheet_window.c ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo: ags/X/ags_sheet_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo `test -f 'ags/X/ags_sheet_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_sheet_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_sheet_window_callbacks.c' object='ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_sheet_window_callbacks.lo `test -f 'ags/X/ags_sheet_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_sheet_window_callbacks.c ags/X/libgsequencer_la-ags_sheet_editor.lo: ags/X/ags_sheet_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_sheet_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Tpo -c -o ags/X/libgsequencer_la-ags_sheet_editor.lo `test -f 'ags/X/ags_sheet_editor.c' || echo '$(srcdir)/'`ags/X/ags_sheet_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_sheet_editor.c' object='ags/X/libgsequencer_la-ags_sheet_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_sheet_editor.lo `test -f 'ags/X/ags_sheet_editor.c' || echo '$(srcdir)/'`ags/X/ags_sheet_editor.c ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo: ags/X/ags_sheet_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo `test -f 'ags/X/ags_sheet_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_sheet_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_sheet_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_sheet_editor_callbacks.lo `test -f 'ags/X/ags_sheet_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_sheet_editor_callbacks.c ags/X/libgsequencer_la-ags_ui_provider.lo: ags/X/ags_ui_provider.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_ui_provider.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Tpo -c -o ags/X/libgsequencer_la-ags_ui_provider.lo `test -f 'ags/X/ags_ui_provider.c' || echo '$(srcdir)/'`ags/X/ags_ui_provider.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_ui_provider.c' object='ags/X/libgsequencer_la-ags_ui_provider.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_ui_provider.lo `test -f 'ags/X/ags_ui_provider.c' || echo '$(srcdir)/'`ags/X/ags_ui_provider.c ags/X/libgsequencer_la-ags_wave_window_callbacks.lo: ags/X/ags_wave_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_wave_window_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_wave_window_callbacks.lo `test -f 'ags/X/ags_wave_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_wave_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_wave_window_callbacks.c' object='ags/X/libgsequencer_la-ags_wave_window_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_wave_window_callbacks.lo `test -f 'ags/X/ags_wave_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_wave_window_callbacks.c ags/X/libgsequencer_la-ags_wave_window.lo: ags/X/ags_wave_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_wave_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Tpo -c -o ags/X/libgsequencer_la-ags_wave_window.lo `test -f 'ags/X/ags_wave_window.c' || echo '$(srcdir)/'`ags/X/ags_wave_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_wave_window.c' object='ags/X/libgsequencer_la-ags_wave_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_wave_window.lo `test -f 'ags/X/ags_wave_window.c' || echo '$(srcdir)/'`ags/X/ags_wave_window.c ags/X/libgsequencer_la-ags_wave_editor.lo: ags/X/ags_wave_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_wave_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Tpo -c -o ags/X/libgsequencer_la-ags_wave_editor.lo `test -f 'ags/X/ags_wave_editor.c' || echo '$(srcdir)/'`ags/X/ags_wave_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_wave_editor.c' object='ags/X/libgsequencer_la-ags_wave_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_wave_editor.lo `test -f 'ags/X/ags_wave_editor.c' || echo '$(srcdir)/'`ags/X/ags_wave_editor.c ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo: ags/X/ags_wave_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo `test -f 'ags/X/ags_wave_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_wave_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_wave_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_wave_editor_callbacks.lo `test -f 'ags/X/ags_wave_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_wave_editor_callbacks.c ags/X/libgsequencer_la-ags_window.lo: ags/X/ags_window.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_window.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Tpo -c -o ags/X/libgsequencer_la-ags_window.lo `test -f 'ags/X/ags_window.c' || echo '$(srcdir)/'`ags/X/ags_window.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_window.c' object='ags/X/libgsequencer_la-ags_window.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_window.lo `test -f 'ags/X/ags_window.c' || echo '$(srcdir)/'`ags/X/ags_window.c ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo: ags/X/ags_soundcard_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo `test -f 'ags/X/ags_soundcard_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_soundcard_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_soundcard_editor_callbacks.c' object='ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_soundcard_editor_callbacks.lo `test -f 'ags/X/ags_soundcard_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_soundcard_editor_callbacks.c ags/X/libgsequencer_la-ags_soundcard_editor.lo: ags/X/ags_soundcard_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_soundcard_editor.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Tpo -c -o ags/X/libgsequencer_la-ags_soundcard_editor.lo `test -f 'ags/X/ags_soundcard_editor.c' || echo '$(srcdir)/'`ags/X/ags_soundcard_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_soundcard_editor.c' object='ags/X/libgsequencer_la-ags_soundcard_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_soundcard_editor.lo `test -f 'ags/X/ags_soundcard_editor.c' || echo '$(srcdir)/'`ags/X/ags_soundcard_editor.c ags/X/libgsequencer_la-ags_window_callbacks.lo: ags/X/ags_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_window_callbacks.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Tpo -c -o ags/X/libgsequencer_la-ags_window_callbacks.lo `test -f 'ags/X/ags_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_window_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_window_callbacks.c' object='ags/X/libgsequencer_la-ags_window_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_window_callbacks.lo `test -f 'ags/X/ags_window_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_window_callbacks.c ags/X/libgsequencer_la-ags_xorg_application_context.lo: ags/X/ags_xorg_application_context.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_xorg_application_context.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Tpo -c -o ags/X/libgsequencer_la-ags_xorg_application_context.lo `test -f 'ags/X/ags_xorg_application_context.c' || echo '$(srcdir)/'`ags/X/ags_xorg_application_context.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/ags_xorg_application_context.c' object='ags/X/libgsequencer_la-ags_xorg_application_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_xorg_application_context.lo `test -f 'ags/X/ags_xorg_application_context.c' || echo '$(srcdir)/'`ags/X/ags_xorg_application_context.c ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo: ags/X/osc/controller/ags_ui_osc_renew_controller.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo -MD -MP -MF ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Tpo -c -o ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo `test -f 'ags/X/osc/controller/ags_ui_osc_renew_controller.c' || echo '$(srcdir)/'`ags/X/osc/controller/ags_ui_osc_renew_controller.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Tpo ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/osc/controller/ags_ui_osc_renew_controller.c' object='ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/osc/controller/libgsequencer_la-ags_ui_osc_renew_controller.lo `test -f 'ags/X/osc/controller/ags_ui_osc_renew_controller.c' || echo '$(srcdir)/'`ags/X/osc/controller/ags_ui_osc_renew_controller.c ags/X/file/libgsequencer_la-ags_simple_file.lo: ags/X/file/ags_simple_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/file/libgsequencer_la-ags_simple_file.lo -MD -MP -MF ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Tpo -c -o ags/X/file/libgsequencer_la-ags_simple_file.lo `test -f 'ags/X/file/ags_simple_file.c' || echo '$(srcdir)/'`ags/X/file/ags_simple_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Tpo ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/file/ags_simple_file.c' object='ags/X/file/libgsequencer_la-ags_simple_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/file/libgsequencer_la-ags_simple_file.lo `test -f 'ags/X/file/ags_simple_file.c' || echo '$(srcdir)/'`ags/X/file/ags_simple_file.c ags/X/task/libgsequencer_la-ags_simple_file_read.lo: ags/X/task/ags_simple_file_read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/task/libgsequencer_la-ags_simple_file_read.lo -MD -MP -MF ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Tpo -c -o ags/X/task/libgsequencer_la-ags_simple_file_read.lo `test -f 'ags/X/task/ags_simple_file_read.c' || echo '$(srcdir)/'`ags/X/task/ags_simple_file_read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Tpo ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/task/ags_simple_file_read.c' object='ags/X/task/libgsequencer_la-ags_simple_file_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/task/libgsequencer_la-ags_simple_file_read.lo `test -f 'ags/X/task/ags_simple_file_read.c' || echo '$(srcdir)/'`ags/X/task/ags_simple_file_read.c ags/X/task/libgsequencer_la-ags_simple_file_write.lo: ags/X/task/ags_simple_file_write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/task/libgsequencer_la-ags_simple_file_write.lo -MD -MP -MF ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Tpo -c -o ags/X/task/libgsequencer_la-ags_simple_file_write.lo `test -f 'ags/X/task/ags_simple_file_write.c' || echo '$(srcdir)/'`ags/X/task/ags_simple_file_write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Tpo ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/task/ags_simple_file_write.c' object='ags/X/task/libgsequencer_la-ags_simple_file_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/task/libgsequencer_la-ags_simple_file_write.lo `test -f 'ags/X/task/ags_simple_file_write.c' || echo '$(srcdir)/'`ags/X/task/ags_simple_file_write.c ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo: ags/X/import/ags_midi_import_wizard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo -MD -MP -MF ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Tpo -c -o ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo `test -f 'ags/X/import/ags_midi_import_wizard.c' || echo '$(srcdir)/'`ags/X/import/ags_midi_import_wizard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Tpo ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/import/ags_midi_import_wizard.c' object='ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/import/libgsequencer_la-ags_midi_import_wizard.lo `test -f 'ags/X/import/ags_midi_import_wizard.c' || echo '$(srcdir)/'`ags/X/import/ags_midi_import_wizard.c ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo: ags/X/import/ags_midi_import_wizard_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo -MD -MP -MF ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Tpo -c -o ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo `test -f 'ags/X/import/ags_midi_import_wizard_callbacks.c' || echo '$(srcdir)/'`ags/X/import/ags_midi_import_wizard_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Tpo ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/import/ags_midi_import_wizard_callbacks.c' object='ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/import/libgsequencer_la-ags_midi_import_wizard_callbacks.lo `test -f 'ags/X/import/ags_midi_import_wizard_callbacks.c' || echo '$(srcdir)/'`ags/X/import/ags_midi_import_wizard_callbacks.c ags/X/import/libgsequencer_la-ags_track_collection.lo: ags/X/import/ags_track_collection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/import/libgsequencer_la-ags_track_collection.lo -MD -MP -MF ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Tpo -c -o ags/X/import/libgsequencer_la-ags_track_collection.lo `test -f 'ags/X/import/ags_track_collection.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Tpo ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/import/ags_track_collection.c' object='ags/X/import/libgsequencer_la-ags_track_collection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/import/libgsequencer_la-ags_track_collection.lo `test -f 'ags/X/import/ags_track_collection.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection.c ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo: ags/X/import/ags_track_collection_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo -MD -MP -MF ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Tpo -c -o ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo `test -f 'ags/X/import/ags_track_collection_callbacks.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Tpo ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/import/ags_track_collection_callbacks.c' object='ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/import/libgsequencer_la-ags_track_collection_callbacks.lo `test -f 'ags/X/import/ags_track_collection_callbacks.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection_callbacks.c ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo: ags/X/import/ags_track_collection_mapper.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo -MD -MP -MF ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Tpo -c -o ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo `test -f 'ags/X/import/ags_track_collection_mapper.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection_mapper.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Tpo ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/import/ags_track_collection_mapper.c' object='ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/import/libgsequencer_la-ags_track_collection_mapper.lo `test -f 'ags/X/import/ags_track_collection_mapper.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection_mapper.c ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo: ags/X/import/ags_track_collection_mapper_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo -MD -MP -MF ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Tpo -c -o ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo `test -f 'ags/X/import/ags_track_collection_mapper_callbacks.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection_mapper_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Tpo ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/import/ags_track_collection_mapper_callbacks.c' object='ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/import/libgsequencer_la-ags_track_collection_mapper_callbacks.lo `test -f 'ags/X/import/ags_track_collection_mapper_callbacks.c' || echo '$(srcdir)/'`ags/X/import/ags_track_collection_mapper_callbacks.c ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo: ags/X/export/ags_midi_export_wizard.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Tpo -c -o ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo `test -f 'ags/X/export/ags_midi_export_wizard.c' || echo '$(srcdir)/'`ags/X/export/ags_midi_export_wizard.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_midi_export_wizard.c' object='ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_midi_export_wizard.lo `test -f 'ags/X/export/ags_midi_export_wizard.c' || echo '$(srcdir)/'`ags/X/export/ags_midi_export_wizard.c ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo: ags/X/export/ags_midi_export_wizard_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Tpo -c -o ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo `test -f 'ags/X/export/ags_midi_export_wizard_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_midi_export_wizard_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_midi_export_wizard_callbacks.c' object='ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_midi_export_wizard_callbacks.lo `test -f 'ags/X/export/ags_midi_export_wizard_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_midi_export_wizard_callbacks.c ags/X/export/libgsequencer_la-ags_machine_collection.lo: ags/X/export/ags_machine_collection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_machine_collection.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Tpo -c -o ags/X/export/libgsequencer_la-ags_machine_collection.lo `test -f 'ags/X/export/ags_machine_collection.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_machine_collection.c' object='ags/X/export/libgsequencer_la-ags_machine_collection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_machine_collection.lo `test -f 'ags/X/export/ags_machine_collection.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection.c ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo: ags/X/export/ags_machine_collection_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Tpo -c -o ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo `test -f 'ags/X/export/ags_machine_collection_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_machine_collection_callbacks.c' object='ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_machine_collection_callbacks.lo `test -f 'ags/X/export/ags_machine_collection_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection_callbacks.c ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo: ags/X/export/ags_machine_collection_entry.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Tpo -c -o ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo `test -f 'ags/X/export/ags_machine_collection_entry.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection_entry.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_machine_collection_entry.c' object='ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_machine_collection_entry.lo `test -f 'ags/X/export/ags_machine_collection_entry.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection_entry.c ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo: ags/X/export/ags_machine_collection_entry_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Tpo -c -o ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo `test -f 'ags/X/export/ags_machine_collection_entry_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection_entry_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_machine_collection_entry_callbacks.c' object='ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_machine_collection_entry_callbacks.lo `test -f 'ags/X/export/ags_machine_collection_entry_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_machine_collection_entry_callbacks.c ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo: ags/X/export/ags_wave_export_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Tpo -c -o ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo `test -f 'ags/X/export/ags_wave_export_dialog.c' || echo '$(srcdir)/'`ags/X/export/ags_wave_export_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_wave_export_dialog.c' object='ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_wave_export_dialog.lo `test -f 'ags/X/export/ags_wave_export_dialog.c' || echo '$(srcdir)/'`ags/X/export/ags_wave_export_dialog.c ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo: ags/X/export/ags_wave_export_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo -MD -MP -MF ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Tpo -c -o ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo `test -f 'ags/X/export/ags_wave_export_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_wave_export_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Tpo ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/export/ags_wave_export_dialog_callbacks.c' object='ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/export/libgsequencer_la-ags_wave_export_dialog_callbacks.lo `test -f 'ags/X/export/ags_wave_export_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/export/ags_wave_export_dialog_callbacks.c ags/X/machine/libgsequencer_la-ags_audiorec.lo: ags/X/machine/ags_audiorec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_audiorec.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Tpo -c -o ags/X/machine/libgsequencer_la-ags_audiorec.lo `test -f 'ags/X/machine/ags_audiorec.c' || echo '$(srcdir)/'`ags/X/machine/ags_audiorec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_audiorec.c' object='ags/X/machine/libgsequencer_la-ags_audiorec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_audiorec.lo `test -f 'ags/X/machine/ags_audiorec.c' || echo '$(srcdir)/'`ags/X/machine/ags_audiorec.c ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo: ags/X/machine/ags_audiorec_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo `test -f 'ags/X/machine/ags_audiorec_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_audiorec_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_audiorec_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_audiorec_callbacks.lo `test -f 'ags/X/machine/ags_audiorec_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_audiorec_callbacks.c ags/X/machine/libgsequencer_la-ags_cell_pattern.lo: ags/X/machine/ags_cell_pattern.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_cell_pattern.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Tpo -c -o ags/X/machine/libgsequencer_la-ags_cell_pattern.lo `test -f 'ags/X/machine/ags_cell_pattern.c' || echo '$(srcdir)/'`ags/X/machine/ags_cell_pattern.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_cell_pattern.c' object='ags/X/machine/libgsequencer_la-ags_cell_pattern.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_cell_pattern.lo `test -f 'ags/X/machine/ags_cell_pattern.c' || echo '$(srcdir)/'`ags/X/machine/ags_cell_pattern.c ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo: ags/X/machine/ags_cell_pattern_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo `test -f 'ags/X/machine/ags_cell_pattern_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_cell_pattern_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_cell_pattern_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_cell_pattern_callbacks.lo `test -f 'ags/X/machine/ags_cell_pattern_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_cell_pattern_callbacks.c ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo: ags/X/machine/ags_desk_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo `test -f 'ags/X/machine/ags_desk_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_desk_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_desk_callbacks.lo `test -f 'ags/X/machine/ags_desk_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk_callbacks.c ags/X/machine/libgsequencer_la-ags_desk.lo: ags/X/machine/ags_desk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_desk.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Tpo -c -o ags/X/machine/libgsequencer_la-ags_desk.lo `test -f 'ags/X/machine/ags_desk.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_desk.c' object='ags/X/machine/libgsequencer_la-ags_desk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_desk.lo `test -f 'ags/X/machine/ags_desk.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk.c ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo: ags/X/machine/ags_desk_input_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo `test -f 'ags/X/machine/ags_desk_input_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk_input_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_desk_input_pad_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_desk_input_pad_callbacks.lo `test -f 'ags/X/machine/ags_desk_input_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk_input_pad_callbacks.c ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo: ags/X/machine/ags_desk_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo `test -f 'ags/X/machine/ags_desk_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_desk_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_desk_input_pad.lo `test -f 'ags/X/machine/ags_desk_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_desk_input_pad.c ags/X/machine/libgsequencer_la-ags_drum.lo: ags/X/machine/ags_drum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum.lo `test -f 'ags/X/machine/ags_drum.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum.c' object='ags/X/machine/libgsequencer_la-ags_drum.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum.lo `test -f 'ags/X/machine/ags_drum.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum.c ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo: ags/X/machine/ags_drum_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo `test -f 'ags/X/machine/ags_drum_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_callbacks.lo `test -f 'ags/X/machine/ags_drum_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_callbacks.c ags/X/machine/libgsequencer_la-ags_drum_input_line.lo: ags/X/machine/ags_drum_input_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_input_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_input_line.lo `test -f 'ags/X/machine/ags_drum_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_input_line.c' object='ags/X/machine/libgsequencer_la-ags_drum_input_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_input_line.lo `test -f 'ags/X/machine/ags_drum_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_line.c ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo: ags/X/machine/ags_drum_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo `test -f 'ags/X/machine/ags_drum_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_input_line_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_input_line_callbacks.lo `test -f 'ags/X/machine/ags_drum_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_line_callbacks.c ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo: ags/X/machine/ags_drum_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo `test -f 'ags/X/machine/ags_drum_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_input_pad.lo `test -f 'ags/X/machine/ags_drum_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_pad.c ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo: ags/X/machine/ags_drum_input_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo `test -f 'ags/X/machine/ags_drum_input_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_input_pad_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_input_pad_callbacks.lo `test -f 'ags/X/machine/ags_drum_input_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_input_pad_callbacks.c ags/X/machine/libgsequencer_la-ags_drum_output_line.lo: ags/X/machine/ags_drum_output_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_output_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_output_line.lo `test -f 'ags/X/machine/ags_drum_output_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_output_line.c' object='ags/X/machine/libgsequencer_la-ags_drum_output_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_output_line.lo `test -f 'ags/X/machine/ags_drum_output_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_line.c ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo: ags/X/machine/ags_drum_output_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo `test -f 'ags/X/machine/ags_drum_output_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_output_line_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_output_line_callbacks.lo `test -f 'ags/X/machine/ags_drum_output_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_line_callbacks.c ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo: ags/X/machine/ags_drum_output_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo `test -f 'ags/X/machine/ags_drum_output_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_output_pad.c' object='ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_output_pad.lo `test -f 'ags/X/machine/ags_drum_output_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_pad.c ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo: ags/X/machine/ags_drum_output_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo `test -f 'ags/X/machine/ags_drum_output_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_drum_output_pad_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_drum_output_pad_callbacks.lo `test -f 'ags/X/machine/ags_drum_output_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_drum_output_pad_callbacks.c ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo: ags/X/machine/ags_dssi_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo `test -f 'ags/X/machine/ags_dssi_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_dssi_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_dssi_bridge.c' object='ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_dssi_bridge.lo `test -f 'ags/X/machine/ags_dssi_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_dssi_bridge.c ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo: ags/X/machine/ags_dssi_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo `test -f 'ags/X/machine/ags_dssi_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_dssi_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_dssi_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_dssi_bridge_callbacks.lo `test -f 'ags/X/machine/ags_dssi_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_dssi_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_equalizer10.lo: ags/X/machine/ags_equalizer10.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_equalizer10.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Tpo -c -o ags/X/machine/libgsequencer_la-ags_equalizer10.lo `test -f 'ags/X/machine/ags_equalizer10.c' || echo '$(srcdir)/'`ags/X/machine/ags_equalizer10.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_equalizer10.c' object='ags/X/machine/libgsequencer_la-ags_equalizer10.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_equalizer10.lo `test -f 'ags/X/machine/ags_equalizer10.c' || echo '$(srcdir)/'`ags/X/machine/ags_equalizer10.c ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo: ags/X/machine/ags_equalizer10_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo `test -f 'ags/X/machine/ags_equalizer10_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_equalizer10_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_equalizer10_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_equalizer10_callbacks.lo `test -f 'ags/X/machine/ags_equalizer10_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_equalizer10_callbacks.c ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo: ags/X/machine/ags_fm_oscillator_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo `test -f 'ags/X/machine/ags_fm_oscillator_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_oscillator_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_oscillator_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_oscillator_callbacks.lo `test -f 'ags/X/machine/ags_fm_oscillator_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_oscillator_callbacks.c ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo: ags/X/machine/ags_fm_oscillator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo `test -f 'ags/X/machine/ags_fm_oscillator.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_oscillator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_oscillator.c' object='ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_oscillator.lo `test -f 'ags/X/machine/ags_fm_oscillator.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_oscillator.c ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo: ags/X/machine/ags_fm_syncsynth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo `test -f 'ags/X/machine/ags_fm_syncsynth.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_syncsynth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_syncsynth.c' object='ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_syncsynth.lo `test -f 'ags/X/machine/ags_fm_syncsynth.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_syncsynth.c ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo: ags/X/machine/ags_fm_syncsynth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo `test -f 'ags/X/machine/ags_fm_syncsynth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_syncsynth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_syncsynth_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_syncsynth_callbacks.lo `test -f 'ags/X/machine/ags_fm_syncsynth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_syncsynth_callbacks.c ags/X/machine/libgsequencer_la-ags_fm_synth.lo: ags/X/machine/ags_fm_synth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_synth.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_synth.lo `test -f 'ags/X/machine/ags_fm_synth.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_synth.c' object='ags/X/machine/libgsequencer_la-ags_fm_synth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_synth.lo `test -f 'ags/X/machine/ags_fm_synth.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth.c ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo: ags/X/machine/ags_fm_synth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo `test -f 'ags/X/machine/ags_fm_synth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_synth_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_callbacks.lo `test -f 'ags/X/machine/ags_fm_synth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_callbacks.c ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo: ags/X/machine/ags_fm_synth_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo `test -f 'ags/X/machine/ags_fm_synth_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_synth_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_input_pad.lo `test -f 'ags/X/machine/ags_fm_synth_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_input_pad.c ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo: ags/X/machine/ags_fm_synth_input_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo `test -f 'ags/X/machine/ags_fm_synth_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_input_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_synth_input_line.c' object='ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_input_line.lo `test -f 'ags/X/machine/ags_fm_synth_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_input_line.c ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo: ags/X/machine/ags_fm_synth_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo `test -f 'ags/X/machine/ags_fm_synth_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_fm_synth_input_line_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_fm_synth_input_line_callbacks.lo `test -f 'ags/X/machine/ags_fm_synth_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_fm_synth_input_line_callbacks.c ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo: ags/X/machine/ags_ladspa_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo `test -f 'ags/X/machine/ags_ladspa_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_ladspa_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ladspa_bridge.c' object='ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ladspa_bridge.lo `test -f 'ags/X/machine/ags_ladspa_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_ladspa_bridge.c ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo: ags/X/machine/ags_ladspa_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo `test -f 'ags/X/machine/ags_ladspa_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ladspa_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ladspa_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ladspa_bridge_callbacks.lo `test -f 'ags/X/machine/ags_ladspa_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ladspa_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo: ags/X/machine/ags_live_dssi_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo `test -f 'ags/X/machine/ags_live_dssi_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_dssi_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_live_dssi_bridge.c' object='ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_live_dssi_bridge.lo `test -f 'ags/X/machine/ags_live_dssi_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_dssi_bridge.c ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo: ags/X/machine/ags_live_dssi_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo `test -f 'ags/X/machine/ags_live_dssi_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_dssi_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_live_dssi_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_live_dssi_bridge_callbacks.lo `test -f 'ags/X/machine/ags_live_dssi_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_dssi_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo: ags/X/machine/ags_live_lv2_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo `test -f 'ags/X/machine/ags_live_lv2_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_lv2_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_live_lv2_bridge.c' object='ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_live_lv2_bridge.lo `test -f 'ags/X/machine/ags_live_lv2_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_lv2_bridge.c ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo: ags/X/machine/ags_live_lv2_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo `test -f 'ags/X/machine/ags_live_lv2_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_lv2_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_live_lv2_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_live_lv2_bridge_callbacks.lo `test -f 'ags/X/machine/ags_live_lv2_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_live_lv2_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo: ags/X/machine/ags_lv2_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo `test -f 'ags/X/machine/ags_lv2_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_lv2_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_lv2_bridge.c' object='ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_lv2_bridge.lo `test -f 'ags/X/machine/ags_lv2_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_lv2_bridge.c ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo: ags/X/machine/ags_lv2_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo `test -f 'ags/X/machine/ags_lv2_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_lv2_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_lv2_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_lv2_bridge_callbacks.lo `test -f 'ags/X/machine/ags_lv2_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_lv2_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_matrix.lo: ags/X/machine/ags_matrix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_matrix.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Tpo -c -o ags/X/machine/libgsequencer_la-ags_matrix.lo `test -f 'ags/X/machine/ags_matrix.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_matrix.c' object='ags/X/machine/libgsequencer_la-ags_matrix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_matrix.lo `test -f 'ags/X/machine/ags_matrix.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix.c ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo: ags/X/machine/ags_matrix_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo `test -f 'ags/X/machine/ags_matrix_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_matrix_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_matrix_callbacks.lo `test -f 'ags/X/machine/ags_matrix_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_callbacks.c ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo: ags/X/machine/ags_matrix_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo `test -f 'ags/X/machine/ags_matrix_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_matrix_bridge.c' object='ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_matrix_bridge.lo `test -f 'ags/X/machine/ags_matrix_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bridge.c ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo: ags/X/machine/ags_matrix_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo `test -f 'ags/X/machine/ags_matrix_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_matrix_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_matrix_bridge_callbacks.lo `test -f 'ags/X/machine/ags_matrix_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo: ags/X/machine/ags_matrix_bulk_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Tpo -c -o ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo `test -f 'ags/X/machine/ags_matrix_bulk_input.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bulk_input.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_matrix_bulk_input.c' object='ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_matrix_bulk_input.lo `test -f 'ags/X/machine/ags_matrix_bulk_input.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bulk_input.c ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo: ags/X/machine/ags_matrix_bulk_input_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo `test -f 'ags/X/machine/ags_matrix_bulk_input_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bulk_input_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_matrix_bulk_input_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_matrix_bulk_input_callbacks.lo `test -f 'ags/X/machine/ags_matrix_bulk_input_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_matrix_bulk_input_callbacks.c ags/X/machine/libgsequencer_la-ags_mixer.lo: ags/X/machine/ags_mixer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_mixer.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Tpo -c -o ags/X/machine/libgsequencer_la-ags_mixer.lo `test -f 'ags/X/machine/ags_mixer.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_mixer.c' object='ags/X/machine/libgsequencer_la-ags_mixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_mixer.lo `test -f 'ags/X/machine/ags_mixer.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer.c ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo: ags/X/machine/ags_mixer_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo `test -f 'ags/X/machine/ags_mixer_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_mixer_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_mixer_callbacks.lo `test -f 'ags/X/machine/ags_mixer_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer_callbacks.c ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo: ags/X/machine/ags_mixer_input_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo `test -f 'ags/X/machine/ags_mixer_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer_input_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_mixer_input_line.c' object='ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_mixer_input_line.lo `test -f 'ags/X/machine/ags_mixer_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer_input_line.c ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo: ags/X/machine/ags_mixer_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo `test -f 'ags/X/machine/ags_mixer_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_mixer_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_mixer_input_pad.lo `test -f 'ags/X/machine/ags_mixer_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_mixer_input_pad.c ags/X/machine/libgsequencer_la-ags_oscillator.lo: ags/X/machine/ags_oscillator.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_oscillator.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Tpo -c -o ags/X/machine/libgsequencer_la-ags_oscillator.lo `test -f 'ags/X/machine/ags_oscillator.c' || echo '$(srcdir)/'`ags/X/machine/ags_oscillator.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_oscillator.c' object='ags/X/machine/libgsequencer_la-ags_oscillator.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_oscillator.lo `test -f 'ags/X/machine/ags_oscillator.c' || echo '$(srcdir)/'`ags/X/machine/ags_oscillator.c ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo: ags/X/machine/ags_oscillator_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo `test -f 'ags/X/machine/ags_oscillator_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_oscillator_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_oscillator_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_oscillator_callbacks.lo `test -f 'ags/X/machine/ags_oscillator_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_oscillator_callbacks.c ags/X/machine/libgsequencer_la-ags_panel.lo: ags/X/machine/ags_panel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_panel.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Tpo -c -o ags/X/machine/libgsequencer_la-ags_panel.lo `test -f 'ags/X/machine/ags_panel.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_panel.c' object='ags/X/machine/libgsequencer_la-ags_panel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_panel.lo `test -f 'ags/X/machine/ags_panel.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel.c ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo: ags/X/machine/ags_panel_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo `test -f 'ags/X/machine/ags_panel_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_panel_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_panel_callbacks.lo `test -f 'ags/X/machine/ags_panel_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_callbacks.c ags/X/machine/libgsequencer_la-ags_panel_input_line.lo: ags/X/machine/ags_panel_input_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_panel_input_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_panel_input_line.lo `test -f 'ags/X/machine/ags_panel_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_input_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_panel_input_line.c' object='ags/X/machine/libgsequencer_la-ags_panel_input_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_panel_input_line.lo `test -f 'ags/X/machine/ags_panel_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_input_line.c ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo: ags/X/machine/ags_panel_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo `test -f 'ags/X/machine/ags_panel_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_panel_input_line_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_panel_input_line_callbacks.lo `test -f 'ags/X/machine/ags_panel_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_input_line_callbacks.c ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo: ags/X/machine/ags_panel_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo `test -f 'ags/X/machine/ags_panel_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_panel_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_panel_input_pad.lo `test -f 'ags/X/machine/ags_panel_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_panel_input_pad.c ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo: ags/X/machine/ags_pattern_box_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo `test -f 'ags/X/machine/ags_pattern_box_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_pattern_box_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_pattern_box_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_pattern_box_callbacks.lo `test -f 'ags/X/machine/ags_pattern_box_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_pattern_box_callbacks.c ags/X/machine/libgsequencer_la-ags_pattern_box.lo: ags/X/machine/ags_pattern_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_pattern_box.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Tpo -c -o ags/X/machine/libgsequencer_la-ags_pattern_box.lo `test -f 'ags/X/machine/ags_pattern_box.c' || echo '$(srcdir)/'`ags/X/machine/ags_pattern_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_pattern_box.c' object='ags/X/machine/libgsequencer_la-ags_pattern_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_pattern_box.lo `test -f 'ags/X/machine/ags_pattern_box.c' || echo '$(srcdir)/'`ags/X/machine/ags_pattern_box.c ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo: ags/X/machine/ags_pitch_sampler.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Tpo -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo `test -f 'ags/X/machine/ags_pitch_sampler.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_pitch_sampler.c' object='ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler.lo `test -f 'ags/X/machine/ags_pitch_sampler.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler.c ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo: ags/X/machine/ags_pitch_sampler_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo `test -f 'ags/X/machine/ags_pitch_sampler_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_pitch_sampler_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler_callbacks.lo `test -f 'ags/X/machine/ags_pitch_sampler_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler_callbacks.c ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo: ags/X/machine/ags_pitch_sampler_file.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Tpo -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo `test -f 'ags/X/machine/ags_pitch_sampler_file.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler_file.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_pitch_sampler_file.c' object='ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler_file.lo `test -f 'ags/X/machine/ags_pitch_sampler_file.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler_file.c ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo: ags/X/machine/ags_pitch_sampler_file_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo `test -f 'ags/X/machine/ags_pitch_sampler_file_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler_file_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_pitch_sampler_file_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_pitch_sampler_file_callbacks.lo `test -f 'ags/X/machine/ags_pitch_sampler_file_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_pitch_sampler_file_callbacks.c ags/X/machine/libgsequencer_la-ags_syncsynth.lo: ags/X/machine/ags_syncsynth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_syncsynth.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Tpo -c -o ags/X/machine/libgsequencer_la-ags_syncsynth.lo `test -f 'ags/X/machine/ags_syncsynth.c' || echo '$(srcdir)/'`ags/X/machine/ags_syncsynth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_syncsynth.c' object='ags/X/machine/libgsequencer_la-ags_syncsynth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_syncsynth.lo `test -f 'ags/X/machine/ags_syncsynth.c' || echo '$(srcdir)/'`ags/X/machine/ags_syncsynth.c ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo: ags/X/machine/ags_syncsynth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo `test -f 'ags/X/machine/ags_syncsynth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_syncsynth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_syncsynth_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_syncsynth_callbacks.lo `test -f 'ags/X/machine/ags_syncsynth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_syncsynth_callbacks.c ags/X/machine/libgsequencer_la-ags_synth.lo: ags/X/machine/ags_synth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_synth.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Tpo -c -o ags/X/machine/libgsequencer_la-ags_synth.lo `test -f 'ags/X/machine/ags_synth.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_synth.c' object='ags/X/machine/libgsequencer_la-ags_synth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_synth.lo `test -f 'ags/X/machine/ags_synth.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth.c ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo: ags/X/machine/ags_synth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo `test -f 'ags/X/machine/ags_synth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_synth_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_synth_callbacks.lo `test -f 'ags/X/machine/ags_synth_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_callbacks.c ags/X/machine/libgsequencer_la-ags_synth_input_line.lo: ags/X/machine/ags_synth_input_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_synth_input_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_synth_input_line.lo `test -f 'ags/X/machine/ags_synth_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_input_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_synth_input_line.c' object='ags/X/machine/libgsequencer_la-ags_synth_input_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_synth_input_line.lo `test -f 'ags/X/machine/ags_synth_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_input_line.c ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo: ags/X/machine/ags_synth_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo `test -f 'ags/X/machine/ags_synth_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_synth_input_line_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_synth_input_line_callbacks.lo `test -f 'ags/X/machine/ags_synth_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_input_line_callbacks.c ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo: ags/X/machine/ags_synth_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo `test -f 'ags/X/machine/ags_synth_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_synth_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_synth_input_pad.lo `test -f 'ags/X/machine/ags_synth_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_synth_input_pad.c ags/X/machine/libgsequencer_la-ags_spectrometer.lo: ags/X/machine/ags_spectrometer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_spectrometer.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Tpo -c -o ags/X/machine/libgsequencer_la-ags_spectrometer.lo `test -f 'ags/X/machine/ags_spectrometer.c' || echo '$(srcdir)/'`ags/X/machine/ags_spectrometer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_spectrometer.c' object='ags/X/machine/libgsequencer_la-ags_spectrometer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_spectrometer.lo `test -f 'ags/X/machine/ags_spectrometer.c' || echo '$(srcdir)/'`ags/X/machine/ags_spectrometer.c ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo: ags/X/machine/ags_spectrometer_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo `test -f 'ags/X/machine/ags_spectrometer_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_spectrometer_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_spectrometer_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_spectrometer_callbacks.lo `test -f 'ags/X/machine/ags_spectrometer_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_spectrometer_callbacks.c ags/X/machine/libgsequencer_la-ags_ffplayer.lo: ags/X/machine/ags_ffplayer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer.lo `test -f 'ags/X/machine/ags_ffplayer.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer.lo `test -f 'ags/X/machine/ags_ffplayer.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer.c ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo: ags/X/machine/ags_ffplayer_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_callbacks.c ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo: ags/X/machine/ags_ffplayer_bridge.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo `test -f 'ags/X/machine/ags_ffplayer_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bridge.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_bridge.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bridge.lo `test -f 'ags/X/machine/ags_ffplayer_bridge.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bridge.c ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo: ags/X/machine/ags_ffplayer_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bridge_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_bridge_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bridge_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_bridge_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bridge_callbacks.c ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo: ags/X/machine/ags_ffplayer_bulk_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo `test -f 'ags/X/machine/ags_ffplayer_bulk_input.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bulk_input.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_bulk_input.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input.lo `test -f 'ags/X/machine/ags_ffplayer_bulk_input.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bulk_input.c ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo: ags/X/machine/ags_ffplayer_bulk_input_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_bulk_input_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bulk_input_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_bulk_input_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_bulk_input_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_bulk_input_callbacks.c ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo: ags/X/machine/ags_ffplayer_input_line.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo `test -f 'ags/X/machine/ags_ffplayer_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_line.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_input_line.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_line.lo `test -f 'ags/X/machine/ags_ffplayer_input_line.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_line.c ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo: ags/X/machine/ags_ffplayer_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_line_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_input_line_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_line_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_input_line_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_line_callbacks.c ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo: ags/X/machine/ags_ffplayer_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo `test -f 'ags/X/machine/ags_ffplayer_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_pad.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_input_pad.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad.lo `test -f 'ags/X/machine/ags_ffplayer_input_pad.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_pad.c ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo: ags/X/machine/ags_ffplayer_input_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo -MD -MP -MF ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Tpo -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_input_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_pad_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Tpo ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/machine/ags_ffplayer_input_pad_callbacks.c' object='ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/machine/libgsequencer_la-ags_ffplayer_input_pad_callbacks.lo `test -f 'ags/X/machine/ags_ffplayer_input_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/machine/ags_ffplayer_input_pad_callbacks.c ags/X/editor/libgsequencer_la-ags_automation_edit.lo: ags/X/editor/ags_automation_edit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_edit.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_edit.lo `test -f 'ags/X/editor/ags_automation_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_edit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_edit.c' object='ags/X/editor/libgsequencer_la-ags_automation_edit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_edit.lo `test -f 'ags/X/editor/ags_automation_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_edit.c ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo: ags/X/editor/ags_automation_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo `test -f 'ags/X/editor/ags_automation_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_edit_box.c' object='ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_edit_box.lo `test -f 'ags/X/editor/ags_automation_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_edit_box.c ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo: ags/X/editor/ags_automation_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo `test -f 'ags/X/editor/ags_automation_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_edit_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_edit_callbacks.lo `test -f 'ags/X/editor/ags_automation_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_edit_callbacks.c ags/X/editor/libgsequencer_la-ags_automation_meta.lo: ags/X/editor/ags_automation_meta.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_meta.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_meta.lo `test -f 'ags/X/editor/ags_automation_meta.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_meta.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_meta.c' object='ags/X/editor/libgsequencer_la-ags_automation_meta.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_meta.lo `test -f 'ags/X/editor/ags_automation_meta.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_meta.c ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo: ags/X/editor/ags_automation_meta_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo `test -f 'ags/X/editor/ags_automation_meta_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_meta_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_meta_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_meta_callbacks.lo `test -f 'ags/X/editor/ags_automation_meta_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_meta_callbacks.c ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo: ags/X/editor/ags_automation_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo `test -f 'ags/X/editor/ags_automation_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_toolbar.c' object='ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_toolbar.lo `test -f 'ags/X/editor/ags_automation_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_toolbar.c ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo: ags/X/editor/ags_automation_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_automation_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_automation_toolbar_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_automation_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_automation_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_automation_toolbar_callbacks.c ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo: ags/X/editor/ags_crop_note_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo `test -f 'ags/X/editor/ags_crop_note_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_crop_note_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_crop_note_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_crop_note_dialog_callbacks.lo `test -f 'ags/X/editor/ags_crop_note_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_crop_note_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo: ags/X/editor/ags_crop_note_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo `test -f 'ags/X/editor/ags_crop_note_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_crop_note_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_crop_note_dialog.c' object='ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_crop_note_dialog.lo `test -f 'ags/X/editor/ags_crop_note_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_crop_note_dialog.c ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo: ags/X/editor/ags_envelope_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo `test -f 'ags/X/editor/ags_envelope_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_envelope_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_envelope_dialog_callbacks.lo `test -f 'ags/X/editor/ags_envelope_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo: ags/X/editor/ags_envelope_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo `test -f 'ags/X/editor/ags_envelope_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_envelope_dialog.c' object='ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_envelope_dialog.lo `test -f 'ags/X/editor/ags_envelope_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_dialog.c ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo: ags/X/editor/ags_envelope_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo `test -f 'ags/X/editor/ags_envelope_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_editor_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_envelope_editor_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_envelope_editor_callbacks.lo `test -f 'ags/X/editor/ags_envelope_editor_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_editor_callbacks.c ags/X/editor/libgsequencer_la-ags_envelope_editor.lo: ags/X/editor/ags_envelope_editor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_envelope_editor.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Tpo -c -o ags/X/editor/libgsequencer_la-ags_envelope_editor.lo `test -f 'ags/X/editor/ags_envelope_editor.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_editor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_envelope_editor.c' object='ags/X/editor/libgsequencer_la-ags_envelope_editor.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_envelope_editor.lo `test -f 'ags/X/editor/ags_envelope_editor.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_editor.c ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo: ags/X/editor/ags_envelope_info_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo `test -f 'ags/X/editor/ags_envelope_info_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_info_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_envelope_info_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_envelope_info_callbacks.lo `test -f 'ags/X/editor/ags_envelope_info_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_info_callbacks.c ags/X/editor/libgsequencer_la-ags_envelope_info.lo: ags/X/editor/ags_envelope_info.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_envelope_info.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Tpo -c -o ags/X/editor/libgsequencer_la-ags_envelope_info.lo `test -f 'ags/X/editor/ags_envelope_info.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_envelope_info.c' object='ags/X/editor/libgsequencer_la-ags_envelope_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_envelope_info.lo `test -f 'ags/X/editor/ags_envelope_info.c' || echo '$(srcdir)/'`ags/X/editor/ags_envelope_info.c ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo: ags/X/editor/ags_machine_radio_button.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Tpo -c -o ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo `test -f 'ags/X/editor/ags_machine_radio_button.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_radio_button.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_machine_radio_button.c' object='ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_machine_radio_button.lo `test -f 'ags/X/editor/ags_machine_radio_button.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_radio_button.c ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo: ags/X/editor/ags_machine_radio_button_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo `test -f 'ags/X/editor/ags_machine_radio_button_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_radio_button_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_machine_radio_button_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_machine_radio_button_callbacks.lo `test -f 'ags/X/editor/ags_machine_radio_button_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_radio_button_callbacks.c ags/X/editor/libgsequencer_la-ags_machine_selection.lo: ags/X/editor/ags_machine_selection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_machine_selection.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Tpo -c -o ags/X/editor/libgsequencer_la-ags_machine_selection.lo `test -f 'ags/X/editor/ags_machine_selection.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_selection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_machine_selection.c' object='ags/X/editor/libgsequencer_la-ags_machine_selection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_machine_selection.lo `test -f 'ags/X/editor/ags_machine_selection.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_selection.c ags/X/editor/libgsequencer_la-ags_machine_selector.lo: ags/X/editor/ags_machine_selector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_machine_selector.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Tpo -c -o ags/X/editor/libgsequencer_la-ags_machine_selector.lo `test -f 'ags/X/editor/ags_machine_selector.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_selector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_machine_selector.c' object='ags/X/editor/libgsequencer_la-ags_machine_selector.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_machine_selector.lo `test -f 'ags/X/editor/ags_machine_selector.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_selector.c ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo: ags/X/editor/ags_machine_selector_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo `test -f 'ags/X/editor/ags_machine_selector_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_selector_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_machine_selector_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_machine_selector_callbacks.lo `test -f 'ags/X/editor/ags_machine_selector_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_machine_selector_callbacks.c ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo: ags/X/editor/ags_move_note_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo `test -f 'ags/X/editor/ags_move_note_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_move_note_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_move_note_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_move_note_dialog_callbacks.lo `test -f 'ags/X/editor/ags_move_note_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_move_note_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo: ags/X/editor/ags_move_note_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo `test -f 'ags/X/editor/ags_move_note_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_move_note_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_move_note_dialog.c' object='ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_move_note_dialog.lo `test -f 'ags/X/editor/ags_move_note_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_move_note_dialog.c ags/X/editor/libgsequencer_la-ags_notation_edit.lo: ags/X/editor/ags_notation_edit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_notation_edit.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Tpo -c -o ags/X/editor/libgsequencer_la-ags_notation_edit.lo `test -f 'ags/X/editor/ags_notation_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_edit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_notation_edit.c' object='ags/X/editor/libgsequencer_la-ags_notation_edit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_notation_edit.lo `test -f 'ags/X/editor/ags_notation_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_edit.c ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo: ags/X/editor/ags_notation_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo `test -f 'ags/X/editor/ags_notation_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_notation_edit_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_notation_edit_callbacks.lo `test -f 'ags/X/editor/ags_notation_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_edit_callbacks.c ags/X/editor/libgsequencer_la-ags_notation_meta.lo: ags/X/editor/ags_notation_meta.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_notation_meta.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Tpo -c -o ags/X/editor/libgsequencer_la-ags_notation_meta.lo `test -f 'ags/X/editor/ags_notation_meta.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_meta.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_notation_meta.c' object='ags/X/editor/libgsequencer_la-ags_notation_meta.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_notation_meta.lo `test -f 'ags/X/editor/ags_notation_meta.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_meta.c ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo: ags/X/editor/ags_notation_meta_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo `test -f 'ags/X/editor/ags_notation_meta_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_meta_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_notation_meta_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_notation_meta_callbacks.lo `test -f 'ags/X/editor/ags_notation_meta_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_meta_callbacks.c ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo: ags/X/editor/ags_notation_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Tpo -c -o ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo `test -f 'ags/X/editor/ags_notation_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_notation_toolbar.c' object='ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_notation_toolbar.lo `test -f 'ags/X/editor/ags_notation_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_toolbar.c ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo: ags/X/editor/ags_notation_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_notation_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_notation_toolbar_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_notation_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_notation_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_notation_toolbar_callbacks.c ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo: ags/X/editor/ags_pattern_envelope_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo `test -f 'ags/X/editor/ags_pattern_envelope_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_pattern_envelope_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_pattern_envelope_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_pattern_envelope_callbacks.lo `test -f 'ags/X/editor/ags_pattern_envelope_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_pattern_envelope_callbacks.c ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo: ags/X/editor/ags_pattern_envelope.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Tpo -c -o ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo `test -f 'ags/X/editor/ags_pattern_envelope.c' || echo '$(srcdir)/'`ags/X/editor/ags_pattern_envelope.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_pattern_envelope.c' object='ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_pattern_envelope.lo `test -f 'ags/X/editor/ags_pattern_envelope.c' || echo '$(srcdir)/'`ags/X/editor/ags_pattern_envelope.c ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo: ags/X/editor/ags_position_automation_cursor_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo `test -f 'ags/X/editor/ags_position_automation_cursor_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_automation_cursor_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_position_automation_cursor_dialog.c' object='ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog.lo `test -f 'ags/X/editor/ags_position_automation_cursor_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_automation_cursor_dialog.c ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo: ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo `test -f 'ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.lo `test -f 'ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo: ags/X/editor/ags_position_notation_cursor_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo `test -f 'ags/X/editor/ags_position_notation_cursor_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_notation_cursor_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_position_notation_cursor_dialog.c' object='ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog.lo `test -f 'ags/X/editor/ags_position_notation_cursor_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_notation_cursor_dialog.c ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo: ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo `test -f 'ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.lo `test -f 'ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo: ags/X/editor/ags_position_wave_cursor_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo `test -f 'ags/X/editor/ags_position_wave_cursor_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_wave_cursor_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_position_wave_cursor_dialog.c' object='ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog.lo `test -f 'ags/X/editor/ags_position_wave_cursor_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_wave_cursor_dialog.c ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo: ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo `test -f 'ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.lo `test -f 'ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo: ags/X/editor/ags_ramp_acceleration_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo `test -f 'ags/X/editor/ags_ramp_acceleration_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_ramp_acceleration_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_ramp_acceleration_dialog.c' object='ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog.lo `test -f 'ags/X/editor/ags_ramp_acceleration_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_ramp_acceleration_dialog.c ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo: ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo `test -f 'ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.lo `test -f 'ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo: ags/X/editor/ags_scrolled_automation_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Tpo -c -o ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo `test -f 'ags/X/editor/ags_scrolled_automation_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_scrolled_automation_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_scrolled_automation_edit_box.c' object='ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_scrolled_automation_edit_box.lo `test -f 'ags/X/editor/ags_scrolled_automation_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_scrolled_automation_edit_box.c ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo: ags/X/editor/ags_scrolled_wave_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Tpo -c -o ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo `test -f 'ags/X/editor/ags_scrolled_wave_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_scrolled_wave_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_scrolled_wave_edit_box.c' object='ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_scrolled_wave_edit_box.lo `test -f 'ags/X/editor/ags_scrolled_wave_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_scrolled_wave_edit_box.c ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo: ags/X/editor/ags_select_acceleration_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo `test -f 'ags/X/editor/ags_select_acceleration_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_acceleration_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_select_acceleration_dialog.c' object='ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog.lo `test -f 'ags/X/editor/ags_select_acceleration_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_acceleration_dialog.c ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo: ags/X/editor/ags_select_acceleration_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo `test -f 'ags/X/editor/ags_select_acceleration_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_acceleration_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_select_acceleration_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_select_acceleration_dialog_callbacks.lo `test -f 'ags/X/editor/ags_select_acceleration_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_acceleration_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo: ags/X/editor/ags_select_buffer_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo `test -f 'ags/X/editor/ags_select_buffer_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_buffer_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_select_buffer_dialog.c' object='ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_select_buffer_dialog.lo `test -f 'ags/X/editor/ags_select_buffer_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_buffer_dialog.c ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo: ags/X/editor/ags_select_buffer_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo `test -f 'ags/X/editor/ags_select_buffer_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_buffer_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_select_buffer_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_select_buffer_dialog_callbacks.lo `test -f 'ags/X/editor/ags_select_buffer_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_buffer_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo: ags/X/editor/ags_select_note_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Tpo -c -o ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo `test -f 'ags/X/editor/ags_select_note_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_note_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_select_note_dialog.c' object='ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_select_note_dialog.lo `test -f 'ags/X/editor/ags_select_note_dialog.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_note_dialog.c ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo: ags/X/editor/ags_select_note_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo `test -f 'ags/X/editor/ags_select_note_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_note_dialog_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_select_note_dialog_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_select_note_dialog_callbacks.lo `test -f 'ags/X/editor/ags_select_note_dialog_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_select_note_dialog_callbacks.c ags/X/editor/libgsequencer_la-ags_sheet_edit.lo: ags/X/editor/ags_sheet_edit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_sheet_edit.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Tpo -c -o ags/X/editor/libgsequencer_la-ags_sheet_edit.lo `test -f 'ags/X/editor/ags_sheet_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_edit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_sheet_edit.c' object='ags/X/editor/libgsequencer_la-ags_sheet_edit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_sheet_edit.lo `test -f 'ags/X/editor/ags_sheet_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_edit.c ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo: ags/X/editor/ags_sheet_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo `test -f 'ags/X/editor/ags_sheet_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_sheet_edit_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_sheet_edit_callbacks.lo `test -f 'ags/X/editor/ags_sheet_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_edit_callbacks.c ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo: ags/X/editor/ags_sheet_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Tpo -c -o ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo `test -f 'ags/X/editor/ags_sheet_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_sheet_toolbar.c' object='ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_sheet_toolbar.lo `test -f 'ags/X/editor/ags_sheet_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_toolbar.c ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo: ags/X/editor/ags_sheet_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_sheet_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_sheet_toolbar_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_sheet_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_sheet_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_sheet_toolbar_callbacks.c ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo: ags/X/editor/ags_vautomation_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Tpo -c -o ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo `test -f 'ags/X/editor/ags_vautomation_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_vautomation_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_vautomation_edit_box.c' object='ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_vautomation_edit_box.lo `test -f 'ags/X/editor/ags_vautomation_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_vautomation_edit_box.c ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo: ags/X/editor/ags_vwave_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Tpo -c -o ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo `test -f 'ags/X/editor/ags_vwave_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_vwave_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_vwave_edit_box.c' object='ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_vwave_edit_box.lo `test -f 'ags/X/editor/ags_vwave_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_vwave_edit_box.c ags/X/editor/libgsequencer_la-ags_wave_edit.lo: ags/X/editor/ags_wave_edit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_edit.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_edit.lo `test -f 'ags/X/editor/ags_wave_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_edit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_edit.c' object='ags/X/editor/libgsequencer_la-ags_wave_edit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_edit.lo `test -f 'ags/X/editor/ags_wave_edit.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_edit.c ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo: ags/X/editor/ags_wave_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo `test -f 'ags/X/editor/ags_wave_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_edit_box.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_edit_box.c' object='ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_edit_box.lo `test -f 'ags/X/editor/ags_wave_edit_box.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_edit_box.c ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo: ags/X/editor/ags_wave_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo `test -f 'ags/X/editor/ags_wave_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_edit_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_edit_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_edit_callbacks.lo `test -f 'ags/X/editor/ags_wave_edit_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_edit_callbacks.c ags/X/editor/libgsequencer_la-ags_wave_meta.lo: ags/X/editor/ags_wave_meta.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_meta.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_meta.lo `test -f 'ags/X/editor/ags_wave_meta.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_meta.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_meta.c' object='ags/X/editor/libgsequencer_la-ags_wave_meta.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_meta.lo `test -f 'ags/X/editor/ags_wave_meta.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_meta.c ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo: ags/X/editor/ags_wave_meta_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo `test -f 'ags/X/editor/ags_wave_meta_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_meta_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_meta_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_meta_callbacks.lo `test -f 'ags/X/editor/ags_wave_meta_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_meta_callbacks.c ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo: ags/X/editor/ags_wave_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo `test -f 'ags/X/editor/ags_wave_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_toolbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_toolbar.c' object='ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_toolbar.lo `test -f 'ags/X/editor/ags_wave_toolbar.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_toolbar.c ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo: ags/X/editor/ags_wave_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo -MD -MP -MF ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Tpo -c -o ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_wave_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_toolbar_callbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Tpo ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/X/editor/ags_wave_toolbar_callbacks.c' object='ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/editor/libgsequencer_la-ags_wave_toolbar_callbacks.lo `test -f 'ags/X/editor/ags_wave_toolbar_callbacks.c' || echo '$(srcdir)/'`ags/X/editor/ags_wave_toolbar_callbacks.c ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo: ags/test/X/gsequencer_setup_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_test_la_CFLAGS) $(CFLAGS) -MT ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo -MD -MP -MF ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Tpo -c -o ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo `test -f 'ags/test/X/gsequencer_setup_util.c' || echo '$(srcdir)/'`ags/test/X/gsequencer_setup_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Tpo ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/gsequencer_setup_util.c' object='ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_test_la_CFLAGS) $(CFLAGS) -c -o ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo `test -f 'ags/test/X/gsequencer_setup_util.c' || echo '$(srcdir)/'`ags/test/X/gsequencer_setup_util.c ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo: ags/test/X/ags_functional_test_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_test_la_CFLAGS) $(CFLAGS) -MT ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo -MD -MP -MF ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Tpo -c -o ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo `test -f 'ags/test/X/ags_functional_test_util.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_test_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Tpo ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_test_util.c' object='ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_test_la_CFLAGS) $(CFLAGS) -c -o ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo `test -f 'ags/test/X/ags_functional_test_util.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_test_util.c ags/test/audio/acceleration_test-ags_acceleration_test.o: ags/test/audio/ags_acceleration_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_acceleration_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/acceleration_test-ags_acceleration_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Tpo -c -o ags/test/audio/acceleration_test-ags_acceleration_test.o `test -f 'ags/test/audio/ags_acceleration_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_acceleration_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Tpo ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_acceleration_test.c' object='ags/test/audio/acceleration_test-ags_acceleration_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_acceleration_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/acceleration_test-ags_acceleration_test.o `test -f 'ags/test/audio/ags_acceleration_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_acceleration_test.c ags/test/audio/acceleration_test-ags_acceleration_test.obj: ags/test/audio/ags_acceleration_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_acceleration_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/acceleration_test-ags_acceleration_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Tpo -c -o ags/test/audio/acceleration_test-ags_acceleration_test.obj `if test -f 'ags/test/audio/ags_acceleration_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_acceleration_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_acceleration_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Tpo ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_acceleration_test.c' object='ags/test/audio/acceleration_test-ags_acceleration_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_acceleration_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/acceleration_test-ags_acceleration_test.obj `if test -f 'ags/test/audio/ags_acceleration_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_acceleration_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_acceleration_test.c'; fi` ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.o: ags/test/audio/task/ags_add_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Tpo -c -o ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.o `test -f 'ags/test/audio/task/ags_add_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Tpo ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_audio_signal_test.c' object='ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.o `test -f 'ags/test/audio/task/ags_add_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_audio_signal_test.c ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.obj: ags/test/audio/task/ags_add_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Tpo -c -o ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_add_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Tpo ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_audio_signal_test.c' object='ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_audio_signal_test-ags_add_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_add_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_audio_signal_test.c'; fi` ags/test/audio/task/add_audio_test-ags_add_audio_test.o: ags/test/audio/task/ags_add_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_audio_test-ags_add_audio_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Tpo -c -o ags/test/audio/task/add_audio_test-ags_add_audio_test.o `test -f 'ags/test/audio/task/ags_add_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_audio_test.c' object='ags/test/audio/task/add_audio_test-ags_add_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_audio_test-ags_add_audio_test.o `test -f 'ags/test/audio/task/ags_add_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_audio_test.c ags/test/audio/task/add_audio_test-ags_add_audio_test.obj: ags/test/audio/task/ags_add_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_audio_test-ags_add_audio_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Tpo -c -o ags/test/audio/task/add_audio_test-ags_add_audio_test.obj `if test -f 'ags/test/audio/task/ags_add_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_audio_test.c' object='ags/test/audio/task/add_audio_test-ags_add_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_audio_test-ags_add_audio_test.obj `if test -f 'ags/test/audio/task/ags_add_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_audio_test.c'; fi` ags/test/audio/task/add_effect_test-ags_add_effect_test.o: ags/test/audio/task/ags_add_effect_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_effect_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_effect_test-ags_add_effect_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Tpo -c -o ags/test/audio/task/add_effect_test-ags_add_effect_test.o `test -f 'ags/test/audio/task/ags_add_effect_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_effect_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Tpo ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_effect_test.c' object='ags/test/audio/task/add_effect_test-ags_add_effect_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_effect_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_effect_test-ags_add_effect_test.o `test -f 'ags/test/audio/task/ags_add_effect_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_effect_test.c ags/test/audio/task/add_effect_test-ags_add_effect_test.obj: ags/test/audio/task/ags_add_effect_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_effect_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_effect_test-ags_add_effect_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Tpo -c -o ags/test/audio/task/add_effect_test-ags_add_effect_test.obj `if test -f 'ags/test/audio/task/ags_add_effect_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_effect_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_effect_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Tpo ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_effect_test.c' object='ags/test/audio/task/add_effect_test-ags_add_effect_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_effect_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_effect_test-ags_add_effect_test.obj `if test -f 'ags/test/audio/task/ags_add_effect_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_effect_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_effect_test.c'; fi` ags/test/audio/task/add_note_test-ags_add_note_test.o: ags/test/audio/task/ags_add_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_note_test-ags_add_note_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Tpo -c -o ags/test/audio/task/add_note_test-ags_add_note_test.o `test -f 'ags/test/audio/task/ags_add_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_note_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Tpo ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_note_test.c' object='ags/test/audio/task/add_note_test-ags_add_note_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_note_test-ags_add_note_test.o `test -f 'ags/test/audio/task/ags_add_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_note_test.c ags/test/audio/task/add_note_test-ags_add_note_test.obj: ags/test/audio/task/ags_add_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_note_test-ags_add_note_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Tpo -c -o ags/test/audio/task/add_note_test-ags_add_note_test.obj `if test -f 'ags/test/audio/task/ags_add_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_note_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Tpo ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_note_test.c' object='ags/test/audio/task/add_note_test-ags_add_note_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_note_test-ags_add_note_test.obj `if test -f 'ags/test/audio/task/ags_add_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_note_test.c'; fi` ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.o: ags/test/audio/task/ags_add_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Tpo -c -o ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.o `test -f 'ags/test/audio/task/ags_add_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Tpo ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_soundcard_test.c' object='ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.o `test -f 'ags/test/audio/task/ags_add_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_add_soundcard_test.c ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.obj: ags/test/audio/task/ags_add_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Tpo -c -o ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_add_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_soundcard_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Tpo ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_add_soundcard_test.c' object='ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_add_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/add_soundcard_test-ags_add_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_add_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_add_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_add_soundcard_test.c'; fi` ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.o: ags/test/audio/recall/ags_analyse_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Tpo -c -o ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_analyse_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_analyse_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_analyse_audio_signal_test.c' object='ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_analyse_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_analyse_audio_signal_test.c ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.obj: ags/test/audio/recall/ags_analyse_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Tpo -c -o ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_analyse_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_analyse_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_analyse_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_analyse_audio_signal_test.c' object='ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/analyse_audio_signal_test-ags_analyse_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_analyse_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_analyse_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_analyse_audio_signal_test.c'; fi` ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.o: ags/test/audio/recall/ags_analyse_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Tpo -c -o ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.o `test -f 'ags/test/audio/recall/ags_analyse_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_analyse_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_analyse_channel_test.c' object='ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.o `test -f 'ags/test/audio/recall/ags_analyse_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_analyse_channel_test.c ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.obj: ags/test/audio/recall/ags_analyse_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Tpo -c -o ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.obj `if test -f 'ags/test/audio/recall/ags_analyse_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_analyse_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_analyse_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_analyse_channel_test.c' object='ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_analyse_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/analyse_channel_test-ags_analyse_channel_test.obj `if test -f 'ags/test/audio/recall/ags_analyse_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_analyse_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_analyse_channel_test.c'; fi` ags/test/object/application_context_test-ags_application_context_test.o: ags/test/object/ags_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/object/application_context_test-ags_application_context_test.o -MD -MP -MF ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Tpo -c -o ags/test/object/application_context_test-ags_application_context_test.o `test -f 'ags/test/object/ags_application_context_test.c' || echo '$(srcdir)/'`ags/test/object/ags_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Tpo ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_application_context_test.c' object='ags/test/object/application_context_test-ags_application_context_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/application_context_test-ags_application_context_test.o `test -f 'ags/test/object/ags_application_context_test.c' || echo '$(srcdir)/'`ags/test/object/ags_application_context_test.c ags/test/object/application_context_test-ags_application_context_test.obj: ags/test/object/ags_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/object/application_context_test-ags_application_context_test.obj -MD -MP -MF ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Tpo -c -o ags/test/object/application_context_test-ags_application_context_test.obj `if test -f 'ags/test/object/ags_application_context_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_application_context_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Tpo ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_application_context_test.c' object='ags/test/object/application_context_test-ags_application_context_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/application_context_test-ags_application_context_test.obj `if test -f 'ags/test/object/ags_application_context_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_application_context_test.c'; fi` ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.o: ags/test/audio/task/ags_apply_bpm_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_bpm_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Tpo -c -o ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.o `test -f 'ags/test/audio/task/ags_apply_bpm_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_bpm_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_bpm_test.c' object='ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_bpm_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.o `test -f 'ags/test/audio/task/ags_apply_bpm_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_bpm_test.c ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.obj: ags/test/audio/task/ags_apply_bpm_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_bpm_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Tpo -c -o ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.obj `if test -f 'ags/test/audio/task/ags_apply_bpm_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_bpm_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_bpm_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_bpm_test.c' object='ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_bpm_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_bpm_test-ags_apply_bpm_test.obj `if test -f 'ags/test/audio/task/ags_apply_bpm_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_bpm_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_bpm_test.c'; fi` ags/test/audio/task/apply_presets_test-ags_apply_presets_test.o: ags/test/audio/task/ags_apply_presets_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_presets_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_presets_test-ags_apply_presets_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Tpo -c -o ags/test/audio/task/apply_presets_test-ags_apply_presets_test.o `test -f 'ags/test/audio/task/ags_apply_presets_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_presets_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_presets_test.c' object='ags/test/audio/task/apply_presets_test-ags_apply_presets_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_presets_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_presets_test-ags_apply_presets_test.o `test -f 'ags/test/audio/task/ags_apply_presets_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_presets_test.c ags/test/audio/task/apply_presets_test-ags_apply_presets_test.obj: ags/test/audio/task/ags_apply_presets_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_presets_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_presets_test-ags_apply_presets_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Tpo -c -o ags/test/audio/task/apply_presets_test-ags_apply_presets_test.obj `if test -f 'ags/test/audio/task/ags_apply_presets_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_presets_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_presets_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_presets_test.c' object='ags/test/audio/task/apply_presets_test-ags_apply_presets_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_presets_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_presets_test-ags_apply_presets_test.obj `if test -f 'ags/test/audio/task/ags_apply_presets_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_presets_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_presets_test.c'; fi` ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.o: ags/test/audio/task/ags_apply_sequencer_length_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_sequencer_length_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Tpo -c -o ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.o `test -f 'ags/test/audio/task/ags_apply_sequencer_length_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_sequencer_length_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_sequencer_length_test.c' object='ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_sequencer_length_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.o `test -f 'ags/test/audio/task/ags_apply_sequencer_length_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_sequencer_length_test.c ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.obj: ags/test/audio/task/ags_apply_sequencer_length_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_sequencer_length_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Tpo -c -o ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.obj `if test -f 'ags/test/audio/task/ags_apply_sequencer_length_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_sequencer_length_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_sequencer_length_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_sequencer_length_test.c' object='ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_sequencer_length_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_sequencer_length_test-ags_apply_sequencer_length_test.obj `if test -f 'ags/test/audio/task/ags_apply_sequencer_length_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_sequencer_length_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_sequencer_length_test.c'; fi` ags/test/audio/task/apply_synth_test-ags_apply_synth_test.o: ags/test/audio/task/ags_apply_synth_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_synth_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_synth_test-ags_apply_synth_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Tpo -c -o ags/test/audio/task/apply_synth_test-ags_apply_synth_test.o `test -f 'ags/test/audio/task/ags_apply_synth_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_synth_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_synth_test.c' object='ags/test/audio/task/apply_synth_test-ags_apply_synth_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_synth_test-ags_apply_synth_test.o `test -f 'ags/test/audio/task/ags_apply_synth_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_synth_test.c ags/test/audio/task/apply_synth_test-ags_apply_synth_test.obj: ags/test/audio/task/ags_apply_synth_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_synth_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_synth_test-ags_apply_synth_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Tpo -c -o ags/test/audio/task/apply_synth_test-ags_apply_synth_test.obj `if test -f 'ags/test/audio/task/ags_apply_synth_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_synth_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_synth_test.c' object='ags/test/audio/task/apply_synth_test-ags_apply_synth_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_synth_test-ags_apply_synth_test.obj `if test -f 'ags/test/audio/task/ags_apply_synth_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_synth_test.c'; fi` ags/test/audio/task/apply_tact_test-ags_apply_tact_test.o: ags/test/audio/task/ags_apply_tact_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_tact_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_tact_test-ags_apply_tact_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Tpo -c -o ags/test/audio/task/apply_tact_test-ags_apply_tact_test.o `test -f 'ags/test/audio/task/ags_apply_tact_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_tact_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_tact_test.c' object='ags/test/audio/task/apply_tact_test-ags_apply_tact_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_tact_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_tact_test-ags_apply_tact_test.o `test -f 'ags/test/audio/task/ags_apply_tact_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_apply_tact_test.c ags/test/audio/task/apply_tact_test-ags_apply_tact_test.obj: ags/test/audio/task/ags_apply_tact_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_tact_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/apply_tact_test-ags_apply_tact_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Tpo -c -o ags/test/audio/task/apply_tact_test-ags_apply_tact_test.obj `if test -f 'ags/test/audio/task/ags_apply_tact_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_tact_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_tact_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Tpo ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_apply_tact_test.c' object='ags/test/audio/task/apply_tact_test-ags_apply_tact_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_apply_tact_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/apply_tact_test-ags_apply_tact_test.obj `if test -f 'ags/test/audio/task/ags_apply_tact_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_apply_tact_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_apply_tact_test.c'; fi` ags/test/audio/audio_application_context_test-ags_audio_application_context_test.o: ags/test/audio/ags_audio_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_application_context_test-ags_audio_application_context_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Tpo -c -o ags/test/audio/audio_application_context_test-ags_audio_application_context_test.o `test -f 'ags/test/audio/ags_audio_application_context_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Tpo ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_application_context_test.c' object='ags/test/audio/audio_application_context_test-ags_audio_application_context_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_application_context_test-ags_audio_application_context_test.o `test -f 'ags/test/audio/ags_audio_application_context_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_application_context_test.c ags/test/audio/audio_application_context_test-ags_audio_application_context_test.obj: ags/test/audio/ags_audio_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_application_context_test-ags_audio_application_context_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Tpo -c -o ags/test/audio/audio_application_context_test-ags_audio_application_context_test.obj `if test -f 'ags/test/audio/ags_audio_application_context_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_application_context_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Tpo ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_application_context_test.c' object='ags/test/audio/audio_application_context_test-ags_audio_application_context_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_application_context_test-ags_audio_application_context_test.obj `if test -f 'ags/test/audio/ags_audio_application_context_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_application_context_test.c'; fi` ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.o: ags/test/audio/ags_audio_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Tpo -c -o ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.o `test -f 'ags/test/audio/ags_audio_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Tpo ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_buffer_util_test.c' object='ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.o `test -f 'ags/test/audio/ags_audio_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_buffer_util_test.c ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.obj: ags/test/audio/ags_audio_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Tpo -c -o ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.obj `if test -f 'ags/test/audio/ags_audio_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_buffer_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Tpo ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_buffer_util_test.c' object='ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_buffer_util_test-ags_audio_buffer_util_test.obj `if test -f 'ags/test/audio/ags_audio_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_buffer_util_test.c'; fi` ags/test/audio/audio_signal_test-ags_audio_signal_test.o: ags/test/audio/ags_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_signal_test-ags_audio_signal_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Tpo -c -o ags/test/audio/audio_signal_test-ags_audio_signal_test.o `test -f 'ags/test/audio/ags_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Tpo ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_signal_test.c' object='ags/test/audio/audio_signal_test-ags_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_signal_test-ags_audio_signal_test.o `test -f 'ags/test/audio/ags_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_signal_test.c ags/test/audio/audio_signal_test-ags_audio_signal_test.obj: ags/test/audio/ags_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_signal_test-ags_audio_signal_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Tpo -c -o ags/test/audio/audio_signal_test-ags_audio_signal_test.obj `if test -f 'ags/test/audio/ags_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Tpo ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_signal_test.c' object='ags/test/audio/audio_signal_test-ags_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_signal_test-ags_audio_signal_test.obj `if test -f 'ags/test/audio/ags_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_signal_test.c'; fi` ags/test/audio/audio_test-ags_audio_test.o: ags/test/audio/ags_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_test-ags_audio_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Tpo -c -o ags/test/audio/audio_test-ags_audio_test.o `test -f 'ags/test/audio/ags_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Tpo ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_test.c' object='ags/test/audio/audio_test-ags_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_test-ags_audio_test.o `test -f 'ags/test/audio/ags_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_audio_test.c ags/test/audio/audio_test-ags_audio_test.obj: ags/test/audio/ags_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/audio_test-ags_audio_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Tpo -c -o ags/test/audio/audio_test-ags_audio_test.obj `if test -f 'ags/test/audio/ags_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Tpo ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_audio_test.c' object='ags/test/audio/audio_test-ags_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/audio_test-ags_audio_test.obj `if test -f 'ags/test/audio/ags_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_audio_test.c'; fi` ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.o: ags/test/server/security/ags_authentication_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_authentication_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Tpo -c -o ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.o `test -f 'ags/test/server/security/ags_authentication_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_authentication_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Tpo ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_authentication_manager_test.c' object='ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_authentication_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.o `test -f 'ags/test/server/security/ags_authentication_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_authentication_manager_test.c ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.obj: ags/test/server/security/ags_authentication_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_authentication_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Tpo -c -o ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.obj `if test -f 'ags/test/server/security/ags_authentication_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_authentication_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_authentication_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Tpo ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_authentication_manager_test.c' object='ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_authentication_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/authentication_manager_test-ags_authentication_manager_test.obj `if test -f 'ags/test/server/security/ags_authentication_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_authentication_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_authentication_manager_test.c'; fi` ags/test/audio/automation_test-ags_automation_test.o: ags/test/audio/ags_automation_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_automation_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/automation_test-ags_automation_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Tpo -c -o ags/test/audio/automation_test-ags_automation_test.o `test -f 'ags/test/audio/ags_automation_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_automation_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Tpo ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_automation_test.c' object='ags/test/audio/automation_test-ags_automation_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_automation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/automation_test-ags_automation_test.o `test -f 'ags/test/audio/ags_automation_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_automation_test.c ags/test/audio/automation_test-ags_automation_test.obj: ags/test/audio/ags_automation_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_automation_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/automation_test-ags_automation_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Tpo -c -o ags/test/audio/automation_test-ags_automation_test.obj `if test -f 'ags/test/audio/ags_automation_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_automation_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_automation_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Tpo ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_automation_test.c' object='ags/test/audio/automation_test-ags_automation_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_automation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/automation_test-ags_automation_test.obj `if test -f 'ags/test/audio/ags_automation_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_automation_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_automation_test.c'; fi` ags/test/plugin/base_plugin_test-ags_base_plugin_test.o: ags/test/plugin/ags_base_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_base_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/base_plugin_test-ags_base_plugin_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Tpo -c -o ags/test/plugin/base_plugin_test-ags_base_plugin_test.o `test -f 'ags/test/plugin/ags_base_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_base_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_base_plugin_test.c' object='ags/test/plugin/base_plugin_test-ags_base_plugin_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_base_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/base_plugin_test-ags_base_plugin_test.o `test -f 'ags/test/plugin/ags_base_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_base_plugin_test.c ags/test/plugin/base_plugin_test-ags_base_plugin_test.obj: ags/test/plugin/ags_base_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_base_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/base_plugin_test-ags_base_plugin_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Tpo -c -o ags/test/plugin/base_plugin_test-ags_base_plugin_test.obj `if test -f 'ags/test/plugin/ags_base_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_base_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_base_plugin_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_base_plugin_test.c' object='ags/test/plugin/base_plugin_test-ags_base_plugin_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_base_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/base_plugin_test-ags_base_plugin_test.obj `if test -f 'ags/test/plugin/ags_base_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_base_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_base_plugin_test.c'; fi` ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.o: ags/test/audio/recall/ags_buffer_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Tpo -c -o ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_buffer_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_buffer_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_buffer_audio_signal_test.c' object='ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_buffer_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_buffer_audio_signal_test.c ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.obj: ags/test/audio/recall/ags_buffer_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Tpo -c -o ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_buffer_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_buffer_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_buffer_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_buffer_audio_signal_test.c' object='ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/buffer_audio_signal_test-ags_buffer_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_buffer_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_buffer_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_buffer_audio_signal_test.c'; fi` ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.o: ags/test/audio/recall/ags_buffer_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Tpo -c -o ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.o `test -f 'ags/test/audio/recall/ags_buffer_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_buffer_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_buffer_channel_test.c' object='ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.o `test -f 'ags/test/audio/recall/ags_buffer_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_buffer_channel_test.c ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.obj: ags/test/audio/recall/ags_buffer_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Tpo -c -o ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.obj `if test -f 'ags/test/audio/recall/ags_buffer_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_buffer_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_buffer_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_buffer_channel_test.c' object='ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/buffer_channel_test-ags_buffer_channel_test.obj `if test -f 'ags/test/audio/recall/ags_buffer_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_buffer_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_buffer_channel_test.c'; fi` ags/test/audio/buffer_test-ags_buffer_test.o: ags/test/audio/ags_buffer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/buffer_test-ags_buffer_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Tpo -c -o ags/test/audio/buffer_test-ags_buffer_test.o `test -f 'ags/test/audio/ags_buffer_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_buffer_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Tpo ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_buffer_test.c' object='ags/test/audio/buffer_test-ags_buffer_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/buffer_test-ags_buffer_test.o `test -f 'ags/test/audio/ags_buffer_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_buffer_test.c ags/test/audio/buffer_test-ags_buffer_test.obj: ags/test/audio/ags_buffer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/buffer_test-ags_buffer_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Tpo -c -o ags/test/audio/buffer_test-ags_buffer_test.obj `if test -f 'ags/test/audio/ags_buffer_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_buffer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_buffer_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Tpo ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_buffer_test.c' object='ags/test/audio/buffer_test-ags_buffer_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/buffer_test-ags_buffer_test.obj `if test -f 'ags/test/audio/ags_buffer_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_buffer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_buffer_test.c'; fi` ags/test/lib/buffer_util_test-ags_buffer_util_test.o: ags/test/lib/ags_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/buffer_util_test-ags_buffer_util_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Tpo -c -o ags/test/lib/buffer_util_test-ags_buffer_util_test.o `test -f 'ags/test/lib/ags_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Tpo ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_buffer_util_test.c' object='ags/test/lib/buffer_util_test-ags_buffer_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/buffer_util_test-ags_buffer_util_test.o `test -f 'ags/test/lib/ags_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_buffer_util_test.c ags/test/lib/buffer_util_test-ags_buffer_util_test.obj: ags/test/lib/ags_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/buffer_util_test-ags_buffer_util_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Tpo -c -o ags/test/lib/buffer_util_test-ags_buffer_util_test.obj `if test -f 'ags/test/lib/ags_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_buffer_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Tpo ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_buffer_util_test.c' object='ags/test/lib/buffer_util_test-ags_buffer_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/buffer_util_test-ags_buffer_util_test.obj `if test -f 'ags/test/lib/ags_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_buffer_util_test.c'; fi` ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.o: ags/test/server/security/ags_business_group_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_business_group_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Tpo -c -o ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.o `test -f 'ags/test/server/security/ags_business_group_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_business_group_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Tpo ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_business_group_manager_test.c' object='ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_business_group_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.o `test -f 'ags/test/server/security/ags_business_group_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_business_group_manager_test.c ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.obj: ags/test/server/security/ags_business_group_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_business_group_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Tpo -c -o ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.obj `if test -f 'ags/test/server/security/ags_business_group_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_business_group_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_business_group_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Tpo ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_business_group_manager_test.c' object='ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_business_group_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/business_group_manager_test-ags_business_group_manager_test.obj `if test -f 'ags/test/server/security/ags_business_group_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_business_group_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_business_group_manager_test.c'; fi` ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.o: ags/test/audio/task/ags_cancel_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Tpo -c -o ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.o `test -f 'ags/test/audio/task/ags_cancel_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_cancel_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_cancel_audio_test.c' object='ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.o `test -f 'ags/test/audio/task/ags_cancel_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_cancel_audio_test.c ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.obj: ags/test/audio/task/ags_cancel_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Tpo -c -o ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.obj `if test -f 'ags/test/audio/task/ags_cancel_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_cancel_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_cancel_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_cancel_audio_test.c' object='ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/cancel_audio_test-ags_cancel_audio_test.obj `if test -f 'ags/test/audio/task/ags_cancel_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_cancel_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_cancel_audio_test.c'; fi` ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.o: ags/test/audio/task/ags_cancel_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Tpo -c -o ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.o `test -f 'ags/test/audio/task/ags_cancel_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_cancel_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Tpo ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_cancel_channel_test.c' object='ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.o `test -f 'ags/test/audio/task/ags_cancel_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_cancel_channel_test.c ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.obj: ags/test/audio/task/ags_cancel_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Tpo -c -o ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.obj `if test -f 'ags/test/audio/task/ags_cancel_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_cancel_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_cancel_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Tpo ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_cancel_channel_test.c' object='ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_cancel_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/cancel_channel_test-ags_cancel_channel_test.obj `if test -f 'ags/test/audio/task/ags_cancel_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_cancel_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_cancel_channel_test.c'; fi` ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.o: ags/test/audio/recall/ags_capture_wave_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Tpo -c -o ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.o `test -f 'ags/test/audio/recall/ags_capture_wave_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_capture_wave_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_capture_wave_audio_test.c' object='ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.o `test -f 'ags/test/audio/recall/ags_capture_wave_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_capture_wave_audio_test.c ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.obj: ags/test/audio/recall/ags_capture_wave_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Tpo -c -o ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.obj `if test -f 'ags/test/audio/recall/ags_capture_wave_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_capture_wave_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_capture_wave_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_capture_wave_audio_test.c' object='ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/capture_wave_audio_test-ags_capture_wave_audio_test.obj `if test -f 'ags/test/audio/recall/ags_capture_wave_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_capture_wave_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_capture_wave_audio_test.c'; fi` ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.o: ags/test/audio/recall/ags_capture_wave_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Tpo -c -o ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.o `test -f 'ags/test/audio/recall/ags_capture_wave_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_capture_wave_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_capture_wave_channel_test.c' object='ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.o `test -f 'ags/test/audio/recall/ags_capture_wave_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_capture_wave_channel_test.c ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.obj: ags/test/audio/recall/ags_capture_wave_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Tpo -c -o ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.obj `if test -f 'ags/test/audio/recall/ags_capture_wave_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_capture_wave_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_capture_wave_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_capture_wave_channel_test.c' object='ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_capture_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/capture_wave_channel_test-ags_capture_wave_channel_test.obj `if test -f 'ags/test/audio/recall/ags_capture_wave_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_capture_wave_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_capture_wave_channel_test.c'; fi` ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.o: ags/test/server/security/ags_certificate_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_certificate_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Tpo -c -o ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.o `test -f 'ags/test/server/security/ags_certificate_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_certificate_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Tpo ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_certificate_manager_test.c' object='ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_certificate_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.o `test -f 'ags/test/server/security/ags_certificate_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_certificate_manager_test.c ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.obj: ags/test/server/security/ags_certificate_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_certificate_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Tpo -c -o ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.obj `if test -f 'ags/test/server/security/ags_certificate_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_certificate_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_certificate_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Tpo ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_certificate_manager_test.c' object='ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_certificate_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/certificate_manager_test-ags_certificate_manager_test.obj `if test -f 'ags/test/server/security/ags_certificate_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_certificate_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_certificate_manager_test.c'; fi` ags/test/audio/channel_test-ags_channel_test.o: ags/test/audio/ags_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/channel_test-ags_channel_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Tpo -c -o ags/test/audio/channel_test-ags_channel_test.o `test -f 'ags/test/audio/ags_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Tpo ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_channel_test.c' object='ags/test/audio/channel_test-ags_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/channel_test-ags_channel_test.o `test -f 'ags/test/audio/ags_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_channel_test.c ags/test/audio/channel_test-ags_channel_test.obj: ags/test/audio/ags_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/channel_test-ags_channel_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Tpo -c -o ags/test/audio/channel_test-ags_channel_test.obj `if test -f 'ags/test/audio/ags_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Tpo ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_channel_test.c' object='ags/test/audio/channel_test-ags_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/channel_test-ags_channel_test.obj `if test -f 'ags/test/audio/ags_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_channel_test.c'; fi` ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.o: ags/test/audio/ags_char_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_char_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Tpo -c -o ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.o `test -f 'ags/test/audio/ags_char_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_char_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Tpo ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_char_buffer_util_test.c' object='ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_char_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.o `test -f 'ags/test/audio/ags_char_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_char_buffer_util_test.c ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.obj: ags/test/audio/ags_char_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_char_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Tpo -c -o ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.obj `if test -f 'ags/test/audio/ags_char_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_char_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_char_buffer_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Tpo ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_char_buffer_util_test.c' object='ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_char_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/char_buffer_util_test-ags_char_buffer_util_test.obj `if test -f 'ags/test/audio/ags_char_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_char_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_char_buffer_util_test.c'; fi` ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.o: ags/test/audio/task/ags_clear_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Tpo -c -o ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.o `test -f 'ags/test/audio/task/ags_clear_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_clear_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Tpo ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_clear_audio_signal_test.c' object='ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.o `test -f 'ags/test/audio/task/ags_clear_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_clear_audio_signal_test.c ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.obj: ags/test/audio/task/ags_clear_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Tpo -c -o ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_clear_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_clear_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_clear_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Tpo ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_clear_audio_signal_test.c' object='ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/clear_audio_signal_test-ags_clear_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_clear_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_clear_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_clear_audio_signal_test.c'; fi` ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.o: ags/test/audio/task/ags_clear_buffer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_buffer_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Tpo -c -o ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.o `test -f 'ags/test/audio/task/ags_clear_buffer_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_clear_buffer_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Tpo ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_clear_buffer_test.c' object='ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.o `test -f 'ags/test/audio/task/ags_clear_buffer_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_clear_buffer_test.c ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.obj: ags/test/audio/task/ags_clear_buffer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_buffer_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Tpo -c -o ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.obj `if test -f 'ags/test/audio/task/ags_clear_buffer_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_clear_buffer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_clear_buffer_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Tpo ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_clear_buffer_test.c' object='ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_clear_buffer_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/clear_buffer_test-ags_clear_buffer_test.obj `if test -f 'ags/test/audio/task/ags_clear_buffer_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_clear_buffer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_clear_buffer_test.c'; fi` ags/test/lib/complex_test-ags_complex_test.o: ags/test/lib/ags_complex_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_complex_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/complex_test-ags_complex_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Tpo -c -o ags/test/lib/complex_test-ags_complex_test.o `test -f 'ags/test/lib/ags_complex_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_complex_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Tpo ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_complex_test.c' object='ags/test/lib/complex_test-ags_complex_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_complex_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/complex_test-ags_complex_test.o `test -f 'ags/test/lib/ags_complex_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_complex_test.c ags/test/lib/complex_test-ags_complex_test.obj: ags/test/lib/ags_complex_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_complex_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/complex_test-ags_complex_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Tpo -c -o ags/test/lib/complex_test-ags_complex_test.obj `if test -f 'ags/test/lib/ags_complex_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_complex_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_complex_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Tpo ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_complex_test.c' object='ags/test/lib/complex_test-ags_complex_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_complex_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/complex_test-ags_complex_test.obj `if test -f 'ags/test/lib/ags_complex_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_complex_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_complex_test.c'; fi` ags/test/object/config_test-ags_config_test.o: ags/test/object/ags_config_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_config_test_CFLAGS) $(CFLAGS) -MT ags/test/object/config_test-ags_config_test.o -MD -MP -MF ags/test/object/$(DEPDIR)/config_test-ags_config_test.Tpo -c -o ags/test/object/config_test-ags_config_test.o `test -f 'ags/test/object/ags_config_test.c' || echo '$(srcdir)/'`ags/test/object/ags_config_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/config_test-ags_config_test.Tpo ags/test/object/$(DEPDIR)/config_test-ags_config_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_config_test.c' object='ags/test/object/config_test-ags_config_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/config_test-ags_config_test.o `test -f 'ags/test/object/ags_config_test.c' || echo '$(srcdir)/'`ags/test/object/ags_config_test.c ags/test/object/config_test-ags_config_test.obj: ags/test/object/ags_config_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_config_test_CFLAGS) $(CFLAGS) -MT ags/test/object/config_test-ags_config_test.obj -MD -MP -MF ags/test/object/$(DEPDIR)/config_test-ags_config_test.Tpo -c -o ags/test/object/config_test-ags_config_test.obj `if test -f 'ags/test/object/ags_config_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_config_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_config_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/config_test-ags_config_test.Tpo ags/test/object/$(DEPDIR)/config_test-ags_config_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_config_test.c' object='ags/test/object/config_test-ags_config_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/config_test-ags_config_test.obj `if test -f 'ags/test/object/ags_config_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_config_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_config_test.c'; fi` ags/test/object/connectable_test-ags_connectable_test.o: ags/test/object/ags_connectable_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_connectable_test_CFLAGS) $(CFLAGS) -MT ags/test/object/connectable_test-ags_connectable_test.o -MD -MP -MF ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Tpo -c -o ags/test/object/connectable_test-ags_connectable_test.o `test -f 'ags/test/object/ags_connectable_test.c' || echo '$(srcdir)/'`ags/test/object/ags_connectable_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Tpo ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_connectable_test.c' object='ags/test/object/connectable_test-ags_connectable_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_connectable_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/connectable_test-ags_connectable_test.o `test -f 'ags/test/object/ags_connectable_test.c' || echo '$(srcdir)/'`ags/test/object/ags_connectable_test.c ags/test/object/connectable_test-ags_connectable_test.obj: ags/test/object/ags_connectable_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_connectable_test_CFLAGS) $(CFLAGS) -MT ags/test/object/connectable_test-ags_connectable_test.obj -MD -MP -MF ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Tpo -c -o ags/test/object/connectable_test-ags_connectable_test.obj `if test -f 'ags/test/object/ags_connectable_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_connectable_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_connectable_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Tpo ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_connectable_test.c' object='ags/test/object/connectable_test-ags_connectable_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_connectable_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/connectable_test-ags_connectable_test.obj `if test -f 'ags/test/object/ags_connectable_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_connectable_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_connectable_test.c'; fi` ags/test/server/controller/controller_test-ags_controller_test.o: ags/test/server/controller/ags_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/server/controller/controller_test-ags_controller_test.o -MD -MP -MF ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Tpo -c -o ags/test/server/controller/controller_test-ags_controller_test.o `test -f 'ags/test/server/controller/ags_controller_test.c' || echo '$(srcdir)/'`ags/test/server/controller/ags_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Tpo ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/controller/ags_controller_test.c' object='ags/test/server/controller/controller_test-ags_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/controller_test-ags_controller_test.o `test -f 'ags/test/server/controller/ags_controller_test.c' || echo '$(srcdir)/'`ags/test/server/controller/ags_controller_test.c ags/test/server/controller/controller_test-ags_controller_test.obj: ags/test/server/controller/ags_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/server/controller/controller_test-ags_controller_test.obj -MD -MP -MF ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Tpo -c -o ags/test/server/controller/controller_test-ags_controller_test.obj `if test -f 'ags/test/server/controller/ags_controller_test.c'; then $(CYGPATH_W) 'ags/test/server/controller/ags_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/controller/ags_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Tpo ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/controller/ags_controller_test.c' object='ags/test/server/controller/controller_test-ags_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/controller_test-ags_controller_test.obj `if test -f 'ags/test/server/controller/ags_controller_test.c'; then $(CYGPATH_W) 'ags/test/server/controller/ags_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/controller/ags_controller_test.c'; fi` ags/test/lib/conversion_test-ags_conversion_test.o: ags/test/lib/ags_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_conversion_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/conversion_test-ags_conversion_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Tpo -c -o ags/test/lib/conversion_test-ags_conversion_test.o `test -f 'ags/test/lib/ags_conversion_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Tpo ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_conversion_test.c' object='ags/test/lib/conversion_test-ags_conversion_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/conversion_test-ags_conversion_test.o `test -f 'ags/test/lib/ags_conversion_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_conversion_test.c ags/test/lib/conversion_test-ags_conversion_test.obj: ags/test/lib/ags_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_conversion_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/conversion_test-ags_conversion_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Tpo -c -o ags/test/lib/conversion_test-ags_conversion_test.obj `if test -f 'ags/test/lib/ags_conversion_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_conversion_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Tpo ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_conversion_test.c' object='ags/test/lib/conversion_test-ags_conversion_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/conversion_test-ags_conversion_test.obj `if test -f 'ags/test/lib/ags_conversion_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_conversion_test.c'; fi` ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.o: ags/test/audio/recall/ags_copy_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Tpo -c -o ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_copy_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_audio_signal_test.c' object='ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_copy_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_audio_signal_test.c ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.obj: ags/test/audio/recall/ags_copy_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Tpo -c -o ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_copy_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_audio_signal_test.c' object='ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_audio_signal_test-ags_copy_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_copy_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_audio_signal_test.c'; fi` ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.o: ags/test/audio/recall/ags_copy_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Tpo -c -o ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.o `test -f 'ags/test/audio/recall/ags_copy_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_channel_test.c' object='ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.o `test -f 'ags/test/audio/recall/ags_copy_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_channel_test.c ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.obj: ags/test/audio/recall/ags_copy_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Tpo -c -o ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.obj `if test -f 'ags/test/audio/recall/ags_copy_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_channel_test.c' object='ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_channel_test-ags_copy_channel_test.obj `if test -f 'ags/test/audio/recall/ags_copy_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_channel_test.c'; fi` ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.o: ags/test/audio/recall/ags_copy_pattern_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Tpo -c -o ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.o `test -f 'ags/test/audio/recall/ags_copy_pattern_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_pattern_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_pattern_audio_test.c' object='ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.o `test -f 'ags/test/audio/recall/ags_copy_pattern_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_pattern_audio_test.c ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.obj: ags/test/audio/recall/ags_copy_pattern_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Tpo -c -o ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.obj `if test -f 'ags/test/audio/recall/ags_copy_pattern_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_pattern_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_pattern_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_pattern_audio_test.c' object='ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_pattern_audio_test-ags_copy_pattern_audio_test.obj `if test -f 'ags/test/audio/recall/ags_copy_pattern_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_pattern_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_pattern_audio_test.c'; fi` ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.o: ags/test/audio/recall/ags_copy_pattern_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Tpo -c -o ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.o `test -f 'ags/test/audio/recall/ags_copy_pattern_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_pattern_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_pattern_channel_test.c' object='ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.o `test -f 'ags/test/audio/recall/ags_copy_pattern_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_copy_pattern_channel_test.c ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.obj: ags/test/audio/recall/ags_copy_pattern_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Tpo -c -o ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.obj `if test -f 'ags/test/audio/recall/ags_copy_pattern_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_pattern_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_pattern_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_copy_pattern_channel_test.c' object='ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_copy_pattern_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/copy_pattern_channel_test-ags_copy_pattern_channel_test.obj `if test -f 'ags/test/audio/recall/ags_copy_pattern_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_copy_pattern_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_copy_pattern_channel_test.c'; fi` ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.o: ags/test/audio/recall/ags_count_beats_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_count_beats_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Tpo -c -o ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.o `test -f 'ags/test/audio/recall/ags_count_beats_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_count_beats_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_count_beats_audio_test.c' object='ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_count_beats_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.o `test -f 'ags/test/audio/recall/ags_count_beats_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_count_beats_audio_test.c ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.obj: ags/test/audio/recall/ags_count_beats_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_count_beats_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Tpo -c -o ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.obj `if test -f 'ags/test/audio/recall/ags_count_beats_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_count_beats_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_count_beats_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_count_beats_audio_test.c' object='ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_count_beats_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/count_beats_audio_test-ags_count_beats_audio_test.obj `if test -f 'ags/test/audio/recall/ags_count_beats_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_count_beats_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_count_beats_audio_test.c'; fi` ags/test/audio/task/crop_note_test-ags_crop_note_test.o: ags/test/audio/task/ags_crop_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_crop_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/crop_note_test-ags_crop_note_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Tpo -c -o ags/test/audio/task/crop_note_test-ags_crop_note_test.o `test -f 'ags/test/audio/task/ags_crop_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_crop_note_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Tpo ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_crop_note_test.c' object='ags/test/audio/task/crop_note_test-ags_crop_note_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_crop_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/crop_note_test-ags_crop_note_test.o `test -f 'ags/test/audio/task/ags_crop_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_crop_note_test.c ags/test/audio/task/crop_note_test-ags_crop_note_test.obj: ags/test/audio/task/ags_crop_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_crop_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/crop_note_test-ags_crop_note_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Tpo -c -o ags/test/audio/task/crop_note_test-ags_crop_note_test.obj `if test -f 'ags/test/audio/task/ags_crop_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_crop_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_crop_note_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Tpo ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_crop_note_test.c' object='ags/test/audio/task/crop_note_test-ags_crop_note_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_crop_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/crop_note_test-ags_crop_note_test.obj `if test -f 'ags/test/audio/task/ags_crop_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_crop_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_crop_note_test.c'; fi` ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.o: ags/test/audio/recall/ags_delay_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_delay_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Tpo -c -o ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.o `test -f 'ags/test/audio/recall/ags_delay_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_delay_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_delay_audio_test.c' object='ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_delay_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.o `test -f 'ags/test/audio/recall/ags_delay_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_delay_audio_test.c ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.obj: ags/test/audio/recall/ags_delay_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_delay_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Tpo -c -o ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.obj `if test -f 'ags/test/audio/recall/ags_delay_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_delay_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_delay_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_delay_audio_test.c' object='ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_delay_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/delay_audio_test-ags_delay_audio_test.obj `if test -f 'ags/test/audio/recall/ags_delay_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_delay_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_delay_audio_test.c'; fi` ags/test/thread/destroy_worker_test-ags_destroy_worker_test.o: ags/test/thread/ags_destroy_worker_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_destroy_worker_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/destroy_worker_test-ags_destroy_worker_test.o -MD -MP -MF ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Tpo -c -o ags/test/thread/destroy_worker_test-ags_destroy_worker_test.o `test -f 'ags/test/thread/ags_destroy_worker_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_destroy_worker_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Tpo ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_destroy_worker_test.c' object='ags/test/thread/destroy_worker_test-ags_destroy_worker_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_destroy_worker_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/destroy_worker_test-ags_destroy_worker_test.o `test -f 'ags/test/thread/ags_destroy_worker_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_destroy_worker_test.c ags/test/thread/destroy_worker_test-ags_destroy_worker_test.obj: ags/test/thread/ags_destroy_worker_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_destroy_worker_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/destroy_worker_test-ags_destroy_worker_test.obj -MD -MP -MF ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Tpo -c -o ags/test/thread/destroy_worker_test-ags_destroy_worker_test.obj `if test -f 'ags/test/thread/ags_destroy_worker_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_destroy_worker_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_destroy_worker_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Tpo ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_destroy_worker_test.c' object='ags/test/thread/destroy_worker_test-ags_destroy_worker_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_destroy_worker_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/destroy_worker_test-ags_destroy_worker_test.obj `if test -f 'ags/test/thread/ags_destroy_worker_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_destroy_worker_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_destroy_worker_test.c'; fi` ags/test/audio/devin_test-ags_devin_test.o: ags/test/audio/ags_devin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devin_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/devin_test-ags_devin_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Tpo -c -o ags/test/audio/devin_test-ags_devin_test.o `test -f 'ags/test/audio/ags_devin_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_devin_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Tpo ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_devin_test.c' object='ags/test/audio/devin_test-ags_devin_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/devin_test-ags_devin_test.o `test -f 'ags/test/audio/ags_devin_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_devin_test.c ags/test/audio/devin_test-ags_devin_test.obj: ags/test/audio/ags_devin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devin_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/devin_test-ags_devin_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Tpo -c -o ags/test/audio/devin_test-ags_devin_test.obj `if test -f 'ags/test/audio/ags_devin_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_devin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_devin_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Tpo ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_devin_test.c' object='ags/test/audio/devin_test-ags_devin_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/devin_test-ags_devin_test.obj `if test -f 'ags/test/audio/ags_devin_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_devin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_devin_test.c'; fi` ags/test/audio/devout_test-ags_devout_test.o: ags/test/audio/ags_devout_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devout_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/devout_test-ags_devout_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Tpo -c -o ags/test/audio/devout_test-ags_devout_test.o `test -f 'ags/test/audio/ags_devout_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_devout_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Tpo ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_devout_test.c' object='ags/test/audio/devout_test-ags_devout_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/devout_test-ags_devout_test.o `test -f 'ags/test/audio/ags_devout_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_devout_test.c ags/test/audio/devout_test-ags_devout_test.obj: ags/test/audio/ags_devout_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devout_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/devout_test-ags_devout_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Tpo -c -o ags/test/audio/devout_test-ags_devout_test.obj `if test -f 'ags/test/audio/ags_devout_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_devout_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_devout_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Tpo ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_devout_test.c' object='ags/test/audio/devout_test-ags_devout_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_devout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/devout_test-ags_devout_test.obj `if test -f 'ags/test/audio/ags_devout_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_devout_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_devout_test.c'; fi` ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.o: ags/test/plugin/ags_dssi_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Tpo -c -o ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.o `test -f 'ags/test/plugin/ags_dssi_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_dssi_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Tpo ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_dssi_manager_test.c' object='ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.o `test -f 'ags/test/plugin/ags_dssi_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_dssi_manager_test.c ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.obj: ags/test/plugin/ags_dssi_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Tpo -c -o ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.obj `if test -f 'ags/test/plugin/ags_dssi_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_dssi_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_dssi_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Tpo ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_dssi_manager_test.c' object='ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/dssi_manager_test-ags_dssi_manager_test.obj `if test -f 'ags/test/plugin/ags_dssi_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_dssi_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_dssi_manager_test.c'; fi` ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.o: ags/test/plugin/ags_dssi_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Tpo -c -o ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.o `test -f 'ags/test/plugin/ags_dssi_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_dssi_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_dssi_plugin_test.c' object='ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.o `test -f 'ags/test/plugin/ags_dssi_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_dssi_plugin_test.c ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.obj: ags/test/plugin/ags_dssi_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Tpo -c -o ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.obj `if test -f 'ags/test/plugin/ags_dssi_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_dssi_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_dssi_plugin_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_dssi_plugin_test.c' object='ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_dssi_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/dssi_plugin_test-ags_dssi_plugin_test.obj `if test -f 'ags/test/plugin/ags_dssi_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_dssi_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_dssi_plugin_test.c'; fi` ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.o: ags/test/audio/recall/ags_envelope_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Tpo -c -o ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_envelope_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_envelope_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_envelope_audio_signal_test.c' object='ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_envelope_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_envelope_audio_signal_test.c ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.obj: ags/test/audio/recall/ags_envelope_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Tpo -c -o ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_envelope_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_envelope_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_envelope_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_envelope_audio_signal_test.c' object='ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/envelope_audio_signal_test-ags_envelope_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_envelope_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_envelope_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_envelope_audio_signal_test.c'; fi` ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.o: ags/test/audio/recall/ags_envelope_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Tpo -c -o ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.o `test -f 'ags/test/audio/recall/ags_envelope_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_envelope_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_envelope_channel_test.c' object='ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.o `test -f 'ags/test/audio/recall/ags_envelope_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_envelope_channel_test.c ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.obj: ags/test/audio/recall/ags_envelope_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Tpo -c -o ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.obj `if test -f 'ags/test/audio/recall/ags_envelope_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_envelope_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_envelope_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_envelope_channel_test.c' object='ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_envelope_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/envelope_channel_test-ags_envelope_channel_test.obj `if test -f 'ags/test/audio/recall/ags_envelope_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_envelope_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_envelope_channel_test.c'; fi` ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.o: ags/test/audio/recall/ags_eq10_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Tpo -c -o ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_eq10_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_eq10_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_eq10_audio_signal_test.c' object='ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_eq10_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_eq10_audio_signal_test.c ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.obj: ags/test/audio/recall/ags_eq10_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Tpo -c -o ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_eq10_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_eq10_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_eq10_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_eq10_audio_signal_test.c' object='ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/eq10_audio_signal_test-ags_eq10_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_eq10_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_eq10_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_eq10_audio_signal_test.c'; fi` ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.o: ags/test/audio/recall/ags_eq10_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Tpo -c -o ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.o `test -f 'ags/test/audio/recall/ags_eq10_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_eq10_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_eq10_channel_test.c' object='ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.o `test -f 'ags/test/audio/recall/ags_eq10_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_eq10_channel_test.c ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.obj: ags/test/audio/recall/ags_eq10_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Tpo -c -o ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.obj `if test -f 'ags/test/audio/recall/ags_eq10_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_eq10_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_eq10_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_eq10_channel_test.c' object='ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_eq10_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/eq10_channel_test-ags_eq10_channel_test.obj `if test -f 'ags/test/audio/recall/ags_eq10_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_eq10_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_eq10_channel_test.c'; fi` ags/test/audio/task/export_output_test-ags_export_output_test.o: ags/test/audio/task/ags_export_output_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_export_output_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/export_output_test-ags_export_output_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Tpo -c -o ags/test/audio/task/export_output_test-ags_export_output_test.o `test -f 'ags/test/audio/task/ags_export_output_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_export_output_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Tpo ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_export_output_test.c' object='ags/test/audio/task/export_output_test-ags_export_output_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_export_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/export_output_test-ags_export_output_test.o `test -f 'ags/test/audio/task/ags_export_output_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_export_output_test.c ags/test/audio/task/export_output_test-ags_export_output_test.obj: ags/test/audio/task/ags_export_output_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_export_output_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/export_output_test-ags_export_output_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Tpo -c -o ags/test/audio/task/export_output_test-ags_export_output_test.obj `if test -f 'ags/test/audio/task/ags_export_output_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_export_output_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_export_output_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Tpo ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_export_output_test.c' object='ags/test/audio/task/export_output_test-ags_export_output_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_export_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/export_output_test-ags_export_output_test.obj `if test -f 'ags/test/audio/task/ags_export_output_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_export_output_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_export_output_test.c'; fi` ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.o: ags/test/audio/recall/ags_feed_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_feed_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Tpo -c -o ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_feed_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_feed_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_feed_audio_signal_test.c' object='ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_feed_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_feed_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_feed_audio_signal_test.c ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.obj: ags/test/audio/recall/ags_feed_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_feed_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Tpo -c -o ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_feed_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_feed_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_feed_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_feed_audio_signal_test.c' object='ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_feed_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/feed_audio_signal_test-ags_feed_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_feed_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_feed_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_feed_audio_signal_test.c'; fi` ags/test/audio/fifoout_test-ags_fifoout_test.o: ags/test/audio/ags_fifoout_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fifoout_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/fifoout_test-ags_fifoout_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Tpo -c -o ags/test/audio/fifoout_test-ags_fifoout_test.o `test -f 'ags/test/audio/ags_fifoout_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fifoout_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Tpo ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_fifoout_test.c' object='ags/test/audio/fifoout_test-ags_fifoout_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fifoout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/fifoout_test-ags_fifoout_test.o `test -f 'ags/test/audio/ags_fifoout_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fifoout_test.c ags/test/audio/fifoout_test-ags_fifoout_test.obj: ags/test/audio/ags_fifoout_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fifoout_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/fifoout_test-ags_fifoout_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Tpo -c -o ags/test/audio/fifoout_test-ags_fifoout_test.obj `if test -f 'ags/test/audio/ags_fifoout_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fifoout_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fifoout_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Tpo ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_fifoout_test.c' object='ags/test/audio/fifoout_test-ags_fifoout_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fifoout_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/fifoout_test-ags_fifoout_test.obj `if test -f 'ags/test/audio/ags_fifoout_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fifoout_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fifoout_test.c'; fi` ags/test/file/file_id_ref_test-ags_file_id_ref_test.o: ags/test/file/ags_file_id_ref_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_id_ref_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_id_ref_test-ags_file_id_ref_test.o -MD -MP -MF ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Tpo -c -o ags/test/file/file_id_ref_test-ags_file_id_ref_test.o `test -f 'ags/test/file/ags_file_id_ref_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_id_ref_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Tpo ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_id_ref_test.c' object='ags/test/file/file_id_ref_test-ags_file_id_ref_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_id_ref_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_id_ref_test-ags_file_id_ref_test.o `test -f 'ags/test/file/ags_file_id_ref_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_id_ref_test.c ags/test/file/file_id_ref_test-ags_file_id_ref_test.obj: ags/test/file/ags_file_id_ref_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_id_ref_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_id_ref_test-ags_file_id_ref_test.obj -MD -MP -MF ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Tpo -c -o ags/test/file/file_id_ref_test-ags_file_id_ref_test.obj `if test -f 'ags/test/file/ags_file_id_ref_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_id_ref_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_id_ref_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Tpo ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_id_ref_test.c' object='ags/test/file/file_id_ref_test-ags_file_id_ref_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_id_ref_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_id_ref_test-ags_file_id_ref_test.obj `if test -f 'ags/test/file/ags_file_id_ref_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_id_ref_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_id_ref_test.c'; fi` ags/test/file/file_launch_test-ags_file_launch_test.o: ags/test/file/ags_file_launch_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_launch_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_launch_test-ags_file_launch_test.o -MD -MP -MF ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Tpo -c -o ags/test/file/file_launch_test-ags_file_launch_test.o `test -f 'ags/test/file/ags_file_launch_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_launch_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Tpo ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_launch_test.c' object='ags/test/file/file_launch_test-ags_file_launch_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_launch_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_launch_test-ags_file_launch_test.o `test -f 'ags/test/file/ags_file_launch_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_launch_test.c ags/test/file/file_launch_test-ags_file_launch_test.obj: ags/test/file/ags_file_launch_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_launch_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_launch_test-ags_file_launch_test.obj -MD -MP -MF ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Tpo -c -o ags/test/file/file_launch_test-ags_file_launch_test.obj `if test -f 'ags/test/file/ags_file_launch_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_launch_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_launch_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Tpo ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_launch_test.c' object='ags/test/file/file_launch_test-ags_file_launch_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_launch_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_launch_test-ags_file_launch_test.obj `if test -f 'ags/test/file/ags_file_launch_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_launch_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_launch_test.c'; fi` ags/test/file/file_lookup_test-ags_file_lookup_test.o: ags/test/file/ags_file_lookup_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_lookup_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_lookup_test-ags_file_lookup_test.o -MD -MP -MF ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Tpo -c -o ags/test/file/file_lookup_test-ags_file_lookup_test.o `test -f 'ags/test/file/ags_file_lookup_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_lookup_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Tpo ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_lookup_test.c' object='ags/test/file/file_lookup_test-ags_file_lookup_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_lookup_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_lookup_test-ags_file_lookup_test.o `test -f 'ags/test/file/ags_file_lookup_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_lookup_test.c ags/test/file/file_lookup_test-ags_file_lookup_test.obj: ags/test/file/ags_file_lookup_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_lookup_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_lookup_test-ags_file_lookup_test.obj -MD -MP -MF ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Tpo -c -o ags/test/file/file_lookup_test-ags_file_lookup_test.obj `if test -f 'ags/test/file/ags_file_lookup_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_lookup_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_lookup_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Tpo ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_lookup_test.c' object='ags/test/file/file_lookup_test-ags_file_lookup_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_lookup_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_lookup_test-ags_file_lookup_test.obj `if test -f 'ags/test/file/ags_file_lookup_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_lookup_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_lookup_test.c'; fi` ags/test/file/file_test-ags_file_test.o: ags/test/file/ags_file_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_test-ags_file_test.o -MD -MP -MF ags/test/file/$(DEPDIR)/file_test-ags_file_test.Tpo -c -o ags/test/file/file_test-ags_file_test.o `test -f 'ags/test/file/ags_file_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_test-ags_file_test.Tpo ags/test/file/$(DEPDIR)/file_test-ags_file_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_test.c' object='ags/test/file/file_test-ags_file_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_test-ags_file_test.o `test -f 'ags/test/file/ags_file_test.c' || echo '$(srcdir)/'`ags/test/file/ags_file_test.c ags/test/file/file_test-ags_file_test.obj: ags/test/file/ags_file_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_test_CFLAGS) $(CFLAGS) -MT ags/test/file/file_test-ags_file_test.obj -MD -MP -MF ags/test/file/$(DEPDIR)/file_test-ags_file_test.Tpo -c -o ags/test/file/file_test-ags_file_test.obj `if test -f 'ags/test/file/ags_file_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/file/$(DEPDIR)/file_test-ags_file_test.Tpo ags/test/file/$(DEPDIR)/file_test-ags_file_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/file/ags_file_test.c' object='ags/test/file/file_test-ags_file_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_file_test_CFLAGS) $(CFLAGS) -c -o ags/test/file/file_test-ags_file_test.obj `if test -f 'ags/test/file/ags_file_test.c'; then $(CYGPATH_W) 'ags/test/file/ags_file_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/file/ags_file_test.c'; fi` ags/test/audio/filter_util_test-ags_filter_util_test.o: ags/test/audio/ags_filter_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_filter_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/filter_util_test-ags_filter_util_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Tpo -c -o ags/test/audio/filter_util_test-ags_filter_util_test.o `test -f 'ags/test/audio/ags_filter_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_filter_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Tpo ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_filter_util_test.c' object='ags/test/audio/filter_util_test-ags_filter_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_filter_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/filter_util_test-ags_filter_util_test.o `test -f 'ags/test/audio/ags_filter_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_filter_util_test.c ags/test/audio/filter_util_test-ags_filter_util_test.obj: ags/test/audio/ags_filter_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_filter_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/filter_util_test-ags_filter_util_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Tpo -c -o ags/test/audio/filter_util_test-ags_filter_util_test.obj `if test -f 'ags/test/audio/ags_filter_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_filter_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_filter_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Tpo ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_filter_util_test.c' object='ags/test/audio/filter_util_test-ags_filter_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_filter_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/filter_util_test-ags_filter_util_test.obj `if test -f 'ags/test/audio/ags_filter_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_filter_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_filter_util_test.c'; fi` ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.o: ags/test/audio/ags_fm_synth_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fm_synth_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Tpo -c -o ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.o `test -f 'ags/test/audio/ags_fm_synth_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fm_synth_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Tpo ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_fm_synth_util_test.c' object='ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fm_synth_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.o `test -f 'ags/test/audio/ags_fm_synth_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fm_synth_util_test.c ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.obj: ags/test/audio/ags_fm_synth_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fm_synth_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Tpo -c -o ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.obj `if test -f 'ags/test/audio/ags_fm_synth_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fm_synth_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fm_synth_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Tpo ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_fm_synth_util_test.c' object='ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fm_synth_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/fm_synth_util_test-ags_fm_synth_util_test.obj `if test -f 'ags/test/audio/ags_fm_synth_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fm_synth_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fm_synth_util_test.c'; fi` ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.o: ags/test/audio/ags_fourier_transform_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fourier_transform_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Tpo -c -o ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.o `test -f 'ags/test/audio/ags_fourier_transform_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fourier_transform_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Tpo ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_fourier_transform_util_test.c' object='ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fourier_transform_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.o `test -f 'ags/test/audio/ags_fourier_transform_util_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_fourier_transform_util_test.c ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.obj: ags/test/audio/ags_fourier_transform_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fourier_transform_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Tpo -c -o ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.obj `if test -f 'ags/test/audio/ags_fourier_transform_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fourier_transform_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fourier_transform_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Tpo ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_fourier_transform_util_test.c' object='ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_fourier_transform_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/fourier_transform_util_test-ags_fourier_transform_util_test.obj `if test -f 'ags/test/audio/ags_fourier_transform_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_fourier_transform_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_fourier_transform_util_test.c'; fi` ags/test/audio/task/free_selection_test-ags_free_selection_test.o: ags/test/audio/task/ags_free_selection_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_free_selection_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/free_selection_test-ags_free_selection_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Tpo -c -o ags/test/audio/task/free_selection_test-ags_free_selection_test.o `test -f 'ags/test/audio/task/ags_free_selection_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_free_selection_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Tpo ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_free_selection_test.c' object='ags/test/audio/task/free_selection_test-ags_free_selection_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_free_selection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/free_selection_test-ags_free_selection_test.o `test -f 'ags/test/audio/task/ags_free_selection_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_free_selection_test.c ags/test/audio/task/free_selection_test-ags_free_selection_test.obj: ags/test/audio/task/ags_free_selection_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_free_selection_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/free_selection_test-ags_free_selection_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Tpo -c -o ags/test/audio/task/free_selection_test-ags_free_selection_test.obj `if test -f 'ags/test/audio/task/ags_free_selection_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_free_selection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_free_selection_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Tpo ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_free_selection_test.c' object='ags/test/audio/task/free_selection_test-ags_free_selection_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_free_selection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/free_selection_test-ags_free_selection_test.obj `if test -f 'ags/test/audio/task/ags_free_selection_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_free_selection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_free_selection_test.c'; fi` ags/test/server/controller/front_controller_test-ags_front_controller_test.o: ags/test/server/controller/ags_front_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_front_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/server/controller/front_controller_test-ags_front_controller_test.o -MD -MP -MF ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Tpo -c -o ags/test/server/controller/front_controller_test-ags_front_controller_test.o `test -f 'ags/test/server/controller/ags_front_controller_test.c' || echo '$(srcdir)/'`ags/test/server/controller/ags_front_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Tpo ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/controller/ags_front_controller_test.c' object='ags/test/server/controller/front_controller_test-ags_front_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/front_controller_test-ags_front_controller_test.o `test -f 'ags/test/server/controller/ags_front_controller_test.c' || echo '$(srcdir)/'`ags/test/server/controller/ags_front_controller_test.c ags/test/server/controller/front_controller_test-ags_front_controller_test.obj: ags/test/server/controller/ags_front_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_front_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/server/controller/front_controller_test-ags_front_controller_test.obj -MD -MP -MF ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Tpo -c -o ags/test/server/controller/front_controller_test-ags_front_controller_test.obj `if test -f 'ags/test/server/controller/ags_front_controller_test.c'; then $(CYGPATH_W) 'ags/test/server/controller/ags_front_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/controller/ags_front_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Tpo ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/controller/ags_front_controller_test.c' object='ags/test/server/controller/front_controller_test-ags_front_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/controller/front_controller_test-ags_front_controller_test.obj `if test -f 'ags/test/server/controller/ags_front_controller_test.c'; then $(CYGPATH_W) 'ags/test/server/controller/ags_front_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/controller/ags_front_controller_test.c'; fi` ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.o: ags/test/X/ags_functional_audio_config_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_audio_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_config_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Tpo -c -o ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.o `test -f 'ags/test/X/ags_functional_audio_config_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_audio_config_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Tpo ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_audio_config_test.c' object='ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_audio_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.o `test -f 'ags/test/X/ags_functional_audio_config_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_audio_config_test.c ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.obj: ags/test/X/ags_functional_audio_config_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_audio_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_config_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Tpo -c -o ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.obj `if test -f 'ags/test/X/ags_functional_audio_config_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_audio_config_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_audio_config_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Tpo ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_audio_config_test.c' object='ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_audio_config_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_config_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_audio_config_test-ags_functional_audio_config_test.obj `if test -f 'ags/test/X/ags_functional_audio_config_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_audio_config_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_audio_config_test.c'; fi` ags/test/audio/functional_audio_test-ags_functional_audio_test.o: ags/test/audio/ags_functional_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/functional_audio_test-ags_functional_audio_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Tpo -c -o ags/test/audio/functional_audio_test-ags_functional_audio_test.o `test -f 'ags/test/audio/ags_functional_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Tpo ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_functional_audio_test.c' object='ags/test/audio/functional_audio_test-ags_functional_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/functional_audio_test-ags_functional_audio_test.o `test -f 'ags/test/audio/ags_functional_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_audio_test.c ags/test/audio/functional_audio_test-ags_functional_audio_test.obj: ags/test/audio/ags_functional_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/functional_audio_test-ags_functional_audio_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Tpo -c -o ags/test/audio/functional_audio_test-ags_functional_audio_test.obj `if test -f 'ags/test/audio/ags_functional_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Tpo ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_functional_audio_test.c' object='ags/test/audio/functional_audio_test-ags_functional_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/functional_audio_test-ags_functional_audio_test.obj `if test -f 'ags/test/audio/ags_functional_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_audio_test.c'; fi` ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o: ags/test/X/ags_functional_automation_editor_workflow_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_automation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_automation_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Tpo -c -o ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_automation_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_automation_editor_workflow_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_automation_editor_workflow_test.c' object='ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_automation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_automation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_automation_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_automation_editor_workflow_test.c ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj: ags/test/X/ags_functional_automation_editor_workflow_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_automation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_automation_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Tpo -c -o ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_automation_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_automation_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_automation_editor_workflow_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_automation_editor_workflow_test.c' object='ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_automation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_automation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_automation_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_automation_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_automation_editor_workflow_test.c'; fi` ags/test/X/machine/functional_drum_test-ags_functional_drum_test.o: ags/test/X/machine/ags_functional_drum_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_drum_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_drum_test-ags_functional_drum_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Tpo -c -o ags/test/X/machine/functional_drum_test-ags_functional_drum_test.o `test -f 'ags/test/X/machine/ags_functional_drum_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_drum_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_drum_test.c' object='ags/test/X/machine/functional_drum_test-ags_functional_drum_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_drum_test-ags_functional_drum_test.o `test -f 'ags/test/X/machine/ags_functional_drum_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_drum_test.c ags/test/X/machine/functional_drum_test-ags_functional_drum_test.obj: ags/test/X/machine/ags_functional_drum_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_drum_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_drum_test-ags_functional_drum_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Tpo -c -o ags/test/X/machine/functional_drum_test-ags_functional_drum_test.obj `if test -f 'ags/test/X/machine/ags_functional_drum_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_drum_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_drum_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_drum_test.c' object='ags/test/X/machine/functional_drum_test-ags_functional_drum_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_drum_test-ags_functional_drum_test.obj `if test -f 'ags/test/X/machine/ags_functional_drum_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_drum_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_drum_test.c'; fi` ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.o: ags/test/X/machine/ags_functional_ffplayer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Tpo -c -o ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.o `test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_ffplayer_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_ffplayer_test.c' object='ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.o `test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_ffplayer_test.c ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.obj: ags/test/X/machine/ags_functional_ffplayer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Tpo -c -o ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.obj `if test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_ffplayer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_ffplayer_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_ffplayer_test.c' object='ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_ffplayer_test-ags_functional_ffplayer_test.obj `if test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_ffplayer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_ffplayer_test.c'; fi` ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.o: ags/test/audio/ags_functional_fourier_transform_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_fourier_transform_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Tpo -c -o ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.o `test -f 'ags/test/audio/ags_functional_fourier_transform_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_fourier_transform_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Tpo ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_functional_fourier_transform_test.c' object='ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_fourier_transform_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.o `test -f 'ags/test/audio/ags_functional_fourier_transform_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_fourier_transform_test.c ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.obj: ags/test/audio/ags_functional_fourier_transform_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_fourier_transform_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Tpo -c -o ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.obj `if test -f 'ags/test/audio/ags_functional_fourier_transform_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_fourier_transform_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_fourier_transform_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Tpo ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_functional_fourier_transform_test.c' object='ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_fourier_transform_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/functional_fourier_transform_test-ags_functional_fourier_transform_test.obj `if test -f 'ags/test/audio/ags_functional_fourier_transform_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_fourier_transform_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_fourier_transform_test.c'; fi` ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o: ags/test/X/ags_functional_line_member_add_and_destroy_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo -c -o ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_line_member_add_and_destroy_test.c' object='ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj: ags/test/X/ags_functional_line_member_add_and_destroy_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo -c -o ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_line_member_add_and_destroy_test.c' object='ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi` ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o: ags/test/X/ags_functional_machine_add_and_destroy_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo -c -o ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_add_and_destroy_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_machine_add_and_destroy_test.c' object='ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_add_and_destroy_test.c ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj: ags/test/X/ags_functional_machine_add_and_destroy_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo -c -o ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_add_and_destroy_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_machine_add_and_destroy_test.c' object='ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_add_and_destroy_test.c'; fi` ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.o: ags/test/X/ags_functional_machine_link_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Tpo -c -o ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.o `test -f 'ags/test/X/ags_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_link_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Tpo ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_machine_link_test.c' object='ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.o `test -f 'ags/test/X/ags_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_link_test.c ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.obj: ags/test/X/ags_functional_machine_link_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Tpo -c -o ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_link_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Tpo ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_machine_link_test.c' object='ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_machine_link_test-ags_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_link_test.c'; fi` ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.o: ags/test/X/machine/ags_functional_matrix_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_matrix_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Tpo -c -o ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.o `test -f 'ags/test/X/machine/ags_functional_matrix_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_matrix_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_matrix_test.c' object='ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_matrix_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.o `test -f 'ags/test/X/machine/ags_functional_matrix_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_matrix_test.c ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.obj: ags/test/X/machine/ags_functional_matrix_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_matrix_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Tpo -c -o ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.obj `if test -f 'ags/test/X/machine/ags_functional_matrix_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_matrix_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_matrix_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_matrix_test.c' object='ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_matrix_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_matrix_test-ags_functional_matrix_test.obj `if test -f 'ags/test/X/machine/ags_functional_matrix_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_matrix_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_matrix_test.c'; fi` ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.o: ags/test/X/machine/ags_functional_mixer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_mixer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Tpo -c -o ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.o `test -f 'ags/test/X/machine/ags_functional_mixer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_mixer_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_mixer_test.c' object='ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_mixer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.o `test -f 'ags/test/X/machine/ags_functional_mixer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_mixer_test.c ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.obj: ags/test/X/machine/ags_functional_mixer_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_mixer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Tpo -c -o ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.obj `if test -f 'ags/test/X/machine/ags_functional_mixer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_mixer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_mixer_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_mixer_test.c' object='ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_mixer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_mixer_test-ags_functional_mixer_test.obj `if test -f 'ags/test/X/machine/ags_functional_mixer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_mixer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_mixer_test.c'; fi` ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.o: ags/test/X/ags_functional_notation_edit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_edit_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Tpo -c -o ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.o `test -f 'ags/test/X/ags_functional_notation_edit_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_notation_edit_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Tpo ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_notation_edit_test.c' object='ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_edit_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.o `test -f 'ags/test/X/ags_functional_notation_edit_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_notation_edit_test.c ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.obj: ags/test/X/ags_functional_notation_edit_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_edit_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Tpo -c -o ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.obj `if test -f 'ags/test/X/ags_functional_notation_edit_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_notation_edit_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_notation_edit_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Tpo ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_notation_edit_test.c' object='ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_edit_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_notation_edit_test-ags_functional_notation_edit_test.obj `if test -f 'ags/test/X/ags_functional_notation_edit_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_notation_edit_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_notation_edit_test.c'; fi` ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o: ags/test/X/ags_functional_notation_editor_workflow_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Tpo -c -o ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_notation_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_notation_editor_workflow_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_notation_editor_workflow_test.c' object='ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_notation_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_notation_editor_workflow_test.c ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj: ags/test/X/ags_functional_notation_editor_workflow_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Tpo -c -o ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_notation_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_notation_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_notation_editor_workflow_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_functional_notation_editor_workflow_test.c' object='ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_notation_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_notation_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_notation_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_notation_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_notation_editor_workflow_test.c'; fi` ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.o: ags/test/audio/osc/ags_functional_osc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Tpo -c -o ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.o `test -f 'ags/test/audio/osc/ags_functional_osc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_functional_osc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_functional_osc_server_test.c' object='ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.o `test -f 'ags/test/audio/osc/ags_functional_osc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_functional_osc_server_test.c ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.obj: ags/test/audio/osc/ags_functional_osc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Tpo -c -o ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.obj `if test -f 'ags/test/audio/osc/ags_functional_osc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_functional_osc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_functional_osc_server_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_functional_osc_server_test.c' object='ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/functional_osc_server_test-ags_functional_osc_server_test.obj `if test -f 'ags/test/audio/osc/ags_functional_osc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_functional_osc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_functional_osc_server_test.c'; fi` ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o: ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Tpo -c -o ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o `test -f 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c' object='ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.o `test -f 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj: ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Tpo -c -o ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj `if test -f 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c' object='ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.obj `if test -f 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c'; fi` ags/test/X/machine/functional_panel_test-ags_functional_panel_test.o: ags/test/X/machine/ags_functional_panel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_panel_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_panel_test-ags_functional_panel_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Tpo -c -o ags/test/X/machine/functional_panel_test-ags_functional_panel_test.o `test -f 'ags/test/X/machine/ags_functional_panel_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_panel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_panel_test.c' object='ags/test/X/machine/functional_panel_test-ags_functional_panel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_panel_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_panel_test-ags_functional_panel_test.o `test -f 'ags/test/X/machine/ags_functional_panel_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_panel_test.c ags/test/X/machine/functional_panel_test-ags_functional_panel_test.obj: ags/test/X/machine/ags_functional_panel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_panel_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_panel_test-ags_functional_panel_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Tpo -c -o ags/test/X/machine/functional_panel_test-ags_functional_panel_test.obj `if test -f 'ags/test/X/machine/ags_functional_panel_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_panel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_panel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_panel_test.c' object='ags/test/X/machine/functional_panel_test-ags_functional_panel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_panel_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_panel_test-ags_functional_panel_test.obj `if test -f 'ags/test/X/machine/ags_functional_panel_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_panel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_panel_test.c'; fi` ags/test/audio/functional_pitch_test-ags_functional_pitch_test.o: ags/test/audio/ags_functional_pitch_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_pitch_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/functional_pitch_test-ags_functional_pitch_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Tpo -c -o ags/test/audio/functional_pitch_test-ags_functional_pitch_test.o `test -f 'ags/test/audio/ags_functional_pitch_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_pitch_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Tpo ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_functional_pitch_test.c' object='ags/test/audio/functional_pitch_test-ags_functional_pitch_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_pitch_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/functional_pitch_test-ags_functional_pitch_test.o `test -f 'ags/test/audio/ags_functional_pitch_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_pitch_test.c ags/test/audio/functional_pitch_test-ags_functional_pitch_test.obj: ags/test/audio/ags_functional_pitch_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_pitch_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/functional_pitch_test-ags_functional_pitch_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Tpo -c -o ags/test/audio/functional_pitch_test-ags_functional_pitch_test.obj `if test -f 'ags/test/audio/ags_functional_pitch_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_pitch_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_pitch_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Tpo ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_functional_pitch_test.c' object='ags/test/audio/functional_pitch_test-ags_functional_pitch_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_pitch_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/functional_pitch_test-ags_functional_pitch_test.obj `if test -f 'ags/test/audio/ags_functional_pitch_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_pitch_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_pitch_test.c'; fi` ags/test/server/functional_server_test-ags_functional_server_test.o: ags/test/server/ags_functional_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_server_test_CFLAGS) $(CFLAGS) -MT ags/test/server/functional_server_test-ags_functional_server_test.o -MD -MP -MF ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Tpo -c -o ags/test/server/functional_server_test-ags_functional_server_test.o `test -f 'ags/test/server/ags_functional_server_test.c' || echo '$(srcdir)/'`ags/test/server/ags_functional_server_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Tpo ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/ags_functional_server_test.c' object='ags/test/server/functional_server_test-ags_functional_server_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/functional_server_test-ags_functional_server_test.o `test -f 'ags/test/server/ags_functional_server_test.c' || echo '$(srcdir)/'`ags/test/server/ags_functional_server_test.c ags/test/server/functional_server_test-ags_functional_server_test.obj: ags/test/server/ags_functional_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_server_test_CFLAGS) $(CFLAGS) -MT ags/test/server/functional_server_test-ags_functional_server_test.obj -MD -MP -MF ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Tpo -c -o ags/test/server/functional_server_test-ags_functional_server_test.obj `if test -f 'ags/test/server/ags_functional_server_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_functional_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_functional_server_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Tpo ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/ags_functional_server_test.c' object='ags/test/server/functional_server_test-ags_functional_server_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_functional_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/functional_server_test-ags_functional_server_test.obj `if test -f 'ags/test/server/ags_functional_server_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_functional_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_functional_server_test.c'; fi` ags/test/X/machine/functional_synth_test-ags_functional_synth_test.o: ags/test/X/machine/ags_functional_synth_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_synth_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_synth_test-ags_functional_synth_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Tpo -c -o ags/test/X/machine/functional_synth_test-ags_functional_synth_test.o `test -f 'ags/test/X/machine/ags_functional_synth_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_synth_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_synth_test.c' object='ags/test/X/machine/functional_synth_test-ags_functional_synth_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_synth_test-ags_functional_synth_test.o `test -f 'ags/test/X/machine/ags_functional_synth_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_synth_test.c ags/test/X/machine/functional_synth_test-ags_functional_synth_test.obj: ags/test/X/machine/ags_functional_synth_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_synth_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/functional_synth_test-ags_functional_synth_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Tpo -c -o ags/test/X/machine/functional_synth_test-ags_functional_synth_test.obj `if test -f 'ags/test/X/machine/ags_functional_synth_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_synth_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Tpo ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/machine/ags_functional_synth_test.c' object='ags/test/X/machine/functional_synth_test-ags_functional_synth_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/functional_synth_test-ags_functional_synth_test.obj `if test -f 'ags/test/X/machine/ags_functional_synth_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_synth_test.c'; fi` ags/test/audio/input_test-ags_input_test.o: ags/test/audio/ags_input_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_input_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/input_test-ags_input_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Tpo -c -o ags/test/audio/input_test-ags_input_test.o `test -f 'ags/test/audio/ags_input_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_input_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Tpo ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_input_test.c' object='ags/test/audio/input_test-ags_input_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_input_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/input_test-ags_input_test.o `test -f 'ags/test/audio/ags_input_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_input_test.c ags/test/audio/input_test-ags_input_test.obj: ags/test/audio/ags_input_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_input_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/input_test-ags_input_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Tpo -c -o ags/test/audio/input_test-ags_input_test.obj `if test -f 'ags/test/audio/ags_input_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_input_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_input_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Tpo ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_input_test.c' object='ags/test/audio/input_test-ags_input_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_input_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/input_test-ags_input_test.obj `if test -f 'ags/test/audio/ags_input_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_input_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_input_test.c'; fi` ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.o: ags/test/plugin/ags_ladspa_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_conversion_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Tpo -c -o ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.o `test -f 'ags/test/plugin/ags_ladspa_conversion_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_ladspa_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Tpo ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_ladspa_conversion_test.c' object='ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.o `test -f 'ags/test/plugin/ags_ladspa_conversion_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_ladspa_conversion_test.c ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.obj: ags/test/plugin/ags_ladspa_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_conversion_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Tpo -c -o ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.obj `if test -f 'ags/test/plugin/ags_ladspa_conversion_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_ladspa_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_ladspa_conversion_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Tpo ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_ladspa_conversion_test.c' object='ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/ladspa_conversion_test-ags_ladspa_conversion_test.obj `if test -f 'ags/test/plugin/ags_ladspa_conversion_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_ladspa_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_ladspa_conversion_test.c'; fi` ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.o: ags/test/plugin/ags_ladspa_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Tpo -c -o ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.o `test -f 'ags/test/plugin/ags_ladspa_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_ladspa_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Tpo ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_ladspa_manager_test.c' object='ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.o `test -f 'ags/test/plugin/ags_ladspa_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_ladspa_manager_test.c ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.obj: ags/test/plugin/ags_ladspa_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Tpo -c -o ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.obj `if test -f 'ags/test/plugin/ags_ladspa_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_ladspa_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_ladspa_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Tpo ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_ladspa_manager_test.c' object='ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_ladspa_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/ladspa_manager_test-ags_ladspa_manager_test.obj `if test -f 'ags/test/plugin/ags_ladspa_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_ladspa_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_ladspa_manager_test.c'; fi` ags/test/audio/task/link_channel_test-ags_link_channel_test.o: ags/test/audio/task/ags_link_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_link_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/link_channel_test-ags_link_channel_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Tpo -c -o ags/test/audio/task/link_channel_test-ags_link_channel_test.o `test -f 'ags/test/audio/task/ags_link_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_link_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Tpo ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_link_channel_test.c' object='ags/test/audio/task/link_channel_test-ags_link_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_link_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/link_channel_test-ags_link_channel_test.o `test -f 'ags/test/audio/task/ags_link_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_link_channel_test.c ags/test/audio/task/link_channel_test-ags_link_channel_test.obj: ags/test/audio/task/ags_link_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_link_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/link_channel_test-ags_link_channel_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Tpo -c -o ags/test/audio/task/link_channel_test-ags_link_channel_test.obj `if test -f 'ags/test/audio/task/ags_link_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_link_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_link_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Tpo ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_link_channel_test.c' object='ags/test/audio/task/link_channel_test-ags_link_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_link_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/link_channel_test-ags_link_channel_test.obj `if test -f 'ags/test/audio/task/ags_link_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_link_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_link_channel_test.c'; fi` ags/test/lib/log_test-ags_log_test.o: ags/test/lib/ags_log_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_log_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/log_test-ags_log_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Tpo -c -o ags/test/lib/log_test-ags_log_test.o `test -f 'ags/test/lib/ags_log_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_log_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Tpo ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_log_test.c' object='ags/test/lib/log_test-ags_log_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_log_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/log_test-ags_log_test.o `test -f 'ags/test/lib/ags_log_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_log_test.c ags/test/lib/log_test-ags_log_test.obj: ags/test/lib/ags_log_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_log_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/log_test-ags_log_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Tpo -c -o ags/test/lib/log_test-ags_log_test.obj `if test -f 'ags/test/lib/ags_log_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_log_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_log_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Tpo ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_log_test.c' object='ags/test/lib/log_test-ags_log_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_log_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/log_test-ags_log_test.obj `if test -f 'ags/test/lib/ags_log_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_log_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_log_test.c'; fi` ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.o: ags/test/plugin/ags_lv2_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_conversion_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Tpo -c -o ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.o `test -f 'ags/test/plugin/ags_lv2_conversion_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_conversion_test.c' object='ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.o `test -f 'ags/test/plugin/ags_lv2_conversion_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_conversion_test.c ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.obj: ags/test/plugin/ags_lv2_conversion_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_conversion_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Tpo -c -o ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.obj `if test -f 'ags/test/plugin/ags_lv2_conversion_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_conversion_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_conversion_test.c' object='ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_conversion_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_conversion_test-ags_lv2_conversion_test.obj `if test -f 'ags/test/plugin/ags_lv2_conversion_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_conversion_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_conversion_test.c'; fi` ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.o: ags/test/plugin/ags_lv2_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Tpo -c -o ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.o `test -f 'ags/test/plugin/ags_lv2_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_manager_test.c' object='ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.o `test -f 'ags/test/plugin/ags_lv2_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_manager_test.c ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.obj: ags/test/plugin/ags_lv2_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Tpo -c -o ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_manager_test.c' object='ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_manager_test-ags_lv2_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_manager_test.c'; fi` ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.o: ags/test/plugin/ags_lv2_option_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_option_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Tpo -c -o ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.o `test -f 'ags/test/plugin/ags_lv2_option_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_option_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_option_manager_test.c' object='ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_option_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.o `test -f 'ags/test/plugin/ags_lv2_option_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_option_manager_test.c ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.obj: ags/test/plugin/ags_lv2_option_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_option_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Tpo -c -o ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_option_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_option_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_option_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_option_manager_test.c' object='ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_option_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_option_manager_test-ags_lv2_option_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_option_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_option_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_option_manager_test.c'; fi` ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.o: ags/test/plugin/ags_lv2_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Tpo -c -o ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.o `test -f 'ags/test/plugin/ags_lv2_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_plugin_test.c' object='ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.o `test -f 'ags/test/plugin/ags_lv2_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_plugin_test.c ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.obj: ags/test/plugin/ags_lv2_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Tpo -c -o ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.obj `if test -f 'ags/test/plugin/ags_lv2_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_plugin_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_plugin_test.c' object='ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_plugin_test-ags_lv2_plugin_test.obj `if test -f 'ags/test/plugin/ags_lv2_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_plugin_test.c'; fi` ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.o: ags/test/plugin/ags_lv2_preset_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_preset_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Tpo -c -o ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.o `test -f 'ags/test/plugin/ags_lv2_preset_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_preset_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_preset_test.c' object='ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.o `test -f 'ags/test/plugin/ags_lv2_preset_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_preset_test.c ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.obj: ags/test/plugin/ags_lv2_preset_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_preset_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Tpo -c -o ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.obj `if test -f 'ags/test/plugin/ags_lv2_preset_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_preset_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_preset_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_preset_test.c' object='ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_preset_test-ags_lv2_preset_test.obj `if test -f 'ags/test/plugin/ags_lv2_preset_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_preset_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_preset_test.c'; fi` ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o: ags/test/plugin/ags_lv2_uri_map_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Tpo -c -o ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o `test -f 'ags/test/plugin/ags_lv2_uri_map_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_uri_map_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_uri_map_manager_test.c' object='ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.o `test -f 'ags/test/plugin/ags_lv2_uri_map_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_uri_map_manager_test.c ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj: ags/test/plugin/ags_lv2_uri_map_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Tpo -c -o ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_uri_map_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_uri_map_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_uri_map_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_uri_map_manager_test.c' object='ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_uri_map_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_uri_map_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_uri_map_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_uri_map_manager_test.c'; fi` ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.o: ags/test/plugin/ags_lv2_urid_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_urid_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Tpo -c -o ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.o `test -f 'ags/test/plugin/ags_lv2_urid_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_urid_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_urid_manager_test.c' object='ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_urid_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.o `test -f 'ags/test/plugin/ags_lv2_urid_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_urid_manager_test.c ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.obj: ags/test/plugin/ags_lv2_urid_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_urid_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Tpo -c -o ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_urid_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_urid_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_urid_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_urid_manager_test.c' object='ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_urid_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_urid_manager_test-ags_lv2_urid_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_urid_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_urid_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_urid_manager_test.c'; fi` ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.o: ags/test/plugin/ags_lv2_worker_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_worker_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Tpo -c -o ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.o `test -f 'ags/test/plugin/ags_lv2_worker_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_worker_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_worker_manager_test.c' object='ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_worker_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.o `test -f 'ags/test/plugin/ags_lv2_worker_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2_worker_manager_test.c ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.obj: ags/test/plugin/ags_lv2_worker_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_worker_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Tpo -c -o ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_worker_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_worker_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_worker_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2_worker_manager_test.c' object='ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2_worker_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2_worker_manager_test-ags_lv2_worker_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2_worker_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2_worker_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2_worker_manager_test.c'; fi` ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.o: ags/test/plugin/ags_lv2ui_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Tpo -c -o ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.o `test -f 'ags/test/plugin/ags_lv2ui_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2ui_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2ui_manager_test.c' object='ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.o `test -f 'ags/test/plugin/ags_lv2ui_manager_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2ui_manager_test.c ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.obj: ags/test/plugin/ags_lv2ui_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Tpo -c -o ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2ui_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2ui_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2ui_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Tpo ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2ui_manager_test.c' object='ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2ui_manager_test-ags_lv2ui_manager_test.obj `if test -f 'ags/test/plugin/ags_lv2ui_manager_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2ui_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2ui_manager_test.c'; fi` ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.o: ags/test/plugin/ags_lv2ui_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Tpo -c -o ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.o `test -f 'ags/test/plugin/ags_lv2ui_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2ui_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2ui_plugin_test.c' object='ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.o `test -f 'ags/test/plugin/ags_lv2ui_plugin_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_lv2ui_plugin_test.c ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.obj: ags/test/plugin/ags_lv2ui_plugin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_plugin_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Tpo -c -o ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.obj `if test -f 'ags/test/plugin/ags_lv2ui_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2ui_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2ui_plugin_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Tpo ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_lv2ui_plugin_test.c' object='ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_lv2ui_plugin_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/lv2ui_plugin_test-ags_lv2ui_plugin_test.obj `if test -f 'ags/test/plugin/ags_lv2ui_plugin_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_lv2ui_plugin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_lv2ui_plugin_test.c'; fi` ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.o: ags/test/audio/midi/ags_midi_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.o -MD -MP -MF ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Tpo -c -o ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.o `test -f 'ags/test/audio/midi/ags_midi_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/midi/ags_midi_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Tpo ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/midi/ags_midi_buffer_util_test.c' object='ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.o `test -f 'ags/test/audio/midi/ags_midi_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/midi/ags_midi_buffer_util_test.c ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.obj: ags/test/audio/midi/ags_midi_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.obj -MD -MP -MF ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Tpo -c -o ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.obj `if test -f 'ags/test/audio/midi/ags_midi_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/midi/ags_midi_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/midi/ags_midi_buffer_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Tpo ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/midi/ags_midi_buffer_util_test.c' object='ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/midi_buffer_util_test-ags_midi_buffer_util_test.obj `if test -f 'ags/test/audio/midi/ags_midi_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/midi/ags_midi_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/midi/ags_midi_buffer_util_test.c'; fi` ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.o: ags/test/audio/midi/ags_midi_builder_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_builder_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.o -MD -MP -MF ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Tpo -c -o ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.o `test -f 'ags/test/audio/midi/ags_midi_builder_test.c' || echo '$(srcdir)/'`ags/test/audio/midi/ags_midi_builder_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Tpo ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/midi/ags_midi_builder_test.c' object='ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_builder_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.o `test -f 'ags/test/audio/midi/ags_midi_builder_test.c' || echo '$(srcdir)/'`ags/test/audio/midi/ags_midi_builder_test.c ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.obj: ags/test/audio/midi/ags_midi_builder_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_builder_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.obj -MD -MP -MF ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Tpo -c -o ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.obj `if test -f 'ags/test/audio/midi/ags_midi_builder_test.c'; then $(CYGPATH_W) 'ags/test/audio/midi/ags_midi_builder_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/midi/ags_midi_builder_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Tpo ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/midi/ags_midi_builder_test.c' object='ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_builder_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi/midi_builder_test-ags_midi_builder_test.obj `if test -f 'ags/test/audio/midi/ags_midi_builder_test.c'; then $(CYGPATH_W) 'ags/test/audio/midi/ags_midi_builder_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/midi/ags_midi_builder_test.c'; fi` ags/test/audio/midi_test-ags_midi_test.o: ags/test/audio/ags_midi_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midi_test-ags_midi_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Tpo -c -o ags/test/audio/midi_test-ags_midi_test.o `test -f 'ags/test/audio/ags_midi_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_midi_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Tpo ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_midi_test.c' object='ags/test/audio/midi_test-ags_midi_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi_test-ags_midi_test.o `test -f 'ags/test/audio/ags_midi_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_midi_test.c ags/test/audio/midi_test-ags_midi_test.obj: ags/test/audio/ags_midi_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midi_test-ags_midi_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Tpo -c -o ags/test/audio/midi_test-ags_midi_test.obj `if test -f 'ags/test/audio/ags_midi_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_midi_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_midi_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Tpo ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_midi_test.c' object='ags/test/audio/midi_test-ags_midi_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midi_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midi_test-ags_midi_test.obj `if test -f 'ags/test/audio/ags_midi_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_midi_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_midi_test.c'; fi` ags/test/audio/midiin_test-ags_midiin_test.o: ags/test/audio/ags_midiin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midiin_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midiin_test-ags_midiin_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Tpo -c -o ags/test/audio/midiin_test-ags_midiin_test.o `test -f 'ags/test/audio/ags_midiin_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_midiin_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Tpo ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_midiin_test.c' object='ags/test/audio/midiin_test-ags_midiin_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midiin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midiin_test-ags_midiin_test.o `test -f 'ags/test/audio/ags_midiin_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_midiin_test.c ags/test/audio/midiin_test-ags_midiin_test.obj: ags/test/audio/ags_midiin_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midiin_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/midiin_test-ags_midiin_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Tpo -c -o ags/test/audio/midiin_test-ags_midiin_test.obj `if test -f 'ags/test/audio/ags_midiin_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_midiin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_midiin_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Tpo ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_midiin_test.c' object='ags/test/audio/midiin_test-ags_midiin_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_midiin_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/midiin_test-ags_midiin_test.obj `if test -f 'ags/test/audio/ags_midiin_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_midiin_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_midiin_test.c'; fi` ags/test/audio/task/move_note_test-ags_move_note_test.o: ags/test/audio/task/ags_move_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_move_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/move_note_test-ags_move_note_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Tpo -c -o ags/test/audio/task/move_note_test-ags_move_note_test.o `test -f 'ags/test/audio/task/ags_move_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_move_note_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Tpo ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_move_note_test.c' object='ags/test/audio/task/move_note_test-ags_move_note_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_move_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/move_note_test-ags_move_note_test.o `test -f 'ags/test/audio/task/ags_move_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_move_note_test.c ags/test/audio/task/move_note_test-ags_move_note_test.obj: ags/test/audio/task/ags_move_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_move_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/move_note_test-ags_move_note_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Tpo -c -o ags/test/audio/task/move_note_test-ags_move_note_test.obj `if test -f 'ags/test/audio/task/ags_move_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_move_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_move_note_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Tpo ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_move_note_test.c' object='ags/test/audio/task/move_note_test-ags_move_note_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_move_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/move_note_test-ags_move_note_test.obj `if test -f 'ags/test/audio/task/ags_move_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_move_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_move_note_test.c'; fi` ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.o: ags/test/audio/recall/ags_mute_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Tpo -c -o ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_mute_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_mute_audio_signal_test.c' object='ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_mute_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_audio_signal_test.c ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.obj: ags/test/audio/recall/ags_mute_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Tpo -c -o ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_mute_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_mute_audio_signal_test.c' object='ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/mute_audio_signal_test-ags_mute_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_mute_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_audio_signal_test.c'; fi` ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.o: ags/test/audio/recall/ags_mute_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Tpo -c -o ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.o `test -f 'ags/test/audio/recall/ags_mute_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_mute_audio_test.c' object='ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.o `test -f 'ags/test/audio/recall/ags_mute_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_audio_test.c ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.obj: ags/test/audio/recall/ags_mute_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Tpo -c -o ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.obj `if test -f 'ags/test/audio/recall/ags_mute_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_mute_audio_test.c' object='ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/mute_audio_test-ags_mute_audio_test.obj `if test -f 'ags/test/audio/recall/ags_mute_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_audio_test.c'; fi` ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.o: ags/test/audio/recall/ags_mute_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Tpo -c -o ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.o `test -f 'ags/test/audio/recall/ags_mute_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_mute_channel_test.c' object='ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.o `test -f 'ags/test/audio/recall/ags_mute_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_mute_channel_test.c ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.obj: ags/test/audio/recall/ags_mute_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Tpo -c -o ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.obj `if test -f 'ags/test/audio/recall/ags_mute_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_mute_channel_test.c' object='ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_mute_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/mute_channel_test-ags_mute_channel_test.obj `if test -f 'ags/test/audio/recall/ags_mute_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_mute_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_mute_channel_test.c'; fi` ags/test/audio/notation_test-ags_notation_test.o: ags/test/audio/ags_notation_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_notation_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/notation_test-ags_notation_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Tpo -c -o ags/test/audio/notation_test-ags_notation_test.o `test -f 'ags/test/audio/ags_notation_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_notation_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Tpo ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_notation_test.c' object='ags/test/audio/notation_test-ags_notation_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_notation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/notation_test-ags_notation_test.o `test -f 'ags/test/audio/ags_notation_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_notation_test.c ags/test/audio/notation_test-ags_notation_test.obj: ags/test/audio/ags_notation_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_notation_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/notation_test-ags_notation_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Tpo -c -o ags/test/audio/notation_test-ags_notation_test.obj `if test -f 'ags/test/audio/ags_notation_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_notation_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_notation_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Tpo ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_notation_test.c' object='ags/test/audio/notation_test-ags_notation_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_notation_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/notation_test-ags_notation_test.obj `if test -f 'ags/test/audio/ags_notation_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_notation_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_notation_test.c'; fi` ags/test/audio/note_test-ags_note_test.o: ags/test/audio/ags_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/note_test-ags_note_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Tpo -c -o ags/test/audio/note_test-ags_note_test.o `test -f 'ags/test/audio/ags_note_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_note_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Tpo ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_note_test.c' object='ags/test/audio/note_test-ags_note_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/note_test-ags_note_test.o `test -f 'ags/test/audio/ags_note_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_note_test.c ags/test/audio/note_test-ags_note_test.obj: ags/test/audio/ags_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/note_test-ags_note_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Tpo -c -o ags/test/audio/note_test-ags_note_test.obj `if test -f 'ags/test/audio/ags_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_note_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Tpo ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_note_test.c' object='ags/test/audio/note_test-ags_note_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/note_test-ags_note_test.obj `if test -f 'ags/test/audio/ags_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_note_test.c'; fi` ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.o: ags/test/audio/osc/controller/ags_osc_action_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_action_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_action_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_action_controller_test.c' object='ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_action_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_action_controller_test.c ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.obj: ags/test/audio/osc/controller/ags_osc_action_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_action_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_action_controller_test.c' object='ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_action_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_action_controller_test-ags_osc_action_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_action_controller_test.c'; fi` ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.o: ags/test/audio/osc/ags_osc_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Tpo -c -o ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.o `test -f 'ags/test/audio/osc/ags_osc_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_buffer_util_test.c' object='ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.o `test -f 'ags/test/audio/osc/ags_osc_buffer_util_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_buffer_util_test.c ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.obj: ags/test/audio/osc/ags_osc_buffer_util_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_buffer_util_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Tpo -c -o ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.obj `if test -f 'ags/test/audio/osc/ags_osc_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_buffer_util_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_buffer_util_test.c' object='ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_buffer_util_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_buffer_util_test-ags_osc_buffer_util_test.obj `if test -f 'ags/test/audio/osc/ags_osc_buffer_util_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_buffer_util_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_buffer_util_test.c'; fi` ags/test/audio/osc/osc_client_test-ags_osc_client_test.o: ags/test/audio/osc/ags_osc_client_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_client_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_client_test-ags_osc_client_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Tpo -c -o ags/test/audio/osc/osc_client_test-ags_osc_client_test.o `test -f 'ags/test/audio/osc/ags_osc_client_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_client_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_client_test.c' object='ags/test/audio/osc/osc_client_test-ags_osc_client_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_client_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_client_test-ags_osc_client_test.o `test -f 'ags/test/audio/osc/ags_osc_client_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_client_test.c ags/test/audio/osc/osc_client_test-ags_osc_client_test.obj: ags/test/audio/osc/ags_osc_client_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_client_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_client_test-ags_osc_client_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Tpo -c -o ags/test/audio/osc/osc_client_test-ags_osc_client_test.obj `if test -f 'ags/test/audio/osc/ags_osc_client_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_client_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_client_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_client_test.c' object='ags/test/audio/osc/osc_client_test-ags_osc_client_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_client_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_client_test-ags_osc_client_test.obj `if test -f 'ags/test/audio/osc/ags_osc_client_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_client_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_client_test.c'; fi` ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.o: ags/test/audio/osc/controller/ags_osc_config_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_config_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_config_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_config_controller_test.c' object='ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_config_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_config_controller_test.c ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.obj: ags/test/audio/osc/controller/ags_osc_config_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_config_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_config_controller_test.c' object='ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_config_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_config_controller_test-ags_osc_config_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_config_controller_test.c'; fi` ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.o: ags/test/audio/osc/ags_osc_connection_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_connection_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Tpo -c -o ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.o `test -f 'ags/test/audio/osc/ags_osc_connection_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_connection_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_connection_test.c' object='ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.o `test -f 'ags/test/audio/osc/ags_osc_connection_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_connection_test.c ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.obj: ags/test/audio/osc/ags_osc_connection_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_connection_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Tpo -c -o ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.obj `if test -f 'ags/test/audio/osc/ags_osc_connection_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_connection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_connection_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_connection_test.c' object='ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_connection_test-ags_osc_connection_test.obj `if test -f 'ags/test/audio/osc/ags_osc_connection_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_connection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_connection_test.c'; fi` ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.o: ags/test/audio/osc/controller/ags_osc_front_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_front_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_front_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_front_controller_test.c' object='ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_front_controller_test.c ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.obj: ags/test/audio/osc/controller/ags_osc_front_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_front_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_front_controller_test.c' object='ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_front_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_front_controller_test-ags_osc_front_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_front_controller_test.c'; fi` ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.o: ags/test/audio/osc/controller/ags_osc_info_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_info_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_info_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_info_controller_test.c' object='ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_info_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_info_controller_test.c ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.obj: ags/test/audio/osc/controller/ags_osc_info_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_info_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_info_controller_test.c' object='ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_info_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_info_controller_test-ags_osc_info_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_info_controller_test.c'; fi` ags/test/audio/osc/osc_message_test-ags_osc_message_test.o: ags/test/audio/osc/ags_osc_message_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_message_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_message_test-ags_osc_message_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Tpo -c -o ags/test/audio/osc/osc_message_test-ags_osc_message_test.o `test -f 'ags/test/audio/osc/ags_osc_message_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_message_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_message_test.c' object='ags/test/audio/osc/osc_message_test-ags_osc_message_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_message_test-ags_osc_message_test.o `test -f 'ags/test/audio/osc/ags_osc_message_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_message_test.c ags/test/audio/osc/osc_message_test-ags_osc_message_test.obj: ags/test/audio/osc/ags_osc_message_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_message_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_message_test-ags_osc_message_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Tpo -c -o ags/test/audio/osc/osc_message_test-ags_osc_message_test.obj `if test -f 'ags/test/audio/osc/ags_osc_message_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_message_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_message_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_message_test.c' object='ags/test/audio/osc/osc_message_test-ags_osc_message_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_message_test-ags_osc_message_test.obj `if test -f 'ags/test/audio/osc/ags_osc_message_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_message_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_message_test.c'; fi` ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.o: ags/test/audio/osc/controller/ags_osc_meter_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_meter_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_meter_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_meter_controller_test.c' object='ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_meter_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_meter_controller_test.c ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.obj: ags/test/audio/osc/controller/ags_osc_meter_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_meter_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_meter_controller_test.c' object='ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_meter_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_meter_controller_test-ags_osc_meter_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_meter_controller_test.c'; fi` ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.o: ags/test/audio/osc/controller/ags_osc_node_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_node_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_node_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_node_controller_test.c' object='ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_node_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_node_controller_test.c ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.obj: ags/test/audio/osc/controller/ags_osc_node_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_node_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_node_controller_test.c' object='ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_node_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_node_controller_test-ags_osc_node_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_node_controller_test.c'; fi` ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.o: ags/test/audio/osc/controller/ags_osc_renew_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_renew_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_renew_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_renew_controller_test.c' object='ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_renew_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_renew_controller_test.c ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.obj: ags/test/audio/osc/controller/ags_osc_renew_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_renew_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_renew_controller_test.c' object='ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_renew_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_renew_controller_test-ags_osc_renew_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_renew_controller_test.c'; fi` ags/test/audio/osc/osc_server_test-ags_osc_server_test.o: ags/test/audio/osc/ags_osc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_server_test-ags_osc_server_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Tpo -c -o ags/test/audio/osc/osc_server_test-ags_osc_server_test.o `test -f 'ags/test/audio/osc/ags_osc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_server_test.c' object='ags/test/audio/osc/osc_server_test-ags_osc_server_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_server_test-ags_osc_server_test.o `test -f 'ags/test/audio/osc/ags_osc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_server_test.c ags/test/audio/osc/osc_server_test-ags_osc_server_test.obj: ags/test/audio/osc/ags_osc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_server_test-ags_osc_server_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Tpo -c -o ags/test/audio/osc/osc_server_test-ags_osc_server_test.obj `if test -f 'ags/test/audio/osc/ags_osc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_server_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_server_test.c' object='ags/test/audio/osc/osc_server_test-ags_osc_server_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_server_test-ags_osc_server_test.obj `if test -f 'ags/test/audio/osc/ags_osc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_server_test.c'; fi` ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.o: ags/test/audio/osc/controller/ags_osc_status_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_status_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.o -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_status_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_status_controller_test.c' object='ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_status_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.o `test -f 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/controller/ags_osc_status_controller_test.c ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.obj: ags/test/audio/osc/controller/ags_osc_status_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_status_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.obj -MD -MP -MF ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Tpo -c -o ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Tpo ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/controller/ags_osc_status_controller_test.c' object='ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_status_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/controller/osc_status_controller_test-ags_osc_status_controller_test.obj `if test -f 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/controller/ags_osc_status_controller_test.c'; fi` ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.o: ags/test/audio/osc/ags_osc_websocket_connection_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_websocket_connection_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Tpo -c -o ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.o `test -f 'ags/test/audio/osc/ags_osc_websocket_connection_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_websocket_connection_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_websocket_connection_test.c' object='ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_websocket_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.o `test -f 'ags/test/audio/osc/ags_osc_websocket_connection_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_websocket_connection_test.c ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.obj: ags/test/audio/osc/ags_osc_websocket_connection_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_websocket_connection_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Tpo -c -o ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.obj `if test -f 'ags/test/audio/osc/ags_osc_websocket_connection_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_websocket_connection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_websocket_connection_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_websocket_connection_test.c' object='ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_websocket_connection_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_websocket_connection_test-ags_osc_websocket_connection_test.obj `if test -f 'ags/test/audio/osc/ags_osc_websocket_connection_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_websocket_connection_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_websocket_connection_test.c'; fi` ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o: ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o -MD -MP -MF ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Tpo -c -o ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o `test -f 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Tpo ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c' object='ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.o `test -f 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj: ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj -MD -MP -MF ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Tpo -c -o ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj `if test -f 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Tpo ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c' object='ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_controller_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/xmlrpc/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.obj `if test -f 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/xmlrpc/ags_osc_xmlrpc_controller_test.c'; fi` ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o: ags/test/audio/osc/ags_osc_xmlrpc_message_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Tpo -c -o ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o `test -f 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_xmlrpc_message_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_xmlrpc_message_test.c' object='ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.o `test -f 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_xmlrpc_message_test.c ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj: ags/test/audio/osc/ags_osc_xmlrpc_message_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Tpo -c -o ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj `if test -f 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_xmlrpc_message_test.c' object='ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_message_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.obj `if test -f 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_xmlrpc_message_test.c'; fi` ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o: ags/test/audio/osc/ags_osc_xmlrpc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Tpo -c -o ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o `test -f 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_xmlrpc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_xmlrpc_server_test.c' object='ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.o `test -f 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c' || echo '$(srcdir)/'`ags/test/audio/osc/ags_osc_xmlrpc_server_test.c ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj: ags/test/audio/osc/ags_osc_xmlrpc_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj -MD -MP -MF ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Tpo -c -o ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj `if test -f 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Tpo ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/osc/ags_osc_xmlrpc_server_test.c' object='ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_osc_xmlrpc_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/osc/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.obj `if test -f 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; then $(CYGPATH_W) 'ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/osc/ags_osc_xmlrpc_server_test.c'; fi` ags/test/audio/output_test-ags_output_test.o: ags/test/audio/ags_output_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_output_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/output_test-ags_output_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Tpo -c -o ags/test/audio/output_test-ags_output_test.o `test -f 'ags/test/audio/ags_output_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_output_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Tpo ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_output_test.c' object='ags/test/audio/output_test-ags_output_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/output_test-ags_output_test.o `test -f 'ags/test/audio/ags_output_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_output_test.c ags/test/audio/output_test-ags_output_test.obj: ags/test/audio/ags_output_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_output_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/output_test-ags_output_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Tpo -c -o ags/test/audio/output_test-ags_output_test.obj `if test -f 'ags/test/audio/ags_output_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_output_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_output_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Tpo ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_output_test.c' object='ags/test/audio/output_test-ags_output_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_output_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/output_test-ags_output_test.obj `if test -f 'ags/test/audio/ags_output_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_output_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_output_test.c'; fi` ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.o: ags/test/server/security/ags_password_store_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_password_store_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Tpo -c -o ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.o `test -f 'ags/test/server/security/ags_password_store_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_password_store_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Tpo ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_password_store_manager_test.c' object='ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_password_store_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.o `test -f 'ags/test/server/security/ags_password_store_manager_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_password_store_manager_test.c ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.obj: ags/test/server/security/ags_password_store_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_password_store_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Tpo -c -o ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.obj `if test -f 'ags/test/server/security/ags_password_store_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_password_store_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_password_store_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Tpo ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_password_store_manager_test.c' object='ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_password_store_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/password_store_manager_test-ags_password_store_manager_test.obj `if test -f 'ags/test/server/security/ags_password_store_manager_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_password_store_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_password_store_manager_test.c'; fi` ags/test/audio/pattern_test-ags_pattern_test.o: ags/test/audio/ags_pattern_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_pattern_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/pattern_test-ags_pattern_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Tpo -c -o ags/test/audio/pattern_test-ags_pattern_test.o `test -f 'ags/test/audio/ags_pattern_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_pattern_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Tpo ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_pattern_test.c' object='ags/test/audio/pattern_test-ags_pattern_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_pattern_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/pattern_test-ags_pattern_test.o `test -f 'ags/test/audio/ags_pattern_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_pattern_test.c ags/test/audio/pattern_test-ags_pattern_test.obj: ags/test/audio/ags_pattern_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_pattern_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/pattern_test-ags_pattern_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Tpo -c -o ags/test/audio/pattern_test-ags_pattern_test.obj `if test -f 'ags/test/audio/ags_pattern_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_pattern_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_pattern_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Tpo ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_pattern_test.c' object='ags/test/audio/pattern_test-ags_pattern_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_pattern_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/pattern_test-ags_pattern_test.obj `if test -f 'ags/test/audio/ags_pattern_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_pattern_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_pattern_test.c'; fi` ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.o: ags/test/audio/recall/ags_peak_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Tpo -c -o ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_peak_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_peak_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_peak_audio_signal_test.c' object='ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_peak_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_peak_audio_signal_test.c ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.obj: ags/test/audio/recall/ags_peak_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Tpo -c -o ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_peak_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_peak_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_peak_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_peak_audio_signal_test.c' object='ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/peak_audio_signal_test-ags_peak_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_peak_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_peak_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_peak_audio_signal_test.c'; fi` ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.o: ags/test/audio/recall/ags_peak_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Tpo -c -o ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.o `test -f 'ags/test/audio/recall/ags_peak_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_peak_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_peak_channel_test.c' object='ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.o `test -f 'ags/test/audio/recall/ags_peak_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_peak_channel_test.c ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.obj: ags/test/audio/recall/ags_peak_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Tpo -c -o ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.obj `if test -f 'ags/test/audio/recall/ags_peak_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_peak_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_peak_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_peak_channel_test.c' object='ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_peak_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/peak_channel_test-ags_peak_channel_test.obj `if test -f 'ags/test/audio/recall/ags_peak_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_peak_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_peak_channel_test.c'; fi` ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.o: ags/test/audio/recall/ags_play_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Tpo -c -o ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_play_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_audio_signal_test.c' object='ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_play_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_audio_signal_test.c ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.obj: ags/test/audio/recall/ags_play_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Tpo -c -o ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_play_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_audio_signal_test.c' object='ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_audio_signal_test-ags_play_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_play_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_audio_signal_test.c'; fi` ags/test/audio/recall/play_audio_test-ags_play_audio_test.o: ags/test/audio/recall/ags_play_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_audio_test-ags_play_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Tpo -c -o ags/test/audio/recall/play_audio_test-ags_play_audio_test.o `test -f 'ags/test/audio/recall/ags_play_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_audio_test.c' object='ags/test/audio/recall/play_audio_test-ags_play_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_audio_test-ags_play_audio_test.o `test -f 'ags/test/audio/recall/ags_play_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_audio_test.c ags/test/audio/recall/play_audio_test-ags_play_audio_test.obj: ags/test/audio/recall/ags_play_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_audio_test-ags_play_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Tpo -c -o ags/test/audio/recall/play_audio_test-ags_play_audio_test.obj `if test -f 'ags/test/audio/recall/ags_play_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_audio_test.c' object='ags/test/audio/recall/play_audio_test-ags_play_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_audio_test-ags_play_audio_test.obj `if test -f 'ags/test/audio/recall/ags_play_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_audio_test.c'; fi` ags/test/audio/recall/play_channel_test-ags_play_channel_test.o: ags/test/audio/recall/ags_play_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_channel_test-ags_play_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Tpo -c -o ags/test/audio/recall/play_channel_test-ags_play_channel_test.o `test -f 'ags/test/audio/recall/ags_play_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_channel_test.c' object='ags/test/audio/recall/play_channel_test-ags_play_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_channel_test-ags_play_channel_test.o `test -f 'ags/test/audio/recall/ags_play_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_channel_test.c ags/test/audio/recall/play_channel_test-ags_play_channel_test.obj: ags/test/audio/recall/ags_play_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_channel_test-ags_play_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Tpo -c -o ags/test/audio/recall/play_channel_test-ags_play_channel_test.obj `if test -f 'ags/test/audio/recall/ags_play_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_channel_test.c' object='ags/test/audio/recall/play_channel_test-ags_play_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_channel_test-ags_play_channel_test.obj `if test -f 'ags/test/audio/recall/ags_play_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_channel_test.c'; fi` ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.o: ags/test/audio/recall/ags_play_wave_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Tpo -c -o ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.o `test -f 'ags/test/audio/recall/ags_play_wave_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_wave_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_wave_audio_test.c' object='ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.o `test -f 'ags/test/audio/recall/ags_play_wave_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_wave_audio_test.c ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.obj: ags/test/audio/recall/ags_play_wave_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Tpo -c -o ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.obj `if test -f 'ags/test/audio/recall/ags_play_wave_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_wave_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_wave_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_wave_audio_test.c' object='ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_wave_audio_test-ags_play_wave_audio_test.obj `if test -f 'ags/test/audio/recall/ags_play_wave_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_wave_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_wave_audio_test.c'; fi` ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.o: ags/test/audio/recall/ags_play_wave_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Tpo -c -o ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.o `test -f 'ags/test/audio/recall/ags_play_wave_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_wave_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_wave_channel_test.c' object='ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.o `test -f 'ags/test/audio/recall/ags_play_wave_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_play_wave_channel_test.c ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.obj: ags/test/audio/recall/ags_play_wave_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Tpo -c -o ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.obj `if test -f 'ags/test/audio/recall/ags_play_wave_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_wave_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_wave_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_play_wave_channel_test.c' object='ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_play_wave_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/play_wave_channel_test-ags_play_wave_channel_test.obj `if test -f 'ags/test/audio/recall/ags_play_wave_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_play_wave_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_play_wave_channel_test.c'; fi` ags/test/audio/playback_domain_test-ags_playback_domain_test.o: ags/test/audio/ags_playback_domain_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_domain_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/playback_domain_test-ags_playback_domain_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Tpo -c -o ags/test/audio/playback_domain_test-ags_playback_domain_test.o `test -f 'ags/test/audio/ags_playback_domain_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_playback_domain_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Tpo ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_playback_domain_test.c' object='ags/test/audio/playback_domain_test-ags_playback_domain_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_domain_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/playback_domain_test-ags_playback_domain_test.o `test -f 'ags/test/audio/ags_playback_domain_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_playback_domain_test.c ags/test/audio/playback_domain_test-ags_playback_domain_test.obj: ags/test/audio/ags_playback_domain_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_domain_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/playback_domain_test-ags_playback_domain_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Tpo -c -o ags/test/audio/playback_domain_test-ags_playback_domain_test.obj `if test -f 'ags/test/audio/ags_playback_domain_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_playback_domain_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_playback_domain_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Tpo ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_playback_domain_test.c' object='ags/test/audio/playback_domain_test-ags_playback_domain_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_domain_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/playback_domain_test-ags_playback_domain_test.obj `if test -f 'ags/test/audio/ags_playback_domain_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_playback_domain_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_playback_domain_test.c'; fi` ags/test/audio/playback_test-ags_playback_test.o: ags/test/audio/ags_playback_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/playback_test-ags_playback_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Tpo -c -o ags/test/audio/playback_test-ags_playback_test.o `test -f 'ags/test/audio/ags_playback_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_playback_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Tpo ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_playback_test.c' object='ags/test/audio/playback_test-ags_playback_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/playback_test-ags_playback_test.o `test -f 'ags/test/audio/ags_playback_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_playback_test.c ags/test/audio/playback_test-ags_playback_test.obj: ags/test/audio/ags_playback_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/playback_test-ags_playback_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Tpo -c -o ags/test/audio/playback_test-ags_playback_test.obj `if test -f 'ags/test/audio/ags_playback_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_playback_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_playback_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Tpo ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_playback_test.c' object='ags/test/audio/playback_test-ags_playback_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_playback_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/playback_test-ags_playback_test.obj `if test -f 'ags/test/audio/ags_playback_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_playback_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_playback_test.c'; fi` ags/test/plugin/plugin_port_test-ags_plugin_port_test.o: ags/test/plugin/ags_plugin_port_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_plugin_port_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/plugin_port_test-ags_plugin_port_test.o -MD -MP -MF ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Tpo -c -o ags/test/plugin/plugin_port_test-ags_plugin_port_test.o `test -f 'ags/test/plugin/ags_plugin_port_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_plugin_port_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Tpo ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_plugin_port_test.c' object='ags/test/plugin/plugin_port_test-ags_plugin_port_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_plugin_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/plugin_port_test-ags_plugin_port_test.o `test -f 'ags/test/plugin/ags_plugin_port_test.c' || echo '$(srcdir)/'`ags/test/plugin/ags_plugin_port_test.c ags/test/plugin/plugin_port_test-ags_plugin_port_test.obj: ags/test/plugin/ags_plugin_port_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_plugin_port_test_CFLAGS) $(CFLAGS) -MT ags/test/plugin/plugin_port_test-ags_plugin_port_test.obj -MD -MP -MF ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Tpo -c -o ags/test/plugin/plugin_port_test-ags_plugin_port_test.obj `if test -f 'ags/test/plugin/ags_plugin_port_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_plugin_port_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_plugin_port_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Tpo ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/plugin/ags_plugin_port_test.c' object='ags/test/plugin/plugin_port_test-ags_plugin_port_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_plugin_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/plugin/plugin_port_test-ags_plugin_port_test.obj `if test -f 'ags/test/plugin/ags_plugin_port_test.c'; then $(CYGPATH_W) 'ags/test/plugin/ags_plugin_port_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/plugin/ags_plugin_port_test.c'; fi` ags/test/audio/port_test-ags_port_test.o: ags/test/audio/ags_port_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_port_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/port_test-ags_port_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Tpo -c -o ags/test/audio/port_test-ags_port_test.o `test -f 'ags/test/audio/ags_port_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_port_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Tpo ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_port_test.c' object='ags/test/audio/port_test-ags_port_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/port_test-ags_port_test.o `test -f 'ags/test/audio/ags_port_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_port_test.c ags/test/audio/port_test-ags_port_test.obj: ags/test/audio/ags_port_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_port_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/port_test-ags_port_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Tpo -c -o ags/test/audio/port_test-ags_port_test.obj `if test -f 'ags/test/audio/ags_port_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_port_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_port_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Tpo ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_port_test.c' object='ags/test/audio/port_test-ags_port_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_port_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/port_test-ags_port_test.obj `if test -f 'ags/test/audio/ags_port_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_port_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_port_test.c'; fi` ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.o: ags/test/audio/recall/ags_prepare_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_prepare_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Tpo -c -o ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_prepare_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_prepare_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_prepare_audio_signal_test.c' object='ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_prepare_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_prepare_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_prepare_audio_signal_test.c ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.obj: ags/test/audio/recall/ags_prepare_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_prepare_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Tpo -c -o ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_prepare_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_prepare_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_prepare_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_prepare_audio_signal_test.c' object='ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_prepare_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/prepare_audio_signal_test-ags_prepare_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_prepare_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_prepare_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_prepare_audio_signal_test.c'; fi` ags/test/audio/preset_test-ags_preset_test.o: ags/test/audio/ags_preset_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_preset_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/preset_test-ags_preset_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Tpo -c -o ags/test/audio/preset_test-ags_preset_test.o `test -f 'ags/test/audio/ags_preset_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_preset_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Tpo ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_preset_test.c' object='ags/test/audio/preset_test-ags_preset_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/preset_test-ags_preset_test.o `test -f 'ags/test/audio/ags_preset_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_preset_test.c ags/test/audio/preset_test-ags_preset_test.obj: ags/test/audio/ags_preset_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_preset_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/preset_test-ags_preset_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Tpo -c -o ags/test/audio/preset_test-ags_preset_test.obj `if test -f 'ags/test/audio/ags_preset_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_preset_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_preset_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Tpo ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_preset_test.c' object='ags/test/audio/preset_test-ags_preset_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_preset_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/preset_test-ags_preset_test.obj `if test -f 'ags/test/audio/ags_preset_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_preset_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_preset_test.c'; fi` ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.o: ags/test/audio/ags_recall_channel_run_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_run_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Tpo -c -o ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.o `test -f 'ags/test/audio/ags_recall_channel_run_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_channel_run_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Tpo ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_channel_run_test.c' object='ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_run_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.o `test -f 'ags/test/audio/ags_recall_channel_run_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_channel_run_test.c ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.obj: ags/test/audio/ags_recall_channel_run_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_run_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Tpo -c -o ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.obj `if test -f 'ags/test/audio/ags_recall_channel_run_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_channel_run_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_channel_run_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Tpo ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_channel_run_test.c' object='ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_run_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_channel_run_test-ags_recall_channel_run_test.obj `if test -f 'ags/test/audio/ags_recall_channel_run_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_channel_run_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_channel_run_test.c'; fi` ags/test/audio/recall_channel_test-ags_recall_channel_test.o: ags/test/audio/ags_recall_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_channel_test-ags_recall_channel_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Tpo -c -o ags/test/audio/recall_channel_test-ags_recall_channel_test.o `test -f 'ags/test/audio/ags_recall_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Tpo ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_channel_test.c' object='ags/test/audio/recall_channel_test-ags_recall_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_channel_test-ags_recall_channel_test.o `test -f 'ags/test/audio/ags_recall_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_channel_test.c ags/test/audio/recall_channel_test-ags_recall_channel_test.obj: ags/test/audio/ags_recall_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_channel_test-ags_recall_channel_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Tpo -c -o ags/test/audio/recall_channel_test-ags_recall_channel_test.obj `if test -f 'ags/test/audio/ags_recall_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Tpo ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_channel_test.c' object='ags/test/audio/recall_channel_test-ags_recall_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_channel_test-ags_recall_channel_test.obj `if test -f 'ags/test/audio/ags_recall_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_channel_test.c'; fi` ags/test/audio/recall_container_test-ags_recall_container_test.o: ags/test/audio/ags_recall_container_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_container_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_container_test-ags_recall_container_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Tpo -c -o ags/test/audio/recall_container_test-ags_recall_container_test.o `test -f 'ags/test/audio/ags_recall_container_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_container_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Tpo ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_container_test.c' object='ags/test/audio/recall_container_test-ags_recall_container_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_container_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_container_test-ags_recall_container_test.o `test -f 'ags/test/audio/ags_recall_container_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_container_test.c ags/test/audio/recall_container_test-ags_recall_container_test.obj: ags/test/audio/ags_recall_container_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_container_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_container_test-ags_recall_container_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Tpo -c -o ags/test/audio/recall_container_test-ags_recall_container_test.obj `if test -f 'ags/test/audio/ags_recall_container_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_container_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_container_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Tpo ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_container_test.c' object='ags/test/audio/recall_container_test-ags_recall_container_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_container_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_container_test-ags_recall_container_test.obj `if test -f 'ags/test/audio/ags_recall_container_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_container_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_container_test.c'; fi` ags/test/audio/recall_dependency_test-ags_recall_dependency_test.o: ags/test/audio/ags_recall_dependency_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_dependency_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_dependency_test-ags_recall_dependency_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Tpo -c -o ags/test/audio/recall_dependency_test-ags_recall_dependency_test.o `test -f 'ags/test/audio/ags_recall_dependency_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_dependency_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Tpo ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_dependency_test.c' object='ags/test/audio/recall_dependency_test-ags_recall_dependency_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_dependency_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_dependency_test-ags_recall_dependency_test.o `test -f 'ags/test/audio/ags_recall_dependency_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_dependency_test.c ags/test/audio/recall_dependency_test-ags_recall_dependency_test.obj: ags/test/audio/ags_recall_dependency_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_dependency_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_dependency_test-ags_recall_dependency_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Tpo -c -o ags/test/audio/recall_dependency_test-ags_recall_dependency_test.obj `if test -f 'ags/test/audio/ags_recall_dependency_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_dependency_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_dependency_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Tpo ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_dependency_test.c' object='ags/test/audio/recall_dependency_test-ags_recall_dependency_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_dependency_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_dependency_test-ags_recall_dependency_test.obj `if test -f 'ags/test/audio/ags_recall_dependency_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_dependency_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_dependency_test.c'; fi` ags/test/audio/recall_id_test-ags_recall_id_test.o: ags/test/audio/ags_recall_id_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_id_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_id_test-ags_recall_id_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Tpo -c -o ags/test/audio/recall_id_test-ags_recall_id_test.o `test -f 'ags/test/audio/ags_recall_id_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_id_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Tpo ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_id_test.c' object='ags/test/audio/recall_id_test-ags_recall_id_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_id_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_id_test-ags_recall_id_test.o `test -f 'ags/test/audio/ags_recall_id_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_id_test.c ags/test/audio/recall_id_test-ags_recall_id_test.obj: ags/test/audio/ags_recall_id_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_id_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_id_test-ags_recall_id_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Tpo -c -o ags/test/audio/recall_id_test-ags_recall_id_test.obj `if test -f 'ags/test/audio/ags_recall_id_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_id_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_id_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Tpo ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_id_test.c' object='ags/test/audio/recall_id_test-ags_recall_id_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_id_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_id_test-ags_recall_id_test.obj `if test -f 'ags/test/audio/ags_recall_id_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_id_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_id_test.c'; fi` ags/test/audio/recall_recycling_test-ags_recall_recycling_test.o: ags/test/audio/ags_recall_recycling_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_recycling_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_recycling_test-ags_recall_recycling_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Tpo -c -o ags/test/audio/recall_recycling_test-ags_recall_recycling_test.o `test -f 'ags/test/audio/ags_recall_recycling_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_recycling_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Tpo ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_recycling_test.c' object='ags/test/audio/recall_recycling_test-ags_recall_recycling_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_recycling_test-ags_recall_recycling_test.o `test -f 'ags/test/audio/ags_recall_recycling_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_recycling_test.c ags/test/audio/recall_recycling_test-ags_recall_recycling_test.obj: ags/test/audio/ags_recall_recycling_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_recycling_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_recycling_test-ags_recall_recycling_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Tpo -c -o ags/test/audio/recall_recycling_test-ags_recall_recycling_test.obj `if test -f 'ags/test/audio/ags_recall_recycling_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_recycling_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_recycling_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Tpo ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_recycling_test.c' object='ags/test/audio/recall_recycling_test-ags_recall_recycling_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_recycling_test-ags_recall_recycling_test.obj `if test -f 'ags/test/audio/ags_recall_recycling_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_recycling_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_recycling_test.c'; fi` ags/test/audio/recall_test-ags_recall_test.o: ags/test/audio/ags_recall_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_test-ags_recall_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Tpo -c -o ags/test/audio/recall_test-ags_recall_test.o `test -f 'ags/test/audio/ags_recall_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Tpo ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_test.c' object='ags/test/audio/recall_test-ags_recall_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_test-ags_recall_test.o `test -f 'ags/test/audio/ags_recall_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recall_test.c ags/test/audio/recall_test-ags_recall_test.obj: ags/test/audio/ags_recall_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall_test-ags_recall_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Tpo -c -o ags/test/audio/recall_test-ags_recall_test.obj `if test -f 'ags/test/audio/ags_recall_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Tpo ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recall_test.c' object='ags/test/audio/recall_test-ags_recall_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recall_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall_test-ags_recall_test.obj `if test -f 'ags/test/audio/ags_recall_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recall_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recall_test.c'; fi` ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.o: ags/test/audio/recall/ags_record_midi_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_record_midi_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Tpo -c -o ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.o `test -f 'ags/test/audio/recall/ags_record_midi_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_record_midi_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_record_midi_audio_test.c' object='ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_record_midi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.o `test -f 'ags/test/audio/recall/ags_record_midi_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_record_midi_audio_test.c ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.obj: ags/test/audio/recall/ags_record_midi_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_record_midi_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Tpo -c -o ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.obj `if test -f 'ags/test/audio/recall/ags_record_midi_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_record_midi_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_record_midi_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_record_midi_audio_test.c' object='ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_record_midi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/record_midi_audio_test-ags_record_midi_audio_test.obj `if test -f 'ags/test/audio/recall/ags_record_midi_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_record_midi_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_record_midi_audio_test.c'; fi` ags/test/audio/recycling_context_test-ags_recycling_context_test.o: ags/test/audio/ags_recycling_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_context_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recycling_context_test-ags_recycling_context_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Tpo -c -o ags/test/audio/recycling_context_test-ags_recycling_context_test.o `test -f 'ags/test/audio/ags_recycling_context_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recycling_context_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Tpo ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recycling_context_test.c' object='ags/test/audio/recycling_context_test-ags_recycling_context_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recycling_context_test-ags_recycling_context_test.o `test -f 'ags/test/audio/ags_recycling_context_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recycling_context_test.c ags/test/audio/recycling_context_test-ags_recycling_context_test.obj: ags/test/audio/ags_recycling_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_context_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recycling_context_test-ags_recycling_context_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Tpo -c -o ags/test/audio/recycling_context_test-ags_recycling_context_test.obj `if test -f 'ags/test/audio/ags_recycling_context_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recycling_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recycling_context_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Tpo ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recycling_context_test.c' object='ags/test/audio/recycling_context_test-ags_recycling_context_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recycling_context_test-ags_recycling_context_test.obj `if test -f 'ags/test/audio/ags_recycling_context_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recycling_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recycling_context_test.c'; fi` ags/test/audio/recycling_test-ags_recycling_test.o: ags/test/audio/ags_recycling_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recycling_test-ags_recycling_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Tpo -c -o ags/test/audio/recycling_test-ags_recycling_test.o `test -f 'ags/test/audio/ags_recycling_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recycling_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Tpo ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recycling_test.c' object='ags/test/audio/recycling_test-ags_recycling_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recycling_test-ags_recycling_test.o `test -f 'ags/test/audio/ags_recycling_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_recycling_test.c ags/test/audio/recycling_test-ags_recycling_test.obj: ags/test/audio/ags_recycling_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recycling_test-ags_recycling_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Tpo -c -o ags/test/audio/recycling_test-ags_recycling_test.obj `if test -f 'ags/test/audio/ags_recycling_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recycling_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recycling_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Tpo ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_recycling_test.c' object='ags/test/audio/recycling_test-ags_recycling_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_recycling_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recycling_test-ags_recycling_test.obj `if test -f 'ags/test/audio/ags_recycling_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_recycling_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_recycling_test.c'; fi` ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.o: ags/test/audio/task/ags_remove_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Tpo -c -o ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.o `test -f 'ags/test/audio/task/ags_remove_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_audio_signal_test.c' object='ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.o `test -f 'ags/test/audio/task/ags_remove_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_audio_signal_test.c ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.obj: ags/test/audio/task/ags_remove_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Tpo -c -o ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_remove_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_audio_signal_test.c' object='ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_audio_signal_test-ags_remove_audio_signal_test.obj `if test -f 'ags/test/audio/task/ags_remove_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_audio_signal_test.c'; fi` ags/test/audio/task/remove_audio_test-ags_remove_audio_test.o: ags/test/audio/task/ags_remove_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_audio_test-ags_remove_audio_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Tpo -c -o ags/test/audio/task/remove_audio_test-ags_remove_audio_test.o `test -f 'ags/test/audio/task/ags_remove_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_audio_test.c' object='ags/test/audio/task/remove_audio_test-ags_remove_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_audio_test-ags_remove_audio_test.o `test -f 'ags/test/audio/task/ags_remove_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_audio_test.c ags/test/audio/task/remove_audio_test-ags_remove_audio_test.obj: ags/test/audio/task/ags_remove_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_audio_test-ags_remove_audio_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Tpo -c -o ags/test/audio/task/remove_audio_test-ags_remove_audio_test.obj `if test -f 'ags/test/audio/task/ags_remove_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_audio_test.c' object='ags/test/audio/task/remove_audio_test-ags_remove_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_audio_test-ags_remove_audio_test.obj `if test -f 'ags/test/audio/task/ags_remove_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_audio_test.c'; fi` ags/test/audio/task/remove_note_test-ags_remove_note_test.o: ags/test/audio/task/ags_remove_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_note_test-ags_remove_note_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Tpo -c -o ags/test/audio/task/remove_note_test-ags_remove_note_test.o `test -f 'ags/test/audio/task/ags_remove_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_note_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_note_test.c' object='ags/test/audio/task/remove_note_test-ags_remove_note_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_note_test-ags_remove_note_test.o `test -f 'ags/test/audio/task/ags_remove_note_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_note_test.c ags/test/audio/task/remove_note_test-ags_remove_note_test.obj: ags/test/audio/task/ags_remove_note_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_note_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_note_test-ags_remove_note_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Tpo -c -o ags/test/audio/task/remove_note_test-ags_remove_note_test.obj `if test -f 'ags/test/audio/task/ags_remove_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_note_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_note_test.c' object='ags/test/audio/task/remove_note_test-ags_remove_note_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_note_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_note_test-ags_remove_note_test.obj `if test -f 'ags/test/audio/task/ags_remove_note_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_note_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_note_test.c'; fi` ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.o: ags/test/audio/task/ags_remove_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Tpo -c -o ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.o `test -f 'ags/test/audio/task/ags_remove_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_soundcard_test.c' object='ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.o `test -f 'ags/test/audio/task/ags_remove_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_remove_soundcard_test.c ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.obj: ags/test/audio/task/ags_remove_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Tpo -c -o ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_remove_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_soundcard_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Tpo ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_remove_soundcard_test.c' object='ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_remove_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/remove_soundcard_test-ags_remove_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_remove_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_remove_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_remove_soundcard_test.c'; fi` ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.o: ags/test/audio/task/ags_reset_amplitude_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_amplitude_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Tpo -c -o ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.o `test -f 'ags/test/audio/task/ags_reset_amplitude_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_reset_amplitude_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Tpo ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_reset_amplitude_test.c' object='ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_amplitude_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.o `test -f 'ags/test/audio/task/ags_reset_amplitude_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_reset_amplitude_test.c ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.obj: ags/test/audio/task/ags_reset_amplitude_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_amplitude_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Tpo -c -o ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.obj `if test -f 'ags/test/audio/task/ags_reset_amplitude_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_reset_amplitude_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_reset_amplitude_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Tpo ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_reset_amplitude_test.c' object='ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_amplitude_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/reset_amplitude_test-ags_reset_amplitude_test.obj `if test -f 'ags/test/audio/task/ags_reset_amplitude_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_reset_amplitude_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_reset_amplitude_test.c'; fi` ags/test/audio/task/reset_peak_test-ags_reset_peak_test.o: ags/test/audio/task/ags_reset_peak_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_peak_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/reset_peak_test-ags_reset_peak_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Tpo -c -o ags/test/audio/task/reset_peak_test-ags_reset_peak_test.o `test -f 'ags/test/audio/task/ags_reset_peak_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_reset_peak_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Tpo ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_reset_peak_test.c' object='ags/test/audio/task/reset_peak_test-ags_reset_peak_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_peak_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/reset_peak_test-ags_reset_peak_test.o `test -f 'ags/test/audio/task/ags_reset_peak_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_reset_peak_test.c ags/test/audio/task/reset_peak_test-ags_reset_peak_test.obj: ags/test/audio/task/ags_reset_peak_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_peak_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/reset_peak_test-ags_reset_peak_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Tpo -c -o ags/test/audio/task/reset_peak_test-ags_reset_peak_test.obj `if test -f 'ags/test/audio/task/ags_reset_peak_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_reset_peak_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_reset_peak_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Tpo ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_reset_peak_test.c' object='ags/test/audio/task/reset_peak_test-ags_reset_peak_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_reset_peak_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/reset_peak_test-ags_reset_peak_test.obj `if test -f 'ags/test/audio/task/ags_reset_peak_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_reset_peak_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_reset_peak_test.c'; fi` ags/test/audio/task/resize_audio_test-ags_resize_audio_test.o: ags/test/audio/task/ags_resize_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_resize_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/resize_audio_test-ags_resize_audio_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Tpo -c -o ags/test/audio/task/resize_audio_test-ags_resize_audio_test.o `test -f 'ags/test/audio/task/ags_resize_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_resize_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_resize_audio_test.c' object='ags/test/audio/task/resize_audio_test-ags_resize_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_resize_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/resize_audio_test-ags_resize_audio_test.o `test -f 'ags/test/audio/task/ags_resize_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_resize_audio_test.c ags/test/audio/task/resize_audio_test-ags_resize_audio_test.obj: ags/test/audio/task/ags_resize_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_resize_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/resize_audio_test-ags_resize_audio_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Tpo -c -o ags/test/audio/task/resize_audio_test-ags_resize_audio_test.obj `if test -f 'ags/test/audio/task/ags_resize_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_resize_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_resize_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_resize_audio_test.c' object='ags/test/audio/task/resize_audio_test-ags_resize_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_resize_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/resize_audio_test-ags_resize_audio_test.obj `if test -f 'ags/test/audio/task/ags_resize_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_resize_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_resize_audio_test.c'; fi` ags/test/thread/returnable_thread_test-ags_returnable_thread_test.o: ags/test/thread/ags_returnable_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_returnable_thread_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/returnable_thread_test-ags_returnable_thread_test.o -MD -MP -MF ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Tpo -c -o ags/test/thread/returnable_thread_test-ags_returnable_thread_test.o `test -f 'ags/test/thread/ags_returnable_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_returnable_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Tpo ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_returnable_thread_test.c' object='ags/test/thread/returnable_thread_test-ags_returnable_thread_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_returnable_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/returnable_thread_test-ags_returnable_thread_test.o `test -f 'ags/test/thread/ags_returnable_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_returnable_thread_test.c ags/test/thread/returnable_thread_test-ags_returnable_thread_test.obj: ags/test/thread/ags_returnable_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_returnable_thread_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/returnable_thread_test-ags_returnable_thread_test.obj -MD -MP -MF ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Tpo -c -o ags/test/thread/returnable_thread_test-ags_returnable_thread_test.obj `if test -f 'ags/test/thread/ags_returnable_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_returnable_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_returnable_thread_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Tpo ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_returnable_thread_test.c' object='ags/test/thread/returnable_thread_test-ags_returnable_thread_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_returnable_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/returnable_thread_test-ags_returnable_thread_test.obj `if test -f 'ags/test/thread/ags_returnable_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_returnable_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_returnable_thread_test.c'; fi` ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.o: ags/test/audio/recall/ags_route_dssi_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_dssi_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Tpo -c -o ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.o `test -f 'ags/test/audio/recall/ags_route_dssi_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_route_dssi_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_route_dssi_audio_test.c' object='ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_dssi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.o `test -f 'ags/test/audio/recall/ags_route_dssi_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_route_dssi_audio_test.c ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.obj: ags/test/audio/recall/ags_route_dssi_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_dssi_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Tpo -c -o ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.obj `if test -f 'ags/test/audio/recall/ags_route_dssi_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_route_dssi_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_route_dssi_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_route_dssi_audio_test.c' object='ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_dssi_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/route_dssi_audio_test-ags_route_dssi_audio_test.obj `if test -f 'ags/test/audio/recall/ags_route_dssi_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_route_dssi_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_route_dssi_audio_test.c'; fi` ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.o: ags/test/audio/recall/ags_route_lv2_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_lv2_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Tpo -c -o ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.o `test -f 'ags/test/audio/recall/ags_route_lv2_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_route_lv2_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_route_lv2_audio_test.c' object='ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_lv2_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.o `test -f 'ags/test/audio/recall/ags_route_lv2_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_route_lv2_audio_test.c ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.obj: ags/test/audio/recall/ags_route_lv2_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_lv2_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Tpo -c -o ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.obj `if test -f 'ags/test/audio/recall/ags_route_lv2_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_route_lv2_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_route_lv2_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Tpo ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_route_lv2_audio_test.c' object='ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_route_lv2_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/route_lv2_audio_test-ags_route_lv2_audio_test.obj `if test -f 'ags/test/audio/recall/ags_route_lv2_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_route_lv2_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_route_lv2_audio_test.c'; fi` ags/test/server/security/security_context_test-ags_security_context_test.o: ags/test/server/security/ags_security_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_security_context_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/security_context_test-ags_security_context_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Tpo -c -o ags/test/server/security/security_context_test-ags_security_context_test.o `test -f 'ags/test/server/security/ags_security_context_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_security_context_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Tpo ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_security_context_test.c' object='ags/test/server/security/security_context_test-ags_security_context_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_security_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/security_context_test-ags_security_context_test.o `test -f 'ags/test/server/security/ags_security_context_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_security_context_test.c ags/test/server/security/security_context_test-ags_security_context_test.obj: ags/test/server/security/ags_security_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_security_context_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/security_context_test-ags_security_context_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Tpo -c -o ags/test/server/security/security_context_test-ags_security_context_test.obj `if test -f 'ags/test/server/security/ags_security_context_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_security_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_security_context_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Tpo ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_security_context_test.c' object='ags/test/server/security/security_context_test-ags_security_context_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_security_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/security_context_test-ags_security_context_test.obj `if test -f 'ags/test/server/security/ags_security_context_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_security_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_security_context_test.c'; fi` ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.o: ags/test/audio/task/ags_seek_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_seek_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Tpo -c -o ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.o `test -f 'ags/test/audio/task/ags_seek_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_seek_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Tpo ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_seek_soundcard_test.c' object='ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_seek_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.o `test -f 'ags/test/audio/task/ags_seek_soundcard_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_seek_soundcard_test.c ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.obj: ags/test/audio/task/ags_seek_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_seek_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Tpo -c -o ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_seek_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_seek_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_seek_soundcard_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Tpo ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_seek_soundcard_test.c' object='ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_seek_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/seek_soundcard_test-ags_seek_soundcard_test.obj `if test -f 'ags/test/audio/task/ags_seek_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_seek_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_seek_soundcard_test.c'; fi` ags/test/server/server_application_context_test-ags_server_application_context_test.o: ags/test/server/ags_server_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/server/server_application_context_test-ags_server_application_context_test.o -MD -MP -MF ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Tpo -c -o ags/test/server/server_application_context_test-ags_server_application_context_test.o `test -f 'ags/test/server/ags_server_application_context_test.c' || echo '$(srcdir)/'`ags/test/server/ags_server_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Tpo ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/ags_server_application_context_test.c' object='ags/test/server/server_application_context_test-ags_server_application_context_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/server_application_context_test-ags_server_application_context_test.o `test -f 'ags/test/server/ags_server_application_context_test.c' || echo '$(srcdir)/'`ags/test/server/ags_server_application_context_test.c ags/test/server/server_application_context_test-ags_server_application_context_test.obj: ags/test/server/ags_server_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/server/server_application_context_test-ags_server_application_context_test.obj -MD -MP -MF ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Tpo -c -o ags/test/server/server_application_context_test-ags_server_application_context_test.obj `if test -f 'ags/test/server/ags_server_application_context_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_server_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_server_application_context_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Tpo ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/ags_server_application_context_test.c' object='ags/test/server/server_application_context_test-ags_server_application_context_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/server_application_context_test-ags_server_application_context_test.obj `if test -f 'ags/test/server/ags_server_application_context_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_server_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_server_application_context_test.c'; fi` ags/test/server/server_test-ags_server_test.o: ags/test/server/ags_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_test_CFLAGS) $(CFLAGS) -MT ags/test/server/server_test-ags_server_test.o -MD -MP -MF ags/test/server/$(DEPDIR)/server_test-ags_server_test.Tpo -c -o ags/test/server/server_test-ags_server_test.o `test -f 'ags/test/server/ags_server_test.c' || echo '$(srcdir)/'`ags/test/server/ags_server_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/$(DEPDIR)/server_test-ags_server_test.Tpo ags/test/server/$(DEPDIR)/server_test-ags_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/ags_server_test.c' object='ags/test/server/server_test-ags_server_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/server_test-ags_server_test.o `test -f 'ags/test/server/ags_server_test.c' || echo '$(srcdir)/'`ags/test/server/ags_server_test.c ags/test/server/server_test-ags_server_test.obj: ags/test/server/ags_server_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_test_CFLAGS) $(CFLAGS) -MT ags/test/server/server_test-ags_server_test.obj -MD -MP -MF ags/test/server/$(DEPDIR)/server_test-ags_server_test.Tpo -c -o ags/test/server/server_test-ags_server_test.obj `if test -f 'ags/test/server/ags_server_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_server_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/$(DEPDIR)/server_test-ags_server_test.Tpo ags/test/server/$(DEPDIR)/server_test-ags_server_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/ags_server_test.c' object='ags/test/server/server_test-ags_server_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_server_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/server_test-ags_server_test.obj `if test -f 'ags/test/server/ags_server_test.c'; then $(CYGPATH_W) 'ags/test/server/ags_server_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/ags_server_test.c'; fi` ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.o: ags/test/audio/task/ags_set_audio_channels_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_audio_channels_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Tpo -c -o ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.o `test -f 'ags/test/audio/task/ags_set_audio_channels_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_audio_channels_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Tpo ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_audio_channels_test.c' object='ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_audio_channels_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.o `test -f 'ags/test/audio/task/ags_set_audio_channels_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_audio_channels_test.c ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.obj: ags/test/audio/task/ags_set_audio_channels_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_audio_channels_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Tpo -c -o ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.obj `if test -f 'ags/test/audio/task/ags_set_audio_channels_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_audio_channels_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_audio_channels_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Tpo ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_audio_channels_test.c' object='ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_audio_channels_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_audio_channels_test-ags_set_audio_channels_test.obj `if test -f 'ags/test/audio/task/ags_set_audio_channels_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_audio_channels_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_audio_channels_test.c'; fi` ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.o: ags/test/audio/task/ags_set_buffer_size_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_buffer_size_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Tpo -c -o ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.o `test -f 'ags/test/audio/task/ags_set_buffer_size_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_buffer_size_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Tpo ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_buffer_size_test.c' object='ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_buffer_size_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.o `test -f 'ags/test/audio/task/ags_set_buffer_size_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_buffer_size_test.c ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.obj: ags/test/audio/task/ags_set_buffer_size_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_buffer_size_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Tpo -c -o ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.obj `if test -f 'ags/test/audio/task/ags_set_buffer_size_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_buffer_size_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_buffer_size_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Tpo ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_buffer_size_test.c' object='ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_buffer_size_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_buffer_size_test-ags_set_buffer_size_test.obj `if test -f 'ags/test/audio/task/ags_set_buffer_size_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_buffer_size_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_buffer_size_test.c'; fi` ags/test/audio/task/set_device_test-ags_set_device_test.o: ags/test/audio/task/ags_set_device_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_device_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_device_test-ags_set_device_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Tpo -c -o ags/test/audio/task/set_device_test-ags_set_device_test.o `test -f 'ags/test/audio/task/ags_set_device_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_device_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Tpo ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_device_test.c' object='ags/test/audio/task/set_device_test-ags_set_device_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_device_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_device_test-ags_set_device_test.o `test -f 'ags/test/audio/task/ags_set_device_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_device_test.c ags/test/audio/task/set_device_test-ags_set_device_test.obj: ags/test/audio/task/ags_set_device_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_device_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_device_test-ags_set_device_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Tpo -c -o ags/test/audio/task/set_device_test-ags_set_device_test.obj `if test -f 'ags/test/audio/task/ags_set_device_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_device_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_device_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Tpo ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_device_test.c' object='ags/test/audio/task/set_device_test-ags_set_device_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_device_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_device_test-ags_set_device_test.obj `if test -f 'ags/test/audio/task/ags_set_device_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_device_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_device_test.c'; fi` ags/test/audio/task/set_format_test-ags_set_format_test.o: ags/test/audio/task/ags_set_format_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_format_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_format_test-ags_set_format_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Tpo -c -o ags/test/audio/task/set_format_test-ags_set_format_test.o `test -f 'ags/test/audio/task/ags_set_format_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_format_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Tpo ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_format_test.c' object='ags/test/audio/task/set_format_test-ags_set_format_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_format_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_format_test-ags_set_format_test.o `test -f 'ags/test/audio/task/ags_set_format_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_format_test.c ags/test/audio/task/set_format_test-ags_set_format_test.obj: ags/test/audio/task/ags_set_format_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_format_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_format_test-ags_set_format_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Tpo -c -o ags/test/audio/task/set_format_test-ags_set_format_test.obj `if test -f 'ags/test/audio/task/ags_set_format_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_format_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_format_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Tpo ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_format_test.c' object='ags/test/audio/task/set_format_test-ags_set_format_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_format_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_format_test-ags_set_format_test.obj `if test -f 'ags/test/audio/task/ags_set_format_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_format_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_format_test.c'; fi` ags/test/audio/task/set_muted_test-ags_set_muted_test.o: ags/test/audio/task/ags_set_muted_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_muted_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_muted_test-ags_set_muted_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Tpo -c -o ags/test/audio/task/set_muted_test-ags_set_muted_test.o `test -f 'ags/test/audio/task/ags_set_muted_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_muted_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Tpo ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_muted_test.c' object='ags/test/audio/task/set_muted_test-ags_set_muted_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_muted_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_muted_test-ags_set_muted_test.o `test -f 'ags/test/audio/task/ags_set_muted_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_muted_test.c ags/test/audio/task/set_muted_test-ags_set_muted_test.obj: ags/test/audio/task/ags_set_muted_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_muted_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_muted_test-ags_set_muted_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Tpo -c -o ags/test/audio/task/set_muted_test-ags_set_muted_test.obj `if test -f 'ags/test/audio/task/ags_set_muted_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_muted_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_muted_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Tpo ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_muted_test.c' object='ags/test/audio/task/set_muted_test-ags_set_muted_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_muted_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_muted_test-ags_set_muted_test.obj `if test -f 'ags/test/audio/task/ags_set_muted_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_muted_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_muted_test.c'; fi` ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.o: ags/test/audio/task/ags_set_samplerate_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_samplerate_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Tpo -c -o ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.o `test -f 'ags/test/audio/task/ags_set_samplerate_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_samplerate_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Tpo ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_samplerate_test.c' object='ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_samplerate_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.o `test -f 'ags/test/audio/task/ags_set_samplerate_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_set_samplerate_test.c ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.obj: ags/test/audio/task/ags_set_samplerate_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_samplerate_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Tpo -c -o ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.obj `if test -f 'ags/test/audio/task/ags_set_samplerate_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_samplerate_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_samplerate_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Tpo ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_set_samplerate_test.c' object='ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_set_samplerate_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/set_samplerate_test-ags_set_samplerate_test.obj `if test -f 'ags/test/audio/task/ags_set_samplerate_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_set_samplerate_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_set_samplerate_test.c'; fi` ags/test/object/soundcard_test-ags_soundcard_test.o: ags/test/object/ags_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/object/soundcard_test-ags_soundcard_test.o -MD -MP -MF ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Tpo -c -o ags/test/object/soundcard_test-ags_soundcard_test.o `test -f 'ags/test/object/ags_soundcard_test.c' || echo '$(srcdir)/'`ags/test/object/ags_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Tpo ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_soundcard_test.c' object='ags/test/object/soundcard_test-ags_soundcard_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/soundcard_test-ags_soundcard_test.o `test -f 'ags/test/object/ags_soundcard_test.c' || echo '$(srcdir)/'`ags/test/object/ags_soundcard_test.c ags/test/object/soundcard_test-ags_soundcard_test.obj: ags/test/object/ags_soundcard_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_soundcard_test_CFLAGS) $(CFLAGS) -MT ags/test/object/soundcard_test-ags_soundcard_test.obj -MD -MP -MF ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Tpo -c -o ags/test/object/soundcard_test-ags_soundcard_test.obj `if test -f 'ags/test/object/ags_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_soundcard_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Tpo ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/object/ags_soundcard_test.c' object='ags/test/object/soundcard_test-ags_soundcard_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_soundcard_test_CFLAGS) $(CFLAGS) -c -o ags/test/object/soundcard_test-ags_soundcard_test.obj `if test -f 'ags/test/object/ags_soundcard_test.c'; then $(CYGPATH_W) 'ags/test/object/ags_soundcard_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/object/ags_soundcard_test.c'; fi` ags/test/audio/task/start_audio_test-ags_start_audio_test.o: ags/test/audio/task/ags_start_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/start_audio_test-ags_start_audio_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Tpo -c -o ags/test/audio/task/start_audio_test-ags_start_audio_test.o `test -f 'ags/test/audio/task/ags_start_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_start_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_start_audio_test.c' object='ags/test/audio/task/start_audio_test-ags_start_audio_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/start_audio_test-ags_start_audio_test.o `test -f 'ags/test/audio/task/ags_start_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_start_audio_test.c ags/test/audio/task/start_audio_test-ags_start_audio_test.obj: ags/test/audio/task/ags_start_audio_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/start_audio_test-ags_start_audio_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Tpo -c -o ags/test/audio/task/start_audio_test-ags_start_audio_test.obj `if test -f 'ags/test/audio/task/ags_start_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_start_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_start_audio_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Tpo ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_start_audio_test.c' object='ags/test/audio/task/start_audio_test-ags_start_audio_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/start_audio_test-ags_start_audio_test.obj `if test -f 'ags/test/audio/task/ags_start_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_start_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_start_audio_test.c'; fi` ags/test/audio/task/start_channel_test-ags_start_channel_test.o: ags/test/audio/task/ags_start_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/start_channel_test-ags_start_channel_test.o -MD -MP -MF ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Tpo -c -o ags/test/audio/task/start_channel_test-ags_start_channel_test.o `test -f 'ags/test/audio/task/ags_start_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_start_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Tpo ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_start_channel_test.c' object='ags/test/audio/task/start_channel_test-ags_start_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/start_channel_test-ags_start_channel_test.o `test -f 'ags/test/audio/task/ags_start_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/task/ags_start_channel_test.c ags/test/audio/task/start_channel_test-ags_start_channel_test.obj: ags/test/audio/task/ags_start_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/task/start_channel_test-ags_start_channel_test.obj -MD -MP -MF ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Tpo -c -o ags/test/audio/task/start_channel_test-ags_start_channel_test.obj `if test -f 'ags/test/audio/task/ags_start_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_start_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_start_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Tpo ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/task/ags_start_channel_test.c' object='ags/test/audio/task/start_channel_test-ags_start_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_start_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/task/start_channel_test-ags_start_channel_test.obj `if test -f 'ags/test/audio/task/ags_start_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/task/ags_start_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/task/ags_start_channel_test.c'; fi` ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.o: ags/test/audio/recall/ags_stream_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_stream_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Tpo -c -o ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_stream_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_stream_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_stream_audio_signal_test.c' object='ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_stream_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_stream_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_stream_audio_signal_test.c ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.obj: ags/test/audio/recall/ags_stream_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_stream_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Tpo -c -o ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_stream_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_stream_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_stream_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_stream_audio_signal_test.c' object='ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_stream_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/stream_audio_signal_test-ags_stream_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_stream_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_stream_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_stream_audio_signal_test.c'; fi` ags/test/audio/synth_generator_test-ags_synth_generator_test.o: ags/test/audio/ags_synth_generator_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_synth_generator_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/synth_generator_test-ags_synth_generator_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Tpo -c -o ags/test/audio/synth_generator_test-ags_synth_generator_test.o `test -f 'ags/test/audio/ags_synth_generator_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_synth_generator_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Tpo ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_synth_generator_test.c' object='ags/test/audio/synth_generator_test-ags_synth_generator_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_synth_generator_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/synth_generator_test-ags_synth_generator_test.o `test -f 'ags/test/audio/ags_synth_generator_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_synth_generator_test.c ags/test/audio/synth_generator_test-ags_synth_generator_test.obj: ags/test/audio/ags_synth_generator_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_synth_generator_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/synth_generator_test-ags_synth_generator_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Tpo -c -o ags/test/audio/synth_generator_test-ags_synth_generator_test.obj `if test -f 'ags/test/audio/ags_synth_generator_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_synth_generator_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_synth_generator_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Tpo ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_synth_generator_test.c' object='ags/test/audio/synth_generator_test-ags_synth_generator_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_synth_generator_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/synth_generator_test-ags_synth_generator_test.obj `if test -f 'ags/test/audio/ags_synth_generator_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_synth_generator_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_synth_generator_test.c'; fi` ags/test/thread/task_test-ags_task_test.o: ags/test/thread/ags_task_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_task_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/task_test-ags_task_test.o -MD -MP -MF ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Tpo -c -o ags/test/thread/task_test-ags_task_test.o `test -f 'ags/test/thread/ags_task_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_task_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Tpo ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_task_test.c' object='ags/test/thread/task_test-ags_task_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_task_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/task_test-ags_task_test.o `test -f 'ags/test/thread/ags_task_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_task_test.c ags/test/thread/task_test-ags_task_test.obj: ags/test/thread/ags_task_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_task_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/task_test-ags_task_test.obj -MD -MP -MF ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Tpo -c -o ags/test/thread/task_test-ags_task_test.obj `if test -f 'ags/test/thread/ags_task_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_task_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_task_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Tpo ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_task_test.c' object='ags/test/thread/task_test-ags_task_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_task_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/task_test-ags_task_test.obj `if test -f 'ags/test/thread/ags_task_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_task_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_task_test.c'; fi` ags/test/thread/thread_pool_test-ags_thread_pool_test.o: ags/test/thread/ags_thread_pool_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_pool_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/thread_pool_test-ags_thread_pool_test.o -MD -MP -MF ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Tpo -c -o ags/test/thread/thread_pool_test-ags_thread_pool_test.o `test -f 'ags/test/thread/ags_thread_pool_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_thread_pool_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Tpo ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_thread_pool_test.c' object='ags/test/thread/thread_pool_test-ags_thread_pool_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_pool_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/thread_pool_test-ags_thread_pool_test.o `test -f 'ags/test/thread/ags_thread_pool_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_thread_pool_test.c ags/test/thread/thread_pool_test-ags_thread_pool_test.obj: ags/test/thread/ags_thread_pool_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_pool_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/thread_pool_test-ags_thread_pool_test.obj -MD -MP -MF ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Tpo -c -o ags/test/thread/thread_pool_test-ags_thread_pool_test.obj `if test -f 'ags/test/thread/ags_thread_pool_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_thread_pool_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_thread_pool_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Tpo ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_thread_pool_test.c' object='ags/test/thread/thread_pool_test-ags_thread_pool_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_pool_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/thread_pool_test-ags_thread_pool_test.obj `if test -f 'ags/test/thread/ags_thread_pool_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_thread_pool_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_thread_pool_test.c'; fi` ags/test/thread/thread_test-ags_thread_test.o: ags/test/thread/ags_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/thread_test-ags_thread_test.o -MD -MP -MF ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Tpo -c -o ags/test/thread/thread_test-ags_thread_test.o `test -f 'ags/test/thread/ags_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Tpo ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_thread_test.c' object='ags/test/thread/thread_test-ags_thread_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/thread_test-ags_thread_test.o `test -f 'ags/test/thread/ags_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_thread_test.c ags/test/thread/thread_test-ags_thread_test.obj: ags/test/thread/ags_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/thread_test-ags_thread_test.obj -MD -MP -MF ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Tpo -c -o ags/test/thread/thread_test-ags_thread_test.obj `if test -f 'ags/test/thread/ags_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_thread_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Tpo ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_thread_test.c' object='ags/test/thread/thread_test-ags_thread_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/thread_test-ags_thread_test.obj `if test -f 'ags/test/thread/ags_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_thread_test.c'; fi` ags/test/lib/time_test-ags_time_test.o: ags/test/lib/ags_time_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_time_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/time_test-ags_time_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Tpo -c -o ags/test/lib/time_test-ags_time_test.o `test -f 'ags/test/lib/ags_time_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_time_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Tpo ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_time_test.c' object='ags/test/lib/time_test-ags_time_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_time_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/time_test-ags_time_test.o `test -f 'ags/test/lib/ags_time_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_time_test.c ags/test/lib/time_test-ags_time_test.obj: ags/test/lib/ags_time_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_time_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/time_test-ags_time_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Tpo -c -o ags/test/lib/time_test-ags_time_test.obj `if test -f 'ags/test/lib/ags_time_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_time_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_time_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Tpo ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_time_test.c' object='ags/test/lib/time_test-ags_time_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_time_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/time_test-ags_time_test.obj `if test -f 'ags/test/lib/ags_time_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_time_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_time_test.c'; fi` ags/test/audio/track_test-ags_track_test.o: ags/test/audio/ags_track_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_track_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/track_test-ags_track_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Tpo -c -o ags/test/audio/track_test-ags_track_test.o `test -f 'ags/test/audio/ags_track_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_track_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Tpo ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_track_test.c' object='ags/test/audio/track_test-ags_track_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_track_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/track_test-ags_track_test.o `test -f 'ags/test/audio/ags_track_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_track_test.c ags/test/audio/track_test-ags_track_test.obj: ags/test/audio/ags_track_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_track_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/track_test-ags_track_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Tpo -c -o ags/test/audio/track_test-ags_track_test.obj `if test -f 'ags/test/audio/ags_track_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_track_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_track_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Tpo ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_track_test.c' object='ags/test/audio/track_test-ags_track_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_track_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/track_test-ags_track_test.obj `if test -f 'ags/test/audio/ags_track_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_track_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_track_test.c'; fi` ags/test/lib/turtle_manager_test-ags_turtle_manager_test.o: ags/test/lib/ags_turtle_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/turtle_manager_test-ags_turtle_manager_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Tpo -c -o ags/test/lib/turtle_manager_test-ags_turtle_manager_test.o `test -f 'ags/test/lib/ags_turtle_manager_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_turtle_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Tpo ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_turtle_manager_test.c' object='ags/test/lib/turtle_manager_test-ags_turtle_manager_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/turtle_manager_test-ags_turtle_manager_test.o `test -f 'ags/test/lib/ags_turtle_manager_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_turtle_manager_test.c ags/test/lib/turtle_manager_test-ags_turtle_manager_test.obj: ags/test/lib/ags_turtle_manager_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_manager_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/turtle_manager_test-ags_turtle_manager_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Tpo -c -o ags/test/lib/turtle_manager_test-ags_turtle_manager_test.obj `if test -f 'ags/test/lib/ags_turtle_manager_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_turtle_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_turtle_manager_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Tpo ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_turtle_manager_test.c' object='ags/test/lib/turtle_manager_test-ags_turtle_manager_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_manager_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/turtle_manager_test-ags_turtle_manager_test.obj `if test -f 'ags/test/lib/ags_turtle_manager_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_turtle_manager_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_turtle_manager_test.c'; fi` ags/test/lib/turtle_test-ags_turtle_test.o: ags/test/lib/ags_turtle_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/turtle_test-ags_turtle_test.o -MD -MP -MF ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Tpo -c -o ags/test/lib/turtle_test-ags_turtle_test.o `test -f 'ags/test/lib/ags_turtle_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_turtle_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Tpo ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_turtle_test.c' object='ags/test/lib/turtle_test-ags_turtle_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/turtle_test-ags_turtle_test.o `test -f 'ags/test/lib/ags_turtle_test.c' || echo '$(srcdir)/'`ags/test/lib/ags_turtle_test.c ags/test/lib/turtle_test-ags_turtle_test.obj: ags/test/lib/ags_turtle_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_test_CFLAGS) $(CFLAGS) -MT ags/test/lib/turtle_test-ags_turtle_test.obj -MD -MP -MF ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Tpo -c -o ags/test/lib/turtle_test-ags_turtle_test.obj `if test -f 'ags/test/lib/ags_turtle_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_turtle_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_turtle_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Tpo ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/lib/ags_turtle_test.c' object='ags/test/lib/turtle_test-ags_turtle_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_turtle_test_CFLAGS) $(CFLAGS) -c -o ags/test/lib/turtle_test-ags_turtle_test.obj `if test -f 'ags/test/lib/ags_turtle_test.c'; then $(CYGPATH_W) 'ags/test/lib/ags_turtle_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/lib/ags_turtle_test.c'; fi` ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.o: ags/test/audio/recall/ags_volume_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Tpo -c -o ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_volume_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_volume_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_volume_audio_signal_test.c' object='ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.o `test -f 'ags/test/audio/recall/ags_volume_audio_signal_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_volume_audio_signal_test.c ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.obj: ags/test/audio/recall/ags_volume_audio_signal_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_audio_signal_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Tpo -c -o ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_volume_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_volume_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_volume_audio_signal_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Tpo ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_volume_audio_signal_test.c' object='ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_audio_signal_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/volume_audio_signal_test-ags_volume_audio_signal_test.obj `if test -f 'ags/test/audio/recall/ags_volume_audio_signal_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_volume_audio_signal_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_volume_audio_signal_test.c'; fi` ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.o: ags/test/audio/recall/ags_volume_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.o -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Tpo -c -o ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.o `test -f 'ags/test/audio/recall/ags_volume_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_volume_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_volume_channel_test.c' object='ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.o `test -f 'ags/test/audio/recall/ags_volume_channel_test.c' || echo '$(srcdir)/'`ags/test/audio/recall/ags_volume_channel_test.c ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.obj: ags/test/audio/recall/ags_volume_channel_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_channel_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.obj -MD -MP -MF ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Tpo -c -o ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.obj `if test -f 'ags/test/audio/recall/ags_volume_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_volume_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_volume_channel_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Tpo ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/recall/ags_volume_channel_test.c' object='ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_volume_channel_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/recall/volume_channel_test-ags_volume_channel_test.obj `if test -f 'ags/test/audio/recall/ags_volume_channel_test.c'; then $(CYGPATH_W) 'ags/test/audio/recall/ags_volume_channel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/recall/ags_volume_channel_test.c'; fi` ags/test/audio/wave_test-ags_wave_test.o: ags/test/audio/ags_wave_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_wave_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/wave_test-ags_wave_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Tpo -c -o ags/test/audio/wave_test-ags_wave_test.o `test -f 'ags/test/audio/ags_wave_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_wave_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Tpo ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_wave_test.c' object='ags/test/audio/wave_test-ags_wave_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_wave_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/wave_test-ags_wave_test.o `test -f 'ags/test/audio/ags_wave_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_wave_test.c ags/test/audio/wave_test-ags_wave_test.obj: ags/test/audio/ags_wave_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_wave_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/wave_test-ags_wave_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Tpo -c -o ags/test/audio/wave_test-ags_wave_test.obj `if test -f 'ags/test/audio/ags_wave_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_wave_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_wave_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Tpo ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/audio/ags_wave_test.c' object='ags/test/audio/wave_test-ags_wave_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_wave_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/wave_test-ags_wave_test.obj `if test -f 'ags/test/audio/ags_wave_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_wave_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_wave_test.c'; fi` ags/test/thread/worker_thread_test-ags_worker_thread_test.o: ags/test/thread/ags_worker_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_worker_thread_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/worker_thread_test-ags_worker_thread_test.o -MD -MP -MF ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Tpo -c -o ags/test/thread/worker_thread_test-ags_worker_thread_test.o `test -f 'ags/test/thread/ags_worker_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_worker_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Tpo ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_worker_thread_test.c' object='ags/test/thread/worker_thread_test-ags_worker_thread_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_worker_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/worker_thread_test-ags_worker_thread_test.o `test -f 'ags/test/thread/ags_worker_thread_test.c' || echo '$(srcdir)/'`ags/test/thread/ags_worker_thread_test.c ags/test/thread/worker_thread_test-ags_worker_thread_test.obj: ags/test/thread/ags_worker_thread_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_worker_thread_test_CFLAGS) $(CFLAGS) -MT ags/test/thread/worker_thread_test-ags_worker_thread_test.obj -MD -MP -MF ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Tpo -c -o ags/test/thread/worker_thread_test-ags_worker_thread_test.obj `if test -f 'ags/test/thread/ags_worker_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_worker_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_worker_thread_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Tpo ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/thread/ags_worker_thread_test.c' object='ags/test/thread/worker_thread_test-ags_worker_thread_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_worker_thread_test_CFLAGS) $(CFLAGS) -c -o ags/test/thread/worker_thread_test-ags_worker_thread_test.obj `if test -f 'ags/test/thread/ags_worker_thread_test.c'; then $(CYGPATH_W) 'ags/test/thread/ags_worker_thread_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/thread/ags_worker_thread_test.c'; fi` ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.o: ags/test/server/security/ags_xml_authentication_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_authentication_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Tpo -c -o ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.o `test -f 'ags/test/server/security/ags_xml_authentication_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_authentication_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Tpo ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_authentication_test.c' object='ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_authentication_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.o `test -f 'ags/test/server/security/ags_xml_authentication_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_authentication_test.c ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.obj: ags/test/server/security/ags_xml_authentication_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_authentication_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Tpo -c -o ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.obj `if test -f 'ags/test/server/security/ags_xml_authentication_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_authentication_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_authentication_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Tpo ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_authentication_test.c' object='ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_authentication_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_authentication_test-ags_xml_authentication_test.obj `if test -f 'ags/test/server/security/ags_xml_authentication_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_authentication_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_authentication_test.c'; fi` ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.o: ags/test/server/security/ags_xml_business_group_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_business_group_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Tpo -c -o ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.o `test -f 'ags/test/server/security/ags_xml_business_group_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_business_group_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Tpo ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_business_group_test.c' object='ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_business_group_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.o `test -f 'ags/test/server/security/ags_xml_business_group_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_business_group_test.c ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.obj: ags/test/server/security/ags_xml_business_group_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_business_group_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Tpo -c -o ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.obj `if test -f 'ags/test/server/security/ags_xml_business_group_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_business_group_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_business_group_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Tpo ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_business_group_test.c' object='ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_business_group_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_business_group_test-ags_xml_business_group_test.obj `if test -f 'ags/test/server/security/ags_xml_business_group_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_business_group_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_business_group_test.c'; fi` ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.o: ags/test/server/security/ags_xml_certificate_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_certificate_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Tpo -c -o ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.o `test -f 'ags/test/server/security/ags_xml_certificate_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_certificate_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Tpo ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_certificate_test.c' object='ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_certificate_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.o `test -f 'ags/test/server/security/ags_xml_certificate_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_certificate_test.c ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.obj: ags/test/server/security/ags_xml_certificate_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_certificate_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Tpo -c -o ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.obj `if test -f 'ags/test/server/security/ags_xml_certificate_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_certificate_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_certificate_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Tpo ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_certificate_test.c' object='ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_certificate_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_certificate_test-ags_xml_certificate_test.obj `if test -f 'ags/test/server/security/ags_xml_certificate_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_certificate_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_certificate_test.c'; fi` ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.o: ags/test/server/security/ags_xml_password_store_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_password_store_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.o -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Tpo -c -o ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.o `test -f 'ags/test/server/security/ags_xml_password_store_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_password_store_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Tpo ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_password_store_test.c' object='ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_password_store_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.o `test -f 'ags/test/server/security/ags_xml_password_store_test.c' || echo '$(srcdir)/'`ags/test/server/security/ags_xml_password_store_test.c ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.obj: ags/test/server/security/ags_xml_password_store_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_password_store_test_CFLAGS) $(CFLAGS) -MT ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.obj -MD -MP -MF ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Tpo -c -o ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.obj `if test -f 'ags/test/server/security/ags_xml_password_store_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_password_store_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_password_store_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Tpo ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/server/security/ags_xml_password_store_test.c' object='ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xml_password_store_test_CFLAGS) $(CFLAGS) -c -o ags/test/server/security/xml_password_store_test-ags_xml_password_store_test.obj `if test -f 'ags/test/server/security/ags_xml_password_store_test.c'; then $(CYGPATH_W) 'ags/test/server/security/ags_xml_password_store_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/server/security/ags_xml_password_store_test.c'; fi` ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.o: ags/test/X/ags_xorg_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xorg_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Tpo -c -o ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.o `test -f 'ags/test/X/ags_xorg_application_context_test.c' || echo '$(srcdir)/'`ags/test/X/ags_xorg_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Tpo ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_xorg_application_context_test.c' object='ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xorg_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.o `test -f 'ags/test/X/ags_xorg_application_context_test.c' || echo '$(srcdir)/'`ags/test/X/ags_xorg_application_context_test.c ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.obj: ags/test/X/ags_xorg_application_context_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xorg_application_context_test_CFLAGS) $(CFLAGS) -MT ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Tpo -c -o ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.obj `if test -f 'ags/test/X/ags_xorg_application_context_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_xorg_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_xorg_application_context_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Tpo ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/test/X/ags_xorg_application_context_test.c' object='ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_xorg_application_context_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/xorg_application_context_test-ags_xorg_application_context_test.obj `if test -f 'ags/test/X/ags_xorg_application_context_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_xorg_application_context_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_xorg_application_context_test.c'; fi` ags/gsequencer-gsequencer_main.o: ags/gsequencer_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsequencer_CFLAGS) $(CFLAGS) -MT ags/gsequencer-gsequencer_main.o -MD -MP -MF ags/$(DEPDIR)/gsequencer-gsequencer_main.Tpo -c -o ags/gsequencer-gsequencer_main.o `test -f 'ags/gsequencer_main.c' || echo '$(srcdir)/'`ags/gsequencer_main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/$(DEPDIR)/gsequencer-gsequencer_main.Tpo ags/$(DEPDIR)/gsequencer-gsequencer_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/gsequencer_main.c' object='ags/gsequencer-gsequencer_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsequencer_CFLAGS) $(CFLAGS) -c -o ags/gsequencer-gsequencer_main.o `test -f 'ags/gsequencer_main.c' || echo '$(srcdir)/'`ags/gsequencer_main.c ags/gsequencer-gsequencer_main.obj: ags/gsequencer_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsequencer_CFLAGS) $(CFLAGS) -MT ags/gsequencer-gsequencer_main.obj -MD -MP -MF ags/$(DEPDIR)/gsequencer-gsequencer_main.Tpo -c -o ags/gsequencer-gsequencer_main.obj `if test -f 'ags/gsequencer_main.c'; then $(CYGPATH_W) 'ags/gsequencer_main.c'; else $(CYGPATH_W) '$(srcdir)/ags/gsequencer_main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/$(DEPDIR)/gsequencer-gsequencer_main.Tpo ags/$(DEPDIR)/gsequencer-gsequencer_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/gsequencer_main.c' object='ags/gsequencer-gsequencer_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsequencer_CFLAGS) $(CFLAGS) -c -o ags/gsequencer-gsequencer_main.obj `if test -f 'ags/gsequencer_main.c'; then $(CYGPATH_W) 'ags/gsequencer_main.c'; else $(CYGPATH_W) '$(srcdir)/ags/gsequencer_main.c'; fi` ags/midi2xml-midi2xml_main.o: ags/midi2xml_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(midi2xml_CFLAGS) $(CFLAGS) -MT ags/midi2xml-midi2xml_main.o -MD -MP -MF ags/$(DEPDIR)/midi2xml-midi2xml_main.Tpo -c -o ags/midi2xml-midi2xml_main.o `test -f 'ags/midi2xml_main.c' || echo '$(srcdir)/'`ags/midi2xml_main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/$(DEPDIR)/midi2xml-midi2xml_main.Tpo ags/$(DEPDIR)/midi2xml-midi2xml_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/midi2xml_main.c' object='ags/midi2xml-midi2xml_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(midi2xml_CFLAGS) $(CFLAGS) -c -o ags/midi2xml-midi2xml_main.o `test -f 'ags/midi2xml_main.c' || echo '$(srcdir)/'`ags/midi2xml_main.c ags/midi2xml-midi2xml_main.obj: ags/midi2xml_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(midi2xml_CFLAGS) $(CFLAGS) -MT ags/midi2xml-midi2xml_main.obj -MD -MP -MF ags/$(DEPDIR)/midi2xml-midi2xml_main.Tpo -c -o ags/midi2xml-midi2xml_main.obj `if test -f 'ags/midi2xml_main.c'; then $(CYGPATH_W) 'ags/midi2xml_main.c'; else $(CYGPATH_W) '$(srcdir)/ags/midi2xml_main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) ags/$(DEPDIR)/midi2xml-midi2xml_main.Tpo ags/$(DEPDIR)/midi2xml-midi2xml_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ags/midi2xml_main.c' object='ags/midi2xml-midi2xml_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(midi2xml_CFLAGS) $(CFLAGS) -c -o ags/midi2xml-midi2xml_main.obj `if test -f 'ags/midi2xml_main.c'; then $(CYGPATH_W) 'ags/midi2xml_main.c'; else $(CYGPATH_W) '$(srcdir)/ags/midi2xml_main.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_icloneable.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_geo_constants.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ierror_context.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fvariant.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_funknown.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ftypes.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_iplugin_base.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_futils.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ibstream.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_fstrdefs.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_const_string_table.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo: ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo -MD -MP -MF ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Tpo -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Tpo ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp' object='ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/pluginterfaces/base/libags_vst_la-ags_vst_ipersistent.lo `test -f 'ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp' || echo '$(srcdir)/'`ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo: ags/vst3-capi/util/ags_vst_string_util.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo -MD -MP -MF ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Tpo -c -o ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo `test -f 'ags/vst3-capi/util/ags_vst_string_util.cpp' || echo '$(srcdir)/'`ags/vst3-capi/util/ags_vst_string_util.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Tpo ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/util/ags_vst_string_util.cpp' object='ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/util/libags_vst_la-ags_vst_string_util.lo `test -f 'ags/vst3-capi/util/ags_vst_string_util.cpp' || echo '$(srcdir)/'`ags/vst3-capi/util/ags_vst_string_util.cpp ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo: ags/vst3-capi/base/source/ags_vst_fbuffer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo -MD -MP -MF ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Tpo -c -o ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo `test -f 'ags/vst3-capi/base/source/ags_vst_fbuffer.cpp' || echo '$(srcdir)/'`ags/vst3-capi/base/source/ags_vst_fbuffer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Tpo ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/base/source/ags_vst_fbuffer.cpp' object='ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/base/source/libags_vst_la-ags_vst_fbuffer.lo `test -f 'ags/vst3-capi/base/source/ags_vst_fbuffer.cpp' || echo '$(srcdir)/'`ags/vst3-capi/base/source/ags_vst_fbuffer.cpp ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo: ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo -MD -MP -MF ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Tpo -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Tpo ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp' object='ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_audio_effect.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo: ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo -MD -MP -MF ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Tpo -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Tpo ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp' object='ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo: ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo -MD -MP -MF ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Tpo -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Tpo ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp' object='ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_component_base.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo: ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo -MD -MP -MF ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Tpo -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Tpo ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp' object='ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_edit_controller.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo: ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo -MD -MP -MF ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Tpo -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Tpo ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp' object='ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_bus.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo: ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -MT ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo -MD -MP -MF ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Tpo -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Tpo ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp' object='ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_vst_la_CXXFLAGS) $(CXXFLAGS) -c -o ags/vst3-capi/public.sdk/source/vst/libags_vst_la-ags_vst_parameters.lo `test -f 'ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp' || echo '$(srcdir)/'`ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf ags/X/.libs ags/X/_libs -rm -rf ags/X/editor/.libs ags/X/editor/_libs -rm -rf ags/X/export/.libs ags/X/export/_libs -rm -rf ags/X/file/.libs ags/X/file/_libs -rm -rf ags/X/import/.libs ags/X/import/_libs -rm -rf ags/X/machine/.libs ags/X/machine/_libs -rm -rf ags/X/osc/controller/.libs ags/X/osc/controller/_libs -rm -rf ags/X/task/.libs ags/X/task/_libs -rm -rf ags/audio/.libs ags/audio/_libs -rm -rf ags/audio/audio-unit/.libs ags/audio/audio-unit/_libs -rm -rf ags/audio/core-audio/.libs ags/audio/core-audio/_libs -rm -rf ags/audio/file/.libs ags/audio/file/_libs -rm -rf ags/audio/jack/.libs ags/audio/jack/_libs -rm -rf ags/audio/midi/.libs ags/audio/midi/_libs -rm -rf ags/audio/osc/.libs ags/audio/osc/_libs -rm -rf ags/audio/osc/controller/.libs ags/audio/osc/controller/_libs -rm -rf ags/audio/osc/xmlrpc/.libs ags/audio/osc/xmlrpc/_libs -rm -rf ags/audio/pulse/.libs ags/audio/pulse/_libs -rm -rf ags/audio/recall/.libs ags/audio/recall/_libs -rm -rf ags/audio/task/.libs ags/audio/task/_libs -rm -rf ags/audio/thread/.libs ags/audio/thread/_libs -rm -rf ags/audio/wasapi/.libs ags/audio/wasapi/_libs -rm -rf ags/file/.libs ags/file/_libs -rm -rf ags/lib/.libs ags/lib/_libs -rm -rf ags/object/.libs ags/object/_libs -rm -rf ags/plugin/.libs ags/plugin/_libs -rm -rf ags/server/.libs ags/server/_libs -rm -rf ags/server/controller/.libs ags/server/controller/_libs -rm -rf ags/server/security/.libs ags/server/security/_libs -rm -rf ags/test/X/.libs ags/test/X/_libs -rm -rf ags/thread/.libs ags/thread/_libs -rm -rf ags/util/.libs ags/util/_libs -rm -rf ags/vst3-capi/base/source/.libs ags/vst3-capi/base/source/_libs -rm -rf ags/vst3-capi/pluginterfaces/base/.libs ags/vst3-capi/pluginterfaces/base/_libs -rm -rf ags/vst3-capi/public.sdk/source/vst/.libs ags/vst3-capi/public.sdk/source/vst/_libs -rm -rf ags/vst3-capi/util/.libs ags/vst3-capi/util/_libs -rm -rf ags/widget/.libs ags/widget/_libs distclean-libtool: -rm -f libtool config.lt install-man1: $(man1_MANS) @$(NORMAL_INSTALL) @list1='$(man1_MANS)'; \ list2=''; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-appdataDATA: $(appdata_DATA) @$(NORMAL_INSTALL) @list='$(appdata_DATA)'; test -n "$(appdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(appdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(appdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(appdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(appdatadir)" || exit $$?; \ done uninstall-appdataDATA: @$(NORMAL_UNINSTALL) @list='$(appdata_DATA)'; test -n "$(appdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(appdatadir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-girDATA: $(gir_DATA) @$(NORMAL_INSTALL) @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \ done uninstall-girDATA: @$(NORMAL_UNINSTALL) @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-typelibDATA: $(typelib_DATA) @$(NORMAL_INSTALL) @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(typelibdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(typelibdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibdir)" || exit $$?; \ done uninstall-typelibDATA: @$(NORMAL_UNINSTALL) @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(typelibdir)'; $(am__uninstall_files_from_dir) install-nobase_includeHEADERS: $(nobase_include_HEADERS) @$(NORMAL_INSTALL) @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)/$$dir"; }; \ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'"; \ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(includedir)/$$dir" || exit $$?; }; \ done uninstall-nobase_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ags-docs-local: ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) $(check_LTLIBRARIES) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) $(check_LTLIBRARIES) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? ags_buffer_util_test.log: ags_buffer_util_test$(EXEEXT) @p='ags_buffer_util_test$(EXEEXT)'; \ b='ags_buffer_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_complex_test.log: ags_complex_test$(EXEEXT) @p='ags_complex_test$(EXEEXT)'; \ b='ags_complex_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_conversion_test.log: ags_conversion_test$(EXEEXT) @p='ags_conversion_test$(EXEEXT)'; \ b='ags_conversion_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_log_test.log: ags_log_test$(EXEEXT) @p='ags_log_test$(EXEEXT)'; \ b='ags_log_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_time_test.log: ags_time_test$(EXEEXT) @p='ags_time_test$(EXEEXT)'; \ b='ags_time_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_turtle_manager_test.log: ags_turtle_manager_test$(EXEEXT) @p='ags_turtle_manager_test$(EXEEXT)'; \ b='ags_turtle_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_turtle_test.log: ags_turtle_test$(EXEEXT) @p='ags_turtle_test$(EXEEXT)'; \ b='ags_turtle_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_application_context_test.log: ags_application_context_test$(EXEEXT) @p='ags_application_context_test$(EXEEXT)'; \ b='ags_application_context_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_config_test.log: ags_config_test$(EXEEXT) @p='ags_config_test$(EXEEXT)'; \ b='ags_config_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_connectable_test.log: ags_connectable_test$(EXEEXT) @p='ags_connectable_test$(EXEEXT)'; \ b='ags_connectable_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_soundcard_test.log: ags_soundcard_test$(EXEEXT) @p='ags_soundcard_test$(EXEEXT)'; \ b='ags_soundcard_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_destroy_worker_test.log: ags_destroy_worker_test$(EXEEXT) @p='ags_destroy_worker_test$(EXEEXT)'; \ b='ags_destroy_worker_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_returnable_thread_test.log: ags_returnable_thread_test$(EXEEXT) @p='ags_returnable_thread_test$(EXEEXT)'; \ b='ags_returnable_thread_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_task_test.log: ags_task_test$(EXEEXT) @p='ags_task_test$(EXEEXT)'; \ b='ags_task_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_thread_test.log: ags_thread_test$(EXEEXT) @p='ags_thread_test$(EXEEXT)'; \ b='ags_thread_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_thread_pool_test.log: ags_thread_pool_test$(EXEEXT) @p='ags_thread_pool_test$(EXEEXT)'; \ b='ags_thread_pool_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_worker_thread_test.log: ags_worker_thread_test$(EXEEXT) @p='ags_worker_thread_test$(EXEEXT)'; \ b='ags_worker_thread_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_file_test.log: ags_file_test$(EXEEXT) @p='ags_file_test$(EXEEXT)'; \ b='ags_file_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_file_id_ref_test.log: ags_file_id_ref_test$(EXEEXT) @p='ags_file_id_ref_test$(EXEEXT)'; \ b='ags_file_id_ref_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_file_launch_test.log: ags_file_launch_test$(EXEEXT) @p='ags_file_launch_test$(EXEEXT)'; \ b='ags_file_launch_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_file_lookup_test.log: ags_file_lookup_test$(EXEEXT) @p='ags_file_lookup_test$(EXEEXT)'; \ b='ags_file_lookup_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_server_application_context_test.log: ags_server_application_context_test$(EXEEXT) @p='ags_server_application_context_test$(EXEEXT)'; \ b='ags_server_application_context_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_server_test.log: ags_server_test$(EXEEXT) @p='ags_server_test$(EXEEXT)'; \ b='ags_server_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_controller_test.log: ags_controller_test$(EXEEXT) @p='ags_controller_test$(EXEEXT)'; \ b='ags_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_front_controller_test.log: ags_front_controller_test$(EXEEXT) @p='ags_front_controller_test$(EXEEXT)'; \ b='ags_front_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_authentication_manager_test.log: ags_authentication_manager_test$(EXEEXT) @p='ags_authentication_manager_test$(EXEEXT)'; \ b='ags_authentication_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_business_group_manager_test.log: ags_business_group_manager_test$(EXEEXT) @p='ags_business_group_manager_test$(EXEEXT)'; \ b='ags_business_group_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_certificate_manager_test.log: ags_certificate_manager_test$(EXEEXT) @p='ags_certificate_manager_test$(EXEEXT)'; \ b='ags_certificate_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_password_store_manager_test.log: ags_password_store_manager_test$(EXEEXT) @p='ags_password_store_manager_test$(EXEEXT)'; \ b='ags_password_store_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_xml_authentication_test.log: ags_xml_authentication_test$(EXEEXT) @p='ags_xml_authentication_test$(EXEEXT)'; \ b='ags_xml_authentication_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_xml_business_group_test.log: ags_xml_business_group_test$(EXEEXT) @p='ags_xml_business_group_test$(EXEEXT)'; \ b='ags_xml_business_group_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_xml_certificate_test.log: ags_xml_certificate_test$(EXEEXT) @p='ags_xml_certificate_test$(EXEEXT)'; \ b='ags_xml_certificate_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_xml_password_store_test.log: ags_xml_password_store_test$(EXEEXT) @p='ags_xml_password_store_test$(EXEEXT)'; \ b='ags_xml_password_store_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_security_context_test.log: ags_security_context_test$(EXEEXT) @p='ags_security_context_test$(EXEEXT)'; \ b='ags_security_context_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_base_plugin_test.log: ags_base_plugin_test$(EXEEXT) @p='ags_base_plugin_test$(EXEEXT)'; \ b='ags_base_plugin_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_dssi_manager_test.log: ags_dssi_manager_test$(EXEEXT) @p='ags_dssi_manager_test$(EXEEXT)'; \ b='ags_dssi_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_dssi_plugin_test.log: ags_dssi_plugin_test$(EXEEXT) @p='ags_dssi_plugin_test$(EXEEXT)'; \ b='ags_dssi_plugin_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_ladspa_conversion_test.log: ags_ladspa_conversion_test$(EXEEXT) @p='ags_ladspa_conversion_test$(EXEEXT)'; \ b='ags_ladspa_conversion_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_ladspa_manager_test.log: ags_ladspa_manager_test$(EXEEXT) @p='ags_ladspa_manager_test$(EXEEXT)'; \ b='ags_ladspa_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_conversion_test.log: ags_lv2_conversion_test$(EXEEXT) @p='ags_lv2_conversion_test$(EXEEXT)'; \ b='ags_lv2_conversion_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_manager_test.log: ags_lv2_manager_test$(EXEEXT) @p='ags_lv2_manager_test$(EXEEXT)'; \ b='ags_lv2_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_option_manager_test.log: ags_lv2_option_manager_test$(EXEEXT) @p='ags_lv2_option_manager_test$(EXEEXT)'; \ b='ags_lv2_option_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_plugin_test.log: ags_lv2_plugin_test$(EXEEXT) @p='ags_lv2_plugin_test$(EXEEXT)'; \ b='ags_lv2_plugin_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_preset_test.log: ags_lv2_preset_test$(EXEEXT) @p='ags_lv2_preset_test$(EXEEXT)'; \ b='ags_lv2_preset_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_uri_map_manager_test.log: ags_lv2_uri_map_manager_test$(EXEEXT) @p='ags_lv2_uri_map_manager_test$(EXEEXT)'; \ b='ags_lv2_uri_map_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_urid_manager_test.log: ags_lv2_urid_manager_test$(EXEEXT) @p='ags_lv2_urid_manager_test$(EXEEXT)'; \ b='ags_lv2_urid_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2_worker_manager_test.log: ags_lv2_worker_manager_test$(EXEEXT) @p='ags_lv2_worker_manager_test$(EXEEXT)'; \ b='ags_lv2_worker_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2ui_manager_test.log: ags_lv2ui_manager_test$(EXEEXT) @p='ags_lv2ui_manager_test$(EXEEXT)'; \ b='ags_lv2ui_manager_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_lv2ui_plugin_test.log: ags_lv2ui_plugin_test$(EXEEXT) @p='ags_lv2ui_plugin_test$(EXEEXT)'; \ b='ags_lv2ui_plugin_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_plugin_port_test.log: ags_plugin_port_test$(EXEEXT) @p='ags_plugin_port_test$(EXEEXT)'; \ b='ags_plugin_port_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_audio_application_context_test.log: ags_audio_application_context_test$(EXEEXT) @p='ags_audio_application_context_test$(EXEEXT)'; \ b='ags_audio_application_context_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_devin_test.log: ags_devin_test$(EXEEXT) @p='ags_devin_test$(EXEEXT)'; \ b='ags_devin_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_devout_test.log: ags_devout_test$(EXEEXT) @p='ags_devout_test$(EXEEXT)'; \ b='ags_devout_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_fifoout_test.log: ags_fifoout_test$(EXEEXT) @p='ags_fifoout_test$(EXEEXT)'; \ b='ags_fifoout_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_midiin_test.log: ags_midiin_test$(EXEEXT) @p='ags_midiin_test$(EXEEXT)'; \ b='ags_midiin_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_audio_test.log: ags_audio_test$(EXEEXT) @p='ags_audio_test$(EXEEXT)'; \ b='ags_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_playback_domain_test.log: ags_playback_domain_test$(EXEEXT) @p='ags_playback_domain_test$(EXEEXT)'; \ b='ags_playback_domain_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_playback_test.log: ags_playback_test$(EXEEXT) @p='ags_playback_test$(EXEEXT)'; \ b='ags_playback_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_preset_test.log: ags_preset_test$(EXEEXT) @p='ags_preset_test$(EXEEXT)'; \ b='ags_preset_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_channel_test.log: ags_channel_test$(EXEEXT) @p='ags_channel_test$(EXEEXT)'; \ b='ags_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_input_test.log: ags_input_test$(EXEEXT) @p='ags_input_test$(EXEEXT)'; \ b='ags_input_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_output_test.log: ags_output_test$(EXEEXT) @p='ags_output_test$(EXEEXT)'; \ b='ags_output_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recycling_test.log: ags_recycling_test$(EXEEXT) @p='ags_recycling_test$(EXEEXT)'; \ b='ags_recycling_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_audio_signal_test.log: ags_audio_signal_test$(EXEEXT) @p='ags_audio_signal_test$(EXEEXT)'; \ b='ags_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_audio_buffer_util_test.log: ags_audio_buffer_util_test$(EXEEXT) @p='ags_audio_buffer_util_test$(EXEEXT)'; \ b='ags_audio_buffer_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_char_buffer_util_test.log: ags_char_buffer_util_test$(EXEEXT) @p='ags_char_buffer_util_test$(EXEEXT)'; \ b='ags_char_buffer_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_filter_util_test.log: ags_filter_util_test$(EXEEXT) @p='ags_filter_util_test$(EXEEXT)'; \ b='ags_filter_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_fm_synth_util_test.log: ags_fm_synth_util_test$(EXEEXT) @p='ags_fm_synth_util_test$(EXEEXT)'; \ b='ags_fm_synth_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_fourier_transform_util_test.log: ags_fourier_transform_util_test$(EXEEXT) @p='ags_fourier_transform_util_test$(EXEEXT)'; \ b='ags_fourier_transform_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_test.log: ags_recall_test$(EXEEXT) @p='ags_recall_test$(EXEEXT)'; \ b='ags_recall_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_channel_test.log: ags_recall_channel_test$(EXEEXT) @p='ags_recall_channel_test$(EXEEXT)'; \ b='ags_recall_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_channel_run_test.log: ags_recall_channel_run_test$(EXEEXT) @p='ags_recall_channel_run_test$(EXEEXT)'; \ b='ags_recall_channel_run_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_container_test.log: ags_recall_container_test$(EXEEXT) @p='ags_recall_container_test$(EXEEXT)'; \ b='ags_recall_container_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_dependency_test.log: ags_recall_dependency_test$(EXEEXT) @p='ags_recall_dependency_test$(EXEEXT)'; \ b='ags_recall_dependency_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_id_test.log: ags_recall_id_test$(EXEEXT) @p='ags_recall_id_test$(EXEEXT)'; \ b='ags_recall_id_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recall_recycling_test.log: ags_recall_recycling_test$(EXEEXT) @p='ags_recall_recycling_test$(EXEEXT)'; \ b='ags_recall_recycling_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_recycling_context_test.log: ags_recycling_context_test$(EXEEXT) @p='ags_recycling_context_test$(EXEEXT)'; \ b='ags_recycling_context_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_synth_generator_test.log: ags_synth_generator_test$(EXEEXT) @p='ags_synth_generator_test$(EXEEXT)'; \ b='ags_synth_generator_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_port_test.log: ags_port_test$(EXEEXT) @p='ags_port_test$(EXEEXT)'; \ b='ags_port_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_pattern_test.log: ags_pattern_test$(EXEEXT) @p='ags_pattern_test$(EXEEXT)'; \ b='ags_pattern_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_notation_test.log: ags_notation_test$(EXEEXT) @p='ags_notation_test$(EXEEXT)'; \ b='ags_notation_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_note_test.log: ags_note_test$(EXEEXT) @p='ags_note_test$(EXEEXT)'; \ b='ags_note_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_automation_test.log: ags_automation_test$(EXEEXT) @p='ags_automation_test$(EXEEXT)'; \ b='ags_automation_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_acceleration_test.log: ags_acceleration_test$(EXEEXT) @p='ags_acceleration_test$(EXEEXT)'; \ b='ags_acceleration_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_wave_test.log: ags_wave_test$(EXEEXT) @p='ags_wave_test$(EXEEXT)'; \ b='ags_wave_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_buffer_test.log: ags_buffer_test$(EXEEXT) @p='ags_buffer_test$(EXEEXT)'; \ b='ags_buffer_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_midi_test.log: ags_midi_test$(EXEEXT) @p='ags_midi_test$(EXEEXT)'; \ b='ags_midi_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_track_test.log: ags_track_test$(EXEEXT) @p='ags_track_test$(EXEEXT)'; \ b='ags_track_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_midi_buffer_util_test.log: ags_midi_buffer_util_test$(EXEEXT) @p='ags_midi_buffer_util_test$(EXEEXT)'; \ b='ags_midi_buffer_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_midi_builder_test.log: ags_midi_builder_test$(EXEEXT) @p='ags_midi_builder_test$(EXEEXT)'; \ b='ags_midi_builder_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_buffer_util_test.log: ags_osc_buffer_util_test$(EXEEXT) @p='ags_osc_buffer_util_test$(EXEEXT)'; \ b='ags_osc_buffer_util_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_client_test.log: ags_osc_client_test$(EXEEXT) @p='ags_osc_client_test$(EXEEXT)'; \ b='ags_osc_client_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_connection_test.log: ags_osc_connection_test$(EXEEXT) @p='ags_osc_connection_test$(EXEEXT)'; \ b='ags_osc_connection_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_message_test.log: ags_osc_message_test$(EXEEXT) @p='ags_osc_message_test$(EXEEXT)'; \ b='ags_osc_message_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_server_test.log: ags_osc_server_test$(EXEEXT) @p='ags_osc_server_test$(EXEEXT)'; \ b='ags_osc_server_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_websocket_connection_test.log: ags_osc_websocket_connection_test$(EXEEXT) @p='ags_osc_websocket_connection_test$(EXEEXT)'; \ b='ags_osc_websocket_connection_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_xmlrpc_message_test.log: ags_osc_xmlrpc_message_test$(EXEEXT) @p='ags_osc_xmlrpc_message_test$(EXEEXT)'; \ b='ags_osc_xmlrpc_message_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_xmlrpc_server_test.log: ags_osc_xmlrpc_server_test$(EXEEXT) @p='ags_osc_xmlrpc_server_test$(EXEEXT)'; \ b='ags_osc_xmlrpc_server_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_action_controller_test.log: ags_osc_action_controller_test$(EXEEXT) @p='ags_osc_action_controller_test$(EXEEXT)'; \ b='ags_osc_action_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_config_controller_test.log: ags_osc_config_controller_test$(EXEEXT) @p='ags_osc_config_controller_test$(EXEEXT)'; \ b='ags_osc_config_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_front_controller_test.log: ags_osc_front_controller_test$(EXEEXT) @p='ags_osc_front_controller_test$(EXEEXT)'; \ b='ags_osc_front_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_renew_controller_test.log: ags_osc_renew_controller_test$(EXEEXT) @p='ags_osc_renew_controller_test$(EXEEXT)'; \ b='ags_osc_renew_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_info_controller_test.log: ags_osc_info_controller_test$(EXEEXT) @p='ags_osc_info_controller_test$(EXEEXT)'; \ b='ags_osc_info_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_meter_controller_test.log: ags_osc_meter_controller_test$(EXEEXT) @p='ags_osc_meter_controller_test$(EXEEXT)'; \ b='ags_osc_meter_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_node_controller_test.log: ags_osc_node_controller_test$(EXEEXT) @p='ags_osc_node_controller_test$(EXEEXT)'; \ b='ags_osc_node_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_status_controller_test.log: ags_osc_status_controller_test$(EXEEXT) @p='ags_osc_status_controller_test$(EXEEXT)'; \ b='ags_osc_status_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_osc_xmlrpc_controller_test.log: ags_osc_xmlrpc_controller_test$(EXEEXT) @p='ags_osc_xmlrpc_controller_test$(EXEEXT)'; \ b='ags_osc_xmlrpc_controller_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_analyse_audio_signal_test.log: ags_analyse_audio_signal_test$(EXEEXT) @p='ags_analyse_audio_signal_test$(EXEEXT)'; \ b='ags_analyse_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_analyse_channel_test.log: ags_analyse_channel_test$(EXEEXT) @p='ags_analyse_channel_test$(EXEEXT)'; \ b='ags_analyse_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_buffer_audio_signal_test.log: ags_buffer_audio_signal_test$(EXEEXT) @p='ags_buffer_audio_signal_test$(EXEEXT)'; \ b='ags_buffer_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_buffer_channel_test.log: ags_buffer_channel_test$(EXEEXT) @p='ags_buffer_channel_test$(EXEEXT)'; \ b='ags_buffer_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_capture_wave_audio_test.log: ags_capture_wave_audio_test$(EXEEXT) @p='ags_capture_wave_audio_test$(EXEEXT)'; \ b='ags_capture_wave_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_capture_wave_channel_test.log: ags_capture_wave_channel_test$(EXEEXT) @p='ags_capture_wave_channel_test$(EXEEXT)'; \ b='ags_capture_wave_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_copy_audio_signal_test.log: ags_copy_audio_signal_test$(EXEEXT) @p='ags_copy_audio_signal_test$(EXEEXT)'; \ b='ags_copy_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_copy_channel_test.log: ags_copy_channel_test$(EXEEXT) @p='ags_copy_channel_test$(EXEEXT)'; \ b='ags_copy_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_copy_pattern_audio_test.log: ags_copy_pattern_audio_test$(EXEEXT) @p='ags_copy_pattern_audio_test$(EXEEXT)'; \ b='ags_copy_pattern_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_copy_pattern_channel_test.log: ags_copy_pattern_channel_test$(EXEEXT) @p='ags_copy_pattern_channel_test$(EXEEXT)'; \ b='ags_copy_pattern_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_count_beats_audio_test.log: ags_count_beats_audio_test$(EXEEXT) @p='ags_count_beats_audio_test$(EXEEXT)'; \ b='ags_count_beats_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_delay_audio_test.log: ags_delay_audio_test$(EXEEXT) @p='ags_delay_audio_test$(EXEEXT)'; \ b='ags_delay_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_envelope_audio_signal_test.log: ags_envelope_audio_signal_test$(EXEEXT) @p='ags_envelope_audio_signal_test$(EXEEXT)'; \ b='ags_envelope_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_envelope_channel_test.log: ags_envelope_channel_test$(EXEEXT) @p='ags_envelope_channel_test$(EXEEXT)'; \ b='ags_envelope_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_eq10_audio_signal_test.log: ags_eq10_audio_signal_test$(EXEEXT) @p='ags_eq10_audio_signal_test$(EXEEXT)'; \ b='ags_eq10_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_eq10_channel_test.log: ags_eq10_channel_test$(EXEEXT) @p='ags_eq10_channel_test$(EXEEXT)'; \ b='ags_eq10_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_feed_audio_signal_test.log: ags_feed_audio_signal_test$(EXEEXT) @p='ags_feed_audio_signal_test$(EXEEXT)'; \ b='ags_feed_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_mute_audio_test.log: ags_mute_audio_test$(EXEEXT) @p='ags_mute_audio_test$(EXEEXT)'; \ b='ags_mute_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_mute_audio_signal_test.log: ags_mute_audio_signal_test$(EXEEXT) @p='ags_mute_audio_signal_test$(EXEEXT)'; \ b='ags_mute_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_mute_channel_test.log: ags_mute_channel_test$(EXEEXT) @p='ags_mute_channel_test$(EXEEXT)'; \ b='ags_mute_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_peak_audio_signal_test.log: ags_peak_audio_signal_test$(EXEEXT) @p='ags_peak_audio_signal_test$(EXEEXT)'; \ b='ags_peak_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_peak_channel_test.log: ags_peak_channel_test$(EXEEXT) @p='ags_peak_channel_test$(EXEEXT)'; \ b='ags_peak_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_play_audio_test.log: ags_play_audio_test$(EXEEXT) @p='ags_play_audio_test$(EXEEXT)'; \ b='ags_play_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_play_audio_signal_test.log: ags_play_audio_signal_test$(EXEEXT) @p='ags_play_audio_signal_test$(EXEEXT)'; \ b='ags_play_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_play_channel_test.log: ags_play_channel_test$(EXEEXT) @p='ags_play_channel_test$(EXEEXT)'; \ b='ags_play_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_play_wave_audio_test.log: ags_play_wave_audio_test$(EXEEXT) @p='ags_play_wave_audio_test$(EXEEXT)'; \ b='ags_play_wave_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_play_wave_channel_test.log: ags_play_wave_channel_test$(EXEEXT) @p='ags_play_wave_channel_test$(EXEEXT)'; \ b='ags_play_wave_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_prepare_audio_signal_test.log: ags_prepare_audio_signal_test$(EXEEXT) @p='ags_prepare_audio_signal_test$(EXEEXT)'; \ b='ags_prepare_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_record_midi_audio_test.log: ags_record_midi_audio_test$(EXEEXT) @p='ags_record_midi_audio_test$(EXEEXT)'; \ b='ags_record_midi_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_route_dssi_audio_test.log: ags_route_dssi_audio_test$(EXEEXT) @p='ags_route_dssi_audio_test$(EXEEXT)'; \ b='ags_route_dssi_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_route_lv2_audio_test.log: ags_route_lv2_audio_test$(EXEEXT) @p='ags_route_lv2_audio_test$(EXEEXT)'; \ b='ags_route_lv2_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_stream_audio_signal_test.log: ags_stream_audio_signal_test$(EXEEXT) @p='ags_stream_audio_signal_test$(EXEEXT)'; \ b='ags_stream_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_volume_audio_signal_test.log: ags_volume_audio_signal_test$(EXEEXT) @p='ags_volume_audio_signal_test$(EXEEXT)'; \ b='ags_volume_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_volume_channel_test.log: ags_volume_channel_test$(EXEEXT) @p='ags_volume_channel_test$(EXEEXT)'; \ b='ags_volume_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_add_audio_test.log: ags_add_audio_test$(EXEEXT) @p='ags_add_audio_test$(EXEEXT)'; \ b='ags_add_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_add_audio_signal_test.log: ags_add_audio_signal_test$(EXEEXT) @p='ags_add_audio_signal_test$(EXEEXT)'; \ b='ags_add_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_add_effect_test.log: ags_add_effect_test$(EXEEXT) @p='ags_add_effect_test$(EXEEXT)'; \ b='ags_add_effect_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_add_note_test.log: ags_add_note_test$(EXEEXT) @p='ags_add_note_test$(EXEEXT)'; \ b='ags_add_note_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_add_soundcard_test.log: ags_add_soundcard_test$(EXEEXT) @p='ags_add_soundcard_test$(EXEEXT)'; \ b='ags_add_soundcard_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_apply_bpm_test.log: ags_apply_bpm_test$(EXEEXT) @p='ags_apply_bpm_test$(EXEEXT)'; \ b='ags_apply_bpm_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_apply_presets_test.log: ags_apply_presets_test$(EXEEXT) @p='ags_apply_presets_test$(EXEEXT)'; \ b='ags_apply_presets_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_apply_sequencer_length_test.log: ags_apply_sequencer_length_test$(EXEEXT) @p='ags_apply_sequencer_length_test$(EXEEXT)'; \ b='ags_apply_sequencer_length_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_apply_synth_test.log: ags_apply_synth_test$(EXEEXT) @p='ags_apply_synth_test$(EXEEXT)'; \ b='ags_apply_synth_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_apply_tact_test.log: ags_apply_tact_test$(EXEEXT) @p='ags_apply_tact_test$(EXEEXT)'; \ b='ags_apply_tact_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_cancel_audio_test.log: ags_cancel_audio_test$(EXEEXT) @p='ags_cancel_audio_test$(EXEEXT)'; \ b='ags_cancel_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_cancel_channel_test.log: ags_cancel_channel_test$(EXEEXT) @p='ags_cancel_channel_test$(EXEEXT)'; \ b='ags_cancel_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_clear_audio_signal_test.log: ags_clear_audio_signal_test$(EXEEXT) @p='ags_clear_audio_signal_test$(EXEEXT)'; \ b='ags_clear_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_clear_buffer_test.log: ags_clear_buffer_test$(EXEEXT) @p='ags_clear_buffer_test$(EXEEXT)'; \ b='ags_clear_buffer_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_crop_note_test.log: ags_crop_note_test$(EXEEXT) @p='ags_crop_note_test$(EXEEXT)'; \ b='ags_crop_note_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_export_output_test.log: ags_export_output_test$(EXEEXT) @p='ags_export_output_test$(EXEEXT)'; \ b='ags_export_output_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_free_selection_test.log: ags_free_selection_test$(EXEEXT) @p='ags_free_selection_test$(EXEEXT)'; \ b='ags_free_selection_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_link_channel_test.log: ags_link_channel_test$(EXEEXT) @p='ags_link_channel_test$(EXEEXT)'; \ b='ags_link_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_move_note_test.log: ags_move_note_test$(EXEEXT) @p='ags_move_note_test$(EXEEXT)'; \ b='ags_move_note_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_remove_audio_test.log: ags_remove_audio_test$(EXEEXT) @p='ags_remove_audio_test$(EXEEXT)'; \ b='ags_remove_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_remove_audio_signal_test.log: ags_remove_audio_signal_test$(EXEEXT) @p='ags_remove_audio_signal_test$(EXEEXT)'; \ b='ags_remove_audio_signal_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_remove_note_test.log: ags_remove_note_test$(EXEEXT) @p='ags_remove_note_test$(EXEEXT)'; \ b='ags_remove_note_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_remove_soundcard_test.log: ags_remove_soundcard_test$(EXEEXT) @p='ags_remove_soundcard_test$(EXEEXT)'; \ b='ags_remove_soundcard_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_reset_amplitude_test.log: ags_reset_amplitude_test$(EXEEXT) @p='ags_reset_amplitude_test$(EXEEXT)'; \ b='ags_reset_amplitude_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_reset_peak_test.log: ags_reset_peak_test$(EXEEXT) @p='ags_reset_peak_test$(EXEEXT)'; \ b='ags_reset_peak_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_resize_audio_test.log: ags_resize_audio_test$(EXEEXT) @p='ags_resize_audio_test$(EXEEXT)'; \ b='ags_resize_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_seek_soundcard_test.log: ags_seek_soundcard_test$(EXEEXT) @p='ags_seek_soundcard_test$(EXEEXT)'; \ b='ags_seek_soundcard_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_set_audio_channels_test.log: ags_set_audio_channels_test$(EXEEXT) @p='ags_set_audio_channels_test$(EXEEXT)'; \ b='ags_set_audio_channels_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_set_buffer_size_test.log: ags_set_buffer_size_test$(EXEEXT) @p='ags_set_buffer_size_test$(EXEEXT)'; \ b='ags_set_buffer_size_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_set_device_test.log: ags_set_device_test$(EXEEXT) @p='ags_set_device_test$(EXEEXT)'; \ b='ags_set_device_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_set_format_test.log: ags_set_format_test$(EXEEXT) @p='ags_set_format_test$(EXEEXT)'; \ b='ags_set_format_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_set_muted_test.log: ags_set_muted_test$(EXEEXT) @p='ags_set_muted_test$(EXEEXT)'; \ b='ags_set_muted_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_set_samplerate_test.log: ags_set_samplerate_test$(EXEEXT) @p='ags_set_samplerate_test$(EXEEXT)'; \ b='ags_set_samplerate_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_start_audio_test.log: ags_start_audio_test$(EXEEXT) @p='ags_start_audio_test$(EXEEXT)'; \ b='ags_start_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_start_channel_test.log: ags_start_channel_test$(EXEEXT) @p='ags_start_channel_test$(EXEEXT)'; \ b='ags_start_channel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_xorg_application_context_test.log: ags_xorg_application_context_test$(EXEEXT) @p='ags_xorg_application_context_test$(EXEEXT)'; \ b='ags_xorg_application_context_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_server_test.log: ags_functional_server_test$(EXEEXT) @p='ags_functional_server_test$(EXEEXT)'; \ b='ags_functional_server_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_audio_test.log: ags_functional_audio_test$(EXEEXT) @p='ags_functional_audio_test$(EXEEXT)'; \ b='ags_functional_audio_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_pitch_test.log: ags_functional_pitch_test$(EXEEXT) @p='ags_functional_pitch_test$(EXEEXT)'; \ b='ags_functional_pitch_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_fourier_transform_test.log: ags_functional_fourier_transform_test$(EXEEXT) @p='ags_functional_fourier_transform_test$(EXEEXT)'; \ b='ags_functional_fourier_transform_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_osc_server_test.log: ags_functional_osc_server_test$(EXEEXT) @p='ags_functional_osc_server_test$(EXEEXT)'; \ b='ags_functional_osc_server_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_osc_xmlrpc_server_test.log: ags_functional_osc_xmlrpc_server_test$(EXEEXT) @p='ags_functional_osc_xmlrpc_server_test$(EXEEXT)'; \ b='ags_functional_osc_xmlrpc_server_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_machine_add_and_destroy_test.log: ags_functional_machine_add_and_destroy_test$(EXEEXT) @p='ags_functional_machine_add_and_destroy_test$(EXEEXT)'; \ b='ags_functional_machine_add_and_destroy_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_machine_link_test.log: ags_functional_machine_link_test$(EXEEXT) @p='ags_functional_machine_link_test$(EXEEXT)'; \ b='ags_functional_machine_link_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_line_member_add_and_destroy_test.log: ags_functional_line_member_add_and_destroy_test$(EXEEXT) @p='ags_functional_line_member_add_and_destroy_test$(EXEEXT)'; \ b='ags_functional_line_member_add_and_destroy_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_notation_editor_workflow_test.log: ags_functional_notation_editor_workflow_test$(EXEEXT) @p='ags_functional_notation_editor_workflow_test$(EXEEXT)'; \ b='ags_functional_notation_editor_workflow_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_automation_editor_workflow_test.log: ags_functional_automation_editor_workflow_test$(EXEEXT) @p='ags_functional_automation_editor_workflow_test$(EXEEXT)'; \ b='ags_functional_automation_editor_workflow_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_panel_test.log: ags_functional_panel_test$(EXEEXT) @p='ags_functional_panel_test$(EXEEXT)'; \ b='ags_functional_panel_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_mixer_test.log: ags_functional_mixer_test$(EXEEXT) @p='ags_functional_mixer_test$(EXEEXT)'; \ b='ags_functional_mixer_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_drum_test.log: ags_functional_drum_test$(EXEEXT) @p='ags_functional_drum_test$(EXEEXT)'; \ b='ags_functional_drum_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_matrix_test.log: ags_functional_matrix_test$(EXEEXT) @p='ags_functional_matrix_test$(EXEEXT)'; \ b='ags_functional_matrix_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_synth_test.log: ags_functional_synth_test$(EXEEXT) @p='ags_functional_synth_test$(EXEEXT)'; \ b='ags_functional_synth_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_ffplayer_test.log: ags_functional_ffplayer_test$(EXEEXT) @p='ags_functional_ffplayer_test$(EXEEXT)'; \ b='ags_functional_ffplayer_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_notation_edit_test.log: ags_functional_notation_edit_test$(EXEEXT) @p='ags_functional_notation_edit_test$(EXEEXT)'; \ b='ags_functional_notation_edit_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ags_functional_audio_config_test.log: ags_functional_audio_config_test$(EXEEXT) @p='ags_functional_audio_config_test$(EXEEXT)'; \ b='ags_functional_audio_config_test'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_LTLIBRARIES) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(DATA) $(HEADERS) install-binPROGRAMS: install-libLTLIBRARIES installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libgsequencerdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(appdatadir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ags/$(DEPDIR)/$(am__dirstamp) -rm -f ags/$(am__dirstamp) -rm -f ags/X/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/$(am__dirstamp) -rm -f ags/X/editor/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/editor/$(am__dirstamp) -rm -f ags/X/export/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/export/$(am__dirstamp) -rm -f ags/X/file/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/file/$(am__dirstamp) -rm -f ags/X/import/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/import/$(am__dirstamp) -rm -f ags/X/machine/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/machine/$(am__dirstamp) -rm -f ags/X/osc/controller/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/osc/controller/$(am__dirstamp) -rm -f ags/X/task/$(DEPDIR)/$(am__dirstamp) -rm -f ags/X/task/$(am__dirstamp) -rm -f ags/audio/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/$(am__dirstamp) -rm -f ags/audio/audio-unit/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/audio-unit/$(am__dirstamp) -rm -f ags/audio/core-audio/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/core-audio/$(am__dirstamp) -rm -f ags/audio/file/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/file/$(am__dirstamp) -rm -f ags/audio/jack/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/jack/$(am__dirstamp) -rm -f ags/audio/midi/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/midi/$(am__dirstamp) -rm -f ags/audio/osc/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/osc/$(am__dirstamp) -rm -f ags/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/osc/controller/$(am__dirstamp) -rm -f ags/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/osc/xmlrpc/$(am__dirstamp) -rm -f ags/audio/pulse/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/pulse/$(am__dirstamp) -rm -f ags/audio/recall/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/recall/$(am__dirstamp) -rm -f ags/audio/task/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/task/$(am__dirstamp) -rm -f ags/audio/thread/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/thread/$(am__dirstamp) -rm -f ags/audio/wasapi/$(DEPDIR)/$(am__dirstamp) -rm -f ags/audio/wasapi/$(am__dirstamp) -rm -f ags/file/$(DEPDIR)/$(am__dirstamp) -rm -f ags/file/$(am__dirstamp) -rm -f ags/lib/$(DEPDIR)/$(am__dirstamp) -rm -f ags/lib/$(am__dirstamp) -rm -f ags/object/$(DEPDIR)/$(am__dirstamp) -rm -f ags/object/$(am__dirstamp) -rm -f ags/plugin/$(DEPDIR)/$(am__dirstamp) -rm -f ags/plugin/$(am__dirstamp) -rm -f ags/server/$(DEPDIR)/$(am__dirstamp) -rm -f ags/server/$(am__dirstamp) -rm -f ags/server/controller/$(DEPDIR)/$(am__dirstamp) -rm -f ags/server/controller/$(am__dirstamp) -rm -f ags/server/security/$(DEPDIR)/$(am__dirstamp) -rm -f ags/server/security/$(am__dirstamp) -rm -f ags/test/X/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/X/$(am__dirstamp) -rm -f ags/test/X/machine/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/X/machine/$(am__dirstamp) -rm -f ags/test/audio/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/$(am__dirstamp) -rm -f ags/test/audio/midi/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/midi/$(am__dirstamp) -rm -f ags/test/audio/osc/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/osc/$(am__dirstamp) -rm -f ags/test/audio/osc/controller/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/osc/controller/$(am__dirstamp) -rm -f ags/test/audio/osc/xmlrpc/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/osc/xmlrpc/$(am__dirstamp) -rm -f ags/test/audio/recall/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/recall/$(am__dirstamp) -rm -f ags/test/audio/task/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/audio/task/$(am__dirstamp) -rm -f ags/test/file/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/file/$(am__dirstamp) -rm -f ags/test/lib/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/lib/$(am__dirstamp) -rm -f ags/test/object/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/object/$(am__dirstamp) -rm -f ags/test/plugin/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/plugin/$(am__dirstamp) -rm -f ags/test/server/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/server/$(am__dirstamp) -rm -f ags/test/server/controller/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/server/controller/$(am__dirstamp) -rm -f ags/test/server/security/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/server/security/$(am__dirstamp) -rm -f ags/test/thread/$(DEPDIR)/$(am__dirstamp) -rm -f ags/test/thread/$(am__dirstamp) -rm -f ags/thread/$(DEPDIR)/$(am__dirstamp) -rm -f ags/thread/$(am__dirstamp) -rm -f ags/util/$(DEPDIR)/$(am__dirstamp) -rm -f ags/util/$(am__dirstamp) -rm -f ags/vst3-capi/base/source/$(DEPDIR)/$(am__dirstamp) -rm -f ags/vst3-capi/base/source/$(am__dirstamp) -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/$(am__dirstamp) -rm -f ags/vst3-capi/pluginterfaces/base/$(am__dirstamp) -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/$(am__dirstamp) -rm -f ags/vst3-capi/public.sdk/source/vst/$(am__dirstamp) -rm -f ags/vst3-capi/util/$(DEPDIR)/$(am__dirstamp) -rm -f ags/vst3-capi/util/$(am__dirstamp) -rm -f ags/widget/$(DEPDIR)/$(am__dirstamp) -rm -f ags/widget/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-recursive ags-docs-am: ags-docs-local clean: clean-recursive clean-am: clean-binPROGRAMS clean-checkLTLIBRARIES clean-checkPROGRAMS \ clean-generic clean-libLTLIBRARIES \ clean-libgsequencerLTLIBRARIES clean-libtool clean-local \ mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f ags/$(DEPDIR)/gsequencer-gsequencer_main.Po -rm -f ags/$(DEPDIR)/midi2xml-midi2xml_main.Po -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Plo -rm -f ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Plo -rm -f ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Plo -rm -f ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Plo -rm -f ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Plo -rm -f ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Plo -rm -f ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Plo -rm -f ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_launch.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_link.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_complex.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_conversion.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_endian.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_function.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_log.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_regex.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_string_util.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_time.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_turtle.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_uuid.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_applicable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_application_context.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_config.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_connectable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_countable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_cursor.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_globals.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_main_loop.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_marshal.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_mutable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_plugin.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_portlet.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_priority.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_seekable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_sequencer.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_sound_server.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_soundcard.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_tactable.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_registry.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_server.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Plo -rm -f ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Plo -rm -f ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Plo -rm -f ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Plo -rm -f ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Po -rm -f ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Plo -rm -f ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Plo -rm -f ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Po -rm -f ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Po -rm -f ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Po -rm -f ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Po -rm -f ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Po -rm -f ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Po -rm -f ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Po -rm -f ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Po -rm -f ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Po -rm -f ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Po -rm -f ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Po -rm -f ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Po -rm -f ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Po -rm -f ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Po -rm -f ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Po -rm -f ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Po -rm -f ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Po -rm -f ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Po -rm -f ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Po -rm -f ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Po -rm -f ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Po -rm -f ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Po -rm -f ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Po -rm -f ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Po -rm -f ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Po -rm -f ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Po -rm -f ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Po -rm -f ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Po -rm -f ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Po -rm -f ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Po -rm -f ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Po -rm -f ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Po -rm -f ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Po -rm -f ags/test/file/$(DEPDIR)/file_test-ags_file_test.Po -rm -f ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Po -rm -f ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Po -rm -f ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Po -rm -f ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Po -rm -f ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Po -rm -f ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Po -rm -f ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Po -rm -f ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Po -rm -f ags/test/object/$(DEPDIR)/config_test-ags_config_test.Po -rm -f ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Po -rm -f ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Po -rm -f ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Po -rm -f ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Po -rm -f ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Po -rm -f ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Po -rm -f ags/test/server/$(DEPDIR)/server_test-ags_server_test.Po -rm -f ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Po -rm -f ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Po -rm -f ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Po -rm -f ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Po -rm -f ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Po -rm -f ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Po -rm -f ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Po -rm -f ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Po -rm -f ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Po -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_id_generator.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_list_util.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Plo -rm -f ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Plo -rm -f ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html-am: info: info-recursive info-am: install-data-am: install-appdataDATA install-data-local \ install-docDATA install-girDATA \ install-libgsequencerLTLIBRARIES install-man \ install-nobase_includeHEADERS install-pkgconfigDATA \ install-typelibDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f ags/$(DEPDIR)/gsequencer-gsequencer_main.Po -rm -f ags/$(DEPDIR)/midi2xml-midi2xml_main.Po -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_animation_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_audio_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_automation_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_bulk_member_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_connection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_context_menu.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_dssi_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bridge_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_bulk_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_generic_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_input_listing_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_ladspa_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_line_member_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_link_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_listing_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_lv2_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_machine_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_action_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_menu_bar.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_dialog_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_midi_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_navigation_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_notation_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_osc_server_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_output_listing_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_pad_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_performance_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_playback_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_browser_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_plugin_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_collection_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_property_listing_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_resize_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sequencer_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_server_preferences_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_sheet_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_soundcard_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_ui_provider.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_editor_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_wave_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_window.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_window_callbacks.Plo -rm -f ags/X/$(DEPDIR)/libgsequencer_la-ags_xorg_application_context.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_meta_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_automation_toolbar_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_crop_note_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_editor_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_envelope_info_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_radio_button_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selection.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_machine_selector_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_move_note_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_meta_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_notation_toolbar_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_pattern_envelope_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_automation_cursor_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_notation_cursor_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_position_wave_cursor_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_ramp_acceleration_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_automation_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_scrolled_wave_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_acceleration_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_buffer_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_select_note_dialog_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_sheet_toolbar_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vautomation_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_vwave_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_box.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_edit_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_meta_callbacks.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar.Plo -rm -f ags/X/editor/$(DEPDIR)/libgsequencer_la-ags_wave_toolbar_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_machine_collection_entry_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_midi_export_wizard_callbacks.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog.Plo -rm -f ags/X/export/$(DEPDIR)/libgsequencer_la-ags_wave_export_dialog_callbacks.Plo -rm -f ags/X/file/$(DEPDIR)/libgsequencer_la-ags_simple_file.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_midi_import_wizard_callbacks.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_callbacks.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper.Plo -rm -f ags/X/import/$(DEPDIR)/libgsequencer_la-ags_track_collection_mapper_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_audiorec_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_cell_pattern_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_desk_input_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_input_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_drum_output_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_dssi_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_equalizer10_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_bulk_input_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ffplayer_input_pad_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_oscillator_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_syncsynth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_fm_synth_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_ladspa_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_dssi_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_live_lv2_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_lv2_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bridge_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_bulk_input_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_matrix_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_mixer_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_oscillator_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_panel_input_pad.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pattern_box_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_pitch_sampler_file_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_spectrometer_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_syncsynth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_line_callbacks.Plo -rm -f ags/X/machine/$(DEPDIR)/libgsequencer_la-ags_synth_input_pad.Plo -rm -f ags/X/osc/controller/$(DEPDIR)/libgsequencer_la-ags_ui_osc_renew_controller.Plo -rm -f ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_read.Plo -rm -f ags/X/task/$(DEPDIR)/libgsequencer_la-ags_simple_file_write.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_acceleration.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_application_context.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_buffer_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_audio_signal.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_automation.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_buffer.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_channel.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_char_buffer_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_devin.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_devout.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_diatonic_scale.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_fifoout.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_filter_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_fm_synth_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_fourier_transform_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_frequency_map_manager.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_channel_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_generic_recall_recycling.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_input.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_lfo_synth_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_midi.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_midiin.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_notation.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_note.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_output.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_pattern.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_playback.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_playback_domain.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_port.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_preset.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_audio_signal.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_channel_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_container.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dependency.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_dssi_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_factory.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_id.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_ladspa_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_lv2_run.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recall_recycling.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_recycling_context.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_sequencer_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_sound_provider.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_soundcard_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_generator.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_synth_util.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_track.Plo -rm -f ags/audio/$(DEPDIR)/libags_audio_la-ags_wave.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_client.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devin.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_devout.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_port.Plo -rm -f ags/audio/audio-unit/$(DEPDIR)/libags_audio_la-ags_audio_unit_server.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_client.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devin.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_devout.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_midiin.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_port.Plo -rm -f ags/audio/core-audio/$(DEPDIR)/libags_audio_la-ags_core_audio_server.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_container.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_audio_file_link.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_dls2_reader.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_gig_reader.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sample.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_ipatch_sf2_reader.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_file.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_group.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_region.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sfz_sample.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sndfile.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_container.Plo -rm -f ags/audio/file/$(DEPDIR)/libags_audio_la-ags_sound_resource.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_client.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devin.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_devout.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_midiin.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_port.Plo -rm -f ags/audio/jack/$(DEPDIR)/libags_audio_la-ags_jack_server.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_buffer_util.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_builder.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_file.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_parser.Plo -rm -f ags/audio/midi/$(DEPDIR)/libags_audio_la-ags_midi_util.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_buffer_util.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_builder.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_client.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_connection.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_message.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_parser.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_response.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_server.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_util.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_websocket_connection.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_message.Plo -rm -f ags/audio/osc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_server.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_action_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_config_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_export_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_front_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_info_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_meter_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_node_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_plugin_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_renew_controller.Plo -rm -f ags/audio/osc/controller/$(DEPDIR)/libags_audio_la-ags_osc_status_controller.Plo -rm -f ags/audio/osc/xmlrpc/$(DEPDIR)/libags_audio_la-ags_osc_xmlrpc_controller.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_client.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devin.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_devout.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_port.Plo -rm -f ags/audio/pulse/$(DEPDIR)/libags_audio_la-ags_pulse_server.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_analyse_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_buffer_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_capture_wave_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_pattern_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_copy_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_count_beats_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_delay_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_envelope_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_eq10_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_feed_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_lfo_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_loop_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_mute_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_peak_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_channel_run_master.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_dssi_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_lv2_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_notation_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_play_wave_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_prepare_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_record_midi_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_dssi_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_route_lv2_audio_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_rt_stream_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_stream_recycling.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_audio_signal.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_channel_run.Plo -rm -f ags/audio/recall/$(DEPDIR)/libags_audio_la-ags_volume_recycling.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_audio_signal.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_effect.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_add_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_bpm.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_presets.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sequencer_length.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_sound_config.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_synth.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_apply_tact.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_crop_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_link_channel.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_move_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_file.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_instrument.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_sf2_sample.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_single_file.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_open_wave.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_audio_signal.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_remove_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_amplitude.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_note.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_reset_peak.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_resize_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_seek_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_audio_channels.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_buffer_size.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_device.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_format.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_muted.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_set_samplerate.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_audio.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_channel.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_sequencer.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_start_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_sequencer.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_stop_soundcard.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_switch_buffer_flag.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_tic_device.Plo -rm -f ags/audio/task/$(DEPDIR)/libags_audio_la-ags_toggle_pattern_bit.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_loop.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_audio_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_channel_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_export_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sequencer_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sf2_loader.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_sfz_loader.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_soundcard_thread.Plo -rm -f ags/audio/thread/$(DEPDIR)/libags_audio_la-ags_wave_loader.Plo -rm -f ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devin.Plo -rm -f ags/audio/wasapi/$(DEPDIR)/libags_audio_la-ags_wasapi_devout.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_id_ref.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_launch.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_link.Plo -rm -f ags/file/$(DEPDIR)/libags_la-ags_file_lookup.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_buffer_util.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_complex.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_conversion.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_endian.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_function.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_log.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_regex.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_solver_matrix.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_solver_vector.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_string_util.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_time.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_turtle.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_turtle_manager.Plo -rm -f ags/lib/$(DEPDIR)/libags_la-ags_uuid.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_applicable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_application_context.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_config.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_connectable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_countable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_cursor.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_globals.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_main_loop.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_marshal.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_mutable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_plugin.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_portlet.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_priority.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_seekable.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_sequencer.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_sound_server.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_soundcard.Plo -rm -f ags/object/$(DEPDIR)/libags_la-ags_tactable.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_base_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_dssi_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_conversion.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_ladspa_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_conversion.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_event_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_log_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_option_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_preset_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_turtle_parser.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_uri_map_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_urid_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2_worker_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_manager.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_lv2ui_plugin.Plo -rm -f ags/plugin/$(DEPDIR)/libags_audio_la-ags_plugin_port.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_registry.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_server.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_server_status.Plo -rm -f ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Plo -rm -f ags/server/controller/$(DEPDIR)/libags_server_la-ags_controller.Plo -rm -f ags/server/controller/$(DEPDIR)/libags_server_la-ags_front_controller.Plo -rm -f ags/server/controller/$(DEPDIR)/libags_server_la-ags_plugin_controller.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_auth_security_context.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_authentication_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_business_group_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_certificate_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_password_store_manager.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_security_context.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_authentication.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_business_group.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_certificate.Plo -rm -f ags/server/security/$(DEPDIR)/libags_server_la-ags_xml_password_store.Plo -rm -f ags/test/X/$(DEPDIR)/functional_audio_config_test-ags_functional_audio_config_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_automation_editor_workflow_test-ags_functional_automation_editor_workflow_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_machine_link_test-ags_functional_machine_link_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_notation_edit_test-ags_functional_notation_edit_test.Po -rm -f ags/test/X/$(DEPDIR)/functional_notation_editor_workflow_test-ags_functional_notation_editor_workflow_test.Po -rm -f ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Plo -rm -f ags/test/X/$(DEPDIR)/libgsequencer_test_la-gsequencer_setup_util.Plo -rm -f ags/test/X/$(DEPDIR)/xorg_application_context_test-ags_xorg_application_context_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_drum_test-ags_functional_drum_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_ffplayer_test-ags_functional_ffplayer_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_matrix_test-ags_functional_matrix_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_mixer_test-ags_functional_mixer_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_panel_test-ags_functional_panel_test.Po -rm -f ags/test/X/machine/$(DEPDIR)/functional_synth_test-ags_functional_synth_test.Po -rm -f ags/test/audio/$(DEPDIR)/acceleration_test-ags_acceleration_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_application_context_test-ags_audio_application_context_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_buffer_util_test-ags_audio_buffer_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_signal_test-ags_audio_signal_test.Po -rm -f ags/test/audio/$(DEPDIR)/audio_test-ags_audio_test.Po -rm -f ags/test/audio/$(DEPDIR)/automation_test-ags_automation_test.Po -rm -f ags/test/audio/$(DEPDIR)/buffer_test-ags_buffer_test.Po -rm -f ags/test/audio/$(DEPDIR)/channel_test-ags_channel_test.Po -rm -f ags/test/audio/$(DEPDIR)/char_buffer_util_test-ags_char_buffer_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/devin_test-ags_devin_test.Po -rm -f ags/test/audio/$(DEPDIR)/devout_test-ags_devout_test.Po -rm -f ags/test/audio/$(DEPDIR)/fifoout_test-ags_fifoout_test.Po -rm -f ags/test/audio/$(DEPDIR)/filter_util_test-ags_filter_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/fm_synth_util_test-ags_fm_synth_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/fourier_transform_util_test-ags_fourier_transform_util_test.Po -rm -f ags/test/audio/$(DEPDIR)/functional_audio_test-ags_functional_audio_test.Po -rm -f ags/test/audio/$(DEPDIR)/functional_fourier_transform_test-ags_functional_fourier_transform_test.Po -rm -f ags/test/audio/$(DEPDIR)/functional_pitch_test-ags_functional_pitch_test.Po -rm -f ags/test/audio/$(DEPDIR)/input_test-ags_input_test.Po -rm -f ags/test/audio/$(DEPDIR)/midi_test-ags_midi_test.Po -rm -f ags/test/audio/$(DEPDIR)/midiin_test-ags_midiin_test.Po -rm -f ags/test/audio/$(DEPDIR)/notation_test-ags_notation_test.Po -rm -f ags/test/audio/$(DEPDIR)/note_test-ags_note_test.Po -rm -f ags/test/audio/$(DEPDIR)/output_test-ags_output_test.Po -rm -f ags/test/audio/$(DEPDIR)/pattern_test-ags_pattern_test.Po -rm -f ags/test/audio/$(DEPDIR)/playback_domain_test-ags_playback_domain_test.Po -rm -f ags/test/audio/$(DEPDIR)/playback_test-ags_playback_test.Po -rm -f ags/test/audio/$(DEPDIR)/port_test-ags_port_test.Po -rm -f ags/test/audio/$(DEPDIR)/preset_test-ags_preset_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_channel_run_test-ags_recall_channel_run_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_channel_test-ags_recall_channel_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_container_test-ags_recall_container_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_dependency_test-ags_recall_dependency_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_id_test-ags_recall_id_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_recycling_test-ags_recall_recycling_test.Po -rm -f ags/test/audio/$(DEPDIR)/recall_test-ags_recall_test.Po -rm -f ags/test/audio/$(DEPDIR)/recycling_context_test-ags_recycling_context_test.Po -rm -f ags/test/audio/$(DEPDIR)/recycling_test-ags_recycling_test.Po -rm -f ags/test/audio/$(DEPDIR)/synth_generator_test-ags_synth_generator_test.Po -rm -f ags/test/audio/$(DEPDIR)/track_test-ags_track_test.Po -rm -f ags/test/audio/$(DEPDIR)/wave_test-ags_wave_test.Po -rm -f ags/test/audio/midi/$(DEPDIR)/midi_buffer_util_test-ags_midi_buffer_util_test.Po -rm -f ags/test/audio/midi/$(DEPDIR)/midi_builder_test-ags_midi_builder_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/functional_osc_server_test-ags_functional_osc_server_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/functional_osc_xmlrpc_server_test-ags_functional_osc_xmlrpc_server_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_buffer_util_test-ags_osc_buffer_util_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_client_test-ags_osc_client_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_connection_test-ags_osc_connection_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_message_test-ags_osc_message_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_server_test-ags_osc_server_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_websocket_connection_test-ags_osc_websocket_connection_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_message_test-ags_osc_xmlrpc_message_test.Po -rm -f ags/test/audio/osc/$(DEPDIR)/osc_xmlrpc_server_test-ags_osc_xmlrpc_server_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_action_controller_test-ags_osc_action_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_config_controller_test-ags_osc_config_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_front_controller_test-ags_osc_front_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_info_controller_test-ags_osc_info_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_meter_controller_test-ags_osc_meter_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_node_controller_test-ags_osc_node_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_renew_controller_test-ags_osc_renew_controller_test.Po -rm -f ags/test/audio/osc/controller/$(DEPDIR)/osc_status_controller_test-ags_osc_status_controller_test.Po -rm -f ags/test/audio/osc/xmlrpc/$(DEPDIR)/osc_xmlrpc_controller_test-ags_osc_xmlrpc_controller_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/analyse_audio_signal_test-ags_analyse_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/analyse_channel_test-ags_analyse_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/buffer_audio_signal_test-ags_buffer_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/buffer_channel_test-ags_buffer_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/capture_wave_audio_test-ags_capture_wave_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/capture_wave_channel_test-ags_capture_wave_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_audio_signal_test-ags_copy_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_channel_test-ags_copy_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_pattern_audio_test-ags_copy_pattern_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/copy_pattern_channel_test-ags_copy_pattern_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/count_beats_audio_test-ags_count_beats_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/delay_audio_test-ags_delay_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/envelope_audio_signal_test-ags_envelope_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/envelope_channel_test-ags_envelope_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/eq10_audio_signal_test-ags_eq10_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/eq10_channel_test-ags_eq10_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/feed_audio_signal_test-ags_feed_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/mute_audio_signal_test-ags_mute_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/mute_audio_test-ags_mute_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/mute_channel_test-ags_mute_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/peak_audio_signal_test-ags_peak_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/peak_channel_test-ags_peak_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_audio_signal_test-ags_play_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_audio_test-ags_play_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_channel_test-ags_play_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_wave_audio_test-ags_play_wave_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/play_wave_channel_test-ags_play_wave_channel_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/prepare_audio_signal_test-ags_prepare_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/record_midi_audio_test-ags_record_midi_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/route_dssi_audio_test-ags_route_dssi_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/route_lv2_audio_test-ags_route_lv2_audio_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/stream_audio_signal_test-ags_stream_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/volume_audio_signal_test-ags_volume_audio_signal_test.Po -rm -f ags/test/audio/recall/$(DEPDIR)/volume_channel_test-ags_volume_channel_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_audio_signal_test-ags_add_audio_signal_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_audio_test-ags_add_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_effect_test-ags_add_effect_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_note_test-ags_add_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/add_soundcard_test-ags_add_soundcard_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_bpm_test-ags_apply_bpm_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_presets_test-ags_apply_presets_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_sequencer_length_test-ags_apply_sequencer_length_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_synth_test-ags_apply_synth_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/apply_tact_test-ags_apply_tact_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/cancel_audio_test-ags_cancel_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/cancel_channel_test-ags_cancel_channel_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/clear_audio_signal_test-ags_clear_audio_signal_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/clear_buffer_test-ags_clear_buffer_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/crop_note_test-ags_crop_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/export_output_test-ags_export_output_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/free_selection_test-ags_free_selection_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/link_channel_test-ags_link_channel_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/move_note_test-ags_move_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_audio_signal_test-ags_remove_audio_signal_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_audio_test-ags_remove_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_note_test-ags_remove_note_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/remove_soundcard_test-ags_remove_soundcard_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/reset_amplitude_test-ags_reset_amplitude_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/reset_peak_test-ags_reset_peak_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/resize_audio_test-ags_resize_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/seek_soundcard_test-ags_seek_soundcard_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_audio_channels_test-ags_set_audio_channels_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_buffer_size_test-ags_set_buffer_size_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_device_test-ags_set_device_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_format_test-ags_set_format_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_muted_test-ags_set_muted_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/set_samplerate_test-ags_set_samplerate_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/start_audio_test-ags_start_audio_test.Po -rm -f ags/test/audio/task/$(DEPDIR)/start_channel_test-ags_start_channel_test.Po -rm -f ags/test/file/$(DEPDIR)/file_id_ref_test-ags_file_id_ref_test.Po -rm -f ags/test/file/$(DEPDIR)/file_launch_test-ags_file_launch_test.Po -rm -f ags/test/file/$(DEPDIR)/file_lookup_test-ags_file_lookup_test.Po -rm -f ags/test/file/$(DEPDIR)/file_test-ags_file_test.Po -rm -f ags/test/lib/$(DEPDIR)/buffer_util_test-ags_buffer_util_test.Po -rm -f ags/test/lib/$(DEPDIR)/complex_test-ags_complex_test.Po -rm -f ags/test/lib/$(DEPDIR)/conversion_test-ags_conversion_test.Po -rm -f ags/test/lib/$(DEPDIR)/log_test-ags_log_test.Po -rm -f ags/test/lib/$(DEPDIR)/time_test-ags_time_test.Po -rm -f ags/test/lib/$(DEPDIR)/turtle_manager_test-ags_turtle_manager_test.Po -rm -f ags/test/lib/$(DEPDIR)/turtle_test-ags_turtle_test.Po -rm -f ags/test/object/$(DEPDIR)/application_context_test-ags_application_context_test.Po -rm -f ags/test/object/$(DEPDIR)/config_test-ags_config_test.Po -rm -f ags/test/object/$(DEPDIR)/connectable_test-ags_connectable_test.Po -rm -f ags/test/object/$(DEPDIR)/soundcard_test-ags_soundcard_test.Po -rm -f ags/test/plugin/$(DEPDIR)/base_plugin_test-ags_base_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/dssi_manager_test-ags_dssi_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/dssi_plugin_test-ags_dssi_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/ladspa_conversion_test-ags_ladspa_conversion_test.Po -rm -f ags/test/plugin/$(DEPDIR)/ladspa_manager_test-ags_ladspa_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_conversion_test-ags_lv2_conversion_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_manager_test-ags_lv2_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_option_manager_test-ags_lv2_option_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_plugin_test-ags_lv2_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_preset_test-ags_lv2_preset_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_uri_map_manager_test-ags_lv2_uri_map_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_urid_manager_test-ags_lv2_urid_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2_worker_manager_test-ags_lv2_worker_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2ui_manager_test-ags_lv2ui_manager_test.Po -rm -f ags/test/plugin/$(DEPDIR)/lv2ui_plugin_test-ags_lv2ui_plugin_test.Po -rm -f ags/test/plugin/$(DEPDIR)/plugin_port_test-ags_plugin_port_test.Po -rm -f ags/test/server/$(DEPDIR)/functional_server_test-ags_functional_server_test.Po -rm -f ags/test/server/$(DEPDIR)/server_application_context_test-ags_server_application_context_test.Po -rm -f ags/test/server/$(DEPDIR)/server_test-ags_server_test.Po -rm -f ags/test/server/controller/$(DEPDIR)/controller_test-ags_controller_test.Po -rm -f ags/test/server/controller/$(DEPDIR)/front_controller_test-ags_front_controller_test.Po -rm -f ags/test/server/security/$(DEPDIR)/authentication_manager_test-ags_authentication_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/business_group_manager_test-ags_business_group_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/certificate_manager_test-ags_certificate_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/password_store_manager_test-ags_password_store_manager_test.Po -rm -f ags/test/server/security/$(DEPDIR)/security_context_test-ags_security_context_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_authentication_test-ags_xml_authentication_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_business_group_test-ags_xml_business_group_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_certificate_test-ags_xml_certificate_test.Po -rm -f ags/test/server/security/$(DEPDIR)/xml_password_store_test-ags_xml_password_store_test.Po -rm -f ags/test/thread/$(DEPDIR)/destroy_worker_test-ags_destroy_worker_test.Po -rm -f ags/test/thread/$(DEPDIR)/returnable_thread_test-ags_returnable_thread_test.Po -rm -f ags/test/thread/$(DEPDIR)/task_test-ags_task_test.Po -rm -f ags/test/thread/$(DEPDIR)/thread_pool_test-ags_thread_pool_test.Po -rm -f ags/test/thread/$(DEPDIR)/thread_test-ags_thread_test.Po -rm -f ags/test/thread/$(DEPDIR)/worker_thread_test-ags_worker_thread_test.Po -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_concurrency_provider.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_destroy_worker.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_generic_main_loop.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_message_delivery.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_message_envelope.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_message_queue.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_returnable_thread.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_task.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_task_completion.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_task_launcher.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_thread.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_application_context.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_thread_pool.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_timestamp.Plo -rm -f ags/thread/$(DEPDIR)/libags_thread_la-ags_worker_thread.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_destroy_util.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_id_generator.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_list_util.Plo -rm -f ags/util/$(DEPDIR)/libags_la-ags_soundcard_helper.Plo -rm -f ags/vst3-capi/base/source/$(DEPDIR)/libags_vst_la-ags_vst_fbuffer.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_const_string_table.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fstrdefs.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ftypes.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_funknown.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_futils.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_fvariant.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_geo_constants.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ibstream.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_icloneable.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ierror_context.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_ipersistent.Plo -rm -f ags/vst3-capi/pluginterfaces/base/$(DEPDIR)/libags_vst_la-ags_vst_iplugin_base.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_audio_effect.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_bus.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_component_base.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_edit_controller.Plo -rm -f ags/vst3-capi/public.sdk/source/vst/$(DEPDIR)/libags_vst_la-ags_vst_parameters.Plo -rm -f ags/vst3-capi/util/$(DEPDIR)/libags_vst_la-ags_vst_string_util.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_cartesian.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_container.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_dial.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_expander.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_expander_set.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hindicator.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hled_array.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hlevel_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_hscale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_indicator.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_led.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_led_array.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_level.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_level_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_notebook.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_piano.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_ruler.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scale.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_level_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_piano.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_scrolled_scale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vindicator.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vled_array.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vlevel_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_vscale_box.Plo -rm -f ags/widget/$(DEPDIR)/libags_gui_la-ags_widget_marshal.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-appdataDATA uninstall-binPROGRAMS \ uninstall-docDATA uninstall-girDATA uninstall-libLTLIBRARIES \ uninstall-libgsequencerLTLIBRARIES uninstall-man \ uninstall-nobase_includeHEADERS uninstall-pkgconfigDATA \ uninstall-typelibDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) check-am install-am install-strip \ uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS ags-docs-am \ ags-docs-local all all-am am--depfiles am--refresh check \ check-TESTS check-am clean clean-binPROGRAMS \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-cscope \ clean-generic clean-libLTLIBRARIES \ clean-libgsequencerLTLIBRARIES clean-libtool clean-local \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-appdataDATA \ install-binPROGRAMS install-data install-data-am \ install-data-local install-docDATA install-dvi install-dvi-am \ install-exec install-exec-am install-girDATA install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-libgsequencerLTLIBRARIES \ install-man install-man1 install-nobase_includeHEADERS \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip install-typelibDATA installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-appdataDATA uninstall-binPROGRAMS uninstall-docDATA \ uninstall-girDATA uninstall-hook uninstall-libLTLIBRARIES \ uninstall-libgsequencerLTLIBRARIES uninstall-man \ uninstall-man1 uninstall-nobase_includeHEADERS \ uninstall-pkgconfigDATA uninstall-typelibDATA .PRECIOUS: Makefile # gir - gobject introspection -include $(INTROSPECTION_MAKEFILE) @HAVE_INTROSPECTION_TRUE@Ags-3.0.gir: libags.la libags_thread.la libags_server.la @HAVE_INTROSPECTION_TRUE@AgsAudio-3.0.gir: libags_audio.la $(top_builddir)/Ags-3.0.gir @HAVE_INTROSPECTION_TRUE@AgsGui-3.0.gir: libags_gui.la ags-integration-unit-test: $(MAKE) -C $(top_srcdir) -f unit-system-tests.mk ags-check-system-unit-tests ags-integration-functional-test: $(MAKE) -C $(top_srcdir) -f functional-system-tests.mk ags-check-system-functional-test libtool: $(LIBTOOL_DEPS) $(SHELL) ./config.status libtool gsequencer.1: gsequencer.1.xml xsltproc --nonet --param make.year.ranges 1 --param make.single.year.ranges 1 --param man.charmap.use.subset 0 -o $(top_srcdir) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl gsequencer.1.xml midi2xml.1: midi2xml.1.xml xsltproc --nonet --param make.year.ranges 1 --param make.single.year.ranges 1 --param man.charmap.use.subset 0 -o $(top_srcdir)/ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl midi2xml.1.xml gsequencer.desktop: gsequencer.desktop.in @FREEBSD_TRUE@ $(AM_V_GEN)sed -e 's,\@datadir\@,$(datadir),g' < $(top_srcdir)/gsequencer.desktop.in > $(top_builddir)/gsequencer.desktop @FREEBSD_FALSE@ $(AM_V_GEN)sed -e 's,\@datadir\@,$(datadir),g' < "$<" > $@ html: mkdir -p $(top_builddir)/html/ mkdir -p $(top_builddir)/html/developer-docs mkdir -p $(top_builddir)/html/user-docs mkdir -p $(top_builddir)/html/osc-docs xsltproc --output $(top_builddir)/html/user-docs/ --xinclude $(HTMLHELP_XSL) $(top_srcdir)/docs/usersBook.xml xsltproc --output $(top_builddir)/html/developer-docs/ --xinclude $(HTMLHELP_XSL) $(top_srcdir)/docs/developersBook.xml xsltproc --output $(top_builddir)/html/osc-docs/ --xinclude $(HTMLHELP_XSL) $(top_srcdir)/docs/oscBook.xml mkdir -p $(top_srcdir)/docs/reference/libags/libags-html mkdir -p $(top_srcdir)/docs/reference/libags-audio/libags-audio-html mkdir -p $(top_srcdir)/docs/reference/libags-gui/libags-gui-html mkdir -p $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html $(MAKE) -C $(top_srcdir)/docs/reference/libags cd $(top_srcdir) $(MAKE) -C $(top_srcdir)/docs/reference/libags-audio cd $(top_srcdir) $(MAKE) -C $(top_srcdir)/docs/reference/libags-gui cd $(top_srcdir) $(MAKE) -C $(top_srcdir)/docs/reference/libgsequencer cd $(top_srcdir) install-compress-changelog: rm -f $(DESTDIR)/$(docdir)/changelog gzip -9 -c $(top_srcdir)/ChangeLog > $(DESTDIR)/$(docdir)/changelog.gz install-data-local: mkdir -p $(DESTDIR)/$(includedir)/ags install -c -p -m 644 $(top_builddir)/ags/ags_config.h $(DESTDIR)/$(includedir)/ags/config.h mkdir -p $(DESTDIR)/$(datadir)/gsequencer/icons mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/32x32/apps mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/48x48/apps mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/64x64/apps mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/128x128/apps mkdir -p $(DESTDIR)/$(datadir)/gsequencer/images mkdir -p $(DESTDIR)/$(datadir)/gsequencer/styles mkdir -p $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION) mkdir -p $(DESTDIR)/$(datadir)/xml/gsequencer/stylesheet/ags-xsl/midi-xml mkdir -p $(DESTDIR)/$(datadir)/mime/packages mkdir -p $(DESTDIR)/$(datadir)/metainfo install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/ags.xpm $(DESTDIR)/$(datadir)/gsequencer/icons/ags.xpm install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/jumper.png $(DESTDIR)/$(datadir)/gsequencer/icons/jumper.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/ags.png $(DESTDIR)/$(datadir)/gsequencer/icons/ags.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-32x32.png $(DESTDIR)/$(datadir)/icons/hicolor/32x32/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-48x48.png $(DESTDIR)/$(datadir)/icons/hicolor/48x48/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-64x64.png $(DESTDIR)/$(datadir)/icons/hicolor/64x64/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-128x128.png $(DESTDIR)/$(datadir)/icons/hicolor/128x128/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/images/ags.png $(DESTDIR)/$(datadir)/gsequencer/images/ags.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/images/gsequencer-800x450.png $(DESTDIR)/$(datadir)/gsequencer/images/gsequencer-800x450.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/styles/ags.css $(DESTDIR)/$(datadir)/gsequencer/styles/ags.css install -c -p -m 644 $(top_srcdir)/ags/X/file/ags_simple_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags/audio/midi/ags_midi_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags/audio/osc/ags_osc_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags/file/ags_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags.xsl $(DESTDIR)/$(datadir)/xml/gsequencer/stylesheet/ags-xsl/midi-xml/ install -c -p -m 644 $(top_srcdir)/ags-simple.xsl $(DESTDIR)/$(datadir)/xml/gsequencer/stylesheet/ags-xsl/midi-xml/ install -c -p -m 644 $(top_srcdir)/application-x-gsequencer.xml $(DESTDIR)/$(datadir)/mime/packages/gsequencer.xml install -c -p -m 644 $(top_srcdir)/org.nongnu.gsequencer.gsequencer.appdata.xml $(DESTDIR)/$(datadir)/metainfo/ mkdir -p $(DESTDIR)/$(docdir)/ install -c -p -m 644 $(top_srcdir)/ChangeLog $(DESTDIR)/$(docdir)/changelog fix-local-html: find $(top_srcdir)/docs/reference/libags/libags-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-audio-html/$(LIBAGS_AUDIO_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-gui-html/$(LIBAGS_GUI_API_DOC)/g' {} \; fix-local-html-bsd: find $(top_srcdir)/docs/reference/libags/libags-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-audio-html/$(LIBAGS_AUDIO_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-gui-html/$(LIBAGS_GUI_API_DOC)/g' {} \; fix-online-books-html: find $(top_srcdir)/html/ -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\/usr\/share\/icons\/Adwaita\/32x32\/actions/..\/images/g' {} \; find $(top_srcdir)/html/ -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\/usr\/share\/icons\/Adwaita\/32x32\/apps/..\/images/g' {} \; fix-online-html: find $(top_srcdir)/docs/reference/libags/libags-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/\.\.\/libags/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/https\:\/\/developer\.gnome\.org\/gtk3\/stable/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/https\:\/\/developer\.gnome\.org\/gtk3\/stable/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/\.\.\/libags/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-audio-html/\.\.\/libags-audio/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-gui-html/\.\.\/libags-gui/g' {} \; install-html-mkdir-links: echo "creating upstream API reference manual directory [$(AGS_WITH_UPSTREAM_GTK_DOC)]" @AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBAGS_API_DIR) @AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBAGS_AUDIO_API_DIR) @AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBAGS_GUI_API_DIR) @AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBGSEQUENCER_API_DIR) install-html-mkdir: @AGS_WITH_SINGLE_DOCDIR_TRUE@ mkdir -p $(DESTDIR)/$(docdir)/images @AGS_WITH_SINGLE_DOCDIR_TRUE@ mkdir -p $(DESTDIR)/$(docdir)/user-manual @AGS_WITH_SINGLE_DOCDIR_TRUE@ mkdir -p $(DESTDIR)/$(docdir)/developer-manual @AGS_WITH_SINGLE_DOCDIR_TRUE@ mkdir -p $(DESTDIR)/$(docdir)/osc-manual @AGS_WITH_SINGLE_DOCDIR_FALSE@ mkdir -p $(DESTDIR)/$(docdir)/images @AGS_WITH_SINGLE_DOCDIR_FALSE@ mkdir -p $(DESTDIR)/$(docdir)/html @AGS_WITH_SINGLE_DOCDIR_FALSE@ mkdir -p $(DESTDIR)/$(datadir)/doc/libags-audio-doc/images @AGS_WITH_SINGLE_DOCDIR_FALSE@ mkdir -p $(DESTDIR)/$(datadir)/doc/libags-audio-doc/html @AGS_WITH_SINGLE_DOCDIR_FALSE@ mkdir -p $(DESTDIR)/$(datadir)/doc/libags-audio-doc/osc-server @AGS_WITH_SINGLE_DOCDIR_FALSE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(datadir)/gtk-doc/html @AGS_WITH_UPSTREAM_GTK_DOC_FALSE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBAGS_API_DIR) @AGS_WITH_UPSTREAM_GTK_DOC_FALSE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBAGS_AUDIO_API_DIR) @AGS_WITH_UPSTREAM_GTK_DOC_FALSE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBAGS_GUI_API_DIR) @AGS_WITH_UPSTREAM_GTK_DOC_FALSE@@ENABLE_GTK_DOC_TRUE@ mkdir -p $(DESTDIR)/$(LIBGSEQUENCER_API_DIR) install-html-links: install-html-mkdir-links echo "creating links [$(AGS_WITH_UPSTREAM_GTK_DOC)]" @AGS_WITH_SINGLE_DOCDIR_FALSE@@AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ ln -s ../../doc/libags-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libags @AGS_WITH_SINGLE_DOCDIR_FALSE@@AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ ln -s ../../doc/libags-audio-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libags_audio @AGS_WITH_SINGLE_DOCDIR_FALSE@@AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ ln -s ../../doc/libags-gui-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libags_gui @AGS_WITH_SINGLE_DOCDIR_FALSE@@AGS_WITH_UPSTREAM_GTK_DOC_TRUE@@ENABLE_GTK_DOC_TRUE@ ln -s ../../doc/libgsequencer-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libgsequencer install-html: install-html-mkdir install-html-links @AGS_WITH_SINGLE_DOCDIR_TRUE@ install -c -p -m 644 $(userdocimages) $(DESTDIR)/$(docdir)/images/ @AGS_WITH_SINGLE_DOCDIR_TRUE@ install -c -p -m 644 $(devdocimages) $(DESTDIR)/$(docdir)/images/ @AGS_WITH_SINGLE_DOCDIR_TRUE@ install -c -p -m 644 $(top_builddir)/html/user-docs/* $(DESTDIR)/$(docdir)/user-manual/ @AGS_WITH_SINGLE_DOCDIR_TRUE@ install -c -p -m 644 $(top_builddir)/html/developer-docs/* $(DESTDIR)/$(docdir)/developer-manual/ @AGS_WITH_SINGLE_DOCDIR_TRUE@ install -c -p -m 644 $(top_builddir)/html/osc-docs/* $(DESTDIR)/$(docdir)/osc-manual/ @AGS_WITH_SINGLE_DOCDIR_FALSE@ install -c -p -m 644 $(userdocimages) $(DESTDIR)/$(docdir)/images/ @AGS_WITH_SINGLE_DOCDIR_FALSE@ install -c -p -m 644 $(devdocimages) $(DESTDIR)/$(datadir)/doc/libags-audio-doc/images/ @AGS_WITH_SINGLE_DOCDIR_FALSE@ install -c -p -m 644 $(top_builddir)/html/user-docs/* $(DESTDIR)/$(docdir)/html/ @AGS_WITH_SINGLE_DOCDIR_FALSE@ install -c -p -m 644 $(top_builddir)/html/developer-docs/* $(DESTDIR)/$(datadir)/doc/libags-audio-doc/html/ @AGS_WITH_SINGLE_DOCDIR_FALSE@ install -c -p -m 644 $(top_builddir)/html/osc-docs/* $(DESTDIR)/$(datadir)/doc/libags-audio-doc/osc-server/ @ENABLE_GTK_DOC_TRUE@ install -c -p -m 644 $(top_srcdir)/docs/reference/libags/libags-html/* $(DESTDIR)/$(LIBAGS_API_DIR) @ENABLE_GTK_DOC_TRUE@ install -c -p -m 644 $(top_srcdir)/docs/reference/libags-audio/libags-audio-html/* $(DESTDIR)/$(LIBAGS_AUDIO_API_DIR) @ENABLE_GTK_DOC_TRUE@ install -c -p -m 644 $(top_srcdir)/docs/reference/libags-gui/libags-gui-html/* $(DESTDIR)/$(LIBAGS_GUI_API_DIR) @ENABLE_GTK_DOC_TRUE@ install -c -p -m 644 $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html/* $(DESTDIR)/$(LIBGSEQUENCER_API_DIR) uninstall-hook: rm -rf $(DESTDIR)/$(includedir)/ags/config.h rm -rf $(DESTDIR)/$(datadir)/gsequencer rm -rf $(DESTDIR)/$(docdir) rm -rf $(DESTDIR)/$(datadir)/xml/gsequencer @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/doc/libags-doc @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/doc/libags-audio-doc @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/doc/libags-gui-doc @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/doc/libgsequencer-doc @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libags @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libags_audio @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libags_gui @AGS_WITH_SINGLE_DOCDIR_FALSE@ rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libgsequencer rm -f $(DESTDIR)/$(datadir)/icons/hicolor/32x32/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/icons/hicolor/48x48/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/icons/hicolor/64x64/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/icons/hicolor/128x128/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/mime/packages/gsequencer.xml rm -f $(DESTDIR)/$(datadir)/metainfo/org.nongnu.gsequencer.gsequencer.appdata.xml rm -f $(DESTDIR)/$(pkgconfigdir)/libags.pc rm -f $(DESTDIR)/$(pkgconfigdir)/libags_audio.pc rm -f $(DESTDIR)/$(pkgconfigdir)/libags_gui.pc rm -f $(DESTDIR)/$(pkgconfigdir)/libgsequencer.pc clean-local: rm -rf $(top_srcdir)/html rm -rf $(top_srcdir)/docs/reference/libags/xml rm -rf $(top_srcdir)/docs/reference/libags/libags-html rm -rf $(top_srcdir)/docs/reference/libags/tmpl rm -rf $(top_srcdir)/docs/reference/libags-audio/xml rm -rf $(top_srcdir)/docs/reference/libags-audio/libags-audio-html rm -rf $(top_srcdir)/docs/reference/libags-audio/tmpl rm -rf $(top_srcdir)/docs/reference/libags-gui/xml rm -rf $(top_srcdir)/docs/reference/libags-gui/libags-gui-html rm -rf $(top_srcdir)/docs/reference/libags-gui/tmpl rm -rf $(top_srcdir)/docs/reference/libgsequencer/xml rm -rf $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html rm -rf $(top_srcdir)/docs/reference/libgsequencer/tmpl rm -f $(top_builddir)/docs/reference/libags/Makefile rm -f $(top_builddir)/docs/reference/libags-audio/Makefile rm -f $(top_builddir)/docs/reference/libags-gui/Makefile rm -f $(top_builddir)/docs/reference/libgsequencer/Makefile rm -f $(top_builddir)/unit-system-tests.mk rm -f $(top_builddir)/functional-system-tests.mk rm -f docs/reference/libags-audio/libags_audio-decl-list.txt rm -f docs/reference/libags-audio/libags_audio-decl.txt rm -f docs/reference/libags-audio/libags_audio-undeclared.txt rm -f docs/reference/libags-audio/libags_audio-undocumented.txt rm -f docs/reference/libags-audio/libags_audio-unused.txt rm -f docs/reference/libags-audio/libags_audio.args rm -f docs/reference/libags-audio/libags_audio.hierarchy rm -f docs/reference/libags-audio/libags_audio.prerequisites rm -f docs/reference/libags-audio/libags_audio.signals rm -f docs/reference/libags-gui/libags_gui-decl-list.txt rm -f docs/reference/libags-gui/libags_gui-decl.txt rm -f docs/reference/libags-gui/libags_gui-undeclared.txt rm -f docs/reference/libags-gui/libags_gui-undocumented.txt rm -f docs/reference/libags-gui/libags_gui-unused.txt rm -f docs/reference/libags-gui/libags_gui.args rm -f docs/reference/libags-gui/libags_gui.hierarchy rm -f docs/reference/libags-gui/libags_gui.prerequisites rm -f docs/reference/libags-gui/libags_gui.signals rm -f docs/reference/libags/libags-decl-list.txt rm -f docs/reference/libags/libags-decl.txt rm -f docs/reference/libags/libags-undeclared.txt rm -f docs/reference/libags/libags-undocumented.txt rm -f docs/reference/libags/libags-unused.txt rm -f docs/reference/libags/libags.args rm -f docs/reference/libags/libags.hierarchy rm -f docs/reference/libags/libags.prerequisites rm -f docs/reference/libags/libags.signals rm -f docs/reference/libgsequencer/libgsequencer-decl-list.txt rm -f docs/reference/libgsequencer/libgsequencer-decl.txt rm -f docs/reference/libgsequencer/libgsequencer-undeclared.txt rm -f docs/reference/libgsequencer/libgsequencer-undocumented.txt rm -f docs/reference/libgsequencer/libgsequencer-unused.txt rm -f docs/reference/libgsequencer/libgsequencer.args rm -f docs/reference/libgsequencer/libgsequencer.hierarchy rm -f docs/reference/libgsequencer/libgsequencer.prerequisites rm -f docs/reference/libgsequencer/libgsequencer.signals gen-symbols-ags: rm -f libags.sym.in touch libags.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags.sym.in echo -e -n "\n" >> libags.sym.in find ags/util -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in find ags/lib -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in echo "ags_application_context" >> libags.sym.in find ags/object -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in find ags/object -name "ags_marshal.h" | xargs grep --no-filename -o -P "(ags_cclosure_marshal_[a-zA-Z0-9_]+)" >> libags.sym.in find ags/file -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in gen-symbols-ags-thread: rm -f libags_thread.sym.in touch libags_thread.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags_thread.sym.in echo -e -n "\n" >> libags_thread.sym.in find ags/thread -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_thread.sym.in gen-symbols-ags-server: rm -f libags_server.sym.in touch libags_server.sym.in cat license-notice-gnu-agpl-3-0+-sym.txt >> libags_server.sym.in echo -e -n "\n" >> libags_server.sym.in find ags/server -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_server.sym.in gen-symbols-ags-audio: rm -f libags_audio.sym.in touch libags_audio.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags_audio.sym.in echo -e -n "\n" >> libags_audio.sym.in find ags/plugin -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_audio.sym.in find ags/audio -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_audio.sym.in gen-symbols-ags-gui: rm -f libags_gui.sym.in touch libags_gui.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags_gui.sym.in echo -e -n "\n" >> libags_gui.sym.in find ags/widget -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_gui.sym.in find ags/widget -name "ags_widget_marshal.h" | xargs grep --no-filename -o -P "(ags_widget_cclosure_marshal_[a-zA-Z0-9_]+)" >> libags_gui.sym.in gen-symbols-all: gen-symbols-ags gen-symbols-ags-thread gen-symbols-ags-server gen-symbols-ags-audio gen-symbols-ags-gui echo "Generated all symbols" gen-marshallers: cat ags_license_header > ags/object/ags_marshal.h glib-genmarshal --prefix=ags_cclosure_marshal --header ags/object/ags_marshallers.list >> ags/object/ags_marshal.h cat ags_license_header > ags/object/ags_marshal.c glib-genmarshal --prefix=ags_cclosure_marshal --body ags/object/ags_marshallers.list >> ags/object/ags_marshal.c echo "generated marshallers in ags/object/" cat ags_license_header > ags/widget/ags_widget_marshal.h glib-genmarshal --prefix=ags_widget_cclosure_marshal --header ags/widget/ags_widget_marshallers.list >> ags/widget/ags_widget_marshal.h cat ags_license_header > ags/widget/ags_widget_marshal.c glib-genmarshal --prefix=ags_widget_cclosure_marshal --body ags/widget/ags_widget_marshallers.list >> ags/widget/ags_widget_marshal.c echo "generated marshallers in ags/widget/" check-gettext: @if test x$(USE_NLS) != "xyes" ; then echo "Missing gettext. Rerun configure and check for" \ "'checking whether to use NLS... yes'!" ; exit 1 ; fi update-po: check-gettext @find $(srcdir)/ags/{util,lib,object,thread,file,server,plugin,audio,widget,X}/ -path $(srcdir)/ags/audio/audio-unit -prune -o -name "*.c" -print | sort > $(srcdir)/po/POTFILES.in.2 ; \ if diff $(srcdir)/po/POTFILES.in $(srcdir)/po/POTFILES.in.2 >/dev/null 2>&1 ; then \ rm -f $(srcdir)/po/POTFILES.in.2 ; \ else \ mv $(srcdir)/po/POTFILES.in.2 $(srcdir)/po/POTFILES.in ; \ fi cd po && $(MAKE) $(AM_MAKEFLAGS) update-po update-gmo: check-gettext cd po && $(MAKE) $(AM_MAKEFLAGS) update-gmo force-update-gmo: check-gettext touch po/*.po cd po && $(MAKE) $(AM_MAKEFLAGS) update-gmo force-update-gmo-%: check-gettext @language=`echo $@ | sed s/force-update-gmo-//` ; \ if test ! -f po/$$language.po ; then echo "file po/$$language.po does not exist" ; exit 1 ; fi ; \ touch po/$$language.po ; \ cd po && $(MAKE) $(AM_MAKEFLAGS) update-gmo .PHONY: check-gettext update-po update-gmo force-update-gmo # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/functional-system-tests.mk.am0000644000175000017500000004201113614062654016356 00000000000000# Copyright (C) 2005-2020 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. AUTOMAKE_OPTIONS = foreign no-dependencies localedir = $(datadir)/locale DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ SUBDIRS = po noinst_PROGRAMS = if WITH_SYSTEM_TESTS # libadd and ldadd libgsequencer_check_system_test_LIBADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer -lcunit -lrt -lm -lXtst $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) gsequencer_check_system_functional_test_LDADD = -L$(DESTDIR)/$(libdir) -lags -lags_thread -lags_server -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer libgsequencer_check_system_test.la -lcunit -lrt -lm -lXtst $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) AGS_RESOURCES = -DAGS_RC_FILENAME=\"/usr/share/gsequencer/styles/ags.rc\" -DAGS_ANIMATION_FILENAME=\"/usr/share/gsequencer/images/ags_supermoon-800x450.png\" -DAGS_LOGO_FILENAME=\"/usr/share/gsequencer/images/ags.png\" -DAGS_LICENSE_FILENAME=\"/usr/share/common-licenses/GPL-3\" AGS_FEATURES = if WITH_LIBINSTPATCH AGS_FEATURES += -DAGS_WITH_LIBINSTPATCH=1 endif noinst_LTLIBRARIES = libgsequencer_check_system_test.la # functional system tests - edit target installcheck_programs = \ ags_check_system_functional_server_test \ ags_check_system_functional_audio_test \ ags_check_system_functional_pitch_test \ ags_check_system_functional_fourier_transform_test \ ags_check_system_functional_osc_server_test \ ags_check_system_functional_osc_xmlrpc_server_test \ ags_check_system_functional_machine_add_and_destroy_test \ ags_check_system_functional_machine_link_test \ ags_check_system_functional_line_member_add_and_destroy_test \ ags_check_system_functional_notation_editor_workflow_test \ ags_check_system_functional_automation_editor_workflow_test \ ags_check_system_functional_panel_test \ ags_check_system_functional_mixer_test \ ags_check_system_functional_drum_test \ ags_check_system_functional_matrix_test \ ags_check_system_functional_synth_test \ ags_check_system_functional_ffplayer_test \ ags_check_system_functional_notation_edit_test \ ags_check_system_functional_audio_config_test noinst_PROGRAMS += $(installcheck_programs) # functional test util library libgsequencer_check_system_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h libgsequencer_check_system_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) libgsequencer_check_system_test_la_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) libgsequencer_check_system_test_la_LIBADD = $(libgsequencer_check_system_test_LIBADD) # functional server test ags_check_system_functional_server_test_SOURCES = ags/test/server/ags_functional_server_test.c ags_check_system_functional_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_functional_server_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_functional_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_server_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional audio test ags_check_system_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c ags_check_system_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_functional_audio_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_audio_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional pitch test ags_check_system_functional_pitch_test_SOURCES = ags/test/audio/ags_functional_pitch_test.c ags_check_system_functional_pitch_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_functional_pitch_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_functional_pitch_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_pitch_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional fourier transform test ags_check_system_functional_fourier_transform_test_SOURCES = ags/test/audio/ags_functional_fourier_transform_test.c ags_check_system_functional_fourier_transform_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_functional_fourier_transform_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_functional_fourier_transform_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_fourier_transform_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional osc server test ags_check_system_functional_osc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_server_test.c ags_check_system_functional_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_functional_osc_server_test_CPPFLAGS = $(AGS_FEATURES) ags_check_system_functional_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_osc_server_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional osc xmlrpc server test ags_check_system_functional_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c ags_check_system_functional_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_check_system_functional_osc_xmlrpc_server_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_FEATURES) ags_check_system_functional_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_osc_xmlrpc_server_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional machine add and destroy test ags_check_system_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c ags_check_system_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional machine link test ags_check_system_functional_machine_link_test_SOURCES = ags/test/X/ags_functional_machine_link_test.c ags_check_system_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_machine_link_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional line member add and destroy test ags_check_system_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional notation editor workflow test ags_check_system_functional_notation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_notation_editor_workflow_test.c ags_check_system_functional_notation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_notation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_notation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_notation_editor_workflow_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional automation editor workflow test ags_check_system_functional_automation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_automation_editor_workflow_test.c ags_check_system_functional_automation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_automation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_automation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_automation_editor_workflow_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional panel test ags_check_system_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c ags_check_system_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_panel_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional mixer test ags_check_system_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c ags_check_system_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_mixer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional drum test ags_check_system_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c ags_check_system_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_drum_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional matrix test ags_check_system_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c ags_check_system_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_matrix_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional synth test ags_check_system_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c ags_check_system_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_synth_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional ffplayer test ags_check_system_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c ags_check_system_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_ffplayer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional note edit test ags_check_system_functional_notation_edit_test_SOURCES = ags/test/X/ags_functional_notation_edit_test.c ags_check_system_functional_notation_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_notation_edit_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_notation_edit_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_notation_edit_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) # functional note edit test ags_check_system_functional_audio_config_test_SOURCES = ags/test/X/ags_functional_audio_config_test.c ags_check_system_functional_audio_config_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_check_system_functional_audio_config_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" $(AGS_RESOURCES) $(AGS_FEATURES) ags_check_system_functional_audio_config_test_LDFLAGS = -pthread $(LDFLAGS) ags_check_system_functional_audio_config_test_LDADD = $(gsequencer_check_system_functional_test_LDADD) ags-check-system-functional-test: $(installcheck_programs) ./ags_check_system_functional_server_test ./ags_check_system_functional_audio_test ./ags_check_system_functional_pitch_test ./ags_check_system_functional_fourier_transform_test ./ags_check_system_functional_osc_server_test ./ags_check_system_functional_osc_xmlrpc_server_test ./ags_check_system_functional_machine_add_and_destroy_test ./ags_check_system_functional_machine_link_test ./ags_check_system_functional_line_member_add_and_destroy_test ./ags_check_system_functional_notation_editor_workflow_test ./ags_check_system_functional_automation_editor_workflow_test ./ags_check_system_functional_panel_test ./ags_check_system_functional_mixer_test ./ags_check_system_functional_drum_test ./ags_check_system_functional_matrix_test ./ags_check_system_functional_synth_test ./ags_check_system_functional_ffplayer_test ./ags_check_system_functional_notation_edit_test ./ags_check_system_functional_audio_config_test # WITH_SYSTEM_TESTS endif gsequencer-3.1.3/COPYING.server0000644000175000017500000010333013461636431013147 00000000000000 GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . gsequencer-3.1.3/INSTALL0000644000175000017500000003661413502733604011646 00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this 'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a 'Makefile' in each directory of the package. It may also create one or more '.h' files containing system-dependent definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a file 'config.log' containing compiler output (useful mainly for debugging 'configure'). It can also use an optional file (typically called 'config.cache' and enabled with '--cache-file=config.cache' or simply '-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how 'configure' could check whether to do them, and mail diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at some point 'config.cache' contains results you don't want to keep, you may remove or edit it. The file 'configure.ac' (or 'configure.in') is used to create 'configure' by a program called 'autoconf'. You need 'configure.ac' if you want to change it or regenerate 'configure' using a newer version of 'autoconf'. The simplest way to compile this package is: 1. 'cd' to the directory containing the package's source code and type './configure' to configure the package for your system. Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type 'make' to compile the package. 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the 'make install' phase executed with root privileges. 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing 'make clean'. To also remove the files that 'configure' created (so you can compile the package for a different kind of computer), type 'make distclean'. There is also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. You can give 'configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run the 'configure' script. 'configure' automatically checks for the source code in the directory that 'configure' is in and in '..'. This is known as a "VPATH" build. With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, 'make install' installs the package's commands under '/usr/local/bin', include files under '/usr/local/include', etc. You can specify an installation prefix other than '/usr/local' by giving 'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like '--bindir=DIR' to specify different values for particular kinds of files. Run 'configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of '${prefix}', so that specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the 'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of '${prefix}'. Any directories that were specified during 'configure', but not in terms of '${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the 'DESTDIR' variable. For example, 'make install DESTDIR=/alternate/directory' will prepend '/alternate/directory' before all installation names. The approach of 'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of '${prefix}' at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving 'configure' the option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. Some packages pay attention to '--enable-FEATURE' options to 'configure', where FEATURE indicates an optional part of the package. They may also pay attention to '--with-PACKAGE' options, where PACKAGE is something like 'gnu-as' or 'x' (for the X Window System). The 'README' should mention any '--enable-' and '--with-' options that the package recognizes. For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, you can use the 'configure' options '--x-includes=DIR' and '--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be overridden with 'make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX 'make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its '' header file. The option '-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in '/usr/bin'. So, if you need '/usr/ucb' in your 'PATH', put it _after_ '/usr/bin'. On Haiku, software installed for all users goes in '/boot/common', not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the '--build=TYPE' option. TYPE can either be a short name for the system type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file 'config.sub' for the possible values of each field. If 'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with '--host=TYPE'. Sharing Defaults ================ If you want to set default values for 'configure' scripts to share, you can create a site shell script called 'config.site' that gives default values for variables like 'CC', 'cache_file', and 'prefix'. 'configure' looks for 'PREFIX/share/config.site' if it exists, then 'PREFIX/etc/config.site' if it exists. Or, you can set the 'CONFIG_SITE' environment variable to the location of the site script. A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 'configure' Invocation ====================== 'configure' recognizes the following options to control how it operates. '--help' '-h' Print a summary of all of the options to 'configure', and exit. '--help=short' '--help=recursive' Print a summary of the options unique to this package's 'configure', and exit. The 'short' variant lists options used only in the top level, while the 'recursive' variant lists options also present in any nested packages. '--version' '-V' Print the version of Autoconf used to generate the 'configure' script, and exit. '--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. '--config-cache' '-C' Alias for '--cache-file=config.cache'. '--quiet' '--silent' '-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). '--srcdir=DIR' Look for the package's source code in directory DIR. Usually 'configure' can determine that directory automatically. '--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. '--no-create' '-n' Run the configure checks, but stop before creating any output files. 'configure' also accepts some other, not widely useful, options. Run 'configure --help' for more details. gsequencer-3.1.3/midi2xml.10000644000175000017500000000446613607210263012421 00000000000000'\" t .\" Title: midi2xml .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.79.1 .\" Date: 2015-06-15 .\" Manual: midi2xml v0.4.2 .\" Source: midi2xml v0.4.2 .\" Language: English .\" .TH "MIDI2XML" "1" "2015\-06\-15" "midi2xml v0.4.2" "midi2xml v0.4.2" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" midi2xml \- midi2xml converts your MIDI files to XML format .SH "SYNOPSIS" .HP \w'\fB/usr/bin/midi2xml\fR\ 'u \fB/usr/bin/midi2xml\fR [\-\-help] [\-\-version] \fIfile\fR .SH "DESCRIPTION" .PP midi2xml takes your MIDI file from command line and outputs the resulting XML to stdout\&. .SH "OPTIONS" .PP The program follows the usual GNU command line syntax, with long options starting with two dashes (`\-\*(Aq)\&. A summary of options is included below\&. For a complete description, see the \fBinfo\fR(1) files\&. .PP \fBfile\fR .RS 4 Open file from command line\&. .RE .PP \fB\-\-help\fR .RS 4 Show summary of options\&. .RE .PP \fB\-\-version\fR .RS 4 Show version of program\&. .RE .SH "BUGS" .PP None\&. So far I know\&. .SH "AUTHOR" .PP Jo\(:el Kr\(:ahemann .SH "COPYRIGHT" .br Copyright \(co 2015 Jo\(:el Kr\(:ahemann .br .PP This manual page is part of GSequencer\&. License GPLv3+: GNU GPL version 3 or (at your option) any later \&. .PP This is free software: you are free to change and redistribute it\&. There is NO WARRANTY, to the extent permitted by law\&. .sp gsequencer-3.1.3/license-notice-gnu-fdl-1-3-xml.txt0000644000175000017500000000064613461636435016711 00000000000000 gsequencer-3.1.3/gsequencer.desktop.in0000644000175000017500000000217213521306053014741 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2018 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . [Desktop Entry] Version=1.0 Type=Application MimeType=application/xml Terminal=false Exec=gsequencer --filename %f Icon=@datadir@/gsequencer/icons/ags.png Name=Advanced Gtk+ Sequencer GenericName=Sequencer Comment=Create effect processing tree and play audio by defined patterns or notes Categories=AudioVideo;Audio;Sequencer; Keywords=audio;sequencer;notation;editor;midi;synth;mixing;effects; gsequencer-3.1.3/ags-simple.xsl0000644000175000017500000001757513607210263013410 00000000000000 ]> 60.0 1000000.0 floor($division div 256) floor($division div 256) * 256 60.0 1000000.0 floor($division div 256) floor($division div 256) * 256 note- 0 notation- 0 C machine- AgsFFPlayer - &audiochannels; 1 128 gsequencer-3.1.3/midi2xml.1.xml0000644000175000017500000000570713607210263013217 00000000000000 2015-06-15 2015 Joël Krähemann This manual page is part of GSequencer. License GPLv3+: GNU GPL version 3 or (at your option) any later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. midi2xml 1 midi2xml v0.4.2 midi2xml midi2xml converts your MIDI files to XML format /usr/bin/midi2xml --help --version file Description midi2xml takes your MIDI file from command line and outputs the resulting XML to stdout. OPTIONS The program follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the info 1 files. Open file from command line. Show summary of options. Show version of program. BUGS None. So far I know. AUTHOR Joël Krähemann Original author gsequencer-3.1.3/license-notice-permissive-xml.txt0000644000175000017500000000040513461636435017236 00000000000000 gsequencer-3.1.3/depcomp0000755000175000017500000005602013622252205012157 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsequencer-3.1.3/ags_functional_audio_config_test.xml0000644000175000017500000010647713607210263020102 00000000000000 gsequencer-3.1.3/libags_audio.sym0000644000175000017500000022466613622252234013775 00000000000000ags_lv2_turtle_parser_get_type ags_lv2_turtle_parser_parse_names ags_lv2_turtle_parser_parse ags_lv2_turtle_parser_new ags_lv2_plugin_get_type ags_lv2_plugin_test_flags ags_lv2_plugin_set_flags ags_lv2_plugin_unset_flags ags_lv2_plugin_event_buffer_alloc ags_lv2_plugin_event_buffer_realloc_data ags_lv2_plugin_event_buffer_concat ags_lv2_plugin_event_buffer_append_midi ags_lv2_plugin_event_buffer_remove_midi ags_lv2_plugin_clear_event_buffer ags_lv2_plugin_alloc_atom_sequence ags_lv2_plugin_atom_sequence_append_midi ags_lv2_plugin_atom_sequence_remove_midi ags_lv2_plugin_clear_atom_sequence ags_lv2_plugin_find_uri ags_lv2_plugin_find_pname ags_lv2_plugin_change_program ags_lv2_plugin_new ags_lv2_worker_manager_get_type ags_lv2_worker_manager_pull_worker ags_lv2_worker_manager_get_instance ags_lv2_worker_manager_new ags_plugin_port_get_type ags_plugin_port_test_flags ags_plugin_port_set_flags ags_plugin_port_unset_flags ags_plugin_port_find_symbol ags_plugin_port_find_port_index ags_plugin_port_new ags_lv2_state_manager_get_type ags_lv2_state_manager_get_instance ags_lv2_state_manager_new ags_dssi_manager_get_type ags_dssi_manager_get_default_path ags_dssi_manager_set_default_path ags_dssi_manager_get_filenames ags_dssi_manager_find_dssi_plugin ags_dssi_manager_load_blacklist ags_dssi_manager_load_file ags_dssi_manager_load_default_directory ags_dssi_manager_get_instance ags_dssi_manager_new ags_lv2_preset_manager_get_type ags_lv2_preset_manager_get_instance ags_lv2_preset_manager_new ags_lv2_worker_get_type ags_lv2_worker_test_flags ags_lv2_worker_set_flags ags_lv2_worker_unset_flags ags_lv2_worker_alloc_response_data ags_lv2_worker_free_response_data ags_lv2_worker_respond ags_lv2_worker_schedule_work ags_lv2_worker_do_poll ags_lv2_worker_new ags_lv2_preset_get_type ags_lv2_port_preset_alloc ags_lv2_port_preset_free ags_lv2_preset_parse_turtle ags_lv2_preset_find_preset_uri ags_lv2_preset_find_preset_label ags_lv2_preset_new ags_lv2_uri_map_manager_get_type ags_lv2_uri_map_manager_insert ags_lv2_uri_map_manager_remove ags_lv2_uri_map_manager_lookup ags_lv2_uri_map_manager_load_default ags_lv2_uri_map_manager_uri_to_id ags_lv2_uri_map_manager_get_instance ags_lv2_uri_map_manager_new ags_ladspa_conversion_get_type ags_ladspa_conversion_test_flags ags_ladspa_conversion_set_flags ags_ladspa_conversion_unset_flags ags_ladspa_conversion_new ags_lv2_manager_get_type ags_lv2_manager_global_get_parse_names ags_lv2_manager_global_get_preserve_turtle ags_lv2_manager_get_default_path ags_lv2_manager_set_default_path ags_lv2_manager_get_filenames ags_lv2_manager_find_lv2_plugin ags_lv2_manager_load_blacklist ags_lv2_manager_load_file ags_lv2_manager_load_preset ags_lv2_manager_load_default_directory ags_lv2_manager_get_instance ags_lv2_manager_new ags_base_plugin_get_type ags_base_plugin_test_flags ags_base_plugin_set_flags ags_base_plugin_unset_flags ags_base_plugin_find_filename ags_base_plugin_find_effect ags_base_plugin_find_ui_effect_index ags_base_plugin_sort_func ags_base_plugin_sort ags_base_plugin_apply_port_group_by_prefix ags_base_plugin_instantiate ags_base_plugin_instantiate_with_params ags_base_plugin_connect_port ags_base_plugin_activate ags_base_plugin_deactivate ags_base_plugin_run ags_base_plugin_load_plugin ags_base_plugin_new ags_lv2_log_manager_get_type ags_lv2_log_manager_printf ags_lv2_log_manager_vprintf ags_lv2_log_manager_get_instance ags_lv2_log_manager_new ags_lv2ui_plugin_get_type ags_lv2ui_plugin_test_flags ags_lv2ui_plugin_set_flags ags_lv2ui_plugin_unset_flags ags_lv2ui_plugin_find_gui_uri ags_lv2ui_plugin_new ags_dssi_plugin_get_type ags_dssi_plugin_change_program ags_dssi_plugin_new ags_lv2ui_manager_get_type ags_lv2ui_manager_get_default_path ags_lv2ui_manager_set_default_path ags_lv2ui_manager_get_filenames ags_lv2ui_manager_find_lv2ui_plugin ags_lv2ui_manager_find_lv2ui_plugin_with_index ags_lv2ui_manager_load_blacklist ags_lv2ui_manager_load_file ags_lv2ui_manager_load_default_directory ags_lv2ui_manager_get_instance ags_lv2ui_manager_new ags_lv2_event_manager_get_type ags_lv2_event_manager_lv2_event_ref ags_lv2_event_manager_lv2_event_unref ags_lv2_event_manager_get_instance ags_lv2_event_manager_new ags_ladspa_manager_get_type ags_ladspa_manager_get_default_path ags_ladspa_manager_set_default_path ags_ladspa_manager_get_filenames ags_ladspa_manager_find_ladspa_plugin ags_ladspa_manager_load_blacklist ags_ladspa_manager_load_file ags_ladspa_manager_load_default_directory ags_ladspa_manager_get_instance ags_ladspa_manager_new ags_lv2_conversion_get_type ags_lv2_conversion_test_flags ags_lv2_conversion_set_flags ags_lv2_conversion_unset_flags ags_lv2_conversion_new ags_lv2_urid_manager_get_type ags_lv2_urid_manager_insert ags_lv2_urid_manager_remove ags_lv2_urid_manager_lookup ags_lv2_urid_manager_load_default ags_lv2_urid_manager_map ags_lv2_urid_manager_unmap ags_lv2_urid_manager_get_instance ags_lv2_urid_manager_new ags_ladspa_plugin_get_type ags_ladspa_plugin_new ags_lv2_option_manager_get_type ags_lv2_option_ressource_alloc ags_lv2_option_manager_ressource_insert ags_lv2_option_manager_ressource_remove ags_lv2_option_manager_ressource_lookup ags_lv2_option_manager_ressource_lookup_extended ags_lv2_option_manager_get_option ags_lv2_option_manager_set_option ags_lv2_option_manager_lv2_options_get ags_lv2_option_manager_lv2_options_set ags_lv2_option_manager_get_instance ags_lv2_option_manager_new ags_wasapi_devout_get_type ags_wasapi_devout_error_quark ags_wasapi_devout_test_flags ags_wasapi_devout_set_flags ags_wasapi_devout_unset_flags ags_wasapi_devout_switch_buffer_flag ags_wasapi_devout_adjust_delay_and_attack ags_wasapi_devout_realloc_buffer ags_wasapi_devout_new ags_wasapi_devin_get_type ags_wasapi_devin_error_quark ags_wasapi_devin_test_flags ags_wasapi_devin_set_flags ags_wasapi_devin_unset_flags ags_wasapi_devin_switch_buffer_flag ags_wasapi_devin_adjust_delay_and_attack ags_wasapi_devin_realloc_buffer ags_wasapi_devin_new ags_recall_recycling_get_type ags_recall_recycling_new ags_devin_get_type ags_devin_error_quark ags_devin_test_flags ags_devin_set_flags ags_devin_unset_flags ags_devin_switch_buffer_flag ags_devin_adjust_delay_and_attack ags_devin_realloc_buffer ags_devin_new ags_fifoout_get_type ags_fifoout_error_quark ags_fifoout_test_flags ags_fifoout_set_flags ags_fifoout_unset_flags ags_fifoout_switch_buffer_flag ags_fifoout_adjust_delay_and_attack ags_fifoout_realloc_buffer ags_fifoout_new ags_synth_util_get_xcross_count_s8 ags_synth_util_get_xcross_count_s16 ags_synth_util_get_xcross_count_s24 ags_synth_util_get_xcross_count_s32 ags_synth_util_get_xcross_count_s64 ags_synth_util_get_xcross_count_float ags_synth_util_get_xcross_count_double ags_synth_util_get_xcross_count_complex ags_synth_util_get_xcross_count ags_synth_util_sin_s8 ags_synth_util_sin_s16 ags_synth_util_sin_s24 ags_synth_util_sin_s32 ags_synth_util_sin_s64 ags_synth_util_sin_float ags_synth_util_sin_double ags_synth_util_sin_complex ags_synth_util_sawtooth_s8 ags_synth_util_sawtooth_s16 ags_synth_util_sawtooth_s24 ags_synth_util_sawtooth_s32 ags_synth_util_sawtooth_s64 ags_synth_util_sawtooth_float ags_synth_util_sawtooth_double ags_synth_util_sawtooth_complex ags_synth_util_triangle_s8 ags_synth_util_triangle_s16 ags_synth_util_triangle_s24 ags_synth_util_triangle_s32 ags_synth_util_triangle_s64 ags_synth_util_triangle_float ags_synth_util_triangle_double ags_synth_util_triangle_complex ags_synth_util_square_s8 ags_synth_util_square_s16 ags_synth_util_square_s24 ags_synth_util_square_s32 ags_synth_util_square_s64 ags_synth_util_square_float ags_synth_util_square_double ags_synth_util_square_complex ags_synth_util_impulse_s8 ags_synth_util_impulse_s16 ags_synth_util_impulse_s24 ags_synth_util_impulse_s32 ags_synth_util_impulse_s64 ags_synth_util_impulse_float ags_synth_util_impulse_double ags_synth_util_impulse_complex ags_synth_util_sin ags_synth_util_sawtooth ags_synth_util_triangle ags_synth_util_square ags_synth_util_impulse ags_notation_get_type ags_notation_get_obj_mutex ags_notation_test_flags ags_notation_set_flags ags_notation_unset_flags ags_notation_find_near_timestamp ags_notation_add ags_notation_sort_func ags_notation_get_audio ags_notation_set_audio ags_notation_get_audio_channel ags_notation_set_audio_channel ags_notation_get_is_minor ags_notation_set_is_minor ags_notation_get_sharp_flats ags_notation_set_sharp_flats ags_notation_get_timestamp ags_notation_set_timestamp ags_notation_get_note ags_notation_set_note ags_notation_add_note ags_notation_remove_note ags_notation_remove_note_at_position ags_notation_get_selection ags_notation_is_note_selected ags_notation_find_point ags_notation_find_region ags_notation_find_offset ags_notation_free_selection ags_notation_add_point_to_selection ags_notation_remove_point_from_selection ags_notation_add_region_to_selection ags_notation_remove_region_from_selection ags_notation_add_all_to_selection ags_notation_copy_selection ags_notation_cut_selection ags_notation_insert_from_clipboard ags_notation_insert_from_clipboard_extended ags_notation_to_raw_midi ags_notation_from_raw_midi ags_notation_new ags_fm_synth_util_sin_s8 ags_fm_synth_util_sin_s16 ags_fm_synth_util_sin_s24 ags_fm_synth_util_sin_s32 ags_fm_synth_util_sin_s64 ags_fm_synth_util_sin_float ags_fm_synth_util_sin_double ags_fm_synth_util_sin_complex ags_fm_synth_util_sawtooth_s8 ags_fm_synth_util_sawtooth_s16 ags_fm_synth_util_sawtooth_s24 ags_fm_synth_util_sawtooth_s32 ags_fm_synth_util_sawtooth_s64 ags_fm_synth_util_sawtooth_float ags_fm_synth_util_sawtooth_double ags_fm_synth_util_sawtooth_complex ags_fm_synth_util_triangle_s8 ags_fm_synth_util_triangle_s16 ags_fm_synth_util_triangle_s24 ags_fm_synth_util_triangle_s32 ags_fm_synth_util_triangle_s64 ags_fm_synth_util_triangle_float ags_fm_synth_util_triangle_double ags_fm_synth_util_triangle_complex ags_fm_synth_util_square_s8 ags_fm_synth_util_square_s16 ags_fm_synth_util_square_s24 ags_fm_synth_util_square_s32 ags_fm_synth_util_square_s64 ags_fm_synth_util_square_float ags_fm_synth_util_square_double ags_fm_synth_util_square_complex ags_fm_synth_util_impulse_s8 ags_fm_synth_util_impulse_s16 ags_fm_synth_util_impulse_s24 ags_fm_synth_util_impulse_s32 ags_fm_synth_util_impulse_s64 ags_fm_synth_util_impulse_float ags_fm_synth_util_impulse_double ags_fm_synth_util_impulse_complex ags_fm_synth_util_sin ags_fm_synth_util_sawtooth ags_fm_synth_util_triangle ags_fm_synth_util_square ags_fm_synth_util_impulse ags_filter_util_pitch_s8 ags_filter_util_pitch_s16 ags_filter_util_pitch_s24 ags_filter_util_pitch_s32 ags_filter_util_pitch_s64 ags_filter_util_pitch_float ags_filter_util_pitch_double ags_filter_util_pitch_complex ags_recall_ladspa_run_get_type ags_recall_ladspa_run_new ags_recycling_get_type ags_recycling_get_obj_mutex ags_recycling_test_flags ags_recycling_set_flags ags_recycling_unset_flags ags_recycling_get_channel ags_recycling_set_channel ags_recycling_next ags_recycling_prev ags_recycling_get_output_soundcard ags_recycling_set_output_soundcard ags_recycling_get_input_soundcard ags_recycling_set_input_soundcard ags_recycling_get_samplerate ags_recycling_set_samplerate ags_recycling_get_buffer_size ags_recycling_set_buffer_size ags_recycling_get_format ags_recycling_set_format ags_recycling_get_audio_signal ags_recycling_set_audio_signal ags_recycling_add_audio_signal ags_recycling_remove_audio_signal ags_recycling_data_request ags_recycling_position ags_recycling_find_next_channel ags_recycling_is_active ags_recycling_create_audio_signal_with_defaults ags_recycling_create_audio_signal_with_frame_count ags_recycling_new ags_sound_provider_get_type ags_sound_provider_set_default_soundcard ags_sound_provider_get_default_soundcard ags_sound_provider_set_default_soundcard_thread ags_sound_provider_get_default_soundcard_thread ags_sound_provider_set_soundcard ags_sound_provider_get_soundcard ags_sound_provider_set_sequencer ags_sound_provider_get_sequencer ags_sound_provider_set_audio ags_sound_provider_get_audio ags_sound_provider_set_sound_server ags_sound_provider_get_sound_server ags_sound_provider_set_osc_server ags_sound_provider_get_osc_server ags_recall_channel_run_get_type ags_recall_channel_run_get_recall_audio ags_recall_channel_run_set_recall_audio ags_recall_channel_run_get_recall_audio_run ags_recall_channel_run_set_recall_audio_run ags_recall_channel_run_get_recall_channel ags_recall_channel_run_set_recall_channel ags_recall_channel_run_get_destination ags_recall_channel_run_set_destination ags_recall_channel_run_get_source ags_recall_channel_run_set_source ags_recall_channel_run_new ags_soundcard_util_get_obj_mutex ags_recall_audio_run_get_type ags_recall_audio_run_get_audio ags_recall_audio_run_set_audio ags_recall_audio_run_get_recall_audio ags_recall_audio_run_set_recall_audio ags_recall_audio_run_new ags_devout_get_type ags_devout_error_quark ags_devout_test_flags ags_devout_set_flags ags_devout_unset_flags ags_devout_switch_buffer_flag ags_devout_adjust_delay_and_attack ags_devout_realloc_buffer ags_devout_new ags_pulse_port_get_type ags_pulse_port_test_flags ags_pulse_port_set_flags ags_pulse_port_unset_flags ags_pulse_port_find ags_pulse_port_register ags_pulse_port_unregister ags_pulse_port_get_fixed_size ags_pulse_port_set_samplerate ags_pulse_port_set_pcm_channels ags_pulse_port_set_buffer_size ags_pulse_port_set_format ags_pulse_port_set_cache_buffer_size ags_pulse_port_get_latency ags_pulse_port_new ags_pulse_server_get_type ags_pulse_server_test_flags ags_pulse_server_set_flags ags_pulse_server_unset_flags ags_pulse_server_find_url ags_pulse_server_find_client ags_pulse_server_find_port ags_pulse_server_add_client ags_pulse_server_remove_client ags_pulse_server_connect_client ags_pulse_server_disconnect_client ags_pulse_server_start_poll ags_pulse_server_new ags_pulse_client_get_type ags_pulse_client_test_flags ags_pulse_client_set_flags ags_pulse_client_unset_flags ags_pulse_client_find_uuid ags_pulse_client_find ags_pulse_client_open ags_pulse_client_close ags_pulse_client_add_device ags_pulse_client_remove_device ags_pulse_client_add_port ags_pulse_client_remove_port ags_pulse_client_activate ags_pulse_client_deactivate ags_pulse_client_new ags_pulse_devin_get_type ags_pulse_devin_error_quark ags_pulse_devin_test_flags ags_pulse_devin_set_flags ags_pulse_devin_unset_flags ags_pulse_devin_switch_buffer_flag ags_pulse_devin_adjust_delay_and_attack ags_pulse_devin_realloc_buffer ags_pulse_devin_new ags_pulse_devout_get_type ags_pulse_devout_error_quark ags_pulse_devout_test_flags ags_pulse_devout_set_flags ags_pulse_devout_unset_flags ags_pulse_devout_switch_buffer_flag ags_pulse_devout_adjust_delay_and_attack ags_pulse_devout_realloc_buffer ags_pulse_devout_new ags_audio_get_type ags_audio_get_obj_mutex ags_audio_get_play_mutex ags_audio_get_recall_mutex ags_audio_test_flags ags_audio_set_flags ags_audio_unset_flags ags_audio_test_ability_flags ags_audio_set_ability_flags ags_audio_unset_ability_flags ags_audio_test_behaviour_flags ags_audio_set_behaviour_flags ags_audio_unset_behaviour_flags ags_audio_test_staging_flags ags_audio_set_staging_flags ags_audio_unset_staging_flags ags_audio_get_audio_name ags_audio_set_audio_name ags_audio_find_name ags_audio_get_max_audio_channels ags_audio_set_max_audio_channels ags_audio_get_max_output_pads ags_audio_set_max_output_pads ags_audio_get_max_input_pads ags_audio_set_max_input_pads ags_audio_set_max_pads ags_audio_get_audio_channels ags_audio_set_audio_channels ags_audio_get_output_pads ags_audio_set_output_pads ags_audio_get_input_pads ags_audio_set_input_pads ags_audio_set_pads ags_audio_get_output_lines ags_audio_get_input_lines ags_audio_get_output ags_audio_get_input ags_audio_get_output_soundcard ags_audio_set_output_soundcard ags_audio_get_input_soundcard ags_audio_set_input_soundcard ags_audio_get_output_sequencer ags_audio_set_output_sequencer ags_audio_get_input_sequencer ags_audio_set_input_sequencer ags_audio_get_samplerate ags_audio_set_samplerate ags_audio_get_buffer_size ags_audio_set_buffer_size ags_audio_get_format ags_audio_set_format ags_audio_get_bpm ags_audio_set_bpm ags_audio_get_audio_start_mapping ags_audio_set_audio_start_mapping ags_audio_get_midi_start_mapping ags_audio_set_midi_start_mapping ags_audio_get_midi_channel ags_audio_set_midi_channel ags_audio_get_numerator ags_audio_set_numerator ags_audio_get_denominator ags_audio_set_denominator ags_audio_get_time_signature ags_audio_set_time_signature ags_audio_get_is_minor ags_audio_set_is_minor ags_audio_get_sharp_flats ags_audio_set_sharp_flats ags_audio_get_octave ags_audio_set_octave ags_audio_get_key ags_audio_set_key ags_audio_get_absolute_key ags_audio_set_absolute_key ags_audio_get_preset ags_audio_set_preset ags_audio_add_preset ags_audio_remove_preset ags_audio_get_playback_domain ags_audio_set_playback_domain ags_audio_get_synth_generator ags_audio_set_synth_generator ags_audio_add_synth_generator ags_audio_remove_synth_generator ags_audio_get_cursor ags_audio_set_cursor ags_audio_add_cursor ags_audio_remove_cursor ags_audio_get_notation ags_audio_set_notation ags_audio_add_notation ags_audio_remove_notation ags_audio_get_automation_port ags_audio_set_automation_port ags_audio_add_automation_port ags_audio_remove_automation_port ags_audio_get_automation ags_audio_set_automation ags_audio_add_automation ags_audio_remove_automation ags_audio_get_wave ags_audio_set_wave ags_audio_add_wave ags_audio_remove_wave ags_audio_get_output_audio_file ags_audio_set_output_audio_file ags_audio_get_input_audio_file ags_audio_set_input_audio_file ags_audio_get_instrument_name ags_audio_set_instrument_name ags_audio_get_track_name ags_audio_set_track_name ags_audio_get_midi ags_audio_set_midi ags_audio_add_midi ags_audio_remove_midi ags_audio_get_output_midi_file ags_audio_set_output_midi_file ags_audio_get_input_midi_file ags_audio_set_input_midi_file ags_audio_get_recall_id ags_audio_set_recall_id ags_audio_add_recall_id ags_audio_remove_recall_id ags_audio_get_recycling_context ags_audio_set_recycling_context ags_audio_add_recycling_context ags_audio_remove_recycling_context ags_audio_get_recall_container ags_audio_set_recall_container ags_audio_add_recall_container ags_audio_remove_recall_container ags_audio_get_play ags_audio_set_play ags_audio_get_recall ags_audio_set_recall ags_audio_add_recall ags_audio_remove_recall ags_audio_duplicate_recall ags_audio_resolve_recall ags_audio_init_recall ags_audio_play_recall ags_audio_done_recall ags_audio_cancel_recall ags_audio_cleanup_recall ags_audio_start ags_audio_stop ags_audio_check_scope ags_audio_collect_all_audio_ports ags_audio_collect_all_audio_ports_by_specifier_and_context ags_audio_open_audio_file_as_channel ags_audio_open_audio_file_as_wave ags_audio_open_midi_file_as_midi ags_audio_open_midi_file_as_notation ags_audio_recursive_set_property ags_audio_recursive_run_stage ags_audio_new ags_recall_dssi_run_get_type ags_recall_dssi_run_new ags_audio_buffer_util_format_from_soundcard ags_audio_buffer_util_get_copy_mode ags_audio_buffer_util_clear_float ags_audio_buffer_util_clear_float32 ags_audio_buffer_util_clear_double ags_audio_buffer_util_clear_complex ags_audio_buffer_util_clear_buffer ags_audio_buffer_util_envelope_s8 ags_audio_buffer_util_envelope_s16 ags_audio_buffer_util_envelope_s24 ags_audio_buffer_util_envelope_s32 ags_audio_buffer_util_envelope_s64 ags_audio_buffer_util_envelope_float ags_audio_buffer_util_envelope_double ags_audio_buffer_util_envelope_complex ags_audio_buffer_util_envelope ags_audio_buffer_util_volume_s8 ags_audio_buffer_util_volume_s16 ags_audio_buffer_util_volume_s24 ags_audio_buffer_util_volume_s32 ags_audio_buffer_util_volume_s64 ags_audio_buffer_util_volume_float ags_audio_buffer_util_volume_double ags_audio_buffer_util_volume_complex ags_audio_buffer_util_volume ags_audio_buffer_util_peak_s8 ags_audio_buffer_util_peak_s16 ags_audio_buffer_util_peak_s24 ags_audio_buffer_util_peak_s32 ags_audio_buffer_util_peak_s64 ags_audio_buffer_util_peak_float ags_audio_buffer_util_peak_double ags_audio_buffer_util_peak_complex ags_audio_buffer_util_peak ags_audio_buffer_util_resample_s8 ags_audio_buffer_util_resample_s16 ags_audio_buffer_util_resample_s24 ags_audio_buffer_util_resample_s32 ags_audio_buffer_util_resample_s64 ags_audio_buffer_util_resample_float ags_audio_buffer_util_resample_double ags_audio_buffer_util_resample_complex ags_audio_buffer_util_resample ags_audio_buffer_util_resample_s8_with_buffer ags_audio_buffer_util_resample_s16_with_buffer ags_audio_buffer_util_resample_s24_with_buffer ags_audio_buffer_util_resample_s32_with_buffer ags_audio_buffer_util_resample_s64_with_buffer ags_audio_buffer_util_resample_float_with_buffer ags_audio_buffer_util_resample_double_with_buffer ags_audio_buffer_util_resample_complex_with_buffer ags_audio_buffer_util_resample_with_buffer ags_audio_buffer_util_copy_s8_to_s8 ags_audio_buffer_util_copy_s8_to_s16 ags_audio_buffer_util_copy_s8_to_s24 ags_audio_buffer_util_copy_s8_to_s32 ags_audio_buffer_util_copy_s8_to_s64 ags_audio_buffer_util_copy_s8_to_float ags_audio_buffer_util_copy_s8_to_double ags_audio_buffer_util_copy_s16_to_s8 ags_audio_buffer_util_copy_s16_to_s16 ags_audio_buffer_util_copy_s16_to_s24 ags_audio_buffer_util_copy_s16_to_s32 ags_audio_buffer_util_copy_s16_to_s64 ags_audio_buffer_util_copy_s16_to_float ags_audio_buffer_util_copy_s16_to_double ags_audio_buffer_util_copy_s24_to_s8 ags_audio_buffer_util_copy_s24_to_s16 ags_audio_buffer_util_copy_s24_to_s24 ags_audio_buffer_util_copy_s24_to_s32 ags_audio_buffer_util_copy_s24_to_s64 ags_audio_buffer_util_copy_s24_to_float ags_audio_buffer_util_copy_s24_to_double ags_audio_buffer_util_copy_s32_to_s8 ags_audio_buffer_util_copy_s32_to_s16 ags_audio_buffer_util_copy_s32_to_s24 ags_audio_buffer_util_copy_s32_to_s32 ags_audio_buffer_util_copy_s32_to_s64 ags_audio_buffer_util_copy_s32_to_float ags_audio_buffer_util_copy_s32_to_double ags_audio_buffer_util_copy_s64_to_s8 ags_audio_buffer_util_copy_s64_to_s16 ags_audio_buffer_util_copy_s64_to_s24 ags_audio_buffer_util_copy_s64_to_s32 ags_audio_buffer_util_copy_s64_to_s64 ags_audio_buffer_util_copy_s64_to_float ags_audio_buffer_util_copy_s64_to_double ags_audio_buffer_util_copy_float_to_s8 ags_audio_buffer_util_copy_float_to_s16 ags_audio_buffer_util_copy_float_to_s24 ags_audio_buffer_util_copy_float_to_s32 ags_audio_buffer_util_copy_float_to_s64 ags_audio_buffer_util_copy_float_to_float ags_audio_buffer_util_copy_float_to_double ags_audio_buffer_util_copy_double_to_s8 ags_audio_buffer_util_copy_double_to_s16 ags_audio_buffer_util_copy_double_to_s24 ags_audio_buffer_util_copy_double_to_s32 ags_audio_buffer_util_copy_double_to_s64 ags_audio_buffer_util_copy_double_to_float ags_audio_buffer_util_copy_double_to_double ags_audio_buffer_util_copy_s8_to_float32 ags_audio_buffer_util_copy_s16_to_float32 ags_audio_buffer_util_copy_s24_to_float32 ags_audio_buffer_util_copy_s32_to_float32 ags_audio_buffer_util_copy_s64_to_float32 ags_audio_buffer_util_copy_float_to_float32 ags_audio_buffer_util_copy_double_to_float32 ags_audio_buffer_util_copy_float32_to_float32 ags_audio_buffer_util_copy_float32_to_s8 ags_audio_buffer_util_copy_float32_to_s16 ags_audio_buffer_util_copy_float32_to_s24 ags_audio_buffer_util_copy_float32_to_s32 ags_audio_buffer_util_copy_float32_to_s64 ags_audio_buffer_util_copy_float32_to_float ags_audio_buffer_util_copy_float32_to_double ags_audio_buffer_util_copy_s8_to_complex ags_audio_buffer_util_copy_s16_to_complex ags_audio_buffer_util_copy_s24_to_complex ags_audio_buffer_util_copy_s32_to_complex ags_audio_buffer_util_copy_s64_to_complex ags_audio_buffer_util_copy_float_to_complex ags_audio_buffer_util_copy_double_to_complex ags_audio_buffer_util_copy_float32_to_complex ags_audio_buffer_util_copy_complex_to_complex ags_audio_buffer_util_copy_complex_to_s8 ags_audio_buffer_util_copy_complex_to_s16 ags_audio_buffer_util_copy_complex_to_s24 ags_audio_buffer_util_copy_complex_to_s32 ags_audio_buffer_util_copy_complex_to_s64 ags_audio_buffer_util_copy_complex_to_float ags_audio_buffer_util_copy_complex_to_double ags_audio_buffer_util_copy_complex_to_float32 ags_audio_buffer_util_copy_buffer_to_buffer ags_recycling_context_get_type ags_recycling_context_find_scope ags_recycling_context_replace ags_recycling_context_add ags_recycling_context_remove ags_recycling_context_insert ags_recycling_context_get_toplevel ags_recycling_context_find ags_recycling_context_find_child ags_recycling_context_find_parent ags_recycling_context_add_child ags_recycling_context_remove_child ags_recycling_context_get_child_recall_id ags_recycling_context_reset_recycling ags_recycling_context_new ags_recall_audio_get_type ags_recall_audio_get_audio ags_recall_audio_set_audio ags_recall_audio_new ags_recall_audio_signal_get_type ags_recall_audio_signal_new ags_loop_channel_get_type ags_loop_channel_new ags_mute_audio_run_get_type ags_mute_audio_run_new ags_volume_recycling_get_type ags_volume_recycling_new ags_volume_channel_get_type ags_volume_channel_new ags_peak_channel_get_type ags_peak_channel_buffer_add ags_peak_channel_retrieve_peak_internal ags_peak_channel_new ags_play_recycling_get_type ags_play_recycling_new ags_record_midi_audio_run_get_type ags_record_midi_audio_run_new ags_copy_pattern_audio_run_get_type ags_copy_pattern_audio_run_new ags_stream_recycling_get_type ags_stream_recycling_new ags_feed_audio_signal_get_type ags_feed_audio_signal_new ags_envelope_channel_run_get_type ags_envelope_channel_run_new ags_prepare_audio_signal_get_type ags_prepare_audio_signal_new ags_lfo_recycling_get_type ags_lfo_recycling_new ags_play_channel_get_type ags_play_channel_new ags_mute_audio_signal_get_type ags_mute_audio_signal_new ags_lfo_channel_get_type ags_lfo_channel_new ags_count_beats_audio_run_get_type ags_count_beats_audio_run_sequencer_start ags_count_beats_audio_run_sequencer_loop ags_count_beats_audio_run_sequencer_stop ags_count_beats_audio_run_notation_start ags_count_beats_audio_run_notation_loop ags_count_beats_audio_run_notation_stop ags_count_beats_audio_run_wave_start ags_count_beats_audio_run_wave_loop ags_count_beats_audio_run_wave_stop ags_count_beats_audio_run_midi_start ags_count_beats_audio_run_midi_loop ags_count_beats_audio_run_midi_stop ags_count_beats_audio_run_new ags_play_channel_run_master_get_type ags_play_channel_run_master_test_flags ags_play_channel_run_master_set_flags ags_play_channel_run_master_unset_flags ags_play_channel_run_master_new ags_play_wave_audio_run_get_type ags_play_wave_audio_run_new ags_copy_recycling_get_type ags_copy_recycling_new ags_prepare_channel_run_get_type ags_prepare_channel_run_new ags_play_dssi_audio_run_get_type ags_play_dssi_audio_run_load_ports ags_play_dssi_audio_run_new ags_eq10_channel_get_type ags_eq10_channel_new ags_analyse_channel_run_get_type ags_analyse_channel_run_new ags_peak_audio_signal_get_type ags_peak_audio_signal_new ags_prepare_recycling_get_type ags_prepare_recycling_new ags_stream_channel_run_get_type ags_stream_channel_run_new ags_capture_wave_channel_run_get_type ags_capture_wave_channel_run_new ags_route_lv2_audio_run_get_type ags_route_lv2_audio_run_new ags_play_wave_audio_get_type ags_play_wave_audio_new ags_mute_channel_run_get_type ags_mute_channel_run_new ags_feed_recycling_get_type ags_feed_recycling_new ags_envelope_audio_signal_get_type ags_envelope_audio_signal_new ags_route_dssi_audio_run_get_type ags_route_dssi_audio_run_new ags_analyse_channel_get_type ags_analyse_channel_buffer_add ags_analyse_channel_retrieve_frequency_and_magnitude ags_analyse_channel_new ags_stream_audio_signal_get_type ags_stream_audio_signal_new ags_play_dssi_audio_get_type ags_play_dssi_audio_load ags_play_dssi_audio_load_ports ags_play_dssi_audio_load_conversion ags_play_dssi_audio_find ags_play_dssi_audio_new ags_volume_audio_signal_get_type ags_volume_audio_signal_new ags_peak_recycling_get_type ags_peak_recycling_new ags_rt_stream_channel_get_type ags_rt_stream_channel_new ags_play_notation_audio_get_type ags_play_notation_audio_new ags_envelope_channel_get_type ags_envelope_channel_new ags_play_channel_run_get_type ags_play_channel_run_test_flags ags_play_channel_run_set_flags ags_play_channel_run_unset_flags ags_play_channel_run_new ags_count_beats_audio_get_type ags_count_beats_audio_new ags_envelope_recycling_get_type ags_envelope_recycling_new ags_play_lv2_audio_run_get_type ags_play_lv2_audio_run_load_ports ags_play_lv2_audio_run_new ags_analyse_recycling_get_type ags_analyse_recycling_new ags_buffer_recycling_get_type ags_buffer_recycling_new ags_rt_stream_audio_signal_get_type ags_rt_stream_audio_signal_new ags_buffer_audio_signal_get_type ags_buffer_audio_signal_new ags_stream_channel_get_type ags_stream_channel_new ags_record_midi_audio_get_type ags_record_midi_audio_new ags_volume_channel_run_get_type ags_volume_channel_run_new ags_play_audio_signal_get_type ags_play_audio_signal_new ags_feed_channel_get_type ags_feed_channel_new ags_mute_audio_get_type ags_mute_audio_new ags_peak_channel_run_get_type ags_peak_channel_run_new ags_copy_audio_signal_get_type ags_copy_audio_signal_new ags_play_notation_audio_run_get_type ags_play_notation_audio_run_new ags_copy_channel_run_get_type ags_copy_channel_run_new ags_eq10_audio_signal_get_type ags_eq10_audio_signal_new ags_analyse_audio_signal_get_type ags_analyse_audio_signal_new ags_feed_channel_run_get_type ags_feed_channel_run_new ags_play_audio_get_type ags_play_audio_new ags_route_lv2_audio_get_type ags_route_lv2_audio_new ags_lfo_audio_signal_get_type ags_lfo_audio_signal_new ags_copy_channel_get_type ags_copy_channel_new ags_capture_wave_channel_get_type ags_capture_wave_channel_new ags_delay_audio_run_get_type ags_delay_audio_run_sequencer_alloc_output ags_delay_audio_run_sequencer_alloc_input ags_delay_audio_run_sequencer_count ags_delay_audio_run_notation_alloc_output ags_delay_audio_run_notation_alloc_input ags_delay_audio_run_notation_count ags_delay_audio_run_wave_alloc_output ags_delay_audio_run_wave_alloc_input ags_delay_audio_run_wave_count ags_delay_audio_run_midi_alloc_output ags_delay_audio_run_midi_alloc_input ags_delay_audio_run_midi_count ags_delay_audio_run_new ags_buffer_channel_run_get_type ags_buffer_channel_run_new ags_mute_recycling_get_type ags_mute_recycling_new ags_buffer_channel_get_type ags_buffer_channel_new ags_loop_channel_run_get_type ags_loop_channel_run_new ags_route_dssi_audio_get_type ags_route_dssi_audio_new ags_delay_audio_get_type ags_delay_audio_sequencer_duration_changed ags_delay_audio_notation_duration_changed ags_delay_audio_wave_duration_changed ags_delay_audio_midi_duration_changed ags_delay_audio_new ags_copy_pattern_channel_run_get_type ags_copy_pattern_channel_run_new ags_lfo_channel_run_get_type ags_lfo_channel_run_new ags_capture_wave_audio_get_type ags_capture_wave_audio_new ags_play_wave_channel_run_get_type ags_play_wave_channel_run_new ags_rt_stream_recycling_get_type ags_rt_stream_recycling_new ags_copy_pattern_channel_get_type ags_copy_pattern_channel_new ags_mute_channel_get_type ags_mute_channel_new ags_play_wave_channel_get_type ags_play_wave_channel_new ags_copy_pattern_audio_get_type ags_copy_pattern_audio_new ags_eq10_channel_run_get_type ags_eq10_channel_run_new ags_capture_wave_audio_run_get_type ags_capture_wave_audio_run_new ags_play_lv2_audio_get_type ags_play_lv2_audio_test_flags ags_play_lv2_audio_set_flags ags_play_lv2_audio_unset_flags ags_play_lv2_audio_load ags_play_lv2_audio_load_ports ags_play_lv2_audio_load_conversion ags_play_lv2_audio_find ags_play_lv2_audio_new ags_prepare_channel_get_type ags_prepare_channel_new ags_rt_stream_channel_run_get_type ags_rt_stream_channel_run_new ags_eq10_recycling_get_type ags_eq10_recycling_new ags_recall_dssi_get_type ags_recall_dssi_load ags_recall_dssi_load_ports ags_recall_dssi_load_conversion ags_recall_dssi_find ags_recall_dssi_new ags_frequency_map_manager_get_type ags_frequency_map_manager_test_flags ags_frequency_map_manager_set_flags ags_frequency_map_manager_unset_flags ags_frequency_map_manager_add_frequency_map ags_frequency_map_manager_add_factorized_frequency_map ags_frequency_map_manager_find_frequency_map ags_frequency_map_manager_find_factorized_frequency_map ags_frequency_map_manager_load_default ags_frequency_map_manager_get_instance ags_frequency_map_manager_new ags_recall_dependency_get_type ags_recall_dependency_find_dependency ags_recall_dependency_find_dependency_by_provider ags_recall_dependency_resolve ags_recall_dependency_new ags_automation_get_type ags_automation_get_obj_mutex ags_automation_test_flags ags_automation_set_flags ags_automation_unset_flags ags_automation_find_port ags_automation_find_near_timestamp ags_automation_find_near_timestamp_extended ags_automation_sort_func ags_automation_add ags_automation_get_audio ags_automation_set_audio ags_automation_get_channel_type ags_automation_set_channel_type ags_automation_get_line ags_automation_set_line ags_automation_get_timestamp ags_automation_set_timestamp ags_automation_get_control_name ags_automation_set_control_name ags_automation_get_steps ags_automation_set_steps ags_automation_get_upper ags_automation_set_upper ags_automation_get_lower ags_automation_set_lower ags_automation_get_default_value ags_automation_set_default_value ags_automation_get_port ags_automation_set_port ags_automation_get_acceleration ags_automation_set_acceleration ags_automation_add_acceleration ags_automation_remove_acceleration ags_automation_remove_acceleration_at_position ags_automation_get_selection ags_automation_is_acceleration_selected ags_automation_find_point ags_automation_find_region ags_automation_free_selection ags_automation_add_point_to_selection ags_automation_remove_point_from_selection ags_automation_add_region_to_selection ags_automation_remove_region_from_selection ags_automation_add_all_to_selection ags_automation_copy_selection ags_automation_cut_selection ags_automation_insert_from_clipboard ags_automation_insert_from_clipboard_extended ags_automation_get_specifier_unique ags_automation_get_specifier_unique_with_channel_type ags_automation_find_specifier ags_automation_find_channel_type_with_control_name ags_automation_find_specifier_with_type_and_line ags_automation_get_value ags_automation_new ags_jack_client_get_type ags_jack_client_test_flags ags_jack_client_set_flags ags_jack_client_unset_flags ags_jack_client_find_uuid ags_jack_client_find ags_jack_client_open ags_jack_client_close ags_jack_client_add_device ags_jack_client_remove_device ags_jack_client_add_port ags_jack_client_remove_port ags_jack_client_activate ags_jack_client_deactivate ags_jack_client_new ags_jack_devin_get_type ags_jack_devin_error_quark ags_jack_devin_test_flags ags_jack_devin_set_flags ags_jack_devin_unset_flags ags_jack_devin_switch_buffer_flag ags_jack_devin_adjust_delay_and_attack ags_jack_devin_realloc_buffer ags_jack_devin_new ags_jack_devout_get_type ags_jack_devout_error_quark ags_jack_devout_test_flags ags_jack_devout_set_flags ags_jack_devout_unset_flags ags_jack_devout_switch_buffer_flag ags_jack_devout_adjust_delay_and_attack ags_jack_devout_realloc_buffer ags_jack_devout_new ags_jack_port_get_type ags_jack_port_test_flags ags_jack_port_set_flags ags_jack_port_unset_flags ags_jack_port_find ags_jack_port_register ags_jack_port_unregister ags_jack_port_new ags_jack_server_get_type ags_jack_server_test_flags ags_jack_server_set_flags ags_jack_server_unset_flags ags_jack_server_find_url ags_jack_server_find_client ags_jack_server_find_port ags_jack_server_add_client ags_jack_server_remove_client ags_jack_server_connect_client ags_jack_server_disconnect_client ags_jack_server_new ags_jack_midiin_get_type ags_jack_midiin_error_quark ags_jack_midiin_test_flags ags_jack_midiin_set_flags ags_jack_midiin_unset_flags ags_jack_midiin_switch_buffer_flag ags_jack_midiin_new ags_audio_signal_get_type ags_audio_signal_get_obj_mutex ags_audio_signal_stream_lock ags_audio_signal_stream_unlock ags_audio_signal_test_flags ags_audio_signal_set_flags ags_audio_signal_unset_flags ags_stream_alloc ags_stream_free ags_audio_signal_get_recycling ags_audio_signal_set_recycling ags_audio_signal_get_output_soundcard ags_audio_signal_set_output_soundcard ags_audio_signal_get_input_soundcard ags_audio_signal_set_input_soundcard ags_audio_signal_get_samplerate ags_audio_signal_set_samplerate ags_audio_signal_get_buffer_size ags_audio_signal_set_buffer_size ags_audio_signal_get_format ags_audio_signal_set_format ags_audio_signal_get_note ags_audio_signal_set_note ags_audio_signal_add_note ags_audio_signal_remove_note ags_audio_signal_refresh_data ags_audio_signal_add_stream ags_audio_signal_stream_resize ags_audio_signal_stream_safe_resize ags_audio_signal_duplicate_stream ags_audio_signal_feed ags_audio_signal_get_length_till_current ags_audio_signal_get_template ags_audio_signal_get_rt_template ags_audio_signal_find_stream_current ags_audio_signal_find_by_recall_id ags_audio_signal_is_active ags_audio_signal_new ags_audio_signal_new_with_length ags_buffer_get_type ags_buffer_get_obj_mutex ags_buffer_lock ags_buffer_unlock ags_buffer_test_flags ags_buffer_set_flags ags_buffer_unset_flags ags_buffer_sort_func ags_buffer_get_x ags_buffer_set_x ags_buffer_get_samplerate ags_buffer_set_samplerate ags_buffer_get_buffer_size ags_buffer_set_buffer_size ags_buffer_get_format ags_buffer_set_format ags_buffer_get_data ags_buffer_duplicate ags_buffer_new ags_generic_recall_recycling_get_type ags_generic_recall_recycling_new ags_generic_recall_channel_run_get_type ags_generic_recall_channel_run_new ags_apply_presets_get_type ags_apply_presets_soundcard ags_apply_presets_new ags_resize_audio_get_type ags_resize_audio_new ags_start_audio_get_type ags_start_audio_new ags_free_selection_get_type ags_free_selection_new ags_start_sequencer_get_type ags_start_sequencer_new ags_cancel_channel_get_type ags_cancel_channel_new ags_set_audio_channels_get_type ags_set_audio_channels_new ags_open_single_file_get_type ags_open_single_file_new ags_start_channel_get_type ags_start_channel_new ags_open_sf2_instrument_get_type ags_open_sf2_instrument_new ags_remove_audio_signal_get_type ags_remove_audio_signal_new ags_add_note_get_type ags_add_note_new ags_export_output_get_type ags_export_output_new ags_add_soundcard_get_type ags_add_soundcard_new ags_add_effect_get_type ags_add_effect_new ags_add_audio_signal_get_type ags_add_audio_signal_new ags_open_file_get_type ags_open_file_new ags_reset_peak_get_type ags_reset_peak_add ags_reset_peak_remove ags_reset_peak_get_instance ags_reset_peak_new ags_link_channel_get_type ags_link_channel_new ags_stop_sequencer_get_type ags_stop_sequencer_new ags_reset_note_get_type ags_reset_note_add ags_reset_note_remove ags_reset_note_get_instance ags_reset_note_new ags_tic_device_get_type ags_tic_device_new ags_apply_sequencer_length_get_type ags_apply_sequencer_length_new ags_remove_note_get_type ags_remove_note_new ags_set_buffer_size_get_type ags_set_buffer_size_new ags_apply_tact_get_type ags_apply_tact_new ags_clear_buffer_get_type ags_clear_buffer_new ags_set_format_get_type ags_set_format_new ags_set_muted_get_type ags_set_muted_new ags_open_wave_get_type ags_open_wave_new ags_cancel_audio_get_type ags_cancel_audio_new ags_remove_audio_get_type ags_remove_audio_new ags_set_samplerate_get_type ags_set_samplerate_new ags_apply_bpm_get_type ags_apply_bpm_new ags_apply_sound_config_get_type ags_apply_sound_config_new ags_open_sf2_sample_get_type ags_open_sf2_sample_new ags_start_soundcard_get_type ags_start_soundcard_new ags_clear_audio_signal_get_type ags_clear_audio_signal_new ags_switch_buffer_flag_get_type ags_switch_buffer_flag_new ags_toggle_pattern_bit_get_type ags_toggle_pattern_bit_refresh_gui ags_toggle_pattern_bit_new ags_stop_soundcard_get_type ags_stop_soundcard_new ags_reset_amplitude_get_type ags_reset_amplitude_add ags_reset_amplitude_remove ags_reset_amplitude_get_instance ags_reset_amplitude_new ags_crop_note_get_type ags_crop_note_new ags_set_device_get_type ags_set_device_new ags_apply_synth_get_type ags_apply_synth_new ags_add_audio_get_type ags_add_audio_new ags_seek_soundcard_get_type ags_seek_soundcard_new ags_move_note_get_type ags_move_note_new ags_remove_soundcard_get_type ags_remove_soundcard_new ags_output_get_type ags_output_find_first_input_recycling ags_output_find_last_input_recycling ags_output_new ags_input_get_type ags_input_is_active ags_input_next_active ags_input_add_synth_generator ags_input_remove_synth_generator ags_input_open_file ags_input_new ags_midi_parser_get_type ags_midi_parser_read_gint16 ags_midi_parser_read_gint24 ags_midi_parser_read_gint32 ags_midi_parser_read_varlength ags_midi_parser_read_text ags_midi_parser_ticks_to_sec ags_midi_parser_midi_getc ags_midi_parser_on_error ags_midi_parser_parse_full ags_midi_parser_parse_bytes ags_midi_parser_parse_header ags_midi_parser_parse_track ags_midi_parser_channel_message ags_midi_parser_key_on ags_midi_parser_key_off ags_midi_parser_key_pressure ags_midi_parser_change_parameter ags_midi_parser_change_pitch_bend ags_midi_parser_change_program ags_midi_parser_change_channel_pressure ags_midi_parser_not_defined ags_midi_parser_sysex ags_midi_parser_system_common ags_midi_parser_meta_event ags_midi_parser_sequence_number ags_midi_parser_end_of_track ags_midi_parser_smtpe ags_midi_parser_tempo ags_midi_parser_time_signature ags_midi_parser_key_signature ags_midi_parser_sequencer_meta_event ags_midi_parser_meta_misc ags_midi_parser_text_event ags_midi_parser_new ags_midi_builder_get_type ags_midi_builder_header_alloc ags_midi_builder_header_free ags_midi_builder_track_alloc ags_midi_builder_track_free ags_midi_builder_track_find_delta_time_with_track_name ags_midi_builder_track_insert_midi_message ags_midi_builder_track_get_delta_time_offset ags_midi_builder_midi_putc ags_midi_builder_on_error ags_midi_builder_append_header ags_midi_builder_append_track ags_midi_builder_append_key_on ags_midi_builder_append_key_off ags_midi_builder_append_key_pressure ags_midi_builder_append_change_parameter ags_midi_builder_append_change_pitch_bend ags_midi_builder_append_change_program ags_midi_builder_append_change_pressure ags_midi_builder_append_sysex ags_midi_builder_append_quarter_frame ags_midi_builder_append_song_position ags_midi_builder_append_song_select ags_midi_builder_append_tune_request ags_midi_builder_append_sequence_number ags_midi_builder_append_smtpe ags_midi_builder_append_tempo ags_midi_builder_append_time_signature ags_midi_builder_append_key_signature ags_midi_builder_append_sequencer_meta_event ags_midi_builder_append_text_event ags_midi_builder_append_xml_node ags_midi_builder_from_xml_doc ags_midi_builder_build ags_midi_builder_new ags_midi_buffer_util_get_varlength_size ags_midi_buffer_util_put_varlength ags_midi_buffer_util_get_varlength ags_midi_buffer_util_put_int16 ags_midi_buffer_util_get_int16 ags_midi_buffer_util_put_int24 ags_midi_buffer_util_get_int24 ags_midi_buffer_util_put_int32 ags_midi_buffer_util_get_int32 ags_midi_buffer_util_put_header ags_midi_buffer_util_get_header ags_midi_buffer_util_put_track ags_midi_buffer_util_get_track ags_midi_buffer_util_put_key_on ags_midi_buffer_util_get_key_on ags_midi_buffer_util_put_key_off ags_midi_buffer_util_get_key_off ags_midi_buffer_util_put_key_pressure ags_midi_buffer_util_get_key_pressure ags_midi_buffer_util_put_change_parameter ags_midi_buffer_util_get_change_parameter ags_midi_buffer_util_put_pitch_bend ags_midi_buffer_util_get_pitch_bend ags_midi_buffer_util_put_change_program ags_midi_buffer_util_get_change_program ags_midi_buffer_util_put_change_pressure ags_midi_buffer_util_get_change_pressure ags_midi_buffer_util_put_sysex ags_midi_buffer_util_get_sysex ags_midi_buffer_util_put_quarter_frame ags_midi_buffer_util_get_quarter_frame ags_midi_buffer_util_put_song_position ags_midi_buffer_util_get_song_position ags_midi_buffer_util_put_song_select ags_midi_buffer_util_get_song_select ags_midi_buffer_util_put_tune_request ags_midi_buffer_util_get_tune_request ags_midi_buffer_util_put_sequence_number ags_midi_buffer_util_get_sequence_number ags_midi_buffer_util_put_smtpe ags_midi_buffer_util_get_smtpe ags_midi_buffer_util_put_tempo ags_midi_buffer_util_get_tempo ags_midi_buffer_util_put_time_signature ags_midi_buffer_util_get_time_signature ags_midi_buffer_util_put_key_signature ags_midi_buffer_util_get_key_signature ags_midi_buffer_util_put_sequencer_meta_event ags_midi_buffer_util_get_sequencer_meta_event ags_midi_buffer_util_put_text_event ags_midi_buffer_util_get_text_event ags_midi_buffer_util_put_end_of_track ags_midi_buffer_util_get_end_of_track ags_midi_buffer_util_seek_message ags_midi_buffer_util_decode ags_midi_file_get_type ags_midi_file_error_quark ags_midi_file_open ags_midi_file_open_from_data ags_midi_file_rw_open ags_midi_file_close ags_midi_file_read ags_midi_file_write ags_midi_file_seek ags_midi_file_flush ags_midi_file_read_byte ags_midi_file_read_gint16 ags_midi_file_read_gint24 ags_midi_file_read_gint32 ags_midi_file_read_varlength ags_midi_file_read_text ags_midi_file_write_byte ags_midi_file_write_gint16 ags_midi_file_write_gint24 ags_midi_file_write_gint32 ags_midi_file_write_varlength ags_midi_file_write_text ags_midi_file_read_header ags_midi_file_write_header ags_midi_file_read_track_data ags_midi_file_write_track_data ags_midi_file_read_notation ags_mid_file_read_midi ags_midi_file_new ags_midi_util_is_key_on ags_midi_util_is_key_off ags_midi_util_is_key_pressure ags_midi_util_is_change_parameter ags_midi_util_is_pitch_bend ags_midi_util_is_change_program ags_midi_util_is_change_pressure ags_midi_util_is_sysex ags_midi_util_is_quarter_frame ags_midi_util_is_song_position ags_midi_util_is_song_select ags_midi_util_is_tune_request ags_midi_util_is_meta_event ags_midi_util_to_smf ags_midi_util_delta_time_to_offset ags_midi_util_offset_to_delta_time ags_channel_get_type ags_channel_error_quark ags_channel_get_obj_mutex ags_channel_get_play_mutex ags_channel_get_recall_mutex ags_channel_test_flags ags_channel_set_flags ags_channel_unset_flags ags_channel_test_ability_flags ags_channel_set_ability_flags ags_channel_unset_ability_flags ags_channel_test_behaviour_flags ags_channel_set_behaviour_flags ags_channel_unset_behaviour_flags ags_channel_test_staging_flags ags_channel_set_staging_flags ags_channel_unset_staging_flags ags_channel_get_audio ags_channel_set_audio ags_channel_next ags_channel_prev ags_channel_next_pad ags_channel_prev_pad ags_channel_first ags_channel_last ags_channel_nth ags_channel_pad_first ags_channel_pad_last ags_channel_pad_nth ags_channel_first_with_recycling ags_channel_last_with_recycling ags_channel_prev_with_recycling ags_channel_next_with_recycling ags_channel_get_link ags_channel_set_link ags_channel_reset_recycling ags_channel_recycling_changed ags_channel_get_output_soundcard ags_channel_set_output_soundcard ags_channel_get_input_soundcard ags_channel_set_input_soundcard ags_channel_get_samplerate ags_channel_set_samplerate ags_channel_get_buffer_size ags_channel_set_buffer_size ags_channel_get_format ags_channel_set_format ags_channel_get_pad ags_channel_set_pad ags_channel_get_audio_channel ags_channel_set_audio_channel ags_channel_get_line ags_channel_set_line ags_channel_get_octave ags_channel_set_octave ags_channel_get_key ags_channel_set_key ags_channel_get_absolute_key ags_channel_set_absolute_key ags_channel_get_pattern ags_channel_set_pattern ags_channel_add_pattern ags_channel_remove_pattern ags_channel_get_playback ags_channel_set_playback ags_channel_get_recall_id ags_channel_set_recall_id ags_channel_add_recall_id ags_channel_remove_recall_id ags_channel_get_recall_container ags_channel_set_recall_container ags_channel_add_recall_container ags_channel_remove_recall_container ags_channel_get_play ags_channel_set_play ags_channel_get_recall ags_channel_set_recall ags_channel_add_recall ags_channel_remove_recall ags_channel_add_effect ags_channel_remove_effect ags_channel_duplicate_recall ags_channel_resolve_recall ags_channel_init_recall ags_channel_play_recall ags_channel_done_recall ags_channel_cancel_recall ags_channel_cleanup_recall ags_channel_start ags_channel_stop ags_channel_check_scope ags_channel_collect_all_channel_ports ags_channel_collect_all_channel_ports_by_specifier_and_context ags_channel_get_level ags_channel_recursive_set_property ags_channel_recursive_run_stage ags_channel_new ags_sf2_loader_get_type ags_sf2_loader_test_flags ags_sf2_loader_set_flags ags_sf2_loader_unset_flags ags_sf2_loader_start ags_sf2_loader_new ags_channel_thread_get_type ags_channel_thread_test_status_flags ags_channel_thread_set_status_flags ags_channel_thread_unset_status_flags ags_channel_thread_set_sound_scope ags_channel_thread_new ags_sequencer_thread_get_type ags_sequencer_thread_interval_timeout ags_sequencer_thread_find_sequencer ags_sequencer_thread_new ags_soundcard_thread_get_type ags_soundcard_thread_find_soundcard ags_soundcard_thread_new ags_wave_loader_get_type ags_wave_loader_test_flags ags_wave_loader_set_flags ags_wave_loader_unset_flags ags_wave_loader_start ags_wave_loader_new ags_audio_thread_get_type ags_audio_thread_test_status_flags ags_audio_thread_set_status_flags ags_audio_thread_unset_status_flags ags_audio_thread_set_sound_scope ags_audio_thread_new ags_sfz_loader_get_type ags_sfz_loader_test_flags ags_sfz_loader_set_flags ags_sfz_loader_unset_flags ags_sfz_loader_start ags_sfz_loader_new ags_audio_loop_get_type ags_audio_loop_test_flags ags_audio_loop_set_flags ags_audio_loop_unset_flags ags_audio_loop_add_audio ags_audio_loop_remove_audio ags_audio_loop_add_channel ags_audio_loop_remove_channel ags_audio_loop_new ags_export_thread_get_type ags_export_thread_find_soundcard ags_export_thread_new ags_audio_unit_client_get_type ags_audio_unit_client_test_flags ags_audio_unit_client_set_flags ags_audio_unit_client_unset_flags ags_audio_unit_client_find_uuid ags_audio_unit_client_find ags_audio_unit_client_open ags_audio_unit_client_add_device ags_audio_unit_client_remove_device ags_audio_unit_client_add_port ags_audio_unit_client_remove_port ags_audio_unit_client_activate ags_audio_unit_client_deactivate ags_audio_unit_client_new ags_audio_unit_devin_get_type ags_audio_unit_devin_error_quark ags_audio_unit_devin_test_flags ags_audio_unit_devin_set_flags ags_audio_unit_devin_unset_flags ags_audio_unit_devin_switch_buffer_flag ags_audio_unit_devin_adjust_delay_and_attack ags_audio_unit_devin_realloc_buffer ags_audio_unit_devin_new ags_audio_unit_server_get_type ags_audio_unit_server_test_flags ags_audio_unit_server_set_flags ags_audio_unit_server_unset_flags ags_audio_unit_server_find_url ags_audio_unit_server_find_client ags_audio_unit_server_find_port ags_audio_unit_server_add_client ags_audio_unit_server_remove_client ags_audio_unit_server_connect_client ags_audio_unit_server_start_poll ags_audio_unit_server_new ags_audio_unit_port_get_type ags_audio_unit_port_test_flags ags_audio_unit_port_set_flags ags_audio_unit_port_unset_flags ags_audio_unit_port_find ags_audio_unit_port_register ags_audio_unit_port_unregister ags_audio_unit_port_set_format ags_audio_unit_port_set_samplerate ags_audio_unit_port_set_pcm_channels ags_audio_unit_port_set_buffer_size ags_audio_unit_port_new ags_audio_unit_devout_get_type ags_audio_unit_devout_error_quark ags_audio_unit_devout_test_flags ags_audio_unit_devout_set_flags ags_audio_unit_devout_unset_flags ags_audio_unit_devout_switch_buffer_flag ags_audio_unit_devout_adjust_delay_and_attack ags_audio_unit_devout_realloc_buffer ags_audio_unit_devout_new ags_recall_lv2_get_type ags_recall_lv2_test_flags ags_recall_lv2_set_flags ags_recall_lv2_unset_flags ags_recall_lv2_load ags_recall_lv2_load_ports ags_recall_lv2_load_conversion ags_recall_lv2_find ags_recall_lv2_new ags_acceleration_get_type ags_acceleration_get_obj_mutex ags_acceleration_test_flags ags_acceleration_set_flags ags_acceleration_unset_flags ags_acceleration_sort_func ags_acceleration_get_x ags_acceleration_set_x ags_acceleration_get_y ags_acceleration_set_y ags_acceleration_duplicate ags_acceleration_new ags_midiin_get_type ags_midiin_error_quark ags_midiin_test_flags ags_midiin_set_flags ags_midiin_unset_flags ags_midiin_switch_buffer_flag ags_midiin_new ags_recall_ladspa_get_type ags_recall_ladspa_load ags_recall_ladspa_load_ports ags_recall_ladspa_load_conversion ags_recall_ladspa_find ags_recall_ladspa_new ags_lfo_synth_util_sin_s8 ags_lfo_synth_util_sin_s16 ags_lfo_synth_util_sin_s24 ags_lfo_synth_util_sin_s32 ags_lfo_synth_util_sin_s64 ags_lfo_synth_util_sin_float ags_lfo_synth_util_sin_double ags_lfo_synth_util_sin_complex ags_lfo_synth_util_sawtooth_s8 ags_lfo_synth_util_sawtooth_s16 ags_lfo_synth_util_sawtooth_s24 ags_lfo_synth_util_sawtooth_s32 ags_lfo_synth_util_sawtooth_s64 ags_lfo_synth_util_sawtooth_float ags_lfo_synth_util_sawtooth_double ags_lfo_synth_util_sawtooth_complex ags_lfo_synth_util_triangle_s8 ags_lfo_synth_util_triangle_s16 ags_lfo_synth_util_triangle_s24 ags_lfo_synth_util_triangle_s32 ags_lfo_synth_util_triangle_s64 ags_lfo_synth_util_triangle_float ags_lfo_synth_util_triangle_double ags_lfo_synth_util_triangle_complex ags_lfo_synth_util_square_s8 ags_lfo_synth_util_square_s16 ags_lfo_synth_util_square_s24 ags_lfo_synth_util_square_s32 ags_lfo_synth_util_square_s64 ags_lfo_synth_util_square_float ags_lfo_synth_util_square_double ags_lfo_synth_util_square_complex ags_lfo_synth_util_impulse_s8 ags_lfo_synth_util_impulse_s16 ags_lfo_synth_util_impulse_s24 ags_lfo_synth_util_impulse_s32 ags_lfo_synth_util_impulse_s64 ags_lfo_synth_util_impulse_float ags_lfo_synth_util_impulse_double ags_lfo_synth_util_impulse_complex ags_lfo_synth_util_sin ags_lfo_synth_util_sawtooth ags_lfo_synth_util_triangle ags_lfo_synth_util_square ags_lfo_synth_util_impulse ags_preset_get_type ags_preset_error_quark ags_preset_get_obj_mutex ags_preset_test_flags ags_preset_set_flags ags_preset_unset_flags ags_preset_get_audio ags_preset_set_audio ags_preset_get_scope ags_preset_set_scope ags_preset_get_preset_name ags_preset_set_preset_name ags_preset_get_audio_channel_start ags_preset_set_audio_channel_start ags_preset_get_audio_channel_end ags_preset_set_audio_channel_end ags_preset_get_pad_start ags_preset_set_pad_start ags_preset_get_pad_end ags_preset_set_pad_end ags_preset_get_x_start ags_preset_set_x_start ags_preset_get_x_end ags_preset_set_x_end ags_preset_find_scope ags_preset_find_name ags_preset_add_parameter ags_preset_remove_parameter ags_preset_get_parameter ags_preset_new ags_recall_container_get_type ags_recall_container_test_flags ags_recall_container_set_flags ags_recall_container_unset_flags ags_recall_container_add ags_recall_container_remove ags_recall_container_get_recall_audio ags_recall_container_get_recall_audio_run ags_recall_container_get_recall_channel ags_recall_container_get_recall_channel_run ags_recall_container_find ags_recall_container_new ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_set ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_complex_get ags_fourier_transform_util_compute_stft_s8 ags_fourier_transform_util_compute_stft_s16 ags_fourier_transform_util_compute_stft_s24 ags_fourier_transform_util_compute_stft_s32 ags_fourier_transform_util_compute_stft_s64 ags_fourier_transform_util_compute_stft_float ags_fourier_transform_util_compute_stft_double ags_fourier_transform_util_inverse_stft_s8 ags_fourier_transform_util_inverse_stft_s16 ags_fourier_transform_util_inverse_stft_s24 ags_fourier_transform_util_inverse_stft_s32 ags_fourier_transform_util_inverse_stft_s64 ags_fourier_transform_util_inverse_stft_float ags_fourier_transform_util_inverse_stft_double ags_audio_application_context_get_type ags_audio_application_context_new ags_track_get_type ags_track_get_obj_mutex ags_track_lock ags_track_unlock ags_track_test_flags ags_track_set_flags ags_track_unset_flags ags_track_sort_func ags_track_get_x ags_track_set_x ags_track_get_smf_buffer ags_track_duplicate ags_track_new ags_wave_get_type ags_wave_get_obj_mutex ags_wave_test_flags ags_wave_set_flags ags_wave_unset_flags ags_wave_find_near_timestamp ags_wave_sort_func ags_wave_get_audio ags_wave_set_audio ags_wave_get_line ags_wave_set_line ags_wave_get_samplerate ags_wave_set_samplerate ags_wave_get_buffer_size ags_wave_set_buffer_size ags_wave_get_format ags_wave_set_format ags_wave_get_timestamp ags_wave_set_timestamp ags_wave_get_buffer ags_wave_set_buffer ags_wave_add ags_wave_add_buffer ags_wave_remove_buffer ags_wave_get_selection ags_wave_is_buffer_selected ags_wave_find_point ags_wave_find_region ags_wave_free_selection ags_wave_add_region_to_selection ags_wave_remove_region_from_selection ags_wave_add_all_to_selection ags_wave_copy_selection ags_wave_cut_selection ags_wave_insert_from_clipboard ags_wave_insert_from_clipboard_extended ags_wave_new ags_diatonic_scale_note_to_midi_key ags_diatonic_scale_midi_key_to_note ags_playback_get_type ags_playback_test_flags ags_playback_set_flags ags_playback_unset_flags ags_playback_set_channel_thread ags_playback_get_channel_thread ags_playback_set_recall_id ags_playback_get_recall_id ags_playback_find_channel ags_playback_new ags_port_get_type ags_port_test_flags ags_port_set_flags ags_port_unset_flags ags_port_safe_read ags_port_safe_read_raw ags_port_safe_write ags_port_safe_write_raw ags_port_safe_get_property ags_port_safe_set_property ags_port_find_specifier ags_port_add_automation ags_port_remove_automation ags_port_new ags_midi_get_type ags_midi_get_obj_mutex ags_midi_test_flags ags_midi_set_flags ags_midi_unset_flags ags_midi_find_near_timestamp ags_midi_sort_func ags_midi_get_audio ags_midi_set_audio ags_midi_get_audio_channel ags_midi_set_audio_channel ags_midi_get_timestamp ags_midi_set_timestamp ags_midi_get_track ags_midi_set_track ags_midi_add ags_midi_add_track ags_midi_remove_track ags_midi_new ags_pattern_get_type ags_pattern_get_obj_mutex ags_pattern_test_flags ags_pattern_set_flags ags_pattern_unset_flags ags_pattern_find_near_timestamp ags_pattern_get_channel ags_pattern_set_channel ags_pattern_get_timestamp ags_pattern_set_timestamp ags_pattern_get_dim ags_pattern_set_dim ags_pattern_get_port ags_pattern_set_port ags_pattern_is_empty ags_pattern_get_bit ags_pattern_toggle_bit ags_pattern_new ags_recall_factory_get_type ags_recall_factory_create ags_recall_factory_new ags_recall_lv2_run_get_type ags_recall_lv2_run_new ags_recall_get_type ags_recall_global_set_omit_event ags_recall_global_get_children_lock_free ags_recall_global_get_omit_event ags_recall_global_get_performance_mode ags_recall_global_get_rt_safe ags_recall_get_obj_mutex ags_recall_test_flags ags_recall_set_flags ags_recall_unset_flags ags_recall_test_ability_flags ags_recall_set_ability_flags ags_recall_unset_ability_flags ags_recall_check_ability_flags ags_recall_match_ability_flags_to_scope ags_recall_test_behaviour_flags ags_recall_set_behaviour_flags ags_recall_unset_behaviour_flags ags_recall_check_behaviour_flags ags_recall_set_sound_scope ags_recall_get_sound_scope ags_recall_check_sound_scope ags_recall_test_staging_flags ags_recall_set_staging_flags ags_recall_unset_staging_flags ags_recall_check_staging_flags ags_recall_test_state_flags ags_recall_set_state_flags ags_recall_unset_state_flags ags_recall_check_state_flags ags_recall_get_filename ags_recall_set_filename ags_recall_get_effect ags_recall_set_effect ags_recall_get_effect_index ags_recall_set_effect_index ags_recall_get_recall_container ags_recall_set_recall_container ags_recall_get_recall_id ags_recall_set_recall_id ags_recall_get_recall_dependency ags_recall_set_recall_dependency ags_recall_add_recall_dependency ags_recall_remove_recall_dependency ags_recall_get_children ags_recall_set_children ags_recall_add_child ags_recall_remove_child ags_recall_handler_free ags_recall_handler_alloc ags_recall_add_recall_handler ags_recall_remove_recall_handler ags_recall_get_output_soundcard ags_recall_set_output_soundcard ags_recall_get_input_soundcard ags_recall_set_input_soundcard ags_recall_get_samplerate ags_recall_set_samplerate ags_recall_get_buffer_size ags_recall_set_buffer_size ags_recall_get_format ags_recall_set_format ags_recall_resolve_dependency ags_recall_check_rt_data ags_recall_run_init_pre ags_recall_run_init_inter ags_recall_run_init_post ags_recall_feed_input_queue ags_recall_automate ags_recall_run_pre ags_recall_run_inter ags_recall_run_post ags_recall_do_feedback ags_recall_feed_output_queue ags_recall_stop_persistent ags_recall_cancel ags_recall_done ags_recall_duplicate ags_recall_notify_dependency ags_recall_child_added ags_recall_is_done ags_recall_get_by_effect ags_recall_find_recall_id_with_effect ags_recall_find_type ags_recall_find_template ags_recall_template_find_type ags_recall_template_find_all_type ags_recall_find_type_with_recycling_context ags_recall_find_recycling_context ags_recall_find_provider ags_recall_template_find_provider ags_recall_find_provider_with_recycling_context ags_recall_lock_port ags_recall_unlock_port ags_recall_new ags_recall_id_get_type ags_recall_id_set_sound_scope ags_recall_id_check_sound_scope ags_recall_id_test_staging_flags ags_recall_id_set_staging_flags ags_recall_id_unset_staging_flags ags_recall_id_check_staging_flags ags_recall_id_test_state_flags ags_recall_id_set_state_flags ags_recall_id_unset_state_flags ags_recall_id_check_state_flags ags_recall_id_find_recycling_context ags_recall_id_find_parent_recycling_context ags_recall_id_new ags_char_buffer_util_copy_s8_to_cbuffer ags_char_buffer_util_copy_s16_to_cbuffer ags_char_buffer_util_copy_s24_to_cbuffer ags_char_buffer_util_copy_s32_to_cbuffer ags_char_buffer_util_copy_s64_to_cbuffer ags_char_buffer_util_copy_float_to_cbuffer ags_char_buffer_util_copy_double_to_cbuffer ags_char_buffer_util_copy_cbuffer_to_s8 ags_char_buffer_util_copy_cbuffer_to_s16 ags_char_buffer_util_copy_cbuffer_to_s24 ags_char_buffer_util_copy_cbuffer_to_s32 ags_char_buffer_util_copy_cbuffer_to_s64 ags_char_buffer_util_copy_cbuffer_to_float ags_char_buffer_util_copy_cbuffer_to_double ags_char_buffer_util_copy_buffer_to_buffer ags_sequencer_util_get_obj_mutex ags_core_audio_devin_get_type ags_core_audio_devin_error_quark ags_core_audio_devin_test_flags ags_core_audio_devin_set_flags ags_core_audio_devin_unset_flags ags_core_audio_devin_switch_buffer_flag ags_core_audio_devin_adjust_delay_and_attack ags_core_audio_devin_realloc_buffer ags_core_audio_devin_new ags_core_audio_midiin_get_type ags_core_audio_midiin_error_quark ags_core_audio_midiin_test_flags ags_core_audio_midiin_set_flags ags_core_audio_midiin_unset_flags ags_core_audio_midiin_switch_buffer_flag ags_core_audio_midiin_new ags_core_audio_server_get_type ags_core_audio_server_test_flags ags_core_audio_server_set_flags ags_core_audio_server_unset_flags ags_core_audio_server_find_url ags_core_audio_server_find_client ags_core_audio_server_find_port ags_core_audio_server_add_client ags_core_audio_server_remove_client ags_core_audio_server_connect_client ags_core_audio_server_start_poll ags_core_audio_server_new ags_core_audio_client_get_type ags_core_audio_client_test_flags ags_core_audio_client_set_flags ags_core_audio_client_unset_flags ags_core_audio_client_find_uuid ags_core_audio_client_find ags_core_audio_client_open ags_core_audio_client_add_device ags_core_audio_client_remove_device ags_core_audio_client_add_port ags_core_audio_client_remove_port ags_core_audio_client_activate ags_core_audio_client_deactivate ags_core_audio_client_new ags_core_audio_devout_get_type ags_core_audio_devout_error_quark ags_core_audio_devout_test_flags ags_core_audio_devout_set_flags ags_core_audio_devout_unset_flags ags_core_audio_devout_switch_buffer_flag ags_core_audio_devout_adjust_delay_and_attack ags_core_audio_devout_realloc_buffer ags_core_audio_devout_new ags_core_audio_port_get_type ags_core_audio_port_test_flags ags_core_audio_port_set_flags ags_core_audio_port_unset_flags ags_core_audio_port_find ags_core_audio_port_register ags_core_audio_port_unregister ags_core_audio_port_set_format ags_core_audio_port_set_samplerate ags_core_audio_port_set_pcm_channels ags_core_audio_port_set_buffer_size ags_core_audio_port_set_cache_buffer_size ags_core_audio_port_get_latency ags_core_audio_port_new ags_osc_xmlrpc_message_get_type ags_osc_xmlrpc_message_new ags_osc_xmlrpc_server_get_type ags_osc_xmlrpc_server_add_websocket_handler ags_osc_xmlrpc_server_add_default_controller ags_osc_xmlrpc_server_new ags_osc_info_controller_get_type ags_osc_info_controller_get_info ags_osc_info_controller_new ags_osc_action_controller_get_type ags_osc_action_controller_run_action ags_osc_action_controller_new ags_osc_front_controller_get_type ags_osc_front_controller_test_flags ags_osc_front_controller_set_flags ags_osc_front_controller_unset_flags ags_osc_front_controller_add_message ags_osc_front_controller_remove_message ags_osc_front_controller_start_delegate ags_osc_front_controller_stop_delegate ags_osc_front_controller_do_request ags_osc_front_controller_new ags_osc_controller_get_type ags_osc_controller_new ags_osc_export_controller_get_type ags_osc_export_controller_do_export ags_osc_export_controller_new ags_osc_plugin_controller_get_type ags_osc_plugin_controller_do_request ags_osc_renew_controller_get_type ags_osc_renew_controller_set_data ags_osc_renew_controller_new ags_osc_node_controller_get_type ags_osc_node_controller_get_data ags_osc_node_controller_new ags_osc_config_controller_get_type ags_osc_config_controller_apply_config ags_osc_config_controller_new ags_osc_status_controller_get_type ags_osc_status_controller_get_status ags_osc_status_controller_new ags_osc_meter_controller_get_type ags_osc_meter_controller_test_flags ags_osc_meter_controller_set_flags ags_osc_meter_controller_unset_flags ags_osc_meter_controller_monitor_alloc ags_osc_meter_controller_monitor_free ags_osc_meter_controller_monitor_ref ags_osc_meter_controller_monitor_unref ags_osc_meter_controller_monitor_find_path ags_osc_meter_controller_monitor_find_port ags_osc_meter_controller_add_monitor ags_osc_meter_controller_remove_monitor ags_osc_meter_controller_contains_monitor ags_osc_meter_controller_start_monitor ags_osc_meter_controller_stop_monitor ags_osc_meter_controller_monitor_meter ags_osc_meter_controller_new ags_osc_message_get_type ags_osc_message_sort_func ags_osc_message_new ags_osc_client_get_type ags_osc_client_test_flags ags_osc_client_set_flags ags_osc_client_unset_flags ags_osc_client_resolve ags_osc_client_connect ags_osc_client_read_bytes ags_osc_client_write_bytes ags_osc_client_new ags_osc_util_type_tag_string_count_type ags_osc_util_meta_data ags_osc_util_mime_header ags_osc_util_slip_encode ags_osc_util_slip_decode ags_osc_util_timetag_now ags_osc_builder_get_type ags_osc_builder_packet_alloc ags_osc_builder_packet_free ags_osc_builder_bundle_alloc ags_osc_builder_bundle_free ags_osc_builder_message_alloc ags_osc_builder_message_free ags_osc_builder_osc_putc ags_osc_builder_on_error ags_osc_builder_append_packet ags_osc_builder_append_bundle ags_osc_builder_append_message ags_osc_builder_append_value ags_osc_builder_build ags_osc_builder_new ags_osc_response_get_type ags_osc_response_test_flags ags_osc_response_set_flags ags_osc_response_unset_flags ags_osc_response_new ags_osc_buffer_util_put_int32 ags_osc_buffer_util_get_int32 ags_osc_buffer_util_put_timetag ags_osc_buffer_util_get_timetag ags_osc_buffer_util_put_float ags_osc_buffer_util_get_float ags_osc_buffer_util_put_string ags_osc_buffer_util_get_string ags_osc_buffer_util_put_blob ags_osc_buffer_util_get_blob ags_osc_buffer_util_put_int64 ags_osc_buffer_util_get_int64 ags_osc_buffer_util_put_double ags_osc_buffer_util_get_double ags_osc_buffer_util_put_char ags_osc_buffer_util_get_char ags_osc_buffer_util_put_rgba ags_osc_buffer_util_get_rgba ags_osc_buffer_util_put_midi ags_osc_buffer_util_get_midi ags_osc_buffer_util_put_packet ags_osc_buffer_util_get_packet ags_osc_buffer_util_put_packets ags_osc_buffer_util_put_message ags_osc_buffer_util_get_message ags_osc_buffer_util_put_bundle ags_osc_buffer_util_get_bundle ags_osc_xmlrpc_controller_get_type ags_osc_xmlrpc_controller_test_flags ags_osc_xmlrpc_controller_set_flags ags_osc_xmlrpc_controller_unset_flags ags_osc_xmlrpc_controller_add_message ags_osc_xmlrpc_controller_remove_message ags_osc_xmlrpc_controller_start_delegate ags_osc_xmlrpc_controller_stop_delegate ags_osc_xmlrpc_controller_new ags_osc_server_get_type ags_osc_server_test_flags ags_osc_server_set_flags ags_osc_server_unset_flags ags_osc_server_add_connection ags_osc_server_remove_connection ags_osc_server_add_controller ags_osc_server_remove_controller ags_osc_server_add_default_controller ags_osc_server_start ags_osc_server_stop ags_osc_server_listen ags_osc_server_dispatch ags_osc_server_new ags_osc_parser_get_type ags_osc_parser_read_gint32 ags_osc_parser_read_gint64 ags_osc_parser_read_gfloat ags_osc_parser_read_gdouble ags_osc_parser_read_text ags_osc_parser_osc_getc ags_osc_parser_on_error ags_osc_parser_parse_full ags_osc_parser_parse_bytes ags_osc_parser_packet ags_osc_parser_bundle ags_osc_parser_message ags_osc_parser_value ags_osc_parser_new ags_osc_websocket_connection_get_type ags_osc_websocket_connection_find_resource_id ags_osc_websocket_connection_new ags_osc_connection_get_type ags_osc_connection_test_flags ags_osc_connection_set_flags ags_osc_connection_unset_flags ags_osc_connection_timeout_expired ags_osc_connection_read_bytes ags_osc_connection_write_response ags_osc_connection_close ags_osc_connection_new ags_recall_channel_get_type ags_recall_channel_get_destination ags_recall_channel_set_destination ags_recall_channel_get_source ags_recall_channel_set_source ags_recall_channel_find_channel ags_recall_channel_new ags_frequency_map_get_type ags_frequency_map_sort_func ags_frequency_map_test_flags ags_frequency_map_set_flags ags_frequency_map_unset_flags ags_frequency_map_process ags_frequency_map_factorize ags_frequency_map_compute_max_likelihood ags_frequency_map_new ags_note_get_type ags_note_get_obj_mutex ags_note_test_flags ags_note_set_flags ags_note_unset_flags ags_note_sort_func ags_note_get_is_minor ags_note_set_is_minor ags_note_get_sharp_flats ags_note_set_sharp_flats ags_note_get_x0 ags_note_set_x0 ags_note_get_x1 ags_note_set_x1 ags_note_get_y ags_note_set_y ags_note_get_rt_offset ags_note_set_rt_offset ags_note_get_rt_attack ags_note_set_rt_attack ags_note_get_attack ags_note_set_attack ags_note_get_sustain ags_note_set_sustain ags_note_get_decay ags_note_set_decay ags_note_get_release ags_note_set_release ags_note_get_ratio ags_note_set_ratio ags_note_find_prev ags_note_find_next ags_note_length_to_smf_delta_time ags_note_smf_delta_time_to_length ags_note_to_raw_midi ags_note_to_raw_midi_extended ags_note_to_seq_event ags_note_to_seq_event_extended ags_note_from_raw_midi ags_note_from_raw_midi_extended ags_note_from_seq_event ags_note_from_seq_event_extended ags_note_duplicate ags_note_new ags_note_new_with_offset ags_playback_domain_get_type ags_playback_domain_test_flags ags_playback_domain_set_flags ags_playback_domain_unset_flags ags_playback_domain_set_audio_thread ags_playback_domain_get_audio_thread ags_playback_domain_add_playback ags_playback_domain_remove_playback ags_playback_domain_new ags_ipatch_gig_reader_get_type ags_ipatch_gig_reader_test_flags ags_ipatch_gig_reader_set_flags ags_ipatch_gig_reader_unset_flags ags_ipatch_gig_reader_load ags_ipatch_gig_reader_select_instrument ags_ipatch_gig_reader_select_sample ags_ipatch_gig_reader_get_instrument_all ags_ipatch_gig_reader_get_sample_all ags_ipatch_gig_reader_get_sample_by_instrument_index ags_ipatch_gig_reader_new ags_audio_container_get_type ags_audio_container_test_flags ags_audio_container_set_flags ags_audio_container_unset_flags ags_audio_container_check_suffix ags_audio_container_find_sound_resource ags_audio_container_add_audio_signal ags_audio_container_remove_audio_signal ags_audio_container_add_wave ags_audio_container_remove_wave ags_audio_container_open ags_audio_container_open_from_data ags_audio_container_rw_open ags_audio_container_close ags_audio_container_read ags_audio_container_read_audio_signal ags_audio_container_read_wave ags_audio_container_seek ags_audio_container_write ags_audio_container_flush ags_audio_container_new ags_audio_file_link_get_type ags_audio_file_link_new ags_ipatch_sample_get_type ags_ipatch_sample_test_flags ags_ipatch_sample_set_flags ags_ipatch_sample_unset_flags ags_ipatch_sample_new ags_sfz_file_get_type ags_sfz_file_test_flags ags_sfz_file_set_flags ags_sfz_file_unset_flags ags_sfz_file_select_sample ags_sfz_file_get_range ags_sfz_file_check_suffix ags_sfz_file_parse ags_sfz_file_new ags_sfz_sample_get_type ags_sfz_sample_test_flags ags_sfz_sample_set_flags ags_sfz_sample_unset_flags ags_sfz_sample_new ags_sndfile_get_type ags_sndfile_test_flags ags_sndfile_set_flags ags_sndfile_unset_flags ags_sndfile_new ags_sound_resource_get_type ags_sound_resource_open ags_sound_resource_rw_open ags_sound_resource_load ags_sound_resource_info ags_sound_resource_set_presets ags_sound_resource_get_presets ags_sound_resource_read ags_sound_resource_write ags_sound_resource_flush ags_sound_resource_seek ags_sound_resource_read_audio_signal ags_sound_resource_read_wave ags_sound_resource_close ags_ipatch_get_type ags_ipatch_test_flags ags_ipatch_set_flags ags_ipatch_unset_flags ags_ipatch_check_suffix ags_ipatch_new ags_ipatch_sf2_reader_get_type ags_ipatch_sf2_reader_test_flags ags_ipatch_sf2_reader_set_flags ags_ipatch_sf2_reader_unset_flags ags_ipatch_sf2_reader_load ags_ipatch_sf2_reader_select_preset ags_ipatch_sf2_reader_select_instrument ags_ipatch_sf2_reader_select_sample ags_ipatch_sf2_reader_get_preset_all ags_ipatch_sf2_reader_get_instrument_all ags_ipatch_sf2_reader_get_sample_all ags_ipatch_sf2_reader_get_instrument_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index ags_ipatch_sf2_reader_new ags_sfz_region_get_type ags_sfz_region_test_flags ags_sfz_region_set_flags ags_sfz_region_unset_flags ags_sfz_region_insert_control ags_sfz_region_lookup_control ags_sfz_region_new ags_audio_file_get_type ags_audio_file_test_flags ags_audio_file_set_flags ags_audio_file_unset_flags ags_audio_file_check_suffix ags_audio_file_add_audio_signal ags_audio_file_remove_audio_signal ags_audio_file_add_wave ags_audio_file_remove_wave ags_audio_file_open ags_audio_file_open_from_data ags_audio_file_rw_open ags_audio_file_close ags_audio_file_read ags_audio_file_read_audio_signal ags_audio_file_read_wave ags_audio_file_seek ags_audio_file_write ags_audio_file_flush ags_audio_file_new ags_sfz_group_get_type ags_sfz_group_test_flags ags_sfz_group_set_flags ags_sfz_group_unset_flags ags_sfz_group_insert_control ags_sfz_group_lookup_control ags_sfz_group_new ags_sound_container_get_type ags_sound_container_open ags_sound_container_get_level_count ags_sound_container_get_nesting_level ags_sound_container_get_level_id ags_sound_container_get_level_index ags_sound_container_get_sublevel_name ags_sound_container_level_up ags_sound_container_select_level_by_id ags_sound_container_select_level_by_index ags_sound_container_get_resource_all ags_sound_container_get_resource_by_name ags_sound_container_get_resource_by_index ags_sound_container_get_resource_current ags_sound_container_close ags_ipatch_dls2_reader_get_type ags_ipatch_dls2_reader_test_flags ags_ipatch_dls2_reader_set_flags ags_ipatch_dls2_reader_unset_flags ags_ipatch_dls2_reader_load ags_ipatch_dls2_reader_select_instrument ags_ipatch_dls2_reader_select_sample ags_ipatch_dls2_reader_get_instrument_all ags_ipatch_dls2_reader_get_sample_all ags_ipatch_dls2_reader_get_sample_by_instrument_index ags_ipatch_dls2_reader_new ags_synth_generator_get_type ags_synth_generator_set_samplerate ags_synth_generator_set_buffer_size ags_synth_generator_set_format ags_synth_generator_compute ags_synth_generator_new gsequencer-3.1.3/libags_gui.sym.in0000644000175000017500000000606013616617253014060 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_dial_get_type ags_dial_value_changed ags_dial_set_value ags_dial_new ags_vlevel_box_get_type ags_vlevel_box_new ags_level_box_get_type ags_level_box_new ags_hlevel_box_get_type ags_hlevel_box_new ags_scale_box_get_type ags_scale_box_new ags_indicator_get_type ags_indicator_new ags_vled_array_get_type ags_vled_array_new ags_hindicator_get_type ags_hindicator_new ags_level_get_type ags_level_value_changed ags_level_new ags_ruler_get_type ags_ruler_new ags_hscale_box_get_type ags_hscale_box_new ags_vscale_box_get_type ags_vscale_box_new ags_scrolled_level_box_get_type ags_scrolled_level_box_new ags_scale_get_type ags_scale_value_changed ags_scale_new ags_scrolled_scale_box_get_type ags_scrolled_scale_box_new ags_expander_set_get_type ags_expander_set_child_alloc ags_expander_set_child_find ags_expander_set_set_flags ags_expander_set_add ags_expander_set_remove ags_expander_set_new ags_cartesian_get_type ags_plot_alloc ags_plot_free ags_cartesian_add_plot ags_cartesian_remove_plot ags_cartesian_linear_step_conversion_func ags_cartesian_linear_translate_func ags_cartesian_linear_x_small_scale_func ags_cartesian_linear_x_big_scale_func ags_cartesian_linear_y_small_scale_func ags_cartesian_linear_y_big_scale_func ags_cartesian_linear_x_label_func ags_cartesian_linear_y_label_func ags_cartesian_reallocate_label ags_cartesian_fill_label ags_cartesian_new ags_container_add_all ags_expander_get_type ags_expander_child_alloc ags_expander_child_find ags_expander_add ags_expander_remove ags_expander_new ags_vindicator_get_type ags_vindicator_new ags_led_array_get_type ags_led_array_set_led_count ags_led_array_unset_all ags_led_array_set_nth ags_led_array_new ags_led_get_type ags_led_set_active ags_led_unset_active ags_led_new ags_scrolled_piano_get_type ags_scrolled_piano_new ags_hled_array_get_type ags_hled_array_new ags_notebook_get_type ags_notebook_tab_alloc ags_notebook_tab_free ags_notebook_tab_set_data ags_notebook_tab_index ags_notebook_next_active_tab ags_notebook_add_tab ags_notebook_add_tab_with_label ags_notebook_insert_tab ags_notebook_insert_tab_with_label ags_notebook_remove_tab ags_notebook_remove_tab_with_data ags_notebook_new ags_piano_get_type ags_piano_key_code_to_note ags_piano_key_pressed ags_piano_key_released ags_piano_key_clicked ags_piano_get_active_key ags_piano_new ags_widget_cclosure_marshal_VOID__STRING_INT gsequencer-3.1.3/gtk-doc.make0000644000175000017500000002504013461636435013003 00000000000000# -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc if ENABLE_GTK_DOC all-local: all-gtk-doc endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_@AM_V@) GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_@AM_DEFAULT_V@) GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp #### scan #### GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_@AM_V@) GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_@AM_DEFAULT_V@) GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_@AM_V@) GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_@AM_DEFAULT_V@) GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### GTK_DOC_V_XML=$(GTK_DOC_V_XML_@AM_V@) GTK_DOC_V_XML_=$(GTK_DOC_V_XML_@AM_DEFAULT_V@) GTK_DOC_V_XML_0=@echo " DOC Building XML"; sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true $(DOC_MAIN_SGML_FILE): sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ #### html #### GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_@AM_V@) GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_@AM_DEFAULT_V@) GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_@AM_V@) GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_@AM_DEFAULT_V@) GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf html && mkdir html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ test -f $(abs_srcdir)/$$file && cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ test -f $(abs_builddir)/$$file && cp $(abs_builddir)/$$file $(abs_builddir)/html; \ test -f $$file && cp $$file $(abs_builddir)/html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp #### pdf #### GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_@AM_V@) GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_@AM_DEFAULT_V@) GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml html install-data-local: @installfiles=`echo $(builddir)/html/*`; \ if test "$$installfiles" = '$(builddir)/html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if HAVE_GTK_DOC dist-check-gtkdoc: docs else dist-check-gtkdoc: @echo "*** gtk-doc is needed to run 'make dist'. ***" @echo "*** gtk-doc was not found when 'configure' ran. ***" @echo "*** please install gtk-doc and rerun 'configure'. ***" @false endif dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/html @cp ./html/* $(distdir)/html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html .PHONY : dist-hook-local docs gsequencer-3.1.3/COPYING.docs0000644000175000017500000005466213461636431012606 00000000000000 GNU Free Documentation License Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. gsequencer-3.1.3/docs/0000755000175000017500000000000013622252264011614 500000000000000gsequencer-3.1.3/docs/oscBook.xml0000644000175000017500000000415513461636435013671 00000000000000 ]> Advanced Gtk+ Sequencer User's Handbook Copyright (C) &jkraehemann;. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Joël Krähemann gsequencer-3.1.3/docs/developersBook/0000755000175000017500000000000013622252264014577 500000000000000gsequencer-3.1.3/docs/developersBook/chap12.xml0000644000175000017500000000261313461636435016330 00000000000000 Putting all together So far we have seen the most important objects involved doing an audio processing tree. Now we want to do complete example putting all together. In this example we instantiate AgsAudioThread and AgsChannelThread to play a simple pattern. The sound we use is generated using a sinus wave. In order that the threads are used we provide an appropriate AgsConfig. Further we define an AgsPattern and add the needed recalls to do playback using the AgsRecallFactory. Simple pattern sequencer with master playback gsequencer-3.1.3/docs/developersBook/chap2.xml0000644000175000017500000000505413461636435016251 00000000000000 XML Input/Output Saving and restoring your files is done by using XML supporting XPath. The complete persistence layer is described by ags_file.dtd installed on your system. There various classes involved by doing XML IO. It does it in stages as following for reading: Parsing the XML tree and map nodes and objects. Resolving XPath expressions retrieve objects by their nodes. Do as needed callbacks of AgsFileLaunch to setup up the application. Writing files does ommit the last step. The current AgsConfig is going to be embedded in your file. So you can have per project configuration. Certain objects implement AgsPlugin interface to do an abstraction of reading and writing xmlNode. Writing XML files Writing files is pretty easy. You just have to instantiate AgsFile, set the application context, open it in read-write mode, call ags_file_write() and finally ags_file_close(). Writing XML Reading XML files Normally you instantiate a new application context to be used to load objects into. Create a file object by passing the application context and filename. Then open it and read the content. At the end you close the file descriptor. To use your application start the main loop. Reading XML gsequencer-3.1.3/docs/developersBook/chap4.xml0000644000175000017500000000406213461636435016251 00000000000000 The soundcard and sequencer interface With AgsSoundcard and AgsSequencer interface you can obtain information about output or input devices. Getting the next buffer for playback something can be achieved, too. As well reading MIDI data from current buffer is supported. Note these operations are performed all delayed in order to avoid concurrent memory access. Latency is at most one buffer time. Operations on buffers might be performed non-blocking so the thread returns earlier than expected. This has the advantage of controlling timings and let the thread continue to do more synchronization runs. Real-time behaviour is indicated as all pending sync operations were fulfilled as the next buffer is needed. Gathering PCM information of soundcard In this short example we just get some information out of AgsSoundcard by using void ags_soundcard_pcm_info(AgsSoundcard*, gchar*, guint*, guint*, guint*, guint*, guint*, guint*, GError*). It tells us the card identifier, minimum and maximum supported audio channels, samplerate and buffer size. PCM information from AgsSoundcard gsequencer-3.1.3/docs/developersBook/chap5.xml0000644000175000017500000002276613553424517016263 00000000000000 AgsAudio a container of AgsChannel AgsAudio contains a pointer to your notation and automation data. It has its own recall context, AgsRecallAudio. It organizes your recycling contices and thus having an associated AgsRecallID for running contices. Further AgsAudio is your topmost nesting level of AgsAudioSignal. You might traverse the layers in following order: AgsAudio AgsChannel AgsRecycling AgsAudioSignal AgsAudioSignal keeps your audio data as a GList of buffers. AgsRecycling is your nested tree to AgsChannel, giving you the opportunity to emit ::add_audio_signal or ::remove_audio_signal by producer and to have many consumers. AgsChannel is your opposite to an audio channel representing a single line. AgsAudio keeps track of all of them. You might want to add your audio object to an AgsSoundcard. You may resize the count of pads or audio channels with void ags_audio_set_pads(AgsAudio*, GType, guint, guint) and void ags_audio_set_audio_channels(AgsAudio*, guint, guint). Like in the following example the channels are adjusted and notation is added. Using AgsAudio AgsNotation and AgsNote AgsAudio provides many AgsNotation objects for one single audio channel. They all have a different :timestamp property. Usually a new AgsNotation object is introduced as AGS_NOTATION_DEFAULT_OFFSET is exceeded. So AgsNotation can hold at most 1024 x-positions of AgsNote. You might want to query a GList of AgsNotation by the matching AgsTimestamp using AGS_TIMESTAMP_OFFSET. void ags_notation_find_near_timestamp(GList*, guint, AgsTimestamp*) The notation object stores your notes as a GList. You can add or remove a note by calling appropriate function: void ags_notation_add_note(AgsNotation*, AgsNote*, gboolean) gboolean ags_notation_remove_note_at_position(AgsNotation, guint, guint) The notation object supports selection of notes. There are functions available to select a single point or a region of the notation. You may find specific notes by calling: AgsNote* ags_notation_find_point(AgsNotation*, guint, guint, gboolean) GList* ags_notation_find_region(AgsNotation*, guint, guint, guint, guint, gboolean) To copy & paste notes you might want to select a region first. Then copy the selection and insert it using new x_offset later. Using AgsNotation Clipboard AgsAutomation and AgsAcceleration The automation objects stores your accelerations as a GList. There are analogous to notation functions to add or remove accelerations. void ags_automation_add_acceleration(AgsAutomation*, AgsAcceleration*, gboolean) gboolean ags_automation_remove_acceleration_at_position(AgsAutomation*, guint, gdouble) The automation object provides functions to lookup a specific point or region, too. AgsAcceleration* ags_automation_find_point(AgsAutomation*, guint, gdouble, gboolean) GList* ags_automation_find_region(AgsAutomation*, guint, gdouble, guint, gdouble, gboolean) AgsWave and AgsBuffer The wave objects stores your buffers as a GList. There are analogous to notation functions to add or remove buffers. void ags_wave_add_buffer(AgsWave*, AgsBuffer*, gboolean) gboolean ags_wave_remove_buffer(AgsWave*, AgsBuffer*, gboolean) AgsRecallID and AgsRecyclingContext As mentioned previously in this chapter AgsAudio organizes your recall ids and recycling contices. The following functions are here to add and remove them. void ags_audio_add_recall_id(AgsAudio*, GObject*) void ags_audio_remove_recall_id(AgsAudio*, GObject*) void ags_audio_add_recycling_context(AgsAudio*, GObject*) void ags_audio_remove_recycling_context(AgsAudio*, GObject*) Dealing with recalls Since AgsAudio is your entry point to do sound processing there are some useful functions to set it up, but later on them. Instances of AgsRecallAudio base object may be added or removed with void ags_audio_add_recall(AgsAudio*, GObject*, gboolean) and void ags_audio_remove_recall(AgsAudio*, GObject*, gboolean). All audio processing is performed by one single function. Wheter you want to initialize, run or cancel playback. This is all done by void ags_channel_recursive_run_stage(AgsChannel*, gint, guint). The following signals are triggered during playback ::play, ::tact and ::done - ::cancel and ::remove during termination. Open audio files There is a handy function called void ags_audio_open_files(AgsAudio*, GSList*, gboolean, gboolean) taking as parameter filenames as GSList, overwrite_channels and create_channels as boolean. Filenames is a single linked list of strings, overwrite_channels means use pre-allocated channels and create_channels to allow instantiate new channels. The boolean parameters can be combined as you want. Audio container The AgsAudioContainer object can open Soundfont2, Gig and DLS2 files by using libinstpatch. The AgsAudioContainer:sound-container field implements AgsSoundContainer and provides you many functions to dealing with container formats. There are convenient functions to obtain a GObject subtype implementing AgsSoundResource: GList* ags_sound_container_get_resource_all() GList* ags_sound_container_get_resource_by_name() GList* ags_sound_container_get_resource_by_index() GList* ags_sound_container_get_resource_current() Audio file The AgsAudioFile object can open FLAC, WAV, AIFF and OGG using libsndfile. The AgsAudioFile:sound-resource field implements AgsSoundResource and provides you many functions to dealing with audio file formats. void ags_sound_resource_info() void ags_sound_resource_set_presets() void ags_sound_resource_get_presets() guint ags_sound_resource_read() void ags_sound_resource_write() void ags_sound_resource_flush() void ags_sound_resource_seek() gsequencer-3.1.3/docs/developersBook/chap11.xml0000644000175000017500000000270313461636435016327 00000000000000 Thread-safe audio ports The AgsPort object provides you a well defined API to safe read or write data to the AgsPort. Its access is protected by mutices. All actions on ports shall happen through ::safe-read, ::safe-write, ::safe-get-property or ::safe-set-property. AgsPort can contain various data types. But of only one type at the time. Automation happens by adjusting ports and perhaps even applying an AgsConversion. Further it contains some meta-information about plugin name and port specifier. Get and set values You can achieve this by using GValue like: gsequencer-3.1.3/docs/developersBook/chap6.xml0000644000175000017500000001634313461636435016260 00000000000000 Your tree linked with AgsChannel AgsChannel forms your audio processing tree and contains recalls, too. You might want to iterate the channels of your audio object or just call one of these functions: AgsChannel* ags_channel_first(AgsChannel*) AgsChannel* ags_channel_last(AgsChannel*) AgsChannel* ags_channel_nth(AgsChannel*, guint) AgsChannel* ags_channel_pad_first(AgsChannel*) AgsChannel* ags_channel_pad_last(AgsChannel*) AgsChannel* ags_channel_pad_nth(AgsChannel*, guint) As you see there is a grained access to channels. You can lookup channels from with the same audio channel with the functions containing pad in its name. An other exciting feature is finding channels having an assigned recycling. These functions operate on the very same audio channel. AgsChannel* ags_channel_first_with_recycling(AgsChannel*) AgsChannel* ags_channel_last_with_recycling(AgsChannel*) AgsChannel* ags_channel_prev_with_recycling(AgsChannel*) AgsChannel* ags_channel_next_with_recycling(AgsChannel*) The pattern There can AgsPattern being added to a channel by void ags_channel_add_pattern(AgsChannel*, GObject*). Later if not used anymore likewise call void ags_channel_remove_pattern(AgsChannel*, GObject*). Adding AgsPattern Linking overview In this section you get some knowledge about AgsChannel internals. Here you get an overview of the audio layer. All code related to it is located in subdirectory <ags/audio>. Linking AgsChannel is a quiet complex thing but If you wish to do so you can just call void ags_channel_set_link(AgsChannel*, AgsChannel*, GError**) and this will the especially covered here. AgsAudio, AgsChannel and AgsRecycling are involved in linking. When talking about linking we should view AgsChannel objects as networked and therefore exists an additional nested network of AgsRecycling objects. The AgsAudio object gives clarification about how AgsChannel has to be accessed either synchronously or asynchronously. Further it tells us whether AgsOutput or AgsInput has a new audio stream which causes in conjunction a dedicated AgsRecycling associated with the appropriate AgsChannel. AGS network layer table object flags Audio#0 AGS_AUDIO_SYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING Audio#1 AGS_AUDIO_ASYNC Audio#2 AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING Audio#3 AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING Audio#4 AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING
green: Bidirectional linked AgsChannel to an other AgsChannel. Generally you link an AgsOutput to an AgsInput. red: Bidirectional linked AgsRecycling to an other AgsRecycling on the same level. They are linked across AgsAudio objects. Same level means the linked AgsRecycling are all child nodes of a parent AgsRecycling. yellow: Unidirectional linked AgsRecycling to an AgsChannel. First AgsRecycling of an AgsOutput and last AgsRecycling of an (other) AgsOutput are linked to an AgsChannel.
Limitations You may not create any kind of loops. You may not set AGS_AUDIO_INPUT_HAS_RECYCLING without setting AGS_AUDIO_OUTPUT_HAS_RECYCLING flag. Hands-On There may be two ways how you can link AgsChannel objects. Prerequisites Assumed you know really what you do, you may be interested in following code. Thread-Unsafe way But generally you wish to create an AgsTask object and let it to link the AgsChannel for you. Multithread-Safe way
gsequencer-3.1.3/docs/developersBook/chap9.xml0000644000175000017500000002076213502733604016253 00000000000000 Effects You may directly inherit by <ags/audio/ags_recall.h> to do some wicked stuff. But generally you should inherit by these subclasses of AgsRecall: <ags/audio/ags_recall_audio.h> <ags/audio/ags_recall_audio_run.h> <ags/audio/ags_recall_channel.h> <ags/audio/ags_recall_channel_run.h> <ags/audio/ags_recall_recycling.h> <ags/audio/ags_recall_audio_signal.h> You probably wish to have different context for fields of an effect, that's what these objects take on. But before we cover them in detail, we take a look at the lifecycle an effect must accomplish. Play/recall context Don't mix this context up with static/runtime context we talked before. The AgsRecall may have two faces or may be just one for play context. The play context will be called in case the higher level of AgsRecycling will output to a device e.g. the soundcard and no further processing will be done. The recall context means that the AgsRecall will pass one or more cycles of copying or sequencing. This design is intended to make ags as modular and reusable over different use cases as possible. Practically it should be possible to chain up several sequencers. Hands-On instantiating an effect After you got an overview of the basic lifecycle of an effect it's time to create an effect. In this guide we will cover instatiating an effect by using the echo effect. In the following chapter we'll take a look inside the echo effect. AgsRecallContainer AgsRecallContainer isn't a recall itself but you can use it to retrieve a different context. Creating AgsRecallContainer AgsRecallAudio context This is a context you want to use for fields applicable to the entire AgsAudio object. Creating AgsEchoAudio AgsRecallChannel context This context you can use for fields applicable to the AgsChannel you want to modify. Creating AgsEchoChannel AgsRecallAudioRun context The AgsRecallAudioRun class will be duplicated for a parental running AgsChannel. There may be several AgsChannel objects as parental owning a run. Creating AgsEchoAudioRun AgsRecallChannelRun context The AgsRecallChannelRun behaves like an AgsRecallAudioRun but is designated to an AgsChannel object. Creating AgsEchoChannelRun The basic lifecycle of an effect In this section I'll introduce the keyword run which can be understood as a playing instance. But I rather talk about run because it's not guaranted that the recall outputs directly to a device. AgsRecall life-cycle The implemented effect as a subclass of AgsRecall resides as template on the appropriate AgsAudio or AgsChannel. When recycling changes on input, new AgsRecallRecycling will be added. This class function may be of relevancy: channel_class->recycling_changed As a new run occures the AgsRecallAudioRun and AgsRecallChannelRun will be duplicated, dependencies resolved, state initialized and enter the play loop hierarchy. These class functions will be called on the recall: channel_class->duplicate This function will be called on the template object to instantiate the the object which will pass further processing. Further processing: recall_class->resolve_dependency The recall may want to depend on a other recall (eg. a counter) and may ignore following calls while rather do processing on an event of the dependency. recall_class->run_init_pre, recall_class->run_init_inter & recall_class->run_init_post Will be called only once for the run reffering to dedicated AgsRecallID. recall_class->run_pre, recall_class->run_inter & recall_class->run_post Will be called for each cycle of a run reffering to AgsRecallID. There may be more than one AgsRecallID for a template i.e. there can exist more than one run at the very same time. As soon as an add_audio_signal event will be emitted on an AgsRecycling, the AgsRecallAudioSignal subclass will be instantiated which performs audio stream manipulation. These class functions will be called on the recall: recall_class->run_init_pre, recall_class->run_init_inter & recall_class->run_init_post recall_class->automate, recall_class->feed_input_queue, recall_class->run_pre, recall_class->run_inter, recall_class->run_post & recall_class->feed_output_queue When you're done with processing call: recall_class->done A closer look at effects As mentioned before audio processing will be done within an AgsRecallAudioSignal subclass. gsequencer-3.1.3/docs/developersBook/chap1.xml0000644000175000017500000001560213521306105016231 00000000000000 ]> The application context Making Advanced Gtk+ Sequencer objects reachable from different contices was mandatory as introducing AgsApplicationContext. Imagine you are within a GUI callback and want to lookup a soundcard or sequencer the application context shall provide this functioanlity and provide access to its objects through a well defined interface. As doing it with interfaces you are not limited to one specific implementation rather having the option to choose the appropriate one implementing the interfaces. There are different contices available e.g. AgsThreadApplicationContext providing its functionality by AgsConcurrencyProvider, AgsAudioApplicationContext giving you the wished objects by implementing AgsConcurrencyProvider and AgsSoundProvider. For example the code below should each giving you the same meaning object but using different contices. Implementations and their interfaces Creating a AgsThreadApplicationContext and then get the task thread by calling AgsThread* ags_concurrency_provider_get_task_thread(AgsConcurrencyProvider*). Since the AgsConcurrency interface is implemented by the context, we retrieve the task thread. The AgsTaskThread gives you a thread safe signal. It is used to launch AgsTask objects to do thread safe operations but later on this. Thread application context The AgsAudioApplicationContext inherites from AgsApplicationContext and implements the AgsConcurrency interface, too. So you can retrieve the task thread the same way. But the context implements one more, the AgsSoundProvider interface. Giving you objects related to threading and audio processing. Audio application context The main loop property AgsApplicationContext:main-loop does usually point to an AgsThread implementing AgsMainLoop interface. &libagsthreadso; provides you the AgsGenericMainLoop object or if you intend to use &libagsaudioso;, this property shall point to AgsAudioLoop. The config property The AgsApplicationContext base class provides you an AgsConfig instance. It might load a default configuration or from current users home directory. The config should be obtained as property using void g_object_get(gpointer, gchar*, ...) or similar. AgsConfig stores its properties as key value pairs within appropriate group. In order to get the config instance, load default configuration and get the threading model do the following. Get config value The file property You might want to set an AgsFile or AgsSimpleFile instance within your application context. This in view of having your application persisted. The application context :file property The application mutex As version 2.0.x the application mutex was superseeded by the class mutices and a common field :obj-mutex used by various types. The AgsMutexManager is still around but with less importance. Program start and termination The application context provides signals to make your application ready to run. You basically implement AgsApplicationContext::prepare, AgsApplicationContext::setup and AgsApplicationContext::register-types. It is upto you how the application shall behave. AgsApplicationContext::quit signal terminates your application. Feel free to provide your own implementation. Abstract data connection AgsDataConnectionManager and AgsConnection are removed in 2.0.x. The object was somehow overhelming because you can have properties. The AgsConnectable interface provides 2 new functions: void ags_connectable_connect_connection(AgsConnectable*, GObject*) and void ags_connectable_disconnect_connection(AgsConnectable*, GObject*). Dependencies not know an instantiation time can be later connected. Common interfaces Use AgsConnectable if you intend to listen to a particular event. If you want to connect an event of an object known during instantiation time use ::connect and ::disconnect. Assumed the object needs to be resolved, you can ::connect-connection ::disconnect-connection, later. AgsPlugin interface provides persistence to a well known abstract base type. Since it has various implementations, this interface provides void ags_plugin_read(AgsFile*, xmlNode*, AgsPlugin*) and xmlNode* ags_plugin_write(AgsFile*, xmlNode*, AgsPlugin*) Likewise there are the interfaces intended to use with sound related objects AgsSoundcard, AgsSequencer, AgsMutable and AgsSeekable. gsequencer-3.1.3/docs/developersBook/chap3.xml0000644000175000017500000002732613521306105016241 00000000000000 ]> Multi-/Super-threaded tree Advanced Gtk+ Sequencer comes with an AgsThread object. It is organized as a tree structure. The API provides many functions to work with it. These threads do the ::clock event where all threads synchronize. The AgsTaskThread runs synchronized as well but is going to be waited after syncing to run all tasks. The AgsTask signal ::launch runs asynchronous exclusively. So the task thread implements AgsAsyncQueue interface. Every thread tree shall have at toplevel a thread implementing AgsMainLoop interface. There is an object call AgsThreadPool serving prelaunched threads. It returns on pull AgsReturnableThread instances. They can be used with a callback ::safe-run. There is a interface to implement by your application context. Thus the AgsConcurrencyProvider interface is used. It has some common get/set functions to do basic multi-threaded work by well defined objects. The main loop interface AgsMainLoop should be implemented by toplevel threads. Within a thread tree this is the topmost element. It has various get and set methods you would expect. ::set_tic and ::get_tic is used for synchronization purpose as well ::set_last_sync and ::get_last_sync. ::get_async_queue should return an instance implementing AgsAsyncQueue eg. AgsTaskThread. ::get_application_context returns the AgsApplicationContext. To control the AgsThread::clock signal AgsMainLoop's methods are going to be invoked. The involved functions are: void ags_main_loop_set_tic(AgsMainLoop*, guint) guint ags_main_loop_get_tic(AgsMainLoop*) void ags_main_loop_set_last_sync(AgsMainLoop*, guint) guint ags_main_loop_get_last_sync(AgsMainLoop*) The main loop specifies some signals like ::interrupt, ::monitor and ::change-frequency. They are all related to realtime behavior of an application. Assumed you have a thread you want to run within the thread tree, but it is not mandatory to run it. With these functions you can determine if you shall pause your thread during ::interrupt signal. How many time you are allowed to consume or running at all, can be concluded by using ::monitor. In order to get notified about modified refreshing rate of your thread, listen to ::change-frequency signal. The interface provides some other function pointers. If you want to provide AgsTaskThread to your application, use void ags_main_loop_set_async_queue(AgsMainLoop*, GObject*) and GObject* ags_main_loop_get_async_queue(AgsMainLoop*). As it shall be implemented by AGS_TYPE_THREAD subtypes, this parent object provides a mutex to properly lock the object. You should obtain the pthread_mutex_t pointer by accessing its field: Threads in general Within thread tree context you have to take care not to hang it up with a dead-lock. Usually you have to use the :start_queue to start threads. Protect it with :start_mutex. Alternatively you may want to use void ags_thread_start(AgsThread*). The :start_cond notifies about thread being started. The following example creates a thread and does add an other thread to :start_queue. This causes it to be started as well. Note you want to access :start_queue using atomic operations since it is volatile. But there is a convience function which does it for you. Starting threads There many other functions not covered like mutex wrappers ags_thread_lock() and ags_thread_unlock(). As doing a closer look to the API there are functions to lock different parts of the tree. But all these functions should be carefully used, since you might run into a dead-lock. ags_thread_resume() and ags_suspend() wakes-up or suspends threads. But they both should be used within same tic of ::clock. ags_thread_timelock() is used for suspending computing expensive threads and passing ::clock within its run. To find a specific thread type use ags_thread_find(). You can use ags_thread_self() to retrieve your own running thread in case your using Advanced Gtk+ Sequencer thread wrapper. Pulling threads of thread pool AgsThreadPool serves you instantiated and running threads. To pull an AgsReturnableThread issue ags_thread_pool_pull(). The following example does instantiate a thread pool and starts it. After, it pulls two threads and the callbacks are invoked. Pulling threads of thread-pool Worker-threads to do tic-less parallelism Worker threads are used to perform heavy load tasks that run completely asynchronous. This means they don't do any sync with the tree. You start worker threads like any other thread by calling void ags_thread_start(AgsThread*) or void ags_thread_stop(AgsThread*) to stop it. The AgsWorkerThread overrides ::start of AgsThread class and won't do any synchronization. The worker implementation is responsible to delay computation by calling usleep() or nanosleep(). You can either connect to the ::do-poll signal or inherit of the AgsWorkerThread object. This requires to override ::do-poll. Asynchronously destroy objects AgsDestroyWorker is intended to unref or free objects asynchrously. Note the use of this worker for one certain instance, requires it to do it throughout with the worker for all unref calls. Else you would probably end in a data-race ending in accessing a freed instance. This can especially happen as using g_object_run_dispose(). The destroy function takes exactly one parameter like g_free() or g_object_unref(). To add an entry call ags_destroy_worker_add(). The first parameter is the worker, second the pointer to free/unref and third the destroy function. Poll for file descriptors The AgsPollingThread polls your file descriptors. Since it is derived by AgsThread it runs tic based like other threads. Call ags_polling_thread_add_poll_fd() and pass an AgsPollFd to it, in order to poll a resource. Note the resource won't be polled unless the thread was started by calling void ags_thread_start(AgsThread*). The ::dispatch signal notifies about a ressource to be ready for Input/Output. To stop poll a resource either remove the poll file descriptor by calling void ags_polling_thread_remove_poll_fd(AgsPollingThread*, GObject*). Or just stop the polling thread by ags_thread_stop() so any resource won't be polled. Launching tasks It's for thread-safety for sure to run tasks asynchronously exclusive. This means what ever you do it's safe exceptional in view of third-party libraries that might have their own threads. To do your own task you should inherit AgsTask base object and implement ::launch. This signal is invoked after syncing the thread tree. You can use either ags_task_thread_append_task() or ags_task_thread_append_tasks() to add one respectively a GList of tasks. The task shall report failures by calling ::failure signal. Mutex and condition manager The AgsMutexManager and AgsConditionManager are singletons. You might want to retrieve an instance by calling ags_mutex_manager_get_instance() or ags_condition_manager_get_instance(). To use the managers you call during instatiation of your object ags_mutex_manager_insert() by providing the lock object and the initialized mutex. There is the ags_condition_manager_insert() function available for conditions. During finalization of your object you should remove the mutex of the manager. This is done by calling ags_mutex_manager_remove() or ags_condition_manager_remove() for conditions. The benefit of providing these managers is, it can be used by interface implementations. For instance AgsSoundcard derived objects can be reused by a generic procedure. Guaranteeing that no concurrent access is performed by locking the mutex. Async message delivery AgsMessageDelivery is a singleton. In order to get the instance of it call AgsMessageDelivery* ags_message_delivery_get_instance(). The library routines only provide messages until you have added an AgsMessageQueue with the appropriate namespace. libags - namespace used by &libagsso;, &libagsthreadso; and &libagsserverso; libags-audio - namespace used by &libagsaudioso; As you usually have one object or widget mapped to a specific object, you can poll the queue by guint g_timeout_add(guint, GSourceFunc, gpointer). Then forward the event as you like. GSequencer does look for matching messages by sender using following GList* ags_message_queue_find_sender(AgsMessageQueue*, GObject*). This not at least because the recipient is most of the time not defined. gsequencer-3.1.3/docs/developersBook/appb.xml0000644000175000017500000000636513461636435016204 00000000000000 Related projects Project Websites Gtk+ Gimp Tool Kit - http://www.gtk.org Libinstpatch Instrument patch library - http://www.swamiproject.org Libxml2 XML library - http://www.xmlsoft.org Libsndfile Sound file library - http://www.mega-nerd.com FFTW3 Fastest Fourier Transform of the West - http://www.fftw.org Alsa Advanced Linux Sound Architecture - http://www.alsa-project.org JACK Jack audio connection kit - http://www.jackaudio.org LADSPA Linux Audio Developer's Simple Plugin API - http://www.ladspa.org DSSI Disposable Soft Synth Interface - http://dssi.sourceforge.net Lv2 LADSPA version 2 - http://www.lv2plug.in gsequencer-3.1.3/docs/developersBook/chap8.xml0000644000175000017500000000364213461636435016260 00000000000000 Your audio data in AgsAudioSignal AgsAudioSignal is the object orientated representation of your audio data. It has a GList with data pointer to audio buffers. There convenience functions to resize the stream. void ags_audio_signal_stream_resize(AgsAudioSignal*, guint) void ags_audio_signal_stream_safe_resize(AgsAudioSignal*, guint) void ags_audio_signal_add_stream(AgsAudioSignal*) There exists a safe resize function because the audio signal might be in use and it doesn't allow to shrink beyond used entries. This could be fatal if an effect processor is using the stream and it gets freed as it uses it. void ags_audio_signal_duplicate_stream(AgsAudioSignal*, AgsAudioSignal*) can be used to blue-print one audio signals buffer to an other audio signal. Or you might call AgsAudioSignal* ags_audio_signal_get_template(GList*) from your AgsRecycling internal GList of audio signals to get the template. gsequencer-3.1.3/docs/developersBook/chap10.xml0000644000175000017500000001264413461636435016333 00000000000000 AgsRecall implementations There a well know set of recalls described here. Additionally you might want to take advantage of recalls interfacing plugin APIs like LADSPA, DSSI or LV2. You can instantiate them simply with GList* ags_recall_factory_create(AgsAudio*, AgsRecallContainer*, AgsRecallContainer, gchar*, guint, guint, guint, guint, guint, guint) ags-delay The delay until next tic, it loops endless. ags-count-beats Keep track of what beat you are playing by counting them, may loop endless. ags-stream Streams your audio data of AgsAudioSignal. ags-loop Allocate audio signals within a loop. Used to produce destination buffers. Listens to AgsCountBeatsAudioRun::sequencer_loop ags-play-master Master playback to soundcard, stops if no more producers streaming. ags-copy Copy audio data from one audio signal to an other. ags-buffer Buffer audio data, produces new destination as on source occurs AgsAudioSignal::add_audio_signal. ags-play Simple playback. ags-copy-pattern Copy audio data based on boolean patterns. ags-play-notation Copy audio data based on notation. ags-peak Calculate peak of audio data. ags-mute Mutes your audio data. ags-volume Adjust volume of audio data. ags-analyse Get frequency hints using FFTW3. ags-eq10 Adjust 10 band equalizer. ags-ladspa Interface LADSPA plugins. ags-dssi Interface DSSI plugins. ags-lv2 Interface LV2 plugins. ags-route-dssi Route notation into DSSI plugin. ags-route-lv2 Route notation into LV2 plugin. ags-record-midi Record MIDI data and convert to notation. ags-play-wave Play wave objects. ags-capture-wave Capture audio date and store it in wave objects. gsequencer-3.1.3/docs/developersBook/chap7.xml0000644000175000017500000000534713461636435016263 00000000000000 The recycling tree AgsRecycling has a strong relation to AgsChannel although not every channel might have its very own recycling. Rather having a reference to a start and end region of an inter-connnected AgsRecycling. It may create or destroy audio signals event based. Inter-connected gets its meaning as void ags_channel_set_recycling(AgsChannel*, AgsRecycling*, AgsRecycling*, gboolean, gboolean) invoked by void ags_channel_set_link(AgsChannel*, AgsChannel*, GError**) connects AgsRecycling:next and AgsRecycling:prev together from different channels. Providing you the AgsRecyclingContext. A recycling context has generally one parent and many children from different channels. AgsRecallID points to one recycling context in order to make decisions of what level you are running in. Theoretically super-threaded tree can run upto the recycling context level. Note, recyclings have they own recall base object AgsRecallRecycling. Usually, you do void ags_recall_add_child(AgsRecall*, AgsRecall*) to instances inherit of AgsRecallChannelRun. Add and remove audio signal The two signals ::add_audio_signal and ::remove_audio_signal should be invoked as adding or removing AgsAudioSignal to an AgsRecycling. Recalls act as producer or consumer of AgsAudioSignal. They do basically play notation or process your effects. Its are located in AgsAudio or AgsChannel. There is generally a need for providing a template audio signal within your recycling. As this does this example. This reduces the overhead of reading files for every playing during a button click, notation or pattern. AgsRecycling and AgsAudioSignal gsequencer-3.1.3/docs/developersBook/preface.xml0000644000175000017500000000325013461636435016655 00000000000000 Foreword I began to code with C in spring 2002 and hadn't much programming skills, yet. You may ask me why the C programming language? Well, my friend who was already a convient free software user and hacker recomended me it. He told me that C is a standard on Unix like operating systems so it would be a good choice. After started with language basics and several discussions with my friend about pointers he advised me of Gtk+. While I was doing my first steps in GUI programming with C, I was sure to extensively use it and became a persuaded free software user and programmer. A year later I really understood the object orientated matter of GObject and how to write objects and widgets myself. C wasn't like Java where you just couldn't implement no classes just everything was a class or at least a method. First output with AGS happend via Open Sound System device drivers but the entire application lacked of a thread safe concept. But for now you may write tasks. Be part of the fun. gsequencer-3.1.3/docs/oscBook/0000755000175000017500000000000013622252264013213 500000000000000gsequencer-3.1.3/docs/oscBook/chap2.xml0000644000175000017500000000322213461636435014660 00000000000000 ]> The info controller The /info context path shows you version information. The type tag of the request should be ommited. Type tag and parameters The type tag of the response looks like following: ,ssss.
Type tag description
index type indentifier value
#0 s &oscversion;
#1 s osc-server
#2 s &ags;
#3 s &agsversion;
gsequencer-3.1.3/docs/oscBook/chap4.xml0000644000175000017500000000251313461636435014664 00000000000000 ]> The config controller The /config context path allows you to apply a new configuration. The configuration is applied silently. Type tag and parameters The type tag of the request looks like following: ,s.
Type tag description
index type indentifier value
#0 s Your new configuration to apply
gsequencer-3.1.3/docs/oscBook/chap5.xml0000644000175000017500000000365013461636435014670 00000000000000 ]> The action controller The /action context path runs the specified task. The action is run silently. Type tag and parameters The type tag of the request looks like following: ,ss.
Type tag description
index type indentifier value
#0 s Path is either /AgsSoundProvider/AgsSoundcard, /AgsSoundProvider/AgsSequencer or /AgsSoundProvider/AgsAudio[[0-9]+|"[\w]+"]
#1 s Action is either start or stop
The path /AgsSoundProvider/AgsAudio[[0-9]+|"[\w]+"] is a valid audio node accessor. Allowed are indices or its property audio-name. Currently only one single audio object can be accessed, for example /AgsSoundProvider/AgsAudio[1] or /AgsSoundProvider/AgsAudio["drum"].
gsequencer-3.1.3/docs/oscBook/chap6.xml0000644000175000017500000000377313474540726014700 00000000000000 ]> The node controller The /node context path returns the value assigned to node. The response type tag matches the port value type held. Type tag and parameters The type tag of the request looks like following: ,s.
Type tag description
index type indentifier value
#0 s Path is any valid accessor for properties or port value.
The path supports indices, ranges, wildcard or some even names as accessors. This 2 examples shows you the access to an AgsAudio port and AgsChannel: /AgsSoundProvider/AgsAudio[0]/AgsMuteAudio[0]/AgsPort["./muted[0]"]:value /AgsSoundProvider/AgsAudio[0]/AgsInput[0]/AgsVolumeChannel[0]/AgsPort["./volume[0]"]:value The response contains as first argument of the type the tag the matching path. Followed by type or array of types requested. The requested value follows the path argument.
gsequencer-3.1.3/docs/oscBook/chap1.xml0000644000175000017500000000462713461636435014671 00000000000000 ]> The &ags; OSC server The OSC server implementation supports connections by UDP/TCP over IPv4 and IPv6. There are different server paths available. Each context path handled by its own OSC controller. Context paths The context path is the address pattern of your OSC message. Every OSC message passes the front controller. Then it is scheduled and delegated to the matching controller. The OSC timetag specifies at what time the message should be dispatched. The OSC timetag is taken from your OSC bundle. Addressing nodes can be done by using ranges or wildcard. The context path matches the first string of your type tag. The common prefix is /AgsSoundProvider for accessing the audio layer of GSequencer.
OSC server context paths
Context path description
/info Provides OSC server identifier
/status Retrieve OSC server status
/config Configure the GSequencer engine
/action Run tasks specified by action
/node Read values of nodes
/renew Modify values of nodes
/meter Continuing update meter values
gsequencer-3.1.3/docs/oscBook/chap3.xml0000644000175000017500000000271013461636435014662 00000000000000 ]> The status controller The /status context path shows you the server status. Pass an empty type tag to the request. Type tag and parameters The type tag of the response looks like following: ,s.
Type tag description
index type indentifier value
#0 s server up and running, server started or server stopped
gsequencer-3.1.3/docs/oscBook/appb.xml0000644000175000017500000000200313461636435014601 00000000000000 Related projects Project Websites Open Sound Control The Open Sound Control 1.0 Specification - http://opensoundcontrol.org/spec-1_0 gsequencer-3.1.3/docs/oscBook/chap8.xml0000644000175000017500000000310713461636435014670 00000000000000 ]> The meter controller The /meter context path returns continuing a value from the specified node. You can either turn monitoring on or off. Type tag and parameters The type tag of the request starts like following: ,s.
Type tag description
index type indentifier value
#0 s Path is any valid accessor for properties or port value.
#1 T or F T turns on monitoring of a port, F turns off.
The path supports indices, ranges, wildcard or some even names as accessors.
gsequencer-3.1.3/docs/oscBook/chap7.xml0000644000175000017500000000362513461636435014674 00000000000000 ]> The renew controller The /renew context path applies the provided value to the specified node. There is no response. Type tag and parameters The type tag of the request starts like following: ,s.
Type tag description
index type indentifier value
#0 s Path is any valid accessor for properties or port value.
#1 any valid value or array of values type One or more values to apply
Value specification
index type indentifier value
#0 - #n binary data The amount of data matches the type tag
The path supports indices, ranges, wildcard or some even names as accessors.
gsequencer-3.1.3/docs/listings/0000755000175000017500000000000013622252264013450 500000000000000gsequencer-3.1.3/docs/listings/pull_thread.c.in0000644000175000017500000000461713553424517016461 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include void thread_run_callback(AgsThread *thread, gpointer data); void thread_run_callback(AgsThread *thread, gpointer data) { g_message("%s", (gchar *) data); } int main(int argc, char **argv) { AgsThread *main_loop; AgsThread *thread_0, *thread_1; AgsThreadPool *thread_pool; AgsApplicationContext *application_context; application_context = ags_thread_application_context_new(); main_loop = ags_concurrency_provider_get_main_loop(AGS_CONCURRENCY_PROVIDER(application_context)); thread_pool = ags_concurrency_provider_get_thread_pool(AGS_CONCURRENCY_PROVIDER(application_context)); ags_thread_start(main_loop); ags_thread_pool_start(thread_pool); /* create thread 0 */ thread_0 = ags_thread_pool_pull(task_thread->thread_pool); pthread_mutex_lock(AGS_RETURNABLE_THREAD(thread_0)->reset_mutex); g_atomic_pointer_set(&(AGS_RETURNABLE_THREAD(thread_0)->safe_data), "thread 0"); ags_returnable_thread_connect_safe_run(AGS_RETURNABLE_THREAD(thread_0), ags_task_thread_append_task_queue); g_atomic_int_or(&(AGS_RETURNABLE_THREAD(thread_0)->flags), AGS_RETURNABLE_THREAD_IN_USE); pthread_mutex_unlock(AGS_RETURNABLE_THREAD(thread_0)->reset_mutex); /* create thread 1 */ thread_1 = ags_thread_pool_pull(task_thread->thread_pool); pthread_mutex_lock(AGS_RETURNABLE_THREAD(thread_1)->reset_mutex); g_atomic_pointer_set(&(AGS_RETURNABLE_THREAD(thread_1)->safe_data), "thread 1"); ags_returnable_thread_connect_safe_run(AGS_RETURNABLE_THREAD(thread_1), ags_task_thread_append_task_queue); g_atomic_int_or(&(AGS_RETURNABLE_THREAD(thread_1)->flags), AGS_RETURNABLE_THREAD_IN_USE); pthread_mutex_unlock(AGS_RETURNABLE_THREAD(thread_1)->reset_mutex); /* */ pthread_join(*(main_loop->thread)); return(0); } gsequencer-3.1.3/docs/listings/thread_application_context.c.in0000644000175000017500000000137313521306053021535 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsApplicationContext *application_context; AgsThread *task_thread; application_context = (AgsApplicationContext *) ags_thread_application_context_new(); task_thread = ags_concurrency_provider_get_task_thread(AGS_CONCURRENCY_PROVIDER(application_context)); gsequencer-3.1.3/docs/listings/effects_echo_channel_run.c.in0000644000175000017500000000205413553424517021140 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsEchoChannelRun *echo_channel_run; echo_channel_run = (AgsEchoChannelRun *) g_object_new(AGS_TYPE_ECHO_CHANNEL_RUN, "soundcard", soundcard, "channel", channel "recall-channel", echo_channel, "recall-container", echo_container, NULL); ags_recall_set_flags(echo_channel_run, AGS_RECALL_TEMPLATE); gsequencer-3.1.3/docs/listings/pcm_info.c.in0000644000175000017500000000240213521306105015721 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsApplicationContext *application_context; GObject *soundcard; GList *list; guint channels_min, channels_max; guint rate_min, rate_max; guint buffer_size_min, buffer_size_max; GError *error; application_context = ags_application_context_get_instance(); list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); if(list != NULL){ soundcard = G_OBJECT(list->data); error = NULL; ags_soundcard_pcm_info(AGS_SOUNDCARD(soundcard), &channels_min, &channels_max, &rate_min, &rate_max, &buffer_size_min, &buffer_size_max, &error); if(error != NULL){ g_warning("%s", error->msg); g_error_free(error); } } gsequencer-3.1.3/docs/listings/file_write.c.in0000644000175000017500000000201513521306105016260 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsApplicationContext *application_context; AgsFile *file; GError *error; static const gchar *filename = "my_file.xml"; application_context = ags_application_context_get_instance(); file = (AgsFile *) g_object_new(AGS_TYPE_FILE, "application-context", application_context, "filename", filename, NULL); error = NULL; ags_file_rw_open(file, TRUE, &error); ags_file_write(file); ags_file_close(file); gsequencer-3.1.3/docs/listings/add_pattern.c.in0000644000175000017500000000173513521306053016426 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsChannel *channel; AgsPattern *pattern; guint n_bank_0, n_bank_1; guint length; /* create channel */ channel = ags_channel_new(NULL); /* create pattern, set dimension and add it to channel */ n_bank_0 = 4; n_bank_1 = 12; length = 64; pattern = ags_pattern_new(); ags_pattern_set_dim(pattern, n_bank_0, n_bank_1, length); ags_channel_add_pattern(channel, pattern); gsequencer-3.1.3/docs/listings/effects_echo_audio_run.c.in0000644000175000017500000000174313553424517020635 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include echo_audio_run = (AgsEchoAudioRun *) g_object_new(AGS_TYPE_ECHO_AUDIO_RUN, "soundcard", soundcard, "audio", audio, "recall-audio", echo_audio, "recall-container", echo_container, NULL); ags_recall_set_flags(echo_audio_run, AGS_RECALL_TEMPLATE); gsequencer-3.1.3/docs/listings/effects_echo_channel.c.in0000644000175000017500000000230713553424517020255 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsEchoChannel *echo_channel; echo_channel = (AgsEchoChannel *) g_object_new(AGS_TYPE_ECHO_CHANNEL, "soundcard", soundcard, "channel", channel, "recall-container", echo_container, "delay", (devout->frequency * (60 / devout->bpm) / 4), "repeat", 3, "fade", -0.25, "dry", 0.5, NULL); ags_recall_set_flags(echo_channel, AGS_RECALL_TEMPLATE); gsequencer-3.1.3/docs/listings/effects_echo_audio.c.in0000644000175000017500000000161413553424517017746 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsEchoAudio *echo_audio; echo_audio = (AgsEchoAudio *) g_object_new(AGS_TYPE_ECHO_AUDIO, "soundcard", soundcard, "audio", audio, "recall-container", echo_container, NULL); ags_recall_set_flags(echo_audio, AGS_RECALL_TEMPLATE); gsequencer-3.1.3/docs/listings/start_thread.c.in0000644000175000017500000000202213521306105016611 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsThread *main_loop; AgsThread *thread; AgsApplicationContext *application_context; application_context = ags_application_context_get_instance(); main_loop = ags_generic_main_loop_new(application_context); g_object_set(application_context, "main-loop", main_loop, NULL); ags_thread_start(main_loop); thread = ags_thread_new(NULL); ags_thread_add_child_extended(main_loop, thread, TRUE, TRUE); ags_thread_add_start_queue(main_loop, thread); gsequencer-3.1.3/docs/listings/effects_recall_container.c.in0000644000175000017500000000166213521306053021143 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsAudio *audio; AgsChannel *channel; AgsRecallContainer *echo_container; GObject *soundcard; soundcard = ags_devout_new(NULL); audio = ags_audio_new(devout); /* create the container */ recall_container = (AgsRecallContainer *) g_object_new(AGS_TYPE_RECALL_CONTAINER, NULL); ags_audio_add_recall_container(audio, (GObject *) recall_container); gsequencer-3.1.3/docs/listings/notation_clipboard.c.in0000644000175000017500000000221113553424517020014 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsAudio *audio; AgsNotation *notation; AgsNote *note; xmlNode *clipboard; guint i; audio = ags_audio_new(); notation = ags_notation_new(audio, 0); ags_audio_add_notation(audio, notation); for(i = 0; i < 16; i++){ note = ags_note_new_with_offset(i * 4, (i * 4) + 1, 0); ags_notation_add_note(notation, note, FALSE); } /* select, copy & paste */ ags_notation_add_region_to_selection(notation, 0, 0, 64, 1, TRUE); clipboard = ags_notation_copy_selection(notation); ags_notation_insert_from_clipboard(notation, clipboard, TRUE, 64, FALSE, 0); gsequencer-3.1.3/docs/listings/port.c.in0000644000175000017500000000144013521306053015116 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsPort *port; GValue value = {0,}; /* create port */ port = ags_port_new(); /* initialize and set value */ g_value_init(&value, G_TYPE_FLOAT); g_value_set_float(&value, 0.0); /* perform thread-safe operation */ ags_port_safe_write(port, &value); gsequencer-3.1.3/docs/listings/linking_unsafe.c.in0000644000175000017500000000144613521306105017132 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ /* link master_audio's input with slave_audio's output */ ags_channel_set_link(ags_channel_nth(master_audio->input, 0), ags_channel_nth(slave_audio->output, 0), &error); ags_channel_set_link(ags_channel_nth(master_audio->input, 1), ags_channel_nth(slave_audio->output, 1), &error); gsequencer-3.1.3/docs/listings/thread_obj_mutex.c.in0000644000175000017500000000122413553424517017470 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsThread *thread; pthread_mutex_t *thread_mutex; thread = ags_thread_new(NULL); /* get object mutex */ thread_mutex = AGS_THREAD_GET_OBJ_MUTEX(thread); gsequencer-3.1.3/docs/listings/application_mutex.c.in0000644000175000017500000000135513553424517017677 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsApplicationContext *application_context; AgsThread *main_loop; application_context = ags_application_context_get_instance(); g_object_get(application_context, "main-loop", &main_loop, NULL); gsequencer-3.1.3/docs/listings/audio_application_context.c.in0000644000175000017500000000142713521306053021367 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsApplicationContext *application_context; AgsThread *task_thread; application_context = (AgsApplicationContext *) ags_audio_application_context_new(); task_thread = ags_concurrency_provider_get_task_thread(AGS_CONCURRENCY_PROVIDER(application_context)); gsequencer-3.1.3/docs/listings/linking_prerequisites.c.in0000644000175000017500000000351113521306105020550 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsAudio *master_audio, *slave_audio; AgsLinkChannel *linkChannel; AgsApplicationContext *application_context; AgsTaskThread *task_thread; GObject *soundcard; GError *error; application_context = ags_application_context_get_instance(); task_thread = application_context->task_thread; /* create AgsAudio objects */ master_audio = (AgsAudio *) g_object_new(AGS_TYPE_AUDIO, "soundcard", soundcard, NULL); slave_audio = (AgsAudio *) g_object_new(AGS_TYPE_AUDIO, "soundcard", soundcard, NULL); /* assign AgsAudioSignal objects to master_audio and slave_audio */ ags_audio_set_flags(master_audio, AGS_AUDIO_OUTPUT_HAS_RECYCLING); ags_audio_set_flags(slave_audio, (AGS_AUDIO_ASYNC | AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); /* create AgsChannel objects within master_audio and slave_audio */ ags_audio_set_audio_channels(master_audio, 2); ags_audio_set_pads(master_audio, AGS_TYPE_OUTPUT, 1); ags_audio_set_pads(master_audio, AGS_TYPE_INPUT, 1); ags_audio_set_audio_channels(slave_audio, 2); ags_audio_set_pads(slave_audio, AGS_TYPE_OUTPUT, 1); ags_audio_set_pads(slave_audio, AGS_TYPE_INPUT, 8); gsequencer-3.1.3/docs/listings/audio.c.in0000644000175000017500000000260313521306053015235 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsApplicationContext *application_context; GList *soundcard; AgsAudio *audio; AgsNotation *notation; guint audio_channels; guint i; /* get application context and soundcard */ application_context = ags_application_context_get_instance(); soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); /* creat audio and resize channels */ audio_channels = 2; audio = ags_audio_new(soundcard->data); ags_audio_set_audio_channels(audio, audio_channels); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, 1); ags_audio_set_pads(audio, AGS_TYPE_INPUT, 1); /* add notation */ for(i = 0; i < audio_channels; i++){ notation = ags_notation_new(audio, i); ags_audio_add_notation(audio, notation); } gsequencer-3.1.3/docs/listings/file_read.c.in0000644000175000017500000000176313521306105016052 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsApplicationContext *application_context; AgsFile *file; GError *error; static const gchar *filename = "my_file.xml"; application_context = ags_audio_application_context_new(); file = g_object_new(AGS_TYPE_FILE, "application-context", application_context, "filename", filename, NULL); error = NULL; ags_file_open(file, &error); ags_file_read(file); ags_file_close(file); ags_thread_start(application_context->main_loop); gsequencer-3.1.3/docs/listings/file_property.c.in0000644000175000017500000000133313521306105017014 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsApplicationContext *application_context; AgsFile *file; application_context = ags_application_context_get_instance(); file = ags_file_new(); g_object_set(application_context, "file", file, NULL); gsequencer-3.1.3/docs/listings/config.c.in0000644000175000017500000000131413521306105015375 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include AgsConfig *config; gchar *str; config = ags_config_get_instance(); ags_config_load_defaults(config); str = ags_config_get_value(config, "thread", "model"); gsequencer-3.1.3/docs/listings/complete_example.c.in0000644000175000017500000002434213521306053017463 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include #include AgsAudio* setup_master(AgsApplicationContext *application_context); AgsAudio* setup_slave(AgsApplicationContext *application_context); AgsAudio* setup_master(AgsApplicationContext *application_context) { AgsAudio *audio; AgsChannel *channel; GObject *soundcard; GList *list; GList *recall; guint n_audio_channels, n_output_pads, n_input_pads; /* get soundcard */ list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); soundcard = list->data; /* create master playback */ audio = ags_audio_new(soundcard); n_audio_channels = 2; n_output_pads = 1; n_input_pads = 1; ags_audio_set_audio_channels(audio, n_audio_channels); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, n_output_pads); ags_audio_set_pads(audio, AGS_TYPE_INPUT, n_input_pads); /* add ags-play-master recall */ ags_recall_factory_create(audio, NULL, NULL, "ags-play-master", 0, n_audio_channels, 0, n_output_pads, (AGS_RECALL_FACTORY_INPUT, AGS_RECALL_FACTORY_PLAY | AGS_RECALL_FACTORY_ADD), 0); /* set audio channel on play channel */ channel = audio->output; while(channel != NULL){ recall = channel->play; while((recall = ags_recall_template_find_type(recall, AGS_TYPE_PLAY_CHANNEL)) != NULL){ GValue audio_channel_value = {0,}; play_channel = AGS_PLAY_CHANNEL(recall->data); g_value_init(&audio_channel_value, G_TYPE_UINT64); g_value_set_uint64(&audio_channel_value, channel->audio_channel); ags_port_safe_write(play_channel->audio_channel, &audio_channel_value); recall = recall->next; } channel = channel->next; } return(audio); } AgsAudio* setup_slave(AgsApplicationContext *application_context) { AgsAudio *audio; AgsChannel *channel; AgsAudioSignal *audio_signal; AgsPattern *pattern; AgsDelayAudioRun *play_delay_audio_run; AgsCountBeatsAudioRun *play_count_beats_audio_run; GObject *soundcard; GList *list; GList *recall; guint n_audio_channels, n_output_pads, n_input_pads; gdouble volume; guint current_phase, prev_phase; guint i, j, k; GValue value; /* get soundcard */ list = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); soundcard = list->data; /* create master playback */ audio = ags_audio_new(soundcard); ags_audio_set_flags(audio, (AGS_AUDIO_OUTPUT_HAS_RECYCLING | AGS_AUDIO_INPUT_HAS_RECYCLING)); ags_audio_set_ability_flags(audio, (AGS_SOUND_ABILITY_SEQUENCER)); ags_audio_set_behaviour_flags(audio, (AGS_SOUND_BEHAVIOUR_PATTERN_MODE | AGS_SOUND_BEHAVIOUR_REVERSE_MAPPING | AGS_SOUND_BEHAVIOUR_DEFAULTS_TO_INPUT)); n_audio_channels = 2; n_output_pads = 1; n_input_pads = 1; ags_audio_set_audio_channels(audio, n_audio_channels); ags_audio_set_pads(audio, AGS_TYPE_OUTPUT, n_output_pads); ags_audio_set_pads(audio, AGS_TYPE_INPUT, n_input_pads); /* add pattern and generate sound */ channel = audio->output; while(channel != NULL){ ags_channel_set_ability_flags(channel, (AGS_SOUND_ABILITY_SEQUENCER)); channel = channel->next; } /* add pattern and generate sound */ channel = audio->input; for(i = 0; i < n_input_pads; i++){ for(j = 0; j < n_audio_channels; j++){ /* pattern */ pattern = ags_pattern_new(); ags_pattern_set_dim(pattern, 1, 1, 16); ags_channel_add_pattern(channel, pattern); for(k = 0; k < 16;){ ags_pattern_toggle_bit(pattern, 0, 0, k); k += 4; } /* sound */ audio_signal = ags_audio_signal_new(); ags_audio_signal_stream_resize(audio_signal, 5); stream = audio_signal->stream; current_phase = 0; volume = 1.0; k = 0; while(stream != NULL){ ags_synth_sin(soundcard, (signed short *) stream->data, 0, 440.0, current_phase, audio_signal->buffer_size, volume); prev_phase = current_phase; current_phase = (prev_phase + (audio_signal->buffer_size) + k * audio_signal->buffer_size) % 440.0; stream = stream->next; k++; } channel = channel->next; } } /* add ags-delay recall */ ags_recall_factory_create(audio, NULL, NULL, "ags-delay", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); recall = ags_recall_find_type(audio->play, AGS_TYPE_DELAY_AUDIO_RUN); if(recall != NULL){ play_delay_audio_run = AGS_DELAY_AUDIO_RUN(recall->data); } /* ags-count-beats */ ags_recall_factory_create(audio, NULL, NULL, "ags-count-beats", 0, 0, 0, 0, (AGS_RECALL_FACTORY_OUTPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_PLAY), 0); recall = ags_recall_find_type(audio->play, AGS_TYPE_COUNT_BEATS_AUDIO_RUN); if(recall != NULL){ play_count_beats_audio_run = AGS_COUNT_BEATS_AUDIO_RUN(recall->data); /* set dependency */ g_object_set(G_OBJECT(play_count_beats_audio_run), "delay-audio-run", play_delay_audio_run, NULL); /* make it loop */ g_value_init(&value, G_TYPE_BOOLEAN); g_value_set_boolean(&value, gtk_toggle_button_get_active(window->navigation->loop)); ags_port_safe_write(AGS_COUNT_BEATS_AUDIO(AGS_RECALL_AUDIO_RUN(play_count_beats_audio_run)->recall_audio)->notation_loop, &value); } /* ags-copy-pattern */ ags_recall_factory_create(audio, NULL, NULL, "ags-copy-pattern", 0, n_audio_channels, 0, n_input_pads, (AGS_RECALL_FACTORY_INPUT | AGS_RECALL_FACTORY_ADD | AGS_RECALL_FACTORY_RECALL), 0); recall = ags_recall_find_type(audio->recall, AGS_TYPE_COPY_PATTERN_AUDIO_RUN); if(recall != NULL){ recall_copy_pattern_audio_run = AGS_COPY_PATTERN_AUDIO_RUN(recall->data); /* set dependency */ g_object_set(G_OBJECT(recall_copy_pattern_audio_run), "delay-audio-run", play_delay_audio_run, "count-beats-audio-run", play_count_beats_audio_run, NULL); } /* set pattern object on port */ channel = ags_channel_pad_nth(audio->input, 0); for(i = 0; i < n_input_pads; i++){ for(j = 0; j < n_audio_channels; j++){ GList *list; recall = ags_recall_template_find_type(channel->recall, AGS_TYPE_COPY_PATTERN_CHANNEL); copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(recall->data); list = channel->pattern; pattern = AGS_PATTERN(list->data); copy_pattern_channel->pattern->port_value.ags_port_object = (GObject *) pattern; ags_portlet_set_port(AGS_PORTLET(pattern), copy_pattern_channel->pattern); channel = channel->next; } } return(audio); } int main(int argc, char **argv) { AgsAudio *master, *slave; AgsChannel *output, *input; AgsStartAudio *start_audio; AgsThread *main_loop; AgsTaskThread *task_thread; AgsApplicationContext *application_context; AgsConfig *config; GError *error; /* create application context */ application_context = ags_audio_application_context_new(); g_object_get(application_context, "task-thread", &task_thread, NULL); /* set config */ config = application_context->config; ags_config_set_value(config, AGS_CONFIG_THREAD, "model", "super-threaded"); ags_config_set_value(config, AGS_CONFIG_THREAD, "super-threaded-scope", "channel"); /* main loop */ main_loop = application_context->main_loop; /* setup audio tree */ master = setup_master(application_context); slave = setup_slave(application_context); /* set link */ input = master->input; output = slave->output; while(input != NULL && output != NULL){ error = NULL; ags_channel_set_link(input, output, &error); if(error != NULL){ g_message("%s", error->message); } input = input->next; output = output->next; } start_audio = ags_start_audio_new(slave, AGS_SOUND_SCOPE_SEQUENCER); /* start threads */ ags_thread_start(main_loop); /* launch task */ sleep(3); ags_task_thread_append_task(task_thread, start_audio); /* join main loop */ pthread_join(*(main_loop->thread), NULL); return(0); } gsequencer-3.1.3/docs/listings/recycling.c.in0000644000175000017500000000244513553424517016132 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ #include #include #include #include AgsRecycling *recycling; AgsAudioSignal *template; AgsApplicationContext *application_context; GList *soundcard; guint stream_length; application_context = ags_application_context_get_instance(); soundcard = ags_sound_provider_get_soundcard(AGS_SOUND_PROVIDER(application_context)); /* create recycling */ recycling = ags_recycling_new(soundcard->data); /* create audio signal and add to recycling */ stream_length = 5; audio_signal = ags_audio_signal_new(soundcard->data, recycling, NULL, stream_length); ags_audio_signal_set_flags(audio_signal, AGS_AUDIO_SIGNAL_TEMPLATE); ags_recycling_add_audio_signal(recyclig, audio_signal); gsequencer-3.1.3/docs/listings/linking_safe.c.in0000644000175000017500000000163613521306105016570 00000000000000/* Copyright (C) 2005-2018 Joël Krähemann * Permission is granted to copy, distribute and/or modify this document * under the terms of the GNU Free Documentation License, Version 1.3 * or any later version published by the Free Software Foundation; * with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. * A copy of the license is included in the section entitled "GNU * Free Documentation License". */ /* creating AgsLink task and add it to AgsDevout */ link_channel = ags_link_channel_new(ags_channel_nth(master_audio->input, 0), ags_channel_nth(slave_audio->output, 0)); ags_task_thread_append_task(task_thread, link_channel); link_channel = ags_link_channel_new(ags_channel_nth(master_audio->input, 1), ags_channel_nth(slave_audio->output, 1)); ags_task_thread_append_task(task_thread, link_channel); gsequencer-3.1.3/docs/usersBook.xml0000644000175000017500000000415313616617253014243 00000000000000 ]> Advanced Gtk+ Sequencer User's Handbook Copyright (C) &jkraehemann;. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Joël Krähemann This book is dedicated to my father †Hans-Jörg Krähemann. gsequencer-3.1.3/docs/developersBook.xml0000644000175000017500000000470413461636435015255 00000000000000 ]> Advanced Gtk+ Sequencer Developer's Book Copyright (C) &jkraehemann;. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Joël Krähemann This book is dedicated to my friend. gsequencer-3.1.3/docs/appa.xml0000644000175000017500000006711513461636435013220 00000000000000 GNU Free Documentation License Version 1.3, 3 November 2008 Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document “free” in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text. The “publisher” means any person or entity that distributes copies of the Document to the public. A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. State on the Title page the name of the publisher of the Modified Version, as the publisher. Preserve all the copyright notices of the Document. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice. Include an unaltered copy of this License. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles. You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties — for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements”. 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See Copyleft. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site. “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright © 2013 Joël Krähemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with… Texts.” line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. gsequencer-3.1.3/docs/usersBook/0000755000175000017500000000000013622252264013570 500000000000000gsequencer-3.1.3/docs/usersBook/chap2.xml0000644000175000017500000005455713616617253015255 00000000000000 Engines You can add engines by activating the appropriate menu item within the "add" submenu of the "edit" menu item. You may change the properties of an engine by opening the properties dialog from the context menu at the top of each machine within vertical order. From the context menu you may perform some other tasks, as well. The edit submenu is only available by sequencers like AgsDrum and AgsMatrix. To move up or down an engine open context menu and activate "up" respectively "down" entry. To show or hide an engine open context menu and activate "show" respectively "hide" entry. Note the engines won't be hidden entirely they are just collapsed. To rename an engine open context menu and activate "rename" entry. To remove an engine open context menu and activate "destroy" entry. To open properties dialog open context menu and activate "properties" entry. There you might link, resize or asign LADSPA effects to channels. NOTE for LADSPA sink or generators aren't supported, yet. To change multiple grouped controls at once check sticky controls. Edit gives you editing options. Copy pattern does convert your pattern bitmap into a pattern based notation suitable to paste in notation editor. Machine properties Within properties dialog you can link lines either in single channel or in bulk mode, add effects and adjust audio-channels/pads. Output tab The machine properties dialog screenshot - output tab The output tab lets you mainly perform linking lines and adding effects to them. For each line there's a combo box listing available linking engines, on the right of it there is a spin button let you choose the input line to be linked. As you have added a plugin by clicking add and selected appropriate effect by using plugin browser dialog. You may remove it by clicking checkbox of the listed plugin and finally click remove. Note you can have a effect only once per channel. Input tab The machine properties dialog screenshot - input tab The input tab does the mainly same as output tab in view of input lines. If supported you might assign files, too. In general you connect output to input. Link input tab The machine properties dialog screenshot - link input tab Do linking in batch mode. This means you're able to assign multiple lines at once. Thus you have to decide what start channel on each side to use and the count of lines to be linked. Resize channels tab The machine properties dialog screenshot - resize tab Adjust audio channels or input/output pads. If supported the GUI may provide more lines and pads as increasing the amount. LADSPA browser dialog The LADSPA browser dialog screenshot The plugin browser gives you choice of available LADSPA or Lv2 plugins. It lets you modify the controls to be used. The added plugin can be removed by activating checkbox in output/input tab and clicking remove. Audio connection dialog The audio connection dialog allows you to specify to what soundcard to write output to or read input from. This can be modified either by assigning single channels or in bulk mode. Audio connection output line The audio connection output line screenshot Select the desired soundcard and don't forget to click enable. In order apply your modifications. After click OK. Audio connection output bulk The audio connection output bulk screenshot The output connection tab allows you to link a bunch of channel at once. Audio connection input line The audio connection input line screenshot Select the desired soundcard and don't forget to click enable. In order apply your modifications. After click OK. Audio connection input bulk The audio connection input bulk screenshot The input connection tab allows you to link a bunch of channel at once. Envelope dialog The envelope dialog allows you to display and display envlope information assigned either as preset or to a specific note. Envelope editor The envelope dialog's editor tab screenshot Modify or create presets and apply it to selected notes. Envelope info The envelope dialog's info tab screenshot Show envelope information of selected notes. Envelope pattern The envelope dialog's pattern tab screenshot Modify and create pattern related envelope presets. MIDI dialog The MIDI dialog screenshot The MIDI dialog allows you to select the MIDI sequencer to assign of the current machine. You might want to perform start and end key. Further you can adjust the start and end channel. Panel The panel screenshot The panel is used for outputting to your soundcard and should be at topmost of your audio processing tree. It contains per audio channel a mute check box. Due the synchroneous nature of the output engine you're just able to adjust the audio channels. The output pads aren't visible and the ones available for input are packed vertically. Mixer The mixer screenshot Bundle audio lines with the mixer and perform toplevel stream manipulation. It contains per audio channel a volume indicator and may contain LADSPA or Lv2 plugins. Due the limitation of recycling it is just able to handle multiple input lines and only one output pad. Whereas the output is hidden. They are locate just below the machine's menu tool button. Spectrometer The spectrometer screenshot Visualize input by plotting it using FFTW3 library. Equalizer10 The equalizer10 screenshot Adjust a 10 band equalizer with additional pressure control. Drum The drum screenshot Produce an audio stream by defining a pattern. The drum supports opening audio files and associate to its input. You might doing it by open button located preceeding to pattern box. Thus multi-selection of files is supported and assigning can be controlled by the controls just above the action widgets. The drum input pad contains an open button, too. It assigns available audio channels of the file to the grouped lines. One more way to assign audio files is doing it so by link editor of machine's property dialog. The drum may contain LADSPA plugins, too. The drum may contain multiple input as well output pads. They are packed on top of the composite widget, just below the machine's menu tool button. The input is packed horizontally followed by vertically packed output. The edit button within every input pad enables it as current input for editing pattern data. Further you may de-/activate the group toggle button to control audio channel assignment. Next to the multi-selection enable open button there's a loop check-box followed by the run button what starts the drum sequencer. It follows the into a two dimensional matrix packed pattern banks. Labeled from 1 to 12 and an the combined index labeled a throughout d. The length spin-button controls the number of pattern pads to be played in sequence which may be looped. The pattern box As entering to pattern box with focus the only way to get out of it is by tabulator key. With arrow keys you may navigate within pattern or toggle with space. Left, Left-Arrow Move within pattern box left, as the pattern pad control is activate you get an audible feedback. Right, Right-Arrow Move within pattern box right, audible feedback as above. Up, Up-Arrow Decrease pattern box offset about available number of pattern pads, audible feedback as above. Down, Down-Arrow Increase pattern box offset about available number of pattern pads, audible feedback as above. Space Toggle audio pattern and give audible feedback. Ctrl+c Copy the current pattern to clipboard Tab Leave pattern box focus. Matrix The matrix screenshot Produce an audio stream by defining a pattern. The matrix itselves doesn't have any audio signals on its own input you may rather link it to a synth engine. The matrix is a rectangular area you may navigate within by arrow keys or toggle pattern by hiting space. The matrix is a true mono device but you may emulate multiple channels by doing multi-output. This is fulfilled by adjusting output pads within machine's properties dialog. Run button comes first and is followed by a one dimensional vector bank index labeled from 1 to 9. Then follows the matrix you have to leave it by hiting tab then you might modify sequence length or do loop control of the sequence. Left, Left-Arrow Move within matrix left, as the pattern pad control is activate you get an audible feedback. Right, Right-Arrow Move within matrix right, audible feedback as above. Up, Up-Arrow Decrease matrix offset about available number of pattern pads, audible feedback as above. Down, Down-Arrow Increase matrix offset about available number of pattern pads, audible feedback as above. Space Toggle audio pattern and give audible feedback. Ctrl+c Copy the current pattern to clipboard Tab Leave matrix focus. Synth The synth screenshot Produce audio data using its oscillators. The count of oscillators depends on number of input lines. They are adjusted vertically. You have on the right the option to auto-update changes you do with the controls or do it manually by the update button. FM Synth The frequency modulator synth screenshot Produce audio data using its oscillators. The count of oscillators depends on number of input lines. They are adjusted vertically. You have on the right the option to auto-update changes you do with the controls or do it manually by the update button. Syncsynth The synced synth screenshot Produce audio data using its oscillators. The count of oscillators can be adjusted by clicking add/remove. You have on the right the option to auto-update changes you do with the controls or do it manually by the update button. Loop start and loop end allows you to specify what region of the audio data shall be looped in order to get the desired note length. FM Syncsynth The frequency modulator synced synth screenshot Produce audio data using its oscillators. The count of oscillators can be adjusted by clicking add/remove. You have on the right the option to auto-update changes you do with the controls or do it manually by the update button. Loop start and loop end allows you to specify what region of the audio data shall be looped in order to get the desired note length. FFPlayer The ffplayer screenshot Produce audio data by opening Soundfont2 audio file container format. There three available controls, preset and instrument to navigate within container format and a open button to read Soundfont2 files and assign the selected instrument to the input. The ffplayer contains recently the bridge widget. You can add plugins in bulk mode by click Add or Remove within AgsFFPlayer's bridge, what you can collapse/expand. To add an effect to a line, you have open as usual input/output of machine properties. Sampler The pitch sampler screenshot Produce audio data by opening SFZ audio file container format. There is a open button to read SFZ files and assign it to the input. There is a LFO enable control allowing you make adjustments to LFO amplification: LFO freq LFO phase LFO depth LFO tuning Audiorec The audiorec screenshot Open large audio files and manipulate the wave form using wave window. You might want to capture sound using it. By either replacing or mixing existing audio data. gsequencer-3.1.3/docs/usersBook/chap4.xml0000644000175000017500000001023313616617253015236 00000000000000 ]> The navigation The navigation screenshot With the navigation you have overall control of your song. Settings you perform here may influence the behaviour of AGS. There's a duration label doing a time approximation. It is really unreliable and may differ about 30 seconds after 3 minutes of playback. Note with higher frequency of the audio related threads it may differ less. An other factor is bpm what has an influence, as well. BPM The beats per minute (BPM for short) indicates the velocity of a song being played. To adjust the BPM of the project in-/decrement the spinner labeled with bpm. To edit patterns or notes at a more granular rate select the wished tact within the appropriate engine or editor. To calculate timings you divide 1 minute with the entered BPM and divide it with basic. For example you have a BPM rate of 120 and a 4/4 tact you would calculate the timing as follow: t = 1 / 120 * (1 / 4) Playback controls With these controls you can play/stop a song or seek to the wished position. AGS playback controls table icon action description backward Seeking back until it's pressed again. previous Seeking back until it's not pressed anymore. play Starts the engines and the piano roll. stop Stops the engines and the piano roll. next Seeking forward until it's not pressed anymore. forward Seeking forward until it's pressed again.
The loop checkbox enables the loop L and loop R settings below. It causes the notation to loop playback. Auto-Scroll checkbox animates the horizontal scrollbars to follow playback position. Use exclude sequencers checkbox to enable/disable pattern based sequencers.
gsequencer-3.1.3/docs/usersBook/chap5.xml0000644000175000017500000002161513616617253015245 00000000000000 ]> The automation window The automation window screenshot showing drum The automation window is accessed by edit menu item automation. There are basic edit tools available to do your automation. You can use keyboard bindings to do your tasks are select appropriate edit tool of toolbar. As the appropriate port is checked it enables the automation of it. Else it is by-passed and won't see any automation data. By enabling a port it gets visible within the editor. Position cursor. Use arrow keys. Page-Up and Page-Down switches the automation area. Add automation point applied horizontally by time and vertically as value. Add by enter space. Delete automation point. Use delete key. Select automation. Alternatively do select all, note selects everything visible within scope tab. Copy automation. Control-c key-stroke. Cut automation. Control-x key-stroke. Paste automation. Control-v key-stroke. Show/hide meta information. Control-m key-stroke. Adjust zoom by combo-box and add/remove automation area to editor by combo-box selection. Automation toolbar The automation editor's toolbar screenshot In the table below are the various buttons explained you may use for editing. AGS automation editor toolbar controls table. icon action description cursor You may want to set the cursor to paste accelerations at the position where it is located. accelerations Add accelerations by clicking within the automation area. delete Delete accelerations by clicking on the acceleration you don't want anymore. select Select accelerations to copy or cut them. copy Copy accelerations to the clipboard. cut Cut accelerations to the clipboard. paste Paste the previously copied or cutted accelerations at the cursor position or just insert them where they are/were located.
Editing tools The tools menu button contains items that opens dialogs to do common editing tasks. Like move, crop or select accelerations. Position cursor The positon automation cursor dialog screenshot The position automation cursor dialog allows you to position the cursor. AGS position automation cursor dialog controls. control description position x Set the cursor at position x.
Select accelerations The select acceleration dialog screenshot The select acceleration dialog allows you to select accelerations of given position and selected controls. AGS select acceleration dialog controls. control description copy selection Check button to say if you would like to copy selection to clipboard. add/remove Add/remove controls to enable/disable for selecting automation area. select x0 Set the x0 offset of region to select. select x1 Set the x1 offset of region to select.
Ramp accelerations The ramp acceleration dialog screenshot The ramp acceleration dialog allows you to ramp accelerations to a specified value using given number of steps. AGS ramp acceleration dialog controls. control description ramp control Select the control to ramp. ramp x0 The x0-offset to start ramp from. ramp y0 The y0-value to use as first value. ramp x1 The x1-offset to stop ramp to. ramp y1 The y1-value to use as last value. step count The number of steps to use to ramp value y0 to y1 from offset x0 to x1.
gsequencer-3.1.3/docs/usersBook/chap6.xml0000644000175000017500000001410113616617253015236 00000000000000 ]> The wave window The wave window screenshot showing audio recorder The wave window is accessed by edit menu item wave. There are basic edit tools available to manipulate the wave form. You can use keyboard bindings to do your tasks are select appropriate edit tool of toolbar. The wave editor shows all audio channels in vertical alignment and are grouped by default. Position cursor. Use arrow keys. Page-Up and Page-Down switches the wave area. Select wave. Alternatively do select all, note selects everything visible within scope tab. Copy wave. Control-C key-stroke. Cut wave. Control-X key-stroke. Paste wave. Control-V key-stroke. Adjust zoom by combo-box and add/remove wave area to editor by combo-box selection. Wave toolbar The wave editor's toolbar screenshot In the table below are the various buttons explained you may use for editing. AGS wave editor toolbar controls table. icon action description cursor You may want to set the cursor to paste buffers at the position where it is located. select Select buffers to copy or cut them. copy Copy buffers to the clipboard. cut Cut buffers to the clipboard. paste Paste the previously copied or cutted buffers at the cursor position or just insert them where they are/were located.
Editing tools The tools menu button contains items that opens dialogs to do common editing tasks. Like move, crop or select buffers. Position cursor The position wave cursor dialog screenshot The position wave cursor dialog allows you to position the cursor. AGS position wave cursor dialog controls. control description position x Set the cursor at position x.
Select buffers The select buffer dialog screenshot The select buffer dialog allows you to select buffers of given position. AGS select buffer dialog controls. control description copy selection Check button to say if you would like to copy selection to clipboard. select x0 Set the x0 offset of region to select. select x1 Set the x1 offset of region to select.
gsequencer-3.1.3/docs/usersBook/chap1.xml0000644000175000017500000002401413616617253015235 00000000000000 ]> The menubar Within the menubar you may do basic tasks like open/close files. In this section we cover briefly the the different entries. The menus have mnemonics e.g. press ALT and F key in order to open File menu. File The file menu lets you do maintenance related to files or quit application. Note there was a simple XML file format introduced in 0.7.x to speed up things. The advanced file format needs optimization work to fulfill. The file format can be modified by configuration file located in your home directory $(HOME)/.gsequencer/ags.conf. The simple file interface is defaulted and can be altered by section generic and simple-file key set to false. Open - open an &ags; XML file. Uses per configuration the simple XML Input/Ouput interface. Save - save your current work. Uses per configuration the simple XML Input/Ouput interface. Save as - save your current work as a different filename. Uses per configuration the simple XML Input/Ouput interface. Export - export to PCM audio file. Quit - leave &ags;. Export to PCM audio file The export window screenshot This shows you the export dialog. Exclude sequencers affect mainly AgsDrum and AgsMatrix pattern sequencers to be started to output. You may select filename to export to and duration of the exported track. BPM adjustment is take from the navigation. Basically &ags; exports what you hear of the speakers. With the export toggle button you can start exporting to PCM audio file or stop it at an arbitrary time. Edit The edit menu lets you add audio machines of the related submenu, open automation window or preferences dialog. Add - select of different machines. You might want to add the bridged machines of plugins like LADSPA, DSSI or Lv2. Instrument plugins are available within notation editor. Panel - acts as your default sink. Mixer - enables you to bundle your different output engines. Drum - is used to do pattern editing using PCM audio files. Matrix - is used to pattern editing, intended to be linked against Synth. Synth - is a software synthesizer supporting variable oscillator count. FFPlayer - may be used to open Soundfont2 audio file container format in order to do notation. Preferences - open preferences dialog. Preferences dialog Within preferences dialog you may choose between different topics. For each one one tab. The configuration is applied in place after click Apply or OK. There is no need to restart the application. Generic The preferences dialog screenshot - generic tab The autosave thread option enables auto-saving to $HOME/.gsequencer directory. Segmentation is used as a delay factor, you can do tactation with it. Audio The preferences dialog screenshot - audio tab Sound card is your physical devices to do playback. Audio channels specifies the audio channels to allocate for output device. Samplerate affects the entire project. Your audio files have to be at very same rate further your device has to support the given rate. Like buffer size this affects the thread's related to audio processing their frequencies. Note a too low frequency may cause unexpected behavior like no proper velocity. Buffer size is used for all audio buffers. Your soundcard has to support the passed buffer size. This preference affects thread's frequencies. Format determines the storage size of one frame. All available formats are signed integers. The following sizes in bits are available: 8, 16, 24, 32 and 64. Your hardware has a need to support the format in order to get sounds. MIDI The preferences dialog screenshot - midi tab You can add MIDI sequencers to the configured project. These are intended to connect by the MIDI dialog, later. There is a combo box availabe to choose your backend like ALSA, OSS or JACK. The second combo box lets you choose the device. The JACK backend allows you to add MIDI ports. Performance The preferences dialog screenshot - performance tab Auto-sense on stream is required for certain plugins and recalls but may cause additional performance losses. The maximum precision of threads allows you to fine tune performance. A higher frequency allows you to use smaller buffer size and a higher samplerate. But causes a higher synchronization over-head. MIDI The MIDI sub-menu provides functionality related to MIDI like the import or export wizards. The MIDI import wizard The MIDI import wizard allows you to import Standard MIDI Files. You might choose the machine which will be added after import. The notation is available within the pattern or notation editor. Step #1 - file chooser The MIDI import wizard - step #1 First you have to choose the Standard MIDI File you would like to import. As selected the desired file you might want to click Forward. Step #2 - mapping The MIDI import wizard - step #2 After parsing the MIDI file there is one more step involved. You have to enable the appropriate track. There are 2 labels visible showing meta information. Below there is a combo box allowing you to choose the machine getting mapped. The spin buttons let you adjust the number of audio channels to create. As well the first offset. The MIDI export wizard The MIDI export wizard allows you to export Standard MIDI Files. You might choose the machine which will be exported. Step #1 - select machines The MIDI import wizard - step #1 First you have to enable the machines you wish to export. The entry allows you to set the sequence meta information. Step #2 - file chooser The MIDI import wizard - step #2 After enabled the machines to export you shall specify the filename. As next you click OK in order to write the MIDI file. gsequencer-3.1.3/docs/usersBook/chap3.xml0000644000175000017500000003721713616617253015250 00000000000000 ]> Editor The editor features a piano roll. After linking an editor index with an enginge You may perform tasks like adding notes or copy, cut and paste them. You may change view segmentation, too. Further you might shift the displayed piano on the left or reverse the channel mapping. Linking Before you might perform any task with the editor you have to link engines by adding an index. Then you should link it with an engine. That can all be done by using the menu button of the index list. The corresponding editor appears as you click appropriate link. Toolbar The editor's toolbar screenshot In the table below are the various buttons explained you may use for editing. AGS editor toolbar controls table. icon action description cursor You may want to set the cursor to paste notes at the position where it is located. notes Add notes by clicking within the piano roll and move to till them having the wished duration. delete Delete notes by clicking on the note you don't want anymore. select Select notes to copy or cut them. copy Copy notes to the clipboard. cut Cut notes to the clipboard. paste Paste the previously copied or cutted notes at the cursor position or just insert them where they are/were located. invert Invert entire notation in conjunction with reverse mapping or MIDI import.
Editing tools The tools menu button contains items that opens dialogs to do common editing tasks. Like move, crop or select notes. Position cursor The positon notation cursor dialog screenshot The position notation cursor dialog allows you to position the cursor. AGS position notation cursor dialog controls. control description position x Set the cursor at position x. position y Set the cursor at position y.
Move notes The move note dialog screenshot The move notes dialog allows you to move selected notes to a given position. AGS move note dialog controls. control description relative Radio button to choose relative positioning. The x- and y-offset are going to be added to current selections insets. absolute Radio button to choose absolute positioning. The x- and y-offset are goint to be added to most upper-left position x = 0 and y = 0. x The x-offset to position the selected notes. y The y-offset to position the selected notes.
Crop notes The crop note dialog screenshot The crop notes dialog allows you to crop selected notes to a specified width or insert desired padding. Per default the values are added or subtracted of each note and doesn't require any additional space. AGS crop note dialog controls. control description absolute Modify behavior of crop, if checked it does use crop note control as absolute value, rather than add/subtract the value of current insets. in-place Radio button to specify that all crop happens in-place i.e. no additional space is used. do resize Radio button to specify that all crop adds some extra space i.e. the padding is increased as well. crop note Set the crop note value to resize the selected notes. This may be a relative or absolute value. padding Set the padding per tic to use.
Select notes The select note dialog screenshot The select note dialog allows you to select notes of given position and region. AGS select note dialog controls. control description copy selection Check button to say if you would like to copy selection to clipboard. select x0 Set the x0 offset of region to select. select y0 Set the y0 offset of region to select. select x1 Set the x1 offset of region to select. select y1 Set the y1 offset of region to select.
Pattern edit The pattern edit widget is available as linking an editor index with a pattern sequencer e.g. drum or matrix. Left, Left-Arrow Move within notation left, as there is a pattern you get an audible feedback. Right, Right-Arrow Move within notation right, audible feedback as above. Up, Up-Arrow Move within notation up, audible feedback as above. Down, Down-Arrow Move within notation down, audible feedback as above. Space Add audio pattern and give audible feedback. Delete Remove audio pattern and give audible feedback. Ctrl+c Copy the selected pattern to clipboard. Ctrl+x Cut the selected pattern to clipboard. Ctrl+v Paste pattern from clipboard. Ctrl+a Select all. Ctrl+i Invert all. Ctrl+m Show/hide meta information. Tab Leave notation focus. Note edit The note edit widget is available as linking an editor index with a notes sequencer e.g. Soundfont2 file player. Left, Left-Arrow Move within notation left, as there is a note you get an audible feedback. Right, Right-Arrow Move within notation right, audible feedback as above. Up, Up-Arrow Move within notation up, audible feedback as above. Down, Down-Arrow Move within notation down, audible feedback as above. Space Add audio notes and give audible feedback. Delete Remove audio notes and give audible feedback. Ctrl+c Copy the selected notes to clipboard. Ctrl+x Cut the selected notes to clipboard. Ctrl+v Paste notes from clipboard. Ctrl+a Select all. Ctrl+i Invert all. Ctrl+m Show/hide meta information. Tab Leave notation focus.
gsequencer-3.1.3/docs/usersBook/appb.xml0000644000175000017500000000125313461636435015164 00000000000000 Resources gsequencer-3.1.3/docs/usersBook/preface.xml0000644000175000017500000000357113461636435015654 00000000000000 ]> Foreword When I started to use GNU/Linux in 2001 I missed only one thing. A sequencer with a nice GUI. There was already rosegarden available. But who didn't get stuck of midi setup, yet? The time before I was using free software and became an affiliate to its community I was using &win98; on my father's desktop computer and did my first steps in &java2;. My very first own Notebook was a &n160; and it's preinstalled &win98; had to vanish because I became a fellow of &stallman;. Soon, I begun to code and older I became my demands to ags increased. I developed the concept of the underlying audio library myself as not graduated college student. October 2005, I decided to reimplement &ags; from scratch in order to get rid of inherited burden. And it was one big development process until I was almost satisfied with it's design. There was a time in 2007 where I even wanted to replace GObject and Gtk+ dependencies with my own libraries I begun to develop. I'm glad of didn't doing so. Thank you! gsequencer-3.1.3/docs/reference/0000755000175000017500000000000013622252250013545 500000000000000gsequencer-3.1.3/docs/reference/libags-gui/0000755000175000017500000000000013622252264015575 500000000000000gsequencer-3.1.3/docs/reference/libags-gui/libags_gui.interfaces.in0000644000175000017500000000457413607210263022302 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . GtkWidget AtkImplementorIface GtkBuildable AgsCartesian AtkImplementorIface GtkBuildable AgsDial AtkImplementorIface GtkBuildable GtkContainer AtkImplementorIface GtkBuildable GtkBin AtkImplementorIface GtkBuildable GtkExpander AtkImplementorIface GtkBuildable AgsExpander AtkImplementorIface GtkBuildable AgsLedArray AtkImplementorIface GtkBuildable AgsHLedArray AtkImplementorIface GtkBuildable AgsVLedArray AtkImplementorIface GtkBuildable AgsScrolledLevelBox AtkImplementorIface GtkBuildable AgsScrolledPiano AtkImplementorIface GtkBuildable AgsScrolledScaleBox AtkImplementorIface GtkBuildable GtkTable AtkImplementorIface GtkBuildable AgsExpanderSet AtkImplementorIface GtkBuildable GtkBox AtkImplementorIface GtkBuildable GtkOrientable AgsLevelBox AtkImplementorIface GtkBuildable GtkOrientable AgsHLevelBox AtkImplementorIface GtkBuildable GtkOrientable AgsVLevelBox AtkImplementorIface GtkBuildable GtkOrientable AgsScaleBox AtkImplementorIface GtkBuildable GtkOrientable AgsHScaleBox AtkImplementorIface GtkBuildable GtkOrientable AgsVScaleBox AtkImplementorIface GtkBuildable GtkOrientable GtkVBox AtkImplementorIface GtkBuildable GtkOrientable AgsNotebook AtkImplementorIface GtkBuildable GtkOrientable AgsIndicator AtkImplementorIface GtkBuildable AgsHIndicator AtkImplementorIface GtkBuildable AgsVIndicator AtkImplementorIface GtkBuildable AgsLed AtkImplementorIface GtkBuildable AgsLevel AtkImplementorIface GtkBuildable AgsPiano AtkImplementorIface GtkBuildable AgsRuler AtkImplementorIface GtkBuildable AgsScale AtkImplementorIface GtkBuildable GtkWidgetAccessible AtkComponent GtkContainerAccessible AtkComponent GtkExpanderAccessible AtkComponent AtkAction gsequencer-3.1.3/docs/reference/libags-gui/libags_gui.types0000644000175000017500000000110413622252234020701 00000000000000ags_cartesian_get_type ags_dial_get_type ags_expander_get_type ags_expander_set_get_type ags_hindicator_get_type ags_hled_array_get_type ags_hlevel_box_get_type ags_hscale_box_get_type ags_indicator_get_type ags_led_array_get_type ags_led_get_type ags_level_box_get_type ags_level_get_type ags_notebook_get_type ags_piano_get_type ags_ruler_get_type ags_scale_box_get_type ags_scale_get_type ags_scrolled_level_box_get_type ags_scrolled_piano_get_type ags_scrolled_scale_box_get_type ags_vindicator_get_type ags_vled_array_get_type ags_vlevel_box_get_type ags_vscale_box_get_type gsequencer-3.1.3/docs/reference/libags-gui/libags_gui-overrides.txt0000644000175000017500000000000013461636435022360 00000000000000gsequencer-3.1.3/docs/reference/libags-gui/README0000644000175000017500000000023413607210263016370 00000000000000Third-party files of gtk-doc licensed under the terms of GNU GPLv3+, copyright provided by Stefan Sauer * Makefile.am (Copyright (C) Stefan Sauer, GPLv3+) gsequencer-3.1.3/docs/reference/libags-gui/Makefile.in0000644000175000017500000012760013622252207017565 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/reference/libags-gui ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/./gtk-doc.make $(srcdir)/Makefile.in \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # The name of the module, e.g. 'glib'. DOC_MODULE = libags_gui # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE = $(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR = $(top_srcdir)/ags/widget # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS = --cflags="$(CFLAGS) $(GOBJECT_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) -L$(top_builddir) $(top_builddir)/libags_gui.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS = --xml-mode --output-format=xml --name-space=libags_gui --module=libags_gui # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS = # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = --module=libags_gui --module-dir=./libags-gui-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libags-gui-doc/api # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB = CFILE_GLOB = # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES = # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES = # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES = # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files = # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files = AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS = $(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags_gui.la @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test @GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp #### setup #### GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; #### scan #### GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; #### xml #### GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0 = @echo " DOC Building XML"; #### html #### GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; #### pdf #### GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; # This includes the standard gtk-doc make rules, copied by gtkdocize. # Comment this out if you want 'make check' to test you doc status # and run some sanity checks @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = \ @ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) @ENABLE_GTK_DOC_TRUE@TESTS = $(GTKDOC_CHECK) all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/./gtk-doc.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/reference/libags-gui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/libags-gui/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/./gtk-doc.make $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ags-docs-local: tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am @ENABLE_GTK_DOC_FALSE@all-local: all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-am ags-docs-am: ags-docs-local clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: check-am install-am install-strip .PHONY: ags-docs-am ags-docs-local all all-am all-local check \ check-TESTS check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am uninstall-local .PRECIOUS: Makefile gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc @ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libags-gui-html && mkdir libags-gui-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libags-gui-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libags-gui-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libags-gui-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libags-gui-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libags-gui-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libags-gui-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libags-gui-html install-data-local: @installfiles=`echo $(builddir)/libags-gui-html/*`; \ if test "$$installfiles" = '$(builddir)/libags-gui-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # @HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs @HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" @HAVE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libags-gui-html @cp ./libags-gui-html/* $(distdir)/libags-gui-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libags-gui-html .PHONY : dist-hook-local docs -include $(top_srcdir)/git.mk # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/docs/reference/libags-gui/libags_gui-sections.txt0000644000175000017500000003442513622252234022215 00000000000000
ags_cartesian AgsCartesian AGS_PLOT AGS_CARTESIAN_STEP_CONVERSION_FUNC AGS_CARTESIAN_TRANSLATE_FUNCT AGS_CARTESIAN_SCALE_FUNC AGS_CARTESIAN_LABEL_FUNC AGS_CARTESIAN_DEFAULT_X_MARGIN AGS_CARTESIAN_DEFAULT_Y_MARGIN AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH AGS_CARTESIAN_DEFAULT_Y_STEP_HEIGHT AGS_CARTESIAN_DEFAULT_X_SCALE_STEP_WIDTH AGS_CARTESIAN_DEFAULT_Y_SCALE_STEP_HEIGHT AGS_CARTESIAN_DEFAULT_X_STEP AGS_CARTESIAN_DEFAULT_Y_STEP AGS_CARTESIAN_DEFAULT_X_START AGS_CARTESIAN_DEFAULT_X_END AGS_CARTESIAN_DEFAULT_Y_START AGS_CARTESIAN_DEFAULT_Y_END AGS_CARTESIAN_DEFAULT_X_LABEL_START AGS_CARTESIAN_DEFAULT_X_LABEL_STEP_WIDTH AGS_CARTESIAN_DEFAULT_Y_LABEL_START AGS_CARTESIAN_DEFAULT_Y_LABEL_STEP_HEIGHT AgsCartesianStepConversionFunc AgsCartesianTranslateFunc AgsCartesianScaleFunc AgsCartesianLabelFunc AgsCartesianFlags AgsPlotFillFlags AgsPlot ags_plot_alloc ags_plot_free ags_cartesian_add_plot ags_cartesian_remove_plot ags_cartesian_linear_step_conversion_func ags_cartesian_linear_translate_func ags_cartesian_linear_x_small_scale_func ags_cartesian_linear_x_big_scale_func ags_cartesian_linear_y_small_scale_func ags_cartesian_linear_y_big_scale_func ags_cartesian_linear_x_label_func ags_cartesian_linear_y_label_func ags_cartesian_reallocate_label ags_cartesian_fill_label ags_cartesian_new AGS_CARTESIAN AGS_CARTESIAN_CLASS AGS_CARTESIAN_GET_CLASS AGS_IS_CARTESIAN AGS_TYPE_CARTESIAN AgsCartesian AgsCartesianClass ags_cartesian_get_type
ags_container ags_container_add_all
ags_dial AgsDial AGS_DIAL_DEFAULT_PRECISION AGS_DIAL_DEFAULT_RADIUS AGS_DIAL_DEFAULT_OUTLINE_STRENGTH AGS_DIAL_DEFAULT_FONT_SIZE AGS_DIAL_DEFAULT_BUTTON_WIDTH AGS_DIAL_DEFAULT_BUTTON_HEIGHT AGS_DIAL_DEFAULT_MARGIN AGS_DIAL_DEFAULT_MARGIN_LEFT AGS_DIAL_DEFAULT_MARGIN_RIGHT AGS_DIAL_DEFAULT_HEIGHT AGS_DIAL_DEFAULT_WIDTH AgsDialFlags AgsDialAction ags_dial_value_changed ags_dial_set_value ags_dial_new AGS_DIAL AGS_DIAL_CLASS AGS_DIAL_GET_CLASS AGS_IS_DIAL AGS_TYPE_DIAL AgsDial AgsDialClass ags_dial_get_type
ags_expander AgsExpander AGS_EXPANDER_CHILD AgsExpanderFlags AgsExpanderChild ags_expander_child_alloc ags_expander_child_find ags_expander_add ags_expander_remove ags_expander_new AGS_EXPANDER AGS_EXPANDER_CLASS AGS_EXPANDER_GET_CLASS AGS_IS_EXPANDER AGS_TYPE_EXPANDER AgsExpander AgsExpanderClass ags_expander_get_type
ags_expander_set AgsExpanderSet AGS_EXPANDER_SET_CHILD AgsExpanderSetFlags AgsExpanderSetChild ags_expander_set_child_alloc ags_expander_set_child_find ags_expander_set_set_flags ags_expander_set_add ags_expander_set_remove ags_expander_set_new AGS_EXPANDER_SET AGS_EXPANDER_SET_CLASS AGS_EXPANDER_SET_GET_CLASS AGS_IS_EXPANDER_SET AGS_TYPE_EXPANDER_SET AgsExpanderSet AgsExpanderSetClass ags_expander_set_get_type
ags_hindicator AgsHIndicator AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT ags_hindicator_new AGS_HINDICATOR AGS_HINDICATOR_CLASS AGS_HINDICATOR_GET_CLASS AGS_IS_HINDICATOR AGS_TYPE_HINDICATOR AgsHIndicator AgsHIndicatorClass ags_hindicator_get_type
ags_hled_array AgsHLedArray ags_hled_array_new AGS_HLED_ARRAY AGS_HLED_ARRAY_CLASS AGS_HLED_ARRAY_GET_CLASS AGS_IS_HLED_ARRAY AGS_TYPE_HLED_ARRAY AgsHLedArray AgsHLedArrayClass ags_hled_array_get_type
ags_hlevel_box AgsHLevelBox ags_hlevel_box_new AGS_HLEVEL_BOX AGS_HLEVEL_BOX_CLASS AGS_HLEVEL_BOX_GET_CLASS AGS_IS_HLEVEL_BOX AGS_TYPE_HLEVEL_BOX AgsHLevelBox AgsHLevelBoxClass ags_hlevel_box_get_type
ags_hscale_box AgsHScaleBox ags_hscale_box_new AGS_HSCALE_BOX AGS_HSCALE_BOX_CLASS AGS_HSCALE_BOX_GET_CLASS AGS_IS_HSCALE_BOX AGS_TYPE_HSCALE_BOX AgsHScaleBox AgsHScaleBoxClass ags_hscale_box_get_type
ags_indicator AgsIndicator AGS_INDICATOR_DEFAULT_SEGMENT_WIDTH AGS_INDICATOR_DEFAULT_SEGMENT_HEIGHT AGS_INDICATOR_DEFAULT_SEGMENT_PADDING AGS_INDICATOR_DEFAULT_SEGMENT_COUNT ags_indicator_new AGS_INDICATOR AGS_INDICATOR_CLASS AGS_INDICATOR_GET_CLASS AGS_IS_INDICATOR AGS_TYPE_INDICATOR AgsIndicator AgsIndicatorClass ags_indicator_get_type
ags_led AgsLed AGS_LED_DEFAULT_WIDTH AGS_LED_DEFAULT_HEIGHT AgsLedFlags ags_led_set_active ags_led_unset_active ags_led_new AGS_IS_LED AGS_LED AGS_LED_CLASS AGS_LED_GET_CLASS AGS_TYPE_LED AgsLed AgsLedClass ags_led_get_type
ags_led_array AgsLedArray AGS_LED_ARRAY_DEFAULT_LED_WIDTH AGS_LED_ARRAY_DEFAULT_LED_HEIGHT AgsLedArrayFlags ags_led_array_set_led_count ags_led_array_unset_all ags_led_array_set_nth ags_led_array_new AGS_IS_LED_ARRAY AGS_LED_ARRAY AGS_LED_ARRAY_CLASS AGS_LED_ARRAY_GET_CLASS AGS_TYPE_LED_ARRAY AgsLedArray AgsLedArrayClass ags_led_array_get_type
ags_level AgsLevel AGS_LEVEL_DEFAULT_LEVEL_WIDTH AGS_LEVEL_DEFAULT_LEVEL_HEIGHT AGS_LEVEL_DEFAULT_LOWER AGS_LEVEL_DEFAULT_UPPER AGS_LEVEL_DEFAULT_NORMALIZED_VOLUME AGS_LEVEL_DEFAULT_STEP_COUNT AGS_LEVEL_DEFAULT_PAGE_SIZE AGS_LEVEL_DEFAULT_SAMPLERATE AgsLevelFlags AgsLevelButtonState AgsLevelKeyMask AgsLevelLayout AgsLevelAction ags_level_value_changed ags_level_new AGS_IS_LEVEL AGS_LEVEL AGS_LEVEL_CLASS AGS_LEVEL_GET_CLASS AGS_TYPE_LEVEL AgsLevel AgsLevelClass ags_level_get_type
ags_level_box AgsLevelBox AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT AgsLevelBoxFlags ags_level_box_new AGS_IS_LEVEL_BOX AGS_LEVEL_BOX AGS_LEVEL_BOX_CLASS AGS_LEVEL_BOX_GET_CLASS AGS_TYPE_LEVEL_BOX AgsLevelBox AgsLevelBoxClass ags_level_box_get_type
ags_notebook AgsNotebook AGS_NOTEBOOK_TAB AGS_NOTEBOOK_TAB_DEFAULT_WIDTH AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT AGS_NOTEBOOK_TAB_DEFAULT_PREFIX AgsNotebookFlags AgsNotebookTab ags_notebook_tab_alloc ags_notebook_tab_free ags_notebook_tab_set_data ags_notebook_tab_index ags_notebook_next_active_tab ags_notebook_add_tab ags_notebook_add_tab_with_label ags_notebook_insert_tab ags_notebook_insert_tab_with_label ags_notebook_remove_tab ags_notebook_remove_tab_with_data ags_notebook_new AGS_IS_NOTEBOOK AGS_NOTEBOOK AGS_NOTEBOOK_CLASS AGS_NOTEBOOK_GET_CLASS AGS_TYPE_NOTEBOOK AgsNotebook AgsNotebookClass ags_notebook_get_type
ags_piano AgsPiano AGS_PIANO_DEFAULT_BASE_NOTE AGS_PIANO_DEFAULT_BASE_KEY_CODE AGS_PIANO_DEFAULT_KEY_WIDTH AGS_PIANO_DEFAULT_KEY_HEIGHT AGS_PIANO_DEFAULT_KEY_COUNT AgsPianoFlags AgsPianoButtonState AgsPianoLayout AgsPianoAction AgsPianoOctave ags_piano_key_code_to_note ags_piano_key_pressed ags_piano_key_released ags_piano_key_clicked ags_piano_get_active_key ags_piano_new AGS_IS_PIANO AGS_PIANO AGS_PIANO_CLASS AGS_PIANO_GET_CLASS AGS_TYPE_PIANO AgsPiano AgsPianoClass ags_piano_get_type
ags_piano_keys AGS_PIANO_KEYS_OCTAVE_0_C AGS_PIANO_KEYS_OCTAVE_0_CIS AGS_PIANO_KEYS_OCTAVE_0_D AGS_PIANO_KEYS_OCTAVE_0_DIS AGS_PIANO_KEYS_OCTAVE_0_E AGS_PIANO_KEYS_OCTAVE_0_F AGS_PIANO_KEYS_OCTAVE_0_FIS AGS_PIANO_KEYS_OCTAVE_0_G AGS_PIANO_KEYS_OCTAVE_0_GIS AGS_PIANO_KEYS_OCTAVE_0_A AGS_PIANO_KEYS_OCTAVE_0_AIS AGS_PIANO_KEYS_OCTAVE_0_H AGS_PIANO_KEYS_OCTAVE_1_C AGS_PIANO_KEYS_OCTAVE_1_CIS AGS_PIANO_KEYS_OCTAVE_1_D AGS_PIANO_KEYS_OCTAVE_1_DIS AGS_PIANO_KEYS_OCTAVE_1_E AGS_PIANO_KEYS_OCTAVE_1_F AGS_PIANO_KEYS_OCTAVE_1_FIS AGS_PIANO_KEYS_OCTAVE_1_G AGS_PIANO_KEYS_OCTAVE_1_GIS AGS_PIANO_KEYS_OCTAVE_1_A AGS_PIANO_KEYS_OCTAVE_1_AIS AGS_PIANO_KEYS_OCTAVE_1_H AGS_PIANO_KEYS_OCTAVE_2_C AGS_PIANO_KEYS_OCTAVE_2_CIS AGS_PIANO_KEYS_OCTAVE_2_D AGS_PIANO_KEYS_OCTAVE_2_DIS AGS_PIANO_KEYS_OCTAVE_2_E AGS_PIANO_KEYS_OCTAVE_2_F AGS_PIANO_KEYS_OCTAVE_2_FIS AGS_PIANO_KEYS_OCTAVE_2_G AGS_PIANO_KEYS_OCTAVE_2_GIS AGS_PIANO_KEYS_OCTAVE_2_A AGS_PIANO_KEYS_OCTAVE_2_AIS AGS_PIANO_KEYS_OCTAVE_2_H AGS_PIANO_KEYS_OCTAVE_3_C AGS_PIANO_KEYS_OCTAVE_3_CIS AGS_PIANO_KEYS_OCTAVE_3_D AGS_PIANO_KEYS_OCTAVE_3_DIS AGS_PIANO_KEYS_OCTAVE_3_E AGS_PIANO_KEYS_OCTAVE_3_F AGS_PIANO_KEYS_OCTAVE_3_FIS AGS_PIANO_KEYS_OCTAVE_3_G AGS_PIANO_KEYS_OCTAVE_3_GIS AGS_PIANO_KEYS_OCTAVE_3_A AGS_PIANO_KEYS_OCTAVE_3_AIS AGS_PIANO_KEYS_OCTAVE_3_H AGS_PIANO_KEYS_OCTAVE_4_C AGS_PIANO_KEYS_OCTAVE_4_CIS AGS_PIANO_KEYS_OCTAVE_4_D AGS_PIANO_KEYS_OCTAVE_4_DIS AGS_PIANO_KEYS_OCTAVE_4_E AGS_PIANO_KEYS_OCTAVE_4_F AGS_PIANO_KEYS_OCTAVE_4_FIS AGS_PIANO_KEYS_OCTAVE_4_G AGS_PIANO_KEYS_OCTAVE_4_GIS AGS_PIANO_KEYS_OCTAVE_4_A AGS_PIANO_KEYS_OCTAVE_4_AIS AGS_PIANO_KEYS_OCTAVE_4_H AGS_PIANO_KEYS_OCTAVE_5_C AGS_PIANO_KEYS_OCTAVE_5_CIS AGS_PIANO_KEYS_OCTAVE_5_D AGS_PIANO_KEYS_OCTAVE_5_DIS AGS_PIANO_KEYS_OCTAVE_5_E AGS_PIANO_KEYS_OCTAVE_5_F AGS_PIANO_KEYS_OCTAVE_5_FIS AGS_PIANO_KEYS_OCTAVE_5_G AGS_PIANO_KEYS_OCTAVE_5_GIS AGS_PIANO_KEYS_OCTAVE_5_A AGS_PIANO_KEYS_OCTAVE_5_AIS AGS_PIANO_KEYS_OCTAVE_5_H AGS_PIANO_KEYS_OCTAVE_6_C AGS_PIANO_KEYS_OCTAVE_6_CIS AGS_PIANO_KEYS_OCTAVE_6_D AGS_PIANO_KEYS_OCTAVE_6_DIS AGS_PIANO_KEYS_OCTAVE_6_E AGS_PIANO_KEYS_OCTAVE_6_F AGS_PIANO_KEYS_OCTAVE_6_FIS AGS_PIANO_KEYS_OCTAVE_6_G AGS_PIANO_KEYS_OCTAVE_6_GIS AGS_PIANO_KEYS_OCTAVE_6_A AGS_PIANO_KEYS_OCTAVE_6_AIS AGS_PIANO_KEYS_OCTAVE_6_H AGS_PIANO_KEYS_OCTAVE_7_C AGS_PIANO_KEYS_OCTAVE_7_CIS AGS_PIANO_KEYS_OCTAVE_7_D AGS_PIANO_KEYS_OCTAVE_7_DIS AGS_PIANO_KEYS_OCTAVE_7_E AGS_PIANO_KEYS_OCTAVE_7_F AGS_PIANO_KEYS_OCTAVE_7_FIS AGS_PIANO_KEYS_OCTAVE_7_G AGS_PIANO_KEYS_OCTAVE_7_GIS AGS_PIANO_KEYS_OCTAVE_7_A AGS_PIANO_KEYS_OCTAVE_7_AIS AGS_PIANO_KEYS_OCTAVE_7_H AGS_PIANO_KEYS_OCTAVE_8_C AGS_PIANO_KEYS_OCTAVE_8_CIS AGS_PIANO_KEYS_OCTAVE_8_D AGS_PIANO_KEYS_OCTAVE_8_DIS AGS_PIANO_KEYS_OCTAVE_8_E AGS_PIANO_KEYS_OCTAVE_8_F AGS_PIANO_KEYS_OCTAVE_8_FIS AGS_PIANO_KEYS_OCTAVE_8_G AGS_PIANO_KEYS_OCTAVE_8_GIS AGS_PIANO_KEYS_OCTAVE_8_A AGS_PIANO_KEYS_OCTAVE_8_AIS AGS_PIANO_KEYS_OCTAVE_8_H AGS_PIANO_KEYS_OCTAVE_9_C AGS_PIANO_KEYS_OCTAVE_9_CIS AGS_PIANO_KEYS_OCTAVE_9_D AGS_PIANO_KEYS_OCTAVE_9_DIS AGS_PIANO_KEYS_OCTAVE_9_E AGS_PIANO_KEYS_OCTAVE_9_F AGS_PIANO_KEYS_OCTAVE_9_FIS AGS_PIANO_KEYS_OCTAVE_9_G AGS_PIANO_KEYS_OCTAVE_9_GIS AGS_PIANO_KEYS_OCTAVE_9_A AGS_PIANO_KEYS_OCTAVE_9_AIS AGS_PIANO_KEYS_OCTAVE_9_H AGS_PIANO_KEYS_OCTAVE_10_C AGS_PIANO_KEYS_OCTAVE_10_CIS AGS_PIANO_KEYS_OCTAVE_10_D AGS_PIANO_KEYS_OCTAVE_10_DIS AGS_PIANO_KEYS_OCTAVE_10_E AGS_PIANO_KEYS_OCTAVE_10_F AGS_PIANO_KEYS_OCTAVE_10_FIS AGS_PIANO_KEYS_OCTAVE_10_G AGS_PIANO_KEYS_OCTAVE_10_GIS AGS_PIANO_KEYS_OCTAVE_10_A AGS_PIANO_KEYS_OCTAVE_10_AIS AGS_PIANO_KEYS_OCTAVE_10_H
ags_ruler AgsRuler AGS_RULER_FONT_SIZE AGS_RULER_FREE_SPACE AGS_RULER_DEFAULT_HEIGHT AGS_RULER_DEFAULT_STEP AGS_RULER_DEFAULT_LARGE_STEP AGS_RULER_DEFAULT_SMALL_STEP ags_ruler_new AGS_IS_RULER AGS_RULER AGS_RULER_CLASS AGS_RULER_GET_CLASS AGS_TYPE_RULER AgsRuler AgsRulerClass ags_ruler_get_type
ags_scale AgsScale AGS_SCALE_DEFAULT_SCALE_WIDTH AGS_SCALE_DEFAULT_SCALE_HEIGHT AGS_SCALE_DEFAULT_LOWER AGS_SCALE_DEFAULT_UPPER AGS_SCALE_DEFAULT_VALUE AGS_SCALE_DEFAULT_STEP_COUNT AGS_SCALE_DEFAULT_PAGE_SIZE AgsScaleFlags AgsScaleButtonState AgsScaleKeyMask AgsScaleLayout AgsScaleAction ags_scale_value_changed ags_scale_new AGS_IS_SCALE AGS_SCALE AGS_SCALE_CLASS AGS_SCALE_GET_CLASS AGS_TYPE_SCALE AgsScale AgsScaleClass ags_scale_get_type
ags_scale_box AgsScaleBox AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT AgsScaleBoxFlags ags_scale_box_new AGS_IS_SCALE_BOX AGS_SCALE_BOX AGS_SCALE_BOX_CLASS AGS_SCALE_BOX_GET_CLASS AGS_TYPE_SCALE_BOX AgsScaleBox AgsScaleBoxClass ags_scale_box_get_type
ags_scrolled_level_box AgsScrolledLevelBox ags_scrolled_level_box_new AGS_IS_SCROLLED_LEVEL_BOX AGS_SCROLLED_LEVEL_BOX AGS_SCROLLED_LEVEL_BOX_CLASS AGS_SCROLLED_LEVEL_BOX_GET_CLASS AGS_TYPE_SCROLLED_LEVEL_BOX AgsScrolledLevelBox AgsScrolledLevelBoxClass ags_scrolled_level_box_get_type
ags_scrolled_piano AgsScrolledPiano ags_scrolled_piano_new AGS_IS_SCROLLED_PIANO AGS_SCROLLED_PIANO AGS_SCROLLED_PIANO_CLASS AGS_SCROLLED_PIANO_GET_CLASS AGS_TYPE_SCROLLED_PIANO AgsScrolledPiano AgsScrolledPianoClass ags_scrolled_piano_get_type
ags_scrolled_scale_box AgsScrolledScaleBox ags_scrolled_scale_box_new AGS_IS_SCROLLED_SCALE_BOX AGS_SCROLLED_SCALE_BOX AGS_SCROLLED_SCALE_BOX_CLASS AGS_SCROLLED_SCALE_BOX_GET_CLASS AGS_TYPE_SCROLLED_SCALE_BOX AgsScrolledScaleBox AgsScrolledScaleBoxClass ags_scrolled_scale_box_get_type
ags_vindicator AgsVIndicator AGS_VINDICATOR_DEFAULT_SEGMENT_WIDTH AGS_VINDICATOR_DEFAULT_SEGMENT_HEIGHT ags_vindicator_new AGS_IS_VINDICATOR AGS_TYPE_VINDICATOR AGS_VINDICATOR AGS_VINDICATOR_CLASS AGS_VINDICATOR_GET_CLASS AgsVIndicator AgsVIndicatorClass ags_vindicator_get_type
ags_vled_array AgsVLedArray ags_vled_array_new AGS_IS_VLED_ARRAY AGS_TYPE_VLED_ARRAY AGS_VLED_ARRAY AGS_VLED_ARRAY_CLASS AGS_VLED_ARRAY_GET_CLASS AgsVLedArray AgsVLedArrayClass ags_vled_array_get_type
ags_vlevel_box AgsVLevelBox ags_vlevel_box_new AGS_IS_VLEVEL_BOX AGS_TYPE_VLEVEL_BOX AGS_VLEVEL_BOX AGS_VLEVEL_BOX_CLASS AGS_VLEVEL_BOX_GET_CLASS AgsVLevelBox AgsVLevelBoxClass ags_vlevel_box_get_type
ags_vscale_box AgsVScaleBox ags_vscale_box_new AGS_IS_VSCALE_BOX AGS_TYPE_VSCALE_BOX AGS_VSCALE_BOX AGS_VSCALE_BOX_CLASS AGS_VSCALE_BOX_GET_CLASS AgsVScaleBox AgsVScaleBoxClass ags_vscale_box_get_type
ags_widget_marshal ags_widget_cclosure_marshal_VOID__STRING_INT
gsequencer-3.1.3/docs/reference/libags-gui/libags_gui.types.in0000644000175000017500000000246313607210263021316 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_cartesian_get_type ags_dial_get_type ags_expander_get_type ags_expander_set_get_type ags_hindicator_get_type ags_hled_array_get_type ags_hlevel_box_get_type ags_hscale_box_get_type ags_indicator_get_type ags_led_array_get_type ags_led_get_type ags_level_box_get_type ags_level_get_type ags_notebook_get_type ags_piano_get_type ags_ruler_get_type ags_scale_box_get_type ags_scale_get_type ags_scrolled_level_box_get_type ags_scrolled_piano_get_type ags_scrolled_scale_box_get_type ags_vindicator_get_type ags_vled_array_get_type ags_vlevel_box_get_type ags_vscale_box_get_type gsequencer-3.1.3/docs/reference/libags-gui/gtk-doc.make0000644000175000017500000002550313521306053017703 00000000000000# -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc if ENABLE_GTK_DOC all-local: all-gtk-doc endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp #### scan #### GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0=@echo " DOC Building XML"; sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ #### html #### GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libags-gui-html && mkdir libags-gui-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libags-gui-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libags-gui-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libags-gui-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libags-gui-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libags-gui-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp #### pdf #### GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libags-gui-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libags-gui-html install-data-local: @installfiles=`echo $(builddir)/libags-gui-html/*`; \ if test "$$installfiles" = '$(builddir)/libags-gui-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if HAVE_GTK_DOC dist-check-gtkdoc: docs else dist-check-gtkdoc: @echo "*** gtk-doc is needed to run 'make dist'. ***" @echo "*** gtk-doc was not found when 'configure' ran. ***" @echo "*** please install gtk-doc and rerun 'configure'. ***" @false endif dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libags-gui-html @cp ./libags-gui-html/* $(distdir)/libags-gui-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libags-gui-html .PHONY : dist-hook-local docs gsequencer-3.1.3/docs/reference/libags-gui/git.mk0000644000175000017500000002441413461636435016645 00000000000000# git.mk # # Copyright 2009, Red Hat, Inc. # Copyright 2010,2011,2012,2013 Behdad Esfahbod # Written by Behdad Esfahbod # # Copying and distribution of this file, with or without modification, # is permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # The latest version of this file can be downloaded from: # https://raw.github.com/behdad/git.mk/master/git.mk # Bugs, etc, should be reported upstream at: # https://github.com/behdad/git.mk # # To use in your project, import this file in your git repo's toplevel, # then do "make -f git.mk". This modifies all Makefile.am files in # your project to -include git.mk. Remember to add that line to new # Makefile.am files you create in your project, or just rerun the # "make -f git.mk". # # This enables automatic .gitignore generation. If you need to ignore # more files, add them to the GITIGNOREFILES variable in your Makefile.am. # But think twice before doing that. If a file has to be in .gitignore, # chances are very high that it's a generated file and should be in one # of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES. # # The only case that you need to manually add a file to GITIGNOREFILES is # when remove files in one of mostlyclean-local, clean-local, distclean-local, # or maintainer-clean-local make targets. # # Note that for files like editor backup, etc, there are better places to # ignore them. See "man gitignore". # # If "make maintainer-clean" removes the files but they are not recognized # by this script (that is, if "git status" shows untracked files still), send # me the output of "git status" as well as your Makefile.am and Makefile for # the directories involved and I'll diagnose. # # For a list of toplevel files that should be in MAINTAINERCLEANFILES, see # Makefile.am.sample in the git.mk git repo. # # Don't EXTRA_DIST this file. It is supposed to only live in git clones, # not tarballs. It serves no useful purpose in tarballs and clutters the # build dir. # # This file knows how to handle autoconf, automake, libtool, gtk-doc, # gnome-doc-utils, yelp.m4, mallard, intltool, gsettings, dejagnu, appdata, # appstream. # # This makefile provides the following targets: # # - all: "make all" will build all gitignore files. # - gitignore: makes all gitignore files in the current dir and subdirs. # - .gitignore: make gitignore file for the current dir. # - gitignore-recurse: makes all gitignore files in the subdirs. # # KNOWN ISSUES: # # - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the # submodule doesn't find us. If you have configure.{in,ac} files in # subdirs, add a proxy git.mk file in those dirs that simply does: # "include $(top_srcdir)/../git.mk". Add more ..'s to your taste. # And add those files to git. See vte/gnome-pty-helper/git.mk for # example. # ############################################################################### # Variables user modules may want to add to toplevel MAINTAINERCLEANFILES: ############################################################################### # # Most autotools-using modules should be fine including this variable in their # toplevel MAINTAINERCLEANFILES: GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL = \ $(srcdir)/aclocal.m4 \ $(srcdir)/autoscan.log \ $(srcdir)/configure.scan \ `AUX_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_AUX_DIR:$$1' ./configure.ac); \ test "x$$AUX_DIR" = "x$(srcdir)/" && AUX_DIR=$(srcdir); \ for x in \ ar-lib \ compile \ config.guess \ config.sub \ depcomp \ install-sh \ ltmain.sh \ missing \ mkinstalldirs \ test-driver \ ylwrap \ ; do echo "$$AUX_DIR/$$x"; done` \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_HEADERS:$$1' ./configure.ac | \ head -n 1 | while read f; do echo "$(srcdir)/$$f.in"; done` # # All modules should also be fine including the following variable, which # removes automake-generated Makefile.in files: GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN = \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_FILES:$$1' ./configure.ac | \ while read f; do \ case $$f in Makefile|*/Makefile) \ test -f "$(srcdir)/$$f.am" && echo "$(srcdir)/$$f.in";; esac; \ done` # # Modules that use libtool and use AC_CONFIG_MACRO_DIR() may also include this, # though it's harmless to include regardless. GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL = \ `MACRO_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_MACRO_DIR:$$1' ./configure.ac); \ if test "x$$MACRO_DIR" != "x$(srcdir)/"; then \ for x in \ libtool.m4 \ ltoptions.m4 \ ltsugar.m4 \ ltversion.m4 \ lt~obsolete.m4 \ ; do echo "$$MACRO_DIR/$$x"; done; \ fi` ############################################################################### # Default rule is to install ourselves in all Makefile.am files: ############################################################################### git-all: git-mk-install git-mk-install: @echo "Installing git makefile" @any_failed=; \ find "`test -z "$(top_srcdir)" && echo . || echo "$(top_srcdir)"`" -name Makefile.am | while read x; do \ if grep 'include .*/git.mk' $$x >/dev/null; then \ echo "$$x already includes git.mk"; \ else \ failed=; \ echo "Updating $$x"; \ { cat $$x; \ echo ''; \ echo '-include $$(top_srcdir)/git.mk'; \ } > $$x.tmp || failed=1; \ if test x$$failed = x; then \ mv $$x.tmp $$x || failed=1; \ fi; \ if test x$$failed = x; then : else \ echo "Failed updating $$x"; >&2 \ any_failed=1; \ fi; \ fi; done; test -z "$$any_failed" .PHONY: git-all git-mk-install ############################################################################### # Actual .gitignore generation: ############################################################################### $(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk @echo "git.mk: Generating $@" @{ \ if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \ for x in \ $(DOC_MODULE)-decl-list.txt \ $(DOC_MODULE)-decl.txt \ tmpl/$(DOC_MODULE)-unused.sgml \ "tmpl/*.bak" \ xml html \ ; do echo "/$$x"; done; \ FLAVOR=$$(cd $(top_srcdir); $(AUTOCONF) --trace 'GTK_DOC_CHECK:$$2' ./configure.ac); \ case $$FLAVOR in *no-tmpl*) echo /tmpl;; esac; \ fi; \ if test "x$(DOC_MODULE)$(DOC_ID)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \ for lc in $(DOC_LINGUAS); do \ for x in \ $(if $(DOC_MODULE),$(DOC_MODULE).xml) \ $(DOC_PAGES) \ $(DOC_INCLUDES) \ ; do echo "/$$lc/$$x"; done; \ done; \ for x in \ $(_DOC_OMF_ALL) \ $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) \ $(_DOC_MOFILES) \ $(DOC_H_FILE) \ "*/.xml2po.mo" \ "*/*.omf.out" \ ; do echo /$$x; done; \ fi; \ if test "x$(HELP_ID)" = x -o "x$(HELP_LINGUAS)" = x; then :; else \ for lc in $(HELP_LINGUAS); do \ for x in \ $(HELP_FILES) \ "$$lc.stamp" \ "$$lc.mo" \ ; do echo "/$$lc/$$x"; done; \ done; \ fi; \ if test "x$(gsettings_SCHEMAS)" = x; then :; else \ for x in \ $(gsettings_SCHEMAS:.xml=.valid) \ $(gsettings__enum_file) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appdata_XML)" = x; then :; else \ for x in \ $(appdata_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appstream_XML)" = x; then :; else \ for x in \ $(appstream_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/po/Makefile.in.in; then \ for x in \ po/Makefile.in.in \ po/Makefile.in.in~ \ po/Makefile.in \ po/Makefile \ po/Makevars.template \ po/POTFILES \ po/Rules-quot \ po/stamp-it \ po/.intltool-merge-cache \ "po/*.gmo" \ "po/*.header" \ "po/*.mo" \ "po/*.sed" \ "po/*.sin" \ po/$(GETTEXT_PACKAGE).pot \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/configure; then \ for x in \ autom4te.cache \ configure \ config.h \ stamp-h1 \ libtool \ config.lt \ ; do echo "/$$x"; done; \ fi; \ if test "x$(DEJATOOL)" = x; then :; else \ for x in \ $(DEJATOOL) \ ; do echo "/$$x.sum"; echo "/$$x.log"; done; \ echo /site.exp; \ fi; \ if test "x$(am__dirstamp)" = x; then :; else \ echo "$(am__dirstamp)"; \ fi; \ if test "x$(LTCOMPILE)" = x -a "x$(LTCXXCOMPILE)" = x -a "x$(GTKDOC_RUN)" = x; then :; else \ for x in \ "*.lo" \ ".libs" "_libs" \ ; do echo "$$x"; done; \ fi; \ for x in \ .gitignore \ $(GITIGNOREFILES) \ $(CLEANFILES) \ $(PROGRAMS) $(check_PROGRAMS) $(EXTRA_PROGRAMS) \ $(LIBRARIES) $(check_LIBRARIES) $(EXTRA_LIBRARIES) \ $(LTLIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LTLIBRARIES) \ so_locations \ $(MOSTLYCLEANFILES) \ $(TEST_LOGS) \ $(TEST_LOGS:.log=.trs) \ $(TEST_SUITE_LOG) \ "*.gcda" \ "*.gcno" \ $(DISTCLEANFILES) \ $(am__CONFIG_DISTCLEAN_FILES) \ $(CONFIG_CLEAN_FILES) \ TAGS ID GTAGS GRTAGS GSYMS GPATH tags \ "*.tab.c" \ $(MAINTAINERCLEANFILES) \ $(BUILT_SOURCES) \ $(patsubst %.vala,%.c,$(filter %.vala,$(SOURCES))) \ $(filter %_vala.stamp,$(DIST_COMMON)) \ $(filter %.vapi,$(DIST_COMMON)) \ $(filter $(addprefix %,$(notdir $(patsubst %.vapi,%.h,$(filter %.vapi,$(DIST_COMMON))))),$(DIST_COMMON)) \ Makefile \ Makefile.in \ "*.orig" \ "*.rej" \ "*.bak" \ "*~" \ ".*.sw[nop]" \ ".dirstamp" \ ; do echo "/$$x"; done; \ for x in \ "*.$(OBJEXT)" \ $(DEPDIR) \ ; do echo "$$x"; done; \ } | \ sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \ sed 's@/[.]/@/@g' | \ LC_ALL=C sort | uniq > $@.tmp && \ mv $@.tmp $@; all: $(srcdir)/.gitignore gitignore-recurse-maybe gitignore: $(srcdir)/.gitignore gitignore-recurse gitignore-recurse-maybe: @for subdir in $(DIST_SUBDIRS); do \ case " $(SUBDIRS) " in \ *" $$subdir "*) :;; \ *) test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir");; \ esac; \ done gitignore-recurse: @for subdir in $(DIST_SUBDIRS); do \ test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir"); \ done maintainer-clean: gitignore-clean gitignore-clean: -rm -f $(srcdir)/.gitignore .PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe gsequencer-3.1.3/docs/reference/libags-gui/Makefile.am0000644000175000017500000000661213606450525017560 00000000000000# This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=libags_gui # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE=$(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR=$(top_srcdir)/ags/widget # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS=--cflags="$(CFLAGS) $(GOBJECT_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) -L$(top_builddir) $(top_builddir)/libags_gui.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml --name-space=libags_gui --module=libags_gui # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS=--module=libags_gui --module-dir=./libags-gui-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libags-gui-doc/api # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB= CFILE_GLOB= # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES= # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files= # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files= AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=$(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags_gui.la # This includes the standard gtk-doc make rules, copied by gtkdocize. include ./gtk-doc.make # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk gsequencer-3.1.3/docs/reference/libags-gui/libags_gui.xml0000644000175000017500000000607713613101164020346 00000000000000 %gtkdocentities; ]> Advanced Gtk+ Sequencer UI Reference Manual for libags_gui. The latest version of this documentation can be found on-line at http://nongnu.org/gsequencer/api/&package_version;/libags-gui/. UI Widgets Object Hierarchy API Index Index of deprecated API gsequencer-3.1.3/docs/reference/libags-gui/libags_gui-sections.txt.in0000644000175000017500000003600413607210263022614 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see .
ags_cartesian AgsCartesian AGS_PLOT AGS_CARTESIAN_STEP_CONVERSION_FUNC AGS_CARTESIAN_TRANSLATE_FUNCT AGS_CARTESIAN_SCALE_FUNC AGS_CARTESIAN_LABEL_FUNC AGS_CARTESIAN_DEFAULT_X_MARGIN AGS_CARTESIAN_DEFAULT_Y_MARGIN AGS_CARTESIAN_DEFAULT_X_STEP_WIDTH AGS_CARTESIAN_DEFAULT_Y_STEP_HEIGHT AGS_CARTESIAN_DEFAULT_X_SCALE_STEP_WIDTH AGS_CARTESIAN_DEFAULT_Y_SCALE_STEP_HEIGHT AGS_CARTESIAN_DEFAULT_X_STEP AGS_CARTESIAN_DEFAULT_Y_STEP AGS_CARTESIAN_DEFAULT_X_START AGS_CARTESIAN_DEFAULT_X_END AGS_CARTESIAN_DEFAULT_Y_START AGS_CARTESIAN_DEFAULT_Y_END AGS_CARTESIAN_DEFAULT_X_LABEL_START AGS_CARTESIAN_DEFAULT_X_LABEL_STEP_WIDTH AGS_CARTESIAN_DEFAULT_Y_LABEL_START AGS_CARTESIAN_DEFAULT_Y_LABEL_STEP_HEIGHT AgsCartesianStepConversionFunc AgsCartesianTranslateFunc AgsCartesianScaleFunc AgsCartesianLabelFunc AgsCartesianFlags AgsPlotFillFlags AgsPlot ags_plot_alloc ags_plot_free ags_cartesian_add_plot ags_cartesian_remove_plot ags_cartesian_linear_step_conversion_func ags_cartesian_linear_translate_func ags_cartesian_linear_x_small_scale_func ags_cartesian_linear_x_big_scale_func ags_cartesian_linear_y_small_scale_func ags_cartesian_linear_y_big_scale_func ags_cartesian_linear_x_label_func ags_cartesian_linear_y_label_func ags_cartesian_reallocate_label ags_cartesian_fill_label ags_cartesian_new AGS_CARTESIAN AGS_CARTESIAN_CLASS AGS_CARTESIAN_GET_CLASS AGS_IS_CARTESIAN AGS_TYPE_CARTESIAN AgsCartesian AgsCartesianClass ags_cartesian_get_type
ags_container ags_container_add_all
ags_dial AgsDial AGS_DIAL_DEFAULT_PRECISION AGS_DIAL_DEFAULT_RADIUS AGS_DIAL_DEFAULT_OUTLINE_STRENGTH AGS_DIAL_DEFAULT_FONT_SIZE AGS_DIAL_DEFAULT_BUTTON_WIDTH AGS_DIAL_DEFAULT_BUTTON_HEIGHT AGS_DIAL_DEFAULT_MARGIN AGS_DIAL_DEFAULT_MARGIN_LEFT AGS_DIAL_DEFAULT_MARGIN_RIGHT AGS_DIAL_DEFAULT_HEIGHT AGS_DIAL_DEFAULT_WIDTH AgsDialFlags AgsDialAction ags_dial_value_changed ags_dial_set_value ags_dial_new AGS_DIAL AGS_DIAL_CLASS AGS_DIAL_GET_CLASS AGS_IS_DIAL AGS_TYPE_DIAL AgsDial AgsDialClass ags_dial_get_type
ags_expander AgsExpander AGS_EXPANDER_CHILD AgsExpanderFlags AgsExpanderChild ags_expander_child_alloc ags_expander_child_find ags_expander_add ags_expander_remove ags_expander_new AGS_EXPANDER AGS_EXPANDER_CLASS AGS_EXPANDER_GET_CLASS AGS_IS_EXPANDER AGS_TYPE_EXPANDER AgsExpander AgsExpanderClass ags_expander_get_type
ags_expander_set AgsExpanderSet AGS_EXPANDER_SET_CHILD AgsExpanderSetFlags AgsExpanderSetChild ags_expander_set_child_alloc ags_expander_set_child_find ags_expander_set_set_flags ags_expander_set_add ags_expander_set_remove ags_expander_set_new AGS_EXPANDER_SET AGS_EXPANDER_SET_CLASS AGS_EXPANDER_SET_GET_CLASS AGS_IS_EXPANDER_SET AGS_TYPE_EXPANDER_SET AgsExpanderSet AgsExpanderSetClass ags_expander_set_get_type
ags_hindicator AgsHIndicator AGS_HINDICATOR_DEFAULT_SEGMENT_WIDTH AGS_HINDICATOR_DEFAULT_SEGMENT_HEIGHT ags_hindicator_new AGS_HINDICATOR AGS_HINDICATOR_CLASS AGS_HINDICATOR_GET_CLASS AGS_IS_HINDICATOR AGS_TYPE_HINDICATOR AgsHIndicator AgsHIndicatorClass ags_hindicator_get_type
ags_hled_array AgsHLedArray ags_hled_array_new AGS_HLED_ARRAY AGS_HLED_ARRAY_CLASS AGS_HLED_ARRAY_GET_CLASS AGS_IS_HLED_ARRAY AGS_TYPE_HLED_ARRAY AgsHLedArray AgsHLedArrayClass ags_hled_array_get_type
ags_hlevel_box AgsHLevelBox ags_hlevel_box_new AGS_HLEVEL_BOX AGS_HLEVEL_BOX_CLASS AGS_HLEVEL_BOX_GET_CLASS AGS_IS_HLEVEL_BOX AGS_TYPE_HLEVEL_BOX AgsHLevelBox AgsHLevelBoxClass ags_hlevel_box_get_type
ags_hscale_box AgsHScaleBox ags_hscale_box_new AGS_HSCALE_BOX AGS_HSCALE_BOX_CLASS AGS_HSCALE_BOX_GET_CLASS AGS_IS_HSCALE_BOX AGS_TYPE_HSCALE_BOX AgsHScaleBox AgsHScaleBoxClass ags_hscale_box_get_type
ags_indicator AgsIndicator AGS_INDICATOR_DEFAULT_SEGMENT_WIDTH AGS_INDICATOR_DEFAULT_SEGMENT_HEIGHT AGS_INDICATOR_DEFAULT_SEGMENT_PADDING AGS_INDICATOR_DEFAULT_SEGMENT_COUNT ags_indicator_new AGS_INDICATOR AGS_INDICATOR_CLASS AGS_INDICATOR_GET_CLASS AGS_IS_INDICATOR AGS_TYPE_INDICATOR AgsIndicator AgsIndicatorClass ags_indicator_get_type
ags_led AgsLed AGS_LED_DEFAULT_WIDTH AGS_LED_DEFAULT_HEIGHT AgsLedFlags ags_led_set_active ags_led_unset_active ags_led_new AGS_IS_LED AGS_LED AGS_LED_CLASS AGS_LED_GET_CLASS AGS_TYPE_LED AgsLed AgsLedClass ags_led_get_type
ags_led_array AgsLedArray AGS_LED_ARRAY_DEFAULT_LED_WIDTH AGS_LED_ARRAY_DEFAULT_LED_HEIGHT AgsLedArrayFlags ags_led_array_set_led_count ags_led_array_unset_all ags_led_array_set_nth ags_led_array_new AGS_IS_LED_ARRAY AGS_LED_ARRAY AGS_LED_ARRAY_CLASS AGS_LED_ARRAY_GET_CLASS AGS_TYPE_LED_ARRAY AgsLedArray AgsLedArrayClass ags_led_array_get_type
ags_level AgsLevel AGS_LEVEL_DEFAULT_LEVEL_WIDTH AGS_LEVEL_DEFAULT_LEVEL_HEIGHT AGS_LEVEL_DEFAULT_LOWER AGS_LEVEL_DEFAULT_UPPER AGS_LEVEL_DEFAULT_NORMALIZED_VOLUME AGS_LEVEL_DEFAULT_STEP_COUNT AGS_LEVEL_DEFAULT_PAGE_SIZE AGS_LEVEL_DEFAULT_SAMPLERATE AgsLevelFlags AgsLevelButtonState AgsLevelKeyMask AgsLevelLayout AgsLevelAction ags_level_value_changed ags_level_new AGS_IS_LEVEL AGS_LEVEL AGS_LEVEL_CLASS AGS_LEVEL_GET_CLASS AGS_TYPE_LEVEL AgsLevel AgsLevelClass ags_level_get_type
ags_level_box AgsLevelBox AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_WIDTH AGS_LEVEL_BOX_DEFAULT_FIXED_LEVEL_HEIGHT AgsLevelBoxFlags ags_level_box_new AGS_IS_LEVEL_BOX AGS_LEVEL_BOX AGS_LEVEL_BOX_CLASS AGS_LEVEL_BOX_GET_CLASS AGS_TYPE_LEVEL_BOX AgsLevelBox AgsLevelBoxClass ags_level_box_get_type
ags_notebook AgsNotebook AGS_NOTEBOOK_TAB AGS_NOTEBOOK_TAB_DEFAULT_WIDTH AGS_NOTEBOOK_TAB_DEFAULT_HEIGHT AGS_NOTEBOOK_TAB_DEFAULT_PREFIX AgsNotebookFlags AgsNotebookTab ags_notebook_tab_alloc ags_notebook_tab_free ags_notebook_tab_set_data ags_notebook_tab_index ags_notebook_next_active_tab ags_notebook_add_tab ags_notebook_add_tab_with_label ags_notebook_insert_tab ags_notebook_insert_tab_with_label ags_notebook_remove_tab ags_notebook_remove_tab_with_data ags_notebook_new AGS_IS_NOTEBOOK AGS_NOTEBOOK AGS_NOTEBOOK_CLASS AGS_NOTEBOOK_GET_CLASS AGS_TYPE_NOTEBOOK AgsNotebook AgsNotebookClass ags_notebook_get_type
ags_piano AgsPiano AGS_PIANO_DEFAULT_BASE_NOTE AGS_PIANO_DEFAULT_BASE_KEY_CODE AGS_PIANO_DEFAULT_KEY_WIDTH AGS_PIANO_DEFAULT_KEY_HEIGHT AGS_PIANO_DEFAULT_KEY_COUNT AgsPianoFlags AgsPianoButtonState AgsPianoLayout AgsPianoAction AgsPianoOctave ags_piano_key_code_to_note ags_piano_key_pressed ags_piano_key_released ags_piano_key_clicked ags_piano_get_active_key ags_piano_new AGS_IS_PIANO AGS_PIANO AGS_PIANO_CLASS AGS_PIANO_GET_CLASS AGS_TYPE_PIANO AgsPiano AgsPianoClass ags_piano_get_type
ags_piano_keys AGS_PIANO_KEYS_OCTAVE_0_C AGS_PIANO_KEYS_OCTAVE_0_CIS AGS_PIANO_KEYS_OCTAVE_0_D AGS_PIANO_KEYS_OCTAVE_0_DIS AGS_PIANO_KEYS_OCTAVE_0_E AGS_PIANO_KEYS_OCTAVE_0_F AGS_PIANO_KEYS_OCTAVE_0_FIS AGS_PIANO_KEYS_OCTAVE_0_G AGS_PIANO_KEYS_OCTAVE_0_GIS AGS_PIANO_KEYS_OCTAVE_0_A AGS_PIANO_KEYS_OCTAVE_0_AIS AGS_PIANO_KEYS_OCTAVE_0_H AGS_PIANO_KEYS_OCTAVE_1_C AGS_PIANO_KEYS_OCTAVE_1_CIS AGS_PIANO_KEYS_OCTAVE_1_D AGS_PIANO_KEYS_OCTAVE_1_DIS AGS_PIANO_KEYS_OCTAVE_1_E AGS_PIANO_KEYS_OCTAVE_1_F AGS_PIANO_KEYS_OCTAVE_1_FIS AGS_PIANO_KEYS_OCTAVE_1_G AGS_PIANO_KEYS_OCTAVE_1_GIS AGS_PIANO_KEYS_OCTAVE_1_A AGS_PIANO_KEYS_OCTAVE_1_AIS AGS_PIANO_KEYS_OCTAVE_1_H AGS_PIANO_KEYS_OCTAVE_2_C AGS_PIANO_KEYS_OCTAVE_2_CIS AGS_PIANO_KEYS_OCTAVE_2_D AGS_PIANO_KEYS_OCTAVE_2_DIS AGS_PIANO_KEYS_OCTAVE_2_E AGS_PIANO_KEYS_OCTAVE_2_F AGS_PIANO_KEYS_OCTAVE_2_FIS AGS_PIANO_KEYS_OCTAVE_2_G AGS_PIANO_KEYS_OCTAVE_2_GIS AGS_PIANO_KEYS_OCTAVE_2_A AGS_PIANO_KEYS_OCTAVE_2_AIS AGS_PIANO_KEYS_OCTAVE_2_H AGS_PIANO_KEYS_OCTAVE_3_C AGS_PIANO_KEYS_OCTAVE_3_CIS AGS_PIANO_KEYS_OCTAVE_3_D AGS_PIANO_KEYS_OCTAVE_3_DIS AGS_PIANO_KEYS_OCTAVE_3_E AGS_PIANO_KEYS_OCTAVE_3_F AGS_PIANO_KEYS_OCTAVE_3_FIS AGS_PIANO_KEYS_OCTAVE_3_G AGS_PIANO_KEYS_OCTAVE_3_GIS AGS_PIANO_KEYS_OCTAVE_3_A AGS_PIANO_KEYS_OCTAVE_3_AIS AGS_PIANO_KEYS_OCTAVE_3_H AGS_PIANO_KEYS_OCTAVE_4_C AGS_PIANO_KEYS_OCTAVE_4_CIS AGS_PIANO_KEYS_OCTAVE_4_D AGS_PIANO_KEYS_OCTAVE_4_DIS AGS_PIANO_KEYS_OCTAVE_4_E AGS_PIANO_KEYS_OCTAVE_4_F AGS_PIANO_KEYS_OCTAVE_4_FIS AGS_PIANO_KEYS_OCTAVE_4_G AGS_PIANO_KEYS_OCTAVE_4_GIS AGS_PIANO_KEYS_OCTAVE_4_A AGS_PIANO_KEYS_OCTAVE_4_AIS AGS_PIANO_KEYS_OCTAVE_4_H AGS_PIANO_KEYS_OCTAVE_5_C AGS_PIANO_KEYS_OCTAVE_5_CIS AGS_PIANO_KEYS_OCTAVE_5_D AGS_PIANO_KEYS_OCTAVE_5_DIS AGS_PIANO_KEYS_OCTAVE_5_E AGS_PIANO_KEYS_OCTAVE_5_F AGS_PIANO_KEYS_OCTAVE_5_FIS AGS_PIANO_KEYS_OCTAVE_5_G AGS_PIANO_KEYS_OCTAVE_5_GIS AGS_PIANO_KEYS_OCTAVE_5_A AGS_PIANO_KEYS_OCTAVE_5_AIS AGS_PIANO_KEYS_OCTAVE_5_H AGS_PIANO_KEYS_OCTAVE_6_C AGS_PIANO_KEYS_OCTAVE_6_CIS AGS_PIANO_KEYS_OCTAVE_6_D AGS_PIANO_KEYS_OCTAVE_6_DIS AGS_PIANO_KEYS_OCTAVE_6_E AGS_PIANO_KEYS_OCTAVE_6_F AGS_PIANO_KEYS_OCTAVE_6_FIS AGS_PIANO_KEYS_OCTAVE_6_G AGS_PIANO_KEYS_OCTAVE_6_GIS AGS_PIANO_KEYS_OCTAVE_6_A AGS_PIANO_KEYS_OCTAVE_6_AIS AGS_PIANO_KEYS_OCTAVE_6_H AGS_PIANO_KEYS_OCTAVE_7_C AGS_PIANO_KEYS_OCTAVE_7_CIS AGS_PIANO_KEYS_OCTAVE_7_D AGS_PIANO_KEYS_OCTAVE_7_DIS AGS_PIANO_KEYS_OCTAVE_7_E AGS_PIANO_KEYS_OCTAVE_7_F AGS_PIANO_KEYS_OCTAVE_7_FIS AGS_PIANO_KEYS_OCTAVE_7_G AGS_PIANO_KEYS_OCTAVE_7_GIS AGS_PIANO_KEYS_OCTAVE_7_A AGS_PIANO_KEYS_OCTAVE_7_AIS AGS_PIANO_KEYS_OCTAVE_7_H AGS_PIANO_KEYS_OCTAVE_8_C AGS_PIANO_KEYS_OCTAVE_8_CIS AGS_PIANO_KEYS_OCTAVE_8_D AGS_PIANO_KEYS_OCTAVE_8_DIS AGS_PIANO_KEYS_OCTAVE_8_E AGS_PIANO_KEYS_OCTAVE_8_F AGS_PIANO_KEYS_OCTAVE_8_FIS AGS_PIANO_KEYS_OCTAVE_8_G AGS_PIANO_KEYS_OCTAVE_8_GIS AGS_PIANO_KEYS_OCTAVE_8_A AGS_PIANO_KEYS_OCTAVE_8_AIS AGS_PIANO_KEYS_OCTAVE_8_H AGS_PIANO_KEYS_OCTAVE_9_C AGS_PIANO_KEYS_OCTAVE_9_CIS AGS_PIANO_KEYS_OCTAVE_9_D AGS_PIANO_KEYS_OCTAVE_9_DIS AGS_PIANO_KEYS_OCTAVE_9_E AGS_PIANO_KEYS_OCTAVE_9_F AGS_PIANO_KEYS_OCTAVE_9_FIS AGS_PIANO_KEYS_OCTAVE_9_G AGS_PIANO_KEYS_OCTAVE_9_GIS AGS_PIANO_KEYS_OCTAVE_9_A AGS_PIANO_KEYS_OCTAVE_9_AIS AGS_PIANO_KEYS_OCTAVE_9_H AGS_PIANO_KEYS_OCTAVE_10_C AGS_PIANO_KEYS_OCTAVE_10_CIS AGS_PIANO_KEYS_OCTAVE_10_D AGS_PIANO_KEYS_OCTAVE_10_DIS AGS_PIANO_KEYS_OCTAVE_10_E AGS_PIANO_KEYS_OCTAVE_10_F AGS_PIANO_KEYS_OCTAVE_10_FIS AGS_PIANO_KEYS_OCTAVE_10_G AGS_PIANO_KEYS_OCTAVE_10_GIS AGS_PIANO_KEYS_OCTAVE_10_A AGS_PIANO_KEYS_OCTAVE_10_AIS AGS_PIANO_KEYS_OCTAVE_10_H
ags_ruler AgsRuler AGS_RULER_FONT_SIZE AGS_RULER_FREE_SPACE AGS_RULER_DEFAULT_HEIGHT AGS_RULER_DEFAULT_STEP AGS_RULER_DEFAULT_LARGE_STEP AGS_RULER_DEFAULT_SMALL_STEP ags_ruler_new AGS_IS_RULER AGS_RULER AGS_RULER_CLASS AGS_RULER_GET_CLASS AGS_TYPE_RULER AgsRuler AgsRulerClass ags_ruler_get_type
ags_scale AgsScale AGS_SCALE_DEFAULT_SCALE_WIDTH AGS_SCALE_DEFAULT_SCALE_HEIGHT AGS_SCALE_DEFAULT_LOWER AGS_SCALE_DEFAULT_UPPER AGS_SCALE_DEFAULT_VALUE AGS_SCALE_DEFAULT_STEP_COUNT AGS_SCALE_DEFAULT_PAGE_SIZE AgsScaleFlags AgsScaleButtonState AgsScaleKeyMask AgsScaleLayout AgsScaleAction ags_scale_value_changed ags_scale_new AGS_IS_SCALE AGS_SCALE AGS_SCALE_CLASS AGS_SCALE_GET_CLASS AGS_TYPE_SCALE AgsScale AgsScaleClass ags_scale_get_type
ags_scale_box AgsScaleBox AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_WIDTH AGS_SCALE_BOX_DEFAULT_FIXED_SCALE_HEIGHT AgsScaleBoxFlags ags_scale_box_new AGS_IS_SCALE_BOX AGS_SCALE_BOX AGS_SCALE_BOX_CLASS AGS_SCALE_BOX_GET_CLASS AGS_TYPE_SCALE_BOX AgsScaleBox AgsScaleBoxClass ags_scale_box_get_type
ags_scrolled_level_box AgsScrolledLevelBox ags_scrolled_level_box_new AGS_IS_SCROLLED_LEVEL_BOX AGS_SCROLLED_LEVEL_BOX AGS_SCROLLED_LEVEL_BOX_CLASS AGS_SCROLLED_LEVEL_BOX_GET_CLASS AGS_TYPE_SCROLLED_LEVEL_BOX AgsScrolledLevelBox AgsScrolledLevelBoxClass ags_scrolled_level_box_get_type
ags_scrolled_piano AgsScrolledPiano ags_scrolled_piano_new AGS_IS_SCROLLED_PIANO AGS_SCROLLED_PIANO AGS_SCROLLED_PIANO_CLASS AGS_SCROLLED_PIANO_GET_CLASS AGS_TYPE_SCROLLED_PIANO AgsScrolledPiano AgsScrolledPianoClass ags_scrolled_piano_get_type
ags_scrolled_scale_box AgsScrolledScaleBox ags_scrolled_scale_box_new AGS_IS_SCROLLED_SCALE_BOX AGS_SCROLLED_SCALE_BOX AGS_SCROLLED_SCALE_BOX_CLASS AGS_SCROLLED_SCALE_BOX_GET_CLASS AGS_TYPE_SCROLLED_SCALE_BOX AgsScrolledScaleBox AgsScrolledScaleBoxClass ags_scrolled_scale_box_get_type
ags_vindicator AgsVIndicator AGS_VINDICATOR_DEFAULT_SEGMENT_WIDTH AGS_VINDICATOR_DEFAULT_SEGMENT_HEIGHT ags_vindicator_new AGS_IS_VINDICATOR AGS_TYPE_VINDICATOR AGS_VINDICATOR AGS_VINDICATOR_CLASS AGS_VINDICATOR_GET_CLASS AgsVIndicator AgsVIndicatorClass ags_vindicator_get_type
ags_vled_array AgsVLedArray ags_vled_array_new AGS_IS_VLED_ARRAY AGS_TYPE_VLED_ARRAY AGS_VLED_ARRAY AGS_VLED_ARRAY_CLASS AGS_VLED_ARRAY_GET_CLASS AgsVLedArray AgsVLedArrayClass ags_vled_array_get_type
ags_vlevel_box AgsVLevelBox ags_vlevel_box_new AGS_IS_VLEVEL_BOX AGS_TYPE_VLEVEL_BOX AGS_VLEVEL_BOX AGS_VLEVEL_BOX_CLASS AGS_VLEVEL_BOX_GET_CLASS AgsVLevelBox AgsVLevelBoxClass ags_vlevel_box_get_type
ags_vscale_box AgsVScaleBox ags_vscale_box_new AGS_IS_VSCALE_BOX AGS_TYPE_VSCALE_BOX AGS_VSCALE_BOX AGS_VSCALE_BOX_CLASS AGS_VSCALE_BOX_GET_CLASS AgsVScaleBox AgsVScaleBoxClass ags_vscale_box_get_type
ags_widget_marshal ags_widget_cclosure_marshal_VOID__STRING_INT
gsequencer-3.1.3/docs/reference/libags-audio/0000755000175000017500000000000013622252264016112 500000000000000gsequencer-3.1.3/docs/reference/libags-audio/libags_audio-sections.txt0000644000175000017500000046606313622252234023056 00000000000000
ags_acceleration AgsAcceleration AGS_ACCELERATION_GET_OBJ_MUTEX AgsAccelerationFlags ags_acceleration_test_flags ags_acceleration_set_flags ags_acceleration_unset_flags ags_acceleration_sort_func ags_acceleration_duplicate ags_acceleration_new AGS_ACCELERATION AGS_ACCELERATION_CLASS AGS_ACCELERATION_GET_CLASS AGS_IS_ACCELERATION AGS_TYPE_ACCELERATION AgsAcceleration AgsAccelerationClass ags_acceleration_get_type
ags_add_audio AgsAddAudio ags_add_audio_new AGS_ADD_AUDIO AGS_ADD_AUDIO_CLASS AGS_ADD_AUDIO_GET_CLASS AGS_IS_ADD_AUDIO AGS_TYPE_ADD_AUDIO AgsAddAudio AgsAddAudioClass ags_add_audio_get_type
ags_add_audio_signal AgsAddAudioSignal ags_add_audio_signal_new AGS_ADD_AUDIO_SIGNAL AGS_ADD_AUDIO_SIGNAL_CLASS AGS_ADD_AUDIO_SIGNAL_GET_CLASS AGS_IS_ADD_AUDIO_SIGNAL AGS_TYPE_ADD_AUDIO_SIGNAL AgsAddAudioSignal AgsAddAudioSignalClass ags_add_audio_signal_get_type
ags_add_effect AgsAddEffect ags_add_effect_new AGS_ADD_EFFECT AGS_ADD_EFFECT_CLASS AGS_ADD_EFFECT_GET_CLASS AGS_IS_ADD_EFFECT AGS_TYPE_ADD_EFFECT AgsAddEffect AgsAddEffectClass ags_add_effect_get_type
ags_add_note AgsAddNote ags_add_note_new AGS_ADD_NOTE AGS_ADD_NOTE_CLASS AGS_ADD_NOTE_GET_CLASS AGS_IS_ADD_NOTE AGS_TYPE_ADD_NOTE AgsAddNote AgsAddNoteClass ags_add_note_get_type
ags_add_soundcard AgsAddSoundcard ags_add_soundcard_new AGS_ADD_SOUNDCARD AGS_ADD_SOUNDCARD_CLASS AGS_ADD_SOUNDCARD_GET_CLASS AGS_IS_ADD_SOUNDCARD AGS_TYPE_ADD_SOUNDCARD AgsAddSoundcard AgsAddSoundcardClass ags_add_soundcard_get_type
ags_analyse_audio_signal AgsAnalyseAudioSignal ags_analyse_audio_signal_new AGS_ANALYSE_AUDIO_SIGNAL AGS_ANALYSE_AUDIO_SIGNAL_CLASS AGS_ANALYSE_AUDIO_SIGNAL_GET_CLASS AGS_IS_ANALYSE_AUDIO_SIGNAL AGS_TYPE_ANALYSE_AUDIO_SIGNAL AgsAnalyseAudioSignal AgsAnalyseAudioSignalClass ags_analyse_audio_signal_get_type
ags_analyse_channel AgsAnalyseChannel AGS_ANALYSE_CHANNEL_GET_BUFFER_MUTEX ags_analyse_channel_buffer_add ags_analyse_channel_retrieve_frequency_and_magnitude ags_analyse_channel_new AGS_ANALYSE_CHANNEL AGS_ANALYSE_CHANNEL_CLASS AGS_ANALYSE_CHANNEL_GET_CLASS AGS_IS_ANALYSE_CHANNEL AGS_TYPE_ANALYSE_CHANNEL AgsAnalyseChannel AgsAnalyseChannelClass ags_analyse_channel_get_type
ags_analyse_channel_run AgsAnalyseChannelRun ags_analyse_channel_run_new AGS_ANALYSE_CHANNEL_RUN AGS_ANALYSE_CHANNEL_RUN_CLASS AGS_ANALYSE_CHANNEL_RUN_GET_CLASS AGS_IS_ANALYSE_CHANNEL_RUN AGS_TYPE_ANALYSE_CHANNEL_RUN AgsAnalyseChannelRun AgsAnalyseChannelRunClass ags_analyse_channel_run_get_type
ags_analyse_recycling AgsAnalyseRecycling ags_analyse_recycling_new AGS_ANALYSE_RECYCLING AGS_ANALYSE_RECYCLING_CLASS AGS_ANALYSE_RECYCLING_GET_CLASS AGS_IS_ANALYSE_RECYCLING AGS_TYPE_ANALYSE_RECYCLING AgsAnalyseRecycling AgsAnalyseRecyclingClass ags_analyse_recycling_get_type
ags_apply_bpm AgsApplyBpm ags_apply_bpm_new AGS_APPLY_BPM AGS_APPLY_BPM_CLASS AGS_APPLY_BPM_GET_CLASS AGS_IS_APPLY_BPM AGS_TYPE_APPLY_BPM AgsApplyBpm AgsApplyBpmClass ags_apply_bpm_get_type
ags_apply_presets AgsApplyPresets ags_apply_presets_soundcard ags_apply_presets_new AGS_APPLY_PRESETS AGS_APPLY_PRESETS_CLASS AGS_APPLY_PRESETS_GET_CLASS AGS_IS_APPLY_PRESETS AGS_TYPE_APPLY_PRESETS AgsApplyPresets AgsApplyPresetsClass ags_apply_presets_get_type
ags_apply_sequencer_length AgsApplySequencerLength ags_apply_sequencer_length_new AGS_APPLY_SEQUENCER_LENGTH AGS_APPLY_SEQUENCER_LENGTH_CLASS AGS_APPLY_SEQUENCER_LENGTH_GET_CLASS AGS_IS_APPLY_SEQUENCER_LENGTH AGS_TYPE_APPLY_SEQUENCER_LENGTH AgsApplySequencerLength AgsApplySequencerLengthClass ags_apply_sequencer_length_get_type
ags_apply_sound_config AgsApplySoundConfig ags_apply_sound_config_new AGS_APPLY_SOUND_CONFIG AGS_APPLY_SOUND_CONFIG_CLASS AGS_APPLY_SOUND_CONFIG_GET_CLASS AGS_IS_APPLY_SOUND_CONFIG AGS_TYPE_APPLY_SOUND_CONFIG AgsApplySoundConfig AgsApplySoundConfigClass ags_apply_sound_config_get_type
ags_apply_synth AgsApplySynth ags_apply_synth_new AGS_APPLY_SYNTH AGS_APPLY_SYNTH_CLASS AGS_APPLY_SYNTH_GET_CLASS AGS_IS_APPLY_SYNTH AGS_TYPE_APPLY_SYNTH AgsApplySynth AgsApplySynthClass ags_apply_synth_get_type
ags_apply_tact AgsApplyTact ags_apply_tact_new AGS_APPLY_TACT AGS_APPLY_TACT_CLASS AGS_APPLY_TACT_GET_CLASS AGS_IS_APPLY_TACT AGS_TYPE_APPLY_TACT AgsApplyTact AgsApplyTactClass ags_apply_tact_get_type
ags_audio AgsAudio AGS_AUDIO_GET_OBJ_MUTEX AGS_AUDIO_GET_PLAY_MUTEX AGS_AUDIO_GET_RECALL_MUTEX AgsAudioFlags ags_audio_test_flags ags_audio_set_flags ags_audio_unset_flags ags_audio_test_ability_flags ags_audio_set_ability_flags ags_audio_unset_ability_flags ags_audio_test_behaviour_flags ags_audio_set_behaviour_flags ags_audio_unset_behaviour_flags ags_audio_test_staging_flags ags_audio_set_staging_flags ags_audio_unset_staging_flags ags_audio_find_name ags_audio_set_max_audio_channels ags_audio_set_max_pads ags_audio_set_audio_channels ags_audio_set_pads ags_audio_set_output_soundcard ags_audio_set_input_soundcard ags_audio_set_output_sequencer ags_audio_set_input_sequencer ags_audio_set_samplerate ags_audio_set_buffer_size ags_audio_set_format ags_audio_add_preset ags_audio_remove_preset ags_audio_add_synth_generator ags_audio_remove_synth_generator ags_audio_add_cursor ags_audio_remove_cursor ags_audio_add_notation ags_audio_remove_notation ags_audio_add_automation_port ags_audio_remove_automation_port ags_audio_add_automation ags_audio_remove_automation ags_audio_add_wave ags_audio_remove_wave ags_audio_add_midi ags_audio_remove_midi ags_audio_add_recall_id ags_audio_remove_recall_id ags_audio_add_recycling_context ags_audio_remove_recycling_context ags_audio_add_recall_container ags_audio_remove_recall_container ags_audio_add_recall ags_audio_remove_recall ags_audio_duplicate_recall ags_audio_resolve_recall ags_audio_init_recall ags_audio_play_recall ags_audio_done_recall ags_audio_cancel_recall ags_audio_cleanup_recall ags_audio_start ags_audio_stop ags_audio_check_scope ags_audio_collect_all_audio_ports ags_audio_collect_all_audio_ports_by_specifier_and_context ags_audio_open_audio_file_as_channel ags_audio_open_audio_file_as_wave ags_audio_open_midi_file_as_midi ags_audio_open_midi_file_as_notation ags_audio_recursive_set_property ags_audio_recursive_run_stage ags_audio_new AGS_AUDIO AGS_AUDIO_CLASS AGS_AUDIO_GET_CLASS AGS_IS_AUDIO AGS_TYPE_AUDIO AgsAudio AgsAudioClass ags_audio_get_type
ags_audio_application_context AgsAudioApplicationContext AGS_AUDIO_DEFAULT_VERSION AGS_AUDIO_BUILD_ID AGS_EFFECTS_DEFAULT_VERSION ags_audio_application_context_new AGS_AUDIO_APPLICATION_CONTEXT AGS_AUDIO_APPLICATION_CONTEXT_CLASS AGS_AUDIO_APPLICATION_CONTEXT_GET_CLASS AGS_IS_AUDIO_APPLICATION_CONTEXT AGS_TYPE_AUDIO_APPLICATION_CONTEXT AgsAudioApplicationContext AgsAudioApplicationContextClass ags_audio_application_context_get_type
ags_audio_buffer_util AGS_AUDIO_BUFFER_S8 AGS_AUDIO_BUFFER_S16 AGS_AUDIO_BUFFER_S24 AGS_AUDIO_BUFFER_S32 AGS_AUDIO_BUFFER_S64 AGS_AUDIO_BUFFER_FLOAT AGS_AUDIO_BUFFER_DOUBLE AGS_AUDIO_BUFFER_COMPLEX AgsAudioBufferUtilFormat AgsAudioBufferUtilSamplerate AgsAudioBufferUtilCopyMode ags_audio_buffer_util_format_from_soundcard ags_audio_buffer_util_get_copy_mode ags_audio_buffer_util_clear_float ags_audio_buffer_util_clear_float32 ags_audio_buffer_util_clear_double ags_audio_buffer_util_clear_complex ags_audio_buffer_util_clear_buffer ags_audio_buffer_util_envelope_s8 ags_audio_buffer_util_envelope_s16 ags_audio_buffer_util_envelope_s24 ags_audio_buffer_util_envelope_s32 ags_audio_buffer_util_envelope_s64 ags_audio_buffer_util_envelope_float ags_audio_buffer_util_envelope_double ags_audio_buffer_util_envelope_complex ags_audio_buffer_util_envelope ags_audio_buffer_util_volume_s8 ags_audio_buffer_util_volume_s16 ags_audio_buffer_util_volume_s24 ags_audio_buffer_util_volume_s32 ags_audio_buffer_util_volume_s64 ags_audio_buffer_util_volume_float ags_audio_buffer_util_volume_double ags_audio_buffer_util_volume_complex ags_audio_buffer_util_volume ags_audio_buffer_util_peak_s8 ags_audio_buffer_util_peak_s16 ags_audio_buffer_util_peak_s24 ags_audio_buffer_util_peak_s32 ags_audio_buffer_util_peak_s64 ags_audio_buffer_util_peak_float ags_audio_buffer_util_peak_double ags_audio_buffer_util_peak_complex ags_audio_buffer_util_peak ags_audio_buffer_util_resample_s8 ags_audio_buffer_util_resample_s16 ags_audio_buffer_util_resample_s24 ags_audio_buffer_util_resample_s32 ags_audio_buffer_util_resample_s64 ags_audio_buffer_util_resample_float ags_audio_buffer_util_resample_double ags_audio_buffer_util_resample_complex ags_audio_buffer_util_resample ags_audio_buffer_util_resample_s8_with_buffer ags_audio_buffer_util_resample_s16_with_buffer ags_audio_buffer_util_resample_s24_with_buffer ags_audio_buffer_util_resample_s32_with_buffer ags_audio_buffer_util_resample_s64_with_buffer ags_audio_buffer_util_resample_float_with_buffer ags_audio_buffer_util_resample_double_with_buffer ags_audio_buffer_util_resample_complex_with_buffer ags_audio_buffer_util_resample_with_buffer ags_audio_buffer_util_copy_s8_to_s8 ags_audio_buffer_util_copy_s8_to_s16 ags_audio_buffer_util_copy_s8_to_s24 ags_audio_buffer_util_copy_s8_to_s32 ags_audio_buffer_util_copy_s8_to_s64 ags_audio_buffer_util_copy_s8_to_float ags_audio_buffer_util_copy_s8_to_double ags_audio_buffer_util_copy_s16_to_s8 ags_audio_buffer_util_copy_s16_to_s16 ags_audio_buffer_util_copy_s16_to_s24 ags_audio_buffer_util_copy_s16_to_s32 ags_audio_buffer_util_copy_s16_to_s64 ags_audio_buffer_util_copy_s16_to_float ags_audio_buffer_util_copy_s16_to_double ags_audio_buffer_util_copy_s24_to_s8 ags_audio_buffer_util_copy_s24_to_s16 ags_audio_buffer_util_copy_s24_to_s24 ags_audio_buffer_util_copy_s24_to_s32 ags_audio_buffer_util_copy_s24_to_s64 ags_audio_buffer_util_copy_s24_to_float ags_audio_buffer_util_copy_s24_to_double ags_audio_buffer_util_copy_s32_to_s8 ags_audio_buffer_util_copy_s32_to_s16 ags_audio_buffer_util_copy_s32_to_s24 ags_audio_buffer_util_copy_s32_to_s32 ags_audio_buffer_util_copy_s32_to_s64 ags_audio_buffer_util_copy_s32_to_float ags_audio_buffer_util_copy_s32_to_double ags_audio_buffer_util_copy_s64_to_s8 ags_audio_buffer_util_copy_s64_to_s16 ags_audio_buffer_util_copy_s64_to_s24 ags_audio_buffer_util_copy_s64_to_s32 ags_audio_buffer_util_copy_s64_to_s64 ags_audio_buffer_util_copy_s64_to_float ags_audio_buffer_util_copy_s64_to_double ags_audio_buffer_util_copy_float_to_s8 ags_audio_buffer_util_copy_float_to_s16 ags_audio_buffer_util_copy_float_to_s24 ags_audio_buffer_util_copy_float_to_s32 ags_audio_buffer_util_copy_float_to_s64 ags_audio_buffer_util_copy_float_to_float ags_audio_buffer_util_copy_float_to_double ags_audio_buffer_util_copy_double_to_s8 ags_audio_buffer_util_copy_double_to_s16 ags_audio_buffer_util_copy_double_to_s24 ags_audio_buffer_util_copy_double_to_s32 ags_audio_buffer_util_copy_double_to_s64 ags_audio_buffer_util_copy_double_to_float ags_audio_buffer_util_copy_double_to_double ags_audio_buffer_util_copy_s8_to_float32 ags_audio_buffer_util_copy_s16_to_float32 ags_audio_buffer_util_copy_s24_to_float32 ags_audio_buffer_util_copy_s32_to_float32 ags_audio_buffer_util_copy_s64_to_float32 ags_audio_buffer_util_copy_float_to_float32 ags_audio_buffer_util_copy_double_to_float32 ags_audio_buffer_util_copy_float32_to_float32 ags_audio_buffer_util_copy_float32_to_s8 ags_audio_buffer_util_copy_float32_to_s16 ags_audio_buffer_util_copy_float32_to_s24 ags_audio_buffer_util_copy_float32_to_s32 ags_audio_buffer_util_copy_float32_to_s64 ags_audio_buffer_util_copy_float32_to_float ags_audio_buffer_util_copy_float32_to_double ags_audio_buffer_util_copy_s8_to_complex ags_audio_buffer_util_copy_s16_to_complex ags_audio_buffer_util_copy_s24_to_complex ags_audio_buffer_util_copy_s32_to_complex ags_audio_buffer_util_copy_s64_to_complex ags_audio_buffer_util_copy_float_to_complex ags_audio_buffer_util_copy_double_to_complex ags_audio_buffer_util_copy_float32_to_complex ags_audio_buffer_util_copy_complex_to_complex ags_audio_buffer_util_copy_complex_to_s8 ags_audio_buffer_util_copy_complex_to_s16 ags_audio_buffer_util_copy_complex_to_s24 ags_audio_buffer_util_copy_complex_to_s32 ags_audio_buffer_util_copy_complex_to_s64 ags_audio_buffer_util_copy_complex_to_float ags_audio_buffer_util_copy_complex_to_double ags_audio_buffer_util_copy_complex_to_float32 ags_audio_buffer_util_copy_buffer_to_buffer
ags_audio_container AgsAudioContainer AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX AgsAudioContainerFlags ags_audio_container_test_flags ags_audio_container_set_flags ags_audio_container_unset_flags ags_audio_container_check_suffix ags_audio_container_find_sound_resource ags_audio_container_add_audio_signal ags_audio_container_remove_audio_signal ags_audio_container_add_wave ags_audio_container_remove_wave ags_audio_container_open ags_audio_container_open_from_data ags_audio_container_rw_open ags_audio_container_close ags_audio_container_read ags_audio_container_read_audio_signal ags_audio_container_read_wave ags_audio_container_seek ags_audio_container_write ags_audio_container_flush ags_audio_container_new AGS_AUDIO_CONTAINER AGS_AUDIO_CONTAINER_CLASS AGS_AUDIO_CONTAINER_GET_CLASS AGS_IS_AUDIO_CONTAINER AGS_TYPE_AUDIO_CONTAINER AgsAudioContainer AgsAudioContainerClass ags_audio_container_get_type
ags_audio_file AgsAudioFile AGS_AUDIO_FILE_GET_OBJ_MUTEX AgsAudioFileFlags ags_audio_file_test_flags ags_audio_file_set_flags ags_audio_file_unset_flags ags_audio_file_check_suffix ags_audio_file_add_audio_signal ags_audio_file_remove_audio_signal ags_audio_file_add_wave ags_audio_file_remove_wave ags_audio_file_open ags_audio_file_open_from_data ags_audio_file_rw_open ags_audio_file_close ags_audio_file_read ags_audio_file_read_audio_signal ags_audio_file_read_wave ags_audio_file_seek ags_audio_file_write ags_audio_file_flush ags_audio_file_new AGS_AUDIO_FILE AGS_AUDIO_FILE_CLASS AGS_AUDIO_FILE_GET_CLASS AGS_IS_AUDIO_FILE AGS_TYPE_AUDIO_FILE AgsAudioFile AgsAudioFileClass ags_audio_file_get_type
ags_audio_file_link AgsAudioFileLink ags_audio_file_link_new AGS_AUDIO_FILE_LINK AGS_AUDIO_FILE_LINK_CLASS AGS_AUDIO_FILE_LINK_GET_CLASS AGS_IS_AUDIO_FILE_LINK AGS_TYPE_AUDIO_FILE_LINK AgsAudioFileLink AgsAudioFileLinkClass ags_audio_file_link_get_type
ags_audio_loop AgsAudioLoop AGS_AUDIO_LOOP_DEFAULT_JIFFIE AgsAudioLoopFlags ags_audio_loop_test_flags ags_audio_loop_set_flags ags_audio_loop_unset_flags ags_audio_loop_add_audio ags_audio_loop_remove_audio ags_audio_loop_add_channel ags_audio_loop_remove_channel ags_audio_loop_new AGS_AUDIO_LOOP AGS_AUDIO_LOOP_CLASS AGS_AUDIO_LOOP_GET_CLASS AGS_IS_AUDIO_LOOP AGS_TYPE_AUDIO_LOOP AgsAudioLoop AgsAudioLoopClass ags_audio_loop_get_type
ags_audio_signal AgsAudioSignal AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX AgsAudioSignalFlags ags_audio_signal_test_flags ags_audio_signal_set_flags ags_audio_signal_unset_flags ags_stream_alloc ags_stream_free ags_audio_signal_set_output_soundcard ags_audio_signal_set_input_soundcard ags_audio_signal_set_samplerate ags_audio_signal_set_buffer_size ags_audio_signal_set_format ags_audio_signal_add_note ags_audio_signal_remove_note ags_audio_signal_refresh_data ags_audio_signal_add_stream ags_audio_signal_stream_resize ags_audio_signal_stream_safe_resize ags_audio_signal_duplicate_stream ags_audio_signal_feed ags_audio_signal_get_length_till_current ags_audio_signal_get_template ags_audio_signal_get_rt_template ags_audio_signal_find_stream_current ags_audio_signal_find_by_recall_id ags_audio_signal_is_active ags_audio_signal_new ags_audio_signal_new_with_length AGS_AUDIO_SIGNAL AGS_AUDIO_SIGNAL_CLASS AGS_AUDIO_SIGNAL_GET_CLASS AGS_IS_AUDIO_SIGNAL AGS_TYPE_AUDIO_SIGNAL AgsAudioSignal AgsAudioSignalClass ags_audio_signal_get_type
ags_audio_thread AgsAudioThread AGS_AUDIO_THREAD_DEFAULT_JIFFIE AgsAudioThreadFlags ags_audio_thread_test_status_flags ags_audio_thread_set_status_flags ags_audio_thread_unset_status_flags ags_audio_thread_set_sound_scope ags_audio_thread_new AGS_AUDIO_THREAD AGS_AUDIO_THREAD_CLASS AGS_AUDIO_THREAD_GET_CLASS AGS_IS_AUDIO_THREAD AGS_TYPE_AUDIO_THREAD AgsAudioThread AgsAudioThreadClass ags_audio_thread_get_type
ags_audio_unit_client AgsAudioUnitClient AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX AgsAudioUnitClientFlags ags_audio_unit_client_test_flags ags_audio_unit_client_set_flags ags_audio_unit_client_unset_flags ags_audio_unit_client_find_uuid ags_audio_unit_client_find ags_audio_unit_client_open ags_audio_unit_client_add_device ags_audio_unit_client_remove_device ags_audio_unit_client_add_port ags_audio_unit_client_remove_port ags_audio_unit_client_activate ags_audio_unit_client_deactivate ags_audio_unit_client_new AGS_AUDIO_UNIT_CLIENT AGS_AUDIO_UNIT_CLIENT_CLASS AGS_AUDIO_UNIT_CLIENT_GET_CLASS AGS_IS_AUDIO_UNIT_CLIENT AGS_TYPE_AUDIO_UNIT_CLIENT AgsAudioUnitClient AgsAudioUnitClientClass ags_audio_unit_client_get_type
ags_audio_unit_devin AgsAudioUnitDevin AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX AgsAudioUnitDevinFlags AgsAudioUnitDevinSyncFlags AGS_AUDIO_UNIT_DEVIN_ERROR AgsAudioUnitDevinError ags_audio_unit_devin_error_quark ags_audio_unit_devin_test_flags ags_audio_unit_devin_set_flags ags_audio_unit_devin_unset_flags ags_audio_unit_devin_switch_buffer_flag ags_audio_unit_devin_adjust_delay_and_attack ags_audio_unit_devin_realloc_buffer ags_audio_unit_devin_new AGS_AUDIO_UNIT_DEVIN AGS_AUDIO_UNIT_DEVIN_CLASS AGS_AUDIO_UNIT_DEVIN_GET_CLASS AGS_IS_AUDIO_UNIT_DEVIN AGS_TYPE_AUDIO_UNIT_DEVIN AgsAudioUnitDevin AgsAudioUnitDevinClass ags_audio_unit_devin_get_type
ags_audio_unit_devout AgsAudioUnitDevout AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX AgsAudioUnitDevoutFlags AgsAudioUnitDevoutSyncFlags AGS_AUDIO_UNIT_DEVOUT_ERROR AgsAudioUnitDevoutError ags_audio_unit_devout_error_quark ags_audio_unit_devout_test_flags ags_audio_unit_devout_set_flags ags_audio_unit_devout_unset_flags ags_audio_unit_devout_switch_buffer_flag ags_audio_unit_devout_adjust_delay_and_attack ags_audio_unit_devout_realloc_buffer ags_audio_unit_devout_new AGS_AUDIO_UNIT_DEVOUT AGS_AUDIO_UNIT_DEVOUT_CLASS AGS_AUDIO_UNIT_DEVOUT_GET_CLASS AGS_IS_AUDIO_UNIT_DEVOUT AGS_TYPE_AUDIO_UNIT_DEVOUT AgsAudioUnitDevout AgsAudioUnitDevoutClass ags_audio_unit_devout_get_type
ags_audio_unit_port AgsAudioUnitPort AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX AGS_AUDIO_UNIT_PORT_DEFAULT_CACHE_BUFFER_SIZE AgsAudioUnitPortFlags ags_audio_unit_port_test_flags ags_audio_unit_port_set_flags ags_audio_unit_port_unset_flags ags_audio_unit_port_find ags_audio_unit_port_register ags_audio_unit_port_unregister ags_audio_unit_port_set_format ags_audio_unit_port_set_samplerate ags_audio_unit_port_set_pcm_channels ags_audio_unit_port_set_buffer_size ags_audio_unit_port_new AGS_AUDIO_UNIT_PORT AGS_AUDIO_UNIT_PORT_CLASS AGS_AUDIO_UNIT_PORT_GET_CLASS AGS_IS_AUDIO_UNIT_PORT AGS_TYPE_AUDIO_UNIT_PORT AgsAudioUnitPort AgsAudioUnitPortClass ags_audio_unit_port_get_type
ags_audio_unit_server AgsAudioUnitServer AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX AgsAudioUnitServerFlags ags_audio_unit_server_test_flags ags_audio_unit_server_set_flags ags_audio_unit_server_unset_flags ags_audio_unit_server_find_url ags_audio_unit_server_find_client ags_audio_unit_server_find_port ags_audio_unit_server_add_client ags_audio_unit_server_remove_client ags_audio_unit_server_connect_client ags_audio_unit_server_start_poll ags_audio_unit_server_new AGS_AUDIO_UNIT_SERVER AGS_AUDIO_UNIT_SERVER_CLASS AGS_AUDIO_UNIT_SERVER_GET_CLASS AGS_IS_AUDIO_UNIT_SERVER AGS_TYPE_AUDIO_UNIT_SERVER AgsAudioUnitServer AgsAudioUnitServerClass ags_audio_unit_server_get_type
ags_automation AgsAutomation AGS_AUTOMATION_GET_OBJ_MUTEX AGS_AUTOMATION_DEFAULT_BPM AGS_AUTOMATION_TICS_PER_BEAT AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH AGS_AUTOMATION_MAXIMUM_ACCELERATION_LENGTH AGS_AUTOMATION_DEFAULT_LENGTH AGS_AUTOMATION_DEFAULT_JIFFIE AGS_AUTOMATION_DEFAULT_DURATION AGS_AUTOMATION_DEFAULT_OFFSET AGS_AUTOMATION_DEFAULT_PRECISION AGS_AUTOMATION_MAXIMUM_STEPS AGS_AUTOMATION_CLIPBOARD_VERSION AGS_AUTOMATION_CLIPBOARD_TYPE AGS_AUTOMATION_CLIPBOARD_FORMAT AGS_AUTOMATION_CLIPBOARD_LEGACY_FORMAT AgsAutomationFlags ags_automation_test_flags ags_automation_set_flags ags_automation_unset_flags ags_automation_find_port ags_automation_find_near_timestamp ags_automation_find_near_timestamp_extended ags_automation_sort_func ags_automation_add ags_automation_add_acceleration ags_automation_remove_acceleration ags_automation_remove_acceleration_at_position ags_automation_get_selection ags_automation_is_acceleration_selected ags_automation_find_point ags_automation_find_region ags_automation_free_selection ags_automation_add_point_to_selection ags_automation_remove_point_from_selection ags_automation_add_region_to_selection ags_automation_remove_region_from_selection ags_automation_add_all_to_selection ags_automation_copy_selection ags_automation_cut_selection ags_automation_insert_from_clipboard ags_automation_insert_from_clipboard_extended ags_automation_get_specifier_unique ags_automation_get_specifier_unique_with_channel_type ags_automation_find_specifier ags_automation_find_channel_type_with_control_name ags_automation_find_specifier_with_type_and_line ags_automation_get_value ags_automation_new AGS_AUTOMATION AGS_AUTOMATION_CLASS AGS_AUTOMATION_GET_CLASS AGS_IS_AUTOMATION AGS_TYPE_AUTOMATION AgsAutomation AgsAutomationClass ags_automation_get_type
ags_base_plugin AgsBasePlugin AGS_BASE_PLUGIN_GET_OBJ_MUTEX AgsBasePluginFlags ags_base_plugin_test_flags ags_base_plugin_set_flags ags_base_plugin_unset_flags ags_base_plugin_find_filename ags_base_plugin_find_effect ags_base_plugin_find_ui_effect_index ags_base_plugin_sort_func ags_base_plugin_sort ags_base_plugin_apply_port_group_by_prefix ags_base_plugin_instantiate ags_base_plugin_instantiate_with_params ags_base_plugin_connect_port ags_base_plugin_activate ags_base_plugin_deactivate ags_base_plugin_run ags_base_plugin_load_plugin ags_base_plugin_new AGS_BASE_PLUGIN AGS_BASE_PLUGIN_CLASS AGS_BASE_PLUGIN_GET_CLASS AGS_IS_BASE_PLUGIN AGS_TYPE_BASE_PLUGIN AgsBasePlugin AgsBasePluginClass ags_base_plugin_get_type
ags_buffer AgsBuffer AGS_BUFFER_GET_OBJ_MUTEX AgsBufferFlags ags_buffer_test_flags ags_buffer_set_flags ags_buffer_unset_flags ags_buffer_set_samplerate ags_buffer_set_buffer_size ags_buffer_set_format ags_buffer_sort_func ags_buffer_duplicate ags_buffer_new AGS_BUFFER AGS_BUFFER_CLASS AGS_BUFFER_GET_CLASS AGS_IS_BUFFER AGS_TYPE_BUFFER AgsBuffer AgsBufferClass ags_buffer_get_type
ags_buffer_audio_signal AgsBufferAudioSignal ags_buffer_audio_signal_new AGS_BUFFER_AUDIO_SIGNAL AGS_BUFFER_AUDIO_SIGNAL_CLASS AGS_BUFFER_AUDIO_SIGNAL_GET_CLASS AGS_IS_BUFFER_AUDIO_SIGNAL AGS_TYPE_BUFFER_AUDIO_SIGNAL AgsBufferAudioSignal AgsBufferAudioSignalClass ags_buffer_audio_signal_get_type
ags_buffer_channel AgsBufferChannel ags_buffer_channel_new AGS_BUFFER_CHANNEL AGS_BUFFER_CHANNEL_CLASS AGS_BUFFER_CHANNEL_GET_CLASS AGS_IS_BUFFER_CHANNEL AGS_TYPE_BUFFER_CHANNEL AgsBufferChannel AgsBufferChannelClass ags_buffer_channel_get_type
ags_buffer_channel_run AgsBufferChannelRun ags_buffer_channel_run_new AGS_BUFFER_CHANNEL_RUN AGS_BUFFER_CHANNEL_RUN_CLASS AGS_BUFFER_CHANNEL_RUN_GET_CLASS AGS_IS_BUFFER_CHANNEL_RUN AGS_TYPE_BUFFER_CHANNEL_RUN AgsBufferChannelRun AgsBufferChannelRunClass ags_buffer_channel_run_get_type
ags_buffer_recycling AgsBufferRecycling ags_buffer_recycling_new AGS_BUFFER_RECYCLING AGS_BUFFER_RECYCLING_CLASS AGS_BUFFER_RECYCLING_GET_CLASS AGS_IS_BUFFER_RECYCLING AGS_TYPE_BUFFER_RECYCLING AgsBufferRecycling AgsBufferRecyclingClass ags_buffer_recycling_get_type
ags_cancel_audio AgsCancelAudio ags_cancel_audio_new AGS_CANCEL_AUDIO AGS_CANCEL_AUDIO_CLASS AGS_CANCEL_AUDIO_GET_CLASS AGS_IS_CANCEL_AUDIO AGS_TYPE_CANCEL_AUDIO AgsCancelAudio AgsCancelAudioClass ags_cancel_audio_get_type
ags_cancel_channel AgsCancelChannel ags_cancel_channel_new AGS_CANCEL_CHANNEL AGS_CANCEL_CHANNEL_CLASS AGS_CANCEL_CHANNEL_GET_CLASS AGS_IS_CANCEL_CHANNEL AGS_TYPE_CANCEL_CHANNEL AgsCancelChannel AgsCancelChannelClass ags_cancel_channel_get_type
ags_capture_wave_audio AgsCaptureWaveAudio ags_capture_wave_audio_new AGS_CAPTURE_WAVE_AUDIO AGS_CAPTURE_WAVE_AUDIO_CLASS AGS_CAPTURE_WAVE_AUDIO_GET_CLASS AGS_IS_CAPTURE_WAVE_AUDIO AGS_TYPE_CAPTURE_WAVE_AUDIO AgsCaptureWaveAudio AgsCaptureWaveAudioClass ags_capture_wave_audio_get_type
ags_capture_wave_audio_run AgsCaptureWaveAudioRun ags_capture_wave_audio_run_new AGS_CAPTURE_WAVE_AUDIO_RUN AGS_CAPTURE_WAVE_AUDIO_RUN_CLASS AGS_CAPTURE_WAVE_AUDIO_RUN_GET_CLASS AGS_IS_CAPTURE_WAVE_AUDIO_RUN AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN AgsCaptureWaveAudioRun AgsCaptureWaveAudioRunClass ags_capture_wave_audio_run_get_type
ags_capture_wave_channel AgsCaptureWaveChannel ags_capture_wave_channel_new AGS_CAPTURE_WAVE_CHANNEL AGS_CAPTURE_WAVE_CHANNEL_CLASS AGS_CAPTURE_WAVE_CHANNEL_GET_CLASS AGS_IS_CAPTURE_WAVE_CHANNEL AGS_TYPE_CAPTURE_WAVE_CHANNEL AgsCaptureWaveChannel AgsCaptureWaveChannelClass ags_capture_wave_channel_get_type
ags_capture_wave_channel_run AgsCaptureWaveChannelRun ags_capture_wave_channel_run_new AGS_CAPTURE_WAVE_CHANNEL_RUN AGS_CAPTURE_WAVE_CHANNEL_RUN_CLASS AGS_CAPTURE_WAVE_CHANNEL_RUN_GET_CLASS AGS_IS_CAPTURE_WAVE_CHANNEL_RUN AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN AgsCaptureWaveChannelRun AgsCaptureWaveChannelRunClass ags_capture_wave_channel_run_get_type
ags_channel AgsChannel AGS_CHANNEL_GET_OBJ_MUTEX AGS_CHANNEL_GET_PLAY_MUTEX AGS_CHANNEL_GET_RECALL_MUTEX AGS_CHANNEL_MINIMUM_OCTAVE AGS_CHANNEL_MAXIMUM_OCTAVE AGS_CHANNEL_DEFAULT_OCTAVE AGS_CHANNEL_MINIMUM_OCTAVE_SEMITONE AGS_CHANNEL_MAXIMUM_OCTAVE_SEMITONE AGS_CHANNEL_DEFAULT_OCTAVE_SEMITONE AGS_CHANNEL_MINIMUM_SEMITONE AGS_CHANNEL_MAXIMUM_SEMITONE AGS_CHANNEL_DEFAULT_SEMITONE AGS_CHANNEL_MINIMUM_NOTE_FREQUENCY AGS_CHANNEL_MAXIMUM_NOTE_FREQUENCY AGS_CHANNEL_DEFAULT_NOTE_FREQUENCY AGS_CHANNEL_MINIMUM_MIDI_NOTE AGS_CHANNEL_MAXIMUM_MIDI_NOTE AGS_CHANNEL_DEFAULT_MIDI_NOTE AgsChannelFlags AGS_CHANNEL_ERROR AgsChannelError ags_channel_error_quark ags_channel_test_flags ags_channel_set_flags ags_channel_unset_flags ags_channel_test_ability_flags ags_channel_set_ability_flags ags_channel_unset_ability_flags ags_channel_test_behaviour_flags ags_channel_set_behaviour_flags ags_channel_unset_behaviour_flags ags_channel_test_staging_flags ags_channel_set_staging_flags ags_channel_unset_staging_flags ags_channel_next ags_channel_prev ags_channel_next_pad ags_channel_prev_pad ags_channel_first ags_channel_last ags_channel_nth ags_channel_pad_first ags_channel_pad_last ags_channel_pad_nth ags_channel_first_with_recycling ags_channel_last_with_recycling ags_channel_prev_with_recycling ags_channel_next_with_recycling ags_channel_get_link ags_channel_set_link ags_channel_reset_recycling ags_channel_recycling_changed ags_channel_set_output_soundcard ags_channel_set_input_soundcard ags_channel_set_samplerate ags_channel_set_buffer_size ags_channel_set_format ags_channel_add_pattern ags_channel_remove_pattern ags_channel_add_recall_id ags_channel_remove_recall_id ags_channel_add_recall_container ags_channel_remove_recall_container ags_channel_add_recall ags_channel_remove_recall ags_channel_add_effect ags_channel_remove_effect ags_channel_duplicate_recall ags_channel_resolve_recall ags_channel_init_recall ags_channel_play_recall ags_channel_done_recall ags_channel_cancel_recall ags_channel_cleanup_recall ags_channel_start ags_channel_stop ags_channel_check_scope ags_channel_collect_all_channel_ports ags_channel_collect_all_channel_ports_by_specifier_and_context ags_channel_get_level ags_channel_recursive_set_property ags_channel_recursive_run_stage ags_channel_new AGS_CHANNEL AGS_CHANNEL_CLASS AGS_CHANNEL_GET_CLASS AGS_IS_CHANNEL AGS_TYPE_CHANNEL AgsChannel AgsChannelClass ags_channel_get_type
ags_channel_thread AgsChannelThread AGS_CHANNEL_THREAD_DEFAULT_JIFFIE AgsChannelThreadFlags ags_channel_thread_test_status_flags ags_channel_thread_set_status_flags ags_channel_thread_unset_status_flags ags_channel_thread_set_sound_scope ags_channel_thread_new AGS_CHANNEL_THREAD AGS_CHANNEL_THREAD_CLASS AGS_CHANNEL_THREAD_GET_CLASS AGS_IS_CHANNEL_THREAD AGS_TYPE_CHANNEL_THREAD AgsChannelThread AgsChannelThreadClass ags_channel_thread_get_type
ags_char_buffer_util AgsCharBufferUtilCopyMode ags_char_buffer_util_copy_s8_to_cbuffer ags_char_buffer_util_copy_s16_to_cbuffer ags_char_buffer_util_copy_s24_to_cbuffer ags_char_buffer_util_copy_s32_to_cbuffer ags_char_buffer_util_copy_s64_to_cbuffer ags_char_buffer_util_copy_float_to_cbuffer ags_char_buffer_util_copy_double_to_cbuffer ags_char_buffer_util_copy_cbuffer_to_s8 ags_char_buffer_util_copy_cbuffer_to_s16 ags_char_buffer_util_copy_cbuffer_to_s24 ags_char_buffer_util_copy_cbuffer_to_s32 ags_char_buffer_util_copy_cbuffer_to_s64 ags_char_buffer_util_copy_cbuffer_to_float ags_char_buffer_util_copy_cbuffer_to_double ags_char_buffer_util_copy_buffer_to_buffer
ags_clear_audio_signal AgsClearAudioSignal ags_clear_audio_signal_new AGS_CLEAR_AUDIO_SIGNAL AGS_CLEAR_AUDIO_SIGNAL_CLASS AGS_CLEAR_AUDIO_SIGNAL_GET_CLASS AGS_IS_CLEAR_AUDIO_SIGNAL AGS_TYPE_CLEAR_AUDIO_SIGNAL AgsClearAudioSignal AgsClearAudioSignalClass ags_clear_audio_signal_get_type
ags_clear_buffer AgsClearBuffer ags_clear_buffer_new AGS_CLEAR_BUFFER AGS_CLEAR_BUFFER_CLASS AGS_CLEAR_BUFFER_GET_CLASS AGS_IS_CLEAR_BUFFER AGS_TYPE_CLEAR_BUFFER AgsClearBuffer AgsClearBufferClass ags_clear_buffer_get_type
ags_copy_audio_signal AgsCopyAudioSignal ags_copy_audio_signal_new AGS_COPY_AUDIO_SIGNAL AGS_COPY_AUDIO_SIGNAL_CLASS AGS_COPY_AUDIO_SIGNAL_GET_CLASS AGS_IS_COPY_AUDIO_SIGNAL AGS_TYPE_COPY_AUDIO_SIGNAL AgsCopyAudioSignal AgsCopyAudioSignalClass ags_copy_audio_signal_get_type
ags_copy_channel AgsCopyChannel ags_copy_channel_new AGS_COPY_CHANNEL AGS_COPY_CHANNEL_CLASS AGS_COPY_CHANNEL_GET_CLASS AGS_IS_COPY_CHANNEL AGS_TYPE_COPY_CHANNEL AgsCopyChannel AgsCopyChannelClass ags_copy_channel_get_type
ags_copy_channel_run AgsCopyChannelRun ags_copy_channel_run_new AGS_COPY_CHANNEL_RUN AGS_COPY_CHANNEL_RUN_CLASS AGS_COPY_CHANNEL_RUN_GET_CLASS AGS_IS_COPY_CHANNEL_RUN AGS_TYPE_COPY_CHANNEL_RUN AgsCopyChannelRun AgsCopyChannelRunClass ags_copy_channel_run_get_type
ags_copy_pattern_audio AgsCopyPatternAudio AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_0 AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_1 ags_copy_pattern_audio_new AGS_COPY_PATTERN_AUDIO AGS_COPY_PATTERN_AUDIO_CLASS AGS_COPY_PATTERN_AUDIO_GET_CLASS AGS_IS_COPY_PATTERN_AUDIO AGS_TYPE_COPY_PATTERN_AUDIO AgsCopyPatternAudio AgsCopyPatternAudioClass ags_copy_pattern_audio_get_type
ags_copy_pattern_audio_run AgsCopyPatternAudioRun ags_copy_pattern_audio_run_new AGS_COPY_PATTERN_AUDIO_RUN AGS_COPY_PATTERN_AUDIO_RUN_CLASS AGS_COPY_PATTERN_AUDIO_RUN_GET_CLASS AGS_IS_COPY_PATTERN_AUDIO_RUN AGS_TYPE_COPY_PATTERN_AUDIO_RUN AgsCopyPatternAudioRun AgsCopyPatternAudioRunClass ags_copy_pattern_audio_run_get_type
ags_copy_pattern_channel AgsCopyPatternChannel ags_copy_pattern_channel_new AGS_COPY_PATTERN_CHANNEL AGS_COPY_PATTERN_CHANNEL_CLASS AGS_COPY_PATTERN_CHANNEL_GET_CLASS AGS_IS_COPY_PATTERN_CHANNEL AGS_TYPE_COPY_PATTERN_CHANNEL AgsCopyPatternChannel AgsCopyPatternChannelClass ags_copy_pattern_channel_get_type
ags_copy_pattern_channel_run AgsCopyPatternChannelRun ags_copy_pattern_channel_run_new AGS_COPY_PATTERN_CHANNEL_RUN AGS_COPY_PATTERN_CHANNEL_RUN_CLASS AGS_COPY_PATTERN_CHANNEL_RUN_GET_CLASS AGS_IS_COPY_PATTERN_CHANNEL_RUN AGS_TYPE_COPY_PATTERN_CHANNEL_RUN AgsCopyPatternChannelRun AgsCopyPatternChannelRunClass ags_copy_pattern_channel_run_get_type
ags_copy_recycling AgsCopyRecycling ags_copy_recycling_new AGS_COPY_RECYCLING AGS_COPY_RECYCLING_CLASS AGS_COPY_RECYCLING_GET_CLASS AGS_IS_COPY_RECYCLING AGS_TYPE_COPY_RECYCLING AgsCopyRecycling AgsCopyRecyclingClass ags_copy_recycling_get_type
ags_core_audio_client AgsCoreAudioClient AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX AgsCoreAudioClientFlags ags_core_audio_client_test_flags ags_core_audio_client_set_flags ags_core_audio_client_unset_flags ags_core_audio_client_find_uuid ags_core_audio_client_find ags_core_audio_client_open ags_core_audio_client_add_device ags_core_audio_client_remove_device ags_core_audio_client_add_port ags_core_audio_client_remove_port ags_core_audio_client_activate ags_core_audio_client_deactivate ags_core_audio_client_new AGS_CORE_AUDIO_CLIENT AGS_CORE_AUDIO_CLIENT_CLASS AGS_CORE_AUDIO_CLIENT_GET_CLASS AGS_IS_CORE_AUDIO_CLIENT AGS_TYPE_CORE_AUDIO_CLIENT AgsCoreAudioClient AgsCoreAudioClientClass ags_core_audio_client_get_type
ags_core_audio_devin AgsCoreAudioDevin AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX AgsCoreAudioDevinFlags AgsCoreAudioDevinSyncFlags AGS_CORE_AUDIO_DEVIN_ERROR AgsCoreAudioDevinError ags_core_audio_devin_error_quark ags_core_audio_devin_test_flags ags_core_audio_devin_set_flags ags_core_audio_devin_unset_flags ags_core_audio_devin_switch_buffer_flag ags_core_audio_devin_adjust_delay_and_attack ags_core_audio_devin_realloc_buffer ags_core_audio_devin_new AGS_CORE_AUDIO_DEVIN AGS_CORE_AUDIO_DEVIN_CLASS AGS_CORE_AUDIO_DEVIN_GET_CLASS AGS_IS_CORE_AUDIO_DEVIN AGS_TYPE_CORE_AUDIO_DEVIN AgsCoreAudioDevin AgsCoreAudioDevinClass ags_core_audio_devin_get_type
ags_core_audio_devout AgsCoreAudioDevout AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX AgsCoreAudioDevoutFlags AgsCoreAudioDevoutSyncFlags AGS_CORE_AUDIO_DEVOUT_ERROR AgsCoreAudioDevoutError ags_core_audio_devout_error_quark ags_core_audio_devout_test_flags ags_core_audio_devout_set_flags ags_core_audio_devout_unset_flags ags_core_audio_devout_switch_buffer_flag ags_core_audio_devout_adjust_delay_and_attack ags_core_audio_devout_realloc_buffer ags_core_audio_devout_new AGS_CORE_AUDIO_DEVOUT AGS_CORE_AUDIO_DEVOUT_CLASS AGS_CORE_AUDIO_DEVOUT_GET_CLASS AGS_IS_CORE_AUDIO_DEVOUT AGS_TYPE_CORE_AUDIO_DEVOUT AgsCoreAudioDevout AgsCoreAudioDevoutClass ags_core_audio_devout_get_type
ags_core_audio_midiin AgsCoreAudioMidiin AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX AGS_CORE_AUDIO_MIDIIN_DEFAULT_BUFFER_SIZE AgsCoreAudioMidiinFlags AgsCoreAudioMidiinSyncFlags AGS_CORE_AUDIO_MIDIIN_ERROR AgsCoreAudioMidiinError ags_core_audio_midiin_error_quark ags_core_audio_midiin_test_flags ags_core_audio_midiin_set_flags ags_core_audio_midiin_unset_flags ags_core_audio_midiin_switch_buffer_flag ags_core_audio_midiin_new AGS_CORE_AUDIO_MIDIIN AGS_CORE_AUDIO_MIDIIN_CLASS AGS_CORE_AUDIO_MIDIIN_GET_CLASS AGS_IS_CORE_AUDIO_MIDIIN AGS_TYPE_CORE_AUDIO_MIDIIN AgsCoreAudioMidiin AgsCoreAudioMidiinClass ags_core_audio_midiin_get_type
ags_core_audio_port AgsCoreAudioPort AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX AGS_CORE_AUDIO_PORT_DEFAULT_CACHE_BUFFER_SIZE AgsCoreAudioPortFlags ags_core_audio_port_test_flags ags_core_audio_port_set_flags ags_core_audio_port_unset_flags ags_core_audio_port_find ags_core_audio_port_register ags_core_audio_port_unregister ags_core_audio_port_set_format ags_core_audio_port_set_samplerate ags_core_audio_port_set_pcm_channels ags_core_audio_port_set_buffer_size ags_core_audio_port_set_cache_buffer_size ags_core_audio_port_get_latency ags_core_audio_port_new AGS_CORE_AUDIO_PORT AGS_CORE_AUDIO_PORT_CLASS AGS_CORE_AUDIO_PORT_GET_CLASS AGS_IS_CORE_AUDIO_PORT AGS_TYPE_CORE_AUDIO_PORT AgsCoreAudioPort AgsCoreAudioPortClass ags_core_audio_port_get_type
ags_core_audio_server AgsCoreAudioServer AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX AgsCoreAudioServerFlags ags_core_audio_server_test_flags ags_core_audio_server_set_flags ags_core_audio_server_unset_flags ags_core_audio_server_find_url ags_core_audio_server_find_client ags_core_audio_server_find_port ags_core_audio_server_add_client ags_core_audio_server_remove_client ags_core_audio_server_connect_client ags_core_audio_server_start_poll ags_core_audio_server_new AGS_CORE_AUDIO_SERVER AGS_CORE_AUDIO_SERVER_CLASS AGS_CORE_AUDIO_SERVER_GET_CLASS AGS_IS_CORE_AUDIO_SERVER AGS_TYPE_CORE_AUDIO_SERVER AgsCoreAudioServer AgsCoreAudioServerClass ags_core_audio_server_get_type
ags_count_beats_audio AgsCountBeatsAudio ags_count_beats_audio_new AGS_COUNT_BEATS_AUDIO AGS_COUNT_BEATS_AUDIO_CLASS AGS_COUNT_BEATS_AUDIO_GET_CLASS AGS_IS_COUNT_BEATS_AUDIO AGS_TYPE_COUNT_BEATS_AUDIO AgsCountBeatsAudio AgsCountBeatsAudioClass ags_count_beats_audio_get_type
ags_count_beats_audio_run AgsCountBeatsAudioRun ags_count_beats_audio_run_sequencer_start ags_count_beats_audio_run_sequencer_loop ags_count_beats_audio_run_sequencer_stop ags_count_beats_audio_run_notation_start ags_count_beats_audio_run_notation_loop ags_count_beats_audio_run_notation_stop ags_count_beats_audio_run_wave_start ags_count_beats_audio_run_wave_loop ags_count_beats_audio_run_wave_stop ags_count_beats_audio_run_midi_start ags_count_beats_audio_run_midi_loop ags_count_beats_audio_run_midi_stop ags_count_beats_audio_run_new AGS_COUNT_BEATS_AUDIO_RUN AGS_COUNT_BEATS_AUDIO_RUN_CLASS AGS_COUNT_BEATS_AUDIO_RUN_GET_CLASS AGS_IS_COUNT_BEATS_AUDIO_RUN AGS_TYPE_COUNT_BEATS_AUDIO_RUN AgsCountBeatsAudioRun AgsCountBeatsAudioRunClass ags_count_beats_audio_run_get_type
ags_crop_note AgsCropNote AGS_CROP_NOTE_DEFAULT_X_LENGTH ags_crop_note_new AGS_CROP_NOTE AGS_CROP_NOTE_CLASS AGS_CROP_NOTE_GET_CLASS AGS_IS_CROP_NOTE AGS_TYPE_CROP_NOTE AgsCropNote AgsCropNoteClass ags_crop_note_get_type
ags_delay_audio AgsDelayAudio ags_delay_audio_sequencer_duration_changed ags_delay_audio_notation_duration_changed ags_delay_audio_wave_duration_changed ags_delay_audio_midi_duration_changed ags_delay_audio_new AGS_DELAY_AUDIO AGS_DELAY_AUDIO_CLASS AGS_DELAY_AUDIO_GET_CLASS AGS_IS_DELAY_AUDIO AGS_TYPE_DELAY_AUDIO AgsDelayAudio AgsDelayAudioClass ags_delay_audio_get_type
ags_delay_audio_run AgsDelayAudioRun ags_delay_audio_run_sequencer_alloc_output ags_delay_audio_run_sequencer_alloc_input ags_delay_audio_run_sequencer_count ags_delay_audio_run_notation_alloc_output ags_delay_audio_run_notation_alloc_input ags_delay_audio_run_notation_count ags_delay_audio_run_wave_alloc_output ags_delay_audio_run_wave_alloc_input ags_delay_audio_run_wave_count ags_delay_audio_run_midi_alloc_output ags_delay_audio_run_midi_alloc_input ags_delay_audio_run_midi_count ags_delay_audio_run_new AGS_DELAY_AUDIO_RUN AGS_DELAY_AUDIO_RUN_CLASS AGS_DELAY_AUDIO_RUN_GET_CLASS AGS_IS_DELAY_AUDIO_RUN AGS_TYPE_DELAY_AUDIO_RUN AgsDelayAudioRun AgsDelayAudioRunClass ags_delay_audio_run_get_type
ags_devin AgsDevin AGS_DEVIN_GET_OBJ_MUTEX AGS_DEVIN_DEFAULT_ALSA_DEVICE AGS_DEVIN_DEFAULT_OSS_DEVICE AGS_DEVIN_DEFAULT_RING_BUFFER_SIZE AgsDevinFlags AGS_DEVIN_ERROR AgsDevinError ags_devin_error_quark ags_devin_test_flags ags_devin_set_flags ags_devin_unset_flags ags_devin_switch_buffer_flag ags_devin_adjust_delay_and_attack ags_devin_realloc_buffer ags_devin_new AGS_DEVIN AGS_DEVIN_CLASS AGS_DEVIN_GET_CLASS AGS_IS_DEVIN AGS_TYPE_DEVIN AgsDevin AgsDevinClass ags_devin_get_type
ags_devout AgsDevout AGS_DEVOUT_GET_OBJ_MUTEX AGS_DEVOUT_DEFAULT_ALSA_DEVICE AGS_DEVOUT_DEFAULT_OSS_DEVICE AGS_DEVOUT_DEFAULT_RING_BUFFER_SIZE AgsDevoutFlags AGS_DEVOUT_ERROR AgsDevoutError ags_devout_error_quark ags_devout_test_flags ags_devout_set_flags ags_devout_unset_flags ags_devout_switch_buffer_flag ags_devout_adjust_delay_and_attack ags_devout_realloc_buffer ags_devout_new AGS_DEVOUT AGS_DEVOUT_CLASS AGS_DEVOUT_GET_CLASS AGS_IS_DEVOUT AGS_TYPE_DEVOUT AgsDevout AgsDevoutClass ags_devout_get_type
ags_diatonic_scale ags_diatonic_scale_note_to_midi_key ags_diatonic_scale_midi_key_to_note
ags_dssi_manager AgsDssiManager AGS_DSSI_MANAGER_GET_OBJ_MUTEX ags_dssi_manager_get_default_path ags_dssi_manager_set_default_path ags_dssi_manager_get_filenames ags_dssi_manager_find_dssi_plugin ags_dssi_manager_load_blacklist ags_dssi_manager_load_file ags_dssi_manager_load_default_directory ags_dssi_manager_get_instance ags_dssi_manager_new AGS_DSSI_MANAGER AGS_DSSI_MANAGER_CLASS AGS_DSSI_MANAGER_GET_CLASS AGS_IS_DSSI_MANAGER AGS_TYPE_DSSI_MANAGER AgsDssiManager AgsDssiManagerClass ags_dssi_manager_get_type
ags_dssi_plugin AgsDssiPlugin AGS_DSSI_PLUGIN_DESCRIPTOR ags_dssi_plugin_change_program ags_dssi_plugin_new AGS_DSSI_PLUGIN AGS_DSSI_PLUGIN_CLASS AGS_DSSI_PLUGIN_GET_CLASS AGS_IS_DSSI_PLUGIN AGS_TYPE_DSSI_PLUGIN AgsDssiPlugin AgsDssiPluginClass ags_dssi_plugin_get_type
ags_envelope_audio_signal AgsEnvelopeAudioSignal ags_envelope_audio_signal_new AGS_ENVELOPE_AUDIO_SIGNAL AGS_ENVELOPE_AUDIO_SIGNAL_CLASS AGS_ENVELOPE_AUDIO_SIGNAL_GET_CLASS AGS_IS_ENVELOPE_AUDIO_SIGNAL AGS_TYPE_ENVELOPE_AUDIO_SIGNAL AgsEnvelopeAudioSignal AgsEnvelopeAudioSignalClass ags_envelope_audio_signal_get_type
ags_envelope_channel AgsEnvelopeChannel ags_envelope_channel_new AGS_ENVELOPE_CHANNEL AGS_ENVELOPE_CHANNEL_CLASS AGS_ENVELOPE_CHANNEL_GET_CLASS AGS_IS_ENVELOPE_CHANNEL AGS_TYPE_ENVELOPE_CHANNEL AgsEnvelopeChannel AgsEnvelopeChannelClass ags_envelope_channel_get_type
ags_envelope_channel_run AgsEnvelopeChannelRun ags_envelope_channel_run_new AGS_ENVELOPE_CHANNEL_RUN AGS_ENVELOPE_CHANNEL_RUN_CLASS AGS_ENVELOPE_CHANNEL_RUN_GET_CLASS AGS_IS_ENVELOPE_CHANNEL_RUN AGS_TYPE_ENVELOPE_CHANNEL_RUN AgsEnvelopeChannelRun AgsEnvelopeChannelRunClass ags_envelope_channel_run_get_type
ags_envelope_recycling AgsEnvelopeRecycling ags_envelope_recycling_new AGS_ENVELOPE_RECYCLING AGS_ENVELOPE_RECYCLING_CLASS AGS_ENVELOPE_RECYCLING_GET_CLASS AGS_IS_ENVELOPE_RECYCLING AGS_TYPE_ENVELOPE_RECYCLING AgsEnvelopeRecycling AgsEnvelopeRecyclingClass ags_envelope_recycling_get_type
ags_eq10_audio_signal AgsEq10AudioSignal AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE ags_eq10_audio_signal_new AGS_EQ10_AUDIO_SIGNAL AGS_EQ10_AUDIO_SIGNAL_CLASS AGS_EQ10_AUDIO_SIGNAL_GET_CLASS AGS_IS_EQ10_AUDIO_SIGNAL AGS_TYPE_EQ10_AUDIO_SIGNAL AgsEq10AudioSignal AgsEq10AudioSignalClass ags_eq10_audio_signal_get_type
ags_eq10_channel AgsEq10Channel ags_eq10_channel_new AGS_EQ10_CHANNEL AGS_EQ10_CHANNEL_CLASS AGS_EQ10_CHANNEL_GET_CLASS AGS_IS_EQ10_CHANNEL AGS_TYPE_EQ10_CHANNEL AgsEq10Channel AgsEq10ChannelClass ags_eq10_channel_get_type
ags_eq10_channel_run AgsEq10ChannelRun ags_eq10_channel_run_new AGS_EQ10_CHANNEL_RUN AGS_EQ10_CHANNEL_RUN_CLASS AGS_EQ10_CHANNEL_RUN_GET_CLASS AGS_IS_EQ10_CHANNEL_RUN AGS_TYPE_EQ10_CHANNEL_RUN AgsEq10ChannelRun AgsEq10ChannelRunClass ags_eq10_channel_run_get_type
ags_eq10_recycling AgsEq10Recycling ags_eq10_recycling_new AGS_EQ10_RECYCLING AGS_EQ10_RECYCLING_CLASS AGS_EQ10_RECYCLING_GET_CLASS AGS_IS_EQ10_RECYCLING AGS_TYPE_EQ10_RECYCLING AgsEq10Recycling AgsEq10RecyclingClass ags_eq10_recycling_get_type
ags_export_output AgsExportOutput AgsExportOutputFormat ags_export_output_new AGS_EXPORT_OUTPUT AGS_EXPORT_OUTPUT_CLASS AGS_EXPORT_OUTPUT_GET_CLASS AGS_IS_EXPORT_OUTPUT AGS_TYPE_EXPORT_OUTPUT AgsExportOutput AgsExportOutputClass ags_export_output_get_type
ags_export_thread AgsExportThread AGS_EXPORT_THREAD_DEFAULT_JIFFIE AgsExportThreadFlags ags_export_thread_find_soundcard ags_export_thread_new AGS_EXPORT_THREAD AGS_EXPORT_THREAD_CLASS AGS_EXPORT_THREAD_GET_CLASS AGS_IS_EXPORT_THREAD AGS_TYPE_EXPORT_THREAD AgsExportThread AgsExportThreadClass ags_export_thread_get_type
ags_feed_audio_signal AgsFeedAudioSignal ags_feed_audio_signal_new AGS_FEED_AUDIO_SIGNAL AGS_FEED_AUDIO_SIGNAL_CLASS AGS_FEED_AUDIO_SIGNAL_GET_CLASS AGS_IS_FEED_AUDIO_SIGNAL AGS_TYPE_FEED_AUDIO_SIGNAL AgsFeedAudioSignal AgsFeedAudioSignalClass ags_feed_audio_signal_get_type
ags_feed_channel AgsFeedChannel ags_feed_channel_new AGS_FEED_CHANNEL AGS_FEED_CHANNEL_CLASS AGS_FEED_CHANNEL_GET_CLASS AGS_IS_FEED_CHANNEL AGS_TYPE_FEED_CHANNEL AgsFeedChannel AgsFeedChannelClass ags_feed_channel_get_type
ags_feed_channel_run AgsFeedChannelRun ags_feed_channel_run_new AGS_FEED_CHANNEL_RUN AGS_FEED_CHANNEL_RUN_CLASS AGS_FEED_CHANNEL_RUN_GET_CLASS AGS_IS_FEED_CHANNEL_RUN AGS_TYPE_FEED_CHANNEL_RUN AgsFeedChannelRun AgsFeedChannelRunClass ags_feed_channel_run_get_type
ags_feed_recycling AgsFeedRecycling ags_feed_recycling_new AGS_FEED_RECYCLING AGS_FEED_RECYCLING_CLASS AGS_FEED_RECYCLING_GET_CLASS AGS_IS_FEED_RECYCLING AGS_TYPE_FEED_RECYCLING AgsFeedRecycling AgsFeedRecyclingClass ags_feed_recycling_get_type
ags_fifoout AgsFifoout AGS_FIFOOUT_GET_OBJ_MUTEX AGS_FIFOOUT_DEFAULT_DEVICE AGS_FIFOOUT_DEFAULT_RING_BUFFER_SIZE AgsFifooutFlags AGS_FIFOOUT_ERROR AgsFifooutError ags_fifoout_error_quark ags_fifoout_test_flags ags_fifoout_set_flags ags_fifoout_unset_flags ags_fifoout_switch_buffer_flag ags_fifoout_adjust_delay_and_attack ags_fifoout_realloc_buffer ags_fifoout_new AGS_FIFOOUT AGS_FIFOOUT_CLASS AGS_FIFOOUT_GET_CLASS AGS_IS_FIFOOUT AGS_TYPE_FIFOOUT AgsFifoout AgsFifooutClass ags_fifoout_get_type
ags_filter_util AGS_FILTER_UTIL_DEFAULT_TMP_BUFFER_SIZE ags_filter_util_pitch_s8 ags_filter_util_pitch_s16 ags_filter_util_pitch_s24 ags_filter_util_pitch_s32 ags_filter_util_pitch_s64 ags_filter_util_pitch_float ags_filter_util_pitch_double ags_filter_util_pitch_complex
ags_fm_synth_util ags_fm_synth_util_sin_s8 ags_fm_synth_util_sin_s16 ags_fm_synth_util_sin_s24 ags_fm_synth_util_sin_s32 ags_fm_synth_util_sin_s64 ags_fm_synth_util_sin_float ags_fm_synth_util_sin_double ags_fm_synth_util_sin_complex ags_fm_synth_util_sawtooth_s8 ags_fm_synth_util_sawtooth_s16 ags_fm_synth_util_sawtooth_s24 ags_fm_synth_util_sawtooth_s32 ags_fm_synth_util_sawtooth_s64 ags_fm_synth_util_sawtooth_float ags_fm_synth_util_sawtooth_double ags_fm_synth_util_sawtooth_complex ags_fm_synth_util_triangle_s8 ags_fm_synth_util_triangle_s16 ags_fm_synth_util_triangle_s24 ags_fm_synth_util_triangle_s32 ags_fm_synth_util_triangle_s64 ags_fm_synth_util_triangle_float ags_fm_synth_util_triangle_double ags_fm_synth_util_triangle_complex ags_fm_synth_util_square_s8 ags_fm_synth_util_square_s16 ags_fm_synth_util_square_s24 ags_fm_synth_util_square_s32 ags_fm_synth_util_square_s64 ags_fm_synth_util_square_float ags_fm_synth_util_square_double ags_fm_synth_util_square_complex ags_fm_synth_util_impulse_s8 ags_fm_synth_util_impulse_s16 ags_fm_synth_util_impulse_s24 ags_fm_synth_util_impulse_s32 ags_fm_synth_util_impulse_s64 ags_fm_synth_util_impulse_float ags_fm_synth_util_impulse_double ags_fm_synth_util_impulse_complex ags_fm_synth_util_sin ags_fm_synth_util_sawtooth ags_fm_synth_util_triangle ags_fm_synth_util_square ags_fm_synth_util_impulse
ags_fourier_transform_util AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S8_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S24_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S32_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S64_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_FLOAT_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S8_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S24_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S32_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S64_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_FLOAT_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW ags_fourier_transform_util_compute_stft_s8 ags_fourier_transform_util_compute_stft_s16 ags_fourier_transform_util_compute_stft_s24 ags_fourier_transform_util_compute_stft_s32 ags_fourier_transform_util_compute_stft_s64 ags_fourier_transform_util_compute_stft_float ags_fourier_transform_util_compute_stft_double ags_fourier_transform_util_inverse_stft_s8 ags_fourier_transform_util_inverse_stft_s16 ags_fourier_transform_util_inverse_stft_s24 ags_fourier_transform_util_inverse_stft_s32 ags_fourier_transform_util_inverse_stft_s64 ags_fourier_transform_util_inverse_stft_float ags_fourier_transform_util_inverse_stft_double
ags_free_selection AgsFreeSelection ags_free_selection_new AGS_FREE_SELECTION AGS_FREE_SELECTION_CLASS AGS_FREE_SELECTION_GET_CLASS AGS_IS_FREE_SELECTION AGS_TYPE_FREE_SELECTION AgsFreeSelection AgsFreeSelectionClass ags_free_selection_get_type
ags_frequency_map AgsFrequencyMap AGS_FREQUENCY_MAP_GET_OBJ_MUTEX AGS_FREQUENCY_MAP_DEFAULT_FREQ AgsFrequencyMapFlags ags_frequency_map_sort_func ags_frequency_map_test_flags ags_frequency_map_set_flags ags_frequency_map_unset_flags ags_frequency_map_process ags_frequency_map_factorize ags_frequency_map_compute_max_likelihood ags_frequency_map_new AGS_FREQUENCY_MAP AGS_FREQUENCY_MAP_CLASS AGS_FREQUENCY_MAP_GET_CLASS AGS_IS_FREQUENCY_MAP AGS_TYPE_FREQUENCY_MAP AgsFrequencyMap AgsFrequencyMapClass ags_frequency_map_get_type
ags_frequency_map_manager AgsFrequencyMapManager AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX AGS_FREQUENCY_MAP_MANAGER_EQUINOX AgsFrequencyMapManagerFlags ags_frequency_map_manager_test_flags ags_frequency_map_manager_set_flags ags_frequency_map_manager_unset_flags ags_frequency_map_manager_add_frequency_map ags_frequency_map_manager_add_factorized_frequency_map ags_frequency_map_manager_find_frequency_map ags_frequency_map_manager_find_factorized_frequency_map ags_frequency_map_manager_load_default ags_frequency_map_manager_get_instance ags_frequency_map_manager_new AGS_FREQUENCY_MAP_MANAGER AGS_FREQUENCY_MAP_MANAGER_CLASS AGS_FREQUENCY_MAP_MANAGER_GET_CLASS AGS_IS_FREQUENCY_MAP_MANAGER AGS_TYPE_FREQUENCY_MAP_MANAGER AgsFrequencyMapManager AgsFrequencyMapManagerClass ags_frequency_map_manager_get_type
ags_generic_recall_channel_run AgsGenericRecallChannelRun ags_generic_recall_channel_run_new AGS_GENERIC_RECALL_CHANNEL_RUN AGS_GENERIC_RECALL_CHANNEL_RUN_CLASS AGS_GENERIC_RECALL_CHANNEL_RUN_GET_CLASS AGS_IS_GENERIC_RECALL_CHANNEL_RUN AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN AgsGenericRecallChannelRun AgsGenericRecallChannelRunClass ags_generic_recall_channel_run_get_type
ags_generic_recall_recycling AgsGenericRecallRecycling ags_generic_recall_recycling_new AGS_GENERIC_RECALL_RECYCLING AGS_GENERIC_RECALL_RECYCLING_CLASS AGS_GENERIC_RECALL_RECYCLING_GET_CLASS AGS_IS_GENERIC_RECALL_RECYCLING AGS_TYPE_GENERIC_RECALL_RECYCLING AgsGenericRecallRecycling AgsGenericRecallRecyclingClass ags_generic_recall_recycling_get_type
ags_input AgsInput AGS_INPUT_SYNTH_BASE_NOTE ags_input_is_active ags_input_next_active ags_input_add_synth_generator ags_input_remove_synth_generator ags_input_open_file ags_input_new AGS_INPUT AGS_INPUT_CLASS AGS_INPUT_GET_CLASS AGS_IS_INPUT AGS_TYPE_INPUT AgsInput AgsInputClass ags_input_get_type
ags_ipatch AgsIpatch AGS_IPATCH_GET_OBJ_MUTEX AGS_IPATCH_DEFAULT_CHANNELS AGS_IPATCH_READ AGS_IPATCH_WRITE AgsIpatchFlags ags_ipatch_test_flags ags_ipatch_set_flags ags_ipatch_unset_flags ags_ipatch_check_suffix ags_ipatch_new AGS_IPATCH AGS_IPATCH_CLASS AGS_IPATCH_GET_CLASS AGS_IS_IPATCH AGS_TYPE_IPATCH AgsIpatch AgsIpatchClass ags_ipatch_get_type
ags_ipatch_dls2_reader AgsIpatchDLS2Reader AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX AgsIpatchDLS2ReaderFlags AgsDLS2Level ags_ipatch_dls2_reader_test_flags ags_ipatch_dls2_reader_set_flags ags_ipatch_dls2_reader_unset_flags ags_ipatch_dls2_reader_load ags_ipatch_dls2_reader_select_instrument ags_ipatch_dls2_reader_select_sample ags_ipatch_dls2_reader_get_instrument_all ags_ipatch_dls2_reader_get_sample_all ags_ipatch_dls2_reader_get_sample_by_instrument_index ags_ipatch_dls2_reader_new AGS_IPATCH_DLS2_READER AGS_IPATCH_DLS2_READER_CLASS AGS_IPATCH_DLS2_READER_GET_CLASS AGS_IS_IPATCH_DLS2_READER AGS_TYPE_IPATCH_DLS2_READER AgsIpatchDLS2Reader AgsIpatchDLS2ReaderClass ags_ipatch_dls2_reader_get_type
ags_ipatch_gig_reader AgsIpatchGigReader AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX AgsIpatchGigReaderFlags AgsGigLevel ags_ipatch_gig_reader_test_flags ags_ipatch_gig_reader_set_flags ags_ipatch_gig_reader_unset_flags ags_ipatch_gig_reader_load ags_ipatch_gig_reader_select_instrument ags_ipatch_gig_reader_select_sample ags_ipatch_gig_reader_get_instrument_all ags_ipatch_gig_reader_get_sample_all ags_ipatch_gig_reader_get_sample_by_instrument_index ags_ipatch_gig_reader_new AGS_IPATCH_GIG_READER AGS_IPATCH_GIG_READER_CLASS AGS_IPATCH_GIG_READER_GET_CLASS AGS_IS_IPATCH_GIG_READER AGS_TYPE_IPATCH_GIG_READER AgsIpatchGigReader AgsIpatchGigReaderClass ags_ipatch_gig_reader_get_type
ags_ipatch_sample AgsIpatchSample AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX AgsIpatchSampleFlags ags_ipatch_sample_test_flags ags_ipatch_sample_set_flags ags_ipatch_sample_unset_flags ags_ipatch_sample_new AGS_IPATCH_SAMPLE AGS_IPATCH_SAMPLE_CLASS AGS_IPATCH_SAMPLE_GET_CLASS AGS_IS_IPATCH_SAMPLE AGS_TYPE_IPATCH_SAMPLE AgsIpatchSample AgsIpatchSampleClass ags_ipatch_sample_get_type
ags_ipatch_sf2_reader AgsIpatchSF2Reader AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX AgsIpatchSF2ReaderFlags AgsSF2Level ags_ipatch_sf2_reader_test_flags ags_ipatch_sf2_reader_set_flags ags_ipatch_sf2_reader_unset_flags ags_ipatch_sf2_reader_load ags_ipatch_sf2_reader_select_preset ags_ipatch_sf2_reader_select_instrument ags_ipatch_sf2_reader_select_sample ags_ipatch_sf2_reader_get_preset_all ags_ipatch_sf2_reader_get_instrument_all ags_ipatch_sf2_reader_get_sample_all ags_ipatch_sf2_reader_get_instrument_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index ags_ipatch_sf2_reader_new AGS_IPATCH_SF2_READER AGS_IPATCH_SF2_READER_CLASS AGS_IPATCH_SF2_READER_GET_CLASS AGS_IS_IPATCH_SF2_READER AGS_TYPE_IPATCH_SF2_READER AgsIpatchSF2Reader AgsIpatchSF2ReaderClass ags_ipatch_sf2_reader_get_type
ags_jack_client AgsJackClient AGS_JACK_CLIENT_GET_OBJ_MUTEX AgsJackClientFlags ags_jack_client_test_flags ags_jack_client_set_flags ags_jack_client_unset_flags ags_jack_client_find_uuid ags_jack_client_find ags_jack_client_open ags_jack_client_close ags_jack_client_add_device ags_jack_client_remove_device ags_jack_client_add_port ags_jack_client_remove_port ags_jack_client_activate ags_jack_client_deactivate ags_jack_client_new AGS_IS_JACK_CLIENT AGS_JACK_CLIENT AGS_JACK_CLIENT_CLASS AGS_JACK_CLIENT_GET_CLASS AGS_TYPE_JACK_CLIENT AgsJackClient AgsJackClientClass ags_jack_client_get_type
ags_jack_devin AgsJackDevin AGS_JACK_DEVIN_GET_OBJ_MUTEX AgsJackDevinFlags AgsJackDevinSyncFlags AGS_JACK_DEVIN_ERROR AgsJackDevinError ags_jack_devin_error_quark ags_jack_devin_test_flags ags_jack_devin_set_flags ags_jack_devin_unset_flags ags_jack_devin_switch_buffer_flag ags_jack_devin_adjust_delay_and_attack ags_jack_devin_realloc_buffer ags_jack_devin_new AGS_IS_JACK_DEVIN AGS_JACK_DEVIN AGS_JACK_DEVIN_CLASS AGS_JACK_DEVIN_GET_CLASS AGS_TYPE_JACK_DEVIN AgsJackDevin AgsJackDevinClass ags_jack_devin_get_type
ags_jack_devout AgsJackDevout AGS_JACK_DEVOUT_GET_OBJ_MUTEX AgsJackDevoutFlags AgsJackDevoutSyncFlags AGS_JACK_DEVOUT_ERROR AgsJackDevoutError ags_jack_devout_error_quark ags_jack_devout_test_flags ags_jack_devout_set_flags ags_jack_devout_unset_flags ags_jack_devout_switch_buffer_flag ags_jack_devout_adjust_delay_and_attack ags_jack_devout_realloc_buffer ags_jack_devout_new AGS_IS_JACK_DEVOUT AGS_JACK_DEVOUT AGS_JACK_DEVOUT_CLASS AGS_JACK_DEVOUT_GET_CLASS AGS_TYPE_JACK_DEVOUT AgsJackDevout AgsJackDevoutClass ags_jack_devout_get_type
ags_jack_midiin AgsJackMidiin AGS_JACK_MIDIIN_GET_OBJ_MUTEX AGS_JACK_MIDIIN_DEFAULT_BUFFER_SIZE AgsJackMidiinFlags AgsJackMidiinSyncFlags AGS_JACK_MIDIIN_ERROR AgsJackMidiinError ags_jack_midiin_error_quark ags_jack_midiin_test_flags ags_jack_midiin_set_flags ags_jack_midiin_unset_flags ags_jack_midiin_switch_buffer_flag ags_jack_midiin_new AGS_IS_JACK_MIDIIN AGS_JACK_MIDIIN AGS_JACK_MIDIIN_CLASS AGS_JACK_MIDIIN_GET_CLASS AGS_TYPE_JACK_MIDIIN AgsJackMidiin AgsJackMidiinClass ags_jack_midiin_get_type
ags_jack_port AgsJackPort AGS_JACK_PORT_GET_OBJ_MUTEX AgsJackPortFlags ags_jack_port_test_flags ags_jack_port_set_flags ags_jack_port_unset_flags ags_jack_port_find ags_jack_port_register ags_jack_port_unregister ags_jack_port_new AGS_IS_JACK_PORT AGS_JACK_PORT AGS_JACK_PORT_CLASS AGS_JACK_PORT_GET_CLASS AGS_TYPE_JACK_PORT AgsJackPort AgsJackPortClass ags_jack_port_get_type
ags_jack_server AgsJackServer AGS_JACK_SERVER_GET_OBJ_MUTEX AGS_JACK_SERVER_DEFAULT_PROTOCOL AGS_JACK_SERVER_DEFAULT_HOST AGS_JACK_SERVER_DEFAULT_PORT AgsJackServerFlags ags_jack_server_test_flags ags_jack_server_set_flags ags_jack_server_unset_flags ags_jack_server_find_url ags_jack_server_find_client ags_jack_server_find_port ags_jack_server_add_client ags_jack_server_remove_client ags_jack_server_connect_client ags_jack_server_disconnect_client ags_jack_server_new AGS_IS_JACK_SERVER AGS_JACK_SERVER AGS_JACK_SERVER_CLASS AGS_JACK_SERVER_GET_CLASS AGS_TYPE_JACK_SERVER AgsJackServer AgsJackServerClass ags_jack_server_get_type
ags_ladspa_conversion AgsLadspaConversion AGS_LADSPA_CONVERSION_DEFAULT_LOWER AGS_LADSPA_CONVERSION_DEFAULT_UPPER AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT AgsLadspaConversionFlags ags_ladspa_conversion_test_flags ags_ladspa_conversion_set_flags ags_ladspa_conversion_unset_flags ags_ladspa_conversion_new AGS_IS_LADSPA_CONVERSION AGS_LADSPA_CONVERSION AGS_LADSPA_CONVERSION_CLASS AGS_LADSPA_CONVERSION_GET_CLASS AGS_TYPE_LADSPA_CONVERSION AgsLadspaConversion AgsLadspaConversionClass ags_ladspa_conversion_get_type
ags_ladspa_manager AgsLadspaManager AGS_LADSPA_MANAGER_GET_OBJ_MUTEX ags_ladspa_manager_get_default_path ags_ladspa_manager_set_default_path ags_ladspa_manager_get_filenames ags_ladspa_manager_find_ladspa_plugin ags_ladspa_manager_load_blacklist ags_ladspa_manager_load_file ags_ladspa_manager_load_default_directory ags_ladspa_manager_get_instance ags_ladspa_manager_new AGS_IS_LADSPA_MANAGER AGS_LADSPA_MANAGER AGS_LADSPA_MANAGER_CLASS AGS_LADSPA_MANAGER_GET_CLASS AGS_TYPE_LADSPA_MANAGER AgsLadspaManager AgsLadspaManagerClass ags_ladspa_manager_get_type
ags_ladspa_plugin AgsLadspaPlugin AGS_LADSPA_PLUGIN_DESCRIPTOR ags_ladspa_plugin_new AGS_IS_LADSPA_PLUGIN AGS_LADSPA_PLUGIN AGS_LADSPA_PLUGIN_CLASS AGS_LADSPA_PLUGIN_GET_CLASS AGS_TYPE_LADSPA_PLUGIN AgsLadspaPlugin AgsLadspaPluginClass ags_ladspa_plugin_get_type
ags_lfo_audio_signal AgsLfoAudioSignal ags_lfo_audio_signal_new AGS_IS_LFO_AUDIO_SIGNAL AGS_LFO_AUDIO_SIGNAL AGS_LFO_AUDIO_SIGNAL_CLASS AGS_LFO_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_LFO_AUDIO_SIGNAL AgsLfoAudioSignal AgsLfoAudioSignalClass ags_lfo_audio_signal_get_type
ags_lfo_channel AgsLfoChannel ags_lfo_channel_new AGS_IS_LFO_CHANNEL AGS_LFO_CHANNEL AGS_LFO_CHANNEL_CLASS AGS_LFO_CHANNEL_GET_CLASS AGS_TYPE_LFO_CHANNEL AgsLfoChannel AgsLfoChannelClass ags_lfo_channel_get_type
ags_lfo_channel_run AgsLfoChannelRun ags_lfo_channel_run_new AGS_IS_LFO_CHANNEL_RUN AGS_LFO_CHANNEL_RUN AGS_LFO_CHANNEL_RUN_CLASS AGS_LFO_CHANNEL_RUN_GET_CLASS AGS_TYPE_LFO_CHANNEL_RUN AgsLfoChannelRun AgsLfoChannelRunClass ags_lfo_channel_run_get_type
ags_lfo_recycling AgsLfoRecycling ags_lfo_recycling_new AGS_IS_LFO_RECYCLING AGS_LFO_RECYCLING AGS_LFO_RECYCLING_CLASS AGS_LFO_RECYCLING_GET_CLASS AGS_TYPE_LFO_RECYCLING AgsLfoRecycling AgsLfoRecyclingClass ags_lfo_recycling_get_type
ags_lfo_synth_util ags_lfo_synth_util_sin_s8 ags_lfo_synth_util_sin_s16 ags_lfo_synth_util_sin_s24 ags_lfo_synth_util_sin_s32 ags_lfo_synth_util_sin_s64 ags_lfo_synth_util_sin_float ags_lfo_synth_util_sin_double ags_lfo_synth_util_sin_complex ags_lfo_synth_util_sawtooth_s8 ags_lfo_synth_util_sawtooth_s16 ags_lfo_synth_util_sawtooth_s24 ags_lfo_synth_util_sawtooth_s32 ags_lfo_synth_util_sawtooth_s64 ags_lfo_synth_util_sawtooth_float ags_lfo_synth_util_sawtooth_double ags_lfo_synth_util_sawtooth_complex ags_lfo_synth_util_triangle_s8 ags_lfo_synth_util_triangle_s16 ags_lfo_synth_util_triangle_s24 ags_lfo_synth_util_triangle_s32 ags_lfo_synth_util_triangle_s64 ags_lfo_synth_util_triangle_float ags_lfo_synth_util_triangle_double ags_lfo_synth_util_triangle_complex ags_lfo_synth_util_square_s8 ags_lfo_synth_util_square_s16 ags_lfo_synth_util_square_s24 ags_lfo_synth_util_square_s32 ags_lfo_synth_util_square_s64 ags_lfo_synth_util_square_float ags_lfo_synth_util_square_double ags_lfo_synth_util_square_complex ags_lfo_synth_util_impulse_s8 ags_lfo_synth_util_impulse_s16 ags_lfo_synth_util_impulse_s24 ags_lfo_synth_util_impulse_s32 ags_lfo_synth_util_impulse_s64 ags_lfo_synth_util_impulse_float ags_lfo_synth_util_impulse_double ags_lfo_synth_util_impulse_complex ags_lfo_synth_util_sin ags_lfo_synth_util_sawtooth ags_lfo_synth_util_triangle ags_lfo_synth_util_square ags_lfo_synth_util_impulse
ags_link_channel AgsLinkChannel ags_link_channel_new AGS_IS_LINK_CHANNEL AGS_LINK_CHANNEL AGS_LINK_CHANNEL_CLASS AGS_LINK_CHANNEL_GET_CLASS AGS_TYPE_LINK_CHANNEL AgsLinkChannel AgsLinkChannelClass ags_link_channel_get_type
ags_loop_channel AgsLoopChannel ags_loop_channel_new AGS_IS_LOOP_CHANNEL AGS_LOOP_CHANNEL AGS_LOOP_CHANNEL_CLASS AGS_LOOP_CHANNEL_GET_CLASS AGS_TYPE_LOOP_CHANNEL AgsLoopChannel AgsLoopChannelClass ags_loop_channel_get_type
ags_loop_channel_run AgsLoopChannelRun ags_loop_channel_run_new AGS_IS_LOOP_CHANNEL_RUN AGS_LOOP_CHANNEL_RUN AGS_LOOP_CHANNEL_RUN_CLASS AGS_LOOP_CHANNEL_RUN_GET_CLASS AGS_TYPE_LOOP_CHANNEL_RUN AgsLoopChannelRun AgsLoopChannelRunClass ags_loop_channel_run_get_type
ags_lv2_conversion AgsLv2Conversion AGS_LV2_CONVERSION_DEFAULT_LOWER AGS_LV2_CONVERSION_DEFAULT_UPPER AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT AgsLv2ConversionFlaags ags_lv2_conversion_test_flags ags_lv2_conversion_set_flags ags_lv2_conversion_unset_flags ags_lv2_conversion_new AGS_IS_LV2_CONVERSION AGS_LV2_CONVERSION AGS_LV2_CONVERSION_CLASS AGS_LV2_CONVERSION_GET_CLASS AGS_TYPE_LV2_CONVERSION AgsLv2Conversion AgsLv2ConversionClass ags_lv2_conversion_get_type
ags_lv2_event_manager AgsLv2EventManager ags_lv2_event_manager_lv2_event_ref ags_lv2_event_manager_lv2_event_unref ags_lv2_event_manager_get_instance ags_lv2_event_manager_new AGS_IS_LV2_EVENT_MANAGER AGS_LV2_EVENT_MANAGER AGS_LV2_EVENT_MANAGER_CLASS AGS_LV2_EVENT_MANAGER_GET_CLASS AGS_TYPE_LV2_EVENT_MANAGER AgsLv2EventManager AgsLv2EventManagerClass ags_lv2_event_manager_get_type
ags_lv2_log_manager AgsLv2LogManager ags_lv2_log_manager_printf ags_lv2_log_manager_vprintf ags_lv2_log_manager_get_instance ags_lv2_log_manager_new AGS_IS_LV2_LOG_MANAGER AGS_LV2_LOG_MANAGER AGS_LV2_LOG_MANAGER_CLASS AGS_LV2_LOG_MANAGER_GET_CLASS AGS_TYPE_LV2_LOG_MANAGER AgsLv2LogManager AgsLv2LogManagerClass ags_lv2_log_manager_get_type
ags_lv2_manager AgsLv2Manager AGS_LV2_MANAGER_GET_OBJ_MUTEX AGS_LV2_MANAGER_DEFAULT_LOCALE ags_lv2_manager_global_get_parse_names ags_lv2_manager_global_get_preserve_turtle ags_lv2_manager_get_default_path ags_lv2_manager_set_default_path ags_lv2_manager_get_filenames ags_lv2_manager_find_lv2_plugin ags_lv2_manager_load_blacklist ags_lv2_manager_load_file ags_lv2_manager_load_preset ags_lv2_manager_load_default_directory ags_lv2_manager_get_instance ags_lv2_manager_new AGS_IS_LV2_MANAGER AGS_LV2_MANAGER AGS_LV2_MANAGER_CLASS AGS_LV2_MANAGER_GET_CLASS AGS_TYPE_LV2_MANAGER AgsLv2Manager AgsLv2ManagerClass ags_lv2_manager_get_type
ags_lv2_option_manager AgsLv2OptionManager AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX AGS_LV2_OPTION_RESSOURCE AGS_LV2_OPTIONS_OPTION AgsLv2OptionRessource ags_lv2_option_ressource_alloc ags_lv2_option_manager_ressource_insert ags_lv2_option_manager_ressource_remove ags_lv2_option_manager_ressource_lookup ags_lv2_option_manager_ressource_lookup_extended ags_lv2_option_manager_get_option ags_lv2_option_manager_set_option ags_lv2_option_manager_lv2_options_get ags_lv2_option_manager_lv2_options_set ags_lv2_option_manager_get_instance ags_lv2_option_manager_new AGS_IS_LV2_OPTION_MANAGER AGS_LV2_OPTION_MANAGER AGS_LV2_OPTION_MANAGER_CLASS AGS_LV2_OPTION_MANAGER_GET_CLASS AGS_TYPE_LV2_OPTION_MANAGER AgsLv2OptionManager AgsLv2OptionManagerClass ags_lv2_option_manager_get_type
ags_lv2_plugin AgsLv2Plugin AGS_LV2_PLUGIN_DESCRIPTOR AGS_LV2_EVENT_BUFFER AGS_LV2_EVENT AGS_LV2_EVENT_DATA AGS_LV2_ATOM_SEQUENCE AGS_LV2_ATOM_EVENT AgsLv2PluginFlags ags_lv2_plugin_test_flags ags_lv2_plugin_set_flags ags_lv2_plugin_unset_flags ags_lv2_plugin_event_buffer_alloc ags_lv2_plugin_event_buffer_realloc_data ags_lv2_plugin_event_buffer_concat ags_lv2_plugin_event_buffer_append_midi ags_lv2_plugin_event_buffer_remove_midi ags_lv2_plugin_clear_event_buffer ags_lv2_plugin_alloc_atom_sequence ags_lv2_plugin_atom_sequence_append_midi ags_lv2_plugin_atom_sequence_remove_midi ags_lv2_plugin_clear_atom_sequence ags_lv2_plugin_find_uri ags_lv2_plugin_find_pname ags_lv2_plugin_change_program ags_lv2_plugin_new AGS_IS_LV2_PLUGIN AGS_LV2_PLUGIN AGS_LV2_PLUGIN_CLASS AGS_LV2_PLUGIN_GET_CLASS AGS_TYPE_LV2_PLUGIN AgsLv2Plugin AgsLv2PluginClass ags_lv2_plugin_get_type
ags_lv2_preset AgsLv2Preset AGS_LV2_PRESET_GET_OBJ_MUTEX AGS_LV2_PORT_PRESET AgsLv2PresetFlags AgsLv2PortPreset ags_lv2_port_preset_alloc ags_lv2_port_preset_free ags_lv2_preset_parse_turtle ags_lv2_preset_find_preset_uri ags_lv2_preset_find_preset_label ags_lv2_preset_new AGS_IS_LV2_PRESET AGS_LV2_PRESET AGS_LV2_PRESET_CLASS AGS_LV2_PRESET_GET_CLASS AGS_TYPE_LV2_PRESET AgsLv2Preset AgsLv2PresetClass ags_lv2_preset_get_type
ags_lv2_preset_manager AgsLv2PresetManager AGS_LV2_PRESET_MANAGER_GET_OBJ_MUTEX ags_lv2_preset_manager_get_instance ags_lv2_preset_manager_new AGS_IS_LV2_PRESET_MANAGER AGS_LV2_PRESET_MANAGER AGS_LV2_PRESET_MANAGER_CLASS AGS_LV2_PRESET_MANAGER_GET_CLASS AGS_TYPE_LV2_PRESET_MANAGER AgsLv2PresetManager AgsLv2PresetManagerClass ags_lv2_preset_manager_get_type
ags_lv2_turtle_parser AgsLv2TurtleParser AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX ags_lv2_turtle_parser_parse_names ags_lv2_turtle_parser_parse ags_lv2_turtle_parser_new AGS_IS_LV2_TURTLE_PARSER AGS_LV2_TURTLE_PARSER AGS_LV2_TURTLE_PARSER_CLASS AGS_LV2_TURTLE_PARSER_GET_CLASS AGS_TYPE_LV2_TURTLE_PARSER AgsLv2TurtleParser AgsLv2TurtleParserClass ags_lv2_turtle_parser_get_type
ags_lv2_uri_map_manager AgsLv2UriMapManager AGS_LV2_URI_MAP_MANAGER_GET_OBJ_MUTEX ags_lv2_uri_map_manager_insert ags_lv2_uri_map_manager_remove ags_lv2_uri_map_manager_lookup ags_lv2_uri_map_manager_load_default ags_lv2_uri_map_manager_uri_to_id ags_lv2_uri_map_manager_get_instance ags_lv2_uri_map_manager_new AGS_IS_LV2_URI_MAP_MANAGER AGS_LV2_URI_MAP_MANAGER AGS_LV2_URI_MAP_MANAGER_CLASS AGS_LV2_URI_MAP_MANAGER_GET_CLASS AGS_TYPE_LV2_URI_MAP_MANAGER AgsLv2UriMapManager AgsLv2UriMapManagerClass ags_lv2_uri_map_manager_get_type
ags_lv2_urid_manager AgsLv2UridManager AGS_LV2_URID_MANAGER_GET_OBJ_MUTEX ags_lv2_urid_manager_insert ags_lv2_urid_manager_remove ags_lv2_urid_manager_lookup ags_lv2_urid_manager_load_default ags_lv2_urid_manager_map ags_lv2_urid_manager_unmap ags_lv2_urid_manager_get_instance ags_lv2_urid_manager_new AGS_IS_LV2_URID_MANAGER AGS_LV2_URID_MANAGER AGS_LV2_URID_MANAGER_CLASS AGS_LV2_URID_MANAGER_GET_CLASS AGS_TYPE_LV2_URID_MANAGER AgsLv2UridManager AgsLv2UridManagerClass ags_lv2_urid_manager_get_type
ags_lv2_worker AgsLv2Worker AGS_LV2_WORKER_GET_OBJ_MUTEX AGS_LV2_WORKER_RESPONSE_DATA AgsLv2WorkerFlags AgsLv2WorkerResponseData ags_lv2_worker_test_flags ags_lv2_worker_set_flags ags_lv2_worker_unset_flags ags_lv2_worker_alloc_response_data ags_lv2_worker_free_response_data ags_lv2_worker_respond ags_lv2_worker_schedule_work ags_lv2_worker_do_poll ags_lv2_worker_new AGS_IS_LV2_WORKER AGS_LV2_WORKER AGS_LV2_WORKER_CLASS AGS_LV2_WORKER_GET_CLASS AGS_TYPE_LV2_WORKER AgsLv2Worker AgsLv2WorkerClass ags_lv2_worker_get_type
ags_lv2_worker_manager AgsLv2WorkerManager AGS_LV2_WORKER_MANAGER_GET_OBJ_MUTEX ags_lv2_worker_manager_pull_worker ags_lv2_worker_manager_get_instance ags_lv2_worker_manager_new AGS_IS_LV2_WORKER_MANAGER AGS_LV2_WORKER_MANAGER AGS_LV2_WORKER_MANAGER_CLASS AGS_LV2_WORKER_MANAGER_GET_CLASS AGS_TYPE_LV2_WORKER_MANAGER AgsLv2WorkerManager AgsLv2WorkerManagerClass ags_lv2_worker_manager_get_type
ags_lv2ui_manager AgsLv2uiManager AGS_LV2UI_MANAGER_GET_OBJ_MUTEX ags_lv2ui_manager_get_default_path ags_lv2ui_manager_set_default_path ags_lv2ui_manager_get_filenames ags_lv2ui_manager_find_lv2ui_plugin ags_lv2ui_manager_find_lv2ui_plugin_with_index ags_lv2ui_manager_load_blacklist ags_lv2ui_manager_load_file ags_lv2ui_manager_load_default_directory ags_lv2ui_manager_get_instance ags_lv2ui_manager_new AGS_IS_LV2UI_MANAGER AGS_LV2UI_MANAGER AGS_LV2UI_MANAGER_CLASS AGS_LV2UI_MANAGER_GET_CLASS AGS_TYPE_LV2UI_MANAGER AgsLv2uiManager AgsLv2uiManagerClass ags_lv2ui_manager_get_type
ags_lv2ui_plugin AgsLv2uiPlugin AGS_LV2UI_PLUGIN_DESCRIPTOR AgsLv2uiPluginFlags ags_lv2ui_plugin_test_flags ags_lv2ui_plugin_set_flags ags_lv2ui_plugin_unset_flags ags_lv2ui_plugin_find_gui_uri ags_lv2ui_plugin_new AGS_IS_LV2UI_PLUGIN AGS_LV2UI_PLUGIN AGS_LV2UI_PLUGIN_CLASS AGS_LV2UI_PLUGIN_GET_CLASS AGS_TYPE_LV2UI_PLUGIN AgsLv2uiPlugin AgsLv2uiPluginClass ags_lv2ui_plugin_get_type
ags_midi AgsMidi AGS_MIDI_GET_OBJ_MUTEX AGS_MIDI_DEFAULT_BPM AGS_MIDI_TICS_PER_BEAT AGS_MIDI_MINIMUM_TRACK_LENGTH AGS_MIDI_DEFAULT_LENGTH AGS_MIDI_DEFAULT_JIFFIE AGS_MIDI_DEFAULT_DURATION AGS_MIDI_DEFAULT_OFFSET AGS_MIDI_CLIPBOARD_VERSION AGS_MIDI_CLIPBOARD_TYPE AGS_MIDI_CLIPBOARD_FORMAT AgsMidiFlags ags_midi_test_flags ags_midi_set_flags ags_midi_unset_flags ags_midi_find_near_timestamp ags_midi_sort_func ags_midi_add ags_midi_add_track ags_midi_remove_track ags_midi_new AGS_IS_MIDI AGS_MIDI AGS_MIDI_CLASS AGS_MIDI_GET_CLASS AGS_TYPE_MIDI AgsMidi AgsMidiClass ags_midi_get_type
ags_midi_buffer_util AgsMidiBufferUtilMtcQuarterFrameMessageType AgsMidiBufferUtilSmtpeFrameRate ags_midi_buffer_util_get_varlength_size ags_midi_buffer_util_put_varlength ags_midi_buffer_util_get_varlength ags_midi_buffer_util_put_int16 ags_midi_buffer_util_get_int16 ags_midi_buffer_util_put_int24 ags_midi_buffer_util_get_int24 ags_midi_buffer_util_put_int32 ags_midi_buffer_util_get_int32 ags_midi_buffer_util_put_header ags_midi_buffer_util_get_header ags_midi_buffer_util_put_track ags_midi_buffer_util_get_track ags_midi_buffer_util_put_key_on ags_midi_buffer_util_get_key_on ags_midi_buffer_util_put_key_off ags_midi_buffer_util_get_key_off ags_midi_buffer_util_put_key_pressure ags_midi_buffer_util_get_key_pressure ags_midi_buffer_util_put_change_parameter ags_midi_buffer_util_get_change_parameter ags_midi_buffer_util_put_pitch_bend ags_midi_buffer_util_get_pitch_bend ags_midi_buffer_util_put_change_program ags_midi_buffer_util_get_change_program ags_midi_buffer_util_put_change_pressure ags_midi_buffer_util_get_change_pressure ags_midi_buffer_util_put_sysex ags_midi_buffer_util_get_sysex ags_midi_buffer_util_put_quarter_frame ags_midi_buffer_util_get_quarter_frame ags_midi_buffer_util_put_song_position ags_midi_buffer_util_get_song_position ags_midi_buffer_util_put_song_select ags_midi_buffer_util_get_song_select ags_midi_buffer_util_put_tune_request ags_midi_buffer_util_get_tune_request ags_midi_buffer_util_put_sequence_number ags_midi_buffer_util_get_sequence_number ags_midi_buffer_util_put_smtpe ags_midi_buffer_util_get_smtpe ags_midi_buffer_util_put_tempo ags_midi_buffer_util_get_tempo ags_midi_buffer_util_put_time_signature ags_midi_buffer_util_get_time_signature ags_midi_buffer_util_put_key_signature ags_midi_buffer_util_get_key_signature ags_midi_buffer_util_put_sequencer_meta_event ags_midi_buffer_util_get_sequencer_meta_event ags_midi_buffer_util_put_text_event ags_midi_buffer_util_get_text_event ags_midi_buffer_util_put_end_of_track ags_midi_buffer_util_get_end_of_track ags_midi_buffer_util_seek_message ags_midi_buffer_util_decode
ags_midi_builder AgsMidiBuilder AGS_MIDI_BUILDER_GET_OBJ_MUTEX AGS_MIDI_BUILDER_HEADER AGS_MIDI_BUILDER_TRACK AgsMidiBuilderFlags AgsMidiBuilderHeader AgsMidiBuilderTrack ags_midi_builder_header_alloc ags_midi_builder_header_free ags_midi_builder_track_alloc ags_midi_builder_track_free ags_midi_builder_track_find_delta_time_with_track_name ags_midi_builder_track_insert_midi_message ags_midi_builder_track_get_delta_time_offset ags_midi_builder_midi_putc ags_midi_builder_on_error ags_midi_builder_append_header ags_midi_builder_append_track ags_midi_builder_append_key_on ags_midi_builder_append_key_off ags_midi_builder_append_key_pressure ags_midi_builder_append_change_parameter ags_midi_builder_append_change_pitch_bend ags_midi_builder_append_change_program ags_midi_builder_append_change_pressure ags_midi_builder_append_sysex ags_midi_builder_append_quarter_frame ags_midi_builder_append_song_position ags_midi_builder_append_song_select ags_midi_builder_append_tune_request ags_midi_builder_append_sequence_number ags_midi_builder_append_smtpe ags_midi_builder_append_tempo ags_midi_builder_append_time_signature ags_midi_builder_append_key_signature ags_midi_builder_append_sequencer_meta_event ags_midi_builder_append_text_event ags_midi_builder_append_xml_node ags_midi_builder_from_xml_doc ags_midi_builder_build ags_midi_builder_new AGS_IS_MIDI_BUILDER AGS_MIDI_BUILDER AGS_MIDI_BUILDER_CLASS AGS_MIDI_BUILDER_GET_CLASS AGS_TYPE_MIDI_BUILDER AgsMidiBuilder AgsMidiBuilderClass ags_midi_builder_get_type
ags_midi_file AgsMidiFile AGS_MIDI_FILE_GET_OBJ_MUTEX AGS_MIDI_FILE_TRACK AGS_MIDI_FILE_MAX_TEXT_LENGTH AGS_MIDI_FILE_MTHD AGS_MIDI_FILE_MTRK AGS_MIDI_FILE_DEFAULT_OFFSET AGS_MIDI_FILE_DEFAULT_FORMAT AGS_MIDI_FILE_DEFAULT_BEATS AGS_MIDI_FILE_DEFAULT_FPS AGS_MIDI_FILE_DEFAULT_TICKS AgsMidiFileStatus AgsMidiFileFlags AGS_MIDI_FILE_ERROR AgsMidiFileError AgsMidiFileTrack ags_midi_file_error_quark ags_midi_file_open ags_midi_file_open_from_data ags_midi_file_rw_open ags_midi_file_close ags_midi_file_read ags_midi_file_write ags_midi_file_seek ags_midi_file_flush ags_midi_file_read_byte ags_midi_file_read_gint16 ags_midi_file_read_gint24 ags_midi_file_read_gint32 ags_midi_file_read_varlength ags_midi_file_read_text ags_midi_file_write_byte ags_midi_file_write_gint16 ags_midi_file_write_gint24 ags_midi_file_write_gint32 ags_midi_file_write_varlength ags_midi_file_write_text ags_midi_file_read_header ags_midi_file_write_header ags_midi_file_read_track_data ags_midi_file_write_track_data ags_midi_file_read_notation ags_mid_file_read_midi ags_midi_file_new AGS_IS_MIDI_FILE AGS_MIDI_FILE AGS_MIDI_FILE_CLASS AGS_MIDI_FILE_GET_CLASS AGS_TYPE_MIDI_FILE AgsMidiFile AgsMidiFileClass ags_midi_file_get_type
ags_midi_parser AgsMidiParser AGS_MIDI_PARSER_GET_OBJ_MUTEX AGS_MIDI_PARSER_MAX_TEXT_LENGTH AGS_MIDI_PARSER_MTHD AGS_MIDI_PARSER_MTCK AGS_MIDI_EVENT AgsMidiParserFlags AgsMidiChunkFlags ags_midi_parser_read_gint16 ags_midi_parser_read_gint24 ags_midi_parser_read_gint32 ags_midi_parser_read_varlength ags_midi_parser_read_text ags_midi_parser_ticks_to_sec ags_midi_parser_midi_getc ags_midi_parser_on_error ags_midi_parser_parse_full ags_midi_parser_parse_bytes ags_midi_parser_parse_header ags_midi_parser_parse_track ags_midi_parser_channel_message ags_midi_parser_key_on ags_midi_parser_key_off ags_midi_parser_key_pressure ags_midi_parser_change_parameter ags_midi_parser_change_pitch_bend ags_midi_parser_change_program ags_midi_parser_change_channel_pressure ags_midi_parser_not_defined ags_midi_parser_sysex ags_midi_parser_system_common ags_midi_parser_meta_event ags_midi_parser_sequence_number ags_midi_parser_end_of_track ags_midi_parser_smtpe ags_midi_parser_tempo ags_midi_parser_time_signature ags_midi_parser_key_signature ags_midi_parser_sequencer_meta_event ags_midi_parser_meta_misc ags_midi_parser_text_event ags_midi_parser_new AGS_IS_MIDI_PARSER AGS_MIDI_PARSER AGS_MIDI_PARSER_CLASS AGS_MIDI_PARSER_GET_CLASS AGS_TYPE_MIDI_PARSER AgsMidiParser AgsMidiParserClass ags_midi_parser_get_type
ags_midi_util ags_midi_util_is_key_on ags_midi_util_is_key_off ags_midi_util_is_key_pressure ags_midi_util_is_change_parameter ags_midi_util_is_pitch_bend ags_midi_util_is_change_program ags_midi_util_is_change_pressure ags_midi_util_is_sysex ags_midi_util_is_quarter_frame ags_midi_util_is_song_position ags_midi_util_is_song_select ags_midi_util_is_tune_request ags_midi_util_is_meta_event ags_midi_util_to_smf ags_midi_util_delta_time_to_offset ags_midi_util_offset_to_delta_time
ags_midiin AgsMidiin AGS_MIDIIN_GET_OBJ_MUTEX AGS_MIDIIN_DEFAULT_ALSA_DEVICE AGS_MIDIIN_DEFAULT_OSS_DEVICE AGS_MIDIIN_DEFAULT_BUFFER_SIZE AgsMidiinFlags AgsMidiinSyncFlags AGS_MIDIIN_ERROR AgsMidiinError ags_midiin_error_quark ags_midiin_test_flags ags_midiin_set_flags ags_midiin_unset_flags ags_midiin_switch_buffer_flag ags_midiin_new AGS_IS_MIDIIN AGS_MIDIIN AGS_MIDIIN_CLASS AGS_MIDIIN_GET_CLASS AGS_TYPE_MIDIIN AgsMidiin AgsMidiinClass ags_midiin_get_type
ags_move_note AgsMoveNote AGS_MOVE_NOTE_DEFAULT_X_LENGTH AGS_MOVE_NOTE_DEFAULT_Y_LENGTH ags_move_note_new AGS_IS_MOVE_NOTE AGS_MOVE_NOTE AGS_MOVE_NOTE_CLASS AGS_MOVE_NOTE_GET_CLASS AGS_TYPE_MOVE_NOTE AgsMoveNote AgsMoveNoteClass ags_move_note_get_type
ags_mute_audio AgsMuteAudio ags_mute_audio_new AGS_IS_MUTE_AUDIO AGS_MUTE_AUDIO AGS_MUTE_AUDIO_CLASS AGS_MUTE_AUDIO_GET_CLASS AGS_TYPE_MUTE_AUDIO AgsMuteAudio AgsMuteAudioClass ags_mute_audio_get_type
ags_mute_audio_run AgsMuteAudioRun ags_mute_audio_run_new AGS_IS_MUTE_AUDIO_RUN AGS_MUTE_AUDIO_RUN AGS_MUTE_AUDIO_RUN_CLASS AGS_MUTE_AUDIO_RUN_GET_CLASS AGS_TYPE_MUTE_AUDIO_RUN AgsMuteAudioRun AgsMuteAudioRunClass ags_mute_audio_run_get_type
ags_mute_audio_signal AgsMuteAudioSignal ags_mute_audio_signal_new AGS_IS_MUTE_AUDIO_SIGNAL AGS_MUTE_AUDIO_SIGNAL AGS_MUTE_AUDIO_SIGNAL_CLASS AGS_MUTE_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_MUTE_AUDIO_SIGNAL AgsMuteAudioSignal AgsMuteAudioSignalClass ags_mute_audio_signal_get_type
ags_mute_channel AgsMuteChannel ags_mute_channel_new AGS_IS_MUTE_CHANNEL AGS_MUTE_CHANNEL AGS_MUTE_CHANNEL_CLASS AGS_MUTE_CHANNEL_GET_CLASS AGS_TYPE_MUTE_CHANNEL AgsMuteChannel AgsMuteChannelClass ags_mute_channel_get_type
ags_mute_channel_run AgsMuteChannelRun ags_mute_channel_run_new AGS_IS_MUTE_CHANNEL_RUN AGS_MUTE_CHANNEL_RUN AGS_MUTE_CHANNEL_RUN_CLASS AGS_MUTE_CHANNEL_RUN_GET_CLASS AGS_TYPE_MUTE_CHANNEL_RUN AgsMuteChannelRun AgsMuteChannelRunClass ags_mute_channel_run_get_type
ags_mute_recycling AgsMuteRecycling ags_mute_recycling_new AGS_IS_MUTE_RECYCLING AGS_MUTE_RECYCLING AGS_MUTE_RECYCLING_CLASS AGS_MUTE_RECYCLING_GET_CLASS AGS_TYPE_MUTE_RECYCLING AgsMuteRecycling AgsMuteRecyclingClass ags_mute_recycling_get_type
ags_notation AgsNotation AGS_NOTATION_GET_OBJ_MUTEX AGS_NOTATION_DEFAULT_BPM AGS_NOTATION_TICS_PER_BEAT AGS_NOTATION_MINIMUM_NOTE_LENGTH AGS_NOTATION_MAXIMUM_NOTE_LENGTH AGS_NOTATION_DEFAULT_LENGTH AGS_NOTATION_DEFAULT_JIFFIE AGS_NOTATION_DEFAULT_DURATION AGS_NOTATION_DEFAULT_OFFSET AGS_NOTATION_DEFAULT_END AGS_NOTATION_CLIPBOARD_VERSION AGS_NOTATION_CLIPBOARD_TYPE AGS_NOTATION_CLIPBOARD_FORMAT AgsNotationFlags ags_notation_test_flags ags_notation_set_flags ags_notation_unset_flags ags_notation_find_near_timestamp ags_notation_add ags_notation_sort_func ags_notation_add_note ags_notation_remove_note ags_notation_remove_note_at_position ags_notation_get_selection ags_notation_is_note_selected ags_notation_find_point ags_notation_find_region ags_notation_find_offset ags_notation_free_selection ags_notation_add_point_to_selection ags_notation_remove_point_from_selection ags_notation_add_region_to_selection ags_notation_remove_region_from_selection ags_notation_add_all_to_selection ags_notation_copy_selection ags_notation_cut_selection ags_notation_insert_from_clipboard ags_notation_insert_from_clipboard_extended ags_notation_to_raw_midi ags_notation_from_raw_midi ags_notation_new AGS_IS_NOTATION AGS_NOTATION AGS_NOTATION_CLASS AGS_NOTATION_GET_CLASS AGS_TYPE_NOTATION AgsNotation AgsNotationClass ags_notation_get_type
ags_note AgsNote AGS_NOTE_GET_OBJ_MUTEX AgsNoteFlags ags_note_test_flags ags_note_set_flags ags_note_unset_flags ags_note_sort_func ags_note_find_prev ags_note_find_next ags_note_length_to_smf_delta_time ags_note_smf_delta_time_to_length ags_note_to_raw_midi ags_note_to_raw_midi_extended ags_note_to_seq_event ags_note_to_seq_event_extended ags_note_from_raw_midi ags_note_from_raw_midi_extended ags_note_from_seq_event ags_note_from_seq_event_extended ags_note_duplicate ags_note_new ags_note_new_with_offset AGS_IS_NOTE AGS_NOTE AGS_NOTE_CLASS AGS_NOTE_GET_CLASS AGS_TYPE_NOTE AgsNote AgsNoteClass ags_note_get_type
ags_open_file AgsOpenFile ags_open_file_new AGS_IS_OPEN_FILE AGS_OPEN_FILE AGS_OPEN_FILE_CLASS AGS_OPEN_FILE_GET_CLASS AGS_TYPE_OPEN_FILE AgsOpenFile AgsOpenFileClass ags_open_file_get_type
ags_open_sf2_instrument AgsOpenSf2Instrument ags_open_sf2_instrument_new AGS_IS_OPEN_SF2_INSTRUMENT AGS_OPEN_SF2_INSTRUMENT AGS_OPEN_SF2_INSTRUMENT_CLASS AGS_OPEN_SF2_INSTRUMENT_GET_CLASS AGS_TYPE_OPEN_SF2_INSTRUMENT AgsOpenSf2Instrument AgsOpenSf2InstrumentClass ags_open_sf2_instrument_get_type
ags_open_sf2_sample AgsOpenSf2Sample ags_open_sf2_sample_new AGS_IS_OPEN_SF2_SAMPLE AGS_OPEN_SF2_SAMPLE AGS_OPEN_SF2_SAMPLE_CLASS AGS_OPEN_SF2_SAMPLE_GET_CLASS AGS_TYPE_OPEN_SF2_SAMPLE AgsOpenSf2Sample AgsOpenSf2SampleClass ags_open_sf2_sample_get_type
ags_open_single_file AgsOpenSingleFile ags_open_single_file_new AGS_IS_OPEN_SINGLE_FILE AGS_OPEN_SINGLE_FILE AGS_OPEN_SINGLE_FILE_CLASS AGS_OPEN_SINGLE_FILE_GET_CLASS AGS_TYPE_OPEN_SINGLE_FILE AgsOpenSingleFile AgsOpenSingleFileClass ags_open_single_file_get_type
ags_open_wave AgsOpenWave ags_open_wave_new AGS_IS_OPEN_WAVE AGS_OPEN_WAVE AGS_OPEN_WAVE_CLASS AGS_OPEN_WAVE_GET_CLASS AGS_TYPE_OPEN_WAVE AgsOpenWave AgsOpenWaveClass ags_open_wave_get_type
ags_osc_action_controller AgsOscActionController ags_osc_action_controller_run_action ags_osc_action_controller_new AGS_IS_OSC_ACTION_CONTROLLER AGS_OSC_ACTION_CONTROLLER AGS_OSC_ACTION_CONTROLLER_CLASS AGS_OSC_ACTION_CONTROLLER_GET_CLASS AGS_TYPE_OSC_ACTION_CONTROLLER AgsOscActionController AgsOscActionControllerClass ags_osc_action_controller_get_type
ags_osc_buffer_util ags_osc_buffer_util_put_int32 ags_osc_buffer_util_get_int32 ags_osc_buffer_util_put_timetag ags_osc_buffer_util_get_timetag ags_osc_buffer_util_put_float ags_osc_buffer_util_get_float ags_osc_buffer_util_put_string ags_osc_buffer_util_get_string ags_osc_buffer_util_put_blob ags_osc_buffer_util_get_blob ags_osc_buffer_util_put_int64 ags_osc_buffer_util_get_int64 ags_osc_buffer_util_put_double ags_osc_buffer_util_get_double ags_osc_buffer_util_put_char ags_osc_buffer_util_get_char ags_osc_buffer_util_put_rgba ags_osc_buffer_util_get_rgba ags_osc_buffer_util_put_midi ags_osc_buffer_util_get_midi ags_osc_buffer_util_put_packet ags_osc_buffer_util_get_packet ags_osc_buffer_util_put_packets ags_osc_buffer_util_put_message ags_osc_buffer_util_get_message ags_osc_buffer_util_put_bundle ags_osc_buffer_util_get_bundle
ags_osc_builder AgsOscBuilder AGS_OSC_BUILDER_GET_OBJ_MUTEX AGS_OSC_BUILDER_PACKET AGS_OSC_BUILDER_BUNDLE AGS_OSC_BUILDER_MESSAGE AGS_OSC_BUILDER_DEFAULT_CHUNK_SIZE AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE AgsOscBuilderFlags AgsOscBuilderPacket AgsOscBuilderBundle AgsOscBuilderMessage ags_osc_builder_packet_alloc ags_osc_builder_packet_free ags_osc_builder_bundle_alloc ags_osc_builder_bundle_free ags_osc_builder_message_alloc ags_osc_builder_message_free ags_osc_builder_osc_putc ags_osc_builder_on_error ags_osc_builder_append_packet ags_osc_builder_append_bundle ags_osc_builder_append_message ags_osc_builder_append_value ags_osc_builder_build ags_osc_builder_new AGS_IS_OSC_BUILDER AGS_OSC_BUILDER AGS_OSC_BUILDER_CLASS AGS_OSC_BUILDER_GET_CLASS AGS_TYPE_OSC_BUILDER AgsOscBuilder AgsOscBuilderClass ags_osc_builder_get_type
ags_osc_client AgsOscClient AGS_OSC_CLIENT_GET_OBJ_MUTEX AGS_OSC_CLIENT_DEFAULT_MAX_ADDRESS_LENGTH AGS_OSC_CLIENT_DEFAULT_SERVER_PORT AGS_OSC_CLIENT_DEFAULT_DOMAIN AGS_OSC_CLIENT_DEFAULT_INET4_ADDRESS AGS_OSC_CLIENT_DEFAULT_INET6_ADDRESS AGS_OSC_CLIENT_DEFAULT_MAX_RETRY AGS_OSC_CLIENT_CHUNK_SIZE AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH AgsOscClientFlags ags_osc_client_test_flags ags_osc_client_set_flags ags_osc_client_unset_flags ags_osc_client_resolve ags_osc_client_connect ags_osc_client_read_bytes ags_osc_client_write_bytes ags_osc_client_new AGS_IS_OSC_CLIENT AGS_OSC_CLIENT AGS_OSC_CLIENT_CLASS AGS_OSC_CLIENT_GET_CLASS AGS_TYPE_OSC_CLIENT AgsOscClient AgsOscClientClass ags_osc_client_get_type
ags_osc_config_controller AgsOscConfigController ags_osc_config_controller_apply_config ags_osc_config_controller_new AGS_IS_OSC_CONFIG_CONTROLLER AGS_OSC_CONFIG_CONTROLLER AGS_OSC_CONFIG_CONTROLLER_CLASS AGS_OSC_CONFIG_CONTROLLER_GET_CLASS AGS_TYPE_OSC_CONFIG_CONTROLLER AgsOscConfigController AgsOscConfigControllerClass ags_osc_config_controller_get_type
ags_osc_connection AgsOscConnection AGS_OSC_CONNECTION_GET_OBJ_MUTEX AGS_OSC_CONNECTION_TIMEOUT_USEC AGS_OSC_CONNECTION_DEAD_LINE_USEC AGS_OSC_CONNECTION_CHUNK_SIZE AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH AgsOscConnectionFlags ags_osc_connection_test_flags ags_osc_connection_set_flags ags_osc_connection_unset_flags ags_osc_connection_timeout_expired ags_osc_connection_read_bytes ags_osc_connection_write_response ags_osc_connection_close ags_osc_connection_new AGS_IS_OSC_CONNECTION AGS_OSC_CONNECTION AGS_OSC_CONNECTION_CLASS AGS_OSC_CONNECTION_GET_CLASS AGS_TYPE_OSC_CONNECTION AgsOscConnection AgsOscConnectionClass ags_osc_connection_get_type
ags_osc_controller AgsOscController AGS_OSC_CONTROLLER_GET_OBJ_MUTEX ags_osc_controller_new AGS_IS_OSC_CONTROLLER AGS_OSC_CONTROLLER AGS_OSC_CONTROLLER_CLASS AGS_OSC_CONTROLLER_GET_CLASS AGS_TYPE_OSC_CONTROLLER AgsOscController AgsOscControllerClass ags_osc_controller_get_type
ags_osc_export_controller AgsOscExportController ags_osc_export_controller_do_export ags_osc_export_controller_new AGS_IS_OSC_EXPORT_CONTROLLER AGS_OSC_EXPORT_CONTROLLER AGS_OSC_EXPORT_CONTROLLER_CLASS AGS_OSC_EXPORT_CONTROLLER_GET_CLASS AGS_TYPE_OSC_EXPORT_CONTROLLER AgsOscExportController AgsOscExportControllerClass ags_osc_export_controller_get_type
ags_osc_front_controller AgsOscFrontController AgsOscFrontControllerFlags ags_osc_front_controller_test_flags ags_osc_front_controller_set_flags ags_osc_front_controller_unset_flags ags_osc_front_controller_add_message ags_osc_front_controller_remove_message ags_osc_front_controller_start_delegate ags_osc_front_controller_stop_delegate ags_osc_front_controller_do_request ags_osc_front_controller_new AGS_IS_OSC_FRONT_CONTROLLER AGS_OSC_FRONT_CONTROLLER AGS_OSC_FRONT_CONTROLLER_CLASS AGS_OSC_FRONT_CONTROLLER_GET_CLASS AGS_TYPE_OSC_FRONT_CONTROLLER AgsOscFrontController AgsOscFrontControllerClass ags_osc_front_controller_get_type
ags_osc_info_controller AgsOscInfoController ags_osc_info_controller_get_info ags_osc_info_controller_new AGS_IS_OSC_INFO_CONTROLLER AGS_OSC_INFO_CONTROLLER AGS_OSC_INFO_CONTROLLER_CLASS AGS_OSC_INFO_CONTROLLER_GET_CLASS AGS_TYPE_OSC_INFO_CONTROLLER AgsOscInfoController AgsOscInfoControllerClass ags_osc_info_controller_get_type
ags_osc_message AgsOscMessage AGS_OSC_MESSAGE_GET_OBJ_MUTEX ags_osc_message_sort_func ags_osc_message_new AGS_IS_OSC_MESSAGE AGS_OSC_MESSAGE AGS_OSC_MESSAGE_CLASS AGS_OSC_MESSAGE_GET_CLASS AGS_TYPE_OSC_MESSAGE AgsOscMessage AgsOscMessageClass ags_osc_message_get_type
ags_osc_meter_controller AgsOscMeterController AGS_OSC_METER_CONTROLLER_DEFAULT_MONITOR_TIMEOUT AGS_OSC_METER_CONTROLLER_MONITOR AgsOscMeterControllerFlags AgsOscMeterControllerMonitor ags_osc_meter_controller_test_flags ags_osc_meter_controller_set_flags ags_osc_meter_controller_unset_flags ags_osc_meter_controller_monitor_alloc ags_osc_meter_controller_monitor_free ags_osc_meter_controller_monitor_ref ags_osc_meter_controller_monitor_unref ags_osc_meter_controller_monitor_find_path ags_osc_meter_controller_monitor_find_port ags_osc_meter_controller_add_monitor ags_osc_meter_controller_remove_monitor ags_osc_meter_controller_contains_monitor ags_osc_meter_controller_start_monitor ags_osc_meter_controller_stop_monitor ags_osc_meter_controller_monitor_meter ags_osc_meter_controller_new AGS_IS_OSC_METER_CONTROLLER AGS_OSC_METER_CONTROLLER AGS_OSC_METER_CONTROLLER_CLASS AGS_OSC_METER_CONTROLLER_GET_CLASS AGS_TYPE_OSC_METER_CONTROLLER AgsOscMeterController AgsOscMeterControllerClass ags_osc_meter_controller_get_type
ags_osc_node_controller AgsOscNodeController AGS_OSC_NODE_CONTROLLER_CONTEXT_PATH_LENGTH ags_osc_node_controller_get_data ags_osc_node_controller_new AGS_IS_OSC_NODE_CONTROLLER AGS_OSC_NODE_CONTROLLER AGS_OSC_NODE_CONTROLLER_CLASS AGS_OSC_NODE_CONTROLLER_GET_CLASS AGS_TYPE_OSC_NODE_CONTROLLER AgsOscNodeController AgsOscNodeControllerClass ags_osc_node_controller_get_type
ags_osc_parser AgsOscParser AGS_OSC_PARSER_GET_OBJ_MUTEX AGS_OSC_PARSER_MAX_TEXT_LENGTH AgsOscParserFlags ags_osc_parser_read_gint32 ags_osc_parser_read_gint64 ags_osc_parser_read_gfloat ags_osc_parser_read_gdouble ags_osc_parser_read_text ags_osc_parser_osc_getc ags_osc_parser_on_error ags_osc_parser_parse_full ags_osc_parser_parse_bytes ags_osc_parser_packet ags_osc_parser_bundle ags_osc_parser_message ags_osc_parser_value ags_osc_parser_new AGS_IS_OSC_PARSER AGS_OSC_PARSER AGS_OSC_PARSER_CLASS AGS_OSC_PARSER_GET_CLASS AGS_TYPE_OSC_PARSER AgsOscParser AgsOscParserClass ags_osc_parser_get_type
ags_osc_plugin_controller AgsOscPluginController ags_osc_plugin_controller_do_request AGS_IS_OSC_PLUGIN_CONTROLLER AGS_IS_OSC_PLUGIN_CONTROLLER_INTERFACE AGS_OSC_PLUGIN_CONTROLLER AGS_OSC_PLUGIN_CONTROLLER_GET_INTERFACE AGS_OSC_PLUGIN_CONTROLLER_INTERFACE AGS_TYPE_OSC_PLUGIN_CONTROLLER AgsOscPluginController AgsOscPluginControllerInterface ags_osc_plugin_controller_get_type
ags_osc_renew_controller AgsOscRenewController AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH ags_osc_renew_controller_set_data ags_osc_renew_controller_new AGS_IS_OSC_RENEW_CONTROLLER AGS_OSC_RENEW_CONTROLLER AGS_OSC_RENEW_CONTROLLER_CLASS AGS_OSC_RENEW_CONTROLLER_GET_CLASS AGS_TYPE_OSC_RENEW_CONTROLLER AgsOscRenewController AgsOscRenewControllerClass ags_osc_renew_controller_get_type
ags_osc_response AgsOscResponse AGS_OSC_RESPONSE_GET_OBJ_MUTEX AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT AGS_OSC_RESPONSE_ERROR_MESSAGE_MISSING_INDEX AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE AgsOscResponseFlags ags_osc_response_test_flags ags_osc_response_set_flags ags_osc_response_unset_flags ags_osc_response_new AGS_IS_OSC_RESPONSE AGS_OSC_RESPONSE AGS_OSC_RESPONSE_CLASS AGS_OSC_RESPONSE_GET_CLASS AGS_TYPE_OSC_RESPONSE AgsOscResponse AgsOscResponseClass ags_osc_response_get_type
ags_osc_server AgsOscServer AGS_OSC_SERVER_GET_OBJ_MUTEX AGS_OSC_SERVER_DEFAULT_MAX_ADDRESS_LENGTH AGS_OSC_SERVER_DEFAULT_SERVER_PORT AGS_OSC_SERVER_DEFAULT_DOMAIN AGS_OSC_SERVER_DEFAULT_INET4_ADDRESS AGS_OSC_SERVER_DEFAULT_INET6_ADDRESS AGS_OSC_SERVER_DEFAULT_BACKLOG AGS_OSC_SERVER_DEFAULT_MAX_CONNECTIONS AgsOscServerFlags ags_osc_server_test_flags ags_osc_server_set_flags ags_osc_server_unset_flags ags_osc_server_add_connection ags_osc_server_remove_connection ags_osc_server_add_controller ags_osc_server_remove_controller ags_osc_server_add_default_controller ags_osc_server_start ags_osc_server_stop ags_osc_server_listen ags_osc_server_dispatch ags_osc_server_new AGS_IS_OSC_SERVER AGS_OSC_SERVER AGS_OSC_SERVER_CLASS AGS_OSC_SERVER_GET_CLASS AGS_TYPE_OSC_SERVER AgsOscServer AgsOscServerClass ags_osc_server_get_type
ags_osc_status_controller AgsOscStatusController ags_osc_status_controller_get_status ags_osc_status_controller_new AGS_IS_OSC_STATUS_CONTROLLER AGS_OSC_STATUS_CONTROLLER AGS_OSC_STATUS_CONTROLLER_CLASS AGS_OSC_STATUS_CONTROLLER_GET_CLASS AGS_TYPE_OSC_STATUS_CONTROLLER AgsOscStatusController AgsOscStatusControllerClass ags_osc_status_controller_get_type
ags_osc_util AGS_OSC_UTIL_TYPE_TAG_STRING_INT32 AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT AGS_OSC_UTIL_TYPE_TAG_STRING_STRING AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB AGS_OSC_UTIL_TYPE_TAG_STRING_INT64 AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE AGS_OSC_UTIL_TYPE_TAG_STRING_NIL AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END AGS_OSC_UTIL_TYPE_TAG_STRING_ALL AGS_OSC_UTIL_ADDRESS_PATTERN_VALID_CHARS_PATTERN AGS_OSC_UTIL_SLIP_CHUNK_LENGTH AGS_OSC_UTIL_SLIP_END AGS_OSC_UTIL_SLIP_ESC AGS_OSC_UTIL_SLIP_ESC_END AGS_OSC_UTIL_SLIP_ESC_ESC ags_osc_util_type_tag_string_count_type ags_osc_util_meta_data ags_osc_util_mime_header ags_osc_util_slip_encode ags_osc_util_slip_decode ags_osc_util_timetag_now
ags_osc_websocket_connection AgsOscWebsocketConnection ags_osc_websocket_connection_find_resource_id ags_osc_websocket_connection_new AGS_IS_OSC_WEBSOCKET_CONNECTION AGS_OSC_WEBSOCKET_CONNECTION AGS_OSC_WEBSOCKET_CONNECTION_CLASS AGS_OSC_WEBSOCKET_CONNECTION_GET_CLASS AGS_TYPE_OSC_WEBSOCKET_CONNECTION AgsOscWebsocketConnection AgsOscWebsocketConnectionClass ags_osc_websocket_connection_get_type
ags_osc_xmlrpc_controller AgsOscXmlrpcController AgsOscXmlrpcControllerFlags ags_osc_xmlrpc_controller_test_flags ags_osc_xmlrpc_controller_set_flags ags_osc_xmlrpc_controller_unset_flags ags_osc_xmlrpc_controller_add_message ags_osc_xmlrpc_controller_remove_message ags_osc_xmlrpc_controller_start_delegate ags_osc_xmlrpc_controller_stop_delegate ags_osc_xmlrpc_controller_new AGS_IS_OSC_XMLRPC_CONTROLLER AGS_OSC_XMLRPC_CONTROLLER AGS_OSC_XMLRPC_CONTROLLER_CLASS AGS_OSC_XMLRPC_CONTROLLER_GET_CLASS AGS_TYPE_OSC_XMLRPC_CONTROLLER AgsOscXmlrpcController AgsOscXmlrpcControllerClass ags_osc_xmlrpc_controller_get_type
ags_osc_xmlrpc_message AgsOscXmlrpcMessage ags_osc_xmlrpc_message_new AGS_IS_OSC_XMLRPC_MESSAGE AGS_OSC_XMLRPC_MESSAGE AGS_OSC_XMLRPC_MESSAGE_CLASS AGS_OSC_XMLRPC_MESSAGE_GET_CLASS AGS_TYPE_OSC_XMLRPC_MESSAGE AgsOscXmlrpcMessage AgsOscXmlrpcMessageClass ags_osc_xmlrpc_message_get_type
ags_osc_xmlrpc_server AgsOscXmlrpcServer AGS_OSC_XMLRPC_SERVER_DEFAULT_CHUNK_SIZE ags_osc_xmlrpc_server_add_websocket_handler ags_osc_xmlrpc_server_add_default_controller ags_osc_xmlrpc_server_new AGS_IS_OSC_XMLRPC_SERVER AGS_OSC_XMLRPC_SERVER AGS_OSC_XMLRPC_SERVER_CLASS AGS_OSC_XMLRPC_SERVER_GET_CLASS AGS_TYPE_OSC_XMLRPC_SERVER AgsOscXmlrpcServer AgsOscXmlrpcServerClass ags_osc_xmlrpc_server_get_type
ags_output AgsOutput ags_output_find_first_input_recycling ags_output_find_last_input_recycling ags_output_new AGS_IS_OUTPUT AGS_OUTPUT AGS_OUTPUT_CLASS AGS_OUTPUT_GET_CLASS AGS_TYPE_OUTPUT AgsOutput AgsOutputClass ags_output_get_type
ags_pattern AgsPattern AGS_PATTERN_GET_OBJ_MUTEX AGS_PATTERN_DEFAULT_BPM AGS_PATTERN_TICS_PER_BEAT AGS_PATTERN_MINIMUM_NOTE_LENGTH AGS_PATTERN_MAXIMUM_NOTE_LENGTH AGS_PATTERN_DEFAULT_LENGTH AGS_PATTERN_DEFAULT_JIFFIE AGS_PATTERN_DEFAULT_DURATION AGS_PATTERN_DEFAULT_OFFSET AgsPatternFlags ags_pattern_test_flags ags_pattern_set_flags ags_pattern_unset_flags ags_pattern_find_near_timestamp ags_pattern_set_dim ags_pattern_is_empty ags_pattern_get_bit ags_pattern_toggle_bit ags_pattern_new AGS_IS_PATTERN AGS_PATTERN AGS_PATTERN_CLASS AGS_PATTERN_GET_CLASS AGS_TYPE_PATTERN AgsPattern AgsPatternClass ags_pattern_get_type
ags_peak_audio_signal AgsPeakAudioSignal ags_peak_audio_signal_new AGS_IS_PEAK_AUDIO_SIGNAL AGS_PEAK_AUDIO_SIGNAL AGS_PEAK_AUDIO_SIGNAL_CLASS AGS_PEAK_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_PEAK_AUDIO_SIGNAL AgsPeakAudioSignal AgsPeakAudioSignalClass ags_peak_audio_signal_get_type
ags_peak_channel AgsPeakChannel ags_peak_channel_buffer_add ags_peak_channel_retrieve_peak_internal ags_peak_channel_new AGS_IS_PEAK_CHANNEL AGS_PEAK_CHANNEL AGS_PEAK_CHANNEL_CLASS AGS_PEAK_CHANNEL_GET_CLASS AGS_TYPE_PEAK_CHANNEL AgsPeakChannel AgsPeakChannelClass ags_peak_channel_get_type
ags_peak_channel_run AgsPeakChannelRun ags_peak_channel_run_new AGS_IS_PEAK_CHANNEL_RUN AGS_PEAK_CHANNEL_RUN AGS_PEAK_CHANNEL_RUN_CLASS AGS_PEAK_CHANNEL_RUN_GET_CLASS AGS_TYPE_PEAK_CHANNEL_RUN AgsPeakChannelRun AgsPeakChannelRunClass ags_peak_channel_run_get_type
ags_peak_recycling AgsPeakRecycling ags_peak_recycling_new AGS_IS_PEAK_RECYCLING AGS_PEAK_RECYCLING AGS_PEAK_RECYCLING_CLASS AGS_PEAK_RECYCLING_GET_CLASS AGS_TYPE_PEAK_RECYCLING AgsPeakRecycling AgsPeakRecyclingClass ags_peak_recycling_get_type
ags_play_audio AgsPlayAudio ags_play_audio_new AGS_IS_PLAY_AUDIO AGS_PLAY_AUDIO AGS_PLAY_AUDIO_CLASS AGS_PLAY_AUDIO_GET_CLASS AGS_TYPE_PLAY_AUDIO AgsPlayAudio AgsPlayAudioClass ags_play_audio_get_type
ags_play_audio_signal AgsPlayAudioSignal ags_play_audio_signal_new AGS_IS_PLAY_AUDIO_SIGNAL AGS_PLAY_AUDIO_SIGNAL AGS_PLAY_AUDIO_SIGNAL_CLASS AGS_PLAY_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_PLAY_AUDIO_SIGNAL AgsPlayAudioSignal AgsPlayAudioSignalClass ags_play_audio_signal_get_type
ags_play_channel AgsPlayChannel ags_play_channel_new AGS_IS_PLAY_CHANNEL AGS_PLAY_CHANNEL AGS_PLAY_CHANNEL_CLASS AGS_PLAY_CHANNEL_GET_CLASS AGS_TYPE_PLAY_CHANNEL AgsPlayChannel AgsPlayChannelClass ags_play_channel_get_type
ags_play_channel_run AgsPlayChannelRun AgsPlayChannelRunFlags ags_play_channel_run_test_flags ags_play_channel_run_set_flags ags_play_channel_run_unset_flags ags_play_channel_run_new AGS_IS_PLAY_CHANNEL_RUN AGS_PLAY_CHANNEL_RUN AGS_PLAY_CHANNEL_RUN_CLASS AGS_PLAY_CHANNEL_RUN_GET_CLASS AGS_TYPE_PLAY_CHANNEL_RUN AgsPlayChannelRun AgsPlayChannelRunClass ags_play_channel_run_get_type
ags_play_channel_run_master AgsPlayChannelRunMaster AGS_PLAY_CHANNEL_RUN_MASTER_STREAMER AgsPlayChannelRunMasterFlags ags_play_channel_run_master_test_flags ags_play_channel_run_master_set_flags ags_play_channel_run_master_unset_flags ags_play_channel_run_master_new AgsPlayChannelRunMasterStreamer AGS_IS_PLAY_CHANNEL_RUN_MASTER AGS_PLAY_CHANNEL_RUN_MASTER AGS_PLAY_CHANNEL_RUN_MASTER_CLASS AGS_PLAY_CHANNEL_RUN_MASTER_GET_CLASS AGS_TYPE_PLAY_CHANNEL_RUN_MASTER AgsPlayChannelRunMaster AgsPlayChannelRunMasterClass ags_play_channel_run_master_get_type
ags_play_dssi_audio AgsPlayDssiAudio ags_play_dssi_audio_load ags_play_dssi_audio_load_ports ags_play_dssi_audio_load_conversion ags_play_dssi_audio_find ags_play_dssi_audio_new AGS_IS_PLAY_DSSI_AUDIO AGS_PLAY_DSSI_AUDIO AGS_PLAY_DSSI_AUDIO_CLASS AGS_PLAY_DSSI_AUDIO_GET_CLASS AGS_TYPE_PLAY_DSSI_AUDIO AgsPlayDssiAudio AgsPlayDssiAudioClass ags_play_dssi_audio_get_type
ags_play_dssi_audio_run AgsPlayDssiAudioRun AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT ags_play_dssi_audio_run_load_ports ags_play_dssi_audio_run_new AGS_IS_PLAY_DSSI_AUDIO_RUN AGS_PLAY_DSSI_AUDIO_RUN AGS_PLAY_DSSI_AUDIO_RUN_CLASS AGS_PLAY_DSSI_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_DSSI_AUDIO_RUN AgsPlayDssiAudioRun AgsPlayDssiAudioRunClass ags_play_dssi_audio_run_get_type
ags_play_lv2_audio AgsPlayLv2Audio AgsPlayLv2AudioFLags ags_play_lv2_audio_test_flags ags_play_lv2_audio_set_flags ags_play_lv2_audio_unset_flags ags_play_lv2_audio_load ags_play_lv2_audio_load_ports ags_play_lv2_audio_load_conversion ags_play_lv2_audio_find ags_play_lv2_audio_new AGS_IS_PLAY_LV2_AUDIO AGS_PLAY_LV2_AUDIO AGS_PLAY_LV2_AUDIO_CLASS AGS_PLAY_LV2_AUDIO_GET_CLASS AGS_TYPE_PLAY_LV2_AUDIO AgsPlayLv2Audio AgsPlayLv2AudioClass ags_play_lv2_audio_get_type
ags_play_lv2_audio_run AgsPlayLv2AudioRun AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT ags_play_lv2_audio_run_load_ports ags_play_lv2_audio_run_new AGS_IS_PLAY_LV2_AUDIO_RUN AGS_PLAY_LV2_AUDIO_RUN AGS_PLAY_LV2_AUDIO_RUN_CLASS AGS_PLAY_LV2_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_LV2_AUDIO_RUN AgsPlayLv2AudioRun AgsPlayLv2AudioRunClass ags_play_lv2_audio_run_get_type
ags_play_notation_audio AgsPlayNotationAudio ags_play_notation_audio_new AGS_IS_PLAY_NOTATION_AUDIO AGS_PLAY_NOTATION_AUDIO AGS_PLAY_NOTATION_AUDIO_CLASS AGS_PLAY_NOTATION_AUDIO_GET_CLASS AGS_TYPE_PLAY_NOTATION_AUDIO AgsPlayNotationAudio AgsPlayNotationAudioClass ags_play_notation_audio_get_type
ags_play_notation_audio_run AgsPlayNotationAudioRun ags_play_notation_audio_run_new AGS_IS_PLAY_NOTATION_AUDIO_RUN AGS_PLAY_NOTATION_AUDIO_RUN AGS_PLAY_NOTATION_AUDIO_RUN_CLASS AGS_PLAY_NOTATION_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_NOTATION_AUDIO_RUN AgsPlayNotationAudioRun AgsPlayNotationAudioRunClass ags_play_notation_audio_run_get_type
ags_play_recycling AgsPlayRecycling ags_play_recycling_new AGS_IS_PLAY_RECYCLING AGS_PLAY_RECYCLING AGS_PLAY_RECYCLING_CLASS AGS_PLAY_RECYCLING_GET_CLASS AGS_TYPE_PLAY_RECYCLING AgsPlayRecycling AgsPlayRecyclingClass ags_play_recycling_get_type
ags_play_wave_audio AgsPlayWaveAudio ags_play_wave_audio_new AGS_IS_PLAY_WAVE_AUDIO AGS_PLAY_WAVE_AUDIO AGS_PLAY_WAVE_AUDIO_CLASS AGS_PLAY_WAVE_AUDIO_GET_CLASS AGS_TYPE_PLAY_WAVE_AUDIO AgsPlayWaveAudio AgsPlayWaveAudioClass ags_play_wave_audio_get_type
ags_play_wave_audio_run AgsPlayWaveAudioRun ags_play_wave_audio_run_new AGS_IS_PLAY_WAVE_AUDIO_RUN AGS_PLAY_WAVE_AUDIO_RUN AGS_PLAY_WAVE_AUDIO_RUN_CLASS AGS_PLAY_WAVE_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_WAVE_AUDIO_RUN AgsPlayWaveAudioRun AgsPlayWaveAudioRunClass ags_play_wave_audio_run_get_type
ags_play_wave_channel AgsPlayWaveChannel ags_play_wave_channel_new AGS_IS_PLAY_WAVE_CHANNEL AGS_PLAY_WAVE_CHANNEL AGS_PLAY_WAVE_CHANNEL_CLASS AGS_PLAY_WAVE_CHANNEL_GET_CLASS AGS_TYPE_PLAY_WAVE_CHANNEL AgsPlayWaveChannel AgsPlayWaveChannelClass ags_play_wave_channel_get_type
ags_play_wave_channel_run AgsPlayWaveChannelRun ags_play_wave_channel_run_new AGS_IS_PLAY_WAVE_CHANNEL_RUN AGS_PLAY_WAVE_CHANNEL_RUN AGS_PLAY_WAVE_CHANNEL_RUN_CLASS AGS_PLAY_WAVE_CHANNEL_RUN_GET_CLASS AGS_TYPE_PLAY_WAVE_CHANNEL_RUN AgsPlayWaveChannelRun AgsPlayWaveChannelRunClass ags_play_wave_channel_run_get_type
ags_playback AgsPlayback AGS_PLAYBACK_GET_OBJ_MUTEX AgsPlaybackFlags ags_playback_test_flags ags_playback_set_flags ags_playback_unset_flags ags_playback_set_channel_thread ags_playback_get_channel_thread ags_playback_set_recall_id ags_playback_get_recall_id ags_playback_find_channel ags_playback_new AGS_IS_PLAYBACK AGS_PLAYBACK AGS_PLAYBACK_CLASS AGS_PLAYBACK_GET_CLASS AGS_TYPE_PLAYBACK AgsPlayback AgsPlaybackClass ags_playback_get_type
ags_playback_domain AgsPlaybackDomain AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX AgsPlaybackDomainFlags ags_playback_domain_test_flags ags_playback_domain_set_flags ags_playback_domain_unset_flags ags_playback_domain_set_audio_thread ags_playback_domain_get_audio_thread ags_playback_domain_add_playback ags_playback_domain_remove_playback ags_playback_domain_new AGS_IS_PLAYBACK_DOMAIN AGS_PLAYBACK_DOMAIN AGS_PLAYBACK_DOMAIN_CLASS AGS_PLAYBACK_DOMAIN_GET_CLASS AGS_TYPE_PLAYBACK_DOMAIN AgsPlaybackDomain AgsPlaybackDomainClass ags_playback_domain_get_type
ags_plugin_port AgsPluginPort AGS_PLUGIN_PORT_GET_OBJ_MUTEX AgsPluginPortFlags ags_plugin_port_test_flags ags_plugin_port_set_flags ags_plugin_port_unset_flags ags_plugin_port_find_symbol ags_plugin_port_find_port_index ags_plugin_port_new AGS_IS_PLUGIN_PORT AGS_PLUGIN_PORT AGS_PLUGIN_PORT_CLASS AGS_PLUGIN_PORT_GET_CLASS AGS_TYPE_PLUGIN_PORT AgsPluginPort AgsPluginPortClass ags_plugin_port_get_type
ags_plugin_stock AGS_PLUGIN_NAME_VOLUME
ags_port AgsPort AGS_PORT_GET_OBJ_MUTEX AgsPortFlags ags_port_test_flags ags_port_set_flags ags_port_unset_flags ags_port_safe_read ags_port_safe_read_raw ags_port_safe_write ags_port_safe_write_raw ags_port_safe_get_property ags_port_safe_set_property ags_port_find_specifier ags_port_add_automation ags_port_remove_automation ags_port_new AGS_IS_PORT AGS_PORT AGS_PORT_CLASS AGS_PORT_GET_CLASS AGS_TYPE_PORT AgsPort AgsPortClass ags_port_get_type
ags_prepare_audio_signal AgsPrepareAudioSignal ags_prepare_audio_signal_new AGS_IS_PREPARE_AUDIO_SIGNAL AGS_PREPARE_AUDIO_SIGNAL AGS_PREPARE_AUDIO_SIGNAL_CLASS AGS_PREPARE_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_PREPARE_AUDIO_SIGNAL AgsPrepareAudioSignal AgsPrepareAudioSignalClass ags_prepare_audio_signal_get_type
ags_prepare_channel AgsPrepareChannel ags_prepare_channel_new AGS_IS_PREPARE_CHANNEL AGS_PREPARE_CHANNEL AGS_PREPARE_CHANNEL_CLASS AGS_PREPARE_CHANNEL_GET_CLASS AGS_TYPE_PREPARE_CHANNEL AgsPrepareChannel AgsPrepareChannelClass ags_prepare_channel_get_type
ags_prepare_channel_run AgsPrepareChannelRun ags_prepare_channel_run_new AGS_IS_PREPARE_CHANNEL_RUN AGS_PREPARE_CHANNEL_RUN AGS_PREPARE_CHANNEL_RUN_CLASS AGS_PREPARE_CHANNEL_RUN_GET_CLASS AGS_TYPE_PREPARE_CHANNEL_RUN AgsPrepareChannelRun AgsPrepareChannelRunClass ags_prepare_channel_run_get_type
ags_prepare_recycling AgsPrepareRecycling ags_prepare_recycling_new AGS_IS_PREPARE_RECYCLING AGS_PREPARE_RECYCLING AGS_PREPARE_RECYCLING_CLASS AGS_PREPARE_RECYCLING_GET_CLASS AGS_TYPE_PREPARE_RECYCLING AgsPrepareRecycling AgsPrepareRecyclingClass ags_prepare_recycling_get_type
ags_preset AgsPreset AGS_PRESET_GET_OBJ_MUTEX AgsPresetFlags AGS_PRESET_ERROR AgsPresetError ags_preset_error_quark ags_preset_test_flags ags_preset_set_flags ags_preset_unset_flags ags_preset_find_scope ags_preset_find_name ags_preset_add_parameter ags_preset_remove_parameter ags_preset_get_parameter ags_preset_new AGS_IS_PRESET AGS_PRESET AGS_PRESET_CLASS AGS_PRESET_GET_CLASS AGS_TYPE_PRESET AgsPreset AgsPresetClass ags_preset_get_type
ags_pulse_client AgsPulseClient AGS_PULSE_CLIENT_GET_OBJ_MUTEX AgsPulseClientFlags ags_pulse_client_test_flags ags_pulse_client_set_flags ags_pulse_client_unset_flags ags_pulse_client_find_uuid ags_pulse_client_find ags_pulse_client_open ags_pulse_client_close ags_pulse_client_add_device ags_pulse_client_remove_device ags_pulse_client_add_port ags_pulse_client_remove_port ags_pulse_client_activate ags_pulse_client_deactivate ags_pulse_client_new AGS_IS_PULSE_CLIENT AGS_PULSE_CLIENT AGS_PULSE_CLIENT_CLASS AGS_PULSE_CLIENT_GET_CLASS AGS_TYPE_PULSE_CLIENT AgsPulseClient AgsPulseClientClass ags_pulse_client_get_type
ags_pulse_devin AgsPulseDevin AGS_PULSE_DEVIN_GET_OBJ_MUTEX AgsPulseDevinFlags AgsPulseDevinSyncFlags AGS_PULSE_DEVIN_ERROR AgsPulseDevinError ags_pulse_devin_error_quark ags_pulse_devin_test_flags ags_pulse_devin_set_flags ags_pulse_devin_unset_flags ags_pulse_devin_switch_buffer_flag ags_pulse_devin_adjust_delay_and_attack ags_pulse_devin_realloc_buffer ags_pulse_devin_new AGS_IS_PULSE_DEVIN AGS_PULSE_DEVIN AGS_PULSE_DEVIN_CLASS AGS_PULSE_DEVIN_GET_CLASS AGS_TYPE_PULSE_DEVIN AgsPulseDevin AgsPulseDevinClass ags_pulse_devin_get_type
ags_pulse_devout AgsPulseDevout AGS_PULSE_DEVOUT_GET_OBJ_MUTEX AgsPulseDevoutFlags AgsPulseDevoutSyncFlags AGS_PULSE_DEVOUT_ERROR AgsPulseDevoutError ags_pulse_devout_error_quark ags_pulse_devout_test_flags ags_pulse_devout_set_flags ags_pulse_devout_unset_flags ags_pulse_devout_switch_buffer_flag ags_pulse_devout_adjust_delay_and_attack ags_pulse_devout_realloc_buffer ags_pulse_devout_new AGS_IS_PULSE_DEVOUT AGS_PULSE_DEVOUT AGS_PULSE_DEVOUT_CLASS AGS_PULSE_DEVOUT_GET_CLASS AGS_TYPE_PULSE_DEVOUT AgsPulseDevout AgsPulseDevoutClass ags_pulse_devout_get_type
ags_pulse_port AgsPulsePort AGS_PULSE_PORT_GET_OBJ_MUTEX AGS_PULSE_PORT_DEFAULT_CACHE_BUFFER_SIZE AgsPulsePortFlags ags_pulse_port_test_flags ags_pulse_port_set_flags ags_pulse_port_unset_flags ags_pulse_port_find ags_pulse_port_register ags_pulse_port_unregister ags_pulse_port_get_fixed_size ags_pulse_port_set_samplerate ags_pulse_port_set_pcm_channels ags_pulse_port_set_buffer_size ags_pulse_port_set_format ags_pulse_port_set_cache_buffer_size ags_pulse_port_get_latency ags_pulse_port_new AGS_IS_PULSE_PORT AGS_PULSE_PORT AGS_PULSE_PORT_CLASS AGS_PULSE_PORT_GET_CLASS AGS_TYPE_PULSE_PORT AgsPulsePort AgsPulsePortClass ags_pulse_port_get_type
ags_pulse_server AgsPulseServer AGS_PULSE_SERVER_GET_OBJ_MUTEX AgsPulseServerFlags ags_pulse_server_test_flags ags_pulse_server_set_flags ags_pulse_server_unset_flags ags_pulse_server_find_url ags_pulse_server_find_client ags_pulse_server_find_port ags_pulse_server_add_client ags_pulse_server_remove_client ags_pulse_server_connect_client ags_pulse_server_disconnect_client ags_pulse_server_start_poll ags_pulse_server_new AGS_IS_PULSE_SERVER AGS_PULSE_SERVER AGS_PULSE_SERVER_CLASS AGS_PULSE_SERVER_GET_CLASS AGS_TYPE_PULSE_SERVER AgsPulseServer AgsPulseServerClass ags_pulse_server_get_type
ags_recall AgsRecall AGS_RECALL_HANDLER AGS_RECALL_GET_OBJ_MUTEX AGS_RECALL_DEFAULT_VERSION AGS_RECALL_DEFAULT_BUILD_ID AgsRecallFlags AgsRecallNotifyDependencyMode AgsRecallHandler ags_recall_global_get_children_lock_free ags_recall_global_get_omit_event ags_recall_global_get_performance_mode ags_recall_global_get_rt_safe ags_recall_test_flags ags_recall_set_flags ags_recall_unset_flags ags_recall_test_ability_flags ags_recall_set_ability_flags ags_recall_unset_ability_flags ags_recall_check_ability_flags ags_recall_match_ability_flags_to_scope ags_recall_test_behaviour_flags ags_recall_set_behaviour_flags ags_recall_unset_behaviour_flags ags_recall_check_behaviour_flags ags_recall_set_sound_scope ags_recall_get_sound_scope ags_recall_check_sound_scope ags_recall_test_staging_flags ags_recall_set_staging_flags ags_recall_unset_staging_flags ags_recall_check_staging_flags ags_recall_test_state_flags ags_recall_set_state_flags ags_recall_unset_state_flags ags_recall_check_state_flags ags_recall_set_recall_id ags_recall_add_recall_dependency ags_recall_remove_recall_dependency ags_recall_add_child ags_recall_remove_child ags_recall_handler_free ags_recall_handler_alloc ags_recall_add_recall_handler ags_recall_remove_recall_handler ags_recall_set_output_soundcard ags_recall_set_input_soundcard ags_recall_set_samplerate ags_recall_set_buffer_size ags_recall_set_format ags_recall_resolve_dependency ags_recall_check_rt_data ags_recall_run_init_pre ags_recall_run_init_inter ags_recall_run_init_post ags_recall_feed_input_queue ags_recall_automate ags_recall_run_pre ags_recall_run_inter ags_recall_run_post ags_recall_do_feedback ags_recall_feed_output_queue ags_recall_stop_persistent ags_recall_cancel ags_recall_done ags_recall_duplicate ags_recall_notify_dependency ags_recall_child_added ags_recall_is_done ags_recall_get_by_effect ags_recall_find_recall_id_with_effect ags_recall_find_type ags_recall_find_template ags_recall_template_find_type ags_recall_template_find_all_type ags_recall_find_type_with_recycling_context ags_recall_find_recycling_context ags_recall_find_provider ags_recall_template_find_provider ags_recall_find_provider_with_recycling_context ags_recall_lock_port ags_recall_unlock_port ags_recall_new AGS_IS_RECALL AGS_RECALL AGS_RECALL_CLASS AGS_RECALL_GET_CLASS AGS_TYPE_RECALL AgsRecall AgsRecallClass ags_recall_get_type
ags_recall_audio AgsRecallAudio ags_recall_audio_new AGS_IS_RECALL_AUDIO AGS_RECALL_AUDIO AGS_RECALL_AUDIO_CLASS AGS_RECALL_AUDIO_GET_CLASS AGS_TYPE_RECALL_AUDIO AgsRecallAudio AgsRecallAudioClass ags_recall_audio_get_type
ags_recall_audio_run AgsRecallAudioRun ags_recall_audio_run_new AGS_IS_RECALL_AUDIO_RUN AGS_RECALL_AUDIO_RUN AGS_RECALL_AUDIO_RUN_CLASS AGS_RECALL_AUDIO_RUN_GET_CLASS AGS_TYPE_RECALL_AUDIO_RUN AgsRecallAudioRun AgsRecallAudioRunClass ags_recall_audio_run_get_type
ags_recall_audio_signal AgsRecallAudioSignal ags_recall_audio_signal_new AGS_IS_RECALL_AUDIO_SIGNAL AGS_RECALL_AUDIO_SIGNAL AGS_RECALL_AUDIO_SIGNAL_CLASS AGS_RECALL_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_RECALL_AUDIO_SIGNAL AgsRecallAudioSignal AgsRecallAudioSignalClass ags_recall_audio_signal_get_type
ags_recall_channel AgsRecallChannel ags_recall_channel_find_channel ags_recall_channel_new AGS_IS_RECALL_CHANNEL AGS_RECALL_CHANNEL AGS_RECALL_CHANNEL_CLASS AGS_RECALL_CHANNEL_GET_CLASS AGS_TYPE_RECALL_CHANNEL AgsRecallChannel AgsRecallChannelClass ags_recall_channel_get_type
ags_recall_channel_run AgsRecallChannelRun ags_recall_channel_run_new AGS_IS_RECALL_CHANNEL_RUN AGS_RECALL_CHANNEL_RUN AGS_RECALL_CHANNEL_RUN_CLASS AGS_RECALL_CHANNEL_RUN_GET_CLASS AGS_TYPE_RECALL_CHANNEL_RUN AgsRecallChannelRun AgsRecallChannelRunClass ags_recall_channel_run_get_type
ags_recall_container AgsRecallContainer AGS_RECALL_CONTAINER_GET_OBJ_MUTEX AgsRecallContainerFlags AgsRecallContainerFindFlags ags_recall_container_test_flags ags_recall_container_set_flags ags_recall_container_unset_flags ags_recall_container_add ags_recall_container_remove ags_recall_container_get_recall_audio ags_recall_container_get_recall_audio_run ags_recall_container_get_recall_channel ags_recall_container_get_recall_channel_run ags_recall_container_find ags_recall_container_new AGS_IS_RECALL_CONTAINER AGS_RECALL_CONTAINER AGS_RECALL_CONTAINER_CLASS AGS_RECALL_CONTAINER_GET_CLASS AGS_TYPE_RECALL_CONTAINER AgsRecallContainer AgsRecallContainerClass ags_recall_container_get_type
ags_recall_dependency AgsRecallDependency AGS_RECALL_DEPENDENCY_GET_OBJ_MUTEX ags_recall_dependency_find_dependency ags_recall_dependency_find_dependency_by_provider ags_recall_dependency_resolve ags_recall_dependency_new AGS_IS_RECALL_DEPENDENCY AGS_RECALL_DEPENDENCY AGS_RECALL_DEPENDENCY_CLASS AGS_RECALL_DEPENDENCY_GET_CLASS AGS_TYPE_RECALL_DEPENDENCY AgsRecallDependency AgsRecallDependencyClass ags_recall_dependency_get_type
ags_recall_dssi AgsRecallDssi ags_recall_dssi_load ags_recall_dssi_load_ports ags_recall_dssi_load_conversion ags_recall_dssi_find ags_recall_dssi_new AGS_IS_RECALL_DSSI AGS_RECALL_DSSI AGS_RECALL_DSSI_CLASS AGS_RECALL_DSSI_GET_CLASS AGS_TYPE_RECALL_DSSI AgsRecallDssi AgsRecallDssiClass ags_recall_dssi_get_type
ags_recall_dssi_run AgsRecallDssiRun ags_recall_dssi_run_new AGS_IS_RECALL_DSSI_RUN AGS_RECALL_DSSI_RUN AGS_RECALL_DSSI_RUN_CLASS AGS_RECALL_DSSI_RUN_GET_CLASS AGS_TYPE_RECALL_DSSI_RUN AgsRecallDssiRun AgsRecallDssiRunClass ags_recall_dssi_run_get_type
ags_recall_factory AgsRecallFactory AgsRecallFactoryCreateFlags ags_recall_factory_create ags_recall_factory_new AGS_IS_RECALL_FACTORY AGS_RECALL_FACTORY AGS_RECALL_FACTORY_CLASS AGS_RECALL_FACTORY_GET_CLASS AGS_TYPE_RECALL_FACTORY AgsRecallFactory AgsRecallFactoryClass ags_recall_factory_get_type
ags_recall_id AgsRecallID AGS_RECALL_ID_GET_OBJ_MUTEX ags_recall_id_set_sound_scope ags_recall_id_check_sound_scope ags_recall_id_test_staging_flags ags_recall_id_set_staging_flags ags_recall_id_unset_staging_flags ags_recall_id_check_staging_flags ags_recall_id_test_state_flags ags_recall_id_set_state_flags ags_recall_id_unset_state_flags ags_recall_id_check_state_flags ags_recall_id_find_recycling_context ags_recall_id_find_parent_recycling_context ags_recall_id_new AGS_IS_RECALL_ID AGS_RECALL_ID AGS_RECALL_ID_CLASS AGS_RECALL_ID_GET_CLASS AGS_TYPE_RECALL_ID AgsRecallID AgsRecallIDClass ags_recall_id_get_type
ags_recall_ladspa AgsRecallLadspa ags_recall_ladspa_load ags_recall_ladspa_load_ports ags_recall_ladspa_load_conversion ags_recall_ladspa_find ags_recall_ladspa_new AGS_IS_RECALL_LADSPA AGS_RECALL_LADSPA AGS_RECALL_LADSPA_CLASS AGS_RECALL_LADSPA_GET_CLASS AGS_TYPE_RECALL_LADSPA AgsRecallLadspa AgsRecallLadspaClass ags_recall_ladspa_get_type
ags_recall_ladspa_run AgsRecallLadspaRun ags_recall_ladspa_run_new AGS_IS_RECALL_LADSPA_RUN AGS_RECALL_LADSPA_RUN AGS_RECALL_LADSPA_RUN_CLASS AGS_RECALL_LADSPA_RUN_GET_CLASS AGS_TYPE_RECALL_LADSPA_RUN AgsRecallLadspaRun AgsRecallLadspaRunClass ags_recall_ladspa_run_get_type
ags_recall_lv2 AgsRecallLv2 AgsRecallLv2FLags ags_recall_lv2_test_flags ags_recall_lv2_set_flags ags_recall_lv2_unset_flags ags_recall_lv2_load ags_recall_lv2_load_ports ags_recall_lv2_load_conversion ags_recall_lv2_find ags_recall_lv2_new AGS_IS_RECALL_LV2 AGS_RECALL_LV2 AGS_RECALL_LV2_CLASS AGS_RECALL_LV2_GET_CLASS AGS_TYPE_RECALL_LV2 AgsRecallLv2 AgsRecallLv2Class ags_recall_lv2_get_type
ags_recall_lv2_run AgsRecallLv2Run AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT ags_recall_lv2_run_new AGS_IS_RECALL_LV2_RUN AGS_RECALL_LV2_RUN AGS_RECALL_LV2_RUN_CLASS AGS_RECALL_LV2_RUN_GET_CLASS AGS_TYPE_RECALL_LV2_RUN AgsRecallLv2Run AgsRecallLv2RunClass ags_recall_lv2_run_get_type
ags_recall_recycling AgsRecallRecycling AgsRecallRecyclingFlags ags_recall_recycling_new AGS_IS_RECALL_RECYCLING AGS_RECALL_RECYCLING AGS_RECALL_RECYCLING_CLASS AGS_RECALL_RECYCLING_GET_CLASS AGS_TYPE_RECALL_RECYCLING AgsRecallRecycling AgsRecallRecyclingClass ags_recall_recycling_get_type
ags_record_midi_audio AgsRecordMidiAudio ags_record_midi_audio_new AGS_IS_RECORD_MIDI_AUDIO AGS_RECORD_MIDI_AUDIO AGS_RECORD_MIDI_AUDIO_CLASS AGS_RECORD_MIDI_AUDIO_GET_CLASS AGS_TYPE_RECORD_MIDI_AUDIO AgsRecordMidiAudio AgsRecordMidiAudioClass ags_record_midi_audio_get_type
ags_record_midi_audio_run AgsRecordMidiAudioRun ags_record_midi_audio_run_new AGS_IS_RECORD_MIDI_AUDIO_RUN AGS_RECORD_MIDI_AUDIO_RUN AGS_RECORD_MIDI_AUDIO_RUN_CLASS AGS_RECORD_MIDI_AUDIO_RUN_GET_CLASS AGS_TYPE_RECORD_MIDI_AUDIO_RUN AgsRecordMidiAudioRun AgsRecordMidiAudioRunClass ags_record_midi_audio_run_get_type
ags_recycling AgsRecycling AGS_RECYCLING_GET_OBJ_MUTEX AgsRecyclingFlags ags_recycling_test_flags ags_recycling_set_flags ags_recycling_unset_flags ags_recycling_next ags_recycling_prev ags_recycling_set_output_soundcard ags_recycling_set_input_soundcard ags_recycling_set_samplerate ags_recycling_set_buffer_size ags_recycling_set_format ags_recycling_add_audio_signal ags_recycling_remove_audio_signal ags_recycling_data_request ags_recycling_position ags_recycling_find_next_channel ags_recycling_is_active ags_recycling_create_audio_signal_with_defaults ags_recycling_create_audio_signal_with_frame_count ags_recycling_new AGS_IS_RECYCLING AGS_RECYCLING AGS_RECYCLING_CLASS AGS_RECYCLING_GET_CLASS AGS_TYPE_RECYCLING AgsRecycling AgsRecyclingClass ags_recycling_get_type
ags_recycling_context AgsRecyclingContext AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX AgsRecyclingContextFlags ags_recycling_context_find_scope ags_recycling_context_replace ags_recycling_context_add ags_recycling_context_remove ags_recycling_context_insert ags_recycling_context_get_toplevel ags_recycling_context_find ags_recycling_context_find_child ags_recycling_context_find_parent ags_recycling_context_add_child ags_recycling_context_remove_child ags_recycling_context_get_child_recall_id ags_recycling_context_reset_recycling ags_recycling_context_new AGS_IS_RECYCLING_CONTEXT AGS_RECYCLING_CONTEXT AGS_RECYCLING_CONTEXT_CLASS AGS_RECYCLING_CONTEXT_GET_CLASS AGS_TYPE_RECYCLING_CONTEXT AgsRecyclingContext AgsRecyclingContextClass ags_recycling_context_get_type
ags_remove_audio AgsRemoveAudio ags_remove_audio_new AGS_IS_REMOVE_AUDIO AGS_REMOVE_AUDIO AGS_REMOVE_AUDIO_CLASS AGS_REMOVE_AUDIO_GET_CLASS AGS_TYPE_REMOVE_AUDIO AgsRemoveAudio AgsRemoveAudioClass ags_remove_audio_get_type
ags_remove_audio_signal AgsRemoveAudioSignal ags_remove_audio_signal_new AGS_IS_REMOVE_AUDIO_SIGNAL AGS_REMOVE_AUDIO_SIGNAL AGS_REMOVE_AUDIO_SIGNAL_CLASS AGS_REMOVE_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_REMOVE_AUDIO_SIGNAL AgsRemoveAudioSignal AgsRemoveAudioSignalClass ags_remove_audio_signal_get_type
ags_remove_note AgsRemoveNote ags_remove_note_new AGS_IS_REMOVE_NOTE AGS_REMOVE_NOTE AGS_REMOVE_NOTE_CLASS AGS_REMOVE_NOTE_GET_CLASS AGS_TYPE_REMOVE_NOTE AgsRemoveNote AgsRemoveNoteClass ags_remove_note_get_type
ags_remove_soundcard AgsRemoveSoundcard ags_remove_soundcard_new AGS_IS_REMOVE_SOUNDCARD AGS_REMOVE_SOUNDCARD AGS_REMOVE_SOUNDCARD_CLASS AGS_REMOVE_SOUNDCARD_GET_CLASS AGS_TYPE_REMOVE_SOUNDCARD AgsRemoveSoundcard AgsRemoveSoundcardClass ags_remove_soundcard_get_type
ags_reset_amplitude AgsResetAmplitude ags_reset_amplitude_add ags_reset_amplitude_remove ags_reset_amplitude_get_instance ags_reset_amplitude_new AGS_IS_RESET_AMPLITUDE AGS_RESET_AMPLITUDE AGS_RESET_AMPLITUDE_CLASS AGS_RESET_AMPLITUDE_GET_CLASS AGS_TYPE_RESET_AMPLITUDE AgsResetAmplitude AgsResetAmplitudeClass ags_reset_amplitude_get_type
ags_reset_note AgsResetNote ags_reset_note_add ags_reset_note_remove ags_reset_note_get_instance ags_reset_note_new AGS_IS_RESET_NOTE AGS_RESET_NOTE AGS_RESET_NOTE_CLASS AGS_RESET_NOTE_GET_CLASS AGS_TYPE_RESET_NOTE AgsResetNote AgsResetNoteClass ags_reset_note_get_type
ags_reset_peak AgsResetPeak ags_reset_peak_add ags_reset_peak_remove ags_reset_peak_get_instance ags_reset_peak_new AGS_IS_RESET_PEAK AGS_RESET_PEAK AGS_RESET_PEAK_CLASS AGS_RESET_PEAK_GET_CLASS AGS_TYPE_RESET_PEAK AgsResetPeak AgsResetPeakClass ags_reset_peak_get_type
ags_resize_audio AgsResizeAudio ags_resize_audio_new AGS_IS_RESIZE_AUDIO AGS_RESIZE_AUDIO AGS_RESIZE_AUDIO_CLASS AGS_RESIZE_AUDIO_GET_CLASS AGS_TYPE_RESIZE_AUDIO AgsResizeAudio AgsResizeAudioClass ags_resize_audio_get_type
ags_route_dssi_audio AgsRouteDssiAudio ags_route_dssi_audio_new AGS_IS_ROUTE_DSSI_AUDIO AGS_ROUTE_DSSI_AUDIO AGS_ROUTE_DSSI_AUDIO_CLASS AGS_ROUTE_DSSI_AUDIO_GET_CLASS AGS_TYPE_ROUTE_DSSI_AUDIO AgsRouteDssiAudio AgsRouteDssiAudioClass ags_route_dssi_audio_get_type
ags_route_dssi_audio_run AgsRouteDssiAudioRun ags_route_dssi_audio_run_new AGS_IS_ROUTE_DSSI_AUDIO_RUN AGS_ROUTE_DSSI_AUDIO_RUN AGS_ROUTE_DSSI_AUDIO_RUN_CLASS AGS_ROUTE_DSSI_AUDIO_RUN_GET_CLASS AGS_TYPE_ROUTE_DSSI_AUDIO_RUN AgsRouteDssiAudioRun AgsRouteDssiAudioRunClass ags_route_dssi_audio_run_get_type
ags_route_lv2_audio AgsRouteLv2Audio ags_route_lv2_audio_new AGS_IS_ROUTE_LV2_AUDIO AGS_ROUTE_LV2_AUDIO AGS_ROUTE_LV2_AUDIO_CLASS AGS_ROUTE_LV2_AUDIO_GET_CLASS AGS_TYPE_ROUTE_LV2_AUDIO AgsRouteLv2Audio AgsRouteLv2AudioClass ags_route_lv2_audio_get_type
ags_route_lv2_audio_run AgsRouteLv2AudioRun ags_route_lv2_audio_run_new AGS_IS_ROUTE_LV2_AUDIO_RUN AGS_ROUTE_LV2_AUDIO_RUN AGS_ROUTE_LV2_AUDIO_RUN_CLASS AGS_ROUTE_LV2_AUDIO_RUN_GET_CLASS AGS_TYPE_ROUTE_LV2_AUDIO_RUN AgsRouteLv2AudioRun AgsRouteLv2AudioRunClass ags_route_lv2_audio_run_get_type
ags_rt_stream_audio_signal AgsRtStreamAudioSignal ags_rt_stream_audio_signal_new AGS_IS_RT_STREAM_AUDIO_SIGNAL AGS_RT_STREAM_AUDIO_SIGNAL AGS_RT_STREAM_AUDIO_SIGNAL_CLASS AGS_RT_STREAM_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_RT_STREAM_AUDIO_SIGNAL AgsRtStreamAudioSignal AgsRtStreamAudioSignalClass ags_rt_stream_audio_signal_get_type
ags_rt_stream_channel AgsRtStreamChannel ags_rt_stream_channel_new AGS_IS_RT_STREAM_CHANNEL AGS_RT_STREAM_CHANNEL AGS_RT_STREAM_CHANNEL_CLASS AGS_RT_STREAM_CHANNEL_GET_CLASS AGS_TYPE_RT_STREAM_CHANNEL AgsRtStreamChannel AgsRtStreamChannelClass ags_rt_stream_channel_get_type
ags_rt_stream_channel_run AgsRtStreamChannelRun ags_rt_stream_channel_run_new AGS_IS_RT_STREAM_CHANNEL_RUN AGS_RT_STREAM_CHANNEL_RUN AGS_RT_STREAM_CHANNEL_RUN_CLASS AGS_RT_STREAM_CHANNEL_RUN_GET_CLASS AGS_TYPE_RT_STREAM_CHANNEL_RUN AgsRtStreamChannelRun AgsRtStreamChannelRunClass ags_rt_stream_channel_run_get_type
ags_rt_stream_recycling AgsRtStreamRecycling ags_rt_stream_recycling_new AGS_IS_RT_STREAM_RECYCLING AGS_RT_STREAM_RECYCLING AGS_RT_STREAM_RECYCLING_CLASS AGS_RT_STREAM_RECYCLING_GET_CLASS AGS_TYPE_RT_STREAM_RECYCLING AgsRtStreamRecycling AgsRtStreamRecyclingClass ags_rt_stream_recycling_get_type
ags_seek_soundcard AgsSeekSoundcard ags_seek_soundcard_new AGS_IS_SEEK_SOUNDCARD AGS_SEEK_SOUNDCARD AGS_SEEK_SOUNDCARD_CLASS AGS_SEEK_SOUNDCARD_GET_CLASS AGS_TYPE_SEEK_SOUNDCARD AgsSeekSoundcard AgsSeekSoundcardClass ags_seek_soundcard_get_type
ags_sequencer_thread AgsSequencerThread AGS_SEQUENCER_THREAD_DEFAULT_JIFFIE ags_sequencer_thread_interval_timeout ags_sequencer_thread_find_sequencer ags_sequencer_thread_new AGS_IS_SEQUENCER_THREAD AGS_SEQUENCER_THREAD AGS_SEQUENCER_THREAD_CLASS AGS_SEQUENCER_THREAD_GET_CLASS AGS_TYPE_SEQUENCER_THREAD AgsSequencerThread AgsSequencerThreadClass ags_sequencer_thread_get_type
ags_sequencer_util ags_sequencer_util_get_obj_mutex
ags_set_audio_channels AgsSetAudioChannels ags_set_audio_channels_new AGS_IS_SET_AUDIO_CHANNELS AGS_SET_AUDIO_CHANNELS AGS_SET_AUDIO_CHANNELS_CLASS AGS_SET_AUDIO_CHANNELS_GET_CLASS AGS_TYPE_SET_AUDIO_CHANNELS AgsSetAudioChannels AgsSetAudioChannelsClass ags_set_audio_channels_get_type
ags_set_buffer_size AgsSetBufferSize ags_set_buffer_size_new AGS_IS_SET_BUFFER_SIZE AGS_SET_BUFFER_SIZE AGS_SET_BUFFER_SIZE_CLASS AGS_SET_BUFFER_SIZE_GET_CLASS AGS_TYPE_SET_BUFFER_SIZE AgsSetBufferSize AgsSetBufferSizeClass ags_set_buffer_size_get_type
ags_set_device AgsSetDevice ags_set_device_new AGS_IS_SET_DEVICE AGS_SET_DEVICE AGS_SET_DEVICE_CLASS AGS_SET_DEVICE_GET_CLASS AGS_TYPE_SET_DEVICE AgsSetDevice AgsSetDeviceClass ags_set_device_get_type
ags_set_format AgsSetFormat ags_set_format_new AGS_IS_SET_FORMAT AGS_SET_FORMAT AGS_SET_FORMAT_CLASS AGS_SET_FORMAT_GET_CLASS AGS_TYPE_SET_FORMAT AgsSetFormat AgsSetFormatClass ags_set_format_get_type
ags_set_muted AgsSetMuted ags_set_muted_new AGS_IS_SET_MUTED AGS_SET_MUTED AGS_SET_MUTED_CLASS AGS_SET_MUTED_GET_CLASS AGS_TYPE_SET_MUTED AgsSetMuted AgsSetMutedClass ags_set_muted_get_type
ags_set_samplerate AgsSetSamplerate ags_set_samplerate_new AGS_IS_SET_SAMPLERATE AGS_SET_SAMPLERATE AGS_SET_SAMPLERATE_CLASS AGS_SET_SAMPLERATE_GET_CLASS AGS_TYPE_SET_SAMPLERATE AgsSetSamplerate AgsSetSamplerateClass ags_set_samplerate_get_type
ags_sf2_loader AgsSF2Loader AGS_SF2_LOADER_GET_OBJ_MUTEX AgsSF2LoaderFlags ags_sf2_loader_test_flags ags_sf2_loader_set_flags ags_sf2_loader_unset_flags ags_sf2_loader_start ags_sf2_loader_new AGS_IS_SF2_LOADER AGS_SF2_LOADER AGS_SF2_LOADER_CLASS AGS_SF2_LOADER_GET_CLASS AGS_TYPE_SF2_LOADER AgsSF2Loader AgsSF2LoaderClass ags_sf2_loader_get_type
ags_sfz_file AgsSFZFile AGS_SFZ_FILE_GET_OBJ_MUTEX AGS_SFZ_FILE_DEFAULT_CHANNELS AGS_SFZ_FILE_LOOP_MAX AGS_SFZ_FILE_READ AGS_SFZ_FILE_WRITE AgsSFZFileFlags AgsSFZLevel ags_sfz_file_test_flags ags_sfz_file_set_flags ags_sfz_file_unset_flags ags_sfz_file_select_sample ags_sfz_file_get_range ags_sfz_file_check_suffix ags_sfz_file_parse ags_sfz_file_new AGS_IS_SFZ_FILE AGS_SFZ_FILE AGS_SFZ_FILE_CLASS AGS_SFZ_FILE_GET_CLASS AGS_TYPE_SFZ_FILE AgsSFZFile AgsSFZFileClass ags_sfz_file_get_type
ags_sfz_group AgsSFZGroup AGS_SFZ_GROUP_GET_OBJ_MUTEX AgsSFZGroupFlags ags_sfz_group_test_flags ags_sfz_group_set_flags ags_sfz_group_unset_flags ags_sfz_group_insert_control ags_sfz_group_lookup_control ags_sfz_group_new AGS_IS_SFZ_GROUP AGS_SFZ_GROUP AGS_SFZ_GROUP_CLASS AGS_SFZ_GROUP_GET_CLASS AGS_TYPE_SFZ_GROUP AgsSFZGroup AgsSFZGroupClass ags_sfz_group_get_type
ags_sfz_loader AgsSFZLoader AGS_SFZ_LOADER_GET_OBJ_MUTEX AgsSFZLoaderFlags ags_sfz_loader_test_flags ags_sfz_loader_set_flags ags_sfz_loader_unset_flags ags_sfz_loader_start ags_sfz_loader_new AGS_IS_SFZ_LOADER AGS_SFZ_LOADER AGS_SFZ_LOADER_CLASS AGS_SFZ_LOADER_GET_CLASS AGS_TYPE_SFZ_LOADER AgsSFZLoader AgsSFZLoaderClass ags_sfz_loader_get_type
ags_sfz_region AgsSFZRegion AGS_SFZ_REGION_GET_OBJ_MUTEX AgsSFZRegionFlags ags_sfz_region_test_flags ags_sfz_region_set_flags ags_sfz_region_unset_flags ags_sfz_region_insert_control ags_sfz_region_lookup_control ags_sfz_region_new AGS_IS_SFZ_REGION AGS_SFZ_REGION AGS_SFZ_REGION_CLASS AGS_SFZ_REGION_GET_CLASS AGS_TYPE_SFZ_REGION AgsSFZRegion AgsSFZRegionClass ags_sfz_region_get_type
ags_sfz_sample AgsSFZSample AGS_SFZ_SAMPLE_GET_OBJ_MUTEX AgsSFZSampleFlags ags_sfz_sample_test_flags ags_sfz_sample_set_flags ags_sfz_sample_unset_flags ags_sfz_sample_new AGS_IS_SFZ_SAMPLE AGS_SFZ_SAMPLE AGS_SFZ_SAMPLE_CLASS AGS_SFZ_SAMPLE_GET_CLASS AGS_TYPE_SFZ_SAMPLE AgsSFZSample AgsSFZSampleClass ags_sfz_sample_get_type
ags_sndfile AgsSndfile AGS_SNDFILE_GET_OBJ_MUTEX AgsSndfileFlags ags_sndfile_test_flags ags_sndfile_set_flags ags_sndfile_unset_flags ags_sndfile_new AGS_IS_SNDFILE AGS_SNDFILE AGS_SNDFILE_CLASS AGS_SNDFILE_GET_CLASS AGS_TYPE_SNDFILE AgsSndfile AgsSndfileClass ags_sndfile_get_type
ags_sound_container AgsSoundContainer ags_sound_container_open ags_sound_container_get_level_count ags_sound_container_get_nesting_level ags_sound_container_get_level_id ags_sound_container_get_level_index ags_sound_container_get_sublevel_name ags_sound_container_level_up ags_sound_container_select_level_by_id ags_sound_container_select_level_by_index ags_sound_container_get_resource_all ags_sound_container_get_resource_by_name ags_sound_container_get_resource_by_index ags_sound_container_get_resource_current ags_sound_container_close AGS_IS_SOUND_CONTAINER AGS_IS_SOUND_CONTAINER_INTERFACE AGS_SOUND_CONTAINER AGS_SOUND_CONTAINER_GET_INTERFACE AGS_SOUND_CONTAINER_INTERFACE AGS_TYPE_SOUND_CONTAINER AgsSoundContainer AgsSoundContainerInterface ags_sound_container_get_type
ags_sound_enums AgsSoundAbilityFlags AgsSoundBehaviourFlags AgsSoundScope AgsSoundStagingFlags AgsSoundStateFlags
ags_sound_provider AgsSoundProvider ags_sound_provider_set_default_soundcard ags_sound_provider_get_default_soundcard ags_sound_provider_set_default_soundcard_thread ags_sound_provider_get_default_soundcard_thread ags_sound_provider_set_soundcard ags_sound_provider_get_soundcard ags_sound_provider_set_sequencer ags_sound_provider_get_sequencer ags_sound_provider_set_audio ags_sound_provider_get_audio ags_sound_provider_set_sound_server ags_sound_provider_get_sound_server ags_sound_provider_set_osc_server ags_sound_provider_get_osc_server AGS_IS_SOUND_PROVIDER AGS_IS_SOUND_PROVIDER_INTERFACE AGS_SOUND_PROVIDER AGS_SOUND_PROVIDER_GET_INTERFACE AGS_SOUND_PROVIDER_INTERFACE AGS_TYPE_SOUND_PROVIDER AgsSoundProvider AgsSoundProviderInterface ags_sound_provider_get_type
ags_sound_resource AgsSoundResource ags_sound_resource_open ags_sound_resource_rw_open ags_sound_resource_load ags_sound_resource_info ags_sound_resource_set_presets ags_sound_resource_get_presets ags_sound_resource_read ags_sound_resource_write ags_sound_resource_flush ags_sound_resource_seek ags_sound_resource_read_audio_signal ags_sound_resource_read_wave ags_sound_resource_close AGS_IS_SOUND_RESOURCE AGS_IS_SOUND_RESOURCE_INTERFACE AGS_SOUND_RESOURCE AGS_SOUND_RESOURCE_GET_INTERFACE AGS_SOUND_RESOURCE_INTERFACE AGS_TYPE_SOUND_RESOURCE AgsSoundResource AgsSoundResourceInterface ags_sound_resource_get_type
ags_soundcard_thread AgsSoundcardThread AGS_SOUNDCARD_THREAD_DEFAULT_JIFFIE ags_soundcard_thread_find_soundcard ags_soundcard_thread_new AGS_IS_SOUNDCARD_THREAD AGS_SOUNDCARD_THREAD AGS_SOUNDCARD_THREAD_CLASS AGS_SOUNDCARD_THREAD_GET_CLASS AGS_TYPE_SOUNDCARD_THREAD AgsSoundcardThread AgsSoundcardThreadClass ags_soundcard_thread_get_type
ags_soundcard_util ags_soundcard_util_get_obj_mutex
ags_start_audio AgsStartAudio ags_start_audio_new AGS_IS_START_AUDIO AGS_START_AUDIO AGS_START_AUDIO_CLASS AGS_START_AUDIO_GET_CLASS AGS_TYPE_START_AUDIO AgsStartAudio AgsStartAudioClass ags_start_audio_get_type
ags_start_channel AgsStartChannel ags_start_channel_new AGS_IS_START_CHANNEL AGS_START_CHANNEL AGS_START_CHANNEL_CLASS AGS_START_CHANNEL_GET_CLASS AGS_TYPE_START_CHANNEL AgsStartChannel AgsStartChannelClass ags_start_channel_get_type
ags_start_sequencer AgsStartSequencer ags_start_sequencer_new AGS_IS_START_SEQUENCER AGS_START_SEQUENCER AGS_START_SEQUENCER_CLASS AGS_START_SEQUENCER_GET_CLASS AGS_TYPE_START_SEQUENCER AgsStartSequencer AgsStartSequencerClass ags_start_sequencer_get_type
ags_start_soundcard AgsStartSoundcard ags_start_soundcard_new AGS_IS_START_SOUNDCARD AGS_START_SOUNDCARD AGS_START_SOUNDCARD_CLASS AGS_START_SOUNDCARD_GET_CLASS AGS_TYPE_START_SOUNDCARD AgsStartSoundcard AgsStartSoundcardClass ags_start_soundcard_get_type
ags_stop_sequencer AgsStopSequencer ags_stop_sequencer_new AGS_IS_STOP_SEQUENCER AGS_STOP_SEQUENCER AGS_STOP_SEQUENCER_CLASS AGS_STOP_SEQUENCER_GET_CLASS AGS_TYPE_STOP_SEQUENCER AgsStopSequencer AgsStopSequencerClass ags_stop_sequencer_get_type
ags_stop_soundcard AgsStopSoundcard ags_stop_soundcard_new AGS_IS_STOP_SOUNDCARD AGS_STOP_SOUNDCARD AGS_STOP_SOUNDCARD_CLASS AGS_STOP_SOUNDCARD_GET_CLASS AGS_TYPE_STOP_SOUNDCARD AgsStopSoundcard AgsStopSoundcardClass ags_stop_soundcard_get_type
ags_stream_audio_signal AgsStreamAudioSignal ags_stream_audio_signal_new AGS_IS_STREAM_AUDIO_SIGNAL AGS_STREAM_AUDIO_SIGNAL AGS_STREAM_AUDIO_SIGNAL_CLASS AGS_STREAM_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_STREAM_AUDIO_SIGNAL AgsStreamAudioSignal AgsStreamAudioSignalClass ags_stream_audio_signal_get_type
ags_stream_channel AgsStreamChannel ags_stream_channel_new AGS_IS_STREAM_CHANNEL AGS_STREAM_CHANNEL AGS_STREAM_CHANNEL_CLASS AGS_STREAM_CHANNEL_GET_CLASS AGS_TYPE_STREAM_CHANNEL AgsStreamChannel AgsStreamChannelClass ags_stream_channel_get_type
ags_stream_channel_run AgsStreamChannelRun ags_stream_channel_run_new AGS_IS_STREAM_CHANNEL_RUN AGS_STREAM_CHANNEL_RUN AGS_STREAM_CHANNEL_RUN_CLASS AGS_STREAM_CHANNEL_RUN_GET_CLASS AGS_TYPE_STREAM_CHANNEL_RUN AgsStreamChannelRun AgsStreamChannelRunClass ags_stream_channel_run_get_type
ags_stream_recycling AgsStreamRecycling ags_stream_recycling_new AGS_IS_STREAM_RECYCLING AGS_STREAM_RECYCLING AGS_STREAM_RECYCLING_CLASS AGS_STREAM_RECYCLING_GET_CLASS AGS_TYPE_STREAM_RECYCLING AgsStreamRecycling AgsStreamRecyclingClass ags_stream_recycling_get_type
ags_switch_buffer_flag AgsSwitchBufferFlag ags_switch_buffer_flag_new AGS_IS_SWITCH_BUFFER_FLAG AGS_SWITCH_BUFFER_FLAG AGS_SWITCH_BUFFER_FLAG_CLASS AGS_SWITCH_BUFFER_FLAG_GET_CLASS AGS_TYPE_SWITCH_BUFFER_FLAG AgsSwitchBufferFlag AgsSwitchBufferFlagClass ags_switch_buffer_flag_get_type
ags_synth_enums AgsSynthOscillatorMode
ags_synth_generator AgsSynthGenerator AGS_SYNTH_GENERATOR_GET_OBJ_MUTEX AGS_SYNTH_GENERATOR_DEFAULT_SAMPLERATE AGS_SYNTH_GENERATOR_DEFAULT_BUFFER_SIZE AGS_SYNTH_GENERATOR_DEFAULT_FORMAT AGS_SYNTH_GENERATOR_DEFAULT_OSCILLATOR AGS_SYNTH_GENERATOR_DEFAULT_FREQUENCY AGS_SYNTH_GENERATOR_DEFAULT_PHASE AGS_SYNTH_GENERATOR_DEFAULT_VOLUME AGS_SYNTH_GENERATOR_DEFAULT_LFO_DEPTH AGS_SYNTH_GENERATOR_DEFAULT_TUNING AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_FREQUENCY AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_DEPTH AGS_SYNTH_GENERATOR_DEFAULT_FM_TUNING AgsSynthGeneratorOscillator ags_synth_generator_set_samplerate ags_synth_generator_set_buffer_size ags_synth_generator_set_format ags_synth_generator_compute ags_synth_generator_new AGS_IS_SYNTH_GENERATOR AGS_SYNTH_GENERATOR AGS_SYNTH_GENERATOR_CLASS AGS_SYNTH_GENERATOR_GET_CLASS AGS_TYPE_SYNTH_GENERATOR AgsSynthGenerator AgsSynthGeneratorClass ags_synth_generator_get_type
ags_synth_util ags_synth_util_get_xcross_count_s8 ags_synth_util_get_xcross_count_s16 ags_synth_util_get_xcross_count_s24 ags_synth_util_get_xcross_count_s32 ags_synth_util_get_xcross_count_s64 ags_synth_util_get_xcross_count_float ags_synth_util_get_xcross_count_double ags_synth_util_get_xcross_count_complex ags_synth_util_get_xcross_count ags_synth_util_sin_s8 ags_synth_util_sin_s16 ags_synth_util_sin_s24 ags_synth_util_sin_s32 ags_synth_util_sin_s64 ags_synth_util_sin_float ags_synth_util_sin_double ags_synth_util_sin_complex ags_synth_util_sawtooth_s8 ags_synth_util_sawtooth_s16 ags_synth_util_sawtooth_s24 ags_synth_util_sawtooth_s32 ags_synth_util_sawtooth_s64 ags_synth_util_sawtooth_float ags_synth_util_sawtooth_double ags_synth_util_sawtooth_complex ags_synth_util_triangle_s8 ags_synth_util_triangle_s16 ags_synth_util_triangle_s24 ags_synth_util_triangle_s32 ags_synth_util_triangle_s64 ags_synth_util_triangle_float ags_synth_util_triangle_double ags_synth_util_triangle_complex ags_synth_util_square_s8 ags_synth_util_square_s16 ags_synth_util_square_s24 ags_synth_util_square_s32 ags_synth_util_square_s64 ags_synth_util_square_float ags_synth_util_square_double ags_synth_util_square_complex ags_synth_util_impulse_s8 ags_synth_util_impulse_s16 ags_synth_util_impulse_s24 ags_synth_util_impulse_s32 ags_synth_util_impulse_s64 ags_synth_util_impulse_float ags_synth_util_impulse_double ags_synth_util_impulse_complex ags_synth_util_sin ags_synth_util_sawtooth ags_synth_util_triangle ags_synth_util_square ags_synth_util_impulse
ags_tic_device AgsTicDevice ags_tic_device_new AGS_IS_TIC_DEVICE AGS_TIC_DEVICE AGS_TIC_DEVICE_CLASS AGS_TIC_DEVICE_GET_CLASS AGS_TYPE_TIC_DEVICE AgsTicDevice AgsTicDeviceClass ags_tic_device_get_type
ags_toggle_pattern_bit AgsTogglePatternBit ags_toggle_pattern_bit_refresh_gui ags_toggle_pattern_bit_new AGS_IS_TOGGLE_PATTERN_BIT AGS_TOGGLE_PATTERN_BIT AGS_TOGGLE_PATTERN_BIT_CLASS AGS_TOGGLE_PATTERN_BIT_GET_CLASS AGS_TYPE_TOGGLE_PATTERN_BIT AgsTogglePatternBit AgsTogglePatternBitClass ags_toggle_pattern_bit_get_type
ags_track AgsTrack AGS_TRACK_GET_OBJ_MUTEX AgsTrackFlags ags_track_test_flags ags_track_set_flags ags_track_unset_flags ags_track_sort_func ags_track_duplicate ags_track_new AGS_IS_TRACK AGS_TRACK AGS_TRACK_CLASS AGS_TRACK_GET_CLASS AGS_TYPE_TRACK AgsTrack AgsTrackClass ags_track_get_type
ags_volume_audio_signal AgsVolumeAudioSignal ags_volume_audio_signal_new AGS_IS_VOLUME_AUDIO_SIGNAL AGS_TYPE_VOLUME_AUDIO_SIGNAL AGS_VOLUME_AUDIO_SIGNAL AGS_VOLUME_AUDIO_SIGNAL_CLASS AGS_VOLUME_AUDIO_SIGNAL_GET_CLASS AgsVolumeAudioSignal AgsVolumeAudioSignalClass ags_volume_audio_signal_get_type
ags_volume_channel AgsVolumeChannel ags_volume_channel_new AGS_IS_VOLUME_CHANNEL AGS_TYPE_VOLUME_CHANNEL AGS_VOLUME_CHANNEL AGS_VOLUME_CHANNEL_CLASS AGS_VOLUME_CHANNEL_GET_CLASS AgsVolumeChannel AgsVolumeChannelClass ags_volume_channel_get_type
ags_volume_channel_run AgsVolumeChannelRun ags_volume_channel_run_new AGS_IS_VOLUME_CHANNEL_RUN AGS_TYPE_VOLUME_CHANNEL_RUN AGS_VOLUME_CHANNEL_RUN AGS_VOLUME_CHANNEL_RUN_CLASS AGS_VOLUME_CHANNEL_RUN_GET_CLASS AgsVolumeChannelRun AgsVolumeChannelRunClass ags_volume_channel_run_get_type
ags_volume_recycling AgsVolumeRecycling ags_volume_recycling_new AGS_IS_VOLUME_RECYCLING AGS_TYPE_VOLUME_RECYCLING AGS_VOLUME_RECYCLING AGS_VOLUME_RECYCLING_CLASS AGS_VOLUME_RECYCLING_GET_CLASS AgsVolumeRecycling AgsVolumeRecyclingClass ags_volume_recycling_get_type
ags_wasapi_devin AgsWasapiDevin AGS_WASAPI_DEVIN_GET_OBJ_MUTEX AGS_WASAPI_DEVIN_DEFAULT_WASAPI_BUFFER_SIZE AgsWasapiDevinFlags AGS_WASAPI_DEVIN_ERROR AgsWasapiDevinError ags_wasapi_devin_error_quark ags_wasapi_devin_test_flags ags_wasapi_devin_set_flags ags_wasapi_devin_unset_flags ags_wasapi_devin_switch_buffer_flag ags_wasapi_devin_adjust_delay_and_attack ags_wasapi_devin_realloc_buffer ags_wasapi_devin_new AGS_IS_WASAPI_DEVIN AGS_TYPE_WASAPI_DEVIN AGS_WASAPI_DEVIN AGS_WASAPI_DEVIN_CLASS AGS_WASAPI_DEVIN_GET_CLASS AgsWasapiDevin AgsWasapiDevinClass ags_wasapi_devin_get_type
ags_wasapi_devout AgsWasapiDevout AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX AGS_WASAPI_DEVOUT_DEFAULT_WASAPI_BUFFER_SIZE AgsWasapiDevoutFlags AGS_WASAPI_DEVOUT_ERROR AgsWasapiDevoutError ags_wasapi_devout_error_quark ags_wasapi_devout_test_flags ags_wasapi_devout_set_flags ags_wasapi_devout_unset_flags ags_wasapi_devout_switch_buffer_flag ags_wasapi_devout_adjust_delay_and_attack ags_wasapi_devout_realloc_buffer ags_wasapi_devout_new AGS_IS_WASAPI_DEVOUT AGS_TYPE_WASAPI_DEVOUT AGS_WASAPI_DEVOUT AGS_WASAPI_DEVOUT_CLASS AGS_WASAPI_DEVOUT_GET_CLASS AgsWasapiDevout AgsWasapiDevoutClass ags_wasapi_devout_get_type
ags_wave AgsWave AGS_WAVE_GET_OBJ_MUTEX AGS_WAVE_DEFAULT_BPM AGS_WAVE_TICS_PER_BEAT AGS_WAVE_MINIMUM_BUFFER_LENGTH AGS_WAVE_DEFAULT_BUFFER_LENGTH AGS_WAVE_DEFAULT_LENGTH AGS_WAVE_DEFAULT_JIFFIE AGS_WAVE_DEFAULT_DURATION AGS_WAVE_DEFAULT_OFFSET AGS_WAVE_CLIPBOARD_VERSION AGS_WAVE_CLIPBOARD_TYPE AGS_WAVE_CLIPBOARD_FORMAT AgsWaveFlags ags_wave_test_flags ags_wave_set_flags ags_wave_unset_flags ags_wave_set_samplerate ags_wave_set_buffer_size ags_wave_set_format ags_wave_find_near_timestamp ags_wave_sort_func ags_wave_add ags_wave_add_buffer ags_wave_remove_buffer ags_wave_get_selection ags_wave_is_buffer_selected ags_wave_find_point ags_wave_find_region ags_wave_free_selection ags_wave_add_region_to_selection ags_wave_remove_region_from_selection ags_wave_add_all_to_selection ags_wave_copy_selection ags_wave_cut_selection ags_wave_insert_from_clipboard ags_wave_insert_from_clipboard_extended ags_wave_new AGS_IS_WAVE AGS_TYPE_WAVE AGS_WAVE AGS_WAVE_CLASS AGS_WAVE_GET_CLASS AgsWave AgsWaveClass ags_wave_get_type
ags_wave_loader AgsWaveLoader AGS_WAVE_LOADER_GET_OBJ_MUTEX AgsWaveLoaderFlags ags_wave_loader_test_flags ags_wave_loader_set_flags ags_wave_loader_unset_flags ags_wave_loader_start ags_wave_loader_new AGS_IS_WAVE_LOADER AGS_TYPE_WAVE_LOADER AGS_WAVE_LOADER AGS_WAVE_LOADER_CLASS AGS_WAVE_LOADER_GET_CLASS AgsWaveLoader AgsWaveLoaderClass ags_wave_loader_get_type
gsequencer-3.1.3/docs/reference/libags-audio/libags_audio-sections.txt.in0000644000175000017500000046744213607210263023464 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see .
ags_acceleration AgsAcceleration AGS_ACCELERATION_GET_OBJ_MUTEX AgsAccelerationFlags ags_acceleration_test_flags ags_acceleration_set_flags ags_acceleration_unset_flags ags_acceleration_sort_func ags_acceleration_duplicate ags_acceleration_new AGS_ACCELERATION AGS_ACCELERATION_CLASS AGS_ACCELERATION_GET_CLASS AGS_IS_ACCELERATION AGS_TYPE_ACCELERATION AgsAcceleration AgsAccelerationClass ags_acceleration_get_type
ags_add_audio AgsAddAudio ags_add_audio_new AGS_ADD_AUDIO AGS_ADD_AUDIO_CLASS AGS_ADD_AUDIO_GET_CLASS AGS_IS_ADD_AUDIO AGS_TYPE_ADD_AUDIO AgsAddAudio AgsAddAudioClass ags_add_audio_get_type
ags_add_audio_signal AgsAddAudioSignal ags_add_audio_signal_new AGS_ADD_AUDIO_SIGNAL AGS_ADD_AUDIO_SIGNAL_CLASS AGS_ADD_AUDIO_SIGNAL_GET_CLASS AGS_IS_ADD_AUDIO_SIGNAL AGS_TYPE_ADD_AUDIO_SIGNAL AgsAddAudioSignal AgsAddAudioSignalClass ags_add_audio_signal_get_type
ags_add_effect AgsAddEffect ags_add_effect_new AGS_ADD_EFFECT AGS_ADD_EFFECT_CLASS AGS_ADD_EFFECT_GET_CLASS AGS_IS_ADD_EFFECT AGS_TYPE_ADD_EFFECT AgsAddEffect AgsAddEffectClass ags_add_effect_get_type
ags_add_note AgsAddNote ags_add_note_new AGS_ADD_NOTE AGS_ADD_NOTE_CLASS AGS_ADD_NOTE_GET_CLASS AGS_IS_ADD_NOTE AGS_TYPE_ADD_NOTE AgsAddNote AgsAddNoteClass ags_add_note_get_type
ags_add_soundcard AgsAddSoundcard ags_add_soundcard_new AGS_ADD_SOUNDCARD AGS_ADD_SOUNDCARD_CLASS AGS_ADD_SOUNDCARD_GET_CLASS AGS_IS_ADD_SOUNDCARD AGS_TYPE_ADD_SOUNDCARD AgsAddSoundcard AgsAddSoundcardClass ags_add_soundcard_get_type
ags_analyse_audio_signal AgsAnalyseAudioSignal ags_analyse_audio_signal_new AGS_ANALYSE_AUDIO_SIGNAL AGS_ANALYSE_AUDIO_SIGNAL_CLASS AGS_ANALYSE_AUDIO_SIGNAL_GET_CLASS AGS_IS_ANALYSE_AUDIO_SIGNAL AGS_TYPE_ANALYSE_AUDIO_SIGNAL AgsAnalyseAudioSignal AgsAnalyseAudioSignalClass ags_analyse_audio_signal_get_type
ags_analyse_channel AgsAnalyseChannel AGS_ANALYSE_CHANNEL_GET_BUFFER_MUTEX ags_analyse_channel_buffer_add ags_analyse_channel_retrieve_frequency_and_magnitude ags_analyse_channel_new AGS_ANALYSE_CHANNEL AGS_ANALYSE_CHANNEL_CLASS AGS_ANALYSE_CHANNEL_GET_CLASS AGS_IS_ANALYSE_CHANNEL AGS_TYPE_ANALYSE_CHANNEL AgsAnalyseChannel AgsAnalyseChannelClass ags_analyse_channel_get_type
ags_analyse_channel_run AgsAnalyseChannelRun ags_analyse_channel_run_new AGS_ANALYSE_CHANNEL_RUN AGS_ANALYSE_CHANNEL_RUN_CLASS AGS_ANALYSE_CHANNEL_RUN_GET_CLASS AGS_IS_ANALYSE_CHANNEL_RUN AGS_TYPE_ANALYSE_CHANNEL_RUN AgsAnalyseChannelRun AgsAnalyseChannelRunClass ags_analyse_channel_run_get_type
ags_analyse_recycling AgsAnalyseRecycling ags_analyse_recycling_new AGS_ANALYSE_RECYCLING AGS_ANALYSE_RECYCLING_CLASS AGS_ANALYSE_RECYCLING_GET_CLASS AGS_IS_ANALYSE_RECYCLING AGS_TYPE_ANALYSE_RECYCLING AgsAnalyseRecycling AgsAnalyseRecyclingClass ags_analyse_recycling_get_type
ags_apply_bpm AgsApplyBpm ags_apply_bpm_new AGS_APPLY_BPM AGS_APPLY_BPM_CLASS AGS_APPLY_BPM_GET_CLASS AGS_IS_APPLY_BPM AGS_TYPE_APPLY_BPM AgsApplyBpm AgsApplyBpmClass ags_apply_bpm_get_type
ags_apply_presets AgsApplyPresets ags_apply_presets_soundcard ags_apply_presets_new AGS_APPLY_PRESETS AGS_APPLY_PRESETS_CLASS AGS_APPLY_PRESETS_GET_CLASS AGS_IS_APPLY_PRESETS AGS_TYPE_APPLY_PRESETS AgsApplyPresets AgsApplyPresetsClass ags_apply_presets_get_type
ags_apply_sequencer_length AgsApplySequencerLength ags_apply_sequencer_length_new AGS_APPLY_SEQUENCER_LENGTH AGS_APPLY_SEQUENCER_LENGTH_CLASS AGS_APPLY_SEQUENCER_LENGTH_GET_CLASS AGS_IS_APPLY_SEQUENCER_LENGTH AGS_TYPE_APPLY_SEQUENCER_LENGTH AgsApplySequencerLength AgsApplySequencerLengthClass ags_apply_sequencer_length_get_type
ags_apply_sound_config AgsApplySoundConfig ags_apply_sound_config_new AGS_APPLY_SOUND_CONFIG AGS_APPLY_SOUND_CONFIG_CLASS AGS_APPLY_SOUND_CONFIG_GET_CLASS AGS_IS_APPLY_SOUND_CONFIG AGS_TYPE_APPLY_SOUND_CONFIG AgsApplySoundConfig AgsApplySoundConfigClass ags_apply_sound_config_get_type
ags_apply_synth AgsApplySynth ags_apply_synth_new AGS_APPLY_SYNTH AGS_APPLY_SYNTH_CLASS AGS_APPLY_SYNTH_GET_CLASS AGS_IS_APPLY_SYNTH AGS_TYPE_APPLY_SYNTH AgsApplySynth AgsApplySynthClass ags_apply_synth_get_type
ags_apply_tact AgsApplyTact ags_apply_tact_new AGS_APPLY_TACT AGS_APPLY_TACT_CLASS AGS_APPLY_TACT_GET_CLASS AGS_IS_APPLY_TACT AGS_TYPE_APPLY_TACT AgsApplyTact AgsApplyTactClass ags_apply_tact_get_type
ags_audio AgsAudio AGS_AUDIO_GET_OBJ_MUTEX AGS_AUDIO_GET_PLAY_MUTEX AGS_AUDIO_GET_RECALL_MUTEX AgsAudioFlags ags_audio_test_flags ags_audio_set_flags ags_audio_unset_flags ags_audio_test_ability_flags ags_audio_set_ability_flags ags_audio_unset_ability_flags ags_audio_test_behaviour_flags ags_audio_set_behaviour_flags ags_audio_unset_behaviour_flags ags_audio_test_staging_flags ags_audio_set_staging_flags ags_audio_unset_staging_flags ags_audio_find_name ags_audio_set_max_audio_channels ags_audio_set_max_pads ags_audio_set_audio_channels ags_audio_set_pads ags_audio_set_output_soundcard ags_audio_set_input_soundcard ags_audio_set_output_sequencer ags_audio_set_input_sequencer ags_audio_set_samplerate ags_audio_set_buffer_size ags_audio_set_format ags_audio_add_preset ags_audio_remove_preset ags_audio_add_synth_generator ags_audio_remove_synth_generator ags_audio_add_cursor ags_audio_remove_cursor ags_audio_add_notation ags_audio_remove_notation ags_audio_add_automation_port ags_audio_remove_automation_port ags_audio_add_automation ags_audio_remove_automation ags_audio_add_wave ags_audio_remove_wave ags_audio_add_midi ags_audio_remove_midi ags_audio_add_recall_id ags_audio_remove_recall_id ags_audio_add_recycling_context ags_audio_remove_recycling_context ags_audio_add_recall_container ags_audio_remove_recall_container ags_audio_add_recall ags_audio_remove_recall ags_audio_duplicate_recall ags_audio_resolve_recall ags_audio_init_recall ags_audio_play_recall ags_audio_done_recall ags_audio_cancel_recall ags_audio_cleanup_recall ags_audio_start ags_audio_stop ags_audio_check_scope ags_audio_collect_all_audio_ports ags_audio_collect_all_audio_ports_by_specifier_and_context ags_audio_open_audio_file_as_channel ags_audio_open_audio_file_as_wave ags_audio_open_midi_file_as_midi ags_audio_open_midi_file_as_notation ags_audio_recursive_set_property ags_audio_recursive_run_stage ags_audio_new AGS_AUDIO AGS_AUDIO_CLASS AGS_AUDIO_GET_CLASS AGS_IS_AUDIO AGS_TYPE_AUDIO AgsAudio AgsAudioClass ags_audio_get_type
ags_audio_application_context AgsAudioApplicationContext AGS_AUDIO_DEFAULT_VERSION AGS_AUDIO_BUILD_ID AGS_EFFECTS_DEFAULT_VERSION ags_audio_application_context_new AGS_AUDIO_APPLICATION_CONTEXT AGS_AUDIO_APPLICATION_CONTEXT_CLASS AGS_AUDIO_APPLICATION_CONTEXT_GET_CLASS AGS_IS_AUDIO_APPLICATION_CONTEXT AGS_TYPE_AUDIO_APPLICATION_CONTEXT AgsAudioApplicationContext AgsAudioApplicationContextClass ags_audio_application_context_get_type
ags_audio_buffer_util AGS_AUDIO_BUFFER_S8 AGS_AUDIO_BUFFER_S16 AGS_AUDIO_BUFFER_S24 AGS_AUDIO_BUFFER_S32 AGS_AUDIO_BUFFER_S64 AGS_AUDIO_BUFFER_FLOAT AGS_AUDIO_BUFFER_DOUBLE AGS_AUDIO_BUFFER_COMPLEX AgsAudioBufferUtilFormat AgsAudioBufferUtilSamplerate AgsAudioBufferUtilCopyMode ags_audio_buffer_util_format_from_soundcard ags_audio_buffer_util_get_copy_mode ags_audio_buffer_util_clear_float ags_audio_buffer_util_clear_float32 ags_audio_buffer_util_clear_double ags_audio_buffer_util_clear_complex ags_audio_buffer_util_clear_buffer ags_audio_buffer_util_envelope_s8 ags_audio_buffer_util_envelope_s16 ags_audio_buffer_util_envelope_s24 ags_audio_buffer_util_envelope_s32 ags_audio_buffer_util_envelope_s64 ags_audio_buffer_util_envelope_float ags_audio_buffer_util_envelope_double ags_audio_buffer_util_envelope_complex ags_audio_buffer_util_envelope ags_audio_buffer_util_volume_s8 ags_audio_buffer_util_volume_s16 ags_audio_buffer_util_volume_s24 ags_audio_buffer_util_volume_s32 ags_audio_buffer_util_volume_s64 ags_audio_buffer_util_volume_float ags_audio_buffer_util_volume_double ags_audio_buffer_util_volume_complex ags_audio_buffer_util_volume ags_audio_buffer_util_peak_s8 ags_audio_buffer_util_peak_s16 ags_audio_buffer_util_peak_s24 ags_audio_buffer_util_peak_s32 ags_audio_buffer_util_peak_s64 ags_audio_buffer_util_peak_float ags_audio_buffer_util_peak_double ags_audio_buffer_util_peak_complex ags_audio_buffer_util_peak ags_audio_buffer_util_resample_s8 ags_audio_buffer_util_resample_s16 ags_audio_buffer_util_resample_s24 ags_audio_buffer_util_resample_s32 ags_audio_buffer_util_resample_s64 ags_audio_buffer_util_resample_float ags_audio_buffer_util_resample_double ags_audio_buffer_util_resample_complex ags_audio_buffer_util_resample ags_audio_buffer_util_resample_s8_with_buffer ags_audio_buffer_util_resample_s16_with_buffer ags_audio_buffer_util_resample_s24_with_buffer ags_audio_buffer_util_resample_s32_with_buffer ags_audio_buffer_util_resample_s64_with_buffer ags_audio_buffer_util_resample_float_with_buffer ags_audio_buffer_util_resample_double_with_buffer ags_audio_buffer_util_resample_complex_with_buffer ags_audio_buffer_util_resample_with_buffer ags_audio_buffer_util_copy_s8_to_s8 ags_audio_buffer_util_copy_s8_to_s16 ags_audio_buffer_util_copy_s8_to_s24 ags_audio_buffer_util_copy_s8_to_s32 ags_audio_buffer_util_copy_s8_to_s64 ags_audio_buffer_util_copy_s8_to_float ags_audio_buffer_util_copy_s8_to_double ags_audio_buffer_util_copy_s16_to_s8 ags_audio_buffer_util_copy_s16_to_s16 ags_audio_buffer_util_copy_s16_to_s24 ags_audio_buffer_util_copy_s16_to_s32 ags_audio_buffer_util_copy_s16_to_s64 ags_audio_buffer_util_copy_s16_to_float ags_audio_buffer_util_copy_s16_to_double ags_audio_buffer_util_copy_s24_to_s8 ags_audio_buffer_util_copy_s24_to_s16 ags_audio_buffer_util_copy_s24_to_s24 ags_audio_buffer_util_copy_s24_to_s32 ags_audio_buffer_util_copy_s24_to_s64 ags_audio_buffer_util_copy_s24_to_float ags_audio_buffer_util_copy_s24_to_double ags_audio_buffer_util_copy_s32_to_s8 ags_audio_buffer_util_copy_s32_to_s16 ags_audio_buffer_util_copy_s32_to_s24 ags_audio_buffer_util_copy_s32_to_s32 ags_audio_buffer_util_copy_s32_to_s64 ags_audio_buffer_util_copy_s32_to_float ags_audio_buffer_util_copy_s32_to_double ags_audio_buffer_util_copy_s64_to_s8 ags_audio_buffer_util_copy_s64_to_s16 ags_audio_buffer_util_copy_s64_to_s24 ags_audio_buffer_util_copy_s64_to_s32 ags_audio_buffer_util_copy_s64_to_s64 ags_audio_buffer_util_copy_s64_to_float ags_audio_buffer_util_copy_s64_to_double ags_audio_buffer_util_copy_float_to_s8 ags_audio_buffer_util_copy_float_to_s16 ags_audio_buffer_util_copy_float_to_s24 ags_audio_buffer_util_copy_float_to_s32 ags_audio_buffer_util_copy_float_to_s64 ags_audio_buffer_util_copy_float_to_float ags_audio_buffer_util_copy_float_to_double ags_audio_buffer_util_copy_double_to_s8 ags_audio_buffer_util_copy_double_to_s16 ags_audio_buffer_util_copy_double_to_s24 ags_audio_buffer_util_copy_double_to_s32 ags_audio_buffer_util_copy_double_to_s64 ags_audio_buffer_util_copy_double_to_float ags_audio_buffer_util_copy_double_to_double ags_audio_buffer_util_copy_s8_to_float32 ags_audio_buffer_util_copy_s16_to_float32 ags_audio_buffer_util_copy_s24_to_float32 ags_audio_buffer_util_copy_s32_to_float32 ags_audio_buffer_util_copy_s64_to_float32 ags_audio_buffer_util_copy_float_to_float32 ags_audio_buffer_util_copy_double_to_float32 ags_audio_buffer_util_copy_float32_to_float32 ags_audio_buffer_util_copy_float32_to_s8 ags_audio_buffer_util_copy_float32_to_s16 ags_audio_buffer_util_copy_float32_to_s24 ags_audio_buffer_util_copy_float32_to_s32 ags_audio_buffer_util_copy_float32_to_s64 ags_audio_buffer_util_copy_float32_to_float ags_audio_buffer_util_copy_float32_to_double ags_audio_buffer_util_copy_s8_to_complex ags_audio_buffer_util_copy_s16_to_complex ags_audio_buffer_util_copy_s24_to_complex ags_audio_buffer_util_copy_s32_to_complex ags_audio_buffer_util_copy_s64_to_complex ags_audio_buffer_util_copy_float_to_complex ags_audio_buffer_util_copy_double_to_complex ags_audio_buffer_util_copy_float32_to_complex ags_audio_buffer_util_copy_complex_to_complex ags_audio_buffer_util_copy_complex_to_s8 ags_audio_buffer_util_copy_complex_to_s16 ags_audio_buffer_util_copy_complex_to_s24 ags_audio_buffer_util_copy_complex_to_s32 ags_audio_buffer_util_copy_complex_to_s64 ags_audio_buffer_util_copy_complex_to_float ags_audio_buffer_util_copy_complex_to_double ags_audio_buffer_util_copy_complex_to_float32 ags_audio_buffer_util_copy_buffer_to_buffer
ags_audio_container AgsAudioContainer AGS_AUDIO_CONTAINER_GET_OBJ_MUTEX AgsAudioContainerFlags ags_audio_container_test_flags ags_audio_container_set_flags ags_audio_container_unset_flags ags_audio_container_check_suffix ags_audio_container_find_sound_resource ags_audio_container_add_audio_signal ags_audio_container_remove_audio_signal ags_audio_container_add_wave ags_audio_container_remove_wave ags_audio_container_open ags_audio_container_open_from_data ags_audio_container_rw_open ags_audio_container_close ags_audio_container_read ags_audio_container_read_audio_signal ags_audio_container_read_wave ags_audio_container_seek ags_audio_container_write ags_audio_container_flush ags_audio_container_new AGS_AUDIO_CONTAINER AGS_AUDIO_CONTAINER_CLASS AGS_AUDIO_CONTAINER_GET_CLASS AGS_IS_AUDIO_CONTAINER AGS_TYPE_AUDIO_CONTAINER AgsAudioContainer AgsAudioContainerClass ags_audio_container_get_type
ags_audio_file AgsAudioFile AGS_AUDIO_FILE_GET_OBJ_MUTEX AgsAudioFileFlags ags_audio_file_test_flags ags_audio_file_set_flags ags_audio_file_unset_flags ags_audio_file_check_suffix ags_audio_file_add_audio_signal ags_audio_file_remove_audio_signal ags_audio_file_add_wave ags_audio_file_remove_wave ags_audio_file_open ags_audio_file_open_from_data ags_audio_file_rw_open ags_audio_file_close ags_audio_file_read ags_audio_file_read_audio_signal ags_audio_file_read_wave ags_audio_file_seek ags_audio_file_write ags_audio_file_flush ags_audio_file_new AGS_AUDIO_FILE AGS_AUDIO_FILE_CLASS AGS_AUDIO_FILE_GET_CLASS AGS_IS_AUDIO_FILE AGS_TYPE_AUDIO_FILE AgsAudioFile AgsAudioFileClass ags_audio_file_get_type
ags_audio_file_link AgsAudioFileLink ags_audio_file_link_new AGS_AUDIO_FILE_LINK AGS_AUDIO_FILE_LINK_CLASS AGS_AUDIO_FILE_LINK_GET_CLASS AGS_IS_AUDIO_FILE_LINK AGS_TYPE_AUDIO_FILE_LINK AgsAudioFileLink AgsAudioFileLinkClass ags_audio_file_link_get_type
ags_audio_loop AgsAudioLoop AGS_AUDIO_LOOP_DEFAULT_JIFFIE AgsAudioLoopFlags ags_audio_loop_test_flags ags_audio_loop_set_flags ags_audio_loop_unset_flags ags_audio_loop_add_audio ags_audio_loop_remove_audio ags_audio_loop_add_channel ags_audio_loop_remove_channel ags_audio_loop_new AGS_AUDIO_LOOP AGS_AUDIO_LOOP_CLASS AGS_AUDIO_LOOP_GET_CLASS AGS_IS_AUDIO_LOOP AGS_TYPE_AUDIO_LOOP AgsAudioLoop AgsAudioLoopClass ags_audio_loop_get_type
ags_audio_signal AgsAudioSignal AGS_AUDIO_SIGNAL_GET_OBJ_MUTEX AGS_AUDIO_SIGNAL_GET_STREAM_MUTEX AgsAudioSignalFlags ags_audio_signal_test_flags ags_audio_signal_set_flags ags_audio_signal_unset_flags ags_stream_alloc ags_stream_free ags_audio_signal_set_output_soundcard ags_audio_signal_set_input_soundcard ags_audio_signal_set_samplerate ags_audio_signal_set_buffer_size ags_audio_signal_set_format ags_audio_signal_add_note ags_audio_signal_remove_note ags_audio_signal_refresh_data ags_audio_signal_add_stream ags_audio_signal_stream_resize ags_audio_signal_stream_safe_resize ags_audio_signal_duplicate_stream ags_audio_signal_feed ags_audio_signal_get_length_till_current ags_audio_signal_get_template ags_audio_signal_get_rt_template ags_audio_signal_find_stream_current ags_audio_signal_find_by_recall_id ags_audio_signal_is_active ags_audio_signal_new ags_audio_signal_new_with_length AGS_AUDIO_SIGNAL AGS_AUDIO_SIGNAL_CLASS AGS_AUDIO_SIGNAL_GET_CLASS AGS_IS_AUDIO_SIGNAL AGS_TYPE_AUDIO_SIGNAL AgsAudioSignal AgsAudioSignalClass ags_audio_signal_get_type
ags_audio_thread AgsAudioThread AGS_AUDIO_THREAD_DEFAULT_JIFFIE AgsAudioThreadFlags ags_audio_thread_test_status_flags ags_audio_thread_set_status_flags ags_audio_thread_unset_status_flags ags_audio_thread_set_sound_scope ags_audio_thread_new AGS_AUDIO_THREAD AGS_AUDIO_THREAD_CLASS AGS_AUDIO_THREAD_GET_CLASS AGS_IS_AUDIO_THREAD AGS_TYPE_AUDIO_THREAD AgsAudioThread AgsAudioThreadClass ags_audio_thread_get_type
ags_audio_unit_client AgsAudioUnitClient AGS_AUDIO_UNIT_CLIENT_GET_OBJ_MUTEX AgsAudioUnitClientFlags ags_audio_unit_client_test_flags ags_audio_unit_client_set_flags ags_audio_unit_client_unset_flags ags_audio_unit_client_find_uuid ags_audio_unit_client_find ags_audio_unit_client_open ags_audio_unit_client_add_device ags_audio_unit_client_remove_device ags_audio_unit_client_add_port ags_audio_unit_client_remove_port ags_audio_unit_client_activate ags_audio_unit_client_deactivate ags_audio_unit_client_new AGS_AUDIO_UNIT_CLIENT AGS_AUDIO_UNIT_CLIENT_CLASS AGS_AUDIO_UNIT_CLIENT_GET_CLASS AGS_IS_AUDIO_UNIT_CLIENT AGS_TYPE_AUDIO_UNIT_CLIENT AgsAudioUnitClient AgsAudioUnitClientClass ags_audio_unit_client_get_type
ags_audio_unit_devin AgsAudioUnitDevin AGS_AUDIO_UNIT_DEVIN_GET_OBJ_MUTEX AgsAudioUnitDevinFlags AgsAudioUnitDevinSyncFlags AGS_AUDIO_UNIT_DEVIN_ERROR AgsAudioUnitDevinError ags_audio_unit_devin_error_quark ags_audio_unit_devin_test_flags ags_audio_unit_devin_set_flags ags_audio_unit_devin_unset_flags ags_audio_unit_devin_switch_buffer_flag ags_audio_unit_devin_adjust_delay_and_attack ags_audio_unit_devin_realloc_buffer ags_audio_unit_devin_new AGS_AUDIO_UNIT_DEVIN AGS_AUDIO_UNIT_DEVIN_CLASS AGS_AUDIO_UNIT_DEVIN_GET_CLASS AGS_IS_AUDIO_UNIT_DEVIN AGS_TYPE_AUDIO_UNIT_DEVIN AgsAudioUnitDevin AgsAudioUnitDevinClass ags_audio_unit_devin_get_type
ags_audio_unit_devout AgsAudioUnitDevout AGS_AUDIO_UNIT_DEVOUT_GET_OBJ_MUTEX AgsAudioUnitDevoutFlags AgsAudioUnitDevoutSyncFlags AGS_AUDIO_UNIT_DEVOUT_ERROR AgsAudioUnitDevoutError ags_audio_unit_devout_error_quark ags_audio_unit_devout_test_flags ags_audio_unit_devout_set_flags ags_audio_unit_devout_unset_flags ags_audio_unit_devout_switch_buffer_flag ags_audio_unit_devout_adjust_delay_and_attack ags_audio_unit_devout_realloc_buffer ags_audio_unit_devout_new AGS_AUDIO_UNIT_DEVOUT AGS_AUDIO_UNIT_DEVOUT_CLASS AGS_AUDIO_UNIT_DEVOUT_GET_CLASS AGS_IS_AUDIO_UNIT_DEVOUT AGS_TYPE_AUDIO_UNIT_DEVOUT AgsAudioUnitDevout AgsAudioUnitDevoutClass ags_audio_unit_devout_get_type
ags_audio_unit_port AgsAudioUnitPort AGS_AUDIO_UNIT_PORT_GET_OBJ_MUTEX AGS_AUDIO_UNIT_PORT_DEFAULT_CACHE_BUFFER_SIZE AgsAudioUnitPortFlags ags_audio_unit_port_test_flags ags_audio_unit_port_set_flags ags_audio_unit_port_unset_flags ags_audio_unit_port_find ags_audio_unit_port_register ags_audio_unit_port_unregister ags_audio_unit_port_set_format ags_audio_unit_port_set_samplerate ags_audio_unit_port_set_pcm_channels ags_audio_unit_port_set_buffer_size ags_audio_unit_port_new AGS_AUDIO_UNIT_PORT AGS_AUDIO_UNIT_PORT_CLASS AGS_AUDIO_UNIT_PORT_GET_CLASS AGS_IS_AUDIO_UNIT_PORT AGS_TYPE_AUDIO_UNIT_PORT AgsAudioUnitPort AgsAudioUnitPortClass ags_audio_unit_port_get_type
ags_audio_unit_server AgsAudioUnitServer AGS_AUDIO_UNIT_SERVER_GET_OBJ_MUTEX AgsAudioUnitServerFlags ags_audio_unit_server_test_flags ags_audio_unit_server_set_flags ags_audio_unit_server_unset_flags ags_audio_unit_server_find_url ags_audio_unit_server_find_client ags_audio_unit_server_find_port ags_audio_unit_server_add_client ags_audio_unit_server_remove_client ags_audio_unit_server_connect_client ags_audio_unit_server_start_poll ags_audio_unit_server_new AGS_AUDIO_UNIT_SERVER AGS_AUDIO_UNIT_SERVER_CLASS AGS_AUDIO_UNIT_SERVER_GET_CLASS AGS_IS_AUDIO_UNIT_SERVER AGS_TYPE_AUDIO_UNIT_SERVER AgsAudioUnitServer AgsAudioUnitServerClass ags_audio_unit_server_get_type
ags_automation AgsAutomation AGS_AUTOMATION_GET_OBJ_MUTEX AGS_AUTOMATION_DEFAULT_BPM AGS_AUTOMATION_TICS_PER_BEAT AGS_AUTOMATION_MINIMUM_ACCELERATION_LENGTH AGS_AUTOMATION_MAXIMUM_ACCELERATION_LENGTH AGS_AUTOMATION_DEFAULT_LENGTH AGS_AUTOMATION_DEFAULT_JIFFIE AGS_AUTOMATION_DEFAULT_DURATION AGS_AUTOMATION_DEFAULT_OFFSET AGS_AUTOMATION_DEFAULT_PRECISION AGS_AUTOMATION_MAXIMUM_STEPS AGS_AUTOMATION_CLIPBOARD_VERSION AGS_AUTOMATION_CLIPBOARD_TYPE AGS_AUTOMATION_CLIPBOARD_FORMAT AGS_AUTOMATION_CLIPBOARD_LEGACY_FORMAT AgsAutomationFlags ags_automation_test_flags ags_automation_set_flags ags_automation_unset_flags ags_automation_find_port ags_automation_find_near_timestamp ags_automation_find_near_timestamp_extended ags_automation_sort_func ags_automation_add ags_automation_add_acceleration ags_automation_remove_acceleration ags_automation_remove_acceleration_at_position ags_automation_get_selection ags_automation_is_acceleration_selected ags_automation_find_point ags_automation_find_region ags_automation_free_selection ags_automation_add_point_to_selection ags_automation_remove_point_from_selection ags_automation_add_region_to_selection ags_automation_remove_region_from_selection ags_automation_add_all_to_selection ags_automation_copy_selection ags_automation_cut_selection ags_automation_insert_from_clipboard ags_automation_insert_from_clipboard_extended ags_automation_get_specifier_unique ags_automation_get_specifier_unique_with_channel_type ags_automation_find_specifier ags_automation_find_channel_type_with_control_name ags_automation_find_specifier_with_type_and_line ags_automation_get_value ags_automation_new AGS_AUTOMATION AGS_AUTOMATION_CLASS AGS_AUTOMATION_GET_CLASS AGS_IS_AUTOMATION AGS_TYPE_AUTOMATION AgsAutomation AgsAutomationClass ags_automation_get_type
ags_base_plugin AgsBasePlugin AGS_BASE_PLUGIN_GET_OBJ_MUTEX AgsBasePluginFlags ags_base_plugin_test_flags ags_base_plugin_set_flags ags_base_plugin_unset_flags ags_base_plugin_find_filename ags_base_plugin_find_effect ags_base_plugin_find_ui_effect_index ags_base_plugin_sort_func ags_base_plugin_sort ags_base_plugin_apply_port_group_by_prefix ags_base_plugin_instantiate ags_base_plugin_instantiate_with_params ags_base_plugin_connect_port ags_base_plugin_activate ags_base_plugin_deactivate ags_base_plugin_run ags_base_plugin_load_plugin ags_base_plugin_new AGS_BASE_PLUGIN AGS_BASE_PLUGIN_CLASS AGS_BASE_PLUGIN_GET_CLASS AGS_IS_BASE_PLUGIN AGS_TYPE_BASE_PLUGIN AgsBasePlugin AgsBasePluginClass ags_base_plugin_get_type
ags_buffer AgsBuffer AGS_BUFFER_GET_OBJ_MUTEX AgsBufferFlags ags_buffer_test_flags ags_buffer_set_flags ags_buffer_unset_flags ags_buffer_set_samplerate ags_buffer_set_buffer_size ags_buffer_set_format ags_buffer_sort_func ags_buffer_duplicate ags_buffer_new AGS_BUFFER AGS_BUFFER_CLASS AGS_BUFFER_GET_CLASS AGS_IS_BUFFER AGS_TYPE_BUFFER AgsBuffer AgsBufferClass ags_buffer_get_type
ags_buffer_audio_signal AgsBufferAudioSignal ags_buffer_audio_signal_new AGS_BUFFER_AUDIO_SIGNAL AGS_BUFFER_AUDIO_SIGNAL_CLASS AGS_BUFFER_AUDIO_SIGNAL_GET_CLASS AGS_IS_BUFFER_AUDIO_SIGNAL AGS_TYPE_BUFFER_AUDIO_SIGNAL AgsBufferAudioSignal AgsBufferAudioSignalClass ags_buffer_audio_signal_get_type
ags_buffer_channel AgsBufferChannel ags_buffer_channel_new AGS_BUFFER_CHANNEL AGS_BUFFER_CHANNEL_CLASS AGS_BUFFER_CHANNEL_GET_CLASS AGS_IS_BUFFER_CHANNEL AGS_TYPE_BUFFER_CHANNEL AgsBufferChannel AgsBufferChannelClass ags_buffer_channel_get_type
ags_buffer_channel_run AgsBufferChannelRun ags_buffer_channel_run_new AGS_BUFFER_CHANNEL_RUN AGS_BUFFER_CHANNEL_RUN_CLASS AGS_BUFFER_CHANNEL_RUN_GET_CLASS AGS_IS_BUFFER_CHANNEL_RUN AGS_TYPE_BUFFER_CHANNEL_RUN AgsBufferChannelRun AgsBufferChannelRunClass ags_buffer_channel_run_get_type
ags_buffer_recycling AgsBufferRecycling ags_buffer_recycling_new AGS_BUFFER_RECYCLING AGS_BUFFER_RECYCLING_CLASS AGS_BUFFER_RECYCLING_GET_CLASS AGS_IS_BUFFER_RECYCLING AGS_TYPE_BUFFER_RECYCLING AgsBufferRecycling AgsBufferRecyclingClass ags_buffer_recycling_get_type
ags_cancel_audio AgsCancelAudio ags_cancel_audio_new AGS_CANCEL_AUDIO AGS_CANCEL_AUDIO_CLASS AGS_CANCEL_AUDIO_GET_CLASS AGS_IS_CANCEL_AUDIO AGS_TYPE_CANCEL_AUDIO AgsCancelAudio AgsCancelAudioClass ags_cancel_audio_get_type
ags_cancel_channel AgsCancelChannel ags_cancel_channel_new AGS_CANCEL_CHANNEL AGS_CANCEL_CHANNEL_CLASS AGS_CANCEL_CHANNEL_GET_CLASS AGS_IS_CANCEL_CHANNEL AGS_TYPE_CANCEL_CHANNEL AgsCancelChannel AgsCancelChannelClass ags_cancel_channel_get_type
ags_capture_wave_audio AgsCaptureWaveAudio ags_capture_wave_audio_new AGS_CAPTURE_WAVE_AUDIO AGS_CAPTURE_WAVE_AUDIO_CLASS AGS_CAPTURE_WAVE_AUDIO_GET_CLASS AGS_IS_CAPTURE_WAVE_AUDIO AGS_TYPE_CAPTURE_WAVE_AUDIO AgsCaptureWaveAudio AgsCaptureWaveAudioClass ags_capture_wave_audio_get_type
ags_capture_wave_audio_run AgsCaptureWaveAudioRun ags_capture_wave_audio_run_new AGS_CAPTURE_WAVE_AUDIO_RUN AGS_CAPTURE_WAVE_AUDIO_RUN_CLASS AGS_CAPTURE_WAVE_AUDIO_RUN_GET_CLASS AGS_IS_CAPTURE_WAVE_AUDIO_RUN AGS_TYPE_CAPTURE_WAVE_AUDIO_RUN AgsCaptureWaveAudioRun AgsCaptureWaveAudioRunClass ags_capture_wave_audio_run_get_type
ags_capture_wave_channel AgsCaptureWaveChannel ags_capture_wave_channel_new AGS_CAPTURE_WAVE_CHANNEL AGS_CAPTURE_WAVE_CHANNEL_CLASS AGS_CAPTURE_WAVE_CHANNEL_GET_CLASS AGS_IS_CAPTURE_WAVE_CHANNEL AGS_TYPE_CAPTURE_WAVE_CHANNEL AgsCaptureWaveChannel AgsCaptureWaveChannelClass ags_capture_wave_channel_get_type
ags_capture_wave_channel_run AgsCaptureWaveChannelRun ags_capture_wave_channel_run_new AGS_CAPTURE_WAVE_CHANNEL_RUN AGS_CAPTURE_WAVE_CHANNEL_RUN_CLASS AGS_CAPTURE_WAVE_CHANNEL_RUN_GET_CLASS AGS_IS_CAPTURE_WAVE_CHANNEL_RUN AGS_TYPE_CAPTURE_WAVE_CHANNEL_RUN AgsCaptureWaveChannelRun AgsCaptureWaveChannelRunClass ags_capture_wave_channel_run_get_type
ags_channel AgsChannel AGS_CHANNEL_GET_OBJ_MUTEX AGS_CHANNEL_GET_PLAY_MUTEX AGS_CHANNEL_GET_RECALL_MUTEX AGS_CHANNEL_MINIMUM_OCTAVE AGS_CHANNEL_MAXIMUM_OCTAVE AGS_CHANNEL_DEFAULT_OCTAVE AGS_CHANNEL_MINIMUM_OCTAVE_SEMITONE AGS_CHANNEL_MAXIMUM_OCTAVE_SEMITONE AGS_CHANNEL_DEFAULT_OCTAVE_SEMITONE AGS_CHANNEL_MINIMUM_SEMITONE AGS_CHANNEL_MAXIMUM_SEMITONE AGS_CHANNEL_DEFAULT_SEMITONE AGS_CHANNEL_MINIMUM_NOTE_FREQUENCY AGS_CHANNEL_MAXIMUM_NOTE_FREQUENCY AGS_CHANNEL_DEFAULT_NOTE_FREQUENCY AGS_CHANNEL_MINIMUM_MIDI_NOTE AGS_CHANNEL_MAXIMUM_MIDI_NOTE AGS_CHANNEL_DEFAULT_MIDI_NOTE AgsChannelFlags AGS_CHANNEL_ERROR AgsChannelError ags_channel_error_quark ags_channel_test_flags ags_channel_set_flags ags_channel_unset_flags ags_channel_test_ability_flags ags_channel_set_ability_flags ags_channel_unset_ability_flags ags_channel_test_behaviour_flags ags_channel_set_behaviour_flags ags_channel_unset_behaviour_flags ags_channel_test_staging_flags ags_channel_set_staging_flags ags_channel_unset_staging_flags ags_channel_next ags_channel_prev ags_channel_next_pad ags_channel_prev_pad ags_channel_first ags_channel_last ags_channel_nth ags_channel_pad_first ags_channel_pad_last ags_channel_pad_nth ags_channel_first_with_recycling ags_channel_last_with_recycling ags_channel_prev_with_recycling ags_channel_next_with_recycling ags_channel_get_link ags_channel_set_link ags_channel_reset_recycling ags_channel_recycling_changed ags_channel_set_output_soundcard ags_channel_set_input_soundcard ags_channel_set_samplerate ags_channel_set_buffer_size ags_channel_set_format ags_channel_add_pattern ags_channel_remove_pattern ags_channel_add_recall_id ags_channel_remove_recall_id ags_channel_add_recall_container ags_channel_remove_recall_container ags_channel_add_recall ags_channel_remove_recall ags_channel_add_effect ags_channel_remove_effect ags_channel_duplicate_recall ags_channel_resolve_recall ags_channel_init_recall ags_channel_play_recall ags_channel_done_recall ags_channel_cancel_recall ags_channel_cleanup_recall ags_channel_start ags_channel_stop ags_channel_check_scope ags_channel_collect_all_channel_ports ags_channel_collect_all_channel_ports_by_specifier_and_context ags_channel_get_level ags_channel_recursive_set_property ags_channel_recursive_run_stage ags_channel_new AGS_CHANNEL AGS_CHANNEL_CLASS AGS_CHANNEL_GET_CLASS AGS_IS_CHANNEL AGS_TYPE_CHANNEL AgsChannel AgsChannelClass ags_channel_get_type
ags_channel_thread AgsChannelThread AGS_CHANNEL_THREAD_DEFAULT_JIFFIE AgsChannelThreadFlags ags_channel_thread_test_status_flags ags_channel_thread_set_status_flags ags_channel_thread_unset_status_flags ags_channel_thread_set_sound_scope ags_channel_thread_new AGS_CHANNEL_THREAD AGS_CHANNEL_THREAD_CLASS AGS_CHANNEL_THREAD_GET_CLASS AGS_IS_CHANNEL_THREAD AGS_TYPE_CHANNEL_THREAD AgsChannelThread AgsChannelThreadClass ags_channel_thread_get_type
ags_char_buffer_util AgsCharBufferUtilCopyMode ags_char_buffer_util_copy_s8_to_cbuffer ags_char_buffer_util_copy_s16_to_cbuffer ags_char_buffer_util_copy_s24_to_cbuffer ags_char_buffer_util_copy_s32_to_cbuffer ags_char_buffer_util_copy_s64_to_cbuffer ags_char_buffer_util_copy_float_to_cbuffer ags_char_buffer_util_copy_double_to_cbuffer ags_char_buffer_util_copy_cbuffer_to_s8 ags_char_buffer_util_copy_cbuffer_to_s16 ags_char_buffer_util_copy_cbuffer_to_s24 ags_char_buffer_util_copy_cbuffer_to_s32 ags_char_buffer_util_copy_cbuffer_to_s64 ags_char_buffer_util_copy_cbuffer_to_float ags_char_buffer_util_copy_cbuffer_to_double ags_char_buffer_util_copy_buffer_to_buffer
ags_clear_audio_signal AgsClearAudioSignal ags_clear_audio_signal_new AGS_CLEAR_AUDIO_SIGNAL AGS_CLEAR_AUDIO_SIGNAL_CLASS AGS_CLEAR_AUDIO_SIGNAL_GET_CLASS AGS_IS_CLEAR_AUDIO_SIGNAL AGS_TYPE_CLEAR_AUDIO_SIGNAL AgsClearAudioSignal AgsClearAudioSignalClass ags_clear_audio_signal_get_type
ags_clear_buffer AgsClearBuffer ags_clear_buffer_new AGS_CLEAR_BUFFER AGS_CLEAR_BUFFER_CLASS AGS_CLEAR_BUFFER_GET_CLASS AGS_IS_CLEAR_BUFFER AGS_TYPE_CLEAR_BUFFER AgsClearBuffer AgsClearBufferClass ags_clear_buffer_get_type
ags_copy_audio_signal AgsCopyAudioSignal ags_copy_audio_signal_new AGS_COPY_AUDIO_SIGNAL AGS_COPY_AUDIO_SIGNAL_CLASS AGS_COPY_AUDIO_SIGNAL_GET_CLASS AGS_IS_COPY_AUDIO_SIGNAL AGS_TYPE_COPY_AUDIO_SIGNAL AgsCopyAudioSignal AgsCopyAudioSignalClass ags_copy_audio_signal_get_type
ags_copy_channel AgsCopyChannel ags_copy_channel_new AGS_COPY_CHANNEL AGS_COPY_CHANNEL_CLASS AGS_COPY_CHANNEL_GET_CLASS AGS_IS_COPY_CHANNEL AGS_TYPE_COPY_CHANNEL AgsCopyChannel AgsCopyChannelClass ags_copy_channel_get_type
ags_copy_channel_run AgsCopyChannelRun ags_copy_channel_run_new AGS_COPY_CHANNEL_RUN AGS_COPY_CHANNEL_RUN_CLASS AGS_COPY_CHANNEL_RUN_GET_CLASS AGS_IS_COPY_CHANNEL_RUN AGS_TYPE_COPY_CHANNEL_RUN AgsCopyChannelRun AgsCopyChannelRunClass ags_copy_channel_run_get_type
ags_copy_pattern_audio AgsCopyPatternAudio AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_0 AGS_COPY_PATTERN_AUDIO_MAX_BANK_INDEX_1 ags_copy_pattern_audio_new AGS_COPY_PATTERN_AUDIO AGS_COPY_PATTERN_AUDIO_CLASS AGS_COPY_PATTERN_AUDIO_GET_CLASS AGS_IS_COPY_PATTERN_AUDIO AGS_TYPE_COPY_PATTERN_AUDIO AgsCopyPatternAudio AgsCopyPatternAudioClass ags_copy_pattern_audio_get_type
ags_copy_pattern_audio_run AgsCopyPatternAudioRun ags_copy_pattern_audio_run_new AGS_COPY_PATTERN_AUDIO_RUN AGS_COPY_PATTERN_AUDIO_RUN_CLASS AGS_COPY_PATTERN_AUDIO_RUN_GET_CLASS AGS_IS_COPY_PATTERN_AUDIO_RUN AGS_TYPE_COPY_PATTERN_AUDIO_RUN AgsCopyPatternAudioRun AgsCopyPatternAudioRunClass ags_copy_pattern_audio_run_get_type
ags_copy_pattern_channel AgsCopyPatternChannel ags_copy_pattern_channel_new AGS_COPY_PATTERN_CHANNEL AGS_COPY_PATTERN_CHANNEL_CLASS AGS_COPY_PATTERN_CHANNEL_GET_CLASS AGS_IS_COPY_PATTERN_CHANNEL AGS_TYPE_COPY_PATTERN_CHANNEL AgsCopyPatternChannel AgsCopyPatternChannelClass ags_copy_pattern_channel_get_type
ags_copy_pattern_channel_run AgsCopyPatternChannelRun ags_copy_pattern_channel_run_new AGS_COPY_PATTERN_CHANNEL_RUN AGS_COPY_PATTERN_CHANNEL_RUN_CLASS AGS_COPY_PATTERN_CHANNEL_RUN_GET_CLASS AGS_IS_COPY_PATTERN_CHANNEL_RUN AGS_TYPE_COPY_PATTERN_CHANNEL_RUN AgsCopyPatternChannelRun AgsCopyPatternChannelRunClass ags_copy_pattern_channel_run_get_type
ags_copy_recycling AgsCopyRecycling ags_copy_recycling_new AGS_COPY_RECYCLING AGS_COPY_RECYCLING_CLASS AGS_COPY_RECYCLING_GET_CLASS AGS_IS_COPY_RECYCLING AGS_TYPE_COPY_RECYCLING AgsCopyRecycling AgsCopyRecyclingClass ags_copy_recycling_get_type
ags_core_audio_client AgsCoreAudioClient AGS_CORE_AUDIO_CLIENT_GET_OBJ_MUTEX AgsCoreAudioClientFlags ags_core_audio_client_test_flags ags_core_audio_client_set_flags ags_core_audio_client_unset_flags ags_core_audio_client_find_uuid ags_core_audio_client_find ags_core_audio_client_open ags_core_audio_client_add_device ags_core_audio_client_remove_device ags_core_audio_client_add_port ags_core_audio_client_remove_port ags_core_audio_client_activate ags_core_audio_client_deactivate ags_core_audio_client_new AGS_CORE_AUDIO_CLIENT AGS_CORE_AUDIO_CLIENT_CLASS AGS_CORE_AUDIO_CLIENT_GET_CLASS AGS_IS_CORE_AUDIO_CLIENT AGS_TYPE_CORE_AUDIO_CLIENT AgsCoreAudioClient AgsCoreAudioClientClass ags_core_audio_client_get_type
ags_core_audio_devin AgsCoreAudioDevin AGS_CORE_AUDIO_DEVIN_GET_OBJ_MUTEX AgsCoreAudioDevinFlags AgsCoreAudioDevinSyncFlags AGS_CORE_AUDIO_DEVIN_ERROR AgsCoreAudioDevinError ags_core_audio_devin_error_quark ags_core_audio_devin_test_flags ags_core_audio_devin_set_flags ags_core_audio_devin_unset_flags ags_core_audio_devin_switch_buffer_flag ags_core_audio_devin_adjust_delay_and_attack ags_core_audio_devin_realloc_buffer ags_core_audio_devin_new AGS_CORE_AUDIO_DEVIN AGS_CORE_AUDIO_DEVIN_CLASS AGS_CORE_AUDIO_DEVIN_GET_CLASS AGS_IS_CORE_AUDIO_DEVIN AGS_TYPE_CORE_AUDIO_DEVIN AgsCoreAudioDevin AgsCoreAudioDevinClass ags_core_audio_devin_get_type
ags_core_audio_devout AgsCoreAudioDevout AGS_CORE_AUDIO_DEVOUT_GET_OBJ_MUTEX AgsCoreAudioDevoutFlags AgsCoreAudioDevoutSyncFlags AGS_CORE_AUDIO_DEVOUT_ERROR AgsCoreAudioDevoutError ags_core_audio_devout_error_quark ags_core_audio_devout_test_flags ags_core_audio_devout_set_flags ags_core_audio_devout_unset_flags ags_core_audio_devout_switch_buffer_flag ags_core_audio_devout_adjust_delay_and_attack ags_core_audio_devout_realloc_buffer ags_core_audio_devout_new AGS_CORE_AUDIO_DEVOUT AGS_CORE_AUDIO_DEVOUT_CLASS AGS_CORE_AUDIO_DEVOUT_GET_CLASS AGS_IS_CORE_AUDIO_DEVOUT AGS_TYPE_CORE_AUDIO_DEVOUT AgsCoreAudioDevout AgsCoreAudioDevoutClass ags_core_audio_devout_get_type
ags_core_audio_midiin AgsCoreAudioMidiin AGS_CORE_AUDIO_MIDIIN_GET_OBJ_MUTEX AGS_CORE_AUDIO_MIDIIN_DEFAULT_BUFFER_SIZE AgsCoreAudioMidiinFlags AgsCoreAudioMidiinSyncFlags AGS_CORE_AUDIO_MIDIIN_ERROR AgsCoreAudioMidiinError ags_core_audio_midiin_error_quark ags_core_audio_midiin_test_flags ags_core_audio_midiin_set_flags ags_core_audio_midiin_unset_flags ags_core_audio_midiin_switch_buffer_flag ags_core_audio_midiin_new AGS_CORE_AUDIO_MIDIIN AGS_CORE_AUDIO_MIDIIN_CLASS AGS_CORE_AUDIO_MIDIIN_GET_CLASS AGS_IS_CORE_AUDIO_MIDIIN AGS_TYPE_CORE_AUDIO_MIDIIN AgsCoreAudioMidiin AgsCoreAudioMidiinClass ags_core_audio_midiin_get_type
ags_core_audio_port AgsCoreAudioPort AGS_CORE_AUDIO_PORT_GET_OBJ_MUTEX AGS_CORE_AUDIO_PORT_DEFAULT_CACHE_BUFFER_SIZE AgsCoreAudioPortFlags ags_core_audio_port_test_flags ags_core_audio_port_set_flags ags_core_audio_port_unset_flags ags_core_audio_port_find ags_core_audio_port_register ags_core_audio_port_unregister ags_core_audio_port_set_format ags_core_audio_port_set_samplerate ags_core_audio_port_set_pcm_channels ags_core_audio_port_set_buffer_size ags_core_audio_port_set_cache_buffer_size ags_core_audio_port_get_latency ags_core_audio_port_new AGS_CORE_AUDIO_PORT AGS_CORE_AUDIO_PORT_CLASS AGS_CORE_AUDIO_PORT_GET_CLASS AGS_IS_CORE_AUDIO_PORT AGS_TYPE_CORE_AUDIO_PORT AgsCoreAudioPort AgsCoreAudioPortClass ags_core_audio_port_get_type
ags_core_audio_server AgsCoreAudioServer AGS_CORE_AUDIO_SERVER_GET_OBJ_MUTEX AgsCoreAudioServerFlags ags_core_audio_server_test_flags ags_core_audio_server_set_flags ags_core_audio_server_unset_flags ags_core_audio_server_find_url ags_core_audio_server_find_client ags_core_audio_server_find_port ags_core_audio_server_add_client ags_core_audio_server_remove_client ags_core_audio_server_connect_client ags_core_audio_server_start_poll ags_core_audio_server_new AGS_CORE_AUDIO_SERVER AGS_CORE_AUDIO_SERVER_CLASS AGS_CORE_AUDIO_SERVER_GET_CLASS AGS_IS_CORE_AUDIO_SERVER AGS_TYPE_CORE_AUDIO_SERVER AgsCoreAudioServer AgsCoreAudioServerClass ags_core_audio_server_get_type
ags_count_beats_audio AgsCountBeatsAudio ags_count_beats_audio_new AGS_COUNT_BEATS_AUDIO AGS_COUNT_BEATS_AUDIO_CLASS AGS_COUNT_BEATS_AUDIO_GET_CLASS AGS_IS_COUNT_BEATS_AUDIO AGS_TYPE_COUNT_BEATS_AUDIO AgsCountBeatsAudio AgsCountBeatsAudioClass ags_count_beats_audio_get_type
ags_count_beats_audio_run AgsCountBeatsAudioRun ags_count_beats_audio_run_sequencer_start ags_count_beats_audio_run_sequencer_loop ags_count_beats_audio_run_sequencer_stop ags_count_beats_audio_run_notation_start ags_count_beats_audio_run_notation_loop ags_count_beats_audio_run_notation_stop ags_count_beats_audio_run_wave_start ags_count_beats_audio_run_wave_loop ags_count_beats_audio_run_wave_stop ags_count_beats_audio_run_midi_start ags_count_beats_audio_run_midi_loop ags_count_beats_audio_run_midi_stop ags_count_beats_audio_run_new AGS_COUNT_BEATS_AUDIO_RUN AGS_COUNT_BEATS_AUDIO_RUN_CLASS AGS_COUNT_BEATS_AUDIO_RUN_GET_CLASS AGS_IS_COUNT_BEATS_AUDIO_RUN AGS_TYPE_COUNT_BEATS_AUDIO_RUN AgsCountBeatsAudioRun AgsCountBeatsAudioRunClass ags_count_beats_audio_run_get_type
ags_crop_note AgsCropNote AGS_CROP_NOTE_DEFAULT_X_LENGTH ags_crop_note_new AGS_CROP_NOTE AGS_CROP_NOTE_CLASS AGS_CROP_NOTE_GET_CLASS AGS_IS_CROP_NOTE AGS_TYPE_CROP_NOTE AgsCropNote AgsCropNoteClass ags_crop_note_get_type
ags_delay_audio AgsDelayAudio ags_delay_audio_sequencer_duration_changed ags_delay_audio_notation_duration_changed ags_delay_audio_wave_duration_changed ags_delay_audio_midi_duration_changed ags_delay_audio_new AGS_DELAY_AUDIO AGS_DELAY_AUDIO_CLASS AGS_DELAY_AUDIO_GET_CLASS AGS_IS_DELAY_AUDIO AGS_TYPE_DELAY_AUDIO AgsDelayAudio AgsDelayAudioClass ags_delay_audio_get_type
ags_delay_audio_run AgsDelayAudioRun ags_delay_audio_run_sequencer_alloc_output ags_delay_audio_run_sequencer_alloc_input ags_delay_audio_run_sequencer_count ags_delay_audio_run_notation_alloc_output ags_delay_audio_run_notation_alloc_input ags_delay_audio_run_notation_count ags_delay_audio_run_wave_alloc_output ags_delay_audio_run_wave_alloc_input ags_delay_audio_run_wave_count ags_delay_audio_run_midi_alloc_output ags_delay_audio_run_midi_alloc_input ags_delay_audio_run_midi_count ags_delay_audio_run_new AGS_DELAY_AUDIO_RUN AGS_DELAY_AUDIO_RUN_CLASS AGS_DELAY_AUDIO_RUN_GET_CLASS AGS_IS_DELAY_AUDIO_RUN AGS_TYPE_DELAY_AUDIO_RUN AgsDelayAudioRun AgsDelayAudioRunClass ags_delay_audio_run_get_type
ags_devin AgsDevin AGS_DEVIN_GET_OBJ_MUTEX AGS_DEVIN_DEFAULT_ALSA_DEVICE AGS_DEVIN_DEFAULT_OSS_DEVICE AGS_DEVIN_DEFAULT_RING_BUFFER_SIZE AgsDevinFlags AGS_DEVIN_ERROR AgsDevinError ags_devin_error_quark ags_devin_test_flags ags_devin_set_flags ags_devin_unset_flags ags_devin_switch_buffer_flag ags_devin_adjust_delay_and_attack ags_devin_realloc_buffer ags_devin_new AGS_DEVIN AGS_DEVIN_CLASS AGS_DEVIN_GET_CLASS AGS_IS_DEVIN AGS_TYPE_DEVIN AgsDevin AgsDevinClass ags_devin_get_type
ags_devout AgsDevout AGS_DEVOUT_GET_OBJ_MUTEX AGS_DEVOUT_DEFAULT_ALSA_DEVICE AGS_DEVOUT_DEFAULT_OSS_DEVICE AGS_DEVOUT_DEFAULT_RING_BUFFER_SIZE AgsDevoutFlags AGS_DEVOUT_ERROR AgsDevoutError ags_devout_error_quark ags_devout_test_flags ags_devout_set_flags ags_devout_unset_flags ags_devout_switch_buffer_flag ags_devout_adjust_delay_and_attack ags_devout_realloc_buffer ags_devout_new AGS_DEVOUT AGS_DEVOUT_CLASS AGS_DEVOUT_GET_CLASS AGS_IS_DEVOUT AGS_TYPE_DEVOUT AgsDevout AgsDevoutClass ags_devout_get_type
ags_diatonic_scale ags_diatonic_scale_note_to_midi_key ags_diatonic_scale_midi_key_to_note
ags_dssi_manager AgsDssiManager AGS_DSSI_MANAGER_GET_OBJ_MUTEX ags_dssi_manager_get_default_path ags_dssi_manager_set_default_path ags_dssi_manager_get_filenames ags_dssi_manager_find_dssi_plugin ags_dssi_manager_load_blacklist ags_dssi_manager_load_file ags_dssi_manager_load_default_directory ags_dssi_manager_get_instance ags_dssi_manager_new AGS_DSSI_MANAGER AGS_DSSI_MANAGER_CLASS AGS_DSSI_MANAGER_GET_CLASS AGS_IS_DSSI_MANAGER AGS_TYPE_DSSI_MANAGER AgsDssiManager AgsDssiManagerClass ags_dssi_manager_get_type
ags_dssi_plugin AgsDssiPlugin AGS_DSSI_PLUGIN_DESCRIPTOR ags_dssi_plugin_change_program ags_dssi_plugin_new AGS_DSSI_PLUGIN AGS_DSSI_PLUGIN_CLASS AGS_DSSI_PLUGIN_GET_CLASS AGS_IS_DSSI_PLUGIN AGS_TYPE_DSSI_PLUGIN AgsDssiPlugin AgsDssiPluginClass ags_dssi_plugin_get_type
ags_envelope_audio_signal AgsEnvelopeAudioSignal ags_envelope_audio_signal_new AGS_ENVELOPE_AUDIO_SIGNAL AGS_ENVELOPE_AUDIO_SIGNAL_CLASS AGS_ENVELOPE_AUDIO_SIGNAL_GET_CLASS AGS_IS_ENVELOPE_AUDIO_SIGNAL AGS_TYPE_ENVELOPE_AUDIO_SIGNAL AgsEnvelopeAudioSignal AgsEnvelopeAudioSignalClass ags_envelope_audio_signal_get_type
ags_envelope_channel AgsEnvelopeChannel ags_envelope_channel_new AGS_ENVELOPE_CHANNEL AGS_ENVELOPE_CHANNEL_CLASS AGS_ENVELOPE_CHANNEL_GET_CLASS AGS_IS_ENVELOPE_CHANNEL AGS_TYPE_ENVELOPE_CHANNEL AgsEnvelopeChannel AgsEnvelopeChannelClass ags_envelope_channel_get_type
ags_envelope_channel_run AgsEnvelopeChannelRun ags_envelope_channel_run_new AGS_ENVELOPE_CHANNEL_RUN AGS_ENVELOPE_CHANNEL_RUN_CLASS AGS_ENVELOPE_CHANNEL_RUN_GET_CLASS AGS_IS_ENVELOPE_CHANNEL_RUN AGS_TYPE_ENVELOPE_CHANNEL_RUN AgsEnvelopeChannelRun AgsEnvelopeChannelRunClass ags_envelope_channel_run_get_type
ags_envelope_recycling AgsEnvelopeRecycling ags_envelope_recycling_new AGS_ENVELOPE_RECYCLING AGS_ENVELOPE_RECYCLING_CLASS AGS_ENVELOPE_RECYCLING_GET_CLASS AGS_IS_ENVELOPE_RECYCLING AGS_TYPE_ENVELOPE_RECYCLING AgsEnvelopeRecycling AgsEnvelopeRecyclingClass ags_envelope_recycling_get_type
ags_eq10_audio_signal AgsEq10AudioSignal AGS_EQ10_AUDIO_SIGNAL_CACHE_SIZE ags_eq10_audio_signal_new AGS_EQ10_AUDIO_SIGNAL AGS_EQ10_AUDIO_SIGNAL_CLASS AGS_EQ10_AUDIO_SIGNAL_GET_CLASS AGS_IS_EQ10_AUDIO_SIGNAL AGS_TYPE_EQ10_AUDIO_SIGNAL AgsEq10AudioSignal AgsEq10AudioSignalClass ags_eq10_audio_signal_get_type
ags_eq10_channel AgsEq10Channel ags_eq10_channel_new AGS_EQ10_CHANNEL AGS_EQ10_CHANNEL_CLASS AGS_EQ10_CHANNEL_GET_CLASS AGS_IS_EQ10_CHANNEL AGS_TYPE_EQ10_CHANNEL AgsEq10Channel AgsEq10ChannelClass ags_eq10_channel_get_type
ags_eq10_channel_run AgsEq10ChannelRun ags_eq10_channel_run_new AGS_EQ10_CHANNEL_RUN AGS_EQ10_CHANNEL_RUN_CLASS AGS_EQ10_CHANNEL_RUN_GET_CLASS AGS_IS_EQ10_CHANNEL_RUN AGS_TYPE_EQ10_CHANNEL_RUN AgsEq10ChannelRun AgsEq10ChannelRunClass ags_eq10_channel_run_get_type
ags_eq10_recycling AgsEq10Recycling ags_eq10_recycling_new AGS_EQ10_RECYCLING AGS_EQ10_RECYCLING_CLASS AGS_EQ10_RECYCLING_GET_CLASS AGS_IS_EQ10_RECYCLING AGS_TYPE_EQ10_RECYCLING AgsEq10Recycling AgsEq10RecyclingClass ags_eq10_recycling_get_type
ags_export_output AgsExportOutput AgsExportOutputFormat ags_export_output_new AGS_EXPORT_OUTPUT AGS_EXPORT_OUTPUT_CLASS AGS_EXPORT_OUTPUT_GET_CLASS AGS_IS_EXPORT_OUTPUT AGS_TYPE_EXPORT_OUTPUT AgsExportOutput AgsExportOutputClass ags_export_output_get_type
ags_export_thread AgsExportThread AGS_EXPORT_THREAD_DEFAULT_JIFFIE AgsExportThreadFlags ags_export_thread_find_soundcard ags_export_thread_new AGS_EXPORT_THREAD AGS_EXPORT_THREAD_CLASS AGS_EXPORT_THREAD_GET_CLASS AGS_IS_EXPORT_THREAD AGS_TYPE_EXPORT_THREAD AgsExportThread AgsExportThreadClass ags_export_thread_get_type
ags_feed_audio_signal AgsFeedAudioSignal ags_feed_audio_signal_new AGS_FEED_AUDIO_SIGNAL AGS_FEED_AUDIO_SIGNAL_CLASS AGS_FEED_AUDIO_SIGNAL_GET_CLASS AGS_IS_FEED_AUDIO_SIGNAL AGS_TYPE_FEED_AUDIO_SIGNAL AgsFeedAudioSignal AgsFeedAudioSignalClass ags_feed_audio_signal_get_type
ags_feed_channel AgsFeedChannel ags_feed_channel_new AGS_FEED_CHANNEL AGS_FEED_CHANNEL_CLASS AGS_FEED_CHANNEL_GET_CLASS AGS_IS_FEED_CHANNEL AGS_TYPE_FEED_CHANNEL AgsFeedChannel AgsFeedChannelClass ags_feed_channel_get_type
ags_feed_channel_run AgsFeedChannelRun ags_feed_channel_run_new AGS_FEED_CHANNEL_RUN AGS_FEED_CHANNEL_RUN_CLASS AGS_FEED_CHANNEL_RUN_GET_CLASS AGS_IS_FEED_CHANNEL_RUN AGS_TYPE_FEED_CHANNEL_RUN AgsFeedChannelRun AgsFeedChannelRunClass ags_feed_channel_run_get_type
ags_feed_recycling AgsFeedRecycling ags_feed_recycling_new AGS_FEED_RECYCLING AGS_FEED_RECYCLING_CLASS AGS_FEED_RECYCLING_GET_CLASS AGS_IS_FEED_RECYCLING AGS_TYPE_FEED_RECYCLING AgsFeedRecycling AgsFeedRecyclingClass ags_feed_recycling_get_type
ags_fifoout AgsFifoout AGS_FIFOOUT_GET_OBJ_MUTEX AGS_FIFOOUT_DEFAULT_DEVICE AGS_FIFOOUT_DEFAULT_RING_BUFFER_SIZE AgsFifooutFlags AGS_FIFOOUT_ERROR AgsFifooutError ags_fifoout_error_quark ags_fifoout_test_flags ags_fifoout_set_flags ags_fifoout_unset_flags ags_fifoout_switch_buffer_flag ags_fifoout_adjust_delay_and_attack ags_fifoout_realloc_buffer ags_fifoout_new AGS_FIFOOUT AGS_FIFOOUT_CLASS AGS_FIFOOUT_GET_CLASS AGS_IS_FIFOOUT AGS_TYPE_FIFOOUT AgsFifoout AgsFifooutClass ags_fifoout_get_type
ags_filter_util AGS_FILTER_UTIL_DEFAULT_TMP_BUFFER_SIZE ags_filter_util_pitch_s8 ags_filter_util_pitch_s16 ags_filter_util_pitch_s24 ags_filter_util_pitch_s32 ags_filter_util_pitch_s64 ags_filter_util_pitch_float ags_filter_util_pitch_double ags_filter_util_pitch_complex
ags_fm_synth_util ags_fm_synth_util_sin_s8 ags_fm_synth_util_sin_s16 ags_fm_synth_util_sin_s24 ags_fm_synth_util_sin_s32 ags_fm_synth_util_sin_s64 ags_fm_synth_util_sin_float ags_fm_synth_util_sin_double ags_fm_synth_util_sin_complex ags_fm_synth_util_sawtooth_s8 ags_fm_synth_util_sawtooth_s16 ags_fm_synth_util_sawtooth_s24 ags_fm_synth_util_sawtooth_s32 ags_fm_synth_util_sawtooth_s64 ags_fm_synth_util_sawtooth_float ags_fm_synth_util_sawtooth_double ags_fm_synth_util_sawtooth_complex ags_fm_synth_util_triangle_s8 ags_fm_synth_util_triangle_s16 ags_fm_synth_util_triangle_s24 ags_fm_synth_util_triangle_s32 ags_fm_synth_util_triangle_s64 ags_fm_synth_util_triangle_float ags_fm_synth_util_triangle_double ags_fm_synth_util_triangle_complex ags_fm_synth_util_square_s8 ags_fm_synth_util_square_s16 ags_fm_synth_util_square_s24 ags_fm_synth_util_square_s32 ags_fm_synth_util_square_s64 ags_fm_synth_util_square_float ags_fm_synth_util_square_double ags_fm_synth_util_square_complex ags_fm_synth_util_impulse_s8 ags_fm_synth_util_impulse_s16 ags_fm_synth_util_impulse_s24 ags_fm_synth_util_impulse_s32 ags_fm_synth_util_impulse_s64 ags_fm_synth_util_impulse_float ags_fm_synth_util_impulse_double ags_fm_synth_util_impulse_complex ags_fm_synth_util_sin ags_fm_synth_util_sawtooth ags_fm_synth_util_triangle ags_fm_synth_util_square ags_fm_synth_util_impulse
ags_fourier_transform_util AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S8_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S16_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S24_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S32_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_S64_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_FLOAT_FRAME AGS_FOURIER_TRANSFORM_UTIL_COMPUTE_STFT_DOUBLE_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S8_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S16_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S24_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S32_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_S64_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_FLOAT_FRAME AGS_FOURIER_TRANSFORM_UTIL_INVERSE_STFT_DOUBLE_FRAME AGS_FOURIER_TRANSFORM_UTIL_ANALYSIS_WINDOW ags_fourier_transform_util_compute_stft_s8 ags_fourier_transform_util_compute_stft_s16 ags_fourier_transform_util_compute_stft_s24 ags_fourier_transform_util_compute_stft_s32 ags_fourier_transform_util_compute_stft_s64 ags_fourier_transform_util_compute_stft_float ags_fourier_transform_util_compute_stft_double ags_fourier_transform_util_inverse_stft_s8 ags_fourier_transform_util_inverse_stft_s16 ags_fourier_transform_util_inverse_stft_s24 ags_fourier_transform_util_inverse_stft_s32 ags_fourier_transform_util_inverse_stft_s64 ags_fourier_transform_util_inverse_stft_float ags_fourier_transform_util_inverse_stft_double
ags_free_selection AgsFreeSelection ags_free_selection_new AGS_FREE_SELECTION AGS_FREE_SELECTION_CLASS AGS_FREE_SELECTION_GET_CLASS AGS_IS_FREE_SELECTION AGS_TYPE_FREE_SELECTION AgsFreeSelection AgsFreeSelectionClass ags_free_selection_get_type
ags_frequency_map AgsFrequencyMap AGS_FREQUENCY_MAP_GET_OBJ_MUTEX AGS_FREQUENCY_MAP_DEFAULT_FREQ AgsFrequencyMapFlags ags_frequency_map_sort_func ags_frequency_map_test_flags ags_frequency_map_set_flags ags_frequency_map_unset_flags ags_frequency_map_process ags_frequency_map_factorize ags_frequency_map_compute_max_likelihood ags_frequency_map_new AGS_FREQUENCY_MAP AGS_FREQUENCY_MAP_CLASS AGS_FREQUENCY_MAP_GET_CLASS AGS_IS_FREQUENCY_MAP AGS_TYPE_FREQUENCY_MAP AgsFrequencyMap AgsFrequencyMapClass ags_frequency_map_get_type
ags_frequency_map_manager AgsFrequencyMapManager AGS_FREQUENCY_MAP_MANAGER_GET_OBJ_MUTEX AGS_FREQUENCY_MAP_MANAGER_EQUINOX AgsFrequencyMapManagerFlags ags_frequency_map_manager_test_flags ags_frequency_map_manager_set_flags ags_frequency_map_manager_unset_flags ags_frequency_map_manager_add_frequency_map ags_frequency_map_manager_add_factorized_frequency_map ags_frequency_map_manager_find_frequency_map ags_frequency_map_manager_find_factorized_frequency_map ags_frequency_map_manager_load_default ags_frequency_map_manager_get_instance ags_frequency_map_manager_new AGS_FREQUENCY_MAP_MANAGER AGS_FREQUENCY_MAP_MANAGER_CLASS AGS_FREQUENCY_MAP_MANAGER_GET_CLASS AGS_IS_FREQUENCY_MAP_MANAGER AGS_TYPE_FREQUENCY_MAP_MANAGER AgsFrequencyMapManager AgsFrequencyMapManagerClass ags_frequency_map_manager_get_type
ags_generic_recall_channel_run AgsGenericRecallChannelRun ags_generic_recall_channel_run_new AGS_GENERIC_RECALL_CHANNEL_RUN AGS_GENERIC_RECALL_CHANNEL_RUN_CLASS AGS_GENERIC_RECALL_CHANNEL_RUN_GET_CLASS AGS_IS_GENERIC_RECALL_CHANNEL_RUN AGS_TYPE_GENERIC_RECALL_CHANNEL_RUN AgsGenericRecallChannelRun AgsGenericRecallChannelRunClass ags_generic_recall_channel_run_get_type
ags_generic_recall_recycling AgsGenericRecallRecycling ags_generic_recall_recycling_new AGS_GENERIC_RECALL_RECYCLING AGS_GENERIC_RECALL_RECYCLING_CLASS AGS_GENERIC_RECALL_RECYCLING_GET_CLASS AGS_IS_GENERIC_RECALL_RECYCLING AGS_TYPE_GENERIC_RECALL_RECYCLING AgsGenericRecallRecycling AgsGenericRecallRecyclingClass ags_generic_recall_recycling_get_type
ags_input AgsInput AGS_INPUT_SYNTH_BASE_NOTE ags_input_is_active ags_input_next_active ags_input_add_synth_generator ags_input_remove_synth_generator ags_input_open_file ags_input_new AGS_INPUT AGS_INPUT_CLASS AGS_INPUT_GET_CLASS AGS_IS_INPUT AGS_TYPE_INPUT AgsInput AgsInputClass ags_input_get_type
ags_ipatch AgsIpatch AGS_IPATCH_GET_OBJ_MUTEX AGS_IPATCH_DEFAULT_CHANNELS AGS_IPATCH_READ AGS_IPATCH_WRITE AgsIpatchFlags ags_ipatch_test_flags ags_ipatch_set_flags ags_ipatch_unset_flags ags_ipatch_check_suffix ags_ipatch_new AGS_IPATCH AGS_IPATCH_CLASS AGS_IPATCH_GET_CLASS AGS_IS_IPATCH AGS_TYPE_IPATCH AgsIpatch AgsIpatchClass ags_ipatch_get_type
ags_ipatch_dls2_reader AgsIpatchDLS2Reader AGS_IPATCH_DLS2_READER_GET_OBJ_MUTEX AgsIpatchDLS2ReaderFlags AgsDLS2Level ags_ipatch_dls2_reader_test_flags ags_ipatch_dls2_reader_set_flags ags_ipatch_dls2_reader_unset_flags ags_ipatch_dls2_reader_load ags_ipatch_dls2_reader_select_instrument ags_ipatch_dls2_reader_select_sample ags_ipatch_dls2_reader_get_instrument_all ags_ipatch_dls2_reader_get_sample_all ags_ipatch_dls2_reader_get_sample_by_instrument_index ags_ipatch_dls2_reader_new AGS_IPATCH_DLS2_READER AGS_IPATCH_DLS2_READER_CLASS AGS_IPATCH_DLS2_READER_GET_CLASS AGS_IS_IPATCH_DLS2_READER AGS_TYPE_IPATCH_DLS2_READER AgsIpatchDLS2Reader AgsIpatchDLS2ReaderClass ags_ipatch_dls2_reader_get_type
ags_ipatch_gig_reader AgsIpatchGigReader AGS_IPATCH_GIG_READER_GET_OBJ_MUTEX AgsIpatchGigReaderFlags AgsGigLevel ags_ipatch_gig_reader_test_flags ags_ipatch_gig_reader_set_flags ags_ipatch_gig_reader_unset_flags ags_ipatch_gig_reader_load ags_ipatch_gig_reader_select_instrument ags_ipatch_gig_reader_select_sample ags_ipatch_gig_reader_get_instrument_all ags_ipatch_gig_reader_get_sample_all ags_ipatch_gig_reader_get_sample_by_instrument_index ags_ipatch_gig_reader_new AGS_IPATCH_GIG_READER AGS_IPATCH_GIG_READER_CLASS AGS_IPATCH_GIG_READER_GET_CLASS AGS_IS_IPATCH_GIG_READER AGS_TYPE_IPATCH_GIG_READER AgsIpatchGigReader AgsIpatchGigReaderClass ags_ipatch_gig_reader_get_type
ags_ipatch_sample AgsIpatchSample AGS_IPATCH_SAMPLE_GET_OBJ_MUTEX AgsIpatchSampleFlags ags_ipatch_sample_test_flags ags_ipatch_sample_set_flags ags_ipatch_sample_unset_flags ags_ipatch_sample_new AGS_IPATCH_SAMPLE AGS_IPATCH_SAMPLE_CLASS AGS_IPATCH_SAMPLE_GET_CLASS AGS_IS_IPATCH_SAMPLE AGS_TYPE_IPATCH_SAMPLE AgsIpatchSample AgsIpatchSampleClass ags_ipatch_sample_get_type
ags_ipatch_sf2_reader AgsIpatchSF2Reader AGS_IPATCH_SF2_READER_GET_OBJ_MUTEX AgsIpatchSF2ReaderFlags AgsSF2Level ags_ipatch_sf2_reader_test_flags ags_ipatch_sf2_reader_set_flags ags_ipatch_sf2_reader_unset_flags ags_ipatch_sf2_reader_load ags_ipatch_sf2_reader_select_preset ags_ipatch_sf2_reader_select_instrument ags_ipatch_sf2_reader_select_sample ags_ipatch_sf2_reader_get_preset_all ags_ipatch_sf2_reader_get_instrument_all ags_ipatch_sf2_reader_get_sample_all ags_ipatch_sf2_reader_get_instrument_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_index ags_ipatch_sf2_reader_get_sample_by_preset_and_instrument_index ags_ipatch_sf2_reader_new AGS_IPATCH_SF2_READER AGS_IPATCH_SF2_READER_CLASS AGS_IPATCH_SF2_READER_GET_CLASS AGS_IS_IPATCH_SF2_READER AGS_TYPE_IPATCH_SF2_READER AgsIpatchSF2Reader AgsIpatchSF2ReaderClass ags_ipatch_sf2_reader_get_type
ags_jack_client AgsJackClient AGS_JACK_CLIENT_GET_OBJ_MUTEX AgsJackClientFlags ags_jack_client_test_flags ags_jack_client_set_flags ags_jack_client_unset_flags ags_jack_client_find_uuid ags_jack_client_find ags_jack_client_open ags_jack_client_close ags_jack_client_add_device ags_jack_client_remove_device ags_jack_client_add_port ags_jack_client_remove_port ags_jack_client_activate ags_jack_client_deactivate ags_jack_client_new AGS_IS_JACK_CLIENT AGS_JACK_CLIENT AGS_JACK_CLIENT_CLASS AGS_JACK_CLIENT_GET_CLASS AGS_TYPE_JACK_CLIENT AgsJackClient AgsJackClientClass ags_jack_client_get_type
ags_jack_devin AgsJackDevin AGS_JACK_DEVIN_GET_OBJ_MUTEX AgsJackDevinFlags AgsJackDevinSyncFlags AGS_JACK_DEVIN_ERROR AgsJackDevinError ags_jack_devin_error_quark ags_jack_devin_test_flags ags_jack_devin_set_flags ags_jack_devin_unset_flags ags_jack_devin_switch_buffer_flag ags_jack_devin_adjust_delay_and_attack ags_jack_devin_realloc_buffer ags_jack_devin_new AGS_IS_JACK_DEVIN AGS_JACK_DEVIN AGS_JACK_DEVIN_CLASS AGS_JACK_DEVIN_GET_CLASS AGS_TYPE_JACK_DEVIN AgsJackDevin AgsJackDevinClass ags_jack_devin_get_type
ags_jack_devout AgsJackDevout AGS_JACK_DEVOUT_GET_OBJ_MUTEX AgsJackDevoutFlags AgsJackDevoutSyncFlags AGS_JACK_DEVOUT_ERROR AgsJackDevoutError ags_jack_devout_error_quark ags_jack_devout_test_flags ags_jack_devout_set_flags ags_jack_devout_unset_flags ags_jack_devout_switch_buffer_flag ags_jack_devout_adjust_delay_and_attack ags_jack_devout_realloc_buffer ags_jack_devout_new AGS_IS_JACK_DEVOUT AGS_JACK_DEVOUT AGS_JACK_DEVOUT_CLASS AGS_JACK_DEVOUT_GET_CLASS AGS_TYPE_JACK_DEVOUT AgsJackDevout AgsJackDevoutClass ags_jack_devout_get_type
ags_jack_midiin AgsJackMidiin AGS_JACK_MIDIIN_GET_OBJ_MUTEX AGS_JACK_MIDIIN_DEFAULT_BUFFER_SIZE AgsJackMidiinFlags AgsJackMidiinSyncFlags AGS_JACK_MIDIIN_ERROR AgsJackMidiinError ags_jack_midiin_error_quark ags_jack_midiin_test_flags ags_jack_midiin_set_flags ags_jack_midiin_unset_flags ags_jack_midiin_switch_buffer_flag ags_jack_midiin_new AGS_IS_JACK_MIDIIN AGS_JACK_MIDIIN AGS_JACK_MIDIIN_CLASS AGS_JACK_MIDIIN_GET_CLASS AGS_TYPE_JACK_MIDIIN AgsJackMidiin AgsJackMidiinClass ags_jack_midiin_get_type
ags_jack_port AgsJackPort AGS_JACK_PORT_GET_OBJ_MUTEX AgsJackPortFlags ags_jack_port_test_flags ags_jack_port_set_flags ags_jack_port_unset_flags ags_jack_port_find ags_jack_port_register ags_jack_port_unregister ags_jack_port_new AGS_IS_JACK_PORT AGS_JACK_PORT AGS_JACK_PORT_CLASS AGS_JACK_PORT_GET_CLASS AGS_TYPE_JACK_PORT AgsJackPort AgsJackPortClass ags_jack_port_get_type
ags_jack_server AgsJackServer AGS_JACK_SERVER_GET_OBJ_MUTEX AGS_JACK_SERVER_DEFAULT_PROTOCOL AGS_JACK_SERVER_DEFAULT_HOST AGS_JACK_SERVER_DEFAULT_PORT AgsJackServerFlags ags_jack_server_test_flags ags_jack_server_set_flags ags_jack_server_unset_flags ags_jack_server_find_url ags_jack_server_find_client ags_jack_server_find_port ags_jack_server_add_client ags_jack_server_remove_client ags_jack_server_connect_client ags_jack_server_disconnect_client ags_jack_server_new AGS_IS_JACK_SERVER AGS_JACK_SERVER AGS_JACK_SERVER_CLASS AGS_JACK_SERVER_GET_CLASS AGS_TYPE_JACK_SERVER AgsJackServer AgsJackServerClass ags_jack_server_get_type
ags_ladspa_conversion AgsLadspaConversion AGS_LADSPA_CONVERSION_DEFAULT_LOWER AGS_LADSPA_CONVERSION_DEFAULT_UPPER AGS_LADSPA_CONVERSION_DEFAULT_STEP_COUNT AgsLadspaConversionFlags ags_ladspa_conversion_test_flags ags_ladspa_conversion_set_flags ags_ladspa_conversion_unset_flags ags_ladspa_conversion_new AGS_IS_LADSPA_CONVERSION AGS_LADSPA_CONVERSION AGS_LADSPA_CONVERSION_CLASS AGS_LADSPA_CONVERSION_GET_CLASS AGS_TYPE_LADSPA_CONVERSION AgsLadspaConversion AgsLadspaConversionClass ags_ladspa_conversion_get_type
ags_ladspa_manager AgsLadspaManager AGS_LADSPA_MANAGER_GET_OBJ_MUTEX ags_ladspa_manager_get_default_path ags_ladspa_manager_set_default_path ags_ladspa_manager_get_filenames ags_ladspa_manager_find_ladspa_plugin ags_ladspa_manager_load_blacklist ags_ladspa_manager_load_file ags_ladspa_manager_load_default_directory ags_ladspa_manager_get_instance ags_ladspa_manager_new AGS_IS_LADSPA_MANAGER AGS_LADSPA_MANAGER AGS_LADSPA_MANAGER_CLASS AGS_LADSPA_MANAGER_GET_CLASS AGS_TYPE_LADSPA_MANAGER AgsLadspaManager AgsLadspaManagerClass ags_ladspa_manager_get_type
ags_ladspa_plugin AgsLadspaPlugin AGS_LADSPA_PLUGIN_DESCRIPTOR ags_ladspa_plugin_new AGS_IS_LADSPA_PLUGIN AGS_LADSPA_PLUGIN AGS_LADSPA_PLUGIN_CLASS AGS_LADSPA_PLUGIN_GET_CLASS AGS_TYPE_LADSPA_PLUGIN AgsLadspaPlugin AgsLadspaPluginClass ags_ladspa_plugin_get_type
ags_lfo_audio_signal AgsLfoAudioSignal ags_lfo_audio_signal_new AGS_IS_LFO_AUDIO_SIGNAL AGS_LFO_AUDIO_SIGNAL AGS_LFO_AUDIO_SIGNAL_CLASS AGS_LFO_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_LFO_AUDIO_SIGNAL AgsLfoAudioSignal AgsLfoAudioSignalClass ags_lfo_audio_signal_get_type
ags_lfo_channel AgsLfoChannel ags_lfo_channel_new AGS_IS_LFO_CHANNEL AGS_LFO_CHANNEL AGS_LFO_CHANNEL_CLASS AGS_LFO_CHANNEL_GET_CLASS AGS_TYPE_LFO_CHANNEL AgsLfoChannel AgsLfoChannelClass ags_lfo_channel_get_type
ags_lfo_channel_run AgsLfoChannelRun ags_lfo_channel_run_new AGS_IS_LFO_CHANNEL_RUN AGS_LFO_CHANNEL_RUN AGS_LFO_CHANNEL_RUN_CLASS AGS_LFO_CHANNEL_RUN_GET_CLASS AGS_TYPE_LFO_CHANNEL_RUN AgsLfoChannelRun AgsLfoChannelRunClass ags_lfo_channel_run_get_type
ags_lfo_recycling AgsLfoRecycling ags_lfo_recycling_new AGS_IS_LFO_RECYCLING AGS_LFO_RECYCLING AGS_LFO_RECYCLING_CLASS AGS_LFO_RECYCLING_GET_CLASS AGS_TYPE_LFO_RECYCLING AgsLfoRecycling AgsLfoRecyclingClass ags_lfo_recycling_get_type
ags_lfo_synth_util ags_lfo_synth_util_sin_s8 ags_lfo_synth_util_sin_s16 ags_lfo_synth_util_sin_s24 ags_lfo_synth_util_sin_s32 ags_lfo_synth_util_sin_s64 ags_lfo_synth_util_sin_float ags_lfo_synth_util_sin_double ags_lfo_synth_util_sin_complex ags_lfo_synth_util_sawtooth_s8 ags_lfo_synth_util_sawtooth_s16 ags_lfo_synth_util_sawtooth_s24 ags_lfo_synth_util_sawtooth_s32 ags_lfo_synth_util_sawtooth_s64 ags_lfo_synth_util_sawtooth_float ags_lfo_synth_util_sawtooth_double ags_lfo_synth_util_sawtooth_complex ags_lfo_synth_util_triangle_s8 ags_lfo_synth_util_triangle_s16 ags_lfo_synth_util_triangle_s24 ags_lfo_synth_util_triangle_s32 ags_lfo_synth_util_triangle_s64 ags_lfo_synth_util_triangle_float ags_lfo_synth_util_triangle_double ags_lfo_synth_util_triangle_complex ags_lfo_synth_util_square_s8 ags_lfo_synth_util_square_s16 ags_lfo_synth_util_square_s24 ags_lfo_synth_util_square_s32 ags_lfo_synth_util_square_s64 ags_lfo_synth_util_square_float ags_lfo_synth_util_square_double ags_lfo_synth_util_square_complex ags_lfo_synth_util_impulse_s8 ags_lfo_synth_util_impulse_s16 ags_lfo_synth_util_impulse_s24 ags_lfo_synth_util_impulse_s32 ags_lfo_synth_util_impulse_s64 ags_lfo_synth_util_impulse_float ags_lfo_synth_util_impulse_double ags_lfo_synth_util_impulse_complex ags_lfo_synth_util_sin ags_lfo_synth_util_sawtooth ags_lfo_synth_util_triangle ags_lfo_synth_util_square ags_lfo_synth_util_impulse
ags_link_channel AgsLinkChannel ags_link_channel_new AGS_IS_LINK_CHANNEL AGS_LINK_CHANNEL AGS_LINK_CHANNEL_CLASS AGS_LINK_CHANNEL_GET_CLASS AGS_TYPE_LINK_CHANNEL AgsLinkChannel AgsLinkChannelClass ags_link_channel_get_type
ags_loop_channel AgsLoopChannel ags_loop_channel_new AGS_IS_LOOP_CHANNEL AGS_LOOP_CHANNEL AGS_LOOP_CHANNEL_CLASS AGS_LOOP_CHANNEL_GET_CLASS AGS_TYPE_LOOP_CHANNEL AgsLoopChannel AgsLoopChannelClass ags_loop_channel_get_type
ags_loop_channel_run AgsLoopChannelRun ags_loop_channel_run_new AGS_IS_LOOP_CHANNEL_RUN AGS_LOOP_CHANNEL_RUN AGS_LOOP_CHANNEL_RUN_CLASS AGS_LOOP_CHANNEL_RUN_GET_CLASS AGS_TYPE_LOOP_CHANNEL_RUN AgsLoopChannelRun AgsLoopChannelRunClass ags_loop_channel_run_get_type
ags_lv2_conversion AgsLv2Conversion AGS_LV2_CONVERSION_DEFAULT_LOWER AGS_LV2_CONVERSION_DEFAULT_UPPER AGS_LV2_CONVERSION_DEFAULT_STEP_COUNT AgsLv2ConversionFlaags ags_lv2_conversion_test_flags ags_lv2_conversion_set_flags ags_lv2_conversion_unset_flags ags_lv2_conversion_new AGS_IS_LV2_CONVERSION AGS_LV2_CONVERSION AGS_LV2_CONVERSION_CLASS AGS_LV2_CONVERSION_GET_CLASS AGS_TYPE_LV2_CONVERSION AgsLv2Conversion AgsLv2ConversionClass ags_lv2_conversion_get_type
ags_lv2_event_manager AgsLv2EventManager ags_lv2_event_manager_lv2_event_ref ags_lv2_event_manager_lv2_event_unref ags_lv2_event_manager_get_instance ags_lv2_event_manager_new AGS_IS_LV2_EVENT_MANAGER AGS_LV2_EVENT_MANAGER AGS_LV2_EVENT_MANAGER_CLASS AGS_LV2_EVENT_MANAGER_GET_CLASS AGS_TYPE_LV2_EVENT_MANAGER AgsLv2EventManager AgsLv2EventManagerClass ags_lv2_event_manager_get_type
ags_lv2_log_manager AgsLv2LogManager ags_lv2_log_manager_printf ags_lv2_log_manager_vprintf ags_lv2_log_manager_get_instance ags_lv2_log_manager_new AGS_IS_LV2_LOG_MANAGER AGS_LV2_LOG_MANAGER AGS_LV2_LOG_MANAGER_CLASS AGS_LV2_LOG_MANAGER_GET_CLASS AGS_TYPE_LV2_LOG_MANAGER AgsLv2LogManager AgsLv2LogManagerClass ags_lv2_log_manager_get_type
ags_lv2_manager AgsLv2Manager AGS_LV2_MANAGER_GET_OBJ_MUTEX AGS_LV2_MANAGER_DEFAULT_LOCALE ags_lv2_manager_global_get_parse_names ags_lv2_manager_global_get_preserve_turtle ags_lv2_manager_get_default_path ags_lv2_manager_set_default_path ags_lv2_manager_get_filenames ags_lv2_manager_find_lv2_plugin ags_lv2_manager_load_blacklist ags_lv2_manager_load_file ags_lv2_manager_load_preset ags_lv2_manager_load_default_directory ags_lv2_manager_get_instance ags_lv2_manager_new AGS_IS_LV2_MANAGER AGS_LV2_MANAGER AGS_LV2_MANAGER_CLASS AGS_LV2_MANAGER_GET_CLASS AGS_TYPE_LV2_MANAGER AgsLv2Manager AgsLv2ManagerClass ags_lv2_manager_get_type
ags_lv2_option_manager AgsLv2OptionManager AGS_LV2_OPTION_MANAGER_GET_OBJ_MUTEX AGS_LV2_OPTION_RESSOURCE AGS_LV2_OPTIONS_OPTION AgsLv2OptionRessource ags_lv2_option_ressource_alloc ags_lv2_option_manager_ressource_insert ags_lv2_option_manager_ressource_remove ags_lv2_option_manager_ressource_lookup ags_lv2_option_manager_ressource_lookup_extended ags_lv2_option_manager_get_option ags_lv2_option_manager_set_option ags_lv2_option_manager_lv2_options_get ags_lv2_option_manager_lv2_options_set ags_lv2_option_manager_get_instance ags_lv2_option_manager_new AGS_IS_LV2_OPTION_MANAGER AGS_LV2_OPTION_MANAGER AGS_LV2_OPTION_MANAGER_CLASS AGS_LV2_OPTION_MANAGER_GET_CLASS AGS_TYPE_LV2_OPTION_MANAGER AgsLv2OptionManager AgsLv2OptionManagerClass ags_lv2_option_manager_get_type
ags_lv2_plugin AgsLv2Plugin AGS_LV2_PLUGIN_DESCRIPTOR AGS_LV2_EVENT_BUFFER AGS_LV2_EVENT AGS_LV2_EVENT_DATA AGS_LV2_ATOM_SEQUENCE AGS_LV2_ATOM_EVENT AgsLv2PluginFlags ags_lv2_plugin_test_flags ags_lv2_plugin_set_flags ags_lv2_plugin_unset_flags ags_lv2_plugin_event_buffer_alloc ags_lv2_plugin_event_buffer_realloc_data ags_lv2_plugin_event_buffer_concat ags_lv2_plugin_event_buffer_append_midi ags_lv2_plugin_event_buffer_remove_midi ags_lv2_plugin_clear_event_buffer ags_lv2_plugin_alloc_atom_sequence ags_lv2_plugin_atom_sequence_append_midi ags_lv2_plugin_atom_sequence_remove_midi ags_lv2_plugin_clear_atom_sequence ags_lv2_plugin_find_uri ags_lv2_plugin_find_pname ags_lv2_plugin_change_program ags_lv2_plugin_new AGS_IS_LV2_PLUGIN AGS_LV2_PLUGIN AGS_LV2_PLUGIN_CLASS AGS_LV2_PLUGIN_GET_CLASS AGS_TYPE_LV2_PLUGIN AgsLv2Plugin AgsLv2PluginClass ags_lv2_plugin_get_type
ags_lv2_preset AgsLv2Preset AGS_LV2_PRESET_GET_OBJ_MUTEX AGS_LV2_PORT_PRESET AgsLv2PresetFlags AgsLv2PortPreset ags_lv2_port_preset_alloc ags_lv2_port_preset_free ags_lv2_preset_parse_turtle ags_lv2_preset_find_preset_uri ags_lv2_preset_find_preset_label ags_lv2_preset_new AGS_IS_LV2_PRESET AGS_LV2_PRESET AGS_LV2_PRESET_CLASS AGS_LV2_PRESET_GET_CLASS AGS_TYPE_LV2_PRESET AgsLv2Preset AgsLv2PresetClass ags_lv2_preset_get_type
ags_lv2_preset_manager AgsLv2PresetManager AGS_LV2_PRESET_MANAGER_GET_OBJ_MUTEX ags_lv2_preset_manager_get_instance ags_lv2_preset_manager_new AGS_IS_LV2_PRESET_MANAGER AGS_LV2_PRESET_MANAGER AGS_LV2_PRESET_MANAGER_CLASS AGS_LV2_PRESET_MANAGER_GET_CLASS AGS_TYPE_LV2_PRESET_MANAGER AgsLv2PresetManager AgsLv2PresetManagerClass ags_lv2_preset_manager_get_type
ags_lv2_turtle_parser AgsLv2TurtleParser AGS_LV2_TURTLE_PARSER_GET_OBJ_MUTEX ags_lv2_turtle_parser_parse_names ags_lv2_turtle_parser_parse ags_lv2_turtle_parser_new AGS_IS_LV2_TURTLE_PARSER AGS_LV2_TURTLE_PARSER AGS_LV2_TURTLE_PARSER_CLASS AGS_LV2_TURTLE_PARSER_GET_CLASS AGS_TYPE_LV2_TURTLE_PARSER AgsLv2TurtleParser AgsLv2TurtleParserClass ags_lv2_turtle_parser_get_type
ags_lv2_uri_map_manager AgsLv2UriMapManager AGS_LV2_URI_MAP_MANAGER_GET_OBJ_MUTEX ags_lv2_uri_map_manager_insert ags_lv2_uri_map_manager_remove ags_lv2_uri_map_manager_lookup ags_lv2_uri_map_manager_load_default ags_lv2_uri_map_manager_uri_to_id ags_lv2_uri_map_manager_get_instance ags_lv2_uri_map_manager_new AGS_IS_LV2_URI_MAP_MANAGER AGS_LV2_URI_MAP_MANAGER AGS_LV2_URI_MAP_MANAGER_CLASS AGS_LV2_URI_MAP_MANAGER_GET_CLASS AGS_TYPE_LV2_URI_MAP_MANAGER AgsLv2UriMapManager AgsLv2UriMapManagerClass ags_lv2_uri_map_manager_get_type
ags_lv2_urid_manager AgsLv2UridManager AGS_LV2_URID_MANAGER_GET_OBJ_MUTEX ags_lv2_urid_manager_insert ags_lv2_urid_manager_remove ags_lv2_urid_manager_lookup ags_lv2_urid_manager_load_default ags_lv2_urid_manager_map ags_lv2_urid_manager_unmap ags_lv2_urid_manager_get_instance ags_lv2_urid_manager_new AGS_IS_LV2_URID_MANAGER AGS_LV2_URID_MANAGER AGS_LV2_URID_MANAGER_CLASS AGS_LV2_URID_MANAGER_GET_CLASS AGS_TYPE_LV2_URID_MANAGER AgsLv2UridManager AgsLv2UridManagerClass ags_lv2_urid_manager_get_type
ags_lv2_worker AgsLv2Worker AGS_LV2_WORKER_GET_OBJ_MUTEX AGS_LV2_WORKER_RESPONSE_DATA AgsLv2WorkerFlags AgsLv2WorkerResponseData ags_lv2_worker_test_flags ags_lv2_worker_set_flags ags_lv2_worker_unset_flags ags_lv2_worker_alloc_response_data ags_lv2_worker_free_response_data ags_lv2_worker_respond ags_lv2_worker_schedule_work ags_lv2_worker_do_poll ags_lv2_worker_new AGS_IS_LV2_WORKER AGS_LV2_WORKER AGS_LV2_WORKER_CLASS AGS_LV2_WORKER_GET_CLASS AGS_TYPE_LV2_WORKER AgsLv2Worker AgsLv2WorkerClass ags_lv2_worker_get_type
ags_lv2_worker_manager AgsLv2WorkerManager AGS_LV2_WORKER_MANAGER_GET_OBJ_MUTEX ags_lv2_worker_manager_pull_worker ags_lv2_worker_manager_get_instance ags_lv2_worker_manager_new AGS_IS_LV2_WORKER_MANAGER AGS_LV2_WORKER_MANAGER AGS_LV2_WORKER_MANAGER_CLASS AGS_LV2_WORKER_MANAGER_GET_CLASS AGS_TYPE_LV2_WORKER_MANAGER AgsLv2WorkerManager AgsLv2WorkerManagerClass ags_lv2_worker_manager_get_type
ags_lv2ui_manager AgsLv2uiManager AGS_LV2UI_MANAGER_GET_OBJ_MUTEX ags_lv2ui_manager_get_default_path ags_lv2ui_manager_set_default_path ags_lv2ui_manager_get_filenames ags_lv2ui_manager_find_lv2ui_plugin ags_lv2ui_manager_find_lv2ui_plugin_with_index ags_lv2ui_manager_load_blacklist ags_lv2ui_manager_load_file ags_lv2ui_manager_load_default_directory ags_lv2ui_manager_get_instance ags_lv2ui_manager_new AGS_IS_LV2UI_MANAGER AGS_LV2UI_MANAGER AGS_LV2UI_MANAGER_CLASS AGS_LV2UI_MANAGER_GET_CLASS AGS_TYPE_LV2UI_MANAGER AgsLv2uiManager AgsLv2uiManagerClass ags_lv2ui_manager_get_type
ags_lv2ui_plugin AgsLv2uiPlugin AGS_LV2UI_PLUGIN_DESCRIPTOR AgsLv2uiPluginFlags ags_lv2ui_plugin_test_flags ags_lv2ui_plugin_set_flags ags_lv2ui_plugin_unset_flags ags_lv2ui_plugin_find_gui_uri ags_lv2ui_plugin_new AGS_IS_LV2UI_PLUGIN AGS_LV2UI_PLUGIN AGS_LV2UI_PLUGIN_CLASS AGS_LV2UI_PLUGIN_GET_CLASS AGS_TYPE_LV2UI_PLUGIN AgsLv2uiPlugin AgsLv2uiPluginClass ags_lv2ui_plugin_get_type
ags_midi AgsMidi AGS_MIDI_GET_OBJ_MUTEX AGS_MIDI_DEFAULT_BPM AGS_MIDI_TICS_PER_BEAT AGS_MIDI_MINIMUM_TRACK_LENGTH AGS_MIDI_DEFAULT_LENGTH AGS_MIDI_DEFAULT_JIFFIE AGS_MIDI_DEFAULT_DURATION AGS_MIDI_DEFAULT_OFFSET AGS_MIDI_CLIPBOARD_VERSION AGS_MIDI_CLIPBOARD_TYPE AGS_MIDI_CLIPBOARD_FORMAT AgsMidiFlags ags_midi_test_flags ags_midi_set_flags ags_midi_unset_flags ags_midi_find_near_timestamp ags_midi_sort_func ags_midi_add ags_midi_add_track ags_midi_remove_track ags_midi_new AGS_IS_MIDI AGS_MIDI AGS_MIDI_CLASS AGS_MIDI_GET_CLASS AGS_TYPE_MIDI AgsMidi AgsMidiClass ags_midi_get_type
ags_midi_buffer_util AgsMidiBufferUtilMtcQuarterFrameMessageType AgsMidiBufferUtilSmtpeFrameRate ags_midi_buffer_util_get_varlength_size ags_midi_buffer_util_put_varlength ags_midi_buffer_util_get_varlength ags_midi_buffer_util_put_int16 ags_midi_buffer_util_get_int16 ags_midi_buffer_util_put_int24 ags_midi_buffer_util_get_int24 ags_midi_buffer_util_put_int32 ags_midi_buffer_util_get_int32 ags_midi_buffer_util_put_header ags_midi_buffer_util_get_header ags_midi_buffer_util_put_track ags_midi_buffer_util_get_track ags_midi_buffer_util_put_key_on ags_midi_buffer_util_get_key_on ags_midi_buffer_util_put_key_off ags_midi_buffer_util_get_key_off ags_midi_buffer_util_put_key_pressure ags_midi_buffer_util_get_key_pressure ags_midi_buffer_util_put_change_parameter ags_midi_buffer_util_get_change_parameter ags_midi_buffer_util_put_pitch_bend ags_midi_buffer_util_get_pitch_bend ags_midi_buffer_util_put_change_program ags_midi_buffer_util_get_change_program ags_midi_buffer_util_put_change_pressure ags_midi_buffer_util_get_change_pressure ags_midi_buffer_util_put_sysex ags_midi_buffer_util_get_sysex ags_midi_buffer_util_put_quarter_frame ags_midi_buffer_util_get_quarter_frame ags_midi_buffer_util_put_song_position ags_midi_buffer_util_get_song_position ags_midi_buffer_util_put_song_select ags_midi_buffer_util_get_song_select ags_midi_buffer_util_put_tune_request ags_midi_buffer_util_get_tune_request ags_midi_buffer_util_put_sequence_number ags_midi_buffer_util_get_sequence_number ags_midi_buffer_util_put_smtpe ags_midi_buffer_util_get_smtpe ags_midi_buffer_util_put_tempo ags_midi_buffer_util_get_tempo ags_midi_buffer_util_put_time_signature ags_midi_buffer_util_get_time_signature ags_midi_buffer_util_put_key_signature ags_midi_buffer_util_get_key_signature ags_midi_buffer_util_put_sequencer_meta_event ags_midi_buffer_util_get_sequencer_meta_event ags_midi_buffer_util_put_text_event ags_midi_buffer_util_get_text_event ags_midi_buffer_util_put_end_of_track ags_midi_buffer_util_get_end_of_track ags_midi_buffer_util_seek_message ags_midi_buffer_util_decode
ags_midi_builder AgsMidiBuilder AGS_MIDI_BUILDER_GET_OBJ_MUTEX AGS_MIDI_BUILDER_HEADER AGS_MIDI_BUILDER_TRACK AgsMidiBuilderFlags AgsMidiBuilderHeader AgsMidiBuilderTrack ags_midi_builder_header_alloc ags_midi_builder_header_free ags_midi_builder_track_alloc ags_midi_builder_track_free ags_midi_builder_track_find_delta_time_with_track_name ags_midi_builder_track_insert_midi_message ags_midi_builder_track_get_delta_time_offset ags_midi_builder_midi_putc ags_midi_builder_on_error ags_midi_builder_append_header ags_midi_builder_append_track ags_midi_builder_append_key_on ags_midi_builder_append_key_off ags_midi_builder_append_key_pressure ags_midi_builder_append_change_parameter ags_midi_builder_append_change_pitch_bend ags_midi_builder_append_change_program ags_midi_builder_append_change_pressure ags_midi_builder_append_sysex ags_midi_builder_append_quarter_frame ags_midi_builder_append_song_position ags_midi_builder_append_song_select ags_midi_builder_append_tune_request ags_midi_builder_append_sequence_number ags_midi_builder_append_smtpe ags_midi_builder_append_tempo ags_midi_builder_append_time_signature ags_midi_builder_append_key_signature ags_midi_builder_append_sequencer_meta_event ags_midi_builder_append_text_event ags_midi_builder_append_xml_node ags_midi_builder_from_xml_doc ags_midi_builder_build ags_midi_builder_new AGS_IS_MIDI_BUILDER AGS_MIDI_BUILDER AGS_MIDI_BUILDER_CLASS AGS_MIDI_BUILDER_GET_CLASS AGS_TYPE_MIDI_BUILDER AgsMidiBuilder AgsMidiBuilderClass ags_midi_builder_get_type
ags_midi_file AgsMidiFile AGS_MIDI_FILE_GET_OBJ_MUTEX AGS_MIDI_FILE_TRACK AGS_MIDI_FILE_MAX_TEXT_LENGTH AGS_MIDI_FILE_MTHD AGS_MIDI_FILE_MTRK AGS_MIDI_FILE_DEFAULT_OFFSET AGS_MIDI_FILE_DEFAULT_FORMAT AGS_MIDI_FILE_DEFAULT_BEATS AGS_MIDI_FILE_DEFAULT_FPS AGS_MIDI_FILE_DEFAULT_TICKS AgsMidiFileStatus AgsMidiFileFlags AGS_MIDI_FILE_ERROR AgsMidiFileError AgsMidiFileTrack ags_midi_file_error_quark ags_midi_file_open ags_midi_file_open_from_data ags_midi_file_rw_open ags_midi_file_close ags_midi_file_read ags_midi_file_write ags_midi_file_seek ags_midi_file_flush ags_midi_file_read_byte ags_midi_file_read_gint16 ags_midi_file_read_gint24 ags_midi_file_read_gint32 ags_midi_file_read_varlength ags_midi_file_read_text ags_midi_file_write_byte ags_midi_file_write_gint16 ags_midi_file_write_gint24 ags_midi_file_write_gint32 ags_midi_file_write_varlength ags_midi_file_write_text ags_midi_file_read_header ags_midi_file_write_header ags_midi_file_read_track_data ags_midi_file_write_track_data ags_midi_file_read_notation ags_mid_file_read_midi ags_midi_file_new AGS_IS_MIDI_FILE AGS_MIDI_FILE AGS_MIDI_FILE_CLASS AGS_MIDI_FILE_GET_CLASS AGS_TYPE_MIDI_FILE AgsMidiFile AgsMidiFileClass ags_midi_file_get_type
ags_midi_parser AgsMidiParser AGS_MIDI_PARSER_GET_OBJ_MUTEX AGS_MIDI_PARSER_MAX_TEXT_LENGTH AGS_MIDI_PARSER_MTHD AGS_MIDI_PARSER_MTCK AGS_MIDI_EVENT AgsMidiParserFlags AgsMidiChunkFlags ags_midi_parser_read_gint16 ags_midi_parser_read_gint24 ags_midi_parser_read_gint32 ags_midi_parser_read_varlength ags_midi_parser_read_text ags_midi_parser_ticks_to_sec ags_midi_parser_midi_getc ags_midi_parser_on_error ags_midi_parser_parse_full ags_midi_parser_parse_bytes ags_midi_parser_parse_header ags_midi_parser_parse_track ags_midi_parser_channel_message ags_midi_parser_key_on ags_midi_parser_key_off ags_midi_parser_key_pressure ags_midi_parser_change_parameter ags_midi_parser_change_pitch_bend ags_midi_parser_change_program ags_midi_parser_change_channel_pressure ags_midi_parser_not_defined ags_midi_parser_sysex ags_midi_parser_system_common ags_midi_parser_meta_event ags_midi_parser_sequence_number ags_midi_parser_end_of_track ags_midi_parser_smtpe ags_midi_parser_tempo ags_midi_parser_time_signature ags_midi_parser_key_signature ags_midi_parser_sequencer_meta_event ags_midi_parser_meta_misc ags_midi_parser_text_event ags_midi_parser_new AGS_IS_MIDI_PARSER AGS_MIDI_PARSER AGS_MIDI_PARSER_CLASS AGS_MIDI_PARSER_GET_CLASS AGS_TYPE_MIDI_PARSER AgsMidiParser AgsMidiParserClass ags_midi_parser_get_type
ags_midi_util ags_midi_util_is_key_on ags_midi_util_is_key_off ags_midi_util_is_key_pressure ags_midi_util_is_change_parameter ags_midi_util_is_pitch_bend ags_midi_util_is_change_program ags_midi_util_is_change_pressure ags_midi_util_is_sysex ags_midi_util_is_quarter_frame ags_midi_util_is_song_position ags_midi_util_is_song_select ags_midi_util_is_tune_request ags_midi_util_is_meta_event ags_midi_util_to_smf ags_midi_util_delta_time_to_offset ags_midi_util_offset_to_delta_time
ags_midiin AgsMidiin AGS_MIDIIN_GET_OBJ_MUTEX AGS_MIDIIN_DEFAULT_ALSA_DEVICE AGS_MIDIIN_DEFAULT_OSS_DEVICE AGS_MIDIIN_DEFAULT_BUFFER_SIZE AgsMidiinFlags AgsMidiinSyncFlags AGS_MIDIIN_ERROR AgsMidiinError ags_midiin_error_quark ags_midiin_test_flags ags_midiin_set_flags ags_midiin_unset_flags ags_midiin_switch_buffer_flag ags_midiin_new AGS_IS_MIDIIN AGS_MIDIIN AGS_MIDIIN_CLASS AGS_MIDIIN_GET_CLASS AGS_TYPE_MIDIIN AgsMidiin AgsMidiinClass ags_midiin_get_type
ags_move_note AgsMoveNote AGS_MOVE_NOTE_DEFAULT_X_LENGTH AGS_MOVE_NOTE_DEFAULT_Y_LENGTH ags_move_note_new AGS_IS_MOVE_NOTE AGS_MOVE_NOTE AGS_MOVE_NOTE_CLASS AGS_MOVE_NOTE_GET_CLASS AGS_TYPE_MOVE_NOTE AgsMoveNote AgsMoveNoteClass ags_move_note_get_type
ags_mute_audio AgsMuteAudio ags_mute_audio_new AGS_IS_MUTE_AUDIO AGS_MUTE_AUDIO AGS_MUTE_AUDIO_CLASS AGS_MUTE_AUDIO_GET_CLASS AGS_TYPE_MUTE_AUDIO AgsMuteAudio AgsMuteAudioClass ags_mute_audio_get_type
ags_mute_audio_run AgsMuteAudioRun ags_mute_audio_run_new AGS_IS_MUTE_AUDIO_RUN AGS_MUTE_AUDIO_RUN AGS_MUTE_AUDIO_RUN_CLASS AGS_MUTE_AUDIO_RUN_GET_CLASS AGS_TYPE_MUTE_AUDIO_RUN AgsMuteAudioRun AgsMuteAudioRunClass ags_mute_audio_run_get_type
ags_mute_audio_signal AgsMuteAudioSignal ags_mute_audio_signal_new AGS_IS_MUTE_AUDIO_SIGNAL AGS_MUTE_AUDIO_SIGNAL AGS_MUTE_AUDIO_SIGNAL_CLASS AGS_MUTE_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_MUTE_AUDIO_SIGNAL AgsMuteAudioSignal AgsMuteAudioSignalClass ags_mute_audio_signal_get_type
ags_mute_channel AgsMuteChannel ags_mute_channel_new AGS_IS_MUTE_CHANNEL AGS_MUTE_CHANNEL AGS_MUTE_CHANNEL_CLASS AGS_MUTE_CHANNEL_GET_CLASS AGS_TYPE_MUTE_CHANNEL AgsMuteChannel AgsMuteChannelClass ags_mute_channel_get_type
ags_mute_channel_run AgsMuteChannelRun ags_mute_channel_run_new AGS_IS_MUTE_CHANNEL_RUN AGS_MUTE_CHANNEL_RUN AGS_MUTE_CHANNEL_RUN_CLASS AGS_MUTE_CHANNEL_RUN_GET_CLASS AGS_TYPE_MUTE_CHANNEL_RUN AgsMuteChannelRun AgsMuteChannelRunClass ags_mute_channel_run_get_type
ags_mute_recycling AgsMuteRecycling ags_mute_recycling_new AGS_IS_MUTE_RECYCLING AGS_MUTE_RECYCLING AGS_MUTE_RECYCLING_CLASS AGS_MUTE_RECYCLING_GET_CLASS AGS_TYPE_MUTE_RECYCLING AgsMuteRecycling AgsMuteRecyclingClass ags_mute_recycling_get_type
ags_notation AgsNotation AGS_NOTATION_GET_OBJ_MUTEX AGS_NOTATION_DEFAULT_BPM AGS_NOTATION_TICS_PER_BEAT AGS_NOTATION_MINIMUM_NOTE_LENGTH AGS_NOTATION_MAXIMUM_NOTE_LENGTH AGS_NOTATION_DEFAULT_LENGTH AGS_NOTATION_DEFAULT_JIFFIE AGS_NOTATION_DEFAULT_DURATION AGS_NOTATION_DEFAULT_OFFSET AGS_NOTATION_DEFAULT_END AGS_NOTATION_CLIPBOARD_VERSION AGS_NOTATION_CLIPBOARD_TYPE AGS_NOTATION_CLIPBOARD_FORMAT AgsNotationFlags ags_notation_test_flags ags_notation_set_flags ags_notation_unset_flags ags_notation_find_near_timestamp ags_notation_add ags_notation_sort_func ags_notation_add_note ags_notation_remove_note ags_notation_remove_note_at_position ags_notation_get_selection ags_notation_is_note_selected ags_notation_find_point ags_notation_find_region ags_notation_find_offset ags_notation_free_selection ags_notation_add_point_to_selection ags_notation_remove_point_from_selection ags_notation_add_region_to_selection ags_notation_remove_region_from_selection ags_notation_add_all_to_selection ags_notation_copy_selection ags_notation_cut_selection ags_notation_insert_from_clipboard ags_notation_insert_from_clipboard_extended ags_notation_to_raw_midi ags_notation_from_raw_midi ags_notation_new AGS_IS_NOTATION AGS_NOTATION AGS_NOTATION_CLASS AGS_NOTATION_GET_CLASS AGS_TYPE_NOTATION AgsNotation AgsNotationClass ags_notation_get_type
ags_note AgsNote AGS_NOTE_GET_OBJ_MUTEX AgsNoteFlags ags_note_test_flags ags_note_set_flags ags_note_unset_flags ags_note_sort_func ags_note_find_prev ags_note_find_next ags_note_length_to_smf_delta_time ags_note_smf_delta_time_to_length ags_note_to_raw_midi ags_note_to_raw_midi_extended ags_note_to_seq_event ags_note_to_seq_event_extended ags_note_from_raw_midi ags_note_from_raw_midi_extended ags_note_from_seq_event ags_note_from_seq_event_extended ags_note_duplicate ags_note_new ags_note_new_with_offset AGS_IS_NOTE AGS_NOTE AGS_NOTE_CLASS AGS_NOTE_GET_CLASS AGS_TYPE_NOTE AgsNote AgsNoteClass ags_note_get_type
ags_open_file AgsOpenFile ags_open_file_new AGS_IS_OPEN_FILE AGS_OPEN_FILE AGS_OPEN_FILE_CLASS AGS_OPEN_FILE_GET_CLASS AGS_TYPE_OPEN_FILE AgsOpenFile AgsOpenFileClass ags_open_file_get_type
ags_open_sf2_instrument AgsOpenSf2Instrument ags_open_sf2_instrument_new AGS_IS_OPEN_SF2_INSTRUMENT AGS_OPEN_SF2_INSTRUMENT AGS_OPEN_SF2_INSTRUMENT_CLASS AGS_OPEN_SF2_INSTRUMENT_GET_CLASS AGS_TYPE_OPEN_SF2_INSTRUMENT AgsOpenSf2Instrument AgsOpenSf2InstrumentClass ags_open_sf2_instrument_get_type
ags_open_sf2_sample AgsOpenSf2Sample ags_open_sf2_sample_new AGS_IS_OPEN_SF2_SAMPLE AGS_OPEN_SF2_SAMPLE AGS_OPEN_SF2_SAMPLE_CLASS AGS_OPEN_SF2_SAMPLE_GET_CLASS AGS_TYPE_OPEN_SF2_SAMPLE AgsOpenSf2Sample AgsOpenSf2SampleClass ags_open_sf2_sample_get_type
ags_open_single_file AgsOpenSingleFile ags_open_single_file_new AGS_IS_OPEN_SINGLE_FILE AGS_OPEN_SINGLE_FILE AGS_OPEN_SINGLE_FILE_CLASS AGS_OPEN_SINGLE_FILE_GET_CLASS AGS_TYPE_OPEN_SINGLE_FILE AgsOpenSingleFile AgsOpenSingleFileClass ags_open_single_file_get_type
ags_open_wave AgsOpenWave ags_open_wave_new AGS_IS_OPEN_WAVE AGS_OPEN_WAVE AGS_OPEN_WAVE_CLASS AGS_OPEN_WAVE_GET_CLASS AGS_TYPE_OPEN_WAVE AgsOpenWave AgsOpenWaveClass ags_open_wave_get_type
ags_osc_action_controller AgsOscActionController ags_osc_action_controller_run_action ags_osc_action_controller_new AGS_IS_OSC_ACTION_CONTROLLER AGS_OSC_ACTION_CONTROLLER AGS_OSC_ACTION_CONTROLLER_CLASS AGS_OSC_ACTION_CONTROLLER_GET_CLASS AGS_TYPE_OSC_ACTION_CONTROLLER AgsOscActionController AgsOscActionControllerClass ags_osc_action_controller_get_type
ags_osc_buffer_util ags_osc_buffer_util_put_int32 ags_osc_buffer_util_get_int32 ags_osc_buffer_util_put_timetag ags_osc_buffer_util_get_timetag ags_osc_buffer_util_put_float ags_osc_buffer_util_get_float ags_osc_buffer_util_put_string ags_osc_buffer_util_get_string ags_osc_buffer_util_put_blob ags_osc_buffer_util_get_blob ags_osc_buffer_util_put_int64 ags_osc_buffer_util_get_int64 ags_osc_buffer_util_put_double ags_osc_buffer_util_get_double ags_osc_buffer_util_put_char ags_osc_buffer_util_get_char ags_osc_buffer_util_put_rgba ags_osc_buffer_util_get_rgba ags_osc_buffer_util_put_midi ags_osc_buffer_util_get_midi ags_osc_buffer_util_put_packet ags_osc_buffer_util_get_packet ags_osc_buffer_util_put_packets ags_osc_buffer_util_put_message ags_osc_buffer_util_get_message ags_osc_buffer_util_put_bundle ags_osc_buffer_util_get_bundle
ags_osc_builder AgsOscBuilder AGS_OSC_BUILDER_GET_OBJ_MUTEX AGS_OSC_BUILDER_PACKET AGS_OSC_BUILDER_BUNDLE AGS_OSC_BUILDER_MESSAGE AGS_OSC_BUILDER_DEFAULT_CHUNK_SIZE AGS_OSC_BUILDER_MESSAGE_DEFAULT_CHUNK_SIZE AgsOscBuilderFlags AgsOscBuilderPacket AgsOscBuilderBundle AgsOscBuilderMessage ags_osc_builder_packet_alloc ags_osc_builder_packet_free ags_osc_builder_bundle_alloc ags_osc_builder_bundle_free ags_osc_builder_message_alloc ags_osc_builder_message_free ags_osc_builder_osc_putc ags_osc_builder_on_error ags_osc_builder_append_packet ags_osc_builder_append_bundle ags_osc_builder_append_message ags_osc_builder_append_value ags_osc_builder_build ags_osc_builder_new AGS_IS_OSC_BUILDER AGS_OSC_BUILDER AGS_OSC_BUILDER_CLASS AGS_OSC_BUILDER_GET_CLASS AGS_TYPE_OSC_BUILDER AgsOscBuilder AgsOscBuilderClass ags_osc_builder_get_type
ags_osc_client AgsOscClient AGS_OSC_CLIENT_GET_OBJ_MUTEX AGS_OSC_CLIENT_DEFAULT_MAX_ADDRESS_LENGTH AGS_OSC_CLIENT_DEFAULT_SERVER_PORT AGS_OSC_CLIENT_DEFAULT_DOMAIN AGS_OSC_CLIENT_DEFAULT_INET4_ADDRESS AGS_OSC_CLIENT_DEFAULT_INET6_ADDRESS AGS_OSC_CLIENT_DEFAULT_MAX_RETRY AGS_OSC_CLIENT_CHUNK_SIZE AGS_OSC_CLIENT_DEFAULT_CACHE_DATA_LENGTH AgsOscClientFlags ags_osc_client_test_flags ags_osc_client_set_flags ags_osc_client_unset_flags ags_osc_client_resolve ags_osc_client_connect ags_osc_client_read_bytes ags_osc_client_write_bytes ags_osc_client_new AGS_IS_OSC_CLIENT AGS_OSC_CLIENT AGS_OSC_CLIENT_CLASS AGS_OSC_CLIENT_GET_CLASS AGS_TYPE_OSC_CLIENT AgsOscClient AgsOscClientClass ags_osc_client_get_type
ags_osc_config_controller AgsOscConfigController ags_osc_config_controller_apply_config ags_osc_config_controller_new AGS_IS_OSC_CONFIG_CONTROLLER AGS_OSC_CONFIG_CONTROLLER AGS_OSC_CONFIG_CONTROLLER_CLASS AGS_OSC_CONFIG_CONTROLLER_GET_CLASS AGS_TYPE_OSC_CONFIG_CONTROLLER AgsOscConfigController AgsOscConfigControllerClass ags_osc_config_controller_get_type
ags_osc_connection AgsOscConnection AGS_OSC_CONNECTION_GET_OBJ_MUTEX AGS_OSC_CONNECTION_TIMEOUT_USEC AGS_OSC_CONNECTION_DEAD_LINE_USEC AGS_OSC_CONNECTION_CHUNK_SIZE AGS_OSC_CONNECTION_DEFAULT_CACHE_DATA_LENGTH AgsOscConnectionFlags ags_osc_connection_test_flags ags_osc_connection_set_flags ags_osc_connection_unset_flags ags_osc_connection_timeout_expired ags_osc_connection_read_bytes ags_osc_connection_write_response ags_osc_connection_close ags_osc_connection_new AGS_IS_OSC_CONNECTION AGS_OSC_CONNECTION AGS_OSC_CONNECTION_CLASS AGS_OSC_CONNECTION_GET_CLASS AGS_TYPE_OSC_CONNECTION AgsOscConnection AgsOscConnectionClass ags_osc_connection_get_type
ags_osc_controller AgsOscController AGS_OSC_CONTROLLER_GET_OBJ_MUTEX ags_osc_controller_new AGS_IS_OSC_CONTROLLER AGS_OSC_CONTROLLER AGS_OSC_CONTROLLER_CLASS AGS_OSC_CONTROLLER_GET_CLASS AGS_TYPE_OSC_CONTROLLER AgsOscController AgsOscControllerClass ags_osc_controller_get_type
ags_osc_export_controller AgsOscExportController ags_osc_export_controller_do_export ags_osc_export_controller_new AGS_IS_OSC_EXPORT_CONTROLLER AGS_OSC_EXPORT_CONTROLLER AGS_OSC_EXPORT_CONTROLLER_CLASS AGS_OSC_EXPORT_CONTROLLER_GET_CLASS AGS_TYPE_OSC_EXPORT_CONTROLLER AgsOscExportController AgsOscExportControllerClass ags_osc_export_controller_get_type
ags_osc_front_controller AgsOscFrontController AgsOscFrontControllerFlags ags_osc_front_controller_test_flags ags_osc_front_controller_set_flags ags_osc_front_controller_unset_flags ags_osc_front_controller_add_message ags_osc_front_controller_remove_message ags_osc_front_controller_start_delegate ags_osc_front_controller_stop_delegate ags_osc_front_controller_do_request ags_osc_front_controller_new AGS_IS_OSC_FRONT_CONTROLLER AGS_OSC_FRONT_CONTROLLER AGS_OSC_FRONT_CONTROLLER_CLASS AGS_OSC_FRONT_CONTROLLER_GET_CLASS AGS_TYPE_OSC_FRONT_CONTROLLER AgsOscFrontController AgsOscFrontControllerClass ags_osc_front_controller_get_type
ags_osc_info_controller AgsOscInfoController ags_osc_info_controller_get_info ags_osc_info_controller_new AGS_IS_OSC_INFO_CONTROLLER AGS_OSC_INFO_CONTROLLER AGS_OSC_INFO_CONTROLLER_CLASS AGS_OSC_INFO_CONTROLLER_GET_CLASS AGS_TYPE_OSC_INFO_CONTROLLER AgsOscInfoController AgsOscInfoControllerClass ags_osc_info_controller_get_type
ags_osc_message AgsOscMessage AGS_OSC_MESSAGE_GET_OBJ_MUTEX ags_osc_message_sort_func ags_osc_message_new AGS_IS_OSC_MESSAGE AGS_OSC_MESSAGE AGS_OSC_MESSAGE_CLASS AGS_OSC_MESSAGE_GET_CLASS AGS_TYPE_OSC_MESSAGE AgsOscMessage AgsOscMessageClass ags_osc_message_get_type
ags_osc_meter_controller AgsOscMeterController AGS_OSC_METER_CONTROLLER_DEFAULT_MONITOR_TIMEOUT AGS_OSC_METER_CONTROLLER_MONITOR AgsOscMeterControllerFlags AgsOscMeterControllerMonitor ags_osc_meter_controller_test_flags ags_osc_meter_controller_set_flags ags_osc_meter_controller_unset_flags ags_osc_meter_controller_monitor_alloc ags_osc_meter_controller_monitor_free ags_osc_meter_controller_monitor_ref ags_osc_meter_controller_monitor_unref ags_osc_meter_controller_monitor_find_path ags_osc_meter_controller_monitor_find_port ags_osc_meter_controller_add_monitor ags_osc_meter_controller_remove_monitor ags_osc_meter_controller_contains_monitor ags_osc_meter_controller_start_monitor ags_osc_meter_controller_stop_monitor ags_osc_meter_controller_monitor_meter ags_osc_meter_controller_new AGS_IS_OSC_METER_CONTROLLER AGS_OSC_METER_CONTROLLER AGS_OSC_METER_CONTROLLER_CLASS AGS_OSC_METER_CONTROLLER_GET_CLASS AGS_TYPE_OSC_METER_CONTROLLER AgsOscMeterController AgsOscMeterControllerClass ags_osc_meter_controller_get_type
ags_osc_node_controller AgsOscNodeController AGS_OSC_NODE_CONTROLLER_CONTEXT_PATH_LENGTH ags_osc_node_controller_get_data ags_osc_node_controller_new AGS_IS_OSC_NODE_CONTROLLER AGS_OSC_NODE_CONTROLLER AGS_OSC_NODE_CONTROLLER_CLASS AGS_OSC_NODE_CONTROLLER_GET_CLASS AGS_TYPE_OSC_NODE_CONTROLLER AgsOscNodeController AgsOscNodeControllerClass ags_osc_node_controller_get_type
ags_osc_parser AgsOscParser AGS_OSC_PARSER_GET_OBJ_MUTEX AGS_OSC_PARSER_MAX_TEXT_LENGTH AgsOscParserFlags ags_osc_parser_read_gint32 ags_osc_parser_read_gint64 ags_osc_parser_read_gfloat ags_osc_parser_read_gdouble ags_osc_parser_read_text ags_osc_parser_osc_getc ags_osc_parser_on_error ags_osc_parser_parse_full ags_osc_parser_parse_bytes ags_osc_parser_packet ags_osc_parser_bundle ags_osc_parser_message ags_osc_parser_value ags_osc_parser_new AGS_IS_OSC_PARSER AGS_OSC_PARSER AGS_OSC_PARSER_CLASS AGS_OSC_PARSER_GET_CLASS AGS_TYPE_OSC_PARSER AgsOscParser AgsOscParserClass ags_osc_parser_get_type
ags_osc_plugin_controller AgsOscPluginController ags_osc_plugin_controller_do_request AGS_IS_OSC_PLUGIN_CONTROLLER AGS_IS_OSC_PLUGIN_CONTROLLER_INTERFACE AGS_OSC_PLUGIN_CONTROLLER AGS_OSC_PLUGIN_CONTROLLER_GET_INTERFACE AGS_OSC_PLUGIN_CONTROLLER_INTERFACE AGS_TYPE_OSC_PLUGIN_CONTROLLER AgsOscPluginController AgsOscPluginControllerInterface ags_osc_plugin_controller_get_type
ags_osc_renew_controller AgsOscRenewController AGS_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH ags_osc_renew_controller_set_data ags_osc_renew_controller_new AGS_IS_OSC_RENEW_CONTROLLER AGS_OSC_RENEW_CONTROLLER AGS_OSC_RENEW_CONTROLLER_CLASS AGS_OSC_RENEW_CONTROLLER_GET_CLASS AGS_TYPE_OSC_RENEW_CONTROLLER AgsOscRenewController AgsOscRenewControllerClass ags_osc_renew_controller_get_type
ags_osc_response AgsOscResponse AGS_OSC_RESPONSE_GET_OBJ_MUTEX AGS_OSC_RESPONSE_ERROR_MESSAGE_SERVER_FAILURE AGS_OSC_RESPONSE_ERROR_MESSAGE_MALFORMED_REQUEST AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_PATH AGS_OSC_RESPONSE_ERROR_MESSAGE_UNKNOWN_ARGUMENT AGS_OSC_RESPONSE_ERROR_MESSAGE_MISSING_INDEX AGS_OSC_RESPONSE_ERROR_MESSAGE_CHUNK_SIZE_EXCEEDED AGS_OSC_RESPONSE_DEFAULT_CHUNK_SIZE AgsOscResponseFlags ags_osc_response_test_flags ags_osc_response_set_flags ags_osc_response_unset_flags ags_osc_response_new AGS_IS_OSC_RESPONSE AGS_OSC_RESPONSE AGS_OSC_RESPONSE_CLASS AGS_OSC_RESPONSE_GET_CLASS AGS_TYPE_OSC_RESPONSE AgsOscResponse AgsOscResponseClass ags_osc_response_get_type
ags_osc_server AgsOscServer AGS_OSC_SERVER_GET_OBJ_MUTEX AGS_OSC_SERVER_DEFAULT_MAX_ADDRESS_LENGTH AGS_OSC_SERVER_DEFAULT_SERVER_PORT AGS_OSC_SERVER_DEFAULT_DOMAIN AGS_OSC_SERVER_DEFAULT_INET4_ADDRESS AGS_OSC_SERVER_DEFAULT_INET6_ADDRESS AGS_OSC_SERVER_DEFAULT_BACKLOG AGS_OSC_SERVER_DEFAULT_MAX_CONNECTIONS AgsOscServerFlags ags_osc_server_test_flags ags_osc_server_set_flags ags_osc_server_unset_flags ags_osc_server_add_connection ags_osc_server_remove_connection ags_osc_server_add_controller ags_osc_server_remove_controller ags_osc_server_add_default_controller ags_osc_server_start ags_osc_server_stop ags_osc_server_listen ags_osc_server_dispatch ags_osc_server_new AGS_IS_OSC_SERVER AGS_OSC_SERVER AGS_OSC_SERVER_CLASS AGS_OSC_SERVER_GET_CLASS AGS_TYPE_OSC_SERVER AgsOscServer AgsOscServerClass ags_osc_server_get_type
ags_osc_status_controller AgsOscStatusController ags_osc_status_controller_get_status ags_osc_status_controller_new AGS_IS_OSC_STATUS_CONTROLLER AGS_OSC_STATUS_CONTROLLER AGS_OSC_STATUS_CONTROLLER_CLASS AGS_OSC_STATUS_CONTROLLER_GET_CLASS AGS_TYPE_OSC_STATUS_CONTROLLER AgsOscStatusController AgsOscStatusControllerClass ags_osc_status_controller_get_type
ags_osc_util AGS_OSC_UTIL_TYPE_TAG_STRING_INT32 AGS_OSC_UTIL_TYPE_TAG_STRING_FLOAT AGS_OSC_UTIL_TYPE_TAG_STRING_STRING AGS_OSC_UTIL_TYPE_TAG_STRING_BLOB AGS_OSC_UTIL_TYPE_TAG_STRING_INT64 AGS_OSC_UTIL_TYPE_TAG_STRING_TIMETAG AGS_OSC_UTIL_TYPE_TAG_STRING_DOUBLE AGS_OSC_UTIL_TYPE_TAG_STRING_SYMBOL AGS_OSC_UTIL_TYPE_TAG_STRING_CHAR AGS_OSC_UTIL_TYPE_TAG_STRING_RGBA AGS_OSC_UTIL_TYPE_TAG_STRING_MIDI AGS_OSC_UTIL_TYPE_TAG_STRING_TRUE AGS_OSC_UTIL_TYPE_TAG_STRING_FALSE AGS_OSC_UTIL_TYPE_TAG_STRING_NIL AGS_OSC_UTIL_TYPE_TAG_STRING_INFINITE AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_START AGS_OSC_UTIL_TYPE_TAG_STRING_ARRAY_END AGS_OSC_UTIL_TYPE_TAG_STRING_ALL AGS_OSC_UTIL_ADDRESS_PATTERN_VALID_CHARS_PATTERN AGS_OSC_UTIL_SLIP_CHUNK_LENGTH AGS_OSC_UTIL_SLIP_END AGS_OSC_UTIL_SLIP_ESC AGS_OSC_UTIL_SLIP_ESC_END AGS_OSC_UTIL_SLIP_ESC_ESC ags_osc_util_type_tag_string_count_type ags_osc_util_meta_data ags_osc_util_mime_header ags_osc_util_slip_encode ags_osc_util_slip_decode ags_osc_util_timetag_now
ags_osc_websocket_connection AgsOscWebsocketConnection ags_osc_websocket_connection_find_resource_id ags_osc_websocket_connection_new AGS_IS_OSC_WEBSOCKET_CONNECTION AGS_OSC_WEBSOCKET_CONNECTION AGS_OSC_WEBSOCKET_CONNECTION_CLASS AGS_OSC_WEBSOCKET_CONNECTION_GET_CLASS AGS_TYPE_OSC_WEBSOCKET_CONNECTION AgsOscWebsocketConnection AgsOscWebsocketConnectionClass ags_osc_websocket_connection_get_type
ags_osc_xmlrpc_controller AgsOscXmlrpcController AgsOscXmlrpcControllerFlags ags_osc_xmlrpc_controller_test_flags ags_osc_xmlrpc_controller_set_flags ags_osc_xmlrpc_controller_unset_flags ags_osc_xmlrpc_controller_add_message ags_osc_xmlrpc_controller_remove_message ags_osc_xmlrpc_controller_start_delegate ags_osc_xmlrpc_controller_stop_delegate ags_osc_xmlrpc_controller_new AGS_IS_OSC_XMLRPC_CONTROLLER AGS_OSC_XMLRPC_CONTROLLER AGS_OSC_XMLRPC_CONTROLLER_CLASS AGS_OSC_XMLRPC_CONTROLLER_GET_CLASS AGS_TYPE_OSC_XMLRPC_CONTROLLER AgsOscXmlrpcController AgsOscXmlrpcControllerClass ags_osc_xmlrpc_controller_get_type
ags_osc_xmlrpc_message AgsOscXmlrpcMessage ags_osc_xmlrpc_message_new AGS_IS_OSC_XMLRPC_MESSAGE AGS_OSC_XMLRPC_MESSAGE AGS_OSC_XMLRPC_MESSAGE_CLASS AGS_OSC_XMLRPC_MESSAGE_GET_CLASS AGS_TYPE_OSC_XMLRPC_MESSAGE AgsOscXmlrpcMessage AgsOscXmlrpcMessageClass ags_osc_xmlrpc_message_get_type
ags_osc_xmlrpc_server AgsOscXmlrpcServer AGS_OSC_XMLRPC_SERVER_DEFAULT_CHUNK_SIZE ags_osc_xmlrpc_server_add_websocket_handler ags_osc_xmlrpc_server_add_default_controller ags_osc_xmlrpc_server_new AGS_IS_OSC_XMLRPC_SERVER AGS_OSC_XMLRPC_SERVER AGS_OSC_XMLRPC_SERVER_CLASS AGS_OSC_XMLRPC_SERVER_GET_CLASS AGS_TYPE_OSC_XMLRPC_SERVER AgsOscXmlrpcServer AgsOscXmlrpcServerClass ags_osc_xmlrpc_server_get_type
ags_output AgsOutput ags_output_find_first_input_recycling ags_output_find_last_input_recycling ags_output_new AGS_IS_OUTPUT AGS_OUTPUT AGS_OUTPUT_CLASS AGS_OUTPUT_GET_CLASS AGS_TYPE_OUTPUT AgsOutput AgsOutputClass ags_output_get_type
ags_pattern AgsPattern AGS_PATTERN_GET_OBJ_MUTEX AGS_PATTERN_DEFAULT_BPM AGS_PATTERN_TICS_PER_BEAT AGS_PATTERN_MINIMUM_NOTE_LENGTH AGS_PATTERN_MAXIMUM_NOTE_LENGTH AGS_PATTERN_DEFAULT_LENGTH AGS_PATTERN_DEFAULT_JIFFIE AGS_PATTERN_DEFAULT_DURATION AGS_PATTERN_DEFAULT_OFFSET AgsPatternFlags ags_pattern_test_flags ags_pattern_set_flags ags_pattern_unset_flags ags_pattern_find_near_timestamp ags_pattern_set_dim ags_pattern_is_empty ags_pattern_get_bit ags_pattern_toggle_bit ags_pattern_new AGS_IS_PATTERN AGS_PATTERN AGS_PATTERN_CLASS AGS_PATTERN_GET_CLASS AGS_TYPE_PATTERN AgsPattern AgsPatternClass ags_pattern_get_type
ags_peak_audio_signal AgsPeakAudioSignal ags_peak_audio_signal_new AGS_IS_PEAK_AUDIO_SIGNAL AGS_PEAK_AUDIO_SIGNAL AGS_PEAK_AUDIO_SIGNAL_CLASS AGS_PEAK_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_PEAK_AUDIO_SIGNAL AgsPeakAudioSignal AgsPeakAudioSignalClass ags_peak_audio_signal_get_type
ags_peak_channel AgsPeakChannel ags_peak_channel_buffer_add ags_peak_channel_retrieve_peak_internal ags_peak_channel_new AGS_IS_PEAK_CHANNEL AGS_PEAK_CHANNEL AGS_PEAK_CHANNEL_CLASS AGS_PEAK_CHANNEL_GET_CLASS AGS_TYPE_PEAK_CHANNEL AgsPeakChannel AgsPeakChannelClass ags_peak_channel_get_type
ags_peak_channel_run AgsPeakChannelRun ags_peak_channel_run_new AGS_IS_PEAK_CHANNEL_RUN AGS_PEAK_CHANNEL_RUN AGS_PEAK_CHANNEL_RUN_CLASS AGS_PEAK_CHANNEL_RUN_GET_CLASS AGS_TYPE_PEAK_CHANNEL_RUN AgsPeakChannelRun AgsPeakChannelRunClass ags_peak_channel_run_get_type
ags_peak_recycling AgsPeakRecycling ags_peak_recycling_new AGS_IS_PEAK_RECYCLING AGS_PEAK_RECYCLING AGS_PEAK_RECYCLING_CLASS AGS_PEAK_RECYCLING_GET_CLASS AGS_TYPE_PEAK_RECYCLING AgsPeakRecycling AgsPeakRecyclingClass ags_peak_recycling_get_type
ags_play_audio AgsPlayAudio ags_play_audio_new AGS_IS_PLAY_AUDIO AGS_PLAY_AUDIO AGS_PLAY_AUDIO_CLASS AGS_PLAY_AUDIO_GET_CLASS AGS_TYPE_PLAY_AUDIO AgsPlayAudio AgsPlayAudioClass ags_play_audio_get_type
ags_play_audio_signal AgsPlayAudioSignal ags_play_audio_signal_new AGS_IS_PLAY_AUDIO_SIGNAL AGS_PLAY_AUDIO_SIGNAL AGS_PLAY_AUDIO_SIGNAL_CLASS AGS_PLAY_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_PLAY_AUDIO_SIGNAL AgsPlayAudioSignal AgsPlayAudioSignalClass ags_play_audio_signal_get_type
ags_play_channel AgsPlayChannel ags_play_channel_new AGS_IS_PLAY_CHANNEL AGS_PLAY_CHANNEL AGS_PLAY_CHANNEL_CLASS AGS_PLAY_CHANNEL_GET_CLASS AGS_TYPE_PLAY_CHANNEL AgsPlayChannel AgsPlayChannelClass ags_play_channel_get_type
ags_play_channel_run AgsPlayChannelRun AgsPlayChannelRunFlags ags_play_channel_run_test_flags ags_play_channel_run_set_flags ags_play_channel_run_unset_flags ags_play_channel_run_new AGS_IS_PLAY_CHANNEL_RUN AGS_PLAY_CHANNEL_RUN AGS_PLAY_CHANNEL_RUN_CLASS AGS_PLAY_CHANNEL_RUN_GET_CLASS AGS_TYPE_PLAY_CHANNEL_RUN AgsPlayChannelRun AgsPlayChannelRunClass ags_play_channel_run_get_type
ags_play_channel_run_master AgsPlayChannelRunMaster AGS_PLAY_CHANNEL_RUN_MASTER_STREAMER AgsPlayChannelRunMasterFlags ags_play_channel_run_master_test_flags ags_play_channel_run_master_set_flags ags_play_channel_run_master_unset_flags ags_play_channel_run_master_new AgsPlayChannelRunMasterStreamer AGS_IS_PLAY_CHANNEL_RUN_MASTER AGS_PLAY_CHANNEL_RUN_MASTER AGS_PLAY_CHANNEL_RUN_MASTER_CLASS AGS_PLAY_CHANNEL_RUN_MASTER_GET_CLASS AGS_TYPE_PLAY_CHANNEL_RUN_MASTER AgsPlayChannelRunMaster AgsPlayChannelRunMasterClass ags_play_channel_run_master_get_type
ags_play_dssi_audio AgsPlayDssiAudio ags_play_dssi_audio_load ags_play_dssi_audio_load_ports ags_play_dssi_audio_load_conversion ags_play_dssi_audio_find ags_play_dssi_audio_new AGS_IS_PLAY_DSSI_AUDIO AGS_PLAY_DSSI_AUDIO AGS_PLAY_DSSI_AUDIO_CLASS AGS_PLAY_DSSI_AUDIO_GET_CLASS AGS_TYPE_PLAY_DSSI_AUDIO AgsPlayDssiAudio AgsPlayDssiAudioClass ags_play_dssi_audio_get_type
ags_play_dssi_audio_run AgsPlayDssiAudioRun AGS_PLAY_DSSI_AUDIO_RUN_DEFAULT_MIDI_LENGHT ags_play_dssi_audio_run_load_ports ags_play_dssi_audio_run_new AGS_IS_PLAY_DSSI_AUDIO_RUN AGS_PLAY_DSSI_AUDIO_RUN AGS_PLAY_DSSI_AUDIO_RUN_CLASS AGS_PLAY_DSSI_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_DSSI_AUDIO_RUN AgsPlayDssiAudioRun AgsPlayDssiAudioRunClass ags_play_dssi_audio_run_get_type
ags_play_lv2_audio AgsPlayLv2Audio AgsPlayLv2AudioFLags ags_play_lv2_audio_test_flags ags_play_lv2_audio_set_flags ags_play_lv2_audio_unset_flags ags_play_lv2_audio_load ags_play_lv2_audio_load_ports ags_play_lv2_audio_load_conversion ags_play_lv2_audio_find ags_play_lv2_audio_new AGS_IS_PLAY_LV2_AUDIO AGS_PLAY_LV2_AUDIO AGS_PLAY_LV2_AUDIO_CLASS AGS_PLAY_LV2_AUDIO_GET_CLASS AGS_TYPE_PLAY_LV2_AUDIO AgsPlayLv2Audio AgsPlayLv2AudioClass ags_play_lv2_audio_get_type
ags_play_lv2_audio_run AgsPlayLv2AudioRun AGS_PLAY_LV2_AUDIO_DEFAULT_MIDI_LENGHT ags_play_lv2_audio_run_load_ports ags_play_lv2_audio_run_new AGS_IS_PLAY_LV2_AUDIO_RUN AGS_PLAY_LV2_AUDIO_RUN AGS_PLAY_LV2_AUDIO_RUN_CLASS AGS_PLAY_LV2_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_LV2_AUDIO_RUN AgsPlayLv2AudioRun AgsPlayLv2AudioRunClass ags_play_lv2_audio_run_get_type
ags_play_notation_audio AgsPlayNotationAudio ags_play_notation_audio_new AGS_IS_PLAY_NOTATION_AUDIO AGS_PLAY_NOTATION_AUDIO AGS_PLAY_NOTATION_AUDIO_CLASS AGS_PLAY_NOTATION_AUDIO_GET_CLASS AGS_TYPE_PLAY_NOTATION_AUDIO AgsPlayNotationAudio AgsPlayNotationAudioClass ags_play_notation_audio_get_type
ags_play_notation_audio_run AgsPlayNotationAudioRun ags_play_notation_audio_run_new AGS_IS_PLAY_NOTATION_AUDIO_RUN AGS_PLAY_NOTATION_AUDIO_RUN AGS_PLAY_NOTATION_AUDIO_RUN_CLASS AGS_PLAY_NOTATION_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_NOTATION_AUDIO_RUN AgsPlayNotationAudioRun AgsPlayNotationAudioRunClass ags_play_notation_audio_run_get_type
ags_play_recycling AgsPlayRecycling ags_play_recycling_new AGS_IS_PLAY_RECYCLING AGS_PLAY_RECYCLING AGS_PLAY_RECYCLING_CLASS AGS_PLAY_RECYCLING_GET_CLASS AGS_TYPE_PLAY_RECYCLING AgsPlayRecycling AgsPlayRecyclingClass ags_play_recycling_get_type
ags_play_wave_audio AgsPlayWaveAudio ags_play_wave_audio_new AGS_IS_PLAY_WAVE_AUDIO AGS_PLAY_WAVE_AUDIO AGS_PLAY_WAVE_AUDIO_CLASS AGS_PLAY_WAVE_AUDIO_GET_CLASS AGS_TYPE_PLAY_WAVE_AUDIO AgsPlayWaveAudio AgsPlayWaveAudioClass ags_play_wave_audio_get_type
ags_play_wave_audio_run AgsPlayWaveAudioRun ags_play_wave_audio_run_new AGS_IS_PLAY_WAVE_AUDIO_RUN AGS_PLAY_WAVE_AUDIO_RUN AGS_PLAY_WAVE_AUDIO_RUN_CLASS AGS_PLAY_WAVE_AUDIO_RUN_GET_CLASS AGS_TYPE_PLAY_WAVE_AUDIO_RUN AgsPlayWaveAudioRun AgsPlayWaveAudioRunClass ags_play_wave_audio_run_get_type
ags_play_wave_channel AgsPlayWaveChannel ags_play_wave_channel_new AGS_IS_PLAY_WAVE_CHANNEL AGS_PLAY_WAVE_CHANNEL AGS_PLAY_WAVE_CHANNEL_CLASS AGS_PLAY_WAVE_CHANNEL_GET_CLASS AGS_TYPE_PLAY_WAVE_CHANNEL AgsPlayWaveChannel AgsPlayWaveChannelClass ags_play_wave_channel_get_type
ags_play_wave_channel_run AgsPlayWaveChannelRun ags_play_wave_channel_run_new AGS_IS_PLAY_WAVE_CHANNEL_RUN AGS_PLAY_WAVE_CHANNEL_RUN AGS_PLAY_WAVE_CHANNEL_RUN_CLASS AGS_PLAY_WAVE_CHANNEL_RUN_GET_CLASS AGS_TYPE_PLAY_WAVE_CHANNEL_RUN AgsPlayWaveChannelRun AgsPlayWaveChannelRunClass ags_play_wave_channel_run_get_type
ags_playback AgsPlayback AGS_PLAYBACK_GET_OBJ_MUTEX AgsPlaybackFlags ags_playback_test_flags ags_playback_set_flags ags_playback_unset_flags ags_playback_set_channel_thread ags_playback_get_channel_thread ags_playback_set_recall_id ags_playback_get_recall_id ags_playback_find_channel ags_playback_new AGS_IS_PLAYBACK AGS_PLAYBACK AGS_PLAYBACK_CLASS AGS_PLAYBACK_GET_CLASS AGS_TYPE_PLAYBACK AgsPlayback AgsPlaybackClass ags_playback_get_type
ags_playback_domain AgsPlaybackDomain AGS_PLAYBACK_DOMAIN_GET_OBJ_MUTEX AgsPlaybackDomainFlags ags_playback_domain_test_flags ags_playback_domain_set_flags ags_playback_domain_unset_flags ags_playback_domain_set_audio_thread ags_playback_domain_get_audio_thread ags_playback_domain_add_playback ags_playback_domain_remove_playback ags_playback_domain_new AGS_IS_PLAYBACK_DOMAIN AGS_PLAYBACK_DOMAIN AGS_PLAYBACK_DOMAIN_CLASS AGS_PLAYBACK_DOMAIN_GET_CLASS AGS_TYPE_PLAYBACK_DOMAIN AgsPlaybackDomain AgsPlaybackDomainClass ags_playback_domain_get_type
ags_plugin_port AgsPluginPort AGS_PLUGIN_PORT_GET_OBJ_MUTEX AgsPluginPortFlags ags_plugin_port_test_flags ags_plugin_port_set_flags ags_plugin_port_unset_flags ags_plugin_port_find_symbol ags_plugin_port_find_port_index ags_plugin_port_new AGS_IS_PLUGIN_PORT AGS_PLUGIN_PORT AGS_PLUGIN_PORT_CLASS AGS_PLUGIN_PORT_GET_CLASS AGS_TYPE_PLUGIN_PORT AgsPluginPort AgsPluginPortClass ags_plugin_port_get_type
ags_plugin_stock AGS_PLUGIN_NAME_VOLUME
ags_port AgsPort AGS_PORT_GET_OBJ_MUTEX AgsPortFlags ags_port_test_flags ags_port_set_flags ags_port_unset_flags ags_port_safe_read ags_port_safe_read_raw ags_port_safe_write ags_port_safe_write_raw ags_port_safe_get_property ags_port_safe_set_property ags_port_find_specifier ags_port_add_automation ags_port_remove_automation ags_port_new AGS_IS_PORT AGS_PORT AGS_PORT_CLASS AGS_PORT_GET_CLASS AGS_TYPE_PORT AgsPort AgsPortClass ags_port_get_type
ags_prepare_audio_signal AgsPrepareAudioSignal ags_prepare_audio_signal_new AGS_IS_PREPARE_AUDIO_SIGNAL AGS_PREPARE_AUDIO_SIGNAL AGS_PREPARE_AUDIO_SIGNAL_CLASS AGS_PREPARE_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_PREPARE_AUDIO_SIGNAL AgsPrepareAudioSignal AgsPrepareAudioSignalClass ags_prepare_audio_signal_get_type
ags_prepare_channel AgsPrepareChannel ags_prepare_channel_new AGS_IS_PREPARE_CHANNEL AGS_PREPARE_CHANNEL AGS_PREPARE_CHANNEL_CLASS AGS_PREPARE_CHANNEL_GET_CLASS AGS_TYPE_PREPARE_CHANNEL AgsPrepareChannel AgsPrepareChannelClass ags_prepare_channel_get_type
ags_prepare_channel_run AgsPrepareChannelRun ags_prepare_channel_run_new AGS_IS_PREPARE_CHANNEL_RUN AGS_PREPARE_CHANNEL_RUN AGS_PREPARE_CHANNEL_RUN_CLASS AGS_PREPARE_CHANNEL_RUN_GET_CLASS AGS_TYPE_PREPARE_CHANNEL_RUN AgsPrepareChannelRun AgsPrepareChannelRunClass ags_prepare_channel_run_get_type
ags_prepare_recycling AgsPrepareRecycling ags_prepare_recycling_new AGS_IS_PREPARE_RECYCLING AGS_PREPARE_RECYCLING AGS_PREPARE_RECYCLING_CLASS AGS_PREPARE_RECYCLING_GET_CLASS AGS_TYPE_PREPARE_RECYCLING AgsPrepareRecycling AgsPrepareRecyclingClass ags_prepare_recycling_get_type
ags_preset AgsPreset AGS_PRESET_GET_OBJ_MUTEX AgsPresetFlags AGS_PRESET_ERROR AgsPresetError ags_preset_error_quark ags_preset_test_flags ags_preset_set_flags ags_preset_unset_flags ags_preset_find_scope ags_preset_find_name ags_preset_add_parameter ags_preset_remove_parameter ags_preset_get_parameter ags_preset_new AGS_IS_PRESET AGS_PRESET AGS_PRESET_CLASS AGS_PRESET_GET_CLASS AGS_TYPE_PRESET AgsPreset AgsPresetClass ags_preset_get_type
ags_pulse_client AgsPulseClient AGS_PULSE_CLIENT_GET_OBJ_MUTEX AgsPulseClientFlags ags_pulse_client_test_flags ags_pulse_client_set_flags ags_pulse_client_unset_flags ags_pulse_client_find_uuid ags_pulse_client_find ags_pulse_client_open ags_pulse_client_close ags_pulse_client_add_device ags_pulse_client_remove_device ags_pulse_client_add_port ags_pulse_client_remove_port ags_pulse_client_activate ags_pulse_client_deactivate ags_pulse_client_new AGS_IS_PULSE_CLIENT AGS_PULSE_CLIENT AGS_PULSE_CLIENT_CLASS AGS_PULSE_CLIENT_GET_CLASS AGS_TYPE_PULSE_CLIENT AgsPulseClient AgsPulseClientClass ags_pulse_client_get_type
ags_pulse_devin AgsPulseDevin AGS_PULSE_DEVIN_GET_OBJ_MUTEX AgsPulseDevinFlags AgsPulseDevinSyncFlags AGS_PULSE_DEVIN_ERROR AgsPulseDevinError ags_pulse_devin_error_quark ags_pulse_devin_test_flags ags_pulse_devin_set_flags ags_pulse_devin_unset_flags ags_pulse_devin_switch_buffer_flag ags_pulse_devin_adjust_delay_and_attack ags_pulse_devin_realloc_buffer ags_pulse_devin_new AGS_IS_PULSE_DEVIN AGS_PULSE_DEVIN AGS_PULSE_DEVIN_CLASS AGS_PULSE_DEVIN_GET_CLASS AGS_TYPE_PULSE_DEVIN AgsPulseDevin AgsPulseDevinClass ags_pulse_devin_get_type
ags_pulse_devout AgsPulseDevout AGS_PULSE_DEVOUT_GET_OBJ_MUTEX AgsPulseDevoutFlags AgsPulseDevoutSyncFlags AGS_PULSE_DEVOUT_ERROR AgsPulseDevoutError ags_pulse_devout_error_quark ags_pulse_devout_test_flags ags_pulse_devout_set_flags ags_pulse_devout_unset_flags ags_pulse_devout_switch_buffer_flag ags_pulse_devout_adjust_delay_and_attack ags_pulse_devout_realloc_buffer ags_pulse_devout_new AGS_IS_PULSE_DEVOUT AGS_PULSE_DEVOUT AGS_PULSE_DEVOUT_CLASS AGS_PULSE_DEVOUT_GET_CLASS AGS_TYPE_PULSE_DEVOUT AgsPulseDevout AgsPulseDevoutClass ags_pulse_devout_get_type
ags_pulse_port AgsPulsePort AGS_PULSE_PORT_GET_OBJ_MUTEX AGS_PULSE_PORT_DEFAULT_CACHE_BUFFER_SIZE AgsPulsePortFlags ags_pulse_port_test_flags ags_pulse_port_set_flags ags_pulse_port_unset_flags ags_pulse_port_find ags_pulse_port_register ags_pulse_port_unregister ags_pulse_port_get_fixed_size ags_pulse_port_set_samplerate ags_pulse_port_set_pcm_channels ags_pulse_port_set_buffer_size ags_pulse_port_set_format ags_pulse_port_set_cache_buffer_size ags_pulse_port_get_latency ags_pulse_port_new AGS_IS_PULSE_PORT AGS_PULSE_PORT AGS_PULSE_PORT_CLASS AGS_PULSE_PORT_GET_CLASS AGS_TYPE_PULSE_PORT AgsPulsePort AgsPulsePortClass ags_pulse_port_get_type
ags_pulse_server AgsPulseServer AGS_PULSE_SERVER_GET_OBJ_MUTEX AgsPulseServerFlags ags_pulse_server_test_flags ags_pulse_server_set_flags ags_pulse_server_unset_flags ags_pulse_server_find_url ags_pulse_server_find_client ags_pulse_server_find_port ags_pulse_server_add_client ags_pulse_server_remove_client ags_pulse_server_connect_client ags_pulse_server_disconnect_client ags_pulse_server_start_poll ags_pulse_server_new AGS_IS_PULSE_SERVER AGS_PULSE_SERVER AGS_PULSE_SERVER_CLASS AGS_PULSE_SERVER_GET_CLASS AGS_TYPE_PULSE_SERVER AgsPulseServer AgsPulseServerClass ags_pulse_server_get_type
ags_recall AgsRecall AGS_RECALL_HANDLER AGS_RECALL_GET_OBJ_MUTEX AGS_RECALL_DEFAULT_VERSION AGS_RECALL_DEFAULT_BUILD_ID AgsRecallFlags AgsRecallNotifyDependencyMode AgsRecallHandler ags_recall_global_get_children_lock_free ags_recall_global_get_omit_event ags_recall_global_get_performance_mode ags_recall_global_get_rt_safe ags_recall_test_flags ags_recall_set_flags ags_recall_unset_flags ags_recall_test_ability_flags ags_recall_set_ability_flags ags_recall_unset_ability_flags ags_recall_check_ability_flags ags_recall_match_ability_flags_to_scope ags_recall_test_behaviour_flags ags_recall_set_behaviour_flags ags_recall_unset_behaviour_flags ags_recall_check_behaviour_flags ags_recall_set_sound_scope ags_recall_get_sound_scope ags_recall_check_sound_scope ags_recall_test_staging_flags ags_recall_set_staging_flags ags_recall_unset_staging_flags ags_recall_check_staging_flags ags_recall_test_state_flags ags_recall_set_state_flags ags_recall_unset_state_flags ags_recall_check_state_flags ags_recall_set_recall_id ags_recall_add_recall_dependency ags_recall_remove_recall_dependency ags_recall_add_child ags_recall_remove_child ags_recall_handler_free ags_recall_handler_alloc ags_recall_add_recall_handler ags_recall_remove_recall_handler ags_recall_set_output_soundcard ags_recall_set_input_soundcard ags_recall_set_samplerate ags_recall_set_buffer_size ags_recall_set_format ags_recall_resolve_dependency ags_recall_check_rt_data ags_recall_run_init_pre ags_recall_run_init_inter ags_recall_run_init_post ags_recall_feed_input_queue ags_recall_automate ags_recall_run_pre ags_recall_run_inter ags_recall_run_post ags_recall_do_feedback ags_recall_feed_output_queue ags_recall_stop_persistent ags_recall_cancel ags_recall_done ags_recall_duplicate ags_recall_notify_dependency ags_recall_child_added ags_recall_is_done ags_recall_get_by_effect ags_recall_find_recall_id_with_effect ags_recall_find_type ags_recall_find_template ags_recall_template_find_type ags_recall_template_find_all_type ags_recall_find_type_with_recycling_context ags_recall_find_recycling_context ags_recall_find_provider ags_recall_template_find_provider ags_recall_find_provider_with_recycling_context ags_recall_lock_port ags_recall_unlock_port ags_recall_new AGS_IS_RECALL AGS_RECALL AGS_RECALL_CLASS AGS_RECALL_GET_CLASS AGS_TYPE_RECALL AgsRecall AgsRecallClass ags_recall_get_type
ags_recall_audio AgsRecallAudio ags_recall_audio_new AGS_IS_RECALL_AUDIO AGS_RECALL_AUDIO AGS_RECALL_AUDIO_CLASS AGS_RECALL_AUDIO_GET_CLASS AGS_TYPE_RECALL_AUDIO AgsRecallAudio AgsRecallAudioClass ags_recall_audio_get_type
ags_recall_audio_run AgsRecallAudioRun ags_recall_audio_run_new AGS_IS_RECALL_AUDIO_RUN AGS_RECALL_AUDIO_RUN AGS_RECALL_AUDIO_RUN_CLASS AGS_RECALL_AUDIO_RUN_GET_CLASS AGS_TYPE_RECALL_AUDIO_RUN AgsRecallAudioRun AgsRecallAudioRunClass ags_recall_audio_run_get_type
ags_recall_audio_signal AgsRecallAudioSignal ags_recall_audio_signal_new AGS_IS_RECALL_AUDIO_SIGNAL AGS_RECALL_AUDIO_SIGNAL AGS_RECALL_AUDIO_SIGNAL_CLASS AGS_RECALL_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_RECALL_AUDIO_SIGNAL AgsRecallAudioSignal AgsRecallAudioSignalClass ags_recall_audio_signal_get_type
ags_recall_channel AgsRecallChannel ags_recall_channel_find_channel ags_recall_channel_new AGS_IS_RECALL_CHANNEL AGS_RECALL_CHANNEL AGS_RECALL_CHANNEL_CLASS AGS_RECALL_CHANNEL_GET_CLASS AGS_TYPE_RECALL_CHANNEL AgsRecallChannel AgsRecallChannelClass ags_recall_channel_get_type
ags_recall_channel_run AgsRecallChannelRun ags_recall_channel_run_new AGS_IS_RECALL_CHANNEL_RUN AGS_RECALL_CHANNEL_RUN AGS_RECALL_CHANNEL_RUN_CLASS AGS_RECALL_CHANNEL_RUN_GET_CLASS AGS_TYPE_RECALL_CHANNEL_RUN AgsRecallChannelRun AgsRecallChannelRunClass ags_recall_channel_run_get_type
ags_recall_container AgsRecallContainer AGS_RECALL_CONTAINER_GET_OBJ_MUTEX AgsRecallContainerFlags AgsRecallContainerFindFlags ags_recall_container_test_flags ags_recall_container_set_flags ags_recall_container_unset_flags ags_recall_container_add ags_recall_container_remove ags_recall_container_get_recall_audio ags_recall_container_get_recall_audio_run ags_recall_container_get_recall_channel ags_recall_container_get_recall_channel_run ags_recall_container_find ags_recall_container_new AGS_IS_RECALL_CONTAINER AGS_RECALL_CONTAINER AGS_RECALL_CONTAINER_CLASS AGS_RECALL_CONTAINER_GET_CLASS AGS_TYPE_RECALL_CONTAINER AgsRecallContainer AgsRecallContainerClass ags_recall_container_get_type
ags_recall_dependency AgsRecallDependency AGS_RECALL_DEPENDENCY_GET_OBJ_MUTEX ags_recall_dependency_find_dependency ags_recall_dependency_find_dependency_by_provider ags_recall_dependency_resolve ags_recall_dependency_new AGS_IS_RECALL_DEPENDENCY AGS_RECALL_DEPENDENCY AGS_RECALL_DEPENDENCY_CLASS AGS_RECALL_DEPENDENCY_GET_CLASS AGS_TYPE_RECALL_DEPENDENCY AgsRecallDependency AgsRecallDependencyClass ags_recall_dependency_get_type
ags_recall_dssi AgsRecallDssi ags_recall_dssi_load ags_recall_dssi_load_ports ags_recall_dssi_load_conversion ags_recall_dssi_find ags_recall_dssi_new AGS_IS_RECALL_DSSI AGS_RECALL_DSSI AGS_RECALL_DSSI_CLASS AGS_RECALL_DSSI_GET_CLASS AGS_TYPE_RECALL_DSSI AgsRecallDssi AgsRecallDssiClass ags_recall_dssi_get_type
ags_recall_dssi_run AgsRecallDssiRun ags_recall_dssi_run_new AGS_IS_RECALL_DSSI_RUN AGS_RECALL_DSSI_RUN AGS_RECALL_DSSI_RUN_CLASS AGS_RECALL_DSSI_RUN_GET_CLASS AGS_TYPE_RECALL_DSSI_RUN AgsRecallDssiRun AgsRecallDssiRunClass ags_recall_dssi_run_get_type
ags_recall_factory AgsRecallFactory AgsRecallFactoryCreateFlags ags_recall_factory_create ags_recall_factory_new AGS_IS_RECALL_FACTORY AGS_RECALL_FACTORY AGS_RECALL_FACTORY_CLASS AGS_RECALL_FACTORY_GET_CLASS AGS_TYPE_RECALL_FACTORY AgsRecallFactory AgsRecallFactoryClass ags_recall_factory_get_type
ags_recall_id AgsRecallID AGS_RECALL_ID_GET_OBJ_MUTEX ags_recall_id_set_sound_scope ags_recall_id_check_sound_scope ags_recall_id_test_staging_flags ags_recall_id_set_staging_flags ags_recall_id_unset_staging_flags ags_recall_id_check_staging_flags ags_recall_id_test_state_flags ags_recall_id_set_state_flags ags_recall_id_unset_state_flags ags_recall_id_check_state_flags ags_recall_id_find_recycling_context ags_recall_id_find_parent_recycling_context ags_recall_id_new AGS_IS_RECALL_ID AGS_RECALL_ID AGS_RECALL_ID_CLASS AGS_RECALL_ID_GET_CLASS AGS_TYPE_RECALL_ID AgsRecallID AgsRecallIDClass ags_recall_id_get_type
ags_recall_ladspa AgsRecallLadspa ags_recall_ladspa_load ags_recall_ladspa_load_ports ags_recall_ladspa_load_conversion ags_recall_ladspa_find ags_recall_ladspa_new AGS_IS_RECALL_LADSPA AGS_RECALL_LADSPA AGS_RECALL_LADSPA_CLASS AGS_RECALL_LADSPA_GET_CLASS AGS_TYPE_RECALL_LADSPA AgsRecallLadspa AgsRecallLadspaClass ags_recall_ladspa_get_type
ags_recall_ladspa_run AgsRecallLadspaRun ags_recall_ladspa_run_new AGS_IS_RECALL_LADSPA_RUN AGS_RECALL_LADSPA_RUN AGS_RECALL_LADSPA_RUN_CLASS AGS_RECALL_LADSPA_RUN_GET_CLASS AGS_TYPE_RECALL_LADSPA_RUN AgsRecallLadspaRun AgsRecallLadspaRunClass ags_recall_ladspa_run_get_type
ags_recall_lv2 AgsRecallLv2 AgsRecallLv2FLags ags_recall_lv2_test_flags ags_recall_lv2_set_flags ags_recall_lv2_unset_flags ags_recall_lv2_load ags_recall_lv2_load_ports ags_recall_lv2_load_conversion ags_recall_lv2_find ags_recall_lv2_new AGS_IS_RECALL_LV2 AGS_RECALL_LV2 AGS_RECALL_LV2_CLASS AGS_RECALL_LV2_GET_CLASS AGS_TYPE_RECALL_LV2 AgsRecallLv2 AgsRecallLv2Class ags_recall_lv2_get_type
ags_recall_lv2_run AgsRecallLv2Run AGS_RECALL_LV2_DEFAULT_MIDI_LENGHT ags_recall_lv2_run_new AGS_IS_RECALL_LV2_RUN AGS_RECALL_LV2_RUN AGS_RECALL_LV2_RUN_CLASS AGS_RECALL_LV2_RUN_GET_CLASS AGS_TYPE_RECALL_LV2_RUN AgsRecallLv2Run AgsRecallLv2RunClass ags_recall_lv2_run_get_type
ags_recall_recycling AgsRecallRecycling AgsRecallRecyclingFlags ags_recall_recycling_new AGS_IS_RECALL_RECYCLING AGS_RECALL_RECYCLING AGS_RECALL_RECYCLING_CLASS AGS_RECALL_RECYCLING_GET_CLASS AGS_TYPE_RECALL_RECYCLING AgsRecallRecycling AgsRecallRecyclingClass ags_recall_recycling_get_type
ags_record_midi_audio AgsRecordMidiAudio ags_record_midi_audio_new AGS_IS_RECORD_MIDI_AUDIO AGS_RECORD_MIDI_AUDIO AGS_RECORD_MIDI_AUDIO_CLASS AGS_RECORD_MIDI_AUDIO_GET_CLASS AGS_TYPE_RECORD_MIDI_AUDIO AgsRecordMidiAudio AgsRecordMidiAudioClass ags_record_midi_audio_get_type
ags_record_midi_audio_run AgsRecordMidiAudioRun ags_record_midi_audio_run_new AGS_IS_RECORD_MIDI_AUDIO_RUN AGS_RECORD_MIDI_AUDIO_RUN AGS_RECORD_MIDI_AUDIO_RUN_CLASS AGS_RECORD_MIDI_AUDIO_RUN_GET_CLASS AGS_TYPE_RECORD_MIDI_AUDIO_RUN AgsRecordMidiAudioRun AgsRecordMidiAudioRunClass ags_record_midi_audio_run_get_type
ags_recycling AgsRecycling AGS_RECYCLING_GET_OBJ_MUTEX AgsRecyclingFlags ags_recycling_test_flags ags_recycling_set_flags ags_recycling_unset_flags ags_recycling_next ags_recycling_prev ags_recycling_set_output_soundcard ags_recycling_set_input_soundcard ags_recycling_set_samplerate ags_recycling_set_buffer_size ags_recycling_set_format ags_recycling_add_audio_signal ags_recycling_remove_audio_signal ags_recycling_data_request ags_recycling_position ags_recycling_find_next_channel ags_recycling_is_active ags_recycling_create_audio_signal_with_defaults ags_recycling_create_audio_signal_with_frame_count ags_recycling_new AGS_IS_RECYCLING AGS_RECYCLING AGS_RECYCLING_CLASS AGS_RECYCLING_GET_CLASS AGS_TYPE_RECYCLING AgsRecycling AgsRecyclingClass ags_recycling_get_type
ags_recycling_context AgsRecyclingContext AGS_RECYCLING_CONTEXT_GET_OBJ_MUTEX AgsRecyclingContextFlags ags_recycling_context_find_scope ags_recycling_context_replace ags_recycling_context_add ags_recycling_context_remove ags_recycling_context_insert ags_recycling_context_get_toplevel ags_recycling_context_find ags_recycling_context_find_child ags_recycling_context_find_parent ags_recycling_context_add_child ags_recycling_context_remove_child ags_recycling_context_get_child_recall_id ags_recycling_context_reset_recycling ags_recycling_context_new AGS_IS_RECYCLING_CONTEXT AGS_RECYCLING_CONTEXT AGS_RECYCLING_CONTEXT_CLASS AGS_RECYCLING_CONTEXT_GET_CLASS AGS_TYPE_RECYCLING_CONTEXT AgsRecyclingContext AgsRecyclingContextClass ags_recycling_context_get_type
ags_remove_audio AgsRemoveAudio ags_remove_audio_new AGS_IS_REMOVE_AUDIO AGS_REMOVE_AUDIO AGS_REMOVE_AUDIO_CLASS AGS_REMOVE_AUDIO_GET_CLASS AGS_TYPE_REMOVE_AUDIO AgsRemoveAudio AgsRemoveAudioClass ags_remove_audio_get_type
ags_remove_audio_signal AgsRemoveAudioSignal ags_remove_audio_signal_new AGS_IS_REMOVE_AUDIO_SIGNAL AGS_REMOVE_AUDIO_SIGNAL AGS_REMOVE_AUDIO_SIGNAL_CLASS AGS_REMOVE_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_REMOVE_AUDIO_SIGNAL AgsRemoveAudioSignal AgsRemoveAudioSignalClass ags_remove_audio_signal_get_type
ags_remove_note AgsRemoveNote ags_remove_note_new AGS_IS_REMOVE_NOTE AGS_REMOVE_NOTE AGS_REMOVE_NOTE_CLASS AGS_REMOVE_NOTE_GET_CLASS AGS_TYPE_REMOVE_NOTE AgsRemoveNote AgsRemoveNoteClass ags_remove_note_get_type
ags_remove_soundcard AgsRemoveSoundcard ags_remove_soundcard_new AGS_IS_REMOVE_SOUNDCARD AGS_REMOVE_SOUNDCARD AGS_REMOVE_SOUNDCARD_CLASS AGS_REMOVE_SOUNDCARD_GET_CLASS AGS_TYPE_REMOVE_SOUNDCARD AgsRemoveSoundcard AgsRemoveSoundcardClass ags_remove_soundcard_get_type
ags_reset_amplitude AgsResetAmplitude ags_reset_amplitude_add ags_reset_amplitude_remove ags_reset_amplitude_get_instance ags_reset_amplitude_new AGS_IS_RESET_AMPLITUDE AGS_RESET_AMPLITUDE AGS_RESET_AMPLITUDE_CLASS AGS_RESET_AMPLITUDE_GET_CLASS AGS_TYPE_RESET_AMPLITUDE AgsResetAmplitude AgsResetAmplitudeClass ags_reset_amplitude_get_type
ags_reset_note AgsResetNote ags_reset_note_add ags_reset_note_remove ags_reset_note_get_instance ags_reset_note_new AGS_IS_RESET_NOTE AGS_RESET_NOTE AGS_RESET_NOTE_CLASS AGS_RESET_NOTE_GET_CLASS AGS_TYPE_RESET_NOTE AgsResetNote AgsResetNoteClass ags_reset_note_get_type
ags_reset_peak AgsResetPeak ags_reset_peak_add ags_reset_peak_remove ags_reset_peak_get_instance ags_reset_peak_new AGS_IS_RESET_PEAK AGS_RESET_PEAK AGS_RESET_PEAK_CLASS AGS_RESET_PEAK_GET_CLASS AGS_TYPE_RESET_PEAK AgsResetPeak AgsResetPeakClass ags_reset_peak_get_type
ags_resize_audio AgsResizeAudio ags_resize_audio_new AGS_IS_RESIZE_AUDIO AGS_RESIZE_AUDIO AGS_RESIZE_AUDIO_CLASS AGS_RESIZE_AUDIO_GET_CLASS AGS_TYPE_RESIZE_AUDIO AgsResizeAudio AgsResizeAudioClass ags_resize_audio_get_type
ags_route_dssi_audio AgsRouteDssiAudio ags_route_dssi_audio_new AGS_IS_ROUTE_DSSI_AUDIO AGS_ROUTE_DSSI_AUDIO AGS_ROUTE_DSSI_AUDIO_CLASS AGS_ROUTE_DSSI_AUDIO_GET_CLASS AGS_TYPE_ROUTE_DSSI_AUDIO AgsRouteDssiAudio AgsRouteDssiAudioClass ags_route_dssi_audio_get_type
ags_route_dssi_audio_run AgsRouteDssiAudioRun ags_route_dssi_audio_run_new AGS_IS_ROUTE_DSSI_AUDIO_RUN AGS_ROUTE_DSSI_AUDIO_RUN AGS_ROUTE_DSSI_AUDIO_RUN_CLASS AGS_ROUTE_DSSI_AUDIO_RUN_GET_CLASS AGS_TYPE_ROUTE_DSSI_AUDIO_RUN AgsRouteDssiAudioRun AgsRouteDssiAudioRunClass ags_route_dssi_audio_run_get_type
ags_route_lv2_audio AgsRouteLv2Audio ags_route_lv2_audio_new AGS_IS_ROUTE_LV2_AUDIO AGS_ROUTE_LV2_AUDIO AGS_ROUTE_LV2_AUDIO_CLASS AGS_ROUTE_LV2_AUDIO_GET_CLASS AGS_TYPE_ROUTE_LV2_AUDIO AgsRouteLv2Audio AgsRouteLv2AudioClass ags_route_lv2_audio_get_type
ags_route_lv2_audio_run AgsRouteLv2AudioRun ags_route_lv2_audio_run_new AGS_IS_ROUTE_LV2_AUDIO_RUN AGS_ROUTE_LV2_AUDIO_RUN AGS_ROUTE_LV2_AUDIO_RUN_CLASS AGS_ROUTE_LV2_AUDIO_RUN_GET_CLASS AGS_TYPE_ROUTE_LV2_AUDIO_RUN AgsRouteLv2AudioRun AgsRouteLv2AudioRunClass ags_route_lv2_audio_run_get_type
ags_rt_stream_audio_signal AgsRtStreamAudioSignal ags_rt_stream_audio_signal_new AGS_IS_RT_STREAM_AUDIO_SIGNAL AGS_RT_STREAM_AUDIO_SIGNAL AGS_RT_STREAM_AUDIO_SIGNAL_CLASS AGS_RT_STREAM_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_RT_STREAM_AUDIO_SIGNAL AgsRtStreamAudioSignal AgsRtStreamAudioSignalClass ags_rt_stream_audio_signal_get_type
ags_rt_stream_channel AgsRtStreamChannel ags_rt_stream_channel_new AGS_IS_RT_STREAM_CHANNEL AGS_RT_STREAM_CHANNEL AGS_RT_STREAM_CHANNEL_CLASS AGS_RT_STREAM_CHANNEL_GET_CLASS AGS_TYPE_RT_STREAM_CHANNEL AgsRtStreamChannel AgsRtStreamChannelClass ags_rt_stream_channel_get_type
ags_rt_stream_channel_run AgsRtStreamChannelRun ags_rt_stream_channel_run_new AGS_IS_RT_STREAM_CHANNEL_RUN AGS_RT_STREAM_CHANNEL_RUN AGS_RT_STREAM_CHANNEL_RUN_CLASS AGS_RT_STREAM_CHANNEL_RUN_GET_CLASS AGS_TYPE_RT_STREAM_CHANNEL_RUN AgsRtStreamChannelRun AgsRtStreamChannelRunClass ags_rt_stream_channel_run_get_type
ags_rt_stream_recycling AgsRtStreamRecycling ags_rt_stream_recycling_new AGS_IS_RT_STREAM_RECYCLING AGS_RT_STREAM_RECYCLING AGS_RT_STREAM_RECYCLING_CLASS AGS_RT_STREAM_RECYCLING_GET_CLASS AGS_TYPE_RT_STREAM_RECYCLING AgsRtStreamRecycling AgsRtStreamRecyclingClass ags_rt_stream_recycling_get_type
ags_seek_soundcard AgsSeekSoundcard ags_seek_soundcard_new AGS_IS_SEEK_SOUNDCARD AGS_SEEK_SOUNDCARD AGS_SEEK_SOUNDCARD_CLASS AGS_SEEK_SOUNDCARD_GET_CLASS AGS_TYPE_SEEK_SOUNDCARD AgsSeekSoundcard AgsSeekSoundcardClass ags_seek_soundcard_get_type
ags_sequencer_thread AgsSequencerThread AGS_SEQUENCER_THREAD_DEFAULT_JIFFIE ags_sequencer_thread_interval_timeout ags_sequencer_thread_find_sequencer ags_sequencer_thread_new AGS_IS_SEQUENCER_THREAD AGS_SEQUENCER_THREAD AGS_SEQUENCER_THREAD_CLASS AGS_SEQUENCER_THREAD_GET_CLASS AGS_TYPE_SEQUENCER_THREAD AgsSequencerThread AgsSequencerThreadClass ags_sequencer_thread_get_type
ags_sequencer_util ags_sequencer_util_get_obj_mutex
ags_set_audio_channels AgsSetAudioChannels ags_set_audio_channels_new AGS_IS_SET_AUDIO_CHANNELS AGS_SET_AUDIO_CHANNELS AGS_SET_AUDIO_CHANNELS_CLASS AGS_SET_AUDIO_CHANNELS_GET_CLASS AGS_TYPE_SET_AUDIO_CHANNELS AgsSetAudioChannels AgsSetAudioChannelsClass ags_set_audio_channels_get_type
ags_set_buffer_size AgsSetBufferSize ags_set_buffer_size_new AGS_IS_SET_BUFFER_SIZE AGS_SET_BUFFER_SIZE AGS_SET_BUFFER_SIZE_CLASS AGS_SET_BUFFER_SIZE_GET_CLASS AGS_TYPE_SET_BUFFER_SIZE AgsSetBufferSize AgsSetBufferSizeClass ags_set_buffer_size_get_type
ags_set_device AgsSetDevice ags_set_device_new AGS_IS_SET_DEVICE AGS_SET_DEVICE AGS_SET_DEVICE_CLASS AGS_SET_DEVICE_GET_CLASS AGS_TYPE_SET_DEVICE AgsSetDevice AgsSetDeviceClass ags_set_device_get_type
ags_set_format AgsSetFormat ags_set_format_new AGS_IS_SET_FORMAT AGS_SET_FORMAT AGS_SET_FORMAT_CLASS AGS_SET_FORMAT_GET_CLASS AGS_TYPE_SET_FORMAT AgsSetFormat AgsSetFormatClass ags_set_format_get_type
ags_set_muted AgsSetMuted ags_set_muted_new AGS_IS_SET_MUTED AGS_SET_MUTED AGS_SET_MUTED_CLASS AGS_SET_MUTED_GET_CLASS AGS_TYPE_SET_MUTED AgsSetMuted AgsSetMutedClass ags_set_muted_get_type
ags_set_samplerate AgsSetSamplerate ags_set_samplerate_new AGS_IS_SET_SAMPLERATE AGS_SET_SAMPLERATE AGS_SET_SAMPLERATE_CLASS AGS_SET_SAMPLERATE_GET_CLASS AGS_TYPE_SET_SAMPLERATE AgsSetSamplerate AgsSetSamplerateClass ags_set_samplerate_get_type
ags_sf2_loader AgsSF2Loader AGS_SF2_LOADER_GET_OBJ_MUTEX AgsSF2LoaderFlags ags_sf2_loader_test_flags ags_sf2_loader_set_flags ags_sf2_loader_unset_flags ags_sf2_loader_start ags_sf2_loader_new AGS_IS_SF2_LOADER AGS_SF2_LOADER AGS_SF2_LOADER_CLASS AGS_SF2_LOADER_GET_CLASS AGS_TYPE_SF2_LOADER AgsSF2Loader AgsSF2LoaderClass ags_sf2_loader_get_type
ags_sfz_file AgsSFZFile AGS_SFZ_FILE_GET_OBJ_MUTEX AGS_SFZ_FILE_DEFAULT_CHANNELS AGS_SFZ_FILE_LOOP_MAX AGS_SFZ_FILE_READ AGS_SFZ_FILE_WRITE AgsSFZFileFlags AgsSFZLevel ags_sfz_file_test_flags ags_sfz_file_set_flags ags_sfz_file_unset_flags ags_sfz_file_select_sample ags_sfz_file_get_range ags_sfz_file_check_suffix ags_sfz_file_parse ags_sfz_file_new AGS_IS_SFZ_FILE AGS_SFZ_FILE AGS_SFZ_FILE_CLASS AGS_SFZ_FILE_GET_CLASS AGS_TYPE_SFZ_FILE AgsSFZFile AgsSFZFileClass ags_sfz_file_get_type
ags_sfz_group AgsSFZGroup AGS_SFZ_GROUP_GET_OBJ_MUTEX AgsSFZGroupFlags ags_sfz_group_test_flags ags_sfz_group_set_flags ags_sfz_group_unset_flags ags_sfz_group_insert_control ags_sfz_group_lookup_control ags_sfz_group_new AGS_IS_SFZ_GROUP AGS_SFZ_GROUP AGS_SFZ_GROUP_CLASS AGS_SFZ_GROUP_GET_CLASS AGS_TYPE_SFZ_GROUP AgsSFZGroup AgsSFZGroupClass ags_sfz_group_get_type
ags_sfz_loader AgsSFZLoader AGS_SFZ_LOADER_GET_OBJ_MUTEX AgsSFZLoaderFlags ags_sfz_loader_test_flags ags_sfz_loader_set_flags ags_sfz_loader_unset_flags ags_sfz_loader_start ags_sfz_loader_new AGS_IS_SFZ_LOADER AGS_SFZ_LOADER AGS_SFZ_LOADER_CLASS AGS_SFZ_LOADER_GET_CLASS AGS_TYPE_SFZ_LOADER AgsSFZLoader AgsSFZLoaderClass ags_sfz_loader_get_type
ags_sfz_region AgsSFZRegion AGS_SFZ_REGION_GET_OBJ_MUTEX AgsSFZRegionFlags ags_sfz_region_test_flags ags_sfz_region_set_flags ags_sfz_region_unset_flags ags_sfz_region_insert_control ags_sfz_region_lookup_control ags_sfz_region_new AGS_IS_SFZ_REGION AGS_SFZ_REGION AGS_SFZ_REGION_CLASS AGS_SFZ_REGION_GET_CLASS AGS_TYPE_SFZ_REGION AgsSFZRegion AgsSFZRegionClass ags_sfz_region_get_type
ags_sfz_sample AgsSFZSample AGS_SFZ_SAMPLE_GET_OBJ_MUTEX AgsSFZSampleFlags ags_sfz_sample_test_flags ags_sfz_sample_set_flags ags_sfz_sample_unset_flags ags_sfz_sample_new AGS_IS_SFZ_SAMPLE AGS_SFZ_SAMPLE AGS_SFZ_SAMPLE_CLASS AGS_SFZ_SAMPLE_GET_CLASS AGS_TYPE_SFZ_SAMPLE AgsSFZSample AgsSFZSampleClass ags_sfz_sample_get_type
ags_sndfile AgsSndfile AGS_SNDFILE_GET_OBJ_MUTEX AgsSndfileFlags ags_sndfile_test_flags ags_sndfile_set_flags ags_sndfile_unset_flags ags_sndfile_new AGS_IS_SNDFILE AGS_SNDFILE AGS_SNDFILE_CLASS AGS_SNDFILE_GET_CLASS AGS_TYPE_SNDFILE AgsSndfile AgsSndfileClass ags_sndfile_get_type
ags_sound_container AgsSoundContainer ags_sound_container_open ags_sound_container_get_level_count ags_sound_container_get_nesting_level ags_sound_container_get_level_id ags_sound_container_get_level_index ags_sound_container_get_sublevel_name ags_sound_container_level_up ags_sound_container_select_level_by_id ags_sound_container_select_level_by_index ags_sound_container_get_resource_all ags_sound_container_get_resource_by_name ags_sound_container_get_resource_by_index ags_sound_container_get_resource_current ags_sound_container_close AGS_IS_SOUND_CONTAINER AGS_IS_SOUND_CONTAINER_INTERFACE AGS_SOUND_CONTAINER AGS_SOUND_CONTAINER_GET_INTERFACE AGS_SOUND_CONTAINER_INTERFACE AGS_TYPE_SOUND_CONTAINER AgsSoundContainer AgsSoundContainerInterface ags_sound_container_get_type
ags_sound_enums AgsSoundAbilityFlags AgsSoundBehaviourFlags AgsSoundScope AgsSoundStagingFlags AgsSoundStateFlags
ags_sound_provider AgsSoundProvider ags_sound_provider_set_default_soundcard ags_sound_provider_get_default_soundcard ags_sound_provider_set_default_soundcard_thread ags_sound_provider_get_default_soundcard_thread ags_sound_provider_set_soundcard ags_sound_provider_get_soundcard ags_sound_provider_set_sequencer ags_sound_provider_get_sequencer ags_sound_provider_set_audio ags_sound_provider_get_audio ags_sound_provider_set_sound_server ags_sound_provider_get_sound_server ags_sound_provider_set_osc_server ags_sound_provider_get_osc_server AGS_IS_SOUND_PROVIDER AGS_IS_SOUND_PROVIDER_INTERFACE AGS_SOUND_PROVIDER AGS_SOUND_PROVIDER_GET_INTERFACE AGS_SOUND_PROVIDER_INTERFACE AGS_TYPE_SOUND_PROVIDER AgsSoundProvider AgsSoundProviderInterface ags_sound_provider_get_type
ags_sound_resource AgsSoundResource ags_sound_resource_open ags_sound_resource_rw_open ags_sound_resource_load ags_sound_resource_info ags_sound_resource_set_presets ags_sound_resource_get_presets ags_sound_resource_read ags_sound_resource_write ags_sound_resource_flush ags_sound_resource_seek ags_sound_resource_read_audio_signal ags_sound_resource_read_wave ags_sound_resource_close AGS_IS_SOUND_RESOURCE AGS_IS_SOUND_RESOURCE_INTERFACE AGS_SOUND_RESOURCE AGS_SOUND_RESOURCE_GET_INTERFACE AGS_SOUND_RESOURCE_INTERFACE AGS_TYPE_SOUND_RESOURCE AgsSoundResource AgsSoundResourceInterface ags_sound_resource_get_type
ags_soundcard_thread AgsSoundcardThread AGS_SOUNDCARD_THREAD_DEFAULT_JIFFIE ags_soundcard_thread_find_soundcard ags_soundcard_thread_new AGS_IS_SOUNDCARD_THREAD AGS_SOUNDCARD_THREAD AGS_SOUNDCARD_THREAD_CLASS AGS_SOUNDCARD_THREAD_GET_CLASS AGS_TYPE_SOUNDCARD_THREAD AgsSoundcardThread AgsSoundcardThreadClass ags_soundcard_thread_get_type
ags_soundcard_util ags_soundcard_util_get_obj_mutex
ags_start_audio AgsStartAudio ags_start_audio_new AGS_IS_START_AUDIO AGS_START_AUDIO AGS_START_AUDIO_CLASS AGS_START_AUDIO_GET_CLASS AGS_TYPE_START_AUDIO AgsStartAudio AgsStartAudioClass ags_start_audio_get_type
ags_start_channel AgsStartChannel ags_start_channel_new AGS_IS_START_CHANNEL AGS_START_CHANNEL AGS_START_CHANNEL_CLASS AGS_START_CHANNEL_GET_CLASS AGS_TYPE_START_CHANNEL AgsStartChannel AgsStartChannelClass ags_start_channel_get_type
ags_start_sequencer AgsStartSequencer ags_start_sequencer_new AGS_IS_START_SEQUENCER AGS_START_SEQUENCER AGS_START_SEQUENCER_CLASS AGS_START_SEQUENCER_GET_CLASS AGS_TYPE_START_SEQUENCER AgsStartSequencer AgsStartSequencerClass ags_start_sequencer_get_type
ags_start_soundcard AgsStartSoundcard ags_start_soundcard_new AGS_IS_START_SOUNDCARD AGS_START_SOUNDCARD AGS_START_SOUNDCARD_CLASS AGS_START_SOUNDCARD_GET_CLASS AGS_TYPE_START_SOUNDCARD AgsStartSoundcard AgsStartSoundcardClass ags_start_soundcard_get_type
ags_stop_sequencer AgsStopSequencer ags_stop_sequencer_new AGS_IS_STOP_SEQUENCER AGS_STOP_SEQUENCER AGS_STOP_SEQUENCER_CLASS AGS_STOP_SEQUENCER_GET_CLASS AGS_TYPE_STOP_SEQUENCER AgsStopSequencer AgsStopSequencerClass ags_stop_sequencer_get_type
ags_stop_soundcard AgsStopSoundcard ags_stop_soundcard_new AGS_IS_STOP_SOUNDCARD AGS_STOP_SOUNDCARD AGS_STOP_SOUNDCARD_CLASS AGS_STOP_SOUNDCARD_GET_CLASS AGS_TYPE_STOP_SOUNDCARD AgsStopSoundcard AgsStopSoundcardClass ags_stop_soundcard_get_type
ags_stream_audio_signal AgsStreamAudioSignal ags_stream_audio_signal_new AGS_IS_STREAM_AUDIO_SIGNAL AGS_STREAM_AUDIO_SIGNAL AGS_STREAM_AUDIO_SIGNAL_CLASS AGS_STREAM_AUDIO_SIGNAL_GET_CLASS AGS_TYPE_STREAM_AUDIO_SIGNAL AgsStreamAudioSignal AgsStreamAudioSignalClass ags_stream_audio_signal_get_type
ags_stream_channel AgsStreamChannel ags_stream_channel_new AGS_IS_STREAM_CHANNEL AGS_STREAM_CHANNEL AGS_STREAM_CHANNEL_CLASS AGS_STREAM_CHANNEL_GET_CLASS AGS_TYPE_STREAM_CHANNEL AgsStreamChannel AgsStreamChannelClass ags_stream_channel_get_type
ags_stream_channel_run AgsStreamChannelRun ags_stream_channel_run_new AGS_IS_STREAM_CHANNEL_RUN AGS_STREAM_CHANNEL_RUN AGS_STREAM_CHANNEL_RUN_CLASS AGS_STREAM_CHANNEL_RUN_GET_CLASS AGS_TYPE_STREAM_CHANNEL_RUN AgsStreamChannelRun AgsStreamChannelRunClass ags_stream_channel_run_get_type
ags_stream_recycling AgsStreamRecycling ags_stream_recycling_new AGS_IS_STREAM_RECYCLING AGS_STREAM_RECYCLING AGS_STREAM_RECYCLING_CLASS AGS_STREAM_RECYCLING_GET_CLASS AGS_TYPE_STREAM_RECYCLING AgsStreamRecycling AgsStreamRecyclingClass ags_stream_recycling_get_type
ags_switch_buffer_flag AgsSwitchBufferFlag ags_switch_buffer_flag_new AGS_IS_SWITCH_BUFFER_FLAG AGS_SWITCH_BUFFER_FLAG AGS_SWITCH_BUFFER_FLAG_CLASS AGS_SWITCH_BUFFER_FLAG_GET_CLASS AGS_TYPE_SWITCH_BUFFER_FLAG AgsSwitchBufferFlag AgsSwitchBufferFlagClass ags_switch_buffer_flag_get_type
ags_synth_enums AgsSynthOscillatorMode
ags_synth_generator AgsSynthGenerator AGS_SYNTH_GENERATOR_GET_OBJ_MUTEX AGS_SYNTH_GENERATOR_DEFAULT_SAMPLERATE AGS_SYNTH_GENERATOR_DEFAULT_BUFFER_SIZE AGS_SYNTH_GENERATOR_DEFAULT_FORMAT AGS_SYNTH_GENERATOR_DEFAULT_OSCILLATOR AGS_SYNTH_GENERATOR_DEFAULT_FREQUENCY AGS_SYNTH_GENERATOR_DEFAULT_PHASE AGS_SYNTH_GENERATOR_DEFAULT_VOLUME AGS_SYNTH_GENERATOR_DEFAULT_LFO_DEPTH AGS_SYNTH_GENERATOR_DEFAULT_TUNING AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_FREQUENCY AGS_SYNTH_GENERATOR_DEFAULT_FM_LFO_DEPTH AGS_SYNTH_GENERATOR_DEFAULT_FM_TUNING AgsSynthGeneratorOscillator ags_synth_generator_set_samplerate ags_synth_generator_set_buffer_size ags_synth_generator_set_format ags_synth_generator_compute ags_synth_generator_new AGS_IS_SYNTH_GENERATOR AGS_SYNTH_GENERATOR AGS_SYNTH_GENERATOR_CLASS AGS_SYNTH_GENERATOR_GET_CLASS AGS_TYPE_SYNTH_GENERATOR AgsSynthGenerator AgsSynthGeneratorClass ags_synth_generator_get_type
ags_synth_util ags_synth_util_get_xcross_count_s8 ags_synth_util_get_xcross_count_s16 ags_synth_util_get_xcross_count_s24 ags_synth_util_get_xcross_count_s32 ags_synth_util_get_xcross_count_s64 ags_synth_util_get_xcross_count_float ags_synth_util_get_xcross_count_double ags_synth_util_get_xcross_count_complex ags_synth_util_get_xcross_count ags_synth_util_sin_s8 ags_synth_util_sin_s16 ags_synth_util_sin_s24 ags_synth_util_sin_s32 ags_synth_util_sin_s64 ags_synth_util_sin_float ags_synth_util_sin_double ags_synth_util_sin_complex ags_synth_util_sawtooth_s8 ags_synth_util_sawtooth_s16 ags_synth_util_sawtooth_s24 ags_synth_util_sawtooth_s32 ags_synth_util_sawtooth_s64 ags_synth_util_sawtooth_float ags_synth_util_sawtooth_double ags_synth_util_sawtooth_complex ags_synth_util_triangle_s8 ags_synth_util_triangle_s16 ags_synth_util_triangle_s24 ags_synth_util_triangle_s32 ags_synth_util_triangle_s64 ags_synth_util_triangle_float ags_synth_util_triangle_double ags_synth_util_triangle_complex ags_synth_util_square_s8 ags_synth_util_square_s16 ags_synth_util_square_s24 ags_synth_util_square_s32 ags_synth_util_square_s64 ags_synth_util_square_float ags_synth_util_square_double ags_synth_util_square_complex ags_synth_util_impulse_s8 ags_synth_util_impulse_s16 ags_synth_util_impulse_s24 ags_synth_util_impulse_s32 ags_synth_util_impulse_s64 ags_synth_util_impulse_float ags_synth_util_impulse_double ags_synth_util_impulse_complex ags_synth_util_sin ags_synth_util_sawtooth ags_synth_util_triangle ags_synth_util_square ags_synth_util_impulse
ags_tic_device AgsTicDevice ags_tic_device_new AGS_IS_TIC_DEVICE AGS_TIC_DEVICE AGS_TIC_DEVICE_CLASS AGS_TIC_DEVICE_GET_CLASS AGS_TYPE_TIC_DEVICE AgsTicDevice AgsTicDeviceClass ags_tic_device_get_type
ags_toggle_pattern_bit AgsTogglePatternBit ags_toggle_pattern_bit_refresh_gui ags_toggle_pattern_bit_new AGS_IS_TOGGLE_PATTERN_BIT AGS_TOGGLE_PATTERN_BIT AGS_TOGGLE_PATTERN_BIT_CLASS AGS_TOGGLE_PATTERN_BIT_GET_CLASS AGS_TYPE_TOGGLE_PATTERN_BIT AgsTogglePatternBit AgsTogglePatternBitClass ags_toggle_pattern_bit_get_type
ags_track AgsTrack AGS_TRACK_GET_OBJ_MUTEX AgsTrackFlags ags_track_test_flags ags_track_set_flags ags_track_unset_flags ags_track_sort_func ags_track_duplicate ags_track_new AGS_IS_TRACK AGS_TRACK AGS_TRACK_CLASS AGS_TRACK_GET_CLASS AGS_TYPE_TRACK AgsTrack AgsTrackClass ags_track_get_type
ags_volume_audio_signal AgsVolumeAudioSignal ags_volume_audio_signal_new AGS_IS_VOLUME_AUDIO_SIGNAL AGS_TYPE_VOLUME_AUDIO_SIGNAL AGS_VOLUME_AUDIO_SIGNAL AGS_VOLUME_AUDIO_SIGNAL_CLASS AGS_VOLUME_AUDIO_SIGNAL_GET_CLASS AgsVolumeAudioSignal AgsVolumeAudioSignalClass ags_volume_audio_signal_get_type
ags_volume_channel AgsVolumeChannel ags_volume_channel_new AGS_IS_VOLUME_CHANNEL AGS_TYPE_VOLUME_CHANNEL AGS_VOLUME_CHANNEL AGS_VOLUME_CHANNEL_CLASS AGS_VOLUME_CHANNEL_GET_CLASS AgsVolumeChannel AgsVolumeChannelClass ags_volume_channel_get_type
ags_volume_channel_run AgsVolumeChannelRun ags_volume_channel_run_new AGS_IS_VOLUME_CHANNEL_RUN AGS_TYPE_VOLUME_CHANNEL_RUN AGS_VOLUME_CHANNEL_RUN AGS_VOLUME_CHANNEL_RUN_CLASS AGS_VOLUME_CHANNEL_RUN_GET_CLASS AgsVolumeChannelRun AgsVolumeChannelRunClass ags_volume_channel_run_get_type
ags_volume_recycling AgsVolumeRecycling ags_volume_recycling_new AGS_IS_VOLUME_RECYCLING AGS_TYPE_VOLUME_RECYCLING AGS_VOLUME_RECYCLING AGS_VOLUME_RECYCLING_CLASS AGS_VOLUME_RECYCLING_GET_CLASS AgsVolumeRecycling AgsVolumeRecyclingClass ags_volume_recycling_get_type
ags_wasapi_devin AgsWasapiDevin AGS_WASAPI_DEVIN_GET_OBJ_MUTEX AGS_WASAPI_DEVIN_DEFAULT_WASAPI_BUFFER_SIZE AgsWasapiDevinFlags AGS_WASAPI_DEVIN_ERROR AgsWasapiDevinError ags_wasapi_devin_error_quark ags_wasapi_devin_test_flags ags_wasapi_devin_set_flags ags_wasapi_devin_unset_flags ags_wasapi_devin_switch_buffer_flag ags_wasapi_devin_adjust_delay_and_attack ags_wasapi_devin_realloc_buffer ags_wasapi_devin_new AGS_IS_WASAPI_DEVIN AGS_TYPE_WASAPI_DEVIN AGS_WASAPI_DEVIN AGS_WASAPI_DEVIN_CLASS AGS_WASAPI_DEVIN_GET_CLASS AgsWasapiDevin AgsWasapiDevinClass ags_wasapi_devin_get_type
ags_wasapi_devout AgsWasapiDevout AGS_WASAPI_DEVOUT_GET_OBJ_MUTEX AGS_WASAPI_DEVOUT_DEFAULT_WASAPI_BUFFER_SIZE AgsWasapiDevoutFlags AGS_WASAPI_DEVOUT_ERROR AgsWasapiDevoutError ags_wasapi_devout_error_quark ags_wasapi_devout_test_flags ags_wasapi_devout_set_flags ags_wasapi_devout_unset_flags ags_wasapi_devout_switch_buffer_flag ags_wasapi_devout_adjust_delay_and_attack ags_wasapi_devout_realloc_buffer ags_wasapi_devout_new AGS_IS_WASAPI_DEVOUT AGS_TYPE_WASAPI_DEVOUT AGS_WASAPI_DEVOUT AGS_WASAPI_DEVOUT_CLASS AGS_WASAPI_DEVOUT_GET_CLASS AgsWasapiDevout AgsWasapiDevoutClass ags_wasapi_devout_get_type
ags_wave AgsWave AGS_WAVE_GET_OBJ_MUTEX AGS_WAVE_DEFAULT_BPM AGS_WAVE_TICS_PER_BEAT AGS_WAVE_MINIMUM_BUFFER_LENGTH AGS_WAVE_DEFAULT_BUFFER_LENGTH AGS_WAVE_DEFAULT_LENGTH AGS_WAVE_DEFAULT_JIFFIE AGS_WAVE_DEFAULT_DURATION AGS_WAVE_DEFAULT_OFFSET AGS_WAVE_CLIPBOARD_VERSION AGS_WAVE_CLIPBOARD_TYPE AGS_WAVE_CLIPBOARD_FORMAT AgsWaveFlags ags_wave_test_flags ags_wave_set_flags ags_wave_unset_flags ags_wave_set_samplerate ags_wave_set_buffer_size ags_wave_set_format ags_wave_find_near_timestamp ags_wave_sort_func ags_wave_add ags_wave_add_buffer ags_wave_remove_buffer ags_wave_get_selection ags_wave_is_buffer_selected ags_wave_find_point ags_wave_find_region ags_wave_free_selection ags_wave_add_region_to_selection ags_wave_remove_region_from_selection ags_wave_add_all_to_selection ags_wave_copy_selection ags_wave_cut_selection ags_wave_insert_from_clipboard ags_wave_insert_from_clipboard_extended ags_wave_new AGS_IS_WAVE AGS_TYPE_WAVE AGS_WAVE AGS_WAVE_CLASS AGS_WAVE_GET_CLASS AgsWave AgsWaveClass ags_wave_get_type
ags_wave_loader AgsWaveLoader AGS_WAVE_LOADER_GET_OBJ_MUTEX AgsWaveLoaderFlags ags_wave_loader_test_flags ags_wave_loader_set_flags ags_wave_loader_unset_flags ags_wave_loader_start ags_wave_loader_new AGS_IS_WAVE_LOADER AGS_TYPE_WAVE_LOADER AGS_WAVE_LOADER AGS_WAVE_LOADER_CLASS AGS_WAVE_LOADER_GET_CLASS AgsWaveLoader AgsWaveLoaderClass ags_wave_loader_get_type
gsequencer-3.1.3/docs/reference/libags-audio/libags_audio-overrides.txt0000644000175000017500000000000013461636435023212 00000000000000gsequencer-3.1.3/docs/reference/libags-audio/README0000644000175000017500000000023413607210263016705 00000000000000Third-party files of gtk-doc licensed under the terms of GNU GPLv3+, copyright provided by Stefan Sauer * Makefile.am (Copyright (C) Stefan Sauer, GPLv3+) gsequencer-3.1.3/docs/reference/libags-audio/Makefile.in0000644000175000017500000013114213622252207020076 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/reference/libags-audio ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/./gtk-doc.make $(srcdir)/Makefile.in \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # The name of the module, e.g. 'glib'. DOC_MODULE = libags_audio # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE = $(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR = $(top_srcdir)/ags/plugin $(top_srcdir)/ags/audio # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS = --cflags="$(CFLAGS) $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(XMLRPC_CFLAGS) $(XMLRPC_UTIL_CFLAGS) $(XMLRPC_SERVER_ABYSS_CFLAGS) $(XMLRPC_SERVER_CGI_CFLAGS) $(XMLRPC_SERVER_CFLAGS) $(OPENSSL_CFLAGS) $(GOBJECT_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBAO_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(JACK_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(UUID_LIBS) $(LIBASOUND2_LIBS) $(LIBAO_LIBS) $(LIBXML2_LIBS) $(OPENSSL_LIBS) $(XMLRPC_LIBS) $(XMLRPC_UTIL_LIBS) $(XMLRPC_SERVER_ABYSS_LIBS) $(XMLRPC_SERVER_CGI_LIBS) $(XMLRPC_SERVER_LIBS) $(GOBJECT_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(JACK_LIBS) -L$(top_builddir) $(top_builddir)/libags.la $(top_builddir)/libags_thread.la $(top_builddir)/libags_server.la $(top_builddir)/libags_audio.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS = --xml-mode --output-format=xml --name-space=libags_audio --module=libags_audio # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS = # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = --module=libags_audio --module-dir=./libags-audio-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libags-audio-doc/api --extra-dir=$(top_srcdir)/docs/reference/libags/libags-html # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB = CFILE_GLOB = # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES = # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES = ags_lv2_state_manager.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES = # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files = # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files = AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS = $(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags.la \ $(top_builddir)/libags_thread.la \ $(top_builddir)/libags_server.la \ $(top_builddir)/libags_audio.la @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test @GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp #### setup #### GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; #### scan #### GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; #### xml #### GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0 = @echo " DOC Building XML"; #### html #### GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; #### pdf #### GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; # This includes the standard gtk-doc make rules, copied by gtkdocize. # Comment this out if you want 'make check' to test you doc status # and run some sanity checks @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = \ @ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) @ENABLE_GTK_DOC_TRUE@TESTS = $(GTKDOC_CHECK) all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/./gtk-doc.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/reference/libags-audio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/libags-audio/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/./gtk-doc.make $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ags-docs-local: tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am @ENABLE_GTK_DOC_FALSE@all-local: all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-am ags-docs-am: ags-docs-local clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: check-am install-am install-strip .PHONY: ags-docs-am ags-docs-local all all-am all-local check \ check-TESTS check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am uninstall-local .PRECIOUS: Makefile gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc @ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libags-audio-html && mkdir libags-audio-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libags-audio-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libags-audio-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libags-audio-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libags-audio-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libags-audio-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libags-audio-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libags-audio-html install-data-local: @installfiles=`echo $(builddir)/libags-audio-html/*`; \ if test "$$installfiles" = '$(builddir)/libags-audio-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # @HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs @HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" @HAVE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libags-audio-html @cp ./libags-audio-html/* $(distdir)/libags-audio-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libags-audio-html .PHONY : dist-hook-local docs -include $(top_srcdir)/git.mk # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/docs/reference/libags-audio/gtk-doc.make0000644000175000017500000002554113521306053020222 00000000000000# -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc if ENABLE_GTK_DOC all-local: all-gtk-doc endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp #### scan #### GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0=@echo " DOC Building XML"; sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ #### html #### GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libags-audio-html && mkdir libags-audio-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libags-audio-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libags-audio-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libags-audio-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libags-audio-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libags-audio-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp #### pdf #### GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libags-audio-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libags-audio-html install-data-local: @installfiles=`echo $(builddir)/libags-audio-html/*`; \ if test "$$installfiles" = '$(builddir)/libags-audio-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if HAVE_GTK_DOC dist-check-gtkdoc: docs else dist-check-gtkdoc: @echo "*** gtk-doc is needed to run 'make dist'. ***" @echo "*** gtk-doc was not found when 'configure' ran. ***" @echo "*** please install gtk-doc and rerun 'configure'. ***" @false endif dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libags-audio-html @cp ./libags-audio-html/* $(distdir)/libags-audio-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libags-audio-html .PHONY : dist-hook-local docs gsequencer-3.1.3/docs/reference/libags-audio/libags_audio.types.in0000644000175000017500000002104613607210263022146 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_acceleration_get_type ags_add_audio_get_type ags_add_audio_signal_get_type ags_add_effect_get_type ags_add_note_get_type ags_add_soundcard_get_type ags_analyse_audio_signal_get_type ags_analyse_channel_get_type ags_analyse_channel_run_get_type ags_analyse_recycling_get_type ags_apply_bpm_get_type ags_apply_presets_get_type ags_apply_sequencer_length_get_type ags_apply_sound_config_get_type ags_apply_synth_get_type ags_apply_tact_get_type ags_audio_application_context_get_type ags_audio_container_get_type ags_audio_file_get_type ags_audio_file_link_get_type ags_audio_get_type ags_audio_loop_get_type ags_audio_signal_get_type ags_audio_thread_get_type ags_audio_unit_client_get_type ags_audio_unit_devin_get_type ags_audio_unit_devout_get_type ags_audio_unit_port_get_type ags_audio_unit_server_get_type ags_automation_get_type ags_base_plugin_get_type ags_buffer_audio_signal_get_type ags_buffer_channel_get_type ags_buffer_channel_run_get_type ags_buffer_get_type ags_buffer_recycling_get_type ags_cancel_audio_get_type ags_cancel_channel_get_type ags_capture_wave_audio_get_type ags_capture_wave_audio_run_get_type ags_capture_wave_channel_get_type ags_capture_wave_channel_run_get_type ags_channel_get_type ags_channel_thread_get_type ags_clear_audio_signal_get_type ags_clear_buffer_get_type ags_copy_audio_signal_get_type ags_copy_channel_get_type ags_copy_channel_run_get_type ags_copy_pattern_audio_get_type ags_copy_pattern_audio_run_get_type ags_copy_pattern_channel_get_type ags_copy_pattern_channel_run_get_type ags_copy_recycling_get_type ags_core_audio_client_get_type ags_core_audio_devin_get_type ags_core_audio_devout_get_type ags_core_audio_midiin_get_type ags_core_audio_port_get_type ags_core_audio_server_get_type ags_count_beats_audio_get_type ags_count_beats_audio_run_get_type ags_crop_note_get_type ags_delay_audio_get_type ags_delay_audio_run_get_type ags_devin_get_type ags_devout_get_type ags_dssi_manager_get_type ags_dssi_plugin_get_type ags_envelope_audio_signal_get_type ags_envelope_channel_get_type ags_envelope_channel_run_get_type ags_envelope_recycling_get_type ags_eq10_audio_signal_get_type ags_eq10_channel_get_type ags_eq10_channel_run_get_type ags_eq10_recycling_get_type ags_export_output_get_type ags_export_thread_get_type ags_feed_audio_signal_get_type ags_feed_channel_get_type ags_feed_channel_run_get_type ags_feed_recycling_get_type ags_fifoout_get_type ags_free_selection_get_type ags_frequency_map_get_type ags_frequency_map_manager_get_type ags_generic_recall_channel_run_get_type ags_generic_recall_recycling_get_type ags_input_get_type ags_ipatch_dls2_reader_get_type ags_ipatch_get_type ags_ipatch_gig_reader_get_type ags_ipatch_sample_get_type ags_ipatch_sf2_reader_get_type ags_jack_client_get_type ags_jack_devin_get_type ags_jack_devout_get_type ags_jack_midiin_get_type ags_jack_port_get_type ags_jack_server_get_type ags_ladspa_conversion_get_type ags_ladspa_manager_get_type ags_ladspa_plugin_get_type ags_lfo_audio_signal_get_type ags_lfo_channel_get_type ags_lfo_channel_run_get_type ags_lfo_recycling_get_type ags_link_channel_get_type ags_loop_channel_get_type ags_loop_channel_run_get_type ags_lv2_conversion_get_type ags_lv2_event_manager_get_type ags_lv2_log_manager_get_type ags_lv2_manager_get_type ags_lv2_option_manager_get_type ags_lv2_plugin_get_type ags_lv2_preset_get_type ags_lv2_preset_manager_get_type ags_lv2_turtle_parser_get_type ags_lv2_uri_map_manager_get_type ags_lv2_urid_manager_get_type ags_lv2_worker_get_type ags_lv2_worker_manager_get_type ags_lv2ui_manager_get_type ags_lv2ui_plugin_get_type ags_midi_builder_get_type ags_midi_file_get_type ags_midi_get_type ags_midi_parser_get_type ags_midiin_get_type ags_move_note_get_type ags_mute_audio_get_type ags_mute_audio_run_get_type ags_mute_audio_signal_get_type ags_mute_channel_get_type ags_mute_channel_run_get_type ags_mute_recycling_get_type ags_notation_get_type ags_note_get_type ags_open_file_get_type ags_open_sf2_instrument_get_type ags_open_sf2_sample_get_type ags_open_single_file_get_type ags_open_wave_get_type ags_osc_action_controller_get_type ags_osc_builder_get_type ags_osc_client_get_type ags_osc_config_controller_get_type ags_osc_connection_get_type ags_osc_controller_get_type ags_osc_export_controller_get_type ags_osc_front_controller_get_type ags_osc_info_controller_get_type ags_osc_message_get_type ags_osc_meter_controller_get_type ags_osc_node_controller_get_type ags_osc_parser_get_type ags_osc_plugin_controller_get_type ags_osc_renew_controller_get_type ags_osc_response_get_type ags_osc_server_get_type ags_osc_status_controller_get_type ags_osc_websocket_connection_get_type ags_osc_xmlrpc_controller_get_type ags_osc_xmlrpc_message_get_type ags_osc_xmlrpc_server_get_type ags_output_get_type ags_pattern_get_type ags_peak_audio_signal_get_type ags_peak_channel_get_type ags_peak_channel_run_get_type ags_peak_recycling_get_type ags_play_audio_get_type ags_play_audio_signal_get_type ags_play_channel_get_type ags_play_channel_run_get_type ags_play_channel_run_master_get_type ags_play_dssi_audio_get_type ags_play_dssi_audio_run_get_type ags_play_lv2_audio_get_type ags_play_lv2_audio_run_get_type ags_play_notation_audio_get_type ags_play_notation_audio_run_get_type ags_play_recycling_get_type ags_play_wave_audio_get_type ags_play_wave_audio_run_get_type ags_play_wave_channel_get_type ags_play_wave_channel_run_get_type ags_playback_domain_get_type ags_playback_get_type ags_plugin_port_get_type ags_port_get_type ags_prepare_audio_signal_get_type ags_prepare_channel_get_type ags_prepare_channel_run_get_type ags_prepare_recycling_get_type ags_preset_get_type ags_pulse_client_get_type ags_pulse_devin_get_type ags_pulse_devout_get_type ags_pulse_port_get_type ags_pulse_server_get_type ags_recall_audio_get_type ags_recall_audio_run_get_type ags_recall_audio_signal_get_type ags_recall_channel_get_type ags_recall_channel_run_get_type ags_recall_container_get_type ags_recall_dependency_get_type ags_recall_dssi_get_type ags_recall_dssi_run_get_type ags_recall_factory_get_type ags_recall_get_type ags_recall_id_get_type ags_recall_ladspa_get_type ags_recall_ladspa_run_get_type ags_recall_lv2_get_type ags_recall_lv2_run_get_type ags_recall_recycling_get_type ags_record_midi_audio_get_type ags_record_midi_audio_run_get_type ags_recycling_context_get_type ags_recycling_get_type ags_remove_audio_get_type ags_remove_audio_signal_get_type ags_remove_note_get_type ags_remove_soundcard_get_type ags_reset_amplitude_get_type ags_reset_note_get_type ags_reset_peak_get_type ags_resize_audio_get_type ags_route_dssi_audio_get_type ags_route_dssi_audio_run_get_type ags_route_lv2_audio_get_type ags_route_lv2_audio_run_get_type ags_rt_stream_audio_signal_get_type ags_rt_stream_channel_get_type ags_rt_stream_channel_run_get_type ags_rt_stream_recycling_get_type ags_seek_soundcard_get_type ags_sequencer_thread_get_type ags_set_audio_channels_get_type ags_set_buffer_size_get_type ags_set_device_get_type ags_set_format_get_type ags_set_muted_get_type ags_set_samplerate_get_type ags_sf2_loader_get_type ags_sfz_file_get_type ags_sfz_group_get_type ags_sfz_loader_get_type ags_sfz_region_get_type ags_sfz_sample_get_type ags_sndfile_get_type ags_sound_container_get_type ags_sound_provider_get_type ags_sound_resource_get_type ags_soundcard_thread_get_type ags_start_audio_get_type ags_start_channel_get_type ags_start_sequencer_get_type ags_start_soundcard_get_type ags_stop_sequencer_get_type ags_stop_soundcard_get_type ags_stream_audio_signal_get_type ags_stream_channel_get_type ags_stream_channel_run_get_type ags_stream_recycling_get_type ags_switch_buffer_flag_get_type ags_synth_generator_get_type ags_tic_device_get_type ags_toggle_pattern_bit_get_type ags_track_get_type ags_volume_audio_signal_get_type ags_volume_channel_get_type ags_volume_channel_run_get_type ags_volume_recycling_get_type ags_wasapi_devin_get_type ags_wasapi_devout_get_type ags_wave_get_type ags_wave_loader_get_type gsequencer-3.1.3/docs/reference/libags-audio/git.mk0000644000175000017500000002441413461636435017162 00000000000000# git.mk # # Copyright 2009, Red Hat, Inc. # Copyright 2010,2011,2012,2013 Behdad Esfahbod # Written by Behdad Esfahbod # # Copying and distribution of this file, with or without modification, # is permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # The latest version of this file can be downloaded from: # https://raw.github.com/behdad/git.mk/master/git.mk # Bugs, etc, should be reported upstream at: # https://github.com/behdad/git.mk # # To use in your project, import this file in your git repo's toplevel, # then do "make -f git.mk". This modifies all Makefile.am files in # your project to -include git.mk. Remember to add that line to new # Makefile.am files you create in your project, or just rerun the # "make -f git.mk". # # This enables automatic .gitignore generation. If you need to ignore # more files, add them to the GITIGNOREFILES variable in your Makefile.am. # But think twice before doing that. If a file has to be in .gitignore, # chances are very high that it's a generated file and should be in one # of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES. # # The only case that you need to manually add a file to GITIGNOREFILES is # when remove files in one of mostlyclean-local, clean-local, distclean-local, # or maintainer-clean-local make targets. # # Note that for files like editor backup, etc, there are better places to # ignore them. See "man gitignore". # # If "make maintainer-clean" removes the files but they are not recognized # by this script (that is, if "git status" shows untracked files still), send # me the output of "git status" as well as your Makefile.am and Makefile for # the directories involved and I'll diagnose. # # For a list of toplevel files that should be in MAINTAINERCLEANFILES, see # Makefile.am.sample in the git.mk git repo. # # Don't EXTRA_DIST this file. It is supposed to only live in git clones, # not tarballs. It serves no useful purpose in tarballs and clutters the # build dir. # # This file knows how to handle autoconf, automake, libtool, gtk-doc, # gnome-doc-utils, yelp.m4, mallard, intltool, gsettings, dejagnu, appdata, # appstream. # # This makefile provides the following targets: # # - all: "make all" will build all gitignore files. # - gitignore: makes all gitignore files in the current dir and subdirs. # - .gitignore: make gitignore file for the current dir. # - gitignore-recurse: makes all gitignore files in the subdirs. # # KNOWN ISSUES: # # - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the # submodule doesn't find us. If you have configure.{in,ac} files in # subdirs, add a proxy git.mk file in those dirs that simply does: # "include $(top_srcdir)/../git.mk". Add more ..'s to your taste. # And add those files to git. See vte/gnome-pty-helper/git.mk for # example. # ############################################################################### # Variables user modules may want to add to toplevel MAINTAINERCLEANFILES: ############################################################################### # # Most autotools-using modules should be fine including this variable in their # toplevel MAINTAINERCLEANFILES: GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL = \ $(srcdir)/aclocal.m4 \ $(srcdir)/autoscan.log \ $(srcdir)/configure.scan \ `AUX_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_AUX_DIR:$$1' ./configure.ac); \ test "x$$AUX_DIR" = "x$(srcdir)/" && AUX_DIR=$(srcdir); \ for x in \ ar-lib \ compile \ config.guess \ config.sub \ depcomp \ install-sh \ ltmain.sh \ missing \ mkinstalldirs \ test-driver \ ylwrap \ ; do echo "$$AUX_DIR/$$x"; done` \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_HEADERS:$$1' ./configure.ac | \ head -n 1 | while read f; do echo "$(srcdir)/$$f.in"; done` # # All modules should also be fine including the following variable, which # removes automake-generated Makefile.in files: GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN = \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_FILES:$$1' ./configure.ac | \ while read f; do \ case $$f in Makefile|*/Makefile) \ test -f "$(srcdir)/$$f.am" && echo "$(srcdir)/$$f.in";; esac; \ done` # # Modules that use libtool and use AC_CONFIG_MACRO_DIR() may also include this, # though it's harmless to include regardless. GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL = \ `MACRO_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_MACRO_DIR:$$1' ./configure.ac); \ if test "x$$MACRO_DIR" != "x$(srcdir)/"; then \ for x in \ libtool.m4 \ ltoptions.m4 \ ltsugar.m4 \ ltversion.m4 \ lt~obsolete.m4 \ ; do echo "$$MACRO_DIR/$$x"; done; \ fi` ############################################################################### # Default rule is to install ourselves in all Makefile.am files: ############################################################################### git-all: git-mk-install git-mk-install: @echo "Installing git makefile" @any_failed=; \ find "`test -z "$(top_srcdir)" && echo . || echo "$(top_srcdir)"`" -name Makefile.am | while read x; do \ if grep 'include .*/git.mk' $$x >/dev/null; then \ echo "$$x already includes git.mk"; \ else \ failed=; \ echo "Updating $$x"; \ { cat $$x; \ echo ''; \ echo '-include $$(top_srcdir)/git.mk'; \ } > $$x.tmp || failed=1; \ if test x$$failed = x; then \ mv $$x.tmp $$x || failed=1; \ fi; \ if test x$$failed = x; then : else \ echo "Failed updating $$x"; >&2 \ any_failed=1; \ fi; \ fi; done; test -z "$$any_failed" .PHONY: git-all git-mk-install ############################################################################### # Actual .gitignore generation: ############################################################################### $(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk @echo "git.mk: Generating $@" @{ \ if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \ for x in \ $(DOC_MODULE)-decl-list.txt \ $(DOC_MODULE)-decl.txt \ tmpl/$(DOC_MODULE)-unused.sgml \ "tmpl/*.bak" \ xml html \ ; do echo "/$$x"; done; \ FLAVOR=$$(cd $(top_srcdir); $(AUTOCONF) --trace 'GTK_DOC_CHECK:$$2' ./configure.ac); \ case $$FLAVOR in *no-tmpl*) echo /tmpl;; esac; \ fi; \ if test "x$(DOC_MODULE)$(DOC_ID)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \ for lc in $(DOC_LINGUAS); do \ for x in \ $(if $(DOC_MODULE),$(DOC_MODULE).xml) \ $(DOC_PAGES) \ $(DOC_INCLUDES) \ ; do echo "/$$lc/$$x"; done; \ done; \ for x in \ $(_DOC_OMF_ALL) \ $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) \ $(_DOC_MOFILES) \ $(DOC_H_FILE) \ "*/.xml2po.mo" \ "*/*.omf.out" \ ; do echo /$$x; done; \ fi; \ if test "x$(HELP_ID)" = x -o "x$(HELP_LINGUAS)" = x; then :; else \ for lc in $(HELP_LINGUAS); do \ for x in \ $(HELP_FILES) \ "$$lc.stamp" \ "$$lc.mo" \ ; do echo "/$$lc/$$x"; done; \ done; \ fi; \ if test "x$(gsettings_SCHEMAS)" = x; then :; else \ for x in \ $(gsettings_SCHEMAS:.xml=.valid) \ $(gsettings__enum_file) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appdata_XML)" = x; then :; else \ for x in \ $(appdata_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appstream_XML)" = x; then :; else \ for x in \ $(appstream_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/po/Makefile.in.in; then \ for x in \ po/Makefile.in.in \ po/Makefile.in.in~ \ po/Makefile.in \ po/Makefile \ po/Makevars.template \ po/POTFILES \ po/Rules-quot \ po/stamp-it \ po/.intltool-merge-cache \ "po/*.gmo" \ "po/*.header" \ "po/*.mo" \ "po/*.sed" \ "po/*.sin" \ po/$(GETTEXT_PACKAGE).pot \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/configure; then \ for x in \ autom4te.cache \ configure \ config.h \ stamp-h1 \ libtool \ config.lt \ ; do echo "/$$x"; done; \ fi; \ if test "x$(DEJATOOL)" = x; then :; else \ for x in \ $(DEJATOOL) \ ; do echo "/$$x.sum"; echo "/$$x.log"; done; \ echo /site.exp; \ fi; \ if test "x$(am__dirstamp)" = x; then :; else \ echo "$(am__dirstamp)"; \ fi; \ if test "x$(LTCOMPILE)" = x -a "x$(LTCXXCOMPILE)" = x -a "x$(GTKDOC_RUN)" = x; then :; else \ for x in \ "*.lo" \ ".libs" "_libs" \ ; do echo "$$x"; done; \ fi; \ for x in \ .gitignore \ $(GITIGNOREFILES) \ $(CLEANFILES) \ $(PROGRAMS) $(check_PROGRAMS) $(EXTRA_PROGRAMS) \ $(LIBRARIES) $(check_LIBRARIES) $(EXTRA_LIBRARIES) \ $(LTLIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LTLIBRARIES) \ so_locations \ $(MOSTLYCLEANFILES) \ $(TEST_LOGS) \ $(TEST_LOGS:.log=.trs) \ $(TEST_SUITE_LOG) \ "*.gcda" \ "*.gcno" \ $(DISTCLEANFILES) \ $(am__CONFIG_DISTCLEAN_FILES) \ $(CONFIG_CLEAN_FILES) \ TAGS ID GTAGS GRTAGS GSYMS GPATH tags \ "*.tab.c" \ $(MAINTAINERCLEANFILES) \ $(BUILT_SOURCES) \ $(patsubst %.vala,%.c,$(filter %.vala,$(SOURCES))) \ $(filter %_vala.stamp,$(DIST_COMMON)) \ $(filter %.vapi,$(DIST_COMMON)) \ $(filter $(addprefix %,$(notdir $(patsubst %.vapi,%.h,$(filter %.vapi,$(DIST_COMMON))))),$(DIST_COMMON)) \ Makefile \ Makefile.in \ "*.orig" \ "*.rej" \ "*.bak" \ "*~" \ ".*.sw[nop]" \ ".dirstamp" \ ; do echo "/$$x"; done; \ for x in \ "*.$(OBJEXT)" \ $(DEPDIR) \ ; do echo "$$x"; done; \ } | \ sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \ sed 's@/[.]/@/@g' | \ LC_ALL=C sort | uniq > $@.tmp && \ mv $@.tmp $@; all: $(srcdir)/.gitignore gitignore-recurse-maybe gitignore: $(srcdir)/.gitignore gitignore-recurse gitignore-recurse-maybe: @for subdir in $(DIST_SUBDIRS); do \ case " $(SUBDIRS) " in \ *" $$subdir "*) :;; \ *) test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir");; \ esac; \ done gitignore-recurse: @for subdir in $(DIST_SUBDIRS); do \ test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir"); \ done maintainer-clean: gitignore-clean gitignore-clean: -rm -f $(srcdir)/.gitignore .PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe gsequencer-3.1.3/docs/reference/libags-audio/Makefile.am0000644000175000017500000001011013606450531020056 00000000000000# This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=libags_audio # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE=$(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR=$(top_srcdir)/ags/plugin $(top_srcdir)/ags/audio # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS=--cflags="$(CFLAGS) $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(XMLRPC_CFLAGS) $(XMLRPC_UTIL_CFLAGS) $(XMLRPC_SERVER_ABYSS_CFLAGS) $(XMLRPC_SERVER_CGI_CFLAGS) $(XMLRPC_SERVER_CFLAGS) $(OPENSSL_CFLAGS) $(GOBJECT_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBAO_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(JACK_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(UUID_LIBS) $(LIBASOUND2_LIBS) $(LIBAO_LIBS) $(LIBXML2_LIBS) $(OPENSSL_LIBS) $(XMLRPC_LIBS) $(XMLRPC_UTIL_LIBS) $(XMLRPC_SERVER_ABYSS_LIBS) $(XMLRPC_SERVER_CGI_LIBS) $(XMLRPC_SERVER_LIBS) $(GOBJECT_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(JACK_LIBS) -L$(top_builddir) $(top_builddir)/libags.la $(top_builddir)/libags_thread.la $(top_builddir)/libags_server.la $(top_builddir)/libags_audio.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml --name-space=libags_audio --module=libags_audio # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS=--module=libags_audio --module-dir=./libags-audio-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libags-audio-doc/api --extra-dir=$(top_srcdir)/docs/reference/libags/libags-html # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB= CFILE_GLOB= # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES=ags_lv2_state_manager.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files= # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files= AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=$(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags.la \ $(top_builddir)/libags_thread.la \ $(top_builddir)/libags_server.la \ $(top_builddir)/libags_audio.la # This includes the standard gtk-doc make rules, copied by gtkdocize. include ./gtk-doc.make # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk gsequencer-3.1.3/docs/reference/libags-audio/libags_audio.interfaces.in0000644000175000017500000001541213607210263023125 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . AgsAddAudio AgsConnectable AgsAddEffect AgsConnectable AgsRecall AgsConnectable AgsRecallAudioSignal AgsConnectable AgsAnalyseAudioSignal AgsConnectable AgsBufferAudioSignal AgsConnectable AgsCopyAudioSignal AgsConnectable AgsEnvelopeAudioSignal AgsConnectable AgsEq10AudioSignal AgsConnectable AgsFeedAudioSignal AgsConnectable AgsLfoAudioSignal AgsConnectable AgsMuteAudioSignal AgsConnectable AgsPeakAudioSignal AgsConnectable AgsPlayAudioSignal AgsConnectable AgsPrepareAudioSignal AgsConnectable AgsRecallDssiRun AgsConnectable AgsRecallLadspaRun AgsConnectable AgsPlugin AgsRecallLv2Run AgsConnectable AgsPlugin AgsRtStreamAudioSignal AgsConnectable AgsStreamAudioSignal AgsConnectable AgsVolumeAudioSignal AgsConnectable AgsRecallChannel AgsConnectable AgsAnalyseChannel AgsConnectable AgsBufferChannel AgsConnectable AgsMutable AgsCaptureWaveChannel AgsConnectable AgsCopyChannel AgsConnectable AgsMutable AgsCopyPatternChannel AgsConnectable AgsEnvelopeChannel AgsConnectable AgsPlugin AgsEq10Channel AgsConnectable AgsFeedChannel AgsConnectable AgsLfoChannel AgsConnectable AgsLoopChannel AgsConnectable AgsMuteChannel AgsConnectable AgsMutable AgsPeakChannel AgsConnectable AgsPlayChannel AgsConnectable AgsMutable AgsPlayWaveChannel AgsConnectable AgsPrepareChannel AgsConnectable AgsRecallDssi AgsConnectable AgsRecallLadspa AgsConnectable AgsRecallLv2 AgsConnectable AgsRtStreamChannel AgsConnectable AgsStreamChannel AgsConnectable AgsVolumeChannel AgsConnectable AgsRecallChannelRun AgsConnectable AgsAnalyseChannelRun AgsConnectable AgsBufferChannelRun AgsConnectable AgsCaptureWaveChannelRun AgsConnectable AgsSeekable AgsCopyChannelRun AgsConnectable AgsCopyPatternChannelRun AgsConnectable AgsEnvelopeChannelRun AgsConnectable AgsEq10ChannelRun AgsConnectable AgsFeedChannelRun AgsConnectable AgsGenericRecallChannelRun AgsConnectable AgsLfoChannelRun AgsConnectable AgsLoopChannelRun AgsConnectable AgsMuteChannelRun AgsConnectable AgsPeakChannelRun AgsConnectable AgsPlayChannelRun AgsConnectable AgsPlayChannelRunMaster AgsConnectable AgsPlayWaveChannelRun AgsConnectable AgsSeekable AgsPrepareChannelRun AgsConnectable AgsRtStreamChannelRun AgsConnectable AgsStreamChannelRun AgsConnectable AgsVolumeChannelRun AgsConnectable AgsRecallRecycling AgsConnectable AgsAnalyseRecycling AgsConnectable AgsBufferRecycling AgsConnectable AgsCopyRecycling AgsConnectable AgsEnvelopeRecycling AgsConnectable AgsEq10Recycling AgsConnectable AgsFeedRecycling AgsConnectable AgsGenericRecallRecycling AgsConnectable AgsLfoRecycling AgsConnectable AgsMuteRecycling AgsConnectable AgsPeakRecycling AgsConnectable AgsPlayRecycling AgsConnectable AgsPrepareRecycling AgsConnectable AgsRtStreamRecycling AgsConnectable AgsStreamRecycling AgsConnectable AgsVolumeRecycling AgsConnectable AgsRecallAudio AgsConnectable AgsCaptureWaveAudio AgsConnectable AgsCopyPatternAudio AgsConnectable AgsCountBeatsAudio AgsConnectable AgsTactable AgsDelayAudio AgsConnectable AgsTactable AgsMuteAudio AgsConnectable AgsMutable AgsPlayAudio AgsConnectable AgsMutable AgsPlayDssiAudio AgsConnectable AgsPlayLv2Audio AgsConnectable AgsPlayNotationAudio AgsConnectable AgsPlayWaveAudio AgsConnectable AgsRecordMidiAudio AgsConnectable AgsRouteDssiAudio AgsConnectable AgsRouteLv2Audio AgsConnectable AgsRecallAudioRun AgsConnectable AgsCaptureWaveAudioRun AgsConnectable AgsCopyPatternAudioRun AgsConnectable AgsCountBeatsAudioRun AgsConnectable AgsCountable AgsSeekable AgsTactable AgsDelayAudioRun AgsConnectable AgsMuteAudioRun AgsConnectable AgsPlayDssiAudioRun AgsConnectable AgsPlayLv2AudioRun AgsConnectable AgsPlayNotationAudioRun AgsConnectable AgsPlayWaveAudioRun AgsConnectable AgsRecordMidiAudioRun AgsConnectable AgsRouteDssiAudioRun AgsConnectable AgsRouteLv2AudioRun AgsConnectable AgsApplicationContext AgsConnectable AgsAudioApplicationContext AgsConnectable AgsConcurrencyProvider AgsServiceProvider AgsSoundProvider AgsAudioContainer AgsConnectable AgsAudioFile AgsConnectable AgsFileLink AgsPlugin AgsAudioFileLink AgsPlugin AgsAudio AgsConnectable AgsThread AgsConnectable AgsAudioLoop AgsConnectable AgsMainLoop AgsAudioThread AgsConnectable AgsChannelThread AgsConnectable AgsExportThread AgsConnectable AgsSequencerThread AgsConnectable AgsSoundcardThread AgsConnectable AgsWorkerThread AgsConnectable AgsAudioSignal AgsConnectable AgsAudioUnitClient AgsConnectable AgsAudioUnitDevin AgsConnectable AgsSoundcard AgsAudioUnitDevout AgsConnectable AgsSoundcard AgsAudioUnitPort AgsConnectable AgsAudioUnitServer AgsConnectable AgsSoundServer AgsChannel AgsConnectable AgsInput AgsConnectable AgsOutput AgsConnectable AgsCoreAudioClient AgsConnectable AgsCoreAudioDevin AgsConnectable AgsSoundcard AgsCoreAudioDevout AgsConnectable AgsSoundcard AgsCoreAudioMidiin AgsConnectable AgsSequencer AgsCoreAudioPort AgsConnectable AgsCoreAudioServer AgsConnectable AgsSoundServer AgsDevin AgsConnectable AgsSoundcard AgsDevout AgsConnectable AgsSoundcard AgsFifoout AgsConnectable AgsSoundcard AgsIpatchDLS2Reader AgsConnectable AgsIpatch AgsConnectable AgsSoundContainer AgsIpatchGigReader AgsConnectable AgsIpatchSample AgsConnectable AgsSoundResource AgsIpatchSF2Reader AgsConnectable AgsJackClient AgsConnectable AgsJackDevin AgsConnectable AgsSoundcard AgsJackDevout AgsConnectable AgsSoundcard AgsJackMidiin AgsConnectable AgsSequencer AgsJackPort AgsConnectable AgsJackServer AgsConnectable AgsSoundServer AgsLv2Worker AgsConnectable AgsMidiin AgsConnectable AgsSequencer AgsOscXmlrpcController AgsPluginController AgsPattern AgsConnectable AgsTactable AgsPort AgsConnectable AgsPulseClient AgsConnectable AgsPulseDevin AgsConnectable AgsSoundcard AgsPulseDevout AgsConnectable AgsSoundcard AgsPulsePort AgsConnectable AgsPulseServer AgsConnectable AgsSoundServer AgsRecallContainer AgsConnectable AgsRecallFactory AgsConnectable AgsRecycling AgsConnectable AgsSFZFile AgsConnectable AgsSoundContainer AgsSFZGroup AgsConnectable AgsSFZRegion AgsConnectable AgsSFZSample AgsConnectable AgsSoundResource AgsSndfile AgsConnectable AgsSoundResource AgsWasapiDevin AgsConnectable AgsSoundcard AgsWasapiDevout AgsConnectable AgsSoundcard AgsTaskLauncher AgsConnectable gsequencer-3.1.3/docs/reference/libags-audio/libags_audio.xml0000644000175000017500000005433613613101164021201 00000000000000 %gtkdocentities; ]> Advanced Gtk+ Sequencer Audio Reference Manual for libags_audio. The latest version of this documentation can be found on-line at http://nongnu.org/gsequencer/api/&package_version;/libags-audio/. Plugin - API of plugins The plugin API contains objects to to interact with LADSPA, DSSI and LV2 plugins. Base plugin types The base plugin types allows you to interact with plugins in a generic way. LADSPA plugins The LADSPA plugin objects. DSSI plugins The LADSPA plugin objects. LV2 plugins The LV2 plugin objects. The audio layer The audio layer contains various objects related to audio processing. Utility functions The utility functions do common tasks. Frequency utils The frequency util objects. Audio sinks and sources Here are objects listed to interact your sound devices using ALSA, WASAPI, JACK, Pulseaudio or CoreAudio. The audio tree The audio tree does organize your data in a hierarchical structure. Storage objects The storage objects cover all editing related operations. Fundamental recall types The fundamental recall types are related to effect processing. Audio thread - multi-threaded audio Compute audio tree in parallel. Audio MIDI - MIDI support Objects related to MIDI disk IO and parsing. Audio OSC - OSC support The Open Sound Control Content format. Audio OSC - OSC client The Open Sound Control client. Audio OSC - OSC server The Open Sound Control server and controllers. Every request is passed through the front controller. It delegates the request to the requested controller. Each controller has its own context path to match. Audio OSC XMLRPC - OSC over XMLRPC server The Open Sound Control server throught XMLRPC server. Audio files - Reading/Writing audio data from disk Perform audio file disk IO. Recalls - fundamental playback For playback fundamental recalls like output to soundcard, copy or buffer and stream audio signals. Recalls - counters Recall counters. Recalls - volume Recalls having effect on volume. Recalls - meters Recalls computing peak or frequency spectrum. Recalls - data structures Recalls interacting with data structures like patter, notation and wave. Recalls - plugins Audio tasks - Data exchanged between Audio and GUI Tasks ensure to be run conflict free asynchrononous exclusively. API Index Index of deprecated API gsequencer-3.1.3/docs/reference/libags-audio/libags_audio.types0000644000175000017500000001746713622252234021556 00000000000000ags_acceleration_get_type ags_add_audio_get_type ags_add_audio_signal_get_type ags_add_effect_get_type ags_add_note_get_type ags_add_soundcard_get_type ags_analyse_audio_signal_get_type ags_analyse_channel_get_type ags_analyse_channel_run_get_type ags_analyse_recycling_get_type ags_apply_bpm_get_type ags_apply_presets_get_type ags_apply_sequencer_length_get_type ags_apply_sound_config_get_type ags_apply_synth_get_type ags_apply_tact_get_type ags_audio_application_context_get_type ags_audio_container_get_type ags_audio_file_get_type ags_audio_file_link_get_type ags_audio_get_type ags_audio_loop_get_type ags_audio_signal_get_type ags_audio_thread_get_type ags_audio_unit_client_get_type ags_audio_unit_devin_get_type ags_audio_unit_devout_get_type ags_audio_unit_port_get_type ags_audio_unit_server_get_type ags_automation_get_type ags_base_plugin_get_type ags_buffer_audio_signal_get_type ags_buffer_channel_get_type ags_buffer_channel_run_get_type ags_buffer_get_type ags_buffer_recycling_get_type ags_cancel_audio_get_type ags_cancel_channel_get_type ags_capture_wave_audio_get_type ags_capture_wave_audio_run_get_type ags_capture_wave_channel_get_type ags_capture_wave_channel_run_get_type ags_channel_get_type ags_channel_thread_get_type ags_clear_audio_signal_get_type ags_clear_buffer_get_type ags_copy_audio_signal_get_type ags_copy_channel_get_type ags_copy_channel_run_get_type ags_copy_pattern_audio_get_type ags_copy_pattern_audio_run_get_type ags_copy_pattern_channel_get_type ags_copy_pattern_channel_run_get_type ags_copy_recycling_get_type ags_core_audio_client_get_type ags_core_audio_devin_get_type ags_core_audio_devout_get_type ags_core_audio_midiin_get_type ags_core_audio_port_get_type ags_core_audio_server_get_type ags_count_beats_audio_get_type ags_count_beats_audio_run_get_type ags_crop_note_get_type ags_delay_audio_get_type ags_delay_audio_run_get_type ags_devin_get_type ags_devout_get_type ags_dssi_manager_get_type ags_dssi_plugin_get_type ags_envelope_audio_signal_get_type ags_envelope_channel_get_type ags_envelope_channel_run_get_type ags_envelope_recycling_get_type ags_eq10_audio_signal_get_type ags_eq10_channel_get_type ags_eq10_channel_run_get_type ags_eq10_recycling_get_type ags_export_output_get_type ags_export_thread_get_type ags_feed_audio_signal_get_type ags_feed_channel_get_type ags_feed_channel_run_get_type ags_feed_recycling_get_type ags_fifoout_get_type ags_free_selection_get_type ags_frequency_map_get_type ags_frequency_map_manager_get_type ags_generic_recall_channel_run_get_type ags_generic_recall_recycling_get_type ags_input_get_type ags_ipatch_dls2_reader_get_type ags_ipatch_get_type ags_ipatch_gig_reader_get_type ags_ipatch_sample_get_type ags_ipatch_sf2_reader_get_type ags_jack_client_get_type ags_jack_devin_get_type ags_jack_devout_get_type ags_jack_midiin_get_type ags_jack_port_get_type ags_jack_server_get_type ags_ladspa_conversion_get_type ags_ladspa_manager_get_type ags_ladspa_plugin_get_type ags_lfo_audio_signal_get_type ags_lfo_channel_get_type ags_lfo_channel_run_get_type ags_lfo_recycling_get_type ags_link_channel_get_type ags_loop_channel_get_type ags_loop_channel_run_get_type ags_lv2_conversion_get_type ags_lv2_event_manager_get_type ags_lv2_log_manager_get_type ags_lv2_manager_get_type ags_lv2_option_manager_get_type ags_lv2_plugin_get_type ags_lv2_preset_get_type ags_lv2_preset_manager_get_type ags_lv2_turtle_parser_get_type ags_lv2_uri_map_manager_get_type ags_lv2_urid_manager_get_type ags_lv2_worker_get_type ags_lv2_worker_manager_get_type ags_lv2ui_manager_get_type ags_lv2ui_plugin_get_type ags_midi_builder_get_type ags_midi_file_get_type ags_midi_get_type ags_midi_parser_get_type ags_midiin_get_type ags_move_note_get_type ags_mute_audio_get_type ags_mute_audio_run_get_type ags_mute_audio_signal_get_type ags_mute_channel_get_type ags_mute_channel_run_get_type ags_mute_recycling_get_type ags_notation_get_type ags_note_get_type ags_open_file_get_type ags_open_sf2_instrument_get_type ags_open_sf2_sample_get_type ags_open_single_file_get_type ags_open_wave_get_type ags_osc_action_controller_get_type ags_osc_builder_get_type ags_osc_client_get_type ags_osc_config_controller_get_type ags_osc_connection_get_type ags_osc_controller_get_type ags_osc_export_controller_get_type ags_osc_front_controller_get_type ags_osc_info_controller_get_type ags_osc_message_get_type ags_osc_meter_controller_get_type ags_osc_node_controller_get_type ags_osc_parser_get_type ags_osc_plugin_controller_get_type ags_osc_renew_controller_get_type ags_osc_response_get_type ags_osc_server_get_type ags_osc_status_controller_get_type ags_osc_websocket_connection_get_type ags_osc_xmlrpc_controller_get_type ags_osc_xmlrpc_message_get_type ags_osc_xmlrpc_server_get_type ags_output_get_type ags_pattern_get_type ags_peak_audio_signal_get_type ags_peak_channel_get_type ags_peak_channel_run_get_type ags_peak_recycling_get_type ags_play_audio_get_type ags_play_audio_signal_get_type ags_play_channel_get_type ags_play_channel_run_get_type ags_play_channel_run_master_get_type ags_play_dssi_audio_get_type ags_play_dssi_audio_run_get_type ags_play_lv2_audio_get_type ags_play_lv2_audio_run_get_type ags_play_notation_audio_get_type ags_play_notation_audio_run_get_type ags_play_recycling_get_type ags_play_wave_audio_get_type ags_play_wave_audio_run_get_type ags_play_wave_channel_get_type ags_play_wave_channel_run_get_type ags_playback_domain_get_type ags_playback_get_type ags_plugin_port_get_type ags_port_get_type ags_prepare_audio_signal_get_type ags_prepare_channel_get_type ags_prepare_channel_run_get_type ags_prepare_recycling_get_type ags_preset_get_type ags_pulse_client_get_type ags_pulse_devin_get_type ags_pulse_devout_get_type ags_pulse_port_get_type ags_pulse_server_get_type ags_recall_audio_get_type ags_recall_audio_run_get_type ags_recall_audio_signal_get_type ags_recall_channel_get_type ags_recall_channel_run_get_type ags_recall_container_get_type ags_recall_dependency_get_type ags_recall_dssi_get_type ags_recall_dssi_run_get_type ags_recall_factory_get_type ags_recall_get_type ags_recall_id_get_type ags_recall_ladspa_get_type ags_recall_ladspa_run_get_type ags_recall_lv2_get_type ags_recall_lv2_run_get_type ags_recall_recycling_get_type ags_record_midi_audio_get_type ags_record_midi_audio_run_get_type ags_recycling_context_get_type ags_recycling_get_type ags_remove_audio_get_type ags_remove_audio_signal_get_type ags_remove_note_get_type ags_remove_soundcard_get_type ags_reset_amplitude_get_type ags_reset_note_get_type ags_reset_peak_get_type ags_resize_audio_get_type ags_route_dssi_audio_get_type ags_route_dssi_audio_run_get_type ags_route_lv2_audio_get_type ags_route_lv2_audio_run_get_type ags_rt_stream_audio_signal_get_type ags_rt_stream_channel_get_type ags_rt_stream_channel_run_get_type ags_rt_stream_recycling_get_type ags_seek_soundcard_get_type ags_sequencer_thread_get_type ags_set_audio_channels_get_type ags_set_buffer_size_get_type ags_set_device_get_type ags_set_format_get_type ags_set_muted_get_type ags_set_samplerate_get_type ags_sf2_loader_get_type ags_sfz_file_get_type ags_sfz_group_get_type ags_sfz_loader_get_type ags_sfz_region_get_type ags_sfz_sample_get_type ags_sndfile_get_type ags_sound_container_get_type ags_sound_provider_get_type ags_sound_resource_get_type ags_soundcard_thread_get_type ags_start_audio_get_type ags_start_channel_get_type ags_start_sequencer_get_type ags_start_soundcard_get_type ags_stop_sequencer_get_type ags_stop_soundcard_get_type ags_stream_audio_signal_get_type ags_stream_channel_get_type ags_stream_channel_run_get_type ags_stream_recycling_get_type ags_switch_buffer_flag_get_type ags_synth_generator_get_type ags_tic_device_get_type ags_toggle_pattern_bit_get_type ags_track_get_type ags_volume_audio_signal_get_type ags_volume_channel_get_type ags_volume_channel_run_get_type ags_volume_recycling_get_type ags_wasapi_devin_get_type ags_wasapi_devout_get_type ags_wave_get_type ags_wave_loader_get_type gsequencer-3.1.3/docs/reference/libgsequencer/0000755000175000017500000000000013622252264016402 500000000000000gsequencer-3.1.3/docs/reference/libgsequencer/libgsequencer-overrides.txt0000644000175000017500000000000013461636435023710 00000000000000gsequencer-3.1.3/docs/reference/libgsequencer/libgsequencer.interfaces.in0000644000175000017500000003172613607210263023631 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . GtkWidget AtkImplementorIface GtkBuildable GtkContainer AtkImplementorIface GtkBuildable GtkBin AtkImplementorIface GtkBuildable GtkWindow AtkImplementorIface GtkBuildable AgsAnimationWindow AtkImplementorIface GtkBuildable AgsAutomationWindow AtkImplementorIface GtkBuildable AgsConnectable GtkDialog AtkImplementorIface GtkBuildable AgsConnectionEditor AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsCropNoteDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsEnvelopeDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsMachineEditor AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsMachineSelection AtkImplementorIface GtkBuildable AgsConnectable AgsMidiDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsMidiExportWizard AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsMidiImportWizard AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsMoveNoteDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsPluginBrowser AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsPositionAutomationCursorDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsPositionNotationCursorDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsPositionWaveCursorDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsPreferences AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsRampAccelerationDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsSelectAccelerationDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsSelectBufferDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsSelectNoteDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsWaveExportDialog AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsExportWindow AtkImplementorIface GtkBuildable AgsConnectable AgsPlaybackWindow AtkImplementorIface GtkBuildable AgsConnectable AgsSheetWindow AtkImplementorIface GtkBuildable AgsConnectable AgsWaveWindow AtkImplementorIface GtkBuildable AgsConnectable AgsWindow AtkImplementorIface GtkBuildable AgsConnectable AgsMachine AtkImplementorIface GtkBuildable AgsConnectable AgsAudiorec AtkImplementorIface GtkBuildable AgsConnectable AgsDesk AtkImplementorIface GtkBuildable AgsConnectable AgsDrum AtkImplementorIface GtkBuildable AgsConnectable AgsDssiBridge AtkImplementorIface GtkBuildable AgsConnectable AgsEqualizer10 AtkImplementorIface GtkBuildable AgsConnectable AgsFFPlayer AtkImplementorIface GtkBuildable AgsConnectable AgsFMSyncsynth AtkImplementorIface GtkBuildable AgsConnectable AgsFMSynth AtkImplementorIface GtkBuildable AgsConnectable AgsLadspaBridge AtkImplementorIface GtkBuildable AgsConnectable AgsLiveDssiBridge AtkImplementorIface GtkBuildable AgsConnectable AgsLiveLv2Bridge AtkImplementorIface GtkBuildable AgsConnectable AgsLv2Bridge AtkImplementorIface GtkBuildable AgsConnectable AgsMatrix AtkImplementorIface GtkBuildable AgsConnectable AgsMixer AtkImplementorIface GtkBuildable AgsConnectable AgsPanel AtkImplementorIface GtkBuildable AgsConnectable AgsPitchSampler AtkImplementorIface GtkBuildable AgsConnectable AgsSpectrometer AtkImplementorIface GtkBuildable AgsConnectable AgsSyncsynth AtkImplementorIface GtkBuildable AgsConnectable AgsSynth AtkImplementorIface GtkBuildable AgsConnectable GtkFrame AtkImplementorIface GtkBuildable AgsBulkMember AtkImplementorIface GtkBuildable AgsConnectable AgsFMOscillator AtkImplementorIface GtkBuildable AgsConnectable AgsLineMember AtkImplementorIface GtkBuildable AgsConnectable AgsOscillator AtkImplementorIface GtkBuildable AgsConnectable GtkButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable GtkToggleButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable GtkCheckButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable GtkRadioButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable AgsMachineRadioButton AtkImplementorIface GtkBuildable GtkActionable GtkActivatable AgsConnectable AgsScrolledAutomationEditBox AtkImplementorIface GtkBuildable AgsScrolledWaveEditBox AtkImplementorIface GtkBuildable GtkBox AtkImplementorIface GtkBuildable GtkOrientable GtkVBox AtkImplementorIface GtkBuildable GtkOrientable AgsAudioPreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsAutomationEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsDeskInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsDrumInputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsDrumOutputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsFMSynthInputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsMixerInputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsPanelInputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsSynthInputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsDrumInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsDrumOutputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsFMSynthInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsMixerInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsPanelInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsSynthInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsDssiBrowser AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsEffectBridge AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsFFPlayerBridge AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsMatrixBridge AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsEffectBulk AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsFFPlayerBulkInput AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsMatrixBulkInput AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsEffectLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsFFPlayerInputLine AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsEffectPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsFFPlayerInputPad AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsEnvelopeEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsEnvelopeInfo AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsExportSoundcard AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsGenericPreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsPropertyEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsPropertyListingEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsInputListingEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsListingEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsOutputListingEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsPropertyCollectionEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsLadspaBrowser AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsLineEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsLineMemberEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsLv2Browser AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsMachineCollection AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsMachineSelector AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsMidiPreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsNavigation AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsNotationEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsOscServerPreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsPadEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsPatternEnvelope AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsPerformancePreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsPitchSamplerFile AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsPluginPreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsSequencerEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsServerPreferences AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsSheetEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsSoundcardEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsTrackCollection AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsWaveEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsAutomationEditBox AtkImplementorIface GtkBuildable GtkOrientable AgsVAutomationEditBox AtkImplementorIface GtkBuildable GtkOrientable GtkHBox AtkImplementorIface GtkBuildable GtkOrientable AgsEffectSeparator AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsInputEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsLinkEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsOutputEditor AtkImplementorIface GtkBuildable GtkOrientable AgsConnectable AgsApplicable AgsWaveEditBox AtkImplementorIface GtkBuildable GtkOrientable AgsVWaveEditBox AtkImplementorIface GtkBuildable GtkOrientable GtkTable AtkImplementorIface GtkBuildable AgsAutomationEdit AtkImplementorIface GtkBuildable AgsConnectable AgsCellPattern AtkImplementorIface GtkBuildable AgsConnectable AgsInputCollectionEditor AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsLinkCollectionEditor AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsMachineCollectionEntry AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsNotationEdit AtkImplementorIface GtkBuildable AgsConnectable AgsOutputCollectionEditor AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsPatternBox AtkImplementorIface GtkBuildable AgsConnectable AgsSheetEdit AtkImplementorIface GtkBuildable AgsConnectable AgsTrackCollectionMapper AtkImplementorIface GtkBuildable AgsConnectable AgsApplicable AgsWaveEdit AtkImplementorIface GtkBuildable AgsConnectable GtkToolbar AtkImplementorIface GtkBuildable GtkToolShell GtkOrientable AgsAutomationToolbar AtkImplementorIface GtkBuildable GtkToolShell GtkOrientable AgsConnectable AgsNotationToolbar AtkImplementorIface GtkBuildable GtkToolShell GtkOrientable AgsConnectable AgsSheetToolbar AtkImplementorIface GtkBuildable GtkToolShell GtkOrientable AgsConnectable AgsWaveToolbar AtkImplementorIface GtkBuildable GtkToolShell GtkOrientable AgsConnectable GtkMenuShell AtkImplementorIface GtkBuildable GtkMenu AtkImplementorIface GtkBuildable AgsContextMenu AtkImplementorIface GtkBuildable AgsConnectable GtkMenuBar AtkImplementorIface GtkBuildable AgsMenuBar AtkImplementorIface GtkBuildable AgsConnectable AgsSimpleFileRead AgsConnectable AgsSimpleFileWrite AgsConnectable AgsUiOscRenewController AgsOscPluginController AgsApplicationContext AgsConnectable AgsXorgApplicationContext AgsConnectable AgsConcurrencyProvider AgsServiceProvider AgsSoundProvider AgsUiProvider GtkWidgetAccessible AtkComponent GtkContainerAccessible AtkComponent GtkWindowAccessible AtkComponent AtkWindow GtkFrameAccessible AtkComponent GtkMenuShellAccessible AtkComponent AtkSelection GtkMenuAccessible AtkComponent AtkSelection GtkButtonAccessible AtkComponent AtkAction AtkImage GtkToggleButtonAccessible AtkComponent AtkAction AtkImage GtkRadioButtonAccessible AtkComponent AtkAction AtkImage GdkPixbuf GIcon GLoadableIcon GApplication GActionGroup GActionMap GtkApplication GActionGroup GActionMap AgsAudio AgsConnectable AgsPort AgsConnectable AgsChannel AgsConnectable GtkAction GtkBuildable AgsTaskLauncher AgsConnectable gsequencer-3.1.3/docs/reference/libgsequencer/libgsequencer.types.in0000644000175000017500000001144313607210263022644 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_animation_window_get_type ags_audio_preferences_get_type ags_audiorec_get_type ags_automation_edit_box_get_type ags_automation_edit_get_type ags_automation_editor_get_type ags_automation_toolbar_get_type ags_automation_window_get_type ags_bulk_member_get_type ags_cell_pattern_get_type ags_connection_editor_get_type ags_context_menu_get_type ags_crop_note_dialog_get_type ags_desk_get_type ags_desk_input_pad_get_type ags_drum_get_type ags_drum_input_line_get_type ags_drum_input_pad_get_type ags_drum_output_line_get_type ags_drum_output_pad_get_type ags_dssi_bridge_get_type ags_dssi_browser_get_type ags_effect_bridge_get_type ags_effect_bulk_get_type ags_effect_line_get_type ags_effect_pad_get_type ags_effect_separator_get_type ags_envelope_dialog_get_type ags_envelope_editor_get_type ags_envelope_info_get_type ags_equalizer10_get_type ags_export_soundcard_get_type ags_export_window_get_type ags_ffplayer_bridge_get_type ags_ffplayer_bulk_input_get_type ags_ffplayer_get_type ags_ffplayer_input_line_get_type ags_ffplayer_input_pad_get_type ags_fm_oscillator_get_type ags_fm_syncsynth_get_type ags_fm_synth_get_type ags_fm_synth_input_line_get_type ags_fm_synth_input_pad_get_type ags_generic_preferences_get_type ags_input_collection_editor_get_type ags_input_editor_get_type ags_input_listing_editor_get_type ags_ladspa_bridge_get_type ags_ladspa_browser_get_type ags_line_editor_get_type ags_line_get_type ags_line_member_editor_get_type ags_line_member_get_type ags_link_collection_editor_get_type ags_link_editor_get_type ags_listing_editor_get_type ags_live_dssi_bridge_get_type ags_live_lv2_bridge_get_type ags_lv2_bridge_get_type ags_lv2_browser_get_type ags_machine_collection_entry_get_type ags_machine_collection_get_type ags_machine_editor_get_type ags_machine_get_type ags_machine_radio_button_get_type ags_machine_selection_get_type ags_machine_selector_get_type ags_matrix_bridge_get_type ags_matrix_bulk_input_get_type ags_matrix_get_type ags_menu_bar_get_type ags_midi_dialog_get_type ags_midi_export_wizard_get_type ags_midi_import_wizard_get_type ags_midi_preferences_get_type ags_mixer_get_type ags_mixer_input_line_get_type ags_mixer_input_pad_get_type ags_move_note_dialog_get_type ags_navigation_get_type ags_notation_edit_get_type ags_notation_editor_get_type ags_notation_toolbar_get_type ags_osc_server_preferences_get_type ags_oscillator_get_type ags_output_collection_editor_get_type ags_output_editor_get_type ags_output_listing_editor_get_type ags_pad_editor_get_type ags_pad_get_type ags_panel_get_type ags_panel_input_line_get_type ags_panel_input_pad_get_type ags_pattern_box_get_type ags_pattern_envelope_get_type ags_performance_preferences_get_type ags_pitch_sampler_file_get_type ags_pitch_sampler_get_type ags_playback_window_get_type ags_plugin_browser_get_type ags_plugin_preferences_get_type ags_position_automation_cursor_dialog_get_type ags_position_notation_cursor_dialog_get_type ags_position_wave_cursor_dialog_get_type ags_preferences_get_type ags_property_collection_editor_get_type ags_property_editor_get_type ags_property_listing_editor_get_type ags_ramp_acceleration_dialog_get_type ags_scrolled_automation_edit_box_get_type ags_scrolled_wave_edit_box_get_type ags_select_acceleration_dialog_get_type ags_select_buffer_dialog_get_type ags_select_note_dialog_get_type ags_sequencer_editor_get_type ags_server_preferences_get_type ags_sheet_edit_get_type ags_sheet_editor_get_type ags_sheet_toolbar_get_type ags_sheet_window_get_type ags_simple_file_get_type ags_simple_file_read_get_type ags_simple_file_write_get_type ags_soundcard_editor_get_type ags_spectrometer_get_type ags_syncsynth_get_type ags_synth_get_type ags_synth_input_line_get_type ags_synth_input_pad_get_type ags_track_collection_get_type ags_track_collection_mapper_get_type ags_ui_osc_renew_controller_get_type ags_ui_provider_get_type ags_vautomation_edit_box_get_type ags_vwave_edit_box_get_type ags_wave_edit_box_get_type ags_wave_edit_get_type ags_wave_editor_get_type ags_wave_export_dialog_get_type ags_wave_toolbar_get_type ags_wave_window_get_type ags_window_get_type ags_xorg_application_context_get_type gsequencer-3.1.3/docs/reference/libgsequencer/README0000644000175000017500000000023413607210263017175 00000000000000Third-party files of gtk-doc licensed under the terms of GNU GPLv3+, copyright provided by Stefan Sauer * Makefile.am (Copyright (C) Stefan Sauer, GPLv3+) gsequencer-3.1.3/docs/reference/libgsequencer/Makefile.in0000644000175000017500000013200213622252207020362 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/reference/libgsequencer ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/./gtk-doc.make $(srcdir)/Makefile.in \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # The name of the module, e.g. 'glib'. DOC_MODULE = libgsequencer # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE = $(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR = $(top_srcdir)/ags/X # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS = --cflags="$(CFLAGS) $(UUID_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBAO_CFLAGS) $(LIBXML2_CFLAGS) $(OPENSSL_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(XMLRPC_CFLAGS) $(XMLRPC_UTIL_CFLAGS) $(XMLRPC_SERVER_ABYSS_CFLAGS) $(XMLRPC_SERVER_CGI_CFLAGS) $(XMLRPC_SERVER_CFLAGS) $(PTH_FLAGS) $(JACK_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(UUID_LIBS) $(LIBASOUND2_LIBS) $(LIBAO_LIBS) $(LIBXML2_LIBS) $(OPENSSL_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) $(XMLRPC_LIBS) $(XMLRPC_UTIL_LIBS) $(XMLRPC_SERVER_ABYSS_LIBS) $(XMLRPC_SERVER_CGI_LIBS) $(XMLRPC_SERVER_LIBS) $(JACK_LIBS) -L$(top_builddir) $(top_builddir)/libags.la $(top_builddir)/libags_thread.la $(top_builddir)/libags_server.la $(top_builddir)/libags_audio.la $(top_builddir)/libags_gui.la $(top_builddir)/libgsequencer.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS = --xml-mode --output-format=xml --name-space=libgsequencer --module=libgsequencer # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS = # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = --module=libgsequencer --module-dir=./libgsequencer-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libgsequencer-doc/api --extra-dir=$(top_srcdir)/docs/reference/libags/libags-html --extra-dir=$(top_srcdir)/docs/reference/libags-audio/libags-audio-html --extra-dir=$(top_srcdir)/docs/reference/libags-gui/libags-gui-html # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB = CFILE_GLOB = # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES = # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES = # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES = # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files = # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files = AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS = $(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags.la \ $(top_builddir)/libags_thread.la \ $(top_builddir)/libags_server.la \ $(top_builddir)/libags_audio.la \ $(top_builddir)/libags_gui.la \ $(top_builddir)/libgsequencer.la \ $(gsequencer_LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test @GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp #### setup #### GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; #### scan #### GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; #### xml #### GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0 = @echo " DOC Building XML"; #### html #### GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; #### pdf #### GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; # This includes the standard gtk-doc make rules, copied by gtkdocize. # Comment this out if you want 'make check' to test you doc status # and run some sanity checks @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = \ @ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) @ENABLE_GTK_DOC_TRUE@TESTS = $(GTKDOC_CHECK) all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/./gtk-doc.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/reference/libgsequencer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/libgsequencer/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/./gtk-doc.make $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ags-docs-local: tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am @ENABLE_GTK_DOC_FALSE@all-local: all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-am ags-docs-am: ags-docs-local clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: check-am install-am install-strip .PHONY: ags-docs-am ags-docs-local all all-am all-local check \ check-TESTS check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am uninstall-local .PRECIOUS: Makefile gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc @ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libgsequencer-html && mkdir libgsequencer-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libgsequencer-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libgsequencer-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libgsequencer-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libgsequencer-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libgsequencer-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libgsequencer-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libgsequencer-html install-data-local: @installfiles=`echo $(builddir)/libgsequencer-html/*`; \ if test "$$installfiles" = '$(builddir)/libgsequencer-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # @HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs @HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" @HAVE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libgsequencer-html @cp ./libgsequencer-html/* $(distdir)/libgsequencer-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libgsequencer-html .PHONY : dist-hook-local docs -include $(top_srcdir)/git.mk # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/docs/reference/libgsequencer/gtk-doc.make0000644000175000017500000002556013521306053020513 00000000000000# -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc if ENABLE_GTK_DOC all-local: all-gtk-doc endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp #### scan #### GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0=@echo " DOC Building XML"; sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ #### html #### GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libgsequencer-html && mkdir libgsequencer-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libgsequencer-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libgsequencer-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libgsequencer-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libgsequencer-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libgsequencer-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp #### pdf #### GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libgsequencer-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libgsequencer-html install-data-local: @installfiles=`echo $(builddir)/libgsequencer-html/*`; \ if test "$$installfiles" = '$(builddir)/libgsequencer-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if HAVE_GTK_DOC dist-check-gtkdoc: docs else dist-check-gtkdoc: @echo "*** gtk-doc is needed to run 'make dist'. ***" @echo "*** gtk-doc was not found when 'configure' ran. ***" @echo "*** please install gtk-doc and rerun 'configure'. ***" @false endif dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libgsequencer-html @cp ./libgsequencer-html/* $(distdir)/libgsequencer-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libgsequencer-html .PHONY : dist-hook-local docs gsequencer-3.1.3/docs/reference/libgsequencer/git.mk0000644000175000017500000002441413461636435017452 00000000000000# git.mk # # Copyright 2009, Red Hat, Inc. # Copyright 2010,2011,2012,2013 Behdad Esfahbod # Written by Behdad Esfahbod # # Copying and distribution of this file, with or without modification, # is permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # The latest version of this file can be downloaded from: # https://raw.github.com/behdad/git.mk/master/git.mk # Bugs, etc, should be reported upstream at: # https://github.com/behdad/git.mk # # To use in your project, import this file in your git repo's toplevel, # then do "make -f git.mk". This modifies all Makefile.am files in # your project to -include git.mk. Remember to add that line to new # Makefile.am files you create in your project, or just rerun the # "make -f git.mk". # # This enables automatic .gitignore generation. If you need to ignore # more files, add them to the GITIGNOREFILES variable in your Makefile.am. # But think twice before doing that. If a file has to be in .gitignore, # chances are very high that it's a generated file and should be in one # of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES. # # The only case that you need to manually add a file to GITIGNOREFILES is # when remove files in one of mostlyclean-local, clean-local, distclean-local, # or maintainer-clean-local make targets. # # Note that for files like editor backup, etc, there are better places to # ignore them. See "man gitignore". # # If "make maintainer-clean" removes the files but they are not recognized # by this script (that is, if "git status" shows untracked files still), send # me the output of "git status" as well as your Makefile.am and Makefile for # the directories involved and I'll diagnose. # # For a list of toplevel files that should be in MAINTAINERCLEANFILES, see # Makefile.am.sample in the git.mk git repo. # # Don't EXTRA_DIST this file. It is supposed to only live in git clones, # not tarballs. It serves no useful purpose in tarballs and clutters the # build dir. # # This file knows how to handle autoconf, automake, libtool, gtk-doc, # gnome-doc-utils, yelp.m4, mallard, intltool, gsettings, dejagnu, appdata, # appstream. # # This makefile provides the following targets: # # - all: "make all" will build all gitignore files. # - gitignore: makes all gitignore files in the current dir and subdirs. # - .gitignore: make gitignore file for the current dir. # - gitignore-recurse: makes all gitignore files in the subdirs. # # KNOWN ISSUES: # # - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the # submodule doesn't find us. If you have configure.{in,ac} files in # subdirs, add a proxy git.mk file in those dirs that simply does: # "include $(top_srcdir)/../git.mk". Add more ..'s to your taste. # And add those files to git. See vte/gnome-pty-helper/git.mk for # example. # ############################################################################### # Variables user modules may want to add to toplevel MAINTAINERCLEANFILES: ############################################################################### # # Most autotools-using modules should be fine including this variable in their # toplevel MAINTAINERCLEANFILES: GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL = \ $(srcdir)/aclocal.m4 \ $(srcdir)/autoscan.log \ $(srcdir)/configure.scan \ `AUX_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_AUX_DIR:$$1' ./configure.ac); \ test "x$$AUX_DIR" = "x$(srcdir)/" && AUX_DIR=$(srcdir); \ for x in \ ar-lib \ compile \ config.guess \ config.sub \ depcomp \ install-sh \ ltmain.sh \ missing \ mkinstalldirs \ test-driver \ ylwrap \ ; do echo "$$AUX_DIR/$$x"; done` \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_HEADERS:$$1' ./configure.ac | \ head -n 1 | while read f; do echo "$(srcdir)/$$f.in"; done` # # All modules should also be fine including the following variable, which # removes automake-generated Makefile.in files: GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN = \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_FILES:$$1' ./configure.ac | \ while read f; do \ case $$f in Makefile|*/Makefile) \ test -f "$(srcdir)/$$f.am" && echo "$(srcdir)/$$f.in";; esac; \ done` # # Modules that use libtool and use AC_CONFIG_MACRO_DIR() may also include this, # though it's harmless to include regardless. GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL = \ `MACRO_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_MACRO_DIR:$$1' ./configure.ac); \ if test "x$$MACRO_DIR" != "x$(srcdir)/"; then \ for x in \ libtool.m4 \ ltoptions.m4 \ ltsugar.m4 \ ltversion.m4 \ lt~obsolete.m4 \ ; do echo "$$MACRO_DIR/$$x"; done; \ fi` ############################################################################### # Default rule is to install ourselves in all Makefile.am files: ############################################################################### git-all: git-mk-install git-mk-install: @echo "Installing git makefile" @any_failed=; \ find "`test -z "$(top_srcdir)" && echo . || echo "$(top_srcdir)"`" -name Makefile.am | while read x; do \ if grep 'include .*/git.mk' $$x >/dev/null; then \ echo "$$x already includes git.mk"; \ else \ failed=; \ echo "Updating $$x"; \ { cat $$x; \ echo ''; \ echo '-include $$(top_srcdir)/git.mk'; \ } > $$x.tmp || failed=1; \ if test x$$failed = x; then \ mv $$x.tmp $$x || failed=1; \ fi; \ if test x$$failed = x; then : else \ echo "Failed updating $$x"; >&2 \ any_failed=1; \ fi; \ fi; done; test -z "$$any_failed" .PHONY: git-all git-mk-install ############################################################################### # Actual .gitignore generation: ############################################################################### $(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk @echo "git.mk: Generating $@" @{ \ if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \ for x in \ $(DOC_MODULE)-decl-list.txt \ $(DOC_MODULE)-decl.txt \ tmpl/$(DOC_MODULE)-unused.sgml \ "tmpl/*.bak" \ xml html \ ; do echo "/$$x"; done; \ FLAVOR=$$(cd $(top_srcdir); $(AUTOCONF) --trace 'GTK_DOC_CHECK:$$2' ./configure.ac); \ case $$FLAVOR in *no-tmpl*) echo /tmpl;; esac; \ fi; \ if test "x$(DOC_MODULE)$(DOC_ID)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \ for lc in $(DOC_LINGUAS); do \ for x in \ $(if $(DOC_MODULE),$(DOC_MODULE).xml) \ $(DOC_PAGES) \ $(DOC_INCLUDES) \ ; do echo "/$$lc/$$x"; done; \ done; \ for x in \ $(_DOC_OMF_ALL) \ $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) \ $(_DOC_MOFILES) \ $(DOC_H_FILE) \ "*/.xml2po.mo" \ "*/*.omf.out" \ ; do echo /$$x; done; \ fi; \ if test "x$(HELP_ID)" = x -o "x$(HELP_LINGUAS)" = x; then :; else \ for lc in $(HELP_LINGUAS); do \ for x in \ $(HELP_FILES) \ "$$lc.stamp" \ "$$lc.mo" \ ; do echo "/$$lc/$$x"; done; \ done; \ fi; \ if test "x$(gsettings_SCHEMAS)" = x; then :; else \ for x in \ $(gsettings_SCHEMAS:.xml=.valid) \ $(gsettings__enum_file) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appdata_XML)" = x; then :; else \ for x in \ $(appdata_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appstream_XML)" = x; then :; else \ for x in \ $(appstream_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/po/Makefile.in.in; then \ for x in \ po/Makefile.in.in \ po/Makefile.in.in~ \ po/Makefile.in \ po/Makefile \ po/Makevars.template \ po/POTFILES \ po/Rules-quot \ po/stamp-it \ po/.intltool-merge-cache \ "po/*.gmo" \ "po/*.header" \ "po/*.mo" \ "po/*.sed" \ "po/*.sin" \ po/$(GETTEXT_PACKAGE).pot \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/configure; then \ for x in \ autom4te.cache \ configure \ config.h \ stamp-h1 \ libtool \ config.lt \ ; do echo "/$$x"; done; \ fi; \ if test "x$(DEJATOOL)" = x; then :; else \ for x in \ $(DEJATOOL) \ ; do echo "/$$x.sum"; echo "/$$x.log"; done; \ echo /site.exp; \ fi; \ if test "x$(am__dirstamp)" = x; then :; else \ echo "$(am__dirstamp)"; \ fi; \ if test "x$(LTCOMPILE)" = x -a "x$(LTCXXCOMPILE)" = x -a "x$(GTKDOC_RUN)" = x; then :; else \ for x in \ "*.lo" \ ".libs" "_libs" \ ; do echo "$$x"; done; \ fi; \ for x in \ .gitignore \ $(GITIGNOREFILES) \ $(CLEANFILES) \ $(PROGRAMS) $(check_PROGRAMS) $(EXTRA_PROGRAMS) \ $(LIBRARIES) $(check_LIBRARIES) $(EXTRA_LIBRARIES) \ $(LTLIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LTLIBRARIES) \ so_locations \ $(MOSTLYCLEANFILES) \ $(TEST_LOGS) \ $(TEST_LOGS:.log=.trs) \ $(TEST_SUITE_LOG) \ "*.gcda" \ "*.gcno" \ $(DISTCLEANFILES) \ $(am__CONFIG_DISTCLEAN_FILES) \ $(CONFIG_CLEAN_FILES) \ TAGS ID GTAGS GRTAGS GSYMS GPATH tags \ "*.tab.c" \ $(MAINTAINERCLEANFILES) \ $(BUILT_SOURCES) \ $(patsubst %.vala,%.c,$(filter %.vala,$(SOURCES))) \ $(filter %_vala.stamp,$(DIST_COMMON)) \ $(filter %.vapi,$(DIST_COMMON)) \ $(filter $(addprefix %,$(notdir $(patsubst %.vapi,%.h,$(filter %.vapi,$(DIST_COMMON))))),$(DIST_COMMON)) \ Makefile \ Makefile.in \ "*.orig" \ "*.rej" \ "*.bak" \ "*~" \ ".*.sw[nop]" \ ".dirstamp" \ ; do echo "/$$x"; done; \ for x in \ "*.$(OBJEXT)" \ $(DEPDIR) \ ; do echo "$$x"; done; \ } | \ sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \ sed 's@/[.]/@/@g' | \ LC_ALL=C sort | uniq > $@.tmp && \ mv $@.tmp $@; all: $(srcdir)/.gitignore gitignore-recurse-maybe gitignore: $(srcdir)/.gitignore gitignore-recurse gitignore-recurse-maybe: @for subdir in $(DIST_SUBDIRS); do \ case " $(SUBDIRS) " in \ *" $$subdir "*) :;; \ *) test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir");; \ esac; \ done gitignore-recurse: @for subdir in $(DIST_SUBDIRS); do \ test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir"); \ done maintainer-clean: gitignore-clean gitignore-clean: -rm -f $(srcdir)/.gitignore .PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe gsequencer-3.1.3/docs/reference/libgsequencer/Makefile.am0000644000175000017500000001072613606660256020372 00000000000000# This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=libgsequencer # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE=$(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR=$(top_srcdir)/ags/X # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS=--cflags="$(CFLAGS) $(UUID_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBAO_CFLAGS) $(LIBXML2_CFLAGS) $(OPENSSL_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(XMLRPC_CFLAGS) $(XMLRPC_UTIL_CFLAGS) $(XMLRPC_SERVER_ABYSS_CFLAGS) $(XMLRPC_SERVER_CGI_CFLAGS) $(XMLRPC_SERVER_CFLAGS) $(PTH_FLAGS) $(JACK_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(UUID_LIBS) $(LIBASOUND2_LIBS) $(LIBAO_LIBS) $(LIBXML2_LIBS) $(OPENSSL_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) $(XMLRPC_LIBS) $(XMLRPC_UTIL_LIBS) $(XMLRPC_SERVER_ABYSS_LIBS) $(XMLRPC_SERVER_CGI_LIBS) $(XMLRPC_SERVER_LIBS) $(JACK_LIBS) -L$(top_builddir) $(top_builddir)/libags.la $(top_builddir)/libags_thread.la $(top_builddir)/libags_server.la $(top_builddir)/libags_audio.la $(top_builddir)/libags_gui.la $(top_builddir)/libgsequencer.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml --name-space=libgsequencer --module=libgsequencer # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS=--module=libgsequencer --module-dir=./libgsequencer-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libgsequencer-doc/api --extra-dir=$(top_srcdir)/docs/reference/libags/libags-html --extra-dir=$(top_srcdir)/docs/reference/libags-audio/libags-audio-html --extra-dir=$(top_srcdir)/docs/reference/libags-gui/libags-gui-html # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB= CFILE_GLOB= # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES= # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files= # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files= AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=$(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags.la \ $(top_builddir)/libags_thread.la \ $(top_builddir)/libags_server.la \ $(top_builddir)/libags_audio.la \ $(top_builddir)/libags_gui.la \ $(top_builddir)/libgsequencer.la \ $(gsequencer_LDFLAGS) # This includes the standard gtk-doc make rules, copied by gtkdocize. include ./gtk-doc.make # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk gsequencer-3.1.3/docs/reference/libgsequencer/libgsequencer.xml0000644000175000017500000004022713607210263021675 00000000000000 %gtkdocentities; ]> Advanced Gtk+ Sequencer Application Reference Manual for libgsequencer. The latest version of this documentation can be found on-line at http://nongnu.org/gsequencer/api/&package_version;/libgsequencer/. GSequencer UI Library GSequencer main application Composite widgets related to main application. GSequencer preferences Composite widgets related to preferences. Fundamental machine types Fundamental composite widgets to create machines. Machine dialogs Dialogs related to machine. Editor miscellaneous widgets Miscellaneous widgets related to editors. Notation editor widgets Widgets related to notation editor. Automation editor widgets Widgets related to automation editor. Wave editor widgets Widgets related to wave form editor. Audio machines The machine composite widgets. GUI files The persistency layer. GUI tasks Tasks provided by UI. Object Hierarchy API Index Index of deprecated API gsequencer-3.1.3/docs/reference/libgsequencer/libgsequencer-sections.txt.in0000644000175000017500000030660213607210263024150 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see .
ags_animation_window AgsAnimationWindow ags_animation_window_progress_timeout ags_animation_window_new AGS_ANIMATION_WINDOW AGS_ANIMATION_WINDOW_CLASS AGS_ANIMATION_WINDOW_GET_CLASS AGS_IS_ANIMATION_WINDOW AGS_TYPE_ANIMATION_WINDOW AgsAnimationWindow AgsAnimationWindowClass ags_animation_window_get_type
ags_audio_preferences AgsAudioPreferences AgsAudioPreferencesFlags ags_audio_preferences_new AGS_AUDIO_PREFERENCES AGS_AUDIO_PREFERENCES_CLASS AGS_AUDIO_PREFERENCES_GET_CLASS AGS_IS_AUDIO_PREFERENCES AGS_TYPE_AUDIO_PREFERENCES AgsAudioPreferences AgsAudioPreferencesClass ags_audio_preferences_get_type
ags_audio_preferences_callbacks ags_audio_preferences_parent_set_callback ags_audio_preferences_add_callback ags_audio_preferences_remove_soundcard_editor_callback ags_audio_preferences_enable_jack_callback ags_audio_preferences_start_jack_callback ags_audio_preferences_stop_jack_callback
ags_audiorec AgsAudiorec ags_audiorec_open_filename ags_audiorec_wave_loader_completed_timeout ags_audiorec_indicator_queue_draw_timeout ags_audiorec_new AGS_AUDIOREC AGS_AUDIOREC_CLASS AGS_AUDIOREC_GET_CLASS AGS_IS_AUDIOREC AGS_TYPE_AUDIOREC AgsAudiorec AgsAudiorecClass ags_audiorec_get_type
ags_audiorec_callbacks ags_audiorec_parent_set_callback ags_audiorec_open_callback ags_audiorec_keep_data_callback ags_audiorec_replace_data_callback ags_audiorec_mix_data_callback
ags_automation_edit AgsAutomationEdit AGS_AUTOMATION_EDIT_DEFAULT_HEIGHT AGS_AUTOMATION_EDIT_DEFAULT_WIDTH AGS_AUTOMATION_EDIT_DEFAULT_POINT_RADIUS AGS_AUTOMATION_EDIT_DEFAULT_SCAN_HEIGHT AGS_AUTOMATION_EDIT_DEFAULT_SCAN_WIDTH AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_WIDTH AGS_AUTOMATION_EDIT_DEFAULT_CONTROL_HEIGHT AGS_AUTOMATION_EDIT_DEFAULT_STEP_COUNT AGS_AUTOMATION_EDIT_DEFAULT_CURSOR_POSITION_X AGS_AUTOMATION_EDIT_DEFAULT_CURSOR_POSITION_Y AGS_AUTOMATION_EDIT_DEFAULT_SELECTED_ACCELERATION_BORDER AGS_AUTOMATION_EDIT_DEFAULT_FADER_WIDTH AGS_AUTOMATION_EDIT_CURSOR_WIDTH AGS_AUTOMATION_EDIT_CURSOR_HEIGHT AGS_AUTOMATION_EDIT_MIN_ZOOM AGS_AUTOMATION_EDIT_MAX_ZOOM AGS_AUTOMATION_EDIT_DEFAULT_LOWER AGS_AUTOMATION_EDIT_DEFAULT_UPPER AGS_AUTOMATION_EDIT_DEFAULT_VALUE AGS_AUTOMATION_EDIT_DEFAULT_PADDING AgsAutomationEditFlags AgsAutomationEditMode AgsAutomationEditButtonMask AgsAutomationEditKeyMask ags_automation_edit_reset_vscrollbar ags_automation_edit_reset_hscrollbar ags_automation_edit_draw_segment ags_automation_edit_draw_position ags_automation_edit_draw_cursor ags_automation_edit_draw_selection ags_automation_edit_draw_acceleration ags_automation_edit_draw_automation ags_automation_edit_draw ags_automation_edit_new AGS_AUTOMATION_EDIT AGS_AUTOMATION_EDIT_CLASS AGS_AUTOMATION_EDIT_GET_CLASS AGS_IS_AUTOMATION_EDIT AGS_TYPE_AUTOMATION_EDIT AgsAutomationEdit AgsAutomationEditClass ags_automation_edit_get_type
ags_automation_edit_box AgsAutomationEditBox AGS_AUTOMATION_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT AgsAutomationEditBoxFlags ags_automation_edit_box_new AGS_AUTOMATION_EDIT_BOX AGS_AUTOMATION_EDIT_BOX_CLASS AGS_AUTOMATION_EDIT_BOX_GET_CLASS AGS_IS_AUTOMATION_EDIT_BOX AGS_TYPE_AUTOMATION_EDIT_BOX AgsAutomationEditBox AgsAutomationEditBoxClass ags_automation_edit_box_get_type
ags_automation_edit_callbacks ags_automation_edit_draw_callback ags_automation_edit_drawing_area_configure_event ags_automation_edit_drawing_area_button_press_event ags_automation_edit_drawing_area_button_release_event ags_automation_edit_drawing_area_motion_notify_event ags_automation_edit_drawing_area_key_press_event ags_automation_edit_drawing_area_key_release_event ags_automation_edit_vscrollbar_value_changed ags_automation_edit_hscrollbar_value_changed
ags_automation_editor AgsAutomationEditor AGS_AUTOMATION_EDITOR_CHILD AGS_AUTOMATION_EDITOR_MAX_VALUE_COUNT AGS_AUTOMATION_EDITOR_MAX_CONTROLS AGS_AUTOMATION_EDITOR_DEFAULT_VERSION AGS_AUTOMATION_EDITOR_DEFAULT_BUILD_ID AgsAutomationEditorFlags ags_automation_editor_reset_audio_scrollbar ags_automation_editor_reset_output_scrollbar ags_automation_editor_reset_input_scrollbar ags_automation_editor_machine_changed ags_automation_editor_add_acceleration ags_automation_editor_delete_acceleration ags_automation_editor_select_region ags_automation_editor_select_all ags_automation_editor_paste ags_automation_editor_copy ags_automation_editor_cut ags_automation_editor_invert ags_automation_editor_new AGS_AUTOMATION_EDITOR AGS_AUTOMATION_EDITOR_CLASS AGS_AUTOMATION_EDITOR_GET_CLASS AGS_IS_AUTOMATION_EDITOR AGS_TYPE_AUTOMATION_EDITOR AgsAutomationEditor AgsAutomationEditorClass ags_automation_editor_get_type
ags_automation_editor_callbacks ags_automation_editor_audio_edit_configure_event ags_automation_editor_output_edit_configure_event ags_automation_editor_input_edit_configure_event ags_automation_editor_audio_vscrollbar_value_changed ags_automation_editor_audio_hscrollbar_value_changed ags_automation_editor_output_vscrollbar_value_changed ags_automation_editor_output_hscrollbar_value_changed ags_automation_editor_input_vscrollbar_value_changed ags_automation_editor_input_hscrollbar_value_changed ags_automation_editor_audio_automation_edit_hscrollbar_value_changed ags_automation_editor_output_automation_edit_hscrollbar_value_changed ags_automation_editor_input_automation_edit_hscrollbar_value_changed ags_automation_editor_machine_changed_callback ags_automation_editor_resize_audio_channels_callback ags_automation_editor_resize_pads_callback
ags_automation_toolbar AgsAutomationToolbar AGS_AUTOMATION_TOOLBAR_DATA_CHANNEL AGS_AUTOMATION_TOOLBAR_DATA_PORT AgsAutomationToolbarFlags ags_automation_toolbar_load_port ags_automation_toolbar_apply_port ags_automation_toolbar_tool_popup_new ags_automation_toolbar_new AGS_AUTOMATION_TOOLBAR AGS_AUTOMATION_TOOLBAR_CLASS AGS_AUTOMATION_TOOLBAR_GET_CLASS AGS_IS_AUTOMATION_TOOLBAR AGS_TYPE_AUTOMATION_TOOLBAR AgsAutomationToolbar AgsAutomationToolbarClass ags_automation_toolbar_get_type
ags_automation_toolbar_callbacks ags_automation_toolbar_machine_changed_callback ags_automation_toolbar_position_callback ags_automation_toolbar_edit_callback ags_automation_toolbar_clear_callback ags_automation_toolbar_select_callback ags_automation_toolbar_copy_or_cut_callback ags_automation_toolbar_paste_callback ags_automation_toolbar_match_line_callback ags_automation_toolbar_no_duplicates_callback ags_automation_toolbar_tool_popup_select_acceleration_callback ags_automation_toolbar_tool_popup_ramp_acceleration_callback ags_automation_toolbar_tool_popup_position_cursor_callback ags_automation_toolbar_tool_popup_enable_all_lines_callback ags_automation_toolbar_tool_popup_disable_all_lines_callback ags_automation_toolbar_zoom_callback ags_automation_toolbar_port_callback ags_automation_toolbar_opacity_callback
ags_automation_window AgsAutomationWindow AgsAutomationWindowFlags ags_automation_window_new AGS_AUTOMATION_WINDOW AGS_AUTOMATION_WINDOW_CLASS AGS_AUTOMATION_WINDOW_GET_CLASS AGS_IS_AUTOMATION_WINDOW AGS_TYPE_AUTOMATION_WINDOW AgsAutomationWindow AgsAutomationWindowClass ags_automation_window_get_type
ags_automation_window_callbacks
ags_bulk_member AgsBulkMember AGS_BULK_PORT AGS_BULK_MEMBER_DEFAULT_VERSION AGS_BULK_MEMBER_DEFAULT_BUILD_ID AgsBulkMemberFlags AgsBulkMemberPortFlags AgsBulkPort ags_bulk_port_alloc ags_bulk_port_free ags_bulk_port_find ags_bulk_member_get_widget ags_bulk_member_set_label ags_bulk_member_change_port ags_bulk_member_find_port ags_bulk_member_find_effect_and_specifier ags_bulk_member_new AGS_BULK_MEMBER AGS_BULK_MEMBER_CLASS AGS_BULK_MEMBER_GET_CLASS AGS_IS_BULK_MEMBER AGS_TYPE_BULK_MEMBER AgsBulkMember AgsBulkMemberClass ags_bulk_member_get_type
ags_bulk_member_callbacks ags_bulk_member_parent_set_callback ags_bulk_member_dial_changed_callback ags_bulk_member_vscale_changed_callback ags_bulk_member_hscale_changed_callback ags_bulk_member_spin_button_changed_callback ags_bulk_member_check_button_clicked_callback ags_bulk_member_toggle_button_clicked_callback ags_bulk_member_button_clicked_callback ags_bulk_member_port_safe_write_callback
ags_cell_pattern AgsCellPattern AGS_CELL_PATTERN_DEFAULT_CELL_WIDTH AGS_CELL_PATTERN_DEFAULT_CELL_HEIGHT AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_HORIZONTALLY AGS_CELL_PATTERN_MAX_CONTROLS_SHOWN_VERTICALLY AGS_CELL_PATTERN_DEFAULT_CONTROLS_HORIZONTALLY AGS_CELL_PATTERN_DEFAULT_CONTROLS_VERTICALLY AgsCellPatternFlags AgsCellPatternKeyMask AgsCellPatternAction ags_cell_pattern_draw_grid ags_cell_pattern_draw_matrix ags_cell_pattern_draw_cursor ags_cell_pattern_redraw_gutter_point ags_cell_pattern_highlight_gutter_point ags_cell_pattern_unpaint_gutter_point ags_cell_pattern_blink_worker ags_cell_pattern_led_queue_draw_timeout ags_cell_pattern_new AGS_CELL_PATTERN AGS_CELL_PATTERN_CLASS AGS_CELL_PATTERN_GET_CLASS AGS_IS_CELL_PATTERN AGS_TYPE_CELL_PATTERN AgsCellPattern AgsCellPatternClass ags_cell_pattern_get_type
ags_cell_pattern_callbacks ags_cell_pattern_draw_callback ags_cell_pattern_focus_in_callback ags_cell_pattern_drawing_area_configure_callback ags_cell_pattern_drawing_area_expose_callback ags_cell_pattern_drawing_area_button_press_callback ags_cell_pattern_drawing_area_key_press_event ags_cell_pattern_drawing_area_key_release_event ags_cell_pattern_adjustment_value_changed_callback
ags_connection_editor AgsConnectionEditor AGS_CONNECTION_EDITOR_DEFAULT_VERSION AGS_CONNECTION_EDITOR_DEFAULT_BUILD_ID AgsConnectionEditorFlags ags_connection_editor_set_machine ags_connection_editor_new AGS_CONNECTION_EDITOR AGS_CONNECTION_EDITOR_CLASS AGS_CONNECTION_EDITOR_GET_CLASS AGS_IS_CONNECTION_EDITOR AGS_TYPE_CONNECTION_EDITOR AgsConnectionEditor AgsConnectionEditorClass ags_connection_editor_get_type
ags_connection_editor_callbacks ags_connection_editor_apply_callback ags_connection_editor_ok_callback ags_connection_editor_cancel_callback ags_connection_editor_delete_event
ags_context_menu AgsContextMenu AgsContextMenuFlags ags_context_menu_new AGS_CONTEXT_MENU AGS_CONTEXT_MENU_CLASS AGS_CONTEXT_MENU_GET_CLASS AGS_IS_CONTEXT_MENU AGS_TYPE_CONTEXT_MENU AgsContextMenu AgsContextMenuClass ags_context_menu_get_type
ags_crop_note_dialog AgsCropNoteDialog AGS_CROP_NOTE_DIALOG_MAX_WIDTH AgsCropNoteDialogFlags ags_crop_note_dialog_new AGS_CROP_NOTE_DIALOG AGS_CROP_NOTE_DIALOG_CLASS AGS_CROP_NOTE_DIALOG_GET_CLASS AGS_IS_CROP_NOTE_DIALOG AGS_TYPE_CROP_NOTE_DIALOG AgsCropNoteDialog AgsCropNoteDialogClass ags_crop_note_dialog_get_type
ags_crop_note_dialog_callbacks ags_crop_note_dialog_response_callback ags_crop_note_dialog_absolute_callback
ags_desk AgsDesk ags_desk_new AGS_DESK AGS_DESK_CLASS AGS_DESK_GET_CLASS AGS_IS_DESK AGS_TYPE_DESK AgsDesk AgsDeskClass ags_desk_get_type
ags_desk_callbacks ags_desk_parent_set_callback ags_desk_resize_audio_channels_callback ags_desk_resize_pads_callback
ags_desk_input_pad AgsDeskInputPad AgsDeskInputPadFlags ags_desk_input_pad_new AGS_DESK_INPUT_PAD AGS_DESK_INPUT_PAD_CLASS AGS_DESK_INPUT_PAD_GET_CLASS AGS_IS_DESK_INPUT_PAD AGS_TYPE_DESK_INPUT_PAD AgsDeskInputPad AgsDeskInputPadClass ags_desk_input_pad_get_type
ags_desk_input_pad_callbacks
ags_drum AgsDrum ags_drum_new AGS_DRUM AGS_DRUM_CLASS AGS_DRUM_GET_CLASS AGS_IS_DRUM AGS_TYPE_DRUM AgsDrum AgsDrumClass ags_drum_get_type
ags_drum_callbacks ags_drum_parent_set_callback ags_drum_destroy_callback ags_drum_open_callback ags_drum_loop_button_callback ags_drum_length_spin_callback ags_drum_index0_callback ags_drum_index1_callback ags_drum_stop_callback
ags_drum_input_line AgsDrumInputLine ags_drum_input_line_new AGS_DRUM_INPUT_LINE AGS_DRUM_INPUT_LINE_CLASS AGS_DRUM_INPUT_LINE_GET_CLASS AGS_IS_DRUM_INPUT_LINE AGS_TYPE_DRUM_INPUT_LINE AgsDrumInputLine AgsDrumInputLineClass ags_drum_input_line_get_type
ags_drum_input_line_callbacks
ags_drum_input_pad AgsDrumInputPad AgsDrumInputPadFlags ags_drum_input_pad_new AGS_DRUM_INPUT_PAD AGS_DRUM_INPUT_PAD_CLASS AGS_DRUM_INPUT_PAD_GET_CLASS AGS_IS_DRUM_INPUT_PAD AGS_TYPE_DRUM_INPUT_PAD AgsDrumInputPad AgsDrumInputPadClass ags_drum_input_pad_get_type
ags_drum_input_pad_callbacks ags_drum_input_pad_open_callback ags_drum_input_pad_play_callback ags_drum_input_pad_edit_callback
ags_drum_output_line AgsDrumOutputLine ags_drum_output_line_new AGS_DRUM_OUTPUT_LINE AGS_DRUM_OUTPUT_LINE_CLASS AGS_DRUM_OUTPUT_LINE_GET_CLASS AGS_IS_DRUM_OUTPUT_LINE AGS_TYPE_DRUM_OUTPUT_LINE AgsDrumOutputLine AgsDrumOutputLineClass ags_drum_output_line_get_type
ags_drum_output_line_callbacks ags_drum_output_line_resize_pads_callback
ags_drum_output_pad AgsDrumOutputPad AgsDrumOutputPadFlags ags_drum_output_pad_new AGS_DRUM_OUTPUT_PAD AGS_DRUM_OUTPUT_PAD_CLASS AGS_DRUM_OUTPUT_PAD_GET_CLASS AGS_IS_DRUM_OUTPUT_PAD AGS_TYPE_DRUM_OUTPUT_PAD AgsDrumOutputPad AgsDrumOutputPadClass ags_drum_output_pad_get_type
ags_drum_output_pad_callbacks
ags_dssi_bridge AgsDssiBridge AGS_DSSI_BRIDGE_DEFAULT_VERSION AGS_DSSI_BRIDGE_DEFAULT_BUILD_ID AgsDssiBridgeFlags ags_dssi_bridge_input_map_recall ags_dssi_bridge_output_map_recall ags_dssi_bridge_load ags_dssi_bridge_new AGS_DSSI_BRIDGE AGS_DSSI_BRIDGE_CLASS AGS_DSSI_BRIDGE_GET_CLASS AGS_IS_DSSI_BRIDGE AGS_TYPE_DSSI_BRIDGE AgsDssiBridge AgsDssiBridgeClass ags_dssi_bridge_get_type
ags_dssi_bridge_callbacks ags_dssi_bridge_parent_set_callback ags_dssi_bridge_program_changed_callback
ags_dssi_browser AgsDssiBrowser AgsDssiBrowserFlags ags_dssi_browser_get_plugin_filename ags_dssi_browser_get_plugin_effect ags_dssi_browser_combo_box_controls_new ags_dssi_browser_preview_new ags_dssi_browser_new AGS_DSSI_BROWSER AGS_DSSI_BROWSER_CLASS AGS_DSSI_BROWSER_GET_CLASS AGS_IS_DSSI_BROWSER AGS_TYPE_DSSI_BROWSER AgsDssiBrowser AgsDssiBrowserClass ags_dssi_browser_get_type
ags_dssi_browser_callbacks ags_dssi_browser_plugin_filename_callback ags_dssi_browser_plugin_effect_callback
ags_effect_bridge AgsEffectBridge AGS_EFFECT_BRIDGE_DEFAULT_VERSION AGS_EFFECT_BRIDGE_DEFAULT_BUILD_ID AGS_EFFECT_BRIDGE_MAX_COLUMNS AgsEffectBridgeFlags ags_effect_bridge_samplerate_changed ags_effect_bridge_buffer_size_changed ags_effect_bridge_format_changed ags_effect_bridge_resize_audio_channels ags_effect_bridge_resize_pads ags_effect_bridge_map_recall ags_effect_bridge_find_port ags_effect_bridge_new AGS_EFFECT_BRIDGE AGS_EFFECT_BRIDGE_CLASS AGS_EFFECT_BRIDGE_GET_CLASS AGS_IS_EFFECT_BRIDGE AGS_TYPE_EFFECT_BRIDGE AgsEffectBridge AgsEffectBridgeClass ags_effect_bridge_get_type
ags_effect_bridge_callbacks ags_effect_bridge_resize_audio_channels_callback ags_effect_bridge_resize_pads_callback
ags_effect_bulk AgsEffectBulk AGS_EFFECT_BULK_PLUGIN AGS_EFFECT_BULK_DEFAULT_VERSION AGS_EFFECT_BULK_DEFAULT_BUILD_ID AGS_EFFECT_BULK_COLUMNS_COUNT AgsEffectBulkFlags AgsEffectBulkPlugin ags_effect_bulk_plugin_alloc ags_effect_bulk_plugin_free ags_effect_bulk_add_effect ags_effect_bulk_remove_effect ags_effect_bulk_resize_audio_channels ags_effect_bulk_resize_pads ags_effect_bulk_map_recall ags_effect_bulk_find_port ags_effect_bulk_indicator_queue_draw_timeout ags_effect_bulk_new AGS_EFFECT_BULK AGS_EFFECT_BULK_CLASS AGS_EFFECT_BULK_GET_CLASS AGS_IS_EFFECT_BULK AGS_TYPE_EFFECT_BULK AgsEffectBulk AgsEffectBulkClass ags_effect_bulk_get_type
ags_effect_bulk_callbacks ags_effect_bulk_add_callback ags_effect_bulk_remove_callback ags_effect_bulk_plugin_browser_response_callback ags_effect_bulk_resize_audio_channels_callback ags_effect_bulk_resize_pads_callback
ags_effect_line AgsEffectLine AGS_EFFECT_LINE_DEFAULT_VERSION AGS_EFFECT_LINE_DEFAULT_BUILD_ID AGS_EFFECT_LINE_COLUMNS_COUNT AGS_EFFECT_LINE_SEPARATOR_FILENAME AGS_EFFECT_LINE_SEPARATOR_EFFECT AgsEffectLineFlags ags_effect_line_samplerate_changed ags_effect_line_buffer_size_changed ags_effect_line_format_changed ags_effect_line_set_channel ags_effect_line_add_effect ags_effect_line_remove_effect ags_effect_line_map_recall ags_effect_line_find_port ags_effect_line_done ags_effect_line_find_next_grouped ags_effect_line_check_message ags_effect_line_indicator_queue_draw_timeout ags_effect_line_new AGS_EFFECT_LINE AGS_EFFECT_LINE_CLASS AGS_EFFECT_LINE_GET_CLASS AGS_IS_EFFECT_LINE AGS_TYPE_EFFECT_LINE AgsEffectLine AgsEffectLineClass ags_effect_line_get_type
ags_effect_line_callbacks ags_effect_line_check_message_callback
ags_effect_pad AgsEffectPad AGS_EFFECT_PAD_DEFAULT_VERSION AGS_EFFECT_PAD_DEFAULT_BUILD_ID AGS_EFFECT_PAD_COLUMNS_COUNT AgsEffectPadFlags ags_effect_pad_samplerate_changed ags_effect_pad_buffer_size_changed ags_effect_pad_format_changed ags_effect_pad_set_channel ags_effect_pad_resize_lines ags_effect_pad_map_recall ags_effect_pad_find_port ags_effect_pad_new AGS_EFFECT_PAD AGS_EFFECT_PAD_CLASS AGS_EFFECT_PAD_GET_CLASS AGS_IS_EFFECT_PAD AGS_TYPE_EFFECT_PAD AgsEffectPad AgsEffectPadClass ags_effect_pad_get_type
ags_effect_pad_callbacks
ags_effect_separator AgsEffectSeparator ags_effect_separator_new AGS_EFFECT_SEPARATOR AGS_EFFECT_SEPARATOR_CLASS AGS_EFFECT_SEPARATOR_GET_CLASS AGS_IS_EFFECT_SEPARATOR AGS_TYPE_EFFECT_SEPARATOR AgsEffectSeparator AgsEffectSeparatorClass ags_effect_separator_get_type
ags_envelope_dialog AgsEnvelopeDialog AGS_ENVELOPE_DIALOG_DEFAULT_VERSION AGS_ENVELOPE_DIALOG_DEFAULT_BUILD_ID AgsEnvelopeDialogFlags ags_envelope_dialog_load_preset ags_envelope_dialog_add_pattern_tab ags_envelope_dialog_new AGS_ENVELOPE_DIALOG AGS_ENVELOPE_DIALOG_CLASS AGS_ENVELOPE_DIALOG_GET_CLASS AGS_IS_ENVELOPE_DIALOG AGS_TYPE_ENVELOPE_DIALOG AgsEnvelopeDialog AgsEnvelopeDialogClass ags_envelope_dialog_get_type
ags_envelope_dialog_callbacks ags_envelope_dialog_apply_callback ags_envelope_dialog_ok_callback ags_envelope_dialog_cancel_callback ags_envelope_dialog_delete_event
ags_envelope_editor AgsEnvelopeEditor AGS_ENVELOPE_EDITOR_DEFAULT_VERSION AGS_ENVELOPE_EDITOR_DEFAULT_BUILD_ID AgsEnvelopeEditorFlags ags_envelope_editor_get_active_preset ags_envelope_editor_load_preset ags_envelope_editor_add_preset ags_envelope_editor_remove_preset ags_envelope_editor_reset_control ags_envelope_editor_plot ags_envelope_editor_new AGS_ENVELOPE_EDITOR AGS_ENVELOPE_EDITOR_CLASS AGS_ENVELOPE_EDITOR_GET_CLASS AGS_IS_ENVELOPE_EDITOR AGS_TYPE_ENVELOPE_EDITOR AgsEnvelopeEditor AgsEnvelopeEditorClass ags_envelope_editor_get_type
ags_envelope_editor_callbacks ags_envelope_editor_preset_callback ags_envelope_editor_preset_add_callback ags_envelope_editor_preset_remove_callback ags_envelope_editor_preset_rename_response_callback ags_envelope_editor_attack_x_callback ags_envelope_editor_attack_y_callback ags_envelope_editor_decay_x_callback ags_envelope_editor_decay_y_callback ags_envelope_editor_sustain_x_callback ags_envelope_editor_sustain_y_callback ags_envelope_editor_release_x_callback ags_envelope_editor_release_y_callback ags_envelope_editor_ratio_callback
ags_envelope_info AgsEnvelopeInfo AGS_ENVELOPE_INFO_DEFAULT_VERSION AGS_ENVELOPE_INFO_DEFAULT_BUILD_ID AgsEnvelopeInfoFlags AgsEnvelopeInfoColumn ags_envelope_info_plot ags_envelope_info_new AGS_ENVELOPE_INFO AGS_ENVELOPE_INFO_CLASS AGS_ENVELOPE_INFO_GET_CLASS AGS_IS_ENVELOPE_INFO AGS_TYPE_ENVELOPE_INFO AgsEnvelopeInfo AgsEnvelopeInfoClass ags_envelope_info_get_type
ags_envelope_info_callbacks ags_envelope_info_plot_callback
ags_equalizer10 AgsEqualizer10 ags_equalizer10_find_specifier ags_equalizer10_new AGS_EQUALIZER10 AGS_EQUALIZER10_CLASS AGS_EQUALIZER10_GET_CLASS AGS_IS_EQUALIZER10 AGS_TYPE_EQUALIZER10 AgsEqualizer10 AgsEqualizer10Class ags_equalizer10_get_type
ags_equalizer10_callbacks ags_equalizer10_parent_set_callback ags_equalizer10_resize_audio_channels_callback ags_equalizer10_resize_pads_callback ags_equalizer10_peak_28hz_callback ags_equalizer10_peak_56hz_callback ags_equalizer10_peak_112hz_callback ags_equalizer10_peak_224hz_callback ags_equalizer10_peak_448hz_callback ags_equalizer10_peak_896hz_callback ags_equalizer10_peak_1792hz_callback ags_equalizer10_peak_3584hz_callback ags_equalizer10_peak_7168hz_callback ags_equalizer10_peak_14336hz_callback ags_equalizer10_pressure_callback
ags_export_soundcard AgsExportSoundcard AGS_EXPORT_SOUNDCARD_FORMAT_WAV AGS_EXPORT_SOUNDCARD_FORMAT_FLAC AGS_EXPORT_SOUNDCARD_FORMAT_AIFF AGS_EXPORT_SOUNDCARD_FORMAT_OGG AgsExportSoundcardFlags ags_export_soundcard_set_backend ags_export_soundcard_refresh_card ags_export_soundcard_set_card ags_export_soundcard_set_filename ags_export_soundcard_set_format ags_export_soundcard_new AGS_EXPORT_SOUNDCARD AGS_EXPORT_SOUNDCARD_CLASS AGS_EXPORT_SOUNDCARD_GET_CLASS AGS_IS_EXPORT_SOUNDCARD AGS_TYPE_EXPORT_SOUNDCARD AgsExportSoundcard AgsExportSoundcardClass ags_export_soundcard_get_type
ags_export_soundcard_callbacks ags_export_soundcard_backend_callback ags_export_soundcard_card_callback ags_export_soundcard_file_chooser_button_callback
ags_export_window AgsExportWindow AgsExportWindowFlags ags_export_window_reload_soundcard_editor ags_export_window_new AGS_EXPORT_WINDOW AGS_EXPORT_WINDOW_CLASS AGS_EXPORT_WINDOW_GET_CLASS AGS_IS_EXPORT_WINDOW AGS_TYPE_EXPORT_WINDOW AgsExportWindow AgsExportWindowClass ags_export_window_get_type
ags_export_window_callbacks ags_export_window_add_export_soundcard_callback ags_export_window_remove_export_soundcard_callback ags_export_window_tact_callback ags_export_window_export_callback
ags_ffplayer AgsFFPlayer AGS_FFPLAYER_DEFAULT_CONTROL_WIDTH AGS_FFPLAYER_DEFAULT_CONTROL_HEIGHT AgsFFPlayerFlags ags_ffplayer_paint ags_ffplayer_open_filename ags_ffplayer_load_preset ags_ffplayer_load_instrument ags_ffplayer_sf2_loader_completed_timeout ags_ffplayer_new AGS_FFPLAYER AGS_FFPLAYER_CLASS AGS_FFPLAYER_GET_CLASS AGS_IS_FFPLAYER AGS_TYPE_FFPLAYER AgsFFPlayer AgsFFPlayerClass ags_ffplayer_get_type
ags_ffplayer_bridge AgsFFPlayerBridge ags_ffplayer_bridge_new AGS_FFPLAYER_BRIDGE AGS_FFPLAYER_BRIDGE_CLASS AGS_FFPLAYER_BRIDGE_GET_CLASS AGS_IS_FFPLAYER_BRIDGE AGS_TYPE_FFPLAYER_BRIDGE AgsFFPlayerBridge AgsFFPlayerBridgeClass ags_ffplayer_bridge_get_type
ags_ffplayer_bridge_callbacks
ags_ffplayer_bulk_input AgsFFPlayerBulkInput AGS_FFPLAYER_BULK_INPUT_DEFAULT_VERSION AGS_FFPLAYER_BULK_INPUT_DEFAULT_BUILD_ID AgsFFPlayerBulkInputFlags ags_ffplayer_bulk_input_new AGS_FFPLAYER_BULK_INPUT AGS_FFPLAYER_BULK_INPUT_CLASS AGS_FFPLAYER_BULK_INPUT_GET_CLASS AGS_IS_FFPLAYER_BULK_INPUT AGS_TYPE_FFPLAYER_BULK_INPUT AgsFFPlayerBulkInput AgsFFPlayerBulkInputClass ags_ffplayer_bulk_input_get_type
ags_ffplayer_bulk_input_callbacks
ags_ffplayer_callbacks ags_ffplayer_parent_set_callback ags_ffplayer_destroy_callback ags_ffplayer_draw_callback ags_ffplayer_open_clicked_callback ags_ffplayer_open_dialog_response_callback ags_ffplayer_preset_changed_callback ags_ffplayer_instrument_changed_callback ags_ffplayer_drawing_area_button_press_callback ags_ffplayer_hscrollbar_value_changed
ags_ffplayer_input_line AgsFFPlayerInputLine ags_ffplayer_input_line_new AGS_FFPLAYER_INPUT_LINE AGS_FFPLAYER_INPUT_LINE_CLASS AGS_FFPLAYER_INPUT_LINE_GET_CLASS AGS_IS_FFPLAYER_INPUT_LINE AGS_TYPE_FFPLAYER_INPUT_LINE AgsFFPlayerInputLine AgsFFPlayerInputLineClass ags_ffplayer_input_line_get_type
ags_ffplayer_input_line_callbacks ags_ffplayer_input_line_notify_channel_callback
ags_ffplayer_input_pad AgsFFPlayerInputPad ags_ffplayer_input_pad_new AGS_FFPLAYER_INPUT_PAD AGS_FFPLAYER_INPUT_PAD_CLASS AGS_FFPLAYER_INPUT_PAD_GET_CLASS AGS_IS_FFPLAYER_INPUT_PAD AGS_TYPE_FFPLAYER_INPUT_PAD AgsFFPlayerInputPad AgsFFPlayerInputPadClass ags_ffplayer_input_pad_get_type
ags_ffplayer_input_pad_callbacks
ags_fm_oscillator AgsFMOscillator AGS_FM_OSCILLATOR_DEFAULT_FRAME_COUNT AGS_FM_OSCILLATOR_DEFAULT_SYNC_POINT_COUNT AgsFMOscillatorFlags ags_fm_oscillator_control_changed ags_fm_oscillator_new AGS_FM_OSCILLATOR AGS_FM_OSCILLATOR_CLASS AGS_FM_OSCILLATOR_GET_CLASS AGS_IS_FM_OSCILLATOR AGS_TYPE_FM_OSCILLATOR AgsFMOscillator AgsFMOscillatorClass ags_fm_oscillator_get_type
ags_fm_oscillator_callbacks ags_fm_oscillator_wave_callback ags_fm_oscillator_attack_callback ags_fm_oscillator_frame_count_callback ags_fm_oscillator_frequency_callback ags_fm_oscillator_phase_callback ags_fm_oscillator_volume_callback ags_fm_oscillator_sync_point_callback ags_fm_oscillator_fm_lfo_wave_callback ags_fm_oscillator_fm_lfo_frequency_callback ags_fm_oscillator_fm_lfo_depth_callback ags_fm_oscillator_fm_tuning_callback
ags_fm_syncsynth AgsFMSyncsynth AGS_FM_SYNCSYNTH_BASE_NOTE_MAX AGS_FM_SYNCSYNTH_BASE_NOTE_MIN AgsFMSyncsynthFlags ags_fm_syncsynth_add_fm_oscillator ags_fm_syncsynth_remove_fm_oscillator ags_fm_syncsynth_reset_loop ags_fm_syncsynth_update ags_fm_syncsynth_new AGS_FM_SYNCSYNTH AGS_FM_SYNCSYNTH_CLASS AGS_FM_SYNCSYNTH_GET_CLASS AGS_IS_FM_SYNCSYNTH AGS_TYPE_FM_SYNCSYNTH AgsFMSyncsynth AgsFMSyncsynthClass ags_fm_syncsynth_get_type
ags_fm_syncsynth_callbacks ags_fm_syncsynth_parent_set_callback ags_fm_syncsynth_samplerate_changed_callback ags_fm_syncsynth_fm_oscillator_control_changed_callback ags_fm_syncsynth_add_callback ags_fm_syncsynth_remove_callback ags_fm_syncsynth_auto_update_callback ags_fm_syncsynth_update_callback ags_fm_syncsynth_lower_callback ags_fm_syncsynth_loop_start_callback ags_fm_syncsynth_loop_end_callback ags_fm_syncsynth_enable_lfo_callback ags_fm_syncsynth_lfo_freq_callback ags_fm_syncsynth_lfo_phase_callback ags_fm_syncsynth_lfo_depth_callback ags_fm_syncsynth_lfo_tunint_callback
ags_fm_synth AgsFMSynth AGS_FM_SYNTH_BASE_NOTE_MAX AGS_FM_SYNTH_BASE_NOTE_MIN AgsFMSynthFlags ags_fm_synth_update ags_fm_synth_new AGS_FM_SYNTH AGS_FM_SYNTH_CLASS AGS_FM_SYNTH_GET_CLASS AGS_IS_FM_SYNTH AGS_TYPE_FM_SYNTH AgsFMSynth AgsFMSynthClass ags_fm_synth_get_type
ags_fm_synth_callbacks ags_fm_synth_parent_set_callback ags_fm_synth_auto_update_callback ags_fm_synth_update_callback ags_fm_synth_lower_callback
ags_fm_synth_input_line AgsFMSynthInputLine ags_fm_synth_input_line_new AGS_FM_SYNTH_INPUT_LINE AGS_FM_SYNTH_INPUT_LINE_CLASS AGS_FM_SYNTH_INPUT_LINE_GET_CLASS AGS_IS_FM_SYNTH_INPUT_LINE AGS_TYPE_FM_SYNTH_INPUT_LINE AgsFMSynthInputLine AgsFMSynthInputLineClass ags_fm_synth_input_line_get_type
ags_fm_synth_input_line_callbacks ags_fm_synth_input_line_samplerate_changed_callback ags_fm_synth_input_line_fm_oscillator_control_changed_callback
ags_fm_synth_input_pad AgsFMSynthInputPad ags_fm_synth_input_pad_new AGS_FM_SYNTH_INPUT_PAD AGS_FM_SYNTH_INPUT_PAD_CLASS AGS_FM_SYNTH_INPUT_PAD_GET_CLASS AGS_IS_FM_SYNTH_INPUT_PAD AGS_TYPE_FM_SYNTH_INPUT_PAD AgsFMSynthInputPad AgsFMSynthInputPadClass ags_fm_synth_input_pad_get_type
ags_generic_preferences AgsGenericPreferences AgsGenericPreferencesFlags ags_generic_preferences_new AGS_GENERIC_PREFERENCES AGS_GENERIC_PREFERENCES_CLASS AGS_GENERIC_PREFERENCES_GET_CLASS AGS_IS_GENERIC_PREFERENCES AGS_TYPE_GENERIC_PREFERENCES AgsGenericPreferences AgsGenericPreferencesClass ags_generic_preferences_get_type
ags_generic_preferences_callbacks ags_generic_preferences_autosave_thread_clicked_callback ags_generic_preferences_rt_safe_callback
ags_input_collection_editor AgsInputCollectionEditor AgsInputCollectionEditorFlags ags_input_collection_editor_check ags_input_collection_editor_new AGS_INPUT_COLLECTION_EDITOR AGS_INPUT_COLLECTION_EDITOR_CLASS AGS_INPUT_COLLECTION_EDITOR_GET_CLASS AGS_IS_INPUT_COLLECTION_EDITOR AGS_TYPE_INPUT_COLLECTION_EDITOR AgsInputCollectionEditor AgsInputCollectionEditorClass ags_input_collection_editor_get_type
ags_input_collection_editor_callbacks ags_input_collection_editor_parent_set_callback ags_input_collection_editor_soundcard_callback
ags_input_editor AgsInputEditor AGS_INPUT_EDITOR_DEFAULT_VERSION AGS_INPUT_EDITOR_DEFAULT_BUILD_ID AgsInputEditorFlags ags_input_editor_check ags_input_editor_new AGS_INPUT_EDITOR AGS_INPUT_EDITOR_CLASS AGS_INPUT_EDITOR_GET_CLASS AGS_IS_INPUT_EDITOR AGS_TYPE_INPUT_EDITOR AgsInputEditor AgsInputEditorClass ags_input_editor_get_type
ags_input_editor_callbacks ags_input_editor_parent_set_callback ags_input_editor_soundcard_callback
ags_input_listing_editor AgsInputListingEditor ags_input_listing_editor_add_children ags_input_listing_editor_new AGS_INPUT_LISTING_EDITOR AGS_INPUT_LISTING_EDITOR_CLASS AGS_INPUT_LISTING_EDITOR_GET_CLASS AGS_IS_INPUT_LISTING_EDITOR AGS_TYPE_INPUT_LISTING_EDITOR AgsInputListingEditor AgsInputListingEditorClass ags_input_listing_editor_get_type
ags_input_listing_editor_callbacks ags_input_listing_editor_parent_set_callback ags_input_listing_editor_resize_pads_callback
ags_ladspa_bridge AgsLadspaBridge AGS_LADSPA_BRIDGE_DEFAULT_VERSION AGS_LADSPA_BRIDGE_DEFAULT_BUILD_ID AgsLadspaBridgeFlags ags_ladspa_bridge_load ags_ladspa_bridge_new AGS_IS_LADSPA_BRIDGE AGS_LADSPA_BRIDGE AGS_LADSPA_BRIDGE_CLASS AGS_LADSPA_BRIDGE_GET_CLASS AGS_TYPE_LADSPA_BRIDGE AgsLadspaBridge AgsLadspaBridgeClass ags_ladspa_bridge_get_type
ags_ladspa_bridge_callbacks ags_ladspa_bridge_parent_set_callback
ags_ladspa_browser AgsLadspaBrowser AgsLadspaBrowserFlags ags_ladspa_browser_get_plugin_filename ags_ladspa_browser_get_plugin_effect ags_ladspa_browser_combo_box_output_boolean_controls_new ags_ladspa_browser_combo_box_output_controls_new ags_ladspa_browser_combo_box_boolean_controls_new ags_ladspa_browser_combo_box_controls_new ags_ladspa_browser_preview_new ags_ladspa_browser_new AGS_IS_LADSPA_BROWSER AGS_LADSPA_BROWSER AGS_LADSPA_BROWSER_CLASS AGS_LADSPA_BROWSER_GET_CLASS AGS_TYPE_LADSPA_BROWSER AgsLadspaBrowser AgsLadspaBrowserClass ags_ladspa_browser_get_type
ags_ladspa_browser_callbacks ags_ladspa_browser_plugin_filename_callback ags_ladspa_browser_plugin_effect_callback
ags_line AgsLine AGS_LINE_DEFAULT_VERSION AGS_LINE_DEFAULT_BUILD_ID AGS_LINE_COLUMNS_COUNT AGS_LINE_SEPARATOR_FILENAME AGS_LINE_SEPARATOR_EFFECT AgsLineFlags ags_line_samplerate_changed ags_line_buffer_size_changed ags_line_format_changed ags_line_set_channel ags_line_group_changed ags_line_add_effect ags_line_remove_effect ags_line_map_recall ags_line_find_port ags_line_stop ags_line_find_next_grouped ags_line_check_message ags_line_indicator_queue_draw_timeout ags_line_new AGS_IS_LINE AGS_LINE AGS_LINE_CLASS AGS_LINE_GET_CLASS AGS_TYPE_LINE AgsLine AgsLineClass ags_line_get_type
ags_line_callbacks ags_line_check_message_callback ags_line_group_clicked_callback ags_line_volume_callback ags_line_stop_callback
ags_line_editor AgsLineEditor AGS_LINE_EDITOR_DEFAULT_VERSION AGS_LINE_EDITOR_DEFAULT_BUILD_ID AgsLineEditorFlags ags_line_editor_set_channel ags_line_editor_new AGS_IS_LINE_EDITOR AGS_LINE_EDITOR AGS_LINE_EDITOR_CLASS AGS_LINE_EDITOR_GET_CLASS AGS_TYPE_LINE_EDITOR AgsLineEditor AgsLineEditorClass ags_line_editor_get_type
ags_line_editor_callbacks ags_line_editor_parent_set_callback ags_line_editor_show_callback
ags_line_member AgsLineMember AGS_LINE_MEMBER_DEFAULT_VERSION AGS_LINE_MEMBER_DEFAULT_BUILD_ID Agslinememberflags AgsLineMemberPortFlags ags_line_member_get_widget ags_line_member_set_label ags_line_member_change_port ags_line_member_find_port ags_line_member_chained_event ags_line_member_new AGS_IS_LINE_MEMBER AGS_LINE_MEMBER AGS_LINE_MEMBER_CLASS AGS_LINE_MEMBER_GET_CLASS AGS_TYPE_LINE_MEMBER AgsLineMember AgsLineMemberClass ags_line_member_get_type
ags_line_member_callbacks ags_line_member_parent_set_callback ags_line_member_dial_changed_callback ags_line_member_vscale_changed_callback ags_line_member_hscale_changed_callback ags_line_member_spin_button_changed_callback ags_line_member_check_button_clicked_callback ags_line_member_toggle_button_clicked_callback ags_line_member_button_clicked_callback
ags_line_member_editor AgsLineMemberEditor AgsLineMemberEditorFlags ags_line_member_editor_new AGS_IS_LINE_MEMBER_EDITOR AGS_LINE_MEMBER_EDITOR AGS_LINE_MEMBER_EDITOR_CLASS AGS_LINE_MEMBER_EDITOR_GET_CLASS AGS_TYPE_LINE_MEMBER_EDITOR AgsLineMemberEditor AgsLineMemberEditorClass ags_line_member_editor_get_type
ags_line_member_editor_callbacks ags_line_member_editor_add_callback ags_line_member_editor_remove_callback ags_line_member_editor_plugin_browser_response_callback
ags_link_collection_editor AgsLinkCollectionEditor AgsLinkCollectionEditorFlags ags_link_collection_editor_check ags_link_collection_editor_check_first_line ags_link_collection_editor_check_first_link ags_link_collection_editor_check_count ags_link_collection_editor_new AGS_IS_LINK_COLLECTION_EDITOR AGS_LINK_COLLECTION_EDITOR AGS_LINK_COLLECTION_EDITOR_CLASS AGS_LINK_COLLECTION_EDITOR_GET_CLASS AGS_TYPE_LINK_COLLECTION_EDITOR AgsLinkCollectionEditor AgsLinkCollectionEditorClass ags_link_collection_editor_get_type
ags_link_collection_editor_callbacks ags_link_collection_editor_parent_set_callback ags_link_collection_editor_link_callback ags_link_collection_editor_first_line_callback ags_link_collection_editor_first_link_callback ags_link_collection_editor_count_callback
ags_link_editor AgsLinkEditor AgsLinkEditorFlags ags_link_editor_new AGS_IS_LINK_EDITOR AGS_LINK_EDITOR AGS_LINK_EDITOR_CLASS AGS_LINK_EDITOR_GET_CLASS AGS_TYPE_LINK_EDITOR AgsLinkEditor AgsLinkEditorClass ags_link_editor_get_type
ags_link_editor_callbacks ags_link_editor_parent_set_callback ags_link_editor_combo_callback
ags_listing_editor AgsListingEditor ags_listing_editor_add_children ags_listing_editor_new AGS_IS_LISTING_EDITOR AGS_LISTING_EDITOR AGS_LISTING_EDITOR_CLASS AGS_LISTING_EDITOR_GET_CLASS AGS_TYPE_LISTING_EDITOR AgsListingEditor AgsListingEditorClass ags_listing_editor_get_type
ags_listing_editor_callbacks ags_listing_editor_parent_set_callback ags_listing_editor_resize_pads_callback
ags_live_dssi_bridge AgsLiveDssiBridge AGS_LIVE_DSSI_BRIDGE_DEFAULT_VERSION AGS_LIVE_DSSI_BRIDGE_DEFAULT_BUILD_ID AgsLiveDssiBridgeFlags ags_live_dssi_bridge_input_map_recall ags_live_dssi_bridge_output_map_recall ags_live_dssi_bridge_load ags_live_dssi_bridge_new AGS_IS_LIVE_DSSI_BRIDGE AGS_LIVE_DSSI_BRIDGE AGS_LIVE_DSSI_BRIDGE_CLASS AGS_LIVE_DSSI_BRIDGE_GET_CLASS AGS_TYPE_LIVE_DSSI_BRIDGE AgsLiveDssiBridge AgsLiveDssiBridgeClass ags_live_dssi_bridge_get_type
ags_live_dssi_bridge_callbacks ags_live_dssi_bridge_parent_set_callback ags_live_dssi_bridge_program_changed_callback
ags_live_lv2_bridge AgsLiveLv2Bridge AGS_LIVE_LV2_BRIDGE_DEFAULT_VERSION AGS_LIVE_LV2_BRIDGE_DEFAULT_BUILD_ID AgsLiveLv2BridgeFlags ags_live_lv2_bridge_input_map_recall ags_live_lv2_bridge_output_map_recall ags_live_lv2_bridge_load_program ags_live_lv2_bridge_load_preset ags_live_lv2_bridge_load_midi ags_live_lv2_bridge_load_gui ags_live_lv2_bridge_load ags_live_lv2_bridge_lv2ui_idle_timeout ags_live_lv2_bridge_new AGS_IS_LIVE_LV2_BRIDGE AGS_LIVE_LV2_BRIDGE AGS_LIVE_LV2_BRIDGE_CLASS AGS_LIVE_LV2_BRIDGE_GET_CLASS AGS_TYPE_LIVE_LV2_BRIDGE AgsLiveLv2Bridge AgsLiveLv2BridgeClass ags_live_lv2_bridge_get_type
ags_live_lv2_bridge_callbacks ags_live_lv2_bridge_parent_set_callback ags_live_lv2_bridge_show_gui_callback ags_live_lv2_bridge_delete_event_callback ags_live_lv2_bridge_lv2ui_cleanup_function ags_live_lv2_bridge_lv2ui_write_function ags_live_lv2_bridge_program_changed_callback ags_live_lv2_bridge_preset_changed_callback ags_live_lv2_bridge_dial_changed_callback ags_live_lv2_bridge_vscale_changed_callback ags_live_lv2_bridge_hscale_changed_callback ags_live_lv2_bridge_spin_button_changed_callback ags_live_lv2_bridge_check_button_clicked_callback ags_live_lv2_bridge_toggle_button_clicked_callback ags_live_lv2_bridge_button_clicked_callback
ags_lv2_bridge AgsLv2Bridge AGS_LV2_BRIDGE_DEFAULT_VERSION AGS_LV2_BRIDGE_DEFAULT_BUILD_ID AgsLv2BridgeFlags ags_lv2_bridge_input_map_recall ags_lv2_bridge_output_map_recall ags_lv2_bridge_load_program ags_lv2_bridge_load_preset ags_lv2_bridge_load_midi ags_lv2_bridge_load_gui ags_lv2_bridge_load ags_lv2_bridge_lv2ui_idle_timeout ags_lv2_bridge_new AGS_IS_LV2_BRIDGE AGS_LV2_BRIDGE AGS_LV2_BRIDGE_CLASS AGS_LV2_BRIDGE_GET_CLASS AGS_TYPE_LV2_BRIDGE AgsLv2Bridge AgsLv2BridgeClass ags_lv2_bridge_get_type
ags_lv2_bridge_callbacks ags_lv2_bridge_parent_set_callback ags_lv2_bridge_show_gui_callback ags_lv2_bridge_delete_event_callback ags_lv2_bridge_lv2ui_cleanup_function ags_lv2_bridge_lv2ui_write_function ags_lv2_bridge_program_changed_callback ags_lv2_bridge_preset_changed_callback ags_lv2_bridge_dial_changed_callback ags_lv2_bridge_vscale_changed_callback ags_lv2_bridge_hscale_changed_callback ags_lv2_bridge_spin_button_changed_callback ags_lv2_bridge_check_button_clicked_callback ags_lv2_bridge_toggle_button_clicked_callback ags_lv2_bridge_button_clicked_callback
ags_lv2_browser AgsLv2Browser AgsLv2BrowserFlags ags_lv2_browser_get_plugin_filename ags_lv2_browser_get_plugin_effect ags_lv2_browser_combo_box_output_boolean_controls_new ags_lv2_browser_combo_box_output_controls_new ags_lv2_browser_combo_box_boolean_controls_new ags_lv2_browser_combo_box_controls_new ags_lv2_browser_preview_new ags_lv2_browser_new AGS_IS_LV2_BROWSER AGS_LV2_BROWSER AGS_LV2_BROWSER_CLASS AGS_LV2_BROWSER_GET_CLASS AGS_TYPE_LV2_BROWSER AgsLv2Browser AgsLv2BrowserClass ags_lv2_browser_get_type
ags_lv2_browser_callbacks ags_lv2_browser_plugin_filename_callback ags_lv2_browser_plugin_uri_callback
ags_machine AgsMachine AGS_MACHINE_AUTOMATION_PORT AGS_MACHINE_DEFAULT_VERSION AGS_MACHINE_DEFAULT_BUILD_ID AgsMachineFlags AgsMachineFileInputFlags AgsMachineMappingFlags AgsMachineEditOptions AgsMachineConnectionOptions AgsMachineExportOptions AgsMachineImportOptions AgsMachineAutomationPort ags_machine_automation_port_alloc ags_machine_automation_port_free ags_machine_automation_port_find_channel_type_with_control_name ags_machine_samplerate_changed ags_machine_buffer_size_changed ags_machine_format_changed ags_machine_resize_audio_channels ags_machine_resize_pads ags_machine_map_recall ags_machine_find_port ags_machine_stop ags_machine_add_default_recalls ags_machine_find_by_name ags_machine_playback_set_active ags_machine_set_run ags_machine_set_run_extended ags_machine_get_possible_links ags_machine_get_possible_audio_output_connections ags_machine_get_possible_audio_input_connections ags_machine_file_chooser_dialog_new ags_machine_open_files ags_machine_copy_pattern ags_machine_popup_add_edit_options ags_machine_popup_add_connection_options ags_machine_popup_add_export_options ags_machine_popup_add_import_options ags_machine_check_message ags_machine_new AGS_IS_MACHINE AGS_MACHINE AGS_MACHINE_CLASS AGS_MACHINE_GET_CLASS AGS_TYPE_MACHINE AgsMachine AgsMachineClass ags_machine_get_type
ags_machine_callbacks ags_machine_check_message_callback ags_machine_button_press_callback ags_machine_popup_move_up_activate_callback ags_machine_popup_move_down_activate_callback ags_machine_popup_hide_activate_callback ags_machine_popup_show_activate_callback ags_machine_popup_destroy_activate_callback ags_machine_popup_rename_activate_callback ags_machine_popup_rename_audio_activate_callback ags_machine_popup_reposition_audio_activate_callback ags_machine_popup_properties_activate_callback ags_machine_popup_sticky_controls_toggled_callback ags_machine_popup_copy_pattern_callback ags_machine_popup_paste_pattern_callback ags_machine_popup_envelope_callback ags_machine_popup_connection_editor_callback ags_machine_popup_midi_dialog_callback ags_machine_popup_midi_export_callback ags_machine_popup_wave_export_callback ags_machine_popup_midi_import_callback ags_machine_popup_wave_import_callback ags_machine_open_response_callback ags_machine_play_callback ags_machine_resize_audio_channels_callback ags_machine_resize_pads_callback ags_machine_stop_callback ags_machine_active_playback_start_channel_launch_callback
ags_machine_collection AgsMachineCollection AgsMachineCollectionFlags ags_machine_collection_reload ags_machine_collection_add_entry ags_machine_collection_new AGS_IS_MACHINE_COLLECTION AGS_MACHINE_COLLECTION AGS_MACHINE_COLLECTION_CLASS AGS_MACHINE_COLLECTION_GET_CLASS AGS_TYPE_MACHINE_COLLECTION AgsMachineCollection AgsMachineCollectionClass ags_machine_collection_get_type
ags_machine_collection_callbacks
ags_machine_collection_entry AgsMachineCollectionEntry AgsMachineCollectionEntryFlags ags_machine_collection_entry_new AGS_IS_MACHINE_COLLECTION_ENTRY AGS_MACHINE_COLLECTION_ENTRY AGS_MACHINE_COLLECTION_ENTRY_CLASS AGS_MACHINE_COLLECTION_ENTRY_GET_CLASS AGS_TYPE_MACHINE_COLLECTION_ENTRY AgsMachineCollectionEntry AgsMachineCollectionEntryClass ags_machine_collection_entry_get_type
ags_machine_collection_entry_callbacks
ags_machine_editor AgsMachineEditor AGS_MACHINE_EDITOR_DEFAULT_VERSION AGS_MACHINE_EDITOR_DEFAULT_BUILD_ID AgsMachineEditorFlags ags_machine_editor_add_children ags_machine_editor_set_machine ags_machine_editor_add_input ags_machine_editor_add_output ags_machine_editor_remove_input ags_machine_editor_remove_output ags_machine_editor_new AGS_IS_MACHINE_EDITOR AGS_MACHINE_EDITOR AGS_MACHINE_EDITOR_CLASS AGS_MACHINE_EDITOR_GET_CLASS AGS_TYPE_MACHINE_EDITOR AgsMachineEditor AgsMachineEditorClass ags_machine_editor_get_type
ags_machine_editor_callbacks ags_machine_editor_apply_callback ags_machine_editor_ok_callback ags_machine_editor_cancel_callback
ags_machine_radio_button AgsMachineRadioButton ags_machine_radio_button_new AGS_IS_MACHINE_RADIO_BUTTON AGS_MACHINE_RADIO_BUTTON AGS_MACHINE_RADIO_BUTTON_CLASS AGS_MACHINE_RADIO_BUTTON_GET_CLASS AGS_TYPE_MACHINE_RADIO_BUTTON AgsMachineRadioButton AgsMachineRadioButtonClass ags_machine_radio_button_get_type
ags_machine_radio_button_callbacks ags_machine_radio_button_notify_machine_name_callback
ags_machine_selection AgsMachineSelection AGS_MACHINE_SELECTION_INDEX AgsMachineSelectionFlags ags_machine_selection_load_defaults ags_machine_selection_new AGS_IS_MACHINE_SELECTION AGS_MACHINE_SELECTION AGS_MACHINE_SELECTION_CLASS AGS_MACHINE_SELECTION_GET_CLASS AGS_TYPE_MACHINE_SELECTION AgsMachineSelection AgsMachineSelectionClass ags_machine_selection_get_type
ags_machine_selector AgsMachineSelector AgsMachineSelectorFlags ags_machine_selector_add_index ags_machine_selector_remove_index ags_machine_selector_link_index ags_machine_selector_changed ags_machine_selector_popup_new ags_machine_selector_new AGS_IS_MACHINE_SELECTOR AGS_MACHINE_SELECTOR AGS_MACHINE_SELECTOR_CLASS AGS_MACHINE_SELECTOR_GET_CLASS AGS_TYPE_MACHINE_SELECTOR AgsMachineSelector AgsMachineSelectorClass ags_machine_selector_get_type
ags_machine_selector_callbacks ags_machine_selector_popup_add_tab_callback ags_machine_selector_popup_remove_tab_callback ags_machine_selector_popup_add_index_callback ags_machine_selector_popup_remove_index_callback ags_machine_selector_popup_link_index_callback ags_machine_selector_popup_reverse_mapping_callback ags_machine_selector_popup_shift_piano_callback ags_machine_selector_radio_changed
ags_matrix AgsMatrix ags_matrix_input_map_recall ags_matrix_output_map_recall ags_matrix_new AGS_IS_MATRIX AGS_MATRIX AGS_MATRIX_CLASS AGS_MATRIX_GET_CLASS AGS_TYPE_MATRIX AgsMatrix AgsMatrixClass ags_matrix_get_type
ags_matrix_bridge AgsMatrixBridge ags_matrix_bridge_new AGS_IS_MATRIX_BRIDGE AGS_MATRIX_BRIDGE AGS_MATRIX_BRIDGE_CLASS AGS_MATRIX_BRIDGE_GET_CLASS AGS_TYPE_MATRIX_BRIDGE AgsMatrixBridge AgsMatrixBridgeClass ags_matrix_bridge_get_type
ags_matrix_bridge_callbacks
ags_matrix_bulk_input AgsMatrixBulkInput ags_matrix_bulk_input_new AGS_IS_MATRIX_BULK_INPUT AGS_MATRIX_BULK_INPUT AGS_MATRIX_BULK_INPUT_CLASS AGS_MATRIX_BULK_INPUT_GET_CLASS AGS_TYPE_MATRIX_BULK_INPUT AgsMatrixBulkInput AgsMatrixBulkInputClass ags_matrix_bulk_input_get_type
ags_matrix_bulk_input_callbacks
ags_matrix_callbacks ags_matrix_parent_set_callback ags_matrix_index_callback ags_matrix_drawing_area_configure_callback ags_matrix_drawing_area_expose_callback ags_matrix_drawing_area_button_press_callback ags_matrix_adjustment_value_changed_callback ags_matrix_bpm_callback ags_matrix_length_spin_callback ags_matrix_loop_button_callback ags_matrix_stop_callback
ags_menu_action_callbacks AGS_MENU_ITEM_FILENAME_KEY AGS_MENU_ITEM_EFFECT_KEY ags_menu_action_open_callback ags_menu_action_save_callback ags_menu_action_save_as_callback ags_menu_action_export_callback ags_menu_action_quit_callback ags_menu_action_add_callback ags_menu_action_add_panel_callback ags_menu_action_add_mixer_callback ags_menu_action_add_spectrometer_callback ags_menu_action_add_equalizer_callback ags_menu_action_add_drum_callback ags_menu_action_add_matrix_callback ags_menu_action_add_synth_callback ags_menu_action_add_fm_synth_callback ags_menu_action_add_syncsynth_callback ags_menu_action_add_fm_syncsynth_callback ags_menu_action_add_ffplayer_callback ags_menu_action_add_pitch_sampler_callback ags_menu_action_add_audiorec_callback ags_menu_action_add_ladspa_bridge_callback ags_menu_action_add_dssi_bridge_callback ags_menu_action_add_lv2_bridge_callback ags_menu_action_add_live_dssi_bridge_callback ags_menu_action_add_live_lv2_bridge_callback ags_menu_action_automation_callback ags_menu_action_wave_callback ags_menu_action_preferences_callback ags_menu_action_midi_import_callback ags_menu_action_midi_export_track_callback ags_menu_action_midi_playback_callback ags_menu_action_online_help_callback ags_menu_action_about_callback
ags_menu_bar AgsMenuBar AgsMenuBarFlags ags_zoom_menu_new ags_tact_menu_new ags_zoom_combo_box_new ags_tact_combo_box_new ags_ladspa_bridge_menu_new ags_dssi_bridge_menu_new ags_lv2_bridge_menu_new ags_live_dssi_bridge_menu_new ags_live_lv2_bridge_menu_new ags_menu_bar_new AGS_IS_MENU_BAR AGS_MENU_BAR AGS_MENU_BAR_CLASS AGS_MENU_BAR_GET_CLASS AGS_TYPE_MENU_BAR AgsMenuBar AgsMenuBarClass ags_menu_bar_get_type
ags_midi_dialog AgsMidiDialog AGS_MIDI_DIALOG_DEFAULT_VERSION AGS_MIDI_DIALOG_DEFAULT_BUILD_ID AgsMidiDialogFlags ags_midi_dialog_load_sequencers ags_midi_dialog_new AGS_IS_MIDI_DIALOG AGS_MIDI_DIALOG AGS_MIDI_DIALOG_CLASS AGS_MIDI_DIALOG_GET_CLASS AGS_TYPE_MIDI_DIALOG AgsMidiDialog AgsMidiDialogClass ags_midi_dialog_get_type
ags_midi_dialog_callbacks ags_midi_dialog_apply_callback ags_midi_dialog_ok_callback ags_midi_dialog_cancel_callback ags_midi_dialog_delete_event
ags_midi_export_wizard AgsMidiExportWizard AGS_MIDI_EXPORT_WIZARD_DEFAULT_FILENAME AGS_MIDI_EXPORT_WIZARD_DEFAULT_TIMES AGS_MIDI_EXPORT_WIZARD_DEFAULT_CLICKS AGS_MIDI_EXPORT_WIZARD_DEFAULT_DIVISION AGS_MIDI_EXPORT_WIZARD_DEFAULT_TEMPO AGS_MIDI_EXPORT_WIZARD_DEFAULT_BPM AGS_MIDI_EXPORT_WIZARD_DEFAULT_PULSE_UNIT AgsMidiExportWizardFlags ags_midi_export_wizard_new AGS_IS_MIDI_EXPORT_WIZARD AGS_MIDI_EXPORT_WIZARD AGS_MIDI_EXPORT_WIZARD_CLASS AGS_MIDI_EXPORT_WIZARD_GET_CLASS AGS_TYPE_MIDI_EXPORT_WIZARD AgsMidiExportWizard AgsMidiExportWizardClass ags_midi_export_wizard_get_type
ags_midi_export_wizard_callbacks ags_midi_export_wizard_response_callback
ags_midi_import_wizard AgsMidiImportWizard AgsMidiImportWizardFlags ags_midi_import_wizard_new AGS_IS_MIDI_IMPORT_WIZARD AGS_MIDI_IMPORT_WIZARD AGS_MIDI_IMPORT_WIZARD_CLASS AGS_MIDI_IMPORT_WIZARD_GET_CLASS AGS_TYPE_MIDI_IMPORT_WIZARD AgsMidiImportWizard AgsMidiImportWizardClass ags_midi_import_wizard_get_type
ags_midi_import_wizard_callbacks ags_midi_import_wizard_response_callback
ags_midi_preferences AgsMidiPreferences AgsMidiPreferencesFlags ags_midi_preferences_new AGS_IS_MIDI_PREFERENCES AGS_MIDI_PREFERENCES AGS_MIDI_PREFERENCES_CLASS AGS_MIDI_PREFERENCES_GET_CLASS AGS_TYPE_MIDI_PREFERENCES AgsMidiPreferences AgsMidiPreferencesClass ags_midi_preferences_get_type
ags_midi_preferences_callbacks ags_midi_preferences_parent_set_callback ags_midi_preferences_add_callback ags_midi_preferences_remove_sequencer_editor_callback
ags_mixer AgsMixer ags_mixer_new AGS_IS_MIXER AGS_MIXER AGS_MIXER_CLASS AGS_MIXER_GET_CLASS AGS_TYPE_MIXER AgsMixer AgsMixerClass ags_mixer_get_type
ags_mixer_callbacks ags_mixer_parent_set_callback
ags_mixer_input_line AgsMixerInputLine ags_mixer_input_line_new AGS_IS_MIXER_INPUT_LINE AGS_MIXER_INPUT_LINE AGS_MIXER_INPUT_LINE_CLASS AGS_MIXER_INPUT_LINE_GET_CLASS AGS_TYPE_MIXER_INPUT_LINE AgsMixerInputLine AgsMixerInputLineClass ags_mixer_input_line_get_type
ags_mixer_input_pad AgsMixerInputPad ags_mixer_input_pad_new AGS_IS_MIXER_INPUT_PAD AGS_MIXER_INPUT_PAD AGS_MIXER_INPUT_PAD_CLASS AGS_MIXER_INPUT_PAD_GET_CLASS AGS_TYPE_MIXER_INPUT_PAD AgsMixerInputPad AgsMixerInputPadClass ags_mixer_input_pad_get_type
ags_move_note_dialog AgsMoveNoteDialog AGS_MOVE_NOTE_DIALOG_MAX_X AGS_MOVE_NOTE_DIALOG_MAX_Y AgsMoveNoteDialogFlags ags_move_note_dialog_new AGS_IS_MOVE_NOTE_DIALOG AGS_MOVE_NOTE_DIALOG AGS_MOVE_NOTE_DIALOG_CLASS AGS_MOVE_NOTE_DIALOG_GET_CLASS AGS_TYPE_MOVE_NOTE_DIALOG AgsMoveNoteDialog AgsMoveNoteDialogClass ags_move_note_dialog_get_type
ags_move_note_dialog_callbacks ags_move_note_dialog_response_callback ags_move_note_dialog_relative_callback ags_move_note_dialog_absolute_callback
ags_navigation AgsNavigation AGS_NAVIGATION_DEFAULT_TACT_STEP AGS_NAVIGATION_SEEK_STEPS AGS_NAVIGATION_REWIND_STEPS AgsNavigationFlags ags_navigation_tact_to_time_string ags_navigation_relative_tact_to_time_string ags_navigation_absolute_tact_to_time_string ags_navigation_update_time_string ags_navigation_set_seeking_sensitive ags_navigation_change_position ags_navigation_duration_time_queue_draw ags_navigation_new AGS_IS_NAVIGATION AGS_NAVIGATION AGS_NAVIGATION_CLASS AGS_NAVIGATION_GET_CLASS AGS_TYPE_NAVIGATION AgsNavigation AgsNavigationClass ags_navigation_get_type
ags_navigation_callbacks ags_navigation_expander_callback ags_navigation_bpm_callback ags_navigation_rewind_callback ags_navigation_prev_callback ags_navigation_play_callback ags_navigation_stop_callback ags_navigation_next_callback ags_navigation_forward_callback ags_navigation_loop_callback ags_navigation_position_tact_callback ags_navigation_duration_tact_callback ags_navigation_loop_left_tact_callback ags_navigation_loop_right_tact_callback ags_navigation_raster_callback ags_navigation_soundcard_stop_callback
ags_notation_edit AgsNotationEdit AGS_NOTATION_EDIT_DEFAULT_CONTROL_WIDTH AGS_NOTATION_EDIT_DEFAULT_CONTROL_HEIGHT AGS_NOTATION_EDIT_DEFAULT_CONTROL_MARGIN_X AGS_NOTATION_EDIT_DEFAULT_CONTROL_MARGIN_Y AGS_NOTATION_EDIT_DEFAULT_CURSOR_POSITION_X AGS_NOTATION_EDIT_DEFAULT_CURSOR_POSITION_Y AGS_NOTATION_EDIT_DEFAULT_SELECTED_NOTE_BORDER AGS_NOTATION_EDIT_DEFAULT_FADER_WIDTH AGS_NOTATION_EDIT_MIN_ZOOM AGS_NOTATION_EDIT_MAX_ZOOM AGS_NOTATION_EDIT_MAX_ZOOM_CONTROL_WIDTH AgsNotationEditFlags AgsNotationEditMode AgsNotationEditButtonMask AgsNotationEditKeyMask ags_notation_edit_reset_vscrollbar ags_notation_edit_reset_hscrollbar ags_notation_edit_draw_segment ags_notation_edit_draw_position ags_notation_edit_draw_cursor ags_notation_edit_draw_selection ags_notation_edit_draw_note ags_notation_edit_draw_notation ags_notation_edit_draw ags_notation_edit_new AGS_IS_NOTATION_EDIT AGS_NOTATION_EDIT AGS_NOTATION_EDIT_CLASS AGS_NOTATION_EDIT_GET_CLASS AGS_TYPE_NOTATION_EDIT AgsNotationEdit AgsNotationEditClass ags_notation_edit_get_type
ags_notation_edit_callbacks ags_notation_edit_draw_callback ags_notation_edit_drawing_area_configure_event ags_notation_edit_drawing_area_button_press_event ags_notation_edit_drawing_area_button_release_event ags_notation_edit_drawing_area_motion_notify_event ags_notation_edit_drawing_area_key_press_event ags_notation_edit_drawing_area_key_release_event ags_notation_edit_vscrollbar_value_changed ags_notation_edit_hscrollbar_value_changed
ags_notation_editor AgsNotationEditor AGS_NOTATION_EDITOR_DEFAULT_VERSION AGS_NOTATION_EDITOR_DEFAULT_BUILD_ID AGS_NOTATION_EDITOR_MAX_CONTROLS AgsNotationEditorFlags ags_notation_editor_machine_changed ags_notation_editor_add_note ags_notation_editor_delete_note ags_notation_editor_select_region ags_notation_editor_do_feedback ags_notation_editor_start_play_key ags_notation_editor_stop_play_key ags_notation_editor_select_all ags_notation_editor_paste ags_notation_editor_copy ags_notation_editor_cut ags_notation_editor_invert ags_notation_editor_new AGS_IS_NOTATION_EDITOR AGS_NOTATION_EDITOR AGS_NOTATION_EDITOR_CLASS AGS_NOTATION_EDITOR_GET_CLASS AGS_TYPE_NOTATION_EDITOR AgsNotationEditor AgsNotationEditorClass ags_notation_editor_get_type
ags_notation_editor_callbacks ags_notation_editor_machine_changed_callback ags_notation_editor_piano_key_pressed_callback ags_notation_editor_piano_key_released_callback ags_notation_editor_resize_audio_channels_callback ags_notation_editor_resize_pads_callback
ags_notation_toolbar AgsNotationToolbar AgsNotationToolbarFlags ags_notation_toolbar_tool_popup_new ags_notation_toolbar_new AGS_IS_NOTATION_TOOLBAR AGS_NOTATION_TOOLBAR AGS_NOTATION_TOOLBAR_CLASS AGS_NOTATION_TOOLBAR_GET_CLASS AGS_TYPE_NOTATION_TOOLBAR AgsNotationToolbar AgsNotationToolbarClass ags_notation_toolbar_get_type
ags_notation_toolbar_callbacks ags_notation_toolbar_position_callback ags_notation_toolbar_edit_callback ags_notation_toolbar_clear_callback ags_notation_toolbar_select_callback ags_notation_toolbar_copy_or_cut_callback ags_notation_toolbar_paste_callback ags_notation_toolbar_invert_callback ags_notation_toolbar_match_audio_channel_callback ags_notation_toolbar_no_duplicates_callback ags_notation_toolbar_tool_popup_move_note_callback ags_notation_toolbar_tool_popup_crop_note_callback ags_notation_toolbar_tool_popup_select_note_callback ags_notation_toolbar_tool_popup_position_cursor_callback ags_notation_toolbar_tool_popup_enable_all_lines_callback ags_notation_toolbar_tool_popup_disable_all_lines_callback ags_notation_toolbar_zoom_callback ags_notation_toolbar_mode_callback ags_notation_toolbar_opacity_callback
ags_osc_server_preferences AgsOscServerPreferences AgsOscServerPreferencesFlags ags_osc_server_preferences_new AGS_IS_OSC_SERVER_PREFERENCES AGS_OSC_SERVER_PREFERENCES AGS_OSC_SERVER_PREFERENCES_CLASS AGS_OSC_SERVER_PREFERENCES_GET_CLASS AGS_TYPE_OSC_SERVER_PREFERENCES AgsOscServerPreferences AgsOscServerPreferencesClass ags_osc_server_preferences_get_type
ags_osc_server_preferences_callbacks ags_osc_server_preferences_start_callback ags_osc_server_preferences_stop_callback ags_osc_server_preferences_any_address_callback ags_osc_server_preferences_enable_ip4_callback ags_osc_server_preferences_ip4_address_callback ags_osc_server_preferences_enable_ip6_callback ags_osc_server_preferences_ip6_address_callback ags_osc_server_preferences_port_callback
ags_oscillator AgsOscillator AGS_OSCILLATOR_DEFAULT_FRAME_COUNT AGS_OSCILLATOR_DEFAULT_SYNC_POINT_COUNT AgsOscillatorFlags ags_oscillator_control_changed ags_oscillator_new AGS_IS_OSCILLATOR AGS_OSCILLATOR AGS_OSCILLATOR_CLASS AGS_OSCILLATOR_GET_CLASS AGS_TYPE_OSCILLATOR AgsOscillator AgsOscillatorClass ags_oscillator_get_type
ags_oscillator_callbacks ags_oscillator_wave_callback ags_oscillator_attack_callback ags_oscillator_frame_count_callback ags_oscillator_frequency_callback ags_oscillator_phase_callback ags_oscillator_volume_callback ags_oscillator_sync_point_callback
ags_output_collection_editor AgsOutputCollectionEditor AgsOutputCollectionEditorFlags ags_output_collection_editor_check ags_output_collection_editor_new AGS_IS_OUTPUT_COLLECTION_EDITOR AGS_OUTPUT_COLLECTION_EDITOR AGS_OUTPUT_COLLECTION_EDITOR_CLASS AGS_OUTPUT_COLLECTION_EDITOR_GET_CLASS AGS_TYPE_OUTPUT_COLLECTION_EDITOR AgsOutputCollectionEditor AgsOutputCollectionEditorClass ags_output_collection_editor_get_type
ags_output_collection_editor_callbacks ags_output_collection_editor_parent_set_callback ags_output_collection_editor_soundcard_callback
ags_output_editor AgsOutputEditor AGS_OUTPUT_EDITOR_DEFAULT_VERSION AGS_OUTPUT_EDITOR_DEFAULT_BUILD_ID AgsOutputEditorFlags ags_output_editor_check ags_output_editor_new AGS_IS_OUTPUT_EDITOR AGS_OUTPUT_EDITOR AGS_OUTPUT_EDITOR_CLASS AGS_OUTPUT_EDITOR_GET_CLASS AGS_TYPE_OUTPUT_EDITOR AgsOutputEditor AgsOutputEditorClass ags_output_editor_get_type
ags_output_editor_callbacks ags_output_editor_parent_set_callback ags_output_editor_soundcard_callback
ags_output_listing_editor AgsOutputListingEditor ags_output_listing_editor_add_children ags_output_listing_editor_new AGS_IS_OUTPUT_LISTING_EDITOR AGS_OUTPUT_LISTING_EDITOR AGS_OUTPUT_LISTING_EDITOR_CLASS AGS_OUTPUT_LISTING_EDITOR_GET_CLASS AGS_TYPE_OUTPUT_LISTING_EDITOR AgsOutputListingEditor AgsOutputListingEditorClass ags_output_listing_editor_get_type
ags_output_listing_editor_callbacks ags_output_listing_editor_parent_set_callback ags_output_listing_editor_resize_pads_callback
ags_pad AgsPad AGS_PAD_DEFAULT_VERSION AGS_PAD_DEFAULT_BUILD_ID AgsPadFlags ags_pad_samplerate_changed ags_pad_buffer_size_changed ags_pad_format_changed ags_pad_set_channel ags_pad_resize_lines ags_pad_map_recall ags_pad_find_port ags_pad_play ags_pad_new AGS_IS_PAD AGS_PAD AGS_PAD_CLASS AGS_PAD_GET_CLASS AGS_TYPE_PAD AgsPad AgsPadClass ags_pad_get_type
ags_pad_callbacks ags_pad_group_clicked_callback ags_pad_mute_clicked_callback ags_pad_solo_clicked_callback
ags_pad_editor AgsPadEditor AGS_PAD_EDITOR_DEFAULT_VERSION AGS_PAD_EDITOR_DEFAULT_BUILD_ID AgsPadEditorFlags ags_pad_editor_set_channel ags_pad_editor_new AGS_IS_PAD_EDITOR AGS_PAD_EDITOR AGS_PAD_EDITOR_CLASS AGS_PAD_EDITOR_GET_CLASS AGS_TYPE_PAD_EDITOR AgsPadEditor AgsPadEditorClass ags_pad_editor_get_type
ags_pad_editor_callbacks ags_pad_editor_resize_audio_channels_callback
ags_panel AgsPanel ags_panel_new AGS_IS_PANEL AGS_PANEL AGS_PANEL_CLASS AGS_PANEL_GET_CLASS AGS_TYPE_PANEL AgsPanel AgsPanelClass ags_panel_get_type
ags_panel_callbacks ags_panel_parent_set_callback
ags_panel_input_line AgsPanelInputLine ags_panel_input_line_new AGS_IS_PANEL_INPUT_LINE AGS_PANEL_INPUT_LINE AGS_PANEL_INPUT_LINE_CLASS AGS_PANEL_INPUT_LINE_GET_CLASS AGS_TYPE_PANEL_INPUT_LINE AgsPanelInputLine AgsPanelInputLineClass ags_panel_input_line_get_type
ags_panel_input_line_callbacks
ags_panel_input_pad AgsPanelInputPad ags_panel_input_pad_new AGS_IS_PANEL_INPUT_PAD AGS_PANEL_INPUT_PAD AGS_PANEL_INPUT_PAD_CLASS AGS_PANEL_INPUT_PAD_GET_CLASS AGS_TYPE_PANEL_INPUT_PAD AgsPanelInputPad AgsPanelInputPadClass ags_panel_input_pad_get_type
ags_pattern_box AgsPatternBox AGS_PATTERN_BOX_DEFAULT_PAD_WIDTH AGS_PATTERN_BOX_DEFAULT_PAD_HEIGHT AGS_PATTERN_BOX_LED_DEFAULT_WIDTH AGS_PATTERN_BOX_LED_DEFAULT_HEIGHT AGS_PATTERN_BOX_N_CONTROLS AGS_PATTERN_BOX_N_INDICES AgsPatternBoxFlags AgsPatternBoxKeyMask AgsPatternBoxAction ags_pattern_box_led_queue_draw_timeout ags_pattern_box_set_pattern ags_pattern_box_new AGS_IS_PATTERN_BOX AGS_PATTERN_BOX AGS_PATTERN_BOX_CLASS AGS_PATTERN_BOX_GET_CLASS AGS_TYPE_PATTERN_BOX AgsPatternBox AgsPatternBoxClass ags_pattern_box_get_type
ags_pattern_box_callbacks ags_pattern_box_focus_in_callback ags_pattern_box_focus_out_callback ags_pattern_box_key_press_event ags_pattern_box_key_release_event ags_pattern_box_pad_callback ags_pattern_box_offset_callback
ags_pattern_envelope AgsPatternEnvelope AGS_PATTERN_ENVELOPE_DEFAULT_VERSION AGS_PATTERN_ENVELOPE_DEFAULT_BUILD_ID AgsPatternEnvelopeFlags AgsPatternEnvelopeColumn ags_pattern_envelope_set_preset_property ags_pattern_envelope_get_active_preset ags_pattern_envelope_load_preset ags_pattern_envelope_add_preset ags_pattern_envelope_remove_preset ags_pattern_envelope_reset_control ags_pattern_envelope_reset_tree_view ags_pattern_envelope_plot ags_pattern_envelope_new AGS_IS_PATTERN_ENVELOPE AGS_PATTERN_ENVELOPE AGS_PATTERN_ENVELOPE_CLASS AGS_PATTERN_ENVELOPE_GET_CLASS AGS_TYPE_PATTERN_ENVELOPE AgsPatternEnvelope AgsPatternEnvelopeClass ags_pattern_envelope_get_type
ags_pattern_envelope_callbacks ags_pattern_envelope_edit_callback ags_pattern_envelope_plot_callback ags_pattern_envelope_audio_channel_start_callback ags_pattern_envelope_audio_channel_end_callback ags_pattern_envelope_pad_start_callback ags_pattern_envelope_pad_end_callback ags_pattern_envelope_x_start_callback ags_pattern_envelope_x_end_callback ags_pattern_envelope_attack_x_callback ags_pattern_envelope_attack_y_callback ags_pattern_envelope_decay_x_callback ags_pattern_envelope_decay_y_callback ags_pattern_envelope_sustain_x_callback ags_pattern_envelope_sustain_y_callback ags_pattern_envelope_release_x_callback ags_pattern_envelope_release_y_callback ags_pattern_envelope_ratio_callback ags_pattern_envelope_preset_move_up_callback ags_pattern_envelope_preset_move_down_callback ags_pattern_envelope_preset_add_callback ags_pattern_envelope_preset_remove_callback ags_pattern_envelope_preset_rename_response_callback
ags_performance_preferences AgsPerformancePreferences AgsPerformancePreferencesFlags ags_performance_preferences_new AGS_IS_PERFORMANCE_PREFERENCES AGS_PERFORMANCE_PREFERENCES AGS_PERFORMANCE_PREFERENCES_CLASS AGS_PERFORMANCE_PREFERENCES_GET_CLASS AGS_TYPE_PERFORMANCE_PREFERENCES AgsPerformancePreferences AgsPerformancePreferencesClass ags_performance_preferences_get_type
ags_performance_preferences_callbacks ags_performance_preferences_super_threaded_channel_callback
ags_pitch_sampler AgsPitchSampler AGS_PITCH_SAMPLER_LFO_FREQ_MIN AGS_PITCH_SAMPLER_LFO_FREQ_MAX AGS_PITCH_SAMPLER_DEFAULT_LFO_FREQ AgsPitch_SamplerFlags ags_pitch_sampler_add_file ags_pitch_sampler_remove_file ags_pitch_sampler_open_filename ags_pitch_sampler_update ags_pitch_sampler_sfz_loader_completed_timeout ags_pitch_sampler_new AGS_IS_PITCH_SAMPLER AGS_PITCH_SAMPLER AGS_PITCH_SAMPLER_CLASS AGS_PITCH_SAMPLER_GET_CLASS AGS_TYPE_PITCH_SAMPLER AgsPitchSampler AgsPitchSamplerClass ags_pitch_sampler_get_type
ags_pitch_sampler_callbacks ags_pitch_sampler_parent_set_callback ags_pitch_sampler_open_callback ags_pitch_sampler_file_control_changed_callback ags_pitch_sampler_enable_lfo_callback ags_pitch_sampler_lfo_freq_callback ags_pitch_sampler_lfo_phase_callback ags_pitch_sampler_lfo_depth_callback ags_pitch_sampler_lfo_tuning_callback
ags_pitch_sampler_file AgsPitchSamplerFile AgsPitchSamplerFileFlags ags_pitch_sampler_file_new AGS_IS_PITCH_SAMPLER_FILE AGS_PITCH_SAMPLER_FILE AGS_PITCH_SAMPLER_FILE_CLASS AGS_PITCH_SAMPLER_FILE_GET_CLASS AGS_TYPE_PITCH_SAMPLER_FILE AgsPitchSamplerFile AgsPitchSamplerFileClass ags_pitch_sampler_file_get_type
ags_pitch_sampler_file_callbacks
ags_playback_window AgsPlaybackWindow AgsPlaybackWindowFlags ags_playback_window_new AGS_IS_PLAYBACK_WINDOW AGS_PLAYBACK_WINDOW AGS_PLAYBACK_WINDOW_CLASS AGS_PLAYBACK_WINDOW_GET_CLASS AGS_TYPE_PLAYBACK_WINDOW AgsPlaybackWindow AgsPlaybackWindowClass ags_playback_window_get_type
ags_playback_window_callbacks
ags_plugin_browser AgsPluginBrowser AgsPluginBrowserFlags ags_plugin_browser_get_plugin_filename ags_plugin_browser_get_plugin_effect ags_plugin_browser_new AGS_IS_PLUGIN_BROWSER AGS_PLUGIN_BROWSER AGS_PLUGIN_BROWSER_CLASS AGS_PLUGIN_BROWSER_GET_CLASS AGS_TYPE_PLUGIN_BROWSER AgsPluginBrowser AgsPluginBrowserClass ags_plugin_browser_get_type
ags_plugin_browser_callbacks ags_plugin_browser_plugin_type_changed_callback ags_plugin_browser_ok_callback ags_plugin_browser_cancel_callback
ags_plugin_preferences AgsPluginPreferences AgsLadspaPluginPreferences ags_ladspa_plugin_preferences_alloc ags_plugin_preferences_new AGS_IS_PLUGIN_PREFERENCES AGS_PLUGIN_PREFERENCES AGS_PLUGIN_PREFERENCES_CLASS AGS_PLUGIN_PREFERENCES_GET_CLASS AGS_TYPE_PLUGIN_PREFERENCES AgsPluginPreferences AgsPluginPreferencesClass ags_plugin_preferences_get_type
ags_plugin_preferences_callbacks
ags_position_automation_cursor_dialog AgsPositionAutomationCursorDialog AGS_POSITION_AUTOMATION_CURSOR_MAX_BEATS AgsPositionAutomationCursorDialogFlags ags_position_automation_cursor_dialog_new AGS_IS_POSITION_AUTOMATION_CURSOR_DIALOG AGS_POSITION_AUTOMATION_CURSOR_DIALOG AGS_POSITION_AUTOMATION_CURSOR_DIALOG_CLASS AGS_POSITION_AUTOMATION_CURSOR_DIALOG_GET_CLASS AGS_TYPE_POSITION_AUTOMATION_CURSOR_DIALOG AgsPositionAutomationCursorDialog AgsPositionAutomationCursorDialogClass ags_position_automation_cursor_dialog_get_type
ags_position_automation_cursor_dialog_callbacks ags_position_automation_cursor_dialog_response_callback
ags_position_notation_cursor_dialog AgsPositionNotationCursorDialog AGS_POSITION_NOTATION_CURSOR_MAX_BEATS AGS_POSITION_NOTATION_CURSOR_MAX_KEYS AgsPositionNotationCursorDialogFlags ags_position_notation_cursor_dialog_new AGS_IS_POSITION_NOTATION_CURSOR_DIALOG AGS_POSITION_NOTATION_CURSOR_DIALOG AGS_POSITION_NOTATION_CURSOR_DIALOG_CLASS AGS_POSITION_NOTATION_CURSOR_DIALOG_GET_CLASS AGS_TYPE_POSITION_NOTATION_CURSOR_DIALOG AgsPositionNotationCursorDialog AgsPositionNotationCursorDialogClass ags_position_notation_cursor_dialog_get_type
ags_position_notation_cursor_dialog_callbacks ags_position_notation_cursor_dialog_response_callback
ags_position_wave_cursor_dialog AgsPositionWaveCursorDialog AGS_POSITION_WAVE_CURSOR_MAX_BEATS AgsPositionWaveCursorDialogFlags ags_position_wave_cursor_dialog_new AGS_IS_POSITION_WAVE_CURSOR_DIALOG AGS_POSITION_WAVE_CURSOR_DIALOG AGS_POSITION_WAVE_CURSOR_DIALOG_CLASS AGS_POSITION_WAVE_CURSOR_DIALOG_GET_CLASS AGS_TYPE_POSITION_WAVE_CURSOR_DIALOG AgsPositionWaveCursorDialog AgsPositionWaveCursorDialogClass ags_position_wave_cursor_dialog_get_type
ags_position_wave_cursor_dialog_callbacks ags_position_wave_cursor_dialog_response_callback
ags_preferences AgsPreferences AGS_PREFERENCES_DEFAULT_FILENAME AgsPreferencesFlags ags_preferences_new AGS_IS_PREFERENCES AGS_PREFERENCES AGS_PREFERENCES_CLASS AGS_PREFERENCES_GET_CLASS AGS_TYPE_PREFERENCES AgsPreferences AgsPreferencesClass ags_preferences_get_type
ags_preferences_callbacks ags_preferences_delete_event_callback ags_preferences_response_callback ags_preferences_notebook_switch_page_callback
ags_property_collection_editor AgsPropertyCollectionEditor ags_property_collection_editor_new AGS_IS_PROPERTY_COLLECTION_EDITOR AGS_PROPERTY_COLLECTION_EDITOR AGS_PROPERTY_COLLECTION_EDITOR_CLASS AGS_PROPERTY_COLLECTION_EDITOR_GET_CLASS AGS_TYPE_PROPERTY_COLLECTION_EDITOR AgsPropertyCollectionEditor AgsPropertyCollectionEditorClass ags_property_collection_editor_get_type
ags_property_collection_editor_callbacks ags_property_collection_editor_add_collection_callback ags_property_collection_editor_remove_collection_callback
ags_property_editor AgsPropertyEditor AgsPropertyEditorFlags ags_property_editor_new AGS_IS_PROPERTY_EDITOR AGS_PROPERTY_EDITOR AGS_PROPERTY_EDITOR_CLASS AGS_PROPERTY_EDITOR_GET_CLASS AGS_TYPE_PROPERTY_EDITOR AgsPropertyEditor AgsPropertyEditorClass ags_property_editor_get_type
ags_property_editor_callbacks ags_property_editor_enable_callback
ags_property_listing_editor AgsPropertyListingEditor ags_property_listing_editor_new AGS_IS_PROPERTY_LISTING_EDITOR AGS_PROPERTY_LISTING_EDITOR AGS_PROPERTY_LISTING_EDITOR_CLASS AGS_PROPERTY_LISTING_EDITOR_GET_CLASS AGS_TYPE_PROPERTY_LISTING_EDITOR AgsPropertyListingEditor AgsPropertyListingEditorClass ags_property_listing_editor_get_type
ags_ramp_acceleration_dialog AgsRampAccelerationDialog AGS_RAMP_ACCELERATION_MAX_BEATS AGS_RAMP_ACCELERATION_MAX_STEPS AGS_RAMP_ACCELERATION_DEFAULT_WIDTH AgsRampAccelerationDialogFlags ags_ramp_acceleration_dialog_new AGS_IS_RAMP_ACCELERATION_DIALOG AGS_RAMP_ACCELERATION_DIALOG AGS_RAMP_ACCELERATION_DIALOG_CLASS AGS_RAMP_ACCELERATION_DIALOG_GET_CLASS AGS_TYPE_RAMP_ACCELERATION_DIALOG AgsRampAccelerationDialog AgsRampAccelerationDialogClass ags_ramp_acceleration_dialog_get_type
ags_ramp_acceleration_dialog_callbacks ags_ramp_acceleration_dialog_response_callback ags_ramp_acceleration_dialog_port_callback ags_ramp_acceleration_dialog_machine_changed_callback
ags_resize_editor AgsResizeEditor ags_resize_editor_new AGS_IS_RESIZE_EDITOR AGS_RESIZE_EDITOR AGS_RESIZE_EDITOR_CLASS AGS_RESIZE_EDITOR_GET_CLASS AGS_TYPE_RESIZE_EDITOR AgsResizeEditor AgsResizeEditorClass
ags_scrolled_automation_edit_box AgsScrolledAutomationEditBox ags_scrolled_automation_edit_box_new AGS_IS_SCROLLED_AUTOMATION_EDIT_BOX AGS_SCROLLED_AUTOMATION_EDIT_BOX AGS_SCROLLED_AUTOMATION_EDIT_BOX_CLASS AGS_SCROLLED_AUTOMATION_EDIT_BOX_GET_CLASS AGS_TYPE_SCROLLED_AUTOMATION_EDIT_BOX AgsScrolledAutomationEditBox AgsScrolledAutomationEditBoxClass ags_scrolled_automation_edit_box_get_type
ags_scrolled_wave_edit_box AgsScrolledWaveEditBox ags_scrolled_wave_edit_box_new AGS_IS_SCROLLED_WAVE_EDIT_BOX AGS_SCROLLED_WAVE_EDIT_BOX AGS_SCROLLED_WAVE_EDIT_BOX_CLASS AGS_SCROLLED_WAVE_EDIT_BOX_GET_CLASS AGS_TYPE_SCROLLED_WAVE_EDIT_BOX AgsScrolledWaveEditBox AgsScrolledWaveEditBoxClass ags_scrolled_wave_edit_box_get_type
ags_select_acceleration_dialog AgsSelectAccelerationDialog AGS_SELECT_ACCELERATION_MAX_BEATS AGS_SELECT_ACCELERATION_DEFAULT_WIDTH AgsSelectAccelerationDialogFlags ags_select_acceleration_dialog_new AGS_IS_SELECT_ACCELERATION_DIALOG AGS_SELECT_ACCELERATION_DIALOG AGS_SELECT_ACCELERATION_DIALOG_CLASS AGS_SELECT_ACCELERATION_DIALOG_GET_CLASS AGS_TYPE_SELECT_ACCELERATION_DIALOG AgsSelectAccelerationDialog AgsSelectAccelerationDialogClass ags_select_acceleration_dialog_get_type
ags_select_acceleration_dialog_callbacks ags_select_acceleration_dialog_response_callback ags_select_acceleration_dialog_add_callback ags_select_acceleration_dialog_remove_callback ags_select_acceleration_dialog_machine_changed_callback
ags_select_buffer_dialog AgsSelectBufferDialog AGS_SELECT_BUFFER_MAX_BEATS AGS_SELECT_BUFFER_DEFAULT_WIDTH AgsSelectBufferDialogFlags ags_select_buffer_dialog_new AGS_IS_SELECT_BUFFER_DIALOG AGS_SELECT_BUFFER_DIALOG AGS_SELECT_BUFFER_DIALOG_CLASS AGS_SELECT_BUFFER_DIALOG_GET_CLASS AGS_TYPE_SELECT_BUFFER_DIALOG AgsSelectBufferDialog AgsSelectBufferDialogClass ags_select_buffer_dialog_get_type
ags_select_buffer_dialog_callbacks ags_select_buffer_dialog_response_callback
ags_select_note_dialog AgsSelectNoteDialog AGS_SELECT_NOTE_MAX_BEATS AGS_SELECT_NOTE_MAX_KEYS AgsSelectNoteDialogFlags ags_select_note_dialog_new AGS_IS_SELECT_NOTE_DIALOG AGS_SELECT_NOTE_DIALOG AGS_SELECT_NOTE_DIALOG_CLASS AGS_SELECT_NOTE_DIALOG_GET_CLASS AGS_TYPE_SELECT_NOTE_DIALOG AgsSelectNoteDialog AgsSelectNoteDialogClass ags_select_note_dialog_get_type
ags_select_note_dialog_callbacks ags_select_note_dialog_response_callback
ags_sequencer_editor AgsSequencerEditor AgsSequencerEditorFlags ags_sequencer_editor_add_source ags_sequencer_editor_remove_source ags_sequencer_editor_add_sequencer ags_sequencer_editor_remove_sequencer ags_sequencer_editor_load_jack_card ags_sequencer_editor_load_alsa_card ags_sequencer_editor_load_oss_card ags_sequencer_editor_new AGS_IS_SEQUENCER_EDITOR AGS_SEQUENCER_EDITOR AGS_SEQUENCER_EDITOR_CLASS AGS_SEQUENCER_EDITOR_GET_CLASS AGS_TYPE_SEQUENCER_EDITOR AgsSequencerEditor AgsSequencerEditorClass ags_sequencer_editor_get_type
ags_sequencer_editor_callbacks ags_sequencer_editor_backend_changed_callback ags_sequencer_editor_card_changed_callback ags_sequencer_editor_add_jack_callback ags_sequencer_editor_remove_jack_callback
ags_server_preferences AgsServerPreferences ags_server_preferences_new AGS_IS_SERVER_PREFERENCES AGS_SERVER_PREFERENCES AGS_SERVER_PREFERENCES_CLASS AGS_SERVER_PREFERENCES_GET_CLASS AGS_TYPE_SERVER_PREFERENCES AgsServerPreferences AgsServerPreferencesClass ags_server_preferences_get_type
ags_server_preferences_callbacks
ags_sheet_edit AgsSheetEdit AGS_SHEET_EDIT_DEFAULT_CURSOR_POSITION_X AGS_SHEET_EDIT_DEFAULT_CURSOR_POSITION_Y AGS_SHEET_EDIT_DEFAULT_FADER_WIDTH AgsSheetEditFlags AgsSheetEditMode AgsSheetEditButtonMask AgsSheetEditKeyMask ags_sheet_edit_draw ags_sheet_edit_new AGS_IS_SHEET_EDIT AGS_SHEET_EDIT AGS_SHEET_EDIT_CLASS AGS_SHEET_EDIT_GET_CLASS AGS_TYPE_SHEET_EDIT AgsSheetEdit AgsSheetEditClass ags_sheet_edit_get_type
ags_sheet_edit_callbacks ags_sheet_edit_drawing_area_configure_event ags_sheet_edit_drawing_area_button_press_event ags_sheet_edit_drawing_area_button_release_event ags_sheet_edit_drawing_area_motion_notify_event ags_sheet_edit_drawing_area_key_press_event ags_sheet_edit_drawing_area_key_release_event
ags_sheet_editor AgsSheetEditor AGS_SHEET_EDITOR_DEFAULT_VERSION AGS_SHEET_EDITOR_DEFAULT_BUILD_ID AGS_SHEET_EDITOR_MAX_CONTROLS AgsSheetEditorFlags ags_sheet_editor_machine_changed ags_sheet_editor_add_note ags_sheet_editor_delete_note ags_sheet_editor_select_region ags_sheet_editor_do_feedback ags_sheet_editor_select_all ags_sheet_editor_paste ags_sheet_editor_copy ags_sheet_editor_cut ags_sheet_editor_new AGS_IS_SHEET_EDITOR AGS_SHEET_EDITOR AGS_SHEET_EDITOR_CLASS AGS_SHEET_EDITOR_GET_CLASS AGS_TYPE_SHEET_EDITOR AgsSheetEditor AgsSheetEditorClass ags_sheet_editor_get_type
ags_sheet_editor_callbacks ags_sheet_editor_machine_changed_callback ags_sheet_editor_resize_audio_channels_callback ags_sheet_editor_resize_pads_callback
ags_sheet_toolbar AgsSheetToolbar AgsSheetToolbarFlags ags_sheet_toolbar_new AGS_IS_SHEET_TOOLBAR AGS_SHEET_TOOLBAR AGS_SHEET_TOOLBAR_CLASS AGS_SHEET_TOOLBAR_GET_CLASS AGS_TYPE_SHEET_TOOLBAR AgsSheetToolbar AgsSheetToolbarClass ags_sheet_toolbar_get_type
ags_sheet_toolbar_callbacks ags_sheet_toolbar_position_callback ags_sheet_toolbar_clear_callback ags_sheet_toolbar_select_callback ags_sheet_toolbar_copy_or_cut_callback ags_sheet_toolbar_paste_callback
ags_sheet_window AgsSheetWindow AgsSheetWindowFlags ags_sheet_window_new AGS_IS_SHEET_WINDOW AGS_SHEET_WINDOW AGS_SHEET_WINDOW_CLASS AGS_SHEET_WINDOW_GET_CLASS AGS_TYPE_SHEET_WINDOW AgsSheetWindow AgsSheetWindowClass ags_sheet_window_get_type
ags_sheet_window_callbacks
ags_simple_file AgsSimpleFile AGS_SIMPLE_FILE_DEFAULT_ENCODING AGS_SIMPLE_FILE_DEFAULT_DTD AGS_SIMPLE_FILE_CHECKSUM_LENGTH AGS_SIMPLE_FILE_DEFAULT_AUDIO_FORMAT AGS_SIMPLE_FILE_DEFAULT_AUDIO_ENCODING AGS_SIMPLE_FILE_ID_PROP AGS_SIMPLE_FILE_NAME_PROP AGS_SIMPLE_FILE_TYPE_PROP AGS_SIMPLE_FILE_VERSION_PROP AGS_SIMPLE_FILE_BUILD_ID_PROP AGS_SIMPLE_FILE_TRUE AGS_SIMPLE_FILE_FALSE AgsSimpleFileFlags AGS_SIMPLE_FILE_ERROR AgsSimpleFileError ags_simple_file_str2md5 ags_simple_file_add_id_ref ags_simple_file_find_id_ref_by_node ags_simple_file_find_id_ref_by_xpath ags_simple_file_find_id_ref_by_reference ags_simple_file_add_lookup ags_simple_file_add_launch ags_simple_file_open ags_simple_file_open_from_data ags_simple_file_rw_open ags_simple_file_open_filename ags_simple_file_close ags_simple_file_write ags_simple_file_write_resolve ags_simple_file_read ags_simple_file_read_resolve ags_simple_file_read_start ags_simple_file_new AGS_IS_SIMPLE_FILE AGS_SIMPLE_FILE AGS_SIMPLE_FILE_CLASS AGS_SIMPLE_FILE_GET_CLASS AGS_TYPE_SIMPLE_FILE AgsSimpleFile AgsSimpleFileClass ags_simple_file_get_type
ags_simple_file_read AgsSimpleFileRead ags_simple_file_read_new AGS_IS_SIMPLE_FILE_READ AGS_SIMPLE_FILE_READ AGS_SIMPLE_FILE_READ_CLASS AGS_SIMPLE_FILE_READ_GET_CLASS AGS_TYPE_SIMPLE_FILE_READ AgsSimpleFileRead AgsSimpleFileReadClass ags_simple_file_read_get_type
ags_simple_file_write AgsSimpleFileWrite ags_simple_file_write_new AGS_IS_SIMPLE_FILE_WRITE AGS_SIMPLE_FILE_WRITE AGS_SIMPLE_FILE_WRITE_CLASS AGS_SIMPLE_FILE_WRITE_GET_CLASS AGS_TYPE_SIMPLE_FILE_WRITE AgsSimpleFileWrite AgsSimpleFileWriteClass ags_simple_file_write_get_type
ags_soundcard_editor AgsSoundcardEditor AgsSoundcardEditorFlags ags_soundcard_editor_add_port ags_soundcard_editor_remove_port ags_soundcard_editor_add_soundcard ags_soundcard_editor_remove_soundcard ags_soundcard_editor_load_core_audio_card ags_soundcard_editor_load_pulse_card ags_soundcard_editor_load_jack_card ags_soundcard_editor_load_wasapi_card ags_soundcard_editor_load_alsa_card ags_soundcard_editor_load_oss_card ags_soundcard_editor_show_wasapi_control ags_soundcard_editor_hide_wasapi_control ags_soundcard_editor_new AGS_IS_SOUNDCARD_EDITOR AGS_SOUNDCARD_EDITOR AGS_SOUNDCARD_EDITOR_CLASS AGS_SOUNDCARD_EDITOR_GET_CLASS AGS_TYPE_SOUNDCARD_EDITOR AgsSoundcardEditor AgsSoundcardEditorClass ags_soundcard_editor_get_type
ags_soundcard_editor_callbacks ags_soundcard_editor_backend_changed_callback ags_soundcard_editor_card_changed_callback ags_soundcard_editor_add_port_callback ags_soundcard_editor_remove_port_callback ags_soundcard_editor_audio_channels_changed_callback ags_soundcard_editor_samplerate_changed_callback ags_soundcard_editor_buffer_size_changed_callback ags_soundcard_editor_format_changed_callback
ags_spectrometer AgsSpectrometer AGS_SPECTROMETER_DEFAULT_X_START AGS_SPECTROMETER_DEFAULT_X_END AGS_SPECTROMETER_DEFAULT_Y_START AGS_SPECTROMETER_DEFAULT_Y_END AGS_SPECTROMETER_PLOT_DEFAULT_POINT_COUNT AGS_SPECTROMETER_EXTRA_SCALE ags_spectrometer_find_specifier ags_spectrometer_fg_plot_alloc ags_spectrometer_cartesian_queue_draw_timeout ags_spectrometer_new AGS_IS_SPECTROMETER AGS_SPECTROMETER AGS_SPECTROMETER_CLASS AGS_SPECTROMETER_GET_CLASS AGS_TYPE_SPECTROMETER AgsSpectrometer AgsSpectrometerClass ags_spectrometer_get_type
ags_spectrometer_callbacks ags_spectrometer_parent_set_callback ags_spectrometer_resize_audio_channels_callback ags_spectrometer_resize_pads_callback
ags_syncsynth AgsSyncsynth AGS_SYNCSYNTH_BASE_NOTE_MAX AGS_SYNCSYNTH_BASE_NOTE_MIN AgsSyncsynthFlags ags_syncsynth_add_oscillator ags_syncsynth_remove_oscillator ags_syncsynth_reset_loop ags_syncsynth_update ags_syncsynth_new AGS_IS_SYNCSYNTH AGS_SYNCSYNTH AGS_SYNCSYNTH_CLASS AGS_SYNCSYNTH_GET_CLASS AGS_TYPE_SYNCSYNTH AgsSyncsynth AgsSyncsynthClass ags_syncsynth_get_type
ags_syncsynth_callbacks ags_syncsynth_parent_set_callback ags_syncsynth_samplerate_changed_callback ags_syncsynth_oscillator_control_changed_callback ags_syncsynth_add_callback ags_syncsynth_remove_callback ags_syncsynth_auto_update_callback ags_syncsynth_update_callback ags_syncsynth_lower_callback ags_syncsynth_loop_start_callback ags_syncsynth_loop_end_callback
ags_synth AgsSynth AGS_SYNTH_BASE_NOTE_MAX AGS_SYNTH_BASE_NOTE_MIN AgsSynthFlags ags_synth_update ags_synth_new AGS_IS_SYNTH AGS_SYNTH AGS_SYNTH_CLASS AGS_SYNTH_GET_CLASS AGS_TYPE_SYNTH AgsSynth AgsSynthClass ags_synth_get_type
ags_synth_callbacks ags_synth_parent_set_callback ags_synth_auto_update_callback ags_synth_update_callback ags_synth_lower_callback
ags_synth_input_line AgsSynthInputLine ags_synth_input_line_new AGS_IS_SYNTH_INPUT_LINE AGS_SYNTH_INPUT_LINE AGS_SYNTH_INPUT_LINE_CLASS AGS_SYNTH_INPUT_LINE_GET_CLASS AGS_TYPE_SYNTH_INPUT_LINE AgsSynthInputLine AgsSynthInputLineClass ags_synth_input_line_get_type
ags_synth_input_line_callbacks ags_synth_input_line_samplerate_changed_callback ags_synth_input_line_oscillator_control_changed_callback
ags_synth_input_pad AgsSynthInputPad ags_synth_input_pad_new AGS_IS_SYNTH_INPUT_PAD AGS_SYNTH_INPUT_PAD AGS_SYNTH_INPUT_PAD_CLASS AGS_SYNTH_INPUT_PAD_GET_CLASS AGS_TYPE_SYNTH_INPUT_PAD AgsSynthInputPad AgsSynthInputPadClass ags_synth_input_pad_get_type
ags_track_collection AgsTrackCollection ags_track_collection_parse ags_track_collection_add_mapper ags_track_collection_new AGS_IS_TRACK_COLLECTION AGS_TRACK_COLLECTION AGS_TRACK_COLLECTION_CLASS AGS_TRACK_COLLECTION_GET_CLASS AGS_TYPE_TRACK_COLLECTION AgsTrackCollection AgsTrackCollectionClass ags_track_collection_get_type
ags_track_collection_callbacks
ags_track_collection_mapper AgsTrackCollectionMapper AGS_TRACK_COLLECTION_MAPPER_DEFAULT_BEATS AGS_MIDI_DEFAULT_BEATS ags_track_collection_mapper_find_instrument_with_sequence ags_track_collection_mapper_map ags_track_collection_mapper_new AGS_IS_TRACK_COLLECTION_MAPPER AGS_TRACK_COLLECTION_MAPPER AGS_TRACK_COLLECTION_MAPPER_CLASS AGS_TRACK_COLLECTION_MAPPER_GET_CLASS AGS_TYPE_TRACK_COLLECTION_MAPPER AgsTrackCollectionMapper AgsTrackCollectionMapperClass ags_track_collection_mapper_get_type
ags_track_collection_mapper_callbacks
ags_ui_osc_renew_controller AgsUiOscRenewController AGS_UI_OSC_RENEW_CONTROLLER_CONTEXT_PATH_LENGTH ags_ui_osc_renew_controller_set_data ags_ui_osc_renew_controller_check_message_callback ags_ui_osc_renew_controller_new AGS_IS_UI_OSC_RENEW_CONTROLLER AGS_TYPE_UI_OSC_RENEW_CONTROLLER AGS_UI_OSC_RENEW_CONTROLLER AGS_UI_OSC_RENEW_CONTROLLER_CLASS AGS_UI_OSC_RENEW_CONTROLLER_GET_CLASS AgsUiOscRenewController AgsUiOscRenewControllerClass ags_ui_osc_renew_controller_get_type
ags_ui_provider AgsUiProvider AGS_UI_PROVIDER_DEFAULT_TIMEOUT ags_ui_provider_get_show_animation ags_ui_provider_set_show_animation ags_ui_provider_get_gui_ready ags_ui_provider_set_gui_ready ags_ui_provider_get_file_ready ags_ui_provider_set_file_ready ags_ui_provider_get_gui_scale_factor ags_ui_provider_set_gui_scale_factor ags_ui_provider_schedule_task ags_ui_provider_schedule_task_all ags_ui_provider_get_animation_window ags_ui_provider_set_animation_window ags_ui_provider_get_window ags_ui_provider_set_window ags_ui_provider_get_automation_window ags_ui_provider_set_automation_window ags_ui_provider_get_wave_window ags_ui_provider_set_wave_window ags_ui_provider_get_sheet_window ags_ui_provider_set_sheet_window ags_ui_provider_get_export_window ags_ui_provider_set_export_window ags_ui_provider_get_preferences ags_ui_provider_set_preferences ags_ui_provider_get_history_browser ags_ui_provider_set_history_browser ags_ui_provider_get_midi_browser ags_ui_provider_set_midi_browser ags_ui_provider_get_sample_browser ags_ui_provider_set_sample_browser ags_ui_provider_get_midi_import_wizard ags_ui_provider_set_midi_import_wizard ags_ui_provider_get_midi_export_wizard ags_ui_provider_set_midi_export_wizard ags_ui_provider_get_machine ags_ui_provider_set_machine ags_ui_provider_get_composite_editor ags_ui_provider_set_composite_editor ags_ui_provider_get_navigation ags_ui_provider_set_navigation AGS_IS_UI_PROVIDER AGS_IS_UI_PROVIDER_INTERFACE AGS_TYPE_UI_PROVIDER AGS_UI_PROVIDER AGS_UI_PROVIDER_GET_INTERFACE AGS_UI_PROVIDER_INTERFACE AgsUiProvider AgsUiProviderInterface ags_ui_provider_get_type
ags_vautomation_edit_box AgsVAutomationEditBox ags_vautomation_edit_box_new AGS_IS_VAUTOMATION_EDIT_BOX AGS_TYPE_VAUTOMATION_EDIT_BOX AGS_VAUTOMATION_EDIT_BOX AGS_VAUTOMATION_EDIT_BOX_CLASS AGS_VAUTOMATION_EDIT_BOX_GET_CLASS AgsVAutomationEditBox AgsVAutomationEditBoxClass ags_vautomation_edit_box_get_type
ags_vwave_edit_box AgsVWaveEditBox ags_vwave_edit_box_new AGS_IS_VWAVE_EDIT_BOX AGS_TYPE_VWAVE_EDIT_BOX AGS_VWAVE_EDIT_BOX AGS_VWAVE_EDIT_BOX_CLASS AGS_VWAVE_EDIT_BOX_GET_CLASS AgsVWaveEditBox AgsVWaveEditBoxClass ags_vwave_edit_box_get_type
ags_wave_edit AgsWaveEdit AGS_WAVE_EDIT_DEFAULT_HEIGHT AGS_WAVE_EDIT_DEFAULT_WIDTH AGS_WAVE_EDIT_DEFAULT_CONTROL_WIDTH AGS_WAVE_EDIT_DEFAULT_CONTROL_HEIGHT AGS_WAVE_EDIT_DEFAULT_STEP_COUNT AGS_WAVE_EDIT_DEFAULT_CURSOR_POSITION_X AGS_WAVE_EDIT_DEFAULT_CURSOR_POSITION_Y AGS_WAVE_EDIT_DEFAULT_SELECTED_BUFFER_BORDER AGS_WAVE_EDIT_DEFAULT_FADER_WIDTH AGS_WAVE_EDIT_CURSOR_WIDTH AGS_WAVE_EDIT_CURSOR_HEIGHT AGS_WAVE_EDIT_MIN_ZOOM AGS_WAVE_EDIT_MAX_ZOOM AGS_WAVE_EDIT_DEFAULT_LOWER AGS_WAVE_EDIT_DEFAULT_UPPER AGS_WAVE_EDIT_DEFAULT_VALUE AGS_WAVE_EDIT_DEFAULT_PADDING AGS_WAVE_EDIT_X_RESOLUTION AgsWaveEditFlags AgsWaveEditMode AgsWaveEditButtonMask AgsWaveEditKeyMask ags_wave_edit_reset_vscrollbar ags_wave_edit_reset_hscrollbar ags_wave_edit_draw_segment ags_wave_edit_draw_position ags_wave_edit_draw_cursor ags_wave_edit_draw_selection ags_wave_edit_draw_buffer ags_wave_edit_draw_wave ags_wave_edit_draw ags_wave_edit_new AGS_IS_WAVE_EDIT AGS_TYPE_WAVE_EDIT AGS_WAVE_EDIT AGS_WAVE_EDIT_CLASS AGS_WAVE_EDIT_GET_CLASS AgsWaveEdit AgsWaveEditClass ags_wave_edit_get_type
ags_wave_edit_box AgsWaveEditBox AGS_WAVE_EDIT_BOX_DEFAULT_FIXED_EDIT_HEIGHT AgsWaveEditBoxFlags ags_wave_edit_box_new AGS_IS_WAVE_EDIT_BOX AGS_TYPE_WAVE_EDIT_BOX AGS_WAVE_EDIT_BOX AGS_WAVE_EDIT_BOX_CLASS AGS_WAVE_EDIT_BOX_GET_CLASS AgsWaveEditBox AgsWaveEditBoxClass ags_wave_edit_box_get_type
ags_wave_edit_callbacks ags_wave_edit_draw_callback ags_wave_edit_drawing_area_configure_event ags_wave_edit_drawing_area_button_press_event ags_wave_edit_drawing_area_button_release_event ags_wave_edit_drawing_area_motion_notify_event ags_wave_edit_drawing_area_key_press_event ags_wave_edit_drawing_area_key_release_event ags_wave_edit_vscrollbar_value_changed ags_wave_edit_hscrollbar_value_changed
ags_wave_editor AgsWaveEditor AGS_WAVE_EDITOR_MAX_VALUE_COUNT AGS_WAVE_EDITOR_MAX_CONTROLS AGS_WAVE_EDITOR_DEFAULT_VERSION AGS_WAVE_EDITOR_DEFAULT_BUILD_ID AgsWaveEditorFlags ags_wave_editor_reset_scrollbar ags_wave_editor_reset_audio_scrollbar ags_wave_editor_reset_output_scrollbar ags_wave_editor_reset_input_scrollbar ags_wave_editor_machine_changed ags_wave_editor_select_region ags_wave_editor_select_all ags_wave_editor_paste ags_wave_editor_copy ags_wave_editor_cut ags_wave_editor_invert ags_wave_editor_new AGS_IS_WAVE_EDITOR AGS_TYPE_WAVE_EDITOR AGS_WAVE_EDITOR AGS_WAVE_EDITOR_CLASS AGS_WAVE_EDITOR_GET_CLASS AgsWaveEditor AgsWaveEditorClass ags_wave_editor_get_type
ags_wave_editor_callbacks ags_wave_editor_edit_configure_event ags_wave_editor_vscrollbar_value_changed ags_wave_editor_hscrollbar_value_changed ags_wave_editor_wave_edit_hscrollbar_value_changed ags_wave_editor_machine_changed_callback ags_wave_editor_resize_audio_channels_callback ags_wave_editor_resize_pads_callback
ags_wave_export_dialog AgsWaveExportDialog AGS_WAVE_EXPORT_DIALOG_FORMAT_WAV AGS_WAVE_EXPORT_DIALOG_FORMAT_FLAC AGS_WAVE_EXPORT_DIALOG_FORMAT_AIFF AGS_WAVE_EXPORT_DIALOG_FORMAT_OGG AgsWaveExportDialogFlags ags_wave_export_dialog_update_duration ags_wave_export_dialog_new AGS_IS_WAVE_EXPORT_DIALOG AGS_TYPE_WAVE_EXPORT_DIALOG AGS_WAVE_EXPORT_DIALOG AGS_WAVE_EXPORT_DIALOG_CLASS AGS_WAVE_EXPORT_DIALOG_GET_CLASS AgsWaveExportDialog AgsWaveExportDialogClass ags_wave_export_dialog_get_type
ags_wave_export_dialog_callbacks ags_wave_export_dialog_file_chooser_button_callback ags_wave_export_dialog_start_tact_callback ags_wave_export_dialog_end_tact_callback ags_wave_export_dialog_apply_callback ags_wave_export_dialog_ok_callback ags_wave_export_dialog_cancel_callback
ags_wave_toolbar AgsWaveToolbar AgsWaveToolbarFlags ags_wave_toolbar_tool_popup_new ags_wave_toolbar_new AGS_IS_WAVE_TOOLBAR AGS_TYPE_WAVE_TOOLBAR AGS_WAVE_TOOLBAR AGS_WAVE_TOOLBAR_CLASS AGS_WAVE_TOOLBAR_GET_CLASS AgsWaveToolbar AgsWaveToolbarClass ags_wave_toolbar_get_type
ags_wave_toolbar_callbacks ags_wave_toolbar_position_callback ags_wave_toolbar_select_callback ags_wave_toolbar_copy_or_cut_callback ags_wave_toolbar_paste_callback ags_wave_toolbar_match_line_callback ags_wave_toolbar_tool_popup_select_buffer_callback ags_wave_toolbar_tool_popup_position_cursor_callback ags_wave_toolbar_tool_popup_enable_all_lines_callback ags_wave_toolbar_tool_popup_disable_all_lines_callback ags_wave_toolbar_zoom_callback ags_wave_toolbar_opacity_callback
ags_wave_window AgsWaveWindow AgsWaveWindowFlags ags_wave_window_new AGS_IS_WAVE_WINDOW AGS_TYPE_WAVE_WINDOW AGS_WAVE_WINDOW AGS_WAVE_WINDOW_CLASS AGS_WAVE_WINDOW_GET_CLASS AgsWaveWindow AgsWaveWindowClass ags_wave_window_get_type
ags_wave_window_callbacks
ags_window AgsWindow AGS_MACHINE_COUNTER AgsWindowFlags AgsMachineCounter ags_window_public_machine_counter_alloc ags_window_find_machine_counter ags_window_increment_machine_counter ags_window_decrement_machine_counter ags_machine_counter_alloc ags_window_show_error ags_window_load_file_timeout ags_window_new AGS_IS_WINDOW AGS_TYPE_WINDOW AGS_WINDOW AGS_WINDOW_CLASS AGS_WINDOW_GET_CLASS AgsWindow AgsWindowClass ags_window_get_type
ags_window_callbacks ags_window_delete_event_callback ags_window_button_press_event
ags_xorg_application_context AgsXorgApplicationContext AGS_XORG_VERSION AGS_XORG_BUILD_ID ags_xorg_application_context_message_monitor_timeout ags_xorg_application_context_task_timeout ags_xorg_application_context_new AGS_IS_XORG_APPLICATION_CONTEXT AGS_TYPE_XORG_APPLICATION_CONTEXT AGS_XORG_APPLICATION_CONTEXT AGS_XORG_APPLICATION_CONTEXT_CLASS AGS_XORG_APPLICATION_CONTEXT_GET_CLASS AgsXorgApplicationContext AgsXorgApplicationContextClass ags_xorg_application_context_get_type
gsequencer-3.1.3/docs/reference/libags/0000755000175000017500000000000013622252263015012 500000000000000gsequencer-3.1.3/docs/reference/libags/libags.types0000644000175000017500000000335413622252234017264 00000000000000ags_applicable_get_type ags_application_context_get_type ags_auth_security_context_get_type ags_authentication_get_type ags_authentication_manager_get_type ags_business_group_get_type ags_business_group_manager_get_type ags_certificate_get_type ags_certificate_manager_get_type ags_complex_get_type ags_concurrency_provider_get_type ags_config_get_type ags_connectable_get_type ags_controller_get_type ags_conversion_get_type ags_countable_get_type ags_cursor_get_type ags_destroy_worker_get_type ags_file_get_type ags_file_id_ref_get_type ags_file_launch_get_type ags_file_link_get_type ags_file_lookup_get_type ags_front_controller_get_type ags_function_get_type ags_generic_main_loop_get_type ags_log_get_type ags_main_loop_get_type ags_message_delivery_get_type ags_message_envelope_get_type ags_message_queue_get_type ags_mutable_get_type ags_password_store_get_type ags_password_store_manager_get_type ags_plugin_controller_get_type ags_plugin_get_type ags_portlet_get_type ags_priority_get_type ags_registry_get_type ags_returnable_thread_get_type ags_security_context_get_type ags_seekable_get_type ags_sequencer_get_type ags_server_application_context_get_type ags_server_get_type ags_server_status_get_type ags_service_provider_get_type ags_solver_matrix_get_type ags_solver_vector_get_type ags_sound_server_get_type ags_soundcard_get_type ags_tactable_get_type ags_task_completion_get_type ags_task_get_type ags_task_launcher_get_type ags_thread_application_context_get_type ags_thread_get_type ags_thread_pool_get_type ags_timestamp_get_type ags_turtle_get_type ags_turtle_manager_get_type ags_uuid_get_type ags_worker_thread_get_type ags_xml_authentication_get_type ags_xml_business_group_get_type ags_xml_certificate_get_type ags_xml_password_store_get_type gsequencer-3.1.3/docs/reference/libags/libags-sections.txt0000644000175000017500000013077613622252234020575 00000000000000
ags_applicable AgsApplicable ags_applicable_set_update ags_applicable_apply ags_applicable_reset AGS_APPLICABLE AGS_APPLICABLE_GET_INTERFACE AGS_APPLICABLE_INTERFACE AGS_IS_APPLICABLE AGS_IS_APPLICABLE_INTERFACE AGS_TYPE_APPLICABLE AgsApplicable AgsApplicableInterface ags_applicable_get_type
ags_application_context AgsApplicationContext AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX AGS_VERSION AGS_BUILD_ID AGS_DEFAULT_DIRECTORY AGS_DEFAULT_CONFIG AgsApplicationContextFlags ags_application_context_test_flags ags_application_context_set_flags ags_application_context_unset_flags ags_application_context_load_config ags_application_context_prepare ags_application_context_setup ags_application_context_register_types ags_application_context_quit ags_application_context_get_instance ags_application_context_new AGS_APPLICATION_CONTEXT AGS_APPLICATION_CONTEXT_CLASS AGS_APPLICATION_CONTEXT_GET_CLASS AGS_IS_APPLICATION_CONTEXT AGS_TYPE_APPLICATION_CONTEXT AgsApplicationContext AgsApplicationContextClass ags_application_context_get_type
ags_auth_security_context AgsAuthSecurityContext AGS_AUTH_SECURITY_CONTEXT_GET_OBJ_MUTEX ags_auth_security_context_get_instance ags_auth_security_context_new AGS_AUTH_SECURITY_CONTEXT AGS_AUTH_SECURITY_CONTEXT_CLASS AGS_AUTH_SECURITY_CONTEXT_GET_CLASS AGS_IS_AUTH_SECURITY_CONTEXT AGS_TYPE_AUTH_SECURITY_CONTEXT AgsAuthSecurityContext AgsAuthSecurityContextClass ags_auth_security_context_get_type
ags_authentication AgsAuthentication ags_authentication_get_authentication_module ags_authentication_login ags_authentication_logout ags_authentication_generate_token ags_authentication_get_digest ags_authentication_is_session_active AGS_AUTHENTICATION AGS_AUTHENTICATION_GET_INTERFACE AGS_AUTHENTICATION_INTERFACE AGS_IS_AUTHENTICATION AGS_IS_AUTHENTICATION_INTERFACE AGS_TYPE_AUTHENTICATION AgsAuthentication AgsAuthenticationInterface ags_authentication_get_type
ags_authentication_manager AgsAuthenticationManager AGS_LOGIN_INFO AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX AGS_AUTHENTICATION_MANAGER_DEFAULT_SESSION_TIMEOUT AgsLoginInfo ags_login_info_alloc ags_login_info_free ags_login_info_ref ags_login_info_unref ags_authentication_manager_get_authentication ags_authentication_manager_add_authentication ags_authentication_manager_remove_authentication ags_authentication_manager_get_session_timeout ags_authentication_manager_lookup_login ags_authentication_manager_insert_login ags_authentication_manager_remove_login ags_authentication_manager_login ags_authentication_manager_logout ags_authentication_manager_get_digest ags_authentication_manager_is_session_active ags_authentication_manager_get_instance ags_authentication_manager_new AGS_AUTHENTICATION_MANAGER AGS_AUTHENTICATION_MANAGER_CLASS AGS_AUTHENTICATION_MANAGER_GET_CLASS AGS_IS_AUTHENTICATION_MANAGER AGS_TYPE_AUTHENTICATION_MANAGER AgsAuthenticationManager AgsAuthenticationManagerClass ags_authentication_manager_get_type
ags_buffer_util ags_buffer_util_s8_to_char_buffer ags_buffer_util_s16_to_char_buffer ags_buffer_util_s24_to_char_buffer ags_buffer_util_s32_to_char_buffer ags_buffer_util_s64_to_char_buffer ags_buffer_util_float_to_char_buffer ags_buffer_util_double_to_char_buffer ags_buffer_util_complex_to_char_buffer ags_buffer_util_char_buffer_to_s8 ags_buffer_util_char_buffer_to_s16 ags_buffer_util_char_buffer_to_s24 ags_buffer_util_char_buffer_to_s32 ags_buffer_util_char_buffer_to_s64 ags_buffer_util_char_buffer_to_float ags_buffer_util_char_buffer_to_double ags_buffer_util_char_buffer_to_complex ags_buffer_util_char_buffer_read_s8 ags_buffer_util_char_buffer_read_s16 ags_buffer_util_char_buffer_read_s24 ags_buffer_util_char_buffer_read_s32 ags_buffer_util_char_buffer_read_s64 ags_buffer_util_char_buffer_read_float ags_buffer_util_char_buffer_read_double ags_buffer_util_char_buffer_read_complex ags_buffer_util_char_buffer_write_s8 ags_buffer_util_char_buffer_write_s16 ags_buffer_util_char_buffer_write_s24 ags_buffer_util_char_buffer_write_s32 ags_buffer_util_char_buffer_write_s64 ags_buffer_util_char_buffer_write_float ags_buffer_util_char_buffer_write_double ags_buffer_util_char_buffer_write_complex ags_buffer_util_char_buffer_swap_bytes
ags_business_group AgsBusinessGroup ags_business_group_get_group_uuid ags_business_group_set_group_name ags_business_group_get_group_name ags_business_group_set_user ags_business_group_get_user AGS_BUSINESS_GROUP AGS_BUSINESS_GROUP_GET_INTERFACE AGS_BUSINESS_GROUP_INTERFACE AGS_IS_BUSINESS_GROUP AGS_IS_BUSINESS_GROUP_INTERFACE AGS_TYPE_BUSINESS_GROUP AgsBusinessGroup AgsBusinessGroupInterface ags_business_group_get_type
ags_business_group_manager AgsBusinessGroupManager AGS_BUSINESS_GROUP_MANAGER_GET_OBJ_MUTEX ags_business_group_manager_get_business_group ags_business_group_manager_add_business_group ags_business_group_manager_remove_business_group ags_business_group_manager_get_instance ags_business_group_manager_new AGS_BUSINESS_GROUP_MANAGER AGS_BUSINESS_GROUP_MANAGER_CLASS AGS_BUSINESS_GROUP_MANAGER_GET_CLASS AGS_IS_BUSINESS_GROUP_MANAGER AGS_TYPE_BUSINESS_GROUP_MANAGER AgsBusinessGroupManager AgsBusinessGroupManagerClass ags_business_group_manager_get_type
ags_certificate AgsCertificate ags_certificate_get_cert_uuid ags_certificate_set_domain ags_certificate_get_domain ags_certificate_set_key_type ags_certificate_get_key_type ags_certificate_set_public_key_file ags_certificate_get_public_key_file ags_certificate_set_private_key_file ags_certificate_get_private_key_file AGS_CERTIFICATE AGS_CERTIFICATE_GET_INTERFACE AGS_CERTIFICATE_INTERFACE AGS_IS_CERTIFICATE AGS_IS_CERTIFICATE_INTERFACE AGS_TYPE_CERTIFICATE AgsCertificate AgsCertificateInterface ags_certificate_get_type
ags_certificate_manager AgsCertificateManager AGS_CERTIFICATE_MANAGER_GET_OBJ_MUTEX ags_certificate_manager_get_certificate ags_certificate_manager_add_certificate ags_certificate_manager_remove_certificate ags_certificate_manager_get_key_file ags_certificate_manager_get_instance ags_certificate_manager_new AGS_CERTIFICATE_MANAGER AGS_CERTIFICATE_MANAGER_CLASS AGS_CERTIFICATE_MANAGER_GET_CLASS AGS_IS_CERTIFICATE_MANAGER AGS_TYPE_CERTIFICATE_MANAGER AgsCertificateManager AgsCertificateManagerClass ags_certificate_manager_get_type
ags_complex AGS_COMPLEX_M_E AGS_COMPLEX_M_PI ags_complex_alloc ags_complex_copy ags_complex_free ags_complex_get ags_complex_set AGS_TYPE_COMPLEX AgsComplex ags_complex_get_type
ags_concurrency_provider AgsConcurrencyProvider ags_concurrency_provider_get_main_loop ags_concurrency_provider_set_main_loop ags_concurrency_provider_get_task_launcher ags_concurrency_provider_set_task_launcher ags_concurrency_provider_get_thread_pool ags_concurrency_provider_set_thread_pool ags_concurrency_provider_get_worker ags_concurrency_provider_set_worker AGS_CONCURRENCY_PROVIDER AGS_CONCURRENCY_PROVIDER_GET_INTERFACE AGS_CONCURRENCY_PROVIDER_INTERFACE AGS_IS_CONCURRENCY_PROVIDER AGS_IS_CONCURRENCY_PROVIDER_INTERFACE AGS_TYPE_CONCURRENCY_PROVIDER AgsConcurrencyProvider AgsConcurrencyProviderInterface ags_concurrency_provider_get_type
ags_config AgsConfig AGS_CONFIG_GET_OBJ_MUTEX AGS_CONFIG_DEFAULT_VERSION AGS_CONFIG_DEFAULT_BUILD_ID AGS_CONFIG_GENERIC AGS_CONFIG_THREAD AGS_CONFIG_SERVER AGS_CONFIG_SOUNDCARD AGS_CONFIG_SOUNDCARD_0 AGS_CONFIG_SEQUENCER AGS_CONFIG_SEQUENCER_0 AGS_CONFIG_RECALL AGS_CONFIG_OSC_SERVER AGS_CONFIG_OSC_SERVER_0 ags_config_load_defaults ags_config_load_from_file ags_config_load_from_data ags_config_set_value ags_config_get_value ags_config_to_data ags_config_save ags_config_clear ags_config_get_instance ags_config_new AGS_CONFIG AGS_CONFIG_CLASS AGS_CONFIG_GET_CLASS AGS_IS_CONFIG AGS_TYPE_CONFIG AgsConfig AgsConfigClass ags_config_get_type
ags_connectable AgsConnectable ags_connectable_get_uuid ags_connectable_has_resource ags_connectable_is_ready ags_connectable_add_to_registry ags_connectable_remove_from_registry ags_connectable_list_resource ags_connectable_xml_compose ags_connectable_xml_parse ags_connectable_is_connected ags_connectable_connect ags_connectable_disconnect ags_connectable_connect_connection ags_connectable_disconnect_connection AGS_CONNECTABLE AGS_CONNECTABLE_GET_INTERFACE AGS_CONNECTABLE_INTERFACE AGS_IS_CONNECTABLE AGS_IS_CONNECTABLE_INTERFACE AGS_TYPE_CONNECTABLE AgsConnectable AgsConnectableInterface ags_connectable_get_type
ags_controller AgsController AGS_CONTROLLER_GET_OBJ_MUTEX AGS_CONTROLLER_BASE_PATH AgsControllerResource ags_controller_resource_alloc ags_controller_resource_free ags_controller_resource_ref ags_controller_resource_unref ags_controller_add_resource ags_controller_remove_resource ags_controller_lookup_resource ags_controller_query_security_context ags_controller_new AGS_CONTROLLER AGS_CONTROLLER_CLASS AGS_CONTROLLER_GET_CLASS AGS_IS_CONTROLLER AGS_TYPE_CONTROLLER AgsController AgsControllerClass ags_controller_get_type
ags_conversion AgsConversion AGS_CONVERSION_GET_OBJ_MUTEX ags_conversion_convert ags_conversion_new AGS_CONVERSION AGS_CONVERSION_CLASS AGS_CONVERSION_GET_CLASS AGS_IS_CONVERSION AGS_TYPE_CONVERSION AgsConversion AgsConversionClass ags_conversion_get_type
ags_countable AgsCountable ags_countable_get_sequencer_counter ags_countable_get_notation_counter ags_countable_get_wave_counter ags_countable_get_midi_counter AGS_COUNTABLE AGS_COUNTABLE_GET_INTERFACE AGS_COUNTABLE_INTERFACE AGS_IS_COUNTABLE AGS_IS_COUNTABLE_INTERFACE AGS_TYPE_COUNTABLE AgsCountable AgsCountableInterface ags_countable_get_type
ags_cursor AgsCursor ags_cursor_get_default_offset ags_cursor_get_tact ags_cursor_get_bpm ags_cursor_get_rate ags_cursor_get_delay ags_cursor_get_duration ags_cursor_get_delay_counter ags_cursor_get_offset ags_cursor_get_prev ags_cursor_get_next ags_cursor_get_current_copy ags_cursor_get_current AGS_CURSOR AGS_CURSOR_GET_INTERFACE AGS_CURSOR_INTERFACE AGS_IS_CURSOR AGS_IS_CURSOR_INTERFACE AGS_TYPE_CURSOR AgsCursor AgsCursorInterface ags_cursor_get_type
ags_destroy_util ags_destroy_util_dispose_and_unref
ags_destroy_worker AgsDestroyWorker AGS_DESTROY_ENTRY AgsDestroyFunc AgsDestroyEntry ags_destroy_entry_alloc ags_destroy_worker_add ags_destroy_worker_get_instance ags_destroy_worker_new AGS_DESTROY_WORKER AGS_DESTROY_WORKER_CLASS AGS_DESTROY_WORKER_GET_CLASS AGS_IS_DESTROY_WORKER AGS_TYPE_DESTROY_WORKER AgsDestroyWorker AgsDestroyWorkerClass ags_destroy_worker_get_type
ags_endian AgsByteOrder ags_endian_host_is_le ags_endian_host_is_be ags_endian_swap_float
ags_file AgsFile AGS_FILE_GET_OBJ_MUTEX AGS_FILE_DEFAULT_ENCODING AGS_FILE_DEFAULT_DTD AGS_FILE_CHECKSUM_LENGTH AGS_FILE_DEFAULT_AUDIO_FORMAT AGS_FILE_DEFAULT_AUDIO_ENCODING AgsFileFlags AGS_FILE_ERROR AgsFileError ags_file_str2md5 ags_file_add_id_ref ags_file_find_id_ref_by_node ags_file_find_id_ref_by_xpath ags_file_find_id_ref_by_reference ags_file_add_lookup ags_file_add_launch ags_file_open ags_file_open_from_data ags_file_rw_open ags_file_open_filename ags_file_close ags_file_write ags_file_write_concurrent ags_file_write_resolve ags_file_read ags_file_read_resolve ags_file_read_start ags_file_read_config ags_file_write_config ags_file_read_application_context ags_file_write_application_context ags_file_new AGS_FILE AGS_FILE_CLASS AGS_FILE_GET_CLASS AGS_IS_FILE AGS_TYPE_FILE AgsFile AgsFileClass ags_file_get_type
ags_file_id_ref AgsFileIdRef AGS_FILE_ID_REF_GET_OBJ_MUTEX AGS_FILE_RESOLVE AGS_FILE_ID_REF_SERIALIZE_DATA AGS_FILE_ID_REF_RESOLVE_DATA AgsFileResolve ags_file_id_ref_resolved ags_file_id_ref_new AGS_FILE_ID_REF AGS_FILE_ID_REF_CLASS AGS_FILE_ID_REF_GET_CLASS AGS_IS_FILE_ID_REF AGS_TYPE_FILE_ID_REF AgsFileIdRef AgsFileIdRefClass ags_file_id_ref_get_type
ags_file_launch AgsFileLaunch AGS_FILE_LAUNCH_GET_OBJ_MUTEX ags_file_launch_start ags_file_launch_new AGS_FILE_LAUNCH AGS_FILE_LAUNCH_CLASS AGS_FILE_LAUNCH_GET_CLASS AGS_IS_FILE_LAUNCH AGS_TYPE_FILE_LAUNCH AgsFileLaunch AgsFileLaunchClass ags_file_launch_get_type
ags_file_link AgsFileLink AGS_FILE_LINK_GET_OBJ_MUTEX AGS_FILE_LINK_DEFAULT_VERSION AGS_FILE_LINK_DEFAULT_BUILD_ID ags_file_link_new AGS_FILE_LINK AGS_FILE_LINK_CLASS AGS_FILE_LINK_GET_CLASS AGS_IS_FILE_LINK AGS_TYPE_FILE_LINK AgsFileLink AgsFileLinkClass ags_file_link_get_type
ags_file_lookup AgsFileLookup AGS_FILE_LOOKUP_GET_OBJ_MUTEX ags_file_lookup_find_by_node ags_file_lookup_find_by_reference ags_file_lookup_resolve ags_file_lookup_new AGS_FILE_LOOKUP AGS_FILE_LOOKUP_CLASS AGS_FILE_LOOKUP_GET_CLASS AGS_IS_FILE_LOOKUP AGS_TYPE_FILE_LOOKUP AgsFileLookup AgsFileLookupClass ags_file_lookup_get_type
ags_front_controller AgsFrontController ags_front_controller_do_request ags_front_controller_new AGS_FRONT_CONTROLLER AGS_FRONT_CONTROLLER_CLASS AGS_FRONT_CONTROLLER_GET_CLASS AGS_IS_FRONT_CONTROLLER AGS_TYPE_FRONT_CONTROLLER AgsFrontController AgsFrontControllerClass ags_front_controller_get_type
ags_function AgsFunction AGS_FUNCTION_GET_OBJ_MUTEX AGS_SYMBOLIC_EULER AGS_SYMBOLIC_PI AGS_SYMBOLIC_INFINIT AGS_SYMBOLIC_COMPLEX_UNIT AgsFunctionFlags ags_function_collapse_parantheses ags_function_find_literals ags_function_literal_solve ags_function_push_equation ags_function_pop_equation ags_function_get_expanded ags_function_get_normalized ags_function_compute_term ags_function_symbolic_translate_value ags_function_substitute_values ags_function_translate_value ags_function_new AGS_FUNCTION AGS_FUNCTION_CLASS AGS_FUNCTION_GET_CLASS AGS_IS_FUNCTION AGS_TYPE_FUNCTION AgsFunction AgsFunctionClass ags_function_get_type
ags_generic_main_loop AgsGenericMainLoop AGS_GENERIC_MAIN_LOOP_DEFAULT_JIFFIE ags_generic_main_loop_new AGS_GENERIC_MAIN_LOOP AGS_GENERIC_MAIN_LOOP_CLASS AGS_GENERIC_MAIN_LOOP_GET_CLASS AGS_IS_GENERIC_MAIN_LOOP AGS_TYPE_GENERIC_MAIN_LOOP AgsGenericMainLoop AgsGenericMainLoopClass ags_generic_main_loop_get_type
ags_globals ags_globals_get_hash_table ags_globals_set ags_globals_get
ags_id_generator ags_id_generator_create_uuid
ags_list_util ags_list_util_find_type
ags_log AgsLog AGS_LOG_GET_OBJ_MUTEX ags_log_add_message ags_log_get_messages ags_log_get_instance ags_log_new AGS_IS_LOG AGS_LOG AGS_LOG_CLASS AGS_LOG_GET_CLASS AGS_TYPE_LOG AgsLog AgsLogClass ags_log_get_type
ags_macros AGS_DECLARE_INTERFACE
ags_main_loop AgsMainLoop ags_main_loop_get_tree_lock ags_main_loop_set_syncing ags_main_loop_is_syncing ags_main_loop_set_critical_region ags_main_loop_is_critical_region ags_main_loop_inc_queued_critical_region ags_main_loop_dec_queued_critical_region ags_main_loop_test_queued_critical_region ags_main_loop_change_frequency AGS_IS_MAIN_LOOP AGS_IS_MAIN_LOOP_INTERFACE AGS_MAIN_LOOP AGS_MAIN_LOOP_GET_INTERFACE AGS_MAIN_LOOP_INTERFACE AGS_TYPE_MAIN_LOOP AgsMainLoop AgsMainLoopInterface ags_main_loop_get_type
ags_marshal ags_cclosure_marshal_VOID__UINT64 ags_cclosure_marshal_VOID__BOOLEAN_POINTER ags_cclosure_marshal_VOID__INT_UINT ags_cclosure_marshal_VOID__INT_POINTER ags_cclosure_marshal_VOID__INT_UINT_POINTER ags_cclosure_marshal_VOID__UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT ags_cclosure_marshal_VOID__UINT_INT ags_cclosure_marshal_VOID__UINT_DOUBLE ags_cclosure_marshal_VOID__UINT_STRING_UINT ags_cclosure_marshal_VOID__UINT_POINTER_UINT ags_cclosure_marshal_VOID__INT64_UINT ags_cclosure_marshal_VOID__ULONG_UINT ags_cclosure_marshal_VOID__ULONG_UINT_BOOLEAN ags_cclosure_marshal_VOID__DOUBLE_DOUBLE ags_cclosure_marshal_VOID__ULONG_UINT_UINT ags_cclosure_marshal_VOID__STRING_UINT ags_cclosure_marshal_VOID__STRING_UINT_DOUBLE ags_cclosure_marshal_VOID__STRING_UINT_POINTER ags_cclosure_marshal_VOID__STRING_UINT_STRING_DOUBLE ags_cclosure_marshal_VOID__STRING_POINTER ags_cclosure_marshal_VOID__STRING_STRING_STRING ags_cclosure_marshal_VOID__POINTER_INT ags_cclosure_marshal_VOID__POINTER_INT_POINTER ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN ags_cclosure_marshal_VOID__POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER ags_cclosure_marshal_VOID__POINTER_UINT_UINT ags_cclosure_marshal_VOID__POINTER_UINT_POINTER ags_cclosure_marshal_VOID__POINTER_POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER ags_cclosure_marshal_VOID__OBJECT_UINT ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT ags_cclosure_marshal_VOID__OBJECT_OBJECT ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT ags_cclosure_marshal_ULONG__VOID ags_cclosure_marshal_INT__VOID ags_cclosure_marshal_INT64__OBJECT ags_cclosure_marshal_UINT__VOID ags_cclosure_marshal_BOOLEAN__VOID ags_cclosure_marshal_BOOLEAN__UINT_POINTER ags_cclosure_marshal_BOOLEAN__POINTER_UINT ags_cclosure_marshal_BOOLEAN__OBJECT_OBJECT ags_cclosure_marshal_UINT__INT_UINT_POINTER ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN ags_cclosure_marshal_STRING__STRING_STRING ags_cclosure_marshal_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER ags_cclosure_marshal_POINTER__VOID ags_cclosure_marshal_POINTER__INT ags_cclosure_marshal_POINTER__UINT ags_cclosure_marshal_POINTER__POINTER ags_cclosure_marshal_POINTER__INT_UINT ags_cclosure_marshal_POINTER__UINT_UINT ags_cclosure_marshal_POINTER__UINT_POINTER ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER ags_cclosure_marshal_POINTER__POINTER_UINT ags_cclosure_marshal_POINTER__STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING_STRING ags_cclosure_marshal_POINTER__ULONG_POINTER_UINT ags_cclosure_marshal_POINTER__ULONG_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64 ags_cclosure_marshal_POINTER__OBJECT_OBJECT ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__POINTER_STRING_STRING ags_cclosure_marshal_OBJECT__VOID ags_cclosure_marshal_OBJECT__UINT_POINTER ags_cclosure_marshal_OBJECT__STRING_STRING_STRING ags_cclosure_marshal_OBJECT__OBJECT ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_OBJECT
ags_message_delivery AgsMessageDelivery AGS_MESSAGE_DELIVERY_GET_OBJ_MUTEX ags_message_delivery_add_message_queue ags_message_delivery_remove_message_queue ags_message_delivery_find_sender_namespace ags_message_delivery_find_recipient_namespace ags_message_delivery_add_message_envelope ags_message_delivery_remove_message_envelope ags_message_delivery_find_sender ags_message_delivery_find_recipient ags_message_delivery_query_message ags_message_delivery_get_instance ags_message_delivery_new AGS_IS_MESSAGE_DELIVERY AGS_MESSAGE_DELIVERY AGS_MESSAGE_DELIVERY_CLASS AGS_MESSAGE_DELIVERY_GET_CLASS AGS_TYPE_MESSAGE_DELIVERY AgsMessageDelivery AgsMessageDeliveryClass ags_message_delivery_get_type
ags_message_envelope AgsMessageEnvelope AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX ags_message_envelope_get_sender ags_message_envelope_get_recipient ags_message_envelope_get_doc ags_message_envelope_get_parameter ags_message_envelope_new ags_message_envelope_new_with_params AGS_IS_MESSAGE_ENVELOPE AGS_MESSAGE_ENVELOPE AGS_MESSAGE_ENVELOPE_CLASS AGS_MESSAGE_ENVELOPE_GET_CLASS AGS_TYPE_MESSAGE_ENVELOPE AgsMessageEnvelope AgsMessageEnvelopeClass ags_message_envelope_get_type
ags_message_queue AgsMessageQueue AGS_MESSAGE_QUEUE_GET_OBJ_MUTEX ags_message_queue_add_message_envelope ags_message_queue_remove_message_envelope ags_message_queue_find_sender ags_message_queue_find_recipient ags_message_queue_query_message ags_message_queue_new AGS_IS_MESSAGE_QUEUE AGS_MESSAGE_QUEUE AGS_MESSAGE_QUEUE_CLASS AGS_MESSAGE_QUEUE_GET_CLASS AGS_TYPE_MESSAGE_QUEUE AgsMessageQueue AgsMessageQueueClass ags_message_queue_get_type
ags_mutable AgsMutable ags_mutable_set_muted AGS_IS_MUTABLE AGS_IS_MUTABLE_INTERFACE AGS_MUTABLE AGS_MUTABLE_GET_INTERFACE AGS_MUTABLE_INTERFACE AGS_TYPE_MUTABLE AgsMutable AgsMutableInterface ags_mutable_get_type
ags_password_store AgsPasswordStore ags_password_store_set_login_name ags_password_store_get_login_name ags_password_store_set_password ags_password_store_get_password ags_password_store_encrypt_password AGS_IS_PASSWORD_STORE AGS_IS_PASSWORD_STORE_INTERFACE AGS_PASSWORD_STORE AGS_PASSWORD_STORE_GET_INTERFACE AGS_PASSWORD_STORE_INTERFACE AGS_TYPE_PASSWORD_STORE AgsPasswordStore AgsPasswordStoreInterface ags_password_store_get_type
ags_password_store_manager AgsPasswordStoreManager AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX ags_password_store_manager_get_password_store ags_password_store_manager_add_password_store ags_password_store_manager_remove_password_store ags_password_store_manager_check_password ags_password_store_manager_get_instance ags_password_store_manager_new AGS_IS_PASSWORD_STORE_MANAGER AGS_PASSWORD_STORE_MANAGER AGS_PASSWORD_STORE_MANAGER_CLASS AGS_PASSWORD_STORE_MANAGER_GET_CLASS AGS_TYPE_PASSWORD_STORE_MANAGER AgsPasswordStoreManager AgsPasswordStoreManagerClass ags_password_store_manager_get_type
ags_plugin AgsPlugin ags_plugin_get_name ags_plugin_set_name ags_plugin_get_version ags_plugin_set_version ags_plugin_get_build_id ags_plugin_set_build_id ags_plugin_get_xml_type ags_plugin_set_xml_type ags_plugin_get_ports ags_plugin_set_ports ags_plugin_read ags_plugin_write AGS_IS_PLUGIN AGS_IS_PLUGIN_INTERFACE AGS_PLUGIN AGS_PLUGIN_GET_INTERFACE AGS_PLUGIN_INTERFACE AGS_TYPE_PLUGIN AgsPlugin AgsPluginInterface ags_plugin_get_type
ags_plugin_controller AgsPluginController ags_plugin_controller_do_request AGS_IS_PLUGIN_CONTROLLER AGS_IS_PLUGIN_CONTROLLER_INTERFACE AGS_PLUGIN_CONTROLLER AGS_PLUGIN_CONTROLLER_GET_INTERFACE AGS_PLUGIN_CONTROLLER_INTERFACE AGS_TYPE_PLUGIN_CONTROLLER AgsPluginController AgsPluginControllerInterface ags_plugin_controller_get_type
ags_portlet AgsPortlet ags_portlet_get_port ags_portlet_set_port ags_portlet_list_safe_properties ags_portlet_safe_get_property ags_portlet_safe_set_property AGS_IS_PORTLET AGS_IS_PORTLET_INTERFACE AGS_PORTLET AGS_PORTLET_GET_INTERFACE AGS_PORTLET_INTERFACE AGS_TYPE_PORTLET AgsPortlet AgsPortletInterface ags_portlet_get_type
ags_priority AgsPriority AGS_PRIORITY_GET_OBJ_MUTEX AGS_PRIORITY_DEFAULT_VERSION AGS_PRIORITY_DEFAULT_BUILD_ID AGS_PRIORITY_RT_THREAD AGS_PRIORITY_KEY_LIBAGS AGS_PRIORITY_KEY_SERVER_MAIN_LOOP AGS_PRIORITY_KEY_AUDIO_MAIN_LOOP AGS_PRIORITY_KEY_AUDIO AGS_PRIORITY_KEY_OSC_SERVER_MAIN_LOOP AGS_PRIORITY_KEY_GUI_MAIN_LOOP AgsPriorityFlags ags_priority_load_defaults ags_priority_load_from_file ags_priority_set_value ags_priority_get_value ags_priority_get_instance ags_priority_new AGS_IS_PRIORITY AGS_PRIORITY AGS_PRIORITY_CLASS AGS_PRIORITY_GET_CLASS AGS_TYPE_PRIORITY AgsPriority AgsPriorityClass ags_priority_get_type
ags_regex ags_regcomp ags_regexec
ags_registry AgsRegistry AGS_REGISTRY_GET_OBJ_MUTEX AgsRegistryFlags AgsRegistryEntry ags_registry_entry_alloc ags_registry_entry_free ags_registry_add_entry ags_registry_find_entry ags_registry_new AGS_IS_REGISTRY AGS_REGISTRY AGS_REGISTRY_CLASS AGS_REGISTRY_GET_CLASS AGS_TYPE_REGISTRY AgsRegistry AgsRegistryClass ags_registry_get_type
ags_returnable_thread AgsReturnableThread AGS_RETURNABLE_THREAD_DEFAULT_JIFFIE AgsReturnableThreadCallback AgsReturnableThreadFlags ags_returnable_thread_test_flags ags_returnable_thread_set_flags ags_returnable_thread_unset_flags ags_returnable_thread_safe_run ags_returnable_thread_connect_safe_run ags_returnable_thread_disconnect_safe_run ags_returnable_thread_new AGS_IS_RETURNABLE_THREAD AGS_RETURNABLE_THREAD AGS_RETURNABLE_THREAD_CLASS AGS_RETURNABLE_THREAD_GET_CLASS AGS_TYPE_RETURNABLE_THREAD AgsReturnableThread AgsReturnableThreadClass ags_returnable_thread_get_type
ags_security_context AgsSecurityContext AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX AgsSecurityContextMode ags_security_context_parse_business_group ags_security_context_get_business_group ags_security_context_add_server_context ags_security_context_remove_server_context ags_security_context_get_server_context ags_security_context_new AGS_IS_SECURITY_CONTEXT AGS_SECURITY_CONTEXT AGS_SECURITY_CONTEXT_CLASS AGS_SECURITY_CONTEXT_GET_CLASS AGS_TYPE_SECURITY_CONTEXT AgsSecurityContext AgsSecurityContextClass ags_security_context_get_type
ags_seekable AgsSeekable AgsSeekType ags_seekable_seek AGS_IS_SEEKABLE AGS_IS_SEEKABLE_INTERFACE AGS_SEEKABLE AGS_SEEKABLE_GET_INTERFACE AGS_SEEKABLE_INTERFACE AGS_TYPE_SEEKABLE AgsSeekable AgsSeekableInterface ags_seekable_get_type
ags_sequencer AgsSequencer AGS_SEQUENCER_DEFAULT_SAMPLERATE AGS_SEQUENCER_DEFAULT_BUFFER_SIZE AGS_SEQUENCER_DEFAULT_DEVICE AGS_SEQUENCER_DEFAULT_BPM AGS_SEQUENCER_DEFAULT_DELAY_FACTOR AGS_SEQUENCER_DEFAULT_JIFFIE AGS_SEQUENCER_DEFAULT_TACT AGS_SEQUENCER_DEFAULT_TACT_JIFFIE AGS_SEQUENCER_DEFAULT_TACTRATE AGS_SEQUENCER_DEFAULT_SCALE AGS_SEQUENCER_DEFAULT_DELAY AGS_SEQUENCER_DEFAULT_PERIOD AGS_SEQUENCER_DEFAULT_LATENCY ags_sequencer_set_device ags_sequencer_get_device ags_sequencer_list_cards ags_sequencer_is_starting ags_sequencer_is_playing ags_sequencer_is_recording ags_sequencer_play_init ags_sequencer_play ags_sequencer_record_init ags_sequencer_record ags_sequencer_stop ags_sequencer_tic ags_sequencer_offset_changed ags_sequencer_get_buffer ags_sequencer_get_next_buffer ags_sequencer_lock_buffer ags_sequencer_unlock_buffer ags_sequencer_set_bpm ags_sequencer_get_bpm ags_sequencer_set_delay_factor ags_sequencer_get_delay_factor ags_sequencer_set_start_note_offset ags_sequencer_get_start_note_offset ags_sequencer_set_note_offset ags_sequencer_get_note_offset AGS_IS_SEQUENCER AGS_IS_SEQUENCER_INTERFACE AGS_SEQUENCER AGS_SEQUENCER_GET_INTERFACE AGS_SEQUENCER_INTERFACE AGS_TYPE_SEQUENCER AgsSequencer AgsSequencerInterface ags_sequencer_get_type
ags_server AgsServer AGS_SERVER_GET_OBJ_MUTEX AGS_SERVER_DEFAULT_SERVER_PORT AGS_SERVER_DEFAULT_DOMAIN AGS_SERVER_DEFAULT_INET4_ADDRESS AGS_SERVER_DEFAULT_INET6_ADDRESS AGS_SERVER_DEFAULT_AUTH_MODULE AGS_SERVER_DEFAULT_BACKLOG AgsServerFlags AgsServerInfo ags_server_test_flags ags_server_set_flags ags_server_unset_flags ags_server_info_alloc ags_server_add_controller ags_server_remove_controller ags_server_start ags_server_stop ags_server_listen ags_server_new AGS_IS_SERVER AGS_SERVER AGS_SERVER_CLASS AGS_SERVER_GET_CLASS AGS_TYPE_SERVER AgsServer AgsServerClass ags_server_get_type
ags_server_application_context AgsServerApplicationContext AGS_SERVER_VERSION AGS_SERVER_BUILD_ID ags_server_application_context_new AGS_IS_SERVER_APPLICATION_CONTEXT AGS_SERVER_APPLICATION_CONTEXT AGS_SERVER_APPLICATION_CONTEXT_CLASS AGS_SERVER_APPLICATION_CONTEXT_GET_CLASS AGS_TYPE_SERVER_APPLICATION_CONTEXT AgsServerApplicationContext AgsServerApplicationContextClass ags_server_application_context_get_type
ags_server_status AgsServerStatus AGS_SERVER_STATUS_GET_OBJ_MUTEX ags_server_status_new AGS_IS_SERVER_STATUS AGS_SERVER_STATUS AGS_SERVER_STATUS_CLASS AGS_SERVER_STATUS_GET_CLASS AGS_TYPE_SERVER_STATUS AgsServerStatus AgsServerStatusClass ags_server_status_get_type
ags_service_provider AgsServiceProvider ags_service_provider_is_operating ags_service_provider_server_status ags_service_provider_set_registry ags_service_provider_get_registry ags_service_provider_set_server ags_service_provider_get_server AGS_IS_SERVICE_PROVIDER AGS_IS_SERVICE_PROVIDER_INTERFACE AGS_SERVICE_PROVIDER AGS_SERVICE_PROVIDER_GET_INTERFACE AGS_SERVICE_PROVIDER_INTERFACE AGS_TYPE_SERVICE_PROVIDER AgsServiceProvider AgsServiceProviderInterface ags_service_provider_get_type
ags_solver_matrix AgsSolverMatrix AGS_SOLVER_MATRIX_GET_OBJ_MUTEX ags_solver_matrix_new AGS_IS_SOLVER_MATRIX AGS_SOLVER_MATRIX AGS_SOLVER_MATRIX_CLASS AGS_SOLVER_MATRIX_GET_CLASS AGS_TYPE_SOLVER_MATRIX AgsSolverMatrix AgsSolverMatrixClass ags_solver_matrix_get_type
ags_solver_vector AgsSolverVector AGS_SOLVER_VECTOR_GET_OBJ_MUTEX ags_solver_vector_new AGS_IS_SOLVER_VECTOR AGS_SOLVER_VECTOR AGS_SOLVER_VECTOR_CLASS AGS_SOLVER_VECTOR_GET_CLASS AGS_TYPE_SOLVER_VECTOR AgsSolverVector AgsSolverVectorClass ags_solver_vector_get_type
ags_sound_server AgsSoundServer ags_sound_server_set_url ags_sound_server_get_url ags_sound_server_set_ports ags_sound_server_get_ports ags_sound_server_set_soundcard ags_sound_server_get_soundcard ags_sound_server_set_sequencer ags_sound_server_get_sequencer ags_sound_server_register_soundcard ags_sound_server_unregister_soundcard ags_sound_server_register_sequencer ags_sound_server_unregister_sequencer AGS_IS_SOUND_SERVER AGS_IS_SOUND_SERVER_INTERFACE AGS_SOUND_SERVER AGS_SOUND_SERVER_GET_INTERFACE AGS_SOUND_SERVER_INTERFACE AGS_TYPE_SOUND_SERVER AgsSoundServer AgsSoundServerInterface ags_sound_server_get_type
ags_soundcard AgsSoundcard AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS AGS_SOUNDCARD_MIN_DSP_CHANNELS AGS_SOUNDCARD_MAX_DSP_CHANNELS AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS AGS_SOUNDCARD_MIN_PCM_CHANNELS AGS_SOUNDCARD_MAX_PCM_CHANNELS AGS_SOUNDCARD_DEFAULT_SAMPLERATE AGS_SOUNDCARD_MIN_SAMPLERATE AGS_SOUNDCARD_MAX_SAMPLERATE AGS_SOUNDCARD_DEFAULT_FORMAT AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE AGS_SOUNDCARD_MIN_BUFFER_SIZE AGS_SOUNDCARD_MAX_BUFFER_SIZE AGS_SOUNDCARD_DEFAULT_BPM AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR AGS_SOUNDCARD_DEFAULT_JIFFIE AGS_SOUNDCARD_DEFAULT_TACT AGS_SOUNDCARD_DEFAULT_TACT_JIFFIE AGS_SOUNDCARD_DEFAULT_TACTRATE AGS_SOUNDCARD_DEFAULT_SCALE AGS_SOUNDCARD_DEFAULT_DELAY AGS_SOUNDCARD_DEFAULT_PERIOD AGS_SOUNDCARD_DEFAULT_LOOP_LEFT AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT AGS_SOUNDCARD_DEFAULT_OVERCLOCK AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT AgsSoundcardFormat AgsSoundcardCapability ags_soundcard_set_device ags_soundcard_get_device ags_soundcard_set_presets ags_soundcard_get_presets ags_soundcard_list_cards ags_soundcard_pcm_info ags_soundcard_get_capability ags_soundcard_is_available ags_soundcard_is_starting ags_soundcard_is_playing ags_soundcard_is_recording ags_soundcard_get_uptime ags_soundcard_play_init ags_soundcard_play ags_soundcard_record_init ags_soundcard_record ags_soundcard_stop ags_soundcard_tic ags_soundcard_offset_changed ags_soundcard_get_buffer ags_soundcard_get_next_buffer ags_soundcard_get_prev_buffer ags_soundcard_lock_buffer ags_soundcard_unlock_buffer ags_soundcard_set_bpm ags_soundcard_get_bpm ags_soundcard_set_delay_factor ags_soundcard_get_delay_factor ags_soundcard_get_absolute_delay ags_soundcard_get_delay ags_soundcard_get_attack ags_soundcard_get_delay_counter ags_soundcard_set_start_note_offset ags_soundcard_get_start_note_offset ags_soundcard_set_note_offset ags_soundcard_get_note_offset ags_soundcard_set_note_offset_absolute ags_soundcard_get_note_offset_absolute ags_soundcard_set_loop ags_soundcard_get_loop ags_soundcard_get_loop_offset ags_soundcard_get_sub_block_count ags_soundcard_trylock_sub_block ags_soundcard_unlock_sub_block AGS_IS_SOUNDCARD AGS_IS_SOUNDCARD_INTERFACE AGS_SOUNDCARD AGS_SOUNDCARD_GET_INTERFACE AGS_SOUNDCARD_INTERFACE AGS_TYPE_SOUNDCARD AgsSoundcard AgsSoundcardInterface ags_soundcard_get_type
ags_soundcard_helper ags_soundcard_helper_config_get_dsp_channels ags_soundcard_helper_config_get_pcm_channels ags_soundcard_helper_config_get_samplerate ags_soundcard_helper_config_get_buffer_size ags_soundcard_helper_config_get_format
ags_string_util ags_string_util_escape_single_quote ags_strv_length ags_strv_contains ags_strv_index
ags_tactable AgsTactable ags_tactable_get_sequencer_duration ags_tactable_get_notation_duration ags_tactable_get_wave_duration ags_tactable_get_midi_duration ags_tactable_get_bpm ags_tactable_get_tact ags_tactable_change_sequencer_duration ags_tactable_change_notation_duration ags_tactable_change_wave_duration ags_tactable_change_midi_duration ags_tactable_change_bpm ags_tactable_change_tact AGS_IS_TACTABLE AGS_IS_TACTABLE_INTERFACE AGS_TACTABLE AGS_TACTABLE_GET_INTERFACE AGS_TACTABLE_INTERFACE AGS_TYPE_TACTABLE AgsTactable AgsTactableInterface ags_tactable_get_type
ags_task AgsTask AGS_TASK_GET_OBJ_MUTEX AgsTaskFlags ags_task_test_flags ags_task_set_flags ags_task_unset_flags ags_task_launch ags_task_failure ags_task_new AGS_IS_TASK AGS_TASK AGS_TASK_CLASS AGS_TASK_GET_CLASS AGS_TYPE_TASK AgsTask AgsTaskClass ags_task_get_type
ags_task_completion AgsTaskCompletion AGS_TASK_COMPLETION_GET_OBJ_MUTEX AgsTaskCompletionFlags ags_task_completion_test_flags ags_task_completion_set_flags ags_task_completion_unset_flags ags_task_completion_complete ags_task_completion_new AGS_IS_TASK_COMPLETION AGS_TASK_COMPLETION AGS_TASK_COMPLETION_CLASS AGS_TASK_COMPLETION_GET_CLASS AGS_TYPE_TASK_COMPLETION AgsTaskCompletion AgsTaskCompletionClass ags_task_completion_get_type
ags_task_launcher AgsTaskLauncher AGS_TASK_LAUNCHER_GET_OBJ_MUTEX AgsTaskLauncherFlags ags_task_launcher_test_flags ags_task_launcher_set_flags ags_task_launcher_unset_flags ags_task_launcher_attach ags_task_launcher_add_task ags_task_launcher_add_task_all ags_task_launcher_add_cyclic_task ags_task_launcher_remove_cyclic_task ags_task_launcher_run ags_task_launcher_sync_run ags_task_launcher_new AGS_IS_TASK_LAUNCHER AGS_TASK_LAUNCHER AGS_TASK_LAUNCHER_CLASS AGS_TASK_LAUNCHER_GET_CLASS AGS_TYPE_TASK_LAUNCHER AgsTaskLauncher AgsTaskLauncherClass ags_task_launcher_get_type
ags_thread AgsThread AGS_THREAD_GET_OBJ_MUTEX AGS_THREAD_GET_WAIT_MUTEX AGS_THREAD_GET_WAIT_COND AGS_THREAD_GET_TIC_MUTEX AGS_THREAD_GET_TIC_COND AGS_THREAD_GET_START_MUTEX AGS_THREAD_GET_START_COND AGS_THREAD_HERTZ_JIFFIE AGS_THREAD_YIELD_JIFFIE AGS_THREAD_DEFAULT_JIFFIE AGS_THREAD_DEFAULT_MAX_PRECISION AGS_THREAD_MAX_PRECISION AGS_THREAD_DEFAULT_ATTACK AGS_THREAD_TOLERANCE AgsThreadFlags AgsThreadStatusFlags AgsThreadSyncTicFlags ags_thread_global_get_use_sync_counter ags_thread_test_flags ags_thread_set_flags ags_thread_unset_flags ags_thread_test_status_flags ags_thread_set_status_flags ags_thread_unset_status_flags ags_thread_clear_status_flags ags_thread_test_sync_tic_flags ags_thread_set_sync_tic_flags ags_thread_unset_sync_tic_flags ags_thread_clear_sync_tic_flags ags_thread_set_current_sync_tic ags_thread_get_current_sync_tic ags_thread_set_delay ags_thread_get_delay ags_thread_set_frequency ags_thread_get_frequency ags_thread_set_max_precision ags_thread_get_max_precision ags_thread_find_type ags_thread_self ags_thread_parent ags_thread_next ags_thread_prev ags_thread_children ags_thread_get_toplevel ags_thread_first ags_thread_last ags_thread_lock ags_thread_trylock ags_thread_unlock ags_thread_remove_child ags_thread_add_child ags_thread_add_child_extended ags_thread_is_current_ready ags_thread_is_tree_ready_recursive ags_thread_prepare_current_sync ags_thread_prepare_tree_sync_recursive ags_thread_set_current_sync ags_thread_set_tree_sync_recursive ags_thread_clock ags_thread_add_start_queue ags_thread_add_start_queue_all ags_thread_start ags_thread_run ags_thread_stop ags_thread_new AGS_IS_THREAD AGS_THREAD AGS_THREAD_CLASS AGS_THREAD_GET_CLASS AGS_TYPE_THREAD AgsThread AgsThreadClass ags_thread_get_type
ags_thread_application_context AgsThreadApplicationContext AGS_THREAD_DEFAULT_VERSION AGS_THREAD_BUILD_ID AgsThreadApplicationContextFlags ags_thread_application_context_register_types ags_thread_application_context_new AGS_IS_THREAD_APPLICATION_CONTEXT AGS_THREAD_APPLICATION_CONTEXT AGS_THREAD_APPLICATION_CONTEXT_CLASS AGS_THREAD_APPLICATION_CONTEXT_GET_CLASS AGS_TYPE_THREAD_APPLICATION_CONTEXT AgsThreadApplicationContext AgsThreadApplicationContextClass ags_thread_application_context_get_type
ags_thread_pool AgsThreadPool AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS AGS_THREAD_POOL_DEFAULT_MAX_THREADS AgsThreadPoolFlags ags_thread_pool_pull ags_thread_pool_start ags_thread_pool_new AGS_IS_THREAD_POOL AGS_THREAD_POOL AGS_THREAD_POOL_CLASS AGS_THREAD_POOL_GET_CLASS AGS_TYPE_THREAD_POOL AgsThreadPool AgsThreadPoolClass ags_thread_pool_get_type
ags_time AGS_TIME_ZERO AGS_USEC_PER_SEC AGS_NSEC_PER_SEC ags_time_get_uptime_from_offset ags_time_timeout_expired
ags_timestamp AgsTimestamp AGS_TIMESTAMP_GET_OBJ_MUTEX AgsTimestampFlags ags_timestamp_test_flags ags_timestamp_set_flags ags_timestamp_unset_flags ags_timestamp_get_unix_time ags_timestamp_set_unix_time ags_timestamp_get_ags_offset ags_timestamp_set_ags_offset ags_timestamp_new AGS_IS_TIMESTAMP AGS_TIMESTAMP AGS_TIMESTAMP_CLASS AGS_TIMESTAMP_GET_CLASS AGS_TYPE_TIMESTAMP AgsTimestamp AgsTimestampClass ags_timestamp_get_type
ags_turtle AgsTurtle AGS_TURTLE_GET_OBJ_MUTEX AGS_TURTLE_DEFAULT_ENCODING AGS_TURTLE_DEFAULT_VERSION AgsTurtleFlags ags_turtle_read_iriref ags_turtle_read_pname_ns ags_turtle_read_pname_ln ags_turtle_read_blank_node_label ags_turtle_read_langtag ags_turtle_read_boolean ags_turtle_read_integer ags_turtle_read_decimal ags_turtle_read_double ags_turtle_read_exponent ags_turtle_read_string ags_turtle_read_string_literal_quote ags_turtle_read_string_literal_single_quote ags_turtle_read_string_literal_long_quote ags_turtle_read_string_literal_long_single_quote ags_turtle_read_uchar ags_turtle_read_echar ags_turtle_read_ws ags_turtle_read_anon ags_turtle_read_pn_chars_base ags_turtle_read_pn_chars_u ags_turtle_read_pn_chars ags_turtle_read_pn_prefix ags_turtle_read_pn_local ags_turtle_read_plx ags_turtle_read_percent ags_turtle_read_hex ags_turtle_read_pn_local_esc ags_turtle_find_xpath ags_turtle_find_xpath_with_context_node ags_turtle_string_convert ags_turtle_load ags_turtle_new AGS_IS_TURTLE AGS_TURTLE AGS_TURTLE_CLASS AGS_TURTLE_GET_CLASS AGS_TYPE_TURTLE AgsTurtle AgsTurtleClass ags_turtle_get_type
ags_turtle_manager AgsTurtleManager AGS_TURTLE_MANAGER_GET_OBJ_MUTEX ags_turtle_manager_find ags_turtle_manager_add ags_turtle_manager_get_instance ags_turtle_manager_new AGS_IS_TURTLE_MANAGER AGS_TURTLE_MANAGER AGS_TURTLE_MANAGER_CLASS AGS_TURTLE_MANAGER_GET_CLASS AGS_TYPE_TURTLE_MANAGER AgsTurtleManager AgsTurtleManagerClass ags_turtle_manager_get_type
ags_uuid AGS_UUID_DEFAULT_LENGTH AGS_UUID_STRING_DEFAULT_LENGTH ags_uuid_alloc ags_uuid_copy ags_uuid_free ags_uuid_generate ags_uuid_compare ags_uuid_to_string ags_uuid_from_string AGS_TYPE_UUID AgsUUID ags_uuid_get_type
ags_worker_thread AgsWorkerThread AGS_WORKER_THREAD_DEFAULT_JIFFIE AgsWorkerThreadStatusFlags ags_worker_thread_test_status_flags ags_worker_thread_set_status_flags ags_worker_thread_unset_status_flags ags_woker_thread_do_poll_loop ags_worker_thread_do_poll ags_worker_thread_new AGS_IS_WORKER_THREAD AGS_TYPE_WORKER_THREAD AGS_WORKER_THREAD AGS_WORKER_THREAD_CLASS AGS_WORKER_THREAD_GET_CLASS AgsWorkerThread AgsWorkerThreadClass ags_worker_thread_get_type
ags_xml_authentication AgsXmlAuthentication AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX ags_xml_authentication_open_filename ags_xml_authentication_find_user_uuid ags_xml_authentication_new AGS_IS_XML_AUTHENTICATION AGS_TYPE_XML_AUTHENTICATION AGS_XML_AUTHENTICATION AGS_XML_AUTHENTICATION_CLASS AGS_XML_AUTHENTICATION_GET_CLASS AgsXmlAuthentication AgsXmlAuthenticationClass ags_xml_authentication_get_type
ags_xml_business_group AgsXmlBusinessGroup AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX ags_xml_business_group_open_filename ags_xml_business_group_new AGS_IS_XML_BUSINESS_GROUP AGS_TYPE_XML_BUSINESS_GROUP AGS_XML_BUSINESS_GROUP AGS_XML_BUSINESS_GROUP_CLASS AGS_XML_BUSINESS_GROUP_GET_CLASS AgsXmlBusinessGroup AgsXmlBusinessGroupClass ags_xml_business_group_get_type
ags_xml_certificate AgsXmlCertificate AGS_XML_CERTIFICATE_GET_OBJ_MUTEX ags_xml_certificate_open_filename ags_xml_certificate_new AGS_IS_XML_CERTIFICATE AGS_TYPE_XML_CERTIFICATE AGS_XML_CERTIFICATE AGS_XML_CERTIFICATE_CLASS AGS_XML_CERTIFICATE_GET_CLASS AgsXmlCertificate AgsXmlCertificateClass ags_xml_certificate_get_type
ags_xml_password_store AgsXmlPasswordStore AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX ags_xml_password_store_open_filename ags_xml_password_store_find_login ags_xml_password_store_new AGS_IS_XML_PASSWORD_STORE AGS_TYPE_XML_PASSWORD_STORE AGS_XML_PASSWORD_STORE AGS_XML_PASSWORD_STORE_CLASS AGS_XML_PASSWORD_STORE_GET_CLASS AgsXmlPasswordStore AgsXmlPasswordStoreClass ags_xml_password_store_get_type
gsequencer-3.1.3/docs/reference/libags/libags.interfaces.in0000644000175000017500000000256613607210263020653 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . AgsApplicationContext AgsConnectable AgsServerApplicationContext AgsConnectable AgsConcurrencyProvider AgsServiceProvider AgsThreadApplicationContext AgsConnectable AgsConcurrencyProvider AgsThread AgsConnectable AgsWorkerThread AgsConnectable AgsDestroyWorker AgsConnectable AgsGenericMainLoop AgsConnectable AgsMainLoop AgsReturnableThread AgsConnectable AgsFileLink AgsPlugin AgsRegistry AgsConnectable AgsServerStatus AgsConnectable AgsTaskCompletion AgsConnectable AgsTaskLauncher AgsConnectable AgsXmlAuthentication AgsAuthentication AgsXmlBusinessGroup AgsBusinessGroup AgsXmlCertificate AgsCertificate AgsXmlPasswordStore AgsPasswordStore gsequencer-3.1.3/docs/reference/libags/libags.xml0000644000175000017500000001435613613101164016717 00000000000000 %gtkdocentities; ]> Advanced Gtk+ Sequencer Reference Manual for libags. The latest version of this documentation can be found on-line at http://nongnu.org/gsequencer/api/&package_version;/libags/. Library - Completion routines Util - Helper functions Object - Interfaces and marshallers XML Input/Output - Persist project Thread - Multi-threaded tree XML-RPC - server Controller - providing context path Security - basic authentication API Index Index of deprecated API gsequencer-3.1.3/docs/reference/libags/README0000644000175000017500000000023413607210263015606 00000000000000Third-party files of gtk-doc licensed under the terms of GNU GPLv3+, copyright provided by Stefan Sauer * Makefile.am (Copyright (C) Stefan Sauer, GPLv3+) gsequencer-3.1.3/docs/reference/libags/Makefile.in0000644000175000017500000013035213622252207017001 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/reference/libags ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/./gtk-doc.make $(srcdir)/Makefile.in \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # The name of the module, e.g. 'glib'. DOC_MODULE = libags # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE = $(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR = $(top_srcdir)/ags/util $(top_srcdir)/ags/lib $(top_srcdir)/ags/object $(top_srcdir)/ags/file $(top_srcdir)/ags/thread $(top_srcdir)/ags/server # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS = --cflags="$(CFLAGS) $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(OPENSSL_CFLAGS) $(XMLRPC_CFLAGS) $(XMLRPC_UTIL_CFLAGS) $(XMLRPC_SERVER_ABYSS_CFLAGS) $(XMLRPC_SERVER_CGI_CFLAGS) $(XMLRPC_SERVER_CFLAGS) $(GOBJECT_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(UUID_LIBS) $(LIBXML2_LIBS) $(OPENSSL_LIBS) $(XMLRPC_LIBS) $(XMLRPC_UTIL_LIBS) $(XMLRPC_SERVER_ABYSS_LIBS) $(XMLRPC_SERVER_CGI_LIBS) $(XMLRPC_SERVER_LIBS) $(GOBJECT_LIBS) -L$(top_builddir) $(top_builddir)/libags.la $(top_builddir)/libags_thread.la $(top_builddir)/libags_server.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS = --xml-mode --output-format=xml --name-space=libags --module=libags # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS = # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS = --module=libags --module-dir=./libags-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libags-doc/api # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB = CFILE_GLOB = # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES = # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES = # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES = # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files = # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files = AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS = $(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags.la \ $(top_builddir)/libags_thread.la \ $(top_builddir)/libags_server.la @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) @GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = @GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test @GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp #### setup #### GTK_DOC_V_SETUP = $(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_ = $(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0 = @echo " DOC Preparing build"; #### scan #### GTK_DOC_V_SCAN = $(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_ = $(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0 = @echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT = $(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_ = $(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0 = @echo " DOC Introspecting gobjects"; #### xml #### GTK_DOC_V_XML = $(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_ = $(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0 = @echo " DOC Building XML"; #### html #### GTK_DOC_V_HTML = $(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_ = $(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0 = @echo " DOC Building HTML"; GTK_DOC_V_XREF = $(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_ = $(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0 = @echo " DOC Fixing cross-references"; #### pdf #### GTK_DOC_V_PDF = $(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_ = $(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0 = @echo " DOC Building PDF"; # This includes the standard gtk-doc make rules, copied by gtkdocize. # Comment this out if you want 'make check' to test you doc status # and run some sanity checks @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = \ @ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ @ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) @ENABLE_GTK_DOC_TRUE@TESTS = $(GTKDOC_CHECK) all: all-am .SUFFIXES: .SUFFIXES: .log .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/./gtk-doc.make $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/reference/libags/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/libags/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/./gtk-doc.make $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ags-docs-local: tags TAGS: ctags CTAGS: cscope cscopelist: # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am @ENABLE_GTK_DOC_FALSE@all-local: all-am: Makefile all-local installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-am ags-docs-am: ags-docs-local clean: clean-am clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic \ maintainer-clean-local mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-local .MAKE: check-am install-am install-strip .PHONY: ags-docs-am ags-docs-local all all-am all-local check \ check-TESTS check-am clean clean-generic clean-libtool \ clean-local cscopelist-am ctags-am dist-hook distclean \ distclean-generic distclean-libtool distclean-local distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-local install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic \ maintainer-clean-local mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ uninstall uninstall-am uninstall-local .PRECIOUS: Makefile gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc @ENABLE_GTK_DOC_TRUE@all-local: all-gtk-doc docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libags-html && mkdir libags-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libags-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libags-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libags-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libags-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libags-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libags-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libags-html install-data-local: @installfiles=`echo $(builddir)/libags-html/*`; \ if test "$$installfiles" = '$(builddir)/libags-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # @HAVE_GTK_DOC_TRUE@dist-check-gtkdoc: docs @HAVE_GTK_DOC_FALSE@dist-check-gtkdoc: @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc is needed to run 'make dist'. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** gtk-doc was not found when 'configure' ran. ***" @HAVE_GTK_DOC_FALSE@ @echo "*** please install gtk-doc and rerun 'configure'. ***" @HAVE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libags-html @cp ./libags-html/* $(distdir)/libags-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libags-html .PHONY : dist-hook-local docs -include $(top_srcdir)/git.mk # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/docs/reference/libags/libags-overrides.txt0000644000175000017500000000000013461636435020732 00000000000000gsequencer-3.1.3/docs/reference/libags/gtk-doc.make0000644000175000017500000002540713521306053017124 00000000000000# -*- mode: makefile -*- # # gtk-doc.make - make rules for gtk-doc # Copyright (C) 2003 James Henstridge # 2004-2007 Damon Chaplin # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #################################### # Everything below here is generic # #################################### if GTK_DOC_USE_LIBTOOL GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = $(LIBTOOL) --mode=execute else GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) GTKDOC_RUN = endif # We set GPATH here; this gives us semantics for GNU make # which are more like other make's VPATH, when it comes to # whether a source that is a target of one rule is then # searched for in VPATH/GPATH. # GPATH = $(srcdir) TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) SETUP_FILES = \ $(content_files) \ $(expand_content_files) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt EXTRA_DIST = \ $(HTML_IMAGES) \ $(SETUP_FILES) DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \ html-build.stamp pdf-build.stamp \ sgml.stamp html.stamp pdf.stamp SCANOBJ_FILES = \ $(DOC_MODULE).args \ $(DOC_MODULE).hierarchy \ $(DOC_MODULE).interfaces \ $(DOC_MODULE).prerequisites \ $(DOC_MODULE).signals REPORT_FILES = \ $(DOC_MODULE)-undocumented.txt \ $(DOC_MODULE)-undeclared.txt \ $(DOC_MODULE)-unused.txt gtkdoc-check.test: Makefile $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ chmod +x $@ CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test if GTK_DOC_BUILD_HTML HTML_BUILD_STAMP=html-build.stamp else HTML_BUILD_STAMP= endif if GTK_DOC_BUILD_PDF PDF_BUILD_STAMP=pdf-build.stamp else PDF_BUILD_STAMP= endif all-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) .PHONY: all-gtk-doc if ENABLE_GTK_DOC all-local: all-gtk-doc endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; setup-build.stamp: -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ files=`echo $(SETUP_FILES) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ destdir=`dirname $(abs_builddir)/$$file`; \ test -d "$$destdir" || mkdir -p "$$destdir"; \ test -f $(abs_srcdir)/$$file && \ cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ done; \ fi; \ fi $(AM_V_at)touch setup-build.stamp #### scan #### GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) $(GTK_DOC_V_SCAN)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ scanobj_options=""; \ gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ scanobj_options="--verbose"; \ fi; \ fi; \ CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ else \ for i in $(SCANOBJ_FILES) ; do \ test -f $$i || touch $$i ; \ done \ fi $(AM_V_at)touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XML_0=@echo " DOC Building XML"; sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent $(GTK_DOC_V_XML)_source_dir='' ; \ for i in $(DOC_SOURCE_DIR) ; do \ _source_dir="$${_source_dir} --source-dir=$$i" ; \ done ; \ gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) $(AM_V_at)touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true xml/gtkdocentities.ent: Makefile $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ echo ""; \ ) > $@ #### html #### GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_HTML)rm -rf libags-html && mkdir libags-html && \ mkhtml_options=""; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkhtml_options="$$mkhtml_options --verbose"; \ fi; \ fi; \ gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ if test "$$?" = "0"; then \ mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ fi; \ cd libags-html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) -@test "x$(HTML_IMAGES)" = "x" || \ for file in $(HTML_IMAGES) ; do \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/libags-html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/libags-html; \ fi; \ test -f $$file && cp $$file $(abs_builddir)/libags-html; \ done; $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=libags-html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) $(AM_V_at)touch html-build.stamp #### pdf #### GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) $(expand_content_files) $(GTK_DOC_V_PDF)rm -f $(DOC_MODULE).pdf && \ mkpdf_options=""; \ gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ if test "$$?" = "0"; then \ if test "x$(V)" = "x1"; then \ mkpdf_options="$$mkpdf_options --verbose"; \ fi; \ fi; \ if test "x$(HTML_IMAGES)" != "x"; then \ for img in $(HTML_IMAGES); do \ part=`dirname $$img`; \ echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ if test $$? != 0; then \ mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ fi; \ done; \ fi; \ gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) $(AM_V_at)touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ rm -f $(DOC_MODULE).types; \ fi @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ rm -f $(DOC_MODULE)-sections.txt; \ fi distclean-local: @rm -rf xml libags-html $(REPORT_FILES) $(DOC_MODULE).pdf \ $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ rm -f $(SETUP_FILES) $(DOC_MODULE).types; \ fi maintainer-clean-local: @rm -rf xml libags-html install-data-local: @installfiles=`echo $(builddir)/libags-html/*`; \ if test "$$installfiles" = '$(builddir)/libags-html/*'; \ then echo 1>&2 'Nothing to install' ; \ else \ if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ $(mkinstalldirs) $${installdir} ; \ for i in $$installfiles; do \ echo ' $(INSTALL_DATA) '$$i ; \ $(INSTALL_DATA) $$i $${installdir}; \ done; \ if test -n "$(DOC_MODULE_VERSION)"; then \ mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ fi; \ $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ fi uninstall-local: @if test -n "$(DOC_MODULE_VERSION)"; then \ installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ else \ installdir="$(DESTDIR)$(TARGET_DIR)"; \ fi; \ rm -rf $${installdir} # # Require gtk-doc when making dist # if HAVE_GTK_DOC dist-check-gtkdoc: docs else dist-check-gtkdoc: @echo "*** gtk-doc is needed to run 'make dist'. ***" @echo "*** gtk-doc was not found when 'configure' ran. ***" @echo "*** please install gtk-doc and rerun 'configure'. ***" @false endif dist-hook: dist-check-gtkdoc all-gtk-doc dist-hook-local @mkdir $(distdir)/libags-html @cp ./libags-html/* $(distdir)/libags-html @-cp ./$(DOC_MODULE).pdf $(distdir)/ @-cp ./$(DOC_MODULE).types $(distdir)/ @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ @cd $(distdir) && rm -f $(DISTCLEANFILES) @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/libags-html .PHONY : dist-hook-local docs gsequencer-3.1.3/docs/reference/libags/libags.types.in0000644000175000017500000000473313607210263017672 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_applicable_get_type ags_application_context_get_type ags_auth_security_context_get_type ags_authentication_get_type ags_authentication_manager_get_type ags_business_group_get_type ags_business_group_manager_get_type ags_certificate_get_type ags_certificate_manager_get_type ags_complex_get_type ags_concurrency_provider_get_type ags_config_get_type ags_connectable_get_type ags_controller_get_type ags_conversion_get_type ags_countable_get_type ags_cursor_get_type ags_destroy_worker_get_type ags_file_get_type ags_file_id_ref_get_type ags_file_launch_get_type ags_file_link_get_type ags_file_lookup_get_type ags_front_controller_get_type ags_function_get_type ags_generic_main_loop_get_type ags_log_get_type ags_main_loop_get_type ags_message_delivery_get_type ags_message_envelope_get_type ags_message_queue_get_type ags_mutable_get_type ags_password_store_get_type ags_password_store_manager_get_type ags_plugin_controller_get_type ags_plugin_get_type ags_portlet_get_type ags_priority_get_type ags_registry_get_type ags_returnable_thread_get_type ags_security_context_get_type ags_seekable_get_type ags_sequencer_get_type ags_server_application_context_get_type ags_server_get_type ags_server_status_get_type ags_service_provider_get_type ags_solver_matrix_get_type ags_solver_vector_get_type ags_sound_server_get_type ags_soundcard_get_type ags_tactable_get_type ags_task_completion_get_type ags_task_get_type ags_task_launcher_get_type ags_thread_application_context_get_type ags_thread_get_type ags_thread_pool_get_type ags_timestamp_get_type ags_turtle_get_type ags_turtle_manager_get_type ags_uuid_get_type ags_worker_thread_get_type ags_xml_authentication_get_type ags_xml_business_group_get_type ags_xml_certificate_get_type ags_xml_password_store_get_type gsequencer-3.1.3/docs/reference/libags/git.mk0000644000175000017500000002441413461636435016063 00000000000000# git.mk # # Copyright 2009, Red Hat, Inc. # Copyright 2010,2011,2012,2013 Behdad Esfahbod # Written by Behdad Esfahbod # # Copying and distribution of this file, with or without modification, # is permitted in any medium without royalty provided the copyright # notice and this notice are preserved. # # The latest version of this file can be downloaded from: # https://raw.github.com/behdad/git.mk/master/git.mk # Bugs, etc, should be reported upstream at: # https://github.com/behdad/git.mk # # To use in your project, import this file in your git repo's toplevel, # then do "make -f git.mk". This modifies all Makefile.am files in # your project to -include git.mk. Remember to add that line to new # Makefile.am files you create in your project, or just rerun the # "make -f git.mk". # # This enables automatic .gitignore generation. If you need to ignore # more files, add them to the GITIGNOREFILES variable in your Makefile.am. # But think twice before doing that. If a file has to be in .gitignore, # chances are very high that it's a generated file and should be in one # of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES. # # The only case that you need to manually add a file to GITIGNOREFILES is # when remove files in one of mostlyclean-local, clean-local, distclean-local, # or maintainer-clean-local make targets. # # Note that for files like editor backup, etc, there are better places to # ignore them. See "man gitignore". # # If "make maintainer-clean" removes the files but they are not recognized # by this script (that is, if "git status" shows untracked files still), send # me the output of "git status" as well as your Makefile.am and Makefile for # the directories involved and I'll diagnose. # # For a list of toplevel files that should be in MAINTAINERCLEANFILES, see # Makefile.am.sample in the git.mk git repo. # # Don't EXTRA_DIST this file. It is supposed to only live in git clones, # not tarballs. It serves no useful purpose in tarballs and clutters the # build dir. # # This file knows how to handle autoconf, automake, libtool, gtk-doc, # gnome-doc-utils, yelp.m4, mallard, intltool, gsettings, dejagnu, appdata, # appstream. # # This makefile provides the following targets: # # - all: "make all" will build all gitignore files. # - gitignore: makes all gitignore files in the current dir and subdirs. # - .gitignore: make gitignore file for the current dir. # - gitignore-recurse: makes all gitignore files in the subdirs. # # KNOWN ISSUES: # # - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the # submodule doesn't find us. If you have configure.{in,ac} files in # subdirs, add a proxy git.mk file in those dirs that simply does: # "include $(top_srcdir)/../git.mk". Add more ..'s to your taste. # And add those files to git. See vte/gnome-pty-helper/git.mk for # example. # ############################################################################### # Variables user modules may want to add to toplevel MAINTAINERCLEANFILES: ############################################################################### # # Most autotools-using modules should be fine including this variable in their # toplevel MAINTAINERCLEANFILES: GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL = \ $(srcdir)/aclocal.m4 \ $(srcdir)/autoscan.log \ $(srcdir)/configure.scan \ `AUX_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_AUX_DIR:$$1' ./configure.ac); \ test "x$$AUX_DIR" = "x$(srcdir)/" && AUX_DIR=$(srcdir); \ for x in \ ar-lib \ compile \ config.guess \ config.sub \ depcomp \ install-sh \ ltmain.sh \ missing \ mkinstalldirs \ test-driver \ ylwrap \ ; do echo "$$AUX_DIR/$$x"; done` \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_HEADERS:$$1' ./configure.ac | \ head -n 1 | while read f; do echo "$(srcdir)/$$f.in"; done` # # All modules should also be fine including the following variable, which # removes automake-generated Makefile.in files: GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN = \ `cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_FILES:$$1' ./configure.ac | \ while read f; do \ case $$f in Makefile|*/Makefile) \ test -f "$(srcdir)/$$f.am" && echo "$(srcdir)/$$f.in";; esac; \ done` # # Modules that use libtool and use AC_CONFIG_MACRO_DIR() may also include this, # though it's harmless to include regardless. GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL = \ `MACRO_DIR=$(srcdir)/$$(cd $(top_srcdir); $(AUTOCONF) --trace 'AC_CONFIG_MACRO_DIR:$$1' ./configure.ac); \ if test "x$$MACRO_DIR" != "x$(srcdir)/"; then \ for x in \ libtool.m4 \ ltoptions.m4 \ ltsugar.m4 \ ltversion.m4 \ lt~obsolete.m4 \ ; do echo "$$MACRO_DIR/$$x"; done; \ fi` ############################################################################### # Default rule is to install ourselves in all Makefile.am files: ############################################################################### git-all: git-mk-install git-mk-install: @echo "Installing git makefile" @any_failed=; \ find "`test -z "$(top_srcdir)" && echo . || echo "$(top_srcdir)"`" -name Makefile.am | while read x; do \ if grep 'include .*/git.mk' $$x >/dev/null; then \ echo "$$x already includes git.mk"; \ else \ failed=; \ echo "Updating $$x"; \ { cat $$x; \ echo ''; \ echo '-include $$(top_srcdir)/git.mk'; \ } > $$x.tmp || failed=1; \ if test x$$failed = x; then \ mv $$x.tmp $$x || failed=1; \ fi; \ if test x$$failed = x; then : else \ echo "Failed updating $$x"; >&2 \ any_failed=1; \ fi; \ fi; done; test -z "$$any_failed" .PHONY: git-all git-mk-install ############################################################################### # Actual .gitignore generation: ############################################################################### $(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk @echo "git.mk: Generating $@" @{ \ if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \ for x in \ $(DOC_MODULE)-decl-list.txt \ $(DOC_MODULE)-decl.txt \ tmpl/$(DOC_MODULE)-unused.sgml \ "tmpl/*.bak" \ xml html \ ; do echo "/$$x"; done; \ FLAVOR=$$(cd $(top_srcdir); $(AUTOCONF) --trace 'GTK_DOC_CHECK:$$2' ./configure.ac); \ case $$FLAVOR in *no-tmpl*) echo /tmpl;; esac; \ fi; \ if test "x$(DOC_MODULE)$(DOC_ID)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \ for lc in $(DOC_LINGUAS); do \ for x in \ $(if $(DOC_MODULE),$(DOC_MODULE).xml) \ $(DOC_PAGES) \ $(DOC_INCLUDES) \ ; do echo "/$$lc/$$x"; done; \ done; \ for x in \ $(_DOC_OMF_ALL) \ $(_DOC_DSK_ALL) \ $(_DOC_HTML_ALL) \ $(_DOC_MOFILES) \ $(DOC_H_FILE) \ "*/.xml2po.mo" \ "*/*.omf.out" \ ; do echo /$$x; done; \ fi; \ if test "x$(HELP_ID)" = x -o "x$(HELP_LINGUAS)" = x; then :; else \ for lc in $(HELP_LINGUAS); do \ for x in \ $(HELP_FILES) \ "$$lc.stamp" \ "$$lc.mo" \ ; do echo "/$$lc/$$x"; done; \ done; \ fi; \ if test "x$(gsettings_SCHEMAS)" = x; then :; else \ for x in \ $(gsettings_SCHEMAS:.xml=.valid) \ $(gsettings__enum_file) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appdata_XML)" = x; then :; else \ for x in \ $(appdata_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test "x$(appstream_XML)" = x; then :; else \ for x in \ $(appstream_XML:.xml=.valid) \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/po/Makefile.in.in; then \ for x in \ po/Makefile.in.in \ po/Makefile.in.in~ \ po/Makefile.in \ po/Makefile \ po/Makevars.template \ po/POTFILES \ po/Rules-quot \ po/stamp-it \ po/.intltool-merge-cache \ "po/*.gmo" \ "po/*.header" \ "po/*.mo" \ "po/*.sed" \ "po/*.sin" \ po/$(GETTEXT_PACKAGE).pot \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ ; do echo "/$$x"; done; \ fi; \ if test -f $(srcdir)/configure; then \ for x in \ autom4te.cache \ configure \ config.h \ stamp-h1 \ libtool \ config.lt \ ; do echo "/$$x"; done; \ fi; \ if test "x$(DEJATOOL)" = x; then :; else \ for x in \ $(DEJATOOL) \ ; do echo "/$$x.sum"; echo "/$$x.log"; done; \ echo /site.exp; \ fi; \ if test "x$(am__dirstamp)" = x; then :; else \ echo "$(am__dirstamp)"; \ fi; \ if test "x$(LTCOMPILE)" = x -a "x$(LTCXXCOMPILE)" = x -a "x$(GTKDOC_RUN)" = x; then :; else \ for x in \ "*.lo" \ ".libs" "_libs" \ ; do echo "$$x"; done; \ fi; \ for x in \ .gitignore \ $(GITIGNOREFILES) \ $(CLEANFILES) \ $(PROGRAMS) $(check_PROGRAMS) $(EXTRA_PROGRAMS) \ $(LIBRARIES) $(check_LIBRARIES) $(EXTRA_LIBRARIES) \ $(LTLIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LTLIBRARIES) \ so_locations \ $(MOSTLYCLEANFILES) \ $(TEST_LOGS) \ $(TEST_LOGS:.log=.trs) \ $(TEST_SUITE_LOG) \ "*.gcda" \ "*.gcno" \ $(DISTCLEANFILES) \ $(am__CONFIG_DISTCLEAN_FILES) \ $(CONFIG_CLEAN_FILES) \ TAGS ID GTAGS GRTAGS GSYMS GPATH tags \ "*.tab.c" \ $(MAINTAINERCLEANFILES) \ $(BUILT_SOURCES) \ $(patsubst %.vala,%.c,$(filter %.vala,$(SOURCES))) \ $(filter %_vala.stamp,$(DIST_COMMON)) \ $(filter %.vapi,$(DIST_COMMON)) \ $(filter $(addprefix %,$(notdir $(patsubst %.vapi,%.h,$(filter %.vapi,$(DIST_COMMON))))),$(DIST_COMMON)) \ Makefile \ Makefile.in \ "*.orig" \ "*.rej" \ "*.bak" \ "*~" \ ".*.sw[nop]" \ ".dirstamp" \ ; do echo "/$$x"; done; \ for x in \ "*.$(OBJEXT)" \ $(DEPDIR) \ ; do echo "$$x"; done; \ } | \ sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \ sed 's@/[.]/@/@g' | \ LC_ALL=C sort | uniq > $@.tmp && \ mv $@.tmp $@; all: $(srcdir)/.gitignore gitignore-recurse-maybe gitignore: $(srcdir)/.gitignore gitignore-recurse gitignore-recurse-maybe: @for subdir in $(DIST_SUBDIRS); do \ case " $(SUBDIRS) " in \ *" $$subdir "*) :;; \ *) test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir");; \ esac; \ done gitignore-recurse: @for subdir in $(DIST_SUBDIRS); do \ test "$$subdir" = . -o -e "$$subdir/.git" || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) gitignore || echo "Skipping $$subdir"); \ done maintainer-clean: gitignore-clean gitignore-clean: -rm -f $(srcdir)/.gitignore .PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe gsequencer-3.1.3/docs/reference/libags/Makefile.am0000644000175000017500000000747413606450516017005 00000000000000# This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=libags # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level XML file. DOC_MAIN_SGML_FILE=$(DOC_MODULE).xml # Directories containing the source code. # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. # e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk DOC_SOURCE_DIR=$(top_srcdir)/ags/util $(top_srcdir)/ags/lib $(top_srcdir)/ags/object $(top_srcdir)/ags/file $(top_srcdir)/ags/thread $(top_srcdir)/ags/server # Extra options to pass to gtkdoc-scangobj. Normally not needed. SCANGOBJ_OPTIONS=--cflags="$(CFLAGS) $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(OPENSSL_CFLAGS) $(XMLRPC_CFLAGS) $(XMLRPC_UTIL_CFLAGS) $(XMLRPC_SERVER_ABYSS_CFLAGS) $(XMLRPC_SERVER_CGI_CFLAGS) $(XMLRPC_SERVER_CFLAGS) $(GOBJECT_CFLAGS)" --ldflags="-static -ldl -lm -lrt -pthread $(LDFLAGS) $(UUID_LIBS) $(LIBXML2_LIBS) $(OPENSSL_LIBS) $(XMLRPC_LIBS) $(XMLRPC_UTIL_LIBS) $(XMLRPC_SERVER_ABYSS_LIBS) $(XMLRPC_SERVER_CGI_LIBS) $(XMLRPC_SERVER_LIBS) $(GOBJECT_LIBS) -L$(top_builddir) $(top_builddir)/libags.la $(top_builddir)/libags_thread.la $(top_builddir)/libags_server.la" # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" # SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml --name-space=libags --module=libags # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Normally not needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS=--module=libags --module-dir=./libags-html/ --html-dir=$(DESTDIR)/$(datadir)/doc/libags-doc/api # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB= CFILE_GLOB= # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES= # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.xml building.xml changes-2.0.xml content_files= # Files where gtk-doc abbrevations (#GtkWidget) are expanded # e.g. expand_content_files=running.xml expand_content_files= AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=$(gsequencer_CFLAGS) -DGTK_IS_WIDGET_CLASS=1 GTKDOC_LIBS = \ $(top_builddir)/libags.la \ $(top_builddir)/libags_thread.la \ $(top_builddir)/libags_server.la # This includes the standard gtk-doc make rules, copied by gtkdocize. include ./gtk-doc.make # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk gsequencer-3.1.3/docs/reference/libags/libags-sections.txt.in0000644000175000017500000013235513607210263021174 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see .
ags_applicable AgsApplicable ags_applicable_set_update ags_applicable_apply ags_applicable_reset AGS_APPLICABLE AGS_APPLICABLE_GET_INTERFACE AGS_APPLICABLE_INTERFACE AGS_IS_APPLICABLE AGS_IS_APPLICABLE_INTERFACE AGS_TYPE_APPLICABLE AgsApplicable AgsApplicableInterface ags_applicable_get_type
ags_application_context AgsApplicationContext AGS_APPLICATION_CONTEXT_GET_OBJ_MUTEX AGS_VERSION AGS_BUILD_ID AGS_DEFAULT_DIRECTORY AGS_DEFAULT_CONFIG AgsApplicationContextFlags ags_application_context_test_flags ags_application_context_set_flags ags_application_context_unset_flags ags_application_context_load_config ags_application_context_prepare ags_application_context_setup ags_application_context_register_types ags_application_context_quit ags_application_context_get_instance ags_application_context_new AGS_APPLICATION_CONTEXT AGS_APPLICATION_CONTEXT_CLASS AGS_APPLICATION_CONTEXT_GET_CLASS AGS_IS_APPLICATION_CONTEXT AGS_TYPE_APPLICATION_CONTEXT AgsApplicationContext AgsApplicationContextClass ags_application_context_get_type
ags_auth_security_context AgsAuthSecurityContext AGS_AUTH_SECURITY_CONTEXT_GET_OBJ_MUTEX ags_auth_security_context_get_instance ags_auth_security_context_new AGS_AUTH_SECURITY_CONTEXT AGS_AUTH_SECURITY_CONTEXT_CLASS AGS_AUTH_SECURITY_CONTEXT_GET_CLASS AGS_IS_AUTH_SECURITY_CONTEXT AGS_TYPE_AUTH_SECURITY_CONTEXT AgsAuthSecurityContext AgsAuthSecurityContextClass ags_auth_security_context_get_type
ags_authentication AgsAuthentication ags_authentication_get_authentication_module ags_authentication_login ags_authentication_logout ags_authentication_generate_token ags_authentication_get_digest ags_authentication_is_session_active AGS_AUTHENTICATION AGS_AUTHENTICATION_GET_INTERFACE AGS_AUTHENTICATION_INTERFACE AGS_IS_AUTHENTICATION AGS_IS_AUTHENTICATION_INTERFACE AGS_TYPE_AUTHENTICATION AgsAuthentication AgsAuthenticationInterface ags_authentication_get_type
ags_authentication_manager AgsAuthenticationManager AGS_LOGIN_INFO AGS_AUTHENTICATION_MANAGER_GET_OBJ_MUTEX AGS_AUTHENTICATION_MANAGER_DEFAULT_SESSION_TIMEOUT AgsLoginInfo ags_login_info_alloc ags_login_info_free ags_login_info_ref ags_login_info_unref ags_authentication_manager_get_authentication ags_authentication_manager_add_authentication ags_authentication_manager_remove_authentication ags_authentication_manager_get_session_timeout ags_authentication_manager_lookup_login ags_authentication_manager_insert_login ags_authentication_manager_remove_login ags_authentication_manager_login ags_authentication_manager_logout ags_authentication_manager_get_digest ags_authentication_manager_is_session_active ags_authentication_manager_get_instance ags_authentication_manager_new AGS_AUTHENTICATION_MANAGER AGS_AUTHENTICATION_MANAGER_CLASS AGS_AUTHENTICATION_MANAGER_GET_CLASS AGS_IS_AUTHENTICATION_MANAGER AGS_TYPE_AUTHENTICATION_MANAGER AgsAuthenticationManager AgsAuthenticationManagerClass ags_authentication_manager_get_type
ags_buffer_util ags_buffer_util_s8_to_char_buffer ags_buffer_util_s16_to_char_buffer ags_buffer_util_s24_to_char_buffer ags_buffer_util_s32_to_char_buffer ags_buffer_util_s64_to_char_buffer ags_buffer_util_float_to_char_buffer ags_buffer_util_double_to_char_buffer ags_buffer_util_complex_to_char_buffer ags_buffer_util_char_buffer_to_s8 ags_buffer_util_char_buffer_to_s16 ags_buffer_util_char_buffer_to_s24 ags_buffer_util_char_buffer_to_s32 ags_buffer_util_char_buffer_to_s64 ags_buffer_util_char_buffer_to_float ags_buffer_util_char_buffer_to_double ags_buffer_util_char_buffer_to_complex ags_buffer_util_char_buffer_read_s8 ags_buffer_util_char_buffer_read_s16 ags_buffer_util_char_buffer_read_s24 ags_buffer_util_char_buffer_read_s32 ags_buffer_util_char_buffer_read_s64 ags_buffer_util_char_buffer_read_float ags_buffer_util_char_buffer_read_double ags_buffer_util_char_buffer_read_complex ags_buffer_util_char_buffer_write_s8 ags_buffer_util_char_buffer_write_s16 ags_buffer_util_char_buffer_write_s24 ags_buffer_util_char_buffer_write_s32 ags_buffer_util_char_buffer_write_s64 ags_buffer_util_char_buffer_write_float ags_buffer_util_char_buffer_write_double ags_buffer_util_char_buffer_write_complex ags_buffer_util_char_buffer_swap_bytes
ags_business_group AgsBusinessGroup ags_business_group_get_group_uuid ags_business_group_set_group_name ags_business_group_get_group_name ags_business_group_set_user ags_business_group_get_user AGS_BUSINESS_GROUP AGS_BUSINESS_GROUP_GET_INTERFACE AGS_BUSINESS_GROUP_INTERFACE AGS_IS_BUSINESS_GROUP AGS_IS_BUSINESS_GROUP_INTERFACE AGS_TYPE_BUSINESS_GROUP AgsBusinessGroup AgsBusinessGroupInterface ags_business_group_get_type
ags_business_group_manager AgsBusinessGroupManager AGS_BUSINESS_GROUP_MANAGER_GET_OBJ_MUTEX ags_business_group_manager_get_business_group ags_business_group_manager_add_business_group ags_business_group_manager_remove_business_group ags_business_group_manager_get_instance ags_business_group_manager_new AGS_BUSINESS_GROUP_MANAGER AGS_BUSINESS_GROUP_MANAGER_CLASS AGS_BUSINESS_GROUP_MANAGER_GET_CLASS AGS_IS_BUSINESS_GROUP_MANAGER AGS_TYPE_BUSINESS_GROUP_MANAGER AgsBusinessGroupManager AgsBusinessGroupManagerClass ags_business_group_manager_get_type
ags_certificate AgsCertificate ags_certificate_get_cert_uuid ags_certificate_set_domain ags_certificate_get_domain ags_certificate_set_key_type ags_certificate_get_key_type ags_certificate_set_public_key_file ags_certificate_get_public_key_file ags_certificate_set_private_key_file ags_certificate_get_private_key_file AGS_CERTIFICATE AGS_CERTIFICATE_GET_INTERFACE AGS_CERTIFICATE_INTERFACE AGS_IS_CERTIFICATE AGS_IS_CERTIFICATE_INTERFACE AGS_TYPE_CERTIFICATE AgsCertificate AgsCertificateInterface ags_certificate_get_type
ags_certificate_manager AgsCertificateManager AGS_CERTIFICATE_MANAGER_GET_OBJ_MUTEX ags_certificate_manager_get_certificate ags_certificate_manager_add_certificate ags_certificate_manager_remove_certificate ags_certificate_manager_get_key_file ags_certificate_manager_get_instance ags_certificate_manager_new AGS_CERTIFICATE_MANAGER AGS_CERTIFICATE_MANAGER_CLASS AGS_CERTIFICATE_MANAGER_GET_CLASS AGS_IS_CERTIFICATE_MANAGER AGS_TYPE_CERTIFICATE_MANAGER AgsCertificateManager AgsCertificateManagerClass ags_certificate_manager_get_type
ags_complex AGS_COMPLEX_M_E AGS_COMPLEX_M_PI ags_complex_alloc ags_complex_copy ags_complex_free ags_complex_get ags_complex_set AGS_TYPE_COMPLEX AgsComplex ags_complex_get_type
ags_concurrency_provider AgsConcurrencyProvider ags_concurrency_provider_get_main_loop ags_concurrency_provider_set_main_loop ags_concurrency_provider_get_task_launcher ags_concurrency_provider_set_task_launcher ags_concurrency_provider_get_thread_pool ags_concurrency_provider_set_thread_pool ags_concurrency_provider_get_worker ags_concurrency_provider_set_worker AGS_CONCURRENCY_PROVIDER AGS_CONCURRENCY_PROVIDER_GET_INTERFACE AGS_CONCURRENCY_PROVIDER_INTERFACE AGS_IS_CONCURRENCY_PROVIDER AGS_IS_CONCURRENCY_PROVIDER_INTERFACE AGS_TYPE_CONCURRENCY_PROVIDER AgsConcurrencyProvider AgsConcurrencyProviderInterface ags_concurrency_provider_get_type
ags_config AgsConfig AGS_CONFIG_GET_OBJ_MUTEX AGS_CONFIG_DEFAULT_VERSION AGS_CONFIG_DEFAULT_BUILD_ID AGS_CONFIG_GENERIC AGS_CONFIG_THREAD AGS_CONFIG_SERVER AGS_CONFIG_SOUNDCARD AGS_CONFIG_SOUNDCARD_0 AGS_CONFIG_SEQUENCER AGS_CONFIG_SEQUENCER_0 AGS_CONFIG_RECALL AGS_CONFIG_OSC_SERVER AGS_CONFIG_OSC_SERVER_0 ags_config_load_defaults ags_config_load_from_file ags_config_load_from_data ags_config_set_value ags_config_get_value ags_config_to_data ags_config_save ags_config_clear ags_config_get_instance ags_config_new AGS_CONFIG AGS_CONFIG_CLASS AGS_CONFIG_GET_CLASS AGS_IS_CONFIG AGS_TYPE_CONFIG AgsConfig AgsConfigClass ags_config_get_type
ags_connectable AgsConnectable ags_connectable_get_uuid ags_connectable_has_resource ags_connectable_is_ready ags_connectable_add_to_registry ags_connectable_remove_from_registry ags_connectable_list_resource ags_connectable_xml_compose ags_connectable_xml_parse ags_connectable_is_connected ags_connectable_connect ags_connectable_disconnect ags_connectable_connect_connection ags_connectable_disconnect_connection AGS_CONNECTABLE AGS_CONNECTABLE_GET_INTERFACE AGS_CONNECTABLE_INTERFACE AGS_IS_CONNECTABLE AGS_IS_CONNECTABLE_INTERFACE AGS_TYPE_CONNECTABLE AgsConnectable AgsConnectableInterface ags_connectable_get_type
ags_controller AgsController AGS_CONTROLLER_GET_OBJ_MUTEX AGS_CONTROLLER_BASE_PATH AgsControllerResource ags_controller_resource_alloc ags_controller_resource_free ags_controller_resource_ref ags_controller_resource_unref ags_controller_add_resource ags_controller_remove_resource ags_controller_lookup_resource ags_controller_query_security_context ags_controller_new AGS_CONTROLLER AGS_CONTROLLER_CLASS AGS_CONTROLLER_GET_CLASS AGS_IS_CONTROLLER AGS_TYPE_CONTROLLER AgsController AgsControllerClass ags_controller_get_type
ags_conversion AgsConversion AGS_CONVERSION_GET_OBJ_MUTEX ags_conversion_convert ags_conversion_new AGS_CONVERSION AGS_CONVERSION_CLASS AGS_CONVERSION_GET_CLASS AGS_IS_CONVERSION AGS_TYPE_CONVERSION AgsConversion AgsConversionClass ags_conversion_get_type
ags_countable AgsCountable ags_countable_get_sequencer_counter ags_countable_get_notation_counter ags_countable_get_wave_counter ags_countable_get_midi_counter AGS_COUNTABLE AGS_COUNTABLE_GET_INTERFACE AGS_COUNTABLE_INTERFACE AGS_IS_COUNTABLE AGS_IS_COUNTABLE_INTERFACE AGS_TYPE_COUNTABLE AgsCountable AgsCountableInterface ags_countable_get_type
ags_cursor AgsCursor ags_cursor_get_default_offset ags_cursor_get_tact ags_cursor_get_bpm ags_cursor_get_rate ags_cursor_get_delay ags_cursor_get_duration ags_cursor_get_delay_counter ags_cursor_get_offset ags_cursor_get_prev ags_cursor_get_next ags_cursor_get_current_copy ags_cursor_get_current AGS_CURSOR AGS_CURSOR_GET_INTERFACE AGS_CURSOR_INTERFACE AGS_IS_CURSOR AGS_IS_CURSOR_INTERFACE AGS_TYPE_CURSOR AgsCursor AgsCursorInterface ags_cursor_get_type
ags_destroy_util ags_destroy_util_dispose_and_unref
ags_destroy_worker AgsDestroyWorker AGS_DESTROY_ENTRY AgsDestroyFunc AgsDestroyEntry ags_destroy_entry_alloc ags_destroy_worker_add ags_destroy_worker_get_instance ags_destroy_worker_new AGS_DESTROY_WORKER AGS_DESTROY_WORKER_CLASS AGS_DESTROY_WORKER_GET_CLASS AGS_IS_DESTROY_WORKER AGS_TYPE_DESTROY_WORKER AgsDestroyWorker AgsDestroyWorkerClass ags_destroy_worker_get_type
ags_endian AgsByteOrder ags_endian_host_is_le ags_endian_host_is_be ags_endian_swap_float
ags_file AgsFile AGS_FILE_GET_OBJ_MUTEX AGS_FILE_DEFAULT_ENCODING AGS_FILE_DEFAULT_DTD AGS_FILE_CHECKSUM_LENGTH AGS_FILE_DEFAULT_AUDIO_FORMAT AGS_FILE_DEFAULT_AUDIO_ENCODING AgsFileFlags AGS_FILE_ERROR AgsFileError ags_file_str2md5 ags_file_add_id_ref ags_file_find_id_ref_by_node ags_file_find_id_ref_by_xpath ags_file_find_id_ref_by_reference ags_file_add_lookup ags_file_add_launch ags_file_open ags_file_open_from_data ags_file_rw_open ags_file_open_filename ags_file_close ags_file_write ags_file_write_concurrent ags_file_write_resolve ags_file_read ags_file_read_resolve ags_file_read_start ags_file_read_config ags_file_write_config ags_file_read_application_context ags_file_write_application_context ags_file_new AGS_FILE AGS_FILE_CLASS AGS_FILE_GET_CLASS AGS_IS_FILE AGS_TYPE_FILE AgsFile AgsFileClass ags_file_get_type
ags_file_id_ref AgsFileIdRef AGS_FILE_ID_REF_GET_OBJ_MUTEX AGS_FILE_RESOLVE AGS_FILE_ID_REF_SERIALIZE_DATA AGS_FILE_ID_REF_RESOLVE_DATA AgsFileResolve ags_file_id_ref_resolved ags_file_id_ref_new AGS_FILE_ID_REF AGS_FILE_ID_REF_CLASS AGS_FILE_ID_REF_GET_CLASS AGS_IS_FILE_ID_REF AGS_TYPE_FILE_ID_REF AgsFileIdRef AgsFileIdRefClass ags_file_id_ref_get_type
ags_file_launch AgsFileLaunch AGS_FILE_LAUNCH_GET_OBJ_MUTEX ags_file_launch_start ags_file_launch_new AGS_FILE_LAUNCH AGS_FILE_LAUNCH_CLASS AGS_FILE_LAUNCH_GET_CLASS AGS_IS_FILE_LAUNCH AGS_TYPE_FILE_LAUNCH AgsFileLaunch AgsFileLaunchClass ags_file_launch_get_type
ags_file_link AgsFileLink AGS_FILE_LINK_GET_OBJ_MUTEX AGS_FILE_LINK_DEFAULT_VERSION AGS_FILE_LINK_DEFAULT_BUILD_ID ags_file_link_new AGS_FILE_LINK AGS_FILE_LINK_CLASS AGS_FILE_LINK_GET_CLASS AGS_IS_FILE_LINK AGS_TYPE_FILE_LINK AgsFileLink AgsFileLinkClass ags_file_link_get_type
ags_file_lookup AgsFileLookup AGS_FILE_LOOKUP_GET_OBJ_MUTEX ags_file_lookup_find_by_node ags_file_lookup_find_by_reference ags_file_lookup_resolve ags_file_lookup_new AGS_FILE_LOOKUP AGS_FILE_LOOKUP_CLASS AGS_FILE_LOOKUP_GET_CLASS AGS_IS_FILE_LOOKUP AGS_TYPE_FILE_LOOKUP AgsFileLookup AgsFileLookupClass ags_file_lookup_get_type
ags_front_controller AgsFrontController ags_front_controller_do_request ags_front_controller_new AGS_FRONT_CONTROLLER AGS_FRONT_CONTROLLER_CLASS AGS_FRONT_CONTROLLER_GET_CLASS AGS_IS_FRONT_CONTROLLER AGS_TYPE_FRONT_CONTROLLER AgsFrontController AgsFrontControllerClass ags_front_controller_get_type
ags_function AgsFunction AGS_FUNCTION_GET_OBJ_MUTEX AGS_SYMBOLIC_EULER AGS_SYMBOLIC_PI AGS_SYMBOLIC_INFINIT AGS_SYMBOLIC_COMPLEX_UNIT AgsFunctionFlags ags_function_collapse_parantheses ags_function_find_literals ags_function_literal_solve ags_function_push_equation ags_function_pop_equation ags_function_get_expanded ags_function_get_normalized ags_function_compute_term ags_function_symbolic_translate_value ags_function_substitute_values ags_function_translate_value ags_function_new AGS_FUNCTION AGS_FUNCTION_CLASS AGS_FUNCTION_GET_CLASS AGS_IS_FUNCTION AGS_TYPE_FUNCTION AgsFunction AgsFunctionClass ags_function_get_type
ags_generic_main_loop AgsGenericMainLoop AGS_GENERIC_MAIN_LOOP_DEFAULT_JIFFIE ags_generic_main_loop_new AGS_GENERIC_MAIN_LOOP AGS_GENERIC_MAIN_LOOP_CLASS AGS_GENERIC_MAIN_LOOP_GET_CLASS AGS_IS_GENERIC_MAIN_LOOP AGS_TYPE_GENERIC_MAIN_LOOP AgsGenericMainLoop AgsGenericMainLoopClass ags_generic_main_loop_get_type
ags_globals ags_globals_get_hash_table ags_globals_set ags_globals_get
ags_id_generator ags_id_generator_create_uuid
ags_list_util ags_list_util_find_type
ags_log AgsLog AGS_LOG_GET_OBJ_MUTEX ags_log_add_message ags_log_get_messages ags_log_get_instance ags_log_new AGS_IS_LOG AGS_LOG AGS_LOG_CLASS AGS_LOG_GET_CLASS AGS_TYPE_LOG AgsLog AgsLogClass ags_log_get_type
ags_macros AGS_DECLARE_INTERFACE
ags_main_loop AgsMainLoop ags_main_loop_get_tree_lock ags_main_loop_set_syncing ags_main_loop_is_syncing ags_main_loop_set_critical_region ags_main_loop_is_critical_region ags_main_loop_inc_queued_critical_region ags_main_loop_dec_queued_critical_region ags_main_loop_test_queued_critical_region ags_main_loop_change_frequency AGS_IS_MAIN_LOOP AGS_IS_MAIN_LOOP_INTERFACE AGS_MAIN_LOOP AGS_MAIN_LOOP_GET_INTERFACE AGS_MAIN_LOOP_INTERFACE AGS_TYPE_MAIN_LOOP AgsMainLoop AgsMainLoopInterface ags_main_loop_get_type
ags_marshal ags_cclosure_marshal_VOID__UINT64 ags_cclosure_marshal_VOID__BOOLEAN_POINTER ags_cclosure_marshal_VOID__INT_UINT ags_cclosure_marshal_VOID__INT_POINTER ags_cclosure_marshal_VOID__INT_UINT_POINTER ags_cclosure_marshal_VOID__UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_BOOLEAN ags_cclosure_marshal_VOID__UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_UINT_UINT_UINT_UINT_UINT_UINT ags_cclosure_marshal_VOID__UINT_DOUBLE_UINT ags_cclosure_marshal_VOID__UINT_INT ags_cclosure_marshal_VOID__UINT_DOUBLE ags_cclosure_marshal_VOID__UINT_STRING_UINT ags_cclosure_marshal_VOID__UINT_POINTER_UINT ags_cclosure_marshal_VOID__INT64_UINT ags_cclosure_marshal_VOID__ULONG_UINT ags_cclosure_marshal_VOID__ULONG_UINT_BOOLEAN ags_cclosure_marshal_VOID__DOUBLE_DOUBLE ags_cclosure_marshal_VOID__ULONG_UINT_UINT ags_cclosure_marshal_VOID__STRING_UINT ags_cclosure_marshal_VOID__STRING_UINT_DOUBLE ags_cclosure_marshal_VOID__STRING_UINT_POINTER ags_cclosure_marshal_VOID__STRING_UINT_STRING_DOUBLE ags_cclosure_marshal_VOID__STRING_POINTER ags_cclosure_marshal_VOID__STRING_STRING_STRING ags_cclosure_marshal_VOID__POINTER_INT ags_cclosure_marshal_VOID__POINTER_INT_POINTER ags_cclosure_marshal_VOID__POINTER_INT_INT_BOOLEAN ags_cclosure_marshal_VOID__POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER ags_cclosure_marshal_VOID__POINTER_UINT_UINT ags_cclosure_marshal_VOID__POINTER_UINT_POINTER ags_cclosure_marshal_VOID__POINTER_POINTER_UINT ags_cclosure_marshal_VOID__POINTER_POINTER_POINTER ags_cclosure_marshal_VOID__OBJECT_UINT ags_cclosure_marshal_VOID__OBJECT_UINT_UINT_UINT ags_cclosure_marshal_VOID__OBJECT_OBJECT ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_UINT_INT_BOOLEAN ags_cclosure_marshal_VOID__OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT_OBJECT ags_cclosure_marshal_ULONG__VOID ags_cclosure_marshal_INT__VOID ags_cclosure_marshal_INT64__OBJECT ags_cclosure_marshal_UINT__VOID ags_cclosure_marshal_BOOLEAN__VOID ags_cclosure_marshal_BOOLEAN__UINT_POINTER ags_cclosure_marshal_BOOLEAN__POINTER_UINT ags_cclosure_marshal_BOOLEAN__OBJECT_OBJECT ags_cclosure_marshal_UINT__INT_UINT_POINTER ags_cclosure_marshal_DOUBLE__DOUBLE_BOOLEAN ags_cclosure_marshal_STRING__STRING_STRING ags_cclosure_marshal_STRING__ULONG_STRING_STRING_STRING_STRING_UINT_POINTER ags_cclosure_marshal_POINTER__VOID ags_cclosure_marshal_POINTER__INT ags_cclosure_marshal_POINTER__UINT ags_cclosure_marshal_POINTER__POINTER ags_cclosure_marshal_POINTER__INT_UINT ags_cclosure_marshal_POINTER__UINT_UINT ags_cclosure_marshal_POINTER__UINT_POINTER ags_cclosure_marshal_POINTER__POINTER_POINTER_POINTER ags_cclosure_marshal_POINTER__POINTER_UINT ags_cclosure_marshal_POINTER__STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING ags_cclosure_marshal_POINTER__STRING_STRING_STRING_STRING ags_cclosure_marshal_POINTER__ULONG_POINTER_UINT ags_cclosure_marshal_POINTER__ULONG_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT ags_cclosure_marshal_POINTER__OBJECT_POINTER_UINT ags_cclosure_marshal_POINTER__OBJECT_POINTER_INT64 ags_cclosure_marshal_POINTER__OBJECT_OBJECT ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_STRING_STRING_STRING_STRING_UINT_POINTER_POINTER ags_cclosure_marshal_POINTER__OBJECT_POINTER_OBJECT_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__OBJECT_POINTER_POINTER_OBJECT_STRING_STRING_STRING ags_cclosure_marshal_POINTER__POINTER_STRING_STRING ags_cclosure_marshal_OBJECT__VOID ags_cclosure_marshal_OBJECT__UINT_POINTER ags_cclosure_marshal_OBJECT__STRING_STRING_STRING ags_cclosure_marshal_OBJECT__OBJECT ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_POINTER_POINTER_POINTER ags_cclosure_marshal_OBJECT__OBJECT_OBJECT
ags_message_delivery AgsMessageDelivery AGS_MESSAGE_DELIVERY_GET_OBJ_MUTEX ags_message_delivery_add_message_queue ags_message_delivery_remove_message_queue ags_message_delivery_find_sender_namespace ags_message_delivery_find_recipient_namespace ags_message_delivery_add_message_envelope ags_message_delivery_remove_message_envelope ags_message_delivery_find_sender ags_message_delivery_find_recipient ags_message_delivery_query_message ags_message_delivery_get_instance ags_message_delivery_new AGS_IS_MESSAGE_DELIVERY AGS_MESSAGE_DELIVERY AGS_MESSAGE_DELIVERY_CLASS AGS_MESSAGE_DELIVERY_GET_CLASS AGS_TYPE_MESSAGE_DELIVERY AgsMessageDelivery AgsMessageDeliveryClass ags_message_delivery_get_type
ags_message_envelope AgsMessageEnvelope AGS_MESSAGE_ENVELOPE_GET_OBJ_MUTEX ags_message_envelope_get_sender ags_message_envelope_get_recipient ags_message_envelope_get_doc ags_message_envelope_get_parameter ags_message_envelope_new ags_message_envelope_new_with_params AGS_IS_MESSAGE_ENVELOPE AGS_MESSAGE_ENVELOPE AGS_MESSAGE_ENVELOPE_CLASS AGS_MESSAGE_ENVELOPE_GET_CLASS AGS_TYPE_MESSAGE_ENVELOPE AgsMessageEnvelope AgsMessageEnvelopeClass ags_message_envelope_get_type
ags_message_queue AgsMessageQueue AGS_MESSAGE_QUEUE_GET_OBJ_MUTEX ags_message_queue_add_message_envelope ags_message_queue_remove_message_envelope ags_message_queue_find_sender ags_message_queue_find_recipient ags_message_queue_query_message ags_message_queue_new AGS_IS_MESSAGE_QUEUE AGS_MESSAGE_QUEUE AGS_MESSAGE_QUEUE_CLASS AGS_MESSAGE_QUEUE_GET_CLASS AGS_TYPE_MESSAGE_QUEUE AgsMessageQueue AgsMessageQueueClass ags_message_queue_get_type
ags_mutable AgsMutable ags_mutable_set_muted AGS_IS_MUTABLE AGS_IS_MUTABLE_INTERFACE AGS_MUTABLE AGS_MUTABLE_GET_INTERFACE AGS_MUTABLE_INTERFACE AGS_TYPE_MUTABLE AgsMutable AgsMutableInterface ags_mutable_get_type
ags_password_store AgsPasswordStore ags_password_store_set_login_name ags_password_store_get_login_name ags_password_store_set_password ags_password_store_get_password ags_password_store_encrypt_password AGS_IS_PASSWORD_STORE AGS_IS_PASSWORD_STORE_INTERFACE AGS_PASSWORD_STORE AGS_PASSWORD_STORE_GET_INTERFACE AGS_PASSWORD_STORE_INTERFACE AGS_TYPE_PASSWORD_STORE AgsPasswordStore AgsPasswordStoreInterface ags_password_store_get_type
ags_password_store_manager AgsPasswordStoreManager AGS_PASSWORD_STORE_MANAGER_GET_OBJ_MUTEX ags_password_store_manager_get_password_store ags_password_store_manager_add_password_store ags_password_store_manager_remove_password_store ags_password_store_manager_check_password ags_password_store_manager_get_instance ags_password_store_manager_new AGS_IS_PASSWORD_STORE_MANAGER AGS_PASSWORD_STORE_MANAGER AGS_PASSWORD_STORE_MANAGER_CLASS AGS_PASSWORD_STORE_MANAGER_GET_CLASS AGS_TYPE_PASSWORD_STORE_MANAGER AgsPasswordStoreManager AgsPasswordStoreManagerClass ags_password_store_manager_get_type
ags_plugin AgsPlugin ags_plugin_get_name ags_plugin_set_name ags_plugin_get_version ags_plugin_set_version ags_plugin_get_build_id ags_plugin_set_build_id ags_plugin_get_xml_type ags_plugin_set_xml_type ags_plugin_get_ports ags_plugin_set_ports ags_plugin_read ags_plugin_write AGS_IS_PLUGIN AGS_IS_PLUGIN_INTERFACE AGS_PLUGIN AGS_PLUGIN_GET_INTERFACE AGS_PLUGIN_INTERFACE AGS_TYPE_PLUGIN AgsPlugin AgsPluginInterface ags_plugin_get_type
ags_plugin_controller AgsPluginController ags_plugin_controller_do_request AGS_IS_PLUGIN_CONTROLLER AGS_IS_PLUGIN_CONTROLLER_INTERFACE AGS_PLUGIN_CONTROLLER AGS_PLUGIN_CONTROLLER_GET_INTERFACE AGS_PLUGIN_CONTROLLER_INTERFACE AGS_TYPE_PLUGIN_CONTROLLER AgsPluginController AgsPluginControllerInterface ags_plugin_controller_get_type
ags_portlet AgsPortlet ags_portlet_get_port ags_portlet_set_port ags_portlet_list_safe_properties ags_portlet_safe_get_property ags_portlet_safe_set_property AGS_IS_PORTLET AGS_IS_PORTLET_INTERFACE AGS_PORTLET AGS_PORTLET_GET_INTERFACE AGS_PORTLET_INTERFACE AGS_TYPE_PORTLET AgsPortlet AgsPortletInterface ags_portlet_get_type
ags_priority AgsPriority AGS_PRIORITY_GET_OBJ_MUTEX AGS_PRIORITY_DEFAULT_VERSION AGS_PRIORITY_DEFAULT_BUILD_ID AGS_PRIORITY_RT_THREAD AGS_PRIORITY_KEY_LIBAGS AGS_PRIORITY_KEY_SERVER_MAIN_LOOP AGS_PRIORITY_KEY_AUDIO_MAIN_LOOP AGS_PRIORITY_KEY_AUDIO AGS_PRIORITY_KEY_OSC_SERVER_MAIN_LOOP AGS_PRIORITY_KEY_GUI_MAIN_LOOP AgsPriorityFlags ags_priority_load_defaults ags_priority_load_from_file ags_priority_set_value ags_priority_get_value ags_priority_get_instance ags_priority_new AGS_IS_PRIORITY AGS_PRIORITY AGS_PRIORITY_CLASS AGS_PRIORITY_GET_CLASS AGS_TYPE_PRIORITY AgsPriority AgsPriorityClass ags_priority_get_type
ags_regex ags_regcomp ags_regexec
ags_registry AgsRegistry AGS_REGISTRY_GET_OBJ_MUTEX AgsRegistryFlags AgsRegistryEntry ags_registry_entry_alloc ags_registry_entry_free ags_registry_add_entry ags_registry_find_entry ags_registry_new AGS_IS_REGISTRY AGS_REGISTRY AGS_REGISTRY_CLASS AGS_REGISTRY_GET_CLASS AGS_TYPE_REGISTRY AgsRegistry AgsRegistryClass ags_registry_get_type
ags_returnable_thread AgsReturnableThread AGS_RETURNABLE_THREAD_DEFAULT_JIFFIE AgsReturnableThreadCallback AgsReturnableThreadFlags ags_returnable_thread_test_flags ags_returnable_thread_set_flags ags_returnable_thread_unset_flags ags_returnable_thread_safe_run ags_returnable_thread_connect_safe_run ags_returnable_thread_disconnect_safe_run ags_returnable_thread_new AGS_IS_RETURNABLE_THREAD AGS_RETURNABLE_THREAD AGS_RETURNABLE_THREAD_CLASS AGS_RETURNABLE_THREAD_GET_CLASS AGS_TYPE_RETURNABLE_THREAD AgsReturnableThread AgsReturnableThreadClass ags_returnable_thread_get_type
ags_security_context AgsSecurityContext AGS_SECURITY_CONTEXT_GET_OBJ_MUTEX AgsSecurityContextMode ags_security_context_parse_business_group ags_security_context_get_business_group ags_security_context_add_server_context ags_security_context_remove_server_context ags_security_context_get_server_context ags_security_context_new AGS_IS_SECURITY_CONTEXT AGS_SECURITY_CONTEXT AGS_SECURITY_CONTEXT_CLASS AGS_SECURITY_CONTEXT_GET_CLASS AGS_TYPE_SECURITY_CONTEXT AgsSecurityContext AgsSecurityContextClass ags_security_context_get_type
ags_seekable AgsSeekable AgsSeekType ags_seekable_seek AGS_IS_SEEKABLE AGS_IS_SEEKABLE_INTERFACE AGS_SEEKABLE AGS_SEEKABLE_GET_INTERFACE AGS_SEEKABLE_INTERFACE AGS_TYPE_SEEKABLE AgsSeekable AgsSeekableInterface ags_seekable_get_type
ags_sequencer AgsSequencer AGS_SEQUENCER_DEFAULT_SAMPLERATE AGS_SEQUENCER_DEFAULT_BUFFER_SIZE AGS_SEQUENCER_DEFAULT_DEVICE AGS_SEQUENCER_DEFAULT_BPM AGS_SEQUENCER_DEFAULT_DELAY_FACTOR AGS_SEQUENCER_DEFAULT_JIFFIE AGS_SEQUENCER_DEFAULT_TACT AGS_SEQUENCER_DEFAULT_TACT_JIFFIE AGS_SEQUENCER_DEFAULT_TACTRATE AGS_SEQUENCER_DEFAULT_SCALE AGS_SEQUENCER_DEFAULT_DELAY AGS_SEQUENCER_DEFAULT_PERIOD AGS_SEQUENCER_DEFAULT_LATENCY ags_sequencer_set_device ags_sequencer_get_device ags_sequencer_list_cards ags_sequencer_is_starting ags_sequencer_is_playing ags_sequencer_is_recording ags_sequencer_play_init ags_sequencer_play ags_sequencer_record_init ags_sequencer_record ags_sequencer_stop ags_sequencer_tic ags_sequencer_offset_changed ags_sequencer_get_buffer ags_sequencer_get_next_buffer ags_sequencer_lock_buffer ags_sequencer_unlock_buffer ags_sequencer_set_bpm ags_sequencer_get_bpm ags_sequencer_set_delay_factor ags_sequencer_get_delay_factor ags_sequencer_set_start_note_offset ags_sequencer_get_start_note_offset ags_sequencer_set_note_offset ags_sequencer_get_note_offset AGS_IS_SEQUENCER AGS_IS_SEQUENCER_INTERFACE AGS_SEQUENCER AGS_SEQUENCER_GET_INTERFACE AGS_SEQUENCER_INTERFACE AGS_TYPE_SEQUENCER AgsSequencer AgsSequencerInterface ags_sequencer_get_type
ags_server AgsServer AGS_SERVER_GET_OBJ_MUTEX AGS_SERVER_DEFAULT_SERVER_PORT AGS_SERVER_DEFAULT_DOMAIN AGS_SERVER_DEFAULT_INET4_ADDRESS AGS_SERVER_DEFAULT_INET6_ADDRESS AGS_SERVER_DEFAULT_AUTH_MODULE AGS_SERVER_DEFAULT_BACKLOG AgsServerFlags AgsServerInfo ags_server_test_flags ags_server_set_flags ags_server_unset_flags ags_server_info_alloc ags_server_add_controller ags_server_remove_controller ags_server_start ags_server_stop ags_server_listen ags_server_new AGS_IS_SERVER AGS_SERVER AGS_SERVER_CLASS AGS_SERVER_GET_CLASS AGS_TYPE_SERVER AgsServer AgsServerClass ags_server_get_type
ags_server_application_context AgsServerApplicationContext AGS_SERVER_VERSION AGS_SERVER_BUILD_ID ags_server_application_context_new AGS_IS_SERVER_APPLICATION_CONTEXT AGS_SERVER_APPLICATION_CONTEXT AGS_SERVER_APPLICATION_CONTEXT_CLASS AGS_SERVER_APPLICATION_CONTEXT_GET_CLASS AGS_TYPE_SERVER_APPLICATION_CONTEXT AgsServerApplicationContext AgsServerApplicationContextClass ags_server_application_context_get_type
ags_server_status AgsServerStatus AGS_SERVER_STATUS_GET_OBJ_MUTEX ags_server_status_new AGS_IS_SERVER_STATUS AGS_SERVER_STATUS AGS_SERVER_STATUS_CLASS AGS_SERVER_STATUS_GET_CLASS AGS_TYPE_SERVER_STATUS AgsServerStatus AgsServerStatusClass ags_server_status_get_type
ags_service_provider AgsServiceProvider ags_service_provider_is_operating ags_service_provider_server_status ags_service_provider_set_registry ags_service_provider_get_registry ags_service_provider_set_server ags_service_provider_get_server AGS_IS_SERVICE_PROVIDER AGS_IS_SERVICE_PROVIDER_INTERFACE AGS_SERVICE_PROVIDER AGS_SERVICE_PROVIDER_GET_INTERFACE AGS_SERVICE_PROVIDER_INTERFACE AGS_TYPE_SERVICE_PROVIDER AgsServiceProvider AgsServiceProviderInterface ags_service_provider_get_type
ags_solver_matrix AgsSolverMatrix AGS_SOLVER_MATRIX_GET_OBJ_MUTEX ags_solver_matrix_new AGS_IS_SOLVER_MATRIX AGS_SOLVER_MATRIX AGS_SOLVER_MATRIX_CLASS AGS_SOLVER_MATRIX_GET_CLASS AGS_TYPE_SOLVER_MATRIX AgsSolverMatrix AgsSolverMatrixClass ags_solver_matrix_get_type
ags_solver_vector AgsSolverVector AGS_SOLVER_VECTOR_GET_OBJ_MUTEX ags_solver_vector_new AGS_IS_SOLVER_VECTOR AGS_SOLVER_VECTOR AGS_SOLVER_VECTOR_CLASS AGS_SOLVER_VECTOR_GET_CLASS AGS_TYPE_SOLVER_VECTOR AgsSolverVector AgsSolverVectorClass ags_solver_vector_get_type
ags_sound_server AgsSoundServer ags_sound_server_set_url ags_sound_server_get_url ags_sound_server_set_ports ags_sound_server_get_ports ags_sound_server_set_soundcard ags_sound_server_get_soundcard ags_sound_server_set_sequencer ags_sound_server_get_sequencer ags_sound_server_register_soundcard ags_sound_server_unregister_soundcard ags_sound_server_register_sequencer ags_sound_server_unregister_sequencer AGS_IS_SOUND_SERVER AGS_IS_SOUND_SERVER_INTERFACE AGS_SOUND_SERVER AGS_SOUND_SERVER_GET_INTERFACE AGS_SOUND_SERVER_INTERFACE AGS_TYPE_SOUND_SERVER AgsSoundServer AgsSoundServerInterface ags_sound_server_get_type
ags_soundcard AgsSoundcard AGS_SOUNDCARD_DEFAULT_DSP_CHANNELS AGS_SOUNDCARD_MIN_DSP_CHANNELS AGS_SOUNDCARD_MAX_DSP_CHANNELS AGS_SOUNDCARD_DEFAULT_PCM_CHANNELS AGS_SOUNDCARD_MIN_PCM_CHANNELS AGS_SOUNDCARD_MAX_PCM_CHANNELS AGS_SOUNDCARD_DEFAULT_SAMPLERATE AGS_SOUNDCARD_MIN_SAMPLERATE AGS_SOUNDCARD_MAX_SAMPLERATE AGS_SOUNDCARD_DEFAULT_FORMAT AGS_SOUNDCARD_DEFAULT_BUFFER_SIZE AGS_SOUNDCARD_MIN_BUFFER_SIZE AGS_SOUNDCARD_MAX_BUFFER_SIZE AGS_SOUNDCARD_DEFAULT_BPM AGS_SOUNDCARD_DEFAULT_DELAY_FACTOR AGS_SOUNDCARD_DEFAULT_JIFFIE AGS_SOUNDCARD_DEFAULT_TACT AGS_SOUNDCARD_DEFAULT_TACT_JIFFIE AGS_SOUNDCARD_DEFAULT_TACTRATE AGS_SOUNDCARD_DEFAULT_SCALE AGS_SOUNDCARD_DEFAULT_DELAY AGS_SOUNDCARD_DEFAULT_PERIOD AGS_SOUNDCARD_DEFAULT_LOOP_LEFT AGS_SOUNDCARD_DEFAULT_LOOP_RIGHT AGS_SOUNDCARD_DEFAULT_OVERCLOCK AGS_SOUNDCARD_DEFAULT_SUB_BLOCK_COUNT AgsSoundcardFormat AgsSoundcardCapability ags_soundcard_set_device ags_soundcard_get_device ags_soundcard_set_presets ags_soundcard_get_presets ags_soundcard_list_cards ags_soundcard_pcm_info ags_soundcard_get_capability ags_soundcard_is_available ags_soundcard_is_starting ags_soundcard_is_playing ags_soundcard_is_recording ags_soundcard_get_uptime ags_soundcard_play_init ags_soundcard_play ags_soundcard_record_init ags_soundcard_record ags_soundcard_stop ags_soundcard_tic ags_soundcard_offset_changed ags_soundcard_get_buffer ags_soundcard_get_next_buffer ags_soundcard_get_prev_buffer ags_soundcard_lock_buffer ags_soundcard_unlock_buffer ags_soundcard_set_bpm ags_soundcard_get_bpm ags_soundcard_set_delay_factor ags_soundcard_get_delay_factor ags_soundcard_get_absolute_delay ags_soundcard_get_delay ags_soundcard_get_attack ags_soundcard_get_delay_counter ags_soundcard_set_start_note_offset ags_soundcard_get_start_note_offset ags_soundcard_set_note_offset ags_soundcard_get_note_offset ags_soundcard_set_note_offset_absolute ags_soundcard_get_note_offset_absolute ags_soundcard_set_loop ags_soundcard_get_loop ags_soundcard_get_loop_offset ags_soundcard_get_sub_block_count ags_soundcard_trylock_sub_block ags_soundcard_unlock_sub_block AGS_IS_SOUNDCARD AGS_IS_SOUNDCARD_INTERFACE AGS_SOUNDCARD AGS_SOUNDCARD_GET_INTERFACE AGS_SOUNDCARD_INTERFACE AGS_TYPE_SOUNDCARD AgsSoundcard AgsSoundcardInterface ags_soundcard_get_type
ags_soundcard_helper ags_soundcard_helper_config_get_dsp_channels ags_soundcard_helper_config_get_pcm_channels ags_soundcard_helper_config_get_samplerate ags_soundcard_helper_config_get_buffer_size ags_soundcard_helper_config_get_format
ags_string_util ags_string_util_escape_single_quote ags_strv_length ags_strv_contains ags_strv_index
ags_tactable AgsTactable ags_tactable_get_sequencer_duration ags_tactable_get_notation_duration ags_tactable_get_wave_duration ags_tactable_get_midi_duration ags_tactable_get_bpm ags_tactable_get_tact ags_tactable_change_sequencer_duration ags_tactable_change_notation_duration ags_tactable_change_wave_duration ags_tactable_change_midi_duration ags_tactable_change_bpm ags_tactable_change_tact AGS_IS_TACTABLE AGS_IS_TACTABLE_INTERFACE AGS_TACTABLE AGS_TACTABLE_GET_INTERFACE AGS_TACTABLE_INTERFACE AGS_TYPE_TACTABLE AgsTactable AgsTactableInterface ags_tactable_get_type
ags_task AgsTask AGS_TASK_GET_OBJ_MUTEX AgsTaskFlags ags_task_test_flags ags_task_set_flags ags_task_unset_flags ags_task_launch ags_task_failure ags_task_new AGS_IS_TASK AGS_TASK AGS_TASK_CLASS AGS_TASK_GET_CLASS AGS_TYPE_TASK AgsTask AgsTaskClass ags_task_get_type
ags_task_completion AgsTaskCompletion AGS_TASK_COMPLETION_GET_OBJ_MUTEX AgsTaskCompletionFlags ags_task_completion_test_flags ags_task_completion_set_flags ags_task_completion_unset_flags ags_task_completion_complete ags_task_completion_new AGS_IS_TASK_COMPLETION AGS_TASK_COMPLETION AGS_TASK_COMPLETION_CLASS AGS_TASK_COMPLETION_GET_CLASS AGS_TYPE_TASK_COMPLETION AgsTaskCompletion AgsTaskCompletionClass ags_task_completion_get_type
ags_task_launcher AgsTaskLauncher AGS_TASK_LAUNCHER_GET_OBJ_MUTEX AgsTaskLauncherFlags ags_task_launcher_test_flags ags_task_launcher_set_flags ags_task_launcher_unset_flags ags_task_launcher_attach ags_task_launcher_add_task ags_task_launcher_add_task_all ags_task_launcher_add_cyclic_task ags_task_launcher_remove_cyclic_task ags_task_launcher_run ags_task_launcher_sync_run ags_task_launcher_new AGS_IS_TASK_LAUNCHER AGS_TASK_LAUNCHER AGS_TASK_LAUNCHER_CLASS AGS_TASK_LAUNCHER_GET_CLASS AGS_TYPE_TASK_LAUNCHER AgsTaskLauncher AgsTaskLauncherClass ags_task_launcher_get_type
ags_thread AgsThread AGS_THREAD_GET_OBJ_MUTEX AGS_THREAD_GET_WAIT_MUTEX AGS_THREAD_GET_WAIT_COND AGS_THREAD_GET_TIC_MUTEX AGS_THREAD_GET_TIC_COND AGS_THREAD_GET_START_MUTEX AGS_THREAD_GET_START_COND AGS_THREAD_HERTZ_JIFFIE AGS_THREAD_YIELD_JIFFIE AGS_THREAD_DEFAULT_JIFFIE AGS_THREAD_DEFAULT_MAX_PRECISION AGS_THREAD_MAX_PRECISION AGS_THREAD_DEFAULT_ATTACK AGS_THREAD_TOLERANCE AgsThreadFlags AgsThreadStatusFlags AgsThreadSyncTicFlags ags_thread_global_get_use_sync_counter ags_thread_test_flags ags_thread_set_flags ags_thread_unset_flags ags_thread_test_status_flags ags_thread_set_status_flags ags_thread_unset_status_flags ags_thread_clear_status_flags ags_thread_test_sync_tic_flags ags_thread_set_sync_tic_flags ags_thread_unset_sync_tic_flags ags_thread_clear_sync_tic_flags ags_thread_set_current_sync_tic ags_thread_get_current_sync_tic ags_thread_set_delay ags_thread_get_delay ags_thread_set_frequency ags_thread_get_frequency ags_thread_set_max_precision ags_thread_get_max_precision ags_thread_find_type ags_thread_self ags_thread_parent ags_thread_next ags_thread_prev ags_thread_children ags_thread_get_toplevel ags_thread_first ags_thread_last ags_thread_lock ags_thread_trylock ags_thread_unlock ags_thread_remove_child ags_thread_add_child ags_thread_add_child_extended ags_thread_is_current_ready ags_thread_is_tree_ready_recursive ags_thread_prepare_current_sync ags_thread_prepare_tree_sync_recursive ags_thread_set_current_sync ags_thread_set_tree_sync_recursive ags_thread_clock ags_thread_add_start_queue ags_thread_add_start_queue_all ags_thread_start ags_thread_run ags_thread_stop ags_thread_new AGS_IS_THREAD AGS_THREAD AGS_THREAD_CLASS AGS_THREAD_GET_CLASS AGS_TYPE_THREAD AgsThread AgsThreadClass ags_thread_get_type
ags_thread_application_context AgsThreadApplicationContext AGS_THREAD_DEFAULT_VERSION AGS_THREAD_BUILD_ID AgsThreadApplicationContextFlags ags_thread_application_context_register_types ags_thread_application_context_new AGS_IS_THREAD_APPLICATION_CONTEXT AGS_THREAD_APPLICATION_CONTEXT AGS_THREAD_APPLICATION_CONTEXT_CLASS AGS_THREAD_APPLICATION_CONTEXT_GET_CLASS AGS_TYPE_THREAD_APPLICATION_CONTEXT AgsThreadApplicationContext AgsThreadApplicationContextClass ags_thread_application_context_get_type
ags_thread_pool AgsThreadPool AGS_THREAD_POOL_DEFAULT_MAX_UNUSED_THREADS AGS_THREAD_POOL_DEFAULT_MAX_THREADS AgsThreadPoolFlags ags_thread_pool_pull ags_thread_pool_start ags_thread_pool_new AGS_IS_THREAD_POOL AGS_THREAD_POOL AGS_THREAD_POOL_CLASS AGS_THREAD_POOL_GET_CLASS AGS_TYPE_THREAD_POOL AgsThreadPool AgsThreadPoolClass ags_thread_pool_get_type
ags_time AGS_TIME_ZERO AGS_USEC_PER_SEC AGS_NSEC_PER_SEC ags_time_get_uptime_from_offset ags_time_timeout_expired
ags_timestamp AgsTimestamp AGS_TIMESTAMP_GET_OBJ_MUTEX AgsTimestampFlags ags_timestamp_test_flags ags_timestamp_set_flags ags_timestamp_unset_flags ags_timestamp_get_unix_time ags_timestamp_set_unix_time ags_timestamp_get_ags_offset ags_timestamp_set_ags_offset ags_timestamp_new AGS_IS_TIMESTAMP AGS_TIMESTAMP AGS_TIMESTAMP_CLASS AGS_TIMESTAMP_GET_CLASS AGS_TYPE_TIMESTAMP AgsTimestamp AgsTimestampClass ags_timestamp_get_type
ags_turtle AgsTurtle AGS_TURTLE_GET_OBJ_MUTEX AGS_TURTLE_DEFAULT_ENCODING AGS_TURTLE_DEFAULT_VERSION AgsTurtleFlags ags_turtle_read_iriref ags_turtle_read_pname_ns ags_turtle_read_pname_ln ags_turtle_read_blank_node_label ags_turtle_read_langtag ags_turtle_read_boolean ags_turtle_read_integer ags_turtle_read_decimal ags_turtle_read_double ags_turtle_read_exponent ags_turtle_read_string ags_turtle_read_string_literal_quote ags_turtle_read_string_literal_single_quote ags_turtle_read_string_literal_long_quote ags_turtle_read_string_literal_long_single_quote ags_turtle_read_uchar ags_turtle_read_echar ags_turtle_read_ws ags_turtle_read_anon ags_turtle_read_pn_chars_base ags_turtle_read_pn_chars_u ags_turtle_read_pn_chars ags_turtle_read_pn_prefix ags_turtle_read_pn_local ags_turtle_read_plx ags_turtle_read_percent ags_turtle_read_hex ags_turtle_read_pn_local_esc ags_turtle_find_xpath ags_turtle_find_xpath_with_context_node ags_turtle_string_convert ags_turtle_load ags_turtle_new AGS_IS_TURTLE AGS_TURTLE AGS_TURTLE_CLASS AGS_TURTLE_GET_CLASS AGS_TYPE_TURTLE AgsTurtle AgsTurtleClass ags_turtle_get_type
ags_turtle_manager AgsTurtleManager AGS_TURTLE_MANAGER_GET_OBJ_MUTEX ags_turtle_manager_find ags_turtle_manager_add ags_turtle_manager_get_instance ags_turtle_manager_new AGS_IS_TURTLE_MANAGER AGS_TURTLE_MANAGER AGS_TURTLE_MANAGER_CLASS AGS_TURTLE_MANAGER_GET_CLASS AGS_TYPE_TURTLE_MANAGER AgsTurtleManager AgsTurtleManagerClass ags_turtle_manager_get_type
ags_uuid AGS_UUID_DEFAULT_LENGTH AGS_UUID_STRING_DEFAULT_LENGTH ags_uuid_alloc ags_uuid_copy ags_uuid_free ags_uuid_generate ags_uuid_compare ags_uuid_to_string ags_uuid_from_string AGS_TYPE_UUID AgsUUID ags_uuid_get_type
ags_worker_thread AgsWorkerThread AGS_WORKER_THREAD_DEFAULT_JIFFIE AgsWorkerThreadStatusFlags ags_worker_thread_test_status_flags ags_worker_thread_set_status_flags ags_worker_thread_unset_status_flags ags_woker_thread_do_poll_loop ags_worker_thread_do_poll ags_worker_thread_new AGS_IS_WORKER_THREAD AGS_TYPE_WORKER_THREAD AGS_WORKER_THREAD AGS_WORKER_THREAD_CLASS AGS_WORKER_THREAD_GET_CLASS AgsWorkerThread AgsWorkerThreadClass ags_worker_thread_get_type
ags_xml_authentication AgsXmlAuthentication AGS_XML_AUTHENTICATION_GET_OBJ_MUTEX ags_xml_authentication_open_filename ags_xml_authentication_find_user_uuid ags_xml_authentication_new AGS_IS_XML_AUTHENTICATION AGS_TYPE_XML_AUTHENTICATION AGS_XML_AUTHENTICATION AGS_XML_AUTHENTICATION_CLASS AGS_XML_AUTHENTICATION_GET_CLASS AgsXmlAuthentication AgsXmlAuthenticationClass ags_xml_authentication_get_type
ags_xml_business_group AgsXmlBusinessGroup AGS_XML_BUSINESS_GROUP_GET_OBJ_MUTEX ags_xml_business_group_open_filename ags_xml_business_group_new AGS_IS_XML_BUSINESS_GROUP AGS_TYPE_XML_BUSINESS_GROUP AGS_XML_BUSINESS_GROUP AGS_XML_BUSINESS_GROUP_CLASS AGS_XML_BUSINESS_GROUP_GET_CLASS AgsXmlBusinessGroup AgsXmlBusinessGroupClass ags_xml_business_group_get_type
ags_xml_certificate AgsXmlCertificate AGS_XML_CERTIFICATE_GET_OBJ_MUTEX ags_xml_certificate_open_filename ags_xml_certificate_new AGS_IS_XML_CERTIFICATE AGS_TYPE_XML_CERTIFICATE AGS_XML_CERTIFICATE AGS_XML_CERTIFICATE_CLASS AGS_XML_CERTIFICATE_GET_CLASS AgsXmlCertificate AgsXmlCertificateClass ags_xml_certificate_get_type
ags_xml_password_store AgsXmlPasswordStore AGS_XML_PASSWORD_STORE_GET_OBJ_MUTEX ags_xml_password_store_open_filename ags_xml_password_store_find_login ags_xml_password_store_new AGS_IS_XML_PASSWORD_STORE AGS_TYPE_XML_PASSWORD_STORE AGS_XML_PASSWORD_STORE AGS_XML_PASSWORD_STORE_CLASS AGS_XML_PASSWORD_STORE_GET_CLASS AgsXmlPasswordStore AgsXmlPasswordStoreClass ags_xml_password_store_get_type
gsequencer-3.1.3/docs/images/0000755000175000017500000000000013622252264013061 500000000000000gsequencer-3.1.3/docs/images/ags_automation_window_drum.png0000644000175000017500000025566713607210263021160 00000000000000PNG  IHDR}E.jczTXtRaw profile type exifxuS[n = !HA!d"ǯИ&VChD)e[2VC˱զASHPrԷ}v.S:KE/naəQZGJv Q J+ip[qYmsHckmrÔѲY1:"H8`UqiIݬ1 -nI*6bQ2?qAn&v. ($eWOV³*v-"۱~#dzTXtRaw profile type iptcx=10 'vD9UЍ G\lOVxt-)z(z^|QViTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\S $$AEⶭvqN]VUq"{vϛSJ8@i3^jEVh!  da0l00\ 4 a&`1JJv3%~E H4JU^~ΝSEt:ZlAhf4& oe0L/tL֊ʢ.ewKsiiyESN׷lOOCcAsg-TTwLފ}#o\i݊JR >Ӥ>d0<=bR3Fǘ.sPI:}Vdg-ٷ~ޚ}#{ĵӧHw$e4Rl_H)&0@lNw OLL:F ԧf35w4䎾]?%^U~#{BMZlMJ>RV +gYVV7 V 0XFܹ'f5): rr }dήӧO8]^P֦RhI-.,+ii]e ϝ!*UnO۾jU6v%sFFy%;vYh_G5~EEE9:փwtVUԴ4wttwz)Rqaan2}طf͎ tZ;y&˩ֶӧ7léLE ɒHEb6J--Ζu,/ <SRYQy]]L]Rjt:`ՕsdhLӺ?Z[Y*)ݷŅ]Fc_-5ښʺډ;mZh=ikVMjUQ d3wlh(,tZeZe4\Vr*3}Zd_8gΘ1b_nRɵxo ߬ٻg|޾6[UgR)Y΍q"`[ |Xپ`0_>{6Lfy(CQXQuH:m0HzzJN:}1it̂EKNA>kkם>ܔslEȑ))uYYu5$r_parPh4_mk@辠K?^#NJ{D~kmif}&.^|ǜ`hjJJ5fMpӦ"M]o8rdÏ߯;zТ>:ӣ֦/~qNFcgg{{Gdh;zZեV ̚M&F`~ky:] f`4FId"1QWD֨jR\ݵhjjR,sy`m10,,iBTtn^y ujUC}C}{d]C suup4Ύ9* !?/LW'&v8X==d.7?< 0Vtndߙ?R2bMF¦It GX.?lDz$$?p647Rխ-̶IO hzH挱u@hNdlTU9_Uf2J GXC|tF#e~f5/J/͸˶_٬TUל?y*;Gm45/mm Xmu:M ,-t-k4lXbh u4^q]zo4b-Cg21ԿzVKa=94ԕx0ZF7=%"-C2Z_{o\)**#*YaE;n,)I" p$XGb͜S -!*UGG{GY9òzԪY*D;͗p|ѧKLkk?w.=}̓M f˨S.\2B4 XRi1XپKf5x5\]|||W={ϙ3 -- ==F# UgO6+&RUW[[Ӫ}u_r̝]ݿ&UܢhH^j_loOBi=m$Lx<#-`6kz KKIcGZ[ؤR]>`v`e]=kMeYNWV)ԜFc̙Z]S#CٮݮH ߞ["4 sܸ5ջӋ ; ^J E[^=9uI>SFE\`]en23YQܨp~ի++%tJթj{EevΞ9vז:`.mՖKH{9\_ڒ;}¾#i4U<9"B,6ZP9lbim7r=RW;ⷺe`p 4 YfzObTBf2b/ o4Ql8/Z)F{y;s,6#{x>뾥;~;4{Mu29fϞ5'.?EhdJeZUJid9sfA-egMzN`8J'.^2}ƈpθ DsfϹ3~ YbG7а-XzAT- v^OH rvw`I'4,!y>dIBd0 Ev#u۷eFг0x BfZ1tl2lzVӣR:]oNdB b`gwNBMnPI*M *U[yh drB@:Je[K :FVlc4*mm=6Ȓ޽&sx"^٩exm{#MiaT kTy/&S ptHB_\w %GG4ڮ֮.o-lT*$FݭX l~o~ːH~_e`0   @h6 `@4 a0lVh!4   RA -3pL+;{R\I[Fx;%J!m7ށ+oR&i+4Tאbg5z)|+)cI `T:RzԤLmRj`GCUx;)2@5"b4)j+*p -3pTӰPAFx{R 7j_.'-pkǤӓ°2ZMnu#)'Q=*ޞHU0z*8Zv fB;۰% `T d JV**[-Y`x{y{xyo-d6n|=J]2О'p^ /ʊʊ0"<*jI}-8[[BwoFƞ=UU5^^hg2b6FXd'OK]JAX :)hPQQUU^.%RA,5465574656756=r䘈gZ֦VEs]I*qtvBwߥ)S2ػԢz\yOB [`Ty 5OZ^Zh4, rB&ۡQm--Q1k)-M&.e\* QQ11O8Q]]S[Y($/ wy&R.?߭Vvus,\g''E`J,r CB""/sw&BESS}C]}}iC*^OowVT~~.W`'tnSGiljr{G[5>..61:bX(nk'k8:%>1g; ]ն6'$ЗjΊ/R $+;lV/yq11?c˖Q^7^@!,~0 д ht::8((0$M&r/oL6bU*Z$9/Cow:;,<=cbL'lk_V|w/Qʫs/<裏{ lM6{m4FSI8H4 Rjkj||}{L6g&׺꺺 ?PLRX,3aBSS'Mz#ٸikϬ<-qcƍkhlljlV*U]|+j4ƑLLH ,Z;(j1:: Mʊ[?mvG iekhmU*C}uZ1|D̝bJ$aau.K\,dY3gΘ=K'g ͎a,F*t(}480*vrt&3 1HЙVd2l6bq$$hT**BvH-Bּf/AszL}T[T|+.W72~clT$H"pEnrP"m_缼>rOM$;9,:9K%^^^ޕUUMҲMM͍MC˞ZQ嵶^H<ޖF%ACCc}CSs_0h5TZΠn:k;m43W`NjdJwppPPp|ߤL6ʹ5$Ǽ<~9"<â䑆c0m$Q*5Z‚6`Ee0Lju)iSX!*uFTjIV7+xcOj -Z̄ӃHyGy˟}07~X+fDNҀj)SRP Bwعsǎ _x?… ,^,pvݽ?/V>…\KW\W^zAe5\m`#RU5)Ԉqeu8)Ԛ}}HA7Bx֏?[>s&/3fi駗.d^g"--.ٻi[8{|D>a¢EO>SEE:;_~7^;y piL*loog@e}>Ύ/jJx|Hx{6LBm%&OLgwWGۿmۖ-o1}zZ]w=`ͥ'Mrvno-(hh7~wha~^A~ގD>ݭk'9uM_eHhHHH3RATƄqc$M}cEZV&=r}gV;iRr2ܗ/O_cYR=ZMFԑEEFk>Өnelpmm ESɂm0P0{ћ %E h>O?Z*sd=<H߇}gG=0c3flym?QE_~W|{oƛ"'y3ĉSܲ+^}zA*X v2KKl~ɮ,Vh؂Kk/Hh Vㆼǟx%KBYU'>׾dԨJ IDATXùmMݻdr- :&yrJjlJ)VcE uQe`O7)W.*ڼwV>z]=CqGj }~1WVe6hZZhtp؜Ύ:ocg?",>f+B` rB.wwwvvttvYs8l6+wpIHPvκښEBJŘ1W`VL_*ɠ7 :Jw1nGhZFX# 6]?8t:74 6ؿoz{K~&'$'膦ypB $c,ML0~b99χ恮((+7﮻#*etʪ*WW7P/utFmX>s9DdMFgdO~괤)P_UQXp:w;|xhgg6|V5ߑȽܶҍ{6n}C|^?czjjdw/]7oy6mzΕd?8sLOI9#mJH>ks~W_9l{@xs|Ww9+-+(-f}Vrl6/ WJkk{B1&"bthoo?ʲ3VrwO[@$3 r&:|@VEsӡ{Jw>( }>M3>99yE%]ݭL 0/xrwRHBJKޮɓ&*$'3OlU(ZZI" 1cڴYr.HhfC48MֿT0Sƾ ,GM˩5U4AM0idlGH05B暛;aBy$yK􂂢#Fz+";.h*M{˳feZ-$)i N:u&:OVNNi۷mʹw!:W䖑AJkoުV?_?kKxNN>~NNWdR(NXen^[XtY!$Ǯw~g^zV;n={}rrnXo6wwgqæM..AArJU[kù= [耾@""D;?=;ኊ3ge8P_+]=ka,Un$?毿!evR]'$dܕ+~kܡ zCuclڨ.FDl 7kCsll`a8P /R w{ZQwݭmGnXcGUT:eZ̝wx|~~ֲ^Gz`h =6>^\W?lt42|ǟsn''ی#GFE%$$$F:uk>dlߴqLDTwJRh4> 'pu7?NI%ig'88PdΎΎV*dkuvJCmI~Jа{ɓgya7^wͬђ Z&>}BaQNNug?Yڵ/T= Hnm6݃d}&Q/fqؽH`}J~PqqqQii\lttlLE` 5'v$F64v*sH֪RʤNv,&Ŋ4q]uuuTH\.wssf[mIndcŁ$dCPGb_k_:ujZH{Y@?0)' 2p7Nf!w?olPZ2yrjʮ{3fQQRW[{]z njYy }^y_ ?kN8e{f>wWuv*HZ˟yg{_Z" @&ssX/믩wضgg'H(;;ήڢs=ݒFcSӱc6UY`7vNDQ☘{_##gr;nYݼ yw3#Og pǏ}۪*L&__gglx8O89Ǔ.^j.+r2GN, >6ۻEuR9$RS|{C{GY 00mJJJhC}w̙uӦ#Gkjs祡϶#z{'%-X4cf]mX%,'bPGB_ܼم4S`SO.׆$P9*2.68F ]]fsh㍵XpE$We'xn [F`agw d..gϞʶ o:ͥީ޿f|睉Ҧ.Gn4^%5霜†z~ڴ^ڳۛZ/⢒Ţ=<==́AVtwAmP-4aI-- EKR]]`gEb%Db./llhoɤNB.F"j~,ۮ9LcSH04c [?tq1FY]i7mٺ~P9HBꃃ>viSSSҦ^e+BAQ!ۉ$M^O.  \\\RR\6Թf]v9ԔIӦH:Hn/5B`SO?gl_5Z~Ebȁ&•Jތ}8I!xGlE(++**22:r 3g-^Y‹za0Ѷz}}}7f쭫JǏ)>`hk;wѣ5&׈iS'trboz5+vloՆԪpvIDEftK4}z`Fg㎐`5Iݓeˆrrfʊ8GǼS'/^v!e&RԬ٤̜AJ 홖nxY7_+Ӧ>lƆ={ F 7逸WSWG֛7_+^ټr `=_?Nz̊"Se?y,R~L ;x_:CY,tÏ/ziS/8pDAAMMkNdAcg͚pڴ#e\3kJKv>r$/U˃f͞`CJuće=ڴm߾w^ם;]eO<`P{?ZUEo=W$w|''3~)^LfoJ9%mJ8YTT[n4<Dfmm{`g)|#"RRfJJ == .TZh5r9 !_Ol045}}}m`KCΪw/H(UF޽:3YfΘ1} *,3޻Vkjkolln&!,}Zf"IT,1}jiB VN9s&֦P46t$cǏ 1j_H=v؟mtmu,IP)k@Bu2J I8^ON"Jv޳'=݃$wWZ}#<ҥ~~nTYU]SQAھCtUmtHskuerk?|x/ؗ㓘8qҬYII#W]=|(q77,a6wu;+=cOXرcȑv}eɪ#G^&$͞dZ(:zde?O/th0ttY~z}m][g=%AgE۶ߐ-u1W:]#m )@wP[d09}gڍ]ϫ]]nj+8{zxŏ=dn{ &<9a#|:wp855rwM LrЊ~j~+PK&FsB'Na˖ѓ&MG۷05m3)2|6XȦ k =ѕi㶭c",-2s=L`(rM[g3;vRԩ2Y{l߾u'}˗Otc̵PS{>xoz]TԬs>\d*22mUvwX]y}FQكo))Ӧ-Y2sVИsȮ#I\wgWkk`%X|+((vr8&SSS{[W75/ =6llhj\].7e=<=d FV7.a]M;~ gdvtgfؿ/?{|jΜҒJ#*:yrL"sGgey֙Ç\nZ:mٲeON:J--}g;w45IM?^,2,W&. 4&c/(<\,>s&''7B  C!υ9ULfpy䵖櫵FXfFWk}& ,]\XTw=kP! (8x2 nN݆nnCd$%jkmVGX$q^>=V99EE)ZZgbĵBfl'%MolRghzعsee5no挗_NOpƱRneh!!紾6juOZMBxKMMIIK6,q3T(Ț:;L&.;2Rj=F^cyyM3fFG;9 c* z.?4 2 ZV)ii$ȗeћ)dR:SǏ;zhm )z!&%Md;te0Dj)>|дi$䏿p!)i„IOS>>>{ࠧ7ςϿU57H251 j'aݻvkmsSSC{&$BM_)TMn}G*=iℤ<|>e_<͛ׯ_Vk$>>^ʿ寯o~{R +^˫IId:mJmflkoHK[,q̭/'sww?wuuO=}D7*(ltT2.0Viffz_9efzb}2h65rdY1}6vyQ[+M{:4! mWH.gs>ώ;t(;k„ *ho1λ b̥ ԚV]{suI^AػwOycrO{߄$g%(xH}w/5&S(F=zT܊ . 00 &9 r+*9ah Wry|ei#]h6ndTFZNk Q]US]YmΝwt+-h:{6+Q,v[zd_њ74TK5MNDneJrkԕBumsU?G+VJ8geg,ͱqOIکSk֬SO=cN|#o-tP*D=wea{xi$%V7.N-wR QT@kKսd%޻e%U: |rUV^VҢ dW:b4{AD ㌃\ioG!,:˸[R׻˧ɽmVW&rhmhlj$[P^Q_Rb0͝zc3DED~7޲;;ofZfa 辧-kme [/#N4֖e> +J$uUN׹l(sRZ4"KhC[]xoJb?0~6cF:$y &wzD=;Ǐ6}0o֥wdƘgGK2iu{wIcSmMm-yںO|s?-- !GФhX, KkVW_+%B&6m\a0WUTc],ֺtxgE2VrToS_\Ւ~w?t%ePϱ-:@ƽAj5}̒3FSY%)-5;z?J%WӲbo"ij2NF`|x$Ifg^R\Ϸ{O,z3YgN;yBRرc{C']sr 3gΜ9Cj+I7<;.Z߱͐ 792"߱yӜ.%\''_nkcbbccbH/g5֬wR,VMuMuuΖ2aQ^R5x\++JD`ᇋ?DL*|Y͘hϭPW{]W }L7޿o U{vSssVkFlkmg~mY,K&]]9mUHAcm:=BG,gںZZ.޶W 3+;[sp1a2't',ZpQ6w;[47 ǘLUSU]WOO҉eNr #@zzFz]Q6 hn,,21(FttgE6ʕkRS7&gReg%$\Z[{zx{;w\g07󪕔'7:o~ ѯ_dСF ("_"tIׯZ.{wK 흙>.ݱsHԻ_GGc&'G55W}#K^:pdFê"؂Դ-FF:;חt2Ht3R8Cȶ@JRRR^"xu뜭yqtrtrv޹sޝ;>FIOHKpw䓏>׿HN&%%-DI 0 C 1'L_믯TU cJ˯L8p2s~(@?vt^>>{k Zh)cnUUuuUUNn^~V6Yin^$TknNb=0hbn`'k iXH),,.!1Q %ZReed72?ُ5jHz9ժٺǏ:898X[ 6 87h4JɸƵ;nq :|؄|Z2m{C6nܸzYenfust*)%ϲ /vZNTnYsh%QL nDsOSKXRݷoާ?wصk۶iӦN>cbc>uڤ\)4F0<%t='7;''?ϧN{zħ%bH,/˱$ѝ7:!a}{S8̾}?=@СƖ|ŋFF;7h4y*+>OY/߿b{˯?yo?p.xμefz6Z90H ѽ:Qn^ҖW N~w}n~C7/(jkKz;[Kg ҥ"S0Ø)Kytyy%M`W5lڵtCUJoR^Y_/Ңvtt˖kgɁڶ3B'Mrw#ygj`gرؘ&Ntqny|tڶ:2 ~سуRSLoԓFSXt#Wu:'ɬ>p(}}| ~}osH&O0wdݻv|Yrr9rPw#z}CCQS`c]H\Za9;Hފ+W  o3F{tIڂOQb͜psK_T*gϙ1+,޾Iy-?T7c3bb-1bޜU\OdCi閭'U󰡣GGzx8:IlvccaAReL9}ͼyA7]Xm+O@I7u&]f}};htᑑQ66 [wr9''77; ޻gaCGGȠo;w 2(bd+:Vg֛]]&:JwNIIMMNH |RѪ5*5nT| djrJꕫ>GNݑз"D<:4)aٵ~ [Б,e4Ţ]Zªﷵqquq9{#ϫͶ-)A4f[а?֯[ddfյu2m`}48tXhXnΡÇ Ͽ ]-ϣĂ}>/(=yO=,1'4x`6%:z̘C9pM?g?ʕo3fN{f͛sV:FLBϦc͞1&544ӳlj"meɑ1Gsnuʊvl;p 3`pr JssrLRac B6l8yrݺ?֨C<<$bsgc]j{8q0''6F`kSȖvɻGc(+* JJZZ1huE9Yl6F r+~٪/h4̚ɧ2>=X{3(yd2Bf`xի5.)dȬȠmMD(F7}ivdC ꟊI%Zm~ٳ{_Z=}f7lgbI|ɓ֮_o)׿]_x999: C.o=?s„Ӈ&$*&am8R? L/-\]~Zn}W$$dsgWN7fȑܭd椋zQafFe{ztуBNXV~F3fLxxr9U]q2}PCC'M ۣG~oȨaaVR:7Çcb#xsPk?yV$`1e1wϾ}ӏY~~^rO^icIIqq׮_ZM7o76&'/6I,jc8YQnk:6W/~Bf%)W>cH\ΆU.^8u\'ye0thX+Yہ1Ap;_Sȿۺeŗ54H$^^?h͚Mro?RWW77[\tsUܸЀɔHFD%75nۺkѣw卍VVvvξaa?ܰ'zu%p~}w`}#FFFE !h[̴tT"YwsXa^;+*ַBj;}Oʭӝ4 㐾\MMmG氾Q9 Z3rD߾ }[E1䭣ިF=rGohY36Iykjr $MM\^_SSSVs8|._P_bbVKqspnolpx\OٔofdrLn|Avg|ǂNґYoh=Y3͝?WϧC3gΘ1klZڵw]nڸG=9RR\ZR^V]UuBK{03'/>F<^׬c6݁0 ^p/޸\GW^~E+١CG&ğ:sgBJen&ڸ Ӟ|'nwU[?jsr\ߝ>]_1k?r"6K!C_dtoo&B [BZ lt٠g]LtW0A&>=vl];ccv+WL~z҅!QBi|hDqb)T(\:t„wֵ 3Ll3gMZQq7/rvÆzǍpo;~NH/`]C98ҟ.:]uf{۾Тgupwƞ8iӅ ۶54Xl|~F?˒% 3e\j_w;{  vvރO2iƍ'O0օ%q ^?_(ܻgl~Rs@`g?yʂG2ɑi7v}ζ?3*/=_]ݬd|mӧ=3`Dr "Lį^^juJʩv \+gG _ IDATYƌ6-j_8ԞRHV&st2rdpRo3PطigsO?xĉK_>6Vb|-8S{߹G:&kd$_z!,w~ϵ,Upwǟgjgubcm3̯Qgo:s cdt 74ן=s#FF9%3++;3t}޻;{e%ԁƠ!d`6SdP:ih$R_G}qOZ("C!W(r>saV֖}7ikovsr|7_䇇ÆON???GG/YkYnnګ?TN{fŊ9s{EuV5gg͞=6_'mڵ[mQ#xs̀A;}E]!Nya)e2P_fG'GWvܹRBB|B|>}* u$ֹo]E(d(Nz4T_^t ݠ;޶0xֵϩe2[{ c\R7$s`vl(ʢ̜l꥾/$gãG-ff&o_W7WWS>}44&%^N|1|xx8Qg^tz4*ӧ޲ YhG-[bRz|P(D 557lڸq} 244L@iyK{߸l,à K5EH-ќo3NCuu^na~S{S'G.~SSjK:ӨўmOM-hD*J.^ˬ ґX1%+B-  -"qB¥Kvn ,tl%BK ~3 X^^>>ii))]ϥ%%eVRDf՝[FWv{p[XZXZ ?|ވ~ތ~xt=V2̺ѩY5ϞY~Z|REi_7ߔH<>tuժU?fe|7_ge$^IL4j*X,)+88:8ʬHwlH0hUgX#qMEyyڞn-cǎ3~|u tU"ʷȠ{] rcyo / lt$k5))6|p _/ٽz͜Q^]v?x|Ss bK<CmMrrylOdO;:@Qf>E"Öas0k{n2ZY[8qG=vP׽H(Kd2\rVAݠoĠ32RS/_.عkE/Mhii!Ȼ\MNQ*I튊=?v655667sffUwӷ_@ m˟lW7}F T H"s͹\#SJhf&6YG+) dpyd}zQ:)]wnׇ z MԸ#S-g'tUs5=tMguzOo}eGgí",:in3h)jkpgCSEz0nnc|-/c0\A]>9W &YJhD#s |.`gptWl ̧A{{{zEzͶ 5t:f{< ,VuUeE}ݽ&J{ZүBt@o%=k'lKGt_ #w޿O83??\?ˏr;[kO6 ;[g;0ro,q= 3頡/ACN7gX-t=BmHۏ368{kS t'> a>Q'x46=S tG;> L| &?{(( d4SaaR(> {Qצ wJYlR655)aWcS}瑁 lL<"AG313OGil"/t#Џ^{5}zֆ sbU5M$|䚓a2x̩(tah.:J s{JGf}Mf:sw;@K%d()xT4t˿rRk董F9ҍ {o"t=ʞ45kW4Ōu?(8<*6Nlي_|h…K$K lb͝;{9׍.]/>/! ,X)Ǝ?Ncr8A`H;ҏǼ@G01й܌.%\gQ֭[~y^}u6}?75:z~RݷoI'>=e*}_j$9~ݪU?z%^O? g4<aꌌ{O?5/V/^lŊK0VoᇟfP6o^n e{w* Z& |@oTX)S'Ol%x{x􆺺4#W/[2v||NS<>e떿Tgg @Џcw&.O6{ƌK_`fvsد_0LJK[b#Rr2oCOtD-;6/}ɓ1j#vOvm>}{QVV^QZy-۷I5tpLH>|{2xYFSW_RniiYyyEee55P$LvYqqG=[Z㹸Xr sfǎ'TNrk> Kӯ\|کyy%%UUMMZFSPWZZ:88:JffCCcVٳ1Iuubͳ@IYVq+%%'cj)SNgd_q?{x>f>669u`hj*/ɤd7NdY ,rs*u~~+WQm\Z"~кu~Ⱦ&ƈK]w~#"Ofdt6/Zbم fRҲG׭[dž 6מOgg55nr9{soZ5{ ÇWxotqĄފ].%E/<A\i\=ͣG@W`0BӧZǏnl\ Gpwq~l@fec#$R ;[;[ HPWwC66cǽ˯^Ⱥɭm?8k>_.k1 EXϿbt lɿmj#z#­7_Ғ%Kmx%z0<~fc[M9xᅗ^}6ͫ?.^L/*ut_~ti5jQ}\ǟ/YԜm׫TjJ_˖^?WwOmm}}u5,tWx㭷F48q„q:됈N}nЈ>?HWVTW B#|`P*d\221 xkee_xBffJ,rvrsuw75*+ UE>;e6St͝hjks._>{{`U<{{ oH|ܹ %(W/D9lywSYUX@.مT*++22ΝW*YFX=sfƭ;|x䈱cg=7z SSr]{\Jk `kTԩ_Б#G132;^yẔ={v˖UUG͚E:Llй>Xb]|o=cf@ drͥ߻$[@J`&]oll;juvVʵl駃&а`$))rfFqNͥeh K [$#CLo2666&:3anfckk#gø˖X-\xH"OHfY,fPp`P`ܹgϙSnTQ1woYEZafffjjWy?`1BR$j5wxdKϗX_un^ g Ǒm>vZ&4'㋋,ETRdfdg B]]xBf%V.8#=+N L;݌kʬȶ/:UQ`/n^&Ԕ&&Z9B`iaiajzFm.^^"X>eL*+[3}hl,(,/)(7M*o:^brZZHc2MM9Ё`h2z&35e;p\Y]~5Vdktr/Н2Xnl IDATBwgY@t>@'2̝3n\HP]`%`rx< K˵ 'vhޝ:=X|ۏ .v&];O:u2pc8Rs./+4֦;";c٠5:z,AZ޽;cgg=~ k6mir}]CCC=*Jeq469 {܍IY^^RR[gbbmiog%yTf2I456kV$ȅ ,H$XZyy-cýlH$egyz -[.S)*,)ml23G5{9ǸJe<5&&ff-TZRZRbJNB]4`pt.,>>B~)#"ř3|99%%Zm@77v{5Z4 @& vLӦ1۷=zII&&B͵oߡCǍr=V EXS&Wo|6>fЙ3Ϗvwq}|&O~sѣ6=dQˡ\],غV󪌞9JQfys̛̜9cƬYtgcI_h.k޽v_y-C l`Lټi֝;JKK˪WWjFciAf1t'@Miizի\sF(25js:d$R[;yIi~+W{YZ2jummYi^^NNM-vnv 99/t.2k>hn^UXԬ4xmqqF:̚31ij(/~~|=|P71*.- ɫ2|ВϻJjUiի.&$4;:ډ%<^_[SXdi[!75uxL aO淯Z}a~xV2&/].pv0a 7މ9/ρ% bcB vtpjkrs/9x +K3a(Z]0f:8ژ09yb]]C ñ99ʭ\DIH`"=gW-[hŋFI\||B\Bؔ^7Zt/=WR߭F55nn..NN{Q) Ġ={(CȰYKVksrSUT׫ @ ) NuFo-ُW/,JKKF¦u* yD;:ʬ5t;,OoUNyܼԔu+HTW aI0 ƬgO/ BJ%7k0h5)i׫ꛚZ6dzJ<<"SΎXV^'r޿w:]}CaѵkWdf7״pt SRpB,ru[ke5MJDBkBo}u{G#T\gilo-_>s7edlڼhW_\ YOzѱ\e.w\_=|o_s/ۘ1*K.|͵_S=6S* NڲejkMLB[[>~ʆ}oꟙ/лwZ]Xtٽ;!H#"^z8A,/?@rc?q=--F2Dbm]QQUU^^WWkĠ5b>>>L&dzÍh(<hZ4< :}6$d OξtW{xц4'G 1R*KKGQ0&N, 67VTeg]I:~իϝ9w6$dy:_,B'ͤDٜ}3+iI^|TTbWOvM<,͛/]|$*+W PW@] PW+@] u+@]u+Ȑ!ty62Z޿m+iShy[Q2(vd}K E>}zrqwc7lHJTQ[TKJ/^ܻg׎'MMRgga^55^8om=w{EGt 9wpS*6 _ߑf̚:5(JzP&S" 0cJKzwwum?ƍ݀ݻ*/7?{wo>y?ߡCZt`6&_zezWnfiUDGkZk-[(5__yohn4yBgUnCqE:?2r GGoݲgOb™3mm*ǀ1cgϛ7Amm:V[Pw}mÇucϚgn֓|O֔o3d %%'gذSΛ1#4D߼7~{2c7lxO>aTx+O8t䤬ʺ6V3rm͙7uJɹASs_#v?esAV+\z_|իE"!!˗G43-9E"myXZ\[,8hHmk~~aas^fmݿïM' Y=; o{RO ObJ9(vlxm"<P^{{~^ۼ93S?~Y|*/KN޳k}rrݣgxzI9\uFSWwpB3%¶H63Sm\Ըq wwb&WW{K33OHM9sE$sq5&jlT0w++"W׿mlOIeݗ_mRP4wѢ'y@*f %?bժcǪ.s. o00Ĕg\]vuuUff||\ܩ--2B>}<6lQQUUsLfo>hc""29΋~<5cGSSrr KKeR+ ,|ؑ<=m WW+Uyrb~\եnyr\1?Oz{b~W)*U/.>-~׸&B|A=Dbbbqv   1Hk$%%'UVM޼1Ҥi-rP67WTJuw*"K W77R$:QUU]-v4ii?䨜G?aVΞ^bf6nضmhݶt)IU}mݸ_ۻ+,l)S-8Q*IKۿo-?o͟~7vRqnPhjkKkk5jZ8żdhޏ>x{ۆ q9+VUAfŸsp+óvv6~/?WV?w<2Zؐdt:1} { 6++؞ݻ|O=33fxtD⾧H֮~ݭ[5S&?CC-;XX(MM.*$^a'*\WH%:}EEmMC|Rmd,}Aۅv3@)F(}WhRh7 ;G]x_߆N՞OlG-Eq;vlr@ffMF#ظWKJ/ܻ}ÆenRZpb׮k*;<0ru};ζ6, ^aձRVz!!q׮5k-q]LL n_46>g}g67uO82x"uv!4;&O ݉Dbe$,ru \sLLUذG&֔VT44Lեxxea]'=oK;mm5p%kyWԘc7ÇEFNag'45?Kq#2KӴ;z5G45y>ejXLP{/嗗Ϝys "#UJ;MYy̱55!CF7Nģ17; ~⻗Oinqf\]9Wϓw+Uo_]v'Wד+UoW]( bk}or%'O8YZ* Y`ǹ*0pHDn]rzʔ%z}}Cb~s?Д)*s 2tJտgv[ZNe紷t⥷M ;*_PPtX5{E,|}fzT\xCϼ|%j„{]q>!p4w^<~\&vtpqQ Gmm*>_]m-jH/ћ\Dbjnj*J& sTЌ@/)2ʠ{I?'݄;'7ncۆ >4#GvCK,ZGW]Nt֫W踸mruBgبѨqɅ{N΢ _|qCBB|\Nndl7AM}lnܿoBg\]ԙF++<=:RCW[[^[VWǏ_l˯א sJwem֦z,r8;;|}MyGH|םyQ69yޣG;hEOps;7/[&!a!!+=щ-(\]>'ϓ2?OzkRej`GGNvت\.Z=S;{A^JXЮpٺxj,\={VZyvbسgb9sm*|';2`A"Jo >;}KLjE{}'͜9uy'* P&$|ɛont?_bH{َwM ӦBښU\*ҫTSxx\JO-}f(DCCJʾ}9ri#"eƆĄ#Gٰ~F{;2=5ؘ\&6V 3fٳ$쬸m޴fMst}͘9pǝZ[;WZmeEfƙ3f^c\](\]kښҪԔ'xL`a %#\ ;tp |̘{ *xUwr%ާ]i4;w~l֪әZ[)nnF3rA 7ru\uU5j^an^^Ol²&/,|⤨qAAJE߮76N:q6[:v̐kɕ Snv(UU))NN'ϟ9ٙ+J,(JD1pP[[++~Z[9nF0rCQ?jk)WRp%:r<{?VyaNڛQoU#ی#|ȶs?=aĈYfω#efu}e䴴0G'DojjLS-'On޼e@@!! 'Oo"}͞diB5UIIybir;յV>h`Ը CB**n9q<-={z3"|XOOaE&W6FFbO'OnٺfH.|XP5yN4jwrՓ:PEޱ?&H}d&&2HK յͷ3?OzsUyrӹb~\l'W~ytWtAaQaaap[% Va`֤]ߥĄ:;yhhH-)AA.7ؑd(?a奰5jC?tO?f(֞={ΝG NNgٱ=8;ٛk4UqqǏ1@vѽhjKfL$RavucceUIiQQN0o&>|鲇vo/Sn?AF6>1ȑ5߭^m+1s(w7! %}{ssYuc֖zj^5w翬|0,jI!w?xG}Θ1uQ>ffMmMqQVVUmبȈAΗ^&ub¼ĉ͛WV*CC=ܭZ[KJN:|x^)z-m䖖z}UjV֩ܠ`YERY,ٹ=O3Q(wppwt0INQc?>!꫏?T'OTbc..qv:'ƌNsx ?._Z=jЗ%;U%13stpr۽k4E99EvGH773saA)gTUgRQn\鴵5))wO6DS|| 2eP7;^C.Xx޴}{1)I"˝?aܱc[Z~^SϗD1f̙m'||&kǟxdՄwݵhaEڵ;w]]g8g@8qxN.߾m16&%Z[x,Xӧ9%}Ў/Z_tBrsm .]6/|=>ɯoYkinlljh¢/x?]v=<׻qz WɕaJ]\tȦM{چ/[6nf@'WXX==CN矿n߁G:usєtKLT}}LUVFKKCZ--ueϤRkk^aiEU+KCB9rdƢҒJ.0͝i0r㲴^hmsAAqq11e6̜̐{8juNNRpbuPЌ=LLc'Wז+ᔠ=VRTFᄅ9W0hPD;2$0hk7ٹ#&w}QQ*K"3v<ŏ6Dbo W6/wY[YJ:]}}mm]ş+44RέErumϓyrb~\]'WM=;b~%Fhƕ 5Bi\ Zh*Y\M鳑I`e\Ho?g\1X[Lx'?iޞ{bKKksk<"#]BzB~_|;f^"xϟo}UxO_/uȈk+5kι(\Sd+ tU%eeZUHCC]\RRKKKz (P{6;\$rpAUO}3sgEa/65F/J^.)-,ȢRJ A@~\1?On$յa~\'WGwɮ.bCUqPcY%050^7#:77##;]4jܖ 7 xH_,|G;M|_|ۯue uD&&.*7aU9O$ >aGOLcXa\]On;1c-1#8X L䪛Ndd3[KKKjkz+\uE*8p?s3gu95%%O3Gns~*t?KMxlMgϞJmm0rBx<.0(h$wA %''?gg "WWHjkR&M W#W{f™s+U*' l4ں&Uee-e$\uV[[v xBa %"W=?/T'5vr9r$!.X^ߤ)5q9ZJ5fErumϓ䪧s<\1?Ozo;<\1?#@jZ>9I$uQ+LLھ=&F1|QQn2ߪb sK+ .0;gTT:-z톄;|?ߴ矵c#]䦦MCcEeQQ]uPАSʵ֔VU55ku:}eECV+l+&T*UvfC&W-_esrrssDĘ..2a_eQbgojFUWSS7cZooWWV.L-).x~ .'WWiJSRRJKLM5ߟUws%\ 3o۶;nݚյCxdښ‚7pooSyruJ++;eSѦ&W_W"QScEyA'Nta32%(؆eŰ% a& lzfԨС޾r;Tj\|bbE.,lCd\].Wfvyrӹjke~\lryroĴyr~~^HLLÇl9vArttw8Gg\59j} f(}WbcHȘCs/.3wh[4ܸUrw_O7qK}*ؑ# '>KfVts6pK]`;4XаoڵgNMk`ʕSyzJ91bZ[f%$ =رM;vɷ*#F,YzC&q2Wb ˁQNSJ=ut|vTjiikko5a%‚\\9\]6WW't/@66‡ kn>R_/kN>>'.[>x’ъ\]xen5q…;?#k%Kǎy]tTMI^)\u?Wg,]fnrKp3Ǐo]pu }%#F)$G.+cKgoKΞMN>r$5Anb";:8;TO6aA]ޝ51uspႅGedFGgQ--]]NhqDDPJ&ճHϓϕ緃ϓsgյjUWډ HyZo:eeK.0imo0xߠ7y!!B#~)B#W W W W >@@p+j:4cM: IDAT ǰujI'N& wtF_\\\ W W W@@@\N, =s`W3Vh7=j`aepK~ =X3B0 ~{‘m W W W@@@rrr+++׃@3dtF W W W@@@rrr+++׃ 8 ~@@@rrrzP A̅iDh ǘ"s *++++rrrrE\\\ W W߹7:'-B 4䷲ր~\cM +@zetع7n9/_h@_A4>h}^! r;~#EE;vO>5{)nʇ]䫯Otx)9JUc._ᇛ6[w*09С7=~~/\>xܹ+W /nisrK}ήIM@YZ,^_}y˺uKJRSLVVD*UD=<^Y]ϟ3g-[jj~K+=>:NE,4鲲~Xp_|v^Օk/_,-ҪowxE'C?QUea:r#GH27~;#GwϜ1?~$6d[Ju2W^yGr3'GJ/~<(}?t?tt3.ԪU<㏫;On&&Ɩ(%EG/\bET?yj5}=17,HL'IIcJO75 {/uOxoٲcGK+Xdm=iګ%$NNS/{p 3|O'Z9~WT6#wܺoQz捋23۷o={o~my6}֭--ÇϚ9~DL@_եB{jY nzQCÅ紪SOivvr'@[F[[KKkNWS[Y^Sa8lƍ;S=s{VVX!L$jnnimn3-$2. 7__s3psЃdROϡ679y2=RoI gD"ALJ@_j8O*rp2f'Q_bn ]{ߑ96G66aaMOI o?@eieeen.ȤJGgg77GGKK>K*0`ѣj9i. f@4'7+R{{GR)UT]zS(/+mmrւKq{l֭ZiQ?JsL,03<3ϔ65ݻm?5kVP@!xpwJJi^o+*˓ ׬y <=L16x3 7RD"D[\]^$ /,̇ {{ML֮}?SVw&>|Μf3/u)?`ݺѯ1j O-/x饧ڴX ?~mZG>xXX`Je`m͚_Nts޼'W*A,67J |_yw}ϰQ>˖=ѣ*c歷~dPЃtZY\r;#(rHTSS]]UE1?(?<\7/<۶q#_[VXdԗ_>7詧{|}%|Űa~/~}[s\`oT)쬭-lJB![Y9ֺ]{y']{gvpdhssCCcNиiy^ٹ+>:77i]SSH{.QiG@jRS۽:]iA{;=m&+>t=/jښ͛%Ag bE=BB 6m*+LL4|-).}ŋsO1)&&gZm^A\\JJiDbo`ghsrOT.NEu'Odew\GT#tԱ{SwǦM5,!! =iҊ{gͲ:aeD}TR͛_|V?ojoVe&!t mz}UU>`m-x{ <_N8_̘'KÇ?,T5 <<$ٹ!++=@ӗܾuK)x\…w=C-xtYg325 7'(rwy翏=z/j_xp_9W6o u?@'YX8:z P(,d2''Xljf'wrP_߮ij.(lmvv'~o-jl; s___ԵuujJWܶ}ڈȌۺeϞUb!&>+,[*3]g>8925 ܾoɓyeemm66'y__~E}?lB@ff|[?_o:TQ!GE=liKObpQ q-i֬+^{G۟~ "Qaa\ܾ}|:g_gG45[UNyg,s?fUVSOMMk~|Qbْ;t…'3h} @3(gP Ϡ@A4>h} @3(gP Ϡ@A4>h} @3(gP Ϡ@A4>h}. g޸ Ǎ3>A ????sz+@u:VG ޸F?nLO???OgάmVg`g-466656 4^hpHju(ЋF Fx%Bdt(#5dP/4[І!4AWF4^g,68@҉ߎWP Ϡ@A4>h} @3(sQgۀ3d `"aHXHU-.-WqA-*HZWDdѺ"TQ"kaM@d&P*u$C|Ǟp'G/@P40 $ h a:]XX\|Vx<-ݾ}Ҥhe ߤ P-֩UkNޝwg(+Bx P-Ѥ[ |`їJIiiu[4 P-?4p˗#}R|ʧ}E; 2}ر3ie$;q_?5h5_ZoyRbʧ\)U؝k}9nojm޼fͲe}o1cƛoΝhQ~ [lڼt٫ן|ri! P-7Ig?{C:lU>B))i}l֬}λw逸f͚%7m Hb"w{k;}+\=͛ ,>,1} ?fl;ׯO .7~In77oN~~F͚e7I#HZ-m{ۯe4s }qĊ ~8\!GMG0|9+̟>;~{չsW\nӦ[#oذZu:3.lf#weK# #hjQ2oްa'خ݌ӷUӯO;իiƍ5_?##ٺh5k-;oo; z<[o.b)Mŕgc6j*r6k#/oc̿,= qP.*7逸ᄏe_hj2WN?u3gߧJ=!C v[1uc6~(PTGeb̿?1G? @utPj?)WoӤ qx^sG%R&'|p))۶IvGZ{q<ѷQ22@ --w9wܑS{⋊=fLޜr@lRDO%%o5=GL2''ThIɒ%??"gFXLb w;Xp;u|r77m֪MVJݺp~YiYETR})@5ѤҲ>[jGキj<,8y筃/y챭[eeթ|ޝ;Nvmr҈(@Q0и%zɓo-;{ʔwЃmܱ#-HdÆ>(F RS;t-' 7. ]qD&((.XTTyIIhT"_ G9ÑȘ W_'M9rP(##%%%%6oܸ}4|7h G 722^+,8ۊ_ٹgzo zn\^ޚ5Q@E?e/Z~ v,ę7@Q"NK >Ok 'Ndqyxw3~^ IDATfH(@Q(1=/>ԔuB]+g<1Qb Ge3f sLǎI/( Q(@QZW\yLm[ѧ,9M⧬쭷N? vzSZ|_~4"94@E>t9キ|/͛ӿɽzw;7 E~)j\CySqdI&Vu"˟/#/ocgiQ@Rff۶9 >99Vf!mN;oM9y 6 q u| '}Vo~%%7.]ۣF]pM7zuŏ2T6+iI*[<2K캶Ϳe"/oc̿?1_G J˦LۧI ~ԣtq7x)btP-;6ij5o~n?7#FZ=ﷃ>PF";v]7}7vb P-o8áh$udǓO֭SǶm6_i˗Y/Dw?!mRS f9yOL5997KlTH ?h8 336 >ۧ~߸L6 o3sY͜9^fΔ ATG_pUKlڴӂ^|iowO?-MIă4@v?c-ٲ_qŨ^]nݟw7Ӧ-^\\\YΛU1Wbt})@Eb۶U{G9;6hPoM9WaæNY"=#.C&O^b1zj$?IMb ΜS>z*IM_e#;t钓ӪU(o )gOR)EP5+԰Yg{w?+l6.)Ը@ 5--b"Mڰᙧkߏ4_y󬬤];tLŕG5oSquL/jo/D?_#__?>SӬi mU T V:;Ϩ W ն>ry70s쌌@ D**`099))ݶmŊOx# W^/-$,YZyEMZ]E??um#/oc̿?1_'hh\rW^9iY_vY}o_S-ۧV(55%5%-ル͚oywۙ}=ԬY͂9@`t<Yt?>pu8E*JJ6o.,\`[`/ysS_?ϟ'~" *OV|P/ˡ&-"o#/oc7gih=_ Pe3ߘoV]4moԨY&ɢ)@ -m{ۯe4s }qĊ ~8\!KMTEG0|9+̟>;~{չsW\nӦ[#oذZu:3.lf#weK# #hjQ2oްa'خ݌ӷUӯO;իiƍ5_?##ٺh5k-;oo; z<[o.b  v qP.*7逸ᄏe_}?E)@Q nn 6yaԷ7N~~ZB_~;+lS^pKQ)@Qjj8rs'xsEez_5+V&1Rp8 JKvwO n.'v;ÎE7UQٳ'{ن\=`Ĉꔕ$%ii >˱{玜2m_T\1c攗Kb"x*)y9t訿<:fԕ_?99FKJ,y={0r…e3h…cߩniVmZ:P֭+W\J*+(Im{~{n6hRigZޛ={޼O>Ys]oڵKIF RR۶㦛qHXk5mN;STOG}w_ivO˟d9KHſߟZ^'GpѠA\]^!E4@5j׮Oi@ %?';.0koƯZUd|򘌚TX $˟/#/ocgiQ?5k+5˥|atl}ܸ  @(@Q8c ;g6K{OOZW\yLm[ѧ,97@QY[ow~ vjݯ߃^q#biDrh8&}ys{ot_7?6ɓ{!wooKP?@K@VVvvVdy@ Imӟ6h?1INΨyHNnnfNޭ?<"94@B;_ĉG==GpIƍKQ\xӍcƬ^]F J˦LۧI D q p@N<֭IM yΝS^qe6W^9mjiDv](h_=ɷߖ=eл }E6s$aWHb G:t떓SP{l.8 q@TTo,**d{I4*/opޜG{Hd̄&|y(|  7nܾ][4@\#~{{km3=z=y\z](9x\ ߻QGq-,*ڱ=h$R^^ 1RRM97m7{w7./o͚\ ^"pxٲ-_Y^VVÆA;(Rr SW 5'|<3Ə{}FAAB~](rjjʺui{]3 Q3 9cAJI>^wmgqQ-Zԭ,؛X 4'\u=%6m`_;vn XyxΜgvآ33[<+ګk֭}yڴŋ+ys*FUYn\1/hTl۶jռy/<~ȑҿ9gӦ ״15l)+Vqĥ{ }U3fSOm8$')"؛I_ܰa™3~j_OC7)lydǜ.]rrZ ~ O?]|)S*?f6<{'?wm&#;2RS@lRDPI6׾_=~~v;j@+ډ/k//{- 1w?csٜiohoڤb큶֎6|kHfZm&+'ۑ kVszF 6@ε~kSmx$)lہvjڤڅGklݘwܧz;ӎw^׻t;ކxy0-4SB!b~=e{>];P;3W}9If#` ;ys[87ʜ#Rh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh||IDAT !bh !bh !bh 1+'hn6qG7p)wpGwtG#ܑ6h 1z{ڕvz-ck604#W^9\m77It7'Wjnm2h19Ƴx6l\C|d6my|Vsc@0ID{H>Bf۽c504#R[{Jmxj04#:f{---ҟnxd2,յz|a0[7k/޸^Kvs>nAK471h Ƽ#ߩ9H|jWIENDB`gsequencer-3.1.3/docs/images/ags_audio_connection_output_line.png0000644000175000017500000013732113607210263022313 00000000000000PNG  IHDRҊdzTXtRaw profile type exifxuSmr )z=1f7F^^'eư|&#| ј&VE WLSQd$qP ljSsCSIP 贷˿M?iHMʭ `EXrAѦFR^m? `j66f1&w1,#\+_GG|UpAMfI7g`lvw(jVN j{0v9Oԇ$eWOV³+wo"/(|\ssxOoITz./R 3jdzTXtRaw profile type iptcx=JA0 >9Kۚ)\l;lA oV̎iVZsl\iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later 2 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx|e8l&MAj Q~,wNE=A=@%tR fMf{3 !)gvg}wf0o@A?:6?6| ŀGKO6<  .+1DE&2 `$^A)xB͊E#uEAF'C:FZM -; t#"h8:]CCvYY6Wj9ӧGDy l!BUYYSyEcSncSfLIPl6/`(* #/vø f #l6h4V8Nn¢ ͝}*X. J& &b1k]mJDbvF[[?~z *fSuv4?ͲŔ,3'"hJ%;O^W}۫Σ#&YcuZ*uђEƌ )̋ʬފQȍ΂=$&M?uMi4>''Dhכ_$x]wjV c@bQnBF?b K$LR M_}xӝŢP?eˏ?wWT66Ll8/ftC܄ Ʒn&7LpĉsryWY@`XL&^7- `&ߒ,lVkl6:CfhѸ\>,B-_-t7=fCP7>P܂.vټVsV Q dMWzęp2>uk~)2L"q8Qsӗ'⦦:;Z[JtŞ6e_ѧRԚ<Pnv84ڶ&Y u 2xףjfG򁿛 ~XАq:Oޅ=]*uWW.i$W&ZݭVQK# tG+&5J Zsb.nfp\\ 45K07/{F([0@`A[-(Pl@p7³1`0 z^7q;f8 HKk`ؿYq7ΕGk[DeGuH=Q'd)^zT0XLQp> 9 Dt!~@fIvbˈ- eYAn( $ZY8a S5-Wq†'wp0A"ຊ-[Pl(NeW=zhIBa6ú;áwt6ɚdm|jrsvsVVCz c~*8ES\3y|׀߀bDK](|Q܅Y,eqPznAA 3g/^Nph96۾QW>asϧe0.u} /|drr~c]2aiU֯T? |ϯ63ԩgd]] +<<5u¥K##xGڌ1#ϹLB$D1ľ#p]um*VXd&M/?n;ꪫ::U}Zp6,` ӽѫp!+b ȚZ[{=qxyDDE,d~6Vתu֚T*-K<É5f_~okg&*J,.*ɩs\v2Cߴ絞p#YX'*+䘘Q$+(ʪgsNJ֐X^.S v;g>"0@``حŽNDY(ny,ysfG{̚=ws9)?>+/2]J:}ݰyky$6;xu31撒*bz vh##i4OXVRX8SK˅ U~AAсAd%ח:ɩ)A\כ1unh%!!aaz ] 55充f39a„w16P.,4\y.? HNhFzH:_me^(/Q##eCb⸴(Y7nApٽEx3<<1矯[=ĉV%& op ]d>>\ %2cŋ.zt[oÇ33ӝnݺI,ښڞ^+8h\ZRR` sq"OMښ>5:~\bRV,rElNYYNnyyC]C}gW\R\~ \׋ Tp*ElhaKr|#LJemMCV煇Od+ti41;N$X ۅa"je\9\WV߫Y:zֹl"9cƄy =v|>r://5(P$cF F-e6֝;[ScE?._&&̘&ͨӣYq뇯Oަ uOM4~\klήnXL 5}WWO&Jb%eΩ{5+]JpPN..f]"KlcOE|>j.A&s|M"ZNnfFnNVGg\}<IQ (u-w^Xh4b (7!jM Nhd$ 9qyfMFٌ~f0:NQ=n'Y.t:2TY, Z$.=W`%l;+ު YGT]bv2:Hhguq &aQp]0l/hILtz ]:kߧST;! .u8 ʘY81 ( ٌaeXP3gA@3\nH^lNfF7#'MV9Ɉ Fd6ܽ -FdC|IX]S'7wÙus x//0:ai4YTZuS8W)΂E١\ަn>ZRR\(W)!Qġ֭۝Fry<6]ڢ]J+ԫjnԚ%+kQ(tz]$9߷P~hJeBw=}/vgiq#*J52A5j~]x׻΂ʤբ+8EoS)5Z M ?nպE=xIo@硸9]\$ZSRr#99:j:RYYyTVѕ+gK&xtzWWa*4W.etv0 sKKOeȚ,f?7g02<MsAn gFZͦdEEv}ݯ4%_hQTGuC#~7ľ7t6Q*2EK{V:L2f7UvEQdiW&ljkɚ@,*JV-]8_Y)oXĢ.Jϋ% \W_W"T TZYG2/ќXu)=f3`damWwbey\ /3h]0ù:ڛm}*^|&n7V*kxY%;׊B5J\i0)tn#kkklnh2Q+3/l]:g[٥AlwX,jܹ>5%(8&6,L$3n#F܀[)ftWWge:YPPSEOO?xql4?NaNFSS[T}dvvII]]W:uT/Oe[u=cƥ ?(sT粲:xɲ2J JIpsCV^V3gN|ZQ~N54|^B~ǧN8RkM$yɭ-P phԝ2'c2B' )dH%}Ow{sEsskkOx\?؄0r(>)yI=$WY(*MFT۩0&wsbe3a΢0FCWgC&c|Pb U$2ŹBgfQ6Y`|iKO$_Z\{&3|k. p흝 \ތ/bf0še_WΥ߁Q^7-([zSۑ͆njf\8-\K&]+#n'{*K6~\Hn;)<`Az'B Y߼> > #"L5rW@[PlP!?7Wn7d}tiߏ hA1Cv#Bp=( cF[Plܙ}5؄Mvcgn(Qqcp[29 z7j\i;ðې:;P$'0zF(d8nHV[ߟի׭۳G,M^\-y;5Wk-o5Kغ##J,Pl wHi9p[C [PtQ-a_[i+?@)8Ñ[Ayeʶ={wl?zALws|p$:A_n.}SZW{X .م-K[pCs ݨEEO;}Vk2hњEY_O6㈑X_*?zkț33?CMd꧟'͋2}}yNwi1p>wP%'ϛȣ^j1lƦ>OlVXE5Uv{@ -_ի{,##1t >2~˒ԥK\KN%Uk?ݻM(rn,fLG;pϚ#^O%eeZ &lǡ Z2k`Uk |9NveE{8h |#L  ٪^99s̚.$K3f~g⽼"CCY.k|E~~aA"=;L0>\/y\k+tklژ_/ϛ8HdO=3 %6&>>!חF_nGpڴ^4Ͽz ׍e@,jK̔ˤ҅@lLBBRTjm/p3݄1[It)YSqqZ4kΝ6|#Y,4LJ$G{{kkvX,ooo#ZNw}; ]5}jV{-:Q(/2c IDAT-12&NZj2vs2`7;[[kM0~D2T*bnln_' ";OgX5zӕ0od*m5'yuYNUd}}ΚYuFJ׷& B2b Fv3p >b\WWaPl]H"J.߉k(T>0,a{czIhEࡏ>Ç0?'K|h'ky#DŚV3W~"F3`00sVkO.t 5nq; ,ƭe8-!L+88"2Liiɮ7G35v{GgEyaAL7&N zD\.I!ja2 F.BYQ(cãԮv{X̀P?_V_{ԉ f%Y,덗ʰ[h8=b :nu8Ի* y%cH4~OY񡃟}Vs祦,, ƍ4),ù q= ܹeHחq5'o9K)ZWa͝;eJtēJp_~9r'8hѢ'JLd+Ǖf;Κ$T(do,b2&N~mJJ'%%wߒ%St?n4?0/c:ܑ#ѐnn^ιҞz'%;yLwaUՋ?7ud%.-{e͟"maݒpyޑ&.[t)uk9laDK](|Q AkUAA\ wc'Z܄(PqcpgQRB╬ln"!' g$ј+Ǎ*d2 wa[Dy7:RUlw҂\qP̞G7 ՂQ֡h J} b.+Fw+fE :S9nzE  ŝ ~Apo# w7Bqw+Zj:ՂG~B%kPpd B|J#̅*w+y/爑 n#>-þl[?-Q[Pll~|^vf漯a04+sfݺ^_mPeBR0ȑ]ΜD%в5VOϩS?_qfJ裏4I$"C{l" Ǝ}ѵ'& lvc2@uQϵ`!(.V[ߟ^}ύ W>W[yٳM.`ҥ<^á˛8v4'LImdx|OϐԌ%HOh˗l2*ٱرVJ CCI4xKV ?1i̘OE,-ý{kѡj~%(FZf p99_WEEdrt~+22{7?mfE5Uv{@ -_ի{,##1t >2f|>zo)9pϚ#^O%\eZ=x`ګjiiVtu*.\ɰZ#{x̜/xq`uz>3>q+Vq[||lHӭYic~~AL>ooP p%{dfeR__‹sf{z$$$%I6;e2cw{/c绋\ ZlCr C(S~&dƦgS] !qcdMZ?Y, Z!a&/\i,AUD̢h7\O3k9_f] < Y&sItb0PQQTXPQ^uIקtZ^g4ڬtH_j;]4Bq庺] uEX0hקRv&Cse2Qdʛ?8|#stLM&¢]gNgL2S2L%Fmq'jmQvh48KJ :%4$*:u229.n޼816&4O)qL&ʴ˗dSNoh)pX,P COOwV Wz#͙-|VȧNMI -,'_`#+]]Q;zJ%S-.޹s/99 j4*'Nm[I Ҡ[dTm:%9t~h+khw8햼<0qٲK[Ot-%W)qs'_@]klƦl,z`[[o?3Ĩɓ_?裑0`74RW7 ?_p⦦k|iin…0ydr"! ╬lP"(3 9ێkiEՉ†+dɪUA$RGǙ3S87 .P@([x ÍN"`I+ qb}hl0r艇2 @ !0\׸_i1p (-(bk*+k5knټ,Xڵ^mv|7xZ[/EW]h..BT)J}"RRM<)6Ã0*6[]O?U^H7Xg hT޽7h4GTُ>SOZy~˖u㆖YW^=}áV?۳';HHHK3g/ci |`5-Ud0(gJK[^R/p!lvlEVMK2hP*ڲӧwiSNvnĉ+|;)mǏ;gFDLEߚtS`$ןܾ}mj/Xtj??:]3ַ^\[yswdPO>>B,Yğ^^򠛠#O?}?ɒb˯Ӛ5i\.9kbCNM:zzJK e|~r3Oϝ|]z-}}J RﰰpoyLH M=kʽ|/?|ڟ4m0DˋY~:w;Le dg mB:5cɞ{O7#|b]ر>9/'nW_/  sgHLt>cm~xΝ=-\ ڿY\,xܸШ0nlƵL"#|A6{MCǏY,{ʀZMy+łnI YW/m,v~"Uj5+ڻnOK[O$Y?x'x|Juũ55p_?=ײuWLIq\.-^C0bQ\\hu+*;f̖͒ .d2*ٽĉgt::]$B#;N S~%?^{mo}xƬ_kvٳ2yGZm2QlP(I챇J+bTN%t3&m\Xخ][VUlUl!K'-m텅ݵĉFRc0݃f^8##1ݝF3*oݺvqq/񭷖/.]&7wӦ^۹Atoz*9,ήw=ZVkq_4wnbŎ&C;iVu~3c'c>kqh3/paxy=>YVP@䭢Ij)7Pf6]^ ?v{S=o3ڈ1z;v;v_JxCy$k4'O8q:LmmKkgJe2hJֈ𰋝Fsܙ3uutJL'#2 _ʆ }믽3,]:{65 >t/GCE8}ԓ:=K&E';s4QQxjϝXBB/_<}NZ 45x;+wO]- äadb6V4=F E@%lq"  rqQ?_gfI1#0pؤ8;L}aZgϔ1O=`}}y{dfeR_}mMswhwW_7dsj44^8_[k-^zT*d. #1R/ow_~b&)cbb""}n7v &Ak,60*Z,^AA,l2 R)q|ǦqdƦŋCCBTC,-p{>4u*R֐LI/0mZJ/niゃno2E$w=n.Z4=~9i& g,ȥ%V{w{n^sQwg0,:DaFh׮|-܋F c\X;/#oZjD-IV\XRntJΝ6={i1J)+u[]~X !IoPi4V+pЁv2*M&}p>z8;k/8~^))S̚={Δ)a|^+' ^ߢPvwRS^d2Ѯа;XK;w \ |yJǎ>t0;Lc gϢD/1qNz?j7;uZmRnBA>!nB7tAvbIVjS\9W#{\Xo<.an6w;S\tF&hYid7C؇kh`57L<$L./+?3!1'&pjlku8qwݡPț۔ýnWkjd~e߾&hRRLf`PXZTwhS 1qlJpFslYc ,̀P_oP%ΏИW\u },.N4ѢPYCf֤2e0zzu1E†GmGgي"#Ι3qA~+>ۃ ffxeњu+-JpsFF~ys~Juiƪ,ygCZ~c q_ 2**JeSL*: 1رǥec>tyNԩJU[{:73in(52m;SB"J$|e1ww5+tzPر> f}jU(jj)T2~*NeBPQ_X(1iII--tf,2%?>v/6mZΝ5kؠ`;i(뺺yBBŚklؔݻ&sKRtBdo|gnh2O)aXw'9m=Y!!c$& JJغm,i4Z&+/;uhcL<$/oO ;sPIbwtCXmo|iAï[Tj*j-JKڼyx{s~"\9NLNw޽/T~z\v#M؍8 cqeښ Ob]o\n=+<}+W~/tOkqq/\#^;ybqa0T}9ϔtMIM @WhbqddRrH(^[[^^XstYYcc_$t>>'LJ\uuԔ:[VV_MΘCX:yW`yI͹p|eAASSIٳMMz$'ϝ#93,ǻIǦ$$H$&LVQQT{#Ǐ啗74twc1䈑t77 \ge˦L F<&<ť姨(שB4Gxb¨Hw^p*Zm]3ssrЍ'ɘĉ'yzw8HӦ\a!#c83vİ0͹yc%%ZmPФ] $$4 쨩.--,+(@px{O}23%m<^tLbõ/tʼngM]uOӽRg3),<|xΟ>vj2yժzݕ+]]o{kpҳq88Yp=p.8~IQFQ0s[YTyxɓ[\=(>\ Qd@7Aԣlilhu= ڨj[Hڵl$t^u!++33/dONzlĉ^{1[ӂpz-_=}=CæN{G410ÁV-E֭a wZ%NK{آQQpt$ {Ǡpa88݄س^l0Ŗ7f ΅RdF_d#8 Ww:n.9`@5(*pV { NRK* Fa֡(4j;њEl"8Q,Dqo2MQfNt/Bq'/`T4 )^C)@AӰ^bS(֑[MMnLrJզD1\H#*APGF&|\b Q,&:5$1B81C~>DM\B6kC Fs5&Z+r8T׬ٺf^`kfdx{ųe{x㝷km8]uIRD*JI6uXrlu?Uy!eWxcB_~Qђ{/2rWΟd>txm⸧ ,~ߔ[,ăѽIm[%H?W9%o{?v!AWܫnR7qH./P (..4Jݺ[fIfKb2*ٽĉgt::]$ HH:-,L|w_x |A#BuYgjDBT3'z(eXR99Tm̘qaavmZUuUi/`w׎'JpwNJ={⌌DwwdkB䇏lǍ1c[K 13mD**JBqs  %afesn750}uǎ^]z @ h;Ҙd'{Uq<3L&Cz)^ `Y]u].跺\ Z]KBBzW3;cл'S9{WVpS.71uu HL3gYbkxF9?z>(]ckk//_ߟTj.DmmnZ,D-awka(|iA~AAK[PV㫯JʦiӒou\kk(5uUV%'vyw'+*U!==%%yyRId]"FcU^m8}ŋgͲ뫮ںu5k^xƅ>Ӧ_BˊN-%>Yjzj?=x˒ؑb(ήMLvQ 6%^}:; -~u[|sJZzOFvVS&]k}Mk{ǝ;Edvֺ^8\zPo9sOp73hnٲy˚5oedO<1w<4[ _up>;|mօ>\ofdKi8dk!j mgi[~"W_ qXi3f8?ZmWWvmsw7鮮CquUkWx#myYIqyRt뭷:;yhs|HpxCkt驳ՁD$Vk B/| SRn\b-cgwv<RRӓgO蔖WQy!OZy2Y{ 15h2>%۽M<~""{ÔS6s]1ff>lSS >~-Xnk&\`e9TLM"n39sj[']=W>[պ͛S₋s'Gg'wwGG]P=UYOKqTTxCoʕo69o_L ٝ:%|r3 xdKij2&%)Uee"RFWX6mڌNCV2:(Nw黱DF2Vm kY\1iҨ#|/A\ӏ)**))rI$^~~FڒƦf$wBR|ݙU7hl8_Vfi9r&«TA!7ݔtr6S$&mPXWzZ,GC-R/\x!-~u~5aj:p&:buseP^粃39W#WȖZ]]?7Ykl_/.>cE"cIA.nN:mF]==*Dbemii&;kiX={<Km[oMK]5;w|+441qҤf%Olk3 gmbIba\KXv]^ڧW>зkɭǍ3lՊDnF%$xznٜWU} ȑɳ|q[26w4Mb;{{YFg{:Ż o_̭P4+)ٛ7'O0?8Vθk\J5gP_uRss M{}!$,wO['nNxrP~[FN#|}~ܴ{WA~M78;kE-{{ap_Elhk;Wp32Nd"ޙp3'V$JuLLc MvUHONFTS}}WǦ>^F oK󳶶('^dnVV2зO &Z×/,fFobdK,+.겱,toHTXPX6yҔ f0kѩ{~{ǎ|u"y.IggYYFzJJFFgF4|DA8R)OrCB|]]mdfJE[keK ^[Lb,Jޞ֖Ʀʢ}Lzg 풒^?iҾgw*՜93g':9dJeG{C}EykMb1AAÚUTTBbHw}o6o+&Mqиqf7wn}7ސgϞ4),Q$jk?x`׮؛RD/m@AA#G榥}ɧZօFOO‚=;WUbq>H9%}-~;9 7urV8'O?YUn[{zO%';_,EGfח~g98tvmi90phIIZڶmUB>xi5,YYZYXhZ[J*bb]]\w}73;U?hp)CmmqqyyKRV55ZBeRcSPPdwXzHf% Gx #Gl댌yp݁Դ+?oF^n{}BbRp ,5mm.++,ܿ?}oFFAAUUWed8'榊>/Ə6\PZZX^PPQ&Od͋'NZ,5.-MKM{PeYYttrs[ZKK/Q̹m-Kf 9ݨpг MHuu+jjڹ}Νmm"OPPpH*=sgzzm׌2iω7N:ܼMt6{n_lnlm{{+2nۡs -n*k=fh nK˘عsnj17/-O?>$Zx΋sxހ nj]ㅶpu cGU0qOCʐicb /E"k'gk#G22vޕlc92GùLWNހxӏ{gZp?v]…{}Vgݺ]ѿݔ)]k8]zz EB0^(hmJ޸B߼RY\O>{]4q©\y{Ӆ&'[w?n֣bI(!+C:|Jrvu/s3u {R׭+.22qw5>i;ƏZ pgIU*bayC޴32Tgp)߿tj(l^8>* l@ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@a @a @a @a @a @a a a a a a a -a -a -a -a -a -[-[-[-[-[-[-[-[-[-[-[-[ l[ l[ l[ l[ l[ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@a @a @a @a @a @a a a a a a a -ݥh IDATa -a -a -a -a -[-[-[-[-[-[-[-[-[-[-[-[-@a @a b| pÖPK4"a a `L;"hkDF(.BO@?'-\sjb7F\|B?Wpџ3Zk^HPviH?Opٱf W!R(*=ur0J- 'K˾ή/?;t詧̍f#Ǐ?(ٱ۵鵵*ȰDXa$|5'HL qvZ|ƌ@/O֗œl{ew-[fgTL[ir\!bO[4OzKgθ^H$lMᇛ7UW^diX؋/8[Sc]F~eZZuiS-e2SSZTja#g?x?e3aٹ۵k~#"g鸹?2Go}]rĉ^÷ٶ}+WM*ptx721vvrvV+HsWMEyy::*2Y[ΙbedtDDtdjj]'PW8x8ӋSSw,(ߺ5/ALMLoV+57תf|I-,-,cf괵Wo%WTUUUziK3xFF0n\]Ko_PS-ժ;0hl~ឞTjVlninj:mmEL**;믊_n.0T Y J%/ }mPP*b\E$Y:vttruwuwyz7vZUQUQ>0X4}衇%KdB,򊋋5jԬٳf5}/`}ss_8q⭷vvj4u]Je}y\|eձcŭMmmKyp~l՝[=5jw<#3gpՇKr46N>8e#+MgDO7˪ͪ QjY><Ʒ aK6L/W wvtuNJKRSwH[_ZZ_קZZ:;{{zxzEnj?aȑfom}Ï^zWsʧo)$D">' VV7y;uZ5zY?#޻Њήؑ77/wKV:;9 ?@mkmk5T* 8WhzjksrNݝs`Eѣ==rXlnncco=bDܨ&NJJ󵲼:/.cw2\=ejUM__VR*~~ffIIk޴84O؝.M*.ϫpՑJ q{ūà\PW޸ښvn}PfVu_{'<bm{GaW_ʿ^ݻ̓ǎsŷ2BC䥥۷}髯Gj>vq֬>]=#Boi]1jҤIkm;tF%3̬;8h괩4FMMYvwϿ :=/ؼk}M^^wc%Ͼo_tѢ9Mյ1pA,~J׷a]yp+kZʊѣc⒵_F:؏samm kmm~y9sq#JX+;|jbƑI󱎎>>ӧ'&P"1% Ni";Zg>`sLx+m( Gw|wͻQnj~?kTkWXz76dy{z{:;:; Rk X]Ucscdi3yk;;ap{ճظa+)ҥcz RW~itu kyݼ?ўCB |}nuƞc-۶oӦC}}[6ww5Zǎ?ؼ,1≿J$4cyrm]t􍋼$cttp'q̙\]N[juy߬\sNo-[mkS*,CB[tӬY#Bm?ål{;~U*쳿}녅.]&r=o}D|m>{} ,,/ukRRrnyuYZmJj뺺Q"vML KDsoo{{cc!յx;9ڞ*Ž=G'&O?>6:??'L.O;4:uMWwA_o/tSDoޫFӯ#lhl765 Bմwk4u:Ro oؠRy/_|߉\~4{AAoYcx)@޳kWFz~^YYіN50 1aΜf͊rt8>9ཁVYk׾CJ3sWIs.9992 Vwt8ew6攕 +LLlm݃Ǐ_[M S(߰~] +LMfͺƹsGt8KWf 80!7g/k̤yzo}og]wuw΋>'oi;loW*W[YJ>|l_qw|1;f]nh)D-!YXEJ$ --g^vvgd|чJ$3f,^|KΙn,9rd?/)?ys)۞$(81)nCooqq^nYBq%X8:2JŬ_olp@ZÝKnIJP3U- u(Fn_)K _ ՚MjpsuݙD"U*3sth:xl"w7/owqstǚ;5G暛Ov5n5z/Lm|Ͼ~QNNMV٥ŎN]mm5:+/x{c-5u rSGCʎվ~cΙx]w-_.ƘUl޲fom\[w=+3󛯿:.nΜn[|ٲ7M;kٺmպ7so;a…wuݷ6gNbpm԰?PlYK/~eYmB…w9{v<+_ ym:=訄I!!pC/5+22J~{.\4uyO?&uL^/s?m ֡N?i?(_/zi}f 20t۞QD盐0j]yye EXXùV#RSGdW]n U 1payFclVźӅ^JBN523a݉L&v{ aLMNMLzz<-OOj{ZDh* \h|wWeojLLsr0Y^1 YxB&7'7GPB՝ZhTΎNWWs3uD*^ԡMbҥz01 ם*\[YYYjj<~|6ug_ݮQq>7vu ABz(W;4%5Fjml,,>t˖Đ'߇X$ViuGA!rp@-NEX˖/X$~|uQ:JM6 lۺm[|ܭnUb$⤤JUHHH̙3gipGghl^UitDs[yx:9Ľg9Ztu&{xx8؋}=}}C+a?0))!ԽpryyŁ2=8_|p^~~F棍MۦlM7xdq#XVW?8[Q587kI]hh߿C&P*r87o+'NشbߋZ]SܬV56[zuq;I ڦM6B&D"kkkaJW]!vqۊŮnF%$lھ=/\:0PRW^.L>$?͟ba;~LM6mܸPO/'ǂʎS]\ A! ӊ KӍBnlmۊ/vڴTєUWիTBC]jںG5 Ow;36ݹNxW_5|ݻk֭suEF\mħ9r_|a괇za#QqQqZ;7JH.m-)Nٚ2}yq @:7?7wv9G?s17 9藍0YPWU)1AۤP4+)ٛ7'EO0ijGxcI<-*:څ;'6VV ֨K"/X~x3ƍ;)+|dB33pn/;L20ʵ}[EE__z0/ˣ,-_֛xzaa+VA{J]U_8mڣ$ީ; YpݯFL:Uwӹ3 wjLM]m&'^Svqjiqqcʏeer{GG^nE}\y>2KN]h?_{eIL~]P28h|W^YB޶v.ζvf3g tt841 rs ?sX˳FÇ33ۭ""c}}Ol{hb22⦛-s]Sk>Gwg_@xIKFlf65JeTTV#?1­JU߰mVޱ]$IJ7oƌ7Nhggogk?{qOMOowwonM2zy͝'<9k 3/])L#; 1E 4i=륯~/uq#b"ef”OWWt7ԦJjuxӄ T*]谳uc֙["&fc]#T6⋯ܷo` 0h3Fd&^3ߵ[bc%&~{nPV6tIl줱cfTtY0Qӫqƍ{7,X'ܬ8<<|JYT\Tc*ZO={R<{x7w`Q7ž|nDѶdԋ"3&""0J&3Ϻ|$C/ooOg,++;\jBB}̌ʪ_wOJX\ꄿQwba~CTBC}ʒݻwjlrpoyYLH._Ygncmmcm|D#LT&:UkYn``d#;t[0,,rpٵ+,ٻ7#={n.)hBBG/*mkVgJ$JeggMMQΝoZ\ަVMm,gh1fqV[UX_YVYae7ejdrD"++GgSi}}VVZZzzaJU(+ 2ee54̂˒\ݜ\RSwH?|DsPuu ^.IMP[zÖP.sJb-aKgIDATu2f 6~pgt̏)YY}jn>ujP*3Q(޺嫯22ZΝ;_Zgeήy.n0xО=>=*J,)޻75moz~~uu_UTyw-No+pv8|8#cwݹ9M6Q1_&&iSӞ=^^ӧ/^ɉ.vme;p@ ^0<\zy 5$tp lx7G᏿PO48k–O?L"9 m~jӲ~-s<Ұ3<„o;a/l ߽S u۞wte;rDk|a?TCe`>:op ‡_C6[vpJ6-KZ2h9h4-y+%%K,̯.O~( a wkjaʵ[b ׯX]l{>!')S^2?aaD(Op a "iW5DzfBf89 ~ t?!lcHJ(z׻fX+- 'kaDB~ ~), l@ l@t4Pbt9BIENDB`gsequencer-3.1.3/docs/images/AGS_recall_lifecycle.png0000644000175000017500000013220113607210263017455 00000000000000PNG  IHDRq1zTXtRaw profile type exifxڍSm gaB :~@^ժH0q0>ޯ-VF4Rډ>b#jm}gknP{,;Y:kPyMD pZ7NĴyY揭މ+*q;a-]u@҄$3`P^9BFNQJ^ۡFSlP RA%_61L&\zW-ZŞTR99Qbp"7!㜢' AM6n/W-'xH R cK\kǚ}W7=VҰiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - flow-chart creation of AgsAudioSignal Flow-chart illustrating the event based tree Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ; iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxy]u}?~'IlI \ U"ůZiXYնZqA,BX԰?wr;̙}9sg3y99}24 ]6ruzwWd崈q6_qdEv9=72#1OMrSdt[22tZwZFޒQȀ#掴?Yn^WdS"S&91<ߤ_J^GV.g r}Ix*`y0RUק҈Ѵej3$cdܓxYGTxCH:+ռz^U}#F 5FOȦ"_KƇRew"L>5d|lM?=#7rw"OJFU ߓIS#kQb2PSsitQ(%Fө?]ab7ͻTAvv;IAaה~9/'E~6IFx vadFj}Q־eiGץK5&iGN?#FckqzƎ?蒈uVhM:S13ݾ8Y$=h5HݾHMOZ/Ύܘ:+Ίe[ھy->w/0 eU:圿| :wC#G1rM鮴rZ}Zc z9+5&-6[n?gi~mF9:Rrj.HMe=<5MkAPw~OsR{=7&|Px_ω4?kI;K#fTpjPX%.[DP:eH\snJ8(]:9HS>5Rzjn_Tvwyf:ҿ*ܔ^WԹe[SwRsS̍=UEk~֙gG6$|+m??R?KЩ2+Ouf"qMX황fE\rYdG&h"egx"ciw&Ϻᛝj/ϯc018wnlD^H}^fЋ_}m:+̞adPS`zաnYG4ZUe 7F<߆'+.18HsI:0Vj7.R判"^9䕑ZaV9'J~N䆛"a`:ӑZq2>)0IMO"ԡ?/r[2Jֳ95*_ȳQBMV_eed'%Fʭi}#uX.wϏ@y,|"pFz$A~(19)0dCiƆRK՟҈ѩJGSՑf=,-IƊ̺)0,w'EH}xQS\4yFTn2IJ?N߽0_?\-w]9̈ӌ)0bnJitS1o5F]-iA呫G}d#ӧD&;kO3Ff$PS1gG~sB20Nɘj Ў7Hݞ&wۖwEڛ)@jJnۛ)@h'$g,bL5h5hZsS5h)3}5hM_nۛ)@ 8@MZF\,UĘj S"uA@MFܛby7@Mc-)@j5hM㠏)Kj 7j Nwo4j j  8c|@MZFY]S@MZ7*鍦17ř>Ȁ+$@MQSB )@Kh'$E `o m}iMY1&kj 7j NS׉<YM-o4S7{S5hsSMEo4.=)@; X,n荦yc)@+L:u>wM5ejmy7@MFy)@; XmUĘj Ў7b#PSVpA@MZFX,YĘj do4={S )@hMM1&Gec)@;h 1G xi.1&ߥRm؛2%2cGZ0)khGޙHh{St>7ӳdAMXC?}{4Ғ4`nJcoʏӋ~[nU`Gn\x]3lydgE/2=⨈)OF64r‰c)(z])klN$^Pd5XK^v=mW!1@M֒ڧr#ݶyc)}*Ke%%@M4 # nZz\1&8P)Sp:`ORh5PS@MPS@MPS5@MPS5@M5PS5PS@MPSPS5<)`Ei֦3ώ4gӔ4gF3"GSѮKgFfΊȒ۝{VՇ?3ivZoz9{D;9n?R)0*NOOEn%ҹeGiHιK/\|a䆛#ҢzXEn3rMjUyyϚ}\4-;G=&f?pPq=X>'3s+[{SykR;S/=)u~n5R_}qGj_{ [72w;P긍{}?X) s_dm:Po]^䡇#;?bY<}]FVi~n=ԯ>RP5*C~6{0¶>}3n1uY?4r#y!w"Hj_}FwCy׎7@MQ7DK=1GGNKS@9<5pidFZ?ݜޒ:zNCy׎7DgT3$fm9+>/aE:Hx>5#_O_&#t~:fM"WP5*C~6ޟ`n .; ^)6j j 砯M4gF3"Goc~FOjʔHn3;rcz0?ɋS=[ms?4r#YJ+Ehj L"̌\:?c#mj4?y"K#34G^8=1yvdM"c"{^ffLyƎv ugDYd5R~oGWEIun?/榠.;=a >S_A@MPSVqPS5@M5@M5PS5PS@MPS5@MPS5@M5"`2[ cSр6 )/o$1HLSF~ALײq`ĞQ:/0ږiZ_䑕# v`ԭLt։@M@M豦E )c))=֔n>- k@OHҥ_9?Rzpџg.'md^z\tId"'MՎ_$ 5NѝO=#fd&65tH}\N;F=Nvޣ.AWDv5ҹi #~GNi'ɾO~7Fz^jJ?̹]DꣵO寓)$򥿏<+R6 \z2C)MOM?IGju/\ x y"B5e,[vTWz|5jYz{S,f'/F݀)ktPSF4)L23}5`tjJsoJĘj оPSvԔ>#zB2 4)4:)@j))0ҜBd@MZTS{SVF )j Қb|@McU}ɘj 0edEPܞ-r߽44)UqvzfD-òGz[ӂ]"_Ku'OҬ)ӳ92=[|{`|jGEˮ9#igDQqN 6_yQHJ'PF #k}(b 5/K vY/L{nj 0*jM.ǒ`rʂ<.ɸj pR[O^CXj V"0?у^yF2V7tʩ~|4b53*2oH"OMPS135-Z<?FPSV~(2oy2&@/,+~FeQ.[hnMFSi";97ݵ$}M{Y$# ),OSE6^?T&MGȟ'"h_L% 뮿QO[li{zpEVnV~zKzcnI>d^zu\tId+t@leH;Ǝ;GIw|:lT_qgG:S%o 5EM& 4cHaڷqyTo6i~?ӧFo5EMƽZ{&ϋ4 ߧnNȔT䷌T|t柨9!wȀrIIƶf*>? )j j##5͚rF_aB.j'>!ImWEjRX0VNkh|Mzm^&nUĄ\5x ItZ_lH)&5cB.jI[:z;kH}gɸ)0:^ܓ7`׈ )j L@MzLEMQS`kNza~ۤךp2n )j &RnMUO̍t[ϖGqCMQS`jBnsrQSLz}Jy{2n4 uB]ɸ)S_| 1fB.j2kk_&5e u}ɸ1RrVϺnroJMMQSR:RSԴJS5CmaK.K5To^6}Qz}2sBzFLUSƸ?{o䄓"oY%*52m;;2ưI&24'>sAĄ\5EMajJέ7m˚vPj_G'5'Μ1ɣ9!wM"&)j kGRuI=j4 uBϯ75EMaRkNzّ\nnĤW{SY&)j <'?=bҫWw$r5I~VzRɒڽT3jgRj>ZwI&8+R<Oi#^[MvϧӓS|s"5U}M&=fD0gD)L(^Otd֬<:5?zّ˲tw:"]N{Tۿ+6|'RgU j>›Ss5/ܘlpas6G~ݐfnIO\5EMa 4'nEۤo$gTMykR;Sh_:ItmȗRs=<ה;R5yN%l IDATyW=pLUSZ0>}FtݖTלsbY콦;fUߏP{amBnmS@75EMaΚU#H/V3 zQo(1Rs{zѨ) j¨ekGLzm[MGk@tXjnTHnH摔H}:1GԂsSH1S #؛2.=wi"\62RkLid~k2O7VM5SsbZ|nX)fg)Rd|ԲVh0~jl]C\ž*qSS5eԄܚ̈ Ԍ^jJqgH^<7ǯ?Y:gNץ Oc/#P' jLRC[5{ߛG?/T vC}MINedM"jJLzUS5e5o|;I57|nJ5}->zT;Rm蜛SS^Թ9L5I^Ň5fԁJ=ҍIjZUr{W5TEYi85[ajE_SjO[ENK;-kJk5=5oI||gte/?&)j2Ir'\Ü1꼭'!9^5EM|BndBxTRr||2>#姩ۤǯ1UMQSń܉fԁ:(sё:%ɤW5EMQSc&B7xuNz()j c [l 4*&)jBՌ:PKxdҫ)L OȭK뙐K􊚢)Z/rk}rm5)j P'.Kƍ5{SnΣ+uZ 75EMQS`Z2 {qQ=[*b+j0bLȥw&)j clrԼJI)jB{}Boqz`H]'75EMI5|M4"Q^QS5 hr25EMQSrcd y$5uNz37RnM 5EMQSrLmLzmI)j=Ma~ĄݕLzEMQSa m1!7>^QS5֪^&n&ۄܛI)j-29'􊚢)0.2!"x~~Eۤ֍􊚢)0nܟח/rMzEMQS5Ir{&^QS5&NȽ>WIyG_ ^QS5Xu{C-' j|BnrMz5EMQS`-ivJ-7O_' jJ;~>ȏ~ן9țR~/=PS֪~,<ҙgD>5`uN=ե u{T!pmd҃. ,%75ܔ3<"Hs#^ 7Gjˢz')=yziAGE R6'ϋIR0"o6PSCHj }S"u@MTSsS)GL@MTSM@M{S5hkMɨ))[j Ц>)C` -m)j }>ݝ8+ӗҵj 07#oM#ܦ?R{SJsg>>[@M5I[GpJwoU_OwT9}ĈQ`N`tzu["79UyK"FPSEi#SݳH#,ZE`>kAtAI@MFai?Dh>E^m+`>GrI O\x`-ͮ "j 0MϏt~}'DcyU(j 0f̟{N81b}i]K,hLT0Im='r}engl3;rchŲHs7Ej]iȀ;%ҵ< j 0 tO:>8o;6rёTO\O7dfy_PSqi'G馊AȌG^wD5u'D0=wzA?(#{tՁqZShMMmZ{SRS5@Mq&U]|832uYnM6~uï5lOԟSDk"U3E?ok" ґG#01xOԟPS`}Ȭ"ǽ=f RZ}㙑ͷ|]KYozdv4qc: ևӜm#͈LJ:R]Ix֦3ώ4.g9+r+#KG~t+%mEu6_3|xNyЧ>TɱOg]ʫ#?q #ۿGړN{{i"͏sn"_ȲhamD[zX$;qV[DNHoS#{NK|wdf}z "%wG^ȱDL b˟ lߐYnug͝5*u*ryukϟ&53Kو>'7{{K{T?Wc>w[72g-o|P>~wOdT;v_sVu{M_߈\3D2?퟇z^M?K-o52?5nnumi4\'RZk#hlNȊtɧ<}<> 1{W=3 M7 XsItk_|_ߟG}me#_HwQ{sΟ~ 1gtnYt)؛TM}HMfܦu?5Gno{:52ռ})NMz/&Wst-Mg|7!r\vO:>5|pidFZ?UxKjIOD1GPi`o)Lv]4H5'` "5USXwZt샿*H~=ufLS#gT0?+5V~*FvoT}ܦ)C}ٛbo؛)Fi܈rx@xy-)R묓: D^iz+gXrXL70|5etYFj NSSM=#Sg)0hY iNj )j )j ))j )j )j ~C@{"}o4`|q@MaZj s"c)'ԣ ؛Sh0ks"Ly{SVD0khƑ>{GPmޔ# ),JuK#^d}"?H<΀)`< ҼK"K7ejj 0NZa (GjnbUnO]1@̺P2czɋ#߾ m6>j\PScd`8jJey~N@MuL rYd[MȆDSVF' 1MΔ#'[N닼wYzO,7)P9N tuQ^o"tUHON+7O3@MZx9q[67ҹuSG*ҹJGENZ'*vޣWH`}GsrU׿9rҍqV.:"PS5tYZK˷G|d-[>V`Xjq?ڀ)9`4Rfn -5`oJ_Ęj dMq25hM@MZ!bynOMPSV )ǀ3}r|c)@+ X75}5hiM1PSp ɀ5h\mYvB2-2`n) ˒`XnL{%7tιc )<3 x@gviQ} Mc )8yQn˷"9$ݖKӉ #F>?#% K-Jӥi[LjeUdy_F3"oL:wK#]gIL1) âxɂR; Jy# IMFa=R;1`H۟tJ j 0'#od5XKN<9G}MF PS%iѭƈ`KL=d5n{̍>@M%Hsiij 0f~}GdqzfkCG$r#Mli/C5@~C U]q+Fju9Ցo3"NG1RT\ x+"1ei䀗Er~qf}#uymE{E5R?ʤ]6#ͳu2;Rv{d;֭gίˮsjL KS=""M6}?6$NO4[F3"zpϚ`۬PSGm}$)qG 3DJ6Ο>wN?Kޙ<PSL_H5M6_ﵖ_?o}9ơƤ5EMKEj):ŷꮹ&u\&h<@Ulr&u~z.)]OIϏt|v49TPc9VEjC3~ުY\^ +G/8th˯}kE)C28L}Ծ;ľL$B?%rbuV['$Iuq5Β85RZ5{4~kI'D^ȯ]K6U8B9M˔)0`Ⱥ`BTNwR5EMaԴZ)t;HT;ro]&; 3z7jm:[K 5EMQ\'7/@a:.8OB}nr=7AMQS`Nn]yuruz>=5ZNn%Q,6>RۤxߵqCMQS` u['i ~wޱqCMQS`Z_'bVo#_ k)jɭu9֋kSV[D񊚢rM+sF\LK_+jurzuE&/\A5E[;vgI1X5EMZ:u\w/Էk)Gͽ5u=SDxKT?5^QS`eܱbsM6M񊚢,5y0.WguoLEdW5`:mbu}.PSzY'buofl|Z&sM髻Fꌛ/} \Hs7ܵ$Ҽtdzm,UޑK.TMgIL)~pls|WDj-w#RKUA=(ǧ_Iut7zf֏|cw+Rd {S|iLPS5@M5@M5PS`wy~/+@M֪~,<ҙgD>`=픾szVZ>lhF`j>ED֛&yPSztƟGV3>RRۜsn"_HwY0|h^{҉{|/0sPSzӂț+r j y۱c\+᩹k^e+67[ShҔ/ܸ8E>tZ͋#;<=w_OPSt?%?d9`O(OsOIcL5PS@MPS@MPS5@MPS5@M5PS5PS@MPS@M&U+"u/@M5PS5PS@MPS@MPS5@M5@MFSPSI_UkӚ=ӁD.HPSa9Ցqێܒӛk#HPSaY'tbdg>7;t+rLzʜOdEE$c U@kfY~~ő -YSEzS?PSQwDy*oSzU2nDraK PS䵩uO 2@2I9+, sB9}2mrX<46^ =Òpj>ފ*1Mju~Q!>쐦ps/?;>\iܨx8ϐ}-_yԧ}WpnJ5R=H=M˔/Ly{B˴ч*OS\>DzcbL))2@-132@U\`L * Y_*!Zmխk=F2lrW`o@|g(ެt88ʈ0yI'EV-nxi[+TGaj.VFTd 504e^+R/sdF(=)^–=U Q|㬓{!]}4s(-bñc>G) yߥ.>6ҭsJ_KhYjU{yɍ8P3ujJw.E -)Y3nP !wgyeg('N0/HYJEx:owaϽkS=̝,\%]T,[kwrYʲ CǴv1|_)>y/_rOIb񤒮O/)725X˝oQc~I4r߂0`偐/R^Qɾ]G ^~teTeӺ/Ա!})˂w9!]s:Wu{jwru ByOTbSy޾>avYKMP]W[YGq kqa_ {^gM:7%.4vz8jo_>.n{[q;оg<%1c?Wkd|}}[iϽC .b. >n֯UioJkZ%gIqR:_nWxgWxI^ۮ߫zS})A)sBo )MKףQYۤl:K JbE `_p*i>y˔ч(ځRolx _SsS|,&R>bn2wU}24_Iй).$@UU+SU-|Cξ'DZ_RV+4vO@8CfEtEWF4JPr@~: ]Hj m3w]P}'}N=CRzUJegKsdg]hb"!qIὐ[_|W>QZ|c^}wQ BkOT|v1܆kv~{+FyZ -weNC͸Ar3+!6h}K^V{Fy|]3⋔_C{w^[I:eޓ9%ˑ.QOaѫʲJg~ßlt2pGPi;{ws*LV3_>Mi;_6ʣbT)@x쬼錾/_ΐ@ų, t J{垮/ۗy#=q(OoA_0BeS闟M~eJy~WbOQ뻿22VMAM%xv:{sQHxIyƍW^ >#?X>uAʬOWMU\6 .DƆyLR . F1]s:Wxjؼ6ox{aYX~Ze㝷F(R}G(W+.N sS*MzFd]'מ ^Vhܨ>;Oϕ$_E/~Vs/> / >K髜Kѯy)r:nu[G5mۛR6 @N'lM )joJ]:^FemBG(;|>ы*l5|uR2U -|n)Qj@%^ 瞧TY:R#M|F~azeBe i5s1(S(Se e LLL))222PPH8>Z( M t he a/@kԞ[̼]9%L L"LAM9(jN;Qh]Lm2@P(6* 4*yBLP]L:Ӥ&(SPL̹)(SiÕ>(STA^MP(^J&(SBWh)I{S6* )(S.& -WLP-AMP(.A)(SP)2@q44*iBLP]L⟹ -EŤ>M m2@N@8Z}SP(.) iP6)\ 2@AzSP(sSm2@1v1!sS6( nyBLP]LznJBLPQl4Wh))(STA}SP(7d) 7e b+}e bbMe LP-My_MP(.&=7NMP(^P(hR&(SBsS"@7 P(hAMP(.QTpZ)NMu m2@1v12@)ke )2@qp)aN)LY&(SL7e hqnZ6@7iBLP2ec6@pe SLP LPz?7e BhhT3)(S acv4[(yʔu@ Lpt9p knTJ)kW)?t0*SN}V i9Ұ}n+I_S&7@e_2.|rB$aݕa"e09Ъ(SN$\m%]>5ŅȪ7/^Z}hU)1S#ݔRw@89В(S˕JG%PhG yrzPhwy<ˏP C n{ŗ1b(St.WJ=zYV@Cis!]m_嫁V@|#K8[h):B߭s-2@'{&dc[Yh5p,e歊gI98e^ʸo?2ІRL?vVey(׆}G*oRnr5Z6@+PW%ݟ쮜 w IDATM!lK?] 8~>@V@Wv!FB e ๋w i1QW|3P髸qYNZ.\Tm]{,{ j !/3~%;qeKlr (ABvyq>R8m~pyR { UýqV.k DLLP5ܣP~TA)M$e e N.?^" ⴷb 22@}{ 7H ]$e e vgg>qr-mlyp%A ))Z}{)W=0^ .\1H-8>gmir0 .$e e P|D^8>1nA"PP5. N:c#{Zh\2|t)$J@:nLL dq(?}vݪK:H&DLL Gq^Q^Thrӥ爑J<>Lq rve e H鼾Aƍ 8pIԥ*DLLX:QF(>~+nH .gD.] nLBAm* 5\κu (S(S _)5anh[ Ka@t9KPdb ׆7톎&$rI e e Pqbo߇AlyT()S(S*?ӰAIq|J<.[ SA"촛o?M1)SFA;HGjIv8Dq_e e f N5fq|#N ]^( Ňl}_y_9[ G,e P w}?RA~9H~>7 ./S. n?$\L\(S(SP]Q{)>RQ#֚u{_-WReK3H\prJ5 RR(S(SPS|.K ȏAʔ{pÃ)6xN'{!Od5{tS>r/))z N߭8ٝ(SMio 6RD; PK33lw,{C(S(SÇ QӇ$* 0y]3ƅ.̞2P@BB3uoŻ3q{%|t۫rQʟBv[JjTw}ֿ"\Q{|8C](2HT/KU%˵TOG/e \jq Nҹ_2|tejH.^T~[J˔Jgj QL*P~GW^_[y7)/5T~[J˔Jg0jA"&uJAڍ22)gGKZ뗿*ҫ=*})"\Ņ`A"n)_#R8>*J;o+cx[o6+~z. VtIoJ1D_LLAg;n4noʏO\|j30\9w_( EY5Put6HD.'itw#¦@u4nTv ]ei{Ŷ^)uELt*YDqY5P)Ƚ_]s2]seG6M (2&p+6(SP_(?3xu @UcL|FBNggwAʇ[>aXA"QL󢏡j->#x7]S#)Զџ=?y̼mCʺJz%юP|/m)^_+oP\>Dʤ>4!v;ὕJB!"Ot[!?cepʊiț Vx'G&*;ZXPt5hG;*#:|Der#z)(by7?Aч)NWt (P = ?Kzr觕@QjD7ߠJS(Q]ֆS^1 nxא,SyCUwP.;|SB")U5F}={̝>˧+SeJKNqi;F'(Skn» >w1]mJj@씟N2+/tqK)8]YyϾrAR]Lq:b]n)@ ޕxȠ QN V\P_eOC"C6IReJ2ϣL)yq܃KQP]DUҝQN V{;Gf+; Pڣ7%2t,,v1Oq<,e :w= $)q o5)B" )qj[_Tqpj)S muϫKL )(pm'$)aqWIO~t ֔)ߛm3i(S:^)Nݓ (SPA7( UOBkT goɞPyז5lP/V݊eC+sS]|78{h7PϻBK߆do6UeƴO {1ӿ2t81e F񥳞hV$ݻWz:i{6Z>v}o.W{1cc)Y>e ئ+~t3}HijTUR=U λsRhcA8K^?ZWqtAPPms?2[&'͊O @Ւ<8C)PNA)@Cur eb%]'$>hڥ$呟*Q/8e P8L?aVx/x-{(QaͺKxJ-PU  ^Gr)(Yyu RN=C?V9ze P#{ ebŏ7*T&0H~H(V*^'M ޱ҆e P㲃D?]YV:#Ad IQW[ wޡdv _iapR/ .53x5Dh=2@.3qJm\vB ]mW~gw 8e 6gw/1Jm-3ݷ+.VhvgL,)ݻPjh)aPԃ8}RIqB!'*=9(S+aI$i} _ [AR]xz*h! 8e *AAj36?Hr{W+~ԃ8pN )j O+:Ç)'WN mNR8~]T L%dwiA>+? @%eNקr1F-۔+:x'-b޽Y3oR^Z췿<͝3I}VMT<_mam=wd׬_|(eIo=Вe e v&DSOQ92n8PYy‚ևaׁ6nC57){aVy|' lK99k=.OWٲ2(|?-B)9U4T\xkS=̝,\K&N0/HYJEx:- v[ ~tBhlPۥG=?Qv^^wIB#[dЇ2@[y{V&EahX?Ֆk37*M/y.|[ST[LMn\teHP~L*Qe4P-e hNsS8}5ԗúBǍW^ >}!4Hhouʦrw~'9R9Xe"eR- vux/9|<2СZ܅=YhctNfH@8+v:LP1M@@̍ 2@qЛ2@AMRMP()LP-zS"@6)9~HLPM@8ZҠ&(S7@e jћҬ&(SBޔz6@M@ZPh) LPP-zS6( Т7e 6@Zl&(SLd):ƻ!ɪ@Uˆpst<)+RaZm mfy2X`R~ @0zSSk6lPh7Phc_ҽA)S]-2@)L:I>~..P^tS'OW !Z e Ns8q%oJlBe Ndݧ2m2$2dt5᳇*FZTqJvᤩ)@k$7\SO+Fm[B;ԪџSh-HnWh f[Ը-QonЎ 4LL))222PP@@(S(Se e e LL))).e e ζ!\>n|{J3v m *RNCl/~}cVVuӟ=+:UT,[d2*47)^~uʼ'sKKy;A9,erebeʅkn {uUi#Щ 4nSMۮCB5]Ç)C|yp?Mn)d_jWGk|3xK]hJjPeaאg]Bv?(_mT%φ*Yٴ:%oQF ]΃!e=jZ=N]94|:}_7JGWP~<) P| >Kh+z9@1Q@e)̨L[22(SswTmk _ݶZ7iwl٘ m(S%x g(ެtNm_|eDQZG߱W裔?Rik e]ֹj%ي%~4]ee+?W^rc'ʟT[~2C29C2)q3nP !wyeg('N0/HYJEx:oo+Þ{+^{R;GYDq9r%J07,zUYTI<̳e˕;*֮?W_Q<+G<<:AW~ +V2}17Ko°m__-^+-y*tز5;T^Yagw0e~H/>N:Dg0v l^kWڛ2tm.o}zz?MOwpk)?W^fH{rl[))(fo e jLWH2K(C ]i(?a!;PF%gC$xuJeveJ߱֩h^Tt>InU-mJʔ>Ka>Wzԛ; P|1x </}Rg<ӛ>[aCy2%imy ]߽{S\4GoJy{+ћRi?Sk)e Ypn j=aA!0r¹(o$$<+/5џV}?/: eVӧ+Ӧ*z[:63erVpY/sBuJ3TP.V\3~|l%ϻ ^2nܔQ}+ ~_2@%\Um))@;ą&#.Y_ xW<=}F%uwpχ|yJ~JT7({<gpsQ~ׄtM_wȥ_ޔִK._^'5&2oizfzdB2~EC3{,nU)ߦAʔ/'\QAxԸ*K1i X֭W\)@J+0(S(Se e LLL))222PP@@@(S(Se @'i Pk*Th B;2]BO+2lT5j30rVhڳK@RFZ|V}*lk|G22PP@@(S(S(Se e LL)))22PPP@@(S(S(Se e LL}*,IDATL)Hk7(oZe yIe`5G=ԍIENDB`gsequencer-3.1.3/docs/images/ags_equalizer10.png0000644000175000017500000007650713607210263016516 00000000000000PNG  IHDRp>33|zTXtRaw profile type exifxuSmv )z=q{A1mv7E>L?{C=M-\2ш"S$KXJ_Pm$BPW e)o~z.S~@jT.N^ g3@iܭd'2JzfԖ`j6nl#Mb2R9+fJYkmP g7KA2vg³x F>;=W}S|wV2v}+_s |zv1B%iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later fR iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxxTeLI&WJH#)]Eֶvw}ײ"*]T t$$!LzExCf0|?+&9w? ^( l&&B2AР nhP`74(؍ԾohmHy{L6[[ǟxq,0 <| 3ݚ+O?PLF6o2eĈ)o+H>nTVUkC= /h"Ҙ.|7]YiO<tvi4NN}v u[RLs3]9}}UUE!!>I Mn4]b{`@@CK2U$R(Uͪ^ښ҂aa֥ܢv 6lC{bsrrsjx f@mQ;.1-4$:3C& u⒆>h|}/>/ܾfժԱc'ONMӧ>p[tu57TϜq h]FTS[WXp쓏W?t{7=LanT7] rs[=Z[;;U~eumŧN80cqS& 2B^֠,4dǎe;?--!!"fÇr?q¬K5{j 9l2$8;X|.|_htDGG:M2ih\ffrɫW?~gm_Wt~Ey]zyii4;zſ{ﭷĤ±ee=vо5&NpY3g:bDRת}ٖGݳj쳯qDmڵ+/ \=LޥbcǏ~k}USR/ٶ+ڵ;wg HL۷lٰnm !!#GNpSIQqqٳ၁"{yz%_aJ '`W_mqoHLl:u̘ѣ7f|5t~~NNjrxQﴯ*7۟u ?+/[3ftD=kWv}Kؿۗ7| \o'&#~C;+r*o.l [ߏJ' BByl߾FH$Rd ?|(7'''5e%Kڟ6 :UZޱbŊ7_x>9)|M7jNN۷wP}}IIƌwvw,*^0m֌>5u *CXOǯ(4'DUuu--RK"aCGF gQڶvj_|bW{d֫={t~~llhicj&TkסCǎ._/<*$8256)*/2'F |'bqMMHpDD^陂ʎo L5jTTywuUUMͺu3֭jW\`ٲyy*Uq;oVK7hpttFTZ_?,p|bH{yz567JBꪚ֞45V)bww/Ɔk*KMuS<<]}+=7"R) XN:|B!y=3yɧG iP1]جK2Gb¢ֶŋ^) q#F&&՗;wvu7TTJ$~ac[믿ݼ1#..0P&սZX"#%_xgzn{GWHT^V\{,>ThKV\.dl Bahh|ekn>f__ץ{dN׵РܟT<}}B==|g ]+5URyz n2j/+Q9M|&E2} M&B.uuLι'rsH5}ZXP\ /^tÄ }rT"KR]{}ƍ;Ϟd1GSxy^読-n;::9B{vtj ?W{TB봧wpP{[{{{GUxmWT\]ӭٺecƇY'CC BgO feϚ=ztg L{NdTpHP`WRYPW[ZwAEP==4ǣz*!i:mWZPE"^ZL&[YX?l\V[m.WW_40٫֗ۅڔmY5y`ƺM ѨTfطhH^y~= 9ǏO;u:$ѩj™t:ZW57[ؾ}gmرdZuq###>l| ֫5 RvN'ڽO:TWWSi!zyu:A&[短\9jTPR2mM7ikhLU_gOBSN*\SۻThF5FH,DP?h}.nTY6yQzScZ[۔:a~ |65(啖tMMEE{~;A#F9yru_ZmSsUHR-2YSSsKcCPХ]CJuϛdɢE>}-;wᄏr /\?d-sra_(4L}V`Z<$D$jh>cƂ>^nn~y_Ca /m۷_ɹzOWvV)zw9w^J1Җ-͗JiAgemݺmN:EgWjw;;tS},]ֽє ذX|@̰0'$8*B)z"ĉCWr18$44:j۶zaMsL&-SXj*˥R'avһin6ښZп)fkYY]}CD"{ȟkA-o設-+˻ƴ#"bcG  laaqdiYk۞=[~w_0{B7guqQT0(8,,&GdfMgf::f7-[m+7ٳwZm465%$BE7D99g vlߴO,81%E"ܩo,2z? kt_Z Z^PۻxQ5[pW``DCdzG'Nx :X͟6oWWx &O5KHw

t1cO*-oسgon}̉r_Аs-ɛ?4#ጌ\lYi}.sƦ榳EG9{ CNlY[GHcnuw;9mڼu7'L@_F/O_ UnkI~cq=zLUuN΁KT _h4[[Mܬ￟1cl$''gkpˠA"O(8S\wUW>:bdӧj[ZF uw MeeUuGdڻw_Ǐu~yҥK{^!hXJ =߹ĉSΞ=tQC=DN~~n=C_6?r#CBX7W38Cܻ<=}„jkǏ474TLC9STtp\EEQQQ!!n=BBF%Tz}mMTT||ju؀ _cKJv޽k۶0ww?,,**7,+kɓg޽;?={22ڴݻzrݻwϏ=!!@K<͖ɟ/U\+.ؠl}vUvy)qCccS}Z$~QJ%;9~ -MuX3\:r ˁHr%Id{fKOőBA|e^C$lkwsuqqv1=~zL.ήꎎnMX,< !nr r#!I$[FBPF'R/$Ѡ׋~H$T*o43\}@>FCIԅQ5ň cI$側Qx }{v02T&gȁ|ȍ$$ɓl? UjB XFYrUwuuu d:OAXtUT*g !nr r#!I$[FBPFwf/O/OoNI:O`Z[j}|m?@@Cn$y=$IdȟA]U\euvuvut}ÇtNN*U^ީSbH[PpP0BC‡ W9$yc#.Tl!ji#eGUUMM}FѭV*e2D$H:|x?Xg=J%K$zTZt^n43*+ΞLJ  G׶Rɍ$ʓlɟɟPFzs &٬PlذmϜ?h0"قbA!CnqEO$CnII$.jsEZM"l*ga  nm-z r#O$O%y?uU8|1J E_?Hdȍ<ɓ<ɖAT xW녭)i 'ylIO]@DLevC2AР nhP`74( evC2AР nhP`74(yRa[06ɢ\BͱC' !7$O$[SP5=g1¾>>pPrL.OINIIIf(8j(l& 1& !7$O$['I.ԅ[eiP>bta?N:Jdqb.a:ZN$CnII$OO] U\ ʒ:C6"⏽Xef]k av& !7$O$['y.ԅg,=iiY]0Z̺Xg ۵1i 'y'ْ<ɓ?u.T psrňf}m֕*,pIdȍ<ɓ<ɖI ujԾkof}mق-Z 4Hȓ<ɓlIɟPعAYkna]g˖-bA2FIdK$OԅP5Fl),,6kY\ɐy'y-ɓ̶՗3X+l' Z 4Hȓ<ɓlIɟP~=g1¾/8tXجGYXWR[h,J˄-<9I7i 'y'ْ>3fL:.!!9iTXz3ݚ/׷|.,jm{o>_ÿePXl}C9_VrhL?ᮻ8c?oڱ}-ߕ75WUyyգFƆϙ~ÍNN*e`a٥89}ڵ6o>tvJ2-o ̬w/~nTL2+zOn/bEGO͖iN厬+j::}_UVR>(ls9|}.|qӁ7}>@I11wu} BqfTٲں{ۻ'¦ƺ:OOZ:4==}΂2Ӿ㶼_if}$_7c8ݿ3lynuO ںV'{ON280`ƌJUJO}2^՗3=ai±MmNN7^%zEs Ju@vɓ٧_؉Ϸ;0uwtZT*k4/~q"O3|?CNNaQcӿW_ V'N4nBYkۙgN:( -2:M⒆>h|}/\o˨hw/5O`쳅%'V*e~Ǜl3]|o<\rRЀInq"aju}}ۖΜ)(x~ǟH<SRbcCBBͫ5ç|ʕ #F6t/sGQFI\?ȑ>>JTKk۫~ݻo+//-}zϳ\R9~9fkwfe$_l1o_z{l:'oT?_>tHN{$% wܱcɓ.o˷o;r$+K*)ǟxZzl|ȑ/m0l۶o{Ǐ3G%FÇGDFD~}9SVnbBX{~G3Jfb:+mr&-_[}G,+3F۰?jԿ{R@Ss{H~úu><<<:23ZlK;HhsZ層[$׭n󷛣}|=~Ny,""&ft{gٲ_7oٲW{=χ^»[y9-Zm|StfDҿiFH^x[i\\|OAAk֬^ 4q{ܿ\Qyi[X6H Ð?mi"^3*Uh$0un \.!)V93z N^,ȡh4Bˊ$+*Uߏ~NM--%%K.X(Oy&?>fͺ馻Jg{o˨po~݋0J?poII Q‡%$N<׆ gp9wd]ԩ#Ç?mf289|˓˵ڮnË Co<%!aݖiF=7ٱC$|Vd]] 3s_Fr/4o>oXGI^oE$a6:DZc;vH$6oS̛_LºtDr,%!aFhmܙ]Qv"Иq>B޻t_lq:Vj5V Yos'O>A?nø앆E'0/ UG@9^rԑ#UՕUy'l{鍛Zv9?gp9wd}UhM="ܻ>CN,,2 ƍakfų"ѱc'O:*uw 2|}>78ܗܟ-ryczX~}wڝBôSyIHhRCXS}Ms̚p~86 =X@@b7m߾eˆ--uum֨QQQsuwTU55k4mXNmo_rex@fWnE ͚1ݽg olpVDFК,TGB×ޅ+ؿU>jkjN1n|BBbběo:}tÆ]mhn_?hi\-uVV}%|M[EGvw'$L?oޥ6 m/xsZHX-R77-mނUy''\WL6mΜ9N.?zxvNNGGCcUp&{ ̇R^Qߠє9t%u::f3 Ts箭<80^uf|l1o{wcR 'oT2Gb3ϼccƶm711II;H"PZO?OI^A?M*7f$' h7y^/ÇZwrV~9==mVeU{?d̴ɓ1,: _;Eo/b_`AQ߼o>h./_(zkKI?d? YYE5[zlkKLlԻY,6}vwttr';Vԓn-3>w͚8U-ↅ ֯$$5iI&?^{o7믗,WOOōo2T{чsVV9RkXi\y}uJV}K=ĉ⒦漼C^~䡇z@ 7rGcFGȣ۶}k?p͚/ kЏ:m͚իJxUß{mz`*N7|x|ĉZO8JIW?ӟzvܵ~ƦqsҭmƼ-G7/m3ۗ^c؟ŠB?mܗ˅MNII:o! ZN';;[pqQ(jO?gh6‚YYfi0S  VMo--7>{V' 1".N .JSq~4(q.V"yVVt8{ւw{2|dg_H$7,|t:a-x7פ#]嗛6|֯1219,4&rܒN'"UʕF))Ӧt~0?2|Hlljjaaq- d4 j\.suwwxiIIcع/*K=fqma_}u}߽(V>5~0eJllDDsɤTLU]Ѻ6ayEUuUuw8+Ir@f[ |ő4&SRRllX~"њ5wdgdN&4 1XgF#yTSW0QʢbԪVLVOmm;VǥSRV "QuE$mL{SHǻw>N~siYiQzWW6iO1lΙ2*lxY2YX& jmǬ+cG%i4ߞ6d2ixYHDef{{r֌!𼽋gψڹj5B=3 ` 2^߮= JY]Gm*V3 ~ d[p*uEΛ7/X\.߳'+3On2<~8"o_89uȿo߁{|5{mm'( F#զZ] ZF?tۺ󭛷nU+₃ IDAT^bJJٲGoUWKSBߟ{H}|EyWrN0/fDKEʂEm{$\,ԇz>hدce[[~VIIeemZ}R)߼i6ee~uB5k,}o'bhJJt{`6 ;SN,M@hJ$>>"vVx ~Ȑ!Cg϶mէżJΔQn F:XxRhUj]mg444sΗ{'?U2., qO;Bpwqy>gֶ&XOpuaۻz.IoZ5v\\\ ɣOJ7dΜ9yqSN8nܥKUUʫǎ?a֭[dqZZ^݃xcOTl-{ڶu+K 0BAMҭl .BRyD޺[d=<8<~o4Mٳ{/0~im2&{Mm*Iy,(&fСGE:(˓9<*iҤ9sGWpAiF&k"Q`ԑۺҖ盐i}$XkP$Q4&xljW\Vwz-b4 U--wS^^{:QTA||TWGw8fbAlj# ZgiL>p@WRRS#š*4ZeeuumSryJJtt~RiL̨qx!tuc[ϭrfKkݺ g~u@?meԆ;DAߊ}eAWWu:j.^R(fϞg(gw =ٶbk V)oۓmlcψ\):jnV>buÆ >b$KϞ5.^3vԅ b=-1_'jomy0xyi46su7JjJV@fUV;[VVw \Y/OHSʼa0둭]mێtz[{>RWܸ/BaϚ 9 :Gm#h䔅oY b(fgiLO8qr690 @0o޴i_Iv9 RilӼܢb1KH$aa1:֘3;Zy\74})~LYS.*U%<[(|o·,Jױww ;=ٶb{pm{=#Ξso( @(tu xBzznNMjuDs^`=GDHy%K`yFzVC;wۗөB!HB!Z7MZ-gg*JO6556d$D^^眹SFux]d>m͙(fe[r_{{'ǏkWnZmnQ G!и"ozMUUV%ᄏzNGP C{0L'd+.<~TX(3-fE#*6BKklPM^Y_aSXiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later  iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx|[}l$&M(jڲl^ӌ&MIo{6m쌛n4˙۱%9aMk'8@+B")yY/CG*ǟML?/_LQ4-ϊ}v6L2@"a+ʊJ&̆r\LYQ`j^%`,954^Q(Ԕ+޻xe&$7 x7HhtȵgϏ~{{d8|~;nh2qߙy'>qU@DktZFܣ$Xx7H _]hU5;g?YY3bPzCym2Hc1^_2H__b=6 -9cXZiXlt?ܻo;p 8p3m}>FST\Ww͵[\{muժV݇?᛻{QSvȇTYӝw4?;cݲzKMRE"ogסC{s u:Ց_\k7^reQɔxwM9yshpddb"1m6~ ^8+܍x{o(ԼλnnٻюCCJ_^|6mjj*,0/Sj @<Rp^}^ik:7ox vQh$IUkz'OxbLy38^h6lw,_޴̹ގ~oOwW`8\,-QfMF]Ý]b_&Q`#G~g~NOvMnw_wv֯w8HWgמk>9D N:ޠF"NowWG{O 7s D#y_<:EAB``u];xH"ѹ>fG ů0bh4Es#:WqzKBa|ĉ~c'OX֞WVZUXQ7tmkLtuvu"K XldH4*s,˖-+*z[~{>Q< }ݾLWB^pߞ#Gyl{SD2S0ۿ(0t%{=t N9߿W'z3tvp\{;sM?CuY&I-/ӿCCǎti,;/5x$|3jHfNZ]VbeuuV9y}@ V+ Uc[˩ѱ  r]C]AVkÔyPOwOwRIj)'G;thQ0 MgnD;;;SIFSݲk7n` ѱ1IZm;~x'zzGǢQgyr $뮻vcMѣ={d(80FT=n&2Fav/~P$ BV+J!QK{E"juYyCCm9džEi|bjVQh\^,[¡`  ӓǢ~_G}>qq`p汋5~+9;[NDbl=_Xl6 Mz o;pX4uUue, 1ٶo탃i{{')ŜR7h8|T e:yƣ`lokx}Hg?r[K;jj*+mbP$wԉC.X;t;g۔Lʪ|| |n&2;F[Us|4_\nuӷzl|{@_K bjAV;7me]/>ȉ/ӝvG~~n \##b-GS#鲳rsMo`ןyfSSv6oټyƒ];{=? JO8,ϊd(,vMWTb酷Mz_{4H$Ulv5ebPHcap0 ,s4/Iw)nj^JptnPHO~ 79ssIPj46lR޵$I&S} rkV{ɑQx0Zr֯߼aE3@l%/͊[Ї6owCM]\izG(&6Ҳe>~{ѹ| I?!ڶH.6++w٬bHLMm6نDDm46/tyy6$taDsOL~ŅsDh4FN#)21w MNz$JMb{eV%AQn'&M#I h2:Vlo)TL/bs?{;/ޕ+rrĨ˅Xj.ѴR'_HD[('q(E"Gf 8QTμ\IQoݣm0?4$$9%I ?S%{ PfHc ]p2222`OdIҁZdy\Ȝ}>^/*#E#R Yf>P&Ed6єKnJ@"3[~`NMvwx&g}OJ1+!2D+G I@ I@ I@ Iџ8so\E]eK}%Għ:w#YYlXh0_L5>}ę3@@rثkVlnvdGGcO8Xl;8?0D8 \'O8p˥ӕ66^f͊%6@)G^yW `)[e&ƞаeM7p5%&ӹRE46>}jJWez%@ ;a; -9:ɧ^8g?ݹL?S q62fU7J$Z;P :7S$ki9ucphZmVV0+K|/dY smb}b1d[[ofgպ~ۖ/7Ξ}ݻOvcQձǎTjMaQ7]SR}/hlm=u>_,gg٬U˔񚧏W-ꍝ˖mtb޾QW**jjڲymΊ<YBՍ˳sFG:{{G'HD--k\^S0j7Sv֙39owjݾb _s`3"?{'+*ZZ7mpB!KNiiCƍ~FU> y]W_ٽ@@ڊjx]ۛ}bhos{'J[O_]_ʥy|zFQG0׿w3O^y;mg&'Ƃ㡇{ݺB~}챯}u}kۻԩAjɗ?^FWx'o,.imyշ~Dgm{?;XʞCUȔE^hfYO9o޽O{6kee]}]]EEqqN*62~T{wb)++C)uNsEյU%%yyFc(84?D"z]^^yiޛ'r%%<{AM55YqyeYX` :F#IFgωccFCqquuMmeUIIn^ wut ktSKm~``od$M)*w8yVɨ&vK?SxS57ΉG![ʝ6F;slАZ_PZk0:mN#М 56lX98f2$309۬%72r믿@UզM۷|˶mkזKRg[o=?孷[Jm#<~W^yyhdõ7oݲuX_^/xJմj˖U1W5ӧm;G>[o5*&7l$)z~_ TWo׭+/N~͛W.*>xصo;;y2,+[n͛ׯ[qyccen4O7l7lov U}O޽/ǎj4ͫ7mZI{Ϧ[)X::E[}}-Ϝxlֆ-[V(+=di{[z*Gc}{yΚjb),(-r@b,\~Xl||_=vwT??>[rsm.+kl;}ǝMM{_ANWWo?[6;ߕVr˟Sq}N2Ҋ&cۿޮo//Tss0,̕l F"vͦF -7;Kz&&bHdrEҲ>^NI-Rb.h,[VVRrqb0TV)S[ Ox. YKbR1jsQH6ɣd&|Iʊ-6oI-ζs |I=$=`S嵵&S0&h˫KJThQe;r/=-I3id2s%㙜_ǦX($.0hdt];_~Wj"B8,.LE `u e@4VzV"d21e/YO><#u*I?+G#Oht=wZG~Lb^( -ܧ?) AZٹ S|#I2㑤X7o޴&'rpXC̓"ڔ)pE"~FCqJl&ccXh,,pﯼ޼vn͵Eco>g~g`084g}Kw\&diNvKZ=s×lyyjt=1EesV8t*?k;,L=3ݽ=}hkV37ECGlZ|߿u몦ʊbb15'%QV2 Bpd>ۘL˫*՚=osO!$l*+_Pݷl;?ԔLb@`||t5KKrŻW̦ҲڲήϞ=p`߾H*@ wuu}4Ѩ,UqLZVg,mm]yYWgUTޡήh`ժ$+=38SovwxPG]>ܯ*+#[6Gp=ZKLFgnUU9~wÿ /U*bsv>}Ht gaweq86oo~s_}o~5;x]]}~ vunڴm۲lJx,МGZMmٲndn?yxoɓbbh-*),P>yLw,_q 欓'ZNww=+v;;UXʊU+Vx'mm=~|>֒,_jÆ\aolk>y3g7͖{^M5׬YS̵)#ZψZSPp5{ߪUw^{5*.^c{{ݸH;wnge]GO??kZZKJjj֭۾}rcKKnԯg\^vM}-/P_wBesy旯={~ l+)[׭Cz ѶmMYa٥)Dž̹)ZrWN{uxNZ3qut۹K4.]Z"ҋFSW韾d$$$H87kX4J~x&gp&R㰋6}I2SS4"~*t/9$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$e&$6e)O,e+wF@ɀ2SChOڷIvT6׾NYl) '_[Jej?uf>2JVkuǎT99+jjTÇ::<55ш͖}-cqFmQI.2Yq^Y]e'O_e"G4gD__l~}K K6jm=~uhF.w\Ie4챘7>D_`8pdeK-.͖}LuVWdEVW/oS[$FHk IDAT|MrVh4t N_ h4%I*UW3-yq[fVVWdEV (3]98lr$Tзkh͖<܋X+"+OCj@ 2L&azI9DSP* .LZ?RJζX&F,|>аKK,VeZ2 Iyr#_͖ǭ2ݳ"+zYHE>8mI;Q$bʕM`9+niQKK++ʭ6|VT>oo^\eGm}vW3/YYUfe_SJhʒDc \-dEVdEVK!+ 1 YY @08mdEVdEV$p2̤Le"+"ŗa p.ȊȊ(3HONȊȊ_VR)l#+"+ 4B,DYEK!*s3Ƀ*K2k嶋&Yo͘kź'>˭YUzG/r`)2eIGhOmh װhNҧ#͵n\*1{{&%+"+ʬ XxJQaMYshL~KӗȊj)d uz56cܺUVk1wuFjk;|MIsiii˫YBW8n<%1oJ]Ie4챘7>D_^oeeKzKz\Ny̗8p(RXXVhL"+YHON. FNÓVOGmի׮[b|m5my"+JSs6Kp#I3obPM7:uzO9t#Ϟ:FuxK] +YDY@(d0LZV+=϶# O.h$b2ZȀ2ӳm\'T>kh%I%V#>TXTPkM-llRR4jΠL;Ԓd겲K.fxxhP-UV&jeyEVdYHmb*toFtljh4lsE&_YYWWVnҒZ2펪+Wnn^%{ZZ,K￵ō$'GLxK] +Y?De }`xј70r|Sǎ8p~w#}}=ύ9D9tȊfVR)l#+"+ 4B,DYEK!*s3Ƀz2k嶋&Yo͘kź'>˭YUzG/r`)2eIGhOmh װhNҧ#͵nS.cLKVdEVdYY=)<𔢒.d.ј2@K/YYR @d@I|\'dEVdEV/+\YYQfj"ˀ22NȊȊ_VR)l#+"+ 7˔%I?!ڶ)+\âU8EK2ӣ6׾[des\ؗȊ*zR/x`)E%]4e]1e.N_"+"a 넬Ȋje u6"+"+L@MrPfR_2 YY @hWw MJ1[=9S*ՉW駣Qot,F@IH0CSbp6juoĄF3;::<0661ONp,[6Dk4TSŏvo9~TX8%Ǐj~Y)Ru}V|*}L+:hn[vJe_⡇zq3ݲڛoM_G#>{KQFT#W_y?77 J7^;:/<)r=JK?Qh, 3JNjY UU7=k|f u2̤L#qٖcYM˽çN=k_Ւ`*:I5m6d4JVk4}Ʃ%VeIvwu%ij^R5*9??xs/5DoTO}/~Tj0D3!~Te>i]=k)3*:PfRf"FY&~b~}ZCˢ!/O_wqOՒ`9+KKʊrs{zFGC^7+KR%)*醇GF۽5k%eޟQsz)gTUJq^g7I-A~^]yVҍm*5,ZS)3Ln[:s3eW,᪪C?cǵF_~?gС 7鐕2e F{^ϫf_aMYshIsWw 7 G _;CVG5O~8Qje2+LKV2])uBVdEVd:PfR粍K\"+"+LMrPfR_2 YY @08mdEVdEV$S'\'dEVdEV/+\YYQfvV!Sy}٬Ay%nrE,f̵b];=hYeܬYUzG/r`)2eIGhOmh װhNҧ#͵n\*1{{fprE8ǎk۷=Yq^YsVO,<䰋,ٹK4%KVdEVd:LsYY-SsFVdEVdE @W.L_-qRKVdEVd:Pf:%[ZeK/YYR @p2@z ѶmMY)Z: 2*[pL).d.Ѵvk+̦ҦUuZ]{*UNNEʦ7徱+{-kjTÇ::<e-[6oYȑ~xK_wqW;ni"<{=s#Q4Tʖ亮 [*}/%X0;h4t N_ W$]aKnk4-u, (3sh N{9d#I3nb1'LFKm)\Oܖ YUf uRI7>eٳy_Ow%mW-`2 ӫ@Z ##@^rK!oE"e"+*"|?ܽўޑÇyw89m-S|a$XZ̦¢pX|omIeg[,f^zKfxxhpPRr->++"t @\,9[oK_λ#6ogDj_T>oo^ܼh4lsE&_YYWWVnis{-[[{[ڬ^-)dj9 @f^٭6 C!NQf߇^_ nBy}--G \x  1?{؁s{-==jnn"+ZYHn&7j寞}3w?N ӷdn&.qɊȊ?m;D)>lVRuX}_Zq6h^_G=uV)*s3Ƀ*K2k嶋&Yo͘kź'>˭YUzG/r`)2eIGhOmh װhNaJGDk-p\ؗȊ*zR/x`)E%]4e]L0}ɊȊBVR'L \:!+"+Z|YH (318dEVdEVҟp2̤Le"+"ŗa p.ȊȊ(3HONȊȊ_VR)l#+"+ 4B,DYEK!*s3Ƀ*K2k嶋&Yo͘kź'>˭YUzG/r`)2eIGhOmh װhNҧ#͵n\*1{{&%+"+ʬ XxJQaMYshL~KӗȊj)d uȑsvKK뗕Ŋ+jki#IeHR3ǐ;Gz~`۳Y3G9gM\SR2הRN_]SSVG"Ywnggާk45t\fg$)_Gzs{챿o|>:%S$ _{_s 7~_— :׬{_я$)U[O.,~)OV9f}4WPf,)wVOhhAF+Wwϐkrᐤ‚ʕ+Bѝwp^|ᝃh$-y!L *L.Fc8<994 ^x矢$;Z-I^o8 ֮j^zk,u@@\\G_rdY55qgwtږ9/ULw89]\SR;;Re5siGyuEcNO:uz g0VRz]\-Sͮa/h"p8[B՘\\2^uR}ÑٻWܤrᨫsVXjIٿ$ta&N #IeHRsv1 w}gHouY3Lttv ye充nZ; f}TRZZ:.i\z=x?}[>_ Y5~CVx۷G"VB-\mMza.[b9/GYfSݲ̥o04<,^s y}:zt[nw4j6X hZ[:s,ZV#Ѩ:e^sUKS=Kx::BΩ>-HvvCvb¢;o}4U %kߙ3]hjIO,)YmW2ӧgJ3ua߽{j{/LC$ :{`YG՜9#t E69s%a$54Ti *x<;7^Tsyg%ΜǽA{g'&3'kk=x|JQ@3gGI10jyI*N7t=olbs?t,y}K]Ĺdk~ b.X,yyZ]WWYqGgf*ɏ}٨o|eV[òkcsk4mmg_X[Ӱb~s8zZZvؗկ_K7wܾv~Nli2%c IDATwK^`1ɀ2O._)~seSsZ-jhm=&.;_YYWwӧGGLfLĭѨ;0rĄm9[S[S{ VmmHm9}$ /ɾcXnfsp p$:ʘgHϏjfbII"閕rTUWW ✉?s\\7hi}Jʖ%%Vkv2RZ**sטLb+W=uǑ_TTXX\<:zm6Rl߿)FKJlΥ?.}ϫ/S{b4VYY[{ױ8O}Qo7hfIg>'7񽧾mt/PU]\u?& &wK2ӂROԙc*ر/xD}1O\=:0pW0(. /e1"KA9Li̶\i0Q_V9yȑKy))[./ka::μEo8V+ L^?h4..h?nV{5T|26o|}G_#\AX<%@ؗȊj)d uvIe&?i)%+"+Z YH (3])l#+"+ZYH (3)S/q넬Ȋje u6"+"+L@s*d"O4Ut27<(-SVnh%Z;֌]kq*[Yq^Y{d",Stt&=h۶p V-}L>"\n͵r3gb_"+"Ivє%;wZ:}ɊȊBVR)b"+"ŗa p.ȊȊ(3H5e@I|\'dEVdEV/+\YYQfLsYY-SsFVdEVdE @h_moWw!+"+JgteFўml}yCwI}4hfۏmoWrr**V6ԨTmmutx<VT,[f0l@[I*iU]֮Zn}v?#)Yq^Y%/t)Yc1o|<K#щp8/ʖ-/WO)3_RyY,z'2~$L՜Y 1uuz<:] ׄB)a$$@|ooIeg[,fYYYUekjdYsrT*ϔP(\CYP^>} syEVd`` p.ےUqqoo^\'ƻ10ڍζl4^Nݷ{ x~~\.W-eeP3G]!Gs\^Q\ Fa| e'T¢ nnB!칅h -ZHhAhh: Vw.DKcČk4VUA7nd 23[dt{6*DmЂFB B[F[ua̴Jŗee -Aξt9;MemE.~၁\nыz}{{YYf態9d ͊/vpq U*ߍw=5U4!2Ǎr'+AW^vor!vx`~RbHPhQ7f|Q3v̉6e.U75*4Z$vv&"p4+W2 Zd ^"wȸ@#Yjh4Fhlkٗr|sKQg^t9?J֬&Ν`}**f\+-iU*[ vvv?_rd^^]3}/ZE^mk,,+,*-ijlkUȕJNrIM!1 H5ģd?>\TAf-\8a}Q&r׽{\DgM6p-<;L:#$knoS)lO$ qsj[ZJJ.\<|3%um i#pDؘ2_)to5 ϤIӧ47ZJ""S) kWXp=d݁]F_]Hp¶m}kA:]}댖ofTW---/8̑roӿdsu~+T9RX o1cgϞ-X$99uz==yrrOO:V3\_ ԭ0ZZ];|$-*NlEv,:?MRbP{{:`hi~ᴴsj\E1,VS]Xҵz4\vV:[[E)Ͷ|M ptI-;+xKNogd>'ZYsMuAAg,YFE9:fw-*%%'Ӌrri MUHWV%&NJ&70j/^طZթBIޟVTd=xȑ|hd08?B[6GWvVUZYŚ/xw1c/CccAK99e:fs;XtRP47UWg464vt̙0#fIՙW\!E`؋ƌ6m(Oom-.>q0!mo뱰XsXY1{~WHTSxӦz{9c9[_)SOI͕ɯ:|X^^L֜{5t̘;ڍV[Yyʹs%֜;O>}ZD55]~CWV(.]ͪnޙ|=sfDHbi4Z-icV=vwu/a"]QQYPKCSx{.h4t"-y-"|ƌĨH{{cHr33..٣FSQa<Кd޺+wE'ag8iҴCS*{VV溠RuOa[xzNx\|lTˍ6V32"5MWUh4Ų3褣YvV89_ӵvR(jZ2.c\\H! =<\ofoT.8I]\-2am1.?7:]C}mmc#0)gf ur2w$i(((*2(-rq :]<>fK'c0h66vvB[MYS))s^-*!BOEkS z%+QhT"sQ r^q18mٲ5`hh(/'dk,۸Pj O(/],v5@bOT_GZ Bð޼GŹ[0٣RͺCS)Pޯ3yD[F[ym2{96w_,{o%f;;GF mIڂp&L >66#Σ--m{W_=hcކۺdsu~+qVs),,,ݣx|o1Aw WQ{f꼸:1 W Θ}ӭdcW vc^yfcwuX]2ۄy}e hd Dհ:UׄR4^!+' 1ߘ(eҒsr]]MF:|.^l7bbfsp'!PkNg-~k,]dk20t7kGdv5ameޖ2-kkjP.YqJ|2Y~ܪʮ.:(Jf rr kk{)h5y{À:~1.d6{R tꪬKF5`Ŏ9Tg琵r䦧?Ku*umyn% 3z5Ze!&YR'ggӒuK C$VNҮXiUW;#\Qa^./+y=Bх.n]01u+g@=QOAOo/y+NuM:9"Dbo/XZJQf82e|Wܚ¢ĺJTSؤ-tbεdk/n0t}w20<ێnwݴ622;ơ%K;Cw7;JUklJ?Y_ӱGO/W>ں+WNɹ$#h5y{q8anugT=kWuH e5VZɋx,X$2Gl^[cgomCg(-mj}tHmg{=3I!/-9yXN"dܰgՖ)H֬}|BCsrZdܹϷ TS\wKadA&vgߗ$~ііі`1ͽ yL_]:{Qg짟˗ZZ}zÆɓԴ{[[DFc0TUkjsBMqwv;R E[=(Jll(h^@Uג(鶶 .hVGK@oaPXTY=ad1``2wII5yQ1Af+ b:;Sˇ}kCUTokSdqq$_*]kJu䓶KpWh$s[ ZmaaKGU\n>oj"PރWwʊ|`K٧TjDɤ(6\Iq!@[J8Jet:lOH&u\Y}&!œpY@[J@K ap령FM;)h<vݻeH>|lZxd\e ŎdjsNg0ƺzeGg`.\HۚoyvQ Pml G-S.ޮ74 hG"LàŜlnb~e9[$̓뼴vfOGd>ŗ˟ڽd:徸lmyXdOjud$ҏF@Ʉ<&äT 7͉Փd=Ʒl6@j2UJe?.j-Z%Qvȃ%1%%YwXvgͥS v lV,z4%Uջ?_]-DFxMnB[:q`xqʪR*[Z\O!=%SJ#"xV岘%s83[YM&tdd(Tj\`L''*VK dŋN/b6hlj6G##M.wp/:Z ]RI ;WX Z[?`iq@[J@:U"21RVNjLJ &vv`D]͵'y2[$r8ZS\ϧ{_(ww40(>n _|%ǕKJ?<1cqf#%%*X;gD1/%'`<:ʊ(mhPSv>j{Z(tZYB\)0|ZWVT_~J}JC(ܝ2>|}e| MLEg4s1a¬}ߏ,2YCFsB^ByKVVۊhV (q 0-ʉd4VR67w>Je{{Ơ\A`r#0qjKilH?uAR;;{qu;/O7WGTSYI{zht%Q`0f_c9\@n/rw3)L2G4bq%=jn0PAL5kg֗WZHZ  H*Ɔlcsq{ !C ,i&f lNJlkC$/ߴUdAdldq7D "QV^VL`(($K,+@kDR M|MkW?YP`0;md L0p&LM|_ 練tSwlĉRj8r=JѮRh #f.i`p<+FT*Z)Fch4=RTZ-yPFVi44#dzq>A{&Z6i&#GJ?ybAAeU}LVXB[''? -~8114Abu%ڰWb>bç^tncoo+҇._̼HꚌ,.nog2E"o0QP]]7}Qozeݺ' ]򕽩;cII!!"_)t_}ѡHLz1'‚ÇϜ~Q}[FSS{lrFr%_ߨ%KϏtt5Rۊؽ']ZV^WڪR1"KHHrSO=DLN/y{β2d[73lLX>~Ə75k>u5oTVܱwٌz-2zk欪?18otXddK~~j2jkj:E"p94ITV]k0xOLNt`?wk9SΞtٜ,V,{M1oud7W1 FY?gJN~r;q`뚣ZMT/^ Ԙ}]_~;._opPWsg[{pىO<+qdsu554A wb2'%|5 [׭KIǟtWdoNΫW~:;͘p${kNppYΚǎ ѿ ё EՋ hFg<-DQq/ӫq~^XXHAXӍg3ʓ=}_hlkpqwJZZy z?Ν2.<<2Yo Fck)RSJ]]Z;^5Cy8r.R矿W_/jVB³FxoS.t9e׮]|_~[ 9)e_2m̙/ zz1<5k2#يD7WO tg3W> eY S^ I~|~o~ejjzzRqgKSW:: ڀe˞|r^r\Uמ߼@(qqLi-N*tOs ,]/?xЗc=gΜ1A>߰a_|qvkbmmR}ǎk!!/h uXۤ( "| "JSX[Qٕ8 2\Vun3=I`i\]]Dv]! `)ǻ]<-p/Ѩh 77ooggo19JƜ]6my×.75Ճ3MW7w7A=7'V^ǧҊ֬˝;L\ϼƣ t/4WOt:wjfҲVB;*^f,Xo4*m$a# HVllܞ`؋"{;Ry1 Y3B'AP؟uI[[Hum?U%Nd?^ /p))6l8((6vƌilwP:_d\tknfƍ}vlr{׮ݺ~84~yt4NW^G~(z|s~d,`>y^B±78?T͛934L`478wtY ۜ7Ҥ6nLKdϘ1.Fk:۞=Oj5O?f)M0yΜ'6oޝq_-6}X fQQnni)`ADwOKaxPX?q3NM}N7~RX?O* m&M 𷶦(:F̢q"#\E~NgѨ O'g;{VPXpl_l? 'g77g'YN;{G)EXw$nf#}UѾ#GP9}S*?~Pܼ/8xɒU.1-m͗/hdM?ȨS.Tڥ3ܲW]~ص3=}߾-[Ϝ1mc'&<#py~{X_Sm/KkGz[+y҂]{6߰>7o⪩S%.3u:.^<}ȑ_~9zMAb۸q CM$u)F$$1DF?_ǟFD܃\ *JѮRh #f.i`p<+FT*Z Y4RU*fIAQ4Y]_ G@#{&Z6i&#GJ?ybAAeU}LVXB[''? -~8114Abu%ڰWb>bç^tncoo+҇._̼HꚌ,.nog2E"o0QP]]7}Qozeݺ' ]򕽩;cII!!"_)t_}ѡHLz1'‚ÇϜ~Q}[FSS{lrFr%_ߨ%KϏttXeO :],vtrp`2ꊊj2߭ ںrrrqH0\U׮ ^>?\lټyV}i6}?t: <57_d4Ξ+{(WT?v7S+kii}} ?`Lr.+V{AP_CrV>쳋FGJJS}٦ﯨ~ )QzO?P(JN~r8u?+x^|iŊ1c3g_Lbh_=wǎ ыϝp})W/^+}CÂb6nz5n ;(k|1#lFYyrKmm.NIK+/sv~p[oǹsI tv~6Ez|ʮԲRWׇΪgttMr.R矿W_/jVB³FxoS.t9e׮]|_~[ F׏ɓig|ᅗ_^ǎY55Y՗VT&&zu~b@;;Ϝ_Xݽ/{Ⱥ_؝o_e'Lhgוj [d}/SSӓǍ=[2},]?3gNRҘMoذ/8;wڵq]R}ǎk!!/&qX}lfgtAqIQAD̙bE"0/+-qe^vMf\O{㹺(B.+} ӗR/{uh\xpsvvꪫkkg۳ O^tOu?OYŗ;w8` ='>^+yGA^DF;N_zӹW3sշv>{w>w(T*;X"d4*m$=`#mvtj,HDM^$h۝ѨPȚH%Z8 :nKBooZק(pd&k %;x,_? ~-[,uܸoߎp\no1cڵ[/nf+uE_`nÏ̘%odڔ޾Yfsy\.ZZHDd?ypx<++heMM>vߦ(o+4@-ܾw˄̴&WMp) !sI*pw[}+9}~n5r0bqtԲeK [C}sgKJH$ \.N3==|Ko({ pQEǏ=R\3FV=UmYZv65¢g csq]=<= ӧ32jkkp|}xyUgOTw%uw~;zDQBT.رuء5*FyEz&w_ 0!:^tܱc[7o"`\;RZz④u>SRt'KH8vt6~jy3gI榼=.k6$yOtƍiilcz3ƅ88h YY~۳I&2gwYNwsMvl(7 _ a[0<(J,`|`>X??)yBd vqq&[[Sncm#TCC~^ffQqN."sk gg pMϏV-ZD_9x.^SBOdOPBqV%KVZNǴi7_L5|#N]prRkIV=zͫ9kgz}[9c4 ]]OLxGر&|c_^:ne׎nMOW*y<#0pn⫯>Œ~A_%[ͿwS?_,@ ;eJhFCz9%tKaPhk؛СcǾ6#c۶v޾EE'&FF5I}%]wlXa}n…US:Jz]ֿ} ,_?zDaRY/56Ý,Pd 1 M|M& 0edb~IÊO bQڅhA `7gh@ &0xKBYȂ@{01L#Dch@0L&zAo&܏CA "c)Asi&O 02A dI bi&<95hS^r f @ ,i&d4))>bSJ.r8^^ᱱs.꥗- 0 >f_}3?;wTϛʟy/gYlݺ3mmF#"6- Fru>,;eŊoׯnmMQę3#"l=lٷ߼-ڱc F) ˟Z"<+dFQAT3+z:.KKM۟#v0F]I/,o\v] 'JevK4_tLxP=ԅ"#ШҒk0t`˼zHVN8yRd+}Ӳ8dEE[[vGօ O=5IѶZmA㧲ƠާV Nڙ!eE^+>ow_*/6"qҤ8846ܾ};F/\XZe'?k:uOL814ҪX&S98//SW,_ 9YOMfk+]]QtVvNwtt!CnjbglcҔ?"A ɗ,ٷ@zyOyxȯ[H?p2[f 0NQtкhN.6쩧~+Itt׮AʿRSSR%&v[$m89]?NZl:]t&2 ښ7H!~n)ymɳZ1f|++o/_?w7A:3G3qU*߹&*ɴq/^7ѵkTTpUKG77ޕυo]P(BB&N;wuO_3sfLcw?tO|#kx  ~Z1V17ZmiYFƎK8u\niYUUF44j1T__]US*6<̳wܸ1u㶭ɋӗ_ZZՑ} 2"iDwpv7-G\:ףNj/,[RO ֬~Z!_ǏEcBc&Ū&y7{n}=jZBV>e믋?֤;FSUUQaqYMssƒ ,aQŝƲG=+w钔CGw Rr1}^yFm܉%$t5HB%M2^9rRe~dN6VZ @K1Q滋nh=L@. )4EI$RBO ZabeWbTEgpw3BCĢ'Z-c&",l^FD+h 1Wr !yLuf?.δ?Es).wﴁ6d $)9%'Z1Іwb2Gt-Yg - - - - -T[u*9y'K''qc%%VVAA11} >uڜ9SP-@c656g|쑗_nMq{/Ҹqᕕ3k) I6X7*t@l&1 VY`ѢG}|f|ŧbl ϏH:46GLY V;v͚`V51 hWM&o43uڌ1]/LfнӦU(NLY)ZW _9ٳ|=޸ ;t0+Kf 3e-WψpY:hm,0D====oNVZ Ε/Lggiݽ6DҜ7eFŸ vAS()LJK[F J&44476;@b6ЮXYY,2Ahhlh,-otѨ66h2JQYӻjٌg01k @t˘`W^' FM}{frǧC޽5aBbbHGGfGLuuyoٺ];ggUV66*N^^a}z9n|bb.nj376%'f#GΜ-*pu 5<\&hbfV[\woCk4ݻ<Э엯K4#&<坓y'N啗7jml==#5#]],,~\V{xYX EEEEaad4VTJ;LwO?ݿ_.)!᱉3gL:rdN'׮÷Z2#CɰV[Px,1(o%J IDATSc:{nCŋaCn^ٴܼoo.]~d!>~ҤOLC};V]}'fty))|߾TS>~93f$%ujlܳ_zV9rj\Gݓ&MĬYcnks -^qc~A_ nmg(9oE͑'e]v{դEsrǰaO=c]ݵkPoԔ=i;V S\S!uvh´iyII! T]} }mrJJ^ѯ6 ^^HEw`_۴-z1XaCA~H_'MsE^Wk]F$uvڽ=_\TpMEżyWZھ~Aryk\pB0bDş|Ѳϖ,I;NNꆆV-[mN e&d!R~<0߀qA~J^}9Vn5 O_]][{yNwl>,bܸ}==otFJelj9G3Oj}F>RiWoP{{LEE%ܐK$^n* :Q[јqwlHĉsNnK?{fΌil}|}n._4?d!ӽ}\/qpAoX+FVVb4Ֆeddތ#Y'喖UUj4:MCAoiv2LU55ZBa`ooQsg=.VUtz}oWzꛯo~%Z(>\P\5^-l… kVNjjmKDDl/_wR1o1TUubEZUwS7 }G8~ajѴoO^sGgKKk\W^(W4`eRIkjom7V3U7P=OOɛrTUUTX\VSsYؗW`(d48o\K?sxX`Z`m籶  oߺYcL&NozRFv + ڙsu[W5m6K}w?  ;<\~,9vgL^ޞ*֬Y\VUս{P}CCAAƑ[7n<}Ơ\WN#n}Fm…6-G:KWO/Bɓ;[sWݽ)o]F2]~iE|?}T*2?/2'縸"7k7){nl<|(%e-Z[[/S5wo/O5[ؘGScV~-+WGGon7n ˕gJN}d^tSڵaò{LN;#&XVضi(*cΝj`m+W}MMLfcֽGbbn+ָ ,-c3jԃהmxX|_cFvkg>K7{mL̠AwvVV^ݻy'ş;Z 0,r{B+|]@$@ac+Vn(E7b& lK $Y)'Z-ڎPs+jŢ3;Lf!b1'n9|_%t@k`6І1iĚXv:Rr$=ͥHwWDX ZڐӒa&4d䔄h=L@bމ sdi%G7b&b&b&b&b& ZO&Smm֩ş,YsǁǎXY3|isLҧBAL@;x"9G^~5Ņ#xKƅWVάS,X'dcߘ mvh,(XfE1~⋱1vv >?"qX{G2eo/Xj5kz2"YMl&]1 6mZاi3ft0 C3gLW8y2e}S zh]L@R_ءYY2cXX1].gnzFDȄsgf?9@kkƒ#[dfu: Э=2JK Kt:f  OO?oop\IrQ&svf흖kC$9{Sv_1k$ LzC^/VYg540{Рih&KB#Zece%u8ЮXYY,2Ahhlhnz2߲uϻvL.(,+llT*B9r.]Jy>jyYPݚu> Na; ?=bo0wK˶ld|]uMN'{XZ֔dj7%~y !Wlbl7[[\ebe%ZUUPx,1(o66CESvlHYx?eʃ[\s U+y;';:Oܐc pqw i{~k`g(/Yo' _V9~da㝢lmubќ5?iQ?b.]<kʕ; }=گSTW}hfvN1eʤI#ll."CN׾V<89:z_Ʈ]nͼyX7-7/))?$\ 3_zO]=ϣ))! #Ft\G-lɒϏtlh:jղ۶t>\&@kGZqVӤLN?egWUTGGT^A46nŋ~Р=v rujMﯮ݂υBPL8wMg̘V_?&7׷VeYY!AG&2 ؏ @ׄ-Ũ?2xЎouMm\3&&5mB8gy7nܶ59yKKK:2O!CF$HN;;,#c%f:q.Vi zK {tG_X쳥 6Y;..Cϟ|OߥJE&L&Sرm[7nھ=axTaü<2Oյc=&|᪪'޳{Ƶk?wnB&>/{Moѣ'0dZd4ۿ?Y Zݣ).m*>|>{^|i1?lijja^'U*|) sEWFKt:VoFc#͕˻tIJz;x{ ޛݜ[\L=i+VZyĹ/'x哦}]R;uz~~7K=K'"""#]T6:]=wϷ Tm)dºu;wlؿ?8x}T9:xy{zkkXfr[UUAAv Gnݸ^&sUukn=o/Mf3m:~ux)A\>辉|0(xeK7i7d뭭]]O߲o.w޻K>_~ =zΜ3P^mraæϘX^GX`?b/yzml#驱c;wRX:r%ח_ө7hם=t<W~$րb*+_,̓Ѝ֐# 7x wK*;ŒVB7RwZ1ІK6H%qQ,ǂmGXX9b}X5b &2 l&1JPH }EOf3mySFُe'3-叶y\|wEŝ50 hCNKI|NSz3my'&s4@7Ȓyz,h>LYdqr;VRbeӧS͙3eJ >f3Pc㉬{y|K/^Y;fN`jcB7Mf` -:zgƌW|ً/ ġCcc}tʔ`Ūc׬yɈf5Zvh/شimFc>S͘rd&ݻϜ1mz\_ɔ)O2uac&!_}y>/hf@{P_ءYY2cXX1].gnzFDȄsgf?9@kcЎ %:\yp `8w|:;pNK!朽)/5^X4+ FLaTZZ*4R(U6VV2ZvZe BCcCN'>fiy#FAT*ʚ5Ug$5f$]=YKڦLCqIj |#9YOHxyܹII~9d:oڬYݻx˴Ⓗ{׮:}Xvw }Ĉ~n<<.d6WN8b£^9ٛ7}D^^yy3",ϨQ1":WWXT͛9s58kpe\rs0ĭ~=h())-J//wwZSV(<<JJ6_⧟ z Na; }[&./?%_rtgܸO<=gƌQ{_}ժ#G4k7*6*v5ߞqt=)iO̚5vL6gϭ߰hE7\~wfZmn7.M?h2u?i'O衾fo'`g(9o͑'e]v{uISx 0p_lZT\W*Wܱ]oگST]  Cǎ{I١CDtt~cS'a0ݷ~],{{:'4f̠A={Fw3`1O<9~BX+}{ .N<))yޣF?9ό3p`nѝcbM3g(gw*+ EhHBˆ#}}dIދ gNZl:]ttRbB|` sviYM&?Co,xήZ:GWn1윣'Oj>~# Uƫ7$V(e̢b1.rw2 +U*___?WgAuV1LrNwl>,bܸ}==&YXT*+%"$dĹs'O^n=3gƴY?6AuO/ ?2^~Lھ&l.FM?v|7hjy61186.VUtz}oWzꛯo| 8:hlۗ?@FUWh m0} ˖}ctÆ5~'5%""6v/tQЄd;m}662SzM۷' 8lIJem- ^WFx~}tF\XQQU-.(ru!l½EP{t2ş{Mc2UUbgo‹/3&0 ?-MM-,vQBC#;Ei{v9кem/Ngo߾u˙ZL6n3L{VX!'ቓ&'x4iʨсEE?l[GMV7z̐!>>.E|j֭=w޽۷4{z _ YYyyv>'h",l^fGWB+|g>K7#&W;L VB7RwZ1ІK6H%qQ,ǂmGXX9b}X5b P C!rID'vZNWỵgVkjnn^tR(7jk N]~Mmk{uRN,-Ы9hKArv򴱹[ܫXf2jΜ.-6<:Dvx%=*cG/b3Ʀ.MLWvtdz2L2P^{14^_QQVVY)=ݬn|LVS[QqNg7 TZ[Y[] :YXX(nR+>hd7Fekwei`kkgog+L5uzq[n+,33 ,]]L&Qܙd2KJҾvjM&A\1*::ÕͿ+^3@3]Y&*! IDATbqBi7vTWC'N\trsenAPNNAѱmllle2BEQaNΩSmݒIaEwruCgLLd&imD7^nzyέ559,.Vpq_=<,:Wo޺a}ǎffGw_P8"{3@3 ZL&M]mFck&SCּVnM?>#cJJ:uׯ[7O+ChH__^_y(W^@fi(3U],-+;oޡt啕2n=̙ݻwQ[1c$=UN՜Gb .I+V0Z\LLyF.74^eaa0ՙ WE?'sZS n_l3s@TE_wx~sO& SyI8#$ihgωeA0po3d V~bڙ`_7>=teu ](IsF̐?(P,: e ڨ tsd+4^'`zRH$9025b)րbUEsЦ$ÆmX'$]%~b7ouPb4Jb~h=L\69+,m˼RvIļm3@a^Fz ,h@K*/>y4̙ҊrM30cT."<=T*-E *ۼyݿh4v1zwԨK?~JO/)jl&`2N?QQag5,~X7Ri~>(]ܸԬNH,mapoc6@ 9]Zl2yzuJr{TTǎ^>rsgrs+/Mdjmap#fhee2GY[y;9d5.tM]omap#fh5uF بlllnHLlmlrNS_o2~K7o03%2 S\r^o04-f7~[Zd&)nnD&A_T:LF>b&`cISW[lР5/=ҳ uo #{1@ pqquup.~D:]yJQr7݌eso #{1@ pr  tv1JKN?z# ʋ'O?^oЫ݂c2iK_&-ubHՋ( h qQNWPuIbF&FS]}Y霃=ZQngשSzW~z}A'c.ه8_ P% (v^^~VZҼU&_NӱW3t5EEEUUJKOϐPo/{;qڿL‡5X'+ jPI*;b3Z1Z1Z1Z1Z1Z1Z1Z1Z1Z-hs**D(%jB$Ab1ڈڍɶb)J w޽{ $\1!bYK$h L9`J?Xqb$Wi+(앬 ֈD@k fhvk(!x#[8\, Z[igΊ 16xkmTbǤeg3 _}=o޻8ާ+ڨQ6\_())✝ 'O!Mt3M%%EW gzQzglh,)=eKf^סݺZZ1wY}$)*ӧcTHzѩpѢ`3H .I+V0Z\3 yZf>֫gl! _+=V>~ںz`3~)K9rqpos2:9;9gB7[[$素tr'c {V+;IsFXH-6/JKrtx^Luuyoٺ];ggUV66*N^^a}z9n|bb.njR|Eֿ_^\Ae瞛9sRL5zwou̇>T^F㝝ZCec)Wް~SϟW*||"";naBoPdIN~ݏ>ںEiω~[ds#/][ .9EEe,/,4&'[Zj?6m޺uժTGecwީ;1~)% ?8/h <#ZZZ[۳{t4ܶ\C`Pŋ׭_*'lRC]&I8C3w VQ3@ȲYl5[6mZܕl0_r ߳la*+KkIŒrWzun6u-ϜqKKբ)$ٙf|*8@dtrZzIiYٕ:215,=S÷3(/|fȰ;$bb2ԚI+n; b34j$35%3R\i)F3x.^e9H)w !tO*X4Id8,IvmidmVV/O''űqql3 .]322-s.I d9oYK響RSY$J/,dL!I)4Y9r[=蓷pΣGŋ7m.-NL^:..5eqQeej._\TPJݷs㧛z.w_^XE Bd2Yf$ɲ7+zn$SS~jf[ :q|pfX~Ŋ+nmBBaAIEc0\Jwj&ј`cǎxG^aOv%%^m.9xyr"#j%Kԭn$i^L1IrsrrslmintOO_P;zLKKP0ٕpY5Er?^mexM'7bĮ8+95rg3 Lj&D5 Q@(f@P3 z>AE@aP$%(D1w5,SD `*TnE"&3 `P3L;lYVDV\LLQ8xwD(j&QV~ZBWٻOdC"*0Ou1EV*BmSbQdnV3-0}C^ ګ 9bڵNg<ĦͷfԕMՊ'0@lDիD승"5xTgwe2'@;^y _$IP=G wɉYGlkQ3-0a_3e.&& VĄӆ JLa#p:Do1L’Z^`Gdp8"8-gl1($¦dq^wACd_6cewN\;3eIbfpt] E$;/ ~Abz6S|Ȇ"s}Ej QK>{Ffm"u"HFkjjjljTdِ+ .6[<'2P˦|܉A3A &s )Eja$߶u"ܻAY0w4YQ"e,)EwHB]ʹ]|;L\]6u9&Ψpf)mw;  u]Q0'f@P3 Lj&D5 Q@(f@P3 z ff]MMM]]ng.WzZnnYҥ%ifVE?F?$m>][#vt{WUXYTtLzzj?س~|χ@b5@ȲYl5 IDAT[6mZܕl0_r ߳la*+NI3χ@lc5@==]YNK/)-+R\f4gj]pFHǟ#XGА׫ԔW\'?dJq8͸xqfF#>b5@'&aI6f$j۬Z,ONM''eǞ}ddχ@f,Ff$"Ia`(t{5S0a@T/M:HCBP`u]s$t?F ,VId?o~G>urgW$) Q3DAbbRR]#ov̈gxhdWRv3Fcχ@f=''7י(֖Agδ^]y9 ׮@?kz-iat[QML8"LvLo_۬~FPgGCc͞býUsr_0{[;{[N_h/,Kt^^ cHw5@t6kzzvVj1.==zFdM|5k֔V2\3 3mh?F j&饗E ~a#-jj$>rLj&D5 Q@(f@P3 L=Sw * ")Y@'ŒF`L)1 zPaVL*uӊ7$ L Z0P_}d>m0 8`^:'bЋTۦ>_},p5S(ꯞj<;KKy5gzWO5:s@l[{ǟشvV0݌ZqfX%)"WswE6-0?zO5|vGyyZfYyY)s@l;^y _$IP=G &&'f=&FdEʹ~6Δ(;bNmz}(41?+BDab#p:D{aIuYp_{S28Yb]$L6E$+ ئ`=(bwoۋGwx7Nuߜ$%-[xF Lcv|';~)%pʇ~["5hU|]Ϟpaxxr`p8237nW~@/8w_5Է yݑ^TGԶmK nZZ?Ɇ%K/PQ~eywO~W:ןoT$i>y[>V^ʏ}t˅;;aY ECRT("yP "0J=)>AdzL@wϻ?;hQaM۾GKHhn:p`^_ڙ 5X/}+L3ܼ{[og?g.ZEY ~Mm{ɭ%%ɲgk`d3ų{ZZζy?-P3rCキ|?/dWNJ:tg+E,76~EYbLE.׋/=}A{H]H"њ370 ZnQ3Ku{=~ښ~yV{Y"##w'׿Dow{ ɧ_߰\/.,ZG{_?Ȓ%['&Nx뭷Z߼׬\8ky/wlYeecG{y$' _+ȯZ@EMdjjxϊg(7EHy"gjٴ:ڙL ̅[33 _n]Zڍ'f9`@̙@ 3ltYY23y㖖邢u֮+޾EY).I;>vwL6kQ՚L#P"˩+,+הK|tS?!"߶u"ܻAYsᦫdyr(-:&ccc33`߼߼ϕ$}FA^'+IR:~T[nؘ|PШOv],Zmzչ]{w}]{{ P^VV69X_ޞr#ӜADZY"Szv: Mk&I2MfI %Q$%N#IqqJN7G̸$Y Q.Nͯ \?v/i׭{={kN#,?;޸WZpǎw~W_,Z;ޞjO+`l:'rMd>QJq*R=0nQLyyEs58oo׹{ \6YC*,,-~яܼ驧L7$Y,99]G=:8qg3]-n|e|<. ư<5xBKˉ--Ԝ$QMHp|61n&(J?|է=ZII:}oݻv8ppƢWn),T?SX#[LvhHIXUU\b2 ikhC54%,_}ֶnz}5(q 5kȘ>㏏;x`]Ɏ֙W\\Rf(9+{Vɑ5.:u聃{v<|Ɇa9}<43SVe5 II@m===ӛ7MLf5"WȈG$'[$֧EV^~?WojQRrC"w D<>G76%eV/]@y5,{G|ҪJWUUV(>fSw:xu2%禿[o\MMٺں_25 Q@(3M33ή榮3 v+=-7|ҒTYjPommj:7鼱$Y,*7mxp%[WA9ٹ9fo]Wr*=]- I2iii˧]q@bDL}N,]c.3SS3Qnh8|;))Wm̌ CLO'&&+K4 # " zřh\]C d0LqWʨP(RK'^j~Ms!YOLÒd1[m7ߖ&IV-fjerR6pxlBOoߥ1!#c2r$8IG|׿>|8ebO[rr++KKe&$\9# 5D4IuE5^Yi O,OLv;yup](!ܒܼ+rr-Vb14@8{^-5IIBF$B#>ynp  .pn-5r-YlYrR0r]NtZ9љl|߷ ޖ`t7K/ܻAD}h#-j="I"#p6 Q@(f@P3 Lj&D5 Qg `aiTERH"?OpgP30@`0 BY1V)N+,bR05kjC&ukEdϴ*cwwV^ʏ}t˅;;aY$f=ދNץPD2ڹ"'Da g3'lX/2WfZ` e\/md6!RW/RdƦFO y"0bSy"3 l .ʝ$8`0w`)_NFm;Q'rȽDUsMs05? ҪXQRt4(L8'C eS93m" WkVBv3`P^ s`l&D5 Q@(f@P3 Lj&D5 Qg if;?v{F>>r斕/]ZRj6k_a JBӵ:aGoͽgyUENt={݁1|.V3D,| MV^^eӦ],W=>锤;3|6V3DL}N,])_.3SS3Qnh8|Ɵ#XG`z5Ù⊋L)Sy</ܩ Q3DH''}$YVrMbdmVv5SIYχ@f,ͺIDӋôPjHǟ#G!I)4Y#[F$!!tí?F Bd2Yf$ɲ7l,OM}3V[Ϣ;|>j&II v<6yD33#Wqؓ]IR܍?F b:e=<螞9w̙ `+/?';!u>gMO_%- >$PqE !6%:޾Yg~ՅɡΎǚ=#6[Eņ{VX-#`ȑvއx_X輼( 6), j&(l4c\ 0u{z:::/ɚEYk֬)+s%7d4?6f0fġLK/ܻADˆG$'[R)9ID}!1 Lj&D5 Q@(f@P3 z`!jTERH"?Os `R? b0CuUuuuU¬Tt+n1)I0`ڡx`Ⱥ"gZer1Ż;E&B5pHb"J}}"aV@tq8uNĠY)·M}ZYDjLO9ƛ7ԧ=oOdMUb$͇w74wzq ضv3?i`ueSuʼn"0JR8EV+ f ݧmj ΔlwŊE p0/܏^xS>Q^YV^V66W E"T s0mbrbc"[jDZ f z?<6=_Z|"_sWZW~zɯ̿vZm)sQv719506>PxߟQUI"0v8S"s} ӽp=),N[Ĭ@@LK "zs @lS;D,|]o{lljJْ23++yk_NI$/o ?ju\գ3s/3Źk^ |oo7C!_[?5FUU8sĉj?8|oh띞65Տ>m[ԕl0\?wo7^xk_+-?Glo?o:~zFG{mGGZ[{zFFU IDATkZZq5۷?peeR\|ܷ} }wvò};,{ǎxe6my䑯?6aֺw{w+_>H֢hWM2]_z6 wzrE$555565*gna@ܴ剉M33_]k\^7SZ"Zo_+!!5%33)bϙv&eg-Zpcm3ŷV_e*+]~w/?9zG.ȿmj32|dzlW+/[lxѣǏ]ݶ-kQ^.@$D*Բi="u333  7@$lLO_MmmCCg3=ݏ_׺,..#}QVKҎ]}%g|-JrJZ#Ax~:"m;Q'rȽDU0&/Ǿgx]w߷cO_hLN.-]fy()v:"[3w Cg?x|{hl} T(h'Uei@~Yh3+j@UL%>iPnW0`.|Az}RRYM_O\hm㏎뷿k?~'/nMO?/ӆBz8gx+Z^5=vO/KumODgO7e˦s"gDQ׬"s3Pm0Y7f=>5q/h2ҍFj5Bs. k >!؟~-vHݼ6T x] 7:~\Vt=6_y/Dvl9CFWTx% nQm~F*..-Ip&-33#9rc\QњyիV%&?/~nw<}lal{3Hii^KKHHs{;Ox_j$ ),{BzFZս/~[2/?5xj߾]:BA&)_'&3љ89yý{_{m>ҥ jMNZǟ{'6ޛtHl'񍧟j~FcgdXyl09[pj33jj菿o=jd-z?oǗ}O/k~k{_k%^ Vش+_~W饗ȆHN6$>r𐈖@䨙Lj&D5 Q@(f@hgWSSsSWWt˕[VtiIqZ٬L5(65ixq ̌ŋZ\J6$ao46&7]ξwSOw_n^g@f( .zO~dåKGQQY= MɉMn]*-hQeowN_JI)(+./-5ȹ m)/s8.W>Pp&$cuW5PI)ULut745z<6[yy͖M/w% r\)înkk;[X Zddf,ܴ91Õl^]ddͻwv]}3gҒth *$lv&Y,vŹ#-1Y{z:^RZVvhLM)//+KjG绺. +_2232I3=ퟘ /fh/&j&X0 yLMIq}LWZéь<gfquY)4`3])B`H-zJyG&6@dyr7>1Kl|[$YxUKIq,w\\$ᱱ =}ƌe\u,d&Y}_@@ 5>Al)+,-Yp/,TL+[$n֭*ItzeQ0R?2<1uQYZv͢+pKNr8r*+ɵXm6dhُO{a{jjTV$%ꋻ# 5DHt FVV'-j-(n0ܺpx|цyMKlKMY\TYrs Rjy榦 Eݗ+"}w`l&$L$IꊞԔߧnFZnւƃN**֯_"-:@PXPRh zG=#.ҝ# "f4&&&%%5ب{hhX=F33#Wqؓ]Ivۧ }#GjnȬڰ~u!IZW*;wGb5DL\g,[[>'9{!Lvd'$\GiuMѵıܽ}Ǐ~m_ ?>^{e߷`z*JNMs8.;pwl&Ir8JW,-==--KK2l33#[[-d#Gvv߾P03sx l_ C'Ow@{Ԥ˵dɲeI{=t;i-Dgr56zx[NvvVjZbR|Ţ>Pww[ۙ3}9+{ʌt>zwCQb0,_y-Ɩwt ę.Wvk*&'WLfÞ`Z,!ʠ_|3 I$f+-ݲu+%KJJ;ڻ;:::IY6IVoZYYX,H/,rHNu$'<$Lj&D5 Q@(f@P3 Lj&D)COdPPI"<f A b7 fŤ[Q8xpIL;L0D֭W?Ӫ(S+))6&s CEjaŭ_PG `.p8S]D z"|端E1[sL Loа߽ABcNXv3?i`ueSuʼn"0$3Qd*bHʹ7^?iee 쎾W^)fRe*Q0`brbc"[jDZL {jLɩ)Uz}(41?+BDan;g)9[ ӽp=),N[@ $d)"m\W0@1{P+o=Xy+?~-Ο eY x/::]Bh΋laئ a\_i)_rҳ޷b[{H]H"њ?Y60V0O(Բ)(+wbvL ܡfyJx~:ZɷDC"naV6fV<(Hb";KD= |J#ҠPW3mW05,WM]Dδ'n3*\)YE uΠfCFWTx% Lj&D5 Q@(f@P3 Lj&D)hgWSSsSWWt˕[VtiIqZ٬~Qχ@,~( .zO־ȇ~-7U+V:Ӂ쩯t_aXut745z<6[yy͖M/w% r\)înkk;[X SaX1Y{z:^RZVv|hLM)//+KjG绺>b5@ĂAghHgjJ+.g2RNf\83sƟ#XG!YOLÒd1[m6IjYLM''eN?F BTh4F7V'I~N/C۫">b5@$Ihdbnu,F k7|>j&IdM$ ߸;<5[Ϭ[m=a"f4&&&%%5ب{hhf̌xG^aOv%%^Ims7|:j&IÞLe`kKs{zB3gZZz/ɮ섄kr 5=}ǟ#XHB}hbRaanTgfzf5V'&:;knlZwQﲔ.^*`/ SԻĘz)&sIb&&M$*Hva<ǁ.ffgo}>_)uu\A~G`_)|vIu t4зp暚ښn 7l== lЀL:{Hi&gI̘NBv$Pp06dnFBl" tb@ ti&@f@ ti&@f@ t"h'DS3s.g'(1oH36gHlJѣS)i|Jd % i&ۀ62')$4kS)>ʡ$ǐ@ L$s)!5[iPKN"3Jt S**IY$&RTuӮݖGBO-MͤTӺu_l[ei@[Z;;{߳s%}L&6eIC?X4[>?t0\ht\<wcc&K*Hh' Sif24"1}~K/+&O\lٙӮPG&$('.\c66Lf{[^ѣ{lчO<ȍ$~ Jj',9ܜWJJoݺ+h=Onn9y뭟}{wOoTTL̪UBKW\WH[ %|ǟ=謙`e$IPƲܜst'G(aЕJ3l/Ӧ]t3'5mÇj]WV>d0ꦯkl;t()i zxJ<”gn!_)5 8ػ83}}%ye ?zu)SW૛c6qN$J(dSP ݏv[BT(`p]:\^Z[\,yzar&Y$i )O.Wdmk'3z{zbtPJ۳g8q"#]&$qlWǤ̙M"r1溥HJ$1c: *LHCV(Ғ?~߯..̜b>斜.dVU7tw%X'JUJb(d:9.|g5$$M8}jޭ[7k䈈 /3ĘN\en$gHR(v$K)5$2(?SAyxANrx<:ɴ[M6.o#!bJT&?:zΘ:uɒy11X6uEA̼"W$?W-,ʺpH¾} m,dSE%"OPP8 7vJƛNd`{IJ{qwz\>8m4T[Zs/TV3O?t>>Chۯ|a{;?3VXYK^߻Ƭ~F:(%>D#@.'a,0ut8q|[݌fyz W>1Nm2YnΩSǎ&%rc}6GJ;jk R/H,-8s&HL]l팍y\CC>>^qIٳgeUUkhl6TvvUWgf?kW||VV{Jic=/(ʊ %b15ϒ_TRrcND3g-^ p)%:I3D :<9(X$ʪRRΞ9v4!a23J S''OO++$72sP(0((LL3U=;"޾)?W&i&:]&[j늋23RRΝ>u3饥Gt?rvdhn#m&1#m$I`8mR܌vDti&@f@ ti&@f`BYZt.=Ah1kҥVV ƨU^[Q&3YF k+GGoO+K=+R0F&km+(<}Ç:;S?qHseec`PhXD7Wc&=cӛ[uWLWH$egU]\&rrR.Ս~bqYyzFnN{ܨ s6[w'G{; !pѢW1~&&t7Ua!/\hl2F,(onh=;8K YUQ]٥VJ{L#p xIFsZ07@QRh4:9Z3L[TS<7t:Bidϵf;hTFc2tЭkA o@x|}=HĽH4T"m mp-H3-8SS33#M:|G E[{k[g'f,003zܭ!C\. ]>$N7888:j4MyyM2٥T]u*P?[a#cF#@.'a, w/G,H:zz8Ss%_<_VY|>d*uu\A~G`_ 2hD P(46J$4:e_Lko30>#4AMVC7O.!'\Z֞w㥥KHRS$TGxIJea"k:'0|J`/f[ "#"99UUeei5r.!$4r7Ws3U37f3.jk'`O ]27#]r6f@ ti&@f@ ti&@f@ t"ݕh'DS3s.g'q H3ܖgHlJѣS)i|Jd EWǃ4mF`KNb5)J acH*ل4m&1\JEMV$v}풓H#1JlE}ݴksvfɊwHZ֮jjJߝw=;Yd{LbbP, L#l p~اi&9;\s`[[uT*RV*ˆޅ>zoX`ce !0߲řXLZ6֖c?fRj%ܵO!AA$4"7?xE*0\D/L,J'\9PbiV57v4[wNz(쭗M6خfRJKӽl!!uuw<\\BO\MG@FSSzԉI饥u--2-0vswOL9M54<ۛسZ"=vO?hlv`ٓ pk)gg{UGgĥp)-#N‡2R~lוv3l7e_z'M57fSx]??s d/HNNIYř22ؘI_Ldmgkgkd4oLMwԽ{]Mzrn1 u7vC9ӧ?pP$ܮσ+hMA$nt?m Rtr$1c9}4##[;{;S+LY -XKrKJJSL /N72 lf&iܮ9IQ.\4I$fL'c 2%'쀋)9EU-bD"IR2EIV(l33CCs1ff&4Z߀~]6ͦGI RJu ݏJ'i&6'#tԩK̋ވ&&&j/>߰a.4t\K21<٤ш{Ifd,021i?ɓGsz:.D..qqgK$,\-a#;wCVO|9kz%KF *^]V;ܳ+))!᧟BOy1/n>tfok'`Oi'77#]r6f+@ ti&ЁWSHPQPdw`#%]F'ܩ-AA?y l,EvSsHh]h(OS[+ ֈiF)}TٝI&@.AZ#Ԗ4LR :C*lJvB9}@kDyP&0b^܄=q wOK-ֵN}@kDy\?h(OÌ@Л P^ч!_۴ib{;RdkhΞwWlm-ڰqÆX[Xm{sSٳwӦw>tah 2-9 -}}gZpiӜp-f-Tޗ=j`q߾{K/ - ttff^L)+34 ollhوFKmonҾFCg-_ &I@e=-ii'<~zzZa}BCs/{_hƭ4QDh::23S/VVO7ИԄx]?:21ԆHȬYK?/^ܜxhfVo/:f-Uރ%Lck*Z(JJUXXS٥]22hZZR/VV .wwio`s~hjjMff|ufWFF!^^\nVVMMcC[;A uCI*+7D<7j=VeO]L).TFӦ-]bŬY&&5'Nw$>bqqMmkLg-1sI\\\d@p -+pǏgeVTS{72rqZl@K!C֖ vذ/~歷Vd/=۞swro?@>N+/^ܿoS+*%.W(tu ^<66(H(toWDr—_ү;ج4ĉ>ܸaK'xa.-Ui>ho_VzHbb~~uM{Bah yx.[)<&})%EʪF45ur pw2\6V( ~eÆ?OOwww]' 9{~EJ\pa˖_OwwYĉ\Ny9S/ֶz|++waq̛7a)wF==L%( B9ZܒZScb<ގq-X;H%**rkp,m`,ZiSd×ka xwc&ޝnzi,]=))v0{vxĂVEG3mm9ǎ8kק=;;O<{Nt}ED2Yyyǎk_͟~rBpٲDLf{[~oǽ,ֆqO?ӏ?:cFdܹ;gQXxC|Ňtt\oZmm}7~l6r+* ^^JUee^nAXT(==yyyMͱ"g8/X[GP;,Lp? WbOo}du116qyٻ79i2 \$04r:{{ξ>=+y'1IAfiW͜IFcc?$d@ jmeyEilm`ێ< RK6 bj55 vu55*_xwi|=am=gC}xB;ۡ/oGq;w*^zaսnO7nϔ䬬iSBj꾽5"%cs -~!Pܼ)S֬ sv 4Hsۿ?wn^Od0 ~a"_P >K:9݈98rǏ''GEy{ϙ=ƓE}>9^hkO<17jXY47~џKPqbb^^nnUBBZ/(*&N 4ɼhk+myd%yy4NJ{yKZ_Ï\V^..<^{ƍr1.*fXz؍wLJ<͍aY,5E5@)(loom"i0?.a2TjD''Ϙ`WI&c߽$qx{;;љNM-sZ kݶ)OmIPsNQzčMU\Iّ)쨫9u4=aIiw' 76ͤDʛCH@I7*?Z[l hBX"!kQddyJNJ!!$r f 53,)W*\]L{I'ZZ<|!3r27W7WKoKK dy ѼHI3$WT#wq[44T(Z x<.s|5c;k'Ǡ c㤤ގFkl/,J=cc#"'1.l:/{iS2/HY{xjؘThқbH Stve*q1 ?gV^6oL?H%O*B.֮V֦75q9VV2iEeIiIp-L +;-<<2Bh1ضƲx'My}M-de>о]Ͷ3Gab_c1de壻6=pLAF ah}({{{zJǽf&ĘF!4)$Ĭ̪K\]23N[d WݭP(ewvFFӦiyQF:]ɥ}d˽n-=ݽ ihdh׻:YXNAADSA~sKl]TXT:'Mx{s8?S\?uJpPSS^^aLnjo;hIdhγg A^iqlvYr::jj+*$}}}~mA;{#"uTԌfJ"ilܽssGj,fVfNN{{DxDeLm`<32j%T-O>;E]y/)+K-rE;30ig9wHk \oPttw?Ы^XB=vt2VN0 pSY5-Z33LMv fL;W׿yCh Ri\mܕw}JӭQsBK#=~Q}P*;;;{ȑ\zW/fgd8=77:999l77??OO&_rK--jj zݢyyhijHkg]9DkѢMMF##T,$7ڕʪsu/m@^ytt>Mvh3;<\;j,m`hoSS{_X FE9;vڷi3=\{fT=0nx<'g7w{[,lu ii--F6tSPWܬ̂mP8qI?x.v fCCj%(:`U&4566%0'`eeesXn^,֝\or]\lhʤ3,IW*IϚr 01HK˫w4\FSRG&#.q o6Aj}}>+064G/2==3x;ۑz&&>hGS:60mo,хӦ-^W/ĥ/fl__K!UZz\|]]jť%3f0Mg;f.X<`X+! ??|6Fss[siO L#LC&W`0Kn8ҲԬnQ`Gdoٳ63Fn&g`9:E^Lپر{.$OSthM;#ܮi&>_ÖGZyV(ܻ ,,l#>C͚dhxsg{@S+r\-|_K?xg=5unF31rq  [^xwkcǎؑM ]O_hz&fxAι2YNvB[ ,4ۗ-̈́9Is=;t IDATJpȯh4F66,_t$%^^2c?k60'N||OLyzMR䔕yzyy^dZ|v;ʹ7//%%i9A`LOWhqYGӬfcmK3 K O\~_0wKNή]4&ޝ$fL']N2m* ͧRWyqQHȋ^ye|[?: }Q0~-!2JF 풳dqA5Qp\h(O!td&܈p5<V@؍؛"!p((pr\xƏ?\r CBMA͂ֈn ( #llI֑H<29 jjk r>5e6E)9$- kC 6Fu;h Q (7xHh'h'h'vrmH3 ڡ * 0(J @;n'׆4mV!,hkK7p=~kٳQGgϹ}5?8~X" #M1mO/^燶qsۉLX[ƷJNO`cKˇ<)@ l'#A 7x}s(*L]rnڇ,r{x4bW_UXkŗֆ.JVk4?xXQ[dTbׯTzj P7ۯ66nlf ^xN|ќ9sy|8b^Dvnn?825v4n $>d ;[ssWZ$-Gbmxh^?;QVݷW.l'ףM,13'Cw}+F<ޙ3YY5rZMdJ%&Ttzxx@N񿿝h4dUMVoU4;Mmh/,fԼWֽj{kUMUUv˖Ͽx'~ NkDR]sLM̛8q? z{OJss*Fhioinnuv41 BHRR[6)v#ICkI i'\$KE2֤2B [#AWtZh-J;;;;h f괩Ҋbq_VVVZM&xtݿy\}}[۠ࠠsVV>ēB.Л wnsV-\:cwuյ5] E]=<%7cˮ85g?l;U*[E6lܰ!6ֆq}YTӺu_l~߯ei`\h<{"\qqKT*k^:NhLJ%I3rd{=gHM'N&ğ9ZXX]"hԆvAA焇_=qVWٻiӻ&%=^b]Ze{vg?R͜3yz;X^~W/fL'2]bc2[oqxB3%0(0Eioko1Ѹ\.p8;**9Ǔ/dֵHL&ollffe6'<2rtW#;3-yޗf郌 w~1 F#W89酅}>M|=ǩttff^L)+34 ollhوnPVu6y޽$Q</{?2զ|Lڤ?{%}R)K+>Cstju{GzƎ?~ VVAS̚dqt]W_^} 33WzkMb./ϡU斤z㽽|ϗ^^ÝϿ،sZZ/ ͅBK[h1a?鳉Ng{gۢiuu4/{ڳJ%nC+\If  tzgWk[m]Yiiquu[Z3m:/!7 P*%?'Ytƪf|dS8}*7oLMyQGGffjclǒy6"?nS-}}Y>\.=L}cǯg?t dtzdԤInnzmmbȯV74?LNQ<ʫWZ 졵&M6-2"2b#}{˶mھŎ׽V ܹu˯ BL練+33ֽWֿFTkjfx4$i===j}ч rUmI۷oݒzT[=T3+q p;{F8XT٧!S'L9P_Ĵ~`(\nҙ'69kf|FҚzJ`tO{GSSstխs~7t/>߿/?޼3JKbG-""bDJ>iP\.7>קR~Ny-XsUWߟ:(=sΜG dh8V3\^p۾jʔ{h{;v\Wǩb;;:76ZY]]]4BPhh==jecscy>ymLL{.zU.׿cS[2nGkjLL1<cI45DEYE[]1ˈJUVǟo[i>ho_VzHbb~~uM{Bah yx.[)0X Ea/ll'zի}9KkW|–-LUoc!k֞u}ŋ5i3i|^YiCXh5w:&f$D0t:iQYd)ERQe6" c㫟BQV+53<94z>ӧefdd!ܫ$bV6*zTR#k__mmZ3N?QZZ%c++WАEG e|{+OJPXX[.W]'3oބ f+/*UgW~{v'ħյ"K\2'Khjxq;OήllH\588:zؠ 4]MRdXSZpkoc֯K$'O~5kԹmݑ%+fzz\ATO YmiSszZjj}_`I24+Y_:6v?ӏ?d̝{>z>>,fq_~'k,^vs hf&f嗿7t[wZuu޿rђٳ R2U-2ӵ=OtvozpoLѨI‡!,&`)z|gpP쪯ogEv" iodg;wYKSSsGH-O&I8?GFo}sh]۪-gnٺ%X8cƲekל'3ћ 񛋟~YnbȄ <<dµEGox|Ilo"dܓ$1wpMk2Bax=ҥNC~~}QQsfkY~kbt'ǐABӧ_(-˽ 4^~*)r׮ƷߣFNM^U!K2R)T=RI+FO=pc~H'NJ]"-#蚚{{mD?_Q3\p|>ViL6O6R*23R/65INN9lkG~cٽ˖iiGIYDIbqTJ%/jIDTvvuvVV!H$ n@:i꧟ t_||L7zkJJJruͼyvN$I9amY#rq7n)uQQ6KK$WRlfpkHaÀ}}BNKۿ/>iyƍ7un.|~W7ܼH ߗz3!iTT2G:~X"9z)4▿T|֬ǟpM _uXf֯?XY̳0Gs4*XY 2iEeI`55r8fdMfFvvk5WC(3 a2&O 8BzMMYIUP`j^thRI"T&kV榧BqxE||B' ~uߞSI*@w0h)b iqumRiw7I0'Щդeߵ-v7ISd`!#YY!ˏqXtR'HjB!'t@OR$JX11]ݍ\?Sɓo-N:;>/?vرI+ZR! &m1aaaJO6;***Zh`2;;;;}FΝ~xgpX+O۫ Z⁽^nhڿZ̔ΐBQV]T$9W '畖*6"wOggO&#1vNN"M8qu:7]j=^ܾ-5'$}==}yAP ε32V'88>~<#L(+#CmŸ8_nO9 -𡳉Ӧ{zYgeUVtv[Zo$Gi<];vjp&5$*;;رI]^&ƖVBK.G.-S*'yzu 5 jxFj?j?p7{|mn+ /yyi!/+...in~ xgssrsTƦFT*.9vѼs_~]TN1b;o 5infmK&U%5 E`^MrysK^^ҹsIiy9%%5久lٍd1/ڣI:;:;e!_BC&Bw|ss9;Դi; t pϦ&zz6^ ={{EgeEz6?V^.;Kz82[8鍸{7n$=F,-*==3<"bK6!kW.i4OolӦݻ=0O0s5nZ 8K6m5*Ot23 uq>p PffiL.uvf<;8IHAB \I8@" VjwVvgtםmwp?v{MovZE9p G a5.CJ~&{xH ~i\:OR!m{-QQ39/@J8%Eӣ 뫫5ڍrZ;egxT[Uip Rq{;ywIoݾ]]ocGa^z/_two6ncۇ .tZ:㥆xϯ쩮>|+v>Q?L-^TE%:7?wWZT?]d8w^^Yod}ow4=//'gˣtoz쟷/}'xz :u:S}ZӅB$_~CC^z|91BTzMhΝ{tK/;;ƔxǶT*ELpW*G6Դ1<^b(pʙIvMOJR$:@P$I%^6&nsj.]uu-ͳ9vOJK7jk\**FHdɒ԰P}/  ^%)=W:/sCCv;<8O_|q~]Vz_tnU*o&o_Jbyp`e#~RXHۻsrU;pY΃9LAJrݾmZM74>{G^0|ҒQ@ $l.zJyw͛6o>HNLLqj d(T ~ê!ab d`DαZùV3+)y "&:\/rLrK/6["EANNWQq̨ظp FlP5ߙ@{h=n lAANddZ$Z}䀮7v۬&SκxtzPPFP)dz{= 'O#i6zy Zʴڦ! *:4̏`rX[w J09sTIɅ A+Wm}lݺH6km&q<=oob\FFBHqjwcڦ냃v԰TUIDATQ7\CQ12o3gJkjfm9tR[WVv_<7F/'3wذ>25ƼEZm{Pd" `|<3$$..\zQWw:]gJRX 5nR$*vj7j>rD'-"<"62Mri1λDo5`QAAk.}}v}IMMMAeqA՚jKIV[[knڬ6[O|b}CŹ“u:CB/j4C[[o/ p _}dmwt$44%e]RIn<0z{2gf54l76SH" tK3˓ɴ2/3Is0TW.-$8?BGGuՉc5| >06^VlوdE tg7'9tHP*ss"p= dWUh+{bSΟ/,,/>pՖhZZxܼg?Ċ!]-WqkD<^FlQY+'ۅFKT$*v#a28~}^Jr#[st/ ՅIpW_[/za<"ֶe)vXRtJdجWښu:h|B %$ƅ2yDL1{zNx5Yb+o܈[N'Yf̔48h4e&%.ϕkƳ KNV1u%ԘL^(/dؔ@(MKWmCEFsԷħP|4F&D,K3ɓL7"b "C`qіtIdwoN"H---sX yӖ=_@vh _y8s_w{{_ScZڋ/?,ބ;]ccCC5~`#{˖xss/J4Dd,#b>dv-C L7+Ca&v qyT*{7s{" 7(<;Onk -{',@S)==_Myɧr7o(B,d6O&STLXf3|6l`ylbVvyfK:ƨ z1Ocu{iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - server preferences screenshot Screenshot showing server preferences dialog Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later m iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\[0ph 2`ccx$MՑ5q6m64}ӴͰ c6KKtPxmq<:{ѹ\skJ{ DiQaT5#e()G(CHÏPZuTus(+8F@0`2<o5SD|RhJ?P(##&sO\AuT`| AH``(̒ͦ׷+++ .׷+v; I]*+==(bp7G&`,ңG--RZ- GѨd2 ` fjSvTV` qKx_@`l4F[AH3f&Ō16a6j& 0 9o"eA̺˖šyko^0bqxxRrJJTqmVT~_Ube=k2աOf#"rʍDͦ7(++ +eZ3`6LC)Sfsc~t[:ZZy3/=,lNlܦ-?t83*|ܕh!+V]++huu nnapĴʼn,?ؘ꾆⒒:e{O1cT4#55(9"VFVYYVVU)v(uDvcr8ww@b*G( `ٙz*9 %Id,b6C]^~}6&' Ds[  ]0qx6ۍt־'Tx:VݥTtw{M7n\Nq"`WjLF La=42Ylw2fC9897m9C:송3=P#\C}&ykE!=͛x\T&C?,;wsgtZWp8L-A $jTꙕbi9}ʠn)TguryFz]dEF.ˀ7B*"29ܨ<5k$bgeښR,*j͚0 npM&|3FF$h0Xx$>UR:X;7>aC;w._.&J_|W%ֶի,'ˇ'0X()ܺp!fZ]Qyȴshm 🧒?vM+WDEdNW_ؗ_>tVkhhl&V\QRr)_ڈ)x'?6n-[23l{}aahAA!d X-B*}poo') 88H\SsHSݩ$>މI2"=xb2D"Ś,gBL8 ,*@]u,Y)T݂٤Cf@$-XoazkխlYCaJ$ bj5 3T hݡEʅD IJNM.qB$6٪y 1a'A$ajmᆺcGʽDbPP$]IHF?4f]AdZT&NGih6-uga1fڄ[-fɌ"ay[isKG8T%vv9|fX6قjP-hpd6 LƑpFc0d6hP^VhgWB>Nd5l%JJ JkkZJ$cBn8B*Ѝ:2{Yi]N'F橷'Hihe f@ [϶>`+LsuАFuqteka9 Z|`\?'IDWf hFÝCLuf_IvxؒMcc2lZmWwsgs.65h5-Eaa)^"?n{6[WWcc}}5 0*+++Ze%To&b~Tbi_:uMRՅ39rks5OF{zxy #W,ykyYqIkXh aj} A}wOKF ,֍%HB"2" ~|0J ]=gHRpoVRL"P&WX= 0-=qCvs&,Y,iW:Ԡ鯿r 9FV[,>W< _iQ4w.g49g>K2q@?ԐؚNeqQ_ײfBۇ:IdVHf^B_A}cCJ5"d2t Tp^Qqtz]8\84,9eYF"/t, A?౺K.TWt{$:iѕHn<fv9O2}m{B |97T&T5L9bIXd(LyEEk--Fﳘq8-DD&%/N]@bM&*PnnJc݉]̳F$hZixxh`@ uxvwѸ Eh'.:1hVC5׌ߓٌr(Hkaf9wQ:3UD"fSx[yPB8w;Tp8uYFh(5A2kv?}w**#77)C`mVjEG@>nX, z~}, {P\vm+7&%Jv숌fVXTǎS2RoX"a``LU[X>>I"W]ǎo^.|1"1&II+o=[Y!kP<=׮ݺuÆ8>ߕ; .WdgwM O䥗6o R.C$3gK55rZm$8%zdh;auhfeҶ~'s+/?#>BX_-I믿NEyL+77ckIb2uv:s窪ZZ;; .7 lj+C\=|܋rEOVk4 noߞ鉻NYRz|yYYLk2Q|OK7?ysZJ|G̬uuuϮ]{>1 u\U?--e0/?gYcp࣏^~oH{0uF%%/;W^&*;THdxp͚ 3nFέ'I__ɜ6g˵Xn^^IICkքXc9mo֛/;l:v͘]ͮ άcu2_BYەv;%myᇗ-sg7b  g :;u͆:B/2ff6{-+5$dנ``ũ|O<^?$]|钢Ŋ_u0}2Ycg@37,BqssIdM'2)8hNI(G|shR>< w Zvm0CCmm'O|e[_~ViO?.<_ΡC/m{lQ)\߳?eg[{ԵOZ,_TTZ,abjvwH8ZCFSCCu hDĵ#쨫kjS[d)Gl}ꦦ'Oܷb0zxm4ZmnS2WlޜΠ EYs)á|JdIV֪U۶gf}꺺 ;|C޽cGtreۙ]Ͷ ˗{33Wwߣ;׬bսUO>+Wi4:=00%ey۶\EM5zJ}_\ǛXgR3?_HqyEeMMfsdDdXPrKc":)!;+beN2aFDH6^mW4556 X,tZ`Unn%  nxXTUU\l6b/0::|_?Ȁ@hS+2YtݟQwW}JQF $Hd0ج˵o G PZ̀~Oo"7m|𡄄o_uĢ]6n_SרV[\r6oMx\訅 O>y㍿z5iiO=C2|O//.6rg2q"[ ӕ>tℲ=0`냿iV|隁^ۧǏ]A,~woZlONy L<=_NBO ڕkֈ{*@"X8lc|i^vx%ӕ>tB.ݿ7~ի±3!&&.N$wG2- iSmbHvtvO֥ 9?}g=1&LJHz={HQe/f:u20㞛S]S]&ZÂPpfamXٚ+5}k׊nu p- Ο/+k͑#UP@ZH֨Pw{?huP`I$bo߃ED$$DG{Ȕ7xiSK^fFD=\wDp޺Ț%.X7#{Ihy:];=R9EEE /M&_b6ITjP PW=xB8(0,,<Ǜy%2 ly`˖hٯ)5VX͍F̬گjeBB{h֭67|՗s~K_j ]\ם{[jPV^}Yz֒%mMt(1<tgtͨ_7Vvڷ왯&x̵֮[,Taps=:lrqx04lD&du2A q899hj uW4ڐY!! FHA|YMU}]Ssd l1퀊ܣu*.joa2 IDATZg?EVDy<5?gbSVh6QeۛQcskEѕoѳ>'',ZweR><\]]V&2obR6yfq82D"]; nrϜig3wc]=^l6,DY-[a.7%G6l(9Kүj2JE.5Þ|ΛCd&ݸ4(}7׭pwb.e%%8*6}}ڑ\^cxXmϭ[ZE{}}eSه(Vk_~yժCfw-@Nn QTΛ_'sm_\\B+꾔T ʕdI0*/$, EMuc&1 J֭ BV={Oaq7^C+ypCg|Mh׹Q~.ޜ[>ny>9{S:v-m6{{KKRwpw{dOtbvh2O aK$X8mժS[*kYFd;.gF_l6[f;h68OKٶftoJ 5J `Ҝ 䓇Ͳn+<<2k\7lM?((,,,3>>~nT{nFI>(t&F΄g lZ9D"#^d֝gelmΎOFs1ɯZە .ЈH?x/.!6]ZS]ZZ\\]PD/]HB ]j7VU_*/j%q V9`u6EG<Iqpj;;TWn)++-V(I`tn\1˶S!7nn.5=Ƣ_bcSBCҒRf)aE89fL}BkuhE:fsцƮF:O{1,pvttv `ϵ)pŊGg,)˄RSoHOϹG'O~=&ӆ QL#Gr,游'\F2P$cy'O,Y`DZcK]qsf{NexuÆ뒒C<ԩ>MWXP ss?o{zN +79%D+qܩ4E,\PPN"'Oo8ݮV?ɾ>b׮]42J $.?r̙͛ilX W̾uZ=HDFև _P"1Y0GGFN3hŸP$P)z}iw}CgJeuՅ ٲ~3&18X^_Ĥ"9rhw}x,.mZgͭٷ{Rs9gb FEfB!TZׯ (F=7D"AM== \Tپ"kƆENkbsE2 W.oC;%)DpXmF^g,& j\1و3ooSJx| .z32+ꜯ(Px{SXWwI ev}zAFu\^Bzf.R*3iG(a~RzJ?PqQ۪0[4mFRݧDkn nW(d2;99558hml6PwL&mjkUju! j%(ݝ#J$hCcU-.9K z`qKKƈȈ8fql!K,V|^^&h !$ n :}}P^dIߵ뒓_}7rF}.pwB UW^ǧÖ/_H[|ۙ+2>N=@NL74cM!<3~HHL y}qaaKd+贀䤬Sfq z``JJO95Vkh/XdB0NlvVݫt;á 5\VVp $$FGtp׺F\Р`ZjR*C$\GL` 0cR)Rq=D*PYZ .$,;J(F@=eY?N#t(+FFn_ PrLRqLa1Q` *V0pjS)(!p-]^~\ɜҒ:Br|_$..cYffbNbWwOU 'O;SZ"vvTKtY RS3mڸz5kfiueqɓ}VPP_Q} /=TbpՕlnWfg=|7-m5k, ,l d==DaCol:rіV2YhҌX{{XXFՋ%mlkS;0(Wp"@0sY?es6R}_mbcQ8ip;ne;Μr䓻^}E|O"qU-^rE'?|ѣ޻vm7ZC\GD7֋/f&SR22.77>ɓZ]TΝ޶-5ۋJ=-_Y W p/I=Lc@Ɇ55'Oii;ݾ`, \ɧ|06BQvpXYe=*Fy?6?vH}=< poQ*Lˏq8 E{I 畗Ij`d"Yl08(9i\fب>W'O>?K\D&W>sw_}1?{,2:v|rk O~9C$>޽?{>)Bqcz+*ӧ*e2ngD<~}|snn\=|܋rEOVk4 no߾hv˟hϼV"v}Gݼe)wXQacc {7X_WXd CUB*%澊lʎ?0uuKx4֧nj;y}>+ʮW_>_Z4鑞3;:dYK۶8u[,'O<|x` $8kڵ۶^` fg<ɾߖɶn}^ZK4=>ٷw##֬پ=(ȓO"U=JeW`,M LZ\jh?|Y$NN\ys;.PӫéoR>d9DB_/(!}}8\~~wGwO:[7?b={O~ozKI))F96Y{H\Z|&Gv,܄κ={SvxTG}ӧ48soc _zGO'_TQ^^,ZBǎ18X]]VD&,XO"P0esp wc f$=KJIo FGsYT@`2^^\.mg2q"[=-V[\r6oMx\v}PO>y㍿z5iiO=;(iSmbHvܱcԙu=,4*r)?3Z[߯}nq*Z*\Sk1 za'=)$PX,LghlEoqd7*9$x_~uS9u*/be,[ +2us@G`hhpI͚3#pt%8l o~cGbgt IHP0xտ}zx~uQQYY=j FRRB#bqiyj JTJ=lxSpy ҝ:ԤN?XPp1'7h:3r;B&bO,nPțښ&U<~RhɌY")5ڕYR}|q}8w\g2qb1LGΙn0D Xņb3iV+z2Պ PaOk׻~K;v^/->W\#6dp:zs̏kl4ġAATll8FG MLNLp kjʤR:=..)Y"A.3(owǙLs=*Vpgf%xȣ:Vk\2<ޝs0hFגϜVQN$Znoqo/~+;t w_H<^XXrrfuk-[*g2)ձ=d$mmQ[S^c*6C.W*v:=<۝s%8 _dO{;{3mB=x"O ,-- mr%.V2UXofG5tYҦ_{VZ@y{y%&&%'O䔗=@HpP X 7+h|@H;<8uYFh(n}jUgz~),.5uk|(s%qpvGqG}km6>[R]r @ޫK?28,hY‹oj^]X,t!۶[j>?P(vU"*syE"-XJWUm`\/D2<\PPPZd.X2IZZ|HtVFi`tzX…hdFMMQ3%%ׄL>eT}7׭h IG=S^&߲Ӎpm;:.6fMΘ][]U\*,XnӦ訐`?_c2)<.&wI$ת6{wOk5В-: HH|}0fiN΅mrטͲn+<<2kB2lP:y{ ,)C$X>%KnxV&{+lkuƗnU.y %%|?8^>6|??իVGO\t:ZY*0OOP tDb9줤eLʯTVn$Y*5((,,,3o~+b`JeeYOLZh|֔`$n[.){TA`4lx?Y ZM[[E e2&]BX,bǎ͛oˉ^ 4OqlQIEI٬_4׿wϿu_bbcC$^TժMstcm7Yܢ7gf^߻TZ7lX.)98bhWHzUlNJJz$#{bcCCuM&ȯ*WFwWah# q8Vu_[\n0BWC IDAT^nnxܐMڪRa0^聨d]lmbꎍF! HBߓ HZAP ݝB{{ە=zF">>\w]PD"?_OOHgY֒zB E"DQe2OtM&ݫ7sBi_(iFM( UrAfLչs)Ѐ@2Y]PZZXt)\*u}|222Wtw_XóVƺ}#wO38$-)˻x1/Ya22fx +.[deYNeg_XYaa<A56TT\,*jjRx_e?3[DGٳ}a2vsEE.^p!7L*#$UvܶmY{tU?::2",bp8r\AW,NO_44ŚLo<͙CBBRRD;ׁjdښܼNA Y|j+SdNNiI}\R 9nn|7DlD1^/ O8K7X:€YY~ ³Ν-\]$mWT:шhl6+GF&&-[bEZZP y2heвeL;٥QTP=uoΟYbcH[^`@4cV8F5WW<\|)b^zũ}5u!$){O=_k}:վjm_ܢ S@&읽 V{>~Zr99{oA~⒘8qҌ㝄 h2ݭmuueeUmmZ-z jux`M-9о&XXNѠ:ڭHB;t!6вِ v3[2wٵ`xv[˃|9VkxO|hH8*22!!iJҔĴ#{MJ$˗?Kӓk5bN_}O{ٌ~ظ!-M XtE%PiDL2܇p ,{,= ;f{w<%%GҎ/^(*J'~}'\ 4CJѬhiX(X"rqG+-=t2cǟX4>YJ\^Z,pZ<!VWל9{gϔk(@qbq`e-0[ҎYчٗ~os?!C|_|!*jmh;~TVfa\c0,GtTJʼӧO-;{9s^Pspv }|٪US֮YюPL’ˍ$n^n FHHbbh(YXW|A.7"BCdt1ˑf`qjmqqVO+_P^{HHMwwA~^FGM-߷{S.T47k4d@>}f lé /.W^ŋ|,Q23Uv"{㏟y6"Jb8?a/{・Kwl7;}xQauuccwd(4F(G#66_,/X\SRs9UYqHڑM݈wޙ5K&r_>Z, 4yΜ$ruP?)bආ =ʬ㓒N}I˗O:tӮ^XbeA˺- !bǾ}#M8(,Wu+"R^ZRYe2yy-^?V7n9ze:8[ g`;Dbg16УXȥK_y5:w 7Uۍ999u3fH%nh?X1go׉Y'Oo7n\PP@}㏩R=dH02p8`啹s\:AA.$'k>i'MT-V[!%)!7#ǎbgD D˗;O.,4*#D"999K<,NT]П/W24 :̕&FH$SH,Ό47W2:lb*c:8?$PoGkּ//Z4mzpcWWA|6edY,C"$Ѫ}a2 #Yb\n29}  ' [k8L!*U%%5jUr9E$ܹTnO+3r|f/(4q褚\\h6_}y"/Dl}}eEm@ZѲp 1JjfxYrK/7:GϞٿNܾD|}x`3xǛIhlm+---oUkP:^o1qB'LZښs,֦&F7}P?gOT^sڵS:gh!?ofy>"# !?(3d,oP:F9\VaAW: (+..4)=ȑJyyH/84=:3v掤f,>X,/Κ|oϘ!ݸ{oߕeyaQ.>UTXWAWtIO1ts/1;^#VJVk+n=>J7.%I{L,M&@˂{ L`L9 1qK'OvYwL&YU88/N͘1{v\\@L0uSn-7ÍϤBB&;ڂ;ޠ_ ږ~խ׬oj=U]׏݅r¢=UKADdDݝϽqsI0ʳgΞ7>h>d;8[YGa-**oh$<}\e,hYkO&:4Qm~wlFrX^q8uGrh4 F^ji:%%ħDGd:,ik/WWk22GܫHDN+噙wv2&SOO]]qɓ=ZRi1S mj;]d\ dШ7plި8S2^PT:FU[[R}ΝvHu5O?mddde(zz*ZjԪܼi%VSFZT $ Ϝ9y2+L" *@D0:}WWCCYY~~YF#H%#5] ر's; &Ovw*YÝpnhe}w8 Yl̙SeUTh4$FRV~z~h-\I%r^J5.6* ]&!`_9|^ >cc06R-k4-Ms'GT2"EEQR(*/fggCxgeUUuvH^^II=pxg1{4àˤn,Vw˙'N?qwu7Օ^^^Xx|vvN΅ VD2~IIkF)J%$xy]'ܸ2hXѧ55.g/hiji4s[袉\iEq,tw֔]XZRRX-)khZyܐДK}Nf2K:;ĄYlo///RVVnŋMM=X,틖Hd cU<'*:$ɠ+.8YX.]^S\Fy{GEEx7;A{._>sSl`_lxe?ѭ/%8V?o5[[;7Rk\oBw5!@$`C2m$4GZ:(,( !a_BGt65wvz=L+JUmmEEUessWRY,D"H>~~n\To|M0M 49P)h`t F4Vd;2nG!BEjjk*+ϟȨ!D6K1n;Q+WTq2)rb-^eUunz#ţ$ŢVw7WW7( z׷ e_b C"$X,vBiw L$aTS\PPPSkxz4wu6WU):Ho{M-h،j64/ Vy IDAT>?&&2J+,P(JJ02Aq%???_z kգXkCՔ6Yh_MPpo]hM<.~ϻtml#Jne  }\zqzB1m-_>}P?`(/ߵO i7|h 5'X*rg^Zj9sdĺs]IΜEP&6L_1,b5&.Z[Z/?~x~Ba4BVO]W#^z_<֮defܵshqtTXDB"h>0,q%P ܍!ࡏ?^Sf͒%Bhng;^@ӹ\g砠3xbɒ(puuq3|#C$=ڵ{)&FcsKN};?^TXUܬ88))?<{vxPH"ُX߶\Gĕ'e]\_a0RiNN>^q=Ȣ .0$];),R(VK, :}Y"…ܞ V[ߐ{ԉg rEc[[w@$"gl̬Y &'yDhti+ 0֬Y,`OH['Rt$~漟Ԝw'N\P]ԤR\[H7k4\FsVXwEE)w<]^چG<,{,4Bͽ:V#xp_T gW|]_**w.m'O}qWw+UӦ%'/Y)jU[B܌L&ں =|e5{3^cp 8p9dr!5>,-d=wv=gϦMR<8仿ݛۯvLybC7lظ_wfΔJnư/?t߾noiSR/Lk4iiUU?;o1ux56?Fҥ2#>a xTQQq65pƍ`X]d'&&2={&';?h 08,R>dP[͹XWZwxyNtL\Z~Pj}џk7UVAAqSϡDbwU~i+oO*BQkD ogt쁼D^i2,[]Gw|< \-b08r"D*a2T{~tibc>ޞ^4ZOtPFFiq88)^xql9ۛB\MsR{>wCj%ॿMM)(0$$(oM>T\3a]`lv\㏿f\կ95+uvvNv]̙.2ߦ# %t:y"##?Bn4TA*%%hD q?XMM/2cH4PbŊ[UueݍA^^LqhթS2p߄TaMJ4;C*X,,INvdϞm&N 7ݍ%G(,-)/7f{zR(FxT.cfCx'tйH$R#WvYh4asRQa6=H\S*X&3,4))&-**//kPX,a^;c#"pJZ=4ҜpRItltsڑS' Hq$:>BJ ˾#.&SUui\n6{,Xtm L$][9wP`LT&8ͽŎ7Vs{ZKT]G*e A1N4{'ǻΚ+`M;}jލW󋍝2%efI|} {{z{M&Y^}۪/}B:,ք  e/"e0.q`}tFn|k[q>s/]kmUk4Z-fiHz9DNQQ11='u|Ɍ9ӃH#NUF?z3gFGL8GG9wݻklˁϋܻ*Q"˕99s\o"hrŒH}wg6wtv*rsGz^yVE#a cd4c^F!Y,4(h„^ĴinKCCm]SW޵5LF5 ol>qJsBqaS'kƫ1+2rrZZX,@g՝Zڋ/ϩႃgΜ;711(E,Lh\?`}|\]DbGj2uWeee54^^qnNRX/>~Ouju_}e0̞=eJ`?Y1<ɧ}G[W );9Q꼼]6o{{#" ^(pTZZUS{3!!q۶miL&Kr%am?sVbS_}`5+))8IwuIﻋ2Vںݹ#)ܫ&ZhZ/B*M;m)-.M6Z{쭩M|nR&371ҥۿne4q"7fG#GsxS^λﹺ=ĠC@; F=ݱ y C@; v{'L|;}r( AH``-ߙ*ucSEE^h~~.2RU[[QQUw%JXD:ˑJ}\.GIjnU4uZ^od2ZbO tdrw3rZ@;w>pmpAΪʖV;L8ZRO@#@M]~uhVPmFw5MfWvsE|?}\lt+ku;jz3%JNN mjnj2X,g@0Zܜ rurq U[[^^[06uu -]]V+!H8|at6 4I##8 #=ٗ/8E"wwOW7ёDZj몪:Dl2?10)h8RmhhkS*DW*squqA?X{EcSWH$2&*^!Q,fD{>lVKT"qv g6^ܼ7]uImA[u{oI<98?:z4==;Ŋel>;7,_?枔*&^q;:\"#}|ج'uYΝjlpq]](,`hnWTWloB¸qgN fzٳEEU&>ep(8FGJ`aJ1L:HQ^QUիӽ\]hϣы22/\j: +Jf9AJ `BBCBx\V)+XbbBC\+`ێH|]J\ebdgq``dwFOLg7565*UL_b,tu :WGAK?sBIvwc&SKB.P<=bw<|o7z{Hֺ(L6th}6i &J^SSTtı[YSXXvgVxHglCUEE*hP'}N{GdHh@w[-nNlj\L&ۑh*?0@'1CՍ GD,]t- \ݜN|4'C A,l:~d4x<`չ~0 m뮣lf%7wpu}󀌑[Y܁ @`e2__?[ 0>bkO!rR v#RRIj7ܲefR)5S7nuCՏq8/C:q# l='S(/m^.w3e投'?L4B*4͕3jjJKѩ=4*%x{+C#'&:.ŮW_\Vv!4C(D %"󋍍.W*fJe2P#D-NBq>>/^j_֑$tuLKn,, !.WU).WVK͒HhR@hC u}7TFyeiIy,5ӓB1RXAJJZё/@\5CH$R#WvYh#fn "\R<h5]™B<9qDqHEyM<>14aіT/>+?dzxo5gNBcxWo 'c'2 k."D.)ϗiW^UmݚqB;&Ś,\HrPB'>#;Nsz{ygޑiSo~e yAI^}۪/}jŚ00Q;8TFck[q>s/]kmUk4Z-fi py\.7޾B*nD \P pt8sttLTz8= vo/OPa"#gp\1kjyzmp%~ҠhP~[C>MшF H,P(`2 wjX@Hp!BFGFȤsLq| g6Ҏ|=ϙ3#y#SxG#ۊz5DC2jbup:175H8Pvcu -.7*j\W{(h*-=vAܹ_?WnnpŊdh!žw>Fjx ߾-\ʪ).XclYmp[xe1Eb''Zk<~ooD+NJK1.o+X'O~q:,6%DBWKNXgǼyO?:OAg0i4^Q~BUu``xX,ri;[cTa1bc}}wC ˔).rQ%ܑHV6n塩Fkpǧtu/@Ӎ5;C{?~-۷T ^^tT-,/4>f'O=uk~>b'/X0qFVf٬Й&<@"_,=vϜQp8ǹg_8L6aq.uuk׭-+7o;YcG%׍ \]'GD¶`עudFXMsnщ&}UmԌ.4 W:3).$h@-ݩM\_ΜET(6j hT4:{C,Br9VjrZ2 !B*0F^%=Azbb ?!ZT@bm?PI1}ͬ [1%DM#pcCTqt:NiZ,O mJ4%<,~_pI'x J!B*`}XƱ2U,]&pb̲4AH!sޑ&@DCTYnlņ`p-Xr ` 0bR1,@ ֺ={/W__Տ?:xj? X,>_$gΚ5k|;MK:7W_<8W'e-ʪm\٧VZztxep+;A겲Ͽ}'ɓWWi0(gniƭ[N(**+ JǍKL|W_{G rxޱW,?shY>X1!ᣏ xX0^woq޳g.^li!BCccgx_^,6F ^w/y!z}sKAiy.շi4 '<|)SeR?k^(>y*cyrySs[[WVhl6'yxL2mZ|+~լV&;e](7(ڔJRl.I;irRRb9^h ?lT<AL&cGnYϬXёҫ;T*ѠNfvwlǗ_;V_o0`AxP67K=Ϗ}Ef^8--9mO<.vO{z2~S ,[Zp&%$ u ˾駗,˺:/ |7׾>WH3<3ǖ̚'?eeVbbͿ44ǿ̙bp1Y ]klPZS?m{Xh<%9)),\hٲ-?k͖ߵ||7]%|sKDOXcQBQQ SMM?6MHV3͵X9c5b~iS7qik?s7|ګ \lջK)0NI~F&y'M<رTUUV[^"ѭOaA{%vmvT&;sk T99$ў=SbWW_np3€_% Xl--Z-wF0 sgEqƌ1ypyX #G͵Zcc?BC2}y'yCi?wK!$-ȑj-17,:2G*1c,\XW{ESRL$Z;m :_*F6]/-=t˗)c%$HI$uɘ,`5ZA`͛/_$47>dR+lQ22֯I'\"éT{ Aw D9W\,MhFo=yr` Yl36f֬ k۟Ԝw'N\P]ԤR\[H7k4ܨ[XXh(b?hlnٻoNj 53""%g Z2>}f߾Μ..om :uv 9',H+LTj/֯h4 F#Cq=TC-- ]0&f=+XXPVzyt\P1<,:]%AnѐTUUXXRVxqq^_fh؄ aa,VAAnnqQEñY>ũ4ŧN;噘$r~CyEE*T:}FbSF%YG'X2?kU <.R;htjuO9s<jtvTTdMM=qo0+V|AY>ƺCO:5%yYL$=3J*]?No*.yb$͛7C" _}gii&cD,xygg<={6m3?X4<Ƶ_ޭTLd@H"Um Es3/5lx0w\~ȉ55,ZB+jmkKMUp{S,Ɔ !5Jwrb"bmim@Wtqtq v_@HeX֮nA!b L"C*22Z[Z"'[t.뫯R7opUYaa1qq>NB*qjhTwwhd#(8yGLLd8~|^A~Um/K9O.PB_xo$z|5sX̔+VN(GJ6X,osk!!AAy_M)ee bdebs:)FG#GX[Yˣji!b ڷY^'tJK RmuO+y Ɖ1q櫦OJ/4~;'uコXmJT Tj.]־I_ŒUBH>ts:wVJ4,$>Vll|s7'ٿ_Yɴ<$_n])E_4rnmW?/Ob͞o7߼z#a.O,,46 m[S(LX\TTPPT$H/~{͕<)h4CC##=|B)v~60WQH9D|[q^^aDnool(:]_޾w?xhժu&ʕon"_])""(Р H_5_߰A2::]%ҫ6nX$hǬJWUPDʪ"iOrM*򬨨B M—.[CvmK,koxQ ߿u'ް>?_$~… )E߹шD'N-Z۶>[}sf;:2?,.3UfzVBNNff$ʖ-WSϙmmyro]␤Vftth_]HsnTU]q#90nmW44ϼ|O55]\Ưn[[??ww+11:H!mуHz̵kl}|4^)YWכ(+}S}ݟNjLf0ݽ#Hsа5r8*\]gg|ل&)߿1֬2_鷯>̣P?|VjQU571eG'%K|K\T(^|ߤoVVvfꡃ)W/=Zzh4--S& y|(12l9Wlb˧O>/ڽkժ06EB'ODamkkb]]#]T+A vlْ:xВ%>]g9o߮瓄B'?4})vN6h ܧ7hoBO~&.J\wᄑy<Q v~$J$6}Z- I (dvW/~}&Z?RS5{=)ۙ(ۛvޤwnGg`> uuׯ={7S\ WX~ܹټ.786nX 0!"+BRTʧ|<2&ӷWKn޴vH:$umK Ү>>6B̓'wvD335diՄΕ˗/(X[{ b8+(gd䔕 bq6ϗJr歴4eFյޝШzug=g+'Gn}FիW5LVQ50s΋D9zPzZnk;s#"g<~oŊ6rC*O.81*jԝ;>?mJCÌ'kl\pֱ#۷ޕii>k?|ChtZ>4BPV:kرEſٷoV^ݻ[Z44x'޽tzI ѧϬYӦKH9t`ُ7bh;99;w733g2vUSJ'Njʹċ99]a~:qbuk̙?{...6FTM$.+/|%89M4>cnzM aON"}p򙄤nr>+|\VV@hi뙛98ٷߠ;;V\/ח.**/ohPREGGWX]}<&/.+_DKQq/-yrJֻ'|~qb?.-m9Q9rPggFdN,pX=oŋ.6՛64ܺeBbf2_;wL ȌA4dM ֡S*~ !R*PR* CJ@aHIMhu2@g&& mk%B @irALڦjjjDE4 𱲶"'hh @!L$bжVR*t:]Nohh54M$` Cg&OyRʨEV^A4( )!0%mVRL7b\B,-&_qoAJ&O˨ɼh52.M>gT^Ax OFפx-ZcH΁W߿xҥÆݽo6/,8 v$K ֟rĉvJJSEEIS/2JUU54d{YZhj3޼u6L|ʕ{w}}BBa2h򊼼{wfVUM|xH˛GL&*Cn[S Ω{Ϟ^^:yժcG89n.cX+iCcw숍yRbj>o4Д|@<3 h;([Z `cEV>)+{%ƍ3WRV3rTPL%'JHu3Aq1ge>dȨQnn{W6YxۖznА1 Y9g\??/PS706l̸!C:MRi}}~k&$_>.-i4V^!!#G9;2iN]~І;w䖖tY} 9|X-2Y]]SDK$'VYh / 힏@INްaCiSX1e*z#kk:9SxWJ]$@{+Ĭ]/{Y͟6-8ށϿreի}}>#VV_|`r݃'L5{ƌ=>>iM"QE{3%sK^Ϙ9k֤I!!.jNl޼ӧQNZQ6w̘3O3w#VMmJ?{Vr9|~#xWD"nj&&L&bkSS~#-'e|l%ggoUE%|^P|+WW_Ͽׯ?x05X*vU*RiM͵'"O.,5&n𰵱VW~Cw8PO?b 0kΜOš`ocCWض5%jjAaPB&w5yW |ZMNNL].7"⏍)))ylKu~@ٳ jntS=\\lҥ%$:z_/ڵj׍/H*݈:oJ Cg5XYzyy1u_~#-HdF^uNwq3NUD*|PJ%),-۷z38gO?ʪ{ΟIHضm劧OIe?͞SK  K ;YYIH.kT $(**)&*_tMa^LӍMdJ:.W^1D ؤq|JڵԈJmyTv''eg=|$h⡷7MHIIkVϚR55--ǎ曰^XRJT/H{ph[bZ.##-QWwss[[yJ*z]fotn/_&5-_oqQ >QQ y<ɔw% @;JLVQUUIXeK~bzuuo,f827,lp1LvW굍,<:$R2uRA%FcWsv˼WB[YٛQR$_%,ԇysppxSwk3S!Jx%t|y*nZi9@&3^uuoHs֭4NWϞ'T33w}));;l|'#J233K(d6k*WɔMI4eM(Shۚ3†\J^6.vkE!v]]:](,dvxKd-MC]GwfVWkt o;@,"FHڼ~= Vܿw.3g*ZY>}˳PhtTWʲn}нЈ`wnGg`в„Xe`76nLHcU|~А~UkJnތҫzzR*Ibz2e_C^hzDk{rNW1|%?FEGOH8~CjkI$55#(͍衡&uuW?;biÉ{QZZ,[#GֿKpH>*w9o߅ Qcoo_梧R s޾'N_~]f_3on߾z3o/AlM7o r`2Z_,XCq옯s&H<]tk׸\U]]SSo B]{tue+f&ڋ)wQ2EA4c#Y&k;C *W>l:L~sr_wy\?Mߤ/HuuG}_#1h4DkRx d3g45*IBamMYÇn%=wϊ7ofޛ>#"blO7IpHlȵk69]\dҧA7Wݻ{7܈m:ƍݻ,?s&?'BJ5Deݭ]cka!9uA?Z{H\'eXk|54+$d gg][E))G={EEJJ y66$cN_9p0"bښ#"~ٳѨԔ'$)˖MB{%'JHu3Aq1ge>dȨQnn"RW'Np>==/ɓjOIIC02rr 2O]C(sw۶>w/~Ȑڵ`ƫn%55MLDTU"QANAHfanjdR(**z^::.ݼq#-'W$kvPT6==--;[EyUgK YWWO_]09ӗ/4Fc2,,\] 5j0OOCCN (||^vDbn+8w&SMM,(Ns:fMH"/:ԔtA^~t￯ZydeU` BB55;II.H$/-'rr 0|!BUiʟ_vUB{Б#g62R+܉?~|իjk?tُ';;KOJycjj ++=}e'$SiaD\'O8̬ǍR *z\_O 54o@J^B*݈:oJ Cg5UDXYzyy1u_~#-HdF_B:C͙coG$ 7RD-K:umjj={ ϯ޽ccm[SyOg{z4LkxG''.ƔԔ`S*\O;b a24lJ8uwqqsconyΛBY[ ws>d!rӧ ,-Fi ~`kce^U-[wFd&M㣦Ǯ[wQ_?6k|yD"==6x:kVT@F"NJZz֬Tر|֫J53408simkC,\+edq8nn}nk+OPT%P ͷ% j YYՖ/بSaaשPQa)ijj*PmG50xqt%%:BSn7,$MMcv> ;YYIH.=jbbabEE% `d67Jc߼ࡆ}=9ʲ^P h\UGSBmL221~1lnilUP#Ljj/?IizFWSogsy4 `!_8zظz4_GGb͓Ҳ7㢣2355^t_^Aِe`@W~ݻ]x>7Nt!~~mqÚ5|~HȀ= ԧYY.&W>H?U$Lo׭ݼiZ(4tH..VVsJjhh3OܹUԐCW r8W._\PbmcfNl(-(vK}g?bE\_uun%)+ lNI1/[ii4%*kmݽ;ݥ T% ggo_G7oylPR::ןd},-ۚ.c:wÇMKX,KK7GۗݿmSq؅ eӧwrE*ello1cT{?Q_"1XpL#'$?wOJʡC$emFPWTUuu._JL<|ܹz E]41=,lsCآ?_J !K_iW*gl:kִK$z,ix8]1cvLJZKHG9[h~DC8s* )htNe"d Ef O4&h\H40T RPR*@RS'Z Й? @ېRirALڦ89Dh5DCd:ye%JG"#A4:XFi U*@קs6k&4dC~O3ֆh ˠJH22HtN]eBde!$) Йɓ5DmH( )!0T ”hOoc;ܼӧ**=<;~޼[*̎ז͑/\~nI̟?i;TH$%On'$IHK+,x_w7o4iŜLY1aBѥK,~Eǎ?fCBjُ}7rMee|ʕ3Obŕ3#4A Hw)#q={++Ɉ KRiUՙ7m~'dcn4z?bVDž~Oouuv+6mshڴl׮.\]h7iҞ~[g߈GΝckT)FhU*JbqVVڵzzVMɔ&66OگFEUBB+)$¸׮I$ޓLң)!G&kjO6e/-7FxT6r8.^/^ðaSr811II˅B.FFݺyy 6fLP兴PXZvVT#q7o>}*hi --]\TCϞǎFEde=)%ܦN֬Y<4o/>}NFsq1cݺysZ_MHBP(I"QkĐ=l)丸{3>|(wpܽy#3$7ߥVkuUdgO[[y;ik ~ yRheXUc׮Q(dɓCBYY'N_{s'Ba~AL/i_)"Ϙ9mZxxOOm℄6uDۻd98 >|aü},,tf^1b]7%Uh7.]e?~dh''<{nPf6fJɗ[UҚ92D*-//-. VTu::=o W:qjoi/_&INŜf MM55tx +]%j[G!PtbHSLxļK m$TWW 4ѥjU#T&54`VQV66/bq^k)33K+S6PL}C]]%%H&Z[8H**JJ E4>R%T(H*JTU55dB:]MLVVTֵ,Jjzf ށHtߗ0tA!ji' N5u͟6a56ouؑw̴45Ǝi#  ^Ϟ:9nޝxV PW7Էpq<9"b0//CY2Y]qE~gɱw''74zzݺ Z`Χ^ ň8u'}Ԟ=V7uڂaahXFgYXP(g>~c%%\ӈ1uС] .z];voӧme||]k@%Kv7ohg;au}\h~DC8s* )۔ml8z{ދ/]:lOwP&B_dF yDc2&ɅDT@aH( )ayZfTk1mڂ* NDmHFL bTD &mÅ?@"'hh @!L$b6THd2@gC? JHz.f$ "Yh3]~O3ֆhx% T+(d @U&D&[1hR*@"P!<*YC4چ RPR* CJ@aH(L !YYG\}4 LC&сҺmywx{qW ^kxDȼ<)SX)S߯vuА"\q&Mǎ=:wmj || URiEELW_|Ņ ^6&'=p@S}hw޵+}yJ2'A4O.\$Rv%< ND^&x{O2mK>}ڔ>TjVVLtLlvXo=[[ۥs:yIS#|hŋŭ4xXܜĔ+VVJ$]LLF;_?3 ǏD_M/-X 9znZZVBai[QGݼ[XD2tq 4bdH^2mۖznА1 Y9g\??/PS706l̸!C:JJϦ.EQ?,,rŊq㴴b~yS;r;I$uƌuRU}sذzz,,uʲe&<9Bs~*+|t|bMI}=AqIjj#n}P\媪YY2jTh~Kl'D,ػ4u?쩢lL̙~[8*`5k&OvtPI] w޼IX[ϛCKZ!b"֖D^Nƽ{55R*b'ffQgh1}\}<aT:ʕÇ":t⤠ 2'^X55uuKK$pZQN?77tٗ_d>/'NTVX4d44GRRbccNssGZXJJϭvѿ@`phgO>iMT. 61Vz{B5{QgBQ/:BWe4MI$0=}ޕXNN>P7dYX4l^ ^t`Ie=/Zt@ʕ7+0 !VW_y<::q 4S= km[ON1 5gΧ-ƆVQmkJԂ  cs3K.SR32b0d}>_24161nR9g2F>|˗hT}gʻ{6kj]?ytaŨ?-0׳XYWU~x!ݻˬ}x*AH\2MYJUU<Y{~;w+s(.Zqwo0R*z KSD̪x7D |n]KC> 89w2E"[1c|Z;ޮ.xy3nH,(]]lO7^vnt CLɼOK.1z8s&45M&:LBBto>٣RML,,X,4#x>4_?*]8}'ѣ_G#1|Z;X@AT*BLI^Z!4W* i4 .]^7g*UdhH8LZs>UDdD"N/;Ӗ|ݾ}DijDoǓBa2 uu5j ^HDRQQRX( |7Sjj qn|njYh۶;.S6N;a7vG)NLVQdieEEm]e˭'454|ڄ9)*mm~}D{;%OX,}Od ''33uP-qӮgqHRn=;r4YQ(O7":|}<aT::֔M"p%>{ANԒ--{{FF:=A+%B@$~g܌B}\r%bN.n_d:&<)/.g$T+A H^ݵc˖Ԫ'<^f־}vO  43{@,-.~ٿ|~C)YU]W 2捚vl}<a k7d.7$?ƍ11֯]燆tw%J32Μd2k3l|6L^a.%[yڵ"Qh`/ok]]:](,dv!6}xh6^^:Wϟ߽s.||lѣibssb@H/bi' N5u͟6a56ouؑw̴45Ǝy~[_|DD`Ǐ}Xp]ݦi/9:{vp|}Y[MYF: %%. ==>v}{&*BCo=ÝF|}γ1F)H|Iu5GqcE|Ǐ&'ޝ@陚v68h9Rd7ENd|Y?Oڳgժ55~N[ ,ÞC=t.\iTtII9tDRSa=܈o 莎F͝;q"r`LLlΝ7oHZZGrsw~ Ǐ$EԴ}YCviqO>z䷕uu::,ٽ{޼ѣ[R`XXXZ,-hN_/{ȳgOڱ#2UVf2YN64G&}fG֭'+f&AD@.GJ2x% '. k( )!0T ԉV'htfg6Td#sZ\1ld"ed)!`mE4N Zm C^"߶ʒh @ېREYCL^-!PR* CJ_{_ey(~7Pp2RV*Ck׽jjj*dCȞa0IrϛS.T8Z1朜wy` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*3 IDAT$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I LR&TI*$` @0I X]q6GTN&f?pLR&TI*\Fu]mhղg> jomͳ-qq‡7NORऱ9?2k]+=IPTkhf`ፓT8iԾkDZ-g> *mkk d' 89>Iơh]U>䨬X*ڌ>qr| 'g={ݭջwg9j8)/߶}??>vYZ}FW]yU~e5Rj$$D{>oy6m~W^Y*Z0? ?WV9Ƨclqr, 'S~`GMRRr4eySbO:S-u]}GoWwѫ-^{;kԯ9HOo׶]ۣoU^a7\]zz6;?C-yzUUbWmW_=✬($$TVE :uVV~L~_Aޞ)P/^}ݽu0`@Mv)x7LY^~u?~nu2褀͛o;G?ѭ  u]c~pm}oUZnú[ܱ7^w޸yŋ'\4Ν#LO/5q}=9w)*jݪI㬬Qp geOhCb:uUU%$ѯ_G`%p"v..޴yO<1n)LŠ5lʪꊊ]{wܹCFN^ 5[f)+۷o_A:bMz?ovo'螜߫tڧ/~W^:o_|qǺWIN)Ђ[b:%_߶猘;߾G>TѾ}FСɳ}7YDguu Y^۷/\pƵiGыa~O'xa#Fko~_ٻbŊMf7n>xf{6ioۻo_?3~|-[Lj=O=ݹczOhZ[Tzs_7lLKeAя'hx@}%eei ={YX?i, o9EN;/1M$&?e뺵Kϙ=y̚5ͅ /75ia-Z$'}X۟O~{ϔW {7LеKfyjǙTV?p7oTZ:g*֭;ƍ7^_/wݤr%lBWPpἹ65lx)_O\`Ѣ;ƍmt/\pQ7~I(\_!V%˖3θKWMSuk֭,w;o{7g9TB¨s &N<={(*:ި۶W='8+nĉC4NI9U >j䨑N>ԣ﾿u|ӟn=k]Q[o={~5kԷ+id~T83|+Wꗃ}ee5jbEA_nکSbbEEZ?<ɓC[uϛac}^.]zܻkה>:Re1lٲGgn\R_#9]n۷ϛ?EֹuۿNCu<ܾs䤑#F9{Qh]zuOqSZl}ٕ+;o_?qar'{Qk7gY|3п{ZXz}۵m7wxg/NN^ShZZ%--7?խ_7eJJ DbuX/]ҋSP7k.<8Yr}ŕ_i1k Wp;r:uk6Ӯ暯&5dߒ r@Yٮݿ¯m׶hqv8]/&'۶Yd/W..~Ńb ָ//{bL7onԨo\&))=YӾ}tNN~(u-ƴxUUk>->Z|۷nINwJ>PšXX,Fjʧ/K=VVl޲eIWMIy.ZTTغc k{i~֒ߘ3g,\fmw_^Ҡa:|y.3OMSpx$<Ғs\|I׽Y+V{"#E.Nz_2vlM'cYUo^ԓ/NΛf͖-w4lӥ_4G6*v;g/^~iiٝ: 8fg>sd1o'Rys7O<֭\rާN^^ffF5۶F{D2JĄ蕧ss7o\Eeݻ[4kְk.\tiQa&:dhN'8_,^|)38hcs>ek\?^f}Ȩ۷[KJrZi8۴];v,wWM_|yyF^󕫮>yvGpyol>%_޽OڵkvQ^bŤƌ3Ws?} lĈz ٽUCۿRsۤ |c+_?exo'ۺ-ow4lЧϥ{[G};OH󟣨kG7>z}{&&fgk.jTW>}ڶKM'?+L<{qMOx}3qQ'%o7x)Y Y{P=Ǐ7.,Rii}OԽ[z;~Y#3[ Nϛig&5۪ 4ŊK++߷?%EX(...))NIMM}o'4h0dĉ!oٳq[n=s̙iرmZwhM-G/]}Tmw1=}ޛo~9sr.l6.|gYI/Gjq)jz x么?g&O޲}\|ܰ͟5[TҹSGGdߟxrT;-,lӴiݬ_3Pu,)iZ\N|OffefF#u򣟕:Nem ̛cGYYݺCo߬YtT6GpR&PUUћjLӷC!Cqş;.Yg}7ΚwOE7hp秼pѣ ܢ͚ff}/*:M#/oǎ-4(/[aۚ;6m֤qtBs"W&:RIImN6tH#LؼyG>\$$4dР#U:tB .[&3_At9|{ፓ}^xe/OyA/cQL 8tS+*v-%sS]] )i߾}=z5z???џ&5559f8yo{rj<3OF'*+s6yE)*^lݻ(EWŢWj?VsQ*QŢ4#/h!]6~HIIHMNH.))..+{۸8踿̺̌oߋܮݸqWMhBz_߶TD%=7o׾Z\r`I|-eeyy6Mam&\tYW\YPp֭7̝*=wҊCg/_>}o9^xjy YUU\}Oyҥ5E ,ٻw䈑#5 9U&!~ 7N(?TVRQMya61ESNp`cii7HMqV<X4?`{n YS~('g߾ QGIDATy5n;._>oݱÐ! ؔr֗_Ww+ IC\p>s9M6jԸQ?/GkO{ ,*p8ޣMKMԦ70vlN?8۾]F7OE{ va(O'~f5n(31j=p`NMϙұc^]-Z4cҥ:K7t\9kշv|d\uԫۻg/jyڱWsae7;MMxBE:;'g~ooپ}׿s)[ާ/\x7VUկ߳gv3xrÆ k԰wڴ>ք"!QzmS'a#U 9U׿R[o=k^d4fle(Q%rk{k<+}>Gz9~] n0zdNW_S~JJͳwݽ}bRwܙ\{L?M`߾^7:vdHO}͚{[4?K.9Čmզ;N22zի֯>ڠ~͚O vZ[} ͚juQqIIy4UZZj vԹsݺ[̝>ŋl),,t,-..(ظqٳL_^Zn_Iƶo:^=m̙:{ju2[֭mexWپI~k*#_uɱlm '[Rim}&&Lvl1~5e_xnҭMsA^AAe!edDX1uܹE=էOEŲӧO{s 7n,._O/sZ=HFkgdgׯ`ʕ3g1mywߠwrs33))5S;N5k˖6mF3l6=x6G?*szVRR^={<6 /_5骫$׷_ihjبaysKM;X#3G ~7߸~]&ߺ[%Ռh㍐ĄV:_ƒwm޼jբEs̜9oov`BBf]ѵ[۶-[6iҺu.ڥٽj…sΞ=gn}ƙgӺΝ+:Եۈ}fN*O* ޹ۓJIQRٰ^SNJӿ|ުU>n]]ge͝>#Ϙx {cU iӥKk32bomRT4]֍kF[**vsQUn7EǮm[yy3j-Xzǎ/.;ު\7gܒ߸q͈9'J*Gqиsۼi^6m[.]ҥKÆӀ?NT~uGqz4e3gEa~&0q)߮+ fx6Nh^ 2$%v>(ǟ̼wUU?]wZ9x𷯿kNy?=Q%Z-~))[nWNZ/ψN?N*%>ݭ|#Zbž{vWT|{n20 ջhEIIIm)co'opo豷uKtf'&_sJ~QZ+~+"t˴7dρ/{xL9:ׯ?d׮O>r评G=%O+qO?UecmO),Zd+*:w0gdB'ݎNgNdjm 89>IF|l *[&TI*$` @0I Xroތ6DkHIENDB`gsequencer-3.1.3/docs/images/ags_position_automation_cursor_dialog.png0000644000175000017500000010333313607210263023360 00000000000000PNG  IHDRF.JbzTXtRaw profile type exifxuSq zB9Abp h`-#| g+f"E U8-ҩՏJ_65?D4'xu1L{ScUt\%gD6QnDZ[P[y&lsh#k6ahX81cWVIqݬQ X,nU|`="g{0v>o@=zThVYi?QbE*Fu.]Ѧhu4,O,>@>Px<0ooF F~ Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later Z iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx`TG]#kٸ Tr:^jPhK[!$JuYnO@H t>s;w~7/@ 2˼"(7~_7 4@ @c(^xkDDFB4 @ ȟ@Z:(FF`c3@ 5πq ܆@ 䯅F?$`@g@ "GAs@ roG$ ch@HC 0 @ !.:DܜylFFSFcaʠ#~ @ 0V;0ZW#{odڲR=-CZLwfj6;;FҐPظ4Y}}1jŒҒ쬂Bqufб " )H$`@h4J\PFHj<us~L݆s\wOW7NC%vpAJpQT4ԜWY/#[Ȝs==,7POmmG{P(i4afƳpr qdԄ zxSըLT411p焄:Rի'Nv͙3w3g!-YI fCYb?DJ$7ϵc?qKN. Z[ 67 d24JpÂlt4EikZ[7<,I*%M"s9$Mk[Z?9UWTP^K7l >| ~х ڧcûe%G稨x `YYeekK`dDL1 0<< Öjj R(X:݂2',ʒBP?x3R90X[WIMu#rI$vv懆9`Ҳߏ5'k:*f:??(?}pPP=b.f%Sl:{NVc1>(nف(1ӷݳRzu5ڎYI.in**U,jmᢧ^z dtT*UnF0kukML>&rڵK]q8F%B|?Je[8`eql6?:ZSs8^uudxptaz$ooz#DZY<n!ry 32:Z=],sKWtƚP[VB"&^ \ffTW9J2\F\Ñ (-;yj)qoO}}CW` 5}EF>xjRXe b/]bELFk4RАP(eө3?NT(8Kt쒥ys8\.('3s:wzڔj;P fge,$jFGu:wΜ{G,ΘNj5޾6ܤspH`Z=2244<,C nA75D0Yl3s>qQmS;w˯G={R~ժ<߮RIঞ0.rxԀyhI Ujd\H>ΎLN+d D.$N!RP88'tv+f6a8O~OwU ﮕ4 &XF[Yyz98PicQ1lXT;{x ƚ(]=}=N&)dNhoV0a s@fXZ  Z&c:wݴ䵂 #{>֮ORi4ZgHd8 +5TjR)d 1H"Q(8RHK5r9K1}S R [P( V` 򊋮V67t7V#/Z@NޓYFO;R)nJW<N7 95g93=XPȤ5AJ}09VށMoV돯?O!S*IkgL﮷S{NV(H߮qR*ĈLfY L`0X C\! C .a2B,G 9H$Bc /dFF,[ьzZjkssӮ\nn,ȯpu k4H7H_s&`񄙟͏477!*+KI9{&?WӚV(T}{OKmoo/gUS{mRsj6}+ټG^wC$AqxɄ*xHxbg{oz~Vwbϩ @PWWS?`Ltr@PVVVҤ^9dckmcnD,s+k 1 T4E5"qKsQQEEw'cPhS3{{,XN$mm АTDR)| ggg'.O0~K-XodxxxT4T֝DS) DڊeNI* ;M[@ N.kkmlj2`gGODrsN͆4Y||TPh<*2\V߹L=$]^4HZ[sL H$lgd3?q4.44$쯾z>exn+8·ó9!Q>> Fwº+Ϟ..`Id*F#h\ "B&..\N":RlXy=}=}ǎhbd؄$$sؠggd;n=pfŲ9\9#U@MU&@j%bѨRv}B=%7K]b0wf #(g@9Ղ̂|#,YǏM7.fƍW[Z4 PŜeelƍׇi~;B,\]= )uZM 2MnV\n)u7LŋCYdWX,*X,漃3 \/1 *R 0gصyIH痼8yi{G%hΈ$kb#&$983bi@ә_F` ' 9t&IJ%`-]--i19ϙZD0 |ܫ3.f 4ݏGEUէN>ӍB9:-XKxSX,6ۃ!d2D*On\ I$2HIv-Hݸ%؂L&/ɮ"  E"jD(鲉S5!) 18X <1:*k4SVc# FPLL "`ӰXcM\ڀWR}ȶ1[6356!7L;Tj9@SE1.Gl <Ht7@ (P!GIY<o9/Me @ ( U|Rh L@ 4@ (@@ E@ (@HC " @ i@ P!yƲ:] 50 XAA">@ 2M6`W._)+ThL^[w]U)!˗?ƍ+ϟ`cǠd>@f)6108>PΜ^3ZQPp Ŋ<.;5qj;++FF|}9l7C O' bj7nd0zh7C O;#bqd' h.\Ԏ+f礜=UU90 )h4dr9 7Zof:*ս}EEgOBauKgv}uq֎D?enfn0Id FyX,2Ld$46lkn6N7**,:sBjG;pkol<٘ԹyzY?KMZU^DN'V9}Lcib[|2&f∷D !omw4&m\~1y&GD"xgjϜam!&[#U榚Fqr#T*T*4oic t}>[TZ55N7&*;r^@\cH#榫WJ۠`6ki[@ N$=W0n4𘁩heB0M_Lt1;{\7,)((""...>"ёNC2PR>ܶucHFYN&Q1 B <>GLS&˥ Hʆ(H$F!9)mzֆ)oDjjF0`aR@0EX~&':*+ SΞ8sggF_zPH}OX^}5>k@8H84,N'%)AXیX=`X,K`[$)tt}֎A l1u&JC7`gcb|G_m0 ̷ps duQQVmWW{G@E;{G'+> -嶴)8jlpN.ܜyb)JesKA~qqo/j\ V|ni.,(,ՐHD"szGֆ@ ȬNHo@{0~wb ʰYo8w/\hhKT( ҡ!'tnbRpD$rl*3:RId L꬯+)oHX|)Yd@eENnqqGJiβf5#rGIXdN70pŋ%%b}xxH-4m$Dd hyYf+y R)N_#Rioo]}~;r8;O"qw[rC|cZRXx\WWAAVVnnEө4Nln((,,",-i44Fb33kbTR ]L;q"-jx==QX@ M[;(Hw3 H {q=p (S!tC./8q"+K(2D21.||E&c!/zi֭)gN]uHQb1A$2xZ:&|L6$\μW;tÇv(.&xz ؙȴ/oy63ss͕ˉDssKcLnag{r$ z-[H zMM-]ΟS(X ̔wu swWAL ɛ7^B;/Z_DWFAz5#Zvr bSAF*)駷?>…vdom瑑Ͽش'wln[vɒ[o'F;ګ3sP(Lr7m@S$$_ԩ'HOɷ}pZ 8t7mڹS&][ߺtVۉŹy}kwoye߾o}|;2ў Zy3 4dP΂m;镕onC ^q͆Ƕo @ ?Y[{*I o[67dWWw*8:$%-[LnV+*RSOt{xX8,[/ы}|X8ܵ f礜=UU90 )h4dr9 7ZofBi==>̰~w]FI|TGxq?|,]a|] IDAT_v}{eҘe؜+ ;;BHb.ww7aje0v|ٙjML[^|1.΂J.oh<'|My冇k.w="4D./)(.+e"\]1c@ B$Ӎ~BCWDjΟ;{\(|W^F"++-ڑrvx.**.vŊX2Y*kk/*JOKOO?iiY>;>c|N_f֏{w~wH.~J[3SN*"T 5yhf6gΣ2 ugN1ڷ/5BjUuH{y2ysSuUsJfͪ5 AAc@89M0Tk$z &õY$io.:L?Q@by޼Gݸixށ@ ?x߾’ PG^_Y٧))fdzx>U^h$24'IKD"Thزխ4GR…O?`ъYOlY8u/. "`h?c L|tKS{JiSYvpZ,0$'JhbRQQ^ݣxy< >Ϝ]|{+|=/|e|%S˖]g_r:1y;dG!;xNRiaB.S*cL2HZP&45a2H\*ɌRF[Y&.|RdOO4{?w>#G._nhYƠiZfÖ, kb:0ӫRy{'-vL.Yff,)F"LGGgg.qNHvii2!!2 T]r6;O^.6al%0Ku:G0f1Z=8\XXPՅZZarFΟIPZfcfn̒on\g^ى :rNy%UrPUk,(S'OOwu{ᅸmt_hz NT 444knieEY 6ƪ=}O?CRO=pm7/\jjbjrF!yׯ\wQ\L =s MϬw ;cGkk^[=2 [&)L/ԧp nZ]QkדOnxuO_ Rkʕ> ,`DD}vϷءﰝ;wG=;w gW2em 8=<_5/R w琑 ]@QHC E@ tt☝gD FC !w,20 'F_b p(ErDͷKbqkP8E\ h}9(&~@  4{RoʫǏ}}b l^t:w81+je͋47_A P!wܱ1l@~B@  LwC E@ i@HC " @ ߌexhPAAa@A۬t{($  :b= oo͊H}2ݞ()&sboofE*P$62ր  wYi#66 Y\Kd G/^e'=>t=eJJaa[/?i4`LtllpO /,I`B-tt}ZX<޴qӦEA"Ao"c ȽJ({+)}Ub7?gN=WP~O˥RK6ήV |QdF"po "Lh=)>y'ؿ_  z8!ly _Ѣ k[ Ξ=Ҽ1Z^|e˯L>!&sI[{#G6<\S+uuj}R 0M|+@fں޾yFy6~>`cĬRV*j+* l99 H$FeqyrАD:"4,4LhhnKʵZ0O>nu?9zk"U?u]] l6>ݏG~hjˮ˕JH@5D7HwKᡑh* \SZ~\ʕ+E55m}}NKٖ|++kk'g?QVde_mk?vw?(+>x7W cd ǎ~k4/uʕ.Γ8\kzYW;s-*+>X,V78086!x<^p8jՊDyyiiy }}r9M"1GpHTtllx=`vv钒s:,V*񶶊.(gJSlmĐOsK/l~o'L\t:PiiA~c## %݂$ 3q$nۏ2myuÆW_c'ص16`(?E#\#*dj%?{rrE"oy.IH03EG:+RR,-]K[6o p0m>S_ee}wߦD<ז/wv"S=:::믾j`̌ebku#,sOOO/>rF&7484䘼"9Y7z2X,*.>㎎8xX\p|-xSHH``<_? 6NG"eƆ~.,A^}rZ-9PUm3/._ۭm2Y~~R4g G/_aOS0 4)1O?`P{{KKzz-KJrwo''k`g<vG]Hqۗ_󓧌ٺHdl|`m5``dVOj݂=1/_olfa ?w}w_w:}%Kl'~VX\]}oٿZp˖G 65wֿUZխƾo"fQV;#"6=i3B$YljhjiGEZGO>VՃ[YZYC2sFE6uBCD͢$xu`$}8uσB==##T2iRS#>q(Jg])/OKy))ӭ?X(H/ѭtNNX?h7!rFfgUm¡_H5&Tvu_{3h4s>SO'$XYpt?\$_=@PT\TZaBTt0hՂ^A]L0>Ms:W9}dm-5խ6Z@= n'i]Rs}`$)#"lׯXS-+J/񯘘HΟhBCMLꇽe+]]_G_+Fh۶' +G̙®ի, PI$"[ p \]12~Ołρ0Oz>bML0 s)E 2`xNN˖_`?Pzz N8ۥK-DdzX +V,Zdhb $wn8=ꥒpF0sE?\jG f,Jww*%!PJu:7)q&7QO^  hI ܼ}议Ҳ\Gsr~hw5k{tÆ 1躺SDzɶ7::ŕ% JL_J1H9$cǎ'23jk֭O^:J,'i~O+_vlx(h]DߛF(ܭVI8VhC]^*C!y\K+w [`VV|}==¡ ˖ڌ7n^^68GRRܢ曙Ӛ3fC)ikb_[RШT(ZĻݼՅ@fjf7CS`ژVh(_zjLtD"Vߴ`(D\=O`=="̌B~~L&ɔ:-i">ukp$2|\PL#t΂Z]ZRX#S( &J3|De2k/j *AV\н_ZM"tV+J$j5xEasطo$T&,YNܰ;}֞hɷ]ˍO,^ :cۺowo~~A~Gg|RkpIi'Nי.Z?}6.3a@zi##EE'OtvڮXk׆e2/Iwٳ7%%;;1=6lv򾏤uZ V `D&M&hk$T/$~(==+W̛3-2YnJD{(Bi_8Ds3j&h@pta44p83sS*-)/{FwQ!cmu7^H/080ǓH Ѵ^Kt>&||_owK/%'qt?qeV֦zKvv ##YZ[ߍ?IjAJd"_Ο/+ vv6g]_,Oa(NKrvgRe wD$ xӍ{.]&?2&]Hp!: FQ]N8 j7ظ8A>zzm`wT<:*ӷ|s3$J߻Ht!^t3.(bdT*kk ; o" EcSՆʂbgG ( ((֖Cz{=-l^,=Vvs}= {F"J)7Y ˷\l޼6 JeWWkTZdz <=2L,ʫ;gδ.M[{qaIIoF#G~eeͿoe11I#4N$B)Ҏ ƶ(dmr6-Qruqqɮ^-)ilI${{8$ڊ&w<{&&,ŅoinVV<4fc +,5CId ehCZ\** BEu ג`sXlv?rc xF#8U]hjH3@(<ۋBI^7N5nno ϙ;UkZZK˅B3x-l/_Ż=jGG~N޿FFGGtZ<Ŧqkl[kuY&~AvN)-mhP(y&E8;'mkc||oήvva94&g~NB,DO;:XP\\V]Yp/)攖T͵S)Voڼ`aO>?ȳxeOe?8/y=I x>S`AUuj>yÇ#Ÿx'5-Tscs/XdaEŶ}hg_ouT*,JO/. fЧֹR;.}ŗ_!!-_1/Ԍ4a2ZmQw~cN} v'r(!ٯՊѿX[#og\7_{-1ǽػ1s{vMwzY<O|C)47hkbq(R##T꒥m8FC#"f^}Ӣ蒡!&ǒ?YD2Vd{!x@|Ô0w qtpq~:Νl{+9`}|R=%%,V@@@|{p9&L?X@o"L~~yi+ܾ̋ɧ愼իy+I!ƅrRiIɑ#?rnبT}:'98ƹ:S;G2.v㦵k}}Ç}dCT9ȭ Cέhz3&E"S'Nڹ{.eK-Jwh>`vUw'\q{=001)2S+*yR8&cںʊ¶N$+1qs=<쭭S*@0?=+! K++>67}R% 4A60:uVd/{@~F[ZbxFbl6 vu~3>ۿ$0 eTRSz{/N^Ä9lDheEfVQ@?lkZʕW:ѿ*Ϟikg7<ՕǣTw-!e&L;{QDx 31A:/]JKjh#"W%now s纹X]}##gOՋ%RBpQ`el܍,sptP: ._t)+S$D"V^KMϟon}tDߍ)đ+99&&{xQ'\k+˗=>>>,q+`MO4jnΑG`Y4.Rj5ke]쓗&/E "bsbHxJ!#nࣙ {Gg&,GOVVNNeeghT,I%b@ggccUuaѕ+Vj.n.\Bؘ]PPQ>8fà*p[[Eŋ'NVV 5j?&8}vDN0A%7'3J47@T ./BitWMeey]]%>ᚳskkE"240{{K߅#bZmMugXDǬP7Rbx[ڸg&j 70Ll=%==R)lolÏ]7 33'S/QQ@'11qtpvPrr.^Ȩj =/j3왳g M7mB }}d^0 BQXPX}DvSRzͭM&[^ Z>$dajh,??'{d47wrqsG\)dc' Օy`@#"G5UJKt7kL-Q熅9:^/!@["2Hy`a]W AS/--Atr24Zktq pv}0;Ŵ /" 7b So'gn-/7% %t<#Fc#5Bavg ,]nkλcpϧP@snwrk65~k^ 8br^d.1 dbsB-vcuPP(9߭}avt?w[Dbj* y F^t$czS*d =#}lwmcB#!iuz?9`O>_bhz: 9۵qY]gn@ +2&3dDZ+oM,.r'Kg[7E?[If*h~:-oM)fY9` [d%s4fyyC)EZNNhڶMϱn\vi iMvxK<  PE4H@iPSM?{C=M-\2ш"S$˶d@O/6%7"B",gu /N};۴scSdt8 K<"۔V^/(zVԖ`j64fQ&w1L%˜3#DVVۛnjْ=@ܭcSzz\!G 6eW'pIǁvM"f1s e6UqJG+0 lZ[!#͒3 8:ńLk;6#wټH?7c#}7~_.oŏofOA^ƿW]\ ђM~iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later @ iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxw`TULdJz$%B/B *XEvSQwU pW+.HO@B%EIL=sgև э~uv2s=s33_Di6p,B@@! Pn(h7ڍ}OW^Q['<+/?Zm2־<\1h4<;/,믿G=/pu3O䗕 UssMXP* +ufVgP.*2v3ѣqs>m(ZĄ={]9t!F+:q-,KKҏӻOtt>QgΔ44u=7b7"w fgg={`0(bX,kر'4jcۣwլƏ3vL}XզMOKNz27v PDY:;KݺEtrZJ*uu=~ر1BB,˟|nqI}Æ 7Oaans\пddngN({y764q966LoNܼ9;;#цjgg1oA3g~ji>b%,Zl_GDH% L*:8W{lk>xܼ7nUaܜNJl+*J,j1ʕ[>oo (d?[Qܼ~ k;-L]C;L1yxg`@s._v>>iG||~[nPSSV#w?- W=K֯۸~s糲B,4(*[3W-+miYfu33溺 ??On2uONkyc{GkLO}ƷXF/::1aFtǏ֧On::~٦MҶmvU(~~~nn_^~yGO<|$55y_iIaa~:ujlq={`6v{iM_|!Y?^zQxl~≻cFz =>cFaZGWrT"KR*'Gn^^AA|s,{Ϟj1!\Bq\Nαc3n?dHۯJ[W-ѣB摣.X,}3cǾ[}&$4JPծ.^:G֝NOh4 Up/?Ϸѱ47Źk3YGQ"y>?/=R<~رG1EGШ™ZZjJхNi޼y۶ܱcʕ ;wklX٫KظVB޽󍬘zf^74t:^֨Z右X<<=<Ϟ"ocÊO7߻sjXl4 UI3fz5ڎ lYmmUUaaPЈ#FҶӵD$h5Bl6~7[I$ 55\]\]Ɵkǔ -Br}d7P+)mi:{ͷKˬյoau搐аm۶ooitppqrySE")-)*362d̙P2c*HI;"yzwzc#"uklΞ8y2uR.7uݾ}rJ\n05/0hPrTգG簻csfʹXTJJ++H Э 3\z2? k^;J5u뾽]zNj\~Ȟ]wj(_K@>PPD=I:]c{iJG+(hCR(+z/aDDǏgWܱ9oL>| F- +JK22M3&M qR{傂'v?~[FD*'gbXPܙ?9$?Y!R/WT65nݚ}djjxV۵kރwٯܲ2*֥D,WHeR\樰8XBRJe--Օj_@AS*UNZ͕Y*+zGIIv%$$%8w}7kw {enZgl3|3EǏ$$̚=JCŵfˉ{@NJS ɬ3۷rrq󙙃=3g@g޽u-!/С#GK8vaWW5kua=gFz =ĉϏ6lC#"/Fը:csᑽCC*uKRuԥktK50%g{lK@UٻwCN;_R:Jjjݻo+(8wi/og'exΝ{0U f'\D3Oڕg'N9,LMû+ye55Ba V<<~O7lqv|ܸiӄ *I_ߕ^=쨐栠N{gg33v ZR* Ғ eឹ;H瓒vo,{{ue G]))8oNWWD %2Jb{Ȯ]CC-J'7ٹy))+TGo!CFU::;-_zmoh388WV?{-yeuv'U*5zrr677~Z܄ o+b=e쯳?{Nq-LaAM7ϸ;8d  F\P6FI[,bX,]4n~% 5[bMmJ!P<+/~nnsx^Zoo (˗]k@s-i&'VV{yLu„= %70H?!x0uuu%%AABX]}E˖}uDT{mfO}):ÞV`H45~޽}\\5_vҧ;w<[rtJF s&q钥K^}%&O]'N9su֯-2eG8_X'3 `9RZ{HY}ʢO*~n|ӑ+'O=zHQ*UHNN=˖_O?3wwx1hb0xp Dr={&&|gz'FMe7\V>vsjTN.>Xg?Bk!wJ׬ْ0p@HF?u{1VaW-,ڼ9tqL<DŽ*ν, Na<9gӎ7tPn58K*},Rz/}mĄϏ0@~:rq֨JKBk0hncl4u@39Yqq㣣V?Ϸѱ47㸖"|7jNJϯҞ=,|rT2pРFLMLh[d? -fb1 nXwjhXI%l fc?k8BOŠ;8dj5 NJ"sI3{%T(B=eQr/k2D" [L IDAT@RM&?n{JKu&֪뛚ZZjj[.G9S'N"ɄX,*J啕WTH$FcKKׁ ~l2 neVcUTTYY__Px|NC13&M>#'Z,裏?~쌌G+J3223ϞKMݟcDbP]S] v:yR tg+l.-=yrnhByȰrr**orOsN[8p+>>R*fC:yxy57;8hlۺiCIiqIIiUuyEa;7`sXb-wsr"#B]]>/h2j5zMo[oiw}EcSuUyXL@Gڣ-#6lؾmޕ+O5-xUN{ 3xܚV׿RS _ tİP?_3f6wnwǃw !z$_JD˗]kwSSffb…<:X,c= CuD'WG@@! HY,?i##Gt77-M^uBceFZMh'_/+ZM6oCbuXh;757 mޟaef7'Q6J`s_`M(ߴ̹[hDfͿ>V#16M6,k۰WP]h8kmG@P/4{:> h#1ٰ>%hkm'f c"eaZQA:( }2vCe蠨 =" Q͵ދ&ܬP>w~͚ukW}[Z|w̺6Ϸs,^RYQ]=`"XB/.9Q__ZBllDWp m-$=}$%>tTn^YYcŬx{wڷc RD7\=`z*}gnn (74?Xl钡Cjkξ~˗^u[Uՙ3;/\ȣO?x^ZWP//tu"KR٥Ǜ-&P]]T.:*rF`6WVI_zC5-~xw0'[|iJJ;z| #J?]&/$TܟRUug}fX*mːyeMm\zUAYYZB!խ[LL\܌fLPGD˗]k@s-i&'VV{yLu„= 앞O8|$55y_iIaa~:ujlq={`64Fkj1b}BB1ocIfWװ 6m:uŢEFv2}!i5n7kyc{GkLO}U[ʹ++zNj"HPuuT{|,!;[lwwB~kױcg76*^^;GG?c}z ?_Mg{6g׮)NWVN>>]:4yzrwk1մbDSGUuk.}s\\U*GGhj(_`g .YWbbu{3Z[>1az~ٲ)Sf~Oc'3 `9RB@WW-xU bt"O9f >t#/^aʫ tqqRwz۶:CD2M?~hQ,VwLJzK>Qtt9j~93>^ t lٸE?Z:yE,)jw= TU{zpth=䂅ψDlƛ2k "? ?_T$AA:e%%U?|}.D-oeܸ;=Z*:u*iwbMKVU>w={d0Ç?Z'OH*+22o߸OG}T̉T~Z 6%eu5j̘+6V&ܵ3!a˖-_&,|&L' 7Vrrup~X|=|ОWg#_O<}F=[:{׺wD$rwuٳ'MׯׅnFmll&o۾sז~GōPkcY,M-D䡐%N.wR99 5uzSߟ {y3G>Sȅ8pϞ!ro[8۽QuuoܰeKAAN3f¬YC7%shSMK/~b˖ =zqaD_1cx?M"/- st|+RSO r3~:: NOhj}L~MMe^ʶheqR"qqqwkkhhll|Jbqupo.>GtwӨJFlߥ} Kuz㍭CD"[,D\^>ϹrB*-MMBX.?H&|y-1+nn[WpyQ@I`"ќ{&N4ؘٳd_{/**&č;eY|՗57:jKTIOܗfMn}ZS†hӣsIďҏd=tqt&tMވ yyӦČޣG^^>~2BT1Y!R(UUWUW\- f$S˛:l;(H m@Jvqih8XQXY_TUUX\]]\֖uuFcSSMrx"ZէϸC}|Vˤg0\ohn;.&e?,uu% ??\ZvhB4s k4a]%EE?{N+(kssr4joo/oGGvIXG}3nĉ.~e5 VU 2xQ&Pif:9I$..߮LHaLfTvwKOɩ<dk@obYtoIH9{`B£Ξ=ejX1/QryTAK$—,Oǟ>! {W&RiHpܤ1tUV~ݷ2;uQO:|(99=es-==Dj, /nڐi?_z&U0Onb! &sw.Z8M֯W_^nVRߧODDÆMd46;[.)Zݍ!47 斖f[|#Z9::_J&>>x u}{O>tp˖+*uRV3oFC.bg1cz۾mʤ''oϐ;&O[&k=_GE \0(7mܽ{ϞСkJWW>}BpedwC;8ru^|'~x{UsJ2.ӟO9Bx>rN#bH'|K+,۫W yj0fR^|g/.2SVdɻ~ѕƼu0g7_?#7.Gк%vVT?um(TTdK F}"Z}囖Jh 6j쿭*Фm6oF.m'f nVm6Tذ&@Tcަ $4 ~C:xz ڎ 7߬ZCX;=&{Ў٘lX߆&8Hh'  |^h X%^(h7ڍF:t:NWQYQQQY[#4Fj&4w7www7GGG#޾v5-6B+)ZxѦ&欍Yh>Bׇٰ]`}1~=y6mzܦΦJ7)63 G/_vwSO9:&y7БDK\u=PX,f3{}/7mڻ-zYf~!lتeК[WlbnaB&m_K؀k.7ڟ~):]YZ=JhiBZSv7wo/;-GmGڞ$_1Rh3n~6NJ7 m.>p#i\k/}mͪM:kwukkf~mB?G$=llvSohl։oҥKyf$+嗖56_qUgei5 X bcvX/µ]}|ӎ;;nݸ,7G+~Z@@^Çu5P"INNO?q}%fsKKSԩƅ9`+ZV^SҲnͦgggfuuAA~~>e z~MM?fX^ޑ=rxrCCuuYYHwL:ia]b¦MsNuuݺL>mwdZ[\uYYX/_}w_FĄe^YĂ Ν=uzo  Ϝyݏ?n4XoӫUK_~pskS^o^|BR_{MK{l 6:Q*? 7xǟhM>UPw:k-ywΜ#cϘC7mZj2B%eeNM߾}ѣYI&xe⒌o Zw!%%#׬v ?5~t/E'23O#0s3M9;`pr[xUCcA3敖ۋ9*g͊8#((<\&[U^vC~)ߺ?Ӧ?zYw9wnU٬վ%|x祗:9;Dw9sf|1&vہgJJ_T.2e-Wk~Ū|Lf4)|mݍ[o1sD8m?Fiu+^zkk2R?\fCiiz?SO;8\/%Y%11a`&~̙B U0rRzx^/=..&H$p ^bG`}`//_@Je2뽬}oOL??"bT^iϵB!=ȣ J|׾7ɕf+j4>4֬/}7"{~~Ey>'i-]BUnc &IDAT{Teq p)WԣETmZɳMؖ԰sU/YR+jB+)%^@ufy82\ywܽonOܹii>kovMn;E]=,[2g޼[ѥk~-ܵ4-V}d_W3ݟ >ޞ^CuMMa!sxxx耬V[jkj̦|^6aIfmس믷lhqq{4/qڛ&uPQ^!DUB۩"9"ri)"\ʯ+">"2j#?ԩ#y:V7򆩺bq:vm3s#GtUS7`]٬6K(unYpWи;:],UjʕeUQ>,,!2RgᨭUw:(=_yr} ;xPnvRi6}|lBSi"oiR@Ix(Y.Lt+AR!)++RD4ezW]#zx/^2>L_㩩KjV+_aOȤ# ?n̆_]L5G55ׯb^zBӒ,4y;v{hZK/Y[:)'$$Ll yキ1C\m&j5ZA+7nׯU-o;G>}fpdR(t# 6u\:J-VDHJKK/6B>pQRAR[X7͜`3g|~JuzOm]]xDdd>_?zoJ;7oJjv|]á՞8qCѭŢRi4dn eeLK7n̘^ 14"\nXT !!99Gt8nտ췅JYdӦMq㣣cb'OII٘{׾}5%EE|4@Y- e/]x "ĵR>#+5~-$qH仩$NzȨNgޞsT~{ iI=89"Q\f7V=[Pp+Wù7uVF٬R[o*//_ׯp8'Nz`vwW޲3C_?z%%&K?+*ot*W@'ܹw=u>ڲ%3ܹ9TJeM͸Wɓ&SFƆ>}̹;K-_#KOyMotOoڑ#M8aA||;w:dúO>^^FڒEKK($[pERY!" W׉hҒ˥%%|m뮝. ԻAgey]Y6lؼ9+b1@?TѺ:QٜQ7gԹspW}xxXfs]y%,BC";$a+ ?CsQycG_}ekΞ=ej\\G%&Λ fem7o޶58O6l} =zRYU UMO[>۞;tB%2""4׿k"֡Pڝ{o..ܿ§Ҟ|fSZQJm>Jrk>ۼy $';|pQ,dh%cDR#&B'q,LMMJcc,['''&zxǟ)4G?fͺ'l3Jh3&O^N koY_r;h4˗/YpZzt zE˘:wŋ2nϾZRUW˗-syWtz믯Y3f;d8VUsG^qLOo8.!Zmzʕ+V_jwȅRţKD^D!t-ϰ-G>퓺%UPS'*Vf ZLMMJcc,v=E2n[,a,c[w,xQ"(aSpSJ3\ d#      ;%l JhܿDIENDB`gsequencer-3.1.3/docs/images/ags_mixer.png0000644000175000017500000010546713607210263015476 00000000000000PNG  IHDRp`zTXtRaw profile type exifx}SAr >$!s03AߕqL, -Td+ZU#TJmG1E1I6D ^1G*hN+%fbZmTWcIp XK!@2h->Pu!F'EΖYHsЬX&2?(JR3]+$_@+5 7è]3^ =_Wsѹmڡc3˺#ЁC]yECYN-ZšM/ME*MU3'J E*7uK"H_D-yͦn-p)PJi]x317g{ e=|8N~/ n~/jO/ˡ iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - mixer screenshot Screenshot showing AgsMixer Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later S iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\^ ýŠđe4M3$M时fuٍ11IqI4"CAAdq{'hl=V;>/yq=iHL/Po8 p@@2~e﮾M.ͯ??zir1c?[Q_~=.;gŊXk[Z>ҋʕ#F?nJ$r{u(2;{gOT=4\ط_JXfe$OOWW>#G1~bhXPЌ3g_ ZM>s%5m[nkkJK ||\\w~wرo_߼ eUաO;e fΛo6dr9P7V?PNM TƮ.( yTGΛ`Uʷ߳;pJRӣ_y$~2Yr.ΣfhwMm]}CcA~qQyٿ߾m#GӇ~gJknV(7x埳fjZ[zvܹ3g/5s #㫯wm7cFty3fyeevzի,TmF\iqqSMknvu=}25uqwݟWVVk[kWJu$=%boZvP;cRS?ۣVJ7oa6wʕJ$_&PɂsHgffΝqs￿W~?}kp~^Ey]p]U=Bh;VpeϞ;>hiӢ%=\Ud68>Z ͽu,SLfj4.ͳf͘`Ze/W+Sjl驭)+:1yri"DDLrlMMKK~m\&3##"&NL>Ptuw|8;[,^ޣGWYS\0~]weegg_}&p}`QdRL{|dNԴhE+Wَ&[)\z媅/joɜNdepdpcO45d`sXش(// 7'ҦM[xV״wرsǖ*+KK9T*$::"",l^kF=G9}ul#\lޱ}={ ssOhkknvqL?~tmk _j_>sV/.;y$} zkgwwTiG'n9n{))t6o޻/# ӳ?;7ɧzJ;Go?q,g?3dk۷ܾs%NjL6})aaqqk׬]W*}O?=xhĈ#FLz˭ݻsGKK]]ic}&͝u'O~'=~ݷ2ujZ,6mw⮝NNyyy3bnj<^;vfffZ=_li!!?|'?yCN8u*xzzJrmMeeyb0tv\t%'X,gj/~|d,//w>cƕ'!55q׻ G~Vs󊠠q~rysEcƌ%:j]/N.{URT^V^>{=L2/ ka]W?vဲbՙSR'L4qBw\P8k5K@1GsgL_;zz.>(,9SZ+cc֞d~%%Ǧۆ_Y/>reK\\`}_zxL޺v4lAEe tq'wߺuUUM۷Nܾ7VXDŽQԴjܹ_>#**6V1s4oсaUeꪚ֖֖z/8d.. u h;~+W͛3I>}_>=$y8::8(Fݝ˛0a(OE g̈XCӏg_/i29\\<ݝ4S Eoc\wX&JFWg7WoƦ"BxtI8$=E²j)s4(WUEFYC±Y)"r⤩S rW( zU*m݉#G*?z?DOL&nk~wtvIe场wܱ$n̘ysm 5v}ۗ`osf}29nܬ ZthG^xrsrpwܹ?^>y8y.$ `O-n([~{wblLh'U+o{F`ۖi5^[lVVdmVT==c?+w7k&$4mpbQj =yyzziߑ>^{QM[nҲc_%͛+PNqvvswoF_+Lf%\[R*z Je#"tn^Wx;;YQQӧ/[kס>̂O6"":jC|UK-MZc^]?X &3$djinfe/i4d{A8?ߑC}C]miʮjN}gۻ2c&؎trr9:~|4jusmokoo:U1cy/лWzR(졃V2_@1kjr40.TzMM&DdYW_}Koi'O^0AbnG'A9:\ ǖ?CؿͻX>ݺc{Ĥ{ Wʍ5h- ϙߦqciGH:t<{Λ3G8vq~ZoN3;::%9-uم/ٓ}wvuw[&ѸHl~N'LV>zu軺-֦ʀyͳ@uCIi)gN47E^Žp F''ggRb6K2s-~t 41eAX|`hʹe5CSSq}T8zKo}WON:}_\U-zziT5_e2?{#|4{Y&!;VJH/,bI7|^/KrOPE*sS nݵSup6}4u32JJvTAydyWj5jpj ]0}ztҸkС̬,wwL7n{4M&꥗^}uzaY+Vzx{88xpKlÕݱXGoߗ_ m 15UU-]P2+dG2gf*^~]ӦuqO:~qF2G 嗩)ii*(\SE8*\=^T D2eʄ c}wfE>WߑŒbe27Y4&fWˮ"-սURƱL[ٿɅJ0T]XTp`|b9ӧn#|{,o設-+]}K\ܢE!!&L5WT5+ZGG'\w_}PKG~'VYDFttX{}oV/}prNg675EFL2k`<yQNI^f 㻻 rjG 9~ĉӦΝz  7'%ظrO_+/<{yK rV{`ZZfLZW'W@> w6|+56dLȮ.I*M>)x9rTO_<=e^'G帧p=^_h=.ťg Vt̓'mwyYQ8`}ۚoY^}E,YׯWcӹs3g g6 G`9\EG&&>ڵ+V4jZ8+VUյ(E,7657+8v,)iѢ)Sϋ_dp2P| GggV.wppupsb_̞f(:{VVnnQQScIɩ\߿oMٸ{?h oO=AC}Go_R;9٩WQQcc{{E幒"'90gwWD}{w툌='aplvw5Gx;8L>oU;w8G³㣢Ϝ)-o8|8))q,^2gJ9F]AF?gZ{s/n//5[[-֜Z8:&:F"jG2eSg''TWO1qRږGrqm0eeUuǎe?+7Ɍ 77`;G;LM#ii{Xtӕ ggOϫ0yRѣMOOHHDDl;\- 4a¶OK7w1`T؈oow7CDd3ΔTNNKKOO:t**ΝqujBƎ;a"dǏ9SRb466kbᘶLviںsbbM9zz^[ZoN:s0]yhKsC}uNTzk|s,Yz,uߣTZQyTf74gyRpvjb  ?!'#Gӏ(.7߹)X[3n\d~~NjW7?#YY99W&'54Ϟ=gNnnmmsYG;jF=_/>JJ}e@LR]LK;vȑЈ]{9"bܸ`Duw+,,-KK;ra7߼hٱ \i%n"iȞ`2t>_O>psl՗I؏DSΕ;8L&L `$FoȠ@'g7wo֝;>۳sM7M6~7$d"`′h2LVFeKb}]]#Gz{~ǂSL7w2Iڋl}ʎZom ϶_/f6 w2@2~#KWPo8 p@@2~eFT*}O?=x3?w32\ζ7obBYUuO< /H:H6;w??_+J%ZMmcSWg{~gOeeiiqqKKccm.. Κ={VjЎQ1qL՘81qL81qL7'`pRs% ᄏ齷XUb3U"yccGXhhB暒y<'gƭN )-\L8&cācāc8&L8&`′^̒Jׯ?aILɓsswd쓗B_> j\^11nzaC5sܕ+Z`8&&c80qLāāWrq~//.J]P/)(/>Tj4OڪwwCW7āc8&L8&L8&cācor]}Km뮝۶L]]mm^^߱be^A&D{CGS[- =aBL퍫򔔬)ɵ5rҥKOse7?!?V눑YzG֯=N߹}[>۶Oڲe~J&?f8~鞞ӧĭOµ0hQюQG5&G;&nMb __A`0 ?>o^Llllߗ.DN]]=<|};::7FZ==|1Ph IDAT;G~GϾhT Oכz;S"qpo-->f*ڵi+f͚:E(77?\zzjr᜜zUU56WT+)*^kmc _)W`4%¢ҒsdS~mڔx3̙=[*+,jmkhG5&c81qTc81qc8&G;&nMb X8&&$Y/߻wG|cVJGX&tqvԚL<~]vlMlctѳg/OZ'a"">_>owؽklٵ9&v0LxIlJ֥fGM{/^}ݺ+,8qK& /ֆʶ ?~#,,6j7Z[{gRt:r~yrDbbV-Ο?ihQc8&vL՘8&jL8&cюngכXD "( (7 XDgD2|5Ad8hvT@5юjF;P {ed"v DcDM )El<=e8hvT@5юjF;P {eE E_P wH-bQtZd9{Tځj@;PvhG5%bOf;KXelWA0Tځjcgځj@;a}`) hvT@5ڱT@5ځj!c 77pRRƮ.wdhԩ;ړsso]s$ܺU7{~zLyySDlߴ,$D=\PthAaUU}}{Ţy=wY=j޺+շW.裏O_d,Gp䉤^==n3fXυa4ۻJ1O6wnDcBiXW{4}˖>JI>c]5էsڹkӦkv{T\cXs7\߷eٽ{ɑQ1LZKΝJKK9>hk^{, vHj81qG;&jcю81q8`lvII>Q_1{uo<3cDŽxxok>=yw޹bI.uUߑ|Hzm9޻juTG vصk]GRӋ'M\vS&wwjm[0WxyȑJ#ӃEYThQvG;QvL՘8QjcF;QmxN!kU%%ĉ /0}FrJR^3}]*8xzz{.jۣTT;W^a6%<7T8vԩs1*+Jǿ$}ns'oL^de2o&aVVVW V jcюjL8юG;&jcюjLp ;Z =]]fLq::8 ̛uw;zE.8h*շ?L$zz׋@RQ稕J-C/Ѿ_~`F;&j՘8QjcюjTG5юjs왢gJZI֖juvŦ>uKJ?]TjTb2£89%-S/&j#Gh=ZzMŸOo>ghv;VJ*ThQ՘81qTG5&vLhQՆ reT3B*>USm2~FVb6[,QTjߑ£H$U'{\(V鼼fGm`OO߳RuP+kSS}]c|3`: lA]R;z ]`F;&j՘8QjcюjTG5юjs]AY"qv ;q≜2o۾e8=v2Y{[y驜vX~Ϲ_uINڱرm۷n5fL250U"im)9m2,):O8_rб:'n^ EĉjY"qs'?C`߾-[vhhb6UJKMhj1cc5ځI{ jcюjL8юG;&jcюjs^꯻V(\\ǍR>}*ZhCC]ݚ++'M9jV+VZrę3'N7 VQQXx&/';';LeE[Tds9.oTαSO*(lmFhjZFNωDl'Q$c#(7PuS>P hvT@5 UPuQJ5TQ 0Tq@7jF;P A;P \ CԡE(./ ka]^TQj"jF;P ha2 +@T+jnd"v 7|(T"JX+hvTL#"ەƉ%vT@5Ўj PC%,H*bp=}O-^$+upPvhG5 FJ@5TQ > A²];MXr8dϨF;P  Q hvTc7hkQ&E4.TXcm2?vh#eF;P rjF;P A;P \;ۿ1)-Ht⤰;2;O#TlGAv@5ЎjAd':!,}2|(Tv_R hvT@5p-lǑD"C)*YE*"vH(AĦ?gR!,'gaDNXRӄejS@J$, o~-Y3uv vMevC .QʙYzI4sZES@Pv9 CÍ=ю&nhO.=颿~):,,A-,P^=Xҏsj\c51qTc 7*,u-DAKo?o K!RNZ(.?D0C5юjը0Z|>,7D܅َ#{{ K(,N vC"'ю,(D4WX"E\;E ^âDQh;š 24²]5{V bI/EM=*r74 `'g0LR'ZkjN善o7d2?7k/Q7:`cƄN(~"QmvThG:q U~Q{lHVD?SvDXJQA-,@ʏnӪihЧII1;:Zu:ߣT_V~ɓɇǏ (mjLO?y=,lY38}Ϸ=Qm0VG5&vTL&,hIX46 맢 5>\X',O/avw.C6eJPS\Uu6}՚{httXЈ鱶C6FZJ&;رP~Qm0VG5юjC{TJauu +$TXjlmQ*Jv^Xjŵ0.:=Xʷqi$+.svrҹ$'dC۳J;z}[bV&mD/E:::d2=pKI5юjTըKq 'd&d4dr\P6p߅j81qО8 O `Y8Xs[b6+ \~ p hG;QvT!~@YΟ٬j4NNV˥d]]]z'FahG5юjT5 ([nn mzӣ$zy{{z= 7TF5QjeuoS>f쨀QD9sLv[K99Ej7*`X{jըF;Q C=.QOH8#646576 Z{ 6bJF\d2R9tXvv}]IINE1^A&IPDFfg={xOɔ7ztuUC}{[aaAANNllxxH\sw{Dʨ6юG; 𤰷'dX*վɇSSd J?s`[[,/9KѮ88ZΩ}|q㜜ZhzOW'癳N81ptpPxo_n`Ϩ6юhG=qQ.:=XʷekWLHZM `rmhNh\=å6юG; pv~ 8޿F;Q !c ťS+ j@;Q \A@2~e=.bkTpe+(C4p(bhG;vT`?.:^=~_l@q@4(e$.҂hrdԐl@isAlI`KjԐԤ٣L?B60%5NjNjR7$.R&; "5NjNjRl@q@4 #ط?Z[Ahh-dC?G`lP 5* l !;IMvH .v  fωiJgƠ:<2Zᥳ0r15id';u_Vmp{~T~UP_Y.Z3gD6d AlIUuhF붠5ڟ~h\RdqRֽ@>ks@9ӏPO>`jp%&k,#xyur15id';uQ?D#ǀ҆ߋm$5d'5@e(gq꙾h J;ӊ Z.&;d'8S<>jqp:HuAa`I IMjCjGFkO창@l#!;IMvH rej]:~­[nٺ*&5!5Hˣ#GD)Hj 7~HsSѲ&5!5HK\A`ڝzhSn֕55/ȞO'\LMv'5NjݻqD}`FM6l }/>`hm )LJHjNjRR90ܛ- c5=ZF{jњzz%H&[Z?X3zBPE(\LMv'5Njݻq63 {>|UUWAKR9H !5!5hP3}Βǀ%Ԥ&;I6m$?ԐRRr@TJ !5!5h?H%CjCj~(t Hj@\ ?ǑJ1 /;IMvZwmp Hj@G90ܛ- yT*kJ-SIMvZnL?B6q$wBbj8NvRލ %b.5dd#.s@9S;KZPvRd'8;(ԐRRp@d1 !;&;rާ0f(RCvHMvH X4x,J&[[S1!;&;W2wP^ *L|\\;:45F+sZ\OK~]KkLkq)iiidJqqqqii\M %\/BʭjK=S8{ɔ4N4N4^2%4N4NLI%S8Ӹ|@JAPkJKdJ怽dJK)a/oA9LɔLɔLɔLɔLɔLɔLɔ0%S2%S2%S2%L 8 9@@@44R۹sS]ݫ[ڵ#gΜ?Lշo~Cs7}biiiiiiiiiii[.rtC.^hk((1oeۦ75y'=xp߾3榛GWghߔүM&}Om;+_־}岖}V|mQRHwҥzم ŋ5f{1dp߾gΜ8q;v}XCCtY6wqqqqqqqqqqqq8%;J:֧~њuNVg>W;bPQ/>fFz44lٺ_:mwXe 9thkkIIe񸽤qqqqqqqqqqqqrWZaKˡC;pvoP==G/kCN%ܴg֬=nk}۞[ ǏX=wF;%Xt}c3 [j#G\888888888888k|d䉣G} ^^>kygܻlѻ-̛7V>⹝o66Mk.hڴɓXl>9gΰʆs_Ͼ'w|V~cc d.B88888888888˷k|TTA ~ѭ-_߼ٳXس ?=r1c }ܙqU 6fU+e6lԔ ŚܵbUv?~jT"J8~}n\t߯g>G|XfͦMK6,]_VUM|{9'LX=888888888888Ӹ|k@k_6*,,@gϞ=x>LJz]Xl[o}O}z--~S'o{nw_|a-ۇKm^}'O6}`ŊU+:6n\ld)_)GԥC>\L+*YRV>lȑbd$Ug͚3O^vs7nݺj+w:Y]إ掗 4~]w=c?#fWV6{}KV|kwkkwiiiiiiiiiii[^;(ڭrUzkصOԷ׵ydp]|5տtʔS()y}˯ĉwc /<4{ȴi& 9sԩ]84N4N4N4N4N4N4N4N4N4N4N4.7VţG>ۆ\zWxD}K8|dƎSjj>:^iT2[ߓL8g޽{**<$ȇhiiiqqqqqqqoZӱM<>h3l3wvûwo߾cG}}Ϟ*ƏӧG,7:}eǟp.3,gμ\.2ZZU6`„ 7]Q/-)IΞ}ݻ_}׮ݽ_MW:{X,Wsqqqqqqqqqqqq8%XUU3f~1۶mٽ{;Ν+(ݻˣ >IƎ-+/*VKxu~ːmJLʡw'xO]7m߶a7׭?}_G|_m[o9$WiiiiiiiiiiicrW?*Qط߈L+=WbjZ~XsW,^R2x 7y{Gqqqqqqqqqqq@;(S2%S2%S2%S2%s0%S2%S2%S2%LɔLɔLɔL S7 #L {ɔLL {ɔ^2%%S^”;(C888@@rUP.*VKsʭ͋{F+c-VcP֔hRNI%S888{ɔ4N4N4NLI%8Ӹ|@+ .GF+\+.67E;1碕8}waѪ2^#AkS* ׍)u4^2%88LI4N4N4Δ4^88˷)%(qO|FIENDB`gsequencer-3.1.3/docs/images/ags_navigation.png0000644000175000017500000007574513607210263016516 00000000000000PNG  IHDRBi׀zTXtRaw profile type exifxڍS[n = ! z#MR`Ih_g+M-\!dnyF^0bT}_?t'Z$ /J.+ъUSph'Jm%:]d'}}I,Or)5VgK5v2-A3]qOLE7h< H*gk7@pgm梅aKMq|=Dq"&A Zܥn3 y 5VQqOI [Ap3C zcY OT$0A/wm muz{ê()>uA!;$YC3HNΐ]bg 8 0?u] Rs8QN&B^(Hewц2A"?iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - navigation screenshot Screenshot showing the navigation Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later { iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx@?ۃqA@AEŽWMԘDiĤIژIhcq! e8yB= _6%dzW>9fAQSnP H($F $amE—¢0= NlLJ="gL̩$QWK>]lȄ}M_G[eEx7] @O1..v/S,IxS00$ZILQ3ݦS(1:с[:ŀGBHql\$A_mlmqr$M]yS).!IQPa%$drtŦrŞR]EUJ~GSMˣ< $+6SLʖHhP_+&RZ(trCN-h 2ڂh.I2[`6)h ڂ-]tDD0Ch ڂ ζt%:}Reh s{зPh"p(<>\91}hiQ1Jjn[,S$MS' tRxߩTT[H|<"45ճpB_ah)*MSqi()}p)c_[2b@mk $lIn]WO’D>NUܼ}׭۸VVp7~{4{^AZijysϾ?~Oq|0:˽wI칟;N^tfvvQQKwܸŋ_{- nnfw[|i;vZY2|S.W-beq]xUjt.TQɴЩtBpw-G \q+vN-PDRIoTmTf &O]Rz/-o5$(}FXcF8ByPJu#kۖ%&ޚ5'XZ,񊓝}7KV3vC#YQ=Jũ'N:zFNnaQ]ke5<0<|԰"jﷀ#6>a!}>޸fֈo;{y}.+@Zt*@BO,(L+Ζ--ݽx]AA`yg/Y2sֲ"W~ۭ{}JwwfLv-+W>t;w<ܞxk>ج"9i׮[?|-?FDYAW-K-9EWm ɸj5Ukh(6#R(cOo~7GWVHF0cFYYqqlޜS[zϝ)-]s>ӻ> ~>80qzBq k ӉDe$Ih։a)м׬Xysk˼y|o~\\g˳Xǽ?Ӯ%:uʴcZY?Ym;v.[cF?ĪEE{~w]jgb?l}FFO4)0Xdɲe;_,ػP!n k655575Ie2YT=nmuvrrtq{+52jO}N V*Ǐ v\bR˽@iѽgݚӤjuCCcc}Dbk{fV5$H2T&y;W{"J2^$Yh0LI~'p8\.o;3335۷.s͵NA[g˥m- ںȈ>-o` JeRgQg8s#g@iA~n =>cuGsft**LI9|Al |BFè= ^ygtq *4o={gCFFTM{oGm| }~>80u~$NђBgʞ$AMK$ɣt%Lw|Y<܌T@zs;6~qanLf]]iiYYK RSѣ?b)rųύ ebcݺGK Ꚛꚪ) qcCDŽps "y{|wmI_m`g[d IAhQoƅ>/%N)+()!"qv825uU7Rګ+V" g'4Ϩ1z3zqcϧg,՞cE1<}UեKi9gxNBiBĉ^,VIŋ.Hﷀ#6v0A>[ALIhbKaSP!1 :to;IP(ۤnade/8y/?__U- VNN>>cΜ5cfHP&*Un޾VtO;:xzAaMBal,x6mނH//ߺmi0qkI~^¹[jѳf_0nYaA||S2ҳ +ȱI, ;ky"<ܵ㽟 r9`ͅB֫.fܼP{xҬL3Q#̯z _Hht?^1*%QSS[[YIO1cF˧$U׆ϧWTTvgyTξjVڨ! $[D~h[ӶxDZյUUB@ 2| P*bOFo̱ƋgubirV3Qhmm;OZ x =V{9!%5)T$Xljja3Z cEBJַP(33O8|(..r^^I yb$V.~~gΎ f#,Y,/sg^xX@d{/>B:s{vd0a~|3W)+kjbbg'??ww<9trM￿wgO>Y*(Pcl|_[wdu/f^׭mcYk ,)9|ĉ9SOŋ%/^ z]N}^xQ9 m:Rzzҥ#'Λ7nLV\rr\՗yy/3\y\7?;vWN8qaalvm]̈́ǎݴ/kjVz }|ҶnSjG2eѢHڕqGvuBȑaᑑO<^w:?}űb#B}x<ñy-KJU^^\XZPӶIWe%G[[.G/+"xSt[w/2QU]zke)^]&4ԜBi ibTdi I2j/Oy$m*z0蟛[Z{"BZԱuHgta:\¨ɓ'MZԦ0--==%Eln&2,̅&jgǣ?6Co(qiiimmn6440028!"|RdUUuuUUBBbٳ=]LL~kc{YgGH$$&&"2,-oJ,*>ݷ7ws0a &M24liS{*Զw^ޜٯy]{noszJ}F\[7o:|iWzQO5*5E8Sb,Ȩm{m uu%%55uuJeIiMJGL8_EwuKe2--žyMsrla9>ݼLq_xatCȺ+Wwe0|} srqŗOLI4;It:fnso#3R nkkccg7wY oYzϺ;Kğan9stmoWZ*@k4 чO(,1wWhfkmO}'] yaBaoֽI眞Hnm[9ׯ)mWESFӭ_HLbjk|OLoƈ~\?O 55}}{jjFzqIdÃjuVai^?qAmfJ"9$ QDK>/\pE66nSzdD86&C( mcsB\[Ja\$c`:jCl|$hW?NjO}&iOqwz>_6]#|ԩӧ?D]Ȍ˽Cua%@3ܜsrJwy-O`2Gř/.)S*:r7-w9=p_mmm-4۶?(8|P//'GJhu<)ڈmϓYqH}l\&Tk?)<%q-,\laG}mx}.P޼T͞=*ڪCJ|msc[[{3Sjkx<ʼ؝9A t5h4hu3ܝ-eX,3X,frRU$v+)bR%X,9,/Cr҆o֬]d[^e[o@*ҒQJJ KJȟ<<:X.++/U(\R _(u?)NLttpwvrvrrtut⥌g4Ϟ=kܹ<)n6{.?s&Y̬:BoS?==<܇xu֢ag-zPE=McԾHTy0LԶ9!r?>2NQSijrwƋN(i3z (Q`2 B!o`PߦÇ71ҽMoenʾGNmθ<5juދ>]{[mJLld$t\bf.63e2ҖV;YzԱ(qt:cu#ӱqlz&n.s'O5~ү.)Hd*Q\[W]USKIk4M͵u5Jmjb&n![]{s>{\o Xdd$7'u^ڵ䤌ײ *+[h2싧 ܃A}㠓?ЉJtGM7ՠ"Hl$6Y7җQMsssKsFz֣46746h4mL<}Ck(EE^CEq/_|aC57&ٙM^UyYsl}P_CC\V-G ޽{Ϟv?p}otd_z[B/PUVng-zv֢@㢽.tZPhdR)j]w;nر^C)#IoqHjtRirE{C ><8oXpzugy2ӂݮpZ|k]ýwM>3 ECT]SSW_bLJ+0FF"c#ћu9}l+xh++1F=="ʊ,/};vcĔJrsJC=Puq>R*kkt?5Q)8wr˗4w9s~z k־?wgqsasOpW`>qLItC&wZ˥RbLm*UqIBcԚҲҦ_VWT^x)qsjMJʏ[7o>޾Jofˏ(~~3MrvF]9?& :ujTԌb_}hc IDAT Igiɵ_oަJ%݆~} c}(t19B>?رGc~ݹ 3&$dX3U~Ej"XАcݱ6Q~8L¹3go֯'‚!lgNg&=:=~jiÙQ*J_>r=3T#8{81 sR.mmެsz>jc;.Wdlo:fμK&LptP JU䉒wtwA%  0n>ĭ[BQ\wJ01~ 􈷶6t#|xm9>nk@0 ~>80uҷӽh4gu&crرVlvm]VV¹c155..f=a1MS]oܰe͔¢ ;q~'sgʕ۷++ VvYLQUU/6ki1lQCCJ_xa͚ݻ_xqZ-Wjo $oo?j=6g9rm˫+mm]ҧ#[Z/]ڷ~M7/l߾x"k/Go\vŋ-p!%%9Zbe-Ѯ-Z#чGGwOti+ :2I}33R΍;6ۻ[s1ކJ8eK\ڞ)S|}{۷OJ"IVV?%xx1|YFFbo?)2:=8ގil,(y|v|&&mOFBAsŋin`oh(^_ж ~>80uS[GLLvKqtw&/**t wf|ɍ,98x7ޘ2Ң?3YA&dOܵYyذŋ׬>}u++۵ޯ.+åKN Ut,--ں̙?{z?nrs·_yl{AvQpom ѣ{|MMbW``W^Y_(i+Ɏ#F2jԘ1tm %= ]MN_-bY7nؿ}F|K/Q%f:wΜ Q^'. ?qOL7k*J)t/Z65$ɇŲw >}={l޼ySvY򹱡Bo ֬}/֒C$'[rT*ZZ:{xDNzVwu1' }G˾tmFR &&RiʅsgLHilXbόVΘj.:Ŵ-]Ăʊ]}׆ ͸qO=+ӧw\cטL}挗_yEqq3.?peo_:ɱ n lHde-6331ɭLL]8‡]A?_o__KEpvh4"c[[/ϛڕpB+W,\b{_23 D0nYcF<}D =7k6sCΞ˗Y,kksƎmmݻ'9܃->8013(%Q]E܂D^;U3(}'*7ou6nߞ6N+cnS)mPϚdcCI 1MH$AN?mym3ălj&QEil ADAUE&$($R=省L08 w1=e? г=3)m鿶4R̟7wڕw1.hݖ$DTG (/`$řNϣP0dZe:Y)M5E$A*ڢ-h 4HЈDX&%Ly [l˼tx<ŀ(I$-ْ@?~ResI鄉ᄋf ,xH\|?`!CܧFtցoΦ]VV绸 >zԩ˟}eFXYql0_񲲻oIZ67667tp2$44jJԔg'c lW^=wSS#7oNJ\.f&jQ9EJmk,({*Un}>޸fֈov5@?C$ݸeʕO-]'xnŚO<)6HNڵk?_2=tz!"~{еZR'}20=kٲ{Z.ol˻q&̙]_|==? O>籱55H?g:qYM~=$Q0ϐEE{~w]jgb?l}FFti&,Yl>˂{*Atb15=k0 ٶڑ12MuS}iiNNuYYO*3i;#$П0P  RSѣ?b{/LhĈ+}nL(s-]@bFxzJeUUyYMFӗ{hjk~7m% Wg.ӣ;gtPVUgf8qP\\弼:Z$X8EL9;** ʒuUܼ}?2Kw9u*)šX"p1mڼ^^"cJ=lmzb͛ +01,if8jWW\Рx{eZzO&S 00 rݻws aA_ٽ^G13f򊴴G8{ʕ>uI̝:5 ҂U7nX>R9q^<ΖioT}{._rpx7y"crSo8uS.fWUI\ۘѳf/\>[_ؼw,]'+WZK0jjjݺ'%V[x7uo{Ң:pիwʚlݝTȻ`EwG9/?1)Ąk e26F5eO>9"TeZ׮)(/onr:ٹX̥Kv/ӧۑ7ܓml9iޓ֒3)ndB++Ӧ͝+6ݝcB4[Ɔ־XRris**4뻋 &6SʢS}qCѺz7 &OZ`$CÖ;iibOm͙_'f]Bo<wp 0q ں Ǐ=iW_ԬZ[ #qX*//.,-S(X,V"~Cc%G[[.G/+R 3ɡ趮7{OmAw3ܼ7J8 ̴oR4䯿^ѱ{W^ٳg|{{_9ՕޟSyFӵ3HЩ+ivKHtL}u B6|ig/_N⢣ouc#λK XpԩW.}w_"#2YNѣJJVF\r [Wۏ?iҜ9&i4umwR>q^P8톍׻DDLpԩ2YYkI'O$&76j4Io֨\[7o:|iW7'\-yʪҲr&Mǎq\];htLL~^kk3]_ߛt+1%eC ?><,*jH.>;왘&9oYCJ=cMݻ&/Ob;bDXYX[;9y/`֣h1##663f>>|}~?o?sĵ!!<7L(ͺwɴ _꥗fvrV;l/\dJʤabHJ2qy3Ѐ')V S{Tw)9*UkK]mq+g?v!E g'/9-m?.^9zDI䓣CL. |'Ο=az|%Sd"&Ξ:ljGI3sR)p#ѷoO[WGFJ~{>{X"6ͷ^Hu_"Qi֭\5Vinky EO.5rݏxzHY75gdD-.6޾Uf˗?Fo7woOMH/.utUd,uW!!{5斞/`ד4@\szNR9o^pp/f2Gř/.)S*:r7Ip\6cB$`:jCl|N|@HDŔʤRuZ-ˤr9C# LQsotUUFlWzLgFܜgW_ef{!q+W̙>wz5#{WקruEGsN 3Z;etgmRJR(:pBa#*(6wa%Ҳ afZ[piW_}-_edFʌBg'\m^ʒ˝]f9Umko^99J٣B:9 #+Q:9okgokiќ޶uAlܸCzy99{ޙ&ܬy*{~m_ݽo66b1LmmL;Wx|$@k46J%c&62:O`fLTJRMznw1ƢXjT&m4ʦ;""A(&'m嚚Jo(,kry)5PXo(R4Zw iimh#W(y|ƄX -VΙ7nLr>y)8ՑNgK] 22 ՝\uO`ڎĨ'G۾0u6F&cN'&DٺL=\ȑO<9jx65s=氘L{#>$@3|@@ښں&.ձFLJ0FFNF$I7vFXؠ"S>O_j1FF~~ )ҫ^|57_LOfh܇z~!(\R*kkȑͺs$ΰYb3/ ?gnh,*ξr%Bllу6o.*R|&Ft;S&30 uioY׾"(ӱ/{4`|'J '4{Ң4pH<7/BzzyֆJͺZԚҲҦK/e8nC|8f6mʔ}՚n|B]ݽmJofˏ(~~3MrvF$>YLKYƎKL1ޞT%i1B]% 3u7n={[7n^^R,mR65e\޵;QQK9sџ%j Lk+;;CCj/E">cu[qb |Ͽؾ{w⹒ S3_~͙WlV=~>%Ɔ&PĔZt9'eY\T$:B;6571(p/ rp :ٝ3ZZ^=xয়O_"rqF~FwTIIиVl32t"uY9:ٞL@bci-_v.!>|u7660p5Vim]qѭ,y<.5?lc0""V\8(ٕ/uѣ/3CDlW\B˥%,S(ss23SRSSKBwwGEdVW;wͫq]˻xOv1baC--YuOH]/]$#E`MM\yhm}C?{H*54ts:v'9"rcw8y2vSBdRYccEE3]X[+:mHGGRY V֦f uٶ^Ӌ~֩,))vvDŽzxѴONH5EL6̲.dl u_| !XZD uYYϟ9wLFFyH4tGGCC'hQmۗ/%%%&TX/YsfL.Wu>9lRyJb⹄in 9sKkkC\{dR͛yyYYi]t>,,(ζcRr%Lnt#MLjkn8gݱnV*V裏?ycc$`Hݗgtgdr D-F+I0tupf^^e҂+Wӓcc.ͭa2MM=<<,,ڶmkBr%lٖ+w+ɘKjo`CC;a5kΜOJr%/J65uphہ '=iSSnŋqr^~u54n\8۷5 o랷w`_P]};3355|rrfCCG10.,44ڞӾv֪-UUٙ/\8!!!\rd|Gd䢅O<9na-NkaTU/\瓒._okС*+sn75ٍs7m]M']hqr/̠aTy[qíoiv&9>:G(Q0w`'4f}=fw46St;EdBŠbh@3߷nfZ;LWsx|q ̴$!)mIP   L'+#e|a9 42o~= ``Y \p5GЀDc$8g4>A9JOoQP(р3`pbfPȣ46@@_kQHOpFh 0`0P>ѯIENDB`gsequencer-3.1.3/docs/images/ags_machine_properties-link_input.png0000644000175000017500000016236613607210263022405 00000000000000PNG  IHDR>odzTXtRaw profile type exifxuSmr )z=1f7F{I'uư|&#|1M-\2Ո"S$˶d@җc;MO!C]DˡS^mڹL}_DjT.ں9^%gDimJ+I/D.(]L-:,1.-eb Q(o¼(hIݬ1 -nI*bQ2?qAn&v. +ƓU$~(]U\{BjMaU)>1 tv $I1RƷɈ@~Av5?nz'Q+]>w<uq!S\ezTXtRaw profile type iptcx=A@'-M9;d)& vPKZ(3:A}#o݋FY̹J'R-]iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later Fh iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx|e?-nvv7WRj b/^ߑy6ʕ eS FFMpar\ƴ+W2l* f3+I2yHQce^>v2ZeEvvz5UrvyDF&&&%FEyzx{}ۮ_6嫗++fz,=?|Qa>Fg{$%/[v= b1E99J39w$L&UkiYvvVVNvaaU [X^˖.8ׇ7kk33wڴu{ysYYʊ|́N/*>w.#(U2re=4yͦьG7n/\(-2%/e6B1>\S'L_ wP6ljFX_Րw^tLn(./,bܧZ0?<|̲AngZzM5q]p pbÝRXt+991)0ҥݻ 򌆺&%<ԇ B4)5:MdbcUuy\umĤQ$&SkkKJEQAd #s/;RSTTvxI`RAQt.ɉF>{1M\~aзi䝮޶F#! 2obwm6>_ј, '!ucie+Or\/9;_?y( a#/nϷVd4MFL<@@fLP̶FaLm ZNg0y]gW0:tZ'l9wb9;DL[7h{dZUЕef>T^sI0,;vv9L{iLF$3}DEΞd){RY{1'3390xBy'9;@z/u V|pB$zd8\1nW[Tz*q8?}ִ&/ ޮCbɼ4Nd̙KFp9n\ѨѨTZmk[__v_* $:^OE/Z7eZS[Vw̡ǎ䵪JΝx1<<L\PIb6_Hn 厎 Ŏx|?_?7i[|| }.|ֹr1lnWdf^X]IĤ3$@??QOO)?Oc4cGT0Y|@`ttZZ:]&0d t/ydt|@PWTVTPx'LJM-hjuG(G:;7>qTW64Lr˗++U-hzVO$yir82yxxtNjkkn2t@JJ;&vEBCZHBqJVk[+tzpO>`AT` S4CnrD`4,T*&(p|c3;kp0zZrx-drd\.x(Y{ K  |,,l6cJ::f:# Y,24fra䓢:|.Q:nK?AF^ Q%0iÍfVjhjtlҡ'oG;|GZq,-:C|RloxYaNa 6%Ѓ\5qimmMM䶎2G!!xpZZ>rF`C5/`XC5/`Xi#ZCRu۱휄$tNj:~BQ| `X/4ZvbIup;~t\9.n]]u-,VbyİC͙[HҒ% !phN_3M. DP@coIk#$tpt)sC{0|vap ťkn>`w͘L-s =0`Ԩ#\~ړ_{]Xkv?魣G^xo0&1o՟|̚>/YQCgN_T66 |ghpJ=;&Fڗhǎ]a{֬^~Y3}}8ۙnC`;vRYyc$%%_l٬Y..GV0՚r{ˣ6L@,s;ǮjUVVT7i4zLx-,\0)5&MڹۛVGGcSqq~~qQm]]t:KZ6oШ(?,<77jUUCϟ/ƶʊz:::f!ɂBs1Жs 2-lk/)8wC,  bVUuUIIIiv3*UhXbQNB FP="69_MO/,XGd(qt++/^j}l""tAY^\\X~VOItX/owWǸC_Uuj~``TT@ Ԩ,/**.`C'%%%8;uGw*5.[, y|Ȅ-ОSzl;yishݿ0Ƥ< /ΜqŭΡժj;y? O1cS0MW9{Νk+Wnǭx/6o;vMf't:Kpwz}1/_>{V$twyY,Py]kyJJ,OXql;g0Ǝvwc\4,(4Hg0F]NQ>BdDHԴj'ϝ5[SbinsOfΤϚ=eT: \.G^/ȼ g继`CG)d=z}MMaAIZ-r ;62R!r;?'qX'*ݤ,VKKCCl&\ddP\v*qu<xwc'WwFu&&^ $o46xA) ]7g-/.nȐg7io pQsAv>h<~"+=(9Lru`1݁Mh3wݭ_ܢjllnZ] L rp.LO77o tn:I-\hfU=_1N6hS >j465gx ySS{WWKB-StZhzFyKE }GFK%t!`t ;v?+U,/-ÓA'M]N:[Y(HE"&dvx|.Do:!bZӑ$3q;cmmuuujbeB!ӟ*tut(糲M& %K2|>7c.6.e6u;~G J`--yWO?p j/Op sPPBȑlNiIiRYXxBYի _ qyH\{ t \XKK.],,lW; nb`};:ȬŶ\!nlh+*+5 -VV7lt^ctЖsw h {m6wt:topmWS8=o嗸̷ZD,p8݇ry;aJ$aW32sl|}} .|~x%>ul'6S&d{SUjUY-\Kt[A߯d [2fLJJPSF 8f Ғv5%%)1B3fsk[II9$49߿>mn;R zP QaSVN岐2ݥr9VkuuV։wrv3`mmbg'EUQ,ok~DUUjT"u餫B[im{F!d9?b>֡Ыd~h55jU,usqP]y죻ѡbbbȝMyy.56PVLKI7oZ._QX[[jőR[yNYfGF9B-P `̶OT(kjL~?e4 _Y胴< ЮT:ːqvrxEE\63 Kk[qqRN, :T<]\T*V+MimCBr2?P EN]-硯3w֯̆ VTTfedژ~nd"PYax`Jdr/O.VY{)7 ɝmCkk]myyiJ$مQ\\Q^RR['r!k|箏Q4kksse?nŮ|Ҫ(,,)h"<= ym8XGCsDXl2O}ssC͝Nz5S>[DM=w>C蔔->ɯNB'g[jh u$::!A%I$:^\cc/z…uc۶O6|\Y9q/V ?uT&&H݌'v}m<ԃ,VhHRҨQs" eժ*+uȾf36) %yѨݻOOۓ0a'iQ|}<3o7ISUQZvBfh;<@'h\\pXfsSsQѥK54D"u \.yXN\]UU`E2ŵ0f sҥ2V I TQk?b,>c޷Iwwtl'86R55LϐXʶ3P(0dЂ\WNs IDAT"bM&u{}bѼZq02uA`1D0jA~eeIInnedNѣ|}ĢbI㣢(Kmy򶧇Ohb^**"Ba2cbbF ~: d2?7T__Z[4Y,_d0y ן*nm޺vh'olr<3+14t(8n_N hu{Y2… qtxĵKi'JLpѸ+Wr箵k֮_/?25MzrfxϘS 7ii{>b>7[79gx'Yِ~lEY ?:DK)I7&66&FѬZg˕s0]"Ct)S~O-NLtll\k<&MzDX I̬;Ҕ2قos3gxyu@Lt\\BLfm).AyA=n7Ů'-Ru]ϭ`(,ʽo0Ƚ"x/xy T\R_Zȍ)$Ra:v1tz|x<!9캾;-Uj4L{mʕ2ac&_xً9yW[[Fj::&6SַFWT"FV0X.Ukkmo' 'g''~#7:8Bw09}YBOqr)^ͷ^clcGHWdRV{w>>f…3gfٔiRU,Y2>xwlH jr=wB>\˳\T7;&^lǒ7ɋ}>p{ǒFs-,ro?Čy9,/xxd^2oxdb cb<<8-=̙7}woff􈌜1|[LW炪3\0T۬UT9'-mOKEʖ#0 <|䨩͝29,g/}o6Lfd2uSҟVks˅ 99lt /\5K.ˆce8k[ "Oes˗ǺŞZ˛6}_ϛlيlVŢ?5Zm<\<|87l ?.>^.g|r޵k}g׸qS-X0f5/ĉl^_yeҰP>6/ _O{K a.d+-F|s?\8][;k\&v;-]rϛoΒ{PzFQLX  cNFFhRgL2坻6|aþ k/8)uV2'E+5uSFޣ L S۶oݢKG} /XMͧNmJdڴ~xZsMGz3 .6tbo8WZjf^vС3^U*348%ye͞#qe!~¢;{w#YY^zfpE_jT] R,1%> &1"$  >sgn 5;wlzȥKe -ťN Uߕ̳6±U.)=~Kʕmmz=)H$2YtY=t}ܮ_lj4|,Ï'5kmҚz7^߳hjjϞݵsۖ#G.^,-Q WWؐe$yݓcG}/ᄚk5mv`30 6vgώpz[\Tioօ^Y=jTe{d+(oZ~71% ںs9))h8w3gxwwk6._ٷiY :%d!!-Z|)A,b?Qz, \jO?MQQSBCm⋼+kzտ-Xʶӟi6lym[kFX}^xạǎ9}ªJg\DAg^dƌWnNt =8sGyL_݊/b}w}JVǪiV/s[ (8$TEv,/W*5E! o6c~m%y$͙MZo"xsӧfɓL3gbT-yWڵ=֭_`~WV,a4V>G}4&g_xq -.̌(&f2 C "bDlPOi@|-(hʔ3/;Yͽxm۶k^^3g^~8z cG[{dԩ3gw_`sn(ɩ{dy \vͿ{J9sm޴-//r߾k߷N5sٲ3ݰo-)gx)Sd^ܯ~WLLb u=:WZ_g4$$̝xOd FSg||HlOǏ[;6UW{{Θxi4ZscYhTVUTV55UMzsC;SErB&hyMM$R^Ţm[׬ټ1%yŊINq)C\V yW~)cf7^Y,EEN۷w߆ ʫΝͼe<&7' Sk4cs{_\@@⛵Kk[SSsLĮ"Qo.IR&vֵ4yi$9/! -~ r)M⩧^C"#BBxU>ِ~lEY .Zx_ysMMXÏ&"旬0eRUYS+rYv/ t~O(1"b| 7L2mcfd lկ=?iGKKvljE]>kfr2YBC"#{ێQ7|rl}J/yW895E[,d;w)e Wɓݻ.3*O~~Hs)7%GcGx~,Vp…/ߦH%$ӵ&:vUV߳7wLI'!A|7?OZکS3gEFN*t.ܱsgAD2wު+Wv^-**!p81Q>?sfɩ/5JVn'(b4 &< mmR7L&:ϵxz)_ݤ׷xxGݘHWZ?{lzrLoEgX}Z[n,C(tzyy)4z˞gZj;3J,&NYyl6 IAz Ǵ$9>}I?3g.IgC[:WytI*]y4iTI>KeeMm-)%͖I\- sr3FcI+fsphJJRROcLa w]6|ec٥Mzͺ0`tnҿPT|9,ab7Ȑ#9.nҤ$P\\_UQky:9U|}ZKZF,4,03] LFo0/Aɉ}BR [0:ufBsxynRnkoW{7bte zYd$hl6fo=Q =lY-N'::Y&@%raD?K\Vy.+lhjjn]ҥ?KQLF)Lvs#1+Mkkmo7 'giM^I̚rg6>ݷdĉϘ1sKgyy}.{}{ڌƁl6E%4LWPatĕZoT7w{r, ^p [PPX6}GӕUVѬ^Ӧ{{88} p[0~;[1mڊ'{,%߼iᄏ|e2JK.oiGz+zCQbqdTT7R*/\Y8?`E/-=yѲr{ 6Lf/I!7n=F  <ܹJ6;0pho;3x>@5kĈ\>r'O# &eZ=8)i߇~MٳO5:0͝5[*\\Ǥe)L>y/wѿ?b`BjXyGcCiiARb̝0r|[o}9)*xson>^ӘIRUSTTP`APS[YYRr1Ls\VB}˟\9ku6lKi?;eÆhΟ߹$*>G(骫ssO8p6B Q't h.FDyzxyItO˓FM;ur,?)tz+xJyhĉ~xЧVN7!2R79xѪjiӞ{~X2v #&.x3aER\˝֮Y&/߿T7&=cƓO=XM_o]nVOW^Y4,dzGDcaaVK..q#F\(Erus`Nŋ-SS%~ҳϹJn3}ٳL2&&joZmdVbǶo?~CGPDFΝbżcǒW ]y܈ Ľ[8p`_^H9xzō77[o K핺mޯ9{juvR,Yx17'N5PHdKEw۾ui3gt:;$dg{vQ`^zU{u}mZMxbmM% Rr'&>߶u߾3|>m^b99I% ExqF#2.Xb0zzD1jj/nr L.W,vwd^roر=?u`[gTl쒥OvjӎǏ:wtNLjgN;vΜM~س~uE?o7yMJ,ml봴o]6#ǓƏ瞛;78=@4޳=HCg9}GvvGP(qϒg9c?_6m'D$֎G&|}HB`8H1$y1/nܸjgTssM}NsISZJ'Mp ciiR}Ԩg'Lp@ǎov"`#l.iig,#zxܸO4 /=#VN'&VU$ YS_{HBN^-@R~ILv(l-2YpI( vawU).CE" ̕9ӓǦZ2BT\9q[C@EQ宿܇G-GyVs9{>KZH4ּ@2 v&Bљ'P~Z!B73**PJPEB Y(;NSEʰˢxSs@E'@'EDOklQ9Uu _(.x)^I#Fx$H4;ob2fݹs҅{&ӣvN4th6>ފ'$7ﭷٱߩGkɱK?{ءC4rv9Q*TXxD\ou޽GXYUѤI/ zՁ4vwW*T&;]P9hW_Ο}=7bĈwШQ*cN8w|h9w߷/3az^g7j3gύ46_ncޜon' iv&<32u@0`LKOJ:pe/m=ӡ}^YLEEyy?MӶo[dV|F ##}|,-||UHH>}pj<*Fcfif:|{ȐaggDc۷wx;jDp0#0rtA2UJֶn؀S~G T?I{FcFڵ14yiА!E9P!7mT&'ǯ_s@%ӱK'MիFEƏ:t"i!!^c[[wMK1~UBa0,X8a—=ᝆ 33Ʈ\+!9y^LbDZ-vp-˗|ϝr;,KA hPoX?uw-MK3_Λ;fСd*UDa3fո]Hge\5u{S6oc̴iԴ0|[\y/Mjʆ ;w;- lڤ{~Ą8[ee9v-_hē׏۷[z<<,-+ XRrHeѯF;:,˝E6j,Ϝqѣ䑐''2Bn&;;-Yg \мȑC6m"کy0mJu'j4aaMFի_s7nfKԮݱctVeffgdn,,Z JyӦѝǼ@d=[[BmleUQ2رEu;GT۸aŊUg͚=K8iܸ.]|} .=#>~>]FWV~gRy1u->-(9r{/Tm 7Ν;)筦(~`8s&܅\!Rsrzskdwŭ%2t~~*^__w/ͣ2nMPz#F6orŦ0"C):]p/еKӦ66{Yb#^kN./tBi~#{Gh ŋ&.!ah_ )?qWgfB ^Λ4Vڶ-K:;)*-lKK J2d]TZ[mdo^"98:grZi2Yl iӠAxxhu++)CƜ]8Ǐ#,%2o߮2 o_TZm RmiN'Ģ&h͟/;:je\B&+%dϠhx1'\NRyyy{s,,$q..B/޷+ǎ%%ܱv93=]4yܸN4^OΨJ˕J?=ߝ2.1ޚ3 VMݻJ`{TTt྽)2S@a/{PYH2Zrt kժo߁:v^`8uVe[ayLߋZRz5lVm[SOr]O ѩSLLi~ۄ]/ٔOןnK ݩcj㱏(+;v|ŊsɃCBU89mt );wؑaiؤiNPzi|}5^2ʕ[į޳߿UkO\rwV| $pD'OթS[R?˗]]5+*j׮=kt[.:]^^Fzʉ 85mڲep]RYƀƽʕW *)rZ).IJZtx_]O) (HZ+'Oˢ8Q8'0@T~_ TAPtIgma9k@ Cx ]+zKZH4ּ@2O%Җ EgtBje^߄@ 5eDO;MoQnUj) +OJQN:آr"*:!'**PAP ]1R5t@!Fx$H4 iw^Lgw?<7_}~nӦ̳FvG3f~fs7Vzk9svtdz= )) `zLO,[gc ح[7lէ'΄ eQ邲E r5#F߿CFj8U).>p_'O;vĹs%Wјs\o_ffY|eA7z$]?ǯ;>gС?~ilY?Ƽ9彷'((/oݺO>6ӦLxgXe:t4YcZzRҁ/{ym4T/0kGsY7m߶$vbFFXZVV!!}$~OKbM5ao!C~Wdn>2ڻwlJ%Piڈܠz*\nk[7l@S⣏ !*1#sq{M4hȐآsp_A6S*Wů9q $PyXإ&}U-?nEħY xǎm2/owޙ6-qD߫Wj y W 4l4v] d4e#"ja6oY[6<~ܕ+vv..aa] 4`@ÆzSliZu1c7W&S"" 1cƍB:+{媩SߛycM0 L8~{iRS6lعر\mgp`&ݻ{>&&,{3JJRR>lMUczU7/+ٵ+nE'%<]TdmP~LL߾ݺիaiy\RrHeѯF;:,˝E6j,Ϝqѣ䑐''2Bn&;;-Yg \мȑC6m"کy0mJu'j4aaMFի_s7nfKԮݱctVeffgdn,,Z JyӦѝǼ@d=[[Bm|w6]ٱcﱋ#۵Х /vV.?qÊVϚ5{R9qҸq].鲲ofߟ͚~1;lQǯӥgO٧kL>_V*/>nݲe}٧#GNy綾ֵ@`8wlFvNPxzj4 Tzzi4* ̙srHI:rRtϭ!zͪ&V$^d>nnvvUxi|}|}ݮ83 *0W=bdf.7^l c.RN> ]4mjcSujz..6%VQLWQ(4퇏1G?k+ R\8aœvȌ^MqI9FK{ϛŋk4o?lJHM={ǭ^Qÿ -_hk{9oo[j۶.ut[je2Reiy(BVXY䥥%Z-߼PËE.spurdZvٲٳ.*)iӦAP..VVR 9uq++,,*2G:7^EEǓ/꫸e n/񗕥>\V۵[@Z]V^(tPVV8^ ++kJ&3K:'W]ZV&3j'ĭFO\?ڂ*ixq'Jej]o;YnMqqg--]]CB4ӥmۚNUeR(Oa(-MO߿/))+KmӫJ%n{+:^rbIGZϗ[P^]]=܄u922LIŜs:JνFAX j׿{߾Wg;s5˗/Zt~q:uxI7=>}%K~w>o{vX.RrϷGwL~K}r]hhXXj2ŷ޵w_nW=<MNj{v-߼PYH0P|ZwࠎW322ΤenV?t2}4dzקC Ҵ&9yٳ.q IDAT=(5:ub4ӏ~_it.ѝ:VƸ <ʎ_b=ejU4Nj.Bj;vddXZ6iZz$ W%\uK={[U*w~jWP(lmM N$8pT:i5..grCxx#Gqܧ,]:7~֭==n7Q\ڬy^QQ۷͘vYӧݺti$0M2SN\8_ũiӖ-uQFƍ{ŕ+kTR2/nS\tՇ#xX=&^om\Rrƍ˙}g~xyyիCjR~QPxk:t>-Z<[nj֜Z^ܹz=={N^n&F^ۖ.Y>߿QHKKT4ãe7ý}s͛{8kgw86QTGZx)<fɒի>q"#…JoVzyjxĤb[KFGGW:ӵkz{0 m9s_~RY 2Q5dϏ?8qJOW_^]||)) N8~{iRS6lعر\mgp`&ݻ{>&&,YxјrԩS]4-`^i1c7W&S"" 1cƍ9Q2VckV Glsn毿xڂ~~EG۩t17-ԩlkk+i:]zF|_|yyA;9ή̙5kW3{ԓ'77;tX<+&Sޕ;8"]]bhrc7XjYg)'ץ[_?A?oڴ8>7gkP]o6N Ovm>Fzﹱݬjqmj8#H0FCO[lct_K&aa ^+-[*팏O^N5C{ꄇyz~ͻnW<ԢŰa FӾ#Fw8Ckm.^0aw wedFGTfabc+/Z5//L/'Sk8im8: tԓjkٴ+d>t^ү_&^.wph߾qgd A\~[\uq++,,*2!ICzzw&kִx}V'm t B(R^V+;8ۨoSo8ʕ+:Jboom}JgWg'ѼQBy'%}7~SyeįVƌ6cT"aAA~~acJ.]XPxM‚¢bh^>^^cϵh{ӧxv(˥@ewB.Zјzbǎd[QkWSSk3i]"nTVzrǶ]rrkժ]^喖v*s.#=;[MP/7+~Mܹ2FP~6zjQRl0[Pxk:t3܃lڈEZ:tSBk FDx(^=( %1aЋSEtz |]gy1IDG(1mH#/=ޑFcZ)S>jeVֵ5EDJkkWWw~kjݥ[LLxb^={y&\akֻװaQJ!(_8޽?9{'LׯfMO" xBNN>!5CjZ\Vݺ DDh~a?%&7mbo/9#s/gNbZ]Yz]5tFT^=rd+~ ,,&aaMLv.YަM.] I=t?#6vG[gcckߤI:=\T{ŋnʸe'z^k4Q͜w90}udk[Tt&m׮u֮i9uwQQ/+F"99ܙx Y3$SS-u R;D- '­F^.ٶ-=c&M--U* ]cߍ]gaAqVh ǏݲEU[c/L&!0;SJkCiIޥC7m\jN)"|Р6mUU*c{W,̬^wwyfM{q_rޔw1>~ѡۻc˫m!ÆZ Rj5)+{%Kte/r.UjU,;,^+!))bfڹ[Gg4{Ү{뇆ծ|0wnՇ7m:xpx]߿azn[ݗ޽ߗjm5+Wv{p@xOAx+(jK>vFxT.W̿Ʉ1/wK.7ޠӕio?-+^/\٧IQڶ>ͱݻx혵ԓGtޚ1ZmU^_^]6L&!b(?$>9YNrE%%hK~{{//LvXaaQ8"DMIJ ۷aCaD?^>d%W\ԓK7e̘KnrC7>G$*(-WGUP[X8Y[<(P*]\]d%%%Q(4 4ln֭Igz _Rrpbɓ1 + tOx/w ҵcG(6vիUO++VWJo׮'vO^`7-ʏJwR~8U{a4 0U6:C.ssנaVoޔ޽sSS5-| q[v- fǺݭy[rwxi۶eK7m:e5kVU(ٹ'L<.|dS[lݒ}Sv{}͚jykrgȆ JJs.+Lڱc{lذuۉ7Lu1޾wۡLܨQfM]\Ο_nZ?rUb▭}nvѡcōaoְQppa޽KYzRUAd[/ }{/n6,,K5]jʃ0 ,ʲ3Ƽ~kWy- ٳtiaLV;9yz֨Ѿ}pml}4E<7cP-[e~(PUAp? ռPtrڶ]QB +-](W̏lfoe33 QbN i{J+ѓʣLde)x/x)F-yi˄WJEO% 5J>!A^Dgn*KKFEO%  QHkEO {8-RFx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4 i@/^I#Fx$H4[}(:%T "ZvWm99 #BDg[})T"ݍBсB; ^2Xd ewC) %EV( #J/2O酢'ܟ;@l l&^I@^$h/1b!C^~yʔ+22 {U>%uo>yeizw~.'!OY|׮sq̏tѸF3yz1]BC'%pWNyڈ`4L2`8r$̥<#c {}CݺAA*ˬ,aEιZa? 񐧍/*js/].*u:A/sۻ'=ɩn}|Jk+7׺u-,s;vq#ڲ]V,_dӦO.,T*W  ˴wp-x8^J\\BBvN2aJ0ʢ|p异RmnbK+!LxnfFeۧUjU]۷wϞU'D2\nk[V_.\ءSG:}Zz|ӿX5:w߿K6;-[o^P`4zy}\PŭF.ٶ-=c&M--U* `&o=zŋrQ㰺UZYZZ*F0X]`n٢ߝYݛS1,sBtQ~\vvjխ_]\P/_hաBg?֮H̄#GvhYEhhXXx;>}Ʃ\N-kx!Nj%O;#<*+ d'SrsK.7,L{ }1#c}rr,==5Җ:}"Dntusq6wLvG eeN=ٳQ#wG*V*˿Y LM4Ku8mh^TuJթs9sRzɓN/F>(N1ٿ9(;{/o_K\]={V&wWyS,]j}ѶMvnB`J.]t%_Yn!n<r?<,r ʱ^}ԩS7矱\Zv?_<=]}q<>ZFL~m>!*BT( FQwBa~G#t){$%^Ve:o٩VhhkxMm\\rF:E7iu˷n0{̙ee۴]]|9%e;._6n\A $^}]T`_}?gŊ)ӝ8oaaUn]/BCCkZI֭Zvqm!!}yshWeKVJعnoe29{{׬٤i={YZ-Xmwm׃<<8Bl!܋B5o&mz۶ >J( "-[z#/. i Z#/TBiE"uDVB - o22٨ewC[&HF(zexQ_BEnXZZ,-5F =20h1>pn^\?UNjI#Fx$H4 Z2_rPF "G<܅8Oy;On7!H-3AAgBU?8Oy;On7!|;QP:SRZKxѭ.68O8O8OΓ#M25I)DzP'9`e(_o_-jּZg87yfegeg>ȿ/a<< 2Yz\J.I< RE ZOF.:֭ٽoYc<_}eo \Tup``P0$%4T*k,C׮R7MM˵LQr?d2<`&Iq02oj^|1&z_Z[́;v@{Ab"-=B:pc2 *5%ehp8LҒ )8\X^}ThAs>Yn#[R O="j붿}CiHy-~ 7Nowcsccqq%TT_=<0twDM)-'NDϘ\E@pJkTZZPTryWoWgg/10ʪή~mvly|dFNkzX娘14PRG5lH.=qGpD5*ՌeƖJZZ`P5808`a"T EEE)V\Jah3-,|}}|}#"#^}տ¹`B>%sXߏa-r9áJK{;z|nnOO8U/ܴȑr".n͛cc-ƞBQ~wlm]7F-01!N&sqE}Gd*ːŲ12T==Z0( 'ɔ W^UR\]J :]O=0(4,"bl{;&Yz|%(^i]H$ˊ\hAA|'j褊9NWXS[VH cbU=cqi;w>]Z$[o'$/N{#Ty.4 ꏂX*%Sp8ut^)G,w֬y?edZjKsH+,\o%&я꿱[^JO曯&_GPp 6nHH30 N1Ճ.;VNBB` D./}sO:ba;O>im5{B͛'~޻њZ+z~UP)r6^a׿qMZ8ASZx9sּ&QKJ*\]M]  b{?3էj ǒcyIK?xp ]"8œFSZ1 wqRYs0|/gY=/S()Wn`ܤ=6;??/Q)GG7''oQΨfff' S?y1^Yycogˣqq55n tuڳqKDԺD*OKBikf~ށ-a2ƿRmFHbE@X60v "W^~#<04::# 辪1Zۮ];7)JYk׮}9*cI&^}XɠIk|n~ǂkiɇr֠`pSww a߯ўvHrleN'$Q=m.A>ʝZE`Qѱc{$vٲ?6H?cL)$ޞ#=$0~a-jdғ\\Zvٳ 9;qMb⽏D&-* ,,D[q&*HMZ▖)ׯgfԴuwd$]`…K<= G݌\1}#/ZԬ쬊!9njh?3(6vhC⸜^/y)ɋI["!lGٳį\no7dHљ{ɟ_/.oho(/*ꩧbc}}YG4ut"~;7oAไ_WUE׮}Unh}GJJݴ_+ ëhGEWV bϏm=dڮJx`zyEEE#g)<ݷr[d嫞OHX͍H:w߻?Ѳ27x$c` CC[S34tJAu58mN85w=[^ZY߷bertf$94%GͿhT-‰>*1͔I6@ hF'GU_:K8%mvwLHpll,-.My2iSK;.N_!!&,64j7_{-kOcckkk[ 㩩 kR㍌榊ʊO&{noihT 5C54^QQSTZ ^pիo7t_x-{:qԩ:&ogML\f~hߤߗku_%ٕg?ݓ*Z[ϙz /<…A4W)Ys=+Zx.'?XS˯Z"<=ZR"=wM-%dm!UT$ڼ%3sHO_2 en.AA9yA)d%?nח_q;t==?J#Ϥek#*_tuGGFƦ*#?g^ZKX&VdҎ?ʕ \]CiL}[b 8뀀,3 jj\]]]4FU*5)/Dg*LQ~&,n0"QR*EB7|(T*Nݨ4Izc9:* $FFڌ+Hɐ #(13A&t:jnD&{Z5RDQ(Z r;:Rm@cc9p 5:C"Hc7z(*WϝRuuu0L$~ H$vLP]@W<= ­[ޛmiakJ_W 3^xq"TΎJݲСܜނ拭+ Ϝ>s0vѦw1FϞIJllZe3`okGࡤ7cKH6BTdD"n|Q"Q*+DdO/[\R)ѱy^~A"tuW<|&1Ftg*GT\nGlj+7T׌l5df^XP\3j;sⰑF˙A#57V7&mÙlxEȲR.Npt05.NoŹtp`;z(T(8VHPZ{{ҁUH0 E&5;?0 -uu /]** tr2f~$F& :I6W K%Gѵi":8hm&qIׯwG'}}.\HJ.'_rʕ -4F͔+I DT>@㻺EFDFw~&jd2 }k/T?@p[hiZN 8H D#+R& `_mƒjjjrs-*Iǐx K6[K>86}xȞ^H<8(D>'ru RizD_2oު|PkkcX6R=<D>]^ֹs.\(MܼNR$jo?yr׮;:U$@ eA !X@oG0xf3fXY%]r[[+8;;K$eeytV}[ıL}.OM  sv46**j 21A@P #Ѭ>\3yf"O|Pýٷ)˄BưƆB13\7adכ(љΛjs|}N){ݺK]hƓȪ;;?䓏x7p%%J:n'*/'_N.+MJNJ R-rmccVUn߶}XRFw R64T7>44UVWVR]܍֮!u)$<@$ A%d2DWGN{\Ē4$' 2!Q/opt@F3g.(TV~񮝧N}󫢣ɤRMMQ/+DT@(Fd^qOs.]e 0ʆF.72 _͛ѠoU*~ߍ;|'5/B燅8=Dj`p@Q(,.tSW50o@sI kjdClv__/v~2qxyXo o>xQQ/68A 7_?^E$z ńO-3s72$T.(#XGʬ>_Gvس5 _}w߱׭Y,ǟX>8>>1OP(2L*רHaj7n߼iau֭EE<~|׾RpQ __[_DIɶm=zwt\^*igY .IDAT;bBk|eחv]#.ZԼPC#}}}=] ~Νu{_1n}dL.>͛ٳ55#S11hgUUgge)_30D qΜ;;oKEhqJE!/)-)13PQC LIIItfl ]O9)-k<<-5ΊcfjhCjxxg E[r8, xaJsrДY RBT4ڬ@6ΰ6Ӈ 8q,'/ /e2I$;_ǪDoT"Q[{?S.IN4עE 'NT}p$-=?[_? 0Ea|͛))U 7od2pB.p Ξ=vf+*:ṸE.._<}}$̪J@֎mG&k3h$ʻ~ʕ^S9s-횇Y{q0JfhȬY,Vk[WsYUBX,=on {x==[{mV^nׯxD|~cciYvvr?KڌOLk%`uujJffKݍFLQ̜8C7^i0467 G'4L6888P_GuL]NV'NL>U#HUklؿo{q7151В2 pdg䬯U\YZk H(jko姤$_,+0gWg336##7nC MM%%׮9\ZU*l?H//4#WsY!!L&oLKayxAP::F, IK(.hk:됼_W[TJ98XZiM͌Mdk23*+ EG TZ)RY~r,3d"Mhxa2NLk)'o0{]ݙ3&J5q8M7;WV&_L+66. ө‚.Ni44"%%7W$tuJS3 Egk}vl7Td,9WYy#57#DR',2"bsj-hGRP~ibC>lhlxcTHA$"N4v!e2%Ap T5kp^^ޒaT*eܼ<2ePpU+(<}:÷ֽ9Cڲ8+(ۇͦ `wWssUUQQNNff^^yy}}[@?glleeffhhahmMtWUfg`ŜC-,:;+ʇ½X# CSp{B,Gŋ:::<G#=u/ b2ιH@۬h{q`-h|V1f0xMKc#)v-i%x_z2Qo̱W#/40ZҴևxIRI4 yd-)6tHǯp?ŋ;/,ɮRi9:.[ƠńǕibclѥo?_MIFt(9woٱ}[Д8ǂHEGNupr G+\]5at)yx6Pwz8<\6L3{.xOn<2{d:c7硡5%Ih8'Q=WC j0F ̟f Yh8'QA܁fQ;_c5fA 8:N4#lG78'@&; LkP LkP LkPF68ngIENDB`gsequencer-3.1.3/docs/images/ags_midi_dialog.png0000644000175000017500000016106313607210263016605 00000000000000PNG  IHDRebzTXtRaw profile type exifxuS[ w]1`?m4s\4;Xsيai \(2ElK T?z(}9ڔa9E$:oe"RSrhK<">ڔVވR]Pooۊz0lC[heAQgX(hIݬ1 -nI*>ݣd~L] ($eW'pYIDQ`^չ6@FêJ( lZ[!#͒3 8&ńJg;j?7gi D'qx ?Ҷ۠ezTXtRaw profile type iptcx=10 '4EsG-_캟8ZM9`+,6)#Ӝ"\HEKiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ^6 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\S 2 A@AeFŁ:j]RuHmmQVq02 2aJ$ ?9yߜ9y ``oM?xjS@}jtOz]MT5FBM$B  <*ͽ_1.B0: :6;`ӟE UQir !_^@ S n`AR*[rs;(N`fZZ^E{zo܈OHjJmTB XX[`}{׏Mx>/x ~T\;d]Wd,}}c#KKNNSl9lmmr_']TXRdg;g*yD">#"Cz{;L*%JթNztJ~&ZZJ6ĄGw&R* \"U(yz/*R!|~{R6Tv"/??FΝNqPizVV3̱f9C"mm++S͞_^^_.*d,g'.G[7Ў¢?˹"mw WW55vtt:ck1{YV%cYB!꭫r%7C*%ffyΚ6m=Zdf10j?HL}e'{z\5s& "ի힋u81kK;F`{/D͍V[}Mv6vF+"!ϙneU]?t^c`ڬZH(#4f3T*#KK xM/6:KG &$PkUW4m)ة^u{Zs,}}Ask2)fꬮ28.xاCﭖY~EѧT(J%^(hkJoggUV`Au:sҨ@[==AhoU5Z(*˻Dp=\܌FS-5Mjºzkk?_3` idrw?|d;w+*ͮ^\CeeYVU^^~>X K}5k3aOd|~Hz{;;c]Mx'G{P6 Z[4"6g!7TD"镈xMGLJ%@R(H*Z?G*L&H Q65TTl؇ vs@=QT>gc[V.SПݮ-OO];tMրQEQ"3t)W×ѓ0{zq6MkQ.g7ʲ2Z=}C>e ,S劇ݎ;1#ßQPRRQ݅}JZXٙݽmߘbX4 YCu,V5m,f :_!;:%ew~D=]+eGUttm&ٲ$M[Eƚ׾^"f[^[E[{K滧NG>x5s4O2pO+9&e!S=y {Lzy͙ce%& 8&DլLv0/{Bab1# Ff&<ͨ HW(ꂂF>d5UY jk[Zhm+TWMCO3D:;;vaaOd2JX9S,~<[˥chdhddZ[;;Ϙn7T*gұ4 ]z:6'''#{'DoTJ1yv ] žPaVX yol䷶vuddg, s"G$z/nxhlm.ذ&;;RIImm{T($ii陙[XiT,&M1f\pABq>=;z%^Uia/`3온TшD;w#Y@јLK[* .}e2:Obৃ.5/w 0ĺQ#95֦Ѱg!H$"ݔc {U#֬j֢52MjiiǚFU4vӠ yEP{F"XzzTVX{5v5=1C:{h#CV7s`ϐ V==KGDzzz;: ,a8 OF&6AzqN/`h'^ H/ Op߈ğ;dl|!AzDc t02Opq&ܦ&+!2H/K?bl)iitut hf,lKח"p.o=ygK o::kjb<&--RA4&M}o /O ^ H/ 5L_~aL;:G:\;џ}o ѯs[>Gџ8p@Gߣ*-mtAQf\ܿܺu͚ <<-۴iǎ؜ܖ5] AU͑\PCH&bqHn߿aUxSق[?w-2#9/6nXsr| {Bo$.|x"uE8~{ݶuUMAAtsϭYs???sT[^wi^0drQ?w|kKϘޟXh aKf!**޼ I4Lf'CoOEQښ̂7 J.˵Z4ۇɬp!!>5M"Rنs.\xI lN䔯 sW6Sl^J悂3O^xzm@$"X, sgg"(]7n>Z\TUohkID=&cc=[u+V[Yj48 =w9ƍvJ32p_4$ё6řssKVU76uuI$D"Cmfhh⠠iY$p870hrcvM yR෷b<ǶRhn)(H?}2#ڵ^2jƌE¦O74w}uuz403]gyo~ E_cb(?Dg_Е+;'&:gwyLZJYXxxaC Ig{:w>I SڽlRWpaatD"hQ})%9;G(DQ6{PfeqqMM<\dhGg}}mL" oTVTq|܀y!!+V̛G"uwWVf\LJJIH~{`і***,ϐٳYL*U謪IMII=x0S8:yyq'Nvm10DzǶLoHMn]i2ɌaᑑkrB{d'$>Hz瞛H&&Ldz\.=\RH ٦f\.PJyH*-k6dtpW&`3lߚ5k_w03ǡM;?>qB.~}F\5i' 򯕴w̙EĴԆ6;<|_ dowT'g6[W[;Gўޒ n뇅m۾imp6FF~~oڴ`XP(;?>|8?10Є́ U6op?;(((,,-6RXvKa-eRHInlX-_K+O~<2! `,!UjD P(TCbqD_a Xc:d75Ap9:1"ptB$x`zd57r+YFdžD"B!IcmFD.~B*c6"s#8 rX,ULTG3gP--6DŽgB%BK W ##.*endvH"IU6h"ӭ"ql~2nD=GhQK<4YG/4wm ޷38DG߻7rAa[۫߿՞%8~+ OTL6q|Kٙ5^]rR1*!8gj34Bњ斉$D^|<2)$d/Sm,&]B!yIJXYN1 MM95}|!lCC#":(ѼC{^ﭫbqy?:xL(Z[{Hpr♌tu3g>ݔ-75fe)8i(s~oKO=w EXXP!,wv46TUig0<ܽY0p_k!^57on16~{ɓryKg6E߭5RsPI@zJePQS7D U]Mj16AddfiMrsCz\=}شelQȌgzjIjefM灱0ըAbNOm?l<^$'&MEbp^ @zH/B;џ}oGL_~aL;:Q?i`CQf\ܿܺu͚ <<-۴iǎ؜ܖ 0ҋ}PU!+԰=M{T^~⅋W46d>@Mi'(߿Æի3 Fѻ.[6eJGGr_lܰvvwC 0ko$.|x"+yygΜ>%D-9Ņ!}y곰Px)|?o_71Y۶ќ)"ƒ\][~~稨ǷjgI{`lE=ܹS'J//_?czb ۆ/=@HJH:{&&{}|~qqffܒUՍmm]] 56r8(h4}ԿTOooD՟~aLW2yzq.|uL̹dc 11V:8IqrAsAA™'/^~@ , Iw)ArW_}Ef+?p)6w3jNIIrϗ\ilT* !!ӧji$d(*ꩩ;x.);&J$dr؎!_Xu\Wgz͗ѿ7H$'_fT(=ښ('bbv/Xյ̙‚[U--(fR IDAT$سaF5[ (ʘ][Y&.˵Z4ۇɬp!!>5M"Rنs.\xI Ǐ ثX8QZzGKK_w]ggbBe#MND`]/-.*/)mm_{}t]ݡz7ɜ:|kee-&B U,klTffd4+an?9b6gNy|} ΊsgoܸmSҨwOcYv(u N>47$dŊ@2bRRJjllDb[pkTVWnUO>'ZY O:Y[fI ?I l6\ZNT0kJkd2+ L2uKu 8TDd9&\.NDZEV K/yzHaߚ5k_65 ?`kw`CдsJ;$cibha͑fw?qttr27"}}BJJ^^Pݴfl>8Jk׮[m(>_Th5354)!= k>N,%"ii=|N P(TCbqD{V[KK< XX(ÈLVS]~J.il4%) 8TZ]uZ.dDTͿ;URrʭFBdm9 Q\E/$$;%x{Θ6܌$ǹpV2&KN r8t:WY+kp`3Ns8U:UTD#hGrH"E$<̚efv!!N&R}5cYѣD!s\*;uͯ(V(m-(*VX"k.vR)JR)R4*bz b=Ez!^ɹTTPVZYYom`͈BNǣI(*U9:CGJE:r"ѡP^'d곘z*{fa7覧OJx$)>>!>>G;=xσʌ@$x8Kk?xR:aIգvF"m*Ƚ1|H.hCC"QhlolFjdQ*dr1112" ߐ={Χ#YAAY,&KPg[U*'s-w::5S4XAZk>UR!uwtD: WBbiYs lC ::8޽y ^}xjIaAE%4Gmm&i*5% o4 N63ct HD:H4MOCds k޾q~PT.+Q TWggeeS*ɻ\X̠98p9:Dby&SΙhɪLʆzABM9Th'Ó2cW݂&AhЍl+EF-Tseqjia5OzlCC#":(ѼC{^ﭴbqy?:xL5ѝ%^|1>~ݺo/~ϟrxr+Z d0-^hTQ-D>J ~U<^[Zb!#͝wXoァJ*!2r+ԟ.)l JIIWfiTnl`xDBܔ_([k%KɔcDzFz֬skoO%\JKלJ544mٲnß@QB.gf:.xN? xp~W/jm9vܹߎUXHp9?k#uR=tZM@:5 g8:J$%WSSȐJi4c# 'UFGD:,; jo-WG/_V* {{O/gsg ȺCbw@b?ErHbٹ۱_{m ឰ7MJݻnVG;#}X}2Qڵ#;:"_#C=#75DfmSj&xO5Z&72e@bx!ɕɆS"32_~yʈ3]\_fsQ; P]۷^<}g@E/qzW|ڈ X\6pʎܱw:͜9ԼMMeˢEչ.Ys Y~-CG|Kk+o? llDͷ-9^|7LLV~wZZz6СkV=矷$&R5Wb2yދٹ(* MM~{k{.YG1J{ߎ燚76~f'NnbB&4,4E")|So#tuDoP/#_=_ykժ7^^ qq Gرp.6Ģ͝kc MMA^ՅZ  ieimc`@ U6dřssKVU76uuI$D"Cmfhh⠠iY$RR=~cW醍3]V>q7_ĜK6fojG*4$9}ko "bY;;tp׵R)$|_df/bs7ە$'9}|՚N`YZ8;[2}'7$Ɵ>qZMmsso/l``e5cFPТaaӧq"O-Yn̮x!?M>]"Ҍlm</ qtd1꣉pz{-2fde.˵Z4ۇɬp!!>5MT /^okàc?*V"Xϴ*5RvYY]}{LFٶ6nKns,Wƣ$&A~~ޮkn׷pqbٙwh+3Ca0LM-,4'}RDp6O%ёCB7,剥gΤ ~VpcdrYTQQUDfy̞bRJeGgUUnNjJJ?@FGpE&'ٵ{٤.KK+tD|4RJrvPloHMv]I]VAQQAAڽ} RR˚Eomݲߟ~Xe֬;:Re3##׮Ŗko/+;>!Dһ?4G?FNa^^܉ӧXH"uuUVf\LJJIH~{`nLDd4%?u21W%4t@udmM_ "0yd)kjty.;/!%%//(nZ3eG+5%%56r8RT6>ꖵ͋kyݱIP`tDݼG 6mz^< 9 {/jki9&</) {za="Tߨ˭##gy $FD B&Fx/JnUU6S,qw7пb\rQP8;YOlndvH"IXCn4 Z[M/oGp2X8\eHNDdK%ptTŚ،K*T{ۋ1zAD@."є9g,3Ӵ 5Uuu29"hcG҃JZYhK BQWw_+X}}}ׯ߿au}'"_׽{ʒ%_ރ|mds'TZZz)'RQAYiee58 9 o8X"Tx:CGJ{UB>1NHdtt!2e2YL={{t<ؘnL.9I'ksTʈC xOtdF޳APyD?XZPJD'U8"M^j"\K 'ʕ]37}՟n` Jecc}kwkď>Z^͛*0` ?6oa^3o:9I{Pҿݽgt0#"g,]BQXg% U*Gr'".x\q;c9)#YKuuJ*dN[D첳iYs ΃`{[m[HxCZDq\Ì<( 8Ɇ =c1ܲ hT_?u|kfo1?+P(nV^RzC&p/su51O~y\\~ퟟ_-~Eׂ*5: o4 N63ct HDH4MDT(ZZ㏇9N6<.});3vġ\.W(#l P TWggeeS*ɻ\X̠98p9LT봲b rsjnK$Z> 63p ݂&AhЍJ"~~W4cYvJMK +5SN/SS}RihiQzBRbv\6esA66 ,H_߼}{ 7w+kC2Y.hl`x{yjkf#3F_"ՒcCu)/_>{6\s)/,lJ!ȎeqZfƾ}R6T]vVkL2$T)UV_)," $Nww^W~啭[?vtW^<ڵF2vppV-7x344>a[]/zu]󫣢|:rJoO?ᇣtvm>c7q#BJ/p4ҨuF"OTv*j6--;~R4'U*!2r+ԟ.)l JIIWiTnl`xDBܔ_(k%KɔcDzFz׬skoO%\JKלJ544mٲn%}D PV })\R™~IRl..cm?2^o xCÙIԔc22Riժnnl㡒,; joږ ǫJ-˗ ٹf6O\^rm߾M֯;vmm`ǫKN W=xOsLKkz{[~m uDgXWА) IDAT>"4A| $kbbvY;EScY|dk׎?舘^b xA4&-5gm럪WKF&6;xڊjJ`2G} 7edŕ\,-9l&DHZ33rsqʙ/6^ {2'QY99--BRmhMؼ|&+ T",,.;1L6yy.[/O(]d`ҰIESh6V3by J5_y45 UbLn~ q6mzt 2Y{Hvby&`5H,-PT<0iFZh/T ^ @zK/3_~11CQ(kN|qtg%$ʱ<{04o˭[׬Y#0pٲMv숍miQ( N)M/W|)rBm7~= 뼗Rz.^$== 09N][Hn߿aUxSق[?w-2#9/6nXsr[3,`|I&O]{1;E>뼗\;s)$j̙..\ 3rO>L_[kQ*?^nb~#bms9D=f͑QQǏoyΎ@聧Ӕ\ϝ;u2?_Z3'`mXҺs7omq|=Ekk2 o7tv* .ka(o&…Ԣ6Jeϙp%6 :?* )_}l˧́rAsAA™'/^~@ , Iw=l6RR⹤z~[P(4a;:~arrYjW_g5_G7S:;.mzw""x&xHw}uuE&s,;;ׯaHLA#L/.Q~.ξ*+WwKOL8uj4*FÆeeӓ ^}u}ëL^ONٳkI]]+VFiE-Yb~PdolVook[cA:xڊ;7 2y͛-wNTSK`v***,ϐٳYL*U謪IMII=x0SKee԰|.M366R ,,G6qe*U{%#Gl 7o^T/YQulbm_bTnM˲GSwii>>~!!+VH]]RRccc ޺58؄۟bHeugVsB{ԩ5}}lvp0~Bhnnodx<]lK"*6lx= 7HJmtj~|,[96U5?5k־tU9mjr Usv>!>>G;.^ɹTTPVZYYom`BN>tL'ر+S_T=f$)ؖbMQ{o1АHT(]/t;w&D k〣]k,!5-5DFtP@z/{\*(R؝yv͛7s XLy1sj?ãPNG[GpW5yC(O?ں䨨w:U[nݶq˰{lںGF,}|88d)8~4u>xub{ڼC"8H|} L2ԩS)i魭jj=e礧 Χk""@z1ַ,@EUNS@*V<lq8.;,V\g;%J\^]]uMc7 >T6{Z{ut` i[AA|퍸v-9WTѱ14 mj& xbW/@;rn^2Y[eK⣏D 1 a8ʹu3t#E[ko45{f^.ttڹ/gKIC0 !Hc:(@=g?8/xMXEElBK`˭ F 44Rd,ln*, IJBL?Yfo/BaT_㉈hZN̴WW SVW;g?xNH$D^೵6֠u p{^@BQ$8>84<*0:-k(TS k©N@2! nE ` LFAF o~8}NdX-Hv)+i5{90y$ (5apHLBSuN00/0/9*)ػԎ ."?mٲppm7<Ʈ`z @Pooa[~;k݉IlhW2q|ݚ5̜iffddn4kֲe;wOFf[;ڽ W.[3lX.:0頠g=c, $Rx|owŋ7| w{0R} vmٳ55Dņ }g !hށDvv6446Хή.lj!} )%AAQ|^T  8v}9ϗVVǥuvx 66ͷ)%USapPddFzIIMMK+I$Reutlfϙ3I..B#

l8Miiy(/&UU tz<ǂijNK{tNllnnEeSS?/#nb?XV}Z2](G(05/v~I&{<,| &Rޖ̸GII9e]]L&#.!'nn7M__<$:Y@S*/LxIuM{;-&Fj-̽wu;LE1Y =ϯnjᤥUUf:hiwv>NIP>[>>4E0 H_sdLDDRDYr s/z[X0#=FUUo'Gu0CKWoj;:\jkύy|{DIUu''4ɓAϞ ul/DٜcG RSsrrw#//11& qBDĞR'[y6.2ıG"L/o?ht{;1/=Ӄ~% iٓx=3<<>*)}ys̖6ovwWTzAvRlv}CQQY RV1,E$xeeI.;Dnڼe yT=II} e|40>>,'[}8wl)MXаV QWݽ{b`Juw C.)ݰhhDJH~]99ۿ9sfrO︸Y>+W̟N//u+ٙ:}I˻<<}dū^3 ˝f˖-_|LGWY54myUdx]] {ܾa;ffslZZzZMMMu\ut\~~*ÿa0 TTpGÈ7w]]G1{_,Wkzyyom_ON><^SyR '~i8^:qsݲi󋋷~uZaC A(gm4FF y a'?ZD+ˋ!%%BwALL^^^AL(*xd+ 8u ??+k9sf!x v+rg<)-eDbμ/*4446/Ɩ / O&%ïw_/tL{^cKiq8"MDdO b`hֶVVJQ*ʪDaWҋZՠON8\nuۻv2EΜ]Qf` /̙՟\yDwݷ/\pra3ԩ.]:}zڹs[ԅ7o=a,[sB{Q1h 4 2{((8} ta9;nv'pI\|-Pw<ͯ7zMuKX- iOKJk[Za`e_u(lֈCxAKqNjo5]?+_ݓv?׶mxw~;phNƖ-~q~رh$vup"KRd q.7=̩ܛ×/++.Ǎ_c;\zB"Vootlsn> .$;+͒WXTQMxy~ͧݼ/ٙyyd`@mn*tUY8. pyI$LCҒ+vSU(]CY*G%0$EeAݍ -x-YY8ҳs;uB+ի8Qiɓ6w=P())̄ AuɱY]bWW77x$,EL {1鹢4*>̙'c= ,YZ AE|Dt'Np^^nn2xٰ3(x떣GVXtc+}Uwܵ_mtLm`j-ZID]7m^^FI^OI q1ky_?g}7mٶM|ѣ7E DII*>CDݩݔD427~[FGݸB955##G?;[ׇy*3ddGF\bHrUUŋ7o17ʍl2NN2qZr2+.ciimchXWfYw''[֑uظ秥Ka߃E/K)6.00'PSАJX&0..$$) 33d8 yxg qAA==<,~}@L{uVW;g?xNH$D^೵6֠uG.Ip*E0/CSLS,{ N5p/z$BH.E80. -pO CN@@ /gQI .s$/T K-]w@{ЃS`^ '+B8P8\8= 9`X`,^19U S ^x/ 0/!,VI,,ϿBJ7W޻"s-_}Mzۥ4p%%^ X[JJʗx==IIQQI9%5݃h4$))-MSS׷vvqsk?/u쌍=thǎ+W\o箝;}}_%<^Uu~ط78~8, ޥS#..#CUQwp5N]M\|d~/% * ++g'rrx֜j<<ݱ{yjqU_v]T^jj冃Xah wHnijnzObEF޻ )SS56rr3k A}qqoҥ<eC"1#6ma!33?}YVVWۋ(}}}f5$$FӨW+xl*k0ڋ뭮dcǾ~|E_߿l7NIWw:{vW[YHQjje[RZUсi[yuu|yO\G7ajӑ{oKo8~DpPE%emmahb(G@"::[ZkjKKJZ[x5̔R11>  cœ 14?O]ݔQh+f1{[+Ң\rwXHGgX08TP/VfB7{oor KMFCkv؋H2axx~ ACz9'O: AݙYWSOHK;:z{/X!+FwwWUGE_:6:9Qx6nJG{jʵ.%'KH鉊xu]tf^,B=5cΎ۶mWSHiS]c6E"ɉ # ss.''7'+bǘ*23s::UUÇ~-0EANL0.."⿛m7 hHbOwykim߾wۜћXş;wxhhw~@,)Nu홙)Ujo?šFo/EJI)ѴuutuF̰,,LLOs"3||g<=C.[~{O>z܅ 47ovv>cr P($?'7,Ql},mYaaq--hWyi+V|BKN,=0/&'98̞$!Dc\W6AoiIB"Q(iOxSSKK33"gDF>yj1ҎݧV@DD_BO,ptuF˭jo'K5ӹ7ݿںaܹC Dҁy#&|^7 9xb,{A@^^p{bbNW**+=ܽJ q##S--X[=MBoӋߊlNsKC}k*9Pzz~W=EGo]ZV֐?L*(44= {VCp bBss%$mTUјts,C<,$BCӳQ`ԃ*)}q]LGCP/ʅ4:Nl3SҮ`99Yk/[SF&(Pӡ߂7?51tt\Tnt]WR[u?=:oߥs}.娕qiŵu>?ƪUPFFffֵb1Rth {[.fwtFD^|fbB~~uu[M$QZtk_yyH..(矝;+=]KkW42v"LfN˻w;!*yˎ~~pg1BN=Ǐ8|@}W5G>=ȴX|&mՄs-*NM<xB}Zy1?PTNLHLJOvrȩ(+ᩩ޻gaD5HAe)IYYrrfА=vMrsbS;);[;{-Mn|Zr"JJj[2|ԗUs|jgjK dex.:gj23s[ZaBYiȸj */G@>UII<ynUUu5lEE_1-8_4NS8A]w\P x>v2[nᐼFI CEl(7QQaD_-nA!XQY^';D.wp67'&ApB"Xt8ZX>DQ,ÁꄑH;ٰlBO$Eřnn FLkaaZpU\SS|%_0ywxčg͝[jSWBl|mmJʽ'&뫭-#r jlJL+*K,,ddƒ[[uCQѭ-H$hfJS]SYڱ?Yu#'翛3֐N$YY+V?m::IffNNNv]pD2edLL>1S=慄* &sE@($<#y-lBao3øIxmm8=,_8xi2qH<܅  0Wz{+^h^ ‚2G]zHg!x vqy'lI~~^}GPVB <)x287{ xd^nAAwy9\6c\`ADy,x<CPowwOp˗F3.jk46qT5Y^Q\R\2=p2d/113#;Yg_p2oYCoPmp8eegk:g>c*"3lD$&RcJ+.nfakr`ddLtEܹdrjjxXr kia$55GpH@ظ?Е? ?qbυ^^?߸חA 6NEy||BBM-eXkb"]/h{=:ۯGI~RbD8=N8PQd7߬_gg'+#ԥ,yv_~K꾺/H53ggrssao<lnilLX,A!<$ RA3a8þid x,^ɼxg?_h o!4fPb⢢ǙOUğvaN྽۶ caWxL-`ffnqNV5v_^Tlex6=']Sl*X"9{*;+'6쬆 6.Ɗ0* D!y֖8R:ZUwO{{gFKIV|͓b O7'ﱘ"b>8,ǣPNG[Ggw7\Amz#A!~l1 HYS3s аG15d)M+))SYh/{hޞ IU6!1!eϗ'cATML %%c緶YYOT-5spXMMCC4rd-MO/]m"awI[P?秦EEk[Y /2==3]Fu;wΝtPM;><|n߆=-N..2CO M.Ƴ|=<|v3t,Ф\,{QT{GZZRbq1 Mϝ+0|2ʴ5X>rezjÅhoߺikSUڗj0e0rssZZ !DvF}#blcyXCi8@STQC CK=ẓJikwvvq""kg?!.Cco̰+OOEW]f{JJCB/_ qaF4 Ef<<&kOV/tC'%޹30`ofB((|gqz6[UE߅ioomk..N|fRRc …V/X(l RW]]Y`&E$IOUi'xk*㴴L왬GbAz⏇GkߩpJ^>$44((:*oذwނ) `c⬯8Ր3/^3tte 60񱱡)ziǹ8{Ѭ鐨@%%= bhY/~2l`hj7nlz$;q'01b:d`󷳣a8جޞ֖Ĥ*lҵ{{b}dll,BCy76aOk׳ZcKT98uZŋ?ZZg`0LVk[iiRbTd\l_l?77=&$$< V01-] 'NaFj2d)QQ4zp*;;>.6.7X݃!:x_dJ>yr=W8:nظ~p35vnD 8&DB$|XW/Gqw߰yl/Ř>;޹ 9)"))$.am3oyxܳH^C}-۶)B?zfZڝ;'T*|||ΰ0zznQVrq16{@,--۲D{7<<%[yL&+**#M #؜Ҿ(e%SScC29*22H`=oJ50rsrJKuMtIěbrT9)) *'NY+˷oWV11HNO KJ o`$%eei4--CssY$.)IO鑐0162RUtǕo_QD+NNNٚ"jd/hssApPpnqdž"$2 ?7' (yEE%%gի,30LWXߨʄ&{xY@""ja))JKervOU}J㒓ZZ$%-c.Y{c?ŋԔԔ.&~,+?oͮnjb#6NQ_==18VjӹӤ/æMNc8&o鋉%%%'KHS뜽K't/7|dpPTTFzbBAQQEEu54/7xy٪<)/C4N@{hg ' >)$*>QVY?,X1={i |!;/BvnhknT_|84u  _/-n>pdOa ©NT$"dd N80.T^l\@2 PQ0/B v`^0/5# £e[' q 8Q$0}z̋88 '& '`^|.UHÙm0"` '`^|p (.[Oy6t孭Ogl$"IHݲ@^ 1ww IMJddQ+*kRa 6l34fɬoo۳kϞΤDE/ɭZjD‡O#|۩' f l6d;y¥n?Ecn!<4%ر[z鑣bbt ^Lt ň=֬qq!x)(鉊lvs[sSSH 0ɅEM;x!)YhX?xB/ ,We 2Yl6շ $Ç@+ vtt#===hkgkfgeeexpiyg?[ced%(fjjjfj^Q/> 4+ᅴ=w%K:;yN6FYD2(hnmklkooY`̟7rBPgglC;v\h~~;wKSDe1ҥmێ==P(')qزEE̓,0bl^p"g<5" Qѡ!TU77A<1199% WUxܰ_t150PRx:8lظmۂ:c>艼7ۿٞu#3sY[S[Buuvufei"MkHkֶV,qP(_xʤȨȤĜ⒚A4Dʩ[Y;5OsKŤȨ AXlKJZGWlbԈDkwӆkMMO9!#33%TLL@CCfFff}5t~d{%4#s'76-[\]~矁wFsH¡?{qx$f US==ʕÇΟKHRLgpt)#Buv֕d'';8.3sǛ^mgKb0s'O޳-65ǟ={DxdOe_3ov/Ll...ǎ;VPP/#C.!06hC'>=遷hj^ڿ/3{{K8~DpPE%emmahb(G@"::[ZkjKKJZ[x%`^&<0p8}}7ݻ~㼹vUV $'4ee66dwC@lg .jE{{ffjJE>Ϝp>3#+Kop;JSsGG/{ofiiYYhXŋ|͛}HoZ[^tBWuŋI<ۿ `WYXٹڇ=s>D}k_ýOWKJ)Y[,_am%M4WAm붭nnwl߁@Tښڙ3W}j5 YVRV {y<MY<^YIYE-܉㡡=;[֖H$pvBx7nVz?П3DDA(TQvvdԮBB^lii|RBh|--U[p`46yzSߞnz6^wfpwʥ%aaqqUmml ==uu$ćs̽Ooxa gοgg3_|wo@C{zz7ШZKZSmppJJuMHHZj]G̲#Ғ^^txRP]>. 'hks &HIiMMK5eKK33ss{{ml bb&&♙ii9%%L ?Z՝uډn֩m 닊[CTUk`͍ fYLaͻw=W^N^^Qaի_^&85%+FUQd55ii$<()oid2X I*ae3oj8vsGT򲘘Ă6HR6־ >20&cu܎'aၷCCJJjk[ZXII--{.uuk `XƦ{wo]^ׇS(tꗦ_k X=v$%uJ7k~IE}ǎ\ D m߫Wrr1gNE`H.!&UXX_bCD&mZ )ihhb y#"gdLuuYYY--cA .^F3X``EE=ہW}&s`ZVfҽ%%,ֳ&׷1`~ȑ{b ;;,fÒhizß[R?@Nx#{`-l FPH=q(xj Ԕhܙ͍Mcis:4ɋI$7׵V`>Щ25ܼEU@VVUUUǫ::x*>(LWw{[{[uUAa%u=FsKUyMI$HKWŪk((()rUf,Zr[obL"VV>}Dhhu Zvt%&޼XQ&.nfǫWZ5w|oHSO=}/?=~}'Μ9oʕ~>>V֪x8'؜ڰK%$-[+Vx{2q՜7o^ .]ٶZ[[Uظ,(Xs箄⒠ϛoBuq'ɩ_]xoa}/ΞXyxFI CEab('QQaD_-nr3Q( 峵6̝:ܽ@ddHHRЙ>{G#j1 %,p~A==Q\^C LϠ፣ ?U80 <P͇^)(%WD$b+H  K]h~66(*Ȉ99%;覎t[*V-**90Յ vhKH$pRv !]dvG 䜷R&WWrö\d5ŋظ`~s7曙e+|eeN:U_<}{}J2i7<<:V]%%O?^mۺuX7;"bQP@ ߷c7<>//5-,,9c|)b6x2tS7m:>33iq;M&2sŋJm4X,*Ul, "땖ALjl6T(:;]\.a6 Htg`jYiEEwƑ1-p8qbZZ[o53-5׷jL&Im20@jů57 E<>a2ᒂܼھhsӽzf;:߳E9LMJLJpC3tMHcq,3'6KKD"1JKAH55-0`r3N2}>/*usgs%ӣ\KLJ&dp[w4M9Q 諛;:pA񍑑$ϻXL/.˕h744[5VxI𽟹nS9.^~it׾'N|q.oӦ5kBauuu]]|ljIoFLRi!-^!&ّYUy>-lB!l2/-5ڝ`F&z'=ܽ`jئV7ԷZ,Q2QTߦUUyy%U-``D,f%`Scqx]Og6#AQň8800`ƍǏ-P^6L6n=|ĩڏ?޳w7JnI$.D2.^hjAo}ƿfi[33?ؾm@VY(j=<6`hbkøzu;v?F0.ILD7?###vWWA$ܞ?cG.'bΜ9<*>S ?L#H~l='ؑ^mpH@ C}/rzq, yٓODѢ '.H Eyy^^eŢ( }6_^Vh(?u\inY~SOwv~Og6yχc{IweTTiifm4 `{*USMuM@ˏ:rdxuM}\U5[O+}΀8_P##E""%"9%0 .ɘZ5m.bϞK1U/u`,&n/Q?>̉#1n);vXDWJ$!]u˖T9&ht^~ @f[ixkVx k#ittTOϮ#XR[rDN x.\8+@jD\RP0`X Ў}]=HwchLR^^hm#EA?;frD "!Ɖ2ҲRJ̙3'Xe(}9ѽ=]O^T\b4 Sxx?~Ӧŋv~[[V*%,Ư7L`>`(-=zﳲ@bQXxCFc(eYrJH04{$|)ɯ_.* G9rNnhMf}4/?>?7?fc!3: !(gN9+V4TZ>,,ʀ IDAT,jQV*ޑ2W({[11ix&Q3al"X#=ʒKDdjjzyA>\w6F"y)aA$pvUCaaqq׍'%%B,$Ujm 'SAu؇VҮEGFq8IGnݠZt:BBٿ 2=$6ݿi7df:J3٬\LT䖔tXqq~`Lnjkj 55UUmLBZtVE;{y2ŗ2CB7'XA\P ՚lV@ `nT2V@d6͕+/64r.ZlRR?Z/8\2NVZ}s$ ׻`2Mbb+"J)PҲGNlmQ5ooz{G wešP)|T/HdU7}P./.V1OO$44X.~~iPzzv`%Kk$3*/Pʋy "ѝlu b:$>?22*J qik..jnc2B ٜ͒ɢ\>yyW._pr~>^ A!&c' AYH?AIΟGA͙vPPjiyygO57'In+Vo1n[:ssc5}/rO]ml;h39v}?|o0d<}o΍_*2o.(a'3*,n*1ۦH<94:M[r?(DQ?̶Vcjftt[,[ۺ=ҋ/H\r5V@kw`=>X;P`j#Lƣ$oEPayNưCoM$ ί=8"c9;6oN\tCJeaAu"Z~dy/p P9,[QX48^"FΝ gπ~r !q[ZkP^W=Qۜ^8;_?y1c'w‚x05Af6օ}hx`F-g5HS^L\qPh@;!H1/CcHՌÉ{.4JyWA97DGl꽰;tƷ?t~4H  dʋ0ˋ{sPȠ'8Τp$k_2vc:L58  dʋt30VI7@@ @ (/ @@ @ (/ @&u/S@ 2s_`IENDB`gsequencer-3.1.3/docs/images/ags_audio_connection_input_bulk.png0000644000175000017500000015370713607210263022126 00000000000000PNG  IHDRҊdzTXtRaw profile type exifxuSmr )z=1f7F^^'eư|&#| ј&VE WLSQd$qP ljSsCSIP 贷˿M?iHMʭ `EXrAѦFR^m? `j66f1&w1,#\+_GG|UpAMfI7g`lvw(jVN j{0v9Oԇ$eWOV³+wo"/(|\ssxOoITz./R 3jfzTXtRaw profile type iptcx=A@'-K(gRM착 hC\̸W;=3s@<ˈ}S?[iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later  iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\w\$@H޲q**jZGmV}jZk .Tg K#*Z wor~ yІ-ڸZC\ІׂqŪ B7JUZb 35>}__## ;~b]03V@Y>>^z+R(U99YYrJK5K쐈J"Iؘb q  re =[ rJ|%E-K$8\T_'b0$":J),-CO==DT ڛkxO~Muѓc'LpqA#c5vJ,*.xıҽRH+^H ةC28܋̋Ƭֶ܄|^&p&f,3"yׯ57uuMNZZ֝f>X3ޝ;v!cƎq7i l G$ R.wiNF&!M ID]R*Kj!S7F(wv.G==}}ׁBoѤїy *F%а!Q+VNI=y7fD֒ҾTahygnǷUXJpKɓ|C*A]}UuQۗ/]ZR$h(Huq !n0~?35p9xmO\^]y7+#[4*L&tu)4vbjbij02ie9:}UPQ*;wGL;;k7ygtcfjckmC W<ΝkkO)}.QԂ<XNa}CUum]s3:P&#h&Cj:0^{or0P(>>ywFzScks ^^o@&T"agL愌1kxgg;۠ 6Z~KSA~-)"$4Ht-Ifczy*[{ϋZZrpO*)joEQ^5ibbdD"ͭrذ3ƌke)d}}K+[iƆSVVf02?חe>}!DkWeio4} &y ;сJ,ٜӓRV3G5kׯg)/EA%d€\U~~],=Z~S@ H&l_íxH(|_E  1ы߼yVnnUUC}szNghhiem2RھVFםedRy%f|~{P(K"P(k3{ھ I$6ݣ]PQQS"aT1?`D' AR sF >Xu4~@q8]JTe5a ,NQ$JQ(Dnz4(zX5H,F/(yJTޘ4F $v==ccCC ϕTс^"vOъLFJ+rxoeh4==*DBN%iBGGWRR(zz("Qk+:lpWn+uKA7tR)o + [p<+a -a -a ۨFD"uiיEC*{$ID"bJ j/[Z#FEFYѦ22D.@^5]uׅ]݉)u1K~尚m6wA _B mb톄BFT00tY<ĬIhh= OZ.]rhhAM,lƞgt+9t [-[^)mŷn]vƽ{umRy G @zNm D9VčMUU Bv"(^K/ee2YU* JP-_ap81Gx{s SXa l|Ww-~R %%55MM `h89L:wnx}w\ؔs. *6?ejt)sG_`X9}9۷ yfJc&N>32Ãa/2o7>==c.dWՉDd_di11ff=*3{{q_%Tuի-:t!}/޹s SO;u[^h_̞ǿK2qEVVII׮UU77;OBweVzs׮5k~_pw+VF"r؈iO`0j^&$x5II|ӧƍ5kBHTUޭ[˧M[9GnqocCã̝A \>s&!qϞ{p֮ྌyucWۓ2?wN]Z/\ۿ흝˗ot|OO lf:2xOᰇ}E|\1adzfhX,9R^b?!!ƍ?kvh(\Pp%ܹӧw[[Wظqݖkj*c  3FxDr{uB['Al}|ur2? b&LSCC۷+2V/rK$Ҩzz.)d ڇq7;>..|g~8azzx sz #3>.!˝yˊaff{{yyxXy gr/Pz֓ [lI,-.u#Ҳn݁ii5 uϘyꎎ;5v9sGuN4Z{ۆ'$FFgR ̔a0ڰ"1\ ˸*ffbObk0yxxy o.\HJ:| .暭_x} *AZ]b'b !hkm>\^V~/@*s d3dҲE3}#wX%+++.?ayG Z0H(D=s}W2y="I{p8 [[6nhCke^qiV#FXj^iqe|r޺?;0^hOR `{UZ"Q[k[THtM?Z,r9`ɽO3I F!hX,gyuP;aǎ>mCBW捾oz[LDvd2a뵄igi4KRA#hhwvvtEiBbI (t {^v E"1c``KjuFc!gi1i-7EEr^'tx/G@.hWd3U*; &[B'>Лu qXc# ݠĊŢ'P,V;;D/'"Zћ"jiemefRܺV_P(vNVڵ+)UO_&++^_O8 e56vꍲ򮮗_=CrbD&P>k||Eo>u''\luoKHhR3E N~oAϖLZ_yҒ12RU*A;R$6зwuc(?:昳z^M~^~>lhL&4WWWV ГMBhLyyMuEE}!’JEO-4*݀F|~b-!{z^~;S'O3ij,//*"'M aia 9ݻݵcTabNw3ne ED89A)a2FL s{vP(bb"ML(WZhh8r^+ql 99wL[ېQf,!LM,Lm}՝w=F4˫So9sl};̙NC322^=t1,- A{UUvVʕJ%axqu[蕡6&L2?T4!_sJah&Lgg77),khDًefid()Q\XWVv~zzmooi1tDq`%7h ǎ;wo@0005pu5Sw=B͜ɺ񸓩ɇJ$5k-`?0> Ôصk7n:wիNK;vRlzz a/X8{VSχΞ=|x4*Ղ;f̂kL&'gj:lظqRiNvRҡC)e2{u&N7g= z7iV;={RRr ѱ!I\Bdu7pٹ m#ѦUs ژ V; (m#g? ZY vb,[WoA^UY:)x1lцՂ'Ѱ^&kQЦ{dkC6V Ѕj-]?PTcɒ͛yh*Zzg"k\V~,Yqc\,Ջ.-`.* mǎMO &"isho~^~;hE' Q b ٳ O=sڴ?ZpMVVyKO8vRNvyE]HD&EFNkfF$]A~}bQD˗o*,񚛥2*rr 8qH1߽b1&33K7f46I>?:z&LEҺ;ǎ}&B13vw5*vjllp }*M*KK?q{**kk;;xȤp@/[?{T=zt1K׫ZtWbzZ̚5mϳ\Wcǿo%EtCS,]j¨!R_ ju֭#<^QFEE͙dSbѨU {ݓ\W(z".hDTԬY_d޼ho**1i=ILUR67˽li=z/Z8}z(3-_/ʥ}9LVKHS͙d'`2k40x^Bϖ'tY3rik| Z3g~ޗёyt|b"vڻ}>gN#^!'G{m}RS#Ǎ35_IJaaK-[>i{yqtP[Z֭;?--#ab0?6^^LhݺvU󢢬,lqIkfҥ&ccw//ooKKq];/]:{&=c̘>lhU):īf'NڴyƛwWחVm)/x^5["PS>Fk8L,?X&X8Pd2i2gaakfc uӠ"r-FV$ E!\ S) {R%q;6x$PWWV3r* W畖*N#FXO4P($egn0WK.kk{Z}Yx' \(-9vt+}ZCB>dN,׳OшИ{]##=^QaUuC IDAT@dd&uu)D<LebK.G@xP%Ag' }> o l=;$"uk.f=#H$ LFb[6n}{ |W#ؠI&D;=4D_Pƍ'SA4 ;*2ٌG$Yo$f.,VhkoitUgC^~#>=#lZp|-!lk,Ame]]4*UcSj,3*j`wGk+9i`@&hhzcHI!B~GQe5fc[ݿ 66Vڵ+)2ٓKR,6U*KK])6 :y\zZqqC#-[Pk+^?}Wssy AW`p8QQ7{a eb֭[6ǝ֝ \zѢC1g;W'w;u[^h_̞eĢ3e/߾UX57KeT0q cuO8vRNvyE]HD&EFNkfF$."$w0*ޢ? Av+(@]\X'tU68WG45Z| cA&zaħ˗lаؑz4s-TƔ+ݹԩN7q""f϶75# |~]410@d'pÇ">^Y}|i4,BfHTju֭#<5vlhxTԜ"”g$$ٳw~ڵQQ%jvj{r\ԩKr88\Ks~ qqs-ΟI)ʆ5ur9b,ӆq8’&htUU}CS3nk"K6I-x^t:ˌ51jNl Ԥgz=%c?-di+\8:R--؟^ÏXcjuGG;i~9#89;hm۟>n n/]].&L"Y #)TM4G$R)k[/ G\ K ^{ Bp--Xju{HF:ֆ R?ڧVp\ -* E"]beҲbccoOdRiS;gaakfcyy![[E")DD]]rmCoSTgK&è) Bځ{^zzfAo,l::>H|!{/]w"tq  3p,{v]y;(G E.okᕖ45}@_㖝kΝ{܂`$Ϛ3j4+:~**YgL@uZ V+dDrfJWttHX,dZXOj!#r Ξg޾=-J`5&99~Y4ki2r_9}f];cc+F6aE!9:L]v&ks q.]ᴴc:;1*ؘvpΡU\Ooпv'Ol'tƍ\ T +>3DƮhmVh:-xikՖ/w`O]5mLt~mp6+a -a VTڄZP ;ݱ;VV]+^E jnx(,VZߏmP]ofvh[ X-'LJ j` lG5[`P(j9}NORQV2Z `p15գalLboގ#o\bR5NoiJ_~3[Oɤp8 j_D][+(ۿJI uuLU{; mÈ`HM`>`d0,36N֯ ӻRQ "J2 `ӽeK$*T@5J -a *R)ơp圜R>_,7pu 1Ï>pto>u-JUp/ҥ| *2XǺ'V8U'75q3gs?WԞXu`YB5Eig Po8yT:sa>>\. PAkf62~!0ˋ!u #F͝Ӝ]Vz[<^sTFXN'N0FSj%lݺesܩj}CW^A @YxΕ+dQ2ThF ÖRYpwm>r؈iO`0j^EE]L"u弚ommGFΚ5!BOO$JKKNNJ~֭Ӧ]6% em[~رQQsN ۊ S.9g=8 kFEYpxSK~=|/劈 ?5ǗFb)dqo=$`pKK/RYIC/OX{REaa FNݬR}I׎!Ho'PP\ "kOp_R8106`Zz6J5bqNoWleC%};-tC(zv,BBRD&kmki>Z-Db N7w TT/?}~tƆ͟رl+| [BZZY[Te%nߞBwt e׮]I~2YYz:}7wGHhRUPë{b/91%-ڰm G'YZB&7b ?O޹oZ=y꘱&LScyyQQU=iRK fPPtȑ׮ޝ;ҘPwtKϜvC.]("'GCW:OtØA*;+rX/8s;wzRbfm(3&Vf ; ڏhd|ҥW?t=D⼼̞"b@xp/&q`%7h ǎ;wo@0005pu5S&C )mO?Xf'ǝLMMN>t(5U"PLM'DYlyXGA*mڴ+bt`v6C~GƆK$qq ,a/X8{VSχΞ=|x4*Ղ;f̂kL3::.ᧃyyb1:V@>95̟˯P7sFMYY %$ܸ*uU * ޔ2-{҃G~駃'6&m\6+a -Z -@7Pfnz ;)d4a b[[ fW)Wªy[S[+([>MN w|/4"&XY I<:}FHʀlj+,]K=2 0Ңa DjoGBE 0a x \ փZ57M`xfEV * lWiTEu/mmPa 7mZl Nuڒ l[ ]R!Z0 hAboUPW=[`QkA г Adg - lRYV~_0| ~:i۴-ۯ_߹sݺÇW*wٸih.g`lJU߲͋[>`%@2ffl9Ͷrq>|萑ff$5JOھ;bM Q*KK] ׯ߼yDAGIMۉIIiJ˪ymmаq1ѡcm˫~|-V[ϖZږ^V֐HfgEDp@8FF4ǔŋC,-84uIjҜ[N7S,Y|_6'B JPȕ M7>T =X.''&yppXĉA#7.^?MsvRc_ lhj̨64[42?fɩįAx## 3Ǧoo fB?}f'߃9\Άիnj63{[A"LyWۧNo{dK͛Ǐ%$T5ɓl)]:ΎB;S.?vʈ##m~|@yTMwhVɉ@E{Jۆ҇ y'11vJUIɅ))er/?{ƛ#3o*-UdžXɏQ(a.8܃ϻ ٞ-Z(,z鳧_ͭ54]]xxxDEM9Np>ny9ڪRls;;oSFG=zs׮5k~_pw+VF"\m[9kժ?MĢ3e/߾UX57KeT0q c-֥ǟ8v{x:u}C;eݦaS'ϝKO+.nh`|e˼"2X֟OR54ͺyzNjiÑI&LOOG !xЀ@'S.**_[T:w/]G&o8sԉ+W}N$"LM}}Ǐ2%:Ԕ@J>qw?5ާ[Λ7nÆ'IĹn]c~ڶm[?vz̙NxRYVv? ?]yE+i kjZZdr rc?0ݽ瑨PT.\n}WRCΛG':;ay⥟>~y/Q./,׍6+q{O7RinϹʒe IDAT?o޽7f׭{+ˇ5V;;o޳gÆclj9sE ^ӷA-FmnekM?hNs rtu5'T\ޟ ?mNEE NzzJޝ;N/.P}""f^Ï=;::hg$%}>=M!wt 5k NnBͨQӦ-~ҹsmldHD_d2".hDTZ%KӜʪĤ{'1[e乹~+-R]BbcN81 ֶ"vQ4I+AРB eoij2yUlky11ƆUqNxD5WؿSJJ(/ f\|%Kf̈Ԅ$aATf01֦斖 Wϟvחێ)-h"|o"ZM"9:kdё]^wʈ8wn.vz$޾}X\\eodًi^&R)UIwAe)5--mmuu-RzTMMWR d/YD tDR\wB.h eee~^APSeX!2ZgmJ%hiimV(,Ȑ4fqymU>pME,^ZϖZ-b˝͛3':*0ˬsq U\[V {x57؟p61!7/8xbȼprIJaaK-[>ieC)ԖuOKHGDXpmX{;Y㓒xlI6`xsf+U}^qqqEL;7mÞj6&5G+4ХU󢢬,lрS,@pX|Do?{[޶-Am֝;w gQ{>==MApGq),4<̴g@y 6;/cpubM[Y/J9jJrYf̊@t5NOnG !G& XJ. tzt53|)S7m1#(ШSvTj{ۖ1) aaÆz3Mn\}b'G{˻UV 1>D"657;vqsq#[Z6mtH73 Dp;O?TM4ϟK43;%+VLسiK||== o˫˝ЭV*y رC SR ZZǏ7g1h5Ғbiڻ.݃u Z*˔5x[G ^8,{!W0馍;'F[d`?B õ0c=z廚G&+-+)Q(\z,v?wX%+++.oC?,p\  BӼ'B(K #P{QktAD uuPjj 1=$?HtrAs{b"YI!)DHxkd=7 >l/^61~G W{ ̄WG՘1NF"w@`0_nq8cal5$ H:)H@_Jy@"Q[+zŕ&Bҟ^17FFzªF@4)P,R*xI߫"vl)Uw2J] lMj:#VR@+G!Ћح,#"WXRKn\?}4u-' I{{ VvugÍ !dsW]ϩTCȹ7~sι7Ȼ90044*:zZhۻ}| :;TyX(Lن!z{{P,ܿo޿oW,;[O. ]>^ÇŏD_͍czpΰ)a 3a|ʹ}8M-dϞ)>nۍZzcIs熆fe}3[g@95d@XSvtrrc1{7 &×!\{7Z<4j\ȁ_MMO_OϿxٽ{:;Tǜ9o1wIs uwgh?551qǎT>bŬXp{mQ E`k=믄ĄmrsUTtt8{?y&{x E+WxpϟRS߾#-M&17wuy X;w&'_? ˖XC=x?7o:r;K[Ͷps "mL>O/Z*{ɓMgg;GPT^UPx{yY[j5j̖-y:vа0rq{wosHz!jks8..A'LlhLLhizY55]===>?#-\||JJW;'-nn3f,[6sVp]2@aс}6)/PUlcjffa1%lg{xGI1fzwʕG''ޝy@?i31Qn=1ljMMw@7}nϷ{:i4-McSc==XWN{S_gXjnn [N")(pvuui\_| Ϛƛ{39i jjڐ‘+'Z[]A}}]]=\.ʺanpPHʤRutbeI *N<."QaюVgu|s򤛍7g~g&'YZ-}8: H [uu|$<)nDxN7C(.)qlm08֮J bfz{ia `DR(,PQptL`[kIqJJBBZχK|!vt656dS8:a =uT*~ؐzȑڸ\TC)lO D=(>ذ}7}91▽2>[ѥ˯y93$? "".9&aHX,bIZ7K~eEOс͍3fO>0.ѱ/xiذ!-; 7 j`4Lq| aTRiCþ6lRTdfd{hjR(1Z<7c_{ɉFC1[XE'̔JǏ%K|bt /NH&KH,+C"?7iْ33&9z>'[ utMM͘TL!>4UꅍW};]%&s|;:Nի51y㍯~ywwkD hjNO?xpߞ3g󫪛\UU[ooGGP0҉O?d}rl.W+=9 ]]Rgj3 ثO".oc|:]Wiq=7uyD]]%NرgυڎH]aٳ>i?wF^O؅Ϙr*ϜIX\\W!ĻvPܒqо=OVV57xjjll3gN]_t97DE>::ÃB]Q+3EOogܷEN WH6vOjh.tvOH8[ѪիgͲTBamݱc|w8OxAssQsǏKJMM:O>!СnGEhjx55鉉 O++,XwN5H$-],-cb,f` uvUㅚ` ?Kmm.9}rXXT#z]R|ǎom+WNna\ 2Ywŋڿ;<w޺>5v,55vGT^΃<@d :qFSSc3*A@Ct"R(&&.p3BB6o>qb󦯿f̈61Ѻ:KKS=z>K*eA9cI7oNHشo3#"<={\uu}}^?.&ϏLI⫥IsLrJJ{_ 3fSƽb߶o'|}#׬ٱןzkkNѹ;r^8)CXY nU xT(+ zz v=[B… b"# ^1jj:eʒ4sje-55x>0<^~92hXruȦƵkH nh@A*3Zg/{%| =477OOww֭m M^,m@ܜʪq̷0'BM嗝L7=kÖX, ٥%5Q J?THC~Ri?LH(y7FlIyݻ2/GB:rʔe]1{u**/DfijjS66Y"H$Z%2nqL*-(90"qlKҴCB^ϞyŅ.~~++LeV~_ooH$WTw9oS(N5R9Hh49mu|.O,VU7Tclh4}C=]>`?8*c6n\@Ν`ogVV(Hja IwNoǙkF>#*ڿPc\L 59rS 3>ZӦqLoEFh85{g\*1V"QWwgWR=#TH+/߸kcǓrkfaTT1YT⹲;|A-Sى4cvh(՝{wJJaaUucSKkSsMmqqf3S޼ZC7~``t mm'Oe{ϝɹ,r~"osF+d];--Oπ@'}{+*9|}FCm`w]h߂'[zǭkE'vԩv?vhA׳zzj3vfZZ$&={wf**,Od7b#k)^ȈqM:ewW6}#iiOŋ|>edda97, lg5ګvso_>>z7>NjIBn#)BHQ>I%) N&%x")'SR"#HAmCRh IxC-#lCW%EP@<9 L) @/Io DAE j&I\k!u[-)e(P37Ag08Cwu[\ <:T l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l=~!Uhl"lLժO9)T UVBWU`)Ƣ_!eM:ؓ@fRU647WR1( %VPvĤNLEu7PO2՛Zj@xf.l2Riws|K.Y>\ \]hٲ5kkng~;w#:z0>=I9AAάY&w2YWwn --ܜc1MCۍIw3-r/:ڳQFGɉhj"[-wۙ8uN$݈xAG{w'D"-';+NOk~42rtPUݹĭֶ(h:斌ÇKJ*(inmU(B\LfZ@غm7']kJGKS ::zL~ZgSϡR)C,-Mdmu*OZͺ Bhhzyh55:%%$lo鱳6mѢӵ斢 /pR˾iekԺ :]UUytryʕ< FHb?w`@ س왒B,o[tu<=>Mzij㖗 {7[mS-Ζyȉu3gZ|Hgyzz{HdkCu]w>-v-uwsҒ(BP* +/C/"XbH$:HYY--LI``0FRiZZnN~~{Gxxdh( UW.vs5n4θ~L] F3kNxsŊnDr>E55]]uuUUA2(ZxH$uٙ99 |M#?BQtvFGT}\HDiikiȣcs7)lJp֬Uuu5ԵuyÇ7lĒ.CÈ?Xf\k2^tu''on[SÍ I8bTB}kcӵk16Eh{|-Һ%jhk0:Zw>/Zrt=<-oYJ NѺ5wL+k;{ 3Juus5"эk-&si{|UUJH-FRGnG$*>,~$znnnCwvN 30P cO3g~زqP8-&,ݘM_pbOTjdtOG88|y/v#egp::>ޞV7Zum$O[lcO#[CC )uK\;QN L[yc0wJ=U+u7PHʤRutR<TH@Jd) Um)(I9O=n#*eJ@ʺ]B&5Io DAE l,BRjM9NagKJi) bTX0 :p8{RP'[Pi+8*BP ? \[[UT<~NJO7)R̓C1~o?A؂'N]=)t ;ơf\"R{%)O ܿa 8mbBjIHJhG'OOnc1$)ɡ|'~rІM`ס7?ūWUUF[[/_bdmt~3-]PW'QDʑ$dC99.:/+?+S`ɋK.m*L )*]~֦a= RϝūV-\5e4U F;qi۶556=ύ궶1CT*u|MͧZ,"\C]MɔHd2 E,!3TT|ߟkB"փӳo}]]?r+V>QNCsɡ UKKKSqN:Ҳvڏ 33sٖ@WeP clRm[=|, E"5Ύebc֮rwHI۹u75WW s\څ )) IgNih0&>|ZdU˯bj|𡵵CCSC;J/fTauuuMg_|EԴ#xRpp}s[,7nPc]-ƌ?K3 L$jmomiiDhrr*+ٞ/7P^~lHkP(KȾ6(D"*N.V{B!L#.Un}2޾^s% `T:77o=gԘ$YXGDG4nF--Y&O^G*--UUvttuv>w|w?|^2$gڴ_"*a!ڵn֟Lp[oMbd&ci!쌪n@}JV'e2lnke2zK^.wl[ RRΞ[Vdl;8d$__s3uM*kh3gϜ_~IgH24:;:;THh0LBnE1%Ks)YYWTV75utp6tq494(ZKC=SPv &x{3: IDATYYN 22D"L(aMJޱmBgl4 7FCDhi),,omP"ٴȑ.d=1Ҿ0ʔ-[CJ>'708( \-NŲݻ믶oONjlTWwt;}§5;d>_PVvWoߖvg%?vnߖsq^`K3g>1KIK+44t2lT6Tc߲X}=}}Rfs;oo3@Eeb7l{sr..,XsNmf.54wu-[ECo:M<_~ys׮32[>9hg`{{cwtvg5ʌ]]˗KKٳ8H,&cO`Ԕ[al;Ѵuw ltϞn^VVNLyh,]iŴ}o=|Dwrk %2j8.^<%W*65<ʖ^|Uk5 \xb/?x0~w&%}Vß+X NWSSg}ʕ{oۿxw]Ls<1Xn rU*nZ*koh4iKKHRY^Y!qR777䯾K+/崵o֚ޑr~Μpw_xg8܌zrq a [oG|mDɓ44􋋻f0THd?}f'nwȗdee^;ͭɉض-7'75:aL aav.vuotӦMjkkbR^em-+W.SU%[WNCQ$aȿ45ՙLށrTJn0xm[Zaē'55'3DC6j /|o%%'Ν2e+㴴NW #66=ϿlM9'L+mi`tBnNyycS{{O@@蚘΋44ڮ9tm+ *:)ӪʤNnbh?>hƌM0W!H$=8 1!;t]]1$dE""焢K:/))?c2l{{?gev0f C?/e.y12*(p՟<Kxg?2_|opCϝWY ]]bquB77-i%%MMBLsK-۷mΦܦN]/usS9/Ϣ"Ftc`AaaNvyPx)+Sp_1Aټ˗ϧt?h֜PLMu{C E5tJ.E~*KCMO\x4FRňb1Kꎼ_u4|*cja1~FYZX.hkiim %۳##^yuɋl'c>2uλ6FFֶRiL+QF}]]u%W,̾zhkoXjr-66J$6&.\Kw:6?Cbb]#d޴{+bc}v%K#&$?ߵLG7 p޼/bb]_?,( yMМ45qֆB۽ĭȈSCˤReܹ6WOvV 7| QQS Nw>Hɣ4u@/89bZNNyP)q$1^>K8Ϟ 5'dʘY/JT_0)$:MjXd܉ib֕a&tzKKg'k14Լ=U&|LJ2I{M0d^,nlɼ28hccdD0͎_o5|ӼIYY/IR$^N"utR'wt&&Ʒ>fxy3;: xo7nnJCFFFzmݴi6$_=b/}饗g$|hZ;;5εk-#RF}CTk+yC*+501s^i2l`m!fe>`c3?nڧ8AOm{ׯ ŸEF~\B]o3@U" K$==%<ɓh;q?lpjij>?-C$ yٓr78f坬DB[Z `UuYP)hif0 ICnN~~{}:OV C#w,-O !.-(3θq8ހuKnc'Z:OoϚ8A[?'%Xlie Sydkh%AP*%{&yh=ve5t5R::,8dľ~=t&Je33op BQgkXע-NU:&fҹc~MJjj&W>\~}AN[d",vQƋNNNtzTTTLE;rM:X_.^7C~,2372PsroT[:#8fff* Dʂ>(( ;h3@PQy\$28:ڒ+!70pTdM-ÏwMѲp,xe'r@_/fK+Sj憆bWPXS30p)c1E¬˗S/|nt]$ں̜Vkn>p`Ӧ‘+?r :;##nB!THL+cBΦRML>]Q!8;;EE99aZX#(53(ʒmOǏsv602˫26&$nEՉʿ++ݍ$U47wwSK&6\ tMLTZ^^S] rvuKMuMMR9GOwI<_~>pbE\A|#?oB),(,Hf"ZCɢ„ S?|54$li1%}٧r,7' LIgPR]]^VW/x;I(lm+*Jp!5+\#=M"S nJS]CnQE('?hi6 2~_oo/">G٠4b6*GEA:y+V䚵kqrc4PsheŶ[c!vx̮䙐Pw_o ,V``\3Iryh6D.,摣wE|t9MGtQ>T7IXYٳL2u:q6xPH$*EE qBDBTWVH 4O$qqN`,,Ѩ~ٺ{sO~K_#??ii93 [Yt~_AyEy=vرċ+W}u>AuEUgUSJ$q qJJ_8dJ&{zByu9Ҵj4j{OnDp,Ç:r&MCW.K\F@7 b z޽'>x@2:}v<%OgHDmT\\ߐA  t/nʙA ZLHN%a0L?gih0niP8J?* :*/oӗgsda- BRf;9.jL]/>l~p۷}}z0n:#]*mld֬SI"r8^^}YYZ2كfD,vZb'$2@xO[tZ4)1)m1 -nu/~{¦Mn-k`ЯkG%t}Jppp$;pxz1-YYRiiKխtk[[{+))+5|9]{yy%% mm ;;:KJRS]KI)-մbD"t[HĐZ#"B:ͼUA"R#T聁kq9 f˶"2Yffvvq&,nMC뀾MS{('W&kj"lKrtJʊF#S,8(Rl6bqg:qif~2 ؂,^6W"`Hx 8$$T׀b 7F7~ɾӋL^Vam|cǀ2KRP2..H-d3= L$vtdI  !r[`n4++#3+GKſWp䌭>kAMwWVJiitk9x$Z57<^tmV9;礦xC#):9' :و&Yƻjuww Jיl8 | 0;c̘XpQ|DͲ2yLBFPTW77R(7kָLTM}h:3S*U#b+((2-Wd^TZCTqhz ,*·hp鐐Wn޸yHܽgn H,@[``0LN'E ^MzAYeټ8,}>Eb(d''h2ёHv[>06J$b-4bb+,"B U*R!b Dlx pCMyY@#ҫXҴ 'b la1dv-@eְ>Mj3юMc x#@adLk0 imim}0z?2eK;_6o<M-;O&"#L,Zf2R`tF Y{п{h 0hEJٿ}6i; mwI,\lKO7e}a䧚s8qmlDTxԻ&P_<=?h6|eGƈ-,?O8ܨrF||Ö %XlRM6~f<>.ް'[3vzo(,VU Y[RO_,TG5rT茔w"3RŌt^gKSlM޲ss [-d2~ '@!SpB;||(^ui:>fޕLY|- b wkS6t ,eƣGOxlN7dg'><0''( KIC`L;ϴގ  d-ȒݤT+6aYܠ2l|`O O 'PlAhۨPd=@ ( @؂@ @@ @ [@ ( @:[@ 2 2m6IENDB`gsequencer-3.1.3/docs/images/ags_move_notes_dialog.png0000644000175000017500000011447713607210263020050 00000000000000PNG  IHDRFczTXtRaw profile type exifxuSq $!A9Abpez^@И&VChD)[6VC+=զ¡."oW|q.: XEXrAѦFR~e n.Ԣmkl0eY欘\$ E&Վ&uƤ3Zd;uljV!%vMEדUTEx?Q"«ε'S iXU ̂Tk r&dYr^M1A)cmfT@~z>Px Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later x iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx`e0f7 HIIؕݡ'Dl) Bzm7n;#G])90ݙywgwޙHF$cؿl?8_T4p/(pM(:p/$_AaLZ\f "U_ =GL瞃Q@6QAGJf 8h Bddg24p$ T$ BS[W_ӭT`d [+ׂ x@% +RY[kiIι1ef3œF4/d0`o}-'i04\\o?ϓJqqee-rɓyvrEmm~~A~]]{{oАJE;8D4)4ɌE\$_\SShd|][D1^Q|L6FFػ'lO^ob6wƬeK\].Vz}O{dtx'&=DҒNxxH86N~~QQQ<; qxKH9E~tD.ZpgSSCyA*im-((.nkFg6c%*ElQ=8"412ͳ3zM0Kz*>ɑN'4vڻ0T0m;[DXL7wzB1:Z[{ȏ?~@j5ޞVOdwv#S]\c,^<'u7өTRxp{[`H%z=ɘJy9>>ɨxFGr,úk9<;;[:UTR)\5QUgkC*Fr9`MP(jb^U.3~S;*:"RV(X,?ؘp=~U/uwa302ю~6<6Џ*MsqFhV١R9tM"t[ePCmjdD2*8|>X2 9:Y0n8Jw:ʖo*T:#3|{[J2Xrmmh(%#nݶHK/nk!=T!/݋ Njz*%V)oi*b͎mvkÆݻ )tew7Ҕqnzfራcճa b [ɓPɻz}_UթӧNuuk4Wal VKG;)|`x 椾ֆ}wHK.n p9wwss__F?P9;y(AdīwQMT ~~|! g"U[q(lN(`Æ$)׮ :|8#` z≷^( c[}EEiG4x+kT{JK/XmeI\4=DFW…-/?ܵDF^D_8.3DF,^ . ϒ+}EEEӧ;9Rl3k>ߒkBRq<>)`mK="2$:'B$|1//J%1EW ELf@ʕ [j2<#w4]9( sUĻ|SIf;:q-.Oį5asmMSFyy05 }=}wXTtcuD&U*fg7*hi#*tT77XᑞƊjof&,3pqO1sRQYcslc+f!;桳 mFpúu\>p&L4M+|nƶ~-BT4H&aa'rr*tws+jjJB'88)UȽj[ i!)fGA$f"aϛ{1Dc~2w1Ơ3ȘrtLƛݸ[z::NnjӦ%*rL4+v%ҜoGiClC#\?]^>;ƶטE\nhN&VQw7^mPtẻ{Ǟ n`b آ` g`2=^ΎdJwwQQ^U7яTAv1Ĕ}}==yv\Ib+ 40Brp-#<ܤڪ2&XdIwef&ĸn&ttvttt .Ǧdb [V8x7 nl YrgCçOؾeo;W]^__\}|nc3ff6755ZZ Tښ0eÇ=YPPUUWW]]T믻;ҦJ PjFnm=y_P޸kuNFDzyd?,#Blmɷod.8 o*B $nfӍBCAܯ{hQĜla~504\[wLA ' Fcj S)Z*+ssO:WQ!b@ 0_t01pFN=s pwwx0Ʋ‚JH,6'Nqt뫫h)fNNnnP]]nnɬʊv*5<ˋU(99mSYY^LNr)ԮNNӦ-|<&ŅհGچb# .x`]29 ' >FTĕ0ߦ8739sm>HD5a R/}=v71x11[ɕ3D†n]xT%; ?%I&}A/nKI[YhjFRZp0寝B\N|:(a L[Szp2n}8S1 QB$.:/_}xqb z6AL!~+MH](cwSO.+hELĹ>Q(l26bN"aOb@ |V^Ppss[[*$m}}>8bhxo> `[8&Eaboq8{WW(-={鼼faWX<2RQs;;𰤤,i+^ORz{JK?Z*I)gDG;:01lR2QK9窫;bDPLM\>/1i鲅 ì.>[TTdd>]Q.uu 50pj|Jjbbp ~$oz_R.W?zq : g^aE>>'g}ɑ:sW%h'GOg&jmo_QQڑCϜ {HHBœǒml]A&j_⒪;O7hg ,&&zpss^n;w~^}md'G%eVU O;wrJU^}"㧟H40‹6k+F={[>|X"7=q7Wk+:].wubllzڼ/ӆG<܍I??!Œ+Zۊ22w~٧"ќW_{ᅩS< uǏ_nxF;-, 6e&&\:mo1yVF<#5urv55GFJ{%KLM48lvaȈŋ!2Yre>ؾct'G7ױllbc|r3\/? ј?xקOK/.fhG6T EE %%FF\HM^^>ջOdR|{Sl/p__vݻ3OdTDG?d`hk|T5o5eaF* $k0Hi'2\]<.ma~aOO7wSk鉾>qq s _s9džxOe:ݘz-1tD"ɮaP.0 +66z<յ65tb$&`;zt9[Q:8+L64 ZO6 aiM]=D'_ hК75i4| SQP(N<#>Yf(68b`zBA^VWW=_RTS?2"ïVȕJFd2%Q F)yֳFf'O;zdǎ~Ѭ"#cbO#s0BƹkjffLջZYr-0L~5:ۏiWkZ7[w38 7diI qO1{> & g[kB:MObș3@ة(r-9:]q}vvҔL&ˤ=akgơ.$X ْ=%v|gjꨤ0?++=C[vtt{i&fx1,e!̓]Z㚻{ɔ\QJ,@IJFႻA>QpĽÈju(kb71ĜzpD 'opNXI%MM ++Q$5ᶶS̬iа ;[ ں3gjkkBJC?)M99Sɞ^X2ˋFT'2U*J"kn*)>}ҡ!oQ4jjggn!-/;{FtKT ~{6?j`Jcs F,JNf{ffuocC.$i/8[\ަQ:p-QNpX,ocRT=w*;ϸR)f4Ih/)mhlmt VkTT>S^fNNnnP]]nnɬʊv*5<ʊAGQAvv*e[KeeqqnSYY**6c@ 51$ Fƾ؈ ͿerN*AAܯ+aMq,K s@w=$MAz"m$釄d5\!BZH$ @$i4 I? }o=kVXロU EKKfo}zjΜSÃBC'LHH7o͚?ܿV"1A73KCC%%v_~D[JElm®GF ŪU>V!qsŎN d:L>2|}upp&@I?kVmݪϝ{VoN*7Mov޲~ffco8k…WC+$ipdo 80=ܼl|Z,8ݎvu]bƕ+.O$ E|o岸9x-sg ::zsS͟嶷:uHffIqcc{{X21ٌ7q7Uar[TTdd>]Q.uuwpxnSSRmmt4Z][woR[܋/\I]$Ҽ_ ƒ%[|EH }EEiGvo~|瞛4bŧvtffm՗i#qqOH`ֶ̬̝}H4'^xaT>N(((:oO//*KeeB:ɧ|}Pz&ŸL*$$yFj|28h\GwjDB%~WL)]''WiGԩ_6 J,LK:]d OvvܽKjnli)9}훃Ξ)*~_}uL\cު;?[|3K7~8Sxvj%|}$KKz?>Rtta454<;LW7O  sΝ;qݵj $a"88"M**/,/llŒE$l\ّL.*TwQIy~l_xՔ'ήfgwt옊0#9y^_X;KP<^_P,}|BBL*雮G۶-37oVbc}|1l`ԩ<&8h钄鞞_:#"~7ڿqϛ2u[Kӹ%7:zVjllA-'vl߲EKNNHpa0ᡮA'2b|@b]`.,_476W✝AE3gUC{de7GG*+5[2jNRh4 ٙ0W|텏?sw?'gwω>]ڊoyU+Y,;.@]66yLU0"&f?w޶/w|{?}QZ)okqkÍNA}Edwq&'Q[qp'p9ܧ II$ \>lB$釄Mew獃6O#Qw ( h z -s{]8b_rvB{8'}pqq&@w q8SQ@kII$ HC O Ri][޺g{z 7㓓x饧mkK@kTORm۶zo_ws7\kh(#?yz>87ot`{ZCmo\Ujx333g$$9KJyUg?>0700:*9iʗ_Y$8J 3OdT(xGDYYVWUTZ혃 1IV ELf@Px7*]]SW?pa@///:z앫, JJOdP 5<"4V&,/onh.]z q@ q+2ReL:N^ʥPLS)JJ.<4rb$o$RcBT)f|{T_/hjasmM1zz͝amuyW8FbN (/kj<('Ȱ0;g**Z<ݩTtSM5J,Vp3k<=5.45i4|^b S+G2v A}xdxSgϔ5h4> h4ꪲfSӠZ`0MP%Ô*Hv_HR`bbbj„]^Ubcgw1I_ʦw*J&c%`AiT*̌ɼ{\%3֎rBq'aa'rr*ڌiM)+ 9d7*-kxdHj>ܰn:p&L4.vPc|ɓejZ;NPlvpDwWtnF-hmmǷRu.4 L zzz5Zwp=a :RF3484,kqŐ)A&dr>WjXG8;~:}vm_1EYHb,eǤo뉉|Fc$+ːwiʽI=ahTB,R([ϭ._?d3~,+.20n'&;wc]Z-r>> øQnRYUUyYmmUeyHdcf,$a=^ΎdJwwQQ^b9'(("R2cc问Q(II3g غ5/xە(u?S5Y3]]Y-mm<>:ܶm|yZcmaէNi5AK$L(9}Ǐ5|ޔ\-ѳRcc l9c-:]rrBa0ᡮA'2b|@b&TDD8/Kj *Bx≷z#GVܹVP(~f)S劲m߾뻺:g޽x<@I%9S_[vC=OJ@0-Vqwc]}/"w߾NW\;aLW׮[x<ӧϝעR‚CWKO^q37<ߟL.-+-uuMN {ͷYD;yv_~}} ;4tZvN xP>~ s9nsRy^+=L\c&/^1ogML|6~qyT;ېПwt^54Oа s\BCŽ n z)$UVh$?7EJ $/?3hrz}@BxyL!EQsdC_?nP@kI5\N67ow獃6Q#{B!E-nsGm$ip`8gmAw7IH$ kNugֶ̬9 FI_~yNj` ?Ruuwuw~:8hdgjUь0 m>=I@_NR}uIk.\:=a*ڙ3nt`_m'~&<˯|6v^o0ĉ>|8)`TaZ' F%rVцߦ{W<[_ߞ{twobF$#^oY'ψÉg2]]\]ƾjp(---]$\溿1NNw%&yN?аy{hgkLVT33׿QUîYMM۷-[GC/J,Y,ac9,ytYY[ZcJ+-NaNcl+`@ݡmm> t:G290hQSCov|xB,jv%&[ZZ͝7W ~d2o'?=Idm9uFrx'k$vBkQ4~wWeH( ^ϯ[v陘~ YAI[j~V*UjF^yr QL-^$$ɨq57 IDAT4:2:0qIU^*/+++6>d%Lˌe:=it_|*cܘ%Ka4,B(뫬oax̙/߿ZstLM]))Gٵkݺ/7vv&&[o%%ّCv$Μi)j5qHZ-J:uwKᡑfZØЕ=Y'>]TX['lwhԸ(g'i_om;p_sg_e|}KP46_73K}u,}w"oVYW_~e_|nK& ~ЙV!!!VzÀx@LBm! 錛[s^"ii˭(ohlU*)SS ++Tt\|BɞypxO>I1F˃\ ~^177O?>t՗W ٴ⠜ap Ͷ7R(KKJKg@Og0Zw"ox`e%J4ח-n˅φD硉l|OɈLT^<7yK~;=+xa&L؜$k+2yx,l劷^,*ΖF8WDĤI M|m_}GǷߞ3e ۖ{46ڦZv(+Kp,-Y['aD7ꎘUOZM2l Q^ԧ~]c`\z}oݲرQeǒ%'::\JJTw#uu_7rb@@l bq-kk1螞dF`;]^{Sbouэ)Ŝ4w߀ۛF߹U=I|>w|I]^Jީni^]56tHAA.6T*K4x&R8~cbfffj`FFrtI^OϾ522"3֤dIdkby'N_r֖۱#TҸgDE/0Zuom?sZ0a͚5%%9;p?s[X!FT{wwQqQ!L†I$Z1yDROK8͖ori믳BYUuCuulv-[6q=:({!ߓuQ*o+)}ž.tdFK/ĸ,]F.|tuK$M%}'2i66dǏ}--^sDZ4w[o3 ukqAA8;Q(LuPJ{{yI+ftMMnS*Rf?ٹg[4wTT |ƙs.Ý%ŗ6lXϗNӕHss7o?B^Ć Ϯ +2_$Gvv>Y'MMMLR:u#ԶѕSt1=8;;YZR(76;XX\54JjhOϛIlvp!!NiiQQEycJ`\mB FFݲyNw}…fbPJA^XZVCz}69UV:xVǷWZkR7I%I'8_Z!:}>xX-xzQBJKx?lܘ affUJxt)Ho*n ᄄtwt׮eXv@s֞ RCNvT dFG K nlk눈]_sxؗgv&SGێn=pdci sp{F鱱/k-008؝ǽ=/fg/_l#֜y;'22 +"it[Bh%p5?4#ϗ@x}˹9RK[W7xH3Xаj`@slHA@E`tMkzJpJ%hC=?\Q+5c& 8[x^*Rِs"'"]I$w\<"Qw5ŅJi2Ixilh U._b36űfgo-$iii,؝ b2""" <2aE5NgGSRqӧ\`psw7ʕwiCCo (Q?54p&T*L$Q>>Nۯ&(a *dZ ]P$"4m^'))=#5+]`\ۀy0B΅ aϦ?i g1yz/|cc>+zwtXIV +mdQՕgN+2L V)GFTq75WUtёtDgN\[ب3<_OOAZӡ,a5eigHzZ>TZ?jURb/˵ZYQp8;-uɒю$F?ZV\[[P;/:wnb4JQ:yr;.d0UUqqNN F(*BAPݨV7hkxxd{Ţ&W@P*1szپmRntg2sgbb|}Yl'NJ t` 6wvƚwX<pP1j:e-]]G2/\c&sv;[MY`s3:;;M&2LJŰL\],ޘ{S_:y҅e˚5~>Ȅt$==w 6_l2!х7 sjsm a4E"NRbʆ]zW  ,091j%mz}h^?ݣ=kj Jk$ֶ^@@5ph=,!㘕J= F%טZ3<44O͛O8Ōy<:n=dly|ߩ+B!\\f0G`>Oؤ<٧Y?ܱf`9ӼSQ"W*qq[ ~ b9[}я[ ކlmL'x" z;:Ἴy<A$(,~rj3jb60޷?ok+㟳_3[tCfOo>>p 44ɤ$kk4!p8p8fWWm]mǏ?hK(;)kBK͡`'ǻ<=3d0_%||\<%(>3*ʎ:Ε pq'_DG%''$=d=ގj2>:uk-حXXsdRBMux8^ڶ-1:;|lݳރs֤Gd)K9v|.4 ez&AHqhϷ}jueek[~o4R(tEf~8Fh]P?͚PAnl+T[y4`52!eWT;Xt;;DFxrqX$Ld puٓH{acxX_OwW癟.]*-ht:T7\xoݲe}^~e^[[Ͽ'oIrHH|.jX|wӝ^s](χ@=qnMׇbpuuǏ}ř3rSA&.X`~h|V*"Q,7_DRBf?xWXWx+C:qAu9޾ꪲV9*(8119y@o/w7W-??w u+nn,$m KK{O}Fc@p@*j`V$nfur73BdP:=.a'_Ud q/Bpt ˃?}!} ,fS4=ZSi-H/(+뵷9>I-.4Zjj:ҡATg88Q*ժe_\T[WZKM65TUl Flm|霜jE`%p bbx<:@TV$ϗ6R–99I [[G5^. +ŝh j Q}X( \6:9tyy/ Jkk[[hzat6Ftm2Z@?'͞zw؛aKJ,z:UQy0ϗ⇜ /R̓ݞl0܋>c؆bժࢧM "rq@,R( iA0ڵܒՈ_||p^_S]P_PX^ҢRRlW%oJ߰aB0 ϸ.ˡ)zj^UQYwv1{uwwnnQ\fǯ[x;vPb4Xcz3ftEC]8"c2]GF,ll:s 0z( +,QظFDL "ՉD"DݭV^^11~3KzpɂC |@9eˀX,mk._˻Vg2|y<;; ~?*n_ &3^&;w9!=#= h0uҒR5ڇIdqOM"m9->܀)"L>?::$  p P (-J;;Q(''?4:uwuup`<ǚP^^RR 9Jdb-^V;:ǝ4l`'=?&˽ICANRUF$0,֘UGgMmiIA!~B.R&Svvl6;iZK uqi۠Ciia/\\Tssz\:H-MQeBP_YPJ 8el<X7M_S( Ϟni^Nرs< ^ @[1yS~>o|s_rt㸟ӟ}h**wVNyjǎW_0/(eÁ°B`ZBzm2A;/9ݳ\ %*Od )X;:~2YlםY)Gŵz=^Od98SD*Z>r㥷ɢ CKK?sF,6ڙ"D!i' "2y/"}s8<;#{/NzubaqCØvy`41JaedRx`7ٖ}\:+B,cCK -,A89d-H0ANJK- g$dӪě d A@x`NЙgȐr*h꧶o{O 'e6?-{4#V87ߚfIg8  $d6'0:-CIDATAA ᷦYq J3slqw7ߚfIó)^7 $7DoMI# NqF@@@@@@4&:iH,@@@@@@;Yp[IENDB`gsequencer-3.1.3/docs/images/AGS_super-threaded.png0000644000175000017500000010457013607210263017120 00000000000000PNG  IHDR)vzTXtRaw profile type exifxڅS[ s ! H{=tgH)$F/g hUJ]X=H1XPkL]Xp Aj'>hT~ N+؁6.[і  b>~wZ yw )Dk(ñ3GFRD@MF&pO&F@HWh|5 0q*X=xքy|v]55J&%ԅLYIV;.s!kqr;(ٌ^ܽf>!Ww=9V+*GE*"g~qѦ%q.ͭvGr"7O(H'{)s:bsI]&y6s 3 oiܓ{tp?q?:}ֻUn~3 )iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - flow-chart showing thread tree Flow-chart illustrating the synchronization process of threads Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ]%1 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxT.+UQ)RQD 5ƂXhc~4K"Q7#XD7D:rϳa3ewܟ%xٙg9>1E7d3t|58!p\~LfA9ܱ= %K$̡8XG('crE rq=a1-Ej[r-_ H~pp(ioɻm>> bCRF\%M)@;٭+1qY|H0<_$.Rơ`PɏIx1# ʛHZLޱu6lo!jeq)|sY\=ͥbD"P;uoO[6aERqh1Ae@%qұ9ݯ95kt}1s *wN\>ZLP/!*Xя &+r8k19CIFNNxK1DU[O>Q' Av%K3gC-&Lx}aŤsWب!(kM>L[^67a0_ ) [o< ~@j)}z|>y\ɞUWr-M=dm o FC-" Aή25oW|w;Cqଥl`zv0jχSlĩIr!jUb> J +CSdUɖMhH4'j8%WYKa/ޛZ|g(R{@ݒ>j|Gol%̰2;BrVP y[F `fG؂Ĉx kbS/P4l 3;7= n, $TivFC؈B~s2_yg )SjY\4_jಏzfރ+aVX6Q9ՁТ̾|?NYlN:N%lfs W 8}M9VՏ쿯*ǦCG&C=NV5QI5_fot:~r \3;BxVn3*0k7@ޯ>V ?~YzUf}XW3;._:h 2q,9xC1D |'(I#fIg$wShzφ#H`!> ~X|ǵ23Id%ZH6G=a)8,_/g:BmB:8kCu8kVծ&ߒlj%\fv<? U2Iq3gA3s3`ʇG¿d#;wߤuSaۊ*ՁDFXLEV##<ZhPK=tцS;dzd=<dE&{SP۶^~ 9 nM`DC$Т%9Fز)Z O"X\}? ߉Bac`:bbbR4*CL_ =Vw8IZ&¡>o@S|Myه]<.b\d3Aٌ>IrLq0$oOSsp8w!T_h V|+&D+Z鷣af5Ξ'M?iM!'~crm&db!$W!$ThTfu1ZCY [Kd-u!:Bq1Z%WZ\!!'?]nɧ`FVill\Bޜ;8ZiA|6BFz|IW~r=%jGV/>Yt(kzKW8$3ܢg5`VjKmu|T-!Ɣ\ !e?ѫ#Z4 PWaCϐpݣ:_ -\Gpv19r{W׈n|&T C/CC1rCu-dHWV=5Jn=[vmsx=5nN7h<{% IwvmaI7k&Ul&HdABBii9qP{< HF{ڮ-GK:7t M]劬| ZQk- Q/=u;tӖA&\|(!S fBnQcX!fjU_bDI`j:q??v>u_PMR[2;~tKesL>N|^9a2n5~Z-+fJ@ jN `wګ?:j]ccfp "= F2lGF }ãcI}mkI}`4]U0׈n^?YP]P 3lM8 /6N _/WNvpj*?8Uү` NOzԝ6~Wq_5T`0:AT χz|M0$H%Dk.&^?=O$WcZ'ZT@w $-8\;^UϽ8eNbz^f@@[ZI Xh]WW=r `L]fx&xۯn/į)pll)o[ndvpH8Tm(>GdTxءKrEuH4Hv$Y8N; Uvfv's΅̂ьkwx93>N y0":Æd{l-ar0_QFd6 ꟈbǪ IFD&kQ )::箓; ] N*=$NDUҷyUbDhKǯ왤e *_qmg NMҫ> -7 -7,f@(gu89+ҥa^j)]m}7EMpH9~DP~RQY_[CNyb -4Bf*RYKSNcC84dF!88Dhq0pq1! 9#!8TfBK8r1!TTDI;kY ]99!8k19!!,;884k>H8kqqq1&ZC88O:k19!dd8etQR 9!$Z<)_2̞;8SY{ 9Mrt6N gΆBNvppٕLkkUp` ơY)G!EP$;C1iܮbLc$|7wڪs7Qvl3C1rPoV6BSRiLDmk!>;[3&\Mu^DX-}o גa˦Dǟ 6ۑ?3w1YQopzʺPbqPUR7B=oNL ރx {FtA-)q>ip=V>:I%NIZ\fAz?>j{ݿwۓfȿ`P~ @;#ϐ*G(в>I >CӉ[ֺ->&g4X@tqt `_C/[s0"NM>[ak#͘4*r;Y)Sca6*⋠͘Tik G'0 ȥ$w!.7c2 -9Zg\&1&geeLڡ%Z2u]nW賣2&%-ϣl I`=Nu1&Vh0kq[)X41UCm|-1&Rezʬ׋t1SBz^]&rbLt|s.ԼdcLTdߧ˓ !Bslpu'ם4&ih$3C-YS8}*\{bѐ3l8TیC1 -f-A@rbjM,48i"?4Xtat8܍pOYPǟ59FCΖ?Φ;[3%ZrیoL>&`>0NIFkrءr&MޤCq֒iS!$]W4k6,7GS!$]ڐCN|^cbe-UQg-&N4[ 78Fh1!!ǘ /`\:98_&ǡ%ì%hk1!.Uc*<=CCHmc9>Lvov'k.JS(%9iA|L:@Ri|BYEC7fuy|H}X>ҥ+KnYE> nvڢgKᜩZt/L@|!br-zyJs)kHr9g\0l(8ZޞF|ɥ* !3I7!'".8^|)Lgv ntlK"pDj{k0ٞ $ܮ-z\4㯆"^K3& !׸@tNhoO8hCs>V N}>ٮ-,ba5!Jyb&k&(T= ys$Q=Bmז#%{IzPoҩJYd8V)`?Vm q*B*z3Oa1mV+e -Wh9N]yoAхzfK$^,Ę|#pX$Y,DK#rXzFoSvl[ZrW9Z@JOfw͚½t0ܕ%>iR:9ҳpM% o.lnm-o׿O7':-\ {􃷑dcR^;wqeR[2j L]gEƓ:ߧۙ5ܮ.<މ~M&4  q}aQ"z܀֟ ;:Zͥ}įҗOWS> ޅFB] @em}UxEd6Jys`ezG0'W㝔2:4qZ)p}UVp*p e ؒ3$~$~[6m㿫$Nm - 7S!a=:m-ȘmWr:yGhFn=auo@viD^Pƒhul'F;Jmud=n n *Yŋ?̥g5k` /! +#4dOLNRUXtm^auT򼚄1D<ɣ3_ψFۖWh) ^[:SUҷF&L۵٤d_m-m>B}6O'w.T9G7'$ђ6_읔 ]X=rWtI*2,jUB˟I vad|F'9o!!50T6- [n 9y&ag7yqŚ1]WdOUE fm-!PNkCCHMZ"r!GPL IDAT3riSa2p0D<1ߨȾ l 袬gbCb`=h|WGT_II!nԍC¥+ČCqq)鬅aH`g-5rIZ 9gg0!Y >hA!CΙ'Ca֒xt>.q-99B">QrrBBL6YKX4ǵwș>FLsq1&"W8!'CNp*SY&zy2Z=rrBLIg-!fj>|Jf̄9Bq1ZL5K3dByCŘ 9!T -`V:k1r}If!!ĘYT$ ƔZG !d ^m.Jo!#2ML'hi6i?& !jN:߅1*kq2b8Hj(_z* $I#`2DQF/Wz+QӺo גa˦Dǟ 6ۑ?4BgA㯈;c2ZʫkqoMM7Bpn>e\Tse0c6zԥ@f-AxZw؊_MS%k!ZĠD[owylOZ#uG@M6 U;B0ZHtl.k +w?Dyo1JZT>L W'Ibr!PhџA[m ϡ+->5;5J%SGX*|Ť>١|TFXkȿox>Dɗp$޵6%iY%ID.Z\(&8m,<$8!#HG7cwr\?]5s_ XkB)c6hR}u*kZL8W1w;k[{B8鳡$uCAS$NMIl99M>q:c5= 5|2;׸$dyyFX?M $wИYK)D4_3S2%oJ\kR``gq̝0ٞ͝LnY L&0׸[G0g!/nXk+A2T6+cŒV̼OC_fMA'-\?SY cK'YK궖p60c"Bg3Zes2 {55: -D8k!LUnB;a7Q%Sd_}D[Mr&M9&ВhUƵԘ8,#Ͻ'iΓ !qgS͡Z%*Hnk)>9CڥC>d.+:ZDpR}Ob ! }CCNOd3P~X-&ad-U&zl\KL\Maj>h3CN[;G(O2Zr5%lxqR!gCNߒH_Bq(FX[ LZ*u>,!ĔDșH;4' {4|YIK㎅ ZxQ!!G'Y\z0~Udpx=?h2V%4C hG!`Cށdɟsupρ@$ܾ#X[J*YLfߌoj&h*!dl0eW χ}Am?`x)ɇISXYŐg!nNf7ӧ&jMяpRƯRnjdP4a"L쏐( 8 l@!z֝4Yк-TPe=Z^ mJ\<$hLұf[8I>cޢN-GYG^ fMa[BGb-M>$c 1Ot3~d3f̜6uڴMZ{#4gH:_ Tw on+.+.Fujp W({MP5;akrQp':MGՑ(@vC*/@ }Go'|[vˍeF xyn7? V6SN5jE@Շ~ASOޥKڲl)ӏє}_-s^Kh*Xτ&铡Bٛ #z+tYB%^jIKȣD_ 8!CIwYS۵;fw cVP-`$DA:A˹byL'SLd9JC# O-HAg3Rݟ ɻXmֲiAkB՚dׇ*+JX f<>hD\GO=jq3N[ATvP[`~NRݨ.dwu)V֢-GO<>A¬t%́WWf6=C*1PGCҘ, :8|5RIo0ErЁpVSo}^#ɦ5j걦~s\ߠ1bf m2>; ~- M(3x-ē`-i}| 0D9AcSW&8m,<$8!< G$jI74B2}oǘdzzʠƘ9ḱ݅a1n=UQqcFïH15IQt:M>qyC5ΧЃ˘Z™3W]P8t ]zČSsa}N: v#.1cb]YُP6aq}xUХdL=\'g ^1IHZq-a[SF4[1id-"==ΥQ3t eR3HFe-CGD%ZRmbOh+F3irGZʵYKsg*/tipRgS嬥>94Lqqh)>rʤ1ƘZC&sd8٥1g-Z1Ƥ!(!9Z8 cJ:k~51ƘZ"CPr<ы{c)pzJcL)g-!==1Ƙ\g-.Vc)M=ļ.1MޝAd-C&q1<ŠFc|k\m Y3~2YbN mzԖQCx; }M?In>";۶HM.]ӝp<㔹1H/}Vɉ?:J#N!*ߓ|{{􃷑U$O7swϨˤ| h#w EO^$Wm=tnqg&B}{aHf꽀qIg-@0gpH3d|s?~|F_y;0WGG0NuW`y]-z1;_T. ={X 0Ʉհvq*vⴂzܮ ݪT޳ŋ=Bc҆h{ p5.I~N א$wD;3!~fH[KEqjt2< g­'O\ {^>{p`?9 v&xp: Bƛ70Qԅ9>ZrJNҨnV_BLͰ-q9K &M4IOSgKƘH0µezJWeMĘ̨:=ef\Eid IZVDhi]nĊurY zۈV-d3g845; 'z1yOKrA\s70QX-C=V=]v ]T̕T>L<]7f||R^9Lhady=+בv'O1Qr82iL>9`?cP۟ ЖWf;|>qYN&$LiOU. }&R2&Eb g89N\>Ƥ$<ƔۓÏ k.cZZhf|SP#w9dqYx1%Bib*g@=n aocTI0hEn񝵘m1}TD!{>N |jak 2 :Sg!Ef =ma>p8r8T:dL8~DׇLr C37h6kaɞvbJ!a[rءr&MޤC)%V<=)!gh8pKrLae-В?_ɷӏlA|F|CsP!dBn %VْrL~Rdti=7(_#A2Y KìN0WjR3e5ٽI٠\Iڢg}k9ң,^DCs23Mނ(~pZfo2%ۧXb-/Ι`\в- 5:v'cOgQoob5t1m9BNnꐓvv>.%<-Zo6htݢo&Ӣ/n?!'uW@7e=֨tkٮ$:\M.!?`2fbd]MjKU'DK^L}׳j3S -]8ѳcOmcmO}dw:c[4>g+*arS?PVas|}jf< :I%jtg\8]u*Huj{6r+y8m$X4Oav ʲv0YQac~dRive -}J֤:#BR%zn_yy qР ҈q/5S6E8Lфw!8T jI\Xr4s圍q1ZvZ6_--r4 ?c-?j=CCq1%MtƅK:M"e;hr)#į !!!!8hEbrF;U%,!͉ !!!!dZ8bFL:h-i|!8BHnF w Cq)&:< -KI329B6}w*OS," :5k ^ZCN>&`>!Lh4%.,S}|Lf͆º:Fd ˖BSX!'n!ơeGbrrB!ivZbJ c@в4!.,=C1CLC)|::N LzAuc> h`!Ĕ-F1<Ags'|Q,:B419! -o}orRiL,Q⼖hsHM+ R ѵ0a"\OUQho.ShJ/Wz+ȵ}G[d <L;lXIw=7sgĘ8U*Y7T7:swW#&ǐci &~L+ukA2&ӵ=X סH?#_ Y䓠Acb_LMХ+T{T;ap5QDp9< +ߞF%5R. "ċDH[R^Y eBsz=QMJD~C /`ƅ!~lN=r+Yj)cߑ1IiC֢j;Q2GI߈rniP$jJ|kƄh0kh;R[`KϘԡE?ZV - 9SM%0jQGmИl#Zʓ {1XiL)yAŘ8T2JZU݀Lqvwt-m؂܌!ƭdz Sh]3d\SbLY -S롦ǨO\@h2LW/|z.pcRaۊY)i" \TI;kYd-e. S:Ke ޒs.Bc]4q??ҨzZ@M@2$}Kೖ5S)?~ .ɧˡf4-Dq-)QKХQTY Th:e%')> -ŊGc]QEc1Zc1&e3bcA=cc1:1SY1URBcL7B?۴ͷF ޙZCaLqS7WdPLT#{o"C+mO\bೖrX%L=P ؘdV6*un$nA$uRn&dSgW? '6yΖI8u䶛Ka F]W @={ppǘ"Uh;n _=,"#H/2H:u^nZ}ۛ4zWI6%ٻNܹ;,sRgxuTqb\{{E vL6K`f}2 %u`f//|Q8o.lay2[n_-0{$܊depHKw|s`~v?tAԩd؈n2=w]WQyS2DC`2e*Wqo׸+-sHn0'rSOJ8 &/I0 vm6->M~N|P|3d5q-cr׶:cq[C1Ƙe-b1Y1ƘZCc1Z1mQ-cc۬m-cc1YV…,C\8Sr(VZ oޤKYCK^ӱ?4Lq-q9HYt c1&>Zp e݌o1&g1Ƙ!c3kD/ccoAc1Z1+nk1S-YG㛒C/!Hyޢ y X3 #_ MÚ%X4&5$ţMR^2pi"0I2<\XQV_(`|dX3q_\_\~_\\k/~KVfZLi҄|Ct+*cVE`J-`/qbLVkx-qbLvm-Zqh1&we bC19CZqh1;Pǿ$iq/]6ơŔ{jZa4kQGdc'`>lO\Ƥ+Ϙbb5i<ט I4rٺ 9ĥjL|=h]?1Zv!ϞOTqbLڼMw+`p&W 7Y1EBgrX-g T.R`O'+IMao6iFHiJ!فD_A&]\!VThqdSp `ttds%~\}6;u}#ߪ.C[]8m\:0xM\ y x+y#.73sIα>9r3tEPXk.fM:.".+S}G.8ysRUC)%Id'kOĥdj{:?uCS'B]cgO:o#.eS u|L~n+u:Zc:ou|ֹqh15FuA@TL:unǡguv z%c ;w:ud C /q c -gǮjS|xzʼ VRb -gpEPE%S8kèÆ@M})XLʱ;/©䌻~s)V40Ж?d~2[kW>ZFc%x~@vn~GN:uà)t uZp80miӦa~ŤsWب!@d05ŝ7a0Nސ؛Dbu}H~?~qK\L|=;$Np2)*<}-hi,Zj)V}ܶ&E&; 7mʙ4/oi޵#$gIc|2ّ4pgoϢrfXׯy} ] 'Zj%_@=nE %ʼ$ !buDKK0gv 4x 2|-8^OR5d3p8_A-6dO<Ϣrx Xx·ׂqb"\K7,jk"=յLYӤ>誅]iۓWLg!/mWe~vdPׯVLs<ыj))yKRL?Yޜ YGub|8۰>\5l@]Ua-a*SRW\v , !?cS}6u94${U3_W Ł+jfM`BӧӍRk)f%-^ۖ,$vo&{mUڒUʴ)pɇ2{~ aW|x-:C=~/2t|a)ф.D={38Dv$Qr10;9Ï7-GSͅ3aQ':,Xxw}Oph19`P_ymgZn`-!YQ>/9F\vI@dDngKHWM![tעO'}}~|nMşrdC6'ۈKfĐɿM֯} Od3ޏX݉˳P_muP5}+LVB1 \7蒩y Tjbrɧ@=fpLfU.|Frq83`& ៈKGtwudPҢ |clC\>;wKÇ!T ~ԅwz1a:tP)rI.#mw.tɘEgH%S\ƌꂼdLaq-9y:q8ZVDź|L~3Tt|v8@#ׅPcʠG;& |IENDB`gsequencer-3.1.3/docs/images/ags_machine_properties-output.png0000644000175000017500000016713513607210263021570 00000000000000PNG  IHDR>odzTXtRaw profile type exifxuSmr )z=1f7F{I'uư|&#|1M-\2Ո"S$˶d@җc;MO!C]DˡS^mڹL}_DjT.ں9^%gDimJ+I/D.(]L-:,1.-eb Q(o¼(hIݬ1 -nI*bQ2?qAn&v. +ƓU$~(]U\{BjMaU)>1 tv $I1RƷɈ@~Av5?nz'Q+]>w<uq!S\dzTXtRaw profile type iptcx=1PCwN%~9Gd!l-߅×z/RQqoʭhEf.2#+/bIYiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later R]T iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx|?pi˒%/ym fmJJB3JHI6HIg HڬIhF3  ؖdy/>)`C WH{t{Mtb??:}M)-1N,7:f*:i~4<~x :MJ' n?ہt0Hn[w3 DybL*0HFMFTxN8`4\j6z^]9v ʚ`7A|{D6+%ćIޟ#ɐ sff1NgPph.;w*/AQAW~* Ģɓϋc0NbZ\ܙX(ݲOc̜->wႪ``0D"_ߐĬSRx[UX֦l7$4))33+399ϧ~Ćq8/^s:=q{v󶲜 ~Y٫V\!PRŖ7yF`dOZ>iVWS{\QQ9^]]fzR, 1);kҤ(o̮0  `Hfw\Rk維nra٬m˗j0ܳ|Yvv`ݽ,d2=Ɔ_nݩ6Ƴg$S"LKoP<}ۡe]:fs,өӶԩ?5uzW,X "!<~NШ-f&S(:]SF}ѦƶVeeƍIr0%R(Z[ z x|?@*,.% AtIC2$Y,zzvOVu{\rL[#rN66ԩ3g ;8xq1Wysb%땕ٗ[^(*TV,\'0)fZ9Ys.1=9)ñXL&ŲZUꃇNTa 6;P}ߪ>=,T ۛ w++ z*?H]5}Zh5deU~~A ٸzYB9nhټ4?_\\S2{vd`DIBx>-$+,|_zO|tZh\}j\CY\Z5].'.y≥$$гlY(j5L&U xIHAZmg'E"0;;3+*…];+榆v+!.T{Y&3883k挔d_9eMv6_`7j*̎?^ptZ-AIIӦf+X]ypc@?#4W>0z`$`45;wLC/A:<>}at.~wdb05orY-CW7֠h֡A}u\viW󯖢AAAAȈ X|0 (nw:].O=pbo1Aksvo k)n3fM=f1V!NWplݜΞ3v%Vw3.[ɡN6UUj/ &Foꇝ_*zZ9fz>>->0/Bue{F,y@3mFΒY3c^$HQfҙ͞' , %^'q9~NѩZ)J*r]a0zA D"//pvz^ lbc<} s\Nhju:I5?+Tߵpi6[ T0meig9:]cS(i+Ϝ?1ib UX^~rk=8n([,Ν+ j #}Cyn fbYkԪ OSo.,<ACOI2epI?OJ _Ddx_@n:qrׅ--m655446vv=Sr=hoe(V_sf>)JohjU54Ch:;M&*<ϳSNyyp\;$h>u--pLf8AQSfN &I?= esQ&ee)5Ǐ5h[/2.åVg? 3k欱c%g7 8q:܊2m_3J&J\]mkCf͹3"#/WhXd/tSCKSKsm_~IeL* ʚ??##OeY'I=azCy#{vj;YlK, LŢ0a7$)I ln$!թZɃC'Μ9!H` C@?T5nܪY̑cg**4:+bbƍ6533<2 shs1Kr֮ xRɓ'O?_[Ԩ׳9BD/;}6%J22,ɹ<|䉋5mgwLVd0]?4|R\"(!!%Ukij:6>!1qIYٓ'OV͆!6n)tBqJեx]zxSI.yKl&<dZfhn;{ B`2G({+|Z<а `2\@(9-xXlmrx%bxyL 0amCRq?ӧXevu:F ?}mD9C Q Q Qnfb6&rCa1Ս&ЉrXt IYyc::0ھw:x [(E)tCa)nt2(3G4tJ1Cj2Bf1U@C=;ѣ|:tax. yz^|dv蓞;W+\NoHH'Q1U@Cm;Qb= `Нt!?wξ~n降c::]}FY E0!x0!x0ΎS=vbգ^ZzоOUWW[q)S{>qRңN|:s͜{pK8@QFc!o㢅\vw(hjiUժqR>κ! 0RXw9j[nj}`u` [ɔO4sF|_\TWWÑ 1ww:ߟV0lFnoi->k-_+>[Utt\ފWޛ3.ߏY '7mzُ>`<O>9˽Njkۿ~׮~GIN&Ɇ]mJ޺|3lvZcmԓYYlRg?ҥkֆ)G^Pjk^AAYY,]joo]y ]*ƪӧOTy{7mjṘ$=#`/9gGF&$:;T ]zdD"iPPLLBbT#+YሉIItvTWխm.pY6!2B^bk4_H))g+{+(Vu̱cUUBQz)ɾrʼn:?Yz 3v4E t+8ڊBu?~ܸHo\&ssKeeyYMuKVg0ሄoȸnu}`2QWQWq>j]GZqqYي }WEyeeCcG`L׳wNШTT3fcB$?22s.WMSUVV*ZZu]Ft${|QQ))II@ 3RiKsmlt:ds32fHMԘeWUWU65wjn'Iu!!qqRɕ\fs{{r}}kۍkޥolRT6,r|+qQ~~ߋN 1<: xq W_v쌍7Ѣի,ڼ{sXUu}=3s)n2$|NYo37۷ ?L Iϣ/.ca.}uMAA~~e"EE'&FEvNP_]]]sZm\|fa^"}uu;v3ZWaE"w]9TW\11qqcNJDr()ϷȴɓSR|lzV(mv,"<**)I"Lh z?d$䲸I#L&M݅ %%u ԓhR9SVf0Z3fN4,&нDFkxD$];rm%i6wkjjk쬘ߋN gّ-gOI|@&.tvV/_wO>5wω?5eԀް_jLy4Gq;d2;`Je`>IϝS'Hls*5 QQ06Stu'))::Hq*3ww8FrC%̌hNno75)+ʎN>?:jbvFFdHtӾτ"qbc{__@5 EJAksA񢢆.}t8^}fSC_vx|0cd 6ya)+K/TT8q &MAisded Nsg2gј}ᄆXaNN*y2wդOvX'.Ob 7١yzh;e=ϋIOOIQatvj::)GPE_Gu7@ݟhn8Y5p#{imt:E"\"a\.U], dM1X,~eE3[Λ9+(Vu|EV'DE%DF 4^pH{-n\L"aRA[K ;5eGlV-yAwjtv;-y xad6aF]M5tXo~0w5oE93e<.>&d*:NgWWsssrA Qn.I9PN|ǥb]PWuûcۦeۿOry!Uq55jRY\\[{2)|aaQQQa2.\] JK~v}XY']ج[_ÝNNSnlhm& dC{sߩˎl9:P.ݭ'lTG7&C,g1sn,O|juZx |ycdЍZ](r(z,-.K&OLI(\PP^^K*ļd8{b6mfu_AF]}@]~U&3~%I&NTLVaVk^SS]YYVVTԥwQ'feFwuUW^6űq}gvk>Yw$g.V" El,=eX8q)qN7 5:|܆ 0>?*:6.,AT*=|Vw؅VYuę3MMމ)AAc#P$NWSs~өn /(Eχ{EEj }yo/ȭ=wwƦFIH➋9$I1&}4s\ݗ9"'B>6-5QVV\\VNӤHRѩS}ÆtWzMcer+w>|x$746k.W+ ONxS^ߥ{ puUU^1䔰#[6[, r7S Q`EEcxEB>a2 hjl9| o&W>iRΒSy7պd) Fk˅ yݖf…qWdqYYxK,8)4ikk޷CĈ T(Į]Ǐ)(6? l?߰^e)8[_~Yr_]:q|]_5sσd{};ӭH٬MMg @r鴚:h{EG'%_?p$EP`ؤ+PZE(ݗ6NܤRhuPԷ"{aUUufwH(=I bN|4 ]8!]mZIy&p9~h&S~~+++==4D(6蘐:MQQuua73&&,׏>2&SkVT׹\~>+ou}%UU&3O\|Xh}CAAMmqqa]R>j1x`)twTV^`droHXNP__ߥg2ES gRyBM$Jt`4nr 'ﻗ(8$"Ϸʪgϝcqa2i#Zm{Nd+0K& ,=EhEEi)g p8AҬVUtv F`Z+f#ɎΑ3^](HN~߬կ|m{n|/XOdh5? =D/7woӏV(b3͘bŴ)fm>1h R̝nm毾ÿ=/O  9sͣ>lYt7dM0o^jz87wCm6#- IDAT0?*2-G֯_4++0[ [PDRdorJVVl"@$ǧ''K.\hnnp'ŅWWWT.RRL Y,1qn9( n_D?R-.nx1&߾0cSR 3= 0sBBgKi6K.KH.Wk4եz^2 Bk'wkT]{Ĥ{<{x*|w\Fޯ xq F?N}_ǰQ QmvjjH'6s)*N x 9xX&pNgt!qhmӸ ::n'r T*?׿^nÆjk:7oOڻy(L+>sYmSݞ Ɛ7Of6't3:pH7y.(]ta sjLjt60y F~-trtun&׭s4lMgl߱WU76<_tqwߒ%Ӟ(_ z PQxEJje%1Y99`1c|lvVkcCA矿*ZZV>/"<%eX1eJhOC+@1/o-5k/4Y.+(x u3=/Ǝ'l;Q{ N}qͮEE2Y*#j;;}Ģ))~!9s=O- % $%ݼ3u C#I $Y<̳رr_qw&O^8,4*"g?wRSƎMK es6lشvɟ9g?:E"~ᕀ`(,ڱ=7WR(.{q?]0?0RS22 ޗ*|)`t9/nzobj6m6eer-($>1:Ϸ٬lLfHHdBG@z I h0?r!~uu yV-&&̚5ejpQU]Q^S_ύ)RpM2L&#vh.2tz={y <~˜ [ f 5ǹ\>#&34d {ŋ áۻW^y}9iҲe `rG*7^[Stà\<ùQPa%`6"ISޮK])9ldI17O3dGh|~ttBbD8ɬo;}xer+ji=_FEc,^|))1a@\,$:Vb;$Ӝ:ydˎOJǵ^ x1a JyC56[-v<ΐ{^ZZ+ǭ'n",f:y< B.4yيٳOھokǒ%gev{ggZY"N8uj\H4-TyCa֭7}uq""D^Fs{C&?vomDMbu_tΝwDGXiWI^"/PH%%U)) L&|&-Ι27ط_yjə3g؀@&]p;2[^❞8gtb|^O>>AKgg߾dIF/Q iS-2ҥ?ڱsMW/zr @W'۾MQS*{0ZSyNat껀Nt2EYA /[^<.D=nj`(Q Q Q Q k8U߬[ ۶\Y/Eu'Æ/>rÁ֢(jnϿV:d!Ġl=/n!8z7զ>ÏL*(uACϋ[ ze2?/ %0xC^Ӗ/4YJ%9t=Smy5k”ܣG/\Ub{ZpabwO2uVK [FQڮ'{.( Wp3Ϭ\6OcFDr_׹.LI=K.'db#<Ĭk6vljh\oS/ d2)h\JX Ot)ii E/[Uuzy?џ׿,q8$?_ PnaN9P/-zh̾YXaNN*fڸ\E`p/Au]]CORpM`(,ܺufN7n\DbhΗ>woU`W6CILro민b̙3fl@ ^^~]Otv\~~Wgj-9׿Sv{5k租8:vҏtmiU54vu9.WFiS ]TUWVnb ExCYFcdM0o^jz87wCm60?*2-G֯_4++0 Biɓ+W2>CH[Ș5{g0{KK W'۾MQS*:LX#@þў95{^ګǎuu ŞY=M{ٿ0(Ո4u ikS}{ck O?[>;K,JX{>jutר$qx|⎎Ϟ;ԴpAB= ŒJCY=吐:~|VVR/~m}ʌUbcX,T#)1-9cs.^ܱw}wAAgθNJ.9wV8cFΒ9Ǎ ݽ :_nۺj9!-^ KQ'O~*L6w-_{?>--*/^x>f _Es˼yn54ؾm.65\N,13.Njg^SOY=c.--]]V+%d EJʂ?|}{g͍@%y `t:]TWWXxçNU*Z[ZDGeNXhŽ秦elvڜϿذMÇN_\WnY99`O^6{Ss~_n9|hr32_2''=ϯg4i9*ƻ>d#?ҥqtFa0Ӹ=1./?ņF3& m\m^ڛoc˖>nݖ-̌`Qx?_}!ȏ^y'Ər{;|/gO~K=9Nش'۱]4kϬ[ 6{5k^~'OdfTJU]]- V 1qA bJ6]ࠫwOSF~fsee WLSO, B*HϜ 6m,pRWE%$H<pC/*,(oHRS[E.z01qh&;:on쵪]_{WstuEGϞ`99bTzm_~eu`!#GoޥOJ3gp fˇ>á;B~DxhL*/_V;'-Z4ėw::*+Oطow}-W~АAԝ>۶3cƬYZmyCv}wa2/papPϲv}MoݖdŊ)Lf{ŋ^bC 7j89Z]}nw[mts&AA PAP+(h挟7G:t6756$P 4  U(,R4tmxF3h`. /mn߸UPTXX$NM]u?YN$JL3&2`~hi3{\+M0 v}kMB̝IIc8_|+]T,PYeĬ^} Z\lRR\wۍvlўŋ׮c{>9-Tz aÆ:sLJ`AHpd݈&IΚ~dI QQ<^{/|/ IDATޙ3g4- #I*,ܹ#7WXy/׍rsO\0)i_y=z^rSz8o_`7p r" .fs85dxP uuy{Sʯnz=6)}|U" teHQVds2(`Y,> \lCbtAFfя͡b[G^=z9E| ,j m^=]Q&.' +fPV(48:}lII[s4˗J3&nʬ&td|} v|-[ǍOIIH\.gW6=W`2ɓ?_dDE`r4Y\ 5AAAA2,l4La$iUU_,U* EQQ|fn 1! *-mljv8$)eͱZABPSݯr0hT5ld.fC?C p<?y-qEts<>]NbXvru]]|wF`t:kUEENظuM.Y`1͞5{/݌&sNw8L/HB.\O>%Ǐ~)=WF||f_0}z\Ļgg]>S/[f&$8G'l-'NS&J}o]+ n\_3Q0!!99Y_/X~zI ^"q} NWTD4䇽_˳@QNr&-ʱDފ ek޼I#JM= ;/$ù;Cn.ӭC!k w=xLLߞaFcr%IB!~VFMtw8jjvvJ%))cƆtǑ?)99%4Aϟo2BxDtLh0AԜ8~HAFp:7- JN2eΚ4u]SH,d64>U]c̚].Si4].rO7US+Ohqffԭگ#pl^p\yn  TedQ W矞rCK/:aaƧ]u-<-n-JLpQ;ygګKb)+?rnOM]ppnWV+iiczOibRR"p=%JJgL9C&#d„ 'f;M6ۂ3f$'1ZRydnSZ>V^'11qqa)oUWi4NTԄ !N'Kߍ5Ϟݱe26==,T$2JK߿3luuy}5iVVNXh޼}x<^SU흙9ibL E^B!hkSV\8_]86-?0G*l>w{3Gru?{]Էeph;+++Lm}[kcFS]}t^~Jcgd<ٻ7 epAŁ3L6M3&ۦ1iFS4F-h@Ee Ad|JŁ4'<_L>|>%?̙-zuED.s$=b1335ung?svTycciɜoR/)jEb7%7wO/wxw{df*8{{XZTyuҤ bb22֮G{*Uܴ:9:.\8CnӦ->:ZtG[_?諯>O<'˟{'mmK^Xd/ֶ}?Ξ]ᇈ.\EO:ԅyMMvkhh07ם=[W?9fd'G2881_M`yn:8q@Vf[rrml<=|%>|F|n$gc3z/|{}Ѯ]64bDԕ+?g|0<ҒFh& PM 'I:/V ^I #>"Z0 3xЀ+^QZ&4g'II]mС.)9{Dqu=4 |Lc7[~+uR*2gRRDQ#=Rg&1BW%aANJé۷=zrSNgm5$hgyIlluIroqctXN Lh*p0˄fe-fs?1YY O/],({ChEK=Bss.)^` ؀z /v@hJ"e2RTMgPX$)FQ{qB&^ּ06aUk@ Gy{ Mb`TQ)+B\.+4Z&IzbXP;aq}2WhJ?略\=]^TW mAE 4Dh wS-WW'=* WACQ[tqm j;*7eNe6P[p'M#0i !%wVX)kܕVLH;jίk+SgƬxﷶ:]i-W`J-,윝]] @9fEGI߹/n=~ҖǎUV7Xrܨ(wY>;"[[eʪ3=vooxa|g^, [p8T5:TMW.ddnéS?bC jiɏ 4oNJKx=5f G2>20%F%&Κ*WVegTWs o>fLLy?/أ.Nݷ7;U:ߵytzCjϜ)+o0>r W22O\ _hȐښ s٧ //Op#/{E׻=,䔕UU gƆ#{60>ERҢѨjvuK23E>R9<|HٺuB|qn=uUUǏoۚܒ UUR!CDn $^ܼ77D"u/8aɓ%UU--rk@ȑ%$jnn|V[TՆ_-Ӧ/z|ѡ';W^Q_yyDG/XxqLBQv۶IN?q\+5*kp'&&|Wjrrv%oNڿ?'°u;;wΚ5"U&3]թ֭\S×?K:469vkm$=7\H++o xxѓ-[޲Y"\aokc-775jj[[ersJ=l|D"D EOYz./efWT98-~H. !!Rd\2}Zt ,9y;y{ǎ3,=NMIݝzI| 1|^ko/:TqF4rd@ڪ5yw_޳G1rdœ ZTJ5N߿m&3<,Z7cx۶DFL<5vGHjjr۾}Ӧ}޽VV~~MñqR}{wز&:;wmk֬y۷7͜C--J߻w?/Z>6V!5bByezO?Mޙ+/'3fdKjJFfvEz̢" O?=4H.^=v` |ga2Y>S,[/`mU jOY~~*U{kۗH}}J>?JkqslmJ:Wffwmm=<^6"3--3 #BTBa4ŋnjFdܴ}ۈɓD99<]pB  J}GGcWRq…ffz}S0ꢰ&2*UUt`Ë̝?vR13g S3/77wB]]Y-mΪqjà heYY.i--UUIIロwfҜةS]\ ŋ65Rwwvu&h}R;}y$8Xi L7䓂ƫj8"ZeZ^Vk4E6v/&mEG_^Ƞf"5vo<_mMMK*utrvR8Dmmm]#(=G3kԜ gg?oo?bY~ ^qJ]"9ήe۶~֬;߾F[r!33d]sl^^r7wCּzuRqŔS'-:I$M}]mF器[{^tb}_{7#/zm_6{iͻvFO  / Ro_x3!l]޷{=~]{V56 Kpc575570X_!89zA;w:]Z6oKYEEš>V[@ |: :kk+kʪhJJ23ÇGx{XP6[$.+3$x{%%S9tTy5͍kB=oޤ\]kޜt`E1zXX -VV-.>aba8K$..JMIM)-| Sed\lg;thH{ ;*FԔ}tn0uQYA>23J%NXZkDb|DgE9W ~m[!Jdɓ"cTTqc\9p׬YSN9rdG64x/ymc0߯nc/n a<}c&$*+۷ocת;6a^LRYW?\v⒊KUJϜIO?p pAAsuS]tV:_;9]wކ |uSvvJꆯ֮G4yM0iq6lmD57gdlܰ{wyǨ#FtѸ 0Fzk۶uPdfmj s#&suٹkޓ9苘bbb+_zYgw~\:tE,ɿpjNݼv`k;cem6ki6ڹcGnnxY[e~s+xNޱСӓE"KK?22..0Z%6`{qMFhMB3vtHGP C/3-SEp/eNe`&^f6RRygŊuNj]jʄ/OILQJ6oY7w|X,ZXۻxxO5{ΜIlm%>կ[SQ1=HzXlnneTi IDATz+>CL~`RX\.u^^yW_ޝqUsswS11Tcnkx1-mWrciyEe277QI:4^d{sٳz뗿>qV٩*;+;jLO:Uƣk배E .HzuGsӕ+Jsrܿ_99gO?ī~zYGv:o¿TO5/]*//*>ztㆵk9lʗ_~}T*uH8o`߀ `eg()up5*1qP*;+'nQ()^AAC6z$,]ꯟaz{SsV椽{ 4.U/xhhHdqS&Ϛӯgx{>?7. 5՗mh7!aN\Q!CF 6nF{葤͛6_PuGlj2'iӞ,>~1&̘c˗q:᫃+60F~pQU^|ɿo݃z{30BtW22O\ 1dHhhDDPR}Q}I՛w) HO\1q8ۮ@"q ;'O̙ׅEjNh8IINSןzСS|[X\?2 `Z\llP"==DyŽy^l%f;w+WΙoc{e%4mDt9+3#L_-Z]Ç['.OJʪcǶnټ --2od)AA ۷;s6wq;Œ⒔wnOM+-|Q23vrR*1G?z䑨1..][37T$nnjudkŋ9xŠ+WT*ss{w1f-L sv6'^-*jQ[=1cɡo{n7c#dM/UTV_FS^q|yFcm;ɩ+*訨:sV;wY&Nrrꊊ޳g?"˯jBwB͛#'O:u֬G>ܼܹ_ؑooR髿կfzZs|Ϟw={#G&YJTZ[s۶}nj23[¬{j4 W+.W׫u;la1]K,B9e3? MSaCMq˖';: KZX(:=GK"qqҗ_JܶUam-XZ8*$7d]mh"COWDppvvt6vT\kl^10~D?wO龶E_Zn>BȨv {a!zMHHxX~_\;m.^jz_T*k<3-ݽaaZU:}kkQa~^y:0pɒ̜1neWw-hHhǡnq#z,+sg~ꩡA]ϲc˟}cBC_?~Xiٌ^~BԩO-]9[X֮Z'Ǐ8~|tI$z}ccFƶ徾Wz ]ˇ j_ǟ$'92cfhh\Gt=* {GoJj]mml\ \,| q(Ν56ۻ{K8_I9v$M?TmQaiXCrPxB5UH/ C6dB 10K>sи3/zӕgvǎP^~d.N:]ZZvɓ5\]:juqəӅZm`ТEcffr YX(=\}mo7:bbF><8xnЩ66Y쳩mU,EG/^s;!wvK:;Ғ̦[unGbXrLKKkqZDqT~aZ9ҲCkRo__RϯdPJ$VVNw̻R5EzK+kkZv;9G&577IDbC%D?Ɵ[H$-d?xN0YB,ړFOp!LBiƉKږM֬˻sb3iNɓ55ScxjSF#XZ=oi, ~?kco)[|)1thTTL11AC&~%sxbJL"ɬ\]\ml{\GH-((-Rsjs]18:]?Ms}X,5J?JjիB_M{]tonz4n|QkkEyyemD4_yzz?2gWTAa tu5Wꅅ8=opƦzN*U88:ۋhcl1ks^^h%23O9;+,|8С5^$R3eԩơ2s++KKD(,騸~|BW-hŋol*8wdαvJ]ѼK/ >c8A 4ϲ{:na-}}wKF͙3mE1S GNxc޺7I/YX+QH ^+3f(=n?@xFs @ݧH^=#XZAD`AH:>uпsm+bAOLg/n[붣˹4M$>jn7ik+)>_T^!{O-O'RY̞9Ch] hJJ23ÇGx{4B,V(B -d][}ao@XRRr8CJ;Fl< 8q%M:G///X]efEf& ?¸@ ?%%ee js v%;J.8;?0i쨨Էu\=GbLf\tz 0!6RgjJ<#GzyE_ػܹ_Xr5%AF6-~-- (#='U{Ȱtފ"$44Tu[9'ON2I,V8?so>x͚3'O6U*mh(,?9wEO%C{ѣGP8ff~gΎ27ol,-=Mʁ%%ZH~;߾bD.N>rx]\b33go/WK˞*/N`ALLFڵ_{O6P'GUDž ?tuڴGG cQ h aAٲ+WjJ:::pavNfLjn8||_\EO:ԅyMMvkhh07ם=[W?9fd'G2881_Dq}~ynHdJȉΝ0}vƫvA(=L~\_~fMzrҤ_~}MNw;oϒG5塇>oxcxss|{ڤB3>TS+ BwR+>av뫗/`O:#B x  ~h; eBsvTF ꒒gJJWѣlMcw4vC7)IIy"_'A!/_:{&%%99-M5G?8Sy-Ezf#/zZ"t(?}ѣ/75t..^^C&Oy4ƆQ X.761qOǍkz /̈́2P,LhVBk61>5ep1rXY :fXC)47w2bl@u ; Oh k1d-2\&S*Je`tEBBkjG[o/4jpe jVjp$;NB"4jUAC5jto/A%'sf^jUUIEu&^NH BC۠{7rU|UzcxѮ؀I }e\84] @OzoOn׶p^PoN^|o-w4vRRygŊuNj]jʄ/OIOG^t^;1QryNNYYUeMp6ml>g T+ --ZmG]t9+3#L_-Z]Ç['.OSZQU}I-PU,::2D$P@n_k{sI$--m,-n|^҉ʜY#"\e2U:nʕk;u*<|odIЮ}Ccӑ#k׾ڦMr?~ͥOV=ٲر-)!(6ryC}ScU&:.~H$bH`QDʼnLisזj͚}{}C`@\=omr{oq񢅿zccr!QQ#F*iiQ :4ZtԔUT$ēÂآ `xM.+?n\`Lfnnf3vO.)R-Qc d2Tgd77T_}gM8ȧ袢23##>,졇kllBB|i\uq ;scyiq^կZJJK cL}?c/zBqBmuy޵h^L2xPWddlۚ\^(qժ0^O|H`UC?$9ȑ3CC\X"2ɥO-3 4XZƍꎩzb]!!DVmpXNNMmSg-eJymONqu~ su7ɻǏ≈pKK?1cFF:ddfg/^(h0,*Crc^&w^&뛚UsgK/DHqOR/XokjuNwbFFffu\j/.)(,(2Nu䕚Sb]]:%Oj4 DEv *Bn.qymË;K?_9Ycn3eʲe/b޼aY*:*PTΘgaRw}W+PKv7WF|s-mmh{Cek#="<0"D*,J ZxaDM۷yO>)(hڡˍ#2UիjFSt>ioWbƞΊ]te nz+R3i'بј9:Xo}RG'g'H>s1cIMɾP`A`_[[~~v#F̜k۫OEO$<1a+ۛ[[[mgͺi%23O9;+,|s7P?th;W'%G_LhH\Rr8CJZ# qݼ,Į.MzյIVTAieezz&/~C|DԔԔҲϗ0XZFvCx*bbĈ1Q~MMyy9٧O .\]G5{8adx#33T"ꄥ%;H$G}QX}ݰaaזQЋJKOx͚C6s97vjBˆH+}lN;vc(uõkׯOI+.TYu̙R47_7Ew in5a{~{m7YY:egnjڿzD7Úo6,lLTPPssF wWz=bK/O9m'm[GuAAfܦ&{ȈA>0rkbKhh0W=#y &Q, NL|guvټqci{|z;[OϡCǍ_hB/v4 _k{=YaafOiӮ;v憇?hX\7w΋/JIY>==)Y$T(###- p&ܺ=GhKxW-I;GYZx{ 7|2_[۞:4ts?񎍍tTTwwmDZAQqbf|d~Q[WLhNB3>" :#/p-w{CmJLY#/̈́2P0˄FmqГ O/],(ٝPuͰHRh*=1ڹh (ٝd2RT*FmqГ Akb j @є2 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&4 `/I#&jx4i']M-{8P 8z]r:UPWE((e.--.KKw4MiEdH|(%>yC9<F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5 `/Q#F5P^!^8:CFQ#F5 `/Q3L>uBiiG@F(.BvN΍gQQ)EI}pd d|B;΢i]B>7?ÕaBI3XgvB;Rs#Ybܫ1#ӫ \vrn1t3K3>|/=,,e2W }p7IW%vGSS+>t΂FX}g?=y+NT5'j*[sm-ɇ<ޱ#?#aB.73" W#t01iSvvõ[opjJu_[WSիg?񆞵ɓr__[55oٲ%d˽ܽ?dSâP^ёzf>r#y}cWq/)*/‹TT7{z8[XEׁm-,{**{zZH51Qh4"QBBTQoNt:aAEŪW=7kO?J&ID,W|~ߚ׼gتxg}3W,_ >/d{+*7l5sĈŷW*wtju]cɓv9bLJJ~ɺ'ClaxfBw0BŒ^}iZֺU=jZHd'9ww7777(6I[k[ǘcƪUE%EYYYZ,hIɝ#.~M,,-,==3|Ӧ{Ͻ^0Rי?,+?~ѢEV(bF66655ZzOe߾_O?h<={rOΙ!6 {yG?d7WWWO̳+V̘"NgLL6|ouu==5-N Eo^h&F%[[[y:]wwMmf&ݛzXyE]]GNke<| qq^gC> /x/x񰡦?Y]]Ey_۹K0-_paH`Gh'nxtEVֿs=Չ**֖֨9|瞓ɝDvt5646L&d2+V,+KN޹kC9مEUuummBak?9aqX[1î+w^"uJ32OlݪIQ>ޓ57Z_}q_v9NԜy8]&3#3DͬY :4I Ƴ_boG/ïہL Sa CT^Q-3aPjM~&R*]]c=q5WϘ VU/NINL\С33o-;yo5ќ;p}gN2jݭٝ{!cz[[7MMKmmGW55GffdeΚ.fZɺW_3uj\\HT_ox;^{mf](DG \œ'545;w}㏓Sژ%qq.R9rةSN3no7|͚߯g =w^yU=tmqēO% =̇ޓCzw7ʪC|j[=='~5oF3z]wu^2eKh=SMMZzZDݣVLڔmޚ5) S&%yg;;a +zޟ#G~~|+ɓYx1B^ʝ/pY:uy߽u'w>7$tj'jʢ✌;Ĕ)o}cֶ6a{í^|a¡CWL"u՞wr**"#]%͜##MM?T/NM:Mq O=9srwqѶmW46Vqqs.nƌ!6֧b;ՉUO:;;4VZ8tLS:O<~D|ͫVyW˵•i_?qc- s520豊VsH*T*<.#H$(..BQT\YY_dk{WVgf+F8(**jܸhk̴"*vDtj^hmYY_|Y~uaaWb*SiԈQtڦ&RO&=Mz5n.nn˖.[{RjWzzN1f``2-mݻffUoiQR׀!qg/X8cFDéq7g?>cn%wN>tXeecc\0*~ΜϜ`ozF^in;mo&UUwuIAA_pMS ?ң=yzҚ33g瀀3vΜÝ7ho? %&LioéKL7wܲw ;;~.Y",tW`nӜIo"V3f8ڣbbfͼN[ۈBt!'ÆEFH$YYY7<[g-)铏?(=]" 6nuٳCCM%7W^^ȑ_̶gJcF88fQXh* j8^7ܴ)/oE7ͻfDZ82eu]]c(FK n*/)܄S<6H$bp^sL?Tjn;"w7/owӿc0oo??/OjkO65T[+Su%cǺ8I/C 5SQ}>V--ZmXXQ~,Q/K{ƨ//Vz~DVOOuͱcE1gpÒ%˖ Q ֬y[+**[ڰ~11g|eKοfDm[U?V=Yoow޿w ,o=;.LXTf8{+m{c/}eQml܂nn5+dJvn]NNGǕysv~[O>Y|Dlx`_ߨZرeKgxreRRa IDAT_~âlmС)--}* 7y{?w7"惵?ZmZ[ng6,2O$+!:e4]);;'$yϟ{++/ܙ<}a'9:\D^KD~#;ٝt(#gذaC Fu:R5 "-"_kVBw_nrZW,DimhЮt:ss&7Jh }.uC!\HR[بTz;:ZZ~NeWN+9  LaP5V_ݥR ~3Qz{Odfsr>'.\^Ծj ^pÂZmzZz0z@**666ZmGgGGoosKsT猎N}]*.lMŋ[ӿjSモ\^1s}:c%$,;Bm2D.ol\SRTVMq;:23 }uTbbNՅVښĪ*?k\ycFsQ(Z~j퇉Μ:uˍƯ۫ѨT…oեѴttl }nsڅNx=%]]56%%66n޾#3kgc]]ftrT(|/do4avzzmF]RZX_kkd2G'{ayfFvv}C-5ug37ӿ)ר1q=UTU^䶺ׅH>2nHwξ==lS榧)QQ#c'2\N.̛7*0umܽG`z8[J{⪪[[npVhw}Tnh#/C66m[VVl\p!LE^ݭ՞+P1J"\ain~QHdj;ke ݻOw1.47oٲ%k;Fܴ:!0ԛD?J"N>}N$4777 6uڴ+jd2T֦T^-ӟ<<Ev+C Hܡlo?_sU*Xg36TA!rJ=J%{zNsӼ^>.キ}L;6&&$1+9!!2E"H4G 4,)^)D e55_۱#'GM~zٺ:ɴڢʪQ!|55'Nhv6a\'Nm-|5moqu &KUPPPxK/b”xAQnNnFOwl?=1qGyQ =&=3=wY _ή<=y޹~'<9=ҢŠJ::*06;rRW t[W*wGD,JN3lnjnV++ۅΤUU|yz3ر;%!op/Z~~w/[o9]]Q;w?qp0ҠSXw@w;oo0lʕh B,==3qʔ¤3߄tM{~駿0b'kӵff.62qaYVw723T=Ǐ̙k&2R{r卋"_yYYMCnjI ׿/HB}YZ8)̧p)$ge<{՜hsF 23"}}^O2蚘XY]we}7{<;njvvN|7g]5kJVyGJ;z'z*+k׏w]wܩє~SZf".).9=gޜrrV=yu_\?U RvJO:m\EU;vo)͝;mڂk'Nvpj}6o|#pM&hkodr=H"3=̙n^0K FpYWe b$w;__HeUMMIIpknb0Ŀ52k+4kPg/|z{KK33l#<Dvvaa^&MgjkjjXNIVVfze40 d)^̶nDEzrs3223KJG1]'zjoP<[opĦowJMR<G&N'yVQ=~bk"*jqc\:;326l?{ cޙSO֥|W_&'wuN>u`^L5m꒥7-=ߴ?& 1nj.(^}.w;0 daÜOշn|(Sjȑ>>b6XlkhiY]u=w؟]UTv ::r$'o_~m[Iر޺l٬~~gԒΤpޤJ{#&M stg-$ǻG}Ȟ=v:8DEGEyx_I$Tmmm%%>_P҆68'S z{Mzek[~y̻Ĥ]ٮ]\]\Uz-KU]#G=GgYbg;$08ή.;+Iܪʖ6e[RѮlh*.;wGrڐa!CT>SQ(n#--99?w۷65jzcbL4,HIil=fؠ k*,YRz(iV11ÝIPVVf8Q-XXϯ=ƦYYSR恁^^2ɮnN.*U^޾}?t0?_43RXJu&]MM89gg/O{{y|KNS^! ^x R=L,wb\+,nNesVڵA!^Q?$|QpB`c3jTo"aoꫤ9s хF"D \Қq )#Ii57&;wÆNV=p`33:Vs.Yzƹ |\uggk=IO=imPzTߩ0ݻС*/Soa٥JB_6}zʐ!rD=v}̸ KnU_iUB@+M_1 9g͊,Qr^e[}]EEAAVVJJRRjj^^Iɉ-"SPȰa!>>nnAfÇSRKJZO&M|Ŋٳ==oJl{vfe3|yW?w4A%N.f⧼ VW wqr m臨4$B1lrU5Sa`)57ԫՏ=cSXܲVV̿V*53Ԭ mzd0 ;pnqbqq>Wnm*G[ T%1DJ~~!/t;e{NNJr^Z`Ah0]B.Kc"r!Z׹#e_|2hQ3ᑟbO/O/sg}Dr*2O? \N{`0ǴjY9b`wBy_^\-):jÄ+3#&.u#1aE]?gxq8kخ!%~+2:*/!#=pIDhѰa+`1]SY_fgCxM c=b5W\?rj/f99NC|uKeRN@;n'gn*jGkP82o-_, h'/p %fXkPh'rs#Yf?U8&v+NQ#F5 `/Q#F5S_ VIENDB`gsequencer-3.1.3/docs/images/ags_ramp_accelerations_dialog.png0000644000175000017500000014042713607210263021517 00000000000000PNG  IHDRFxG0bzTXtRaw profile type exifxuS[ w]1`?m4s\%;Xsيai \(2ElK T?z(}9ڔa9E$:oe"RSrhK<">ڔVވR]Pooۊz0lC[heAQg"v45&ݜղ%Aܭ#YŇz{O\ۃy IAדU$~(݋U\{BjMaU|R|D%* lZ[!#͒3 8n 2v&#^c64~5a5Jw̳>dzTXtRaw profile type iptcx=J10 ^O \ u?iKagt?"ZzVWJO]:&3@U^TſOYiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later 56 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\g8 .e WE M F&vI4\x1DŨXQ"* EA:H,wh(FDygyy w_lG1ks?;*Dh>`,Ht**Qٰ~A˯P Mx:RQчjv:E{=/#*n/$Su4:@㢏CsOeҐC0$ @& xR XRA^Lqred:F$JOOI|R 132I>@ XF 5D|$??OVv Q]SZ#VTTU4Ȥ\s=Z(wYx fgkbL"?D TUi3i+ NN i1[k vX ~0#3p*\.dJ%_4H0Aߝt׮ZۆG.|W&,.tOȨYU[%%uum|~OH&'Nr x}]Gr +S(tv nkϿy[&PL?`[,};+zVII]]KKWLF"OkcM7[,gV\xQeUV͛wڄBN77G%$$0M9VojUWKAߎ%0L!S0L!:n_Nnjsݧ!dۈB(L|,|Y[vx+|i0N?\&.nQL dT,V*I$th:e¥˦G-xy矏'=4iksFأV㴧n֭|DXP@w7*0(|8/smU(DB9Jwv*:D*f6mkkIBD&C5ola-GK7ɉaT\#L9(h >ZVrL*HŋdzVVl wui4x<|JQ4mTk:СY,B\2%(8$ĒwwuUm.I%jJjmrek[C}CL=Si ܔؠ(1JIftYww@$~_i}C[4@@ueZ~/T;5wt- ήA,0CCOЩ~*~ 5565q6f(cu+hx++O/CzqQ aDC-Gof1-f$2fmTRR|߶ްY[;99[IC& ɤC\{ԑ\j Ƚ}nGg߃F6(J<u B3~ ]@Qw ) !Qύ/F32|J{mnL&2. t EM2QwmFۣpW*+%ܩɾz~Y$n;X-g΃O=F0ZLk0:JI$##6X65(E{{c>ѿ?ӽښށhhSoJJջ#s4hKYZ==אָD-\sG(ףRrr V fvvVF#lnގ.]tuƠ[Ypy~R L {ܡ>p9Buekfo{T3Y i.AT?jpWnd5/5)T]zȏ54K.S(tW 1C)S'l(;n#T?| x\, 4A%H?,@}o>LX^ xw]+E?}ayl6)WKJ>y\yTH|'lx-da^H22RNN̸uNmWf;:DMps56bJuA޽^߱5n$5+LZ*+a66qqʣ. WC4hHrt۰a_CCLYI E]3ۿ?ǎSDEϞ2A.)IO?ȯۿ(/o? xsB[o~dZѨTǓ?ȡ- _-x3iR*0 tv6130T%ڊMGի>uNitonxm\GM?]@#?bꯇ/]UhkO9} yUU ]]*0aB9bc}}dr-7ZƎou`?l.B::SS?{捻9/''8H==q[YvzViin<<&O;˜ںԋ?{:ziim][LFq-ݧΙ?~Ts+w-ׯvK D" oƌĸ8__ mۼQ6;w׈p  V\;wjkE"ʲzZZsMBesţ2+.q OwWW566.N(S(@_?&S y3?J{znݺqL7.0]ugnsRpʕ˖͞0ф|…Ʀumde%- 5kɒU+.usUoJJ>xmw*ccm`]hŊeƍKJ}\mo[/e&[z˗ĸdYY}٧DCju]pL~xˌH) xvMFe'>1x<1'IR 7gi͠p"P& mBasustrYr9`mco4--M-C7D"8Lɵ>~~V\ysgKK=S(._LURX,0U>fgukܒ%ソvMPeBQUuEYsmv{';|3gdr7lZsgĄL{sv~LafaE.:yR1%ӝ1̐Fgjpe7 =<&p\ihH 8;2Yq̬@++I s ˩"3HwyY]= שJel-T800d~ٟSΝc={ֶiTPOOSL^SqBZZC#":zk'o? GA86il,Wp&&wU(jjh)x-Kpt@O#G)(5e ̽c7|}EehCȁ fnnc=}UB?] vRqlٰA݇MX䣏^z)(Pzd[~fe{U%{<4;< _8:ll_~MewOT&s49:ľۛæ}XLs̤12؈qƦ~*i1a&P?z$TTQP;[2 mcJU5*:fB IB!iLn|ït'X:2)*2k{;TG3hǞP R *kנBׁCW,,sZG ž Ojh N @cGOj%bT5i@ H4 H)p#H ]8}veU]=O"Yۻ͜:ňǏ~,9y7w%'_)*jnP}|g\|K,,SX!@& F@oHͮ/

vL]=Qx{; o˿?~rPoL-V$m۶s[+W7DE2~?{^Y:|ud`d!Zޞ]YѸGg= #"\]ƼƦ֯V՟={<9;[^|J ~##U+B >uLYP_2z ͤ_7׷ĉsrs**[[5o%K6oY Jyy,,jlloɈD#c6oƌ9QQ^^,TP߉Eٜ+9ee |Zml㹺'K2ɬMK;u…uum21ws ?giNQ^4&v VU.\Z\\[٩P0SLHW_ V[.NT"#6nzhKI|kgA //zT744\ y\r?:VQލ>c2|'_ܺY\ݙ?{5g6HɔſhX||$C6֎BFSzJK+'Mb1i4_Yq }^߸i̙VDb\[}<9%{|֌ FFE7/^J9u;J>JM &N ?4)'OOԷ6[79Ĕ'3wj HL %%W=7_|ٹz[c0) ͜y3SN>6n \ UV>t-C8qM[{ggWJ3Y&; MMM,^ikw SZZꚚ <8ukמcm㑈*UMMsK[Z1P}8خ!x8*uF6h>&I>ALi O$::ŭ߰|yP)æĀE^~ebߌbD[ٓSWmmeo׷t [tX+˻aijGi7\>nuwNܴuѣ97 ;B& fnj/'$]qd'~٥_vw 8@o~Ӈ5nZL1,$d횄nZ.IJ!Iex|%,l^XM[|-  O^MOOGP( |_o46|pk}Y~rⷃRS=6l= gu}#"zxd;w2SSQQ 17΃A G%K6o~œ'Wطw%k6J,?zdϞ/)q_ҏ?.Z?ŗy':5ǎda۶=ͮsm1F סxAg@bE|o/>\Pn:bCfO,$axss?pOOC._ vv-ZqSl?M"=0W_ˁcGKJ̈7GXYf'?0& _Odࡢ"ԁ`CT5i0&uRtuMx0N #B߯lQ='\~BUD@xaSmi0*++=D A i<>G@Jϝp>;ʪz>D0wq 93tYBaIYrovJNNSTLϜlKYX'L P7^fח_8ef?ks\ x_HN.+H4/.U/ڲhRSM\M|绸tu;ǫW-[m[F@8jxZ[@& FA:23=SWbuqqvT>>4ۿǏ_ӧC˨#I۶y떥ʕ?߳7}}t}1QQ _t޶ĤWֹ-}OB 47Dks+4;a4cDDX ؘ4g'gg˖\37todjBӧN)+SUOB TfUG}{qxĹs9%,Z2˿gfTV56wwdD17cFœ(//S[J?N, T_I.+ojc#588>a^┩Lf]mZک.-/kkh4[9sOsv=ʤ1_pںNpcb&FF>jBQZ~֭v}-rw%doLJIG {KF˝16+ 03RNףZYG'*ʻQRS;;gcLoDWW[7Q;g/X}OB JM &N ?4)'OOԷ6[79Ĕ'3wj HL %%W=7_|ٹz[c0ÑHړ 3##77?Rpwuw'"m8 <=/Q=Wvux1eb|<Ԕ"՚6~>8Y9ù_.Xx$JUS֮VpL惻G_?kywտ*q4_ˡ\u4I:phHtt[a Sֽ=cĀ7ӓnݳ'''7>:ޮot山VwØ-NԲG*7nZ2| ni֣GsovvL 1<,l_NHdOqlmɤO>Ki_:p?`g;嬬Jj ʠoީc^O prYLJ%1q>\Btխmy7DG7[kN%0;`\͟ !Ͽx<;a%O=] ECioT~~|,̇mjݽ;3_TZRK]?~V̌vvsLG'+U Yl U$;qASS`k+CCʕԚZ2{KS.(@7ޡa 'OHŏc06  .?temag7nܢE7s$? ˳9gqF:9zu댍O\w#+3xATJxK|!lmg o{q_}ݞ#9rux~x ј~>ёc%GJ}?)5_vTNA,L>hWex뭘x2=H$?D{k13N꼣U-_:t`OIv9x,C4N(y3zqRŠÓ<|Ey׳JK58_O/!h;FnB4񔾪@p;?!-#"6٧LD3@EFO/i0*:)::&`d:::&U LVգrTz@ˀ_bC`4:wjQ)בIQ'rtlk{;T0lA>cJPY g!-n:o5*' \~"TD@x`(LttO&4C?wCk @i@ Hh҆ƌm{;|BymBaIɯI[̚?egd*Y;m}eǎ瓍.2׮}ݽ{32[[GKi?}/YYMMRF3ꮮ7[~NRRYP8d%~jE[Mjj߸~{|s>xeKm[k}&@We .\T9}[# MMqݻ%s?_޻.t #I۶y떥ʕ?߳7}}tccc|}F?tmωIIsu%V ~ 0E{k^7ϗ˥PGTa<ÉhcN<ΎthQV՟={<9;[^|J [Z|Ťgv[7!dUG}{qxĹs9%,Z򩼼˿gfTV56wwdD17cFœ(//S[J?N, T_I.+ojc#588>a^┩Lf]mZک.-/kkh4[9sOsv2bpQ^4&v VU.\Z\\[٩P0SLHWsR5\Jg:TEFlkі1~]]q/n,.F]L&SwwLY\_~Y]a{zO24`m(d4\ >}$FSΟow{06͜imED[}<9%{|֌ FFE7/^J9u;J>JM &N CÑM#;/]:ޮot山VwY7w?U*oܴre43ӻV;Es֭Gd, 60LcyXت/`kswɞڒI|gΟ~=*=,tugLY٧Or׸kml23Qưkf|%,l^XM[|-  O^MOOGP( <,XKKuS4LVXzZFs_F{zogWU]m]kHTPSZ8yO44m GAȽSǼMhca :J$b|Z#4757 jW[o7n?==IG~ :=:W^{=.ڪ_^dj8@pr1#6]~wgfH*-)P?+ft> FZ|`Fb1‚FN8xT 0P*mj**r%5V ,Ǔ. jwMS9:Je]}V֙3ζZ[͜B,gg>7oGFzx5?0vVaTw YDQW"(*USc7_hJH D##w͊6B*+on4jKS.(mo0{d$X86Û{zd:t\n`7nѢbc9l_;ZRdFD1<ʲ70<11@}=^{=:Z$p~7v^7󓒾PsHȺu~ۍ|?Jewڕ+ܼ߱?w]i67_pߺ5dhjK<Ţ|㰿=))IGsB!? x{hb_lGeT?䣏v|UV鍷ފ{ד;:Sqy֖/Y:'tTౠ 4A񔾪@p;? >bIQ"ԁ`CT5i0&uRtuMx0N x VգrTz@p?'GK*&4Cj*:v`@CϡT֮A-3z#>u5*'Wפ::h@A FO'i@ H4 HF#64fd8moe*k KJ~Mڲe,?)S?#Si+;v?lܸti|)'FFΟvݛ}j`OT]s)m߾O%+I*hFVZuƾ}Ϟ=IJ*+ GZLvoWZh˖IM 66q7}oϟu^lm`zjxzO|֭覦C_߸rܹ~ѿ~KFju}mvur曾>t1QQ _t޶ĤWֹON 46 gbpڼr)ԑ>?pbc>zةSn|#11ugOV-_gBoh`FFV._1)@(-=}OB fUG}{qxĹs9%,Z兲˿gfTV56wwdD17cFœ(//S[J?N, T_I.+ojc#588>a^┩Lf]mZک.-/kkh4[9sOsv2bpQ^4&v VU.\@Sdz' e"Y[gn]VVmݳZZ@DF # A~߾'{Ϲ(+khr ɴ<5,νF.:ztݺ[헼fͬY8Z(޹sOQӧrB//#Cn g{{* G__ʊرM GG/ ƌ% S3F-*;F%U̌䤤{wB"?^lYt *lœӧ.\pu 93, ◖\r^>%H$||Dh qɪw 7鸡 23:xUHhhԩhtwOEyZڥ.l>+gpp XNfd8P.$pt#8zEDlkknpf3#h&ӄfc1Je}}k[GJ@P?Ly?Iq #mg/H#QE\Οg@t}gz=ёF֭۵+77/)"„cn6 zycc9ƃѬ=浭[{Bt…!goo m[ĉܜb~ؠe42 ZwMgvttv65aeïW&%egG޽?&=55+F>NP#RHkq8y]H BaqM Ix<)HRh:"Pl U15ds iHTq@ kltDRXlBA E")Ŧ Ba?p`X4z90/$su5 r,҃Pl///6E5r5 O *YXXSC".^bm=1Fx<_)J$)\wo-d5H$ Ot3 ҏLQZ[VZU+ꇁV u /iƠ1(12 AT*H&2|8HgDL//.˗ hZagmk+Qt iaB2XFFR[[oT]]m<et6j?PXT|济iiA*MYY/&^jk7DGOr GN'O=z 6A*jXקP(\V(xuuu42&G}} %%rRYYʓJ*0/ŠX##kkgg.B\]:"NJBҥm['O62'miVƹs  ŋߚ37(g׮-͗石f-/7'xTYK lg<H \ҥq5 ]yCQ(77`y-֘+{x40*|q}]GАL~"}xiiU*eP[a :l0}76P}8~+ϯ&lWIi](R<mëW"yQ0@D HD< *UkSkgkr9x*(v7o^vZaa 엷F_? >ώ)CODD(MgϞ9q^"e+)~>7̲@Z}O?m ?[C7BoxJvRY[wMXãļvW}6kJTPpz⢚ږ^c0,-<';9а;7wBB'Ne0ҮTV65Tzl1L7JmlzƎNHdL4irH.ekJbb$'(+khr ɴ<5,νGvBQ] n66uv R)M"Q,cdԜӧ{+)66¯m@ |G>@`.owyyq#mΝ9ZRRWߏZXOfd8{lUO[gN''45wvJ$X>Ų ȌYDviE81+WZZe\\C##F8Sgfmǎb0s|Şxw_/%2_?k=5#  nm3iJd#}Bkkb҃jQzگY岕ˎ8źv p+REYٱc61^^A&K&1fZ**jTj./2rXHT{jj23ݽ xe& 7'9}W@3P.~i+Ο>SRD'0(,lڴ`4]Vvr…sgw8x@d;\: 3XuNFwT]x¶mm/^r q5}ilv@hg9mkmC" (:(4z̘y?^B9qsrEXNF"PD"Wp劦䔭9%Y.uw7D|?矿o0O?=ɑDƧywZynHK۹co'OxP`bH ŋ=<<a-Е'\鵴HԩdrvCnnJrJ}\W71 ӊ`{'O94~|P`daaXlooUU굄={`-_4"˜F>F AFƍ]L?LP5?π6xϚ{>w LjDڕa17z  zycc9ƃ=浭[{Bt…!2coo m[ĉܜb~ؠe42 ZwMgvttv65aeïW&%egG޽`l'֔VV3gN3({66wA12dhT~ TJ2Y}):g\ BRbKI>}VV$R_߷3)133">$iߝ6-.:j+, c2kc}gX>l #Ág?LLHJ,-{ g"r[n˱"uk3''?%,̘5`F(7wkמ9mhλG͞mj ?}0"Pl U1b 5A! *.D{91a뼺ŢP*q" ł\,QQ![ i E1rMR?WW W29lcۈV_z='OKy;9ښriT<߬kknUW,fd 7A9&ffL&B]v?"tT(jknެ_e Gd*V6'{{ܽ=d9:A^4ZqqQauUKRlizlGfh4r =>bq~[?%}(|ё>4z3C"wgd疕VU54uta`U*(Gu(s?Cc Ny] RIL_@2wع\ז@]NrFs{\r,g㭭t_!CYw7W[Iqɶ-_}}/8|Ꚛr緶UJ\K YX  JeSs-ǕHOl,<)0f@QizJe^}wa{}j5od=(FhT[۠S}檪 lԤTXGCS#(G@!xɧ+VDFxywh4 KS*BY =ݑr$R.wikl?cj}$Zb|U${?P^&D>dӧG5'''Y +ϟ?zt[/k Ompw tr3ʒe2hT aa0HSZy<ᰤ'<0s05C"HD 'jss+Е[Y#7Ү74 _D&kkӥ۳YZF"qXDbaO>F aCaaeHTVg]?Oן2y2[ C$D1t: ={A_ LHxҴ% i'\ }ݼq=<--hT)+Km&3]]t0|H&xС<fBY[܌[Xx{p1g2K3ғ `744Ҩ~~fgmz9eϮ[p/o KC#<^nix&\S;ʘ=& 4FơC ;w۫Fō30T;;k1hg1c8Ɔcnܙcۖ-2YTT`!ſUzj… VV0kk//ww}j~<|XW/:ۛc %ũS!Q3O_#~@?44N`x3gCѢ" o9՘5=] sFc}se|3t;p{5zL+ Ǎߴ߃y<`Lu(4@< h ɓ_D @KgH0^45K `%4lnV+Ba}=hF/--JW__(ZX(/mxf._ikg08uJho^Vxή͑r@#C0 DxTt xހt7@4 b01m,â-)*5 ۬D*>0@"1bK$|B }}cB_XXXRCjk,Z9gdQW-_毃E|gQz{F.Dko/)jc8:NV*N|k".c<^&P߿r͑Q_]**xQ_y"Ǝ+>OjjMm捊vD&9ދъBR%^a$^kAA ׮ܺu]$R(Ä嚚zxrM{˾Ju䩯~s:c0wK,>yېT~ʕӦَtT`o؟tUa<~ܻԈB[n@7-,= ,,,,UήNu<E8pWR ))əEUM}} M"0NN~!YY꾜'_BonxQb\M!ٹjLnnN$m?y{QY B, Zx11lc: EMX׮O*)e[bܰ7l8yj ԍqZI~ zE D}#= NLOc'M24@zzk2vȸq`/[(`~? =-m׮m[g7)SlmH?!\^hhhH{{g׭[J FtJK7rvvvS^ẻmǫMM BA^'OY[j Ugmݲmsuxw`1D=MUUowv/k/%B$:vtw?2y͚bqVVGL^S3f :o+%79jl@ 0fν{ [[c!FV_qڻ_haix-5 ΜE"#W}:wnHpggofT-;R<=_ܹ :;w@@xXxvܶCqg'~?[:TUMǽlټ~4 xt}\rExիV#ZAJ EM/\pB KYSUSV T*GGGԫ?O\!x ~y=m[.^89͝ٳ9D⽢`D I?5Ξ+/msx Lnϝ38++J.Ӯ%:(0!Q^(07z=]WSml:mm{h-*b1GW"g͛Μ.-?‚ɬ fzzlYj4  aFB$!xmsWWoo?<%HgiIɥu:>=LJn{>72"2bin=W&+ Y72UA&kn|y玝R)cǾDEqMpi8y/d;k5rrs,.E {{zL.W# aU)xmV :,4,<=s;T3,ܼy3JHsF٫= qtQ-ҽI{Ǯ~fsndǖ["ѥ}}JU{?{.^W}ǣd]J֞}yTWשӸ&h4odjc8t[{d$397C>z/w&9˭t ]]r9EͶ0mzTd;o/6m,*rt|ut]0#c˖Q4j/yy2fGr|vvCcBBnNs СHDbuU O(4r٭^wxf+\KX,9,'hHza˄>s B^Ua62׿Ӑ˫ JJ1c|F2)7quu rsR/ww<^ z ޺f 3V>I9~¤f^s2p~\&U|JN4qR3ΜQ(Y ˘hEZ2'P(p"M#5FzW]~ G*bL+K_)Ӣ\\ 1l.qdԴLVm͕+n56vuDic5/.nڌhggf.)=eO[U!cl͸q̙fe9[۲Ϝ>ϕ+EEu_Ռ.qtDEȤj'8_6Hsy..DÍ2 nn.,(,yZӗ޽yyhcD̙͝AWT=~?6v -X;mx6x]vfd;zd]gl/ZpI^ o߱=1}Ppe˷lr=U(43?~ʔ /~X_?33<V?3 x0 HإJeOOyHI߇KMHlm65(wk⌌NGOoIz01F$)qF> r{;;;j8)cip}_m'qMLt}<=8&Fuݡ F2,~];L; IYWuw>T\ juX13tRUU56)cl\wJU E"mm9lHV _8o65ӎ'Oq|iCaK+***~C>dIqIR JHo$$&$G|Od+2 /,&:&߬B,9!SUU64nVoLq#-7fqex΁F YRE 9ZD1BF5BJ!G/5_ w Uל믖.=3 X|iT"јtϑ'O'O}rO>%L8NNn‘ϓJ]]tt'nrW_Nf }>S>/74 [_ ϟzuo_}u6  ڕ~ܾR{{{zz*J"ںX[p9))yyz׸R(7iSJ2;aBDĔA!T*Rmۺnٓwz!9BFWP/ߠ]-G`bO?f>OgނL mP0[xM<^mYX E )^WW e⤢ Sq8RWёn4~_AMwvvu3䂐H*ək@64hiJ(|L:"2<ޖ@x{a& ΚƖ=k3UUCL[QTR!&yygO=n߹}6y"x]Ggeee9 9xX..nx,kR] bK%ǎyS u>muGgIqn&$%:z„c,M,B!O)!f ˡ3TڪO@35Auɋo-hjxu뚸 e0dssw:=,ᬜ6w"¬z[We0t4~sv"7׍ FGq)WV%&wuA hԑe@ JvvP>>fpJ痕]YYQW_VvfsCv ygdAbIDAT>t:=*zuJ$"rFdp:d"a0ͅh(Tsӕ+iiUU]]L3,I~4h 4pzX:ٌJ_*}-X2D 6F oaemܔ}+i׋1#ߗ.[(&^ox 2Zzzc#dh80FH`L2͛WdeZ ܌GXc|HtZR)Xmӥd;z/KFë[۱}N+I@(@LS"톀BId}>oimkGvC45 AH(lj.-ɽv-ΞŒJo..nhGàryOŗ/>XRR*lOϰWWil|v6d"mrm>ڴU g vﶱ3ḺOڷ֎D 3F\ F{'^:r$=^"..DHBOoA~Zz~95H n]-:؇7KR(( t)..q,|qجc 麺WS]mmsvqwW1{,2V|kkMM&&3glnodbiICM8"R*kj YHh"WEx!,::\=P/uueeyy7 ++[[dKˀɓxs`s32yd`o_EMH{y"= fmekCi~rj2F_3J޴H[h#[ /\ .ZtusukZROէJ9998<$}$D~N56 -_ Gxl}-I&B!hoh(,JO)-miA"lԔ20pmΎLH jk;;U*g|`pvT& suփiEzl@" 8:H!+DzʈccwwGhnYvn~B]TWR)MLll" Ql}|ܙLj>ܸqrrvu!\.ԚӉ/6e8<p _]q;Z-7Ο' 28e Oƪ5wqR_Hyu8+T.2"}ôFŸ0CA+CZ+OŲ CCJ"pLFܴ3܊j֚hpהЯqG>H?w̊ 5f G(}hv:ZR-ihfhGc.{( ҏg!CsCsCWZ XQCA2i'?/'=L]u8MF੉CAC@&M\_$>02 Y엟CBOĪDUg"S;D ãɬxۈ`o`oWޞHk''H>6a5r 3imo`Uxv{{ D HDi#|$|k,4ybFXZp4W#L8.ے?=۫ڔ߈x 9E$:oeEN P֋$,9 JxoSZNz!f3YQ[z׃Egؚ%FŰe,sWx"8UϠ&uƤ3ZdwԬC =]=J.ۃޝRAPvE{ Y$~( l$m#;מPh(XQhv Yk r8dYr^G)leD|.<4%ޔb87\fw9*1:+>[wq.0ѽ+T#iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later -< iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxXTWp4CUA"MQ-cLLv61nili&&X.*D{^9e,T@Lyp˹{<{0(Cp`)}C> LZ{i FX5iv1(QYEZ1E" cZD Ý4  ب24#]ҔW024z&cdJ ŇGCe/~ى4  l @P垛BCHSP /F#H> y! KBNr5i>a)(*H%IS0&77w424:;H#  t,>=:P,o6A/dsGg[{W7dptl#<**JKmeR$I7ںںڰ J wrHd}_h_?ĤĤ_lRTD??? /`qҪ$Hl0MBmRM,-|.W(d1I>C֐&VT__[WS[[2 T1ThiлZNsDNcbe%[ mm*"݊ںں֖qƎg ziM**tsKKksT*[RRZZ\|≠^MOv촵w-:+/꫶&66YY2V\++ˈ1c".]'MZZ|Ob<5)C}Vno\TSS[[]}!//?D,NZ:2Q*ov;/WWyy zPSKbYY1 СĄ))-[ܾiX$H%m*jsqcǏ'::;;<WOK/UG=㛜7ΖJ$:^E|vNnmZ[:cb[[&66, }tյUUM-MGWI_,gcñy&8yˣe\>}ڴӵZrp8c8lRWp \_=P"e FVWIPfLʒrIcSTгDŤVmgp>z\#yy7w7‚Ktwws$gTogZ 4ڝn5דا9[OO77__R[S֮ɓ㓓:)}R5*u{{GG[{IppIkBmPNWVmw`H$RS .(umm:JiiYYI }LŢ_+ 7488  \+&`&u?j+\ֹiRnk9~H\\ll\ܹ?<> <>*"}w l1.:@j_XQl6eiYbRT$ZՓḄ>&&66&|;LѺ;T\  CCCLKJJ .$}ee))IIIL&]ᛊ=w+]CyZ|hjٸ+ MokB1sٳ笘4ui+yg uo+Ld>>͹Ç *,fO-)d҃w,FZ3>qqt >sϿ^nǴF;4B%}$_5ѣƄ5_|ӓfVggWWg'N&..--MMNk|M 5OovkNNVVd;\.5dc_^xqų+%g'moz/tt?f9kk, :qإ(-KK[_s:Xc4>fr=h8sfӦ[ϟ4~~҆FZАwӿdTU57+L<***::4əϿ K'tY=<;YJg -ܩQ/|ޥK=c顙6ƆOm̌/WWƉD+y$@P)Lٳ~{kS;\6ekge5}̣=@_o`xbTPҒrKJKJJʊ>ں45sXhhHhWYYEEiiN MO3Qx566xSRFvrl4d/  ɓIټ:5 np5wp!/…I&zAA?r/*J$VK&F_oooR\(,// (. JG# EV܁tQ1BgyfVֹ,{8&fIΜȤ. y$C&ۿ׮;;)9r/׊ wz?w_ߝ`89GOxŋIh[{vΝ?nBFEYY1Yǎ}߻W7oBn׮ukr/oab{{??'4`hmqۚ!3>xDxq)SbbmlښKϟO?̳yYs"ٱwOT{ suSO>2}V*L;q@o}tp` XgY,?k/mm-tY$lmZZ[[]\]/l4laq#[p^ &K֑q_]]]SSC[3XүI=d&ɑ#L& >ߡ #%%$'jȆٹ9YY>^^WwP]99$3֖kĄɓ?pppiZ` &<^^ł"kC}&?{q /W(F/6?ﵵuv65ݩ3ug=b>[x._ݷ~ѧ^M_6[t}~ڽ{ΆFdvMÅB@(,.)-+.lRUu;㞻;d^2ٍVS?B^KDpa@Rz$1c_ZX_Qeݽ]]ٹ[b˽-_<[Ue{< 7}e|r}dlS1rdxxttG7m\7?|H$W69~kϾʔWNWSwᄑ͌!!A#K> U~= =H$3fcaW޻hă JPz A:;;7y!ܹY"kP<,WW}f0.%++RE]mk\n+:;*[ǧ'qg''-\˃{>()f3˛WHY?>*lqMC5 8z'$&$'utY |֙hҲNGjz曑7Cω qSRngq(63O-_;_~oּ?D,q8l6mr0-R iQ wpeaef=f"tY&‹Ͽ0=>cן{L٩Ӫ+~%=BB?\J兼sY_OCC* =6߂/wtRoѨR)Jd9Km?x/۶~qc͜KQQ*>o}}*2~bL|ϟ:ɔ˝*Xrm݊&[T[FFP* z7f̋/ttt)S-~Eyxx7 >yrkn MZ}@gz-SN˫K6f̎ċ0w6]Yċ9V5j'%%''&3ۤ3n诤=}#ԧN~G]Mݹ&<ޝ@bdVEp8; Tw@ CBCzOW}!:;)&6hGHQo}Rm۴iz2jixxx׻׿|y_~~{{ggk+}xW)S?c\<|h˖ qKƹY;fW_>1aBLi&JUuuǎO._ҶdɢG'8/x{޴AAQQ'sĉ Fk[a'KE3}zt4^Ttġ׭GEF|VV,_#u^/ɬރJU\ӮNYOK&ɮ賗'iӦFW;Kv3gAdX888:Qdff6564AF|ܺe&N8}zT^RtÇҾ]=FFS[[R\^n0:;~jk(8nulذa'X:9ɹ'759~ݗ_]_8nܤ)&Hm55/56p8fԕڌ3k%L\vP4Gf ,.Oj[[KIFFN΅< ?]]r/XtFRuwL+KE}Y,'%CR)$Ò;uS˟!eE(2ǏoݲqÇ<|g׭['no}tp`ేf7UUnj0k2il\ak) EwwVfV3L{L.wppt,,,**(8tQF _3:Rqϧoikme0pN+rg]w˃G5'&`gӇ 񠞈UGD9vdAt`gIZwv|rEΝ{ejz}fsEEEERD"dwz:3s&~MsHԖQȞ:S}t̓=?x啗_~U[[r3efIXDfse˖.}'xgmH|rْ%-3+Lش<ޡ<ŠgZNv&y?[Q*+=x`ۖ'\].8щ;ҝ9i88$&.lm{*do͛ӏ9;(˽u{{dۏ?s9 Nνu}\\,,{on.:ϛ0ƦNL/Q_{w?w1-"b|yy`1|wlލO񒒟!6F.ZM{6=CTHzFrp x<2[{ r[^hr[\-V'IDAT;Oo(l}/z4l[ J[>|vvMuly2IO=`:3G4taB[[TB~䎎NBa;Tq6?L=Rfܙ84-~'.!x{|i3tN[gu@3QPXXTX]S[[WS2j6mܸv-Kd2K<>_'w<ؒ8gQ=?xtw'*FSQ^TX^{N #AҫFDEJ^,/+=<[_ ׻˚kogo/XX)*%}3%dnE7YB"YU|3gEtyߞU#g7jH%:[ZUjlKKښ=7S+~ik4r8*B!NކN6!5<ϊkUל?#=:|hg']TyY/\?ۃñwa0:=t* .h4nnIah0'WΠkg!we1988u܊rǗ! /WxAAspjkotDLLhgf5555^A7k}c7Ѓ }Sg.䖖ӧcnoF>?T}3Dg>H}ȼ<---//.y]>y駟{=\HbIł¼||h^jjuZl3&z^F 3'|\hҦO6jk:MM_oɓXL2t$?#bM՟{E?= u/?;3"p4RǔVo +*K+J͛7VUla φE{+xoSWg &Yed|=3֭[~#Gӏ;_owrv"tY4|>'lտi2 %hscKBwqF~8:JeWwWb%|C{ DJ$*RRѵo}]=5_wX}W덓^}я ]ZZ]^ޡ#UJUUݷsLoe辻|S!Mǝwnse0Db[{[KKEEE奚*.,z}]mMM}{y98U|[P 0Pk5 azScaaFFfܢNjTulDܳUAhho rz]/l>S dv#G:9=zą<~Q /T\ըn< G5ÂgNgd65=YݝQXla x|I`as,l>ϭ8?D`f7nn;vڽcq';:厎EEŅ>>kV{ba! Ixme˕`\wvȮ/ߪ](w$E)UU552ّ#$ J"$Hjf6776@+*8LoGC9:ѣF9~ ZRTiӧO>-yy;l鲧۸qZqy~#G#kY yE},Nk0xI*k_&Gg'Lǝ˙Sb&K{=w{߿}Ν۶͚5s9>>{Y<ȣ NG.?.ryyEYyyk+o|c~T"oXHhٵ.\0G|3BBI9+˰ ^hT( QwqHvQ}z9nmkk7D6ROY!!',Z<~^[sDd[o͟?"7(F3N./;w…v70f]]]]2[ʊO9qo)#,,!qĔq$E.}WZfL7 ݝ}ށ|JCܜJ?vܱBJxdHBKX>))A~|翜k$#P ׯfMQvԨ+R=<ܾ^Y[[W9;K$g.qhlj:cDZcmmR>=۾ 7DUI`.wTȈaM훜09!!QHιnnee.Tz˗+w{O;'L7󕑥jF5%a;;;;9;_SVKf9)Sb@3\=bTMbPVٻSߙV+6ѩ&!)!Z֪UNN1qqm߭_V-)/)h;;n#AmQႅ 捏[Q~BE c!՛vmu{#瞪yI 3u9vE)S8o~ɒ ,Xꫯ֬;om*;[ZJs͞]]])nEw9=[53s= 99OD*,-]\,,={ʰ .sRŹ&!{j]Ivֽ~߻=v|~@@1vvEkNܳgVWg"::с+?wij[r>WWzsWWIw w {e045qXc9z}cCaQNnU50ѣ}|5Ͷk癅\dck48y|Ɔ1&7Ÿ~]jR}{Ft5 ў{ 9yyv핕66#G^9,y/`]>g~lRc\\mYo =Xwsf_ V(JR%?Vƿ}zvv ^_PY.=~uĤȱAr.WrlNt}b<̬L{nLx12Ҋg~F#MKQH(ܽg߾4w77ӧN24.4!8CC}NNff%Ҡ7ʎް7d0 >´^^\}ge8cGVZ͵q{zNpYcǹ_]M׽J1{{p_u#Wosbϙ[}4gN} 7Ą }oO~tͭ7\k~̘Y>)w8S/]IOliQ)Y,{9sf;Ɩ߯V166F8sl]\gL_8~;{18eʬY }=sĮ/𬝝KPqIIJ޽JŕsD$ yp\cG8vܹ={ׯOOרl@*utjù=[b0죢/5Gi͚\+K_(~ro g2/\pq,`d1 k׳5'֭KO≫dD -_[/ڷu 0P@,JJ};~2jԨsYYYA#FUjFᚚC~52lj׆YY_ `;;'K3h9.qcǕo۾m[Q!!q111ZRTV4T74זTB-%q''Vo޺yս,-Gޞ}>X v>Nnn"61'v1ܲz1y[綾35s5{z7ߤT DX޾q7nӉ'Lԛ_t??e1|7- {r_wwP52r= FFVe2]]SV<,[K&%?bkIwy[5KXֶ# ԿnǏo.[ŒHg"_os l%O\9q[bŦ7/ZNk0p#B[~5c.ft:RIV,ef=i`g/:^O/ciEG +''*ηki>Zd-+_zz>{ßW2Țoz]fggog?DgR/jO[n-q:t]...]>66BP٤8g}^Z~PZm4vtvkRԦTì˒"#=a/6ҥL =:LW_6m3ZH ~ ÞBfH*!ML5z-z s"}0BQX}Xp2W =~@gk b&͑ofe}?* Ry{l11!>nJJ_=W(U*.Ғ>A#z"?сѡ9.::T&hԙ<.՝ĝ%薖VFG:IHy|S w*@.yfZDdYƆFʵӑJ<%#~{7?[Q3g;Do|~#^~yg)7;'e=?R}~бDi 斜̊WW^ɴ裯?~؈pb%crk1dH!C'"`L``ѳ&`Q07ב֭ ͊a?KO 6z Hs` ه6N4Ƭط4 uLHkk'@"f@d(uR(aL5)" c>00110  g>]0utIENDB`gsequencer-3.1.3/docs/images/ags-toolbar.png0000644000175000017500000010012413607210263015713 00000000000000PNG  IHDR.O~zTXtRaw profile type exifxuSmr )z=qLo6:<>|j?{C=M-\2ш"S$˶d@O/6%7"B",gu /N};۴scSdt8 K<"۔V^/(zVԖ`j64fQ&w1L%˜3#DV"75&ݜղ%{[Ǧf1t(`o&C(l*ʮhOV3+ďEDbdTmHV`ؐ(CF%g qt 2vlFg³yhh^qs&ޔb87_.o?Sys2l]`Ѱ+priTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later Rb iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxxlK%۳ɦHB $CDDR"UQTԫWtDz'wH)図c,0@$9g̬O z=G@?" IOQZWUZr* 55=L_?55֊FHzLS`dFejz 9j0&љfgo < ]6D7\W**QcxFӃ=^zj2=[`d~L8=|&"='6ooB ḟGA UVRȉW}ӲY66sk?G9acc$&IL8]),oxe|/#kE~aӓL.Keuu([[MA#F 5ߏ26[hM\ >Mz晉Nb0tz9z0 "ŭƔ#G-lyu͡K{ö<[vw+W0\nrJJjr FѨGhт lZZ>|͚wŊz 5A觽j4mVfNvFs9QHdwf&2YI)jUUv3%Rww-6bZmM-jdhlL$ƣ1ёce=;pp3S++Ɛ!!uuuuIg{J5LhaOWV92dHIŤql@uFyyZmY\!gK" kmmk9.ѫjn47I$.._nx#h4.bsd $B9|h2'ed::1NÇjgH 4~vc,,&?qJ{ %HVc4z/?WsmkMEd:R*QDK D ؘL61APQ&;; #aX,T㴣}` ʈ:j=?e~b:;izff&&*Nw&Eaf,56Z[EV&_SWboZTX>sy|kgkgkkWV^^QR?F~`T|\vvsΖDy4A2ں9ߟ1hX"p7>hБim!JRP vbH$v{;WWWmo߱訨1M.G56W+F,FG#a%[[ qtw73s%Bz5/E*mmUՠ"?F7atv64qq!!n,A5![Ja2CB>.i3E^{m6&{NQYdyusŞߚsꈓ1!ԔԤ㟙cΝ۷;ws3fL>k ¢K HEkJJKƌr9 ?wJerI@W65vvRiCSNΚ5GI/L}- 7՛'ve˖.]IL<{vpDž@Ȥ#/wq^`&]ki))AgT;Y*mmşp_hu^}Ug452pGEGDF0 ;~رNyik]S´i<@ Yۦ7gffeav^ns ^1 αo$_t1));dȐaÂǎ;oɒ9sI_LVQq¶m?a7oWU|wt̙KsyyX=ϧm;5<4ģxugSS& tDłNT)ҨT23pZFQ#G{?{򙳇8f͸q'/X`aVge""899%%;+7L.72V?𣁩݈KNvnNV&mDg>x*yZ'=ml\?xd72$xXXOЈH#+(>"""25wW*}w}u{=+Rt&Q6J߰ 7oYFm[Ek떖zT[a {:ht\/[ۃ]$21ARsE-wq~f2\چ|Bkk&t-`O?efkM'ee=8xlbBPG^Ǐcrr7mڶm~kdaT^[l \/yM_{?tpoͷx<.IMQkظd S?X5w? dUWM{vrZgps%j+k~On-,^$qV(\pfݶ[ZZaנ!^#G'PRvoٝ-ži"7oÆ_9crgi+ilvuϞ͛ꕗjk7lܽg 3nNt:ᣏf^e+3-zW^%Oغu>;7@.߻w3 !?gt'7#UUw&J0EE,¢"2D26_fx<;^s`(%0 >Nx= :qhaԴ{{ggkkuu{kע  ErN+76dqXŸ5@`_G&Toգ5<`pZd%d=okkmmk-ƔS(&"KkkK . jljljjƷs0??_QouXs}}}C}ZVo r줐`2{JBUE53gϞUL}|ѿёG5B7NmA$ExXt77WWOO:Х%eSLDg\h.4G؁/w FF/L>FEuȣ1+|>k27JMݵa3"FSSF 0}Μf)S{mkoj%k4lXh{GdW_Zr*a1aaɘ1￷{EӦ-]_o[<,mlL&SE%E Jc0tS{KsX48IFdec۷~(pKyJ%675_8ѓ}U}NM1uE&9))%%3/Y*j59yY(^JPCu{ ZDEFH$ko\\^yYYiEs|ر&Դ̤уݰ1Ҳ6dfb{D*QIBfJg\9B: f^[ ={x`r\! J3Ug2*+KKi44ss<<||?2cPfFj@w%ŗ.͜{Zm]]F`bbj&^ɤ##ͻrqt73h*W$=Qf~&&EQaqqQaXѡ7o&%'%gN=zp^FfVvf~s?{|۵߮]'IT*og{ڵ-[Z̉¸OQsa3K|_ "$dYGw軫Nё} ]\DΪ*ÿd'ҞKMjz=?egֶ:ȑ/\سk玄Ӈ bXq rOLV[Yuԡni}60߮p0xyBFO;q`᫮ [tF&ffTꝟaO"'{>> _%dff޼>dZ@ -b?ʰtxj]?V[{*\5/[T4#\B$1%5%33/?#\*{~W떭;ww_F)+kTUUZ ٘UKMM"Q$:a% ߃mңah#7Ξkk4 -͝>ZD&#Ÿ\]]]SSGE"e57}nEijsPBcbbc*ъYN1G(dlldh;FdINn45DGED7ag‹+=׮?2rLa ƿy.>,+;5%/Haݵ]]ޮӹs84D)scǾ&Lp_"8|șĺ:{qCǏm;B~&3==33-\(LIMMKN1e2f.usGx$QwE}vTHl܌"+:+[yy5*رsog[#/__XK$5:RYG)1>2assWG+@,6j", ^^VW+n֎vcit|yz ׀;U]Izqz( M~[@FgrȐ`{_ܳRMMDzW \tyl\Lt4ZZllmmsACs{*9juS[PPXXP9е:?msLtdظGySΣvJE6PlY oܲوpM:W=HFerqNTtvꋧcƲ61Dsh(2byů-]f̆[6oO,6eFI'&!1̩6j"{;t]VӆJNJJ|?88fJUS}_%&TWxGr!wZҒ}/TTյi涶FEFy )0hʏvퟻC +o\KO/)A6cYZ:9ƎbWW]pŌF5;;ƍ?:Դ WUwW~qos._>i+*+eg8 Kˉ[4κyqu4jWMxz)4;;?_fPO LӜ܌ !N":湩"nϯj&6FGO srLV[y+Ieuu--J%lj* ik4mm/:qBffYyMMK\N!cc'M9 9 o\3Lhjz/~1tu5~ۿ|o~//L;e?ukNYo=yGu0%e}}(:njSD ^UI$ F }pJ2曫>7.#w6l77nܥK_7eSI};.ϣoQw{m2  IDATO|"uʕ/L,ڦ?AF_g%9{2j\*={Ϛmc2yCWSS J-DqロH2|l[墸Z3~-(,*/pvrrtsE)||zF;:+*ۤ7 @{æh F"I VQWU*eF$vvvJj%z/_SSSkX+ }g?)z͉ gtEI䮯h|xz R"kh@1&C؜QbkT`*~$ N|B": ŎݼWmiijS*Q+W\ussuC84"(={J_>ܛ`c>}ӹ\1<ͷ ӈ*u^NB %*FsS-[N6B;;;77/U*L.O:} kTJJu7K/͙eeNN|6}_j ##,[x]kk.^ܲy3mmFGLFKeUUi.^k+*ƶ.XQJ|W'O{z4)4H]pMk/]almBFM8j-쬿c_{%K1꿪խmY,V[Jt>R Eq gJ O{#Gs 1{}`$̅V66DbrrSccc]ͅ6:ϖG81$Djm+*q3۶k[̙3nx-sL ѵ$']p`pEQ"FxƎ?V_/;z43wueEC=B>D./0i HߐpZ 7g<=-#Ri.k l]VR:t(QZN":Okl8r GҡLr'TĈ erU$cWxݤ)okW^ޑ}g:/XlyH7< DUF5'Q5ƚʦqS3fq9"+ K;L/##??-Q"BggG' ;OgEzk1ΞH(i2}FA+WҊ+$Tw=qؘNge{ʊʊrICv{M#dRy̙311ѱ=׆u7oJq8ܾѣm^OZO5ZիW(dгažQȸ+@+ njA!_2 4:uEf2ھmƃW\|rU%jhmh |\Ñvvŋ.3f ~+ u7%$={ Ύזk( aQ,].?uӧga s0 YH}<-u:S v/~<q h&&G~S߳gN4[ l/O?V}k_~o::bUX>x?22, ]Ǝ}fN'>+Wb؅ G$~#==sBaLK9늤'ݻ~~^w./?=%XfGu K&{x{ׯ$ge*NxZHJˌ)/ddT[{ fZC+r!v>vfcWU6tH&ڰW^z_c|[DDSRw_~޶mE 'Oze_۲u&/{}UŹ?o'T'U8;;:4awk^^>>tN3%9%y-,BK3gQ:Q~3[WWTt:njSMuxMJ&rU[ZbanULS*Uǽ+@wpR*P(tmCoPUWJU4|P^xIkkIBzՆ((+=|:$X@۫$'&'p8l6>*RD!&slO?W|MNIIMNaS:>XxE0 ,Y|yvŚů:?[+\ A$V$򭷗-ut"?5??[Pn2dsR䗖i4CrstM 0^!|}rssrJKj5!ÿ-y LPd w^[ڱ%,ŝ2)Zj@6 z>U(KصmL[oYXu]aX 0G!T@Ш TBN&f5ChT];qOt~ե+ U* @=[jM!-ʺBjuyY^nQRik;&v_HXX\zzv&쌪@Ye4ƕ_/dgGV\WW_RS(VV潩խ8W?bűW?a1ыMt /LY/UyȊe^^m:]x PTݽ&9sfi~F.\꫋1KJ L1(H=tVB"j]?GG6ۈT봨3 utǫoJJ=jQ#"(p[Gi<=ss򲳫j4RiPP``P^1D92dW^to{(.SM6{6^;ޥ{d2ccX_GZM`hMTt+9kIoddttd$: kZZtH6ߴQyXG ^˕|Wǎ8y^Vgp*1Q=xȡ*|V D"m\ڂDfzзX9̙ijg]wi}|{jt(j*=Ho=E-<Bpѧ[+rr32RQ2XƩS[D=ey5u)) s_;tl9+9b'U)J Y},s;__XS[[WS=sϞ]oݠ.y<>Ntt]vrzg $s))JI @q{ LK:%DbstTnK,S" T.o?<֨Jst^h4u55 :haA>1LA h(HTDR55'%%'gf畔TW77wt!z5aw]&L: I~Q1"p oAw[ c%:2}hG'"//+I +SWVә7"IMM:; wF;;3 tNn`)(LOU)-E/>{rMzjVVKN7t(h߽> @Rw F.&;FYKK 흜^yeK?K.Yx(7ܼ Ksq:&51S>.-;5VrʵҒfnذWo>++=<Ơsrrs4MS4ZX*WUU8;:8cLL wAaqI^~oǭ^B8x(d2dm uw߾/I0ago!B`>XX,ֽj{@5T=W^ocgcncM"QâE9I95UopW,YJ$]|K͌ OOF0UWV͜9suPEM+~ ];чԱ.GGFC?#)<:G5%EW Ǎ]Ȩ Wd1,شY+VFF.omT*lx+VX<JZP e;{8dl>%5%5)է}f;wn~EDGD̘1}Y[l۶u+:IVqHtttVPW u4*N\.'{_1Nll޼Yg|gNޞ~Ù:矟00^z/ʘJ%؅LW73j;HǠ[[KڻG{ƛ w_Ѣ}A>x|uR!WU/o޼w"=}*4UOl?E?z3uqffN^rj^nTO/wz8%%+pqvso龍=!Asc0PgFj/_ܺe+W aâcF b?1ci4i;wә>b ^sODZ^^>VgΜ?]^+hmʬdDXYo %=n7ƭZfw@.߹sT*oebo2k4uu@`efw؉Dru7.^/˽z뚚N~mށ) y`С,((,wvvrruU>UTrsQT2+**+*O<}аȨGْU޽~ܖkɒgFK Æbφq;-kx<1h뎊--bqKKiYyEq EyN.(TK? z?^,,Qj>9DJE󢡾(AHGb\~…6vC#BG;s?T*B&m OXSp:!͠?x蠟⅋_;}r׮]H$ՄJsqtttrqpqC2e}i YWj¦>:ZѾ99wS]h<>]k.fs^]fywK~ с͗?~`;A";JԔvii mlN]79I#F*,EXmjήG5z! 3@ps9#fsnTKK+]8:T`pSg(kSS?ӧ2ͅmm<СqqvdH3gGҖK̟'YRYZ6nܶ5/qȂ>R+W5kNɓs{kO?Λ7cFES{xZTigE[iӮ?ZoʫiٶXm<UFUfToOOa0'OFEGEGLj,--D(ikkcco_ZZVVRjDs8G;zphبt 2 Ꮿ_~ʕFrvzn %GV~yūAeg&LVPP\\PR+U %22Ϭ+YٹyYL;(=zq}TWWTW*JQ) Jde]O Józ(bK>+z 'N,8 rㆍdK&zLt$uؔS)"QXxDD;UEEEJe[G[|}o gϙ=3ddXhXxYӧ9ᅠJ-\s(U/qzyO KeĈyYl0g_d\v-dNȤZmu]Iѹ$݈ --S%n ϟxِAAdqONLxႠ 3^͟ -lmc54ǏoڴboogW!T67UWdd$%e47LasG]{C6oڽ~vvZ]S|K "Qxx:T&2YVVBlNʒNS(oݼ|݄#?pHWΝ۹=:]tN'n,+P"-E؞&ܽF5(-|1B1@py"+l<\]}|O8rԩ*p|O&307nݼB㏛6?/:}Z"r]]VڶקN 'w=R$dI$K֬_6ni450j}]S b)=}{Wm.pv"Ȩ)5BD7VےPk!Y,Tw@^9/~u<}LJK(T.Wd9dsL}1(Ξ0:ځWwZ]ZvԺʕeZvmZ:ꛙ٨QӦLМa* !E&?HO;GM68mb aZڵIIy''r`xVVNCMn\aM"=tHWW27ÇPFllܞ+Q> h{7uj̘'n޸z葜\lm<=ccee;ϕO}S.^LM=~b 2p,-]\jD0$Ƿ4>tܑ#[df[?0`Μի޿{;v?`RG̝۶\#|@U:~cGƌb?aHQqqIQ1|HDdhXD)l` ں̆q;Cw{oh}5x5Y77WWTONhR7VZP(9QO T5db(VS<;09jTCCFjFPogw}*bzVT֖֑ǎ0&fLLyť3 ,(}￷645yxyx477767#/zD"Ԗf[ZڹV4|͓BApy*eTG%%>GQ!BKDNАJ VPYQWw勩iqWd\ <0|2)99%)Y([X7?,[dFJߨ&yɓv'7v5* 5 OlA5l#~MѭmFxfҜ#Fw{5游FDN}}ߖ ZsMd2:NzWzퟏA8lo5݃Ʉ*`Kà{΍P*_X(DQvs}N ܿ?'<",<,LIeꚆƒ%ߗ^Ы质ebbD@quGc>CJ$mmmiiiQB;1昖f::x7\>z\=׾*.d?ƣ 1R'_pI1іBw k򲳮\>yN26FkuvHg8m/?İXL&&c][6jtX8S\.[԰D/xA 9)奥j4vqc]\.:.ԀZUry,tfrP`naѨ ) &' ߷1hb+SKNNIINf2 ]5{~~AAnnŠs]mmM} 9 +v pqϪσ'|fjfjfz>x<LHϠ|ekgk'W_cuZ-NgtJIi!Ydr.AgЩzd2_+./.LLO;۔ ío@L[[~yر KxkK;k˟=5X:B2VYmm\qkuq.VV_RT12dZUk4Ǎ8Q܊ZG;jReS35zH , 3L)Y'tW 0//-!5=o _̔BwMw= O'9{ă+&:2blܽRig\N0 BY?EȨ(,8$8DډZO Ҩ4[{Xp?p0UP'@FGAcM-Јo%@ |c?^[f0ݙZի/]'QܸիY,[$ @VGƷw<֌?3xek|{g0lX>ЀVҜ^QI4rpxf g-<-{-ٷ[xuETbE:.c +z^jnn..֬Fӷc#YƘD45v?ֻwl3|7z }9/#~ H72/mg,k=ʈDظi= ./d2\q\dկÇd}3BmpȽ7' n[W< ss/+ CQFiTb)XA:+X}&Z)tĞ5@3s%+/wUUժZd(ҍ5 tuW#k]p/&Z^T+?6֣^r|^ǧh)uڑeH^%!._ 40Z&hF'~bsrIENDB`gsequencer-3.1.3/docs/images/ags_position_notation_cursor_dialog.png0000644000175000017500000011106413607210263023033 00000000000000PNG  IHDRF)aczTXtRaw profile type exifxuS[ w]1`?m4s\a_ciAg+fE WLs5I-+Pء؞jSsCSI?P 贷˿M?iHMʭ G",9 JhS[Nz#JuA)e-n+/ԢmmlMb-˔ Q(=IV;njْ qYŇvGO\p;l $eW\OV³*w/"V1s m6UI񑕬P(g@F%g q*e< Oy9t 9\|t˓/շudzTXtRaw profile type iptcx=JA0 0Z9 @K `fF{A{9BO"<Z,_iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later AXS iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx@Tn/t؅7HWH/*FKLO4WKyi>$j4]QЋ" U>>Xr~ w93sÍP0ɼ Jw cQhpuAHCM-J^~ ?7MN22QJ5^g_hs^(Ap/L]?IjPiB`x0' >4H0* I>*@PW}tVVmBaa⢯ayOtʮ6QSSW&}B$UT)-oS*s`tCMx3[rc:_ř@ //hU\t)'/ OppqbcG"4G:ϠG> YR *~;TyCsݒ[Eig|"qOl+6K*%57eR"Jc* :ʯg]䶶s%'>5IM-If`NPLP Y2$uN*rr f Dmjp? in+?( 02Y}/4 1n{.W160𚗼hal>x5Pt^VXP]ᑐL"56]T]nim4m ítC2knyn66ۇq8]n5yJ%NMOq5&DU*D  e;[J$Z[-]bhD޽gץ<&,|ɒISdB"D<_VJdeywqK=^L20PQq}ǎ_jk1f^r6||no7zKR(v!?Tlv؆ÉŭC؟S/,ѫ)K9ڜf>ONrt' G(T6YXC;KULv=n,32Y, r<ۖ=K"=G+"Q;^AVw?74pL1 {{T*siA$-vu+ e{ǭ[B:4G #CO$b0B}X@ZVhΩ*oQAq[dwѱwĄ W _jn,+-(g;͜='2Ɂ;q7GQ>'E-ѝBaB nPkǻh6RJ$_TZWTXQP=mZj+<5%rG9Pjgr0'ڳCuO?OZWSAR:DvYYNԞ" K˔JNNH)TH$d2 r ۇ%} τ վv2ڡDa.aPsnUV^qܲ2{F?Cu{wGr"B~߽CYwb4TzzKJRSOʽU)ML=b-:POY}3nG2L2Wxbgh0MCw!kHaemem={6W PpUU]J%s%%%1htc #`&Vm\*-*okǯ+((+kmF`dlooc]Rm Z]](,+bىmNj?%WFG pa07b%zPh)FgIC&EJc쭭LMtuQ.uiuvM &<2٭zz"CJT$7*F}E++kj4W*E榶v`b7 oxOZ._:ކ<2-{Jd2tbag`AQ~4.88(ȜҜynVRd %b#b W(P8' z$:Cd2XQz<H ]La"+mmyG_Schd``c2C9_$Bi4[h S Yy7o6wv# 711ptDzmD_ Twf:: Yb4d$%͙P~F&kЌ8¢ԪGj_pƌe˞Zb_UXP[mU{jU* 8.LA9c$IzL8zVj20 +?JDgD{i@s{hegD"hhǨD20=0fҝW[rϠsM72m=RM Tm&9FA mm\JoT~?i('T*L8sd'[{MԞ𠐕C)1qO<`GUa[S([Sp7H" H4 H4 (3ǂ44ՉR.L֠%% ~*cV.J 55.]FI{f sJ`"ӍR]]V$Vn~G~()il \DF,^3xbFV:@}Q:t%JeG.^XRʕ$8 ?WH?sI(4Dًҩ(=h+N8~L"Ie&F'JeS㵲~3SoOzI~JZ ]睢Tv !ofOZ+_74?~ װF60n g4 ?vlFw]gS/唗75wux @Ynnq˖/\kl4JO?uZ}C{PHM=xoocIlkKK??yI)8p_yD|z|x䧟~uzZ{v ѣwi?~zL$2yWwYYZډϗ׷)L&sfXooS2.e_EEFcE-]]b1of;O6'iђ3mmܼm?ޯeU}}(a^ۍϦVڸqb~"H.,BI+W.hJ{>Ny^;kvtfNÉ<爈 lmd֎aFF:C!7dd~͙2ԩ IIO=f==7n?޽m7Zxڴ~u-MNQ?`7hd<^?~l˖ÿwu\CJ3VuRO۩K`E 2323vI}ᅙ3Q幣3'gM9r8a܈KdMx^,oΓBI=g4 ?CKP/q"q]za⅋bpySO}쭷.4p֎N'{]ablbfHX%7 &F 0OiBǚR NHOkjdg~㭕fJ]}woZjzZ'T*Sjj__fMTo77obBsǏh=( ?y<԰LJ1TUNJ9r,+VODr1FMLf99Ѩ2t2apNn[gj-I(WurS`b oh(TiB\^W{zUTjchf:Y^옭 <8HРL e,4ϭw.K9N\*HS#::Ts<@b@$B6R>5R)2u4d.J! U+ߵRA+ϣ9Èҁ74pvKNF?x-׮ff>v|۶fǤcj7^=6ͺra2{{z|d;NT>_ p::6I Z?B!:Vm*ڑ `s:& 5kF Ws-YaeP46qJJwt \nA+$\F5pJ/}:W68RNNvcKJr ۙ..a8:ciA!{[ $: 涎;2= Lx544@|o VQp+K7Ϝ@RD,::jk /^..e'XY4mb&(ιpꕛU|>KgIhiTo_Kͪ cdD&#qVuv]+|Q&5160+2dIđWs犊|{ [[}FJK/^̽Z]-5'W̾otU ps]`3#8mXtuM)䖖+WJx.Lɻj[[h4KK&@`H݅ٹ׻$]&"uu8v,#p""=ML8M5QC[%|o֓>?PPzzbq^nvֱc99==`h lقΎϞ=tpB*՜/@"H]\׮{e3#N^/W4%1*V r 3xutgH$$2cL|d*FuqIJZr"<ȑ̌}p8eo2{iN*T60`nB)4{/@Ko%Z]%Fi VD1&5Z/ЎUV li@&xnl Ɗ.%K 6(Md% %5Ϡ,3qj48h'\]T vee;p#E D0[6*6i`Bh2^DB" 4H" H /ÍSc~T*>zk,_>rU&Dm?|rܙ3||O?g?(EE{޿鍍 35v5koYd_\cI/e]\Uсc \ 5h]@('ǹIoqܤ?#W478qD< |+\C]r6p޼>ot˖;^W~oP{~*w7pUpKHg6n8r$&FOڵϿغ>tWWZcǸ\Ooڴ[EZ?|OH ˖s,j32._qG&e%GE9;3uwn]eeii'?_VZ_קT2,S[OϙbcMM?_Ppr鳩r˛x<@ ,7ظe.56ʶ,kgdN湯' tyWH$'Wp0moH=o7{z$!?!nnC׻[-毿>uR\Wbb,̉A[5﷖XZ." ^ՍaL ?o bqQqvVaXbf6o^ " OZ]~r LN #z*srΞ9}g/ZJi+%#s6뷷NNf0[ve}ܤW׾̙l+4;e'NS.X`kclD& ]ܶv 32GM{WltL zyx~=44<,6vѢ(:bjjzFJJN"qkk"I YhȢ%JC/\|(t=C/_QW IDAT(VJ^UW{\K_<YYY1+*~wl?z$;LpbcW?[:+ޞFNggGs>s4LLW~$k!1qs&ꛯ_HOˋqq 32xEEN55ٳfU3Met>ݻ7-5=FPOxzPi"q]za⅋bsrruU:&lZO"10`--uHTpiBZ21c14b@lx–֨( s+ˑ[4.Z_%+c+W@cXpgLa1n |'T eo/֭{}=0ks'N^~);ںe[[qY&&t&I$HZYf^8uQ&WJYW[qN.wp7o;'NW+,аMR-8&*չ NJ9rL, lmeh@LzǏIp߼9P=Ѭ)'`f'\B?43grtQ'2DI7`i?wq8Ce՝7o;|7־vPGG: 0]]?43,ER)$D"cX,DZ",gQ3'Ã(?u2%囯?w7lز_/\P*' D<iȌBuud^^ 8Y0ccS ;Jp;7175U߼)p_EZ[x*ԧH!SHdޞ>>BUxLssxXrϽƍoX5k>T;m['G'>UU9م]T**e]֮]7IodiottD"aD"|h J@˿#,y5vS\-5~UT|sҺv9{$# Ws-YaeP46q?[mY:f7+-_~)*щyW^=ےҚˁm'DGB||RӞ¢d^#]\NuwR ?>6䶅M͹gΤm/\9s(006~ZХ;22uTbla=.tU.Z4:aI`R3g/*T<*ww嵴P(vvVDֿ)maag\H/. abؒcbL!]ǟ{k^y U,<~Ye_}y./ghlvS&S(nVq%R*ꪮ..),$JWJX⭷.:{}' <a>3#e?\56?$[[' Ȋ471psHJ3ʒJt3S%K֮KLc ) \\׮{e3#N^/W4%1*V ZqR)TXuXNNO't!:kUfjYlقΎϞ=tpB*՜/hg7>(].JWFDr,)̘pqBBiZO؟:eʽ(]۾}͚+nkii(mbxqʮ7ljCC{w?r,6lgOO3,-BB֭۷o%K`]7_&BCPzYP|kWBDI okkhpO5-Qi`,p@|5& _X8ڶDgi`B8j8K}jp6nG KJM(%J``h2wYMDJ%ׯH@_Gw,_DiDi<'7nܻ'?oW'r죀JWru`6'Q(Ns|sㆹI|Ghn;q1$y9D0}Q*϶n~bʽ?>SutILe.]?%' 9;kIgW*M{+zʳ c2V|z`*Tꙛ7! x E]#|'E"NH\cYWqҍM==2.0/9*ٙCeϟ/+omS*LIަ&dT*gS/唗75wux @Ynnq˖/\kl+mmi_}Y>Ls_}'O45iw~p8'U~~$.\0-'vۛ"FE[hƪx!?F75utOHxl~lSС ZV_N{G& >U"JŗzQf`6}{ڍ(b`"=(WO]aaBo_UeN3O÷^E\]4m.7ddn}v1 Pt 3#3c^9~;OGgvm?8OqV`,vvr1HW?b76Fk6m:uR&| ~=44<,6vѢ(:bjjzFJJN"qkkX$$ԩWJe...JtZtkj87eYu+-M6 gYM XV$Bم;yj߱/vG3_ x_ Y% 2˔)$BU~NZёLsP4+0D,֮zc}R*RFi-1qox" cX8aLhfXዤRI$橑ˉD5Te70024^P i@F͜$ɔowݰa˖_p`~bǰQ[7cYY %joZr#/VWΆD͹&&DB:҂0+Hl)xDZ-ހJE0)d=RT*6),@na c& Ò}w6nxY31wmRv?>9B=OJpFS}Bl+_+-xȋ.o00P {OG-(꺻%Ҳ‚ja7 &J@˿#,y5vS\-(tRml--pX]ݥ;$"3u]\#XO;o҈+KPi*L\>ڑ_nptsIiiIZML|}}r}>..1E۝mܾ۞&WV۷{ׅ2笄X~a&*>6䶅M͹gΤm/\9(006~ZХ;22uTbla=.tU.Z4:a0P+ެ>svBCPrywW]]~~^^K bgoiE$h=ڑňŶ03W.g01Aoll11.ʴˑ#=r&U.gc,23@7|≓'WؕK+V?lyLG(*)9ۏ?]Yioٽ{,<4HMj_'"M")+H?x0+K*Lml<<,Y.1Ϗe6\0NsqIN^XǏ:yrf/\"h&&GǨ^X2,vhŵJPPzzbq^nvֱc99==~AKU_m],͛wx}EZoh{{E^^W'طP AieC96nn*u_ ÷J$*)ݻ,Iz5k1ud/\d^~ ۩vn]x -|Q}x$\w\8uƋ+)˭R᜜|0@@RUTW@ 89LqueAuFX8F {L@&^HxCS=K ѶC~4pikRsQ?x$imW(>/*~ @|3~>cuuI= "Ӎ);SϼRh{{`~.wӷ6{ĩa2ɌRmm{oJ4rtӞd2Zu(tꙛ7nu;8j y&!Ү'=˗y{)44'Ʀ.>cad`@ k1 *Œ&T0}DP`Xd%g mo* 66ndㆄď?x#i8<QSSɇ|bo=e6Q"Qm}m]sQl|t>*uLigc`80VVw]Ws}}pc,!іJrN֊ڬX"dȱo40Je p3d*TDK֬ZL`eKR) S_/O!l\R;s慆.]קT65dMVVt]}Gǵkm===V%}YTo}~*/W(8ٳ9l#سg͛ZZb>7ba9ں::bT;#(EE-g(U$PemWO2J%hAA_~vī/zg匦,*UOoqq^nM-.*.n&$X[?X8T?×!=A҇+Z1޴kא̒^_<*׾emlj桵>^/d dnCs#YC),Mߦ|c|}Oܸ8c#<4jjΝW\..^Vb|_-HhO<ܟ|_o̟D?'z[]WwEEER500ojId]&{{{fuF(#9xϿY}[ )(?,|D}]M5Unuu*U3f=+v?H}X, (/߸W{["QnngTV[;mSO]8oxΘaad:;2{zo=l⬞;v%[eZ+~СR7/''k) 4vO?Mϸص~j] wt|#fvukRܹcJ|k@3SiS3fDGEG9~8zdOpzk\៽׽߸ooݿtuz:(cn{[\GGo0^^R{͡+W\S!IVaյ5*o`@tsssϺ_ 5ZHgWvΝo=sf|,]̱%G%@'qde{x2=='(d<^&Pr.fdQxXjXXP=׼d''7.ggy.MŲlփI_Oz^pw+/ jgbU^^6zz[D"j%DaFNwh4Nh矻B%Hgi ڵgu3_yeҀSu~W1v1OXVGz8"bͳбaH-ؾǬ >sqqVd򣴜, >U dcecV++ׇɤ2 ~m#"/_h~ZWg{Y$~++uu#f~` s4(g/C|ZwbG+?IHrv~PeP72ؕryꚲލڲ@pBlh])g~IDAT..oE TwoF/VbbH$XV Я|sX4{ΓO[YT=]^~[&17wv =g¸8)z̡3L?o**{n*-us{/ws%X<+[C7n\le|;SRS [Z-J2CGNj[|>7*hg+% BPK/j׉u++33CC" yuMSSgݭ!_M0 :,..((+HNPւ]?PRr[?bgh.twa0 1q8OOcx`H`]W{+MMRb99L ={x#CP8v‚ND77wr 7ٲ(xT֞wΟ/-r 7..9yl/O> L5es^ѱAsPuS(8wn˖+.gOey3ßzG.Ӭ榫_Yښ/*9;!~<7Q[Z[S}DA@ tvq]|y] 7ŋ~jD77"ĉ6_oo 9NH$G _?##>ڵj`7{4{yY}K%=63\&CnuaZ^Gп 21)T(8h@ hq\Nɷ?BkQB3g[ZG` "֒>w,jrŌfD"־vR٬FW*oMz{oUTVܰ/>myE"Q9jJ[U ŋWX BS鴆[gng46mʕ_9R_d&&>U+W{zf۶Қ[xBeemOߚ؄ΟbՏ?dcCAkI&oj>{_oΟjs?tB$7wίڿL x8'gOi~ӂml$U+{'O|iNySMM"#utEPPn~_?!leI _|ṗ|9<+-6}=OKDIGG-^vA$Q11fok񦦑k}ylm:7wwOOk2EFFjի3a{!z]8JQQuT[h7)VLR)$k(gZynBƔJ"Q!E@1MIPTh4kT]wT{ZG- =܄Djk,̍uL ja"/@ts3T?sssj٢PfGFZ9sРpX{{*SRrsrcc-F%=vf9o 1ѬaCT?lk, n`?ΞN).'EGO>jҐѓˆD 9 K* -S-A/]'b1ֶ 9H$ Lr'JhK E(vat]}ӝu$$\5o#vIy|+xx[abQzZzﲕ˖)UHOMɝHq*UOWOvTDp3HRBWY7ZpL1<_}vӶ A-,, 1 LVS[VZY)9 G"-^]-Y;MR%0$/  >Olj kl}&ı?/<==RiKKCPw܂JD"jyyΥw? =}zyQ(n5+{{?%eeQQ&&c cCAPT,Q NƱx<`mz:#F&s2eHtzQQM J'ۍn?9AAVVf ƶmOeeGE͘;e ĸ72̌y2^<]D]PFЄŅB$ \noeeV-oK}3TVW7_{gԕq$@ !aOIRqC`U:g괣vΙ?jڱjisfF۞.QuJeI I%la BHwdD\X8K^}߻M?1`~DaQ(<.L8~Kim}xS:yҏm3D b2jMw|_~yjE|`d1Z y.gܾs'`*++R}wFMdR4ɉqNרimX$bA~ǻK劺s00!N,-bq_ 'FF f3NaݦO鏹_}\m;^|qa2緳魧O?L"Yr 32ܳXx9fgg}C}ƞ=UU9Gsr/ҖVI]V{M$Kyw 9|^LzEKJezFhHRsf };pE n~RVVF/Mf2YLV~;ԭWw`>#ĺۓ6o  |U۵sgf&z)N>YAsY v2.w˖q,g6}gV~I 88(hOni-*$V:=:x2!]dƊ|011|7Lk}4m~HWsxZTaA,ǹc]S,NL 㵵J͞7o^?d=¼Ύ/]RLf3(*|K8ͷ۶-]/-uDJR)bqzƢ~ъǿnl,r#ǎLaߥgD3{|?#ϛ6lHpc_|~lcT¥ ՚x6Je܀JKdZأܓڙam`:}sJppNK?~DN%:ep_{aXNkZ,ƼGC"QVvVVL ܶDyhLLLJ s|6PPPZQhlkSV={s-lmΊ߸~us3KKe2jbr=B"Ls ,ۮ|ƾ>?K֭OK &m÷3 }fw\<["SkGFG敫 6 ` Tjʕ˗zL##Cssm]ii^މGVK<+2j|SCMaLb%[,&{FDp""-uuW\$wvyy%b1 HGo65Ŵ?>I{i%9Ǐ}$8X]n'&!ͺC}:{۰q؈Pf"㘌PAxsJP\,CFȰWvAQ^PߺZ-"*"1]&Դjbhi?s&/gr2D"|v*} SRB:Q@L+ih山>`Ff{zH*h4$ޏ[ MתJJv"I Al/,ϗIU*ÃF#Sn1MR*AX,4$NΞޜ 466-"D_vt>/|H|\Wd0O m© ̽XT2VevC&Ų 5ĦW F",¢bieesN[ME\0`.ͦU*JaeyW736N"O{<GWWAAI^秧_dI` 64Tc;vf#]8;fڠ/\$Rcf{Q( OόqQSIBbD${/:]CR)EPVh4]]JhhJʚ5e˂(g!H&#&=o^j*0iWwwgaTZkL_Xxf  9"pшW]&,:s6oEbTV+`͊2XPQy:VmʶWj\*C!D%\.41aڪVWU2BQ_vt `0>>ˆ(dtxyxaPG,++E ZxKxW#D)F#j))/MlLZ42ĤTF"I$<ޤ[{G]X eWt>BԤAi-$ZB!^οs~~I 8۾> @z6Dy-6i̾-^iY8!jkh(TzLsGre={pSXp>s٤ɷZ}k=L㸟cg>f2UU͛o~h{/ ?􋥠%/_Ԟo4m׃Jo6ŢIvܧ`= "i i8'ޞevGl|ns4ښk~ǃQAכ3 @+Mtsڳa:=)[yA)8;(5E4 Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later t iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx XSg? ! H aMVQtDq*.iu\c߶Ӿ};N2.V Vd7B@9#.(`ť6y9I~0wbbG&? &p29?k7?eqXc`w) k& T8Ǟc &k]$q(g" 07}WIC @H`Z`Jڣ/8zj;$ i$ DiybJKK_~!ryR/)Kb:4۽CP~XZ]ꪢ²!bΓzr9ܝi gB$">9юΚښflbb<Y  ]dc E;]SSRR]%T#jBas\bIp… z̶OQ5tI=8044:@󽽣c[ZNlըm-iB Inbnݴ)*ǻuQT=RYuė_hV\S5TYYS.U$@p/.pn7UMM,rkp6Nr]\E u:8`Al0ѥp6[QW Ξ6Q3fHt§lڑ^ewj7uuiO*pr`n:ctWԐ׫yᇣ]\N-I"V'ge>zelb"4D25c^@`2RgЅ՘Bgpyn 9\ ew3VϒD[q]KsfƉW"8 W;2i䍛7n\ jl=dzf_BPid2:28݅Tt_Q,_Ɣ@&Á9uL3Y XAUիZJ~ T{aS(j0tcc&L^f+Z@'[}Em-Xlued7mJLrI$e|\'mM ޾əFO>** =˖o۶a*b1Z`Zo}?/ln`uIZF57?gN76 ]NꏌtuW.דB/Mݚ|4**Μ=~RUzgre˦γ. 4̶>|ҁ0!' B%wu'4?w*H$r^^"w6;QlQ( zst#[SSZ>mE%b۪~V{(!Sb4f=/W;+ʳv޾o!Fթ4>dib\7nDd2Y,hbvE- ʩkqQ1XFda7FDR6EM&Ba\ٽ=&umzn]ٌ!3lG @H#2 q=pdDb2:yʕKyWFGeeuu^jIa31N&]S798t+I#÷ P3sxJGŤӪmeNk߀spכ9Z;BӨ bj#4FG4ab9::8ܶ)yvc8:tג"wip*@QW¦qqdy4:!ow-x-Hpsz1ؿL¢I^ksa'Xٗi˵]$ĕ/xj2],+ΗYFĄ^oh/]+::222\kx<(Q^CgU־\EhS*5']||RwQOog]fJn~bDMcl6DmZ 6J$ Sŋ- xpscůx442R Lτ۶ůPXN<6#F-/i72*!~qd0gEF⭬tp`X=creVN3E˖o{t*QZRܧ/+=_dNیXnؔ1֧YZĄJqB| ; E2::442=MG˶ɉFu`lmmljÕzuv;ݾW.~^U T. Zg0E> oHI2t:LZ3.L"i&[]XC9XA&Fsp`2t*;!~ٍ}6DZ&WQsL j~v6g,6qKۏhXzF_3>1~2,~V^?>^vpwfL [ hh.4! 'LƎbGGFkPX,''.6Ɔư[.1f&o7ʓ;u"l>sY~,3]kOϙ=Z^?j5zeI]ţvTT}ڗz&<1`i@H ! iB4 ! @H`fU(Nу5 ֬-p&ؿ3 ie/_ncX,rl`!=O3$]sv?5k~[Džy >l{  kfl:0АWS5n} قnaڟZyfܹg M܅*F۰0^*ZFA*i{NO` r}bq&?w:͠67_t̥KUrG)d.O(Y-Vb하ɬ8w6'CZlt ''sߜzO<+qҥEMM]&@ zG6%&&SK㯾uu{~smN++;|O~C"x;;= *Fc0HL&''zWQ.׏"Ϟϯ\\#"VpJJx8߅B]wRm(ޛo?m9v/{@wh /#| 7OHזu/[葉ĕ :rZ[atuYzxח?Ҫy^XaӉ…Ϗnǚ 玛: [_|`>|W$&X!f9dJNrZKCCXVפ?}}U;J[`]ٳ}}؄Ą"FrEy K&ۃ }?xTRk֦, V,7ܬ~E؄2lPUzy/]0>BC}}X}rIJz'lܴ"~ɒ=%\V+o/..*F/X<8 5筜[A.ZjxqdTJ*{**sHЅ }|ccڅ{ðfsq 7mX.2uuid2g甔}ٓ(p9cs]Bu/߹k-vs7ь M=Pz//_kSO_)T9ee+/svJD]KKkkryF Z]ScMJcG`e&wԭcbnBzfR)nxxkEsl>9QRwϦO Lw xLysYgn ~2(,_cǯwY!}|W_9zG(r!?{:&m.\"n#oGq"]b4Jb,tsG%b4˛f… L!GVXز vYLPH['dǢ% JVBwwdܣcu5k*۪hmcCM\dE/N94w;E[}tԙΫj6L+LB7n2'1H$T*Ё޾ͮϙn{=mel;pB''a\tpN97JzC7 7.=A<p#6F#8Y ƝE l&yN,~<v^?ɇmMٶш=J!ok*mմy_@-mU1<<)[z$D;dgd?r$/ ?&&..)))9.ϏF؍a&[Dv>_{֛^f|}tK݋c+H$2Av?!}pGy:=ÒBbbj5qٶpB N>M&zD}o q^;V9QhF4c(Jl.zw+Z̸]VTwtxk^"X{zz-VxI%W |Yo-g猷wepFQʹoj=mefpv GRϷ>}X pwttqQ{z j{DȦRM桡vy]]Yyy9l77W3V[SPWZ6>NU^xKkAމ_/*邃6o~+=ظ{ H:n;l{䑐Q4V5ёҖeKp"L:,/k$}#"fnǤJ0 _'02`X㼤XvK4nX$X8{gT_܃t] .+kJ`F.  g1B d0w&Ʊ4 i@H~-c_8p7>a<`|c/==2˛݊ ŕ|yJʲ8FE+OC>]_QGyyEDƦxE$ *9jlhͫQL?L&EOV??Tvq^6u :]m͙Ӈӭ(: +9#{g^ؼ_xݻv<%cc3%'*!E]Vv3æQQaaB 凹E"JV>unS|ӿo׭EDyy3^~ޙ3bdw*jU8q7A$ڹ9o_do^zHG?{7m:yw ~JUSSQ.oGQA DZkNwN[qVkl'vgw|׋H--.|jFQ *Fc0HL&''zWQ.׫<"4wDʕNI P(3Yi67_t̥KUrG)d.O(YCuwۃر?wc:^ݻiԛb}_ovlILxٽ{Dddߜ?xF,c^x챠Ύ% Wf2nW#uu)(!HML44VW]B=p#<^T˜r&l;0ǃ/X 9s4yIɛ7{I]AAYdV\wudHY~B4<Ԕv52۷3wi}asToG\-7x(Ѩ4:?:?h IDAT>C$~u&sbSOmN g: :$p[e[JJ}?vCb"v==W-6mc;jxX=lω˙j HryN$Qk9rltLD@.L5m[{XN![,Ta:Sw">{Yt:O8؂LB%LM&֭[W%\n5 JT/.U̱_hfFIIRrP`|]'uid2g甔}ٓ(pw xL O Yw߅zٖ~…_#` Kyry΃j4&fJD)T NGD*JfLmL^lkR)T"DL p4BE|WMKȩ3zҥ!!'vC!&SI&3U d bT Mͽ}(wXp9򆆖Qv]B7.ekzl?bQ(+k9*Vh0)2& @ڪ~ֆF3߂ z=o\|AoM`0tx#𽘪\=C XI)kذ8Y9Ei9yBqvKJJJĘ+O;}jEKly[Mس5đr`0~$_lxd.X~zrl"jU $Ppnv>Z=2lH\ωÞή&dEV*?[+juhdPB(!:/۴ ~FV__^u!C es{&$rt"bm=Vy}o>7bQg'J(lbj5Z+F5[Z *Tt:V9ee\.NHbZ"!򔺺 L.h[;;>*$&4tAXRСҊJ귿ssytںʊ6;o!Fh CdGm-֞^>~"̏rNUK<_రŎbS3Xk˜/b?['Q^屜޾;"D@%rG 2Y^nfFkNwIa&S(7b pOwʞDYj͚@+ZVCJJGFn_g2͟vdhHR扻Fck۷?43Mْh0 \VU[PP]V K^#0 @w3 ssJ[[Zё@`'Gz-Uխm:+ٙJłQ?qx.pitRf'J*$ǑMCC򺺲re+c϶@Uu++LFēd T*oWc犗+Vܵm[TSMdd! o "wWW ?YF d2:QZz쉓]NwlC7>Ǜ7[O~uQR(Tɷ+ w?/*Y(%q?G8'-n8| 0w\mBEFݸJVW[YYZZRZXXXP|}xFKLܺesҥ"$2! ܬܜҒ:zzbNjỲc#--%%yЪ`CB#% e6}2"QhhxJP**+.^\_1Z\!#K,b+Wsd4:ZjT}GG I+v޶=2%}bԛJmm̼pj Z;~O"#`괽}2Y]mIiII}}'$nٺuk|sQ4t*U$] Q[Z22NK2,,_{F!} !skqK2ǽ~pmܑ_5-(0GAH Ětq* i\ Cp{`[c_bM350SYW`&r1B|8oG68/)֮! ~tZ?=Ob{nHb6$b+8&}% ׆1BdG0ξ615 ! @HB}'Nbin9Ł){3 |〢z}OOyyFƥfy{bdBq{yDD._,ߟ8@QJOWT46h^^));-֑KΞtJ.WTz= >czh@|n{P;=v@PB?{Wt4z:L-mǏ́۶P7`Yï|15GI$vv( Pj7qz!80}|܅$=KGQGjbGs8"475aށ<|9!-(ȡ; OJ޼KL}Ⱥ&RK&CDDw HᦦG=ѐ)/߾=$ɼ{$̮Om xSz{=CQHwwgg_/Fi|>Vo"c7zjsjX8ӁHd0x)v'('^qqeeM\n4^<эȔHG̠i+𜸜D.ٙD"ZF;#KOwoD$ TS$@ Sm4UX=Ŏu1'q4%LM&֭[W%\n5 JT/.U̱_hfFIIRrP`|]'uid2g甔}ٓ(pw xLK O ľ]בu]2I*^w/-M+z55»JcG` A &fJD)T NGD*J2ᦷ1zFo0JPw\Ng0i4' x#}Nsy]Q4;7-# KFFxJx4 L&d Wy{3&ӍwL"yR65 xNb.l2TNoh4:[z{7RD AP^^ ߋ3T4q=6,NvVNvQa#GrNPcb⒒8l8>1fcJ{SN"{6{[peEg',;vFqd(+&H.~]Si&&*Z-FlM$Z!հd nݍaDrxNtv5D7!O&[,JewRZQ[CC}}&3"Dp4G!5щ|٦M4Ҭ g:PX,ۻ7!æ[mj/ۗ|g#:>If DEhn)"2zW鵵rqH"#>)By<$3C&4ڤ$CΎv b16uAXRСҊJ귿ssytںʊ6;o!Fh CdGm-֞^>~"̏rNUK<_;M1(;,lAlkjkkjlGEEEx}3(GFQLڪxRԣ(,ijX<=#\ӝ'|}VZ&(Њ}|Сґ믴|L]*Y*:&ҪyO?liu2 zF30 UUTW)H$L&! ƦƂܜFstd:)؉hEkKUukNpvR`O\*--=`py{8\b0I$::Ҩ==eeuJ"qdS&P\`m=AU}.*9-czf;0);BĞErа/nNMH,vqp y%%-j5J S,ёsgOv%&>c0)<޼yZ]vgz믋 J@ZU'OW^P]Hɷ~UB.qNk[& p8Pjn(j4UҒ‚˵4_b-S.'!M/XfwuWVfe攖aD.;^ lߕii))ɳVUU.88P(ABC=e֭RGէ](vQR҂Gni-+8q믳.dfD|ݯux74?אF9XA-=zW>lb9gO"q/`o%[W?Xۂ~M˚f__g PETȈD4韜:,/k$}#"UCt'$/y2kTԝatܹgχ;Dm6lx<4f(rK A+6>1BglQt;wicTTXMQz蓏?xRѰpᖭ[^8~a6?>sC<}h|ɹⒷ~vv?G?``kvMj]Brn{pdtu>sF$ kVSVKN}wȔ9+ꉃ il /66v+T*` LO(N^RS\=m4TT?{:?|FsqXr))|M&ϮOudҥg.]=*^O!syB؇֧n {7ϟ>v/{@whuXsro7[yvޤ$;|m67'ޯؾ{,"ىr{ }fw^_U]_Y7=Ȳ_a Ǝ~|пϝh'%o%uqRU޾~qvvd]gYs)W%!""e;v$pSSNNZѣhȔod޽];Nzx٢|C|<ξ^JQO"c7zjsjX8ӁHd0x)v'H$[-RRk_3ǿ\lܵisxX-R9>NB$O)|wӧ +*TO?]`fݦE_;'G*¹s>&`΄4BE|WMKȩ3zҥ!!'v6b2˛d2I(H^͠LFɁ!J78x].ohhi1^k,ts%7׸-[SV7cS9|klBYwO]Ǡϕ#(d2wȶgǚRV=yPTKO"NYdž.*L;H^LL\\RRRr\'l&sOMx-8r-ΦOY7f90?F@HnKᑥ{fN`SBΝ ..BgP_@Pxk!6Yp>hnlm6*0GB/ `M׏i=mmYYϜ=tHX=woB"M!"c՚_ط/9Y({ ;SBμOQ()dVюcFQ‚!UuuYX.pU(<]H ~zf`j  oS2JN)CPRiNS(lGQPВٶ=>^"X{zz-VJ{K<ފ⎫Ìzýf'B`2<lw1CpXؚls݂1Mm_~YUb%%=\Nѣpc99}z?F ]Kjɑ#UX<v`YYID  M?ҪyO?liu2 zF30 UUTW)H$L&! ƦƂܜFstd:)؉hEkKUukN컄 IDATpvR`O\*--=`py{8\b0I$::Ҩ==eeuJ"qdS&P\`l6vO-2\\Ye2]%<'etLoRl&|Z;WOsȊ;wm)rz-鵵BpȂ>>nhxXTTW56 "//.ϊi+f+mmKqƺe2Bli|9==71882J 0{Xv( 22_!D*bji:|WΡ7lx՗_ްKJN9odvK/jn(j4UҒ‚˵4_b-S.'!M/XfwuWVfe攖aD.;^ lߕii))+ϫ`CB#% e6}2"QhhxJP**+.^\_1Z\!#K,b+Wsd4:I_uPUTG),$Wص{H.DA,zS-.XA bUiwy%z=V77F٦l[Jɦio۸^~'rrZ[Zl=V2 6{vVWU}_oe0Wר(ئsF'q0&9YI fܹgv ?(A=RT)st$(h֭[/vv&j X_3;w:40l/-[b"lOJBrn{pdtu>sY[5SI+ݥR|}gx B>5[tB E J1H$& W=(Iՠ?PQ~q;"b ]f6<>-֑KΞtJ.WTz= >cZ50P&{7<~Lر?wc:^ݻiԛdji;~W?x.0poض-0Jy~ߐ^h?]#lX,~7`2< !-(ȡ; OJ޼KL}Ⱥ&RK&CDDw HᦦG=ѐ)/߾=$ɼ݇gקŶ?<ΩSqq(㡨zFRiT>?6v|HiMĄڜt  'u ;::"‰W\\YYS-MEtccuLF"=`o5L,}j!&wԭcbnBzfR)nxxkf2^퓣%%IA|;tqզOKɜSR=gObDppd]B'1x<]GLJD]KKkkry%huMnRG` =4BE|WMKȩ3zҥ!!'vC!&SI&3U dC, op5>.]b4J֮YÝJE$ܣcݳs kk&Sy~ vQTcCM\d\SW^0Cf{+TVJkVwoZZQgɞ!L{F6Y{AE=1Ƙ{ϓw<7x4Z~[! PzT] ih)ϏźtZ!NlGG Dѵzz^^QlqP!DZ#hCG)qq꒒W/=gOKRfGШD4 m3n͚iaG.BLd$*B@(T0b̤cdoks1ŢښxsBn}YV,xI*f( z#?!ͦhJtz42Y)-+mhpqz1dң|&'斑uHb⾽։ ddVww5467c13fL 0, SRRVBk0416dőuswv>}3 3FdԼψIwOsK{BTrZc1,K2L-ԨJJjjr'UBbp86ݝӃ8 @KjHܜԳg|@*AdCC&e7f~"vV֮d^Jp>%%=ĉ3gBI_+#"<=)0˴ F2ɋ{6vw?gPj|ٳɹ9'ܻRL1!!r14ʌ1eEvu;vc;wr8D٤IrU-rcbo-*Ucӕ{~ڽ+3S 7;oy:N(.ٻweK[>_09_ eKD83@ ﷃ: 4x:%~X"ak31=Nj4kxѾ}R莝]]?0e2-y^IM Θ> JJr-:nn^g @ ȃ"达BnnNeZM%@ P:*UWw'/qqqDC I4$<|'< HJ#Qnqy~ڃ!C P!O66j7^.64f/6mmJgp[_<tiSzGǵל9Ptv E5F]]/·k3+Y,zdc " y+~Tt<3@ /0 @ i@ P!" @ 4@ /XݭZ_/h* BFF)4hohoDA#kv d5(+h /Hk;;#MW5d ϫHAJ K BZB 77ȋfoc"Z).Ozy*ww3өS1=]F?|ļƦÇ\T*ܨ d{7knݲq˖lNvJSeK-X(qgDE.W*e?p?EQ obr~_}Igƿ=`WRzrEŖmoF!jJ?qXP|ĤwߍY#G}{4#hի^ށ@VV÷^x1nDKsK}xPy9Ĥ]ܼl}|,"Q~[oMٰ19Wkj~޷x_@Nsij F HP4*B$65T(L&T*Qp//K(Zųkoj5H65mݶuV<^c:h PSmlػGDR[_[o~za~w"Q>!vtWHؔ|?ůWW6K% $F;{:;:l })@ƚʎ KvV-r ڃ SZJerl 9  @$̥^@ P 3-CCJH%luup…DEdDEGEׯ|gๅ3~Of ]Ojn[Y,2׿OX:7~ǢV~:TVT2qq6n˴@ABQvkwnom룧ѡٳ;jںNtpP;|XC+ i& ݠ| <Fs6AڹܫגSR:;E"JOԒbYY98L  dYR(}>46jbg,HkNrU<׮7qOv 3u׭/,a;C'Q--ht_wl\ll!w[t#:N瘪C HF*@А}+YEU-R)C&1Lml##'MRϡH%%8Xi =|H.W66$RPз_;{ +|}(g4ǢV{ܜ==spm--ǗeHjwo~LI Y~՚ŋ#׬gPh'J2=(R<]]nMt6T>С؟%0>'N:hc#4(';1q4.wѫJH f0;Go՝TvtOnud򳟐g_?S^^^flL7twwwz%koA(yݻcgZƒ@#C xx?܂k֮\uP:AJD-\FV֨U-Ʒ~ keɲtu߿{WRҀm?Y08iA"+J3`wɡzzay99:Gr!=ՍLNL| G$F3յMwDO333c'ux FcGiYC#wsgbbBC}]lm*^PimEkaJ8 xtk%@C"v_,KT*|gC*+)\WK ~ &[yPlE-Y:o^c\x ["_OoaV=ֶksjR9q+ގfYS9?y,7gͲ9y 3Ar"*׎DGDffݽwӝp}HKK/u\E^5k/0 q|q-Rig l'}74j"F\IO ).|O#"~U^%]JP: \ˁK_~1g ByW:: OSy,K H01t`c6͸k6C9~bӦY/aj/]JK++kltcg{9:ىF waÎEE+ݺubW<v1Enݺ|EӜeώ…ܦg̜G&H5m<iM9X z a`XX,. s}{ -) &L dyyMMrE2Y7p/ £GwTKk־.shdV^k 1AZUf 3v3fϋ06`~Eϛ0~=;gPN"3bc͏qw72ޥKJeo_KɧO%%r[Z$N_aҤ9ED Ξ:yzQQ]='totܹ>>Fib $w-[9-(pV'_[*ڵ[8tuk=G|엧Nyc PiK\]tc**ebZkn6=Q~DB=<}DAeor F^V df_8 5*j%o,^#5D 3iM1 U*h_ Js$>j " \/H5AiEX #XRHɠZAld zK*ɆjB-moJuusIDATmlLL@M3GkL%'*'8 Ȫ; LU*X$R(-p8)>L$ň0xi@ŋ{?pu5D6;''')&ƒik\kC4y hB!~?|Raa@ $<VO,JU\. E&uze sw_oUz5W J.'_h٢E*5gmcAAA GGG'nڴij5`jרȨ(^7_|hf,%7<-&(tZѽ+[XX"P( OB& ~ÑjjJr s'[["Q&C&C66:ꎎ6^;o~j|6ߛx`@,ƲéJ82~Δ)K bqn.H$첲O7MxQElltt("wԎ%%~/0➞pIPT*F$lP*+@ Ŷh4/ *+I")--(Iv}IJbM)={.^HM urbZ{zb5WX«sm I@:xޣG._..Zea~g_2JU]PܢPLrr|p)Um6Bqtdd`S&/Y-~w:0_zCTIqIR*DKK#֭YBGP*9\zz۶n*!IFfL091jj˽,-MH+-jlkD bJmh"2uD^~oL7tR%`J͟}ᩓ#{̐gZ4mh@"Y:(g+*rg%1^G \2RA(8fďu`{{W:ҊLnmm}{~zn/_0cf{ub˃'M^.&s3\?g^<)Sz?_;vMs WWC.xG$R{ivQQcSZ*TRtG$G$@˒9 B \Y:&M4Ϳ 2OxW/,r[X5r~rO tp p ::~d{coOwG;ܙW% ~;f͔#=m)o_bBǟ̟yKGI]WdԤ`X\PpġRR@F.9z=;jZd#8cXQK7wc?;wzTr?()+ҳJD mܵ9ykϾ={ ̞3G,ﺺ*0X$`vVȑË@2/>3}$3s 2{iK[P:11fMfog2c'wPȰ’bMUꜜOHstDc@pVf]T[ &:4+ ߬\QSS ÛNK!opxCC4+Wӫ{z/!m`a<ۓbĉ..tzk[gWYUBX,͌ Q{'1Fڳٺ-7n\VT"HD$JJOKt)!!o0=\b@UUjJffsԩnnC5$kP^Zzի99v##/o//.1^xF"!#z \SGШTU/+'$ H*X-BC={͎#h)Ô!"P2 p1зc;:tuf"gf4 X$twԔOIIN*-Q\dҚ⦦P }}׮=\RQ*}}#<=C,'bbpHUou̴Z=oX13--99iiEmh Ay0+;'Hb--A0T&++KMv-3B ,N#LCC;{&O-u'6-bfj¢,^sr~щLgh&ho=+s/KǎefPՔP(2Hgp|ĩ!2m4H抄.ΑryiIzzjZz P<$Z!!l" nDi2ۛT봶g'"ER_A+Ҡ1 ˛IC^^FkW._g,N'G'/Ҩﷃ: oZMKX<-ZZr>?#نo1/ml6}6T] @i1øq?OSsGeE@Ϙ1q<ζ}H ܼobqK6rMӲwZy[WB-ۄGE6M{7[bo]p?㏵GzzsjahGkKǿDjhcC nEZy=J \n-) 7Vk?G+ıT?ێrt2 _/{P `ZQ>Zw-{) 2<&h%ӒD>|̭v"h!Zf5Dwa5nOfvw$=gO5#ҏ>[]Yqp?ŕ2N`4ƆGíT6~nh},jegeE,dxpxpjC@ "=q(L< ]q 8yu …..2\luk2@ OL32 2x*mc=?ζq&aaϷaaO'bqA{@{h6&" MH2 4%ѣd06AymLDZ8" Ѡkb  ۘv6V];AA^L`@ P!@@ 4@ (@@ E@ ȈNZ{K,x: ??}hbIENDB`gsequencer-3.1.3/docs/images/ags_position_wave_cursor_dialog.png0000644000175000017500000010563713607210263022153 00000000000000PNG  IHDRF.JbzTXtRaw profile type exifxuSq zB9Abp h`-#| g+f"E U8-ҩՏJ_65?D4'xu1L{ScUt\%gD6QnDZ[P[y&lsh#k6ahX81cWVIqݬQ X,nU|`="g{0v>o@=zThVYi?QbE*Fu.]Ѧhu4,O,>@>Px<0ooF F~ Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx@oB=8zAA@ӱ+5jKy/ݼfLSMb]QX@W8qpwnP$j3 ޔw~Ep#p@1/_| HD -ցl@N i ,@ `!-$L\-@y@ ^;Zq 6@ -lH~ !T f {@ 4!" @ dTp7@ Г@nY8}ҥ:)22!1&ϏA?:=iLƪ6yBQ[[ަ CUT44L۹@O8,$QX0>ӓBYI5\.сZ1d EEE55-Y}jH<ʚ(} "Ξ?iUO@Vל:iFvemT3>rɡ<(_9鱗h& os\\ $==j5b#Npwp-[T|=3$-&41Ѯ.whϜݳyQA'#".7/8Ja6z ;+%Gt'Ө e*+L.W*:pA+G8t99|䤭d1}^=e >a2_gC}O|#zxP(`PEEYYuu.YNG"96€Ȉ@=v:]WweU"h޻{e5{h،QQnRi?xDUNdpiӜv2ؗՉ]\gEY3gZgE:pv| ZM^^vVyXݭ1q NS(GoK"' yDAD<*&cO{qG~3 B ^vw5+3.t=w&9A7m6+5={Zue_PN:;(ȳl0tKKJN>zrfHPL[{=Jm4OkC[LYh°0CEj@o0mAP^r&I k "xyp*3߁_(5ߎTJ ػ.dƱY/m]XHCBwuPeK|\kjϝۿ|{VWSC"99W.TNDrptҥ3ft=*yyǎ8vZ!oj=?rt4)"Ëd֮nhjhj5sҼ|""'N2z{{zd2>-4o 5R*irMF]Y~Ķm;v#O?sL$V ^yej> <ߺwR58:^ "33*z|dHSEҪTNG&iomUGаBWeqG'zIF7u@]ݼDc>=8J%II3t6|{+;;$͝Bebq+1ĊEM"#}}qH4k5,&)*V@,WJwc=`0gi9)*ɱ>e2B'݃@""g ! V$%bqbwӮFgICRO6^o4LgPFcs .2Nv&j !L&C1gEzDb\ #=?8&30`vҒDbn^VV~޵fQM8//5}yѳ=٬="7}t:vK4fh¯7~yI$WԛvH u--jEoivp֑i:Q#nKB1R$..)ȯhomvMKلexӓΨ, dOB$l7xk?oXdУΠKuSc^M#!Кj*Pt[ea@n'NntuHJo1 ԮF+iC*ҷ7uG{jPLH$z ZB*if3  q%TzQ/[Ѕ L&``CAx\-0>&h해56UV^vBue6'-jϒ#H"}]97vCJ>|;ҷwGJ"7ԁg-Mbn69gLR܀ŢjY04TZ YSTrTvVllNV_]sߧ=|8ky1e%E@;:xqe4H$:Akp8H3. ƆzCc!JL֋`&S$l2W*zPS@',L726u܉]6W<IUUEEg55 ]n.6B@l.N, 666)_c4 yy%%͠m<<\]Uf\*˞ AXL#`]WCW&}@4YJXTTT\,itWg! V:YnGecgGyy~~mm̌ܽAhA~In+w&pc^Pɮ Г<٬T4_|2,izЙSE; !ԏxGEEF: Z3.6ww_;J LݑV)`Ь.hniU Ozb Ѡ}T!>>PJzs&#䅌ևB*}z=9oI31W Dl˪.Wͷӌ#DLqk)SVZI`c i*N^'psvfsÞ0a #'yxr!ѹ<'Ӓ>&!ӛLج ^7yYV^޳>̂,<*]M$jRRE;CE P(t:A`)v `3 Nbg`V h\I"R)00)ɤ) Sb`3L_FA:c+(bfHGvw@H$&ʊ˥jkO|DVVl6ʣRioF3 2\[*#(ȣדH,mmh-A7"CrckP` 6E FT*f1`hl9 XxBbo?PNS1(  ,cozԮF+ɥ =j < l C'@7 ?Gwv\>3"շʉB ~uV"P&gSXm,4\0;{+pVwwX j@G_+@47m h"A9ϩV;nւkwjW䡎r*@ 4@ 1[nωa=ƛ3ΓB 4sTp7@ P!@@ 4@ {u ǔ*HD--xYzD/j@r<ܭ#m,tu<ܭ##?r. I-#:ҋ!I#* , &H._w[j g4(@ {M6 H-(g@Lج4usF )0HKA@ u"w V @ >nNZga[@dBdY&@칬݃:w?V Hأ[[Y|$N F@ dyx ϭp{d0٬յJrsO?[ZZQHG"FZbS8: d 2 C _1q@7Ư{@:$Lk.\pU׏IqjMeՑ;8PU`FD.^k&/934՝ˁ|cwc6-lV{nN~ YscZm`Gitj2E%eeS&$Μ1~<]Ƽ<y a>)wPv o@ X݃Ez𑃇@88S8,09sAP64^rl̲2qsW\t:OXzҰPUgh;}KJKU* } CBlmH$-ܧ~b1)ػo޽84G(HtG}ٹvl饣Gk{w)Q6n$5KZ[e2۹73z;[2yI[QvXZZaA]]sKWFC"ry'͛l̙n&Svζz"qժ{(A\͛ϦXy~~6@;Z/I a`{=na'Ԛspy+ SNKmmuu]7.9p͝NvKʊ5Ggajy<Xo ,;[GGk!\a6}ܼS'ΥEsƺ3gKи{~GwK-+|qA4٬T:yTmub⫛z*&fw@ kv b @ ,G09wVY|"RvfsUS?4^^O ]]|Saut WuwDĉC >#lF___[f #C}ݵkUU:[xDxݽb\K܅#mz&u-^!Ήs<7{/g:s"çM6ˋF*5QNJ[#n޴$ a'GwlVk(ȳb2s<dzqDQ)jPGfJ-Cf2h{(ml Cr︣pHRƤzLGso1=9?ORSSZrmۚW7Rt ME#,H^}5>ށ P WH{d {fBTp8&ŵޗ@ \RsEhd1v4f@ wi`}0y#m{A,?jE+VΚ%t6ZZD6ф3S^B e]mhҎrUf=] +W7O/g'R_933C\^!j@]j8`0Z0dvRFy59$сDݹ3&SOOA]o|ٹs"VCBCo^ϽnSOmVbł?|BEee/]RUс#r/,`o`b06srN8~LM^ DAFs+/oXn6jѢo~P\^۱! `+w9gҥï@xpN&i+EbTg|/ωaIIcb||,m$5KZ[e2۹73z;[2zQP(/_I9}6rfYK.j :s'ZtiX5o27㒋Ͼnr2~bw?|饽{q8)hܣ'և7t'p'ﯷ;ժEK /TW77KZ-ng>1)i+ m/|N4c7l|饸8'G"4ÿ}ɷ9;~4a7<̙| V`9#۾;qBAϋ_ƚLV:Z%mbmb#{66&y x[:7D?쒥!tOY$t#]v?Po2yNΑǏN6cz|e11$RooMͥ))v $~e+K>/\11ںӧrh _>yIHp}[yu5* ]\9슊Cۏɸ_QA& O</[MI9RF`O YY@$*'/enB)+Ufӳoƍnbys_ܷw]^ٸjyk+w_Ιmk rEH$.,:_8uN$P6* OE&NAc1heURR\T[f4 pRvfNqcԩx=?#Ãa.RLMBTfM96mĤk -_0}}$=?gzjH &/>g5W_-^$ 5>.!>4Zh~_'&lx1 fnI#F3FӁmLj` s#Y[Ѩj5&U9qS(eNg}_(%|u&z[ qsv3g;K9kc8)riiۿ.!at??V]rrAjelgt3g)7=<G ]99--ĉB"/G8wp3W+,rubk Y`kC!/{Ars?xÉye0TqKϞSR''ݓqqZ_HTZZ[٩5ml麺jj $"D  Y,*!(h7Xgٽ}DzG>76ﲲm/%..ГC+6t¬YZmIqڹ/]t{;Wנ+6l=;,o?XNKNްǏ:yJz}Wj44+&֮>m`ŵl4Rdg\:v,3S*5jwϹs~7PR}SO[Wu[Z Bܶ˗> ZAi;8mElgGOdts@ԩ7 +Vp8p]7/4m*Hrlꪉ7$% J?9iM 6.<->X9\ .@ )P!" @ d,p@pw[w> V@ Г14:H 6 wfKtH6 (Ґ;i ]`@n|,:@|ು* Aڻ$yHf cxXϐsru@P vODZ$na0уͪ$̢\ A{@{}히emAeފr{#R,d Aœw$b`0  w{"wuܖ_eLp-۸1(~LhL-{˔&/?UU`Nn{2507aoZmU"n>eg]urz~uF.AH(6ؾ@_zQỂ //] sꙜܯ>[E2l֯X,OhR3`d2wt\e>d,JPT#8\\6>ڼ3/0^P::ݳG"Ŗ-A (W6J/QYfES..ϒ>}:~k^R^^~޵L `=L<"roC<'Lpxz6ʼ'LJ|ke:^[իBB>45"qgB!pb0@ A9lJxH$L&j ,eCxplPh?Ho&-qq(unwn߆V57_ݝŋ/_~RogrT*D/&%~R.OOkk4%G;;;]yV'@Sk+;O?fecߘ$z :hV`N׃3Ǿr D*Qprό8EMT)TEEE&XV_\jJ*d0 &N?zg/EEӦ\)LbQLo tznT:im@@їl.]72Q ?zk\> evmڴuKKK|{zB==#デ.]Ϻ\Uѡt؜@Y&i% `x-GSk$m鿟Ix1/IѡTM,@(tq0a31LM#G}23^|W#,O>tq_ڴi_ m^~ug935z{Cϝ?wnQjgmg1~6&swWw1P('N&)˹$76fee]-)7wti4Z[#"gENf?|EDRB]szz~Y7uz77-2?럞0o匦,f0'rDQ%‚VIRx%3x҃$}-G%7zuL|6X 1IFG{*LA>`nr0?勝?\*&O1sႄk<^RW[RW^(,\ׯ7O_Ӎd4wdf~wߦA=/.'::zVG_}UWwEEEkg4LtR5?y|QTjB!?ۑ^^))5'N~wߞ:HxGFN8} NNv=.qsmMMUSSW) ҅O>BP(7ٕ~sL<0p7reTFK5[zw'++<<*(h4YUTH')dOO<^P2/ތ))c?Q`^*эvpdo.7֞:5I;56I{~yXYYbi5Ւ6"8Յ__HVB$&[p F1t:?wwT`KɄg &cJK/\ngv%K{oRNΚY{\ t߱}.'?$$i9۟Y}< *tuHrBPCd=2f*̽&]F$D^<f1'ݳD|0'kWqɦMaAA"}|\]CBڴڊzʕꚓ'QfElY\NsrΕ~ )d32qpy!,n/&SKk~^^7n Wb2QvwC茍L<.:_|q"7ׁ-0p8W2ii))YYf`a?w!8J@\&_8jAAMN-Q/ZĻB ~/׏-OO lri ,3DGCEO0KI}4 Z4p(*x״ Zq`I&$R[[w\hcdܸ>\V:Pd:N-٩Qk3`0洵i4LfD+RIDAT-LTT0d텸9WR2n\@:j%&: Pqsp^OΛyxPosgvvN9>i (RYXxcUs瞋P h/7/f7%obEd݃N;SR._NL |=i=`w #i4.M6e*25u*/nX ֶ$yƌgoP^9+,˄p}R " ȓF!VSP]ӟjj$dGwvo1iq4HT[(,\ N#&NttT,4*ۀPGk:=$dbw۝DLbs9v BkJ`-]Mo/Vo X8x姾5f4y x~٢[A"Qhd"7ўXјL-^Qit&xж{z]]֭_ |~ڵ[%`ă`o=iRϝjݪU&3g Iz/`6KRo%FHB*E_\~ۍN[@.`8̊W0utrrBJBTz}m]IqeVng7V[[WvFwruwRZ Z<^3J${{'}X~؞JU_J:a:qF_נdfp$y3_+t--*UNQz]^VYY3}ӷI[Pn4*_~YZ:{ѮPTXRmk;1ZF7|piizZ}ZAAm-J%&ynߛ"#.B;{c۶ӧ.eL+p)*j鉎'Z 2Ed؂2%,RlhHzz9wfsLLHm)dAl0LuMdb0||,۷9c|W^YN?Ot/nHIF;ZiJjJJlkb4绹&%&ͮpU2:-f}LN 5"^?>snڵ˗3rTW7:%@Z@[Y[\F3Nhha贛ۗR)ںÇ{wÆÇF1Ly0u~x4W"8r?rˑشĄfS|>)/QyZm8&so9qw,m}S1?X*桍 O_w=|g͌FǕ<2{{e^BgsȤ޹m5̪Ek#aB 4z <<˗KK?ySh*+^),JY׷AK[?{N[iNRE=DǔHˮו ;EE80mO?pnu2d?tw߳wϯ7T:g8//2,7/==??6="`hn9_~"#͋[`ӫf>t|Si b-XX\$ʸD&lv@iԏi@% q!$t!"śmdpt,Q Y֎[D/O_?WqܛՕمMtoNk jo?Vk`Q`ϯ:cH?w~ӷlyIosٲy%ظQ|w_bOw6z}{Gv޽ee՞^qq~>TH& b׮[bxw?^SӿTr3Qf^j4Pr9xju~c'NvlnehE*%|U]]]I A:%ƅP@劋/^w}ĤSATCy 3m*-mjFpA͛<90EbTl+BT_qIQ>.xX*|J}F[ !!$ ?M [,dޞps7.&/>54xz>4M"~~o;y?>$x˗T*dg5ef͟7/0Њ7lQ4z__iIFf^^W' L&ŬꪆkZQC^. ߻&]BGcNԪƬ+W*5j+K&34@D[ϟOK̬OlyL累Ȃ'Oki=}ꕪjRj̝8 {"1s^^LfKsN΅ gf77j0V*kYYwl}=1eʚ5'% !UW_xXle51l@54Pv…lIunkLWi_.RnrZ*L AP4q,u}QĸD_.b675sffmlBar)*PJ=uMʭ )}K/<oacAm6x[ABaPPKqږ rhvno EWWNJ,*.*NZȈS 6geee/`Q,Yv]*tlfn0T~6Im(,BnJ,ግ76Ԑ  (l WVj&SZkjkԍ==ϬBAZ+;v,//:) J|-I>|Pp0h[ZF:( UV֚Ria#{q-ixA\w,XcvYb1ՄG{<9;O& ѱXՂ?cCA?Qfdde+-8V_ossKJN}|w$iLz|d̿"KJV zIRjos˓3"~op./AR^N9L9|Xte4 V(Xl:e<~ EC3CBO9}# XV!,>/&Fܹ3=#:ÝN ?hjhHR1+<\HIzqQQLhlj(ln6GFd}dE~R4iI͕kd&ʤ)Q&T!, >5j,d:E"T.&JkC;3"#m3}TASRJU[^(%RYXx'Jo˛4QCd-\tLNy,jk bQi&$\Yק" :ŽnO?_?:{OXɵϾMO75_~MMpɜ빝~Ů'_lϋUzB6kxQ h|]!P`usRpQȢr\`v'جaO?q\ ()-y Z措j^sAR3$PcRSd 1X`^X'[Z4uz.)+±q10:U2I^zs7 B039fK)wƍrqU(W4"[t7y{Nt\kd_Ƥ_ZϞXccG.?|8%'ysc*sdxpe9S6SKcL#d2w-B( 2ۡ0SquZcAȓMI`i:w U3iM?{C=M-\2ш"S$˶d@O/6%7"B",gu /N};۴scSdt8 K<"۔V^/(zVԖ`j64fQ&w1L%˜3#D$ DZmoR7kL9eKqM*bQ2?pLlP`'/T]ў…gV$5pε'4 Vő#*Y,!kmP`7K+@2e،ޅgF#E Mn髽)p߀ry+~|W{ /߫~.._ї|iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later K( iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\S?p'!((NAUuTUoںzmk[;n[mB?'Ey?9yss}O2M,Se0(@A@: aP2tjvW]D,ru.\p!&ss 'sU|C7T DBk=wwr;"F wP~19Kv.^ڜ7H|+J"_cǑ ENNjŋ-_TʣQ\RYԼo64xl6!BaxxP@@hH~:蟶I+nݷJ++;z7_L"]:J& |++;ήww~I$ؑW45oߞ_++rb+^ \Tҭ?jΝtsN, !^^#t~xtp@ԩK._vtrVFOe6&M0hCht7oݪ:tȑ3K/XLA֛hMߛE(pAkh uye֯O>sp 6xpT?˵55孭eeu5eY-ܿVu:¢67f~JJܿ3O3g7ޤ7[T߬_jeNN<^BTƆ֖6ڌ=H&ǡǏ$o.ܺGbF?3:,Lui3ϧww?^_=sS}"cǏW*JZ"Nh0ȤbЦzyyyzyxZsC5jƫDZ{#ZXޑ{a];m` 'LѶkg~~ 2ki4 +zykyZnѿ_>оQ7?Ӗ5g͚3wpjzQQءS)bsW'ktÇ / wذɓz: ,*5_U*t.-S*+nʺFEEC֭geR6Inׯ, jKUTV޺,؉{a0xzJ%?>++/KoF%G!d?|xeKKnG$WլG$ 8h`s3e]LKCd:(nH"JhjeE =<lmRK.^LO L!~¢fΝvnf%Nq [Z"&O6آv&Nݽ;//;ʊe2ztr;fܸՏZMC䲹\>_ˉ׶n ##7M>wxԩ~ pf~g#͛4iphsU ju]rr֦&GGqG j+tu1oOD-,Rw9zls45VVd"?jСN^^!!9!I$ʊٞNξYYu?w2ur3gNVVjB!11z{܉mHqDP\6Eb gJ뫪{qx^ psۙ\X{R55WyԨƽH,m^s*յl !$SiGQQ(#0+ZI^RZP˳d001c跹57g 5Сwlh**;wĄz}/?s_8qX[{@@GCAA9eiy=KCã#i23u+7?3nm=mk}ѣ.\ż>hݺ~R^xMT2{-{㍏>1m߷{{Q(7 $[[öݿoɥPlERinŷ##sjD;CD۵hWlSOSz<߫RIYz3/]6xиq*սAk׊n5WZrه!nb1э*šCiigTW=_i5V#FD lee++kk,YNT%ZjVKW $n6b`P(S8v%f͛rV|[51Ǣ[UJW_}d2KJN/,ͥt"}GqqMRi+̹~*m~)o߉W|i!c 5f5sn/>>>^!YѣW/"z}yAK圜׽Tz=z33Vd |6^ֽ{?wՈc#G2`VK&s8;U+7l`2Y,&_Рޑc&$+){ڥVUg̜;j5q6m߳k}|456`@T?jq9ur׭O4N(WFnIeJbF˓'JJJMIJR׭>|„su;]^b]GDNdrqQyYEEccCCsscC]}UofK.I&[YY[K5U551G$D}{wZg$a2T8'Y-܉~QKX]͊4>OjkD@Iwƙ H4SF4^PοYVTQq13fDSp?Q(kJJ):DFKLܻ'5G"^17Pd żQX…˖N6$R񭂂W&-7np[hhT_F߷0z=Qݵ9iǾGyyQ*qDm^WWŞ:uٳێV*sr;?o5ѷ{&l#;jDIێI$R̙={|J̿e;<:{gHq=ׅJݾ}OjjJheˆcLhps5of mmۼcccJdJNW.%TTr1toL_0$6(Xd+_QzVk ʏs[LI̽H%"Ж8WVKz;@&kJ:F'qJbػɷ=JL)&s$ҩ̬,!a045tzuu^~^ukN")z=}˧pt0T*Ny3??+k̘mft:J)wf6aZ$rtÇ Qi4Ϟ>>\@dQqd*WggWsēVE,TMTef2o??o^\|hg0d㒖\6BmlRy\rb%w)SƍkQsLօO:u_SS-.*y)X>|T,n062isSssmی?5e0--1::HRQJUZ[,ׂiVV&։Z޿3)|Ci*"쇝05ؘܼ!--Z-Q =dRBaadVTUEw|>`pXT>(Ę MgEo;U).c>㟣I5>! F37ZI!ɦш(ڝa1'o?E3(tL:]K gWYs K/^ o-,oQT*'rxV~t"T.xՙ3gСC[>ؾ3ɧW1mDP4yD AV<{FP"֖y;ݍM- RWZ[3uLD$vTϢ6E п_xXHƍ>vmC_ ໻*j5tةS99׮f_l1QQ\kkGA^YZZb.4F"(75+ZJAh6mܙt℅뽸\4`R--oi5ƺRGǨ~QQ5Y"VFciTV7c^#^(FyCCM/hn1e76o/ (]tRy/׿g'oLyիǎ&%~JUW_VN" me,&TLjkҿ6;Ś4i̘q㳳sr?rؑo^~ݺeoivb^j..2X,nM7(JfIfyc{j >:3fkzd󙙎|>f+m===;_',Bĝ}Z XZ޺UU]SC5nCk;=CDo?_`8x q;r'Nru:_ޑb}`\YYYz}e+C^:Y67[rb䰭xc5fݺ5?xkjB[xL "".v̰ v>oh6mts3(ڵ'KI8i>}t[UAkz̀rVV^^- CssyO\\5DdI2 p6 6RIpȖzm΢Żw$mӦ[֖czG,.)-huV@ ;yƺlo/9oƫfQ(6$v7W=f ӧ9oG?q}K[o:Τgׯ۴&F(]T*VO4z 2g8~LVfCC}}]Iԙllf?~DB^́T+Ξ=$'L-[mK!xNpgppdd\r_B!7j΃N "ry77g'tڌ ^aEw1bb{G[s>׮Yv#*/^wKޙymJ\^_/ <^HLz Hlk[Skeq-|뿲7(asRhT*D\A[[TӦMнwppXv[svOZBB<=%vM^1CSSO]w=`m9hЖ-HWQć'Y76?[AyܩY*M5:vhPPDA&܏iҕHrK̙7?~XhWO2.sTIqBxE˗+d2 RL]W*f2FWWr..@D hZ&_~ْ'KJwܳ{׮!C{ʤZ-.@W%jVRim[JʁHdm¸BՒp&R &D e0ds!eL<9y[DaR ZՅhWUhzA1YM,"3xg_hsP..!Zh3_% i0cbs12I 鐛\D4sɑh;Cx~t3y~1Ga%<&' o2仍DYm\= ^=f*! xgC@D3X]9.h!L0?Oքl sxgl@Șx!қ`~CwkeEQQnXle5uڋ_xˑJuwi劭[ʎy-SH$2)  ]&OrfyJVtvbU꙳EDbZYIo۶}hESsm./TP>hb~_=Xj(adŋ*Q B1OoF"BghgF7h$3@WC;^_ϗ.a0zy&M6%88&+- J?iWde;[WW]]^nm2D=m{ ߞ^>>zbt{椠yZYQT([YM^rnݞϿ;w&JxJvvvAAc#.K#G|ԧ _f5II'gddgWT0..ᱱ/O;wʔ0aψ$;?jL`WlXrMܱj O9D DbɤRZFnIeU+}ףG\/O\VVWT&%$%T >aܹϺsr3LRio7tZM}}YYVdXYA;e7_ox*.0 "_ CmƒKϜ޳gYY/M|s+DRJ6&O6soZ 0iAx%;**5o^f 8"<,,"B*4(*UyW׭?sҹO2wNG阓ǛfyJVɉKHjf"ܹ&Ů_w@&?>!aΜ;0Mŷӎɩ"IֳJu 2/,*rw;vyǾ`-J?o6}ٌWgoߖ. ~zg40sr4,9l_hc'!~6XhK& o׿5k"}Ԕg'K˄cN!H5YBm6o2\xAjU*Ih!jR)t:aW:s\q{ډemܰy3z}`ഩL*}GF4xP>{}aڤ_~&/YgI "k0ȤbЦѣ]kXzˏm++]ւXL[햃xӇ$oo߯<ɂ\/)F]J,E6/,׬6 WKJؾ|WdӧMo߸X&L2eˏ.1۷6GUBm=?uJFCݭ{--DeMu{‚ɬ,*…xxzN3ǎ9Іñ pl}Z/ۻ.'K/M"R `aḹDO6v?YZvYMMzW<.<ΜvV]maafִ/[#nԨA]\|}Rv8N&[0'7'VTL2>94jjؼirg.6hKۙt^D^>uZDo %'gOꞽ7nFWn7 dfERi0US7mܙt℅뽸\2YP*ϺG XXիT0jۓ$,X  nv&üǽh._7؄uFx,-22.]UB U./mキqu)Sr;q";VmFcɕJ{ 6| CxzX}D<{v9r͂C$-0pȐ1c  ϷVE̐$79~ZqqmZbu6lqzXSu:ϭʪER⮤m, 29,#::6vF3_i;ٷ^j0I||2ϝMKklD">CBBgF!FgΤ(--.jB*#bbvu ~RV[XSRҾ}YY/fd,fWgGGta|{{@A&ϸt''kk:^DMb6**wT͛/^:r(?%7?tDS2of~=(z+s?V%&=fgܜy. `Cߵh܉F'IVcaQyE|];VZZTtæR??/kk԰L#CwF:q|R%Ivk-sYY=(L" !=zXW OOD =} /G+N4ٌb Dg࠘ ,f&`ŋH&oo~~Ss@A[ 奊V2I*qpJR]\䴴ʺz"*56NaWW;xpt/@]vhjjrVW7{/aI%j_~W_ۧQ>z+3R &;]6nT;ys{. m'&?p`\ĉ114ZCCNΑ)){[~xoj/<ӿ7rKJ-VZ?=_~y䲲z2))5%)Ijn^n %jޞ}{Ϟ[MH׏MrDdto7m?@ `1dRwwbݐHW.\ 8 <<(SG9s>cŊMF.geݻߵVJGǺڼ F6Y"9z|_/YڜٳV.ޝ=p={~cܩc VAO! t:5t6&jWW+[U*{ EgzQ\}|O{>ӳBESSFƮ{,wsucM{JYVT*ڣlf?h1`*1"2<ܢPο}%7WI*vmBcTjarwi+sDbd25sE0AeRoee lij wt!J &H,P6/0jK.E66RI.oiyup F&mnjnngm 4kmrYL6$8,,:ʕÇ׮a2u:`t tN@~Y&Nxx>|g0b57)Zjk55NZfV;7'|>`pXd퓯F+G ƌIٻwh'1js(T*񡏧B3s^O+WeogT1Cb--GƍV!^j0dэ=HJ1_{ЖzT- ,bvA:;z۪ɨ l `nMN/>_fɓ;w|x }/ygjrR۶%'+ry}P(x!~~dӎ@<^.^:~b6AiU}H T*J"d},o%ۊt>7VF#r:}iYѭ2C&[9{ONm,-y,,8(&z„?x+I nŷZ`Ţ?ٰaˏ En\LBә6OٳOR{\~/o{{Q('9~J"I]\{޳9'[Z*8L7H66==| .\뽽$=m8JDi4$lA^왌55gr\ C7z{q8]{1# nƈ2K|utd\]<=BC9.ϗkj ZZjjn(uueJecceJT]* DH\>$ Efm[~>CrJ=܍)gqO2N B7 "V|;ZLRw^{8LRt=^zگ8p8+V*lDD ^ol66<M0|[SR틌ljT.:++;;?J@`ozU}8PP8Μo2t7h;NKQ~~mmssIiAa~%W,3f$͛%5ׯ߿ _3$v2W' Mxu5r'~re>aa..ݺ55\v-/򕬬';>h=0'x#Z=,>::~6d_]bժ/Q)6ȑL28ci5}ڒ%/۷w=kDb欉99ȅnڸv3Bѣ׬;U(]4:z֫*U˗۷vͨQ{Bqs8qɓSRM~sOmmKW^an.3gwY exJ ׫խZOe2GJ1c{g>y򥼼sg9uUIx"[''O3Mt;6bk8pJu[;Vb[g'^zaÂm$-a;:ݛܹ;r@`gGA;h& Cpt]-x }/ygjrR۶%'+ry}P(x!~~d23}3qZ_ymNrΤ۲e۶B!yzGF --/CdO/w:nO۶%%1$V^ڜ -f1l2inMN/>_fɓۛ> dR(L`N4cGx18Sdb6gݻSضi֭nkX#CB{G*.-_>o?n^bŦ{'88xy3?ϟ7~;JquusHV7W;ɽ5I$.787oNbvǧ/[[0h?̙3n/=A$9&XϊMmٛh[ʳxDʊ'~c555664h\=7.|ۜ!!oxq\LWd"‰v՘47Mmx2cYMda I -RPL7y IDATWy;Cxy&Lߏ=o9 L25b =<J23kjkkkj Fc28l@cu}nO㨝 &g7y՗&&te(3LRLcDf0GabD(3ٯ/|Yg  eK#R( ŷ߼ޒ%#]sPfs&7`)te滕%B4 M4a6 c h2g7MMMd99! 5y3LØa6}(@A@: aP2t*,FIi믾·?\' m<>zӘi;U(rrRS/^hrLP5b0o$%YnMR҉ xxlSΝ2%v钒K.]+1 :tLʔW>q${Ƿߦ޸~1ogLwuJ'm_/&2@VkH^ժNcfY,R͙h/<=x䩯M}M<2鞉=-۰q 2V.Zf7tK(A wnΘM:ˠAIO'$D'&fΖ*QK.Y<}AHHx唔ףvRkNcS^ӵ\:s'NX,4GtPxDd}{@PR ihاlNL-gZڏ7m;}A>&&g~ҥ6=vD.e7o./|E k~z""bc֟a2IMw޾mOb]չ}\}{NΡC{ڵ}[qQA|A0u:??gݻWжm;wtٵjeyUN:rWܜm:dذqFT⒪e+_pɓ.*Lܷ!Rݓ9|$g!<|nn7oãc.#"$ҏ><|ruk;" 0TwLpc4R*   E%yybF\hgzA.WK.sWڹ薥{WfG98͵FRxerqv^^:]eyeeUUcN"Z=<򊊊J};9UoOf }Zi6:zLJ'OۻOǎUUfءVZ"Q/M@YRkEjWN#h5FqԨyg4_~tJ<8L*5}||N:tHXLj/rsO.,,*hZN jS͂ Ơ&krCV{|YZ}`4J޾#7#^)))*1#۞-ZB.76W^Yv :3cAXdyztV{M#[)1VdJ,Sb\^G!gQ(,/\xQ~{'eA|dvpjz__uPxD,6mE/۷rsؾ} ͒˳ڙCuqHƦ9QkbLZrrM&Y_̙=; @*--7)i@7w/oO/7W7W?߿/-G_-yF3r! s9{6mч>w;;jڴZӣFשw*sRg稨`lݻ+-8!<.IUՏ=)7m9QGGVᎎ ,]b'&۸iϞܣv^zР^&Z\6ˮsEdgo2,$`._*,.>ȑ_ JN~v|}:J-jx1.-FE 1/IzUT³眜TJEoѢu-{/ UMa}ߦ`ݽ;-uܝn=pG]CBZ,>xةSl6۵mvzR.=zxɧ==vfBq??w3Şsw^^rZkt^^n gg/Ϝ#GNrܹG$,hT?|ܱSp//?_F<Ѷ{V*M&6ED8tȀg ;9˜9}?~Wܽ}tⲺ|ٮ]zbF1cԨ1cnr55ƿ85,~޼iǏ2a~M<%6PP˿\rņ [u6̜y;kקM~ݖ7=z6ܹZ-[!AAzԩǏwd@oo:44*ׯۖ%-Ât1^4'G?_nNfĉ)c;i}h˖z{:9ŵoߺu\\XUU?2-BMNfͶ=]rA*_7e r/O>+::,}^7W.\,-m+ ʫW=<\];wi>2R&%9.iifU|֮!?iI hx'K 'K7m̘1cY .IL8eҦ~ǞĐQM2&C@@QP_>uAz&_L4:(YstJqr/he4k-mVٔPfe66l a J,0@. 2x^'^0:(ɆjhcS atP@f\S-^/g*iiv/Ymc/~2366D۹+W.]*,tvV:viݱcn Tn6[,N}?i: ]5j}\TKn\]1cf 2\ wZ++HOgmݻȑ"*$$66!oߗ^7U?tl… ]tII%ǂKeeVXݷ:vHe@Y_2k֜9)) K}xn~zu:|ыm֢ Y#"eVQGe׮c_|1)׹=mu,ANH NLX-UV]- \_fy=))vRWNƦ,,&bf91kĞii?ܴ)/'gWPp.GB!;k+M=:}ي=w򤫋J%FF&';d \s,~ҥ6=vD.e7o./|E k~z""bcVq_]w+,NN'1)SF|f`HH\\SLfDj]oS~q^.չ9|$g!<|nn7wo<tH?G˭֭=<4iV # uҼ%%ee So(Ri`@`@hup(*),7rE>ED rJUT\\r ~f^ȯ={}KP_^IÆ |Iްa]ʊ+Wѡ7=q2꓏?{oK/u╫CzzfFzzmmEܹ>y"FsWڹ薥ztVVfgÄ SNn>ޞ7…R;UrrϞbHy͚ٳ::CZ, L&_&"l4:9j֚L*չO>׵d;Re53O۷wf ":muDV_*-)P[նXh4vOxݻ23>l5J*/^gG\UWVVUUe]],RCX4RZ(j4Ga8[=>~sd:%L&>^>>zSN:RY,&SuṧOk4VkmN5pu[nٲv֭mT}zA "X7femۖwDNFR9:\TVw+Vdd\D0.0U\o/ߐu벲o;ĉ9[D&?w ';.wعs^Ǐ=z@B!JWVV}r͚K∗_V\g]j-;vlR8W/;;{z&ZFj_d|ufz_1ZPlܘkWp lٮ]ηMj(yxDFVVmW.^=EAi_skǍ7[H7mz2xƌԣAowc㊍݇vϲG@}I \墕+6lު{QÇe1$X?>ml޸SNذajj N?~Ԩv9;nvҴWg\_xF3>S'TгynttX?>o\2}YZ+W Wz{{xvҾ}dL&b VCCH\|mYXY2,8H3թOsrmxa:F=xSR6m\ҥ7#6p/Rg縸צ=VZ[3"C &M6,&FuBԄk\qY@$}f @}̔~ҥ6WWff̘1}YL&?n'ͰisCciiv ?cOb(B@@! ((:~A=ů{& T25G'񪴡@}'gP@fM 5nVfnʆhBxk/*ٻuEM 2 ژlp6f;Fe4k5xr2)6a26K@7P:(Y;clC436x4542 G0P{|Ja4 eM2&C@@QPМ/1|1?~o.]3Pbih L2r3CBz'/UՆZAXvmٿg+.zz:;Ձ;EǴر{7A%]._p[ \9co')R}nO?izzֽ{)*RBBbc}ɓGN?2=ֱXFz$7;ZZ-ۢ+WM>ٳ &w%%%&\V^c8xGq/0jBT6yK+Ξ=v,;;n]{&*P=lcq;cǎxÆ2ա{z\*7n쾽_ۙ3]]҇>!lcz 5<PZCB:??oVu3bjΜE })œ&O}mkwIOL외lن;wnؐrѢ5k[BF uDA~Y٪U+m$#lҳ&>!_wY9|XOIYh^kuuv|իCG^o}5dȒ%ѸOx2J0uX+ϝ۟3&:GA2hP !!1щ+eʪeT k,O߳G^z9%%௝Tکؔt&\ÉZAnA!=xAAJe>,,&bf91kĞii?ܴ)/zK_v޽;vd\@:9MySWA2egwԯΝ嗭[+yy??v܌7V/^"ϛ߿q~k֭|ҥ6jjZ19޾ڵ˗z__wAKNj Oܖ~XUP(u **/_|yygκ8+I\\ttd4_b/j55?~\"O{ءK:zjmNv}BA@YHyy KJN>FQ*Y"qp(*),7rE>ED rJUT\\r ~;o6mT*|謬̌> L1}==]]k~ؽvmMKNS׬ڙ=_S=<4*.<)O>~.Bz% 6xkɆ ۷uҹswwܩSb)..PXd2d:\~r` Aa;WT|T$7Ƀ=!`{A^ߘH ( җ['~oUXVRM3k$vP6 UUjJuxh*B!=kZ1pw7gW+z_k28{z8S!4T8Iojjdaа~m ݮ)Vòe?̈jƎ717N|iwwuOPWqUT6jJ% {JM>! pdu?9aˆ^]7`_RUJJ(|YוJqCL&E,htr8::6MiԝaggG\UWVVU=5kkM&̙ӧsr yWݻMS* \&W(T*FY7"5 b\\N#h5FqԨ{q}5NGF /Tj6x'O\xQXaҟstaaQFct:mP{Ze6z*vvvvrukQ(,/\xbHA|dvpjz_߆z7w2CdDǶi.5$7??K.ںkgE"BBڶks u~KV:88e+W].mRg稨`̙ݻ+-;྽'%֖1F99= eGVᎎ ,]b'&۸iϞܣv^zР^&Zؘ6V [ߜ4NN..ϗ\*-7=4bFF_c{vRi2=oN:_>ry˰>}oZޝ:w]ee`8Wi7o1;8KEEaaAAY7 XHg\/**$?~wgJ T*qo^zy?t??}=zwҲey>|رSٶmݻkӽۀ?/8׷F"qu]zڕV1`RPX,>z];uNK۷ookKFu[dei4]Y}őg޽{bbF\iSv2k%%-\6bČFed3?wS^7ő= 9p`-H;~<, [ÿ՛6Ϝ4޵~o,2-,h ޽m_9w ;9O>}-7n:zԩ'6lعs~Z.ZCCSǏ5*,,**.nCa:F=xSR6m\ҥ7#6bέ[k+zܸgff8th%~fi* P/ZmС_oeP'KF М9:W c89426lJm p2tV60%@s ^?_WexQeqLS $eW'pUIs(}չ6@FêJ( |Z[fx'HbB@~Av53~z4~&w`H;mňHdzTXtRaw profile type iptcx=JA0 >f΃7?bc)ם@l1=4?;ASڊGGc~[t>ViTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx@SLag Pq [ZGڥ.mVkmuk{܊%#I}gwxJn=x9P)rY(\<{jۿZM{5o0P}N"\,GWN~dSC@[r ɢ i,h:۪i~Cc?Y0Ȑ,^d;LUSQ4Y4ThދO "h @KFS IIqZyBA~Gg 4iԧߪ\}:j3Q*e`Ϸ?[733mol5Pew簾TWBTR2z\ӞCu ߳֍J*y`ȴwG{e&oh(*NIxNvvYi]- (|ǎnffO{7JUUhE 2/#A*Π4Sh4:ZѮ& >?;'ӗ.ޫJ^G.4"򳶶NċDbfl2Ш 7:xu1H\T|#NI|\&kID~}Hdlյ+4X*U=///'\MLPʃQio) !!9H,f;9wҥJeeUb{wIHr= 1<4S'GGGHxꚒҒR֖JUJ/ E7:\ɩP*T}CΝvkskyyyO3 U WZSդRYS{΍)w"{SG ё67ҫJ51v0RrD*U(ZRQ4Zk˓wUHKգR)UUfg߻{̜с~3Tq<=tA,RQꚚ89zzP T*Eh7_^^^nnu NNf4#[?!W/h*/#CB/}PoJJ+/(6\";;R* w۳Ƶ2RgȰoNys,]wϰIWTddWWx&Ngs||ƚ %ăij :ɩ䤼228N74qwޣo=.~QJ5qi%{"Rgc . H=\h''$%斗R&ӈcnۣG`OWTVUgggeT4M׮{ri4P$J> \$?D":uz gg>~]vfV.]~{bk4'yg0oo]]J"T*?)=n^rp.]$℄ؘZC蠈v |VG@E7 .rskIpԱwpr$:w2%ܢ"ˋfݓqH,"W T*b0%iu=u1`{0_,,-).˝l5}WT\T@g{xX EvNFFllrRNL`II,]](hl.)NM]^VQ4jtdd`%N'J)d?wpF,VRx3v̘n27 rr/^:z&tX,]:]&%(ojPX:dmS[N70+KҚXQ^S-@ziS_{UU686zH|24>ܢMdaj1f2[J>BaAIQ(ȳ >|XNBAbSU;ʓ_.|nlL_u5x3s;{+ֆ ?"$m-Xϻw#_+.liACk̒&wl9*h SUZ%i{mtzU6%qh.!0~7(/u"@$l itccC#C ċo./77V.2vNV4RIz2ZY:912Yii^~Q@٬eD_xvi1 S +=Ǝ?~g}}6-=*j߾GSc^c:Loo'Va~nvScqQqQu"ʒD+uEuy4ڊ(TY@qoM:p=X&+)te۶=c*MJ/ +)զ&ۻ.SbH$؂!mK>*v庼R[ZJ$"wBм0$\/˫%Z'X-ᅎ[V"Dnzz$ƪ-+--b2ndP9#}]VVt: Ŕf2\,t>׭ T*R729FF$rT,ڊcLWWJMMBD=S^ь96dLxR)foہ7HKMJlj E"@d@( Ǩrٻ-Jܕe2 [D"&!RQF)ztT76rE5eNoY"%eCrzl]=hJ.k^O,kzjzөT2P@F\@j㇤UI/䉄WXa;VNRrZ{ c1%]nD066tƌK22KUTXW+)"aeEʽKΟ7ԤU Zpqֽ{w+K\H xQ+9#m#Ai{n=`a`d,L&9G LOދofߔF_ٶ5WTRZ[\, "D hzlK&#Cp[_^8hj& ͍R[KƆN .VW*41 Zb&AQ;qIlUVZW:`m Rj5=ˏ콹d2B)tC P(#[}R) ZȚeGbQaAB(#A0kR)&$I҆.]L9F-=qܾ}IGWU}ږ[6]ZYumk!=Ô<@yi4@GL)Cz__mYV~ ۶޼Q_ga/hwҲ%R$mXW$>ڔ"Qc#Ov>hO>MMY8xhRbu\^SW[1~T)DXd1m[P|tĖދ7u~E<#-Bs([iE7RY]ǫaRIII~AIHi "^$RL[{ OCZQ)6֞^n*0VUhEU naM& Q U䨨ӧbc*UJ KO̔áѲۼ¹=w͇DZ 'T&jd:, ǰf۱c{snK yyRl\X9YqE; ..]]HIrMOeKMMrJ^=48W{!w¢{p9DIJp-KQqtԡB!55"Q󓔧m=56</[r$:45\]YU Td?} ,ͳPRYul>/|z %7<ODC)Ꚃ|MHYZ7c}?/#C3= Jɠc^G=Z.'@'76j"KIPZRRZ ЈD^eYY1YYrnmf`3Q*&=4-mNdHPT[D3~`--m4џLVx;.ckJT$"9heuvcD&Ͻ~칄6+* ųtt\]{ږə.>|d ߊz@(މ EUBau,'Rx ,dk.z'%Q*ko緍723rzWRS **BDwK˒cbSi;J11ӴiA*,*HNOk9OJm֚NjEE99 *"QMmIqE@^OUmJ" BE7{ZA~^.NYX{893ڹ`89[޸^UYU!䕔%\g77ݻt*̏UUY_zٙ,]H%d%ϛҶU˕Rifel[YQ^VUIӁe>e- iemcmfAVU45޻s-&T@ou[O4?<{ݲꪺr{*.(xឞz{Ց+*4301!Þy:i` 8>kMޏ O52e##GOH]Y.I|xO#>TԬeb{CCG'ḙʸ#w1531qv ڊJ}4J\!۹򥒢&~v׮ٚ[ӏ9s]\9FFOvJzgdeAI^Lu70ɑB,kׂNݻwje]wFeE}mFs{vd`+5s jnkipzeycs\gWnvDKϥѴ)-~z"4%l1⤆R*++SSnܸwB"&;u׷cG #20T( R rPDgZZz{;;p\\:u64Bkv?jThMeUʽBҮw^^dn@Ib Ԕ"҃ ᴍ}=XDH-{2kWnnnNnm)!VWge55R1c27E$*/OKKO+/=;urq6G ܺtRQMMf"QSHDfB66qur]-, 4&߿{wocSR(:@dڹp쭬  &liF31ڵKCBg4:yL*U(LC#s k{GggonG ‚N#=kH{xijojXd2 ,,MMutg.c'.ؘJѱWyb_Q.\WW wmcݩ3قLfzǢR,-Mtu)TJDdՈcfneoa#Cd2x4[L#d-k`kۡwo//naai ׼Cd5ٞ4Wϊ42qs>tTͫ72v51!qv}_2YMMVvʽK,Ed\E~}ɂJb2 LMH8AWL h }}fl6Q i4&SOO#DDBr8f_$:yR2m/?o570`Y,&LMLUO(ɘLf:: ESS]G":6115'dGګO_2>M%jX&#nj"o[?&BI{j!y֚l7n鵔lSB?J24 z~t==cc&DDdmc#^,ϋutX#L[K h@,&,wڴ 9O &mlJM;qbS'2*Kƍ9PiL9Z 9Wuu9Rw2Y{+ %46&%$_|WB'z,P_޶鬌E7&^.%ċ%@ˋiۈV$* O~L7U(55ը hEEEEEEEEEEEEEEUQ((ٲr++W TATRfm,- iNll)aClt E|^Gtʪ'>y>9qߥW(rRS&5 ,/^7͛E49"Xwp_d`pr~>|x TU$P*5j4]bE7V^ċ%ċ%ċ%ċ/*U%'O}'̝;U._R*^ʎٺu1$ryB²6l uD:ztPAvxyz5ëmv;dȊiixU{/Ti^3܊C(OB˻ty۶:{.3K,FZ*T*# ^ǨmV/4^3,-:t759}۷ Tq_/߷d}^/^=:Ύ*?2vD kh~cR /zT)4w]wSy{RO J(*)IJvjtL;yee55|D`q\]GFv`fdyիTV ,9۹sh計;u0o)BQ\rҺ[6_KtyYĕW듒]zK P IDAT͚{._NI), Lcc[[?㏋ -)vIh/oÆ-WOm>.\ŕ+m' z[ۏu+-D(44r{􈈘_Qp"'?##["%E.'^u`ǂ)+$_cc9bRQ%7n]z55D$jF$;qrժھŤ\O_ɩk?>8l\e˔)+WJ$3ۿϞ>i=zsQ>z诿cX~r_߄%gTiDbfc䈹߫%m 5kk_/82lDfƯĉظ*lO?~_,YԀCC;ӕZ\>o̯rw<~֭ ҪqImlRSm[b'ccSS B##7޽ޚŗw{ߖ-GvN+W.yK1vv:tF^4쎥>:{7 %.3Qyɓ?_&++V{EFNvɟk7nΚ5fLfftn@Ⴧ_|Lm}&*.I 7rTp&Q*+~/˓-,h֒+WCr8w[9s6nȐt+V?~:,&Kٳw<~DC||:c͛!!~+}mI$ii7qK>|+Vv/}ԳHtgNx|J`rLYt?.Z׶V/Z\E,-[Bk/"*o{ g[z&,^|%ItIŋ&N\$!ȨOߩS|O>b?Ϛh!}7q_ߗ~7{Q~~fl]6[OOs>K:,R9FݻM,OD XtӦ %9ػ8DY[OδCщ*\aO?>}@s>NkT/]zpBu{5TƦϕ9;Ǎhiy nh~ٶ 0œ0qY(|B12734x^Gso'Eݻ-]ٳG=ΝG6ęs$`G׋WD酄\շa3 wwYjO?nm>|ٱ#'Og?OGЈڌ.uwjffֶZ:ml~Z߷OQW[٩W_:cZ[E=w1ѱ}oJvVeˎplw?c>{pPAnryh$'6xy^T߈#F46^>xʕË'ttmM&~ccؐ@L, VHP(BaSSkD U&MOɑl=<\=]LچLF;8;[[STUUzf$Xd0^vS^.*Ս+WΙ;v;|T(l5|𡞞˗ϝ%cKQ[w%:T|6bd`{RTTj{uOA1~]}=]+*A}c,1jt\XصD"jC,f2:uvPs Z`p'^>WĉbM{ǟ>GQNGG+)վT33;uOnH$/_qS(u#\~i4 f{hf |OoR,NJ~-!A*m̘QA3e~Y{/F]D6_ $H43ifO;̘F7tAQ{ Iery^#˾7GQ45'7{Ά7Zn޼e+Wx_}سQS?411t˰a#FuXv&M>{jlr%Tms?ݵ )I3t:܏~='MkkIɃ6ѬÇO*ϯ?֩O?=Lx{2\Iz#Ǭȫ5j@ 窹9PD*RxjK|y#{h&hffm_E W *Ft:qMMmX`!BUJ51}t ,:|$6ۻgW(JJ/^5k._{t:LĔcPܾq?>2یFÇ/liFÓ z:yB/o\pͿLKJ޳g 77:F>rT+WY}Dמeeglm sϼHt6=:ft{d nf>f;vЬ<|ҧAi[3JaXd uu5dr& Q8KRɱ4TZQQ^V]MnoWF0{Ld KSM AZL]XBv >gO7WGGk+SC]]q^.ўF//OH_("Q=^ |ơ ea4aW_/nt?<##%%'5Ѭ!\r&침3o;;>|mHhF6HH߳۶.^ZX!l`Хs^|̬JJQUW=d7ߜ:ej[~2W^`_ӽPVWـ82ޱ`˖{%Ko:s/ۊYWQb0FF'YנRz;|#vܡ8++GG$:O(|eRuY?l<QNDG_~@BѣMM5۹sHHǎ$$1221p$R+K*Vd2}}++k#Gv]JKkj:ñ l޺u>~܃ْ7Q3QQ>>=:cڴ~\h5k-< /Ϸ'|O?eA@/=zC?׮m_w-^t?Q(nnA*Boܻ? u[>ܻwto퉋̝{|d/˿j}vxqi3 7n?;vD+S}.O[B _N<~i4[Q+V8]k<|hɒ_Pb::;ab`4Md/!!jcke%rmZ{:ׯo/\|}JiaٻOd}ٍ%~f],f5J͵s>xVΞ쳐_46ΛwƍcZX`g2)nyc|OO ^ծ6oտWW#8ٷvY05<#= "ExbJeEՙ3G߼lfp "Yl⥦5/3]͈C+KhwMx^b驽e۱,'-ZֽYPfqdy[ՖI-N-G] m/]hHEx_T Ti^l ϙv:,v^!Kk/֖IvM&KD‡סy{5t(cnnk EZ|]5,hxjDN vyIbA7ml--tuةe33cbϞ 6!# _$>;?ED,4`QhƖZ[߸y49GW(b뻸tԯ7XvΆ|ч's0Z_{oժi>,&&8?v>˓NǩO`ZE;ѽ5KJ$7U*J,??)J4N)o҅﵈5biIiiyE]tallblfg56xwoߎACZ6{>ZuEjܜܼ|)!iO,jr9d<\o[JȲu Y4=ߙFG|LxJjY4+yjzjFj//)^D>>:qLH$44ʤR Y'TZVvڞ7sVjjnnuBafۯߘșN>ϑSR׬8&=}G'N\8;1rka?wYGlټsGtt򝬬R) `w h&;MK+,llӳ 2e̩SX,ퟁkj{_H5.,CEc˕ۇDy7'%Z[P/hԴm}UiiXK*<ʪx, -5i& {dEW.ydVYP[o +@[[65K~U{!K5} ,JemmyEIIcV{CCS333Sk+{{2) (G%kkܽ{ZܪJGҜ]O7o0᭷̙<Ȩ1=ҥv\SRfXcƸ8FF9~۷1u/ǏbcۼiӦ?;x+<y_ly64xoo'2b8Y^5iSJI%Ajcd&45c'/U2\|UpZJ__>ZBoұ]n^ +ڜļ<ɩSgOO K&h;)x*mōj4&dLQ7Qӌ&˳_IH\VblG??&R(U5%w:;yz54Ĭs'#jkDoٸ}GvvZ={::~~xݻn `AP>v}…3gƜ]zzRT&T:n,7ζ5ލ??8{VLeՈlJUWw_(={O>>;w141cϞy{Jv6+MqyŋϢmgu[TNj5;v"f4o^qX,oﱑ|l$x'ޝ>kvb eeUWHe!}|<jz5M_Ԟ 8^,+HɤR֖Nnn9wƕdg8{{w RMM]9s(\qުUӦ}ك1X|^B{2ٳlm T~"BCmln޺v-99?_. |*U>\SS r'Q ̪@h.\.׸yx>;y^JB{lT$[O:;Q(11E%E xg7szQkmGvH풚^j%1YnYB^ Y֨MRQ'hr7X.v{~^5^!YU cHOM9y]x۫sgMϦ&VvvffVv߿`5|SS]m}LdZZ7O[ZXZR)Ac@4 H]I!5 :=T5uuLn F[asȰGxu4&]|anGs?x;yeiֵkxxd]XZ| !MRD9Ǐ\+L!s?0'GK`5\Э[I#OeeUUT3uɓ℄+ї/߼]ZV]I$L&͵GCnj 77{k?Rͱd/l~EERígcgfЧۣ-ڼQ4(,rMnΕq%3z̸q&&E/?v6*>.3F"ӳ1vOwK#J(ԦZJeH>Ty/JO/._,}=)%ŗ.nxTҧV%ű1mWQ+掎>z߿Gwgg5y ט2j֧Ӛ/]<낾O`*jOQċjjڕJ&/.9{vժ~=q:d[o Ν=aÏ?E7ܐ[@իVvLڵc̘ikK֤^pͿ`|p}}>deW7nXEwg}q ,޿X{/lm{00">Y._ZP8=th~fzzJe]]N΍gϞ9aú/jpGqJeuu|K$B2 33/_:y2_߼yC=U*^Cl졃ǏvԿa&M jj=ĉCVv@x !tFmmJs'O=Ͽ[`Μ~}[,jW{Ro:ȑNK5pI˜L}ݮ4ZƆN:uʁשcnCB [n\;tpQ'qz Z!?gwi+ǧk~u׫ f-2.}nhj-bQEyZj\'v(+ n8q츀s Mރ?\VYA\\ѫWPay O߻W 9wjJM|޽/ZZvң{pnݍ8d0:ÆM|F;~cCBtYT*1&G|&;~Bsn=zڑHS,!C}^k,h^njwEH19wk~SW_YQZyn6݃Bٲ#Ggb/],*21 SgOӋN⩓ic|q_6/)xxT{angϳYjmRQR{|ʆcG mmGE, `iU6-]ukԩRzzNg*)qqp {pw㺲ټŋ6oqc_P LHSWp{ǎ5:T^>y_塯߶[Jc2]#">l{z~Ipzt3ٕUVIc]g(.a?8.w9ǎe;Hwիn'%>iʕ:yRysyvipF~)Sʕω Y%eⒼs:qNjK+A2b8&LDӋYn ])j]##N <8,V.,˕U[ՅEhY!S(hحNj5 1ʪ77С753nط1P[++G߆ٓb,,8.kkimGRP<.=\KǑCg`0J]ލ1 h\ݻrzh>`z\V\,-i||nZ?c2YYIMNw_߼z:eEERVcgB$ SvG[ I5ZYEA~iFx{{yg聟`I$;[ P[Rzڱc.$ʛQgqu@7-YfMKKsKcI=^=oX_wnwv8u'Ni4E?{ο׮^=e7ٛ1X*wluwۻ;n'Nlp֭MM'8K(93*V/Ȏzah2}|O+m ^300,<<"0s>XtwC[.߮z5x'O>2J xWm;wnnew~u;w5~Lvw?~kG;wq._xP }wzK=ƑV[.;w ?p<6v& c2m >)y??~K {jT=ֳgs}^y mVyAO`2Tý=<'IXkimiuٌn+,aOD w-$Qϯ,sfagB0g,oS~]#Gc;]& <(oJ 2o߼yC5:̙Ng9&,waJK .S55&}-mKL&fdPaG_ZZ1vkjuQqͤ"Ebwg'ě7 4EL&?,x!ߜ7gNUu۶>}ۡClKL|܁bںr,oc##=FK~O]z#E;rui}cC~N^~M u ` Z5d9:1iFU>>ٜ.1h4FK3_0k:|w$;[.+ s"=e2'%eeeg7 }XFɶGJ vLkrׯWW7c3bh,ߒdŸfQ#j/LLz ޤ{QeH y-~˖g7*ըQ11^^fR}CVK'O\Ϟ5|Kgefx11 77np~֟~jG1_ŞE&k4 ‚z#,,*XK ҀH/* d;p6L㻦S]SX|}N7ؚ ;ΝK߁\/9-򔔣Gwﶵmj rh EED\q Iݼg{שzxmg{ω`sIIwڀhs?v݃ˣ3tL""qqP6}xͮ^aaiG9xP P?M%wRnLOj]]G rw^RjzGgxEGff:|:]DDhњA"ium:YyS yѣ'QсA RYY."hjϴg`0ne߾vfڼVꚄ3r _栮H$BY[G$p^,{ O6W4AEγIj#v%6YjyQ]Z/y5eʲb9t͛sBA܆ybVwŒ-\-]|?<~WKL< -{ѯ'Omyys ƒb" tƔCOͳo[{7|6}E^miͽr i9WΞx x_u+*o˃_pѨQݷ3!'3'G5zܸHGǾ12e/ q[hb A p |k@4JcǍ EEѤ2!7<=V4qzvVha56hbP)hGM\<J4LUj4ɞ‹gb4LBt4]&8Rd 2yi ( zٙh2q棩g"ÚE xvb}}EeqIQQZj|FT)g9z4ag'}Y/KJR_8,{ LL"ن/s% lܸwϱc̱c/ Gr"7  tU8aȐQn]NJRbqNڵCLz;l>p VVViik+z{̙3kp fIɓ;wwTBBnnEECBA le+[:|\˗/_v4{3gZX88o;ðOa=C"EDZuORQ+*ݳm{o,,lm|o&M`N<2s!gvKy񄄼JZ  2ח,:58z;3|)ʢx^Xwz)hc5_v6@$BW`P\uVѨ5.a}X,&vl &#Ro`\ͱ2:`>Ztn:foΛOD"*桃;v^rES_n(+ ?~ij :|D=O׮5ՕLb5ѣ֬u-۱]:o-OpTVGP.(D_ގuuӧ%魭/o}[%~&M jO~[Q9nɯN{ Ꚕcvo|xqM_l߾aat:4x=QmF"ގI$hh‚L.bOOӜD5Riq.,JR-X֙ CC;vVR[ޘWl;‚^^VVuu}o9sNdĤIVI /`ٲg1ʪ#WkjƯ_b-۰L@YbqX,o8EB&3g0_moyBE?oiS;{7֬7nĎ\j@KjgjpxoڴO7oz XhC̴Mf8ynH1́EsD*MEeQq~S楞_v $`, :AoxVʐ$%ea`%UV(FWwq8c0RiiYyNR"X )Iqqe#WdTW+ãS׷nٲbߺș;˯>hUپ IDATp ݓJezFRRZF;d0~°a\!%K$HDAC"͸ޑzL^^Fz^Z 7ekòq jk+NPEEEUU8}d3Z[jTjF"ټy7o~*XQ#<=f]`ޓ'v|C?@&ccǍ1sΜc F%%md֦GݯHd9X[SndzX孭r_@ᬙ6 ەJ%Z5߆E,.ҥ?L/ l^LhTK<@py㗝?4{H؝C ,Aݹܾ}qq۷a^ViMSfX2o [lӦoK|Ք|fŢ[pXX{CCKsSsK kmmxz}Sc}C}AO89<4 ^$-XT,읜"sg<@ C7q"5776^&z}cSZ_}/ 5~ bwרT__w<~{ 'OdeOxS%V, ?^IyKK4 F|wgI,>U|PZ޻~l~?ڏn5Sk0jR5;Jru`v?vp^؅ ݻևT*3$]PVƴ y=fz]CCqq`ml:ׯIW\Ϸ OxPw74ܹsiiMkaw7nPXJ\^.5ءa'Ǝ < VVQ!.)njlinkU(zB3mx\K `2 ۷/]}Ls` rq*M.,pq߾x1oY"Q$d<_= .9j<=u!..=m_xWtq{^RZbye+L&ӽ+W+*23SR ++mz=lc+DG Y2ejgG"s /5:^  6yNRO9)Xt닊3$tU"Iz3gΝɡP Zg͝1޲Sr=_|rF3k̙#b}TFS[[/ɨ:lJ{Ϸ\8o0,Z]YyEEanZ/XudҥכWضuo7m^zwH"Y{\9f,B\GW>rcOYjO>]B5sҤ%&8cǩSjuL̲3f0\?KZUR<~С>^l&?鸸JgzxCπRIRRSR4_?Tdn9{RvvcV{C}[[SR*(i4G @ֆ2iQQ]m[Je0(JJjkBQم.su-|Pp|_. R#ff ݹr F (ÑHd2PjCccVvBBFF~୨Pd2 X[xq5|8ztD߉ByŅR~_eq;?qbÆgnmjBCӰXBwL̙QFjEjT[[{V[GoxXuuCC{;G;]\EGwËfb)}tiiɢ_}ƏWqVV8P0m++~î]~ _W}70Ew>Ƕ'N?n݉rsϞﵫWOd>a4:iRDBq=|sJE;9yyEGO<ؙ_T1 ۷srP`f/͍Ų"P;/Va:jͱ^B毑HbAfw2Inh0)`Ҥ=<,-!Wh5YY̪*W׈=!JeY$3/_{ՕUVd"ke1t+r89PUUUP Hb>X^=wɧ62BY Q=[`/Rw<7WFFhgn.?qxlmVɓ+W>(eBQ}az}Hy{M{OYXxf^./sΠ3,,ZyyIx@;ZxLMz? 'VTb--8:ڄ5-Z[[re2␐wBdH }}l{뛚 $2}WF427hVLk&͟kRᯌFpVE~f"#'pVM :8%'6geNbG05pFR^^P[PXRZQY_,oS(4L3ll\ѯyCss䩣G$ۄ Y9Ҳڂ̰v` |BX,"?ΝԴښ&H3נ~~\)F}xdIIfIiuUC}kFC$Ҭ 𰷇EG;Jk84;'/O,vs#]lo9sJcg<~QVVryV֟g}a-,.CN㡭AYVYZX298((TV~zYimMzĂ`7E/HI,-jxK'S( Y^^B}uUm]{{l+v \矅MP/+MOtB TesҒ;.)˜1#|;:]SSVօO'&VT*Bf2mʊ[ihPG5qaX01ݛAFT<2 նjk--IH8q\ʴasg@(l++"{#‚FcX3w ZE.WQ[BYJ,ڳRk*ժʊrYMNsr=DZ.#d>_$rQQ.(77eJΝ;u QGhtMcCeE~1G qp@˾Gթ۷++P˶TV77ugƖFkjllhkC=G4ӆaMp(J"^ֳYQEs,2XZ!EUnUVTIN))qr8@(|t)(pQBml; RYSzٳii5MUU\_B ]$<(,T$ڊ8{ڵ⢶VT]B<8660C_ryyWϞuKZP66zypJeIIʝT^<8χFSUugdgfffHʼXyX5*r`:FjjiIsF) \kjjR=3<|@~!QkRvmz\|(E$"ȯJea!iY,bs*eJe\V[sl9P#JZLE*,r8 ѭ]\cb7 )|˹(Q\Bh8^G׋X-eeUUU2sГYSeT]Ւ,xN^nn66 Li4wRo6>]tϐ!Cq8d2f7;jR\! Q<^/VU0oce|2:$$˥Pt梢 /ekKwH5_>>C^@yg}O1Xg;v̛''qtw~~,ԩBQR|Njy9MFEASvH5:nkk?h43Tdas8֨ .9Ԏকё pFD"(@( NWS#DbD%WIIs3jcJf#;ŮAdJ#by{ ?nʔ wq8qd%?3umMvֵkWJ2~z}ssNo:pGnppt -$9rQՂёArXY9;16KCx<pywښ:QǓ=o"IfAA[zJ®4%/p X3$\]UUC*L-K py>\.j^= :;;Gў':]ݣ/B1^a^^EO76'&s˧:++NZz~AYiuUcCG] z~L9 Cx*hTFfUDrFU`ZxtӊBtk`URRrŋyyMMZm}]qqiiS7I&w/Аqzrre*!R(΂ШHwdd2js*d@ELZؠף HtwWH5=zu Ϫp ,Ȕ\\TX^|BmJ ,@/OsqQmok4&dѽ3tSWS)J4P4X-=Q}龺GO‹> us+)={6;)''))'L6j|oCi1#s璓kk khСt:IW;X]{{A$Rs:x<)*zҤC\](8}$J;;{z D) ,B wRkkZ,Fwq-BYɐH\Hw&eRie%P.k8k@ 7j sըyy-J&xϣ^+3pWW(+  i̖ƖfTgw(3@^.}ĉ{SRH$A3KDĀBqIIT{E&oS*ZT:3ll.>>byGA=4t9\S(Z:_ FFQPVY)N$4T(8͍tHN46T =ˁ, F䮣Cy"bGdʖ46h$5ͱwyFH$:8ǎRS+d r ƒfk'x[O:=;O=vhMh46.]۷dzS ˑh$䔣GOHon& z:'j.9yєZ,<`$5As&{}NWSSXX\bnH|EEaMEEAaIyG8;`m^{(-5>^Qσ3=stT¢Rs?hi;z)XRz:qdS(dn& Μuw1B(8cP؝H~>3rKEJaPMuBC‹P",,(,,*V#u~`ʊAf茴gI;ې_1w$cႍ9vL9v~H^.^F^^!!t:δ~ c; 2j֭kIIJ,.|\QsjuE{m}:-=`̝?ډG&߿?غ]WgWVvvBa`Q ĉ>:ݹ7IU8gÆR`ڷo9+Ϗ}PsTdn8cni1sB$S)jml ر,ܼÇvoWd 2no.^mjgό|W_ƚ~߳ƍؑV hiWwfR97駯9:hPg 'x@0u|.. vwJKgGz[)\nh?4Gqs̟7kƎ0\`hhsǮJ~{˶w7xyYY͛:9's9]S5mڇ~齩UWϞf/N*yzL@YbqX,o8EB&#CKKzzb$C Xl3F<0 < n=2FZ vqc0d 7~<޵(s.^(+cZ jYgϜ=+>:`Œ4Â3H4{y^M~T__w<…'{cXX ZhzI$[[(,l />M-(/-?/ڋ-FO汨\}}QqZzz~zJTYY\\T$Iz̹99ʠA+?쳹s}}Јĝp8.w9ǎ=ufժݻ?t rI#8,BxN11V̘oaѱ.ؑy_q?\ CAVz'7D??6ՅD:t`;Kݺu6fJ"56ܸq=Z s#q8#F攩/\w_\̚9sXoG.K2*+=*0g3?Os鲧瘱< #r]]ls 7W>ߞET++2ϝ9}B107@wHK446Q(T dGc '$l% EKK{{''H 'N\G;Q( aV~} mwlq֝8.x<q9^z>Lf8~5mF۶w>}sBA"1\Wװѣ""U*T3Ғf|zRn{w׮a06hȑ[j{4K%.^~n{wؿĉ Ξݺ X,x̜Ë8P0m++~î]~ h4`U{ԩT=#7n<~..as~ţFǿ݅=G-Ɔ~q-[:d f%GGp8p8Mk@n/tWK##'_'C^=E@AxC^=E@AxC^=DWTk4Jyp&QG3vvpxz)XRz:qdS(d2r<& Μuw1e^T*y ,:6Մstd;dg_qH{d P0 n[x_wvn kD"hNNF"KpȰacǾ2:2˥PؿI$%[7aOfز姟frq}!Ve˜9K4tm6+8E;I1^IzGϯMq;ksze,N [p QPJk7K2⯞yʕgΝ>5v] =WZ/r'((4ښimkZ[[ӓo%< l ٹ 03dY3'N9jl[ڵbWOMطlVxU̓t?hfeŠ[3tFZ3$mHﯘ;Wpƍ{;&;fb?p$/^ /qx#/:AgZxYñ 5ֵk$%t~wVWT\߻g۶޸YXX[L<ܹxd2[^WIDxׁo7kVS]ynn4N^f'>!36n1mmf/Z,H;z왤‚*Ғ8t/Y2cFx8MxsԜK:zW$bN l 4{?꫑$ҽ[T*KJϞ붭'*)in&lϨȀJ,[l4-2j?d_~s^5/ݓñ"@OZP R)*HRE!t_R,TK,VCmufDP_Jܶ] ϧM1"<""<7Xz{v߸;rժ->>DD;v;֭\6$%j qM<8)?O8;rPQHH1npP"' Ӧ}᧟Οҙٳ׬p⅂©S"O'SnC]oDDX2g·\<\n.>c64\5nB`~˙3-/t|2;kZ$*_e˗Ϝ1bUG-I:[vqc0dhPTg$%eh~# 20l#WH$>#D"Yu7ot}4%99= p oJLll2MՒ۷RhAYR;h"PfcM--CwrIdHb[:RI2%j_lȑNN@DxoJTX, ?޲+Ws/x>T{FZ^TD":FTy\`ˋ p8gÚ a hXu*J~jֶjku*"uuu"VmQTe ɏϯV;4Zʧ>J}} tmVtif*.R(MMHuulm:w.==OϰC-}ffމz_~>>&&-[AAb{=u C&KuU֯ =^0+oJ59!qL9//^|V++J}}ǼVI\.ޛ{H_oga,X$>~s\BB̚Yo3ƮM Ҳ̑шf/JLLo]WNyyR>F?|]]]_AAffQ@ d2@./qFqόSJKJt&t[4%$27ǯ^U/ǎy{xq][>}ӧoN9Ϸ:yM;Ov EF7SLJ~R}|τo`ٲ+7l=[bLj(*7o(uqgDm4O\xoݾ} ^]pmO?^=cY[^zk(^LM,m:k 6NM5LTө/ZvmZU߾F?^<(z{r9km/>qu?gfԦMP<[v >~<"88(i.J}ףG9rح[>~; pQmT9sBapƅz97l" gKO::vܺ{Tuj! ׷pmԷرCzx(3.>6vфfn2S ԥ@ʭ[9SSGaryiի99iIysioZB(3rx>{gΌSE V r-[֬IL 2uP?_nݭSX&۶#_ϛwHjfٺv^{#0iBZ}ȩS?|\p;=N.^Zmn(&^mloĤ"77%e۶>wVFk>,w{f͊=;::b!D֭ۓXxCJOiGվNNVRÚWΝݿwϞlǧk7zzwDH$RɓI.+KIYRRB --5svvum޼sߞޫWvNEymۉ?Y'5b͖Evﮬ\|G.`ΜA[z gި&`ܹ}Mܦ-[dv!M,o% CRtLj6aZ?eѺnn}zۣm0OgbGT 06qksΗ+o-KPhaٱAcS^60p?^~5-;յu='NzM"ha®R)ZXXZ.?p`Kw~R(46qs 1b{Qik#,Tyտ%H?ӦVUY7.LJrrE\g++!kD!T?յP)99OOwmm~ABbWnPddl߹yɓQ( eQQc(>X\pk-[ndjjfjaG/jf7?}ڋ}?T_JvE]]HۻM[@ؤCho?i[N;-?U{(IlЫׂ;ee|W)r*U~sߍ8(hࠈa^bIYYAAVV^@`kkj[(۷} }>`/?4J~=#ܹЎT,>iF~{z\]m_H?z[[ էSmی NAVӬ@};53rߔ)C{02=JKƬ^)[Q#"=O20sgx2B~Y./ԫW&gRz˖kjT>vUn] U8K\]]_N̚b?~LZѓTUzGg/VT(yIEOEٵkٲupͩM_;ק~}|;D- [`"q 1kfھb6m_34"2O?K?ۺ7Bɽ^D9ٶ66NNnG !=zd?9sv*/iK='䬽z7aūWK-Xkkigں5Jӯ---.)-;P,_jH8=V ܲ- IDATPV;3dh`G(2~://+3?O}4͂;6:zP23bƥ܇ẓJu쾽?n xqK.]̸c3G&  <ޑ>>]vm[ɢEÆw_\t|rmqӕ >K즅W/&M=@c@bNSGZ[I…c{5oԣ;!#И5P(W+nkEG?j#:=HrbNm70H ]\:6mUfd\5~|uy$Rs [[ggW6mz:<2ޞ-tu_Uzfժ7X0)iīs,93AxJ_P۫T*"'_I/mqPиqs\WW\v|ҡ];|)9y⭷bu BYGR6𑝻S*|_b`[/_ֲeցAf~TyyiYIijɓR{u04qsk_Oiheߌ[Sτ񆟯n$ ⢢l{bbV~t꤉h4^Ωѐ~.,322165T*^/ܧ|3WT~,E:"_@iNYtԥe*ս*U^WG^oُJeaᱟz劍J=qjEA&..??vܔ)OOkkV_P.YܿK 93!aS(>ž/9-ۭ rk㣣#_Yq;&M EL;t).?~g]dfٸqԂo~7۷74?\ou+oْrܹK%{{oﰰ1c^y%,m4lBºukcSR.\rJ$26qv zeĔ&wfkC, @bG sNӾVItx{i Bu|VBa$lѼ#lݢTl>7'|Yn/<~++srsuR;^ϝ"ѢESY-G Dw56 Vl+O~%U))GOIKsq mK#GmbԢDRߦ$vƌ)cckj:5z;mLwZѭ߮Y3gδ%[⭩];=%fmIqPAâ<Œ|Ԕ`ߦQ<{HQ,J UUݾ]^y6jTk_8|dŋv,,mjL1W:}vԨ/x'{{Nv|.V2CP յqn޳4~џ,7O3P$zCIlؘ+VMB&wcA?//#7G7oㆽED0053rߔ)C{02[_pfV"^?Xuqn޼-sf.._9^.[hb KHQ>d=\E9b55gRҫ1ᎎ@hfB.?v3jg}| 55UUZ꺹y{;7IIWW[+iӬj-11fXYYտN![4HآJxJHd2ccMxyy7Ƌw4nܜy4tE&&V&&Z]^~͛r~s\BB̚Yo3ƮM ҲDxQXYY^^Vfؼ~1fًcjMD֤[kfю~ummiiqIiZ,-^X{@J u"kȵ>bf.Dںm@~&h~FEݺIIĬ^=cŋJ˖ ܔg0[4aV߿,MP@&hR;o} BZV(|֢@ dF&꼼zy3JZlBW77++9k}ǎ2C̼q)ilPƣQ^~tu\{>$15;-ϛRjA6jS^׾Ø1n"GӦuÏ/qpDuvn>>]vm[ɢEÆw_\t|rmqӕ G* mm{5jK65nӦ)"""z{J̌3W6ڭ~Fr_b7-? JjXSsʹٓ-Uͣ @"-D"JMWeBes]La㪕{|UU뛙ٻz]\4[(tq~)'^.tɆ ?2s߾3g}ȑ~2_=gdpد/>|XGܢiS_Ў/ճgeʕJN ROQX#.6f7޽dɾ}+WdVV..aa;hj7)Ro[t׋*+Bcck7#56,w,Tyտ%VSgG(k/fυVV!:yyu BYGRBY"j E ._ze֭LML-Ҳԓ'IJ:z[š.Tyy_Ŏ;{yΟiS[~KmXj7ߤ;w.7T$i>OD?N.߷o˷l{RyDbo9f++W%mZjs\ѳg kk-,;v0p#B;8:)juiiلu$&\pJQQUHdllcʈ)S'MF(w5PX?ǰw 2Y`ێHGN=6YtȑCWvh36N>yR̚7[}˙YUUe'g(mݺsCü*}*G ;v s{pQSiٓ'Rj-}{tt|8==i}=v3jgCiMMeשY]TG'?R^Af3'N>agLC̬SǾuJK;u*'GJ@*mVr"&f֬+mׯWU6\XUUqrffY?ѿaۀ ߛȑW YtR]XؤI\-\T+*n"齙rly¢"yB|!}._Ms{kjRo.U\PYYJߣ@>Y(EPf$0w|%;@*ԩ];Cܹ;vjhȑl{io;;?j&hFj(*7o(uKbf.۷e2CP ޸~XӣՃ=e%ee:SSooS{g7agTԭ[Yٿt`||L3_T.[l٠AMy#"w7_ߠ@G7W//ĸ߿s.$ݾuə;vzԙL/ϖut/ڹu V+Ԫ|_*mʷey&>^Y=Jޭ=ttΦڹmŋX]}&miǁk}ǎ2C̼q)Wkt[<[D?cpwl*i:rI;_O(>,w{f͊=;::b!D֭ۓXxC=z5Oiia=½[K EaafFڙWXvy?c#޾{}$936N1`@p;[[ǷlY&1&,lԡC| {>K즅b`H8y/ZlgrŚՉ }JeaںuϞ'F&0a׃J>G-^besؘ5|{%\YR;,,"}2hc#@c۶'~%NNkVŬٽ-]Y!98\963{MjR)ZXXZ.?p`Kw~R(46qs 1b{Qikòh`ɧWPͫ-vmObD,3rvֶiSn'А6oްaw0< RP@CB7hxhxhxhxhxD ͭ[Wfg>PT˫*n#ӳ}H^&&Mq{ƬӧwHb6w\rl̓zt'djymMGmw;XINLTթb_Pss[ۦM@CjD^_Pb*"'_ 4X\pk-[ndjjfjaG& lc#zۧTWظС3WVT4icǽVZd<|֥KfژKM-(O|}{CCkx /1ll\~uo=euEEZ wm'aR9)1kKio/de Ś3L 4rY3k)G~f͜9Ӧoيvhot'@ptMn^Wm{~i̚o^cb̙/}9dkR_}wߜg9C#32ΝQߓTU,^=%-%([A/իS9Yp֭Z2fҥT?7QG]pv..#ߞ~#oNM=~"\7eJtt=W~AUTt(iݚ ssxcŪ^nedtmܰȐvWx>hSu_~yٳnjqs[N6Zʮ_>|?K<[ϵL>zӧlmG߿Jut;w~z Fd#vv1TUUשY]TG'?R^Af Ϝ} td#y@P^ZZRVvwjjΤ=KUWwOB̬6$Xx2hVWT(Hv IDAT"齹4h"Æ-XpI|渄5fmgb]6/٧PX^~H^P-_>tH߾˗~Y5 kjIFFjH+zoެ uWjWWVƋDbdl(U(n޸Qxf&f^#ںm@~&h~FEݺIIĬ^=cŋJ˖ B& E"7ȑk}\1sRf$U{㌌6jӯ---.)-\]?Q!~38Z,lˣ@~aέ[_lV+Ԫl͂;6:zP23bƥ\BGG*mʷey&>^Y(zyԮB@,ɌL kyyYy:<ծZiM{4ppPΝݷw߾?CBgsBmÇ®3fώ:`@H{F鄄u$P?/~tZdi%5z{ΖH||vhYW^F zӦm?4bXDDDpvRBQXv&]zHsTpM?f%jR)ZXXZ.?p`Kw~R(46qs 1b{QikswɮTj|+V6Y7w/Yoʕ%%::2wXXDDy8Q*|O<|u>{Bqq_-^|EӦ_|1*gʕ+m͢MOr/B+羻SlU+cc׭73ww |\ӟaCW#X1TK&37y$'o۾b=X,ˌ}};77miNM#}Կ7Fha~֍)R*SϬX9?'Otrղ#Gz 6^=FgAJҼhbHHo \qϝqrǧI=ۗP=cDzeIt޾~.VbqUuA;׭۽[Gs^ڌ9o=feH__ڽ{͚]._..V<<^z%Sק 3=@ 67.|Ziӏ? &dhxhxhxDUXx ?;񢥥5Cϱ8hxhxhxhxD ͭ[Wfg>PT˫*n#ӳ}H^&&Mq{ƬӧwHb6w\rl̓zt'djymMGmw;XINLTթb_Pss[ۦMOL=bEd<ѵU˖᮫5g/^/(`^] B?č1Q,^.|굖-[ 25530KJJSSO<^Cŋ̬ ob=##cS:J%7hx / uxy6WKK&$[6&11%…+WD"ccgWFL:irn6[F^SsʡMVmK>zlVVaamwǎ;bDhG~>ž/9-ۭD|%׮GGG~y;vLLL;tС~pQ:9cǾ'Nfe^V]m(stܫN0thp衻Z]{i߾ W曔c斖D66-<ۇiώ6`Q];=%fmIqPAâ<Œ|`13+6vƌɓ֬yU!C0axqyyzo^6fgɀ.Өf޽}C>|괗,<}z9sfe_nrŌ O<)-2d䑣̪rs߹sbIѳyj۩O}Lڣ@P_pЃGܺO16l̸2.ep]pvNN?r97&'9S'CөYW嗧O={7{{;iӪ9xY/̳Z]Tt(i}LllV1_|{NNwR[;ag=̬SǾuJK;u*'>Rpd\\\llҒigOHM ^(yޓEVȳŰa ,\4jT"щ1kf͚!}:/޶S*jZkf*.R(LM҇c> ]]++[[++NEEyyEECq"3Qꊊ[%%rHç?>x6Y[ oϨ[5)իgLxQ\|ٲAXd2@./qFq&8z0SJKJtަ&?:@,6I Bnijq;ǹ)`x }} fAA}=dRy1RB#z{r9km/>ru?gfԦMPsbdM'ת24gcDӣN];n=jEZՓE꓿nZj@԰sgݳ';["ͣff޾{}$936N1`@p;[[ǷlY&1&,lԡC| _w]4mۖ|hŰݺ?m[ܦtBGi]Phg-|XD޻̚7{vttuuB;8D7RO'$['Jeo$gpXVVZV\"H%&{ZTJVؾm];_/* m܂F^{]k$kvO|iͪ5weѢݻ++d27W? >3gff/d>{Bqq_-^|EӦ_|1*gʕ+Oq@`$ <-_bĄENpumݺgω^?ZIO5W[2&9y+9bXfۡmӦN!m޼a3`4xQ$ͫf/;n77aY+-/"-/"-/"-/"-~ƍwEKK++kkcq4-/"-/"-/"-/"-/"-5xq#G.EYNVWV^t$ߛ1c 2WN?Xq3oTOғRvvҁ{0jYY _ڌ̕ƌ> YJ=jըQ###=ÍOvMQ햤I/l;aAm~,y#,a:2:zƌ1c }ɯ~c^v~V[_pȶ[ǜX(BT(Tj5p qT6==RqI;o۷`y괥_N9^_^}!Cw?gμykVx7-tHUffIY7ҩ@Wq%EEmxV#B.YX\RQT* ce?nzqxILy0Xo&&CθRÜ7n8|lxVnMJC4 NkUZ~fIqePӿߌ;wշԹ]h}55>|hY)>>_#~!y~N9sKPbG?~ wB%ab}v!3g&$̙ݵR~ԩ-~ʕ{;v,3ڵjC^}u„CmlD%;wpo[Reeoλ/<`AzG?qZmAAJJbbzI#D-+KK?yU~ǎ8L.(LHغu7k׾̙ɧ .oxݝW•_s#}yƨFFW&+kwޝ6ue#F?mZ`kWWӊ˗3$gg++Ep/bcgeiieU}ɓI3҅[%D*O@hx+WtHVQʆ?ZmMmUMuVkhljbx{B"15maia!ϫw˭ݽt#일<|}w5^zxS2՟mbf^PۻwQ|}ZɴڒXi>dٔ$EZX\2yY_}۸ ;|m͍&M;o,e]=Zmq}+}uJO-ZsSN6nl>W7"<*5p/-_]XQ^\\\R^vJaQmmyyIIa-¼̜˗/_JLNNIʽ|9}HL D1R"1307NL EJn77vrH***Y}Ϟ 5S44f]k]Li`8=ϝ8q!4"&&I"~됡յ gΤ)74K8zښ>߸nDR^Yn H$ iN\Knظo߅wR1ѭ[6Ogk++3E -ꪪjwXG쵐J<\MMڳ /+E|bTM2Tvݱj++7( }6v̐!}vӇk1" #VU(UrBq$988;;8H ++L‚+WR+k+kn.+_~ںi޽G:S\\ѨF22rrԀ5ljpڵ߮駕+^}O8m3xq& noWVg0VEј)̌-֋wLL;tl0ݳwۏyUU]}̶={XYuбc``&SL&540/>46NTh\*/*,(,-5X@bedeH@V o()[aĠ_G; strtpS_}}?l>i =4t _zrڹvʕ˗jrJŋGd Fp7GуUXƺ}'JܭH,[t<.v/}{.={K͵1ٱcΜ o ;n\l67TjnS EHHXpV2Yz?mIPSsB``pM6$'_s ;w;3ڢm(//x ]Zi4wl߱#+ݼK=th RiTTlODF XY/Ձ%~lFF>C<ĴicT.%d+>j8n\~a~bMoil8noN?^h O>yd 񱴬̼xĉ];ݛ`7hL{y w[ =<=%/ضe={[8M\]\o>I}O4rԮgf{͘T7n\`WB,*p./ξWٻşu[",*JN>~ &#YY;!vРg\ͷ^~nã:8;K$9Ǐ[64t6cÌC&uuaϚɼҵo27qrbo_k MD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"/xHċD"^ "D@$E"xSUUII~> h߈?D@$E"/xH{CۨHXJEӈ={I֨8: *bA6WFpdf QF3}Mzz  *bA6WFp46P(٨#{BP5jB Pbo"=Ҡ}u# =U#i#ZXXP *{kċ_T,ؿ32z׮$Z( :w quy!CC1*>7/7/+g֛fU=y:&NH$rDh+9ċK<?Zh_~sŋf?Df cc!dHTj!<a`PQYSRq۞{n*\׬^7!1:NQS_:u:-ZѣgGnݺ5.-uSML]=˯A84ċ\T,ؿ̬+UUn6ffBFi#ff&&9РH$*A}Z-ִe#ϬXVfgdXMRT[oϞt%G^Nӧ+_y(=3=Æf7LLČ߇/)ܵk?zL,o׏J!nlhPZRhŨTt_Jȫ?DbcbRWWZZZb`PYYY5((wsԹSge}JjJRU͙3gj44ON~ȨƎ516373wskӦM6mz3}OCE{h'"ϔxcnj3~\NNΡCG:ܭ[׮=oh227l|%7jW&3227urmӶ{~{G{UjuJʷkg QQ3g֐!R)IHHL(^ğ'.]s><!k3~{{z^TW7v:G SߗWVjO}Np!#Zpttw h٦M={FFz?64s֦\ڰ~ΜyswV~O9U~+gx̙O?]yk%YYRiyYyyx9=YLl||#DDjWǧTjddd|{ۥTV=k]GğMN., wppdT]h`ւJu>/Od~NNw}啘>ċ ?B,^#b{THh .ʤwjYXO>ٻPQ*kڵs>^Wk>ۥݽ-?.r+uץBlnna/ϿЯ퇌M*4t!mfE.whyA}8ƍ izN:wMjWg{!^&ZY^]SWgd,(Akni4%'O}y+W>RYԶMǎݺcg+g\Ѹ+9tq㧼4yrNNN7?P \;vUV?3oP<ݷٳg….J 9;8j!!!F?`dTZ\Z?xl ?l5^l]UyE-iKZqˀvR"--+})%%)#JF۹σZ 7'^mi.X޹kϻv}nvq޶M˖?{֭{;ߩӀ.Ry넆n߱c ?p[ӐQ;i(ԕ[˖[ne6 KKkj޺ugxzFGGFjil,_w̿┹s7m/G"Ӯ+3bc{trghrv^/hڶ+FF::ծ]ѽ{ume}qUKnCxy6o)1/Z:咃/cQ6[..OM6}Zt+򚁤22Mu&h0Q+rVSQYQ;gΜ=|46~bj*\06֏X\\^^SV 6޸ϝ۾mǎ4sΝ^xa oo|}~lȑSr垽q?<ݣǓOE|lheK-߿O񩧞z:&s?[j1{yx8y⸓@٠Tj **+5|CY]xRkkaF :ޢںltEӦv$O2tvȴ^r/^LNp`Q?.17PՖW{x88\_MMV։{sS))9EEeerod 5Z]Zv>q ŝ<]TT[+[Yt2lqz/w>MR/Mdry~/s1}<=;״n2\x;uukJeѕ3gmXkיө99juN>}߿MQztiwopAEa3fkq֭IN.,j#"}j0 N xߟ81,iǟ꫷Z)s_|֚KwֶC(? ,,ûth'Ϧ׷("j]_x̙5k/a}vӦlnOOR_m((<5(굚Ғ&KH>d萡6mܴIvvtvvuܹtrj%5%O~~ 3+#Sa&]=|o7n]8pE.T 9y.$^;ߥFSRrҡ۷o۾tg ^+z_hPk _h·溻w3|x66ƙYyy8F$TݷlvV*;uz=ק, wZ'qܴa,LWe5\]\]\KSd7{Qblm|6B/qUeeo>m\ZݯcfV]q؎۷-]SSG /ۋ:eBs>LMuq s6f 'g//s3//c0K˃Ϝ9w65U ieJp.BUJTUT$$O/8jXWpTں@Saŝ W+ZȌ?o[շqhQ_*+5gg|ɦMdc ڽ[Ue}FVTX[P5?Է86[uFZ%[U*RZ4H &VLFF2SiYNN^NMT쮫96TzPa~~AI6N7vqܶ}g۷K^!!!^^^>jyݫⰶVɑJ+JK33.\ز 0 2RrMMlmw|V9ݺ úwٳʒeKܶ%K.^yu~\~Zп,?ە m4|]\d+ڵiӊTYihƛ&>Sq_kjjkkj9vF`Qm۶ofogg`"}06u |'^>}r͚{" =;+rNnmIcbi.6"]Р ۪lcǎfd-i:LN8赙wh&m6=j wI鉓_~?u7ik __{'>kCTTdm :t*>΍ZI̙I$Ǐ1..3eЙ?TWk#((448~Y><:v81jUӧ_Wgnmo/S۝?WGaV[U[۪ ќ%|BJJrԨnbT{cg,XpC 5QQf 0!COOON,fFƫkk* kJKJK% ;T_ul||~І#*fHIFfFfzSgϜ:9eϿQ쌌UV^Cmj?RߠB245771ymd6vVBkں;44i&C}<==|4V7{xxy c8_!MP*KJv`ނwIdQ=|Dv6V͉-5k󆦿[&5lTVUTTU oeyˆ-p6-[2\0/V\Ҵk{s+6=##3-]h?siSN.Ċ„_~Nڷgskxu[F&&B{]eT41(h*+^fW۳\o'zzDDZYߗp+őQ&Ɖ GFZɤV%KNuJ<_SӷuK&-U윝\hZ۷^g#gRB36ֿ3׷8aa^6o9flx؇|̙⒖}|:u}W3>n{E[Y;:XY+LĴiֶ\`br3;7``D-C>}"88,ݪo<uyHѓ&?o͟/ שӟ|SG'v?+蓹|o@~uJe\S'/|ˉz㭷ΜYu]<Oi R/GD ~57~Z"k3f{mk@6]R +WX}0V´,woMT¢+W4Z{G{KKIѕs'gdK BB4c`?_Og'[ K]r.q=<5Ԕcǎ/(ԏuv\{4y„(Yr˗_Bu?q?KvNvNVzמٷ?@z32#t>zĉZgh6<:;|©S'N$$dxxjP/`[ oRMNLH8r#Gъ9$-}{#oLVTjj38;X+c-RiO ]iӺ=/:?Tfv-XlDbnݻK''皚SʮkRYPxؚ5k=zϿwޭ[^ew_K'N3&"B&OL\vMRRjky-L;u1)#GjkkkycE&UU'Onqf%˖,6tذjNѕ2à*exgАpc!ڷo[Wev}=٥.>v%xոr7Z01m]*=~Դd^-k<4cɒ:O_nqKӖU^k#s}YRwpa }v'7ts0`H&S cHzݺdzݘb΅;Ygu`%w/^4~CC~ݻ;:dee))>\V3C?U#FnK~a>O^}L8bD^[ws?ä۵ vv27/,JOpCN.,&vbJou>J$Vmێأ9 ޵r8;O6ibdnWUQG/ta]uzؖ[8:}/ƺV;f괩SOzwߍ~ghU؞joQѹsΚuڵK,{{8y1ťYKА[zxٚT%9)Iʆ[r7ow-ӂuT!ݺ="򲥟~RߧO~&&JeiINKW--##;uHL-̴W$OM pr.xxxx .^hф u k t_SS]W-Laaacckۡĉ/%(NzgU(F6?o+We?0šCˊmTR*CzQ'1υ.tܹn}w;Un=bKS_qGڵzõnѽ}nҤnz[X\7MJ""BllvIPp@+߮i!!>3/>ҥV-۴nezÄ.bυ;YgaόK>kg-?=c5ǎi-,\][qĈaÍ;ijKLLX5VV gKiYDi2=iȰ͆2'Ν'O۱{~>t0+Wj [h*:'&Nz`{w@Ikv~wxLTgLMnj3A(G똘<ԓO{xzx6./o/oE'3BtN^ͺuE9ή~Қ[ޮ}G13<\>qĎG(՗0\@@HC Qwm;`bbl3xЋ/}[ܖ{߿vWU NNas(y޹"/^\nOW /  O% K.}aIX-JHHK?v/G[ٽG^.NOCұ+tH޷Wȫku[>^>/o{+Jݸ@Ӝ+uu-R}0d¢.!#MP]V J])R*_kߧ0;!ba#rc}uk!#^ۜZ/SR=OOa <냺GyԨ#njO~uwf} fkgb#kS[Mϩ:7m4xQnoV]m+ݍHus/p Pb iCiз;Mh j`4BgVT~u&}ST4mk41j\Q]8ċWhD#^OWihd$*T,@łuޚ,x6b=lY> ={AX2YZ KK*T,@łmb),.=.,irQ1{C?C#aZO*T,@łuޚd|aEXحnD"^ "D@$E";vhQ!<@܋SleM52J0[IENDB`gsequencer-3.1.3/docs/images/ags-automation-toolbar.png0000644000175000017500000007610513607210263020104 00000000000000PNG  IHDR/ Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later +4 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\gp`-w қbM]z%obK&$& (*wp }>fgg癙5濌 1.g Pn 7DE jn!4zfXYHc`Wo^Uդ(HC$ř4 a6@G4s 3mp>^'G0OЫ7z2=sxjnۀ4 +p2m Ma@GN3G'%9:y^,YLBp} | ir3W.[JM@k>RtѷiaWo^]U:ROWGo\T}[p-?On^:Lt}<EwOEyeEYiSsSsc㵬A0]]\\]]7Nt׾j\%অBϱ_8 !C15PSRRS+**˝ϣO'Mg0ZK \p^ ;;{Lf2HCRDd%-"ᕮ> `cg[[tƿeXȬmLp)|G}D{P<=cbbSS$S~w{K*9|1:xT ǦxffIX斖֦`J$)]]:^O#~FRi4AA!!'O>}xeeUuyDgLgc?qǍ=Ց}|WwWwg])L&JdRG'Gg/H( }|fsWW7'憆ں:΄tRQd~qg@HGw73Z Dcۧoze)æ8\I)/ EB+QkYJ$ XRRZZ\|mͽvcwl.'!<^x%8=#lz񸓧Lc>|9VVz>l2Z1>J񶳳kkjjsrrc)|NOBM^;¯ƿ899::;tS?e?h4o޻S}E=Ҋ쬇ya{ ~öۍ^kuZV)Jb"z`L--#mNg=[r멬)+rs7NGNW[Gg2Ls\ltkYolݸB j#)t)u ]=]<.׌#3U(>=4l:ǧ;g%Fl7io˶njmmfEYZ֖Vc,'sL=<n}, )sfN;G&G 3PZ:H/?>[ /*9׭.)!ӓpJEfJ%dr8l }}==t蹗PXRBR״sEi$"4Ԣ]Pyp,;]AXZ:]j'GDY bYN.%uGsOu">;TzK2ɹld^l}CCc}DS+]9 ǓLu+?k4uu s~$jqw7uu ĺIhVKLcdk]]<=UJR'Lqqǵ~16&&:!H]y%×Nik#G#ah4%7;ػgi)tw)cZ[v]5j0Y,1&114G(fLf{GSsyyyY~ƍ桡׭yse8{&}v[~ڵiiEEEFFE-Zp%21T[or}RtܙlcCn74 <. L)\ڒɤϤ񑣇;~kS*{{rqفC_}dIb⫯rog3Μ.,:ڻ^mKh+CGggWGȽԔD>_:d}&\j8T }jSkjw;9dR$h٧Q9#/*RRݻgOrrG齥ё-6""22"x=cQ({jE``^Ց6ee QGb=޾_Gla!;;+͹WئP;<>k1Ͼ(O=䓫V^_yٷBKC:۳' |>"߹s׮;w=_i޼{]@Br{'/;>++;JU^x1*xpW[$ѫĘ軻 n/?ߺ3grr\]'N6mXriSY+;USSVVrʦ7nݲ/٢jbxOXb lu_kU}×t虮laanniIWz|>gnNbE= EO7B RȿJM6=T?Ynٷ-[V5+!;}N6GEdmm9y}}&L3:{GoanN^nvmaN2r{C:I])q>>>ޗHCM7QRO3uĩGRMĽ c=3U9R 9dW*8(h௿nW_;:8;9jUT ţ-rCkkssC|0{A٦GKt:kkϿ/tmffd=\o]RL6y)- IIf%%} }o;BKcO=G.(e/sF"Sn~jl^7ߜ89wW^ip0WEéVU=/}/99=[xk+ڎ7 V>{f}|_CG effa![[<<&DMbnN9OnV)99GPyK/Mji9mj֯{>|>11.v¤.2k5'g_k׿?3q ~:`…gk߶ڻ Ǜ ?Fz8HEgR\,4(*.))*fY,SSUeD"P"uv[)MM]s‚dqGg:*5,Cio:uIGmltɄfLM#"8E ê'ԩ#ïyy9}wtwPJKMM9S3%KTWWT75757{1qbPP`gtDĀ_:РQk4 "Vb+++Nssk'k%jűR)>0Vo_j{?/_=::66:q.roALT*FFψ8>3yoo??ee%%w}M==,RWWXXَң3pf01w<. ^q8TJHgj2Ji/_t|E,+=[ljjbcz͚kIm{L& {_{܊ci9mڔ)'?#,[>=O=?u`-\C&˝);Ο߾} &`BH٭;nEIijv˖g4JGӿiӹs]]z@psl!)Õ5k05:'#Gnܒ{y 'vUkj=~@uw2֖1a^涶-|/~S&ΌK̮ڊsm9==tNw<м!d26扪uX\%ߺcUWi>ζ_ǵ|3AY4+..(r¥K{Ӧ','5-m,NJa0yzպu~mɽ7 }65eҲCn33| KJKK[[sgg73r{GA37Ri47{x{UUee<yyNDhiniƽ>3Vgz[ Yq6=Æ:mED̘~ԙ3qm R'/޽;vleM+r`kCk_οx_7kOqRTzet|*Mtiq$מc;jf<~{Rx4;̼֯~z+쯿lTXhm%TWܟbeiikN=">'zxw}_9wCeegqu FS[{*9~66l6W,oΞscqWDԸJӧO 9xpOץ$oۺa}6?x3UpfzjK/͜ua g'zm[OM{e&ǂi I-{ֿ.{ܸjkpy`VV'1))===] Gĵn EHВ27--yVG{G{k z%Ze2D&kmkkkn gϑ{Ӟ)~̽mCvr9}gY,Sٌ E=wGz_+!9{RCU/\۔_DJ-,bccccI‚)'MAzIOUMLNܟ& j[[zml%RER,6fOyם555tX. ^H3$[ROIK#a}Ar|\bbB\Y233;YwwO7x#;x;-EnHin&୬|R<.6&&.v䔽'SRS]%KGB \ oiAגp-5< ƅԇÆQ<^dniQ#uc=Ԋ~wy-)vv}~ }nܸn?g߹s&Ҭe2,ln.WRIMS^ai>mڃ&&zzq[a% YW$bk_^ۦ;畹;3{_qtO?}wIaj6cZo(om\]e2 z,,8t*>oRvšgY,8;GD;?ivMՇB/Z8Q ۛs6#?Db@p>$)M}٩׏geum=8p`~|yk߶wþs糲Ν8{\z@`i1`]X+~DaU(I;B-k5YTz6OO,(ϯUg|佖R3_zͅEyL&`88::;СᬡG"QAC15{&"<|FdDSSssSLfmmΎoHU %uy ̌ǯ(kkH]>D(IY.7^}>> H M*Ք!ѡӂ .mڲuF˵c齽:z𑙉q dV:::889Q _Ov)m9JMs3\XXTTX7z>es\ltkyőHk0gbI~^'|'_׼7DBPh=}{Do\ ,vuJO 4:͙3_zٿ?3glZ][s`oH$3f!.99-;e&&~~w߽belyҋ7So|+d\~4FW5򲜜EH4Lƍ<"7/33T oQ^kܾӧ 4s\ccDDxxCz}oo]mV։ǎ)omTl %pbttHqbxVQTxfeWֶq8BW! 9=>OOppXz͙߳kaq]n{~ڴO?\O_QY]ZVW_[SXxؖ-QS3eѯ}LLFo..{&نK-3m@gs?Zf-P=zaH(;8>?ROFV_kEF&^rN56k9v²V&s֬^HM%!tt(?5ZW7W+v:TXT\RPMFs8t =wvvuuvVVUהWIo}GJ58R(JN֨rВ$&cz:1C#Ieп$֜o_ș3;)i$:Mo3_RRwt761jh\]<=UJjQAB kç0iVb¬eSgΜIk67׫T$|cGx{^GݏWI'ܮ.c1DGs %# fRrrI^&F`n.K$R޽ɻw;~7<.]FMʪrww7OvrƷuF2i IDATVܿoӦll}4*i2:oٗ5gND譮>wC~O++g?f/8w-%sNM6-tzt3mE>̣89N;7,Ţ(8rxu\_O)#UTi﨡~--mmjuuMkRE~.H\pddHdII/8}D`tёOx8Qs+4v3|۾{ !|k+89_,_}ք?mx &g%65*,+ut542Lll6ývLfzzsSSS{y/`m3Q֓_imVL$$cG>%B$Μ)/S=p$YVby{}7YSʲQ.,㛙0zʬ[ܿfMUf2-3}]xV>6z{pF3IjJTW55XDBNnJ5,(8wIFµ6^^fA @ِ4sԈYI;0zIsJJI/{)/ ʊq|}}|.c}e^e߾؄k#1SN9yR,HYhW}6~-ݖBΌ$1VV;vhNNC}I2/tٸ"$^үB#"#"8t@gf7x-7_OV&z}ʫoO>6Yg^z񕗣#"ȹ>qf|_oҒ佛;z!!av,P뻺ΟOI>VSccbE$ؤ7@*~ԅ"-??xҽ}}ky. imzz}CکLfW'j P;w;:} >>rg}Ցf{zGE;8//Pן;{\MuDəcԔR+'Xr_xz?x/|FlLL&K'NdggTtU..+7͟abRWw賙gJ=[Sѷ,ѵ/Qכ>ʮ^_A/NΪU--uuyGlן+7_/70Z׾mws*76WzDg3JUkk*'M xz{y5So}}== EOOFzFSP-+((,߷ Ə/.>qœoaie5kl:гFsPFFII}J)]ka1m'בRr[[YiYiEɓ&M|5D|4HX2v&ߺ)Wqc?omokc0~pFmnj5w{kZT*?&kc#oppLɐUL2u|xHJJ}cǎԃw,/۾}׮;EWMO?{6=J$Q3O_* yQJJwcGyg޵įqb.Ͻn$bzԚ5zԅb;:N4'lY7C ˅Ѫ?jjF2ZMRPlf3Z%܎x\Gmjoft`{GSS**j}:m5<R_ 5b)>abT6rGi' =r䉜,RӓT~& yG|+W>4z.,,.#E(7/ 'F#q\,icRsٲWV63a33g䖕X'N\6mbH #Rѫ ?reξ4xCmmmm5u5^n^33$T04뿱ں$%lՉ_e(((0pҤ?%8tp_9gqG]}CcM-I .׌B탽-^7 9VY%[zeΎ֎NbbbbYLt8Ln^mߟ~9+Ѫ|:vqO23͞={=Z\V^URU]ZxEg~`i0B>}i tjco1.pcGQLsd8{&TOmuׯ]v@ZZTTddTԢE .Yf?|=,V{[{[k ӝf/':,y\>ϓJbDa ?Ih4zx`}}wv?۳z3gn@qRs)0h~[O9XZ^<uEOBa|&!fK\[hzPkrrV)~w.|^Lr wvW^}[}j<+g,vvnnׇhj Kf;9yyfe槟ϋqu'{~+%#}#M4Wz}WggWW7D ɧ9?z816nƌĩSE,Zm>d~RK&{K#tQ>;/'B5ƶ=;J$g`cY,Ĥ$qG'NL|i"Q_ z*1Yvuk2H4]W*I\áx;:233+HXWWl;ֿGe]\m۱s۶記;;[[;¢OOoW/RS+( !iŬڻ'yoި蘱qÏ}*\՗y㎩Sf|'\\&N8:BCOtw8+ @ -Ummmkkm-+,)$ۋi\`7})RlP]][+( 0- Md5QM|\bbB *Ggu:(86TVWVln6{x$Ͷ5幣J>ӽm:J lV@>u'"G%~"\HnTg#$K_<wqa3B&d}w][6;ڋw3e#Znn>w8wNtvJHsPvr㳃NܔS_aLJMY5 ϸŋ⃃=<ޙP{%RsΟkn2#\f=RcG rsINNMɱ訪HƏOLYb/^ ݷcǃɕ}EK"mo~>??``"K//d22z{;e2M˗ϞWʾ3gFE{z:96*3Yn~S9wIGĵnX_&Ok>ʲ\?{){lv$蜕RVV^^ZJB[YUTVTVV}߷G͈S=II%~|ĉGΝ9-4:殻^ӡ硪TzhEj+]://??'g8hi彽%%jJTtː4W*s> ̐,pj>_8:55555jZ mSö~P#{VӱYLeL#DžiGoݻvnǏHHol;66>6:jʩ}ryDdTT{ۏ׭ըˊUN_7ma0ܷš##"˒SKXzH ެՑN~FUqI4#uH;t0mӦNc$%͚g#,]z}}k,ZOjh((8}ȑ*r o`  ӽΤoݒ~/)Sݭ':&(NN?R_~q飏p߳{HӨmlfH-]07 y[?]6λbwPPl̫Êx-mlz{ly(7Tl޴}}w[VW76J..~~/aòe J/m_۶]50\|1ĠBvڳ{ظxJ$bLJ0֖~403{Gײퟍ$,o_t3;)i$:fKCwףTg䑠0E撩)t*eCcC## ̻= e%k4"+hy|~"###݌drL?~`F|j5tXV?C9R Jy?bG^xѢ%KJ$fZZm;wn߾n?'m(Qc޽uu m-m 4tg43.itf7R5++=WJKo@}5̂=7g4e< %'ۗ~mJ%L,۹ΘtS92;Zjh4e{?O2^\~d,-Vx ||L s;k++P +*=`lFsa2mBCs֖5YYf6'ygh<=FͶ mmΝ;~̙zY,@"p`SxoX0_ݶ]58R9dr)SwܽkDWW7⒒RyQQ1H IDATKN:Bw6b6:_G3ZGW/(NpT}&+\JTs|OH^)ĘJ}S:;:1 ؘy63k/O/^xUp%6{…W…)gUOF|ܕEX'?0,f>NGǬX?c?23Ѷ8;zx g0vzYçfĘXjmoL8+OLltLdT\8uC&L,;*z|r[nb"?Wcw{4r?aknʻ0k<$8S*ܷn޾mۖ $q6##=#R4Q)۪q[GéL[o~a@#K׳>c?RWF&˯dnX?;s9uԩEn<)`B@@dTDdDZݫmil*-.++U* |A<ϋuӯ0HPt|ϝ?w'*&*褌DEy:|BZWD{#;vtR~4TLlJ7H>:p;݃9E(47::O?mG.g}OFܼagu`GP?wHuqN5z+F4RuS, %3O[ȬmmZFᘒ6DcƱcRdqlzzPĉ7MWi#wBV +@{{{yWPPX7rh:\_WWP/H2hk%ē*W7Ə/ _ygs y# .ɬe֣_NN}OXqغ2'Ϝ|]ݫVZ% >׀ͦ_|ŗ%E:^P) JI&%~$UC"%v?[Z׻N1[gK L%irϸqlifFF&ÈZ*9C9}&u߾#"J,ɬmlFMt(?ܹƳ_߭& IvAo/'ۿkW\ltK>L ;y` AAZ\Yb4sǾ\;-tZ4̆\xSq43Ȭ_}z Hf0rz{轠DhhecKՍqJ#}{4ӏtրY ͧWq.<>̓6%;*m{zܜ703r%Gs H@ <^4үh //^~Y榮+}ݟ .5tȒ~م!~]Y/95}mnޚ=0(zttLH|_"!XWBg`Ζ776u06"t ÉpF޼Y ИPnix/Y PnQ,b ׂC64͋'#]|i Zl[VCZ434)UUp '՛/  llIn +س4tjMw3@ @hI i'՛]AAW'ivtMqgK aC:26]c]c>M~4te]c%aAIENDB`gsequencer-3.1.3/docs/images/ags_generic_preferences.png0000644000175000017500000017325013607210263020342 00000000000000PNG  IHDR͚bzTXtRaw profile type exifxuS[n = !HA!d"ǯH?GCc<[1# -ZdEHWlXvOTO#~C]D+^mƹL_DjT.^ۺ%^%gDimZ+I/D.(OL-:,1] SƖeΊQAQ AMfI7g`lvwhjV!%`br;yASAQvd.  nWqRLPXٌ O nu 8z\N$W ?;ezTXtRaw profile type iptcx=A0'P>ǡ=x0$ 'e+.8|T2kAlhbUB^CaApSiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later w| iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxXW?)Lf b5&lf5&nvSLn&{o6 ( RDP0a0}B,!Iy{Ü眗J'Bϼ2)7N?~F٬R> 7"1KX~C峝,'cLov$)d o3$P,,stfW5P憑)<lI !凤 dXXr&!hCqHL &L F E\qQuuW!7lG+WP[xc|qO^Gh,6ךQ&AMS7HUVTU f`_21חͦRM&VV(j,ރ4 L^Qk:-odzjrLAt^I=3$/owWR OM[kh,.liV((''h֬9s\8˶|‚.ײШϟ/.r`؄NLJOvZY ⅆk==RDQQQgp8ZmM#_}XsA?ږ՟w8N*vk=HL4ٚId-GH NLLI-++&鶶nD-ZcύV{W֯R9\o%KxdSk!˚.]Ue˳wp 1q 'L`4 LIPVV t!T*dQ:V#iխP=&=&͕ږbEts+nFz}oߥKdf-Ճt+#uKWttk֦ϛgu ]\}]]~Bav.\.Fv,@j>=פϟ8iH?DdT)k۷jf&ԫiixXRaevڵ 8 HL&̌k,mј,Ni=$bwVTL:]sK^#՗F# SD"Pyٳ-77Qc^0gu7H Rw>BYwWowUe9sC\ ux{Ih/]2;ՅTU*NWjrN> `O<|ȃ$J$NͷWZYQqBSsXتUoze?vPc&Y~ysIDXup5_lj3'!|1xv!)ik$%Ιb TW:fe^^ZS!-ҳu5$B;DD].!!ΎN7T*OјLI-)Z -g--yG*<+5z0$lCR6$d2i4JJg~4 D43J#H&&t ${PnP)I-L`tL\p fef3FwuO[I7^9_UWwwwwH. ?yQf')":`4Z Fs8<5Y_kNdiUZ-w#:F%*&`KS'[o03x-:IN`UA#q%UL i4*J6@h\ j0.R^?鵐w3;4%y+EEe*{{$˿Ο/,^z@-iQLVF^jd ,ӯ˱u2\kk.YiBTYY εfCS*eC{^d=LfJ6p'[RIFNg K S*RiZm29س㝿ǖez5O~;]H  7mz)Ws74KU*õD<%1X,{HȜ~YcckkWg@_NKq'gϦ~キghiW_}oPg_f[麺/:߱/44H$d>_r.LأR(Oee}wE)VV66{XXj/cTT#T]͛?2<2 >7a2~?H.Jj;39qbCc{Rf;;ϟaՑ..cg4q1iNW}oٳlAeeKKOVǵvu y衇MI 8Xڲʖ-]eH$:T\TSEDo/9S9]u#4}{NtM.|} P|(?#+s_;:J&/2r`4+WoOO~ԺX֭_ULNyQ7a}ɓ ǺItX,KgO?XHnTZu9;g߾#KKjk[[ ;;wŋ׭/9*~rn}Uj%׮\j4-LM]ё5z{jk 򳳏d_([n}A/O[i4gE>y ߼~fN6=imMqdN'n%XiӪd(''{aÆ7x$w!iu*]8p`@>{ɏ=d)]I{;YU7&J杫GU O|$O˓7lXJ 0z{Zčl6d? 3yGPvvO>l޼0G'r˖?,**.jzyq`8 \ n"7rM&43f5k⯓]\SasH\]b<=LD8RVUtAAO<1N%I ˖!sfzV~ "Μ.9Q  [?$Qq8??+6 ee9"iݰ}E `m/}s_<| %uΜ+hpt51^~yZoCgr[|eQQIq$9Y=zTv~ ן{r\~\ӹȾΗeefg[‡ҷm7V\ᑑBHmh/_@ewI`ֱcbۓ?ݮH7I(LL|_HOL7VxDi2̌Վ>m/Px~Uf(,CD (wuZm]}Uem^ñ1קT/"<11:F (/PVsUb0Dp8"W)hFƮ] .]`y>5Dӽb\],<{iƠ++I,+AAd,V[YUUYSպVs8ZfȞtW(*+:X(SGrcMT*!SiW 2~eLy tSk]tHJiYHJ1>w4^/n9G}x(*y IvFSIz+sD@m};DXe9>io<dRȇ:* lGRrdY! 7m"n [ڳObͷxcJg'ɵEFsq^ :OPܲnsg#<@o{I鞢5~k[jDt:*dFrUHl\kNWvE*#w3=cqrB9~~e0ݝ]qF;7/YhQhR{{ǛE6 *noc&,f9:Np<)Μ=ܲp5>ޣ_7wty}1|(,lbW7733[ڮdt"0`蘀̌ eU::j]\ׯ}Gq8!|i=7$,߸10`x9^ulO@ *%WEcS|u~ i(z&4ʌbgT߉.:*rq1sr ::/6ɒ^&ɑjәut2ynBWW[8~oqtU%K99 ="p %%Oη[Pl'!onXv*hNCNuuC&nCyGJK}}/qqR g'/Og'ǸgNܙ٧;vh4W'$ srP*+O?xLNAj<ץ%jPPHށz2Y1> aO/# 7oh<yt5*1naڄ8;իSRc8N*mvwX1dޅBs\ӻTrU-Zt:wΣGw~GMZZbyntz_oMMޙhHFgg+UxY^R b'^9L@Y٩S'OTW C;;^-(طwSZZ/^4$'pn.MeEncW,چ4޾+WJK\Q\\96&S__' {E%KI}7Je}CA~nnC=4oYqdrEm]^ޙ1 aaNt:bΝ>wFLN[_wٳk\nP'$Xդ5HU,tubOfI8Xw2n~,VWG狊^PWm2zz.]qR5kʈKzYwbo/֕w%K;jjٳ-W~y~v*/ќӧ-VV~QQ!!QѳB:W/^,*"SqqmmOt/sօͶ'&FPtJP\\PPptnnnޙ euuLfPʕOO&{O縦1ٳD5W/\8W_BSLfË|EWX[G,Yb/bdf\3+-bR|JJ"R,?%˓{- &\Y[wf((i<[YqfrO}᢭onЃ]2C33NtZW\NpBa@?ܹj0}{˖?uP}~R>ٕsmlϗ^':zȞ~w>ʫc!#[t=:tWa0xQQFT$׺R۹Dߘ<|X643gۻArsKI?p=""'$$=/HNR{/;w\Z[.OXjcI+I*+;/gۯdtURYaw>o*^>uG>|t7x#5Uae6oWڦ""i4[be2ɵ+Wj>~q SS/qtr ޞڂ#ٻv} e[|s5O?SVTbeJʦMml梢#_zf xג܅c!ST}53vpA82Il cKK]]S陒f߉hE)L2 @`2Tڪʺz.('<-56Nϙ}2n>[X[K/.(HI3g 'G`ֱcboU+܆S3as##Bq˖?lh4P{.=s$Co޼{Nb^X4&7k7]ѹ{'&: ;wDN[Ͽp]fr[|eQQIq$9Yme8 \s2FD"o:vvO>a޼0G'ĪE;ٚ'!ff>f_uR9"uuۿGWT.Z3s4h fc;꺺}%ҡ055_~;Pd\k='O^۫ьWFupZ(Z-. Sgg[[GHF97\\W/\z++b0-JB#V͙ÁAFc{GU2O֐O[rʊ\lm-Ɔ:qQUQn^&22Ekfy#PiCp¸eKrKX BoDݰA&VW+#|p뛿d܉ 56 "QR/1&r2գN~<Hp ) [XMnl|斶kz=2ǛF߳\A~}C[sI}LƦu|G?dt;3#u4%E1tZuGm4vuW\*)njKk,Z:2dx͏cq'Bݿ斅 ׬}‚>?t#$IռyO=SOMy[oHIKKL;u뭩;sP~htvM( (ԡ>RZx+`8;y<7+P?78:dتIťܜFB8Nf/Ogznc\\3w;4ի99Q(]'׫5v^~~LPt[%d͝lF〼::gg0t:Y۵Ʀs,񲵡s׳gOڻ77w``PEY[;:Ds椧Қ5-ϵ!8ukxm^gf8q?hBr€ ##mlH' }7qȑSXh4l=9 nNkn&Э|cb=0`}O>%%~)zzIqwTV嗕 ݢッu+Q4k/_|cc|}` =wB{L…<[jH$+:}@@\l^#uLM{GyyKϝ|v,׼')3[~o{]~3cs ea)w~93ww,]mK/[>gIIL ܺ1)s#yoSBX[A+a~k_#7킂=ƛ"AY A'5CB  3/|2piuMW118+;5EdHăB ?[, 0uH`P{Z%>iLht?0:ù=5C f2ጐIIF#2V_TeHqݎL76ݽE? C `ԃUUNeeSLQG{5HfDL& BaH0) .x1Oƒ"FJO7)ooG 6J))"Rhf Sy;3ӿ0a) KXR puLefp"2p/"% i pǩ5P~|:ϗe5D=X|ѷGn$P~pog4eƾy>50] Vq(ԉREle `4\HAK wFaYi;Bs?֭_}u]`o}22ĭ?FK{6oym23||o+*=r' h1` F^0F4ʭ\?*N2CBED3VɳhAΛNn8i-OQkLblX;a=S7 ؿOy@x8S=~~~̫[3N)43 UXb[22vkn f4e G (pj;39qbCc{Rf;;ϟaՑ.. vo_U䔇uם:&!!,ɑFL'Ev%yg/J\άE˗dQxA__wHvvnn^޹s5W/YhQd'TP}ԉFDG{{s#{g}]Tʕ 6ǎ~6{ܨ(??H[ć߽!*j wP(**Μ.=ѡڎԣ*iljl&eh-Ov|Е0tFxKbbTT@P{*.t(~`>[%G~Gfeuw.[Դe""aa#wHaH6] f3?_R[~df\3+-bR,N@#G$~6?hp,(?ں_ֿ~ypAAJ9+V8; oO > 鞞#Yno-_}YTTR*INyxΜLVRz0رVPP_ͪnnۆ  -[aj3L/7FZ{P(m7ޭ'ؼV$9;If }Wt޾񉉎KD/3f5k⯓]\F7o^X_l՗?rrѢgpȑ/o>O'J4eˉF,=ѣb7n I #i۶/v55]dvXΖH||֭߶Gb՞_?._gW%&&:9:99s)].IA2tj>J*KOg~(Hvyo_%&89\!f?]۶mޅq˗[>;c9z˗?3n!~~lvomY=ۋc:&A شMɫbbk"4t)lJŋYYY5A-[_|q2t̎͏ߡIXޙqߓFJJ2)~3LFupZ(Z-. Sgg[[G%3X/xxxTRP(t W. ō p8,ƴ2z>]S(A,h};xwxRI:KkkkgGOL D> hQFG$ƶ=n{/Wt `?qciO{GgdڭL Ec(_!J t3_!AWph'6 BTu'=2tݹ RRx̨6{.&Sϔ7i4;7T\zUjdLRRnL`  Id:^_Wg[_|q^|VNw%MA\<[[.=#eLd4Ғ &2ZC eǏ p8S(!UEdr9IL5o30`ll8;d_oؿD.$[WLl2qGi2 e2Mn\#\qn_*nE]Du^)/mxǏ8嗧NqdɊ+W-Yhǧƞщ4޾&R'j4CQOtLed F 0nGpHgN[RS܅7;e|ȵpt^+ OGk-YC$zvGdRJB|QT&=t4#?(?qڏuv 6F~l{Krjb1ɶ="QZ-UBo8i㍯Mf1z܉(7{G};Fw}ƣ;s&.ٰ> \T^t#Gd|VoZb+I:x'feEM1劁\-vaIxI=ѯ+ȯoPY,_ /O*̙SMutjfzn~$zj9z-7FOo(,(.g͚=ݒ`}|ɶS/rP Ϝnnnl^?پ~A^"\acdCOґC5y}E֮^FD"nhn yzz8uť]Qf OZSS\\Qem0Dvy%%==n11 lvӯD::-L_pGsv}c^zuJjtL@I.;@[&*Ʀ-Z{ώGi4iis繺}55yg/^nNqqiϜ޹3;OwhVNHDtwUV8~|62򩧓>lٖDtΝSt4|NW}CTg>|O.i4Q$[bLoI0 IMB6! YBBn ln? &lrzk4ıe|d ~}Ϝ)>ʍk.]|ϬYN.ﯪڷw˖}C GPX- |u߼׿ni3b44TwL/*# Du=ouHJ%qRBkw'^ٙ.zUϤ=F\.yo qГ˼^oE[^z$3+;;90[4ZСUyIry5zJ]΢%+n߳綾^~nm]"llT* nȝxi@ ZC?s^AVyם>)ɯyӶm;w6 I$:tffΙfMt' ჾN;}?cݶ7mܳ7 1ӧ-ZdiaaSmkʮ`><vĿWٺxڸ䜜Ϭyo< ko=0A"1qZ%g?ѾΝ]˴iGm{Ɨ~t`8lqrr}w5}F~ۭ{G[/;w__Rq0~bq8 W9Sx>LL~ァOe˟s%%Z˹t_o93 j4f_kӦޡ1wa;y7kܺxcKm,Z-K}7[׫TmKFW)ZD藺{ۄ>h'' 5Z?? 7||ʼMŋ7igP+WEoOFFw h`JkΜ 3.^B, |L(:xߟ5Է j12:;'779InkJAoYٹ)6Z}q8<~Ό *jjmjzw raƝ7n]>4 '%䮾{<3c׌F>وQ&M*1&',9H6I"U\^ .XPX^p9rĮ֎1wbJvp`(Z8{vZڹQbqx!U|h?j4IKwG`"F߉V jDa0Dy#N`@ww_(d1gg'\V&ScCK`R*F"\|jP\Ua$|#dLǮ`P&SkT*% Dr% ,#B*}CS(\{x,raT yƼ>a]2O4**:gp-QTJt p!Frj5H$ l)J?G\Ft(W4L#BqegػOSS`#F.S+;[tIBވ Fcc-oܸO[>\80T:n<.MH#{g M rWP{۷<,[:{vbJIpxt _HK}HNVG}^j)aE1<"^'<§Y>[T ذw+ϛ5KQ> D0XZzDBr몕s&8pL=(ddTA>oOp 0i\SR:pmxb`{ ycƠܼ_?xS"=_zɕZZ~'7mlhqyGD,կ>?|sf,~VĉƎ1`\ku,JGGJJxw۞GTU5tvyJɜp7}53fڕJaR]ݫx?~󍶶hTa} "?Oyduf|mn~ ۶mkh22̹{ٳ?S|, ;&kӟTW; VΥV>Ŧ?xL.{͛5[7k^/i56Z}%Wѹ}V^fݺxzxM"7rLey(hڵˮu`r-[D~[oMNR(\7÷~O??wu-^C_yh&ѤXFM[iϯGxjgB;.V*|S'+*|>;gZFVynwZ) wt%7<5ka+ޫɜεk_ۓ2\r-Ęn}{7?w'n]pŊ޴s-#?|':xxyY}CGO`@N0.f`*7 '>V*5-S(pLDnj1 %pK^]2YRҍ'Z(xHJ1©0 6-w 'y=Mee6=7ܲ_OThfͽ]nZ9>T_>W'jTj5T.Or~ǓO=ڛ\N~&MDGBQ`j}G|8L]-^$Gl+&S`2=ys}CkK m9qlƌo;,>]8w==ŸWZmFF|쮮YqýfeN~!`&Qt*.*h*z,Opwoy$-muaI\lrR|V;g},9$fg$'8-Vڿo߾&:3saQJR)j5 NC>|W_x;00gNj!fl;n $}rW&~{<[[3r 3bcZl)*Z4;``W;a 1]?#TlPW2˹j՗z}şΝx_#~{v'4bxݾwdzv~u˖mU]wI^z~IM&3=}nGFdM*ժ2G"%76oڶmΗ^9Iv8M^\{EGXmB%Gp`hhlxPF.#s8Ym65BWIt$F- | > g1]>؅@FM 04ZYY^V[10FҴ͘þ|H-hˏ9}l͝9dR(`P֨ P1ʸPxp5S22SS= kg]DKP]B#IgNJA|*5HD.aa)& rm=3YMЏ*ګB3I>^df}5]O(RX-.WffnnZͪ`M08:N7mZJLtw56TU>|3kV¼v2PhpСP=s}e]me|ŋbϾNvu>}`@!.֙u+٤P ju%%eecS F ccsJrzƴiJ?R[[[WZvs&.ޯ%.cc--GrRJjff^^V"꬯8t{O]BTMSӤRgcNP(͙jQJ8 uw&Sbbz;IU*a8d… 231_w--eeB[.t76TW,X0?=kƦ#G,/1=;;-]307<$W$^xc^x3DD'B'( ToHM5klcz=.l߿5=nKI"vxlYxDFsvj6+ccwT7Sus)[-9&:F bb8AW3c #ޖʚA!+kQѬY)">֮7{xmumMW5cF|޽\KiE^fΜe9wf6 w akl̝}/Tv9u9Bu:x#² C6J1Ɣ䙅mբPx<oinkNK5f~{{UeUUoV^p4y;5Ar%T IDATDך>m>%񢿽W&3$].!(4  lV(B_i4[ zddtxhdlq_0d90~%}ݽ}Ւt/Z~V(RR]N60~tolK&:FxA` DG #~WoHr>&Fd|m[%,3N3g_w=r 2kbqU2KJjZ-L T|龾S^vN8{DžB2VR)jVipsanOt8~dJRGLS*FFZ:{FF^\6'϶66&"R!?{ 21J8 ad^V bJ\>.33-**H1\P*˅}-y<_$ LJe6OH+HmɸkMNlԡѨ#GvﮪZvvpK|%~2r餞p.QaajǚѕS f,nkki|K mX1I_SSc RZGF*kbc%’QOgg[D芵[-&A/,+Kh4za֖t 1 I=@Gv>o{SJJJr,V.on5ddLsG(贉䤖֒c 22_kj3^a5Qr'Z-W{h22݉MG ff& {4WU56BqiiVTیW*Q ^}@Wei˖ÇJG|^ލ7~\<%IpAy%%';)8sFtVrΜpRYSS^VS|̑#r*svߣPL{}otf=o7oR(2.7ouX";0XY~Ceg /b~L8`t _HK}HNVG}^j[C'o?y2YtijqG'Cn ntXW0&dȸ~S֭=6mr&,Yrm-Zc(/߽w^yg*{{?=dQN.ٙrr&JUX(yx97eW]2i=?/wTTMI%'ĶGFX}X#UuJi̘pAjįw&8o^pUiiL,,x޻?7_zzOǟXnBR,^um0'[W;7qxyW^z?yf 1T gl-Z _ ^s7hhVzw}t?}ᄐaǎK~Ûnr9>7:p/]:@' `'9wkH$f9O=Ot%8_٪!Pg᜜V\ќ6DXrŊPsK0(tpWYYRRZ:4rݰbѢԔgz`Yk}x cc `\k~K-Xw`_ߩ[ʛoljxJ^쮻U2撒;ݶg#UU-}}^Ri2'$df,\pw߻f͌ɮbaC"7w?#̟78tWqZ.?M^w/QV8_}B ;ƫֱTPdr&oy>3w57o|Hfz*:Z-=J3& _űږVI8!ᦵi)ZRCv%Hyqd$Jt>]o-WojMB(E=MM͍"r.|򮥣s=37^fͺuq*pss[Db5P;vsssR 7Ys=7~f {kk4::eh̙P(5}k]gt`Owe[ޚ$nqRi˖gyg[}srw.\}oo?z_x` bd.׊[?zjy姟󟻺/z衯e2+1ϰ$>:s_50poեRvѢo?gwaiժJaG?;_[37'?ッ>zlM[o{ɇ̍ } ;fsт#E 3gcGF{׿:pƵk.U8<8XroܔvϽo߿dfged}?7im~q=T&#ޕk0_?8h6'8݉ĸ '8fE"bs&-9Ϧpx`PMoPxǝO>XFB{'o8dW:PARq]ow̙ӧlja_]s7=;h!Vڙ莋ʎ {O\oj}>sGnwZ) <3qr5\*n_핕@vg?[PR8p mңG*ʛYYhLt'ƦJRI!E_&YFRkTFL9?L(@cmPzP: :fu]n6_0 ]*3s֬G޽7ߒw W6A*UMtPԩ֖ Oooo#Z-v06۴7w= 46^/kl ~^mQ*vBCC#ƒ\܁@cַ~?[R٢E5~v*jZ,PPɯ~_[jV+ry;|'~[^U(+.Lzzz'>g8<<4<22*i&c̕db$S%򭕕UW;}=ښI8jۭR}tQF4:\eF=BMB 1ԼҮ}_^*}6j {{Oo_w۽tu\<6")bXihlljolV9rtgFNLMXC`P6uZ=uz?ywmjZ,=+1QG*]1ɓwܷLooX"}5yÆwnhZV|K;sɚB&?K%W"FDM|\^^QfD: )W{1 ~"}9.n§StRϥ/k;ۄZH(zjٳW+7%n*B]rN=c,~1Jt`,|_bK F@1"@k Qb$!t|(By#TP7>=QS(TSPV(zf>" 7$8O>=QS!=MJND"RTJt ObT.s` ĘQƺڦƶށQORc1&HHJNIIpcJ52X[S_?<2::6H Zft%LFs>`k[}}C}KsgWo dJZu&coRJbV߯Mc(gԩÇOhizzG|+));ۘJ^`_oWgk[mҖ֖s̘2dc 9rPug3~&wZZR!FɂAolltdotM0F:6v`P.Z $GBQ’@`lldXhW_#-f>b\+`/=y-v,\LΏ7䔔Dw]J++N>~:&f¬,ܱ^okKEyuh1".g{zN8v.>=cPL{$>V\(`WwmM]}R8}{sRbNK-(ɊW(j;i?g !h(11XɵWJI)(˻diS,z;ڻ}>tR8ueGg{GgGo_0LpG_+{QK>WwcCkȈՒe""`狉IKVL|Ʀꪦή*+*Vc 1Nw. GZ۪*:}>Bii99xl+]G{ :]Cխm}ÑpA||W}Gtu͝l6{{kn9|x׮r\Ym)ӧ-:\TժT1YᥤСP=sUW[YyC>p>}`@!.֙u+٤RLJ#^inlo ٬)^oWg{[_\;cF]8՞Tp(n:LIL9U*Rx \b^0dmjn鶴;uL5㒒22RcZGyD8,E&z{}}]]}Ւ7}zFy.fYcDžzڪ*kkͦŋOOti4g[dJݥ5ͭdZs+,Lt^TNWCkjnkhجVzxEwڬHkS[E.W(m 0B@0 +UmV,3.n˗,;//?-5.Vx;*+ٿT"eF.D*~o\(tS1zرƎX0x wu lV(Bd2l1qdtxhd³Ȍc̹BRɘLpu^_gW{[k&C #Q83:nSє"j5q E87?8 %.^bap8Tl11Z(ʃ IDATN ^g?SRzz>XUUrN˵ZAX6&AdȘ={QLL.mVgBrrZzzzrͪ1+8`__yw)/ĉej[?pB*1b uMMµZ-s ׯV%822-fᱱ=L=SlR\nY- E[[GgScgWfWU@OOKs{ǣVǛM :T*5p 55c7:C]]mumiyF LYSMzzz;:[jˏ OKQJ\*ʌ̬E2҅`.lae6UWw fgu##}Zm33daQ[Ge]=HΙ8?&h2&aܡ3g;tY11Je 022*,;2Q'g,(Hru=vWmvYojjadOJrϙb9w=yyçN=woOw|3!>j3cZ: Cq9Vi⟞'Z%Mh(28$[DQt7$7TW#PFFzeDQr'Z-UY+ƕ}JJ4s>@r2A5kQZ_Z]2Jיv[ZڬYIq:D[JgJ6-+KhkmonimnVBUu:L΄ RR&2^rΜdr$4656 kԴB4.`9ߕbBj4@KsccEEC#G*U*5X{Vn׹]loֶrOV#>-=>^{3bTqNgxG1&5`)؏=Lgj_n§A3$hhlxP2@ bQQD!FeE&Q#B#&_j`P(FL#tsE7#x,1 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 ((B 1 P8ً={ob XJVKoUjmo[kkmv۪V^묢8A6#$'9BUj~Lj1=O> DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DFl@-f?p<2 i$NI=Ad 2 @ ĕz8Uڽ'쏶X-{_AR yv%2N0Nɉ(ԶG[fkeԲgZ4#mn''|tdNjoYVw{)71NkIpEe먬X*ڌ>qrb2 'Äg݆{>xokU75A?ݭջwg9脯^a;C͙ݪj4o~W^yYV#!!FBB=NL?G~իu^S{no|zB>'#1pdQQQUU^o.曟l_JJS_7׿~WO&_uʀ~ղez:z>dG{;w=F~k_}1bdzz{/”khKϋד*~/jՏnꪑ#2ҢPY+9TXRZYy>0ů}{{?\2 =ǔ׬^:v0MM;uڜ_\`UWwS._C/notY~8-[n?᭩ uSc۾m}oUZ~ [q7\wwٴeӦ%K&^8Ν#HO?/I}= %ޢ֭4ʪ CѠ~VVzio?|8KH(/SpUUBȑi}*W]dzgOq-3mN9eV*,|mee˖VVUWWT޷{׮=5j=񕐐\#=ev˜ԩSXXxΡn5lk7]]Tx%X@ _嫆 K/MO˪Uu 0`1c6nW-]z͙(GgҼQuRQeÇ++סW5pEEEt~)_B8{xd} 8K(QF=':'Z47ee;v.Zk/N6m+7oٽ:V^mZmۥg9rȐ6YY>b[z߿ovo'&螜߫tW^:ou]tQǻW>VӞ mXuJJIImsG`G>\Ѿ}FС?}]1qVW_hu˩QZcǢm1~|V9'W8]dS-\xZ$:('{7}{^=z 7pc c[n=+t:Q4NXvءCb={i6m}b={ߜ⋇ {4^za[ed;#ή3޳ɰk%%?/ٷKmG2[״#x%+5/}.P 4s4i{p?gn,6pI ir >|ѣK7yGp}KΧ?ݮ_{׺zkego}닗ҤNFcsYꗿ}/X٧}e-[LrHW?o֭;lXMe/Xƴ_5sµkm߳ [qsϝxر}4mr؁##ߖ3[ܰ^2?߾-Zttλqzn8ƪVԧ|qJނknݳ4%aÜ.]N?‰]6jTG9\s׼y>_}ɒ w(.NKic?0 8xg矟7oK) ov~ueffd[}GQQjjZ% ))oaJJ(DIJLH^yj>}>7y5QZ֮߳UNf OZQnݢE˖6irCv5_Ѣ .Y|)3u[_>^f}2CĊN)*]_ys9wIf^Ϳh ={y?e߽Ϟ}//(ܸtiq'z+ޜjՁ^6ႳϪ~6mܳ4'$ď >9|tU# F>VMIIIхz*+32SStt?mێm% 9-|WOrRnnmZ{;w?+Ty-/to~ѣʕW <;tQx`>В]w޽OڵkvY^r+ǎY֬s?}ƌlz ٽUC?pCRsۤ |c+_?eox'۶=o;v6lЧ%"ʑ{[G};OHӟ{Qc4>vr}{&&fg嫿 /lW>}ڶKM?+L2g91M۾8ڷ<x} ׮;|GTWFye͚'O-=}/UZTZڭK&N-"QJrEݚlUeeff b%ŕ?Ңy,WWy42hҤoǐAo7}ٸIQ-枹sټeܸ6;&GGB˖#GNҗ:hz|ݻw옞o7?ܹo=Vkŋ=3ϬYݤy1[sY^}.b,x)Snm3|>7FҺtԡcf߿L9s=Gn'UtA(};2\n++عϜuWaciVTl0xp~~ˋ?Ȁ-׬iffhS0vLKmѢA ׬=]sGjjfMG',ZdɞG.xZdr#+aC<„-[֭ٔto[EBBAC ).="eG.zpٲk334K#?8ۿ^RVԗ_4+/,VIC=k׮RR9眱{ _УcП&5559f:TX]ÔZ3Zn4! cwxx#KOiժU ŅEEGaEźKZU^ޡСggs|׮hӥ[e(/OLlݦ}:ջvm߱sDZ#>8y zrj<3OF$*+s6yE)*^n۷(EWŢWj?Vs(QŢ4#/x!]6~HIIHMNH.))..+{۸8̺̌oߋܮWNpbz_߾Q=7׾Z\rPIq|eeyy7xam&^xY_QPpm6̛*=wҊ X1cn9^xj UUU\cǓOye5ŋ.ݷoQ#5{/$$ԯߠAѩJ** Ñ5 >&&hy)m;W^Yn]EEnݺ._pu)#wveիWٵ'?ɏG7yMeK-H&׼<˗M:e1볲:ը[׾q][otĚ5N6i::pƍklɯ߯s޵{3gX05k6o]8RZRVVUظ{#IIo{˽NqkIz23N<.디:x`tɺO߿'|7|x &_:4MYY5jukݦYŋ7nؿȾ}7NωgtO=?Ǘ/=T{OII76nڱc}KUGׯU۟F n]icSvG]Ul-۷bYY]ix~Z8˯¿m'[\{Euz'?l(#U5ǟzfժ;z]ǍׯޢEtd+/__\uN=w?r%=z|stDeMyy4m:ju鍊Sj9m.w)#9Y# xUr&S;wywsZ]{ݗwnSS/ɹ[wذa/\JjbbzFt`}֫ ,ټ驩UU3#ܸ1/o5ݻo67HHhԨg^sIزwNbՇܱcG;匮xmɝ;u. ;~۞hBװA~tR~xٲE5.ZaCv)2UNI=vְV=c쪪F5SXXT#/g{.7ッq /’蒲{YfURrϞ=WV,]ti˖}z闖¢iӦM{lРqP'3Mnn؆sΟkBwص[6I̳gmXV舖-7̼?x)ݵsg~ JKˣg#}֙\{YgqǗ>u߽}㏺Ys-KJ.|≇gڴw+vϝc9:9g]~Ԕ6cF_q>׿R[o=kYT*ihk[Pd5rk}{k<+}>G~ⱹ{ m8fTNW]]~JJͳwy|rwܙ\kN?xP߾O8^7:~XHOc-cM„w ֩SZqӜ9f^UVڸQ94LM~tƍm}W^1c}Z4?̋/5Čmզև;N22zիСC7lx>ڠ~͞O<5ڵm6:A29CM;up )*,*LLlޢy5 fe 4h cIvܵ[F{v/Y<ƌf-[5C K ݺuݺo_0m/źֽeufΜ7o-[VIJ8p`K_{gN]`_UeN_H;wVN6|x.{,B속g8bd͚Fԫ4;-uֹs|s% oKLߠ^}-^<{ܹ۶gtܦM`s͚X1}k͚jUaaZZzY)uJ Wˋ nӺqx oqQ_z޶}_xnkKJ?uޠAZUՊ0VHLlذCΝݶu޼7xo.YukaaitciqqAM˖ϙ3u?҆ u'O?}w6W9xh͚fox)gݫWӦG7޲enmsW,_:wM߯_VS|NgmK~{'pz*/y+6n|^HOrWIۯoZeVUհQF͟vFfV =OoٰiMuMgZ'! YZ;th99޲eŋΝ5k+6lؾfͺtѣkm[lҤu]ڵKK߻gE͛3g%K6lػ7k3Ѻ]+W>ܵQ}f(( ޹3JIɆ QFٸ^SN2JӿXުU>n]]g+ϛ13ϜdƍbU iӥK2ڪj=')n ֽqXtƍo7F5kv,)q /¿}ҳn.+ﭺk|s֬׌QF9׌Ɲ;uVޖͳf+ߊUu:.]6L'sqr⌒;ӣ8̚mÇEŧrN,V,(9g6mrD(^0}[d9H|Zx-cxUUOwݹz߾=uf>mCES]䡇~d§o+_9uhξ13N;5>8#HJ::'cڱq=q"V4MOgc3#z ħ)n~kwGIuΣQ#&i{(as^]]K/3+?]}=v㕎=ةl<qr2L9y2JȨr;uF]|&}F4wja]7ކMII]:]ziY#?بpQZq2Q8 Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later GF iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx@TGmeYvHtTbijL7%ɥ'nM&hb!]zウn8ѐߛ73;f= 7D }慭(96_dg%(> ֡jPNa( @DmrJF3Y׶sSmsa4%j@g ,l=iD4_ڶN/* ) ڸ12ɑ@+_9rN sindɁF#^ʬhiZ*-tfLtX$C үfgWV(+:*f(  ׉4LtxaH0@sY&tTTVUu2 b;:x;9Y;Ƽ' :3;̙grz*T*݄J: F0JБhn8Jk< Z"' 7yA/~ ?=-;Opqc0<&;:H;_w=<5m%ťH1<< hLbNTb=5zѠLѐ)L6mnnzzM:(rXRXY_W'h*$̒c ͵Mu6ʞʪ윜֖ށ~ ht38}%K_]Su.n75UzY#XYOf͊lrI-.WW4ӦϘcmE UcTU( S)nƳ5u޾#GӍ#}tBgs_x-8\SK˗؞ޞLF6ܔpv}p E~V[;c]stWz#׬Wss2R`xyϋZt4k+dm RRO:L4T’CJfw\cKVqNHOkm%ǚkͥ:)n|ٲK--Q~sf6 N,KrD¥Hd J X鎎\KNOwފXVcb[sl@40cH#}SPio-)0B%Z\&nm)/KI>)-^tt.D<~#@6+N zt ֚+Wq8 ՌeemnN̜m6"Sf+ 4wnjbxV_C 33~;~Y*Ak1b2Lqtm zEDnVԈ5sᢧZøjGR)TRIuzufnj#DDۡ3T+I?xPNfWgqqAACZ}7@.5rio'IOBLKXbT*Ix^^֚[P(?.pl+kK+in*ϞٳgoW^>ώ;:8;lLJnkmkELMqAaaVV{r1 kTgjC+D;TkB*Aǐ).nӦl1 ylBqHRI$VA $ jrCXZ*1ׂhP =Qj$ѿ /.dZ\o%fµZ E j6k4m ;`x{-r[ZR_\SeY\Ü:{"zOJ6!!˚ss$456@2Z˗Ij6<ȤBn<`P(J!yȾFV뽺sq'1lk4Eh]_Q+*F\r6I>W7[U|XXw0xPJe2RIamڒ {@~^^0l_dF30 hlHT]9__U\lB'SP,.n =쪕Sf_P"@֑Df_u d5*Xwiz6g7"}'yW*E2+%SzD1ۉKH[9 HwѶIN34@`ӉM킞& R 3ell)T _ >8k+'gG'}R5ԥ_3v@(ɆsaؐhF/l0+ΆG4NU윆Zdr(,PV7?(O4=F:L.(((o &80Jѩރm4Szz[[::%={ݟIz*Ν)Dkr}/'Ny -!g̘=սB|ue_E daJקR"]>ɁDbH ښ䤓'EI.3&/)noAgrajʤRZX4TfY>&͍F55;8;YZeftwutufgСZs 6qڴ6y:@_u啄_VjBR!Gg̘6o֟ 7=S Jr:}Z#ҷƓFc;c~n{iKh !&%PZ EUrT"dRFg6.ccD#X!L dkRPȤ}>DPY,[%ÄD"9{{K\եԄBXɵqrbl61..>S8:XlϒE2VKX66\#0h ݖabirNK"09_h0\.-TD:OdI<(:{hdZ YK2ΓNf=iBa}}qQC}XNN>>../h G™}2'ߋV;C==5%Mbm;l[m-@ϣ%(B HbbBSd2Ze(c K4Z+I$R)Zu_N&&h5q ZM=LIlRz7ĄBAXqmhm"v`\T۸ Fkg] :BAWAGk4hZ-J<:=m|JE"Ri42^F.n|ݿ4R@Brc~uMM⾾~tpww;y#{[OJ*J 0NE8D@i@Di@DiDiP6zQۅX(ۡa70Jnd|rtc(-lQ*Qt_/Jva& @4MECwO PX0u 4KP\,~w^ (75_z> p_}ֶDdml\&͘kuvQJ[\|ӉE Z-ɵrr2enĢѾV2yx>|._^^קRr.A/[4E*UU͑#ob-OڵK}V7n5mhLB|zZYYKkOHPt:mYaժKkJugWnO44vvJ߼yKr,IlޱZãn?<{9|߯nz0G"Ly߼)0DxO>05ɧxc*7aZRɤ󖭲6''dWW)4KpKGG{y]AAEd(y(}%1z %7u(50e=kmɹpRNP),ߟVTR9;Ϝ\ڑƝ=y6&v媠@.VfiS՗OwtpӦGDFD ts噱(TǛYDQ~닝qq=],X;;חjkkNNJمLBeT_y"Yӧ;;Я bk}7ўS[4z',_17<4t>ˌFC%$gd77XAsxyYF\)WӋZZ)$7f1ёBnoKr%@ 48x45tOTs+ tn!(iqQٸZ m۷lZ_2?(Ϗ;sbKE/ظik==}xyY[bYi?<ŇFf89s6m~ŋL>MLt);{^ǜ掎A:rFĒ‚z2yzx uwT*5kVvs|D₂s.;:.YUOc ⢗,{x̨hOp|,6--dDZ1gMyڠ5х[?x.wΜG}|vk1ɅJ{rr##y|{i$4'm|&y<5p;w$VוVU)N!!V*1^vq )csښaH"7D{i!!|{-Y6v<@[[qhދSG 9c8*Ŗgg˱*;q*%OPܢ0 omJeuswvQU*0T*ё麺]whk^jP-ژpRX,r̘S(zP/ N@@@׹H$3tƒekׅ5ڶFyOrs33Ql~//cYSA 0nTJFH7a|7cN p ܺ75ڲ22x)LV{{늋srrh4{{3K4XTYS#'vvVU&;vHzDr  ʬnl,/oo ^H4j5 ._/ojpcѢɓ͘ýc #x|[[b+Wj{fZ*"ىNgTVלpK5b^ \!uu%'\n!|>Nqm8 eyYjZRbfFuXLM$MZ]_P]#Xq,,_.kjP+ LM<~t5u_kiV)9V|Z30(WL HHnNZ uue2_&64df5ԛ2LJĸ{"Pd|1\@ߘQ:Q2Dc9")ɉ ++32$$ Nh-J1t " 8i(B'%( d\; 0P2`BG/c.y/^59wdE?d-~-[OcK!;(E4p/0DR y@KJJrje˼ wЎVV?TuYUU:^ h` Vݓ]H {zA39i 9i`B"`|qQ~>89 Ô'Gz % -O0%30D9 -o`  <oX0ƍLi`\c|&L" 4 " 4L}MECwO 1ثmm99/^SQQWO"Yq̉4[itbqeɓ_'SSrs::(''?cc}yd4++ϱs4)9)]RTm W/ --.\rill$S'ɓ2N7Z EE޽6_com|^|7_~yJ77?ܼG> #spϰs'JR@im>s)b򀀩SmmHBOyą->S99RMLܹkWJS))ӦѶ6wQkǎݥ<ƍ~o6?o^0<Suq g27m|BUU|\jAٿ9 N'44_?w!>=G$R(:ͶzyEǬ߰jU`5/O=wɔNBtv7oX__%4,ͦF?PQqS/յ$"mc2iZãn?<{(խ[H$)?7R7ILLO?;DF֭QQ<["qߎ׻ 7<hinlhkllbb[΄>knnmJu:;ޝKJ&+-+ȯi]]}16;?$=<;E!i4Kþ=ߜ9#Ov^҂LJ{faaʸ&*uk儯w}ee/vŏ>j%jHD$c:o/:ljOKOR$<-- LR8ͽ";ΪԑO?rT_ O# 'uجkccK ?\ܑ_|<|d$ʝBQWܑ_fh47X;iu 4Z<̌m2)dz,,V/f^VlktTx/)>H1,4txL61 ZR!Sq:D&n7ˌǓd2 ]e\ϙL"o'hJS(8L.e~o/Jrt+Iqq8%W̚7gS(IRU֪T6ggUR;:r8]yKgkl61Y}]iiURpQpEV_ZB918H"̳͝ ҆9$2Q/LZLP*v J#^?rCPi`r\n[k0htAٿ9ܻ7|/ c?@cn0x%=-}ɉǏHnnaaQQQaafL / Qewپc2g[n,6Y-J%2&4ڃ$f\l֌O>tE" zB;O9kޞ>! poFBaZC f̻j6ѴaV)PI$"߻}`BAzlw9W@?/Ԕd%$ğ;uzϞVf[#"͘T=xL,۶EGJ|nd5F!ަ'H(Hш"1ZpUu:*-5JEsqqūZ Q)v<G++vbmm]Heý)\P_ށq /)Sq={rzzzRHrjp:ɛ21y0wne0Db<=Cg,Yv]x8^mkknh8<Սo' MCi[5&Nۡ@}C}NvNvgם/aآ_bEq~%?z/,ZdoDAϵpI.VWK$/ SZғ+4_?+݆ I11 xzhu?۳'3zrye??)Y2ehGTF$o,{`@EЇJeu ^TS+KP"QWW]m~^rRjjAPΈ4׆cP%%ffTW)݄HB фmU5‚LF(55geeW(ζ<3`hdXl񦦖Vr[[vvZZFFqO033e*uoo}]qqvNNN{bo|`=%W3ZUJ߁m d2iB'o勣99?nob"7wMkl)ꪋϝ+*Ἴ&M2>LLxVV EiijjJrffUPI@}CV֙ǎ_bΎ|ѕ+}YF60c.<=yXrO?55- ^lŊPp:1@'A,;Q x欁W @iL4j hWBCJ*JXPH4 " <8ht4MP@qsz @W 4n*ۡҊ_P %0ƍ AB 8=Np]`m؈aRi| PR_++ ko l;?@?+]~L0&& D{tI{FWƖ?/J 0'=Nz|,gW+ (Xtu%Z&\Ai4H" HF:|~O>I3Q^m}/#յ%ZmGljO?2#(蕗ST{ɯX\Y}G#<ЬY+Wnkedvu>nDzBvu&%'% EB$ IѧKV@o7O׹ч }}j]ܻwӦkw_Ћ//\&^ᇛ7=ddjn|PppjMkKv3O)+LjkC"яS?˗k֬Q9RZGz{/]? 7!(յjrz]Zmxwmc0`yuy~p+)wnq~Oic%WW_ [߻GQh6j iee-=="BA l +:fU,- Rٕ{))%% R)bi7oޒKi4YMӧ._.ȯkmIDeҌ-^ãvW~xLKQ[>ÑH>S~7o o̓Fљ՗~wVx[xDP5woxx?kaα麁ԴO?{+../t%66igNݦLVZV_YӺ>٭f㰝anH‡NMaߞoΜ'GE\hiA&K=킎N 0e\gr׻2J;G}}剉qq|S$"^ޱn~.xl65ܧv'Nvvaaz)_f}B&S^xΝqgUȈ^j/:l굱%}v.ȯII>S>2N?wȯW34V4_ӉD;wx;g=vlr;;{H#.ܢav%!JzZ}#,,܂¢\]͘^*ԣT 'O'O9#T/wtDgQ*1̔0Ĭ&`m5kefdd|+qPz݁kAcˋKƛ? ΝƛBtJ=C%!j5Z`K[Jp-,n;<چ!5v4z @$ geegŃֶsNڪl۾ukD}[zy۶h}ؑOaĄDMrӯ&''%]ZRۣղẌD0Ѽ"Qd;?& D(*VW;IK,k`f~vwOFB|nl%lqzV;/J @?D&i@Di`qu@W7JB@`iJho7`ⴷ"-( 5@3=bE([%ho7`ⴷ"҆!fWcbю46cPɅ-JVa zB`XDp/Z_t(λ=[olh8<25JOmݻo$o}xLVPW[oWvv7676-_|O?3:O`|'-45'7=:?60p"QXQTޮngG?4~UYڿ؟egC3$=f RVv1Vf JBg~#00*V. }8H$x3Cg55UbiaaaVoٴ剐i֯[G0LvvQ1QQ >3PI<*,?,,lݺ~y_jmގ޾{yX~|XRzd 3yL* ' | ݿ c~,O/xxK(J?xȑ"nn慄LvPHk׼7 }vwZE s{zn[Wm\N~?dfi?ʎ BBHkG͜9/r^d7'OoϞ۱cG =Cjj-|Gba߀cko߶}ۼyʫ8LT/j^ukX7tHuX]M]N;(jS>P|۵Դz"o ^uv<V^r\|0ΜPa&&l󊊾 RQ(iEE^s=(07W/эf̩Spsqw'GtGgL wtR56 ذ0?Ogg.Z!O`fk+ZI$VB$!&(  `qw`@*E[Z|ͥ!W\8b}df֭[q-dstc\%&oy2$tþvnJe[+{]JF3cƓO>TL ߞL;-g{bBC$9ܼ ߎa~NTt80hՂNA9j_-M3>2yii3++MMn۾aCh( &2Ok˻ۛ_ܳ]hdbw stXu#C]I@$-tyEF]Q-\8?8vo~r>xJWvP(vva_VۢLZtҒ'OVklmlx6nt*U9مb]tLhH!&%'&^M/ȯikW(H$32)$x+cbL}'FǬ\͵KL̨hiUht.eEV0'ޤK˭imH$m֬eׯt4P::OXbbQQ}@ P(VV..11+V,ZoHh40b/s6>>/zZCZ*re׮G {CKUsgδ"`^|gնi&=x%r`ܞn{6Fca1R&hf.Xfoڄz!?_:o[жR8qȉ uLf@ǦM7.[΍?gϷ{.^lm\9JIٽwޝ";:-_7 Lstd0(h?-.|KM+8dMzϟPde}:T\,5ԓǢ}|OswwtP(**6myWkΞ˼8,3&MA4JPKJ~ YmkțLYIoL=N@B$! {BX$ XhunVǶ3Z\VN۱V<]Vŕ- aG!lAv(؞y}{qwGܴ8(;x髽)ii,G7X&39W^{m-22*?8w.;xɒŋѴ䯽<Ϛd]()˛GFб%EknltsǬ[&"rzFj`pkP.ecVŌ"Cvl_ ЧF"B$D]~ā&x|wwFx{Snu͊x'>w@ SdG\\^Zm0'$˯7Q`^YW'd~XXb*+7'Y3`xl&i4ժif38 gج;0V! O &{J'QQ dȿmۿ>JW@0Ta|}33qmXXp0߿u_K%vՒ%ek'84s_TӄbddlZNVZu5s $(L6}W_gggDDxm'H6e`0WW  ˵k ZmNN_۰; {S GR/*3xgsΖWafapUPm߲59GZAJ(~">!4ԇy}n$+k!Xk0X}&ArW Dvg=7 #c+9ۯx xzfП9{6.ɺ!~\7;>#w֮{O?Կw㦗_;9a'}DF L&<U[W[h񶽽m[Eš͟/[,ʣVY:ywodrhhT@@ ֖?/%$x&62Ugt0Ą̴O-\M34L}Աln~)Gu'V k'hu# |ҥetshNvMwO쟳rp q86ٮR(bgR X,RbǓ*+ ?w1JE3fLCGDF`Ѵzt' rP;^QQ.k BDa~˵OZtt|Ph.Ge 9k֬8.\= | :/8+Kz7.mܸp]/2;q_Wo{ҝ6o.W\{1zJ R.͜ 2#*==3sΜȐ`?_ÃHD߻A|??e*Ҟ'E$X(.(ãcۙe`:s,d/-!2-%$d+T*b8\Xؗ{~:_\-޵Htuuw4rr( řY nH$ z0guuō ֺ#:44vΜd>YaaKZNZ\,4 zP0K$)$4``ϝ+(hjg/X:%%(Lz0fog:~ 1AzΜp&jSEaNg4>4.ECDظ3XXgP@ޡ*)tłJJуVVV9r?+^X.#7:88ؘ+3q-vԨ"߈ҥҮn/hcLHHdDo4=}?GRiT"C3Y`[.Rf+>Uw/Be-sq kX6R(BP{BPP TWگ] k4:Ojn+-jU. 5 KJA5 g2]vJUՅ 'NTW-f'66%M,FgL*rMJ b e$?_A]k\IK$r/ʺ{Q1`sǫuwT|~j lFnA5f3bhoL&2#u*yho׫Z@Cd~Z}fc;jww?xQfN&+Du: %88)iE(C  qҳf-^ _wue0!"w+Ʌ yyah,u&P[/jpʙ٤T9} vڵ.q8ZoUI%7ĵ)㇎ooS*Z^ol|c#6`\`(d.W,NLp$Y3{B*HJKkkkPD^^<@Fmh(//))FdeBgx,Z\ %LF-$% :ipppJI#*CCe$"\::kjKK qٕJjBIZ]f m𡴴sg/\(*wߏxz!YI"NNNwҘOw6hXRZ8eT<T׫_V Ohmh'J_ ܶQO`8Ή}/ons_=^^_Qw:]֓۶~A!hsfvu(Пv@ӃŢI'v\G` $Q Q8XL_o_ɴ[G/(|\ssxOoITz./R 3jczTXtRaw profile type iptcx=JA0 >9K)\|?|' HVkzΎPM^iQLb[iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ֿc iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\w?|$!B3썢PqV;GT`TfUH6Ma/P:Tp_@?A^A7ج`TY[hp7,3`e ڴ lZ34wٶ6tF9|F#m,6^aj{sFZKs~~NNMmP̙NMCSz҆KÞWSZ[DWӞ|rB_!׫ RV ѿ{'#rkomD 3D_ /h#1Q)zJ[t 6"cҊ.Jt$S|'8 PGT)*Z-H!F"˛.QQ\ -R1SDDJnecCc@,.T.0'@E+AխRp2[0ZZ%u++1744uTT4.L٭7 f >㮌GYb֝UΆcgϳ%heQ}o#N]t=H,nklEVu+=-6R(G?`iWuu]]KT*uk5xط/?_/x˖"HZoΛ[W>7=|1K-ʺ-jY,0$$,,0K `Y 2yuMFƵkyyHHpJU(E\C𢮯/))+vR(|OАЁO"vɪrLjje{n1wtP(PɵӋ[Z H9;N r|wEstr _pNN-F8!"ÃɼqV<~ꆆ.31<͕]ޖggkc0ssSUWVW9;m0+k7а0kqm8DJu%)/^ Wx[ Y7HU+ʫ 6wҤ'G*w] M"$'VUJP qwu dh$YҬVVdxLw(ͺBM \KMMoq\i?x2y4ekD1Fsrrrr0RP(ݚ|lB""uҔnFL$(oFtlS01mmF I nfJWh Iغ%vI*՞ϲeԛzԺ? L ՘H4XD v0db J5m 2ͦPd S[[{Liuv*f85R=(>`P(2@x~0UC}c\~k |4++3],!|, #LDқ76xJ_WVF"Y[X Z}}CN@$)duK2˳e2lDAZ[rEccD5}5,Ic$P Qv7565 g˲Q8e\nXxWC\g86v|VR?{S…Oc@1$􉎎ᦧ_g? Mqq!9Y/9]Ue ߯gg;q"9)TFi| #l]]fhaVL'gww;ۺʪ\#turi4NJۺ=I`mE99{y;;I3MzooW7[;:nmVT {`΃nAߑsr7dddf ^^GFCcj4fJuttvֻ 1Ú~UUՉ,gT/x<βf̔uSSaazFvBb:k:`J**kV^^| WRu4&FڅbC5Lxݸqgչ9{\0aakl޼hQt+^|g_IL<{wNb ^KNR93or̚vS[[{~QZ4}uxa4 4tB4TUUZRU%geUVd2nm:;[ڰD0axL".,tD"Zk9n\X =Vf'8l0zĉ,vUUEymX\TXZ{D*ɰ=7QR켼"#[b{{2ٲeՖ-V[APYqB굒M3| \5o^p0׆H=nq]FKΧ$ggUTH[Z:;jvp[@1!#swޝUYҪVhvnAAӦ-]t.4 WƴGp!/A.'\PQ FزeҚeY^6iflz*CٯV+KL,v7>͟VG?Tήk~ЁJ+2r ˖FE25'O}_>]'I}qqy3iի7}_:e2}Հ-O:v41Q,-~k˛qp譁࠰@o@RU/ ^c0f3.?fŚ6뻝;S,,(+h}h4F݇FC 8;{x8cssCCS48oh4'''g.+ R9 Elg]2B1M[7c)NN:]UuyYM@-cڪ‚ [8iRL X"FQHdxA[3Kx`Sd6ew]Ү.V(ۛ[^|qo/a,ԩD02'@&usinO2IWZR+jn2e2S2Vud"vhgw6\nGE[ u *K.GAʊ>axa!,?["3K Fbxɶ5ηhQq3~g`ŋ?r,_63|HɗG IDATFR()FjϷbw A#jZ :]2T\\1n&w2`fY>i4//?w7L[p0e iT"3С={x]]L$?ҥӧ( .^;v`ؼyӦĎK?wsυ8N<ފie`򲼼ꠠe0FV '_g|' qq!|,ʉ)(v%1x:S+*:uFI}{F{x2nDK䓏Ϟ11ύbY< dža_|uC}cLQx<}%C1k gLd0CSsVVfXB&x;5?/z ?ɒɓ|\<5Jv~TwwoWVUqʥ5;%FV{JޮP7 0ccQ.ٳ㏿D;>LJgՊD)Ǐu§D[Yv(e iT"3С={x]]L$?ҥӧ:˻ OH:/6ok״k/MȺ0y4EEKkQ& zS5.iD"X[9 \hе @غ;qfVssxAa0==֬ټyѢh~|Y`=/.[wŋgۗX,3"bƌcc_)}dZ76-oG:ÞTrr4'W|4E"kƆhlt3kjO}Odmmῳs,ҦN}?|?x7<_Ok,ϞxR5>FxPȌkF8w7*9kV̙~B}}FFF~@5o\v}$g;a0LOօƬޏ+֑i,drݲ57h%;+3C,pBB-wq&[^H7w/[-gmRkҎ=rҥڦ&LؐBT4;^~ͅ ,A#JkI"qKLV +͍UƏEkz>a&*jD{KKzo޽[hMǏ>xR^^uMcRIyyED̙lYBBxVݻu_l˻^K"|<2ի_~曇QϬyu._{e77UB"Q`۶UuϞ CuեKi%%uu-xMNHXܹAA\w:H|ܗ_yb:*5EBlj;;KJϝRŃQ-)駭[?<+>`ڐ #/m۾.;ɜʫ7/\rF<5|s2H2I\7YD 8üntgGÎb`pr9X dV.˾7('g~Pk0'"|8^XP\,~~t&P?75VF}#b%Z荘 "~ޗ:{֜4Zщ}٧d2/3]:!Znl*OJ>rnsox|Ϗ]֎LV[1dzyNN.(mkkoG{ÖV>OϜj"",]~@@ ?w}\N$n}g}|ƏpRSMSU7TfgWV AAk>ή 1c޼=DJ.]5wvhw C;;cf^G.I|k@])650u%Vl]OP:[rl YMlVp'Q]4ŭwo(n͜5ޮoEWWFƉϝ  ny.o߯kjnEݕUZO;a{?cu I%axAht:<:G,3D}zɘ|ӥooīWyxƳMNɮ^LZת%+(ΪRCß{WHXNw`@G;8̘~Æ,I_~N2{b7W̳{z6Hhأm|E? G"3<"$NN.,,(i^zGFΘYRrbaaqq{ǜ9|+ p:_'|z;nwFZӭxH"۝L&[ZLf(]n"Q_TQ{Ԧ0e4m|D P4:zzzTj5=oBhL(d>?:Z)(qQ"y\!55';/}YqvhB.[=s"FRH[ڜpTh5u JJd鱓'X:]uMa~i^/ X$ F{D"8̀i("[I'VEK*4Ę3ۿ 2{@PiHXGE#~0={4FӨߛݷNݍZۈ@ZQfzVVs^T66:cGA`H1ŭ3fΰEL#[%u:ʚɤQmQhK_|%&';k z?m9sN&azx ovK$ mx)v҆a0*]]"ZYuC;skIz>0A9nә95{yzzT >n7yAF Co³a{$BC䤢"Q8TR\R5=ˋA4?U;fbDxSSaaIZ-IXO u$!x`lkD#"%!NF{wYQ7x lhkh@߽p MM͍Zm=[:}MmVVN^G7su%($JG;èumz<$:FuΎ.E ;o>C }bXxL./+MK=ԩGO]N7^}5.] ZmkLK-/,b/)d*"o?1wQFO g zK9"v-9ecF~8[ C"l hf']),(*jkM57@&dwp/Oe*{[q]qQ{\?a|`T=+=]^^Q%=o7[LQilgg;F{17c͏hqaL&wswL۝ʼ̲ ws @#_U1EN;(($iϴ;KA.8L,oLP(n^.N&%e4E^;dm8ye1`HuMJ WTJqω5<)7RB_Wgh[0;;3PR;'" Fcyqa!"AqL?t  pr4**.^8{L9aI/Qaa7:3(fYZcE xyΙ3o;w]Jo>Ҳ~a+Zmp9ܠ] a˖V[QŲ ;,~ 6ñ㉧rcMrMA=nܜ.|Վ@{;A*v515`ۢєJܷ/;  ]]|6Jj۪$2s8g?:h餝"Ahj&:?/5-=]$""V~xw73DG',6--?p]_~͛7{v8O/[;*U쨗TUXLf0n+q#G=xiF0-vr;ۛnV%nDS }~u=] z꩷m|.:vf%44$;rӉ$˖37ŭ oo~SIɦk Zw: go7eʒ%Ӧef~ ~/YpmԚڴ/_o5k_&MB}{ski?Ov#.n[-Oϧzg9qbozyݟT ϭ~zZS*7oCiɕ%cVTde,VXhH+xv{;S2Ν茝˵0:oW_{y OK={槟_7? c%= {/z=p8*Ԥ+G$%ut=*4]S@@Bƍ NrKp0tw>;#T*cg'Ǯ_jIAAvOaT碅.ΧO~夤~8|X@SZr8|gXجYh, 7> 颕2sfxx# ށoX-ߞ&wq p5 ?þyL:/(Sϯigaz^^ 饗'.\JvhnnOf{y9b\oL)Q)1:ԙk?n_|Sóg 0<|挭[y' q IDATy?ݾ)QrI1a"9d$))115gxvɎcfQf0KF>>T* Q[瓼шn KRڵ``0lm|租2ÃɄV-p`~_Yغ_5 iB  E"6#AeҘQȨ(̘fP?#ky6a : *|3: 2.j *ȈQ9e6݌gu03:`L-OTQ7әAp!$2Y 8 ^**QWT2Tv,d^@0Ö2c EnF73ga!8~K$Ҹ(i~vvLPe4J'xda43T|T,)*]&ST<Q6iCCW^/*EbkAT hjjD%֬ UÅ`i KݘxX,aY5kE*Ea 1zԨ`fЁ2oաҢ 3ϣ*Xp!fhՂz!7" 30e # M}{NN n}kք'G4D#G~Nhh1`}Dӹ\{{/?=v`{{ eewdKںul8x_۲OJlٶm"gg6USR **EN/2*n3|,e`N(-=x__DD|ŋ3!DO'akx-[FcGgNNJ++Jؘ(pKlF `/[a8<ŰQ"͹v/LI2y6^jcshDN x^OpNrtHKaYLbvu&';wX+ӇcG{-5?J:;ٺsbEDQef G6l Rё^#b##_x~o}NvnnSS\GS;1HpB?_?_M3{f\Qѱvu+LgA-_m-_O=#;^=I˝57eOw<=i?l _4i- cho/dG;r +ܩ^wF%xVܖ14CKkf)jղCB}|BCBn551dzY i^zCy3/VTjHzhF"Gyy͊9ϗ@Hy:-um|=r_~ٺuoOՃFGekoCsKvVfXᄄ,[L P)o"q^[f.44;zХK5MMJ%㹻N ߏٽo.\dSR]'ON*([Zd2t7?Uڢ5n=_0k5aPx޽E zW-4ڦt)/QP켼""Y,!!<ΎDRݺ/BB6wWy(_oy̚[w\vs{yZ+$m[U9˟;TW]ZRRWޮ|ׄ脄O̝ĵ~Ӊg}Ů.]׿.Z+Daa(

S2̙s^`mV76'%9|puUwܹ7GWGqqsZikG&+- MYYtG''UAaK9>=sFHXt VTt}'r9g ?>5tt q0t_3|y"׵be f0 Zڣiiiu6֑*D,,q+W$YZ[N6ipE{{jOmvs;{iS]\~#,,22:E[w+*Eiu==eyeUEn]4kQf࠰SC7mܺWt:S T$hUJR~_Ǝ?nTS{enuhہZ[Ǜ6?sVXԩ~~qq1{33xcpKVGnnFzY\={CML :0tk-N{;wp[h\ܼlJ>o7LL"s4kG} =>Γ'{߃^X?<6*f޼#*UHHMՑ"fĈɓG(,ܹ3/e W{C*)+.6Rtsh@gݙBS(z#Xd,56ϴuRLfh`t]?WRP-&]D⒐TW(dvZMSL8pV+ JK5oLH8sccSSTvR\m۾~~P&&eowkP(zTF:S3s sU*畖Tnf* I$^nnFzM+.aHg睻$geVTxcP``N՝YZja1|d=|ַN$..1.dH$‡;Fٷ ??hVidTPPPXG[;Ԗ[Y;!e޽7ۛ+t Z[>s@;x b$CmwH||ccll& ]!L`n&}>^t;>/H37t\GZZۈEZmKkScK00Ԉ(kiikh%[;;kk\rbYBM TTgf88Lԟpꫴ֛=nк4iɎBܒILMbCE ;O\Cp xMn謩-.:x`}꧟ySKPuoiMK;xD, ?X/Mg"˅A9yg<>LSd0pYM>*M);NߌuݬB!fEVWTVFkMDDTǩ1ke6,<n܂-<.>377+ ''3a'#G<[d4ֶ7q+6:ֶ6?/##--/7<"$d`O` /Ox #0$:fذM:VŮn11:ҝ;n).>1ܑx{s:O YiRJR2ۭbb"?;aaaan?ߴ1;+;yb⤉ f7cQI{{oǎwy-r欉Ý$6%'i[T⒍"#(0(8VnR67>t?.rkQZkJJ% :JXW_SS^}CGȥ-Y|}6!a;?QgϞ>}d\R.kj3:0x\~X k:9t'*iFw@g E^?{R#n}MH:lJ+::*fϞm[7o{x\wݍ -̏o""5k6mLګ? ovjٶBd4~ii~߷M S(++ؾ}ڣNӦ=c^?11?=@bt~,QܲFJ))S(tZ43+=]&5H^^u1N PNk(oc㳵8;Ӗ>@q쬜։'ۉDf >ÏfÆn˔-44a157 a8pAhr[[ޔI{>)W#,lΜ;oX]Nh{zr֭]27Ɉr礉K޶h؈gO M5$K gWg[[kk;sH;۷0  hrrB 53=u}+GH0oÏdϞsh>)&z-'ÏRo\Tr>g?9˟{ O@}y wyy?s-\?TgþBKrI~_p_fb1*aA@ؒ EO֏~)Ȅbm#|RS0;{?Nf8vr]!33 }Q(W7L$Lհⵝx>>vv߻G5}{g紩7R\"~~2E&Ie2777w7t7~~ho?vydm-|mlF㼽flk%rX~6+{.'z[-[-[-[-[-[-va a a a a a a -a -a -a -a -a -[-[-[-[-[-[-[-[-[-[-[-[ l[ l[ l[ l[ l[ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@ l@a @a @a @a @a @a a a a a a a -a -a -a -a -a -[-[-[-[-[-[-[-[-[-[-[-[ l[ l[ l[ l[ l[ l@ l@ l@ l@ l@ l@ l@ l@ lpGa^(G7"a a `.GXPZǞHYY I(~POp a לjHg֏=s-엛'CM \zB5ү{Z`/8H( urPO'TR%u?M?ɵp{5Bz]OؕH:TVggea_jjflli9m::1|['fǎ_UV #IFW`'ǥKM n\zR7745kte/{[zC-) H$5b=ofm IDAT_9iJW>-O>H$lݔrO6o\Æ򊳓{ sju[Y¿ods3DD"F-QGgOZ i3ajk[ڵ--{3\ݞ۷gn1a„D:;m߶~e]=ywNN 1pYuGFzz88Trys}͞lyDTxxTDRRu石pf5-=vgmen.ߟ[]S]kgVVu֭5f"^>NhkhXN?i"*z^s+^}R eEEEesWW:}3O=󗈈ǎc-a F5/UՇq#CaQg}}9jNR546da(997?~nhR,Rꗦ uOTTbH|mnMn"2O#F̘5cFѧ|I݈%_`„Eڴ6,vdyűcMM-ͷ2bןQ{Gr{·hf|'>6C)*?\UW7iO&9:0\ZA)5)[[ Ct [%t[k[Z;;}ʆcyII;wߗYRRSݭYX89y{xFE7~foZ]M_}7R{n)8X">&Ww/iF=j=>yC{"+>`zAZ,noko>s2Wb) PV~~~Z]sSsoLLLd"0ŹV]UgwG65uv*bWhhq'$&$XZ\ʝ8LNNñ;Db\4HwwJJ)U ?|kgtKH?!ӵdfTVd9 ǘ^ЧP*5+7l(*:ڢ<;:tua Z~y>V pK5;{7^k~{WmYPИ[ow!!v۾_{O4McSJʗɮΎАnZzܹWw2LLL#|V)7Դ#(pSFuuՙn]^zv{SvxwovvcΜuMwܱx…TW4Lp^J>{>-<ۛؠT>H tʕN]Gxc\"#G>œ&65wu ZѺ۾ߤtwg/wv:dYgO8yˇw_{j2S*Lw56pWWA5~Jgs|=&xz\;e˗-:N}g5uwVhu555/gR#.=\vtvthaaaI_{>+,Ԛؔ?dήŋmnjzv)_a W/ ?Fܘ --m [Z~Zb" U*}{X|Mw݄ IKK=TQim5Ơ`O2323fLwu-u&v0+^yGZZ^3Ǐ:ť+*cƸ a ho;?thggey?<~Euvdkܶ/2twoѡk3?x_04H$nZmñ I6*ƅ^!**(υplt.'-lͷ˗A_˫t˖{T57Tnns.iƌkp1˞}/*Uaї_+ {^X8lLv:pw5k$E}Ǎ07w,~⒞;Cwd/ܿ>{MKE(07,b̢GSSu 997VjmMddp!j a|ذ6+3+q[:][Grg~IzD6m-uųgK7l+^꫼O<쩤]]饥J/%%ƢQa+f])o~}~ޤͻabJ%ʊc}(ZڥpxaRF+&̴-VUէZvW=ۗ.]d #be7m~UoZS{MeR;wٛ3~w}=>{v|lp>PklY֫|MiM\Kw5kVHBGrrഩ.F?Zm{{Z7mqe:f/eA~ffm-M9+,lTGKlur<_§)ƦBÂphڊnGG[x//11W8ܤRY[vmY_}1>v:Z'} E"f6miu +^Z\FKesHܥΓꍑn nv"qwgWWwJ*;]TP$$99zL(;WZR O "Ljfkh8ZW_7xǔ-a=ѪԴ53vKkWkc%zx.x--JemmeeOϡnryDD_ooJv0?-0~ ]HUzjFFCF]Wnʕ]MUW^yyG}1#QnNnFUq>mݴuӦӞ~4t_Y3g..z_33 ;ߤYTTTUT1сפT6۷Լ#U³݂^}MӨb;nK%'5ST3'֖gDg.t^{lڡPcǞkCU޲uKٚ=DB5XT+??u]3gi++EhھIBKNW0nFwl o6l25BRk**3[ZLyЉwICܺ{[o>ܺu֭I'Owro9u{4avZ&= [V78{q~6l93TtskmH?|.6v\oغC#*n-:j+kde5+\ O=k;[c=bcORxxP\%|uscb,$gfXZGx@ǒEDM7/Y:7i'~OwߘNWBxIcovL̬f21Q(}*UT:Y. ?pA~A/_5kƏ{h*UT̙7纜‹~~_}՗gzW3@,??5mǎm-ܪ5۶|sEsM[pc${[[;[k6-w ߟ8g2\l߉vvuttu 5Lkk" 69g_}3\<6sqB7"pcX&[@L߯^ԓ5uuínU*BO{{T7dgڛ$i4VVaaN_jk1%I$ 4UUnz&NJu2TTx1++3VfuYL:::.>(HH//wr1bHwkiyW;[3u]#b뎮aǎԴ^axO>8aO$Nx_o9*xXGGO6nkOOFƷ~{mT RRz7N>uZh\~n(zyNz[oH ֬KK :I34[}V1tvvv饧oq/?x&hl*)))U999&r!uvٳ'l[#GΜ5a/'oDp.juM9iGjDF3gΝ;ztxx\nuH=<ҔԳM,x{%#H+~5A2cPqաZ ~j澾1NNS~uJok쨨6% Rggg'$4ݵ4:ꭕrŅJURu75wܹvCԬ#7gᄡF[۸x_a,VRPg%yy5 `ZY]~_mHӌ774).fY#ޞʃzlܭmd2 sS N,ٵk}JK]O)S|L/UwɥBÆ99=޾qÁ⒮9#Gk4b4XlchaQ[sݻvۛ]S+vwTVwü::bgg>E0|ȑqgKlmClmeg%ۗ[STSSV_gyZmȰPWWE_YTU57 3%ȑ;qܖf-6vʴ(c9g&wcƎ |T-?li;irDq9"&%e3֊%V֖Rr,+Zi`XBsgNKK3scqP--EEB?s. 'C9R%ް)K&2Xzsu7Tlaㆬ> ySJʧM`m=jP#|:JUQ-W'' ZΙ3OZvgǰ}-->nXXgϡC]BNTrKڻoffeewed䜹w/q\O —^89YY%'Nڳ;=:"2&ZȁJ'A={:[&L_9ūr%'P7TIM%ZmaAMMWטqA}(`~@^Y4Ё+&fd\HN+cVTK()17;v;pm' 5NQ\worr>l1i]`@peՑ; AA66WSr߾H$ḁPO ?o(/Yd(*:*hj466 ET>ua?TWWǟrdEfQQ 1nnrSXUUqqVVJJrrjj~~yѣm"cPȰa!ޮA>>&CNvvyySV1~I Jep)QQNap0czz˅U[ڡ[T3=zh~AƀqIDAT!WvEEKVccd[#;v!q1..*} LMݿv{g˗.;ط_(G rԓ;2C%5“NVbR3>D(~8?\zr! N1D_sےveq:rrRTA  ]+;@lmNw{xC:szd^ f_|ŗl8}oa <]Np1/0ᛁN8S[^KφOغe[23R댂nyXٯ~ԅjࣚH ]v-J \%|p-k3ln#v>8Bn֩4_ ZmcSFzJ$(ۆ 37g]::6R*/,[ZfP3VvXs˖~1˞eaҤk&]7 LIB=pvv1\IENDB`gsequencer-3.1.3/docs/images/ags_fm_syncsynth.png0000644000175000017500000021125113607210263017063 00000000000000PNG  IHDRp׃}zTXtRaw profile type exifxuSmv )z=q{A1mv7E>M?{C=M-\2ш"S$˶d@O/6%Dor;H_M)4[ǣ׷U w_ iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later  iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\SW?pF {,a CAEj[kmk}n[[Sb77doN\/j(hmyasnN{H_S2Rn?T U0l 0l 0l Æ:kjP>]|*vtv˗izO\Q߯ɤ--]:gΤAdŜ99}BbBttPر/_RR]g7Q۽m7'N2 |=~-@YևFIK rqLkk(,HM 5K ΌCA:#1x_wR(YYG0 vrmc쬯O,Zxҥb1Bu<=o0ׯho?rp}ݕ;>mmmlF*#zzs]7{l^hɒ?z^ᒫ7jUUSBBWRtffkkliJϜ9q|߾/3iܹ2..nnr9VOJp᯽G{cПOa ki ꫫ򝝝ܜ\]]ooil~>B!b'GGċɩT*sHGddXY2kjj{Gf"3.P]mj+ p7@?`\HYyy 充C_X,Id29?S.dǍM&YGD8LfrSR=~)DJM)caNrtllxTfaaAAZk3eY8ڪ 5U:]IՎvݛ6wb=D~b4>Hґ#ݝmmꪪL3) _f<$gתo+^M8q1ڴ{#ioҤ{+L&$uu .'=RoCcu 51~P͛;~(6f?'"39pc32Ν~߸\C#>e\O)/7+3%АИ:-44(jljb%)--)HNg sE~޿'/$޽'Nfg&&E,^/ !-]:gΤ%v=ro;;HCN.(pw}9:VVx<7ĄjjWK^-,tvj5 =qQ[Qy:[ \\llBB0y&RRssOk/Q3 )sz}os.edd\l!D&XX!)J*S(WoTJUՌo,Xb`.p"җ_^{,XK[[oF t:jO16b0| P&EQ&Oںuk_}?8ݽF2 c}Rss||GJo_?yaXO?f45Y C++RU ?ok\ f͊ r:uZGIIKHA̛uO-ZT"QQUhiQin8:%WSSL\]5U7;:ۻ:[8:VSe1duu--ƖfqPvFmwϦ;+(:,Wέkm®m&O=w"";9ih?iG_Dꪨ0TXLݥW퍍u8y{܅BJ=w.##'{Æ>߬Z2pՁۚw]Tj_u45TgD}"Xr[Zʈ,D2$8,p<1)~L2B1 eu7;:;^urZ@IJ$N\]Ϝ>tަ s+70xJ;訯O`'b>^^˗Z'j+*.Y9s KKOϱc3R,K{$o;U]+HʣX ?qY٧OY[ D"^h|`@HD1CGGK MOV~ϓ=RP]tI[[]77?45TOp,-&Am=DvYYV ^}u`aR?o߮m3s KGǏuYy^^nŋ["Bב#I6ZZɛ.\t`Kx;:{zuhXlKLfdo/ji:ff\.-"u0'foksrtu}^q(1(+DbQ{e"СIIfjjӧϛ'!2KsΝ_\[12W@!9:*,Zx-U3Q3.BPVwD62d1Hdʠb͙>sfddxxqqIIigϞ?~۶ZG}D際?JjHNCc%VVf2 ⡮*JNN8Lmk jIXXfgxFƣG߸QVㅅ/^Q*wʌdx !(kbAqt 7MORKY,:]*5426>u*5%-NʷdDP%Bt*UI~+4mm2PVL>9`خ.2B #(j[9HW++++\56dXR\|$=bijXY }TYL2YK51INb06:Of_n(8 Utw)<$RaaiYSGsr e`hbbks|vVn.,}57L ?54 KږUX**jjՍM 7}<,O5r.Nr9}䩓(;O&'%%'_*:9E<{6--7Lhl$ebX@ 1G禍nVVں\}>_"!.&gg&.Zd-}W(I$Lʕ~W6 ƈ6vZ:b\N\Z^~FzzZڙ3S|}\UU Fhkv䱣͚ $?(xܸoݻwi`~\`^VZZR7̔ru(q|} NN~ᓉ@jTKJ}m矉e噙;{KKO,MǒHUUu7۩2TڍM-m+쬬Ǐwq2{Dr{ DH4=*|Ԩm۶l͛n]&kp ۺVTx{ J0M[VVPL &&?)QZyyee-45n/){ܙs_?[$:ydK&'tuݨ,+SS2*nMf732^^cFD?sf>4ѿYZܯ\jjNN>>19tѿAyyUJ򮮛7K&HB}7^~S mm%8r$1{plkhߚ\.:40<~brVfGGkks3FP5332r_E(m' @PD9sM13ONv̌V&:jk/^T,S ]b?_K**kLâ=^m=$TOW7޳< 4B,H̿۵Lսqp#Ofgjh`e%_Xnkk?K,ƾT(P(,ց'O]]mm\֌\\<ǎ HIn2\`dfde&'x#e2e u I G]TZZo>+i IDAT+?Ho(> dE`P)(֠XvTU74vvUT\8~XFc0KEeC0<1ȨoMOS9 "SOwږQZfЇϿy3/7/fh(qQÂ֞|ǽ#tmx]V{ȑMtsswWRB,j^tdT<-’C1V-_kzfkBњH۷Ĝ;nGLLW~ҥMyxNpgEG76~oㆽ{OܺWd0e@?D߫}Ix/Zϯ^&{-OOgbN1)2" bNE>f0 ^lLZZ]_g Ǻּ̊* op{{f^n~~}}uu7P@eZ]?D*H$bD&|d5E6u0ϳD(ruǎ7x~>KMԘo_tw-x#'oJo/6ñËE7T~Y%g˗ɓBus{YhGGV_p CY"#,yi1YS]\r!%L&lgo/569fߝ>*8jE<JgbD"^R]֮xe%2+*NNSFoiȢ\01X___Q(YϠ>G= %%%/(;'##bC}mm L$50Ԍ0b(=-RWoTJUՌo,Xb`†-JJ_~z{^`K/qtlm}| ٩ vLUT/t_dKΙ3i{pЭ4q1 11udT珴0725)""RE16̞>J)|=gl"^)P=<33RSΝli71֞:-448ޖoꎋ;wpmmeUY2J\\$X(jH[5 =qQ[Qy:[ \\llBBd2<'`0lmG}OBm5e^C<+d7ZvK ߽?tuQUUNƞ={޼=]QQښBAl7omNWֈD6}ٳZ;->x {e޽e˂7Ffx--'O}wkMMݭ;JJp>^a:^OOH$==BasS[{OD"%C-LИU]5ĘBa28:NN#={`z Qngd9xlaaE͛ȑJ$Pwu٧п(GtU{{ccq.+K&^j|;H$6{ckhc׮-z!L ]Mll33uoۼW&'Nylk׿ݡOΞIMm;ƌI8<{6q] 0Tqq7bjlɷ$0m]ass{[o/A ϜzuE<ĘbJJS|LLfL;&7dgeptL/SQsr1Bࠉ(%UG_O햖!!/f 7/^H>v49K&׿{CY)Zx֬S|UYΏC}fkjp&jZF;?)p>7PH":jf~gN>upd9K>rT%/[&P4u>~}S/ L9z$1ёؗ7,xB2b>^^}O:a*СIIfjjӧϛ'۴TH˕Y:v:2cd~4@L޼i߾'n<_}:>Pf)D,+VK U+>pj>B[{w㯿zg֬0##g7q޽Gw\fSo/J,>Ϸ߉Dl؅L/UU76vv TCHyg{zp8Ā7]v7ϙճgXSRii_|+7xzegϦ]RS"F4i̐m-*K[5OS!bR&Sx1^grDzz[փ13BCv襁;DC cckJKKJ$>Ù1srDh(G~5߮ݼi&SS*aŋ?^!,n/^$Z򎋳HnJ.])jjϪ;5 \蔗`hjh{x{]Yu;>p}UUj5͵,7W+,l޼?܀n%%#ged\+Eb@)EyrrB]ݩSμ񌌲sgcb>7n<~,7w(=`Hp ޡ/VWOi4*UI.|Prt25et E&ɈlBΜzuz?SoK&ξY,"<99Y(!ʍMtC|YY ǏTOX[oMӻ5T[TT΁˾GȃXt\mhdfQ:4ZyyYY~>g?``h[M.wv湍t3RByq"R:ND^^IhP٩VYQVVP5-"g`heK<$tzyҼnnD;ﮏ642URb2tP9 <\]~---.FEť"mߋ++oe핕} UUtޭr_+$FGjg4믙ߨ(*Ҵrs}2Jgemogm- @/ؾᗸ.{ BBf϶pƆںIGGM~ü}֑v`lS@aaL=xضm۷Q(+>P#C5I`”_^'$T"RyB RiCCmzzzzzˉLШRiee}CS340=ڲimCycF%AADi~oV/@S04R,uJUuWMatu23'(S|J ~@7fSr55eʔYʮWVRH&&f+WZqs\ilӍ'fib wo/wu_cG,9x0jNgÿ;=a:lj ƺuѿmݢ) 14YҬ">JIc9YY>>#GJ*lC?#xV]Gȓw D$ҹi)%%W.667LLLyD"|UTU#=wLh. #mAuuDB#{d2⩭X,՟w߈"d%%ϻY)}x s`nnh@ih^tr~^?LHWL qsstߦbcMJ$? `>q23roÃ)۳+Kemm]ÏQBC6)jzCCſؾk^~NI)/q8dgoׇut٦^3x'j+*.Y9s KKOϱc3TOp,-&ʊQ$RUUYYV ^}uf>J63Rx)^1/rE"!&d2&&\*lm%{z{{|= "AIiKn%?:'+7A*y3&_~^J+,li 8!"W :;b Ev?ʲO'ON_f HАɓ5ul]رg71w[ߵ=T=ub!NO57rXRSSUL|uˬIqHDә eS"%2Tjkk[{Kk0D;/,˝4{6O P&N Q>` !AMzzH$UkJJB¼KD63Rgѓ30=j#"VFSswwCCuuq;.X0{6Gʼn0^11r KEEMBH޺[HUvHu9;0R͉/^tr8Q$"P)! yy99·X r(ˬ+wnLF祥9;47("LC##둧Nx %~?| \81vLDTd( y9uǎ}uv56UW76hbqgWi7]\eθ={bbH^~gו+ ]LHT_oeemD(C-~c\\]֬>yr+WTrATnjuvvrήgg؅ɦ&aoUN$_۾}:O$i=RC8.U%.h"3kv=1O 'z{u]TTL(k轟>CJuu55uu-+{od-- 7M_АEFRuրt=!ah 9e{֐H::\}mu2$]Y3"#¬߲JkDHP{{h/cOOg@_yyeeWܪ^T&謩ڏFc29 33mgÓSE>|s…'O9}޽IgNd1F43  Cx 7ƵϹsǏ]]SZmc뛛Cܗ䨸/1c(g0DeLEEYPPc+!$Q"mkpqqr66sIS~(Ç(7~6`Y06T"^L>w)f1wd%Re٧_c1qt&W@L~S[hpML<~׷S*RUUZ[*+/+)ij^R&ussع3'ĉ@sSwHt,L&Z73rG<>H!jirt &O8qrΝ۷vӦ͛qc'N TfG;w1.BЊOʬM|_7&`iyy2YCåKa3fDBEI"vڱʷ6lcDٳiidRGGc#[suWӣ'Mڶmټyu??aBXo_[Z+*|| &]#Έݳ31ӥR54͉GUUtHifbl,3,ZA&kiUVWWS#,MMRe[ ߣ`la\] 29\<#>Aְ ^P45GϘA2FmIIA~zکGnTS#|bٲ wxw"P%"x|<4J\H]Q*&S*+sz۵6~vݻ6mƛo._>{/b{{GG33%m9͋YYœJ6 eY̾Fh; ܉Lֶw4W"ٝ(׿&>ѨT|:XDb2 ޵e>受GE߿_}>uSDI?()iohٖ7֙&5gNTTx̙%%eO={u۷o۶j}knnIXXfgxFƣG߸QVㅅ/^<) E IDATXldi~'ɊWbu1hi>z %\691+¶mOoټ~H0j.Bio~=5vùP}:k~pr&1wledo$!!>n={aUTݝmm}}򞞂zxuv|i O%%Vdo`=Nuw߻]K }sZ=sXL̹99?|2/,mlwdѣI}jh0ID?LVSL ::LN^L& aifj`e|\EYkb|vtY,b_=p@GG]QHt?qLPZg05hiⓏEB|RB\Ν$$mm::lo@2j_w><-H|ZNvAaWɃÓ\(.'DeZ$2v˖,LLJO;qϽr9['*j4:㯿.&߮[}٧N~u4p<ۇ&k{\eyA70K1qY&y}kS,koy_nnggnmgd…C硖Y{|֬IL1!p[{ou߽;| rUUzruI>({z:8;oݚsHUJmh6}姊dE*urqptv9}[W;:llS + eѣ|DEUzI<2a/\;r?rsFZ[ih2YbQKsyYffzt#ovewnޜ9wZ^D{xClp['_{7mkJKKJ88jjͥammsvvB_#bi++V̝Go֭:ZӦm:=V#RD"&?ܴэ7J[[kL^L.,+Xolbm=pYG[8US'ݷo`O }_bhNFzg ̘?Bs(f^z/C&~/oz_TG?n7~߯q߯ї(CL~~6E f?Śqӏ"줍ᲰPVni?8!a/Y "{k֪U[ֺNEETD6"! dRp|ϫrxHSc۶Ϟ :񗨨*33;~}WϹsGޝNǧ rp߳+5nMw=aPƀ>>o9:ZXԉ-[~lxة=z℺:I{89{XĈc?4_};s)Ǐ7=e_XǯFE_M}еkk׺$RϞV9om;w?=[V&'keգxј166M=j3ݦ/r81[q%%ޞPh`b-\4}ƬY6c rt¼kמ=rBB[xhWcoaH:[HIR tG14bYSC4w7@M ddzڃt1?xM|>1gΊs.Z3ʲga0F0:UUMr }t>WWʖGk95L4swյ˞3-U{L5H{\IM_|ٲ \2wpTtx33sderzVV#ަDJHIuk{{"5:#h ޽{r#>:>_Vر?@-*(?s:3[Z*0٦|> 舷錎NLLJRT*+RWw5d'>Z2DCo4ό.@ey<>_$O pé,-bTTFckܫ|>@ "{'.6:P(/h MMSLN4̗WK,&ɚ(zAR.[塈1"z:$(|6r"#F*mE&H<Ϝt4hb/KL_h\l91O1 $'-;h=@tD{KbOOg t,[jDC@R U^LR;Y\:X VDC2tHPV k@O0;+GLM =iuC`FF'($U0Q7yjmHb o⋑O@2nXo}$shUDC|blO0gt9Y U{K>tNHPp%a(M6F3QHN ){f hϣ8Op LWȐhX@ bD,X휚<H AZIRSC3CIn\]r lARa0`I{D," XD, bXD, bmHMެe7:O@g$6DLrJ}3`/itB" XD, bmL:1|: *&9CotaM5 0F`F'D, bE" 7d"Q 6Az+Wmޔiw?秧KFId JHP7#hk'],[Xag-# MK CBa|z,RڵWo_oo#C&5\:" 'S<-L"g=C2y%,çO_OL!Rky/f_Ɣ V=ܜN{%E׈hQAGs! A"Tee]33 s sjcelݻ׬9pF􅨄Doo337WT^,yzV|O4u_5сFk˒K6oZY 9s6n0JO!'饧?e]63sv;bAo>Ϋ-(sSW$%e>+(PTT llt"$4E&''>+WnLEY'-ib=|ĠAjg#7lXЬ,XKϜy䰔tw)S6o3YVVUucc%[ûj214( `;;X7džesWPnxv+^]ɴqr _ "f%@g UܺC^ٳFӇJ-)yՈ6RR2{+kWy9Ij?+;2rm /+36뫯||L09z蛕B֫X[WQZ@``ݣ .߼q{%%Ͳˇ ӥRzxL2 MΜ8vd2]VE!){[r|]çMg)))/9s_++U'LDž q!AYDڻ78՚Ԉ˗-۰%)͇١z$4t=BCǧh^^&ϛ7q |VPXQ|¬t== ESF9!21A/^Ȯ]^qZZnnMSWʪG1c,\`h;[UU E$*-=yjT^{ڵ׮<8jڻNew=͐\64Ao۾{7hk9ێ=EϿzeŋ׭H$oGm[wX@"b /#"?w[HJIIt<.rjcFije_{'557T PdXZzx9woeKϜ>ǣӵX={ 1bD~fo;ZW81ldHŋ Odji8lKFXKyjm))ݻ_vW_YZ#V$ys+h2&[7}>~'=E_S 'Y}gΚ?Рy׮2?oŋohiSMMJ"..ӯ?erА;ӿn=ql֭[~ +-35уWW?˺s'*{7i}`A~l-Kgg;{e嘘ĄĄkannx^O$LNw/=]ҭ۔]-Uq ʟk$(7DT1GS(z.z.?yyVU%f>LIKMY=VVV&-毓QW#VV%cBVW62 ut l)Qrr~Aa@ b  6lع39Y[{#.]jg.)0ǎ81 }= 387@P^7kT=mA&khpn66M~ `iL7 8q7Wřjn;6na0z7LJnɕjLVW7puuuqsh5m1t4p X bE"RNݸ=p4*'K6,UeM wKC_g7eQ$* 3=ͤJb^ rJKrs$]|6VHdk3yg}⎐XwVKOӧMiR@$/Xԩھ͌7I@ח[;_z+I$*.thddv7컕3gb5M۵+K}k< mtz 2ub*IQ&鲲6v3fhDwPqG"1LEI(rkD++(>/JNq'O_WU85\/MVQOcT O>EO5<<0;&' + O &Ojk`41#vzM<͝BIM?x8I7x;0K d .DĵG^&$RYYAAaaMݽwةSO*{yӷzpyRRrrtzO~}FƜ_DkGx_@ bE"UfuJK+xgcb2ϝsY慨w\NL͍ )??¸۩_HHɣ 'z/V?y De/?vfm̙LhgظMv1oڀkyCզe[%7H`kW׷YAAKn\KK#75sssr"*+hOO'gUUnmFƓ<>_RgVOAC{O3SWVՓ [[G'SSi6k"l$({Djoee"!T&"#-[LKK^WoHorr.́ D".}L4{ΒV[rpc x[E"Q(C\}fرaر+'WN J" rUW{B:9޹uՊ/ TUP(7o&$zko[0cjp8,j IDATDZz755U6$(LHHvNzzj*TT#G9y<.6E!6^e #S`t=߹qJpM[~/r̎<^m*׮?QXh`0j̨Q.{LcܚNPH&2ӷ}FƜ }ѣgϖ?zOSSC4]l;7O͛W$99B~AK'48tpp^~t2Y p :O^/'27Z욚)"!Kú{b[7JK 1{hb OD=JK{8^Qammnn`?hiiʛ2>#*X@ bD,@ f~#NӚDګ BAC$͖QҥeF0=z̝~رD`׭;xɓ:z*YLv*kMb*++*|*UEK*+CM ןE\T7ٳ|}$نG6!??.si&Ư~; i}5&#޾豵IqE!}M2/^y͛ٿeSae99\Z[7 0wokx|mQL$r++cdb{X[}X k/( ջ{w M%es!;vSg$YT*8Ĥ陙w:88;3nv,y[G+*wر}:g'c# F>ǓDAw^xCWwÇꃶ&tZ{'yTV".߶O cy{s"LFƳgii22TGG''ݻo>j HD޻feե@БRC /]Tp{ӓo9!,*m0'-Û1c gef>xljjotIw~qw43ܼ?n߶~3 `ВҚlĥz?u +W/Xhjیr>ts&6hP>|>,/qk~ޱ}>YY:]VLj~~\yL-v:}ᆱ|5О2>Ds#::YY]t13>jIN& ~J?oo~~^F*|~NnLٳ" tMwyUUqv4%=.ڹukm`OϮ]5XJYYZڭn K")04Ҫ;}UU '??99:…gDbK&khjhiJE޼u]C,JUWa( v̎.ۻ};=p:KV$/7#<. LPgԹsg^˥RճM"/^=ɉzŒ=g֬E8&742^3&$ܻ{ㆻ+E|Ϛ=f[baai7ge]֫'\YU!r33$_1jTνzJeZĸPaJ wߍVP:bĉ8ll$ە5}빸C U?rSN:gNKf=IΆ0W?,1kER;n$?+X z q ʒ UUHYYqqӦO4bDGq~;WFɄ7|{ĩoߡP{];DO'^E"PMM|=wyiihj))yyFG:[gϺp ￿ݵcgdX[ii4UUCb%%OIieTvvFF|'IOZ䉈3wҢRL6}|r}{+{WoܸjŨKϜ?~ѢO3vIFɓ'O=7Zݏk-7߳u> _XXVտZ9WBmDRUf5{Lj 8D," XD, b:2׳Wto\qs_d m6)jVee LHNF_kߴLLm1EEL sKKmv\H$e;;'g3.$&<|yF8̿i$(YXM>f t… QKI1lm{:ݍ }$CVW۷kW/G^d[[d][Xhܹj!#nD;"SA[-  رэBu0bڴ~R'CC_tD2YQQSƦ0=jjNnO$kizjܨ/q^ӨS(JJlvUEU~tHͮ|-/'KRQa'"Ax]Z[3UYn_V6=Iݻy8;J_\Ǟ=cnE_?xpo]HKhw_OO~۳ij SA$q/9S'G Í{i **5κdli.&>T*~ |6Qy?cD_!bD,"E"b}MK5jTaC9p…Аێgug_XnWԦuwgOTԮ۶xmiI|aʕ+7nl7`ɫkk'g3S'ϝղz{`7Z&엀Du]]G^m8;6x)iiu`/??301g¤ y2={ yQ&-]ܣzG^mqK4zꗒ`NJω^"SAQ'6&(B,9m/\[17o>z򠴤yXm=" NEEOHXt̙3/D]tѣ/ ACub`0Ы_=r5.W$8-%%u QљRoRD&ihSA~~NN~>Q]D6u|ii--mm XϣumU5 }ʭG\qz#Hձ}e|m*_*" D,":Ϝ$ɷiK[[{ `bt6"<<){q㬭ZSo'h.X-˼򛷤87Mxɂ,VhpxXLŋsCܹSWKΛ:w/cC^SItUQ~sUq;槷(%(WTY\mmVWΝ۶HŃUTRUSQ%jjj~y߾#ҥeML3jOJJjjz+W]޽{[]QR$"՛0acn`XYY[H쉽x,SS ד''ݍOMO'mVᅫ\Q1L.))-{Yfa_sݺm ii*H#***Z( mddoࠣq玃@= /zޣu={VWK$z|ԱQ,-g1JƦP{8$Q3#cNJWG]N20ML?.Zi3%dDH$ eIi p++*+TT ]U>ηYK 5oV)ck{Kw,A626̯m34q}߇N>i҆ xm8֎1ĻWTRRYYSS[[]SVDBLbbbBL!1(z<;;%e}ZYuRf7[CKKIZY7z̔B!V tZ]A p3|.oti>_[GW[7cbddx' DMFDRH$OWP.zQ\L^:q[-tY2YEӋш]zuu.nrr*˗n$$ϟ''9j|>Hhs2rrұ{xTTT*Qٳ))eeCZYCgv{ScSUU [!Ft||RgfFV֎gϮ?sݿַoފJjleeIfKOF| S:8_SIL >?669ȑ1qs =кx\m||޷/m;vlѫܕ+11IEE35>PA>|nTԱG<ЭcoUU.\M V}فB!9 [9|hמԈ4'OSS{fmmf&y[7k ӡ E?>f쀁\.DnKD山n5kѢ_>k]kZ1i7)}y/IWWMMVʪgӧ/^M UU&l鋗y9 n۟K)/Ϟ=usN8xdH)/hcca#UWO|ƶm=tj/QQUU**ffvvZsս{T*ϥu㭣KNzgφ:yѣ'N3tGvN^3:9YXhiVT=}zK#"bn=xG~/VU}m[djȔ[ҥӡ{<('GczVDV] > G,̻v#7/!!$G+~"QEť>AM Q)~MI}w9wFpbbdekjg&]Ok548c#M-Y8hKJNFFud^^iHmhhi٫ʕO̙oMYm1CG(/'YX%%wfc3}ƛY"22"<ԡCǏ:$+K :edRb]w7oڽk |zzvӖq}zhqm#NtXnъ_M(ֺJ ST""|>޽WԤF/_lن -2N 1@Sb&b} rr[jد]'Lњƛd@@gorK \kJbnDA:Ĥ$EE)2 ..uut&{_ us;P>$pj6sb虶'f'vJebbx  MP$%KbmYd мlh IDATP(hwb rJP7Tlx!5>%!b yP^f݋w/.ngR(55lom:k'I$oŋglC@DWUI4I )z>I{M5yETrDCod4g 3`/itB" XD, b8 _!AZDXs* ">e0×4:!b D,"X@L&@ً/B1t rrQIn{l$U ŴDC2 K$`#b D,"X@J"63J2jE$E4 @gCy$Bub O, tml%h@ b s&')FCt6Ub&ORSC3C.&egxvɍ#$G|= e:ZEՈI3%$iHP؄DCb$6Dl!#0F'xHێ=EϿzeŋ׭H$2} CB:o<{sֆzJKmi';?ܶm3gbcSSss˩T55k~ƍ?믇UQޡR$z$4t=BCǧh^^&ϛ7q E50wYCuûЙ2Rm$[O:'ͯh(*&IBBo|.Ԛj70`t/PXTtO?mҥl~Y8Op_}5{gQ/RRE>|`ʕ&>rO|ؘϗeCEFD;;+( 1bD"ݔL6$6j'O>/du5I]g))MF[bR*l-oW]m?96{ΉcKN~/[%G>~o։Dd̙ ʶ|J.~"iwU]Pder4r$-_}='Gd ʒbI2N)N}ۖ_u3fG\ܒGmuhB@𮥅EƏkh8p+;5\Px!7ŖxQP`;Xwp 0ʧ㥦ot@=MMKNuqRQ~ &a|VPXQ|¬t== ESF9!21A$|)'?>~ҥ~q~˗׬quyjd/7zGv+ǏrskjVV=z`G٪FKmœ] RXHںzyMnt{Sbcl{hԸ8a~~=$UZi ^^WW5ݞ.f:l))YEϳ4X JJ4r7߻c?RP>Ə32o{9}M2e׮>8!OOǎٳkǟ;{s r2h4Yquudd޶PX[˫)N˶f ğ=y7M&R2@KP;K CSd4w{HKKSKwKJ{׶mjEENݯ_^E/+8ܤ)_N ).v̘ UPoN;YAY$;:_(D}x7+8\*{dMW^TWѕXxBai{j7lrBv6'Eb߶lAS_~]vСc8XQ ̡Á?8yRZ:בiLL-=޷oڴq_mْejOV%|`0o_N$RSWUSS}~q.,I;Bgg[;;}n<~EvvQa]]EezvBaEEhh``p0Té|JYZmmaCm-ʚ NFGKII|A&zTR_q^ B15uppXآ `X]g(#qF( +rIKʪR!~ٶ=)x∳k 'IoΜ_gH_5??gΞݫV=зOXݺG򲆖:*$bu|ii--m톂5ۨ!~:,7PSR%O4ΝGSQ ?;o%Kj:M׷w޽BB.]}ҥ@]sw%Ivc,,F|M#x7sk}ܜAyyV0˗S),w_"NݳSfͺjkwXʕkhpn66MS `iL7 8q7W ssOmذsgrԩG\ζh)0ǎ81 }=̬T@{Xf(I^nYٳgN8޿ԧHP#p։>59:QB)yYRZBHʊ*w_YAKK=]M *UIАHdw/+KF@OWFښvQU/2YEYVFzRRbbv6lb/љ MG$"ΦO0pر(6nVVӧ:_R1U22w˽}=\M@ͯyjTk8qb ]'ikN6 aŌ,ਣVj[u~~[jZDmk @XTEPAAAE@%?ƁZy=?ss}+>GLM4b-=FniDm77;;=r\\viSWdSs9.i:LYkH.]jXPa%.^,~ڵ3bmp8R ܫgpGxxL2Yt4t^ nD|h$2B-Dr-^u(b>)%ܥ˃wQ(BahhXx'T__YYUEv%:VuH$##?'t Pҽ߄}wX o"]]]Ҏe;F+2YiRN稷c'"ݐTJJ=<<=CBss /]?{˫s./$hUxl~~ŢOMӺ=|?GO:sLJɴ\B__7~d~˻tq.]: }!7zŋ;wN@lw21355hnTdeO%Qo 2j,?R56VVVT+CtUN;U_/Ria'lL?Pxxu75\+ݷo9Νͳ55ӅS"yG32ZdHgm >ÆsyWJ9ybYY]\dqN6o_ww3S*@Qws@htўDڸqϞ'Μ9xϭ<O};~OWNJJ?66r}|9|8-m3FPYG`kU]vھUVxyRA]k.FC,YoTJiN4o^uI{58r$ҺuGBFyx9};uuMLL/2- cK;ry=)IC oacbo;}fIKG@N{:@g#˗DAA11OGf~e2Z33&-H$g Ԏgx{?*DDp|}H?…Օ!ބ0/ܯzUu89yw**\a1ۛL?pzG`kb":q<== gfFQQ71H[<}ĉ=6ai.Dj̙G`o'J*=ԽGҳkm#0RhOF-JJ3%%l++K+}}р} nݲWY!!}d$oz SSƍ#~}M`ڵ;l*yȰ ug\*C۷xncƶ>Lˇ ?xh\/kf͚kg޽M-u^58G!(.n|q>)Zr߿~mCv77]/=ujǎ_Gm?ٟN-Lcs "#NNJ"z,]z_mC E$5j޼1cRR&Lьɤ.6Kwlذ)Pd?e#k~!nmƱӧ ۷i> v?"D*-QYSS_O<< IHBk=C6VUSYYZrr9ҶGgk@*PB Z 䤲Wϛ^/(vB]kl4Tהiv..iu֝ }64^zՒŁ"+޽2$Ǐgeݼyڅ !|:ZݼggwQ( B22Nf9>~EKfp Q7WV7EGK ^Rr4N]{eW=kax&'صWS(._>xW|g[RUWWUV)D>Q>}NwOp6|>R]VU}8y7={BN TRlCOXaÜGs܂ ܙPƎHMYvSgT* &榦FFVVV[+Z8;m_oT|ӈp|D (kYv̘w%4$&`Gۗsƍ۶abO8: 8!/dC6%X -tG(tp`h4c#K "1]~~.N"EF:;٩T,õyx8&6/Jݓ}=RX|9cdB&uwWBb-]/_6lHJڵkʃ֭i433P$2t9~\('ǻi T33ǷHD\霈v6 V+Waޝ;}&:;6M>|R.= [ʦ䤃r1s[,]PI%RiSxl IDATѶ|]>NDaP|*D Ͽp!/{@v}zx_TtzQ\.w).\8. Q$R*d2m#~x;͙xIӧOhx7"@Ag0Ξ=ݫ'F%%OO2~*DΝRSSl  6lXs2Y а۷'$|U߾Q7mGFrG߯op0yC[JnСi?9qҤX ºDuu_|UV%xζmІ[*7Qt[%)(Oӟ(g78&f\|la.mze h/|ރk#0dnfoTF#M,"(x—]DX u588xLVl>h};{9.{&ر`"|M?Muu!MMJTB>tT׿@2_`-hڽ{]܎2yD)W=z'@`fJ"]ljjn!}<|Φ:LY*&[Fgebb``+ˇK39;]ZR7twBBZ;*Q(dʽ|= @wC6I₝KsrfΌ |xM<5#wy" L" /Z[X Ju/>_qs[ag0"Ie6mGMV2\a2,T}yju`Ǐo554BX\lg+MV74$'oْH"5K/^nhgUU.~~uJr)'.^(8VMMUu^ajjcso&7Kܼ g[w $r wRFT(ݕ{|M|PZP*3ɶ6?li2ٕn߇I"Q}pv21&$Zץy^u{)F-M"?8'/eSkyYM,yX$d\2602~[5]px{NCSTV!Ě#`7o^V\G)!ޞ#`Yss^ʟgZd&?u[?,8ȨuV< *Uq \iuuUUՕ % i4_ V+R鳎;(PDg P~Uog_Eûsgw䤜3OZ[{yw{\J?Y'3Oxzz}oΝmVT}a3gJKt<0ښșbz{;:ljzܹשN"[[42զP(t7߬YrPH"۫׀&ffDM+o]~fb[b-0g2<;;\gOe{xXX]ua,&A̚7fltLP_TȑOJw"D擃)Sw%ylCMLZL;o֬޽yon`h*(AHktAɭ}{{I*#r4ڭ[j3u>_k_NQD0(Sߖ9?аΞ=>?KKK&ؐϻ{s[] ll\]9zԙ3dTfd(t6d{Qk˯UU[:h<diJ@hm|Љ㙙Lz86*J0 _Y[K(."xY}l>q9MFƩS bF{ 9q(W͍8rL|GܪjuMh,8i-dڵ˗~I0UʊzW(N>};5 qq'BRia'lL?PxxegwoioB 8YGojlln˛?tz^^^nfW'TJhqhBfoIoזA%\)+WX4&! /,F˧}0nɫV-V ޾SF"8+ŋss004ԽghHL̃?o?m֮HfSC-X_v>|h޹m! ffFF,ob֔BCTj*63-(()UwZ~#>ܖOO7Ԕ=t$CFtH@.|Иo֬Yz;:܂/-nQwծ]zt}\^ti~;lkp y]핒't( چBy0O.} vխG}u\`kF#01WȘ \Xr+BCãr :r$32ΝbI66Vw HHIKs֭񿺻Gt)=d7ϊB!%Ȩ=bb~6oNظzuPp(IFпt(-D(pv۵dᡃm6bddTz狋oT(TK*e2Z.|97/'NRh4 GGww6!;M:smuu^S͜ѥS&\G|dr "#NNJ"z,]z_"5oޘ1))&lhFxdGGt %yy;6lؔPX(2u=&oZ8eM_\G-Q(˗ºubrUE;{s[q--%==#ղa1L*)\(hO6J$G1ƒDZxQZl- >f& z:LeÇō9r ^|v<?lܹMȅ ŗ/>|3DX@0{cƈDnnb-0ӉaF36hq_DnHg';;42l]K6-vٕ׶-[oOJ477220ru h=cZ5$ܹww/I9pLl_ٕ'9)!a={Rmss( ŅL~zFRp8$+IICdmJ ҦB[Saf5}{{Xpjid~8}{Su_YX1!!**,-^b@+8I29|(556VVeˡCbiO^F,ONKە..>ŢH$[[;s*K.+rs<=B/Y}?? 80:z̘s.+6oNL%Ϗ7e… Ž̠' XKw"--|_h/|u77̛7wҥR)b 6ӹ(WčDAˢҭ㟭 Q'q>3S]/n".81!C"ME(rZ=D/Q @Byyquu К.w(S&i?}Zt5Q'@Gex!Ƞ oZa0Negd99۫,c vEkh 4ڃV q @m k!Qt([8g^ ]]O F` `tx; @IKpOHBoJd-8&t= met;%D2(l- .Z:iޏTx;1]ъBh2g_K>iʭ[] 0Z^yi4bqᥤ+f;v0?^ 23OԨT' (I뢻<( IꚆGQ LomLvp1~ fWstvZwM8nҥ'4lѐVmex._(߽kHRYS juyKY/Ʈ^!'MNL!S,^aêU]+eK~2) @v%:VfH &Ǝ5B)*ڗo?BsN"INܳ+1kdJ%89: 8pZr%֭KL; :|)6˥P=%Z4JuZUZ"y$%Z7HE>D٩-eѶ{'GN8飏d2LM/-Ci=hDϫRk%:}ifIT*{޽…[::mk@\N&߭FqD*~ )wӽآnblf28&DaZ(<mʹWR9uڈ?Ė7g%O>}꟣݈֙ :]&[`GSf|^tmx2Q*ӣh4:I>`葤RD&;::(@ѥ -\R*JmnP"S(d2Ѓ`T\ܽ{vVjO?hJL&Lbg陚ZZGj߇k.]<<K{L&pLƆF1dL*voXYJ }&7U$L*U(t)j\&4L&;x,ȭ&#S2@[ @r TcZ4˳/mr%PV58(kW>Ww$s.^Ο;=bĘ3fTTꣿ>zuMCի/ff5"\7ZJ-1U&X~ĉJKEÆM9kػ5'mIsNWV tG^UB5%RD"نlѣh-ͮ\i\J&k4j)roIDAT)T*"t)S}[SS>V'ܕdgշW "˱g0'Jr)'.^(8VMMUuzljjc:!lnnųRU7n b9:>Z]WWUU]Ph<@AP VVfN-2JV3klټaZ]]=}OgԷ0 ZO٫gDxDxRO<|8eϖ-ֶgHpt1mREy}޽ww/__=7#@Y7n@LǎH./߱s5k[67 ׻ȑcnټl߇ݹim;w *DܪuTJ"56Ŧl6qV Em{ oiSO*&/3 XrZrѣ>|РiG=ӏ-^g}Fq퟼tBӿf͚+B_^ 0613753626l&]:!fyxⲳNNhe=uΞ9]tYOe.nx@GGF<,+];;!&ߡJ5xp)3223dq /Z]V~SqccHFF~~cOBKݷ%WS{R ֮.ii2 4D`:=77'矣>NN<ʋz[;'6yyy^^DR)B}툠f==oo7NQ1!m" TMuUkiH$]:)/ZR(ZPV~V,~={::[Zp|"z6<IԧOttgW&;;!>.dV}mJ ~=acQ#_(;;$ @e9ϝ;gkkjJ "D򴯵Jexxא)--)>wN |\aiִO8g&"`ڴ %Z=sdI\oR);qҼyLoTKo&Mz= sW`R֭KL<.J$4.3̩ܩ&n.db2xH~vnnLm2-lj"~:VZY(޵k**JK\5dzz.. +-_H r26n{8_gg=O?柿pAqup5˭[Ochdآ굒Ch@>} JHXnի׬>}d2ܷ?=XRyFޑJI˟on)Waaaݺ`L9߇Ofw>R*<D0?XׯʒϓHe>}9DY8;河ZZw0m.OаDpJeffddkC뛘5%ІJeLss JJRzzP|[mhK H4jԼycƤL1%I](l%ذaSBa~͛GN-@!@r$Riʚz*iHBkRGUTVx\\NPttv kɏh ܙPƎHMYvSgT* &榦FF// rPVhl'3Wq%fs8L~uūW^xQ`ʪwÇ sdzn޼v-;;kdwTꊲ*Lr|.q'(.چϧQUkתo'8'xxڷ&Ne鏛lD (kYv̘w%4$&`Gۗsƍ۶abO8: 8!/dC6Ǥu/2[]<'ŝDv|If6ǀeeicT(UjĄ8}έ[4N(dSR(fn.2tػG>?11HNΊ1aa¢ڴ؉N߳gW_۶lپ=)?44:Fij:|m BVf:;!!~#j_7ݻsDzbSSgg^=?|ӦӇd2 @ )!9Ax<cnK[RTԤoa`=w/SARd"ǰL.L##%q5Z-\Ba6kɊɽ[;;<L_x.n\ȑ,XKq Xgs=thG.\(.|'ϜקP4{[[`ɓnj5HX1 nl쑿OLL?bytLXwpuq7iR?f8~tР^l9tH,~󷣿Mٳc{|֭eaaddWTXZ_{I$6 V+Waޝ;}&:;6M>|'G-H[YI$".O_erj:ie^+EI }k[nm\T|`3g t-w-< t':ҿx!m*+'-q#Q3tlm>󙙌7G~ի;wZO”Z xZJ-ݞ>.WIP*39y&OO{{;;C#UyyMMÝݻݽO_Ν R>O;YL)BϴvOz}Zƚ(#@2RrR)W2۷<(46޾YZ;{on)1hWƌ& B=h+Q 2`k46`T*/q#Qt! h?&7 cbEx]tA6Qo(@IkVUJrB蘬D)+'[ze1i DA^ir:rܽ>x;-t7ۍ.x$Ҫ[\,`04j(*_}'SS7o&oiX\x))i3ǎ0 ,/ WaæL̓55* ]Px b'?bĝ66̜߯6ロ4qإK3O64h4豷ѐVmAE~dȝ;DHab-4q[/{TeU \.)).چϧQUkתo֪zz㦇')zyEZ/!Z7N-lA(d4RSv '}LF"ɺi\];~Ųe~(ݻ =zLUҒJ>}ڴYR*F=g-RSJM65 @.'P;wKMM 544pذc]2Y ְ۷'$|U߾Q7d yx<&+6vBH$d];{9.{&ر`"@Y.1qޔ=DL4idl4g VJ2==NӟnL3Y I*J/3^2D.Ѯ\))#Fto^cfjdxy앟ÇTJecRb=߼@d E`1NAAݻggTdr9d>.RBA_)\۷oT_ߦ&e89 |^sښR+{D3`͆lB1113 bqSykc8tG'i yi 0F2ֲ44MBj;m RSnҵ AB MhV i@ Y$q]p,t@IV~s>?_}'Ab'9CM-MJ^ǟbo ʤB캷",'V7.3q.S&)e |+"Za''~^$p:3.\NWD1QՙSR)& N/Pᛈn( ov fb($E#ś%7W&''U5TnKN_CQt:s23pxppPO]Vvk'eUӡC&SNN^^V$ @%ɖpX$idxd OOw8vUdw1elؒ/:K$"DѪŋc9^d9J+]6GFFss= ן:~g?-+|Gja|Ǟ^CԵnJ'D"f ב#m69:GQWj}%i&k&& êj6wuuu/XPZ2{Hg+,p}toOOܻdl r;&ZZ_{CJKV\ 5rTÎz?_(wj`;+W?i\Gt ¹.]zrOrI4[&b6>p]]llCC^[o7555Z'`Z6Sq8|wkcxΝxҥgϞGWh >?~'4J)w>gFfGmy:SS1ž+CWzzOwΚ?(q9`pxgI塐 @'O9ZZ:o^MMv[JJ^Akk46,l$%]r׻w{ﵴ ̫*)-//?wG ݝbZU\om}{[ll<L:49o^޺u{YWlY"'މnDr]}wwu:= 5p7"W<іUX0VUn~ٍ/ni>py ͊:ii5_[HT8,3KlYniؽLI奵h$MZo տ~a_}9ϙpo›onذfSݪ&۷Ο?>زyM/((Id3UyiԕQ qް"A  HHdG]]TQHotPplHN7fk4$ $R!u rHF"h ??ֆߧ AĺtrA&qa2IENDB`gsequencer-3.1.3/docs/images/ags_fm_synth.png0000644000175000017500000030676513607210263016205 00000000000000PNG  IHDRpVCY}zTXtRaw profile type exifxuSmv )z=q{A1mv7E>M?{C=M-\2ш"S$˶d@O/6%D Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later Κp iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\uqbs؇" "q+;Gevv7nNmZZy43'\" "V?9?bGp]>u\ h51%pPpPpPpPpPpPpHote5+/ /X[k yq/\;th |LQq-|%33N:ݬY'پ}XX\u_39o~eU"ѼoKF?W),*)ݾmۋ=[UUYY^.[Z89EE3"?VԬm]P"Ilh8}z9sf^@%NLLlm]]\]]vԥ}~E"33Kۻ'y.Ԯ]~ߗ\?bkVn;sUΟOs??~SH$mo&'MO?v狊zz:;ۇG ݷO|V{gvrJʱcǏ{{[[^xفaB@e%{ɏ=h˳K^NwssusV\))&&67-Sdk?S|or1b̬m5uuy_(/;_l<_!B{djꠁhd23yNZ!:~r f;ؿ駟?d2{;E^[רJeK>ի];|5jlSkϦX㏻>th߾ +VFECG>]PWB*+.^<NkzpݶLvpԔ`?vvӎMI;qRy;۷pwqqr쏭T76HKNi[xؐIoHSRm53HdgeUmڸ=ܤ3gΜ5KHWȈ߸sLqQU֭6z𠐐0PsߥK'EgdDDr_~o3f<ܹ+|TQai3>mߚy¥ wl_z3bģty#88$Dnټoz?̴tRwm TTr HA=BB{9sbUU]}iYAQ2D,Voټ?)%E*mlEm[rYѮUݚ.2YYyIIAA;77Wdz}Ϟn8133;ŒskjF#"Œ &?zqbG6F/_B7Q 4V,3df$'=R6Ju"+&Eu}.Yzׯ[`:\ii99{֭[{wo)#ó/z[`PfFKJJ<< ;1ci.HjՎlNK!fje5s+/g n֬ɓGl>,lHqB`d=i7Ͽ_֮CG<#;;y;/yА-6؜:}ԱcQ:7lXiÚsΞۘő]Ǐ'D䔌;_%Tx spx|뉉G8qpZZŅE:Jbo?jT\ݺt=%7\o6}ΜN&&{z?*Ə֛=q=Dr.77';C77ggV~Rv6ݽcǼ‚˜h4+Qknal(_+$z!ff ޽[R)[Zt:L;~ر&LhjuPں%K|<..rcVW75-t .+;x0<:664v?p~b+?;jTlܠN.]*jζWoQID/VUIe9H۾ewX#[[k&*W &~MXhÚLM-/"cgÇ}T@QQaMM:Tv+1,-<=:uSz_?ޥST]Vֱ\.ǿjNTQV#tBHN٠031e !sꚚO 7ntcSj4Aݺ?PV^T,(/B2?m۲90M&6}=$K$eEFru "QaAn_0apl}?׬c-;^ٮD wm|{5;f ("12zII7;~hΝ{ETTff{Mܴi持Wd2300K/WnIi-G>|ӿСB|ڹXX8;w萙yȡ!qB@^a䤧OcǷԩO}+i!0pos.33\no\pswuSm="tSBf&M>jH|hEa⅘LԤjV$Ҩ[dBםŔ[5y_6c3V5HZm}DݥK?%;zhxX~ƩTB^$̤RY[[[mo~BlY|O<;w{UlyNn ;uLFttÆ;?7m|„ѣ:}:;g={˗-?\]ڷEtQيD=ÇįXnm&KKss24$2rt ]g5"bbӓ6 }v+Ϻ9؛9rءPO^rrBC 9NMbq}}]?niaf&a##Bb'Mj}j.]S$*/?hȑvNr[⭷?믄+AmPǧ];;wڥRUה_21gyCCJ")xlj>JnjE7S@j oo;;ӣs-ߥK}{D։i05j="wtFci!7ZB$:u*///WET:+.^σXVGDꕒutA@BaaaowRd !ն>|:ʊʲ)+y-}7rTޑVVfW}{gdJe}C\XTV^WWRRP؁wW8xdffz_W[)((-+/H^-ָM>W:^.߱sk%_,޲%)i~kk"(08W Ay nrSZmfv<رUJe-hiw0#GBz*XR;|ʕ}K,Zӷo\J%XZٓ!UW sy{T*U*s%vpwklhDI;$ܼ]<O>yw1~f*Fcnk]:vܥkZK$N;WTt@j?~ &&{N-7nذfΟ^=qRl\hR)ŷ}ڻ*&&rm;w$l =| j션.|6o9w>;iQ:DDB|hO?G9nbz gᇯwǬ56?g/Y)G~󍏏㏏?444:j u2 . =z嗟~zGDDt/sZ2s_Wֹ76?>'gZY68[PhnTW6 ]^$:3$h2>i[ Z17 2(}{¥zm[7m2$$kWkw??kIIG;fkkbRU-2R*D@Yh4b͚͛wlltsS(@ppdD>Cj4t5N73;~0))4_:-'0ZcB](mF@AmC@mC@mC@mC@m#D׭ۓps̞`R)K$XZ}Tv|{D"Mv}RibmTRzԎ;wK2^7(*Fy0t60ko}-_}Ek;2oP8^׋/3.n- .c(Yl`f6 zA[;ҚĽ{J&* pwH)mYiYUJ~m¦ Ohkjݝ0rСN˫Ka[IL;?KJJ<< ;1cin,&$'gf?~pZZŅE:Jbo?jT\ݺ_yN$Z|ݺ=~]23\]}-v KJ6ߴaEŹygm.]bcǍd23[Vpvvrsk2Aۜ:{jMX=xPHHXɭTA6J迢lzE |ܬpѣ ?LqrL\\,?}*%bc;tO>c>ڷ_ܐq˖I$q-wUZ2moݼuTJ IDATO>9kVSX, ٳ{kQ(LMg>5cƬYWi!0pos.33<j43fN8f̵w/8tP}xztE7__77 ˩SS7֬+4U*]vۖ-#}،5~|Nk֬\kqbg'/O+`t#ŷv+Zol7K%>8m9-5p?ޜso5}C9;GGZcC))R$2193OXG5k#۷ 7/;[,j;3nĨQ,ο;[(st2K" 8(%Eoo77GG[qq;_{& .mذiÏ?眳Ju݃"gG$whk @Ri49g>ܷoxDDDhop 36֖{]M]]}faaj;89z /Z?RV9ٵ[N:kZݭܼ$?+ nFEuڿSH$Ric+~3fϙ=祗=]XTW{s^_Yؔ Ǝ>|G.]j+*Z{vHk2mNuM}R5556Z[[[oϼz1,fJJ%%MIMN9}/Y++JK/_vm֭mhT*zF^ II&&Ʒfm-t4J@KwraGX[Xv u:O7wW7Jd5?lټicPTiӟ}I$̛;k]6=yY-;" )ROϜJT*?޽YϞٖͻvm2sxϦkmۺ9!0P8iӧ?s-?YddsJV(昚dm'EUWݹm[o-]xHT^>4~Р#mmr[o_ KWV0k&2lxddXh\It7oau56T2ٹs99G}oM6rt=z tѣ?0Ahwn$c_fj*TQL۲d2&/7'qcGdºJĝ[svn jy7!!!ƻ\ڻ((ek sANJJ?+zĈk_Vi¢򺺒g>}$g'ݍnP*LZwoo.JȈghʒ+ խkT*"𵶱_.^zs͋+bϨ^KrZV6 w#jR#ܶ-(bc >|o裯Z%K"klϜ>}w><=tm9:喖6o޾=&FJ23rr*.21s+#QƏ>b̸e>Y[K~ 8xavN%Uu.UFGGE m6rr.]-*ɱvqQfxMeK$Bgڪ2Z61S*;^..RW/mcJBշ^UoN$Ke.ZN$spnO>UUVTW RSSs3+K sVt,KUٹqkSڦL>;WUmbߏ/[oWҒ_Z߯Vne̜9uߟHz͚֮]ܼ6,,&fI``_{9/ŹMv+WY΂.x;!Tco>.WLhDع󢅟~99I"F#e^V|~޳^"y~xG~{NppoV8/ {wLfffaqmlZVVV66eFR\FXstZgWUeǎIMM- ff>oopN: =Pn>UT64T oZ;ȑ#=ztо2Lqi׮kE*Amٹ XT7tP ûuk-}-?Ę1 +pjbH[/0c5|{.ݟgn֚-no<]VOrĐ!#G\|; ,YzwȐ&bO4;sQee]Dp~A޽`i`:]IɉC=8g5!",6I1<.nĨ/쳓,^dɢE11}ũT=bQuui o֞ G+It2~lFJ[U%°573t>?~̹s8PTtӝ;{zʛyzPK.vej''GځDž5ﯩ)//,;+W/v,u1m=<8RIǧS@ww''+;u ۿ?YaavvVV^^vvӦOI$r'ǛHtɓyyffuu;v>`=)'Ndf"ьm֖nޮwG'N=ۼf ϜXgaeeRyyvd֊s3V(-zDE:YwBRs&&ٵ(7)_ǎt:v@pWu(7f3c Ca`e) |D׭ۓps̞`R)K$^@J!_1@,r@gpk &-P H1LLsĔBezOӯ~J%WAmCep_ R:*@n+ 0DT}P , 'uG xͷmuʻv cFat-P\pZ'4h00F9 ']̀2h;P4Po&L4*0DZj@l C|Oc#G zMm d hk7)Mmހ:w5Ɣ wAQ?B4M?@(H)AjsVfgho/P!wW׾g@Xr?8ݳ)wjhs4‚uo߹&:(z_|z(=ʛ (98 ~)}->>13,̬&*v^p[>;<:9 @jȇh?7ϔ#FNwۓ .]Rm;w1rCw3wŴMgϱcy.I$}zDj2gˈrCCaC{II8{|YYUUSLfkڱCDac(t.nݶ`oܐ 3~|&&2YP_詙ƽR/:]EEvvھ|8{Μ#Rg1Ӧ8[" 7mTk=I=b sˡlh~۷U!!#F;mDr<+k׮MjkW>h`K~e X702_Mc0>3AWX$a<0 , [2f`|,|w׮mu@'' ۷+O=;r倀=\]s?$7MLlm#&O~_O``@c]ݼy~v >ӷDbm`oaG<=m/zСMm+*j~s'NmoKtҲ?Xm[rrЀ ۍ}:tA1Hec倮08(^q }v# >BDyxv5#6|%,*5~D+2 g stuFo̘5777^3`j$g/ #Ŀ}W>ԔuY=~ySٕ%bOM'NpV;9C#|RaѭրMF+ j{E]0!$YԆzaP "\nk+t&A2ZmMumZ-ml,-xW*)=qbrC'9_PV^]]W/hlP*̨7ihV5u?YxH8w dF:5+W:&_wڏ^[#Z33SmMebfbFSYqFs`uL깮̮ݻDȈ#ccǎ7V;tOx#a[̮voL$/#^zyxw7cUP-pOLM-dZm~~qхIo{55/\PW{zmu#G2J:mY*mӡhI{cz=@{ʬBYj~LΜ1rdt+*"}CB;::h4E[bС=#ʸCDĐQI-۽}R߿[7DRUulJm))UU:D6.326n[GǪ=y[[76?DRΝyB]\=<\MD?mK޿c>cz;+D"S`9bt~R,ٽ ޡ\(..dk+3(OE(/f350mq=}ĉ"wܹ믏51ۺu {Ԩ^JeBF'Ue "sHρukj:vtUjKKWOI^aa.RiZZ?vr^-RwlnUZ^/%*zܸ1cM;~ҕAAO6jɚ ݽk#Gb[[W{1{74YU_y-6E&n=ȄJ_mQz{><3Çv5rg{{msBb}W[WWgbbaaoڡCpA=y--yd q 54j Sa]D" Oz9o-uMd2gE`ȑÆ =,Xw8p㹁~{>VZ=^oа{T#y)"8xȩS\!>1%jj:}z_|+*>s6i"%÷׿u:ԙ.5kʔ#{ 4h'|+RR;xxU;v~{^NyϿ֬}CB{7/Z{k56ڽly<=e=xر3fuw^xq6g}WT\Fh0T`% c?f* @ۧo:yh+qvͥmhuFt|{/_{Zc7z%5'O+__F&33ˠhj:yϦM{0~Sg=?AԔիWxpϿ_Qr9c_K˯ Ư)Ԥ|ŹWt_~/;w45Z]S>er=^"ZևN ff?~ܼyG58~20OLΞ).ںuVfb,@+*qK81uW_lmm :xpϞ6ILw|qk}f ܛϽ.N]a̘^JdWzuuϖ>GlWVI\Rv}e铰i$\ R0 L @,ns{Gɽx'1S0hCߓY.]z/df^{,-olT,,fϙ?:Z[74̙fcX|ʪzl_?cNKK_rHS]\G<׷[pNjWںɄޚ;ҫ8ٺ@Zv{oѢWλ*ܦaMPTwL, %66>~8v%s$$;~46 IDATx{;;?8a䨡C|^uJK,YҮTZR3gΞ՚ZUYN~&oD"{;>_~o&-c߇D˗['ó/z[`PfFKJJ<< ;1ci~wy.mܸirmt9s",JR_9lؔ)}{_qFl>,lHq~Z11ٲuObf ||(Ig(\\ƌGg{:i9;kGvsKڟG}ȩoj7nغe쬬#Gjj*+mm̓{v{ ?sWY-X ^~ڞgݺ w~22ZvߑvU H 24Q/ g0 h;hNٳgH_nX_X{⸓c.geuuuUUyyuu5%27W__2gϜ˵kk;v%4QN?}ԩ//'BÚt:411-ŋW4{c/YZxzt+44,ܴ87q{?}Equ}g{a鰔# AEXb5hb}SLŚX`("RD@|#%FRfٙ{8wf_V1Ԭk9AA.r9Q|~cSژ˖yy9:FDN0n\EZ(!!%9!A,7nzlM)E.8МV:UeD~9?|`n.. 2~|jjJ Ϙ1L52(Q)/_Ҫjx5}ۃ=:**"B$R*{ i}_"iC꯿l߶mDRR2eʌwd\^UuATJiffb9) K33U.wa Q49+VyuTZ*LJ?&EEM1s8Ǐ^mۖ._3WufI)1&bq~#G^_/kh>}bZÇw SR2|]ee55"aK}}kO=BѾy@U7%J=yj:3,lŋ?(2Ύz^/_eK5=dڎ^%?HûN {T2uz;w _GȐ{PYQ E"ܣ W$&ݹcdĵݻ:8ld}Dsh9*r t$4%'vBwwgg& }Ho6qXAAiiA,w'ʍ7;dL&GL&d3G~^ߧ.[^Rq\D-ό00Hח(PV|ߨQZZ\9mĉ' MIIҊ2bd|Zfmݷa+d#Cs soK?ݺh ~[ MM2u-̟:;1}UllZZzZYyXoի+x7; >=KD9_WGbikqœgjfb*jq0^ o(UP=|$I__&6cyur9Q>fL*+k9s~"Q_$n>.P6)_VnL0,6ADB1u-`kkjbO޾ʈӒ5K(b~}k#c$P*ڽ{,d3?=ⅽ{6oڱH:oFFo.75efYw g~?n++pΐ=oIһwo~dvvzk߬ݓ;⧫1eddg1 (PV_ E"gdL:aˆ-?H}ֺ#RbguP_!)-#mhE:3e:J\ݻu'n֛>@˛H$킂̌wyr祧x9lXS\`ddD *XtRoh37FT*"6崴ݻ"FEI$B!J̿uJSS&~X*ee mjzScG@d>*)1澛5œkT|tӧ,=g\@Ԥ EihI"H$1B!Eb;Lv~x<-%m/3%?+'ʪl2E-E564665U[S\548ټMP(d JՑU^}'I9,,&Lܽ{͟gX0__-aFں5f=urz^(v-f7Қ:?>kk۹6;eM6ZZGJʟ Kh4g77רY,uCKbPH1iiy7oZXRPZsD WY9фMF4J{E*]T:Teyh r E@/~XZZ]MH "k+;Ӽ}]$͛UU |&C"wtH>H$Hg]|RA+T$D"B7P*{^ɝ;KKof]#nڳHD,7ꉛdRiĄT Ͽp=)ͨ죾K&[Y5klNOLش醪6`@xގ:DiR3lN }M)x7;uir@_'翻74 D"(6p8Zگ-x72uul:]c`ٳ*WTUT ?[bP?O>gOJ awTGOfg?sgiYQQvSpu^==%Z=ZsD q&wN*Tl% ͻXZS66G׮I@T`YwJ_.-RYYl߮B*+֭[ܜDޯ:::o޼k'tm]=072dLL}sr2=<~~eewu4kb4Sc~acƴ/R(z!{9th~AAN˧N9rк2E O2տ?P}~_AIfg.9r`8jt:F!$RC_앦&)0gZvwY;yʴi~*R낫y̫553g}^W3 5]NssDFhq8ٜiDqmݣ33L60pqv03 ڙ]]P=c#JΧ$ٚl/Oc׭|fgFG'&x_jذS=daJӧuٖ;wulbb}AttdȑQQyyEO9s̯lڴq,\N3113ףlm}}_3 *//.NK󋈜95G~5.fEotI P[e^oZ qԌ xW]xf1cšR(`Bb7`@DB=v+iuu VovT9p@5ڣbћ3pr0<|BkGlkMTPT?LOrd>3Wξ]"o_Ҡ a[޼A|C^o>fuίkcG4V`0*ܽD@_PХyy T\]z<3{FH^RaCjxJrt>brOow/ӧ6'wrrq7ey6M0{$'? WP~VV^^qGih陛?/AA)It!]$ғٹ %ёEoܸ~+֭۰}khdƫmlݻݻw ҲJ$G}%;ǜo͎&?59؄ 54=y")3G`pD.32䙽|bVv ,pubb&( EE=z{X[󜜞}ݺߏ4n\bĭ[y&GE l1BٍhѸqɓ&m;gDp?bn.fgyҾ}55-g\cN FvҥA݉RNIWg/عssޚ5[۷ckZX`/?zND:b%z^OǏG-)B!qf;~BjFz}55ўBammn~43(}Yu,ͭgYYyzxy6̛9"x1w*TAt .-8h Pphݻ m_E*]T:W|YL|%g_9( եgC٩-d&ը&Qymc!WEM7"h w\*m[_{hWp=> Wp m3< w12Y}m3WW @ۡ. &M[EzϦ}_&56Hyy. :|x&@{eJe2&sބ;<=ml 9|x__-^&Cbu1WRffg_QW(xksVQq̼y ,[&Hd2濤PTVJ={Ȑŋ32BzoxUzh[Z(,-={nǎ5k6o:|8=J54oعsg>MG_hOPae֐He2X&S*Y'B>ԔodHo^=0)>Bd02SSml Mzȱ+~ӏ+/^V9qǍhޅ <Ϝ٢,,Ԛyyǎn߾u_LPp[$:v 1{n*&hP Bl&S8qĈV+E&Hb LRSVoefU׮u/ZZ./)=th~>!qݒ%OgIݫ^LMCC?_woRras89veMBWAtf:h h/boTᨠO>ߠ&h d`d'x~~ť..qsϞInjyqF}}m]}RAf2~:IOƮ!RYI| О@26!ZY9LT,g:h%D3 }E#*}T U3oGJ =NT %E˖-^lg}B!dں&mg}G_|1z oߖUU7 N_~Bm-L vr V(h4XDڴ3gMLkWML|| ?}ĉÉuu%%s5A>ϫ/;g.-25MtekVZح))A],H$xjRS#Bz`d%Z\=T*VDC@{aaN4mCF>3oz];'@v~_׮Y,0Ζ=dZ@nj3G.'*|r^ރ,ݻv pur44JJ\/P/_eK5=dZD㏿j}y FFLmNq| IDAT]9YNn鮮7t*n-M(Po@E,"hR@ۧ[ zm"T0 7-g'eD_hkgd*6DC" XD, bNľqMF۟|8ԔJ4yԹsbLV/WV}O>绻̨4]]/77??;+7QL\ _l@DZcͲݞ(S(7߸`og'1Mb))VZZQCF?^*%ة lQ\}vL62T묡`b%s.ZL蛙oj\'pܘ1VVُ_m} ܼ >[}'sVR/-S*dCnݦOQnL&bArL( iD㨠gT7. [W:3gXG$2 A٩cd'XD,"X@"bX@"b2b_N(Hh;wG>wHd5}m-Ϸoܜq#G2\Nnݺg]u+9)|B!75H#""&&9}{6I.g0 22FEPς,I$t¢MM׳[#T `2TWs(jj21WV> ^ohiM%3nfǎMf6řnظm~Nk'xh-gML1P\ tU/ Oc`d`H  XD, b@"^7 E"$-G[)F|~"2YT(o⚚~kB_Tdmeg}޽rI l߼YZɐH*+i wHɤح SR6l5( _~ikn_- V#h1/ ee'D, bE" Wf1S(=yh}r$o"J'sXZS66Dk%%tD`mia!2ld׳KKԀ.vVVr9rJb6q#"TP\]Nٲ%!a0W/Oc׭|fgFG'&jذS44TO?}œ켛R{#||xgg_& {6uOϸVd>~TsE{(PNDSAyN'N\Hp30`Fc0ˈD usNN]9hTHu5/ٚGsFF$͠Kv997 NWL1YZ:;?qZCr&S6zDb\;;''.e2C^}p/T>ٳwℐ21ti^=iKzzJe n73gH**JK 6ˈd.GK[YEţG|~E&A}D2xЀn~PY󳳯]ɹyׯ]/UT:,Z+^^^w>zaQ ξr399EryMM^k@@gRψAâkku6leuQQ^^vÚyyw]|O E|{+(7͝7`A^5' ׬ٳ'9gϝ:s+O=p괞=X-/:̠ Rq}Aذ~Æq qs ɉk9g%G$ضm߾tuL rȐIL>'' s#C:]O֖~FI$Ostr/kh::X[lֳaghO:)1%)qqII"QccmL(s0wB15rzym\eˡCk֜bcmh2{)2Y(?_@Hd5}=-Ty?Z~D&{sZs9Κ4y-#>}%Ӧ ֻ޽D$Qw=K2A'LXHxS $ҦM9+$/Zg+WDd2MP*oNHXayy wn&Ι3~|@.= Cﭪ,)),46љ8ihv^K,./?cwy:;֭r@KյGѣ}ѼQ| (6AKOHN ^ؑ# _v4ƍ~1bĆw۴=6_32֮bc:׮ٳ *y,XL,&f>w2*", bE" .⛷6o2e?\Rbo7bĤxO_aKS\|`,, WQ;^9Q(RuƘAAVVQQ MMl./[ Ńqf͊Zgذ!Cƌ4xmɇmߵ&N(, w2K-^=?Yuێ*f2%o,NJcR) "!ܥ˨Q+W~e@Q( ƛ1CGAsM^RQp XD, bD,"ʝBQ^~ ~ursyɓw'>B@}|nj?~U+w?k# Fry}}IIQ)\kk llܳGm=ˋkY>``xp0xA~۶]3Əݸ\g.E+.YsH3WeUU$FFNݺu gm1:fx p XD, bE"ԸS_$(+?~<1!#Cmɓ\ P#L8{RPp4۷_|zJe2/J%D&Sx31dcc7=AŎD{R ^۷۷ GGOP("@$`2lGY1@G;x 8D," XD, byؚDkTAot\~7}}[柬k9'(Q.'J 7 ~ul!C<#)XӏV~ռg1L[7"'22wpW(0OLLIsV~vf&b2{U =|X"}SOsLnglE 8#gdXD,"X@"bX@Yh!Z#hN=7gF4 @ʊ˥RgϞ9sJ}R,h|TJ̙ONH\:}3f̟/xO~W|'+ Z2ٌG8;}%I(B,9]@@u{rMTPMIIҊ2b 8lgZTfmݷa+d#Cs޻|E&>q#zN_vO0,6ADBikit LL̔klhD'-ge0txɒ9s-R L[>[СcGxxhSN6oXtl<",7_tx2맭)=y~*z{$Iqvחɦ͘>}]o-W.++;;3c@Q@m]cTRR\1e #F)UՇV޹Ȯ˸V y|OﻒFXt K'偯DSFΚ&&zdrCۯ3g<f:m1[[a``cޯ/Q?křӦO{2RIOI>ijJNI$2YT|#"}E"??={^z>6v`T, i4#--?M 6[*tp G奥.^45j 㜜^>D?::fhf %nL?zԬСCG2{[lˆO;fA::obDƘޖ^F"Dzr9-mQQPH7oݲԔ,-=4߹Cdrb!-K J//?߾rssrč)dr=?ckqX,SKK__ $YW疖KZZ\*UԜͶ~.2?gxdTd'  XD, bXD,"D, ԶC::Z:21{T*߳}Z2J|Y}Z7\K/^*(wquueUQoi*iӧO?yӧOٓi`|buXxf|˞ |P$R*e24vkbBjq8ČΔfw~"2ȈJ+***-dS(=z h<[,zI$bӖUy^}C@$R(cjiv,-+*64pr v5;;#WoooOϿk~`+f}…_^ltҾ}^ojk;"zܸ~~Z;rHo #R1#U^ɝ;KKof]#O^^^ol"Iɵ8m=;fz^^ӌ"20_X1Π֖Hy̫553gx)̂B e\|ammjdںG5ffu\g}m :FRb<X_*kffׯgf[EDΜٶG45<1iymR]գe>s+fP*><~b'\\O1*ƦPhTZII73"cLȐ21H0ݹӜF5KU.'(Ǐ<4>7kiq8 fo}o^G_ Hu-' ˗؈DsYÚƪҼBCwuuẅسXJ?Q.nQ'MU(wij2řkdI| ݀. ez؍/D[}sRGa3+oY,:M&[X89:utT*\F B!s:oy$\KԌ xMp(L*  t1/VA+bv\()SXrG 6laC--yĒKK'sB{Cll^\?xp~]L~2/ZS9s61:=_߮]l#2th"5Ky997n溹GG-&N'N\HpLN5Nʺz9o.mskog/˫Q翀@ bD, `F =z f<}rVBQU;0⽑sdD@ke`fS(L=Ǐ74T*cW\ѽ{yzzON%&s[Ĭbogo``53 =y!QajjaHVH$## ޸qW[a/?"BGȌW]U={{n}Blر~Cݷ߯s/~KΘvXܻʕǏoX?l$ߺ.f3RS--bemld eYYGg5}._A,֛1CA<=]]SBqqѽCvuFrҍQQuTcO~:lǟ>}DbBzl61YY{TY[\K[͒˝z(u萧Wp) ܼe7b+i1kg"~>4bΛ0a'O}/qg}G%&&~׳zJ503536 lMĻ㩙Y؀3Ǐ\wh|qq*  >]A*[ %N*PaIDSnI>7aˉ>O4uz]Q @@vWAFtl(M5 kAS `3(w'pQ{Ǚ}_fT%3J+Ӵ喭fgV42}_P\PAEYf}93&*|Xy33?HPnHPt_~goѣ%$k+wd>d[r_ikaܸ'wP@@llߔS7 WmڴekVVƞgΜ>aaII>/#Q..゚]jMv8PZ*DE%$S/8bDBzn =\AD뭭_yuwXLJu[[E~?KƏɓj̥ph ʢFzܻwHȥ3<ܛY/n[B||nJe'+<}pڴ_~snRR>:|ċ/RLT[Ѩo :N g<LZxZl_]SJiS~UVZ+=x\ٳ{̚;oW64XݻtԶ%%s|'M,,2 wЈ'*2,i|ԓy3ϴk'mZP?>}yAApЃ>=r+>t>**$$%_C UӮh49iKoޔYPX^^U ظ(1lX877`()]|n?&M6,T1fL{σ{z_~{ڡCEEOk kO wq(xp64e{13ۋD?xm{^!H.??t vv /_S.XaguݞCXvժE +* ^|hZg`c%5 .Z8 J Ν²OJ)U =FdҤi~%4T*)(xgF4D3zoė^ѨQ<6Z_A]_}hس3}ӧT*wwG!wdEF`E tUUJCoL?QrTf' WzG;7?Oc\elMCFcaacP4g{- /R)z"Sq:X2+*14I$j =0+ȅ K˪kRS X+ٻK(Hmhܾomh8t@"뚾c N.-rqf}UX$3g]m[x,9lc3vЧ0nO;( 6Q oݱXl[4[7ߌږN-D%R˼Q(d2;0@CeiyIIAAtF#4/CJHҲǽcC.]ߴEGfeřcǍcǪkj* d^m2>rI,n.$$&^Y99aa>>nNHmh0 vؽkʔ>ʫ oUݺMhQG33t9C4cϾ;wvֱC^HM>[|v7SaJΝ;t0'?qY:5uԆi 6?|ujjUuX>}6,(]&./;~L$ruwVcΑwի׀?޷eEENuK,_1m$oz*Z[gNOSnx䞑Nv+W,?uo"T k=()Q(]mmEwqw 1os3PY$}VUO:Izx<< @Z::TYY͸l@F%"bŊœF%(K$>8(Hlc>RCC;vy㍉ wڵsBrDD`J)ݻo޽egVXX5٧z!NHؚ7oҥK Gt." Wsg~R?q\*Fܬ̼|68}kŹšUCӄcbW^ό5z 󉰡AAVVO;v(*Wu_Reьgf)ڕkߐG]+흝l]]@H[߹QO>;9uf<7z,Z?nOKWμXZ+I$VV kBV?[CWE/_d0{K͟swJ_xaW^Qsoo۟4Zd͚Kǎ stU(܅`Vy)=Z;[gL69!93~d0@ Ÿuw3Džj"^LnE"`ri'%i:t BƆNa ݄]="99v0`@|F50y =cbCC}]kK!)*oY$9T[[WgND#p6L5BGoͳrtmm=ͣpgvw{|M_$| {p?gJ޾DB"qttqQ*kjjjk?h7ݽ{ܸv6xjuLLLli6o1AZmCC}\cX[k~GG ʫVdz^_X8o|֭Ώ<'46\n5EH ԖFӠh, Za՚z@˹9uM++HCV+k}uk}30C "#j4]+}%_}ei54h42Bqm?l̥m}v\U %[{xsb777*7///3S.ں:!U痔)FcCR ]q.?YXX^niVUm0TUΞ=HTW_U}PYYU\)- ќUhD mݖs̳gKjM4 gg_I=DG}4ig:dgХK{$w)Nɪ+*jQX IDATjgwaۿ>$D uUb?lWZj󦅩?ndBHϞ}﹧_Ϟ;:iM2E 8$_ r$Ĝ]ZZVYZzyTm[D` Vv:0jPu癹^ձcxDݻWJӹsr+%l޴c{6//;; 2 SxӤC*ut ngOALt#LVDEwqXA~{J] v޴ZN&o2[$:u޽ rptquv*hz?YlEӑx*^Q{۷3="=&ȑ;bbCk\.|P%ncc vҶ]9yQ"qr=$Uu}{YlN-*+}xyj r';\v-Xliyيӧʿ3C^R*Dʊrvɔ.]ݿΘo݋1{:]qo%%}8_ǎfuu0a OcSƎ km}wɵ0 5SM "PXd[*Fg+*+Oh67jx1@[#n HJllmyR W/TltPLMLJۖu}YY:+vJsnkc#JohȦv#յu-},-U:%%=0'z5 JKap6sjj{/nlR P,u:OH5kmMK5^Wnc0AY)\cF]aaS$44ZjVa%w;w}tӽdd W@'G28FU|ݺ?|Nؚ+'CRL H$gczӦmQQqRs~uO6jZCWsRݡ?9S]]WUT^8 2޽{3:wnVK$uCJVۺ$s)).[AYH)*.-=u";mldr/OoU` B.h>SFw~䏿ou h׮ZHP^^fVFƖ-KL }yʌƮ];Gu7ϟgk+u6Y#^9j횹sNieeHHǰ#([[K$VVYdĪ*A*uq8p ?cDzXX89y{_<##–.YH&_rܡC{ %$ri4xӦ}}E^} TUitѣݺ%}xmMeen :zz::Y)ӧ䧧o^\,J$+|qA]CGΥj^{jfw&پ%Xށ))͜N2u꧟&&&'H$ק#UV G=T[b.q3g޽joϙ3ᱱ=:uFYz͛ ˆ6}͵Hw=p`_꫟ԩ =z[_g4ȭIon SSSm֬^7&F>㷪033/IV?[Z`4h4Nfݽ[f)XZVU1ΑcƎ{%Sm]ffzzΦ]Dr+OЈ 'LHI3zwOr fDdO4/|~Ǟyw]޽>}저g55m WfCn}3I$|2/HJJqN*庵22 z^_oaaolU6ߤJz+u8SHAm8O[[ʵ愳Pw7lْΝ1cΜ?psW('uXXtG ~Q6oZfҴmӧT΃'&={555-3Oqq֯vU S6cH+h t/{;k^ҩS DFtd04:~xّOSM,-džZ%$ =Ȍ6nNak8}Ouu}߼p{q'uߎwq RzxzzYY]Hdkګ3gcʔN_lޟϪU55:DG;fGF*5p97{zo._d?iΜs]] 11̲gOa=u<|=3U``XX ׬޲YxZMM ?Q6>MRX=0F\n7߽O LJ4`ߘm3v&2C&mؖ&B#̶lZ[K뭭_yuwXLJuS?Refx1o՞ d y&Ld¿n?D?0 uu99K曓'b n_Wxkr)hیƫWS;[QS+8m}?@ϻ&} 6o޻w~ аNhQA F\cg11 kG" $(p+.R{ﭷ?sN"D &ʳϚp2G2gudDfBL;Df)4ۅjLlM p󙟃6B# AZQ^?{'.!!]6g? o^ qxA}SN`0^iӖYY{v9sdIwȎa]$v7čB%^x_t_xyH~=ƚé}?͛v:pT.JHɧ^|qĈxwwG$(n1Q# ;$^^^nޖ9~M"VUuKM;9deUzN/MJܿ3GxE^*ɚ3‚²GJKݫ{:\g0љ[e3<=#ǽCN'ӶϨgv*)qoOoo/oy<bnl4.5g/`˿vtv6^x^}Maje^={&/Xvk.Y<{ʕ=a +⊊e->th zOw_r `(.s~R3^{-:֜;>vÆ1OС=?Cr_7z@k#&ю9}؞G>5 +!! 2"9yɢ͛ڳDf0\0uN!!ɧF|.L$yfSOw.,_|zFh} Żw߿oL Bf.9[3gۿ~}AA~*UdjDsZk׶mKϚ%،'`7'ӿߤIӦKhTRPCό?i鉒g,,ޤ/4Qy544!|~?w}}A+"2c[++O.+S<пJ_XX\n>ށ:eiyIIAAtF#HuER%qoo.=~:v%#6o^ǿ5f̸q:}Ka᝴SRz4,-mmWܼy{ڔg'򪓓BR߸>5SNf]=<~lhXv;N\}X|.1? 0("7> HFƞ[tOsk`0--,X|针//KgFK l'4> ՍgQbYdWJHrHV_̷\7z@C27}o̘wu r[­Hd4 2\PTW՞>-DH$+juzA4ku$Ʊ\"Z!8:(5U557φV&;r$??#c'&6MM6ɤRD,J--o}r+qzAׅ^jKAiPk4FBaYu/wU n41!f.HӹTyO8!ϫ/))-S(ƆRw{gQlrUJ ܶ6&'N8_zKҲKrwR-FhHP܆#*+-,rrҶ_}/dӶyyYX[z\FWz)dB겥3g+Njlm""-Gص)R[ۿ{WN]HdNa667=B5"Ap[JJllmdH>))Zus%21 Vk6FaccgWXX~)D@ta_NzOH5kmMKɴZypO8\$ :3gL}GEŅVs~uO6jz}uuI:]K2#n'RBh)F"ё#EťNZXdg_L c喖|jo/>_}MRR||n>>UU iYزe}"#Ttw_| {H8H&Jzg'7W[b.q3g޽joϙ3ᱱ=:uFYz͛ Gč4{ 4s?88eԩ~ܷF#X[_gXTYY^.{k,=Ç/Y?Nj#5'z]Ww?O53;;(1?#&խ0aBJʘ 44{+n77s%%z<n-FHPH~xڵ %&v 6l&\013Єht:[瞛0ƽ2ޮ]:Hq%&L䧟.ܲPvYy]@ZpMC#Q"HėxC^تӾs}M%遡=߯`DB<p3ײnF{ HTI}_7gʕ;vC$g'H9fպEŁA)}|O*5 ;Ŭ&^tɚ5[ٳ|/ر|o98GGk{S'WKK.*ӖFZmmmmM`0‰D] wի֬oy@k__;;蔔nݗ/5k֯;rkwvNO_rGA;X'GaʋJs{92K~:*=e99wo߾Qڶ={Nzgt&N@ċpDn.VVz}iYQщZ_R8T~Wttpk R]wաCUնmVgf_v]ngϻվ> uRYWu`uz**DTkom]_{wV3zu f=Ф!6OJx"k̘qK]mν&ĻDw?7k`ﵯRmlw)TTVVM$( $ulYhCgw,8FډF{RR>a|r`rm g=zS*%rB!99w߯eY_Odg tswr[UO8`v3VVn"`X-PnZ?|?.g%'_8M@kZ^H˟7ԩS!~.Ύ X[{T~6nۖ>)iػV)E ,*Zbz=t4?ݻ%GG''!-9cEEk"_5R/|2gq{!H镘Awg9x`5Μjhwq3lظWK_5/hHP7ZDvN!-b/w-9'%/HJ$b=$$!?-1w:*a_4 h/ p< @ % MRh#[ J`"3Ư1Y V pY>B+))˭Z#g)byX+GޠZaLww&X*$(eu01}Bk#7'RBkz/+3Q3ћ[ V pYb& 6IPFLJLhD~?/_2z4>L3g r`h޵uj,Z 66:VK\I ODVV6D2)!5+?YQ,xтEyy99:]}}URÃ50 "¼VYX,]~Î[v6WUutYJ8SR̕$[3223wޱc떲Nj Nprᄒ} ).`872_A]_}hxĭW:{NaQYym]Es(>~Xn\.GE7t`i)ȋnn^TM Reꆏ>I55EE>:x>##F[Z5ݫ) '{OI'9RQ)|=cO?թ5o/$(DY99aa>>nÆ zh֍{MѨsUGw=3t;w-^ӦI$LTP1W5eK- qvFyqbļMLLttxdc3fܸEDƇس{˖ *epN7f죏rqo;ļIvڹicroUM~#G>=se>પs.{#EDQ+STpkVjjЖS=r M+3S=sTp2 ^.w9}E9B1EsNm |ʍׯoZx~gtr^b?իGԅR' ?A:Gj3N9tsp/q`k+ Lfg^Z\ZZVV) `^R\RRR*ܸT w;[WT(fIONnּq&MʴU44iV^nbbn~%?/73O̠ @ST\VV*ͽٮ`,_WZH$;wۿw_Z ]- ejݭ[\RR 2={LL?JZVE.G9 \.J$%E޾*+Zb9sfH{z}mmmlm\]`%e,fU I#cڶmc`Hik+TgORbR^ι_Z:``ݺhL4BXZ)t:woݻ&>,e@:G&JUQ=shffIɒ%͞vԙ33׬ٸqœ iiٗLfnng˲u6oNNNHػرS~]=xj]hif>gdHs̝W驩))Ws򮤦=oe?Km\xjII΅s32[KXS&9{N+JϟZJ]ZF4uSmm,,^c-[ϋ05H|=<\] >ًV;~/MX6>KXze6Zic0I -n;okׯ[xkתեNN66ZHBN' Q:D]Zڡ_|>sGۯk#;8CVәłߛ]dO̙BVǍ91 "~ H>ňhwgHJCW(PpP @=C2{e  3(göBU 7AnB'DM6Di2\2eJIkЭʔ)MP˔+5BCi2wEnEJW(PpP @=#7:v1"xP䜠? +B2@}# "DDa˲8-P A^F `!2 ; @N<"RёB3 !TB}A+-%]XT^((2'Av";= YyD"c"-7 a,@Aapى~/%d`&(P~di*0V'MI+:!h<,JK0!b,N-/ d'5! m&0ҋhq3̠ce@}"ι D!ۚBdk' ܈G%!dA" mXw-{ A;7N}g (}oH_j箯747u:Zf SWG۷cǰ2dߏ /7ke[Νpsc=b;ĴTm7_0rd]lھ}7mڪU'Nz˫^|1"" MoǏŵBB#V ٗ۷83- ʏ8=ZR xl>\~~;dE̬ܼ⒝vڼE.ePWTT<`O {U+/]w~C4iRPeg3(.敀hP5F]qVz}AËrCݕ+O.-k0%%}3 8yJg„)S?)6thx<=#--/O*Hlm4}m~#ģERv^`<֊x[)3!?χ 5x6qmMyY9}!pÆ5.xmژ2 VΘ1gF-Y07BCEmѽw >|ȥK>W|i|Ӧ2.8gtiM5jguVvn^Yy5q+~͹p36ffRi۶!!=z5x^ HGCis]~ǎefWT喖-Z=r q/]ްqƌSv}iӆh*t鿮؅C6p;cǁ'Ofg_TZ4hФq} ګWrfWkXl|u>o0dw%e˶l=xp߾ukA(k?wE~gBG-ӧoXX^wʻRXѬ^vYiiZJU\оzvvj08V-PZRKΘ3{l<7wߞ)JTɇO2Ox9 ${֡MH' @{<\"?ժ;=g Wׁ;Gu:nAy;w-?۸⒠fݻ5|BQZ{\ںf EuV-v-:駣LM vnM͟'M~7{gYdw,S^۵kL&9rϞΝθq'jVvN66zkr헹<3+7O]W3dzHaGGBq3 _*SFSuo^h"&3sq'SJ:]nK++<454vw7t_ν/jyen]?Qm>Htwg-\͛mۢy=t6o޳.Z4eڤfƵN*)=[cD_#W:hPQQE{&$\r|bbx=ŒTMFB IDAT+;;?_vvJ;o5=)c_qrVt{v.+#G""/qPJJRRAAMt6l?#nhѰ'Rv }$GOV٫uMҲҪ$'h~@Y&;vĉcGÛiVRDՎ?l 5 {뭩2<{WNBXppFff 9x7@嵂R_sO<  \qu> 2rqTg,6X(WXzuTqV3EL?QYSÞݫ];Rߛ6 6~腟{Jܺu=f }zyYgn~&$$&dDEy Y٬LBL 9sRicco"FzO7nVue_Fp{JUd_ٰnqcNXQBCo=GN'@7{2L'779y„_y-K ;PJUv2DVUBQ!p^-4j榴5Q/X, ֔3&'> e|B65]z낃LMW_[Vi۶*O}G[:__bBsMKJJ e&M{Č1!{eق?xdovvwپ>xM]1|wU}KJUIvֹsǎ?С{EDtd~AA> \Jgg?䔔I=e$̌c}vZwjwF +PV(A-Zk/ܬw^=zL":}:-`RmϦ d9|"5114st:33iiIIٱ&+ `^R\RRRj\C.U:u>?!ǥѽhT*\HL""$44t{R\w%++/Դat_?1/qqKZ%KN-.17h._oUZHvڷᄡ'R\˻[&TQ \`)uhi[.!7/+Ik [N>,DSVZT"ᦧZmeeq{0}wbR/+[mٳ;>n߷/Epo&ۥKTϞtiV(?-ݰ2$F}M^ fb,M-79\b+++Kk﫼\ǎ%%YX(N=999;:ŋ/ Xb_zrJ e8ç\ ac0L]!j4B޶y@s6T&11諮⚺ݘ[4?:iE}w2iYf{豹sяKˊvGm# SUk/uz}QqS"SSssgF|}o^^t_j/;v߷o߾luoW nѤoTǫwhxBܹyӒ%Y))N Kt2DmGmH?7kU.kPLB43P7qtG|fFѣ))YYryDDc?BicmZeVPL>g̙I~~^?޷O,XDXxy:;) |}CCRRIJ vv >{6!!ML^2Z(ͪEɈ1m۶ 1|x,}Lfo״I.O{Yّ114B KK2 Jm*^VPx5ݝHLK$'̓M.r|U+cܼ6^޽gQKOPNxo}}0pm‘:6A97puW*yfCIMMKKؼeǎ];zyN{7T6pm^pwoԨu디G&yzu萓3~|GmH> -[vL>zԩi'9ҪU[tB񁅅үQ&G?v2-IჺB[1n-;J~iinnVVjꀁ=ztԢsWwƨJ> kqSO9r͛(nomii=v:tp+ֲ3X{z4oޱO=ӭސ}0Cx6 K&D錷enVJs6;IJLJ23]GbziBB37-kLدgfzCby$-Si?x]1{FRfɈS_-ZիwC_>)i #5$&؟qV& idn^lonޣW_>s+O \oO\GNdGn>fc}HHPPc~r z3˗ΝDD۰MM=, ޗp}k ?!"UHVsٳj\۴!gYH_k"Um+VNmQQ@@#8:XXdvv,[nb^.rtHNNMȸv&&7K-[_vBRmټb]iSQ!\KP28}7s̝Wݺumk[XPZsڷo oުdMI;a?>dbߤiS ͕g3Q(ýo73̹ܽ{l>5F ]T&&666nݲ6eȎ1}{ӽdRJ#bbV7,Yxmu*7ONOOKةEG@]-<=.\3bD|ܚhacf{׷>"=#F[b_yys*՘zKWOrUJʪ.aS~ ǎ[dؓ'>Z)zXƺJFի%%9ΝȰruuq573>1=z]x3gΞ;GEi42Ŏ>, x{وp)8+ر+W*+ug._053gSRe-Zx{[[K$By牡7dq#./;Hmܹ n>>36ٞtoy$Btw[]Tt%j|Q?Ϟ:JJ$9xQ''+nn^MV_}qqqV۶nڸ|=?ߗݹӝׅ>&J5zYsMW*ӣG&:ƺvlm,-G~iڵq._tŊիll,-۴i*0MHʍGbgki7nء弣G׭kѢU1/Xn;okׯ[xkתեNN66ZHBA*PUw^{k%%j0ggPP>c`.1qX SS`jsǯصKx/]W_7gw7'&MBBS_Hڴyŋc5p96϶l)-uph44n& ڲRɫg6Q:D]Zڡ_|>sGۯk#;yx펨M@g oOްaV.[66Je9.h=6ر_h׮)S:J9%;Nϒ% zz̜M  -,:v4駟&M6U+[I]1 qIT.2k~IpvBjJNR h7')ڵ|lOtqymƍ<ܫkcm71Br-[x6ν9#nM1"Ѱo5W턠5P+5Pާ^FZYN0qRLf:@٩.d2!E%BhDw/|6B,-H(ɾbɒUUǎ|vޫ[_{.3='6 Oo8~ܹlssQ ;g!lDzm8(M6*(,-HdoA]R pKZ/C˖ Z;߸a͚=[n_̀XRl,&J={RR51), j޶me%$>(?A MV[Q JmݪR88<1c!!m#:w[eSwO7 k߰^oiagKaD2ܒsC+_tڒJ%i&M;P)j B)TD- ݧV&DH!ML#R Akaa{JD5hi%AN 2eE#˵9Bd-7!į>f:AaXAIDGh6!2 ;K/2J"!lLpP9!t"ZoLE."o!h<,<0~eBAq]?   }EJ3(*FʔGEj!hoH"e0JO7"F20ⴈ_Ե+2/QBcA豠cAO^h(^t%BX A26(P~dg;P>!D .2޸>x "cf0ΰNOc20NcXc鱠cXc鱠V۫)zZ\rDƊw@(SGYQom2 QNXcz,Xcz,豼 wJ#2GYQhƻؕ b;E#K"Sb`|Pv(5Xd`}{sV.ܶ}ބ_|>o…o=j34p j۶jSک}{ ѣKcx+͛9深M6u{{Pp ?vTPsڵ kSQ;w&$:8sfl)S'ngghD(G33~gkSVv\~=nkqrޕJTzi39JfϚ=kQZ5m#F\x@[..d޼}ea9Ht/]J4pwoV^4vw7t_ν/rs<2Dw6{$eVJ; wҲk;{k͛V=ͷF;V"wq47˵?.)m+vC[&ߞR:tjִN'&IϹPV7fN6¯Kw`ذ^xm}|k'*j7"-II'NoB0gjRK}׮̞`RinޥkDDXX!CxI ֭ݸq5fhҺ~`&nɨd'"{4Xz,XcXz,vK*ڷ_Z2W 1AԥaNBВx>>..r OV׋ZT }ϫ_m _ uqQ(ƿ8nĉ*U7l[S>8|th'j V;nax$͚iYLڽs'@\%dg;w3ڽ_DDNƵ4~-4P\qu> 2rp.55X(WXzuT |D̠0U(nw/+-L$jZ%@8X[Z996p3fLw7W'g!z>BQQ/2ݭ.J$N }W޴q`77ScƼ#-m[5"L}{~t>gFnnJQ5=ˆu88h/;v4,,4E 㿭zegg?䔔I=e K$̌c}vȐF{z}nޚ_}njt#F~:㱮7:_H:t2oo5!(c^ƛ={5lfg/]pĞ=+[ߌu_y͛:̘MppFff 9x7@٘deed<{ `05]uk[ts˟5z+TTus֭?Oۖ֬g&N?˘{Ǐ=||M+] nX ?KW}.K$u*Aegx2*=Xc鱠[B¿f !eL妦rcs!D>BX(`d@M<e \h۶]׮ }󍩩V+ܶW0.coR&sttw/-.--+ɑ( `^R\RRRj:--LL\\y߷Y15 lּyp_/++gғ{ٺuY4iV^nbbn~%?/73A(+&&:Bx gfKMZ11(Ugp7kVMGvvffVVv.jzw֦is22RR?CAUϯݏ mCG=F57O8}Сc""n|갰6:߷gwll*YB‰ԓ',,*+}4 U^ee\_|wÓO.X숀υ9~;qֶs^rr jƄÞ|-ǀÞ׷UȨO<1m¹}egck{/FderZݺJ'$4wJ%+'O:ciz{\:?{V]V/M6rt6Z kǏmС:V[^.ݻ~k7؎VJCJgݘ[/!rruU.-16Uƃ<ɨd'"ǂK=KcXcfKffDNP a*%5!kdkkcmk UVj*Y|;ß1νvW"ٹkNH=Vp-/rnHSE(spF &^ㅱcnۗ-[zq-4xa-KUjVV~gYY 3:˪MR''W7gg\x1;Eav9 W/_νT55uspqK˷eꊊ a +++Kۺ|5FrZJGjmStZe͛,NOOIqr <|(%%)snFr]S^2ۉN9}f66/6.+ۻo5krr<=--)Q!Go^J<|:]#ZLurNjذuBԹU-*%1[[YjNΎNNgϪ_luzgu_UIQQU\ cz,=j2qjh7ݩsʅEEB)Fs[j̙9S"strptuɂKKV_R3 ڿLLjjZZz-;vϛ7uoֶY3AGi۶MXToAnrXYHKL8x(?8W׿O9z`C1/4E[P3JNmYB1_*55vj]WwwPB1DR\\RZTX wFZNI9z`RXW99 aa1Hɉ_W_[0/c)SiA0p-,۲Yc iocdrӪ3A%fDfLIlrHRbpKXXvٳUML^2cF$kW\]n~[R\ZRR`mmen9=W5dTp z,z,@= z,]^VRR^єUPP$ߪUc ގ9;J~iinnVVjꀁ=ztԢsWwJAt&&!!AA~aϏ*(r/_:wLӹ{x{u0aT.+OLدgfzCby$-Si?x]1{F-f[Razxzy4ݶmʊBu:aN? Ea:++J~L3š7G`m4J\\IJLJ23? Th֡þҒEAA..Jz}^4ewky鲲֬]l>m'пaۭӕ\tBaV{q2Z`߱3>~B{֭ۄ7ڏȌxH/E&}Ǐ8rرǛ7򏭵[L3lcܘɅ(ɇڤcaus{خ&nW&ÓQ/=ǂK=P7< JKe?_uرS,,=~`r^{x'VϷ=GG emY\VVɩ׮?PhWV5 *Ur;e3gLסcn*VnrXNNvvb/Ok7aC[[jyJY]-uFt|;b]:b1!m+222v5T$8;{xX>|xffv=z8:VUm4n\rt|lի<`H=䧟1"-ýgϮ1mjٲ%)Λ3gŋ--̢z*+7UhU*kW[ve^tႱHzy9:5z#$;[a_'.[|Y3_e{{K蘰X o3gN4iXpfMEDD>.NN*ɕյ[# ty+.Ϝ|YV*۴IJyڀ!66>~+2k:VVfZm+రaïY`f?>rԅ f̘7okk$ ӣ_~Xlanc0^tn{vՔL3|[AitzB;WQ.4Fxyz1kVђ3X f,3X flGɥ D&sqQh  D#a1@SXAtp%4gX0cf,3( A^'=#VpFUw?|@} kͭjG~>}%7ʪv-[n;xp].?[Ȑ6A!!%kz\ȦPSpW_:;8CcmmD"ƆѣO>WXVpEQT{<꥗y\]Zb& :]Eѣ M;ukv?ag_ ͚Ͽٰ~G/(tw JL|7zgHRR~2甔-w:TX({{Ko1dH\͎܊Zјy{?\dRӫ%"/,ZqSUUvԱcjŀG`b)<:qeQ=wbept:gdž+,tNy$,?}\ll]$%/-SUgf>tԩ`~bbV殌g<74T&rh]eNSOhjuFRa\͇B'C/PUK?|?{zZZRTamļj ˗5{o׮˫19:kwmϝ0>//"b~ wȋVeRΘ9g矿jfJVF+9믯s~/=ɧlmo7og+{v;?kiyBr5\A k +HːWT\V~ԑ#]:ǷV-7sBc !AYV:9۵ט4V.9jkzw~Ga`l[ IDATe:&-^~Îק.3s?i\I. |rয়~Փ &*=!MG59vT\jIy5zЩSUU|/kk'OoX!񭷦Mk/,Llף{ N_1cΜ]C|Y,X8qO?p…fs8 0:~LAIɊK9kv"Av#pI,C:s#y.>wCw}uF3`@qqޡ!IIK%\hCQuujF#$tbX,"sXxs?o_?_s[UR۶65/[BBbR+_ܹªC/XzIʮ]Zm\܋/ W*HdiЗ^n/dg\rձcMs:мhi [bݙ{zdnJ_PV{uꤤIg۳[XX۶ۗ{Ν۶9_VU:9׭[׮>>mFG 5$'͝bEI#˖}'|mUյo9b厝99[Ӗ,曯"/*eҔ9uqK \, HNc@Jմ[$t'OmI[l-YYyee55RkppC  k W8q7yy  J5?inݟ|䉍w9bmٹu>}|G`;[)WaHS6t{84^$1cٲm]BJ\[_| v+F'/^isy=X~͚KJJssx?`v#sK,]2ޙ3'OJZmttXXPѣ/H]55c =u:d„S-0P*}W0칋o9aÞy>00.yo"/,ZqM:zXsv ݷwWƶm/)393((:|Iim˖.^VTeeO=ݷ_8{ŋ&NV@J&31j޹ĉM-+_޽o5G,-V<5223S(JuоGiFfeu=Ʀ]DL:|L `Zn^aQyEJҔ9s:IS۵ jjjnE`w#$7蘌۷mTVvbauS X$;wݻoO]6k3lf6rpLv^;*{7C-_qΌm[#VMвB!]N$={Djsm L$rwswml\X|\nnDsmDҸGw7euD"=fÍjcb#"ڵS:u0. :>]pF()9}87WfcfN[ T{0+;Ѡ ww{ΏEFhRM;w=iz_󶵵MٺuȨi22.-8sTV_vWP*ݷ]k4Bjg**'8_$w >{ꔔ))55S;hoiEś6ˤRRʃtڣǠA2YEyqљE"Xܸk4=}vԹs^?߭qIIv +WMTd۳{(ZgӔoOlmcazE'С*Y8:Hjf#=СsScn>W@aۍBfHYV>y'qr駟xTHj[~۶;ϟ?}xWed佺:wW22 n[?9cG!|괴~>}ƌ/&yF!W+*I?gիZN8}qccL*MH2eǎ%)y'O8`pܻg ؾ}PPٛn^?v NY%ͰƜ])*:N' %8;{K5ӧ _^dccdpq'л} 5oݟ^A_PQ9iҤ U_$lo wWرѐVy챤jTjnN8㎯:uڴ:bc{kF.H IK[:eF=Z63vlط 쳏n㍍MX ;Wx܇ed̔k _>^E.ĉuuBEjUuue\޸z]\&BaͭVJʃ޿SG!AP,3H=ڵ Y*;;//޾}mJPH2ʌnVBm#}FmDF yw޵esR!A9$G*y{.eFF.W8{W_z驧j!ak•˗D{yZXC:} I:S3g~YΜrEn4:rN=ܳg+A¿uPPë*aBkťsW ޷ەD@__?d;3vt|˳qhWf,ڭkߗY׌.Nb_^.?n͸qocR˵#Hdox+ ?MoYSs*h5brFpС/}!{_|~}{l'=NJlm#^}u膏422""8EVowu&$(V@ 'vze؋/>dΓ'/\h9-cロۉV{cn\9z󺼺~^Jt?[I$&& SHT]]2VE\LRiG`OOGGtԨ#njJzDp?u/9200:\vpVtquv0yy9:d#_zfKe ŸO>1D^uQ$ZL.W(˪*/^cH:FhZ3S魓ʍ55m oܛGwaJرݻz+6dP3Ç22"“: PYOdgV;Ngckot-/+//0!J$uHڑsosz߿V'22>zLp tN&;yxξ}=ztޮ]eZ}(WTUP\kߛMTI[n_.XXS۱cdTpp`\~oQ|=D"BTيG*+ h+\GS>KhMo\nnnchleieԩ'8 ۮJXr%Yo铷onanH\]+***+ ߯^s={F;&GP#WWGFFFu萾=mԨTrΝ9njZWѺuDfM^E|W۶>̯^rBV5jkkkkkt TaҜ{iVN}=l+HMM]\~>z80~۷o|,DH\]{ژظN2v.O{ccV&S(noGF,mfUVMR2ВH 999YYrFSWWU%z'Ν+,R(tWWWOϿ?V۶|^^qw]]YyNZmYYJʜ9DU#GM䵵~~WZ]][+mڼ=}#e]T\\XTW[OH𸲏N!]D֮=8/ sovھCRXXhP;M&++/)꺺[fddx-ss!CROOho^WU,_envͺ5i[ˆduޣcGVBDce]-፼$vO~OWQbHMSh7uwʫT+*kjjjj,so{tΐfXO +-jcZX68+`MV=;/?'g~!I1!aaLbXUU?c#un\e_!;88Hٳgj4FF~~קik/S(mtD`Zm]]uF,-j! u~o/Av#|S_gb),&$M{Z}`wK"I۲sGv ##wI7ӦTjm}޽2YmmLP3Tb[ӹ'r23˓JcbZzzj4 K j/i$77…=tN~ula% {`P8xyE'w i \x3kJ!zFEvK4InjoOuDbcߺSǧ>>xYyw[bŢ?MW;fL׮.ϵǛe^RZ@_.wB{ƽirgF/_tW;3mƧYoLfl, l"QYYyEiIcru\]}|ڵۿ?3sH7'W^G[.(X샱o/mLn> AA!!^^FS3vs~~NN֖cb8x0Hv#BThXD;6PQQTw;w vtpvR oW/TlqP.::2*!1}8u`۶ _onkf&i4J-wڻW,Mٶmb{sgO /P; fKcHM6TM~xESF{"B!3Vnmߖ._Wjjn kV\S)1:"/ Z}uEw\a"#-mWƮ]rCFFov}zAA hctWU-.ް/^yq3eW_ xV05sΜ))Qoz 22fN:uΒPu9c溺=wrptso}#KUUU%WGV&ۿVUCX7τ^5+I,GM+( I"ɓ=z662n:!֎|ŗ ǟۉLLmۻUr!9`#99Yۺoඡ {_[bb¦LIK[\*-*q,_  _n)? -- h4xH;;KKSSW'$iR}8qظ]ߗР˖d*՚رSTTMHW.!Ɂ 8u?˟~2uܵk^V⢒.^:u}:]7V[}l~ۻȯ⅓'22v((|}=$k \U`WpܨN{ݿ-9 wNNw_=txҤɓ:!!)[Zt{ŢbLWΪնOh.*z={֬cܹձӅknޜPhWȝ onD"T{wſgϜ1yrl\ݺtZɱc99ىCޞJo>xoPPTԝ%9dBҰŋV +TFFP-9ٿFchx+K3Szȡ>jٲ%)Λ3gŋ--̢z*+쿾'VfZm+రaïOA }%˗,9se˪+*._ >QhLLmllT[6/^ePZ%Tus W;[C)Ww7ZrWn7΢G?vŊe O>w:8XZ* 1 yg8:^@6,mu˗oʚ6Mtr?!K9s֭7%:w֯_fIJF/SO7556<=^tAm<eiahڶXpf߾ŋCCƟYW_y.4ܳϟf43glmouYYUUcG.|}? uqurR|}]LLZ$27z3pv4VXY?"K?5kԨ U(?_s8 Wvv{\l3Ν?JH)Ɍ;vwML||:$-Yn4Eh|<]]_6w33urpoxF_W|jЍVZh={Wz="TJ,Gs=a{h0غMhhv-Y[99>zsP8z,%)SNII۲{Crwxx\\/C::J$@sA2h^ܯ.Vn7Nsqqvq*庺;I$Ҳqۻv钔T|LUySۂY2}v7hR1=+*.+?uȑ.wLR0zZ=G1_}\?'|y1O>eks8}yӧ?^ٳܹ_1oܸXKK){' /cLC2u:oo]zKj~3{گZmQѨ7~w&nʆ[v1c7ر~}9s=W^j\Ǐ)()Yb?uҮ]TQHPh^|_FF"`‰ArsM睈pssCo]FDXX4dȜ8.|}R@s#f;ͻt^TSo Хs\whHRRҴtr #pj V^kVKCk YZFF2K$+\uFTǿ=*(Bbݙ{zdnJ_PV{uꤤIg+Ǝm`zKFFt7ߜa<`g8/,ZqM:zXsv ݷwWƶm/)393((:ZǏoM>R*9{bɒK;s&7) s(**$$ "*ѩ}P#4}{5z#<ʪaqio$.+mln=! xtDܳ犋KJ9'FD"w7w7oظܹ܈pggZDڨ?MY]-EEgϸpצ\. ]XtVkddcso=wg.Իg6wv,̚xZkǫכ8N\41qp_Wa"IbPcFHk+ sQdպ)]\],mm^tЗJ%{_|~}{l'$7欷{LV36^x!!..Ư 67kjZ/6Ə?{gAyuUd2٭y%\n$Vݕwǿ=Zɧ#F<]@@LͶ>D:V+ EyYUŋwt]HH":FhZ3SI.7rdg sSDbmmgZQVQQYyYSSW'\Rg5o^XXXtNmlT::ު;! xi4!megnk6̬i{4G$(J LMfZhҲ3ǏdoظkWv#+WХkrr]ic%ϴk5LaffaW|D@pa_N4{u۷duuBM+ZpZMI"i۽{^mӧNݱ걮>3gl\Wһgn^^WW'hϝ;sDǿ7=&RpD'O^8odtXۘ[.nJ9\nl\[;_6o'1116}{wwoVʅ4კGdܷo־ۆ&}m*yy;9;:TFF+V]lI{ɤR^>]3YysN_ppTTNWT֮]ysZB6^mmɽΜ믇O4y_'$$%uV[+nܘwXTZZ\,`,>رxcK*հϽб[jE M5Q_WG̞3W'VUm4n\rt|lի<`^{ 4HP3BDۜeKׯ6|ZBB gA:nݟ}׭ݼiÇsr[~ǎ{ML$S| $a_W|jЍVZh={Wz=\tt`sY eӷgeMT:9Х˜9UT4P>+V.[0sROO/8sQ+GE̙g8;Mi+V,\YSQakѥϚ5jO* I|||}]\T*_g{y{sa"\Eo=LmZmnkƍ5zL>11Am:$>8W8=FA^+G_=wSy&&juiO @CR4TWVGJʬY^^6NeK\tiڵicatS3W R[VԨ:B1~jڵ*Uy..O=ؘ={բzHPW1351^z'6|F811C'S3U1b43eL[wA1R^^k=4!͓ ZEi)]ƘƸ*A9UAPU)+1 ʽhHwDPU]'sМ'tzVrYhs w"=)hzRn&[OtI^yi=ãfIO{^w ShG!4)hz$(M9+zR=CEsa=qŝ ͿrAmR p 𠐠 7U\a쿡smиh:Z\'Skw 7p%g4 _ep^~p7HPG2 HP&UWggݳgwV㹹.UTTWkƦvv..>>!aa!^^VR"5N^-N?'_Bq~^._޺>d֬9o^z)$a4ϻߛ@M+WlX{WNsŗ.UUDffAA11ten.q @Ko“g vn_4%%m[~D&0044>>2B,(/+|(?ÇsOxzZZQ=aV[Xr]Ij7YsPuBkx{ںU~믖.x31c=z$vpv06|87ѓ'q Z.JKf-_8e[zig'w rpn؁qL,UUef^ys{)]1WTۿzuږ%*&aӕرpeNɧo-Y"v;vd@BMͩSi[O#٭{PpДFFbCHpX빢MW;+]T̙3a?W3f,Yu둣EUUZ-%DI/hN^z6Ĥm'z>> 錮%_"Q*;$vqܹW٭D[uk6l/M^RNg؟^Dʷw7cm۶wʕsʕaeѱS^}v~m[{;ccF\$(߸󧧍*+++jZNaz*Hخ]~O>_%]n݉ 3hWc"""9}ʕ~n 'OLL4¢gjDakTzxx?2on A*ԩsg׬ڸn];vzsV‹G,V(:w?;=Z:xhy 9'4F T$(1յUko/SSU{&PТ4Hc+MMD%Ŷ+?r+ct.4MQЩ:D)I[HЦro&`JʥKb3$7'))in>ҡ zϯnLO-̛&{t%??ǒW^|Y`{dݩL]ݎx}a+X)APSŞ=o~R_@_ŋR֖uڒ҅fޙHSX][[EE^ F '?xhmWWos]]{v7lwҟ}G||ښ}{[vcH$wtoڵHUe2yLwΆ/miPX w>u;o7?;448xcxllr2L& ے_{ZZj%Of{Əb].vtvׯOMUVFxSSrGGS"Qۙe+D#|Ξpǿ;*^84lZ8?Z[9iA`ΰ@ _N2 TeU؞Ӡ 0 a lF^Rjaf粊XMTE2anMՅɵ,oυɍ)j0㿄*# Xl~6e=u"lw6Y)r?o }֟YEY]Ma&_|e" p;JIENDB`gsequencer-3.1.3/docs/images/ags_spectrometer.png0000644000175000017500000015373713607210263017071 00000000000000PNG  IHDRpX}zTXtRaw profile type exifxuSq $!A9fAp8A$p_1z<[1# -ZdZEHmXJߎQmIoDDX&]qڏe&RSr(qyMlKZNz!fO֫xSv85K2a(Y֬q"XA=jْ=@ܭcSzz'.ۃ=!  +ړUʊ$c(]Y\{BjM`U)> e:dYrG)cms3".4o4d^ߛ<;W{S|wV|~W{Ue{7nDiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later QZ@* iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxx\a͌z,Kr760t  BM6K&{]6d7ԻdMfƽ*wY4Ws,"Ƕdkl/xgspߟճǠAK(7|.9e9/׾VW ?]dU+,Y`lݻ[a.'7|e^yMMp$ } ru]yUZZvv^ʪm[wؽw@?b[ƢE^s٥W]ؘ~a>|36/OC [6(_=s-~u~%GMNw~ㇿe}ΜGjj/*^p^|iW^~vS\rɕWN\aCY/3V{> 1ۀrse˖/[ǎ| oXsǾ}ѷoyHqQ~+{CMM/WOprͱa̘cǏF32rfz˦\:-νv޵ࡺee+V3zǎ5fƍ{9RulQc{ͦ?P^^Vַ_݋t4oqÆ17u׊{۲e?wCCcclQ¡p8r,j՚599͇]s:3>73k*++W,_N#Z ܭOCO-3GtYzժEƏ~w~m쭬zꩧzwvm߾ekNvjjR%5tG22.RT|إosXuSSOaPZnʕUUG>>v-ywy'cÅyyE^]nuS+ۑ^\TT~ƟyN7E"L 9z{KJzt 7yEcǞ(w'~GvںmӦܜpxc#6F^?RQ_<e;JK7lhl9zgn{n/-[p3ElD2+?|5?[ӿ%xC޽rǍ/sO?uȾ}۷3z9s`M͓~JKᦦ!;n֙YE>Uկ6r岥 TU>o_~z:cFss.>Y7׭pq:6m„[>~WO4p1ߓ^?g,\Xz5<\P_?9+W]t ݵk=tnF89~h$C?~5lXrd|w.d_}kC_|[aSt_?lٺusi=zt ee.9ّH= ڶyGَS/Lo2^SN}Vg[; (77Gii˗/_`3F163q^nfFssIGxիL;שׂ o۹7UV=?M8p@qqq}oEE]]Rҋ/.Xx۶K~„?a^c[z7\{]^^^ݷ̌P*kE(T_;nywG?Ǎ5jK&^r%-Ǿ袑#cw[?Gth-\}W56&'gg;Wo?_^<|U7Uu~o3梋nyݻw:\[䓳g=d]]e|LCej}>vT^99w5s7F7o۶iSJJjjJL80--G͛=G?>olVXPE֭۳'#cp &MΞrEE} ̦ҝU;C_1e{0y=G*ݻwѣ{CQG7嗫ع+)űFSRx=;{֨Q=z|{>ՅÑH1[L/|kŸq8 "3ۣ߰kw(Tصo#ì?6񓟺o]f„qFl}n]#{ѳ{.'jiiuu_g_JNZгG{ˣ̞SG葜➿Æ]<|~_{񅧟9ֵ ##3٫oo]=nܨWO{{|ؿ23>go(ԵWع%'nn{ϙ=s81Tߋ?8c#7NpIQ®EW췯9Eff}}C#o(X%VK~a=ҳGQqaޫ[Gml}wu'O˻ Z~^t%̽؀vy9pEmmjjJjJ3 bxNeLFgO#mPhWZ=Z_ B͙k֮YꢱcO|௮!5u˖͛W㎙Mz7.5599 GLOky_z^ƺa1jTvVAnv}zd꾏|;Uq+VZhᢅ g͙c-O/7j9 󬯟4yi^[<{wXWWQe+Okl!ݳGuuRRzʷoϻhH捛-gLtbJK_\T[Է.+Wjډ^w-͉Fnj0k׮]GS:yjy'wv- oƕٳgؾɵu55Ucc-Y\=y37O^O4Zl&=6b[ע:''+;++~W22RS.]{r@Ϟw݋ dd|w1cƝwΜ9cƺu6ns/<|'??ҽ?[liWO2u%=tlG9\qHľHlwsgL|Ʉm`TNNBGVVU9ǒqHC/.z^G*+ rrs瓟g>Y|Ŋpر.K&ퟱ15_޽Cn~yO^~‚yyE_{wx?75}agX~0pŊ&%}_H|ݛJ̼Q: %8ڰg8˖//)OIVػEcǏ6lcb]vWyzgE/pE =^FbCIIc>h>>Çݳuۛsg ֯߶mخϵ݊n}CǪT=6^r3h`HJJVVZسWIɰ]dpXpd޼%-YkpU@Wl^9^aC{nO|]b{妦Xl+sǎ2dg@zJ<󩋽CCqCիK7?ҋ_/<9߽l;v?PUU^^Vnm_5 <|ȑEݺꙒ +fede䔕@$Ocb+t#K/3vh47_x#8<{ߎ즦CF;8;Ƚ]VWАzџG߯O'N|dgfdd,\fƍ5N۷)-vCD©i)ɩ)inRRKϘ3gܗ_;|xHdŋ׬7{^s)=Հ2(/]q=W/Z4k]EzzAAX=5kVxkd%23rrz-+oAǎ[vƭ[_p={m۰a#]aþ#GF'/OGohh(+۽|ߒ%˗\1֭Zti.u]-G9h`w/*koǪ֮}}/^dҥׯYTU|]:kfljzs!Դ[ 9kb ]b=B~dg1]2G=fʥ(۶wϼ-^}?~쾿Dr ~ހr[zJpTC n2Ǐ*,q[~-^~i7(-]Xb^;r={tNI~{O/n ҾӞgVi)%%_<<"l꫋Ν[lpE{{،o (i9i]zZkVΟ;vL>u嗯[W[{eÆրrRR݊/_amsΝ %%yypqqIɐ!]NˣF]tрѤ̂ KK-Z~klIӮx%@gP-$76fg_}˟qˤI/n; 's7l=_7jkڛ:Ypڵ[HOolbp/$D8'ѣ/'KAQΝxg78~d9xpcQB (74656F>:kTV>ܣGQQAvر']yM756Zx 1bV ,^ (&HY @1 @1 @1 @1 @1 @1 d xg…Vmӏ?o_ʿѣ%j IDATɩ'>v={+~mC}ձʪh{okA~Ç7665ee}=/훕j'O<"3?o~?oj:vhe~wǢѴ @b2;x79aWCIH{DC{?μ=--7k%oo#{釿~_jCCQYY_XS375Gw{ϭW_ۿf}e^x˦|wG^%DMjhjJIIK;^ܵ >eE%}K%?;+#r9Rƀ2Hűꤤs_z/}E|㜜o~_?heuMRҿַ{.%}c-77FeC-,>W\219k^ܜ̌PhȐa&M.߻oΝEyy;v>\Q֘reUMm}}ׂƔeN[SSss$Ry֍#~?#·ZiVZiVZiVZiVZieh@{Ig%γV+J+J+J+J+Ҫpa3|-J+J+J+J+J+v 7<=p[mHgXVZiVZiVZiVZiVZiQc%܀rGqf{kJ+J+J+J+J+ `@8ZhVZiVZiVZiVZiV% :ZJ+J+J+J+J ̀q>J+J+J+J+J+ (@%܀?nYJ+J+J+J+J+\ (C J+J+J+J+ʀ2]dZ`H N(-_t82n2]{[r=/9[y_iVZiVZiVZiVZiyZp1z00#P~ pkNwm2Sr>J+J+J+J+J+z(`eˬ@8N+>|zΰV+J+J+J+J+ҪpaKګ&9jVZiVZiVZiVZiVZ;q>J+J+J+J+J+ (@ۅ%K (?8- tZiVZiVZiVZiVZiVu= |hVZiVZiVZiVZiVZPKsܲ@YVZiVZiVZiVZiVZiQcP>·ZiVZiVZiVZiVZiehЃD86<gC|$ɀYD;Aک][8}Jǵ'oҭ۠ACEII]˗/ݰ;7ѻQ$l۶vͶmG&%;bII7Z}{UU67gg9?wÇC?#[y_iVZiVZiVZiVZiuz6`eW8N(~A7@Y{r [t?wPRzzAׂ{=r} Cq*<9ck9J+J+J+J+JUG]–pWǙMrmVw44ԶDZBII;:GoG_J+J+J+J+JVNl0|-vؠp(NݱUթ<|VZiVZiVZiVZiVʀ2gCXA!--##-qrrl㦦ږHF (?8- tmmտvvnnfFr$vK4Bnz͋efw/*J<߱,qn3vܾ}O|dJ+J+J+J+*Q[uX.l}G1r´-o]$ǎګW~ CѤݻ7mܽ;))1rt+-ݵ&ܣǩ<猭ّJ+J+J+J+:[PlHN8- t'=rdkc>ަU56YS^~s>GuuibܪsJ+J+J+J+JUzlA.B+J+J+J+J+2 mH`} ~KE  ۽ t^bo tVWZiVZiVZiVZiVZuV\(l  $iک]LfkJ+J+J+J+J+ G2+Nӊ(_3J+J+J+J+J+\n@8IߵZiVZiVZiVZiVZiVNl0|-J+J+J+J+J+va pqKgVZiVZiVZiVZiVZiUG]f@8ZhVZiVZiVZiVZiVn@yz,yjVZiVZiVZiVZiVZuX.lVZiVZiVZiVZiVZie@.2-0$'J@@/:x{[鮽P-9Zߞ蜭J+J+J+J+< P@{=Hӊ(?8ݵS6~)9jVZiVZiVZiVZiVZ=2eV hP>mHgXVZiVZiVZiVZiVZiQc%܀rGqf{kJ+J+J+J+J+ `@8ZhVZiVZiVZiVZiV% :ZJ+J+J+J+J ̀q>J+J+J+J+J+ (@%܀?nYJ+J+J+J+J+\ (C J+J+J+J+ʀ2]dZ`H N(-_t82n2]{[r=/9[y_iVZiVZiVZiVZiyZp1z00#P~ pkNwm2Sr>J+J+J+J+J+z(`eˬ@8N+>|zΰV+J+J+J+J+ҪpaKګ&9jVZiVZiVZiVZiVZ;q>J+J+J+J+J+ (@ۅ%K (?8- tZiVZiVZiVZiVZiVu= |hVZiVZiVZiVZiVZPKsܲ@YVZiVZiVZiVZiVZiQcP>·ZiVZiVZiVZiVZiehȴ@"P+[*?ǿpdmeB'k}{^sJ+J+J+J+Ҫ7B9ec ``F N+>@tN e3ۧ|\VZiVZiVZiVZiVZiP>YpV|@"aVZiVZiVZiVZiVZiUG]–pWǙMrJ+J+J+J+J+w2g|hVZiVZiVZiVZiVZP KP~6p[_Mvp;(wqZhVZiVZiVZiVZiV"CpBoÑw! ޒXyJ+J+J+J+Jހ ЃD8];50?pklqVZiVZiVZiVZiVZiC(^f‰vZstZiVZiVZiVZiVZiVu= [ (w^g7V+J+J+J+J+ VZiVZiVZiVZiVZie@.,^n@?nIJ+J+J+J+J+\ (C J+J+J+J+ʀ2] (O:ZJ+J+J+J+J ̀q>J+J+J+J+J+ (@E_)XR9E#vo/C<ݵ%'8XVZiVZiVZiVZiVսh/3pZvj`~t/ӟ>%ZJ+J+J+J+JQ  kJ+J+J+J+J+:z,P:lowVZiVZiVZiVZiVZi8 (C J+J+J+J+ʀ2]X$܀sܒ@YVZiVZiVZiVZiVZiQcP>·ZiVZiVZiVZiVZiehP8- tZiVZiVZiVZiVZiVu= |hVZiVZiVZiVZiVZP a IDATL $ ſR>"sG_xk/{KNpbַ:g++J+J+J+J+:O{.^6Bf?{w^}xnwY7-ޗ؎ݖЍ@ӷ v2/&00e-o}Ͱ풒(]4i;NxX%־cȒ+#s;w.{Ox`ˆo/:%kqYJ+J+J+J+J Ry$˵ '(z3/J+J+J+J+J+ZcXrnj]ca&YjVZiVZiVZiVZiVZv2|hVZiVZiVZiVZiVZ X*97Aʯ1qJ+J+J+J+J+ZcXLPɇZiVZiVZiVZiVZi x97Aʯ9qJ+J+J+J+J+ZcXLPɇZiVZiVZiVZiVZi x{AW Ÿ_tx$0ӭ_8e뭍L/leJ+J+J+J+jz rʙ@\جp]| ߦ_uJZiVZiVZiVZiVZiV\GH kNP^f^_d#,VZiVZiVZiVZiVZiZպV®MvJ+J+J+J+J+rd 7B+J+J+J+J+2A/&Trn򣁕_oc`,VZiVZiVZiVZiVZiZ|-J+J+J+J+J+`rn}_os`,VZiVZiVZiVZiVZiZ|-J+J+J+J+J+`} p6X`<Hf y`8ﲍ]d-.;Wh~K]ܩK"G,/|SΝKq٪{>ZQKӶk{w$r/ $3zpoϞ=|\V+J+J+J+J+jG Ҋoz6βF 7UoJ&;&?orj~~EŖ-%љԞ5rmOLTWԄ?77o7WJ+J+J+J+Jjޏ`}˹ ʫu]d.;hAaaa^X ##b[y55{}رWꕯkwaի[ޚ\PPSc޽ IɱhQ񦚝>vѻE]]gϖo0?wuh89mK6o7WJ+J+J+J+JeC"6J9qTrhS:;386VP;rz_|gۧy?ӖmzneJ+J+J+J+j- ߏʹ+(>J+J+J+J+J+LPŋȅ Rp,7;#n2.^omfz̟W6f+VZiVZiVZiVZiVoTfl6®SJ+J+J+J+J+z(:,G\۬pʯ7"aYJ+J+J+J+Jz?-&(ֵ:vmVZiVZiVZiVZiVZik'LPɇZiVZiVZiVZiVZi x1 s zgYJ+J+J+J+Jz?|hVZiVZiVZiVZiVZ s zgYJ+J+J+J+Jz?|hVZiVZiVZiVZiVZ 7/ ~X Io wEG3ݚe]v8b?lV+J+J+J+J+6N(` D ȅ '(/0e wm]d-.VZiVZiVZiVZiVZiPuX*bY_oE6²ZiVZiVZiVZiVZiV~,[MP^ku,$kwYJ+J+J+J+J+N`9|-J+J+J+J+J+`bK%&(?X66βZiVZiVZiVZiVZiV~, 7B+J+J+J+J+2A/&(X66βZiVZiVZiVZiVZiV~, 7B+J+J+J+J+2A/~o`_ 6(J@@f5zq2^ؘWZiVZiVZiVZiVZmVQR9>? NP~_`8 NZ\V+J+J+J+J+ꡀ(T rm +leJ+J+J+J+J+VXַZXصIZiVZiVZiVZiVZiV r0A&ZhVZiVZiVZiVZiV&($JMP~4m leJ+J+J+J+J+VX7oVZiVZiVZiVZiVZie2,^MP/mleJ+J+J+J+J+VX7oVZiVZiVZiVZiVZie2,^@.lPc' tk!wzk4Ӌe"1[ٯJ+J+J+J+8xr&}0p 6+|'p<0e÷vVZiVZiVZiVZiVZiCQ`<fW~jVZiVZiVZiVZiVZo97AyձkeJ+J+J+J+J+\;`M>J+J+J+J+J+LPŋI,h`8jVZiVZiVZiVZiVZo&(C J+J+J+J+eX|_`8jVZiVZiVZiVZiVZo&(C J+J+J+J+eX胁A xxC8%5X*Y{lc`a)Y*).~y.=wҥH|ԩsӖE**JJ'&zƓDr64 ߸ۛH\߿wG+*::=yRrmo~=MH'._Hr+VZiVZiVZiVZiVkգQ`irm7W~gE#՛7%}}SNN_z5?b˖J ޜm 9co*%mH/nDuuML۰WZiVZiVZiVZiVZV~,[MP^ku,$kw9D FGGF2o,(f9;8mi 9K-˯ٳǎU|ѣח% ozӝ ߆eleJ+J+J+J+jͶrd 7v鉿蝦&CCDeeSS}}"z6OLvu>'~dʉO?ɋGFjjmlEoK7ȕV+J+J+J+J+j+X1 xAAQQAA,D"}ɑOEmݷDʕ::FFg''VZMP~4m leg wwtG[W$-.ڼdb"G#yEomڴ{Ͼ6={lW3X,H %mH{zچleJ+J+J+J+jZcXLPɇKFG\9{ʕx)]XxjAAe֭'رwo}CEezq"Q[k޽yUUv:|wȑmE7Lrѣ_/:{?ymH/nùsmCɜheJ+J+J+J+j2Aȵ /p߾=~VZiVZiVZiVZiZl%sWP^7}hVZiVZiVZiVZiVZ 7/ ~X Io wEG3ݚe]v8b?lV+J+J+J+J+6N(` D ȅ '(/0e wm]d-.VZiVZiVZiVZiVZiPuX*bY_oE6²ZiVZiVZiVZiVZiV~,[MP^ku,$kwYJ+J+J+J+J+N`9|-J+J+J+J+J+`bK%&(?X66βZiVZiVZiVZiVZiV~, 7B+J+J+J+J+2A/&(X66βZiVZiVZiVZiVZiV~, 7B+J+J+J+J+2A/~o`_ 6(J@@f5zq2^ؘWZiVZiVZiVZiVZmVQR9>? NP~_`8 NZ\V+J+J+J+J+ꡀ(T rm +leJ+J+J+J+J+VXַZXصIZiVZiVZiVZiVZiV r0A&ZhVZiVZiVZiVZiV&($JMP~4m leJ+J+J+J+J+VX7oVZiVZiVZiVZiVZie2,^MP/mleJ+J+J+J+J+VX7oVZiVZiVZiVZiVZie2,^@.lPc' tk!wzk4Ӌe"1[ٯJ+J+J+J+8xr&}0p 6+|'p<0e÷vVZiVZiVZiVZiVZiCQ`<fW~jVZiVZiVZiVZiVZo97AyձkeJ+J+J+J+J+\;`M>J+J+J+J+J+LPŋI,h`8jVZiVZiVZiVZiVZo&(C J+J+J+J+eX|_`8jVZiVZiVZiVZiVZo&(C J+J+J+J+eX}\ؠ+Oz/:</CiyE`c_iVZiVZiVZiVZiqZ=F9KL `@.lV8A}.{Ox`ˆo/:%kqYJ+J+J+J+J Ry$˵ '(z3/J+J+J+J+J+ZcXrnj]ca&YjVZiVZiVZiVZiVZv2|hVZiVZiVZiVZiVZ X*97A_YV+J+J+J+J+jޏ`}˹ g+ފYV+J+J+J+J+jޏ`}I,GU[[߲H_{]&&nhn v]v̙gJ޸1uUW?9x0K#|o_^b‚MwPyc7.]ZuMLݸqdr`c|ڵOO~ֶ2^Q{˦aSΟhm 56y|Uc7sE^s?Ksښ]WQyѩx>4863b~XQ+yO&''GG}cisޟiX##oߘJ!R kX[3Kud{ouշʜ3G}ޟ>b+϶E;ލy1sOFLJ꼟͈἟y䩧ׇ>? 3 zűן9MXG9z.uO5ﱱh^, ohno~ѩףѼX_EEZ}KoL {LGRُKo\n~ko1ތ#_M?}r{_xqDcD29119>}oo/-߲TFG [`c×mv9}~Ęz3G~55~]?mX#Y7fx,,^),c7?f?b,fP/~E_XZ 6x^i-?_jϣ#wٛLzK_#cUUMMCvD#'lK VT66Ū ˣƆȵ_ ߼lk. So ZyG݌jj^ꚺK\_x/o;q⻿`׮h4g-ߒU ܗʯ&ϼĖ-{_e+^&۷ Sv`m-gJ͆-ݱ#\W<>=5{m*)+޽0y[3=bG44t_ԧ~'+).nN74LkmW胇}]DEXeeo(z?u%7+ R%#ڹ#ݪzii6 W"1~D񦚽{b%%gsW:;zc=KWuWbuGV4-,+|h~Qn{\'8#v띟|ha][}$Gŭ-;+OUo2GںO.~OzM{5HTV3Xx_+mlxpö#F0b\i}_~gZWxdE ʦGُMmw_sEU 񢢢Mn;oNJki~n~Wo _;i#py}¯ڭb򊫫O$v<(?Zў]O_K6#FxkӏD_O3u(NmGk>ٟƆtٖL1>Fͭmuᇿ;G.]җn7W?12<|ʜ5y?m[s.\/?}Ę~g?bd+߲h",yyQ\VesWJ!#;Ugzl^)^}b}~Og>4y?s]>5{ޟi9b,9~2 rK˛Վwn~_u,Q\|CSoJU7:z`ooOTX4rT${̣?[m ߵs߾ʊա{_|k'_ZXzٛkk{D"orOo))J$;y/j&& M$17wת?੬z~Ÿ_fp0ӺfԚϦ귿O,0,e8k[25yk{z}ښއ.)?x{rbll` =*\H9}~[?w듟*nhx7NDu#\^?XW ׵uOO'+'zo4\~}f/ڵ?xm&F=Mp-s+8ol|~\FGggpFF`];v|7g#/~ x?}o˼%*Uou9wn}( =Lcvzɾ`o|/rE_FckMݸc,lĘ(?OML?~џlFyFOXWw@}0֦ƺYռDQ޽~_}ԧ~ǚkk~2>%c~֭8[;b ֕*9͞`-۶m?կ w}Vϥ1S''MN1fppQs37\>G[+ڍUTw|G?(?x^vGqz?׽6\׭=12(-y?1y{CCqmcy?1:/oY~ǿx"}9btGyŃso\x1QPQظ,ȝ=/Lj~~ ?tk s4RYy%I/ݝ[׿_{ڼrVz3&L/Q >c%}|S_~]oqWWFh$ޥ=o^ ZwZc.6]fxѕt#FhL ' d3-iQ}W\#Fpl_Xl{ᇿ/ݾr=Fjm߿c{8u d2:+-漟X=NkQYs?GiYmGqro>zxv1~xeRW缿}ñ}pyy^;aX~6#RX?[_™NP^{%GGFG 2'cc##׮&\v,(Ɂ9~s[ٯJ+J+J+J+ZVXַ<9{[oɓ}7zמ˛ɗ~ʇhl\UdⲳKFzڭ+Xh󖺺Dbp 畖f"u57' m7WJ+J+J+J+Jjޏ`}jˊ&'{wo?o{[:1QXXR&(̲sIFG\9{ʕx)]XxjAAe֭'رwo}CEe<6egsZ3 ?\V+J+J+J+J+j+X\YUUyEyx"%?_)xJ+J+J+J+J+LPŋXbg>/M;wcy ׯ>v:t(+Oz/:</CiyE`c_iVZiVZiVZiVZiqZ=F9KL `@.lV8A}.{Ox`ˆo/:%kqYJ+J+J+J+J Ry$˵ '(z3/J+J+J+J+J+ZcXrnj]ca&YjVZiVZiVZiVZiVZv2|hVZiVZiVZiVZiVZ X*97Aʯ1qJ+J+J+J+J+ZcXLPɇZiVZiVZiVZiVZi x97Aʯ9qJ+J+J+J+J+ZcXLPɇZiVZiVZiVZiVZi x{AW Ÿ_tx$0ӭ_8e뭍L/leJ+J+J+J+jz rʙ@\جp]| ߦ_uJZiVZiVZiVZiVZiV\GH kNP^f^_d#,VZiVZiVZiVZiVZiZպV®MvJ+J+J+J+J+rd 7B+J+J+J+J+2A/D#卍YUgĹs7n$_\qQ]=voVZHD񔩩sΝJ*55;w޳}{YY^^,L ut?\{,Ģ65ط׮+Wݷo_[Ҵc͛KK132ymm~~/ gGk.ؽU߰Edd2]/\֓'+)ټy箝G$?sՑڷJKnݽgκx<M?.H$}oBO=zilN~ٳϞt?9m۶ǟ'F&RK45jm4wcG}ԹsI#/OߏsU4RR~׮3=yh,>{44dr把;? elӏ³Nx/̵#9n+-J&{zx3땕 ׯGuusQm&'Q1۷<*`B3E3)/NϲS{}o TԴcGk=s'^(lݚ>;σg i|78p`OO~Ǵ+{w,,it)zi&&6f=׳[6<<6}Ѵo߱c7uc6mUc[͵W#ICcCܯq{EL꺺5ӟ ?/^7p7eSS +g׿xML恃=tKҥ>ox+_ʭ[g:.y)zdlg~ax8O|8$S>~۾mϾ~;щ0>189!op(=OEL[o޺GVK,6h'(~.?o/MNZ6KzK%),T)h ?>orDuuML]̲kxW׹s_s]]CCSw4eچj*94ߟ,419?002&ȋ뭯ߴ)}m[WșLI_grN.{]eEAA~L{]Iit J_1)O7558а}{8`S_SiSqq^^kkGKWpJZbE)yy##&%#𱯭)-khغuҒ?^esg ms[NN H^խu烈K64d7FͿ4*}T\B3E{gYi2GtG;= [ű}Lg^^AAULcju?Cc֭kmlO۷74lG_eg?gs5o:k[#v6Gj.۷ԔμͶl|k!*-gŭ=MKJKo:1y̼+j$8w~-* ga7w3?g˵^޶m38fwc>{]qQ\_V6ug?+L_;y~cbbp_׽mo 5¢ҒS~'~75.o.lKX]9w+[qI_6~>ϫ|^ MM==gΜzlr1׏Y?E FG_˼a||d$!AyywWK׻eb'w*z5}p--==ccEE=vckr2嫗.?w? R]]3uf{b&kjWm'drhՋϟkmM_g)\ozٳC;w6LN߸uۮ]>L tv4!hJN  7E4w IDATزhp{r*Nfz&&ӏ±cٯƫ庿r56m25vt_o"{zwό91j|嶶pTJٶmbbQqZ6ݾ;? Gip034ӣѱ6sl|``1mmW/wkoqj?T|HEں9vկ~Fw<WL.ky934_:0PS29ϭw>ˍ}/gnFrzLxZ~/?6/twVV{Lgg?^c#|^wfzY19Z|aZZ߉T˖[vg;6[[++njj{.yKŵkmmkyMoz[=ӏ}顇~wGSo|ïoΎ];j6}_ק>wOg>˅}3yw~τ#\#4((Kg?f3Ϙ3߹/18H28/t;=߹X3~^w]{;۱94u9{L.y{qqŋq|ݿ{__՟OO>KWΞ}s[::ڲ~~GtubO6688<|'647thM5;vszfnTrtgd6),^dXv׮mJK-/'eeߴi۶{SёmG"鯱=|xJFmضmKJwkxYHªmÿ\VU$/MNgfxݷ/}(,/߶mΊ-[wlݚ2]IIiitd멽q={m*SkjjkSvynNٵk={³j~~QD۴wo"LNLtve>HQQEŖdk_x0+RۯtttwSfV{:|቉֖}[`xޕ{lۖ쑑.\hON5jko߱#>;GamE۶u(`4:F3mUWuH]]2YVV[[_ߗ)^=ڵlJǑilJ9֖x(ݵkݻKKS˫RRRgmMM;v>;osVzR4:6SSӰft''{]344>^Xд#|~{w+'*S^zb: 3lj {.ظ=%=>|PzH/H=^^ukzRBCךCCrW<95=J?۶-mْۅEE+W^+c\L#/޻wqGh7z~gJW} S#QMMiMMvզZǿ<~_VvCVT.zKz0Luǎ;wٽ;HǶmMp{kj6o޳[+-MHY>pphp``dptjgwPC{4_^`dgGwۧq61޺3*fr2ѹ>" i>VܯSq6ڽs\Ͼp\JpoOo6mݺٟa<@ ڂh5}芊ɩzzZ}v}xGN54}4 {ή΍*1U޽w-(*Ko Wrytl5&_ۛjhR:bp/$aJz_B3^-zxonl(z¥KƏaL⋙[Y;|-[ݻzɓxFE97ϼu.NߺGՓzqWU0%8wspСDFǓL~Dž\~۶{lRV,_wD]݋g5k*>wk"K¹P]`??l075֎vu]|f_͛/氇|j׮qG{?WU&mı=>BKJf/ޙز%GݻltEEyy.799>il~jɆp?|8u՞g2wp3NιӧS`x+w611spV(^tix&:w<G#L8C0mfýV^J&s,ɓtnǎ?=sQez{goGh*sgg>fpp||r2=<׽_e2]]Bg;uuaW>gHg0M}۶lpB;&r/W,܃ a[pڎW{FG++kkz%H&{ڮtϾ>mm_|Db~糿س{-y3<|?1LT߾}yeaΰDžP/sjkg?{׋Ϟlm[?dJKg}sD"mp=\ndYzΒ0ŷ˩-?.w#lmmxUh>~7wR-pKwӥwmW-xuڵ;u'v6>Wχ?{Mvjt޺?>?pt4\ ~vMdRu2y_9_Kˑ#{v/% WtVWMPkMDW̪uB3No߷/\婧77M omxyFo_>t%/:~ԩ6L6IooGOGNk>|rrflniˮ}C1kjڶ<=e۶cǏߺ۝l*hSΝccvzyqzpkՋ-nj?tߺ50=0[RחOݢb oZmj|k|[8EEa"ģGrtq콮:.-mnko*-8sg: orOߺ9ztn<*fs|cѯ|ק\nh(::۞12w::z{:p`ztںŶa\cnRxc⏃pպgUdbA8{L{㷐0=vGo&l7gKE:]]y|**•7~N6[1[VW=#4}s}A:&h#FGyَ;vwnQ>=w}2-ƅ0m{}CΝݼq󍫅3+3n̽|ǎ{wWzKߟ?Yhd=75=\{Э+*_qaW3:.yg}_韮_q|>o}W|X6[T46'jݖJw^{<~g?*) [r#])u$ ѱ˗Ϟ}Ǐ)^۫ӑykko|띫R]:Z߾}r?qvT*?gQ/jyS dk?ϔ;~-k[56~\vRO]lsUQx__[}}+k5{ BX&/7~x]7dK>Źǫُܺcc />J:>FūWQq731\h޽ںo B|opٹƴ鏵hcbsq;ǘ}ֹ{s!R3;y\f~`DL$^M&F(tixvùָ8Y8ce3>/vgkaTj.W gl_x3/52s GGky[|lG;fg_ޯעb#xhj)flVPjdduWk.sf:.qe?p)k/- O]=OӱW^qm|/nq_I+J+J+J+J+LX6b Rp?zWqYJ+J+J+J+Jz=giVZiVZiVZiVZiVZ +Wpߏz"oβZiVZiVZiVZiVZiVz, xB+J+J+J+J+2AV.H!lP+ݙe7wg]l׫#of+VZiVZiVZiVZiVoNGPji$>|7ROPad˾9YvVZiVZiVZiVZiVZiՏ# j8R\hOP^μțVZiVZiVZiVZiVZiz VpZvmVZiVZiVZiVZiVZik':7-J+J+J+J+J+`%VKMP$m9jVZiVZiVZiVZiVZln&(?M J+J+J+J+eX~dysJ+J+J+J+J+ZcLP~ƛZiVZiVZiVZiVZi r"ߍM=x)/H6Po#]șrmuJ6+mu`.[SSY*94TTu޽OuǏ{{K~'eeeK߆jeJ+J+J+J+Ҫ[v2 xbߟ$sMAG%{I߿w%Ofs.NpKoz0j[]]WY-u+J+J+J+J+֜ ) KiI]}Z*ēǏ_w/3<6:661N#|T*\8BӔٿ?zѱ~~2;~Ԕ's\IDAT,+wtz{}--{k„--aqIm;~2rđ#0nΩSwo)++-O.eֿJ+J+J+J+JBme2C6șZ+,Vӑ~2_4:}ٳ/.\vRO̯odsϿm(V+J+J+J+J+ Uzlz M J+J+J+J+eXw"#AG G F=3? qn62̯WGV+J+J+J+J+ޜVߏxI|n6+r}/r&e_:%qYJ+J+J+J+JG\Gq6+y}7aYJ+J+J+J+Jz=ͭ&(׵:^$wYJ+J+J+J+J+Nu0AoZhVZiVZiVZiVZiV&(KIdysJ+J+J+J+J+ZcLP~ƛZiVZiVZiVZiVZi r7Aگ+,VZiVZiVZiVZiVZi^7-J+J+J+J+J+`RAG yߍD/wjǝg~eoP~VZiVZiVZiZifmCw#rHj1AX5&(e`՘ Uc2jLPV 1AX5&(e`՘ Uc2jLPV 1AX5&(e`՘F ݼybh:_G\&(NtH+QD`?D&v6IENDB`gsequencer-3.1.3/docs/images/README0000644000175000017500000001065213607210263013661 00000000000000Following images are used by the documentation and hence are distributed under the GNU Free Documentation License, Version 1.3 or (at your option) any later version published by the Free Software Foundation. * AGS_iterator.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * AGS_linking.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * AGS_recall_lifecycle.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * AGS_super-threaded.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags-automation-toolbar.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags-toolbar.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags-wave-toolbar.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_audio_connection_input_bulk.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_audio_connection_input_line.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_audio_connection_output_bulk.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_audio_connection_output_line.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_audio_preferences.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_audiorec.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_automation_window_drum.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_crop_notes_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_drum.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_equalizer10.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_export_window.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_ffplayer.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_generic_preferences.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_ladspa_browser.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_envelope_editor.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_envelope_info.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_envelope_pattern.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_properties-input.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_properties-link_input.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_properties-output.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_machine_properties-resize_channels.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_matrix.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_midi_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_midi_export_wizard_no1.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_midi_export_wizard_no2.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_midi_import_wizard_no1.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_midi_import_wizard_no2.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_midi_preferences.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_mixer.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_move_notes_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_navigation.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_panel.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_performance_preferences.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_position_automation_cursor_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_position_notation_cursor_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_position_wave_cursor_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_ramp_accelerations_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_select_accelerations_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_select_buffers_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_select_notes_dialog.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_server_preferences.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_spectrometer.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_syncsynth.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_synth.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) * ags_wave_window_audiorec.png (Copyright (C) 2005-2019 Joël Krähemann, GFDLv1.3+) gsequencer-3.1.3/docs/images/AGS_iterator.png0000644000175000017500000010041013607210263016022 00000000000000PNG  IHDR$.zTXtRaw profile type exifxڅSQ {=Nkm75{5N03|Qd+ZU#T8ǁc6Zg?,66rJ]&4Ox0!/z eSX֊KB.%inZ,/Pqj,СE AtllbVt5@EqXf͖,k1OV8ₓ>߮ԝA.g(!SxÉ翊G;$$2Qgd/Ϲq |a'f|{Gۮ WڍGz@{tA3~$ \gԃG]آU8U)~Q*TiDGcQ8oҳ'^gS|HUli@ Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - iterator flow-chart Flow-chart illustrating the GSequencer dispatcher on the event based tree Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later 7 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxK**BXhKnIlhPcO[,Qc_LbQTTШX0vE,a~ó̝;ws̙srJI-cȂm|n 7AiPm`Ͻ!?u\bL$2<;|LՆ/Ǒ`3R[oK².v_ґApy>!W/7gu /D3)5JEw#]xmP'&Zt\wԭ<{9s*q*`|u*iL61"RD\V6caBt/WK,$X> v)9،)tuؕJ\>&5y":nu_Of#ܬ$އ{HaLjg7 ϝR.}u FtH3BpTN%߅GRrZ2m:lN~H\>&hNxS峻/NOH7I߽aIm8s: v1&}9"[=56\t1,΁ i&>9Bd\c3Ȭ9P_fǟ&c2U]'zM356Qn'\ i&SQ @-.qdߐ;C-+؂|L}W~-t')L3e*u42I׍+#6ug9AokȯI.~=\7Ny-Sվ-*Ar`p13RNfi=Esͤ=o :Ŀ['OM5uat5D'/j+EPWVk]+&~0 ރ0 >:~{ڞ:qM!L_ВL!|ͤ1'O7N-0Sl沶Y$ptIs>'fTOݝ},o-$kyO¨d Et jfg&GJ{]o*jl&7y n4iUD_lvJ򥐷 *.֘@9ZNF@$84;8?^"MiE/j LB#d;7БH>}zA90%c2Vcw۱)o@;KƤ/x`5d8zj!'1酦 q 26h܊I^JlC$xst8،)h{5h'1&Ѡe:V5}.1 SS&JR2Տ:ɑgKsTRrIxPnuYc!G r ]x1!R֭E~qIr҉0;t 6 ‚z噝l=\~F|?^KK`Y} hR<V> ԛOWvI3wTP֯~j&$yKd#d+dPoXR9VQA`R8{|}!xyr?;Lvی:}̝MfwVHD]8h_8@ 4،fOr5pR <`3V?"7\.zTMM|Aq&^5\|s[8،q7߀דxf,BNQ\q xf́36s921t:V_txMlfxip:Cf`&o4r-Lx?>$B&r%_C-?z4X@l63j=;kx|vJKA-?xx q9،8)qu0j5۷&nD!.Yl68)qw55Y Nٳ4m 7l6fxxQ]B4#Wa#K/qGdBk^ ^c;:ߵ毙dE9\S!ڐOA:NyT%GZ~a`*`30qy*:05ŗ[A*F7]|vyFqi$W]NOZSt ZLҠx3 nm{+v9gR(N[nUK*gcwWQwɑf`T+'zrbs̜ Yax}HqƧQx8O> j蟓piMjcq$|lhXϺ{Gx]Pk^z1ԩۏ~fj҂} }裫57PtXYmv[aV i#{xOJsU0Ξs?g_5#{ZkqaZXbUg~KtbMYW˰xݪjl 5$%S.\OL-# junX_^}`]r`N.͇>ODǒY5R·kW:CGa)iE\'#GÁp0'@^‹o'FmwÒRxypG2q<4%W߇Am/p6y`R^q#/'{:7qi3g`xM]E8[nB"Gbuolo->mU}Ĺ.\WagůQM شW;A3ң+T]gfӻT}ΓkliZ%w'WƛHMumrKPm3Z̽ixI$o37>o>Ҍfx8`63flƁg8،8`6cxflƁ30`3<flƁs`3<36cj>$9Ё3fx<qˎs1 <qKs͘ <16c2`8،[Hfυf50NmP7y"G7a#}>$16cLQLTx0clƤ4jܓp>l)2`$&E`Luد\>G.E>$iek͘C_!CD%qä_xP?16cjnt ?{`Ugz0>BtWA_^Ch #-_ _c3Y+(x6Qªzdpc >Z'|ZoVO،{" Z^VB#mf)d= ny:٫7Wې?caxi;i9;#͘Ԙmң+Tݠk#Gd%Q6[r*:Gӣ?5cpS1e( /lGvOMMT[N|]ſF¯۱{X.|=?5c\c3& ;B%M?#wl;vϑ^AI1 O ֖瞇_~ Z5?)c"hqt{Dw:E ?.Q_;p}87iƸ)Ҙr]P{` >E.u}zA9+}uEiP}^ݟ1n4&8},|Pσ7Efs.,k$4clƤ[ H&D\VMTkEfd.]F=W76t> K1)`mAMZ9RR x8،I"^kǵ߭5p#QpצH7ބQko8x(?%쌃X8q3fLVqeE9f`Y`<`3fx?@-Zjq9xilDm 98lsq"]H`pk^8GÛoY}';0ɞ~rPJG 0gg6Z2u:hH>*xCn 1YٰO/9OyG> ^I7ȧ}駟E5F}IZ- ^;T=DmMy SL^'@=IY #cWBm-u[6Zp:M5jEZBcr+jW ^&.("2:§LklZJX%x3lP"\8J^GWBd8R=fv'ѵ&a)[CgNh_ *kj4{y7ΟrFQ) qBRYl!oպρS0*+Rd7R `Ӱa%nL 8jV"jÅuMN6Oȩ$^=C}ϡ?)c}d'=^੧@մ\91?= j]w4 ?.Q^iklΝsw_R&klm6&+:+{` >Eb.P"UMhJU>uMtu_ˈ?;cN#^rN8؜$i3~#ay[} 9i_3iL J;iD5E:،1nTegu3,؂sH-1UG#%$to܅$Lk27f;56wSfŏ"xyJ2&-;MTHkr"kOȣ0qM>DӰ1M.mclTW] wѿ{=BNw ÏtlD\llfL449QG½O/ͻաly.7Z28XS{/wI` uþƖklA4Wr sܥVD&EF| ,ߔlǠF=a0=M4`E n,}Mp-hK-x 3 iKe~FL&n@$}̀.nB$>y 2qIS5&iubIs@XxMVU5*ZorZ\G7l:90+HԞĹ^goMbRʹl8_V0um-~-NUaXԆ߭5bVrԒK/,Zү?YfR˯@ś8(`&` diZld`ETz`Ϥ>߂+fL5F2fLa(lƤPD3& V¶U`3&d8{;~O ?# ka#!`l6c)4#3La`ƔkfLyrTs̘0}…CB1&u'}ԅ4c("8،I921&2J͘Z#G{H 51i 7ۈlifraD 2&2Crrd)d/{oҏHY#x YO[f 6$ξ%Ep0zuğɺ`ˁeF{do]£{7Z;Qp)YI#l>N6Oȩd9x Qpac|=r?MqSz,9 >ڥ#|E4[pn+:uZZ W:g.L]O|uL66}#w1'?= VQ$cD},v4Ⱦa\tbK^Mg:A]XQSG5K{CRT 'TU[nRMfəPMX**KCY"Ul͘$Ȭt ?nG<'=]3~ v'F6TgkYaM:ߩ^Q^=kyiStGqSD?'Sfb QulP8jE— !G 5WgQqi~ @3h0`3&,>]KwAմoɇj)A0:L:1PSഩ0qU`qZ7v30rCm<^F`NΘsct5G0tMIjNx>ԭ5G&c:_F5#pe8񣿫vmS`38(.%'8;L[P HM/N4՚+UJ [ <=ݤiR)q06̶8Z=w3)lyĤeie:$#F l'rP?|մ]`K3`ul<M)M &44i]H<ͷ||؀$UdVfbk=ye8k&X˷Z áF$>sxoe:s9ɝay=.zsaaMN; 0^GQkA~p/Hg%iZpԙd-egp 0d #>RɭC )nU7TuL napjIϥo!D g4Evjըg]-ߋL&*aeJGss:&>W!a43)R?=u$GWd7nl&;֓ 0ٯj bZKw:5gX7:r-[6CrPK&?w$Q^\O*qu%gm&Dai];%g?M|t{pt8ks^_CIkoI]&Tw oje,^}(D]WW*D5y؛6?LD!KMkl`Ƈ`J|10YBsejԃįQê'ʜxE HPՊ,~m&0';ՅčiL >FTNƔm}fEPq|l, @ V *6;M^SPQB+Rx[)ғ,LhRU$xV_}5 [o VI '>$6EMztݠ׼8rT$Ǒ ·[r*o'-؂Po]c3VW/x)p^P˃k>pؖ4%'_oa&'7"Vum1&+qSD̓א:| ap3Be.y5Q}O¯Ss]Í0N]:-D{d]Sd1tS1ېѹ TnY瞝 [Z~҉PWƝ ztѕR8h@h)rіMƔ{D'u5h\1]^HJnm?5 9_"!]?)5 ڮƦ]:‚zx#Ƹ)Ҙ4'9%1MƤ%Mj:(#qg@vi]MpПoWP[`H-[吱8؂FlYF|w9jh#C[ te ;cI`ˁe8،1Ƥsme<`3ltcLFklc2*<1،1ƘT 6c1llc\c3cR:؂G9،1Ƥyc1ilkln4Ixmc1_c t `3klclcL:g6QVlc2%7hh2O.cL[)m"t9c2<M .̠h#GK&B1[>te,']j`a'x%c6!I6]PLN>6c҅MD׭ ]&l'ߘT3r+5b, ~Ɋ`˃6cj]ɊCxYKSck[XO~/G:7&pS\B~ #w`fW:ߦĥjͽ"I&S^+V E+5?*o\yl@\&+-0m{Ez_򯾀 Nm%i(؂ض@1)Ĉao!,s&.IEjZYƊtJ`.=56O[cLjr8Q8x>8،I!rɅ`5$#p`򣾏͘t$ҲNduNJ4&j Ï+؋LVNJ4&O6ZR'^[1fLф~ Ԓ3΄ǘ=H2k\F\Naؾ#|p"tɤ;{Kjkl 侻c.L@fgVUcse8H=KØpХQ5@Sd[3,xh0fV``sc1lik<1Ƙ`Hi1&cEcɨ`r،1d@l%cɔ`|lc26\c3Q،1dT)Ҥ>8ϪL feƑH/KǃI` xIFa P޽18L56L&qP#56|4|t ^GKtYDvla!٭5La_{Dמ۷I6:]hɟg Qb%䣈!{>;y?UŎ8aw{$̚-HWk]U[#P[);*l¾[]AN7ur&SdNu\G+ V,6u`n@;׫ ד_#??N=lK,NG?C%g*v 9㼣#[D[>z r7Ef5ǐ/üpL  jr,RR +.IpIn)psܲ||Qo. CI-Tu%&~VMSږw?_UŎ8awTIu`wز?qQklɫ\XH[xđye5wE$-K>qUmh-weTLaxf{S=MKޘm 4Y;LLeKmX%7&5E90l+a2g2?l`2vܲ VKroa2SGI`;{.cq C!`2^a[NN&Mdy|C# ꒤|6c1[c}lc2 1ƘqcI`56c1li1&Sr#_. cSlƤӈ&ui1iàpP0& 5`3& u4;cqc16c1f18،Ia""[HŶSB{>(t`3%`DA'̴~15@rYDA a\mGt#r7$դmGz >ڼ H>#`356cR~4cH1iVo EՌq͘tEẚ1Ҭ!mw57˖æĥgklƤɹk?:Ҍq͘fkldTu5c\c3&- tHc\c3& tHcʋg6|CV.C6Zr%S.DqSI ܗW`qt)*^ {$lƔɟ|FN=`{Һl MV|?\ KgceS #u`j^|>#.7S踚:^8iGcR2 C8raKj fBrr՝G.+j'Goᑣ"R2d0&jrv,bo)q)9Lou K\>&}A?ރFO^&oI~pr|9[Mf$_]; w$.vq$T+/N4IhN}z%KhRL\J6\OΆ'aC1~zܕ"7OzH y KB~6}ql`l8no w.Lq٥pK>ۢ{ ()/@b% k~{Q9<,̼NDZ}pͤ4yPǃFˤwklW"Fssz-\úU ?0YA6}aXヨ|I5KjrȼsFO oRMnA]K2{LH:x:p?KwUWWux&|bg70'^KvO~PdҹE?}4\2i[GjHS-6m!߯Nλy\VDW"u u+$ʚ1gH*94ZM3ߑ8LұLzwG_5+-#]ZycUc|@Kd/%Ǟ>x Psa}G4ץ6BI];F;`~ֿJ8p ukاpb}`PW~C kMqީ8}̼"R} }Hi|qyV'ر3[zH7Ef2(XRtɤ/O+2ڑ?%]c3BsM{c[1.m|K:tfG\>4?Hkk.\uT`Hsͤ%9WOXRΘf̂:v)|aLZғ\[ ǎ_ltWxБI{4bap|ا>6".%IhL# ǩ^4|LASKf #Կ\n7ϥdrASB، 7EH4jiWP9L!4*4ڔБuO}ёÑ`<@JKɤ>:V5z}t)X?.Q?t55R2BBGRrNMa[Néӡkrfkf:uZpBwU#Rhƛ 6sFG5䠃dD/չI : ‹/K/p*CCil?n[vo5ee&^s1#n‡y 6qW`/y[G۩2nLtzoj__2΍iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - output panel screenshot Screenshot showing AgsPanel Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later  iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx|= BHd@BIXa#HYrjk޶޶UV+UD%2 $AB#2y=s~}OyQ\31%0T(2  eC2!#55wtJ$O=ӏ=`4vte^#ÄKNW_^V(L&BH%Cuu ;vԨ[Sd.7ލ^ZiӮRYm?>;0 ףzbp\i׈#BǏ =:!~rŒ"BV *wvmٲP_Yy{Wޱ|ט17z3[feeeI)u׺L 29qzr(K$|kߗ!(9RPPX [=:)V(e" qEs8iF FcyyUUC޽%?䣏=kӃr&]}CcSs˙sU~7uݙG3>C2P԰_*^嗦L5JYsUҲ:**NȘ3{LP\bݗi;6nLJJHMLLHX2/ mk;g?2Z߽!jɎ9qdȠ>!!qq2  YBxl=sՄ aa!!))3DMMwH}{ꅄ;si~W\DEE{HʆZ%ܕ':`hX89]S޾}m/^u-F}wfĤ,_fMddTĉB/9s;>WP^*ߗ! (Զ 4WUM11::"2<|b=MUU7JQGiݼƌ*>UQQ^!pg6GEx{͜|w斖74\zA,E,%v-::Lg͚d:eѬsfwuMn^nNz:z}pHt$=" I*u׎ qwW?@*uq)(ȈJo61Vwuo۶}kj*++r;*UlgO׬hܖΏ?.--*lksrrpP*#BCG-[b}?D"f#>Fcw7[H$鹹337Ԝ6t^ooOOy ?~Ҥ f?h߾fܜc-- >>Kn֤$Qaa&]\s =[n3GB, NJJN^TbP\ lٻ/;;?~ӟyeڠ\\f̙11;vlwt,.)..(H 8q.w^J[oؑ~$'gϞlB?d;NLtPk򓧟>p /ĉ˿G;s!!RIe?' )t2=?}\ IH:oڴ{Ov#i;Ox'w³&#^}ѣcc%}$򊊲@//ww^x+gG{̘eΝ:Yp!<>+ 'mW |j&٬POO`„aTQL&?c sX10ՠSU]/K>7)0S;:MOlj:{رIbb7+N򊔔ys:9k}|Z*[+^: 5ԔΞ=j-,tQNu=+!!&v`dJ<~Fg}1gggGc''-JJ1C:8uь߸񭷞y\\T  ^TtPy'7wYS[ߟ3-5u`.\?ͱT\e]m}}GG{{WWG{k[cv藗J);9z{7747z_ͼR%Έӭ/_v:^Jzavrٜ|kBBhB!uסC;^}_# NZWW^YRu45 th4BVX,g֦2T8 ˉ)M1ں∈K?BCx QQnpަom_˫Lu맟L ~t}?~X"ma>S'(<+&%N=d1&>b2 tZ:R?}bq[[ii̻~[]pwܱdG \sUYL._w R׮w]_=e幹9 m-[>ٹ3-n(GE)˖u^/\K`j}~Ijjb7hëV-X~KrLB#IaVtz]{^W>/Wwm(^Zwa>zmhh9;9:T0w{^ UrL.}urR~aHzœϻEӬ "ёܜ\7Ba6wvtrySSiYiyW\$5G3"'Ξ7ܥK-:up4F.J%D*?nV*,w{};L:~|xZ#KO~Æ[bz?{a+0r*Rfǻ{p,_/::UwwgwwOq!ljOٙyDG B_ ƎS**+==-lgglֺ]h ^GG{{{۹~^>r=GÓfL60V$2*2e.CR1k隼oXl-J)l0JeEaG"6lx啋T(Y 'ΜtN'988k.Bl_xݺu{vۻwM;5>ڲ-5|رX=r#"ǂѸzMʢ9s4#}J\"pwW*K_<~ɢ¶+Ej Q^pgWo_l0ܖz萝W98ݝ0T2|YwO_ZS8#1v=n cQqskhhk&(yB^"noon5`6כ- EEEU :]kkyc>`?jL'H׿ ։DZ7_Rn*dm-Wv #<]]Tի.]`ŊE,(**))-۵{믿ڳ◿\6sh^޴Gx{zjZ\ιzA. ֯oM3gB'g7Ix [_Q 3pk >>6f^ҪU`uu{zƍ tuháPԨ={>LlnsvrwDP_[{4`9Fs̈́5Xfsvܵ>]j萐#'2Wrwq}v$=#C.녞LBlUmK\* x+wm[ɤP46Ubnjnh**Z$)i젠 gNIvvjQc"N8s#GΞ-)O?!$}#FEDz}UUmMCcVVÇ-]\r{Vq3x ]IKKgphFƞ=fEGZ光 dVXxtyѣGVW뫱R ED$$?~ٳz}K˙S-b/:X Heddf;:LcL0iYOOW2<"bbSUg>ZQtv<[X(ypggssSNVT6eJHȨQjw#mj()'32M?T2?vlxzz/`S]]KKK+22=tH@umL7sFJJ|k߽V|:O>C<මP2>ҬBO:T aa<`x ?IM?#"FwԸzxVW76vvl۷rKtthwPaP lV6oNK۳u"#z Ӱ(۫J{-[PˌFn0܉)B@YQ׎ eC2!C@! `P^|?ᗿT*M& K7mڽW'T(fﷳ{۾oz`+QH)0/ͻJ=7")%McS{Nuˎ[V+--)1:;ݗXrڀzndK?eyޚ?*,l$['`D[X}<33pC}M͹jItqII7o܀'M2_H}o__IyWxDntks =[n3GB, NJJN^dhpwzk2AvU ?Ÿ{N>w;-?ٲ+K :w\eIŋfXz͚kz{{߸zkjϜm/E%%aa#GjWZtbYzڲ=5O_|>=vDQgGE}}gk{‹}1'yݺ^&qƼ[.Ӭ;>$a~%:(l]?i vu5~|u<20 K$mbb&Lx_G.l?: 0ZHHhhL?\eUvvv;8R]{3^˾&,nΝiqG9:.JYLR  OҺoO>99i^MX˺73:(t:A,-;}Iqqq߲t.VI$nnݝ==s4J.7]\n>]]]]"[Yf3^پz\^^v477tc,tkgT6576TV|S75Cs\_>7?߯ӉDH?RRrdQa[kcc}Cﷳsu3^ݾ]}fo|s[Cvv_ tXH%(75\&JPH~Υ roذ~H|k9 :9i]ݜ4NOKغZ0Ek >>6f^ҪU``bJp3stP)bWW?Cee)&x=uh񒤤ٳ&Lp-)*j8T^!7}B??#f囚D"%͛5kʮ^~̙۷ɮm5%%r.77FHJglJK۵+7733HaaQQq~ajjkٳ' B[tmK6---*kjnhll***))6vĐةS/0{zCe\/vl۹#uoo޼cGww[VL818X,bFHd6K25&WJJgW_y5k̜9~) \!`0^x㍍od--H~67]Z8-DO[-NB* )s0AT CaVb+*ξ(X c̊eꬕt g_kj1Jje@}[:iE@0mŠag _5SC ef IDATCFL :(2tP0d `H)@sSQC/+oiJƎupQKwtOOd>ooӓ8! 8rԹsvvcn=$Wbз9qcgJkkM&7W1cbcO~S55n. ^M[`@hhtJO̶Ap,sOOO='.^﫯;Ytbwީѵjղ11ZwsV髫\xE\]ܹsdĈؘIsFH$g+r32m:-^zJ$b]1S釳nSYxɤ87>cܴFHZWse)r” څl..>|hfCV;m]w-Zz>,% mǎNqHffy)C3O5&zQʲ3?//ٙGGqr& ntP1ugVט3f ᯬ*D"Pى*Vx_\0rYN]~̘(sNegTml4nj)q fA__AVbD*X9><,lĈ:.*Z$<AL 0Tf@oo_$j{z 6z{z&DT?Xqrrrt3 HdwWD&B'n&tPP.'B!EFcWWG{wd6k O>ׯHLP(DvCgWgGOpGWc&So^#ǿpD |-wx+4{zz&Exe 1tD2O_o"Qm}AA^n}AՍfh4,rp;ں|bkkN,.nkWj_u\V*Rh 枞ޯ>c2)>}Q&5jn&tPƐ8?>0uk񭩛7qQc\s' 33 fg͗ .ջ˜C'Mb[jV-[('g;9CPм[b'H%`_r:`ϞݻBB=ޞ3yyuu&$B̙={6o޾9"b\hl+:q$33!a1cTj^UB@CL1sŊۗj4.*:vlf{{v_h񁁍VeWB1jԌ+W,[rБ'>QP(=<|}cc,??2Wm-Op"с}YYw٩ծ>>cFDL:a#FEebgѣ= +0`ܕ+'O vuYH)HRDܒ|Et̗2ee~mgTJHt)'qƽk=R51rnK'F^*f]\u[pSKNNcL:yJiӹA)`pq Vou>De 5P_2;Q#mg-*3rKwACl0D]ssaazmm}}fJ>rdTԢIIUmřMV,E@YA/ LWI$Wxx0coCf|wlߙJaP E@y0. [dE;HaPE@yZa ">]싀*dJJ)B@! `P0d(2K=^al&?\ \X"9do~rbD؈/gKŔ&Lzbz0lM0Jw RĔP! `P0d(2RJ ͊:  `8# _3B*  e\wz+7a ffa47 Z"ʭ1W"+ ?l0څ, Ua [ Cbui~D#x :fXZ>awʉ2÷;:%|sp0;:2a%k//_+&h{V4kĈ?9aLHPC`0G{f$͟f|G8[Wٵe֏>OC}eR??OO'{]y^c|w^ZiӮRYm?>;0 ]ӧ[|sÆ/]xqu?(zfeeeI)u׺L 29qzr(K$㤧54?D"xbbotO|a̳Y[]]lo&+A@n6 >*-FG04 p#~~ryKK_[ѣbO4WIY4gfop(D>[Δ[w>+V.LYdrq ܶq̙by`Sd%+VdG75u^_W($ z0˶0Dp\_P6f"''xz&HR'Ze2FD,,((H;gŊO~_zIv!WMOlj:{رIbb7+N򊔔ys:9k}|Z*[{TJۻ-xyLuMw/ W4oq/5kjk[SSw tu…VN?۾%((:v.!(eeM:n(DϔVo/3.MIim5?޹yD l6'ߚPH$wuδW_}#Uc *j;:ۻ:[ܵTRrgYzx\|gVa뀀WqMY8#"sîO~˿||uD"gO{{R*k>QXRR\6r}؁I*=p 3xBg}1gggb: ZnBGSӘ@'F#n͋"^qqhimj.+J+1ho-l{䀕Yٺ&|[4V ٝuLŋoe,A,߹s߾/JJTΘ3ee +m'l߮^^{ߺuO= ^_vA7 BEV?#°E 0}M@8"bw M5H۾B$W&ۺOv{yd??X,ضg}UUTXs۞ EHwp+%dRX:^~>,DBldδI,[v]zd Emj}~Ijj(nnGg3[(bm]vvUUee?^w=˗ B}63m//޵?g? o{?۾}ѢիAh\=L>^#zGW ?}xժ oIp׺yz\:lG|CR٫Y6vo/OXptcɒgmdhLz`t!|rm2LMl6rˊl}#a<8lتjV!1//{.:oQaaӿ䑟l欨 f~5 |춼~׿9^W/^E^_Vsp3a&gԓxSVAL`8Ht$=7'7MP͝:\^Zva("QoɤV(,<1^.///+͝1#.>.npF.J%D*?nV*\]=<{o}{>?PMutwppΔ憎3v؞n||z{ʦƆJa&f8qB!c;ױcNeoo0 d2>yy3g'Ll81&z'** ZWrgfB4U(V_靽^\T*lvqպxwuvuuu(oLPfB&~[TMW.YޭY(2e^õ:%ϱVe58Wv~U +}}.Hooo߶T?kEa\a0\My՟~iu0lRTn͗EEU :]kkyc>`?jwK'H׿ ։DZ7_Rn*dm-WvA#<]]Tի.]`ŊE,(**))-۵{믿ڳ\6s+99bqOϸqlU 3Zu]KZr#}ݵ*/ȼc11Εgf.'?v!f*|=LB $@IS=긶jZޢX-.ȦȆ쐽:ȟH 2z~4s~xWE]m]}MQ&knjinnquuttpX_lQk[UrRGJzCD1W_]fj??g/^dp2xyGbGSK`AC曮ƦZ;;g'O[uv)ee9AKg=lZWu`-lS&E/?1$(:ʶųvIHzo?} Q* 8z9*?qĉggwv 1UpNV;~#͑xhk*mEj?TJ;aC;xbh*+ /Feܼ}{wX~S'LP(\y޷t_o@@CO;:Z.݌qcL?y255==#cHOO{Оg {wǏ:96$$xXCY!G^goX\\U]SP{+:w}5ME)kH IDATz5GVe2 ԑ^ؙꚖeΝ5+88<|(OA^>*F^y'hp:iȈ--V{7{R;vEfs]]S^,]%hnL]IKl.yWr\ϯzo}(V@gm@hh3bO92-[k/'OSSOojWWl9s8ieҔqyy55&gڰs=fNgLG-p Ov;;a=m,a2Bw|_x _yΛhɥ/nn^PhΟmؾ믓⎤gffe}_l\W[XyWIGc҂¼<;ml>_^Z ӧ/Yu_nי.-[v9|߻>d媛fMV{]/JIU([LYϤN>m~a՛!HrXʫ%$`(I$B/&LIScZZ|wܹV+}&V 5-Cfώ3Nstqرr[,5{9s-,{ߗN;:"bIY +'$UVZpLb]w;=no?dHǟ9##;;?>g0,8b4qqG>=e舠ޡ/$$"Jz[RRS֖qľ}O:mLfw2|sZe OO?}:?Qя DtFce'"WA>N*,~l4::\dO?ݵׯ-%eժ~ٞ+ouǼIs.]m=f(O'J=.&h6;8<Ͻ{+'zzu#>|̬Z~W_Q(lsG&&R >^^..K̛7gNPȑƝdknڴ_{{Iugklt߳TVmj损5|„#]` EhtwFR)jVÌ+(îW_+h5--gqҥܲr{{@@pJs3gjj::eg[l3{|hY>?:JrrlۋLq+V,[f;Ѩwn-%Oί}XFfScAK|9%-yooᥡ NV#w=L1om矿B!jTݎ%DѡPT[00 ͶܾsGWW'>SOuv mcGo`Z>S4tgKy'N,f2=w,_haaO?+EIIIN3?>ŜJXV/wر}K\)>ڧ׹{lܸnK/.X0w^i\׿cw'OvvVT<9gSf L|C2ܼ9ǏO>n=?0u$W vt gg77֋9NV[.n>M->rxivtju~^Nnrra!!!n]= nkjk*wtJjj];mE'O`/[0 blowppw4qV[|Y|n|K&;pH|ܑS'3몪**[%"ag_g};:Vh-}Hl]vFtZE {oY8aBLw{ e2JkgMccN΃_hT4f,F宮'KLh,jLIuMKKeeqqfsΚ>j /_鬒{{l q`RryGGk;R/ضtΡCO'͛j 32ăѭk劅˫׬y睿R]SYUU_p$~>\ح0/OD:S?yȑU*lp>2p`7{m۶l_qW {1cBCcbLeښ2:3z gO۶ضu6nܶ`7~̘#r36e2uނS};;x~w޹Kf9r {֮Rxv;$d؀-ͱ.Ӽr;;̾3;4#N9SWgg|-?`v>''rrʪ[,7W_abbM4yW7uYmi_n\= aj+Z7l˗?C('vxo)S,Tr&hjj~~EEclo6r3Ǐ tpF92XQ~$_GFGO0gΤFcmMA~jnn.'Zsh߳{R7AaaQQӦչ Rl[U6n׿ZZbb&L5{dn[}qYٌ;\*:Co9֟sOĹ-~ܔsǎ c"bc͞P45$.9󂂴:yn~d4gMLvw2{-7:AAÆcW}NKߴ߾xɨQNBlde>PY>u.]z6,mۺu۷=?j- 5O5:j钕a*}iRR vr& nc5 KJ-f?3DhYeU(*=nUdrߞLMaaNνLo?lر9VUÆ#v`^+(J.W(EprO JL+--/7v28LpcluZV{5 Z;[[Z[B?\nprrrtvvvvuv^LfwdKW7?2s:4Z.3ZZ,q9s䳟w.~TFfg255758Ώ)[,m".m'gnfR{s狻BjQk\\z' HXAGR $U$Wod-frgQk|YSUV:h,+=y2+^.vZVTZuuUfs+KZ[[kR_u:Jvw99?~ԨԌ-Ʈ"9956$OK3͏P=B7",d}Դ={vm0abhRZYT^n1ٹ8wWhٳq-55Ǧ# Iu^^'Ξ5lNSn,43oqǎ)}p@XȑCVU%$՜uߝ}Hf3om*Çed$&ٝթ8;{z,_~-c}ߝju`iΚ%ؗ\;;7$$"bʔQ:;1z#FDE b4%&ٝb2i.C̹IGpu;Q(iLFE_궨e5$;;Njdo徾g<~vg꼽DΙ{1vQ\%>~a#G}jiذS&M8i4F,VP5e2WL..#B}|i}w pcbe7TQz`^ѠRuE)GffYG??b\A2dr;vUsv;v鲹s#یZ]\j1g}PVkD*QIxz5K?Gݚ\3m<ÌkYE7߷e?Q<=D"4~,.Q `6<\bLTG(?Uۀ\p@! Po(7e_o|W-.p zgx9d }11elQ_1ezR^KzR^EN  e2~+\(1DzKQn$Qxxu_yv\W Qnf,B@4KV׉'IYB7#9-n4Z I)inE7# "2pioE2>G(04둒7wRQ5բ,;Z,OL(\N=K IDAT/>GN{-+*K.\M#lG(\p=ruMcBsx闿tp0yi{СOw/h,ʻٹ;;;9 4hPȐCL0i⌙2F1d2_;+:w[nJ\PX^_mʊ܀//'U} v)zÆw+Uee?/~˝2q+)_UsOyݏ#>sʪ悂SgϚ󬝝Own?|HWP{{뷅mb\x|^ԗ_Wt1tzQ|\\UUO?2cfddpohR4bK9!C|}B$#F̜1m꤉?yn}g dO> rN44lݲu::[5ggkw-][n6tDȨ(\38^}bm[W˳Q&[5Y 5jҤoG"qjS_mouỰk:Qh2OХRHP.-쬬(.NN3&bLTTDc"Ohhhi..nj;64{M n܊ʪ4&@f4LfL&FP.== r/_j޼[o>LED_E?.9|yZELv$.[PR7bDT^JKZZjj||عsZյe˖[6(A=zĈY :]DOIn{lihlm3l޹c̔z''6rlX+ntudrݮ:sfttTԎ۶::fegeM?t1=LeUk毶nyIiAaNQ'L1b VKoްaΆSm{mkS*]sф[/鵮.XV^S޾yӶ-6fs{{Hp?+-Y^wڭVW}OBCUzgs*+{䓯÷:i҆ $%9}ۇc= X,O=u݋3ޗ_ݗz_gwݵr{pر=﨨e歛(/_S*-Q"#.cgg_#pjm⎜8gg5k4?^kDG>K/8tx K̝7{oyEUum^'5u/5|N+;9TԈ/sJJ[ZzS\yc ~瞲͛wl߼w/ΟtqDZc[GE%JeԔɓÆ7E49'W^0~h猙+V,YRWfܱ۫?7{O=xzl.yİ0FÇwlgGzdwprpwu5Ėr򲊊ƆƆjsG>SҺz꿿YO#k4Չz^ťv3""98:|6֯~Gɜ]?~B-l{C۪$=c&םzgwbɓ&e,[6M7Lr<}ju:v㣣'OYrҲr1o۵k֮O?Yփ?wuK⫙kw)$|\'_VTQb»"Fg29j}{bꚒR#߶T_}];R=?yNl.ۄ O??-m2ٙ₂􌻟9s?~4ۻ݆}_/D܅ŢwuE/wر}K\yF6Emzƍֽs畖t?uz_mz㍻:+d27מss1|{Yߢף^dGO$'k4VkSSWZw\]4jb3ӏ\hTg?aVZT( R^su X~ǎ}{foKXǷnXnmmnGty9a#u2ǻN,*wm'Oi4b۹;u2+k`{{)?882KII9s„z?jpZnj5;##/@1$|)GFn&Y //5RGz{өVOsSsssT{#2J~I9K&<[s䙒<Υ=v߳ km_qJeGg{pĉdWWu𰰘q:F-V[N=ow^L]862%%55g'$D,\m;,fLPT{y~e榖WWGGfUrRGJz{aFɤV5Wd557/={b'g7wW7'}o?[7>µ@hum.,Ŕmb$hu5ƽyK(EG=V!ˏƟ8~D@J;|x_EE*H8j{]Sf_?ÿH\|Zm45ϱXD`b1wũJ]ddxwu7{o#FG&Y7Vvu-Z8w99o뙙IIii'O]+56VU<joY;w`^^NNlߺkM"@dEEeUUyNw͋?n6]֛GII~~v~~n~~c"u:bm+ A^'gg 鹹XQ>6jʔQt._Uzg{Ar-j$M$w- N<%zQ́ Lrn%k⌌3Z-<vQ}k GW%l4LZgmC:\\=JJnٵs|}M&7"lvpx{W&N G}yYD{/8qqUׯ]+ u_ѣ||zohlb[HEZƺ>GW%e4:;M&U۸q={ۛ뽽==]]W6 Ofb#@'o~3O?cgw.Rlo*˥=c"us ̳|xI.,5k#s-2$^vr'w\bŖm'BM8u9 v7Ⅶ9>n)c M39vS#oٲfUŞŋ3RS~3jW[KR"}H#v^'׮}osƌ).^pɒ⹹9 MM 55GZ[M;a@ND.??ض1K~+%Yىna}`V\ q[SزyDs_[3gB!}xh^_x^*- >}/ ho?vl-[$'XY 7uS|tCYYS&OwM;_S7nii>ЬPX6+9{dgIDAT]}wwJJ^ިQgbUp}'+UU ~} G䙖ni41dpx7궶7޹s.^ ^ǿ޽--n%NN4驧%KǍ [i]+39rnŅ6WY{3U߸主J1k)ݔ4/<_yeL TVmk;wY__l-4ixfB;!F?ScBBeqq---H$eЕ@N˟3L3.?tpmG,{zJM-**)=g͚lƣfzɌ]֯۹+=s79s.\Y|- 9ӧ/[sӧ/yኊ;/^{;+~=엿75gvVV0(X^ =<39ԩΎO_9rd~x&>`Mpby v߿ݍUU#r/XѶu?`JJNĉ?_},km;pp՟6n |7641h钥.6XzݫWNWVNw]FfeHJsgO>t199;k!Cfnʑg(|}23{7ߜ7ZkMl=˽T_2M4i{dgfD"--gVW7WMZ\  x =̝3ܳC55uu{Thk NO6,33ږ\Rӧts*5)+M҈g9./>|yʐ>tp玲oolx=!a̜3җ_.1#tJlΈ_0!uSύ FzW_[?҆?K?|a{o2d{C-]jO v <)KxmwU) Ms ʉIV|B׆<)9Zu](Z={wHL4 s ʣGEt]۲[ޕ珎u=9Ѫ=R+o։hliJ+'u-Z#[pǢGw_yBc%M)}n\s" IENDB`gsequencer-3.1.3/docs/images/ags_machine_envelope_editor.png0000644000175000017500000024366213607210263021221 00000000000000PNG  IHDR?bzTXtRaw profile type exifxuSmr )z=1f7F__&uFY6&#|1M-\2Ո"S$˶d@җc;M ͡."Щo/6\/"5u*^m/’36TWL-:,1.-ebtD(pV;njْ ֑ԬC =]=J'.圀;yARAPvx U$Ok᱊QkOhS i4Od}@92,9cRLq3(?/(ܮF9 Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ' iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\?^ud *7wLL6fw#51IMi4HQq@q؛㎃>w8gTw|}y>_vn%0OBשiVa1>跪"HMI;47c:v4[n{ & 8mH0DN@ZH(i$V+–SNG8`fBLL`4vj&c/UNk0AKmڴtI@qgcSf֧.)R9a)+x"99c"p  : `ޛ9tV` Gf;o /hƩ&`j{{Znr#X of;^۫R y _0hZKwO]"/W YpywGgaaqQuUsSww?8}Y3ftJU\'/d4ܶ jj#"?ϑi&Ny3e$b)oX>)ۋ7ZZ ۱rܹBe\/OuRYD_(8H"(:_~*"bٲ`:}"G o ,VSLA7JE͕fNz=>O |FݯfRf{{qUeWT= =Ӧ8;JU:eg; C9;[g27646h498h-yyM$aDg2rygu*O{Tg2*}Q\^`idFJCQAx9q/UW>ܨknjn1<>I 5Ug)(mk<ζ6Sj(yc6éxT/<_[ѐ}I.(plΐ}|$ ʕ@e`68qLۅXWsgS'o?Ο`ɵL[&  HΟkminjk 各-C^3gM W(uґ۷+dr''1zz:: / zhHY,Q*u$T=z]eSjg'&+<2:/_,Oh3`Z``V>c?\2mzPTdu4wth D٪( JpQDAdZ[իכ" >uB=Rd oyhg^7&&:I= #ɝ8\27/{&^V &ɣD`w6g6i)H1=bz{;;{{Edjj>_*ut$ ۨ8=b  G]fA&VTMCH.bXqT[jIY86xn`@&s7E1"fXLm)[ݒ^oۚN72c/]zd4AS~f)l{>kמWfiLobLZ-Y_S{pO8lI"Ʋ>nBz5 eư02};g(N#pV於v;V\TU:;-_~..lktM͹v?^RR]ԤV32ottPFlnj7Ʃ~~?boi{l~>g?{O>XO=?ڶa0?{בE竪fXhuq.#djӫZvkӧ74ٽ^nYYkxxbhrrΜQ֋qqs焇tʕ̬b/4LUWիjM&&S(t9y\:lM[VS]ݧXպzC^&2Yӧ{yr8^UV]nkQi-6[(]}C\]{f8Fc``DXU]Twzf6x9# 斺چֶF0 G J?g'> >./Wlp񌌋\\ tר(ܘ̡ρj]4z=Ib'P?tfaNpWUV65wuk4kDĬ). D4L>#w֡C}\܊֭;q#ii}g}?aT:hJS8oi߾E/{"N|Ngnn;:iMOf3?!=`\g?XNqȣ%ݻ;(p7n\L(뫭=t(?xͪ_~?_]& >OT("#f&/\fPJco,]c+eW]\||L:;uUUE~":](MHˮ_wWDF{Qڒxfs&?ܹʁ? ,?2T=M599==!3fL  $ .h^~||ve]UUEEAAn^ԩ3;Y,٬Vwww[,bbY,] 555h |gTtBEt17l sqe(5L&czpOUWͮ.BkKJΝ1fED8;b4w\ףr:;)||y,P(LJ?Mb/؛~`C}t,t#8( P ~?:p ;{yJDNrpozFNX_xq7[ȈXd޼WUT"LƷ&t:L! WX,*չj=111AA"eR&tfIIcCsZ+ 6|!K3t\P 9#f+ʫTBaPP̩S}I$ϔTWVWwxGE83z<B_SM %%lNNNMmUUc\Q㮈6]qH|!3W/ !e|5cH+2$[Q^]H!!f{sC=%sHXʆ&'7?>( 1=&CAf%0[z}EҲ23$, u# BA654ͤbiE-&1˝"L~5匾z`lù nHjI pl3#U 2ᶷr9KSSaaVVEŝ)(H8sf=$-[Hxa>tFcSnNvVer}}hTU'OToO k=o! 7F@P0ouuWVki¦D#t0T*rѺ{u=Nk564i9lL$i&EhSFӧminiVktGI,>5okknVhAANrGX$ ]l6[g2d2tUkzTF#_=E剳VIN>;}w1WX ʊ6t9sBr'&Ξ}>{NpaTYVyz.y'pSxz*hນ&RLbΜӧ?#㽭CӭXD;o,>6'- bq! o(,.d2z89飵ڊ eẅ׵\x.yK.ufUOC}EEuMV>e 䰅B4ZZ/^quޮnb m4jmʺnFٌtJ ɬIUUu-/.E>yeHOx{56G.\M:KJr==#4oY\][^ =رS>ۖcZM E``ܴebcB9[)S~/I㋴=瓜E"2kCmmvXNwW,Zllo޶rs|O⥗V 7kW];vgg:'LXk0(32y/ʯ% mzx"%%,\?%%}}צ,nٳ_}{guX6=SkLkj>ۡC FZz}CWf_Y))7>M{,5uj WS{0)G(::J.uvx̛aÓO=Ć sO*8;^_P,\g]ˋ[xXPٹy?>=W߰lNQ/͌h##N}}7ܼ:eJ1 ⒜㧟~fCDFDGxyدcǾޗwntlUM\)(ܛS(Vz^\m(11 LΥ  ;DY=il5r yVFnv+*/!a<^Ag0<= rKQ;TqqB %'O:TUm2h2`6wt8n˓D1]W.{NpaTYVyz. qdrҚVVI3iZxk^~yk>;vgrswPi4>Q lYl,YC(xh(J g[Ν'N9gtJ,V(cc,Xn޼/?ԘԹIlΥG~yfZM;:_ݲbElsD/^^sZ={˟ww{l͚_sqHτ?e_8w|';|cHaSf~ mۆ0>Ի$ull/utE4VMͤuwf{vo`rN pwSfD^"mL44L&s4,;,[%CLql!I K!C i&f;@ i&f;@6֒ ǎ=VXР#"74mMʺ3ٻvڙY];0` &!v՛&SEW_y壿\Out "wVnذlYXXL_ӫZvkӧ74ٽ^nYYkxx5於v;V\TU:;-_~..l,T޽_Ϟ|i4+fSOsKme{IOD,D]]/?~ĩS99.t3g.XpΜS==)JY1('GNH$)"I ۺ_j{xLM#qe0(32yOLKko[rՊcc==,Gw8z+11:ՕͶXZN|?q&wY/^d !! +xz::2ɴM,rs rphjEBeŷR$9tE{?_ϗu"#}ج߽sHFFNe Eg֬կyvV\`\m7`o ~{ٳҡ- =ݯGdg/OXϫ(XZQi0?أ̜1e{Y]& r:Tpn ?H:sl3 >uYsg>V'i&gh &yxzy:JO0Kzw<^4P,MM-f3E{xyZ,}M+q8Md/46sW=h n]pÜ)J+~O~ >tȡS'?/dЄ)S J(jb{tbQzzT=3*v s-}mpx<joly-e>'12YXhU*e+9gڻw*F[^~yx{SlQjRt;‚s6#(0|s+/ 4ׇhlΪȉXbgdܹ?ŋ}}LںFqr{m37pȘ4w̕+եt$b25uu{|j.+~5m'͝=9gNRRHX<҉|7wgɓGdg]Vs8b@b-]/矻|O-Õ5=i.>44YoΝ*f;?(N`qE'3w7o޶%eKjd"i2UVm-~ҕ7+Wzywzo\LK߿y`Sw +N^SMJY|Y~"PcLV{Ҏ}ʯx`ÆMlmn@"JHĉM9Nuwg裂7{嵴65^Y*>^x3\]&4]EE*+55/[pWL4!2-#bAd5O=ˋ (NV]SPp|жmK?6x'XMɢT_斐bar\\XhHpdd\\T'OQFS=iwefVtp=99M?ņfLObm[,]]EEj$u떧s8ME狋[Z(&S* 𰨨ӓV|_Gbbx쬣Gj ͽVd6h4 Rg3خ.gGd2Ao4LW({lL,s5bQTAA,%\'Rt񍿚i~LC{Xn^y%EGO+MB LFS],-StL@ )K=Ϙ4|Sm0wHsXqQuuccw$EG/\jSc\mڴ<1Tck׫lڴk4!!z￿7d"~iӧX}f .fri{v6 -e9i͖:ڻ{F`lzlnm;_XTJQQkyy2\<**(ܶ$Z/v]rtNܒo]'O^PSܬ0>AA4Jɮ;x׍Ҝ7:yhtyZZϝEqv]dԩSY,&Se厝i-^[U婓$#,l֬k֯OJJO{8#\YCܜCC]nݺbx|Sm۶l.EEnАcC̙Ww7|q1q|{4tDũ{a .]Nu[kcSK+E#LÇn}/_pᲥ6,Y"9rG׮~d>޳Ͻdwݹcf¦M?QLGl˕J2;[K*<ù,^D$ƛ`42 T. ,[;jYٶetV5ks|ow-Id $D~ aaQ /^d˨DX;otƍ))"NrBf֡3j6*y1u'O*-r_䡇2/=zxsfC[ 1cjT3xU ohHH09dR/^<͈x)$4=fYVV\,27n|h㲥 |-`pPx 59{32u U󝝇n##Lqv??8q̙?DN \.+)#o9|77G)O^$R72W,ZHmɴ=^&%HXuwV*/IH dY,&led\\SBL3#9l60[S#VW׭3vIƦ‚82rC$4t\BaXXT/ؾ$&/Z<Wx`+>h~vu5Y^{\ҙ-dK( 4>xZgXL^MsKMmu KRvhͱXby}MQPooFFCuC3oנ?>3g. _I>ttO=6FYPXtz R7tݔ/r!٬R?npnq wOg}>pn>))nZDDh̑ù@th ^~ƌ&%̟?#~߾eM&StT3idɖ`WH֡pnF+,,ZWk~HMqAUEG?e&O&6vIA--k|^W]S^Q^1aN2G9'|IIGgr-eҏAkǻ`Pq9Q̺w*9xZcf+>?U|޶5OUK%ß |" wŲ<^4]WY.^lni.q]E9(n"1VVޯF')?BeF.aM3Ms5=~4rԮ]dZ,K**©S{>( /]HfGL7$ӽ-9v$+soG8+6[. 1#)i%K$bާULL(om:](sJh~Vo2ڣuSOrl[e*V'({ver:J.aHcb.vu)UU}m6 nwl&Sm]Vy[KKo,E1E%% 89Yk]h~ҏ  y[O~4o591#3 mg|o]C$= %;dX7^NfLnNӪzT*2}e]oӟuf^C!rc8Ng0huMsJQn=<*:_SjU_i).'Ot2[zpߥC* ~=jU87у_/\(sQի&7#k;lfZh>BE Z*t͍>X1xg7gd8:J$H, h4m߾}/K.ON寶lYJWS[}={HES{y h,ҏt٥%(=~,_wi^5|Xŋ|vޛv9a! a> gjo6K*n]Cn~裓H< D?I>5vtO,.S\Ztё̽iK,LwӋ d3f,Y83;o￯-[Fruɓg5}d.C`n.n4Pƙ# }|gvr(&I}ϩo-`&3fw:n{e5CEeA~qJ%DFFa 2tvK?O&([?&ge~mV~yLqqf0zz**Ξ8{lvr&=iQtmMp&/HMs._:z4=-'wڴgIH1+rsGѸ|Ӧ89sCwWcCUeGX򁟿^}ԩhh4O*uuY(: | GLMsJzʔ3w?KJN`x_wc`wn%mll/utCY!X}4' &hiۭHHI\ɲ0^' p#0yf 'L`fb1IY[qؤO{% wۤ=Ho Պ#  4ein l#'܉+[I3VVN+7l6f+ w"04[ x}np4N+i2:;::/h +~u4ӃVdD9uIsꓦ}=j.ɵq5eIVd[R+I\A$|g   Swfp?1/)GD=(M׈ڣHtzE"ѱ.Eb9]"vt֮ZeɲFc/;7<\Icɩ(_n11h4'wvz#kj"a=/o-}F"v{E$WoڬȊn؃gD7 6֦XXh5) Njo"WҘͅEE<<71d_`(TXpI-+ϖc++cLuV\WdEV7w,oSG$ |MrVl6 ӁL`00KM-IhlǍ2"+2tmqI^GV!w>[qݒv@^WdEVi!OA)'d =Gp`vJŖ`e@/Z.NʕyyV%GKd?<$lզ.JbRt9F|ݧ8eguEVdu:Y>8mIP$^njd]wʢ"^f)Wz{[t.׺fGט̓mm=|~?ιl>[Sz[ȆvY̢OSTWRNE䱱Ζصpz?0<009g}NO_7Yq]YsVR)m#+"+ t;wr+E>(MT::7rR>uɸBX}b"G3k]1b^nS,ϬȊs KOܢPtvzZԶQni3=DnQ,;6faoıdEVdEV6E%b -dEVdEV!+m&u ?.sYYe_VR)m#+"+ Dˀ6:NȊȊ/+ܶYYfLsYYe_VR)m#+"+ t;wr+E>(MT::7rR>uɸBX}b"G3k]1b^nS,ϬȊs KOܢPtvzZԶQni3=DnQT$:VY3q,YYUfeG7x`M%G(u@g,YYr @0x\uBVdEVd}YH綍ȊȊ6$/LK\:!+"+ʾSsFVdEVdE @0x\uBVdEVd}YH綍ȊȊ6$%ʭP6QpLI% cxkHtluňM,zM<"+Jϵ+F,=sB]%JziQ۶RW {D]ҧcEqPX6faoıdEVdEV6E%b -dEVdEV!+q1 YYUe u6"+"+L@KX h3S/q넬Ȋ*:LmYYm&Iq1 YYUe u6"+"+L@s(B]D)s3)'S+ԏ.+⭍~4#ѱٺ#66̊늬*=>9ԟ- uIg(驧Em*J]1vJ6㏉JtAEcۘ=ǒYYeVV{|TrR? )op |ƒYY-S\'dEVdEVٗa pnȊȊh3H-`2ͤNe"+" @08mdEVdEV$S\'dEVdEVٗa pnȊȊh3H}[ b.7dEVdEV2TFn*{$%|UzCGGKsGĄFv[f:5޻mmumhO蘜cιkx(kj4;;^9L '[[ʊ늬j)-H7LۘRWҘͅEE<<71d_hIFK:vZ̺9ϽPPZRRQoM"+YHN"f0=D728vvl0:7ntMVK9Ϲ@@3Ԗѯ7f˛YUg u۶yI^F''A/Pxh#55uxѓ'.^ :n|Rw&׼k"+EKy:0= L99&St/H ɉp8'b$G~?.sD5~gXβV^\>%877ޟt[ yyV%GJiQui-?_m-=p,8Ȋ*ڣ<ԦHdQL~[3Ȋj9d u2ͤNe"+" @08mdEVdEV$xfR_2 YYUe u6"+"+L)b"+" @08mdEVdEV$n.QneJSTfRNʧ.W]W[hFcu+FlbmYUz}X7r`?[.QSOڶUb#>m-DǪ1 }{&%+"+ʬ(,=(.@Sh%+"+ZYHNȊȊ/+ܶYYfZ"e@I|\'dEVdEVٗѧ))/7IllkkwhΜ/:~cm 06 MOR8<3 +˃H(bqTgrR]>=69GAp^=DoΑ5Ǟ%Yr(%Ǟ²RJwjY9׫ n3S/|/FvuRTC?q>yyٙ3MnQC?q'/\O*zy$0339)Z@$~(3щ׋ ?}T\Q~QV]}q禞ŋ =+|`0Y Y?+i L_|f u2ͤNcmKXb$?z驧Em*J]4vJ6ͤް-쁻37Sa]?ÖSzc}Kα3x''֗~Yg^<vs+ʾ|J4= KKHdQn:Vք7ק|-_!~G4YYgEVU%+.LK\:!+"+ʾN)mȊ @:/LK\:!+"+ʾSsFVdEVdE @0x\uBVdEVd}YH綍ȊȊ6$%ʭP6QpLI% cxkHtlN8xQF867byfuEVdkVXzKӢmrDOD%:v"ѱm~ߞYcB{[N۷oYU:gG7x`M%G(u@g,YYr @0x\uBVdEVd}YH綍ȊȊ6$/LR,qrKVdEVd:f:Xg,YYr @6@ziQ۶R {D]P?`\>pGA&(.@>S^AE(ƒSQ~C*cbBw׭ol[+/j\[h4'wvz[ܽeӭ.++"t @ܴV%;>'y-Qܶ6Y\.׭1M&rdr8**mv6sosn3mI; SdEV2fP(z1vun!XhmmnvqfdR?5ޖG;^^57Y-ϬM{77=׿G?ϟ `pz:zKfȊ @%ʭP6Q:VO_ڎ65;<#zupee] LI% cxkHtluňM,zM<"+Jϵ+F,=sB]%JziQ۶RW {D]6㏉JtSocLKVdEVdYYQ XzjSQ$J](m:S/X"+"ɀ6:NȊȊ/+m&Ȋ @/LK\:!+"+ʾSsFVdEVdE @0x\uBVdEVd}YH綍ȊȊ6$%ʭP6QpLI% cxkHtluňM,zM<"+Jϵ+F,=sB]%JziQ۶RW {D]ҧcEqPX6faoıdEVdEV6E%b -dEVdEV!+q1 YYUe u6"+"+L@OHXY]S[^o0hMM#l55޶z NOrYt <`(/L!fV&\9̦"wժFco# Gdf.\ٟ?/2NLr(49'>hfÆxc{z=?O߇^DuuYY哳ddOlL4tR"GzuH4Ÿ ߦ IDAT>W|_/FcdVp81#~'o|cf}oʿ$jK6ӒZ)%\XdLFcĄ{pdrwp0*,t8r~JNk2Y\/,6[i=TܶwcJZKJ**ѤmVꕣs.+K4%uK12єRU084vT{А 踉^!RhL4j>?*LU+ʜf.Un';bG]r8$idxeպuj#ʱ'H$NŖ LK&L.fs(455443s^`NgZ$|P0X[qMnX__QaWo0LOk#9=u2sq?v4jK1qsEe\9`t8]9]^o)[^~¬=nWȼ>쳫{p0є(y\K |բ9UΝ;wWtffZjVϥaHeeA w -a tp(-A͘\2B>kd\cCᡡÇyG_2LRsvss+e5:霕rΝ?^SS+{hM4k_o")S$+d~A;M)^WV^,k?yfv~?{x꫎},:^/)R%? vV|~Qvt8Eun&޿W]W[hFCQQc[֮,v8Vd̴$VTTV:U+W<7є9Ͷv\ǽ|VyzZ+gUTGxYiFG&'B!XXL&A=mXFd|ti$JfꕓAu-s85f{o}E)WH2H}Vc+*KJ*+N0K .i̽aEwiNOsMի6L0{o_zaIjDĉG_}C瞝;|ѐ-C!GYԟ- uIgKs˻$2v&=|~qK:<|]]㑈%a^񴷝iںz^y#iu^J#6z`옶H8/~4>#FJJZ߬ns1Gה.\=<l6啓ƪ砞K;{cp<8{\HgfأG*/R]:;+x%~Mdg|muv34f.Xu%kyf%KW{#&:.NNWNp蕔@WB?0s`@+*j''%id2V ';4{ .wIגɨ*4=#Rz?ZX7tww\)yt}_zo86Jw_x`j~?}LbrnB˩kjkW*+ZŻ޾ֶ'EWv۫oڽ֍2''[ I~ pF5N!<p֭oljTSSmmmz{g29UUuuyy}}Ǐ??:c)rWT\Yvxt"Z[/^TG{{kjkj޿x_A]ت]=x[FJ E9l]P(: 'XJOM56Z,VkLI+geuuuI$+w56zhkSR\f˳Z[[RJv۽A]#*(hXn]~~oﹳgiiIIY\KrgMGOJ$j>RW}zuz#GΝ?{W_UU4?hBg{ݮ?}NgH>OsOяߤ{啕eey[|'ob?33ʹ);utYmi9z2O1}~q<0p̌59i}q|&J-Hia:Wٳ'O}Ήn9=}F&<6"{-z{Qz`Z|m-DǪ1 }{&%+"+ʬ(,=(.@Sh%+"+ZYHNȊȊ/+ܶYYfZ"e@I|\'dEVdEVٗa pnȊȊh3HNȊȊ/+ܶYYf?o)(Ō]nȊȊ) e@~=ݰT$:V7da48vYDv{^11h4'wvzuƺݫWLvt[IKNE u_[aí协>}y2L*obV\WdEV˷p 0xJnceeE<<71d_`(TXpIqVV:+124fsaQKKV1z=jΌ늬 @` d^az:^ ftYtstQ[qMnX__QaI&g3aȊd-Yu ytF;:Μ9w{MM'f?t䉋ٴ{v/sp_3Y'̏PTԒ6qᱱsg{zӁ`d1J@Cp`v\ͦ“ãpUŢky_Nʀw3EQK\:LqplO:]w4=Òt:,9%z348ߒh˳Z-9V.WUʕ&.ZJ99v[~F x(v55++o3aȊd-IY\ug[_]c6\/7L&f%|euú7(9CC]j#K/+2LhduEVd sdCs #ߋ\'7"5ޖG;3ݿzGmnYq]Y17}6"+"+L@s(B]D)s3)'S+ԏW[hFcu+FlbmYUz}X7r`?[.QSOڶUb#>m-=p,8Ȋ*ڣ<ԦHdQL~[3Ȋj9d u2ͤNe"+" @08mdEVdEV$xfR_2 YYUe u6"+"+L)b"+" @08mdEVdEV$>OQiB}gStI]>X[ Dfxi9G/~7̊늬*=-H7SOڶUh#E@%Q$J](-`h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3 h3*w;.o~'efU6r˦Nhiij$ر/l~ͪU=Ж-kGkeY=lXYlϐw3 h3 h3 h3 *k|Bogxʫ[mNgYiUچե%99ڄ{Ls󹳗zGFFo-rXjUuN٬H!xK/4_NrmGキʭ/+}h3@#-}cMv{]چ[6֚~__kGw;w~{ixTk۾Ց&'kjW^zqf3|gμ믍BwѰn CPHlUr+m$l*tKd+Lmj>54x`MA]U,6^yΞ=rް s5IXWlܰNGnnt;r(y_Ȳ`ͷG 6(ZL}s_LE ʣiF7k$tzFpXo mȲcgΌ 4+pKN۫VnذVw%7/b15wvco=;رa]QhRݼW fE$B)za"ɶÇrrV~Յګ6JWmPR|hzU]Mx/޻ZW{*^d:fE$ْc$Yy'wĒ@`ʫ>kaBCC'O?޻yymr뭥%W4oZ~uE y'&Ԇҿ"ـ6,XXXTdi!uXghxtT΢kvۍE"^ ?(߼yGB `$ns ey閖髷 GΝ;}Rw8pv֫#33S]ML}wmn:?_+b{&QRj_Wr^兹 $n_}mkttӧڷwo(n򊼼`pxT˙3#6ۺu;XUwuK&tС7á<}T䈵33ǎZ[~sEgd`p`3i-9Gn{+/?rU[-.z;;Ϟ=wFt} V{EL$CIMoCܓ'Ohk;zPpd.(t:];6hdžu"5_}%ɜc۬\%E3SO{C!ޤ''{f;y6wmmmmSހ_||wܹaCm!&N+HO=-jVQa(K Zg(G(u I@ I@ I@ I@ I@ I@ I@ I@ I@ I',mz{D+fECTz(4h3@(%`0 ;7y睛k9 SqDqJE$ uh3@ZSL/(.DɊ-sk w~Iԇw uh3@Z;pPbQjJ^]ƛvER) M](ʠu"̛:֒#J'H͔a. >?ىS>Llu]=|tyS<;TowD=CTE) MMi&syrdd+>6N(BmW"a`9G'D.3K3774.vWx9,43#If"OM* lvQ>"7 _|𡆵?ίutwOGG{{$"˒D2@u ub(uRcMHnLVQ[Ji3erogg4&QQ 쭹dI;֕UH@rꕢ Yʽ7P0D @f4SAQGjH:x@ԶH@Ŏ3 W(uKTB}7# u? uh3@n6](YQ>XgT8cw`if>FWW{@`n&$m&$m&$m&$m&$m&$m&$m&$m&$m&$m&$)k|Bogxʫ[mNgYiUچե%99Z:d#$I8<2rjW_9v[T~^U-6ymu陮G׏O=Ż@޶M'=l߾ia0WV*+ٳG=_[H?fHTWׅ>Y.-_veFcIqCڵeZhDžѱHd~{?m&$xGG5i2]+YZl/h&H08B:d;LI#IY,ܼ\Vߔ/7?m&$h$n\3I~N/&B?m&$FVMsF$a!$F sk.$nqO=G ,9fI)wrj*wd9򪏞Zz,$͋:d?LIPXXTdixÞQns8 Km:d;LI`UU<tKK[ãcΝ>};r8WV]V噙Y>&I:d;] u/nE@!*+,قK=gg뛚HZ]DۚNKg8/oݺ6vZ+PҥC~/S##y+W\~/b{a\aQK:DfH./UYRj4̌ tuvw˚u>va4Ƽ)81;>n0֮(n'cⵙm(uŰG%Mm*9DKś IDATz"Dmz{D+fECTz(F ce0Ý͵_ѩ88 @  mu]dE;_$ûEl@ 8(jED1( n.yMQw"U\L.\eЋMVDM^kl@r-w3í?Wo9|O<#.6mozFG)NE @v뮂ޞO~w>)Mw*S( [IBQw.ʦHSfDN|PmZQa4& b};qJ6]C&d7?6\~V0:vJݱRf :>=;=|ǦM$InXCSSZ\^᪜pS;w ]UX$n^p򄨔Bܙę\ok vR N[dI2'ymRW-M@(]T8ǏuuoMG[[/ NO 6{YY]|={wca0կygg8,?~GFc0ܲ|smS͑HbGZ8<:rW{_CC~`^}=cuԓeO?ݻ.]"_5w~S{::#Y]`d]XX.vR'?$VLVQ[J-̥ӧϟDVܽ#^b =7NqEQ(y;"Q۶"U 7qff`}䉳g::ǽSSS^o*z3UMĎ.SS#b&I-9)j:zxoo({]ev[O7CbLJD{KFR:Ax@%INByT uu~W%wQXPXP`|k/<[ Τɉ h@lX֬>6=??qyŗq+[,n6](YQTb:Tqo߻u3 kn]T_oINg֮__bx_~cں͛5)^IziQsd#Ep6E%0$m&$m&$m&$m&$m&$m&$m&$ ѱ -. x:tVUmhl_]ZM{=g47;{ghxddl; "GU6ZUt͒tyT$4{ŗ^jix{\mp( I;j[n]s u$Mvni^lE @޶M'=l߾ia0WV*+ٳG=_[6}&IK߿!͍n]Ue99G>u͛FSH!I99%eeˍW [,,{.riYkc.3K֮-+jF;.tvE"ٻh4]`6/oE6ЕRL^1Pj_D -xGG5i2];YZl/h&H0ޝ@uvFl$/7Q6Rmɔ,/=23͸i34v63ͩĭti:ߜ;ؖdeZ IY$E-\$R@)\@ި,Y6@9k-ԏ^`0ř⮔QP0Nz^i%|G&6@dy|7:6Kl|[$YxUKcqq,w\\$ᑑ ]=FE\u,d&Y~W_=t(ebO[rs++KK2#s5D4IvE5^Yi O,w;~ԩaYZrEVC%I'9yY6b2i4wv'0m=55k*+DI#s5DHt FVV'-jw[Po0ܺpxtᆆ>y޼J'&j 225g+.,t޻m۱'./<xG:fIdM$1ߨ߯蹑,OL}f4Vn-llػ/ޖ`t78y3=9;gʌt>z݇ `HMYx X-'ϟok몝 ę.WNj*%'WLfÞ`Z,!ʠMNv]h> ڤď7IJK7nڲeR=7oɶζ6ob\q{RbfƲ6UV&'}^YFDi##j]"I"-p6 Q@(f@P3 Lj&D5 Qg `nimWERH _pgP30ط_`0 "Y1T)N* bR0f5jjUqzU+EdՏ*#<-9b+"LL\3 Ǧ>"FdE4Ǹ~6ΔOL0'@C1 7yj]$ wGt8Ob%e=vpdEpZbP I&%Mh 귙"vL_l1~G^ls|{{8,˒{:HF;w^D=x3 6l5EfLsLaAVK[T SaX>WWGOKJʮ/)eeZ|Ggw8e9g Q3D30j$35%2R\i)F3x.^уHǟ #XGѱpX,fb&1IZm6V+cqY챧;a 8M4i:Htzqv0 ^ F6l>j&(ՋF#+uӭN#0n]\&I:]dφ@fl$YFߑ Ozfj$dl0}LQ`#G455z5=ٕx'݌a먙as&ʲTKss{rGB3gZZ/ɮܜkr 69y4It0uM*ԛEv&vMeN}jֳ}}~F@{[C#͞!bڪ幹V? vw־u>j9y-(??yy-Pώ@lQX-]"LQ٬9٩iƸ@`vwu^5Y+V(+s%7d4;2b0eġ澛LK/]#1ap5TJNQo9pPEj&D5 Q@(f@P3 Lj&D)ZDz{DA,R(aLf3& P]U]]]U0+:IDL fj&9@-*_/jVE\qD66P6@0<$RX+n,R޲gEU]0u1E*BmS>bQdn@tE)jk7R=1=^ ?znNǜVt:{{zoL7lV8vT VI ge"v]MssO^x>Q^YV^Vʜ쎞W^),fRe*ԟ*abشGD6ֈܵ߯ƙ2r ئׇBcco<2*Ժ*1I 9xBdƿnaTt%Ñ-MHtIaSD2ڨB`nm7"vL_񶾼;|x7~{z{'II͛¨ȑ?x{G_o2-]CO+zOn?v  #3su)* ǎٻC[[{IHO/.ZQ#_{r ]x5--:ް`*ʯ,jk}7iݟ~j&IȳyW~{'[.?xm`&x/::]Bh΋oaUL "kV?f :yjjo>hBd__sҥp8=NMu]ؾ'?ޱc*t_מ/:gyη/~?ӿO/\h$w/jwwN7?Ħd3g2ѣ=--gOV?{-P3t졃۷o4=_Jn8o~uII9\_wl PQ^Qqhƺ{t *+fK*,t^|g]om"u"HFkjjjljT\' hE$˗.տuΌ-_?gnJOAr=,Y ??{gm xo~sjra3^Q:?t衇,ظѕ<6p|o}TrW_W_q˗_}ceOwWV_-Lv>|pguUS>tlk PQqyE(Dd4޳g*f~/SAYZ6-G>wjj*8`3gLMw47W^*-zg0^{ tL ]RVTd6W t삂 vLjk?IKdaU+W~o_\\FzVvKҎ\]>.SΪZQU766Է=bbYzEII\DK>:c"m;V'r5"* 7]$FFGE!o11Y [?oO$ Y~8YI@=x`#'N:~o?1 ɮ?EMO[:/wwkm [[.}Bql`V< o)"ENz@KAE|pӚIFdjA3rI5ISHR\yd?_23n6I}>AT;K>q+]v|/HU{OކDgG?7o|eV,.ں׷YYc˖=x~f˦s"gN+20*\)i uf-)?x^nFz8vWZXpɲ %PQQiY~V|`[O>9_' IDATd$bMM w쨭=|ݺkfZ8<0xsZ…㏯YS^~eGx9XYRoUw!3ikMM~≬H$u]qѕ0'`V|A\zظpd;#ݽCN fV7>v>}={:;ǭy֭R]|\Œ:9ԸwﮝV'&</\hi9v?d4j Ը?޷cZݙ`7ME G=9Njk?yG :X}yw| 33WmzpO{뵒t;wؿ7m,*R?QX-[LvhHIXV5d?s:pcdĖxɖ-kXOwvZ+WDc'%XxIF|rȁv.jZZgb~%%iiROg\Ys‰G?{oho CNgnnIiIInn+;{~iAa\@uu|txCkɹ l*+۸ښIy$o|67(>j&饗Ȇ!HnHO8{16կ 5բ 7RK$EdytOj56%e˖/\@E5,{k?j9J/Q2|1wm$>C:te6J&/Lq65e/{F~DJ rLj&D5@@4MMy;::znϐߧ'] K槥UB>_OSMMgNw ]8c|BRrfƼy+v%LW>53xmM##|u|{r;j&P袷;?8pQ\\V~"i|n~ 6-[j4~;{uF/ϟ_PZj4s--N=kp0ysMMyq S$ZlYn|LLqNNwgXEQ >_[{}CScl\~bWޟJ1v|kuu=鼱$Y,*oxp%[WA9yfΝ[Wr*=]- I2iiig]qX,]]>YNK/)-+R\f4gjpvFESRӕ{m̌ CLNƃ+K4 }Gb5D,x^p>q&S+-hF}ŋSSѸ,`0ř⮔QP0Nz^i%|G&6@dy|7:6Kl|[$YxUKcqq,w\\$ᑑ ]=FE\u,d&Y~W_=t(ebO[rs++KK2#s5D4IvE5^Yi O,w;~ԩaYZrEVC%I'9yY6b2i4wv'0m=55k*+DI#s5DHt FVV'-jw[Po0ܺpxtᆆ>y޼J'&j 225g+.,t޻m۱'./<xG:fIdM$1ߨ߯蹑,OL}f4Vn-llػ/ޖ`t78y3=9;gʌt>z݇ `HMYx X-'ϟok몝 ę.WNj*%'WLfÞ`Z,!ʠMNv]h> ڤď7IJK7nڲeR=7oɶζ6ob\q{RbfƲ6UV&'}^YFDi##j]"I"-p6 Q@(f@P3 Lj&D5 Qg `nimWERH _pgP30ط_`0 "Y1T)N* bR0f5jjUqzU+EdՏ*#<-9b+"LL\3 Ǧ>"FdE4Ǹ~6ΔOL0'@C1 7yj]$ wGt8Ob%e=vpdEpZbP I&%Mh 귙"vL_l1~G^ls|{{8,˒{:HF;w^D=x3 6l5EfLsLaAVK[T SaX>WWGOKJʮ/)eeZ|Ggw8e9g Q3D30j$35%2R\i)F3x.^уHǟ #XGѱpX,fb&1IZm6V+cqY챧;a 8M4i:Htzqv0 ^ F6l>j&(ՋF#+uӭN#0n]\&I:]dφ@fl$YFߑ Ozfj$dl0}LQ`#G455z5=ٕx'݌a먙as&ʲTKss{rGB3gZZ/ɮܜkr 69y4It0uM*ԛEv&vMeN}jֳ}}~F@{[C#͞!bڪ幹V? vw־u>j9y-(??yy-Pώ@lQX-]"LQ٬9٩iƸ@`vwu^5Y+V(+s%7d4;2b0eġ澛LK/]#1ap5TJNQo9pPEj&D5 Q@(f@P3 Lj&D)ZDz{DA,R(aLf3& P]U]]]U0+:IDL fj&9@-*_/jVE\qD66P6@0<$RX+n,R޲gEU]0u1E*BmS>bQdn@tgμ?? ii?YQ(Iu z/N4c:m+W:=O=7 QW6U+P;* $3Qd2b8kp}qϞTIɺKde9 C`08ua_'}><-66W D"T f66>65"3w9\3C]z7^W-_XL9+-}k??f߻vZm)3+'7 M=xeTuUb3 @lsNȌt-.5vK#'[,r1+$¦dQ^o,Eg|y!>_{Ǿ;56vv##z͖YYFuuJ$|>z~foUmhh׮エg}ŧ%^k`hۿ s|OWh {K[UUpׅcᡃ =^`w~䑯=y…d޾ۿ[Pyo|D|מ_e̿ݻ?=ukhh2`/^b˖LJ/ޞ#;rpXgǹQ`&x/::]Bh΋oaUL "kVoQ={_޺4ZQqFQQJ17:h] ZHpkiz5=^xa֩_%VVk6%%HwOKp~?d% ={۶/{=Ws;,{Gjk_͛߳h 5?ͧl0 {Oڳw{+_>pvV‚Lŗyun&RW/RdƦF5y"0 <6zmjj?o~WX.)-YPdLN:2ҳ^p~미hQeeGwv=pnNa|nV=seZyټyfsÇнysvV~@$ E*Բi="wSSS  7@$lL_ dt?~N^벸t]deee'9%} SH19tPdf{oٷ<޾cn71KKWذᡇzK;ٙkӎi_$U='oCMrr3t~`2seS93ER״b3sPm09ٕe?>1oz'h2ҍFj5Bs.t+ !؟}-vHݼ6T x] 68z\Vp=k֔_y-Dvl9CFW\t% nQNw屣iҼ g2554qmm Ƹ+ 9UW/[t}薕rr PH#Ez-.=#;;#]#۷;VP4I2R\94竫{_*52ti~-~b޽;vwMR2"sO M&g3q|={^}^ҥ1jMN^Ǟ}׭MN|$\QSOif5=#hOiݚ#VQSGza%;菿[|?Wٳs]_k),\d}@d^3G<"9"L~Hrzˁ"Zf@P3 Lj&D5 Qg MMM}ng.WzZ^^Y…%RfC!ԩ3{.^FA1>!)93c޼EM&Ipi8۶57Frr֮{{;{ JB擻wxåKGqqY=L֖ }7lڴlYZ٣ʲڶ{RXX?~~Aixu:uȮ55e' Ndw̛jeyf2I29:ݝyGb5D,|m MV^^qŋ]z~^N+`O՝>[T Zddf,\!QÕl^]f;wn]}3gҒth *$lv&Y,uř~Gb[ bwuud9-JsјR^^V{wtvz]MIILW2232I39.fh/fML`z5Ù⊋ǙL)Sy</NMERh$gRFBZ:zݧT4qx8,IvmidmVV/űqql3 GF.tu\122-r.I d9?|^}С@@ 5>Al-+,-LHrUL+[$nڭ*ItzeQ0R?틖2<6qSgiYW$pWV.^glɤ>EOoO[ٳ߻´lHJ%՗eL!I)4Y9r[=ӷ nAqpѶÇyo(f+t\\jʼԔ럝SX0Е{mǎlnj0{Z/8 "$I&j6I,|~F<1Ѭ[mF`ppcGmի,IK6&$2Ag%P@,fII v<2TO(ԐgphdWRa̪5,P}URݹw vP3@$as&ʲTKss{rDŽB3gZZ/ɮܜkWr 69)8{>c IDATf[V*,OrYq-Fh훜3ScEp6D$9%.--=]-- V,_eMM l>u{n8J&޽`f[a, Ǐ{`kĸ˵`EI{=p+i-Dgr56`޾x[nNNvjZbR|Ţ>@ggtk+++3#wj&!5e 7<`66<v*gr&\9˫\P\O_I2{jCv(.79udKg(k?$f+-ݸi˖Kܼ JJ&'Z;;ڛqY6I˖oTYYT,;p^zYd!Hnuv$'8(Lj&D5 Q@(f@P3 Lj&D)MG_PI"|f Asb~7fŸSQ8x`IL9L0VEVW?Ҫ(S+(&f&3 fDjaŭP[ `&p8RD z"|ǫϵE1[3LsLw^Dc?1'@Zy_vV0݌ZQfm™(|]1sWfc~›oh̲RUvGO+DR32s0p7v58SfVN76>1J6xeTuUb3 al]WwlQC++NI3φ@lc5@dhwrZzIiYٕ215,=Swj0uL =W#9))OɔJKq85Qsԝ6b5@dy|7:6KlY,7$&IV-fj31;1l>j&rPHݴ[D$Ii:8L; nft0}L$B5iDNg0ܺa"$I&j6I,|~Ąߧn=Zn,φ@fј`#G455z5=ٕx'a먙"&I{nn^3QZݓ>&9}!Lv$$\G뷤E>l:ݦErMc"p;ĦD>5szZپ>_#iuayl|`fϐVQfm\E kk޺}Gx_T輼(g 6(, .j&(l4c\ 0uZ/t Ț슊+VV2M]1 2mh?{Fsj&饗E֮Q0qZ*%'8("fD5 Q@(f@P3 Lj&D5@Em"=" HJ)T0c`Q3}E `*RNE "&3 f5L[YRDV\HLQ8xCE(LfQ,W~ZBWoٳWd"*.:Ή"K!EWk1c2 L`_ݽqަZ[z_믝hwt:ضrӏ=~}Euaz**{o4n)dS6Mm4 ܙǿDy^޹sasfXF6}kO(Z˕UQ#r2Wd%vZ74fh4mɹnʰP.$f3|dF py!B k3]b5FQ&\ެ O^\),qP07gK~-4hml(-ʝApL4/*]ffn3k3˛K B99 5دx^ %%_~btu.jF~ݺu76I$I#n'alm3!#c~eK^nYy}FTzz1wW/XP?~&SOOuMf۶nIە]RR[ޮN>>S_r͜9 rW1;a;WU76vvY[ۻϛwM7ܐy,{fw;AЕ`aM]eeYh2Ipjosv*75UT eY<7G(Z˕em&GƏj_է_(-=fŋ'*t5K6GXpɒjm9p`Ӧիy嗺ɧn1!ףsߧ!ac͛7qJe0JM]j7%W<…AƦW;6v9sn!GGW&D * 4WbjlwؗPeUcSgZѨ=>^aq,@ w 6mؾm͚Ul =:ziΛ;oʔHgT pff3 }P,gVU-Te+,=`!fJmllmJ*0EO<1^}56~yFl+=kpwwuquqq6ecvs=mҥ׫쬮9t(/o~o^Z5/9>l*pP۷ 3Syxz 0L`FCCeV_7mWiٴ\3$giO9*,!-?>&zM֓_Tr'+/5k* ј_eF~hWʬBYѱ[ii0aҤ('&T>~^ZmAm7*,qr+ֶ}/ w7BOooy;G8;+mT*|i%VܹgO^^eekI"[YUUy[6]jj^^kA7*yýeCE?{u{۲y۶̖V_߉b`;_K]e¾(14ɅIgCGۧعc B [Z"DFFEy{ wrV.trl+s11oI./k7}=0Pxy 'uWWUwgw!hrs;19S{{_?__'gD{+m3MMͩTzzx{:H$ֶ6NW7 f\QڜT b&Wk4J*[;{tR;;{{;l`Motn4vvTuu*侾g\̭`3̘Lz3D*pՖRV‚zpa1[^{PGKdtLB{ 1ˌTje&$Btoҙ^"I]ZS_ok;dȈё %.3RRUJ&GݭќnקQ[٩4254Ǝkc.Vp13(nnNSgGcSS\ZZ[%g'w7FF|ϞKN?..k$]̭!fpّJ]\MƆC44j|qpaamA˱L&SfV{iwBumy#GO6.2^ki.-9xС6'3D2dkkYömeeqW\1eJXƦܟQR75656Hd*[Wwwmu3L^ÇO:m.?`eeiivV]#0hTqn'|JJ['g'GJ789TǦi5dۅ'Tjo=sWwu]F`OkBM/塖Vpj݄;ryJrJJJrYYYAӄRђ.?LpV,)S;F(ϴ3jcaz 凘 ʮ4f23y+Key呟 5gP* K(Jn-3YoVe+e-~4V{w߿{d{{//*1OXm]Ss{~FMlcƸӍW.:lF0edSٷf PF d6xLFcC.(뢢&NHJW(N|z^w(@/?ݷj'o1Cs]ʕaB]Hdgf>Ȍ0xzz{g5sPZq̤7TWNoj_:e%̙. oHy'V_Ue0޻|J$rkJBaySOnzϽ? Q.tܼu?}9eemmFOXذa3f]dI^'NŻTu1CWӺ5ueeFG] 8ۜb.doBY0,k398 5~Pg>]~gBio|1Ӧ/^<74TY[WXX\d47oI*R\+5u}U+ߔH^# Z[{zL}ϯYϙ}}Kodg'*\ml=~rNW]?9kܥKgϱh*+7lH]֪g)+3|/a~~'M8JJ*BVPP_o,- pVT&G/qcNo1)'$11>CYogWUϛjm榲h.n>Ǐ9ud2uv\*-~ɿmt/~'x֮)`[o>֖܄Ulf \cVuz&ZG*qt pu99`u66>RYwgWZ-KJcǎyDRaӧvs/-=\TSklde e:kYBjxhU'76/#ѡʪƦNFQ{4}}Cdr77kYYH$­z{xmTf3 }P,gVU-Te+,=\~D iT6vWΞs͵f8M2x|'AK66*Tm!|bd2MD\æ  }P:3ǀ3˴;ZMhlj߿/J&KHEƏ9ضze2K84pe֯?ImaC"%ݱcϕU-Z|Ked4489 z??b&L?V 3IN>޶J:+>ݣsĈ{۶mPVnK$n'o@Dn IDAT33CC'NJrO@/ON~Mc/0a7HM}W^j,6-.C"in*(زw'%ݼ|Μ!GP(1a-W]%o~yӦO?ΖI|}’N]ddO5_n+Θq-7,mnߏ׮䓗^JOWLӍxUUl=z{}6l㴴^[[OϠs/wN˻@lW_; ( Yny&呝b" " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f b& " f Z(g1P4  b& " f kt̚hhFX9: )Ԍ~ 1p Je6֌#P~'gF\Y.h?胘B~B?@~rfL%_'ej6Л'`ə3aiyKKvog{B@*p~tK߆Ng0hᅰ{=W/1}V 2|swF >>a?f?9?h2}EEO?{mSةJ!lJXxDӫ?n뮅 8U?ij?^5;8:N2eRtVmׯO(W*|#">U(9/ b& xİëj4n37m:pӏ7o--}eK{'gEssHǏprS*w˫7RVHT:ujbb#8Līg}9s俞Q(gR"f (-{g yw޶l[VQV^[멙zࡇ[+++_h񢈈O?3| ' fzo3{Ĉe:TݽuK]M__A`2tMM͡.Æb8ÍM=ч[ eԒN'Nzп ^&>mN<[C,RǷM"2I::Ǝ;N-)/9o4 ߾ےS_zJ;{;{Ç' >c֌om/f.y؍># MpFcMugNW[R%,hj*(hmhmkk}sLU8M;_}uŊO>9x`_{l|?z?~7^9=Ь^^2lG"۝;w>oY{q?K̤ 1<]N4',V-|}6do;2njhLF/!ÇO2ujrr`ݩ+z'|]w ˖ k_}eVaĻKDEnC?}}c;v_Mښ3q>V(=<=CÆ 6-444hjmimm((d2BasvGe4vwWVoٺuK%5MM]]}}VV*WHHllrʔӧxyƒ1pɻANNݑ &'1!(p}Y~әL[۔q=w/c7W[ldjkݗQZ;>7'7H9~~X0q,qkYSP Er}Xl+G!1YBvwjz6RN3Z?{Fck[v'4|̘Ib,w74Fzjݻ{WnoqcOlc_3o046[6mőCT ?6gSNijzoСC==?xhD]]a4Np˭,P$-+)+5Ƙ؝_~^`cp3ܲ+Wܰ;6vٲ\ر~4ed ]̑kʨqq'88ٹ:ֶGOoExLؤؿǟ415\djjWQ䘐!CbbZ["#?F454Κ\?F3ʪ7^gϞ0a衡% juBBpӛ+z%ٵ A>YB('۫T66uZ[;;{z ae]i`M+ƍ߯~(OkS]X7ݼdIUSO}?eNr#FǶ5?λa0swe֬RY\S `-   H;;:$]Ngtuwu VӦN'U"`?f֭a>'>tCBmjhhlk?]UUo[}RMv_ny8/O?T{׽yxLƎΎNjLZ]uPaߋyhj*jm}c]C% 1cνڛo^\ڰwZaCu^lܻW(stLJ;/EWHM]iSm/5v\]rN:8x„ŋo[oa`{{as@ݸ^|/KG%/^ֿyMsDEky~Fۇf.Ks<0bT\ĆС̚{[sii:QKIa "0fg/wHz;HvVVV}S| !="+!hjj>m //*L9uw}E!.ccヂ-[RSg:tdww$3q!F}۞99%C70&aQJ7#jt:˂«Zab𸵵A/ `Ҩz(~e2.rW0/%zR)Lkhhmuw;^u=ݽ&Fξ% J%^1!&ѸK;>99$CviNۺoxeʮWŋ,aDʭŁ3*Ѩh?34MOd+(6Gӽt\YY?Z[rՒc\\/Ru?={NL\lf.\Vkmmk+ &.{{ ͦM !)w߻g복mhXrդIw|('oش97O3] <1+ 6 oo''m_yEq*)mW(=\I697k(k+ce0zlJJK+kB*as-ˁ[2OŸ/>߼9?_d2M{9pqQ%%5z蔨_osH}u͑#F]dzpt>ޓ&t˟\[K]z|/YyMhg>` 3{E>3=lcw_o()%FoScӁiwee/.n[4^.su;ɬN}>IDATchz۵ځ'I)L--ۧ='Ըqg;!t3?=믭^ni>Tz{ #l.+hvF{qڄx{WZvݓO,vFエmmӦ=|d2oګO>MS&O~t<ѯi2xz9:)俼_mk:i1\>vyy5u hm8;%&J2D_P; '7'sĈ#|e2oWI- G~\ukfVoV+,.OIOI_{;FxkL?vgӓ7¸S_vtM_|՗齽3fNT{TfL6J^XW%%G=<َ4vi{ ...iqkX60w~uѕh [cbb|DTuwر~F=gx_m_~7cȄO>RYU+Ϟ`1aA>nJe&ZI*Q=򒌌Ʀ@TEFȬ,S^ Vf dZ.|o^^vv!!<=M拌W_ij1-<;r///O+^ssĄ^W*5uM2mWwWB‚ ƺ>xQ*mU]]ҲZ]\FJN 1 wHO/>\QYXx@]V+ܴL/>_SUpAt.d[2=}ϞE}.a~N U&ݶm˖Vo vڴ텟j'Z7fСuG;;ׯݻpZӣΛ?rh&ƪ12shxD}]}۷oۖk^agFVYYp =}Ӧoˍƍ =,$];wSS:rɱGg 8}֭ nnlm)tOlmccbcڮ?s'GG'G{o<^`e$L*+yw^JDݭɼ::Zmȑ#G!ְrqrqinڟg@Zڞ=5]]`af֎6(0FEhJKw޷/?UXJ訪~شՠMJ6#!rっ-~~cƎ7dgUX껼b]Lp:8{(jk32vڽ{Α:k4/oozFF]6"" @񂷏V{Ν?gwQQwZneg cO==]]-;gt~t"f.)@(i.Fx/\X\RW~mSjFGFFTSF;97;]( Z&9ZhƯڳGNH?2itTR)9i{r.G%' Sڱc>zh:݁vVVj/n?KVXcѱhϞ;wljhttR}rMCÎ{L~')m8k5BJ| j?9W37Ӛ+,S2֪cG Ӛ9| ^(,{Q}`a#GEEصsz_{q( A *P\y1%f$ wcqK Kdz;I/psɶdЛ-,[~4WưK(?T8H9tց ~IyhyΙ1jjy:/l-.>v߾Z^tI¢F Wv%6mF_ Ǟ[kׯ=u*FWRZR:`Iy<%&s^zk7JMk8pְt?k[ٳ:)+dҲ]?clt=o|}.=^T\\XsgZj&''ޞξ>orZQZx𑒒@$2f:XUe7fD4Ol[]ÿ;;mZCPg!%ɹ0:~'] P.q{OBYu^:_R dg1Fun?17b0 ꊋͦH-<՘"k /^b!f?ڪ%s*z}^c77^ }F e<| qQ'NuJ\D z_ΔCejLqe󚶹hzh lv brq߰h}u]8ݢQ'Nu6b& ɕP_yҸ&N@ RX a@0 f@3 Lb&AM4.}$)IENDB`gsequencer-3.1.3/docs/images/ags_midi_import_wizard_no1.png0000644000175000017500000134753613607210263021031 00000000000000PNG  IHDRdzTXtRaw profile type exifxuS[ w]1I,G$SV) PgCc<[1# -ZdEHWlXX홨6-?B Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later H3a iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxXG`Mq5nq.w$r)w?8N;ޱM5@_5cp {7Hڝ~;;Ǎhy9wl-vAh!A֮-v>kiSBݩh  >"-0Upkz2X=;hq{`s FLV`]hk1߈$W֬y6ZM#G|zhm$L~+'MƲ߲٬V]Z\\V^SթTjB"L!!^.Bm]ٱ홗:;xd欇Y08Ngf6^/*nmV(z5jmvt9J$>XTe2 }hU赚^\r811>P{ j+jj;fщC$TɺjTꐠPsy[6'K:ylL7ؔS=]l6l4JeQب^u[,* ŜnbJG2yHzpCc>U}C^^aATc0Œ('kљ_p|I1 ~3f.\:+2ёBXzJ54t\'WWl$CfJ#m*,*ȯmkrLf;:=F K íc%WWwraSj5b IhTZz\i 0)nMl,g44:WVV,EK֮:͵vرǜlY ̘͟D-Zʂ{~~C>~~~>ޮ"4!xT/A{.f45 D) 9V3KE^пW4pVW : ā]G-8n^k Z2> ը-"b;'SKwO]mmm=xO"=.łFĞn$reE}RW/mTl0\iiBJE|ʕ3fxILџ~:?z^jc}mI$풙\E.K=tm ]p8+\9]Q_Rkmر/f4\ii=܇fsB,}`vjX [Qq*WCZ;y]E&S47J$.1K.[6k/C$\ӣhx*''7)x./vҊׯ9ÝBAKmn>so~>7!,l,w斱phUiCY` pjy̠7np$OO`;ZmMKý5??/Ie+V9ǛŲiݥӡeCKbhp/ݑ{`-^߿VAS(3S/"tPt:d"ZsnpP𾾡+(\OPHBzz\fU QXҌ3&}Ѥ5|gY 4vŅHDAgudgP7V[]YT4557&N&i]Tm,k8(,PLNY!Z::JM p]EhjQT( =$ۛ*/+Wi5Z-6Q%mllШ>R \xSDd4 Ҭס3õfg`F'{R׫֘2Xsrn6H$:ف?Πт>V>ɄݫZFJ!nͧ,1;; Nhjp8C@"X,TjFmD\Koo >Qr/,co<&^\DwB$шB&:j6Æ}pϠ{}]m5oA\_ԤѨZ^g J5-cM&=lzg6 fղn틌$Pb!xAN3Ҧ+(,=0"j8Jmݖ2ٌѿ,"q`^m5jM>2h0p x_&EhŢ6690|-"(<V<8q8( *4֖޾hבщKNFsήm_m2BG^Бsg)n~aN6/T*EGQc2#\W'~Akٳ[|K`G7yr :L&YWmm}]wO`#g%h)k4TaKP?b <H?qD, -zr> ==btu)䣙v onohnj}}}|(T?=gjry\Zy܁VˍY q"a@[\Չ]l& KjDz+G^XxYmV _1;m媨(7Wё@޷뗧NH4\osG F]$c!cQ j: <4t02d2(T`jH$_ zz&?LNjB!W֍''"\}}"P 7O!%khǂ%yꆍ7.h I64) wvpsا1c.sKJ4s;QH*;d$  _k`d-B#ʱ8"oh{ vHD]䆅֍+9hRe Z- ./oBFc}KO54tvjoommk˵Zy993y8+PU_uS{:]PkFtgI٥ wd:k#-VB崠9$NquG)Y*WTTd\'Gۧ (40+{zP(9q w} J rŢִ;E5TF4>QzjMMV+nnjPb,G u 9|XB"uww i#%~~΂K;;:榆f[%4gevvȻ+NJ* 2 z4ͳm 7Xx<@SA~NvG{[kgڦ88ۛFEcCdP$vU_Iс}۶5;qxZ!U{9qkO:/11:9'GjkXlbQz zWi)Vxz$&NK h?ZuUуOF3䄦Q(dS<3uժӽ4xszhCLE j{:Mnm)*<{'zցS[=I |@Kj4R8]3ІĴhAv KGGYK%z&2jjrD?|H̨T(--i&FK$ AA#+220ȁ}}j uK"9r\CBM_85UYZhBlVÁm76Kp2E09eZ@0dxxJewRVh/K2/=&J1p__L2J><ޑstmnrVV^^Q֪ӡ9}"#$G*wTjJoժZBpD"_ooP糘D" pVC3+=b8W7/oٙD3ɡ%m2NN11޾h+D2D Dv`;"wO$(hRܜEҢ|"T9llE9BeNgLR(糓wD7Q(nn^Lf[Gyy}R* _x<.EFK$h FG ˣpxb.6؎ifLMF d A&X\.C]nV5~#ta0P=WFt:ӆFPH$^hD!=Z'L M|z,R wf-RLRdUahVsh$l(YQ(PHHd0\&6^.W]Fc2  =\%2 }EV,$' +(ԟ?f99<Fӎ֌RkPj b?9o0ս6:|}>-E"NpX,2`$+}}hsYDZ=Pנ}&\_Xthuy,% β(AbI?=|bLN\rѢ0= cĶ*h]j'R å)2{o"m:w:\ ãk C,&N~~ rexɤV =XoW ``=0@p |L8&ҍb\ps?_~9r F {`=0 wծ - 9Z,v!mx;,PRZ W &ZDBa}`ș_78iZvv!m-kנJ _+8ҡpl pdeݽM.Ǯ ;>sʙ@)W c2E  | F`tkG:R-^(߂ ޾>ZT yL$)Tq.Pl܏&fM,|o4jrE?H4H$YX,ZDv .ZggWWGGaaM}]]]eeddLLb"9O-_o2(L&s|)%KPxbʖҒ wܹys44}MQQDg675_t`v`~J ~Abb{L ps .?5TThѓâ"{mʳgϝ?}:<<"<2R7t.89gvZڒe7:***:L!6fJRʴ)ImÆѝ;/d:-$$%eݺׯOIqs:ՕcǖϿ…6Juv򊊚7_|BY,l{ۊTZ=?U5k$xޕښv5ᇟ}B M$o 6mdBk_<0e(ɉv[oΚ5:ϰ`wВ>-mCܽn- X}4!t1ʿeNӟ游\]OU'$ڛo.^1ڽ~M=6jj?^YE|ܫŞcbi[{V4D$hl/ 2az)^l6oz칣GΜ˭imhxYY$ 9kΜ$/I_Zsl#ё<=_pj1ܒwk*d%$$-mٜ#-._w_x!e3s0kZ{ۅ۶}˲懠PX,4@" OL2%"͝Y}OwMM~~V敼LrWWW/p+Jb䭣SihN/IdTRRbRxu+|`YYVS\ulL.Tx׮/6˻#z$:r\g;P,qR(̛o ߚ6bVkbӿJeVf^젴Z9?׫Tǎ=̙gϞ>xѢE(%\%eeeK3/ɔ%W*F~ʴ@i0Tl/av!e#n7I=n}뭗_RۧҔ${djj޷<6-]rMF3::ivX#6`y+:~۶Nlْ%k׾h߾m~魷^3'~j7,{Dz^^b$"c +eLacKЂ}?gw`?Zjj1d4Pzo l:V״/ AݩcjM&O`2×-ݸqV'$>/w߻ee--=>HC1;p[,NN>cB2hTƫWj;;548`cj5T}]] Ξ:[XxGcł.9SZj6MMvsP(m/Q^^ =㏋Fqlulp_\&Fx,\4)^("VIQ(Z+]9qb5k. a<ّs_ â""y &d2iJyO{TӣӣZܿ#mѨV{Z++?}{}ClufK[/GYTybҤEC̛fs[+9zՊj|`v#6{:;;KJϞݵ82"}C&E BC<g1>ĉM#'g4VUkqV74?ͺgl_gN?ǟ~ [OSSkkc^lM{{GG{GGTqj%E$b_w:;{:qjIIy镥KȤöB[>8?/GE;8d6}{u-s]/ EG裿}jOρkqqӧnƲ7QddW^y͍}}dut][O9]SbwP !rxJľ>^NpLX ߏGY9ZҎe.{gD$Zw۽mw;oJ Z7o2 p7Qc{@@P`P i1iRT~{֋'O$NvpӯժPdeu`}ossf 7LLLIfPxI !!\?'sxuML$|iݻU(`VabfTZTX\PDӧ/X:+6V$5Uh"ku`R$ut.YD$:sfmތnHzQ Z?ю?/76Ξm6豵tAwYurow\7=q9kk_|4+xkMbN/)-*$^k׆3V H qFil᜹%YW Pm+nFo nY,o////W*z{a<"'Z~}o:Ƕn3v~-N ^spZް+c5vD?GzZ!(۟~+F>ȸ *P*mkuq,Lkb6wښ;f:=$ݝC3mʽlnؤ$3gL{kmf?_nC܃oZF M!K$oN{?u`w)\WHdklltG^ީM-l===f% ѤV3YAbO2 M˃9qz~m<׆L/(ήG!Xd=9ٵuLfHpH[ZVY9yoihD?fMp@ e4v ݻԩ‚lfEB9KGG<`0wؿgٳEEu9_ߘe,P+9 CO,NV[S{3Ϥ{R߱7>W䁗_4y#Grs:֨߭㍵k-sϞ| KdGPtyZZx3?Sl_FS~sg2`3B ,_9wnX{Ⱦmˇ7Z5{βBQm͹9ٕtdO+RRMhnNeK"APiK/_:+qn KjۗZ͜T՞=YQK0NS>Bf\()ivvyNI$&su ;o|GժV_裗^;2w?Ol;:V\wƟq>[y=; mm*zI"#qxK↌r ^x9i|#;88,…cGkd2K˭ mg֖‚K._.*mjhc87}vZp0#q >6 ʔJ.7+|<=bclrSg/]Xa=6ryT͘5sּ!Aw q!&f¥K7ltu%eeeN8uG"uÙ̱uֶsgOIIz9Q錥{uu3,e2"{RVQQ]i6KӓtSSsǎo٧8K/O xz܎=XrsϞZ1m-w^={6TVV=scs"Oynߢժ޽gΚ?͚4A&+)>yݻ' &{3VJ$uwjnhA _zHy9xo/&EYF c6wvtvMtH(pqpv kWvc|R`[/syulb3ؿ ׽NQ}|&EFr8JnNcCDDLCQR]YE&/_Ϡwwi=J:|m Rb_#V {sص+F-L%t:y[A˜TW`| r,G JVT}}6--U5UbOOO .d\899qy!aw"ۢEnXh?w';/OWB_B FXXDh@ eӇW,]3! v,Ųs'N45O~e+ck hš;܋NwFߟsrmnbݿQi%3g~0$$<<4T˿>z41G"#t7/G-U~ޅmG^4w^HHj*S }#ϻw{w[5/q@&s-vdDgm$zck}.~ GsݪTo٧Yҹs=ܽ cS,U̙=S=N||h7ض-;;'y%1Xa[fxtㆍ zbXb]^|Rg`kmy㍝; eSftaK J̙6n|lHḞ}vYqMMuiIMzN̠HccmW^PWOa-٬{KϞ9rrgHĨ/ѶRWwlC/(ؿoJoW_{u.3;R9xvFY/ÇNt)?/;ttHS/X8sFhhHV pF㆛;ZFF(Ϳrߟ9+K$o@&$qqsg/gW AWRJڰ!(R*׉@$9N"k@^ݙ>}Gwuuvf2 :: 6wh:ܴ>ebDQQ$NvpAJFnkokR~٢7]5W23KKm?==&F$| DM5%?y"'<>S.2Fcsӕ+W:;]Eqq\Q ;N>`RmpeŌec[L&٩Ch?ឞ-KGX(|IK7w/|Lv''%MfGFi}]_R6^o/K/_/,xg};V*50{|ԓ'_m-9:sp?μ߿/kV^='-$Ս0Pװ͙?+5}^T$ہHIIG֭o% EVkKsEEaAe%4eƴ4?߱lev2I,o>vϞ ZP\|X,惻cl`݃r6o`-+6Vq2 <͎1#>ʖV92dC5\fpg--mkTwh*9;/Z׭qGqn\tQTۉtPpO cӁ̓JfF:͍*+j+sa[ضqq*Fz- X8\EJ{ܻ~G2]bh-wۛyOgd\gD"=eʊ…?FFa]q qq'O;[_]c4} FTԦ'Ox+)wskwRo|,8.S4 EE;wEEC kx،+VLI 97=󛜔/!QH%%%eeU{v74ΞCD͚ IDATs[,kjO"30&zѢ+xn-ܟg8HT軦n<٩h1F|=#m< Ū*{{M&c@pNIh4Zt{"RTGu֛?{H-"=e؀#oyN'L FBȑ=Cx1::KK/^t1/Q%S*Uj&2<=iV>%eNZܔ#0#͞2anw5-Vh$,:4?τ>kHd~dq{%۶wٶW7P(׏u-86^Kbr۩^o-Ǒb-hRC 2e3*+w>:wӧkV[-޹3dਹs_?f&d>Gf x |b qmm">u B'(00PłlvLL\tp}3wskkuӼ^mF]C/܎F6mX aItMv3H[TW,H*Jϝݱc˗̜A b5&3"bK-\<|jjQkL&2y%"Q$Q\||Nvy'sZS]{%f.e/GGE4A(<XJ_x`+gΐ'OࠨQQ,hbw&h׬YKJ *+ss d]]]|g>_wt{LNC$>/N|lpɒ?ܷoɒzO3~[6"tIL~hB"<Ԯ]#N xx,_-_9$pUgkfaOȰZEo3|?ЩBoJhAFFcuCX,*40K`i Y"cW^}s]E|l2]w4Z@GF}{޺mܴizH8xAٞ<~xpK9zNG%g:bO5Ynl^Ʊ@}>5K$:qX~.YRYYTy#{~qSTX=ec3n[;F2J3)Q4sʫ &wd2-7uc/@NJqq}w.)>4G)46덹t^o92t3g=-fiS{3# ʰ!Ζxz*U,p/f?xcQd6ƛ?m7/OxiAwŋ{=-]SK1:;;7V&ijX ]m{ݸ#?޵8٣+uuAll줡G4/F# R04Dzxj׽uC tU83KAx7<"992Qϟ/uRV2-MTDFNf 2|v{Dbg6mXbh1&Nm<0ZY[_ӷhƶ/;ݭ.N cǧKJ'N|ϛw={&cd5uJHX8%%+ObGLsL h4Q\[#vtOJc2ir`28>882J"rlЬTp+6l\_+mHNv`D9rQoh'նfd=T ?ٻ&@B{&@6al7 =jUժ8AQq {#/PQA7xsi4P1\ȼzLKHWGCCAQTDGGEKIk+504FQˈsϜ!ˏ@ Phu.ᑗlcDC_\CaYYϞ+^Bje?|t6TmX;Wit/1cl]5hВ%.JJhtOr/SWOSIhgg΄xT(>XY,,,,ƌqv֦,:-uq_RR433372E:hQGmiyٳ\yے%CR$|]9@*{mfޱfYYss{{S+W.\rM>_Ksj3kP(ЧOyFwuSχéhST>mg^k+EQ&ʑD謬<==s IH~FFbz_꒖~e_PQ_rQ"ӧ 6 mmuuEEyHj+)ȈOHN))!--|X>û~(55$8&:<<9wWk{KV-v jykW yO>$;;%5572urUy*,.QuhHwPRRACCiIZJJJU5GbQ9@==|+|@e'Yrڵ+7"#;w.2"TUu vztW@e|ǭ^a7= x1&ʕf@PTӳ6JR}mKuhgnjy3Ǎv9WVz;x*sނxG_WW_zCCn I Ewj.^`54 ++!'^Qɞ~y_tGtEEEydWkk,4Z\yWR1cƎsuUVj> %ȘhԩLPPXX3gQ(1ƍsqfU&MZ*W.GE޽s"YB16vv8OZ΃F \hdit`tfͤ$+3,,d}VNnxwDE^ :x ɩ(S&&nn<ˁ1ǤcH/^ǥ<YWpdݠiV:NGHl?wX9|"ɴw4cb0qqtQ66]d!3fNT]u\h C P9k1ctOb 1c._9Vϝ訨ГУž?u1z^?ՐiYY11MM!D)&M ;"lsr>z47W_gLf=~t)7ʑSTTQQUCȶ3v0 ==E%UQ“njJBB㄄V.LVS\\ZX+@_L/dLH$$Cx N:zttw,\]œ?kBaY;o]y t8H$bNܺq?d# !">mfGddۦ]݉ɀ+,Z_8D-E55x搡* 0tg/sTSsbϏ$ (giA.6i5#SIm7VVR+@_㢟gdP'3IPoBF@ak@Ҳ[۹sIqP|2/JbU/_D?b M35%@PӃ=  2;`%p,$z͟==hy@u=g4XdⴑjA\2rp8\GLp^|rTTLmd0tgpF66p^|r:ȔL mmöɓSd3 t8Ӑ \n -L Lp^|r6z GҲ܄a9Q**ZZpz|(|)J MFF;w >S96 kS6 ٭[B---#Mӭ))ij~V Yه,^͒zvvx k5<̙󍍰XHFzl}QaQQq9<^^^\ܣp"|Iе}IqIIYһjjjhoHL|yH_ ߣssrrN/%v?p/!''OVp"|I(|`LMdydZZP(&H$9:\niixsG\8,2%%'J PVa2_h7WmL2|~rʾ}Ӧkc tt/+) _bرjW >'MZb42yΝ$Ҿ;NCxqYȶY},>o?nf0˖GE^euuw8:W9 |>{.aKrs3ҥ D"QG ֣P% -@$VDQQXխ^XPS#Ngeضm$ =訣/mr¹Ϟش]ixmҤ 6o^P_1JTP0c?p&D"inj`B;|>FFIaa*٭\EM;w"=s͐4?o5cA_ kkn'$׉DhqC<~gʺw>-.5&LnjBҌԴƆ&K(YY9:0665E:Z[ >.,5=]]d(ܜ.^(jC CL즣=b (%D֬]C \.Kvu4S_syy?qAlm=fіHg–Ҕ 9eu-B2agbd(egjF**RR}G~gЙL[ہ|1 e؈Y3ǎugӦg7n=c&]ZxfݴiV}1HMSs'N`o_Ǜ1}>L3- UUeg%'zyimE |j"ST2Juskq쒒}0-{$__f7774ZI$:̌FCjEUH/(rGBT.>7{V Ûw ܜ,s3 T,&=#%ϯO/_[< `ddxRӢ2l(7VT髇 Mollh'|ɑ Zr={ut !!-$ge9s֯;loTTkhŻw:ldxKBB{zDRSәL]\['A_h_tp|YR /PXUMYm[[7Avjjrr8HXuuU"559ɱ.,LNhhQ }y@PVh99#c/ѣ)ii F(*,,/WV)-AZhFU IDAT0i><<͛6 IFtuXE  [[ kabSaa+Vr#V퓀3c.]9,Ν{mc.[vݻ˖h:w-_Hf=8=-#kkcc_PRiaAU%2|uv6ihiؔ|>E|Cz}`XښҒ̨VѣllTU;wX9$13 1ʊiiB^P똣 ?>C 3g@P_zAhhLLi  JʊJx榚̌oWrFaiԗim6eiI1(Tr-ksSA~TTHHqQ|.MN ]] 99<{aM FZDWW`+yƖ. arrd9I+Prr4]]U-eeEySVZ\RY)P(2iQqQQSH4utt  SnBsh4Kǫ-+ꚖaFSWG5`*\n||L\f&&0M \B$jjNNkmE,-TJIIDDUekD0ˋxInNs32, cT4rg#10OKw?44:þc٦Ʋ쬆- -MSVQR&jxIQI^A 0D{"=Kϟb=3delrr˞?/+--{>Nw1_ZZ[kH;[%%UHfWVpnBBUe}]VVVvy*jqJ\$3\\qg0ܧ=y܄F cmE"䆆w?/*d*srLMll16;??6.>Pd?:MM:ytHȝ;iU))IɅi4m>G& \rO7x]W[R!Ⅺ`Av4ܻBc==7qc;wtQHӧH /ned**lvNzCCŋb6J(P44$Ƣƶ=ˠkjv$+xxxk4F77FG߻QFMOOL7EB J ̘ FjjyYffiIJjZzu5kPTL(󥤩ڦ&JJ,VIGG"{NEs _Sq^LLqU\TRB8SBaQQBb||ybMM򴳣P!772}@ScwR 9BEEA!ޥKO#-̼<"ĎyYҳHViip\od s U5d++?e\\|q1rSymL^^] ܋Dfrx72pVsssKWc#A5UMM82LjSrrjZZRR1<^Q@^,cZY,AeeIiy[h4Ob̲'?yWFoki>@g w& lW(#dz8qa\\,- 4d))IIiVSU䔺ww&!=h?|Gbkꂄ4&C%%55HB:)**.A$EIr zPɝa0dM LXIG܌B|WUWW <^K41UQb)!3#117:779%;1M7!]$HIi1--55%RR&&v&&7-\ߐJ ,G1("Q,զ~w4zG_h}0EES{Sܜĺ쬘-#w/)UV%$feTնҙH$lۿG8,TK^}(q$[<6(/KN~mk[ЙU'}[e``m-+pllz>:/ތ(#ӝ IIO|YV ]aP 6Q ssJJKJ%EuB!4Fc0^4}NHdIOH{ky !u $HfL]ZJG9/_޿_UxX?wx緶x.bdbW;'yyr[55H#Bkq8,$ԍtxӝmJrK䍪G_8~UQ1774/{7->=ŋ I+;꒒? {R$RT2020PU%I$ q11}x""1GId}'''G==IPZIIQ( L^nVfC}qIQQYW\R[#1 4-֖>$  !u 4HfLCc:F =}~ν%)sC!;b,VXDDY"y{ ^,-^z TZH@PT_k7 <^Sj>R0Gi| (5|9N))x??==+3;V(JL|HZ++K I i~5.ٳƆSRzW*/ol>_,V]H)) u HO QߕvYE!!JIpBa{RRe(T$jkzf70zzCLyBFc02*㫫k3 ɖB.<db2%1N076NKG:mxܜeGME*}] |臷[::'$2Xګnn<^tLBb^^UeS#aDJʺvv**UGFc0d!))ee'$$f甗otUMB@ ɩkPxɍz; Z744|>Rڕ#+)kQ ̘zz鏹sjle^+qchɘW(ZP`0** !/lNH:Gyג* =##I(WUSХ":R*N81ccRӊ*j|))E MUm>nk3LJHy263%)vƶ6zlnm޳ܟ諺 !#IIIC .\8uэmh0p%hG4#VW~ͤĆ Fed@yN䛷_}Q]F@tit{wG-F5 `=4#{m!P4Ҟ>uK(%l[F(K[Y vSRЭYd' :~ -&%E"kk1vcǎLO5>?9e߾)S6lk ayH  -/ͭ6btv^Xr wB///.c$|?{VO&l? -5ŹyYI<~[c|ΝksqRS 'Oo?YYAKKzymڠH:ο3g|ο/}IqIIYһjjjhoHL|yG|[i**66x|Fy1}#g}N=ڿ7B!| ;+c,a\v$6oǶ۾eaYXeaYXeaYXeaYXeab> !#IIICwYkKqJ0t?pYxxؽ7|V, anW,_ngPXVh߾#=~ )M _{a…SIZߓ|G,OVTx'P9;b_ Naݻ'O:<5@PLY.=ÃBF$jhHNyĉn݊(-ep82YC0{ΚuVxWK%1ɵk׮ 9_mti ,Yx4#Gܻ{W׽Q())'Mn(Y[Zqܑ#?LIɩut.3U*#ے Ӧ[k˂W'_/88**3UPll<=]|$[[eeޭ1>s>+;!y4K4SSkw!/?55.<}KK?Xh4` &$% E($fe=qgr/Xf(r90p˖8pu.r$(֟׮9vkךP(2✜"4ZSSA]pyy7~yƫ׸Q~i3 ddhoȭ[5kr8&kZW72%dW 67:uʔg"m86u2vllvvaAYYSC&QVnc̚`rŐWQ_4&mԥK,RQξvfjE (*kiu̘xQ#5/"bӏnn2/yŅ h/9==ʎk[}`V'Wo񪪒]r⵫eeաPJJ::ffO"N˦LQU꘱X~/Xϟ{uޡV>yrjj翌af|dKW45 _Xfm|;~=+ٸqAW__Y~駲y6$36YڵW}cdyoz߇>nd$*vχFF&'ՉDJJt if6hpg=T^󧛏;=,45tΟH5EťeyYYT}SSI^^Q缡S %+#O'pI=)ELBMϜia!KrY,6cI,V_ɤPQQŅmkӣREc~Vք NFPкuO?Ҝ3gzhhf'&xZX/[3\KVTt;[SYdDD||^n:#zx#C&&A&%ffqHs1vb  @Ҕ0W\9HZJS\>RW5e::8;9;?uqp5ww |3HKkϿI+V^`>-~?Q(WCF60X|^w.ut0aG))5UcAv:^4q =7a7uF/rZ'Lغu/\}|%f]tÕ^vQÇcƬZỷO/0oI_ ((zᐐƦCu}ƍGuWprwln6l.deO[w .ܹr22G]kcM"I;JmlӦ͞}o;O|y>mʣGoXYu73rcOG̞u YD%"ygOׯ|wk{".ݽ6b,-/_bZ$8 -@}=X kץK۶Mu^sΛU.۳g떕+72tiJ F\nZ˻صu1cy#{z 1u:`R;\ݿTV=|xvbki M HDY,כ7Ї>s獿w<^ήٍ|G^|ھt@ѣ+W ^ b1$݂[.Zdjrso;v]., x)~YTUVT"/t5HP؈B+((++| >Ba}]MmMHH (**z<8E"Qmcb|8-q?s̘i?-*@PXʑ LLqhQS;ɉH rsKz EEbCjQ Q#ozqX=rN,}G^hmek``0NKKK39ohohbot=}sqΝbbB'9sϷj/̵Lϝfd ~#I3 Jee孭?؋23G2shzSCÕ2M 7mhmMLct޼.TWW߼mؽ;)Sh}?U` Xfm{;RTt͐u5Ç;ػzz;:33~~S&#G'mٺe۬hkhѮ?6%+y̡Cw֊D~l]g}XPZ\?܌Dᰒ!msc D{L2d'$8ǮǓ5|}/&-͌ou'U1@YYhڵSٙY]奤Snܴaȑ}nz@tLcӛ=-Z=dP)i7^p^_~a=M yy% EEgeIKYZ;~ \>yCF$ٶ !Ъ()qۃO O?|x빹o^CvDYr&YYcM=oCn|}ml,,<=-Wsn]`XGGKK33 ;;WWi~FpaaG1C0ޞ˿:u(77[[g'MZ?nczsYI7~ysaggc4gU+YYٽ=A;H%e=zӷzxt-,L9R]͛Ȩ稹iC<} JNMOG [[u RȲq72BRSr9.URTVmNcBn"0~Ɏ[#vuſflpOÇ=ZIID> ?{& ;s\֭;!͘1rdu9bi߭=v".-/ȑg7j#QϻǏgSd-+;F,vpuu5jۃoH&YXzŋ=[[Nvpr˅V~=)ܹsVJ0/33yvsK"(ZT 2lĬc޺iٳZ͞1IS.- uXn4+7!7ǏsM|{yjxYǎXX`d4sƪU_ H](Xu'$JJ_>i[srq\ҜɤPoTus^:oޑC?l?jаac7gA&C|+r)#촴6ǫKIIN'wfg\Lv^'p$=/B f6Y/-ytȑClwK˗2H}A^ޙ+]h5un..^g[]Lx23rh*6vܹ3gwyݼKl)`bC}RҍG9b\ϟ81o?Re%tEUPu߭-,:u64{_Z4ܹ{Sr?]n]1sKK23#]zLHHILj/)o5k~5DyO]:f5ց䳅%Cv~:ں' u@jccTԁ+GE)deUU MOiF99hw]YE2K}谑/] ٻÇQ(IMNg2=HTVVUknw}oTTֶb0dÜ9w,^2rФޤ?zuA%[JN&OZvʒ:uݿO"i~ۼyH\g::G\ ㏐J׳9ם[L7c**vU`(//??''+2~AZナ 9J\@p H^jj?BI o} X__\|}[:S^ji8wh99;kΟv"?tΝ~t~VS3ce+W̙N9 RINHLH "mO[**<"av͞mi!Wp;/,VQLOji12d2eewv}__sx꽇-Y|jppJ7ۣ86~жm[.[6aBG}[aOnڳ$kn7wNB-W=f횃:De;Xm_Ң,maA L4jduhZ92Ķjj)+Lzru}xxؽ7{km/C,-]]zz -MM  ]f/Lqqd[xxw)QyW?zBDg>ϝ[﫦}~Eb,vpSA[ 6zRiYy_ːɻv;]d׸p)})b#l Mّ/3'/c) qeܲIII`zk0qtؼ9ops6mi@G@߭H/:ucAA[,Ui&gV]iwTU҈[ZRo^nn,D2??tFV{>zzw2̄'D0=kdςgpĮ~DoHH_ncbaffb:ʪXLモiÙc{M"B[s3oަ_}HDDAWZHn:5?vv67ɾ''"Άx|yE]]sso *^KZڎ5oM!']H_++ N#݆\_8xhJKϜ{j. a@&ݾon! B13 ;8dHV 8>(O@遦rG8;7N$BDL% -cge:ͲϞ~keD64=rlax@@K V>~|Eޕ+W>n玈iig٨n^NN$Hlh?CO@xyF{gNO•4 ݑ{ڵ[-,ѦyY%io ::z{pxlkڠ4㻺$HEj DѱPU od[_C $%WINNKywKoBAGcH$;;X= 3dR_YYWVbbPrAv:@ꪬ<|Q}A}k ̄`l&/L7+*&,LOO$/.pc*¢--;wg`c35¦c7 J|\~~V& )%EOODGKMʆFS0212@s8I"S6)'X"; LK̂BHaXM=|Fssijhkikiijh(+KK L,p?YY՗,\(.7iitҏgy(ݹ{hX7+khij󳤐HDKK#\]mۖI&k:lzXdիo?~e jv_[y]QQϟܼu>b󈤬C<׭z_=~Tcda롧`ho"qr f՟ʹ79ZۚZZd::vN߿1612( "?T䗔q|**u7VyگPT GB;+DDչ޼mmM ߾)"KH+*ˍ\'omݲ/2Koyohsf+Y]Km-xږݝq{C\=- ffz-snjooユ7  IDATw.}xұz<!'6g:::BM}CҀ666o>s& @E#)iㆀKP)鶟A{<̬O^#R^8g.90DqqV& $R ]; 0Y/[hhT`omNQGؕz{_HI{}޼FJC^ RPdK{kKg-oLx&@^6VH(YW-ni20}}5Zap$S WRZQG9'SD9 ҵCס6"ݻw?SQ KH/@,ݸQDk/\*/,x|mmUe]榢} #34\fÆe6s̞-!G~ujjNN}{-wwWM WV<1㿿%9r2To^| ݻ՜::zsF`*~I--~6w--E)̞024z_(yQaaOd2(p8++;Tի'O?8\CC]ݗ/$''#&  qSEdeHܸ_]ز򄄸Gxs3S7DC%g<c۳~=jm}F]]ݭkW='45mm,+_03[[ED^:y@յw%UWk`LL22"$һ7jj^ծ!}`&&&덟X=Zw_d~1ðRQ}$²dW'JGĤ8[\ʊ~,//_W;|<(g?SV3۷[9? qֶyoP#|mm˻y3Bcšǎ(#cg睻Ǐ! tl6>H+Sd>oM/Ξݶm2Y]]K{7s޻))ttVrPzCB"ѓzh$??3R5lm^X߿n0 񃸸ӧ&p&^^s›p۝֮P`Xm n8«d׭߻Ę׆TVک6hj S܈֊ ]QH ))9{@__ oosȈ\ JJ CwȾOYw\IX|괷T&r+|כg=PW`c3@VIIW.wvm\5Wo-NNnn1]1U+ c󓓢.ĕzy_hoAM6?xMI?@AۼT_S(nH t#za=N/\`mfl*%e`08*mmLm8\Pj:˗}cbV`k8G"ss_ ~D"$Ȉ.'~k sg|pWۋ}m23 }C29LMf*. o?KرЬSSk[,1[Óq-۷sp Feg]Mʹ.o03APH|z^hZߐ;vVTٿo [mm-̝")WS]izkwۇT}JX5W0dNhU DeepV6ZZ/ټo4s ))΋+(鯩B0h= W_@D&Qx&BJ~ iw`6!|/P ||j66N'8:苈 hc;Ϟ ܿȑ={E $$TTLL6o^ݽowW/<==))G'$|ׇ@03l ihpZyLLs6o ߷;?2*2b˦l䔐PS35]"0p򈈐΄o0~&/de][W7y/ct%%BCSSd.\r[7φ&&~ TP?==/sN9:39 ZY$&23%ػ+,a`cӳ_1VCt))WC{v{ʕii ҳpo颩\&'gcS'OAAb``cW/^qUUAAȉ/(I@;`77C% z0'uJK4H s |}4YY{)uӋK$%߼'# 60}8|0y>>-((LALLBBU|6??-- fs+?}T_Oʯ'$<&/c(|4_44YYIB ~_[{}}uMuEqQΓ{΅oޜ}7hqqA倿"Sg^"RSvf`sύM**,,,l>W/dJ3 98$$TUQ?Q;jfQ J?~$8X\RcKAC VVɈ8^;P_ ߃ à5UUU58o8XvAXn$$*ύ\\V^|Vqb~GdeԘXY}MpϟofZ"Qa$ngIΕˑW<QRRUB$ ͝s Ͽ@ ʽ~=OUT46QSsp*+ڸZ^H̾u34۷_Oڻh7#] trpA@p7+^%$\\v/jʝl&֯,>`ԖXWT`gi@ݧ q%%|Ǐ==rrNNC)n^Ǖ>"E7ofey[UԄ3 *+/b& OO*/9yZWq**4ZK{=,#K22bcn~A"xxD45]6l06;*7ȏ).~1e`daeg,(g c`ᡢ**lhhj$$8\eUB¶mѭgtbb)-}굄V{z>t}S}jjOHJ.]| ..2@m7'!Z[C^gcceir[իkע6&%1001H,]~IqvoB8\E%p8}7w(6||#:zϞ͛:;?q#{UKfS1Ѻ]\i24 55&ڵ={vDBP(^EfAA'N ǎm50`k{@]=&&8 &!>}J7pCLlg2@Y~~O0// Iii),:6G$5D^MEeAޞΎƯr IH;ha0"D$=x⃨wX}m3kijiij < ϟ.ܾ]_/b"" yyϞ=xAHhxMy@&OǓ P""[)!1[fQ?~t\y gl Oρqu9{6_,[YY'۟E_T[#+vH?WVedlmط̻NZ66[]͞MܼreОܯFXYEDap eec2⢁ V02]YISj?fe㱴tX, XO&z{ 31)TRbntiXXe%DIO%((..+cczڵJ?W]a||D w{WYYgbPR]cR's99==;5k||l*)qpYG24DҲqs ++::{y.2fb+G99wy{{dܾvCDd[V|@``OUUϞ} (HKmx|KKQQVkRS˫MHH^~\;;J^kg9Ra0uu_pLdĭ[]]P }}׬YT^y=|HM ?w><55ɛ7%%MM2- ]\׭sv\~F&AAhLۯ[og<Ҙ|{/^YAAqIIIMMW%*``JVfX7_J 5_ j׮jh\JLl{ܹ6P}=ߟotYSS31HHJP#'marݷ?k--$Ҹm,\r܋GC< իc6m p%c/$ ޾;xiӧ-de?K@oH,*:~lѲe«Fג&'O~}"3Z@0hЙǎ˯no-?g|{k==G}A##gϗ,IJyOFHc~rv>e$]=k֟yq39a^= dg_qʝ;/^A&Sd"YYf?o&άoq0Oҏ룢aebF¢7o 8kMM~~0+\K+##^/rrkj}}(NQoaeg{x ccae*t gacuWgopu`낢ʕ t8_zc]}dhw &**h bbv8яRWMK `q,IMRxX! 36tq&p{ q{߻ѣׯ,66Ѱز(OOӧ-sp`@h{Д̶yyw\p!n+rr>G$'ܩ02e3n幺{4WUzٹ?1yeN $RGǻw.ܹiӉuuT0..UՑ犊]<755Zb"sQN^RrKuu),R î3ښ{O||6o\%(DܽcK,611&QTt20PZpǏ˖,ecmk11Gxz}uڶmZSH$RccbҚ5թX[/Ybb g&[q.ASQܸCB~ׯCN{yE71\^@S]Iɳ'Ϟ`2#II'L73}}_kk>|(+{#GV%ݸ|ѣ{ )'|tSS~X_HWl|`nG9M@V┖o"+8@$Nc1p]p ͸vvYRC)Tn ;;;:̙jnMso$GG]EYikΜ\2oH\ eggbsPRr[bb?xk+:<33##II__ cc֬԰fc̀)-3GM]]}ηW^0T]a2k˜ IDATkVm&vyLuP8\h讝&%ee&%>|jldXZ[/>>..穷w c>.%%2"=ћa۶/^`o@_x֫W+*}Ir5T_t#88,⥨@eM[D**L+V8;_x8R͍k|5Vp87\=?( II%z) Mrq;9.8t(6ҥAAC#'6o pbx÷#|tH_zF VZ)??Q[6m"5K*%6v# ii}{U6'.啓RD7G8Mϟm`c0} I8 =@-83~xXTTqP!eܜb+p98؜:u4'9F 2J˒o=vh]A2!;+#-k°ko ^P@oN;0/ctYVYw!0`֛iDѣ/6ll\]\DF[/4lTbCL皊7qow<Mo~ KÇw!zC Z`0ZZz8l`KhSFMwWgWw7dP(4*25!į=>t8)!v)Ν=3jj+DrsQ=~<*ƍC֬$?ڶuǎڏ`<02LB*mْo>02fEEgr<*+8T@67{uuU5x#p..Kp?OOE%$((@{n(~W/ za,2ۿ/%%#ʕ;-,$Ɯ:MF*+}}}8ܷ:DgS:_LT\Jc$ҧ̛_HZZ.J߇a0&&55wW7mNƝ> cȘш~V]]=} qHB2bnllwڴ+9e$))Mrr 51YY7W[[[;_wszNj=?SyxtuUU!ss.ſchhhi'}X^uAa?ל9ZZ?h!C[{^W)33#k|#MM~mg i2d}_¼l鞠=A?gVVUU۶h= gfOOӆS&N/`Gtt]8v46c<.aNNnUIiڭ~ [T~]+`f(-,))}IVfVP@p4" h" ~P;̞(m?#}1"l~z4]\LCrժ@RRBe凊x< 2 #T0*`%fr׳wil(PRx|<\0x{ÇRoVW,p##3 tIڏ==2r"C J>RZuK]{ԃ>drGG^+AA jj+Vy+nXM00PW}/:{ETUUTMLlm׬9vnfM 3fJ?__w۶[i_$$x~aa_|2'D-ѣGʡuJߙWp#CGGFƩӧ_lm}v^SybcnC`KޕQ$%++{2TU4g͢?i82gcegJžyv[WW_WFϭfb2[xGO)䤥mڤAK+-pቓlllLN<|}IBߛob-^t&ӧcP.`oeˌ44TT14>z43;d#Ԕ44lGGss}}UUhEǽy3vgDltꝻmhf6$X10&./ kjz<2rfg%K1nhhcHcH ݽ VڡC^llgWRRU]m[UUX쟲`$Hp8-B& P2,"m+R$$󾴨f| ﯮ^iaOJjjYZs=o  }ӓ޾IHV&T'.9kOH**~338\NmsIIyyշnME'΄u=S33o.y=yyIGk4<~GW2Fܚ5?Gqշm{3?;'^Fwﲳ?05RCG7؄ˇ߼WmvuUTBqdzpĽݙX=[T,HhIr:9h@UЃ:kj sdff++7o{]\fA 7^v voڄ::,] 5|~:)):m`æ+BBtۇGGٳojeK&/-+/Gtt==MM%%h!Ç))'Cccw\id,)Fw=rri)FD@wI8d2{6ory͛xGS9y>~::beEqQc#EfJLSNB HH `_b (L')^G#Ԥ$8qƆ%ٙwTWRHj# Id2Q ?J(:`|nfOpeeyep8&rrC@@fi&W7;[Y$[,\jiDSCLi*ʃ<.TS3=> o鶴))).ffebU7n{2%u.-VE<{HRP^N@@h&7)12yuk׮%&55 y:~CO;h M>WU`CjzǏ'p_ZrMMjjn>>v{yvuݺ~M^WŹJI ;"4$%m޴1sծ.(TgO._ ;}޾1,<9y^*.P͆Ʀ>hϟ546owX}@hrh ;wnLiSEn66bՔ Oza罽ƒDbsOMxd$ QL_*]DT$ 2d)g>~n(:0}dSDpu6t'ObcBBΜM8tpH"\vp8xBVkO>~2s*B;(#55pcc'guB ?=z}`g秦QKVy rsG>?yC95>732@I^89=ܬJ]WU+_J%vM`HāWvΛicw7@O-$$!bcWy""j[ ,q$*ƃ)Ok3ֺ"++*HcmQ4û=Vym߱‘,+36ܹ;?]ৢBKfx?_̻Pn5={'5 ?''//) 89wﲷ ݳڥ7tu"4﫫dd./?y9WXXtu"vdgA|OUbby3sM=Hll,/ՍIJIJw5 vNJjlF⃽|-=!!׮PcɓkÙF=c "&*'7zi褥ebexzߗ/"bb""fAyl]HKKHpdcd3/dI!ȘĤc$ĕW: ޳g+il)"# ۶5.AYY%%5ii @Mzzzu5kv ϝr%!O؅.YpaD7ϧ`t4 }?1KJBLtbbzɓYYTT \\m`ࠣ =pr ~~OxMg`ܾP-;;'WoϽ{)ip&&n M }Ji_@`^*HQ%ӿ*Y__\|7+4tϞM |OV ʕT3g33υ~}{LLWY@_@22PZ}A aa)dѣΊ )mLʤȟeY#[MN4/o==X+ϙoHyN#c[)ii%WSԣ.yX}]km=Fii&vOҒq;$$Zfs#TF"!DD\]cc7mRT6hi._{\M/zN M*; gd5k YF 6oycԟOO&ZZ^^WT 끶#h+ aX{WH/BB.WUK89 ~SDꕀLLff>-Y+.lpkhJ}"N#hWʃN4Y֬Iy߻v~cdPjm}s>+)mْq;(h24K…~||z de:r"ԈO!gp .2 !'Oly*XE ܠz TT?p{/wq|3g"#KKH?S/ob,!I x`h43_6p)ŧex]?s#ӧ|~ k|OV]4.@gg**o/WF"DbMu;7o}_J۽YtNN'(o`d-/#KMx* 12qET-X$(1ׯii<agd"~^>I i N?L\'13Ou=;wܭokl!7w*}YAŦ L&_޳(GWo? Ҏ?d %ffffȉOu}GlED$%~-O gm>+ߏȓ'22jO("3.)32޽UsOp866;p߹{30mx91&&‘жQRaˏQyrBNvڸkG;B{@cv1 \<,ѣeG=Q3mN>}'PcD#Ę¢UU/t}}x,!hd~` /_~\VesX^Y"d 'N1|%zYVGlkcŋ6K~SL4&ƫ}zzjj^HNIJLJJqΉ^ۿe˄Usڷ.;kzC}\^%44!!0@gSMP1;Ǐ2(Ɂ'v8x0h'ƖqP}#nut N r"drTɓ98.274QOGCl"Ǐݓǯ_;vX.ѐ1"̻?Fj8 0*W~k4Z^fBTɓo @ɯTUUٶ?ƺҲOSS"CC׮Y4z<`0&ff&sfȲ6_o16뿇$",gϼy#^^if~ޞ "O |ܼ'~X( 8';K uuͽ]0x-Oh;ּ6tqG"pZV~~ ||447vFFQQm; :˗xqʕ.9歕ծ]* o}< 7 KG7}B bfTWwp8xpުBIIvuY[`LMͣGׯ_OH¢/_:;(twq4(47|d$WttLx۰B44BZZN.>>>+45!=WOD"uwRh>~6vhO@遂S9wP vv.n8H 5 j'8H@@ZZWnV uuu>7e=**(H[ lhHI=z|qhmҥC}W?"hʕW?sGD|ôglB 7/'' kbIɟ!܈'P\\3{'ƍZÆ`eg#`TdY?_f"^ZRNizg`Dᡉζ6 <O"T䮮֯H$ :_,FFq?JABRr4Hk(- urI"uu}ڊo_>lbth# Lj9g*-Տm я@#ߞmX,}q)&i޼ӧ{W\TUM$.6WQçn@)B?>EE""BSׅkW@J90=57X2[><<:jpvOϣGw2޼`_pZUN5P\r;O tuUV>~ 2;zwww7aN@̄`l/LYCoWTLXH-(x_-]5H'KJb,,2=Xka8sj IDATBo%>.??+gfeCiX$S)]T,gdffafAH$ @E0G9e45454&Ъe6 `_ZZ. y(ݹ{hX73Q6?K $;Z[I$<42eݶmd֭ǎEF^z[FaGWyN[#6o?H >sݺ2=~Tcc롧`ho"qr ʹ79ZۚZZd::vNь1612( "?T䗔q|**u7VyگPT G\B+DDչ޼mmM ߾)"KH+*ӏdLۺe_dԗf=A!!>r?o2r |Tyy_H$ Bgyθ!`mm3C^`JKBhܹ~nwJ;NG><}XJMMԳgfbńnȸfj1=8顩=Y9?Q(/|pckom7.FFʳCpZZC@(ޅ!_5LX 朜ʩHRRZښ\\S_yN"uvwutIp. trOw߾`Z[/^0{Kq&׺9۷3? zx%&dsvRCgeB#0D3s7~Ш?mk[ZZJRZBEIi Dn/^ QJ @J4H 9ƻ;Ξ={-}Z2 V^ƥ$7.5[,۩?|?WbU0 @Wcz>~mm1:;[`pJJ$v=0|`t|=4D$r"6k Sx|K[AAaASق"bBS^@X۹N@)2s7dduuO&&azz7m߾BG{b 2*`cѶ޳ YҪ?`LVnbe) 2X~^Dݻo/[ ~"IMIIy_FE)+3S=hfC*Hbt- A,Xlss}=fcecnOٍ/ srB_sAndz4,ɓ~sM 0PP{1aF&2#1qۃfceddb_$!,2rE2ƏipP^KXט[|ã&--$IGKHcg rv⢤ssnb%34 ZHb;:++ I ﯸ‡ohiݴ9m8|xXDTP'9xyی2 TT<{~'( d$sN4I_re߾$"QYYM]FVHml*,x=5*si)(|=fbfabd$r32 4EEDEyx׬޴eݺ nCC[88j/? t)" 52uwW^<؄gv"]]iio\QnkTi1/SZ}k55R[;fd}C*^__RRUԀV`0DQY KrBF?X"(\LWOAQTyll(.NK?yJ23xcҘ)-kqB+lml-,t$))?FGܻӭ}-enE 챷OHpvixmz]^ޡᢢaee‚nY[M4蠏 99{xl)sPIļ|l%' ??--wq޻wej[vCCv: uO\:y͚kk-M_HSoLWwC}ewGGŕP-_~d`֭ sWZf1Clvqxyx)*`0m--Uqu֮zzQ{\M l߱~:/XTSZJATZ II,Yƾ}bc1=__S+a߼ZÇVN(Ν^nn0 +Wšv:l@*s-M_COcb|"SYY-)(,NDk]l5%3366((:ch_PPVtʼn+KKO7|g'ON|…όN^0J~~(-- 77/K1vv:<9W.q9@((mcwpop8N;w>18@00psKHhkvmvu )?zI +m>k׾xqE n6~c͛Wml45y玠ߧ/\ ڿ/:z`n)IUUw˗+)|^Hwm5ۑ X⪣348=(w mL $092󭈭Ǐڤ9 KXdh}C1=y>8HN p]frrPQŵ]&F9^80p`2 ˯8{nT>h[;|9$8)A.TPX͛7[Z.Z4ѸƓAa7JJ&l=,qtx~ Ȩu[Aud6 EG%((**&*..%|Ik+=]!O%;""⤥v7G|"#QRZfZIA8|_TC@o՘ǎ_033?hbrr!!aa.naa!N桃x}}bbK$-\ihwU;qs{x:8tu?JN~ * J#(()}@WabSS  PcbZ[))yx.8uj>g+Sfhq5%?YaaGܿى@pr˯2pAM LvdU:HdrJre-Ͻ'|?tii}mʋg3'AA=m-!KW:ܽ+ q8䉠=I\mlv찴 r|ܹ&ӱYg/o\_?S/{CA!*jm+!v޽'Ors=I4Gluu,<<] X|m皩7}oJ6?k/\hiBFef|[}bm?~W$EV+]]m:mmaE&<׳gw3޿%DZ$奦z5;;x/_XPW/Wy[BR||.ݵO֮0w~Oɋ~rd'F/`4@u[pp13_`fe3xzHz46s,VE]ݹ(.`!ZSRb^$谰=f<ÇGqqyH:LL x0{uTRڿٳoYusz['%lnySá1C_ O ս)z񂇗c>Q^:;5mBU#C`И(pc?IIxdfZ`wWVyxzz 0~% rrZZ>$DD V,WWᡢ߮=kn~pMWDK##%ׯ{m[40((&8SA>2O 8\mmaas(|`?+`**G-x`gWccMmMeiIVvNMON23ݹwN 5vv8yߏZZUYߪ8??.O$=$+< 5Wٮ^$8cGWXTٳkVk0h{uUuuM-3GN=p? =#ϱ67gfݻq嫷o?~YXXmpt\KI ;oeosy""RSX~葬,zk}}_HIN>rEr;ѡ|z%o>LK˯jmEih;9yyبrr"9;ﯮ~AÇəKKkk::əIdetׯߴJ]+un z]]]o/)..'=H-}v#4)殮a$S_Uqm>\`/]I5j~ VXDH@$#cUl 萑ZoOOӧwNYZz鲟ߚ5RR:K423s߾bTB8w^tcLWWyy ..bb BCEE/_ {y+)@uG SS/] Y|]׭%'M\\hhd#PWZ[ Mm'Lz H`j&mlLM99hhҤ;G] \^Td~0[J p]]nGo%%uw|@hht؎7zUT,!)CIX]]qq12'9jjx<73P H { 8\MmiiA"Xg_ FMECMMP =($ٙ<4 AAwǏ[όꔳ#w_4^6 +ۣG9GFde##Up^^yym 0pIׅEdDooE8޽?GEEڶy铪u넅$gS8uΝ~~K< W_=O?N/BmWWfj7+WNS芚xz=߿xŹy%;vэ=!y9U ~ΜCSQ(2HNkhaoŊ5k^iΓ!44l||’7m޼n "kj>s'0䔂--p8==;;"%k22~nI@geԴ޴b+T:I%[prqqzϥ{{ĤH7WEO4++9yr߿GQʕOUS+cIIZȸ' ++?|hl&#cf痖Ҳ" VV ll=7o^HK9卍N'VVY٥K켼6mZFZa#S*]{BPP^^Mm2G-[Tٿ' nܹIQQYYeec=4'z{oR8'sM]{-z|N} 񅋹W./7m:R[g^jp\vvU33q z?EO/2BE56} BBw=:vm'#}&ɓK~~ro"8K@@DT)IuuU[Yh PSO 8˗kk;9ݻ#0e$'Wvի3gtރpvsv ܼyJ3./'/8u~?EEo_O`fzvk _\2:Co{ɀx#"].=t,N\b붸ؘ.5o:wzȟId(*~f`{ɯ^~M$23 JHHIIK/^ldlkb$ï7JO۝_w>^"qhgAa, ]\߼؈11ik270z*+vdD[[Z PgcOJ}J#* }P?4$'dm'%?cf3W6'pdDN]Eg׿ rr`o z{,MOR`7 E bm~^q)#-l&ANyy ^,g*X  QR"qFx IDAT(AW. RG,qzGX[?~37貲`77[K׮uwaa%'GZ[ޖ~UX|yաO o޼v蠍MVVEyHhLjS=.8"R۪cbnڱdh(*uk?~%BwwA͛u|zz}=CcgWTh<2Ρç}^,YB@d&uu}۷sr,.no}mɎDbGGZ[s |HdǷoSBpt,@BCzny--A~B"ZZ7mZzիW15spg--Ixt#m?Uܹ*"2i!0."be{2v²Pb6Rbpff1q_lo(++(x8&7D?xciyLP#ܣOrtt)즱17n]U>u*'GVv3g/>+7j Ђ,1O3nl1i:gǏ.Tլ GRk{zzRBA>ɆﯪLO{}‰郁N᳓ZߛMM)!$dlfHd[+dIgd? vXhعsk-fxefWy Fƚr%%/}}];84zxGPWꚚV8\` _3})Pԓvv..vv`KBIHji&$dgCq䨼Ž99ssYYii"QEׯji7zYPVPppRR^0@=t4АQFWMM}!'̻:{z0$q|7RBΜe`r@\K܊+ll&_ 9xX[+0%A#)ȹ(".`0rr6I)Uu5u rU+hpq[Xم;_`ltb% Z)+%Ţ[> quZů6Ȗh隘zyuFhZڦM*W33OeN@gfgXx♗++Ѯ]zu@@xx|Bu՛6n&ի=q ?tٳotI-^QϞyo|+`ۼ AhPׯW[||Rmm.C{#"*w5R[CwPWIZAӾ-,< 984EExx&:ˌM-Yaogj_7nܾpy6ҸWSSSUWu-ߚK|K _qŅ[ڳGlX}0P_HHIIMUHhYGF()7\\R[Q^D7g85] /_0 ̟`b9{СCPČ@hnNOK/*`_ՍZ[kj<ܡ=g˟KoWUwx<̙'LWL۶l;zBm޲83ydX 5cgWsS}/;멩ٳb"%**LL0mЦÌ}=}}d0FF dzlluuy-]ٍRRPtU-$͛ܜ7ojk^g *)N/=S~6=*"wvw?>9(+kakמSFF޺"sGZMCKMp;;\Drp,V27:w.88ڴIM<8xbb>n`D"FȞ<ܳ`ɓ!OȈYTTNv#mm 뫫jpX:ZQQ >HKVQScq>46ͨ%'QZ,+DFF`4('rcc;xLTr:p?.Op fppp(Q{{{z{d$6B"P&(ݏuИ0.7@PSstrqC3 FO䬮@''&TTcȘ҈+/%"0XOOKKkCCh ׹1ܤ$EIߗ54T\|HJ:;ߏIΝ+)O63K4y9奨0 }3 .АP]HEYs*%uE!,fe|̬bFk=r{fbRTذ} TT߹~=5Hsle̼ݹX --# 3'(q qr/egfʤMqͳgn(-d_U_m8##{>QllEYOUT?ԌBIkjijWd~yFJQqUU%EԊ j W_씕RQa lgSŋpUݍUT,RQP0⊊JRBZBl!G11e__H$'gaRQYjÆ;mFF**?pd_ ŎAɳ`d48?V_К}ґZhM)++3 9Zc,|)ЈKHI&{{ߗ%$j57_YCdsG]]ttTU-URZGft L}}c ^[/TTTPPW72ZnӦgSRkkhT}}%=*@T`ԒZ,y ,NLwҫ@~~|ǭz:B?܆8<\ *XY^n܃p!ݻs֘`0PȘe,&CNEWn7Yv쳌HdeڥBE%.~ٳV`ff_߳gow|$ctZUrW/5pMM|ڵ** 陛{x9VWcHkk?Wo[B[[QQVFVVۼC<v݋HNvm.;;1yfа^,ˠݻV漜mށA'x|UիRK>VpUգr`a]NNQqɒ]OT]Ffzv|j|"lh&1w6I))Zrw&j4).fdV&T-&}ߩSV)(xoMMŠجTU5梢Ҟ=Nz>&%}oTZP[jN,ݾ!=IO$+krg' !HsM^pښZZq8hm77' ͍BֶܷLfb*+S7/'B"&fT$xy()١D$#Gѳp|bt-#=5-GGK-&&!GFCS3d>EU ݻ gg{@,zٲ-[v~~>:;/_O/=љ42RSs/JII;;w{\ݸy榷 ?Μ#莸Ӿ x?hlxr߾10˯^coQg1y(6yMG %UP44 ʕ6'L<~bV_ aa`;ߟo빰SF=KIjnvq3`yYZk*,ll VPRR23]fu?!>5 iij.Xc+yJrN. uo{{ww1QllY[1Bo9bd]k;}H ̵u=Ĥrv}Fk`K4()"A|7W BBsysgM~Vx|KKyyeEo&**)%*2ս$9:dK Z44 --"P?' 1+z{f{:VׯGK"44ll||BB By]\Mor]~АgiiyyEȑRLLoP_WWChZZ5u%%VGBWQRZ)%52OI\A DDVm02=w֭{vxSÇVά1ύdW_y … 8E@@RBKkZ773_>[eeϞ ylJ ",lF*ʿ$O|##,,l?jk98EDTUO4Y 6Zr8h _s'h##s*XZȭ;͋mp^C}\ F)Ҏʆ^z-?.+kdl~fפֿ:ڼ_]Uo߼C =My՘X"E)mLIK%ʵi/YJ}aaeB1)) Jcԩ7W}F_COGom$Gy9BǏݼy w6ӏJKDE}?wrMsAAo;_|ڳͦNNWnصkZ2kqݵ4Λ#T^qζmN7n%y.\f,)5yDhkR{,**\Vp "geUSsw꭮;jh`?A$G@C 7d04=+B[x?[wENpGG49RTdŦ;v;//'#I65{ K==}b^wo򔖞=hW'O|7 7m}v~c0 n+bGGRK׮Uٓtڵihuc{۲eۼDE{zjk_w>'kkl\`3:&"% /n&)1~%2dʪKO##/_v!|\"bɓ>~li?˗޿w^h/7210(*0ϓVY`d-՗05v3a[./ofD@h(Fk.\2j3A)ɹTTK/\\a档"!.nQq,,KN_'830̥u=䔪*}CdǬgYKK<yxzړPu*C9:wn ϐ?sj`w`H@)SGSQ100SDCO,[Q˓O,^9+OJffĹ:S ,ZDc]Td[PpzZ)I mΝ/tr trfbZ˿bo+Z˫k- ;W@c޳zc'"#v׮VStOK+!nlq87P`F 7KcTWzߋ X,$)) 8  ď_nj*+۳;7`0  J42ƠD"--gDD8:HJFD|>vHVVyuuba0jj!!#CFى1Q1Rϟs"ĉW]?QAJ:=qkAImLr՟_Q[@+z D";ەv,]].8:HI#8%# nn&&Jʩv uKKgWN~[*P IDAT/四:< ΤmV؎FSS]CmmO:vMcgz{ Vfdkk32߿D_ K\!21޽Cr ;q_Mm*{GOOO;U(qt^X,9973 7 ܼ<\0@_o?M۩B2Y9XYp<2Ԇ6D /ѰڳWEYYbSWd瘛=D67Ɲ"aahmך5c}å7;To:3֯߸C}LnB 77744J"*;$:;[[Zp#(;PQK|N3ΝjM D սtqSNAAiIu oBA~'(UWW?C twcqЇNhčwC<H$55# j,vva7M11ۼ"/x_Ԁ@Iۉ h{ߚQ̄d"Ԫ2_i|?BHfM?~'Y\PM o47:!$bJ退K4432YY-۸YQa;foq22R6)?2[Uuóg[O668/X0s73^%(` ͻX5j?##oB\%FGl?yc CONXQQZ* )&FCCCOMEALNNAIGOG }EH"ȿk߾DYY`p:*JFDh)ihlR*jjj**⼼ O~fhuZe˄a\0ca12TLN9wܼ2**B1$rd@޿ vrڷ/5HPVupܻ٠SR@MQWwXPppj˗YY]ܽ[_OHKkۖ-7\No4855 8niijz1KFdffc9S79::Z?~$YYhh~vp0420ûI+*}rq+(uDfmh V_ہKhg&';/cg:88?("HNZf2㶱a=[45HD#0"$IH=Oo/1i uu~=NFFHu>t&s#ˠTRWQHO,?j50Ul\Jrs Ryβd8I=J mP(z?P\cuPOoGhC(?8澯SR" %}!"Iy/]mr[ ,ZzB@rΝvM}o./,8\]]uU}= #{41۸i:ڋȈ@hhTT!}'OʌVUOcz~r+KI""-}Fbx ABBM M cTOjJJ2*ree MY/ A7 %DVVAk9p&&fff Rvvffy}b jj6V6^A D/ srB_sAndqظ*͉ `&##%95-99% _@`…_5C5RD'΅5>`Iɩ)-m\\zzK6dՓ$#+-MK{i` #,Wܹ&?C̼(3X__r{ c..Gc (+.k̲<et? Z~|O7=8DF6a7f8 {{llLLd9_fWUp!%EjkjW5g~-/_ꩩIK rpC+ãll$$()\}ym ~̃+M--0#؎ʊ¢|J _qu ,+is:44p𰈨 ]OOrʹ/efx4NP`Hhzuʾ}IID'--TX0.6{jjEURPzCH 64dgdii00Yi˺uܜlqp_5?vRDkdx, ϼD췷߼vb^>,4+jj$l=vȐTV ک6hm`$7z($bc~bEP l(h.98P\r^'OQf/yx,Vs8{m56NHs岓m}7%`萐{w{p̭۠ݞ= 7B8 m];4\T|3LX-k!'ymۢ";;yxn*) 䔐266^3110TV\ II97/'Eexc++޿+(x8::.j'nUg\\zN{![6p[<<hh0ֶll斖*ʌ:kWW=Ȩ{.]&X^CHlh,*)-\{$,c>CC /Tn|j6_gCuVobaqGhGG4z&G]!a$%'~Հ 3|CÝ;[`0OOkM-A!勻W55)(uoC(䗁<}UZb=<z/ %,$.." DE&-ZSP,X -% 0FO׺٠y$(-{ @[[G{ٳiiO67;8?.m8twwHIKJJ J٠b76 *q@D)T]voG>^ 6}/ٙs mۙӦ dg>fzef+(56<=uĉ"1x׹cM.DEIGRj JD"vBB+=<6mhWLu|"VH@?ֆ">]{HŠEsr12vp8TmL1BPjfOuVW`h)(=PW@!S+H'/099' XY/f]]ccg'==6[=a3]Yy!O\=ڵm>p +]̧|4_%_۶j^Ѵ,,BB""Zg̟ob,!Ӑ =r88xݻNشe OFFCujg-[>/ ֖{WR۷ ;qǃEH={EQ1 pΜ۷6 _hѽ ǎ:;KHKNLؽRSYYŕuu}|r]B#vtO/Ϋyѡ!q8vvi)55$t|蠣ApPR21YrL[55dXPfΝOsrEFdd?pըvZZd}iiuu{N]nm%';V9iRpP||l'b.]JKݵ;7k ) ~~橪~ݸBkףc=DܻRgw{bRյkd}55䤥Q)o"CX98%%CB-Ybg2HDg OIagع3Xz>>G 0IttRR҂B8@#гgEEv OOZ.#B0`CHPf gNõ ꌑ#uBBU|K::10*tܧO-/팔F3g`9sr-:%mp᎝6lp deOp{OIíه AvkS9O&fFRRDG#S{9~66#ի""lAmZ*"98x޼GG;'7ϯfώ^V 3g]{#GSRjkZ Y7]LMO/e$/O~l2|.29Dԁ?#C_ϯXX ٳ'OĬb޼YYi;wYUSI..> }sUU{d;nH:}?s:,zvv||ߣwP7׻wfLM?_A5HBJn`බ+^3w0v`3y=-y= ge:xv=Bijv=#MAG/$t,wCuFLnprf;]iLL!y`4 }0J$қ7/df>zEM11=сsWX-nxȪwJoo888hOWzZTP@$p?nBA@tvv!!z7Onedd``dq/ݿ;a%$7}WI܋ "BB/_޾sDh{zzz&fII55#C..AAqT^xo)ܹ#_HQvgBilxqw;_04ܽlz_0W,:oϞ11{N1CôH=kkjk~A݂L$VWssM"e_JJuB|{"<ٳwvF"TdP'DOm۷ :\?߫sKqhԳYYUFRLR(--))Ya012c =}q)9u8|;|GiikhxyZ-)q{w~n3g>Hǰ~͛-ޢ!998-!ADt{#<Ύt޽wp8,M@@BLW=hU@M&$&yy-Yz>SQaӧW s"O/~V^^_AO#)>m"+&*=}䇒.)y}`X!}dۙigϰ ^w2ʕI ӧadYY~ ڬ ab>78q ,ZWWYYSB rp 4mwwm]ffz]-+ko?o.||/^fOcqUUٗpdE={[G{8o'q/+O!@7i|5EK37\J{g+*ϙ ?~J{{qG%ϺT vqnbcb2u_ZZ܍~Z$(mKؘikΞti@2X,Og7yD<#OKfO6/K7䑖<ϟO*// 9Y55KK{{oﰰ3g >}ham 5kfͶ40И8QEEK|,7࠽{SS?[hzwRPPW׷={˖sEE$>eZR˕S8x1XH,(X5o;ڡ4%mZM-CÍgٗGx{ϙ3ZhkR!%7&%=~ +WLflkf6k֢E۷ J ^edfkkhmn>gOhhl{>L]]uuQ/Z8}[膤'ߓ?"22,ёW4iTRZv)kLCy%%mmCCKK ܷ̙;w꺺?;>KPU\zzzͱmo,IFѣmMMmlxY/ݿweP C?پLIiڴ/^b7XPÇ =TT'zmg9VV;놁멑}`,^(@nck,\8cI**HNd .]С Y/^)c u lVL9ZZjex1/I]'-CB,}cX;ՉV H]~??#J}ש8ZTtxS .<b`#*h)h"q;tʪUݔ1 @hn).iիs\x Aޑ0x|iiLˡC)+ϙ$-CG755Կ~zg>ySNG#Fꞟ޼.,IHH\PDlzzh(B?ٔ5kŐʊbJuvDFΝ#&eƟLnn~$!!4tժjjhP||?#˓7lܵඨt I^> kWO':yBN%>ljl۸ŭ[..^HT m1!!eKJ~tu,7sR IDATxxΙ;ɱw{{=~T_s6y:=]66 SR.5k֚ ;3gغDڳ'%e6_i z,w X r))**_o;\={ܰa K $}?X`41hb5W}{$5_]%( !!+'/&&-3gki9ʊ#7mjk363wp"޻cf^|߾̣;v,]K"ݼnmHHz7?KkQPa͟}FMQ Aih]32\|۶~Q^4q<W22/t@{}a'=G"TVT&XYc?)gan;SO@|󦪪򠣓њIChj3ӧmݒ}Lh4ˠc1ݾS]MSKJ h'c/%)-ÃɵuW|Ls_驮B(B} ,';W1ҘTVYED&O64F>oht47gVT Zn4>ޑu ux|vwڲng,VR~]AAggq=VV_WT8w9_o߳?k(IZ,Co_{j+=beem8y.ӫWH0Y&i 4xa>'Nsϱ)ɩhўB,̙_JJ{hccEqEE״t``do訬FS("¶NړҏDARz5?4[ZJG)8YNUBM!_<ϽۛdE!4=L3٧neq NKTRRVZbIVwp|ueQFRO V&ckxa{uu=ywfsړ/9yx,xxݻq[G͟occl\MV'=ji)@F Wt tu1+ʋ\1pXy>^I7o*{#**%=3DH~׮l{IGbnnf}FFƁ{/kn*-s'#/i>DDM <~tzkW)Uu--9Y11^>&f݋yWrrn!7gw0i멎.uĦM[ ζPֽ|YTXVFGk0BI) VDPy*!(4=; PZZ\X@`S$,[8Z03#:2d3gϚ=JWGJm4*zR_XH L%$4WPĦϟx|EeZ*US[<ᔅy_<X="UT,qtE ~уԔP䔔KHĤ˼sof Mq f1*@DDzn?/.\С--ŋ7llمQ+V88^}L|B9u4?^2{цn?}رCJJb߿o BB}-nx99yW]fgl|*-ݻnr9GD/5^Dnjqmi髲VzhQ?;;Bb9P(:ZV6n/z^H`cbA2G_hiW9o*INyybecy++{]]/^DG{xFES.[ju5m~~\lxx`Oޱ벡f΅E=ϝ)#2qҩ13sᖖn˖oٺv:&]]uϦ0OZڷu7c[߷tլ,qNNȽ4{%%Gl귌"3ɍ;^ZƠ=3<ޣWUU9ٗLY_c&!$/I{{,dxS&X<^HW-k LjzBZ*:serE}|VP޽}Y\l޼s789ymdeF |zxzGPcB~Ș8%Շ֖όLlZY[{ҍϜIJܷ-.nqqUUC3}}N쌊&}(fbkoz53Ѭ 75uvll22:[.6UP'h(YFZZm>p訤c֭89eeuO Db\drߨuumm>w*ꦤ},s]]IܣG7m:NUu *AUK+8̙LIIrxDGlǧbe=R?n&""?EOMO>eaF#ixz^B±c=nn*Y陒{eӦ9srWfa0\JJ/ ;:&))! ̞}{\Y3ŌD?[X.j=)yq!=i˖Ma~~vv}a l?'1RxxDD3Y YG.tmSDRfFpÑo3a~K VU鋑XXD\ܪU*} doFF;yb"g12tsJ l$P٫ĀqqhV Z+*? "24<0pG^!sii[R(h4 }=Q9;]ץ0002Ӡx)&W6NVQ)e>e۶^{nE lݚ|ر9sľJ:/w'ǼܞCxG&%}ut<{- @KK]]aŋlۛH޷r#0{ӧT%"+$/!I8|.ۘM6P(,#p I͇DmݐY3TVȴW]~٫nK -Ma] (/~`bfbcga)88СS ?B=!tÆk{)I?oOr>>ܼ)*p䎝3DD'7^n.~㙘Ʈ. EK.*}͕UOSΥ޸biag$&q9w\J>|BA$0Њ%{X~ˣ"N=xe [20͚xκ:!gLnmm"脄 P-mmHl4=ÃFHHC C#5'0dLdG5kuD<l~ȉ̞ž{g#EҁH`{@|ɒ}ε ۼ`%CCNL1 \1qbZ$<bIwjk߽COYC2ӧnZZAAaa>΢ÇnwWHwqҙ+t=X6%h55CTVRMM d5o}[--/2@#[0aayY96nM𤰳̔DJJKKOWJ13˷e2L[[SS[[Wކϟ>!WbDbK+L&h(--_aLLTLL?#zf]4==++_Qq4\ /^^VQA II!!W.|؈-eekCclF2H]:C{=d6uՀ R)y~"2|wwKKEŮ]n7n xyy׮yzzzz}~E47xaF%řI>}@oϑ\98{ghiiu<\ܿzJ>b*_*1( +'HOEGGʂ<ŠX MMM}"?OFY9hi虙YxYѧytututED998L*-B55 PmeXC#=ǎ=|LȈ6?Anjnllj"ė/cs\ Y[}ڽ{Ϟt͋׬Ҡ'Pw[aCL̕+wzS97wE˖UT~_~* JFoOssS /_\أwMO>~PxyyjZZ K+ +Ey4g UӢ/A!uu um.vrVUEjj45 CC+)HHРsrR_:m]kVG|xoh1,<|7_pիf|Ѣ""հ vvog JM1-M KK.Nd8k||ZZ 5RPi;vܿý|y<1ە IDAT2 pBV;G/{g FI+&&33Gw<OIB=ґ_4zzW>ܜ2(0TbE׏33AQ? ;|eew|ݯFcee~jd1wO&ўB4{,j@~H|ҥ+u^>))/_T7,ذA{ SR{If3xS"?3xa,>F4ؘr?̓Iwfd^yWmjjnJ#SP˓Ə?dgclco{T *u~XYGdJ"3}OQh,oxScyY{ux|g'ZS(q_v`/s]~dbx h{&XAc3Y˗_2ikLC=x YqqZ G/Ņ,t~~~٫?;@x2g ,n=}A|ld?{^Ҳn**6ӬM&pz/u?g30XZ(?Z՝3ppŜx˗iiCYw$M 6m]];/z޽m TTW^urŋع<<>TǻJ,[cUj=3TPJրRΕ͔F ))Д #'޾:P(66vznruuYieÌG=56 ۫V7ooy2r99۶YŏF@U337n KOkol^66Ee I2ɣ YՃwBVBlW2sxzC7>R,m]' MǛnboeadbbcS/-}'/(H$ּ{߾P=Ǐw1cٲ;wMLL$EXِ_?~tbRRJʣG|Qn CԼM\,&rϞ3ʨ @hTcz %76.,<>RLhNFVR|xo=u w{W7'%FG>%RB"_7I=rdݺK(mm=*RR,,]Ogfd|Ĥ9kqsrqsrp)_XddHG'+#++,.&fotܹgFE-\DLy=>С)Ν>>ړzZ"#kMM!]]^К$"J*)I=w*%e+6oyCBimy6hPÈr令bhiyyee'NHMNjj)++& b;:js/#_NGk;!_IZ|._am}1;8 ]\j^wqp02QTb`yajgNn ^dd8ؼkָ^|B{SN\QQzjLLB|iɓN_7}}}R?}RS]|ӛA@@AAenHIw] xN?y}qL Km%XXq**<ʻ]U2{?/8)IhV֑U/ |zm ^)+{L1''))ZZ4ZD.hkzlje~D律mm55Dޗz /hoi(#lNdt;;^Ѣv,sp8}zol"ww<~R7wS)i,sgEKnh %$}\; "&ʊ TjQ( i '6X=񏨱Qy-,U&DQcc {={wnn=KhΜ6]@ ;5. 5[AY^'N!6zj 0g$(FH<|_Hhygئ[ν{g\ۙFF\ܝUOnݺx199'ZP)]../Ɍu23KNYA__29(x}a z)s eQ興䨨jb(}".$!"{1hcB6 .DzEV,܄á_lo[ertTS53M4/C+,LA!=ɄƆ ZA:%199' XY/f]]ccg'==6[=a3]Yy!O\=ڵm>p +]̧ Ay۶8_}=4[HHDDVVSM%$zttGoݺ{wR҉6]hhXY^ںecw"22wJJzagRP06\yxPмH}ϻ(*8:Ιsvئዼ-w788!Qgg vvCАsɉw8~]jj{;+o|C 4]rَeby5/::4T".-6eʶΐ\Ϣ||<=аesnnLٱqz ,-lHOyZVVllff]݇tt<<JJ&&CNiw L۹iN5ȈλNK8+-nw ݭd2zV9iRpP||l'b.]JKݵ;7k ) ~~橪~ݸBkףc=DܻRgw{bR/4h3/^4~k'O^3--Y;w?fa.-'LQ g==رqۗ/߳GR*)iZ]vv-gff*+ߟ:i vhjBFuhiM%МrsS6iA!~~NZJ@OH %гgEEv OOZ.#B0`CHPf gNCp[,Zh4h35X={ ;F~SK$%M̌Fyu+R^e mktLtԚUyoY͋ ~xScMMG/ԌGAO/+xhf|zz|™3׮=|p))mHLghq.&h!ٳSR#"v8y#HKLTQGڎH2]Nn;7mٰэ,ba2=.]5Xo$u2wxDԁ?#C_ϯXX ٳ'OĬb޼YYi;wYUSI..> }sUU{d;nH:}?s:,zvv||,z̙+`Xߣ /P_= Cٲ苞/@A{oГ1M?~~VV.lm0T@9Su7n<czH_4yNSӻUUO |m_((O#$__~Zt ?#Ït~QVv tu,!ﻺ]H^TdmKT$@331KJrq Hhŋ}kebԜnu<''ӷ?W,:oϞ11{N1CÔDFJOښں:?ߞL&n"{7ב3 Ʀ)ll  Bj\PZZu!5m۷?Zȑ0S=H&vSHDuBD56&&pyIܿ{AYYCC[{~n).~Q=z<<22괴՝B5I gE;WPOMK=sj'O9;3M(ɎM136F(\KUD׿YvlH;fzEylmΥxYq}=** S/(}bԴ89SLF}355I^^KTTغj}?~ܹS'󋟕wtHJO'(HKS%KNĔ<8nhhׯ޴q"17o꙳cX\_-L44$'%$nr|vϱtwCIWU<~e{b$45)"+*J+DV CX.33l7obg>> /^W3P11 M?woPЉsw lƆF3310? ޾}A%%::szxNaggdن@(HJZ.(0)@01 %}pnzډ6^y불ȕ&P(Y6}nq2?8XQAX=nʾ# J ,-:k?bS LL<8\{{[[yӧT>S | 4[R~nlLT"AAO#Gowq`z65zQQ I~>f`x$e$99_CTU=lقb?'OVTaݛvWWSTdemlڲ+]\Y>*yեle{j:pس<" Adr{[}6<$66ǎUTHkhXff^>QQiiEE%KUW(7N&\~򤢢M}}[',"#j8y W7//{{^ݩᡖJJNK.^`3+S_9$լz,>M^O_wH,(XjhS+RrH^Zm[pnij9rzXnx3gyiə׮ySWLC%&ldH55xy;g8\M?7pd s/_^Y}WʗO*33xdDffAGϟ74#cNu_l.UW_p2""kEEuul=zHweE-?☭m6 ӧs)ffgut32ΝY$%=׶Ѫ =m3w뮹f{oݿw˪չW$%i+(8N)lni֭))YYY74dd͜vÇ&wel4P6{kGmps{gLJg=<7* Vdff-0kת`,^]1x;://!!*̙wKJ޼inP$%'Mvqqss 5߈OGN JJL着KKpqy{^$;?XN.E6>XYIJ`=c³{w?u*NSvSZZZOçϺ 038߷##$!NCsޛ ԔՉ36֖K]x< @ЌM$L.ANY*2@hn).iիs\x &_Zrлws游8:IpMM _?OԴxg|HCӛׅ99 B ^MO ea2f͡ÞU2s}x_Yq~zz\\Ltp[ɳΔc~ҩ{ 6&ĉwVvq[Ғuw{^{z`ёefv@KŪU+Mhn]H|z7 ##'l;;Y1Qp8#9Lσ4AF1X, XxKw ;ZPݍ.0g󱑱" FQ@͒mo;9zhxwqDzewkf/s2~5~lKK54ۺÓY[[^~~h} Ǐ%%O\3vc7{n 0|%sse1k7LV |ՅD t~n`Sw7ϟ13;~Ca0FFc!@ >vkWも2Μ&'g甑14\ejk`j*%9ZO`P0 ЉǍ vnvx<)AG1sl," JJs*ʚ+VppZY{^nh$'KBɸy$٪J->7oŹ-fzu""Um-cc==ooSm7.yy)*XX02NG@gfe̺:4ԫW[X;hio377||]]F-,BBB#"vNނXDdwJra/Tq3Ya/$\듘P3X}ג?}4fd`Ɋ zv^{/WCp)\\.KKQSw_KK::^t$rUjhƦ- )u""#Cc#UUV6_pg!!c#g.ם/HfJJeYY%~F9#GCʖ,[a7FMK ;6<{ʕzP?Qõegdc52% 75yz@;w0[a^b.y354 KN` g_aleliySxx^eɾ>Se|{ kzs+44 LL\K@ J߿ff痖 IDAT_.*>8$$Xl__Oo_$BkJ*b8r91'ѣ~-+;.669YssoccSS32">奤>x3((-b bF =q0(QAڎ/^<_8lt0ƾ"£1 16ơrv_'/G𡢢a-- o1hjaE>5 隮RRDc޽kjjmEJ/+'.@D42<480FW؟}jp?'<,//B _kYDd~4KMpSG}kn͌gp8%%'gWW)qcnn.*uu99w1dL}oDN<+7? 9<+UT\fj(!!&&..+jhhk|+eB6B ?f 55iiee5k|ˋx+4)ing+55ee ׮,)qzO;PՃf[Xl[A%1p%⢢4==٧O.}7|<3ng'&GFk*kkprR,ieˈ`o^FCQ(4i<_w+@qqff@GҕCaቓ&&&+NB+*JJ]9vN񽽩inb^^Y?Z֢E_ cKKKF'vSS'ZZr22v-82ԔzgXXn^s3؟ν\% 굜;K #c[m }}htggIIL펎VA&)%/medφ64FFS{ldV뭬QU][Hq)Φ'؏Oi%<={klLNguN씕uqݰaOzު[7cbblؾՄgAq4c.‡O))ظ߽щQѕ+OttDKK۷OSc@ TmGg{[}})AK$%fe)(l~Y)=ݭ[wWVNx N&+\x=% e"<=DEXm;:1hm'';Ͼ 11;Ŝ$S4~17os }KGERboOIH&[^Qsr榠 'ce~x#%efbxZzZJj8NL߫9!fA=/V9:o]_@|4f;QWbb\\H#͛ ~?9}#x{;8z2\_i=[߿wPGLJ44ttRR=='q׆iG66SCC"ϝsrrp8{iig`ffƆ׮FE]E||Z֎N'{ѦM))VYhh?nvWljr/ğ?dm]Qږp횟4J#c.YwU? LCQA]=mlÑ50é99\[pmog)';v]ή 1QWUUtdeAyPc=/|Bhzgb;:DD{LLLJJX8%%壣MMWyz:捈n\x|{[ͫ䔔TTK]~ TccB_O/%-ugp8+~Ⱦ/]NJɉ ܙ02BJ% XII/YfO[멓. VP@MlWP)Ij*yy/={^MJ<~C""F%K$$W429 FI.|Q&%'ge<KDDMʺt*t4ԣLL,wfGDd{xecWTpr:ps;]AP^o]?i<PVWɋػRbgf'T' FC#+Ռ q3gbssϟ usگQS22Pswcʗ/5_>|bddZ:o(!>6ʔܽ{W˝l30־xfhh('С ;oMxE=z|~)Hׁԅ=^AhýlW͛7}|~`~ܶӧ--`?َDvIJؑ};$djlhUFF>%lؠdmz#O:+"xm ; Nvʕ?|d,%%+sv"mmg׽{_KM-,dho? `j b/TV姥66 a0CC$A8 'Ǐjkwl/~x"0FGC##($ P"kלED]vA2֬ tRP FIk1߸a`OSSRR8QqEoDF^xjRyX獝b|T99ED$%kjp2 ga`~qkm:q"(С}4#cv R|B‹y? !BH9w."bڵ/BBί]; GFcb]\Ν߳'---R׮EEx1:zEɣ G]H-+m~o!## %Q#QHئɧp84If-CZZRv {:&AH0םΘ0WiPaLL""Sg>+<}D m(#CCB|DXHRJ@7o!휜M-s!?08}@ 13<=ٯf/2rfj$%&0zPȽ{SShh=\Yg?Us !BB\44*VLI{ ^FWLXh˖^HJ ૪<d?+308wNQa 9sm̧=۷sr)ZӧVxJEpԼw߿wqvwυЀsD@YS Ccz! t: Q0-=-x(EG%R2[Vモyqͷ7ees3 D3e33/77߿#.!$LO58008<ƌ/޽aˆ2<|,LH(SÇ>TA5[#KK' A g!@N>}ӖfRek~*k׺8:nKg$$=77߽[A~B$o=}#II9Bn"yy;CklzY|#%O_‚y7n$ggݿqeUsǏ}0hra$B|&記Fָ+'ań-VR23spܰa2dp.h4))'#`o  @Av c627 3'QBB*;v*srX>tٸ'OCB􌰣gVVrYZdu7n<~\W{SӐ}mu>8(:NG;3o{‚@`߷CS@o}3JB<<řӾ~?.ܐtu6% Cw;WDT(38@g=?CnL`0}a%u}'@I˜gop{YHL, +--3GDd9]ioCDȭ Ip-?;r@Rȑd+N iAB1ݞ90D K00heȽ!(*񍍵eMwwg0o 99 //dڟ`rp/kPcȈyZ.v\\ |U偁s˞33m$#=ylݾhYPѾ#G  ,Y2醅ЀÛLtj5E98.YBE?}hzt*JO,$1ֳI`dgbfdZsyc7Jb‹y0 -%#))9 - 54K G DMIyUT234tttt$$dTT 59 +{EDTQAYIYIIQAAJJH{f /Ȉӧ9`LL>>r|V6ҿ6L0ׯcbZqN;w;sde&dKYqݱ%%7oEEo߮^ys5!#mSLntwYXDz|ΥM:?}))XX~f/$$<<z"Bpxww AXl/j^cRRu5ֻJH`--/+FvV>){5;zY _HBRLj2㶵f[|bb?~PSSLM{?V?u5%Ƈ?y<2udZPWuV:7ks^fddNBFٳvngvۯ6$4("㛝]['Օ7v]@,hh O h LA"/_\jdVV+12 ݐ_ͷnMIpӃSQ%gop`aA##]]P NNc›_>}}2m5_||yvn^E<_s<(޽[^F\] '3.Bok s[} 95UWW~~4`iizƝ&&--]=)PT JCͻ>. oc7*U4 #!!F4+_fh'h';4BsW{ NN@;npp$rxOx:Z[[]8yof{ԒrDe׮]R]D~ޝ¤.kfT'Ν;k)HUėϤ~tFQel|ZZ8*IQQ]F|QR0jK)w+DqO⣢? uII ?`M }x^~7G}Ο 0y|BGgaS rB?>xHMR\[nnWk֬wrn].6A3YY~// tܐf߾qlm]mcRy#ZZJIYLAR_y+5v`ҷ  c IDATp ^ʪ>3*.p}|CNEϢWRo29=Elܘ~{:5uuk}F_x|KKUUCZmفB nDWכ7з$%A,_=4ibBiiK,^mE ZWV݁ #%1]y괧{)&{aV3vv-vVV"C-=KIzGVvzur!{ȈzuZ#/^^L[y钍4?'.64\Uu^/5]XX|s2sfdd 򦫌Wgg_c.f~fd]]Uy/Žxyy,307mi..q7b0=7H/^DEBu~ ڵ Pp@}}(vh(T‚9pE7[Y]3>c褩ˇ@tv<}zZ;;q8`b{?}bowwl[5$$%$=&-- 쨾 h>F yz8>^!!~>ܹ9w$%,Ȗ,ᙍB"gjo/,HdPO; ˄+8V}Bh&gv¢EXg2~nA&Ao]\CokfMiɚ5ե6|aV99or؄b..**< ZqC QStvqi32 n 㷕&+3NQQzzLLJr{{W03K/_irk..&+fJWS^3gNWh`p䈮$H%?xnpjj&&NNnnY+S55xxvRR}g8z4)).n;wYY o߿wJ ;@zzb#IImm]]CCtt~Οߺu䆔LՏ=}ǥ/FFѩݸ葓RRbbv ,Y"*ᙐp:Y&o ξ?f;bnwcb.'JJBpu~ۭg5KPZꭌ֏HI\qu]e*) &ơW0KJFMOy̙у$$P}>>))Kcǯ\sv24{mߚ̙۷SSdd\LZZW'8M֮ڸF؄ UUzO"n~'\NNIww킊H3b_MZZu<# XXee mm׮ʿٌDnv-#CL,\ Wu+pw7 ;;tF=E3 Cuyy88FFx9{j]MHX+0=caYLE*(hW0W )檻R,m'$qgbbvvAA))3RS6y-Y2Y ̴4;99""&lo5н{ZZvس{ݺLjjevG.^}_zd]]llFFSҥ꼼@)tA[ Û$x?!/Ӧz22눈taW<{zو! ySvZKL.pNsd:sBCEq/QSӧ?ڞ皩 [_#OSW55##;;\vRllfƗ/OYSwNl~[֬㓐&]yRu )96/++ .?xPGҒURn+0Bdy~~۶-YOly/%/O_VQ1X}c?IS͛{i JAAZZ p,8\;w2JJDƚLL x]֭r\Yi`&9]"dewּ#15m`6u=)yo^(.`AXXEy ::ffNNyo 77|7'+ 99ŏ ܼe A= D BE?; \ܜl_?*}GdddTKJJ12rp,Y2ݻwpr yqPr9`0U;:zo~\rtl116/^|Xp++|ʔDUQQޛFǜ;"(@L :$ c߷#p۷J0-49yooYiIIU57Epm$]^ޥ1ɏzׇ@ (KJB~~w(T QSR PPpqjj:8;:jjrq} no/*z%&ՒҚOX&ŋEE-;9.6?W]p!ǏۻGFZZvvŊ N[|8p0h`M5K~Z^N]]Na۷nn"b߽{CCCMMz+Q7.%&fmmc02٭[/ݾӃ-^}[4MCRR`V$4ZS-x7//CҴԸ{8x.j[ 5 jhZ|:Zځׯݻv=)N \M4pg 5Boj;{a..rƖ0==O*+jjʾ=J db I#;B-++4|׿cQSKKkj)(PR=zq󻉒8ܻw  ~vE\Ug#n?(TkkQqt̮][[X.##!ALLw'%WϮ-輼;WАgMU֭ڵ[^-fnoz ,cy *jZ&Fv.n 923MCE)--+KEuǥ%[xyo}}+Zvi;y^VYF{x-Zc;J$?.{ Yn8%Mx쯞_TǏߵ@Ce-.i'0GIiqoߎjhRRqs))AAQ#%$//Z,~vFxJцDƺٝ>.&z ?3))\S] )cC5WT\x1awmqq}]\|ZZp"5K[gǎg\]#qɓ bc::VW ''GEYx`azz/^ 8q"?"Lv4MR=GB-24ӵ]a³˗svr+fSWW^=>[>ⲳ۰a#]jj$$99#qKNSP׵11nnv'N{'z5 >\󲎎kiiGjjΝstINq]A.dd:=MM8뽹uϜ1[5eP'IIeMMMV]yOZ^zQfR MKKe%nLXE1X,Y 3 et01QT6_&HzBY@Û<-^ёefv@KŪU+Mhn]H|>oFFRS/i5LXl[۝`7mi]]v[zxrs#:kkϼ/>VBN\+ 54קUPP:xѣGmm6%%EZ855}}yyϽ(A@OOC3}w 8(>M{橺?tcFIHX))'"11++++hhh``hhl&DXcttׯ_v499;*S[;SS)I, B +EcOAǠѣs\ **(+)+WPQXalJU>>xX\rC 9YhH#gVU ly+.͕Goang7ӫhk x{nOq!>/KQ‚q:2:3+g14^ܹ̬FK i^52lar;pP)Ʌ>PoU_d rObbBBCOzc3%==&:+@[h@ttKSCOWCcpP_k24xoZõFFVWsq^/-EM=v~--MCkkxґIVV^:7Z}}ZFDt=DUԩгgtԠkou6CUԽ!fTT@WW_<9Jmo;2s]P~]v,,lxx+$8ޞ(2rWgϖ(&8M]'6V9[@@RFF۟~.\cHZ^؆~;wb ’XiW[Y9;8[Zn'"r`r-^%Aϩ 7ANNEMC+$uSÇOw>.yCMMSgZ;LEMIc0]?~y6`0 jB[b8r91'ѣ~-+KB2֊C>}g+}}D0zz&&zՆ㱱RRb< (4\4%10DDj;vx{~QBҊ,J ))g'urĈ**߿6z.ZQ8UOt%%]SSkIRR~~Y9qq"gg_a|`zzvի|SN6O)IY^^8D}}=}}x"2RZ?zP{ޥ|pS8ܛϞpJJNήR9iiee\]Urs׏,ìrrJJ|٤vv.ԟ{ͺUxxxz|"::{#G0yw*@)wWV 30:ˍk]]]=7n8|9^H߳w42;kg-ȗUUƪc`` HNY_ef3}tLܪj|0XooGGg?Vbp8&&.E%=j˽!{C} 2ׇ ӥOJ3^f6~.p^_BBA~7?%% b IDAT-9dy\JJK[^4#--aIÛE5xgՂBDXLXp[iiu?=VBo˗K-"&nn)(zzj1]." HDT:Vzz}WD"0((|BWAoc+(8:P]̿ ǡѣ"~, ZO8K?affd"AC -,qi|pAZ̗SSS**!aQ1%{P׵Y;w8)+KKCy唔tt,-7m:u^ɸ+WCBLM55%$Ġ|2[Z&?P'7جX&##-l`fױcwr߾϶cYSut4Toe&% :ԔVR20\'2י5w-abXl[A%1p%⢢4==٧O.}uh癙w;;yxu4֍##5嵵D89y)ɉY2 ˖VWz5^ao[G x(Ih60uU۷Hgs4]ea&.> Fa ?$P\ @A!$tPXx⤉ ###Ɋᅅߊ=<~ʑi.òVRR2Q5cciWWs~5U^˹s|@=ThLNnOC;;KJbbowt\ RV>1L& ؆HssQ1U~44<|c$7Xr@F$2skg!,†CC׻B%%ee\]E"KJvQSVV޵x2m^JJFfÆC̤}梐htq@EEh]؆n }+2BC==VdgXXn^s|¢==]n5ttuHHhiUtHI {7}C;/S\EED@.Z[OӘnJ_/h4 FCY7&g+p\\߶0Xz{^9p`v PT* 𦺪EWo$- ťov]II vJ0X{۳g))qqoњ[lm%%gՐIWŽ%de/faB;_45QP .V!`q(0`T '˗F/4X.*5 ,3]\bv뛮243_ejhKK;APEEh4,'Mv4XGD64wx}ft'.49R[[ ظښ{T&iJrLLTM`דDE|}X۷I[6?~sg>i%<={kl?{༠i.i BR)@E ;@$EWYwwg?pޙsϜsfcjsqܿ{qrrN~}ztttff)) NSWN32wknrqqݴ!aW?ley萦JbI [?aVVrRnO 6_Gtu|}_r? Vvr43o˯* twٜ01c[;`ccaD XX8x󭩽s%{A xq# 3ݾuJ͙ 4u~blꞔ? `Y]f`+(l¿b|55C"i`0"BJ*z/L", _v_&%{m025 *&:i` 6? 3Cy@|{;6DQRRSKKmr >Sk M[c![Z)omuv7ږ~x(>."b_eEE˧T/RR95ƆүB7u55ՙyzz+,x~⤝#VVMqx 6ccoFG;9EEQ۶,Oq>v.;]lz yy55L{D![QUѕE"C|WMY15XL0ڒ[UU!EI!/s3lQ1yiiOb||22^^IINkY2 q3g" $Ŧ憄GEPP01jjبBM*J z^^!!\\qO SPppIIn;v<0LLvzo8==#͛Y97::zzFFp**f~~EG=V@~L:Ѡq 9&m@ vwO c;7ヌTU^JjorVEyzrr~))q.ƤE~="<-[;kjpp|rw׽|fhvIbbXXfwꔽ|R@;Sh6@҉V^.(* _wh|u-ogo7o7Gi)bp޽QAAn51v*)j]]~^Z@FNhy#M |5yx|#.DFܹknv欞.%寔Dps;:))10@%$HIML-,##mC}RC|T'8zrCa٣ BG#uu||w=7{9!pp8v/e%N?GQc~!$$d0 5}[MMSS tty&&>)*~# -cc0PƱ/  p&CUi<ط_C)5篗*&IT'Nhjői&MAa@ɓ +IJڽ[EvKF3,R@>89ooѭ".F9zd %HvvT%$ jh9r[?P ߽ʎtu2 /0>%P)]2_[cٝvSsh orM911601IKYc7rFGTT' 9<{FJcrNMڷJFNIV6~!<3@25RRvv5,ܜk4%fqPeI dChhr |O12ZZݻ=`֭v44A,o**|,ӣF@okMD$&ffa^B"&>$cc~{!~0#ee}/wggDnbaQ Q8:ZU>Ыw@fV|ʕDRS##CSNSIHdԨ1jPNX, $B V񤢲wϥZc.^ɉ##bgb]+.yG'GW׹g&\W,ghqGVsNz2:NHg}Rdd$0zod툈2n O0z *36GFe}}֮Ys'ӇKoN_1׹!.^x"''rSݻB4CC## ءxߤcÇ%BٸdeXظPq c%aп:R{{Q1$'%agFKKB2wQQQQpr|豍]\._p!!Wuoo##O?wPdd#$䔗9zСWW3251w^z5=/'+_75uvƠI9THVϨh:ظ+Ixb[b$$\JJ9{xxZ+*@B{Z tA迗\``ge!ݯ+xQHI:@@'88TU,-wVgpq23?z'Oׯ?xPY lm>uʗ||>>>/S)ZOg3gt6lXࡍ7o]\|v2OYȉ֏[[S@wvwwa YYٙ~M=%"X V|5ss/^vv!aA*q=/15ZIN>Sj))N?=} repgppl Ho_w74&`P#X,v""$ُ;]W6!ؼ%33'KDd&^۷ŷnա1&&P)6sS?)h^stJB"M;S2Ӥ:k,sm+:sll`p``2:11cdfXxxl|Uw `74ܼUVf B_<;qB__Jĉi0i,FTWυ՝8`wdIɭ--N˖b[š//9GrʎJ?{ +5FYYyx-#'=}whϿ7od44B¬#xFGpz:pWzcmOp(`IIJx$''"#%&#""&bp$G0Եoޖ&apJjjjRjBB"brr$bzu=3ߙV^Аa0zz}=//w3ž=KJBJ e_.Dvu`̻w1{w>^n=r2])*z(6n_W7{w48G>@]a'12MsW9;?> uEf<&&׾z&--#3kMMm$ Jh'77/fW/$D]QVvNu VPPIYQ6 &-t5!ڵٓ|_u5%<ʫV;wa**JC]ƍ9^TT,߾ٓQQWYξxfqv\()/\s9J}5xiS0i}~=S A{|\5^|2Δe14XNFzpέ壣]]P 6Us~3C[\DDkCMÇ3O.F4`0^|tqKO{W r> '[š9wmPS;p08]LATVJm 򮮒wBg=.,hm_RGWZjjAJC!uyO羾Ko}Nh` KH@6׏ Uvx3t831<<} '!A"?6߼_߁BԵ%U቉O-~#bÎ6-NO\SQ1 ( 733ASyUp-f+VCiɡs 55v9rYB||~]u (($Wȋ ^p ʛ?< J;;S$% Y铳gn kl57o!SǏUS##QT446.n% qo\_]]X+.B4//#\œi$$!'N_OEɉ۶?~̑}oyůsbbpox[* ?NV/RӒ+_;cP Y,\h,%lttϷ'S>+#+kRBEUZ13]02vnaAQqAAa~ nn#cU˗={CphUnSPH+) ܸvB|5/(*l`eX8I]}AUtӧPQQck"sXvv޾}0%`σG^>Nq]vu((8rx׮o 8e54eg8p`浡!yy77U{Dńy7r3ٲ}Զ> wZ IDATXR鉉)('zPã41SJ85HAACCKKFFE%)vʊ47M_MRROXŋǍm{]Ss/;3 %ϙ셅>qHIZ-&ԩkGEYXTFwu׾x 1ɫјƊJHlz99>:/CIWPxt@Ggwn''EGUd6*G/ٓ+)K0SP[>U_zLVvz1Q7z`q?>}r⥺;;55ɖm6GEmrurٶACk 턄Sh}WL93|& -;‽vv[12[ʸzbDxCȶX_v5C px3zDH!!#8p5ww#1J-Ye]$rxceeqaJJrҭDkϝww_!7e|nn`s񂣣Ms(+ pg22bcSnRWYWv.;\'8mΎl6j}23#&&1%+˙ zrbh/NI)MM)i:zsg'sro+rҵkϜ=ڹf@ xymm=xԴ>>{򌯏0++^^$i!iƶ{ܹg1Mǡ&&sr߼8M(Ԗ-+yO_Mkobym޾p dsX-?&%mtu<|bB§O22;v:;3 ΔN[kzu;q<4rw?7BB>^!!~><<<=-*PJr NLl(77;kNN1۶:;c0<=֬$'kyEF-,ihPj'(sQ\``  MBOߺjo?XA~UYX\ صw/6u녅^_%L9]sbY- >}z欻wzZw$^Wyzf/yIXX%99'&=o).P,g;9 <dmaã6Y.-# @G?2ii,VV!'O5%3!$EK+-}ݽX_U9q-/_>yZUELen&"&lݑ>zcm)b>hwb1"H8-)8gt6Р r YZJIjLJxxpqANNA;薖a v?AZ8mB )*,-ʊHom!&f`76:|$5h|wA*t|i2^^>^뎟~^Wo$2DX9$:KGzz:Û{dM$ vO(.-13 5$KMIH8~<88332j,qrU3)Kt ttt @?CegۼҊ~YBWAAiuC]غEOwٲ\͐P_n&YPXP "pZ{zutOd ==J6hhIJμJx؝;W6|G]WRSIĄTP{G׮ȼ~KX/9}|ttv qVtyv /P}8|2x.WJˠ{70M=))΅Ym+=ܺyr%p`qGuYX!@Qq*MMzzb `bÇˑpeFyקS=wy X5=M+ ,>`=}nmkljhx A|{ *ʫWSS30&KojzvV6&FRRRoBM'E˗+*'>,~l 56<999w 9X߽{0?gb{HIѱ.[^'A'wlǎIW`1Ɗ PIOddhhhi~\jpŋ'rc38vI()h' KGxDD䨨hi.mPXyړ'}08HL*,nf.)3&f 'שSaNNT zqMMkkO(IEͥ`GOEcc"#22?yz));&;;1k)T~""jj wǕ9svPKv]w޽W3!%'ޞggy8uo/yyB™ϝ_mǫބZ[8>4dcWׯ=Q_ގBSprJKh;:zzZ[+* }??yzjTKkkچxxWc ZZr^K>>ʖU]^}?GOs܏U'듘#.niieLK;:ٍa11o qqNb?~̹qo\|_0;; @KK}}GfqF%'드Fkj89ˋ$h(Zll`ξG#wTU⠞P gaL,^,}XUU37nWqqii Cìx ?dgi5$ E=~|挟oU'FT\\BB@(]|\YyhCC^(zb$! wAWuw߽z䈍 z%E%%55v߽YrhccR~~6Sai)E>,!F[#觜R""]]..AA/)+Nְ~~5՞YHmY#-,v>pՕ7 u x& <|%+ŋGl)ʕWCHR%8$(:DA'ptӇ "$-x448=jě7FFaauuӉaH$99#''-[n -EOpᆆw.%5hké9$T]\LM%$hh ݧぞ-*fie\:ŷgUBBTTӋ]&LY}jjn5]\]3PuuF#~~Ǐݿ/+{*)~}f kiiYnVT~K@@G%&ni[--eegfܓxBtԍOԴ# ::[QS}|i߼io'&NV)):8nfo4{kVL}U5EII2o~s``|W\L]DY -jVZbVիnxy'[?9w`O*}p䈚=Çhh8:\k9^ʭ[ѩZ+Rftɓgllvp$&:v +Q~פx{e.ۛ⬪gwiojPнҸ8 h,?%՚n޺t9>z^Uy:#!icszi[[ v]yd74'ga0B۽2n^y'ߟ'16RZx)<<[/_VWֶPRqrB6v/햖23mH%%QQ))UU}ۋ Xo`ccooZD7&[TWVa#BB2~z"" ~Wh""+ВdĄefۧHA1viiuŷk`ɓh?_{##鑑g.>}v<{yl$+;I8^@Wz7#^My+ɗ/:PYy9ooI3G8\WWqɁvv^gg庉 MaABBlL@C{*==.֖#el]utٳ>;9{oaZZ\ɓ./EǤ٣84 W^3$y9ܚ5Fxug$rhs[o=} '# MSS}R '$1 Xl]mj.G>?uvhQQHh> 8t:@OL}m`~;b/9~O@[rܳ;'YKKU,?5?{ήgen֭V$߼yPaMMg')511ѧQT[.HBFєYR[NPP@`pz,̪ʨikKزeݺ#edLL֮6^c@E=_:F|ːS[7:zZ%~~8|!=h>;2xy MMm|}98ȎwsnDEdeef<p挹/ܶ,YXNƿXiUfxA"ihih?i+,dk{ةii)yyqٙΓ]cmcgf##>7{z𢽪*"\DD^-n4jF/3 \A p'vvtup|K[CU XG;;A؟ሉXY8 =Z@g3EDP*ʚW[fffk{TlrrN'_R@`.μN&mltUV xzY/j|\q- &&3v11 _1:&&9&[6i*SM9:bbrhth}w|OŠlHs7_tV `^II e݃N:'&>4geEG ji㮮hhŋ[7۹Wj(+ B^Zj؃%+ |9۷S(Գg7K׬5Y'!cTT Os>;HIܒܻwܹs6Ȉh;wߕ&'3N~ +WJz{74ܺ},}rJ{޼5449&֯SU=p*##׏jj --'ilrի1۷}7+eGGrrww37UPYBK ڬqTQqS Υ2DeΔԂˆ;mmW@w%TTFGۯ] I)iyy--3oOf2?Ѻ9ǎm23Z-%%+z97Q(橵 +MK̓,,G+J_ƘUU5To 62Аw&5k44rUJNnu뜝};88-Q((O޽eP,MҲG['#㵽h Fݣ(|gߣK/M߼ef#$RQѕ_ADTSSr뻖,**&eKn޷~hwpB=elgͪb4zl & 'KJ00X^~m=-K+=}ǏybQ1>^v?4HCCVVBMz^ ϟAqfqasYYu7ٓr ecmjŤY*//! s'<ʩnpxsPPnk}TBBGWp9tzjgg 7oLr?ckcco *NFzz%TJan|k-(@  >}vQoOuÇYY)W޽Bppg__YB --UO bכ+pZ޽{YQSCDj` 5,0|B{0QO%8xh:FWWWVTGi$EE٧&3SYNNё{ׯ70[vk+*RQ䁟J+*hvCC996 Zmj|󦪊jA];tRR</LO^Z>vvܼ9<()tMM##2njw2?UVŻwDDv2Z7WWvΝVgMn{m臇k""XZVT|JHHM!%[cl-jnNQ!tSWSSQ‚a'Nٹ h02oeOC SPML..f&mb(hhTUttd%Őm/bẁjM FjrURshk}?  UIK MmmSLRRmlusƎõ~zeE}= 92. ഫ?0ׇ[>RR2R*ꅙrr^^gϞ>vTA??HY>1ct2Vn|ihМ==##p83 ?# YY&2 q3g" $Ŧ憄GEPP01jjبB,nK ר64$75~:y-[))IgܿO@@GlڵPBܑ񉿖]Hmm1QOࡐs.GG%'ٝ0:JDDK. zm)EEICNT]EEmrAQQ(7gGׯkm-|8{t7rBCM |5yx&oąȈ;wΜӥ31,<>~NIi*-!AJjbja}M]n.εB5N4˗:x >|ܶ{)+qrm9 5<GDHD# !!%#&&P_;حM &$0prJM%DIab5 #&^bΤMMߎٿμ|ξ2}`^SCG[__`|\W+Օ_p|D)]47g&*04OPwq^lF ;-"<ݨjtt89]5-AT%$ jh9r[?1p!:[~~/Xijξ xZCÃ#xۛ㷃JLl*##ͫ;:OMJLlm% ?hò~ٝ^StE7&-[똘 ׬1Z͛t9#rPjj伿WZX)A95Uzzh*;%d#FXOn!35bK?Njk ꘙuҗUv8u9H$t`-##7-4 {b0++8\y Kaq񕯋K2?z8؏ cPh4 HH1?˿~|<"Q1aј_tCdRSEDRSHi ]cf*(k##׃Rmll|$//3+#=##Za3nU>v5,ܜk4M%AAV%œ^8$!sp MNԘV*G--c RQR(Łܳg=x;sV_L{ sݽnK$B@@T =`֭v44A'o**|,ӣF@okMD$&ffa^B"&>$cc~{!~$de}/wggDnbaQȈc,]"!HKt+ !%H#-^iTPTlH² ˟ H=?{sfgΜykVV#$$90I·11AAW_03{s㵠ȭ[dTq5 `0IvX(ѓ@}5wAEIKGMEB҇immkE!DO?z[Ħ B 53=EGYiP|BXXwXKC#+ɉL{'ioG Mg`iKlCYzzFFu5 Q+B$PR-sm4>BA"ܘϕU_x`ϟ33Z[: O5dzAIAECIa: t:vd 5/e|oD557X, @BrR^~JJͺǏyy%%98E鸸z{zzj*`WpΖ9^䑕a`eab`q.?-oqعVtұ4v8 &D" \\D89ɧo"44||J~JVVN/_8~.EF囚8B~T CC_/ %P(:EmmO8rmcܝGtu̠ emw܉KK}wuu_tvvBqXr7h ؼ%8($5,,4jc[.--,Rzܮk-N|9,uJHdccR.]..v{u7n<{V[7n _pfJV Z=a`aA"tOSPp3ۛ[p(+S<~?!¾>ssM *R_NNQܭ`*̧V^@zz::zz_{{p?Z}p]ݘ><?DBjRR$%fg~]dDCܸ)11%[TL2r;bH$#Өc/_0D"ͩSzzRRNM&CWdS 74GPӟ f3F?{^C7񩿔FVffV&:8FB .]1^K^tixD`Pg11Zڹ^Nnh@wOwp%t22xx``XJ==g33l,+3qDiK\KާBuNrtxhRaCs$gx+*tW/99=:9ZYٓE+88}LHHLLz'ɠ&ŽBqq))9?p 44+ŋg ޹SKcrWxDU48%% 8ij{׎.## p%йJ PR23Lf/(/0QOduPEۢpXNiiѾߚh**l-[׿-,)<eVIJkjr_巵Myvr$; OgRHu!4&?bpn][CB<!."* 'b5U[[NNܝG!1ըޗ/3344uFd% #J}ΟeM6W|?t)w:;+,vl߳-_m =؍̓BBU0< @WuuVW:B)!4z;\c{[c NND~߿no,Eo`DQN u폤HMSKAAaP%B|se^^+mxy>ƞ~|puuUCCP^>66RK0M͍,֪-_.!d J0*$#caQWٵ1I?`oZjry1X~^Ḽ[%1G$&԰0)+ UDƛ P جe*̎z{0BW׻⏟ff>"{9p&FFF OWw,r))YYXi~WW AA^wv~;/LYyttd'8*}'D/]@=<"ϝۼСԴډ>9ttf!K!Wի'TT()%%m렗[Z3333XZGs|YYf0 VVIga@RP,_!. GFG?P .l.ceE{ EЎfh^-%䖋 31H IDATK~PAd*Cay Ux7on^/^R_Zss_AED#{5qw(P +Vlll:kLV <~^khdjo,C~4Lm_[X)&6X8UUUCSL$;ϟG]l_[[^V]J 8?`@><|uߞ/q{^v鷥jg8#v튊.-_pKN>xĄ^yywwWוc{iiEEEx{)S|Jz ZץB[>m`G>>[tLdd4=C_0~zA܈)9PS30PR.`ex񴾾׍QϟhiyN_c~yyxť(.NC KMceY.8ADd\Joժ-^AO'$1 NVŶWV瓓!+"M69FE/㣡<{f>n/-LFGdN&˗/ٓN +*IHQS`>MNJRVT\ _xOr_?~ZXBJ*DPleLGp7g>//G5u0ا'##/^bt嗏upǎ#;{^{͛+mm s/߹tZ`M#GtlHUUAn榁эhk%) @XX%$CÐ b(yD>ggB<$E]\n[oe~j6˗lml׮UU$'C|&>>,ίrr~6LU۵>59"|S}EE#=nܰklxxhh.緳=p\C~ikKH.楦ki*˹VSMO/.ij?ӜkQQ1M5;1W67|7o}bsXfk "*,,VV+g={tu=6$% kC ̦Tqf{"3Ӎ^k޺1,-OSRKEVt̵<ԋJBynKLO7<==/jvkfFskk$p5ST-nn0:U>~[ї/GF~,#}tuPNKTUSW`BvCqRˬddFa03=L7jiacqՖ 9sJvVY=-֭}ef51!#mk+y}FXXQ|Bi&ڜ{O\l{2+){nl HJ,Z44LG:opvjgÇ] KK52L}ښEQ[ncpSD -m\]55cvx۶~7𩡨unI ZQQ6Tf@_`C;A=|#A)(_;az{vtq`R45"߾髭B0h=ЀFSS47Di+ 9p׏&5%+Ӥƶ>22fE<||Fǎ8;i:tN֚:9Ǐۮ3r>8fb[$;;u5^aӞTWg˗m;v쯿D XY,ӳ߹smwу]QQs$%EEu*:64QS~횟%drCJ{&]aë۶]~ʺutt**݉ !!{,^,&yz9Y&o~f;rb.}}sBBOG'/%uĝ;>>FөX.896TGlegT> %,vX:1^)) _ѤP11unrqYc,%U]ob MJ{ҥ(TA_@@Z|홳bBi˗o `gt),4==!_ٽKhkVV˖}k\t򅹋aUMu۷RS5㣢~V7RS#;;Q(VŋEEט{AG[@IӁĕ+}:ɓ%&ٝ84",bjfa[Vqrum^6ZNndqGފ>t=P;%rr6~xF7>889~1UcnGF.fl$eRk۷w?o &ڒUՍd=}7nrs]sdzzg'%բEbb**Ѿ>66RRӵ:EWw&krEF>tN{;.$$-mbzBBM:Od䨚 u$2#3#CTkt\9x`jj᥶v~[~L5lc榥f`0U~x5T/^ J46گwVUeGBBCw!z<,,L[mUpp@ Û$xaHhdĻw}}W\޼ {uys}LG߻wdd6W$''&F^}7^SO7@TT=]`gxe8$ ..0?jb‘#W.CFFE**64ԇq@%xsvs82;!QU 55##;;ܸf:ɓoνxITd5-|l~Jjj˖=jxGѷ^?=)9&?2-[XYihsFZ:ؿ|fM|ݻ" X<ܶMQiWS֜74 eejkӳ}!!2 I?ESYÿ0d02^8ol/*z`Ƿtr'XC tt ff| m''!.fg뫫福.!=gk#<.e.c x|/$ G31=F@rrV3wbkkۇNOʌo=̄S%' Jj @`,K{ⷨ}KK x*&߳WSv= |ov ߁c'jjCC8L@D QWv߂g>f0 OG?88ixݯ `` ,, B""RRʺnn߾]X>44Y4à]LLuued$$$%䔕ט88l;s&>@׉HK+)Ꚛ={mߟ}OKeVPW70>!5{~gpgWP]6$nB %mh(+rW}Z[߽KKoˈkh9;<_:?~rVIJJI)(hjlpD||IIWLW?wPt/_}8 _Ż8 N !!1Q'ضPWWYyzƕ+{wki)*Bo.={ K{8ge̓kjVTT߻397ŋ.BKeeo{o~}欙{MMހ'45V 8_Z/ml5\,ςCݰzjUUYe5 .(=7c;~BCCLe@L˗X'gIIBV\Z^+zX2!slejj>zSP]*DN_{䤧32Bʜ=ݗ.[U3M93k~W{ps#-ee 曔}HxٳkII_ / !XK3?nz2R$b[#%ecSX8RVRW[dJeεkΞ /۷o I{wł[ suLmmg$$+55Vܲx;ٛ6)03Nq̬,"嗏=< Y``ttJju٦4Fcx>|{ʁM<葷1\+, xGEEF>#ΰFXݣW1\MG7t88z{uuII%G+ohOzmdϻedhh׭spyk6y.%u3D(`eܤrOԪ^[ 99CCCbΝ6]i  QQMxk/'?))=#'#rp+*()/GɂTRڹ#5;۾Ѐ -8MU;4T)MPPJlt*+Y파Oy3V\lge Ϝ>wn>1,˷1';-Սkj<ܡn= 䙜|wロ24wt\cFcϾzڵNNNkCB|}6>}R8oIɱy̽݅Xs~f`3,p?"!99>|x"=ŋ䠠ȸ#[ep]Pкu+*Ar WA $0Gp$$UT}da(+BZnrӧaiDEige6^HI}XSy~vy.Y"\Rۏ0FW:v4))-i2n0??>0F{ر)]]_;$dDƛzx~>%-7kjʺ "-5b̍VNYI(/HȬ~f7?D bc+* m4:ׂ<}JGggwcf'+1ipa!!{=+.>sZOoli+QQg;1mmm_qvxaa}gߕ ߗZ PH\YWTQ["uv6557͇ >OYYi޳j魐WY@NYQ 2f#Cf+y&鳐bz: C>p?de6l8}f>m*訠쎎_SzAk?}jhJ@pX (`a$28S/h>Fho*33# G$! wt>zt+:nMUep =-|˭55u{zEyGJ|(KMre.'g%%.<|{޺}²eP+׭ۿ^J}a`>~-^66W()YZntLfVmm|rϞ{)/^FG8:TWQTӷzV`̝ExygǏ?,+vK}c^Ἃ%%h~MKpWc,@ SRonP2 }aAY ^PpΈ,YKjKޕta }6I tt$&o 8qDF{kV}lh{kn}JO_Ʀ-.B*+j/'%-/yslj@LHtu۴)5m|yZLL^~Ϟ&==8n'_&!;j` 'ɓ_MLSRN13kkZ13zQ^DbpWJJBIW;,2/ Zӗ'3?[;\psM22+<8?+ ? #*@n:5J$؅:ŖU`$ĸF7Zm;C55O; IDAT5^cbnbX_Oa??-\Q<{ZXrqqrNl: :!ȑsg+ʤ\=v#ee/ %%6n^ nkf266.n&11^PmmTV/ gϵUQvq8|DFv1/9W5TWW`#jzO!!NN_,'y࠻=CWwoݺvmaΝoGF:; Be찋sm66ntpD??zի/45] LLNh?jUqYp_jgkWJͷK.&6U󡡖ϟq8ho'';dO`g_ɉBݷ6Mf`/c %#3e˶zN!ծ,+(&C -^<끺zѱBH$=) Fefbspp8A/3(xu 54v[Z3,vf&ŗ/;8:%c^[YꪧObn9snύ7v`4$>810ڱ3R}4"< ޮ唴'55ƾSiK[r)^[@4|z0,ſ 63~谳 pnܹ*fc rSRhorKm 3/ 0ȏ*+sq1JW*k"dC|7W y Mdjj*/FEL7L\\ZZDnj"^僃55c<7|:x<7T[_CCOO{?A2``<$3ʕCnD57.[9eQ%͔wvrdXKaqqYY{Z#zv7m蠮=~/do郞z[-5^t˗9ׯ_D >Lr&m)YYXdgMF1hR!11<TĉShiaN]O{I))K7գSPI~!_~ѣolf6RTPSfvwښXNP^ʕ+N#Ɓ ]tcgeurc2Q-)IAafnet-tBlq+||#"F<4tK苊sL\Jݹ+omERR;F ̊[qOo:=@"%@SP0L@fbrWeGxx7^4@x2jpϟ?sۏD,8eSj5 ##[|͠F]/iDV^&(|7(uą"m-=%::EE7-=k*ʥvJK?|‚}di10驦xwz /\}cV*K*O9;^2v\FBRYuݻ46ZY9:X K!!J, SNw`~-m/RnDUW ,w8?Ego(JJHvȞ%#32v=ʕuƆxnC| Fea ?y  *+=\40">N%DFh6řn>^1UUllZ:HXM0#4yhNPwjCzp~ |?!;G<ӷa0 :::Z2T߇Ϲp!\kn-[ǮOh5^5\K~,O{7O #P-aOݾs﫫[[xxTU׺mptTY9v@{KH䈎6+inݶuEǎ޽-/?reݺSv=<{{nvV^~uUs3CEhӖ-)(w17Žz]ZZWՅD (+IIA_o~L44VxDĄ/zp84bqX9@N @W>];J`0A,$#ax,nh{LLhL̷dfܷ _ߵBB4_OjAѳ봴ĤĄ̌sg7<VXpX읫W-,xxƪ9HId=jc=|>FN..xJtmj3|pk'OUV1(]] w#nn8,#cZsz? NAD@X Noou8xDRS ormkPSs%kfvT<} 'oɚ;!  +3uy࠮,;FB㯚T\|dhyB@#eey{oexMVVE]Y%%!!n΁_uuLL E rzpًEDn"'w22r RԌ3 'O bDOѓGS }+ոꥧ<]#֊FC~t4).xbu  &ØDE98f`>;/ߵdvD -0c >`7nBKI {(23x :dz]X<,Vv31O d">!3?gf u+cƀ,:j{hӎz{ !XKKm-22a#KFDGC:_LNo;?H{GG8~P0J3PQ]MA. `bBMo}zJE<\\x|BBv>9;Bx"H$󹲦!7 uuwuAv)t  A0-=-kף_I1߼_Ϳן=O~9JʽGGt~]bݶm"\\ `0z={|}$$lllYoOKÇ1QǏo,)qsx) ܜwvmYY/\v;vZZ}{о(ԕWmlG ATT޸{O8ŭml|}]޼wt(ƳhL˗SRn=~+)!,BOWS9Eww:?vvlyp ' ;'+ #38ÕW׷vvt, ;;:#89=/NNrxOYWY'ׯwuyҥȼ|SVȏAvߞch뛛}0 EGhGT׼-vtQWﯭ}Ν;qi~U˗."]h4K &!0ߊ" ^##'_ģhbbiNaT2dXRvwbII9&k1@prssq`]==P(n.cԄ3313CC™%%7Jek]Wsr:8q尰׹+)"IɧtH@en>Vjox#otm0-͔߭{‚D 56~!҄D88XYCC5⁁a;W*++<~d`q,OCͧu@S:]]UUN9:8X^=̕^IIXcxeC~3>8i e6~c~j+y70 )m:==KK)~D{'!7nVV{\ xmɒ.++!AEҲ~C?|PUmi)5R>]]v㶶kVQZokҹ0]"`d Tdd d0 5@AӋum|ҧO1CL08 9= EJFMJEIIXDV()*)gj"/o@@ f``˗/?R$05'O=}ʾ}i3((nK۷^B[G55G89:8Ff>ww llCCiV>P\\JJ޹ÇOJ tR@bn<NIIC`>7@wAB2>W@EB`d\&5\s.cor4|,, IttDO'RR|[ii!#3[MEeͺe[XRA HHNܦZLLR:/CP9EWm~ǚ5+;vvNWJNA9/2 w"#6}TSyt?_U;=Ǝim+VU9K<Qo]@HMSKAAaPх%B| %"V۷6|=fy|p! / I]Çi%pM~~kՖ/XjuEEOGs`YYIIUDAƙPSK-[./&Bϋu=ĄԚ&eeU#0c3d&|233?Q+HJ,<5ۃ-+..@`f&p8###O+;T>c0_ȈG]]yrkON^^gm x+HOJ~b^GMƦTaEǙYFF. ^Sp8dQ @{JC_x̦MMmM1ɶ4쬪b$$%%|<`0rrZZ:z2A|mmyYu +x3s2Qጌ:Znn6VK32۵+*t|TS|É +ҊyRjkި8<9پxZHɓNK ۷/9ErrvNYY}5l퍍XXގP+>Y++++3@ p{ h@"gdg6?@fb"#:A3?F AdW'v+U}nxHIG>F99od8?7; -.?/55::../eݺg9RRn~V%'o :}:!aQpOLXl[{eEaQ~>9zzj ލ ()ijTTpxA>>Ό̳gҢo ![QatTHp[Hk|y=$??;5sa䤤()eeMLŠL(Or_?~ZXBJ*DPleLGp7g>//G5u0ا'##/^bt嗏4ُKGGv7W-^()s1QG22X*UUAn榁эhk%) @XX%$CÐ b(yD>gg޾!)Er#z-[SӶ^dk[_ggv'9y7aaou~AUeʭݮ][\6خW/*J YV&qㆍXnf33KKҾpuvU~~;۳5{xx_kn^Pfb^j檪I)i5⒦&l`/̌r.57[XDEopt`6mrpT@"rs\ ܌Xnns3 a^]\p8-Ʋ2<[+?ZYaj=޳GWcCR?̌׹pEf{Oe?pw+{ vCSKʊBD(dS*J%2dq˽Pv}'=s93p]![ PXwwĄNI z_0bffaaqΧ11&f0 /!Gq/FE}$-u:k(al7x`p0-(o٫ x`Ą,I ++.NKL{. uAJg? IDATQNvk+ί$@zZUUMuЩS99͎%ډWY9##.nώݻ6 utT͹~-":LvXzp ̙ {l.{zPSr`C66--֨HI  ׽x0==!!3:㶶/4B ,]]54w8_Ά}lxZRYILma."DN/O )9<{_oq`lA{4}=9rٳǏkiNFTr^#6y )(XYddϝONSS7䉈t.^?|ĉ؈iJ~~ii]]ml& ?%%&O::jjVVaaUU߭/LnHioxsAo䱿t`nnjje=7bbxO?{.)),lJJ..Qyy7 ee-;1ۑ\\]\Ԇr\㕔B|*49!m--L9 KX.`;iiMMmmDDP QQ5{\\IJBY'G1 8%WBSRn߾p!7/4t`_'%ef~t\:'=]A8|"23]~'rrhi. \VB[j=0QJHLIl`pࠊጌ*v߈KOWLJMM~勂kӯF22rq񊈬1<~OJJ{oDG;vLr];FML-,u/~'q~m)(deǧ] :ߝ;Ǻ}6|_x&~|21 2 :c*{oDEqA={WJ tJ%s={vS F'فaQW_'O/zn~Oeq99 1Ϡq5 QQ߼ى@03 JI=w+s6TagH1VWC"323ED6{OZz ܿq}{((ڝ8}[nl55?fKJ22;: ޏ /aaP f{G!!aGؖx~ӳ_644(›&x?8W!& NMJNq#?Yɝ?~|*{slոNp8+qPPb"5uHH``ȥ[_" ""6j7`G z#~sЏ23--3~MqqJ+**ZW/왋r22MN47߈ut gسݻo%n񶳋64hm}ԥKnnK~A*^\~GEg¯n"-12R#ÇNܴIXxRIp?'$;:EGs>t6ŒKpՎeezzΆ}=3MLlo}DlV&SrmDTS/o(,5c0.^}BW'4,䲳t۷UՙZx/̶/^)~Wdu]]-*SR,_t6,'gDXdDzzbҩSC|06!ܦM/CN~KBBYeww}LQR9s4+[蕈 Neeatt||IINHo k׏थed 13 54<|sěXCgl~2,XlK[VVjrq1@^!55::|s$$$J+iiYX~'I 7853"%ebbeᒒճstsw^ztM3̃޽uq͸ޕ{_JJ>r?Ç22/8 OHmϴz{+9!!5%?ÇnZZNN11++f`φݏp!,Νwz{Hzznnqq--;;/MĨg>RAujj+!JK_ni!&ᑒRPwZy<#q=44_~G/^T~G\\Mk0%Lfl]vNL䂂'%mm}},T,֮55UT`g'&:;o&hh$įOIym/ݏpm~'9\x>Uunĵc3mK95/?~|:L ?}z괭9<ܾ'O1ba{{tyѣ::%&x7\0{1 ddAUU55MMCCTkm{le^i鑣ڎ׬IJ}[Xȼc'8hi xⓚq?~ 7172? ErsCCo|ÇnGXXTTLlr]=[[GG""~Y9<[_oq<ֿ$x A`073d{n`۶ur&Ɨ/rccomɓ7oLh(TUUx77YXںYYP]]-^W>y\^GECS33YX8ZXҴ=.NHȃ&xyeeyy|t8 rH22EӋm6X,nLL*ll_V[`ghtիׯ-*""~~44C(0cyÇRR22n02ࣘ6 < FC#%)# _'QԃCphǦ۩Ϟa N\\$ `TT.W"efdfUWWsQommgpWQS?~谩?79ezQ&^db"*o'ߗ,I}ȆffZZ+VHIʪ=zfxĖ-+W}wj>m,,W^\C윆jn;~ː۶݈̺|y6;U&$*Q彽htKKqqX펎k@RFRJNNC;4өt=|Zq[ɮ.b6gdVGE[YUbN,,Sːm52RV{~w7;r2}=zz- +k]z'O KO5*FG[Z< ggg`*##.&]++ޚhbx y+;!0`fb\dl G0/^ܬhtUj4z 2QQ6 ennmݺg+{v$1636Yc+j>l3?tu7Կ~]YIM5D޺uUkkM]hrQiV\tF++v*O%IaaWxm!6Bcbl^n.&!_C0;32mXغuϷ:xx澄ի;Bl17//߾ƍ(u[!vEhmOJھmc {9:6zTw.֟?_ IN>xPMu@ TUe]OՏSRbc?}Zb[oBSZ~~{Wzrv|/8z`:ss^:H\h=N|l- gO`fde%DݷM26\[04qrrqSS}t+xXhjʃo߶KH߰sj>_P˪w}}H>^AA.PmjjFF7DR/!&)阾0Qv G`,Wv_MycGG?K%4]K//^tppt 萑Y og}_t?ƩS'Oyl\##oބ9;;8Q7otVp)] qp1-1 w&eHGjA::NN@4}Wq@GLJzᡔRRfpv!$Tt?ęӛ[ZTVPk,( u{2KTUpppsb`ط:(5a}uuPmg؅(_wfFw55w|lZڲ2H=9P^ޅЀ& d¶ݻ>L@@DT ĤEĆϟGh]ݍxww[ۣGjjDDܶp]ʆ5zsڠɓ-//1;bP^oOSSgG*Í.{xlOOSSeeVNpbZ%$6{=RqR `~7nGD^}9d۷/:(.gg{*;+x {gW/_ C UUFG_<(!>6ʔ-,rR hPb(aѣWFS=:wR^وWRDYQrt2ĥ ﴽ=nPPHH+_;i뜸'5Ux{]pr= gt))v nu.\m'%55[6˩Tf\#:&gիIpJKDY΂mݾԼUUigpzz7-ފ 3[B F@C HHHɈ `(jx{W+تUW[>z#,4:֪ ~>28;0o0G:;hov obR=.9~\M5/ߺ-&y3S\׏t그-.^FI}z Gz4uuFG=+*mG/_~')cG,,'Ъ%m>ޗC< 4n3AEYϞj=DGa%#ceA ᡣ죹&gjꅴ{dfffĤw2 { UQԒB /hl-TЀ Mʏ YVxw`%sHIrc/{sAgJ{mII z|Bi-ky}}X@M4,vl,,Ef{0(4={ ?yUWOر>/)k̬@jHgJ$8mbe˖/Ҳ? #'ڵ˗] `dd:P 7 =ʺu7--f36Xoْ8fUHI:dme KKuN=L60=~b>CQg`~+߼)--( X88~{rr@J'$Gtuvvw-a0 Q!nóg~='ŧOCC?18]#bbΟ6}䈩ׁE0::AAQb0rff&S#"CLC2eEKJP(!yyJʑ@ $ 7|+z?/L% %Rz/A{{{(Tyh,2؈N|jN'!EGH=hg zWPR ($,dhlzҞœl(?awvݻ񬔚ZWhnZhzq=÷Uwff֒1RyIIɳguudllX79yySB bh& 1! C < 3=Q-k#QXxhHJt;Y>bx~/6\P<--zCý{,,BKKP]v` 33𡧧uGn`VNifVn>F:ZjtyW: 0tv,umۂ:9!8) 66n<44$$3!<<+|W*]]]_p!*޽+&Ux="CV*~ Bvv10-)ioCn/ FHHM!'gk{u/^:9%LJ*,65]w͛=}UCC[[OO/A sR-">__hm'xhmxс7^'4BS#-w˲eS{DBIm>~lnO!3JH87 BG GpXh3,36^w#}]] ؄F㿬|hLCk++ ;iVӕ?'V^@ ]]##Xlw@?FLo ^cp_ "B"Ȗ!#UOֶDD 6nJNNK;3AB;r:;h$nҍYܶXloo[[G Z<v?{!Y'vS4Ϗ $yuttvP1X ݤCC>1+G썭[俕OdahF'&F xy , _rb{7zHO]rtBZ׋hPwr,,߂/hjrqqqЀÛLLdBx,,<\\c/޼EGG߽{*d0 Ȇ**g+WZYy;7#]SSӦ 5E;߿zgvʳ~n>!bДOFFUUOxxb3FIIA>@ d55N۹cwXx[AAb?&@6]O_w'[|< ΄E1(z^6</+ge]ehh(lc>iy윦no?ػWn9 QY ~֣Iwx_1s2V 2+VPwt&,7fe6SWҖЄPJo,Y//*U4 %$D kG^V CB1c#:;?$$HaW}5ǷPCC8(`^nֲOyyf^ku7wӧ߽[MLCC{h+3T #e%q˖Cɡ3Q j;v9"lt};+X.'*L{^Wzb$eeɷVTV5isƶz[EJ$'RY|lA~p^|#GOσg|-NCCGKK Az]F7776BAq22zFJ_M@ |zzWcq%%QW[ m1'OL66<nDGGM ,BBenT5e8ͻH`Ǘ/sn܈/ "427k׬6fi]w\q횇А Pqff!-J:}ٞ:s;YYYF5:rr˖pqSP_VQWd13,iƶhEL[d''j&G'5u^>$sIK!7ZZXnknf!sDfO f4'9HK?00]BJ06;*k5@J'/~osplln>OK-(_RrObBg^ ze?0I:b~6 kǘ-^`6*<^铴m'Oh @r`ހh?#$CBBC3$%8apbb..1Qn&j*F9٭Lzz:ޓihUU5եBN47;:g'&^!gfjf挌=;vgkl",LLQ*7 h|2bi&3gn2clٳHltzO@MˁXZ>.4Z"%- @K74X_zfk렳'~_vuHHܹ9wwoo,~";iIe%1`:y2u Oz㱂IM}Cc?15SR16^s_'@K|j~-Y' Tp%\q([pՎeezzΆ~S?dl}hF;˖;%+oᗯ<=O|iݩSꌌ 3Wv@>vFF`E)(pZRQlw0lہ45\\cJRBC=&ŋܜ^!99Ǣ)H[ZpXvu@ Z[GIUT14DLLO#xggbb_%p[ȅ g?9} RyGN'$ceeg57?w>9NM{ܐ'"x'bc#"B uuo;g0rr&&fcc?}D YYUU}^2!=ǿEDѣmXaÓїmlL>q칤ݻ()DEܣ.w]ϵv$jW5ܰ=cx%%55yȐo&_ ussqNHv+bKˡ699yN#Bh:<4|Nj~~ZZddjjSS[ ==TATTMm85FPQb*00.f䕐۷/\  $II:IOWP`&rrȫL.D߽{+ZڥK4==׮ָmo,QQ sZX8;ۅ YY ǎݽCF!*cm-)97gdTUٵF\zfRRLlj/__~5WDdq۷~MTR #:ر3gڙ<6 $lbjaSU|2kKA!+?>>5ULRHЙ訸 <`f痕_MGZ[4=]?>XXxY178۽+%e`Xt=)܈iij@v`~AXxWO_fgsr۽[V1Ϡq5 QQ߼ى@03 JI=w+s6T1$YUU!Y""'-ouظwopiiBKmN-|zvKJ22;: ޏ /aaP f{GTo 9t;r8,<,tǶ\ڵAA4X `6qȐ\OƹJ_]1UppjPrrTD— IDATJܾcSAC.;gg5tYYLCBC.%:x-"aQVQWӧ'?ڞN[Ξ~T((hi޻Zn{.(f1;v.f`۷>ť!)-(ʂ@tvԼyq^^AAEEG?#Gw64^ь}lzNӧI C55o4 |wtkxe7Nj]dk)_ m{~mAgY]WWk ;--#*ǷB+,{Zk"$ ^^ I//ySSFFJJ\׬IJ}[XlE͟[^0Hk Lb9ZZn p /ɋLw=~Ph |Cw' G;_06m{mپ17щOؿС3~9gga{_zeSSCU 52"%twv ww_ x0`b=wh'=_fxlódLϧ-3/HI^g:==`E{GF:ڻ{G׋Xkh$66)k**=OSSZ[WW;8zǦGhn4`0/^^~,0/'--#TthØ.&$>ck-.`~`-mYY8y@}"\F^Z##sr\NJz͛IIؠ;:M$H׳/y W#_y@Iyǎh-+t@u܈ Q1::NNQQ38ا;:+ׯ|US KGJjժ n[puuo,_YY_&"MVVbgHHƏܸvqq[%%&Ɵ;{w.W/n.}^;1e1|u5'O޽knF"9W8:mfak HH [&. cc4PduWN|0?>|HZZ+*m7 u HT98ܛ7WȋKpq!X  ܈ή_mmN- ̓a_ BUӛ>66A%XXV:p$)?K'pr2&DAOyyKMM-n &x"5522!a=B.Y[NvƢj.{yy-O'߂JKn}Hȕ۔VR~U{~<<+Vhk[X:6ZZhZj}}""::-w >!6ȑ]_ 23ីяMn:^@lZF͛z/`8\OO}/*ƄV14df"'km{76&!ݻaPɋ=Źў}\dDD?XǏiwӽb0 i__SSmmGe~:EUX ``䢢CW[Tduו׃_R`FF?Waق/_*ښ`0bG04z~W  pH$+ ) r=RQSRBk[>Wy& $ab ``v}"|Grr]p옻me)Z[+_ki @r=v^DJKIPRvt:tZv9IH=tZ\ԧuv޻vzM5CZM\<'ѣ'ޭJN//~ţGmm99'{INN]oܺ5(HKPPXa玂wb}^ ww_wkܹoӏ8|`gFF%mmtu))'WJR~j` ߃UU}]=mý]]*4Tddݽm?7~}X]]SFWWLl~W`L_x~&`0Cx0bn뜡1cU뛸W^A{O?޳ޒYV* RZTJE2SѲ*$$J;!$$Eu{>׷.}t<9s=w$5}}FFqqE$$޽mimc_A+JK_Ta12FFF\\? ȨR_5X]]Q26LUGĖ^`&kRP.z*d FEG<<BYibbppLl浻w_~8 F닊k^@MEGOGFP..)p66ܜ8‹ʚF,DFzk7{\Wgg$ý!:;0Xlu3gΌy8ZOnF w}҅&%ecg`;66NN66 ׇBA]Е~ى迍.54ݻOsn޸Q\QYY}?~&#`W7<-!*t`z+W._ILqrsGggssiVV!@T }? UY*ʢ{%yyyHKij[T*&js ZG"&s-">Q -%Ck eSWw\efw8*j ㍑j}HTT^ Dq_2`p8 @`0hl.hBEdRX]j``f-**q%bB$$/_e̬5htUuA–FZ99%e^^~CK 5/߽2@ǿAW5pU>>FFJJRBІ ܯ_l##cfSR޴AHhxf,pGMLOL/sb!;߶m>v,:OsSSC%11>>zW n|#Ix-%ʾtXTt9%(MA1O srzxخ}gKХmق:9::KpqSQa XXŀhgui4ҽٳR bG00KI ps;27cGJ]AAh '' gii 7ob0ZZAR#@ To|@HIyDDVܷoUTx늅\}m.,Yka#8쐻L\јXaK) ّ$$44llki9:C#gOm8Iҕ ii#"#".LKLNM;r$;{EC#/-`ݶ6⌌訬w) ֻH%m[Az;0y!H, &3 O70O{wˈccVS30 tgn(TSS᝘[]\,, de,WS[n)ȑnhw ޝHTTFFUk+W+*:;{^뒒RR26[y<;gϰؒ!b66q͓O_[mƮ]xUU31^^ZZRD˖ڕ򼬣c4k/{::UWL5|#..zz>>!!8|UcF?>M?X.tJںQQ;yyY[ꪨ@ϹnܹKUUXXpJ6oSmpɓ#G4 7^6ٚexyف::&&55 `bx|{{5kDDn{o50QzibffjA>OKJ+x|躺?ӏ74z$6noo;;SӥK䤤嵴\\Bv܆QP@~~t֭nn˖ij*(HJB}ZZ˗Zclj7jjzzKYj\X;0y 0VAKc3 `0zzmݠHWq @`|ii]tvn{۷?z5"b'htmm|>HH:: 0]]m/?*/{OF?;\!msyynsv88%$fd(Lttn=q}$'^Woߧ Odd=)ťj` 55&f…лKYٹs!!AAǎ z5uJ]J,62sp05]ʆ@tu|Yxbʅ{VV~t!ŀ)IJoaSgg~]vt\zV/ Ύ/o&%%գѩ NNOS^yz:9; GFL=r%1a/mmql߮ 8 . `gblӆ@03 g)+_n}dDiٲ+׭sqh𶥦Ӈ?ԲVU{sKE$R\ĉsFFox}-<}*)eKU"rdc!%ӝ8"  @s`̧O7o8~@34 p;Ea*vvBfvs&&uA>BBukR,,kiZa+}oOuUI.@OptB"'+/$3hsFfg'c`/8Fl즍i{##e[jܴXy Vc;?Mb4=IJb03 ++v"jiX,WW䲱qrJL808XA)r*7_soe8w'!QW61\|ԫg~l" 򊊊 ߟYOHQ锔Fk+5-DoWxx XY;DE )*BLlԢ"gofjh "-[Tr7☁H{ےۧs8zfKKS_OS`Ƕ˗_7ۯ_'"ǷEGWWss{xi yMZVCaRllV :)Pp8+1ǫ(3[zߦ@zPK !!j걟@GNNHO'/(KJ((нQT@λHJUuKPv[@I0ۇ+-]HAAPn0(h~`^f عs2}m2# ?'8:z_{MP~Sԡ?Z' Zpv91621VWgcwvZf~ٳ.<} sԯp I6mܶzgdw23^njbcfm1`ڈQBS\4;etJ֛_x< @ 00 IaR[+*76jjQq EM#hW9QQ۶[X뫪BʩZ[]{w~VU^~RhޟCHȍoaT_?CC--#"ׯ75АUU54\ȑ[yoތtYUWWS}Y u%//+bhretG^΂̳3Z{V\\|( ]$)).NKKN'=~hEϳ ojkM8 qpeyYm- ^PPAQFȈ,9Y%EaaXꪚ]=008D32 ~fϝBB˭,$%;8HQ} E%JJQwEE"̘LEAw/%GTdb9 IDATTK]{̙ '''aĤ ø-[\\/FiEEظOzqhKKq uVlhu𠏷}Y7h!:'Ə%EWtG@cp'' ;0(hOhj 27YֶؽjjMM_߷UUݱ^X'Օ-##'zuDāLIɎxshkn@Y55eeB5oxx^~s3=wݼ]W@OBNMEO_Q۷c}>;=C\\B/;NVhtp9;;qqEtjDم A;+QS3123OvԎ*++({## KE*h=;{CǏJ+KGE:9ijIJB.?!u'_N\X`I''Xb@2^>3]GLmmeym=@'D\{2ᱱv-=.&xQfr k FJ||tt3|PZKJZYYcgdz&ҧiqq11׭] C^O\Z{&9e:/>Pp #+ 356`<D; 'NsqoKKKO/#ce;݃}뽻W;zZh3{{GէO:;:񣬬ڻo:V˗bb\$_~~P_D =ztry]fc ]_~MX ݺჇώ`'&f6?l3!vv._/+KI)/o؄+jvV-Kn uu߽)Ls>>BzvGDmh@pq;4TSA[%"RH5;1瓧rѦg;Ҟmzݹ997tuwKCmA]MO_^\u{yx看} `6a_yZ]miɤT^"`bON.!!##*@646p$#|xe__G_srٲӋ@eMEyc#5+WFD\JJ:Q2{i'zb{IŎtCx<Z8־ϟG7nxxGCvwVWʏڽ|r)u#~a0ZZyM.]&)xdB|jj^ޙ;_?sz66IIC#U~k7hi<d jh4+~Ow Ν$ ]\$ 42%?on[AI\Uy(80`ŁgZZx|7X{#3+eb(#@߽=wеkuR(k.6O|97#"Nx#+*͕w48$~rŋ͖m {FIgy\CJEMK#B pr 13#5щgIKoݚs34֖cRF2|hltj՚K=g3Ҟ[ ;w.`0&KudeȽ{ ﴴ@6sQNkY]A_hMtGa0JJzzz:rbem{Ǟ>Y!ZlM&ߟWPeloE7hx<_"qzΝꪗb fء!#[14V[[W.ɢjgtwkjJKIN QSECxy|2q3R_Dt!7/_F-a0AAqƒ8pB~Aŋ~1OdpyٽϞa66+ UBC˞>g&~wE$d_|$$lVZYJJI^|^ZY5wK,!r۷߹T̬I+YX+\vݕ+̅qqVV[JKڕG٧MMkkccWZYr<^\BNNAIF mFB_=yǟX(WiZLEE{;5^VVF::چKK|ye$*==]5= 5 HIΝI:sg&""ba!!ASO20 4{&P~Ii)#`mmi1?22"r6GeeQѻwzڵig~DA/{ yVZDE`!77_S_pl35&Y--;C?xdgmDPQRRQ`\OoOrbQD!n4 sGѝd䬬I֛:uyVVb^^IINNQzb?0Gva{Ge޾q(r\lLh0[y-i@M tu@"pJ Fnn^"..FF w!nTS]ѣWpɤ疖;w*)~G:ݻWM֞`fqӧh* /Xx=M/*]]S[Y10`o_z55'ʪO{z{P(,gj\v}lL\[BBbdbSaݹ}((,TQpv]zXT_N" yE.nNj"l,,p8jPQR]gAE#"fgu"N%${| |ϟ?aII99*f `b'Olܷ#..)6oVQO;ɹo"jj/j^a0֪*?uu/_B20rrlyo'ÙYjՙob{~䤊<"#5%99#9 FKC PRzڴ5q,08-===%=))9: +5M@TͼUL\YIUEUe6lkclϟ|鏟::FUE13YK5'TPRB !.[]]x<֖xl"aeg6gbΎezFx6RRnnUUU;wBlx۷3N ;USȸtS@Fǿ 8G޷BWAB\KWWw IJzdϙ;j1/+xA!%507 ;x:HUNc`h^RRW(",ac{"qqII^^xL';;W (ԋuI"^ߺ1!IɐH$%%BN@KtK ~ooK5cJ5許 _F|}SrHg|kVc!#cf6ϖhn-- 5mad$nn8 }l 5(ԫ-A66ׯНVVoVܴ9'Uƙar+lq/ԋC 16Zn!+u"B|ܲr..e%L^T/b~k_H[#$4:}9X7o巾['557w&i[Fx W<u໹u@@8j3;?H7~˪ϝQDĢ@ֵ#|]_pm޿'!YH@o +WlʕCa.$K,F m}ûΝj8LGg_`’%VLF#'geҴߺ}>%õ cO hhEI`K/_xToMMjjK7F`&~w DPchnλu֫ZJ2EE5 %33A==Uo,,FrጌLLL6HOܻWWC0ZZ>}㩨XYXhi!FFbxӧI11tw3]ںwXII3#éu.ă;;_w^NNAQpTZZ-M r'ǎ]{wvΛ7c,c^֌,]TTPC^^mejjWر0Xxvdɫ[ ))EwﻻǔrZ" &?|%%M 6aLL~DDEE?|g*9U|HUzH0(h>lpHL˼VUEIGP|nRYi`Vn^~neyy͖-3g;C4ڄFVFEUB IZ_u#=jd>70y>rr鈋7 `[T[G\:? QP3߼mlYOӚΝн\!4jv;,#{у44 TTttRKkiix=b[Ga߿Gd85a0ϟ-[nÇZZ:**|y9hKSRRSKKXb]DE'_qQPHK{yn 41vmbcWwu}yDm$%9IM  .^LKݝ{`OH21II-%\<߇:}͛I>>v!L23_zs321320 =}R|b 77=…V~V|76}``:WM`w-w$%8q914 QT̄çw8;][_hL^gf:SgN75۰gӯ 6ho"_C %ee\JK53B/06֑\DP*+o]\x| L U7elxꤛcKR-1qN. Tg.]"/{D"NN[:;ggM\mpq6`EEFZ|Z>}M-.Z׷d}E%QEss/\HI..&!?f֛E F;:ee9˗Eq1|loh(+-}-3+AB҂ў |33t XY\ /X`efŋ}}]]h??W-m>~$ӫO_ގ.wwvݵ$ w7VwXSNJJz^VvsPa}h;tu,,j 9|RR~>~+--ᱶ 윑nnjss9م ??rJ%E4zFFy?z4ASSKSXȑ;>l:ONhĔ#';vha)*JNY]U|BBE42sUVktv ,Xxef_nf*!1wt7UT(,ܿ;EPJ]ᤤ44\\<s&0p (*~]D6>xxG6;KO|JrbÇ"؞OKhoRΫ嘙XV#-23]|!ypOZ2z5 |?dBprd{8:珮mx/AA@?p} ]km "#caV+|rsiiho$,EFiׯ>~>1a_wu$)\샃|i K5v\',,""##&vLUXXM&8xG5ΐK]}p&DAFk)($%zgCHHF2xzZ?Eꂆjͥ-[bbj٢ps;{WKΝQQvZEC#"t8Ey͛._vMB"tısISvq#`W4_C@@^KO?ܯOsrnvvOy?6kh.;q*.ZBU.g&<}z^8lحA++FF6\삹g5LԖ,tj`Iԩ~krJ~ڵ--S=r^A\P.*ZHFFҹK =qTTjw}P OCǝ-{ⴴHM?}:,ttF=>>Q& 44Fv܀:'.C~;zsb;"C?K5?01qp_|_Mػw_8"kγ}cʊRR߿GhR.>K2 $R>>)Uhi}-C]=\<-uQ0 ߸QO/hS_ͷ lm2`f|E+8|d{2j@?`=Hageb:inn-H=?NfݻJp̶TYǷuZÇee--ffyLE8۷7]+-CUULʹ4A=0u`yu߱e H p+5eH `{w@=;}yt`0{w rs;:*+hjʹ9ة@>zm+HOoF0/i~_ESRѤxz x<~zý|al,""Bjj^^.W|Í}jj*u%jjzz-\\69VYM LD22^^{^ZQ9O%^݊9>|ŖQVon|zm54vzx/؎gblmMM-swߵ+%yYGi68R|̙͛ML45%%ut,,HKjNzG\\54lm}|BB=Wq)+x|{{5kDDn{ojg957nPϟKIY[65}#ZEEEqǎSrv_ KHki{zݛXT<0J"#_ 'GZYijn~muttML""kj{%q;vx{ٙ.]*''%E9\\BvCF4ſ3OKJOE:owu:0_ʟ,^[ܖ-TP/_oǎ'nd̗|3miw`=Ba0 b1;bg`ںAA.|RYy %9o?~~jD23NNEkk㽼OABΞ_ jokn~YQyۖ~22lw:G~~\^{ܹ!%%u !!*44.ݭ[Op_"DccÓ'gm tqHMYap!RVv\HHPбc--CC$0669_$u(n##}=S3ŬlDW˗/\8gkeO/^ 6uv}nnGիl^xVnRRB|pk]=x9ehUm\co ں{l]+W|^*ttORW)[.,"fUp8 ߙ~FM}}mmYY파Ç}3V ݽ@ 5pD 2Á>h-5bYY+TWe8tnLOO>) DN|ىfNQI nf='PB}} o66_ Ԃ"o兄xzm32vp A"?Ctqq֍M333 C$&=jkGF6ᚚ%'߻* Mi{zsb{I444oXq07"r2NN$) p* FF*&BJ:W5U-MSj\66NN G+ȓB#E]?vTU7<=~,$$j:&&כoޔzlb~_}f6VQyEEEϬkdHKckkeutJJVvcߚ"7+W<>8|hBc0O)C !'#9ԃ[/‚@&ךwڳgxh07zN::yyO7wU5.7'V}s5\!|RT~m71acا'#K\ld½%%G /&~rgg痫Wľ^DѪP ~tz9aӧ 17;$$~kh `mms~ -Ę]^^NvKv6]CCC%E u]}ee zX&;˟/%$TT2ZcQN;`}=j䘘|hTXw&! X ad/h>_4y u$ Ux\l0xWwQŔkכ,p--=lMMoED%xvn==jsmusWU֕SQյ^;E|PiyKZZRRzFF!!7ZZS}d ܎\TCCNNVVUp ?#Gny388ǎ}RRv:ҒUQ14Z2?:_pg^^f-ýo+..S[WTGx.%'xĉ"YYyyut&88X/((#mdďA0 MuUM3K(?_љ)*OTRDI)"rX鱈"o$"`k2k[%e2Goh1-=FW( Ϲ %r옟֎ '}}Ǭmddbb_]{̙ ''2aĤ ø-[\\/siEEظOzqhKKq ulhu𠏷}Y7h2' fh}/ b(Z6/͗5캺zttj*z dduu߾+~&3<=%s~dF'WTܾ^XiONIKԏ*++({## KE*K9=;{CǏJ+KGE:9ijIJB.?!uee7 1ە9+c5;izsb{s`0O b'M#V%8dd| fnW`jk+k1:%ܣ 7kyS]Y%\MaTVj(ZT}B oKBMM׽72w}}_s<9糞s>k&]t񺵆FyUQ'8/ʕ 3M"]u޿/)abVܽ{ȹ22;nSˑ Dii[2Myq׮p߾۱MBG |]jnnG PSwU=~rBC7oxEAqCn,=O ٹ̬H{ѭ?vEhmٳ{W}![;ٓ[/^trhnrޑ#+7rf!j6+XYyBBtTJJce>>WXY~z9}oժb_r/zhp-yD|[(dkn!Z[?5  &zĂ yxPHVd!…cGo73;foqyy(14$GCCM }HH$3% Fb`dg]̌p8AAdfO""b"}PݐH10C>diYXFki޸E--5/퇆=vš^,)1UW?#1d@}}[;;G" \~[ BdeMLml\\;8P O8wvz(4&M,;;˗[[rLM1] !!`/? <*+#;&j;v,mbfV4`@RSTTpq? )2 ̼\MWOA; \]g37g ?mE 47WTTU"`hZx{$%eeȶs|\]}MMs3ٖõcܬNvuur%ߗR-ZiS``ꐟE` v9n+\h.𧻓]}9}=i;vp}𕈈={J PkiiM#]MLruPJho&PEeT]Dh'8iɒb ςm7syyrcH$8]Eu ?Jb>$J% 4bv #ٷlgih볳rZW`k=,ٶ-!))c-hh`ple7<сwx*lqJK?pԩeǏGEݫ2P FpS\l .WUU8>wptq±9\z)EUII6m,Jp=Ht)4TX3!5gQ :a=-nEE\DbkjmlOhkt̬h<ҫt$GgUCCGWN C%hy,=="W] Νuu`sg\x` %y6lظ}#qwFFAA'OZ`Bp8yҪ,-ɉ:xPMII?|@fVWNa!QpDg]]#4XL"=;Ny33mce{d )xk<^Il}nzSrϴ((4db,-MxM~KDۗ۷VHEAA۷mڴ=6Q88XRdbS/#sнg^HIz5WyyH7/lPQQPb!,#O 58XP|xgC6[*,_ IDATfהW܏00ߋ Ӳ03Om^ssOzF8ũS>{z^W5||3~${"d)(0}}`A/aggrY4?W455^?ވ'CEBOɖ3=cg57߻FTP_̅ %eP quba^^3156}{vM}BFUuժzrp,8|~ŕ+e]!!</[[Ŋ ݒ`hb;&KIiV K人w{{y݌ l][ tT 8Ofx!)yNаVuC[$%~Y`$L \XQ" QR$R + ˟ِZ Z:˖utde}4}8/^$$55iiʌ.%TTPJThURe}X$@Z6V(Y_38_\^Sik0!H?w45H~w=;*1[؁YH9/];1/9d#[ )(-\<w[Y 44ƞ qb7Yuu5P2b.. Ԕ8L[{6o f+Btt(ԏVAE!&wcR%%5^=RE% 1 ؛[JcnWw7%MMM]C?k~Wϙ^M{3*Փ^VNC.-5kكh@yD"/&3gaacee zIE55׷ ?z@ ^-.F$E_UwŖWDGGFTNe\&J̬8+&a޴|}KK'J݂%&:nr6 (.&)&H,OLKup8dc a8{zs99FEEGbY((0aadO7vq''UXnn~PIIK^wy䈁>+ ݻjhڠyhDv#::gIB"P(4ZJfd2P_RK[N^ڼDb0 3oߎΡD]sᢛh2&I6;v|ʪLCS\zSoRP좡>Vy"NH&%!"|࠳fM->{aa7"˅z`Iyy(r)=Ē:ի ۹SN9`0C._Yo]۷[X Bc}` Ѿ}n. CCPq7vp~~ffnmq wubmB"[_B$ ,?ӓwg\2KݶxzIKb޽2}( FE`Td\S?gE11Xl>7hmb74ӗQzP8o KDϜ ij) OELiU,HMu^Ĩ(;:Jee"\&s- ׯ/'4Ǿ}Gj;jiq7]!+F `>Ծ-矔شXX?u%QэNNڱq{}/^ps wmެK"}j(*zWRBEL\M $(**,_.|By,Z$)! 0 վx |~){By_S3 ,44ĮAXiYQmG'1 fn.T[+*۬̾z{(^^:: ZqO54`04--$"YAZ89{B DD,,yy30$g?y10@Eοpbi5Fǎ88n:(7%/]:>'I]skB*aVFPll<<||hم5W))|i׮cN~tSXXNҪ衞_踸p%$DE:с LL<a" qeeWKm6+ȳ}}0Ӷ5ۑvtxzͨA&&!A'\FHh*߅::~+z PE}=]G `ݽֆPRC5$$45uqZ( (6Zp ̵+aa II.e= G BBfgފ34AOeRQqwddxK=xp7~V%KtuqcM.ָnT̎#`k =C(/7hZTTBrZ'f@M-&x_;w8cӋU^FC&(($58(${>8Pix޵HD%KԖ8 ۷Mgf焆EF{70}*mxV3]Tt&soX_01 yy;:V,x?2n/^!(xrh(Bf 02jrQ8а=Yg!, %ܵkӦ ;`Of3Z ?ΠNEF[%&޻yy.} TP?uuW+W/\\h2m>00.ʕ+9t0.WWbP0]DÇmޜLO/{zh2_͍g;u ﰰ}_nǏkj޾ <Yvv-feVUٸq !K>*x[*{OI$-(TfeNN\6/[/)CLl_` pH*G}a䷞<70>L?\\ ί]``_nRfy0{ |w=`;@yt;Q[`G =D^<['Og>ff4X,<<-.]LSsJ/]|tAee q3аǟ _^ww^##yuC^]ꃫpvްajMM%d֬qp8t(:MA{}68X_իw[YZb..'NǗLw|ʄg<=mm׮UWWPPRݰ/~eL]>䖭c0^w.55R[g3RhIIMM##s ''OGs .y1<e|Y^I8-!jU}y [Zn]LTLQou !""11U5wLUllGO/ko[[L4Y!{+k]ab-=-2z؁vvXl\\ukŋ')CCe塡NNV}ڰkFVccOrvzo2#=0]0Qp8+s#},//(~xީS.w۴АÇxxĘ̍#pKAOegwvHiv_DDjiIM9oor2'"~MͥKjrV-P[ bnnDOfkee=H)xCD达ꪬ̇55[\,_e47o۶~crr&&YZYkkS.~D͛_U=8xnNNpLZ!S׍:9}/CPՍlmGJH$< fC̬zzs ='&ް`-$00$2TH UC\By 5򭚪ի֯[cffm~8BA+EN\tu'GAUtb֪Uzzhkw'"<3s6e&&SsB3sr)*()))~}f]CC%% LL\NN15ٶu?;׮ ;!.#>.73Zm/* Y7sz#kc}BBhHJJoIfb_+tW߿7&&9b"!n@@ppI /7w풓9j򸖓c`ɀffwn۲|_3[Ltt)(6ovu35;cgX__%" ̘ZZUU=))ϟ?g=}padCI;Vy}++wӧ֬׃m|2S8W ޺c]P 'KhťFRQu᪕˗srXY_7o潶WUY[Buu]^{&%O=H@볯^effo`oj=0GP8Oi鯏5Re}ƯccF;`^a-A IDAT"F"~";[C׷HO>ai ͕44v֛‚OF~@P1C=j]NEqvVyPR +(JKPP ``4ctիMHHM}kB _aQ`0YyAA8|hp_o)!QPQ2ԃ .fgG d&w0O I_**v29TԴʑy{`v鹗<_DDYyOϜ60:EÝ;wſ/*jw%o>`r5Ogw쐗&]UPÁ9 Gu3qqoVi|hMAlL||e%ʕ:,,[!3k=mO)sq,SR_LM[Y ?$g⒔wy3[\} 200V?׋6?"/r̾zttQ׮edB{>={X 3 SFAI3쓏?gCl($$ )<0xgwnĤڡs0&fF2kk>щIH ,uHԠ驪AyTTttLMop!'ӧr owrZVSSYyRII(円O3ç{\w[X^.//'j`qmgΤg|088mGXo/\ rr**6yz?ߚ;llZ@hl~QNyJ]II X$--!@Օz!/e$|&99aKKShE%Y6)-YBPt ïنqgrC={ЈFz{+++swODGu"d3g ˔))[Z^<ѱ2S1qX~Gȹs۶ji)(kj02חxLVVAZHWmϞ1iWcmj_ržP[u.#mfx3@ 66\|lLOo2yWvt8v,~M d=sǏ {x8~=77 >ӳ>~ 7mR^6ok@mmjj@ڵPVe-WZ7&xzD켗"++/eK`ypOߧ .`mmrJ@ ST66vs;}:#9;C }x})$ ȨHIYQD{QBBRb۶JJ=y:^>h4x"ѱMULPAAV]]||덕ii'u- _3ިniyOPъh707SU ƩK_ͅy ߉$  ?`JH|nnpŅ83R) ^Qegfk}bC ׮[oxZCe?<ȪBoJd&ήߗ01 bk=rr7n鎩]Hyg֭|PkvoC&!#>|r.u5G{77#rPYQS ?9CCee7_Ңe!W7fw'ifVXsvdVȟi;"ٽ ɭ[/:9ZX47_w9:C5ޕ~hnij|jUq W=}jLP>jj&&NNDB"(a0J#;F~gf "3_b姠x&p*Dnz!K"4ZKkƍ,hiGh|9?4TU}GDհPgIkߎēmlw=@4|zsŋlm1 a``b51qq=B56m[||j||4bKJ\|UNΞ,΁T?ys5"($,0߁^xq±i|۷ǛBkfr秥~ӷtNqY74?hjrtrqҚ (̈zs†Ș/99kV剻4՗]]( ll\]E:,,C.03<lQ 1nnVV'WU[[:9HMK kjhii-ܴ)00 5T>{ |扽Ǐe=}Byu > Z?7axxWCcJJ3;iRϩ)A薂.۷_t=,..#^9zSZz;l5W}_F ~[-=V^uFp@i[ۥ)mL8|xÆ̌ *!Q^VXXU,=O0^6:{v?!9}VzA ?~STR0QQ)*u T{˔~S5ڻWMu&IH46 bcOp$ZW!ClK ^K)(*uuOJzԴi7T|AڥKe ׮9;l1Fmq+*`0.9r?};qAm@Obؗ5G׮Znl9sd]SZjTA8՚5.7ƒ-6n䔕]h`x(Ū/W_>b-AO^5<A}9zF1̓%6FtŋWVV>߰a{Yuenk]ꕸ-[Vh8:01ͦ]+ ҫt$GgUCCGWNѴz@ Xv_o=?<bH$BÊަ\yr՘Xoo< 'xc˗Z16f9ca aGqxOD211v#!,RTݼB`]}A%VP@*AsNnγgG.XԔv;۲ )̣G-;aƍvۏ42 >yj1}any+*+KKsrTS`RR8;<5EC#,$*lk$ӣIg?clj7offml~t7O~+)_76~P ^7y**G^Lۯ ?!JJIIM&DKHܾ}99߿} mLNh^X}ۦMcc%%N&&>22KxŋWsqlq31l}BF 5 % *Fb<'  ٟ==0y5))# b)H,,S[e4all""ܓN$xqꔫWv ߌ vv L_o,XEDKپd\bE<MM׏  7Aߍg`pv=thϮ޾_Z4770`g\ά9T7l ".,{Un !&fKtff@Qsi ֮z,<,-,/044X, %&*#C8v >^0XoO_L۩B68p2~AK'*\w2%%%>' 'N\|}j^?6Q(nn^^N3O25$2}}}}CCDbWWk#Œ]j"JJ$ -b$cudDCÿFov^rfvﮯ!"nc-vLWn ٙήᙘLLdEs7 m3(ts'D9lg|?&WK밿2̨li  DbO/PP0yl |kמ|OI!.LUEUEEy2YYQQ>?3 +`ֶmfENIK?{:8uE~$rxHB6ۗA"*){LhhL̃SCDxyUUm7ed<ik!>>:Zbff_.c.{* NK@b` rpdS79:>Hls % og . wv֓)D TV-z_qɍuDSWwq\[XR9q(Z&!!-- @{c>`ɯ .mW{*=0>PW!j_z98XVdIMMhhxzܿ{?CCNMʕҲF<!!</[[Zܒ`hbF(ܘT``PQtKN+>~ͨꑵh=mnjo;b<qtp%)gٚoX68};/Gdd75۰a*I#gj3On$ ΨV[/'ן`py_Pó|RS_3bA ]%<;ŕMt))%%P|}9<LL&!KGU|y:-_॥Y6n IS^-%9YO@299D'@PcvWyyAA>{.\(,緶ޱs:כ(ɞ 1uwIL|Sƌ̯^ pϳ#Ӎc:yV ~2۝x|EeB|Bw4(eտrYS\\z댕 =zњ5,z*Sp85r*HTeEw 0t_WX -#[[[W[BbpN -m q h]c㨭QS3221SQ ?|(+³MT:'Ӂ}^yx]zl5MʪlIX7-1_ߨ҉R`u߻߯\m, 12I ,& '0 ɤlcss/5 2PP`>GadO7vq''UXnn8(^;- Q IDATZ WJIWVDGœdM/._޷IIIEUJZPp= )1!V^~u03I>zHC-F21-\hj}Ƙ7gww[ `DF^*)7mlo2ZǏ*)s+;1ge!A"׿{W] ԀV4 nDGGU,)QH FKIa0w܌BC+Wjiɣ AwH SqqfQ9k.\tsSTu;%%6ih%{{+:k+33 Mq njLׯ_}KA{d[!!kk__.V5Ň݈,/Z_tu~^ܻ_wuv},+-(x0>>1fcCvz@kg"7~CGС˗>~:{kn4+3}owp5wH)-ҐP Zi!d= -RDITHnv߯~3|޽^+{|a확קl.naz4z4%:yrwR3䬭#,BIӱΤ57B3!=8~  psvb޼IIYBXak9&&ijsd kF44@ OOwa;"cbp81qo}LAE%",.>K>t(=-.e9YQh3--8:fuuMLX _\Qa4ʪ^sq-Yl\VV,vqFyWZZx8 <3٠5[|׮kNNU1_db˛{dhpH'תK$$h[[˟8XZ<ZxZ`,kGǃx{/'?@FdEhhyy%$dLF XϚ>q#b_;4E[Ħ[.{gRE+st}\zVNNZڥK/_FݹR[ww]ݴy{A˗k HoKK?(/D&T#{|iƯlM49-VaCFlV`dDz{Q]Ϟwuۢ<9FllduuR?ycJ@BFq݌t$"uw  Ĕ}͛YY鍍==44ӦϜ)3gmOJKu/_ o傂mػZюz_7ofow5h**FF~~AAQQE%+}3yjjCnݹ3551qӦ˗1nY׭qƎC30uvfeܑݍKHhi9|80pR$F*?.66ַoGlynPбc1vvBB,,agRRf ܱw_FF||Ȇ.&3$UUw\y`N9cvO),,"rrzz۶9oPDd4k!=rsMKr*bsvyy&EKPV24 ڲ;sII׿}MMɉ %z"s99d\gfy$ܑC YY85. Y?^DD^j]DGCU*+&''9p 1ų;vuuϞvʕ˖~\eŵH'kCv`b9STTLT\\J`̶m6:.Cc/7&-޽GVWجݾ7*jpjV""|<<"¼|S|ӧ FFFGgf ِE"rq͞1*44$16#69=+&&/x}g3V̘1\3Rk_XGK$%W.X0~~pq;rƺ𘘍˗gg32϶wu츿2#Қӧϝ=XM/\w,%&^ȈW:?x{g:RkLm]#K46:.wrD3|ukڲڶ5>!>.xm>Ņ]Pвeqq_7Zx"Z`,Ǐ>yӃOw?JpHP9%5/ʺ5$DI+ЈĜ˒L>vTA?.?MGM}}:3f ߽F-YrPd̳7{yDz٧OԴ؃LT6_Ưl!KMNπڻ  >}xB†Oz55Gs\ն4 dg TW[TKKDDV[Z- ]Xzͺ7ϟRRUSfbbc~MDY(#y?? q ߁t] _ٹfՂxk9 D{ 'OŋFY{,B~`=7{xx57_R0ՐHmmײ2o檅 mL Db˗e޹CPU51{?ƍ@x:¹sŏ(jfZlly`"9WJJ! >AWHOZ`"{`ʁ{`ʁ{`ʁ{`ʁ{`ʁ{`ʁ{`ʁ{`ʁ{`ʡ$L.{WVu{mm^Ǐh(1TTwoUY t00%Dz:/b,cO$Dޝ@x4:zqq/JHihZZzxDD:UR=0Hݵ׎ vrZPCCAa%% }Ew(+D$$ ,ز%Liikߋ%+;w6Kɭq3Mex|QQHU|«WO?UQ~vz33E%M͍ݓ' 65VQ%SQYuԇ޽~]q5&&ZZJJ22rr{znߞQ^1֜TeeEwr27TRRQ׷ KJ{]ѦE__}͢OOSeeu̜SS|m026 UVBF;#'e_HLtwXbo?wcbb` *kn&(Ѥ<չ>%TTT?e}=cc&Fkk CRSsjj,-|j!3M;vHoED8\LLxXag`0|3 18 p_JJrr-o=뺬;n`f2 C֟>w">lddlly IAA kJ LvvNN'zzuuksr^Rߊ߿Ͽc3EE?tTVu&~ qGy٥e< zmҁ_[tOT}jo0 P]|,(`QTTz ̈́>uS++WKU+#6KOرWdp}?Roϔ7y-?& !~?H@H$"易((\Zjm~Q$Y$~2'W˻8;,WQP|hjjn陜kё!%90^U5dCQQOOYٮ(#'KJ9~挫ō|-BI;O/jB?Ą)Jp8[|ד G{ے7ps0Uw'9f|sJnΓ.,$-<4%**(*rC##̞MzɳgNt cRfv6&3ɂ]oeg]2N\+_aួfff{ ݼ%!>UGx -RS77߽sVu`.o1_Ed={||,-utCBtuT.vvGﱴWR;WwwڵN_|ڵ&&;5AI%%8\s;99-Zr**V~qwo5KHIϛ7:`\99EyLM\n;PS?,'EDoZxm,ŋP0Qkj+W.^|GOP_ZYCM@E2 $҇g3ݤ||rrdEF'RQٰfpi.~ {(?ƍvAAcKTGnqrqrvuݻWXXp\\t+&60LKKQQFMF66~/ܨʕ>,WTAU2\7-?,P(H"0Ge"W%b`|nrW**J*p8Vf9RReZsYGBC,16044_rEFs WEnp ()ei okr桹Xluٳ7]U!' jy8RQqvq1(#ca_66Ӑmd9jJeZZz^eJUopsج8C*kQ(AjzǏxonVRru["|7+[LJ'O.[ʪdݺS]]B̹Mw֮ uw LEpɓ65ܼY[k g"]]Ȟ Ok_6576TUݽ0wu} p@?00,Ĥ,x9ML]]gՒsJʉ%CBcx{II4)@hiixԌ#c+yyw1^i(ͷW-Z;mb-<ŋ+^daZNv]0޾xOTTJ0:Z~~i2AA::ZZnn7DIJCBQS11sr|2xVfzF4 _ $QPsF$dD O1MJJEEut^m̜&%|_ߋ)~WMZZ:!-5z܎ȽцNΫ|l`\H'[ qLL,,^"\ݨoH"gϊulmGbrvvtg[c=@hj|Q448:#U]MMS96N{{oⅤ׺`w~ҒzZzzӗ-N;CE16:tt&##V457-? tHt D"Y`?!D>ח_΋ٴxJs*߽{4ԇ*AII)(ԩsddHLHOrАڲ[FaJNZn#4޷T?.{mEŵcbc3H$#è(''YlmLɻiuޕA ]JyIɋݳŤP(d%o?zt%i Wx_~/r(/tv>*qa WEy˖M+WZX 5]T#wr/FG:TDT4 BvLZO=s .nm{Ϝ; !!CG]++30 gYX.[ts8 IDATk:9o< ʪGyBXf^`,)7*HuVUUH~u+FsryySW&8YNluIT? 0ZZ:z +Db SjEf9:KIx 2ZwzlMݱ&pf@ q7nP(e5kSRﷴ@:~Xt94kΚڹ۶_6 S}%%<9۷]]ps>}՜'#KAJ_o۶46.[;v?5?ܑ#532%o`»B͛/\יt;3rmfl>d|q5.]\]ãg>Gz0zFWPnْWp]lxbZw;DBO}1 EGLCn[?߷/zσ}?djk `bFazEgqpL=mn9`*hD"P fS?pu`޽ i˯eksrd$;p$~z*ԈٳQV_|_WaǏ>*&m EO/,ldlAsL۷/_>y>/ocK{v{yZ[^>R0H%e'Kٹ8ZysYlYLLjꎝ& xyFsq${g=+.v-%%,LC;''bGXh^~{ -:Y"И߷tPRB3I۷ݾĉ ==ߎ#}UT/h6~F]}=_Y5gQPZfDFH'%† ׮=}123;hrDRKNΒҘ>˖\e.-/ws^XNn̬۷9gjSQb}F%44tTf>,ѝGevb˜:rI+mNvǶ?w**sr zz>vRXYG×_2CLLRoWDwƍi;|ฯ p^c\.gGG'[RzST\xԌd44>zi &&;L(IYLF\m>xҥ:ZnNrX ).g6]@H|,/A)a2iMU>Tc`EpzzFd>y0sGwzz-,Ov:mo9`=:xavvʉW_`e!/]==/Įm)_ҲzE~Al tE^~!n.v,|QWՁB6%q?!ӱt֮$%MIAѲ Ҏab9SC&0@C}2Ww|$'?\$<|P8HLqc u=Kff{O0e4{7o}\~&#‚}3gΤ\~^ٓW޾cGw7GK%8}Z7H|<;wbbRɔ{}WK޺vt5ŋWX`:YDd?p P]];:;ğ9wԭD4'7''M Zo/ntt=sp Ӱ ^?WEE_z?X$"B]1\JEDr/FDXZN>ކ{ҥ/#BtVϙ3|P4Ox() 7o?-"*5$߿onniSQ psOTxSZz`-{H=fP`<9Ed:;:;NI{$ #x|GlH$P::Z?g%Q* n`|'33;Yfb]ggeʆ7%Ƹ>܌+(YX,,Ŋ&>B B}ob))989&;Gb˞rΦչ$RMM`C$4T|BEEK%,{<9WOlm2r˗LӋ9:;v8;~7}) ׻=&. 0Yϔ* L3?~TW~/ʧO\YY%r6hdp&5~}[HF~Ҽ+(J11fz:6vjjZ&f&FY,MIIk32>yK@XXXhYXi()iᄃᒔR:w:e66k DDP YF~~+任/]O2<::dbmmmD"y|2 \!UTׯߵ+>o ޠ@5LJ@@]iyxxB•+wp$n:=1//oOUmy9[h,>tPٹVsGroi~DS $趶:K>u2DE}CY!%%##$D}pakiaq ,qY9i)hן^/>mƈRbǏk{ϟ,P]B44llz|HIy'$;=stQ:䰹97|h'`.&+1\R01[w@@B{{Fƚ)ȦZS2SA6mj|?{hұz{ϟ_j͝bcJK^@dI``oA}jj)_?xJ^iܽӟ?~ce卢pe< ҁ?|je!ɨEkL|0 -ܹ g fMWݻY._jl7|J Kːw>2dzb@=V8dbHE*+]͋o }_~؄BRRyً~][؞('Pu>Qɣ 3f H# FHh5kvD;QY9ѓ,WjTofPPzuZnNY9O`9f!20PQh4.. m-[ ۶ﯨ(/؎02*HIP>}dS,3ݙgsrjk8444oϜu&{WMmls+UT44ePSOUD,GwoH$NΙdc9h66vvvdoެ#pƺoDzz.N.n&=`fJJI$'9r_ [Q| <^Fhh}!߾v-b{w >edpdcaXT{mԤ ZsJEPsٳ6lK&_QqR`>+R&7w sqN"DĬ[o_Ii/|kQb$!7z%KYjed_籁OInH7|05&%eIqԲ'q4cdKwXr0DGV}o}9r]x-4 5g~ɪR?ocʒ\njוX4{|])I rdDC`B23_ɨ'5~U?q SYb?^mkppJg[}uƍgTTi ukP̒B3G]~rGuh4oa8ʰƯnMN~)FN‡>lw/+E~`l?el/##++==3n;7_`WC#,|CCw ? ?>\pժ;wutԤg 21#+^zX^\eg$!1VN= 9U GΞ]0.nٲγ!p/JJ>ήW/KJΟ?J(#rnm-4w̙LL>\{Whsd9 Ǖ<Ɠd~CһwܰEIEEM}0/#csYYϟ+*.^"-t_xssIo<fI|MjjY,,ӧ[ZZio8OWמU@ݸt02KEykk qt\l4\_yyƙ\zf#Cv$ǏuuOTW#35M}}$r3 ZRSQbDE8mfׇ`]J7eeyOJM)FMep~ooeŘ;66 8x޾|mI)>~Zڞxv% C7/qpvtqu=ͥ~`OoiifFB± ^Ǐ|Ѝ-Ogd{޿^ # 牋BJH|:&oU<*r~ڸM݋=z5#ܹr:SӭVV#׎9(ƍ~`{w`@QS # ޞYY}}ںȶ\\ﺣӦY,kɓ+LF Ė*H}oа5nn[K͟/ *q[99ii.|kkw{d`ŗںꦥ޿ϏH Z\C]PDzS_ZzAy9 $6,СKdmlfLG3kzLLbS@=Zx0)O#)Dfc'=\EOyrB$?~  '뻻際IDri;#&fk1 )'73[[{zhh89M9SfBNvu53u;z~+U m;p`kFF;v덼&R%_߶jTTJVVgf98hk tSS<uΝ6]psϚ`dnǏ[6v|z'<3++%eԆn _BBK+`Á˖"!7Riw};bӾhOO{wba =2Sh玽22C6ddtu11͘!%坜|`r%E {)g03us鹚z"EDXNNOo3gf-IJ'qq^^nii_NEln޲./op~ JA[tgp ;;)ܹo99=CBOts[d.'?L"#Odc;r(!!+uuQQ!+苈[Z}򴋳hf *8pٌ;gVP ;vlede Ɩ7KK\OH>IO2>+}ݵ)WCB)!TJ\+trV\7d _&&>3EEDť\\lfk#,O3cbJwduj}}f _:CXXDWDo*4vTr4#q!HD.ٳ5YY10: o?>|YĊ~qmsq5AnՂV F3gjj0>YBq#:`fnC[Q۶''_.Y삂-zdњc_S>\YW7 ML̹, cN1ot~DT^އ`=ch4?ߒ,,EFիѧǟDꪨH?~ƍw ɓ܋zxX[jkȒ,\qcjG}?z{8|x{{--%%99UU]ŋ==o(/kN v;9kj*)[[{y%%ݽ폮hS`ǏL.\3&UVH\mo ʉ11x˽]ɟ]-, _hjm=RR&&{=t?J龾Eq!!66+**)i똙99>*^5~q::Rff{>FoߞNsq!#h|yM_~o|eϔ<#d$:ˋ vqYPKKYYF-Z'$d ϞutL|sz^`"{X\̎% P(k:;IIc0$^WWVv5?5%MW޻uLtB3>>b 76JK[[{y؊दbښ^zZ~nɣu](HNAA$|UIɥKǎK+*LL SSed u %H^;߶T߿yhB|PS#GZO;݈G [vϞ> 7pG/^oYt{L.n ӂ'SO߼Ź)'O My7::uK@~ŊuӦSR{ĄPg*,6==)ȃsJ_xww={^vu^;iiII;wz?,njO8a*31c/? fg3ˇ{cR?'+@4N+Q ŋmSPXn33ǎ'9#Se IDAT&8./{{ϞM9>k%dP[{0%M<^Up؟=LF6?bΣJLTE~Ղ^gM S%׌ A[|74\vMfVk}` %eKsEţGׯg_ ϋ؜{05(aƗC+zn`"@=`@}}{J@48(Fӓh(Hx'GP<\Rsըejx< >~++Q*+QQ!#EΝy2Q~/$& [[,SP111057_~hR^\ vo \J***ʟ šC955>Mws;r""bv.&&ϕ+ӫ[sP_JKHPz& qtXhG8'չ_ 8̳Qzz.44@:F"2 bcin[6B:RO6~ _>@06JO߲unjbebijett&?b~22kJ!g&$  H~"E"`fppimFHgQpɜ\IG'/\ECRRћ7G T|11"=MGh47"55zzAM=k EoOwW/rFyyMMn=u*,\Ti ~ &/$,FuwwwpO)hAf&6C)2A$_r?jj.nnrk23+)k`0r/]ƚKё!%9jȆ]QFF/Q#)ztkkk3.7^{5m˽]ϟ&_)tIKa4 Λ5K𡩩gj`bc7WY{I,1AEt] MD*<~^nCaskk&-Hh +3D־z .!%-4cpA yENnL`ŋ u,-WܷZ7~W䩈wwssmmUUYYiidy.d c=~4F]ekkjndtϮ]|;5oÆ w#kjk+))(/[{W2ܙ6MHcbF  Mׯ_VQWQ"BfHI11޿Y@V$|0;js{{˟< * :RT2{6'Ϟ >;ffQ "+*^Ve.W7n={ٙLD"y35KB|j ~3دdϯ\kOtkLL&vvkKJ::p;w׭srZUTtu,&kbc,7ou<{{/dܹrr晚nݚ} wvMV)'((88 N|OBFFzz#+))),^iәg:;c,Ν!!7)I,/OyyE+o_XAo+}X(d*2|tz{kks"#AAAYYWwo﨨+y^a?{O-«W\4325uee~Aׯ$҇g3ݤ||rrdEF'RQٰfpi.~XÕ!}V_ߣG7n /^LO?r<ɩkckhu^aarEssѭ@33--EE$7%&wtFrKI_֛ܺfsS tI$"Wxh,P䪄@ Q M8\EEYIE,;GJJ@`2 Zr.5HhȒ%Y[.^Hu03TQ͒N@p%%~ѿǷziy9 Y,͛쮪[{섁P<s@/i6 2]r%2--=GJ Y@x2%u*{޷kjx{GlVP!DKN U5(`5=Gy|77+)X˛Ó'ǭ^meURnݩSɮ.bbS!܁&B˻ukں{xotrjl}lmbefnެ5|3PreSscCU;YY)99 s[w落ݗ" MLʂבSؤJxV-9x\">;$4H -- oxdl??/ ;m:??%]+r'M` ?x@EE좣&eaF~H,4(53'' gegD "+yW>ѿܛu㾥ܹ{ WnԿ~-1qNN☘XX-,=6EQQ5߼D>bn11" G Ŗ:x`K ۲u*N7N:r$-|7@qxW |0OwdՖ=BB9++M:|8,Ʀ!9?::%% Ld_tԜBmmo\*;D6FGc<=nddʂF32Y|c\`UkED7oMwtxܿaa!':/^ Bbu"%exh~ҁ),bPRF;'FZZ^^BHUWSD P So{BRk]YiIM =-==Ì˖EG4mnLm}Hx@;mO$"udB|~O(#'~=ybb6m:(+wc>KcT `ttʛ^MOv!:997\Į7nؿ]Vt|78 Dy4>tǚϞMM#Muv6ʔܽ{mlrSTͫz4z XyPl蓞K:i/!Gyr,FUe6XZt?~u+44"ꅨ͌pW@Wt纂6 ;莍Ftt3i;zpوح[dG ,mLs7&曎#T[;R cXTRk*Pj:h

tow_?SRQM>d QQ100S$ǻ~hW<ԩOyy7nJK;>Ѵts Zv_on=?P<̳F EEW<13{bĤ< _?0GO_Svcv9!!843>Ff E$&8עXPFFEp͚So() t9w71`BB&4׮>|oZ/CCN֜ǽXoڔ<^*ﷷͪU.>KŘ'$>lԌ]C]]uuIIaa||P3hW^/>PQK?e FK+**%. H$>|pƍ]_#zD`0e>{ǫY[\`M<<}eOk?̤'"#ʏo\ZBV@eiI勹 S#J;v|9ʊ"<|z[ >IIߎB **2p[Y=i>~y欯ҥ55--׬>yoQBAAIE6`xfidRAsg,5k~6Ll0+ VV22toO%f11х,_qvwwO|e,NIbxk iIPPjo`v4 K:vCVf;]ősP$~LGFL 7X^^TB !I/[l…]EEyPĢynvֳ+Mv+[V~nq1+*DG70BI+5557!fۖoUͭ[ٯ_SQ cyqqbg%%4|<<Buu^#RfųMfcdMGL_PSQS`[x<ngd`kA+(YZX>y'ӇכsOəҌȈZjh"uuA!:j J J!p ۮM Ά31JI10+j ij JJAו긙tP:֭1/]tr|kEEO?|lc--=?]hhrrffThOݻaaqq%ߛjjk?>yjG,z`0OUС}l:;o0;w.^<|dfWWKK=ŋ-RV63;os*jk! uɑYeadwO+899333 7//' 63i;0)+ ;++>4j\55 /bM;QQ<8s….(ښ~Hؙ a፛#ؘČ ׳Νgc~u\Ю UUr7 jm}g@~ag[CP)(;+}8(ݻss=۶ B]0zOU~z /]dDff6J3i;ys{ۧOD"55+ ό0612;;I o44TW+<[AAQqt_oM4-rr0XsΟ4`RRd%)(".'/-ECʷ[Z$44,ߧO0WΆjjmm?ߛ7;;;{nfjkCijGDTh#RR㐞~j^3|;#s1>'P- m'ْ҃--72nخ'84t.@ t| 銕 }E9eLGT󾬜{ɲede&f!i$RR/+g߯1rٲ<[rZyx%'zg{nU*/R ]<WLŎ䡤TV3X#??Zѝd=~EOHA~<.JlΎO]]e+N7yS0`yU8( F@ט޾ʊO^ף?~RDChn}`pJJ$]ۇ~sG}mt|;O$r"6[6>OF`#lq\- >)p˵ uTF@͛¬*8L_6ֺ:**22""W44PdT!}eekj^ț-$1ʕ#̣`0ee33X45DLڎyτOHh&@[伪"WUԒ=XfTEeewD"+ кfffhOݫ!p jj6V6v:_}@ DMM. bΟ~bkjbee͗``zY==CZZԲucbVٱ2Z;oSS #=C52مl:~]Υ%9ﻺ7Q!")&&%$T4chKN/2s)M |XXc׎x}ϝ;z҂l" #񣭉֥xAR[XkFгspP[?pNNvn^vvέRe˖,\C;K<0^**kHK"Qu7_/@4S8\yܜ\\RR?+QskkKIUU?b` ښ׍]<7xv ԙ =`dio+"ӓ}@``|BuJ`o NקXs4 KJHKe%73&6>o_on<ֿu- -]Pח,DF~;1%]X --##55= ;{ X.."B,v IDAT+EFrsO&+H:>וWRR 񦩼ƍXZeeo8v\W`DD躺s۵c,3K__]]QaB|T$TÙxy:Kgg^ޮNN6::/SV TU\ ;s.QJgӾ}&̿6$Ğ/jDQ_KrB)׽ͣ"ZffzJ yYH4]ee^ի NVQqA8mdjLcՎںR\ܔϞ\pJe͞k&@ ^䔙\FWSQ}1FX%{zw*WL,! WR2]77KG7_tgccii!!ll||X[_;&k ~0ZوkImm O?痜:?YitP 䔐#޽MOz.>~FOOl:{-mA!C룇WΜ{^Qq֣G=3_i;pHx8'&gp(0 #/ggX@ZJ@2`Su7 >x/WR磡hk+-m~faakH-bKH6B^n{;,]ǎ:;oOAHu%K99\s'+J 򎎪y/]PQ}k]<[`*vdгgSmy?%Ǿac]A܃jGV-_(*ҏnj|^AffRRvvS}#ߒ_eᡯ=)oo__!`5n ̗{Ώ u9a`708x5?˄':8X"2-)TĶFK{w~ecSL/(ȈIOoi&'geݹw*|IHȕ+L#n ˿ׇBAbj"&:JTQv!֭)13/\hht rrWSU?rܞˇ=<~ojda`8G6Z񆄄ܹ#-H`c[Ps];hhw]F)ӓҐ*(}bx'OlX*<.. nbgSl|p?..xk?#bb +-Naт:+V"9ْ>Fo}WCin޽;<|5k22hi:>r%?_UZZe-ӥFw%a7C$#QV6[Z05O/LqqV킎3='(-$tLTTBiDZ۶FD<5dѰA=ejymddhsgÛLŊ険 ߰ygNe_odKA!*jo&!wՂg7o ON~ZZ^NZ`e8b%CDDHHyy,mff~>II--{=8`G+xz}8#<ւ DK 5.EGT޽'=&)6^Affv Uttyߢ+O5{IB[_HHN~Fu5KKvv::&&^ E?Z"% __ q  nۻe킨(ߙ+_}.^4̑_ֽ??3˗l΂´ԻwqEv鱲=f0E99驏Ԗ,ea{. |0%޾ͼ^Rk/5ab{6x3WHe;^VhKUOU70Wq= |q= |q A?O*+jl̺ S=D?\='oGyRQc(T3 D0 |jf&.. bVVWW|<44YD4@gƚ22ʚ+V:;o8v,%H$$$44-,<=OVQOH%=ܢEffv|O̪?ZMv;{60u2YYr]b͚w<}fFuuw2nf͍V?,7`$1;-AK35`0=[CO8KI#D"Ksseؽ{o~kBCsq#([Sxtk +99͛UOm#'&:@j/rpBLjjP-K 0t,A =WO OFGmpvzߟ|*~~ KYŋAA[8<0@cgWR٬O߽p|Wʏ/_''KE5j6utGuzG";>|w!z.:,699ՂW5QQOxVTf3ӧ%%9QZCTtbҎj#cj=0W.+dhI9JUyre>>.Po#}>m~VaFƓ:VV꼼ddjl,,wWS31^(FI9' CC e~639>,+ef y ^^p؟ջ@)ÇWc327/H!ZZR=[U~rt͊ ]J׊tΗ/`m}u IgzԴm֯?b̓_lRLfy7KI6UMǎ߽{2c#ȅ쇒O 5ƶn *S,;`?8jmʨ`73;{mmn^P@O]a pm-_h,QQyy jflbv˖olϜ5ԧjT PCC۷259z49yecϾtuTφཾg%'ʎ=v~!͍׌v0(d0"H@ddZF/68H$"#s\IEz ^^^V_74hDO>>ٍ PW߾mlly?; ?\W/B ~ ܏:LL JBBpƦvw&Qӓԃ "p@ w-7ҟ=#]\Gs++{ih"Y9uuj:=0+4sO޻zXZ|hk~_w~Tԅ  6V{{LLJk=c! M]]Byt{c}X; pA2"IȈep&V_К}ґ_[([Id;$hlc`-sӧ7o{{ih%ʄ r"TWN]jÆS ޽Y/_˯\ X\WWMMNNZxCP͌Q3|Oۡ'7/]abjǎ65a0v;nfa'>twާ@ j_7`#jzOWQQk֜>֦n=^ތL]/^ܼiuymWŹBΤ)%e-=<7HOM dF2Q.p$gkt ڳ>4;3&v^F82ڕS0ۻBTTOoxUDDeehi'Y_]ÚlzRl!4o݋ sZsؙ;kumcFGzᐓN..>X@SxGBFG10((XZ99Bow7tĉmFG 88VUED899ޮJlaeC_7ܻx /10P_gcl*\tZOisӳSםu`.i)a0FŚFJH]yPklBԛ&x|}}~nAaSb͍&Sm54Cmm}]w&**)%*2ٌU ii I"%M>  ƫގKJ^-ÓHl}kjJjjgכ o@Ca{ յֈO*F]]--UU9y{^okxƨ蔕7\.+{!&,Btrrn];o8;57nrqq.$||sZh?KcMMaŋgϦ&G:;NekheJ^޽66yAYJUyy}=PLJ * XyPl蓞K:i/!Gyr,FUe6XZ4j:ԎI?}ʺQBT?fFxqCs]AA__e΅?Wt c#:DݺUNv`ZRQYZĞ?~K[i28Bu~~.#Ep: L%%8ƯFo ,sMMFD8U]k:Vc^Dr9 4R E IDAT b1]+{D"(ԏ?|[G-O~H$QJ6rrQn:z D?8 }7u 3((TTl?}L|'[٧O;WW+/u+8ƆsdV.V1~l73=nɁ@:;~vM &CӳA?Oggg44pp-#=b)` y< \h&Ƿz)uoaf>tow_?SRQMڇ)H~hWT⧼7GFhZdjvlzs=/0&04]<;z݋5X7{ ?y}ML tZs1{윐 #C3 C.u!.QQ14\T7JJ.]:wML0 FM-$db mAsZQÇ99q24lm>qkM㕂t~v_Ygþ}ױsG&)llvvqPWW]]RRXFgf ڕĹTT"_o.<ֿ+gJJ32/ys玀,#|o"{:]áo7/8ͯ- Œ}0hZ"7SJ3غ54SQ21fb| ԰ ԰us}пkxx\WRja{"Q8$\{w~M =l??ssOXj[ P ||yK򵔔nc#KKFF ijsڵkYw<}R͛Itx%T-"26Fbfp!&Jɓ}.8@IǯruV;-ʄL_=A#'af(r3i;i  Ajj^^qŚvvrzY:t̅ O-,5ԑִGTV Ck7_j}ksA"/gdoߨ.66$rhݻVh~ ϟ?Q(..v陧swEG\BT~p4 hh!!eeu5!Q[ | WT?cnnu WlQW OZfX\y+JC}k/_B22jhKpq lFm#YXY>1 #kTHX[`MFdffc?79:>}D$RS5 % `lbd")wv6:hhyWxߚhZZk=`UU?)BRRd%)(".'/-5,+RR*)23Aqqׯd R'dɿ>}zu6VSShk޼s3W[MS>"DWF <=3!=̙Վgzm5#묧>#JJeeGF>@tt6}'#SW߶-,_Q˗-g~=Yokyᕜ4wUUyP^J!չІM~`Kˍ큛|?ki  ]--ukgh-MGG~~;{8-=' Hy\(*AA!ɖΎO]]%[&ͅ7`~*JP(5fӧ!4z7\08%% C|󹣾M:'D9kk _Ԇ>OF`#lq\- >)p˵dǿy*|m}# AFMaaVfek]h#YdT!}eekj^-$1ʕX-0뙙l,ZbF`&mǼg§O $~4zrsrr^Pjjʐr`=Xf;"UZ8{j~|vGW aSӥK%%⸘<_ؚڄ;wxYY%&A\^NW{Yĉ jj~Ed'OҢݼ%7wl:&f+++ӪU1É5592/TG]XX' M%dπ!)10o=@`6$̯{WzEu iI$6hk^H'7eIq41)!ŏJr6 \1߲RBd#Ovg,8\yܜ\\RR?[ skkKIUUAYߏX0%%==# u?̅6o0u {x1sGZZ̞V[F"b=='TWt &=}Ϟ}}^^5KJHKe%73&^84;}8߾xxWX((hz `F&22AHXv݅Ű2221QSɰs ?Pߏߌ))R+h*71?KKCB-yGWWO_]]ZZHZ_MiIffBBrrI ;Cd%%}=zeܓ qu~uti*/q#ćVYա1QAA:vnj&#WWWTYO2yǚ9cǭ[D'-}yٍWVZHKAa73 ##];+EEDEyx,ZͭEG na\Ӊ8qHH~۱tvaC]2e^>@UUʵ3"$}6gbkCHin~Z 6h00@$л$G!( //r<*ref$*ʿJE"wy9W&/;u[Eyd-LM36 suutl~Z[WRٳ ^s?3ꄅW trtsxu\ۏHMWS#,}钽Xnj=f3DO#$x-|/^ *+\XUUFFRr-$vzZFVkFFiY[ J6JXH\\DHNΑ[SP,X %> 35~}RV[R]l^|"? @[{m]ii[66 [ES+_tgccii!!ֿllϑ,-񱶾rewLZ,vzg]=!a$CqijגA`̩k q:!666={Μӏo"*zjY{{!o3c?09jjjd,+68WGGWgcyySP,R]bRNά+WvBBE~K.TT@F Ε6-o0]\|_rr$+_VCa0 JNN Y>gϦڊ7l =+{Vzhժ+EEYM+K l^FSH|RQ񴸪ZRM0;^B1߾x |=ZU#(BR gb$|``}կz7w`vvrzqϟ75t#P<<44D➀kiAiڈpτ@@Gs^ZZTTJrkkGG?++2̗JKO~TJAaa'O>lh0q0 Rɷtt?r>8eaUR>u:5mj]099QPЙ͛8r$!…{srvvEE'm{zOCۛpBh4-!ܹU )?|I ;;? ]vǛ7_x6A@AK+h׵xA#OJIڹ#% yyŅvZ26 /n ̗{Ώ u9a`708x5?˄'S Ed[Rҷmm9:㎉KPQ66 ؼ@?:􂂌hrrVVh))]ݝ\qw_\^?:̗\(/>"::-ƍۑ}}(TA_XXA+.&b*UT6rr]uz#yy}} **]aܷT{`L8]G{ΫW23 RRSܯ|^XpRfflLW ξ`䊕!opq62RI[A]] ٻy=׬Ƞ_ы|.a UZZe-ӥFw%a7C섲.89ED͖26M-|U%a.n FXOp!Y;(j\oHHhhjȝ;҈6 5[[ڵ3vw+rkhjJ6NOOJJ qw' ih۴СJHؾ]mg`0YY ::88& sAA]}m!g:Nk ^[kֈᰃ"MM6o >w.lx{z b_֧?y~fzx㈗%>!/Æ橶ʿsү+SPۅI]zYg“߽|*h?--/sNv]`|Xq6}^^g ;ORRKAO,T(>:>c;<ւ DK 5.EGT޽'=&)6^Affv Uttmxߢ+O5{IB[_HHN~Fu5KKvv::&&^u,+RRoɰwh W`_ÇM'sdWػp99D),dV2%EE4](c*J9QB"8Ͼ>ݔ"D$BiiXwEDTU,-CB.^,z+0VHw"#nut43SUYHBBNNUUGqCŭ$҈N&""-gn{+/_67G{\͒KRRQQCfc4JJbVV1ߏ|[HIWm36SS۹pMM_g8cҥ d ˖ܙ笧ӧ7m72RWRR23ط/9mWGPz𐟟g``\'_{zzGYme,##'aniӉ9>`~Y--/Z$&&!x㺺+I..Q55CWVVV0y-^Oӧ[Xkov~5f_ߋ}Ȏ/s/i&7 R֬QTߺ_Ձ}}{ij=Je|r鲳Bn5kU0z{GExx,]d$946vt JL,, ?F/DDll-kh\prLlL6ԶX;}8\/BҒq$4?ba޼9쨓8C"p߾ML?lk{֓'^xlb11Ǐ,.nmmoic+mii(H4Zk~(+ٳAvvq))J?.-[puY$A!Kcuӧ))gDowt,yݝz\F$~VXxl`GR89ee[@x61!hsx tu͟ɉ޾u!]|9p႟`ܜsU<ᱷ_zVw9si'? IDAT))JKofTQ&%:8̟?<:ȑ]\6X/g˗pw{QP_sJBooiSMM;\\ih?~roB_|ℙ)zTH¨hu>뎆RS)ș/[ 9󔔝M?Ԗ=az*ʼRzPSs'/!}<^IF_o-6)B > -c&; |qs߾nni!C 'ކ/72 _!9nWW\PHhzNV.WM}}R=22vvLYJ^g\?~˜3EnYG@AԩjK 5-D F/_su鶰 ٳ  ~ FTg]rR^OOx0 loBB||/#z |CmjjtTFF{ց"o7^2p}iꨫϞ٩ҥU|]W|544"e|]019:??|իޫwښ{TDLL9s=RÑ} /䴷:v`ɓuuKCa燐.%uowjpX)ý)OzAA˖"͉є^g:ßDOesFƣ[6C \E #ro ` ۷m޽?FHkQp\IG'-RACXTTXcUqL@9s('(ɩcbLOPSSirzyPS/X '/!1cEOwWgΚh̋MLF 0P3dޮNn¶omm$ jfC=d} 8804ȍJ"c]vωDee'gWWi`n`rrn.*LEEVfx[ **^<U)/@a75#[2?~=ґuu=xp:h,,caϵzOj=?A}S^\gѿ60<|uR;J9^EH߾=x}ond9&?9񺔋S[___QAm-}e%_,%.Ϥ`ۈwb5(Tkk}}CC?~~~ttlbVk&2mߡPY3É_.!}HDD.`QipF>%^?[B4lTH2kp$RqD[Z.$]~vI9S$4i妦::E 4Aޔgdobf"#+mivcw>~XWQх!!nn&&JJ|^O Ǻh ;vR55YY}˽]Od?Gۯ?zu!''#oboDģ#>4ܙ3}rz ޽{駯 ]xF͓cb-3X㏟ }2#o54iikj8 ((( -53A…J^ a[ }ȐfܳÕ)(# Quwod,$dbja&!1F}@y"g{W^ޑlllK!?1SD%o)G TUGDpە>t\5f`nbYI?ȬGx{[Zjjjhܺ>}zԤgzyZ[**ki{ytv|[n|Rӧ7ovp02( 6m/*jk=޲)e,|<./nFўaeXxRW={үWWc.kɉ" {,Xa3ٳQݨPwde))99MM33W+Iee#QN55aŚ$RKKJaaMU 551#ξqK[[OG\YUYGWA"vKd7W11q1oH66bb ۷n>Ԁ#ժiɅp l3'̵z{ ss\A~>Gg'yy/*G;8JH Wol|AA[۪źs'R{kw*KN II$"Wxh(rUB (vAce\$&3PZYn윖# 5YO@_Iy"**̿_Tqs~k$Ғ^XlUիv9\Y.%y]jy8R^aA(!aaf 5?Zo}Bxy.?7oW<~ANuꠝ^3Z_~-:::jz+-[.^wq=uM[6oX[kkщ/\8~ֶ>TJʮ]9.;^ԼoĄOl9uYS:AFF[ςQ~Rg++5+%";""<~=|f?}o㑾ܳf`f͚3|{Ԍxn'P*;i)*hj =$R{{M۪/MD"_꛿$2eyyeE{; мy㿯}pr"I$JJVjoYh4/#Ň`Y",*Aaa^3,h4##77@{i3vvE/55_|9ΑyKhUpXCC[Ž -Dąm[뉓9J>܄R4=g=Lǻwbc? &EZr*W*Ouő8r{-LG#-)9uiժ'edɥ=k}8fvuUWݿwbdJ@ģc쾙;gd+K k;>r_]]^?yxs`c(>wtO.m𕑡3YfhÝt%#=&[x蛆ZZ޻9J}Vyz j̜9581T%kj23oTTpqjkC*(+bU]9YJʠ9HӃ2v*j&d߾;};ŪKI\u-me[;%((*&`TihťED1@UWSs񒗗oߊ:8xznC"}TZaۓ{'<=`F}jGkO)!o{z'G u^"I-U_bd@#jR^~'وTI_AGGI陒lm=\5`+STmWB!11dds}Μ17:ZcUWoҲ5QZ (,wEGA~k-,S\JKT#iSS捰SJ^ n7h\c|__eOGXXXi%#s ;)/iQQCOjZj4Xwz7s9D# 蘗n^M Zr鲿?z"ƥ[ZyC6Y7CCq]==%QD0=2̥KNsK#.\H^^Ggcaʢ=sMٲCTVܹՕ=pGNo#7AcZ|[DPPLo>ѣw|NW>uw8:bˏE{ϟ JVVf?F*u}=d ϞVT?ȺCo?~CV+,%$/ _OK2۷߹SZ23=L|HrKkWXsWaOOIIt-RR;w>|qF_ߥKˣV{YXt8zEgHW -52jl/#2DGnN+LU5`N^<sп.$>{*(nZ+!̎?bgfad6557uu/`a71URmPcOUMYYtZٳgϟ!3̙C$޺5)e2LE 89 0WVmՔC>`ٶiHB10ӢP8B[{[kw'p(3+ 3K:ȑniY Sw29p-[A{ouD߽'!1{+ 9|yK vvZ>66_{;"{,n>ΙlXl__񶶶 M4CcijovQLG=c-o *66TUVpq~x_+W?wD|| s E*?wݪ*S{rF Ϟ5}b'. EE2g}vU׼*vrJ֦kaʊB{w+W23}_uuqTsEJJEkEEFGq]H 7|CK;g*'իW;))"Su_LQSsU 7//Y(Tgg{[G҄ȺE988h zzFG7uI1 WXxm ܼn.V<yH2%ϩi8YR@`Wܹ[Og͚Çu/71 ٵr5wDjkoXhA-<=s&%%Ǐ?#!kCCc=jlNeHna˫18PvۋF ,7׽GxxEwDaQw&r_NNY3*ً^00~_ Tuttt߾uvȘo_"cx|[;&(Hmmg%Ϩe$#(;%%=WTt͂r#c+m&Ks3ܴx|~}})v'#e;rjTT2k KI>h"ޜI8ծH"UW S-- ]DnoTT3g#s&OE 32{6\d2ih0&OXUUݬ̂솆k Rɫ&3ƞ}}%72yڪwri27:WWWy&!b*jњ#~q {v?y:MJ#}[k={>y ҳg^,-UG**JK̞e#w}YO7>UNlL;뚉V /_d(hhfQS2131"b1hJJE_]\Zv>B3ѲRQQ00PRRQ1d`&)*(--,;[1CAP@jii'kzʺy`D_4qtt QR|knni!7ocVlߞM"*(9:mvPtK7nܻu 0PQ8 ~(?Ȩ-[5 Ĝп<}|TU |_c]U b?!G1|6ω;kcCSDO>sςCEǧ/*FԒ:@|e-[ilϿW^AARVQRNK++6SY{{ KԔTT铞7o"mV*ג%~ׯ_O]SeoFd FL-&&--}ii'O:ONrȥMJI .Gb~oѣnh &&FQ#/íɞ`4E?w|yYOϧk׶lZGLj/[B,,'_(=1h#o_1 u; IDATc Ld;:ng|Q܌y_XmD>EC&RCMV=WnΩ8ggRқ7?;{AA (LIIN6DSQk۶Ҩ3$,lد'QZljj+*2247&]ɻ;읝\ή+-50=.A![Z[W6{ZjS{Tq* CY[YmWwkۗ&d((Ջ݇͟QhZZJʏz]ڿ6"/߈vwE9W9E>QP̛@f`V,ߴށCϞAxUdȫosqQPNfFq JC]^~Ѣ \10 GS̜)"nku=KJOmQJR^ALҥ JJ,Bh\ȨɮD?}&TEc'͛oT$QOr2{_$R[r3f!Az}\[ HO?c&'ӯ@`0  .!=|ŖW$&Ɵ{062t20u_1=/hi5W:01i{zzP>{zڵ ~<*2'OSSظ);{hӼ,.n njOU^~3H{̩) 3gy2Ry292=wwnOFi3}@JieqQJʊWꚊ$WGIuz '_oEQ.'&*F<#/30)qGttzaa/_V,M=޵[U"&|ՁNM Ic WT&~MGXm55WR{fVvNV/-3ZwPcɧWTt#+f}ZZ:Zbb?F\DSKL$'O]]EyuMF;"˗;wBv^ OcjǷQ&BYY{lݚXV[ؚii;w\TPts[:t,/3|" -zw#?d$s8-ɫk.s ; #S[/uEׇ>@G֊9u zzffE\VΞ׾\k?}V- ' {"4t2Gxx444rbbFW ##11)s]T+.ZZ))w FFii|b"ztYTԊܣ@"p_V|_]vC5螞31f<|h^/$;;++$&DG“dnޡ!'On~H#c/SQᵴ7oeeŐXG{ VV"gO/zDZp  ܹ>˗_褮1w ޝ/%pz K4zҒ#`ժk++퍗$_9q1Qv뱱: kk_B0# {{IfDs۷wIME9SPp"^ޮ^^Q%jZ2s!w))>ܼx11j*eǎ{y 45VZ #s㆓'k;[Y-MKU؋ZotX6Ҝ֭Ved[aRC˔䘘=Νg@7-EGF")!%=>;']#;LMG^ pؑ#u^|Ϟ`iYXajh<>FƆ‚[i5լfmsO^ B:t9**릔ͼ(4 ͼyb)m .kiiժ..1>k]]xu^MLdea`mh|̙+V(* ~n߮呚۫b?ר@̱0_ceuj8O'',IC_ٳ+"N]@$͇(0\85Qtt"DŽQիmԖ秢ē'?}ٴ=H:O[|ZhhPpNHkgcަbc>Xl9jnl00hd4BCsrnѱ44 &FKg̼paր>EDhK^?%|pRé'5F#^^~~I~$G$Ļ_Fޠ0tQv,Esϟus,žv]o]\C춳[ML,dczW/ge{7{mJf FXxm[%7\C"}{鳒Zm?_k+QQdnJ;٘XKmlݹsd]{mHwb4"Lltt}o-==β7[vkk!OQ()I-̈́Wrs:߽koP00PH{"D$Wn"$dks?SFzSS>nn3w|EˌtxXCݰKA{O8zN:#'*V޽vrFSQ12ss YY;ࠡSS57wua0,,""6>b9r#XQ  pxxƳg#XXw\0ǒ''wv21!B%%OWegFE, )3^ꦡ}+7::p~))m\3Y& 0_GEyz\PĆݻrrf8;/A^NO=])WݾVWKW5511 .HI!^ųg^0UJ*TLLjk'Nފ줢Bf:t%g'}!4a:q"6ƍtv-\(#xڵ+VHJ\Ml =\>~~4zXJJCCW--…VVmbj*.: h4'/ddhj'''$(32mxRZxĩ#g/$~=dŬY yx!}ƖGf%_ zzg͞Mv[xb|аȨ$̙ .ڱ# 1(b×SEO'3x>ȏ rW f,!!ii3Ǯ&ӝ7o3R/15Ԡ̺%*p0el1^zz=̼up}?_CK} ?:?Z sf%j[6:{7wOtLt͹̙10۸qŊ1p2Z`,wcϼ~ݍO4Zop/SBbNڵc]+V@gP OKNI?{ϟ]v2<)ǎv@4pq11;jb`:#ZZnIMwSTޱCSL"͛i)(44!y`| }0)2RUkϘ{N)啖_j=){`ځ=0@v }L;HiC 0de55WSyG c %CEm[|;}z!'b,}}cG$D>@(- 34{HŋE/~% USsNd֭fzz22IHɩ蘚9:n?t(9DDDUTw|}hYqIJ**jh,=z,#}p3<>?? PIIL*:џ+~2.<#wpw^TCCAALAASs2;_65޽wMFFrrRRJJZZff%'J*SSst41QSSPѱ {˗_}V^q#+<<`2r狉IH((!Ç/^|w#JedTMУ敕T]M/99 WPwѣorwOdOPpz}hkii-+_^oo]K,46vt JL,,y G !Z==SWSc˥.SK>&'#**d-s0.TZC99[:;/[.//!44LMW8~zzYY[tn&v6&Rmkw/}8\/BҒq$4?ba޼9(`H$۷[ gmmoz+W–ϞCP,<&ϟŭ==mlsPSc-- ߗaId4ԳgSR8\{P\3EŔUUtln++cc_!/GEI?ł}]us0SP,V42\dƤ+grr-,~l eΙ"r Cm`hmmaqTbbzFu"oFFt[XهÅ #*.9)/kT_OXZ7!!>>W=>655:*#CKk۷/ea4uug vRz*[u> uuuWCC#"JJxx\]ϝ۸QFK׵ sC'ZY]z:-LqWJ-'?/Vݻs3!!IWW?_䡧WQٲ9#-l4koLJDŜ\י3?{24yӃF$GJ*\\?8DS~0"bwC~M'ПNjw3PUvmۮ&%޳̘o֗YY9;8[ZEGoYP()WBb""q7)W:x;(h2=]$}?R`"eDZjcoN]_r H}>"E"%j[|w~Q}}$RZ$~*WIK;;9TP66~yBmmuջx#2sI4Fsrꘘ*+>}^ KH̘AAAn#u`jYKNM̼x10DPi 1q?1CZJV)lkFf&1C/AHX}-s"QYUZj &3*SQur>((<8y4}w0yRR=D+)l..>tP_}QQ+],.O?> /j PmHvwc{)(hi:wD#ٙK8k*)WV" 2,&켟28$8䟉߽{NyO_AA '!!&[f汰?dF/ojhqbOOIiQay9QPP^AZjg?,YE )Pߕ.+3v[b?u+kRldxPd7+( xz&^w9jllHX^<=Eg_Y]Snbh)%%'if|%g5םe/e<}zf#nƸ6ѣ-[MMRCJZAAK7*J :"\L|f驪_VVRR/]gOj,f.8\o/GA6}p_$XlwwO7FӑM8$RGGAAK+ii9Y;Ȩ̦?}Fi83<5uEE[> ?HWS\ż32L"؈)(l~?ScT O%|3ֵz{ ss\A~>Gg'yy/*G;8JH Wol|AA[*j]݋+)!cV^szWÉڝݿLP($s IDATN$H \I,U @/YqJYr@ekeqsZKtssd==S3K3sS}%E~~fT䪨0~Qkh('=Hx|˷JKKJX`UWupeϺuu]HyŚ566sT,9)::2rڵ(˗y!%$q8|75UWg/]2hi Ǻz{߼vv^99իvzzhk}뭬lx1>YHh`(Do"46%'oټicmGNG'*ϟ޿p!"q7W[S))viLF#yg뒚w ?UV>~铢-N}? pJW?0ȨxYp207^leſ|$U$0`GDH Oxo7Y?1Y榢$77465#w2{m[ &Sp\>WVP ͛7y ''DdaF9عֿm<Fc(2J!wR_]]^?yxs`c(>wtO.mI5u'N46=g=Lǻwbc? &EZr*W*Ouő8r{-Lȴl#ؒSV:yQFƙ\޳ևcfWWu{.FF^LK L5 Ԕۼk22nNZ||M 9}gݙ^1b?nq|5)̼QQũC\ 9(+bU]9YJʠ9HӃ2qSQcN5|3ֵmюŧ`VWWy__MK^^}+*e;7SiˢjzZzzysW |jgmX=Lp>+ =ggcm˓߲7=`d{;'ȼ߇uu_ o$B_G^ZWWRr3'<<8\BgIIuG V(F$$bNIJ>}jGkO)!o{z'G u^"M-U_bd@#jR^~'وTI_AGGI陒lm=\5`+STmWB!11dds}Μ17:ZcUWoҲ5QZ (,wEGA~k-,0JK߳-?65e ;u䵠N||:y55^ywebȺ{9;G:sffIY[BrŊ3Ӯyz.Qs\5dxB ~~Ng LF3,\hh *2k "C#uu6lز3C"ʞ}U9Ձ yǐa0tYE-DZZ:%$ DA@B %Lb"%*(q-DZD@e]vG>>^>YϜ3֙y_** ŌqC}h|KT(=?{_W9VGǷF'ExċtwHh989{v9ٱfժUܮEj'ɴn)&B)QDKVV[ghx09!!4E@`\"h/[LAQ[chpݻs[[׭sr̀ z= xW)*퓒z力ȈGi)0>|B$r=NDxҩa0J\ae뎝˖ps0}--ONu9Omޱqq[a sO ơ1a0"Oe8[b"YYC ΅46*)^~VX*AYf՘C6rsff9rR@J:'a[/XYY[mtzPm,4,,.˹J~\¼@-M4:==萛[`@vNO{hhDE$$]]==AJ^LLZBPDzٳ۶;vFvN雖wGL`<~WU\ѐR71T 3_=C22,o_%$RI?/7oiiWcײmݲnVoG!SQjagwqwR={"=Eo+==,,6?{hppQBEEMCQcX{jcw?~B TUmmlvsX@_>g$'S@"#/_3)9&`ľ/Npw߳ ||._+l?BPaQ%<Ȩd'k h9-J Cc΍7̥- -5 # M}h2aql GG~޳CC Jv\xjڳs/BhaQZZGxx$$PC-8Ə;>|mo{1W@IWPk`PZ7[ڎ`׮N2H$NC'Hz7AHHKWKs:/^kWCCcb WSW.ATLJkiB_I>>XZڹ[ PLL ;vP}Û2'>c# ff yѣĤzYVsoo>4F E$RNv+QQ7cϞu-jk88yxzzSWRL=Iceъ'qi;U;';;N @ ZZ66~~ %Z66{:[Z;vBTԫs MښzD腲R_֮oc͛O6Է63 :aW.G觥nب.$@hmbb߿C"~=DĹ.OBRLq<#K֮_JGVVP7kJ迕 PҖa"gp vuAqx<;D$ /PR"dhi6/F3_s2ۼΝ4o)v +=:yyeiGm98?w;@@GPS;E"XƝ@ =r ^^ϸ[;wjϭLB",.=nKAqqEy}TQa`FWVfgLLP*Fx ?2WWwc~{p֕Cc o0_g6R ^@*(xvHu۷P1WffMM Iё }`l#Y~u2}ϰ$*0K)-΂!iiXX))o8Io䷕O` l08 53 EIEGDPto{JJ.)iu5M M u55 ~'>3rrsGϾPbc31TT@32OxuEf Tm~892M$EDntZgE";:{TDD|WVDMtܰddVO޽w%|nbvv_ܼՍCe c>4CO1GAbeͪ?S79:::H$ZZv6_4612ûȌ"jjߔ}*((*uDfkx1 aGhg UaQg}F)+* J, \Jzz,Ц֘۷'.69hk\⯿^`޽fNKKx߻/[GMKҥw]vsLMM l=:%0 ,=f&=2z{ttllPϣZ=` tT S?7|32|7m۵xzHODQ CHK  ݻCC}}{zwވʮZ`TL ̓Y,puOJzvB?ݿ_U΂t·`\H-jjejjt99Ifpŋ̌OllK)ȏDžTTPJ$Ud1{Om̏g*U FDȦz`Yi_GG}-zs0'ø?tu~ȏ1AA4v,vhD$lK,E e^\\RBApԲ#w_/(ܒp<ڍd76AT7B\\yy*0}[,tUTdeEEBttPrB**II=][=GɎTUUTOcz{UT%)`E7oVb).s;=MKK[G?kfL#|WEC-'K9@h`?$R__yYYهv!2k9p6VVV ҫWOT|8\kkSD"--;'eBTdٲ+$+W^_ت길rr+(NY̙[Lg1LLo+G޿|y6-܎YYUUkeet ;;;u-UU~~2|PNMNN ,1p]Mu&h,0z^l ~5))4(u%_WY-00@v[z{#"%'ŕ?* Px%DyyA]]X{ɓc+#/E?j}򤷗IIIEULtzaPjjII!O32zu4x_%fjb{vxF#{UV(u Иz@PНۃK(%)#)(D$K{~BP:8ZXnzl1{_oz̗g_ =g0PP?,#Ⱦ^,q,''MMuCX>=22B|\ ƢBN;gGIɩ+.jjyy7W_+RSyE^9yի׭ʮ 쪭))-*B+~`}IݻW|j۲i=]::8b`<}* srl55yq%od#kŋ < TU54e儅q-%wSSR޽URZc.# {#<|АBc㼘p8`wwU%>_ݝa֚j{{U* pɉ._jh~萉1+ ک6h4~ufoM:dԉ_gCzm^.1MaJK$GF^r~΀@sAg^o:̙&Ok|׮-.zBAzP{[]]qaԔ 2rkgg#BChi$$Z=/[Hi׉89g"=r ?nyzi PZ?wBLLK]'O}`mIP#ccM))zPr I,0eiyGt&'',vG'"HdۧڈDA!`xx$%tu/&kF_9Py9Ca0*jnnII9Ỵ?BUŰu<<>XbYI5+755fcIIFƍqQ ۼy{p.~@|wuE[[ao?Ģce!7job_XNgAp~~]]=ENeg浶::sRS5[b%77oٷw$eggEyNQQ1ʛ̷Y@xzR6or: %vv/[[QPceBoxS pچ=q% k[WW}{Ο&vlؠG"}l.-}UPQAEmhme)%A/]JJȔ_lcPF' H NȞ 6=oW@a<;ˏSII3 ,44#Ğn 6Xnp`a}W1 fc#Xil̛79C!P||tt$➈knFiHDuu7 ׏!=-+ɓΡ!**vBBrLwv6])#3uPCo_OUܣGCCϞ719~`|J~sÜ(==//?wR֯ SR^ݱȑ'⢢D 89EEMLvﶳ?|wJx<7@JJlqq--h4+)e?u֐ )?z)I_+gς i;v\v1NPI[;0 1!6VH璓#"''20,\(-zaaT(gLlG.\hUOohaNDD`X IDX^r/}|VL%bYyxsB·[}ll!RssҢSS?F))тzzntqYm&/e<<+odar)22%МჃ(A_DDAa77:-3h[\QN>~";{pu"EECk׶n]n≌ٝak,Hɱqw~Z&/ѽ('…"RR{PDקMP^wUi9II F a[,נ4}MrobcKMӘ]]7n'oblpnl+Ņs.8<:o, sJ>c"%޺ 0Yn^Dd!h}Wanjsryo쏥( kp# IDATvRFۗ.%%@ )tu7oea fjjI g پرmNۻW]iv5`0?Z|>!"Juwta8葈Ȉ=rCTTYy2;;֭  羼ИsM[dl4 TTbb6aa)w\u+7u’>~|ǥέ_pe8|MHHRӥK.޹}萻{(*@JJ[nh-'(..q_45v` iiן8yDf.áޘ6]o89菎6g'zzVVnn ω~=2 mq}7!g +6~!VVN._?M kk]]ŋ>*x4}|ʴ/,X~6 u NN^cB^<_:ݻޒ`3,;`_GMS9 zVazV{:v= yWHe}o+A_{~;@{~;@{~; @FFGGYّc `p?3P!H35ս{@t{[pT<EGF7#H"3:mHb .&))/elv[PЭ[%]]g!膆ܼ+Wqt\cnl(++'ehzSz{IINFRRAAS]E>-/VS[UU;?}/P]]Z2"qB" VU%޻TIY[/'wtpJ@ʕzzɨ.]jqqE?3 ˗w_BWWYYNN^^]]_͚MKNH5))'O8:ik++ZYFGx@"$%8KKM qqi:;t?##=4JLrv^x+ _Pݷ97=f`}̫WN[X޽THQc+VߗOXG;SPmm)7IHtHacKJK= Hk|YN쬐.VWoǺu0 77?yoߦM66+W()-^1p\\q>ZMm$CQٸq*]]99(&z [wʾe̮7fM۝_wXnbvFgk`LLK v 9(-@H8\OOSSYÜؘ>|ɓ!!LyxVUEF۟?*#ceeonc+"NIvw}jl|[EI񇦁AJJlCeׇƒk׮{:*Ν@ uz?=C]e">׽zuի;+ʇ\!{z] ̙ܵa 'DGq~l߲eFvv+M88osތqСNee?߈yg ͸ٙs㳷ܽm$̌Ȁ',6)):jz!G𻪈Wg| &beke'\ ?}OPgdvv 0ΎQW]wqiL"O?7-K_VbpVVq1jj0Swdp8<bL$~ ر'rsI$F߻'Oxu EV sN΃"$.&60PW0}"q;w5>%%oٲf#MMW٭2stbd(Ow5 `nߎ** Ϥ9Ғk睔Nae&k{#mUUŏ ᛒr'9';PtV”lYl|y =ML|a%Ha Id(yx(*QCJZ]MSCSUKSOw5hZZ_udTTQ2e Z)zxp21wEE -{u %ZKW02۶l玤ī[YXL5HI!! -SUet)..-~ŖͿMHqqr3dat?0?׶|ot jwllLӿ=>7"wPT=JVTd`stqx8K۷x.Ygs$SRR]FnMmXut3lܽ+=ݻ@oEen3-' .TQ{ {WuS'O ߿jbE=Z[s崙qq._~-mmw P@wN=ùt##5QQe+/Y~_]zFkGǠ MO \w4aɓII2+WXZnqeD֐a'%x}}쯑-3C7fM۝/`~HH$"޳ H(H8|nQP~ ^RR\x=s99 Vkh>444*JJQQe99 z0FW8r8%[D&3c`,, Jp0RGd$egG d&w3ďYYwS_&546(ȏscddTVvu謩@TWgȬdz?.*NONacY@e~羾;)FthIHI9;'wvv$&:orIJOW߱XB;Cx<ױϤX?1+~z[.N5U%FԴ55PCLL%??%ں"0XoOmmCC3o3<*-cfZ{0`?_3 M'O^ spt{X8,`a48/h>/syJʆBB!M{oƥmh"a Ľ se.wt444~\8H}}ݳy##MMEE(ڵ[; S%%7o驫/^,#[d2;{iMMftԔ06/[ە+55MLl9u*3{ f.ێfM50]/\zzʊ&֭xɲm,X (67O=ʫ髪c^ 䤥{z?r_Y2>lk7X'<6D mIqUQLLEUA~|e?,%E5E(`+++ǫ0 ?G$ħ߇z:uDBs #'O?ӧiiv&!wK~+τC=y.);eh6ѣ֮54TSSPrZzXbbdZZ3>901Zv݊ȼ|y׮W;vv;wDǔpmmϟGDz5$ TU--|#^Hu/K,Y2QO ^_o42RSWRZdJ#Gcky>Y,SΐyGDE}֬2A 54ܿ ʧ,/t5..&&UV KY,%$55{t"B"uwIqߤrؚ5۳8ӧաu`҃=ܭ onqdVvc#;; w@hJ..cCQKHU:'77{-BcHK?y:Q>[ ptt,llSjx8'~e֘N.9 mlM_/,hT=;좟JJrrh26),뫭Fel=X@PH"YS AȪ@ Q7 WUUVRU13.Skwڸ159J>seRVY|2u5aaF(**~_\Ywg#oVT01 bo>t*yymn]HUg66 2-IWlںLHHJڶEZG m3]=Z.=<)*-!CMu} ?{TvEDlܸamm.{0߻}eIݷn8o 9.B{Gr];w45ںm jmy͋ϟwu;wӝșp T֖SRb[Zvt,)#C?+VMe+>5]RXblMDGyQQϟvt{Yd8ZM]P'G9snz(ٚ-?E؊K.\hoWT^}u TܑH6v&^8w [&'[hwϬ`9??Ak&}vY쬫ї/ؔ4z+*(+Z7)1=-+ hk/PwǙQ0]' 98췵 orz 3NO;vx2"!<]k ɓ!!>뻺B//LLD\[Կ (_w8 HCocf^ehDɆnCίx|mmNVnLtKm_Ѵrl>OmR|=?ZH$""Kdd._~K4X7=~x ď/_TU-ՋOسaSlm22qh f;z$f;9朆XHVVEpÆs!JJׯ_,.7uVX*AYf՘C6rsff9r6BJ:'a[/XYY[mtzPm,4,,. 88llbUV~EMMeeaa^^ll`&t-0 ;grFTDBR3"}mǎݸSeh=~20'_U--׬u vvc(pQq>iQP~7DI)#c\NHmQaYXB"޾}ڊv5&(z-;{IiX-mJHvb0.{v8p'ٳ//\^*2++qqHIIr(HXfEz󳳠]qׅLL&&f-.yPWWRb`|BIJ+SP_WHky<Ȩd'뻒 h9-J C 0tS'=cgٻABb53kAKC@K }}CCSǣa0Ff&&FƱU{|hHAbʺ&cs9r!(--FcGrr<<Lde``ph@DwGzG#>oɽ++(ƊŎյMM}0x- AmZjkWY'Gi$fa$BM=9 $ic童n/a롡11Eр`TLJkiB_Ɇ׃ SS_߂X,-mP(& TU;tMSRbrr~~_33 QbbbG^,+olLQ")'u[VΨk6 IDAT蛱dZ̑# 44֬qp\o ?{"" GI!p`}S3Slqrda0P_ ec痐Xecg*/ձc.DE*07 @"[[SROPV*" ZV@` 7o>}P,І 7_e]VvbrOx88HVh~}ĮOsig4{̎Ҥ%&{zpxhoPOoW4F% ׏%;D H$--3ZڟќFF\mn,D 6os'-[Jj~ hMWWwD+W~| 130Սu_T3[V~KHUddeww[zH ?T}+OgZ_J9bqǏ?#F}##oCyGFwr߂knvqqq^pWCbh4/_zxڹSC}7{JK 6yyE_{_=* NK@b?}jibb9t6mnrtvutHl?2JPDJn"3Z:@}Së8^[M[{0XSӛ(u`rrWE)$*X^Fze::oeJI^M+K ݻa6봴4{|utߴll/]|7G \##SS& 5…n,+++`0 }*c_1-.z+vb<}FU%v]bXi)a~ Wss?֞I਷ ڡJG7g̊/[FQa`0?7+r ߅ԗߌj1::hUU?W]آ x7de7\=)ݻ=YPb-822D[,?i{lܮ} ($CFITf[uv$%?n/RR33Z?-]jh ?&Rwwv*o1מ̇'*U FDȦz`Yi_GG}-zs9O@qlSS#c}]ՃhX,I$ؼA e^\\RBAp:; 6$$vz7YuP2Ecc^ 8L_??+K=]YYQQx*CRROv#..r##UUu=bUiI XQa|͛oǶ0ms;=MKK[G?kfL#t|WEC-';סch`?P򲲲BdFr,,lPW2{.[Mlٮ8zdϞظnbSS s{pPUuxXcd" SS諒?gd\\zjSa~[kMW)/ WT$'^|AZkC&Ƭ?7$H:hڠ0FtvBDPbbhtmSӈaKBwH4cYYv[qy(U{x(92m_, 775ѓᥦB7}x:99*eent'@_gCzm^.1MaJK$GF^r~2RY|;)99` ärS{EųO&'U8uLdǷlV+XwhMNNX-NzKEȶO/%&B"=6 Ce-,88=_|͛+o}1E@`csi髂 *jCo+K))(7de@yj㱂=L@h _^~tJJ ga!tc0w軸B_a0Kcc޼z㣣#D\s3MOF"˿L~ iYODD$'vv QQ/]ezh|J毃xzz=zl^t &Vs{3v>8gcSRdo=4*T/AEo#C;榥EG67FSRC5ܼL^?>yxLW߼,/RddJݻ9Q((ZSootZf".6V/&&*7WhhTde]HQ 0ڵ[׭[x"jgHrC7i!m=|jS'\ -S_\lbl-Y5>޿:sΝ+{!ppHHhk[XYWՄ]P,1_rʁ+,,"Ņs5W:o, jJ hKˀ}ޝCն735{E%"[}ɾd)[WҞJ^6dI*lIQDB%iAInjߧEKw>wyq9yga`xܽib/SuF8񱱥Y…1Ӆ͗>r1eޜ9Cu5#Z9٢o3};74l} 9}OAQNn]@bbzxxDqvl|9x_k+{z#c]YXF;޽--FFuܹ Fyq#r- 7ص ڳ;:&:j|rɉ]@eQQ:u" 0hZtLܩǏw_>qvO_aG_ݲEN+ ڄƝ>˗%'~юT^'qҜ3g9cyhhr2 KDDppDxŝ;Ž#= llgiiāt_Վ Jc*%&9{Ƌ*MnZ[x粱qqYtׯonF}ܻ0ݢOi)jKJZda SkơNK/NItOD&0UV66?{qds [FWw}@GǺuW -_@/b?v 77ۑff+AOÇ%%eeعs/憎{SZp-- NQyV--01x3g_JA/<ǎ'_ }jhwj[۫W p!4d  VWxx=w,<{sbwyEI9gۜ@wRZZ ,-׮奤ln.+~=rTTԔqZ[SSfle8XFNf7{ z{VDF0DFC=c% s|( EM)*LE[UMETg̴rp=y0e[QQ!#E/>vqjKOtwXbo?wPS26\l]@Syy>>Jp),"/ uu -,""22_gh?7Ȟn {qmCJI.,`L P~qq7CwҢ23; y"KSCOWCcƌN}-32=]++?Eg;mURLl3g""<dҥQc0^**gfڰJPRrq()rq YXׯ.]eb2skiuŐ!!۶!k#w2Vpsz}ҁ_WtOZ^%((%CC3_ ԸL;u{Tvԯc}k6mA $'mj[YXZEGI%k IDAT]/,|Prׯ=5X)djv'+ckvxSG$RH$QP,T߸C=={~# 9NZa<#^<Y11"=g͢Fh..=]8WuuoN(jy%$XY)(z:{p7N`tEƻwee?hf&(4\q?beG{{:q}Ff&1C+0Al'b^JHTVvvqs6F\\UT1xg{Rc#.'K[[jGrBBJJ[6wwWT10zQQW ---.\puzaaCW¤~ >(KJLIeg52fe?Tj"G|ss2Wqs(*))" e@w:FjjPϟ~ԯtvGG227,2_6c3ֿ^08\_\(H |!cɯra! eppSQ"]$o&t.saṄKuuVR$4e3D>տ``30 :3+,lFWss==d]9eeK˕+V׊kZ^~|P8ޟ]`匆XG% WC]H]]VY `Rrr_cNPۼrF턄mې55dd - /=5Y'fתkq R߄Wh4 11&O=z, +>xQpO[GKi==UeDAAyiY2 S_V>~dp-+/.zPVSPcB^IV\~"W¹7nGa&&lll&"+*J#G^c~,Ҟ= {^srjUU>`hyUׯ?s62[W^ֆ55DGox1R#HI+(hk[YEE߹;T@ <dP<~9c>/O++==EE))YY5E\wθ߶'`*DjoQDK.[8d$Tww]]VVpێkj*vr7+-mk{G^LL7S}1L|'H$ Ent>M @_/UqZn11ƀ2`Kzkt-K-64_@Iy<)*+.*/xxfH$~RWus)#;oyhGt=}|ѣMMrrn+Vl=Ǘ/EGGG^meU^aqq.BBS!sl!%eu ۶;9SQ{{ܹGlm#RSw:șNdφǕu/޽] v߮|9vm6c㊊ȥlh\\lʊ^N?\x^bb-C 47}؄#c+fΜ>g 3}3gRQӷ-ȓ޽{񬾾={ ӧ)GG>x{jj^^IIML 4G{{(1Clt3gҲpq!?I$JJi4(53;ׇOcgD ioXgl5F_QqSDDK صwgW׋E78oyy{F75ޒ?p]=07_;ynD11HK[X::zzruzF,ذYr֖=,2"fZ;XVDD }vNW:$%WYFdľ7o s{e{WWMu^'ؔyOFNNȘgf̌m; ^}>Jcut99o zzĞڱ` 8sODG::FEFF7DEEbCC;:|xxF־}Z,,DDҿ^wvV֕n.-[ŐO6MMUWONr<˓"b2Zɍ=Ϟ\{AMuj)ɑh"kjնcPbF" (\Ec#@' ՝O߻3QQ/ =fHV=yX=-==Ü˖&]27gy3ֿ tHtOd]o;yQD江?ySYcǙwRUlm֞?.!q2ر1ɹ'"ntDĮ\\}Vvvqc*=bd@#j~_]}-4@?$IRb4[ #Srw찶`XĪ?{5_HLBYbwSK̿?FG| >}_}9-#?QZ (+qA9GA~׮A+WZX vR++i,/뇿FDT>\rFX3@pA5%tkO O<>=`tr =|䈿竦@칮=xWפcf|$$)(sՂw-svu},q%رOOK?IOt.k׵dHx\X0:"44c22bb.⒖6331?tcjjy('}::]Gّ3yQd3 uѣ'NHImܘu%(zrPDƷN{ldw""9e n,,KٳϹum[ >=Pll Hc(w+Ѐ.6QPNF;b0<3/ st|5\m0ȵS[g7HMKG7.c\sn?%?r$нVGE}}"w"'85D3/ʵH$c>12mJbڵx,{|o/?y۷ZI7:.ZpMvNp0J'YH&1٩i ._~$^Vvk3'N : EOolAsB[rrN饫;}w9هzyZ[^̓ƴӧ/_P(FFAA1a$ҭZwٳy}Ѿ~8==ʊnܿ+(YY/3@i E,xx:{ݻ[Sx(ZfDBHQU-DI)+ykUU!S132N-(gٲIIޅ==n7JImߞvۙ-殮Zma%44tTf^,ՓG~uN(1TT#grv9s}W![/vsݹ3.D@[g~~#_e'k5#1tݺYZ)XZ.1jT55# ҏyQ_ ugqpPPtuwߛMHHp>U<چu7KKq8Y-+pG.$B_ȫW?77^_:MLeܹ $UU把pp"tt,-cO>s̙.dd޽[^~VRRP<`UUY&449933:YPƍcJ|}X[[Ss#8|SӇX,=MCXXfRP߻we63g_MI),Jyӧ.@KKMMQQNhGx< JJ+WEEFGߨKEUTDN$|Zik9;q읻h_+Db{{ GMƎ!3c: с69vM.&@g WXXMfS6nRݼyɓwDwi!;^P@`갈 KKq1NN66!!}9xŬ'll99<<5de $=IILwݻ}DǏMM͍>*3xxYSk; Ɗ|7cƏ/-qsE~iUmV;Ekkg̰yڱ䄛HT`Mv-$,ll`722[,+3C\mm߷`8܃HII|GRRK+hG-<ꋉʪ+:}}mm;;#~.wXWU_p͛i'U@tw?|xݻܞ9{ŁC)+ Otƌs00HՏ=yڟaB6s6mȌCڠ斍}\Oi?S6U|Çy(J!!fz:V6jjZ&f&FX DkSRa (4 -4**jJJ**FZN.oܜbJ**J¼[ٲEAH@jmm~ï8@{tWWv?n4~ttn()Z?!]D"it2͛ssID%'MNLrƍ̍dXćGEim11%%ŗ.GFmؠE =5IC3Xlc7U տxygA䡢73F[["j=zX1SZZFfp_oC4uuO[;IIQyeekϻ&`bb||躺{wK ]]]*< H4]TDLb të߿ +saޞue횅d**ݽix2UUX~ "SUxtgpIOBz5z\cT@ ` ^}0Q)x/d~#ėIr#y>ZZY[DkӉ>"sSh^^#29zzZZ5g4655X07-ʪ쾚]TU>Q?ztJnޛ׳f{%'?}kQm< SY,:_{RƦc7o ]-.ETvԷhidtZZ/^l۷s5kiIK }H 97omF^Fk22ֿ t~oC&VTTʆ=?|xsQ<׿W[5д_`;lyVE~}3M"W$jҷUA 榱[ 9s  ߲;y?ٚYLo.77E}kYh?>kZ[ij/X0o2x$M! '{vI,뫮|b/0FoFF)Iy1 ԃs*&2)+KYWɮPHϱ_}& kDrc##|DgO>(~ý{wnàEDG Œ'skٳW]^B"`]n 'Km888X.=?:'{%x \\?99W F_cIJ((1*x!n͇o&6r1j|,F_V05 3\H:اtl>m: IcԦ?~LGFHͭxbw9ٹy9W񙘚ϟ ;KHkۋfdVVɸ|bñm'pWssg%ht D)(*+ ޾vQ(ZZffi44}ė/k_ԍt䴪MC6v-hͷn[sDHŒٳUc;jMOv<=7nOxgK`u۷^TPrwWSFEEEe3^˷j.gj39V,44Lϟz]=X)(^B>ʶNNFiXY陙%pq 54<֍1o|}9}of3%%<ZƍbWxx/y05%&t\u\/3glm$wsݴiܜ+ΜYਡ9g ]j'`8am:ːڣVIM"qA )*@yx:>+6qrljwBbxą&"oaȤ7{{jj#[XlSɁFϚe_+sVx`ZD,gv=yr1Bcz#G~N^N$~z b¹TTJnK8~<.[uCכ6v6_P=8x[0NH{gQQ @#"s$mlFih嵴X1ߕnnx*ff2g1065>xsɒeMbGKyXl)97mn04,d| {Կ; bEӧge;u-k̗PT>;{ɇ/'Ulikw!oo䤏$W~A뗢P4ӧH,5@G͞8W =5 Ww-]zdR J ww{̤/gL =~{￸`ںkk'%ox􈷷6`rU^ޫE&#{le2ѷB= aS 2dk'4"LhV6:>֞T瓧vh#P66RZqut|ކa` Dܛ7]]tMM$"uwׄ n۾f-SfFnNQQZZttJw--44fϝ+dDWWE#]?ԀUWo o={;|Z:ߧC7W챷?p>4}L^^AAY9+#GS45C{jj}v߄'w`͓10ptܰξ}σ30psOёo[Z03ED44֬;qbeKiGw_cm}VЎ#wn>fg¢BR|\>esJJg'Ӝ9bJJ^qqǎ:.eg:ID> )1Y殩}5?::p~))={/\73~ԾQQ^^nIINEljڵ./o`S7n%/6`ԋ 22bc߼yOLLSssII!3f;:MJ*2"&&-ҥcFEuvRQ!+ HK[Z8x.@Hp$) 2R^>`m\\ǎrb:;ϗ <}ze$% & Ӧ-\̙^cbO$%w fYVJw-7$E7 x(4!JnGF.6m1ܩnM<4}JMڼ)5),ZO6nLVm@I/ 0c&7wOS!FjqqxCCڲ9-D?_Uj- ϟ{6bX‘at Շ_gzrt4S_ڛqqA;.\>]HHZ|#SV͙3T'3R7k,\lII-*h0n6gpqc{Cömaa۷-_(<ߐg$&G:w.a˗RP01M>o>2ʕetTczzʺZmd4\}͝hd w;9"W̼P}]Ш=c6'g> uu/G8kiΙ3t2=ssd=ԋ;wzyGzfUWߏL1[x2P #6}:T_KLRWdP=='%^'" ނk*|V=8GCr֬]ѱnՂhk?9_ dz/ŋ#y/߫@?v䰙J(=aIIYY/vK幹A"\KKqST޺UK:L$}WRddde O禣y3( ÜS>''=Ds&;;tX}d{\J --X\^@`eCkPVvu9 +3܆D zy9= -SJ9- @Y0:(RۣcP"ȖUP&  L9}L9}L9}L9}L9}L9}L9}L9}L9P ;Ç{겮<~gPRQݾi#'{rU^>KGRY'3K_H"c{w*4HXXB""RRAAϗ?@,$RWW]]ȍ̗뫪,X !!')`))?Hþ;%v%]xg?"|]FF6K̪no2zz8qb:{{cc 99 ))%%mmssOϽ{SR*+F{|ڴNNffrr ^^qg ?>x{+}hke2䋉IH((#5?_r͛ޡ ɮQuu__M=eK9zz=pBCS_KGZ=(ۻW[[L8'3@2vDbSSZ?(* oph4+-ݳWKKL#ms;#x*!A.Zrٚ->^S'#G)c|}8*zOOE.21qr ܖPVc?Fv'#yy7jhKH }/_eѣ38C"p>54TT\O;cիw\jj2cbcb<<}N\V`;55X__Uyvy٫NjjjwGR_՗gg>}:n[]qqm@e%FƑ_ƍG.wSSOXT;992rȻ?Hoh@qqZ>{m[x t`Z[ K8{fN犊Ɵ;/)AG76oM{+6l5CUUNv\ɘ[kjؓs>vww?t+AkkW75KX?]Jc6oVVbfHnl=oMp@#c.? } hB󶶲hUQS)ș.[䌔<%egGˇw<VFƝ*ʼm 7 #Ha"E,coAAk+"ɽ_,{Ɔtwt<wŋ^ Mg5)>>{v74XX,^lggjV8򩸳g󞞋ϸϛF(o_oh`iigv7//%esSuuY֤팍;xڊz|A ]+/*㕔ml NNx2ѷ 0EB޾jn"p'PϘAIEp}߃BQSss))((SQVUEScb53bO 9yA֭rTTHK\!('l-ۏ)(TW23[|Tl^ۏݐCSXD^NAAA3*(01Z[[XDD$$ddxaiT 7Ѥ ~nn=AApaa >]\X|,2FLMoz{'^5EGefwhkr)|fE,,ƌ[6%&fd>{nkWx"͛ᕕ<SͽP/&F%KPPJ8FFjj\܎f:uNNAAH.0ϟǝXiӥ  $$9ynS>Ͼ*:zР~~a󅒓$$F3{8ԋ!BBm35C-k"1Lm,md<`* D D"bP> 7>|g~Q}}$RQ$~2'WIK8;,WP67~~BCË/8&FdY(ťkXYۉAM=o++EOwWgƩNx 0;SNVVi)Y9~~4zJa[ۧmm$ jfC=x8804_^JHTVvvqs,'⪢dge>?rlw7=OW͛'"88߿kŒw\[[jh|%-+*|=A_TBbKK˧ \]D^XǕ /bU@zȁ}{Kn]i1'zd@D=unnV*n.Eu5=%%ZZaL0[\N܈WMM]c sccSSw؏΢'VLc#fVVYOϐ20&GF!2o6c3ֿ^08\_\(H |!cɯra!f98ة(.IH7g: \BWbbb4Quu::E C O36mtq57SQA֕SVѱ\ȑk_xHU^~|P8ޟ]`匆0|ކW.Z.++#b`tρ9/_|ۿ͗3Jn'$lۆu)''#l`l_xxVy:ܙ5}bF o_~ MxF͑cb)+Hѣ|"Wu4SYU^V]MAW}%+0>e'O׌H$,HD3e{[[KH ?-uhF! $+.X^ANX+܍7a666fEB %{y~'֯wp06ƕpMM%%689-^R V~Qwu_/Y"&6j==ϟ_طJOOQQJJVVMm"7ݻ3.x:ۘ= ͛fVs3PCVrvvQU5>F{Jnn}]qq**ffUe]=yjꚚ^ ?H?_LuwwFLLAaK2\3LL,```ceg\8t"-+Ͽq'^^CC% ל6w>kj*vr7+-mk{edVbq-9+^+|kpێXx`H;D"a0(rǏ3EnJEz8:UWWWpӘ% 4V]\\]#nY0-E_lfJi;"_TW*-%%$,,ƆwM𻷥R##W\LJJN^#&G |ࡏU\vᣥDjk^CzdMښvJ~!9s\#}pq!?I$JJi4(53;13h qڴ2\ݵܒ?p]=07_;ynD11HK[X::zzruzF,ذY"֖w ,2"fkJ_ήϋn$LJj!b:}ȑݻryg\be<&}z{=O[T\/2DL؏1"j0\dUWuKGgVq1dQi3=;ٲd_KV٣BJGJ(R!DB!IJH1c"{^5ssϽXHY σN.g7ZL l}DXcdzkjj{z011)i1SQ,\()@$kjh@0CC]]mlڰe3/򺪼n< (+fLLpzz^.[L~4fnMY}owmO$B߫}}?|7ahhwCc++s*/qƨw\.'w):4~22G䔓31ݰqv;[]~B&箆/_A{oퟪ oH&ǏM 3%/ur t:4z4Jسf#11kV@| t IDAT_L|],* }}e(bTU0j:?fS9~+u;$$"򕘘̰0{;A@Wu<=s>O26b`I_G ۇG%/70@hhZXD\8⢭ei2B5^^v11#Ip JIr 42[b^[ ̬!Hp8;vO u6b}PEI9@PSRQQX,f4c=`H1˷iiiz 5ճgxx'$l"#3}@oO?D"$*=qpH"Y73*~vW(Ѱ 9}挗.֔9>x,?=~prďO@]t|}7mSpℕevNp0 bqx Pkbpni deUT 7n<;: C%h_/*|(''&.ܭ9٧Nl^g}{rX` !deiu֯sw;x09Y<,,!豥KvZZUU}CmmUUIIaa|x//˗M#Q y|pDקϟ|vR`bbB$ңO{x9rJ^~˖#zD`0/J{WU37_ѐP71(}vxg&m" ʯ|()ed-)^~QRjR,!J{~%~-;{YyX6 7g!SYdf滻DAaige \:2r ϔhPQQPbA,#?wzz5UU,muv13[bjgbf ^N$&ݧDzu|DD^~ODEGDOGA1@<;{66.'6a3o$WzGag@|wɳU\\l;׬=ԗ?|PR)]fX;()PQFuҰRS]߸av\SĞc\\|w߻' u?+WwШ-7շogg74Pp5gϞ=񼤤N`XUȦ`.ٱ&1Ro8;=v$$&?V4t 0=00'G `LL#sm<; =Xdfj,ge gnMG:̶r.EffdDmmn=-'EEMWG\\q0-55?Dv1޾}K~Ax 4 $;S7S 3ص+:r]zffQӧee%%3\0, $aiek'&w^hhllɋUMښg.ec:>a_CTUml9x’+NJJQѨkyݸv7331[x"e%KS#@"d<"/DE54D?}}݁qW> I1qF!be'e?Y#j#E wC hίtuPoD3d`6 >~=+ :brA5م",,l xu>@`t"jDew>j&!htUU^^AA}=iP*Ԩ?34Tv~hQ;[둿7ILlh ^W67NԹR~5г^އn9qjNuZQ!/L]44TS5T̕y$ϰ-0 @enY~w2Ɍ~g-ֿ \R\ZEHпkSR^Wݿ% LLL4L(%BSspя))8A7uE.gaٮ=̗,?utB=ҊuB4:;%?e944PHPȑH$oD]ܻ77DTU۳ĉ۷ݫ# ǧa1 Ǐ<ȸy!rn=1//1#kRiiXǏ-Uw rpg՟Iɫ::H$ZZv6PB HI]]MdKu/_xx.TT𽊦Z^kjzYVYk76>{Zs1E_V( J+HV@!QH$U;]VR46eeZccSS.61nxkkX>`޼ Tmm/ϛ7zofzyjkCijZZEDTM#10!P1܏?&GbTWa0-mw+mm;w̠o׬IImnTQ00KJNo+uMEwul/ok 䒜Mݘ{CTVځ?44Dsk0CC{|{F]Ԯ?0$dKskugh=]gg~~/.NKnƦghPa$=.䕠R$]ݿM2](saM=BV(Ԁ(hCt|`4z7ϝapjj$[ UOκ~4v,v`D~H9/]kH_so0KKJ[Z((\zBPbΝ6[]5d<ݻz( TFPݻ[Ypm>>uuTTdeEEBttPɈB**II]++߽9: UWWV71 *Ғ%WVbldHjl`3i}&vtԓYMJ伩TUԒJ==XxO󪢢]^h_+++Tkjv'"ag2!_ ^"1)!#BDblEMmlR^^[+jk Ԡff^kvҰT|&5ueM%%O=f #ӧG݂>QӘF \cÕão/-%p87Ee%32`ԌLTTCķok'3ZXC$~TXQǏ7oѝ^*58;[Yfg>PU-Xlo89-uk`R2BDbiIz̷o'^jᐅ>8pS{M}4fR sc=ҵFEEG2EcY((#n!dO7AOBK(/%"~SS}oz7zpڜ!|K PGDQ?_^c>>]]=}uua!>~.nFhŻw/JKJ89#l%%'/}.MOpxU+"#-,xy'@"pj_BmYYFF rrNա1Q1!!윓'?.ceﯭ-*LPP;w$07= 4#=-ZZ%kd!T~7 + 33ówkkQR11͛lmtt͇>4+={6131vqQUKOtu۴ͭf e~`ees#ܷfDgg]t/)QH !&&+ϏF._9ZDO_QILl|^>V6$nPQsZB|A!%j3g]]UG1Ho4s66M6ؘkJIRS?rҵ_}v8o-+NDd_Mb=16u07R.^rq|Gnf=aXXu|A.njj@󇲲+Wޥ >ub͉iw o9rTs/ϸ>kזZ|UYY)y0m%w2o5603ȭY59kl9-mpPW?8*mf)pٚWnqvlgnfk',D}|zbx6"QPHH2o,@s缽߿'K>;v]ne%,}h`~,!Fy\즦FruttuH8WPjkkgSQ-R]j2n[^ݷ{II*WyW._T^- ϵ2[`*gNruJNYA{ɠ^*(|{( FE-))'+ @ <>VYn!' ^+Wik/Tce@m|YaVVRRv۷ztaѣ;XGxyĔϜaఛ\;pҁ99'ɦMw[=OGחhBBKKg'@01JJx<b=rCB{*EJ{ݺG y;ì' ;zLJJTԾ)) KKƆݴQY[7*|mUۑ/_褫;0p'?*J<$"9_ZBDj{>4T*2!)PĶ6yy#c RQ66th}#fzAAffttzzsOh4%%;;>WWTPbK^eaVPqbZZFFhh~ ʠ/"pZ'&ۙM&z TQz۩)G.Xhhfa!/?r5`0^^S-]_RSSlrK '$$%t}V339Y99uv5+K %%>!/ ._ʊF89Z:hF\MB"g`Dysz ܸq!r޴4c~~]Fhji2ZR--{9qpBž=jfQ~y֭;\\KLStuϞR贶nh v +|88DEMMw찰 1w.ٰ&% .Ƽz5\Ӱsn۠c#~>;|7ʿolĬ,$%n܈v’?|l*AA99--׈glӝ?l2˳f5TC)""88"F..a +<))--+k=],9 >) ,lƍ l6;wshRrυw;}hkAYYOb/T޻eȩdA/~Ƿuu(M޼FWPW33d``a_%%n*~jUʍ OOI  ? W`_ÇM'sdWug7b``e=szJw70z@}H)RYyޢU`,`=}pq=}pq=H0O ;Б[18jTH*~Hu/O}x>/bQD&桡ed"ID"qzg'^ YDBB;$%45׮uv vga^H$4__[k55ee䔕55 WsDJJEEw74HJ.\alfsPP_E|].Yb[սO`yw&?+$Ruur=˗+)ki_d.<ի[_sv^n2]]UUy2zz+V88ߟ𢴣c45ݽwΝ66K(+)(^y#))==S)_6- //[ە+UU ׭sq.~q=ƘLT ۷yZuuɗSU26}']{\<88~|=A^~ 9o߃S_ܜ{0OO4356θdCC/Jח^4tU3emmi[.Z$!?4TRrOSϧOIrr%UkjKZ538|AdԾ}7[Z.[$/|@BBi6ZMn&C^p__{+ttTT U7n۶oٳ73zzy3ј7U17}8  QS_zђxL;I`׮v2}TQq'?!>6+;w<9~yxVW_lcslk̺u66..V"l씔XlWWw^W>).+}OI MtvD!]YYvv\\\l5oWWu w IDAT utC"P11vVHNpayk/_JKw:u*?ipɩ4iYWhG|F˖ qp"]]_ܹpv>]zK^fTm߿&lٲy<$KjjK6 M)]VC7@C JcY>}sc]]$#NQ,j;++뫯ϻSаeq?k,̚Sm[&EE3UWcd|u3&Hׯ`RS/;9i@hiwrڵFZgڵ6>>.Hd{[uuiݻ7##wxH <{:saaJʙXX>niib@znpt4fbM]v̕7Qoko#pI'AHxnh{`0JJ.)iE(:˖^X|ÆK'_OEvg =BLlgKfkllzv ŚzKyx\sG輼m 0vϜ*ʪ*lh`j@nYDDBBfVCZm[4SMxf,0.,,hGJrQ36ZXB[3>>6CWאSFj}SZZTdVVo{._42tu utxxIL̪pX0L!SR++/_cBz~絢"G$n۲^gd|#mm΅|\yHj5~&<wee=~{xzh,i,ӳ>οsUTĺ{jj~z.Qkk~ޭ .%K÷nkkܾkoltuXxQ㖘.1]dbNMV矘+W= P^g~,ظ{dd&Ǐ''Z\Pޗ-57w_kx3,|xrܷNM'XrO-B1Km:cn,ֿf CD"D"0EAoyÿ Hí(H8\W,\hoa ^VVZ8z(S@9Kp8'U괴8-˃RTTYEN3`l3QneKݺu횿ʕb" _NQe0>8FqoC {zt((A텅DD8͹ϟv F>44[9{٘ 4NܿĴaѣAqkzznmvWS۷ML Зrpu{KH.9yU%H6Oc@yHJgޥK99'h3}ͽ5"UFjjԴ!Y&`o ..Σv?Z:"0XwǏmmo5DE]T^̴n?:,,J7?Ȑ6!…<(ÙZjӓoEs<ODᆆ(H,4gb'0@l($ /7' ]Tt5!=qֳca Ľ .wt46{GG'!)-#8Rκaj## EE(ڵnng}BfVYkNN+Wꪩ@/654O08Ԕ'䴇ղeZZJJ&&ovDN۷lΦj`xޛ\ʊ&^Ꮛ'# (6;w-*|^䤥|uLٳOe$|"3N[aLj Bѝ?*YJT,{[j4g{ɘ ,w?w\eZNnԱad\7U\\Ɔ22(# %eMM~AҟIN2۶e VUݻiOGKH%]pAmI2jp4?޽/_MMWQUnoielIQQɋfP[ۃa>>6,_$'&cKK/K%%==ulTTܞ;<طWM YٲM4zpe\X yCN$H,8s`dQB (psu(eF?.[4-xkWYDm0#LY>_V/Y;H$<˻_WV21` :Y[wpTB#Տrrff[ZZ @e[[J$GE]C&%%'{lo'lww|/Z RS!ښzDLO|&*~Ƴgڔl ͌vv-6^\|$r&mMݻvhjrrrjmytg>~ qA]0B *~lkm-~Ҳh6g }|.M;ӥ,_`on.,H)W^I,~EZzQζ|؆C{+xyunny($|{ =S_]WKKuumMo/RDX\|?P&&NN/D21SQ`(Fv6 33py_&] GOos:hpҥg>4ĴpM6tpDZߋ&q-w3C)¬'vM`vv6;ޮhO~ƒs %^p!)|DD$̙CA9nn))k!ev38XW#&vvmQevMOLY56fߺu`4403bMC#e%$2/?r;;lMg\h)3& _W[P-bM 멶">~EĤD'OE%#pGHDdx 56^Ktu9rNJjݾNμ|$RkZjZZ:,,BBPBBc01afyy'l1ј7gy-ֿ ;!=2C57}< ~H}nn ;pr|[SBc`PVsZzܥKssG8tSNtmnluuޯ _V|IOG.̏ F"?nk+/76Δ֭K ",oP(aϚGĬYc}5|62z3-3uVx\@ݻ QU :ff6jhhM퐐Wbb>73G]/\b 3?y؈a&mG!(hokܨ1[kas|z8@c{yČ$y,Xb*%3vD(4{oym-43N:D"..=5'Ea(Q)h55 - bF9fLd,=hP[88$^~QtқEF?;zTW+m3g$GGt ACRRhySk<E]w Z[-,lǟPq١QQoDE=/\pv1IXTlhhky9WڢKJBf> FCHE>4 GGmϜ 9)?o'4-/AA1Q^>F6ٴԦ`̲oVшD!b%KRo,HLcq89񃃐#~T=盛i㝂',sqh f;|$f辇^lsKC,X +bhq㙐w/_>A\5uVX*AszQG991nv14nm>ue:ۓJ +K[~ɩXaa G-]=5/aiWUU UU%%htVVAgg/_&6hhDE$$]>eI ӋIK H>qȕ+y/[Z~(s<^U|wFCBJ ?Ӛe((10[#'GxEIūKD*)[X˗P(fffLl`eaan,,ܓLeeTo=zT\u.s2.-ff7>SYBEEMCQcX<~'$Zafc26tLt؎4q@"edΞ<;|[w d)(}}?]g[5dOOo ,გNIe51GIIO 708 N$;=/ ^̅Fn};;ZD9={3%%tĪ;wF6`s̎5Ԕz#GY--$!1ў鵂cpޞ?x< ncdfbbdkQTB%3U+g8+c8l[}~+BK^dfFFB{RTtu 3RQSQSCa۷0KK31+(j kj r IIs@N;q3Up,=]c +ׯgf=}ZVQRR`:s" BB>!!YYQQvbb}ƖQU$).>}fR66KK;{ua0I@@Uȑ-,yy襤0oލ;zl{{33=ŋ-RV^?e/88 $RN#BT._CCӧ=כkh8w{5ǃH$QRj A3i;i ggbg HQ`Z@ hi%$kZZݳH?s.=}e15-s"""׮`e76ܺ[ΟzsἿ_ <@" Z[uϟ?P(>>Nat=dL~ݞOBRLqXYIiُyVGm<:P*(+]]}8<s30{azzD" s78BnE~a_J\Pl wvaH$ +ۨAb+^?ݫgeDjhڶ6@$~hݻϟǗH("]UWPP_Cڰ0n.5j U)*:zz ;|ͳ,u.aM&f`<'ż[NڹS]m;`޼ Tmm/ϛ7zofzyjkCijZZEDTM#10!P1܏?&GbTWa0-mw+mm;w̠o׬IImnTQ00KJNo+uMEwul/ok 䒜Mݘ{CTVځ?44Dsk0CC{|{F]Ԯ?0$dKskugh=]gg~~/.NKnƦghPa$=.䕠R$]ݿM2=ڷ̅7 UX#PdSf=cpAp?w~o1~W=;j۱؁UN"t!}?@ |l/--+mi?_T\XhrAA;wllnIJ:wfאw!PA!.. w oeUTa[3QQ AY'# 88$%uu|>(';4T]]YY0Ԏ+ȫJKR^$&^Z}#5+MSSK[\lXϤ7QOg5*Փ󦚆RUUSKNv* &`=$ROϫH$vv!2{9}lPO߯!p֦ODZZvN QSeˤ$gb/\xqbkbc/55:=LLƃAWuSnndzvQ5LLfk"^W G3ԦXt-0QQ3 bf ![vӍpp3322rrVYn!' ^+Wik/Tce@m|YaVVRRv۷фN4`b啔yzH冄T>u8y';vŅY[ 21ii]O-蠍u^H{T|v@H^PMI'((-UGU+,gWY.D\'2ŋ,\ɫv&b*UTvFps^xvjcyy (*ŹYXˏ\M8u&c2ɩwߵYYz)) 7>xYXprVVLtw7 9ԪG32l ED"mF>/#"'3x-6V?88$ƍ  h.67OG*72UESOYԒO\_oiDžQ[43#̳gn)Zd"*$-,|\TBuFMuȨ{WDDPvPŨH]!*ljjmcEddHȏqs̆5<-YPu16իPOsk'廹55MU}/dKE%&fe&)qFlܵkϟ8C_/dS iiF?sfcp^5zLL7Rtq ;yXY HIiiYYbЎwș..noOMMaa6n̤X`^c-Mo GFc&e;.,g87CKS^CK}Ŀ }(23G[ EO ^`|/_xqW޽/CN=.& Ʈ6~!VVN.o utDD=?EE Wo5%5'' /t-)9|vS]E gz`Vi)) A0 ,0\ccu @ NEf:bϟ?̝sysO}ҥ} {֑#C$DB:ujjjjkj2SSZw!?o9JJT쮝#F̞gtO"? uEuh4fY''ȏCG:@;/nT[yY5G{Ϸ$a2&: \,99 ࿨~ s~M":&V{ہ{ہ{ہ{ہ{ہ{ہ{ہ{)t ^mÕ,@,=zz8wm?%]%Il6NH[ "PؾW22BCuk``ffov3i/"1>ܼuВ%<]]11wq9mۢ_Z|u1}\]==ׯ?wŋ^K|X25wܐdf4ǻwoJ#C#?|D":=33*fa,,V~\<^iWO--mXyyɓ ?`k&3*С1{D^ӄ'V\hǎ8 ES[ EFZe=Ԇ 2na LEEF#O\nrW%%"N;DR1l*+KzI!޿6~N-+ȸ~ȊYlvTԱ&hj\R8aaӦMcǧOڣGO:w12%;wN{RXvelm:{0*zQ6n379rܸ#h5/?u 9#rXӦ`[DթB̞34%1bcg@9K-+-,ͳ=~mgoKb\. yD ^JJ^۴i7oVTDRR ~p+9"]͵ߋ{J_\Viyw=g׽KiOFwU |r-qi-[V5{ձ۷.>`^lIk ߾}OI:1u$k[ە$pU*. \A+zӋx,Nr웊BJ F6llq9; 5τ ǎnz!n+VXYpHOl޳+]?C.]>ztT-x/ˠ!Cѣk-Do·̝:!k }VLNnz p䐹ߟaC\QDD߻upC)/66p||MoٲaCi4IENwu]ٸw9~~sfYI c6o޿?=]Mmԓ[/RܡrmnN7-OE̜Gh%%G#Gꚙ}{J& _Ǐ:ڵ__{} Ϝwߗ7ĬY9JOLnj:unȿHvv?|x\_ԑcKӹAy[9%W/++]ݪꬬ}ܷbnۺ\jpH[kbS[Pp=J܋WJ1(E @=7A ?`ҥ!n[FE0|G3y>aaΞvMHȾ憘|t$cHl2ߦD|_(@D"!KHܼdɋ]6nl7D{I\))ٷ 0ⴴϟ_O {ǥR=z`;(8eH[[Ç/ѱ21`1tJcFzlX{ʙ3+WM~a0? P(fZZh4`0\C +E؏<0FT /]|L( qC;Cޥ&Lزe/W]}!vzatV66˗ݻdzmד]NrlYYYS&m?}0@wё#~O*+ooצ _CQ mݞ8x%u 77~ !d9S{Ž}J6{5ko=XOu۲]ȈCB9h־l3ߨDB.ϗo( Q48-W_H}u{247D*4=u)EҤ.~Sm-o`dѫ!A&ye߾K&O5j`;;ssd^9[AgڵV?~V$yJK;}fiFpv1556FȐqVup9gСvvnnc̜m۵\3#u ˖]{(2r*dCggKKss[[!c ٿᣖfy:CCCNsz _ o߾}+3 fmmMxFk2112R*+\{_Hy\EE pjq")!յk3 ¼u߼i\Gh pd\KgϮ&ܸ^^7b(mpߺ-}{-')oyΝcaRÆMNFvndDP~JEg&\;xpѢ <<ʵǸq  OKr> [H8knO*A==ojJ+'r_M<_?33 :eÆ߳y)%}7$ bŨQ**wPLWl<=pde33KF:u͚Qo6clÇV;8-_~^SHTQq!6hz߾3fn4jyȟ6{e66HOs]]c\`|[~yspHjnne5pgp֭I?Sbիo ru16ᤤm][[YYo^SSR$0m̙W~ldEz52^nORӑLtEۋIM~ΝJu!CFyZ[H-z.}\ǏS7U*{?„aÜ,,LL;7hxJJu4N9簣Z۳ݮX0y[@wH$`P kMJ\"ܮu|JK12RSk },&fݺ۳3f9qjKc<| %E 41__2_RFG:4gY(sQQsf! }Gykי[ +!;} PMuq8o߆M C<6td-qe~+ 22Q-.򹰈CV*+7 b0=zcQqir%#A:zݻ7oifҐ/_23jjXm-=^E#|hoI(GSSlOZDA tt".e/nټ3u@97L`?߾uo?a*F{ҤAkN}ɿ{xgXJA&SWo/#~@@I{O_7̚-`Ϲ{CΝ+WPC#W$}h׮ %5+:**;ykW N|Ÿ r FVfRc\뛖%_X(H ֮/|giw&-^2-PUM$*E$"D&9vlh8\Kw;~-w~;{@7yw^(D~##ϯ-/o D>{#VU秧_Kڷo͚EaoX PTg\hbr؞=GDE%&嫗/)d?:$3'+nojҖm)Ik֌T5eMK{gdLL9jӦ=G}ϠУj˱qqoW}0Դ;wYVׯY;kWc#V[o^z@@= IDATk]y/79@C!8pvsgM͐a?ۣ}pLvdwhhL4 &&^c;~KAAZ ڞD(+;"bǏ7LFSi{14PVizDdh`y/IFsff\ D"4Z^6(;sf3jqEx !%Ifst_%BCOF֙e303D"!p?n=xrӔ)gϔ~8QnR=zeӯ%1X]]Нv͝khx.1@qqٴÛ2ܹ={Nٳ\:71x2hKn,(;6%YVjž=aao̍xPആd\~@wh_ұ}={׭|I^~ƍnҤ3O> MrHT2@>|zcMwȘ1}1CC+Tt4Ҁf;w_9!w^KxLRe]䐞$U %a5~Zu̖,ruѣj~HWbw!DEϘ8u ֙1vוw() jU utb]z[yyb eW*Mo/: qDI($F"#u]Bw<}>؋]>4cihN24>`/фB ȋ c.Zyl.{47ݏ#^8=dɤ7nnpmf.D VV..' bʓ':EOg(,As|];n e傂k ;MQQM SE*I=z̘q&̞n]T 5lؾ}[po [yG+(xW߼IIu+"bJ{;#>~+WVHJhTCc*J++*Q( EWH_CS$zp9s6m:u*_0?h-a޽gm3jJDMyIVvc'㍍}zy%22zuS,a˖ݺ%23.xڵc^7kرf;m)d¦NZ85l x /ti$}!h]ZZV`|Xcw8q'ƍ^^_7CD:M%$5?~r/[^nlvڋRR\ +ooQM)bki>wkOұ%5u5kbի'NH\co7qzz\~Z'^#SK MKG ڻwUmrrR"ҀWܾpY 6bMeSyշR9Wl@߬Dnnλ܏Bag]ͼz5!{I8~H{鳧g))>=z o$]qNgXs %=~s$J"P\AuMu<CAi4)[2}-F;[îZ:;c}@=ڻ'y\ى($y?[[M-*@$%<_SUUq3ܿOFȈ&mfngNCCQ@^ zs;!ñ Zq䩈⒓>,?@WΝ={S}Ȟ]rr\^QQi M"u^] z?~ӦuTT\@b޾}Ė.55=z߾p%幼M/jTS]]RRVfsϟmfffS֮ykWy-[#58ag߿Wׯ߼9"VhY**ZzQf˗o޶geed JK7PQHD W;r6"Sk w_*"ŋDVOL&K$ Y<@JQ)ȳX Itmttƛwy9J$4iO XBTP$S7J F6f7[~WW!;wYz6 UQQ\RZ' {ɹ0`$\۾ug)?.qjX>iN yoÎLlYbHhmtmaag^zN|e&&'ZuHbÇ]|ŃII8{99 W[oJCHT14.,|ʊj bٷ!GYyqQiHD")(4wNCm>]Q'Vt@勌SyYA! M$bsYl:#uuMyٻ,:C}1dķrK6OT7_855- ^t4[7{=1v…'hh9wn:2d82􍆦Ǐn]F G8;YY飣,rE&#[S N~~Km0uI>?33==}0ڶB1362@=O9{ˍab?|Pwpӭ;W߳4G0Y'ڵko3%&}ڲ~Ak W@$~իOE"yyMH9YYYd'O#܂DRWPR2dPCc=~RUya3"#Ï߾㙘 8?hg>.)ukiV,{zȼnٳ<}dǎY֬jy8,M8Ǐ7nrp LL,LL:)ر12c;^?2'3Z}~Am8QRU=?KK+C}:s^xaȒ!_CC_n%[\>|n(-uh}-mLL@X,؏1({kIM_xDVJJGzcrn߾pjs aÇ{#+NH\ }쿯)vƆX\vV嘘 F{]MKxXEe@FFMQF++::hd(!t/ )RR4i/|*"Vl] WSqÒ%o47u ŋW]{!N 6}c6 %%eh`l)\x9.7l-I:vNz]>`Z/E#(ZAU%`IHH0>y !#[]f)(P(22$iE%mwr1**<^|a0Zh}|g~PMy@[[cc-M5u%eҿ)QQ)) o`H43 6oŋsf9ukLښQ"[V.;Djees.]:.VX`b2sֶNd2bjjRUU ׶o[B]x{Y9:=;;VdDad UCG]U֮IKt16[b|-#+'#--}i/x]]]55gOonj9{68S0g89B}λs+<|Q\AAV } 'M5+;ka-{p9=x#[*+@B${:'6(*pD4;NAAWOuu#:&8xذ={a FW9q7bV Is2$ʂy{L<~| }| TTD&#ӳgG9]Uii9AtGl`'LXdҤ)S3{d+pՙ/.D9r"<3S[3(I?I>ݾ#8xܨsf331f0_FT&?G&}zPn0- 㷇ؑ'>Zȉy{^9ru>4(T(''5qW>66s3ɷ-su 8ܼY6KA U==v犊B Mm6+*joґ}ѧ|@j qZ8\a# |᢭E y[6^N[K__G>p L}}{D ^44ս/4B̔)G̞5u*7{N#,{ 9>)(xzZZnk)()XI~Ȑ?fprrvꭿm۾}II7ogC\9}zŒfi`@tѣ/^ :Vl^=g:7G@2YsBXklX?nܘ13bc_s]]Y9&#ǟ;-$3?oڴE-]{WppHP8ĉvj"/vG04PhYIIB߼.^?hiȓct/'2ssk18552YBz EH$W~Ӧ [z|*5>.ݻaaQeeL& /ߣI6l<{vʔaC[;)ˠy3nܸqϞ;o%m2t*Ǐqxh4GɩZX}!vg' wr= lߑGYscn6iԬ_]]J<R[/_ FSU50prǎABnnbh;w]+tz-Xp}ihh+W?–/ө^ ml4BNTd۫װS9;37\q*ŢѴ ڸsG nyS>ÇN9wۡEE׍԰^±w_oe:x 1/޼wŋ%% //ad|SafXUTyl|١G^g82v߾>۶>;9`nkR=dXՂǎ++sի1[NJee{67wrfkjTp# 歰#_+}{gD~7uDD^|B-?s:>~ȋ{͓'{249jKhkwńIXUTX,m-e"WêgτP߼94…C/ zbdʪgNC+4ZVHGMQ~D{kל?_^(+;s箘Y3]T3R:95M`h8{{ckV^^W}c /\?q͛Ϟ^w_Tϵ5HNab|]pիe4ZUsv_Y.(h^AVgCCq@[%t,cHlk2j."+ 7ϝ={#u;w޿2tGCEEqҼvc89ik~}qqmmEŦ#O?msej6g"*# g))7 ?Ñ#/\bafĤy\\-]Ͱѣq:Cn:::}\NNkݽ@{?f()Qv1{=@w&UTܼ{.C=:D(,*vⅇE66rrx}S>_x1%:IFLt:ZZ._j``TTFz` nn&t=pÇW@@@@@@S͇DX,<5pO{@V(EpPHԖy*t;Ga p?? ES("P(WWXOt&2F⊐kՑjkF"-Z8z4[^9Px{UUg!ňyY9<ü/fG"=[YyrU5AZZUL^͍BqtF#:m2Ac^^Q66l;^ٟ?3"9L\w*+ѳDEHP6$ą i4k&ɻ/_B4Z__WL"#VT̝%/5Wj[Yggž`K z |ddLMʠwr.HdzWW--{7'$"X, tFm9i==*`-- "ꮤ(K$1f2\utbOsBP)m?^JJMź5 Ko=2{S^>$l^|^E [LCRBhj'!=ukjOb}Ѷ + Wl-iоsggj]&-#bz wHPQܺ#t]$$JKKܔs>}RAAx|w\@藗7MpnyoX?a6l9xUUUVQV㥥ȷn_+иqWXl'O-Hkzzɒ55[a0yZZBhsaa?6;VY$Ҙ1z1W4uC#2elp9ݰ99Nq dI"QKk:='gW)-E= +,|bx-DHr*#3ey55 l侒rnYw tJm&Y_|yuWtq쪪'Tm2"Wϧn3nC(Agpaa/}XX$pٍzNVSV-/?g9dfeMMJZJi:J5f!474^̙oֳ ƕxKKmF{;)uYA؎I[ᰊJoB|ۺvú3X|UTfsD")OQLnn MۑDBta21$Ҽ**8 ~АA}!St2lvϟ+(`*Hʎ_QybIHP!X[DF%UB~oGG x?+5_%6O($H uCӳ$@$!CL܊JڸϨ*IJ Wʖ?_0Uu3#Im@==TDR9!z$jh1QQ55WW=R ed\~gﯬ<#}dd$KH FS03biDd߿*ʲvOyD"ꮂI..BsOIѸ\eJ8S;E ,,j_> g`0 X w{I,ыL秢"]L*ٳW05%8UU%&ؿ9;>S늌w \WBaq"+KV+ru/GR"QE5KH |Bbd --i[j*WY5P<@^SeIٓ@ srJJ%T,M"mdH c 82bғ'#>|)= #I<=mm)45q8uu lCnn.q[,֗KmؾO$" %~TX9s>wԾ}gS]7n,)&LcL B*+˹kDD}nqpBTV"tE">d\TD@[+;#.i&Ff$]ݴNJoGȨׯٜ?(妦IHNSTbPǫ*;}Ss=="QFɼzǤ3}>!II"qj__I說-Z8:Ʌ̖:]GBѪ67I"س R((T~mm̅Z,v;; ePX:r~c2sHM~M kk9pSog$JJJNߟD_AFF+ 3޿Gb!.XFhP;}*)$;U^22^H<2%#3ʱFԠUuQVo=:޳D$38{*F3e+C=~/byԑLt.~r#$ :}L6@԰X WS({[߰g LQĤƱ8 @0Y]OM Y](-EK߯~HM]V {;.Yd1rw/!d̷-oM ?ur[ =9>_$+h["@s8]`ƴbO<{E&/^4~<b]6;'fj;PyBEEB;.-͇He+-%-볿jfNJ :`YXHى ,㢑tza0EE,VFc0Fd C=Es**-)Y7С22A\OԼ~]U)IQedX Mn'  P|a0N`TW8~w߹sg6ȾiUSԜ?/b0VV&}(iSGSV+/{Ko;"߹׳'U .)ݽWYybeշ;2srjkw/=b>!hhHK>}㵰* Xt3[iy3JAQm-ڄ4#+=dngՒGz Ҷ"$o>V 3nMir~!t:pi) VW#M]M$*+3-]`hH{`z&")vvʬ>>q_>OJ@R7&LdH&M( R޸IWT R1&G QO\]פL$>~R^VBB֩/F"|oOwicXkQ? Ŗ_S]Yl޽/_$$.@F՞yyy^"bx6:vt`jk?}ߴb~[B#]r5hV .{'_H=ee04FB1'#M"m AlmUUQ7kj{12c ~qqAzCzLg0>;sA>ډ'M&$\c AXBlmmFFchq~rr~VVD⩓?1.y{{xKiYī sZcyy $)9=p3r1\SKoQk4HH Oa#;,B7cGs| 9*RƛSJB'$'p#s8>k&ٍgȲ{ZZ'Sx\jjeS-yD)*y\uMK  EWN2rcSXlT~MP(>66RRn A^u~vi dÙr =}Z?ֶ"jh) Z^HDΩPx~r2) }E:;4#"(/c:'EAN_J#+GE'&ٵ5]iG2OyuHh_-O(FUߤ[ue)K}ͪyS]>6[[[GP%%ȃ&!^Nk<޿ϩ%$pf"ONں}K_ SWx+?@(d8f uuxdp5}_~="߽7@eAX,|uUVף{cNjŽ$15U‚L>LN_nHD힞d– 8.WED8ڊD0~p99KO.@*2j/uuפCj g>NHwpQ\[wzoKDbC k5D>///c1c7bCEEDPzﲽ~{wBD)Az uw=3s;wÖnt<}` =&JuSXǎIݑ= 2bzlF$V*ЄT*?8mmQ*9} G$24ξqS"fGD"-ڊZK9p0>^,{lQ?xHT!Fڱ1)_xn4Y@Ɂ6'kh@ QD"u@.<?dFH24׬P8l.'* >Z]{ N"z>^ؿ"Fdr06M}|p zqvJ$ e"};w 74`P,./QڣBFBim5~  up6731JJICl1uZ|&{|sjፍ*UcDڟTZ.BID#F]`5gDut 2ag4jGQQj:/1D1N4Q HJҍǣہC}}11(lhH h(t?@m_:Qxd=kTۮZ"9GZHtxMJRnJ!QY"vēF>ZE?ymq nԍVMHbJUZZU-oV['76Nbb޻aLfP`~>JLbyyr8g&JKϿDiދn _0uǎڱjuKH>haUE9t7)J@ji=GWÀ*hGiEkZM"9:R(d TJ߳jj;>Վ4ԧj㇀ѝqT_& zGUOgAslF貁\mk|tjƓ@oht}aڏКsb1:/ZhhVy9bfq~44@CyQ6&$ j]q;ӗB&~LRcB㞱Ԣa75jvuA DZi=P(P}pkDiz-ӛZ_?^_?8^쏸^թP]f"QnDDc`NF~5lA'Q/ÑHr/[c}@T  -||LL :jdLPixK3BLC,bZ}YƆH300 d ;yhfL'kO&x?i,4'DdFFnTZYd0yӘUWܺ%Θ`oR(Ӯ%@~/R9WVRL4̛ziF#ܕ~W Tft@̘q-Ҽry״?^A :h44ڞ25 nk;xЏZP12 oau.M'}=6P@lҨھ36bP0jk+Vʤke GؠQT ~O&'<=єZMM E73+)NO}|,,Q繩N.zQÕͦP m˽#ԅCJTV+bMvFYLzyhsxy )TތEww74V|SbT r[v8vA&ZZhFT9 =< 8>~xi/9Hzj f&@hqc.bdQ"*.={rHNM$rNW",8,,,bzRCw ȢOE{ja{!ˤJ^M&Ie@㷴4EMQbS7SV75It:TS! Ey9<~[kIP}~TmvNoLD S sk2M>RUVqvQyO۲J++__=3MMM22D\4Nm-Pc--q;w3g**6J}WB#JJ**],SIZArfϗNp'=|n0ÝHlk*tiL&@uSh_=j4a$Z4@ ^[*+dbT7{p'glzϿM#L$Dbwbx 1jѺ5lJkS<ޮ IDATs]/W_Z*8ֆG9` skw^^x|ffZHz}\,,rx__O¶{tb=3=u_mt{jOZDt%+$F8J($ڥ@'d$Zmo67WWVV Euc*V$"ɉ${j/s|CÐ!|LRSPTU"Bt"c[[hӧP(--YY\#5RMmƇ'PϣD~8bZP(V2ٵkmQ*UΝ}[":eMJ ٛ%aPSD w$AQkg04trF,|<ۋzy181Q*m>cccmaN"oəľ5ʒBA6BH&…L&\Y)޺UߠTա)J Hrqf0Osr.\O03Kw AnH>v,T3&vi㬙Dy2Yq@iIAtA}Px@e壢On[Ȥ7dhwdHtxEJEgZZ_ $8n w6{hWEOH񬬦LA%ǚzI$I7jb4=r|h1FFMQQ~Vf1c̾ߺubKuM*l?BM:y2fLٗ)UUTB`7IOOYTl?ζ2`:qo۶EF|QY>;4ۢ.fPѢ1.DbKKq1覆A-j [[LZZddPZ^ZAD`[3F޳6goy-&@?o/"O|} |4,?< \(T( yx|@_%F}r@8}f212$7W"IIihT*y<2DghS&HM_nz(+H{{RccXo;a<L]crYY@p -(mJeEdNBI5TmOdz H*}=iT~;GXAA$1Ts9=>O߀@fÆ5޸NX|ngdjDUUBL^^RZQ/o|&tr=q5@(D˅yyjO %8SΥ˗9#*}3J"Jw&GEb-[m}YV֗5bqT +YyKfj55XZJ7n ݎ`BccKLs<>62?fg gβ.2((0heeT|~U5G*om4M3h6btuv]"9t@2D_ IjhJ͑#B #3<,pԩFF :+W̚:6_‰--N*ݾ= ?q;:65\L<^.Gck뚛e[.\lh쨮ij.*z[*- Ǎ ̧P4.INn^[2>=}&rPb͝J/Ņ@r[Z7%q8Q(}nNDbl˶[[o0Mt:ޮTVV57K"QRƟDӑftJ(S>cTwAh?E""-=/߼U.706Ίy_U:Z%wﶷoOG 74| .ٺiQ(6tpmBrLP>ɧS+ʥK:z,8>Ϳ%UV >Hýސ`&8\[#_MF!zzԚO{moJ (LF*Gjh54߻̝zH^t].WZT.C~}O( :nNc#l@&kho-'i{`Ё=0@t } :$gF-\u`ˀo su bD,"ϼ0tFu`ˀI,&h@؞"wZa_*-}ѣGGh_;w.|5h4;k;BAӟ7=:@ꚖVĘDe/g L-))3F.WxLdr <2"ŌXNjW_Ng_|E G ~cJ6|aν;w`H*kkǍ_fm-ՕYY3Ϙz4O.ll/]x7o^jk-?W&%%^qͤ$4cS3l:KM-,jj}NXu,!W(P:_.W*5W(ڟR\PWvxfene-r\'DDFD*d%%EBqfffZ-/}B͟7Fe,[۠ࠠcVT,k۰m_40x>9uyyΛ`~]]VrrJJ#=VWU8gl}}QV")9(xTccB0O;R ?,?tT;;"vDD necs{yyxx{[[Y[XӸ tƍ HIi?o BϦNe?yK}\^V~;Y*˱?oX^DҕAs\O h҆ƌ+ E"ZOΖͶws 5:::4mdvl Ww曅 rԴ&B;4;+vBž=))722/Xҥ$R_~82T7wy/gn ^g0|:C~ck[AAAZyf~koP(6.u)SԸںZP({ı']]9|Q3g?VTRnaa!!#FX Etvz^#~=_S⾾+}}7 mm\]ݴ䏷W@@p;6;wjjjCcDĤ6(p &M7ֶs{fF⣸22uw A<3\_gfyĄzSd2 Qs_Kv劍O.1BB\]׭]pVO(7 ڷvZu,\jaN&VHHdd̘1Q/'O:sٳ|0u} %rCJJ&+鲶>ʸf11֯[ jMmMmK^[Az T |[TۮjiqsϞ??,\y""lmF֏'WsYEXSٳ9cfjfjnhzK$ZZ:808\QT"=iݏ%,zO[YZYZ[O&^"'7ݺ rr,)nh  nY$Jr(AO%>NGb1T*V羭U*4.uIe99_X^bFF޼yCHo[&iWϚUU{^݌ѣ_#4DO#(_kדT7xX쭃2Z$!nzۖ۹8BPhp|V6454cܺsΝFF+\O$yB=ѣVY0"O}40^z_`₂X]rK K +tNF7645I$Tmn~ybqMMzWo%g+)oiiodCKKС'Θgju4Jm˿p wKJjk[Z$2-*jnjqqIODKN޴i떤kd |ql*":RI|9=%WS(ZZ33%8~rfFyy]R[Y:;Č6cĠ@ s s<m[i~R[{Ĺsiw[4W^` _mro~E&O?ݳ=k_?e=hdF HI駏>?J.\a%8MmmGs+/ OʆH46vtps2lԳ;wk̙8)*`%ڭ p5<;O& (e!x*kg-,Q3<а-Pfd&&Æ%UR" ^33ӱuNNs^3{qϧŦIjI!~k'We55ZiS>yReeaeectҥ,2YQqڝLv\lD=B=m;cGO?ݻ[";kUyիS jj :eXX\ܬ9wS{Ʀ;wdVVyECHDΜd,~>HSUW_W_[F-Y+-HԜOBVO:uɩS&MÒ{onMOq^[WZZ\B$uW:MLPc4FY*kj/\ؼϜᶻLKLHTYz;w3ƌz0#U:ݷV~~M4f2,XL*̜rӳ#TUTJB66ٳ:RYQQnni>֛{} eUuBM8{y̘ϟ4I__&kh;~|d@x[O˫moW͟2mH@&S++Z%?Gu7ՒWQ{ }TD TRxn\ZJ:B!>G:ط'lGG;[!9EkceٵLZU}Ž/{{KGFZCiꚕ|I}ЈyD#-y|N V~ZRU^S'i&&/g|Sry))GO5*:z ƍ#ۋ^9{6;w>Xf[m-`g-7pB7yƌY[myy/>g $ǟ,Z|L /9"TbD"NI}+9VKcz LMMͬ,mO%^Wxի6nڼ]{zmר3Z$ʸ{7͸uPŠŲ)/Hv4] 4dw y5~~&B᧟=55vUvNDF]N:U\db7yo=6ƲS'8R=8%Jݿۏǎ54.\jnl~ cMMMX-^^brXXX谰:ӧO6kVOqэ_+f„vxξuFRxg.\d;5LsGtLO?}*!qO>;7"3={{IDATO13} AN!CB^F^611665b,?-[Mvvl''GG,==6uQQ˗o0ogǨ78(z`>Vǯ.gzFXZؚ w4&6A(-*,ɜ\&O:ܼ ]ǏoټƎmd?]!`hxf~~nN]J섦{lh+ȗJݽ));)(F00P*+r U*wӽu+Жqv>=4HhT2ߛqW2۷k:u)Sbƅcۛ2M"-L h z }*u }#4jX W3$l`d۶CCNߓT:'(5bH$H`B*JѸ긜u=M%0a’W7o_YꭷF|Fޞp^*tҥQa+_RA{t/JE$ ʅFR(?G"q\ؘckolݷ} Dh4b!/(G[vѬmllLP$B*m-de PXDdR lqLM,{%1:t͟}%RygӦ-[6nĞ:%{ SW#,7j˖[ɹbI_XM͹7ofWUxBIRJI&1Ɖ\+zzK۷%ױbzN}:vcc/;70HϏ}ӧKJ$8>YLzȈ┛))*1Y7] =s6{Ǯ;O>],RiIޞJEvNv_.III{.CFDYYˤG.8>5Q@99{ii)+:y{s`V;-{eZ ̛`}o{ܹ c="N)T_=A4^"[Z+I|%˵g+T *ecED:uI{{P=ŒHssoܸtMmãD޼u3?o۳[<5왳g-,Wgldl$FƫVZqϿ"&?VCB4JeiҒb>s#7ot~78ZG¨olljdpG߼)X C-:$_{Z"2rҵllSӮ^IYVv]imHI$}}3S6#&fٲKF13P?hΓ&.Y:cf}#wM@B``E>wr9 ۷kh2۞m/t.GGZ捛7,,}eonoy{˱w"u L}k7qn o_lj244՞| A??(`yh4*ik?g]~Ҏ 900&?v& -,?ytw{mIT࿈ߴ-ã}V Z"#||ʪʪiwn`#@GG=`t3-2"IE#G9* /0"IRU-]`ZW*Xdv +"Z{O)b.WuEX1.Z7}d2U .,zOg+b{ro{sy*`϶g6,--fϞ5k\("c{/w%mlMLi4,ݏ=ꯡ&;?'b{* w[;[;:;@]/HD,yb ΣO7Kc}` *#!9E {}.LSž9)b @@:Dtx }x;6j20loPh@#whׁ xahIh-&-U:h0@؞"'Uhۗ0E/z;4z4ɒ$?ێ|}I2@;ڝ rmlmۓ:gJh+*@LUo+Wsq0D=P\]Ds2/Cj 1*J5Zde#N6cMz_ SZDZEmj$A6<{Ac4Xx12RIѣrٜVa!&M#^m ߦ a!) SYH@U܋p*I8hX9ٺU׳k"Hxq䅱F#e+E:aY;7#sCp_sno Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - synth screenshot Screenshot showing Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ,#u iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxxe{%$F5!Ԉ ª+EwuWVEEmWD7遐FBBI@z!S9^@~k٘<3sϜ_@)B@@! Pe(2tknhH^~מ{BihX/<\{vqIEecӞSz!?j++33ccWWggаDш:]N$ZfӦCq;w,Z K*bDr}M޻˗V>/`d`ccmҧoݻG9bHdllfڵ{_PVشqMWQ^Xx>Ϗ=8,\{-+֭۳W*p!3<%"@A,;z .{x8:چG"!BLRҘуVdwE#TDy)cX[yzhFFU5r-MINI>z'd2[goM!~+?<[7+?whokki13qr^f=b?8vȎkFEEF 'Ndg}Pֺcoܻ1R, ?~<)1**8XR]ͱS'9Sʞ7KA+vU*` U*DzE"FD\bs%vmcBBŒN׽}haCE#" ˯xo>Y5OJ g-)s3~"n~ul^(hܻgY5*4tIyDC!!:G|nA#Gﮞ¥jj+ʋ2N?$$(80s-UEEwP.2YUuEEQQ7oWWgdt n7בbϜS^^QwTVj?H,`ѓ'OjkkG5zJ!lQnjnj2Nd'$=)]Nv񱶖J<=z ut43{ԩ'BD~y²[mݰ0/B.72 نzSӰH'疖A'Lx< --vڕuDsscc]I>}yM6cƼN19)++3kȐʢbSg'/Xj{VU>yҥ{mmrK'%%77ЦM˖+Y{~LOwhk;Nz,!fGEyw H$ZnᄡۿJ/XK^,lC]'M=,l\aB`hCq)v_<_78v?=4}߀]yqt#Gܱ}gOkum[6|_R_pX(**4~?ڪ%/ʔ1c+jLEf߮HTN6ii~ɪs{0 0o@XxXXXǶ{O2_Z퐡a~uKQq^ɓ{GD.DA'NгFs)Hc2W1BZX⣵k7}/f|dd>;w|_P6qt"Z\\]P8:dML__XG,..,P^P_P_[WYXlmmgV]YSS]mΗ6X8Q5a⣏>ȅ u Ŗ-;wlԴzɳf=Ԕ#]ll--yʕx~ΜllMLRJ8gxz:8ޮJqq))VX%>gccf޳zyt7{6ʒJ;NQCUU_k+++!p,µRX89VU G6f0 HLh2]PͻPVX^~lPдiBV:0oáCU%ŎBW&ۼ;wds3ϴa>%/|v[Dә4c(_߈ _}p}}lm^|땝ܽkgBɓǏ'$δ615zЁ9bxa8::fd8:.Z(7Ds=olΜ}Z:9^k==,-/={ƌֶiRR2N<; Ξ}dy?/U(BCCÆ KJ?v*U{{[_NI)OO33WϞ]c]-03Hllܚn nvv`\ضwhm4077lKv911BBZZj%={{TUWV:; 쏩\9ػ556555og_[BXA&koWvz{+UB Md2!,bʝ%S:ydxӦ)BE.̤TZXX[YօزB{qVi-zAtfɨ" 9"r`xo޼goR?l7>7 [?t_8`߻!OHM>"88(PJ=!+>1=iniSh ^^G n8 Mm NVTk?ߺ%>YXjҕJn| R)NLJH>S=eB{y/Q!`RYZZYWT cV "m[w[[[nJ) gn- u (geW(yyosO} 7356:n ~dFG͚Tj\曫VX!UW3fdk{;{k+k+g7ozF hݺfd۷RX]cddc}ewvDRQ~c5;τ@'zIӽlld2G^lH--BG̬̔dMMrӳwrJ|V+V˥R#=iƕeg\oق|Bqb*b`h YYg3LMmmĈ#BJյ'^HT[W[WUa\ԩܪvS8P"qq6|ܸ㼻{y>r8-5=],V(ZZ;⒪把FEЯLflljyu:sSssKˢʪjD}2 ?8(Yڻo%+_,޹3>Q 6(08xN*SNֿ@B*ɮ߱'N0l})bR9ibT_~gY?XrC TJ$ff%%E \^^9 䋵~~~NnmmjHt4>-)!իRVoo[[c={`kcg`Rtٳyy%%II7dH sw=/F/-[,,q3gEE*"XU'ƻS[ծn4dB[>Doݱ#7ر;~z֬S|}#"ndm!+^(rrmG*jjjsw0--5ѣ}|F 5K4V*O8iի?Y֛V}=v 6nujj 8jF#|oVVffwvسgȐFV*ͭ)(22𸴦V;hHHHX_?ww׭[y~aa#FVW57+>oj^~$YZYvͭij*)/͵pvvr6117~ݜLL>|J춭~^؛vLaaUu|;?Cw2q]--ܹ eN%%1s֤&&BZ RA;}:#ȑ1cL--ͻu< 3G F';o_OOkkO?6RR](LMM?~"фYY'OJ~p̙[p+V^^QWҜSO?={mn~ ƌ9ztl2vll,r+*JKf~̙!ƌgzJ&%x{[Zj=zn\flbew())5599衃RIۻg[_$**oh24<<$罦IN89ff9~X}]uUYLz11 :v}i4Wlgkj?r3EeG=whgmLz 簤533=q6\$B9M2˻{ӧϝKNNIIN.)êG`SSWHCaww+Kc䌌ӧ5ml..2dЬkg`n== uqstrqN?}q{yY[^^={ټVcC^||tFfvvgsr M&3xHDSĭ :[X=JE0\;wff >7Ds#M wNTjwmWAAݻ{{[Z99TV66lۺ{׶mƅciVɽ?q)kk#zT\H(+Uju{ZәnذcǾ}mmMMuuNNvv9*8x`aǫwWVKI=ӯ{wƚ0QCOL!tHB<:(2t e]2.#{HfͦMZ[wX.U(bu.\;3>dI{H$?TniU(jӦm**Ϟݻw^y[ZRN:RaTW Cwkm! uA@~/o? EMͅ :. Cwޭ֨( n p#ĔTT7D+V|j[G7haCW ˃"aLfjFcf3[vk]we`hm%?"9+ d!^ܙ 3zwUT66;gTRs Pa!GeU}Rym7dgmm^^nn̘McjjNzD"LwPUYtPakǮ bİLh]\.lkwwܼGtwV_0sԩWߧOh/y(---<{HWWS9s7ά+]R c( _~ګ11QѥbGO+ m֞dX7V;oѢ5_(527<oΛ[w_ZZb_}%/XK^,.\Ó&wuqꚶ-oݴB~ANXѴ1uڤ)Sb͜ ϑ.>cӫLDq,%1!.Nx"Vyhw^>EM[lyfRVү_pXTwD7[+^DeT&&9?>|xxDD_V7,-L%{{7斖T.lݚ~cky IDAT[ͭPTry^>}{ٳEAy=\[[LL++ d[nN3>2O#Ξ-Hmm/'a ^|ݽoA ˞))mi}^ZӟM2%zܤI3f9[^Pƻ^~,79Gw%'9[Tx"cIF`*RLf|;w߿s>7޵c{`p,s3\'A_ٹ ړG;vkG7ʊ5E5R:.[ZYvͭij*)/͵pvvrֿʖH Eb[RKS}}uRR(B'"OggœpkhPuvV6477##ȵ8T˗?x/'C[Z$+>]^PX ;it]F1_FEЯLflljzulZt斖EEUZT^ƵC!>j5O/1<ӿ޽GU˗ Ǐ9n\{HdjǸvvj #GZix٠Y"YlG?ta#Gٺ2dT Cѣ&5 &SaǍ tɌڲ].}[ 5aƯ|K##,c-_Ă^)Uǎɼcc'=BBƍ6mҤt'Q+tTV NZ=*H$ =틊qN]! *6,,]cほwp5ovtį⋪aƎzQ3gܹ}+S[`/O}~R￷cG}111ĉVVe噧;>IuurJeiٙ35O0tV[[ptϞY'FFϿhѤI^R!s=Do-۶U33g07MMl/U={>Q)CB&M$ꬬmmjJ#;) 3zzTi;yJ;C7/aP߇a BNGzn=S\ ݀:(Zm.sFϖbяS{Konr[K}`dؘc=EODuqa9 0W>$?MY[G=Dx웛/¢O>-nuuuwsw0چm[w.)}W^9s [[__3/| 1Ǝut/4A@W['Wk3 GcG ߓKio<^rwcbޮpi ó{w77#]f慲2Fs29R% c5zcRaPߓ&aBQTS aaP xn%YYY[[YDZmRѪR `IH,,-Lo>TVTffMH8yܹ¢ꆆA[BQv73ΨARsr7.õj t7h2u|C6\AR+_٫k5476NVrIؤXV64 }l)_9ץ}?࣏IFLulmlmڴ~7_ٵWﭱ\+H"4ŗ^x!&} }(-wC$:dMaaiIYZm]zSEp4j+*O8^\*60T۷h 2٥Y(ZQ|[UէO.?yAW2| T*OϿnb۫w7OdԤļ#￿ W p;Pch2u=_X؀vǏke=~bDLXXx#k4F"gw$ YJe#uvHϟOLؽ;1^ut]¹qKKz֭}}ݼ,,.\̌߷/@6_b G9~ܻN"Thg;p#V<5VOD--ͩ<ʾne~{gRaTW Cwkm!K}wp-&͜)ma߾}{I##+kWW_CL3¿LDDd57'O0a|LloY,cG3G2Æ|-̅}Zaay-2򡇞{ӱ)8x9sBKL ~k7-Y|3gc֬ٴ)?abj4~tgm޼l…gO{Em0BCԫCA0ct2e7mWͥVkjZQk|#/_{F=C1UT6694fA#2._~g͝П{w,|vvUIׯ];O++?߭ȁVV<,c w]joMKO{o߾v#SH/jhHM}9s||w訙3cc|&MEYY G++bj~|e8P[YYqPX/U/0̦ p}WY.3p(挍O[xӨg ^cϕڵmǎ 32yFմڒ6.]jUf9_` CHnc 5ko~{76mƿ.K"z:smuee9sVnk:WT\ʿzI )xys\GLsNWSoo4-[0?l#9P!E({ryLy5jKٺ%5U\dΜWD"+йsؠ/޹sW/"b˄K^߼9jojW޻˵[y{??|?&vwWPܲoЧsϭlذf"OjC*F\t%}?oapfr0ngj{^(aû֦Thɒ_hm]㍶6bXE&[ko̙'xx?ftBBFiSRVhJek)c.we+?^zTtzM裏3>2Occd;>tы/\V[X8:YYŌW/sk[7yaQEW|֛3gNPtrynnA2:({(/ ;;p x'\z\'D&j4UB֖zz^g~ޭ-QU3ر̬UccFB{''h/xg55vw3uLac>ࢸoo,ޥI(X**cW4hL=&hzboX `7l)JU""HY^^f+v5~BpwϜ={ߴr%;[#}:A,&?{6-7s}[vU^^S#;;xp[udҫ7nTVa֯Kؗz:baau5an6yʂ|agfT41cϞʽw?e|m6Pk؍kVkk57_>hPhXچffpd2-$Rp7?5k.\HL(+v-7) lŜ+ٮ]]\r VG2R|Dvh*r @WXY }mH773S]G,/ ';'QLD&_Tآ_Cee-\(S/\`og'X\ LɦN9IΝ;~%72333Nѝ(}sw53e2mlrrrs3& F߫7HeeSbƏ7>`JJrfԠaƎ%(;u60ۼEa*)CsǷir)IAռ%Rx.;:< Ï?Xbbһɓ haΎŪش0Vm+ë^_TEܜS/'u5l![D*U<{‹(֡Rw<| IOO&25&fOO.' Wܱ(Ts';{ƌ>DhH[lʖ`a<ܘJe&DDB8^\3@ slmML؜'Lwsw+u̙.D9 }LIvw71Ӊ٭G̹/[om[vk<1c-iM|~@+v;wgZZGFN8b@;wΞٹc-[>J)_EFܜ|wO40Qᶓ^z_e~@H&]~9Ç ]W?]\lCC;윜̌~aDJ|fiiFƤ d-*vwHʉvEE,"^&ZǛzD=@bW7.][/''S(f2˽r83DDD`bԳܬto݇ in˙̫Qe|b6P*u L|>I=FD>-p>-mQQPH1EEVV2׽{R)qjIvvxxX?f[T;8$u͛F'(?ҷeNS3 sRyKzsssvc2_slR\,?FIK{#{)rEmS#X%W^8gNDd@@Rg#Jݺucǫk _pYt}=7ߙLA'dX$JG'MPH$bDBRl93:> rGo DB4 z#TUkJ'׿m*UqF{$ E@Wigȯ[VV]MHk+;SƄm%F~a;|S"wtH,U$H䓧Ν?{ rݽ;*"e(ݺ{x{ѭ[Tjrml||[v!%ˍ2T11!5DR|KTJmA{O؛B1}\GI=nݿwd0 T3_=tR>u~bFRa|K#n H m\V%˻|9#]Ga048oV~000214Jb|C{K~ڪ;2:̌CY_ga~Y$&$"iG#?i^2gMIJEy㙏rsptݴzua+DIeͮ"ѥkVom͍!![T3UU5 rV bZ[? z =wHIB7>1:,O \ɶ8y[KJrr .W=zzyyd;w| ^T|D4&ë2@eF@ڂ֖:w06ttllnd0$kK 䰽oPn,-t)'F dge%sZwT&c0~aժ䚚} oem%o%lWNNnnF!׷ڵ4_ӧ 9lf Eƌ 5}%.^RuuBz~sF~ŭܜ =p`U+e/ϝ۷/1e?~rÏ>P ?hofw$OWkg0t(!M /U,\>v>l˖nټu'M2ً*}\\ݭIk2/Ljood͹.f_%);9Mꢡ}ygmf?:Q(H߻WW_[cj:ԄDٶ5;;'Zpu11y4CF#rjK1c2HvNnݲ@(ln.,ħoo 9vwy3}m]_}9|xTTdd~~qqI#'N:֭]xɼ>A7615e0LMmm}|rr.]5 (-m6ϣ#cjM]BހWG].h&zڂҖ9E"wwyEEW rs==;D dHvyyŅŅǮ>iK+[tNYY~!{ۻ LܲO!J* v\^^~Anyy<ijrFL\njfitTfFVqcfR:]Kյ[~ԻBYQQV^u.x55dovv$OU \.4[&"B<55#=#$gT3jԇN~jMC b7Jdׯ_DDgg2=}sڵ27o:yJ*uw/eo?d-k43pr<®5>>ǘ/^wߛ\##zYgm>9p /__{ HTĉ糲(䆆jbKf5T*._.){W*˯\-+IMի9/24*nhhofiI&%',XÇMۺu1ieEܸ~X5k. zͰh+٠*wfh@4J&UC4Ӧ$kS?\^_߈gj"ddK *XX::kW7wgĄ汣5rThHJc*/~> >Z'ur0'>%lm9Z:][g(<>n71FSh\aki^G&6m3vڶ-.n^-- ??OOgg?H97-(l/]JNvsoSm$55jixz:9Q(ĥŋsX:Baӧ;}=>_$$Ɣ37wq0 &f`}=q« oI;[S6kh&N$'퉋ݱcnCC--6;(? (-$|&5#޽\G67>3yԩTiy49lյ{[y{zw{Q圏t ;?"U);O 7@YuB4ƻ!Ye z%*T޷.J$2 Θ1gn䀀ݻ MDQ7MҾuc&OEC"h*_nݻT(|y츘_~)}~w k?'xRi#(];Ж:-phY, dCi(Tڷ4N,WQVWL&_-?wnC{4U(PT&cvLHزZSKWgTQQ]ذ?Ykfjo/:J]R.&~u%/WjjNΥK$R}k`TWXc#4zegϝxXL&S(WIڗ0cƠA dd\ܹztӟ4PXVvԖ-˗_zzqqEECf``mާѳfM>t~[lj*z 33󫪘L/.]Ǎ9s.<KȟSW}PƋ O&dbLTqqG |~] ^^^=/aTBT2i驩66 GG=o~S*>RYSsߎ3g>pڴ/ObaI?tpjܸ+"Q\\ѣmlVJ(hIFo7o 6a✹>ӽ[}ܮ]?4y۷oعk.ZZ3%X>{DrIɻUQWa 8rB!%K΍ANRY[{زe?-̴󳷯o(.~rͲ}֯KNnω.x0Jr}ab傝;9kK=KZgf6qmbrK߷֨Qcnۺl鶿Osn8>?2;@G7AM:0DC| ߤA .xllfP*N8wsO?]!噵 u JՂzrd]'*B!ݶmQ(+NLP(t7~D/;i ])]m[BgFD+ M4 F,!ZM>ytR9K@=zԫ$8O:vMP7)q[oP(rP`okcn>$zAQ915j]T믋PdtX(H//^`-+̟?oޒ%B!rt޺f:}-䓯9WHO_T7 O]qW4L %0)44<<:ZәLbj2yݺ{O46.{{z#뫫oޜ9sʆ3d;udn||TIꙤϚBrwwqnLI0ܹ]dbMM/&%?VUem?"NVyYEE$^Fen(wt$#rAAcR쬫K&q $M3 @sXZuU3 Oʒhw9_GgњDC1}TL>Add舫%bŁv<^ϐA J偔-~X/˖~Oa3MM}|6n<>a_yy ϿqRT_xMV=Mv+׮R(|~NNNb1WXbaƍSYyN$JHHINHk5jLL_8{|~lkVv rt񬬝H7/}T41cϞʽI&kk_ӿKX~~SS##&t4>~l'/Zvj M.ܹU~J*PMMVLirUw($.%woxWM@mݤ"P>xp5]B&?xc WVx(*2Xd<@6h ԏ MFP!"X@"bK IDAT z"و)=v>h773S]G,/ ';'QLKA&_Tآ_Cee-\(S/\`og'X\ b{h))VQ ;(PԅJ0.nݪP :HL&!/\8s4+nwǍeemS}̝+W}cGQQR/^TR(]k s[%5E▥+tY.S,d"H.o|Z=x ^ C=P@)D㪠gJTԷ֮AufPH@@EEdW ԏ#bX@"bE"bDl}6P"ӯ]+->|О!K4JOO_}rs .dr9&u隝UTO˛d.ʕ̌Jxs ӽzt2Y.g2gdD Y$HkWK47_n=f&bݭsADBaVU_M1h[g?i yyO>f-чRYy+-+"ѓJ",+V(8CC>۷oݪtTe*]~ͱk^H[$**͛NJ# _~%ܸy`R&@2e44[TV(-%~)-$uݻ ʕVkAANNVVvvnnao^bLVYҳoh+^ׯ޽[Rz挣D\uDn&?ɩK@@%gXt!ѥuuʪUk{II~~Nݚ;w󋋯]OK;wTR:GW~TW̚ݯ~~-_cGrO:v<)i̛:_iOҽM-8pahh!!zMwݻJ=z1c*oϬ/\v޽,>k[AW.Rvuq_~^z͚1c qu srjh̜`){6mڵkJur4hoP4:Ѐ57pjktm-D`__G'r9`m-sZ/VWg>ۤĔ}7%%DMMuuZZNN QL:TIdKGWs KL\u뚚t}}ss;;/ѿ93yi4}}[[;;S##\߼O7odl| Yӑ#MMzz}z-3f .{~%Oh3@2ey:t~o=n6;Ϙ˧R)_r\#Kt5RlY˴07q5>>aOF*}LL2g=D7dC#6oɻn̙cv ޗx\qown޼Zbiid=~ˆ|05 +*Nnٺzm)*zB Բpqmٟ|2{o/}}*U3ibpS%C?u:6vpgݸM.|G fRqOdό#?zpԃw b蕕'O̞=wb1LyϿ˨/xe D,"Xxh肗C,.,Z~Ҥ͛vÆM8gtV?kWlO?Mt1vZKֳ=^#K7 E4_[rEPVT Bas33B۷LdqY!5`qZڍ yoڼmwߍwD(߾uҤN45{tM[NPsVdi[FkU(7 s.]v12j8?fێͨt:2 X@ bD,=(肎R(+NLP(t7~D/oǨZZ&5J-.>rЕ+r9] dr9+2B?%BTsn=:ّoWU _X|1k={\ 1w/]ݶ'PEHL"XMiѼ,p~= pEXD,"X@p4֤ހWGc\7-+#׭ۻI K0J5HO;wڪ*KK}!C 33utz&Drɴg2Z#š! rqWKJ={6;̋iigܩuBHSS##]AuuW(Y '&H9p$??'N[e;w=|) |Nu a߸zUKɤPBCã :IE 򳳊H {3+ѝ;='_}}&N1[r߾C?~7g=:j[7oW'uk584BRTT[Cv55FDPwɒkowvQoIoq{$]x%?LځG9y(߹svTJ?VUT)&߸Qun Qh[[T}کtdCU7Mʳգ&}{Wcbd]Edd^ϟϿ};~}.\n>~ ~Pcޛ-Yiڒ5Æ+n]~O8;+e/ r(WK*n5 s%ly!уݫ)[_-ٟ̙ftXvGddtP ܯ_^2￧N-qY,6`JJrfԠaƎ%NPlU*9lø͛[v](5EbdgBXlI"D"!Q6o3=]-M :˘ )CGe2 x™/LMZ/}9L6з޷)&&tɓ̞-?Ƚ-[/|YϽ}[KJmmML؜'L)=y @L6ejL̜9wM.;;''3_QLy4#cq KOv=}Pܩޟ[u3v^!O?>ݻ.QAݾ~KemA&3h#ϘYpcssc] ֭=;iSOo\]cv.fLMNNnnFzDz/Wo"JK33Č2RINIޟabBM8iYb/U|Ͳe_}cGE}ќ9f7~ Ӧ{fV.._}ݢ9sf +3Oƌhq]*2Y_];}vFE\" D,"$dK }o(S겉cRJ$]BBRNɈ03zJ<5M.M뛚656557elC3737&u$xf %1cG:xzzMKoXzGX1 R[ep{Kd.ȧEΧm?*J" i4#=JCC&򪭕^FCb !K4JOO_}rs .d2=9irl&KSSOO $GWSZZ{&jdM|>.>?"WdF@"bX@"bXD," Xx7LFa'Jķ(?R._&~WwH$'O;\qqaA{UwU$->==KtUʧ=wHIB7>1:,O beF@()2T11!5DR|KLmA{-(#CCM.,/$೷hNs[*MLx< h_jjbb.jhi[֥?H, ĘxZmYN-N<|hֲ򒒜}'ଋ99=zzyyw x[&,k_8oj:u;>KֳϞ۵k sUCiânj YYyK"ԎJuR>^?,9zt;ee\,b/CZ2LVCM.WKi4070пvMԂJg3}҅w-[  bX@ bMƆzblc H$T&c0~aժ䚚} oOjm%o=.GёÇGEEF>rĩnڵ8lmΝJ7cFD8v+)IN~_d.ښDY6=-bMʹFF47^Y|4y/Il9Y$&FP{kkLM۳v\Ѣok;i4Lnl75Էe.S=]''ҥ __sҴ4_߈i^|eĤg~Cnݾ_Ӧ3Ry#;w9P߹sL̰a)n *NJb_1 G=x, lckko܌KhM IDATtwwCoyk-{_{:/d2z^]]#ޓM|~&P&͢Pxecr>[eǷ8?mNӧu}|;_SǏY8k>UU~Ο/ͽ|9/Օ؋5MMߪR|tș3gχ:OvpDH|3Yy= pEXD,"X@#(55Q??~֭[^/V(Yd2l#P,ɇ764_Zzƍ|IW\=Qbbm矕+||;LMBbΤff^d`@XX::.ɰC׮]VZ{7"B[ԬN}njwz׮]{eT;ѣ3&9y„MfN/NG=Cœ{6lز&f֭#G-RʛUQ\"CC#n޼~}~+WKppaa 8q|VP]MZD/9s׎zmjH=u*5V(..k#xAR(BahX^ ?nݼi.{ JuJIIqqnV:fyvuswvNLHHj;z]#GDd2Ҷ+ 6u9qjk==N3ݵYprzzzFId&ҒU?c`O|K58Wx8u 'N.\:uʾ}bq^K>f!d\^TjSZZ7?1%TggBZk7ˌ##}׽ֳF׷3152 lMXGSӰ~S{.>իnݪS*utll:w㫯v!Ctu,u(l/]JNvs<35??''Y <gӦ]aT''{{+A&L[ Ez?  Yb/?Yf͘1EFv$[iǎq~<ֱ "D," XD,ߩbu=qR (.NI?/.mͯU* U.tRyJʛJdr93ŋzԇff]""ƌikۏ(ǣReֽ{ML˗ǎR99緀lffXD,"X@"bX@"b:b!L]@AGLZodxP ԜKIzgg@ exg)J%`ocPhpt3)S كg]'z*.Xp?ӿ/ϝB!%K΍Q?"#"^- 57@ 4DCo r,2X@ bD,"PTԨOO* **d{@Ex XD, b@"ߩNiMR^Ak*M|g71$T,>AXdx*Px@M.P^ B2)-gf# E)c>પǏs^=2A#GVZjکfT;TDA@eͽ\s}3|?"}Ϲ}?;C?CXy!JЏ-[Kt,Џ'E:SF$rHiW]C:uE/TLy#B -n9$I@@+vt:KZ9C2𮤿N\~޻Bӡ$#I4(hr!uZ{V uBoii-GBp6I2@KC2V̚ u4 0d$ e@GH(PfI$rP Z jԃ+*tJh MM-,,-\\||CBBBdRV;i4y˓uk7zy7f\Ֆ's""}<41%@[I^k[ EQ#[[srΞ+)tF$23^ llE"Z65-3{VLJڹ _" ةS]l-bemUeEyiiIqAǎ bf5ԯ!|hw\&MlaqB6nP( d8HjʺVx˫W~daahXWWUUZZ\y2F`G(hkV.Oڽ+.~ؘؠ G#./՛vX,29agE'&wVUڰa%fLV[VoҿV:uuw{ggKv޷/ELhMP[{޽;w31;0(аi[9A888+޶u#G5^Z>{n ӭv-61$/_8WXTVdvvb1I^A26L*,<]Smo߱cp+3%M-]z Ѥ_{Oy6nvbǠzq󔈛zΑe"H\Us+(@2VV_hJ_mɼp/wۧC~[6o:Q[{h={6?xȨ{KKHdgۣ#ws:pᴩgXk⒚v@\,VJ?>V>qÜ-9|ߥ&&G;ɱsCF>_ge26mܼ97aI $\G/ =֭͛}TtڦlܐQw.]l˯>Ɠma$y-FN O<7P./.:xp߾=IM]4kc's~W'NA16K$vp31Q ΞS{ jmmdmАTݮ_+*ٸ)%%=}-gg8w_텏'dN={<~3յF~4cUi%|(hL"qumߡ&;GK/7^kMhm#Ia`dU.bdG,^}{/4;Jt1+&888?J&j_=={rOZY5y}xEZfx9^djݻσ>H;C+*=t(3A\"13ʒcb~8<}{[;#y3g$r+1rEʜ {$y%եg#_I[qX&sr ->N6e3$I-60n z@A2VXURC!ZD&QcӺ_cd(g$#I4(h<܅8W$uJ!G!gNrrPgS-kB ;r6I2@KC2V_GB(B#R SBQ#7q H$Z bbh4Hr&`$ 41MP P P P hDs-۶?WML4Vi>\hٳ⭷ZkW(+?wL13ShW! ޱcN_ BqٳVVZ--AD3g rv =>d7e``e)᫯Jl=&2n&%ʕKW\< ''+K+*<=]]5xH|OPuu*[%޵ 'ޝ~`r]Egj4JeM͐!GEi4H4we[ǴZgNi{]^~=6uT$-_dqS--]bbFh oEjG{gfM̠ hKӧٴi&UUG0rCgoghhTZ.(yY{v?@LL߾>:vuuffn37ořehzVVffPØ1#F<~/uuk͜W̉W))G3*O<8tuOdCVZĉ=6vlGX~U/3G">w~V]vM`JԤ_|V,HDFFD\'MzE||CC_sOܵG77W??q=jѣ zk;FFiyؿc{n:4,qqnFJK[fut!#G o>SÒ%qq1gΊ+w 3(2R21=}`>Q KopYs2յ1[ɌZ[{;7ʊ*=ܺ E]윴;tP]lKM %yy(w3(B,,gZ|Y^iBm߳w2K/We gs֭+ZJUW7I;w03TBpwQ ˌ R(W$*/}SO3E `+k;{[;+K+K'ҥeweLeZQv3fs0@! wD,utܹsZ};UPxBUUqq~~Fbb qtpvrs5446ɴ:-ějW7OOM e]&ryL}%&9WY`/g>ru6jʾ,-MM%k?^aCZZr=_II.>}4E\S*GH4lDnniXgUNNFơC/:y*9y-K$K-,-={beeSsskKXS"/(U'U*~ Z4%pT˯lٲq㊤s3554<ܜڠ`oTZ&47_}VX*i/,YjBQUUZjoocci  ejHyYY|f;v~{HLzhJ61aEŋ'|Iԡ9ܚ:b@s@@@@@@@@@@@@@@@@^r\\4.\s 1xucʔ)M'nB*S418 IDAT@C//SS  %1MP P P H[CsZDZ2)rק)9/DYZhk$:VB89 !ҡel_ Z pg[Nr,do@k! O_aOGCmM#B3̽Py\ݒ^-Lg!=Z# o@7urI}"-5: /@^rRgBPy:t~YJx  @uBo+֡MI#QM%UB苢h nT Ak@6 @% dzkaF12f ʍ Ү q[ۚBthg5(7 r='DgέmBg![vsv[# ڬ˦N}})J)}lmH4we۶FVj2O,_/8nzEFFEȑ'μy{h㻙m4{_V{s-2,}Αz}uu7ZK.?}z9s{) گ_ddNݻ0|IӦ-[vxeGM#j4EE˓~::: K7^߾ǏE!"; ԹٗwB?3- MArhJ֨T:JѢl.4};-9_TTn۾mRi]]m-V[{<'Lxxo.[z/>rd7~7c}|dmhwFSZ::ro-]zDUՍrV[^_=aS3'5U,4hʔ~ه¨QQҜܬX$U))Y~>ݲ%2 Eb}yqz@?Sp)4fl8r{}gwzj\3eek׮\wܥ.i4-1us?~ŸJD.!~ 1cƍ[ 7bҥLHh=Mw6ם;^?~yͰa|0uR9kֻlz_qSAA/`?<9!8&^i'|:/.]ʳm"Ne̠(; h}R{oe.MA +hu{î,,-##'=$uk֭?q2'@?׬Yw5hk|M[9oc_{]|粫V[Zug<}_~ͷ\pHΠ,??7l<{.-%_|_}-˕J7N}M_s7xirJ˪ x^xGOpw ii&'U\tLAFTԸ:9 ;`OppTp^仙][V~Uӧ_HFF w}99vX۟|TZZT$-_dqS--]bbFh7SߨjNڱsժ5vHO/)J\]CBǍ3&:A𹢵f̘m>7mژ1RZx{I^;p(g[{xAŋ:sݺ4rT\\Hofۡ/S?鴤~J$7'EE6n:p`Ϟի~U(23!^oA##nnW*9_VT._j99YY*\^QC}څ^ Ϛ5K*-.8qPd&wG3R33 4~~S ;ƦsDt蛯;VQ4L@sH4we[ǴZgNiSv./xzodžUVXrŒ?Ϝ;y\vp"L&ѩ{ׄq~Fy{vt~]Je`fm)wۮ =<y# EjSNNÆMfW|/6uۿҥCܵj%{w~wJʫkIk׬]qPUUEEiIxDǎ^#G5q_-^i ˗͘!\FF&WgoHNݶuٲ>w۰>5)㱐zấMt׈ΝyޤNM >#3ZMUUYӕUU%yyF.>>eROx`y>֦2wO))+W9u*=ϯsg^7ҴÇ#Z-&.sX$hܬmZmi޽K/_֩_y$6а,+k߫W[?g9oj|e͉mrʔvy2.[%qv\z7ޜ4U*3s+k{[[K˸xJ*2w(jjOus=zЄB52=}:;ʏ4T?R7a¤oy7KjuqsEuuܢ|$ggOWWCZ}tQ B ͵n]έӔ׹es߾ip]שW(b67߰a}{g~;oM{e~+f4Q//50زeONI  =xv'2ٳ٧OHD^VǏt'?MZsǁǏwSo 2YsgWrouS׈b{?4x-MsNkx y{;:M~Z(bṉݹ紪V)-cK/epp||bY\{~/CgZ ͗]݇\ao?Kƌ2q{w,WVESҏ>֨Qb|}֯^{6נ o/g'7-С +YC"Q^^n|챑#kzFjx ࠐn݅[/^7PQE"s'OHHd0c))}zV]Vgfe?C{j2VkckoZYQYYY_C*Hzٷ79 C*rTjdrXfJ~R]윴؁;WWTWޢKM %yyN]|-5]<MW;篥ʾ}#z{܌̺2HuF6%ͅ6%E嘯'Lqε.|lb{"_LHnX s}‘K$ \yKcǶly)>sKiwccZU(ϒFT*JL&3>^YZ6'vϔ|5yk# u9?-MekUEUUu絵=MK1b={^D"HM:?;xI!1tsWxx?а]ʜo/_' h**.\L$WT?^\\QibTDF*P("Ѷ{ޓuXFz饒je=Bx:Zm#§O۴i%Ǐ[k׹sZpK}:uR(ʲr*U]ݼW$i`oLzkq{b/gyf妍7ܱ"iֽܿ}׷k+ᶴv>HR5ͅٶKh+yFhrsss3 﫦FѣSMML[V~wrqpJg Ξ7Gx\ё Ω7DXXZQ+R)BK3ױ)"X"2j..Wg>C'N%;65*Gg-FkiKk4jLCKhGg_~婉'n-[-Z-Ͳ+BC:tpN]mۆ :doгgAJON+٦<2%mB;zz8;I o触)ޞuuƦpv&ڞ9rС|4:Zm*oN22>gtw.\m,, K5<w{;"СÇ:8FF<%q3 Me"Ph츄Į]Dƌsk%/^Hl;,NMɓwkFFRP#UTTVQ{ѧdƬ>/ ~ O=k*.}BC s$8xI~~NN |*8̌p41d&P(44tW׶b]PWiih4A..ΐB>JZhFBHdbҔP9ޯ 3Ǐڈ+V\X?xwذ͛# }5k/T[m^srN62٣8jСYY96nݺ}7_ϝ;giFNڹt|Б#GF{QX[%8yry&BکSi3ff:vᰰ!jPbjjlTW!:Gge?.),~ _*.x`XLL~~AA!!Nnmnek,UW٥g{8vpzѣ2?7:7336R]<=vl??5UnuoRCCK w^x<5s|ph]8}i~|Mɓ"7"FV2w sv;wOٿXvnfc<3SS/\X>)if}}xxPP{GyhKK5csN7٣ǞYi:AA•_[1h..FG͞s粥Riqo|@(P;oټdt ;aDbbbmǢի7lٳBJl22rs/]<}hңGNAAkVZid$oܰdɈ}uR[+3ךR9rDa#_տ Vn%eU.^:u{n]װʿZqJe։~-_/OggkY⅓))FEyx5o3js^{m>{_K5IvNΎru6ZѩS^{ٽK$b\{}IoYfuֻolF169q"''+WPo/kwnBBΜI4v스+~e{HM"}7;v'?g?.?Ï^#?th_?/&NZ`C'-ZsbaiQ/73NZ;99:ZY61cA113͜9k٧OlR)nݺwojXT^^R"ysyΞC"??==':DvѹZFp!;;FR_HH$(7a L4ۧH|Ԗ~={_?9 Iv%⥬Ny!0ҹ as% d]~~vvN.rJ%y#G\\<<۽{Hh`$s͛֯cbb##WMx#"m›B9ŋVJe"#:-Y,[6YZ4܎J5y LYjE?.\d2{{KK3.]t3!Q>|#23hQTr!!aaO>uuZhoڻZfU_~Yd*2*:,, @, obo{e˶m=x{ +!̭}QQ~~V/eƍ+RRΙ7P$tssrjk4Æulѹgy5xޮCwfD"s.]^y_wv9֮]'nXUekqw)SFI&/9;6Gs~:xf0{رܳGb⭌vD]::dLykWkɼy-^`i)ݣgA3B&rGRI;wO g-*Çl(f;8-7S LLTrzAA tb:[ۚ~eQWZVU-efd34eIT*?HJNڵut*,,)(_bڕ+ܹcG s7W??6J_R/&}%kC20(+ ڵ3 Dr02EYR֪TZLd՛6啕..w_xx>U*fK"F56NIޟsgddv43Sk+ZeILML9r`WRi'Ei^ziDr5DZ#h˔:FBtuh?̅5x  @((YT&-5J!pp6Ys-e:u:&d< zQ|B<%a-5::^B&w!G}UB2WUڄZ/ L:5: !h1BVGCKgN$JK٠a6<@:\]#x z,@= z,pgz,@sk: M|[ػtA?:=lcɱd< n_6KǂK=KǂK=a|bNr ЖY ѿGcxXcz,Xcz,豼r3(@UK_Zٚj!h =r,3ـ z,@= z,@=Wuae͆e͆e͆e͆eFڜ]l붚5xgP(bm4V[Uy")s~HJڹ"cvûu{g7[WGǶ"@qʥK/[GqQ^^vO<4\]ڷZ;]-{ˡCم55AAz /9s~?z[WK}_ӔUVR̝3=,-}^y\^]m*vt[;ܹ%=СӦGD 6dȘ1{ҪhY,;G._&ooaѧ+<h{ZmQњ~֛V9:w_Ϟ7~vj\,nfxxGדH;7szS92TJ#pEz,=Xc鱠cA=КP 4¿ΘG`O^y%"\KBcƌp'3oĈKϧǁ/+Z]^77ސJi{XԻ /S5~~aann ~4A?x Sݻ9:vvtvٳf}2ܼwgKLtumlj\,vp֭[ݜ7kӟx6~А @ǂ cAǂ Z1MTMA +hu{y9FO$0'H֭Y uu*Z->QQ}Wר+֮Y6''#СR++ssCBzlJ:wjŊ+yL^SfRFyTڵ[mm cj4B6mΜ~ J|p“o%.^20xiS~'|!ng7wz3<3l\O?>zҋuu˖\də'N;&tuux{1hȐ6 =Z-/=OUmm~At ٽ}[uuyyIF>,.)0pҴU+WS]3_Ny?9%"}O>9jٳejei-hfץK ڡCo}0uDA0//;G:t@` N,оN'&=vLM/>uJg҈C 64`꧟|[IV*ϖkn]u ֯_^ZXlcq-sƗ~km-[[LOxCϞ2ꪕk֬XQW3F;7{s~{Jx`^X"%bX"D,KD,ߎX@kqr(??R*}_zIJ/Zuj7J[6~|HHlP$qR&ܸq&56aa{ ݻ'gBٙP^Վ#Ç_ۓ_}uSw݅:ĉcȾɁqq= j^<ַ3,^&-mU\!>)bq`qSBpܹ3go=juMZca!1,e"X[VV"Z]' 0gNv6 'GWOSQy*]b7W/iZYdo0ץRgg[k^\]/]v괰0OOKgƌy5+7Q.Ytʛoީ޼ #syҀOObG?)L=UBgǍ;iRG٩wP^-0pݻʦ5+kDS vzf̓O>`KK3z}qɊ}Oێz{%]˄-eI|{vD2iPЀ Ͽ2_OooOG'ҙ3ϴ/Ə[~ㆉy&ѴfjYpx\\ڴݷoWvBY\V^UmaQXXP{czꡇZr/iV,J̘5+_TkUFEGvF+}IFMy逸zzyO֛cҤ&& +3!!GPl޴tg=)8w^$rqRkۛgT2xE" b"D, "(K$+kRu5)){gڪ/j0d iQӲ<;[\"qttqQ+kjnrLf089x*ME 6 k+ gg?IK۸_?MeHlmnMoGnhɎ=wo)jjnӮʳBiIS\fia5}Fz[u}A.+ք}-}K{M7hcceekTQ۝8QP;baM vƜ.Uk^oݕW ۆ?Sk ~;3iԸkbjutttLY33gjC||?v"#?::]a%۶:?𷳟|eEꅔW?vCB<<_Ja<֐Դ4`}-9Rjkk%;!oyV.svG7儦[T*/'3Yu9u/ooQ`k6X"%bAD,KD,X96o7{;GVXîA1L.SE[gm~ȡe%%k }ξuc˯<;v7l0~ڪ%/ ԮJ>+jjAmh23-,L?VXYHzKNŮnnRNwlQٳ|AA/?_|AkiTrA+W4/GUר5FckkkcК{{~3ťʚZZJGjg;=Caѱc. {rrswѳs0*+jkssOҔwdTϛ?yr.7/6ٶ}+N;8:냺+?uyE}=ܝ1"5uȡCSS9V.}Ӧ-of͚2ɓ'+: FڥKLtJ^Վ[+چ[g޹;t wߗ۟Q C1v %i̙Bn樚FXe^,,++XR5u:}_Ƿym R*EʪKI&Srs߽+:'>邂;՞>|믽og'&?e޼:Zb5…u?O_Cc|0<9ѷC"Z6Ea?EwYw\97w߾]aan袢1&L0=MyI$eܕןUUVWUU;;7[ٲu;Z3* "聈XD,X`NnN[YYUUmm}}Mmť.ed{""iVE/VW ܻwPPhhNJ7w/\n0; |챇yzty^oeUR|܉66V2NݻږD6_; s̚cgE}U7ow44w4ռ%,Z/o۷eed Mmz!#:B9`#+,,PZ*hWDzʨ7fg+J_]ٻvYY 'F q]o;|dQhR);9zH/3ϼƶ,￾4s{뜮X`zm.=4lh67K:w̙ ~gi0nڼ|VT89DE|O-?gq]ű1 Y߷;vv*˗4%!oܺ|(\C&ۻ7'-#۵ j+|lIl玻5YkNF%Wd b" bA b Ogݓz)N^vdݫ<8`C#'Njt^Hjպu :Tjkwo^^AAœ'YX89y{JL2*mP`RYW'hk )> .H4|ĬY_j?ݻo߁]T^%bىݺu+v/>kjO7g _][d=|8q?ü%7-6jmjn:xo˟>}ƌO>IH#%^"Q(6mڳG,tD'_+wK XIOysݩSLLϤ oْ)W5ʦ=_H$bq]]rJ^˖Λ?03t3%֠cǎI)۫}{Ӿݺu Yl2[k,Xȣ)jH$ .egq&MZňq'ֱ]M7=pݺ_&t5cq23}} ںt޽k㼟6o0=K9~ M[rLVWn#z&h4WŦ4xP~Ν7}8cW_}i|| [kn޼5Y={6g^oZogoרŪgN,(uwW[[(웗-[ϟ,5?zKIDAT"  bX# b>>{,_~kE}}uu@?1/?Q]}gz۲'66(^x ӗ/f֜9 |^ eot!;vO<}fޥK""o 6~;{w 69'?Z"zɟx(amSx{B*uq  TxxZ[_9T)ƍ≲ ׬Y.S'DGȑݟ|<3G<$)cDŽԖdv籖eT2xE" b"D,@ zF}͒%69?_߫VaDM3jktFFHi:BS7pQ[fr<_Ò%xr7lh3Xr,[ Zg60ND,X"D,K bXM#53U&F$:Z}{l\Ȩ覥;e=.337w~ Ў]0&@p +읻33i(Hó޳{j5CfIm/}/g屋"F3uK/k?+(߂FhFS6A@%v6 bAD,X"D,@s[hkڨԈ1OFˌ1&d{X2gg"D,@Ă%bAD,X9s$zT#)Qi7#oLkH 1! ǒ?; b"D, " bA6UF| Uf(@kf*P22mZ﹵\hJ8wi B(in{.1wi>)20d& C0_GTt24j=42=#)QX$4Qܨh~Sf$zP 9+vFR#%26FF(MJz5ZMޅv#JI2@kC239ߴsFhMAhKZ̥Z#V'4&3Ifhm(P`ed6UPҔވ#L$Z' )fefL$փefh=(Pg0%%G}`ѣN?_VV]V g@@"":;8Jɤf;kWSKSYm0ƻ>@ۙ [N;Xd ?쩧:1f7-|6Y1ccΞ+))+ll]]w$CCzIIook+q к(Μ޹}Ŋe2J$>BBc]lzMuU⢢'O gLҴS?_&-'oqcn^(՞fWJϝ>_*X{WP >՞>}8W:zX~҂+1199"\߳gmK.tn]Ww0o}/v۷{/_=0 H$'91ŕ?%/}n8u;wk.1I$hFME>TjkkLZVmyeo_*#c۶={֬駝;׬gȞIܻWǎ.>^? jdaPSSSQ\qe=;]5xȃk^Ky32 pfg-~͚+#c' svN_3[36&Qҥk|~Iވ]ٹO?ݹs~uu%GرQ={/1Pcycwsss}Lr%98)]]uEEg6~ kUe2. R6II{o_Y}{6elxGϤ^۵ܜX,+CB =zޚ0!JU[w0/mƍ t:F ̞$m6 E]ѣ99t;Z#`n3Ia˷d dCLL.r2gΖ5}Rvqs~eofLlluֹH\]]qRp7fh(Pp_j&6.6G$**ںuŊ iq2YPPFmۊ21ON  Ͷˏ8q!2rhx kٚ"sDVV/[z=Wϛw!m=ܔNVچʋg>\Vfmt 54X\^CWnŹG?GO߮7ݙմc~9ԱcN}ܕ.ΎrPSs`_l^p>1q^T"ޑ@ٻoNj6{<㏵ =I$66NN..BYrr_ҹs۶.2;ag&r?Vb|W9Lj"3ǃ#ݓsGoYYeeOTNzWRT\e-}|# ?\X=(>lP[$rOL%&0R,+v1efCL$փe}0 (0{|@A23&AhRKWM=GாMc$32,`&L ̘ΝMhzz#4&!B0Rȅ{Z)J&3Ifhm(P`~?sVh: TBk(pw$vZ-F~Bh0d& FD{-ۡ1LXVIENDB`gsequencer-3.1.3/docs/images/ags_select_accelerations_dialog.png0000644000175000017500000013063513607210263022037 00000000000000PNG  IHDRFczTXtRaw profile type exifxuS[ w]1`?m4s\a_ciAg+fE WLs5I-+P؞jSrCSH?PrԷ˾M;HM- ",9 JhSZNz#JuA)i-n+.ԢmilLb2J+vvOո%rD98[LqST".ŰjPq5[iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later  iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx`uְ,ɖ-{vo;q-{PVIh)eBCK@Ng9v<{H$[[;\ۉx$$ϯAܽ{{~#]"#pyf7&"BF`Y;O!$٪0dLpNt8RM&3\k  {] 5G OlcIC L HwD0љGɇ /u~8*ىB@[8( s.,E"oK/wwifOWgg64tuˤ Ƶ;. ]PddN&pej45yyyUm}C2(1Y<%0h2+aMCجt՘/͒;wn_]cV6ZUUQ^]f:L&+Z b[,-CBCB||"|ҍkzr7W9qm(**>|3{#vVdWV h4¨u뼼{RMj˖͛0f4NI e}CcGV,2`Q(Z|K X,''+KJc*E!0̌ۈ|&BXZhk]z}__uuNNqQ}VC1&aF(Q*LV(6mٶmk4ڂ{$K-:АT*a*,0RJWLj#wZM,LYH(! d lgŅͩ(*TGGFGљ*@!g횄Tj^~vvA~yYc@{k] giI~~}"#LQF%IhKs~˦Ph8]XμL4(G*\:,`hLcyFItә˒)&mm+)-,jnONL"Y glv+ڂ(sP&a՘4jTaM1>SO^nt3`RΟ3<ܸdx\DDzZa|ת-"ꬬ Rkd9^^.ΦHEgAitJuXwOnOeѠTdCCJ%Gj4i4{ej4b(k )R_k2SkG'%N2֋}cvX ,,ںcsF3LnE[ _̹{rv?2EBJc1D@V(2y x L.'acnfO=f^Y)ϘU|dj+{[:QRU*0sX0#VxAvvqrfЯZmSCFsͽB+^?51 NfW&ډmxܢն4555cf0h4*5hᏉ"qH& o:fW!" #C+p*ef5-fɹݤ Sqpщd}SpsBAMK+WW'lfW4DؠozTALJ5Q\.FQMcɠBR}d2_`X˖ wlk=T[-8wZ[,B>jeA12z׮Ύ4-hiuR+\##-pyL&+ 4?Po ~ffR!֨%w437wptq9z|Ӓ%qq"+cF$Y )nı}ss 3Œ!(1+56zyl{OO(}uqfDmk˗/Y"hOOl,?ݷ 3: ZE|6%~~<^r:NQoU6q5:pAGЌzX47:TC#&a"{PHtl|\Hhu4!!^<0b |lp@:T 3ObhogcceahtPhoo%Ti{MQTP$#rEbggkk>O,YՖ[@BDeUGM=Ůn.P$ 94[f{xJl1lhh`@60R 4c@O0|/v^(eE,e%tw_b@YCC}@?h:Y4LΈM!doZ#_[W^ڢc'XҨ}9[OhRk;npiHF"!i_C(Dtr #S S J&,KKdMsТ\ZW[[Q:9ѫK*+*:U*2ɂk$*CMw-Ȱ" [ x`Y,33:-"!o(掎*##h Ļ{b1fQ|=5|+' 'U* c'3-s,jfF 7F({h9s8,FoB ʓӭSEMF͘z vd̶mAX<@fZ7˓7n;2D5A7e)(dcCfo È0CBF|}+ gvɼ(V f,҃bq48*ӂcA"}j|gwvEDFFn D;yےbkẵ{ywNg2!̄%MwLqwb0^JT\٥^h4Ptz4^"kD_O!tܓ'OWm iQ2i// ^M^>Xg2DnI$M_~< pq8pLwzd3 Np_Qy|u wZřiFDbZ]@is'O45uvd+vvZxu~~B:}b7>j{mgpֶA\$rw Zf˶(OO9jk|O?)-z7{9\;27/P۷CSͭm3/'>QQ/ E>>qz@+Yd7?ʚ{zFF ++MV4LZ|veް6$o>u8˻w8@"hw_#AA4jwiy׶opPƎ5VzHT6Ky탃j5emf歱>>nxd8ߴ d_~ئgK8W Ǒ\[{22{~]U%i|WGE^t=m4j4,B.L;.$:ij  tvaee))gΦՙ1. rv6bg4JeUi&23r5Gǐ0˖.^lg.$?74#1x<&S&()j]\V\P(ڑ':vR"O$M%h6t}xDwHdidTddDDʠ a.tpTB~?&&:9 _.>~UP_zDjrO]EQBh(7@pvYrRg6ka6eN-ps\೐˫Z<*Jd3>dL~X^XxVx^z떽-Wo%?WQd}-^daBax#>ƍbh#λᅲz|nntW*KSPp:--'Ak!FBYYQ\H/x/ǚtQUcCeEcVsq!!WG(*J:}\gӦ/}%<=LXo}>2,GU3i)Ih% ,6zF^Ebߜ310u9L&DV:F8N:{^Ub+556LL_gmП7;rN?zseEKL]?sbэڏҍpfeLZjNmheYzj QBͺpLb1P1/7/̜mIXccfFFzkկhrs zz枞^^÷8<ݥ*щvwҩ. ԉa qwLsqIIqI3h4e'"^ohm{8ؑ)]]YM-jo rVeθ~p6&R1c"#ᐯx!ľ G30nnne͠wtfddetu)\:]hl(-`2-lO>\R~RNv]yH##==5`fR㝐pVGٍ%Ld67WUWVvv$$zB^Xgϴ j ,c 2#%˙ 6+V<qfnYj4ug|]BiR.ZR彽 RӋRh5!,) mԚʊԔ07g4M*h),S*vvtR# aAZv"??;;# ?K/55  !YGF 0 K `h~Y\= }z܁4?( ܱ4ID 4 7oNO߻d=o7U}vt_^|1.N.P]w/;)2E.ZVRߵ IDATC8?} }R-+tRVFqu ݰ>*rŸt}~G]<22^>c|BC2ZZ{7H<9 8P̸\++k…mXv g.W m5f~+q7;8$$4W~_$dZ ̙G{$+c6mZœ34T]~~PW;8^ؾ}' Tq_hh{C?LIG612x񶭏>@ ֨}M&wΝ KWM^VWРRY CCyۉVbgkogn>F`f[Z--cbӻlqua2킃]]~?LIYW֮d \UHel6GGWaT*ookuE^?H?xZOeKl-@oAF*=D" #ίHp=?/r]Ѹ`vv23+&-&:*koml2%;#鱣'1y+./$ˋ(.nm@ b6ʆN -"B1U_}+*|}뵀F<3ÇxG GVt#.56vtHz=+En޺vm5>L%">n?MO5ǞWO=~߯}|xH?/m;DԔܜv^\;;o+lݾ=qw'7#RRJJJ-00.n۶}OsFTRI2k׹8XS8m[ZZ[Jvl>^8{ّȦߣo@n-_H_]C8HddsfWn7ֿ]}rfWZ]Q9~ ;zCKK]]SvP#44 *.*.jh,Oryyyaa}=hC/Y~޽{T&~θ86[ln9w뭿56nw3ˆsr:qoȨu~82'~sX,6eqqvEESϝ:ug?L+t[.wŊ3SE6o#càoPb'I ,,Zw3QevtKJ$G]݆ m#`֏3ޱ3*u_LKrW|7߼//t+Rƾ}Cj >ξ>9+qWl? "}kk]]cNooB]]f  qrL~t0 ncgWnuݕ8~uNb֩!atT**W~ `mhllm],Ha~@@H\^VV\TYYZZT`mwFzHJUV^+iϞ}54< Vllf\\ܬvrН! E~Ϝo&E"Y BC,_fi{ܧ|?^TXXQzn(^da+?]Bb9745;~ڲz=O= yϧY<IJe[ z}y7߼ҿپ㭷},(FF&2-E~9phZ[[GG%bOOW7n?5S/~/4Z'0pVU8KO?}To{͒йI//W^׿rr&}pD_:cx.CDW~Hc1W5kw?‹ 3>4@&XY"#,`>Q* ?`AZ F6+y6d,8Lp(,8%:4H"! ͍}%LK5ZdD 3yp+_x]5 7<D)dp@$ M}6-^~y nWvY߂ ?ӫ*4W^{m&7}99=ǎfgwvlڼdDqchf=(-*ͩ77**,*ZVb+4Nƙ}|.p%p G:;}nАIDrsܦ/((!a:$@Hף/nk5:^_U"2{MlݲgӓF+MwŊbly$=}q +juTTtZV7`-,km}}%8S(f ;?XQZ2tu8~PJJiiSsWBAN~~$L&J`;}(Jey,X0 T>Rˤ##t|3=؆LF/߲mJ œo,=&/޾I4al7E}}1q6WɴVҚ;uJ&suu\4-LRz\n0W{.4 >t;NQ[{ʦn$ҡK::2t:b0ԷB>2Vbruu¶7YͳXx.$c+ci_gH{bbleyyN=*o+O<-_Zgb??HoܳO&/GD~&$V*+ꂂf+12 u`$Nj7 n]$ UjjtR`0deGFFGY DŽTil\ݷl 6R(fff }@sT`lܼdDrPڥ*<ݍ ^1hpֆFȈj2"ݽcgTǍ׷JeWב#gYbR\TZ:0)I!\P̹,o^ DANVoIIfq-\JT(F'Nڵ3t悂A+[8;+K׎!ՑB+$t)5#u:0'Z˜qX[ 6f0,x\ketMM&.JE|Yp= kmţ1d0\mIXSSFZP:@ws`]`T L3L&j󊋆,}'. G">~"tIqIՖf) [tIz''޽Mի.Pd˙II/dP8y^y." ;"?/NL/ T.[ikIZ O?WRU c1OZ :uwrrFKm۶e+q L>؋,l%2YV,G[MF&eK#H) 0Oˉdj: n: ٴDFDZٴDYc=8n4kGdi eb)~ZV!w\d8NȈq <m6~1Qd?qù.I!z>პm_ M818 g=7 F>q3:: H" 4H" w?sz}Úήȗ^~.q0Us.˫jhlkh4k@xx|0a4*յǎ};_Q`8;/]O=uKX[S(?OI }婗R/wvixZm{G>?.'G* Zn{ƍKJeIcGǎ֎sjuU_<Ƚ^zk Rso#[Y?G|b:}{[nɓ'۶J4ڭy4(>v왶v "ɧ~띝̈:0Y{~qڥҖ,bc%EC{o'嶶?/=\?CvMtt@9{k۶>zzN/^{Ihcqq~^C8&dFF{zɝEEE]tsmg?g0,]?7&~csAA_,񉍻۷ZYGy]Oo~S'550VV..ћ6 hTqve Np_Qy|u vxy7|o:F{$w_#AAw~{%"11*u{*U]'%۫d]X̩ufK$tbkk{Ȉhg{cOWVW O>ga1eI~P^VYR^^|s/V.i4K}v\3""&6!ʒN0KKsθO'!5u⧟BSO>,>$G%r͍ƾA@&[Xi^޾}$77SXo*62,GU%--{ǣD6r08B+Xggj>_$J97zՎ{bJ{7)i =Cv6h [6nZo F=ёd#N]oL(;ř^cTJJmNӯ'h`0J5V߮ou xHf Dhm4^LMLj*ʕ zz:: $ ôƆzV,sqai\;{''d5xzͮLgP^^S89[jc}k`6aa;vƯ)/C/32$FCIb^+Ђ+tqKhTd ȹ4ȨE6caf ;[G'kkv\}}C\#]U?Ljnjl&E({{c:0gb''ss ww+Tԑn }l}{ʿ5Әf2Fz{/_iˮ{""ֶ.d43squp#S󳳚Zf>h4LZ521ig`Myy=7~| AbfQy& KJB'&~fz{ΤtuO!Eb?@[T_)Zr0=#35Jwt N7eOŭ]e0ggdWk?_^j/^&.ir]]2ٕ{7w xd8c?j4ug|]BiR.ZR彽 RӋRh5!,) mԚʊԔ07g4M*h),S*vvt:FhKkNNi{ZwqZfIͦL2ʚA*-$S,,̹tV70PZdۣ䳩X_Y嬂VFhC*5Y4T8Z+/HI!V~]l%N. ښsN.)!|/06VbmV]ήJ$*M56?}^Zf+~bFFRR_z):z_ܷv˖ukls-fpw2#e}fwtVdSѨ(G;:JK rrs222ҳ.462QQ;w$l_֖XDaT*JبUeeYYɩ)9٥hO ݭ|1q-\&;I {z܅lm6e2lm-3:;+* 3/_zrYYS@ۛv𰷷Rɘ9ٙ˕JR.&'gfQ)NAAן߯ڗA^ȣ (? ^[s|RRq)Sw_?WW&Kꮯ/-.+6B+Ȩ;wpr8>FGmm. Jkjssϝ;t/t}CO0F'4dmۖ/G V)D::4p74^da+S3p^ommG+: CZ:2x-(S@DinL2x z; Hw88NEs |ܝP퐵#;=202 pA䍈OJ'40@%Ϟ첱IMkn0B!^)c~X[sdԳ׭tu" L\L鵱ʴZ:+ʊ͆wXm.ŋ l'IS._nk%w?ӑH,,(W^p.45`Dz۫P !ho]M8DiD@o3z}Ú^y}w F3+z9xa0tw= _|RV;*յGg V JHxW_ݷ/+{ w%Co_yyKŝ]si9%|zO_vr\KWGKGwu88_^HHJϝ{Gyhs/u ;1Nޖ{j1v_`$Ieϧ\8QعsNw&y00p[}{o'嶶?/=\?Cxgs=om;|w{{%@$ r0"0pKٺ50@,f[Q*MI;Lo?ᥗ׬gC[ٳǏ K>OqAA_,񉍻۷ZY FӛԉciieeM==## t~~B+m&U]zl…/\(*lhhWhT_,vs]t;?Olk#W^޽F[G bЯ^ݓчwxJ|wJ1TuGΧ^>?Kj3{7R.=Ç7m3N}E$OYXLuKa|~`@h' AyYe%JY{y6Dz/=?>IbgDDLlB%>2݃aqy;.$G&_Ъlb28XY˩^瞅>,֍ٕ7>#Ѯ.;0oMtwO'!5u⧟BSO>,>$G%roryV޽o~&'ڶΎLΥT[%E"D$V DB& |i%@ze0έ>i#iTPYؤպܹ}g\lH9&2WɄ(wM^oڤJRoa06\f8\ áP7/E E!Gs<[[-,fW^ҊLÿ_pr )'اH\XpQQ׬Xjb|158Fzd A"31Ϯ~zҼE?|wDRlvFh* `(ы l|ἡ[o<`9% xb r*<`b0D"L hbH"yv{@ ("L3#Ju+ΞK&Ntq7gwJ&)+LM""HDL0 3Y&&ZҲNZr^OO.B*6Ϙ^w ʘ4o~TtqH}ۻ'mnwޝ6֖D=rsݹq_ut8vlVV.$$IPX3pE*QH$2hx4>4z32*" ͊Av[)/8x8oPPxxxDP-B ER\^[w춭k֜;; p>"Sd`>ҡjSHW1O 3qBz]%,Gws s㦣GSlRԔ# A.] T*r58hddeeaцƦFFXB zmmo(==m29gj`TO"='O3Μ9kn**μy3 w77+|AH(JD@ؖ9?kW05yt ;)} !S(|_(I_1RR )ɜn"D΅7CBL61 8|T$JgΜ117n Սus['uJ[ sY9V[AA!'JKel3@ /;#LpT&)`¬WY eKKcS{B"mL4-''#{UʻzQh(-2b3A6;+;ѫ!uZN8;|8}:wm3H ʪᨬLK߼%`oi)쯿V,W(x{:Q:t`̾?8t0!Q&ssaaqgOyDFbfC#G_ J$b YSILHN51 f$DZZp;#'tt, DkiͫFLQ,jhLG/YY1h6=>hC:Ғ^X֊h:T<^&驭),nm!llX,*F]T45ʤFt\? T*>(cųٷm-)S,}Uo/XYJA5-u457wpy%%D"aiT %@&$,^qPX\|S.Yfa~G18thNu111Ӧ::R(E[qSR[[UZ8Bݼy"?aCdpO}5 Ɏ~`fP85‚χ2DZJ'33#3%%%9=%lmCCϛĉ f łDX_Tᤧ'$ܼp;3lBꚛ頿ҌT@_EEFFbrRbnnG'fS(8ܓDd0\]="+DkkBqի<^h @^U6wtܺiljsryg'_^^kFlj$#C8 "=ˎ(a6 |t7@ P!@@ 4@ (dt+n+Wj׬]Hdض`ݽH"wrNk+//ƦI ^<:%G_Y]o<<tMcSW7dS( B mkӨ $*(D&*(TH94ʆVڛJҡ[m=u[xEh1h{8BuͶ۶Y[9gf+i͛"֭YIOW}c}}AAlLl?A$>I'dlΓSN7ne<-MbqQQdΞΎ.+ =}O/h &3ȳ@4LD[*ˁ* lV,d2O䀌5P(,hJ75{{{ZZ<o@5?d$UU|a~~~R ֮Xb, (m&+<2<ݷ}[I?G >lFLPЂ}}JeScLf>uEE==\.wbg9#/)駟>ȑɜ9_|1}:1V/>f͎--6[al~Nfc9Sjj3R+*:;bT|ZTC#r9i: `xn .nk˻yj\bbNvYYCcg@Rlה??6By+ gm)ɶ :9bwK$>{~MbҤ?Xf\ fk׭]ˎ_vM|ݷQ~3O۲y9sO?_YuҮ|@4Ӌ0h(H\]UUݥTZ[+cOPϓr񒒭[ 6f(3C*?^_7n>j0R2ܼ쬺]qZ9uwyQ Dp՗^'O8ٙ98Woч?x=BEڮ[paU*[nܿСL{u,\gL|'00,4,4`k۹س%&OfͲ0݇Sw\g_|y^kVtݧZ(^-NB栠%˖,RIVjjUR쒔w}6@`جYHWwrv^:sqY,`2HESaHqRyO?N ѡPʸK& -)7n4yR\?X(0'z=fsO= ;"#LMMMƎzP#ѣۻ KJ<LL*|ww sםֽ2Vƫ[# K[L&4==B!TjbIQѵuڔ>Xחn7 *"|s7m:pvBeN^p~>::ζ!H-nݳw_RB1aʕ+ߊdi8?y-'gjkdlOKK&TZ0+mmXLhHhXZƞ]{i ?gut^pa@ 4^acOi;{V=,_{ AWUUvv]硡,]P(;g. FvX#@;:#"L"MP(Oڰa^h=ΩIDAT[fWW]\R#hM1HGfۻ/~^P{[.\]<~zΝ~$[X;eˎ嬬Ʀ얖yNC&HUm|>ȥeM= j a`|X,ꦦ.LV]WToc38ӓJ),H|yz +?~|ο4XY͛z+hS^l%|>Ɍ 0g׀~MM99 oVUvuI$8Mwعnnw1>0"r<ښ۷3ʚzz2fsEEc%Z3W89UU]]"kffg7qbLkX Ϝ}M to9sO/4v8FS q#+{3?]UT nkV`CWsHag~e7qry]zwvdTyykkvT"TfQO#j@:MW H4h$P(NN66LKK~^~~WUÇp0gpԩXLEŋcNJ{ i{_T˩JOf"[YEwu~;v\PRT^׻൙L4uBi_7L+P޽ Қ`0h4-xV(}-(3St [`1l%]΂%ƫvvC&|k@c: iMnFFVJe3JׯT6 цFnOcCYyY)|=RP"LI-meeU 儀S_xR<=ȤmիM`W۟~ٳu5Tԩt%1ym޽gw||s*()in۵39Ϸ ]xٲ_:B[5I&ojv|}DU%M/6v鲷^(:Q"ܿ+,&.(\fx{{ vl/֧UV]͗))1.t]Lvvd03IC"||oB8}윕ʖVNNNN[.m@ȴ% @;BÍCD+?&ssqqs3on܈Ȉpr bhIk>jO1(K _q^ti鹹URmD< ޕҥD߶"d F41Uh_r9J}%>U* " E$4", ,nõx 3CCmʽE"!O$U)1(C-.r_}5`ᅝ5׻qqqQaaF>Vr9X) %@\HPWn$9۶$R{9'vmH-h ^쨗qt!l~Q(@io'MLh4jTUF [P=8Fu_c (a!gjlo,r[Ճ b hi@DsLL= ~8sx[[*go'(  6tQJ%p-l#i J%H4B"qڵ|_?{{#Hx, -W!X +#L,+L"kg=_7`NEt1vwvoYczիE_~mk)U@5ApHb0`FsxXxx[Ƿ_~Hf,% <޳7<L#Cǻ4V f @|`d5/~DR]SR\U%1DD<f,-̴TmmC=hIsrܸiw(o745NMXKᘬؘɓ-rҖz0+ÌA$E"LQRIAW<( ܎B hk;s矋]ĕa {zBCBC'ABQ4X(mhq|}ܸ˩Djhߗ3,s6ݘBٽ@oo&0?7$^a540괸P ARzx0K=]c1TVU55]w ek[cSkRI3tZpv&'-Z57}gs按٪Us:"TTTTvt|_~i  D7jID;(.>..,|k)XZDGEO(߶uVLrFx040e I&y_TY\]\XY"brZౣE4'dTi ^o42APu͙ӛ6~љ{c1#f_}EQYK&& qF HM#_$w7m홳vxiㆹ֯瓎;+9.04t$\0:!aO79 ʿێ÷T~@Sixckl[кzE}O/_?k.UUIff}}o3ُ8}Cqwb <ܿU@ p?pG5iSc`z{<^p..vvD"ZT4mCS,./OOrut\\=-,|ʼ%KNkoK;tȌj͊F/CF޺vcghA{2YVRZR\[SZRZdnbÆ'N | Eݙz-tmum'XdZa-[YY;~쏇LwsKJsnp­ti#k\-o?߼͘;gr.Mk˖g|hv'Crh:ٯT/-ODOg`OӵkL>O>QoA`9scNbf|yr涶Zo/*u8<M$bά IxBA:;Ӎ 8^=]WWws8B9YZFu4ͽHSߐ0vLti~vviQQBn^.N7n~LMm}s8 n$0 ի'OVM}?l^* ؀ZBf0=<̈$7XQ]RR[߇B989!ѩikgaA vwUTeee YPP[ݭT2A3e%RCH;}P5L#mmi uH#V 'ji-.JIOD =J.egi0V_D"nD٩oݸ~Vz:8۞JWFZt:8r?9ZpF|tPcZFiߣh(/rSS/[32;rA8034kj:y+}}WYnԑ>iyH_pMG~ gڰ᭷駤2a<(=ߺzmi#:T4ZcpjFL?/v)g![} 'Ш.>T?2卅o,щÁ ؏Ɩ`]}{dPcDy-G'3e <0X5ُFknho;³ 33JJd2[XggE0icq !H>\z~>O CCJ]"f,ѣ`0wZn۹ߊi֘5ª Hz>H?#o_^nfFEJn<'g}Xv:R ihfh/ǣA=z '9¡áҫ --rCۡ0,Odgc0v6 89Qp볳ա.p<3|Hhz|hYҟfۑ #>'b @ymTD 76ь4QC&2r4#@{@{l6*"P[J}lH՘AymTDZӛbmu* /'p@ P!@@ 4@ (@@ E@ Ȱ=OZH,x; ;?IENDB`gsequencer-3.1.3/docs/images/ags_audio_preferences.png0000644000175000017500000040154713607210263020032 00000000000000PNG  IHDR͚bzTXtRaw profile type exifxuSmr )z=1f7F__&uY6&#|1M-\2Ո"S$˷t@mW`Mݡ."io/6\/"5u*^c/’36TL-:,1.1Lx "UDZhR7kL9eK[GQ1t(;l +'pIDQ6ݹ1@JQ@ |Z[3 #͒3J8N 2v#?7gi D=ry[+_H-dzTXtRaw profile type iptcx=10 'vsPEG~޴M0?|6l$bVv͢XuPA/}YKQiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later rN iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx`[7paٲ){xdyvg'R(Ph-~%MHB_:h)#F[ NH8^މ>j2iJNOpA&A j:-w Z_At~I=wpED-O^Ж/.+kR*)kkGGwظ)SHe۾2+C a#Sjs\!+h֡aVq3R-m*..*HZd^:8{FGD\O?={Πmc3Ξ!Ip5~86d=Ξ[?՜l2 (1qrOOYwAAqQw`NόmkK}nZYweUn^^^ŕ榮*ke+pt6}Y|6䘓!7Դ4(jŶ B;;{($46f,_[[LiT-i* ގcG0RYlJinYsSŕm]Je5cc]DLж27Z/P,5EO kΘ`Od2)Us:wRob9tN˺H"&=,-\uƴGNt:;N{GQIʷ [0F&o5ڰxQ`@@*5g|]]e5)S(M&Fa&Z=^XșTz:]9y*/ T;36l.twc"S?ewv7/]:wG{cu E~C"#x<je#G{E S$$xߦ 8tY59;ryEűc_~yʪSc.z}4//3$Pt'V].!O GX,I͝\,d zG*><+ 9*b4uvZEbΚ*yFIc08&h4ήbr prvpd(e҆+ǾO: ]\]]^~~>ޮb>QPpwo2" F%`0h4z=˷}Zu:~_sIU hVc.Ai5-T1I 46?0qt{r,ng Q5:W!QD) F3V5ښu`ٗ^?!Y&,tY F^~vvA~yY]mYZSeYZ;?y~| QF1MZ]6ښc0̃~['iYV(5<_mXaI\N:J%:YΞս}?FNgYLK S){{{M&;!3w%W: BYzjTBҥsg/VW攖zϊs#ß_VUUQ%L11ڊ%i#\+/oO/G\JqvZtzIF Q[[ul'P~=4AwrtusqeTt‚ܼzbddMA{h2) m2,۫VS6n.b6r!_|IF\=Gl<rYlVӑ j='zFFēnFy͝$=R]Sqo6;8: lN't ~x|oOkju7g2vܲb=R2@~rqqS6tuJRkmcpFR!jĮs=iɒCzXA~_/ių<>8ۣTEei4]p`PhBxܡ4 ܍h4)Sx]MҾ>=(86n虮b ElI~+zJ̬҆vYxBdO/owxey=_{=o"K %VWjV{`;ܸ֒lkpΎ>[ѬxB;7wаY"g*UjD"ml;d+._ޯ3[i4e_ɺI F)io 9b@Y (F3఼&"R܂Ў4w75=ZFBRGl yJR,sHCd-HwHo6|Cdn?4fH܋F jH\ yn-e"NObp/L< DzpB5 a2CC5`魪J^R68!A5|l4YJ 3\w @킂g-hXH\ &b0|+l޼sRݷ$o͛o?tHڄgz+}<>y6ܫjAjillWt:::;yzk455--Vg PcmmVj O(9y<:ro"-X ilhm+j8:p94D/k41bWWPD)Sg:;JDrRfvsBCFo2 ʺ%*Im{GoBVt4ccc'tw  fjX(wo/H4Z74ߟ2JYWWYh+rsF``d560 몯.)jiQS892JggO/o_߰0_mp[&mHh111Ѿ>|TƍBd/X;9]Lv8rJ-m*(ɩT6>>>\.20׫TtQ4֚z/.v4kZGg'x1oܶm5uuJ6((>>4͕N `2Ӌ%ͭޞVV[S6|/Ȩ-vBc`bZIIKs[B{'vQQnb.wtEŵkkjzz\?߫D"‹~w{Q&GA^Q >h \Fh!,ȶ]]=@`!Bk%S*Tj24}G3a3ܳ[72RoT*ec÷I\dz6 `(=0$񖗿w]~ZPP+h\g'o)S[~ٳ=GT&Z-m;ٌ‚^ɴ$'())"at-rrrL50pu{l"?ՁÇ]3YII/^JZfGmk9|d޳g$umm*7}e6X1m1,lGjUҲkkΝUQ!dO$ ]j#˖ۍѴeg>s%%u ao@j5x('Ve/8~1M.7]\V|j[**j /Y˖͞co==N<P~ʖ-?љz}\t#::XJEgGKk{`ݤG`bfI 4}NgRA|ʽZ *lKST0kV\uihOs2fAF՚c8"FsvNH3eN#7?sW{x-4$ kݽu'gg45'%y{hGHUw WibD"[&Fx^qoCCʝ;?ܓCK|̯kQ{(jumMyYDߴMIKcc#ggh>ܨEY:H,O&mYi p4ΖOI~ՃQh6. e[[Ks_^{{тmmy,ٝ冫t0ކ rEsKUUIqgN8x45loZn%uc7i)x{GG{{URRWG,D/ f``Pc38z}SsVfVf}# ۋbm%94ZD ^fБT=~*h˩QTdwD\Rg98Omm38\Zrɓ:Bw96{%>#i CC(NɌZzvRM{~Ύ7v'_[~93*'WMHxS'|;z˖8:r:]ooS 3'0.wM::̚{>8p@+6ZYqnٲ}={*dX?}FRҴid7CUX#o8:'NKL&[HX޸Ts+EF/W=|(⹳|S\LڊD>>^3{Zkz4G|q1UU{?=T׮\;p` RCzzRegydbyk>ܒO"ml,7ɺIs'zz\\]]]%vvU*20ex<{P<8,缧i<Μ%-~i퓑IZbiݩQJHZ:iT5 qw >}' a L%hXLP5SHYF7CF (ԉJMZ4TLF|ii,K"Li3bpki, {! W7ҚI!ph/"& 1!!R3"pX,Ůbi i4bp ^fVf'if =ZZ=%f:Ҙf,nCdnҬ4\Ԥ܋&HX(Fh46曩,gUv i{DiAH9 cPC&yn-ˊc<:=i hxΖ{  &(1LfxXຠ@5 c p-W1j%|7o~萴^^~z,Vgv8|Vdln꫷ڱ_xl?85^W>7yf|TG,QaɶW[^Vp(,,֬{姞R517W2z[(7޽Օ+Vnܸy'ViB৯9Gi4w?_^nϙ=u+s އ4=h4zQPI*-).-sq??yEb."]]M74I2:_y=3*Q!rc7~kzDnF]q Q:~BB'w~G=&g述 }iGJ.5ȑo6J;: kk{{W˟xg?qr6\**>vӧ %Vhɺӧ9;dd_xW3=Μ_m;vL$z׬PS7۶}Zl#.ښs.eUTH2FkbWȲevqu-;{ϝ+)omU( {{Ȁ Uv )'?q6o޿Ȧ?fLW(S/^YTXSg9D"?˖]dIxf2TYwLO3Θ>5H9wo~ℳ J|hlk?ÍnP̈'ߟ{6:p;uHW|i!(A6MvwsCmǎx-Ky㍟,8hd?ȌƎ>;aa'%g~~N,RF88(Ҧ~oG/^l٦MKU'SN|H6lز巿]U`ܪ?+싊\0a>4뭬8'>`tWlYmZmqG{-Z+|/FJ{GjnnX0)iÆ%KMnYa-+W+FoY˗ϝ`ee0t˪3SRN?(oݶmJOԕ~Z[+%$];Κ"c7JSRvǎ&$,]i昷LIT(&N|]}N;mZkzZ,ӻe/={[o wu]0^(8xwb7o~8;{G(yPY]QQSe0xyZl{;.h驭8u䩏?pWlINpgܶ}4+t#:/#QSy<˱wŋH$S@@偤Fy뇂wrxjjju|Xge5ApД;|75kw%:;'Y§DFD~s'Ҳٳ~zU7?d7?sW{x$wBCV[~qvvnNSsRf2GHUw K9*j4`ܺ$W,,:|С v|m>s-q1WDQ"Gn._C܇Jc2֮+>?~,?ZV5 y^ޱoOjXus-J}NIhhxxdHd0=_G47{{[cϊ {ZY_NI\(;8x嶶"Wa:#3}g\P;{r3mRw7o:}T upMkNĵ(V:N5{46}{ˢD,އ6>˓I[DFyP77˭ sn"Cf3fDFx۳cnZmMmyYu^qc\i>F%&TU65 SoJP*U*˄MԕϚ%`N岙ZII+5qqZ;9RiyrR9绹{ '~cW\!1 X6&f]el9\].\I|}\V3dtXL1w8:kvqqustҊ 412et2Œ@A (p o.)toӽW‹/؞$8aM ҦKYN9w]R^-[,rdҏVݭ0HzC:w c˷& ?ţRY,á޾~9鳽uL3B!+U?z䩷zOQif^4額 vBh{on$Bw1&pl'N0PMlٖJݓW.pHaGi-g~wsg+-Zn{Й&5 >~/TēzF&\Fݟ 3j?FQ7ɏ !x??&c`P¢6>/mx}}Ck&9$x(xCe6{~v=PL[[s7l{{ MM -\_@Z[s Jjk%Y99!!aS\]-q&<Ϛc2 &i[x{>K}gI>T++O/Ogg:++;{)3;JKrsi׬=;|Jp贱͟b=|]) :C!׏||صK]4~XWSg4::$7/?q'^l3f9:q8:]oOKVmk=+ߟ# yR9}}SzzX[ 9S@δѓzHES _mGG1ryccIŴsgk4T*km(2YMuYi]}HHdEd'$ќEn." dJfS^Tɑih$yYnR&% PVWee74twt:il,*>{nA:3zҩS-kh,L{BffyL`9\6?C[P11EFZV,!\~yA efTT(L&K vtTVfd߷xs /[v1A(MHwt>Bg22T*RBTmm/;/bR'\APo2i4Je0''###3… iɅY%K~MwwLRYL')a1!<а(;<9925O<̺uaT6pPPT奧d4滺WUMaa kOOг%rw3g޼ 1hTZIF ZАtѨ39,lFt`^UYXx);-=#ߚ?uڪUsfx<^Lyuw>Dij*)h;s:"vh ==<=}|̌š.cDe:]H%ït7X`"uf]+yb::L:kjJJrs4֑QWR)7cف|`͌4Ҽ CR_TRRWMpv+M]]ee(s𾿆bD>,(7ҥ7drs3w7+:]`P+ɲ4k/(¬̌K껻iTOٳgqq謩6QB,8\OƷutUUYYi ;lmæL$6VTdf;wlFzYiA1#0A^ f>!w~3+3-RҨ"ml,uCBU]sW_w劖fF}}M[ptĉP֮{ݧ9!H22~ l7mS'R7>=xXjQ9sfȨjj5nn!a/nlT'~süvR/7ςFzTIΟ߿Ё}VH:;\'nPl܊k&,Qʙ" }22IKL ;Y&YnIK' i%2+4D" iٵ(A.Xb((&4 1flih4 `F7Cn55&2⒆<4󚕍.b{iVVܞ^1,iUդb,X,vHCLEQ\." A|XFbpZZIuf\PLhGiO ϴo\9O<1pu8OIRG JR,܎xL^Xbho#m2 DdeNYnA" AS0eO&>TXwJifRZm!po Rf un,,1 #c䈥gE(TXYVEnzdKK{ݭ[?em;oONvs Z7_o^ukZ~}ܶw6Fc^kmY,As8|GXyW,[tނ+19qPvvkUcb+E7ߛޢܜZ񐁁¢ֶ$WFi[MXl2Qi<^xO?AVwu--/uƍAA\.^ d^p^Zat-& ST[(L~塡lvk[Qaqq{Ou`nA1syW=ϣ?r;:2Ϝ.*V(˽(wd' dizBg0Lή[~DĚuݲ@&OIEJ{ǒ...HۿW\we&ӵ+gșlvqT*&Ϡ5&Fc&;_.W4YWoJt:ͦƎ‚~  M=r*%/J%h\9sW_>1!vXH9t⢺|Oddk-bQ+}]‹iSpp Wdf8f=/GYYQ(Ç"vHp5U52Y_Zb!C }h4*BY.~džsxyx ?/M ߰$Q/$$"ϏNE]]-Y<.7JSRvǎ&$,]i|F^^~2%=S0]\ obۛ'A+N>?lpVrr]^og?mHv?m^xal=j׮>Ĥ7.YT 99O:on_LHS . ;E`$QZ}ʔ'L(7Q8COoUUNNiiG'0sFx؅SdHK͕\D|ݍ~ ת8?#C*]$6ߟb2 5U CL+W뻻I%:&<ӓbtyTޯϟ\nlOK緵 l7>L( ҿ$R:-rvژcߞ:$uqYr[(~OhhxxdHd0)ӒD$LG}4}Wb2 re[{}C]=c08\VzYL's8$G47{{[cϊ ZY_NI\0i4 ~SOX6 xzLm_ݿ_]~_&&8JxzR(-;vۗ]\,뎟p=9:r8%E(Z,\49 sr?_OS(+{.giQiEuHuySVVXP[DN/l?;giC!r|k n>vQSut FSPPU@nRiTIKjd[OAj~|Ԕ_PfDњo`K KJd &&89]ں+kjz_5kzpQ~9l&5CnfOF(Ffq8>Lǂ7UB#}hj%kjt:We>>F38dd4XL1Iv wr]CǪV,5RYTT*JܰaLR2n6ό/)).jn#|tӧ;;O:{׮c0L&TX[GE=?i2i4o,HZ@l>~Ǔ|3x<gH\q2Y]f L,;L_;$0((HϿ3#16oi9yr7qLNΥK/;_};:^g$/q rmSzN<{vd?oqcbfϛ0A"iם>ן}cGjjQQeU}CcS8+ɳieez7.еFq|~sc[زe׮K}Rg|}6oιO<:z^ˮ {H[=zndy(#p\|49^ZRbyzDDx*ۂ"W.S*7g25jՕ] w\lTJ`& "nOIFK<-~sq̖n6;"<4C1:uZBX[PPP Q 'LX5 `k^yE/;22S*[hBnʣdߑݹWR܊N 4mWa݇#W2ꜬNP2A"$D"J$(AyBMpՄ;udX>7ڂ J9\Ϳ'G2JNNP2 Qrx%(QD'>(`NA(%;AQW % ,<'+JP&rsyju}CKKGn^cFϚp>Kqɏ?n悂W^ݴiٲkk˅ _|?܉=tӦqgYٻv}**[Zѽ tS*Ǐ`޼xl^^Tt豽{dݻuO7!ag2ۋD\NA&h,8pO|rHW_1CA&C1Fi{͞R, x,(v'x(Mg|:b%KfMeVKɮa(u/^cOh4,#luϝ|p8:omn?~3Y:e zS߿ko_jÆeBCttFwwZ[ 3Zg̜9''Lb2MܜWQں捷Z6p8۸/]}Xg^(:R< FϦfdAMfqwaav_𘐐 h:~w۶7uiO>9i^\rС_loo饵y&8NU2RM?kV8>Jϥ=|믿܊7zklH;fsP`Pڢ斕=z׽VX6[dP{đ?ѽüy^*׽p9l/;gXp4ioԢ TҠ=_}yҪW_> (pM @44sݻX ;O_{m woCCGskވXᡡ7aݺ϶gh<^IN$6m+k,Zx{Hw7cǎ2e@ŎS_7ӳ/! qON@FI>.ù!  R> L\].XxbbƌOLK)kHAA"^!"V Rލ;Q '|_S9P{CC=${'IO>=0pDT{o<\3jٲ߿6f ܚ̙r{*GΜ>!7W]n6zjKnNYbE?2p>I~bog')=PH|?;u̬_yel<n'e|9֯Z5mXqq:LB7,K͔= ;.>ShԥUf;#upR&ON'Ye}gZC '3F* ssPӸI٭wDѢbbY{ C^E[[WNYvwX{np2ѣ%COQQ^b-'ZMEDwumAwBĉcRJ]ZS;{z9Z+ JJL&wl_TAÈJKotI ;U.=σp?z_ҵc9&kG`,6I'\X'3T\]٩7 z}f%nfXk6dqF|b1{-t!Ww11J_CHFcaaNZbEG'y{\Fq\[3,媽Fb;9?iqn_v\Zv²MKn T}tXH5zC'N 5c&5lC|y/{z\'z0T{ W/,jV-&Ffpz\(@ ե7B XϟēS <.Y[>ݰa[ϋS("1I|30uF&uoh*\Y&kkRyQ_10JOzȸjoWN& E,6 j?~O> ,>f̜9Ӧ-\4a_ݞwu>/"r/կ9VNSQEE͞@kiNn{ ,ں[!G GOo!7o޳#t_r^8] wO7" 4C!eϧ76non),̨’,HH QzHBn56Woe76dgjHx_`W`gDk)Xuϝ?WUC&3ӷs5"-jp"#c{MY9}"ј1cdRp]]Zn65֓>JvGKkQubBBgΜ3'..8C.̾~=-c|}M梢>y9Batt(dbUlk52' P@羽b14\ *ꌌ=UE"ˤ'gcbh{fϞb>m>8wJ++:L&NU^aa Vy Y9Ϙm}[>+cI܄LKsEEIIu51x>]"S)z}v۷ :;==޺‚ӧ+*mV /:ݝ}ۇ~yf117&mlQz̝침H&?Sܺy3;kք !bwS?pEF|`t2$$*J.h>t\ƍRy(wG'  S̾:imUVVGEb. 舌P0FcCŋg?^Uz!!G{v>dJܧx)Mm;mѽo?>=!!0P(uҳ>֮R͝͹rJ%q S&ᇃ~??ݥ-UUee :{v\\<}pycdɊΞoknEBHR%(y8~cDxzrFfaa[T)b1`0,&N&Ϗ2WF#"Gyx80)'O?[QjqB7/@E&77dggK;>/WniqLU(/Y,gDF&u8/^:yB;$dp %ԩJC`/=ĉ2iX,.3:u"=yĉ FY3'K+*jh IDAT݄F=K//_0]>6˓AWQβw[ŗccׯ߸q<zX dkuOϢ cl?'PjoE=OKKF?֬Y +h/ؾwwOy7RlŴG9NA J+h286z% AѤ;Cx@8 V &*rcb=-~paP;Q]Gqqق|'$ѵWVh2]FN"1N.]HpҠwD/\r'=Z!'ocSsyyiIU3-ɠs"ϕ @ RX<=]Mu[p,/x((겲rmߑ{6Ƞyr_@rX555uMͺn}ZӆǓɨ%oo?/ЍFfyY,*U@ kUC[{9{l6 R kv8z{[**JK+\gXp8 ]w/8S￵k ݦ#'߳υ E#?/3ԁ}≠S0Ӧ‚\'0P- `4FF G]ݕUYYvX`,++(4qcdž`^d$JUN$26QQTZiIVVqqQ* (7@R\P^(=D*?…?1cF`2 '('W]z{KKJb'8XE`zzZKK33[ӪL TaFcjuYY^^a!&DEt-yyT*VUUV-0ospѵ/..-Prjj+*о8\LL/GSQR7}h<FrJy>M]w7! ç<?-9ٙUxO()%%6gLLDFb sↆ^L_LJBBFJ>3?fiobseW%ƔԂ:mC^c;^X,2]Gz{FETnw|޵~xϓOo_}Doӡ4ګ\0A-Bɓ׼&O+0 \XL\*尫j]{Gݎ(]g1`\'e1V}#he&Ť`]Mڮs8x܀~MWq R ֭w8DB.g`[P۠0 `nXCm`hk7,-j1L& 46B:׾!y[OZZZ۬VW*Y_#G$dr"9AwىLB JK#ah d6:]IK;L߅łv;GHORi2c&RB=Wb0@Z[W64:: =&l6 Ro7WW[o/{{  ){RJ}ψ$vQQFdFɹG%(FL0pAh@ @$}mt5i&xx,'Ѡh4fłHP_YG*T`qR/CIE(АsZ}]w mp9ε9^*JP*t:A#G"$D"J$>(A0adѺ+ Z/Fm[J65s hҒRS?=)"岘LVS-Y'ER봍2Ip{ֈp`zZmg#FEʤx;c"bt`ˮr0dE J9& %W{S=nM/ff ˣΎZbz{EXU&P7deUUe^^}rT4եkPRǽӫ#TVf||hb1dAhײ؝!V}wsJ0w;UnLL)t/*,`}<|k3kwމ%#02p"Qp~xL6vlxo/,Cml2l 8==ڬSOH;V77t&渻x̞İ07A7^vn7;"7/ll+cFnd:Ǐo<(G=\pCLmz}_* MJzKcbB7M&y\> Qxtu/^cOh4,#luϝ롸>5C~{ڴY˖͞bLZŢÇRRvwb9N3}ƬY<330ӓrMK֚5ӦI%7{-6[cә3}N<91qɒ3|FSYR(d247gfyiII˞x3l_Wi$'[s.^Eokxر{_~w{.,N\BCǚOr'<}zbҥBnnj1{Z,j'OUUcZx 0Rg!U#d8g60g Qŵk^'l)PXQr8q1=捸*p3֭lKzzFz&)CGrF+;g#G45ɼgpwoDDDEI$6;:oEٙoC52ق^ʴ"1kro>CE md{y[R,̝68}G =ʠ8X~NjiJ%=lV_,*+Z|2.AX,1ujL,SZR[gEF\/(dW_l2y,X7T>ڭX*U&\,X7\ù ({7L_\RI$GQQCCy0 :TGѽ{nݱh8qԨ 'O&?h MٽO>9'gawqJ=@ (lJ@0OfFaAIquMSsgg_٠z{mVAv'(m6LIy2tuvvZ,D"dR(C|c48NŲw&  ˫p3ξ;;Pi[겝;~ժ;aǏ' c 臭=߿:|,}n=qH$ 6vʔYI&MCa{otM_H^|ǟ &bwoj&G}x(?'2M qy\. }fK"Q g::PXI%T4ln׵u;kp9Ww  RY7ƉNե7 }*CF*<^!`4K*yhjɣL3% &߿sק5zk Xuu]kmsSB»~(xG4‚̌.,,)i_] `(< t:h76jڛ5P(> BrTeZꀇb?8Czyc;Y]s1ilv``pTz8K)<"^^v|zzckP˃s*; S7_H;[^{Ǹ!l<4t%K??}fi~]Wԩw]]^_|`Bw𨃱/XfKb*E޽{v[ggt'[WWXptrrE\5h/>j3gVRLjtuYK37n/pLE;--e!!QQw'KJض-+ PzK<*bim)W_8|m-+8'0/zmma/zMh(333kX,"(53C(13/Zî]N;998,-xyEEMxĉO? WI/Yjճp?tHm0wTĉ O0گ9+-8Z vgÇ~adcz')?sfدy̵ߛb/NKKN޾=-hRBoS&xo ,ϋ[rCw|sϖO=`2,PMf6$ҽ Pɾ>ֆ?)=ڷĉ3g~>=}n FjOĨ(S q$]ld'% V$dw1=gl|pH*_NNP2u8t p2(#fD-,Ag,b{z cÁXU&Wz7deUV^,:w>l}X$qHL,贡u8 =]6aطړFSS]6[|OWPKW X,J" %++3n||L0FckKUeYYAAfٌ;6$D6x\ҥN&C&qW*r"I$6H(F]Gϻ2b247jux-,M}s'U[㍒~F %(`\=P\K,{{eQF̊0q0'DhlWH<3&.ͩ*WWU56UV],*.PlPUz @yܚ;VNҢx ood 0+0ZuYe^a$R(98"//76|x\?1#"dkA$D.jڦƎN?Ҋ+H硞"&S}~;4;dsr✠d0ʈ-Abw+2nZHjbEWl6]GK `x{s8ݎ[p,;bKЃz B9fKtZuM}C)h0B$Q^aV6[KpC1w(1d N]z8s|QQnKGnIZL[p|>B:M|}O83+;FVW:Ja06{Gg{[g2Kc$&**5ruuq1OywϣPPdBaM+)>zxIu#S[N`LdTV65r9VksSSLr{p9;w;?iR YN%0zzpnB@jk5->>|XD"h/h$n"}ǓbFSQk4\=OD@(B=0ZZUF#,L38)=O$'RID"ꡂűX>qq^h&.4X*˫;|4IAK||٬3w??{5Cp7pa#DBB`Z,MEE5num6CO}å> V+RyWyq8ݸyѡ31:_%>(?VksKqq^niYsfG&n?8ӓv8:zt&YL[ut^DFMj+vHy\D$a{.+sh˗32.ʤc2D`hmih@ BiWu%%iک7/`s *LF3X,]۠oבI yt8 ʏODDpј}bUensm"]$&JEFcwfwEC҂?mEE G9b0(f3u ]x<#Y(ӿސ7TUc{{{yI\&SW߹{z(T.q>͐I}K).t2 ~{(71 ydd|UP]ijl54 G"ilREFFDx(n4Pb}G % ʺz4͆hHw4R.fmptTf5F-+EXQQPYeQ(4 Uie*bi45%)&M'b3x uYuFsRw< E*/j n8TE!W 2 h=[&ʤ{ "M&+~hg` y!,?gNBBtS,^r ׅf< xM'N?SWf47N_?ɓ`t۶yqeezi2|͊C;}sov]b [GYݻС~ڰa/!3ᅈGǗ9t$l`pȏCF: (i(ᝠ(+*Ϥ35^Ф_4&F(b{z4YYNߏ8~q޼߬PII)*imXXL?&f'LL r0ĉJ`PBoY,3'*J$"gݺO?\hݟF۳Ҧf &*7Ͽg[+OA{ЦMooܻdݾm+oC+bED|ʪ vrnvtvMtkv7lگPB.W*]g,FKy%%+FC]X.7*rh?? v'._Fs\,vGQ\CJ](AxۛOr'<}zbҥBnnj1 ;8fs]e%vWؤfkk-+K;{#[~9vsz( Ȏ vܷ'2r)}vyb"Rv}K47y̙,6ok-*D[J W6omn?~3Y:e zS߿ko_jÆeBC4,M#st|Q*Exر{_~w{.,lQ{-?K$qS.\8ǠKT*WVS6.akqo},ę<42N>LyP 6onW~eB kݻ# T_mXPOD,xX,WH$DV]Ҋ\ fG/"dNwfg<4a: %G]vH]n-_l줸81|~X,skވᡡ7aݺ϶gh<^)N"2w/ @ OO Avk׽iBf}pʫok9B^^[qS W6q8hڴUYhs "_;rBzbbHȔWb}6tueewp]j~wٲߴz?Cf%L.t_yDߛ/<6^iyI X"TӜa˗er5jn78: - /sO{x9iUG~5t0D$n)*L`{{{&ӝ;x({7j6Lx\RI$GQQCC}?bX,\!w);s h ەϲ*խ]ёVJ"b06l׵$k6cT*Fܹ#]O> :( հ,g>:?gBB dB !d ("*Uڡv{:zommڭVUV-n&?'ZQ\|h<99ON }Qˉ^hvebN{[{JVo`…4كu<3oV~e#<|#銋z庥N֭hyzt:!:8ZnWPK+Fhjj*+kjUt_jkUj:J,0le[{GF<sƌgպ eO`!NL/VN"SBBN}*g" <.hu/|ղe{'=tZRdn`i lldQR+V.[=Ql}R`VVWT>|E'7is^NOL?M۷o?\L||.*=ݎ\!MM==}|H;⥦9;[Z|d.tNn/b==_AKm||F1c i4e5jVИq\i9lgkm% pVz,j/]xʈeoG:I7trrPkΞ:YT,?|R(2JRWyG`0ƍ]&=p g`cO99ģv{9n*q„=ܵ7win[7n8v\񉎚0ήU`4 (yopss %Xe휩 9cGjjssGGO7BllN}ѣ\N,6eǎÇltB67vt >=<\&uLgja(W6mJ9TXV~~s.Y2eʈV"u+P(RQScCsrnٷuk[Z0]-^l큃{$';esZZ||g'dbY[;;  gj:أ%Y{'"7ŗf=˦~ۼLLl$cƼҢES<#?Zҋ۷7o(ܧ>!>裐` '& E7Ad?xЮ>;|suXlӦ_i__&VW k^ҺQD x2VJ_|4mۗ,Y:7'(h+LٮDHIqkp%<+0g P2 \wHI9xP!'C&5ND6":;@faND 'CF zJ=dAi P(paJW_!TH08qh0'ABQbqz(W-i ͭ'aW^y晉G  3g[/_insoE۳w'ts>|{OѐGSݝ6o.wpQ|f5g.=2 #A-HOlk3&fÇ[(7Sk32\촵2uԈ1|)36vw1btCQ;/w=ݱ~'J|YjUUsק~իbK/ǟ7?SSõ;1jX3ΙUn:mڮ] 绺RзÆ{~jBS#GZXΞ5)_ڰa :VG57I^O/^>ٹ=?+ Lx45jJ&h[GtjFђHT*N"i`PDQglYL yZmeURҾ.hAAs_x%a}k> /P  / (}TdNdr[[mm]]wCkmM=}r洇ǢE/Rw QnP\պ .]**nhT(LK {;oﰰqqR&;HpumHҺ/|'tMMGZt"o|ܹ^^Ji˗ɡM_VרN~ԗk'ݵk+~ۏWPFx̋皛&XX,qwXz۶Ƒc IDAT! 4/8'b0F\T(UwwwnfFldyJUQfUӧXL67]z= V~8w/M23nlUQOPpظQ~Xů'_gmmc2 }kr:J"9u*) L7¢YJfRILw;J88X[tYY55uID2͖Hmx\]BD,XtĤ={֯>|a|Qkjٴq2hb5 [iԜ{=_QH DҐ pc[Oj{_?RI1L&v{h**v^lO x<ÏsgQ2|?߬\k˯rpbE!!1PS(0h /J-lebTH{[{JVo`…*}M?T{I1of扉ݻ~}_52݃"#'FO3͕\CJ:}+%Kg#>ݼ[K+Fhjj*+kjc_jkUj:J,ݝWGig_׿}̬oYͲxR+.wɺ:ONg0B;;>+p Se0,EfFF7hzf}L&A&SR+V.[=Ql}Ń8Vpx9g$%uj/0R*+%lp@MԩKo.TyUzzّ(}wKMM_svu22/]/$^~˓ꪪ}>4n+'Nny漜,7LoGd*\[Cw"!FI9}ti1"X,WV.&aoGVפ=uX.sGKm||F1c i4e5wʊRYZv 548:Ιa5T' &NpΟwߥkkqmh޼>k#yoةR魮 c5k RPp?? 6fp8q?C,\"IO߽7ms_~EfkΎ|_λ>^_dcH2^ix (pC9c=itq#Gn=qB֎AA? Md׌ ΞMl5!!1aÆ+WH$sskkgѡ=={ș./^{۲9-->D21z9pxTT@ SX 9cGjjssGGO7b 66SFlQk{2Zr4%J&֛IJ˓nގBLb1$?|ojuf߿K/nޤ%qܳP3?o8~B1g-ڸ "˯Cv\]]<dIJe6On_9Ï7deuw߯/$~Tx-[$/]@<^uD %SS3R" xm[lVzMDD9q0(( (2 טC63PFk\5!'J^=w=`(!`DDan#dFnHr07g%"BHr^zYEbe K1gX%#ga(20׭fz( E(5rd=r yTj"3(<{v&$\XVN,&L3w޼p qKzz*N޾wgg;9-X͚JBQߐz39٥uu2XZ{{L<98Xjd3];>#3%%+Krs=* @"12uW{ <E..IN޼rQ&͝tsUOA}kĄzoAѣF tz<';7x#bQ2 4̶6+1cb&;|cO5OܵsBsO>OQ0jӵ8k$$(!!f͞V8esFӓgƍI RE.?Vzx'9~ 6QnD֨*uZ/*x < < IY]?::/_N>v"CkkZϛg=jբEaQ\Q8k+ZZZssk+GG?qM4)0)/MaK|=nڒOنJEeB—_~پ}.'LsOEdeeii ]3f,^Ɖo\vSܺUEE>>AcFLYV2ӵu=#~nq'ϞE&75f>oߎ?NL41a#"zY&PMYw~b2W|睰A:' Ow =:L 01h NLH8~7!_tɶRB8*_Bl{QOsX, qږֺچzB -,MLO޹3)1-(TUh|Ӧp%b8" L1Q#FF"KD(45IFb#OϦs`yDbǍ=lH+V }e?&-2Nwv/"Sw##_yצNJǓxzۓH5￿}J=nK,?#tpݢmK;{JsQc d2]rNuNǟ21J?T@@HH[[^މ4HV@\U7çܞD~IDL".ڰp&]Q* fծ!!A7/?K&~cǎʢ*$! ;pNbؚmN"{erqna6#e.lV !Յ_Q4:qH*?foٓG>'ǎ}ٷ^`8+nyzơUXȔD\(F Ě"*盙1ƜJ|Dp T*wːRYߐysye ]2Bf4j#@"xv4GL336ԄB%tZ+k!oފF>d`XPU]]%Wt6&GadRFQ ;gawo{;gس73z\/D~ (fzazzGmjHHܽHrvN[N@eDjrd`A!3Qe@`P2RYVvԁWPÇOd#Ѯ?*yyfQ"K&)%99%um]2BPLLfV"w@??)2;;+KLYD.65콅ڞܪʦvYJE2l3Y +K J;ďϳquXo{?Snh,,t)3[L;{O__7+ wl~e 9^ܹgf..nn|>W*;;I$֖_p䉓DL.|ܜL-,>w <((220Jddtuv9sDFFGDnkki" :BPԨvv,vw75妥=K҅7YYUTX_J E99Ȥpwl~e6Gjnkjh€??w[iB(ryUUNN^^{;3nWd <#GΝ-+wsY8_?FJeMmvFW6k+L[i@@h=Y[BĤg++*Z\9>(nm+}02ٌ4rۿRӻΟ(n r-l~`hzE<\NW_QT\]ݭVߪe(46i4bFb f$RgWGGvǯ4544|ݣRf,bBT>V(2V[D[,D+}g`CF PCp#CF42.((/)!)T*e!:999 L&1zEKj23̸d pۂNT46wĪ#u%eUu -]2\RZ BLֹV92d~`B`PI=DnۧPLL,NÆ?Ʀӧڴ1aa.L&Lr8^c""݈U?X{BR<_?Vg֖SE$Ʉd**Μ9|$'~Zwd2C& ʟ3J5262RήCܷY:p9Zm[{kkG'W U@::+*˛QȈcnRT^^Qy麺j*+[ZI$+kw//{;@,1F`CFIDC)3vQBV"f2+JJ/b0=<PT43hrr/^"<Aj4斊MDC&Xvv^^NNN;yRupsJsqHzr'P@xLBJe[FPF!@-HOlk3&fÇ[nfd\)ﴵ2uԈ1|)36vw1bqrye^MfBsB>:LV\rRvvK+=bLx0oFBȑG \.(tt0˓sPTVeg涴zxL0j7w5JmV"IrrbRf+YYu 1*o*U]]zٴ܎72bhO&vNnx6 dZRI$Z/*Zh$JӨHCNO|(Iڙ0oW麺**KKu:[͝^^VQ7(GmkklhjV 9ICT*.ޣ++'䓗WVmfvs``p Mkĝ;pNpbWѣM={8'G…ԣɧN^TXXUڪP++g&M:*W(}Gmp8;OfPZZr$oTVVyySRe\Lyى}| |y"QRO?ټwۼ33/׼VFߊ0_hdOTUu) V3Ϗɼ]頸؉}~wXffyE}}{\NbOt /̚5b8<;~:ksFw߽+!Y7_uUSqbU9 &̚=Gnimj$F믂[--9$Rf&jRIL!ځ&<ЂcNTT6ttt 4646Lؚ˥@ (uǎ߫>ݶJ*1cS|NT^Qe0AggUuNNAVk22:zt@`b47:p(aoC"dɓm}ڻkVp㣣gϙ֚rtf7T/RUT&$YD200f鯾&SMW>g߯sΝ{45ed^<4ᩧ&>L33#Ge*.njzwűNuB##^e<Wo82d^ ҨK ~]jzف̈mL>P⸟lU[|'(8rl\()M )߮_fN/㣢frr42l%B6vz*cڴX5"JuQO?}STJXXX۽wSc23/]45?ёȖ\~gktudZ-dbb t&&f,#utvwmlL&یB).&o,)mђJU\.'ML'joP$3S3Qkkq+%nkZz ˄ϓJ=<}li] ݺUK@`QݳgO^@0yo3? 1wGܼa||Blɒv.":V@}+M_IA$;vފŅiܼdߧ?WYe#BpqC*f<Ϗ>t$quuqrfZ?X:51;}dzsuw9,"BCli(҅ D["dJ^nWMءT]W*6bLR=88X[tYY55ui3w. B q$$S KQ~5}gI& KuW%RKNg{zÇ6'W5GlڸwoirbKlc2| nc KJtϱ.lݜbu:u/õzt':^VVG1.eed_PUM 7K=ʁU\tdCN7#Z9ǔ1jiH{_cpHnի--R_ސ\`st :2 +ls3/y}缾!3D23rۻd2YWWL.רha_^[L(1]R tuGđ>OݲJE_Fsa(Myͷ63OL5rywk b^RY,{(ٙQ)fl2 `L6pFvv^իmY$x{Y=PFˢS:;;:dD̡VWT&&}')!!S>3rjٲ{G&Tfj슕˖GO[?%5BQWWWN`XLo\߅,&hq=Xi4>=2爟3fWT榧=o_UT,[xkK,8q5vS.]:6R,Puo}{V2QS_ڪVGTZ:'&VU5>>Ĩ==l: f$R]v}]CCOHQ[ Kњ{xws7T[[]Fq8^^"Cx,)Xq}d21nEW0:4H@_Djkgki9VWgppkZmCcfsottllh@f3Tąk0NNvjuMS'`)==rEMdUgN9]ZnLws3!X,WVݢͥ6>>GϘ14ʲ;eE,-;xpCb̍zJ̃?_bPHFlOZYQi G13g>4s3&C1L6gKml1//'FMk[Aa^nuVIm?q(P_HY]]M𸶶R[6Djhkl$ƚXihk V~5 F:z_'6lط}N) t?SGyV"u]6 큁fryUUfFjjbbqck+#6SBFN<}j횤߬YVL"2*UkkeEaAcl܉R ΓȮvV\Djj,*<{̙J#cg`;{È[X(*޿oZ+QD).=jjkjoojfj!03ci$"g7Ҕܓ'SS*WkZ\RftZmKkNWzz([H==meEEM4]Hv75P|w7Gʊ8zT$Z'訪ήg;؏0sqPPFk;>/8W~b<3߯mBAROϰ0__Dbf>`i-;v>e˥K.c@@D2ٯ[d{mPϊ d2yZ˖8wOrc[6wvH&&Xg!;|2ل5c…gS(~MHHLذbF8ōٳG}XƝ 2\stJʎ= %x{OG (jMvvє*X{$)髯V,OJU1p+$qt 0߈1LfffnnEyI˕U*1%00b@pXF555cɕř%%z,Z)ssp1" ގǻн75ͩ(/*|BLMy\+aFuv" ЫXQD xjj&VJz xتxZEi=\ "|" 8IFQeAA`PPFkL"z 9kE6"Q{zz ҥwBI9hHxzCđd"eD 3ϘA-\`(Bxrhkhj$B M#FBE!K13L$rv"ᵈ2 pn=Cr/ 4WW*#枏x17^w55߲N::ؚ/qȎ98O6nHzz]ۿNdПyO_zy|o )::-):*5^$%cjE`)bͪ5k×,c4 (X晙ii&-ں{*.N(7/t/QmEE/>}W_*(3#SҮ}|CB~: Bik+ȏ?sɯq%%ee _GUho/,pltԷ~ܾ{٣ڳ/Ϝ27 \. @Y:=…C5-<.aa9FTH'3:c5;w_]SvTIs?\dk2 t /k9RiC㎏""?~c$66FF$RCΝ'N涵{,a-^edVmh+>K9qO>ǘs1 ݟс41quNJ.X\H![PUVV Dݝ~t(QFyD">>?+Vu(L!S_O U/,%[DbPs2?7/>͖ ߆F34\tw[VC}4|~YyQaiP 61QT󇆍B706H†ƦFX*%#]cT"U6|⒁AyhlAU髪Hn[dU2|~i)+rZWWJeU]Xܜz̔J54pq?_GԜի>TEi4/,4 <0+,"#޼)#;mGJHM$ F'?sͧ4 H4o/| Qelm+4 imO4 ̼r5!!ZNvii}CkkW>53us ^`of7yRTWQt̹3I5--==|2͝?m檭M&_]E$̟h!DC FC3׭Zegǟ?Gwۺu*3SyB qDbl#$d$$'Ĝ9x?Im߾bHA,njre~h]OPڵ,TV]SQب`#)Ʉ† ~{B"7| 6&믿<6V(?ͯQm.DE:罽gupPVMuv 'G_Mh]n^t<@nh֐kΝqtgpЦM‚Wϟ#pA}͛bcEYZLDQVv-9..6СoHukh]H$-W~h^[? LM9tz_oKs}CS3fR(;`j&L)H E+\alLdhHڵ盋ϜNto/ 54/?EEm6!D "( R'Lb}}J$ W߀Mv` roM-rwե5)*>qb߾UPf {_fM܇@PZVXP\,X٘1 J5001H憆ƉGK&OU CDC__߀I<ݠdh4HGG")+IIIKkj8h4}ͯ;S+1~*iffmcuf UT +|2Y,%WT8:pu4i1E"[XZjh*2tSSWWC"Eȸ><Ԁ@ 40H4 u u5¢˗ 5}|UTJ\4ZrAACPqqyjO\ݑHi,\] +S̴k))9٥RaSSQPhc,Y*40prbd$%奧]Mt)B՜6XSHCJ%zxRJJ[^^VVĄuu3suymmii11qq99CCfnnl6NS`ll.t rs_SVFhjZY*)R;/+ONJH(/SSwswtpEq8vv.nVMŷS++UԜ\SY֭je  #CM*D[m-%99ׯUTIx/onyC(stёj5└+W:9xQ__Rr-7wo-,6lxjݒ%z Z>Ș }Q?R]C47{ؓh1m#GEy,"$_#/ 'y҄"$aRi0A3A5 tP0#Fh DeK à x!h2JL!2M\'(p ъK/#AdfNt㙛 1x!ȰYD &`%$# 2Ok! dd2 M35)O"QඦFy Cdf*ckCXQDHmC|e08&# 1xa& #_qxrƑ `FP`:H8HLi@,.+?>G 7}qXs_|^tuݻW}̥ҡԨGcc33ji4][ۀg^^zDE7~޷~Yuk2*-KRJJkZZzzT%% KWmR??OO3S552yrf۶#Gb}+vܱ#4NѓHkw˧64.H|fs x,01VS;FSRbttx<.ghdm{b{{c9W>]x Q>W:l30PXt}Rrxu6o62Cfh'DԜraXdmYON9{ϝb0,-,pqY4G:<8V[WVZZ\]*zxLTљs=LU7lp1';'1(HǛn.ߓTJ(+ۯYK~*q~oOkKEefaG㳢-[m[ʊɼ:qbkɞϿ[7:;ji=t}J֪+ g޺[?|ylHnIrد> 5Қ..;t\{"qmMʵȨ|zF -)bc{z6mڶ}ÆE̩ԛttAGGNNj _}%8!';7)(P9d՘Z ''o? 9 UUt=89XWTt?};Kffmo`o qQJ9[ga>l O% EH$0b8-OUsgϜuKUumڴhOQ^"ii̸^YlaakhiI74)MbN_USsttuf0Ɔv^@P4mlV,LŒ q/ JNU:xRfjWgx=+uq)< (}}WO:s*J~~uMsswА gosO?`3PҚ{Ɉ q9uu:kj&<4t<hQ?qk{/?apse0->϶o?{VW7g~ťGmwA6pye.ܼYS()Z/\r݆`{{Y|~CcZZttK**z{X,cGG Y>JbqggaQLlDsKJjk[[i4 ==K%Kք?󌿿TZ[q9ҺN>FSr. *(AM8m~ӽzͶuu'ϞMO+.nn!ݻȔٜ LF6|AcSzS U}}T1`}@|jlg083y֬ uvph4**?,6IjEDG7oZYm+WRd7vu4]]3S7lȝ&)<ܗ_qAR{ǥK_|s:gl&IƤ+j޻7O$_|ګnn 5;]!˟}+,7qOd\_h-4dgefhj:8 74Rl"ܲlnU:@~I$ TVa*n7=ȑ,-GܺuQ,673=s*=&d2fJJ'̬oJJj* T_,M=+uo}]2>eniSr55>&H$\JS+G }|֮ dꚊFEEC>}ƍ["%^ F,no+)IN9sHn۾} b1XCx<{~W/RQLLCٝ &&f7_ulWo`ƍ!!7'&$]*BQm]\=_'̛|_O>|/$؎O Eڲ~2TҔjںN/ Šd2Q;R]Q[3XBӒQߨaovD!R 66ffT꯿涶.roUTDZyf cI[mmDm4"_ÿSTt[_~ssEzHi9FGəa(D(D"bdN@? `}J~rBg9!!/heI=+-??_'T G4k-*h %Zp@Lf2 ttظvqqt51f&~@PZVXPR"YZ[羐Ù>$`!U|N,vv0P%O}.,M2;~ E(,(,(---ҝbN&ɠMT|*wwY-`m2%+o/d&uwegs.pŠʛ7Y^`T D@P^QTXZ*MML?lt *ؘ#I exٳ}0\6LN{|(%%6K=` tW$~(uuYÚt] ʒҒѴfiI$9yym~N s>#tCåK_y Ԙ}CBt?~$%IIfbv;,_])0|$O7_7nKʏر ] Q[26"Oi? *xN-omy[U=6B아/@mmp/rR+Kb00-h,*Q?^Xl&40lpQ (b9 `Owo@@*1g>!V V6!g\%??q[7["[ޣ2svФDUTS?{i@wzOF'#>>~ j&>;ĝVX|ZrfFa~IIuMkN 4E5"TLz5g~ XZ\}@\YY:|. B3#WUg^jnOܳ`+Pss|}|}G_O#=x/ٰA>ȗJ{{O/Gĝ;mB{{&U(%Fffج3Wڭ {T NWVbqu8,-ml-hOĕHF`JGO^"? Q/ gFϵkkjoMM=u{jjDvld~^ٻܓ߅Jzr'YNzB,W(_a# HC5Mx%}_\#S- zj?!^طwǎ蓏\~($x;=BZ d)N_G~G0ۇ492n{\%%KK{{ss:(#ҥ,?S77 "qeUVVN^GwXxJ ʕ=IT-65u叨8:.[fb\Q9ĊB裡#$%%-mSF,w=Bqp Y~#VSSTR6ݹb0昚ȕIWTU c. \4zZZP )CCOik[A~fFu4>0vaggfjdeiubD`IcïAaïAqsK}]cӃ| NxhW`gWGgכK`O.?"#;fK2++'SSc\G馚ɚvvs H䚚(3eRm+/p;"5'Ϟb,qs#jKtu-`뾽f ug{Ij1)Nnj$#.OS$ Ud6{Ѣ_o_L=_/_;^[Djm)($3I1(b#i4K \\Xׯ_?|"CC*'rB\lyp~'y%a߾}{ spRʼnWϞMJH8C}%WToN*]VCoy[UU4SX"T4,]啖^Ee\\Mʹ9BagG}]yY["wsseeb}IUUt)2OY.gg#C¤*N;pgn쬩_~QSh==yW/]$^ĚIcL&+3UTҒJG']&k EGWOK"\K5SC&+(h Gnrdo_>]_^@Mu$i@ };._>to-.hnihHLRQTzz;**J;Yֶ63#7[]a²SҴqO9ԛŒL0'4zQi..]Kk[Wg}'HBA_o[kcS]]EE~^jՊy6l| 9#>gwwRJRaZ4 #:DZZ)._>q"!gpBQVf {U,fF:Jvvtu"NDLNA&12 zW_17SS*Ĵ[ןyB9[LLl̏?H<ټޫW/=u{>kTdr?*jyx_n"ȑ+W&>yϝ?~ٔko|>zy98u!N75_N|…_~ʢ357'<ۻ_fw{-v3gR/[zTge(<|jo_S6afrŻmjh{+ǎedDF]NNח z4cڗ^^|<:*ꥋǎR(꺺&&^a<=NMX/_ODDߣg ?sŊECCgΈ' Q)CǏ;%e+V/zzIwӛZۯ11Gٓd/[oQUhj :S@h=pČJ2/ĥ]hRPPU׷k?>[LJK2 z{՝ݭBpΝ=ird1ܬ " 7=moD$((ػP^0]Wx\==/aܹ:֛:u_W Q߈CŞDC8hFDC4,"< xxϗhSu ,IL"Q`LT8FQf(pMh| b` dt!O"Q6=}MWFI4D`>#b$Bn35!Zq eD2 tx#>#"^yh2^2LDf&d&qwîB1hj$̀|@Uֆh2GO H,'J|P4O q6 0NxxPHeH`؏x&Q[TՕ7۶9RT$Xcz~^,.+?G;覛w\ih0so<%ꚨݻ鹳 kuRjjl6GnW`c55 (H<6:?u*=9:*-Aʰ x+tufߛΜeea999 AAz<=ǞtǛFY*%S׬~%_?CC H=-9ϊlٶm:++&'^OԆwgz7׷_2_ȃIttd\И??<<8֖hhmjzT߀LVP4з7[WW/?i''&99)BNno/Vsy౹ X"JH,yK0Җ̌UjXXڶYZ?HT45,rS2^2>jKWΨ9:Y[355 mTQ'(ͽm]"P(6} 4dgefhj:8 74Rl s#GDJs˲e: Ʀӧ"#+T--9$/?>w6|Wsro&G~$d*0'n'65_.F^^Eecc?ᘙ͛fMh3Cɷʎص}<-/p=S,VW׷XzZ//M͚KOɸ^\\S3\%a~S]c-7|LTŋ9quMMvv+/qȎ98O6nHzz]ۿNdПyO_zy|o@.::-):CT(3]=C΁:>/IJoC$Ҫ5k×,ct$JSsVfFF}uDlchfFKnNnnk2e:)BQuML̞oٮ.SS_CBƦĤؘk ;ip>>btΆoUTDZy̴F)WqqByW~%Jmo+*xÇWAagWV&&OIt8J[[A~|3'O~Ս.())+,\4 `z_?B{{aag=OLoؓH3g:׭ PVﯪNOp!.Сb?e/`XX9LMwrʇRAa4[X]VFΝ vD#4 'NF$', XܜN$2aRMDmNSпw`?~[,42[!+33IC~z"2/c21"1gpWlk~ckko訫+)<"O)=SzE*{***DJ쨫+O|\JTsKDFfS11uukw\~4RW]v-0O=r t /WhTи㣈4Psim||,b 5:SS W|r8cG_9sLWyNl̬5k,-ꦑ ;LQ嗭, ;-#hC!KȦ;;{[Uģd2L!A"$r3Kچ*Lʒ"P(}DR[Ġ꺹**KJKJu1fiI$9yym>>~푡@PQyT$25_͍Ƞ'2>xO<2?7/>͖ ߆F34\tw[VC}|~YyQaiP 61QT󇆍B706H†ƦF"F$;F$?x\c ʓDc\.O_UDu؂%KK^Dk׺U*bՋDfT:: =W)(H}D%JikhR)_Xt@mE؂<^dD՛7ePnWJ(*24Z@SaAUUGGMMyyEEР|-:_? G,nn##-(z[2Y룭-U t TsC-NSFD=DBBKs`{|/Fd?^Q烺^#_WGǐeLד'OE?*<܌oϠ T}A` { +cO]s؊^ =5ԘLHz{ʔ9*ʣ+d6ys$T׬ h4diikP(mG0>P J+z(++)3jJJ/2++'SSc\G'55m55+a4@DLNzZ(kQ"l䡐9+W.^w$'GE&$7ȓ EESK+# !##5rtEQPD(KJLJ|Yi--jVV66z2YK̤ 7ƍ|Ù2elI߆_Z((PXB,:w "DzҲ̌ܜnu5;;{хeBjiRRuu^n^^{|" rs Zjmt={KUTtFnkNtuMLUU{{W7K˾̈e<|ggHʬ#jR01Qfڧ||O}^#de;9~:dG yDE//Ĵ7`kGE=z!ӥR5U==+k֬ZMg=4v(O}6ϝ}<՜H}pi~ɓϝ=J Ɋ1g\xXFFdd_djjꚚ:998{&nSvt#5ZDG=z⯿ 2~o ^KLUU;k[[WNNZ?s;`!55[f@F "0{T[ $Bn,<|h XH<<'Q` 0Qh~wwP@" "M5ؒX|Q h&$QQl"XhR)\;XcyLٽwg9潙YnhxF< (Qz>A~~;kQQ/qdժo ޱ#b]_p~!6: Q9B|>PXQYZz;:JK#}4JG~]rwspAix&+1W1_^|AqQrÇ8vp (d2" _PR|$203ާ=FAix>ѳaxF@P_FL'O\J+)nmTTtt,,<{.11%{eKZI޾AmmHAA0e~A~\܅ 7nx ,E>x{[Y*+PX^q2f͚UGGuwh֬wmϝӻ@o?{hRSag'Ωں3g֯[rܹkNԳKmٲ776 6ٹ4*I7EUHd0uʲe&%++˫LO?}pbbf;lQ]ܯ;E#D^D% b4 @<{֮9pT_ 1c1"QmMQ岲22)MMn Ld 5yyIbbNl$ҒÇwN>DvڹcPo jknLL8~<:zƟ~7/$d$[[yy\)̺|{0߱c TTpJKd>}{TXXSŋMM:w+_6kTʞ5kx|a M(/Oej * soi\)"QSSVPI66ӦZ#ae~]xxYwPА!jj$R]]q q_h(cG[[;;#ciڪ?xTLLj &L~#zy}6{Í:~bkcggoO^|cG/`II))ij0r"`i*)=ܚDRVls _<^Aa浛79~\];w_ K[WOCLijhllnT@}(RREwrT2Na5h._x;|Kۧo>::쬬+#"' 2sr8cӾWISmm]u&{D{@ߵ_C0;D&)*tTMtr o߸,,MLt. KX$QeeyEeŋ<>ȔDy2(F ut:b2YIYQQ޽\neUVv;UV544v[/-TO$dvJdirD 22=o`0(T55P(Z{?v۳GYYJJNN~&XK ]&"5wG[Ghׯ'%'']t=+/Fb[_1WxiesyBHDL%zldɓcMQEMDb4ohS,8]I "|#PFhĈ*[3%qSqdJ~#Gd&SMUMUUE(JesHHTċHp~}PVVSKYQV87{D" $9Bb?dus_W3ӨGp\]ښ˗ԜG>2^Jzp4PQ~=Rzt捛7'S] 4j@SŪ( 3ܺjձG Gf}tu~ru5/^TY{DT]~J$a\]MM j-{\|vjF=i)3SK+N)1ޓLkG UJ+6YYc K= ҥԔwІ<S^OۻWsCClܶM$ =pPϞ$RuUaaNݻ4ȑ1ԴYZZt˗#"˜ NNFF mmY4CSӕa{igss:WTt* 4AQDJvD&!ϭ6ɾXhiKI޺pӵu&AA3?so(EE%yy:/73𶍍#K[`?U&p>K4dMC@_SCe2YQε{?xk;a6(o?U#uXn^llR=~)$\M;yy4)[[jde+Wc0wp0WPhm-+~…ӧ%ZlzZ?lܰc{Y1CH<SQ3v]/uMhjjkȱ1I22 kRRL=] uYY33ggU ٳw_>4ZccQQs߹#ȚZ]L>㥦?b?coC:61Uא*+ OxQ@ ဏSK+QTۋ]O@D*)̼ޝ:ssWVzzV&22Ur._NrJ~~uH5X_F6ףPoɢ"Q]gΤ57 fgge;pKoUfϙ6SWqgZ/{ĄUyyz*(={]rRvvYɸ9sLq믭yba׼ϝ{WUե-4b e.\8x&>=\Y\3@((bcϞvHJؤO+g&]^~̅bCa&OddDEg͸-fO #յwJݸq)=9lbbbrrf;=oaan5372˽z5==5۷kjD"]]wρnx^$֊D7o;~ܳ|S^{ݤhk0|IY-9GEE}}#ce[ϜOUR,E52vv`0ddMMTT \IINJJMvZ ][*?ODa5p$}qn/fnYSCJJMҲw{{--(+=Zɉ RS8# 55tlE1Q wS;ED!oDw7 Lq%ʳ@ҥߺٷop#FcœD;/YQZ3[eet5ߔDߏ(y#|͹9{žd " n$M HsQ0Q"QSӵk)IY|eqz3x|g- =xG32Ro"--** -FwTBbt H5hOhxw Qffc?Yv6i(M !h|Qw (M(1i1Hx!(Zbrt 2%E, &#Qc%K/:iii4aLF.8mDA4^QbB1"~A/ J (>#"oBpb1b\ s%_ ņ!z!&#QFHC4inA[FQinA'ܿxɬY!!%BaO8܈#V}MpDwY/*.~x@ [pg?WY>Ň)-=a>;ѱW/'~~S,۷ZW>DHDŽB|>OPmoϛ7bė_>T]6~7[.a+iS}ZP#fa H!++1W1 x(MMw vt=affg##ü}ﯡ9yO?ٓ~iʔ+]h|0#ͷ Tnn&d--|X0_"QKKqɥK g.\/WUU_h*f}]Gӫ:v9)yӦڻ&5}Ʀ}ާwNHTSsڵǏki}/Ljm-ᔕEE?s&3&))ܜDr<_իW8hl`5'ZY>ǫzç^),,- Y&&CGwrԐ~7bb>yRz^^IIuuk+ca1jC>ǫs:>,,<<9);˓Ҳ0s;b񾾶 ~бKpm-l߱YgΤܺU\\S>o.Ũ׮./gee54LM|}nj ptnVUxcfeWV64II)(0::~~ӦM⢡Ay\.Hj +4 -wf^Phdү&SNN Ks2f?~', >@_Juĉ_]ѣL 4?@I)/}76 ݭ+.!ꌎ77;a06ݴؘn]p̘ŋ-2D"TT=ok8PZ?hϘ1 rYYii2s*=LCM=F_s+ѣ'N?/ӕë\!%Cvy 4yjJaux-ZZ|'<O9@r5*2229|IJw>Zm{~4"/5xܹ>ܾgss\mҥ;_,)5jUb b~_ %Eehݞx\-Ǝu2YI~` ƵkW2rsJJ{s%xk7or8&f]P=5L1Tɔ[l䑿ϫ;WL޽#辒hr:zt:1Y,(;YiX:zZ"Ql\d֭[[==z46b0dd޵@P\qdYuLcw:R /c:v#P0i[Yu]Ŭ̜[w*{v[/-TI˥R=&24644x4(+uTPS%Zڵ>Dlv}: zS R,o*3N#&n45566 o$DJ|E2?_S|s~5K1=M@;fLCCqɭ[׮FGڼ.dbooJKK-Y<UnnV7guOYY.x PXU~Nҫ_`KTRRCWyyyM ,)./^!YY##3s}0ܹĄwgF7YҢ67_Tohpr22RPlk+-LL--h2vr-]\gφޭ0µ>pݫ q1ՙMܲ%.n_~peM?w:PC{?-[bb6oڰ UW'O=z8}Kyx{u|hhtԖ۶DS]0']~Hzo*WdWr q[ذskfNx%yU* d2$//"WWff޶qtdi -'K$6KU.T䧦H˘u54zO/`˯g/\x`m]s.fdg_),#eeekOfC@;&̝7jiC NݛA!++X&&ff?z̘y&OP쏉 zD"43ut pkm 8q~:3#II'OKMTuu{Xw7nXY=gv\ji>JkhXZ9svo 2:kVw'N8~<%l>váє44z0W/.]!-n2f/YfhpDTd|ٳ{75HrrjjёCAHL{ tsys裛6nژ7#+ښpPbbmmcck "/d،LMN%:cbT|[S:Sw:>8 sHݍ(|jjbOD>fŖ!}lGQ1wSQ1Q HsQ6 @ -Ht (݂4 < 'Of1DMJs (I1u/%f%03%J~Q JS#QW'"yIJ QF#b\1Du $ﶈ Q86Qf}F1Dބ1I=1b\ s%_0(" "/'F$+HC4inA[FQinA: [pg?WY)"&]BaEEdܹ}XZ9;/yM 57XmԴgQG^d NԻѳfڕVU%4 |̬\."_\?3gD7YPX_Jh_1zwK#"򚛟wLVΎ3gNdɑ{ XGן:ϟΜ:e͚ԴƮj{C B}%'8|?Oo]]ii2y;Dkegg3 o`3flr_k::3fg箯vWP_Ə2ek7jTDļ9T> /M$O{>:XYYEŕ mmRR ߴi'hh--%.%$Op%#?^UU}=C)hkuO^LA~d7{dvaABBZ[%B^nnF7pjQȘssX={z 'CXZ(+wt>uĈ3 cbΝξ[TS))XZ 1vOG.Ũ׮./gee54LM|}nj ptԔ|>Kn4j޽KKD?~1-7Drt>mŊ)DPXV~+G)*tYB.93,D>t繸ʾ̙ InaubE#Fhk_H:vM@$, %_?JkW䐄ffaoUڅLVUut‚D޴z͛++UU2k@k@#VV%$u#G8TCSZDb+)I"[zͼȤ_??L@P[t!&d֭N"-Y<|TCQGyy >|2:کSч_wFl a&LMdg[}_W,\8|FԟkΝUUCz{O%%U[sfbћ6S]ݼy!!&wlذ~]l,0|Yut~ԩׯkj;wʩS{\k/+kޟX}])k%i۬KR){֬}-\4a_h(c)[[;;#ciڪ?xTLLjנ1OF訓'KKL|I?L^~w۶8gc3thfA휹1Ov-_.qgQ: x<>??/w|zR9Ϸu?Xrv犕.}Dœv`BaCcɽ1MVV]А _]Ba25ե2b3'7BammEEe9OikhhH^@C%V^&L 3֭kRSbmT\xzظ_e82_#|2k"_ڲ9$$|X"Fڐ22t:72pe~:r>MO+lOV6o7jTtӷ_,00>lmĉ) _Y2YAgO[[CCe۶3jj63|ٙYsI"SO?)/j@)+zx3eСFAIݢ{|PXU~Nҫ_`KTRRJ%54+jjz,ŠʌťTsFRR]ZN75adH+KKMPPIH@<"mf!+;d ׮?M^^JȪM⻷nEDH^˜7jjJ(JO߽k۶?ږrrzgk=^P`4 [9G^J'-, Yjt9 ?5%%DZ̬F&eYZZt˗#"˜ NNFF mmY|O^հӳ9S+*JpcՆÇO蠨1BQTPTr33 o8:uX <ٯ /䤍ba\]NKTT]]- jX$ǜtcLikj3ܬE<@_Qሄ\nMM~k4)*nffcOn*dŋ'O>~|]_~1cZk맟M4SWڵ#w ۝cb4kx k C@;g|ZkkJrB¡C- @ӳ9/=܉\N sE{PB©S{fdP,AG{z+P54z:֖ùv5&&,, +/iblo?uҥ#Fhk:B{ tsys裛6nژ7Ԡ˘ Z8dQgݓD"ɩXffN>>D} =[2Y^eI谆 >cÎ۳gݺ499=݁꫑#-ܙgeo>k֌ֈ(ܡbƟ:Eucw;jU?Wsj]Z[Ɉk>uYMkPHHXI^tzW-Uky#KF>N5D1'ʇz.];}/1R1D޴1S?}"n**& Aw_ :V݂4 @ -XbCdm Q9y4!o}VhFNՈ!&}(1+1}I=)Q Q:#MM0!! UL &yELGHơ23(!2&Ig| GLZ-(@1$P^/1<1}4 < Y EG&H>D4GHt (݂4 @ -Ht (~Y˗GE o"Q[[齔e}HȢE_|~۷'&ޓHrܹ/\/YfMhhrrE=ߗFYowHXW'_D朜CK9:-_=wu.2% ɩwo/ѣg ٵ+5J 躽}GpgثO?)SBwjmmvE(;OK+gߞ;3xH !x7:--7nܲyϞ\c#ƍ3@F娨"QSӕ+tthM<B&/W(|DȡG+WBB_=}!54s+gǎ3'Nע"3ѣXh5ԔwOgf\./߱K()Y(,/?tx޼#~X]\8|S*)76\>~4t=?mj~AkkD޿g45zWUu?9CpMI?B 1x N]̺_[{C;;kkQ/ff^d`0b䈑::2ޟC22VVcF\/cFڿ? gض%0p?r,$1Y{X?_љ1=;w} ࠨ4~){^fϾQ""ͱR)MMw vt=affg##a>МWEF8HH@yBaIi\\tԥKBa߾S͘aoב@yJJNN3gLڏJ͍91EHX[?@@ajB&߿_^^QyDg׭ǔ=jR u a4 @WNy٥7fdVUs8t̀A CRM_}w7MjMO?k_~:ښBs'Ȳe?xDydm%g ߢT+qҊkGbb]d=a͜'T/ۙ}]p/FEvvy9-+aj;fL@$+,]yCcCШz.-=qŴ*i+Lӟ0>{>:XYYEŕ mmRR ߴi'hhP(BaYW\q6x5k&N43ܶϷnMOr6χL/ut[ێ/zn +"%. EGk_|zTW7wv*jRԞ=ؿv#--C_0i" Pty⒘ ֯q=kZ[sS۷_4wS%/ڷ,m_WAAj ,ccYgDKXY֍il:gDSS Mi榪r=F n G(BaU关}$*e Wy J+xXQ(5uӦիbct>QAJ]=*$/W-џ L@#BL$l9#utlmi˗o,pwSQycIK++ki誫+(Pڻ**,=]=] ]~==&SN@o}訓'KKL|I?;*]-M_?b5 Ss^"6ҥi$ikrO[ lmeoFEG?,W. 'Zߜ8>3\%HQ))wdh= %-2YZZ^A^F+*K˻׋N75adH+KKMPPDFSV׳3fʴC Ee.'vٽ{ÛH$995s1srqt$PPx5/+ښpPbbmmcck "/d،LkU/q#LBR>Xo&.nߎB>beuuY۷Ϛ5c5GwXNWH]}]έZϕHS{j]Z[Ɉk>uYMkPHHXI^Gw?LۜIرswhvvK 1,}>ɳRuuNݻt|pM6n"Q8@(|-C4M+3؎'bh 廉b0D|`mnA[FQix@N(b y"#Qsb5b r_,JJ 1xI! afJ?@F 2N2EeS &#Q?ĴN5t$B1"H& Ml] xuUQ2"yϕEd/HDkr UgĊ!>Bh,&CL^d"O}x$Pɪ( Q"1I-hA4 E'^j#\|FҴ2uLOO] &G~&%~Oخ"#^I$eeSSѿZ7nmKlLE%`ݝɠZ۪kn޸u}b=]w(}4uϞ`%P=;uTvֶtkU@qSF$?7)p5sZjޛ_~sι599y..LM9cO 5Nn߱}F#GEE1 F Ld6&G{\߷-z\ooqɮ?"kJ_Muo2jԄӦpwC0٠i}Tph{#]zMdPTWo߱c.ԭJ;qqgXX'(fFcUՎWd4ۺKnjR>/2ޞWt:Ykvξ;LΪ0.ޑS.5kD)/CYٯ\] |gԨ;()iH#zrݺd0-W+2q9T9q^.7܂&LX衇bcCiv%?YRRS+%8xx`;15ԥںs=vDօL.ht;{_cfZ@RRxN'شoYSc0{/]{NzO>y1c dWc D []9Fh ˉ)qcdžJ .RmYY6sPC(( E"{k>_[[,[q1!ŷ,Jm]rG{~gxI66*UuuFFJJ6__Qxo1uD  ԫ;bq|?yRx`OOM:˖M:LChx_81ibBHHlA&ۏo,7#/rPV̌ڙ3ݥ^4(./Kpv-/BϧG֚FR~|ӷmp#FNY\~#6&Қ<;rz=&SnN]YDD4aLՖ_/-cbƍuttY2NjLH3V(TkK-`mC\ݤn]rLJ<;IۣR/aMGn<[YR*U*k3bW7G2EݭTqT*NrI cc_z{lIG=:!_{mٲ..=XF̛O(ph@)եB-uw̩TP$I>'Rn2ն-.iuu)UDB3=&r@r?skG\>Gm8*d2%|{2ҭh4#FH$ii j:;pױLњY>((ׁLf2lLj; H aɤT(Um7LkRR?׿>vhtsk4(R- ~%:pf{KIǏ'bV[^qdffs]PPHDrw(F5/lfU >s&z]D"ŢR>ƅB\t:ހF{DGGE;9LǎNTnC8TVZRB!yyJtTNp]dQL̬'?gɟncf0Uvh't觖&% x.bgg6K<~ǎ͛E]]#FxzتyGTT$Ptɷ MB"w"=s^^&;9tɑҠU#mkkj6ƆNNg"] 4Fx.R7 k\dG'jĉDd57p2͘1=7f 2b!z{_rvھm׎'SR6o>yvttw| |}=nTC,{qBҏ۶9r?^@!ىqqMRJ5D00|!FʝC8{| qt >՝mM55%ŅNuvS&Oc}d >8$.6..0XFεo/*c:&\uv8qdY9.  lN郇 o(7Ln]}`¤ܙI=T*`PFB}3a;;yyEG.[AF U@55(`Y)z&R\W!'\āA!!N"qL&F|wskF h=f,ߧ̲kmG:6B;(XnoOj4rycCyYii{?` Ο'B[[6F5T=555]4H7߉Lr=fޞNwv 7.*L)s|C#blEBWOHgqqAqH N'ft5yy==^O&3Spĸ.j .L{,/,ήSi4F(pu 2q=e2Q\WTXSstQ+i%` $GDw d2ek+H$aa^ZmN"p+ D8h(ܟډ.%k0+($ZYh7v,&hD0C65D fL a4 4%f*Q*Xb`/UYetZ27%DLp3˭ P1 rco9Dc2p;7UBJ 3\`8¤C(3(YYj0!F?f%,oT{j GQ*Q*QBC vCYٯ\EcǮZvܹR)rɤV79so$'?_]E;;$&>ҥSJ䞞m۶z`NNmRbJ""f|qvFSRc?Y/\|ұ2>o*=@rFFkdƌ\:\^YuI!Ry"= 4$ٙ;3뻻kj󳳋ڻj*F(ptpu tsRv|^/)-*jnjowȻ fl?,,,˓ϧ@\nOl)-3^xݝT){{L6~~ GgΖHhtB w{ 1h4zQL&Ӱxz{k.\ihԨI$ ΂£G*v<p_&8;qYKOSFG9; ޣq/ՎA#FR=='[dc&L}Z,'c mln>!!~\.ժTMMQ* DY"&jp@ÀXS;{Ԅ#]rss.s͝- dxѻ~ŋuY}Zlm؅ IDAT5ήom2TY :\N``\)=ܥn:tpIivViWbbHAFSW_PPT! JL81,oܥRg6'--%5//;;?Օӿ9'LFQQw7iRp@0tw``(٠zևJb8b DRitEhrrH"*݃þVxe2)uUV) 0` @`8:S:jk:;vrttv]:iJ t꾳ji!WEF\\F\ _,HNپsgKKZ[{{t{{Ҥ{lToܹ#Gѣmm}U9;!!JUՎ{`SHlu+.ݺ-O.uvNMѣml~㍥Kl&L-}棏_yuѿ"̧ww-XQwط/3EF"Exu,2;VtPQy,}Ϟ˫miRi4P" 9'}tGG hllڷw;/qٳZ\nL+|SO[W97ç'zyr؍M5z^!ok%FBBD`0&ގD#V-j5F3x OtHhoGv;M&WW`hmkjlml/Oϧ@pJs˱c^*KJZ8qPh2V]XL&A E}Caai3~IE"`ho+-=y"9@ƍ_~A"rժ9sܥw~FLv‚)SM9#/7~IZb̙nj뒓?#F̞hsK$Tj{ŋSXlݻO<~Wb4loK>}ƃNh.:t`mmmo,_b|]&[BH^zy?1˖=t\@Hb|58x*_;{zM}%ikKlf f?>(/ƎOX`"bQ-cѯ6~Ν݊iӒ}щT*d-MM$ȁǻ=pk%6mTɓ= 15&/BV]mh贩Dk?XCEPF2r972ñr)[K\n|ɓ3f]Ost)'gs<=)kn$-gcc_{m{U ;;g' []nn/ml܈J lse=NY/ol|HHZ׫zzJ/旕t?dɬ ! ]%n!JsKZگ?lkuuMJzk̙^@F5/*38x4?_"6$&_ψJspWAH@ e-5UMJLF3հDfʫڥL9vt !?c挙(>쭭qu=giS&rݾk0;WZI#G:9L]]>[h==kn2i4J܌Jl>,fsĪ9&G!QC@{B᰹\%_+T*+NH| EQqnAOlG˰Xl6e3ΞϿ$6*U\(wUDnd@pϢSn_=kRR?׿>};2ʷ3h+ᇔ&縸|jljlmjkhk{FL":rĉG ?Foo(,,.wb}}.`k4v N+I\ؒ z{;ZZJKiTO#==5P(oKJ>G']_WTXPbzyNepz(Q;`ܸ[`>ϟ}^Nn'k$#^\mG<.P.bo踸ELQ~Qѣ7"f.\bŚw<߽+-رddlݪPH@ M/)ML;S,X0iBo]zz}o}5 *O9mѣݽ= +ΛO(Z.ׯ G9Pk~wRSΙv;kgr\"byyEE5YYu:eoW#bC}EKǂL4-L˫$c!J/1c<=+/K,ݷ)Sll kk˳jj5FwqH" d&N vKj7P *!v3{ =TSK4hϤ F b F b F?D5C5nY\T`8B4;ce*Jt33`8`DBJ#Zh cN4\`8B4154h3Tz43hnD#}DM6c2ֳL#kׇhQ&M11\2ֳLK1CpRkF6t7Lv;1Pneα01b;1 I=Vh;Qa4ڽn8#Smii{nѿ m;=O2:33wl߻;2bʔ3}41Bik;twƒ9.k)=@_x}w}?٫V "$#Ymѿ~]듐4\&3Ԕ W_0~~GGEgddW=)N&BqbVVy9!Dr(w>e'kk%`4XƁ?Th4[=rx‰ܥWQL&[\U]YdQ ^yG}}~#>c2EF~zOυy硇b~>^N|M%':5=)88!AP(..O?ٳ\ wiuڸ7 b wwwmik'[guܞɵ5byV?|\cBB>y=TD85jTtD Y ZbYYg g2ƮC!F@r >rB\PR\SM|L)?$b /BK&aޠi5׮VF1T9Y?s,!Xӥ{cܹ!vh+ .t^^,F3 S,&.^lljn2L&"?%1.Jdk#]x}*)QZBჭֆD*.R*U*b yFSVF^xQ(o1eʨBannNviI}^MJF1ȱ3YU h&BID)+\/n2i4 n E̜ycƊ;/*2O1c"CI=<g(To„^~80}AL`w]iiwVdZF'!vwuutz}y{ۯ2?~o|%T@8+[Bʑ*|{W E,9r(W׃'NdW̟{bvvE]TT /OsH 1 3GX&\{Jסooc1sִi^{v?~bPE>Le{&ՇLRfz{[oM.vb|->-J됷wt+oib4* RELX!DQ#Gy?phNvMyrXDF5h` ZsNq䮝G64ZBF66;wte,w 'u%+OH.F8sLƳ  Gd5jB]XGDqt1r1YaP;4!3>n֬HСݻd[H1N,wȏ?ʪƦꚢs>qT2xWW&ѣb 2mێ*蓝~b?N1}2taaF+oߖR^!v12*ѡMW`8u L1 `]. Rn内͘9uw^ގۗaa\5go-%yǎ۹s;w*$;;{{GF&$G{pǸb5sW ņ|A3v`…o,5G;~LZ?>f;8%L}姟N̾:(w F /Q(  Ft4f 3h͘ c!F$D'M4Tz-ָ̫v"ZI)f  ׇhQY`@CMW.J` (VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(nI IDATVA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(VA`(V5DCjDBpm`(VA`(VA`ܩhrPՌgG4'GOOkCwLm8fSf@iG4KOp Ol?6(pǘřY~Aewlv_gOOO2`?f3h'~'p7kCw~Y*O+.d} YƵa0f |P)SjKDiljlkx̸qF"yO=S݇L!ɭ|\M[JJ b^,K?!$T"~啹s7n\ b{Ng0h4~ŏLMX F\&L9{/v(*ώs[[o^÷d?MM>ٰ!$4o,_~Ч}x8}:H|7Xnb7- '7`0M?:T\ߞ}6.aL"L!" =z۔sf~?RZ!^QQn"OMJuܳ&M_ ~|py,y$"z ~b2kkm{I3 b?DR(aSWmw_ފNoVVW.`?u#/sMt\q,99uZH&k4z= dr\\D*xo- Jp5*UMu۶%M1bcE ᴆ::?Oo0t:Y˃/Bņ/2ևrqtrDR(&RwWw$f|xDٓk4 VV>gGyf16\Wר訨SVUQ[^ffqIlͪȴ(rk^":XECw#{Zt#V` F;~{dLO䓕+l)(0\]YΚ5fJ(7P^/|ςѣVZn\usrW=ć4j:u:ÉYY%7wtt}*8xC/(ܼ7?0-ݿX8ɉBZ֊?EBꊈ5g֬{ ;2*2R$6Hĥ+Db2 `0;+QH;|8-L^niY]LݭVSP2zLl\B„ ><޽y|sr6۶WTf*)jֲyDb0O!&wu)|$%犊jje2durrsJō-urƚ]׭{'|}_y, ц|?äI曋_mQɯ{df6ޕhycƈst϶C}6Vܧ);+;))I"oBʿj[{9㏽IVVCcJDDKcΞܢәLZ'=ḟk,}>*;Zs'΋<˟{]\\\L_|^TTT 9:8:M]a f ].p#OORT\kǮݾ˯v)To_mܿ3fI#$'G;;2WVW_^VVRSj4uз=lذ{w~>oϒ%qw|z(Ф}]$uࠁ{L Y[lM(QM2onbHHtv7Tff$'otُ̩<Kqv.Ǿ/} ɓ~ƃi Eh 8V b!v4ë]R))$tZDVtwM-M4j|\|錯7~5Obk3ϵϧW}}-.?o.Y# ^,=ӧO\VԬT{}hwJp0߰p8LefFe]˟Zr`e w|̫>Q4ڕkz{MSTw=BvlsϏik `[GF+k. ?.B//\ٵo/]EKشȂF!C eoX&#эls.x睬E7fe?p!yFYWr.jﴲ Lgd!^^B{{YiYYOqB˫Q[237޻}WZ&'/Y˖͝3jm+.^;s$[ VHś=zru2ٳ[XJxb=WTni˖"aFʀK)EE#JL 8܎y~gJLok>@HN^h'LK 0'=ٖMsTvr'}GC$z'Iee _  )7rki]/ںyhmztځAYockc38\S[SG7^%\i+T6֣FF;kju{䴴EVX ͰP;vxK+ ڭ萨OK[tժ+͝f߾}'گv_lyvDbO/]Ƌrs $8ԭm'N|~QPϴ䥧z/OMTч{TTHr͖-GTUegX2gx AMr98A^TFk,(F-Vkœ@ hJ#AWT'hol8 x_9uwwq/]y_<T4?oi_b{;G(QxLqO99--3fFG{{Hi 骫E.FE-0CdX&S*xLmqܛL.+fpt6n|pC垤d{;H_88{κ_x!9ᏔPn/DWU~GA'~[^vȠ(__7Ю.fʙ3XW/Ifg`idh vB$ _ߟvܙ<}swb}wOgf^8ci66XpHךsw4AȈ,@Fz29$lժ ~ʟ;_zgzhtD.M_(9hې7f5j5d2Z ED({H2T#t;d"|E\["ٰm[RR\=ܑ|E ~ٳyl;a'׷~]m3f8usE[,:6{u RQxc9>OݑI ܰsWffnnJj@@Rz{x;hBbx@ߊ9 )QY\FwLJja-QDGW P tu ;qll,#ˆ#:-gCF״ FѐR{zřKmmQ|ڣ(<ǐ%Jc Ǐ4Μ.)iiilD7ffeōޢu==ō }}5CCj ]]dTEc4tuH6lJ(-)/5Nsi/;:dz3_@kwy:AnJss*=EF\ I'Ox^\`ƍ յ`~|/Ery~~_J%FF2O,=yl)64+vN` \hr]'GkkiiojU*R_ĉEDp8R!"ad8)pe%/h>>M'bc2S'O_r9P|TTTJG$Θ1cNO ~Mݴi[C"̉=" &$Ɯmmpx~(l׌B899Y8tX"J:T+kkJ'( UʉA( J<ݝ1uwwtvu*vyy9sx =;j5וQ$R42*!fj2F6c4 rhQdTO(+]D"J2:L*U( Pr߇Ѩ4 *ڽ)-5uy>h];ϝ7םh̙)BMZm,#bOfLJ]ljoiil 2L!nQصYƢ$Ϣ4JJ5O?oA e}} [tfr 2K%:;h0›oQT!45%|ⲕm (R(rDK+GFۛd‹' %(H!U#rroԸcnw]T c0L(G2TU&EFf;}РRM/]*)ih@)#)~ Www{&$Kp޲$&uN:y2dffRkGn)iuL^F s}mvtF#HPҪRz{^|RNnnNqѥ4O!)5b T&JN7Otf2 J0ih<[o^}𧱕7exL(+ΞN߾oYىS9ڔbqBBH=JA.OtfcfҳCʤPQ+xS**PNĹZ[;ٓIZ@$jmS|o:C}}9Vc}vS|omlڱС/w?,_EpwC XBՅGN788004Ӓv &x<WgzS 8z4R@9%F+<|lWklx˖RSdRPz=UUUذl>3j4&3A6kά**;=<ÍF FIUUEgIɞ<s|fZ~|8Bo6,k+V[bۿ}͕0]!I Ih<ڒIhYwkpo\"FH O}'xxLiX>觟oDڂN&YYӨ3fN wra_;DO@ /+ͭ|lwX  Emm~^iIe``H]"(paUiuu}Go8Nk>;ۇeI=^i:1eZY2h_Z-M*(($y[G: 00bki1!oJdW7O/'3H}|S3*MxZQHͨ2w=%#WH4g>|uv E$?'?_fai;=|GrۿܾŚ7w<P魯%LP**+*C\p!f,""%uj#G8p=GG\=Q魬(.jnÙ̞ut`,-)K83ͅuj7.LMxx 8s~PP5ƈ˚Fe'vwuv̙b\4}+Sz5knsQ^ @[uФ2YIɁwϻVT{E˜s: BIDAT;yFR_ e|H"r]V\8,@޿/Euk x"дx<6'=>T EeLFXXpi9cG2M>,ofjtTvgl|摑i /733/o`@}udg;}߮/r^Z7nEǣ{sd۹=+^|92bwwO X;$={>qS'yzYjuk[~c3.s]RS- ӯ9;8jaIz{Bh=2AAVsgXlGU' 32Ԛm,$8.>.ףjIV˲fY娦5k+k֔o'%W_ᇇ%(uKqp马,ŎD[U/u޳gw{2$ۗuذ)zhC(ԩF>5w Y*-)9|쁁]ryGǥK٧Nž:w%(ML ۽ף_lV;6ff="Q}}K <8x֬guTԬ/oz;>LNK1#"֎BQm }L&79i|z{4;Xصk  +[>8v {FU5+l|ѦMuu11BTSS\[ZzUlO=kk3|֙]?wװUx˗ww#nG5\Y0035Wp 5 jj<]? MM 3\ǿUmI$!!f͙Ⱥ #GQ(%9y%~+"ssRQnp//2ﲠ0OOyyhh"$Ǣch:="r%vk}'} -7:!xs ǎ[fA7_h ^Lftڀ6̘SSsBaT?!))8XT7u K;{ʥKcc9ja1ڼY󋻺̠P.F3n=b]].緵$%-Z4u+;#@RU"ѱߎPVZ *7PXY[Y+EEE$_OI/E$ld_^^gc`lqtSHHTThCC=[Z 򊊪Žёvvqs#Sz{JK /^,((/ {{Zg縩Ӧ;;wwT%$}C }NN11Sx{_}t2P-jdL4=!(2*)88,Ygq0'srsE>Ņ@ŌY~0Ho;{ٳhmp8++.ΎJVEiOihvv jNjk$ɱ>uyQCFMchؒ^-,ܰH ,ŨD|~~I}}WLF{zN2oS[Ĵinȵz}P]}vv^^[+W@b²9/٬j7|}HNƢ5'QE n6e2j7ڟ 9Z0jkss;& *87}Ûr,@04s |xFoӺW_iiN{{'} Nozd9oQ wW'jS0UqT^_[ԓO=ii9/}|"ǜ 8`:SY{l,x<6F>昀|4Ց `@F z< $WH0^ ?2A1#PL`̐Ɩ9SJs̆%T*o {}zbo,3='WQ..Tݻ ذKԹfe,N̶P0TQ7^?pn fN`&.sC^Ao2 mt4r/T=z>[q~-_~?;;f/wtK,@lh왿LV^tNfpP+7`<` rQt<:101M&odzTXtRaw profile type exifxuSmr )z=1f7F{I'uư|&#|1M-\2Ո"S$˶d@җc;MO!C]DˡS^mڹL}_DjT.ں9^%gDimJ+I/D.(]L-:,1.-eb Q(o¼(hIݬ1 -nI*bQ2?qAn&v. +ƓU$~(]U\{BjMaU)>1 tv $I1RƷɈ@~Av5?nz'Q+]>w<uq!S\ezTXtRaw profile type iptcx=10 'EsG-_캟Mn8 ƚ_=cTpo}w!EO  T!kf;`XiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later m iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx`Wufݸ{B$@w) ׫\堅G^^) Iwf-}; ~3o޼y37on|$M$u?|Bͨ0X6(>:Z"*mz$߂)ķAg9v$*A~_S 6'LjlQ$!v$[gcATP3P0}.`xB5<6z^-bQϞ3gL&9sg (=/`jkjsrR3JJ[fsƦҼZeJP_XX\RWףF*lVR/?w) B}}$lv /f1!,.6<SYdqhc2t*Zә͝j_=j3RlyQ >aa7d 8Ţөխ*!^`8:xz8pwyp~A_WW[d6x :7}Zd2%;M Ueez2!n8ѨPtP>YW OҨkk{;daPVUYUk ΎFIKKLB&#ϴ{u U!t t^4 a@q+,fMjbho{>i`gC,/mf<O._;x( b=/[h4L&&F>_l/z{\_X zV+mZVF] d:vf z]Se~Kbhuz*iJN/+$L Yڵ/;n+ӮzZt=Ѡ=dVbR2 + 3ғAS-\4czp؎ x027[[[Z-|D""S]y\C0TNg8HR+JHNzC6l ȸ4Vb/XVM9V FhzuQ~K繲at4dTؔۗ-3sɤPԖ^xS yqČI=,8NLFpPnkIKKK-)j |||d}yoɶŠו]NTZRQ=L&899# `Je.ގїi.~~|PRtɥ44VWԴhW-2oe- \ު |Z,JUm]iYuMc#yED!!!n\ z^4?V_8{I8\&d r1N >a'Aa(;? 4).ݳʦ#S~.ᒀ9uq7}FtDbOoi4oL (?r(?Wޜsmˤ2''.` o֬>χ<:һ"}d kk.%:J|};Յ䧫`=>JU^SLIX, ̶6yKKJIa0BBC\;-x73V(lͭ(-+4,~i{h*U_{(WbcWy.\JϯlhP( .#((6v&XjJ<h<ҺƆƆ$o_?Wdз--fر-\l2-\GXXd\Q\\QQ_'67 @?yRhW:]<􏷐tm$8Ҫ}V3A>%vvl6IdLNU5 rSL@"qt Iog!k=6A3\@ yg^2%xW*QP( \.?ɤדהL O)tѨV77= %t:Y@QeIzT7es,Iy;3 ´~34AɻA=f*r1֦R)mmC^drՒG?')Ee ;`XC5<6pqSXND.c$ 7ߡ; xl9/`XC5/`XC.6BQIjؠF NDRw[ZMh5l2φFBI=o#0RU@;aPkH28HH8HAm;j;R'yq)b6-n$1mPChB|Ia':pwG|nՄ`$"!InJжQ[LT #IZ#=A]1[o \ʎMks'@*N]H~S#=A]1[oF3/`XC5/`XC5/`Ptyyv /l]LlnÍؔuđkܒw©gΦW״ | Z,-S=wU::9[ۭQge?lbQkJJj* yeh4FaylK8vc))zQ /L3[WihOPW7 Wlim̳2Grwsu j#MeܵsNw cb<=9:VgLchIӧD{\Pg<6Mya6kuy% rJZ,H(wq tu :1*+Or93&ݭ,1̙"(&f'R]x\~Ba1)2?t(+Fc0]\GGϘ3̋Ą\nmキaO>ED0Zi2{w<| fy?~8VkefϗWN=<\`P0=`%ki.+njnUj4&% wy^Fy~ &#ܸX{=ۓ^W"EZDd.$$.CٚWXX]ܢh'E8_];I)(-+<* $.T#Xz\Q^QXXXPQQߠhUu:p|;, 22cp˹ou2\Ҷ*K.]*,lksf yuUqqqIZŋryH ؉B ^^+Y f_lQ.l6fyמ*+325o/Q| 99!Q$co^nŅ [޵cL3X{c-9'_>>c27 xyv<X_}U_?es欽{L1;䉃;47?sOTPC:tm?L߽޽㼹>B!K?bA\o_(Պ/i/6U겲2#&&vlohOО:T9DlFSC+r7$fDkͮ.AA!!"U%.1'GF:;dRs 7 <\ 0ZTt: L?ic`X,MeEffzzE%p==V"%%117WۑZhZB!oQ),&ښ`"|l5ϟjb6+ --g@7OJRmn()).!;٧-g^g H*O~i$svr EiiΧ54zy~P ۉvb;37&fܸ}N"a2/\x:_&riܻ݊ wY~ǖ.n/Q|AS2!RbEy^~O- ;x[߯vDEEGsoG:t1a޼ș3d,C*jN uw' t'z̘1bIX,ʚjObeiwuYY))y*CDĄ2i?'#eQ:a1]NWSS_\RICC'ON'uH춶gҊ +d~>lvKKCCd"u'<<0ýU$ķ8ܜN0aB@@{?.P[[_PL;_$jIuK(3&668cuuWt.=2r8sAv`8s6%U __ doW=ьSgnkɡ_"ollnX<=;'+g_? :usRuGft>t3b;O/=,Wͨ89]G:jJVwU,)3I|-򂼒?ʛA~m鵝95t[,CSc^^匌F>/((&&2ݭVhO`ա!nخ³sb2DRDb7kud-wA$R!یlGXh)??55'^жLi,3#?_ "":_n{juFgǰEo]MݛUI$ʺmUvp˹}YCQgn Cf/pXp|>_㒨sax^ \rbGAg/rڗmdo%M6]o'5;ϿG`}djmWf6]$qўHCCԱjyzڴ%7_\oAUI8vll,[R\R\^^PZZd RGw7ocwaN s83@^DrQ'tVYC_M&EPkt:oL&o>[f xчds&SV.#x zzh" m>7`\0% \n_P(rb\\;=cXOw)< K* ⚗ne'0vR=RWul(dL+C, 4i^@FI5ӵ**K ssSRZfĉq}L̢b^yDnRkK[`A8ɪp&] kTW=[P0kōB $7ŒHv4ZUtUkT3ReZd>fz};ɞN"CwFQ Gv(U5Jee6֥$_*0#|uX( lu;o ވ4:to($oSsnnjjnnc 5=A{r!P`D"JUMMU\ףmd^~~{El>7\EEY%$$$"ǫ -BV*z(Zi4g瀀`O2>X$8&NN[΃_gn/TYQR\le2:9a4҂ 9*ѡ^(upsjj+2 wtLW(jJJ r(:z b{r/NbM`⎯Qjk.%]Rz{{88 fB^YQPP\ֈ#\]Ez6yRy9oVO6!.8Xd0; >߳nlbCƍs^tw|dђl45#tN`n^^n4g%)TW:vvvqo{Qprf0DB! $.i(20FsR...&K(6ړ?R{2PCuUII%)fs``@|2ځNGhx</OG6djj.,̬RD$õږꪪV% ql1u0 23KJ;(Tj\[9uyz9;UTef]FJFFrq t'~uoB |\%ѨRוM4H=l Fs`/͒I'Lrs*+*FK IƏ3Ar,'YhhLLD]lYWo=7ox{xy-]r}}"5B"+*jܸ`ABww?_'X__RUVn2B)"2z*^{ڼuiyٳtCq^(ts 3fݺ,ssx FN-""Vz{e0|C|C^fo86v IDATڴ˧ܦctp|چ;p6oNH~ĠzޚԷ>$ u0 n[s7lشiɒYIyQG'#=A]EC;Y 5/`XC?,tIX)@e̠w_, z^ k^;Q@l͑uPPp2)I?6x$#I`:>$`83ٰm6tMo͔ǎy>6P61 k, hIZ:I6VBmNǦsF [ܵs]<.ǑķimmUmYcCћ9xa))%$*[=#I$Qu`Hl^loklHmI(+'2 jsIԜ|I†) l&M$)l.&E84ԓ;$MPA2ǭO?ݺSqOxfs{~[o=ӗh2 >7=w_TJmzzC&s͆z = d~I۷d&z35M_瀝zIA;ҍdFoAz=/`DOv$ώ6PB鿵9l *۷OEyybɜ4966<|E֬X8LM@q䨻FsNws)SZ//WWGk,] ?*2>Z3c&餤ԴN,+7t:M*]ry󂃢'NM[^O۷8|rb֦PzyY|RGoྖJ઒bǶ];~*?_g㣣cc  7yamA-oO|aCdMwawԛW;o_,qӟzG|h ֬9p{~0ׇW{…tyKQaRҪU qǃ>OM"?W**4tzzzvѾ.uםw}}=(xz~V EYyNnVV66j:]SSA}ye+^}uP26;o7gdW9e孭o^h677?=Ypekצ7ԛMJeSv nEhTآc#צ֦ܵ8^"ٳgdժk|` =;4tP_|aWTX.>{gj &AAc|-(HJtiScHe^Va,@`2MxgdpdMȣ+NQQ~3gN4irǰ!9e2l 7yKRﵡm:~;O6[P Z5 wl'sPHzL0Iܠkg0mkߢt4gϝ9s%+3==FMhtVZ &-'''̉$L&` ab%Rt&^ډŨ^tBTv*lћ9t&p7%Komą ֭<`09M}{zM̝|D"Ie{˦M~WdjW*R(8&5T*`2Ɔ/OT{IHw/CA*lA=`+T{^zo6{z:y"1!)hkSh[[JJ22W99!QѮ.n^$ XHۜtdRpcņP yL^a9s,_Vl3lS0lԔԣ"ߝ5$qlͨ^]Kݹf>z睼̔ں윂sN>|FI&X,v:p )ӧ22dO?mP_TB**߲wҒSS?>)7wEe2!v EyEQqA! Q(+W˖.XlE^^]ѸyfFFrrb"OfO>YZZ`8c#RI56?EOhn"IDRӏI_MSkǞ۷?֦RdbGF2d$(ߢ gy߽{玟~ܺY";6"biӖ,XTs:5&&,vu#۹\:h ~ @Ae)S⊊/]z-oV=':z%Stz||D;_6nڿ?D"̘1x˛9|ȀcruH>jl"Ǜ?PTאfӿS=2$yz$n6b+g6m:y6@ql&Ϝ%=/D6$Yg&I$|@KYTAtC" ֺ ^mP@Μ3$#l0eTSK>'d dfTgBRzIIFjO >>\&FlG>'d|"D +l|DbOdžkC &†-PoIm6S\B>*~Wb a h2 >7=w_3gJXl;^z/~h4P=cZ֕/_SihtvHsCb>|m< 䝰LIIi _,+7t:M*]ry󂃢'N4_rIiuBcۮ?\^YT/XfѱtN9[>rbJ[>vKhȸqݭ;yGӇs琴b%I [\s2 Z|ΜiwݺVl'ٛolO+22Ο' :===;JVh_u;zh <=?xs+<'rr[[olnn~{Yfe֮MM-/o7ʦNE(+niinV(ZjPZB}؂fsmbVb{oV{w:wED ֭YynQQqqO<~}IIbRbfx {쉎టxɧ^zIc0Lc&O~}LyOZy.Nntk؂b1,&?OcHe^V+ummz=ST_p̙&M1lѾD&`9s~XyT*>kآ7$bHzNՒ Ւ0gϝ9s%+3==FMhtVZ &SQt:Ijvvbl~5Y,^DeE.W[.Bhp6GA76-^2wL&I%.6}W_|H ҟdsY6["d\ U|657PPc L47+ olӬf!9yy=|l%&#sy%~I&X,v:p`4hd2 חZ QC_te+͛?7O5kB=s:1fii% d~ڝ=/?\2iyݭJ¢ҲTQlii -/cLo/7WW6[ Cv gg ((*j]>ubʐ/7XՍvvn>B3=wӏ_}[:;K$vvqcFDL8mڒJqY|ٸi=~NN@0cYL.oLCrusqH2ie4L<ޛob)16'!ͷy]GMJ 0mwsfyʕe(::8-:z^is3r/sq|ךys{C6R{U (a ֺlSUMRcI&S/@G-0pݺs._NM&k.ZlI$bub$H'JR %/k<6Sm6(2T6$Q)m6*%It^TVAaԶN!)2$m𢶆i6f"鰍JM;HM[f́$!xnm:6C@om6#I؅EzT$Pn0`'0PX=M b ^ z^ k~lbikp?`駟~S*Phw>o}H]xbim={}'$v'&SAm/#6[Qq u) 6 hg}k= /cnލm>LHhk#y~Gy7O'|W^ٺ5/mPoh嗯7n|ŧ~'xٿOlv\YZ3mrڗ_>#r9n9v`hi).IM;_ٻc]9rԥZ0 Ţd]پc~ߢūW?Q${:= X7&Z,n+Y7痖 p?X OkqSJfpZKXnm0/s.=ĉ,1,bb<<8[w}E[hh4Fd$ޚmG*;o~۵Zw_:C(Zgf0.؉>{}oJZ)*>v= $dao؛nS;;w6FBC-sU\\z?ymϞ})SdR}rEBmD'?ԢEAyF8i?/ΖJN7oٳֲǏ?Msqf0z3ϴ$4Zcc=ylܼL-+'O;TًF rښ‚˧Ni4SqWco5UUDN0xqR^!MpѬnjuK 93d((,*jksv0!(HbO49J nk4U_8{Ϯ:cƐ˘rVش+W̭rp eFVo^ 3g'M{3ߧ6g˖\9vlVֿɗzx|5?RkV|c-^fI /%)Yӟ7>jeDFFGGF:JW^3gLYiD#9! r5RT|9ʕ ,liD;9I_O_?gNDD$ ^ྍ`0IiE"7o~]9¼HJn{iy+o;ݗZ&`Z5 nuapܚ=mǎ=zp9Stfs@n^Il1RGg'tw` tŌYbٲ7; Ҳ}vlONbcxh҈pGt^*bf=\t~ BX`]OL볒Xf3t{JU^QR\`Lqv5*4եҥ <|D-0KK};|zZtW6<Ν2CCZHO3ŗ6n\Ǜ]7]ҥv dͅ~Z>zq\nǓ߼_~qq}޻wH3[\r=pLffYy}}kNb R{dyw];91&Sa7Ve/m7r_~IO11۸GZ=]ߖ;aNǾ~ǎ\)/ojW W9wndԱ}-5SOp>rAAUuC\ӱW _rΜ(0[-MZ 9?꫟lIO7߼QvKX?Wog2?2>V(uDj-22JJkjT*&7::8F: ƴ_}XZjqqUUK$GGϚt1c\LW$$ۻgɓ%j5#3mzH\~`BO^mQiӿjfYy[qɓ sr**zu}^}fsM/}[VF=?K٣{tx?ЮoXTV_jWXxQᩓ*m5^9j˖Z5uCy9t)/Qݜntʕfw2 IDATז' |r=w>>\mO>[o^moo xێC{؈OYsj]aA9i/9=JI.(lhjl=8ۖ-_&<|Gۿx/OrJԘEZZ\\bFF9;(3I{=ؿ}yڙ3ۓ aP9 Wh㑧#"22[z`/`xxL/A{81)~Dy<XL2?K0+*dG9bЏpٻU>j֬s+ zRUU2] YYݢ&L>cɎBMo9憆'rsL5k޼k︃Q(N8x/ &忾¼y^_USg2M4mK|#GF{_^ ެojQ_o֚ 76V*=>唂>|TxxI̼|9?EXp#С-ry@̙s]`Xfe9{Ju}Ymȃ3w9sB,1#wW,ŧ9J?/T.lݻwi4nns|OZZ-wl߳'zi3f̟ݳgryOw۷eZ$m7g0Ιk#2|oN @Z1fw䭉v;&ںg.Xps0z]}}@ O>gΚ53g1YMMYY=xp?[>Æ6m_|~0iң?;Hآ#cf[w%\^YUX_du7jGUeKhbʛ>fM4&S,vwsu:ug|o6mΜёFkn.(.Zxν$:mxt]h^nS:+z{y{Ik)!N|/%v>-Oڋ.:.GG/Yz=ztǛ^7n֬I]jkΟ;uՏ>1w{@ϴ{}y0u:b340HZTf:b+ DvdZ 5xulx8D_ |4,i0 q XbLfͭukxNN.S7]2Qr}UVXq5&VpP@ oym>tgrqQo9$w]fsuy>Suv u^ǁNa]ݬq>Lde AAk׮Y;on|9֋〥K}&NI̮c9 3zǩ5W 6n/%VTΞׇLao?a=wYޮ٬PQyw ?cc]NpB~ԨQaԽ\.%?=By<8rm{Y{5<<**:dٸ+)K_*)iCݗ,Ï̘q)N_}|s过~̚8G pw_x+aws1|hѢ=9zu[[SE"'vJIlm=Pe׷/OZk87^GZ,5sA?c />ЬEFhU7ؑ4yҌ2)5CCL-)?Ow |yhͩ~ 7[lQt -f:#c玏>}Zח5 }|tTD{Ͽ>I}{ϓJ.Z;1vlǜxoPןu=TjWj##m lKo)77lh2iXhX8Z*+u^xٲo9sٶ`4$d CBdRw9홶ՙ/^5σUlIl+V  #Xd2"y1+Y|^jswYjjlNC PQ(=7XG=<],_;wSƎ |o쬿vt`2{ Fu,l>CHg u'FZOh}Rz} =~d`FNH7Zr/@ 3BB4INvA|y\K9a|^ݨ HYA!VMб5nj>}B驗Mс&Sq ɡbErm^ 7u=o_Zyju<盱k륋KwwhyZ ySn yDNJئ^??:/wy+2E<{}KHKvo;(o ,4齊 "b%XsivS.QcԘQĨR#Hl3,X~(.~3M{ffǎ>[B /WV~ʁ}]X YML$U˄@Tr=b2 \\44$1ۆWc'FQ{:I)Ԝ|'OԴTTj.q玣>>F 9qxll_۵ZJ<ލ[ O٣Gooߵ+0hg#.өcY(HY!l<0`wHq88oRl3jo䈕<\OoG{G:<,ݻB ddw& 3J3|L$`(o''%FE=K..~~f*;i#鈝RDkO K(+)jjA)-M^ߟ5qW#LTU2l2c%g pw~z_H3S/իџ+Vtv椦$ܼ~=<Էlݻhط0tNgkjo&8vĭ@Q6R(//''N B/?tS:s:N%<ŽA9d>Lh=ʴ#-娨G vYP[K^^Z:`YHܹO_x99z65U0 Fu MPVIbYGDTTV>rt';C`xuH]Eft? ӻGZJUUC 446YY*+=nimTR_ K.XWrQ/wֶܾ{ոܦrեA31123x<29'5 +]ǪuzQw }TZxMy5xennFzZT%%YYlk8R}@EԔ9=HVvR4GtHE"22+*y\bذvNTde`hb3ʒ+20HMll$+[ZDe`l'©t5o_Sj<|%̯h:/Vqz!h{/Ǧ]]JJ">=TA+feEF瓤 3ZX89EG_&ɩ2yTJJ֍?69nmmnrI$e2,M#Ǯ"JbT,>j-fNd=]YѣEOoC[UJJqTYzd2]󉄶Z"+ȡkn.-cTXZ;hjhiR) TkrOԔoٓ'_9F4YYEYe 2If>s*-ͶY࡭[\]Jè(+ihP74\>..gКɜ9IIΝ?OV^EGGZ27n⭄N 9\r%cϟzÙijPdX-͌Ԛ##ggݿ,-S> ZQRDӓ着펎z}}uuII7oV0ZF$޿{~{;>KPb疜wO} d%a׮&g6_klٗmn3gDMx5]| Wŕ9/VLoK{`: +ޛ7p5nl/#g:G-՛6.k|r訟7Mͽ{lР!Q=&,M·\08FOD=hM<{Sdho^6>K_G[E󞙎6&Wc|\ Up榊*i)[@77] b=Lbhnop1m,op^W`3R-M=]5UYYQNt6+@7Zepo4LvF+WKdi[8L},X4!3__ѣMM <ܬNEZ9RVr+!)hYТE|~cWF8YI/--*aT"}Pī o1 eS+()m6Ԍf0>|]leXI Lιfx1]zK_|SO؉4uY~1w$&^ݍn%P45/:&48l45(e0c?F3Rs;GR`~K+l^@ yfl` <lorرܼ=yȑk EFa{:q zbbB/gfXVV|WqdG+-KO.Def9sD PTfްaYq 7Ӯ]͍oRRRUEupӋj' h`TVs3{񺫫xuYt}~'4u{;o^rryyEEU FVVu 5+E''VFjj/Q8 =P>jnA<^Lr#>97U^^1{zŕ0RB]97hC۶u}Y_ݷۗ:s߭@rg/BO3gK$$DѪ%)3 PhmAa#;5(hw7>~J'6BbⳆ_qlO"|{[(ŘvF&Miȋ^UYSG2332VRo;dyq%̬xBt*++ŗTX**XlmCCthֳ߭@rg/FO鞞6}ё͞,ex,z2;(6w>|~ŕ0RBCbWlwt}Q@wp8At QQbbllJ 4=<$yH/#r(I(TUEGBE!l>|@V/:|120/ Q(.A! DFFFZFNk&(p<,BXՋm1 c3/`7b L(:(`bC -h 6O^_3P 씛&IB  /QzȄ[Ypi*bVhgD;b& @췇Tζk0I1M [0^<3@ pM#5/ޞxؾ}r8::AA8Mᔕ_c/(,rq˗ >leVVED>'׮=="J$ʒjj4u}=kK0v3QQii O"#RSOpuӃ\\45X-;;=LI>H__}}vVvv]%tmSy czlX<`kjfEzz"2k 0:9w),ݵk߾5k3W#SRjsZ睻CVq>« IDATt5;;#RE)$$`TW7/%EꘙYcsm izQUE$u5;;S)sI5s!--:*f&7Ԝs=6"WP04;kڵ>R--7^8s_>xjjCoJGik71^h5~~ ==+n=Uソk]D25uqqM Qv`~-ͤ. d66o-ė A *_sMLdd|8xVT45 ㅋ>IFFH']Lz($xdں *ʶk"P-- KiSlq5&.JKkYо~{"m/ソe"a KK}}+WRsr[y{'򊊌ӗxַhښGsnnoio''ghF<C~9̓"b<4aOH2..~FEIiI~ϑQSWr))YMދ|hCāFR6dJm0bEWʒeF0o^8߉ܞK"' =#-p֭{]JEi̲‚RK`h(+d7#21 % ct-`\%=}}if_IIK=*AO=BR*6ljgg1J^^.9%5l;IC;ĨXXJF^oo71̂B$Z:NM[T'<$-PqkkUUy9߇MV Ydj:Y<NeՃ'O8'"d嵴xxq}]],DVR~8NAs#6p)6LxO?}U iH駒ΎydkM%y~*s{o jmkiBEQmr{,Ex9γ]s;'j z쬲2*iK +j@t$WAA^DRVQ"ˋ.6쬶6k1e HmD_119GGD JJduu)+;=ad|x5M9s* ٳw#B^KMGZGV67r fT+YJfO)(,](//,W֯U'-۳to^s'1ҥnNNB42rpXyጌ`M!SWpww"ïƤ$$\p~_?<() ʵgKмt}|ϊ#@tǎ0JC4쓛 (lA+kvv[%)>ktgą> nc": Ižl@x0@<BGKTdPk  mkP#/L(TUEGd L / Q(.A!Ldddedt6nbX+ALr`"tG3@VI  ] Q`;2AV/: (hi`χ$4^3PG On 7}[FFVU!V_ ^T;Y\'￿?͔_P9rUwϝ{XfOoniK|ֶ*?_: t˖MB["!i<>U$%;w'!ɍD+mN~ߏ>޺m{N!\nSGڱ㭷x_2hj/~߃׮ygϞ9rKɕU==̬gok_޹K`׮] LOoh/Sz{ /_>% YuLo_ӓw{G֮{moELe{`<~Hc3'Io|9>)qS|e<˜mx|GGmm7ۤM㡻lf8l.`ߚTX׷r'>: '((ڼg8xyy %ŧ9~#Hpן~njB& eecca$#QeMde͖-ekn^t9)i T ooHM|)*DQ}eL%9bCFswzz.Y뫮N$vvVV>xpV|ov`}wyyiaNNZû6'4>')SS]ZV^OSwq11QQ7 %e,_6P&sH6=ϒD >t/Bg4Oa(]33 s s)+3Q'ֵ&&=s؁y֯}sF)SE+CBf.(+Y[:;) ˓;,,$)i.)%>[7qpγⰱۯi ,[;b6$jn~46a OYyr;l W3??=z1x)pY,6艃t6}w13uKkiYYq[&FIɥ|ʗcEV\My1@2UpM$[4'* 䃇{=&:Qs:fG 3YAEiT4uyǏCî].Hr42URrt^ȑ_ UP`e~ʨ+3pNNXam x^WZ-GBF1((hдd2ֆǏ7w=E2a3 +}=?]%%֬|x>~?7bvxPK毮ݻ=#"7\\_@Mw$==:*<\FE}}ODϞH!A]Y7gg?sΜ^߽{rs3YQ]LOyYiIM`hGOHL)'OsRomD" ޺\ VVC+ <^w7"1)&ZLRb~~eUccg')%J/yW_uqVW'8WDgNJ| OZZEN75XjZ+?d2=6\NNMU] #Ak|mxX$NO82 1!R?ҥ+W"iff%3vv*FQqziӓ=YW@;<=5'MCi-6G<ūu>>Fz`& ,eQTTR*L%7^~DQ ;vʕf[\7*(RTdԔ]]wGXg.[jf:Hli.,LHǣ_uuII8q-ޱ5--mm,VMmk s5߲ÛT 02iڐ3>isߜ첲\W]OjjjJJ] Y.|AײuqYb;UA^Sk֬SR.~\nSSF?-Xhђ%-^,#Q\|ϫWco|?z%Kt @m}QQi13m^@|UZVv/9.FٳgNpᇁz#'W-|E˵l'U{2ҳ XYZY=ԡL~~VVI7lPXʪǾ>zj{uKLf}CA^bҍؤ{]]\Z%?ULL[`~׬SPy\w`z]||ZC%2z\yG>{Ka`F3{{^Ӈ֑rrDw@ip+Eju5MH_DG~;w}QA@R2J} cS_lLK t,qKׯ#nތ Ç sz-[gQfիgN9CMm6UWܺb͛mBp(\i )h{{MmYYI)QJЩ(5m,6oLS:ard2nh1ΓS:]]//?U/Rq֪j4,&\hMw.k#/^Oõ YxIUUOWOWJ",SAMi}z%,]y;ۍrrR&Oצ<^^~W89=~/Ǐ:9sj|vE+k?Lu=eaY[L߁KO&vAY4{^ ~MLjj]`٩O}؀;bソe"}>WW{+i99-T'F ᴶe>8wۓaa &ֿUMG:c~ #)Liry==MC2q{zB|u^pWl}_D)/'m}M[맞egGEFE.sY[Ϟ=#ہejana,+SU7ӛ.R\Y6kjΥffffjRR¥Dؑ6=H{eU#>KJ2(Wbz(gX%FFrrA>A$8^AA};6$ 3tt3K35v{zF'+Kաix7~tccca1Ko**) ~WJ!'2F NTbGeB 7V E==Jd"r:3!AWWw؎lNE/_QsM h;:;7oݹ=8c,-РѢRyymo4դai)mlj8)%ILWɪɊ61[ePd ]\ssJk8{;c#QRᘘBqiba9jq3_ILƏ<;] G>4>@tD^߇\6&PM-h=_svVJJK+|D ;v|ٺuWx9W||jd Z&lN\Vih⢡!96\;6IL˗o?yR[w;wwԘ6jUU͉ccz׬h߮6RRnJ?}={]F#=gAu͞N}@~@&fS/nfx1Ek#u>9b%с(*+ =|hPAY2}ɧҪj)|=%iF - ؾ}; IQgyEtznGH`:bx0\O K(+)jjA)-M^ɴQnZ#kmhF};MRkWp7fN/OMSqoJJxk+45\v 7:\xؙqqq㏃&33$(x.Z]ObX\0Ƌͥ&u|I2M$~Zw54ylNUUi).^l`(#=[xfؿ>;H?~HD+:jjssRSn^qj6]HKs[BI:vA'Ƴ57N;qVlū=Q(+e.7GDvS.kR?ؿU.F11ײKKtz[[փr*k H\lv[kKkG'lR)#Wj&(+ BQvt,EtJ8)-#;q?YNEj(7v̯:6VQ7qd_Vl;DE8ˏ?Emۼ<4G lMV#D=~s*-ͶY࡭[\]Jè(+ihP74\>..gКɜ9IIΝ?OV^EGGZ27n⭄N 9\r%cϟzÙijPdX-͌Ԛ##ggݿ,-S> ZQRDӓ着펎z}}uuII7oV0ZF$޿{~{;>KPb疜wO} d%a׮&g6_klٗmn3gDMx5]| Wŕ9/VLoK{`6Htu{W4Uƍey\YzeO}/wM41ʻ7|߄\U{C雨-ouOs m߫NQWyLDmc|1g.w^j8\sSEEIIUm`:1ib=Lnnop1m,op^W`3R-M=]5UYYQNt6+@7Zepo4LvF+WKdi[8L,X4!3__ѣMM <ܬNEZ9RVr+!)hYТE|~cWF8YI/--*aT"}Pīio~4fmpgGg e**JJc s̨b tݗ.us-.|ӧN*) ڱ i$cA{C=7bILt)##<JNhj98,^louLhponڰW?QQ{\ij*+ KsZځjf}񸽽'NOp䨔qpȡûw{ybScS)..oqaqq)WBϜdJK+)XXxxذXh68aL<;}ۓuu L_rXnsڵh=~}EE1133Y,+W_]Vq+q8e㊕˖ "C239Sd"(*goذg,ii׮ƷKI))k{]E]H40 tv*+ 9={xU,>?ۣG嶴<|x;ee}/HH,ANsy98 =P>jnA<^Lr#>97U^^1{zŕ0RB]97hC۶u%_Ra ~u߾ho_xΝ STf>Z6=S ;~--lFFV<{08$C|^Ԣ-4;*}r>gı> nc"4m#/<^{{UeMU_]XIq,yŕ0RẺR Y,U_R`UT<*`i9s J&Z6=O{znڼ]GG6{THYDooϟg^\ 3)%4NO+.LM_yf|Gx|71<>r|@>/Xb 0/TנG^3 sJ(P(GE=>&|@&@ㅑ! %(a0Htm:E(`+tz-f@d`Lr"U %V>=XWZݶu(47iK>r |<^2rP$YA@EC= ^|z`S/0``+Kn>MقV @L|`S``Xl@Zb0  [@x2Ɂ<> d Ƌgi۷ܹBGG'(u bb8K?E.>>|xr=]'wlʪÇ?պg0CDDYY2YMgms鲀wwC2.`Ƒ"**-IdDjj]tzPT㵶eg))뫯ή_DMwj=ؔ^Xlg2ʪLZ矑E?_---Mq/FOt =/b{.$RNNUU}]s *MEE> Ξ&fXNԹ'Y23(;=]"Qfggj"%u2_l鯾.*k,wU_._0{JԻ7>$1*/oC-:b{Jc-XW+: Lߟ\eú"Dv>+芌~s%`%%+޺ь5rMkk{tJ^6mAPTv|„^wsc)J*t3 qx(r/__lvi&L(/qή.eǪֆKBB8ZmMmQ wh^V} U|T& 2Ʀu+==,ׂ`ƣ|Gw?'6bʔF+ [$.|_]Y.W*2= IDATLWw\.h~J=kצzԷbat_9^w0,gxhohee-uwwuu+tp4)Xnn5 ]^~bU7qbsdԡxv3O^<nIcBddBBzoƱYX(Nȑ?3gh7.!!{o.RTKӟ}3fn6 &zLF"k?,Y{Y܍LţIZEx67HF̚:HI?Mh(cc$=3 %EDq%]wש|wϪUA_# NѡPtU.#Ug0l}&tVŚڨB;/ݗzf߁߻̌cfls-8K.*xՒ?nxQ5YdĨh#X2rшQ]}FMOO%˂! P(k;u=LL\GzxELV]]aṳ׫0[11dĸKnNnNMm(\O1c ĉ~Gvt_(-.BIs# djuҒL&Ӱzbj__y^^-0F嘱c:SF55%%%2 ##kɓ¥MM'Oϟ}v@颢K**Ϝᇿwg϶=, է%t2#"bͪDԴi-YY_5)շߨ|ܼJ[]tP}X[76ff_|q`v .^=/{F#5QkZ?7C8_}'M([1@yF3Bܒ#}<8ʢ%<Fڌ;Kh3KiMfm`pLG^hm\l?y (ʂ) XpA4iG3~0}vnVo p^ffsΜ9jdiiJ?ci˖y{qɑm,H99*FFvv#GN:^BLW_)ð.[BaZGϝ;q?{F:3ի=7rO=v$1c*Y2ae}f1>nSͰYF^At4 FͰ anqU*?#,zVi^Kz}%; #F;qnkC ;ĕ0p[@x S#+/T^'eL s *Q^8:- S6*5jkf@7-<Gydx1ҕnW+VK S6$IIm0Q%=5LPJ}CKN>wX۷g|Qoj-vuݽOM)(<03 "^оl|>Ik׬qw:SW?=4!ᣏԪǎM2cN`1{C!@C&WO5€Ţ=ǷMjn@_CTa0II2DJeE9IҀ3yǏb@$&j~Dhh__]Xx8?_#歚ZVtr^hpw7$ pP}^.?x WVrL BH|}LJ2;Wtu_ZtǤI7G6371!I$MLpQ5Oy*GʫGGʕfoӤ[KKϜ1O FIIEťr.v+W˖X+iGWm[6[Zt--|yLLDĂK^X[ԨvtdYS}V]]kkK\pg0sӣѰ%%%O3FdpFHc |[[6;~C\ܦMJ$z|ꥥJjZ2&hy{&$TWg !voܠ(H$aёdƾƍ*սg|žvjWD̓ mt \FF~~Iiww]]yyx6i W^DFm^ދ X,0w;IZ4%47oJLMIBȩ](j5IVUU^p!$$000olq,fdU*(Jh3&ԯZ=m"'w\ j-Y-5:.PU*zIK45crrr.d w;i]*.##kkWW8 RRZp<twϋNJieE̍^ZA Axb ֶ6y[+clBCuui4$O>I`4"fGGllIJڳfȠ)u%d&ӿo5 >o$*+_{mwߣ? xA62/ :;;U*vV#ɢy>>FTA5wnWW=xܰ0Oqȉ8^[;8ccI<3##''7V.?O|賕^'#?OImUT:߽8Ϳ3>iPb'dnۖz3͹(3#/🚞Ҳe7l4^a# ”ciݷ)Ggwp-6%W65VUYYBV/?7bݻ|;wn>}zhhDZbq23s ֆ[Nh,;MIZylU=8'QHׯJM8VZvx9sghT2 wV^컿RhK`‹" wYRutxtmKf.El؟33h~֥:={KN |._5}%zut05]~#G&ߵk}ll|gƌ)RelB`tu"Ev;|>ǵX?swu'N?r\c2wHVpXcЉg\$6>: $lZ"::lŋ=/^"IH~|2Eqc\\S;Ru gH,Jw/ }110!a  kdPZ @C k/`XCx LA_VYi/SDE^MQO;"QyFM}C֩Yjk*+e;w\g//7H I@_8 (ZNgb?7_dWםY^ye_Lff\~};Aݘ7Uy~a/Lh_,ݽsn'Y[99zxowoz9gĉӧc ` C*GNqآcGtR1V*Pyp![i0cN"$bizA X5?"Y4fa J.,XU_VMVRuv:9[[/\4wnxD=xur)ﯽUucJ:D`TJeM>qܹN&'[Kl==&MzYc0 YZZVnad*#F5n.Jg^<}adtH^^Yd|cc<::,,4T!s?gefo٧II/;:x{QRRQq{ݬYSKU* N8WP]z;v`i劝G{uJMm{{mJFن/_#oS22Ni;:dϒɬ}E.ominjcgk1ϙɬV}…ĉW_]hAP?j@x1Hc |[[6;~C\ܦMJ%AنIqq[RyyIj5Ѽʕ11G7?66! ?T :( I;|X"qt$ٱoq#}eFBڵծ_*:Z1O`g+x`XĿ+-vWWGGKKs#@̡.2n"6^bauI~F`PДЊ7nܼfk4t㘚$EY BS{[AoW*jvBHH```PY,&# pRb{/?p֝;?bcƽ#wO_~YVsl_j-Y-5:.PU*a$ijM'O\*/+))wҺTz]FF֮q RjǑr-\o3[XO5v[|iR9vOfuu4C^< M&&ff]] InyOw892ͲȨ|@`-<;-[ơ+28bd&oL81 v##O  0FEA2Y{{gJPNAEEEr}|dMT޹woJʳgǯZy9\ e˺uӦ7fX/ OQ EžǒJ::[yˑ#Sڵw}66|>3cF)26 k0(GN#q-,֏\VV\.Eҋ/y ټ̬ܲSmm͖F8:l۾acca^$MQ+VDGZxѢG2%9K$ ov؃O}7ncԾ}ӽ>[*5sP kx}-cb `8Cx ~5/(*6vɒ~(B k/`XCx ^Gj9_6oK᫯gu,I_|]ܺ7\\נ‹C0O\^]R"^Bdv#C)6f4EaVnnA1pA|uJJjYx IP{PP d0 > FRRrL'RYQNb4L^vryss}X ,,3P@G,Vvva|}jjZzᢹs$#WߨH9땕S$__SR*mc?u29yV/]jg1ig)?RLoڸwݺ#--e|*GʫGGʕfoӤ[KKϜ1O FIIEťr.v+W˖X+iGWm[6[Zt--|yLLDĂK^X[ԨvtdYS}V]]kkK\pg_!8x,8:7ܸQb2Y,C_7֮}p\v}UѲy;[]c#G~N3SGո~W^DFm^ދ X,kIZ4%47oJLMIBȩ],R&ɪk.-b1l|XdRIb #Ҳ%%gK/-[_/GC5, *Uw72vw1Sy99JJe;u.^waBTZk,q A|g߾rFGkNgb"ky->m&tLfMͭ۷nw+Ζ (9 xvAk[16!LL̺4'$prd0eQã|Zyv[$%Cok3CWdAf77dMM"g;gΔ_noyXFm-Ef7lضu6:P*⃭Ov#\pA"{۠c SR(Z[,,vV#ɢy>>FTt%BMm]}{{Ҳ7|%;[Nͦe=ﻵ16jDΣ=32rrrsN#}(^χCZ[kk'2cĉ΢31(zK9?_~o{~ Cv1hi`2mKL`Й\H[OMO}}iYd6j4 =gnNKMM9z48XަѰ\ MaaIիMUU%FFVV..+j ύXp/>AbΝ۷OVX̜|#sν{SRV=v8>~ժE{x e0LË" wYRutxtmKf.El؟33h~֥:={KN |._5}%zut05]~#G&ߵk}ll|gƌ)RelBWUtuIQ";{[F>ZXZ q$^t ]df(~fR ^504YfӦ_\/N\~K7jqq$iO.^:/l Az-셩|.J"&S{ի,(VkPEz/{DV{zhƍYZ"!XOvn IDATa00)jZb7 `l͋`0e:ʊrg򲳏˛b`ILgјѾ'(=+;bq~GV}[5ZJdoompܹnI@NoܿVJ)At~~/R)6@ƱsΟ:nK.4 SȈgllxGFFG啕K76ɣBC50sVVnm}y믿w` ^0%%ʽǻ͚5eTĉ3y;?ڥc; V\yXԶ'HfmmX116(#\C&{,̚۷Z[[Z֖榆;vFTj=}6$$tuuw+%1r)*j^h.Wh䈋1-!.n& lv$߸ziiik㼼RhzkʘP]]PXu*t^tE>,8:7ܸQb2:h>zAAo$$]ZUe-vB{5tup=0zF`m#hojuㅅ/6nhaq/jEytx/`m`w>$Iju`PДЊ7nܼfk4t㘚$EY BS{[AoW*jvBHH```PY,&#(@c <ܝEf͚>aߤI&,^I`4"fGGllIJڳfȠ)X,6I&kj9 &,]w`jE`̋m-dNJhm].ZTTt>/}( HNc{{Ҳϙ=N"u9C$Xu9;eAzϓ>leƦ tf,kW;;{ԨlPb'Bm[b4 lĎjzK"#-߰Ql|9Ar,-65`yFfs-6%W65VUYYBV/?7bݻ|;wn>}zhhDZbq23s ֆ[Nh,;MIZylU=8'qƍ֭B!}X R`S_.O',;7G/~#b=;xzJJF,R::/ OQ EžǒJ::[yˑ#Sڵw}66|>3cF)26 k0(GN#q-,q ::zΜygd.)̮.j4o#̙;lss>% /Hͦ+f-^hѣkH%7;'Pݾ71uj}^ -^rtN'J$W\pO)  k/`XM׼%KfgR*/`XCx ^F` hZg͚M֯qT,:%*rjonlR(2ҏecmmuMM 7oZ[x\=@_C!0Ta`BʺpVr+=tYeּx* #))9XH('IXp&/;q^,vpD͏pkX{c /{d߼USժTNN ͝&tF]\~@koU]N'2*Rld;wֿzR;[OIYKJ|ccPՅ ^<}adtH^^Yd|cc<::,,4T!s?gefo٧II/;:x{QRRQq{ݬYSKU* N8WP]z;v`i劝G{uJMm{{mJFن/_#oS22Ni;:dϒɬ}E.ominjcgkϥsv@P~ֶ#i?vڵ+W$ gyE).Mg^t..lvMJ` %z|ꥥJj&Sy뭕+cb6n?DuuAaA~֩txQA$?vDHccxsFd }}bHHX>~ժhYK7iҥEE/WHM9q"#].խ\fͻ0p qxEyt{ X,kAVM =fk4*ZSS(k}F{[!P*~UU.\XxѢi}c{GdXL6$D0%Xla@&tV+r6| 8G35O>v"#ko^bn.v3(O[ dz[j4t\VTt`jMqTn^NΥ򲒒bN]}'KeddmjGP*U*VZp/}( HNc{{Ҳϙ=N"u9C$Xu9;5wz] +g+56 t= $~en~,33354Q\|J.T*#\ǎť `0 Cv1hi`2mKL`Й\H[OMO}}iYd6j426>ܜ L9}rhpMa’WJJQ:z [?HLܹsCC#"jc]oD64}rBc>޹woJʳgǯZy9tcǸ|_)S"ɓ)rr.7q&MilR(~<ӏ)"}}m"'/~#bPḹy{OOI8EQ*UGHWh۶Mmr\Ćy<33_{-n]jꡃ۳g߾dr>>^^Q)J(XRXGSu7o9rpj]ݷƆpf/%X&!!t FW׽(iyݸ1.S{NBLlMXZB'6>? S ^yAQK 4T^50!ahΚ56_ Xs&/7##$o275dk^4)3g QRRQq{ʕ/xe+VFcqr.=Ǻ|}?͖V:]K+,_`ҥ/652YbT߾UW"475yYS3'L1JgҘn֖͎iRIlaDoo\Vq^^RZdj4oreLLƍMH.(,::Cv˖={mmq bd&ӿ{O.**-#ɮ)S0FEA2Y{{gJPݮt$YTTt>/}( H^3vuui ':؋考áe= 8ccI<3##''7V.j|賕 ݗ>},}Xlff+txAU^DKKGm[b4 lĎjzK"#-߰Qa㕫7[[ܸQ\曯lFE:qx1Tbqsq:T"Ѷm ݭS4~u~oϞ}B>xyGͧ(bcI^cLM׭߼ȑéwڻw>>Ù1#h`5]]zRVxV~BXz#FXZXn£0l d)jŊY/Z4Z^"IH~\Wݸ1.S{NBLldP[bE\}\`XCxC@YŜK7yP(: >oE.Y23~?3 {]%=^z>>*/`P|&>W[/M/E ['mb VKVxntm\/_>> OMÖ'ʋh4Z-fͦM׿_*Oz5E v[::R!-Blkst >}IgjOBjPzaY.m[?Ja0ZZ~eEVZzkf{ѣ@ YY\5ʋ^ {aB`<_Xhbu?Yp,<[ |&AwF}ӦES*L 0k^" TazAAo$$]ZUe-vB{ ,ӳ|;_~y_߷ʊe"#Wib!^a!2n"6^ZA6ܿJZ4%47o ]!8$IQP֮gx~RVdUU BBߠaXdI1E m[еr۶Fr>xΕ+׬YŲtu/<7Y1dO[ dz[j4t\VTt`jM'O\*/+))wҺTz]FF֮q Rjn˳x֓c?%/_fMOx&x?:d.E_ y|-II{ t=ď&Il'WLLj\ 9eF`]m.z><|^D~~^ޏGoܨ~ʸq/z;6B&koTdQQ\QT* ɚ;uK˞_hL\n`,:;(] Ңⴴ ???a;ghTdғB.qآ/g3W_]Ɔw|*UOÇƍW(00,l2rd &&O7l1]]DB"PK $qr|B\\nNvffFKK}Cm]7#TQS30QK  RW[G[[W+flXwa ~Bȅd:J F^Ű*'NNr=j[ZTCQsfNn}}QQRҌSBf;{ţ_Dk+ bǎ={>0@!x}!!>D\W#E 9ZZt[O??:y\@@GD`h%'gf65ff[[Bf̞:g_|={>dICCE"tCMV_OrBhO*,v.iOVՙmee66"#7qo~a## KH;9rs174{PL ._NO~=&&115US _67,wRD>֟%i8T[H$ o_DDT4w۷mۻW @`(*(QT[z0{\"Ѐ$I`(C4/`H{vV-X09|z^ i^ itA_TfڦMֽq–/]]r'NFFww F TjLiiׯVUUTXY1qbPPJYH=/N(,'i߾=;;11*RF\~~ػΎ`/Y¢^13sv~;ǎO@U"RIz V|OmFHFUUef:9PBsdJopP+d2¨QG{{ٺ3/]: Ǎanfg2gcB@/LL{l}os茅 WPX,6bcSSӵe֐)S&ϝ [K^IsN25ϧRutSc>y00(}""-xA^ie;61!6Ŏ:++33C g 9;AIh7n(r\Jn SSf̘6sX3ߪ8GVV5tlOQ(TP )/ED]lE&ƎG|$`v`VRXZRTdggnnlLhjKOO[F31J++*&RH9 yqlBBvNiqrrddxxHH@/.Ynp玽W]ڟ4)̼wkc%K~^x饕+%M'QQ_\;׮[I+/^04tΜE++eR>_QQ+kkkZ[;:ZoI2Pq8MIQIss{GGYmN66f0s͚M;ox*f gNEF9zHDod…jƍII7\trr:=3O{z3V;w^ ظqu. oi ;Ękdj4H( Lƒk,uu@ Vb[xF=&o,f4\t:F w7L:]$VU!>)r?|񹃃ihhiio7p ,ZRzVE[[KKsKVF~^qQGg}}iKSsGG[K }B8ZZLfs@ΊtbtOOKKmXL\q)&2/L?k ^FQRW<e$Tg$鑂~ӪU^<Ÿ،33.[?tt,mXdJkkn%% %NΖKKQ"Q} ^<cm8++U㪫'Ne e---xZb/(ʺֶc,|"Hluvn~-1&&*LJ\x-zw5==lm)TM-‚+WL?gΔ)O?/۷o۶w/O =T%%UAe0g% HR1.$*2/`HC4<\jՂw/Z @ i^ i^]$~ lO89rWWo\w??;-[)ŏkg#6rBir 9eM?W_45UWs\x=RϋH%UE_]]k\g޶uwws#'L5P w 1==:}-[:c•+)~\ׁT! $P틈 y9LĄ؋;:ꬬ ,5;4Ԓ4j\FMNNϸqCJ]]UuET*vw[X̝7cƴivcdVm]G_N?zAdcxzE AB)/ED]lE&ƎG|Tjğ1Op0ΝMH)-NN  x%KV`ܱ}kUamcldϟ /rDɶo::** +sڵyLںr ΙhQzzeeSL練+*jEyMumm[[kkGG[ksS}*Fe4\f&Ng0T=FZ}3"#ϜYW$R%ZdGssswYjW.ZY:9dr9qӧ==͙UxwB*FSR_ƍW{\tK[ZCg51cy6$ >Noa2t\pp^[UU D">hL\n`,:;T˝ "YZZT7lq4`0U.!lyl=/.l1]]DB"PK $qr|B\\nNvffFKK}Cm]7#TQS30QK  RW[G[[W`{ 'PikohocY?#0[}JsKج9CCC.Gx} U!=2H hnjiijY u4ldf2=rآ[(jk]*ɘԔx//{[[Ng2+*;;kk˳?}FH)ς8l9lTjtrp!..>^Ű**Nr=j[ZTCQI{ţ_Dk+Oرgχ(O64/$'ߔ겲^Xw$!GWKN`S'ϝ hH mȦ,55}}kkYȌ"ќ3Bݿ߾g'9iRpphHD5bnICNߟSE׮9~ҥsp>mR-ZRz,*tښE"XMch4K48`ڨgevvNp\(x;vlܴyj]]MM_}SNGDpرf]]}bnvݖgϞ>qo~a## KHs174x}I$R)s%|{T-?ڳT$^+zߘIΫz˱7"qY9njr_WW{{sGoǙ8ܼ¢榆ׯ'$gi55MM]]11._JNvqwvjlUSOA7*ڵ^5usjI_  [[ L^#}]w77wܼ⒲2Ng0_3"/"/"/"/"/"/"H^P>Kq$65deI҃3/W}$P틈NO%ޞ?>8X"ӵʕغ-[_67sw)_|:dgˡLMxÆ d{LLbBRRMMaѵkwݍVNsTTvvٽg< IDAT{}}lM}w jj.\PVҒcޙFÃ/.~ܹk,:cЅMc.UV&%>~!K$Lڵv9nT`6H f'DQRms$CTg'i / 颢`(C4/`HC4/`H?RcIm$ɔP24%]$QPO\=y0/>*Hb+(i(d2HR+KPO\=y0/>6*(~E>)uq&)Ri Bb UM]]:s`]MM+66#J$(P"QSR %0ӓgѷW__Or2r箝;M;LTҨTw %5|ط_>emiUyVff9vv>30/_"21iSGZb~)J ΒHrZOH $)q [^4U=,b$RZF@($_ brMV55>)W0 ˊ z2222e22-hY++^YgkjijYX9k!'z}?P+>gpF{f?eʎvҒ]VؘRenS.oo쳍͕J-,6oټ94œ:>ؓHr~i/L !STԓ\qqe7 H5ŝ?UB"! r6B$::ܩ\.է_|!266%9?[.66YXZZY;0)0ےypLVQy̶m|og}x~z{KN>$N[ϛ0QzbjΆw6ddbǽ)UUTjG{GаЌdq \#Fah`cc3\&oiniV#eΤRLJ&oݺq#ҥ׳2;;p L su칷\_~}gR\\ږ~3D[L.=-=n4s3sS}u{9M u[駧ejy.T E~W~Gw@TPb;s( t2YKkjڡC{?|ȱc'̞bh@wTהde&݈g˖[IIM "qiޒ%Wd8fon`~nmMOOY^ګg~ߧedOjnffFŰQ mm==6a~~~k\u-*'ff\ڲ}?{mrycSJJ[:sۻ4;80?@z_7L1555:@ϋrroU}_ssN?~'g⢺.k+]/ڰyt:yt O0! UhC]|GCKKVWWoCTeS0;;BttY[o=1\#Ee9fͫ}_[jI=Z[vN^y"QM}݁XtW_}K2NM:ڦ.%5%Rޮ&rN~gLRPWO_~GvقmI/^gnFLi[DAcӁXXKƋO spx㭭-"ʹM:>$+b̻}U~QwwԅNO_WBԇ̙]uuMS]LИhTVyx̝gɣXFvtC$|8eIIRiIɱ[N:󥥖%QQ--bwyυ899£4b޼󽙙..عsbg&'~{1u ;wQOj6՘7+"#Skjϟ>c6QR\[dyU5`e0v [hT (v:niilOGqIUUSs;KJӳ> %hk{z7bNzzJJVfqP8fԈ{vtfd=W'OU̟nsϹjio5׵& jj Q-rYk[kLVd̚=kvv3gJƦf+XW"%[XL ( 5нTU\rZbzZqqMmSS{P`rLLl{>=|^H~71?3%d|Ӳ+Wn\ϯji5&&>OfOצJsOR\\]`p8ff _((v#"q}͛g=uʕ̲nuu.+$dБ#ߏh'_-32/n&/_<{fئ/.¢˗fedfvGeeo8KJ$eUE]\B&'==r鴩ةoHMINpG$ ^ RE{ϧNZQ2t'q|8_|qlnn|\AA{fLI*ojU!-AMERR9"TN#NѨT؈Df2o?Sk-^*̔gifz,- Y(.lohm ㏩lvpЫ-_o̥M?&OjXssws32ɪBJ5424lmim/TQVU#j, |,.?P*6o -[ԏdkܪ|}BeY޻l~ӧKutO+/3{yaoGGWܝW*kh.k×-{^>ZKKUT%UQQQDDq.gwx_{}i¤ɑ#YYO?DŸ2֯5ӳ^(_<$dk׊ϟABB\@mdn㓔~įδ䩫ѿƮko:pG&MMII躻/XHBa3Bhl <٘۷rT*ʫo9g0;GWWww+k&쎉qcgIa'qiacƌ5zI٨\瓠FQLj+Y'_?Yʔ4YU~dNNJTſԤҎ.JRr `0_Y7& nb$--|{ErbN/ &f'$ ~~-WDHjjӒo ZZÆ>6?U`kv::/RSRSHcIp ˑɺ{%v3{z v|"ޣ/~-~EߠkoNJJQQ9u*f }y05 \+g$AygZZlIUS϶"wݝ_-*40q?19ؤ@8WW/;B&HI9kdduasmٲpX=9lmm۶>221q4`#Áߗ4?hlYT*odJ =lyz] ys'N|[Ⲳ1ctu!bzƑ#ǘOjdf[Y>Hvjj}:DWW((+/*KLC#}<=-3~ӕn|pfV\!V՝#YP(fG63Q(n/NM-.f==G=1{u0L:*+ZL6;`kih[\):zڴ+ۑ+udIד=R{1^/Z$Ѩ>>>b#1eʔFkkkkuvzŧ_|1bĴӦ BX\`*攕YXlݼukFƱcƏ[WSԨe%e#Fڹc.#GvvLfnnrʥKx{st,Hk.|_|gΜ<9|Izzz],%w8wI/-}pQA32]:@h<^hygT3YGKO A>f2煓3+?˱몪ʼF,X`R, ſC[{̊8&S*qqW q<J59c텢tԲ2.wԨQͨMM]ZtWKsC}]3.% d2O?֭8a?gډ}U_ hizzOgbӓvƒ>Fỏ IIGqFo)X#aɛl…#Fyy~9ٳŷ(}6ijMt=uTOW RSz?g9=dqۦ梢I"25uwsTg+666~F:m8S3 +q߅3^?9;+%>u̙cǺ451fT[{?gt-=X\T6syKٙܤ7f0k2Lښ{FQaj,\!UUig=o\n/trWM֍׮zlrL-M ֝ >ZS}JLLBBqqK  ckrDWGGWGǎVѬΰQUo6;lZOm dRaѣ`hiYZ1z\Fٔ奦&*hj?g΋/-|> `&wt_V]?jԤI$xtveŵk/ɤ^9SD$g_\h4WWP ./gX\٫zR)G'&LNfw*5;sVYkGdΐ>Y&sKC"w65VVfd$%][VV[N;:;;8ZYXX[[ o޼q#))3Y&?!`ECC~HPcc ^Eyvݮ,ssw#,,j597I8-113E&px<{{UL!0sPPYxr˗_'WBp8vvv\kKSO|Hr:I~$=JRE2T [[֭ԅÇ ۺ$iA탦L>yxRiiScƬ[a(y,ؙO۷OOOج[_{GGEB"Ic}Izў [7Џ5d#{K}0Hb*rIדa''O߰&$oܴqxlX[{N ɪ9>z2x0a'2ilEjĐ*@s=H1OWksMҴRjޗ{+D4Y9]dV"i˿-N4bEb+\+_ k)JhGrԾ#FJYHsЬX&2` LQ1Xkkن(ؗPiC`cΊɮ03ⷑm|6#N$kC!{K]YO=xH)"LqS*rt ?YߤgWM]⡟$c.k"x:mفx}6uq>'W" ⽴s\&ȿ[Oauc Msg&FLϦt{ `GdiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - ffplayer screenshot Screenshot showing the AgsFFPlayer Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later z iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxw7lcewa)KGzGQXbzcry~INIr,crMbTT!ҥ ""Mz;/ J<׼^ | -mpJċ27@(q# č27@$r{<||_ll`yuueezZNNAVM{W?3G=!))%X/,^KS F2d̘#j5k6o?ծ:s_z il V^͒,Yd  似p+5qWԜ.dSSN%Ņ5pӧw=z0|/xbس/Ϟ>{նg=%=ѡKv֘o+[v zotɥοHaAǎs־mkySO=_rA IH8ր76s/9 < /h4X 4)--+{ԗ^Cg9bsRONڹy?hP};wWT޳yr޽;vo]Tԥ޸q䦦 04p`ϞEcϙtW/[nΝvoذb_!Ñďv-y啕+[Fw9.$M5K7~pVֲ˖Ν{2oe(4o+:wNLl߾]i׿&&X+8܎߫v<\O<_m۴iV Cۣ,OK2r .uVV56>>iO=nݪU˗WT:t@vvffjꀁzu(+uuKbLil"fܹ˖\x…sڹmۖh]]UUqqaanOx;qСA9]Go|'?NNNM=~|ú[vSm\6UJJ8<|=zL0icxC_GgjKڶ8͘sO<^^{M^riv}5Gfx+/\{WuxVi 6'Zz}믯X1bXYYGc}'[t??WJʿwƮ3xP׮yyo{֬_}X譕31i?o :'$|xUWsĈg=ŋ͛sF-|o}3k4z]wE: 2q»_!ٰquʊڴ ]qQ92#6]~-[F (s|=?#O<c?k'/h)%eҥKν`r>gDӢҲ~^^rŊ#;+kk^zw}]ΰe >kkf̘;w={|嗇0a#Ϊܰ'Lnvv;wٷ7=-:\td(iw'&[s%'B۵o׹ӑaOWWАc׶m֍סCIɱc5k^wی;gĈCjkY.\;o~99iJu5zСCwǧl޲a+cذtٻwnA[UT}WR&߽?߾})SM2kʿZcGZƍr 1rࠂ{lڱ}΃>X=m[eyy{w۷woc}Ƌ/sv~msr[e>c}Wz 7 fd&&OwktMM1WH={{oֆ6yyYY}OLl^{t) KP>'+7`={ׯOL fohBҧƏ FĔETC@y;:sw7 zԆ3p 3̙UU{n)m;7&%=3OOڷoQQRgn_bmm8Ďl~׏pEUu(eƍ+_+jONްae.KG:2#IIG~|6W[Գg훙[:7ok[9h55<7#'&~?O ;AՎ v/r[>tX8ᚚ9ft_T__[[]pkVn>=Cin߲R׮[lҤ TY}[%튋RSݽkӦ‚99))9GW&&֧*6j*#3##6W=glWr* $%56jjD{tM?^b@O*ؘ9ȏ~x=G^^+ 2/ 52333} \SM74f̘CӦ0#}ǧӭ[ǎ'ot=vA?l޲nAzԨK/_h[S|pٳbkb5oVZ:1cb{S'F `\_ߪUVVֻv(ߴ)GP8|A?9XQ^wON9 7s3_WԶSܱ:Y_Аsϝwk {/(;u~^‚?>P~Eyŝ;| ܮgnݺ~…_0[bGvÇOKKNnl,i׾}??oAOEA@4ɉ ݥk78޵s7?Ke랽vm޼jեM0n\׮{SЦmaIqRRJJZZSw[p~K֡0n(bź{0i>xţG-mLHؽg׭ݸaŋ-zq 1&]sMCW8uQzQ4:rԠAC>%=)rS=m7ؾcŊN :>p66q`ie^zi!C MHHOkժMt0W׾qÜ9͝cǛoY3|}zZf3h>;}]߼y]-Zd9s6[W/MN䧮ꫛg(R}nhX`9gР}-{ܘm .]7|g=|iivv8\ZڥKҎz^76lX` nݰa͚۵j֮]iivvޯ߈GMI U[[~p۶%KW~SMMGCaa^nZj~o1{ 8koݺqduҥKhq^d7߬߷oDw-v^U8E@)-ᇧN> >~s >lYРogZ[`~YS-&P-b'p?|TRg/MmV ^PF@e nPF@e nP&[(?[Yֵ}QK ؽ'+FaA0t0!|6l Fe#ũ-bw) ?}"8zE^Y[ѡ4*@@8lnq`|0q#ZyS[T*p:ú`Z4. PNa%Nh+B8(q# M}Me nP&Q WS u>]27@(qǫ:`.GAe nITB} č27@$*jj؇ tPF@e nx5PCh:(q?HxY/n۶bSn|n r ԆኝVVQ{A_hc"VEgd.ٛjjvZ셙>K^iӞ= J:t(-}ǞsС32B!kٴyC7n\zy>-ZG"je~**}¶:F IDAT‰IoعWrsrOo%/~͛P۶yK/=yH֯[>SKJ/!)Ɏx +Fߊgei^ii9vW}瞝>}̌Qg^䷅Be'Nԧ?~e۶z񙧖.?|yGC_Ggj_Z[zU$Үa//7w֬C۹u>v'w>`ѾmKڶ8͘sO<^^{M^riv};c]+<Ĕu7׮j>`@&Lt]cVV56>>iO=nݪU˗WT:t@vvffjꀁzu(+uuP8||>s/7o꓿}(q-_[ zu]xѱt`z5Ǿ =zGB]v7~*~E}-[sܷo׮`'LءwC gk?{?K߿V: rc%%gq}Ǟ=#6}㟹߾;OH7/~{߿ƫj߳G⪪V5E [|ys+*ؽc๯ꢋ'OFssl'|sڵT[{P߾=ztxe^vUIIYZ]۱o[+ϱͦ7 Vph)|ZLJá/pqQ^nJJYE)3ީ~W8ܺÆwwBYYuրYY˗/^rźuuuÆ ;qݺ>o5^O[쳳gZi}2 +>~y={dgxOٳMn[omh zeeZk׋޿]#X⡧"3/Qp%&}v /}977-k 6rVǻ+N-z#F/9!Ș6^|y]ujjZZjc yם?r/g{-[}?O}nР />scqq$oU?O_߷oF[hj:ppc;n\{ĉIIk|aԧ_vWrJ8KЭC}[ķz}i6p׿fӦ>iҳСAp`JJrrmw| ݞ:+GyzڴÆvЪ%_q'>Q_A:JOo<4imWw)۲yƕ^wǕW;lذ1gŮٵYX%'M~ܜ6Al0mWRTܶ(蚚Χ8Rؑ tAXy:w.*JKOZ]tԹo߯};^aٲK9sD=\QU {s[eKuW?O}[|{_z09g>kϞkEEBBz=ӟ^[{|Pu^IpM~v'^aɱh_3;鼷{-\MMU뚢P~Dޓ3Ӄߵ={jkk:+tpe:>㌾};tLN? Lث9cZǟ~zN.߸3Gr]:7{Oϝ;޽=M3oEfٳ,5u߾o|.|yᖭ'\ڱѝ.1H$|lLrrbb]ݰGf͖-۷'%54yLNNFFJJffnNaWONް~ezѥ[n Э{I⢪k򞽻wmڔP+((-}i^hKQQ=T7ŶW`y,z*վ)]š2"֭+UTTV>? [ߔV򪪫wt%AĚKǷ}N ?t뵒SSCᆦ f|g6j44Bi91#GޱCShk7m >[aիkחwQVVWW{H}iN Mvعkg4W~ҡPZZIypʪw=!;;UvNCCmH~,:\U]SP_o2{vBB23ᆆHHbb$RSM74f̘CӦ0#}ǧӭ[ǎ'o֮[~NlSWX<4"I[퇳MM[x+^S DO^zÊw~eK~:S䔚h HJMù9mMIFx͍44ѳ[[cӶ훷lfdQR eeeg jjkyCC֭o#{G/N8ܼtLqd \s,׶yii]w'_y%Lj՚5?̙/~+_JzZvv^'6˩aͱW89maNFOٱ~+_3Guc̬fAT:x5A4˖Ϟ&'qF/_>oʕ]ܣ{3oԬy}KoժO~:wNCAnXkԔѪͻ44}=kǞHMᑟͣ5͢k~ii;1lXFFffNNE޽onܻw}lڿv쬩9xpCmhj G?oBBfFN8kTQqUՒ%?fڼ:o~,x?k?g ~~Fܱ}ǎVc]K.]e[rb.=zv,DSS;uѡ}8} YDJ| p,ޥ{ȏ~t/~ѣG5ܒf,lY4k׫ǯOnVWw/={ޟtܸsϽ6%w7_Qoƍ#G~w5hpe][.,(.3{+닊ڗv~b46ұSaۂꄄܓ7j䋂GiMM]]jW8v*/M~chtA }%K{yۧϐ!gݻn_=;--mh +s2{d܇prÇM:/?.uolw,| 8)S/+ؾ_/O?|3:3:w..Ȩݵ7_{m9s.ݵ+/oO׍9=;7UT,OOǜ=xHy ̛7uOӡtk?3h7rŗ`w>?׿ .8AʺIMmh(/ߺeڽ{s?sdOpw oڹsgyϙPWWQѥcO/Olʾ}:vWo>'<?55fe ֿp1Z][\sf/zMJ vخ]Azgo9iWR|bBeR?vᆙ/<̣Κdɏtѣ 'VY/kٳW^u㍳_i\ߔ]rɨQ<|E_K'7?> ܉q4ZW cb#GKJ,j{Y7tK/xaVn M;wĬ6:9q7ƳӧM~r>KMƏ?W?4kf]]FFaA}^{WzC-<|(ҥKޡg|b̗^z街_~`צu2p 5Mo G9j͚iSok_jjHDb?c-&ᇻZcY}~mKLIij;:xh:~jqݺַ~5mwqJ޳iŗ1rD0|;pR qZVЦg[.^w߾}{R[eA]27@(q.5-5HI3om]0b[N} Fmm'IWWWW_W\>tP>[\`kEVa m[nVU A7mMm &>tP>;#~q`cjKٱ?}b`Ң`$(hѡ4jC@8[t){{ ;aEY緇ubJċ27@(q# č27@(q# č27@(q# ;wWUq˾+ " h Y:9MSS3m_MLdMcS$M\rYTddr(e{4  e2AC@! `P0h(4  e2AC@Q4\lvs/m> ZaEe2A#p2>""faKjFٸ°E@AhraX)a:i2_qYZ',ٌ2\]JמlaXG2sh3ˑC9E@Af#̮ ~̌Weagv=ܯJR:;2\llfv=ܯ9ݮO.p 3;jv="a" נ(a̾3k03hnm3% >\]2JtGq0K-¸6N͢"a92\,ݘfϳI(B@Q6_:(4  eO@Y*Mvy˟ydjnK"\+^{'Far kG}^0#b8Lofy뽱ںֶnVLji; Xz ܓQuyZ=mjl1"\TRwmUPOe/~]\gUo +Vd ʕ;vzywv?j2 :woKKCCm3g&&EDřL紬jJ>q|wֆ3g|}=<\\II^ÆX֚I˗.VTr<лꚆF/{dɭgO"̓>5Fcy眛ƌIJh4]]"ѿeKnn~~vI`᜛gvr [C֖shQ/ؾ}֍**;;{ 7^rLgjii~UUuZ%#GH]:b;?YQsMa kVWUUT*"ј1aa'4Tcƺio0k]w>/Tm]{Gik:]U~NHbbgHI1IK2[>xСs'MλZX|/V}i;^Ymۜ97tEn;r7׷LaWzC&ӌc>yrܻJeg{x駞~f׈]ʙrcCIo~3n~mmR믭xwŊWXXS Iz IDATX*xПҧzx/wCuvJ$R@`PdSOJiYnnΡ={n7.=>F'xdQ}n۶ed<`xx\V+lU*{{'G7w!k4z{yxl.<žŋ{pB{12r̘g{_u""t:'T*Zҥxgd2gOK֥fnN!nɒ}TvT'\g_+_ufFV.HpwtnAI*W5k>앗gHL޼\~BK6&slURUnoR*dk L0v2{O.bٳ;UYqc o2td22Fur\ZNِ{Hdy=DKɤП연榖֖fJPX)mm.W_{]mm˥RaW~N==V. k򁮵V)YzEu cF'%7e?L\q!|PHr5lT66vvugR7pߵB|Zrh0tݳV qNW(?x`А`˞J*B{zy{ ݶ):]߰ПZ' * /oa]kc^쬜DiMMjTeŻ펂¢?t3gM`^/5FcJKUvë>ӏ>RsCwvD3ٺiÙښ3gjWU_ʞ?+ rsss>vlŊ}2ySӉg&M?`>n]]sf'%I..>{h|?|ž=|rDRWwo SfϙRZ$|ݒ¼uugUV~+LtW~ZYFDLaöo ?O{<'wU\\xֶE.Y{m?r2yNmW PY-HYx;uj73Ynh=92$Q:YTzCHp`~OO=Rzyn:DO>iO?5k\]TƎ-+& !s}̘pw7aSOoޜiUU0*ww׍ tr|'|M265k6mh&WW''{0D(V,+f~ӋWLMݱ(#駟z5D*?..}='>>bͣ2fp*((/]WڲqCO>3$DfL)]:^M&j͚olkkjpwwvebb'N9Swb\?q@d'MOP🖍.\x-2~*J`P0h(4 />,\+^{'F(}CckLO?^Y+_7mڽז/R#k?b1? \:(_5ǎVV1Fsf?'%:'JKKJ {;Wi0sOr "A*:eee GFjTJek#m ¸-Æ7խMMVV1]hђخN׋DwgcciɉI&>Ѓ>$MON 1b9{;u^9UQt%&NtwݵxNgc_VMUuqqU%;^|UoOIINN>g΢EǎhgozԲQbc5#}YXx*Qnn>yܜeNNI[[ppX}?=~tJe047ѿVwSTt괺}˜M{^hٳ.?}dR56_{tV+A&s]wM4=%%묬M㏥R٥LĔ-/MmNTey;.Z4-1((>~˧!݂, +>=ַW@`PdSOJiYnnΡ={n"5_eo!ݻwKyD>}7xm[o۸q;|챑#mȯ.*,ꖛ;r@RG9[YމX\TTVVZP۹h4Wz  al]jMB~d}>3[B“O.[X.3##=>nn…w߭IZ&Y\֬W^1#1Z"qsp}\ԋuShR$rvvw32ݞkƦ?Q1\;[kTnU-;;r!7yrBq}.v&St)S JK˕JAW(d2vDȑc?^th4гՉEEYaaqq9G r!ե+ťEEYœQB7hrEc7؈}WrtJI_Q_T"5N(+-.>"844]߭a^ޞ"s;Iz#KLY% ˑK&b2Tӟۿ2#Fc i#CCfLu3,q^h9֦h4b^_lKYYt h5jw՝tֶ%Ō2[[Ҿ"5U,lm;vJuLHȰѣz&ĦeS ᆤz?vnhZQhlmmm.:mE4zn'v,糵Hzi7Lvy.=!N*՝w̞hܹgnٺcw;[r/['xB!:$0bR*~bTTvm6]xp_Cd2Gǀrr**x_/*&&$_HOV>WY) *{W+*:]U]ce75FDXJ݄HLP9LB5;!arB>H L$[owqSѨT՞)?y%gQ* /o[޳Gھs4."7С]Ō z(rLa|‚O-Ϗ>bH!,[[+8,4>>?XQѱcYGGE齞X\TTVVVP۹Vr{XmݷF!rl4oxخﲳrr$ .g ( `+~g={w~WZZ\|DAc37 Zaîƺuu>:&::+ْ={ |. 1;w aa#=$?1"00O C\9$ ux?|ÇO>YR"niva9SJK$>V[RRXwmV*Ls^L7;;o4'W,mFQ~ '+z{~rݍ.^B9~%ឞ 5GF ~s'!MqٲNk s:( IF3t)f. q7AlFer)aXM6SQK6?, K%-ǩ'?_aPp=8'ln[7ŬL77b02$fԓoep8'ܥ`F.J!27뇤!WhF=p=?d24zA@'G=pPWAdjn޵kŊK`NN~矟3Krkt=֛>Ks\h\K˗eWW=ݤR++{{WWw7?#&N}YK B@yÆԦ߿rdOCt&ScSn%%vv:;kjrsrskf(m{41kn@reI,LYdi]Ҷ++/ªG][T*~A蔻>u߾|mqq-cF[ LܬG/\8kvDRY]wLo?`X&sr6,<2"GEM4owRܼ_Rmz Beh4t]zpXeESȕw6fgg,?`5?%44"~0O.gj'yxx .o/}suݞÕʼʚ J$D0Pommoj65:N\.PvVeSTTB_J"}QKJ:}萋i]5gظ!uQRgPKkCWJ9οjH"VllUVҝ=xRv=886v9sFrw- ּ'oW'&,QZsEE {oǏ[&Mrr<ۍdf,*{V[s_gf4zx+Y{vۦN ٚo}J쳏<2FWמ3y{ӦifθmlOV8u떯W|OrxǷ3g2Do멶P23OHY v8'pCC^zU{Θ1mkK$7ݴx|w o2U<ڵ)SxMu@>O$z5k˫oÔ). 3ڐYY9w޳>#W_̌G ƍ(*00..6mC9e))B=ߛ#GrXYEᄚaJҲ+p׺z]6V{PQX"X^DBo߼I-b9v7t] ZNeg:tR1th|VSV~DnP(\\}rsO2m[O(haq^2~|{λTjee+ 'LWwsSϞLyͼu9rM7;wDCڒ‚bsƬ@++VӭO@TPP]sF 1-YѿBv^*:i_yxxzيDǏ sggXؕ^2[o=yr\K~~^Uz}TdpT3&~!CݹSV`AHpH IDATLf2Ŷ11>$D.7ڂ˫q'٥OM03u VVJ\>}ƤI11GNll,--+ktZ©BV$Zti?vPVNNm^S9rbL{pC)S:5-mm:Tjgogg蕬ճ'̌@i!x/_߄ MC9V-[jՉ-]:Y---:^_R{,uŞ LM$>ut2H*uvquqr:;;::5=בH<ƌ޺eܓvv斖:85sV`F6OWk:(/LpK33m5uZѾqϚuO::uO>c&ScΝxTK&O*Urn^*D}΍tkAb7|^mmgIJ x֭۰~s . V*- bT3g3Kzj O}/15<]{v5654 ѨnkSۅn6]"7Qc26ܑ[Q9w[]mnNIsl윛}}$\V{\$W~ hccmT:8[[_CrsGXGZ)bĈ>"qercO(T n BbǯdƏ;wDw={֧QUm HYY/+hCB}EⲒݻv直ή >˳oX,vv5*.>8ȑܣG'3zL/\(H&J%hK$Ӏuudg嶴8؏#^|4<""$ohz 1e3&=}_?zիwS[]sرw9qB/WR+=q..uu[_rr ڽ>{訹ejg?lZv_zz3j[O+}uH@,25$yt'N?O -""b[o ]'M4Y,V/\?~mz}[L&{;/RR/P(={r+Y{\}C}β5;118u6g>u6JEP`͏=S>_goڹs׮իRSjHrr:4((&fڴhBs/pPs9rRRӣtwOKMߴo߶mwvTnn>ޡœ&]#" vO:5&٩˩J/.0(͕سWԓo¸ Znfy?è'r %0X, Ck0@e hF=&P p8'odzTXtRaw profile type exifxuSmr )z=1f7F{I'uư|&#|1M-\2Ո"S$˶d@җc;MO!C]DˡS^mڹL}_DjT.ں9^%gDimJ+I/D.(]L-:,1.-eb Q(oX(hIݬ1 -nI*bQ2?qAn&v. +ƓU$~(]U\{BjMaU)>1 tv $I1RƷɈ@~Av5?nz'Q+]>w<ryAezTXtRaw profile type iptcx=1@{^8ϹcLa ]3lr3yhoc2D)ֱ  [CNbiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later zS iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx \g?$! H3\`>xP[Ӷvjnvk[^x-9guE<~^Ify2g!h]XJ4Gtr?V}K%w *1LP|LTaT2ŷ;JwĈIh4^ikSu:\M |75=}_ځk/.-VW'hiFW'g#ӊ+-mS]ڵ?֞=&vN 0x߷FNM8-K͘ЬѷRۿFFR4kN46Rn3wĩ VVvz3ڶ6&Ϸcwk_bP5UhS9~ә&n}iWe~2lEi5瓚#d@|ܬ$̳g.5WH s.9s+=e1~|@o/hZZZd*9bx\.AC|[`,+Z.olljVF{;k Ysk^G x<.4Լ4J`'LYzҬa۷*2R)kquR~Ʈ%;dZs{OJ킃bGNO2xX^&.-;uG d%EY99AAãD_<(RUUWS7GP嶶 .Vlc(s+脓͝iAV|l2^kj;Z9SZZ[[A]]uueeUUSJucJ&m2 FYsssK#7^hlWהUVS45)asw wg9 G[2Ғ'~V,:]רZ3N\ߘÞp'Ij;o><2R~ʊ+KAmŢ6V,gacdgog=9ѱ$}y͍W/߷eL ttgFV9vOI:ҽ؈=}N+kkkvEE{{/I]tVmd)n=w3M 5׆stz[[sSS$]]:>X5tu:$˭+67G`PTÞphryOG(P6DD~睜*(ɴZI%rH""bG`(rFs9jS^|e'N)-jmeZqyvvbO/ogk4Fg[ vSNyR?~"劊(jR.7Mlû{4X"аfYIIyymMssKKcVC\{wIȨ tq&ZA!V*8&l|xu%IJ㧼i!llL: /7 M֢ͦ%Jлrye^S֦ד$Cmc2 BS(=n $Aښ6[ES&;ǎS #/`VTR0lzN֩gPz TgM.qQ[vCzpJe ;!x <2ao74b,`juKKCu[̑`95CSSw@pX8/!x h^Ei#\A6 MLlxTQר#U[mLRTJRTLP=?w\k* }2xPRIoboG% 0ם u }`0\D7AΤJJ*ⰩKe3.="K%smvN5mJB6sh a ay!pe}2xa˂>_&wFB_ic1NJ ظ ,`X4/!x^ؔ䑣ǎ_XY0.]:o̒z5h465_z' [Z&h8BO;~_Oe566n,\|yrTXJtyÆwY/DںҲҲV^=2 Fc; jo8BO zN7t:-N'--+t"Wg=CFD.'hVq>|,vEl%=DEo;ϯ#?;x0c^CJ޵}TU)l_DD||RԩVVZȱ]~uHNNF&kkjY ps KHxs##H`ړg||䰏|ܹŋk׾5MWw;|o~χݨ^trj{SNgթTL[@@lY>;aƫynذu뉌ܲz֚ 6m3aa5Ji8~laaڦ&ɴsuEEN2멸Ltkϸ :uU^z {fЕ/BآEEmmv^~~LV+k^RRr…S :ӆw?'dxx E/ef>.L&A0lmꊊJO`/oTeŅgdfTCDG ֿ:mׯ^sv{yd[[C|;÷PG}<+ee.?_Zf0 ݰ'h}|Wisr~/Dqg㺊||qiyj_}DDL}r֬ .߿su_}k`\XS~5+W[KkHĉqqs99[䭵5UU4БϿ[3g.pq. ښG֭;A'G5:0FǺ繽,lQ]sw}bرqqII& FcC}fXVVҞC\=zĄgOd67]M?{w_=ŋ<9h*_Rg0x;J( 2M]h,Y'= Fc͛vl+yފr_y1#ojmnpu)) &Xs .iϛ7%!::A!k'@.[]s_Oe׹KmvD'λ8swܙwU(|rGzk$Wכ {[C7Z[3fxy|`uCÒ%?*pnAEG.X{ёcР0Bdw332ˤ b_uE" _}D;{u{[w i*W n7576"ѝQg`Dݍ G?6irIm=lifju6hIg-ukhjϞɩ%!CBCEX|}|اZ w{8w>D),Ѹyq8Nhƚ* :=]˗v\fCΝ+.ihP笤UV8k.  %&]M-*xW2|xtK󧷻Tɸ{ R!QKHygv3ս=t[7p @G^P)` I cfQ_7/Eb/.YM_h>;p@[ZjjjjrtxlVOj +m=\,i:]a-.]h떮J664הo6iiӎNN^M qƌ +vKݧ>d ѻvu ES#5AmmlP$Fi4599eg\̻ZZVS+ \TuV cOwco}|3 =әLXMRiL6/?Fji4++;;V'ۙc֏hTQ&j\.u?.o:S'@l=żnK aBpl $He%Ļ4n9ߤ$LZ~ NK۵koWI:݇/4Izmi4eҽ?OSY噘tqnn3LF֖:=`N'-O_A89&vc.[/ A0qNy =߆Fkj./޸&j(je%y Nԗ&Ii ekBv K{jy;WV9t:oG7@48,Md64?W@p>A[?m "+3Oe/*nk] V4Ҳj4JSR~ZwomߌyA\bO/Oggu#P[s1;ZI0}zLLXS*l69Ph>޷LIT'p/8{L;^"rtєʺڲBiS:A rsuar/]b$"7jeF&.+vYF;/=\-KTz$ږ1uuK٧ϝ"7{kkA\Q^XXrM q𨫇h:z0H&Ӫ5䵱YD<.{c:GeLMTTfg~DF"ZwK'h}|؟P8|DqNd\/m+VtS'DFI9\ZXPWkg=rd?^۽{4" (Udj Ok$3JqIhhxM$0y=k3^b{[E( 2$$ ^)iK=}]/gh؀Jťܢ˗* :]"H(jk]tL3\k;['ǐH {[W=PG6bI{ꑊg6 JuƬ9.'twA,7 aO ,mU7/9ceyyIIy#ܺFvp$qq\Nf;;T'OovpCCKJI\Pӧǎ g΂:_1Yi?h)n=-wc8DG/\C.7e{<믫}ZdNNbF8PO!.w缶hLm߸Y|}ǎ5khbFo IR,8=&ʕ_6ڽj媕y3fE 6XWRU#cd^T@%JƦWnhtEE H:>{mF=>GOVm^mS]] IDATL%LJ%;N%L h^E{gAvAAb'N@c@% h^EC,Zs^^k*6@(R%]/T6A?b*M*SWma x4&]9/!x h`0VJ**'&Ti/ʤT20Ԟ-&'NRɼeo/*bcjN%I}0AL8C/ ._, _WtyÆwY'OlZ…˖)-4{/L7wC_~-TҚJ#FVy.&C=TB5@Wz95 PڸUHgtG/G^lN%ӟmLo01'4&LRTUge%ھ K 6/"">>)ipgg++3P,]Z".~3CNzU*Wk..if?&p`0nR)-?}:ϝ-,^[ԤV3v)Sf=7pɼ#Z]Uy֭߮Z٢:qv 5jƬ3bbA{V7ՕU۷:tbɵVC 4ߟFh@ C氅#&kM3Y3*l1*ugZ<5uŊ_ l"fZoBBBԩu_.^T(n M'7oڱ6""!a޳ _y饙3Fp5ߧWtׯ\)3}HH3祗.?ʔ!9JY-v\s&^5z/ gǎrffYTAРw%єISR[910pyӧ!>}rK &F^ H%h sآc#Ϥڤ&<4>[ZNٕwoEOSt޼7F-I]:q4H4~W_}-1Q,&ϱnhXuYqq^$Ivvё ^t4(,LP,Y̬2iBׇN"Ǎ{W^WB ͦTnPU6t'O!2JhMM‚Z;#yޏ0 [ŅÖϜٱcLͳikȹxpZZq^G ?XjAǏ`46\r8}|gx!o$mx6|.H_X\.ru \nJQ8|x”#W޷o_VO2~A.tzcC~{hj4>Te41#/D8,/sOJ΃sf֭4H$D z_4͜I۸m[z7=K"oxرfPlڨPt SbGY._:p_km%I^~eSvrdtcG&Nr嗍vZje^zEG;;ڏ:$䙧/yO­-#cޟ6:e4ٺyٳٜKAzǫFPɼJb*ݹܤJMT2?w7pPݍJ\T LJ%Ө yɱT spAJ%@ p0PsV{- 6J[z0x7׍B!x ]ETj3 R5*iLʒ2*BG *aɣ_RUM%ssRM-ƒ*]3QQ '3>LML<ܩ$WP-QQDdbGMQ.!M*M&V&XpT2_Ϻ<.Q.8S;;pJvJsNT’Gmb.*,%/:ǏJdTR)3t53yljbkG*%%Qb &[dI ,ЯP=CitS*ˇX4/!x h^Es x˦,\lΝr+ju~>.SYF亰pe˓қNw S-m_M-u?.]˳gǏ>p`DĨ /_ΝohQ/_0zNotZD.ZHUնM۷չ<owD+w%-XEE: ,׌Pп1ϡXAAI>䛯fb3$<2d 77櫓'M1ٹSs?$:D9bDL/A47WUUW+(3?]F^JÇf?wzmmSZdڹJ"LT\MryƉU{oOL/nÞQ4⋥Kqqy㍯^ $qKNʪ[xZeek+!xO#4;k0TVIO>>rw>|ܠjk_ؓc}WT46 "W_'L9kʔpg'+^trj{SNgթTL[@@lY>;a6ƫynذu뉌ܲz֚ 6m3aa]-ܘec*qq:tիRi}Zo4ꬬ]۷+.NJZw'LpX#G7oǎKJ4Y 0ˤ%u6Ų"C\=zĄgOd67]M?{w_=ŋd܎%YP6kV֐srb[kk**h4#O8"C׮rG AqPg^&{]` \={Р0Bdw332ˤ b_:~2c49+95UZ&MKhoNzS:xpxH7P-.6e;SRJݧX'wvMX\\~aץ7%'7&楗 7wj;w̻*>9o1[ {[C'I_{f놆%K~\U^Ə_ꫯ%&K3(IzꯟΛ3Fx"O67}tЉVJea"6 `y$DG[[bP`hȃ(PAݿXE~1mmX?8xqw,ɑ Ϟni=njN' 5kp;Kg08[;4¢K:]@QNNo !Ǐ.\8w6?B2_U(F-*xW2}zttg ݝ&C`OyWr{m;@uǞk.|cT?? Cx>>"͘[YY]Ey/7wјo5klUF:tР| zT㷏}Bٳg ; x̃MMmNαvY9󮖖dU\TuV ]*UUm66֜R۷d2llηI;{MN ES#5AmL>]*(kn{ͺTi˚ npE[tet :kԷ|m۴iG''YsMVVBaPPTԸq cH Vλ}yJ$z_6~T$1} xI}_GÇ'&N{j B}z˖%wk 7n7bsl隚d-Tg\p?H`8&46mVB|[G<0M Z[[Zη`w-&V4Ҳmkĩ|.9qw/'7k < |W -9cdž BG,"ۛgVQsᴴ}{wQ k9t ;ȑ nb1)k.-=6bFܺOG Sbb^z߾~Z=e ǎs<`pr9eȑG^+SǍ stjssؽq&<Op4i֯ߕzڵFYcDm8/<811fأZcP8|DqNd\/m+VtS'DFI9\ZXPWkg=rd?G$iósF pH `2w^t6 t;pS'O,/bI$Q^LfM'r5M7;۶44 ʫPfggV`]\Bb*8]e<E{729-9q۶7n<{$lmE"_cg=ZشQuMkNHHRҢE>K7_ҢR$+zx&&#غC?J%5~'3_߽{tw 6rҥᘾkFPɼJb*obQdg&O%%(RI(yɱT"Q4`X4/!x5Jr@W̟ WMԛL:j6I6 2Ac?QJ6SJ(3h Y|2ˇL4&( &z'e#/_1P*e*LP2Е"@aFRM̟*%% WM& lp';)&&(|^@b=Cit3QBiC,`X4/!x)Q.۶#bb/?բ\,/ ꚋ98xlEFs֯ifpɎrшfF( ,4xKNdl߱}۱c%mmԵ UU[ /][['<H%>Ow0^$d ^hu/Iٱ}犋+* [[&͜5eJDՍ52NZ{b2aw^usFc}_|t=..o de՞>xzֿ΋/nXO1ʕ/d2 7oYtmiӞӳ05Ҳzoٳ₃lmofS(.9rl׮w;S& O ps KHxs##D|_:J/Ziyj7|]%'ϙ39S(JK33Rϊ/~ DAN#c:?ON&C¹\0`34ddS7L8iҜ1 WN߳g׮U+E-7/,%76kV֐srb[kk**h4#@Plһu}Mgݙբ0A @?^2Y))eg,x;;r˗.)911/4d0sbNnn)РV D|~gtv0a;sIXؠA>VO?OM=:nPpF(,[X̟?oޔhk\xI"W0vn3)EGN/-hnFST|2#+688$'++.e2riUUO@@V^0eU03 +d@yFGL[[GXXllR&NK*ir9/Q8|#G=zuj귫VPN7.4ёF=x`ǵ_ yK9t ;ȑ nb1)k.-=6bFܑ-CJ#9~,u>>]trwx, UHG/tj2޽:/' |͍q7ove~l*wXkuEN/Xdɴi.3o;q"m`RY}Puziى;oS3!CjַyᅵkU?䳿k4Gpr y#x3!A$"q3n:|>gPye_,9|HBaѸq^~];r˨Q=3wRض-.qF::^Û4vqpp0Aj;w7/O/OkPDsy<=+[ _fϞ8asίJsVnݪxcĮp}]bb#"d233OOO/; uYsZ[Ʈ "^eڵ\twѣ|¼ײJڂ W8k㎩SvtݼeK?`ѧEÆE9:i4oذiciɳʪs܅RӷÑ#{,[76 T$ڽu˙3Zpsrw3mڴ_DdJm^ƍK&1ngofTgg/,TTtN ӳ563DZ[+*RRTJcR}<VJK0cY.0?Lx!W8;7ztxZlٮn.o)Sbb\2Yhw<ؽ?tiJ{`@>ÆM>tpsڵm ^Q>jsU^e7~>ln9|syfhSS;{;v^{wee]]s\na6uOL6tSwQ/YsXBץmZӝw~t78ZzW ^{}+n,G 2dT UTJ[*ڬV.XN 2e LzYaA?;V{tف6HA*G >aBxws*:F^OB* ?Ñ5eju^O%?:@c&RʖʊR_'j0°8k@7P'*A uUDFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxFxf|/H 7E GP5@6FxFxFxFxfLBeR5s+PtTdh'Ƶ#EJżðf[ACciR1oN@;k'GxDZۡPjV`RS*q.٠Nh'^/pj;P'mZN@;n'GxKSQIO?eaRLҽ3τ 1q|V?nw4..11ow8}Ze蜟d0'290:۶Iӵ9uw>ԧ'rs 5ju:~7۷gdC07551" M+u02ojnk{ͯ'qoV;)+[b򒒅-\6k̳<>|xO׭7o3yϚz{y.vٿU*iHm\(4^^Gzhؗ^޶mߙgEF6NjR +<=-,2Y6{t2ZfdnjeH/Ϯ28;[ |7ƍT:\!Gj}Wzߒ|nتL_cϛ򼂼cǦO>-0j_ON@4卍^=nl>=Q_sGqaKKzZVh*Ν+ER2N+{oN0;kӆfIKʤ֢nh4Җ}qG\/2q;SS7g7*#:Q]m]AiY9YRSStҴ99}蘻g}g^z5j̨QǨ? F^nuK= r55:]aAmFSTmn޻oNnYYzzeieUUUBBn~G |Z/K'zzve}x^?hvr%cd}>xtYYKKkaNM /7HHSKJT_;[ZJJSRvwS :++/Ooo^ x]o}``O={׮>ܱS:ɿ͛7cFK=럡??_ ^VTXT(FFM]|~R+O:%HBv{撒䔔%y{ Hxӂ8e).\.=]g={Ds~u]N Si CTѾ}ƦLф[Ӧ<࠘}F&kn)(,:_Qz{;/^@--mmW8i/ܜP~UsLvݷgwWus4:8]Ux$7ֶOG?/~ZZ:n۪ΕUW75UB"||FlbTv+qםo}Dž>ԇnh\ZB&9oϞ=|XEEmmCå_Y;[cW_|wٳ]շA#G1p_~g.~ɒM<=)S|}~pCɓ\hlgycoK/xv&&^^;|E[ՇΞ8b*3O"n*M}o`X!VVvNUUmj 5{۱n[M/+?z4HnuDĴۃBB*+KƌvsssxqyU՟|ac+GOW׬̒҆_O͟ cc+xBi +ffҿ,-ML [TV65I{t2.|-[mɵ4o~ڻ nGy׻2|ÏDVEkk]Xŗj<#RQ^iaX_Rr4hHӪjum%JJ#bG?d%vvV]~[i VVÇ=7o=ܥ֞杗/pC:--e_~egM~!C|}f͒i]%Yiew#>]t*q떺:b@{Y=mFnbPXX}Ε%wr ""nP89FD_+=uwok٫VW_4OnݿĉJ=88:zwӣgmwb5SK/QQ&&;R뭭KM]b)*9ywjiH_}5LƩn).).2VF |VMZ ۩SN~|ú ڴn.nns̝{VLޗ .^ ݳw)YYgkjj5[t3&<3_673c[Ιݻ:uUcf?f3ǎ s7OVל8u5[⒎fe77+AAO>kֈ:ǏjJ9aw>v,'9 w1cn}^ѥK70,יtHCçI1ѓ&ڽv:q׮O?=Dwv˿MKa;vUUmm9XYqlbbImث씞K:X\bkK.¢gψȀ85%5s̋uFj}tiRB2jԝwLJ+N޸_Ǐ76kBJe`PtL> IYY|$gfBC; Nؿ/#YMj&/P2aoqiToszNiNVg|'XPb#mmf*U'UuMq{Y.swvww\˳e窪/-[~7$%ȣs4 -§x_0''___^WS[S巓k** Oe:1s j3Sv}DVkkqɩSYZ_Ǐ;W47߲uɒoRP(-wY]{Uk枱{{;wΜiSK>߶ju[o-^_C!ӧ?s1&\*@VXu {2mlEO>GzuV'$|sƛ1(_Y-;6o^~aac}}##KKS3楗36m|O rv67XSݷ ~I߾c{>G+>tђR[;g3"OXR/G5ŹkW5rg؇yi|wCC}|Uʷy;=g \<{ק˞񇒓[[{pmTBLs{t75FRRw_zUC߰4]Nglme56:RjWzfjT4FcR J7VV{;:ZZrVN!s4+ \:b-juzlJrҖKh??''iƅkۙ[4747w~:]Ѥ)SK5*Uumk37ڪkkJWW_?g46665wؕ*n;{˯;44g'E_nns|Is=u35|寿NH8PX4zT_76_~}icFv.4wB=zt"?g]w `gߘ3(0yM|u\cDžxҍ Jgjkjjcc33·elnjkj2N76n3n뭖3vۣmn>tB{mOI]]~.:9x_hR%'73deTN0c+:_qΙS(nCYAAvf^5nj:?7ΑRI66ffukjj`'_Rib2=ƖJ߁F,Q-~YRdƾ͙;mzPͲڽlXnt;޼ys\Km۷=kάY:[B_]=zJ2jQ%ݨT*ceONSC]]}oUQ&oh_#ѿXILXyhϤPbbsvlӕZ},=Z҅Z-{zϝ;[RZxZ?b;fk_-I<_Ǎ9E--IIgr[Z췵V*=Ojm-.kj:r4,Yz!7_hIi%%k|qzſHMIK;"h!Y[XH7%[[4mүs܈mrW>}ۼcGrRvFӣ{Ǐ''ggKǎeX1MbaڷĈAz1557:66"ED H >7LiSq{IS)敔TWX}{Z46C1"2Deeu՝-)(<{VtTkϹ/EkXfΘ#vCЅէO27|55JDeYk>/}4Joq/p_pZ[jwxu3ǎ筭MM]]Q;9xp4ҠIw@,6ɱgK_Ckkkjj:gkkF\ݶ";GƸRRԭIg=qon'KDK/uwd*5*ARwpȼϯH񶵳01qq37=Wo޽.>nBCLMRSLO01(0*BKKFơ*+Ј(_ߟ'C{ZFFVaw̜3wҏ>ܴq|켇8w,o\;)/O>7a8ZݢdS*cە8yxΙ'N|W^IM]êUC?Ckkr99g&N8!-7|_U̓U'ܙ4rT7h[+ ڊ?޹C4iԨ6F;7ظ^t%7iFokhZDeN&S(&N;s{FyFljt)mC󽕫=WXTRӻw)Ur4Ŀ6"jc SZkg!C~rsRl""}zo\}]Yqu;w&mnV<%nz쳷 ]G,xäťEdQ55%'^]3ќ+KHXb77=rT`S+{*ר̹뮨(U+bÆ)J,6pCjC%%m\q_|~iӚm+2333!!!=4iiinna&RQ߰w}շqC[VƻHg ׼N_^v41Hf>vItvsu255oqjIfdnd%$$&+SSn} iJC9--bŘR0(,wk6 ?(g#WHHòQ#zZtqqqV(zM?FF,j_Sڶ쯯4yҤP{KwMM8zή_h?_i.ɽ{رfƪo?ukNŠA7w~~f%Qm]f澽} عf[>ޭٹ3!!2*2fDrډYhHhZ]WWWmmů^z{ __6c%/"䩓57..-vҒf }LgYag-0]yٱvǧ5756WTeg8xtm[t{vn>xȑJivBOK۵kmӫ*m{a&󌑐PY1`AAAV]41gNsXY=<6,Q DUTǒ6VVMeՙCMi]ݜ\'۵+`FF}RoRUUX$sv7wtuR BxK^R^iۻ \'O̒'ݼ1W_u).!ᛥccllopLfqm[Woh8q]_n$LfnnjZS| >9/:Lԩ{ilcpx8Xom>qsg`wwEz[uggkꌌ=I:Zz&,<*ܼ+ ҽ{**9;15GP*)2 MҭB;ua KuGfflR1|M*ڎbxfY0,-Q}‹nlloҪ ?>~׮}Ni{ 5 7܈vb7"$4$Tn?%hrs7y霹s""#";VkkgkV'ILTԵ3.9eݪu rr;<3*GҜ!=2 s(wwS򲂂ӧSSO9{F&sr ޳gpw77O __ӊӧSR9|8!ر sa==ϝ;u5{숈p0 exԔ#g[GlXXg03=~"ȁRvcU:WP!/:2URx];u萴2w@``镟\>}P*CK`H*JZNWI TU?}w/i©^ysEk!BQ +|'igr?tF~͛?xO+%ZR҂ǖ-{o4y+2 >GV|!RCa0.JGpEхp^\W5) O͜3nV6ں ~,+wmu"4fxq#u Wױ]]# CGH Ҿt#9y EPwia~&lu횪: |G \Ď wߺu!Ng#W~ZnO?o(Q v++QafRfn7:&wr vryâ9R9֡|s35[*Np^" ww?_N@;d'@h@h@h@h@h@h@hƆ D00 IENDB`gsequencer-3.1.3/docs/images/ags_syncsynth.png0000644000175000017500000022117413607210263016406 00000000000000PNG  IHDRp-zTXtRaw profile type exifxڍSq gan+yi>ZB[>e يVՈ&U*5g;{Lb$TksLy@j@}ۓ?tT~' 81-~)-N4zWF_ k)JhKro}!FJ{-Y=M(.da.gԌ3lcj,!//⚫hB ˓:+:w<{COTW@%f|Q4=wnгuz q׎=6"̳p$ \SV ET TT9:L OΛ쮩[<`,z ٲ,6l)PJ6cɻy/p/"? ?SĿ4nl&g6+|ƾC iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - syncsynth screenshot Screenshot showing the AgsSyncsynth Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later N iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\SW?pF#Dފ AEEjZvh[kӭvءukOPpoDd/QQ%ސ琿?QEA>-/L8ܛ|%@Q[ k k k轻&e_ryc-h&ʪlvʪGO,$D.< |RvvN&Y[+eu|ۋ(+ De7߸7zKSS"TM&Lq /,v-1q!d F\>sքQ&rBVQYU]S{3VAi~:q"r.7 kon_lټ~ݐ!\nx:46DO`M*ugRS/\=5|K/ef啔IZQ'y_geE#--=-RPurb}=uPHVcbjdD_`ER)F|}|~7.<7n749r(fѣ<Ǝ[prn;̛{OmPv>q25ҥ;v0S  >Yd ŢE3g?`ט`zIZܑ璒.v,bSߵr3YY;2e _ݽ7?(Je`G\CZZ_ruJJ+ZۢE{MEDD0y6{۶Ç.>I$2xàArǒ:9JeAA$DUSˉkܶᰌ֪K*?oV9kiM*+LfAAQ͛ ÓZ_nKX??{{F=;>>.vӦϟhLr Q--y/%LؽRKWT46644776WU{aSںBaMUmmM*\V|1jcꫳfՋq͛7?coOb`<~,.3g< #0`tlݕLM#Gyz+tsIIikFvzyKz6%ԿN>R)jk HsLŖI)#4z!@VƦ]\""Ul|2=V]sFf,& FTԱqFF sT*ƥ%˗I6(Ғœ+3M6:g0ջZ~;R|YcG%$de%$\fG;?0`XR?Ѐ2223SS^UV %:eJ5ZZqymΛoDbGKVFFzŋCH- y$HLy-&NNZ۞r[xZ HpBabl$44J4uu>,,&s$;'G\3f7  m]xV(X%n2 =ph\\V)SfϖJIP@W۾/CBuu&:<}=C#RF}>7[L6&=\;;{{OώŊԔ #ʏPsO7"DJ;L&`<$b1B!s?仺tɱ=zL\JHgʦ&ɬ//PbR(mm zΕˉn#GۥR&֭]pUL:FtlVu3?;sz̘v ag쬩#?֦&- fϞ6M$HJJxҥ=Ş;WZ\tY_d *{zzz x)BdRi{HD—^fj. .u][Ƕ*Th}z3b ՁuqyTV uF8=0ߢH|}cdf=<spc;wgfef pssqt&@B^ ZY,V(H0i-nﷃR7қNKc46Օ >\uD55bR&J#WSS|&* ]:% K ]ͩl$ u3ݐcTKӫo(.& \N]4ZcKCCML4Ϛ*LY*!EӅ&;(@97R"u曚掎Os!碣~gba3;3R F]]}CmPdu04pfΌ 6-<<,,77//gϟ]z˖͛?d2  xHV,pJJ|C$7m}+4a2BKKOO!Cn.(HJ [Qah:R(MM- Ϣf[^$ΥgdR66^ު9,NYC|}uFP2A^R*rbzZz`Mml5mk+"{%ʕ˪9&S.76159uRBb")($ԓZ@E&NWSsssph+/MmN}BbUUV),4qKP_/***$Yb@``jrwTsȐK 2:98Xhm]aSY||JrJ EKN;ͶmQE*K{#B`\ %;;#q1~С4@^8Nŭm=_sꚖʒ܉Fvppr (;=JGCCKF#ʻNʢ{S<ŹErO>AݙR(w\ѱkov))Ϗfi0<$d HD2%"lܤ͛7nf 6yѣCCy|qUeC}Kں|G$uri46swlMMr[PPW[Tt%WMMGޜ `/Nsݑ99yyTH$'O?(].-VeEZ6[C]{Y- lŜ9wMoV^׮Wǟ?{FdMMWex:O_\lns94YNT ݡgfSnH**tF^^vv>9{xݻ\geezwR\!tttǏ_OInla0HfW Esߘ?F5̙'O!-5BrRFzCC}}]M zz L>!Á\-u\ng8l(gWWF檫'ND''oN@tp0vmqؓ#L30/汘Ws3SR.%dePh`k&7zB(sIcM7\lE8ؓϫ>֟~عA#-'gT!͋-|v^RXXRfdo}ZZ).y{xsy_m*!dlFG2`WGW`pvUUS㡘G3^KXhm-=gffgkk5498J"m "@Y"e2ٷ/6IH ՝:-pacd3BTXI)񞞃 P(4y"m NhNT4(@)!}A@کzR2/6Z'6)R(2Oޗ+ FJ [޾Ťe),>=7@oS%RR؉ bk锕M07#-th [/ۤH)2w߰NG;>fH@ :KUI-bSr'Eu Ozʸ~<^l:͚I ӸNF Bz())&NN29)h@2.n_-[K3)( mk%7'E'@!@Џ@vGH&'yJpv:(g(wHuI-S%RTK6v:(tK]-)$ĝniNHL&|x'4t,|aP[va:p߱ .^lٮ]rɄ ~ƙSOT<`~êk>>p3-'UP*'wTTKP-M֩!%UMͅ׮%&9dpp`Kʸ`N?pcb**._./W>W(0РYW% ݹQ~gXriÂg=oߑwK]7onh8rP=Gyxxy!|- hM{{^ށ˗/Yz>co;Q([yx牗ҿK$**:uz?{၁..=y+VIΝkj0332ӛ4y`c{%:PeeE9tBFH=;ʓpIieUk[tԡ}{oݼbT__77[۠Of@ Ų?m`=vÆ+Wٹ>pwTɅ=];cٻv~ED8 =sg͙ymҤ/\R"YOϞ}|--飏n)*tpXΝ7}n:u?U=y65ں1/Gۋ3L'<Īj^S]*IRYOkPTV踸DL13, k:}.\Yl8Q!;IIb?{6;ΝMWwAjIj  :AϿ4Gr%'/uSS}~~^ ~\RRZڵ^}Ocbђ=X_X??{{F=;>>.vӦϟhLMp3vYk/k֭]R 0M<w?ݷ-ⰄFVVϺŎ|ug5Mƍ1<@&55NNHHê͛uGs̜ih뫚+/vKڵkYǛlQӦMHBOyʖ:2eON[e-׭_`WWаW_5^,noon޼y3~[.P7(1)) s渹vGpk~r47accgeR C.:**hPha6<\11wXXϚ5]VK ￿ya͘e\Ttw*HI45X&q{MMC}[EM]"j2ڤffS fawkS(**RSRxS_"~4gfdfVW 6x(DY*+.9ztmh5*$¸;W/;ܬP=#\L>i{z.Y|EqIjjjʅÇ؞ԑqq8\/ GBabl$44J4uuoo\##:9}v QQ7?O?=uCg\Y\ .\`bNg0T;upwUbO[ۛԙZ|[Yjj-]+VDNZZ}{ӧ 51qu5Π֭ݽȑk^~Ng2Icb~>wK$\KVÇ_).jjjo54B'gϘT9˿>wV1ֆN_EmcL34UpkJKkk%R᠁~M䤧KG3L|q?AtqI %y.y pr}!OuUU(D8|(*4??/O&̄B>Ǝ[pv~T TwnX~9^Y9oނ-˙LJnFj kojkUmcFYJիMMJ מ pr&"JKFzJrBBccmme@䂂,>7,*Ss(fߞ[ZlO`:74t?pcU˗Je25#g%%'\E2]$H@_dG,Nψ.n704i]lzwU*/g Í/>Oċ{|[#qGff45kkkjnfS"M7{~պuǏG";Œ1~~L&ArQʫW kk+H9dh BAקD jnu)eiw*x/M'wXSrg Q=*(@p/DsNI=|xi >y͠цwpppvvu54+?l{9UvxT [`0n*($y&rJWWO\ڿo4\&kkўlM[Byd_``rR\5 LԤUTXP1yB]C۱\ڽpAbTd*<ÃdQ cQ[]]SUY\l @2<5hQuwۅWrlmU.S*ZZ:Z* #ûdd߼qPGJmn8S$z3CnX[{xܻ3ҳ2SR qIhD s-knjv=:$d ++li,+P5΃IFE+ FCC^3Gm޼e3?;a{coXHQޝ0|O{6 OӓK*?oV9kiM*+LfAAQ͛ yKHMkVo߶mDR\,y&ryeeY MgCCQ9i4CCS3Aˋ**kHr(C+tZu'wzitzv-ӓ3ǒ:9JeAA$YSˉkܶᰌ֪]+.inY 'g`prEEރ<=U}}S)-y/%LݺEY^^pF133^m!5ڵ*&%8x{aVVNoJessb5˿>vt#&Pu/~oН|{ŔHn^ͽyS&4G kl6?8Yɼ{G*bDB;)1R^޵9uUU$b55]]3OsH,S($WSKS;]?Qǔޭ[Tr>=dU ,RXSSSNSs}#=Do1jj$YixrsXtr0XHgxW\@ɥ}ØgcJJ:dd89 Pr^dme%ٚpv4Xzzdffe$IUujj%%oNzsG]N)o^/J_~ycCh6\FE=xFI"?^ ][gIII'Zw/Tq {4^:Hӄ#%t,)ɳ`HiT7؞t$XF#qv2[뷖==O.'M*+32.|i$6;) SruK"E$8SfjZG}ΜfQA,XZ9; ned]8ďޏ:v4. '`t8]YXL7IswwZZ[۔J݋!8vlX؂7CELL[vx/>/a|~k}ա}o7c9YZ{$S߷{MD\lڴAVV>>Ç޵0 `anhVV)cIJ8D>WL:hH=;Ǜ0O(^{* MdlBd49ld:R[Pf 1{Do0z9p2DMk+yF^^jP_[$YVdw&MjmYyy))v'? p бHDNE]~\CC&33vsA4(s MMJSmټ@$ LOz񿞃BpMt)ԼkWGi-؛/ٔ)BCCn$1_pfZڢEa>>C$lCNze; aiwa2q;IWT($vDp833z'kg)aO?>/nYkish4OOO(lijiimU޹[{k8Q;un}xBctl\g&SWMdbr{xhiM4~[WYmo"Qz _|q`y1KWޠ2iY$@`fqqgN.a055tuӓA*bOOOa/_0^*mo +)jkR٠A"gIO#| L6L&,[v.r֖C64Ik.edO?4iJe]skV,#G'7LIS_W[DBuury-&a(~)鷺7[Ꚗʒܷߙ;w ݯ0^( RURR\\SCdQG-U%zz)2o$Cu. S.7615=qbŋ..>cH$jWHKp>4z ɡ;K=J]]ss[DH{w :jFc08rd MLl:u)!1}_hhm!G,I~N[Xhlffg{|jJzar6[C}5g_}ք=65WUTU1HMVVspsW(w:xBi55_VYfI$6ɽ>Jan+W.[ߘQ(jk+**He @ lQ#9Ⱦ;]K%7^n8Wu+HOJ)6FF|lcxxhM䶍޸AB*{ڻ96|ZG,(nUT) EcSiN [ZZXu84S0ξ;yӧw=sZ8x &i Q..0WΝ;~lΒL}=[[4r%;>Q(d w.ѓ'Ǹ Og:|}cqcƌ߾}˖]~Æ2d1cIrΝO*/ 㿿ֳ:׷hVeC8B]]WXxČ ʕSLFBI&rd\Xp ;vlzkׯÃ%M]t*̧;k)a&El޼q7+7lشi#G *:p`?IϜC%L to@?=ɔH||,LMRKf=HOߩT]ݢ̒:g\j=}3LM[ffVVJ3_YZzVRWظR ^tx6N%?'Nlj]y9#GFmX_Z*}tѣI.TMU=_AH볁o JΧyyv =3 NnUP(MM-OP+ 6[.+3|oׯwXnodIoZ??dgg 5Ii55 [[<֬Լjʁsptg0jvG Ɠ'RFj];3223 G#{HҟOh4&yB=] "w~U$jmv%11뗟Mt;[:34pfΌ 6-<<,,77//gϟ]z˖͛?d2  0BGffvvj!ot\z-X DjTy;~RWRԔ̌Fm);88b=U[0"POB37ͧOoܰfD260@@54ܼy)K >'=rS['UܞiutHyz2قs^k1{ڵo_A}}.WC?4Llm:aS΍pT\\⥜_5660 5j׮SZZ^ЈÞ1e9g?v๳ii? :mЗ_54~eGؿm۞=xl6fkkmmn6aks>JuezRgSS}}6aS'/ƓqZZZY ]K4 fЀykᒏ=Le}9~4 @ɻkN ;;[Y~>?w8:j}[Zut\oWW[[U߀e2!X2?#-s5d0{GG'i:)ZY ʺr%Z^^YHqRi`x劣@hk H921vt:tra{{Q_ƖV! O dz IDAT`;<ڵ49l2y||JrJېu`VB 3^~vEF~$:z[ɓߘ/iVcƄmܴf͛/'~<ݚΝJ}wL ggku,t'!!cXؾuˮi?ޗ4ˉhT;1!lv{W-h?gf޸]7fy50 ׯt{ta: wssphZY~Wr*+eՕ!VьJVg,&#JLYOHi#GY[[C5HoHKnnvsuv67{|x2(;888 qGN$YR(;)S-^P?6rNJR*Zƶ~#"&Mfb;t*/#OJKhuzNNV'ŋ~qӍ5K1SPKSy;~`gopy=oY{rqFN8aQmw}͇:mON[@[yG-^TRuӦ45JS}:#rSmH^mlw5[4ғ3T qqqp=|N߷/"" ˋ >r4y, Hn9ijjփll y:lTR[s 9۷L++oo|/ov᜻{g=!k'7l$Ho&ƆFG |?#4+,]:kVlkm|9̀@6QfcV߹sKOZZ jkohi H6/QSs }֭W?\wm>oj*)ϯJ7++IM͛iiL`NNffZZ QOv؂;w.?땶y_5<ܜB-*<}*M.'NqӔs=$zWOy%6{[_9ZO@ 4 SS;"tw`'g;hMS'ݳg`OOޕlU|ә:%`gOdϘrŚ5ݟJ51 ';~ji8rĬW{w䈿^䧟yP''I閦J3Z2yx1OUlmMMC_fi^[`hs3do/d3B.Wp.'g5vvCTTeg:9}g=DIGE]PW,Һ&&͛7~?j&zLtk=ZO8esd:AJG mB1iR`;u0.vH_o 7g(MM/߾=rڵzȁ}DK~c…Ӧp88!7奥jMf? 0?$,i{V#//;; '#Gb{޽|> _zL =}, φLe˼ys^۳-zyƉKΟ!I(' wڵ;o9rA]aŋŋOwu]Η0R\!SjjȹBaaab"hhz®r9r㰡22\]]>;cHS &FH1#Ϝv)5դ~R&u FR")CHAkRx1vZ A~mk_E:/?.s0[`YX:,&MUQXc7vM,QbLbMFAETPAҷ XPyxavvx왝XbMdɌsvtu`d<@6hK6#yΚjbt?\2~q߾(C{qS~Hj3~SLj/׺Rȫ :hL4@Dbѿlaan/,,+:~,ぁj,#X9h6nih((TV;vJF y`IAK()Цc"k &D:(@s"X e2&ӧy CC6[[{谀>ݻ/[*@{$d Ƶkl,,RUM @Q!1 T|BbCM eOQYAWSS1 _`fHG"Vv>(+dLJH닟1OJV͛7e r@ۙA1no큢[̔Z9 Hr7o1쁙 =W> 4SE<@eaN=="f ȳ[:@섪*GN['ʑg0W4o8:#^M@=M0'kr=t03F\\9 2  @s.޼ U("E]eb9XB @S(w7œ|JLA^b3n=}8 4}sۧ;_PmtP0^9V'ai6&|JWV$xr]9 fdGr8"D҂X@ bD,Xm넊: A{Fq1e21Xr96Wc찎H@@EEd.G"bE"E" ئKBirr'TQoLSnyslȱxu6@" XD, bm̡ 1;߳b Or눁@Xds"^E"=t`fZ߆PџEc:g|#hkHo ޾[W77##%%4|)P˕=!.1ZR\cb(ac~R~je\lqT}J=MYY]]WgfڱcwAA~~ 1K\u4@0J(S(SI9E-jϞCSrnee2 UU)lȤIzRiDPPSA^jz&3h%Kc2}JjD4e9dS+W.W\D \+W*A 9L4AZZ&ƶvvtՕcuv]J<dkWM W&YqW__>nON`0,ٳ?] }׬3ё|H$99];ǎ75>u*1133SHz{>40N’Ǣ;wVÒZM[ťCP@nge.ѣΝr9FvvQ'WPА@'']NRiI;/kܷw)SUPPTtv>[Y*kVݼ ` pscqsPsB 1r=H"(ˑkD}wPnxvs_J]ޞHO/(().*d,Ŗ=\Y}o{y[޽>G:ٳw/ٸaϞMxgu쨪BYslleU^}Yp@PRqb55R(ܽ%[tԵ6)>{sҩS'Om߾uW -0ԄN7qW i?]{Hw#]TUTVCQHԩ_ׯ)}!C&Nph噙g?k?˖䤪 @,)&?ܒb esܬE.T||w?:zm[/ff2?sر>lv{#aIiuMdѨ>.15CT9֘@PXx1}[egrj&&]1{ΜÇh2YE#'uYbP}_{a;%!ܾ÷nyK^* F_֧lƵ}|Z(8@W,.>nyV(g2*d0D,^Y@ bD,">|/oCoUPRLUS]ƾu} 309ZrVVaQEDnl:dP-Gg>~T|ʵGO&Ӑmo߭޽lm44^uT$zR~"hԙ3i׮nh`eһ!AAnl%%bi ˖mܐu޽L_ϚխkӶ)V_O116ֽ{7|x`j]䄄S'o߃aCj^8 FnZZIIiimy=&#ƍ%ZNOhO&(P~^(Fn@%Q(/>F35mfzlLL Aޝl&4ۛ~cJo"%%#c=] 5zM  M9"_@׸jlba(22KJK$LWIxPJ DFDlޜad4a¾;w/X犹{9v}k"4[[\=˺WDRU2_E4}9fSBw:gΝll\\ Ϗ?fԀߞ=_K;vŊξl7z%ٛ6xm`%WJ x<*UOק~ˮn> {=|m;菂 8"D,fX@"b Ts%G.]*(kcHKd᫴p_>{^xXf>?%2DR][RACyϫxVXxֹO]I\]ƏanF܁T]ݚ~}g {0i⤁MB``f.,[zHسח_Mܻ^d33N^ԯKϞd$U))Ǣ 9_/2g6ioڎz;w~=q'ngt.L^i7rv`C(}eeɓl dtQ(T*"1﷪FSSWSSa_qYFƥ˗/dܺ?IyUUm%bEοE \^uUUH$FYܹQGw>^d:EHOb5L|8a睻hYYj'ߗH0w@S"!OP)T* |c~ǎ/5ьvP*+KJJK7S ~#Go=<<>(((+0-?}z|wzk3*2 XD, bxb^EEM@pDRRnɓN'\o']QZr5ޓ'i9O޿[\T]-DB[!KqkD5?_ݱK"O)S3USq[`o@o~M۶Hq 럋/ H/n!XPWW[[W׸@MlXlc۹YGxy bϬ~ui7D ݩkj,bgt7d0J^>}yUUeeuL`k()QRTGϞ>~1_D Nˏ?ߟvC&cHqӦ_lʕK_j7;U fb2`e7nnƦM#G5^8^9ЍBپ=*ySn&fl}-竫>--5554 ҿ߾F[[WחwDB܉s瓯]R?ⱏٚc17stj}vrZ۩ד/_z\ZTP* \G__KkР}{ˋAeUW"9}"ĉ KY4>vv}&**hE<^Ffڍ{663fhhBrwU%;2}KógOL̕7N>xx'3s|ȟzhkO8cƷnt 5579{6!ʲ3G llܩSW䨇%5ǎ?vPQQ~ry\Je0-W}zlpSUwĬ^M\:]I2'&\Jѣr>_O7ޕ˃OCXD&mu={_5oaı!(YY9:)HtS7l]kj0:t _~ٽk y۫QIiٓ =jjަ j6mܴq}7fLq >?::.6:Z ٶm#g|~RNZkiP >er{\[}\떉{魐ZjS'FmW&LBhjUUt`UA!))3ۺۛfٵ.GB{7fӦMWkذ!CDN~;w|p<<ۺ%{k>>:!!oS/x\[vu22RS1"$$(ϗɔrs>VTTRzzyymzGܼkgpA&o\OOOIёا4=moD٧O;/OCկˬ.ί_TZVЁ3gjg52_xR@|m$N뛚Z[?/Ə`nX}zd$˽۹Ν׮?^Xw{wqڍ.]lm%49;Vd zVd'[D,]>{ܹLǰm;rNN{TUոp!6ءd*+x{{xt  ).!2jlL|Bo4aҔ)_-b>6Qo6>cD,"E"bE"bwu ֕hbE|mdI6,b##=.<ƺV/Y_?HlnxhXaDgOU|LY*#)[T,+(Pt=N?_2W8FN&T:ζ|^7Axzii_WmlX]3ųg꣖obd7u;wae-?*LJ:qd|iI?sqVUm]mo>m;{v~:vghW._RY)5>/ү̨qر?ѩts33ex⌌ӧ:o/o`dlh@9R©-):]OĘ3 jҦMgؾqXԷ[YY$xVTSTCۻKgUU\{+P63c3M7ϧJ:ssbϜ6ˋ(h8`nf+)M>uܹ<^[XZ99-rݸ~R_(N1"4-wp꫕ RSSS.^ލ(P(Gyy3F/6w++oGԳj8qN?(RS >v,q:J$]Tz݊~-*~Lu5|AoNhLN e1RWSU10$ ǐGqO4`0%KfZNx( EWѓ'✜ 'N4ylW ȹO}]owo3ЯА2aOoɞ'SL;o֩o5GYOO*--==5%/QL௨PssSR&N7.:CWi.]~Sןp{DŌ_340660ԢRIL߾>" @" X =1q/Ĺs:w??0ЈC>~6L(Ǣ/&^/;pYӶ,BჼIeejvFPܼ-c>v玁ǹlЦosP"ao2i҈JӧO'󦂂k׮uĈfdPzQ utϋD**ls3'#/4Чӛ*L{f;z$6jR©?$'djFFvvB(1!sXĉBGG_p̡CTЮ]Ꚗ6I_dqu5j`堁s-\hjr2>6JI"3ZZVV{;UQA i4l7K)z\K]^QQ,&nL-X*LMSSGé%>Խ$iiqjkjjj"Ue6mjqq :vtrbjk?y"))=IKׯo{]X7:s \Iy7oT?$P9YzՒRP( 2&<humuM#ZJSSU`4|?m]PP퐗2Ky>/5im>@Y^-kB(srg_>wnP˿{1>ó[+w4P$xyR {-qS@0FÇϞM|}2޾>^AQQ4p`PP~!!-f*Uemݳǘqsfeu}q{Yģƍ[Gyzx~JJF_Qo_JQ:p WD|fihihD;H("n,P~a"YLh>_(P_tJV;+># MM舲 &O2tgϞ=p .RiThN:׫oٹe2X$ڽXtbE,љV[NQzztDR\Qq1у9%"Z@:@ %X,Uuyk[W)|TJzKӵ[OܷQNNzߍ))]]Tq~;oW88嗾>?5VWwʡCǏ .RtK1c~]ŵ72n>Hhmgd$^uܽƲpwOAuwqqv& | EX,u֩qIHoژ^9S|ےBT XD, b~&EMK}_JU)(Ok["#O޺͕+b禽i͟=͎IJ:s?\Vwлό&wPSkvtrp8r֮[LMzruzyٷq?woQZ\YQU]UI6& B*Ba&JJWo޼a1R^޿_^jhjA٫c}Mkd6S rttr27Wnv-9zy66/ݼu=5+[Afm7irGǷ_3&޿Quu|eJUT|i9ӚgHZ~y붶-tBlɣ8ZJJ{z[)&]&'{xOY,.,<x9;v=1mjG7tL&{T *L wvjMitKht}4EFtή/쳰׃wXO4047wsMOy3嚓ѣŞ|yI"PhgOU?g[MumMM%{۳凹>߶<"D,"X@|XKe@C:ݻϚOݻ*fe9$tŊ_~i~ K!~%CuCfU ?5s櫷MLq""6eqW"{8y_OYM +q+~(PRJOOOKJrqzSGOkk?.(ڧOϞ66: 8 ْDըQG|>B*e0=TUe(I$#SS{RSnܠR:n[gF rʮ]ۻ{۶ɕo+/?9A$rr ׌@SQLXldlbbg{̕IIJJ"@tHRDBthDdLUU5'4X&ϟhֶLjk٦)RR wzNHѥ˕˙l&SKӈccoB*-+Ot$9n]6tsDRPp<ЁWbCXXQIMMIIQQeXv{O锗;ŋZ^6 }z? ^^~]ddd޹y파wǰVd^"]B¥K^·:Ү_xխCk򛢳-wϷcɨ`#2@ bE"y2hm:(WThknu]vCEE[ˈ٫IiiR5K,&6\::**4NUWKt:Ç ZZ ':Be=sFwk+}6ǐ#Rbj[Di-Q" ۶m޼y_ٻwPǨqe][Y^^ξ>=ZvZjԨEƌ=g͜0Ǜ4\^zzԑ;{ŔS2S܇UQģ}Bb")>_\ֺ%:vAQ<^=zGۻg&n}2)C:9iiڒܹhڙ'1O_>BB ڵ~:uÇ>uq:mvs\IK8upX@.&Cݾ}MĦM7S.ݻK2'ϟ-hqR5uzO=UcUU4[-?}uy Gd@" XFDlS(T:9%9ǁJ0|O? PNI >Q'61UVttر3/%Zk+s3I>Ԥϥ"O6a3bbEuhÇFꪫzz{zduu7G)1:uRbʵg)ؘ͞3wSi4m#(''+K-Ej71b{pL _[[QbgG0qs+Oݽ@Æ];O<懄Zmm[[7^=-3 svnZ(ԿQdɯ=[bE'N9{dvW𨨈~ k 4)3qqIWn޹H__[;$ϯWϜ};[۶FC]EegE_}**D73%Z&shnQj*Lޮcn] Ҏuvrq|dgޱs۷\oMg|A|}yihܸ8}=܉<^RҡZ~ApuUW\::VV}}PYq :mg##l9|B&42pp}CMIK?}k*R}.env2i˟<=z3g-^ydϞCTVllL |oT5fy~]<ܷmʺڭ[n3fࠀ%[~hw<ֶ 8"D," XD,@#}b<*$  (' &Vxo:wʊ]hˆSE9#@S9rrWיm%yW\lgFFAAcƴkr<틊2o7e_D99oXD, bE"bE"iIJ7!;ޖs{GR9f Hr^ʒY9@DEEemyʠC4-M O/wBȑE(= 㾜O -,5b472o`fH(Ph[44*+;D 1Ⱦ77=h ̔yK)̴ 97:WˑFA'$(T*1גS%&zxtJUU4503/4<3(MeyL6yrhwuǾ#h\fL^~w*BV7o;!!YBـYέ#f)*RQ%Ffl"fclD,"X@ bp࿀Z\} 9AXd<: b D,"X@!@˹a%蘂Ę b77d +9#10'_g"X@"b D,i7h;wrraC_ Refmȑ 9 ~ﳯ'1*&|2\'2򪲲'Ĩ T35&y)fSq_N IDAT'f`D҂ȱxll/ÝE J+?7{y+W  Rii3 Z8%%۶+W"t令y~mÆۏv-+N57wrkԨYbȐ54L-[mNYZ`XX7n̙c4ڿ_CX13fL:p@Nx蘂,P cafڛZAf3Sb`f> cdb03𾴷lUˑGSb J*-+;qr?=L2Yyyo3fK>lڴ&M61˟df߻wΥKǍ˺>{רQ͕H {oǎG}6VO;/|֓+&^O-)ٱ%K|}՟/~6n=k`@9'Sz ȑC\ 3y䲞r\9H3ސA͠@S@nhbPӔ s1PvB&{5k~HM53jni$cckzaK5vI޻W}|#fʹ}sTZXx$2"b # ߹{7W\{P޽G;v5 b%kPQepۑL("y[a %qSb C~JjkAEa6X[G 2 %UT;raKgQ_[SUUQYU%S`(SV~eiaeKQH O:"?aKCaqÚ=<&Ny.4ZVV|\%ǐ@YycQ\RNj9UT0'JHx6ơa QUaKS7:t*$-~Zb/<$ LE+W.^lebq-XjG6tST\s,]:bD Wq>WaQlu5Jquӧ_0TQ Po:wu7!g&$?VYYV?sQ!;u׺LVUxuVzμȐCK1_(*Q{W\u:`y>DA2cbΞ)-57oidddݸwOAjc3cKcW榈gw7o/[[_2n߹S]-kiQ(-\? ?";Vd zVd'[D,]>{ܹL}׮裏 2nyy|H&|qY~%Lڍ򴴨Ԛkk;;¢ںM7m\}..AƍS\Ϗjjm8pș3%n:23KJ̼[||=,moyy  ?C|x QR֭MINC&ĠP;Lj ]ꀀoWxd5ϞqQ=9EEee==KKss:h6lne5o^܉+ 15%K}>z:tߍ=}˖nճGL̼ٝ:_SCt^7ӣ%G"b%"M.S-^CU[WO@v]i7 B͟0K[ ݹj7QQsYYq-\A}Zd{lݶ%::bjjffi)aaۯ߸3gp~ظS tfϞ7oʗ^ [|wHԪU D%w{ _E=|x{;z͛yyUUJJlg͚=kjj*1cРŋSRmr%bMn~X<{JrB9\FKX9(|TzDbgOٯZBVScƳ&tQzF~Pmnjb"1*LWW:ڿNjk?͹u+=N23HTjMG&#)ѷȑhz&=$<%%ss/&{wxw~vXk^<4:iqq5ewEBCp77#H]N4bDLxL&ԉnRdn@ݶZriSml_F][Sdv&wtTUk߯8(P1[%o #"X*G f!e5/p*N-&ܽcĉX8*t]paxx ?0i⸱IWqB ڣ!M`6V~פҊ793$$<|kkߔd׍:mnܠR;v0`ƌW6˛A*+R/TZVvk8{85XԲYLKX5cPHML.%^9X>_(TRJK~WlPT|''g.~i33ݻu'M; ~VoȺunj;L]BCx^daiL.ܧusҙ9$t;w޽9e%SZZ:2YqQrŋY_A(,.&:jK**zzvIMMIIQQegi4k {ڵm\Yk>^sH?oCu0?>>&-ʟ>dO>fff66UYYOD\jjrs>),{g++h80dDlڴyO?uҽ{` q_>&3}-~BxeĨHNvHɲPY"qvz[߭sp3i94qP< 4l۶-z[Y׳gAAzǕ>קG@ghG5;006nƏ쳂> hQV䧤9kׁ?++<joh SOSs+ϞMJLqqپ{S [s'r8ofb,}}OPǗ_@˖=OXsj*O[[ /\N{~-xzΙN;k2-єԚڼ~$wBDz+VXS(_~fPlғ~;gek rnff^Z_QUB!6zt`-G$'9vw@>%YVv5=!_6n?HdVeU}C ǐ'&ݣjhM@@P EW#uR߯~Lҙ++b,VSSWrt 1c/O==dں֭^u9t5kLbcǿ>vP8bBKndWU55I$U?#'9:ұVn`;RRw)_k( Cy8B9z>'3#ThjFE}#[T(,6m7[t]-3r)z{^V3O*++-Ʉ¶6ccKOobz s3'W](Bׯmb<r'ϻ"喔h(,-.ru~A(imڼΝ6֖Fx^Bw) K(NyY׮65׳Lq&/ <N'?Ç+(HonIk oo2cG23޾TL|)-3Վcc{HB>ˈDyWnc~FW5꯿Y}~>_zdXa3軽.ⓓʊfmm Htu310><omox3407W/{  rB*,(--)72b  ,6--3fΖ-V^a[Yr=3g~35!?JEY,WX8\A]F$F1Wҳu-Tzq*=[mO՛`ʹ"ooG,,, ``$BIIIOؽ{WYF"Y굊V<- 7k23?~ +˳@݉۝_WUUcH(-~m̘ۻ55<0(ccSmjq*JhPy J%iS۵+F6\[[f59ǎtt;w# ȳ(F;9;WZZYY!/i2SpΝ۞V2HDQ(l~cǾG[[;;.VyX}Hꛓ9E ꚙߺ5l(2I3QYY^3/r֬e2ޓ'&%%zyhi0a $PO+$CPP@4ZaxTK!+,(+J--?d'A>>[[}?Tv7mh8t蜹seykkkaA$65}]llffVfUu` {IRe?w r*)/.:)!H& GIm- DtHU(8lCTEQ^{Gu0c&'&'2ټKr^=J\$@o>rIT[pe_ihhuKy"qǕM]c0D"L hD"IN=@#z 憆$rDO?<+_~^^ͫW}}t@$pN;dh!>;x{wD|h;35e2O$ۻyvR)W47yd/QQ??ڹK?TSq&CC\tmoٲO'0Q;>e }M2/PUV4PW,m&$E^^~~N@$AY}'8B=|X^=g̙&yD] x x<+;;:G^N<4BQ( ҜoeȨgree8vl{\N +/-7;HxRI3t,^b1ȽA72238&X,U|DSS&36vu IDATtu}D*+ .=?52976?||y:d8L}ӧwƜ8) pt55֥7"jDbsl]: ]Z.҆7;hʝӔթ¨8ns^wdc"7, 51NpΝW\hbNnh;@$qrH,'zȃ D"I$JD~> ƫ=Bj;xO%//Sc##@ \]-tFݾ_Yzy01$zkRLǯ]mۖ- 4lبQ: 6U\Ӯ] K7t>#D2045usϿu+;IVUݿ`:ɐL"t@@Q3BB=S,E cm?xD1mGod\8wj[tULKG}>MT/OX}7v1P'%w~_z'xEcP65JSHg̜:Eo]nF̙7﫯dIy[y흜LM511Y97}[oP;^S9ޝ7#DAɓ斦Fcu4ZWމe>x //?Ap74{D9ԎJ# (؛*]I`_cực/\@eIIǎEF[kW_@N#M?>44<<,,4<%ҥ˗6oڹ3&f/-[蛙 4<27wwϿ};'VWwrCBz:z#k"BQ:oiRtS$rrrv˻YTXRrN[..vr9B&R׭[ť׮.ne[~WV0t#S@B%^532BTqέ[L&2|:ѹ&/ƶ6W.d" EmQ8lƍdС& euueU]-2ww(/(B!KLE!GTӳ d,,M)|`afֽ{g`>$r ň!!v eV־ؘ--HTRzоiR'{$cl ׯed;Ș(H@bˢbwut  63U(|-4<ʺQ~uuu'{]Āޫܽ{=U Dqcwsmqɓ7UoHcV'޻:u P_W[󝬗7{ZQQIi=r'Ka,-{_.SIViT:oVJ C9eǎ [_om=noHb\z;#mm>s.J&c0DΟGSR ,Bѥ?izHCFp^<__gg{3x05{x(ӱ֐/% CG}Okm۱coCcT=Ŀs"UqI{SC@F$I%M˳nܨ-,<=Iv7v1w_; >fLPA&=z&o@($uF.lV {71~ݽc0hP8dHhhC6o>p`ho@{t@G'Smckqt= 9}zB={8lvv~!`,,N]|ٳ.^1K(;i90??XE?p`$HO*o{/ZTMM<^Z}}>I֦`w#CBG۷kWѝ-[7n4(0P"`K22rsѨֆdc׋UV=~,wՊJDx^^͛xYZ::kiPHr+&:p jA 61AT\gǎ qwLob4BBth[eHc ҳIUꑂSyՒ"DB$=|8z;>e(d(۷ QCC#ckdkOѺp٣G'O rEgw뫼~#]2 ) C xSԣt[YH::~8bccAE&NԓH-ZXY?`mej*ITѦje9 9Ǐc0TMM[[?PVGIV(5ܾ2wދkNN4+}gğڷ3gD">ѨTO/4I}d "QF W.:uʓ'RJ&ŋ YY;cbcd21fJ{S^B1v`Oښښ={N%%._c2t\];BQ(_~o_^-[NN>ybϩ|>nm6l߿pax3mu l/-qÎ;vL>johhOz;"[[`˓Ϝ8{ȱczzT*WUD=bͲɠ-uJ:Yokk#v;x{Ôc!EB uzn '(ՉŽJMd*P]H2X,)$㉉ <^s!IO 5h`pL1R(J!+3;+=˵43S(4:P3?*ojovk|4DR9kք F!7/4׬Y42bC\2 R*x>f8@m%*)~Nx&)PD@{ojIHc# !RH:K$ Qa@n$X@@ \B*]26B R@0ULuҗq~yHPkf!"hAxT*bRNP9Tf;+U]BT B :G+rWv`bnhZ,bXhZ, uˑ#)X\MMڥ>[tjBn/}G+99EEuuOPY͘db0P[ zl9)BQLE=MǰwgUԑA=:@ @4x{@{hbhbXhbhb-+xÆf:*#UA@@ێbXhbXh!=sꖖ EDv'׭۶͎޶;;&4dܸիw޺u,S^ࡻwrxe[U5>)[_ YA;R6  BmGhZ,bXhZ,bOx)U)) Y.JёQ(*˝1kv_ ls =!WA~Ӑ I(;AY- Vf#G$38of]jθKiFbqq1ʼ~--PWw@6յ;-9)9(?okkn֦PDW7;; EBngGy55Y(KL6r)tZ^^AAkW=V($קF >O_{m츋SSO'44<|hԩcƦ֑]?f(/DCaipvgGDyyZ[k6o*,sM^4x XHc ҳJUꑂS@_rQ[Yead?~'Rt5l\?}%$¢몝Mqɩ_co!C ɰX態׮eظ!&f6@UBP* MbخMmo_1zt@z 6qS#Br9CP̘c/Y"iRut: hB1z y3g˖V/BGLⰭ:UFFQQm-TQcEwsg2MLmlM4]CQQ}W{ry}:60` 0/X8\A]F$F{+*=[B7{ҳeN;tuR"PAl걓4!EJn!Y8cI s.^,PO笶wwB OM$|]10X…QQKDX;}͆I.$%EEzzJ$/OQʊi+ÇXXxy e~O U]G[B"Q4=&WPp؆,CTB=ۮL6?jc_cǫrj999W.$(w@+-^ե ;oA=?CDvHQqx|W H"(H$ gOPf4lի_׋o Aw@Z, -@Z,#r y>eˡP6>ǧӵ(pͺ?–ֶdb,'4]ϢmOHӦZTTZZVzK7z͗˖- ̺޻T*kn۶e B56 6j.Lȭ\Ӯ] K7P흜LM511Y97[oP;^S*wKv3+Vĝ}dl1"$Vs#cJJڷ7T<",TO>qrݺm 숈w~+N2 >M:eʌ_w'O.N1~%U և/_3MMf4Z_?߽ 97hDpSԑ~iރg>LwEG_WUE hqh(՝ZU B!gc'5 z@7gzO#*ٰa~0`@!d2fuFF^BQ__X21|b I}kDĽGoug Bd99o3Hz-S3}&S(РRϞO=7 t,R& :::ILLIkk+X EWTT^" ٻ1tg ԩ˗O8{ŋ"f s}2m?#ǝؽ{ L}I͂TU$gg+>>3gED<8F R9f`JK&=wn:224Fxo^O{ p gB Mf?O{W4i!4?EHA$$۽_o{{4BpG-hZ,X-^Tq1]]kvl߱ak+==j/}=ܰ3YWȈ JHpj#gLVWͷKX&öUJerPCX씔Y۷ڵgϡCH4 rKΛ?(lz- s!8nӊj6oڼi;w2.t42YTTĜ y< N?xSqgΜ<{9s=#7? g2~\wKK:=b…otSi xܛnnc]z:EN 8:Mz𰶎OH8pGޯ$c }IIS#ݟ{LP w͚?b>8q;PSDC߯YgkΝ;iǧ~_h^eRi`䜗qՕ-ɩgN:UYUVVZ* mm,QCCΪ}XPp*nݺW';o\Jffyyڥ ,,CC{$X"A tu&&ՙO%JH$ M"HݹVk\uˑ#))-gά]w^&̲ qYDB&Sjj3 qqj*rPhein?r0M2Sψӽswi3d w s~͜SS$OBbBAYX$JJMM{=zkի]\CBgΜ>IH/x11FMu!?JhU`0F,+?xPWh0UzJo>Ngtga;;д()NEG/*""2ҡ155D,dLEE$REŎ>\͝41YB U\uj/O s}Ǎkm54."q;e7h릜*,vtJ^ae}Ho[~i5yrXXHHTܻ!SB ܱƍʪocxy=Dbsoggoo\SpׄTzUThk.Ź) g=rB;Dža}W*E@(T̬rZ&ij3ws4k΂f75}k\>$݉rivzxޝut:ݽY{,ˑ{eՏo޺ejo/ s&sG?i䤋֮euϗ,!Xt;wwrT(ƌ1b LJ˗u."D"{yq~&"5ٳOKD172o$dؿ}UDF#{=XhbB B -Z,bt{KP61a2؅ .اVܾfC lm==$/2x|ԧ/Y"v_~^^ͫW}}3$B&5yر/W<ɾry@$AQʊi+ÇXXxy ^˲C<ǷS'o(/7}uC_>~SGǎ`|Z5j4@XK \6"Ѐ10ԡmݹ~đÿo_-rpPk\dnfffneg $('#ɉI1:oG$JG:t^ʚa DƆ" АDbdZzْ D"I$JD&yƫ\|_GGS@Ph::YҦjS**Ǐ9aYg^ώV,AYB"ɈIJn\$$WHr≠~%6v(T, q8!3NQq,[Y! ʩ[ryeɸݸ5}Ҥ]gNz,d֭cOS=|ضE MpL9y҂O==1c&O=5bĉkVޱ}{Sn&YpDvE"Ha  HB,*SRbb)YZ65I:#C~d5]:UKtqVXx։rL&`0o.B.]B"ZZt@ 46bXlbESS}" B -@ -Z,XhbXo<,mmLa'JSTӗG{J$HP3]/--ST]EIӍ_5/y>/9E"dBi`аxmhrKsk[k 21B$h%oM*km۲A 5J[GAEgi׮[:kOHӦZTTZZVzK7z͗˖-#JT3BB=S8_WBwr25@delloi[oP;ͧ$B׍Q"12<=ybdrCaH! 㷶tg-!dzXods#_L.7$4*Y&N8bgP?`ՇEw'h J)I=bg9aSORaqh9QoW=q$k~[YNNzL.#tXr y>}7^ZZBX콏Cv?BpGBh@bh&R*6ۘ&)P@g'Ox<@"iv=ed03z;)vUF>h؀C--zlG HJKkh:u P_W[@SYlcc[+sssh]ۚ`YbgPfe틍D%ۛvY*ur hj ό:Y"812p <^*;/P IˑQ-AٔJMVeeF F&{qd͗޷Q_MB"t:ilM .R/o.<{{&DYs EC_jΜa|6cl1].<}k2oDŽu\>z"xUk*\iii{xZ{_qWXu{zr=d\/,,sVAAarkk NUKH}zb{c/%Νɴ@wbJJ,"80y|$tRC;(d۵Ζ-7 (`0dKhTkkC'cg{U(! ݼ#Gb8:zx o|K$_N")'hM{z`h0 pȐSm|> JxnYYi送N&4ZnN 7 ϝ=zt@.W$B|Hlm,9~y~ԒN킂΋P1~2ٝ;'N?v@bAI}VxU+W41C9hmY-i|{um+*+ d,@d,Xim /&sfB&Q?/und>|pM>PZ`˗ïT,2m{E+s{vne/hR8Q&DOAS|7m il8|x'Zj'=XcYcy/s5p~Mƒd,X2d,Kƒ cX;ùh2pi/A]¤A&PڢTP?yg%O7ɵ4wJ6\Fi2:A<eڤСl\\))Ma7IDATy,!%8wgn+ E(0)):[7SMdT{8cƸqCK_l6s W~#Q BCo-Y-+rJBa9O>NFAgIF48WO4=XVlvN7geO|4)hԨIDTY(h2+Y*meNN=zႻ{n9ٳ'O \;!s~~ݶWdAp}MbػNأoylT#LM}~#>۰!=צO+> H1 vgyX:[FLh;!(/^8rhLM}ݚ^蓨;KG=p}}x&NrZz$c_bPp|_{UUFc@t$Çw#9#9{BU)'gKNƊ3gOiU*o^&QWђǎ9fNLv-No_߾}'ĸ)ۑ_}(~l@';~YC?fLuMC(n앗ƫsxy{Hpdd۷u*~j݃wl*sν{iik̛A=z/0/G$$Č=eʤI5fsNN~^NRWC'Ξm+-]TthJJVرÇ"1۶~ok9s}}Ɛ(VM+Vxe7l„rE*I)~Q4UWK#"UU翽`*AA!!AA3!((KHZe9sK㇜ڶa٭ɖqh= ~Z1?o޽UӦ?ŢP(9qqwKx;wl2v?v׎k׀j֬31U*^Yfy;vϜԤTRegO5v#L,*`Q#GQQTvoեNM}Fp7[Dd|yYzTI={ y K6}瞳XmۻYJʼy˖-ZQWl3[Qh~X<<:ww7ln츞w ~Ʀ&ԩ'Z^% I}?ȑ/ʜ0nl6ֶmhBdAp^_vѨTMMSR Z??ﭷjbijhlZ5S'()9r}ۚΉ174yx|wbٳ "gW봂bj2;oXgN<37q-Mvg(\+nZMf~od175ZVp-nٵk2h/(uF٬PHz/`yԩfRl#6xyl6VkUWHm65s ܜ^OW*m6JhqRRBrzbq8VY{kTwR핕WVJnp\|BշVZl4C2OӺ7 A\]sP]5ՙ:uOp[m\zV:k4:QT44y蔔~I#OxcG4JU˗BBn5T(=ݔiiE_4󩨨HV_WJcӓwStа٣XI))).?}K}-ۺΩkhhjo}h:To_BBnfAP\B]~_p{ ++E7*>ח.]acod#o^}u>ŭPFOb*p=Q1rࠤi+KKVMИC{4p~bc:{z~ŅyYknؐ!QQ]35%J۲SXGDDy55L#ûL>gy\##|}y/-ݜQFFffnl2 bcJݮP-qqAZ3/(˕"~}fV;xHʀ$AQ":Ls _fd \knzMNbbŋ{o֬ zjyWIklpr)Wo _lV*ظʓ-ㄬn+2p}SeeFE~Dqƌq 2l&"%2(:OidDǙczi \Q ;JwV%1AȢeW*B;IX4ΗK_aA{qv鎔CALp]`IENDB`gsequencer-3.1.3/docs/images/ags_wave_window_audiorec.png0000644000175000017500000021353513607210263020552 00000000000000PNG  IHDR}E.jczTXtRaw profile type exifxuS[n = !HA!d"ǯИ&VChD)e[2VC˱զASHPrԷ}v.S:KE/naəQZGJv Q J+ip[qYmsHckmrÔѲY1:"H8`M jGYcX-[:Ulգd~L]P`'/H*ʮ8…gU$EZDxbTTm bK,jmPN`7K+@8)&TXۙnW 8#|>c/=ezTXtRaw profile type iptcx=A@'@K\}Ά̓ϲXm:![wӇz/BԵVWN -Mh28M)w TiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ; iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxxTU?Ldf2+4h@ " .bwUuu}W_׺D ;$@He&gzϙk61 |?[=;qBpr1N! :n Aඁ46]4w|Μr#%uyRȑ;ZSRfddDFE4F`P`\L/L3>ګkJKz{4-UM&Sz}cSq.WtvlQܚF~*5i;rH2ԫ5 GP`\VSX:')9sZr QUezņp8}lm]cGOjo3B„Ȉ¸@?xgNF=޾3HDZS?iC̕}hn GX&`4Z,'v;FOh4Opr.izzIۻ4I4۩ih@脩w"U?sy궶Nr~F%'$GG+<^4SU}̉::Z>_*3J*[[\h w_lXLi[~:2u܂㖕o߱r5UV˕}3<)BD2v{w 6[{Hf #gZ8cj?I-c0ܵvu53P&̝7gNL+-ܹ ׭9~ :m5Յ%%-]]Z`"T4jϧHO6n"=ijxˆ/_fkj>~|ڍ?pCçg-Z4-38T*s0Ԩƃ_>{&i*^<tT҆{N9NҨ^Ee: G pGZ;:ؼQUA`2BPryMÇZ {瞱ce2f#km޷Uٙbs̞nU}IQWgr fL&F^|T)6;Xh4.O,Q(%t,>"""}OoT juKd8o66U jXԤRU:ݘ1|>VW[m6/$,**$nk۷ԩ*&&y|i{{ZUilhjhSR>~N45VtjU}}s 鉷 ?j|AX$l[,\`9 ~ⲝ>Ci6nd(mNTx\zu4܁ӧϜ!q[]:6q%KN!"*_n홓-U׌RIT(7o^zz`@`_usž tObv\.pǎЙi,p6j55h}a1Yu5՚^UZeMR*..jZmл0 bnlP6`PnX/M  f0l:}y<<}K$"uɾ #G~ڣG%ꆱc=~lNmue͚κښFwu W*vMstC{IWr>ˉz_,rsud2dʔ NW׷6^F#2"EFq]ήDԙH{FyCidĿ?\[*r HKM!z zҨ% wd4,fn3kkΞٿK3Ǹ6Ѩ7 X. 9dZ nOr C_K_6  cj+[ZTo6U..RiJjhXT|due]cU[B*Fc#¼tReSp⚪uG^g^9:vd-N J I76$fN"%bpcl%z<*57FEۜWǥI&'m8z4qHM !e 5>#\YUThj:*8l&IbW˯?pAnt .p@n@mhm ;a և46]4Pmuwfs IJ4FfdԫH+w2HØFS?inN£B102qOׇ4pS7ב6ӉRt)ljzi0|p~n!MDy12GUEDzd8-^D0N>_A0ܘv' ĵ؜~vh`TnG&3it'䗢ƍb% ?Ҩ*F DEmvU( 4A-KsOoWFˠi,&JL.Dnb/BcSSsCcScsScc\\LLBst-mM-mMWFyT(eRw\p-{9-#s=ٽܡ~߾"F 8a~  $Nl&Vgt0l6 :iMܤ~ttDDlohzzZZm͍M M AF*w Fk6[,&Ϟ#r>f9p8b]rMeRpPkljlR7tvvt$'Oor6jjt{GGg{D"5s/ |Um*uOJIq}~啗_yyr.NL86qeݡ뭿 1hM1n @ FVTzy5446E "7[)Vk>_::,,((2fZmFX,áHcϙSfdaEnBD|MeVmoS}gkA=kVf3JXD&kRwFjy/\s6DJfj4 `,bq1 Z-};tn"[s:.'t ~B fBA7p8ىz8F?M[$9m`_h()m4ޚSYj4aaa_jdL>}Zӵ5&;!:ˡS:6:GaTUn&sh FTYYUUQA5Eg0:9-- EVָq"@]ݭm555%%׳\ǏSЁAAyΝ͝=+9WYjՁ80eS,\SPB"]"EEBCC RWX\L&fW8J+JJ9hGTjMK<9-mvn3Eh5^ #BW2/OO7Is_tuUMuUeVִiӧTogYjFx͎*sZڊzkn/xn̙ap-<ܳ>|I)z۵+En2iHtNyGFFfi|qO۷ر}y?0wu͝`A.+… Jrӟ/_r w_n@9k_I~=h3UU(tszrBH \_$rsH'C/l.VDdDDD+ҜNǥƥM*ۉfT`zd4L?Un&hqʔt*Lş~?mDZ|) i:LH4&|˕}k6p^L6ǧTX~ R53Ar6_`0|g߿tk^^?m<#cNIMJNJ3c-cҒ+ZW?z[U>s- B-yiߴqWK{A*uwTzc CB|7-{y_}U^>f3.]::z8Ki<]PP֛MI͟|O6o>r¦&'00..5uƌ>̒%) /{x~O?({̙?Ȟ u߆5! J1t:QPQ!r*,>3c&S"e2O*%2T L6{577747[˥QZqP=.5(lR1VUK’ZkK'hM"V}{T.?mh[s* |@ଫM".JI']BddDDtcZ~{}~jɌ4kjjkj O7?s%%$fҭq8lv|n[-׎ |r'-\x1UEJ3I]h533##3W\S.9^z?5 7䤤'XG߿yHnqZ+7m|+N|Ɍ5wޫ=$!vjU_ŦMεZ,.."QHe_߃ӧׯ߰^] On7[Z ;t *U{NGd^>>AcRSǏov]UߟP.˚o-o%cnmmh)x=<6oAXt}߽@ޗ.*־ 88QZj''GG+,pͦR᭷>GY^ \xW\d7ojoძr + IDAT @kz:].LMMMPP? ߆542B!F9k>.\.m>^޾~7khr?l %]Q(2Bd)uRҔݫVH'5j#vcRNpN}hg$Mʚ>ZD6dpb~^^ppHhPPL7Ӂ yKgQ:xy_pmqhkJI]>_ pu̘:53c{v펋IHpJŋ:xE_}-.N!kj~ذ}{:v\v [_\s=O?=̩R =6[K#aù6{ɘ~g ǏxukVٽe5)O>9Ǘɼ} 1_yeKbiP1̎P0×Uvm|͖>9m]ȸk׼ǜ9;ʖ/ LHft:a|op > 04nrDH ]]/\xyC;w|nP(%☗WDb.%DbǯijP*2hp<>< ={y շVqG̘>U( %e%Hvnl&U-R,:zԨ؛0sfI*>eF֯pCI42:p3>s|V~ʷX$X,&h{ݷkDLF?a&$Ǐٳyŗ^xq8z~댭|؆vu>HVVhG}j'15,ں]?׿?=`LL|xo{=+꾓/1nݷwSS$‚3**I+vZaN6ƲÇ&<]\}8ZٳwO>%  }N7õ|PIeTkP;:%b] ;痖?*=!aahtln|Ǐ+,lnʞ5vLNBTh =]Z샄9m4MƁ6mLsf:U&.:'__ cǎ;'w5-m䴴Kެcr$>thƌiH&M23gO ߳g}{{;;{Nj/W03;kƴ=ck24+S&/[6y/%sc+W~}==&M5k$>_oP/?ru~Q]݌e˖>2~?_K%==/ٻ;**5uw5q"UZzȾ;w~EG/Mť6{tzWwYٱٳzqyO?Ҥ_4}23&%od϶Z"= ?n[i73_Irٕ $mlҨgBԒ!ܢ\ O/``xyz*֖ܶN5N0~ 'L=;5(;u}{ߟvu-\SwAj&SccEyu0%=1 TWwMٳGk׮q?˧fxyֶӧ׬ۛ==SR&e͘0A,rqnhmmaH&+q;ve->_w2iϙ\ĝwug I;4,4?mk4%%յ Fx(fmk8 ^gbe0|Ob477h4634t欧~ŬJXBtEEGlar{g_z͚~}_Å92QԪcBCZ[׬]QQ11|'VjrrϜ^JBYZZVVRo?icƌ32=2yә^wѾ]{,trFE]tתL&c_XV0$$rfeI)IɣGGb4M;Iqo[wضWhVknseeeeX,K2Y 95sA=BS-5}1uQ?TJsn^޹̃ OJGDFd߮ࡃ cΏrͺ==<ƍ;wL/Ρa>>..--ᄏc2~\4a{Zwo;+1qE2wjGκuǏxӦ4rN0)xts> zTg0׏^F##s!.#K׿Ȉo6?Ç奥S-.{>"$bw׬p…)\ ݮݳgwUDS-Fu0BTPJdN;'fB%C_1Rɓy55Y"ФsYiaAu 5jPil~؎4`~UGr6g; <`ϓD`SO&%]iܳ`]sb}lܿO>ٽgу~8{H4}<}XV'PR9"",,26w,yG>l~JKJJK/_'NUUnnu$H=ztt1k̼ <( =_k/}Dn"x~`}>Y{xJJp<./3g[$gdS̎6m6CϾX8Jhv@wپ#gT^˞]{lEbtNM*|Ǘn#u$}iث)5`}ݿ{T+޼35qif')餍 ƃx8(gʞ3baƲO3ĚiҲҲࠐƦƘ1cFGZ~ݺU0թյurT*֩*uSSKsK 1$YVcӦSY?"_BTS]VZ]cgϊ#q˗F).)*llX"#_yۮvC(pq z70VLP(ZNK|+?b6ܱn燅lM~ގNqvU&1lM!wuejٳHZA=3W{Y,6ŢѬA3ȸaH|.pnc~NG'{{9oomm}ɔ:N,z8%Px腅^o9ZMIqE9-6N*0p^mɥ3ʙG)=8nL N^6BBBBY,Rbu  Kjl2S.g2ֆrvCC lMM͍fcaH z2_?u:/be:{V|kf죻Ӡ4  @y<@@jEŤneeuuyyPP@@Ho~#˖{>3-}.+(.&SHP(GڋJl1/hdxʢe(>>6vؾtCڷwYE@w"\.q ޾>"X,Em/GjTjmokooo{7=:u :-(:[Tܠo_zI"~y8~аsGEΚEjZm suM}ebѢE ?c&q>~,mp*VgHq?kK3Es} sy撔]sV^fժ'ˤ:?HXN鉥K?p?$JYT}ۖ-ΙLw} W %\Gh5 }JTASgvi47Cf\jjkTK\\pǸ֦Ɔ R(WV.sP h6 Rk&1ҳgss .VWTKYja2Ţl:]wOwB <.gWL>ztLCǎtpHpXZZ_S'EG/LUV? G3& >u6塡+fV{!?li=$7ˢG C7 f2iv&x޷~}n Í92زe-[NM2uRYVV^^Z?_J갚ť$*MB];wڽkJ7wȮ 1?WPI V'8T 2ف$&J$Hg44R@#g|hZfVvL$Vk3:t?3 C<)95k֬5Fq̎^Ϛ={9 =q^,*7n޲9>O>{ut 充 5*8$,(,*|g_K:s?Ue0ȹpu"TV9S7)Ҧ};vl~s{[n8oܹ ڵ̝w<1 2*22"<\*^]SU]]ګ{c{^wD,S_pu#;'?,(G~sbbI9lJ\,.._nuZ.$kQ|Հ|9\%uf2bb.}ݏ>Zgȑ?xխ[Œe|sQq Rr_,xD`]PP\w$C<*Ͽތ3Ν+(B##|~ik]۫ո2PY GW_;NedN";.rj?fɏUL&ñͦj5{]"޷ྡྷ:LgWWźzhtLF`+3!YYQ|_}<5#ƥ}G`0Yʃ1c{.kz@۷Z{{V[,x6+W^l9|K"411)4oۿoCstp Фr0;&fԨظ];wN͘$q|}kjHh~ۏ۷uRڄSHW4Vjl6[5b1˭S'LgYN3HX*Ms'6T]a!gGNg`P`8He+>_ؐ1-#h4 ^^iLfUsEuE#M49e-yhѸi&T޳{Pd钇XH%g+c{ϑs_hd9gf9xǍOIMIe:egϜ{޽;wR-[䡇>/V\hXm@ zfIU҅/FK^rNVwlm-wl/)ecc<8sFd:cb}|<\\=sIU}\|F/9&PPUͺWrs׿_ϟGRb]fbnPWTV1 x?"bıryʣvظ["dO/*|;V[ۅ [yo C˫>SYiqjm6Pؿ-baaSC[-eUj-qOS_X(ww=:+̹`0-zڶGV~3.lS||t7b_>o̿4 8+Ӧ-_i89v{i4[?ߙ33%%GF(\^?w.'gժ5tO?رށ˜=ۄ O? DDBC"LfB$b2IEZ_q{1oo۱/?2!a̘p_?o2Ueg\ǎ}`%%KekEE[r--IɣKKCC^xyMN4*J pynrL{n$qhGE{{yFSssiGדQ{ӕ &ݼknHNHή5>5>QwC.Wze4Cyg.,ML$.J\*"燇ƅq:tbV(&N̞%4P˕J|bǎ ?{xx||^맟7/&f`@C%S* R( 'ۿe/Y˟Xs996|߫՝vX{{3Z"64[[sR✘069e۷M9mzV`@`@P`EeeUE%)ҦLuups~Eh"WWd4MF1iӦO$ANR!0TWHx3a --/v/{.O,Gomlbgfgۜi2k;rlQee|7]mmmcb"[;j':s44Tz*#VxFOکÉ:򳹹ygs R46!!~l 5z/yj!dq"#p; 3{3qyQ_uJߎck46VUu`ڵ?vM͕В߾8kvP23G~X&߳gܣGl3wwOe`ĉK̝ye_+e`mޫ݃U#z`m\2 ,X0k73̌k\?{ֻ\kC1v˟P*Ο?qْss;: zC(JC'L\`pw) _cFf4=u ɤ>>sf?X11r4d-.7"rƌy22i;w>sm?\2mZb^]:Gbbc\Cw>|܎5k4L@" NL 3ź}[wߓCqʋ9lGR=.Y>?冄ĄiE>>FE%7:' ,q% scF?>nnS.ӟȟ7:_noC`h݄p%4:/(xƭ[l3f̘syyyQёF Fh:4 U޽2uMV(r/Kj5ktj#s\t䔊7nL3&&fiif^׫Z-UՍUҘKݥWk !@{ʐ=QQP[[ϺVmVuԮ_[[UQDq޲7{_8 y_r<ܓK.,OV"bhQ:R=qnjfڵW{!64Ԅ~ywtΝ!}Zf+s?wľ%CXgPuϰI K>%6#dSU?^2T--]451n=^˦Vd2rVUH EE޹e`o 2\N%,$gt~<3 /]h|%9WO_@5)Es˜sܸk? Vbk4ԛp|PSCSCfs36mڜq9^\B\RY[W[#i3Fkh[[\j=}T jiOUcCAaNN:RJgb2daêɪ%0Zں:d oEoE oL66޽'YZ 뢡stf Z>EB^! <}﷩و'N>k1`@?AOjyccCCs3緟8 mk}tl 62߯G=R*e*zن:Yx|Dښؘ,jH-_!̏k%Mcr^y|#G3vh/c^T#O?of/?zg @+ qLUp.F)< ]$t-Zxs בX恃[!);eʒ|qMF -X,ŔP(C!E^|) \袿kxX(jh$KBϴ] §g^5R2_.!lC5%b(&~tcTC:M:9MJɪ!KAAϴ"&,TGɧՒ>G/nAѦOU#N" ][IAG@4tHt 7ݣ~s8@F@2B'K&% =mS'Ѐ,'  C:4JU5Y.=mBɦ#^q! oWVRT |S'OUIK#(}駟x ɲ)=mF$S+6YfU>ϖ,Q1Qlbzw1cڴ+T*+WU/^hDހA,i!^q!&BX}nߎRP)zz"ǏQɭ0FFb5׬;9uޔNO/O:M/)13 x@Mʿߔ|߯>)jkbcݿ iK`A2ٵkddqQtح^:88:ZYij{;w"ssYZX8AM/^hɒ5k֮]C۩ۛXXlܴuoƍ۶}vڱCJ9v,<<,,}}=}2<奩y/=#^zJ~9 yzy*>U6:HĠ+28h]!W\txEhiMtU+KT_W_W'Y97t}/'NrqDgժ;cc}fY08܌ɼQp-_8t6nswW* bb\|򚚖6[[`hhc5hP"!`H$)i{jƔTW,[6j-yJe]͛7}Ց#\q_,w:AHd%'|9!!+#= `AAzo}٧~y%dyӦkWk@N}}s"N!҂bY蘘(//OOooD*ɢcU/-{\YaGjZiK%oŠ鏣y)wJO??o/MԪQ$##))=!`Oǟ BmY'L2oo?u(o/uȨȼ|ɖtp&%geZyb3x<7oo{{.:&䉳g --L1jT_WW;.]z6l!WFǜ=sfyųNjoW^fU<|ƦF:,bkVO6{yAKD"6uС~kwܽ{^# 1KJ%BYÇ=vĠ}x=:G+|nz㮥2Yzz^^C խOa!8BQ_|ee}ekknnffmڧorEJqUϲ'Ox~ĸ;B, Ɔأ A`,=YkRS 蘰BQRbgޯW׮IiiutD*NN{W.s$C;d(F&zBY_SWp?bzxy%&gޏ@+Iqq>j!ff$KFb;{kkuT*iE*eL,-bYr/tyE>yy{yYlI_ ;lY[(Y\.WMMYӧ?O-Zx~0d mrhdygl? ?*bЈ>NaG֞>zAa3kJ0++@&3771 O&cF&z"QUUQ^U1iJ!JH8{ ?o/} psѹ~#%%%l`SS'-55߶ZtpP+9nZSsEIiI꼇;IiYR7GG&'ݻ_VVSH"9GC͍fדc Eڵs99ݻۧzcn::W&'TVuUKM)+bU#.K{{s{M͆y6?֭_<0BP+hQQ[7Ys" bz^,Nt!..7oXAiIlLfaf,*U0 tP, 4 mTlmcc" kyŋ.?nĉ۷L&jIuUuUeӆiccmbLVIiiiqI꟢buW DTqgK|f2Y,:>{֌Ӧ3eĻdUB:I}y`Yknݾ[uܽrʣ3C B*dI{kw%+JNN>uر۷ӣF@{aaUW09)&:**9)ޞϧB5J.NxV\LJJMBI$]ٳkW[ssPWKc$qwƪ!11.6%%1!.6+K_˻UYYt37e"#oiiyy]38xPP}rg%<ĉ >b$}^~/;jꔫkgfdTKKSSK++;3++{32D=|v+ٱcW MJ[eH:},Ye};,r^hW2RN?nv1k IDATʔfKt^ xtF7u\)u-Gkz~g1$o۷6n<򠠀n6z\LV]UXQQӭg.]44:CS'ÏtݍM <88G/˧OI6lO=f!EEMaO3vȺ:^UUTWP04:1_! u ^=oEAJFMf~~fVauH$_ t\{LJ9x 22rypjj#PS j55vuq53S?yJli*)hh+Zօ‚[UL Hh(04U[UsS^ˇ?hlأ[$<4q1Wfκ#_䫓s6ryBBz#o+Wws1rʔa!+Gd VVnn}Btp_cE045tz`f u!z/\hfzdK^#G uuc77)*3g35)&?qѣFᐁf2(޵o={vnaijfjLٷG JK*++*[$TJ 5RX M7AǍAJovqɉ8w!_ߑ#C>"=).O[%ă[ᘘ3fC׮EGF;ryLڒ7zb`V)ݾjA2Ο۷=r54\]G6-`G?;wRso;ƍ@k)MLZ( u")9׮5k>ϖ,QQёQbȨ۫BroYjΘI%u[lZR]mcceeaħh5YA7)C(budA~,dOFiD@_vq% #^\B<3`\t|@?Dg]0qIUEJldLX鑥Cp8l'E :# cлwuҝZGɧPf!uFMcAd5YtYL¢(| WGgqFJ3 Ǡ#˜V45B(04tHJ 04: f+7fFKLJz^=<0: {\W5Yhhw.:*+KSHEM8>>>AXmV<\.)ă&2PfϞ9FҒ++}֭߮}⪪_ޑV2Sںed =FL9ZG EiYbK/Iz{4 gϭ[UUzz^Cz7$G#أG6o^ȑw0b;c2mO?o|ZjjddeeAS/=oaVVjj%Nw'nnGo#>>Fe >ЉX޽'Mڰ!؁IuuWD #O 6<:[__[{ν{7on@_BG0pʕITԶmq8D;fM\ʣ?33+*_ ?wt5jG8vԢ˗c/[6fR@,"hnnnin.+%YuEtWO*jl"YTVUGGf =< ttrk˵29s@IM͛{vuZY9 E^nB|RRMa<<윜<}*/_(o괙5gc̜9}?}ҲW|~^ݥ˼OYl'h)ޞ=͛nWX1z&4sfX#Fkܼwgƍ}45_mc3lĉnM#vXp„ȐK]`j2g?!CtkN.kuFf!A44=#G:9O~?,- йݻ/]7vxm06-5j„&f4&SKŒ[v']QZVZZZHiбfZzuY~dABߊނ=,:YmiQ^/vv yK ;;5%ė `$2ьpX,C2֬>||Kzak~_Ԑ3sdls_,/Tٍݯz B]Ʀ??{W틉), 06253 ùKx{~ׂO~=nŶűq+VX>u#~mVaxzig?jOe06o6l /l䤝;9;oTQQYѷn<.^9bd_o|IIѫWknߺz%5U|'vOjjFt>CS^b֨O60@t=USST@aOifO{gĘQ*ȗs@l쵫gN@_zb, Y\έχzdїG"LǠ((&dsҸ|Xzz..6l= e |l߹~]-Wǟ9s,…jB[[l`ehH`~)̬CWܼv谏zz;vLTdzFiR6agǎqqq﷼42uKJ\==kkoˮꚔsŽ;_P^a9,dXk+5N~AMOg:Ύ})&S(ޣKcBCMK+.V(lmuOc׬dzgJJG#_5oޑ#en_͞YWsK7oedԴCCkoABpv oOKk?GY ]y'4IL}H$yY ѠAV| ƶKc#q"<77?Q45r/X~+o ۲%<|ѢC]VVNBmx29Atj%o%>?fI||b|R\>i͡9:fJ:)->}?_ILZi>!!|B]SCLh466576*1)#Gtuڿ}/hzfzGЗ.sB;3IJi[ҘB;#MH.|tptqf퍋+? @h47u:kkG ji).IIv=#YMMbﷴ?~߼رz~HM D"-GC/!9^NXY=g\QWTmf~ zDu/F hlɍ8qn?|5\TdjڧO@*UyyE\\[&.*,( *+%T}YW76114~YȨoi?YvtC˻w }|t ڮ4M%Bin޽G``^B]c32n8wF? 3S6UTL=='gGLП?. ?kֻLPWG}MmeeU\d B#L@$ eYYuU]=y<4OO, 7Ogg/+ښߚ"#3ȹsr$s@FFSPa1LLsg3[0'@g>3y_v׮/]:sFd$3YzA -.!3_CC#I2%7441a(JXLsze`PUs[ 2*9J0\]]]W[^Ѐgx>lSZ/'(O-=[{4N$ eQqllLlq@:r`-Ahj8:ZY2YqZljں# ^ ѵX,W\uKvv3332R[1cF`Z;]_M_RYWsDĹx ۺO&هΞ522tަۿYs癓g$%1iKB0lC?!Xo3^Q={5_[zՎgܼ90c~z"QPЂ3f_)yܸ˾X>(H.h뉴^YT x=376ihQTW'6=zncΚm!P믷m8ʒ"ElPA)ZZtuFdIKDP25i&SFh,D FeUYiu7KJ**Jmmß: >OٳGrtۻo(|-*@gb:9͙s'*&O<)١{bپ}_zԴJ9Iw:#54չW,{dr:[$deEDlO |H΀62075!‚'bU3fag'ͅwl8wޢE:ӂ6{bK(ۇ'ݖ[[MS( cbbKJ $+;=~ed uʇqT)v޽#AJ%láL(i?|ʪz6+ErSS22d2kg'oS"HIȔlwMOm -M7~݄fiff*Zc#.쭭yR25ҲR! ďĴ4ʧO<.W72EP44TS f}M]]CC{fsE"yڟ6 T&#RM"d>E~io:Y5=g߾ݓ@$Wܻ{;o{z:}o_m8pݺii: ^>~1y˖}4?,PtqtK$;:蘙 44xҘXә3~X?Ax|:v+f~ 0ý[7ر ?~],=g~;  π䷝dWOaRkEͮ^!^NGCzgreYO^~tdlli\P\|Ȇ IIOzXt?z^\^&c255՟e_,h M ] ?.>} 80O.]{E"Jgͦfr2+M&SWW$!Ɔg *M*Lu 9^䭪U$PߗA46؄!ϷrIiYR7GG&'ݻ_VVSHjjln8L~{#V=*yQ dpؚ\. LP$ [jkjHL{7>ƂwϜ[~ѧ!5s+'7lؒ%/m^Vtc#T(Ϟ]rܸ/WP[{۷7>}͚=~u{cF/HN!m%',]YtCxA=nJIIIb,zz䊜訸r_?--M+U՗/MLU#?;ddUUյ"nc,Pޯȑϐں{܊8yhr/6d2_P>3Px\UسTZUYUMT* MM K-g ޿&b tт>t*Dl@ߏA3GGݾN!!]4תӶ "oX~Opp@ EB! ˣn^DؓlU"A=^W?pK47ggef3bffmY:<''1!5U*;IG0KJ~˂K IDAT8ussV(SOIJsjڌۿ~w55[ 賫ת.7OssB;݉\߷# БHg仳̝*jh|׭)UUܽԩN\wNBBq1驧Cf)0@&feg(xdښؘL_$/Mgh'F/i5*=o](,_6o@&YO踸*]]ggWw3'MlN::]LD^^\lBBeZTS53as_r9'7JL&+1G[Ԥk׷z g~䊂ܼ"⥵1| [./--/.mc7r55&/cyd=LKϞ{{J ^x!9E.r0ϝMmĩ[e}F2UM1߯иqKJXLw6ntxiw۷7o*.܌()+,DS*+w&ieE%?ySUUUYoAAvvzz" Xݻed# (OOL">#GNJB+7@=qh6__ J$)bq8L$)RSKV&IQ55:wwWW M0D®NN];u*>+P[ݯ\޲…-֯JdbUW߸~JAJ$w:gOtRi@GǓ*33ܹ}˵̜"|i3ݥntk{wj u35ar/_>-1⇶Jݻ{֭϶Ol)'"ٳǵ[;eӆ ɠA}::DEeJŋ'O\)0Xh;H1$o۷6n<򠠀n6z\LV]UXQQӭg.]44L㞽svvcϞ'nc1th"=,;;=#/rq D&KL ]r۷e2',6G[Fd5ՅElP*RI}}yEQqAAVfB[wrٞcΘ5xϳ: y 11ǎDfEEIIWFDdF Cyy|-TV$fd$%fgwubB]:(ؐ`>u1Vo'?Ngf{Ҿ1 CÇq۷oR|v*Hrrn݌x `·osT ~=;4tC\h/]63}w/. VZs;v+P` jj[Je yy/smvxƍ߶5!Agffccc]B:?/?F@bOv}=z~ܹ 0wqpފcǰM8}ku/>y>"66'EK޾qXV./X M3A.uouҤ-[P*/޽ʕ2w޼%KƎijwl/,DڎdQj)Yd EdSU3,]!YZ >YOG4==:*>N pwsu|Zdwurr608qٸ؄}Wwp9rG<~ͳgCCoRȵML||ztu-(<}ASy<@G+zBSӮ] 6uз"CiJk:1$dG3GDD۽;>6Cylq::;kC'T{f۷Jm-cc{=Gxgoߵm 5?~zD޽7n47S.]̞=}4%6ÆxB3'Ï]t_EF9R_` o{=w3o8eS--ѱwo''=60 -CJEccbґ%&X<ߔ)cǽ>x=S=RF2eXq0,1[_{75p{1foܳ{Zځ'Nn޼yӽ|8uJo*l$;~#J;}z_|}'L3'8iqyC̞.Dߺyh\\s눑|AsLZ6tiu5+WΘ9v܏?nٲh󛷄 _dk[݉vmaCyWؙ9RаwY"ѧNHeim3rUs?tr$-Xؙ3 ?Ril?zzz{kb"BpB^\|_xԑ#g ML |rZ֯>97\?~tln]XR2q4v̗_JeeeVVrJd='ɑ> ڵO~~W}AG`??G`7} Jp‚WqN757kĉ}|5513wARǧf$hu6Hج%@![ryl94MЬ7q!AFRde9TC`gjRbP/z=UTtLJN:o׶wɰao]7 4 4Xy7?rUp|m"Hh$ˠK.bɟC܈@(@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0&ȜA~ԖO=A _1^9˝Ǐ#Ipj@dR,/iN[zvEG5.8??'f\NEh KTV t/S~~.鋋 J A'XUS_|Qºrs'M9__>,!?d=,p9s-1;-&Ȝŗw{o,?ڡA2ϥjݱcݺ׭[T:zz격SǎAyy2iQNu p6/YdǦϟ.իmkٲC,!ȠuVox#F[\rstNJ0i=n]5 ;$L95'=o.Xk^:oެY?ee[+~>L5j⬳ڴ>⒁W]wݷF v~Al,!ȰWYs_v }4o֬Y<;-jlgٴɟ]=(?d 2Fٸq,~1֤IaFo@WV+/*sx’d 4@~u/xxĉ_~ŋ++x&Cx@@dTM3[& |wx㗿< KVU7pȑ "ȸϹ+ܼ;v|\y~P弹Fu꫿Hq[>ӾԹA9Cv :98o>b? D.Cavh`U()8iI{?'֭/iҤ}s^SEGgF|+- N A9m.Aڿ9sʏ~J}N~.?qEEyyu$7H&n&eK kz貯uzńcOw_{oäN_mvH'[iwܹG|3Y(nLK˖O6lHI3-ZǏճyAy:Lλqo %LPs//G.)-}vou}{2eoBuu~M [4jOWbh $] z]۵k=VG r%%'M1iryd<޺u%Moױ/}~ukqY഑#zhjp@dP:}pNuK|cE?g\ߥR8߹Oo\QQ^^z;d ɭ[I Ƞdjڇkݺ^1aؓ0iS~W۶>Ru/r7w @ R5Ӧ RR2xgEx{l^tΡC6̚uM}[+*+Ww C<;Nz׋Ka^Ski8۠j _˟|QKJK=[]nߞLYl+G**V2eݻ-rbtت+*5s&'ӾH낈MoN-Ͽmb?c?c?c?c??uO½X$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5@2dg7<ĥ8⎉g!m?jkl H y[+&M:/)_ܫO?초q8| &V__S򊿨ݡCͧYV&HX]Yckxú4\&Hx}eeq%ś6wDv&yyGqut]4o{wÑξG͛*}Q~Ӽy23 Ǝ1?[L'R J,}{v?~U ?y:*bH@4(y~pM?8w{w}y΄^e%RԼiW_?^~g{xw]Q:WڵY^FH=h-߾}ɒ t]/_ݳgƑ}H5Q4 wޙ6u{׮ſ}sLEfݻ6m**J8| xuħ^Ozǎի7mIHGjko0I4D 늋oKc}ns_i κٵu6t@@@ 2ݻ|KLsdfh޹ ''/Mޘ_\1%m4@yʕN+)g6b[nDOWxk[0%)E uu+*;AG{l<#͚ma8cÆի_%$jdOlǍ>?}7(+;/*zyJK7T~'5mzZ|rAa bPKN9e۶׭ H)hޕ+キVRҧW_3lİ2xp۶Z5oۨQ<^SS]ukUպ+ gIDAT:q…^ŋ7o| H5h$UW\9빻6}?r8J7@HӬ1dg "Ncɵk{ٙ DMG6k۶q99ȷ`q㼦}OaA Yx=:lhfy=7G- @j@$yo~ϙn۳g̘=`AMM">޸q~ӧ\;jIRؼeƓW]y=.喫w=zѢ{﫩4ITضY\sE69v˖~Oy~!;ڟ?"$ɕHo]ϾPSNiױcƁv"};wn۶sZZ \4ڡC~7 EM 1cM;k׬쯻2=e˂7n~qPtbퟖ?y)S-(A ľ}ivikܹ?2c|򠎞zj={SYYVV|U, b vT"HXwL9NV,=?<ȑ?:oMq#GLc+7=xevV>:_w]/8{=yt$O,<>}O;%%KM:jԙg4MHSQQTtݻu~~ze~ۭ.oe#A_WU5xҤK~RP8p Ϸɟ8[/,''4hH!JUVcCt-,.~f+:vܴ) \]]vQ6jVHyh.С_nyǎ {ڜ& 1cM;k׬쯻2=e˂7n~'vbퟖ?y)S-(A ľ}ivikܹ?2c|򠎞zj={SYYVV|U, b vT"HXwL9NV,=?<ȑ?:oMq#GLc+7=xevV>:_w]/8{=yt$O,<>}O;%%KM:jԙg4MHSQQTtݻu~~ze~ۭ.oe#A_WU5xҤK~RP8p Ϸɟ8[/,''4hH!JUVcCt-,.~f+:vܴ) -Rv!*+zkMmNh/8E526wysϿoc|=?п w9 o7 ¯}$O P``````````````````````````````````````````````````````````````````{8NӤIu ZuRPB J/f޹No[Ii+^85YN.?zq %2NCU!bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh !bh ZP6/h`GŚ xTAwؕgjm پΟ 54pg]Y[}=rޖG54pvڐASAG fmml{bv2%`@S^{@ 4k!}߯}R 8(h`V{c>jS&سG wk2h`?&W[=ЛWL/>]{rmxm9I`=ԾO}>dr?Pg F vksmǛw?18~~smԞI푶fgj[yNRu{f=fZϝo7kk54?lߴQmx}vJmn[I'v4rm]hnUN /Gk;91UuFߙ".=T;9[;֜'h`GC84>َ~B/@`eT;ՎnSs܎v2{ F; {Zmxj0N @G?Sj/ -醧F+|[[_}q+WkO7N[;>n`C< zX_~Ap@ 4tHJݑ IENDB`gsequencer-3.1.3/docs/images/ags_crop_notes_dialog.png0000644000175000017500000012212213607210263020027 00000000000000PNG  IHDRFhczTXtRaw profile type exifxuS[ w]1`?m4s\a_ciAg+fE WLs5I-+P؞jSrCSH?PrԷ˾M;HM- ",9 JhSZNz#JuA)i-n+.ԢmilLb2J+v)>6d-fxH/ńLg;/#g£5aߦoF F8ϟ|ykezTXtRaw profile type iptcx=JA0 (8}f-i MjݫM/` CEyYniQiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later S iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx \g8L$@ p_" !ZZkmmvݷnm[^PkPKnQ!79H2Ig(x~,d'33:>ފ{앗Q96 IARu %/*IkY(x$h8d$gR5 3{zIOԹ (s}(5%sI P7?ZIC @-n*iAlmxU7mn6t*ilVkJtw^>87Wk ZHA`Y{xt ]ݗ* .V(:;t[HS#O0Ϟ۷s:]cV>>y^W\\_Qm0c,^է7tvUTXf\tRScgGOJe2q66vvN>!S':ʭ: /CaMZ=ZTS[|C]gZM RXi\.]/Uͭ _;kWwIښ֖AC(ɽΜnm`\= rRΝ&P]]UJΰw _r)S57ƦgKԴ6wu ,N:~́h믫?{٪fe&#bV&>z-Tܷ՞ZS]q˗M&S:p ܠlkEiF *ͭ-ynjPbGg"!a6ԗМOX,64:;ʦfedԒDB C(I,lm?Wz}f cs }wbEvKNH\8<\.VSy1-.U6F>34j&e=bgOUngŷ]]jшa\A&x چ1zzʒQ6, V;A*+.deY-Yxqp7de>t,bjlf0:Oi՗ժ’&Ok/ Zt9>66RUUݻ3%⪚y| l'oxk0,9chlbhΖpllf[G e8n2TPYSusdDӢH^4rn&ZɄ' 8,M3֭Gn4Sy\7P_\t"~ 'ʏ?or&8?.ecU%wٹ"wDT>^"!\ Ia066uhSDzhNB}~^[KG[G{a?P]-Ν2E`8Ox<.`k'uuซU\]TK2-ոP$YY1:%cU-tw8lh;!JF# 2HetaZ6@ec#XY|qE㜯7 Ϸlj(Q&JhZ4XJ !Uyő?B{O-Z4>@(dP2~Gb0|tghb  `˖N|?jY`@G tW.t>A.B@sEFEWTlPIG ?#/nZS9(tM貧*[/@W{hMno5ZߏYN7|FvAH 6!Oyty9b$ig. I4IH$ H$i@fq[PlFi&ق$k F=![ZQPg'قHQPsvrDo pIE@ґltRI(@qT[-l\_7ODM{~j{Kk7ڸqvԎ"wJTrKG7Poƽ`6wt^p*Tٳ-8-eP}.~Aof4) 9|(/^O)9I_/^ RQ1ow*Ͽ 9<^t4| (nLRYZ_v_g2ESM\;~1=Moo+-=xpܹndzϘpABX‰> Ԛ)Srs˛]]*^`b\7w˗Or7vu9|dٹ>Y$ٻM5;!1.nD{)}l'&s[=uj[Ou=~˖U+0Z[[jG}#MM&z=/CX֬ygs~]8YYշkǤIO(ٺ$=ltTz~rD{=OFՏ-5Uf%4,.n43{jjwk {eM UE{z.=={v%KfsNLKǏYW‹l\ݍ͢fڱ#GTqs-sweήֶv  geszg~-%2MҥVV>nQ+_x!*J.c0Y .<|ӯlٺ5(naòAVt:'Ys˚gI%&]֮ɤݻ?٪R1Yo|TJzb z_"!*#`hjȪU^r'H;|uqqIqrgaRiDĚ5O7e7'(, m"Ա0hPW[SQ^[^^+W._97nT>o(5_*3g65 xQWFhtߵoޝZ^f̈́@L@j'K|+t^/hPp%J]Zho-_fc= //w>`wݝ?'/ƞobL礩ۏPs i+G(ji 6ےzvW40qmx\_pho؄Fc4.I('KII;w8]VVӫmf0\5|BCCBw-K( HtxmmuUK pyu5e><.qC&шֶym%}֐AӤ;MCGgy鼼g+ʫ-2LFVz)NKl% ܈8/@g'2NI:cG}X>>SΚ5gΜYE}P0LD rG,Kl+`N #~tSn4<͛^H4m4ܯIɕJԿT=D[hL&esƉ>ӓ'0F@(]kTRO>|'iJh5j;DlPe%b_ȈK߉*esUE)ɇo߮TLm~1".fS]2,ڲ4M pu~>^>2rh阥^V̝'Ag6uk =K31~KnP}AI%${y$bne2ѼoɻGv/L-Ml8?W bDBiz<:dnnnljk5iDjkssr#ob0~~R!azK0V,Ѭlyۗm 1e=<}\tFkkqq~^]^ ?0ƣp%$.E@ۍD{kd֎$#g :tQ==(e鸡SNOPc2哧̎ rG z.^*ȿxVeOUչ1D[O1W'K6Yfΰϯhk5&O^u+W9]*o\IIAA~A>;}\mmOrŲ3g:9q8(ea%O vWW;WT|tnnIIMMO7pD++6F+-C{ww30י3ϔ;WW4?P.^wDFFn2eckaРz]c%%yyNed:Y_Vll\]y |)D=HXVbkk+r ܳ$N=|)($#IEj"ՒmPP\vw֡ 4>D=)KK~2Dŭ.`:r˖--*3?&=?oG': Iߴz"QaPUf@A%V7_eFDg4ROF$=wvʦ*cPp]((nl{Q坷~zԩ1<6I[rsGGF^T/(2QP?D1 2j*j.| xKNҪ(F>IJPP^o*UۑHN(F_֖G{v6/˗x1&Smᄏ{Ǡ6&vrY]m橢˗ʞǷ2o$bNjhY_¹&=tnEEcSO 2WHyK[ RYZ_v_g2ESM\;~^JO/=SSlXL\9-|aUQQ<.`0w'=|0+vñ4)6vv#vTKU2O޴Tm=r* 'FDÇkEIVXv͚ɓƴ;v|b2_l)?{ҥO>rx?_&&9/>O?UTho9VVT а8|UOoNOoRWΜӹˌyW>z}Qݟl Z-Pgy?H7Kp6.c LvgW8]`yzq==u3%-11N.1änؐr2 tue>8y*-0v_da֢!Vmxajȵ wI9gݍ \Ѥj[6?|LʖL Dǻq^]7^w[6o>xz Mnb$iyzbrTbcKh:;,Ȼ; ٳokMU,PxݽRÑJE6/3'>OOSG÷s& IDAT"$Xb-2JJɇ>@gjJMC]oias-蘥^V̝'Ag6nK,w(ZHmK@cP70eR{Bz1ͶԸQn/ Gl&,un6wt-={FfzzwufrDOg&P}AI%${y$be21l!S8(QW[TXTqó㢠3Z[zࡩqT=FR6+f:SB٦FnkH(:Iësi3B>WOmS<=$bIYPpXgE|A|5Ojj/0'rXlm`ooj4Gck;00qJkm-/Ȩo4i4~'Ǐᇔܵ%$̊7֎ :kNqX؂Ĉ‚???7ccC<<\S#M [)-G뛩{tס@؎MёzQPO(&Rz}ٹ{ >-0pժ9 tdZY/)۷o&a/_7czPcK׭[;|8;DO?;G[{PPDd3j LS6i/Y,V1# 7Jr<=&ifg#99?\\|ZMx662Z:&&(- > f}$IEAje u1sa/= 4dʐMy> uY(QT2/JTQԀ2q+ 0> 2A*Z᭤ o@[J$ H$ @$iQq.tzDYz,un[r\hz&2gB{z4uoTKA!s@op=w][z=cQޠ~2Dٻﯛ6~ROW~ UUG~ٲeEE}>#za [5i TniEoXYrb4HݡMJԹSQP]TeLTž vw^?my^7uDa*%iKn#QCÈ;Bjj^p1pL56'F*aۑHN(n<^\t jC"qs0ˋwƮ#O,;WWg6D2{w f'$Mh/eo [lT5pɓ[ZIM-) 'ӛVr9CkQ\|۵ZcҤE'NڱXWG=|<%7IեR /eqsW?|y;[:lnkKM裿=;=ϟߵOoya|~hϿ;[[sj_꒪'i nJؤLMt'ێGE͙bE|P׷_,=RL6rZeszg~-%#:zNҥVV>nQ+_x!*J.c0nM?#". fwppu㰇/s3qI׮EK驨8y2)iOTLo>> ::svő#*8_-[fgfk]-mfk+o [߈su6;;rݻ،3fzy _[X IS3<Of) TҔfl޼6?\La(EN LĖ-_}Y_3g65 xQR8wNMIK- [fBlFg2==^OJMCkho-_fc=ؼ=vwZj~8h>ǽV\rnԩ|4>>ҶJĎr'GxxKQIwcL˯uuzdm%6^9$1qPs|lu.a#d0YuP[sh A̞&EDH$:d6L+ttT8mF-k^]rapP8YKAX8:)Qy))izz8;MֶS`?gΪcc,X}QI[ Pñ$bw`zEAuNF8. <ޭwĠMk4 \bDla:V38xw.a" b܀ueWDӦ[ZӲd9~'O$ݱ#_X,[[Sg͚3gNܬY֢[{?rLttٳ̱- Iې{Ssj[Fjoo!Vg,E2N7{{n"# -%5hOF^4jFW뽝-N,bx8VΠKľKT檪 22R޾]4^˳gm8Ԕ:\,ش)2bY-{6rN:ZyLn`b (/H9W7O/#Fo84ryt庹{y;;ѰܜFi ں‚vQ~e>. :8?AX"EKV=l27776n2|π74Oݳ'-}frs-17+& Qni4kLܦ^IݭDp&(@l˗jÇjRtVVӦϘ#5ӪΝ,ȯB7+Ej+/gg?k4˖~"*Z^C޾ §M퍖6ʚserPQsd~J VLA5+/W)\K [[6/W;wiiUj z=訩>Sy*;W&>-~^T>FSkjrsllC"#l%8^[wW_P0}EfBQFwЈGwy(뛩[_=Jb{Q:RO7 XB͗RҥlܰNzpRrA~Z{ B$tt %q{>M/Av@Ѽ?xR;&=1](Iǒ8 ^ٴyxJґ̜..>xPx< ]D0drmlt‚CrrzzT* K$ Ϯ_0}ZN7MYٹ-F#ĉ_~Oy7;owm V]o}2hQP4$ unQwn5=lwJ*SEA^jp랩Nrq+2&xt0> 4A*Z4 I&4ÄuO]]G=TC-"$nOh IHnϡeF&yRH~gP#!AzQG&^h Iߔju F(5$ H$i@ I4Z}|s)3gv^>C$i`a6wt^p*Tٳ-U4{{Ϝٹ-Zڷe xp<6 =a4) 9|(/^lnm+yf-X OQ:"dmy9nn>2I}/>^zFեӱ6bsZ<٬lj a͓'9ZR\]AAAO<7W r9Ʈ#O,;WWg6D2{w f'$Mh/enwv^7o'ε5s+*zzp\(ɼB[4&W$y84;1K;j3O^T<Ԑy? 3lnkKM>8zdB?۳z={h4+pš5`ίn0w'=|0+vñ4)6vv,n ~2I99_}Z[Y,`QtXL}MMmf XQW]! 88"riV|W}ɶ~O9KZYi33wúEl|ᅨ(lxb$~U~;ӣgϞtiDWy)'/==>+? T>8~֬Ȉ+bbX̔;v|dnzu9sζ.<|ӯlٺ5(naòAVt:'Ye~ҤykעyTT<{'[U*&7||wX#_5c_:MіK:T]mk矏9\K&OR3 /l%V1:s&HZjS\ 7Y)];ݩ)iaakL׃Ridg7lHLtu@WW6Ï cEFJnQWpdڵ랙?_teKyzq==u3%-11N.tXE(1 =,Per'G'GʚJ]Zho-_fc= //w>`wݝ?'vhxؓ4f4\PYi0/H`C0PpیF6jk.V^>K^;gAA!IYٹU-m&ӄ@O+s0&b0F^&Y6=49TѺF܈4GKˑ;:%Rh~uh8.qq`q% M&[:;vG3TF. =AwwrܽhXmmnNNvrM< ں‚vQ~mb2mmj͵u)Aҳg-l8Wg潺lۂaT;A#FZ[㢠3Z[zat'Ǐᇔܵ%$̊7֎ :kN^نŇ|Uz_|0wnDu\,?u*%97߈O Zx/Q.-"se{dێoZfΚԦM|~ZCzK U(fera|ҥ7GIGNgdc^NI o^XL,wIKS&GGe2|{7U6n??8Xp+W-Me[\z{?mJJ\G̙O<{yq9 ^ٴyxJґ̜..>xPx< ]-t+kl4f޽]]GSS!Tr厝3}ڽnC73oE1k&}elɶ˕!!^}y_."AkX5ɋ-= ܟQ@SHS %~7TP5HԾB$i&%H&G:H%ApcBp}qSO-\8sfpԩ11˖=cG^~G$P’F  v.ދ-,Ja4FȑÇM(gmf}g]3zkM$P˞?/6vdǟz.ݷe0]@% =LM,*2>3&g Dyzݴ FeeJRʱ˗TnO*kkOVT46P(y{ϛdiLHH5vP,-/;WS߯3"kO)s&.?Vb]d8კ.7 D:a Լi涶Դ>߳\]/YNjj;1K;j3O^T<Ԑy? ֶfe74k4l[PЬ߾{+78dRS>y\]]KK_,&L7q2|pHS^~y f{?>8jdr{ϟooj9;;Ibc-8Qj7=3./4ih;S&Na[?puzCn*?Wѳg^4"sXr_|Ϟg}m|jʚ*37mDͽ}55yii;w~5qӦxg9Bind۱~w9sV 幧RsT*F;-Ч*,vݻSSR+֬ R;\"[bLD,K^>M( HΝji3&zB=j^4jzx8nFnn2AЬE7-}Ʉ:5fYGx<> ߢK^=C -%' PdN7-_/L<CGgy鼼g+ʫ-2LFV:t tz֓X+c}F>:>F#)\CŶ fG[ A0Fcmnټ1"ѴCΛNsKL҂Ή{{OOSGC"$Xb-2JJɇyY’Cݽ}[3i |~ZKnI8ۧV1 4֢ t͟Yekqqrٍ?zs&Lpsѷo/,(.?x{;8\;_\YIqesC xxL 5VVgKϞQ]03*3% J:6>0..!!ğfѣǗyzpV?PhϞ_%O{lpN]*29:: @/;woV;ػZq2/u=tݺؾÇNdӹst%y;IfܷW:y~~Kq;Ii?-,$7,ǖ<ݛsmiMZƍC‹v=jY={ &iܸS'Lhn9~wM/Av@Ѽ?xR;&=1](z\z{?mJJ\G̙O<{yq9 ^ٴyxJґ̜..>xPx< ]-t;-];vm}|TZ"<9f/bEPgx+Y3Q\1u-[>v2$dӫ>oލonqv;fD8JzUM"=jK{xee;0++kkq`$&4a254fe8PvFswKht);;%%?f2yS3g:9BHҿ4zNg9'ѼlJ ߨ |rLh %~&8+Ö-{atBMcGK|+4cMJ&uM#$MI߁EŞQP@ˀExڜM$iƄը6$ H$i@1w8 utEa&A[ Q8أF}`vOtc >)#nuse(=o7o$IIZّf?vboaI6(D.#N2P`vO4A}kJ^rf+V6zq~6`g}پ2%ߥWVLйQ_dN `y87}睁<'-Y3,0 m>=IC_ /7o8SĮD;s¢O?=>X\mB'RӃ] ݕv;>h+>TaFWh*ߤ{ąW<[G{~u[k! {uӫfB$庹7999v_r]l6!O)._==&OvVyy54i4E=7/zߦeTWՓoZ^m4Mӽ.bPUѧ><ep>|l,g6Iw6nwO} EmOr=*0p.|hdl;K  0þ)F#33ڄZ-i tLLL`=FYMж;w Gaa0vn߹ZJeSs@$|]iæ{[ZZS.qs'eğvto\ږ&ۼjNIٲu˖dvuzoݰa ᄋiS#5{}GO$(ȭQ1kHk@u#nKD"Nn]YR\[#!{6ӫt9s^ ˖yzL(`ڸi㦲~w^~oz  J$A)e{}"a`8YY:;;@>#pFF$ ĉD"ijgARiKKAk׮W7! R,-6NNcfrum'"]Zq"'j4zɉB䃳^{5}]pǒrr-zx+*ll41aP*;;y<^GgRvz X!=AG1޽J bcֿ駧N^h C# ׇ_B"0{llrAbnѣ?;r8/_*e2CgΜ;o VXDXQ^Xqp~~n6HOb2+?t;trR3ccj;/>믭bX3l АaO$e&R@Fvla(2Lnn`wd sr-${ddX؜Avv6 SS F־^Hg^vOJ'~ޱ㥿.ٺU,,45͘aa7oTV|":ڎE{]c<^qQsYh>&:^iYYWWR,Xtտ8{v?^VA"Oصu_OϞCރl] &nAXۦiiI$օΫ曂B Yz[ii6 a¢bbf]ա/<}?f;:dςLVSs72ɏƳ##,-'bwxoXiF@ aZ4{֦$1MF=4$ ߬|`HA}9w7-m+WFE(;y%zҿΝ(?9MLh4sZYDtub5)'국Νq ,)%ŔdONX`kk˜>FNI?8TU9{:1q /ogg&%8:~oӦ'%xat#N"P('cc*DBƟ%L d<{P++/]|YlLW gXfFsq^zͲe-{ȍ_Xfb2j 0R&/zf5ȿt);_11f<<""-{"!Ӕ> S3Mmoٲgwy˯ؑM$ںRY~}s8;^XG2NgCrBQQ0#}͊66R)F~GLF$0rMmP"VJ8 ǃ(ڱ|74FR&1#"u*ib8kVP㕔TjuxhPt'@2TVyxט3z0]'~fXb1 a /~|qegju6v}ju}CqQYLf/HrLԁ~(BaI7ry|~{GoZM 1. .KHnjZ#_) -g n(ȯ 5*:#29yD??K 8]k.]>ubz{J̌rw5kIU.aMWwQ3'q\)H kHHBҥǗ&Ӄ402{׮[(wNe}B~_Yz~ϱoo^ļϮfHwqBb]]GGqZCBXIuu ]if $th4o@WWWV;u~p(/o||WXlZ…>>x\}scǪ r?uǃ@ps *+K|`&҆<7bϣwٳYuu+W,7WwGDA_ W4&&Wtr&poa [Pۗv+X ֞òxdφ?]-jUkK.J]56 <evڄN~~~֎$%jZY[YIں{чS`=aZM!aXZ}ox_9:͌ZpŊ5kӁ RZZ/^:x/ ۯr@SMtzH…O=vš!n|Y~k]eeϝegdgYsO=paD1  E.ч?o05 HMMŗVNJR .4bÆp?]]jummڄ-[}+''uo:&̔NxEF~w ID=?of_ 3wpKJJ:LW< $zapv~ tOo\l| N,yaݫ.Y8f|}]|ի x{ϟge5(̰y#/8<-a/Z ĻD JO$) kyC&M1uZ, aɐ\bFSPi!SzQd2)Zq$ /ڱi+ rX0V$ S[D"FU)jC?Bo4Yj;xE]]*qD5y:>A)eJGTpKF'Q2{NRMMM H˵ZEa ,L"xo!nSӈWvo}|,.m_/,,,hmKLg;;I-Ѻ^^..dr֭G E -vtW,xgN9Poih[|`@7$d H"))9{&#C$rrZl'in{BlvHFFnnbO\v Z-X) PLR /Ò˖ܩRQ(]]˖ΝKf2?OMMW>u wLDk+*Ձs/gӁ E"2j?Z]DGJ{Fǵ8~#c83"#3Ĵ56nj}߹0;VXDX%WxӰLN% Tj``XhRR||"fM8vԍjKq29`OHYYjU3a' D@H55(t,<Úqy$ j%T4+hTJ`1i|ۀ9IIkӗoq̚x060jJy+a!֮Z<#FFFh=<<<  $>3};?SbXIVȆ߻݈mc[[a2ӥgNtAYvvv\*Sil(S]##jucSuر=dZee;9XFήNCK XK^~IRȓC]+T\nSJmF'K]F,nooiQ( XvdJTjK sr6g/tmnN.سlxvub?6d2 W,9`20>^V/rv ^otޘH$9 !8Ďjey{A \nYYnnecnAAƓJJUW+ML|}om[@>|mǺ>ݛ^x!j&ϳÃ[oO Jz,)DRFÇA 1;;kM555l-۶ٳ_( IDAT :]#Q:yb;v:;}+F$VW\Ż8GDNsՊگ\ٞ=׮bpǧ.;J_snMm v!? ) lID2 ;}r[7nLLdN>DnN>ރs;z} 녢N $N_$Œ) (<-;Ht~ Kt_@={"q0mm#޴x|# rl\/+qD#t;G++y0Jy\ Cg}lT>:4k׊KJ$sL|sݻ_X7#r˗-iL ŴU(JKO8L{h{  JWq^dԮHǭYAA8BM:t,?*b2(Qsf7t!mZ;ssЁK/Yw} u8<0{i5]akH"233~Y KL3˖VUT8 ROØU1OL\hL__W-ĄLFƟaA~aaqqwI.XH4T>[p 8`Մ`:gDmlh4'' #6ş}+jnuu}~N 0p8/럫v!xc{N?dK,Zka>lPeEvNII_yxxD# &3]{0T(䖞=ñ_.1 iO,:~)-yyu* ԌH4Qca.mݸqjNϴ=gXg'*oG0{t1AzLooW"\~^}LPՏ%!!"l#XXq7rE"T rXRYUPp?K1-:gӓj|C̼<",t<__+u Ӂ3yڵ.K@ ǘ.cF=z)&1S:ݔnw , V[Op|C.)Sɤ2)kôa0T(F \<<{{`UVC!Tˤ}}"QccuMqIfUekV56UTlNlm~̙˗++:-ώZ>;QtCv1As~^vɄ2? X1HD0;;7~X/nj,+/(,lo'SA0Fʺ~=/N*%LL4zLVRWWff~HdobŜ9dC3BP~h>t-iF0<Hqqa0.H&nlR_Z@AF nZ1X9pO/ +=/55\n. niCCWBADG/Y3O7ɑF((o":>io-,\=Dy(>~M"h|7L jgb)Zt0/Z b0ްw`kkif;:}<^QQ,A_ٳ̛fwwV{x0FE`Hόvs]!@aY((d;; 6[oQU]\ d77!;" #<"0TCqqnW\ζ13pެA!ON>(M.Ҙv2{(SJ4ئ%A<Ͷ@APW+^8,{8i$d~*`rrϣ$ۻ.<|M.vSwoJeY߾()o3"r9̜ŷ7<]2&t,4aBR ?*| +sНbzz5ooތ|ti&&KR,%la!.m=6A+Ny6.ҊLFDݰtr5{t?GoEA ]CKEl{=w}Ígʐ?H#C|~of-)=ia\ٻ{;ݗ/MA8f?F ybc1&ېJg{ca0vh(ka!HO##hE98"A r7vjh:#&ȇzz+'[Oݩ k__̟xH 7(P@D$0HP&A1u # PP@Ʒ"A3(#0cCb*@#p 75=FFS\ $(P@ 4a (P@E (P@4 (P@4 (P@i(P@i(P@*(P@ *DyŇ"bQ-QѯRcdV64k7֢ Ņ w5;Sf,bdYѹn*P@aΊɮ0x #1-c}F+kGЩ v~xvjèzCBhA{<a4(gΛjK;tdufulsr(So`2?*\Λ>;/kx@C'_/=?'*TXiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - drum screenshot Screenshot showing the AgsDrum Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later i iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx |Tg2IfLB’$$d5@EBh]Zm߷}k[*R,Ț@؂DdߗIfwΌ\6&If9g3gvM0 t&(2LPe 0A@a2.#ڻoiJz篼GG.|E?Jf~/qt:68($888.oL^ >34w7.b._qL^Y}Ͽb `wH8xرGܓWYy4<<@뛞<!Çeg[TsN]`A35%%ǎq4-a}`a/D"cǽmѣF:f:k5F3M"h cdp;uфNxOQ(V& II P?L&=vѽ{Si}WU]nO+*KJ (--11&S-i!&M;u?-u 7l8sȑ֦&KJ3bx'&X,#SSSR>UtԱc3キjնmm8-[6mZgzhw?ccej^܏2H~ןwo<]cKHhGB-0(q#䵷75FF>0{ɓm6_赫ǛSV~Sv*`dg<0[.x]ʕ[=s?C͚g|]{$/8{V߱f5+>;_QZv[H JN7.;{Lans͟,&*-]ҧ~ o?rĉC8wf3::BC|}N?~بtךv,_is~=9}$SO7¥6 /<ꕖ6~w߃TZRZZ|LttHH@XjTڻwYe rq*sj kB[{ʾp7 6ݮT>|P^ޤ T&j6[DDt?vAca¨QD~֭;voU*jȌ̬YMjl2rsb:_\'|W2$טH$ʫ*[ZZjt]TH~s|E ρq㓒4Gέ͚kmm;eʜ9>;uz{mr~y|R, Td2Yxt':տѣNM3m6l/\_|Gַﭪݞ=q8R*}]Ϋ?,O/OOVd2GD-uuFp]jD,6}4> u2wE$}+٘z)35[LP..jnim>uj3x5TXbI0p-+?߶|Tu[aeW|/X"'~FD"3aРW^y_wtΖ?/x`茌\qҵo(QlJd2T*F/sB& R1vETQQ!!{8>a=#?Z^xLL5\ _E"zիz!cSsUXg3g ٩i:@Z]FRl/֯H=mYcBBCfo/?kV%`0(r\~ c b9xk'_p=ӔoljrX]exO^RiL E]ݙ3Ů| fS8~|ѣ"zWfBQRR\\P0sYYNMvQ(d2T"KV)o2a$'&zy&::=<=Tzy .,ǘ}dg?aګR5#z + dcgg{⥎ѕ:[55#)Lu<O)(?!%EX~//,<4C$Rkk˃ 7s<  mkmkkkxog4c\n4cx-fa Uj\,MSU';5ϵ,MMPXVCnUJE/JcGMO9bLIX]o0=L^^^]l0<䓛7mݲesnV\&1ocuq q""bo 7N+˅)ȮK$ֶNnX%]kHz%//b&ʤ׿_dس7oOQ' 75VL¤r?w45 m6U,tpD\  (=< 5,G~_}'o^lTf k L&%';f?&M*-aN,>vLq]-C$qgKŠї^GxwnefaƦƦFSxEDܑa`wϝoo9{pqFӧ࠰P\;μbg|ۇd&%Hlo5MڼzTzK$ڵ{8 1993w\Ah4ǎ93) wPZҧρG92pM&dq&OY O.\o5|&TVo۶wqKKmp_4L&K>?(04bw?vL&<|0S,./mn۬6HT[xti1ztrrTԈsX,7:6ېKڴO/_aBBZڈu&;va>nT[\r@ns͙3ejttFqsIDx̚9G3fEcѢw[G;iGV[XZ:dAFZ4kFVK*'ss7njmd2//Ɔ"oxxWv(.nhhk;_QZV\Ry^A"F͛r5taz U#{T >uں[~p4K>KM]vy1cU(t= t Μ)?+UU 8iҵWiHbCJ#_}&SSsuHg~ 9Xd> h<<232Ν Vpfq]46ʴ၁??_*|ҧ0V*h՛7 ?o,dbqpp``@@Chϙӷo||Z0NO nm{`Oڹ9~‚M3fٲjoO=$40( Ah}|~ȭf$|}^˯79kYt99C{{SNѤg$%H$>gV㩶XzjޏLN5}lيWtgZZRRllZZV֤v^HeJMywqQѡ7wޙ;wԑ#2'O P7smۺUo;t?M·h2Y,^^O?_> /NQFF8aeGĉҳT*%ʡܓlXTO>Y棏 +2[t|mmk˺_lXn„8o>},ܑ[LP6-b=)@~{4:*g߾ != .4֭ݾm!ÇMz+anN\A)_ߠ^RVTYYP {| dw\#JT8h}|NNh8Rq4h8Gh8q4h8w5wV`V#v˯]h]s#΄7X,"|RlMJ>xlwj2uD"&(-'(6b4vtZ,f]/SRTP*=յu|-V* ^AvSFWdψ^egKJBB<=>駯g7s[!pl/֯H=mYt&Mȸt뵹&j_C* momo<< O~{a5fRRzå/,<4C$Rkk˃oeRs**/6,[6ejfd/Oa*qEp|m_|y3jd);Y F {zF3~ܘƯY.gJDžTjCGhq+# IDATqq4888]; M/3mYm0Lb{)*dW &A$=m[:: b1|vͮ]"땼5LJjrjFTxGK-Z'2e#f3k'VPTjJrRzڍ`A!l5\JBPj//OOofkw\:0HUGh8Gh8Gh8q48Rq4iB!dNlX7Xhp~b1Sh}u~ZV?k75ّQ{+hҹLv 9|xM"y`RrJЬûRq48q48Rq48GH8GȎucj~e˦Mk8޻KrX3",,(nfx->vg.[bU:F陖5iݮ=#/^~׿Y>gKW1ۛt:__&=#))&F"!TW}|vfVjʻwܹS9y#EX7ɇrykKCåeBar}[\&/~ԺKjmaɒ7߼Ę wV\AYf3:;/|LۍߟpKrdcҤSvGq/FhqdGhqFhq4Ƒq4ƑZM}}uMYV}WUɔJo/NAhq4@hHƑh8Gh7[~`#0 6|šC 7‡^!SxZ4qqhh@ܘnnJƻgĐ!Y#FhqdG@j4@hH8G]ӹf1 #>T(l\'ĉ;[NPȎ@v 5H dRّFvpgENM–$wbd܇ѩɕubdN1VQ)l}dNL1w7 ^N'\Zw̎ pg};AY&6J]/wfrRȅq`dGj ;ف@vH dGj ;Sk6#\k$ uwtST>[.68_Mʝ>DvH dGjFv 5@jdXsj5J's{hӷ'"z[Iu:1L@)#5H@j ;R#5H dR#;ʝS;~Lp//ppBSJ1P'w&կR&atVPn%5 b{Zm{GGQW_A"JVm7䕕۷=/(KkR`}jպu5Nm?odr9[j5 _lشqÆ憆`vԨ̬qc}#5GHƑq4Ƒ#;GȎƑq4kkvG%cɓe }~`044TVhpW5-"k e =:3+5M&P>tҥ+?_+LmIG͜I448G@@hqqqZnuwqPqIUuCCgLҷ=v.wώ>SYYWnyy6lؐ~1~'Ǐ\hRg>#6Nxv[Ks?p^?3~zBv^R`sכYCϟۿђS92#=2[ҭ>;Ժcje7".\>=##!Y%)p:=42^cFGEfxiCzo,\h6[}֭C:f׺q4ƁƁ8G@hqqq4ݭqKv-^jOާ~پ}z}xXjAc2KKPQa4l_l.)ټiQqq))Æ%&QQ}$$ɜ2e }H۳IKD痚2mGMM/y3g͘Zxr_uԺcj+(5LW[3g,ֈЀ2u]TDfE$Za/64Ԅ̸oq"{~}Ri^^A]S]Qqf2utN:~رQQOキjնa᝝N! ;r=m/8{V߱f5+>;_QZv[H JN7.;{LM.W*o,  /INv=GTRBR#5Gh#;Gj4Ƒ#;Gh#5Gv4l\k7+Wج#FWܻ#?\ux{ZߎC[{q`VKFi}z bg:.Ӟ)>}lYmڻwx/+=E|Z%Hec''|0?/l]&uwe+(5x?w*e{s>8mڤIf͞#:]DD>rae/ϝ7Εړ7}q#F<ܹ͞a da<}TSC0g̙ӧb6Վ[-\Ю?_7W/8QRZ|дi~7oNh~ѽ5Z'}t#O9/0h8q4h8Gj4hq4hѸ{q]n7;::;6CTЩo6CV({/Fz{Fd4ޮ>ŞjO/OX,L7f^Ժcj#2Uxglݰ>6b'|Q"q;W$JM80!껈 T(zz^x^Qщ?%ޝ98,Oׇ^g̸bcRS_yߕ?saa}^4**$C=o~zx3vl/֯H=mYI7qDGO Xb7R" 0HS۲С''ǎ/` ka#5Gv4Ƒ#5GHƑ#5GHƑw1)+ Dl4 #^6}]/L.W(Jbimkm녽xkju腉"ZV_hsZeK5w/]+no׷;6Ww_y\ֽRY߮l2Y,*ՙoN:4|xzFFƥ]8]K!so  mkmkkkwڝtc{a5f}-K!Tu5'gdsYi{X?!-=,L*p_RixxL\^E=y󦍞^d3ϯYE"_۽pv[gӛ7Xnm}b5Z=3woZԺcj; \. 'pֶ[KbQ(xcѢ cLk5ZMPe|gHtۅGs4yРqɤnY,VLxy{g/rRIv4h8Gv4h#5Gv48Gj4hܽ8TFDhvl]Xx'==uqqѵ7_S]Rٳ爑u]{N8yӉBQ OK1cҤajB9tؔiG۷/D== 54,""6fg6uժRy챑&L{;> vdGHƑqdGH8RqdGhqFȎѸ[E, KI})]d2?_$Ry*՜%#s׻GHHRqLJaGTFu?>w-i{gf >,ݸ`=Ǐ:~5 ee' bLY3'h&dѢw[g9RW_S[[WXXTTR[JOyk*+W ۗpK%¦okn3fLqYyYYc+.X: zRsԖ-ݺ{fO:4+`K_7TU#5Gh#;Gj4Ƒ#;Gh#5Gv4^k.fKU*7,"4TY|'~yRc=fpK;&=OF~g[lڴv́サdZ-=#‚=ofZbyy?399k|e+V^i4iiIIiiYY&z#0LQ>W~s֬^tŊIh3bb$E*3RS]\Tt(?wΝ2uɓ~i,|J￿CeR_.NY,Ο#: Rut;vl߾np:Orn31"!~3~$8Rq48qFh8q48RqdGƉD EhX?`R]u"{hXh.[#MeGWX(L0 ! P" ^4ىn\8a;5'N۷ҲꦦN' GA33$z5^6ke}jչs1g_6]R4;9j Y& [ܩX O1jT׻j$a{gn])Ufw"5O3,&(\paasMYfd܇$l"z͉Ժcv YLPn~N+*)lpM> 6W^ ʤcLvN o @a=H dGj ;ّ@jdRّcIb/(?Rƈ8E;54 [/'>NeN:as#5HȎ@v 5Hr NNPv҉rOfNwlف@vّFv 57VpwsMP~0t ܟkQH@j ;RفȎH dR#;Ȏ]sbܺRjK;1( H dGj ;1H dGj;|~cBjtGp Kjt_ف@v@j ;ف@v=R#;Ȏ@v 5cH dR#;Ȏpb+IɝR`n#5HRف#5ܭ/h+(nI@ Dj IDATH dGj ;1H dGj0ɕdz&c}]a];v>T\RU);p`Dݻ 7LJ HD"[oJ~ٹc>wQ$g0Oҵ{v8xʺv/,wﴴaÆd/qo,M~3bGn4\1'd%u?x?wɘ54;;(-)niZ==u̬#3##%jjR뎩#5#;RqdGjFv4hّ#5#;R1ɵ;"5v WP6}駟ׇۧ4vLO/Fu8撒͛\Q2lXb?8H&w]b9ŊO?koOK4xA*du9˖UVh3g}GX.k\ ׯќ4 -5-}ؔTH޽yV~ǭMӦ?QQ*#$8RqdGj4h#5Gv4ȎƑ#;R7wmLrH ݢS_>_Wʚ;w ݅GE_g~U{xagϞ25!As;v}Sw_S #Ӧ]8e$%*?'gܜ}{/)I4OkD痚2m N{WX1WTϝ:EjwkjdGHȎhّ#5GvFjdGHȎNٻl*+;_a 'T+@c{N}]{9_QZzңϕA$V{=p2RQqj|/=.^@T&dr$0(>`lZwLh8#5Gv4ȎƑ#;GjdGHƑ8{-YAn7;::;6DTn͇:z&j= wE"hZooh4FI[wSm6,YpۓZwLhّ#;R#5qFȎHhّݗksb6Sy[Pw8ݚgNؚ5n?JR'V\c%vb(n/PnJB![mm-6ݮ^}]^{ѥr]rBTEKk[k^/[sRC/Z`_GE",]z< #mMUaRީ#5GvFȎƑ8RqdGHh8#{qף99Iht*sr=X[M4G1as=(ݩQ "\,WV;vtVz+!^Dʪ5Wn6Wޚ<cۀlgpLm1M6&iss49m6m1cll3a h}; Җ] e-o^;v}SW>_S47o3w|}UC 4Z*&;d'5Ԥ&;NjRIMvZK )"344< ||`5Nq:v4XԳS;t iiEc'̘1a¦ -n1mem]v ?n?YQ3fLy ׯŸ[NVTv}l\f˖#w-ձ7+h#XԳS;t崴ڻگ}ϯZ}uKx5+/R;n܄ Ç?vo=8 rלG>ZR⋫Wm۶gnڒU\\Y9x7C>8uZܼί13n{"痿Kޝ[ZZ]=jɷ>qbK 1cO:mϞYiS{{vvIAÇ͜͝5fLi[ou=bj8i줦q8N㤦q8N㤦qZl\OW֦C{@׊|= Aho۳Ţ gg蔩Hjoxӟ<8f?O͜UQuۂ%JMv'54Nv'5i4NvR4Nj';-]/ tsRuZ&X+u`ͼ-XSSk%[{>^R2flUUnn*x3<.RKdqR줦q8N㤦qdqR8I6wLɔһt;ڏٴ{%+ 32Μ>^ھ=-1f}MXQ Wdd';!;&;&M@H,v֭VmvLss"S\\QQS3m>8o)UU9K"ֳ ~_"#e&TLMv'5Nj';4Nj';IMv'5gzzx^۸a[uѣO74\gd 4l'M2qR]]Qqzzjk"k_Ɵ/~*?Oկ~C5'gά\_?Ӧcg>3iboWW6ۼ?|w>|ӧ"J?~ƌ{?֬u~8256X2ީ-X냕|+AjCjNjNvRCvHMvH Iޟ{u5Z:-XV7] `,VS;~رuC ,-/F[[.?wc:]Q1gί};ĮW6kA;fzM;XOiSw- {3m{?[g#Grny]MJm~zS ={3f9p@AApzCÙ3ǎ8s=w;uSk%( ֑Vr˲1mJfT[xHjCjNjNvRCvHMvH Iͬzv7sgmœ?[j͹uCӟ7wނ{ˌwHZSӖK~Gnhfʦ%K^|ĉX,5N+ٗ^O~}{W/̟7pgμ. /yt(7bs HX]d^ɷ &;줆쐚d'5ddԐ̪g~!yZ=zk}kּr߁i?_^l{퍮yhbIsK޲m]'^;?|d K޺[o1p6lxzTut8yc99 \V M'5!5d'5dd';!;&;f&]{C;wX^>}i׾AF ={޼]~Z'ʊ(_m3KW<Ը~vDlPDJʋ "ц-[Vkրʌ JQ#&qg=q%-++(.2HZ^yWE˟]ktNի>aCf̙MVXx }]$RV:kꪦMo׾o}O5dw1!/~?M\RrƍO,k;:i\ene!P*5ddԐԐR{D"EeG>)-jk33#;ssϯ^un}nٳw49w3jDE99*ǎG~UUM۶btt@?oF#RCvHMvH I4dxo~l,VU5bк]6lض9ɶ o/(. NJqkNζ-?beS)ο֊H䭛u}}5yy#FΜ9uhCsζ;AJXl|"XWw_po<!;I-Œ %pL쐚Cj\CoqMkvy+|e99=4gΘ%&23G#^ZpasΝ8>7?-H/I$wx̙{;u:-QQ1q )]{l7R(CjCjNjRRJwvl$RR:e? zjƧٹs04+S'޳gǎ;Oή;6??-g^۳Ly'u?ewcΝw\wu_w_~mWiɄ &S;d@eYiqQNN"x=/a{Ξ}wuU$dWlRQF쐚Cj$uHn^]w~öoߴ=gϦM;_۰9+..))+ %ϛON:bDiYfVljSzvŸwIO_KiHՠȣ?a+wl_Ҳ׬9}²jkO=gښTzW:LjCjNj I !5!5d'5ӐR;gL2WHKFj?_>:)*}c_ξ,3r̘n{䯮#Kkr3P[k_6V'5!5d'5z38*5ddԐLCvHwYS2%RW7RdԐIPj!;!;[Sw 7CjCjNjn^W+u_?PN_)p%ٰAjd쐚CjUXh,XۂÂr$TRkJS'U2]+A9 #GUY̬`g3 V=րJ;0?`<0JS)lP^dt(7bsz3On 寢;$7@͡PRF246XԳS;D zUӓIMи8N'(/ uC ]u[[>+.TLMv'5Cvү㡮}B}&;I IMjD*6(]eˤ'vMΟ;ztǎ}h~5%.Dv:p߳ӧN/-+,R[3xG0!hwC'IMjjac}ZG<иfڗVjkkh8{&??;;{D^yֿ+_7nذ#Gz-;}j͛_}1cL53؈{xwRKdqR8Io7ם|BSs$?xԡC>1Ç7o# \&ӧ;6}Wpa"1qQC뒿^=7ÕN㤦qZnY B޵&;I IMj{D*W~;>NO@DjԐԤ.c2elP @IK&HMvH I tN'(?[2%5NjNjRޣy!CZR줆&5=Ft+' "5NjNjR @A2FC UR`ԐԤ&; ʿ1 bh,9d>RCvHMvH ;X `%7$X[6?bj8NvRۍJ7D(P$tבduڠxlQ%(U"Z*&;d'8N# kIMvUүRw|zwd';!;I z'(7 IDAT]eؠ t.~ Mj8A2NP~<}(d]KjԐԤG B޵&;I IMj{D*W~;>NO@DjԐԤ.c2eҍ``v+&X&&5d'5~ּ̌FrB͡CBwVF$5d'5ac}Of V"twƅƇֆ]w@RKdqRַ@NP^>XB޷JnJ~+;2d C`B=R VfFn u$o%t>X5%TLMv'5Nj}qg6(wG'O쩗/4#t5g䙅^\$TLMv'5Nj}qg^8Âu=ۀCNe$5d'5@;lPSFK(>;OHnmJ-SIMvZnY B'?ZnH6lŢӧK+{˿MNO@* Hj[BIMjj蟜܉m@RCvHMvH ʝI !5!5v6(wr9CCjCjpբFAD#` P<ёH !5!5zpc6xsţU1?bj8NvRۍr/͝7|xд={2xcA} <8jH !5!5NP~<}(;QW7h`i׿OޔZJ-SIMvZnY B޵&;I IMj{D*W~;>NO@DjԐԤ.c2elP @IK&HMvH I :mP~<}(d]KjԐԤGb2e/CO}йXOIMvRd'5JЫCjo V9Ph;+:~"Xg+9?X(XYEBSS8ג)iiikɔ4N4N4NLI\KqqmJ+y8ޠ|` ez n kl;`&O VNO!yKR,S)ikɔ4N4N4εdJqqqq%8Ӹ6%ԕܠ~o` ?_pf(P{BMVJɟ?.XC)ikI4N4N4εdJqqZ2%888S{ N{ֶ`%?ث#*i%?ޮ#XԳS8ג)iiikɔ4N4N4NLI\KqqmJ.n*"z[r))ikɔ4N4N4εdJZ883%s-i)t#>ި5%\Kkɔג)Z2%p-%Sµ)7NPFdJdJdJdJ`JdJdJdJ)))ؠ )@@@44H=6uˮ]=ztCŋxFFnnAAaaY٠AÆ=qҔ)'px-׾狟J$/}кy͉ę3+W>WOwiwL؛ՕogWc<⧖/{y݇?~tSS$W\\^\IϘqϽϚ5.??_88888888888Ӹ8NP,zO>pያb5Ǎ;yY7\Z_4\8̙߱a&N2(5g)%o=⋋aܹ[e?ҥ۷_L_ҕZ=[O>yԐ!gϹg1p@AAFF[[CÙ3ǎ8s=Ǐ75o˦Yqqqqqqqqqqqzgsgmœ?[j͹uCӟ7w~D-[b 4uUʹMK‰Xj!ѕWٳ/ӟVU=| _?oX9s]w+I4N4N4N4N4N4N4N4N4N4N4Nqvuhiٷo͚W;5m̿o򊌌 a4VQ1i)UUG=ܒlkl;:Y’n-*fһ9)Oz 2)**)/.DlYK/=-H88888888888Aƻ'(g;zdKK,ZVV^Q\r#OFH"iy'ϟ].v39V^ 3gΛ7mZa;^_ΚG﹧y}[O\cǛT~qqqqqqqqqqqnDkk%D,=莎.ɏ7onl|&| ^۝nXs%K֮QgD"Zts 77>[7$==?x0yxӵ_vֈxO/ }_,Zlժ/Yvi=|&iiiiiiiiiiii\k@ϻ QFF%iimm -D"'DTN#o>ƹ;?tٲ={.c߂t M7oŋ/-{n}3f|-]v]wo8s|-Ȥ̌S>g?;u57;k6K֬޸7ػ/͚YQBQ5N4N4N4N4N4N4N4N4N4N4N45 u_"쎎nk}wd甖UWOUUřޒ^7tΜ{=ի>n֭-{v]5{FإP9v?o/sjj޶/߽@4N4N4N4N4N4N4N4N4N4N4N[z5nPN\XjĨuMvmذmۙv8N7f.jΛqkNζ-?beS)ο֊H䭛u="){3gٷDEŠhiiiqqqqqqqг-Htʴ >ƍO=>s1#<``EeIiVv{ۅN>gώ;w>]Y1vl~~Z$5~:ڞe"S.?!)+w߽ӭʔ:ko߽?o]%&L8zLeE99Dc㉓{W[T8{>wUHsqqqqqqqqqqqqqG6("yuuwя۾}ӦWw8p=6|mÆX,/,xqO~r#J2mwoA &b~mȾ6]LAG~8'ÆW6ؾeYs--eeL?{599riiiiiiiiiiii\l@J((:)*}c_ξ,3r̘n{䯮#88888888888g ))))9)))dJdJdJ)7F}fJL ג)%SµdJZ2%\Kk So )@@@44H{rfVۂzgnk,X-PjM5,S)ikɔ4N4N4εdJqqqq%8Ӹ6%T$v9z,XxYPm:|$X5Uj֙ ֦)@8X/ESS8ג)iiikɔ4N4N4NLI\KqqmJPYsjl]ttt>{ƍ{vt 2efyӸn\"qyi?zl˷mh;ӦUWgfơqơqqơqqْڧefsg0?v|ۖ/<|k۽7jTAp=Ǝȣ_귿G;M{Gիg?IKsf2ujƁƁqqENP!\Nۼu+əzve~m.584iii@z+_X >|ŋ%%UGzۜg>jTIiz;/lxyVMHaaՠ#jj.}ەH:f+>{[?ѣx]O??O_GXC7>3KR7Fkc=6o޻ȑƬ#OG}i*+32:ߪѵkڲe#GbҡuSimIfx?G>?[|]>o|cEEK7O,?Xۗ-{΅ W>IƵ8x_wrѢg',(,li9rtۖ^|z.\ U (}o_b[z?b괼h4'$qqqqi}oDV|iUUsgΟ80x1PSSUp{[lvÆ|sqISΝV[xYC(+F6l#;:yby%EYhdA~yYEeܼ7 7ꚰ;{/?Ň G|̒_^F6<7왯}xU?0~ܹe /% z/ys|qO4e|o}GL8ϯ(4$'7xhKqɠAUUo6Εqqơqqơqqq@_%{ho+/֪̬Kh|PUYiZdOhOٿw9n\Ii$XfFff,qo{s2_ލZZvپm׮6,;%5.:fЪĶm=ёHݷc]G~C3fTV^ѸX,;;;+#s{޸+^4N4C4N4C4N4N4 7H"qBSS{GGW+{#IbV-ܜܼlgU5.sw?_?[ o=Hkx܅ mmXAaAAnƁƁƁihhƁ&##3+##F+gO_b%3ҭ::.\8w!O$ :ݪ9W錄xk=Dsք93f䚚6(:m֭prZZn.߿o۶/ټyϞGcAUF N/7(LOzd[fL:p`ŃlY~ժ/{f5k6o޻ԩHvȑ#++s[edTT7mY٧ڽyu/ټy'OY඙9^0/[n}Ԩ‚dI_\|-s_Vͥ^ -*:sWWzeVuKX]M7UZq`}888848848٠  ʑ_?!XFg`Y2>+W+{448ͼ-XmB>+2144488@@'x4488@@ @̬`+=#XF]+ٯ`ǂ tPfF!448ƙwpU{_eo!,ŭ +-S˴~已[#GT[Pޛ 9_}=zq}křRRJʟ( ǧQ(*&`OĔDu ]cTjcb qxxxdt H(I`]ΖX3Pg8OQ0VCQIGqGqGØ%G@@kA2$(@A2f ʕ۶[h?z`6lص+Ă|3wPS[Zax>Be=EKӷ敖;phT* w 3YxR4sJ}<)ӽڈ~y Xf6=W jjvعc? Rՠpw,2e'E#HHTא@2?G3fh0Lb0Vܶ-6Qb;JNL,)qt17=fذp;[ww??ghb%$9p0@W [[++S#Ç qu $oN zN5#N17{Y/-kPlesAavNfT1~~]EDs8<^Z[Z[1z̑#QSSV2rw>vW. 6>SΝ>P[[YYZjg' sv GYMKEQqeZeYnڵffjunoL6g.IM.1,$[7Ś4)>~̝:u V$6603J1fޓ'/_TQ'>|~ E$$$q>)S^}38$(322\tp40$gJ׳qqg,^g21 tyִgփ̂K.uX{dkMXTTUTR+VDGO:ARb ;{o!={!zdN]6Oюֿ?Iw?5k֮LM<;Νq,$2r5DTBi>ӑߖnڴuQiiJ{dzDB{oX"RSKI4llm4̔^f7 N_wrޛ6mLp۽g }=ӦyxLV;uGܲGn={Ξ=ܼ3gΜ>~__ 3{/Cң[ٳ;(I"9bܸI4͕^H(ܲeݺ /,b2---x\J0g.mnfksQruLRVyґ#~|ᘛX֎hbѩ]rl:(88dS{v ժTj5+mk0Yry=]AhYRR""‡74h4_BadWZn&(DO$$o]lb{{bX&fRcVm@֯i&yC;qRdTpp@ ZB34VH5)Q~$&SjHSuӵtr 'LxwK>YQoL5,`,t UU Zݠm~Ns)II\\J/(/-KO5:,lРΝ==eVv' w{/#:GΜ>wT*GђSWSN|)޽HgU4۷yCB>q⎘ i/&$ tvҽܵChY SOx1==#c钵k6lKK/^9tؘ1Z-I67JB71{$''$_SUs1f0F =6+\lE?_Z^QZVVNZ=;991OѨ4OV>B[J)@_&;wy~ݻFD^}۞W{n6^2X\zzq/~YKN%2G`a绺zzcC'7mի%gxHho׹3T$jMƻ,ƍ[l߶k֭6ry@@hhdT˷2ɜbN+89[eˮ]7(˘Lx\-S_O, %A)+U$ OM!2|ʕ۶){vϙ'}T2,F 7?ħmAA"7 > S JSN&JHp(axXl Dǘ*D{sD#&+(([)f$:YfIB,"1ǁeg+%"Ibe3ƖBˢv2<>&B\Lbf- O"&י'< =?;wBd0*@;F9LO׸SjI5$0zк{3PIo)$d$ѸL/ Ր舽~-EFAy6ѷwwgc#y= /.e %$ EIH[ h-HP|B<> $qP4?k)w*J%"QLu˹oG:bIZbRHh)(R z*Q ̓ $,,I`$u!A>e)wg7(ur](l ]S# ̔ B>sG8u!A!Ѩ$ѹ  ptsE9d j'@B2}5$7:wtߵ:'<ʳGZE5/}7;#*л;SOJ2՘qy/أGfgTܶ5H1jN短[SSrA$g 1A9##aſ~3?(U&2nj%)G$$$' *kuf7,]t}}#^{mĢj2&fJ._":z„1_ݭML%o[S6ab*|6[12b2/ed\`a9h`HHJg⒓ϞYxMϜeb"uVj0D ֍c&M߳{9sN1CM,-̤R|{jSSwܼI;|С:]‰:~ SS/#܌ùyoϞm\Nw9^ާPP$RaWP4/';+&Ӹ\6bBJ˽y-%W.]44hngokPeI5L,lur1ڝFhF>_, 9NWQ֤ppŕNnGEzp&zッLMS<;@G*JhJX,?urERi0h͚;b㍌ۉLVj~*JZ`KLJHȸ|)=BҟJ##33GGL<<,$ h4zXjEũ)SK˄n݆GU="ܜҒꪪ¢+WbO>vw= ҷƌ;9s9s{67c0Lpg,s1fWUUTV>Bh2qRdTpp@ ?TrvٲŋaGG[KVoZqYt:}TVK6jjw+.0`$o/m[6 c/(m @hgĄToqm}(vo+T1l'}ZZ0{eۻw9|81!)G^!j5$IK5iHtv];sܹ~}G|q_P^Q__Zo9aN1(m0"D[QbijVfs2tGkA\#gCWPkٛP^ן11/K}vLf[mdW˫k+ /_J>y&+VCvgOjiv[w*6mJLg}ԯՍ|3 pC1ãÇ,//^SRΜIIpҥ%KV^ɨ-+kQGʪf2-[|׮Wgd\NNNL:rzt/ssT(d|7}@JJrrBbZZz+11U99o_SUQϦMkV_˺3g.\Xze^m_TҤR./(Έi IDATR*u.V2YcTwߡvVUWx^T9{v}˖ 3'.tL&'yt 3w?>zL:{ygҧFw`ߦMqqJw] ҂QXTTX]T z\.(}h+G[-0J xٟ۷{׮ݴi cc_=Y .`\_|]7WS9s?ż];پnݖ-v)Ri`o׮t-Q!w{"V;mڔ7}o׮1ٸq˖,,R( # 442`hh8z{_l/Ǐ޳')1-쬬F ~~}DF^:|[d=u|zUV:q1aC:سU}Xݻwu߶m^E*idF{CqjRYaߟ:u/:9}qx x>}UJ=};ﴼ?$`o%ywW^4f[  +̜jӂI^?dpH7}r~ lyԄÙ7o֬޻uln\I_6_.-}K QLZpEMchjr9;'䔕RJ!Dsؾ'ҥ'm>K;w5uW_`qޣL2h#Qzg0R(Ο?t(h^JE*_oᅮ˖K3fLycƸXOsD+U'O>vG++kkU*G"134wt3z8KmBܾ 7ӓwO;$(<$!4xS?1x39#08xڴE?lo`9;hRIh{sh(оI\$02XBBA@uK2RVNaj,ԘNv6z< H4*H 15J'> =ˎ$p@uK2]OH@P0Lr z.0&):e$ e8$ poJRTVTVTTT֐PQ6Ԍ7tK2U:lEASf1L탮ٍ]EcO'z9 :졓 $0-џEW()&ѹ $L)ZOGڊhk$(5$u P{Dkhu$0&Hh5$qG'f.q)wj CBOA:b3:59;}v B/O+JƑ#HӔJ۶YZv??fsZڣmAqHуsrˋ̤RmذQG?v˛divx:9ؓ ,I)//2t_H$ HXSw*5 \jd]󉮚, %@ЉZ'HПڐ~/]Ω\~տ+EEƭwFG Y+VZy>}{JL.)q5#$KV' wpB_/,"l$BVْE?]&qq(tu(<|R**DENy-)BH좘PҲZcߖ}`Ԩ o<׷8=}ףmAp֬c㪕=Sxc, eSa Ej2%ҒKȭwFIjXR;=D" s7jT9߱cgN_WV`K$VVNN]{0pР G&VyAN}zv#BׄFлw~2dM9EEqӧϜ9J`0jWܶ-6Nس{ΜO>;jWPWo>'N/Yr_s8w_1' ׮ݱ=1ٵ\Lӿ/0F!5=1]e8w[0$Y[(*nh6nܸ_zѣǸq));w>\__]URKO#k0uZ-Nhːl㉄GkmteXfխDlmu{^_T|U֝L'>gYɚW  2x}}1sݻ9^t[qnJCAGyfޝ;63d@ z}q??1eʊѣrjҥ_|{N'Z9sֆ ^bq$^x ./§4O_1I\e25zi, r6[V*kk?elm}||}wG7nYXtooc }*(?^GH$50'L EV2S?xzX{ el[%>yܸܜ/\&6nߞ)=5('h+,ޡw@[c2#z!iilٽ3[cGqoOMxr$,)f{G A<ONMM?U$DbVcmbm50ȉ+ٚF#K$fRϑHLMd.⢢WW$( ʹ9FFEU*I76P+<98ikcfu5nߗFsZJJZZ<$$(S'.H|}JSRΜp>3S GA]ۼe޼իã'x-ܼJF"uw =C=Ko|qZSRz=zvqqC'u?tرÇ!oq^{2JF )$xq/FDx{8#A+zA/-kPlesAavNfT1~~]EDߨU|#9ξ%Ƨ{ʹӧjk++KKd2c sv lywعc?׳%b.ǧk׫WjkUCCI3gwZ$DӦ}m3fh7^hFF{%J8Զuuڶ;a0RggdTK?~Ree5ztP"8CLy-P>=hڃ=hڃ<10ڐcFߌOdPJKK˚pv!ѺHǎ48 2*(N#fj" Soz'T:yEl6)"AE+gxR1 NMh֬s>???}=|BE#akhkY..LfBBYIIiU5bc}3`KL\n} {饁쪪˗ٳkג 6m/%}h :p@=foڲXܹzOϿ8G$1CumRҖ۷v0`РW^ pjj22b޽o+WXs~avH  K,]2p__wȨ^8Zٳ;&FW0uL?ubzpF;rdXX$Y,&?U:5k֮LM<;i/.%{ ts2njUIHHN./9u*WXXϞa!!ݺx,֤I{v/_>gԩ3fh"Tڼ_JEƕĄQmG+*Q(X GG'gcnU+c?s2.޾{7ߚ;"CyuRzw[NS^<֌=hڃ=hڃE{2" KEyommmem|?Xe4CRTLf)#Afn FFfRЈluC^~=Ϝ9vl#G3xo\*-ZrVF{{G]GLWM??th^~"ެ|} yڠg1,x\.0\H($5˕*pc[`2eAޞG8Lqrr|Ç;y2<[,,Μٹc߾b޽LMFΝ\݄š[f߾aCXZܣ͠Ao[$y=_>~ŋ`ٞN?G*mܩin[ɌJɔ7͙3ʈQQQ{;9 [۳gwPD2rĸq&i4+P`ae˺u_}^XdZZ8[puL]n&gϟk8cX JMM,ehllmL[Y&rCm? ry`髫4sGK^^ÆEEM{'rq '޴jfRQѮiibB)5jZC'8z- R[G{W&DXsrLNmTkdt-+'7'Gd,{kk++6[oA*1lwUk\]uៗ_^Ѡ8x;"|\ s{h=A lSkP(J&`)_Qj @(&'(ӻ`0n!;8Б]]W77'__hl#"]]|JLŢb`0@Of |qGN7vI 9ǧ[7QU.%u\q钹yÆnib={6߂BzN0J.Rrge^KIРޚF ]+Jssd7LḐֶ-oW=^JI;v4.6bo$@<޶6x4ucɒ1o7Utk!nݽ7d[, HXPj)9$I(wz7ATU05#!$GVqժ59ʛX ŋɫy>:u$ ]G}R(B{1c"cn!^rc))accaab2i~B{5? @c?ee/߲`h^>0ŅS*F%o45Yz}ffNv~V?:}Qq^~Q^/ۚ< Tjl,5f0zZhI.FSW[[hײf }T&f! Hj 5illoͣGWg++۷[w`Yѳfnx5uX]ݍﶄ^_X{Ͽ[**|/#L;eII>h~}BPx޾f捍?|_h(:yKj4kV72/o'/I 456azڦARH€Z-ER'x6Bfcnd1 ΝmlZFtw_._J==R>s\R]EBK)$mH)Lp솆~ymѣ>N7bĠ{ӗ-Adx"Q[u管^^ߠ09l[;}#S$JLfu5O(5!`0&N")6aBۍp8$=é}VG47ckcܸ!%%5LiZ&UIbHptdx>TֱH'("aBSnҽL/y^<)D6JMQ pu$&&9 y  EUUaQccuuqRY[[ZRՕWh EM-I6j?5>mslٸرR=NhJ˒7m';u ~{efPWWR\\\pҲԔ\vN]=T6Ɂ**:}:)zRCǣ׫*Zr6UTkӯ]SLLue2ofiiOɂCBtvɬߺӧwعZfe:Z]me#LQn=D"Wstzؙ1Je(phg \? IDATĄ$.W!5n sC~rudtYAheED sqO޸~͚H}[{[V~ɤ,_gNV65!anv3[zHMxR[A bq8<I+ZLv 5oww fi_k)"jcK,޼y˖Z0#Wn\\lb<'3RRLMyciq#A *U+jn$%ݻ_Iða/FO##3#?tëV.YFFuMuUaAֵJc㠠޽:wٲr'RuFƟ?t̵:>ͭȨA}e<^^_U]R\VR32+0!?y-ֲf..~~cEGXwKl||jR=W/GUu |}Gz=sr֯;xEsR@!CmJNfg۽Ҵ""l<D*iUY)fdeIVV2+>_$45|+~[e˖/_ACDFXXڕT7+$x?ZKHZ=<*,,*zݺU/-^t?VXBallRҹsLFmmYYѱ]eF##tCw=OT4AәZZ۵㮮.//-ڵrFYRRjuEEffJٳ\՜eގ ARL;6mÆiS'P=;919GY|d 1c~[>n*(VJ+'ѶIA{A{(> $jl$IFnl݄ϧfY['sOM8q!5+}+*lTjiص!o5yJ~^^\Ro1hJu6i4Bg„YEEX[ݨJ㺹1O۽+.9}z۶zRgoȐd- ;:Ӯ5WŲ9,r=I#cXU_pRv.[z𨙳f6с3JuӓտY-::߻wM͕+Ǐjre{ %II'32/Oh} s3_G_ ),ZSvorD>|9g.qbB{GE̙/ڱgWulٵK05J|}vkkQ@R xOݻ{׿[֬ٴifKKT ;4P&k,7W[q/L{mbϞqadT>~~}DFJیV{!mʷߞ2**Z+)'tD,H$I_zON8'%ed̟/ֽB|o%Hx<,[ZtZ]SXt\EeeeEp<گG{%7Թ8XL+Yy{ٳ9{@OWio;!IDL̴e1`gwȾ}E*1gL|ĉSɕf^pw U'oݳ7'zĈϿ?>$Ғ??ۻW`/Z}6blx1;;/jkk]ܚ IPf0X,R!$-v> +"Acq7䙈T"f0L6H܆-hmEvΦ&Fׯg&ؽYi$]v :yJJT>SRNtRCXح[6-?X,'gVأ9u=(hNn7  W32?~;w}MBB ’){QGպY[*u aOA̐=ֿa2H+}yON SW*--s!Cϵ:JvWT?~Pa3"\{ֵq8K˪\.^>>=ɗZ`Xpٲ5kjj**BCL6dS8J%W8D'RTzEͺ'_x{v/\DE~?C.Waъ/{#L;G?_f/+Æ6:PwӍ&j; p{]7vuÆ׿֫/[,']=:110@*.ٿ?}U3|;--|^]3m۶m-%%掔~m)ۨӦ+V/=lXbbx??j+-;qb7̘y5 :Y+\nfS\ܘ7(nť[B2V afJ2I spajUUN%HM"&lz=@g:@Y)9 纼Ē]SD.>\Dmf{cHz`N{WR*I}D\5H!K$>" d>h@kQJvdt>B 9\ z9"~Z"oIIo'Bֲ)[, YhG^sO>KuuV+o|+W|kT|!o{W5Jylٶuœb//!))>>:zSfjLM>uaիV(,ʪ,+;}:$l;v#OT*[ ͣ@@%wM!N܇TMȅ^/ q>SZ|[,eeEE;cZZbbxx5Wl|tE٧;)ߺdtO{J<}ͦ̂{F{ ŕU ?=dpАq㆏*U1n~W˗6[mMʀqc#@@k2"#Qw&iE$dGv]-;y\,b)>-bF#E aCE|+ "K*֛YCp pCKm0>}?r׮~٬[Ƀcn6jg}U&%%'+aa |s=kWXXR#|5?>v=&:g>.j4xkmKlXna9ihZeEs _ "D/>MA"Ɏfvp).)...Ig#]{R߿?GKl|qYl^;Nҿi󽸣[T|B訞6ZZ+U*)vltl eţ@@+DF_t\ IH/,ɎZv<2T0!sN[&r dHz8wKe#3(00 4W߹,2'gĈa~^*?p#JeCCddTm;gjjN ZK`_^*ji&#R3+X#iWyB풎Fq֭%'#OGU̼Çݿ֯o5}Nђ9F><>o_E`fڂe ~o$1Z"ɎZvQp%k׫'+eeEEQQFo@@ˏNt^ZO:| 7?8|PV(hb$;"MLRu(PpeTHS>|Jvm۶ 6[BBrȑVk[Q_}婧.7 xժ7{{aCL雇VXTZf\@[Q lvJS}sqHVSB #.\Eȯ.hr ^":nuuVvKՍzw]h7lX=n815u萩SoEn1))>WT||llVpw+W,?W_tMZχotN8cƭN Zw/m/u%;W#_*-iq䏳>}S"z踑oٺ N :t=qSSN{~>>Fcsj5#99yM/ڲnoU(|&yhzOã*#;|菏ZmGw\I(PjE ّZKjs(HƊ^*):)B$Bj!].[ۼy۶uW 7"#oo4*_R54h/&d8a2y{ Zmcs4o-+g~_ۈ}b#"{E3jk-c͏=v7\_hrFlٺl۶l'N5)E9lz@??OO_shpq(PE "$Ul&ܽ,2&O p:y{oZmuUYϏǫ(:v8{s\ܐ!nۺeKTJ0d>rt 7qǞ=wyк͛jjG+JL?zࠨqqxkڍ7lXK+/lQ(3ݳ=1g|pq(Pjѧj=yj׮o-z͚{23O邂z&5fIt]9;!`/ [n\`W\bfͫꂃcJfmnKqZc{dgxhme؟UPXXXZj =#5jkg;ۻ}\_JK*E8$r7eO/!"&˴ZyZ7V ׈?OJe:xe:thJJ||Kpb?kkdVQ ڷ@n_nٲ>O8w5huUǏoݲzղo~ȑo4IZٹݵYk~,^woIáPΗy~w߽/.. 9 ^;|WUѣ7YW^8^^C 75ۚ_xqss˷lyͿ/,)3lXZуk044~͚u> juhȨQIN^~csKU[~׿MAFcNW_/_]d22[n^QC?>>nO>ٵk&͌oK^9+us*fSBBb`*kiyyE*2+@q:OX'xj??ZP+v}xq۝2۞|׷$%9۶Zw=Oi[QV>'bEpȽ>쭿NLgy7OtܐЬwl?r$?f7CB6}s'Olj{+.upXő.룢bbD={rNv:GFtL/`0{;M>yŒUXpNe4cP.]WWr,wkmR]m­{yyڎ&St4?l_~y"hLH;n֬ٳfHKj.nwE ,^3hԩr]w9{Uܕ߽λ^]PptQ{5յ~h}enw}S'OVUꚪ*;T*L&?JU*SFݸOUEyu E]QtrN Iѽ BeE.O{(UZml̬Yx䷿6,|fYnM-~*4tܸ~͘sk||L^_V{ٖ̊ /-maC׮}MK )%'\32ٹСRBU(1:GvbߦG8t[zSV)5ZF9:Ntmښy/H IDATضWvg[Ysooُ\%k,]bwTAA!!A[єJo/?_?*(+E!5NZgUX]՚_1iG5o_@Wt5r:0;#]QyЏ I1Gum^ޣgTpBy3WUO{v9kCCvV扂C&Lwtc[N9e￷zmUUBM7I"5:'RыJhjN;gos9:%v-^f͉L6ߘ1iCCa*4,%eРnEFƺի;*6KٳU))AOJꃇ,xO?=z4 `{ii\'W6:(]Qӧv޴|iC#"}{6l\:+T(/x۳3әf}WU+:1W@//ݻ6m޶-'Cz7\[t,/j** 0++3KQkjАȈT*AW_={ѻw5 #G%&MV[NΎknPX4aƒT==Bks-ɥ[Ϯ!#cҷޜ֭55zM8mZϨ3[j{GpX,V񪳴RUh$&fl6zy3Q tJѐxus*W^G+>cYFhhXme.T߷u;vVVZ,:ѳgZ7ϾnO(mիz7Dj}++.|51~WSţ113}XoգGt9IÇj'=Jks9Udk֬_g\ +W=*4fC?uDGp%_񕔊8uRDlW /qHj$,`J @GS]"4 u,pu.mE%J E1\ݖ"ȎfvÆr$G$"vsvADpD\S\"B<Z"ɣg<͍G.b~X?{Eaȯ "l"~LY"uٔYPP\qcy?oO::Aߖ}w7nܷDfnΏm38zYyuB &R_]{ԩZm0ؾog{^_8r\Z"W#;8E"HEK䢢11AJJxOuGh+E"6"Z~OTDED{NQi@bX-y=Ƚxk$} [hqT <>(UG  >gݵ+,,)mٷfV\owTa=ZL_k޽zӟ` >'' ڵ[lknҕ Bdl%R[ȿ H)jȮe3pe0xOOe@ZUrlpx 1Hh-/wv:].>'+eeEEQQFo@@G:j\fm\wCCJʈӦl-[R*m7M6yfefgge}Ղ/T!CLF[@@+(%1?ّ@G*X?`IDg,Io Wr!%m?|4-^Q_}婧.7 xժ7{{aCLn۲ocvNyšC;w.^gCl*Z#;_PSoL+jx{2OZh_{ #M|M.x%*4ek<aNC2" +0xOSY% s)9w6^k<𗄅ho9}tq?DDіiÑ<`Hڦmj7*>f͹~ԩӆƞ(gcǑ#y'Nw?U{yϿ0O'[,=??W_baAaaƉqҢvQt?QtΜ5IvuǎȈ@p!(3Hb$Djs(HƊ[6-YV6!#ARk vPV<<}\O9qd6Zno۾ Өo/hԨQ^i6.ۺرۿ] 3oQ[hNtz6;xĉ1vUtf>sOUTTTj4.ob}.eˡ"a<0;:r)*xΥINK mvfeZ]R'Q"4wŕU 3O?mĈ>cMñ{ׁGfexhnmٷgXVfΜ2e |/ҫ>ܐ!iCG6|'OUW^.}cb{2X.9(Tu~\Z"Lfsƞc4TIrEk 9w/LI(gtncϞݻv>^^"CB=@pPTϸ8y.۲ZGh| ׯ_W,_Zkkf)S9zIvF_(Q t9,љk)K#*\~rdD'TpH-nʞ^"BBE%-)MtB1thJJ||K+}ӧ ַ}sRR"#oǪ~xX?x֏\|,U{"r03@g"a<0;o9lI/ ׫\N(PDL$M%6T2Ʌ _U5ڢ zGyjU*U* 儂5a0KK+a~QEraKҖG0!~A]?"t;""JrX,RZVZZZVU)*HM"&ly3Q|pJ.t]F+ ].)ӨEE?rYGHN+B@in<OPTD"Z{TZ Q]#.Ϩ~xZLIS'Eq 5|IWDHs(PLP> py!Uݜ˭䒯9&B>{dAD~ sc!MF|?in< G.stߋ'X/=RƦ맰H9^9"~HZ"o/\IIo!0g)ny?Ӛk׾3ϼFmF=Ou~ںodׅ9^^3rIL3z կK_n򒒢"kĘ)S&O5'^ʗ\\tE.Y(; lh+<|3g^i o}w]hH!:,Tō}Ndxh6Yo~u+O}萐=kOVJ_z_ßVCC2df;oϛc6{F^:xpoNWU?v:}2\(_&"8!!1AA̙3sfyE}۽byz _|?}e+WqhRRǎ5h<צoݺsǼy;CXE+PI⛸zbӕa<zu4bX-"Ij$-?\ 6Tķ?IkFW*K~bbN*,ܳUfV(wu]o6>xbV.\0mM7=Y,Z{L4~s]w=ۭ{׸|މƍ9¥-樘˃ucB򑈣h4|tɷߦ 7bz 5ϜNK;r_h]&7ݦWTH/q[8tHZ/9vUV̽q9s&w\4DW+Pnhٴڬ}ƌIK:jU*Ug70Acffvpeߦۨ*([=ޯi46ېsX~~QVpX"ZY". -ɮ]G,,:txΞsV5%;]v8".NgLltZE-.)ϻRB__o_?Cc(]6XK]X#i%5X4 zw1iҸqj"jn/y-8$8(維7ᚩӪk[F1էN,(MMMuUYAњDٶV[RV\\Pg6LUU2}9YǏ{z<89oINsۭ5͙_\&ZeC4V*ҒoTTԚL^^.yܖ}[>ʊJASKtI{%j\fm\wCCJʈӦ=3}^v&LQXX]V믽0ݻwܶ}ν{_{wϯܻWEr:~YTdY+}CoiΜ믏OK[tÆ~O>~5w.6SCe)i_մ'z[tvtfMS[AV۲omkjmʪ3۷wzeZ3r_)CR!i7G1;С;/zֺǧqoGjkj飏,Xp-[VJܻ4r7"yr:Ř^ZlGU7vʔ3 Ν1㪫ƍs8Q]SXtx{e 4LA"t;N{x7,+)(  =>3O4?|go Ç5iժT +۰af(*3 \-zloSW??ګ/4rȫnj5M=֥.:Ӝ>S0e#@-LDD%/%-V]䓅 >щ.rTWV݋ NlhhА@R|c|##C}&ruij` q)ᄏh nذߵroeԡCNVmq~A g?jt۷_“EE9=z>p& =_?'%m^2e"E\x뉓j;o;yϿoz댙c'R |o;IDATre_W_ju\\llș3sOT^~Mݖ}ez}ttbգ,Yfff3,7}i `˼# "8HDDّ++Ds'][𗄅hw=ɯN>]^"~ǎ#Grjk OHO/(pw~_Z{yϿ0OZ,=??W&8gG%^j49ooLLH٬X,=9׏:uڐs19%Ngx#G6mڼj)-S(|z,#Tמ)Dr )&6E.\g\x ?}D  ݭO[ZO;f֬3jic%&$G"eB2Fbtj%!Ov1"xp{J_X$QbcEHHHpHH-,+]O mvP5*)),tԨW5ͷ˶n;vlo+<oj4-DܰqϞGO8ko3-&_OBEna) ڽ{ŋ׭K_qgwN[ʫcGT~u;XR@9r$##7w'MJM7.nmCNxѦMKX+!a࠼ҺիVZd괴:]9Geݞ\Ri9tK呑+LU g)y9$rٮ)B!u f4CJ-dX$e"#%R8@M ;w?)ܑw}0`QW?Nسw&OZiztvztZZ~MG= {,z ڇݛURj AQQ5kn0('39Zxw+؝QPPRР3rny1cGdgc]{mLG:]iӛo{~1c&M L&,Wn?y`ѣVkt3 R*/OKf>|(#ሉ={ȐVziq2@2.n(:GOtjԾ>_*`6Uj`wWJۏ[QW_Q^Qa*>FCwuKjTWjt Z{u:OU* Ç2j>6:z%~utb[#nvָ]z}pVӑ=nZшn.WMmuumo{y/;VHr8*ʫE^&3:ltP]YuةJeL#+<<8ky.g*]v:Ͼ(,ڱm<MHdTA.WVΝv.v.U3*wD2;{rrsWp:  ڹOh4M&ر-W78`JK3۽T('>AYt|KK7n7P(&N92!!(H8vl+֯/+9ےͯT6rle߾\35&.P4^򴚤Ӈ l2dҔi7Nz[o6yʘ17^ʌm[Wܶ l?6\(Pj]{iGT(l޿u22T*OO)4$66%ede@۹@Y!x}&M1\;rxݺ/ܶF 5x?]95Zcorժz{ǏѯrzR=3㯿@⯖-߱}>߹#.n9sf_->;@2.` t)qU">!>eVD_7=S&Ox9^?lꔻO^*Wz{mO0evy%;@Pȵ&;Z2P _!QlvMiu+mV VDwNC/BVNr\;O%! _"0Db4rD )9yJtG\DȹDFDk'Ov7;.(P~\-b)rJ$=#E}jG DXDta"JܒZ{Ȯf0Ew h/$\iI hg\UIENDB`gsequencer-3.1.3/docs/images/ags_export_window.png0000644000175000017500000016566013607210263017263 00000000000000PNG  IHDR=<bzTXtRaw profile type exifxuSq L:HY?Z$~Շ$ZҬ1$K@>x˶d(@]n˱=E􇈦 ]fWrԷӾM;HT[E'@[ISNQԜˍ(9~TW\xם# RIFBX1s0VCgXq9N˦lFI nڐT`#jg6sno#@rݏ˖CxP +X#v#\=ֹ:v!+6y9c+=,MiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later 1 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\Wқ)QA$ޛ\].$&.1bC# E"]z }o'4}̛7oo{3(M (]96?hJT#>IaTWRϡtQD2 F)(aB75">c|QSc,/ טFTLCDkd[˟-p. -pېV_[{_q'lB6lX>8ʊD23ȨBCcc,1lƗp+8fȠI"oļDR#AL<}M]CƮNz?*~/cQ4ķM(]2@ 3^/4;Kyzrr0Ѯ缷hyL Y$$BihDssr9oatb<,џh(U99yad4_=F2mV"T1us??n,OISJJutr[(ctb DJgD603.7N'ni-.-:W_+4ܚg2gbTMM=TY14-~sWZn~-je%Cߛ%njL=ĭgbW\Ѿ}wV|E"sN}ܲƞD25g 0FR{zϟ7jmL kk[;Ϡy>B0?3Y1 P) ?קV{88m:H{Jm&>#vm` {qTꚤcv$75wr9F:RYYQ^UU_- e561B9/d|c,Q 99E:r9f88ZYTv^d}/ xw\<n:jf*xNlj'hC P~!£џ~.BȈѐ %V(-6KJKLjkQ*(Sk_0Ym-3Nwv(wݵfMp[e}{ ̌B7f2++33 m5̵ LX5DS$*L1\t 0Π30LVzZ+gf6t+Vݵ&,L(@!u&J@AhtjDK{[[пmMm ;>ˋca8 vss?2,W jdV lѥ˰!Ø, ._X6J&Bk^oxzzΞ-.ѨT&Ĕf0ɔa`oO[kau;;ew]ʷPPg&: ytjI="BE7^I# ѲFpT򿺡\h"3l Fz;}53rNV,'LnN1w_(nt9LYBQ6K'~Kt E]}^^~>aUP 6-Zd/BFv*UZZTce*G hjkaA_oIqfFVZ`6ԷTjoHH?oB7kw.ں's=}=e>>˖yyh-yygkEFچ۰n]ttv:woɺPss^^aaKk{*,*Nh5 x tR9llSӈG&ؕM::-޸qYt:ZL.Gm6 `-kϫR5Lv].I`DE߰K6DK")̽%+ʠ]dóu1{qGJt\aa{+ T`^=ׯqv21}}+F y_%HjtT9Z]<}`r[ B;w4WU+Q #F7<|#os#oYyF1f{<*%,33Yq;ZuZ&bWժA0z /55'?|yYN &!!$uZX&-"d2T"AmB°PWk4ꮮNqo^N&774 ˜,wϐ`+Kv`@"J1{AT`PyEC鴎ayCtY^.",óR5t9 A qãcpK) PWьw^{bû3 KΕJRR|s 2 fXRad='noo#ڳh47dzFOD.|>#NoLUP(&l8gnL4B%B7Pod8 2Zi*Z!5JEsSA榱PczY[͛7?cVY١Īϔ3{vxZь~鞎ZF Ph,uI:(.bJ"D-et@#S8 *Dhר҉vK/aBVYvu$w`5\ӷ.2yKkIټsM ã'FZழ.ZJPY~2P~C]~2|_FR ܅%OoL?Of{tuDn;LPȚ(!p&C^LhR2iOGQHJC{uQz{z5j\ tqutᙙgX? %Kd=W4TU % Eo_[kg\~dg-DXt.q5EOBkokklfRx003~K-p#D{8^S%H>o-V<~qc:;bjyKO+.j Kyxɻ;%/8g⊋E˗ϝke|U.kj8}`<:B*]0m2^4 WP[Q{[f|\S`KZRݵt_=hYMi&7Sݕw6/YZqNNqq؏u߼SYPG4wwʆJFRRAxì<=mEY]Ci\_{:L] Nwv7/ ܘ%C̞_j/ԍ, ;5l9'[^dzX x:͡Ө|_yf[X RR H$r^`ZX98:ڋll8s'T(jՑ|>Z;:s-%u==RIWW_b.YMOOMMEyklÄv>A!$TTj\fu"g*UD#K+0ND2RV) pŶsq(vx_3S4$|P-/kiF5prusQhMv60'ez=ҒAmo\iSYKP=gى% J gXlk{e f}}]}_ɟknIdaNO=,T/KHTVJ% qGHJChE[؊,XzŶ®f\ogl,!t0q@Js|<`eɵppd%(EEnv[d&&L&F1BϔGçQ _S t7knb91.N*E"&ܜ53QV;F30XqѽfgvdwO>zo33DL^XJE(`(Ţݣ|D+Z= maaiibnh*TR'SS6@eC ; 4LdɭH׈F33CCxGJ$mBԔFh uF&h, ct:Sd33ss4BmxXb@!d2sry?ntNWLSpdd3%NU*e2tִB9a|JԪp\o:eR wstQ ==Y qNn]&Db1R4%Pz{+1B14BHz{/s4u_i鬙s:}`*nzTp:.TpG0EpЦ^{=z^48ׇ:0ChǢ3t@ @ @nk<7jkG%F72@^f`8qJF[ؠQlQ0m\JKFJ-lldfҭt{~?v~%Y7/Y7f 鎪-/JBȎ "h#t~5 0Qzhr F(ALŸ+/@.hB728" P2{FDg+1Fw _D32 kks/^&>ߟgMt]iju6oy%KlԑP*k/>/)<\VTV>RtWQ-BkxU7.\L]ùg7~Kw{=X`1j R$=}۶H {t۶(׷ ყO75wvd Ө/koq)c'ggUT T Kݺ@k c&t3??8WEEsKW\N/bS_Njmz%MW=Ohwb8v]Ɔy55mm*mc6/xٲ5w/]mɥP.c,&qgdJmW Xȑ‚n_^}m&cr-Vx%"t#>I7"~Ԉhu;etyv߽(]]NmkOIOwhTs/[ ݻ?>4Dڽ"o/+cI{KO}X4JUpt={FB_o81C$2\Wp8.65uv0t:vxѶ%lǧ;8>0p%ǛT]gN&g @0պb6zC}df}W_92$d=8;Y[=. 23pi՚?N|;O \ǒojT([K>3'**zҥh?bRy30MtTiϟO>il𽽃D\nm_| JDЍʨhtFnD9$+*:~dXzk[ja>rrssva{'ss,ó6q 9~|s|{!7oV{21^P[NiIѤ:+/?DlpQ+lMMio-㏏.>~~߶mMMQWc]qBPQqs۰a݆Y#yyx̞=[J&?wxҩvpٲ:zh]O& >#<Սݻccl‰cS-!FR]]Vx %'ɇ'}DGvcJ8htg/b\+=(dtXnjЍlE1."2 7YgF*)ٿ_ϝ35]g^xq {Q_ut\0%wƆ<_0fШ:]ww{[g*B3Nn"[|&;3U|^V.c u5>4Ld7{vD6`ӷvv\:N;:ۑ)^)c7ؾf$J\*͌`h4EŧRJIJHHgGƌ-2 d4:a EOO]]nC32Z۔JW=F]Nvyv"Q|"^A;&H%#6J1XУil{UA[^z啋y22QM DPMĨ8nCOE[rpBBqq^sכ.Ѡ-phw$4iju'xmP;HK+JlFģf`&D!blz^d4lDf`&#Zgt8 j JăA̧5"^IաD|71p nEZ8 ĭ Pp8[ p8B-gRR[;<+hr8ԩr+*2 ΎN9% nbIkm9} q&uΜ-pAwwM17sJ3>C$c^45feԴKz93,l媻FFq-IGSRֶT,7kVkݍcFO+-MN>r8-Q,Fs8g'_߅VZ߆7VZUPtӧ˛;;e2 ͍iW>ɫ]ǎ>QV5<`X[̝x5h߾F E, tvaK8V[d rv63 5ֶ䓟d{bbsEPqq11\|vVQqwFcjn(C,X}=)iAtQvvz}]]z]]vPB=ҥa)x55hͭ5X<~C(?'GM WVJ慇GDD3'SN,-!{z:}WwF(g]hѼfWl'g?Y<=f_$pf*7W *+tk2"0F*,DGoC " mhIxG;o8,ټGbZ[]8zy9x J%Vh :w.pW^{х,ɊKMio- tm;njŁdXzk[ja>Rj77C|vL]tWL̅rp%BK. ʂ+ٚ+h>sKs5V2ٛo~ٳgs[E. EE:TSmeb{% ؜9vIC0-YqJ<,_R2&zf3LASLh+HJbXtAff& 'ZixX&ZP_yAu 4DHf~~ --Zq h*ZאPeN2Lyr4Ņhԣh4I ==p]`2 C%YcdАL6rku%UU*[XXH?wKPZsJn0ob )]BPd|~r@RLy\%ÔaB.8Ty52ٌcjbLJjVx0m/|0qi1 0\Z  Ā=Z]^U_^ZS;0 #臝NK#[Z̭erIDR0sO J5h8">\0DaFc8K_:2/2Å`D25ut"Fad2dV+HѼq#%cHWn]T(Xߎ[yؤնLO>IM(!+W.Yr+k.\/(w9x!q JE74CA\ocb%[l<7*L'g7w{;АҦ\˾1laaWVh pMddgf4^>/kZ^wIu "S:: rsU*؉ V{z #ǯ\>gP`eifdR(^2/ $Y' Gl0JYDf|&C.?wСJLM <3&!ܺЅfg'O?=g~ׯ\`YV$RoOccMMK bExBzIE6 볳 pwy_" )ҪLC==BaX)0Ff 41Օ9]XX_G&GF{C\9{9gt7'1W@+S[WZSZ48hb럐fgҙGD -!~|JTVVXv6,,mln?cDP,33gsDRYYVB8 3glY.tFowMuQQ^^Nٳ%% 8.E-X#uuUhtzvjGG'|~jnx_y|lzZx߾'(TU;w>}_{v+7o^y{<<$G9cs=sM Z][k^ޑ#TkFm4#nSୣ㷽/n~䑯R u[om{O6/?2|ogG<,~|Yܵ7mz0MknILѣC11篿<|^8vP&[o둣u7>,k?Nok۷?Gvw[55%rOXxq@{7mqk)=ƀ.T! m{'11)iϞ7Xj?P7gΥ E$??r+I# H8A0.ø\gW7kk l0nz}kۉaa>#sG9Gy x?jj.M=QlL>#hϞ {H4 ڊ233N斖7Ž*1]]VYx+K҅ҁʔÇRR׷*4W(ts [^^u_$AA :l< M흜9YjJVH&&\++k$sr63ۤ}Ɋl E1ȑԔN'e ]׺PW"ݟ}nVKy$leϣnP//.æCY[ߛ/n&۳}{Q6vO߳ϟmB&X\1T;kCHҥ\KHssRNLٵo0[ۋԑЭ'+k?NL/^:&q3 o|%\MmMG<: 37_KocٲW_ٹef.Oxk]ǒY_=7m\GNѩѠD[[Ja";Ҩ:ӫדH\.43Tƙ7K4_jfʳ -l@rB;[;[:97n|yfcMmɕyo Zۖ,9;Q(8..-I:TWge'xJG>hOunl1 /nBclyՂ55[_ڳя?ڶ ds'^x1<^dJ|H2itZ(&f0HRTTӗ(i # ޝi jB6dymIkio|Av ;yYg;}ᇿbPdɛoHܵkB:_~믟zd?_M`PSJu:}SV)jb,ފv=>m%DVwTT9s|EmmK[O|Q +:-lLJR8&,p;..-ͱ}rX(3ă{ǧŮ[${뭻vp Z>nʕo}O?՗oo9UW/TN,nmZwήF llip|930=~ў=%8z?-kV:S.9R(4ŢdCaxnБ^}ŝtwEFG=;@uڒJZh;wn@ "#l~~RRT^z{:9 yg {02M./)-,%nxLWp8\zG-o KW =A䚙2T*]zHlAijƆkzI3^}[<_α/?5#mjg\%ϞȨQ*ǚN[Z 6gͳ1#Mtv0K}W_垕J/>#)U?eqK.t9BF 9gRN;9G8>8RVVWӣѠ ׫սEŅtBx>>yyOno}}~O>ypYY^^^1| _;u˧;zZrڵQѳL氼9?߾oT$B2UÇ33N[RB&;߂UW(vᡝq-۴i6dʡCygT4H5F~R(. 'jK˾'y.:|MNF?x uoN=w bg?gпM|OoABe/\ Cv82fe8Ν{˯=}F*Uh+.ᥝ48xK.ǎo9vl;9Y& ]?t}e*@2ŕgC55 lxTꝼ܂E'5/ȑÇTw />  ի^}u;WAp˵%OfisO>bz~\??g{>8}PFFhK/-]j+ ZfBcא`C4TR_ xV/4tdߎ 0=lL>#ě/gD>{|Ѡ MߙO>G$c^45feԴKz93,l媻FFq-IGSRֶT,7kVkmZ]PpeeM]] ܹ^ϳ`0֖v1  ]c~H&lW7ww[! ;6<";SS So~8ÊG쯨o}y^EՂNږz/b0[ IDAT6Rp}%q̄BT[V*i1L(FZ&C $14uuP4ŅhPDNN ?_Ӎ2ѩ蝨ZV݃c k5ZNg0.Q7?Ʀ?N77Z‹Q|\#,+Kk)LNS\Zy$4t..Lևn~*/_n/zgBmONsBPdS2h6&&^)|p# 'E6-pd^"헠BA-@"ku9ҜCLAii=޽*Ŝ9ήvqxd>L:Ruz|x}nF gmfJֳ:pla^(q-._188 6--DC2W^ Ag1 E$K+[.]:)pu";G'v2nHdP`ιgT656ԋ;I@ko`LAL;!nWUχWa? ;8Xk[,^<ֺLMDv\qq`E?ޜB1%e=9[' >#LL((ilV`0q@-N;~2F.xԘFޖvRst kûl77wӦ>ؾ+ؾ}ۻ{z&&!!O>Gӏ>ںMW($~|x.zo[Vz&E88r-A u@!'';"(x8.VVedمGDs8 VUfdچϟqRiUu!0, MA0S UYi952af6нhi{[MZ܆'YYpꘘبT噙ss+%Dt҆Ƴg޷ɖVKnlߏk13!S[[Oaza;/?[Y1 Eo_k[[{gW_D,.:WQd윝-z|`pH3uN8fp$++337T4^6$(HIcTrpؠ9V;e{&x%3#TU䤝JM.+mkR<<\pBZr==C|0''==55=lniiCC?YX8:;3K~,\YWWZ{67SY{{/Eo qr8 9L-#ʪʮ.-884ښF0?tg>[Qсnh*+ʘk(hyV=g1o xֳf991CCڒܜsR}QoBy\;e{&aoG)*%,#%p8p=Q ̄u$7 (Fs6(<  Ҋhjp'DPֽh؈8AD lA %@gushFZJP'`4hd0\  Zn1f4h Q]:]Cķڲkky&g~ '&z{˖3)V^[V[q6o~DW=[m[.k-p`F>-pcA]8Ruu<՗?TRۧRX6~ $>^<0ȨyxLcjJNpW/ {Β+b3ҟ?CTVVKwt//4 56ULvSsf!qqUMM}}(blXL \k@mmffl\LLrRNvYY}CkkWHJQ(4k?3eH#B* B5bb$_ΛG&!>E#`w??~Nq;: rs;Ȉ7|~jBQb54Vqy4//;;UQu ~ƍ>>JT4zX&&:v48JutK<^gWmmUUS#b1bq<,VcSBK/Ʊ66˖}tc꣢Ϝ:y":032e"y Q\ի'1[7@TtDv{klww ,>.,,2ҥKn驨0,XںS'Nxݭ9{\RQ()Lf}cIIY)fgH"µ<)1 rp\FAksW{6#c8:߿w YuJT5U{ѣrg+)r3007!R+ X ޼t-͹s֮:UWG\lDx}99a##TUNnY6RTS9^zdH yѢ%K#i;:z5##;]QAY btT}=iodlbBpx"p$jhj1\H}}v=Z]yTS/ۆ pr4Qde?w/ ^ &#w HDDGgʔ_:~E^a݆+)r# AB(eM^^}m q8$lE2] 86>2ǣ - s gW4QZJ:{feU(YӦ՗k9?|Tm-uƍd7I r.b0N}CzjzzM-[vVu24PV%x4VX!*BUReyJ]%J&UT$&ǧ7522/3FNvxB`0rrZ**8|{[YYnn((x<*əJmiyVbi븺C^QԔJ!2bc۸\))%%---m%%IIvEE[;{{--P(AMM@ё hH]܂/IX Mѱ1j RRbcccR++;: HJJEE)#^kSS W##0_ gnIkYy~~FFJjJJ~~uUO)_ډ֊YZkk`u4u(6LF`:4''==%%--/RX\\~u0嗾tdY4996>6&;YRT^h隷9)7/۱Xmmyfqr*piC%ؠ`st 8ᐜ${؀7Lblvo`ۊ>h#9 8"p P& 6!|8G6f""6~dY؀O@>`Ö'#x|` xَ q2$ظOJ\pZD<>&lA#67 F a 8Gp~lHll'р}4@2@Ax@#D4 p Scp*~ܳq̋G?+Uv }7ꓓo8|ho]nݺm 2]T6Zyf>}@AvF6(,ukמ?SS 2gʕ**X@?cHJZZ꿏\ w|.ܦO 9l==GssEE,-Ljjr]\<--):$' {+B63x!'>7:>"p\ \SK:,W齘DZ~1XWUIaÒjz{ JTTZZb`=Y2֞ &&?Nohr //SSYȤ ?vo8l97茍=vt߾9e͝\^u/x=gQqϟut0"ZVӦ{yQf33>+,njCDUccMMbpKJ܏ɮok 55l̞⢦$$ǥUT64uw3h4ARNNC{4CC۷ܩBC#"2+ZZx</9FFxp fcSZڃk`>Q5USSmmdL{hjNOWIolde55-3c,VU?? kj2sWsGp#tu`z+ظ䤜첲֮.P45h~~gz{ː˝G'u kָSƋ7ػzӃ=x`d5{;]Vuҥho7lTT.][yOº\\<=g`0K##Rz{y< etkiML<thppc#1u4U[[UԈaX <=XZZQ)+l""\ngWEEjJTdd/@ 7(Q/its@*y4`kŽ=rî. ww'O&Ʀ'a I\ckÏ;r8<Ŵ>}r~Mio+* />ۋFعp5۾w۷lW\֎H_KK|I|QUsp$r(/OJ t emJG"2-߲_}pZn<3s11$RO- בq@ށ!*+*,9x{Y[ +zzFFOe.dayodl` '{O^(*wF""{P-ZϏ8"+u44{^ΪopwWTPVB"y޾Q+VSFĄB;TUb~=|Dٴy"棏$X[͝zؔÞ!J{BffVfmUMuh7k/! ߷˧p ի==([f``llj {`γgc|p?,NMm̝;εkkikvuuRXXRYF #?HJR&xz IDAT2/'Y-Xvm\N۵왴XP"[F|c) %.ND4"pNp*nMxg߃mw& o W|4)Kb`H$mmkkGGOOO/GG--IfDqq<~bDJKR444?8_uX( !f 0?Vue2[ZSR3jZ[`8l D^y|8b`BO݉`nqwvZ I`2[ 33 ?im% ;$˾O?hSus'=HӌS՗dEG=ܹ:gu% x<,XΎ.a,AJr!.:z0\l< AX !lvg{gWOfI s8}}}|!c9觧O:B =<p9/^BP32#=#U˃#oYuHV__SCY"Ghzk [U2p.<^]CGWE jhHI 4qymu' PSCEYB"JH˿#D1G46#f2؀łz^$,OSKGGEYNVJg*+32q8uu++%e4 dH4MRQQAgOf2dd (66qR*ej2fhtvvRk7n$}htooMmA~|*~˓{gOPBنp|LLSX,o''Y2 U^ʾt \ R_ ;t2褫KZ+jk(##??["QNVVVߟzcjDjl,*JLQ˧C `x$ğ;}cL,쁲䤰0\.b(mc?95ԩA'O~~^^VdY<,UKJhvZZbbxRv$Mr|D27WQlh(,LHW ʝZZVVĬ\FLQLOOuu^n\|t 9ʋW 1q 11yA~%]_Ԍ"'O!JéF"(Ty z6Ɂ, Ah4YF*KtSL[[}}YY~^VVZZjZbbbBJr^^eeG>gY8CC&[Xj눉wed&''%eeUTt#JJ/^/I=A?-#)%WIIIILLIˣW e{yrBOȐLFBŽY||zz{LuGtz*J Xa-44pֲԔꪞ11cS??[;QѲZ11K+{{mm!HhddjJ EYIqqtz{+%$CRTRQ_,77#=55#^[G:8:9S--ϊY,mWwcQ>|| D,÷奧'˫􈋛=yMߥF433 {/=))iTӧpMlo ))~j EZP4:+OCN]]LtاPԱ99))iiلJ67]GT|GɚZZQ^9v$ȿ#ZʞzF;6A,K t&'dg55KJHH(+K:;KJ kk(5LGgSCF @u lc9:pHNm=ls&1 6;[؀7 Wi>h_ƃ.8 08Z5Q _m|>7oqb`&L"@T69`&/,  8Glt_2<>0djGLpJl'66j ?oi6.z ={-E8y:4 6[+.awPp p "[M-l @ FK7!%_ I`s #&@|&7@kp6aM8VlHll'р}^k/D%{p8@@Ă;wNzq{p0-CNΞnӺ#?r$xgݺUZ,&N>}%KfLwqTU*,};~=7d xW/H >?d`-8ʧ1~JxDO\w~?f x7uwYx8jkR]}%Ahffd ZY[Y"?~DEny09)&imʙ̒gۯu3/ݶ^Dǎ$961j; HTP֬߷i64degg66IKYXXYiP+\0޻ }Ñ閐{֭ F!g޽g;^UyyC60&2~t1*2'FGFFSk,ݴio/5opUAAfM|޹sM`eec~9]]bb**>>ڶo~lRҁHdy3fON\wSf}d\oF_yp0&vv/<޳G]z̬g55LаX֭\p8:ps[2>ҥ={lߌ+]byyǏ?b> SYY_ uSSid5].rryYxxBBQQuM{;%!C̜+I{1YM߻WIolde55-,on.+;\xʊԔv&KDBִ9ȈDDG+n9XT RPpq]b֭`ۼu<33 q+꣢Ϝ:rIK)S-Z/WOuh`̤Ig~ڵ/>{b4ۯd5{=v-~~:< 228||6޹uMaah;wvh5kǗ-;wظu{׼y{dfrӷ[0-hf0JJΟ_80pL5mѢ'ɕ_n݌˖]DQ\|%f1#,e둣նv!!7,b1SfWV޸jմiWWѼy[:|}_=e$@ٳ֖-vXcn\{ ݻowve_`ү+~5=]Bcժ>s‰\ftJ%F^].cRVztz~irp;%`z`a˖-]8BT:ɹsA""ǧxC%+(Ȑ J( dѲMC}99a##TUNnY6RTS9^zd$dRq띝-aɳuuFw(֢EG?ao&[YK׻qcꊌnUU/oKK2yڈD.^|[D\EDϞ}!Wttr!:rᬬ6ovTQ9#ghimAS7}{Ĺ13g:!!;qg>/55ݶ9BNTRggn+'eK{{#";r8=J].8$(h2 o9;~ &j@^AKS4|윸Ak{wׁklm'}xbI` Fu3ilLA!eogi'68!1%]?/JZ$ȌMKCpmm!op6˗Z|?8Q:<h  zy0hs_Lu&CA"9~>pƇbp\8 T<z{{_5p--mmCCLfV?{yRO&ϙ>I!Fdo젍^tyŋ.]Ɨq~e><^IvԅV}W_̳ Wy1,Ӌ">tuz8\rJbrKVVV\I"OM=ק<66)ipF۰q|ccoݺuشn>=,&CU!C4'O y3""`6+K a,Z3eah"I\H4D8000A"~uM8$$8ba1,.p*{gyy?5i +I[hp !J۲u&//y  >LX"x &`Js _.US%_&(^&DE% CCuРkxΎnH41bl9o]Z[~鼎֮.8%rrob0vv_.ع{֒Ԩ/8ˋ{nXLSzu;׵11߸P_(*WUaf6e?4kw;;4qi== ݝ4W_o,Vɳ/˗i6Xw Wy99U+|:^⪪NjbtW"# 7oRS˷,? ^*X^XIK{ܾ޾~XFzX񺻻zy\NV <$$. [}|_]3 c⋟xAs8 5HTccffj ztTdffguX,,&^w|::6NUU'OJ`^7b1ʼy¢fg߻ae%doਭj1&.nnfkg~jQH>¥p;+H==gsm߿oRc#6ٳ \.o1yR8K>]"cl!/_Røg&vqO11 ^pdxBbK E׿я"!Wkv g'++##MM11 Nˤ@+x"5!1::<,;KU?OK+x5u@@ 56a2+)-- ]]}}Eijll'ܒU[Eki* (O(!Q )ɕt!33A(^XQQTXUo6SҢ"DiSΜy}™3 h:+*;k+[-|~^Đ-2+*UV[c?|p(# IDAT_?/?U(,sɳg*+ Yg'o3<=p7fݼjUPЊK |͗U &+Ǐ߼dzyʕVcN*uzෛ.wwɒzR뛵 0WVc0KgeTӦ͞MBtug]m;~lժo7-X`oGUjrs qxw gG1 u]]M yž̙ !q8C9¢Sodz32VWȉ3u9CKJDE-,N34b+\c8:`?l{7Na "#zbn.,NjW~"6nvOU+ gן~ ?{&0Lh'E?9[Î! HBzg^G wtt|qj^¯&!o?@4{I}}ϟ<<_*P'j2S/?wࠖ΢E?y(}EFKL8w."' __gg}}j(.y0125Y&=j:ǃy}}yׯ=r>RCDdkRR?~Ԣ;g X윚rTt'l??//+k M,buvUKJhv~W|i|m*pAϖVZzsΝ-eK&ٓe8 7oV= KL};?WIIQ(np&&‘&(MEՌY^DL[y` *?qmpPRޥm[6lxq/IJ:8_׮cw?;w$$TT mlVr ,-HיԄܼ͐Cg?wzৃtiib'HI%iS}[R̙~:s={VF\^OwyԮ _tE78ڵ_~~JRRAAOigv,ᓻS.o18u˙3{"_8mKd$A&7oӦٳzu~a ! '78NHnޞ /\Hwrvtxq$;7w K+::#aD[;v22S)@Gpᡀ6[wuE6;7_||.,*\82ʕ&Z5 SLst?p8eNNzGEǺ " I5={N/}fmim~~TO$&fg cxx}A6tYZ|;0~/ts俞,ӕ H$Ua+/XŪ{cGSR/tu@ `t"{C8vk׆?GF_ A[Z~=&CK ժ.\Au08 Q >>dwlhlP _9f_9 X @X@äK@rj` 1`@ 4h@DMܸ [ol30^!@Q6Ö'#  8GN`0/'OJ( Ͽ%@LPCg@>hjja"@D )ˇM88G@k ln39 &@Y 6A WPɂM8eV 660/y2> #H793:%>Ob|}@<~HϓAA"pZEx @`64fd>[SӃ麹Ι`I H0 cp\nKkaa|Bq1mogj @^6i!;tVs/VbL罧5iݻ{adM` 22deCC'~~& L 866==4}ct #0ۤ˭)/*spqq63ȁ1;7ՅCH11cӗ/wPVFimgfF_~.*_n9stu~utbnBi5UB::zz-obbeef ?^秣cg+!z,X11ytzCCWK PdT]xyʒؑN 5;nB?p`r snT7茍=vt߾9e͝!""燡Ǣo~u7n …._fiFU%ƐTʊڎKBBҴ Csc=Ԅ>zUVV[`PȺM tu/ʆn&Hi[Zx{OahH"S\*y;v?꫃,11] F~իv]-.aS(NwooJ?p6`˖ZX xuuq11I9ee ]] #)EhjЬ66!ya0cǎ'LL֮ۻw|='yޤ']v}4Mi۽QMc _/~@05p55 m\.'.fޛc꣢O:y"qWnjbb5QQN:e5k\\)(ԛ_]x$ǎ=zb^=s)"BbHX]{SSmnnn3f89P]ß<~|#˗o<{țwwrZMRR:un[t J<^JJB\( vqǏ9KK'[;1Q99U22<~lb{ww$iG:l_t̙..(tGgqqӰC/]߲&ٓeKK+ʸ6),,*ljWQyddQZZXX^D_/]XRRVᨪ98p^::˓ß=@lٺmM[HKTTz:#QX(fgcQFFK|xy&udܿn? !1q1YM߻WIolde{ ssY6)/u?$?5c6E<6&=Ñ$P&N5YZ6a饥5!e͜9]GKRr"1b> SYY/8; OP756LNVLy+|G5~t3Yf8FrW.tՈȈb f^'E`a`HKSf|ЖLvv^|j82"d TT9ᩧD"wi{Q`$d 2$11^I>,3r,̷9D5Yx rIDR(_~hUq) x{ܻfnظt i$zz*o45{^fFA~GPA$jk^N?Q 232k<=jۗ5UhTBBaaAAU5 '3cifeYRiaaqq{ >{_AfT,Lձcvviizx̙-&_U$(觃3o޲n 8ɬ()/he%CN![^iwAQxh5Dєc=W԰ذ|#2 ?GCa4QV6804$lLF A|y@ |U!sz{ߝpA,,Lͥ \M e%xhHG? LI :[XPR0IRͮ?{V/9Y}}yATmƦ$ЫfDy2qqs5_kkc{>hh'n6:ڻwkjmmX /oB67wg} ƭO=9AEW;q8=}MJ:/}8Ύ%xfPұ'3:53w;NZX[KS]CTs’|| <<29\]._< @:c髨x ;~sts߼e }}(m߹ܶInn=*x~*,ZAaXUVvޝ5u{Β $a_".uA7vN;}ymefھ:vt:jg:K[(UA@6 Ⱦ_νRAEC32]O?ݻ/NR{?OYش}̓؁Wځ yg2f6kw6s8 cЙL!,Apuf zݣ$kQ~{a`l>?\fwkXFc۵/H( kں*gqyvlỷQu=‘]%!! '+Jeeo_D$QU!u z&P_}Uq#_ZU9%&z[1'b0];.^(7[}x{.גL~wɣS#*&!tp7g.e*[Tm𻻔DL&C|ADL[-[#Yi$d2MD5Ndr ukzyN?͎}~Q__TqB%~ymN`L2Fdžz!dcbs=q Q JF-1{)B;s9$vdhs٥mdhBlh@;6K1"GLԧLS&v!a'+rrUm6@56].(.b|o< NQFZ[g3q,6˳綵 |P`2^)/*liHAthin0744ѳW+:ZbXb??FQz3cg4&<|#0_?듢"9|ruU|}Q9ҥ3|^أkyzN *U& pKJ]E.TZjR~h n̵8)'G|l^R7>b"{GFʿ=>3ve2w`hm+(8{s]bQR·l?~fżs 6Khg(Ry7bxGGeeNŋ*x[%+d26{0y%5Yٗ/ Q11^^3myg(f [2WWr~~a+MMfHrjJ_xЛfUrI2f[ eeqbWHpk4l6:i6'LЧLc$:I%u3zk*/56e媸xZ}֬Y=@moOOW(T*xݺGYՕɄK G,`?pmmVfnnk+<,.. a!d2+uw_Yt1+3QJOUԨ emCO\hwUU}..+iF*:GG33/tw ӗ8qҬZNGuCjC~ē "1}d t*BK--=|)) R)WN NOGme,jK;q) $(IDAT?P{u^/7lz! '7hd9 ԈOE߽{yt^tfso_fdjw\MX]JٴS'/]hiAQur AGSoȳ"H[o}pjMx/^zú5a~ҫn4c Scc{:AeŲe/kSd%.Ԝu,ɼZt!1++>_, ؐyURk16VZ..vs~w,"5 LRp`)Dy"PO |T|*pBqn2@`i5ѭ(ZcxwqP#=OEx'1p`IstB 5'j02V55qTwB X$bP+q02 'aJS Fh}S~T$gwj; n),TYpV81++GIpXtx;7#B *p~ `Sp|眒q#jp3*,:n qQP{H]>S3/1&@f?̏SO?'N {Vׯgo~shj>wu'L_ήcGۉG)n( Y,XGDlذE"$UYPs45/xwa#w'L+Z8vK+-?nFd6uXY?@PM&g^ȺtpNJ>1*J&i4*o\UӉ\DdP+NS(&3NQj_Iٱ2Urvc#(MݥoQYf:GdCS'ϝkU9;oگ}vZ'%r''QSi;_X'FjMK3z!!Z[iQC]o(_ 3m^zjdjm-**.dН""MuuF:݁o3%ee= k!Kkl3mLRz fУ^\ `UM">oݲx<ƚmfhFFF5'NƍXYfKomf>KKfj*QKH;E1-dahEMwzދfu:p:چw\CS% p9rF0.? P"&a*^럈P ؅55dg^jno 3_Ⱥ A ?T L6eu-?d_FD/*,U ٱCB0_|DڙҲqfϋH/~:]҆G28XWHK4DZ-d]p/] kd?''NL}dϣvv! W  >sRT[jj{Y[u:?s_SP`6Y..>>Q;vlNg<=m-dYzo?j+cQ`LzSfY`\Y9jo02%᥷(0@QC- s85 3? F`LpigBt[ CܴP*]@܃d*+OO0|}WƆp]c0rGjlj! `q@>vfM,wv]|xጌƦ<=-KLܱ#994T ьƎ 87_˗_zi _=twدTJĻzWO=%7#ܹU_^ϲ #"7LLco-=gҎ^Pllvm`hdOvPfMV蕓EȲm0 |cNwz3ZZ-,KB!a4k1GU>iD|ɿ~"'Fd'p1T "Gp1FzXWzh0ȼfK"Xry\\xj5av12B!o6 ˹ `:BV6Fdžz!g_옘+ qժ)csyHDij?[^`̿7h vvl; 3Q= a$^6T-14&³wrHѱqPOk? :(89^~9)ILI&b6kF2 Lk+TZ]Zvu>^ Nqob;4488n9&S.HXc}vVvVJ:]cS~^QQw7"$`8^jv7'b:9ʬ\EMZ`X6T46ZSS\\sU"F3 .o~˖٩tFmٳNb:O"MګMUUڴZK zĉo>sE%$&=;8qԖ[[hV쬹yСj4v=d|HdLBb}..+bbج9&̤2Y%\04<6FY6yLXpp*"BĨ;l*->'O?Hh(- Hܤtz;}ZYb4d,puuf˚?ߵk+99Y9 Yf7~cc4h|_ro""'I$+W=[S% %\tLL6WH,[Mjg7`YGx…+**-,ˋǻʞ5p1aFYH[o}pjMx/^z啍E.(PB ެ d#²[iM\l&M=dd G-Im}ljG}+p:A0gstB 5'j0@V~rI _ pDP+q0@ 'JP1_F~{IENDB`gsequencer-3.1.3/docs/images/ags_audio_connection_output_bulk.png0000644000175000017500000015474513607210263022332 00000000000000PNG  IHDRҊdzTXtRaw profile type exifxuSmr )z=1f7F^^'eư|&#| ј&VE WLSQd$qP ljSsCSIP 贷˿M?iHMʭ `EXrAѦFR^m? `j66f1&w1,#\+_GG|UpAMfI7g`lvw(jVN j{0v9Oԇ$eWOV³+wo"/(|\ssxOoITz./R 3jdzTXtRaw profile type iptcx=JA0 >-9K)\ v:e򇻅:Zn:V{ WI\iTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later Y iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\?\! {ː 2ujwXwکjZmݠBETBdHȀ.)_Qq[.wyrA0m;0)|>=ۿAhFP>G0Dwv_[64Fg΢?8AӨ ڬ~hAC0GVd#?LX(g l 200g UU/ffVVj<^hht̄ ^^ :@}=[HGG}Ew:St;ե vNcJl^:L.)v)+7EŹyy::0}Bv!Q!8\UVHp@7X=jUNR$a SD-%yyyo kZZ$P ++g1cGpu07 Yta򼒒ZAsSkTՒ { ˵Ѱخ0&zddqW *::p8ss𐈑!!Nt:yh20;Zee]HܦRtwHHhdžBʩ'W&|۪𡳧\:]yijK1,&4liӂLɮ_?twPpgIL [aF#ܩ.,zzay]a H2`2,gwXn.t +lA/sL^Qy6#9鲒vV%HdNe2 DD餲 t3]#@$ZDT+@ kk njF4NzB^zKnGthQ)v*].'&fpYmEE)INC࠙l862E"i ng^h5wvN:eJp0.i+C8:Y[(2F d ia2)ޒEg]B ƈax|3"Ͽ5KO}Sڮpd ab[H*jtqc-@/jyyKѓ:gm4%qڴ \ NU(Z[ C JeuMnK [nh،3f`O ǎ؋қyʊܼ<4f!%+x، o'Z-f߳ TN`ǯox{,K{v_jnG5kDVTdrR=|PTAySvM*xNgg_/QU" KM?Y0i8wW s,Ip8"H04jMi8[2M4D&M}@ZL&V*z&Dߩ#KRBq1337z><z&=K Pi4*Ӈ 3rXZVޛ -u7MyqhJa2x5uJ`ZDRP]SRr3ΗHU9EE^^.N#y\[ ~gmƞεywzFS:::;5S;wMN%:}uLfj;UEEuB8EX;9;:Q:w*.<_]$ꦹĞVʘbgN/ҧ<_Xz^$BJ 17<<[xx` ;7Ut橓037 u:LڮRry̚r֬qcz[ww ىm}17'oUTXLG aD DzZZKK.O=q5_܆'Pi4)ECjIсJ,iiIK/+VgY9g+W23WVסR(T* yxYѓ<8x_/9SVV'lnHjޑss =*$eU4 :)a[.]\TT] jFo 43щcCh}7; 4) \ƥ7BqL֡P* L0Lgcn}A֓H\XRUU[(UX,ƴ۹yx?c JJQ m;FE KbEOhT*:L:V^04d;EHT*FѠ`aAr)R{chx<kOj#,- ϕRގ^ԟy@hE&k>Kk4jxhffT*.K_}ɦ55yKnP}UeK۷Zg~ۿ[Np^->gkמ8W_-\՟Hټy'3`:;&O^<-…7kD"œ }c̙C/ u#?o3m ("ڞӗtҪ;yyL!.Z-ݭSXxX2lYA;aafqvvyNYpP }O[2zTIJaٲ%9Y9sh4,BFCbV[Xӭlzq{VOMMGO=g x|֭s'N;}ںr*8㹄-Rnf>"<0ӊmmeŦf]~Yd:ƺ"F53PLH!S,-inAhfNÆyx0v wʕ+w++ֹ8Y]=2np 9))6 ?&^=>DRSOMܸi;Q66]q8?q㏻RHM)ti`ҽ\nd+ޞ2޲S--k+;;7Vkwr{?^ޞ,95UXAH$kG'Bnmʞū/n~ЋZx<iookKkfݟRQy-mĈp*UyE20}#E`@ddhթBkAz:e"XL+dryO[ֹTyquPT*e7*ggbuu 蜽L<;=:#Gwr#5;Al=]Zt:,B% COn* Laxia/h桾ry[k[Ri8ͩOvDV,98%Ͳdb0 :Dh[yuuhXvʃG LWu_qt :h5NJ`@&G "i*c">J=270.<+;.F#|qr!H29G GӐRٟzL*3?CkZg4pvSnܴ~C|uBW{S3*V^-IЁPX"d 99M NKdNTj4xD4DNݖq[ssHj VWۥueeŕUvÃwu5Mel $\rkyuuXiA'Ԛk.]|YxJ0݌Ʊe2ۥWfd9UZ*=3V.y~u߅2ߜGEu}8Aom-6LqnԨ1c<=} ]Ees*+,!!QQ+>/ly6J卢sNʺxTJ"43Qliu+/-"U12srj*c9Z4ZDj^U,N'Es.]*.s 2EnnOO=|$-zQk+ uLtN%\V*;z_8^-$LZ81ۛA7\ޑ='`p39-cRl6fI֖ƦZamm]]kkG[88{xXBaiTKKK!Z[†n@{kf;hAԂ$;;D͵;Uwjk9,TaNrv際Bָ DrD?eognv0q[spcjk_ɾyS;=tZ& Dkk_!4ZkKiIAAvvf99ee"8vܢE˗O`tȋ [ƷxkȐ .SY]]Xy44|TDX,ӓAz_. a]33OLO?PP;xyY=[#תo= LM={>p[W۟5<ꏗ-[>)IP| @Ai_ChS&߷sh/hK96 xURt#'F:cϖ)v3Ur9lm7cƤIAA66DijTkS!9ۖ[Q~˷o "REq8na'ϜDz㻞B!8wLkW˅wڔJΰus MHءCC+(uy~}W+*J w̘鉉v @>;;9g_SW',;Q)紈ǎ9s%oΜ9z .e|yRRE!oPj))_B5sy-_x#ZCy.gг?m,SJ?BYh{eKNMֺ8??7/b$+F֭ݹ+%%++.wDkJ,lŊLw//!jK˚5?ͩXa0C.hUxkǶ׬A|3-bml&Lxkpr@=qmgq<'wܸ>`18OZJU^Q|TyquPT*e7*ggbuu Ӡ"XL+drH\[Je{px1h*JT3l*VWV(/hl=LQ6Zdԛew D,My֮\y@">z4Ћ̉Iq2 rsܮilH ̐Ng[=ݳDKbaqjBѩV@ <  b^_Lߦ5z$B&#go7eM7Ojޢ6_}婓vĈ)Sbb2sB~}GRA4ɤzl17#Za.,ViHѪ,!rGusjR#S2 8>OZ&5[}%bEeg@Fkj.s:4>~Ԉ?_w7G-maA&hhzc(ʇ5Z!EwjHOOo'Ǟ|ULvrrsw .˨R=$Z{,g`dΞf+6ڈFO32 >LUlhDdaG8a¥m[O~VfҤ07w++ Enk571FyA\Bٳm%;9wv EϝKOs\22~ر};ō˱[[n:q-.K XGJ_ ,ַ XGO8oOR*"#slq֖ 'N\jk鬭EаbHadM=[-hF6-qN$'9sJ ji庹 B03{iF 5Ӧa:qԾ}Wb:uq ?~c=Ϡ'C$,>}_33R,Ғg;,O`mX{ѣLu}ǎo߶}[Iib_ʱcmR3̞zͪZt4++5=W :?gdĬY3g){v} =o6ӯD-hsG3Ȍ֊6'xSo% m|hFa0fb~ym2!- Ųԡ\Z^12 mu2#.xa l`0،h1@/a2R^6mB۟Waj:,]lfd:2x r`Ш42a`Tf5xh3dӛ.So7T@ l@SgK޽rW $c`%cyVrM={o GOZ{?kW9VZ$,A`Glz,9y;w$'_ϿyDrr  Yw, ZI,歃f[f#FΚbŊ̉ qqe2E~]~ժkwZޮJt ׋Μ9}UPzj4ZFQT.%KG'LMӧ:K,\e˕籿-xU=gK^/mmǍFTa{Xz\ֆޘMωK\:|!r၁|>'kO>at:-[{_߿50̴FF[̞`_>۲iӎYz ' !ZFR`Am97hQp j'OK.zյZX/ys8\iiZJZzYV 0P:iݹsuwjJ}NW/Yrq6y}jQmmG6lزZ@󟉉XV[^5lm$N[ap'rKK0ŋ6mZ0? BA:y2%N<̌-;wp65mMԘN{v%{vc0B@ҥ۶24L۩D͟l:l;7=kܩ͜m˭(?{۷H8ɓgΎcYJUߐ|3g *r2588.nƌIllD%fw?0A!=<0m7nBLxๅ-,Ǜ0w׭d>77o. aB d&ԋ#>Z}VQOLLeiF:;Hkl8Îm[mL;w $65  Fw<~TIJaٲ%9Y9sh4,BfYHU*Mrߏ ?~BT|1vSR~8uWZ-MKۺ/ժIoLl9õOJJڵ/ҷ…Chpnm}Zr8\.Añr ]],BP00^eoۼ.FY\i\`D:c[Ya 'vÖkǷ[[u^GCkⴿc#GY>jǂ%ćS]K,,ly<j$J%ŵEy _b\nd+ޞ2ޕkC)Ԗ5k~ܕS+;9bz}{{^Tay"FApwumܕ;qn'riDÑ!#J%s[ bG|;{;{ Bl8z}ɤ;;v0oog'Dzy>Ϸc1lmL.7EP,V*(QZR&R(*RԎ9;suu ![[}E")DE:jmCOSt-ѩRa J!CSީYЃ l 1a9==Ts;v9D"6aB\|\qLBX88C"HjukWB"Q(d2pvSnܴ~C| VUo33oo??GG vܜ"ъnnn[E.^t5w\70`/*t3f,X4qV[[[]SwEWi8OV4}'5[}%bEeg'tsuߝ;stggI鯿/>6z#k8/gK]ry˴PjQsE˗/InnaN?8[8q13-5/yV6JWzaf4in.+~7(kXѻ lS'LmoݪLneEmm&3<|( z\\]z'/}sQGҷ3Wt=O{~.)qqZ_f̈́i[Nhd%Ӳ򥌌CΝkiioP`4mg;eʻN:zBX7*js47?l*Վ?n7W2ýˢX{ѣLu}ǎo߶}[Iib_ʱc($wiWp"%9̙>xP*`TKK.-xXllP:ٰa]ͱ)5>?uJ& 0~={y/:B364ol6ӯD-hsG<1j]bf̋hK-[-0XQihA5x܍RDFP^Obd#/# x`psE[y~ߏ6i;ڠ2nLYM j l `<5 Ap@lAC;tzƹ*^.Sz kk3!i.b1 p4ԴҢT~7̌ͦp8 QI$Z_fdd#äGraD0hdeTc07*b7.N֮23;QUx&drtjLo$ lcua a UR(̼;8[XXRR^.*vvfϜbg<г9sիBJ۱+'O~Çٳ?qK?-\ xUAF\:|!r၁|> PAkc3*~)<ߟ#5&:6fHks&?wݛ`'@  J^`#GFvuAAxOճնLK?|85%/@`0x<ѣM??*͕B1M'R>uZePڪ\[ilĮ%2Y֥W3߭|'dxS^/>gkמ8W_-\Ǜ֯|kܩ͜m˭(?{۷H8ɓgΎcYtu'R6o޴1hMV>Ҟ~dɞ tm %aGy5TJ%:PLY2Y, *-lB3fDǰXz}FPUU_O&H]nj6-믿ر6wqqsĚi?ؼrƌի?(*?LMrߏ ?~BT|1vSR~8uWxkQ˖ݻg˖d&6Ï ѰX eS 'fܹCC  x$m#FY\i\` W2lM JnoLްcmmz>In^rRJJM5?5q㦕DEtMƍ?J#5FDҥϪr##X){;Ҳf͏ssjv|'G<ƚc44,*L֎oǷk^%:]c?ne_em7Nm -z[JԩWxT743ìA,,"#CXkWKKjZm`]; =@Bv,&--/-kV 8rt/tm9s?-鉇N{QS{ vaKZڔJCDS)vDV,98%Ͳdb0 ]dݚKW|_|1u=lx vC^ܽXvN7in,)&Liog1"aҨQmZ7۷nU*'M0 ƍ3pQ Z$6a,YtƤ# jƹ镕Z-pi p\;;-9qbfZj^16!m)v ?ЁW|\qFnnn^IDpjXpxIJ _l:-%'._oRI XXX[y{3tJR(4Y?86%JO߳'+Bvp]jƻ P)>>3f\9>ݻ 0:us ;61qtDGGRF,KQQߜ;=w_dgSvqjՔ)C!xyV{ٌy :{g%q8>o}B 4dv@W9أ ^ ZX\|]ct*  #Wmq'F66 md^D`Aa Aa ? +p[c:0-)d5a gb8gg /3dխƷI]Dn$=]*tu|/4bc%ԴISLAe@a~QLLX @Yx'%8:O l@k3[6Q3ڴFP^Smv|a2RY6 )FP^72Eh3\藆z5RP^78#!hK7 l t*ц"3iPA` 2&8=[`A г0g 2г[OKř۶Yw͛Z-7_\$%o)']~@RY,.ז;xy;z |ukn4yr_;z}g+IIW $c=%c<߽TykϞwN䟫WGO[a fz׳׷TTs :: F[+|hґÙUJ`PEEbm؈IxyzjoG|=Rc{?9?C{{{xuuhVCVi|׫Ix?oHM۲K1W}l/?c0Pŋ!!x|ݵ\Frذ ?`dO2i.!'T;2gi=:]uuR'|YzZW.[v=_aRi~ ]Tpn]sXl:bp8.!GGY]۬6S޸~XAVr;){nի]Uj)):?&vs7/aRY__|…Ԕ :1lB3fDǰXz}FPUU_O&HD": ޺UV9?z Mj-iii;v|0׬]WS]T?r'D&&4rpy.Cʻ[`͘F-4hC wu~WXPX<1KU)[uZj{ 11s$$+P\y1ѣU mL~7R!11gX[Ј ly߯B*sYl D$jiAO]aK<_"..b˒BZ[+*.e<~r׮v`0 vhf柳\kЋ7ˊo N"yp$7/9)%ϟqw"|8~ظ])݈X4=2? pVx{{{'3!jK˚5?ͩX{ǒ5\)6^Lu r5k^kIII%7&o57|x9Ѕ ?Za[Rsk.h@)K &N?V=ro?j=[:ݺ Yh:;!и9!*ʦ[,')a-;鍵~;*ߟ7laǝ;ztWMEyJmΜYsbc¨WCyxq5 (fd*JAGa?~,-M(tr6}ÆYF3.مJmMKt)&;2y*MpG{7] zӃD$+-?^6Zk~ݻRRo/^?Bܐ M=2V`}?yV`k;5kvRs+fav:c|.V#aȰy{?d؃kmɒ6naGNzĈ;;u}pW]OPIͨHL:O@[\,`~Lv6fqRҎ={p(niHFYF5bDxXŮǴ c:U%g-wž Ϸc1\&]ՕU@YѸy9bĽk=k˷BRI{LpΒ`syz« $"`UwʻZyEc#ȶbYt׮_Z]ur#<<4$?TIC&syv|kw<|;5-bbC֩)TڵGTU7jŅBQݨT87674p8ÆشKo(,S ͂r3!耠JUQ.CBLƍ E_镕ewYbT*Ƭ{x_k$! +kJ{:bL\SY5BN ϟKNޱGZ 0}Md B.Hj2@S?  B8@Pb.vWk{}NguW'ި9EѺSܑsosNnj )AAW^p=1RXt?HVXQXPR\S۫8 JjFeK*imJl)*+q#|fLԙ2IԤ[Zk4fɋy^9uÇ?~''Ȩ١zcݞ0f (; M4<,kFhI`%6ozz::Ӧ˩TS_@ꚅ lmmHhk+n"ymB(z yd%){Ƶj{r7o/_[1.\H9>%;BaYYm]{! #f`8U+HIZ! [9CC+VK秥?|x[I$nX.*JO&݌"QWwg'_yEBؕ~@1@\=r&dU0di4b C}}kI]}/>'S.ȲYFFz2yfֶ6'lI599y]]FFosÆEHHz.]݉[ڼҺ1#lLU'f+kkz'%:]_!,tRs>~CciiA~zSǏ8?[^="Ԅ|Gw(l5NO++-rqIPb:bܷ׿\뷸7nQ8F>Vǎ'&-XhikSD-2 ŊwzW{LO\&z+Jjݮ<_L4A^ѭlq}_mz48oެY04W1te_SZW/R[Uk|Rb0tuyӧ/]SVRi}}MmS#v`m-yjEs gkjVF_UTdd꺸$*hjij2RYKk}]spGƝnmm@ֹRUW\.V\^ eI2YEYjjzDnCPXQ]KyzΙhQp%HGG]NPDR]Zz^r%O_͝gAvv >eemg3ҪS%ԊWפDHx5:fnnX9s%O&ohoi +Gk  ml,-hԪꡡu}UhgWv&^TXWYil?:>(4{9ZUT[wuDUimm:NN..÷%t ;]rst*uxʒjjp[ _XVvfou0;Jq={޼)Sl-y&n07Ѳ%9sgV&lei7`kiL)V֤JM:w^HȹmnKp޼pwBio+*:}ȑs:OvtH8o`{]zL1=55y9gNWV*Tw ulZZAAUUg'giio0i#d՚Ξ=g1k֣N| &H;9khtw:UQIx!{|ժ \]tuxq8vvzzSRȍ';;iTKImer#CTmmFW3gNNI.*S[;:QN._jiQg;NddP~>gw2OK{\y첲:MM`GG]q\&oo/*:{&'6d)667&&6=4//33--#̭C.776ܼX8"OTN_wiijjbRbBnNK%Í`;NֆUPR=R[G -EG')cSI6.bqхݻׯ񇞞9s7m~!wJyR"IAmݥVFI"-EpЊ%b6XB\ҁEd ZK(2?'  |nF#R+5|U&cn6W B l$*Ų0A@؂C՗0P'3YLRPpR@ F("EZS.)@ T)-#PIx0Lr͸\{;RP'pДF a a .1[pߐ)ȗ* HAǛ;7['O~ɚO>Gi}}Qţ6AArv^{_|4a%54G۷_`fj[KJ%Y'eɒ_xёNG1[@E'ʒ&O~Uc zSOOJ/+C"9iْ곲&9S^-2zv΍}$:ӓc` Oߟr~˖7yCU[~k|;:Nw9z䥗>'.[9=С}{Ϝ)(nj m(TZ'ڦ͉ 66G=42_=/N˭lhtu޳Ν;ɘI.wXVfYY}}{ gf8}5ndbqWWqɩӻw{>C$41q2yecb<< ֶ(wAt̲܊3gR::8iD-{t~^eUs@nllgty&L]y%%/y{Z#K_'0ёBՅKHg p9a64^TV"YN6gP## ,%9.x7lwޙ?ߒv:%EںcǾO5+&zʹtt E?v.O&35<82Ç#bbV%ԤWV.]nϚeƽkJ[Z~Ǜ93:zҨنrygGm]"^XLL֖yaas^,7?6vfftzgDž 'OQYc=g JRFd0 33wܵKWoނ)Sy<&/l‰JE`\Lԩs'&lvĶ.ΝebJwu&;z49K&36_ky!!mۺ/y=8 #G%EOvt h4 QQv<|hW~+/1ՕcLYYYRRS`x{/\B00P~Ѿd --_y! Ot闟ՖJJ/Ǜ/6ɘF5vdҶm?p}rdO v~G39m &EPG')8 a a a g c2&R:I*fS)椨Ç-۬R[ 5`S}+bA!)}@ @ZI SPW? J.+!l1$$ćDIu(:{z྇pRC=-[pߓ+a a :Fв۲%Fe5W>O$nip\ӗߑC^aa3y챨(ԩڿ/.]:yRCCSfQQ>AWpɣGܱ}.6w^~9$h[SV[|_uEDD^,*JSS 8yDw}aUՒoWù,C`~ZZ~^~^:;99t| LӫܜI̺@ږղ_JJ]]dL&*jbOߕ {?{$vIH%o̥mK.J[kYtih0cirSOͰӇc^__vqq Kb7n|ѩS&ll54z7o񧸸gGFDp_1fj:cƪ5̛ga>], ' <\\,q?H6uL#C VYYr gg061;/0eO{y66F으ʪ%KUq̷(7B]gY,7=kpÖD"V 99%5Q*FT?( !?it*UdX,^#dA~i~j99 7cڵ`: /f166Bi4s kk."pY*I$^%2qMu*- 舢mj5֢PJ CePX^NJ"w\4 x]5m/@CÂ҆FΖNYMt61=-/zb%jjr9jkiy{?=! .Z `-l \}I犋݈rLvYGt8Nt#>,DMPKKu`CQ(CˡѸf'O$'.Zdogk38xB^^eOt(;W[X-OwNdÿg.4ל6{kobb+۟ZX̝ޚ=kz.22woGk}_3J,Xwe~i岲iR8F>Vǎ'&-Xhik˭00 cx4[|A? p'Tcδi L76JI9x !Iuu'K )++-ztݢnmc3P*j+#UUegh;9qG$*@' Ά/*ϻtjSf l"Fm]DYYϜ;[CԩC;;U~P\nWwB}$%UU7665ge9RVYק50z)CS Nfmy\nE?~%<,iu<=<_Q51 Mоt#ү[?|O̜Yl ?~BO`1mm{Y+11)?Pl}}[[oO/2g 27/ZGTh,yW^56>t_iiOkj X;8DzUBZkk]]\\+gmsoԯLꡎNR,y^v4)Ӧx8'%"]uz$'e {N{ lA pe c 5RJL%Cb-;̜RL4ؤflB)ʱȵ\RP'pGڐRZFJD 5`c2 &q{P'pGiN;R a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a `LvRJqU)ДP3[UYE C)T*~BRT5ioG jaZI SPRTxЕ\]HWB@غ̐:oDIu(:x8`bDƽfj\ p^ؒcdsV^g6o>rA*\%]ڵ6/!N70rpPEB+LgZ@غi7:HI+p㕮&vtt 0Y$<STϡѨT eђidW.{"b}))uuQ'3 n~rK՝-$lyxZZL&..~PgJJb[nr[t=<=Jzii)▧5$nGϚ5x$nv8Q_gj:ow~V3\]=!KSz|N`Gg"+lJp 45ttut#G>(&fWHkrr Y[ZWΥ;1qW78jݚ6s&Lj#&C]FH:zH,4п<6]mSTO-P"[2&qHQ+[_꘥B뻺,(Ժ:eVpa,l,(s5bk-!s+ȴmNIeh4#7#Wdgx{{x-.\Gtv34R '%'}3l߲E$6ɘN)/O=#q8ȴ=l-}df~ȑя|DⲲB>_WÒwEZ9f9vɂ|Һ:=4ЀJ`;;ƾ/q;z,=_Ȑu̜&OYdb&SG^jYRBIQ=IJҴ&"<)ᤠ6Tuz$)ܲ!lA4T3fCS uDJ,&) ˘R@TxE(՚rIA l]ֆ2R $J`2 &qvN.jPrPBeAQ[504" l l<PQ}g[;)=ݤȔP3.)I*a?'p-xՓPcjaW*@jO䑂OࡣmSڕP35%GR:8b?~n~r} LIP'vTHI~ON'7mJx$wwjjzz ~wjjڳٙcmtx~3-?_W'QD$dC9:sV5z?l@]e`UV*5\. ET*C8ka oz2H뗭ZJܹ3xM֭W|$cM ̡_&=9]>SSC]ŒJr*U"%3(>D?uwۿo_W׎ovpsR017Nܢ5}Pdz=--7m|4313m߱1ǘZ_ gjkN,VWX6&z&wO77O={PWp} ]vhj?_TTߐTXXߐp6?܆FEc1\NZZ[?OfE|[ŧ_|1z*O>$r7׽>-dڴW>R$o@"l<:'ƺCc?s~hP"֖6Kj ƒ[Y{(,qs*u,fD ٿʽkCBX,npPd5u} IDATe11R~ʭON57:m4bpHA&lnzW_ Zbrue~~~QQQ-MonFYZObEOLV_#7xUmmEE-]˗,Xpǔ޾|eH\x7"#MM1RiIow3fWfaxZAHx:|$=!'[(TEQWjR-m^T]JFooBQk[хgΧ畕54 rkZpHM&ohPPOz[0onnΧ|)1ٓhedhccc+wvtvPHP(,I[Qo2Y.;\bRbvKMM|PHihsxgKW7Y*ڡȖ,..Hd򾾾^c:s>3\FiiniVm~~v}p?Ïnty&G}՟ Nt㏯\3gz\P_ՉglM49$GTT|,^qcM`FF{H\Y9yO&&]ط`4;I^^7ٙQXPנܳsuu}Ο.^,-,rv#R>4VWm{eO=0{^`iR!zU[]=k~呿T'R#"׽r匰_L|o_{v\So_20p&a111+O[۷^rse26Tus2lT55_];﫪4i__ft s9[lܴqc^.X~z _ůBBVY"'ݎrjeye\\]]ݒ?O->Uvttt^kV{GR?ylʕY|Ts36R{%-x`D|u/O7(.:z؄Ŵb+\A3 wF,$;;+FWsWGGsμܼ֨HS{3q+n7ip{#/^=;$ĤRW?׭[F)2E~fiiihXY2UpmiEE'OҜ6W/0(N׬MM[YO=[[{?w,'oƌkkG"56=wtN*2g}.*gdޫŝO45V<+,S9GtP(bX,(VLܢF7}Ooik۫^}.\8v#%%3ʕSqI(_A;.!l5 }nK/555_z)$rŊM|~yEan[oe>cT5)G.uv^6Ekjܺdmr]Xyz:ثCVk[dIɤ+TZQM~~hp'*OHNxS,r΋]줫32L{9%a-/+W0o9~Zᄏw/_l杹['c23ⲳy$fN4-m 6$mA{{I+]2{UD*xɃrACOup^xŊp;953 7*jɒs}|N;q?p!mY 7_͎ҲٳOfO w~SXKB|K"R~U[+jvIISSVH80@hѳoҪHZYzz>$jegG76緷=vK.KMݽkΜ:u֬e˞zrʘWW5zi_}O~L{5!0а(7\$ry䖕Q'ީulvŋI%%=W_*noT!j}%i"?UᥲTF>8r40D`2#GF`FZW>ckt:gmma{=O8T[vhhD?ܪMd^-SWKneXYYd rYOoOLV@qz::jK/Y}'^[U( o[$jl.../JLYW&zo/ vMmM||]#޴? aee,Nwo]!f ,UST7k e255FSKz Ud"CS:;QW']Ժ*=hi͸FFZW僃A\FHM0d Dؔ24hm6#kk򥂆`ࠓed99/IR$^+N* d@"a0L&L1C  (dZסnʕ/o<<\] J6&###nl skG3g^yH(V]sƟ~̨o4[heI^@wesfE;-d#nSVC{;~vkDhZ&tpYτB5564,STSR*<顈6A/얖%=_U=8!WU.䩼_ 0=caɻJIc~NNK ib+.+.-LЀt;w7R3NYLXCj]]EYMsʯ-T3?+Pn)m Q+'\C?acܹd"^}u|W:z`B"9!J$˗8}w^ Xi jkk5|G'0 ł ",f͛I:D#X,R{Sjk>xȤ`nH֎Zt:Ms, 4:aee^~~^IqZij{[ÈYXS`qL=PQ'.Tle@@ww*6v)- zڣ ɓotWkj>W>kϿ}F#=<,[ 9`&g`1$ai/3~8vAAG٠r-!xS2 wc.]Bg6#Gcˉӏ@qMs!')߱]?LsQ~7ՙFܞ OIs~~!!"TlN e2%HMMTe0P!!vDbwyasG~_}İܗ#\:??6m޴d2ux|{Ę9іDZgzN",_JNrf^f.fKKL#B O8bKۀ`ڰݻӿO?xEޮՆ?G؉'`DHI$T[˛ssF f[7w06!RKàJ|t]` fajt`cYY(z ~|y!$.RidHd(EPZ-jժOTmdVww=hovΝaP=}78atf Oxч}DXfM41iАJu·dg9'w>f ٳ ~@$3~Rv)ڵ-+ i͆51h4Qh4 (W32S_:dnݲu (٥hjpcfuZᄅI@sfnED$oZ5.DR:U.)ncBÒSScbBBW&J$*ayx,ժS(g+L$X؂T FF~ٞ{> BV-zͦP||d,VBⅳ=4tI {ߠx6<=RɉD|_lef;kHRRSCBH"WsJJ:Ȩ(oj5 5V6Ɩڵgn\ojfO~eWZj` Q 0dۮRbH| bZv(jL) Z9 IX:_(tvnݻwn^ny^o4|XQYXys?:Sbc_}uϞMS5lɌXqcHĞJ{Q(;\]2sm.H!Hd53ߟ9BШ .EἽ@JllШ;}~i[Ҷ88 X,ۃ1bA%LJDDD ;A·erln-+S(*qw^^+'y{;:kkKK S^vuY<޺xW$քB#*bbcŸ!-"@քwaa27VYU\?"u:CB"*&C%yxFX\7n1:] @FBD{\,0O[!+y5A@+0C~|僥[=6hځ8ΎX?}~&2?xsK-ع ~PڋGiŹybV[ ?YXPHMoLtgQiX,{| ǩlG~2 0 4a|dʮWvBnݶx<6,v\^?\`p?n6~eG&-,}8c匶և-- ӆK4qTRm6uf>]ԽaO#[R֎;D۷S?YjV͏g a+E\DnuAl[~~^BC2{`BXSb`vvE\IDATFNAAJ4J 6@m5ZٽXӧ/عtCnqq??0~lf{{ԢmmlcLbX2F*V< "qAMfI7g`lvw(jVN׈ j{0v9O@ )x ]$Ok᱋ѝkOS i -GV>@92,9㤘)bdtp^7`=h3 ɟ/ͷezTXtRaw profile type iptcx=A0'P>C=xG0L'e| 7?|2k^q *o4d.+kd(NiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ɜN iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx@SBB{O lmk_wwuU랸C6(#=BCh[sxHn=s\*e#pKS\w^A0z֡U.%דObyǟ2q)^h8{:L%M< !oXf.n;"Ll#[RH-m K; w2 wNok`2uvl' 7:C2aEDR׿Vl'-3QN,Yxql@0n% …riuuC]kKgR՘ gmmmg'tru tp`:mڴ3ZTɉ?kVp0󧵛\v^^YYC].R*w8J$>5&B*hi- 把ڞVS)tfyD4|oXגCggY{9\T֪\^wUg{LFZ˨TM/45UTWXݥuQ _t:]PkjOضmϮVuNFPGAO2dWTK ۇN(//mkmjUU(BBCylqFSWS d幸?abX֖NYGcSuMuZ-z{Xm4(jsOHoo}==L%\Zi8dͩQ<(w5@%;|Rm~ g͜XFF#ի j2p{@z&JxyEEAJZU E:CߦAqٰu֞wda~oțfm4cΚbif*BA2T++{;7א`#k4ZпfJ<`k*UKsYYA~~CDEq֣{:FR[[~LLX#twwuT* ++{*`ju:<S\B*mm!aoC(ݹLyLxTx`쪨 o! Tf0%.bf4oą,9_)+*k '4ʪskIGZx/O`ho/>o/^Xdڲ^^AA^,vu0Z,r"A?YGMuUe\yby=!n{W%M9I$Y(OnhLK۴y'ke f 11NB7KmBRfΟ7uJXHfwu?{O?^T)oo@n-#qk23O,+!>:I=b |tAɔJ̌Tfddf ]{'Ovse ?gmiɩ KLtuNK65jJth ;)WGDLX[wZ֮V*esSaCxv \9rh;>&%o䑁 n3<2o鮮F'ć  ԅ$}`HoAuedU[Pwc?C֪~>~~VlrDZ _8\kk6[#jZ`0,2Fsu J/wWwd$AޭF#&p #᭾m6//=# 6?G\35 .H07~4RGn>j$B/V}ĨVUWee9\]5x-$H;tT5ΎZtNy]]C}WwtokY]LeO=Gd}-iin͍ϗf#l'$_3;** mͶfM5Inr<^DϿ0v] OuȄN&>✜twd==ZP|W;;T!_#N ?>9Ϳܞڬ׷J ޞmzۊAŕGP3:/{^qyXj*2C=s}ܹZYQQ!︞IʪZLJfc*C֡RL k1Sgq@+mm!V`хNAAx$HGBw߾{67BɋFEH|>VZ}7_:PSտƁ}0.nE%j)z:::j`[L.eIhNd0|g|E #"x< -)ry\Zq#-y):E*/iMyyYYJ/I>^&z%_^[SO^o2FMajM #G%%;GlBndޖs3N9sƻY`P:;Tg`;u]M.`f'$iǼ&K(d2AAyge,B"T4}]OBz])? 5٩Tvo3԰5bFck[UUe%M9&~_z‹7LxBٛ]UHQn.Qzr#̬nK0hQ6 amlI04liic^GAA>Zm{[K+bL vpwؐ ZvY\1Ib JtՕ22>hjU*T%"'/oO/tJSZZhmmjjhhlP oKX>>cĎK.+9rhݻϒm+:Ɇ'stwu75ִ*eoٿFS\.z]QIcK\IMNgVV tl&SǎgdUV55:J7M/,oOn)A*#XSUQOF|;aV3oL';#l#8ۊMpLH,JiKSOwA~[Ui`cC*N2o3YoCg^\pƎ.oHom}FiѨj$.'-]6vI~5J/ed_~8 dM&=&OY4!F[bd [sfϜTl۾{WF>/葝d)*j_b }}==&}ظ{x{9:=Ҝm?;==GNN1B,R/Ѡ7h\nDxr?pH]MOgYɓii.Gab L&ˇogkc˷U/\(.9O)9=T*7z;NrÇw==F1B$8}B./? ( qd:mnG6$-;~rKϥцS[2ȭ}FXj875`AOFG/4S 4j2HdԄp` 66cuMaAmB)UtSP=+220VV(I'N3gssKaAub[`Hf:M&.H**!YL1&T Jvvwv*j+p~~cOO1m%Kxy7::,\(2Qz==3[2Yl;;gg_ooO/X(iL)<|Ƞ`;QRȝrY{L0Vvv/o7WњGfVhK^zzĈho_>lΤ3htVk026BgPPȤٳB:dG/j"- qjdB7wwwvRX,o/SVuv65\Px~P8((2"<,$ӓAp+R8''OOwOj0M,|H71eƬq\i4J#[0?s=|;[:ZK\BBǍ d[UWuZ <\gh6y'(ik+rMJNI Ο//wzDDxۓ !ëFtmme5ՃnV]C uL#dZ[;8q8$lFf{0S(Tٛq$GnqեXƙLgfeb1dNGa FC<b ]yZ-qagZ}i+񬭹\6$7gNެTtLe0dr9 \G2uGkKϲ]ʊr^-p*W2F:i4 . 'A樶i;nj{vv`5{H#o5ǎa %[o0',Κs#^f/Rzgid&?mmh 0 Q; pGA(|&1ji%EAZlHBoZR{qzeW^>)~N Z|0zLe weLʾ^| o&^hHA 77 spC,D;pGA7d|o!|fT[{?~MMRt6V ]]FSrep/Lr}?PTd0ΞW^9e>շܳa`RL.W $gD2jTB "=T0=r(+E&S*T;ļɉIIyyZ[u ]:ʊ ݃ƍO1kք8o+kUCT2{ֽǻFNQSSPvر͛}TPPVbWskIrz޹FcKkaቴbH3ygu+g|[{d4!n2:rr2ml$f*UccNvNNC.Pa޾Si<^x>8ݝF'GFw4774Օ>O?=vd\|rH׫サsg{G\\|´iq"&-.TH[ZJۡjb2=ݭUչǎ:ӏ3{/`?t~xmp7[EߋNkHHttlL`}ݻJ_Vf͙o1g56#c׮Kͪ IDAT;4G od_I&̨y2W_m6';7i4*a^*ws  7 PⓓعS \\]^^&!^$dW=]*+$s־SIS{ر&]wMccG q;mԲK mp'?aUQQY? LZ ɚ̨FDDEDF0Y $ùْ#[gwY>ci#Gu% ֶ:-G"quhߗ+ׄK;fۍ nT*ccccKQ(JյL&l_M GD:[ћo\K/ kM{v~DQQuMsBb &{d;9=ϦX=6|+턇ÏڢEtPQu[o}J8e"̌Һ:Lp|GN>w~RRH;w o7SOmH0a'L;;??(衇׮]4(źz_}߷l-Z꽫ը,_V!=tZL|ccO 11 v斬VPPYܬTَQQS̙;mZdбoJ/>՚{|L+v_<ŏ]o0hln>YSco`n:FDL~ a斤$qXt^֩TCl옱[Å E +Fv6TZ2?ѳg}}ƍ9]5Z.چAP{qЩanMz[H,RfSutz}CcuE}^ϵrqqus#&Xjj~ɇlܘoOxU˗O;zss/dwgdlۺsgUmTTRY=̞T<~sp}%=dnjYu_̚`^^O33\}Cbm0?ac-ttvvfؙtƺoOϘHӉyyRn~PPP%DQxjUPӿ~*U(4i>:{<׿uX[14Qjz}ؾ>sf3/~݇:e~1=}߾􌎞2sPGA65Mm53f^d^Zo+:m%ef$%e:)nMW |]]Nk֜:5T*nc9f̼y?>c?খT䂴`3gA{&ʊm$IzRRVӣP܌p"#9v"/WZgOOQanTFD<7ڗiNndוps=n(w쮔& S|qyN,NJXHdWL:S,76:Zd4Ι55YbZMEeiYir 3grNq74UZG1qcGw:||ŋ,Yٖ 7Hbx<P$p?.ikgj/ n0 ag"us&g#&\.C.s#7"pڻ/uo^\;_ёSYeo=cLE m,NYѨtkrʳ%%9o|F-æzCeչs9y2cb3Ͼʼy^dkmJ2['O:gdmYYgϔ达X_m.%?*[J!sKMHf/?Ymr,k9pbr\a05=gusѫOJ;Q]]\^o0 j8]}Km#"bGjEEyy9B#b$΃Ʀƞ˦\1[ZssrX `ݕFol$jZhT:79sr;:"" j9{0w7 &7'?]6cn4vuwwWV9:N2cԨ/z/\Q!lQLBX$f0n61~S\>k2JEUU!Ha0bb쳳O7ƺ05'N9\UeSL"uM6zTډ]gt&N qryyөO&ӟٸtU,R9}`N׸B!d:: 9V$jn+аؠm6mھm>Y8$$Dc羽yyy .o,//-3hKڞƦ3g32#F,[cӧ{y^|cI\e?2а@w2=164+ӧ|۸GIHpP}I}uif w |hnƥUR{}_IgzGBAAg~`bm۶Ç| Ŗ/xGF͜5v{v. Q\N`]m[vN?{ƍFK`ȑDŽ7on3}4x.hmM|ɹsVV縸+<%2{7Ćh999ӦEE =&NH h'Z.Wt隧SRbbĢsSVlY33ϸ۳'7oھBpbo﨨Ĉ mmDb=ъoɨTEE/d޻OXV_GEFDxz\-gF9=x /7?_?)>~`ۑn -yNN-!~eǏ 9YY]6q-5cS\~3g::4Q y.[cbݸܛsY7Mdԏ֑2!;et ::Rf'&A?I_GjW>ИѶ6`ܺ7?$6=.4ڟQgH?H0H;N¸vL*)靜bc~ң(((.} =sqCܦoDڶmyށhZ/\HK۷YqD=ŹH|a29%%&!x-K{{͛| 08uhzzM` m/aI#E܋!--)5դHA o&w7R**Ie腖f/^MrɖVR{ܭ8ؓֆzӾ5{5Be'ED ZVFAWSK W|/N/ PzzbM;L5bGכX2[eb &e_/1"kĎN#Œ9@ #RF440ƈn;2  #R (+ 0")QWj vnrPnnMmW%NNXt=KiMb0/ڵ_}И0׬ taRIWWZںu=iGpnך3E}3OJ?$Fdw曜lxނG:ee套|/s渹 V\Ɨ_yݢFk͙v;o/yuq5TԞ>sێG)VVaaS.[dɨQN;wLm4VlkogwCn*dFF^ᇏ?6zխC 5~sk811\@ I$b#(dԨE"6J9{m>Srep㊟ЇrZ굵?~2aϟL}b^))_}u|/OZq]wO<nu_ pqVjNo޼~{Ŋkpid_|p8R{ y*(*m[Zic͕RZ_.,޼yGl,)?.]icFך_UTVUQ3gzٷKn57N?}3^FKZa8={t;].hlj?rР b.]u\M(=_7~ N*qf0 ^ȷ>-'Ҋzqc##%L?"8ݝF|i*EdzcG\7oGfpcj4Uƺܜӧ'NO._pᩁ[vC}~^T={).f2,\D.Pו$c崴}{N##G\UN:z"BO4OJ=׭G)8tf۶VB}}oF=\ёF߳{ %1#- `+nz[[S_T)%O%pmdRrو;PW[V.NQǰ;lvP޻ =Ko6۶,Ew-E iS&Nswڌ]vh1""P k@@P`P 3:!QQJB|rR┢;~}|ak$ja2dR32LG5hN4F({hh"x ֜Դtp{?^nu 9qb}oV;n܊ܫyy7cLMٻgRf]Du\-r-Ӽ~Ar9қook4a2K:<__?J=.j ]^m}pfޞ߷S/$k bWW[d) N3:ވt`.ݴG\7gZ)f=g͒M9RV7~9Qn NO?}\jc=bl?_}5uPf?v4u~aU"¸_!Ɔ'RG%9{ܪx]L̊/%pprUUnٳ;Y#GEFp~rtfF[ѓ';  7]~hnô}?w:^챱c:G煇u /̜y3k-YY{w~DAAeUsRf;:z{GEM2giBǾU [ߪS-++(-4wds'%8}/oJU]]NNZډgI+:;5Ö/xnjHN=wʔPC87JE9 DʓiY-F#V" 3f &;gCjk[u∅Ϛ;w^B`msP[w͉jMt=>sF>f-PHJ4o߄Dw7:W8}O}UÏ .;|w׾wHsʐ(r}Dڮ]{vO H¦MeF i4|k?s^۾m^r[ZMU]rEDD|Cj_4?|1O'|- P5̬͛??ɑVX34tĹ7͕ùc2XemmVֱG>]VV*k4L&N,52%epG_:hRKwO>>~ɜ65O<~_1Rcl.54 ~n?E]񺹣n~z問兄<ěo\|d9s~M+|Gx7>k2)yyd[!=zkk۵:W,3z̅M 8\N޹p^ r IDATx9s=/F9MdNOO N| ¢ko3gJ3-!=CcӡC~ܩ'M}g>ե3Z]Rxu99n?K<T?tO}y^ 0+(:Z?`Q6d0#N}WX(O`g7-#!n>ۺmԨXrH{r++;;krtʇ:}]ß'4QQӦϞjNɊݳ?]`>²e!|M&ywFƶ;wN0ibRʼnLfggYى<~`<5kNuX:]CcIhrw5:)iX{hKg:xІ |MuOO:p`2udfؾwoDD%KivYQ{٧<|r==G8)1qx:Caޗ#zG?N3vƆL.e2Z݄?eeRR||omcǿZ۷wuO2mڲe>>B'Jut첀ZWX[Q!q5*aܹx\ߧ潵7dgڧ&%%/Z4qFSW}о?Ҷ3sx߬Ziϗ ^cǥM8+:?u/>P}ŦW۷?ؽ[.IL6m3lm5Ʀi6o12]O Z['L2e%K ٵOL#/|yh(L]K{rĿ޻654''ϟ?u"VT46N7B"=}˯;GEON1cŊd ]l\{̘K텅޽}8^z qT*&tgww铓|j鲨hFX9_}~.5uݺߵC;eiK$'x EUuzׯ ?SO%&c wX~;~Ϸg0qۖuvT'=%Q6d7QzW}m[c+yמ3'!dVU55wG6K(3f}]Cqݺ=uɏ>pQD$qYLXZBry]}yyi1T*- ,7A~RSu#fΚ?Cv7 㕵n B Yqs#ጎ.OSdLt=O$Mr{xT.U"pP.KA}a9f2G#:AڐW- KKU\7}`s,رO5:ֶY|̙ys:|$2駓zﭠVOi 1c~t(>IRO7oܺu+Wa0\]=<\$jNNeEM^O7oak$Hͷ]$.E/nW/=99<9g /.Z4ft^\nW?Ξ`f ˋœ&Zu)).t` do]$$Jێ]F^ZpP_ge˪:se޻KA156֭z]|šx !~FqNoV|ؕ+|je=6XAOϫ~yzzrۋdQtuefޕZ[_2%q`p4ԯ]ysܶ,_ӭސMCȫh{>w,}`}j%9s_z''89 N¯~ ٷpN!m+)/3c&))I߮e\\S8 Ha%K8Zgaǭmmvu;kk[kjUeʐ% =CH(L?U8'<yy55 T ajv*ˑ Fp¶n{Ņ GsqC/%R)ŻpS~/M54\AzzrsϞ73{׭(lei!4g0:cc/] [lgsLmAM9T{Gљ/w?(hϿpGܜFko߾P&(:؎=^vF RSTf>Ƌ;%'=zBvv"k+??*Lvcj~b҂~/^~ҥ#G++Wa0|{,<>6L 0rƞyφ`p8]M*mnnmQ02xzuR|B.󬬅B:M_$#SShmjnpS!Ш|>>vaB(ug^FоޱZ|>_K@J\kۤި?cZq@Q0fn&u+mugh u \ Zzw?y1C*{!--Ʒ-!^gst{:f| ʪ:noWn7CUu\kNQɔkJ$Xebej!uzl{7*kפRd&B'}>S{s4P?o;sG&JcSO`3(54}5CcIV_;S32ދFqIIYLfj՟>lHX3ۼy׮}سo%nd2q%~ 瘛2tH426330 `--M--5L0'ۃN/Pvԩ=,F,{ySg{9T7('`tc9`j5nzxyx_)W>z33?&~=[e(04䨟|ϽJ$ BmLkh<_ IUr9uu_w!;G o&7j|6tCwl R?(Q.SD2Ja$~C_ nQ}R/cw <6cQ~ u:&z$u}Lac@ MM*e(atn>/x \hh,PZx_3fߦR]j2{KƳk|Otr/?-iޓ_?G-5zPwaN8`mmAAQQSB`xyqL'ӦƆ6540>={幺zxD$̙3G"JzIEaB{k*ԟ_0 AOKN=coPr(*I$Y[FF^ζr=new= Xx_~v>M!!&#nd1W]Ǝ-0g?ק:_7V/N|#BSC"Q X䭷n tD!1iϮݻ">=>O|Cbk3ʼw90av3J($LH!{{G7ժ[e~⾟ӊ%"*U qeeeo/WbP( 52YlP}r-S(2kj$+KJ^Gs–-񱷷0718l-- G,jbjnadH@R.V jTP(k#7H>FAA~^]di1@;026sU˗[nLm3.$qF {hfBB@*+RRkjG2YeUVfnL9slm `7ܟ_#]`d,ǰ9s&r ܿYxd˗33*gkqM9{G0hszˋqS8u T"&UU/Y9#lm''O++8_JJ}}7775E-MBtuvuM|;cbi@[4՚#G45-z7DD7DGz8)i:Ͼ3T1^^$A)jij4Pˆodhi3^"JmHN<>f1l҈{~wR.4գRp]NBagaÿ{~ȩƼi WVU\on`+V5HtwwqaҎr0S{fOSSSXPU"\O(e1_#,My<.Usr)ss?>8[>OlDʯUV:9ѨG= Bh>YV!FD<ӝT*KKF_r̯r8]]..&ƚIccIIZZ||U#\q؞{{ߟw_daϷ窷xb/兟ѓmc`Ozqq{|Txq`->h{G(99\zB!2MW;x-yHl~#G kkՑKx{ 8<.^8_`j6WOU߿tQDT:=ҡأ<22wNL8ݮ] Œ%z4\P/hk3.S[j=?h*=)fwDP_v/Ϟx[Ϗ؟- Mˉ$f:I.mkmj,*ɩ]]oxif;39^0 [S~ɘh€h:DQ72>uWD*X)34XY 4rxNT9uMJocm@k}y@XWۿ[yk٩>ettf=oEE::[ Z`l]~ixa{̯ؼzhd?'?ߺS\&muM==JJ)cR\I"ID"r{fz Sx~~d2<H|͛:{{L×g}ҨeoٶHp!6:*%%=ĉȾ>F ::]P@`W="gϦ&%?^X\c@`r__䱁48>}.bikKe\}mN.W?IB oc;BڮX֡>\TD 0y;(A_|qYdgؖҥ>^eeǏGݳwW_;뺜{|l8wQ< jiRұc}}( <=y歷œtoLl㫟!b9rY>g95Z|N74^ 73UwCgL o?ͭy*lffB‘# gldek7iipo#KزO8s&..'}w<~?HD>/0`Ækq؅ Ǐ}m^f{W^Yt{ӏ-oQg/^LM=vS"b{!!NN"3Ns=ÅAn|/>'?p Ɩ+KN7%C) h4K_ohhd`ƍ7:8p3ʳɰC+W̖,qq3p|D3{D㵀?| IDAT޹>(g\S3>kWoYHhz{0sDjmKO?rW7Axj{zk-]ZXw̯lllYX`W]<`+hJeuM܅{vtwd"ĉ*,W+;v]kb2gvzyo6s. _~ _[UUu䙏w|mm۷+=(-x9T+Oo)u;,Y"0%T7hF>f?C?b2T>DW]]n{|Zc?GԞ9'_~YRᄏtCw걧U`H%yb!]]5bx/?t5{*τ޾,H.ZN@Qc#?y&iIIIl`oK~;0P\m.\mh0"L-+09Dl> AQ}-o~yPDc|B +F&ߏz&MD!/Hc#_uw|0> /=}1)xz~*Ux& x7db &#Wߏ8&s@,&AV*=oIm3&56]~{o;~?$q<}Ïlٹ3:zk(0lp13ȑ>{ۏ^1{4D Vvԁ_71 [j3 (D&fh#L qϭWU_L9~/   !6< =cT"[6?ٙEGdCu?ݓ/zzYvBq>.H| >F$"D䯅t]]׮KGOA.tц'Wvs09,-76UWhET]bqVfB||?=Ɩ-aaFm::JDAA VԔJ ~/7KRH {w61A.uv[|QZ}Ю{{I]ގWUjjlhR(::d74K( on9{fS'<={'=w#f>JSikIO?55;P,34# ŕ\ɀOOZ).UVk׮^(Ãg.<׸UB l]AƮ4k/o>_^[W& ryjiE\YY t\.A.'F<zhXPSޤY>=vU,V(枞^\Q#1FQI;:Ql[AD$*,W,J bҒB'BQ zVv-:ǃϤUttJ 3֕nDWrKE8RAF9zM"(a(Q.H LM&Qʪӟ|m[鱗G&g{P(ԤO^{4FQ.J^M=;{{Zl&F"!Fz#JeCcNVNNmde9fjфVԔYU#Nv1XۤRI$]$R&ɸZS7\$dZ Rcf!Jkk>L!WU鹺T2^]`hk;gu,06Rj뚛*|`oڵW1l$h1 Vl6W__NϏ:zqr2hh 65D鉉յJsD koOM}BHUVv>Ŏ3e˞|qXg6kiD@@N޽I߻W vsQ EWgcXdz{{YZ"&CKPcX,*#9|Šd%GI"sr ; =M$^щ˕Vef^x19;AttLL,,--g2{ʲRRS\id;8;3RYˍkW]mi,,ݽuuɤ'1$)ʕ>ss??//33 ed:­EE/gfefThhuZۇ(/ps7ʊd.YZMf--74YobB 8J\y]ߞ8%55 b\rjvvZvVIBaihgdJ$mm EyygefR--.\~~TLn)`&/䫯]PxGzX"Y_sTRYYuv݋ DPr7o Xt%5  }ŗsJK ˕+4JTa`szjBX3Wp70 ?' #XYYcg1vA6K`hbfABR]ɻSYM$ZY8^ F| EAA ̃)H7G $~w>/~)=I.ţyԇmٲsgt׮T^-;z޲Z#G>o?~zt_DT7Z33 /xYWW-M+u׮ 42NA2x?.nbxժg1P(LFt[믪r_E0B!J(BHK.75}4/F/,LLhk#I$XT"uZ6?y++;;gg{{qL].= ]k֮]P ={(QWnܒ * bؿR57ed$%2&D"x,J5|<1IH4_ !h]wU.|>icQp!"++4v~maWۭm׬54ʹ\?r]6 OKKM**W66uwK$S5.Z"8ޞ&OL I+ٳoo%18x+gp0^8dwd1FWU PBspaaNNz6TO _eKccTT\\^n st|w]LOLڷ)R 6neE*UmmԹ;">eh|d䎏6oZY^6mcRiKs~~d}.,nkJt}=[[_eKý12EsKnntȔ>"65;‚e}1وݽ}&ryY;vSTdcK۷[gc}5ןsG&PqK1b/DummR)`X|] O^ c&T!hh;˔Iy>W[[#1=;;1!?B|GG&>;kƦ2q 36 atK,LOGز%,Hpr)rySsZOb\_]pd[oHHܻ{׷ rs∈ĎCv}K"v#H'N|MUkgl51|KhlL&Өc'`Qx7={mm=ē,6F PooWUGG=(haʕ~RiCcaarr|o}eUU{W^cR3S yxwff燄Y%6\]ʈۋa<ިN#bZL69;YyybLncmcC3͎'E+D'즓=~7z73P(mM-hiBmUIDC_PMjʉ sC,tD&''44-|݆kAmu/opgsج;>77/>$H`f:FOwϜiaink/cq+a}1qWի#~naa&d0zz>CqYY!6  U J" _}g8A:د_?XTj3u9Lfjr44u4z{\%G#^@SO=&[`kk0W })6@Ąo^xaBw8jk0ёSb|[7݈e*-N"8駦fgU666sFuKEJ eO'*r kW]3neek *4.''\1'//1>7Wru rwSSB l=#r8K<'ج;F"ryjiE\YY t\.A.'F<zs F,U*GQS޳1']!iV^|BY]SquU嵫bB!4qH4J"߱iGlZE < %"QaZ.n>QIAX`8:[ZRA4@OʮEGxԴꚎN_iZ4 `|KˌKgs,,u/+y\Y{O&*edff\-ַvw$J荝/,,.nnV( OO.O[L7$=j2BQYym<= 3E UEYlFrـD/W`j E\ZLMM$Jf&(幸_8T's,%>[*4%FaK_TNJLN}䓿HHH6ʝp?Mz2Bvs[gLux)/;RYߐgIc|Āxf*yysvwGtk눈 O8:EEu/?`/u T M ED`ђ޺54ϻw rb}Jj2)dJ8hT**]==x2͚H{v"6G,&BLaB rqYVe{ 3"rvbbl̙+[mt `M)GXX_09boP-㞣U>J^M=;{{Zl&F"!Ƚ E)~fFEřȃGF^v[qF[Z PbSSnnVfUT:T$ήHcL688(n1'+'Bccbt3 Q&ɸZS7\$dZ R#31L5rkq>L!WU鹺T2^]`hk;gu,06Rj뚛*p?M.5>W?I,hksG9''#`SHX]Tl{>dio9u_Fyzx]l6kiD@@N޽I߻W vsQ EWgcXdz{{YZjhL>TZ":z$2'G߰=Ã5*`X{{jO#BB}}ml=*+KO;{bGٲeO>8֖s؞a^i$'on|QX@lWWEEfƅ ]]{L1dhi3-E%նv$'c5k;؜>}x 1jO3I[{]}sKOBT65vw*H6aȍ IDAT"LH!+_8rJYXZ[suX4BVYyrNNC*p~"7C Ǟ}vYrٴԤ QT[53st X+<6005à<ቖ/S8{--t\,-۶ .FG8G ::q"3Eut xfO?曋9:, c/EΊXN1 WZJ;vR8h޼%K=~=&v^yu㳾1cknoaaL}0LM߿oޑcлN曢~z 38zLzzGGoE 6[ ]K͛mA8]PxGzX"Y_sTRYYuv݋ DPr7o Xt 5  A/甖*+WkiFQC6Jef$ Aoð2`ef8UJa&l 7BT*Ukە9DhF|myσ )H7G $?9rdttZzqqC=hbjgP'|l9ӧvgg?ot֮T^-;zw~G@\\fŰƬ޵ĉF3;;\M-"0B_|^PSGXutZ(*tu56V+uummf 0RP(oT%%i <''><#J ^+;}wǏ-^gD"itD&~}US;˹¶6@`2B #%Rgf> =}6k׾5|u~vT+)u99QQgHruut31Y-.\?Eayܑ1p?ҥڻ'!^&\vZ|%%n7n[2xe׵6o^ˀO&AQxby mW׵붽ekk#\8`q2YEŕ+%%}APTSrE[{QQ\\ªƮ.雙Ν;?(<"4I_BPO>tp O * JKk::r--m╏-\hm\Q;)*y׭ޡb99|SDti6O>ٿ'|ٖm..QQqqy70'ywZ 9.T^V -55_}ldjHTSOp8V]]19/[K G[yŔG#Ogg]ZS׷p_xŪP;;6 ?jhKsQuuJ%G͛%dO=7uI!5ePaæWíhԱ[K:s_ǵTEFhH5h&o-J[##paaUu[TJ뙘/[%Lܒu62%HdMMε rdd17]\\U20@ W99N HRS ŕmmR)rͅnE5NH{977 ?B@:>G&PqK1b/DummR)`X|] O^ˁ1f:]W88Ƞ 6i\Qߐgoccͅ ?Xpƀ6771!1ǟ>i|ޭ42/X͛ ((ήk՗?uۚ5 ٙ+erk E+D'DdS33ĉoq-`p&TL^[w®ow}wW(??$d͚0--R3g"$/$d5`+WRSʮ. ]&(L)/OMO8x$Җ7x#$ЀH~@cG:\0_@Q:kKhl“~]@@Q>? ܪsݧNyz>Ozx؈/>%A+WkjJ q՗UU^yKLB߭n3ۋa<^q :;-xi(-MN>th׽$_ooǸ$rycSY\{zYtJ%ge&'#olf$ vS?:_TTokf e`A8-MHyG͘o H%BLe7^WW/ 6N:̵g;zy=\:ZDO/0p/ab|+)ng`bB!_~|1>>''8&065uswqOM.,lll ',+).O?mcs{$0<מyˋާ46:)_x[/pz::xJ|W]=vD_?0^|1_^[ صbB!4dUE\YY t\.A.'F<za o(e#h_woOH?#P`aeעbx55\<۶E`2}(aǔLvU$̸[**W8RAF9z#{M16 [vRbrҥs$Lp<9f|ӀQ(&F(&RZjM=G9+*L@n/WeT*`%k&L&^RИS[G!YYα11ƨTJ^M=;{{Zl&F"!x-woYr ں& .Qrg]kc.^L>g S`ދ  (M57nvMլlIIĖ&#zoR CeL8Flk纼 69xz;ZZZy,Z=8V'V)=<6yUUz{{mmcc{S_9<_o9+₃ssv:]40_;{T}-RiOoCcgjˤz7wH,qflpQޖ}FB ntՓF.910Vk4mr@[LV'ht:Hdf)iӉ|SX98:;[[p=uuyy--LҨB?'+ko‚399gt@"qt3>_0$u͚-[Lt,䉬̔ocB헅=O(KPBCҒ3*͜9O.Zz͓O?;z6JJTcc33[[rָxhdsp41̞ݻ>Z.'Nv6_?֭fMLrsRMOR9O"qs[OYn%o'Gbr/ǿU[_ӟ/Xn,Y![\ro~ظ^٫uT/ۗ_ExZL.0'Szz?\V=/d zLWj9Q/^˭PWqUݧTWUթԦvv[ 'JX䩧l? r<ķN'TU(NN׻{FИ_ZBۋE\Ptv\MΟ[_ ½zJ,x\@&ڮ‚ܺza77}L{ R NڒvDVVgV/J$N!7?Xb;;TI p&{|q>0)]uјL##>_$HGFFZPF_VT=.'BB,%4VR 56^vŋ5Unܲuo||&q/?VUVVQV;9- 63VӨѦML,̝}޼QQOݺm޼Ǔ k:磏镐Ow84Yi~_R( >醆e 2˛ r"wȍ[3_R5攳w"˜b޼}.&ɉpa[nmkkiU9,k+%{eK%9OwH8%ﷷ [&,L_d1??%9%˯>P&[Җg hGW+*Od2O؀@} %nK[Co?yB^t뼼9T*1&{\ǯ"bZ[_Ood +Ksry[kKko\N~^L賘{9܉;H|t*HOoccIqOMml6mrv\ <~&Q,^ʟz:dPp96/3I?9;r&Jl˖_'& `ժ[?^P*뤕:i*__%(^^K||yҒښvs6K)!(,\hӝ=㏎)/7ڊeްJ<[& *!! zDHF#C:ҜG xa://ɯ#S\x&%#<|CU֔w}=T_e@eaftJ5<,ƚ*Y]Wl"(H *.%N>SS3wڵNNL&f*/8ZU*Zə9y+xL nbba4L|Orxz-^tIȥKR[[lΞ>y^^JrAN;SOLtyyGOnlWb*2w-^G >/tWRW_=[X`d1 &u7k0c=i4c=%n|ٔ uuW;8iiu]9z}/юzzKf< /fݓSX$Cf+Vc߭Jry,%YxUUd_p3+N;z񢬾cd [PTP`L'lmn.*JKK]Z"kmW(t#c33{;qyxyU{]>_WGݷxF]7|G}}T+//ḺY[_InS\-+KO 0Nl4ZyeerERisKwnb?bg;مlSZtعs%2Yk\Lmm<=CEDx{ مp;?:,l:3^15ut]<#?cG.\(+ohox<kOO R?̄S M݃ pb{D֭/O>w 3Uvr`08hBc#`6M'P;zTV6x{;9QbHSZm[ mlw6lpqFF_8w.3K.W( c~_t굑xkDqGrLXr&힑>[NvU6JmUOOo/ ķJܒӝ;RUsm$hΝ>sYYERR7U`hFqwRޓƆzYkEgah.'?&.$$/wo}77orc*do JJO߷wmmIPPXʕ\.ْc\Nygl, vakք돌64$$Gd+^!!L}U>vlGPВ-c0kjR/$$I޿t֗l 0JԜt;wNﷵ _>*Ph,<58ӉDSgE;ҿڿgC.v72A|ճJ[[Y)ҋuMjn#Qn`3IMbW!Kdws#/3I?9gP"ђ%6=Tt~W{7+,hi]ʒJR[ZDwzyD"rŔѱ:iEyLrpxuGFq~w''7=)|>_b*ݝC:ōE7̞WN]yy''&qWl_ysx觲 wwOOoo2yݻd+NV_}c=‹ =H?4wd74% vdQ Nx9&~1^NDB16PQt,=}?5JU'U"'g;;6KRNRhKjka-$A<9ThyyI^ K )(:&fݤ. 3So﨨'زz?lٜ9&&}}'2+gw6WZ]'-+R*ml-03eE /((<<<"(JVpPGⅉumoO7d$YVWVZ]?4L 7;z|/m{w+3jb9agnh&c4DWLjzZ+~%g;?YF.C.x\FSPo{:vϛ;TB⩒irE__q˝7oE1^s bsXL w5a=,-LRFK٤ S/tG?w T>dЕv*W0Y=BX\;b2TO>0@vШ<5k?[jj.^III8u؞=ҥS7iEfCs2@鮍nr*Us˙O>䓔d 66<|%|kw6H$7U\}'fDNߧN7AAˣ:q5egd%d mLh~d.,hhs""bb쭬Df<E&TdB}ŷNA\lCGk/8ټ岺>N iw6W䲢K+ DV?HOOkl NSPad:yMd2m$!3#-tjZg0 %nn WzdChFަN=Ȉ\.SPFH|3qLv|}zѷbi~^C3A`om%y,ֵ~QV[ۤZ)AY]rhEVw4;'/I7Gټ|U _kٔڥDE LZ-kmJ{z|$Ap 9L*-/ws{bkllfjjf ?~ ?0m)kk+/OOOIo$_x7X$L\{uu#j(,|[ti[bae#hyMZdd_TUNV|1 wu䧥eeɌ -z晐 sw6WdEKC=<2&!aޯQbb]\VD͙ , H߷/9y>S*##]],?>TFZqCX7/HO۷ܹ?T vw7hrymmVfbbf\әNW97: R{g3//7ɴOjǟlB =l2\gOJʮ϶oW*xxOMMfFBhB϶:O8sxѯy FG[[ΜODW:!}]S}N=Wd&( -2 )5.*+sss+((+i ,-_|ƇYFc& c/de?r\Nvii]]o/AX[;8:: Xhjd4 ξzcLJlo$\`\P4N,vv??hq`Pd/Aڽo3Y7G!otuӦMs粘7wd=|]͛CCDf+,ܿ" /,YwO41k*  ;\fJ5ʪ߼=mK-[ TVz^~r%W)UU?/(*VSOi̩VW_۶7_}52 6R'XsȾ}ٙY>?[5%Bh^*mlP,-lXLpsc0JJjsVKK*+!KDf|*U}Cե:R, rq51Y"Y*+KMPz{;yBQ(J<δ{j5ݪľ,מ2K[R<|Ǐ_Wg=}Ǐiu^ɧ||ꤵ4}pՕg\]]EfǸ X IDAT'  &:U4=\QV+U|{a]||KKLՔ3]Twt:qHjŋ&S ;7,lCQQBն'Ǜ4r߃_iތ^s(LR(FFR/dgHZ[ :g~ddCaa|گ1'w9tdYتuf"Y݅yͽ cj|C#"y^WV&';\T(6tw1&\>0 6n#!!vONsϭ e[{Nα8wTV64Dx6NNB<ԄV~*~y_x \iΝ(*ii D$r_zmd%$r+&+qg֥BS(U==2}uEL&2sw ^131зן;*((.J*WgWW)pyyQam-Qww2==A*mh,-#"^J3ҫe2s9jirZ%h"'3+eu*zxҥfiI͵)Q%9eק;w$sF-۴I,z{+*Ν;yWa@7/mRܾ z͛׮Sl67F34ԬLΪTmٙD[Mds/xzrW*Uֶ*iVge?""0e>T|L_~9Ae֨(K }Lss;6#(hIpD˖155$߿ :}[[_N~k]n8>M" [24%O ۽SSOnhLH ~ٲW02R(JSN'e jbTUVTi46 yd[[x:qݻ(?11Vt:"1餿g4A00UKj5Abb75-4MM))JU]]]]&S:pEyqNOsަMl6PmgmOn"ꪦsRUU׳YKL-"377Wg>?)vqѕ:i% \Vrp"}p(ԙV/_Y֎x8*b1')\Hlana~"}tᒒ?KJ.APIk],%L=F~oz 㰛VNtyy''&65űqaVZqw4_߽K&{d16^c/X˓CCo{WNNNvC#Yd0ҦE40rLơq6+b3Xg5P(TKO߀þ>=JP %\Ni%ző醆ˊR8:NvpvvSӝWhnn鵵5UZȬJ*W\ CJ,8pReE[Vkg+56VU֪.e\x*Ub*("ΎRʩi4HDUTwuwM('FF n?~4>Y}Ac?{vkǽ &-$A--iLSln.(%:iYYURic"oϦ;QFvpZ*f 9#)ZT08846oVOMOgR}U=[KvnkmiRͭ-:J5͛cexTvqtv-'W5!zNsXf #W]U[+PkjFGmmCC6!..=:mUuuР"p˵dgqJZ]';۶Q/"Aq|E6_YY9G9vvgfeeW46wuFG4j/צqLT^;qJ%A?_+)u:e<Ph(ŀͺѶ7Z~o2,+KH++nh&]x =6YT^)GyT rsjk ..vu\FP||lO%$*)*W[yVZ_FT[+5ɲev?NON?mVb|G'kz8rFLWVTTHJUe\$5S5JhId^#"Ģ=FhΞl租;Kȅ%Cx|36h ySǦ%h į wyhǘ:ju_oOoVזO,!}(U3ɟ|')Allx5KB.51j vzm(H|/o2}N8էJO'~S~~קTdB}&p_9{WgL&2:8;\#YNN6:]LRyYk Ҥr7GG:17ĉ¶v [iX,;{G'+ ֖%kP('{/2*Z}w#[c2Bcc AVe44S 911nnVV"3ЀŢ VN;u n6y[O ÖXZI:./7/snimc`iA!d TBZhju]K Ϩ@{k+34d k4o_&J *m<֪CC=m--9yyLy?mmfء <ݑ jXv grICYCcgr-:;OJ? +bnlDֆ lkrW0y_kٔڥDE LZ-kmJ{z|'zlhdkAM<|v";,%B5or;e:Sojltp./r+ˈws#TLMM٬ᢢ-%ccmm))Op=s8:]OTZ^V_N".Ύyzxdd}MB¾_}:]wW}}N3':: @bqw z?W-XsSN],;'\,|5wА7<MܶxP0'z͓O?;z6JJTcc33[[/%q+-ԳQ˅ TUé={쮑>O.ZxgǜCpMxbVLѣII9?woi00%WE\&_X;Ss֭/?~<;+)99:KµkWfLKN4voH|ꅔCX^{=xm?N丟.L-.9p7hlk?LV&m}cᄈsgS%쳋߼3l"Ǣl{ WRA?/WGx1/Bvp\2uƆQsÝ. 0DgķN'TU(NN׻{\us݇o /FsrذMjn_~s&TSҥ[_GKc 0C1AoPNc:&ΘLG$Gc9~$%9d({L'X[m >90'wmɥ SA563!d{fPRJɘo$PW'9N0cfɊow7r$L@`(UJt7r\ 0Hy{?*fdr9@A7~7 pi[kj>q>0)M'1s<~S~M,qg֗_y%:ZbAN~poQ]?iO~_!<櫕:>r_\ieI| EUՏ?/ EUkS~<.Ayk۶[Z""櫯FF!-+ *!!&[FbsWgfSMAfZѪjFLW<`@6̼{j5ݪľ,מrJuGg~ǎ^(a2;sV>-0W{G~ǎ\PVV>4Dx6֞ByH(EEGKJd= m*vs[(&vEĂͺMQmn.*JKK]Z"kmW(t#c33{;qyxy^+++MN.*J[tX`;[=_[Fd'O|]tZXسaa==<t e[{Nα8wTV6x{;9QbHSZm[ mlw6lpqFF_8w.3K.W( c~_t굑XkDqGrLXr&qo_&J Zx<++K G&U]ܑR̝<.n&F8wvn3^ LjjN:鎝;N'چ_ehPwTgdIDh{{ʋ{{.]tժA EKkIɹsgzz}-+VL&Uֶ*iVge?""0e>T|L_~9Ae֨(K ?vvۻ6$((,lP.W75׷1zzz/YR_P)3/[7InhLH ~ٲW02R(JSN'e jbTUVTi46 yd,[[x:qݻ(?11Vt'"1餿{wUy|̖ɾ/B"$o*V-hRZz{]_W,*HFBvȞLl93RD~ϋa33OwΗ>wlھW]z $$d6W+WjBE"pi]vtDFpwggxy rcbD ou˦^pu`{{PʕmŋumSO 2[x╭N]b\~ԩIIkGd{!{z̚y?鬙>[Ri>##7jqqIqkҥa)R:2ZQGbCgيDӦ͘1OTKyg;tᆄx719&^9m }=-k>d钠3iӒSR꣏RS+m7*>sOh.,E}{ [EQS9{_K昇n@hosjZ)/3c[,ɽ?~- {qKX FcpвQQ*8fsnT$Vm2yzUIau(Vm;84d4JR^–Z}ɯ ;ucE+[{Gg>=5Ms;˯+Ob\i#KUz- ubjJB"1{*oaȰբPy8jom_rX*\^Kq/mᶋm3sݟ7_u RH;; ^ EDdt&D,9՜s4hd'2ulL.-"–VK\l5aBUXiIsDlճgOTO,rUi5VkScQaQ.tLyf ;55*I1_ =rTDUʞb(.jnWXfΜĘ _wwzF+aw\44TWX^^[ϵi $&}~EiX 4UW=vP~^]BvYE:}@{[]u##\~{=J  Xuw74ܱ}[vvk^VGGʊ󰯳ZNdg8Q[[]8:"E"am;>_}}\R鰶!/O(~"ZZ*+pǫ̦iL.B_+;;$ROOwhm7w6_mjfܹZ۬37رfOϙ.1W*=ZSXXQ_CaSIDATkJmƁ把wػl IK[1E7t*??7F *eaLb-vavG[ߎExLhз,);|Ç +*b/؀%_s͌h(/?/АZj9j3x|}hMǼys';r$;;?tioƌoG^FF`ق"bLa;bO}}YYQa~75XyhjƸ!II))UQU]R{ù޽=WXŅyzJ%߱¹KSLWTߡz}TԌ__쫯uKqBhn,WNM66N骯///,̵)/?44斒z|E9kx 'YR7%J骫---,+((/oltE_P9sm.xIJ㒚bPmmnÇ>-9}31iFjDZFgڼB+'LXB㲈E"ɆŠoKa70ٰTX \dZ*4܎>cvr.1W$6ٹF>14 ?@hoC \056 lG>2p] 7pvQ}L\TNTNTNTNTNTNTNTNTNTNTNTNTNTNTNTNT\ge@,v ShB1͎#pZ-Bs[`gp+QBcoG Koٍ9B%zWαwT(doG ƌBs 0'Lv;Yh7LvyNι#ݻ[kkfZӎ{?I!wdFuպf0ttvto~t桁Пnц X,ż6o'w6v6fbƾ}55E ծJB!b,f"ѐvTg2=?_&)Qmo]]o[>쳉Im2|{c…ȈȈ{ڵkwSƇ7>Tƾ7* Qs&N9aMZ-Aǯ P#GZZ,`0D"Ø,/ZQoVP 'ؼr'rII6 'ݓOFO-tM'Z?lŦ~}ԩu7)6?ʫ%IB`2+(=߼ qG-iGXm4 AؘdodƌF}%(!z}HjAMhfVfPX_;ZM&!6ۋNK, + U<]Zz').:qkdjqw ӄGDϘ`Eajte?a׸,a3O?`6ϟ7|sBDx;'8Mo*+{7'?OֶVdp`p0%uիJ7~f27 *:uFjoTTT#C$R(rD.+-ԩϫ(omRWW//_ߠ)S3.Zdܘhd~͍}ieIԚ}oG۷WV ѵLC/^ЃO?mrpp_ܶmQ^iSz7,޾Ogy<6((mƜ9-|% wZ^^ۿ++3(>?wkrrfc^}j_=n]|뷿s^-ZBO'-֡d"pQ?.vw֮D"anxxX[R۶ƾ|އ"u~ҋ/GM3_:#440S,{Zk{-֬(g-sdt[V>mz\\DĒ% L&:{O=oO?C}Xd̙^~႞቏ltt?+o_`M^>==0@&;̙YYK/Y9=۷[?Ho!2bŷުoX}Όt_ EGВ%Hm6YmmmmDV!涊O֟lZCC˴iOcx(aa!=GK/~ɐ61qG~smPR.f|8ɿxթ۹jŊyf^35**(yqӦ".2!ږpG,P_Q*z޽fQ*+|woc:+om֬KZl?S?t{M~6=u_ʫG9s|yx\L:_5EY\R\ D"h i-3]-^[znsl.:Κw ڸ~}ffhAK^/X d>u[nYu,7wWWsxX.JThi2|dB-<" =" ݡ!^^ rX;{vzFL̕))s禦zxW MMU(ePYo??hk喇6~nj OpA"K6%njcbin+ܾsr׆5j ʆͲ噙}(2Q>rPnNL>kժu7/_{憆w{_Ս.[~-A';qw̨r zͷXrQk6TUٻOv׷uwt2WHH\ܹ7ŋcϮ[3>SXs:T^92PĤ-_^=cF~> z;n_{놵rKsul;Vi {m-BEoYl{dHkObT*ƌFI*-r?>CC/b".)S4INNg `Aɞ-/u𣬬/Ex[Z_>9%)9)?222l:^u\XY,mI@`@P_o_oK\Q,vA~4cc'Nך͑SdZ5wJe54۳=[H7mZ:۫Ն UƬO!W[rUXݭ ׻Z?[ +D>׻O/;su~U}o:XX<6&{`6\]===,ё@& Zerʛxz\g^i||{ [VDM>~9{$8xѢ~׬>h95DG+>m˖!⑑w쨫]KP&11-e ܱ{w[۔)߹Go5sgv\lLT@{ݻsrV6mK,N:)kN>;6vl;tXM_?WlnkRXL&aMgƳxY5[RpPE"TU}ϞYLP]uttdDw&F^ k]Un*Յ=-Xr冻nZ:i4Z&xߵknn}fݾ-V!vRIFFl)>>>A&[lrO*:m钥K;?J_\.wɭ!~PX2l{v'rKNHhhX2Fcd6(1b22f 8[ UА(`Џc0H$)SBBD3g::Ow="}3m"7f회@z˖]g]8++--!AWV߿h遁BHuuqKE/vtTNuv־}špu└А/x{*K}6ivFBJ1[::[Z;:,:>^5Q삃;~?nݲm+[? (o_4bjkkΜ_H\YQYa6wcں}{=^{K>16fsIiIɔȕ+Vy'UٸL|L7X#375׵)1?B76vc99NJW5t tk6$>_G$Vh_ {x.?QP?_' +-"prS"}護L/,!bt.?/>996V.**>pdt/+djk߷g{~4#}͚K}纅~>^Kq/m/Y~`|OsgI%.B/vxhhxD*JX* [׏<!e.d?Nx>?ڴޞ3;;vn?pX3F6C]77{onesDb7uJʒs3GG?#GZKxF㙮wuإ˖,&^(-] ޚ*UW?sg}NZjUusj>b&ZMIɇ;>0<|+[tM7m{j.ӦMdNNJNQ(\;|ȑˏ/ϙ3W?78Ġx=a~EEolvTV5EI+VY3gNbbLtDxpRX X t9ODOH;:roh._!;yIk-".3gԀ]  ׯ934lg**K$^^Q1nnm:thyy[VlFFNhp.Hnnkk,HLsU18PPy7%5%%4T̅OZR%NKL4yzxxz{T!0\dQ6nJL( kI`P`o30`0tj̙3gM|d+:6>ۻ,رʶց!аV;:2ikkh.*>rd'+-  99--Vhhn8xpǎ{++zͦKO FW]}HAAoOh̬8CecS^ѣ'=.JJ (mmG.zx{dc޾ eeyJUllXkPPU}`nNMVP]dVNZSSRRS;2qzэ6ͭ|CB=r7JEK\xHsgAd&y:"lݘޢJEjnkΜ7gWc{Ihf{s }1>/h4a*׿J};"Fs pr9sĎWj;2c#v+G*,Ao_fmql3>ΖxF IaqހFp1o\lsTOpu˄xdo_?:Y MhAv*3r14 ?@h7LvyN+*4m{]#!{IENDB`gsequencer-3.1.3/docs/images/AGS_linking.png0000644000175000017500000067645613607210263015660 00000000000000PNG  IHDRD" zTXtRaw profile type exifxڍSa )z=1f7PݙoZ3*y C |d-ACTjJ\1E\PkkO]XRފk;K'~KT8/Dr©nGԗBT,GB((2Z,@ߑ##CȬEsSfd}5&nm cɎiu *h¡U7#bx剺 l9;d`~aBC0`d/ 74W*3Vap#MNQ#3c3=hC$*jS8 Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - recycling tree Schema describing the audio tree with channels and the nested recycling tree Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later HA iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx\,KX(ҋ%v)SM/{S4XK""((bÆ]A Ǚ?o2̾y%tA#Fh@]!סi#FYxh rx,5r2nr0&sW̅񫺏*L'0#es~֜KW9x'Cm?4*#c1`>ND$y_~?]BμCjLuΙo_>~1ϊ&n|S,RAV&綠@hS]Ǽ&ǦV[ostxw#!f'~=ލ#9߳Ʀ&fPSMXq><6%zgouϢKq;KP{Vy#X|#lZLuye GZ=B3P16sz9G?Ӱ1g+W_t̩#L2n OT~T=8\8>!]8օ4wiwOX޿KP 1qICG91v9Nm\Fqp䈫p7_ ȺDW =B9iNwniq_G\sW<s=cޘW[orm=NM5fI_Ι:w4wx|P"T8a 0OP{V,l +xsee[PIJ`A춖Ta͛7og { &N< t\!M#:#Rǥk7N=}#Suygi+eN#LNΜ5k9M*.xj>#Βnڹp9'2ccq*g7DP1 ;{OEzq|!.=FGx=s0N09̹xcj5-ygiES\޿8W9 $}ŏ N *$H4s38)q޷A-G_Qo uY'XP.@P. rBP. rBP. rBP.!sU^!f&G_q 1e(Tc?D,M6nDϦM?w.os9C8 5l#iٳD+F 64cx9}z$},8&rӯO-Z ϳUN9qz<5ň@]r9}}g￙:ҕR/_AAs/y{)>ܼMV 6 N爅[9^Xγ:bK姊Ϫ+: @w swojjiި׈nfz)G[/^ԾgەG \$Nb88rc8w6c=s/LlޮM4.]6ᇦM>ujqqaɵ*;y'$v"+8}h{LDaa{ŋqj˩;'*kG%*?fRHǎ&f&wy9<{?Lqܵ E1~ZYPHB;Çbc̈ rag"{Ė C@1ygNs: 9Mϸd1p,s>CEdXm(W]|`g@u8%39KTڽ{ÆݻIޓX̲q5.;ҩKjjN^*)O;GDvHt/ P.'^HP\ݯH9 =6s =b#t r|Y*l]=}4cmwi;+L BDF 7Y{$$/ݸr\RS3yQPg]X0`a|۷{Zh#9#Gq'GгgF={ZYK]}|u#߹#;MHpv\*X5#ɪUz6pyӽwN"K /^ ߋ(%e'DJ{  PA2U n#9s t' ڵTJ>x}x/HxRTݑUV&nd_WiQ? ߜfȶ͛Zrvq=}|\\BC| jҨ /zgDg#~8uGVg7o#03HKK/_62;NP ǹ%'fu1;ͷli)56kjYq:[su.Ρ ـ(tWD;vg>B{n}8~IO?\!yeNկdޚ=F0kW9O+)gekVa()'88ںGCػ:QxOIɍOf!c=/vWT>}c1#Gڇs*رcGOf>6MZq\do@JQDy}FDٷ AAfn@ĄĄ^9Ho7΃"n|9/ ~%zzt8Iwf,E%EE$1PT.]H`I<ۯ:5֭v޿ܮIVTLkKO_tE[S-Z*HUGZvжm9 /_&JH?V}N~sYX\_]JiKӦ<=תQT 6n0a֬͞5*ɍ׭|auZ]v=QRRn]~qXMPPmE년TI66Dk2gGDx>3NO-[[wPZ"χ#ta{kWƎ3WՇkҸqŕ ԩWw>ҷA s,-Tqiĩ -*/KDAjvD?/T~}(@}f,ա9~\im[\/(nr#.Iåmr2*1JukD3~-Q_¥D]7%:p?%zm@_癙kT)?nqޛP1eR?GԎ,(?vU Ѩ=+zWo댷4hav9@5dfff6n.եCG5 LJK 觘>-=cMWV߹CtԩD\߸ЁD={H{㗑=h"{;_"/86j˿94Og~=sQw%&ND{8Y6$!@T\nl|0!=`˯p{o4}|߾Mkglbn ro]/][S))n~tK 41ĸE 1Dw$xi2" s^"ԴU˺4~oI!ru"K5{aW {jngiq[ٳ[r1?ZqIN_VAD-[ϝ#Vie238ǐANNC/;.vd#֬1DX^xiGZxm QYiIw!شiD.U(<2"uYnPVr¢*8MAƍ.sW6 ~ݼ(|kŸ-X= rGRݾ Jjʈ TW9:[z쩭QA+VO1yzpfM^UD.Q|a*rr츕S6uްa{₃5*7hdwҹ^,ꟕUTu346h@ɳtDj{GUR{كr9#-X;!Z4tuҹ]}-]㛓S\lZ=,!җˈ^_(r{D{EAYI~-,'(kܱéSg-rw|N?v]Lֺobq{%%γ qWw(<:v[ɓk#nЦՑWx]ȣիyy5ङ3EA+hǎ(hZZ팛rœۛ:]4iRIn {ܸOSGԩ̙@r EEuFs rG,Z6mjn޴鞃{g3Ϝqpg@WL]}{4aCIbv%xqي7*f&Ogii``i0a\tK67 nfx.YoիT]\BC|$23qr&+8uhΞv1XOP.xJe-BamSG36;ĸ8qes8ر7x)G9 -Lϋ[0Ĺ"\nnt21cla԰\,˖DEEEݻ9Ly2y5< (<n3ں6aaa``a!΀un-΀xqkkl -Q~#zt?52-nEA;u$u\Wi,`rT*Z3rĪ5՗ Ԫ!\9$p'WRÊQiSMŅϏgI߯HA U=^y9.U.Iaa>a|'`ךr)o83G&[XXAm:ciB#DtږmRw3ɜUh!bORRYtT#,]~ҥ5N{:iDґҥ+vB.k6/ⲙuWhhй 6wD"ѓ}>w矿nT; vMG ?rζL={ "JL8Gw@]r9#P*ry.qgۆ5ee7G~v,6 O9F!ȟ) J?nÊj5/*3/鐐CB$W@O?//-hJKv cf͈ccv=◯T!!xy223q_<](<*[wvmCl5yȌC~;+aΙ 4 o[YY n\&5SԯCF7!bI\ab4ᥫFXf䈒Ғ|ψy(7T /^ ڹ۳7QJʴO4 r9@5q : {Ebې_?0׹bې~>9mZmf]. O\ffU^^͛{y8y2CkIgR7o \*(0?_ϯڑ,,ڷ\C?WDþ{9 IBZj.jJD2YR=.\wzoXP_'-ڷ;l֛DDF#kX?pwQP̼zhУq ԢîKk2o߬I ߩ/hbkeo{2k`NI:-^ܯ9'р'Zxm QYi(]qDEE;&TբR-+d6u* jfЀGD SۏYk[,+S*kߓ'|yQлXr;wC͛'OAj׸CԲ[7Ru[oߴO&37u[VÍ;b"xK+W> (TRV(-zz::zzDNeUdhbe&6ÆEEy~;;DM _PxQTTDo9R&&q_ۼq]/f_h{nG=wgCCsiFy/pjBBj``oOԿ߶Ȋd2+n ީ͛qqg<>׻~:wy=Y6iJZ|W%˼o**u6_ZKۼvQPMnn?06ɌFu>.F/)[;**--*Q9jkD>YYtFTXx ]z睊ngբ[.J'mll&OʮuCyWcђ~׮]V;gVaW𸉋Y^;͘ܡS;"D.J?WWw˅jUrȤ?W \5ffmO$rm7}D$:s"v7))W rjQ]n]_Cf͚O~)~@婒Sg-rW*B\.73n7i2b8QD l=<[Dw@:LE*Hs\n++U~혡vo=%}}"WӉ|=&25nDt'd*hq$\P-Jevv[~ T?yx͝M{VŽ_56nڔ+6S3+~=Iˈ.,G={G1( f>}o|}g}3]_ٔk4[7L5s_¬Yw^$j)ٱݝܽr9@(Urkzti*.^yԥyms\\BC|%V-ytjQ^]Μ.vhhй D"ѓ:m1;M+qb%U s3x]Rw8MfIy/%%yt\ȣ5]TNH&23qnMWptّeer9@Tٷ CC4hȜ9DO7?㘝Ӧyj]kllz" 8BtX^X]4>~e-Z'O*o5֍}.tVsg֭b%rq? >݉ϝHPX?ݻ1u7C/C_'-ڷ;lFFvgymE\LfnNbŽZ^qvYˌeLL⎼41nW/-zX}ǢEyر;TjhHԩ/<ݣe>p(rG'8[P.{Xӡ0z@ğLy;<|\>Vλ۵\̲NwYK+77v]TleehheC&73zRW'.k{?- ݧw}i3bl,o;z}v1QI|_ߥ}ϟs<[ nkKQ;"wDt歸 Yr9@T: 庼7:nB6ٟNs9lJUR}L^^1HFD9ɇbv!JK[B!*Wz!M~T*Tj uRS׭37m:jQI";y~f&ўC%&\҂ Pߡ\PEr#ݽiSwIbcmFϝv>>J&3zzhgmF jdh"2?()9$9?ɩ,J$Rs ޻*RUQּ89qӦDޱD];Ϟ]WBBteD:ef^ r*R*uXaD*K=kgfٸQۧϊ_-QJ$rӾFH>V(XƋmF:w=uy%o̦\6}^&,a7޹{ߡD:^@swD))>/t\PEJUvv˹sML3W,?}vq⢠>Ǹ˅+Wnٗ;]}BC$h/s$D;"> qij\ rq Q鰯NURfn֖stptJǎƈ{.epa_o>_G43svEAIcG_wuzQЩov:uXH'-ڷ;lo>E)/hj/z QN3$CdbQ>2kH5TRuKPwyK$eI-͌5X}{ HmZ8xˮhQ׮%&>kH\\BC|"25nDt'd*^]RS¸эF{ jR3F:ԥy?uq ?$7۷3fuAܛ{[$Q\ד*$D//[F١#QV֓+C?\nb-zmv>QI|_ߥ}vpa omݳ;QP#F72e9QʱiӄF74Tfej k[Hh4*QYiqşTr#<ͷ{t{%dJO*-|?qiuson''w+QA D;vw(hݘ+PH Ś5FY3yHn_*4U &\>(hݦuIwD4IHF7]-X jTfj k4c"Z ܰϟ0C 6|䊵\=wР;+TY:zԺ5/#Gi\CQPDnBw﨑+P.x(2r5Fj)̚ 2gD"ѓ}Î> u?w>'>,ndp -[DwpwAˢu}5g_=3&]IdOffaafC{{/'_1bbCG}h׮ ٻ(ϬgC`A (EJobd5U6|i]I&nDSWEEE:fFVa<=@_( Nsе\=RiKO.W_UߞIjъe)V6c=ܪ$ UU;vxz].\6pgZffT-SR]~G4aل yW7?RKMե♎?8sۍoxFFDnnUCGT{kj2{숪OƱ J( wh$kjD!.p^ިϟgh/_LJyLOKHY,&ϟ hmz.QX=!W N%jk{(={tҍ"brѷ H=-~rb><_?~lD$ # }rpO+DrffVNh0Qq1SEy|6?|dGV::Z֪#(/Q;qڱcoR숂Ο'2if+(9?r9QD[. V6n_~[6oL!787[_曁DY/%"qyDS+>)/Qל9;vDh +)ٱz9v7e&b"=Ѷ] .zWT2r{s71nj ґq:gn<;tY|̙Ç͜&%) N4jԪDbQCQ}"GiiDuuLξ{&U@gܽ;YxhDFF'#s_J$M?uߜ7}!]rnZxԔo(@0lS^MvR)QͣdƲKDVVD@zOof\pfٔ[?$i3-e u2#@kgt \#}'.+gØs=vX~H\ߨZfHDYr {f5kn]7ۤ*bc?`]brﳛ۞D3qz&JJqt`vge:W?|ނ9b-6[6>n\xXߴu9.!vt)21c֬! ,Ndn>4W]~p.XP.bSQ.AIso#Fx{DEu Oݨ8u:w߾Vu tX,hʔ͛|{%op(9iQe3팴+3ΚgJv&1kϾf5?+~˖UlLu!)IgrɘRq{ןl6%\^D"\@++9;윝jUv7bqNeFVރ!oxYZtwJ4b]?;QKϮڵLW+Tkk's9õ ͩWɓ'O bb|/뎳UNIsu */IP.x.IL͐:) #37+X:/oyn 2r  ]Uu~8'Uߏ &LJ;7obܘK-5Uܫ'o2SSWW c׭#ˤlnfxy޺s rzʠ<%QD"iW}id4rdիs &q̭&M[ƭ N94bԩ=]}fnӕU1pĈ 9\%u5+==Jzz+Wfd-zQYPY9X~&? E@Tq=/.izefV6c=ܪ$ UUn?65}Ϛ@DÆ̛ʹ͍\= r43A"H=l\AuBWBYu7>57ܫUVV[[V6h^$hq>=ϗvI߽gϫFFFF)L3!$A ص?0-$onNu o@tD I=9s/aD<"q}O3>f,*˸W,K=.0Y;w,ĩOg(h13с zQZt͟)2˽UV -Ufyor|sE_}5p2d^~}WDF]I [$JIzƫ%.cw f͙c\߽oȡ"zБ &N$ ,νݻGY0,/]z:gs“/[/91RiG@K54$rscrpcZx&ڔtdID'Nˡ\\"I]O;.WD*lW9M]׻:O{=_-ܳۤ*6 QtR ,Œd:t [o\gFY}y-SfyHYj)73<]ӵ!^{"QoofaQhpm"Ks_f“&sU;%qr93 ]@bkT;Ih3JK7H.q!׫|9QTD*m#l2:=Tgjv0j7o`vVװa0,^% `fޡmmlmlmssWvZ wt.^cO?@NΎ(0\єI6>^q=/ݝ❉p<!թ| QD4ِˈ8\=F.ː!..YYCHhu ]_%ObJPPw(3Qcci/%KK]]K̲+23͆rwG fyC"ie!7~yWZ]]<Դ1o6yHhhij(\&R<]x܆@ 'u[ޓߊh7 ILy31y'{"OǺiDj1 )'ݽg>%!.!$!\Z٨&BttNrκk7rH#4{<9Q3X/N^not6vє/R  -(fM,Z Dt… ڿXau;cE IDAT#beqٱېn\KǍIF"z9o٢q7%%;M#jl,)rg%-5ojDL,|>:0СV.;2%֭TKŅ(8R LnSJT\aQffHQgGQ\)m¿r+KrT:Xd8";"DE"8ދD?e.Ad8`B"Q՚7CrHV_>es^tu)GSΉڿwNȑGh^*\>̙vy:¼/X6E9tÇI)sǏ;7qIb_hOJYɞEDtvJ+OSSWW c׭#ˤln&:{sQk͂r93D6%puȫ첽[߉dRb#ޚ#dMfaQHP;(+'4XIO^b)73'0/*/o&biu?I,8bQkDiYӉJK7SӟuCX\DM͑$>>]+IKZlҮgbp 9xpCյ% ~Pгg=ZZ^.{2a['O.dha.(|ϮʤDMBz_d'fBSf]jl|>Wס֮iYQQir] 3?];g_H@KXҢ  땖O$ JTxF}Dܳ[7ԩVVSDGd20>4^evCnY ,-}|B\%1|gEHTtqZ;Q,ٳmc'֒IŊ^b۶m4#O++??&O+V<=d533$C<Mr9@wԧ)QTNɸDlW\4Ǜ[zunX}˱.vC"鳻kD ccmmcQf5߷JPUUZQi)RybH9T9RGg53| Qiӈݳ˼9&̛g鲄$}1o+]##J;;5%Qh̘5k߿{ٿKT\~=_,^Hҧw9vrXtu\]3KI7}ysk ? ,()=M924rѰ!s˜QPph(yESz_ߑ#}}ҒV%tLNݨ8y:gАXLHtv7(9ٙ <xuP.!]C\=Ur t@|# # tT;>/5֭4lfffD^^'eTU> :ɓC]]*Ze޽{33oFn:MʓpT|/M$,/'JIDTQKPx˅r9@Oiq8rQD"]5@+pv;wǮ,%6Q{Ãv1<=CA TMEҲo)d'^?Fr̨ ](vܹ{fuPX]yy͘ѕg1ּ˜;De7efkb2\E$WT850D"b۾={Gyb-TXsv*-ݹ)=H``9" 10Sh_tsPP;w+G4292 zen=rCɣ[}ojhyKr]۾'啘􋷶$zTN2yx(PwAsM͐$RaOf. n|er9o<7_u_#a Sk( jOtVVzzVVY嫢2f5ngS;^qq^ޗjk/kl!CBBJon}_|C?(S.k9DҮZs8he3ĸ|й}bXZ>K>O7gg)ϬUE!aA"o~ҥDL kk-Zv6+nGGg9??}ֶx_zJibc?{ߗ )=E4~D!W 7Ue<ށ`;okKmsW77ЉWLF$"r߲UUCW.] 76?r.f,| {\)憏?wnž:x|=\<+_L*˥RN# :hu2W54#iFۿ={?,wW.HWn>}|ȔŅ($R\&e.E=9I@_(3곾NM͑$baOw`.@hOOOό+32E}s%?];whHKX҂a\Jdm=('j(h[W6(nܚ}4;O6[GGu);%H jETPx(9ɉrv<@ rbzը}.ϨO4cXӦZ[Os.::'񰡙ww޵?)7ږD>>)CANܪ.L'RgwݻuAxn>ѫO^8*ցDW,]u DE׮%͍}qIh2wyϾWG"6(k &L͏cb9fTݢ"]{?nk{)wCA u2CA1CAfL#`Z0CAGNx񉣋Htry˗-<|da$ZxFFDnn{y1#RyӉ6;wI3:Da!W{S+S% `F>|:@ÉDu 5oTcDű,ٳoݲ "T$]}`]{._޵ )'ru=ۡ# c='4 >t\;>/%֭T$TTV]dMIgF:NJ)$0p\N$ZHD}RIr C_|eJyr:祒)+PPOo.7'onãFZYpstrw{>QQq(T##WRb7.QaaTs)I ,({9QDg'/[BYY/@>;boF-ʡ,֍xeWc?*L*V,Yx⹸Phk[Y>Dm%sonfD )rp}G}x]1}1?2~'S%WgǍo܈|pbbyDzm/ͭ,3S<兊c }9\ƌY(e"#'g{UD>D V\,FZo2@a/'6p/NJ%+ȽMZl"6.?;'&~\PHLM_Ldklr|_C[S]MǭgP3MisۉndggeH ̈́r9h8j盢K?HO.rxZ0i[N]DЅs}r+KrTKy̺K4sz|<'eVz޽q & KL|=\oLټ('DMrNDDH͂r9h8#I$ž(ë:vlhp+ |ў="#d2)2#G2*Â˯ Q}}Zڐa2w,%;_aǎ-[& Rof )D4~u.N)QiV(3+0I P. f,D"lT\C\rWk/+3Κu Oݨ8yz~絷K$Hյ% VaDk`$&j.^q={BB[[Vp8_x'X[=MO#JH<Ν{ rpbi}j盙!I$6՚5C"9Mvr))7jT^y=)%{f)2}ۉz ÆNӖJJFfiАk}}GGGyD!AeDÆ :[ G-'[nh@Ru"I&&HE}4f,Lhf6qb޹ի Fk[]Uɓ'O`iCr*шX ZXrip|!z1%N51dG{ڌL$:\K,f*d2.oM H= Q.6չSxCLRSu5.۫Z(DW藃54$rw߿_YU(\]nd^1ମ{ӭ[n!/u(Ƈ]!0f@KTT="^=@c}sLц$2aψEamgmU**+sP:jlhDJ/SeB˥R#{a>Ѿ#FF5>xѣ$=#|3҈lz**oo(%Ł%$\!<3K$_RIF~M&&::&&)W,KvO8Y#`x'8nV3hmR\KJ*+ARP.&(ЯbWz5 +*Rӧ;oi(&!/ rX"Q}j6G"@ܲ IDATS(R"fK8А74L_8%5x A͏عs jΟGJ/Ť9:Jgy%44\4ϗqƌ9wn[Wϟ R3QHȥDvb2TGT~Dgz ji;'^ph*NqM$P Y,oN&,~Hw; w`h`ݪ2F__OtN_KNb--Jl?x&'3] /%99UVnߎ~9@cDOTk>r9cy##\=wU:bQkKxs++Sfkk[Z:LYq ш 9'ΌNI~>RU?QhkD6˖vEyڵD A4Xܧ >asHLl6fohזbGtD I&=9ԅr9hvkY I$f՚5@rx) _~[6oXK&+,\ׯ6cϞ~55lYjde%LHtJ}66D~~DNSnz泈۽(1a @cDu=yDؤZs9FHֻ:f; O7nD>ES,]N$py@=S"jn%/\{ٹ?~D!W Zn%JNTZODrD՚xf'0 Y4u͚[D6iظ>()ݐ5{qCwZ$%uyt}<~\zq*RNNvv!jht pQPйDvb>a>U\ ٳD--?B4HR_Z\?ϔ1ő'/^|uηG u ++r9RzFJOY2#Qiڽ[r;r6u鎽CASPOD>tG7'JLqBt_3B(䛙!I$-m50wD1_``Hq.[~زe ZX|ӦZ[Os.::'EGfdەm{ŝHP)[543+0 ͍($e1ּK$vK6l638C$ r@Ri{Ld I$F՚50@"08x{흞j)73uOyvu=êWԦ%&;N"I$ r@bq}j1$ajr9 6C8;gZ?X'\y=!)kϾP$mF/M.ȟ7vGӦݿ3hi13pL77w((s;2(,U!aALOr#[ljBR9P. $)sц]n0ٙ^7Zl{~յ!DG$$jyZQ} kkF.-rLf(kNDHO}ږDO':oFr@qv6Mr9h]UrF4292չ,NpὋ%ގ;wz|P҂n/w&u3 gL<n=A81#_;_4a?u2CAuBTQbf Q2"#iDmmҳ}ׯ'E"D՚55A"% {.<\uzI,GpG ٓGLHBc8QL Qo^1x&k^ND}ьra8Aik_,5#nVksMϮ]~AA_~er9=u[;wBKoY{uv>~L3;h{ _] \AD#)P. $LHIdž堉.W 8d#~~~>Rzbbbbй~bXZ"5IAwe9MݺU5RR]]HlT;)HGڒ˟F2ŎΝ{ \({zkk!)z/Xl-6\@3xl6wˆ8mMuw޺^>pq-Ĕcc?`]b}H$Hdhf ND7n0e_|$gm\N4l07Bs+QDyy"$ ĒG5f,!.&A S@a ۵%=qY^K/?z%G9<p߯:~|2ؘ`|h̨5l@3?{tTo;~#pDUՇg'Mfz'&#)(P $k>D"\>PRˠڴ&L*VEsKKҫ>n\xX+ |Ѿ}9xpJWmy>\.5#~x2(!i=Se@E\~T Ax(P. $ת|)QD" y,͛C) BON{_+bzj=bwFʕgE}s3?];g_ppsHLdcIT]f ݅`.;{c K]EĆ *`ƮXR)\Mr\Β&]Tzo * vPĆH[`f2Mb} f߼_CDB|vVV^qqVsx%%)B!br9! ˚LIJ˸e@D줔|9v/?R~}dXb%= bn>lXRڂI'zt{tKʿ˧ X؍m, r_ PYy*ac"[ۥK}3. /*rhp>z!ByqPҥ44HtdlYDUUWҊ*nY(ѡ|s7ܹf+;Rܘrbb-3(Km˦MɅ S Mɬ,uo7-zdhi()Hk"~~yYT.\Z :OKR!Bȋ儐.E"))U**gפwztfN}饙3>p@UMu{kIX[RSWgϤ3 $%01>0'eVW,gIAk%ܤS&5!OWS_ kdFnE%ii1CnD"B!,*B[VPFZJ*hlB y&7nLs#%"m Om4gsfKu0-jjgw1t[Z^rӈ͛O[pT4'F9)ֈk=| ,~@aab"e|_%*+N/Z%&O"!By\NRjFS3=!=6bނHzu-C=7y¾}_(KmKWW$Ս<1gFdԘ}mhVTn3:&&//&=z 39cCgG;wb<h0Ç)))B!~\NRDS3]NH׷O7/>Ф_3%n9nu۽{Qږ c֬YT_W_[C5kw?SSw/1sF))ӦLM茋CTUI slC] !BH[r9!KMJJ+*ePW2BH[յL:`AR`i.޿t#(Ν;w(KaRgK/ ~ O#C>ײbb-{=~λp Zb&'Sn[JWw-Nʶ7\^-qvɡLB!BrBH"!V<5I i{ &$8vSY\eիWRû;AOY H\;nC\g P]}6@l( /,o P/d}}xZj[D!BZ儐.E,.~4AHdH-DZL&|9:ޮ YMokke`+tIAhSg£ys.pK;#Fl!.@(w9J"B!ϊ儐.E,.R]NXZNZdt9 iw"/?u?LPW]V}Wtt^^t e=x[YyFFihd]swoEX8Csff~Y[LO͙-\d*sK1e23j@7q~g}9@ɓhUB!\NR2MRiţ y~|>&lپdӒwj;Ǐ9r,;FԶ-,O:`A<o&raMÇOHddv4ѤBv PTt$幥LMݏq#Ӯ&&R!B_r9!$G LJ+ OrB75~~k~ɿP/˦NٿA;Ν NYj rr”}eTp5Ν;wnL s` x.X햽6y 1g:;rӮyxddN*S!BHsT.'tIY^ +@@yyv2Yu5fAčñB?hzW?F˂-xuSSCϞ={&'/h/4a?8[ZTeիW6tt K;`k3\^r@\@MM~>e||RZ\ED!4Y.!Bi儐.B,..U4Ť.B'䅰tҥIS}ıiOi͍w1t[Z^r֭ng޿D"{Uठ'F4֭{)-Ş]D:f?+WbG|yj@"B!T.'tIiDS\2BȋcC/񿗧ʯyOF}tg1˖Q~ڃ^93"+ =mLN};9df#`a>'-8:s&M  GPdxLe},㫃t!BHgFrBH<\fGi&r.eͬivvf6}05'WnhQmOCC(1=tO)WהWN۾Y`<܏+MYM 1$3rR|"Æ[#-qD\<跳UdvO!EQE4)PFZJ*-o,hSFy1߯af ז~9p&_ -54d竪=e}  v i :am۞v[SVyN4*' J'?Zo4:b8nDyRRMiz@!B:?*B[ (#-dt@G2Bȋ3&tu⤠Ҹ" 2>7)h|h?{(-Ŏws;r`cPMp;a LB!tyJ!kKT5 *[L*䖅B]NHG0bD7#bcM4uLLι|XݻǎH#v``]º?J|MWSZ".1amP[W/?fs&nnuu >h1vLB!tVT.'t& )#-%Vq.'2lȐ {t{tq#7.!u׾r8|ɒm'MٶY l7w w8`l4JRp=7)(t[NS +>`r6m`:B! !]X\،EՈXf,::B: O>parJ_mӾR߾r!hÇ55RCn61v ֟Ny ynjj8)hhTӒIAfeQ[ +}3.4v ;bPcz!BH@rBH!r"5ci9Rw6MIHԳnϞ ''v48vf۰An0q|'*O3ٝ{'OطoZٶ%ީ:ZmnT(˗WIA[GOΎ ok3\'W:GGTVR!B::*B[VU54T:zB:.SSMMSӄ `7 IDATFv5,[ZTeKnnI ;klļFuF^r^LKVs(>xE B!儐.B,).E"]rRYţ6B.' 55Cf }yK/O/*u6״|?Kڞm nnu5ݭuqz2<cwgBqc22KCXL{B]]'' wr^AB(SB! !LVS].PPFޑ波QE!3|h?8zuե;|bco܊,++==+MtJW[m =|㓛N smzaCֲ:;9ajɝHJ8 550?C(SB!/2*B:=ѸrUai-[ ut(#t>'l2qOUqU9,33--3zX;`yl晕u~VV˷8)׉3ښ}W\ 8 '[ഠ/Z=9 0bƍܩpzXP!B^LT.'tzIq1,QFZG*Stb| q6n(P/˦~p)/]驩E;;*>6~ <}o]q&O͍ɉ>}xL:U7bk3'{, PChGNs8h2A]uYss#[Bmm#6}ZCBDDѾh]][[ѣN \.g : "'2E!B|3(0d  ږ߅o%ee] |T¤$ X|a B=nu?kޜػߛOr O{hh|}\*&c3^^&^>-jU|󍮮X|>y<{3A{T\|*Æ9K0_T(SB!IfT1({m__ ѡo/޶T_kjˤRBQ$`IAxXػrG14h;Vcȼ s_OKm$<_ꫩ3q:q:?pZN9CAqҊ g?^ ithG-n)B!E夽)]1A1a x3o={nٔ~ڪ;eYkKϝVZ^[-9Aϴ?>p:}frlg0|?XY͚E9"By>\NڝrCt7FOƋ32{ Æ]9*+]8گ╭٧7r)/7'N޻{*urACڲy-Y>٣Srׂv;:WP_wQᄈnuOF)~L2c-wv3o pGh6y"m w t0*1\ Nzm݂zS'3]gS!B,s!Ǡl(tLjOXxbqq,󭥤Ҋ2nY(ԡ널?xyv|ܰv?~G;vKK;vLcP 30b0èRWWzY6b0fNǰcP͛;x@]]H7x曇Tq*+++aOWw3֮8tKӧGu+kŬENN;vt>a~ ;w(83i]GZGMX8۷|{1y.=0r6zSSw!BH{Q y1`o`l߆7bqCnY$22gWKIܲPE!(sutu7/.Xm/}&߻wҤ7ܼ9a?c#3ĬҪ2#?`Ř9 =NV6iͤI;g זcm0a-aLc,Y, o5Ffq3cc2,-N;`lPSs.@lwOW < +0`߹ \oV9ӃrA,LB!-*ޝ v=F_1ǚ'݋-+GG{I$ŏ4&ŤҊJnY(ѤB:|Ф NtwvZvXx_kWg#<6c߇#0oؽرݻb0HgPcc#-kPE_5𥬬{[ueƃ~~|lP]0ۘRie㓐`7p !ԼWpՊ^l#6%EJ˩K)7c !ll5'/%F&mwh9}?abbaabtέTwQyQόk le[ـ::iӂJYbe&N:~*}Hի![I9׊sriI cd\`]V,Lɸu!O` ɩ6~i6϶K*u"@G @Y+QGyWYlC!BZs1y6iFKk~<|s& ƌ1Zxzuk? /ʷ`( gNj`'6cb.oTo,PG2Byz, ѨѫT֪xelh+STV-`oLP*WqZngnaQghq (oWaܼqvvzz<[SxY7AnC_hG أfcW`,yo625o4D{LLRU]-HI6*-}:#F`},Qdu2˖+ׇis2E!2T.'/`LqFxPu3o[1آc.~1gFH4uLI:|:[C,"#-<qB!-Cr``͹`׳QWL4[`7;K05b2L̜UK[xc}Ø fx݂֒Ic[x} cQ6>הG _5RRIe5,Tզ儐'ڶ] ss==s3sgEG{f]Y[nݻ/\ؽ[y&ck<Q1~vZq$`L[]hgo/ss-[|;fd[İO=6?1~\h~/W =z"A'?j"R5Э$U<'u'¾?R1\05'1F:a43X@SSlmvY۰!=s-\Fu[͊ +V^o(yp<;ϝv+Fz:w.~wkgLHL4ՙ[)TKgOY~g=#ȍm74HnTU-Tt@\*+0ej={LM`ؐkq9i6}%%BB!֢r9y`[N|]3wۭ{-_g/?냱gmb|T2>h90,c,| Ç`یىCjҌEdGiI3'!%F`~hٖ O}wc ] iI[P^?q)]gL9tx}'*~>^tSg?0w!sg֫k_}ӹ v knHW;.~'|_\ }sw3rC# { Nr+O PSO'竩q<]"|n\aCrs7mLB!kݵC{1؎R>#;K0Dj]p!@ͭ[Q@޸`SS.`L !Ox([d_d=槹7^{'aL1w{!F] 2^ʰ1bS1<0oAs3k u_3>gv,̍wϻ~"\U@'۷VH豺Njy O<;` g<={ٳyV 7jz5SF<@޾,C\7=WϹ5 hjL[}!o9`Jdxj`6qԄq#B!trrBڙ}U0('yrvw”HK׋\&SFyVVl3lVT1 ͏Tx  Ik﨑a PYy/>h(1/¸{" C s_/)̔ˣc\ݹw6ϋ-=͑ ` v@[?NLK;vM3v\~o`ŖUڵ}4ԹpM_8#gNmmA\0Ư?yr\\*B!儐NL,..E"CCHKIܲPkB!Yd#_ f _[Xh}#]+'=ԴԴ0رɩ 'g~0?J5_hz**qKK=|x͚i1 (w3a{F o1~vWW߽*]]n*XϾڵ_~"e8J6ƿ>pu8d_򊖖HdxxX/Y>M>Gk IDAT68 DR=:c@G9]/kW>}xt:4*@T=3}J,64{N먩U!8|F:ת%,3_XL"BH'Dg H{s.7 ;nSFZu.GjヘajʷgG3CG#{2~ـ(/6fiɽoDǸ꫹|l M>Reo3q>,.ϟ_B.{@M>myOŗ?5Glyv Ν:̙oUSeoVNt37}TO>r}P.qwn:MM]@e99UdI#ܽKI B}P1r Bn<xmxc˜utumm;|}JϞm,ǥ`Դ7GV}umMukM!P[<| Ԃ9 cܤ6ठm EEiix-9xz,:euU;0qB!BHX")euN6:jBH۸ѣBgxdG.LM<3 v/j 5؆)tua+mB9k޴Bu=7H~ǘczY3ov9x0%Rop/s#"㮗"gd4r$PJ/[a@"BHBrBH$q˪:֑+ʸe@G2BxJJ"lYŅ F+{b+ #Ns Dz1o*.Y @εBln"M5~rsx2L땸-+ka^jmm >kj┪QQFᚂ6-⤠흚O\IAG9(ZκuxKʶBftĈxE)^ysn!B:?I$ťܲHЄ2:RYEUc]!]=I?Ƈ+hF+DƝo  bƆΎ؉E"#UEj?8}ʽbگP8jjx=,Z1t-Mk+E%hhwEVOĖ)  mNr8gn~len1a,(l))Ӧp!B^\T.'tJbqG U#*T4\Csu LY|/C|}S\ Lqr΁\O#抅s8\L44o-t7o p0XWGk^>_];|8;Q * 'w/4^m} 7q.)SBy1Q)5].24TVwPMmdj18"85@SӪ(O2q]77rqc \fTzpaJ=-`GIxqGt 欭L}˹LRSy p7t[8{{x Bs;i}W/<]4ZlByaO)H\dO*LVQ- Ի.4iNMe/m>}(GOxsj! M<6 1q?@U--aӫP>|(' ?;ͻh ~u9Tr.w6N ubiP^q2@d̈4)hQQlm.Ne{"ۗ/^"MK!儐NI")~T.SFZG*x41MIHW |3^ΑL+Ssoϸ,G9zff>^Yl!!6lwʽP `c;Z9q8ܾ]ڮ˹>otRФz#϶ b9@e˰+FˣLB!r9!SSrHHe2 r ĉp"zGFPZ| T!a6nؾې$&ӹP>Q<"P׹fe5wr.jkWăZ hPPE涠<&t3+ N2 7w&!BQ;ŏFCDFԌ >u(#tFl = <uuss,}* `pfx@y"#G:݋-zzrM]Byd,cg]ۢ˹+ठYL]ݹ8Medn>z4W,gR{qޔ.S_ByNGBHg$?UKIʽiOB:P~ԫ nڱ_h+^naLxc`0|8'Nr Z94 9bbݜP~- CJTd/rș]Kϝch.d^T 깫{Uzk;iw;!NN"BHr9!S=*D֑7]NrB:lqo jixIz~p^&~ nqnr\42w:]ǟ[oi*S24{[gE5N Jچ)8ESc7ߵ-Ʃȫ)SBi[T.'t2'v(;cQ^ZGZ_Q-S$#1~cfŻ@]93e#hjb|^ NXmlշo3!Qw'&:4mȜ98)h49y$rG[;.&m0$#2E!BrBH'dO9euIdj)xbC23?k( Bq33oo?*/ 6GԲMݝfvOvbx׍;+Σ.S&V<95]ٓNNؼkg> a?-%&7`tE}]*xD:*/\X[)[Biձ$ҹEEܲ&l%qO9q?|9@5kqnGB?+d(r {h$מb+Wl!F Z9^kUUEu9>]Γ'OhiGmC2 b?&zz5N *h mjp\ ¥+nMu!BZFEΠDͨbT05]o2Nbb<,aXYb2laa(!k052c-}~t @\h_3So/O\ӵϽJ]wT]}VV\܉qMTƸ{C*0Uc+td. _|5p8@_Ӫ_BWcxȓ쩭w)/ieiht3ljl]>:z,͛<=󝷰qJlK"{UX%K}UY/~x]SfLbg|y . ܉ ?pc !BIj\je22HFykahz?c1kuk^3g1g:w;'NbTc(ߒ'gCm]1c.\ycŸFzsmoI,:52;5._^ rrgǽ8*W:s-N *+ssBW35l,?_Q\| @z˥rF.Æ'7+߻S\ƍ]tmuՖiggC7R+SK&om{+;)r~X/kTOJ B!D.'./d޷wYѡᅬ?0|:v쵅M߼ T/]UxcWYpv`2mOt}o023N[wȐn=*s Sd"x)y}w ˊKW!͚r, O?}l\cv5o4'򲲚=sтCa\ꫯa/KLi)5bff?~03{{{;ŚAzA31Ty`X[74N_w^pt}1fL`G.׮Lڧ˚ߞ@c솘ڽ4h&&rƩ37N;uoa!XHU^VYVW;6+YY't􌱟z0r1,e8ck񠴜Ǐ=Atv33  _Ɔ8N11ؙkA~f2~kly}ѫz ;7_=ʽ}Ծew|uַX|e*Cf`81-8 6w 8ŧ?n(,xeFr"{j05À1tOﺜم]==v5+5kd{NN[Ҳom'e\<1wpQe_)](&vbk5V][WDWnEBPIw}:,*8|̙w=`f,,~-9@h]/Su(U_˾w.GEq鮽w0ի?vabf߾QvfF|ɖX 2sjZvNqfeg(`X(($ [{K0p 7dX7zmcciD,q].4cnVýsQTH%$$%zl 0 dpSӱ-ͺIN@B&YZR5鐌! C&G? ŋc\`nMIk~hСX5oc;u/}s; 2˞ǎX̟l|wlOAQ ''} &MQ ^QVPk8'`nx!`@FUYZlBn\iMQV 叟I(|=lM[R99Oh+,(cd #uE*7\hkO~VʪwC~ UԠՓ'5(w:B,aJb̝Mfbb0@ȱ$QUeU#޵}A @rF[ك5VU[K'ȘU. KL,,LL ag7[*TR+èG~7 m܀~))~"5e䛎z{]. )‚2r?gzi0K; @h՚CaV6K 3«Vu﹪nUz98Kz4nK7pjjjjQH 2ߗY"55g_ zy:t3bшT:wnzkb,a11Mƌ13URjA{u' 24B 3oűTM!7oEuEAhߎ)/}C7O=yͯk޿;e%B,Fr\:8vܥ ul! P\jīۛdֺee55ee9BR ϵj2RV CBh*CA(zZ [5 EZ6$*@I_ 12JDH 2yAU9Xk;BbQ"TB*uF/ W[ ]Յta/ƍ%;@ ~\NhWf d`vwx؛`*Y ,Sjy }͟]^T -ZF-f3'MqcИh:KC45b|4&|eB)gl? qB~rizr~!L9[c- 0ַ0*r{*yt)TG;ܟ1EWk;OxsW[s}zedf|h}EE$Q!!)ow)zSaΘETRRS[+d3Jϸ {_}hj~TuUY7M2vcVVP5q6ɥ&xh4-C7l\¨Qk oG;v$KRCG?&QQZ{/)Iĸ◕z度ž=\>nIIϟ>d4IQ>};Z J&rw ui;mlllN1ԹƪwRWmxAW)&z7峅~qk|5{4l:| +{~>4}НʱHI(>l=X,Y٬, uM׬DXq=3MK{[}=v-"r>lT{%n0ͯrkwcB=};>l>w*( Z޷(_RVnb1f(OyI,/2`ԯ[[,']0t֡ɇL^Q6}2`6*A޲' WW-_ޭė;y]>G+!45)eǣG-Ο 8>-0W˿ Ef.XT4ؤ`xM, Dȱ\ goOY>`LBav2vqͶkֻ9XKL!7nZY?nqOz}k5f_%""+) `A1"Cθ%!1g9/JHLwB.Ss7"ڭΧOecrҦ˛ /4„84hyݯ}߻7xcLKy4BnM >{`rFq8ېGʪg/zr00FDVU/+va]AS{bVUyq!Rl}2~;{>8ٚ}>+H6 LBLEqhPZ ?ֺ,Е5rNKA(=trN!aAiYC3 6-,TUONm ~b1-h}a m3Ew;5xC`3){ Xl ^[?ԪvTr/\BH[{dM!~۬炃]]Q#/_5o3! !a^_%͗Fj#ȁ[ј@9` ܋W5\l)-m΂;w9q'q]7op+.^\{ٳÇ3fܸ1cJs6۷#TSs˗&98 p{߶E\oʪw+^hj|iid DK~:I){/zxOi+|~ĭ>Q[}˽vCFׁӵ_G/yC= VKѺ~3x Zp\-/?}k,x[[[QA"8x|Sp톜 g^ cb]_nlg.Bn|$tUKó)<(@ "ڜMXc?),cyWQ鼂rD]G0{tcs>_:;9ލ풲^_ hy<xjjzjj{wRM ]SkJS - @t~s'B*[6 ?n?ɔocilTqBl*+kk' 0`nS8P4?'ǣlQmBt*óO/'ɷoOMGG#Ս״8bo_[{MU&Υ}qN!ޠ@}-U;^)-a1SpF\W$+*UV1]N@23KK33Q_ſG7Gn<4\ vM@IVS]>dsPtFQE@;wxu|coøgoߣ}8$cfv4Phfz%r*xSſff_ &QZz'ŋco߾u `VO[TTYYT9?B/ڻ_`#`-= VR֕ 'S4\/NE )(;d0P* t0gC\ky 畳`)ZZgx+r^' QSSR>{6jX]ǻw--!( y5OO OA8qs ,O,BrBR"lKoA+$3p~KWVPRG=\Tj6e3K =iiiic(vKR|M6]곉ɬ ;y--..rRAAu3tpXquqR?́ 2ڸ~~g7m-?p>fD=kT0,Yf2??uFu B_'f!捒%%/ 7Յߚ'ŲN5P5?r+*\ooz$O ޘ:Bz,j㭩뫪"%V~P۷OCD:8z c.5o0mEE~~||SӮĥ0mȇ 2-ZrR;vJ K SVVK)Hi<4%%^sDG#s2wܻr^XoadQΞ5RHMu+ݫq㓧7ee~|^eQfxU@k ~)WaHhW-=w/6uII넄;fiٳwisW5|^{PcxͲx =ԝB).%9솳q`%u_ػo?㒖F?k8&c;@  "ڜ1XәB gfIxI9+5gHJB˽tp0ßf]ttH!!ah@{ .2 ?sf^ߟ0ۇ*T,:6GTTnnT1++t\ܦYm1s 6!6E=<P^{խ,.*.9ZG[Kx Bc/zK4^Ohx,3d ůÇe((TRSρز-[˖1 ]W9&Le=[F EG]7}=8^!%ESuh| +5fQ?4%ԍ_.GfȀCo*H}.c5sC$&^3>AMmzugPႁMx!|>[n*f@ D.'9m-qss%08n)6`|%8ߴb۶ /)Afǩ%B ځ6]޾ÇJ4巾h"&~WoN""vn;}y05@ۿ)pQ~a۶I}'jj^@ho0txy0-TV *.a&BkE-ihh;Z]G/񗶘9s]'*7B'lƇD>.d{K06A-xomN^\=Zq+dXoJK/]QS-,[épei)YIi ji!9r{ׯdaIğ ׂǢpYYVVh(s!.cXU&Lx4QW8rL@yr'z"?EcTJQߪ`i z_M[2rr ?^Ώ^쫵B1l(XӟCo2'`ސ\^3 ])/'4\@W9HwzUE{3_W#Ch]ɓc`%>"[65aqZsŕ+pn 6|#俁Od*ʂooA՜(bbW)[>l(<@]m-:ii8+/E'YY>>DSU?KmD97'4\`c\nD{ms?XswwcuS\M7g|vCV[ʪ\nZ]@ M\Nhs;nwt⢢&M߾y6?a- Pԇ\orR;wIӁ aN^IcXB%~"2q:^Q{ǩٷ4!w0pӰOѱy3 IDATyѱH`XӅS~qo:4{(C"<-I/=mNbgWUVUZ4myM7.Z0v‚aSd?Xr'rŚ5+W8ٴytc-CrV?h?%_ׂUP4Op…f_\M #]5Cogϼ7o\+%y*#winAz+!( Nw!ddticy޲-[n{Waوup̨KWۋ*+33wuE(&qhQd =4TGAH_BTTRD)#ss## bT̙L!Ok8솮ͼG?**zn ϟQ10Cj;s!QQUUQQⰫxK$ yYrr66O@ 8X:JJNt=$)9mRq@3d !Nvew$%~"/[Y{k?ax]nnF rCUOAjCHDDI !]RSD|GP &N\01X,,l@ _"~Cy˗/A{?Bo}%9GeuU@\oLNQG,cGBee9B2~Fs]ݜJ?G[k)17- ہl’"6GGS}.^^T%92r RUo~jP *CKjc]AiS{FY3 %PtlF0zԫqe0D@2\fp(\B'NB`v5?_u5]]v7*e yg >z:}z._gcӼASR _ Bz{ yT]ʬ,85c㎻dO?:_HN~W߾~f zg[u=[AALLAmof&j|G -@ࡖ~/ wsrEEU2wr3~ϭ~U_͜{}Na}dU|F)0/&;-Q\PPռp1zSZ•Ԕ'!r9Цܻ"'wʿƃqq:8䨭moTt#uBo~!}](Wӵˉu8rAda~Dl{mIBÆEGen0oDk+a1ùv̠ W:TؑcǶ_%$=s@+AH\ {tvB x<y?_z| ^>b'=yRVVDDVxzjp]"qud:POikCPGPuY N;vtȻ glvYꚈ۽r9s3l&'"JFlX BDzCʹmoЁ 8lk{ OJʍPStHXXQ~gQ@ Z"m/LL>,鴌 }5*$s V)^P_WF DCB7k۬C##Oive rvv Gߗ1^{23]&ooȐt YwgϺ2"Mo{vgP{mfU\ ٴ'@ݐ̌oܽ 5/t\uر.u릡# @ثg΁psbd{,#$,- dhx!u̾+/*){ȱjy*zKIA(?K!!5i ~eBK eeK :w * 0{>|ԧH۸wBρyD|Uùj(Ħfde1{LHcB*.]s?D(~R_D-;>u:RYx.US39]- @;?Uf RTUo6xޏgx>;tDM#R(#$6ʅ|u 5$$ xup>4`.]kОQT@("r6MBMf.BƆ~uLg&xzL&) dd,;B)L&| ))ׯ!_Y{ cXrռlhλ.-i][XXPPXY)*%+#>]dW]c??DO?Ci;sBT\<<&G=y4;?;:\3'8\zuՋݾ^UQFKW!$+ciPEyzU%@bbpPZ'Zia gc++}}Ǐ,( xST#-: %gg}8ǎyd()2 y^HhpRmuUA BΈ%$;PR+ Õўg2EǰΤ)&Maa9yˏ KFEyi_Fph變CGS4:(KH4!e{P>fug_P?} o"7gޞbQ!ާ ~Znd0h}:HYOy~:w%s0G@` 4%&]8O lo8='NSDrVT <.:@hSjjK[Agӧ_RL[riQ~rS}c'']]Y]n_RAvXj B* $!SN pq9ˍ 5/#19 |dEXX2L'ލYF惇 r"؏ x(EnjvvN x݊OzQ~ph؅3-Yes,Ϊ 󡴹>$o/_]ntg̳4cFIfuMI_djo>H}1`?^  dzz 6 &sBťQ<'%Ah͇㉮N[.a~{*BPm([LJS]x.GmQ fͦq!'<>PjwfnOJy@hSx7 Q"d?~ ʼn^Fݻ,%1lѰ?aJoJ͛p3 ) ӄ'LsJeDwQd),)MJ7('5b_FL# _yvݬ ̙1.6jPȥ<#*62~f'DDE'{{>NN|FRڳgNCc4egtt`{Muq1UeCPU?15VT458|8YQyQ_RYsrղ_"*߄spd0(!Pr ?=Dj Z(47nܦu|!YYK˦?p;:~ibS Ikv9{oqqק+#4jDzf|oܰ wONvAv##˸{JCeNt1ILƶΛPmuY Br2mKH4^b'޸1qr&(3]+)rر补UwnA"5!WFӍ+)ѡe^Y[nm[N>pjzit1.^VWTW%c.ՅUj<@p`"ǁ45G?ДY3Ap= -F!8ڧّ埯mBn IDATtp끿_8PQf KLdn9yܮ]-27WR>P4$u`7_]7D/rr_] QXȬY{ '!{] IʨNia9u],\)%I BC7P\]d}=IўƮӞ?3"NGV $xrMu_ "lkEBޭY;[J[=33mca_p߃s rkX 1鈑swo_?G$??0%A_ \^-uac_5ۇM 4 8A# u-lyddHQa,jA(O=i@ 4 @L\0Zx7޽86%&t -y:ԉwW#<EE G+\xany_rTIRƎkyEWx1UozeLdh2t녑#]6GXm-[lGyٮuAnޞ:+2>1Cζٿ]¤@TVfe! Uk$"ɬAb!ި6ZZָy{ɓoߜ<Ǭ(p6JH*Oei-{%%]Pt#r YF,k}5e ƶyǍx6o~Od,!4b($d?ksX[͙#//*J8QB¹sCȫ1y}QR"j] ߰WU4,hQŮ{^@]' W[ #5c- HhkyM BWg,z=}8GiW >}B~y{4s!~l\aB&F}ϧ!X %ECCJL8|5Zx8Gy$$= ^[]^A$"-⍇<<=N|IbZBrZZW{岝F{n 12$ e@ȶ:;W\.e[n{˯8ZRU˺cG_/'GPzϖHI`'IqCmEfϦ[}9ͮs/*5~+J{sϝڊjY/K=`#=$=ܹs|pP z6" AkX7CaC.]{wMML--E={ ܱ35^ .[t{z\K $rugg6Jߐ6_&5U%|MVVvt$>"CZ}_KZ;v.O9pKojvm;AAAa)j=zhizd ލVTf %HͪNX-pcVRu[~.B44z01VT41!soq÷!$ emTF(+#*:={Vš,ӫJCCyyC&NZ礇G|U),.)eMC}脎*-$EZS^C ^lK88hwpp[[׵yY1g :sNW Rs0j\׮FGS+fwQ1п%H7l+[^di\YYYe蕃QW.昙+)XL+!FPb?a(( 0RǹD j` !&U\!))c#!^HJ KJ_,1VӰU^S WO] z{lj8${dl`lm{%`\YՎպceh'']N ;ރcGYldS>[sw\J/5M90"k)h냯ĴAA#S (@ $@jܾA&NChؐNO|tOiVS'u5o55EE]-'ϻb9..[5%LzՎ?g@QQEhȌMKJ`j9%BEuYZnYV{yZuJQvfF>3OZZXT8_Iѹ)".dv#aT73TaR2n\1BgPշ~ee٧O >}ر\+ ? 0l].^lfdfm.h?HYX"T\ny q=m(<̙--on /!-վ \BeqruաѦKfؤCMmSᬞ:RTGzͦfN쁲9#g [Z)Νy#BrtUzvy Tnvfo%im?}K|9L *.AiL̗'J_.)f 0E5B+َO~B|rx>klL6,*m+6Es[5eE㳷&֝[n3߾=szHUyQ18|u 1 9z'@.-1:tܱnzs^wW-`VsT/{}%{?xyx[G(awNӍjiJK`l8P|铐I­A;O_S}`o@}!=p9 ;u+hvt]ץ+G 565gKB¹ e gZ(ʕTL81qǎCď.WCu*hAh^Q7~u`ܔZ?A#G m]W6_!3kaWCph_Re?nTzf43m}ct—QX|}Bh*Dͼ٥bQvhwScle$M(r*z=LK"RU`𡌴Y:_Xlo@H_v,=banv {v<_Pp!03¹1Lxhk+)ik;ZZ`v7>"z= #H,= 99))93lmgѻ}˽}=EX.HI?~*HUȨ7\X[bgg {e==ϱٰ~_MJ1B5ՙ**4aqkgUU:7^OaflUVRXV-C/pr/_Px=<@)A;~yyCFF [[[5\RV3(D y(VQ56~JK9;;;mvuk7g 3r+!2BBHH:xN[NIIV8(*ҫJXt5H=RkK] 7!o':nMCa'p*]D勵S˗]JRys-DC}Q@U0NKŬ{~A @!&^ Ɔ[[`U65<55"iO[vhSSPsː3+gvhyuZ?Paѹsprs+(PUwss떁:K@oDkɓ{pt;?_1 Joހ{Bk~Zji»Ϣn17c݌y3UTs,(9Is+ Ms::{isE*)9xrxȅ7ެ Gd˲ON>rdW#G)AG DǯZ9:2hZU|Bϙ-$kꁺ UQjIC}?}ZEW.tv^RK^%jeqeg]g{Lܞ|ſKMG(&j}/lj"ySRT"_I-|6w^^+O?pV{Mnk;}ƪ.pr**sy5E|^x}ѻvF SS5յL{,N]$D,iYGupHK'@ ftq鮃Ų@f%eEa7i9w 6r$+$ a8cm:Ra_i#Ǩ'-emEE@@@@Ы.' xs'Eִff|̰TXWWZzfVƅ r,m 9|RPr6B |tu<-E q:2jt{!I QHTTZaomiKkmìIڋVP9nŸqʲ=Ž?u iW !fo{JN(f e%Pn/.sq$0+,w\A % ,^Ç A?W!YXU#*ʎO q$➂RSm-)"Tߒ8W@:#ѩUYYL?s\bk.󧢷a鈑MemMI²44}L>]V_kdd󩧮@;el4PmM.Ӳm?$lI~nm΅w VZv.B]; Q5,tuI^prx/?9i$- G* zE ,"#Pg~SIIIINsd+o[5[>B('.Zڡ"~ 66[𝊂Dlګ+>AAAZ /oA(%/oPso{*#''g0eB>4q?񉁁~e_d{[#g}cg3}f9mnޛ*+384A/ff?b+V*6Wt(=:}ѣ^^^zN4 P+pd)(5m7+/:qV]yy=}M,WBMKbC  ~KPoŚA.+V[n-Nh=;v>.aD XZ^#_St9L./pM1vVg70ҋXP[[,8?>@`@@\L@@d}My_6yϮϬ͛  (O|_3FB..{C=D]]15% mWcS> 2͏< LA7 t9FzЎ)@ز?܊?Fss{{sw(UQW-X_oGY"C^Pwia mw3 9?M"-[1tСd>v{>]eeP WT@ס#4|($45]d|@?{RHYG"_INQUS:4c-4V"'׍ {#~S|~u5?ʹ ?(/=x(! |܇nX}۸q۷ȼ.eWLNݏ91D`w7鎥@4VX**?ZRi*zcOJM?ujW{RˊR CRrSx3mmY@o|sW}瑱\{{St9NSQmat"j BM----p.] %>10 4 | No….Vƽ퍍 W5 $-@Pt I??@^>{I6S3b#4I^53uB*!1/A۱Z}A@@@@@@X0ZjeiX*#b!1!ECs$25Y!5y y`c0 !PXx<6]ߩ*!ee33)x>BbQL= g~$ GGߥ $AiQRrsMbϱ枞RRK->锛ьHK5Z>֥S &/d% i IDATZu/ ^DTjQA[67;N]]^{mݏ1!}99UO [24F, mɴ}e.AwBM啴q5_8lz_^*,/MR,(~}ߎ&w{ *541T]N+r 3g͜Eߋk:07ؓQa%1?Q$Ѐ?!;拉g϶=[]JAE]=*/7ܢ1!p^^,$iz0bd8Ç[j벳Ao_#iO bѣMMFfodkFp+y,BwͰ>X]#Q ʣGJx}=yWRJO?)in]9U-=S@k :48oߡÉ)4ej.enj˪5˗;9._VJ&]ҵoie]-m7Ӗ_<էOe>臻vA%aaf1CwW͓'[YMsOj*:ev(А/L/,ЈRT,6|HT_Ͼ"&n2Z$Rja- :;n^PTǛu~lGekgifm b]&u ZѮ^ ǡ>a/N`ٔpriţGmm%'-;u3Eru7n?}t_GffO^9)]]%__PdyLbϵ6_|Oϧcc=3o~^c8/"+R۷g] /\zyEh{2ȑK^U<74 C(77p/Bs(XՂ˙+}Dg1DsAaIwl11M(/Nv `M4K#_$m, } rr/KQP]\#+yZ*hZX=iʞ~˨ɢB|< nb^WW絳3=/W!ܤb0ח >yaLL|f 45 hݾze^RoN@@@@oԶ'!yWut,^,l_J#rAUֱ>-]ۺ[pێG?d._0cjLͥ,z_TTt2BQ1K2*ʶ6r!U˻_XLOREaY 326fnZ=f4BC?6?uWV. yrhӢN7eeYYeWm+* s7l{]61C'/bBǏ"g7RT̼{5 fo|L7 3!"%Jg;eYgBXVmYg}cgUP\~…22=IVՕ9rH1|T]U~΃V47$p=ł+@'; '{g?HH1hj*/vK#T"fW*+"4j+[0JHy=tַCs;X>qK@@@@@Arl=uҀjq"#x'¤+ckό\Dh m&:XLp׮]&Y0;s:)_]Emm3yieE]JghΊ"c[$ڿ޷?m:t֭]РU:06zࣧA|ƏEZ>miFmmlM'N9:9:[uuztVXzg#4lɓ(whiTQ.70Ҳ;]PKU+25?6 7}cks|7䔣G슉޳Դ/ppX_c+o^zN˗@{{c#-XwUu Bvvuq KbGi;GTeڣAUƋߠD>\L=5hC,  =w(H9P^UEO.t" ?~3%xp7SXirA =}f!TPtX8"4cZIi+ LabդRVn"$'7ϝ ; S?c$p_:L-MqzÇM;|X]]^^] 9χ9brrھFLwOH9{~ڊly iYyxǍ]QSH3jAC}@gDٯ8<b25 Dc)X["TQO^3ٳ^wjiiooisJ/wy;w5WmvvZ7v4)JU\.s<1^IVTJH :ppHXLi|֮tu]^Ẇwwc^WV0E0cTU!$jRSaNA碔&ӱĬ(,@Ht^fRS8c;N=Ym(]N@q8lᇈ?|ya7ˋ::@*0۱@_ QW-(Fo暛> J>d1n{|8Fd 4|K\\E߅M&HU%9gθ껹mZ7R?xmGHSjOa>5nvmjįOs0mCSPPx^l]K^q2!\<K~ ԞH% g7w;kvXA\]J='Fss{{s*wFgE.Z -D#h*IArLYwG";BBAFƱcYRrJ,C Pӭ9|PuXS χ$݀4 99))9lmg4S07sǻRV&HI >fhjljluuyy4Q>!ʱ:֖%"ov$HK3sߗraXc)-@ۻ *.z}QWCBҖ:EIK,+'0az7fjZfyUy\Ns'{'tW@t̮)bqvyǑ73[L LMhB\JIfbV. #:1o ެXZZRRZvK/3i9$ ~հ쬫W((55luugӳXGQ_?DU&FI :@/;`jPYԳ:4u1sli@l;cRR2;F?ܹQJm?p>$idJh"!+K?xjnlj^,-Hl4:<+ASWii55BH:A U[kjD݈ܸTQ5nŸ\Θ434^UeJ ZS'= {==Ϝq$"*.d=|$dW#G)!Kw=F"Tߐ_k&(ɎuƛY&x> ov^ [AՀrjl(#T[PEe|MCTp,uXtr IK9;;;mvq[;tȦ ,=%)$gWds'gm;;I +TyRs͆ uj#TS8P [\to'UU;(ik+*jkÆu77R45-_]WXӋ cq8"\A]FZAmɶ$5o8YZXT/+=Rk߮UUKps:UUO4XryS RTZY̯;7mI<:'-4 P("JC(URgLDZ^Ή=xeԆ†=qxiflsCM(m'"aOkH{S@c(0۷yw->vxܸaZF"RFD,TT$$ tU0^k;zD544̈;#Ңdj'O8fk)4bCːsg8w6"#$?bQ,bYZv馦>s磏v~k7~g'Ϩ xpGܩq+T=`,僃/"dd4sƳWxڸ2“G$ yy=}M,+/PRR[[Rx`߮}r ˅NNK}VvM *99@qu<l OQtxc{[ Z K@R{E[gdbdDϻD&l !Ùױ4__V>S-5Y[SKL_mڸdFP9 B!Bѫ!TTV|f@l;F/BETT5 ;fD|Cl2$ΜR^@ =8ia[^6̥- KHAXu޼嬬?zҕhiUV2r0UU'zQJYnxv`s`^LbƅJs3s >y]xqP]7Ole5ysZi>)|B:|~Ӧ<3vȮmv{T) aO+i?pwرffcV P8.nZ똔4hǯ Sx9! r8 =:JcH70bTy' A qI7PYsm 1h`73Ĉ߃EȨ!GhNǭOGgFG'd J]l ]\ \vCeC,~KM;u|{vӧu7*h4@}0FCAAODZ.E"6O,3d5Nu%1%1qr._VVr,-HIδ 73] wF *-4^ϝjlYgp6lK[{ꪚ`v(!l%]r2+JJ[=ǚ{zJIzY޾1Q~!Z@KCXYY7#$PM]FDsY$.`(, +YW,=e,f7jӣxayFZ\ɦ=EN L<Pogeg #]C3ӻF>{Mu3;7l鈿oba,؅cGOJ8uV[VQQF+td55%ddizo@ܼ=ut@!;} h%WAet4ܸ{QE6fԝ?ک@>rO@ro]ryG<ޛyhLrLN6C?BFsg:q@}n͛&:j&Ɠ&Z[OԷ ٹ+mB1Bv6 dZL\qqLT 4%R@Ņ®cb**p!M W71?(ijx֯i IDATlsCZ|"SCi_'qÔIl.x8>zPN?N27;VCCAw6c=qSy 2au;iE} ]׽8޽;CJ&-#U;ǵ|]/ZTAn[<Ǫk׋{zC54h|W1 eh=!+uRVe:ߩѶor׏GPNV^]쫮Pggz?7hP3nTE57 .dw [[hh[*+"s-ׯȃ N}]>CG JTU`}577WW77gΊEWtTt91"1'+Jl<%Ѡ ˠ߳~ 9 (;A%< !~>ՕU-t{FFӧ?D d_Aߵ{~~KJufkji(>STȊ8V*ܫaYW' *gjfjD,b*!|Aca =M5(;PXPZ :Ea7zI! e+i^XqOi% y;DXGvb6(G+R?螉v꓀myG΢5ʍضMGS(P+,JxKQ>eg ]zsX8x}9u3_!7n*&**Q'B9~#9/J8 T 3CΙ%#!z19PĖnVWB7㺏=`ׯ1vmֵ-Z:[%Kk=}tH[zGulڵpA.!/^{y;ߵaa,,QQf04ŊmBss{{s;ٹ-RTȋbЉv/yb|)s9D/çmW1U􍝝pw0o7 KK+y{1k ߯7zj?x`>c޸3t:jce%sj0b Hˠ?b@ewVtBufg#t4+)#4;uc96fL??',Knxh7yD>+w;{uU0!)O)Ώ{rɲcƘCF!Bp\ލ5ߧQf:C"4lHiڮoi+(kj;2cƱc&XZJ7&MwmT+CaqZy)̛v.dޣJ(+0{߾E- cEWBrg䰋W(#8%%1Cy+C=)4]x)>Q xhi1}7 uh)]-Fhp]VchkkkT(d#TU*sB5^JJ&&.9 GPBuw"-,E/KRRO^IM>(nhl3l,_c܌н{ӧQ~S9&|S I Jo`⩯?nqlnۺJ,u}=NH6W{_ĥpui%+--voY?M`, ˩ B"qT$xdeՂhС.G~h &28=LYP.,$jgGK-A<(/3%*bJ&dZt8B*6}մ 6᭐"mY j)*uZxNֵk,C66S56!g%~V`yBEWUkkeQ\3U)9EUٳ͞MF!#pɡlfK e - ff QYI~ʄiLOxVħ!ڥ@q/PhWPJzy[ZxM`dex##΢uG#,!+1:JɤiSii~zff͚manv {v<_Pp̬s!#G+ӯf51,L1#Wf_H4YVfZJP%Lb&g/Jm~= 3UU [/x*nzP1J(/N˒CRr?n}o794WwG(Yl@AGq(#z{::ZZ**t\n`M݆vFCم~"[Y8p@PPB|!TcXՓPV3Xd:?7u댌TT:m_"bwYY}}YIɇ[\oX +!%-+1u8nU~΃V= `y=(ɼR6EH$O߷V`x&}C=ҲQ~TwsGhǩ,-Ϛ*PXP{GRS8E~oGw'=93v-忪G,M6{rAK}Wre_Z ajZ)z;:g_BmE_HE!TWgL)]IT% r~2N|TWgd %NcV!{ F/#hkE((bA?'&K5֋ŋg88-^u"`PT|BZC#A~ӦqSݻjm6|DUyy#MG akiؐQi?Jfϧ ^.HJ Ih>B%%ׯ?l> X~HZB27n|XIi| '((t6i+(?r( }ܸ&c$%U`5U{Z6m'O+ $ddࠋUH˝<ޝS:nhfl  Qr}GF8D96|螫98gF%*Tgr܀z,VcUVotq^KfD 3²cR L>H}@zR<(>?}ssuus39|,_9yE *X"QffAkuEA֎8;T]L__Y{Y豴XB"U>x[I/#?د_Pm[Q{ HC; |R0П0 z*ަ:o嵵!˖MR vh # JnނnK!bB#Y; dgїO_w/ Q.cGߣzKKC2;&VCu7H:y NXɾT9]7B36^Ch@>Kf\o\WwhhZӴWB/2v z]pѦ&G ]\nn\McwP#Cql B|eqț7AfۦXU֖Xmc@\KU L>Κa3%q'؉A$;9x%9uw(= -Eun/F.$it{GU03 :D[vW0N.W.tv^RK^TQ6T7"s97n'[h+) zi:NF %ef??*,99^K7ntwoշwijTssJS[[m-[[))RgM}}乶Lu^z3˘RΜ{G[CHJa;45\\I7 ,*;")CiL*ea JwbQ{ )e}4u aEHݬb^t :`Z/Ūc #Ad+"aZ^Pm].jχ l;>JZjp\p 'HISu#4pW_ ڊ < 8TS6Դp FOo 9G%'> e~6̨߰ao%.ԁJ*w^,ffKЖq&GB8 ߃D8WQ MMEEMM5N5֚좂)aq|^؟7q,\O5V v~061#n\'ڬ/\6 E ͥƞ(>c*,|RQa[?_geN76>/ʼJQ4=#>]Pp4.& u,Kmɶ9bn fh="~D "_Xy>S\ӑ+Q$%hk;ϝ$!#@$LuT yWò^SL=yUUyytB̍WP꠫*63*/^~oФCn;8Ц!1IR>oY v6}PScDXI i`;qssH4WTQwA + 6 "ó=AO )Jߤ~bYvQo,֖_ɼtIWYIYWgL;R gBz֯sLmmnPfaa1@(u#w74[uk߶hmE(5?e~-G䛠 TUH-/gdu<MEWQUU99U%k,kj^1C^e--ƏRNo/JH`3(fHK#4jإP5f0@n$ 䭎OXbxK  nݺY/*>;9uu8ZYihXY/ ~L%-4-쌐՚5OV@g&zܹ30 ]{J0pǗǒ#t"mi(>STov,r-#-$$Ġ@aECP{TTvbgёE^KKQQKs7YԲGVU1#.DSPVPDԳyNXX,[TX "; !zj 5S}/j3$²N"!h qܢEB<I3yM{T@7ƎM A|<<8M̻X\d?0׭ᗷ3˾;GG'ڔ;;VױZmN~~rrr##B%B]W&88-#8x綘G;ws+3 (1b=6m6bڔ=ɡoM0oy6󺢼5B..0o6hZZxOhPz۰cd4_ܻס-s-3=쌐MnE%BUy{OsC } hZ%֗?Pkbq^^oor-擄]N@ЗVW5Ωof͚|fK1Yi3yt6˩w֌R O]+ Zy{~a=3FcWF׽WYB!aPA%Cq b0<&%g+ b^JI9vb+kZZ%uݚs-ܽ''gug%lXH q=|7q.~9Cz ?._r7snį/d=Ӧ |w/=!HD.*}.S!ig1,i55UpI~=7͝?<[h^~vND^V^85z  +_\~!~gsg3**+*IN9rdDZ{Aa~Wħ-8>uJ_Wh<2>B}"ܵYYtzU@7?Vj?%Ά I O"5%( I*y_~ag0gBÆA^Yё  ._51oiS UTz@DG39}*Zxl|ܖgr qz~=B˗!4dW׷+|*K~iMÿkwPVv&BӦpDF~܍}1%__F 7z? ʹfxYY>^gMR g]ko`r` qڵLA¯XSZZa'B)odZUeHӀcw7>|u`G{kY˿iRQTԂS( BA6453c=ii"] 3}̟nb5'9tP=U Uu]]zihjhʗʃEpNޮi/_y܄ c'p%3|0xtYj$^|o0) lCVVO ̿ W&g5:;!*NI+2s"CWC>L@\Yo9Q9{hR0b(P\>ZDSu9y`V9jBJJOq?+ of?&)#>ΟGHU }|Y˗# =zPQ0R S::'JQWUW_tYAZuMA~BIyiB}\(/o(/ef6aB\QWxg w٪±~P"QWODZs/ BH^Ĥ7KU;v&ClhΎ%{3P 5q^ƭnqBVGź_]1;~IpSSTdU4h}a^y5uWwZЌ̧W91= l}-\(_IHdGiE_T/1 SS[odh%/M/ ԩ '|&Q3 qȒ>=`RpxƅeDBه#$' j>GFLVVO 6oL@%,"*3s~%T5@Օ쿧WOә  hcx@,nXر@w r>ڴLZ@PǞq{trPgƭ747.;gFjg])%춬_~zߋe* ʻ{+686\[㧚"#g ND(&~%0лyvopB&KC1#:-i=OCOOAAOoAWW+ʒp+=OO0t„7=뷻#BCDR^X}į!i)Pʤl{B uE};^RRbbRRX{V7׵k5q:*9i)ʊԬcSúzmt5ԭǖs?,)cŋUIE[akk骪22 y!:Zi8mngU8Y {=޻ֵkZIlm55lm%$}.0`J+RgxGByԽSb&4HŅ̶7sÔ޽5YP4OIg4יg܄ "G ՏХ2q#Q9-N՝< Æ!ĩCuu2o  }C"B@@@GcA"B@PXx4BQ@@o7Bt Z^CRWgm22oS #tpXT4iRޯ{wsQ1PHs. ~ž}﵋k.xY`X!#JJti5(<@(2w]cD9z9 ɽdBbyyBԳg}wU [d>`L9*Nxp=-A{[Dg|{RR5GhͻGn~uFK 5MKӗ}|N;;kkxGGs3B"̄B Pט$%%T{yר*!A⢷Wֽkgl̮?;k1f)Y%y۲nȐ-[llՁ +-+^tRydfx{{((1PPLkK8rK99-]y4oݔjv ~Ü*9}5L"n ƌۿzlM)[[Pϸ'_墹0䲲o]'hiu X i2qinUR}\N@QS0& gnwn^sM,Mˊ6>n2w t>=u3f۽_🭠v ̎>IIIIΓv [E6d]e|PQ؀d,bha0?Wv+WW<r G9ӃAW:D×_ qqx ]Vc2hPgdp'0Ajkeij*S~iwM8Blo( mƍ ,rY t'.@Sü+!$޼Ŵ@ڷbimhm|#;t (6:ƚXĖmlf2%6Z:P^a ^_|uuN:ǏwN;s%|$>~F0uy]Qƚ:]`עe@sCl ;ﻗW~ʹ­{a=Ȟ|iipVTS)z S&H[9/'A .}gd-Xx%>9G.vrKQEaS`|sysE>KXמPR%Fv^ꇟ8xP?xv-ٰWyy*!aN]ݞ?W#֬4,0PRʺG{5Qjk*h<c^718770݈OBB>xgpÝק[N>thƌCdd`Yә0¡PnmM:cc@c 7{jx={z2 v[a +ҫafeO̔[ϕڴg'AnOC.&';ԄKV8:-Y~Dy(-o*>n&(tQq{A`X~kK`~Z{>tȑ #?*Hڼuub # @CCa!B-BO4` bŧR,v9AfW͜0vK>y{q{,u4-Ə75?AtW2ټ›jEEcMƎ57WU^AQXUU'%SZ%BUESA&!|#c;D}ʎRPxzPYy/*=Qޱ{oCg\ɩG:9kk; {4i۹OcI s$P 8,~TV7]S[NNSDY[DX$,',ИPg{[;Dh]]YӪkRR8AIځYAo*Xƍ'*Єm@RRYۗT9{TAOͺPP6H}\n>B{/5MA`%$-h(*nޤ0N ㊣G?/ UR@hpC~?-Ζ֭[ ٺEtפYs!C9>yOQig8r eeWT55UU~|E ?pNِ͌XOSu(<PiիY] #bܢtHHܻ r҃ "&N378I^^RwqᇴB&KA:9-*JMn'&g,-l e6(v?19q+< 䄩F#c/]P>n,fB9⒟ꀿ13h}<Ϟ4J7gg;o`rMY9EMG\^fzv+{-<'ڵݿ>X^V__^bmnm"-;xb횧W6=Zymi 3N~\X?;QgD煄sGCNeJp$$205 fAEJH|ssJN}AKKk,hlp#F6Sτf񢥴(T39wa⳪Ʀ} IDAT~ZۚR>HC(˗CbQ`QQAP45ڎmhY]Px0=1wC_٩7rXw[ѧ..ʈDE-\:§N#4|ɓ`?TF#'ᡋˎݯ`la;~55KM9iݾ1Jbc8>:nEPtRrD頳 1 ])X&.{ [K*k*ʰs>>όah6Q'6CCt:|sWsr^_ҥ+ZZ;W ;n@ piӌt̒Z XssA[> CHK}hh 37!9!a]Q mm΀f=og|?vjq#7ƭ?<[wU|K-r_HNڥ~_Nj `*+!`˭oD:͌VmDm h:-1iW1qiϴB~>h%m@T @] RVTD᧟!7R.' hh(*BUдAh̊׹?TVu~TaB(zw;w3 pNGv=B3B'F'NK矵+6VVDoOwMaõk6(Ehڔ 10 'H?{yՕϟr|Ȋȇ:oϾQ_|."-YYEFΛdf ![?|~A*;ǽqqXMMIE{3BA4.I{1@yb@fv DrxK&&VT$&=w)I'6(6worq_7 u* GG.J/%rfP:_C뤯rƋ|v.K e3w\.^qY9B3b+$|{c=~*8:"_OgD:>ٛ_{{gg{_GD~Ͷa۾lvtĬYGNT«3) ,κt'!4dl^_P)habbjsj+XM-2FΧ>}LĚ`w TSWr!6!])Ӂ Ж{5PSRS㫘G;~VdRHL\J|0+[:oС¼43jEyw7y_+7\M{mڸ`Âи ce CPQrvFX]4P\|2Bq`LV2026Pt y]uU1NeQ-i-xxOGSSA 0 )-v`NWgP{'TߍϽ{TKEd$ssp=g~ ðqN:Ņԥ:ӦC\ 7/<~XMYxx3 nKMimC_2F Jphir:V ~*ZVS}T$f߹ ` z ړ1G=BGw[y[גSiN%!X ZW^e%G'z ]sJ*BE'Ow;:0nㅇO h?SiI:25r6r; ڛtLYVSޞfw>IK3jKuiɸq׀s|zb)X#;J!쓧sK֌]iu Git2`pbC-Cmm55lm+.jei#ubkxM>cmYjooh`&ƞpYkh.]t4zY1W‰~-K8|␡- , GϋՇ3b !/JOGP{aNNKepyiiii؎8?:?wDs$$;/7ԦN)I(#R'O>HB^ (h$4\t˪ $)Hc%$?jl /X73Y3R`J˵ l69y;V^Qʛ: S,-7lpذDCYĸau]aa~G5/T\{Pl#/FޗQPWb\ݡ`eI:@ByH9 Q{[;&0mLL-yb znLAy{Y>tHIIJJyv/vvA;"÷OAǍx[B㴝cw7>|u`G{kU9g0A_6Hp O++[[ dj|H3O狍t ۦӦYXLKzBx*=tb' x1r9AGePy6*?Y-P$B2Z_[!-f({@uuj*B7n:)Lf{^ga. &'/?IINZZNǺvyQ D-,dN-kiШQׯBEEh(ESΔz,u:ȳqRf +W\retKcMs;?Jmm 0jÆ8 8.,.ngw7o7op}4gtB>0ĥƺ=eyCǏ$?( r1sU-sSՃ;ȼ"\PdM^ 󮄔"BFzRqźT\b%%x_ 33FXΘepz//1܊x5`x8k!"; Eozrgyx,WyWǓwsOWW{;&:|¸Ѩ{Ud,-ӈ r>V|sDdEQnKWkb2vCb BSf\̔sCg[.Z|¢'CSN~=+pNEwad)ifTH KSGݸr9Wd̕7!Cfߞ sr|Ɵ9ZY*=@\RZ&O?~~]B{`1miIM\iei?|Wmm u]w¯n8gӧ8_u x~ùw?"TZ~׼:Ł-C%)]UB.>|u4H[{ a^y/$o rF p1t<'}& @45SJ+ T^q7BXMD3/))qq)9mlj ,ݛNYrZ3Cu{Uancmccq06˲b y]Pk. ^WPQ/z olhehzbeEZbR91YV#(* ݹ'&v>?'XEDGG^^GG<57 mZ3~ xC<?Rijjnnihd=< Ԧ)OLA{տ[Z@=aͨxB7?Q9P9WT]++ 1)0Y$l FHI]kZEYq=iGot\P{*-vYEE}]eޞEeĥdd4VGƖv&$876jj9!%֬x-m:}nl(-Ilf屧NEy-ĦœQ.z**HI)*ml4z79Zi8:U6UsY^^RM 9Py3]'>8$䣏۫z;[xO:|ldd^W7]ʈSw|]IIeUx͝K l|J-Cׇwe )7c{-@A[ژwȆ ޲&&/|~v#Iߕ@^PUjUR~޼Mk=<6mnuAiUa&FKiҗƂ墅<"{9-qtyR9WQrr\n?so2+ןc0C\N@ `@QL*8bDpp+xFO54[dy}TFazƷ"'m TŅK0+!$LAMAWWnE>r?`76R3U8pu6a4Sfz}`=?| '`nn}m]]kk]++裏ٰ qqɓ]RRLj^(ɲ *ΆKLy#޴`8OR?۫-roElsCU@E}f>qBtO3[(-boj=hOׇ6r{e豋Iǎ7u!\ ҋ䌌(#Dr**72\!kRbAY*R.'  HIARݗT_LطoCMOR s_S NN BJncc%rHv*22*ʾ**aR/퉓o7) IDAT<YSc^⬌ ^()ެ9D<;. T~EWesSC.CB2SRԴw'S(Gʓ M \&01^43he۴ KΟ۽|l~%P^l)dGL\ 8_X1~X_] ܄:Ko/yqyQ2?1196yxlڈ-C-Uʊ݋uUŤmm45mmĄ ;X5JX}}>捍E%g!/n*=K˶g+O+OT$1 {Co7 !w+rv7WeT?HH]MEA)V 2?HK/C a7eL@@@AB,dMf`Q!Sڅ剉i%1N&ZNG .+bF9,^GX\ 1eo7ma#>>8vN[{CӖ-Cl,`Gs_o !w]x0sܧS8ƍMr.Щ#X΁=GuuPxiQJNYJʩk)N [q^ƽӳ `ep|1 %% pCoңi?K5{Q"ql7pwCҪ+ҎHN=zASRMM&84wa@Ywwtm}F,46|]{ ;8,\hӢHBJV&+fUqYKw2/]ڿ=!q? TWRR>844F&/4-45$% k HExB r"ݾCf ƎۆjSoYzz5pD7fl(q߿:ړC[; Hat|>󆀀@dIR.' T␅Dk_QR\[WRr^NիJ fY[SؑJny`Wy%Nʪm>:vNNWC-b7kDYfJ /kGD̜Fl>ƄڻR4YA-1#E (^ UR(’'N338QAAJ߰!!GAʽBC߮^]q0v.?B{Jd 7gݒNNKDp))Ut"7!ƚxy HƮ DЖ栘,/'gC=7XO;IZEI{ C22ɷi#p--- « yʼ?Drr&&&ƕZyySmfOҴ]]}n<֝/~F d1g熆JJv\\h)hFjGԉ&#OBaϸII7U1g74$FHB4UT˵xQGkc JOI'tP 8c=wVh7p8eeo39#$zz`F uB>bV/!lK3@@> ii۶!ˇ ݯ.):`at ?UKk*jF{jv6|O,ݳjъڶ&aGz c¯.X|媷TWsF LCù>~lk#]Fojь׻ -jk33z3<ޅt }z݁;7^rFʉ9sNoj erBCǎGsP^^!w{}`*-,>ǼOG;wMm;sf 67WU57'!C P;vM̻ rfP6?W|-C4Vrb.WRK¼]]P *jw!T\~zG_lhaj:_>9 'p%3|p:6:6V7^q*Q!C nߴ!.?*yE *<}x<ɼnKEm Ǐ#[[ke4LxӦqNVT|t%0[Zu׸}/xH,YD%.' "VՀNi pȈjmn~O-5[q]*rS 0׵#z exYYIEQڪjcƘ((:ֱP xץv̅B+cօdbt;l\UT -UU7.4h鲤{ܤʲԌSSN&#G昘= +RR0B8zgӜ}E΂Q:&[Mr1 JG%9flll` zQշa@os^O]ZVAOtwݿ=ݽ ؀C2sUVTs XX܍{+d҇а 1|BEX''/(D5’[QyٷnKl{z+)ik :3643[`=rhѡi&503']eLJMAO |7Ύ[OT]ÿDtIllj~ŅK.Y{f ]mWw sQBEE1n.:zr8v)Ȏ ٿK0 3.qHD[DM#Μh·m?a۾6/+s//o~ IMMeet YL|;!=c5jj3KveNZf 75+\bĜ̫K&8:/Ygi{IHX' Ӹ;Y8j)[Y3 ff~~o֝+㗘^Oɼ~x7oSgNx𠳳fJ<+p]4}UeW`Eϟhihir3;ʵguEQ%?K89,Y"##..?lHV\B^{-!Bvv~TIIȆᢹL:@L !{Ͼ)*P*+*JNNuF ΞG(6nrUOT~:# O@@@ rK^PRF|fCʹ'ONz=!7{.8nLٳni:x^83 _lѣ=Y !93o1ŵ)RSMcoOwwĬZP~AF{T#@ U@*!4lȱ3` :iBo?. ]EKir*zg}| 30x&.2P9L~̘;(׃Hڵ0zg q0"-xGv,_pZZ%&8~eٍPCCa.nPiOyzzJf\ ߕ@^PWZieֹmؠ/+_Wh֡#`hy`b`9/# bt׶23ۻPPbz֖?e7ۥ՗.rrZ`&͛i޺a. YZ~/򇂜1B..)#^ ʮ%RW=aN`lQ` phgfU`Kڳ>9iE3!ypk<_^o&݀p6Mͥ0;ujO tNeJ*63в5xHa/'?6-o1Wr{X[^+ UJ6VNwpZPMMV/ dd~\G~ 4%%rC`%\cF޺[X_ KJ8|jl,+ BQ(iHN`FՆ aDZxYXNz ^xv#";'DRr!R r'HHƈT4bi3BөM<Ᵽ48w1-Ȩi~ jFEjꋊY]U\ G=ݵ=5MM~KL(+99|jkX)1"TZr:JJbkhjhLdn>yC64.ֳp@ ^ZǑ?D^.*/"!.#gefe)<bV1zHs$WhDtXߛzITS}'Bʐ@_x52mhk )o7:ZZ쟾Y1r(8.25]q@=t#@8@B>?&4Jk=UJ+/\q񢦬pQ9f095  ݯ***Ufe{8x;:25_ù 嗌R$-[5I> X]'réŤ^7FC[L2'eZ;Z["ӋؑSBMzPQ8i獍%%J]T;D~"4pԏdžŇ?|ˊ2jj؉)X7Q%?5e3 Y,mJ45bY&-Wh؅PC]A-Yϔ^bb..:..ksuY{Z!-ʭH:v1%Y':P׀N{Mu{{ ·@dg KRo0w.izM]z*{N|iٵkP@ߵZFYZYfRR빆Z5'jAAʤ2=-ǯ={=#ك%&<44rVVVJJRRA8,`-(C+W!4VS3ɉ463!\ (cMHByF]GgEy;?}r0ٻ{ޫJ{ Ĵ//KLG ؍(ECwߓAԘYߧߝ9Y{-N:3Ua=ԄCt#Co*󢣨UD02_ѯCT g\N@ jhh>z)ȁEEj$<>UĺZ6lW i3nYTd *GCiBHEή8!'?,.?/,HUElFsjg_$[$&BO+__JƎv8ScǒbzNy ڵwid3SxK'k=}'ǐy[ɕig 1de%XW >v`CAQ^-dd@۠ϏUW%SgυKHs͝onnfJgj:=G)+|VնmO3d@ɀVVU5DZe>.7i)(ii$rrm>55sS55s m-m-y\ׇjNjƆ"( p !/*^yj-XusۺUOAIMO7'Z .Dªb__<)-KiwYs?j s`x$NC a55Lw= zԸsfUűfͮOg TV _t zVu^U86OTeh>vC]" {$.' 5TTSF=O*ĉYQ雯$Ŕ(]ZqC9N֬CUyx;~~Z;?"w߁5<5C=&kџKmt,(~bFy& RS˟嗌협WoBr$2:BK >C}|44DCʯ*>;M ,MJ\&. t4}~AT|]Y&%0~Cvz؀H@\YP&Z]M[SRydd?%ϨHBF Wnʒ nܳÌOw_ԓЈr.+ +d?ݏ>~3!^8pL$rq ܧY}=WTP+%tOP@xYxM8u{Ӻ&7A@0K=zG]ŕ.$g$G^T%XN$%;vPB5 5X#%U}߰e0-EڄB8B=XDz֟B:1B%FFs<{3+-=u*5ԩ~quVWֶ3p5rm~>r%|1-]XƌᲥLL.+Fgged|MOSP-~ vAٳ=Nڲ-z: KC|8VKeII?=N:"ws;x# x r.Y[ ϿpqKQY:wK Br'B(3o@*o [[ |Ii)8~id1l]V3,wmaEۀ6Jo ,eE[+f!OכDfR:0.MpNȽ}TVFD dBMMe}%͒kFis8 CZ[M ii:yuK_RS??XiK #F>2\Weg_vիkWU77T)(<}ĤI|% xю LX)($C'̫:4z֞6].00-#0pqqVW;%$f=gfzy{M(#,Hqϝ$"dj|-m~Irw EYeԟ˖9 ^LAANdL IDATJJAR{{}=MaTܿyEzCw"dksgG G(&vrJ BSϝ}yj8s m==WXx"B6m>9tqw?|!ɮ@@@vA Dee!w-JIhe<~fVDackif&z!Was8PrRWwqy [`P3o>mՃVV[^hkf&zhdsu _C7'GL|+9o 2ofb%4;$)8H=b2gAjiFu57esUSSSN65WU352HG̻60kRW"d4UUaxOԴ]lȐ%_)x/bv\Ǐ33?< SDki{skP.,F>/!?!cʫ|o++XDw;nanY_^_ίnz͟w4jQϾhZbá7(K.E|޾Neb5-dҔ_r666+8:\te]R2r |A6֑g߸}ƾ#ojjj\7ƍ.c\j4iF!7"SXxx{tF0;2 |b x}Sy~ɓW\E:N}UA+ D\N@ NJF/yU!fy5 Z.'$!1vVfp0';eՔRRj' E7S)qڛ Eӧjmy^ϓ&PQUQYajF1Iq# "F\((8|Te%0E$ 7 d?x]H>NPaQ;f^5CVU}O`lbl` |ֹl-CVAEN..~IMM~ZJJ**ij};PG{s=ByPK_JN'EGGc{\ u99 ul@wSuns[ _ 87oܐUֶkA td.[NE.`F!/ D$<#3,b9Y8,1}EAAz=;ML-y"RQg*OJMv潌@`pj˖`hj*-?wCٳL*4=Pkqjm۰Dya¢ U@͛BC 5n`f%iiRP7Spk7~Ȍ{&N1/r\;yuB!! ye% Irnaa奮.'>GL UA-՝4VxWzVŸq&ƍr465"z'W}הGki;X[khX[K@W h3Xr/􄙙QQ=poឃ@OͫpϕF265jv7mR^!<+z?p(jaId%0EDL 8㘏 GYQ6sr.O̭fs ^0sOd3=mloCc .Vqfg]KBbϳPWTU}e%8dڼa󫣢qIϤXJ) /&Co.#bT&.&% |f>i++(ƖzryahknbSLWg;0"802ţX. v5R1娀߯LD@4!<~PHB&?mbL,@@vYyyt(ZWٺP۲3f9$AjХjiƭ[\nҒUyw:9"h=eE37HrÆYֶ֞;y\oyq 1qq fVFoaܙvvs'9&$'15i9/f o^+RXN;:ᓃh+ϏI=NdXrs3Ѓ" >*^lDk$6 VQB@T z;r|G5ŜGV+ʆWٿPb2X3X؁ X] s[6 :A {+H Ŭ l(gcd0w6=<=P\YsϚԠvKĬ\PYEHsb 9~K靛kSc lyw--;If0?EkkM r!V߯ClY q )*3ԛ3.nIk(\v/76׌v^yF~UIHHac?k掝n;velSHPQWR$lcGC^ D&K _yןH;*G@b˖a.[6kk+(W@P|MԿcZcG"`߷YVvJV|rHJ grƴ,_PQ=_USѣ^d6*X ?,D$rT4{"vB@@0@XD,^9}q/vNdb!72"-<-cpgg= >0/%]/oL 7Ѻ%%ػ6-ɴ،8@zѣEs߹PE{N̘3_R%P(?yN2:}P>.W<$/`ky"-T*)V)=G3OvI)?gߎ,Fdž+3qD/Q2yy`W3e+dMHecSg[t͋滩?kx 7?++2/e農2k 559ewVI a gLԩ}g B P,Ί э8"ʤ-T:۷o>t,23H|乀s4䤤z4`ֵ#0GP>:IsiZjU@HC}w#q(Uq@rο=zPgTTpڋo2G_`;"GSR{MJ*}wd,$W)xy<0^] =AjM5S:ddWrpeeynk5_ Bdqiګ}ywiޣq7k`Ĉ?STt):͛Gϻw*qz=Qd9:dt 55WsseS(=UHddz_Z[YXP[km-TauBzz&(),_|YJ~ZjjUEiji)gMǙ/v mf -~DB HN< 6Y ibk:Bc\55#~B)땔UR" w~S])SPPff9x{-DS_B͟(:q@k{g **G &MTb!;9}ŸrOFYFXG'/#(~-zѣa W={cgaw>}CSzոg/>{m# d-)u/s 7jdwddx&-ZUe$e5|wyO@fM1o2sAbRYYb 9|dwP q5M ;\\oZi:MMyy(@ t7k-(:{hd^Zq~7Olmhmzźz=焤<+,=7bԟ˗; ^\^^JJJʮD(!w9u|ͻ7WGGScgTOg2?~5]ݷ _r#c\('q̳`b `Ъ=v,Y .H@Q[ J7nQ:Ϛa.h~FtkK] ?O< 99 }wee!w1e2?>$梳f;RQѬG3ӧLd焄^_yss?bJnQ:n ȉCŨ|i ֖[2@MMZʽ^Puu99=|`!-Ғ-$r DijzyCN{BMEtmH+`NA|*(:+ P6l>1z]ݰ{^ca P> ad| h4O B%FZD_ʔM񦦪+V::Xt")),=카3;;3x̘g֗,sk$˗_,wmWHkݰԊsnFF**C@eOv`-]J#aXjX [n1u -C^HJgTVoцr7`TS)1u mm "Y iiU>NVa~36־ڽIS@ZXBnnp@ }-Z(ϙ X(CBk`0st@{9˪$jE*u 8VW?.2dRF1Iq4n~ *L2mOFN=AZ>fj?/LaiCVstJʉCQۂ xXuwB*NV߆շ_.}BwF qb;[MM;;UUYgEJV[2+j}}>m)8¡^}D>UbӚuƍ3=ml%>/+%Trnf)1!^UcoeaeGUJJY{#=~<5pZWPq*xG C]ކfW3e˟޳P;-()Y[!dgOs>r9H9E_oj<̓} 25* ZHJJЕB"d2\N@ h.C*9)Oή9!윐;j&ӧZYM޿﫴.4* CgGk+W@u#danCwɩ~FQ3̆Ķ C(qcOE*jL.Eȑ)(?i<]gڇ_o70s]i{HKBTک`i[ZO%JcMP c7qӁ'ZGM>xLP#*/ :*cۊN DYY?PRݠ};h(?r8w'}|}D Ή`z ϼ*.!EezsъPjO'Q掌,,96+3b3GX[[A$- h9}߃H } #АA_d o7Z{)(>ws;t?/V9כ.3lzQDyy]ŭYPccI9Pvff+x D-1uhO{zL{ eԔ}T%L%n~십^7nn$eOl$/^&WJ"&Oe ?|8t~8?>C\¦T2D=;j:r흝}~Ͼ;|W=6{c/Fq͌g_"κtuh1q(m_>b4DYŘ``*1*(:{y1deu27]VX^ϰ_5555'8GQ7(ˊIJJ/h?h];@NZZ>|~j, >D}J ֦]fL鶼ĉ'yE*n!~.C7l27fc,{x*a8;3",vQTt)LA7,b*TT~ A;?͟қe j#AE541k+۟9\76\0Z<*0\N@0TZjSIX{hj $]KWIi;X bc!m`P}Rپ;~1&ǟ>>4}ӧ9H.BC4B7g @n1:).6|M~tdz B׏ @Q ѲLa0mkWYw 5 5|k) mkˠ ]tpqpxZ H-bm2b9;|3B66E|Ճȯ])TUuA@@з=|\n` XO}gCV8>8_?u qNQ *^u fy?UeFNVSfa7[nݛ*){2 fL816~{BCCa!B1Vݩ i_|N:;r SEQ?.~jFy9X``h HI))Qo}n]eߺʭVq&mm45mmα;)nɃ̬gSVRPvqB1p!#mH)XoF*)K'OQ?t̨KV~yvԨ;AZZ= 8Mī3gR/tdm}f:}M}5UV?Sml|.I9 n2ωI }fn7YXEHCՍy*3IxQ|VU˸Gu!8HJF^.'VPEBvTvȾb k 8Ɔ**&:d^Y fȦIQVPM5lokgw_BZf/VJt:؉߾Ei{ݬ5r$Xͨ5*r^XtsO/fO`%TYS \p,XV߈]J@𮁰  & e^֭߱m_xhwOv wߵ&PĄ3`bW&5[NI3s󺿣Qo!|iM۲zYPa66pwV6pw9곃Vw!͈{4z?zнS&""I^yx;&JMXLAU[k 5F%z;o p__1yRf? %,sдa{"-EyU._YC ]6aT??\# ?hkR.< ӳL]%[מ6 N|?|y,ֵ?1bNL~U\BL\\jՄ;>pcVV3e"CЭfQ?Fl2B&K!`W5G5焤9ybRR>|.01,Lrr/FwEGCBh;{8`r=h'r-e{K{:G}C]) t7z;n-vv]ȁY ,(P{kCB ߰/CUy<^oƄ'ȋkG>9J9oUUݾj.M{jʠP>n(9P=qc VmϏ SP^[ t1ѴT 122Z8}ŢR'ODE3>LOSYZMv. ,49tÐwM/@Tr f@gAAGFb.r~9VӢMZw̜fm=s..k+ij%WUq8<#Nݰ~|7n[fFX)l1[JJ(TEV <;rh.:Aaee{\--yy-S,-Nݾc6SMU SӢBP͏()w".n’95)I9K k,O q[Z_Or>"x.f>`/HރO:bD n'##oo2B[ BУF}k22]X9{ ɓ{zqAazGǕkkEe% ~ʸt[PV:bd ql]]/UpFdAkBHURx.O@I`z'5k 2jj !ٙ/sҪk8'ZXL$--!AL}  %V߶޾ hoքTXҗ2܂g t?x1F265jwG;SRϨ,N(+I?p:7oܐUֶ} s:lc 28J563/U #TR|&SnѧGaaM\]6mic;sj ʌ2'7ffzPБU54x6֚66**22_ŞSzPTchiO:_(akh@/櫔.5˨Q@g0-+N>m[P;KۀyC=3*o.Z*xut,31p;FB l" @c! (M|A pR{R?d_"VWSRΎڱ[_uU Ah4(*|Qs@߾wt2S47a߳%?Ih\Q> lbXq[`* 2:[#fNf V7#4l81^Y %h! z炘г߯oߌD̻po**jx(溽G"/SD7߼ykl[kc͹ tr+e^,#\o $B3qAx䲫rG$&9thb¡UMUU]1E]UV-߲i-**k 9bnz Py60,g55'8}l/j>woee3m<=<ǿ"{,T+/ގPzW_SgJG'ܩa$Q**Z[Ir3Qspnd0w6<,jf) 0tǜ9?`S&dsBBZY3llfOw ja&L`L==J._F`iiUuP0sL::@\UoTձcEUkk+(< 'g~*%Hܱ !k˭ طw>mm} ϘxNa\BtHPe+ȅhi(ԫ^Vk.p>.4ȫ(96{͛.ͨ6;z/)<^f/Ik,IKvהo *>tv}KryUZ--Sb'}Tf  _gP2myem-V_sl߯IzJzѯdc H_LJjēC+zQA^́H**|ۚ4'N[Z,srrEIgfЭ[+̦ƿ&)"T_ $7H``AX3gJ OPRVWWR~.+U]eE%]ys6!hk 3fEGff! jj l^efvtJQatq&=G?Vn7}ꋅ DMM=x8g6m4Dϛ# Ta@֋7P(=)nwP3[Vr-HŹԀ$O ++))+`݂jrjja78yabŅ1q GLai>y̻bZ[LW$ZZ ШBL ))qq))l@7R[gЫ{e%Ig;f`6l ) RVbV]kQUqpPfԷ0PUXj$rr9m|N??-XX[15RU55QPnJ۩+zzP4q-P?i;c2BҲjBUhnɿVՍjlUV *s3 yǂjHQ?VK<*7猩e55lKrc:-8DAa*h5pRț(*[y]:~HN}.ي+UutOاJ&SS!r0+BÌ$dȲeu_8)FFs2`9؅ zMh p<"rTږiOީn IDAT \51^!?.N3>Js!UA/ãl;ƚ bsBB2jy:謫ban(c澙ٲ?U+xwoB{tjg) >ZZxA쥒GԨfÝM]_cb4ЌusZroqw]Z~+[ԋw4kmOճC=o5-?s!@(+0.O kV\:q2.)y n7d߸}55XBZZ]TТp>;<^T$F]];&KB1{A:6SP}iU813]jl*.Fϧߨ낸( g΁%#?,nd0wЭbco.3i xjJ@@& 55$ݺ)B3gzN6656*Yk%56qqO?oܺqD(;_<<^$A: LIx\Pz򣩙F&bn^E-DGCHZPx Gx:% /Ζ`{@4I ʂo%e7n!0r hmb TJ/L:A< Zy勃/ι B/b9s7»4P+ޣ`+)g^݆%ɢ/mmmm;9ǮNN⸢,ֵ?'$8 u݇ؾdѐ!K\N9sϨEXSڵ̷PRRq)p*s1̅1Y*VYQQdZ[l@T7 l7D`:Z=?u9" rCvᒂv"~~fj>e{F=]ĬZ ʓp;~tB{{c#BAޣ] ey;vZXG]ИQWC7k(|FF.PQIUڂ `F.PK&sA#z6)0z/D({sQAG]+wEŽ{`rQ"Q%323X5-ڙ22 ~.@W!EErT^4{ h%$N& _ b, {>ChpúO ??Dcnb6v [mA\9-l*\1).PSSfТ:ǃ0.AXNdh1d!o@[)*u2_*(GE{54v6'›S(7l~o']($jxrhO Z(sR_ %牴f1&cFcMᕥ nwCCwwImb]QF%wПMK{9/zxn7/]2d% U&g2^OK9Y;a ]]/OZ|ZvtD}{>Z}}@[" f빸`DlkhjHOHOMUaz/ul^C:\Ilg>17[\Z:&:/]5 Jrno^zQqQ>0uu'N*3g+F4޾ -11ÊԻ:C@A "@ ũ99uGzZ%/=araÇZzǛ?>NnՎjjRRoAC 1;k8 8Odi ,5@ӫ50ZfƮ[ 2gѬ"IPێGFc6*dg9;}NxUT@]ImtäXul6tkfjfx].)hedc n$)-gH#Ñ# nG|75C Ǐ# UU eee@!WI?]X Q~qᣙ!G!wfyy>_!@4!..)7 d?s&%Hʣ yh aZyU =">.7i)(iiV6ގchs.-#Z5նm=ZrؐdB@cOBӻ;nތ%P |陕)9AeNv':cbC-mZ ='_(Urrp)XSy(zhxcc`^a XP_=>CcT΁5/2bk[u *r XXЩ ֔T*)8I %E+;ْՖ킔ںC w"؍w=4'yyIKO &?!GKF{Eb)+9:C=ݝTZXNz/yԘ]'Zzwò͕mM)9ᓃph!&H_ t]n.1Q6Sy7~*pu1Fcƌmh4anNfaIZ??+ԹE@@}޴`jV6*מ=@E2*jϻ'ʆem[Җn24PHܼ[l]i)t}j֚?uGjrEee_"J&Z{f˚52rluln~kuE~aXL7,l߁O/MJTQQѠo?x[lzjVayD6&u~p[w?+ǏʪsR#Øf`n,nAڮ c<5}wTTSRfBP yll;KݝJN2Me!j/,ljBs 3$>98ZHiZAzFlFr,Ps-GuuZB7Ӡ%9*+++Um^UCCBJUW&UK5U`Y3[Ft4hed+lEƎsjd%5 ( Kw j~pDO}gN?BQq@j67*9(şzs ^(\7b3nǗwp^iH11b9q O@G/ee|8s̯VP%e-߼mV=6[Y+mё7BG{99B}}bb}_MK *mVӴ\yk v^FUUV&cc?K-oaDK;>tMŵ4<ǂ)T{OūTΥTr{V9qHt6MC*~63F&) %ƽzԨѬb3ZZ TR 2mԢ-=wtQًRusZ$ޕ1Ο_Pj ?szQQW]xK~h͘k7Dv<7=!g/Ȉ3f640 ?D(-cn*K۱#ocs "(b]QJv67B~MF'؈P|r>862WQUU]4oڢܧ҈%!-ӧޓڹu֭o<8BT؄3wz 퉌ٷn~ax[ks;s瞻`kA "++a=3COYTT3c6Mn)߬nj>{\+~&2=킢4iWP///87kRVE@r$MOk⢈~?}>| oBeǣGA]oI J2ׯ-A$Tܜ=8Nmtb"вɜ~XG\C7*z7QP"ON|CFw ')>z%G׵ .mf/sښ>=}W||8{:a?F 6cbnb 3rw?;M([λtyႬr~WAJZ}gʴ.tpX<;V/) OמGwb(*XZl63߷i]룝9;~vKJB-9Pf&l*WTu>GCm;E 翮O}wdqC:ڡn㢨c#Ϛ%K,l\띙 ۉpts [!ւ3lj*-y2ڼ6sz$ւNj28q1ќEH^: RSw`9YZ`ǁ̣]N@Ou(Eh b<*9D=M+姤wd8|vO$ o`6! 0=Mat83 s håZ ZӧZZN;.IKuO?Osr2$ I)| ɃWo^]~>M% g@F&IЫ'L*ݣEZi/gb"v?#!u&MdnnvJv^QLl_jZ@1FFGkiki Ĵ޴٣ ҆I;z`%'o +WKˉ-^ƹ|TQ65/%bL! &ƌZ>BRP2RSMogB" @,T[RR*5()o;25%eFZ,--ۮ 55RQ15АgB1aAe Bֽ`Z4kv>c֚}6k3z/nX,t-[ F ;,//&)#/XXm(sdr*+srLTU55 LV :ʫbf9˞TT8TTт@,_x/(#FҚ}^wU9 B5[UY}I81uIQϤ8fZa;;^-]N@QVG:1B)T~?:{?BGM{|]suuz:8;W mnSi ~︖[Kk&-MHV>M Y=A%leHV˒Uii iٳmlf1VQ51 ]+#FЗh HhjM0ׂ1cJ<F%/?\z+Uį-%fc6}cEfcKEYj$55[>'"}_+( ")!+_,C1:nܬ-kZ6k}@0ʃ6d+/8/ݷnWS0{TYQUTÇX,}įHu'5¢+W*.u&_ewHם9!aGǡ\?_:)BV~H;qxJއ毩ilKP/Peb ToMbewá7%(~B'()͈D"#jc7Sɚrs=,zkiiZwͭ&Oq{Ѣ7z-σpPә6ѣM֣.!%! Yբ7P2;%v E*J{ѯNo 5LTKShd 45=ݏܓ'(_>3Qnc} <*2fbNUu0 KZ[||֖-GbDZqAS2Rם>!cobL*.`Qb01AT5~67-[HAY:;2OEP1aЩNN,>[nikŸ"Κu]׬ݴuF 9P{7kF`*ݴ obb|Q|OL?y^*jǺa AÚ?>bcq*0_ACFFS]zZY;,(_p;U9+slyћUα|De0 Ӿt22csC  C(ޘ1zx 4~'gdfgf[uA^my=w\a_nH\~ol]73d<11jEp=|#8/*kd4vloz*45FBk=ƨMdJ̆ 搷#WTuAwϝ]8p=zQ'7lq}&;Ijrrpo TU_߁moF^X ң櫡gA}!?fcO~wUUY?# 1 zӁw: }ffk׀ƒ%}~Z铽;9m%l){o{ehc#xAQ {=7UWs{tobZUTUu\2ܹ}yd^)?gKz{ OPZcU_є=booSDeyjV)ڞO}JCKc4y%MKZZ) dKs@"!C||@c! ǐZfN*8h7V#dkm*22*ʻx/ee[W{ ݺEFFB =JJB^3} IDATA˴&޽ol"JJQ{ܺ ¨(AZָݵ:)68:$QQ:twpP;C5+3D#(сf@%;f=T;@[˫H 2b䐀 NSi1'P| SKU5SS[+MҶndM͟Z&|PUuJ:145aKu⢪fZAsn Ig&95]Oo&O0,qgdH,96wd$ EŁ !Bu59Jd,*⢫q# Fj䷶7pbAIO_Ⱦ(& $j̾s,,6o,S]6\>K 9ցlUM s1x׸ڢʌIJҌ䬺ҬSW8ɗ.:PZ/33]Q` '#'bUp8Jnߦhu Fim1cˀ$~r ,5U·hЬYTLhktH-ĚO 8nc ܌̛#t9A?~YA/,e,_8\=5ڪ<-ޛ6hҟ5v}@Paӧ5qHPTP1M0ށC_D(ח ^ĒSR7f޼(P1E{WwtvO_xf-]u*&w?\h}js|~.v^<`&d2t>`%%lџ+W9;\PQWXR{'^^mx l`'231Y?m҇:,FttƏgT_k+ k,zz4<~TboG245 Љ,l' t(3LJ I/*)fx21QQ11Ɩ/>-&%fsr*J]m-͌ȶٸY>cYSAמs}@zR_gɎ}5i;V̜̈JaNOv.***2XRUR>7#3blhp!Ԟ+By s*=PS!pg1c njٲc62*aIjcs8j~Qx 2WW/xYZki֔Ly^aJCAAJJAn}˖F#O+'%[ʯhuwmgS3Psj 6ž9®NIMA Vzv_X}9B R*Riֆ&D='qZxǫ{RR`ibf$/@_O1 =p#f+V?GfzyefvP73(DKErC j7^nx}*##QS J0,oc*7jjj{z@Z_u횞9݄ kk{M~> >\MmUUrjA@E1 )xcuX3ISps9 X#Y`ݻ(N ڹ:<1abtWW]qɒ|aRbb81g ˼ƙxyX/_`cK Ja--J  *'gr"K]841&S`s=]ZN+) e+ӵP{^Z( 5C6[Ggd i>&c eucrAfvp7+8dӈ}Ps]"[W97HI=̱غ`NMMF6l]TKVog{bU8ƫh]~z}cEܬ.Sq\vZw ~)Xg*Nm z3:y׶:3]2ĺM S^XG#a\3? zUSsFЉ9]N@^ BНeCdFzǻW7}Ѱa=Y.*(o*-5׏?ajz'*+@S:.GUV0.?aɸq5\ jjn߼G&`Bv6_~&j#3 7mdB!v>.34( /P)i{^%o`֚Oמt%ϟbg?^ ӬԴc@EA)?z ctt@J*+讵FQW,w!r.)3:q H+9~p45>˩묬|IK^Tys:h hkklD|8L%f׵vPP'JƺJ  Pcc Y3.^FF[-~\}S5JW]2sݹ3gyYXzy-]sr*(t7LLHwϿЇS&z͌ߑDC23[7/?!;/7( [8Ņ xbUAdLb3wDߜVTPR]䉰ïyao#aQW ;hww0 T+ {wm-_ 6̚狞xYWOQZNIlǎ35z`4 9< B͜ޝQ  C(4|$&Ųc ~IGFT$En D'aq>)ZN@3%|L@CO3m]:`+KqӃBXBjkQF_ofV=5! ~t •K^]"0>#5&>tE}N=_T zZZX9.~թ+!Βf6}iwm~H]ڭk{OD-#nwq^a4kY3,UUP萝{3JI)%YZ櫂«m1bxW~qpioo9?6kSR[%:hh[8y?z9Tjf7!e.ʞF='k27! PB|3m𡃄(';UCMQ#A]**⡽)fLA++cimo6)[1V3ϑYY{+<+--%%AS'[XL}g Ŵ^dNڎ`ѣ>txWѓGS !zCܜ{j32~Gvc1nP~#& LQہ=4{us`CcC\$or ~RLz'Ç~|#1c\-u\]\޹'$9rǰA<,e`lUxLJLJ4u4^1a1T_c8sS No.sN)I)(sL@@ P{nf,Pe3)DD. R*Ŗq۴QG+gp*J9,C#H,+H32RQ12QP?X ٴXEu-lVW?3kʆBFaZѴ66ggT rrU 66Rx{wܳgOo^udMۜ5UVwM6U] -;+)*+oo}r_@CUU']-\L2^9]=W]J:JIB4T FMCLֳk.LZ@$e1O$ҦpnM5G@ jj~ܜnCh{g`T ?jhb;**aݾI{{;/mII= kVW6 ===?9UV9fuTLO\P\R8;0k9qSݏ? /V!~ɓ3 yİRSs{Wk+b}ս_~Ga?,mO;>cqee)G ّȔ q9@ox/~o?qձ[,$4-^39ggmmggt?x< ̆y./ozзdn~-B**wv*/:r,6ؘ#X eB)6^yk]]֯72RV?U/[M}yg 99=melr|yQGGtbbIILPmMHEQeGԟ5;-^,//))/gN 2WaNM=jlGφG?Y0/MMS}:h}EEKK2?` .+ʀt] Bsf]zj>/?ry5>7 Pldh~`㣋WTCh:Q}7Gʲbb,ɪ^VVBh1B5ПGuuj*c úӧ QH|=_|AMԻvv.\HFݢ.?N3V,ijVtvi%^OOzuŪ+WVhU-.\7yG--G7--EFU^ٳqcåK2M 0-mŀ  ҈%!-ӧޓڹe˖-7d%|P }#Tt6fQUvq;M0'^mllmml<1%ݟGDRR? -ۧN57:·r/lpOĬ߻ܓ'㭸DNb}"hkEHYZNQy";s?Xvee`xfe3*v׶%%!!EDXP}}asGoqKZ]2e,$? b,8+̿r֭.;%Q}۷s*sryO07WUʘhi˨6>;RLk$@Zt/_+*):rT}}EŗWptOr_}!!GHe IDAT_B%s3m"B#F=ϨtR8}D_2t)B @ܖfzO:+V0R]jlٳ+|i8S ~rlSs@s=(޽T \c^߬&'b5%-5ՏS G`%MMǏX=`r25^MgEjI'EŁ !Bu59LқS`PGmmGۡ\24%M HI 22\ON>` A(|Tx5UWW3byؘ)EO# 74, Si `Txfl"zFL&8&&.8.HKC_]]aKKe%Bԟm\X\ ʡL&O@hȀk9"嗁(_0AS!`Jy"yv z\eq}4z-󩌌B&FWB5PS ;Q}m2tdop8cqceh{{SBTׇD!j֪ 2;)) $ws)u/竩wPt!ߜʲ|T;KBJlK3npv3eeMⅴtL.BV2y~ HK۳wjq )yI;b͚wu=XI sgg&Ao  Vlc@Ќ ᤑΞ=FF\~Fm榪yUnA3~E(M&f// Ǝu%'=c1G,}{S ڊoF(I8 oO559]2n\= OMD|g_ I{BO#- `INDM%n}ѕJ ^'x}憆l.o͝}϶F7vuf1uOA uu//[zq'HLzZ6uyΟwx}e?Pyel3ZcrZ8q:!wɉgO(A[HiZ8u%HR69qƟ=0.zFb _Wl5mmMLzϹhh{kյCU K\Vh%KE(jl,/t+5RB 6[k ?fl4vE , x1 BA$8`4P.{f,%%չ:OGYiŪ򪬌¸8 ˼ƙxyuXolrcc2p$6F;? ?jԫT,#1T_cx3 CrsBBRjJy))x[TYFS/y 2[a16 jji/g{S@EStlߡ %ew-]t]JJB~zFL (&Z2TFE%#ccicӿV(i9MMWE:&p31Vb%564Vҫ?u~6aȧs1FcnuwߺRK",LMYIO{SZs2͖UohkHSo#kQs]IS [{D\FMG{kޕ=" o!cKz z  Dv6*?z _ .f(3NILX.P[^-BbXCGZOہK]u(mÆ:Oog>+%mF݋:8V9wqWx׭+)) A("rrȠ gUגgArQ pCHEI9JJO>t`urƍ)s=B3/:iS2hSQBGSu.MUL}*sFF%s Bv!;d>śa޼x }Uݞm#.㏁(fh䰀@ZTa T?} TеXEdן,EFΛ~ܼy؇CQtY'Ͻ+Ljމ"Tr9N!#EY쳶7z:Ӧ 4iB|rSm)z5̌Uq3;nsmj5^]>|Yӈg 8* 0 P8|`&M9Mc¿s+hObcPZݝrt0Ə{lUC uesͻ޼6? .kGa?=WIImmIO:5k|oI.//Y[9vmL,{po_۶}Μ̩llM-1@Ï?]1hpQS|g!t- 6G8踸9dwGyx$2H/LgT]_vn]2G HNy !E7-YgrmMf}-5W9uU#|שSJKپW\]vAD>ع9tƍ'Ny ~=#Ā6Ǎ GhwD$"c \eA޺ p{`.MR@{M_C(Ioom#$ SIruMz&ԗX5 > ֕bXYZ/JشPP01T>eVNaץ& :KK*P|길7Ï͛JxK4O &VTr\ u+"NonmmhRWXr6 "*)ޜ/WDA/?Pc) #=ѢT'Q_x/.ȿC@rt¨0me X38R!'5,&fie9.@m *P9 Nc+- a'ojjCFQ]YY>w ke;>>bǧfsE˅~>nJܥUth<z snt(ܰTɔ!ʯ\|gνÙ;|{}LM>Пq|*+9F RR,"{`O->2&% ֲrF5ҳvF!s3&~x 55KKYi34455XUaa'"df?,9!{Bv$W&ʋ*`PYYXl03ٶ 2*svj<;k;'!(wRqK_P=!.*k~S{ƌ- +`ТÅ i >QYXA̢')+{i *!W{Rŋ /!6u* M8gbcs]LUQxUܻ<-`@TX8MG_Aw74-FEY DA}~˜[h('2FoJ)(@8,ߥhMeem}$%%tҥM|AIyAF< dFLwqy@PP\=z.Ep8aӨ.Oߵ\iXg:حuuyŅ1 r>{.䢯?eW 'WfOe[-Bg'{ɋl{W:sNaÆ:2 :ykrrk!E!!{DEݙ^^8p]h;b ֬AhƼyܛPSsQ 4Rzb|Z[Y`]Rjj&)*{7xzʱ[.EĹ):::-q@էR㬷*nTEg^!tTK ,lDDMWԧAV  Cgbi>nʑAq:d+dd,У5I)and I!4~:Gƈ/4v,BS]RUz쩶)(VW|3~7__^v\Y>pfhxxqqx`QH6oFh㘞z Bŗ`vtqٵ"_L~:8 8\ 7Tq8MQ>;Pe<2z5^>eM$ǖE%<:|#M-8x_{b,#cnNYwd$5NOf:;Ilz玭g0.G")Z;.QUjeamf%,. a=GY>!WYOVVDDVv77q>^=ry~>4zB`g#ZWFOF6d/̯k(,y_EVBREy4#3S`9'CGmv9<9ycS{}'T&UG0GNH(-2ٺ'CCyyC/4U:p긤K\Rj ߨb%S_WJ'1#MrZNj"D/: pps^Z\_Qz;!OWW7chi3дw ;X,99Z >OKk*j2ںT<+{> CWB4$L {o_hf:%CmW%$%Ӣ8ZnAѝ;wg~qMM~@an_tu^K`S:uF]URR]\uu=Aw"nIM.v^!}+ޢꭌ}vįSNFNV}`kjlWc3qOKwRVjFhǝ#dld {s[,j44EEbb|9sXh[kC=>LRw+7orpؼh2d@ ^{*}lecc9-9[;x! ^C t9 GXҥvPb./>s?)#̜se˗g{wPhChsXE;0h @ 9l:U77Ӻ?Jэ5՟~^"!!,Obc??w2JmۢymoBhj*aCh>B!p'?kV:(~k闯._ve"MuBJo̟Gu!B9{?m֛>ptÍP.WhT>vj֬cgM30AggK B%%oʹ~ZA>*#j-BC̞ΞgWV}$:'%[jHRFMsa֯~=ʁ\hoeF BT_uZPC-{h}ZZ22ZZoz֤oE(5_xr8s³~9%wD9QtnQ-B]X~b5 suU\4m4M}==ML113'dAIԎJvjڱ ǎ(KIH*+ڪQUScZ@A\Ze۳ёYzĪIgZZN::NN# )aRWD su)Pa>DV1-¯|RUPU>po-CurUvWsr b rv@ řdg ^ȁ6daVS2f "n`z2e I8b[52Xh͇l׬dd<·^QVdf|qUV56UV*(6AA0"RS6 #nk#b2w| "o٫ tƌ(¢|=$t*Ⓜ,M\\Sq^B r5 _p5۲u-5~ד:Y"R,-=gHJ M,-Y¢?/TT1*` eqѩ%1fCULG1r+%JL+=p+i-x 3v쀰OQ?\}n0 &S( c~)+O'Kbf XPyhe)嗯Z^EQcSEYdZIQdo&UfM?EHH@`(*`hgyLyQK[8RV~QŅ<,eDde;+,0,΁;7h;:ɉɑ`p/LOwE`F&,!+V~D_J=x<!aYyhS""""jk vM1c[;Zr9ɥeɋO^N?yOf|,8q_;Zg 9Ω Ej*9NcAoi}SV j1'VjQU2e}0NjZZ-Qoo~Jf(^j C BB~ߵ=*=CIE\\IEGGFFGFިe9KXF셦؍I+vyc,?{v޼g_,۷#m傝~:ӤY[B!$-eд)Y74c1CA#3`QB/C%UaB;nyTB‰k7޼v}H{[Sх ]hjhj:XGv,Gui$*_>*-Z4…E j6/&W0^9P~ !̼*)2+=a뽎J }@LA}^Q*YMUBs >|? w:H]҅*Bf_}왙o?t 3|Ѯdž߅3Q#}/"$#S SiQ>cb}^~rBpWg_G2S60\b͊+WYR^^Th*y[V9Y[Z 'CAB#F{hl 23RZtu(+LP jq&3$ qwG9Fq8G@@п~ _~ 2Vpњ[G,]L=_ykߪsQQ߶d)e4d3_'/~.' @(>hjWT> }yp0:taxd]I~dd+ƌ3柝.n܂J) c\]2_C+#4%) kxABV_e[j?VVVq:BYEE]˘ vu 6?B\&# J&ܽKNj{@Jƈ?5*m\h7Fh̘W èokv}^Jw<[U2e߮O-ѢbSUG{C3G]viE~W;;mW =ص bPQ02+iEרYccb|P>N%Ɵ:Uܑra+Wo`?lz11\v$Bq [?_n;Ցw85^;, B6;<~uyVV֭;^GDyq? >R><-2K[.sܨqnUtQF/,[;=AȨ`.' ''X9VYg$SC2JL5Ted wЭ+s8%'#$' OUF9'N~mMU~ءZ:c3=sBѫW3-T꾷yWW3@rjj.X@AWW{;H-B DHI!4DcUP^YmW%YbGhA%=2dlZnhF1ږןT"2JJa= k6WUQɈp22 ; epa啉jRjh&<\|ʿUAt5lWQ,5_!u+)9`q pM--vvAl`J??8|pr+˥KfYZu Dc8ʜ3o{d55Cdd_UzAL XF\vC:ZǨg;5J2r9ؿ9??8ͨMBG:+@Q&!f'RGTsJXX =yB͛`T̙{dVdk+>]]YY] L/twdfs2s:+spM?bKF  !D2OQ17&EwCY%# IDAT (֥1~gRolDHZ,ğҵ0+*NF]Q+G(=SRj KOrggLaS''/##"]Z!oLzE8̥GcǨk\Ui F|3 A`jfA/c܂ח mmrJ]N@@ÜS5 ϟ kOm.퟿k5JIqknC[δ~5"dbV}ׁ8]](- {᧐ޣH~Z2"2 U[V\㰹S@-;{R7R۔oA[rݿ ~4w&ܼX:w&cD@06??P|Q}vFxy}OˀzX -c|Ν뫦`Ƃzarckfnzc_Sx+G t~q̄/qcnl'1J>+R9 /S!'c; Ã_ ^Н_G3(74 -CڿQ9W{k}c&ic׾V!!ḋ1_Y@PD!uN62! xSgoR[E g q*aaK<3-y9+wIX2wx a72ش X,k TrĴnB:Pb=$%Y,I=#b57TUvfzb\E7?BHC}+$8t%o#T\diiiKZq}*++}qNYjg8A燹(Cx`1`pY>B-eeEDBŋH ܢ>n8G 9yw*JSNNH:yFEVOONNOw0,.FG'h5Ђ-! &\%bɒ:vk{]]xfqaČ(b>4EOw$ a`ps=lT7(yE Mw\)5+XX[^QVdf|靉ɧO4wtt6b11!Qݬҗ RYIW(19o^3\T,ve ɗ~߸ɜ?Y,AA ĭnڵ㜜ZQɥ9?bkfSSESSqqaw2sloQ9r$>YNRg|p+*.CE^oAЏ92B0(+ [r@cP&Ƽ{x-C==lm==D$㫪skyw e-%Aժ*8~T'K\B/ d#ojlhXo.dݻ MjNϢ`ب(brsr{X#)2)QV^TDVQGGFFG]L޾9x DC}Gs*CCi9?-~ t9$12ҦTp4n,ɥ%QQ6z6#Fjx:弼c`O{+%ڪAIQ O6b~Xh ;Sm#dmӏozӧHm-%4kF'ޓ(S 1-# Ћ71cՊG2>:MYt7 ͐s ]@ z﯀>}r3Dypi(6bC7._Nh YtK%iE!.SI ZǏ3ܻ+tj0*55Rl3,]"-| o˧-ty-ʟf]t2I$,&)ᤥV^;3tmmYYmUU Uw+mmP0}:\uA2wDd]]y#WwKk^Q~(۩xp.M{R0osoO'[w` 02F5=wq 7AB]:;b|͸x[)UM[UQ諭|~EmXw]󼠰5Vf6׿ۡ .:z# <<"vv%B<>wQ\VI@hNfzTWTW˙D0KBj4tEEjg#4gMExA. q.B֖Pj/! ]ϕ:Q1Z8kk"#nYZ2NuE z3DY?rdiÉS@Nuy=]]_~/ NJgΘ~جYǎʊ &VM ]ޓV02ش !Q Yqʲeo݆u>Fn\MXX@M# gx9'V wȐ9z_f|N\L?q /*rPCm<=DE{(a_I7ћ71d*sO22v̫Qge@p4sӇXy{5jOX~r32?zؘUb UQ-,1i nZi)غkBL79^!z:P?zY_ZvEb֮eFxMB.' nUkL2 &׿o: anmz;yn E 7PbW_j0,ЈO,[vKO'Ğԙ{_og~ݛuhlJ͋Өp2(VT 14$'(<|{\莲p̚͟flzWUqz~ ؟L+U=8ظG8ܦfN/3br6s&5A}r.(Vnu.y9'>~^D0#_;'@=<0 i+{'dž%EXh)Y9+/Bssi)cz)&Ja7mhȡ4H"49|:L،:9(𡃾t m&/>?Tg !ʧBp 6/ViƒGxJ*)Nx wPi-v

|*Gk+.z,b 1L}O߿(q:헔t57Y Po,j/*)qidSա@H%%{'rTB‰k7޼v}H{[S#79{Ғԛ;hkUs *kRWX}^Culr=Ύ9n}}[[}oRO,/Na:h98lIGim fգʰRW>օO)Nv6{2K˽?KyyCZ0zoٞJߒFXNoWG PDž{툈qVzʕK2x˯Xacb؋o!1_# * Ï6`v,:U;a2Knp %N.y^n?Ug kNP%qI]NQ]ᩩ۷#L⤬8a<лg|_d90ovrWEIroNE6fE o@ -n9JZŅ*J/8 8wm,+qٗ3R&.{&W=vw.94/k($dzXvUv[[u5BII7&_ *5ͣ55ϡMA>WfSkމehQVPVvxB˳ KpH09_89f [D)X짟GB<79VP;*X,yyzcc{{c?J u u7}eC먼%Kˑ#OX㈩ꀀ0fe1~<=ބF'^"_ǎӖ۷7m}62l;NϿ3_3ե#t㖉 FTꚞ6p](2 u(B(/@%!atRf\F;h>;tt47o֭_>| ?d7>bbBBkQ^)kV#TP<Zy Ͷ}mوPÍg<|dGk҄`p*?4VWBb7yY |llzs\^JwWd=E]u% hfIH-r[n먺bbf f2 MP(i6vS'!5Mgk/2d=,ZtO tu쏉{ZZų I(4n6+V`f`1QSi Aj6}\oy\P8|P ]N@@ 5A9nT^ yG8S5_`ݹè@ ߟ@T i`!~jR5ZA+mޣpwS/_fI/Zlnh|\rrc=:XY9p *T?%?@B,t.1*魮I  IDATHۮ>艺رX/@ fL321SWEVNWzNvILCYyo9Mqr}nOvh=\M͹yAJPzŵnqtc򋎂 Obba5'?0$>'9A]~i!CL@@@o*Ee#M!3ΰ.1 3!:psodދuϟOk 2|ʹe= hgdǤPm(ool*"+( "bjdj* [Ⱦ(._m*:wwut2pRzClHH f:ZԜ/*AgyA5Yן`eO)`,n++3Vy݂,QnUfjcז=DFٟ_\[!-,! T;A弮>=?S1TqFG`<< g14U#kWY1R]N@@zޜ=xmF%Y+D;6(.^v_V_#/_f.L MM%l]eHa%|MUcI};r,.1&_Ź۲y[c7l:MMi;+hjQ?KP- . _EEp@Ίihvu#tq~4s9al'ȣ3%efםngd\#&g@fnF@ >R><,XDTTPPTWe ` ^ `c<ߧưړ+dp[c]N@@܂;AƂ@wwg'Be U4"^y-Cw{' pۦ8MY65AxB{5 x}Z^W9GO wSd׌Lj/r͢Ez&~X|±c>{c}L*!".j͛L׭[KK2*ׯòī{ѰR|T,IG{C51'mEy ?1T0iRhg%%9ywL,ιpa zwEAEZL ϱ́ƃJD5MK P6h}';:5yjN ,pa,/ .ݫC 2/Iq} GZ6!m+ aIGv *$_#;F, lzNC+(qFό; eJ2^[)駯6ѥ9J4^^ֻ>הC|^;GWŒM_{n##Yu/_ rEAצtʷx,[[u;͟a:~CZ}#4оvV%(\~ay{j`=7%_ҤtϚ[ٵ ]*/;"ݟv }Gy vh:"?" xdd͘ǵə&?JJqrbEYr[<~j"߀W^6&ʥ ptUD9Íx#ȒҨg0Wܸ1fV0=wa0(01@npXdKdKn+Tkstp.9 #P3HIdΝں|*)n./}vVۃ{lΛزVc󯐆C_VoVN[Mv<i1[RE .&?iڹ`,?]` ڇ4Aϳ?  .ܠdy+#@ЀOlɖl]޶]\'N˨xŒd7u@64]GVUkG9omž_ΆFΎ,a| >Kr8%%XdvY]Yxo}2ы?/B._}''˅퇁)+^{h >@ ]͞ckUy`ݥ_~]ݹe| ZG">폾o>i99/^W[s/bhy a{2wyy`/6%2#ct饅?w KJ/ܞ;s1.' x d-Ԙ%6W4Tt%<=R.Ǟ` kKjfkrc211uA]@N/-}: ]._r<2t`T]GW>] D9`MJ7fe -{nu[|/ѐ_;:qٙnhb$ bk 7fԥ+ q5B,|mFܶ~!ݒ2* %v>>vׯgf^Icwx/QϞYR@Ѫ(CVRF͕е[z 2ggΟ{/hR7-tix8+S`yء@m9G=)fɩ}Gbշ!!IIZ;~L>ϤhMǡ !tM2dDDdd60lr\޽#M-v%'Mt62ڳ_CBmn~޷Jy-- /5oCTT#,rtv4SY|⧟" %0gT'%<(%%qrzEErjԈ7%:8x+L4'AC\^$ ۳~\II\\II Iiibʴ^x~X]W T,N u*W˙Yܹysk+i! x7S55Eqd=h\~1i\'4HO!tlkWiGuo3AE36_C-/izZ0sveeml8Q<9ͭE-= 0<~폼-t\؏,גRgz_`2㹋睻XB6./%;D=<+ӝw>LUyG/AAo35c+TlQ]@eWojj"ќE 8S[w@87?i}3%xrˮNzNs~TQcvv`KG[!AAb b?^D>r0zUSi?P0;bs8ϓ[aoGFl/oO(U](wf T ! iSUH[ ;èԷ&9w=~\|5 1eʩ~oz5)x~_E^a8ˍxna??-'?C%%JsrfeuEquѷҤwAAQP@؍$XTcb].VDE"{[Yk4s>fμny} v] 4Қ1C! ?kSa״'g2y͜}B{ qǸ74|cV75c cѶŏ(<1OCtk ,{bt494$$̶׳\.du¡A DID! uDmCco:/gC>[T7Ė҂ԕ;=WRܳGMc2/ KJ?6s;sr%QQMko)˃܁u8\ChK.aEnI m*h7oN9_ZX b`2 $=Z2)qݷ~TI*(Ud-uc"UݻUqk|+gemUq=8Pz]A%p8apXP.;bA@'n4htGu]blI@LwR%686mljjaa )|98ٳテh BC?" }Y-Ā:ފ~6j*?jzU|U%-eo hGr;:Ҏr4hx`a`ƒGZ>g}1 fxޔx瞹cfUS=TD{A`!8ĦUmUF,-TT,-ãhj>cJ rWg͞=ƍ3?~#Bm߹}']-@ 77%g{ V=w{Z#Xign\AlhG^[ X2T_]v5,x/#{hz@8#-w$a;u拋 3Bp+V@0@_9mxɺuNM!R|Pc*haYB_W^^_w'mr~!/|Po3{~.*ݽ ptr\N\ˣ'cFS*絵mu۩XPNsXRXlFǠ4hx!tBՠ ]#c IJUyMMPϺ347 d(~Q:{,~"ݭϣ BBH`JUjif6×<g="'t3v:CdB" %{Qrn觑 4޷>~g=[\>% :F5T܎/Ce"'n'BX5K}[EZ8E74(RRlԹs&xf縉gNRogDG`ͪoTtQQT?}: [Y]U1B'N8PK ֵcKW.]"Z.D 0&kO) 4rGrϵ5)ۺqL )7n"'K]8,t$~ wT2t>MM,V\\WVo 4alq9?5ui{VoiySAUb*\\\] 39MAV%"ƹs޼6g޽ڸ@kffeef ޮr饥ժrޚx LoD%<{ޖ}{ < '1kW.A[!+kjN}l;gwS66@_+.$ 9"" r_ֵB$?$2陧Pӗ@ޟ_,-}Q.,,.fLHط+T_?~Q0m㵗Ah[Q 6 Fڽ]9ffg/XaRa;8)f6:?w=M%Yِ6!]]EVE)BM{"4mʴi%@/n4Exp ѠA 8ww)j+!m"ʍDqKJ:;b >}\ꚗڼB\2XTQ0T`5uӽ?bKaa))(AWA`^BN [`.Rc]2s5(ׂ`;CRSYk h5ewW35-U,:>]águ™\uAs.P**籱7 V24ap77CD{3_N3S L9 H:c0즩jgA~]ѠAsTW'!T\@N6![< ~VTkݳ%L1h%x 0-ѣ+ [cǠ㑒Fh }~ool,.A(/!L4Ip ʸ?~ j}nq!2(05a2Ns|w&̟b$ 4#uL3I4>$rG ֚-BuA^^A#W=7s}a@J0䨣dnbnvfZ}Ȃ¼Ȉ oki)+IJ*gK1KJjk#={Y 0e+ C439Ė2nmPTs͝[SRS}?IQIT0M!7Wpy֒5܁z$~Dg mam`l%4"TU Ub#qa-zRkL&ݶT%Z-^2BCk]cXYR[VR7ȳGR=o1Dood IDATMgȀYW *-yP}Qع^^ߥ<{.)Mj&bKiMr yV.B:Lj2sV#C*X""BB""/[{ڋ] \F&HO/.J.++NNqrwxյM-յ&&ML$$lk{_}nS?Tpo.*@()fw5 )#CR ;{=~ 9` -ΜԌĵ<Aww9 O +qkf E7}7§#4(pq]ۆwK$W 4:GNε=4bǶ;vn)V,۷o}@nڄPt,z Bfa?իJL޻x5 K \lm?9TUAtν^=̂1.i[?q]^ !>Gj""M-@$3ͬ! OA>)-1 >Z_WPణ|ȐT4hРyB# e-˗IcWN-ʍeE>j ,-`gkQv<{ᙘxּYn͛]!XWQ!,#qĉڪ ` |hd٣A'edZJڑ#5T:Kwe>tzzEEzۉp7G#OהV2"2Sf5eʊ+Vt޷5߃+v ,Gcas'<%+zzzc4TYoAނTu,:ꊊN:}5[FCeYF^汄، MƎ[زςڎCpw?s\&8xT*\XeР[`"-O"4xqu}ea P_WO_FFeg(vK%F/v]n]N&0in߁صL_lSJݔޣ]8;jO0!=W}{cgBFFVsWa} x.9~ x՛UBOWX(8tÎ67~I_<0Y~ZDn];{lbhraG!T82>(Aaa= fR$#3 2qB}9kWYν-fM?zd裮3oBYYHBAONHiۑ]U=ڍiӞ? jfX_ 럿n?ˋOwMMJ pZ[TҗXFH+)O"fᆵ-BOuO]N.t̠qCZ !Ns}B'VU &ݚZJ i%5k ::Zp0G"cρ*D2??7oRlo݁I\k; dCL[Me^ddnTV**kLM;3[I2I'/8=)')&a|[dFSWSphРA?ߟ=7ݤ/__vY%,~OsQQKݹdaTKs]K$k=MuiB-Ylk۶;8ٴѓM:-<.a}d'L8뮢")IM̯ĄIAga8 Gxb7Fo@,m}qXDAAX)۹sё.ԋ4j|)Y5-cKZ[7q֚red$R!%aޣ9wy.) zvbKuw 8vhhѣ̺j&59yҪBYw!|4P3 "G/Ad+WzhYyL#6@EUuԈ捍zZz:DA]r4htV}* E ^:KI!T)XWYZv}qQGg@(/{va|~0XMM?Q&EW P٥&?4}'9sml hG9 4h|yXH"hwuMH(-MH|Iq¸.cNԫԩt۶mpH^W뛑;s3k $w?sfܸ3Ç}QMd$~ԃ>kѠAƿ<^s3HܺݹH7[kZz78.}3g|b `h2 8989tly>1[!`Z `XKG:2祦@(3IH1kbGoIήmnu7)manG}Sӓ|9͜ꊜ F֖}]0!ИGtWP2> 3.2bڸKhsʍ|!F9-u eebt+KbcriwqL ⽪L)YfHY'L'02YY 4b"wLpelBA('kևt10ffdVVe䅇_wZAVm]AO0%Af>CZZT 7AGGNVGg,g<**.-ʏp;&Ʀ2\zSq2= "<Df:>BG?[4hРzxql?jiN+%|eb5X@ӧ`zM۶p% u>]N.L H qM-2+dH|^nHHX|A^XuljOؾ斊JLXrJQW^r(t4C'Nڙ"n&Ni踑W>*+kމW1K@""#^*_;2_@нgϞ=s-mp!\J~hРAk֚= ژHpG&wfֹsqil l6fOhb2iÀԇ8!'$ɔCGhukkKj2 k׈&= ? 6[BblS3Xbrr^驾wrCL˼ior%6/@:}=A4䈐 myedo=x37.>Nёў<)3f6!K +-KLJk(IKt((v IJsLb kJ|QDDeWE gN#$*arr{3--1T5Ub1A= $RAn ((fS)e⊊8b= *1C&,3 ^9rLz=)U~r<Ԝ2 *3f(Ʀ"|KK"!E#df&<R='WyFͧYYB|w_~Z ]DaC^C[<۽=W\8Ѳ}X\.te9B&clPH…(g֩S`Ι:tɨq&#CU$̬|tiĉ!a !:c72ItK@ZS{_3uە  :^^w 4h!>~~^E.\pGGyxLί(Mϒn=urS'&36W46Bh+k/ ?6iyFqi]\N|3gO(qa?G]ooPRBR` 4hӨNHgΑnWbbDo9[p.YY ΎK^|y߆g!EDDKNp160#g.MəPcL .rM:PgՁg_C77WV2+DϘ UZPRt Tz Cfq9߬2̐QV3| Z-^)#v?V9tc)S*?oDg_A(6vfo_?QA\l4m+.AF_L]u&l$܂8oGG[Eu~ObY t2D2q~-SOb\jI>/NF(+U(q48mkZ U)+Vl$:g@{ Fh͚Oyεii(wphuCmQNV3써ȳV)9EYϛ3\22rEAe[CV:]Z=fL vu:xb }ż]%tu> jj|96=>׏k%\!O0镽Uέzt,o$V?[\ ![foOg:惇@c @`Z$$u^YSH.TWuu1vкou?[,V]ڵvq%vLO_Sg^R2&(+_/g>޽CB*+Yܿܳaú)ZYniU\6-̸|3s1 >C60i<ƭ[&Ҳ)nW.I|Lp69JGG^ި5uG&4qxdMMM5^~mY{hPo'ѠA lla۷#tAtoS 0{[ET@|sڵ njCW\ لV:{08IKC4Qٙ[6Rb1(5k 5yz"/~sk;'&5((!TF9(A| n$79 V0|9}̳f/+cٳL-+:`U/71ina7ZZ\|ty<EF\i;$9FLLX'WU!.qqjbYd6I65pY\.٢/j`Խ0W2kj ]I/gO>>c 4>L 4ht2U9ݦB/q+QfN3Q?  YA:ݵIw XUu{V[_Dض0!u5n0^LE`YP^$% 3K۰r+}O#,vpBhX+kYLjd`B'NJ;KAx͉?V>Wz sRPzoI]-%UZ !Zƹ196w6v%F%)>ZUw@J Bw9iN7cĨnJɅ<hӧlq@2/#}`Ě>]ǐnٹ u=Nn:7 )STU/f8Cgg8v~3/m[Zy<yZv;?LD\IiXsqu?s?b<|X\8dpPPe{v Iv!Ԥ`2<謕n-QN+t-#!@@x$_z|,(]Vu8([Ցdii}}i)ׯϜq?>-C,[o2܊z2@Ey.ж?PӶII\&Ĩt. eގ暚%Ys$H|٬Gu䘤$Α@y9Ey9/))(?xHVZVVI2 ؇Ƈ@] eJ> 5>5U"yyR/LM%#IUyK\tdme+ˆ:G>s[B_d/Bd[DBɲ8ɲ8YF6!ANul47ZSoeVFQe^vjzCeVVpR2,^&VVϞKIXT98))Ʀfd44v冼sS!=&Xg2l`?/\TVTVn}؊Fm`c3zP IbD@#_CrP*2rݺ=TǍF{׋_o_R\HU.ofJ)t74teҤK͕\VU$_'81qc{zOAi|$xHͣ,&p@ ;~^g@ʃK|ːa]5e1- ƓNilr5.ʕ=냟-ʍk5dAGjvjB"Rdy+ZQGto#b,!16&[[ ַ  8l,-H z޺PjQ ||n#/ GHKkή7-"-ɰO?uDe/6l%]ԬY*q1X\KcҳN ڬhi# 7 z۸pi}b\>}`'XhD8i:p% 9S0釻4h $+kjJ}:I޽{ۣO@o3-9;5`n^ZZT>88<<9ŖD^@w?"(]٤ԫ?r EEsiC_^w~Zghv2@ LC# )/ild0Wו+ ]?=!3C@6(qqБLƧ0b=I\ 4!~{,P; v;n ( Hܫ&F~ # e=c }phv:=|0{ceffU } +}I\#\ LBx83&X5x .p+c_SnK!%M{nM/wi)(ގUU ]DNME48)f 7~>ݿI4 KgI$nh+)}bh9$*!qhi.iA A-x = k-+Kpri<B&s=#0 xj8ʇ Ξif6{vdw,}1˹Ŭ2쓜g7͍xhI O/B.Ec9>I~Pih&F۷ uH\d߻u{ ǁ޶u֭/]El$mdB^DkyCTj%"()wᡐp!B7nC.F ?`nm[N9WNz@ɡTSv5,cͭ NXus pskhp`N4s``a/Q94!/VVAHQjef 8ؚ, xxa8DqnJR@^/eu>⥲B,!C,q2D|*O:@wMw4hPhl,*"^gɇBՋ\]9qQmr3׬Kf°%e[n\˪SOĺ0) ^$4귝mq1F%:zxMkڬ_CkzfmRtuՊ֯ddʞ?=u2RσG\0Ρeo=s} #8z撳z:zcuמ&^'d=a &5Y,11]3Kʍϧ_W|2Ф'/'MdmDl7gcpZCH{֐!a UTױǨ+<)6oӧPnROuDuyIqIaϟSSsI,Y zZX]}XF n겳zo?66ߐ@K@LNsM3~-b=`f&_s*灧8u48 09J̬Vfφ={H u$F GF, }g􂨪NH'5~>IxB\r@mۨݸ**gƏw?zMNᶕN÷mЈ,+Nϲ"$dƔb!~]s?aC!LAqs2z7_[)aÁKI>q;wyC_Mm,[  ġRRԈk"r nȰ-ED~\ӷ^)ڑ%EԲꗭϞ0_PO:cA/苐K-yرN Xǿw 9IMe8t-З%tH}x&PBxx0i[ *ߴ?`_gè\OU/g %8ƍ׏N~C^LR^'=7ǯfĒ~& ƿ|ÐIIn ~.| 8))_T H?'4>? ǻ71.@:< `ᚘؘims9V7Egn\ %% %%< -#sŊtOi3=o'B&&[3$DX@OKwvn6<.L޼sgyS'!ah$3Z2}xɲ@t%Ex:Тit#2_R XOgh?5[Hvlس_=;[ZcH _#++< <\p\H\py=0-75k2ۛ ),afm\Y:vcd4n_[ڂ s VQF1z ޲-[yּ6A_Vp \;hJ8~Bh|~A/?H|Ab }~mh{>vTV { qoVUܸlV[b`2 A'"1nTMSZ*'~}i)0b%&ޝSpN^86g׈PFٳݾcC|.wӦu?QO+*@ LOKO9Jy'BC/G, 1)[^Z.YP]d D{sWO>hPv5Ih))6[JjK rL`b ao{\f}Ox31,~A^A55VQ<~3_]7[fɒiNgݸ}t۫R?VSZ`2kn6Ȓ{qD1 2{|#*^[uBU3rrfF`:@:lljk#gVE̥$?p#Bi}SQkשn=(3gJJTrJD.#J*JZ5y!9~bKBOF ˅f qV} HPr_G;Ŀ cluӠA2Àx9ᄗmy\=P[+_l-YTN]Aϲ݁H.[H#tJ|پaV@$"x|7/37 dV`si K#}Y{|jTEK%*j}~~9+*NxJ{/^xc\ˤq@\XrPYds(a%ufgG̣tBH zIM?ON;+߾}m.;}!^R.qvF@<{vS~~MM~~|RIq tk cHR!.pX,Aܸx6`9.| reVYuuZi-DKIouʠoKI99#cSRQ>kq McaVay&,G7;S $#}Ӫl$_JXӷ0[# -Kt,"cl aJʂ#7 \]R]K=5?5y~>f^]f>/wP:hzii E)˃߃`wx>1><^mwt]ҩ'-nrs^$L Y=!G5JxKX zd/˥%1|mmJdREv3[g*!_\g>9J;0++T[nWUBcs|*5e pPr CuoM \!ɠ)q֘%q+2ʊUMpy%_)CԳfq`]QZlX+G %,&xIgc9 <>ǎFLkҚ10Ն4x}~}$k4 0xiڊ#4'[kmOxĉa:PAݾSl+׮n7Tqtki`~A{ˋٲPl{|7CYsz%eT22R{;fnAvh'u`~x:;gĈrRp` y@鿖 }(J n 7`HQ)[tZݸ0y/͟QS#-$kB cF19{v"kkY8c1DsSJƿ&NYLR^~9QQ99YE&V#EؒEˠ{ @A?]q=x*p20~>B~ǹ|>տʊʮXembErβeiΚgޓ3uqywцa!aj*?A!!'J>}6sMMx*G W/?8Uk1n6Of<| Kà>a<(VZ}ʠ kz9"" 5 "};e>8yH[)JDS}$ƸC7AWw޼wmІݙ].ǼBFffR21'#]Q._4>5j}_Eb $UnG m"}þDDG?`*JJ|Q={tX:,,v& %e\.B@#ʹtJdr#+4>IU=6,x2lwu= Km[h<Db0ܖz5+F $. li%E^B- &-qn|r%HdW#h /9Hd^A }WqʈFgں:!$ƭjЕ16^vGjiG Rd0/ol*48jOJ $d+D{8ܨ2Y6oQ7j3qc{ @97=צ۠s.lo O -BnIxe pD;ۮrŷ!FUW{w^Dh IDATk;Dlv-/55 Pl@+D0.2ҥ%EyAFퟳiиre޼q׀xɬ9@Pœ6ѓrظ0{ִ?Bb]xۯy<[zW$/_WgazLccGS ZfkjbC>D`qڃP ~i|j+xo'G'׀It<sst#aa ;_;ިr~ ԙ۷_[]j%^Y9 su?qWM#w8y|z-'w' ><)BC46*;9JRyg6bjJ|yǛz*%7$*+WZ] my'6)hAIRY&3IuuL7Kt͜YYcNCj"ͦwNGRMXz%%A?G4>5nA%HOƛG'Mh7$DXLqe0L^F[kΌsF=iYo#J Q_ktMqƦ|㐱vnm)*"!۶4 ;5 ]D|Ǔ'892!cc -=٢b3wmn_T\= &">ǁؠGӧE@M@l.Z;ໞ°k7 p7}$ ]2z(=#i_|3EMn@XdݾhL&kW%Lӯԯȩ1AcFBAABp{Wn'WIS?$75y&abi/Ͽ6j1M- qZz't]ؖec׭۽\: }PDWPpmgfXٿ /?Ya`;3 L-. G|yُv~kŗ"IB<8A~6i|pfۻ𦪴NK)VJeUYdFT@DAmPYd@VeEŲEZV?,ZֶPRJ|yߗ: )I,yKr9瞜`(m iO&ZN/ <֞2YZsK{}e[+nw 'Mz }c:5iCG 7 1n,+m.hPSoy\ɽyrޱ ?zχ kl0᳹7TKq9|pL2.> +P[IJj j^xvT;KSRRVJLy{BgŶ[Ѫôef|۶+is㦅+J?G*Uʓ]/ ْq"8se;_.P|?Wz/[Jĝt:džhlKVTwdch]CΟ?t(@ظ?ΧwgDE^}Gͱl+p9Xö`KzY&9So:F//=kx.Z円Μݸ5 57YtHH|RhBl5'?ar8%j)xd)ޓ+WsneSHygχ'K`͆%E%ߛ"Ⱥ=ݴqjy)SaLzzVVz_,ZԸʧVeQ~Р˃U*ThVq݃ջ?|&!~͚=sYOy+֯# <<]D"Ua ˉ )^LhWr E^pϔ报-^rˣC7xB<>,?dlJ ^=>kzdRhA7m*3O\@^57nKظ(uDk*M\+ o۶t]U?l8}VFlz57^MHPjnOr~o7me.__4L˖LC/-J-<0|tiW:ڛs{K?´{(HC/,0bX:!!*U7ddbbiN+éy_㫓kY˖{o(5 n<77''+ԫ fqUQ3~QK}ʕXJ]dB˥~p dY]Lm3//^C^Q{MuK|…<7`[d5[QdFvliۊBY\9zTONcbƾ-/\ qB.snFEu,,ȆzRUZR(L9ѩ#e<^^P}Xf\s>z#saÆlfriق&oAiϴ!ch)dq1={[ڵzS>w""2%*￿tiO<ѯ5l\GP35s~CjūsNη|=aI6ln[>,x d DmԨF\CC5 ٵk_D19`ClyyEiinQI&K)zoKh)~0\^q#99!!..:zʔX3P.4~+W~ƌ<Ԁmb2Nii۶_xuu˴E ==١Ï4O1/Nl4.@aU9> RL~mRwhT`p?OY>eZ5| {igUZu^at~kt]"5h)0`=go ѣ((,j~5~cXcV7zkRf7exYC~ ._Kqt"&,3 J:կYlӦrlR.TLJZw;Rɲ3񷿵kK_'XQT=W+]J!VM~-;U8Dڵ=z\ -Z*U*!g,h[ A`)9To|O}LIѮ3%K"R e8ʛ(gJ~(ַP~ɂ}Z k=`EZJٳR jaw]V1Tde%'+=oJee+W1VD4p.ʗ7\Td{yMR;؁7,p9Yp0@)R#G8cKC9FYΚZe„ .`O2\;w*E :`;̋R'LTe3i&{V0\vE+F)qpˮ]v+y(Tc;GmcƠ:`;+WVǎ+ܒԼ:`'2|sg_L2 5[3W9`+2|ꤩS31wF.;1W9`[rvo~[7r41W9 `s ={{r&N@" JJMJ-/cŕgԤ&3?9Skp9<4ϸ-w-ywEsƱ9OUJ%&%-/f^Ԃ j`CEWn 1kϑ+7E1?{0^)s>3;  |+7E1f F7w{^zM9|R -s'r W>YSQyy6&LuKȼǎ+ؾs^d^ xf;@4fL1s&,UJQcFRj OG4l0Eu9L+o԰QCBniܤqcBjcE3Wc:d+J?~܄C c0\V+f@Ɍ~>lʕ+QX_:s0GDDFNq&pKðaJZjRqqJU._kVYCCK/s|ߖ)* w+!a{]3J}˥JU,}@@@f͙5G'O*5zQyKcp9Xie˔z5^;uIdp64P*<<[N:[(u,r:߹#JmٺeR'(B^0^J yeN$0~ͺ5kVTr * whT~})u6y!HZoEϘ>Cs٩J{#Zr%*똼Pp*ߟOR_|b PY0WaoS=Ȑz}W3={(u;u70 OƎ;Z[cp9X' l7p'ul`Kc2PT zl %3gS7<4?+UB'-f2;nS*Ua BM`}JٶrYNwGP0T 0z6j %9bꖗQ&@p<)W*.\pQ9?7? >pn*j)Vv^PfR)))]UK75V[w{wg\ȸq~~~>M4mѴYϞ={|)s *։?Up o\fޤ"Z*E'-(iQ̛OqYKkC_{UK/w*|mşAʊWzGˌWm}Q1unQ0Pjj,զ'Sbv,XJi62g˖P̣,G e b;W p2+۽R^5E}PZ A-۶n)?@_ӱsNyyzy2`~]{O՜mڵ10pX@@̀=t4jjVQC5j (SLi䦥JKOII>s;Oof͟nT KkP*&.'hIؠ>%>1ҽcSdoRdUMT=+)0 p錗:jU.Q \l }+﫫W/ҫ۴ǟ~I^GԖ͑#{ u[|!{V _);rq&P0>El(=OܓM0fG VG>EAܧb`?2#ض\22zbGɾN(O)?\2zP1@{gOSz{'6E9Iq9B\(fUUTҊuwM;lMiՆb9M)WT2zUSnأ>g\Zhb^3:tQ=(pӹjQ:E'2{/>"׫W8o)[R޻ҊKu'RRPjzT$%r3EkOb8j{:Q|R}pՊ̙Fէ09+q22Zl4dbf|U)@kiۊ"zL]b`o)fʊndBVPZ1lXĴehƯ+y)yVu;J sO7pq3B1LV1Vo0Gs^#T Ǎ6ҝvvBUl sf* P ^=)'u6k)ݙl;"3%~SLoQ_B0k*&?}i/3V3gl)7bp:j@UEҖy븿o)9\,O(CC(i̚2=OIq[1pL.1ՆcrF?:)-d2v٢㘺o&Ӷ}=finQdo <d,ߊ31YzLOųT6kق"{:5zb-E1˝ٸڵ3Lb;p-_yh6o1aJ~Tj~foWP=X8t"˦ib+3`Rd[,FIV8cKPA˝1+Vl%-,]Fz̕zb-E1˝ِ>҄""?K-wKЄ8& CX߆j{ 2*/B)E?-gL~˓Zjo*LFbcRoF1 lG^z b-@A1\YL~.CGy7fjL]M&zU1ps*˞reƺ!VcJU)Ƚ^e2ܵVKb0\%?b6tCĆ "vY򥁔kғ"s EbfѤ|vXS=kz %_1pƖx .w^ӦSAe)?B=WgȐ ̜n(^DٻgϞx=M[J}ie?)l-oN19Sƌ,`?LINRJyͷ)ճV vmh0n1uJ}%4{r{a3ѱ/7r}LR(*PzwbW 븿i=ǎy)P2c){R$ݟ6EZUwu8o~(1v-E^cl2e+0f)xvm1,ZJC/RU`,TTQ~U 0{x |eI~1@Ae@tJCv2`z)]_^fgS)r)4dT -C1&2rp9Ep9XC;PJPE *ẏ̫r((-j@#̻IENDB`gsequencer-3.1.3/docs/images/ags_midi_export_wizard_no1.png0000644000175000017500000014126713607210263021030 00000000000000PNG  IHDReXdzTXtRaw profile type exifxuS[ w]1`?9ʥJivM5Dc<[1#-\2-iD):VC;pՖݡn"e/\}n"5u*ں^%gDi_mi+I?RPoOmg;ZtáYb] KF˲VŊswd(p0 ZjRkLz8eKv[ǡfb3d>qLS $eW'pUIs(}չ6@FêJ( |Z[fx'HbB@~Av53~z4~&w`H;mňHezTXtRaw profile type iptcx=A0' C9Л?F[<U ZOkLy9襋T2 ԋa/^ojʽViTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later 7 iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxXTWwPf:CgE`Â^RMbz)d7}i-_M1f5njb vA0t7g&hd݇Gas=yl,3dw8Ɛw&OoſGd:` á9CFp#ι~ﰝXLL B͹-:l߄70Mkk[koFZ.3f//6h5(\@! (d2?Kyy55$\꒒۷8X?婻w}eWEΕ0~ܧW>$o3mՠua0͖H\>@cuj"$iT2sj榦چz6ʮX[WPp|S# S8_Y˗/6-4j*oͻv\,ǜUc駛;V\\XX[7bDzzi8=92c0z'%\.IxܳK_m;G=>23"#ZɧOh9!iSV\0?:#F^~zzʎ=rLVL7o$j5L>MiY>yYiP=Iƛa:Ϟ֝;3#g̼iSC#L޽e]&ժuu6ԗ]t~;-M>wѴ^_U= hj.(wF>3vɲ˧OSi]/fgo޼gwY#B>W0k"NG[H_5ØF#=}ƂS|yw{n>%bmoPsR]^bEEgdΙ32Օ7UoMQVa81_3|njHF3{)i򊒒%._nWu6^z\\$K.LHh5WB&''l#NFċ-o'#;A~2bƥL:"ۋ1I[\rZXՋ?+$$47;;:&cQo z hՕ79dƕOV+MFG\.^"co_RCŎ6=bb#"`mCcQsIlܤ2ar` ؜uMW[fZ!f_2cBV"5L$[Mcd1;~b3 ޣ†ߓbH l:ͦR7jyDd̘zIHGq>>2Sߵu{g)lyiwuȒ2u.. +rG}n䴇V?I>>">J1nٔz}__O\?#unU^0Wː\ (\Aj/t۬VC Q …}f=ؼ}gf._9rXLӗ+wLJ4]9`^26~\ge5k5jalib`knKU5ߥ'fU+֖ЩSBIK,gN$balus= ӴwLybIdCO]`Ġ@gZz}OOg^?$O}Ρ.r*WW #<.t:7h#{=Sau}2mq8,^2yӣuwiaO[?E4f謫u4;i_~7~{ՏLLH=uM-d1My{ө- D^~mm_34&q,OTTd;Z/_>{&͖bb]]T&L]"9R&Wx):}G;?gNuw]*=| ZLF2ycX?YlQiam-mA Oj#.W&yzٵ];6lzQV!#?+n?s~ ##Ə5YylG\7UW 6Vk2MYywffTTPiS"\VoP-ijugJe6Or崩wɫnG-?wN}ǞZt榢 G%"k_]sHQ'Zsϫ+u.tm(ye_Nk;lU"[fkk+xdIqk@& '<)1{ȁwu.46hNĄKbФ7wO#UKX6u3mK{dm+ÈDn6Vm]EeB)SҢ⁑rFEPTOOWWOVkГ);"bYG :]\BBG${zp9&SG˥4}%|O.gKe-ycxDRRhDL~>jԈo_j4F;^ӧד%<,\ ɼ]]4듐+tz>!!A!26ecHݫ784>aR9NHfrwcc}ɂ8zlYW? &eZ#(쨀@Vvv{"s}cfdΞg2_TUvwW%&)R7w;l\y~OK}٨w%IdCtqPH n;ʳḸHD"z{z{+4+ <Yϑ]zhi77ŅrD'7?D1"O]\\]E">%K8 Of.͎dzZ5J&-I.. lzs"5qɪ3;W56ɹ52sE"+yvsqE+m'G&!zlOM&"MVE6[(HRWW.DDdm_y^*ҷy<75 y8#H:>Mif\ac||S/[>nθٿd=ֿ,^bwf`GJ$?| B)=N6ċd54=Ư^.,^9sƋX " ]0ys_PŢ3~&\}09 " E&ċ0L`/0!^aBÄx " _8(A6NsK@6CS1xll"᝸)9G6 O&G6f4LYXଅ9tZSm޽ʦvZ*6}+8؃ IDATH%vOrO&5#HV>Q9sf`@hH#AQiif$66~Ĉ?ѯ??ico^8^9dY^xGe=;"!1Q&2:`hӳ)_y}8nSRfsM*Y.R(4fd,Cvr`/{xX:FR ^l/رמb Qii)rZW_u^)T]m(ƍC_; #P'i z9- s4!9v&RSc믽탿Oi-OeYMSO*/+lPvthu^g0X-\{ӊiZA&^5[~w1fvswu !uv2: ';8[9(9_BF\Fkg)ժl9k9L%ϞMMIJrAj=~7ܻkfVjae0|>M[,]^Rp yrՁkqx,:Q_B^aA4%?zC +i*~DFܹaAA2_@ᐫI`08֦sgΝkhq"#c>?ۮ:zC(f-X,VK zA6o/%9!FGs+F6o|f򐦤̙vڵs6|v՚5cƘ0/o>bQw77UWwݓǦDD Jb_@-,ܽ{&Oޤĉ ՕɆ?dffLfw+*Nzѣ*Uhyޛp*rD}/VW^$rT$^xz25k̬8ORo!ċ)Z9kwbglR%)}_ ؿ/{c'N|e~ %J$2B1rdzzb"eBDK|p|j]slRTDbohhbbڔ &NnkX1aG,4dU~Do48a٩**ju}XY=wSO~poE11K<Oxyؖ왃9qwJI]xb`'vyl'/hK6;b]L60$wdB3pKONg"OEg .AÄx " E&ċ0L`/0qn ԩ͛˭V?Y^|33SژF?jrB[f'GE=yԸ8o/>p+܉=0FSsK^]۷:tBCco/=}ڊ7q{Y*6}߯_2m˯ejy}l䓜C_|xb]3A~JKK{z|}'M̚:eH=>ܹݻw4,=:1ċ2,U3;Q1mSO?ܹ!s#CBѻY{lܔ_2#NNL0ή bI1 <~ssQQIq{Ǖ?lD={ֽee)B9jj,VwROZ,qr8lϻJa:;/\ϫa)SM (J( >}ʔHnn.,Pz-T/lEEJD2bĂEdP5bDx%>72ZZڑ[ZZ֦x!!"R,..#{-3s\41z̸ݻ7m|bԙ3/rs3[./11$p"+ȿpji[[w_KQl3`6uTg}}BnBP9ڹ9|D ~}!&S{GiӧO䗕VV6(;:zz:ıV Erw}LvwuIP?jyjJՑz =n/ZmJ:==M{`AH| ӭ}W_ݾŒ.)Sw)BXս$zȦ=QQSҖ,!_S6UVٷwuJyf+Soϝ(bظ:ql+ޤ'쀀/22͆jU65kg& ĤM zuowם?^%43gebkH`nne12Yzz` _bcAcuwK I7LQILl\|`jl,PRVCiv]sRX,e\[l kڴ@:ĈfTU[W9yRpEqE" c7)[ɴkbMVM'@@[ZϜ7o˙RXp^IS#22MM  zH\7^m;'3 y*GɓFcXUUǎ:r׬13|lORgQM˕_⋂ # KWgMM^޹sMM|B1vl`Y,=jff6i4]-MM5%g549FXf vNDĘ1#GJ'O_6f54ΩZX^bMds,o^vQwIr̙vڵs6|v՚5cƘ0/o>bQw77UWwݓǦDD|{(J, ݻ7mMJ pq1ZZJKOɩk:vE"t].XWI2)Yx&O|RO:tBH脉$  ntm43iii׮=rx?0OJ0Ϟ9zgƌ0 "M檪%}}bqRbBB𷮷K>ޱqq>>{>tBIq:m)d"Hdɳ={=sMgڬ) Mnk0*pܝ;OP z<<bcyx&|c.Kel@ ~rS|p]&xmJ4E 11~hr޾=''Xb,L4iySclww_T*M>b1Yqݎ$>/ߗر'2? %L92==1r  /yy󩭻v=eKQMžiS/8QߺY]E&̞:⫯[n݇s=':>lJw/]Ѿy[6|Ҥ{yٳo<ϝS?.{Ha3;v ~~ЄK|*cAX;m$7KJoqcw9OO4iC=NyrTWWQQSc+-ew, !E,VhhX\&r;se='Mó~:x M\.478g}}6w@@diO;j}ds ;?udCo" E&ċ0L`/0!^oavVVttU"#nj2eΜ+W~W_ݰѺ:an;Fؾ?z +kѣnj:mbSyC|o~d꾏0FS~y޼IƌINNO_G Nio n ESךּ?.&VVW{ryyAAΡmGjm˗/?9Ϗb'ߟ;/~/>>r9}VkM#WnٜbĘH7/_z=wG-]C=t͛7l^}>e+)~XQ2n|T.&HgGVZw}g>^~Ȩ7{OHw-ҜÇ|`VfX.?&ӥm[׿EΝ9ċlJW[>x>^xaHWWg͘1j]w??{O|ɒ[|<*hM8l~ѣ,s?UPh2ݎfbq8w֨ܿ玼<-5u=42?Xt(w1cV?'}}2IՋ ֝}o~x(>@YG}=Va_VkM.}ƢeښcG]TTFP=Kw߿'[<[aaGϛScM0Zuë'Lo\ޚ5sfDWI?22>XP7ޘ<1VU%sŋ o^II+,>o;{v湸 ~biaAy9#TJGŢ}bIYYo/H" ?AEO6p>MtԴi33. t6ts,-ʦC9k׼^!qȬYZ%*UYّ#ٟ}}}^8 &sC׼{*SΜ|yVv䩽2ᵖ`u߹s۷5"~)i˗s==;xhÆ ps͜'Z}z}gɓgX`Zd IDAT4aՍuu-|>:4Z,juKsSJV[,-*DYTEFDXy'뛚I,/ee?}}ɐ/w"܍~wg洩ݷvW[uժ_ohXpErMSLI{ԩV[B¢EOh૗sY76n\ڶL6%- [=cھ{wiōL|o<=CB");NNy+a0h Fy"{φ ǎlLNoeg l19Fӧȕotofkn޹Y3/yy9D"776É{;m}͗߸f/Z</Z{{dwr#X(W׸nݹ;;,";@-*>_Qb£~$>FK|n1rcc'_h]ӦZmMM -VaA4%?[x (iv]s0j^[qFQosΉ]++;'+:|]sߟe'VT8k]0۷ϝ? ;n22>butvFk$ZƘW_`߾g^Io]$!~~/٩SYY &%xY^ RRU[r܃Clь0u!CmjEܹ>׏/)Y}fԲΝ/8]!EKjo7uմi>hbMJ.[:}ƔɳgZY\RnIѥbv._Vۗ8J>j5ip޽ L>mZգV'%8mۚ5gy}iKJRS[3۶W=/!^;͛>}ΜKv쨑T^JJY__8qݻ*N;mN7NO!k]yiݱ#3>}iS VV߿nY3f˭[G:uj(JLu6JKI.(;wƌY-,ܔX~zev]hSAZ[ggׯWv.Y_|a {=33W^U_ mf~ő#,ԶmM]d֬xx;qJ Gg7n|dnݪy}N}g+fY;Q+*6mZbޚ9s-:tʬY3Z &Mz7ܹG+48kص{ܑ#Gś6UV$'H*=e%&=w l lYbbF5k1_ˌ)) R디͟?nܓO1yqqz^;p`fSQ6r{efwѮ]ZԓOW/ZSnĉK4oѱczҭۊkJkܠ_N:唖-/>)Qh&mUoWeScnҶm[83Obck4jԪU 箛?֬(-\n9/ɖ-kTƝzjbچXԩk׬ʸM.N2/^n >Yj$a\\I閭+XeKJ֭{}Fv%g?yƌ(k:7&O^`Æݻ+O:C .oѷܪut=1fg}gyw;~z^-ZĶ?ʋ5kjy]ԪqìYǏjμy7VVoUƩ׭>Ok?SR٫wӦ;v[^ 0yy;_QMܹs+*u͚53gʟܟzkmn^N $&6lرcni7m1sȧz≗_8qҤn݇]xF̣_~'RU<~]V;+Lf͡C99g暮]|E^xˋy8Z-Jڽw+V㦛ouЬ,'nfk?]P2mzu@ y$/j߫ز%_R/Zǿػvj/6ުmǧFWkW6xP&2Ίhyh)- obs[Üぼ_-'6sp4H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E @"H^ɋ@ y$/E P بu[-ljGKhfbĂ{Ecdc^ԮֿZj Rq%6&D F,FF' [VZ-@m%/?Zxl*[E-r{ZѲcgoTk2Z:qՎ#q_-9b_'XX|G'e;dhKoGzK,l}ni-GRvKl5ڡh4#w1^l&T3b1bL^8b'WKfplեs|k3bǍ{ nĕ+ˣ>_"g)3.sgc̈--0+{ٻ{ٳ23_Ikڣ?h^|||hW=bF^8bx݃c=?3J9G󹗗WTTVwYRk׬ECQ<hCƍ.S'#m2ң6X)ZE_c tc޶Y ONMk?rQz5kN`Ƽ+*KK+=X^?p`׮YGl4r#6΍{z/79z4%$&$trn5k}j1uuks|mo\~KzW۴y_Y3}lc/ډ,6oٲp;'N?aڴ3LYe,vpn3yԩޝ>}ƌS+lU#͙b喭?gfωłUlbYYf˗EUYRz,z_J͚i%%vWTT2n{2̲չW_`Š߾+fJj:YYݻwѽC=wݺ߳ml^8bV;qDg*شlيK^WUWW9s֬}Yg G/ͱ6{&&&'שӠAÆMjսG=wPӲ2k>;W;/;⋳NqϽݒ%˖-^ܷg̗^_jS:tff_$%uvu=]T5k~.uw_sL'_Թxg_M[;{ʕ[<;GSC/>,::8:H]{}-VYYRRyI7u/_a֭UVԭۤIvVNNfmuzd~1Mn>5j:p`Q=o8+_[nS_TCzƭzۂwV~߫KHس{Ϟ݆]4l؂}=5lխ{nlٲUE;EO䄄O**֯={IgZp[-)IL];ݿE{0pР~ZW9Z=\P0x}mC7ir"!/|;ۢIY[ӛFˉ|ʕ˖}6oFsON?DtOHHL;KVV'vre7OQQQVߞ=+W7s;?įذOokXG}OČѩcy`IiIi~iJԩ[76ƞ㟞{ؚ|xKA99 G@||ݺIIO>y>8+~xŋ@|ӏ?go~Q|u>X?_R_V֡G;رsއ=o~YEEMާ/xȐF v/Xf9Ǎ{YfN?ʫ~xuםٷi5>?ۑQ^eO>أoO,*ɭ^ڮm_÷gנlw,_|iFiӚTTݻwOZN:uNN6e];vj." ?..@qqqѼy^5M^~W~c죏9оk۵UﭷL3ps߾ HphQՎuXs o΄]paddgec,3quIYڝzʩ԰ c]#G.XءK۶͚ ԫ)RR__~L=4ѯ~ ٳMn>|@).>gT8qSO<9=z\sm?>W&iIIݫg3tΠs?'{l_1bج⋛7;򾟔U-{/>⋫פ ছyu^ O[~͸vDߎK߰s~;K;דּw;}˖M^UK#/רEIQ@LZթSvJJ<;vٳyy41vƿb%O۹ꤞר65U^}oXӓ{s^==>x`w}bONZ^ާw2$';9n=~ijnUj$5i޲y4='+''.~ݻU-ڻP5xΠfxtĈNXN*,Y7ƬXQ?e}_ }t襗ҹs?|&=}zu~m$%5hѶm~_+9uk/l1c~vꔤοG?rRR״SGO-2~qʶm_q^8q܂]Koڪe׮_rСݻ5IKN>rUYYT4k#g#_IN>G^߸Wur 7ϙ32yE'&|r]mE>śoΝ1oܸ/(׆^:uk׮UkMU[9:E\ܲ>OJFERRt{[SRXus99M|rtkmhܸAbeek̟xqqQÆgѫw֟&խ۵k~ݺի7,Zzuiuvx\+*]ॗ} Z~|˿KǎuRly˶HzZ+Ѳ;wYQW%9K.d1nj9T$==3k?ҕޟ`AqQV!}69Z> *w]O?y`!izɓgZP^ei9Ƽ”3>dẸ̌̌ݻ ֬Y:ǝ{1J1 F5<9U˟0oݦAo s#F.'7x93ZRdɋ/>܌Ν{0K<9v6oҥK3f,XxannYYNzx7PuK/[^\|޽K,]y˰ar2ƒҕ+,Y6!vWo߾Vh {/u><m8nÿycwns;+/^KM>~EE6ݘ1K]^~ŕ]Ҋm=pv]-3-VL U:#!_хU;991oӮ$ggWOsrZJH9s[v&\Za ?6ayk:39u'~ԼEΝ:5nܼyKD3(/(HHHkg;wlܰ|eڍimr JKkl<+a~|wسܵg֬WFյKzU'%޽rwǎ7G-h$2GHTTH;#K76vu9:֟}:-Ǧ(L7QGZ]WjΕ^ a]cGnhܬG7Wt+ngl6/7/U*XUQj[4j5neee{z;wH$TwbOO\ޣurx+xc%:?8{xDTjkƍdg_ɮ65}bӮq27ɵBaܜCC DWNHNȘe~`"3͝i4*F 0n|4adz<… dܶd0,sv ]\;I{:1\ƌ _OW5nF6Y%JɣvlW-?`2? '9G Յjл*[KJJg@[G@6`ݿA*sٳEElvl̻k-?xk*hjTVU|ujbԸ*ErZ6wn` =pA,Jkj?_T JcX9: 'NO/.k4"g4BCcQэ^7Ϙ)Q=_J o舌 R+d҂k,OO,4ؾ }}"fDYT*B"?/$՚53gzy!+ӧ~m̨i!x|NlnS*U*~=O xZڐp?GUWQK$9sɓYYAnn6Ӌ$F&j\ۋ"exU*UMit{#.+BB/lrwtLHxH{F;?*Ο;>2xͺ5k:XD |fNg.&-\4~cceնm3RBlNiAYYUu ݍ(佽5 dݿp7둷+8+KK:͔IJeM#8`m5RGg9zqRU]U]YuykּڵdڪÇ9|8`qXn䊮NHd,,GdY k33T5&H:+EM11NN$RɍKQb9Eyz_!c]7טXݢ0m_0e(z;;PB@c^kflp0ωϳ37߽SӦL pw:ٰe'١n(PGil&iwllQ~Q2E"?;ϰQZmyyVcF[P]S_՚qփEZ:{NĤ/lӞݧNݓqHH3*:)eMM~Mf͚f‚L6m˥eϝ?'-L>5u ]4kyyBAWJK>"=:Ko9eE42YyYuJ/z}2G9<@$LZ@gΎ4[I'kN6ƌ kh4%,gϦMs|>O(0},-,++lk]◧{ь*ںLc{e&КֶNfLJ8^??`c|ߦOO&緶y8;d ~_-ښaaNZ3i/ p]جG/I$vuR32 gĸ-Ld^v_ x[QXxϝ|+3l>{}:8&jUh͋vҲ}3)R٫RH?cWrF#KU+nV3~GtXL&䦤EM9 }}ԫ{g)&߰ajxIÙf:G?/K% .8L%}1rU5-ZtVGXYZnT||O vyҒJF]w˭qvZmEyvvNNS36p)\/-_xqp0ݼTҾII7ngU8uu5X,'xbÑ%J:]y\3\ʹԴԪjsP71#G$y Q[W$z57W* }tBqs󓸹teRiffNsn$)(@h.FxV55&N_/zSRrr E{7߮_1i_1iUoN~o=H,0HrWOKjj{U=~,+KpO5,=xNS-' qƧɜRZ0 &P7;so{Y͚%.+++!<Ԫ‚{{__ ]ݗ.]J:Ə=)A[Pp[-(hmS㨏tD IDATr*Ywsr2/WȌ;FȠz¾6 h|}3-BVn0vޣro\.?ƒAނELX'+ ꎎ[d *OTȻ:[Z*dW\M^*Q)==W>}0uر|BQ_/?/D&A=>eOCΞr}Zm쫓"YlʪID_ߘ'a P{3w7bblW[rExhUj8}:v%;7Jv|y$*=lϞ{ pJg蚕/rthHzbv2::"V\?MVI-:ŅH|P#?N~W<މ'1/]:d˝1#nA(#iJM33̙E7梥HS[3RwNI֭}}ӣ##l ;w/g$'_|Vkcc/>Z{/.;Djr*{ǵ( g,[дc{b?ߴ4$d|PhϱP*[*+oȸvatEm1^P#ǰ_zm]SΝ)}˂XL ]"7w<#5u玝;|'FL}ٳvMP&P(؁ fkW?GEE٠wuuu=5G"^08qbL" 1+VǷыJK}}$b7с͢RֶRUůQu#Z`2c^Dwώj+L6>PbcKTmunn p89\gvvyYaASϱC_2<@zHh `gP& hvܵ//^׍fT dS?\^P-[.TL&eo/MY/&{yٰQ;37gŊK)㭬8P"|mVx\~hO÷ __F;wԩ_~L<䟔J҆zxy{P$n2#D䗖._aݾOڮYko|9Za֎!-+.+%?,<4,,=ӗBc8KyxŭKxwIgdf^p fcuu˗GL --M`ȵ={qN\?&3BEᥥ=||{^A͛nt_0eњ3gի6N1+/Gfgtc,'͚M;fj^4@m/4Z^~ϏdffǎwubDohD_M8vaa+Vl#7;׋n\A ۷D16l=*je'Ma6G*U$k?ǎ6;cP@@z]4Z}}((UoZTvDUk m_j[oZtCD 85lE؇h@tݍkc84J{=EYZΚ=+DaхIF|E`Ri; *2ʆxzt͝9;s̉1yCwg\Jґ#_-U2ih|ؿ8;XgyW CE<׉D:t*XEgp#l$ZR%hO5՝acEoK`cFp o]wgP6JbAtH/<mYi:O\ F?Z3 x@zi]xF#R8rQþ/5<TH"jQ{A ^Gntw ~G|zpdjÉXl6؋g bxV;4)F Kr n<}> XEf@ bD,"v LTPvx,l-[o! bD,"v8z`2z#EAz0B^#E0|Fv5IENDB`gsequencer-3.1.3/docs/images/ags_midi_preferences.png0000644000175000017500000017342113607210263017650 00000000000000PNG  IHDR͚bzTXtRaw profile type exifxuSmr )z=1f7F__&uY6&#|1M-\2Ո"S$˷t@mW`Mݡ."io/6\/"5u*^c/’36TL-:,1.1Lx " ZhR7kL9eK[GQ1t(;l +'pIDQ6ݹ1@JQ@ |Z[3 #͒3J8N 2v#?7gi D=ry[+_ڷZezTXtRaw profile type iptcx=10 'qsPЍ GmO&E8br G'ˇh^bHB _;<JPiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later hu iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx`8pm[%{x'Nx&~(Lp/3imCP20ʾQZ% TeZKQ2Sp?@y`,-PC釠 ``f0?Fq(aYzfF`t:FAQaCC7xX&)w\|ښ+<= ,j wx1D,.ߗ Z Ñ)4:TJ$zLBw'9zzkkQc#wߣ$S(XV+2R>Fh*JQ,-YLCJGGU*g`ʏ9"&$l]$+˶š@&` ''ؠ ;[4ļx|{#O8:y*eiiQa}=Df0SRbN'S++ +{BH&-86NQQQvTZ|_^ٮӎ|ч. i })KnV e2oߔ\\eem}"oaa<*!>* ojpcSqIIIC}O`hxxTb4+{Dd⪸8OK ιjţeeU--=##RɘB#-,Y,mmoaeN?aF?0 K xN4XUqz#,D&XZt7d6e8e1;z9wɴ`XZZHUՙ'cxfkwGΞno`1[޷-4NGZ(SLko Ũd)KPķIdi2H$V* 6BnͿnћXL+6e%'t]/]8*no-.puB B#&R_YYYf~lJsusq-Xh:_(-N" @qsqoksp$Ʃh4]e%RDhN1R l`_(D D k9x;p:`4 r#=rYgcGYRL" M*TX#aEr'5h;)6veO7|vsxwYsllX,2Y‘%)Wrs!-3urF,eOWQ'^SS\$5O[+’B2D:L4Y*kj~R@-,--t<^D#2)Tc||}-' sp  C|`8xN~1WE-wb02\\ >׿3??FuugP^+ItfoG,r1/yӦ.uB9X| rrJBHP4&dieṇ2,mo%aYlO@`tL|\hRD~ "%f0Huߟ>t0?w^7XX}3z=tV 4DјL6NG/4ldD,:@ z FwM/E&Q(VVl3an9/uQ,"3]D"f3T*H%jvX>:FCCoͣB4JflZB,L6M"ͯ86?s=KN.J0U4btT$RiNb.R)*R9:*syKn9"d3 $\KRR) )ff(?+X,,3q%9:O(̝g? x`V 0+F Qfe7`Mdr&,;8(M4a% ܭ(8ҭ&8bBiFM&PA-#XoJBJuP3&,6JNn*__ p70 `)C=Lӵ|rϞ't?~KZ۾K/?Ǐ[SOƹ09!{n4N'5775vu ģrFSL+;[kkFb.2LVt:ioioGO "qCCNnUFϰtu H NG 0l J+\x=T:J%M}#" e򶶂|~Ud Jpu`P$ P,,,''@7WF_P@ G%mFmm*5E"t2Ponnj4:czDQRR\ޮyy28ؘP\UU\VヂlmI UooCCSG`T ]mmF8\tttx(ck`:H T}-R`51zre[e2o||@ϑB_֚dJennee[kO ͅF_tu w3%d::\ezyH3wZZOx{^!22~^Hwq&?V8yХKmr9bkvmGDٍ<ˮ]}g |PR>^17n``kyT}'N9trUU{G_TJ X[z{cjՏFA{WoW byO{zD-_vִ`eA&k3t$ =gmg<_sJǎ42ףn-JP 2ZH864 -7vsrs.^ll5DKkc[4XyntªҢaaZzW[XT==e/=of[P߽ҦM0Z[_ܨ׻yů[2átaass^nv?;]6lpq9t׮}z`OsRRFƶmiðOd=_'E6.7Ͻi( ;;y9:2r[|^p->kz䑐:}"@$q MJJN]3Du^|ԙc<~+/no|.3[N^k3z(s%mU[s3s$ݻjuoCCKNvm k6׏?`K/ef:;y ~p| 4?%%=<9ɣ޷~_G7y, .ν}%%ezבŢR%*D"Q((GcgZ\?k9tTWVb>.7Q1`gN}c[sqxZ!SgAPbp:ǨkphtT&e2\iIDrh͟ZZYXШsQ//jX{t2*hږC߽g}7SZ@Km&4KdT*E ˹n}HjkJKjyOc Gyȑ?;pK;v$'q%T40씵ik_]֑{q/ٚm;"(5pZH<<<*Ae1)3_Lk=/`߾˗SS7oI\maJ/-d|jd";/nnw{UmgVDTUYXpٳǎnŗ~۔N_|`9trc>a HD588*u!AUU{;ڒHt{;o0b1WO6'4w5b8I#6vMǭ[/0^jTccJoj{n"}}W'z}@uUqQGs6%$L2 [gbi4gW;;ܹ7 V:7N'կ|ڿ^|GR==\qC嶶%'wTGyy8cG_~J{NJ[xOI4F;P| aMuiIWSMS#3d3<[U_?}=Я鍹e@eQ@<\.uN ~l+W>ٿw/vmbb`02PʩS/xzl'̡ ҁkoOdG~5ft42͍aTTW]z\[NXs&փ9V\˓'>O M[W'b0N"1,,++!ֲbV>̳YYCougK/D{;#&.>ksrr~?jׯ_.:ƆJhDn~K`Ɋ]{abm8qq2]?*UffJJH?2Ԕs<ш^ok{p; ;# Y.//?yopgcl67ŎN>Pҩ :݀ [k;CCu-g2 ޞɢP5aa{[qqaaO|3 Q+(?jXu]' ~졃O?) Mkk6a4Ô$SZSO?7d?>zmѨdo-_zi.Ϝ8~ҵk!= fs^^22""P~ BN |v6C>~,/ٯ.(0V<`|oN~͵k?顡[=ĆC'\|*+q8++{{wUYKpNF75:tܺas?H xLa\?~<'gdD*UFl67ǣGe~e"%(qQ6VH{!D.GSNf;:".]Q_wJq(AmI^>J)(AmUɱ\(?2w1x k7 0f4 D&GNC o_QKa09t"W4*A FLF1ťQ'Tz; (LH&P'&SI(Am+TnC%{0SQ2xˁ 0 RS3J&Z$H"q\G.%sa]ab~ǻf2y>1dQr -p&P3mcz& v&&淏ATUd>_g O-F{4a;z̑c%&L1{7Gi|j7 G霉7pր nӄQ#P,Q RyT $0y,F; %@4!"T\YQ %p)fw! 5>`);Qw!P  8pր' QB?gϟ_?{`Xf^۲͕0 ۷{W_?{,8ȼxoc[o=x=}_\h{"F:p]VZ"8ΎLbgފuZ۾ϮW~>jW,g,r]}>:z׮={6ntr_y'^/vv^|RaAuUsKwАDT4immo:)%%!6b099|s7t<ކ _ݽ;38sMkgNJx Ғñqq \nڵn]m\{.VeEGwٳy܎=>:koCVšKN>[X;۷?>9͒+ _⋎{_2(Dyyw;U5!o4lall jkZZ"dg,e$_OQzvWvv]Crtq, Y[ rWLEↆb>&&>]t#!:{`cw9΀`nnԧ3:2kkJ JZ8:=$d'HIuq>VE}ݭ}anN^z|ǎ_""N7gf6/oLN2;:zٲaᎎvVVXؘH,v4uu zC|[f0**Z[-,Fcc}\GLɜZip͏?ãoZ%;JK/}[ݱc}};`j}=WVܸqG%$<P6{By|&=RRzzyŝW]PWg>z S꧶YA"w>i}ubbF֭kIWWY.ӫVVRAA6x᷿K]3wE4RRuQ+8ߟ{NÇkml#""#٢.Tﮪv޻b?lJ&O9f/n9L4üK"UWTWVՁ~D S}gWEEuHbFDKsTh{Ν;o?>$:$$nomlͽx4 ?mr=Tg|I=s Wa2n{y>RQQRdFF>u##}啕K۷%JY,'V Y,,'^PQvOl@L9IN;y?;zR|AGȰuko**Ζ*Ƃիn۶zҥf̿ۺfl-ߟLhj|}[^wUVVUYaa4?som?c&֍T[oˇ]kڵ/u?7Ǐ?tz}WRab`"T6<ޚzUʰ0G`_ MHzb ^?pj+77~N܌yKFg#8(4vxoq:]_jjc\]ǏyL*+ z"FQGt;[./5v-9{{-葑+oqm4wwOO{;NQ*ƴ[4]5ߣCDDSbquueEGW(f#\qhߦo~I7)%%ujFeLMIN{{KJJ{zt<_?kLP֨ZsDd"g勽BsV`,V0ܕ+I䖖>.38(5ccu]*ܼGxy7 JK4ȃXGG=Wu}zb<ӉDu9{[ #LGG+l}TO˗rZZzzD"Hb:8xyDgfn/##$Ć31<+Jղe|6nA]kSsIqeLICsELJK|+$dVg'zpQO䔖掾%.~i>g׺t(dp? Hwnx魨QçgZRۇ188]JM=}0S'|92wEұ(;3ףn-J5X/*P ZF.3u@Qѩǎ\Z]/l1yjyBso,le k]dgDDZږ-ᶶ8:]kƫ5[whkvW$,y<MmKLdݗ:y>-TTߊY[nMI~!F <}إK)wKK{Д5Y׮ 5ǤR}XW_14di~GѣdÏϏ?!s rO3^H:{DbLP*u:xK/p2ϹVmwuDD͛8 .]:u{O| S'BWJJ^HKš߫pFcbVNK(_kܓZ* D")ҊprRD4pOwGG{GiiO m%%ŭJI"t2Pmv6DCJSDF3*moo館,(}|-ss`|ENN/_ ?ߕ+XZrܥn_=F$b|U6 J8Vhav9̳8~xca{vHOsph˗O^Ɍ~.6BC96rΝ}XXXT_}r#<7oO?DZ񕖝zC#+BCoش5/szzYXYña` / xe8Cz+BmX,sd2,nlG~uL *-jϾ֣N=S(ў޾Lg'<[qʊ!','ޭn *Ra 8,H }66BCTw#869em[xMB  _2Y-,{ @?@ŒɎܠe7ƆCi49ee}}/jWj]"e0[MWJuLSst4Q\S]8dי@/YoW*}ׯONXA"Y*!Jm鶴nl|6m :Gqm8H`P$<|^Sf40@&GGU--$ƚTWU SSn~;|rs)H$gիzw `1~wJ9XsWϷ=""֬~K^茎޴.)pX['S[Zp}fg)BC;mmy粳/_pa7hlLO;23==VўwFw5TfXm[=ܷn}~TjzQw}]a ƕf[out>/>t|bvܺpxK˄{k? ꪚ!4TUVU pzx!/ IDAT "H"0X=VB-6)$#qGL(5ewX\H$TeeM]6C3@Jc+KZBb VL5zt޼9:zI漹e>ͳ#Ϳ>Rj[Z4GnZ*UVM>99qCmmJxe:r,01Ri:P/0+)VRmۢln9?V>uO ]G/[fgwzM}G-^hT{]]EEK oѣ@ju]|j((`KF‚f |-N<*z=țnh+DbpDd0Y~~\P MJ;$v+(wT_׎>WPcosRSquҞP|cSt899[H`E#hfIg}SUWUW56tv r/W*uZc3ZA$RZ[Xξ;uY,O& <-,44ͩC[ ^S<=4OߟDf".6"|`Q\O!v5ہgkC u-]|:,s!t]ee:\޽553u %09)9f{Աo0w,ѐ/Y2RHݏ˦ {].oU"q#hXMM Ǒ˱Zz~댗II>>9'NPTig}JK}-[':23z-jA#tvoذ M[!!1ˣO?Ν 1?jwQCo+.f/_G|ٴS,Db0,G_|^^^l9| MQQ/figWm]btpӣ=zHLUUUe- 8rgfZ8dY1qX~D$P f@HGF"MhfW|f˗:#S&olccGr74BazĕHLKOL  B9f}ۓSTxޔH4td0i[zhse{߸qJ[ᑼǮ^E[Zfӧ;:9+֮w[ŗ>wsrNG/Fag@1 ӧk##QL6,7=$y9Mw|BT3L@3Zh4sD.;;}UyWFOqnIHnzd,d7 W&@zd_? niz}4j)g\`l#_]t:ٜܰL(;_=WQ)ϮI}XHY[nۺ_k3t'PŊR^ODV[Ɩ^(%UP(=}r_|{bkw !,zJk49튭oNuP  u/yj S]*5LN~~.K侺mۚO~| +w6 g.m-XdiNȈ8{ѣW_t.ZhWY`na4̷DwwGаLt.\$:/511-BяDzamHxTZv$nnnnz󭖙/%0j>kj[ZGğ֎αq:QddmIqCRW?=W|P̂Rv",nkkiۿw*+j1xcNo`,ջzWnه#[6]~EQQS&鮯?v1!WtS.N;:{SO$& -Zi4MN<曯RgYĕ+߸z[o>7l(-s(}۶B9[y3<ݷA'oVZYYiպu^y9A^m,ssB?K*dܜM+:y${;w˖aq;~?7~[uu%KJr~6okjSwXe,KnWTTNs/t`}}^_n7|R\ƍ wx͛}r\aOCy>q'HoOGgkw@; ~_kK}uK x}f~y|5wuk<hOڵw}+_Yā}vzobtII{a}E:/WL~omݪPx<]w'\g3^Ue.喵kw~7w?p5 핯[m+b=};}}u,rf=SPY 1Z\r(;?ҥW_|YŶ_z˖_vݺdR98X[;/pRws<nVv۲eoZv{ᇃ뮻KsZm 0Z_g,]rEnt z4h劷+~^/]{ڵ扳=/@Y朼LTRdi~3ϞOH0δԢkKKŸaA?vx7^{wbq.M֭m O/߹~?+^;>q|qR*R,(+۷x{S#| +/[0pU^J19ŕlY,SWr&'X+IK~/i**S[ԴgknZJe2YII^o^E{v<42b_~B~p~֭ͯ]N'h,-sszɗ^|C>ugIA/;>=(<>~Ogk6vSO|rժ򢳾)U? qم ?o~`|7ܱsNj/8`˕l7rwgTu;X-}bĩS5xwoߵ];زcGА/nnOrz7~Ò%i+~Ko#zNf}v۩srn{ukO5EYdھ}EDs4s __Z_|a˖{*}''F'+MhVf=,~/4?>Kt?Uڠ7ݕ?WӎXiӭjSEg{ 3ޭnǻsomcӣ2\reg_yeY؛ahӦt:}*+_G++'&DwU__&;4doq,-*z,8><+̩אբ/-!ڥY@@CcG^̥XhY].W(T_h 奥Ӈ#mUG}ήJNKKr>_MM8RPv+ZG?DoXUmMkko@ј73j:rYoXhʼ7bwinD?L|"Ps˱V1r|\,NכMǓf՗vΧƋ…n뢭Z).Hoߖ7~z{ʹ|{7m+~Gyנ8τ E556=&U0e-3ťٷpݳ]RM^OQҥl[x^[Rtn7ٙk +V\uevlLPY-i/YB@K?K@GHO[{'lOA=ܱ,"mmHnAIi^VKM? F=pq]W]o'S5'| Q\TTc10TF-Z8w Lc/B*+FSNД-~93XbFD3ESP,s_vh5 PZNPn-!@Mpq%FG'c AX‚N-CM}:;f6h80skk1 >Ѩzh 1kc㲩 h́K!ں!/Q4OWbQpq#F%j/Z LN|D@P4j3pI#@iqOLLLNLOO+U|e@b%#p8;w '<Ŋ ,zD21?E @,QCg@1EpgGB{ b9R5Iik^u׭Zi6+XE b| M6w.).hHh_RZ"Z\jKc D;|D6&?O4~1ʙW)S0JJn _X!-M˔dװ{?ߑ#mm_wtTD]ZE}6}ar} Å"~AђE&`]qhTgr?yy_O~r _~`07gÆkǯ`klڱ^}7ɏ}nׯwh4yyK.XhUV߷_}䟘>wo]Z9g?W\( 4FqP_]=.-}?|/P]c=.]{~oNKo\gϋ z.(O=W]|ynZRc!J<093|ϱ-ǎm3FQGDBюΆF_FT?NN :/ne$R^Ϭ<#]< _^~53Mw\ah^nNV^?8p_~k-*ڰ!)#P\~/pCD4S8/=#i{|20u/~qi1ɼyOmOؾoߪW\[^g_~/_qy|EE%%Τ?_~^ⳟ-+鲲,YXTm}{}ݖR~ڻN-[/k4g^Ct?%áP0 zG y!bRbQϞcMR\!W?db܉WT(X So+}oGov_?}MEVˉuG5eei~dԉ+L[9|#DDqK8y*S۪@ IDATD)%5ecUccb =ecmU0KQ*'TVnݒǁT%9JeZ⥋%'}{} ޚRE"#b$JmX^MHDGήp¤FSXx߾i.Ĥpeܶ*6'<}NDϘ:󱏯ߐ'Jy~G?' 1e h4Q*`dCCC@0XW?|/ͫVͼ()gT)d $DFFA0# Htج2Q(ܞŋ,z_{bƦ[nΚ8|x߾zekʌH62UQԃ z.(8su8tmoo4]񪫲2oO=g^zqe 6mhk(\LMݸw'B'n{Sm1^x8٬ Sё112%#h81bE.KJ\p_zoٙݵoo].>ScFζ,~ \1 zPϏ}|ZoljiyVmw\~ԼgyExSsw^N)*ZMUW\-<nxoo'wYXpb*cg}-[b*#+,/O&祃I=ܙjM7]xg~+=n1B/HOU(~j׮w} zkNVQZKyb[Ŷo!#}Yr| +w6 v ,z͛;zꪯw:-1ܬzœi|R%jᕕO3c͚Oӕ~?C?{mϬP* 1jDѿ~HdbbxhddjJ4M&&>k1 z.rZi E08074IrNF eRGGKOkn} _ɏD$avL &\ĕ+߸z[o>Ы>7nORm[_xpbxP_\ĿtרEȏ+oʤXww}~?Oee$bxW㎏\zzͮ3&)h-b:Ѩ J&RܢQ\G<(eE_'Zzh7mn--U4 QWh( .S]#ZkL0ҩv{Ѩ .l9!Zmhb\1eOY .?;o9(#GE)EU-svvhۚ˗(cW>"ܿ$dZVhǪEhc]mhrIFh3XRpQf#'BfQ:^-CfYEiuɉXV&No%~:XVIpqDRHB ,kcFDBlel\P*"bb)f G#P zPfH1 HIQ$!F@bIT .mk9Vuv ...-Mr9URF;gϑ#VKNNaaYŢRFbpdx73rr33R\F QQL&+ 0e4J$20XU`07w~:onjnxrs 2v,hBѱcMM=CSS*` rr\R9n۳_k\WHM^YFzǎn+ǎ?+GQ5Kj4px|X/ևHD6dgfV~㽐ړU+J*@Sc{G_d$јM70=Milixd|"JH0Լ̌1ljjjlm JF/r&u ɏ] U8h?z㡐Je4*'?}u][ V<ř6Ju65׈h|B4}atoc7ZތTdˆ} >_{oxN0"5ڵcGMՒb2"ՍcfכkqMM--]]]ٔFRvdZή>2-uŋҢ\)6NTF">l^U58դdeedd6:abO^jըGzbiE*5tw'$$:R32"V/^oZzZl Yjm}&GbIH# {7R7xNIjljhɜNgzskiR)o[KIZё_CCcOBx׍Dƛ[پС޾U3##3+3+54jY$JP[N,uv?xQ LFEPF ̌ /ϷZNZHJt&EȕVVV64׷gg%:2u:設FGUan&$LNVT__ڞ>=Q*K˽nɠ7DT"Flo yy+W,Xn)IosWӛ)-MvfTz"Ū0̦%:!mǎB˖gfu3ƶZU39Hߖ\x/^qE@`[Ş=mm#9ezr9#Thkh4[b@@^|¬,3%%kV|X>Q1'*f7A@P86&FGժRá4[mFL66>:26~<8~/& M'ϜCoo@$byngEDu`tљ8Ӟ̶hB@ m 1E 0Gh0D$3ޟW2JeqF u]o_0hx<}N}59s\hj1*#~,SSm7:mp~H$G NVNk52Y0x"L8FDNl1Չbl`phlU():uk㚠RL'E\!FF #eS1l[rŊl8\LH~BɉX@eܩ) Vl~bvE56w^X5=C'hH}ϞU#XL9eݦlk>,ꤞH]9o;;:;FF -1bRY٤PvtvDl6I&liin#efRZ;:5DGbq';:yy^ORf1 :ZTșb1Ĺ~Nnͅ~77<|x箽{GG][[jk} cfSNNQ+YLrΛ_־kWC}99t:~/VSj=Tݖp~CNnuowT(َt756Β,mW.ӨFA˾>])Z tw57!,%|dff:Z߻w~ Tzgg/YR^fsq"JB+y^Qyy~~ꦦ#G:ڬ䌌@Q11|=:]V|YBB}֣G쩫ŪբrTgr||J5kNy]ZE}%:D;?7"uTUmݶsg_ǽ|O |4ѨYȶ @ bIQ$Pmµk ,Q1 7K-CfcЋ66.аhL%Fu'eŭO48= 1 $(̲6J3LWKXR6K?GOT6hK%@ n$@q4@bIQ$!FD5 uv557Z;:ǧd2`0&fsgd̦tin76tt ONrJtFՒp{229!}D"SSCMm=#~(P$$h4ZAo1'%=.ex=6Fs> Q"ήÇw>x7\^OZZ~9K_Ámmm]EJKQ16aϞ;&&ͦRҍ&F&'džz,ctjkEJ͝JKszKɱQѯ 0ͩ(rNkR"p9yEd#C#HBa2PNK*AH剟}UU;w\[40q+tZQ,p  +'Fi=sr.\Hi5ɔJawgegg9Zq~CǪ*m|;Vh3'rQLr2} --]]m6k090QrrmVq#?=slRRis$96'7aw%էV05183 :jݛrM~|4FB#љ,F`tt66ttfe۬4R(:Þ>oYPwu6۳gx$YbҬ :!A 97o+rJ0wl9LZ: A.ŝg1Es͜;ZNK5ήCGٷڏDv[VVfVgyĜ~rrppp`bB&3˵wJNO0SUoouMwBјMIi33HdddxptTܒJe:fB12:8t +ۦ=]}]b$^NIqMI>0*VXpdd׮GvINdJHƆ{{bccZMZjYYIIZA?sLD8<0xׯ&%&%:-VQh *@G{sKk[FhQftb/?w>ۻwzdb5u::@_(?<*-"믫;t]&;DFV &&چGJEs|Ci|C dg=6[mkOnߏF_:>222 fL1P( V0:Z&&B6-DGVւi$nS=ϛRuwv|mbuF׋=S-HqY'+]VrJinin IDATktt׷A#V7v~V*VmM?ryBVk2%%-\9qilhn>rر)1>D56WrVvr{3)PInwRbU]fSf+Y7RV+<(eE_'ZC4 KA9&456=V!HA 1 $(c1 nE3:&Z(2NȠml\a0KN4ʄ[ohpz,1 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 $(HB 1 }WU' $=d! Eܳ.WZ[Zuں+Ȇ0DF@3dNn8У8>/Bܜ{{ysB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QB"FE 1 @(bP(QBR*ud=/bעy0Y|<"FE 1 @(|ejlL)Rǚ6ӸI0J :u:᫭'F2)uԱf ,ZLJLu:᫭'F2uSR'zc|D LSpVu:ˬ'F2R[]:[: uסN>96 ?*סNVٱc_4LHhc{t}iuT'6oڼ~ vϚ?kf۶?ժչ{VLL|༷mg2eu?+VTW%]O`}MϏܯlu/b+uRYY]]^~] .g{_3۟ײe7pt۟۴iԨk['۶=أn|-ڧZ]tEʟj5n2ʗ0Fb߶se55wOz-_CKVWk7yW^qŤI~S\իV^qӍKe7W_}={#/\sQ{w$>7weɃٶmɒ[vڵk9{xBb*QUnݸժUl쁸?i~e^pomO?51oX;?I'MZk~ii 4p`;wٹczAӵqz *),\v֬W_{Y3/Z~ömeeqqM6o޺UN}d=fCڥqs'4OskfbŶmeeѱO[Κ(UUAR]w9OpQO0hn0l󖬬^q[o͛lٺmۊk"jվ]FF{ t1c233ڧ|tE"rzꫯ~n~n8^կUZ'o閛_}~K.9餞=bo3̞eO͚iSc6,=}֭ʚ3{ժFknޜ +kۦM >ۜu`M//)пC1s=PeeMMEeN  v}??Ao,U _d#/Ur O63fmnޱsٲeK[Hk*RSPPֲo߾9uZBBμ&8yr 76jΟԿz[?)[T2;|݇ 2j۶UZ&11yXaUvuvlԌ٥@h\rO?dI'\xg9n^="[DCk%$TV=z]<Э޳oԑ#ۦ7nܣJ86k%_rر]~b Dj6߰aԨspyjФ&fuU5‚Hw}yM7ݘᏵ3gD6 9s#Fk۠G}D΁a붼?\ ߽{cff쑘Ozy/7?\P11c2[.=Gؑ_TqUi_:kv$2x9g_3lO 2r#9_޻zGo׿>؎ُG^6;^x2~pb+u;BeEUUuevG嬩ٶ}޼ڦ&?{޹G%臰eڴi\>}o:Y'=|-7ѷa5JIilٮ]?:1ko-ZkWæLEVujtҺ=GgihO޼{hظU]}!ǏhMo1 F)((../߱=owqqUUeee.g$uۂXnnfxRFĖ-ޭ~ [uT9@y-g?̓|ŋsn\Tکݻ׋(wcI~~Yٶݻ g?ݶ)b=~Q:v8㌠!1isaa m_#oc^,(l1bDj/?頃.ubb\\Jʧ[U⪫t1?;#cUK/Mtܝ;++5LO#3s1'<~A=4~gI˖?WEzϮ3{JHx+,9;~=^Eynt򲍛7n?lҤN0o?j۽ݗ^~̟aMw~ǟpGٵ˞>5[Ι,Z&gĴ]?'M4(}!Uoϝ{ΜS̛q)CG6lܠM{䄄`M,w}~~}LL||.ؘ`SxVRkQdZ~-[6mѯrժ%K 7>K|*!d]0cƃ_Ϗ{ܸSO=3<޽ǭXs?>;|?~X||ܼyQђ% ggWT|ς+9opA#/w?Ž۷eˎ;vD6Ԫߝۢevڙneo a+auko,/oԮV柾QE˖eG}sy8 u/t=w⋹냛~UϜO=q>=s=Ny7l|ՑۦNwݝwLZTԱQ'p9?w{љ:vl01]7!+ox?M<~㟜}ĉ=*/=}tm=ҥӦ._;3&wᕕ;hmmWA|;xo>qZ`{m3'ƶ%{7`@5W^yם99V=-䒃;|X;eKye;~WΘ2x'g`Z1c5m89Am6{?tOLh8d ͷ~??-U{|ccƌ?w^O~:tL7WL5먣z}D}n=KөСJk3f.XW^EʕwA=g߼Z)E={p 'D"͟Bk ꪪ&M4DKkyvǷn(Q\\RR\S>˲7i93!~zNm^TtUw9{Yr'Lh߮s^%i3fy?9&htIJڹ+x`9o8ꨶu⬬g~晕+7t{TmH$?޼g2eÆNN<+O;m!͚'Hޭk.ɻLy {;e}7s'!q<5@DoQ 0ԯ_]ߊzEUU1uKjj4OIj_5)hl2-[v,,lޢEÔ맴&"1L &SJݾ|RSoOSUqSւsl)+k03S-iejz_Rʼ¢^9s_={mk.XzMAnz ޱc˷oϚzΝ+mXPPU]tDAlILhݺI59+L٫lNHhѲyjp@ւEs=חywivvUUnÇgf=qqI \3狫`4Nݻ(.~~;w N:4ز??YSZ:sk ڤ}>u^xaJY+/ʐg{ @6lʪ=z?ꨣڱkW\\^^ޮ^Ǎ7nư&!!~|))*((, yJZ-}هWf4%%m۶yjLlqaQQq:\z;w6lЏڟ쭼|dgWVM޳s礤򲽔ƶkߩSzz[7m޲y_Nܻwn7ygz мvRT6lܹ,??;D",{F bH$8ۤIJJ>ABتⲲǨ,+ $7Hnؠbqs;݂_|7ش/sg_F&7lxzֲeUU{DgO8Yv]WYS\RRRV=p ]׫wʩGg^;[VWoӒ%q /޹1Gi2-5J FV\\ƍ%7I{`8^];?).)(()8a]l9eeӧ5m߮ ~UQqڵ%%sfMJ۷bެK۫ uYŠiܸIMK+Jq}qycc[9C;t«.jUeA={,-} V .0Kpw*Xb֭7p_z1K/Y\]]۲ߜPX˯Β)/O2vܥ_ziJJZq℉GX~ݵ][RVr޵>n]hަ]pCEuNNtiREm3ϛ+nR(-)+MmiHll\OKv啗IOޟ+)-.0Y .x#^` 9fذ2Z} :#GgOȦ͹7mDRRzhެ龶~tmZ~~t=w?Խb̘-̈́ZUUyv/f?賷15}㢞f MaCS,_?֧%g=a.m8)ugʫ^]\ԠEQI0@yy~ N>;{N:W+ zp|{L| xijjw.ȯ$&j$!l>b ;++;"==/oիSStLOs]'۷vm 8;'&&UVf׊Sk.}gwnvW]qU >uᏪsY[/vͪ54yw/^׹== .*\t^?.336 ̬ڰWt˟ګ1q29fܸN<|t͚6k$7;z+a_w_wIS$RXTPPTO>niOLL\\&K/0!ǏEIM܉߿SfW\yx?_pusFւ]5ӧ~~z5S=lr?]8$7;2sQ))ɵM6jٟ*' /YӾ}hn_11͚ӧoFz1uv9(MLбKmL֛kC~p.5Fr=pgnN:!B?"=??K.^a5kjbco-Z;mjBBuuƽ{5ꫮDj l޼CrZ0k uyPnj?~\ifv^^dIVY Yvinw4qCV9}f͚F/),,5s<\F}Oj|Iq0+W\WwUU.^xq61EoOZgCLxءm/~}ūB#5w,Y#]ZHdMsnS'%uңgq3g)+G֩͒g};nټ٧_{m==tŇ?[taS/@w5L0`CGnSR`O< }tTVn6{cfv6ꑔ5&g7sO;mw}{~(_૎-^=FFP}lllO٫]ߤ=GIm֫=ghE;wq#7i9~aӦ}kyǭVTLx}J۽;;{S̘{w$Ҳ/ϼbr5{N/V,xq~7mX$ellϞ=uC<ϯChG{ٴiaҹyjU 3g‹Slh?qg 蟒>qޘ ۱#{krz0u!^}''¿5Zwk4kvɧRU]_?u:|Ԩٳ[V$,Yii0Gԋ.袬kƎe&(tu.]tپ}ɒ%5}N'N:Nۙw=s[_?[-'%UUܵqӚ5+*+;[V,xGi|A:d4lXZi;L+9k4{ZcsȡGw~nHc;g-۱='gMt!ۥ66lұ>kUUG}QCv2-)2o W٤IfCu )\;!c/yrw[{=k|O&|sNc]RS رA-{4kĤ۲W-Z4gΌZ)(hذ|g! V\2dȑݻ7n=ޟy냩}/Nbcڦ+[ E߽gv{KctڤUuD5c>J.Y쭷).uرUVdӦ6u֮-.lܨ{9~f">o0FZZy˗ϘԷޜ?oM8 ##9yϫOMOܲ孷fܰ}cO=:tHJItVԉݧwM]¿_x!)=^L)+͚6+/;g܄ĂZ)j-z^fթ/‹j, BbcR۶ذӓTUlߖb…gϘ1wҥklڔ;&e={ѳC6m7o׮[vl_"+kΜYf^h͚;"vFvvn]G1GVwߧV;ڶ=䐑#u{;d͚3MYݨӷo\X m~l׮M,;goohQNήM۷޽[43Nmֳ[./]xچϜ,Ν11Mfdt֭[ZZuٟ|Z}H4"^yԥKZZRR"enPT4n6Vݞqy)QUT]7E9L۰aFC<(EM$裖]k+l))IIeO;#:u Տ V6mƌ SSk+ft>{*fOtڭk 宛1קN]n{w޴i}YL1L &si`9"oo!Ã鋨^9'LQ˗~fڛnLo x :]ufI^q{6Wד\s۟V,:K.۵ w6w +E>=^uՏ<|XƟϺ|jo6^Mܪ;8ٱ}sKNޙ;QO8Z)N6߿{S]ko=-5KX]%ԉΥ*>mi+uN~^$eǻvk83wOL̞({7 DÔ/u=oȥWXxYKVVv~ {7le};,{Gy_ۮ} ~GkF#õ^IDm5o]qϫ/pI9mF~x%fϟ5FٻeTib>o۝`+ju~)z$O}>zOߥ+ݏil4Dub/sV]U~U-=a،lK-> ϝfm\\ޫWJ9W.૭31 ]]^'zum"1!>'cw#8ϼa-[}{џ _f||  1 @(bP(QBR?WVoOtGIENDB`gsequencer-3.1.3/docs/images/ags_machine_envelope_info.png0000644000175000017500000021050513607210263020654 00000000000000PNG  IHDR?bzTXtRaw profile type exifxuSmr )z=1f7F__&uFY6&#|1M-\2Ո"S$˶d@җc;M ͡."Щo/6\/"5u*^m/’36TWL-:,1.-ebtD(pV;njْ ֑ԬC =]=J'.圀;yARAPvx U$Ok᱊QkOhS i4Od}@92,9cRLq3(?/(ܮF9 Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later u% iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATx x}{ v NIf˶lIɱ{4MI=OIntɽ'NڧI[&i6,ڎ%ٖZD; . A;cE@P$Pzfޙ3$ϙ*ǟM/RKs㉯V#[.VF|ȺE?Mf+_]dtzN4ؤVf(0`1gd2ӦZ(Z[hoJMIZM~o}L<4 n&5~;x<~mS˞?=4y[?guw~5\?-Q5ojo5:VyUIFCy Ewm}㞷}[6_jJ$"zD|{H 5@\"ީHdu_;Cs g%SGΫ}C.gȑc_ 4Š[nݹ[m6=v?w^?<,m|#:Nwi/;?Gcs[vh0T;v׏vw xJe֮[wo(/3ܧThυ7/ywj|sGn-)oow ;}3}>'v[UeyZHLL{{.NN㒺ZQ.~CDQFKn[[׫TH7CGGNx=~sLp^~(0tUm޻r9Hdx|?gfz{_{w_c]w:kWy^Tұ~{@k.I33]>G:ypgwGǃy- b.rX!mCӃ-4x,xJQjVUYY!J3b|pXY׏f@ JzV`0vw;ڶ;ul2y@@(RIjP:vWDH|P^,j4)y3ӳT{$۶m+)Fɩ)I*(X]7|_  NNRǕ ԔI7559HU۷z[cɓ?{Hxddx377T{-z=n&5WC`pqK( G"XL_Fsyĥ˽b1\pS4=yV+Lc#Z]h_ZdģhH8 G`vpx}s TJ;fŢׇb1#>[/V]|C䋌\ݥF}NX(LVR Ǣo4X"{B\@b)եvyIUY,v:qllTFjwH,֔75Z c1QRt:sAYyRZmSC3}ϦM}% DSS^{} F^g(&&&BD.sio;53$ ;_s8<== Bhh:]<"$]!X5JKZ[[Z  ?b\dHb==9Ɔ')ŘR7x4zTJq?ҌÇORkJuuv[j1(:w̙1h`"  ;vq&s]!vf` d͕.bދ/`D)FQ vϽ7bt1Gf}=^~?Vϡ& "w1y$R-08X>f+'ͥ'KR]6cE斶u%|tzg]{{`\`t$57O|{m8Yk4vRQn6)w-Irם?бЪE~vb|j;›o~>wmkeb)1w,7ww:PqSWVy[S`x%;v=*GJly-'=hvF ڂ$YϷM$Bi1~l.**. hj*\,bdw?];~gf&&`B%e4FNGR; fg~QF&2(33b&Q$`k4zNUR[ Bs=7~|Ãjus[ORry_T%=b~[B)=]=R$D)j1ˋπEIKυE!Jm~;9v{-CsLYTdvGO?wםbttcOL9ڣS @Pf@Pf@Pf@Pf@Is7+ZPV.PBh;122\ԉ!Sr.0pΜ/qyL~b"hʅa|҆RI]R)0xembܹW_=qbdm7VUb+:wG?җ_x?O|bןj" ʏ>=nW(߰a~j5%Qrڪ{as?<ښB DXx,h4OvO$o_ʿs ԧ\.aEW|yX*-3i4%mm;+璢u*T^<̭5u;vTe=߶{Vb ¸Ǎ&ŢH4Ri4] ?Lovpѱ)kE򆆶򂂫Zm2meEv1?uKoW^zg|֭3.^|Οzqԩ=ӧNTjMyŦ޳uKULq`dً^o)Z5_e9 ޶zfI_qdže<,꯾_?ަb??[ʪ{3gn'6TT6߾o֍Kū/^я/󡡸O>@>4g?{]v(>E"c_=xfllܲ~|Sy^'1ǎF;61w:bri.`, Ljjjmkl(+5cΔE:sgigR2HCC:KDoi˛ɬkl(u+I{h.2,\bzC^}ynkninv*+ UszzVkMMo.@cqt)XYTPUU\l4Fcc}#>_,:%%.Ñ>XUU*+&/Ko`prhjlvM7w:lVAw\ۃϜ2*+ꫪ@`dwb\+-KN.AoxdddhHAe5IGIj2jgg2n-S}^uOOQmoRZH~O~ţG=F}{w}=ܶޠ_>3Nj46~{KͪTW[ɉCxC|G~kσw}]7pѨ駿o~mw?}v[SSe|ر_=ӧ}9qӦ[omlf-sfqO,jչjk+* %մwp C!L)w&Ѩg'/(.++,Ԩg}#=/Tee5բ@V˥Ey0Vkc)Ş5j5%%5NHnר}3CC.^SkJ˪{ZmE :_mmm;v__S}SJv.ܿرRGl:/\Xn~M ˥^r%qѣSS Z/0[,&N';5 -BkwB绻KKoZ*(ݲuoر/?~BzӦOhZne˖*im<VWU'??x;eZZL}^ښ:f()-XɄʪښښˉ%^+SSw} _ZƎ͛7n>??qrݭ[LS ,u[nj]SvF+r{`QRǙP]ѱm[ukǭLSMwqΝ?k.:/I:-[\lIH ^w@j &Pe &&&c1akRV{@ffb2z*:5/&͒e5H$ +ɳg{ٳg\7 7:h(I\znF2R6jYj]L& ,LVk4)&~Dt´%DˢR(Z;OI2 q/Q"pĿجCțbxL^=3N@e|#I2jZ[ۛ -׺FŝJb`  w^~o:$b@  HyFw wJ39  &;%α"Չ'_Zl)7%(RA<)tPROjinLhH$ٿ3wˏ \kv{I OyŇ_Fc[ U)N} *˖z9?1K\EEvܽ3  zGR@){LƦVS%uu W/wu|Wmu6tTW2S" |SRf|uqf?5N yߍ--5ե"R`2w =w~VxM̦6s`С=~H~Jwvz_OC:6Tc'O׳O=H>lmr` :ڡG}3Ng|)6qT_g煋~kaS ^AohN!WE.>73:pqr2S*+z^h;wzsBci5Env|EgŝZh)(.(oh,/H2S_mcݺn۶\pL'ӆBM=}V-~"I*Թ:6_=uW_jڍmkiI^j%۷zk/\8u@?O~t/o8Lee.W[۞?O}67YWI^xT; v[Y醎nki\sK(_~˖3o;{Rd(kku:#7|.ht*} vMQ"岅S\S4n9K"19ű^{m|j;nonR3ֲ}ESe&de&d"IE|d'   H;6g\4}|r!g  8JD;%mu:/ZE{âk.^RvNʖ)sBmCԹ:]iiSSK͖HT"vds56cڮ2KK gxhz:Sc񙙡h(Ho\̒}kkSvVWdEV7/)L#+}>f8+`4uP( ΈDI(jIJd:/m7eʊ㊬ e5m׷]Q> o|Y2u{VqEVd wIsȎD( E"d0̭ i➣X,/$XqyPfzꧢvX'כU}bMZPq$VVYmTd6Wi5cPݵNG^%S)r.Yq\Yݸd*˶(ƞ IDATrmذ0vs}?KJtZ꺺Z]#U U 88y~pPq:7tlJJn4GGor1KS|%)rY]TW>z%X'sSSNSb߸?02y%S ]@kZɬ8Ȋr9+\YYQf{DsɔIhvhLN)^E,ܹf,jL6̊㊬*7>"9f2-)23.)Z{T![weޞ}ɊȊ+2~+O)*9JDS/C_h%+"+Z YȞ<(3)Cv넬Ȋje {6"+"+L2@M~yPfR_2 YY @08mdEVdEVdCX'dEVdEV/+\YYQf{DsɔIhvhLN)^E,ܹf,jL6̊㊬*7>"9f2-)23.)Z{T!; [j_2fyoǾdEVdEV^%)S!q vYYdCX'dEVdEV/+\YYQfj"˃22oNȊȊV_V!l#+"+ <-:!+"+Z}Y粍ȊȊ2 #KLDD˅]TfwʯLʔ.:d}4c}W\gNfVWdEV9?7˔)nѤǟmNєq\Nrأ-R*1{{>%+"+ʯ<(Moh ~KӗȊj-d {<-:!+"+Z}Y粍ȊȊ2 P_!W~uBVdEVd= eYYe&i1 YY @08mdEVdEVdf\2e? &Z.26S~eW|qgf&}nX76TǏ|9{R\x'Ntv[FeqEVd}eRWR%%3<4=^oUTXt%F;U~g,ggc1ox4NVbh]>+maQQKj.#Խr:/^gַeW@^-/+eT^jYq*wL뱺:'76\q@ i ]1#_"$X". 1D$LMNuէZQXU{5핤҆0y}v5}ϧU< Uh4JWdE۷'_y}sW76+ٓe&e˶L6gmX@ۧF{g0ZE/`4:}Yht:IhFoTR<IuJR$IW_k49b^*hT Y[Ln<q09}!uhzju^M>ے6+"2$ge65={ZEW7>+ٓe&el2\s뻺T/p=i=.]fsjzp(dkmb)(>wf"͟}eVZz;vKܬrgr9VȞtCRkg H?!ڮ)<㢹Niyw3)l{nd(^ޮ3MMWw>33s޽ީ_s!+e\b{\ϫfW/r`EsLٷ_<;jOCSSSv^~%W}_әhrR+|KV]!W~uBVdEVd=yPfR粍K\"+"+LM~yPfR_2 YY @08mdEVdEVdCX'dEVdEV/+\YYQf{DsɔIhvhLN)^E,ܹf,j;7҉WQN&[Yq\YGd"V,SEB];ESfxEs9E˝2cԾ;ddK\,շc{M]]wij˿78Ȋr92~+O)*9JDS/C_h%+"+Z YONȊȊV_V!l#+"+ De/V~s?h-%+"+Z YȞ<(3vmӗȊj-d {xh@  =hvLr ;2ULynLQ"2e~ѴȖk+̦ꎍ-Z]Oϩ==*Ua˵cӦ—侉В*Uwc>wzS~I˯v ER%%3<4=訲LEξ /;sT.$X8h4tP0ϝW$]g 5aʼk, VDyh+]lQ 7fBK WSxgqEVdYȞTfh_<}'iO=o7y?_h./E_%BP(1L&anH5`pb"JSY|4b`p@,]cIy[ +_nP)Gw8rxrr`pby8S?m)[;}Pq$VVYmZ̦򊲲hT}smIY,V٤, /Ռ]27^r"+d {hj5c{yɇ~[Q`h\˶*) <_?G~ݟ_;Jw+IZ̴V~pIe4m^?<4=>FX 5_h%Ǔ~fPֿ{˶C._%򚚥|wT9r䨓g—r))KKM){YE"cc]]Owwص#d1ouVTXzRSʝs,-rT HwGG},y.-,f.Yfnw_RSʡq,-RS.%\*,Y;:]jJյGy[YMN|sW{޲NwxʫN+Ш5VecIވ`5#KLDD˅]Tfw͋LZyCnG3.JJ6mڼeݺƤ2j CTPPSS[p74\U*+zf[n^ګx"ljhVTU4ZrHl UVkee]n,I7QtUե577kbpۑ>2י"5K>RӐTE',F~juqejj#<ʨ43hiiYVk6 vve٬^oEbqכGNAe%s8T U3n͋}Enb"id?Ծ5嵵.ID";we>>"K ;K_G?v睛lݒL8h|_{c1IRD#GysY4evhTL,SE˛O; Kc)}ÑqF||gɓ_qxlYA:tu,BVň4jNvRg>_oo$N,v=Reej?v򤸖4㱍+ >X>6d-XqP-^8rF/o#G \jSHxh)=rDEzSG;2є33sTz^o0t_}Ş %cGNWP`6O{/u|+8 zMP(,Rz3Z\\)y]^ϫ kM%Fj[jzͽI έtuw_8uz]{Sc[k}]e*~s8:w|3z^֛6owbI)KIV~pB5 ! ::6mRP##]]eryg08Jꚛ-c??9a28kjNk.΋ff`ƦƦ+/+hnKuw+{nɹ{PŸGQ[o=:Mc|<_\_eJ/O]֛7m2tkY)GN}CCCy #g6UV#OIYfXŧԒr[/Ʈ18@EE IDAT7lPX88xlYrrBwwbt߯$7N/%j1ܟB:yuzÇϝ?{g'Ꚛ?uoVO}C~&&Z_?{5Y>?o~k3~BXO8%L+J<_g1KOS<}t;yrdKpX\^{t4eؾK}ʒW{Y#'祦, ]V*=uJ;bZ(0-\X̞S)iY]XZyW76[Ŀ{[b~7չ,Gx)Šl,  K|KVdEVd= ; ȃ2Is+ݹYYdOn\YYάdO!W~uBVdEVd= eYYe&ٽG4Lf $_)_+]t͝hRֹ͝nͬ8Ȋrs#2~+Oyn)SzݢI?!ڮ)3<㢹NGE[jU.c|KVdEVd_Y XyJQQ"2e~@k/YYZ @0xZuBVdEVd= eYYe&&\<(3)Cv넬Ȋje {6"+"+L2!b"+"՗ap.ȊȊ(3md;d[]kȊȊr) A]]-2n.ifVsdOJUXrmhlTuZ[ =>qgf&u)Ie6Twllnobzx_2uOjo`VWdEV˯p 0xV.cÕ%3<4=h4Z\pX4}kkKK#14%X\ UtK C5qEVd 0xZux}QO pxH$$i}W%tzi͛޴uMmm55VNN2}}W?͒{:\Y/ e[&$iBRB>9sCGO:v/^ ffS'*z;:z_2uO(qEVd hו55WT "N,65v;;0 CH`0 13T9Z{( &/TlR463LNbuufVJxDf,VOE[2ɕ‘=oq7ΞPu:Jq$VVYmZ|pIfSyEYV3>>6:ߒJXVIY鬫75sEd2m*/)IXk?ݒ{:q\YX=˶ eUY98y~pPq:7tlJh4vu Lf%a͛7m({:;J!+ S_Yisןn=Y)C/Cc,u?02yH%`hpԩ#G컘=O]rZ2ײ"+bl&`ap.ȊȊ(3=d$@4M\Eel&yLZCnG3wuHMltlmfqEVdsXysLMz vM-wL=*R-;2fyoǾdEVdEV^%)S!q vYYdO!W~uBVdEVd= eYYe&&\<(3)Cv넬Ȋje {6"+"+L2!b"+"՗ap.ȊȊ(3m26rg“2Wy.udKK[ywͬ8Ȋrs.\#=hvLrF@-D4eʾ׏222222222>*}x5@ Rv,e (꺊}GAB Bze̛sgyBT0{$sg<޹s0L0L0L0L0L0L0L0L0L0L0L0L0L0L0L-|?|R]}1#uuMM .^ t2~eAG<~<--)I&;yQ}E|@G LBR$Q7\'M4>zѣثANA<L0L0L0L0L0^Z/)9tx>uQ ;;PSimٱov=krs4I7M8ʪ)/;} =2eߵP[qڵIG+e2?oqǎ^_Uuغ?^Sm0d66A^{ /dem >CNC޷,;$##%%=#/Qf7,42rPWWr rjʳl]]nnr>ַo\\kk"?өmleȑz(,%SQ'ͳg]9S[Qg.Wk W/5,,6vĵ#G ҧ Q5..2PWyhjZEo;3=1edbz}h5 ڻRicӣGhqvtʬ(4Ӌecfg5$$6vA}{Zn7@3^j:~NI3 *+=z1xPll>qq@h4mdz*kt:g7wШcg'VhN޶}={]dZrw^w+<<y QQ..]B+(>}6Ajr[[~Eԫe~+Wnv:[upo!Ɵ 7[\U)Wun)(?~4ܼR1ť݋MM?oYB++Ϙ)S&N0k3]\8UUǍ[kPuU}]KXW#(8jqAA˴ښ۶E6VQ*}¢ du. Ɔа#ǎJI5FYP8:yyD?hPPйW瞣76%K;q6NUޯ8zGeWQɔ*oQ11{9]Uy#N!2֢1}q5rsܲu9wc"#۰q쬆z++g~oIq>>b%ĉ7_HiN:jԤI#GU߳O`oG*~'OSY /˹^9LNFOlfepT;[[gڵG6a n9"0GXiSZZ}Mhw.gW/fjjלH۲eӦ2Ni4:VX]U\uO?sbbi]qDٽgݺM;y"^[b0U(++ 2uvʪ`vڣݹLfmOLKNJ:qX +dX03޼%94 Sn۰aΔܳ"FƲV[_W\[]ՙom7nܻĉEuXDtT~RUYVZ_өTPe'N:WUبшl3RRvڹ+-A>{ƍ;wVB v D3jjNܺmݺ[Ng*gW7{(3y붔.ډL& ?.J幻>aLBh弸 SQ1`W΢cpȰa ćTMM99Yh-/۲}\z:]eEfƩS۬Pxz 8A޿<ׅ%QW7:U[~hzr%Ϟժ33OfƜ3)FJ.喕o{ 9tN-~~!A9g2kk 󋋕ʂªJ^&|#{pLz%&Gʪh֛KJRRN,b$oOK=sEyܥDi)iI:]CCnnS2K/}l4pCC]]CP'SZVU)=00$Yj5 ~/F,uc77WVWT.ܑ:%(Dұs(F\_~<7Bl-1I_ jzϹ͟Ku==d֢4sq{*>юKHذpqSuqúll گ^o9%D6\Qwddm/n$9y'~=HL >s}b]kkCCAARҾmϬ2N!V"\^N) o[G3*m&BCB\])2IG3 ꦂÇ7l曤$kkR?w(=0* x#oٹ(>44:qϛˣ:(:223,9*#}۶UNg[[ݻ(nKL ʊ7n\:/ͥG`@\츱bmS^tTnn.. EA~UUSSvV9: 5g+:~lΞ=m5w>kمD T|P]U[cgN%q}XJRۭu5F铑Y^vDM}~G'[;Qw0vx`)66cbJKϫܱc͚B7wOM]V?jԴib9\Kֹ% fpLLPpa=gskq~Gwbk09SS-ieUZzL^^MMdG4}m\'.n#BC֭۵+LY!*8JL ˯(߿??)/ s)e2[|5CpٖZ>rySSf掝6$&e2x}ݩS[\%N}3q A`!Px{9:fd8QW[S]W+^`MW /ַ@Wc)+(8j`BĉcDRpO{{BmjlhwM7%$DExŭ* =\}|CF{hT=3uu}>̋2ڢg9W||MqB\ L[ki)(8}&/׸ȹ\pP@E&;d..Q&sOT$gc2zԌ!!V%uXf2.GJثANA?2cmjeժU XA '`9n᫱q2Vp hd*(<1 Pf Pf Pf (bzӕ/6o'IMI4Ol:.qeTZYUVj4-MRREU@R dW G0N4OwJ>h%H:*0͜!LF&)>^NN2РӕW >E` 7WZ d).1J(hd|I-(qhdmX&1퟿;zEǠR)Y[Lp59A8I< )i mi&BTֿꢸ*W/ O32Q%l2"HGWyEc Px{v0N.^T_ӕWPfWӜFJ@"qLgrsvoZ[TQQVVgϖhMM^Xx9߹K*&1N;D r2ꬬ8'o޾cNFt7 U(O?lm\ZfRȭmmOx[K.Df]fV":~=JwwB& st)ryhV+VVVVi--tʪ?lg1{?U99x͜>hRwHUjjZř fa2Sg}{wg=>Ʀs[hhjqéS=ĥBam}SNׅ.bn#֭YS^yB`{nr޽UU548:9W㏅=;wUU-<5Umf\.Rp"Y.]h#Gf|RW^IKijյUg?^[_\ݪS;5('_^_ҸBS_vY>X4u…^h,yy\ [ƛ .)juSZ-{z;tk s#nt`.O3q¢֬ٸo,<9"@w/PTW?}=/MI*MM-VVvv}TYrjSfɜݹLCmힽoE;}j)S|}e(]Mb]&u/|{K_ y ~?Wv\^UMl_.5&Zki9t =[W:xoLBp1p,Pf#Ncѣzx<:f #)8~#Z1ac?}}}|{u'Oٳz7_Ggoٲ}ۓs/_G##bPfpjuRҒիz+4:ݙLg7\-wNyrY~}чnr׌߿i +,2 47~..! 1NNo'+Ik =zleFC'24iܓ֦>cx= $yeK*ZxMvmǿSnegݸoyOݓBRJATqL.L:\r[h׽Nrrf;ttԕW|ߗ||,ٿFTĮku:q9B^bεkwﮩqu9".>"b!c2\4OѬ%ۚVRR*4RS˵Z.3Šh**%'&Z 3"b@''07.=%w1{=&\w}}lmMǎW_Xsaؿ>gεù\Wg BD+4Id^t UEH,֔O>yY\YQ~^9cf++svzd=o?{ﭪ^ݏ?^}WXX]m0үߨQvΜS2kݤwE9B4CIʹ/V+I-/WIf"Zdќ$$پC4wь#YG39KMi֌;Q`,S!W9!Ns&o {5) _1!`9lIs0L0L0L09_L'9(ZVhZI(mHh I0?I%S$mNoh-JH*u\$6F4%Æ%l( VI1#Fʁt ju^]}3gN0jTllTTt5׌3eUiiN9=sf7ߚi_?tGr={oޒL2>kЕ KEKٚq I2!뫫-{)SnmKWgf64FwVTl+3/,*;{o3N -*Zj{/+VtĬki9q[_xMk_^hM}K3~v~5:).xs͚ꦩS.\Fd v`BY'6Տ[k?xI]\d2GnܨQ _oʾ'ӛѺ&f˶?쳴Ԁ%KDT*'8iҵzy͜9mڻᄉwn?1zѳ<>k]XNsbL5k6n &Ost:ZshHXB!'wm:]FF)MM^^qqC+0cmݫ̙?0fce֭8DG55.׮+$:ԩ ɱzweܠX&1qm[KJnjMЕ VVj0j 5e2Gǁ11"RO0ݤ7i_$0mqO? <<3>Og/C$yw;;6]BܫwXRUQ}k;vLvVvYX+a,=P_7g΢E\1t#eD{z˜ogoy{f?r r>kٓ/XYiV˹E=W֤9ʤV}N}ѯ}ذΝ8;=O=uwݣSK_~G>zȑO?+/_8|9~K'FEYŰh&]^_T懷|䰰ڸi[o 4 s9sqcn}䅯}9`';f2`RI.kks.Y"۟; ~;o7aAb0 yņ̬'Ni5= k=h#Gf|R1 j% ֌cCD/\>w.{D3h&gI>Iա`:Mۚ\b.G Zf2Nsn\X&@ &@ &@ &@ &J!LjSA#߿5"LcB^ r 28````JsNr4QLѴmQ/ڐx `~f-3TKH%Zd~ь[T3뤹IlhI%K -KbP ߭~IbbGx;;R ^RP{'?<}ĉ#G ;:aҤ{]I*+u:b]rՖn?mM8zt|6 7bEbRy9Y8Ǭ$rHt)[3nfeBWW'%}ł=[嵴Xɼbbؽ]]^ǦLN3n|}.ui-^}իJ%Qg*.+k_yc}~_7nƌC<'mzW_}egG]= M]sk_\۹fcuԩ .z]Y;vsvf/n˽G;φm7pzysMe˾{]pPXw3BѯOnǎ_&M>}dn7w?߳ww޾: M|f;.O3q¢֬ٸo,<9"I&cB7>)\^- M-0Rd⒒&TwSuPtLlh\ؠXLL,[259 8_R`>FҢXY983T+,޹s 1ihGG|(3]L6+k۶8\;ɿDd\"KIIM;S\RTy`5+oPX8d!!{p5a4F/-[w\~:;,{X<&ŅQ/݋N|y߷lY~q-<ɥwkkKF6B[ ־}nӧ}2fK/m~ر~.VcK<w<ʕyye&e@")9{jk9CqvfKwPۻs_xO-{!qֽ{=tXjh&&ZPv/ewytvd[[bsQ˫q6n(3$*01 _w S}[So dqEnnP[o0xxa-jguRl%eyzf-ִR$PW]^tY%--FSQu,91ZTT:9 CWw{c]z{y[YY=p󞊊llJM=|ll}|5sظjٓ&}IK7ޘ0fpLDD`PO?7w ?%eO|b֪7ٳb 5h#Gf|R1 X"I:{-TU,7Z}9끕++*.Ϳ\9}evat]^꫑oxaÞn?ZG+l_ccXbkjRRmWa۶G32ss =<==4k͓=<&5zl!hGvͬeZIzhy5H:5ب"$!OGe&~,G4:l\s[K(0XYL)r+Qf Pf Pf Pf txvhd/vSW j}h?Τ9e&e&e&Ҝ/M-+S4s[s6$^4YL$Ւ){IV'ٷ_4c%$pE# IDAT:i.G#FRu Ѳ$Аf[7{'O1"66>~ܸn{ .=pLcCw^}Ef4/8iRLr`gǔ f2SD.1.ekJ+iX2--?g߯.. ioW͛|w v=t}W:)iٲ'2濴zuffCY#)):\?q_Pj|7k֗_}grt'Ng̸ޯ|cW+M[G{f%)t.-{Ν7kN]p͒%//رAt,p9CX:OHNx_k8rD:g}+n$9;>8 W(22~OL4BWԲW_Q'z ^[foY`0GLrj1~g=:߿I>Gf鎣c uuyyZNURbk4YYǒUJJ1`@`LF pd~W#D3>TQ)ژLbV,q(u[-X#\0u#G/~iӁǒzL"jdyf|dZfg+Zs[3 -hN ptTf29gI>Iա`:Mۚ\b.G Zf2Nsn\XM&@ &@ &@ &@ &J!LjSA#߿5"LcB^ r 28````JsNr4QLѴmQ/ڐx `~f-3TKH%Zd~ь[T3뤹IlhI%K -Kb` kּyw#bcǍGY`t:v:toz}Iɚ2O߸ߵ#a^:]j޾a|>+2'6nRX$}Ҥ'M1W@WaL X$ή`ZĒli9>x̷͍f{\_r7|ģş~+_zi52; lO֛۶UU Ĥ0ꦦf\>}8B޻ jG_uuR_,XsoeK^^K+&P%+4uͭu⿠`ŋ? -o֬/l3 hMpu;9Ϙq_}VLzcJR> -[xGEDfdAQ==:t5Æz{˹D7vY>X4u…^h,yyD]:?#GC֬A LF2sl샳`p"#Ǎ?9tEuoׯO҄ ^([BbeekkoogGGgEYq7,X0yrD#b]-aLjuډcIVA..\]cJv6'-ɺ:˾o{>LQvylnnjR7vm׽+ .}UD+--/.jŷ={tP(||{T)ugKJ+D\]22xE㏯Z5Vt\6kMj^r bc{;00͉n[~A/?ܼӤ O *{xxzz*:]QQ~~QQGK{%%VˋN;ԏ>_5%$9!de46uz}m]~GϞh_T6{gQY%L2cQQV?>|hbEţ#"οMxcģYV>=]Qs=˖~UI矛6mڎSn*QQ0#'BTY+2RR?\ fILu9/(P?qbzß/デjj~]HknNXe;wiQQ&!8n8&[{̬df?kÇq{xԩի)0uezN`رsݻkj\]bb#%cLr<=DtnkZIIhvKQ ^ x`'uZ3ߤNN~g}yzzX#N;={Ϟ >~H~A>ꦂc~V,߹0v_3k+1RS˵Z.3Šh**%'&Z 3"b@''ƢZf X$I:{-TU!\Թg|{￟mڴzonֻ.X?~y`sTϞ7VUW+,6z oԨW~;gԩQ\])w-)|#X^9cfVKkÇTD {]FPEhcD3J3DAҹF_4' I|]4#fLΒ}DCu:58]ed" 2 .e&e&e&e&@w+m0yKثANA(b׈0 q{5) fwvL Pf Pf Pf<?eo! A-BkADEijVAZESY ɟ{񯭣WyOf{s%H8w5w^dZQ?֊FU͛EF| p̴ jWQ~ܭߑ{MT^46iȈdG"2VEٿʩSo>}vmݺifڷ+?~Ԭ,ǎCRR}GoWN8i6ǴV^sc:ٽ=n%U\v /_tn.Z-۫W>x?uיg)b͛?ءݺ1F6wljXt||d~%+kŊys->xlSOm_/$%ժիW~-coNYr;wyԩ/3ÇwZFbȇ?eC.[05Om֨3>Ij׎|%|9Im שS]/Y۷F#̛7m[onْgVfS~y833pN oz-ZA&MjՌݷO,s1duE*ɥJN _Mںu[23#mX|o;/_JՊm۲uvkOiK֩SWҎ~oSO~$${R[nWԩsc_%ת]#9!q~q}}{׬^:u[dջS7oY !`mVZځ}iGNr *\@LlZZڡtY||_Cv_yfiȜҥ[ޢJm..bn /|̍73wHv_K|>6ȳTLffFff9:8wKh@cbbҾe3222br *TSsC.;n݆<nÆԏ>9sGԹsr˗snz_syū.rI\˖ {GӚϙ3vo6<{vZZn3AG*RX\eɃLy}[XY*)i6E2Y볚wزeÉ*TT6ȟ7m<5j\˯qUg꪿}kw}U=:1nڴ믫W/!̿*Wn{AFEF^apܸ\z~~ :uON[fsm5XxbrNm-\=5]1~D~_NKc/x۫W޽͙ԩP`R͙?ӻw5mzÍ]ަu}>쓱c =*5A3lبZrr.YӦMs)t~f2'LIYdm23#3lNOؾ}ժ KJLOL,SfzV}G53UFF#vQy#Νz7< =^ye/Yvƍ۟5|O^}~נq t> {dܸS_z顇xs̘K\FF.~_GK;S YY UM^=.7–-,XRu߽֯N8jfZ+ꂨQ?F}ȽQv*wT/[մIddD Nozc߿|ԩ7xp>]nݴifqÇ?sVjjVcG^ܔCtiҴuo9ocr_tQm4iҠAӦgҥOM<cgffn۶d˯<ح^vY;yff h֬m'O76{5~WwTg3폊ʍD?ro!ҢrC|.[WFoK-u濟}v{l7g kqZⱱ@]7HIIO-[Io͛{?LIiܸ[}.-^bKk'qGKW>thʔIO p rݧKWpvv)AyJs9?^{9s[o~r/޴}2>~Ŋ/xuJOʗiS3 ޵kE}ܻHh[ӗrVZqbݻ7o޲A[9=/{6iZz\\zgd3=gףte /_]5,Q~􏜔5iܼY1]OuRF U$'*j]FFzzFFLL"%/Uʌcfemᄑ|EdSf ++U򓬬[7߼%33˗STX11!+Ϸlݶ=?)lV[o][H^װ-%SR/^t[6m\r濧N׏s̊^yniŋr,/\TʕO:Uˋ.2t  m~j?|xvd-l(6h:uON[fsmE]*&ē4[H<oҴC4v\֭oqW[{8gSN۹3/lvyB_P<>;v|9g?1f}{l-_1y}/3~.:l.,٩o=n*]7U:֏E}׳kNΞ=K/^n}NNՎuR Fn2##)ZfԖQ(*6b||_xh7'/Q튁O=D&򳜜{SR,Yz۶̬lNOؾ}ժ KJLOL,SfzV-Ztٳ~;6x=ppɒٳgM(X'׏~(?imŕ)sE'wԭ3mW~;kuʕ.t7޼喦M,?wtKz_zk+׭۰!5ҥ+UJNS3we~׆ K7lyw"t}DQL{u?ZܨjQNd~>ߖoG|RdDPr:M?r/QL ;A 3@2L4Y a6L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2L 3@2LmX67dҥ"æsL 3@2$pʉJwEFv-kUDd+Q'|w>2 G*eZ82rF ?qd&8Eu0*T5ȝ}PȘmljPw6dE&gE ?qd&8ko7cThRR]/8믯WBm_= 3f̙.e7\"++~-Z׭W^p~=N7m޴y;oνg͛5R(WqxDlld~}?o#31 ^gwpY|BWg5jO?_\޴CWP؉5_qdeeg<o,_~.vE ,X@$6ΊG>"&fテkgz5wWϫ$5g~zx:QᆷŋkOH>᫟s+2c횛n醂TRf''>TRRd9jX!3Ÿdƫ+W]aW\'[9_᷽e|իǍݫaû~~+W*UHȥ;_[Qx" …)32ccIʊ=묆 TL'{'99 RRFi䝝:;F&%EdL\|\\g?OQm1~֡Cl͆wqLjsrӐ;}]n5kNKDBQb7o/~q~MsBd=ܨtoρiiIbc33Z?fg9oĉ>0ܷ|&O?̶cҥvٰՋ}իۧ|ᅵk./guVQzxO?tYe˔-w=eԫW~R}];vU矟q 11P߿߼ySL}fg?W:ܿi#/O_ykvکqfƕ*+[DlCvo۾~UV[}[vNV5R/̻% A{fٲ#nC>x֌>kѢ^;K>ϓ*٪Uŋ׮Nv\`;i+vsر/p-έTb8u#υ4U:th $&~b讻x;xkZ#@SOYsͽ{k}==ggo[}Ygg7iү{7o^lbuꩭZuhߡ}֯6n죏8cL^С\|W??ӫV-{^믿iK5+:[̿ƛnaȰ!bbٷ6;g ڴY19٪Vdݷwovv:u}wo9@UV=m>#_}uᄎu{vKϞ-[VT7Tj6ğǼ93bYzhSX"Ǘӝ;lI'Y-Z[83~cI6wk?/QAnkժSgڵ&Lhڲ9*T(N׿iL_tvzziٲsmӦqO^|U+7oٿAJ5zȐHH݄HHJƧU@= E_Ѣ (ӎ{<画׿Ҵ%K^{׬-ZUٳYey)R9gףǺG?wg?/sCf'O>.ZT׌ٻwSs?sѷx+6ksړW/<{v3ٸwܥu .ThMOJ\ɧ)=6611u#o[bc#Gԑ'D^jr%K&$DRԪoVb2_if ,Y_R-_{Ե?L2 {Tq2ZVmk_ھשKv٧U[hU d&ȼdE|D ܛ{~9x~176{2IK ""XҪʦ& 07Yͣ8t}\~|08؂ywx^\QZz9ҥ򲦦ή! PV^1+V[<4X6cf?G}IDAT٧ ;8 Z.]*,rc``TEg88zύ[ryLE;yOgMM"Q_BAXYx M{Do/㘬QUOoqǿtR ͹\ox`9s7^4CMGoRoIZjK>飏岋-[ҹ}~]Uҋk\bZ-v XR_UR2:]d$15e*Ҟ^~iIIgUhhdBi.&300,ۛD(3nqnH~_|9O"%'oذMV "NwqQ66Riuuit3|L]zj=u6'~hWYXBwUwU!@B |oָN4Z|k2D"Fsj5A']NH9oI.cW{zzŃElkܾg0z:}K|=|@5ޱ/[s swwjEz:аVۦG$mWԹ8zwۓm1 ::1NsֳQW45h4XaÖ-]Πtn?z.(8v a b#dd]=Ӿ}ef:?Voч9R…ii[<#XnaaV?J!:wn>|mܼ95?Êxd;̄L.t߹ʪۣbBB`ؕ+˗#?ӻM[KHb'oFS̩.oq9z/Qh]+vh膍(d3kz_S)o{ׅ g.[t->jXƫ&B5$q+$77v\KLX@pEFGx2aDS(vDR]7511i\S3{q2>zuPP\'.]FF)R8Q@R9< h:E&.Gs:P 71..nJO,[lN'IAq`PrRrrw7w쫡Rd#H$3}Ζ@.7fx잡'ɆC $RLflT斪z 􎋋rǶ60Ir{zh4aDg6mZyG=>0W/)e,5%rc"o*9V, %mśţryq!ωF Q* hiammn\̙^F/)+hd쩮;򪪁Ą;ۙfF Xl6daJJ:TƵvfX"1**& *UBQSSV܌ڤzyNnUqq.n\{&s߾3?f$&GF;VT aahJItsr$:%݃?_U;tNށkoNjZ"zn߭Fե2~~~BgMk:݉u[\̑'N׿֞N|mNYX,lpE&Fwr>ZXOuw@#Z#l+b[}e4emlwI^r8>i钄;[x/  \{J~3dÉy˛QopDF\z;Ӹ~8)aawl|(0{q׷{#"RKM570LR5Q( zݵu5ں:g/YQqѣ <Oj4V3Yr^k{zlp*$$,y8`mbFho7h6iu##=1}**T 4O؉#VX__l\/pQQQN<=/stX3ȁޞSsIBahyp䫯~>~նm}O͍{®%Ư fxxRryYٱc_ݼۭR^-*:tB'yYRr6H$'mI߸1"D;zONjj2.zĤ_<^CcAnAFcmmI$R=>ӧ]]}o?vڵrFD PCCBi(Q%feeeh#SVU;Ɛaciu}U%m"YHhJʪU{{::p,-i4|K3ՙk JJzByzIh|PmGiy *n#KWޞr**y}09X, ޞK"||csFx{h42bϩR56ef># [zժ`--ﳶpGkhbq]]VVaacSah2J":uڹ)]* Ÿi:ǚ)zcsb[QL: !;E.]40`p  `dd4 n޼@.j R\avrh fb"¢ST\|K9"D@?2XZ]SXw;'X0{,##5Ã>tf#YNtԒ%4GG7QUM?\TccDߩ)t'tzpPp0 =xbYǎ;ƵߥG" `j5*ܿo'^׬^cf&H%D0LdFGGL Y[y[[]ϯu HF\&D͵u%YY?Tk9/}`F"TCCmmUU/lܹj>FUϗJV\LF 64\^_Xww:Mr%+X& HJ Ujsssr[[eehU[ydiWKih.Ͽu_bF2WO==YY"KR҆ g;PE`Fvᱡ25 ˋ˥t2IR'IZX(1CecTǩԨh ?3& W׈NƮ uu|~G.g2׮}ZÝɼtᑆƜ|Qt)J3>;x[X_}N"߁)t'{)(8(MJ(<34ZzFz!,<,\aצFcemea%%%T=3P.hpl6=Bk[MX&),,..<ǣjHZkx@ wsstqvuw754UV ZEK:;^OH LxܘffXёb:)44"YgUS[RyyBx@rqLhS_Llxlo*)˻t  VV>>>\.6vi*q2q,\ _J|T_v~Ӣ"xy.h15i;_1.ˌ@ LL]:E= 11oVpv܄;Y:BQQ嗯Wrw|q,܋Mn\ \Yzq2T` pzәLk: O0>bykP#QJqi@Mӿɽ_m>c'yufiUUQamJ㛖&r%o5qriGg_Ӟ74l2\f":8|ͷ$ҵ!^ckjLC:x?PƦ'?u& eh&ӎ寑~?8T^VTР3]>0>wdž($caLGՙ1yauw5ޛdjt\xI65{4N2ھ2~ID~@&N-[1$PfL7ZܻHp_sc|dsd:vKn}.]:Ǘ^RP8'`?&pB[;C90;6wjq Nl ] z\ Dt]5psE@َA @p\`@ H3i&0 f 4dTv]$y҉IENDB`gsequencer-3.1.3/docs/images/ags_matrix.png0000644000175000017500000010126613607210263015647 00000000000000PNG  IHDRp%zTXtRaw profile type exifxڅSk )zhX-4'FaJZZ3# mڸT1?3x 0ƾ_!@| /^z6ynйON#76j0T26UU'}hu!>\]dņU;]r3i6wò+ԛ_-N)m톶 Ô1% R']f;bٜCDpn򺣔̯EabrOEBЩ8Wn<")|\(K [4բ*\VH $HVfxKJ1!Rܣ1kY,RT~^ƎxbR<—{&xkVD{_K!ʾMiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Advanced Gtk+ Sequencer - matrix screenshot Screenshot showing AgsMatrix Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later z iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxxTeiɤ^ -BB t`qUW򮾫k[E,vE@zB UJHe?p&繮ss䚹=B n%`)X eC@P`1X elҲx 꿿_^xA m <]P>dHd䠁c>-)^}͗^7.2;){ydjS.۵kw,,p`OjQQAavKQd0dr9@˱p={=v,0^2T*7#7uAشiϞF߰~=JFS_o/.ݱsM NjF^bN  O7~ذ$3fr,P.,*h/g3gttdTDDϨӧ/\/)o=Ӗe2.2"G>޵gBX[wa}:urt4=<ºrU]V;z:boca 7l8{ĉÇjj*+mlzu8eԩ= @ɔ4s=uP}7EF$ 43ojR޵vƌw{^уL.OM8v}Rw_(,k;S'Wׇӟ^}ǎÇ+u…wXBw]>å;[YkoΝ5ͷ{=ퟚG\\ulh :9^\|s;_^)lY[C ft~5vY l4LRSG'=I.W(mFc``hhd}ǎ=/vS5+VV'O͟?oKnҤjj6{qiin}ѻE_.ɱ>;gܸÆ;9yPRZ^f: ~OvwLGhT*y[?t(ںKȁqVV ( cN{ ү_hT(vطy5{c眝m~;'ׯ[7kkvZn_zٳz;{'gwWW+¦ii'N?V,4_}+3(u::Lc s豣|%|?=t oXe^_X8i)7^&S(/p7F&srru-+)//+3eg ,#{etN^TTQԴjuVi4 {=O?=n|H/ogM?\1/<ȌeggcPtVV2R-g2{?w E%.-(ud9;8{zWee)z1$36To$L4U55.:9ycbwV>"{^o[cJJCCiYA\`W*+Wq{|,F&D6}ᅹs_y54 ¹cy#BCdN:cF kUG8mk.''75i;wܱf'KHjJkȚO̜6mī5,[޽ͼyg 1`V;:8{xa4zt.WױV4_~_R(\}}n+r=wCv]+Xz=+3~h`xz=$'WVLi%lYlmZb@Y._qu}987etJv0:jwe˾%%H,,rupsqvw1Wr<|/_uJ2[R*-}?zȑ>1 'OjnuMF9:rSs~|ƌ[6o߶mmf4XzUDΝ5FFV h?x`f#Mپsǡ?(~@1vPqYvܓ'3/'UV\(hbW;sM1bbRwٶyN2xذgg\76[Sd2:ݢ/WڵbHW!+ucĀNV\\Y'FAd+nQ.*+ qqvqMK3ǔuZqh2hn)|D^b";w[p~UJotv}LZhklmmlzG>N[*[o}ɼyPV6*iذc]ݜ'hL0dp|mL&'ؿ^ovt81aCvޣRimV$W+HoGoVyEm dɒ?}Db>nj}ݰ~FM_ TTVTY>+G*-۾m;nXvvw_``Xןw<.557oJ!?L.{~_o0QWg29:n޲ur/_kCEEdDTԀF7AY鬭8z4u={wkjR(mfkө}G>k ZLwyȍD9mmrg[iS\\MPۻfd8UQ{xy{z66ZY9:nظeՑqNJakE ~*_|dӥF/vH„ MM2}zý^⯾zgyUNP?ee߿n3sq} +:_RRUP2+ʊgr d>:tѣ=|J*뚕W/`c-uq1}С͛Xx/{PVZWnٲs]jxL.rpthU^^[[P`eccg򴱉7~ۗ.fїusd^^iٮ];w[{ÆRyߩ@>C{w;xG[71llFӱc?VVj??;z?~tN{?ۯ{n%UUݻ89wؤtE%:{wj'9xEj|iӦ5cLkj}{6oJL?6VpttwܹzZtѷJi4t ?v{ۻ ;;3Kf=jB.Ϯ.*ߎMݝE!4wqɓ:]yq͆ #2ի|xVvQQEE~~FII+Wv^lG1C.wv+rŖ[M:FDTUUWgg ':Ƽi͗.e'O=OUeY..JŤIIIC 8| ռ\]6=?u2?]۹cG-99Nyz9;٪;u1έקuCP:i+u߄ ^fzVQG8zd|=ԔdQR/#,mx7q+V% X럋J"E"9,C^_@%G{&19KHR)Pa$%0[b~d>qnf zSu:#_e$m8Ɖu"|]aVW+'ooi#i@kF@24GmYn{JN OLL [ [teOlݶ~GdgijGP`cǍ1A&kskr22RSޙpFVVaQIiYY]3({AcƎ?cSK"䷟陷1HX1Z3e&ScCa6_ϧOWVVks1**vdIiYccw1/-[oQXѾʟ8ק%bזX-(ew,[vgttT{xy::duّ}99U~Ǐ ,r%wuCP:ԡc)igŋ7mV(v̚5gܹ 7 gX!3s__&rMS~\޽;:㏷o*߫17wo+9rĉ99*gHHD̬g0[ -d>|x͚KizH9r{欬3 Apq}Yφuzy$wnN˖nݒC7Ua2Y`1/Ɖ}^><%e_~IJzѨ(KFߒ_\RSsdZڰhLO替-[5+3:7_G1㳅9~~#M?`mS[s.ĉԟSdfd-|m$KXmіۖXl5{#xs'G'W;RGxAY|zڭ[xo/AZ|eK ^5;:vnjjlFIT`R:ԡuC괕:qgNTUmذf%ÇEGXYݭo IDATx~䑅 &N澥Ο_SR~k_g9sO?}?N}]>ʷ X[;ZIa툞L:N[llmʖ9혋XV~YA A @'y{5+G vr:vw?䷟mիϟ~MP^^m{3..m!R׹,7/7BeEEyaѩSi{v8PQٹ3xɒ?221_zgGZIw~mnr(_WKvP6NtҲjɓOCd-wDKW:L[[[YUZVPx}{llwɝ6f>N'e^X| rp?nʔdB;7U{,[ׯ-)iDbaLoСG~'e!4"//zVvFFݻCFɤT\""||G{Y4KF6}ᅹs_yuvrW]=<ŀ9ػ\=`OOjbF[W_[[`2?,3;:v>jTr'G<8u?osEEVVk7_ɣ=<. e4&'w/X,351qs&tV͐Lfm5.R:lÆ[N6k>ijT3g32GFG]M.~> VV66e%yy^[ F9{[\[WSWW_t쬬ɓO8bdbtĉ{/$Lxkr>;] -"l|ےF髬-`(ؿ|naL=g-w\3ŊKKKK.6465LzNիv25{{L7SppɼDh4?VWߤhzN,M=}ܜdrdԩKc66=?zt.ӓ'Nᎎܟ T]sҥ?Nrw̬p??7dttVM4mU[73f;q=6O4b@@.[IMKիѣZڼ(>4 ͮ H-AFk/+=zJJן7J0Wbz]h,)ݿoZV\62{"|] Xjc.ylʶKϞCvv=&Lz䑡Ã6UCÑ#[lh>}z/^L暐0W_4)e;YF;vڴ&޽;z`mWWk4J[`@x6<&&$޲uGfYY嵵9YY^^^b q1'/\'o' |СÇWR\UY׬"'~C 1"|sg"kՎI1"y__͛?Z6%%--=]&TW^^!8ӳq-׮jI#)7bŎCotQQ}}-zc}6c#/YRV&9 x{6ow߽諝;xc@R<gA?~~-򧟖6TU8g3gi={:9YsV jOr =]^{9<Ï\?]'N/~?8[dѼs=2=Gf=kz7_oݲ}ï5nzXܮE0wnZZfܹۻ{M+w$Q]P&^PZsr]Aup+t:VȐ`GWO57nXfn|;uY3@{@@TġPm̭mġC#QI\RFI ?eZ^&Zlٺu[46VVxz55aHTTlAFB3V >Pq Oq#˭uZq<0@6jq+V-?Vy.1JqоؘL=4eر_d0N5t/,GS8Z~0$A碔xJўB@w8$֤=1_Y;{q H\!%G'qͱw7qI\ۯdd]ʴuUuB@ωV QKZ{e9*,̏36\ɭԼ ԡuCP:YA8⨫+֙{cJ̟ÚS(լDC% sSox7ql;@36~p?1&0`MEkao{^b Ⱂsims X uCP:ԡN[d,AL\p(_^ߋ2vBq(j*8!HXg.wE@޴k5L={>׿̙y]hs1sV|շܰ…:3f3QZuhKٞesڞ_N_P_P8;{y葐0vܸqPڎK&Il%7WFG~`&SuK,_~pmdgwh-P@٤45i2O{ZtՁ]Oh9Yx̪}6^(vw/9y w7,/'OTU{hK*ő(J$7WM&O$P-^iBYT#e֬9shA&7ʷT[qxϜ׷ Vܟ8"(} K 6C`Qr+VP.Kw5[|钓'OxjVnAɭA6YT*Rr}[z.&SMmz-{W{z& ~aClln׌r%wuCP:ԡc)S Y uY2j2548r;c8#ɤj4Z$TJRdKE9{ĉgg~l 2w&$=o(81KyK B]}ۛP4:mf{shqv =lC"zxzX[yΗk2ֶ057w[.(V(\CB'O;6&ے X uCP:ԡN[s5{qTK%۲Q9y (/+ol\b+ rrϞ Ν:OlŊr@Iݱ…@7FJL%*h7c3g֮[Ik wAu@,?I.=j'M4u}{TrƦ׮7~yb:Ɔ&h4/}V_;)iԩwRmWTW7ol LrR[fff̼Ϝ-(ox{ ''{'O7.q1SrT <|bݾq Ld21"PH=-|lԳ vqvdgggUU.Wzi8@0ǔ{GO82GnQz[[$bz}=ݲ7oL&V3trrtpr}t:I#FjU "=~?ᇯTSk?k8s:ԅbЫW`Jɽ ٪Ş*+*J< ֹ:8ne?ê*Z짬RXj4 #|]-b0׾X2ݲs1 6l N+WN~~N*VW^~hG?ʪG{LE,UQ&2qR3.HIY>jjJ9hpx +)=rd͛Nq1#6M $Ṋ`y]wGF9RU*45i*UFơC?ܵkbdV**jkj++{7׋ke4THKٳchHHS\z߁u|@R8pࠄ!.~۷5?05< µ>A"LGørjwDĐ)SįJN] z=u\ɝ@P:ԡus{EJn='gq4HWLpvoo4 wO33|.X0}q ݻ HNg^zyWK\޵kNA=ȫd.Η׾}ml:tz-wYYiuuC|}~lsϿ`g7EjOqm?&wIPZM|8:M{{8+sO=usKw֭SO͘{VUJiڴ1c$L0na-K!|]zK X uCP:ԡN[sيC(j6se^7p5-s&&R qe٥^}uj'L+11Vnp`%&STx0} /|RC|̘֗*+m{WaOKGyE_46$2';+%eoɓΕkuj[oŎ3ejRRn[B.D%i[*8Kk z@{eMǿ}}""2t„8W;[o`s Va2UV-[reȄCGD*33euZr/=Q~7RǹqxKlhSG~8<88,Dy@ d1x'ީ>2Qs:ڛўfnVzSkC@* S"؀!=;>TZ~ ^yݙg>G˖=?|oΜ Z[#XGfE"]kii憥Kuu774RTQ^U5ӦM0033.:c]/fɒol۶gxnna+&UMqKG}#N:A،};O9QR2y5_՜9VeWV6rd>aᆗL:v/~G6mɹk)S HK;th__ZZwrѮ;~| {Go:4|UW]=妛&ONlڲeym<[owd?n p1܁Ҳ Qug$ }32.)~1u!D+W.Z#eoxz+.-(-9r?x~NMͪIf4(ӗL>v݂9`W^gc*KJч;濲a㨊[o-$#O:Ivw }3Gʕe%]#z?jN&c3{L~񚙙yF][o?v,+kذiiFZZAIWM./8ڵWѰ{8|n;dțo.Yrs'NxaxG]3ܼz-^fy* x#Sɩ=uu}YiYnFV/Dkkk[kk2֚29#h /Fxc׮}JbLH&^}ٲu6͘9~|ᠴ#޽**M7cǜ窫xܴr  Y^} o:pP~.X[bޞ9sKzD>}ݳPj|HSӡDBP8 rȑ#G9ӮKuz1gϾ>/z5_xwQPP4xĥ]=߾|ʕ?~g?۲WFϞ (#(G9rȑs݁Nv[o֮^N1vqqFʓԭo,ܱ=?Y5jշ^Q1a_|ǟyz_r9spaZZrKKOM$-Y2oh477??7kvЕD$CH4ZvYu7~Bjp7AaZH䏯ٷ}ĉEEHc;w|x8jܻuƍެGxxqa\7 8}n@9uQ'^][dbW\~y^n,F雙'Xc+Ǐ/)xaZߺnK|tx3'O92==.Ikk۽{g]JJ ЧOM{o˖,[bǎ镕~ :8P>0Q[Z6o]e4kȌ9Ε"Y^o͞ݻwѐů.]UzՂW֡X 8^K D@/]@X{ȑ#G9rΖ;9?ʏjT MU륫r@|s/Q8(UnO@[@n`paڷb륫b@8WPЋ>-u@X (}N2PSc2#η#pfȑ#G9r:']y@lPBc2Eʑ#G9r-9@w`2@hb 8ؠ ƀ2@h (1 &@vNƍMUw>u?.U> @4p2>g 8a8b:߃aSKx V9rȑ#GNzkm h%pj tD9rȑ#GNG綨#b@e 4>{'p(((+++/+xw;--6lxsÆ:Á%x0VZz@9rȑ#r5OKRu<+U jTeJTkP)wj}-}\ip:>٠ X7(IENDB`gsequencer-3.1.3/docs/images/ags_performance_preferences.png0000644000175000017500000020063013607210263021220 00000000000000PNG  IHDR͚bzTXtRaw profile type exifxuS[n = !HA!d"ǯH?GCc<[1# -ZdEHWlXvOTO#~C]D+^mƹL_DjT.^ۺ%^%gDimZ+I/D.(OL-:,1] SƖeΊQAQk( ZhR7kL9eK[GS1t(;l +'pᩊ$~(]EGCkOئhذ*>)>q1L(v $bRfT@~_P]ssxOoIjwb%_xM[dzTXtRaw profile type iptcx= PCL@8<XBKxy%K+V{ /w+u$}ڳi$þBYbVWiTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxx[י'| "T!EKz%$q2$N&l"%Mu7$IlG.EI:{IHDLJkHJ,d[y={{/(ixURh6)Oǫ$`4)O?N:)kVBA:~* ~ aRk,#Sx&I$ /*P w0F8C`F0`F0f-t:;.]:l:GB!OVrիSE":lo W|k*-?`py! \. |6a4 B }ʵ+$BgK_P8ߏOك4 B x}~;!e"72px|aR'J8l^|?_}ǺRIk[eիAFj!+xŊ2:_C?YPTVܸAV0D w*.iY`6w^TQQwb|>6["U ˋhb|GoqhG[00[Sc_~Iyؘpx5/dϩǢZYtelذm{|Z[{fe2bM\jV._(27bmh98`:Q:/ꤤ%-)III!.^5442<9\D.+J&+$5Y*)FhOJNgP E.K}>Yl{NU\a#XL?w?0]V" C/ʻ̞Q&S(Rc52߸Vv2޳kBJ؆vF򤲘XB `0tTrARGfT],Q"G/L8X;nO?(ꓐkjxbytϞKUJҧpji=q'55 ;>1.d}#Ö^rȳI\]S?QP#T$NiHsr֭'7Qo\h#?iczLF4;[ybuښܭ[3}pz9޵lM,݁v75>R]Mntr>/_os8dٮ|Orb{G^ޖ-kWH(LfLlA=7~}Np5B#].7 P=8AIqqw8vs.:GFݣU-$ ᦤg$$P(gCZ8.-&VfshWц>կ~3P{QtZ!!1%%)QHl/{Q>n?LPJ4^o KB!Y F~7>'i V$5uT?Hss]n'a"t"+zHֻ޶XꚊښkWZ.ss#55Ւ5kw\.-E"f0n@iԩ}a(5B+zțdBBY;c.ZDfnwvGűJka5ݎm߾Z#f29\JY.f{22^/Yft pxaXd!".===-NQ; ~hO[mpɂ>OR*t@je=A5Bة'a4XNCM G٤Tr9Аo_'֭Mp-s8L&,dϩhOK]ꕞ! ijm/r9G}^nCO8]vnAP88iaJ22W[|NK9sA.vj_)Ν;JGGel;2E21>!Q+,r1/sy˦.t+zh.\(+imX6 dr!=`Hzr<0iv~8'[,f~3Ytun 5)d PH_NА>:z7'j.3PHaFQ}g&Z O*U(bj[] sR\N'LU?-)2deaw,t:iO(H{d &BɖNXfC:˥pHD۝qWΒ(v;6wgn>8vϴ~r83{<rgϮ9f]TjepLP ,Rr?q|raYA`F0N˖.5dkt4 '̝WzfiA`FFQfdzQN)pLFqI Fe0>XI7hd&eS$G(B)HPHQ#Mfia!ӡ&wK jE$'>]F23L%[mQΓB՜@ i4 H勢[mSDLl(~/{ϽܩaT í&56?L˗{z=pQ4Ԙ?-RQ;>ꪫZZbNr{z.ͯ_ _r㵵]]> XHiN8"ȝP롄焊%wHyZ/^lɖ.};sr)} H ͦsn]Vց,,\oɇ4T*22V[К|ϧۛ.ER]CtI* e~}VWwȤgdknD (w@E&>;DxPmᨉnAz TWLrŏ=by1i,o{-[mܼFJ8t{go٬x˗qa;=܁ͷ=tN{K/DMW4_𵯽7)*zK#u[[B!Tq#ر06Ù߹p:[Nrdw8<K$R*uۿH|}ξ/յ\<^LLJʒ%۶=Νc= sWnm2N|ąf Mz۶),ֽ\U|-[~th&Mwk/; nsguS'X=0`ylTR\cǣoݺhZf_˹yOhZ[NP_eB2j#>ĺu |VU66@^ОG|ƌt|R17o!%>z=J|v$d ƫW]Q_b6 ^owwm#JTrGic{z"^xasR\$p>5,VV2|mq Vsg2\&YG̥3eʻXڵWM&PĈtz©ӗ Ƙ)c^~FR[:L=G(,TrYO]2))J-E%GjjIߐB=#8꿢EMN<$)-QwK>?~x`` 'w#w*LfNDnϚLɲe+WD7_M>+-[-nvΝ;yI$Z|Ӧŋcb"-_[$t$m?>ƍk_ l6;Ͽ--r͛o/PT"Y.=ǎ56x-_,!ɤ^?zݞnM6o޼e}iQqF^'x2&/G'%/}xϕaZSӱco;vh,)YXppxh'NUz}0>-+CN*+pNKM-YfCkW*,7im>:yM*[(!A XA517B@F -U^\NedBAr#mUUmm&655=}b 55]\U1W͍Q?{ Ƅ䜜dZֺ̦hyr[$+ Z_;Ģ6.!!=o`E"ɼ}aY[[YtIFCRRzzR2Nwtۜ#Lyz>{&FYj(q Q}QkLrAwOuUuuOLH'tXxqr2?5R-7ms7\,D)!zJmAoK$nGU{4u3ܸ!6vyi4/_WZuςtjsߟ/} ;X1~s5G]I=?VǎHOKI ?_w\UOw|zGg٩){o,Q)o4d+~]Qtk$z*˵w/^0o7&'MlDe'&h=[o7}o7iczd'E uu֡57lP)Hy {=M#N(5eIaaazAU"ڵ K\c{ڜN4# ;;T(j^yD|O\ըҨϜ@YTzfD쬮rq24V8Z Dʽ]#knv)H,)YQ3)CK$6+_KKcCg5icvt>_7b5ko;q6*T}>!#+%|L==}Ǝ{ J9r:.uBٽwfy=$hPȧNR\m3FNTbIobF]%& DL\$X^3?%-=22t[tG,y%;v-@@&MK:J:b95k5 u^:LՕ55}}ӳo~zt,K,M7mg8v8~?MeLw1 J DnX%LJoo`.`2v?~Ç>}~'G,..-ݶ}u2226a'} yf[N*]Ş+'~pbz:ݝ&H1|WETU^Pap8. )`Rg戄A7qa_4}"B!pسxOAmeǎ5O9>Sj8ݻoI Z6nxӄ8$I:IYԸ* ΑMLHO`c0͛;/TRL~͖ob)Yzcҥ ~}o|~wf'&hصŗa6ηѽBfݽPј}ls#?~zQRkזtJ+rY(\Uk?޻4gY, yF=Zg4V|gL:ΐHRJJVHI`\c">/::ňjb,FSQTlre)@f ӍܼE_.^tbݰaB6;jo4Eɬ :o}̙S';L+Wޝ0q|yee_Tē:XͮL!ˍ̐Ev5k i<{@FӤdf%&0ުP~t㏧-t/\hhHOo&m(40xrUeX{Upjo[@SFI Fo0&0YaWᩧmX2RImh;322ւE޷8v{#HBa8rIIÎ$Vqj"tIjeb.-Y_0ԉ27/o.ݿ|~K JU*2#=hR7o(1l#[[A]tE26F?pl١<!ƨɺ=jUIɎW9/{;w4իǏ}~_aWukz\<>7h̄8\ ϟpSSW$$F*YkOiW^>rˁΝ۶|oud+VNO5{H߻sј6%BTh\ۆnO3r6{~-+ 1WZZ/FniکnZv&+V>( *UF5S8!+)R 45UW]ɖ$%)`hbrkbGdjut}i)Cyg?СÇxFJԔ%kٳfzuڍᇿO~RQ!}o}v׮ͧ ''_&[^~o11[>׿Q>5e]Wf@Ǔ+N|SQ7!TCn]kVo禥>}ӿ]Ež}##dU!"%Kn-,$~\,\4|$wc+?7y~ɣGZW ׯѵk]?WIY!Baf0575vuY#d.W,Rt:tt%%[>0vnDB\DLYUuHԷ"5mmbQaڵ99*w񖝮 Ν3wJKYTo<lmmomٝNb Ji0|g$G]FR&KmjE@Qmz)(1I);KF2#'<ի-7yXAp4 5~EHzCd؜׾!x\RDQ?'tiB ˠ Z\Ua !`{@(a274 h2\!Lf rYͦnZXhQj榦. 9P"V*.ˋ7e o|= iK"6賲,sD( LFG9]&)&ܤ8I)(( LYe8L0`!ӡNGjΖ괤,bF!HL RFAj:E՜K i1EکE`'BG)U4F$664wuZ#N{t9>_rM1>%%-5!^ppަ Y/9ZV60h4[[>;K&?ۯ}g#y݆ ,]|[t?\~LuuwXjҥF@F e4 G5A.#`g험\Tcm^$URfx0h76)q=*%&$'gd$%K$\. |##!_ h4dQ)$7}̥Kw(.6Yjn9sцdŊm[ 4Tfl @ ;{R2oݡ+UE2b<sW4ZF>%z}Ff^^VN+ϕ{<99ǵk H.PZXc'ag}ɓǏ]fӤjk>wjkh4&K[|Fx*u 6^A`ԪĬl4"]m-c LO,V*S4B ;oܠ x @Th*җ鯔nPS붭MXYes~~Lkmhv:<$JtԴ nf n7wd2M&*B%\T yRKr6t0!!775U*/^se͎դegrk8I˗?Pn^6`*Y9k֔F[(/Nsf8jiĉ˗-59![C}EŅ Mv{(4pAc2+ ˖-_Nr6t mFVMMWW8^PPTtiNNB@`wuxFRv¦:Xh*+X7uLjZ~NinEiu:j @L ed5dfROWZaUܜ֔W(nhj0uu74֘L .rNjbIjJqѪU qmBd8qtssCɜ"OW׍ Bqc~~b?6ZER*8ѣ*+;LشThE&S](!~Ә .W$J6Dy,˽,WɑGhbUJ6>|c8#]&ߴϝ{8U⍷֧#b|G.\0fJ=T[vY=g4d-M6NH#GϟZF?޹譹p>~nsrJKSSD:4XƆ޾Ąet``4 (EQiL| pFLg&X,XZ|-o۸atm7vܹS**;λ;`0Sv ,!)>A. f-֡AK0(D`& TTIđH9[Je24 KAgL,-KB|SE=&c2IDB1>2$[JoJ,kr_xMXhuxiS?l F{ptɏ/)$J472Qˢat6[,IJ& ^\VV^R_f 'B?@(p(D CA#G{o_t$*q{sY;00ds<_L@0vk+r.\.{wQΜ9royIf6dgɤw:7|h: ˝nIt$O.u74(pGklU!S$br;A mlr@(LK[4/O7Ղ0sp#T2;LIZ5͒oUaޚvFG=px\.Idb )e_~}fTzm:b%xuvvF梼?0 uc7nZiɤ . M ɻ02iZZɊU2Ǜ<*p>%$uzVy+\.~k)7ED2r{Ժ'EŤP ; ujqi4P" r8Lf(~:;::VNSȓS0MIMƍM #\[[f?NՆBvrirr/_$9I*y+b&S 1u:$܆tۛ[;L=}ZX P(#SEd X&-&&&%Ũg;9H+JIzw4776md dc$sV|>jƴ4V$$ϘMgK"V &[jL==Vd))i2H_0Ӊc2Hk0,58c6w<4r.gpnpƉ˙_ s>1;e~,67SS#, 11b1:;-NG^˒¢8LX`H*)WBb%E$ ?<?`8ɜ`rBLMIIHN"d/]]55'O]`斖h&~Cz:LeeBQAڇrsԪwoȭ_40hw8>ˤ1j2l{tT6J8t^pS*]d쉛xB[Ɔhp eؘĤI6㍤Li0 RLQn)sk#%!QĈ-YV60h4[[>;K&Y:"hnl 9[۪ZZ<^,!>99;;% N` 3 \'ZgJVVr ;=mmm.]`g,_tibX*9S`FA4_\NtN{bj@IId潸6<"(.,LJ2VhbEPLŋvLinjmu Ddxj8U'y-BѥK._nkiktưp- . t:^ $;,=z~m= V'62d r^O!ؘDD=dqb;[.380d;\n`0d2V  .a߅sP 84: x\4 ֿS)-ڲy.VHUtEӦ%%ed' ֞=<] dPmfGL2҄N<7:…?t&&{jQ_4A›bgi4G&?3I= ܣa-&&99-MSrD$8&>h $.0vDL02B!h6l69I fZ'%Tf:ğ>Q)Ujiu#:Bkjvk2'p Mm6[(HMᏤ)_}ήÇ_}?z}5>~ժun]PF"e|>??:f? P(l:yjfua^ m4 ?"E( `i>롄oR e*mZ/;ٴQ>\bZ@l:Wλ>e$q9pMFR'.7)aR=< xM-)LEFٴ ZzA ;`PX4 a*?grwHCQE%S6jreR/C&Ue:cuʩ.Zetl8t{go٬x˗qa;=܁ͷ=tN+ۀZ3~чW㛛:sK:]FFQnʔJ'Oz*+{}Ǐ_kmux%Km{챝; cc&݌RÎ=}aٲ{@eEccV+_~/}1??wQ({K/Dz|_} /^yo8v7;W~)|~PIO]Qßr۶<ߎl"ꓧN/?{{`fzl,..5hǎGߺu"jz{z+*{}'N\32b)I>hq6۵G:;Ʉ7LKO_GōSS_lwo~vm'-'N\8__o6[,^ߝ;s 17o!%> {?M# )s:Q+XSO5NXwJ򲲲37z{PǗjR$z=YYyKLF~˖u7VmmΝ<$-_i11T:$vĉ'Opu71qŊK7^]P`0fӅ ".\p8㋋y/G'%/}xϕaZSӱco;vh,)YX!ǍxluuO/(,YYR0//3+33!A&V:h22=/45d۷??Ox?}뭶vb-[vظ(-Mp:\9s֬Y63S*_ @?}+|~A [lܴzEXBz/&&.Z ~=|ΜXkq23WZvkfzعPh`cǪ*SR֮[*%W5qVjUpG,^D 5t85lz R"4Egw G|#gu IDATkk8x,[nǎwn(S7 Flƍ|GǓ0yy'&q?G:tb*ҹ>39_ªrحWzZJPh}_mss7mQ3Ԕ=7V3bI$1:R)^RgT7} Fa7oٓ0>&;+-/Zͯ+**;n5&SE@&[Q슢[{xq伪]{zEEeɼ}{19$mԾޡCfV^?n7߼B6"Ƕοj9=t^{o *~o{bulI^t\+Pݰo5qo\?v$~^ !IBcըҨϜ@YTzf6i wۻG?/lٚX.^?_-+);,VB%+t#|-׮66|:CFVJ y'L!)I{zzo/& FB'*2Er:t:]ѼSp8!FMg8αkomv9HM_DL|.sw9zҍ^orjIɊS_9_7=Uof-؅&tnxLCm:?ϖXb85k5T >?6&+k͚=V޴}?+8ǎ5(~ꩴԅ.H`|>}o}gǯYb41=Țs?pJYDU #r?+vG~J=vãÎr,̧[̭iv֝Xn}۷?~k0]j$vlCdu:]"{}0u/5 3NP{PeLޅanKNNP)Lj{2C$JO_jɃ#wK@;`0fͷH)x BVߘLa_zt;?ȡD 0w>G%%vmK7T B.Uկ;-ilv1L/b&郹stt-hܼ韾K%%:͖cw;%fU&cѢw^*/7-5!^RI$<A[S4zk3NSSn"LNSLͧdqgsk4R! 2ccC+*jj\r7ޕ p3T &s>> IQHDM~&~&LW?oϧ4K?hT-JHĪ2@@&147WV:ylsLvi&JziEEK*UUOo+|xEf;u'O9ݥk4;\{?.ڵˋTjd*?>LtaXRIVΚw}MX$1Q$x\>uֶ`FS&Vl߱jS~g^6,Zc2eg"( B11'9Ssoqh57/Zt7W~pxgg#=hmmh`wZh9_z H, ˗[rs q:R)b@T厢Ƙ̭6j4ʐu )-Z䓻wE5׮?wpyАRJ$/[/}oM˗~Nc=`O>uu4Tզ.YvϞ5FGL=l٦Myy^梁C| al\lrR~OEEq jwG|Ͽ{?}طodFHKnZXHmNqWo7?wO**~ݺڕ|onZg k $@ނ(b-C@ANmkWUkoZm ­N炊}W|ymqc[F;SLJ"a`k-ݻo={N5/<א!|(Z۠RsV!'޼]WZ*%usСV O3*huH0) E"4< W)wk^Q1)U[to_(B)rRzEڦ\"f@%˖1* 7'Ih29dRRDBH$ԒK9Sa$ ˔@A 6= =a>Q0hSSϞzus􌏏LbBS&9s**x)&ǚߟ1#**4t@ 7Wۯ_g6(LOgqSU׮]|jjjaAKP!P*ګڒ+W:x()@DǠ+t-{9o[QQ>ӧp߮ޛ8ɩh?=y}Rx&vc`RQO!^"4KP,d N6:;FF8;wmg:ߺ]W RkrO%l߱}B܌g  CSxhrbb~qϞaþjGHP!"bɢ͛ړ1}oy# FZԄ׊ź=EZX89:t:ֵ}[`4 x5 ްw_~yz +V9ߟl[CJN9xhÆ[O%\[QTqk`qӞ5G$d3Gx+j'NZѠA;wsLjji7?}}lJeqٳo=t̬FeQL3Ą,55?C '/&UW+L&_ =yjTT~hP9}Wde3"cnnRa|ktɒhi7v-T*qӦEEiwsUKݱK33 Z>_&uv1i Gs>-0bifƑ#g ZֶOIO6LhwPLLsgSSsZZ8+tSFFxwlӮ_MqɁ+XzĈE.]:]ssJ?k7IIvt+ kͽNАpj 6d}A8x/,ٳG"y뭯=۰i]ScԨiIe'NN˫P(~=~ gf;k_Nz5703ll||_|qL+=wVKǖ/XW[s}@9xy{WcxΟO&}%%C%%Qqr8Q,C_{}b:m?']ǨΟ1sKY"6-V[VvC7o  #F25)G޽w߯N_᭝Oիo ' 0|ĉ!B3TbunV\U|J9p' ^Yq11?9s>d~\Y)(y3-Eut:D,p4ʊqq֮?ʢKkoV+27ooݻk\]""FE͚5z P_vOiRiWTKH,442rĈ3ʊ7ٳg׮ի>jܥKgr ]pñU]9bԨ3FF569˗gfNp6cyu?b۶0 ,<p`׮mV|uF|r䌙#Uq*Yb6{;$T,n jtڐJž=fKZsƃ|}%-mMԨ}9PzekOm#g=?2;Ҳ#GXjΝuޑQQ3gXY6ԗS(bK={XO}4Ǻޒ9B,XQTի ?g:y2zK/N䒕cǦW.y/uug0 {{2w@ɺ 8wH G'?qqg ɀscc͑'L\7#[[ׇD˖޿z-8W:]-!&믏ogrt$c-ڲE\xΜ+kɹuE6o>xReUhbYJεAK%af0f ޽#G{MMNR Δ)}c e72Fq]45]RBkg<:0i;JO=qZzXW[t\><|^ނ?LIkϪ˗t4Xk  Pz4=4_sw;l\.YPi) }o~Px<ТJezkJ1..lRhq߶NN2EwZQQI1هSSSTn%khhKRefv!jWɓ$;`lSfaζ`?8$(a]9J!B=-Mv6-0m- >?@$|bRjJ~F3UgP=yU>Fn#)ԦƖl_[̬>|G5Zw\fl%:]klmn:grrLMoKY}xKv\_s?+/vm]uDIJe;c֯:Ԅy֭φ ?&>Ɯ֭uE0wxc:#P0Fa54BCc w uVRӶnpܹ[ܭ燆2.eWhu+)9eƆ֨Mb˶᢮^y"OTFݢhQ*Vju]-9v&S$27srƶP$ -(VxHuwk'/h{TJɢ~'>h8w s+!WҵkPʰaS =qr{56=/*ɱ<#;vt=f1?v46vCD, =*z0w ڝ{q}xִڢد\''Z2"|ΜFf͚3gK?a5^߾ ;Q &RjH1LAc<)Mt >^Q(:ju^~ozŁTZP#N B Vwo.q_&&}hjuuMeem阈;GiY,k _RU*6 W*++6n6Էv(ω3'mch ]M;[ dНkkqѳ*+Y,KJ^}"".tiVkF_21i3)Sjk/_Nr*o_++dQtzv{A3/mӜjсFߺLbɌS\V[V~ʹٹ4Z~o5aBpWo:]eegX,GGW7{; uǏ 4٩c&5juEe:]IHڒҤ Ln ue0]I}vl'obHt%sa<c]iɮҒ{OK{{zy#Fּy93gL2Tb55?}/GM {Ր`6~z0 M4,"̜Q^ۆڸΜplÆ Əwq~4_뤉 .~ؘC۴̙[)G(\]>G03rN1gIM۶9rMII4*/9;M?vŤ}q,3ޮ9a{{O2wh[% oС'77Ĩ=y/ŲZO:rd۶G++ꚛh4.W,wޚ0!4}߮߳-suNJ>?,[11vYsЏ?64rgg_߉V|gts}a-o:HauH0)hx걷#3&^]"f@%˖1I-zh;e=m{T=\ O7MM @hABC=Fޓ8Ogx JM gFw55RacF cOيce0 QUd\2)'O"Cxtzhx==.krr+*T*qӦEE T=kC._*.nld\\5jʔ1cML:qoWNA vس2 ?($$+}{ lݺh/oݪoY_|`! Te.ٻc.ffTUi|L1bѣY[¨ |ŏ?~y__Vjl1rt43ȑ3ZokۧOpӧ&;x(&&nﹳyee--L:dS##<;#yt)/#GJ8y1)=Z`2%S355FT~p似 ÕH]ƍܨQ>>"!q~#.~}{ϟKK//onf2wI>"Յ6vzG$^RS3)>)֓XҵtUUo>|ȱc7n(aaCB RrZ%&nSRŭ\11NNaƏg+QܶR;%^<SRTJ|_ࠠ~>>}<=lYZVWp&1to;# 2pX嚘դ|ٿ=#B]\f/SSY~}ٙgnaSjo/_*x +k'Nw)Tk!C섄}Gee;8p8mko$:t`yD̳AAIKښpWP(}}o#Ǐ_Laxz:VrdDdHH~<2rsp AkR\YzNzhp.HAktUGJn):"bO>jǧG'?qqg )vW4e}:kV`MTdݏ{&$72ʲmT2q??xc NNkJ%Her[e{\M<won\>aⲏ1ں-Tӷ-ǽ{Zp+ 5io%,<_}x;$^^JQE[ϙѱ^NέK.ZyK*BCT@?{_lظxwkΜ9{&7/:٩cI7V>nnlNe?x̹QQrGMkhx)6&&&%Y,;e!3hP`[εq` zI30ӏe0::?+=5;G4Q3_KMU*mlGqqaJE5t[[''vDpN{hJvB-ܤiijiVVןJ ]|1)5%@ھ׮Ԅd7U>Fn#)ԦƖeI=ZS7o4446% a{35I嶭FK:_WW߻Պ͖" *-%xYy͛ Lkh箟k(xɡP?|1I"0i_xV(F=Cwa%to{hqŊK,[6n\0Hg-OƏchSRV|upuU1ŗz;8e'\]`}in^믯_4hO?4Z7ʕ_~ywޚ5O75׍Ik泃rm67$ڲ嗟mqe>9nG_#?1q_\ܾ3ׯgUW3M<=>3E?wRǯ^⫘r48xxĸqAjkSRNߙȯII\ zl>4zaљĄ--lg7w{; 5#Grrl2#tٳ%%|~>}mlzח&sgsi~'L`/<EcKjs8vZmFgΔk=׆zpS 1" 8sևK?N4H*1< p>tzN6|pGϐtzaj4i C>ԣxi+OAС-U܄w~Y}~*ak_R3fT%RUW祧 ,CBz@ZF 9~l͚oW\PҒB)/vݻT)^z9*ݭ |Rsi2qfֱvıWsJKkk[Z 33':g'3iEŝoǠ ,At>Zmv}d|BaWC|,fgnal߆֓qf^yeժ7FWSڰaS ׮^WJս^WMF(*>s&6vÇ\.*g0D"'(TAW$%[֛kמ;Gg|K>>]Ƴbذ 3t||KKnnVVaE'vr sw}.FJޕGfېOްAnRG4zVVEF(/mp0Ix+vv={q_iT뤉 .~ؘC۴̙[)G(\]>G03 Ez 6$$47VV#,xcNxC{G;}Ɯ&Q6mvȁ6%%Ѩ0_XC66*ڒܽn޳?X_IWdz2_?×w6kcjm9`@XxxرϿEV_|]۶ƍxuv 9r̈tzeŵd;_ePjP* oLKjGG9"--d\ܾkh%c1RIXnj|_cwnxac`ڽiu`=7GsYYhhd3f37o=gϮ]W}YUܹKΚCfcБQ]/Ȑ||ÇO"4JeNN7YCgڐzW*cN66}_?p &W|U_?gǟ̞ݯam|;)SFtʊܼ3ejzJҲ#GXjΝuޑQQ3gXY6ԗS(bKWQ|W_U]9bԨ3FF569˗gfNp6K?,,<":$Qg2kS޽{_=[Cc=[7pb+6o./4g?^ #,w+2$-6nsȋ| 4%ZΝ;|捡C##aHc\Wݹܼ{Ik]]1*j֬cx<=~NJإ_'tjuMm~~zzj\qԨ[g_~ tڐ!Czx0LPk P(ܭ i4 X,3磴N?L{[sd)7& &zt&&VV'N7n]T*8p7 4:m_[gDмg^~Rf\gٳ{?,z_/I8OgMS&J5v"_}mjh4kKaD[e2Ţ~ƍ3sm3tT6l cƐPݛ8r_tpHHشq*uȐyLq9]O:!}vw/e+;=HO#3T*w^hFONim F}'t˻"dz8@Bq:ڎW">|Μy&Ntp>ʲ;wׅ]qqy2ٸ-{WO___??L%ff>++nYe$[?lHnc+r:ijryT 6؇J2s4NP4)5`24ڽ411!m*OVO|[[D 'ŰlNR\&z4)Hc;K~3<ԃ&'N4'D{iȐpڸQ[NC)a;6?oW_~>q>ŗƏwwc2IuI;ӞRٞ-euAAO}sfl%:ݍ11knzŋY EW:> [^E [/%yH3g>{wJuZzZ>xpPPgW#A1Mq:\u~`apUڨEn566;Gb=*zQQvQU&i QZ~QTـLLLY&޴F@ʝ@ 0EѣLq 5%%4 6uz'w_cC`󢢜 VTΤiKY:7{{;ǎƮ]{Ş1l]?%WRw# ד9Wc\Z_ڝ+xId;۹3v4ʝ#Qn_ӌ+ hŢY)Z-B!yѰްadJQ X[FJ;)Y٤>;57RQZZJKTj[brJvνp%Ű/WR Hy_qv"' RH"^1#)zs u7={p(Ǐ'"B*限fgIǻNj2%gWc! 126/?9wںyyjK.1B&QOJmBGZE5uEBƮ],Ya~R,Nfb;a)a6jJ|ZZzZm]dZp|PYTikkbҶް3N֞Ы(nt|Ӄ{>g7߄߾Խ׺s_O+fzO+'4vDҒ؜ܢB2^&nHp>x iܫf[pT*Zx\WݽX,GGW7۷ 4٩ckty c؛2)9{~߾2gS>\Sڞ22/&>~Ϟ#OM0`dU'~Cke~'-F݄Ӥxf7]$ZhD=%~ _~]5"эewRVw=1vR*Sv^9 ^*9*UEyx IDATFzӧML]] :[珳> Tfk+R{<y'!*ɴ5k_W\n8CkG>vt͚| Ç/U'FBuVke`W`oPddd&7ƹYEEŷ^fVVV<>UQ_\RWhE5dZ][ST`t:'يEd'**$d„!C.\#?k^^"Bs&v+,x{[ ['6as8vU5)>)La=t#c~m"Ȩ ##j萙Ϗ{1i;w~_ njDI:ޕN&,ŲZO:rd۶G++ꚛh4.W,wޚ0!4Đ;3珯>4,"̜Q^ۆڸΜplÆ Əwq~4Oׯxok텋g)G΄}~ݐ ryӧObox؃]ZsƑG*N.h;[q>h٘ؿ|wT}};f۶U\5LR,iB`jz:M t-%ׯ_pjaBJ6vv<'6JU(몫ˊ\.,*,,xy د̌v>+;)ܹylMMi4FliijnjThQ*/̪Ӆ2Tbg'8,Q[ZHkk)T[WQtƜ+]+*$>>2)1!m9W\zƕ+nn|^ EQajJFFmkP38:pwv^W/]V("^^rvEs5Y95L\J;*Bfm`7gf~ڐ HCCcVˠqXէ23##x V[]UZR^Tr862~LM%vVie%eUL*6K=aRJUyE^nQIcB.riF42ɑ̘bL}Tgdd痕56fY11a,}0hSSrskjJ˵H<<\\$\n[-u'.(2Ԍ& E"7ں餤 kg  oo…SR}CC|}2{LgpU0=QT**Ōq9By s3*EPT*-up/,:>+SO,̗Xˤ2KEB.iuƦںzAydב66^|BZR%9:8;{y ,8:]jllmz*61iߣV?eeikWWwL0YiiW;T|ʲdύgԚYYʤl[&L71L5UPXZVRR] o (e%5te~bU TUyNYZ -ҲrWWPbmbr‚fSS+KkkPn+ef4+LHleMF`d89[ld FcDB>}_ ;+##%%)^ ԄɤөT*su tq&3ol2Tbc#gd䔖ֹq95lTNzQcJUR|Zn^]ZMcSaэVEjI,=ˋNf 53oCLeRWR<9Դ斞{)RlgQjȞ @$h Ņ5wkA&He6B DpdRc7Uet`Y_͛g&dVBss&Snl(/*"66LlrnVפ$tͲ[EbkfTTƆ⢼ªjS;ہx[!qunnp쬋OI"fAꪪJҪo_OugOeUFƵkEPDjdfb1MssuUQaaa]=n!<i7doG e\t!IuqqvXXPԵŲ -:H*993S1:8x`Σ(Aql  rrrKK22 U*Ą"'|},9RR[͍(.*)(,*(${PMM9%A*h\@>_"-)&sdfeeդF,cn&ZYIe0XlK.,KMkn&RLRnkӞŦc켼7SRJ2>2 -$NdMg)abbe)Y/_)-;:IٝLлPW&%$KEfHAkAn)c#'NBCa `QICtFa54C30|!:R020Nn/h&xRUTvc`Y `Q0 QF0 (FA(a `Q0 QF0 (FA(a `Q0 QF0 (FA(a `Q0 QF0 (FA(a `Q0 QF0 (FAwUIB6{ CHZ{Pk{޶֫ڡ^kmV^[m׭(jDv;0?/תu=89wy!DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 @ DF"Q(Ad 2 _F` IDAT@ DF"Q(Ad 2 @ DF"Q(Ad 2 @ HSvnNFZv z(Ad 2 @ +VԁHate3H8E!#e`эw';7uQG2 JZ65nY88'NFc&U~Te4{:W|X㤪jo=]{uGd/Yܹt0ٳ8+%6>ܹ˗^|q溺hc4~Ȅo~vС'# plQSSWWUuV>s4&{nٸ\v[өS{_qr=`~ͿC68\qK/ҠE38cbJJnݻ^>ۯ+RRfv襤hKWW /lt ]6(Ea MWx}ߘy!KFܖ-6xx#GvҮ]޻rV,Ӯv޼p /mz].>O8߽nY?OOJk?tؔ[n{C^vl۞ӟ'gNʫw;wYs޹ۧ?؝{Piimۤqo>eWޝ[]UU6iRU]W7q]H{oi'0_6n*)y=8|`=n3b-״AJJNM7).*.yjrl.-_zX,Ztec]tE$7Ko֥ȑ#G9e);v|k_7ۖpKnڼ5?K6cҼQi<ꤦ&*յPW5&{/!'?=?asO9墋rwJK5z֭;pAAg}# lPWץ̙\{53ft1{v啷޼gϙSӫzfq)󪫯z[O9k_ڿ)*>b3V]6#g#Gh׶gϞb>$h$999)>>)))9Qb%%;w.YK/d5[rr(.LHHKkժmێzM7͚5p@Ӧ**r>/_R]ݩ~߯;wQ5Yr瞋'&-댉Vၚ=RSǍϞ|[ߜsCg}}AU˖nڼyfU+Wڛ?}zΙDƶS>jrĉg87oܸqCv3:ꋋ22dhRWTxo93dOޞUҒyOMeKK#;wѲe\\EEᑃrl޵X z~ZOg6撛o~uΚ5iwկ{͏ضhz(Ѥ K++jj |c=XpA޳hqIIǎFti٩S۵?Rgֵk.;{/~U.ⷾ3g΄;6mdž޺XwKJ ;_ߴOiG2 ebS[[VC6\sv箊Kٶ۴җ^yy<H6&tlѢ_6+(XjZ:ᄯ^~g Zz}ӧǔw?PfWW~w䫿ĕl/;_=I}MlZ+.). 4x+/ fu=ωzu=~s W_5k:TTTZnno/s}-Yu%Wo֬c;d$&F0aɓƟw=؃Χ{gw{}׺_/9[32f|;%ƶmI~Q|7mƌ2S7OOofƂ蘜Իw||MMrkּҵ?9Թsc?ppŊvlbذs?׷A뗘GG?N:uL3=O(F4h={+w%+Iܑ#G4oR\R\ߟi¤&/ZrwٺuNJf'5xSQ~3O?M͛qw5kΙ{aЏ~c ;wz˓Ol0m)1``Ϟ;lWZ:lXn-[MFMPt44FORSk,--9qÇˣ9b몼VV[sm,}.3&}ӦM{w~Vׄ ۧiBgqjǷQWuÏGUY1$+kkϿ v>\SӼYff~c8O:o|r߿}~oLjj6n斛׬4߸Y LJ=WRxm?+9Z Ú5.[U'O^' z{WTW bI=[O>Y[שCN3̞3?[/[K3-xS=+^ˋ^[2'gރJLl٪c޽Ǝ9Ο:uvm8vH3AN۷7>\]ֱc'1 M2mo5{+rrHLl*3oߓO>/4wcTۿlٓO<_^f䌌޽G:s1cȌ,'?<̲es]|Ϟ .83'Oh<--5ukҤhKqwnQQy\\bb[}=J'WW7աC}vl߾Uw~55[Zn]iI۶'8v\!QyO>yĈ-VZb횜1'N{,)*^nӳ|~f韎DPA>sJK{/|渱gOeۼo-h σ~~s>i_vWY7hPfSmڴwUFev>L^|V12(QIO8p޽Yj]G->;;!aР)S./͚uY5Mؼ~s/~חuAv}7ꄶmKK׭[S]֟wOVn4n'_N27= 2}ݻǎ)v5o׾]wڸi];~~SH8pp=UU)]mޏ>ޓqc溺=NY^xsD{sԝ{;ws΍.gYXx#?؎m-ZuY_9g{ };c޼={ߺ vpm.(-S;K/~Ǝ޽Yhuݤ\S--[{ysկ]rTU-]z=|pڲO76`Ӧ#]>POmmjZRұuGS^٩kVfiգG. ߽} UUksNK<ξt„M?Ep8OY{'2qu>|}UU7Ι=u5.Z%~~…;xDFj"-mЀΝǍ[ȑ?<:59y_~QwO,go+j9t_"ʱԬÆ?G!ɓL1qW.7=G7'ڭ{R?_|q%K1))Ӳѳf}ǎ~ :hP?n_t]MڥghHi9_egMw^RR{]tܼ3|Nn3.+[ǟxbmgۿMM >佊.H6KG bMF۷I]]QqYimmGק&&ť&&6|LPIG% ))i>>\R9]foOEEyIEu},!]rY·DRRZzZZ4Rz^or,ٻjeUV6k6vlGǧ}NSs4 ^UU5mMJ**ٴl޼z;>s7PYo;~mŋپ}̘-/V~#t0}ZviiݲϣN޷/9cǖ-*ؒs얳u_~RRmD'ZfC.xZdӣ|'7޽u7;/:g;ztffY#RVW(kqɺu99iiÇӷޟn4*,|gVV0FxꣀBqNׯ_3K=23߿7_Gݧ8y3 {b>-Z>J$jkmxE)-^>TYYT >X k}vh(bщ?-[?zxHLLNMj_[_^^VVYq.jj*+RӚu+6Mw>}s'z{y>/8?+Fܼm;*+ڪEbb{i\ZPP]gΝ˖dvNI2zŒ zʳϾRWkw+ﯫ++[nYnd$ak4qi0qq-Zl٢et*@UueyMm4a8GqN8a̘n>+nпWܺ5:ed^=îPQy-tM?8[ַĭ[nm]]>?h4ټy/[ns'OW]޻A]]ݧO~M7\jnۺ]N]Svٲ;f>V`pklٵ`tHEyee]mb|u'4Mx[M IR}\7)(.**N0ٺѿ9ț0!Ogյ[VF;xN4a¨Qwھ;N8lX9QNirO6.=p(nؙ_XЃ/vmtJ}IÇw|~mݪCnjIXNy'ݹ{bulx{?zt:v%_r;x챻|юW\q}OQTxi9W{bӦ얛{?%ӦU-Zt ۶ :xDOؾݱ}gVɩ,,\m[6F8[{9}{=9&Ab^߰~7z.?G?Z?=)'_ve_莝MoݾmĈ3g|f믻=|?OMKo>}6lX⥗'OsV-æy{^x_rK/%{Shۮu6[Vd{걿]ʛWozX,:mrRJ]gjڴNLQdocɇeذ۴/\4|/nëW.7gxΕW4^Uf2ZNK=sQէw<{݋/}ۢuV^'itzŽ6kr1c^nUVfoߞq 'w?mI,^xq]]֭4SRR ;'z*+뎻Ms9蒲mٲeSBA YnN:<9% 1%_Ӧzr̪ʵky$z>o_b[b&CNv'4xp^ݲ:ulۦyuP>$-kVVK/ !GRRz׿[hqŋ館ztLmZ_Qߗ_zih?v>W\qک7O\pao㏺fÇOrW|{w+55,]CӒ%L9sRRžcRbV)//|2'آT SEnG|E>w!=G#22&M~䡥Kw2w.o"1C }>[RR6m̚-9O _-)6g=xp ))i־pŊC[3fݣb_?ɒ-w|UUE))^=3vgdL6_f=`@wr&M*w\dѢ͛*+ڴ+sVIISS8 1M=y/ >ܱ)^pI={~}G}$5uo>زE-/^Ï< w-:Aib;wyǨsTIDATw54iRZRZߡcU WU=z̻LZէ_֭XzQ -Z./ȑҒҒCn{nX:uܺז-[vÇmjjٵkڿ'[p]mfQ ָ`񱑰tC;4~„}[4Rw,^۷5o1j i.:yvIyyKkYwO|B~oklۺz%KٓڧO׮т;PUaÂ6m*)INn<-ib}ʂMc22viӦqx-eUU1ztuGŎ0Voժg>}5ۓl+W׬+)b(++(عs%K_߾Y _Ҝ9ӧ&E[,hQnn6O8۵;vԔNU]~+ҥڶ>bΝSSQ89]'!tnLNoq-9%}j{ۿkaßt}?-m>[<ڣ7kt茳//|rf7O9&Z-Znڴh+ 濒b- 1<++-سOLl'7yy]N|ᅧڭ[JvF3=~qV0hUU fǎgyٔsfn7lGUVEV[Zli\Ï?{ڴ߹"aEkAKOyذq㆏LI-)>x`͛W^tѢ7lؾ}ޢ#qq?p`ݺuw?maBAAhAH6nc3wpEof4Y0n 4 0B_b;yB =<=y=i.wIa[`azzllhh``ppXNؤiOM܀54ybFXZp4W#L8.ұշJ_65"J"V^R]P_Oʋv0lCDF2B;2H8`O#/hIݬ1 -nU|akDg{0v9o@PARvd.<"I( |"c:מЦhhXY HUk rd$Yr^ M1R@@4aoF iS#9C~ {YbdzTXtRaw profile type iptcx=J10 ^O @u?Ö7Ȍቦ#Fqt(=a V,/VoViTXtXML:com.adobe.xmp Joël Krähemann <jkraehemann@gmail.com> Joël Krähemann <jkraehemann@gmail.com> Copyright (C) 2005-2019 Joël Krähemann, GNU Free Documentation License version 1.3 or later ՜ iCCPsRGBheX]}nXEw/[:.QTZBD)EQPAA L@Qpt_oH?GLDD:𻺹c0?.Z tOg3G#G5 08< "2`89 "`'G=Oñ{q?oO3['!!$0C! Q!D vx > H$$ @r<)A*iBZC1dA%d Bv\ 7򄼡/BP CPA P" Ҡ (ʆr|0TB **JTAPtjZuBPCנ 4 @1.4M@4 =BsshZ^CK[hZ>@W;?. `F`L0 faN`!X%`)XaeX ր`X6a3ma{v]aw }8>p4 'Ip gp.|.c .+jF>_/e0<wqs%= 7-xށ"` E$AG#~B@H!d%*BE fK pF!<>?D "D ItD"(@!'e*D 4шhA!:ˈ>Uub1@.F+5zt#ݎB#1}CczB Ð0T + Çƈc1Fc1Xc1w`1LLs S``0111W0171cqCc3K #+fEbqXercXI,V bͰX  †a ؃Ll[-Vag-vl;ƎbDZϰevC8cqb8)_/ƗOM6|'?/! T; L  })Hp#hB"!C( Մ3fB;O$&O 75g7"b$" O%JjD1ђhOt!zhb"1K,$'VkgK^qx8I|B|A|M\%7I K"$.I$CR&i Hf$[>'ɏtEJ$rI RF"]! FIIӤgE;Gw6"cd2E$3Ȳd6وlA'}Apr 9\@.&km.r?yz4=M?B/^ }>GE_o"X4VVQVYVUV=VsVVwVp CYXXX/f}uu+6FcaeeScg`sdd ddKbb+d+aekbvm4 eOl[NebfaWec7gw`dddObf?^^~}>c/"+CCØÆÕ×###0IjF+3/9q|Dp8Y99%899M8899#889pql|s/KKKˈˆ˕ˏ+++kk!3%O\[7V6>ȝ]]}&}'܋k?wy|'UVEOHBHYH_JU_(J!BuBB=BCB Z%fVvN>)\+*#<$|_xVxIx]x[-Ba(XDi-2%2/"](AMTHTVTSTQG4L4I4Ohhh1]L@LZL]DA[,T,Q,WXXXذ؄3b_vBfN#S ~EK5M̠0 %>Úf1G͌nc1xؕ HKKKHXHHHHKh蒸!1.1+,UbW/&),)/#i)*(+)yTdd3wߥ )D\R.HKJMK-J}ږHӤeͥc3OI7K_)=)BzMzS),+#%.c*$+%&sDRI[fX UMY,,>Y?h "S-=#S/e?Cd,rNȝk*wGܒW$yNyqyy#yiG{G?o+`Xl<BR++SRRx0^"Z((hxH\b_J%V%a%E%}%[%opTB*f^[JJ>+(9ʪ&NʱYǕە))(o UXTTTtUlT  m k O0T#55jjhlj5"JF9'54;5545?kjx<µҴj.h]z^6NCm]]ݢ}EFMGLGUTE'X'INN;::+:[]6]1]U]S]`d*V~ݻtt8$4,Rj={IoWϫ/o_?Z?[Yn[3? PtQSdBj6 v Ɇ|zec+?pFFFFVF^FFF'Ff6lƝ7LLMM,L19eW,YdגRRe1z.[O,W,Y᭸d ڭXF[sXKZk[ZZY[WZn=i ҆͆aicmckgSasf͢7[--VvmmmmuI׶vvvvvv~v v:qN)Goگq8:(9:;D8d9849;wXptdud8j9:9&888^tqqۉdTti>>}t ܗh}]Foי,l|ʹyy ɅE%%ǥu)%-W+kkkk5I7n87797#7W0LRknno6qsou/x_oAbs|_n 7wH  (h  x t L, l 8D  r J* j 4L v  . ><8x-o-D"D7d_HhHVHEȅ!OC>>`x@䁼\:0zŁ/PPPPиWa000a'šîM%s«/%aQ1)Yy+Y(twbyĨQ碮FMEډf֋v΋##cS33U5M={-Qj8888qqy5_o%DrN%t&IXHL$% 'j&:$&f'V%^JDLNLrH MNJLLJIJvJKINJ*g %E,E'9%2%?.'e"e)A 9Xx` -U64'5189u0iz*'M9:-0-=<#m4m>G:1]8]+)=<=/6'A ztqWFBƱLLL̻2e1g1ܳbdz1͓m]ݙ}7ujDaGN|ќ9s15=r+kϻ2o3/_ߘ#iCC49 ?+sV:l}8pS?|x@ bWۅ,R&>Ʌ' /.\(:tD#G9d"JxAGQBQqQkHыG zM8zhёG7Q1rd'9^-,*q)))*i..y^R(5*.M.--([O[|UYPYvYMY_TهrT9f#M7*(>++:++VJJJʰC O+VĪ J:V-U8tTSgN zzk5Zڠڻ:RxP]ZPQSPX3TfVִֿ6TmoT:L`v[]|݉ ucuovNsV:mw:gO~~z^ެ޿>~~ 3gϔO<8o||Fnh3m hjk6 /^8sƅiro/`Pp8qcc"sQ%/]v }I%K.^)iؙYyyVKˮ+HWkhR7vN.~2e~.>B )i3-[~o5|kmZ=nޮ}QQ} eGG1ɍٍE8`;wvޝػwM=tݷP {ܽ[ތ ϼ_|''&v>y NMNLfNOM.N}PY<4%0e073uv##GF?jz44fZlt:d`3c333)=y\OhO8?IzRɳ'O9j>|ӡ`V``6oivlve;ǘ ;:1793g➕=}5{\0aGA ?|''O?tuzz;?~\߾п}կ2_:uMٷoߺ=;w~>*?hqaCva#qƍWMMͨ͒;g;[[F[![G:f~r϶?R+Wӯ{>n3m+mnmپ[ߵ/c'ϩ?7A0vwbw*v,»bQe_#{/=Z IDATxXTg?9gPC:" 5f$fw{onb6Mb *E 30?LhMb̜s9{źA6H<,ٮoMC6nft\K%\~[dKO# cds#Ivf;׬?NWخƓ <=CC' cO#;m_ {q&?* /-jۧWpn'9ibsشk?i61[NZmc{Ϋ(鶘ͦiLFWfƀ+1;.VUWw?.44C~cٜhjj߾=gs6۵[Zh^^ѓ&Fh0LrmgN%ᑪ06K=5 :}\̸qn ]VFI={(S%r PNJ$zzrV^ժ;M&T ?á75((v(Άoc*Q{ f#*fᢇ^(*dz 2zco@e\ԗl6bۯa(vVfHGGɓ}Ғ~-_3}|;:/^(mnh:||ccS"kq/?i.2zΜ {zϞ=WZWFa=<~)3Bb6ꫴXzz .V W1IR6-<9ݮ345;wtiImm{kObr=ž)))B8]55.tIhZ7iҴia*6F:`ly;fs}{n:zMޜT- V4橲X;N޶mޞrffX1/;6 (o?F\P1nrQQII*=-.N&h4Pc-'ϕ۫SL2n\DS^~hyMON^9()hh補-fwK=`ZZPUmݺ3=9G.Ɩڻ`W6z+08s'N4ϜlnX͙lYad 3t03 H0, /h665 1QѢa: ~d$(9~mKsUod.yݐĞAgNu5֛ -͝]6[pP+Hz7575 ϋ"#|rUՙ3J/_Z8Pl~yۙfrm]׺B4lBѮӱX|֫p!gPnRBڎ4vtLݷlYR>6IC khMtwX7@& oo͑ܡhPp"51iѢE b4r0#)(H2.N.rkn6}/bK}mQo2T#%]'e1ӔݾxsP r8<>s̖+ȪCWEΕJ^ROWKjI}G 5x_? Nծ&hj^^ߜ?,4^u]mmm)Ri  b}ZWԨG lo()9{>9"9'V qs{{+/۷eˮeClWl744&&8o 4757uاe$kjlSǛ?+:yBii}C|ʀֱHߵd2 w(J( \@B={_|֢BG#9a|?G' hNpH5k.H(_ʣG$P(vbUTm-a#Hy1Lwי[?ocᙡ( 323BN"#/X8{*{{,fhij,w,.:%+bf͞CNxzдxv%lm+)).v5z4yUf Si99[]Yqm &SKE0R RCW0EFϚtYqq 9g2 6ziC0Mi oSPL| x~A29M׶X-m -mFcTTdPH=m->\*L#۵ھ>kW*CUr9MBf࠘P_P[S}QinniL,IMMA2+8' {z FVld4B.NI3fr6puӴߏL"djBJe8ͽD7`4)yLWwSccAO:mZ?Eg\s8Kغ[[Z[&=W`;\+ܸvvW|?03ҥFup estsZlDnL%xս6999Y.s8J088, i pܡR6XygxwGw-6[L?NX$-\.v;|ad]jkH{+mǎ~7;:skK}ms!f&ң"ww>j% ?,/\2H nie`ttxRUEyo/iHLpHS@wA>1Q^$7雚ϟ?SXrZսWf>'gLnwo}ełoWhQFC~Yߴجw&ccCqƆs GXn^^^$eh5--m'HĞ#z{%%gg xr7}ÿ_k}x<75̡kh3-&y>T{l lZY,7{4eZ-fGS^Z/,P(XJb]]M Já7Q,#ɤM ~ѩ׏4 d,<~\02.Efni4-EDp8݃Fb (0ZZZLfUHxxhHrĉ2ycS]}+YM5_@¢3N]3}-:>>Q^ޥ%g:;ۺ:9cǩT>=@r ?ͮ ߵcӦzoE~-|v7M|u:S(:uIJ m-g=?\{S p8~? }暵QQASόjn:RFM>eKSTM&hzzj5(x֜5k23BɫZ<=&M\db~=Kvm9k'EWAQewHȔ)ٓ&)umjvbggO^W;rI.(8~Ku-YJf7V.cgtjFClH-VwFʕku^G ps)Jrfb&JέӑhId I'Awa nNqp($5$lA` !'9-d_ז"-zyy{s$K 3ē}dw]1fkC%*\45I= ])AWˀrT`dԩ+W-Y n,cC{B@ ZG;Fڻ )")$͔#~xɆMG}Fj q5`a{qd #/zW~_AQ6^>u.Ex{zpo4A84pCc=84pCc=848QƩl=ds8<'dP$w(vZ$rۉN$dCY&HKId8okTAkv{]:qvֽ͟z}o?[?.0Wt;|ٶn! ]vNZuOȖl(=(*&w]# 694Wl_tz5p4|߅vg:ٵ#?`}}U Yl޼D/k^d0{}+cG /]jiQfH&O<YYqqo6{* Ɩ>}|m][[OVk6s8b}⅋LQ5]\٫8gǎ74vttlD<~|x8Z.SzdchW3ݣNN9ݨ`dZm-yl߿~KK޵G}AnnsH09uo`PZ}=Cwi~~EE}͜s~l9`5֒4ܻnkd8p IDAT@b\\]rp~yN! F>瀮tCBB.{7+WNUDzO<}znVlLfwhV(f|~`2$:&,\ P_'mm=;?()J ;~54v7֚Nf NÏ-ֺڋ/[~(J(Z-Xl20$D`1]]s|??2t:3f[-Qo#\ØVtw t$I p+GEyA4f+ ^Ջ/fe)o0| ѱ[Z ) y3H["Ϟ}w0zޠ1>_&w}k1e2 |>Ml}}~o4 4Av'\y 'W3kB?qWaUXDdf>Uh6`Ȉ-45.>+kѢ \.p8jndb1L#ֶӅMySR #サa՚=/==.G|NhF&poEc7ڝ\vbu/ټ%d٧)JS-^ܺ^ Tؗر/(.ޱCcB//B0a3b W<%Wv?u4-塡 3,>hj0Rj^ 㳲M򪪎Sh_2y#BvvBwVN`AjJu_ݷqwkj-/l4XrD˜+{};=sϷ2TԔ[lrdKAT'[@?,Nc;k4l2'7P$wJqbd+XOItK3߀kT ߝQ4=?4ކ{qh ǡ1{qh qF~bٽ7s2&O(da0?x3ej.75wwkF㹻{yy{dAA1L6-%92R?Ø-]+3)J$%<$$&6))-=3#%%8 5L;n߾mkoUU4i Ղ6ɓh_;1ѳ2Wyhʋ՛?֞9MwOkKmMuKMI!Wc~7ط/005uF9Seժk=MM5uF.gݞ h޾nFE%d?v7h ##.׿t8p];'MJH {euߙO֬y񥕫'OSy#!3c/*ڹ}&? 맞̐Ik?j/&;l:x`oNeH6c''߸fގnM\ cDFl,g:|n028x+#l2s&aVuǎ^ҢVBLy3Ə?Ǔ8l7n_xK'}˵]] ~eqg6Vg?'&M󇥍;z􍿭_\ׯYv6 ]+  ^uFp=RS/YbFwsѣ9{rsK47w P!6}eefD{zb*.޻g׎NU&L3gyC2,JV򶹅Lгc&ĉk>E"#U(l`?==9%8ki[ɢtŒ̰Tt4SS.W-EE9ν**:;z.W" IH6=$gsz]30:}ցŋv斖ֶL\_xZjMF*T(p+ǒoCo^nixy,.ٽkDZc :=x΢O.uWp45?vv:d;^AϦ##W?>ĉdӧ/kkjfS,&eg/Y6gθq>3O;Sa4۷?.-mfzV֪UgsZmMM}nڴCg ??wn+`}6{.:*3snO~ =mNbSSyiz7c͞?Y(riP㺂m_| y\\RRŋSWx`ݬbh玽{Ƨ^zlUW>7g oW Eg'l}{@zj4ɕV[Kkn;~+/j0a%KyOfՃ䓷p}YZZ,M{[kZlmj o܇U6\Z.')J=eʢ%E;3'%%L<99112R& G>rbmj`ou@J1wUyx+Nܛo_CѨPܹ[dAەʴ9s.f>MssCCG;d);gڿ3fw_sCzCO`v\?'~‹^^vnذ//wҰZ=Lʚ:U-:}ӧr?_n޼@%]4}9 w1hZ9GW1aZ?lkAm4VV[W\,"#cc>O-r#[>R(}tʔ맓3yګ f1흯q65#u?ifϕ~Wm+.*6uLWat:t+Y2uʕ#CU"Q^CO)kYp8|~ݿvy5٠3Y S_UU[sDBQ"~JϞ|֮%eHQBAXآ>KAs;r38811-=;{鱱C}dǖ>:}Iɾy~~~6{cc'$(vfkhS]\.ٓsϼy/ïŊ8Υi3w_^nkB1/]?+I}}ܨgS ^k`b6͡)ՠy .>w=6;՗\OddrrZܹs""ĞnacfY|a-V~ֿҎ#<=NP`g*+/_oX2 Er*42R.zh飼 n-NBL=5uѢ)jow߿WHeU1t:=<݅_5,Ro677o=;4Ε痕K}L3V>r S'K++jjZZ M4v)n <xGEL_\L^޾;wmbҳΚ5|’;8׆8 Tf/xW/w-xrUcc݋Ο?z̙z-<]뿫+(X.Ʉt͛}|nn&S{{EEAA^^C`ٲ$wVPC,1LoymmEyCCl'Q秐xǚpnb//; E"D].6G2N)?kk˖ny뭳g3xX 4VS@QBAL̒%t*޾=///O/\`< E*1qƌE:=(?Lxs^z)Py`_c x  j„ٳnn{oېOO\!L,Mkilۯ_?}&XQaUeSSمc%%GlT*+J33ƏWoʟ n%%UV>CjLɂ&MZ3fN[5 Wxg~={Μ>th3gvOπԩ m߹:JN~uDC;wJeLqqV#,ngڏ>311i_m9{o),dO)˗߷/زDqdNB=x ծ]mz;=d1ZzͶ֭#Aʀy//k/!aҤ/G}yΞGOwaan)~kbٲID߄ccc%FW?|lq{Ǵ߼0L}QkּՓ')23\w7H$ϟZ(4Dh BUBolؐl)/7sї8!iaǎ}E]]}}O>4M8]v#&*UpŪ1-݀by'MZ楗"aSӎ|/#R0Ll62 T :bkȝ{re hdS~fKU{s*+EoONSpG5 7noϊo x={H?u\>gκ^yeѢߧ s\qQmDF^9+$XpդY%͚5sfTd-[JKϕϙ ǽ#`nrMp侽(hn0lO+& Zb*.޻g׎NU&L3gy΅mw8hl\$$$!aޞΝx_^Fo8}f_lp֮ӟbD>XY꾣GO<~11bK^Wmk}h=羕rE}ݱE.fP$E'O?򬬸8mCx17wҒږ֞ xɪ5СG2MǦ']/-DU(Ó0BѴX-dQ:cyyAAaaFfXXjLzmV@WgW(+S--dӧ/kkjfS,&eg/Y6gθq>)]3欶 ܽȑ 4S! ?>c֢%YY2irnoߡMfkT߿?{2-]͚5vl /z鲈6yW8"kS~UsW7lXqޜ}F?]RK0fp]ǥLZjl.W?oߡM6}{ jiAەʴ9s.f>MssCCG; VK m6Mhlvb!!ϱ#GlkmD e'ԡ}gUϓI@2$lوl֍Znڷmvպ' "=DvKv$/hŅs9;={a>λƼiS۵ܹk.]tСEYwo޲z5)k=62'_ziƍƷڵ;tlŋ/6lحA={%'WVn߱|ɯH;߽!C9hFWv۴ɁwpݷrՌc^woo`<ŻLyGiW3wg}E&+umڶkEyS[Zjզ۷m۶nݒ%ӧY۶5kvi\ ;_iժc̘;o.<әg`)ǿ(7_s݀j[]~} YY rNdH$!fr: 1јؚ 25jNS)HlL$%7GMe;m۾:iq͛wlߵ;vU+(uby_ Dc/Z΂Ⲳf.‹ɻ- >EtٳG2zԺu {t[͚Ҥf͝;7=z̚57Ƭ]۠С7k_?;DRAAvggWDo{V]Vvv>W]V?pZ7mVƶm>}̵ s1̛K/lYFƐ!߿='IIm\zO_ RQQ'^FfFݺmժs^{'Oرq!Ce#Y~"M;߽oȱcL;wԨ1cԨJMmԨCwuKe99;֭pOHoᬳ/Zn#Ln݌/Sֵk7o޿С-Z8WRwh\|||\XQhOw9qΝ&ԭ׮F(,8eJKKDc \&HL '|Dbj$όFKzԱM-5LOKz摲 YAM$(++-={\\^~1w߰ySVuR/**hlnݏP|#_FOp60 ;rI rr,]{=7)//Zۋ6>a]}Lz5ʝ;'N~wP$.vƍ{8o|aݻOD2;t2+;t4hM,={)S&O6mΜ^E .߻ݏlN$65W_]tQV9ػo3g|'WtP+#[411An^Hٻv>?{nKW*+€OT\\St/~~Cڵ{ǻ[]hic^퀿OZ oky8KVy}]wѣi  7iW\4iѣF;f̽K t70dHӦ﯉~II5kH:pVv0FRUWocϘ6_z≷HiIiiuyf}Gk?U1cߘ8ͱO?ѢE׮>pA޼yH}WiYyyQs斛o~#\$ڳWllL4_keeSkJN>9"zǾGqqqA|JK#GqGG֬YX8+7($$JϨ_?~zZsbckdoժgaZѽK>_rםǿ:r˻v9&qg$..L5}ڥ#.h㆕ɓN{goߵkJ͠ L_|=G?믷i}v#9 kTDygْ╥eݻ)HJ|?j&ge69Ẽ?\hyz?x6g{]qEEIɞݻVzO);heL̾};wMLHR3)OR7=l߱u˶ "Xb+IK?8*}N]2.6=e>g~;wYtӧ3_5k**ݯF~i*}"%%5k˷oݾXFzڱOVF++ˁH$)86DKH cw͌aGz{ ussZT9JJi֬Gޚ0zԻ;wƍs[vV_Q}c6H\g,|F`b{o_y~Ac{ǏHl;vWbAAFW#8mV4kׁvOJ_?nP䎢ڷo!/}v˖-F[4nkVq)GZ #]uzjh_rժ=| MkWPPs{cA[ ZWط}t~.tԨ#mA(5`Mя ʕ}ةۨqffLde˖/۵{ه}CE_Q\|݆hvvl?wd8ʩyz{%yfʵkWް2&ZF[4̋[~ƌ)W|[F5n4?76nIrʊޅ$&ԬY3%!bӦk6l:tG0/(S\4}i7}dxqB{XYo۶{r>:̩ܱhEѶ1z2?b l 33ש 5sH ֣GAA fgծUF||$r4UsVoƧ4k)*8a[~5O:sƍ[l:Al{Yܹa|o̞3kͺMZ4ʏdGQPFInǪU+Wn]ΪZ!ԪUfK.|g#ױ//߶u֝;IIuG5  0iظe^|Y6m>*5v[o7s%['%5l8lO~zm?{t]vJ??b#ݠCNDc-{sQKY,+[fqcYXQѨѩvx2'|8)WZd髯fF͚̳2ըQ^uKQӦ]ԤI. iH$={qƴwƘΊ!C ܥIzwl_vRSvѽyvzZ׮t6{;C80~\܎˖Mk&ff~`7ܹcǺifMgj!gu钗kתƘ+*cYهny{{~gi3q?1r<@4fذh*^4e˖^׶Yg著{|{XR3Xnyڴ6#F^ӵݿ٫./^VXئM 333 ݳg7s[oM\T\i]w]߾9G?X^ bf@y}v=}7ƍ۱aA_QPܳ^Z\cϞٳ_|عCׯ_`„1cV:0bUsVuj֌F|W((ݠAvzZzݺ ң uqFE"[-\0nW&N)/~ĥ6kvp1H=Dt_ro}zS6IO+/_fW_MyC\xqvj}\}l]fƝ;+*֯{wG0\\68qҼYy%Ss~;fLyiAANiҠAj߿mʕNxkow|5krҡì?wq[ݣgAA%[.[6uc&Lسia׺ǯwyW^}6sCCCq;o߬EÆ9%'xwsM9kƔ]֭{2HVf=3fθαo<]F@.)]r1cƍ[>+so|W>pbplg^**.qQE{nٲvҥΜ9uꔩ&LxksmKJj޼/޽ss9  t־CVVU+ϟ9sqƌ7vy-#u5jּy`:'IHWө͚'ز͛>csXsgZmt씙yewyi-ZVbB|zM6kVEųgO=x W޶m̬vqٕW ֶMZ#5kfxի{ѣiӃ]G[=ysb"ڿs[4oߡi{v߰lټy6`aa]\i2DX};|\mAdEEQeΧrM}[n_,CFc[A3e!' @*6mUVѕp*uW/ٱJ/کA˯rJc$G|^3 X7[:h5\EvW;/hN}AkAU?˪4EUFVY&h?70?hF|sPH~UVԕp' V=qV5˂fnaU/hUG0>9 (- ZUt"|*U+kgЪSA@8F2yv YWlf>n @şFw?~GY"/og?6,/7sS(ݿƹƎϘlٺ6m۶wo$Rnz 4iRXح[uJ!Ҕz IDATZ"SQtO'wwO~sϏ }q5kƿw#o3gѢK׬ٻvj~~aaޗ\|_ܩcFF\qE޽hsyw>[gX`ÆSNرG!C߼33 ><n>{˖ծs}Ϟ5{C|&wKVy?ᅭ[5ݻC>=;v턄ݻo߸iEoڴwo|#NTeeoWn}zNrs?8>8畕?ԍ7{onYS>KsUuv^xG{Gf㍦UtOJJ.klĭ\ټ|߽ 6o<'kfX?=5UTo$0n6{i+umg͙a!99q<0eObqQNso{ٳOR^zդt:uzW^wz*+7m1cuR۷ةEZLH\.x:`Ɗgbk=INȈrR2b>!:֏$cڴ` pP\\^i>YHdǎ7lػXUV^k?7}zeeW]կveHjj|xȗGdIE=rʍf͜1}ժϿa~\\ڷo<>G8`Agg}%Os>=v+6lس'1^Nv3[ܱL7']T<_|ŷϟrզM;wǧddm;dW^ziG"uի[;{yo2efM{.z챟Ϸϝ[Xor|ͮݓ'qOŎ[6˯߷o\ݠhرS&/\z֭e5[4}ذ .2mیËTTl߱F=̫#go޼o_BBݺ99-Z}ޗG߿Y䘘Nl?OαTVs+WVOY>nIHh+_n[㬬lFO>9y҂Vm_F홧v[ ;'hgO---))-IIIO1ao fZ(yo|c:uL$vjn][~yghu4ł|e3gLv}ݺ]xqV));4kG̞3gA:,(-[tnΝ͚?dȈÆo=3-߻A!C܍ƽy=sUX0`!^ڴiݻ6m\nH^ڵ~bFz^_:_)Q=on/'Oرk=֩SY5k'N6kҥMf-Yi檫D"kOg;۷_κAvXx/4ջ7{pn]~~߾l۶juQIv~;!!!-KzO0.G~/+<[߾ҎRRbckU_Yyn<}7-<1bw:>G  E.ژ7뤜[>i~N|擨^Qq7fg|Y99 +VlظyKp)ym۴H>{k͜1c ukw%AppZ ڷorJ$'8`|o=}_zq5srp_QXخ]џ;+#Sݻwҷ/[^Vּ:Gm٢㨑Ԭÿܨ/'Κ5r䣏N:rשӸqN}uְs٦M`6.rJ];w7vY.+--((h]=A5K$%x5[ը'6hЯ5^s9nsl߯};ݵ<.vjZF u7~VQzkscx}Z[&#52juiiժW~g.^ӷ׿ҋc,]֭Eh}]6j˯^]`uV>OM=CdTn$#޳}%%HjC{?D"'X_qgJT= ػwΜ7)sr~cSS=E[^V+*֭[zݺ k'*+nݰa rs33=JP^QbsmW𳟝w)Fm7~g ؼ̾կLr&&Ԭ }mF?qqiu[ ?֬]x)_+<{V./tӀ Nf{1;7_{mǻ(/5:vڭi_Kl>k駞:F +tp"#.6>>(SYkΝ}Rc{?c9ݿ_Wy0DU䔗Y?o6m׷<_oSX=_HZAQƍcb{3l͛\О=s͜xiLYk֦0%EO-ˋgΜ=km۶aF"iimڴmYjyn;8ŚfEb'+c*-//(}JHHۦM_>5jX]f DU>=*+o/Z^\u[L~YiDСk-JJϟ}ٳfefvܹKn'Q&Sf~ÆyYEKN>}㦏cu,?)r㡣mӦ7կ?89?;7uޗ6tM\\uVAiS0jE{ƽYV֮CjHPeeK͘>gIر]C >œϿ0sݺo3fdD"iuv|F||zyO3KgO[~'nvm?ڴi}i$T#;uvm6UK٠dVWk뿮⥗7z}~m}7g3OwC.Z×\, 8'iiҥ3g̛kW:;o߸-qYXX&+WF;g޼m7#=ܺo~+=ɣ^{챩S++SSsrZޣgv֬}u 1&S+*jԨo|m۵kX3==/pذ;gi܅ӻυsNr3~g)SP,K ;/}SGڽ;=eNz߸퓓;hGA;W>/+CoǎF3~G޻w.c01h۶Uɲ*ͪ|>Tx0GU|V>OҲE 33ti$g_ј]͛:e-Z>=>>E**V|s3̟䀜iI%7m\p#'O|WI.l{<;̞6uhL]TضV]a:>?IҾ 5zI6mڵ2%~-y _~z&M>++7m9cqq-]ziAAw҇X| DztޣyOcc3wnc~C"L@ÀTIᣕVILZr͠R>5SV̍Hwa@VvV Zvd] +) ڪA̬R*/U^ҲJEOÀA+**ՓYP%JA:NA۵3hꋠUrsf<OÀHMk: ժ>1>mM!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  o>૪g'F6{"P{|8Q;jն֟u/j(`BL{!럓[*( Vyͽ>~^!' @  r9a0BN!' @  rVs IDAT9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r9a0BN!' @  r8`OU֮ ͛=w)aa`bQbQe`IҷJ* ߥmU>,l,* *=0a^:WeG0{R`2>XT,XTeWID..b+S,XT,*T,*{`}ZŢbXF:ug>f̂eeG|/лOW^yI;1[\`Uo'O<)#J ^r%KwV1ꇻbGd@ł6WTޛ?;.߱ՓH :,h pGQixQ'ء1Wڵ=s{}; kn{W:c=_RRF~QKp %%egeh׿o $^ac?XT݊oۖRz`=:z>9s]ˣKKwEG뗓U*Y1+V?>HHؘTZfMF<5ȣ>_7pM7 떭XN;S[xgMJ&c5k~o̘7n„?Xi{o&R?|Gc?~„> \֞=M2L"GF4/G() ]JK+*JJ+JJJ+,URR9;=N=U/6u޼+֮ݾf͆ 25j٪K׽{vV>7>s-6mhW_{3裯8uVoGZ7x̙>G?yEtʼ11[6oْyICΜqo=!AJMuҹsM6+ذ~9,**111!&&!!!ණpٲɓnj;fY-\2oڭ[wMN7iҾ}߿O;,PZ:g_z ܗ?p~M6lCC=[` /8E&$} cbbcu#^S3N7+//)ٱ}˖ >8<^lgѯn>}:.x ATF͚{_G{UǎvΎ5kf2;N**I^H}As~|µv\믻W_s{w|+_p;w&$FGkc6NާxRaajj.={ yK^g}6eQO>9i3f{޻Wjj\ܾ_+l xGSXءNk299}v~vC> ͛S^ WlݺuK:t蘐8q6mشeN?GѶm O֢/<ׅL۶-\G~F.]تeݺ}L. Ԫ]Ti+/Z`+zn4VP_ jUAA^{cƾ?flN:|g+];3EMItҪUjwyoS3c R"+u8wN8~ ii{F{UA]թ٪UmZicMv?ujٲQwo*11>>_sc{x3}FGح[78lر}ׯ߲e۶?sy1c|'O)/nհaݻ7lŽuݻqO<裯ܳ#F_|rF{wfs_z{n p^ԣ{J]Vz_on%K+Vu%^2<"h|+ʷnZ^ޮ]>nUJL:Pu[?~“O>;l-l~ذo9^23UWcF |ys؇bǂW/xsȷٮ]6ׯW^~eWT/qllj-7`΢ܾ peA6R _L|ՕLe7nz7^3g࣎ҹMۦMSS-,Xm[Nժ7tqqAy\|ܟPD'ժWFrrbbd~ lٱ,f 2WٳGK֨޻UWsG4}[z\tg,_=zkc'ݻլqw]?1=tР쬄ɝ+7nܴ`iSSӲ37oڼ9*dWIIE­[K =q?<# YgoQܷF5k +*>qeߩH 0…/0aZ7ۺ/?f_+*l]]fMQQbbfVvv_oǎ+M>xO-_nj6o?A:v՞ee6ϙ;W_ygi[WT_vzz˖}zڹw\fƩks7޸C4Qvb=t{ҁ#} L]XIɺ3g=Wƌ9cɒM;,-YӜO9tn !azZŗnn9o-/W~{' ]WQѹû>e˟;/S=x۞|Ok85|I'5tEEaI?_RBaw1]*Xur:NvϦP`)o|0ke۶֭ۤqNN˖Qѻ#h7('X9jԴgu }zר\E*r0$[Ty+Vn|TE||p{DG'&@͕gg7lXn0[t+W[^~c%%Ϙ1{”#ޣyiY3'OΝ;lƌif}hQqw-[g|G+yMu7yf5?[xg~A~^\|9wݮ]7mX^RBɧ|7^{Ҳii/>뷥x©̜03s^e/dfm=Dю8+5m|0yҼy+WnذZrjjG:!W";ؿv_߰dO>'?l҂4h޼kAN?}.]ZPU̹.t`ժ+_{7_{]m;t4.%/K-j֬i-WӢnk֬X|Er^RR/k6=a$1]-ZPVָI^稔ժoܸx G3zĈG74thvek֎w⋫Vee;hi PnTƍ+V.YRP̆ KJV|#{tؒ^~_bp Z'寽vI'=`bᬬH$Sy'ʫdggf쯮6o_xظ}4[ OW+F?77mnѼ! ^}e˧Lyw.Yri7򪫎;.=m念%=w]KuؽN9wɩiר޸qbbNjM0sϖ,))ԡMݍBeKΞ;o۶Ғҭ[ss^3thq rsӦչڶ-Xu]%Wu߽y͛5;=;`uq5~baayyZz?4<sm\Vvι'm˖[[TPշ?қ?ow}_˫/+f)4GLLYٞLtt\.Ż*KZrBB엎M wDeU\l\lvv&Y11']zMڤ~uW3GG3}zrr㮼ꒋ{n ^=AuXy/q;t_qMT}EEy11 6he 7X>oZtpR^v%+󋋫%5irCA}wVn2iK/jN};80>~ >xQ<؈bco 7 MZ==dW׮CO<ᗦnX?gΘ1oSaa\on=1A`?=v(*ڱc)?8J$wFNzROOKKHlQSM4o'WQ}?14ըrӲ@kmذ+ˏر])۶vۣL2ege6mQ\3^.HIzͷlվ}׮{jee{OZVqӴC[vuןvZC֯ݖCH]v͚Ցڻ.HM٣G#{SSO93WWf=̚﵊2W7rˉ'feFGo:u믍byzɧ vFv;oߠO~_2Qos:UEN9k/gz)_nPMNҵSڵǏ͝={֭7 V,3wׯ~nܹ6Z/%⅋rs,*m̳ڴ zM] ٲeԑorEZډ'|~Q왜Բ[o}K thJJ"k%J'=.4&*+dJK6 Zj_` ,*=**))8h  3իQ}=\鴣hWEylt ,8=\=99֭`n>+JKWt'WYFMԯX>lw{*%W/VTԺisiӧMnߵ+$xU ++-MNUV;o/-ݴy{Gl߾cx7vIKo^xoӦY nLdʼ3Ni(Ck!8ONF5irzٽz֩-7myoo{Q&N<]E( ~?jՒUzxû1&xLJJݺeV>sϽ~SNݺ)YY6mҤyH3nȖ/鱇֧Wq9iG^tcdžK 嗟JKo.s5ԣ.!!55#~ Ĕ,|g7m~GѠF+^yG3^^uu[~=:YreyV~+J+VD3RZWE.ZTZڢՙgqDz_}]!Q={Jg͜pA^~ii͛ѕIʮS;hL>mҸKN9kO0wnUee͚n3gܝ;[:]L4m޽j*-]4weeڝzj۶(^ _׭]KΝf-N={}5III ~WtRv1y?|xI<2QJe֮^$2P~wsiiLYTTiIzV= ''תUzj=˓'ѽU 'VK)رc;J9%%;v IH\cw8Lލr{߽/_z2#~}R|Ww+ԮXIDATvQFw{o 3)+ѣǑ;wm+ܶ-)M6mKJ*v\ܦM6m7+Vu]wee}w}%$$'TTضukaaIзrA~II)uc۶m 9Կd>iӤ❕GLLfV&Q VT/e|"MV͚{:WYVG葚^W"`_NXb~6W_}\Peʼ˟}}᝻-RVD(*,ܺ4.nJIغ)RԎ )yM6qqMv9̝fСYY͟eKoѢzrfm&$Y (ճkիss/.nrm5@X8=Ss떠.6azpN:GF Vco5nqݵk֙Y͜tɦMu԰a0OPGA_|L82plLuǎ>aӦ{Yk**;.''#}珉Saj -[2[}9|UVWުUfz`R9Kο owxW+]wmZcДﻢ ,\;ꫯ&*zٳ V$8pЂ޻G;jT7^ի7TV6}M<Q4Rrv~^/%-3jWҥXYR9EC}Ϝbbbbc|;w[l Z+/\ֻ' TO`FّqZ ίUqHwOwOF4>}{/оRB|vvW~+)ٸq{cD~v1ǦԫSnڵ˧Mo=wlL\հ۶nݶ=Xڵ!w֠`V'|9_^{'z*-ӾDŽ_w_˖/_tY7u믿nB`e׿UvD#*+kӆ[~Y|[amۃ7Q}w_/{49c>ʝ=g {$%ΝI#zh ߢEǎ[ƍ5koߩs{0ةѡg]2Vo剧Nϸ/ճA4~?+vݺyΝ0dHbbqqΒEU*(3wNΙ;73v̙/G']^Vˢb,^yCOz¬Yw4m={gMNnժc-̙:mhִ{~?wowجCu7l/Ҋ=$we@Li O=+*-]i4s Lx`ܚ]zII6_VTgMwo-[V,Y} (ܺnݒ|2vc7mj=xk ӰRR~>ys.k(*Z*7w[,hE_}סÄyf䛏>'|t֭SEE_t…+Vu8thϞYUkXXկÙgtk{r^{e BP)Ӧ~2:,t?>bD^G;RVQR{ACz0}xxȐci6?`ƹs>୑>.-47GΨN8{LD:hG=n|TTgٶ]/P79e#{=ر<|}v ҷo n޼hG͛7g#2! 7~z/4neO<~Q%UvP3.q'\|y_|{|] 툶m4IKQxe͛6u3֮SO.:Q}cujwz]fCS&-/{1rߪ:u:J˶nٺeܸ|N:樣Lȑ S+nu1Խ뮛˛~ycELaa`Nf͛5[nٟը~QG37i7hp5Ҳ\blܴi+͝Sӫw>;jmڜ~]uu2Iƌy?.*V~̖-\r͚ԬiRY'Ν;u[w옱WKj׾Mڵ^jZСi7kŭ[tiӺW ¡sg8k^W_I~)S**Ѻ=O?_xa=s)RZ, Yhg\aկݺu]v%Gݾ}z ~ xLJj/~x7Nh8)_ߖHAEZ9]ѓ'age}ըQvw-;t<Yn~eĄfMO:k+.Q#qS_ye۶|^Njjf;)'x>/|ϫ.>+>Gb,G |<)Xz plѲ˖/]6eO&ON=_cI)>01Xz,߇]UP:U04GҎ=6iҸYS߷O4FΨeUWD~aΝ<,&&_%rMWKdRGb*T׿+$&zJJn#/V橧zz||bHuEj?ݟqxWCh(;=m|5RSyg}|=>̔zII rKQ M{ ${6Gn+ ̪3< @ZC_*iNݳGd>D@1jݼgYS]}l 9'Յ0=q̚P1j*[vUI=pXҨ a`I, ߥ]JREłEbg`Q{ %K*{ ߍh ?7VXPWE{_'XVqŤr9a0BN!' @E7>XxYcwIENDB`gsequencer-3.1.3/functional-tests.mk0000644000175000017500000003273413614062654014453 00000000000000# Copyright (C) 2005-2019 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. libgsequencer_test_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ gsequencer_functional_test_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ # libadd and ldadd libgsequencer_test_LIBADD += libgsequencer.la libags_gui.la libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) gsequencer_functional_test_LDADD += libgsequencer.la libags_gui.la libags_audio.la libags_server.la libags_thread.la libags.la libags_thread.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) -lXtst check_LTLIBRARIES = libgsequencer_test.la #TODO:JK: fix tests after refactoring # functional tests check_PROGRAMS += \ ags_functional_server_test \ ags_functional_audio_test \ ags_functional_pitch_test \ ags_functional_fourier_transform_test \ ags_functional_osc_server_test \ ags_functional_osc_xmlrpc_server_test \ ags_functional_machine_add_and_destroy_test \ ags_functional_machine_link_test \ ags_functional_line_member_add_and_destroy_test \ ags_functional_notation_editor_workflow_test \ ags_functional_automation_editor_workflow_test \ ags_functional_panel_test \ ags_functional_mixer_test \ ags_functional_drum_test \ ags_functional_matrix_test \ ags_functional_synth_test \ ags_functional_ffplayer_test \ ags_functional_notation_edit_test \ ags_functional_audio_config_test # functional test util library libgsequencer_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h libgsequencer_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) libgsequencer_test_la_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" if FAST_TEST_MODE libgsequencer_test_la_CPPFLAGS += -DAGS_FAST_FUNCTIONAL_TESTS=1 endif libgsequencer_test_la_LDFLAGS = -pthread $(LDFLAGS) libgsequencer_test_la_LIBADD = $(libgsequencer_test_LIBADD) # functional server test ags_functional_server_test_SOURCES = ags/test/server/ags_functional_server_test.c ags_functional_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_functional_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_server_test_LDADD = $(gsequencer_functional_test_LDADD) # functional audio test ags_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c ags_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_audio_test_LDADD = $(gsequencer_functional_test_LDADD) # functional pitch test ags_functional_pitch_test_SOURCES = ags/test/audio/ags_functional_pitch_test.c ags_functional_pitch_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_functional_pitch_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_pitch_test_LDADD = $(gsequencer_functional_test_LDADD) # functional fourier transform test ags_functional_fourier_transform_test_SOURCES = ags/test/audio/ags_functional_fourier_transform_test.c ags_functional_fourier_transform_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_functional_fourier_transform_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_fourier_transform_test_LDADD = $(gsequencer_functional_test_LDADD) # functional osc server test ags_functional_osc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_server_test.c ags_functional_osc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_functional_osc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_osc_server_test_LDADD = $(gsequencer_functional_test_LDADD) # functional osc xmlrpc server test ags_functional_osc_xmlrpc_server_test_SOURCES = ags/test/audio/osc/ags_functional_osc_xmlrpc_server_test.c ags_functional_osc_xmlrpc_server_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) ags_functional_osc_xmlrpc_server_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_osc_xmlrpc_server_test_LDADD = $(gsequencer_functional_test_LDADD) # functional machine add and destroy test ags_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c ags_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD) # functional machine link test ags_functional_machine_link_test_SOURCES = ags/test/X/ags_functional_machine_link_test.c ags_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_machine_link_test_LDADD = $(gsequencer_functional_test_LDADD) # functional line member add and destroy test ags_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c ags_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD) # functional notation editor workflow test ags_functional_notation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_notation_editor_workflow_test.c ags_functional_notation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_notation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_notation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_notation_editor_workflow_test_LDADD = $(gsequencer_functional_test_LDADD) # functional automation editor workflow test ags_functional_automation_editor_workflow_test_SOURCES = ags/test/X/ags_functional_automation_editor_workflow_test.c ags_functional_automation_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_automation_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_automation_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_automation_editor_workflow_test_LDADD = $(gsequencer_functional_test_LDADD) # functional panel test ags_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c ags_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_panel_test_LDADD = $(gsequencer_functional_test_LDADD) # functional mixer test ags_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c ags_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_mixer_test_LDADD = $(gsequencer_functional_test_LDADD) # functional drum test ags_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c ags_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_drum_test_LDADD = $(gsequencer_functional_test_LDADD) # functional matrix test ags_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c ags_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_matrix_test_LDADD = $(gsequencer_functional_test_LDADD) # functional synth test ags_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c ags_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_synth_test_LDADD = $(gsequencer_functional_test_LDADD) # functional ffplayer test ags_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c ags_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_ffplayer_test_LDADD = $(gsequencer_functional_test_LDADD) # functional note edit test ags_functional_notation_edit_test_SOURCES = ags/test/X/ags_functional_notation_edit_test.c ags_functional_notation_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_notation_edit_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_notation_edit_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_notation_edit_test_LDADD = $(gsequencer_functional_test_LDADD) # functional audio config test ags_functional_audio_config_test_SOURCES = ags/test/X/ags_functional_audio_config_test.c ags_functional_audio_config_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) ags_functional_audio_config_test_CPPFLAGS = -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"gsequencer.share\" ags_functional_audio_config_test_LDFLAGS = -pthread $(LDFLAGS) ags_functional_audio_config_test_LDADD = $(gsequencer_functional_test_LDADD) gsequencer-3.1.3/po/0000755000175000017500000000000013622252265011303 500000000000000gsequencer-3.1.3/po/boldquot.sed0000644000175000017500000000033113556560122013546 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g gsequencer-3.1.3/po/POTFILES.in0000644000175000017500000006026013614062654013006 00000000000000./ags/X/ags_animation_window.c ./ags/X/ags_audio_preferences.c ./ags/X/ags_audio_preferences_callbacks.c ./ags/X/ags_automation_editor.c ./ags/X/ags_automation_editor_callbacks.c ./ags/X/ags_automation_window.c ./ags/X/ags_automation_window_callbacks.c ./ags/X/ags_bulk_member.c ./ags/X/ags_bulk_member_callbacks.c ./ags/X/ags_connection_editor.c ./ags/X/ags_connection_editor_callbacks.c ./ags/X/ags_context_menu.c ./ags/X/ags_dssi_browser.c ./ags/X/ags_dssi_browser_callbacks.c ./ags/X/ags_effect_bridge.c ./ags/X/ags_effect_bridge_callbacks.c ./ags/X/ags_effect_bulk.c ./ags/X/ags_effect_bulk_callbacks.c ./ags/X/ags_effect_line.c ./ags/X/ags_effect_line_callbacks.c ./ags/X/ags_effect_pad.c ./ags/X/ags_effect_pad_callbacks.c ./ags/X/ags_effect_separator.c ./ags/X/ags_export_soundcard.c ./ags/X/ags_export_soundcard_callbacks.c ./ags/X/ags_export_window.c ./ags/X/ags_export_window_callbacks.c ./ags/X/ags_generic_preferences.c ./ags/X/ags_generic_preferences_callbacks.c ./ags/X/ags_input_collection_editor.c ./ags/X/ags_input_collection_editor_callbacks.c ./ags/X/ags_input_editor.c ./ags/X/ags_input_editor_callbacks.c ./ags/X/ags_input_listing_editor.c ./ags/X/ags_input_listing_editor_callbacks.c ./ags/X/ags_ladspa_browser.c ./ags/X/ags_ladspa_browser_callbacks.c ./ags/X/ags_line.c ./ags/X/ags_line_callbacks.c ./ags/X/ags_line_editor.c ./ags/X/ags_line_editor_callbacks.c ./ags/X/ags_line_member.c ./ags/X/ags_line_member_callbacks.c ./ags/X/ags_line_member_editor.c ./ags/X/ags_line_member_editor_callbacks.c ./ags/X/ags_link_collection_editor.c ./ags/X/ags_link_collection_editor_callbacks.c ./ags/X/ags_link_editor.c ./ags/X/ags_link_editor_callbacks.c ./ags/X/ags_listing_editor.c ./ags/X/ags_listing_editor_callbacks.c ./ags/X/ags_lv2_browser.c ./ags/X/ags_lv2_browser_callbacks.c ./ags/X/ags_machine.c ./ags/X/ags_machine_callbacks.c ./ags/X/ags_machine_editor.c ./ags/X/ags_machine_editor_callbacks.c ./ags/X/ags_menu_action_callbacks.c ./ags/X/ags_menu_bar.c ./ags/X/ags_midi_dialog.c ./ags/X/ags_midi_dialog_callbacks.c ./ags/X/ags_midi_preferences.c ./ags/X/ags_midi_preferences_callbacks.c ./ags/X/ags_navigation.c ./ags/X/ags_navigation_callbacks.c ./ags/X/ags_notation_editor.c ./ags/X/ags_notation_editor_callbacks.c ./ags/X/ags_osc_server_preferences.c ./ags/X/ags_osc_server_preferences_callbacks.c ./ags/X/ags_output_collection_editor.c ./ags/X/ags_output_collection_editor_callbacks.c ./ags/X/ags_output_editor.c ./ags/X/ags_output_editor_callbacks.c ./ags/X/ags_output_listing_editor.c ./ags/X/ags_output_listing_editor_callbacks.c ./ags/X/ags_pad.c ./ags/X/ags_pad_callbacks.c ./ags/X/ags_pad_editor.c ./ags/X/ags_pad_editor_callbacks.c ./ags/X/ags_performance_preferences.c ./ags/X/ags_performance_preferences_callbacks.c ./ags/X/ags_playback_window.c ./ags/X/ags_playback_window_callbacks.c ./ags/X/ags_plugin_browser.c ./ags/X/ags_plugin_browser_callbacks.c ./ags/X/ags_plugin_preferences.c ./ags/X/ags_plugin_preferences_callbacks.c ./ags/X/ags_preferences.c ./ags/X/ags_preferences_callbacks.c ./ags/X/ags_property_collection_editor.c ./ags/X/ags_property_collection_editor_callbacks.c ./ags/X/ags_property_editor.c ./ags/X/ags_property_editor_callbacks.c ./ags/X/ags_property_listing_editor.c ./ags/X/ags_resize_editor.c ./ags/X/ags_sequencer_editor.c ./ags/X/ags_sequencer_editor_callbacks.c ./ags/X/ags_server_preferences.c ./ags/X/ags_server_preferences_callbacks.c ./ags/X/ags_sheet_editor.c ./ags/X/ags_sheet_editor_callbacks.c ./ags/X/ags_sheet_window.c ./ags/X/ags_sheet_window_callbacks.c ./ags/X/ags_soundcard_editor.c ./ags/X/ags_soundcard_editor_callbacks.c ./ags/X/ags_ui_provider.c ./ags/X/ags_wave_editor.c ./ags/X/ags_wave_editor_callbacks.c ./ags/X/ags_wave_window.c ./ags/X/ags_wave_window_callbacks.c ./ags/X/ags_window.c ./ags/X/ags_window_callbacks.c ./ags/X/ags_xorg_application_context.c ./ags/X/editor/ags_automation_edit.c ./ags/X/editor/ags_automation_edit_box.c ./ags/X/editor/ags_automation_edit_callbacks.c ./ags/X/editor/ags_automation_toolbar.c ./ags/X/editor/ags_automation_toolbar_callbacks.c ./ags/X/editor/ags_crop_note_dialog.c ./ags/X/editor/ags_crop_note_dialog_callbacks.c ./ags/X/editor/ags_envelope_dialog.c ./ags/X/editor/ags_envelope_dialog_callbacks.c ./ags/X/editor/ags_envelope_editor.c ./ags/X/editor/ags_envelope_editor_callbacks.c ./ags/X/editor/ags_envelope_info.c ./ags/X/editor/ags_envelope_info_callbacks.c ./ags/X/editor/ags_machine_radio_button.c ./ags/X/editor/ags_machine_radio_button_callbacks.c ./ags/X/editor/ags_machine_selection.c ./ags/X/editor/ags_machine_selector.c ./ags/X/editor/ags_machine_selector_callbacks.c ./ags/X/editor/ags_move_note_dialog.c ./ags/X/editor/ags_move_note_dialog_callbacks.c ./ags/X/editor/ags_notation_edit.c ./ags/X/editor/ags_notation_edit_callbacks.c ./ags/X/editor/ags_notation_toolbar.c ./ags/X/editor/ags_notation_toolbar_callbacks.c ./ags/X/editor/ags_pattern_envelope.c ./ags/X/editor/ags_pattern_envelope_callbacks.c ./ags/X/editor/ags_position_automation_cursor_dialog.c ./ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c ./ags/X/editor/ags_position_notation_cursor_dialog.c ./ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c ./ags/X/editor/ags_position_wave_cursor_dialog.c ./ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c ./ags/X/editor/ags_ramp_acceleration_dialog.c ./ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c ./ags/X/editor/ags_scrolled_automation_edit_box.c ./ags/X/editor/ags_scrolled_wave_edit_box.c ./ags/X/editor/ags_select_acceleration_dialog.c ./ags/X/editor/ags_select_acceleration_dialog_callbacks.c ./ags/X/editor/ags_select_buffer_dialog.c ./ags/X/editor/ags_select_buffer_dialog_callbacks.c ./ags/X/editor/ags_select_note_dialog.c ./ags/X/editor/ags_select_note_dialog_callbacks.c ./ags/X/editor/ags_sheet_edit.c ./ags/X/editor/ags_sheet_edit_callbacks.c ./ags/X/editor/ags_sheet_toolbar.c ./ags/X/editor/ags_sheet_toolbar_callbacks.c ./ags/X/editor/ags_vautomation_edit_box.c ./ags/X/editor/ags_vwave_edit_box.c ./ags/X/editor/ags_wave_edit.c ./ags/X/editor/ags_wave_edit_box.c ./ags/X/editor/ags_wave_edit_callbacks.c ./ags/X/editor/ags_wave_toolbar.c ./ags/X/editor/ags_wave_toolbar_callbacks.c ./ags/X/export/ags_machine_collection.c ./ags/X/export/ags_machine_collection_callbacks.c ./ags/X/export/ags_machine_collection_entry.c ./ags/X/export/ags_machine_collection_entry_callbacks.c ./ags/X/export/ags_midi_export_wizard.c ./ags/X/export/ags_midi_export_wizard_callbacks.c ./ags/X/export/ags_wave_export_dialog.c ./ags/X/export/ags_wave_export_dialog_callbacks.c ./ags/X/file/ags_simple_file.c ./ags/X/import/ags_midi_import_wizard.c ./ags/X/import/ags_midi_import_wizard_callbacks.c ./ags/X/import/ags_track_collection.c ./ags/X/import/ags_track_collection_callbacks.c ./ags/X/import/ags_track_collection_mapper.c ./ags/X/import/ags_track_collection_mapper_callbacks.c ./ags/X/machine/ags_audiorec.c ./ags/X/machine/ags_audiorec_callbacks.c ./ags/X/machine/ags_cell_pattern.c ./ags/X/machine/ags_cell_pattern_callbacks.c ./ags/X/machine/ags_desk.c ./ags/X/machine/ags_desk_callbacks.c ./ags/X/machine/ags_desk_input_pad.c ./ags/X/machine/ags_desk_input_pad_callbacks.c ./ags/X/machine/ags_drum.c ./ags/X/machine/ags_drum_callbacks.c ./ags/X/machine/ags_drum_input_line.c ./ags/X/machine/ags_drum_input_line_callbacks.c ./ags/X/machine/ags_drum_input_pad.c ./ags/X/machine/ags_drum_input_pad_callbacks.c ./ags/X/machine/ags_drum_output_line.c ./ags/X/machine/ags_drum_output_line_callbacks.c ./ags/X/machine/ags_drum_output_pad.c ./ags/X/machine/ags_drum_output_pad_callbacks.c ./ags/X/machine/ags_dssi_bridge.c ./ags/X/machine/ags_dssi_bridge_callbacks.c ./ags/X/machine/ags_equalizer10.c ./ags/X/machine/ags_equalizer10_callbacks.c ./ags/X/machine/ags_ffplayer.c ./ags/X/machine/ags_ffplayer_bridge.c ./ags/X/machine/ags_ffplayer_bridge_callbacks.c ./ags/X/machine/ags_ffplayer_bulk_input.c ./ags/X/machine/ags_ffplayer_bulk_input_callbacks.c ./ags/X/machine/ags_ffplayer_callbacks.c ./ags/X/machine/ags_ffplayer_input_line.c ./ags/X/machine/ags_ffplayer_input_line_callbacks.c ./ags/X/machine/ags_ffplayer_input_pad.c ./ags/X/machine/ags_ffplayer_input_pad_callbacks.c ./ags/X/machine/ags_fm_oscillator.c ./ags/X/machine/ags_fm_oscillator_callbacks.c ./ags/X/machine/ags_fm_syncsynth.c ./ags/X/machine/ags_fm_syncsynth_callbacks.c ./ags/X/machine/ags_fm_synth.c ./ags/X/machine/ags_fm_synth_callbacks.c ./ags/X/machine/ags_fm_synth_input_line.c ./ags/X/machine/ags_fm_synth_input_line_callbacks.c ./ags/X/machine/ags_fm_synth_input_pad.c ./ags/X/machine/ags_ladspa_bridge.c ./ags/X/machine/ags_ladspa_bridge_callbacks.c ./ags/X/machine/ags_live_dssi_bridge.c ./ags/X/machine/ags_live_dssi_bridge_callbacks.c ./ags/X/machine/ags_live_lv2_bridge.c ./ags/X/machine/ags_live_lv2_bridge_callbacks.c ./ags/X/machine/ags_lv2_bridge.c ./ags/X/machine/ags_lv2_bridge_callbacks.c ./ags/X/machine/ags_matrix.c ./ags/X/machine/ags_matrix_bridge.c ./ags/X/machine/ags_matrix_bridge_callbacks.c ./ags/X/machine/ags_matrix_bulk_input.c ./ags/X/machine/ags_matrix_bulk_input_callbacks.c ./ags/X/machine/ags_matrix_callbacks.c ./ags/X/machine/ags_mixer.c ./ags/X/machine/ags_mixer_callbacks.c ./ags/X/machine/ags_mixer_input_line.c ./ags/X/machine/ags_mixer_input_pad.c ./ags/X/machine/ags_oscillator.c ./ags/X/machine/ags_oscillator_callbacks.c ./ags/X/machine/ags_panel.c ./ags/X/machine/ags_panel_callbacks.c ./ags/X/machine/ags_panel_input_line.c ./ags/X/machine/ags_panel_input_line_callbacks.c ./ags/X/machine/ags_panel_input_pad.c ./ags/X/machine/ags_pattern_box.c ./ags/X/machine/ags_pattern_box_callbacks.c ./ags/X/machine/ags_pitch_sampler.c ./ags/X/machine/ags_pitch_sampler_callbacks.c ./ags/X/machine/ags_pitch_sampler_file.c ./ags/X/machine/ags_pitch_sampler_file_callbacks.c ./ags/X/machine/ags_spectrometer.c ./ags/X/machine/ags_spectrometer_callbacks.c ./ags/X/machine/ags_syncsynth.c ./ags/X/machine/ags_syncsynth_callbacks.c ./ags/X/machine/ags_synth.c ./ags/X/machine/ags_synth_callbacks.c ./ags/X/machine/ags_synth_input_line.c ./ags/X/machine/ags_synth_input_line_callbacks.c ./ags/X/machine/ags_synth_input_pad.c ./ags/X/osc/controller/ags_ui_osc_renew_controller.c ./ags/X/task/ags_simple_file_read.c ./ags/X/task/ags_simple_file_write.c ./ags/audio/ags_acceleration.c ./ags/audio/ags_audio.c ./ags/audio/ags_audio_application_context.c ./ags/audio/ags_audio_buffer_util.c ./ags/audio/ags_audio_signal.c ./ags/audio/ags_automation.c ./ags/audio/ags_buffer.c ./ags/audio/ags_channel.c ./ags/audio/ags_char_buffer_util.c ./ags/audio/ags_devin.c ./ags/audio/ags_devout.c ./ags/audio/ags_diatonic_scale.c ./ags/audio/ags_fifoout.c ./ags/audio/ags_filter_util.c ./ags/audio/ags_fm_synth_util.c ./ags/audio/ags_fourier_transform_util.c ./ags/audio/ags_frequency_map.c ./ags/audio/ags_frequency_map_manager.c ./ags/audio/ags_generic_recall_channel_run.c ./ags/audio/ags_generic_recall_recycling.c ./ags/audio/ags_input.c ./ags/audio/ags_lfo_synth_util.c ./ags/audio/ags_midi.c ./ags/audio/ags_midiin.c ./ags/audio/ags_notation.c ./ags/audio/ags_note.c ./ags/audio/ags_output.c ./ags/audio/ags_pattern.c ./ags/audio/ags_playback.c ./ags/audio/ags_playback_domain.c ./ags/audio/ags_port.c ./ags/audio/ags_preset.c ./ags/audio/ags_recall.c ./ags/audio/ags_recall_audio.c ./ags/audio/ags_recall_audio_run.c ./ags/audio/ags_recall_audio_signal.c ./ags/audio/ags_recall_channel.c ./ags/audio/ags_recall_channel_run.c ./ags/audio/ags_recall_container.c ./ags/audio/ags_recall_dependency.c ./ags/audio/ags_recall_dssi.c ./ags/audio/ags_recall_dssi_run.c ./ags/audio/ags_recall_factory.c ./ags/audio/ags_recall_id.c ./ags/audio/ags_recall_ladspa.c ./ags/audio/ags_recall_ladspa_run.c ./ags/audio/ags_recall_lv2.c ./ags/audio/ags_recall_lv2_run.c ./ags/audio/ags_recall_recycling.c ./ags/audio/ags_recycling.c ./ags/audio/ags_recycling_context.c ./ags/audio/ags_sequencer_util.c ./ags/audio/ags_sound_provider.c ./ags/audio/ags_soundcard_util.c ./ags/audio/ags_synth_generator.c ./ags/audio/ags_synth_util.c ./ags/audio/ags_track.c ./ags/audio/ags_wave.c ./ags/audio/core-audio/ags_core_audio_client.c ./ags/audio/core-audio/ags_core_audio_devin.c ./ags/audio/core-audio/ags_core_audio_devout.c ./ags/audio/core-audio/ags_core_audio_midiin.c ./ags/audio/core-audio/ags_core_audio_port.c ./ags/audio/core-audio/ags_core_audio_server.c ./ags/audio/file/ags_audio_container.c ./ags/audio/file/ags_audio_file.c ./ags/audio/file/ags_audio_file_link.c ./ags/audio/file/ags_ipatch.c ./ags/audio/file/ags_ipatch_dls2_reader.c ./ags/audio/file/ags_ipatch_gig_reader.c ./ags/audio/file/ags_ipatch_sample.c ./ags/audio/file/ags_ipatch_sf2_reader.c ./ags/audio/file/ags_sfz_file.c ./ags/audio/file/ags_sfz_group.c ./ags/audio/file/ags_sfz_region.c ./ags/audio/file/ags_sfz_sample.c ./ags/audio/file/ags_sndfile.c ./ags/audio/file/ags_sound_container.c ./ags/audio/file/ags_sound_resource.c ./ags/audio/jack/ags_jack_client.c ./ags/audio/jack/ags_jack_devin.c ./ags/audio/jack/ags_jack_devout.c ./ags/audio/jack/ags_jack_midiin.c ./ags/audio/jack/ags_jack_port.c ./ags/audio/jack/ags_jack_server.c ./ags/audio/midi/ags_midi_buffer_util.c ./ags/audio/midi/ags_midi_builder.c ./ags/audio/midi/ags_midi_file.c ./ags/audio/midi/ags_midi_parser.c ./ags/audio/midi/ags_midi_util.c ./ags/audio/osc/ags_osc_buffer_util.c ./ags/audio/osc/ags_osc_builder.c ./ags/audio/osc/ags_osc_client.c ./ags/audio/osc/ags_osc_connection.c ./ags/audio/osc/ags_osc_message.c ./ags/audio/osc/ags_osc_parser.c ./ags/audio/osc/ags_osc_response.c ./ags/audio/osc/ags_osc_server.c ./ags/audio/osc/ags_osc_util.c ./ags/audio/osc/ags_osc_websocket_connection.c ./ags/audio/osc/ags_osc_xmlrpc_message.c ./ags/audio/osc/ags_osc_xmlrpc_server.c ./ags/audio/osc/controller/ags_osc_action_controller.c ./ags/audio/osc/controller/ags_osc_config_controller.c ./ags/audio/osc/controller/ags_osc_controller.c ./ags/audio/osc/controller/ags_osc_export_controller.c ./ags/audio/osc/controller/ags_osc_front_controller.c ./ags/audio/osc/controller/ags_osc_info_controller.c ./ags/audio/osc/controller/ags_osc_meter_controller.c ./ags/audio/osc/controller/ags_osc_node_controller.c ./ags/audio/osc/controller/ags_osc_plugin_controller.c ./ags/audio/osc/controller/ags_osc_renew_controller.c ./ags/audio/osc/controller/ags_osc_status_controller.c ./ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c ./ags/audio/pulse/ags_pulse_client.c ./ags/audio/pulse/ags_pulse_devin.c ./ags/audio/pulse/ags_pulse_devout.c ./ags/audio/pulse/ags_pulse_port.c ./ags/audio/pulse/ags_pulse_server.c ./ags/audio/recall/ags_analyse_audio_signal.c ./ags/audio/recall/ags_analyse_channel.c ./ags/audio/recall/ags_analyse_channel_run.c ./ags/audio/recall/ags_analyse_recycling.c ./ags/audio/recall/ags_buffer_audio_signal.c ./ags/audio/recall/ags_buffer_channel.c ./ags/audio/recall/ags_buffer_channel_run.c ./ags/audio/recall/ags_buffer_recycling.c ./ags/audio/recall/ags_capture_wave_audio.c ./ags/audio/recall/ags_capture_wave_audio_run.c ./ags/audio/recall/ags_capture_wave_channel.c ./ags/audio/recall/ags_capture_wave_channel_run.c ./ags/audio/recall/ags_copy_audio_signal.c ./ags/audio/recall/ags_copy_channel.c ./ags/audio/recall/ags_copy_channel_run.c ./ags/audio/recall/ags_copy_pattern_audio.c ./ags/audio/recall/ags_copy_pattern_audio_run.c ./ags/audio/recall/ags_copy_pattern_channel.c ./ags/audio/recall/ags_copy_pattern_channel_run.c ./ags/audio/recall/ags_copy_recycling.c ./ags/audio/recall/ags_count_beats_audio.c ./ags/audio/recall/ags_count_beats_audio_run.c ./ags/audio/recall/ags_delay_audio.c ./ags/audio/recall/ags_delay_audio_run.c ./ags/audio/recall/ags_envelope_audio_signal.c ./ags/audio/recall/ags_envelope_channel.c ./ags/audio/recall/ags_envelope_channel_run.c ./ags/audio/recall/ags_envelope_recycling.c ./ags/audio/recall/ags_eq10_audio_signal.c ./ags/audio/recall/ags_eq10_channel.c ./ags/audio/recall/ags_eq10_channel_run.c ./ags/audio/recall/ags_eq10_recycling.c ./ags/audio/recall/ags_feed_audio_signal.c ./ags/audio/recall/ags_feed_channel.c ./ags/audio/recall/ags_feed_channel_run.c ./ags/audio/recall/ags_feed_recycling.c ./ags/audio/recall/ags_lfo_audio_signal.c ./ags/audio/recall/ags_lfo_channel.c ./ags/audio/recall/ags_lfo_channel_run.c ./ags/audio/recall/ags_lfo_recycling.c ./ags/audio/recall/ags_loop_channel.c ./ags/audio/recall/ags_loop_channel_run.c ./ags/audio/recall/ags_mute_audio.c ./ags/audio/recall/ags_mute_audio_run.c ./ags/audio/recall/ags_mute_audio_signal.c ./ags/audio/recall/ags_mute_channel.c ./ags/audio/recall/ags_mute_channel_run.c ./ags/audio/recall/ags_mute_recycling.c ./ags/audio/recall/ags_peak_audio_signal.c ./ags/audio/recall/ags_peak_channel.c ./ags/audio/recall/ags_peak_channel_run.c ./ags/audio/recall/ags_peak_recycling.c ./ags/audio/recall/ags_play_audio.c ./ags/audio/recall/ags_play_audio_signal.c ./ags/audio/recall/ags_play_channel.c ./ags/audio/recall/ags_play_channel_run.c ./ags/audio/recall/ags_play_channel_run_master.c ./ags/audio/recall/ags_play_dssi_audio.c ./ags/audio/recall/ags_play_dssi_audio_run.c ./ags/audio/recall/ags_play_lv2_audio.c ./ags/audio/recall/ags_play_lv2_audio_run.c ./ags/audio/recall/ags_play_notation_audio.c ./ags/audio/recall/ags_play_notation_audio_run.c ./ags/audio/recall/ags_play_recycling.c ./ags/audio/recall/ags_play_wave_audio.c ./ags/audio/recall/ags_play_wave_audio_run.c ./ags/audio/recall/ags_play_wave_channel.c ./ags/audio/recall/ags_play_wave_channel_run.c ./ags/audio/recall/ags_prepare_audio_signal.c ./ags/audio/recall/ags_prepare_channel.c ./ags/audio/recall/ags_prepare_channel_run.c ./ags/audio/recall/ags_prepare_recycling.c ./ags/audio/recall/ags_record_midi_audio.c ./ags/audio/recall/ags_record_midi_audio_run.c ./ags/audio/recall/ags_route_dssi_audio.c ./ags/audio/recall/ags_route_dssi_audio_run.c ./ags/audio/recall/ags_route_lv2_audio.c ./ags/audio/recall/ags_route_lv2_audio_run.c ./ags/audio/recall/ags_rt_stream_audio_signal.c ./ags/audio/recall/ags_rt_stream_channel.c ./ags/audio/recall/ags_rt_stream_channel_run.c ./ags/audio/recall/ags_rt_stream_recycling.c ./ags/audio/recall/ags_stream_audio_signal.c ./ags/audio/recall/ags_stream_channel.c ./ags/audio/recall/ags_stream_channel_run.c ./ags/audio/recall/ags_stream_recycling.c ./ags/audio/recall/ags_volume_audio_signal.c ./ags/audio/recall/ags_volume_channel.c ./ags/audio/recall/ags_volume_channel_run.c ./ags/audio/recall/ags_volume_recycling.c ./ags/audio/task/ags_add_audio.c ./ags/audio/task/ags_add_audio_signal.c ./ags/audio/task/ags_add_effect.c ./ags/audio/task/ags_add_note.c ./ags/audio/task/ags_add_soundcard.c ./ags/audio/task/ags_apply_bpm.c ./ags/audio/task/ags_apply_presets.c ./ags/audio/task/ags_apply_sequencer_length.c ./ags/audio/task/ags_apply_sound_config.c ./ags/audio/task/ags_apply_synth.c ./ags/audio/task/ags_apply_tact.c ./ags/audio/task/ags_cancel_audio.c ./ags/audio/task/ags_cancel_channel.c ./ags/audio/task/ags_clear_audio_signal.c ./ags/audio/task/ags_clear_buffer.c ./ags/audio/task/ags_crop_note.c ./ags/audio/task/ags_export_output.c ./ags/audio/task/ags_free_selection.c ./ags/audio/task/ags_link_channel.c ./ags/audio/task/ags_move_note.c ./ags/audio/task/ags_open_file.c ./ags/audio/task/ags_open_sf2_instrument.c ./ags/audio/task/ags_open_sf2_sample.c ./ags/audio/task/ags_open_single_file.c ./ags/audio/task/ags_open_wave.c ./ags/audio/task/ags_remove_audio.c ./ags/audio/task/ags_remove_audio_signal.c ./ags/audio/task/ags_remove_note.c ./ags/audio/task/ags_remove_soundcard.c ./ags/audio/task/ags_reset_amplitude.c ./ags/audio/task/ags_reset_note.c ./ags/audio/task/ags_reset_peak.c ./ags/audio/task/ags_resize_audio.c ./ags/audio/task/ags_seek_soundcard.c ./ags/audio/task/ags_set_audio_channels.c ./ags/audio/task/ags_set_buffer_size.c ./ags/audio/task/ags_set_device.c ./ags/audio/task/ags_set_format.c ./ags/audio/task/ags_set_muted.c ./ags/audio/task/ags_set_samplerate.c ./ags/audio/task/ags_start_audio.c ./ags/audio/task/ags_start_channel.c ./ags/audio/task/ags_start_sequencer.c ./ags/audio/task/ags_start_soundcard.c ./ags/audio/task/ags_stop_sequencer.c ./ags/audio/task/ags_stop_soundcard.c ./ags/audio/task/ags_switch_buffer_flag.c ./ags/audio/task/ags_tic_device.c ./ags/audio/task/ags_toggle_pattern_bit.c ./ags/audio/thread/ags_audio_loop.c ./ags/audio/thread/ags_audio_thread.c ./ags/audio/thread/ags_channel_thread.c ./ags/audio/thread/ags_export_thread.c ./ags/audio/thread/ags_sequencer_thread.c ./ags/audio/thread/ags_sf2_loader.c ./ags/audio/thread/ags_sfz_loader.c ./ags/audio/thread/ags_soundcard_thread.c ./ags/audio/thread/ags_wave_loader.c ./ags/audio/wasapi/ags_wasapi_devin.c ./ags/audio/wasapi/ags_wasapi_devout.c ./ags/file/ags_file.c ./ags/file/ags_file_id_ref.c ./ags/file/ags_file_launch.c ./ags/file/ags_file_link.c ./ags/file/ags_file_lookup.c ./ags/lib/ags_buffer_util.c ./ags/lib/ags_complex.c ./ags/lib/ags_conversion.c ./ags/lib/ags_endian.c ./ags/lib/ags_function.c ./ags/lib/ags_log.c ./ags/lib/ags_regex.c ./ags/lib/ags_solver_matrix.c ./ags/lib/ags_solver_vector.c ./ags/lib/ags_string_util.c ./ags/lib/ags_time.c ./ags/lib/ags_turtle.c ./ags/lib/ags_turtle_manager.c ./ags/lib/ags_uuid.c ./ags/object/ags_applicable.c ./ags/object/ags_application_context.c ./ags/object/ags_config.c ./ags/object/ags_connectable.c ./ags/object/ags_countable.c ./ags/object/ags_cursor.c ./ags/object/ags_globals.c ./ags/object/ags_main_loop.c ./ags/object/ags_marshal.c ./ags/object/ags_mutable.c ./ags/object/ags_plugin.c ./ags/object/ags_portlet.c ./ags/object/ags_priority.c ./ags/object/ags_seekable.c ./ags/object/ags_sequencer.c ./ags/object/ags_sound_server.c ./ags/object/ags_soundcard.c ./ags/object/ags_tactable.c ./ags/plugin/ags_base_plugin.c ./ags/plugin/ags_dssi_manager.c ./ags/plugin/ags_dssi_plugin.c ./ags/plugin/ags_ladspa_conversion.c ./ags/plugin/ags_ladspa_manager.c ./ags/plugin/ags_ladspa_plugin.c ./ags/plugin/ags_lv2_conversion.c ./ags/plugin/ags_lv2_event_manager.c ./ags/plugin/ags_lv2_log_manager.c ./ags/plugin/ags_lv2_manager.c ./ags/plugin/ags_lv2_option_manager.c ./ags/plugin/ags_lv2_plugin.c ./ags/plugin/ags_lv2_preset.c ./ags/plugin/ags_lv2_preset_manager.c ./ags/plugin/ags_lv2_turtle_parser.c ./ags/plugin/ags_lv2_uri_map_manager.c ./ags/plugin/ags_lv2_urid_manager.c ./ags/plugin/ags_lv2_worker.c ./ags/plugin/ags_lv2_worker_manager.c ./ags/plugin/ags_lv2ui_manager.c ./ags/plugin/ags_lv2ui_plugin.c ./ags/plugin/ags_plugin_port.c ./ags/server/ags_registry.c ./ags/server/ags_server.c ./ags/server/ags_server_application_context.c ./ags/server/ags_server_status.c ./ags/server/ags_service_provider.c ./ags/server/controller/ags_controller.c ./ags/server/controller/ags_front_controller.c ./ags/server/controller/ags_plugin_controller.c ./ags/server/security/ags_auth_security_context.c ./ags/server/security/ags_authentication.c ./ags/server/security/ags_authentication_manager.c ./ags/server/security/ags_business_group.c ./ags/server/security/ags_business_group_manager.c ./ags/server/security/ags_certificate.c ./ags/server/security/ags_certificate_manager.c ./ags/server/security/ags_password_store.c ./ags/server/security/ags_password_store_manager.c ./ags/server/security/ags_security_context.c ./ags/server/security/ags_xml_authentication.c ./ags/server/security/ags_xml_business_group.c ./ags/server/security/ags_xml_certificate.c ./ags/server/security/ags_xml_password_store.c ./ags/thread/ags_concurrency_provider.c ./ags/thread/ags_destroy_worker.c ./ags/thread/ags_generic_main_loop.c ./ags/thread/ags_message_delivery.c ./ags/thread/ags_message_envelope.c ./ags/thread/ags_message_queue.c ./ags/thread/ags_returnable_thread.c ./ags/thread/ags_task.c ./ags/thread/ags_task_completion.c ./ags/thread/ags_task_launcher.c ./ags/thread/ags_thread.c ./ags/thread/ags_thread_application_context.c ./ags/thread/ags_thread_pool.c ./ags/thread/ags_timestamp.c ./ags/thread/ags_worker_thread.c ./ags/util/ags_destroy_util.c ./ags/util/ags_id_generator.c ./ags/util/ags_list_util.c ./ags/util/ags_soundcard_helper.c ./ags/widget/ags_cartesian.c ./ags/widget/ags_container.c ./ags/widget/ags_dial.c ./ags/widget/ags_expander.c ./ags/widget/ags_expander_set.c ./ags/widget/ags_hindicator.c ./ags/widget/ags_hled_array.c ./ags/widget/ags_hlevel_box.c ./ags/widget/ags_hscale_box.c ./ags/widget/ags_indicator.c ./ags/widget/ags_led.c ./ags/widget/ags_led_array.c ./ags/widget/ags_level.c ./ags/widget/ags_level_box.c ./ags/widget/ags_notebook.c ./ags/widget/ags_piano.c ./ags/widget/ags_ruler.c ./ags/widget/ags_scale.c ./ags/widget/ags_scale_box.c ./ags/widget/ags_scrolled_level_box.c ./ags/widget/ags_scrolled_piano.c ./ags/widget/ags_scrolled_scale_box.c ./ags/widget/ags_vindicator.c ./ags/widget/ags_vled_array.c ./ags/widget/ags_vlevel_box.c ./ags/widget/ags_vscale_box.c ./ags/widget/ags_widget_marshal.c gsequencer-3.1.3/po/Rules-quot0000644000175000017500000000423313556560122013230 00000000000000# This file, Rules-quot, can be copied and used freely without restrictions. # Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \ | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \ { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \ $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \ ;; \ *) \ $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \ ;; \ esac } 2>/dev/null > $$tmpdir/$$lang.new.po \ ; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header gsequencer-3.1.3/po/gsequencer.pot0000644000175000017500000007226113622252265014120 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Joël Krähemann # This file is distributed under the same license as the gsequencer package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gsequencer 3.1.3\n" "Report-Msgid-Bugs-To: jkraehemann@gmail.com\n" "POT-Creation-Date: 2020-02-16 15:41+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ags/X/ags_audio_preferences.c:188 msgid "JACK driver" msgstr "" #: ags/X/ags_audio_preferences.c:204 msgid "JACK server" msgstr "" #: ags/X/ags_audio_preferences.c:220 msgid "start" msgstr "" #: ags/X/ags_audio_preferences.c:226 msgid "stop" msgstr "" #: ags/X/ags_automation_editor.c:273 msgid "automation" msgstr "" #: ags/X/ags_automation_editor.c:313 ags/X/ags_preferences.c:182 msgid "audio" msgstr "" #: ags/X/ags_automation_editor.c:407 ags/X/ags_connection_editor.c:424 #: ags/X/ags_machine_editor.c:224 msgid "output" msgstr "" #: ags/X/ags_automation_editor.c:432 ags/X/ags_automation_editor.c:539 #: ags/X/ags_wave_editor.c:309 msgid "line" msgstr "" #: ags/X/ags_automation_editor.c:514 ags/X/ags_connection_editor.c:444 #: ags/X/ags_machine_editor.c:231 ags/X/machine/ags_audiorec.c:277 msgid "input" msgstr "" #: ags/X/ags_bulk_member.c:649 ags/X/machine/ags_dssi_bridge.c:365 #: ags/X/machine/ags_live_dssi_bridge.c:368 msgid "Plugin file not present" msgstr "" #: ags/X/ags_connection_editor.c:206 msgid "connections" msgstr "" #: ags/X/ags_connection_editor.c:459 msgid "connect output" msgstr "" #: ags/X/ags_connection_editor.c:473 msgid "connect input" msgstr "" #: ags/X/ags_context_menu.c:126 ags/X/ags_menu_bar.c:123 msgid "_File" msgstr "" #: ags/X/ags_context_menu.c:132 ags/X/ags_menu_bar.c:129 msgid "_Open" msgstr "" #: ags/X/ags_context_menu.c:135 ags/X/ags_menu_bar.c:132 msgid "_Save" msgstr "" #: ags/X/ags_context_menu.c:138 ags/X/ags_menu_bar.c:135 msgid "Save as" msgstr "" #: ags/X/ags_context_menu.c:144 ags/X/ags_export_window.c:328 #: ags/X/ags_machine.c:3358 ags/X/ags_menu_bar.c:141 msgid "export" msgstr "" #: ags/X/ags_context_menu.c:150 ags/X/ags_menu_bar.c:147 msgid "_Quit" msgstr "" #: ags/X/ags_context_menu.c:154 ags/X/ags_menu_bar.c:151 msgid "_Edit" msgstr "" #: ags/X/ags_context_menu.c:166 ags/X/ags_menu_bar.c:163 msgid "Add" msgstr "" #: ags/X/ags_context_menu.c:172 ags/X/ags_menu_bar.c:169 msgid "Panel" msgstr "" #: ags/X/ags_context_menu.c:175 ags/X/ags_menu_bar.c:172 msgid "Mixer" msgstr "" #: ags/X/ags_context_menu.c:178 ags/X/ags_menu_bar.c:175 msgid "Spectrometer" msgstr "" #: ags/X/ags_context_menu.c:181 ags/X/ags_menu_bar.c:178 msgid "Equalizer" msgstr "" #: ags/X/ags_context_menu.c:184 ags/X/ags_menu_bar.c:181 msgid "Drum" msgstr "" #: ags/X/ags_context_menu.c:187 ags/X/ags_menu_bar.c:184 msgid "Matrix" msgstr "" #: ags/X/ags_context_menu.c:190 ags/X/ags_menu_bar.c:187 msgid "Synth" msgstr "" #: ags/X/ags_context_menu.c:193 ags/X/ags_menu_bar.c:190 msgid "FM Synth" msgstr "" #: ags/X/ags_context_menu.c:196 ags/X/ags_menu_bar.c:193 msgid "Syncsynth" msgstr "" #: ags/X/ags_context_menu.c:199 ags/X/ags_menu_bar.c:196 msgid "FM Syncsynth" msgstr "" #: ags/X/ags_context_menu.c:203 ags/X/ags_menu_bar.c:200 msgid "FPlayer" msgstr "" #: ags/X/ags_context_menu.c:207 ags/X/ags_menu_bar.c:204 msgid "Sampler" msgstr "" #: ags/X/ags_context_menu.c:210 ags/X/ags_menu_bar.c:207 msgid "Audiorec" msgstr "" #: ags/X/ags_context_menu.c:214 ags/X/ags_menu_bar.c:211 msgid "Automation" msgstr "" #: ags/X/ags_context_menu.c:220 ags/X/ags_menu_bar.c:217 msgid "Wave" msgstr "" #: ags/X/ags_context_menu.c:229 ags/X/ags_menu_bar.c:226 msgid "Preferences" msgstr "" #: ags/X/ags_context_menu.c:239 ags/X/ags_machine.c:3399 #: ags/X/ags_menu_bar.c:236 msgid "import" msgstr "" #: ags/X/ags_context_menu.c:242 ags/X/ags_menu_bar.c:239 msgid "export track" msgstr "" #: ags/X/ags_context_menu.c:248 ags/X/ags_menu_bar.c:245 msgid "playback" msgstr "" #: ags/X/ags_context_menu.c:254 ags/X/ags_menu_bar.c:251 msgid "_Help" msgstr "" #: ags/X/ags_context_menu.c:260 ags/X/ags_menu_bar.c:257 msgid "Online help" msgstr "" #: ags/X/ags_context_menu.c:263 ags/X/ags_menu_bar.c:260 msgid "About" msgstr "" #: ags/X/ags_dssi_browser.c:152 ags/X/ags_ladspa_browser.c:145 #: ags/X/ags_lv2_browser.c:149 ags/X/machine/ags_audiorec.c:216 msgid "filename: " msgstr "" #: ags/X/ags_dssi_browser.c:181 ags/X/ags_ladspa_browser.c:188 #: ags/X/ags_lv2_browser.c:192 msgid "effect: " msgstr "" #: ags/X/ags_dssi_browser.c:204 ags/X/ags_ladspa_browser.c:210 msgid "Label: " msgstr "" #: ags/X/ags_dssi_browser.c:214 ags/X/ags_ladspa_browser.c:220 msgid "Maker: " msgstr "" #: ags/X/ags_dssi_browser.c:224 ags/X/ags_ladspa_browser.c:230 msgid "Copyright: " msgstr "" #: ags/X/ags_dssi_browser.c:233 ags/X/ags_ladspa_browser.c:239 msgid "Ports: " msgstr "" #: ags/X/ags_dssi_browser_callbacks.c:147 #: ags/X/ags_dssi_browser_callbacks.c:224 #: ags/X/ags_ladspa_browser_callbacks.c:147 #: ags/X/ags_ladspa_browser_callbacks.c:224 msgid "Label" msgstr "" #: ags/X/ags_dssi_browser_callbacks.c:156 #: ags/X/ags_dssi_browser_callbacks.c:231 #: ags/X/ags_ladspa_browser_callbacks.c:156 #: ags/X/ags_ladspa_browser_callbacks.c:231 msgid "Maker" msgstr "" #: ags/X/ags_dssi_browser_callbacks.c:165 #: ags/X/ags_dssi_browser_callbacks.c:238 #: ags/X/ags_ladspa_browser_callbacks.c:165 #: ags/X/ags_ladspa_browser_callbacks.c:238 msgid "Copyright" msgstr "" #: ags/X/ags_effect_line.c:498 ags/X/ags_line.c:533 msgid "group" msgstr "" #: ags/X/ags_effect_line.c:868 ags/X/ags_effect_line.c:874 ags/X/ags_line.c:967 #: ags/X/ags_line.c:973 ags/X/ags_notation_editor.c:334 msgid "channel" msgstr "" #: ags/X/ags_export_soundcard.c:167 ags/X/ags_sequencer_editor.c:146 #: ags/X/ags_soundcard_editor.c:159 msgid "backend" msgstr "" #: ags/X/ags_export_soundcard.c:220 ags/X/ags_input_collection_editor.c:243 #: ags/X/ags_output_collection_editor.c:243 ags/X/ags_soundcard_editor.c:214 msgid "soundcard" msgstr "" #: ags/X/ags_export_soundcard.c:240 ags/X/export/ags_wave_export_dialog.c:208 #: ags/X/machine/ags_audiorec.c:197 ags/X/machine/ags_pitch_sampler.c:226 msgid "file" msgstr "" #: ags/X/ags_export_soundcard.c:268 ags/X/export/ags_wave_export_dialog.c:225 msgid "open" msgstr "" #: ags/X/ags_export_soundcard.c:275 ags/X/export/ags_wave_export_dialog.c:310 msgid "output format" msgstr "" #: ags/X/ags_export_window.c:172 msgid "export to audio data" msgstr "" #: ags/X/ags_export_window.c:194 msgid "live export" msgstr "" #: ags/X/ags_export_window.c:206 ags/X/ags_navigation.c:298 msgid "exclude sequencers" msgstr "" #: ags/X/ags_export_window.c:222 msgid "mode" msgstr "" #: ags/X/ags_export_window.c:249 msgid "tact" msgstr "" #: ags/X/ags_export_window.c:271 msgid "time" msgstr "" #: ags/X/ags_generic_preferences.c:141 msgid "autosave thread" msgstr "" #: ags/X/ags_generic_preferences.c:155 msgid "segmentation" msgstr "" #: ags/X/ags_generic_preferences.c:179 msgid "engine mode" msgstr "" #: ags/X/ags_generic_preferences.c:199 msgid "rt-safe" msgstr "" #: ags/X/ags_generic_preferences.c:213 msgid "GUI scale factor" msgstr "" #: ags/X/ags_input_collection_editor.c:195 #: ags/X/ags_link_collection_editor.c:249 #: ags/X/ags_output_collection_editor.c:195 msgid "first line" msgstr "" #: ags/X/ags_input_collection_editor.c:219 #: ags/X/ags_link_collection_editor.c:302 #: ags/X/ags_output_collection_editor.c:219 msgid "count" msgstr "" #: ags/X/ags_input_collection_editor.c:265 #: ags/X/ags_output_collection_editor.c:265 #: ags/X/editor/ags_envelope_info.c:216 msgid "audio channel" msgstr "" #: ags/X/ags_link_collection_editor.c:202 msgid "link" msgstr "" #: ags/X/ags_link_collection_editor.c:276 msgid "first link line" msgstr "" #: ags/X/ags_link_editor_callbacks.c:184 msgid "select audio file" msgstr "" #: ags/X/ags_link_editor_callbacks.c:199 msgid "audio channel: " msgstr "" #: ags/X/ags_lv2_browser.c:212 ags/X/ags_lv2_browser_callbacks.c:174 #: ags/X/ags_lv2_browser_callbacks.c:297 msgid "Name" msgstr "" #: ags/X/ags_lv2_browser.c:225 ags/X/ags_lv2_browser_callbacks.c:184 #: ags/X/ags_lv2_browser_callbacks.c:306 msgid "Homepage" msgstr "" #: ags/X/ags_lv2_browser.c:238 ags/X/ags_lv2_browser_callbacks.c:194 #: ags/X/ags_lv2_browser_callbacks.c:315 msgid "M-Box" msgstr "" #: ags/X/ags_lv2_browser.c:251 ags/X/ags_lv2_browser_callbacks.c:205 #: ags/X/ags_lv2_browser_callbacks.c:324 msgid "Ports" msgstr "" #: ags/X/ags_machine.c:2640 ags/X/machine/ags_audiorec_callbacks.c:64 #: ags/X/machine/ags_pitch_sampler_callbacks.c:65 msgid "Open audio files" msgstr "" #: ags/X/ags_machine.c:2648 msgid "open in new channel" msgstr "" #: ags/X/ags_machine.c:2653 msgid "overwrite existing links" msgstr "" #: ags/X/ags_machine.c:3164 ags/X/editor/ags_pattern_envelope.c:656 msgid "move up" msgstr "" #: ags/X/ags_machine.c:3167 ags/X/editor/ags_pattern_envelope.c:663 msgid "move down" msgstr "" #: ags/X/ags_machine.c:3170 msgid "hide" msgstr "" #: ags/X/ags_machine.c:3173 msgid "show" msgstr "" #: ags/X/ags_machine.c:3176 msgid "destroy" msgstr "" #: ags/X/ags_machine.c:3179 ags/X/ags_machine_callbacks.c:213 msgid "rename" msgstr "" #: ags/X/ags_machine.c:3182 ags/X/ags_machine_callbacks.c:277 msgid "rename audio" msgstr "" #: ags/X/ags_machine.c:3185 ags/X/ags_machine_callbacks.c:360 msgid "reposition audio" msgstr "" #: ags/X/ags_machine.c:3188 ags/X/ags_machine_editor.c:203 msgid "properties" msgstr "" #: ags/X/ags_machine.c:3191 msgid "sticky controls" msgstr "" #: ags/X/ags_machine.c:3257 ags/X/editor/ags_pattern_envelope.c:225 #: ags/X/machine/ags_drum_input_pad.c:159 msgid "edit" msgstr "" #: ags/X/ags_machine.c:3268 msgid "copy pattern" msgstr "" #: ags/X/ags_machine.c:3278 msgid "paste pattern" msgstr "" #: ags/X/ags_machine.c:3288 msgid "envelope" msgstr "" #: ags/X/ags_machine.c:3317 msgid "connection" msgstr "" #: ags/X/ags_machine.c:3328 msgid "audio connection" msgstr "" #: ags/X/ags_machine.c:3338 msgid "MIDI dialog" msgstr "" #: ags/X/ags_machine.c:3369 msgid "MIDI export" msgstr "" #: ags/X/ags_machine.c:3379 msgid "Audio export" msgstr "" #: ags/X/ags_machine.c:3410 msgid "MIDI import" msgstr "" #: ags/X/ags_machine.c:3420 msgid "Audio import" msgstr "" #: ags/X/ags_machine_editor.c:239 msgid "link output" msgstr "" #: ags/X/ags_machine_editor.c:246 msgid "link input" msgstr "" #: ags/X/ags_machine_editor.c:252 msgid "resize channels" msgstr "" #: ags/X/ags_midi_dialog.c:210 msgid "midi channel" msgstr "" #: ags/X/ags_midi_dialog.c:253 msgid "audio start mapping" msgstr "" #: ags/X/ags_midi_dialog.c:275 msgid "audio end mapping" msgstr "" #: ags/X/ags_midi_dialog.c:297 msgid "midi start mapping" msgstr "" #: ags/X/ags_midi_dialog.c:319 msgid "midi end mapping" msgstr "" #: ags/X/ags_midi_dialog.c:355 msgid "midi device" msgstr "" #: ags/X/ags_navigation.c:203 msgid "bpm" msgstr "" #: ags/X/ags_navigation.c:243 ags/X/machine/ags_drum.c:277 msgid "loop" msgstr "" #: ags/X/ags_navigation.c:276 msgid "loop L" msgstr "" #: ags/X/ags_navigation.c:282 msgid "loop R" msgstr "" #: ags/X/ags_notation_editor.c:302 msgid "notation" msgstr "" #: ags/X/ags_osc_server_preferences.c:145 msgid "Note: the fields below are applied immediately" msgstr "" #: ags/X/ags_osc_server_preferences.c:162 msgid "auto-start OSC server" msgstr "" #: ags/X/ags_osc_server_preferences.c:180 msgid "start OSC server" msgstr "" #: ags/X/ags_osc_server_preferences.c:186 msgid "stop OSC server" msgstr "" #: ags/X/ags_osc_server_preferences.c:193 msgid "listen on any address" msgstr "" #: ags/X/ags_osc_server_preferences.c:202 msgid "enable IPv4" msgstr "" #: ags/X/ags_osc_server_preferences.c:212 msgid "IPv4 address" msgstr "" #: ags/X/ags_osc_server_preferences.c:233 msgid "enable IPv6" msgstr "" #: ags/X/ags_osc_server_preferences.c:243 msgid "IPv6 address" msgstr "" #: ags/X/ags_osc_server_preferences.c:265 ags/X/ags_server_preferences.c:171 msgid "port" msgstr "" #: ags/X/ags_osc_server_preferences.c:291 msgid "monitor timeout" msgstr "" #: ags/X/ags_pad_editor.c:461 msgid "pad" msgstr "" #: ags/X/ags_performance_preferences.c:134 msgid "Auto-sense on stream" msgstr "" #: ags/X/ags_performance_preferences.c:141 msgid "Super threaded - audio" msgstr "" #: ags/X/ags_performance_preferences.c:148 msgid "Super threaded - channel" msgstr "" #: ags/X/ags_performance_preferences.c:162 msgid "thread pool - max unused threads" msgstr "" #: ags/X/ags_performance_preferences.c:184 msgid "max precision of threads [Hz]" msgstr "" #: ags/X/ags_plugin_browser.c:158 msgid "Plugin type:" msgstr "" #: ags/X/ags_preferences.c:155 msgid "preferences" msgstr "" #: ags/X/ags_preferences.c:173 msgid "generic" msgstr "" #: ags/X/ags_preferences.c:191 msgid "midi" msgstr "" #: ags/X/ags_preferences.c:200 msgid "performance" msgstr "" #: ags/X/ags_preferences.c:213 msgid "OSC server" msgstr "" #: ags/X/ags_preferences.c:224 msgid "server" msgstr "" #: ags/X/ags_property_editor.c:102 ags/X/editor/ags_envelope_editor.c:157 #: ags/X/export/ags_machine_collection_entry.c:177 #: ags/X/import/ags_track_collection_mapper.c:224 msgid "enabled" msgstr "" #: ags/X/ags_resize_editor.c:152 ags/X/ags_soundcard_editor.c:300 msgid "audio channels" msgstr "" #: ags/X/ags_resize_editor.c:179 msgid "outputs" msgstr "" #: ags/X/ags_resize_editor.c:206 msgid "inputs" msgstr "" #: ags/X/ags_sequencer_editor.c:182 msgid "MIDI card" msgstr "" #: ags/X/ags_server_preferences.c:137 msgid "start server" msgstr "" #: ags/X/ags_server_preferences.c:149 msgid "address" msgstr "" #: ags/X/ags_server_preferences.c:193 msgid "username" msgstr "" #: ags/X/ags_server_preferences.c:215 msgid "password" msgstr "" #: ags/X/ags_soundcard_editor.c:264 msgid "capability" msgstr "" #: ags/X/ags_soundcard_editor.c:324 msgid "samplerate" msgstr "" #: ags/X/ags_soundcard_editor.c:347 msgid "buffer size" msgstr "" #: ags/X/ags_soundcard_editor.c:371 msgid "format" msgstr "" #: ags/X/ags_soundcard_editor.c:406 msgid "use cache" msgstr "" #: ags/X/ags_soundcard_editor.c:420 msgid "cache buffer size" msgstr "" #: ags/X/ags_soundcard_editor.c:465 msgid "WASAPI share mode" msgstr "" #: ags/X/ags_soundcard_editor.c:493 msgid "WASAPI buffer size" msgstr "" #: ags/X/ags_wave_editor.c:271 ags/X/machine/ags_fm_oscillator.c:158 #: ags/X/machine/ags_oscillator.c:152 msgid "wave" msgstr "" #: ags/X/ags_window_callbacks.c:121 ags/X/ags_window_callbacks.c:149 msgid "LADSPA" msgstr "" #: ags/X/ags_window_callbacks.c:125 ags/X/ags_window_callbacks.c:140 #: ags/X/ags_window_callbacks.c:153 ags/X/ags_window_callbacks.c:168 msgid "DSSI" msgstr "" #: ags/X/ags_window_callbacks.c:129 ags/X/ags_window_callbacks.c:144 #: ags/X/ags_window_callbacks.c:157 ags/X/ags_window_callbacks.c:172 msgid "Lv2" msgstr "" #: ags/X/ags_xorg_application_context.c:3303 #: ags/audio/ags_audio_application_context.c:2137 #: ags/audio/task/ags_apply_sound_config.c:894 #, c-format msgid "unknown soundcard backend - %s" msgstr "" #: ags/X/ags_xorg_application_context.c:3313 #: ags/audio/ags_audio_application_context.c:2147 #: ags/audio/task/ags_apply_sound_config.c:904 msgid "unknown soundcard backend - NULL" msgstr "" #: ags/X/ags_xorg_application_context.c:3555 #: ags/audio/ags_audio_application_context.c:2389 #: ags/audio/task/ags_apply_sound_config.c:1144 #, c-format msgid "unknown sequencer backend - %s" msgstr "" #: ags/X/ags_xorg_application_context.c:3565 #: ags/audio/ags_audio_application_context.c:2399 #: ags/audio/task/ags_apply_sound_config.c:1154 msgid "unknown sequencer backend - NULL" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:127 #: ags/X/editor/ags_notation_toolbar.c:123 ags/X/editor/ags_sheet_toolbar.c:109 #: ags/X/editor/ags_wave_toolbar.c:126 msgid "Position" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:165 #: ags/X/editor/ags_notation_toolbar.c:162 ags/X/editor/ags_sheet_toolbar.c:180 #: ags/X/editor/ags_wave_toolbar.c:139 msgid "Select" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:235 #: ags/X/editor/ags_notation_toolbar.c:246 ags/X/editor/ags_wave_toolbar.c:203 msgid "Tool" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:263 #: ags/X/editor/ags_notation_toolbar.c:274 ags/X/editor/ags_wave_toolbar.c:232 msgid "Zoom" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:289 msgid "Port" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:339 #: ags/X/editor/ags_notation_toolbar.c:299 ags/X/editor/ags_wave_toolbar.c:257 msgid "Opacity" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:1310 #: ags/X/editor/ags_select_acceleration_dialog.c:188 msgid "select accelerations" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:1313 #: ags/X/editor/ags_ramp_acceleration_dialog.c:187 msgid "ramp accelerations" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:1316 #: ags/X/editor/ags_notation_toolbar.c:533 ags/X/editor/ags_wave_toolbar.c:437 msgid "position cursor" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:1322 #: ags/X/editor/ags_wave_toolbar.c:443 msgid "enable all lines" msgstr "" #: ags/X/editor/ags_automation_toolbar.c:1325 #: ags/X/editor/ags_wave_toolbar.c:446 msgid "disable all lines" msgstr "" #: ags/X/editor/ags_crop_note_dialog.c:185 #: ags/X/editor/ags_notation_toolbar.c:527 msgid "crop notes" msgstr "" #: ags/X/editor/ags_crop_note_dialog.c:195 #: ags/X/editor/ags_move_note_dialog.c:204 msgid "absolute" msgstr "" #: ags/X/editor/ags_crop_note_dialog.c:203 msgid "in-place" msgstr "" #: ags/X/editor/ags_crop_note_dialog.c:211 msgid "do resize" msgstr "" #: ags/X/editor/ags_crop_note_dialog.c:225 msgid "crop note" msgstr "" #: ags/X/editor/ags_crop_note_dialog.c:250 msgid "padding note" msgstr "" #: ags/X/editor/ags_envelope_dialog.c:174 msgid "Envelope" msgstr "" #: ags/X/editor/ags_envelope_dialog.c:200 msgid "editor" msgstr "" #: ags/X/editor/ags_envelope_dialog.c:211 msgid "info" msgstr "" #: ags/X/editor/ags_envelope_dialog.c:453 ags/X/machine/ags_drum.c:268 msgid "pattern" msgstr "" #: ags/X/editor/ags_envelope_editor.c:167 #: ags/X/editor/ags_pattern_envelope.c:239 ags/X/machine/ags_ffplayer.c:276 #: ags/X/machine/ags_live_lv2_bridge.c:1537 ags/X/machine/ags_lv2_bridge.c:1858 msgid "preset" msgstr "" #: ags/X/editor/ags_envelope_editor.c:282 #: ags/X/editor/ags_pattern_envelope.c:453 #: ags/X/machine/ags_fm_oscillator.c:215 ags/X/machine/ags_oscillator.c:207 msgid "attack" msgstr "" #: ags/X/editor/ags_envelope_editor.c:324 #: ags/X/editor/ags_pattern_envelope.c:495 msgid "decay" msgstr "" #: ags/X/editor/ags_envelope_editor.c:366 #: ags/X/editor/ags_pattern_envelope.c:537 msgid "sustain" msgstr "" #: ags/X/editor/ags_envelope_editor.c:408 #: ags/X/editor/ags_pattern_envelope.c:579 msgid "release" msgstr "" #: ags/X/editor/ags_envelope_editor.c:450 #: ags/X/editor/ags_pattern_envelope.c:621 msgid "ratio" msgstr "" #: ags/X/editor/ags_envelope_editor_callbacks.c:48 #: ags/X/editor/ags_pattern_envelope_callbacks.c:1049 msgid "preset name" msgstr "" #: ags/X/editor/ags_envelope_info.c:209 ags/X/editor/ags_pattern_envelope.c:232 msgid "plot" msgstr "" #: ags/X/editor/ags_envelope_info.c:223 msgid "Note:x0" msgstr "" #: ags/X/editor/ags_envelope_info.c:230 msgid "Note:x1" msgstr "" #: ags/X/editor/ags_envelope_info.c:237 msgid "Note:y" msgstr "" #: ags/X/editor/ags_machine_selection.c:134 msgid "select machines" msgstr "" #: ags/X/editor/ags_machine_selector.c:445 msgid "add index" msgstr "" #: ags/X/editor/ags_machine_selector.c:448 msgid "remove index" msgstr "" #: ags/X/editor/ags_machine_selector.c:451 msgid "link index" msgstr "" #: ags/X/editor/ags_machine_selector.c:455 msgid "reverse mapping" msgstr "" #: ags/X/editor/ags_machine_selector.c:462 msgid "shift piano" msgstr "" #: ags/X/editor/ags_move_note_dialog.c:185 #: ags/X/editor/ags_notation_toolbar.c:524 msgid "move notes" msgstr "" #: ags/X/editor/ags_move_note_dialog.c:196 msgid "relative" msgstr "" #: ags/X/editor/ags_move_note_dialog.c:218 msgid "move x" msgstr "" #: ags/X/editor/ags_move_note_dialog.c:243 msgid "move y" msgstr "" #: ags/X/editor/ags_notation_toolbar.c:205 ags/X/editor/ags_sheet_toolbar.c:208 msgid "match audio channel" msgstr "" #: ags/X/editor/ags_notation_toolbar.c:212 ags/X/editor/ags_sheet_toolbar.c:215 msgid "no duplicates" msgstr "" #: ags/X/editor/ags_notation_toolbar.c:234 msgid "Invert" msgstr "" #: ags/X/editor/ags_notation_toolbar.c:530 #: ags/X/editor/ags_select_note_dialog.c:184 msgid "select notes" msgstr "" #: ags/X/editor/ags_notation_toolbar.c:539 msgid "enable all audio channels" msgstr "" #: ags/X/editor/ags_notation_toolbar.c:542 msgid "disable all audio channels" msgstr "" #: ags/X/editor/ags_pattern_envelope.c:246 #: ags/X/editor/ags_pattern_envelope.c:307 msgid "audio channel start" msgstr "" #: ags/X/editor/ags_pattern_envelope.c:253 #: ags/X/editor/ags_pattern_envelope.c:330 msgid "audio channel end" msgstr "" #: ags/X/editor/ags_pattern_envelope.c:260 #: ags/X/editor/ags_pattern_envelope.c:353 msgid "pad start" msgstr "" #: ags/X/editor/ags_pattern_envelope.c:267 #: ags/X/editor/ags_pattern_envelope.c:376 msgid "pad end" msgstr "" #: ags/X/editor/ags_pattern_envelope.c:274 #: ags/X/editor/ags_pattern_envelope.c:399 msgid "x start" msgstr "" #: ags/X/editor/ags_pattern_envelope.c:281 #: ags/X/editor/ags_pattern_envelope.c:422 msgid "x end" msgstr "" #: ags/X/editor/ags_position_automation_cursor_dialog.c:190 msgid "position automation cursor" msgstr "" #: ags/X/editor/ags_position_automation_cursor_dialog.c:200 #: ags/X/editor/ags_position_notation_cursor_dialog.c:197 #: ags/X/editor/ags_position_wave_cursor_dialog.c:200 msgid "set focus" msgstr "" #: ags/X/editor/ags_position_automation_cursor_dialog.c:216 #: ags/X/editor/ags_position_notation_cursor_dialog.c:213 #: ags/X/editor/ags_position_wave_cursor_dialog.c:216 msgid "position x" msgstr "" #: ags/X/editor/ags_position_notation_cursor_dialog.c:187 msgid "position notation cursor" msgstr "" #: ags/X/editor/ags_position_notation_cursor_dialog.c:238 msgid "position y" msgstr "" #: ags/X/editor/ags_position_wave_cursor_dialog.c:190 msgid "position wave cursor" msgstr "" #: ags/X/editor/ags_ramp_acceleration_dialog.c:212 msgid "ramp x0" msgstr "" #: ags/X/editor/ags_ramp_acceleration_dialog.c:239 msgid "ramp y0" msgstr "" #: ags/X/editor/ags_ramp_acceleration_dialog.c:264 msgid "ramp x1" msgstr "" #: ags/X/editor/ags_ramp_acceleration_dialog.c:291 msgid "ramp y1" msgstr "" #: ags/X/editor/ags_ramp_acceleration_dialog.c:316 msgid "ramp step count" msgstr "" #: ags/X/editor/ags_select_acceleration_dialog.c:199 #: ags/X/editor/ags_select_buffer_dialog.c:198 #: ags/X/editor/ags_select_note_dialog.c:194 msgid "copy selection" msgstr "" #: ags/X/editor/ags_select_acceleration_dialog.c:230 #: ags/X/editor/ags_select_buffer_dialog.c:214 #: ags/X/editor/ags_select_note_dialog.c:210 msgid "select x0" msgstr "" #: ags/X/editor/ags_select_acceleration_dialog.c:257 #: ags/X/editor/ags_select_buffer_dialog.c:241 #: ags/X/editor/ags_select_note_dialog.c:260 msgid "select x1" msgstr "" #: ags/X/editor/ags_select_buffer_dialog.c:187 msgid "select buffers" msgstr "" #: ags/X/editor/ags_select_note_dialog.c:235 msgid "select y0" msgstr "" #: ags/X/editor/ags_select_note_dialog.c:285 msgid "select y1" msgstr "" #: ags/X/editor/ags_sheet_toolbar.c:123 msgid "1/1" msgstr "" #: ags/X/editor/ags_sheet_toolbar.c:130 msgid "1/2" msgstr "" #: ags/X/editor/ags_sheet_toolbar.c:137 msgid "1/4" msgstr "" #: ags/X/editor/ags_sheet_toolbar.c:144 msgid "1/8" msgstr "" #: ags/X/editor/ags_sheet_toolbar.c:151 msgid "1/16" msgstr "" #: ags/X/editor/ags_sheet_toolbar.c:158 msgid "1/32" msgstr "" #: ags/X/editor/ags_wave_toolbar.c:434 msgid "select audio data" msgstr "" #: ags/X/export/ags_machine_collection_entry.c:220 #: ags/X/import/ags_track_collection_mapper.c:253 msgid "sequence: " msgstr "" #: ags/X/export/ags_wave_export_dialog.c:195 msgid "Audio fast export" msgstr "" #: ags/X/export/ags_wave_export_dialog.c:239 msgid "start tact" msgstr "" #: ags/X/export/ags_wave_export_dialog.c:266 msgid "end tact" msgstr "" #: ags/X/import/ags_track_collection_mapper.c:243 msgid "instrument: " msgstr "" #: ags/X/import/ags_track_collection_mapper.c:340 #: ags/X/machine/ags_ffplayer.c:291 msgid "instrument" msgstr "" #: ags/X/import/ags_track_collection_mapper.c:373 msgid "sequence" msgstr "" #: ags/X/machine/ags_audiorec.c:238 ags/X/machine/ags_ffplayer.c:333 #: ags/X/machine/ags_pitch_sampler.c:274 msgid "loading ... " msgstr "" #: ags/X/machine/ags_desk.c:170 msgid "left" msgstr "" #: ags/X/machine/ags_desk.c:184 msgid "right" msgstr "" #: ags/X/machine/ags_desk_input_pad.c:163 msgid "grab" msgstr "" #: ags/X/machine/ags_drum.c:246 msgid "kit" msgstr "" #: ags/X/machine/ags_drum.c:257 msgid "default" msgstr "" #: ags/X/machine/ags_drum.c:284 msgid "run" msgstr "" #: ags/X/machine/ags_drum.c:342 ags/X/machine/ags_fm_oscillator.c:226 #: ags/X/machine/ags_oscillator.c:214 msgid "length" msgstr "" #: ags/X/machine/ags_drum_input_pad_callbacks.c:50 msgid "Open File" msgstr "" #: ags/X/machine/ags_drum_input_pad_callbacks.c:68 msgid "channel: " msgstr "" #: ags/X/machine/ags_dssi_bridge.c:293 ags/X/machine/ags_live_dssi_bridge.c:296 #: ags/X/machine/ags_live_lv2_bridge.c:1459 ags/X/machine/ags_lv2_bridge.c:1780 msgid "program" msgstr "" #: ags/X/machine/ags_equalizer10.c:171 msgid "28Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:197 msgid "56Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:223 msgid "112Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:249 msgid "224Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:275 msgid "448Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:301 msgid "896Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:327 msgid "1792Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:353 msgid "3584Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:379 msgid "7168Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:405 msgid "14336Hz" msgstr "" #: ags/X/machine/ags_equalizer10.c:431 msgid "pressure" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:192 ags/X/machine/ags_fm_oscillator.c:336 #: ags/X/machine/ags_oscillator.c:184 msgid "sawtooth" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:197 ags/X/machine/ags_fm_oscillator.c:341 #: ags/X/machine/ags_oscillator.c:189 msgid "square" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:202 ags/X/machine/ags_fm_oscillator.c:346 #: ags/X/machine/ags_oscillator.c:194 msgid "triangle" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:207 ags/X/machine/ags_fm_oscillator.c:351 #: ags/X/machine/ags_oscillator.c:199 msgid "impulse" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:234 ags/X/machine/ags_oscillator.c:221 msgid "phase" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:242 ags/X/machine/ags_oscillator.c:228 #: ags/X/machine/ags_pitch_sampler_file.c:169 msgid "frequency" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:255 ags/X/machine/ags_oscillator.c:240 msgid "volume" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:264 ags/X/machine/ags_oscillator.c:249 msgid "sync" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:303 msgid "LFO wave" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:359 msgid "LFO frequency" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:372 ags/X/machine/ags_pitch_sampler.c:341 msgid "LFO depth" msgstr "" #: ags/X/machine/ags_fm_oscillator.c:385 ags/X/machine/ags_pitch_sampler.c:362 msgid "LFO tuning" msgstr "" #: ags/X/machine/ags_fm_syncsynth.c:241 ags/X/machine/ags_fm_synth.c:188 #: ags/X/machine/ags_syncsynth.c:244 ags/X/machine/ags_synth.c:187 msgid "auto update" msgstr "" #: ags/X/machine/ags_fm_syncsynth.c:244 ags/X/machine/ags_fm_synth.c:191 #: ags/X/machine/ags_syncsynth.c:247 ags/X/machine/ags_synth.c:190 msgid "update" msgstr "" #: ags/X/machine/ags_fm_syncsynth.c:253 ags/X/machine/ags_fm_synth.c:200 #: ags/X/machine/ags_syncsynth.c:256 ags/X/machine/ags_synth.c:199 msgid "lower" msgstr "" #: ags/X/machine/ags_fm_syncsynth.c:278 #: ags/X/machine/ags_pitch_sampler_file.c:214 ags/X/machine/ags_syncsynth.c:283 msgid "loop start" msgstr "" #: ags/X/machine/ags_fm_syncsynth.c:298 #: ags/X/machine/ags_pitch_sampler_file.c:237 ags/X/machine/ags_syncsynth.c:303 msgid "loop end" msgstr "" #: ags/X/machine/ags_live_lv2_bridge.c:441 ags/X/machine/ags_lv2_bridge.c:419 msgid "show GUI" msgstr "" #: ags/X/machine/ags_pitch_sampler.c:293 msgid "enable LFO" msgstr "" #: ags/X/machine/ags_pitch_sampler.c:301 msgid "LFO freq" msgstr "" #: ags/X/machine/ags_pitch_sampler.c:322 msgid "LFO phase" msgstr "" #: ags/X/machine/ags_pitch_sampler_file.c:191 msgid "base key" msgstr "" #: ags/audio/osc/ags_osc_response.c:167 msgid "assigned OSC message" msgstr "" #: ags/audio/osc/ags_osc_response.c:168 msgid "The assigned OSC message" msgstr "" #: ags/audio/osc/controller/ags_osc_controller.c:117 msgid "assigned osc server" msgstr "" #: ags/audio/osc/controller/ags_osc_controller.c:118 msgid "The assigned osc server" msgstr "" #: ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c:182 msgid "assigned OSC XMLRPC server" msgstr "" #: ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c:183 msgid "The assigned OSC XMLRPC server" msgstr "" #: ags/server/ags_registry.c:132 ags/server/controller/ags_controller.c:116 msgid "assigned server" msgstr "" #: ags/server/ags_registry.c:133 ags/server/controller/ags_controller.c:117 msgid "The assigned server" msgstr "" #: ags/server/security/ags_security_context.c:121 msgid "certificates as string" msgstr "" #: ags/server/security/ags_security_context.c:122 msgid "The certificates as string" msgstr "" gsequencer-3.1.3/po/Makevars0000644000175000017500000000703113553424517012724 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # # Copyright (C) 2003-2017 Free Software Foundation, Inc. # This file, Makevars, is free software; the Free Software Foundation # gives unlimited permission to use, copy, distribute, and modify it. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=i18n --keyword=i18nM --keyword=i18nP:1,2 # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Joël Krähemann # This tells whether or not to prepend "GNU " prefix to the package # name that gets inserted into the header of the $(DOMAIN).pot file. # Possible values are "yes", "no", or empty. If it is empty, try to # detect it automatically by scanning the files in $(top_srcdir) for # "GNU packagename" string. PACKAGE_GNU = # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = jkraehemann@gmail.com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = # This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' # context. Possible values are "yes" and "no". Set this to yes if the # package uses functions taking also a message context, like pgettext(), or # if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. USE_MSGCTXT = no # These options get passed to msgmerge. # Useful options are in particular: # --previous to keep previous msgids of translated messages, # --quiet to reduce the verbosity. MSGMERGE_OPTIONS = # These options get passed to msginit. # If you want to disable line wrapping when writing PO files, add # --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and # MSGINIT_OPTIONS. MSGINIT_OPTIONS = # This tells whether or not to regenerate a PO file when $(DOMAIN).pot # has changed. Possible values are "yes" and "no". Set this to no if # the POT file is checked in the repository and the version control # program ignores timestamps. PO_DEPENDS_ON_POT = yes # This tells whether or not to forcibly update $(DOMAIN).pot and # regenerate PO files on "make dist". Possible values are "yes" and # "no". Set this to no if the POT file and PO files are maintained # externally. DIST_DEPENDS_ON_UPDATE_PO = yes gsequencer-3.1.3/po/ChangeLog0000644000175000017500000000112213474540702012772 000000000000002019-03-19 gettextize * Makefile.in.in: Upgrade to gettext-0.19.8.1. 2017-06-08 gettextize * Makefile.in.in: New file, from gettext-0.19.8.1. * Rules-quot: New file, from gettext-0.19.8.1. * boldquot.sed: New file, from gettext-0.19.8.1. * en@boldquot.header: New file, from gettext-0.19.8.1. * en@quot.header: New file, from gettext-0.19.8.1. * insert-header.sin: New file, from gettext-0.19.8.1. * quot.sed: New file, from gettext-0.19.8.1. * remove-potcdate.sin: New file, from gettext-0.19.8.1. * POTFILES.in: New file. gsequencer-3.1.3/po/README0000644000175000017500000000227513607210263012104 00000000000000Derived files of gsequencer licensed under the terms of GNU GPLv3+, copyright provided by http://www.nongnu.org/gsequencer: * gsequencer.pot (Copyright (C) 2005-2019 Joël Krähemann, GPLv3+) Third-party files of Ulrich Drepper (gettext) without any copyrightable content: * ChangeLog * POTFILES.in * stamp-po Third-party files of Ulrich Drepper (gettext) permissive licensed see specific files for warranty disclaimer and a notice preservation requirement, copyright provided by http://www.fsf.org: * remove-potcdate.sin (Copyright (C) Ulrich Drepper, permissive) Third-party files of Ulrich Drepper (gettext) free software licensed, copyright provided by http://www.fsf.org: * Makevars.template (Copyright (C) Ulrich Drepper) * Rules-quot (Copyright (C) Ulrich Drepper) Third-party files of Ulrich Drepper (gettext) all-permissive licensed, copyright provided by http://www.fsf.org: * quot.sed (Copyright (C) Ulrich Drepper, all-permissive) * boldquot.sed (Copyright (C) Ulrich Drepper, all-permissive) * en@quot.header (Copyright (C) Ulrich Drepper, all-permissive) * en@boldquot.header (Copyright (C) Ulrich Drepper, all-permissive) * insert-header.sin (Copyright (C) Ulrich Drepper, all-permissive) gsequencer-3.1.3/po/stamp-po0000644000175000017500000000001213622252265012677 00000000000000timestamp gsequencer-3.1.3/po/Makefile.in.in0000644000175000017500000004225113556560122013701 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # # Origin: gettext-0.19.8 GETTEXT_MACRO_VERSION = 0.19 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SED = @SED@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ # When building gettext-tools, we prefer to use the built programs # rather than installed programs. However, we can't do that when we # are cross compiling. CROSS_COMPILING = @CROSS_COMPILING@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot POFILESDEPS_yes = $(POFILESDEPS_) POFILESDEPS_no = POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT)) DISTFILESDEPS_ = update-po DISTFILESDEPS_yes = $(DISTFILESDEPS_) DISTFILESDEPS_no = DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO)) # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. CHECK_MACRO_VERSION = \ test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot @$(CHECK_MACRO_VERSION) test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. # The determination of whether the package xyz is a GNU one is based on the # heuristic whether some file in the top level directory mentions "GNU xyz". # If GNU 'find' is available, we avoid grepping through monster files. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed package_gnu="$(PACKAGE_GNU)"; \ test -n "$$package_gnu" || { \ if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \ LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \ -size -10000000c -exec grep 'GNU @PACKAGE@' \ /dev/null '{}' ';' 2>/dev/null; \ else \ LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \ fi; \ } | grep -v 'libtool:' >/dev/null; then \ package_gnu=yes; \ else \ package_gnu=no; \ fi; \ }; \ if test "$$package_gnu" = "yes"; then \ package_prefix='GNU '; \ else \ package_prefix=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_prefix}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot-header; then \ sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \ cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po; \ rm -f $(DOMAIN).1po; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(POFILESDEPS) @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS) @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use @SHELL@, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && @SHELL@ ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/po/en@boldquot.header0000644000175000017500000000247113556560122014655 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # gsequencer-3.1.3/po/quot.sed0000644000175000017500000000023113556560122012704 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g gsequencer-3.1.3/po/insert-header.sin0000644000175000017500000000124013556560122014465 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } gsequencer-3.1.3/po/remove-potcdate.sin0000644000175000017500000000066013556560122015036 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } gsequencer-3.1.3/po/en@quot.header0000644000175000017500000000226313556560122014013 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # gsequencer-3.1.3/ags.xsl0000644000175000017500000002534313461636431012120 00000000000000 ]> 60.0 1000000.0 floor($division div 256) floor($division div 256) * 256 60.0 1000000.0 floor($division div 256) floor($division div 256) * 256 note- 0 notation- 0 C note-list- _ 13f 0 &audiochannels; 1 128 xpath=//ags-devout notation-list- AgsFFPlayer machine- 628 &version; &buildid; 0 - xpath=//ags-audio[@id='_'] ffplayer- &defaultsf2; &preset; &instrument; ags-main- devout-list- ags-devout- 100 ags-audio-list- ags-audio-list window- 0 xpath=//ags-devout machine-list- ags-machine-list gsequencer-3.1.3/ags_functional_server_test_authentication.xml0000644000175000017500000000064013607210263022042 00000000000000 ags-test-user-uuid-0 audio gsequencer-3.1.3/lv2/0000755000175000017500000000000013622252250011362 500000000000000gsequencer-3.1.3/lv2/lv2plug.in/0000755000175000017500000000000013622252250013362 500000000000000gsequencer-3.1.3/lv2/lv2plug.in/ns/0000755000175000017500000000000013622252250014002 500000000000000gsequencer-3.1.3/lv2/lv2plug.in/ns/lv2ext/0000755000175000017500000000000013622252263015232 500000000000000gsequencer-3.1.3/lv2/lv2plug.in/ns/lv2ext/lv2_programs.h0000644000175000017500000001430513461636435017753 00000000000000/* LV2 Programs Extension Copyright 2012 Filipe Coelho Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /** @file lv2_programs.h C header for the LV2 programs extension . */ #ifndef LV2_PROGRAMS_H #define LV2_PROGRAMS_H #include "lv2/lv2plug.in/ns/lv2core/lv2.h" #include "lv2/lv2plug.in/ns/extensions/ui/ui.h" #define LV2_PROGRAMS_URI "http://kxstudio.sf.net/ns/lv2ext/programs" #define LV2_PROGRAMS_PREFIX LV2_PROGRAMS_URI "#" #define LV2_PROGRAMS__Host LV2_PROGRAMS_PREFIX "Host" #define LV2_PROGRAMS__Interface LV2_PROGRAMS_PREFIX "Interface" #define LV2_PROGRAMS__UIInterface LV2_PROGRAMS_PREFIX "UIInterface" #ifdef __cplusplus extern "C" { #endif typedef void* LV2_Programs_Handle; typedef struct _LV2_Program_Descriptor { /** Bank number for this program. Note that this extension does not support MIDI-style separation of bank LSB and MSB values. There is no restriction on the set of available banks: the numbers do not need to be contiguous, there does not need to be a bank 0, etc. */ uint32_t bank; /** Program number (unique within its bank) for this program. There is no restriction on the set of available programs: the numbers do not need to be contiguous, there does not need to be a program 0, etc. */ uint32_t program; /** Name of the program. */ const char * name; } LV2_Program_Descriptor; /** Programs extension, plugin data. When the plugin's extension_data is called with argument LV2_PROGRAMS__Interface, the plugin MUST return an LV2_Programs_Instance structure, which remains valid for the lifetime of the plugin. */ typedef struct _LV2_Programs_Interface { /** * get_program() * * This member is a function pointer that provides a description * of a program (named preset sound) available on this plugin. * * The index argument is an index into the plugin's list of * programs, not a program number as represented by the Program * field of the LV2_Program_Descriptor. (This distinction is * needed to support plugins that use non-contiguous program or * bank numbers.) * * This function returns a LV2_Program_Descriptor pointer that is * guaranteed to be valid only until the next call to get_program * or deactivate, on the same plugin instance. This function must * return NULL if passed an index argument out of range, so that * the host can use it to query the number of programs as well as * their properties. */ const LV2_Program_Descriptor *(*get_program)(LV2_Handle handle, uint32_t index); /** * select_program() * * This member is a function pointer that selects a new program * for this plugin. The program change should take effect * immediately at the start of the next run() call. (This * means that a host providing the capability of changing programs * between any two notes on a track must vary the block size so as * to place the program change at the right place. A host that * wanted to avoid this would probably just instantiate a plugin * for each program.) * * Plugins should ignore a select_program() call with an invalid * bank or program. * * A plugin is not required to select any particular default * program on activate(): it's the host's duty to set a program * explicitly. * * A plugin is permitted to re-write the values of its input * control ports when select_program is called. The host should * re-read the input control port values and update its own * records appropriately. (This is the only circumstance in which * a LV2 plugin is allowed to modify its own control-input ports.) */ void (*select_program)(LV2_Handle handle, uint32_t bank, uint32_t program); } LV2_Programs_Interface; /** Programs extension, UI data. When the UI's extension_data is called with argument LV2_PROGRAMS__UIInterface, the UI MUST return an LV2_Programs_UI_Interface structure, which remains valid for the lifetime of the UI. */ typedef struct _LV2_Programs_UI_Interface { /** * select_program() * * This is exactly the same as select_program in LV2_Programs_Instance, * but this struct relates to the UI instead of the plugin. * * When called, UIs should update their state to match the selected program. */ void (*select_program)(LV2UI_Handle handle, uint32_t bank, uint32_t program); } LV2_Programs_UI_Interface; /** Feature data for LV2_PROGRAMS__Host. */ typedef struct _LV2_Programs_Host { /** * Opaque host data. */ LV2_Programs_Handle handle; /** * program_changed() * * Tell the host to reload a plugin's program. * Parameter handle MUST be the 'handle' member of this struct. * Parameter index is program index to change. * When index is -1, host should reload all the programs. * * The plugin MUST NEVER call this function on a RT context or during run(). * * NOTE: This call is to inform the host about a program's bank, program or name change. * It DOES NOT change the current selected program. */ void (*program_changed)(LV2_Programs_Handle handle, int32_t index); } LV2_Programs_Host; #ifdef __cplusplus } /* extern "C" */ #endif #endif /* LV2_PROGRAMS_H */ gsequencer-3.1.3/Makefile.am0000644000175000017500000034064313616617253012660 00000000000000#Copyright (C) 2005-2020 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. AUTOMAKE_OPTIONS = foreign SUBDIRS = po m4 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-introspection ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} AM_CPPFLAGS = -std=gnu99 if WITH_W32API AM_CPPFLAGS += -DAGS_W32API=1 -DHAVE_GLIB_2_6=1 -DHAVE_GLIB_2_44=1 -DHAVE_GLIB_2_54=1 -DAGS_LIBRARY_SUFFIX=\".dll\" -DAGS_VECTORIZED_BUILTIN_FUNCTIONS=1 -include $(top_srcdir)/ags/config.h -I$(top_srcdir) -I$(top_srcdir)/lib -I/usr/lib/gcc/x86_64-w64-mingw32/8.3-win32/include-fixed -I/usr/lib/gcc/x86_64-w64-mingw32/8.3-win32/include -I/usr/x86_64-w64-mingw32/include -I/home/joelkraehemann/mingw64/target/include -I/home/joelkraehemann/mingw64/target/include/dssi -Werror=return-type -Werror=uninitialized -Werror=maybe-uninitialized AM_LDFLAGS = -no-undefined -L$(top_builddir)/lib -lgnu else if WITH_OSXAPI AM_CPPFLAGS += -fnested-functions -DAGS_OSXAPI=1 -I/usr/include -I/opt/local/include -I/opt/local/include/dssi -DAGS_LIBRARY_SUFFIX=\".dylib\" else AM_CPPFLAGS += -include errno.h -DAGS_VECTORIZED_BUILTIN_FUNCTIONS=1 -I/usr/include -DAGS_LIBRARY_SUFFIX=\".so\" -Werror=return-type -Werror=uninitialized -Werror=maybe-uninitialized endif endif AM_CPPFLAGS += -DSRCDIR=\"$(srcdir)\" -DDESTDIR=\"$(datadir)\" -DDOCDIR=\"$(docdir)\" -DPACKAGE_VERSION=\"$(PACKAGE_VERSION)\" -DAGS_REDUCE_RT_EVENTS=1 if WITH_W32API else AM_CPPFLAGS += -D_FORTIFY_SOURCE=2 -Wall -Wformat -Werror=format-security endif if WITH_LIBINSTPATCH AM_CPPFLAGS += -DAGS_WITH_LIBINSTPATCH=1 endif # AM_CPPFLAGS += -march=native -O3 -ftree-vectorize -ftree-slp-vectorize -ffast-math -ftree-vectorizer-verbose=2 # what flags you want to pass to the C compiler & linker CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ $(LTLIBINTL) LIBTOOL_DEPS = @LIBTOOL_DEPS@ gsequencer_CFLAGS = @GSEQUENCER_CFLAGS@ gsequencer_LDFLAGS = @GSEQUENCER_LDFLAGS@ midi2xml_CFLAGS = @GSEQUENCER_CFLAGS@ midi2xml_LDFLAGS = @GSEQUENCER_LDFLAGS@ if WITH_W32API LDFLAGS += -no-undefined -L$(top_builddir)/lib -lgnu endif # # TARGETS = gsequencer localedir = $(datadir)/locale DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ # this lists the binaries to produce, the (non-PHONY, binary) targets in # the previous manual Makefile lib_LTLIBRARIES = libags.la libags_thread.la libags_server.la libags_audio.la libags_gui.la if WITH_VST3 lib_LTLIBRARIES += libags_vst.la endif # lib_LTLIBRARIES += libgsequencer.la bin_PROGRAMS = gsequencer midi2xml HTMLHELP_XSL = @HTMLHELP_XSL@ if AGS_WITH_PUBLIC_LIBGSEQUENCER libgsequencerdir = $(libdir) else libgsequencerdir = $(libdir)/gsequencer endif GOBJECT_API_DOC = @GOBJECT_API_DOC@ GTK_API_DOC = @GTK_API_DOC@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ libgsequencer_LTLIBRARIES = libgsequencer.la EXTRA_DIST = config.rpath \ COPYING.server \ COPYING.docs \ COPYING.stk-4.3 \ ags/config.h.in \ ags/ags_config.h.in \ gtk-doc.make \ gsequencer.share \ acsite.m4 \ aclocal.m4 \ gsequencer.1 \ README \ ags_example.xml \ midi2xml.1 \ ags_authentication_test.xml \ ags_business_group_test.xml \ ags_certificate_test.xml \ ags_password_store_test.xml \ ags_functional_server_test_authentication.xml \ ags_functional_server_test_password_store.xml \ ags_functional_osc_xmlrpc_server_test_authentication.xml \ ags_functional_osc_xmlrpc_server_test_password_store.xml \ ags_functional_notation_edit_test.xml \ ags_functional_audio_config_test.xml \ mkinstalldirs \ m4/Makefile.am \ m4/Makefile.in \ m4/introspection.m4 \ ags/i18n.h \ ags/gettext.h \ ags/README \ ags/lib/AUTHORS \ ags/server/security/AUTHORS \ ags/audio/AUTHORS \ ags/audio/recall/AUTHORS \ docs/images/README \ docs/reference/libags-audio/README \ docs/reference/libags-gui/README \ docs/reference/libags/README \ docs/reference/libgsequencer/README \ gsequencer.share/icons/README \ gsequencer.share/images/README \ po/README EXTRA_DIST += \ license-notice-gnu-agpl-3-0+-c.txt \ license-notice-gnu-fdl-1-3-xml.txt \ license-notice-gnu-gpl-3-0+-c.txt \ license-notice-gnu-gpl-3-0+-sym.txt \ license-notice-gnu-agpl-3-0+-sym.txt \ license-notice-permissive-xml.txt EXTRA_DIST += \ libags.sym.in \ libags_thread.sym.in \ libags_server.sym.in \ libags_audio.sym.in \ libags_gui.sym.in EXTRA_DIST += \ unit-system-tests.mk.am \ unit-system-tests.mk.in \ functional-system-tests.mk.am \ functional-system-tests.mk.in EXTRA_DIST += \ docs/reference/libags/libags-sections.txt.in \ docs/reference/libags/libags.types.in \ docs/reference/libags/libags.interfaces.in \ docs/reference/libags-audio/libags_audio-sections.txt.in \ docs/reference/libags-audio/libags_audio.types.in \ docs/reference/libags-audio/libags_audio.interfaces.in \ docs/reference/libags-gui/libags_gui-sections.txt.in \ docs/reference/libags-gui/libags_gui.types.in \ docs/reference/libags-gui/libags_gui.interfaces.in \ docs/reference/libgsequencer/libgsequencer-sections.txt.in \ docs/reference/libgsequencer/libgsequencer.types.in \ docs/reference/libgsequencer/libgsequencer.interfaces.in \ clean-gtk-doc.sh EXTRA_DIST += \ lv2/lv2plug.in/ns/lv2ext/lv2_programs.h #EXTRA_DIST += \ # lv2.lib/mda/EPiano-presets.ttl EXTRA_DIST += \ apple_script.sh \ prepare-distribution.sh man1_MANS = gsequencer.1 midi2xml.1 CLEANFILES = \ functional-system-tests.mk \ m4/Makefile \ libags.sym \ libags_thread.sym \ libags_server.sym \ libags_audio.sym \ libags_gui.sym \ ags/object/ags_marshallers.list \ ags/widget/ags_widget_marshallers.list \ docs/listings/add_pattern.c \ docs/listings/application_mutex.c \ docs/listings/audio.c \ docs/listings/audio_application_context.c \ docs/listings/complete_example.c \ docs/listings/config.c \ docs/listings/effects_echo_audio.c \ docs/listings/effects_echo_audio_run.c \ docs/listings/effects_echo_channel.c \ docs/listings/effects_echo_channel_run.c \ docs/listings/effects_recall_container.c \ docs/listings/file_property.c \ docs/listings/file_read.c \ docs/listings/file_write.c \ docs/listings/linking_prerequisites.c \ docs/listings/linking_safe.c \ docs/listings/linking_unsafe.c \ docs/listings/notation_clipboard.c \ docs/listings/pcm_info.c \ docs/listings/port.c \ docs/listings/pull_thread.c \ docs/listings/recycling.c \ docs/listings/start_thread.c \ docs/listings/thread_application_context.c \ docs/listings/thread_obj_mutex.c \ docs/reference/libags/libags-sections.txt \ docs/reference/libags/libags.types \ docs/reference/libags/libags.interfaces \ docs/reference/libags-audio/libags_audio-sections.txt \ docs/reference/libags-audio/libags_audio.types \ docs/reference/libags-audio/libags_audio.interfaces \ docs/reference/libags-gui/libags_gui-sections.txt \ docs/reference/libags-gui/libags_gui.types \ docs/reference/libags-gui/libags_gui.interfaces \ docs/reference/libgsequencer/libgsequencer-sections.txt \ docs/reference/libgsequencer/libgsequencer.types \ docs/reference/libgsequencer/libgsequencer.interfaces # gir - gobject introspection -include $(INTROSPECTION_MAKEFILE) INTROSPECTION_GIRS = INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir) --includedir=$(top_builddir) if HAVE_INTROSPECTION introspection_sources = $(libags_la_SOURCES) $(libags_audio_la_SOURCES) $(libags_gui_la_SOURCES) Ags-3.0.gir: libags.la libags_thread.la libags_server.la Ags_3_0_gir_INCLUDES = libxml2-2.0 GObject-2.0 Soup-2.4 Ags_3_0_gir_C_INCLUDES = ags/libags.h Ags_3_0_gir_CFLAGS = $(INCLUDES) $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(LIBSOUP_CFLAGS) Ags_3_0_gir_LIBS = libags.la libags_thread.la libags_server.la Ags_3_0_gir_FILES = $(libags_la_HEADERS_0) $(libags_la_SOURCES) $(libags_thread_la_HEADERS_0) $(libags_thread_la_SOURCES) $(libags_server_la_HEADERS_0) $(libags_server_la_SOURCES) Ags_3_0_gir_NAMESPACE = Ags Ags_3_0_gir_VERSION = 3.0 Ags_3_0_gir_SCANNERFLAGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all --include=Soup-2.4 --include=GObject-2.0 --include=libxml2-2.0 --namespace=Ags --nsversion=3.0 --identifier-prefix=Ags --symbol-prefix=ags_ --output=$(top_builddir)/Ags-3.0.gir INTROSPECTION_GIRS += Ags-3.0.gir AgsAudio-3.0.gir: libags_audio.la $(top_builddir)/Ags-3.0.gir AgsAudio_3_0_gir_INCLUDES = libxml2-2.0 GObject-2.0 Soup-2.4 Ags-3.0 AgsAudio_3_0_gir_C_INCLUDES = ags/libags-audio.h AgsAudio_3_0_gir_CFLAGS = $(INCLUDES) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SAMPLERATE_CFLAGS) $(SNDFILE_CFLAGS) $(FFTW_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) AgsAudio_3_0_gir_LIBS = libags_audio.la AgsAudio_3_0_gir_FILES = $(libags_audio_la_HEADERS_0) $(libags_audio_la_SOURCES) AgsAudio_3_0_gir_NAMESPACE = AgsAudio AgsAudio_3_0_gir_VERSION = 3.0 AgsAudio_3_0_gir_SCANNERFLAGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all --include=Soup-2.4 --include=GObject-2.0 --include=libxml2-2.0 --include=Ags-3.0 --namespace=AgsAudio --nsversion=3.0 --identifier-prefix=Ags --symbol-prefix=ags_ --output=$(top_builddir)/AgsAudio-3.0.gir INTROSPECTION_GIRS += AgsAudio-3.0.gir AgsGui-3.0.gir: libags_gui.la AgsGui_3_0_gir_INCLUDES = GObject-2.0 Gtk-3.0 AgsGui_3_0_gir_C_INCLUDES = ags/libags-gui.h AgsGui_3_0_gir_CFLAGS = $(INCLUDES) $(GTK_CFLAGS) AgsGui_3_0_gir_LIBS = libags_gui.la AgsGui_3_0_gir_FILES = $(libags_gui_la_HEADERS_0) $(libags_gui_la_SOURCES) AgsGui_3_0_gir_NAMESPACE = AgsGui AgsGui_3_0_gir_VERSION = 3.0 AgsGui_3_0_gir_SCANNERFLAGS = --add-include-path=$(top_srcdir) --add-include-path=$(top_builddir) -I$(top_srcdir) -I$(top_builddir) --warn-all --include=Gtk-3.0 --namespace=AgsGui --nsversion=3.0 --identifier-prefix=Ags --symbol-prefix=ags_ --output=$(top_builddir)/AgsGui-3.0.gir INTROSPECTION_GIRS += AgsGui-3.0.gir girdir = $(datadir)/gir-1.0 gir_DATA = $(INTROSPECTION_GIRS) typelibdir = $(libdir)/girepository-1.0 typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) CLEANFILES += $(gir_DATA) $(typelib_DATA) endif # pkg-config pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libags.pc libags_audio.pc libags_gui.pc if AGS_WITH_PUBLIC_LIBGSEQUENCER pkgconfig_DATA += libgsequencer.pc endif EXTRA_DIST += libags.pc.in libags_audio.pc.in libags_gui.pc.in libgsequencer.pc.in # desktop file appdatadir = $(datadir)/applications appdata_DATA = gsequencer.desktop EXTRA_DIST += gsequencer.desktop.in # MIME specification EXTRA_DIST += application-x-gsequencer.xml \ org.nongnu.gsequencer.gsequencer.appdata.xml # clean CLEANFILES += $(appdata_DATA) $(pkgconfig_DATA) # extra EXTRA_DIST += \ libags.sym \ libags_thread.sym \ libags_server.sym \ libags_audio.sym \ libags_gui.sym EXTRA_DIST += docs/reference/libags/git.mk docs/reference/libags/gtk-doc.make docs/reference/libags/Makefile.am docs/reference/libags/Makefile.in EXTRA_DIST += docs/reference/libags/libags-overrides.txt docs/reference/libags/libags-sections.txt docs/reference/libags/libags.types docs/reference/libags/libags.xml EXTRA_DIST += docs/reference/libags-audio/git.mk docs/reference/libags-audio/gtk-doc.make docs/reference/libags-audio/Makefile.am docs/reference/libags-audio/Makefile.in EXTRA_DIST += docs/reference/libags-audio/libags_audio-overrides.txt docs/reference/libags-audio/libags_audio-sections.txt docs/reference/libags-audio/libags_audio.types docs/reference/libags-audio/libags_audio.xml EXTRA_DIST += docs/reference/libags-gui/git.mk docs/reference/libags-gui/gtk-doc.make docs/reference/libags-gui/Makefile.am docs/reference/libags-gui/Makefile.in EXTRA_DIST += docs/reference/libags-gui/libags_gui-overrides.txt docs/reference/libags-gui/libags_gui-sections.txt docs/reference/libags-gui/libags_gui.types docs/reference/libags-gui/libags_gui.xml EXTRA_DIST += docs/reference/libgsequencer/git.mk docs/reference/libgsequencer/gtk-doc.make docs/reference/libgsequencer/Makefile.am docs/reference/libgsequencer/Makefile.in EXTRA_DIST += docs/reference/libgsequencer/libgsequencer-overrides.txt docs/reference/libgsequencer/libgsequencer.xml # EXTRA_DIST += docs/reference/libgsequencer # include otherincludedir = $(includedir)/ags nobase_include_HEADERS = $(libags_la_HEADERS_0) $(libags_thread_la_HEADERS_0) $(libags_server_la_HEADERS_0) $(libags_audio_la_HEADERS_0) $(libags_gui_la_HEADERS_0) # nobase_include_HEADERS += $(libgsequencer_la_HEADERS_0) # doc # docdir = $(datadir)/doc/gsequencer doc_DATA = README ags_example.xml # documentation manpages = \ gsequencer.1.xml \ midi2xml.1.xml userdoc = \ docs/usersBook.xml \ docs/appa.xml \ docs/usersBook/appb.xml \ docs/usersBook/chap1.xml \ docs/usersBook/chap2.xml \ docs/usersBook/chap3.xml \ docs/usersBook/chap4.xml \ docs/usersBook/chap5.xml \ docs/usersBook/chap6.xml \ docs/usersBook/preface.xml devdoc = \ docs/developersBook.xml \ docs/developersBook/preface.xml \ docs/developersBook/chap1.xml \ docs/developersBook/chap2.xml \ docs/developersBook/chap3.xml \ docs/developersBook/chap4.xml \ docs/developersBook/chap5.xml \ docs/developersBook/chap6.xml \ docs/developersBook/chap7.xml \ docs/developersBook/chap8.xml \ docs/developersBook/chap9.xml \ docs/developersBook/chap10.xml \ docs/developersBook/chap11.xml \ docs/developersBook/chap12.xml \ docs/developersBook/appb.xml oscdoc = \ docs/oscBook.xml \ docs/oscBook/appb.xml \ docs/oscBook/chap1.xml \ docs/oscBook/chap2.xml \ docs/oscBook/chap3.xml \ docs/oscBook/chap4.xml \ docs/oscBook/chap5.xml \ docs/oscBook/chap6.xml \ docs/oscBook/chap7.xml \ docs/oscBook/chap8.xml \ docs/oscBook/appb.xml devdoclistings = \ docs/listings/add_pattern.c.in \ docs/listings/application_mutex.c.in \ docs/listings/audio_application_context.c.in \ docs/listings/audio.c.in \ docs/listings/complete_example.c.in \ docs/listings/config.c.in \ docs/listings/effects_echo_audio.c.in \ docs/listings/effects_echo_audio_run.c.in \ docs/listings/effects_echo_channel.c.in \ docs/listings/effects_echo_channel_run.c.in \ docs/listings/effects_recall_container.c.in \ docs/listings/file_property.c.in \ docs/listings/file_read.c.in \ docs/listings/file_write.c.in \ docs/listings/linking_prerequisites.c.in \ docs/listings/linking_safe.c.in \ docs/listings/linking_unsafe.c.in \ docs/listings/notation_clipboard.c.in \ docs/listings/pcm_info.c.in \ docs/listings/pull_thread.c.in \ docs/listings/port.c.in \ docs/listings/recycling.c.in \ docs/listings/start_thread.c.in \ docs/listings/thread_obj_mutex.c.in \ docs/listings/thread_application_context.c.in devdocimages = \ $(top_srcdir)/docs/images/AGS_iterator.png \ $(top_srcdir)/docs/images/AGS_recall_lifecycle.png \ $(top_srcdir)/docs/images/AGS_super-threaded.png \ $(top_srcdir)/docs/images/AGS_linking.png userdocimages = \ $(top_srcdir)/docs/images/ags_audiorec.png \ $(top_srcdir)/docs/images/ags-automation-toolbar.png \ $(top_srcdir)/docs/images/ags_automation_window_drum.png \ $(top_srcdir)/docs/images/ags_equalizer10.png \ $(top_srcdir)/docs/images/ags_export_window.png \ $(top_srcdir)/docs/images/ags_machine_properties-input.png \ $(top_srcdir)/docs/images/ags_machine_properties-resize_channels.png \ $(top_srcdir)/docs/images/ags_navigation.png \ $(top_srcdir)/docs/images/ags_audio_preferences.png \ $(top_srcdir)/docs/images/ags_audio_connection_output_bulk.png \ $(top_srcdir)/docs/images/ags_audio_connection_output_line.png \ $(top_srcdir)/docs/images/ags_audio_connection_input_bulk.png \ $(top_srcdir)/docs/images/ags_audio_connection_input_line.png \ $(top_srcdir)/docs/images/ags_midi_dialog.png \ $(top_srcdir)/docs/images/ags_midi_export_wizard_no1.png \ $(top_srcdir)/docs/images/ags_midi_export_wizard_no2.png \ $(top_srcdir)/docs/images/ags_midi_import_wizard_no1.png \ $(top_srcdir)/docs/images/ags_midi_import_wizard_no2.png \ $(top_srcdir)/docs/images/ags_midi_preferences.png \ $(top_srcdir)/docs/images/ags_ffplayer.png \ $(top_srcdir)/docs/images/ags_fm_synth.png \ $(top_srcdir)/docs/images/ags_fm_syncsynth.png \ $(top_srcdir)/docs/images/ags_ladspa_browser.png \ $(top_srcdir)/docs/images/ags_machine_properties-link_input.png \ $(top_srcdir)/docs/images/ags_matrix.png \ $(top_srcdir)/docs/images/ags_panel.png \ $(top_srcdir)/docs/images/ags_spectrometer.png \ $(top_srcdir)/docs/images/ags_synth.png \ $(top_srcdir)/docs/images/ags_syncsynth.png \ $(top_srcdir)/docs/images/ags-toolbar.png \ $(top_srcdir)/docs/images/ags_drum.png \ $(top_srcdir)/docs/images/ags_generic_preferences.png \ $(top_srcdir)/docs/images/ags_machine_properties-output.png \ $(top_srcdir)/docs/images/ags_mixer.png \ $(top_srcdir)/docs/images/ags_pitch_sampler.png \ $(top_srcdir)/docs/images/ags_performance_preferences.png \ $(top_srcdir)/docs/images/ags_server_preferences.png \ $(top_srcdir)/docs/images/ags_machine_envelope_editor.png \ $(top_srcdir)/docs/images/ags_machine_envelope_info.png \ $(top_srcdir)/docs/images/ags_machine_envelope_pattern.png \ $(top_srcdir)/docs/images/ags_move_notes_dialog.png \ $(top_srcdir)/docs/images/ags_crop_notes_dialog.png \ $(top_srcdir)/docs/images/ags_position_notation_cursor_dialog.png \ $(top_srcdir)/docs/images/ags_position_automation_cursor_dialog.png \ $(top_srcdir)/docs/images/ags_position_wave_cursor_dialog.png \ $(top_srcdir)/docs/images/ags_select_notes_dialog.png \ $(top_srcdir)/docs/images/ags_select_accelerations_dialog.png \ $(top_srcdir)/docs/images/ags_select_buffers_dialog.png \ $(top_srcdir)/docs/images/ags_ramp_accelerations_dialog.png \ $(top_srcdir)/docs/images/ags-wave-toolbar.png \ $(top_srcdir)/docs/images/ags_wave_window_audiorec.png EXTRA_DIST += $(manpages) $(userdoc) $(userdocimages) $(devdoc) $(devdocimages) $(devdoclistings) $(oscdoc) EXTRA_DIST += \ $(top_srcdir)/ags/server/security/ags_authentication.dtd \ $(top_srcdir)/ags/server/security/ags_business_group.dtd \ $(top_srcdir)/ags/server/security/ags_certificate.dtd \ $(top_srcdir)/ags/server/security/ags_password_store.dtd \ $(top_srcdir)/ags/audio/midi/ags_midi_file.dtd \ $(top_srcdir)/ags/audio/osc/ags_osc_file.dtd \ $(top_srcdir)/ags/file/ags_file.dtd \ $(top_srcdir)/ags/X/file/ags_simple_file.dtd \ $(top_srcdir)/ags.xsl \ $(top_srcdir)/ags-simple.xsl \ $(top_srcdir)/ags/object/ags_marshallers.list.in \ $(top_srcdir)/ags/widget/ags_widget_marshallers.list.in # conditional objects # libraries and gsequencer libags_la_SOURCES = $(libags_c_sources) $(libags_util_c_sources) $(libags_object_c_sources) $(libags_file_c_sources) $(libags_file_task_c_sources) libags_la_HEADERS_0 = ags/libags.h $(libags_h_sources) $(libags_util_h_sources) $(libags_object_h_sources) $(libags_file_h_sources) $(libags_file_task_h_sources) libags_thread_la_SOURCES = $(libags_thread_c_sources) $(libags_thread_task_c_sources) libags_thread_la_HEADERS_0 = $(libags_thread_h_sources) $(libags_thread_task_h_sources) libags_server_la_SOURCES = $(libags_server_c_sources) $(libags_server_security_c_sources) $(libags_server_controller_c_sources) libags_server_la_HEADERS_0 = $(libags_server_h_sources) $(libags_server_security_h_sources) $(libags_server_controller_h_sources) libags_audio_la_SOURCES = $(libags_audio_c_sources) $(libags_audio_thread_c_sources) $(libags_audio_file_c_sources) $(libags_audio_midi_c_sources) $(libags_audio_osc_c_sources) $(libags_audio_osc_controller_c_sources) $(libags_audio_osc_xmlrpc_c_sources) $(libags_audio_jack_c_sources) $(libags_audio_pulse_c_sources) $(libags_audio_core_audio_c_sources) $(libags_audio_audio_unit_c_sources) $(libags_audio_wasapi_c_sources) $(libags_audio_task_c_sources) $(libags_audio_task_recall_c_sources) $(libags_audio_recall_c_sources) $(libags_plugin_c_sources) libags_audio_la_HEADERS_0 = ags/libags-audio.h $(libags_audio_h_sources) $(libags_audio_thread_h_sources) $(libags_audio_file_h_sources) $(libags_audio_midi_h_sources) $(libags_audio_osc_h_sources) $(libags_audio_osc_controller_h_sources) $(libags_audio_osc_xmlrpc_h_sources) $(libags_audio_jack_h_sources) $(libags_audio_pulse_h_sources) $(libags_audio_core_audio_h_sources) $(libags_audio_audio_unit_h_sources) $(libags_audio_wasapi_h_sources) $(libags_audio_task_h_sources) $(libags_audio_task_recall_h_sources) $(libags_audio_recall_h_sources) $(libags_plugin_h_sources) libags_gui_la_SOURCES = $(libags_gui_c_sources) libags_gui_la_HEADERS_0 = ags/libags-gui.h $(libags_gui_h_sources) libgsequencer_la_HEADERS_0 = $(libgsequencer_h_sources) $(libgsequencer_osc_controller_h_sources) $(libgsequencer_file_h_sources) $(libgsequencer_task_h_sources) $(libgsequencer_import_h_sources) $(libgsequencer_export_h_sources) $(libgsequencer_machine_h_sources) $(libgsequencer_editor_h_sources) libgsequencer_la_SOURCES = $(libgsequencer_la_HEADERS_0) $(libgsequencer_c_sources) $(libgsequencer_osc_controller_c_sources) $(libgsequencer_file_c_sources) $(libgsequencer_task_c_sources) $(libgsequencer_import_c_sources) $(libgsequencer_export_c_sources) $(libgsequencer_machine_c_sources) $(libgsequencer_editor_c_sources) if WITH_VST3 libags_vst_la_SOURCES = $(libags_vst_c_sources) libags_vst_la_HEADERS_0 = ags/libags-vst.h $(libags_vst_h_sources) endif # library libags libags_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(UUID_CFLAGS) $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(W32API_CFLAGS) libags_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC -pthread libags_la_LIBADD = -lm $(UUID_LIBS) $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(GIO_LIBS) $(W32API_LIBS) if WITH_W32API libags_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libags.dll.a else if WITH_OSXAPI libags_la_LDFLAGS += -export-symbols libags.sym -Wl,-install_name,libags.dylib else libags_la_LDFLAGS += -export-symbols libags.sym -Wl,-soname,libags.so libags_la_LIBADD += -ldl -lcrypt endif endif # library libags-thread libags_thread_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(W32API_CFLAGS) libags_thread_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC -pthread libags_thread_la_LIBADD = libags.la -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(W32API_LIBS) if WITH_W32API libags_thread_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libags_thread.dll.a else if WITH_OSXAPI libags_thread_la_LDFLAGS += -export-symbols libags_thread.sym -Wl,-install_name,libags_thread.dylib else libags_thread_la_LDFLAGS += -export-symbols libags_thread.sym -Wl,-soname,libags_thread.so libags_thread_la_LIBADD += -ldl -lcrypt endif endif # library libags-server libags_server_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(W32API_CFLAGS) libags_server_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC -pthread libags_server_la_LIBADD = libags_thread.la libags.la -lm $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(W32API_LIBS) if WITH_W32API libags_server_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libags_server.dll.a else if WITH_OSXAPI libags_server_la_LDFLAGS += -export-symbols libags_server.sym -Wl,-install_name,libags_server.dylib else libags_server_la_LDFLAGS += -export-symbols libags_server.sym -Wl,-soname,libags_server.so libags_server_la_LIBADD += -ldl -lcrypt endif endif # library libags-audio libags_audio_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(CORE_AUDIO_CFLAGS) $(WASAPI_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SAMPLERATE_CFLAGS) $(SNDFILE_CFLAGS) $(FFTW_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) $(W32API_CFLAGS) libags_audio_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC -pthread libags_audio_la_LIBADD = libags_server.la libags_thread.la libags.la -lm $(CORE_AUDIO_LIBS) $(WASAPI_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SAMPLERATE_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(FFTW_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(JACK_LIBS) $(PULSE_LIBS) $(W32API_LIBS) if WITH_W32API libags_audio_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libags_audio.dll.a else if WITH_OSXAPI libags_audio_la_LDFLAGS += -export-symbols libags_audio.sym -Wl,-install_name,libags_audio.dylib else libags_audio_la_LDFLAGS += -export-symbols libags_audio.sym -Wl,-soname,libags_audio.so libags_audio_la_LIBADD += -ldl endif endif # library libags-gui libags_gui_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(GOBJECT_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(W32API_CFLAGS) libags_gui_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC -pthread libags_gui_la_LIBADD = -lm $(GOBJECT_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) $(W32API_LIBS) if WITH_W32API libags_gui_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libags_gui.dll.a else if WITH_OSXAPI libags_gui_la_LDFLAGS += -export-symbols libags_gui.sym -Wl,-install_name,libags_gui.dylib else libags_gui_la_LDFLAGS += -export-symbols libags_gui.sym -Wl,-soname,libags_gui.so libags_gui_la_LIBADD += -ldl endif endif # library libgsequencer libgsequencer_la_CFLAGS = $(CFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(CORE_AUDIO_CFLAGS) $(WASAPI_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(FFTW_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(LIBSOUP_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(WEBKITGTK_CFLAGS) $(GTK_MAC_INTEGRATION_CFLAGS) $(W32API_CFLAGS) libgsequencer_la_LDFLAGS = $(LDFLAGS) -version-info 0:1:0 -shared -fPIC -pthread libgsequencer_la_LIBADD = libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lm $(CORE_AUDIO_LIBS) $(WASAPI_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(FFTW_LIBS) $(SNDFILE_LIBS) $(JACK_LIBS) $(PULSE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) $(WEBKITGTK_LIBS) $(GTK_MAC_INTEGRATION_LIBS) $(W32API_LIBS) if WITH_W32API libgsequencer_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libgsequencer.dll.a else if WITH_OSXAPI else libgsequencer_la_LIBADD += -ldl endif endif # library libags-vst if WITH_VST3 libags_vst_la_CXXFLAGS = $(CXXFLAGS) $(COMPILER_FLAGS) $(WARN_FLAGS) -O -I./ $(GLIB_CFLAGS) $(VST3_CXXFLAGS) $(W32API_CFLAGS) libags_vst_la_LDFLAGS = $(LDFLAGS) -version-info 3:0:0 -shared -fPIC -pthread libags_vst_la_LIBADD = -lm $(GLIB_LIBS) $(VST3_LIBS) $(W32API_LIBS) if WITH_W32API libags_vst_la_LDFLAGS += -Wl,--export-all-symbols,--out-implib=libags_vst.dll.a else if WITH_OSXAPI libags_vst_la_LDFLAGS += -export-symbols libags_vst.sym -Wl,-install_name,libags_vst.dylib else libags_vst_la_LDFLAGS += -export-symbols libags_vst.sym -Wl,-soname,libags_vst.so libags_vst_la_LIBADD += -ldl endif endif endif # gsequencer gsequencer_SOURCES = $(gsequencer_c_sources) $(gsequencerheaders) gsequencer_CFLAGS += $(LIBASOUND2_CFLAGS) $(LIBAO_CFLAGS) $(LIBXML2_CFLAGS) $(LIBSOUP_CFLAGS) $(SNDFILE_CFLAGS) $(JACK_CFLAGS) $(PULSE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS) $(WEBKITGTK_CFLAGS) $(GTK_MAC_INTEGRATION_CFLAGS) $(W32API_CFLAGS) gsequencer_LDFLAGS += -pthread gsequencer_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lm $(RT_LIBS) $(X11_LIBS) $(CORE_AUDIO_CFLAGS) $(WASAPI_CFLAGS) $(LIBASOUND2_LIBS) $(LIBAO_LIBS) $(LIBXML2_LIBS) $(LIBSOUP_LIBS) $(SNDFILE_LIBS) $(JACK_LIBS) $(PULSE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(CAIRO_LIBS) $(GTK_LIBS) $(WEBKITGTK_LIBS) $(GTK_MAC_INTEGRATION_LIBS) $(W32API_LIBS) if WITH_W32API else if WITH_OSXAPI else gsequencer_LDADD += -ldl endif endif # unit and functional tests check_PROGRAMS = include $(top_srcdir)/unit-tests.mk if RUN_FUNCTIONAL_TESTS include $(top_srcdir)/functional-tests.mk endif TESTS = $(check_PROGRAMS) # internationalization noinst_HEADERS = ags/i18n.h # libags all files deprecated_libags_h_sources = libags_h_sources = \ $(deprecated_libags_h_sources) \ ags/lib/ags_buffer_util.h \ ags/lib/ags_complex.h \ ags/lib/ags_conversion.h \ ags/lib/ags_endian.h \ ags/lib/ags_function.h \ ags/lib/ags_log.h \ ags/lib/ags_regex.h \ ags/lib/ags_solver_matrix.h \ ags/lib/ags_solver_vector.h \ ags/lib/ags_string_util.h \ ags/lib/ags_time.h \ ags/lib/ags_turtle.h \ ags/lib/ags_turtle_manager.h \ ags/lib/ags_uuid.h deprecated_libags_c_sources = libags_c_sources = \ $(deprecated_libags_c_sources) \ ags/lib/ags_buffer_util.c \ ags/lib/ags_complex.c \ ags/lib/ags_conversion.c \ ags/lib/ags_endian.c \ ags/lib/ags_function.c \ ags/lib/ags_log.c \ ags/lib/ags_regex.c \ ags/lib/ags_solver_matrix.c \ ags/lib/ags_solver_vector.c \ ags/lib/ags_string_util.c \ ags/lib/ags_time.c \ ags/lib/ags_turtle.c \ ags/lib/ags_turtle_manager.c \ ags/lib/ags_uuid.c deprecated_libags_util_h_sources = # libags - util libags_util_h_sources = \ $(deprecated_libags_util_h_sources) \ ags/util/ags_destroy_util.h \ ags/util/ags_id_generator.h \ ags/util/ags_list_util.h \ ags/util/ags_soundcard_helper.h deprecated_libags_util_c_sources = libags_util_c_sources = \ $(deprecated_libags_util_c_sources) \ ags/util/ags_destroy_util.c \ ags/util/ags_id_generator.c \ ags/util/ags_list_util.c \ ags/util/ags_soundcard_helper.c deprecated_libags_object_h_sources = # libags - object libags_object_h_sources = \ $(deprecated_libags_object_h_sources) \ ags/object/ags_applicable.h \ ags/object/ags_application_context.h \ ags/object/ags_config.h \ ags/object/ags_connectable.h \ ags/object/ags_countable.h \ ags/object/ags_cursor.h \ ags/object/ags_globals.h \ ags/object/ags_macros.h \ ags/object/ags_main_loop.h \ ags/object/ags_marshal.h \ ags/object/ags_mutable.h \ ags/object/ags_plugin.h \ ags/object/ags_portlet.h \ ags/object/ags_priority.h \ ags/object/ags_seekable.h \ ags/object/ags_sequencer.h \ ags/object/ags_soundcard.h \ ags/object/ags_sound_server.h \ ags/object/ags_tactable.h deprecated_libags_object_c_sources = libags_object_c_sources = \ $(deprecated_libags_object_c_sources) \ ags/object/ags_applicable.c \ ags/object/ags_application_context.c \ ags/object/ags_config.c \ ags/object/ags_connectable.c \ ags/object/ags_countable.c \ ags/object/ags_cursor.c \ ags/object/ags_globals.c \ ags/object/ags_main_loop.c \ ags/object/ags_marshal.c \ ags/object/ags_mutable.c \ ags/object/ags_plugin.c \ ags/object/ags_portlet.c \ ags/object/ags_priority.c \ ags/object/ags_seekable.c \ ags/object/ags_sequencer.c \ ags/object/ags_soundcard.c \ ags/object/ags_sound_server.c \ ags/object/ags_tactable.c deprecated_libags_file_h_sources = # libags - file libags_file_h_sources = \ $(deprecated_libags_file_h_sources) \ ags/file/ags_file.h \ ags/file/ags_file_id_ref.h \ ags/file/ags_file_launch.h \ ags/file/ags_file_link.h \ ags/file/ags_file_lookup.h deprecated_libags_file_c_sources = libags_file_c_sources = \ $(deprecated_libags_file_c_sources) \ ags/file/ags_file.c \ ags/file/ags_file_id_ref.c \ ags/file/ags_file_launch.c \ ags/file/ags_file_link.c \ ags/file/ags_file_lookup.c # libags-thread all files deprecated_libags_thread_h_sources = libags_thread_h_sources = \ $(deprecated_libags_thread_h_sources) \ ags/thread/ags_concurrency_provider.h \ ags/thread/ags_destroy_worker.h \ ags/thread/ags_generic_main_loop.h \ ags/thread/ags_message_delivery.h \ ags/thread/ags_message_envelope.h \ ags/thread/ags_message_queue.h \ ags/thread/ags_returnable_thread.h \ ags/thread/ags_task_completion.h \ ags/thread/ags_task.h \ ags/thread/ags_task_launcher.h \ ags/thread/ags_thread_application_context.h \ ags/thread/ags_thread_pool.h \ ags/thread/ags_thread.h \ ags/thread/ags_timestamp.h \ ags/thread/ags_worker_thread.h deprecated_libags_thread_c_sources = libags_thread_c_sources = \ $(deprecated_libags_thread_c_sources) \ ags/thread/ags_concurrency_provider.c \ ags/thread/ags_destroy_worker.c \ ags/thread/ags_generic_main_loop.c \ ags/thread/ags_message_delivery.c \ ags/thread/ags_message_envelope.c \ ags/thread/ags_message_queue.c \ ags/thread/ags_returnable_thread.c \ ags/thread/ags_task_completion.c \ ags/thread/ags_task.c \ ags/thread/ags_task_launcher.c \ ags/thread/ags_thread_application_context.c \ ags/thread/ags_thread_pool.c \ ags/thread/ags_thread.c \ ags/thread/ags_timestamp.c \ ags/thread/ags_worker_thread.c # libags-server all files deprecated_libags_server_h_sources = libags_server_h_sources = \ $(deprecated_libags_server_h_sources) \ ags/server/ags_registry.h \ ags/server/ags_server.h \ ags/server/ags_server_application_context.h \ ags/server/ags_server_status.h \ ags/server/ags_service_provider.h deprecated_libags_server_c_sources = libags_server_c_sources = \ $(deprecated_libags_server_c_sources) \ ags/server/ags_registry.c \ ags/server/ags_server.c \ ags/server/ags_server_application_context.c \ ags/server/ags_server_status.c \ ags/server/ags_service_provider.c # libags-server - security deprecated_libags_server_security_h_sources = libags_server_security_h_sources = \ $(deprecated_libags_server_security_h_sources) \ ags/server/security/ags_auth_security_context.h \ ags/server/security/ags_authentication.h \ ags/server/security/ags_authentication_manager.h \ ags/server/security/ags_business_group.h \ ags/server/security/ags_business_group_manager.h \ ags/server/security/ags_certificate.h \ ags/server/security/ags_certificate_manager.h \ ags/server/security/ags_password_store.h \ ags/server/security/ags_password_store_manager.h \ ags/server/security/ags_security_context.h \ ags/server/security/ags_xml_authentication.h \ ags/server/security/ags_xml_business_group.h \ ags/server/security/ags_xml_certificate.h \ ags/server/security/ags_xml_password_store.h deprecated_libags_server_security_c_sources = libags_server_security_c_sources = \ $(deprecated_libags_server_security_c_sources) \ ags/server/security/ags_auth_security_context.c \ ags/server/security/ags_authentication.c \ ags/server/security/ags_authentication_manager.c \ ags/server/security/ags_business_group.c \ ags/server/security/ags_business_group_manager.c \ ags/server/security/ags_certificate.c \ ags/server/security/ags_certificate_manager.c \ ags/server/security/ags_password_store.c \ ags/server/security/ags_password_store_manager.c \ ags/server/security/ags_security_context.c \ ags/server/security/ags_xml_authentication.c \ ags/server/security/ags_xml_business_group.c \ ags/server/security/ags_xml_certificate.c \ ags/server/security/ags_xml_password_store.c # libags-server - controller deprecated_libags_server_controller_h_sources = libags_server_controller_h_sources = \ $(deprecated_libags_server_controller_h_sources) \ ags/server/controller/ags_controller.h \ ags/server/controller/ags_front_controller.h \ ags/server/controller/ags_plugin_controller.h deprecated_libags_server_controller_c_sources = libags_server_controller_c_sources = \ $(deprecated_libags_server_controller_c_sources) \ ags/server/controller/ags_controller.c \ ags/server/controller/ags_front_controller.c \ ags/server/controller/ags_plugin_controller.c # libags-server - file deprecated_libags_server_file_h_sources = libags_server_file_h_sources = \ $(deprecated_libags_server_file_h_sources) deprecated_libags_server_file_c_sources = libags_server_file_c_sources = \ $(deprecated_libags_server_file_c_sources) # libags-audio all files deprecated_libags_audio_h_sources = libags_audio_h_sources = \ $(deprecated_libags_audio_h_sources) \ ags/audio/ags_sound_enums.h \ ags/audio/ags_synth_enums.h \ ags/audio/ags_acceleration.h \ ags/audio/ags_audio.h \ ags/audio/ags_audio_application_context.h \ ags/audio/ags_audio_buffer_util.h \ ags/audio/ags_audio_signal.h \ ags/audio/ags_automation.h \ ags/audio/ags_buffer.h \ ags/audio/ags_channel.h \ ags/audio/ags_char_buffer_util.h \ ags/audio/ags_devout.h \ ags/audio/ags_devin.h \ ags/audio/ags_diatonic_scale.h \ ags/audio/ags_filter_util.h \ ags/audio/ags_fifoout.h \ ags/audio/ags_fm_synth_util.h \ ags/audio/ags_fourier_transform_util.h \ ags/audio/ags_frequency_map.h \ ags/audio/ags_frequency_map_manager.h \ ags/audio/ags_generic_recall_channel_run.h \ ags/audio/ags_generic_recall_recycling.h \ ags/audio/ags_input.h \ ags/audio/ags_lfo_synth_util.h \ ags/audio/ags_midi.h \ ags/audio/ags_midiin.h \ ags/audio/ags_notation.h \ ags/audio/ags_note.h \ ags/audio/ags_output.h \ ags/audio/ags_pattern.h \ ags/audio/ags_playback.h \ ags/audio/ags_playback_domain.h \ ags/audio/ags_port.h \ ags/audio/ags_preset.h \ ags/audio/ags_recall_audio.h \ ags/audio/ags_recall_audio_run.h \ ags/audio/ags_recall_audio_signal.h \ ags/audio/ags_recall_channel.h \ ags/audio/ags_recall_channel_run.h \ ags/audio/ags_recall_container.h \ ags/audio/ags_recall_dependency.h \ ags/audio/ags_recall_factory.h \ ags/audio/ags_recall.h \ ags/audio/ags_recall_dssi.h \ ags/audio/ags_recall_dssi_run.h \ ags/audio/ags_recall_id.h \ ags/audio/ags_recall_ladspa.h \ ags/audio/ags_recall_ladspa_run.h \ ags/audio/ags_recall_lv2.h \ ags/audio/ags_recall_lv2_run.h \ ags/audio/ags_recall_recycling.h \ ags/audio/ags_recycling_context.h \ ags/audio/ags_recycling.h \ ags/audio/ags_sound_provider.h \ ags/audio/ags_sequencer_util.h \ ags/audio/ags_soundcard_util.h \ ags/audio/ags_synth_generator.h \ ags/audio/ags_synth_util.h \ ags/audio/ags_track.h \ ags/audio/ags_wave.h deprecated_libags_audio_c_sources = libags_audio_c_sources = \ $(deprecated_libags_audio_c_sources) \ ags/audio/ags_acceleration.c \ ags/audio/ags_audio.c \ ags/audio/ags_audio_application_context.c \ ags/audio/ags_audio_buffer_util.c \ ags/audio/ags_audio_signal.c \ ags/audio/ags_automation.c \ ags/audio/ags_buffer.c \ ags/audio/ags_channel.c \ ags/audio/ags_char_buffer_util.c \ ags/audio/ags_devout.c \ ags/audio/ags_devin.c \ ags/audio/ags_diatonic_scale.c \ ags/audio/ags_input.c \ ags/audio/ags_filter_util.c \ ags/audio/ags_fifoout.c \ ags/audio/ags_fm_synth_util.c \ ags/audio/ags_fourier_transform_util.c \ ags/audio/ags_frequency_map.c \ ags/audio/ags_frequency_map_manager.c \ ags/audio/ags_generic_recall_channel_run.c \ ags/audio/ags_generic_recall_recycling.c \ ags/audio/ags_lfo_synth_util.c \ ags/audio/ags_midi.c \ ags/audio/ags_midiin.c \ ags/audio/ags_notation.c \ ags/audio/ags_note.c \ ags/audio/ags_output.c \ ags/audio/ags_pattern.c \ ags/audio/ags_playback.c \ ags/audio/ags_playback_domain.c \ ags/audio/ags_port.c \ ags/audio/ags_preset.c \ ags/audio/ags_recall_audio.c \ ags/audio/ags_recall_audio_run.c \ ags/audio/ags_recall_audio_signal.c \ ags/audio/ags_recall.c \ ags/audio/ags_recall_channel.c \ ags/audio/ags_recall_channel_run.c \ ags/audio/ags_recall_container.c \ ags/audio/ags_recall_dependency.c \ ags/audio/ags_recall_factory.c \ ags/audio/ags_recall_dssi.c \ ags/audio/ags_recall_dssi_run.c \ ags/audio/ags_recall_id.c \ ags/audio/ags_recall_ladspa.c \ ags/audio/ags_recall_ladspa_run.c \ ags/audio/ags_recall_lv2.c \ ags/audio/ags_recall_lv2_run.c \ ags/audio/ags_recall_recycling.c \ ags/audio/ags_recycling.c \ ags/audio/ags_recycling_context.c \ ags/audio/ags_sound_provider.c \ ags/audio/ags_sequencer_util.c \ ags/audio/ags_soundcard_util.c \ ags/audio/ags_synth_generator.c \ ags/audio/ags_synth_util.c \ ags/audio/ags_track.c \ ags/audio/ags_wave.c # libags-audio - thread deprecated_libags_audio_thread_h_sources = libags_audio_thread_h_sources = \ $(deprecated_libags_audio_thread_h_sources) \ ags/audio/thread/ags_audio_loop.h \ ags/audio/thread/ags_audio_thread.h \ ags/audio/thread/ags_channel_thread.h \ ags/audio/thread/ags_sequencer_thread.h \ ags/audio/thread/ags_soundcard_thread.h \ ags/audio/thread/ags_export_thread.h \ ags/audio/thread/ags_sf2_loader.h \ ags/audio/thread/ags_sfz_loader.h \ ags/audio/thread/ags_wave_loader.h deprecated_libags_audio_thread_c_sources = libags_audio_thread_c_sources = \ $(deprecated_libags_audio_thread_c_sources) \ ags/audio/thread/ags_audio_loop.c \ ags/audio/thread/ags_audio_thread.c \ ags/audio/thread/ags_channel_thread.c \ ags/audio/thread/ags_sequencer_thread.c \ ags/audio/thread/ags_soundcard_thread.c \ ags/audio/thread/ags_export_thread.c \ ags/audio/thread/ags_sf2_loader.c \ ags/audio/thread/ags_sfz_loader.c \ ags/audio/thread/ags_wave_loader.c # libags-audio - plugin deprecated_libags_plugin_h_sources = libags_plugin_h_sources = \ $(deprecated_libags_plugin_h_sources) \ ags/plugin/ags_base_plugin.h \ ags/plugin/ags_dssi_manager.h \ ags/plugin/ags_dssi_plugin.h \ ags/plugin/ags_ladspa_conversion.h \ ags/plugin/ags_ladspa_manager.h \ ags/plugin/ags_ladspa_plugin.h \ ags/plugin/ags_lv2_conversion.h \ ags/plugin/ags_lv2_manager.h \ ags/plugin/ags_lv2_turtle_parser.h \ ags/plugin/ags_lv2_plugin.h \ ags/plugin/ags_lv2_preset_manager.h \ ags/plugin/ags_lv2_preset.h \ ags/plugin/ags_lv2_event_manager.h \ ags/plugin/ags_lv2_log_manager.h \ ags/plugin/ags_lv2_option_manager.h \ ags/plugin/ags_lv2_uri_map_manager.h \ ags/plugin/ags_lv2_urid_manager.h \ ags/plugin/ags_lv2_worker_manager.h \ ags/plugin/ags_lv2_worker.h \ ags/plugin/ags_lv2ui_manager.h \ ags/plugin/ags_lv2ui_plugin.h \ ags/plugin/ags_plugin_stock.h \ ags/plugin/ags_plugin_port.h deprecated_libags_plugin_c_sources = libags_plugin_c_sources = \ $(deprecated_libags_plugin_c_sources) \ ags/plugin/ags_base_plugin.c \ ags/plugin/ags_dssi_manager.c \ ags/plugin/ags_dssi_plugin.c \ ags/plugin/ags_ladspa_conversion.c \ ags/plugin/ags_ladspa_manager.c \ ags/plugin/ags_ladspa_plugin.c \ ags/plugin/ags_lv2_conversion.c \ ags/plugin/ags_lv2_manager.c \ ags/plugin/ags_lv2_turtle_parser.c \ ags/plugin/ags_lv2_plugin.c \ ags/plugin/ags_lv2_preset_manager.c \ ags/plugin/ags_lv2_preset.c \ ags/plugin/ags_lv2_log_manager.c \ ags/plugin/ags_lv2_event_manager.c \ ags/plugin/ags_lv2_option_manager.c \ ags/plugin/ags_lv2_uri_map_manager.c \ ags/plugin/ags_lv2_urid_manager.c \ ags/plugin/ags_lv2_worker_manager.c \ ags/plugin/ags_lv2_worker.c \ ags/plugin/ags_lv2ui_manager.c \ ags/plugin/ags_lv2ui_plugin.c \ ags/plugin/ags_plugin_port.c # libags-audio - file deprecated_libags_audio_file_h_sources = libags_audio_file_h_sources = \ $(deprecated_libags_audio_file_h_sources) \ ags/audio/file/ags_audio_container.h \ ags/audio/file/ags_audio_file.h \ ags/audio/file/ags_audio_file_link.h \ ags/audio/file/ags_sound_container.h \ ags/audio/file/ags_sound_resource.h \ ags/audio/file/ags_sndfile.h \ ags/audio/file/ags_sfz_file.h \ ags/audio/file/ags_sfz_group.h \ ags/audio/file/ags_sfz_region.h \ ags/audio/file/ags_sfz_sample.h if WITH_LIBINSTPATCH libags_audio_file_h_sources += \ ags/audio/file/ags_ipatch.h \ ags/audio/file/ags_ipatch_sample.h \ ags/audio/file/ags_ipatch_dls2_reader.h \ ags/audio/file/ags_ipatch_gig_reader.h \ ags/audio/file/ags_ipatch_sf2_reader.h endif deprecated_libags_audio_file_c_sources = libags_audio_file_c_sources = \ $(deprecated_libags_audio_file_c_sources) \ ags/audio/file/ags_audio_container.c \ ags/audio/file/ags_audio_file.c \ ags/audio/file/ags_audio_file_link.c \ ags/audio/file/ags_sound_container.c \ ags/audio/file/ags_sound_resource.c \ ags/audio/file/ags_sndfile.c \ ags/audio/file/ags_sfz_file.c \ ags/audio/file/ags_sfz_group.c \ ags/audio/file/ags_sfz_region.c \ ags/audio/file/ags_sfz_sample.c if WITH_LIBINSTPATCH libags_audio_file_c_sources += \ ags/audio/file/ags_ipatch.c \ ags/audio/file/ags_ipatch_sample.c \ ags/audio/file/ags_ipatch_dls2_reader.c \ ags/audio/file/ags_ipatch_gig_reader.c \ ags/audio/file/ags_ipatch_sf2_reader.c endif # libags-audio - midi deprecated_libags_audio_midi_h_sources = libags_audio_midi_h_sources = \ $(deprecated_libags_audio_midi_h_sources) \ ags/audio/midi/ags_midi_buffer_util.h \ ags/audio/midi/ags_midi_util.h \ ags/audio/midi/ags_midi_builder.h \ ags/audio/midi/ags_midi_file.h \ ags/audio/midi/ags_midi_parser.h deprecated_libags_audio_midi_c_sources = libags_audio_midi_c_sources = \ $(deprecated_libags_audio_midi_c_sources) \ ags/audio/midi/ags_midi_buffer_util.c \ ags/audio/midi/ags_midi_util.c \ ags/audio/midi/ags_midi_builder.c \ ags/audio/midi/ags_midi_file.c \ ags/audio/midi/ags_midi_parser.c # libags-audio - osc deprecated_libags_audio_osc_h_sources = libags_audio_osc_h_sources = \ $(deprecated_libags_audio_osc_h_sources) \ ags/audio/osc/ags_osc_buffer_util.h \ ags/audio/osc/ags_osc_builder.h \ ags/audio/osc/ags_osc_client.h \ ags/audio/osc/ags_osc_connection.h \ ags/audio/osc/ags_osc_message.h \ ags/audio/osc/ags_osc_parser.h \ ags/audio/osc/ags_osc_response.h \ ags/audio/osc/ags_osc_server.h \ ags/audio/osc/ags_osc_util.h \ ags/audio/osc/ags_osc_websocket_connection.h \ ags/audio/osc/ags_osc_xmlrpc_message.h \ ags/audio/osc/ags_osc_xmlrpc_server.h deprecated_libags_audio_osc_c_sources = libags_audio_osc_c_sources = \ $(deprecated_libags_audio_osc_c_sources) \ ags/audio/osc/ags_osc_buffer_util.c \ ags/audio/osc/ags_osc_builder.c \ ags/audio/osc/ags_osc_client.c \ ags/audio/osc/ags_osc_connection.c \ ags/audio/osc/ags_osc_message.c \ ags/audio/osc/ags_osc_parser.c \ ags/audio/osc/ags_osc_response.c \ ags/audio/osc/ags_osc_server.c \ ags/audio/osc/ags_osc_util.c \ ags/audio/osc/ags_osc_websocket_connection.c \ ags/audio/osc/ags_osc_xmlrpc_message.c \ ags/audio/osc/ags_osc_xmlrpc_server.c deprecated_libags_audio_osc_controller_h_sources = libags_audio_osc_controller_h_sources = \ $(deprecated_libags_audio_osc_controller_h_sources) \ ags/audio/osc/controller/ags_osc_controller.h \ ags/audio/osc/controller/ags_osc_action_controller.h \ ags/audio/osc/controller/ags_osc_config_controller.h \ ags/audio/osc/controller/ags_osc_export_controller.h \ ags/audio/osc/controller/ags_osc_front_controller.h \ ags/audio/osc/controller/ags_osc_info_controller.h \ ags/audio/osc/controller/ags_osc_meter_controller.h \ ags/audio/osc/controller/ags_osc_node_controller.h \ ags/audio/osc/controller/ags_osc_plugin_controller.h \ ags/audio/osc/controller/ags_osc_renew_controller.h \ ags/audio/osc/controller/ags_osc_status_controller.h deprecated_libags_audio_osc_controller_c_sources = libags_audio_osc_controller_c_sources = \ $(deprecated_libags_audio_controller_osc_c_sources) \ ags/audio/osc/controller/ags_osc_controller.c \ ags/audio/osc/controller/ags_osc_action_controller.c \ ags/audio/osc/controller/ags_osc_config_controller.c \ ags/audio/osc/controller/ags_osc_export_controller.c \ ags/audio/osc/controller/ags_osc_front_controller.c \ ags/audio/osc/controller/ags_osc_info_controller.c \ ags/audio/osc/controller/ags_osc_meter_controller.c \ ags/audio/osc/controller/ags_osc_node_controller.c \ ags/audio/osc/controller/ags_osc_plugin_controller.c \ ags/audio/osc/controller/ags_osc_renew_controller.c \ ags/audio/osc/controller/ags_osc_status_controller.c deprecated_libags_audio_osc_xmlrpc_h_sources = libags_audio_osc_xmlrpc_h_sources = \ $(deprecated_libags_audio_osc_xmlrpc_h_sources) \ ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.h deprecated_libags_audio_osc_xmlrpc_c_sources = libags_audio_osc_xmlrpc_c_sources = \ $(deprecated_libags_audio_xmlrpc_osc_c_sources) \ ags/audio/osc/xmlrpc/ags_osc_xmlrpc_controller.c # libags-audio - jack deprecated_libags_audio_jack_h_sources = libags_audio_jack_h_sources = \ $(deprecated_libags_audio_jack_h_sources) \ ags/audio/jack/ags_jack_client.h \ ags/audio/jack/ags_jack_midiin.h \ ags/audio/jack/ags_jack_devout.h \ ags/audio/jack/ags_jack_devin.h \ ags/audio/jack/ags_jack_port.h \ ags/audio/jack/ags_jack_server.h deprecated_libags_audio_jack_c_sources = libags_audio_jack_c_sources = \ $(deprecated_libags_audio_jack_c_sources) \ ags/audio/jack/ags_jack_client.c \ ags/audio/jack/ags_jack_midiin.c \ ags/audio/jack/ags_jack_devout.c \ ags/audio/jack/ags_jack_devin.c \ ags/audio/jack/ags_jack_port.c \ ags/audio/jack/ags_jack_server.c # libags-audio - pulse deprecated_libags_audio_pulse_h_sources = libags_audio_pulse_h_sources = \ $(deprecated_libags_audio_pulse_h_sources) \ ags/audio/pulse/ags_pulse_client.h \ ags/audio/pulse/ags_pulse_devout.h \ ags/audio/pulse/ags_pulse_devin.h \ ags/audio/pulse/ags_pulse_port.h \ ags/audio/pulse/ags_pulse_server.h deprecated_libags_audio_pulse_c_sources = libags_audio_pulse_c_sources = \ $(deprecated_libags_audio_pulse_c_sources) \ ags/audio/pulse/ags_pulse_client.c \ ags/audio/pulse/ags_pulse_devout.c \ ags/audio/pulse/ags_pulse_devin.c \ ags/audio/pulse/ags_pulse_port.c \ ags/audio/pulse/ags_pulse_server.c # libags-audio - core-audio deprecated_libags_audio_core_audio_h_sources = libags_audio_core_audio_h_sources = \ $(deprecated_libags_audio_core_audio_h_sources) \ ags/audio/core-audio/ags_core_audio_client.h \ ags/audio/core-audio/ags_core_audio_midiin.h \ ags/audio/core-audio/ags_core_audio_devout.h \ ags/audio/core-audio/ags_core_audio_devin.h \ ags/audio/core-audio/ags_core_audio_port.h \ ags/audio/core-audio/ags_core_audio_server.h deprecated_libags_audio_core_audio_c_sources = libags_audio_core_audio_c_sources = \ $(deprecated_libags_audio_core_audio_c_sources) \ ags/audio/core-audio/ags_core_audio_client.c \ ags/audio/core-audio/ags_core_audio_midiin.c \ ags/audio/core-audio/ags_core_audio_devout.c \ ags/audio/core-audio/ags_core_audio_devin.c \ ags/audio/core-audio/ags_core_audio_port.c \ ags/audio/core-audio/ags_core_audio_server.c # libags-audio - wasapi deprecated_libags_audio_wasapi_h_sources = libags_audio_wasapi_h_sources = \ $(deprecated_libags_audio_wasapi_h_sources) \ ags/audio/wasapi/ags_wasapi_devout.h \ ags/audio/wasapi/ags_wasapi_devin.h deprecated_libags_audio_wasapi_c_sources = libags_audio_wasapi_c_sources = \ $(deprecated_libags_audio_wasapi_c_sources) \ ags/audio/wasapi/ags_wasapi_devout.c \ ags/audio/wasapi/ags_wasapi_devin.c # libags-audio - audio-unit deprecated_libags_audio_audio_unit_h_sources = libags_audio_audio_unit_h_sources = \ $(deprecated_libags_audio_audio_unit_h_sources) \ ags/audio/audio-unit/ags_audio_unit_client.h \ ags/audio/audio-unit/ags_audio_unit_devin.h \ ags/audio/audio-unit/ags_audio_unit_devout.h \ ags/audio/audio-unit/ags_audio_unit_port.h \ ags/audio/audio-unit/ags_audio_unit_server.h deprecated_libags_audio_audio_unit_c_sources = libags_audio_audio_unit_c_sources = \ $(deprecated_libags_audio_audio_unit_c_sources) \ ags/audio/audio-unit/ags_audio_unit_client.c \ ags/audio/audio-unit/ags_audio_unit_devin.c \ ags/audio/audio-unit/ags_audio_unit_devout.c \ ags/audio/audio-unit/ags_audio_unit_port.c \ ags/audio/audio-unit/ags_audio_unit_server.c # libags-audio - recall deprecated_libags_audio_recall_h_sources = libags_audio_recall_h_sources = \ $(deprecated_libags_audio_recall_h_sources) \ ags/audio/recall/ags_analyse_audio_signal.h \ ags/audio/recall/ags_analyse_channel.h \ ags/audio/recall/ags_analyse_channel_run.h \ ags/audio/recall/ags_analyse_recycling.h \ ags/audio/recall/ags_buffer_audio_signal.h \ ags/audio/recall/ags_buffer_channel.h \ ags/audio/recall/ags_buffer_channel_run.h \ ags/audio/recall/ags_buffer_recycling.h \ ags/audio/recall/ags_capture_wave_audio.h \ ags/audio/recall/ags_capture_wave_audio_run.h \ ags/audio/recall/ags_capture_wave_channel.h \ ags/audio/recall/ags_capture_wave_channel_run.h \ ags/audio/recall/ags_copy_audio_signal.h \ ags/audio/recall/ags_copy_channel.h \ ags/audio/recall/ags_copy_channel_run.h \ ags/audio/recall/ags_copy_pattern_audio.h \ ags/audio/recall/ags_copy_pattern_audio_run.h \ ags/audio/recall/ags_copy_pattern_channel.h \ ags/audio/recall/ags_copy_pattern_channel_run.h \ ags/audio/recall/ags_copy_recycling.h \ ags/audio/recall/ags_count_beats_audio.h \ ags/audio/recall/ags_count_beats_audio_run.h \ ags/audio/recall/ags_delay_audio.h \ ags/audio/recall/ags_delay_audio_run.h \ ags/audio/recall/ags_envelope_audio_signal.h \ ags/audio/recall/ags_envelope_channel.h \ ags/audio/recall/ags_envelope_channel_run.h \ ags/audio/recall/ags_envelope_recycling.h \ ags/audio/recall/ags_eq10_audio_signal.h \ ags/audio/recall/ags_eq10_channel.h \ ags/audio/recall/ags_eq10_channel_run.h \ ags/audio/recall/ags_eq10_recycling.h \ ags/audio/recall/ags_feed_audio_signal.h \ ags/audio/recall/ags_feed_channel.h \ ags/audio/recall/ags_feed_channel_run.h \ ags/audio/recall/ags_feed_recycling.h \ ags/audio/recall/ags_lfo_audio_signal.h \ ags/audio/recall/ags_lfo_channel.h \ ags/audio/recall/ags_lfo_channel_run.h \ ags/audio/recall/ags_lfo_recycling.h \ ags/audio/recall/ags_loop_channel.h \ ags/audio/recall/ags_loop_channel_run.h \ ags/audio/recall/ags_mute_audio.h \ ags/audio/recall/ags_mute_audio_run.h \ ags/audio/recall/ags_mute_audio_signal.h \ ags/audio/recall/ags_mute_channel.h \ ags/audio/recall/ags_mute_channel_run.h \ ags/audio/recall/ags_mute_recycling.h \ ags/audio/recall/ags_peak_audio_signal.h \ ags/audio/recall/ags_peak_channel.h \ ags/audio/recall/ags_peak_channel_run.h \ ags/audio/recall/ags_peak_recycling.h \ ags/audio/recall/ags_play_audio.h \ ags/audio/recall/ags_play_audio_signal.h \ ags/audio/recall/ags_play_channel.h \ ags/audio/recall/ags_play_channel_run.h \ ags/audio/recall/ags_play_channel_run_master.h \ ags/audio/recall/ags_play_dssi_audio.h \ ags/audio/recall/ags_play_dssi_audio_run.h \ ags/audio/recall/ags_play_lv2_audio.h \ ags/audio/recall/ags_play_lv2_audio_run.h \ ags/audio/recall/ags_play_notation_audio.h \ ags/audio/recall/ags_play_notation_audio_run.h \ ags/audio/recall/ags_play_recycling.h \ ags/audio/recall/ags_play_wave_audio.h \ ags/audio/recall/ags_play_wave_audio_run.h \ ags/audio/recall/ags_play_wave_channel.h \ ags/audio/recall/ags_play_wave_channel_run.h \ ags/audio/recall/ags_prepare_audio_signal.h \ ags/audio/recall/ags_prepare_channel.h \ ags/audio/recall/ags_prepare_channel_run.h \ ags/audio/recall/ags_prepare_recycling.h \ ags/audio/recall/ags_record_midi_audio.h \ ags/audio/recall/ags_record_midi_audio_run.h \ ags/audio/recall/ags_route_dssi_audio.h \ ags/audio/recall/ags_route_dssi_audio_run.h \ ags/audio/recall/ags_route_lv2_audio.h \ ags/audio/recall/ags_route_lv2_audio_run.h \ ags/audio/recall/ags_rt_stream_audio_signal.h \ ags/audio/recall/ags_rt_stream_channel.h \ ags/audio/recall/ags_rt_stream_channel_run.h \ ags/audio/recall/ags_rt_stream_recycling.h \ ags/audio/recall/ags_stream_audio_signal.h \ ags/audio/recall/ags_stream_channel.h \ ags/audio/recall/ags_stream_channel_run.h \ ags/audio/recall/ags_stream_recycling.h \ ags/audio/recall/ags_volume_audio_signal.h \ ags/audio/recall/ags_volume_channel.h \ ags/audio/recall/ags_volume_channel_run.h \ ags/audio/recall/ags_volume_recycling.h deprecated_libags_audio_recall_c_sources = libags_audio_recall_c_sources = \ $(deprecated_libags_audio_recall_c_sources) \ ags/audio/recall/ags_analyse_audio_signal.c \ ags/audio/recall/ags_analyse_channel.c \ ags/audio/recall/ags_analyse_channel_run.c \ ags/audio/recall/ags_analyse_recycling.c \ ags/audio/recall/ags_buffer_audio_signal.c \ ags/audio/recall/ags_buffer_channel.c \ ags/audio/recall/ags_buffer_channel_run.c \ ags/audio/recall/ags_buffer_recycling.c \ ags/audio/recall/ags_capture_wave_audio.c \ ags/audio/recall/ags_capture_wave_audio_run.c \ ags/audio/recall/ags_capture_wave_channel.c \ ags/audio/recall/ags_capture_wave_channel_run.c \ ags/audio/recall/ags_copy_audio_signal.c \ ags/audio/recall/ags_copy_channel.c \ ags/audio/recall/ags_copy_channel_run.c \ ags/audio/recall/ags_copy_pattern_audio.c \ ags/audio/recall/ags_copy_pattern_audio_run.c \ ags/audio/recall/ags_copy_pattern_channel.c \ ags/audio/recall/ags_copy_pattern_channel_run.c \ ags/audio/recall/ags_copy_recycling.c \ ags/audio/recall/ags_count_beats_audio.c \ ags/audio/recall/ags_count_beats_audio_run.c \ ags/audio/recall/ags_delay_audio.c \ ags/audio/recall/ags_delay_audio_run.c \ ags/audio/recall/ags_envelope_audio_signal.c \ ags/audio/recall/ags_envelope_channel.c \ ags/audio/recall/ags_envelope_channel_run.c \ ags/audio/recall/ags_envelope_recycling.c \ ags/audio/recall/ags_eq10_audio_signal.c \ ags/audio/recall/ags_eq10_channel.c \ ags/audio/recall/ags_eq10_channel_run.c \ ags/audio/recall/ags_eq10_recycling.c \ ags/audio/recall/ags_feed_audio_signal.c \ ags/audio/recall/ags_feed_channel.c \ ags/audio/recall/ags_feed_channel_run.c \ ags/audio/recall/ags_feed_recycling.c \ ags/audio/recall/ags_lfo_audio_signal.c \ ags/audio/recall/ags_lfo_channel.c \ ags/audio/recall/ags_lfo_channel_run.c \ ags/audio/recall/ags_lfo_recycling.c \ ags/audio/recall/ags_loop_channel.c \ ags/audio/recall/ags_loop_channel_run.c \ ags/audio/recall/ags_mute_audio.c \ ags/audio/recall/ags_mute_audio_run.c \ ags/audio/recall/ags_mute_audio_signal.c \ ags/audio/recall/ags_mute_channel.c \ ags/audio/recall/ags_mute_channel_run.c \ ags/audio/recall/ags_mute_recycling.c \ ags/audio/recall/ags_peak_audio_signal.c \ ags/audio/recall/ags_peak_channel.c \ ags/audio/recall/ags_peak_channel_run.c \ ags/audio/recall/ags_peak_recycling.c \ ags/audio/recall/ags_play_audio.c \ ags/audio/recall/ags_play_audio_signal.c \ ags/audio/recall/ags_play_channel.c \ ags/audio/recall/ags_play_channel_run.c \ ags/audio/recall/ags_play_channel_run_master.c \ ags/audio/recall/ags_play_dssi_audio.c \ ags/audio/recall/ags_play_dssi_audio_run.c \ ags/audio/recall/ags_play_lv2_audio.c \ ags/audio/recall/ags_play_lv2_audio_run.c \ ags/audio/recall/ags_play_notation_audio.c \ ags/audio/recall/ags_play_notation_audio_run.c \ ags/audio/recall/ags_play_recycling.c \ ags/audio/recall/ags_play_wave_audio.c \ ags/audio/recall/ags_play_wave_audio_run.c \ ags/audio/recall/ags_play_wave_channel.c \ ags/audio/recall/ags_play_wave_channel_run.c \ ags/audio/recall/ags_prepare_audio_signal.c \ ags/audio/recall/ags_prepare_channel.c \ ags/audio/recall/ags_prepare_channel_run.c \ ags/audio/recall/ags_prepare_recycling.c \ ags/audio/recall/ags_record_midi_audio.c \ ags/audio/recall/ags_record_midi_audio_run.c \ ags/audio/recall/ags_route_dssi_audio.c \ ags/audio/recall/ags_route_dssi_audio_run.c \ ags/audio/recall/ags_route_lv2_audio.c \ ags/audio/recall/ags_route_lv2_audio_run.c \ ags/audio/recall/ags_rt_stream_audio_signal.c \ ags/audio/recall/ags_rt_stream_channel.c \ ags/audio/recall/ags_rt_stream_channel_run.c \ ags/audio/recall/ags_rt_stream_recycling.c \ ags/audio/recall/ags_stream_audio_signal.c \ ags/audio/recall/ags_stream_channel.c \ ags/audio/recall/ags_stream_channel_run.c \ ags/audio/recall/ags_stream_recycling.c \ ags/audio/recall/ags_volume_audio_signal.c \ ags/audio/recall/ags_volume_channel.c \ ags/audio/recall/ags_volume_channel_run.c \ ags/audio/recall/ags_volume_recycling.c # libags-audio - task deprecated_libags_audio_task_h_sources = libags_audio_task_h_sources = \ $(deprecated_libags_audio_task_h_sources) \ ags/audio/task/ags_add_audio.h \ ags/audio/task/ags_add_audio_signal.h \ ags/audio/task/ags_add_effect.h \ ags/audio/task/ags_add_note.h \ ags/audio/task/ags_add_soundcard.h \ ags/audio/task/ags_apply_presets.h \ ags/audio/task/ags_apply_sound_config.h \ ags/audio/task/ags_apply_synth.h \ ags/audio/task/ags_cancel_audio.h \ ags/audio/task/ags_cancel_channel.h \ ags/audio/task/ags_clear_audio_signal.h \ ags/audio/task/ags_clear_buffer.h \ ags/audio/task/ags_crop_note.h \ ags/audio/task/ags_export_output.h \ ags/audio/task/ags_free_selection.h \ ags/audio/task/ags_link_channel.h \ ags/audio/task/ags_move_note.h \ ags/audio/task/ags_open_file.h \ ags/audio/task/ags_open_single_file.h \ ags/audio/task/ags_open_wave.h \ ags/audio/task/ags_remove_audio.h \ ags/audio/task/ags_remove_audio_signal.h \ ags/audio/task/ags_remove_note.h \ ags/audio/task/ags_remove_soundcard.h \ ags/audio/task/ags_resize_audio.h \ ags/audio/task/ags_seek_soundcard.h \ ags/audio/task/ags_set_audio_channels.h \ ags/audio/task/ags_set_buffer_size.h \ ags/audio/task/ags_set_device.h \ ags/audio/task/ags_set_format.h \ ags/audio/task/ags_set_samplerate.h \ ags/audio/task/ags_start_audio.h \ ags/audio/task/ags_start_channel.h \ ags/audio/task/ags_start_sequencer.h \ ags/audio/task/ags_start_soundcard.h \ ags/audio/task/ags_stop_sequencer.h \ ags/audio/task/ags_stop_soundcard.h \ ags/audio/task/ags_switch_buffer_flag.h \ ags/audio/task/ags_tic_device.h \ ags/audio/task/ags_toggle_pattern_bit.h \ ags/audio/task/ags_apply_bpm.h \ ags/audio/task/ags_apply_sequencer_length.h \ ags/audio/task/ags_apply_tact.h \ ags/audio/task/ags_reset_amplitude.h \ ags/audio/task/ags_reset_note.h \ ags/audio/task/ags_reset_peak.h \ ags/audio/task/ags_set_muted.h if WITH_LIBINSTPATCH libags_audio_task_h_sources += \ ags/audio/task/ags_open_sf2_instrument.h \ ags/audio/task/ags_open_sf2_sample.h endif deprecated_libags_audio_task_c_sources = libags_audio_task_c_sources = \ $(deprecated_libags_audio_task_c_sources) \ ags/audio/task/ags_add_audio.c \ ags/audio/task/ags_add_audio_signal.c \ ags/audio/task/ags_add_effect.c \ ags/audio/task/ags_add_note.c \ ags/audio/task/ags_add_soundcard.c \ ags/audio/task/ags_apply_presets.c \ ags/audio/task/ags_apply_sound_config.c \ ags/audio/task/ags_apply_synth.c \ ags/audio/task/ags_cancel_audio.c \ ags/audio/task/ags_cancel_channel.c \ ags/audio/task/ags_clear_audio_signal.c \ ags/audio/task/ags_clear_buffer.c \ ags/audio/task/ags_crop_note.c \ ags/audio/task/ags_export_output.c \ ags/audio/task/ags_free_selection.c \ ags/audio/task/ags_link_channel.c \ ags/audio/task/ags_move_note.c \ ags/audio/task/ags_open_file.c \ ags/audio/task/ags_open_single_file.c \ ags/audio/task/ags_open_wave.c \ ags/audio/task/ags_remove_audio.c \ ags/audio/task/ags_remove_audio_signal.c \ ags/audio/task/ags_remove_note.c \ ags/audio/task/ags_remove_soundcard.c \ ags/audio/task/ags_resize_audio.c \ ags/audio/task/ags_seek_soundcard.c \ ags/audio/task/ags_set_audio_channels.c \ ags/audio/task/ags_set_buffer_size.c \ ags/audio/task/ags_set_device.c \ ags/audio/task/ags_set_format.c \ ags/audio/task/ags_set_samplerate.c \ ags/audio/task/ags_start_audio.c \ ags/audio/task/ags_start_channel.c \ ags/audio/task/ags_start_sequencer.c \ ags/audio/task/ags_start_soundcard.c \ ags/audio/task/ags_stop_sequencer.c \ ags/audio/task/ags_stop_soundcard.c \ ags/audio/task/ags_switch_buffer_flag.c \ ags/audio/task/ags_tic_device.c \ ags/audio/task/ags_toggle_pattern_bit.c \ ags/audio/task/ags_apply_bpm.c \ ags/audio/task/ags_apply_sequencer_length.c \ ags/audio/task/ags_apply_tact.c \ ags/audio/task/ags_reset_amplitude.c \ ags/audio/task/ags_reset_note.c \ ags/audio/task/ags_reset_peak.c \ ags/audio/task/ags_set_muted.c if WITH_LIBINSTPATCH libags_audio_task_c_sources += \ ags/audio/task/ags_open_sf2_instrument.c \ ags/audio/task/ags_open_sf2_sample.c endif # libags-gui all files deprecated_libags_gui_h_sources = libags_gui_h_sources = \ $(deprecated_libags_gui_h_sources) \ ags/widget/ags_cartesian.h \ ags/widget/ags_dial.h \ ags/widget/ags_expander.h \ ags/widget/ags_expander_set.h \ ags/widget/ags_hindicator.h \ ags/widget/ags_hled_array.h \ ags/widget/ags_indicator.h \ ags/widget/ags_led.h \ ags/widget/ags_led_array.h \ ags/widget/ags_level.h \ ags/widget/ags_level_box.h \ ags/widget/ags_hlevel_box.h \ ags/widget/ags_vlevel_box.h \ ags/widget/ags_notebook.h \ ags/widget/ags_piano_keys.h \ ags/widget/ags_piano.h \ ags/widget/ags_scrolled_piano.h \ ags/widget/ags_scale.h \ ags/widget/ags_scale_box.h \ ags/widget/ags_vscale_box.h \ ags/widget/ags_hscale_box.h \ ags/widget/ags_scrolled_level_box.h \ ags/widget/ags_scrolled_scale_box.h \ ags/widget/ags_ruler.h \ ags/widget/ags_vindicator.h \ ags/widget/ags_vled_array.h \ ags/widget/ags_widget_marshal.h \ ags/widget/ags_container.h deprecated_libags_gui_c_sources = libags_gui_c_sources = \ $(deprecated_libags_gui_c_sources) \ ags/widget/ags_cartesian.c \ ags/widget/ags_dial.c \ ags/widget/ags_expander.c \ ags/widget/ags_expander_set.c \ ags/widget/ags_hindicator.c \ ags/widget/ags_hled_array.c \ ags/widget/ags_indicator.c \ ags/widget/ags_led.c \ ags/widget/ags_led_array.c \ ags/widget/ags_level.c \ ags/widget/ags_level_box.c \ ags/widget/ags_hlevel_box.c \ ags/widget/ags_vlevel_box.c \ ags/widget/ags_notebook.c \ ags/widget/ags_piano.c \ ags/widget/ags_scrolled_piano.c \ ags/widget/ags_scale.c \ ags/widget/ags_scale_box.c \ ags/widget/ags_vscale_box.c \ ags/widget/ags_hscale_box.c \ ags/widget/ags_scrolled_scale_box.c \ ags/widget/ags_scrolled_level_box.c \ ags/widget/ags_ruler.c \ ags/widget/ags_vindicator.c \ ags/widget/ags_vled_array.c \ ags/widget/ags_widget_marshal.c \ ags/widget/ags_container.c # libgsequencer all files deprecated_libgsequencer_h_sources = libgsequencer_h_sources = \ $(deprecated_libgsequencer_h_sources) \ ags/X/ags_animation_window.h \ ags/X/ags_automation_editor_callbacks.h \ ags/X/ags_automation_editor.h \ ags/X/ags_automation_window_callbacks.h \ ags/X/ags_automation_window.h \ ags/X/ags_audio_preferences_callbacks.h \ ags/X/ags_audio_preferences.h \ ags/X/ags_bulk_member_callbacks.h \ ags/X/ags_bulk_member.h \ ags/X/ags_connection_editor_callbacks.h \ ags/X/ags_connection_editor.h \ ags/X/ags_context_menu.h \ ags/X/ags_dssi_browser_callbacks.h \ ags/X/ags_dssi_browser.h \ ags/X/ags_effect_bridge_callbacks.h \ ags/X/ags_effect_bridge.h \ ags/X/ags_effect_bulk_callbacks.h \ ags/X/ags_effect_bulk.h \ ags/X/ags_effect_line_callbacks.h \ ags/X/ags_effect_line.h \ ags/X/ags_effect_pad_callbacks.h \ ags/X/ags_effect_pad.h \ ags/X/ags_effect_separator.h \ ags/X/ags_export_soundcard_callbacks.h \ ags/X/ags_export_soundcard.h \ ags/X/ags_export_window_callbacks.h \ ags/X/ags_export_window.h \ ags/X/ags_generic_preferences_callbacks.h \ ags/X/ags_generic_preferences.h \ ags/X/ags_input_collection_editor_callbacks.h \ ags/X/ags_input_collection_editor.h \ ags/X/ags_input_editor_callbacks.h \ ags/X/ags_input_editor.h \ ags/X/ags_input_listing_editor_callbacks.h \ ags/X/ags_input_listing_editor.h \ ags/X/ags_ladspa_browser_callbacks.h \ ags/X/ags_ladspa_browser.h \ ags/X/ags_lv2_browser_callbacks.h \ ags/X/ags_lv2_browser.h \ ags/X/ags_line_callbacks.h \ ags/X/ags_line_editor_callbacks.h \ ags/X/ags_line_editor.h \ ags/X/ags_line.h \ ags/X/ags_line_member_callbacks.h \ ags/X/ags_line_member_editor_callbacks.h \ ags/X/ags_line_member_editor.h \ ags/X/ags_line_member.h \ ags/X/ags_link_collection_editor_callbacks.h \ ags/X/ags_link_collection_editor.h \ ags/X/ags_link_editor_callbacks.h \ ags/X/ags_link_editor.h \ ags/X/ags_listing_editor_callbacks.h \ ags/X/ags_listing_editor.h \ ags/X/ags_machine_callbacks.h \ ags/X/ags_machine_editor_callbacks.h \ ags/X/ags_machine_editor.h \ ags/X/ags_machine.h \ ags/X/ags_menu_action_callbacks.h \ ags/X/ags_menu_bar.h \ ags/X/ags_midi_dialog_callbacks.h \ ags/X/ags_midi_dialog.h \ ags/X/ags_midi_preferences.h \ ags/X/ags_midi_preferences_callbacks.h \ ags/X/ags_navigation_callbacks.h \ ags/X/ags_navigation.h \ ags/X/ags_notation_editor_callbacks.h \ ags/X/ags_notation_editor.h \ ags/X/ags_osc_server_preferences_callbacks.h \ ags/X/ags_osc_server_preferences.h \ ags/X/ags_output_collection_editor_callbacks.h \ ags/X/ags_output_collection_editor.h \ ags/X/ags_output_editor_callbacks.h \ ags/X/ags_output_editor.h \ ags/X/ags_output_listing_editor_callbacks.h \ ags/X/ags_output_listing_editor.h \ ags/X/ags_pad_callbacks.h \ ags/X/ags_pad_editor_callbacks.h \ ags/X/ags_pad_editor.h \ ags/X/ags_pad.h \ ags/X/ags_performance_preferences_callbacks.h \ ags/X/ags_performance_preferences.h \ ags/X/ags_playback_window_callbacks.h \ ags/X/ags_playback_window.h \ ags/X/ags_plugin_browser_callbacks.h \ ags/X/ags_plugin_browser.h \ ags/X/ags_plugin_preferences_callbacks.h \ ags/X/ags_plugin_preferences.h \ ags/X/ags_preferences_callbacks.h \ ags/X/ags_preferences.h \ ags/X/ags_property_collection_editor_callbacks.h \ ags/X/ags_property_collection_editor.h \ ags/X/ags_property_editor_callbacks.h \ ags/X/ags_property_editor.h \ ags/X/ags_property_listing_editor.h \ ags/X/ags_resize_editor.h \ ags/X/ags_sequencer_editor_callbacks.h \ ags/X/ags_sequencer_editor.h \ ags/X/ags_server_preferences_callbacks.h \ ags/X/ags_server_preferences.h \ ags/X/ags_sheet_window.h \ ags/X/ags_sheet_window_callbacks.h \ ags/X/ags_sheet_editor.h \ ags/X/ags_sheet_editor_callbacks.h \ ags/X/ags_soundcard_editor_callbacks.h \ ags/X/ags_soundcard_editor.h \ ags/X/ags_ui_provider.h \ ags/X/ags_wave_window_callbacks.h \ ags/X/ags_wave_window.h \ ags/X/ags_wave_editor_callbacks.h \ ags/X/ags_wave_editor.h \ ags/X/ags_window.h \ ags/X/ags_window_callbacks.h \ ags/X/ags_xorg_application_context.h deprecated_libgsequencer_c_sources = libgsequencer_c_sources = \ $(deprecated_libgsequencer_c_sources) \ ags/X/ags_animation_window.c \ ags/X/ags_automation_editor.c \ ags/X/ags_automation_editor_callbacks.c \ ags/X/ags_automation_window.c \ ags/X/ags_automation_window_callbacks.c \ ags/X/ags_audio_preferences.c \ ags/X/ags_audio_preferences_callbacks.c \ ags/X/ags_bulk_member.c \ ags/X/ags_bulk_member_callbacks.c \ ags/X/ags_connection_editor_callbacks.c \ ags/X/ags_connection_editor.c \ ags/X/ags_context_menu.c \ ags/X/ags_dssi_browser_callbacks.c \ ags/X/ags_dssi_browser.c \ ags/X/ags_effect_bridge.c \ ags/X/ags_effect_bridge_callbacks.c \ ags/X/ags_effect_bulk.c \ ags/X/ags_effect_bulk_callbacks.c \ ags/X/ags_effect_line.c \ ags/X/ags_effect_line_callbacks.c \ ags/X/ags_effect_pad.c \ ags/X/ags_effect_pad_callbacks.c \ ags/X/ags_effect_separator.c \ ags/X/ags_export_soundcard.c \ ags/X/ags_export_soundcard_callbacks.c \ ags/X/ags_export_window.c \ ags/X/ags_export_window_callbacks.c \ ags/X/ags_generic_preferences.c \ ags/X/ags_generic_preferences_callbacks.c \ ags/X/ags_ladspa_browser.c \ ags/X/ags_ladspa_browser_callbacks.c \ ags/X/ags_lv2_browser.c \ ags/X/ags_lv2_browser_callbacks.c \ ags/X/ags_input_collection_editor_callbacks.c \ ags/X/ags_input_collection_editor.c \ ags/X/ags_input_editor_callbacks.c \ ags/X/ags_input_editor.c \ ags/X/ags_input_listing_editor_callbacks.c \ ags/X/ags_input_listing_editor.c \ ags/X/ags_line.c \ ags/X/ags_line_callbacks.c \ ags/X/ags_line_editor.c \ ags/X/ags_line_editor_callbacks.c \ ags/X/ags_line_member.c \ ags/X/ags_line_member_callbacks.c \ ags/X/ags_line_member_editor.c \ ags/X/ags_line_member_editor_callbacks.c \ ags/X/ags_link_collection_editor.c \ ags/X/ags_link_collection_editor_callbacks.c \ ags/X/ags_link_editor.c \ ags/X/ags_link_editor_callbacks.c \ ags/X/ags_listing_editor.c \ ags/X/ags_listing_editor_callbacks.c \ ags/X/ags_machine.c \ ags/X/ags_machine_callbacks.c \ ags/X/ags_machine_editor.c \ ags/X/ags_machine_editor_callbacks.c \ ags/X/ags_menu_action_callbacks.c \ ags/X/ags_menu_bar.c \ ags/X/ags_midi_dialog.c \ ags/X/ags_midi_dialog_callbacks.c \ ags/X/ags_midi_preferences.c \ ags/X/ags_midi_preferences_callbacks.c \ ags/X/ags_navigation.c \ ags/X/ags_navigation_callbacks.c \ ags/X/ags_notation_editor.c \ ags/X/ags_notation_editor_callbacks.c \ ags/X/ags_osc_server_preferences_callbacks.c \ ags/X/ags_osc_server_preferences.c \ ags/X/ags_output_collection_editor_callbacks.c \ ags/X/ags_output_collection_editor.c \ ags/X/ags_output_editor_callbacks.c \ ags/X/ags_output_editor.c \ ags/X/ags_output_listing_editor_callbacks.c \ ags/X/ags_output_listing_editor.c \ ags/X/ags_pad.c \ ags/X/ags_pad_callbacks.c \ ags/X/ags_pad_editor.c \ ags/X/ags_pad_editor_callbacks.c \ ags/X/ags_performance_preferences.c \ ags/X/ags_performance_preferences_callbacks.c \ ags/X/ags_playback_window.c \ ags/X/ags_playback_window_callbacks.c \ ags/X/ags_plugin_browser.c \ ags/X/ags_plugin_browser_callbacks.c \ ags/X/ags_plugin_preferences.c \ ags/X/ags_plugin_preferences_callbacks.c \ ags/X/ags_preferences.c \ ags/X/ags_preferences_callbacks.c \ ags/X/ags_property_collection_editor.c \ ags/X/ags_property_collection_editor_callbacks.c \ ags/X/ags_property_editor.c \ ags/X/ags_property_editor_callbacks.c \ ags/X/ags_property_listing_editor.c \ ags/X/ags_resize_editor.c \ ags/X/ags_sequencer_editor_callbacks.c \ ags/X/ags_sequencer_editor.c \ ags/X/ags_server_preferences.c \ ags/X/ags_server_preferences_callbacks.c \ ags/X/ags_sheet_window.c \ ags/X/ags_sheet_window_callbacks.c \ ags/X/ags_sheet_editor.c \ ags/X/ags_sheet_editor_callbacks.c \ ags/X/ags_ui_provider.c \ ags/X/ags_wave_window_callbacks.c \ ags/X/ags_wave_window.c \ ags/X/ags_wave_editor.c \ ags/X/ags_wave_editor_callbacks.c \ ags/X/ags_window.c \ ags/X/ags_soundcard_editor_callbacks.c \ ags/X/ags_soundcard_editor.c \ ags/X/ags_window_callbacks.c \ ags/X/ags_xorg_application_context.c # libgsequencer - OSC conotroller deprecated_libgsequencer_osc_controller_h_sources = libgsequencer_osc_controller_h_sources = \ $(deprecated_libgsequencer_osc_controller_h_sources) \ ags/X/osc/controller/ags_ui_osc_renew_controller.h deprecated_libgsequencer_osc_controller_c_sources = libgsequencer_osc_controller_c_sources = \ $(deprecated_libgsequencer_osc_controller_c_sources) \ ags/X/osc/controller/ags_ui_osc_renew_controller.c # libgsequencer - file deprecated_libgsequencer_file_h_sources = libgsequencer_file_h_sources = \ $(deprecated_libgsequencer_file_h_sources) \ ags/X/file/ags_simple_file.h deprecated_libgsequencer_file_c_sources = libgsequencer_file_c_sources = \ $(deprecated_libgsequencer_file_c_sources) \ ags/X/file/ags_simple_file.c # libgsequencer - task deprecated_libgsequencer_task_h_sources = libgsequencer_task_h_sources = \ $(deprecated_libgsequencer_task_h_sources) \ ags/X/task/ags_simple_file_read.h \ ags/X/task/ags_simple_file_write.h deprecated_libgsequencer_task_c_sources = libgsequencer_task_c_sources = \ $(deprecated_libgsequencer_task_c_sources) \ ags/X/task/ags_simple_file_read.c \ ags/X/task/ags_simple_file_write.c # libgsequencer - import deprecated_libgsequencer_import_h_sources = libgsequencer_import_h_sources = \ $(deprecated_libgsequencer_import_h_sources) \ ags/X/import/ags_midi_import_wizard.h \ ags/X/import/ags_midi_import_wizard_callbacks.h \ ags/X/import/ags_track_collection.h \ ags/X/import/ags_track_collection_callbacks.h \ ags/X/import/ags_track_collection_mapper.h \ ags/X/import/ags_track_collection_mapper_callbacks.h deprecated_libgsequencer_import_c_sources = libgsequencer_import_c_sources = \ $(deprecated_libgsequencer_import_c_sources) \ ags/X/import/ags_midi_import_wizard.c \ ags/X/import/ags_midi_import_wizard_callbacks.c \ ags/X/import/ags_track_collection.c \ ags/X/import/ags_track_collection_callbacks.c \ ags/X/import/ags_track_collection_mapper.c \ ags/X/import/ags_track_collection_mapper_callbacks.c # libgsequencer - export deprecated_libgsequencer_export_h_sources = libgsequencer_export_h_sources = \ $(deprecated_libgsequencer_export_h_sources) \ ags/X/export/ags_midi_export_wizard.h \ ags/X/export/ags_midi_export_wizard_callbacks.h \ ags/X/export/ags_machine_collection.h \ ags/X/export/ags_machine_collection_callbacks.h \ ags/X/export/ags_machine_collection_entry.h \ ags/X/export/ags_machine_collection_entry_callbacks.h \ ags/X/export/ags_wave_export_dialog.h \ ags/X/export/ags_wave_export_dialog_callbacks.h deprecated_libgsequencer_export_c_sources = libgsequencer_export_c_sources = \ $(deprecated_libgsequencer_export_c_sources) \ ags/X/export/ags_midi_export_wizard.c \ ags/X/export/ags_midi_export_wizard_callbacks.c \ ags/X/export/ags_machine_collection.c \ ags/X/export/ags_machine_collection_callbacks.c \ ags/X/export/ags_machine_collection_entry.c \ ags/X/export/ags_machine_collection_entry_callbacks.c \ ags/X/export/ags_wave_export_dialog.c \ ags/X/export/ags_wave_export_dialog_callbacks.c # libgsequencer - machine deprecated_libgsequencer_machine_h_sources = libgsequencer_machine_h_sources = \ $(deprecated_libgsequencer_machine_h_sources) \ ags/X/machine/ags_audiorec.h \ ags/X/machine/ags_audiorec_callbacks.h \ ags/X/machine/ags_cell_pattern_callbacks.h \ ags/X/machine/ags_cell_pattern.h \ ags/X/machine/ags_desk_callbacks.h \ ags/X/machine/ags_desk.h \ ags/X/machine/ags_desk_input_pad_callbacks.h \ ags/X/machine/ags_desk_input_pad.h \ ags/X/machine/ags_drum_callbacks.h \ ags/X/machine/ags_drum.h \ ags/X/machine/ags_drum_input_line_callbacks.h \ ags/X/machine/ags_drum_input_line.h \ ags/X/machine/ags_drum_input_pad_callbacks.h \ ags/X/machine/ags_drum_input_pad.h \ ags/X/machine/ags_drum_output_line_callbacks.h \ ags/X/machine/ags_drum_output_line.h \ ags/X/machine/ags_drum_output_pad_callbacks.h \ ags/X/machine/ags_drum_output_pad.h \ ags/X/machine/ags_dssi_bridge_callbacks.h \ ags/X/machine/ags_dssi_bridge.h \ ags/X/machine/ags_equalizer10.h \ ags/X/machine/ags_equalizer10_callbacks.h \ ags/X/machine/ags_fm_oscillator_callbacks.h \ ags/X/machine/ags_fm_oscillator.h \ ags/X/machine/ags_fm_syncsynth.h \ ags/X/machine/ags_fm_syncsynth_callbacks.h \ ags/X/machine/ags_fm_synth.h \ ags/X/machine/ags_fm_synth_callbacks.h \ ags/X/machine/ags_fm_synth_input_pad.h \ ags/X/machine/ags_fm_synth_input_line.h \ ags/X/machine/ags_fm_synth_input_line_callbacks.h \ ags/X/machine/ags_ladspa_bridge_callbacks.h \ ags/X/machine/ags_ladspa_bridge.h \ ags/X/machine/ags_live_dssi_bridge_callbacks.h \ ags/X/machine/ags_live_dssi_bridge.h \ ags/X/machine/ags_live_lv2_bridge_callbacks.h \ ags/X/machine/ags_live_lv2_bridge.h \ ags/X/machine/ags_lv2_bridge_callbacks.h \ ags/X/machine/ags_lv2_bridge.h \ ags/X/machine/ags_matrix_callbacks.h \ ags/X/machine/ags_matrix.h \ ags/X/machine/ags_matrix_bridge_callbacks.h \ ags/X/machine/ags_matrix_bridge.h \ ags/X/machine/ags_matrix_bulk_input_callbacks.h \ ags/X/machine/ags_matrix_bulk_input.h \ ags/X/machine/ags_mixer_callbacks.h \ ags/X/machine/ags_mixer.h \ ags/X/machine/ags_mixer_input_line.h \ ags/X/machine/ags_mixer_input_pad.h \ ags/X/machine/ags_oscillator_callbacks.h \ ags/X/machine/ags_oscillator.h \ ags/X/machine/ags_panel_callbacks.h \ ags/X/machine/ags_panel.h \ ags/X/machine/ags_panel_input_line.h \ ags/X/machine/ags_panel_input_line_callbacks.h \ ags/X/machine/ags_panel_input_pad.h \ ags/X/machine/ags_pattern_box_callbacks.h \ ags/X/machine/ags_pattern_box.h \ ags/X/machine/ags_pitch_sampler.h \ ags/X/machine/ags_pitch_sampler_callbacks.h \ ags/X/machine/ags_pitch_sampler_file.h \ ags/X/machine/ags_pitch_sampler_file_callbacks.h \ ags/X/machine/ags_synth_callbacks.h \ ags/X/machine/ags_syncsynth.h \ ags/X/machine/ags_syncsynth_callbacks.h \ ags/X/machine/ags_synth.h \ ags/X/machine/ags_synth_input_line.h \ ags/X/machine/ags_synth_input_line_callbacks.h \ ags/X/machine/ags_synth_input_pad.h \ ags/X/machine/ags_spectrometer.h \ ags/X/machine/ags_spectrometer_callbacks.h if WITH_LIBINSTPATCH libgsequencer_machine_h_sources += \ ags/X/machine/ags_ffplayer_callbacks.h \ ags/X/machine/ags_ffplayer.h \ ags/X/machine/ags_ffplayer_bridge_callbacks.h \ ags/X/machine/ags_ffplayer_bridge.h \ ags/X/machine/ags_ffplayer_bulk_input_callbacks.h \ ags/X/machine/ags_ffplayer_bulk_input.h \ ags/X/machine/ags_ffplayer_input_line_callbacks.h \ ags/X/machine/ags_ffplayer_input_line.h \ ags/X/machine/ags_ffplayer_input_pad_callbacks.h \ ags/X/machine/ags_ffplayer_input_pad.h endif deprecated_libgsequencer_machine_c_sources = libgsequencer_machine_c_sources = \ $(deprecated_libgsequencer_machine_c_sources) \ ags/X/machine/ags_audiorec.c \ ags/X/machine/ags_audiorec_callbacks.c \ ags/X/machine/ags_cell_pattern.c \ ags/X/machine/ags_cell_pattern_callbacks.c \ ags/X/machine/ags_desk_callbacks.c \ ags/X/machine/ags_desk.c \ ags/X/machine/ags_desk_input_pad_callbacks.c \ ags/X/machine/ags_desk_input_pad.c \ ags/X/machine/ags_drum.c \ ags/X/machine/ags_drum_callbacks.c \ ags/X/machine/ags_drum_input_line.c \ ags/X/machine/ags_drum_input_line_callbacks.c \ ags/X/machine/ags_drum_input_pad.c \ ags/X/machine/ags_drum_input_pad_callbacks.c \ ags/X/machine/ags_drum_output_line.c \ ags/X/machine/ags_drum_output_line_callbacks.c \ ags/X/machine/ags_drum_output_pad.c \ ags/X/machine/ags_drum_output_pad_callbacks.c \ ags/X/machine/ags_dssi_bridge.c \ ags/X/machine/ags_dssi_bridge_callbacks.c \ ags/X/machine/ags_equalizer10.c \ ags/X/machine/ags_equalizer10_callbacks.c \ ags/X/machine/ags_fm_oscillator_callbacks.c \ ags/X/machine/ags_fm_oscillator.c \ ags/X/machine/ags_fm_syncsynth.c \ ags/X/machine/ags_fm_syncsynth_callbacks.c \ ags/X/machine/ags_fm_synth.c \ ags/X/machine/ags_fm_synth_callbacks.c \ ags/X/machine/ags_fm_synth_input_pad.c \ ags/X/machine/ags_fm_synth_input_line.c \ ags/X/machine/ags_fm_synth_input_line_callbacks.c \ ags/X/machine/ags_ladspa_bridge.c \ ags/X/machine/ags_ladspa_bridge_callbacks.c \ ags/X/machine/ags_live_dssi_bridge.c \ ags/X/machine/ags_live_dssi_bridge_callbacks.c \ ags/X/machine/ags_live_lv2_bridge.c \ ags/X/machine/ags_live_lv2_bridge_callbacks.c \ ags/X/machine/ags_lv2_bridge.c \ ags/X/machine/ags_lv2_bridge_callbacks.c \ ags/X/machine/ags_matrix.c \ ags/X/machine/ags_matrix_callbacks.c \ ags/X/machine/ags_matrix_bridge.c \ ags/X/machine/ags_matrix_bridge_callbacks.c \ ags/X/machine/ags_matrix_bulk_input.c \ ags/X/machine/ags_matrix_bulk_input_callbacks.c \ ags/X/machine/ags_mixer.c \ ags/X/machine/ags_mixer_callbacks.c \ ags/X/machine/ags_mixer_input_line.c \ ags/X/machine/ags_mixer_input_pad.c \ ags/X/machine/ags_oscillator.c \ ags/X/machine/ags_oscillator_callbacks.c \ ags/X/machine/ags_panel.c \ ags/X/machine/ags_panel_callbacks.c \ ags/X/machine/ags_panel_input_line.c \ ags/X/machine/ags_panel_input_line_callbacks.c \ ags/X/machine/ags_panel_input_pad.c \ ags/X/machine/ags_pattern_box_callbacks.c \ ags/X/machine/ags_pattern_box.c \ ags/X/machine/ags_pitch_sampler.c \ ags/X/machine/ags_pitch_sampler_callbacks.c \ ags/X/machine/ags_pitch_sampler_file.c \ ags/X/machine/ags_pitch_sampler_file_callbacks.c \ ags/X/machine/ags_syncsynth.c \ ags/X/machine/ags_syncsynth_callbacks.c \ ags/X/machine/ags_synth.c \ ags/X/machine/ags_synth_callbacks.c \ ags/X/machine/ags_synth_input_line.c \ ags/X/machine/ags_synth_input_line_callbacks.c \ ags/X/machine/ags_synth_input_pad.c \ ags/X/machine/ags_spectrometer.c \ ags/X/machine/ags_spectrometer_callbacks.c if WITH_LIBINSTPATCH libgsequencer_machine_c_sources += \ ags/X/machine/ags_ffplayer.c \ ags/X/machine/ags_ffplayer_callbacks.c \ ags/X/machine/ags_ffplayer_bridge.c \ ags/X/machine/ags_ffplayer_bridge_callbacks.c \ ags/X/machine/ags_ffplayer_bulk_input.c \ ags/X/machine/ags_ffplayer_bulk_input_callbacks.c \ ags/X/machine/ags_ffplayer_input_line.c \ ags/X/machine/ags_ffplayer_input_line_callbacks.c \ ags/X/machine/ags_ffplayer_input_pad.c \ ags/X/machine/ags_ffplayer_input_pad_callbacks.c endif # libgsequencer - editor deprecated_libgsequencer_editor_h_sources = libgsequencer_editor_h_sources = \ $(deprecated_libgsequencer_editor_h_sources) \ ags/X/editor/ags_automation_edit_callbacks.h \ ags/X/editor/ags_automation_edit_box.h \ ags/X/editor/ags_automation_edit.h \ ags/X/editor/ags_automation_meta_callbacks.h \ ags/X/editor/ags_automation_meta.h \ ags/X/editor/ags_automation_toolbar_callbacks.h \ ags/X/editor/ags_automation_toolbar.h \ ags/X/editor/ags_crop_note_dialog_callbacks.h \ ags/X/editor/ags_crop_note_dialog.h \ ags/X/editor/ags_envelope_dialog_callbacks.h \ ags/X/editor/ags_envelope_dialog.h \ ags/X/editor/ags_envelope_editor_callbacks.h \ ags/X/editor/ags_envelope_editor.h \ ags/X/editor/ags_envelope_info_callbacks.h \ ags/X/editor/ags_envelope_info.h \ ags/X/editor/ags_machine_radio_button.h \ ags/X/editor/ags_machine_radio_button_callbacks.h \ ags/X/editor/ags_machine_selection.h \ ags/X/editor/ags_machine_selector_callbacks.h \ ags/X/editor/ags_machine_selector.h \ ags/X/editor/ags_move_note_dialog_callbacks.h \ ags/X/editor/ags_move_note_dialog.h \ ags/X/editor/ags_notation_edit_callbacks.h \ ags/X/editor/ags_notation_edit.h \ ags/X/editor/ags_notation_meta_callbacks.h \ ags/X/editor/ags_notation_meta.h \ ags/X/editor/ags_notation_toolbar_callbacks.h \ ags/X/editor/ags_notation_toolbar.h \ ags/X/editor/ags_pattern_envelope_callbacks.h \ ags/X/editor/ags_pattern_envelope.h \ ags/X/editor/ags_position_automation_cursor_dialog.h \ ags/X/editor/ags_position_automation_cursor_dialog_callbacks.h \ ags/X/editor/ags_position_notation_cursor_dialog.h \ ags/X/editor/ags_position_notation_cursor_dialog_callbacks.h \ ags/X/editor/ags_position_wave_cursor_dialog.h \ ags/X/editor/ags_position_wave_cursor_dialog_callbacks.h \ ags/X/editor/ags_ramp_acceleration_dialog.h \ ags/X/editor/ags_ramp_acceleration_dialog_callbacks.h \ ags/X/editor/ags_scrolled_automation_edit_box.h \ ags/X/editor/ags_scrolled_wave_edit_box.h \ ags/X/editor/ags_select_acceleration_dialog.h \ ags/X/editor/ags_select_acceleration_dialog_callbacks.h \ ags/X/editor/ags_select_buffer_dialog.h \ ags/X/editor/ags_select_buffer_dialog_callbacks.h \ ags/X/editor/ags_select_note_dialog.h \ ags/X/editor/ags_select_note_dialog_callbacks.h \ ags/X/editor/ags_sheet_edit.h \ ags/X/editor/ags_sheet_edit_callbacks.h \ ags/X/editor/ags_sheet_toolbar.h \ ags/X/editor/ags_sheet_toolbar_callbacks.h \ ags/X/editor/ags_vautomation_edit_box.h \ ags/X/editor/ags_vwave_edit_box.h \ ags/X/editor/ags_wave_edit_callbacks.h \ ags/X/editor/ags_wave_edit.h \ ags/X/editor/ags_wave_edit_box.h \ ags/X/editor/ags_wave_meta_callbacks.h \ ags/X/editor/ags_wave_meta.h \ ags/X/editor/ags_wave_toolbar_callbacks.h \ ags/X/editor/ags_wave_toolbar.h deprecated_libgsequencer_editor_c_sources = libgsequencer_editor_c_sources = \ $(deprecated_libgsequencer_editor_c_sources) \ ags/X/editor/ags_automation_edit.c \ ags/X/editor/ags_automation_edit_box.c \ ags/X/editor/ags_automation_edit_callbacks.c \ ags/X/editor/ags_automation_meta.c \ ags/X/editor/ags_automation_meta_callbacks.c \ ags/X/editor/ags_automation_toolbar.c \ ags/X/editor/ags_automation_toolbar_callbacks.c \ ags/X/editor/ags_crop_note_dialog_callbacks.c \ ags/X/editor/ags_crop_note_dialog.c \ ags/X/editor/ags_envelope_dialog_callbacks.c \ ags/X/editor/ags_envelope_dialog.c \ ags/X/editor/ags_envelope_editor_callbacks.c \ ags/X/editor/ags_envelope_editor.c \ ags/X/editor/ags_envelope_info_callbacks.c \ ags/X/editor/ags_envelope_info.c \ ags/X/editor/ags_machine_radio_button.c \ ags/X/editor/ags_machine_radio_button_callbacks.c \ ags/X/editor/ags_machine_selection.c \ ags/X/editor/ags_machine_selector.c \ ags/X/editor/ags_machine_selector_callbacks.c \ ags/X/editor/ags_move_note_dialog_callbacks.c \ ags/X/editor/ags_move_note_dialog.c \ ags/X/editor/ags_notation_edit.c \ ags/X/editor/ags_notation_edit_callbacks.c \ ags/X/editor/ags_notation_meta.c \ ags/X/editor/ags_notation_meta_callbacks.c \ ags/X/editor/ags_notation_toolbar.c \ ags/X/editor/ags_notation_toolbar_callbacks.c \ ags/X/editor/ags_pattern_envelope_callbacks.c \ ags/X/editor/ags_pattern_envelope.c \ ags/X/editor/ags_position_automation_cursor_dialog.c \ ags/X/editor/ags_position_automation_cursor_dialog_callbacks.c \ ags/X/editor/ags_position_notation_cursor_dialog.c \ ags/X/editor/ags_position_notation_cursor_dialog_callbacks.c \ ags/X/editor/ags_position_wave_cursor_dialog.c \ ags/X/editor/ags_position_wave_cursor_dialog_callbacks.c \ ags/X/editor/ags_ramp_acceleration_dialog.c \ ags/X/editor/ags_ramp_acceleration_dialog_callbacks.c \ ags/X/editor/ags_scrolled_automation_edit_box.c \ ags/X/editor/ags_scrolled_wave_edit_box.c \ ags/X/editor/ags_select_acceleration_dialog.c \ ags/X/editor/ags_select_acceleration_dialog_callbacks.c \ ags/X/editor/ags_select_buffer_dialog.c \ ags/X/editor/ags_select_buffer_dialog_callbacks.c \ ags/X/editor/ags_select_note_dialog.c \ ags/X/editor/ags_select_note_dialog_callbacks.c \ ags/X/editor/ags_sheet_edit.c \ ags/X/editor/ags_sheet_edit_callbacks.c \ ags/X/editor/ags_sheet_toolbar.c \ ags/X/editor/ags_sheet_toolbar_callbacks.c \ ags/X/editor/ags_vautomation_edit_box.c \ ags/X/editor/ags_vwave_edit_box.c \ ags/X/editor/ags_wave_edit.c \ ags/X/editor/ags_wave_edit_box.c \ ags/X/editor/ags_wave_edit_callbacks.c \ ags/X/editor/ags_wave_meta.c \ ags/X/editor/ags_wave_meta_callbacks.c \ ags/X/editor/ags_wave_toolbar.c \ ags/X/editor/ags_wave_toolbar_callbacks.c # libags-vst deprecated_libags_vst_h_sources = libags_vst_h_sources = \ $(deprecated_libags_vst_h_sources) \ ags/vst3-capi/pluginterfaces/vst/ags_vst_types.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_futils.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_fplatform.h \ ags/vst3-capi/pluginterfaces/base/ags_vst_smart_pointer.h \ ags/vst3-capi/util/ags_vst_string_util.h \ ags/vst3-capi/base/source/ags_vst_fbuffer.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.h \ ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.h deprecated_libags_vst_c_sources = libags_vst_c_sources = \ $(deprecated_libags_vst_c_sources) \ ags/vst3-capi/pluginterfaces/base/ags_vst_icloneable.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_geo_constants.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ierror_context.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_fvariant.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_funknown.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ftypes.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_iplugin_base.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_futils.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ibstream.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_fstrdefs.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_const_string_table.cpp \ ags/vst3-capi/pluginterfaces/base/ags_vst_ipersistent.cpp \ ags/vst3-capi/util/ags_vst_string_util.cpp \ ags/vst3-capi/base/source/ags_vst_fbuffer.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_audio_effect.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_component_base.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_edit_controller.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_bus.cpp \ ags/vst3-capi/public.sdk/source/vst/ags_vst_parameters.cpp # gsequencer all files gsequencerheaders = \ ags/gsequencer_main.h gsequencer_c_sources = \ ags/gsequencer_main.c midi2xml_CFLAGS += -I./ $(LIBXML2_CFLAGS) $(GOBJECT_CFLAGS) $(GIO_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(LIBSOUP_CFLAGS) $(W32API_CFLAGS) midi2xml_LDFLAGS += $(LIBXML2_LIBS) $(GOBJECT_LIBS) $(LIBSOUP_LIBS) $(LIBINSTPATCH_LIBS) $(W32API_LIBS) midi2xml_LDADD = libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la if WITH_W32API else if WITH_OSXAPI else midi2xml_LDADD += -ldl endif endif midi2xml_SOURCES = ags/midi2xml_main.c ags-integration-unit-test: $(MAKE) -C $(top_srcdir) -f unit-system-tests.mk ags-check-system-unit-tests ags-integration-functional-test: $(MAKE) -C $(top_srcdir) -f functional-system-tests.mk ags-check-system-functional-test libtool: $(LIBTOOL_DEPS) $(SHELL) ./config.status libtool gsequencer.1: gsequencer.1.xml xsltproc --nonet --param make.year.ranges 1 --param make.single.year.ranges 1 --param man.charmap.use.subset 0 -o $(top_srcdir) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl gsequencer.1.xml midi2xml.1: midi2xml.1.xml xsltproc --nonet --param make.year.ranges 1 --param make.single.year.ranges 1 --param man.charmap.use.subset 0 -o $(top_srcdir)/ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl midi2xml.1.xml gsequencer.desktop: gsequencer.desktop.in if FREEBSD $(AM_V_GEN)sed -e 's,\@datadir\@,$(datadir),g' < $(top_srcdir)/gsequencer.desktop.in > $(top_builddir)/gsequencer.desktop else $(AM_V_GEN)sed -e 's,\@datadir\@,$(datadir),g' < "$<" > $@ endif html: mkdir -p $(top_builddir)/html/ mkdir -p $(top_builddir)/html/developer-docs mkdir -p $(top_builddir)/html/user-docs mkdir -p $(top_builddir)/html/osc-docs xsltproc --output $(top_builddir)/html/user-docs/ --xinclude $(HTMLHELP_XSL) $(top_srcdir)/docs/usersBook.xml xsltproc --output $(top_builddir)/html/developer-docs/ --xinclude $(HTMLHELP_XSL) $(top_srcdir)/docs/developersBook.xml xsltproc --output $(top_builddir)/html/osc-docs/ --xinclude $(HTMLHELP_XSL) $(top_srcdir)/docs/oscBook.xml mkdir -p $(top_srcdir)/docs/reference/libags/libags-html mkdir -p $(top_srcdir)/docs/reference/libags-audio/libags-audio-html mkdir -p $(top_srcdir)/docs/reference/libags-gui/libags-gui-html mkdir -p $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html $(MAKE) -C $(top_srcdir)/docs/reference/libags cd $(top_srcdir) $(MAKE) -C $(top_srcdir)/docs/reference/libags-audio cd $(top_srcdir) $(MAKE) -C $(top_srcdir)/docs/reference/libags-gui cd $(top_srcdir) $(MAKE) -C $(top_srcdir)/docs/reference/libgsequencer cd $(top_srcdir) install-compress-changelog: rm -f $(DESTDIR)/$(docdir)/changelog gzip -9 -c $(top_srcdir)/ChangeLog > $(DESTDIR)/$(docdir)/changelog.gz install-data-local: mkdir -p $(DESTDIR)/$(includedir)/ags install -c -p -m 644 $(top_builddir)/ags/ags_config.h $(DESTDIR)/$(includedir)/ags/config.h mkdir -p $(DESTDIR)/$(datadir)/gsequencer/icons mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/32x32/apps mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/48x48/apps mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/64x64/apps mkdir -p $(DESTDIR)/$(datadir)/icons/hicolor/128x128/apps mkdir -p $(DESTDIR)/$(datadir)/gsequencer/images mkdir -p $(DESTDIR)/$(datadir)/gsequencer/styles mkdir -p $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION) mkdir -p $(DESTDIR)/$(datadir)/xml/gsequencer/stylesheet/ags-xsl/midi-xml mkdir -p $(DESTDIR)/$(datadir)/mime/packages mkdir -p $(DESTDIR)/$(datadir)/metainfo install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/ags.xpm $(DESTDIR)/$(datadir)/gsequencer/icons/ags.xpm install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/jumper.png $(DESTDIR)/$(datadir)/gsequencer/icons/jumper.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/ags.png $(DESTDIR)/$(datadir)/gsequencer/icons/ags.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-32x32.png $(DESTDIR)/$(datadir)/icons/hicolor/32x32/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-48x48.png $(DESTDIR)/$(datadir)/icons/hicolor/48x48/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-64x64.png $(DESTDIR)/$(datadir)/icons/hicolor/64x64/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/icons/gsequencer-128x128.png $(DESTDIR)/$(datadir)/icons/hicolor/128x128/apps/gsequencer.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/images/ags.png $(DESTDIR)/$(datadir)/gsequencer/images/ags.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/images/gsequencer-800x450.png $(DESTDIR)/$(datadir)/gsequencer/images/gsequencer-800x450.png install -c -p -m 644 $(top_srcdir)/gsequencer.share/styles/ags.css $(DESTDIR)/$(datadir)/gsequencer/styles/ags.css install -c -p -m 644 $(top_srcdir)/ags/X/file/ags_simple_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags/audio/midi/ags_midi_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags/audio/osc/ags_osc_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags/file/ags_file.dtd $(DESTDIR)/$(datadir)/xml/gsequencer/schema/dtd/$(PACKAGE_VERSION)/ install -c -p -m 644 $(top_srcdir)/ags.xsl $(DESTDIR)/$(datadir)/xml/gsequencer/stylesheet/ags-xsl/midi-xml/ install -c -p -m 644 $(top_srcdir)/ags-simple.xsl $(DESTDIR)/$(datadir)/xml/gsequencer/stylesheet/ags-xsl/midi-xml/ install -c -p -m 644 $(top_srcdir)/application-x-gsequencer.xml $(DESTDIR)/$(datadir)/mime/packages/gsequencer.xml install -c -p -m 644 $(top_srcdir)/org.nongnu.gsequencer.gsequencer.appdata.xml $(DESTDIR)/$(datadir)/metainfo/ mkdir -p $(DESTDIR)/$(docdir)/ install -c -p -m 644 $(top_srcdir)/ChangeLog $(DESTDIR)/$(docdir)/changelog fix-local-html: find $(top_srcdir)/docs/reference/libags/libags-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-audio-html/$(LIBAGS_AUDIO_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-gui-html/$(LIBAGS_GUI_API_DOC)/g' {} \; fix-local-html-bsd: find $(top_srcdir)/docs/reference/libags/libags-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gobject/$(GOBJECT_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/gtk3/$(GTK_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-html/$(LIBAGS_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-audio-html/$(LIBAGS_AUDIO_API_DOC)/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i '' -e 's/\.\.\/libags-gui-html/$(LIBAGS_GUI_API_DOC)/g' {} \; fix-online-books-html: find $(top_srcdir)/html/ -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\/usr\/share\/icons\/Adwaita\/32x32\/actions/..\/images/g' {} \; find $(top_srcdir)/html/ -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\/usr\/share\/icons\/Adwaita\/32x32\/apps/..\/images/g' {} \; fix-online-html: find $(top_srcdir)/docs/reference/libags/libags-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libags-audio/libags-audio-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/\.\.\/libags/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libags-gui/libags-gui-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/https\:\/\/developer\.gnome\.org\/gtk3\/stable/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gobject/https\:\/\/developer\.gnome\.org\/gobject\/stable/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/gtk3/https\:\/\/developer\.gnome\.org\/gtk3\/stable/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-html/\.\.\/libags/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-audio-html/\.\.\/libags-audio/g' {} \; find $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html -name "*.html" -type f -exec $(AM_V_GEN)sed -i 's/\.\.\/libags-gui-html/\.\.\/libags-gui/g' {} \; install-html-mkdir-links: echo "creating upstream API reference manual directory [$(AGS_WITH_UPSTREAM_GTK_DOC)]" if AGS_WITH_UPSTREAM_GTK_DOC if ENABLE_GTK_DOC mkdir -p $(DESTDIR)/$(LIBAGS_API_DIR) mkdir -p $(DESTDIR)/$(LIBAGS_AUDIO_API_DIR) mkdir -p $(DESTDIR)/$(LIBAGS_GUI_API_DIR) mkdir -p $(DESTDIR)/$(LIBGSEQUENCER_API_DIR) endif endif install-html-mkdir: if AGS_WITH_SINGLE_DOCDIR mkdir -p $(DESTDIR)/$(docdir)/images mkdir -p $(DESTDIR)/$(docdir)/user-manual mkdir -p $(DESTDIR)/$(docdir)/developer-manual mkdir -p $(DESTDIR)/$(docdir)/osc-manual else mkdir -p $(DESTDIR)/$(docdir)/images mkdir -p $(DESTDIR)/$(docdir)/html mkdir -p $(DESTDIR)/$(datadir)/doc/libags-audio-doc/images mkdir -p $(DESTDIR)/$(datadir)/doc/libags-audio-doc/html mkdir -p $(DESTDIR)/$(datadir)/doc/libags-audio-doc/osc-server if ENABLE_GTK_DOC mkdir -p $(DESTDIR)/$(datadir)/gtk-doc/html endif endif if AGS_WITH_UPSTREAM_GTK_DOC else if ENABLE_GTK_DOC mkdir -p $(DESTDIR)/$(LIBAGS_API_DIR) mkdir -p $(DESTDIR)/$(LIBAGS_AUDIO_API_DIR) mkdir -p $(DESTDIR)/$(LIBAGS_GUI_API_DIR) mkdir -p $(DESTDIR)/$(LIBGSEQUENCER_API_DIR) endif endif install-html-links: install-html-mkdir-links echo "creating links [$(AGS_WITH_UPSTREAM_GTK_DOC)]" if AGS_WITH_SINGLE_DOCDIR else if AGS_WITH_UPSTREAM_GTK_DOC if ENABLE_GTK_DOC ln -s ../../doc/libags-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libags ln -s ../../doc/libags-audio-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libags_audio ln -s ../../doc/libags-gui-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libags_gui ln -s ../../doc/libgsequencer-doc/api $(DESTDIR)/$(datadir)/gtk-doc/html/libgsequencer endif endif endif install-html: install-html-mkdir install-html-links if AGS_WITH_SINGLE_DOCDIR install -c -p -m 644 $(userdocimages) $(DESTDIR)/$(docdir)/images/ install -c -p -m 644 $(devdocimages) $(DESTDIR)/$(docdir)/images/ install -c -p -m 644 $(top_builddir)/html/user-docs/* $(DESTDIR)/$(docdir)/user-manual/ install -c -p -m 644 $(top_builddir)/html/developer-docs/* $(DESTDIR)/$(docdir)/developer-manual/ install -c -p -m 644 $(top_builddir)/html/osc-docs/* $(DESTDIR)/$(docdir)/osc-manual/ else install -c -p -m 644 $(userdocimages) $(DESTDIR)/$(docdir)/images/ install -c -p -m 644 $(devdocimages) $(DESTDIR)/$(datadir)/doc/libags-audio-doc/images/ install -c -p -m 644 $(top_builddir)/html/user-docs/* $(DESTDIR)/$(docdir)/html/ install -c -p -m 644 $(top_builddir)/html/developer-docs/* $(DESTDIR)/$(datadir)/doc/libags-audio-doc/html/ install -c -p -m 644 $(top_builddir)/html/osc-docs/* $(DESTDIR)/$(datadir)/doc/libags-audio-doc/osc-server/ endif if ENABLE_GTK_DOC install -c -p -m 644 $(top_srcdir)/docs/reference/libags/libags-html/* $(DESTDIR)/$(LIBAGS_API_DIR) install -c -p -m 644 $(top_srcdir)/docs/reference/libags-audio/libags-audio-html/* $(DESTDIR)/$(LIBAGS_AUDIO_API_DIR) install -c -p -m 644 $(top_srcdir)/docs/reference/libags-gui/libags-gui-html/* $(DESTDIR)/$(LIBAGS_GUI_API_DIR) install -c -p -m 644 $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html/* $(DESTDIR)/$(LIBGSEQUENCER_API_DIR) endif uninstall-hook: rm -rf $(DESTDIR)/$(includedir)/ags/config.h rm -rf $(DESTDIR)/$(datadir)/gsequencer rm -rf $(DESTDIR)/$(docdir) rm -rf $(DESTDIR)/$(datadir)/xml/gsequencer if AGS_WITH_SINGLE_DOCDIR else rm -rf $(DESTDIR)/$(datadir)/doc/libags-doc rm -rf $(DESTDIR)/$(datadir)/doc/libags-audio-doc rm -rf $(DESTDIR)/$(datadir)/doc/libags-gui-doc rm -rf $(DESTDIR)/$(datadir)/doc/libgsequencer-doc rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libags rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libags_audio rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libags_gui rm -rf $(DESTDIR)/$(datadir)/gtk-doc/html/libgsequencer endif rm -f $(DESTDIR)/$(datadir)/icons/hicolor/32x32/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/icons/hicolor/48x48/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/icons/hicolor/64x64/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/icons/hicolor/128x128/apps/gsequencer.png rm -f $(DESTDIR)/$(datadir)/mime/packages/gsequencer.xml rm -f $(DESTDIR)/$(datadir)/metainfo/org.nongnu.gsequencer.gsequencer.appdata.xml rm -f $(DESTDIR)/$(pkgconfigdir)/libags.pc rm -f $(DESTDIR)/$(pkgconfigdir)/libags_audio.pc rm -f $(DESTDIR)/$(pkgconfigdir)/libags_gui.pc rm -f $(DESTDIR)/$(pkgconfigdir)/libgsequencer.pc clean-local: rm -rf $(top_srcdir)/html rm -rf $(top_srcdir)/docs/reference/libags/xml rm -rf $(top_srcdir)/docs/reference/libags/libags-html rm -rf $(top_srcdir)/docs/reference/libags/tmpl rm -rf $(top_srcdir)/docs/reference/libags-audio/xml rm -rf $(top_srcdir)/docs/reference/libags-audio/libags-audio-html rm -rf $(top_srcdir)/docs/reference/libags-audio/tmpl rm -rf $(top_srcdir)/docs/reference/libags-gui/xml rm -rf $(top_srcdir)/docs/reference/libags-gui/libags-gui-html rm -rf $(top_srcdir)/docs/reference/libags-gui/tmpl rm -rf $(top_srcdir)/docs/reference/libgsequencer/xml rm -rf $(top_srcdir)/docs/reference/libgsequencer/libgsequencer-html rm -rf $(top_srcdir)/docs/reference/libgsequencer/tmpl rm -f $(top_builddir)/docs/reference/libags/Makefile rm -f $(top_builddir)/docs/reference/libags-audio/Makefile rm -f $(top_builddir)/docs/reference/libags-gui/Makefile rm -f $(top_builddir)/docs/reference/libgsequencer/Makefile rm -f $(top_builddir)/unit-system-tests.mk rm -f $(top_builddir)/functional-system-tests.mk rm -f docs/reference/libags-audio/libags_audio-decl-list.txt rm -f docs/reference/libags-audio/libags_audio-decl.txt rm -f docs/reference/libags-audio/libags_audio-undeclared.txt rm -f docs/reference/libags-audio/libags_audio-undocumented.txt rm -f docs/reference/libags-audio/libags_audio-unused.txt rm -f docs/reference/libags-audio/libags_audio.args rm -f docs/reference/libags-audio/libags_audio.hierarchy rm -f docs/reference/libags-audio/libags_audio.prerequisites rm -f docs/reference/libags-audio/libags_audio.signals rm -f docs/reference/libags-gui/libags_gui-decl-list.txt rm -f docs/reference/libags-gui/libags_gui-decl.txt rm -f docs/reference/libags-gui/libags_gui-undeclared.txt rm -f docs/reference/libags-gui/libags_gui-undocumented.txt rm -f docs/reference/libags-gui/libags_gui-unused.txt rm -f docs/reference/libags-gui/libags_gui.args rm -f docs/reference/libags-gui/libags_gui.hierarchy rm -f docs/reference/libags-gui/libags_gui.prerequisites rm -f docs/reference/libags-gui/libags_gui.signals rm -f docs/reference/libags/libags-decl-list.txt rm -f docs/reference/libags/libags-decl.txt rm -f docs/reference/libags/libags-undeclared.txt rm -f docs/reference/libags/libags-undocumented.txt rm -f docs/reference/libags/libags-unused.txt rm -f docs/reference/libags/libags.args rm -f docs/reference/libags/libags.hierarchy rm -f docs/reference/libags/libags.prerequisites rm -f docs/reference/libags/libags.signals rm -f docs/reference/libgsequencer/libgsequencer-decl-list.txt rm -f docs/reference/libgsequencer/libgsequencer-decl.txt rm -f docs/reference/libgsequencer/libgsequencer-undeclared.txt rm -f docs/reference/libgsequencer/libgsequencer-undocumented.txt rm -f docs/reference/libgsequencer/libgsequencer-unused.txt rm -f docs/reference/libgsequencer/libgsequencer.args rm -f docs/reference/libgsequencer/libgsequencer.hierarchy rm -f docs/reference/libgsequencer/libgsequencer.prerequisites rm -f docs/reference/libgsequencer/libgsequencer.signals gen-symbols-ags: rm -f libags.sym.in touch libags.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags.sym.in echo -e -n "\n" >> libags.sym.in find ags/util -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in find ags/lib -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in echo "ags_application_context" >> libags.sym.in find ags/object -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in find ags/object -name "ags_marshal.h" | xargs grep --no-filename -o -P "(ags_cclosure_marshal_[a-zA-Z0-9_]+)" >> libags.sym.in find ags/file -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags.sym.in gen-symbols-ags-thread: rm -f libags_thread.sym.in touch libags_thread.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags_thread.sym.in echo -e -n "\n" >> libags_thread.sym.in find ags/thread -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_thread.sym.in gen-symbols-ags-server: rm -f libags_server.sym.in touch libags_server.sym.in cat license-notice-gnu-agpl-3-0+-sym.txt >> libags_server.sym.in echo -e -n "\n" >> libags_server.sym.in find ags/server -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_server.sym.in gen-symbols-ags-audio: rm -f libags_audio.sym.in touch libags_audio.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags_audio.sym.in echo -e -n "\n" >> libags_audio.sym.in find ags/plugin -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_audio.sym.in find ags/audio -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_audio.sym.in gen-symbols-ags-gui: rm -f libags_gui.sym.in touch libags_gui.sym.in cat license-notice-gnu-gpl-3-0+-sym.txt >> libags_gui.sym.in echo -e -n "\n" >> libags_gui.sym.in find ags/widget -name "*.h" | xargs grep --no-filename -o -P "(?<=\s)(ags_[a-z0-9_]+)(?=[\s]*\()" >> libags_gui.sym.in find ags/widget -name "ags_widget_marshal.h" | xargs grep --no-filename -o -P "(ags_widget_cclosure_marshal_[a-zA-Z0-9_]+)" >> libags_gui.sym.in gen-symbols-all: gen-symbols-ags gen-symbols-ags-thread gen-symbols-ags-server gen-symbols-ags-audio gen-symbols-ags-gui echo "Generated all symbols" gen-marshallers: cat ags_license_header > ags/object/ags_marshal.h glib-genmarshal --prefix=ags_cclosure_marshal --header ags/object/ags_marshallers.list >> ags/object/ags_marshal.h cat ags_license_header > ags/object/ags_marshal.c glib-genmarshal --prefix=ags_cclosure_marshal --body ags/object/ags_marshallers.list >> ags/object/ags_marshal.c echo "generated marshallers in ags/object/" cat ags_license_header > ags/widget/ags_widget_marshal.h glib-genmarshal --prefix=ags_widget_cclosure_marshal --header ags/widget/ags_widget_marshallers.list >> ags/widget/ags_widget_marshal.h cat ags_license_header > ags/widget/ags_widget_marshal.c glib-genmarshal --prefix=ags_widget_cclosure_marshal --body ags/widget/ags_widget_marshallers.list >> ags/widget/ags_widget_marshal.c echo "generated marshallers in ags/widget/" check-gettext: @if test x$(USE_NLS) != "xyes" ; then echo "Missing gettext. Rerun configure and check for" \ "'checking whether to use NLS... yes'!" ; exit 1 ; fi update-po: check-gettext @find $(srcdir)/ags/{util,lib,object,thread,file,server,plugin,audio,widget,X}/ -path $(srcdir)/ags/audio/audio-unit -prune -o -name "*.c" -print | sort > $(srcdir)/po/POTFILES.in.2 ; \ if diff $(srcdir)/po/POTFILES.in $(srcdir)/po/POTFILES.in.2 >/dev/null 2>&1 ; then \ rm -f $(srcdir)/po/POTFILES.in.2 ; \ else \ mv $(srcdir)/po/POTFILES.in.2 $(srcdir)/po/POTFILES.in ; \ fi cd po && $(MAKE) $(AM_MAKEFLAGS) update-po update-gmo: check-gettext cd po && $(MAKE) $(AM_MAKEFLAGS) update-gmo force-update-gmo: check-gettext touch po/*.po cd po && $(MAKE) $(AM_MAKEFLAGS) update-gmo force-update-gmo-%: check-gettext @language=`echo $@ | sed s/force-update-gmo-//` ; \ if test ! -f po/$$language.po ; then echo "file po/$$language.po does not exist" ; exit 1 ; fi ; \ touch po/$$language.po ; \ cd po && $(MAKE) $(AM_MAKEFLAGS) update-gmo .PHONY: check-gettext update-po update-gmo force-update-gmo gsequencer-3.1.3/ags_functional_osc_xmlrpc_server_test_authentication.xml0000644000175000017500000000133013607210263024270 00000000000000 ags-test-user-uuid-0 audio gsequencer-3.1.3/install-sh0000755000175000017500000003601013622252204012602 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsequencer-3.1.3/libags_thread.sym.in0000644000175000017500000001153213616617253014543 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . ags_concurrency_provider_get_type ags_concurrency_provider_get_main_loop ags_concurrency_provider_set_main_loop ags_concurrency_provider_get_task_launcher ags_concurrency_provider_set_task_launcher ags_concurrency_provider_get_thread_pool ags_concurrency_provider_set_thread_pool ags_concurrency_provider_get_worker ags_concurrency_provider_set_worker ags_returnable_thread_get_type ags_returnable_thread_test_flags ags_returnable_thread_set_flags ags_returnable_thread_unset_flags ags_returnable_thread_safe_run ags_returnable_thread_connect_safe_run ags_returnable_thread_disconnect_safe_run ags_returnable_thread_new ags_message_envelope_get_type ags_message_envelope_get_sender ags_message_envelope_get_recipient ags_message_envelope_get_doc ags_message_envelope_get_parameter ags_message_envelope_new ags_message_envelope_new_with_params ags_generic_main_loop_get_type ags_generic_main_loop_new ags_timestamp_get_type ags_timestamp_test_flags ags_timestamp_set_flags ags_timestamp_unset_flags ags_timestamp_get_unix_time ags_timestamp_set_unix_time ags_timestamp_get_ags_offset ags_timestamp_set_ags_offset ags_timestamp_new ags_task_get_type ags_task_test_flags ags_task_set_flags ags_task_unset_flags ags_task_launch ags_task_failure ags_task_new ags_message_delivery_get_type ags_message_delivery_add_message_queue ags_message_delivery_remove_message_queue ags_message_delivery_find_sender_namespace ags_message_delivery_find_recipient_namespace ags_message_delivery_add_message_envelope ags_message_delivery_remove_message_envelope ags_message_delivery_find_sender ags_message_delivery_find_recipient ags_message_delivery_query_message ags_message_delivery_get_instance ags_message_delivery_new ags_thread_pool_get_type ags_thread_pool_pull ags_thread_pool_start ags_thread_pool_new ags_thread_application_context_get_type ags_thread_application_context_register_types ags_thread_application_context_new ags_thread_get_type ags_thread_global_get_use_sync_counter ags_thread_test_flags ags_thread_set_flags ags_thread_unset_flags ags_thread_test_status_flags ags_thread_set_status_flags ags_thread_unset_status_flags ags_thread_clear_status_flags ags_thread_test_sync_tic_flags ags_thread_set_sync_tic_flags ags_thread_unset_sync_tic_flags ags_thread_clear_sync_tic_flags ags_thread_set_current_sync_tic ags_thread_get_current_sync_tic ags_thread_set_delay ags_thread_get_delay ags_thread_set_frequency ags_thread_get_frequency ags_thread_set_max_precision ags_thread_get_max_precision ags_thread_find_type ags_thread_self ags_thread_parent ags_thread_next ags_thread_prev ags_thread_children ags_thread_get_toplevel ags_thread_first ags_thread_last ags_thread_lock ags_thread_trylock ags_thread_unlock ags_thread_remove_child ags_thread_add_child ags_thread_add_child_extended ags_thread_is_current_ready ags_thread_is_tree_ready_recursive ags_thread_prepare_current_sync ags_thread_prepare_tree_sync_recursive ags_thread_set_current_sync ags_thread_set_tree_sync_recursive ags_thread_clock ags_thread_add_start_queue ags_thread_add_start_queue_all ags_thread_start ags_thread_run ags_thread_stop ags_thread_new ags_worker_thread_get_type ags_worker_thread_test_status_flags ags_worker_thread_set_status_flags ags_worker_thread_unset_status_flags ags_woker_thread_do_poll_loop ags_worker_thread_do_poll ags_worker_thread_new ags_task_launcher_get_type ags_task_launcher_test_flags ags_task_launcher_set_flags ags_task_launcher_unset_flags ags_task_launcher_attach ags_task_launcher_add_task ags_task_launcher_add_task_all ags_task_launcher_add_cyclic_task ags_task_launcher_remove_cyclic_task ags_task_launcher_run ags_task_launcher_sync_run ags_task_launcher_new ags_destroy_worker_get_type ags_destroy_entry_alloc ags_destroy_worker_add ags_destroy_worker_get_instance ags_destroy_worker_new ags_message_queue_get_type ags_message_queue_add_message_envelope ags_message_queue_remove_message_envelope ags_message_queue_find_sender ags_message_queue_find_recipient ags_message_queue_query_message ags_message_queue_new ags_task_completion_get_type ags_task_completion_test_flags ags_task_completion_set_flags ags_task_completion_unset_flags ags_task_completion_complete ags_task_completion_new gsequencer-3.1.3/libags_gui.pc.in0000644000175000017500000000102413613101103013620 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libags-gui Description: Advanced Gtk+ Sequencer audio processing engine URL: http://nongnu.org/gsequencer Version: @PACKAGE_VERSION@ Requires: gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0 gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0 fontconfig >= 2.11.0 gdk-pixbuf-2.0 >= 2.26.1 cairo >= 1.12.0 gtk+-3.0 >= 3.18.0 Libs: -L${libdir} -lags_gui Cflags: -I${includedir} gsequencer-3.1.3/ags_functional_osc_xmlrpc_server_test_password_store.xml0000644000175000017500000000135413607210263024335 00000000000000 ags-test-user-uuid-0 ags-test-login ags-test-password gsequencer-3.1.3/license-notice-gnu-gpl-3-0+-sym.txt0000644000175000017500000000135613607210263016774 00000000000000# GSequencer - Advanced GTK Sequencer # Copyright (C) 2005-2020 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . gsequencer-3.1.3/config.rpath0000755000175000017500000004421613556560122013124 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2016 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; nagfor*) wl='-Wl,-Wl,,' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; xl* | bgxl* | bgf* | mpixl*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) wl= ;; *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; newsos6) ;; *nto* | *qnx*) ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) wl='-Qoption ld ' ;; *) wl='-Wl,' ;; esac ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; haiku*) ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then : else ld_shlibs=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd2.[01]*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) case "$host_cpu" in powerpc*) library_names_spec='$libname$shrext' ;; m68k) library_names_spec='$libname.a' ;; esac ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd[23].*) library_names_spec='$libname$shrext$versuffix' ;; freebsd* | dragonfly*) library_names_spec='$libname$shrext' ;; gnu*) library_names_spec='$libname$shrext' ;; haiku*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; *nto* | *qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; tpf*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 1996 # Copyright (C) 1996-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.6 Debian-2.4.6-11" package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2015-10-07.11; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd _G_rc_run_hooks=false case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do if eval $_G_hook '"$@"'; then # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift _G_rc_run_hooks=: fi done $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, you may remove/edit # any options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. In this case you also must return $EXIT_SUCCESS to let the # hook's caller know that it should pay attention to # '_result'. Returning $EXIT_FAILURE signalizes that # arguments are left untouched by the hook and therefore caller will ignore the # result variable. # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). There is # # no need to do the equivalent (but slower) action: # # func_quote_for_eval ${1+"$@"} # # my_options_prep_result=$func_quote_for_eval_result # false # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@", we could need that later # # if $args_changed is true. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # if $args_changed; then # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # fi # # $args_changed # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # false # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd _G_func_options_finish_exit=false if func_run_hooks func_options ${1+"$@"}; then func_options_finish_result=$func_run_hooks_result _G_func_options_finish_exit=: fi $_G_func_options_finish_exit } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_rc_options=false for my_func in options_prep parse_options validate_options options_finish do if eval func_$my_func '${1+"$@"}'; then eval _G_res_var='$'"func_${my_func}_result" eval set dummy "$_G_res_var" ; shift _G_rc_options=: fi done # Save modified positional parameters for caller. As a top-level # options-parser function we always need to set the 'func_options_result' # variable (regardless the $_G_rc_options value). if $_G_rc_options; then func_options_result=$_G_res_var else func_quote_for_eval ${1+"$@"} func_options_result=$func_quote_for_eval_result fi $_G_rc_options } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= _G_rc_options_prep=false if func_run_hooks func_options_prep ${1+"$@"}; then _G_rc_options_prep=: # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result fi $_G_rc_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= _G_rc_parse_options=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. if func_run_hooks func_parse_options ${1+"$@"}; then eval set dummy "$func_run_hooks_result"; shift _G_rc_parse_options=: fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_rc_parse_options=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_rc_parse_options=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac $_G_match_parse_options && _G_rc_parse_options=: done if $_G_rc_parse_options; then # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result fi $_G_rc_parse_options } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd _G_rc_validate_options=false # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" if func_run_hooks func_validate_options ${1+"$@"}; then # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result _G_rc_validate_options=: fi # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE $_G_rc_validate_options } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion Debian-2.4.6-11 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result fi $_G_rc_lt_options_prep } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result fi $_G_rc_lt_parse_options } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*|-fuse-ld=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type '$version_type'" ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: gsequencer-3.1.3/license-notice-gnu-agpl-3-0+-c.txt0000644000175000017500000000122513461636435016555 00000000000000 * GSequencer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * GSequencer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GSequencer. If not, see . gsequencer-3.1.3/aclocal.m40000644000175000017500000015033113622252201012436 00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # AM_EXTRA_RECURSIVE_TARGETS -*- Autoconf -*- # Copyright (C) 2012-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_EXTRA_RECURSIVE_TARGETS # -------------------------- # Define the list of user recursive targets. This macro exists only to # be traced by Automake, which will ensure that a proper definition of # user-defined recursive targets (and associated rules) is propagated # into all the generated Makefiles. # TODO: We should really reject non-literal arguments here... AC_DEFUN([AM_EXTRA_RECURSIVE_TARGETS], []) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ags-docs-api.m4]) m4_include([m4/ags-listings.m4]) m4_include([m4/ags-marshallers.m4]) m4_include([m4/ags-symbols.m4]) m4_include([m4/gettext.m4]) m4_include([m4/gtk-doc.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intlmacosx.m4]) m4_include([m4/introspection.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/nls.m4]) m4_include([m4/po.m4]) m4_include([m4/progtest.m4]) gsequencer-3.1.3/application-x-gsequencer.xml0000644000175000017500000000125513607210263016234 00000000000000 GSequencer's simple XML file format gsequencer-3.1.3/configure.ac0000644000175000017500000005505013622251725013100 00000000000000# -*- Autoconf -*- # Copyright (C) 2005-2020 Joel Kraehemann # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([gsequencer],[3.1.3],[jkraehemann@gmail.com]) AM_INIT_AUTOMAKE([subdir-objects -Wno-portability]) AC_CONFIG_SRCDIR([ags/config.h.in]) AC_CONFIG_HEADERS([ags/config.h]) AC_CONFIG_HEADERS([ags/ags_config.h]) AC_CONFIG_MACRO_DIR([m4]) AC_USE_SYSTEM_EXTENSIONS([_GNU_SOURCE]) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.19.8]) # options AC_ARG_VAR(HTMLHELP_XSL, path to Docbook XML htmlhelp XSL file) AC_ARG_VAR(GOBJECT_API_DOC, escaped path for use with sed to GObject API Reference Manual) AC_ARG_VAR(GTK_API_DOC, escaped path for use with sed to Gtk-3 API Reference Manual) AC_ARG_VAR(LIBAGS_API_DOC, escaped path for use with sed to Libags API Reference Manual) AC_ARG_VAR(LIBAGS_AUDIO_API_DOC, escaped path for use with sed to Libags-audio API Reference Manual) AC_ARG_VAR(LIBAGS_GUI_API_DOC, escaped path for use with sed to Libags-gui API Reference Manual) AC_ARG_VAR(LIBAGS_API_DIR, install path of Libags API Reference Manual) AC_ARG_VAR(LIBAGS_AUDIO_API_DIR, install path of Libags-audio API Reference Manual) AC_ARG_VAR(LIBAGS_GUI_API_DIR, install path of Libags-gui API Reference Manual) AC_ARG_VAR(LIBGSEQUENCER_API_DIR, install path of Libgsequencer API Reference Manual) AC_ARG_ENABLE(public-libgsequencer, [AS_HELP_STRING([--enable-public-libgsequencer], [provide public libgsequencer (default is yes)])], [], [enable_public_libgsequencer=yes]) AC_ARG_ENABLE(upstream-gtk-doc, [AS_HELP_STRING([--enable-upstream-gtk-doc], [put API reference manual in upstream dedicated directory (default is yes)])], [], [enable_upstream_gtk_doc=yes]) AC_ARG_ENABLE(single-docdir, [AS_HELP_STRING([--enable-single-docdir], [put API reference manual in upstream dedicated directory (default is no)])], [], [enable_single_docdir=no]) AC_ARG_ENABLE(strip-rt-events, [AS_HELP_STRING([--enable-strip-rt-events], [strip rt events (default is yes)])], [], [enable_strip_rt_events=yes]) AC_ARG_ENABLE(rt, [AS_HELP_STRING([--enable-rt], [enable rt (default is yes)])], [], [enable_rt=yes]) AC_ARG_ENABLE(w32api, [AS_HELP_STRING([--enable-w32api], [enable w32 API (default is no)])], [], [enable_w32api=no]) AC_ARG_ENABLE(osxapi, [AS_HELP_STRING([--enable-osxapi], [enable OS X API (default is no)])], [], [enable_osxapi=no]) AC_ARG_ENABLE(alsa, [AS_HELP_STRING([--enable-alsa], [enable alsa (default is yes)])], [], [enable_alsa=yes]) AC_ARG_ENABLE(oss, [AS_HELP_STRING([--enable-oss], [enable oss (default is no)])], [], [enable_oss=no]) AC_ARG_ENABLE(jack, [AS_HELP_STRING([--enable-jack], [enable jack (default is yes)])], [], [enable_jack=yes]) AC_ARG_ENABLE(pulse, [AS_HELP_STRING([--enable-pulse], [enable pulse (default is yes)])], [], [enable_pulse=yes]) AC_ARG_ENABLE(core-audio, [AS_HELP_STRING([--enable-core-audio], [enable core audio (default is no)])], [], [enable_core_audio=no]) AC_ARG_ENABLE(audio-unit, [AS_HELP_STRING([--enable-audio-unit], [enable audio unit (default is no)])], [], [enable_audio_unit=no]) AC_ARG_ENABLE(wasapi, [AS_HELP_STRING([--enable-wasapi], [enable WASAPI (default is no)])], [], [enable_wasapi=no]) AC_ARG_ENABLE(libinstpatch, [AS_HELP_STRING([--enable-libinstpatch], [enable libinstpatch (default is yes)])], [], [enable_libinstpatch=yes]) AC_ARG_ENABLE(vst3, [AS_HELP_STRING([--enable-vst3], [enable vst3 (default is no)])], [], [enable_vst3=no]) AC_ARG_ENABLE(pulse, [AS_HELP_STRING([--enable-pulse], [enable pulse (default is yes)])], [], [enable_pulse=yes]) AC_ARG_ENABLE(x11, [AS_HELP_STRING([--enable-x11], [enable X11 (default is yes)])], [], [enable_x11=yes]) AC_ARG_ENABLE(quartz, [AS_HELP_STRING([--enable-quartz], [enable quartz (default is no)])], [], [enable_quartz=no]) AC_ARG_ENABLE(run-functional-tests, [AS_HELP_STRING([--enable-run-functional-tests], [run functional tests (default is no)])], [], [enable_run_functional_tests=no]) AC_ARG_ENABLE(fast-test-mode, [AS_HELP_STRING([--enable-fast-test-mode], [fast test mode (default is no)])], [], [enable_fast_test_mode=no]) AC_ARG_ENABLE(run-system-tests, [AS_HELP_STRING([--enable-run-system-tests], [run system tests (default is no)])], [], [enable_run_system_tests=no]) AC_ARG_ENABLE(experimental, [AS_HELP_STRING([--enable-experimental], [experimental (default is no)])], [], [enable_experimental=no]) # Checks for programs. AC_PROG_CC AC_PROG_CPP AC_PROG_CXX AC_PROG_INSTALL #AS_IF([test "x$enable_w32api" != xno], # [gl_EARLY]) # libtool LT_PREREQ([2.4.2]) LT_INIT AC_SUBST([LIBTOOL_DEPS]) AC_ENABLE_SHARED AC_SUBST([GSEQUENCER_CFLAGS]) AC_SUBST([GSEQUENCER_LDFLAGS]) AC_SUBST([MIDI2XML_CFLAGS]) AC_SUBST([MIDI2XML_LDFLAGS]) AC_SUBST([LIBGSEQUENCER_TEST_LIBADD]) AC_SUBST([GSEQUENCER_FUNCTIONAL_TEST_LDADD]) # Checks for libraries. # FIXME: Replace `main' with a function in `-lX11': AS_IF([test "x$enable_x11" != xno], [AC_DEFINE([AGS_WITH_X11], [1], [X11 enabled]) AC_CHECK_LIB([X11], [main], , AC_MSG_ERROR("No X11 library present")) X11_LIBS="-lX11"], [AC_MSG_NOTICE([X11 disabled])]) AS_IF([test "x$enable_quartz" != xno], [AC_DEFINE([AGS_WITH_QUARTZ], [1], [quartz enabled]) PKG_CHECK_MODULES([GTK_MAC_INTEGRATION], [gtk-mac-integration-gtk3 >= 2.0.7]) AC_SUBST(GTK_MAC_INTEGRATION_CFLAGS) AC_SUBST(GTK_MAC_INTEGRATION_LIBS) AC_MSG_NOTICE([quartz enabled])], [AC_MSG_NOTICE([quartz disabled])]) # FIXME: Replace `main' with a function in `-ldl': # AC_CHECK_LIB([dl], [main], , AC_MSG_ERROR("No dl library present")) # FIXME: Replace `main' with a function in `-lm': AC_CHECK_LIB([m], [main], , AC_MSG_ERROR("No math library present")) AS_IF([test "x$enable_strip_rt_events" != xno], [AC_DEFINE([AGS_STRIP_RT_EVENTS], [1], [striping rt-events enabled]) AC_MSG_NOTICE([striping rt-events enabled])], [AC_MSG_NOTICE([striping rt-events disabled])]) # FIXME: Replace `main' with a function in `-lrt': AS_IF([test "x$enable_rt" != xno], [AC_DEFINE([AGS_WITH_RT], [1], [rt enabled]) RT_LIBS="-lrt" AC_CHECK_LIB([rt], [main], , AC_MSG_ERROR("No rt library present")) AC_MSG_NOTICE([rt enabled])], [AC_MSG_NOTICE([rt disabled])]) # Checks for header files. AC_PATH_X AC_FUNC_ALLOCA AC_CHECK_HEADERS([stdlib.h string.h unistd.h ladspa.h dssi.h lv2.h], , AC_MSG_ERROR("missing headers")) # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_HEADER_STDBOOL AC_C_INLINE AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_UID_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT8_T AC_CHECK_TYPES([ptrdiff_t]) WITH_W32API=0 AS_IF([test "x$enable_w32api" != xno], [AC_DEFINE([AGS_W32API], [1], [w32api enabled]) W32API_CFLAGS="-nostdinc -I./lib -I/usr/lib/gcc/x86_64-w64-mingw32/7.4.0/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/dssi -include ags/config.h " W32API_LIBS="-L./lib -lgnu" AC_MSG_NOTICE([w32api enabled])], [AC_MSG_NOTICE([w32api disabled])]) AM_CONDITIONAL([WITH_W32API], [test "x$enable_w32api" == xyes]) AS_IF([test "x$enable_osxapi" != xno], [AC_DEFINE([AGS_OSXAPI], [1], [OS X api enabled]) OSXAPI_CFLAGS="" OSXAPI_LIBS="" AC_MSG_NOTICE([OS X api enabled])], [AC_MSG_NOTICE([OS X api disabled])]) AM_CONDITIONAL([WITH_OSXAPI], [test "x$enable_osxapi" == xyes]) PKG_CHECK_MODULES([UUID], [uuid >= 1.0.1]) AC_SUBST(UUID_CFLAGS) AC_SUBST(UUID_LIBS) AS_IF([test "x$enable_alsa" != xno], [PKG_CHECK_MODULES([LIBASOUND2], [alsa >= 1.0.25]) AC_SUBST(LIBASOUND2_CFLAGS) AC_SUBST(LIBASOUND2_LIBS) AC_DEFINE([AGS_WITH_ALSA], [1], [ALSA enabled]) AC_MSG_NOTICE([ALSA enabled])], [AC_MSG_NOTICE([ALSA disabled]) AC_CHECK_HEADERS([alsa/seq_event.h], [AC_DEFINE([HAVE_ALSA_SEQ_EVENT_H], [1], [ALSA sequencer event available])] [PKG_CHECK_MODULES([LIBASOUND2], [alsa >= 1.0.5]) AC_SUBST(LIBASOUND2_CFLAGS) AC_SUBST(LIBASOUND2_LIBS)], [AC_MSG_NOTICE([ALSA sequencer event not available])],[ #if HAVE_ALSA_SEQ_EVENT_H # include # include #endif ])]) AS_IF([test "x$enable_oss" != xno], [AC_DEFINE([AGS_WITH_OSS], [1], [OSS enabled]) AC_MSG_NOTICE([OSS enabled])], [AC_MSG_NOTICE([OSS disabled])]) AS_IF([test "x$enable_core_audio" != xno], [AC_DEFINE([AGS_WITH_CORE_AUDIO], [1], [core-audio enabled]) CORE_AUDIO_CFLAGS= CORE_AUDIO_LIBS="-framework CoreAudio -framework AudioToolbox -framework CoreMIDI" AC_SUBST(CORE_AUDIO_CFLAGS) AC_SUBST(CORE_AUDIO_LIBS) AC_MSG_NOTICE([core audio enabled])], [AC_MSG_NOTICE([core audio disabled])]) AS_IF([test "x$enable_audio_unit" != xno], [AC_DEFINE([AGS_WITH_AUDIO_UNIT], [1], [audio-unit enabled]) AUDIO_UNIT_CFLAGS= AUDIO_UNIT_LIBS="-framework AudioUnit -framework AudioToolbox" AC_SUBST(AUDIO_UNIT_CFLAGS) AC_SUBST(AUDIO_UNIT_LIBS) AC_MSG_NOTICE([audio-unit enabled])], [AC_MSG_NOTICE([audio-unit disabled])]) AS_IF([test "x$enable_wasapi" != xno], [AC_DEFINE([AGS_WITH_WASAPI], [1], [wasapi enabled]) WASAPI_CFLAGS="" WASAPI_LIBS="-lwinmm -ldsound -lsetupapi -lole32" AC_SUBST(WASAPI_CFLAGS) AC_SUBST(WASAPI_LIBS) AC_MSG_NOTICE([wasapi enabled])], [AC_MSG_NOTICE([wasapi disabled])]) AS_IF([test "x$enable_jack" != xno], [AC_DEFINE([AGS_WITH_JACK], [1], [JACK enabled]) PKG_CHECK_MODULES([JACK], [jack]) AC_SUBST(JACK_CFLAGS) AC_SUBST(JACK_LIBS) AC_CHECK_FUNC([jack_port_uuid], [AC_DEFINE([HAVE_JACK_PORT_UUID], [1], [Jack port uuid available])]) AC_MSG_NOTICE([JACK enabled])], [AC_MSG_NOTICE([JACK disabled])]) AS_IF([test "x$enable_pulse" != xno], [AC_DEFINE([AGS_WITH_PULSE], [1], [PULSE enabled]) PKG_CHECK_MODULES([PULSE], [libpulse-mainloop-glib]) AC_SUBST(PULSE_CFLAGS) AC_SUBST(PULSE_LIBS) AC_MSG_NOTICE([PULSE enabled])], [AC_MSG_NOTICE([PULSE disabled])]) PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.8.0]) AC_SUBST(LIBXML2_CFLAGS) AC_SUBST(LIBXML2_LIBS) PKG_CHECK_MODULES([SAMPLERATE], [samplerate >= 0.1.8]) AC_SUBST(SAMPLERATE_CFLAGS) AC_SUBST(SAMPLERATE_LIBS) PKG_CHECK_MODULES([SNDFILE], [sndfile >= 1.0.25]) AC_SUBST(SNDFILE_CFLAGS) AC_SUBST(SNDFILE_LIBS) PKG_CHECK_MODULES([FFTW], [fftw3 >= 3.3.4]) AC_SUBST(FFTW_CFLAGS) AC_SUBST(FFTW_LIBS) PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.56.0]) AC_SUBST(GLIB_CFLAGS) AC_SUBST(GLIB_LIBS) PKG_CHECK_MODULES([GOBJECT], [gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0]) AC_SUBST(GOBJECT_CFLAGS) AC_SUBST(GOBJECT_LIBS) AC_DEFINE([HAVE_GLIB_2_6], [1], [GLib 2.6 available]) AC_DEFINE([HAVE_GLIB_2_44], [1], [GLib 2.44 available]) AC_DEFINE([HAVE_GLIB_2_54], [1], [GLib 2.54 available]) GOBJECT_INTROSPECTION_CHECK([1.30.0]) PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0]) AC_SUBST(GIO_CFLAGS) AC_SUBST(GIO_LIBS) PKG_CHECK_MODULES([LIBSOUP], [libsoup-2.4 >= 2.52.0]) AC_SUBST(LIBSOUP_CFLAGS) AC_SUBST(LIBSOUP_LIBS) AC_DEFINE([HAVE_ATK_2_12], [1], [Atk 2.12 available]) AS_IF([test "x$enable_public_libgsequencer" != xno], [AC_DEFINE([AGS_WITH_PUBLIC_LIBGSEQUENCER], [1], [public libgsequencer enabled]) AC_MSG_NOTICE([public libgsequencer enabled])], [AC_MSG_NOTICE([public libgsequencer disabled])]) AM_CONDITIONAL([AGS_WITH_PUBLIC_LIBGSEQUENCER], [test "x$enable_public_libgsequencer" == xyes]) AS_IF([test "x$enable_upstream_gtk_doc" != xno], [AC_DEFINE([AGS_WITH_UPSTREAM_GTK_DOC], [1], [upstream API reference directory enabled]) AC_MSG_NOTICE([upstream API reference directory enabled])], [AC_MSG_NOTICE([upstream API reference directory disabled])]) AM_CONDITIONAL([AGS_WITH_UPSTREAM_GTK_DOC], [test "x$enable_upstream_gtk_doc" == xyes]) AS_IF([test "x$enable_single_docdir" != xno], [AC_DEFINE([AGS_WITH_SINGLE_DOCDIR], [1], [single documentation directory enabled]) AC_MSG_NOTICE([single documentation directory enabled])], [AC_MSG_NOTICE([single documentation directory disabled])]) AM_CONDITIONAL([AGS_WITH_SINGLE_DOCDIR], [test "x$enable_single_docdir" == xyes]) AS_IF([test "x$enable_libinstpatch" != xno], [PKG_CHECK_MODULES([LIBINSTPATCH], [libinstpatch-1.0 >= 1.0]) AC_SUBST(LIBINSTPATCH_CFLAGS) AC_SUBST(LIBINSTPATCH_LIBS) AC_DEFINE([AGS_WITH_LIBINSTPATCH], [1], [Disable if you don't want libinstpatch])], [AC_MSG_NOTICE([libinstpatch disabled])]) AM_CONDITIONAL([WITH_LIBINSTPATCH], [test "x$enable_libinstpatch" == xyes]) AS_IF([test "x$enable_vst3" != xno], [AC_DEFINE([AGS_WITH_VST3], [1], [VST3 enabled]) AC_SUBST(VST3_CXXFLAGS) AC_SUBST(VST3_LIBS) AC_MSG_NOTICE([VST3 enabled])], [AC_MSG_NOTICE([VST3 disabled])]) PKG_CHECK_MODULES([CAIRO], [cairo >= 1.12.0]) AC_SUBST(CAIRO_CFLAGS) AC_SUBST(CAIRO_LIBS) PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= 3.18.0]) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) AS_IF([test "x$enable_w32api" != xyes], [PKG_CHECK_MODULES([WEBKITGTK], [webkit2gtk-4.0 >= 2.10.0]) AC_SUBST(WEBKITGTK_CFLAGS) AC_SUBST(WEBKITGTK_LIBS)], []) AS_IF([test "x$enable_run_functional_tests" == xyes], [AC_MSG_NOTICE([run functional tests enabled])], [AC_MSG_NOTICE([run functional tests disabled])]) AM_CONDITIONAL([RUN_FUNCTIONAL_TESTS], [test "x$enable_run_functional_tests" == xyes]) AS_IF([test "x$enable_fast_test_mode" == xyes], [AC_MSG_NOTICE([fast test mode enabled])], [AC_MSG_NOTICE([fast test mode disabled])]) AM_CONDITIONAL([FAST_TEST_MODE], [test "x$enable_fast_test_mode" == xyes]) # Checks for library functions. AC_FUNC_MALLOC AC_FUNC_MMAP AC_FUNC_REALLOC AC_CHECK_FUNCS([__argz_count __argz_next __argz_stringify atexit clock_gettime floor memmove memset pow putenv realpath regcomp setlocale sqrt strchr strdup strerror strrchr strstr strtoul]) AC_CANONICAL_HOST build_gnu=no build_linux=no build_windows=no build_mac=no build_freebsd=no # Detect the target system case "${host_os}" in gnu*) build_gnu=yes ;; linux*) build_linux=yes ;; freebsd*) build_freebsd=yes ;; cygwin*|mingw*) build_windows=yes ;; darwin*) build_mac=yes ;; *) AC_MSG_ERROR(["OS $host_os is not supported"]) ;; esac # Pass the conditionals to automake AM_CONDITIONAL([GNU], [test "$build_gnu" = "yes"]) AM_CONDITIONAL([LINUX], [test "$build_linux" = "yes"]) AM_CONDITIONAL([FREEBSD], [test "$build_freebsd" = "yes"]) AM_CONDITIONAL([WINDOWS], [test "$build_windows" = "yes"]) AM_CONDITIONAL([OSX], [test "$build_mac" = "yes"]) # check for gtk-doc m4_ifdef([GTK_DOC_CHECK], [ GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) ],[ AM_CONDITIONAL([ENABLE_GTK_DOC], false) ]) AM_CONDITIONAL([WITH_SYSTEM_TESTS], [test "x$enable_run_system_tests" == xyes]) AM_CONDITIONAL([WITH_VST3], [test "x$enable_vst3" == xyes]) AM_CONDITIONAL([WITH_EXPERIMENTAL], [test "x$enable_experimental" == xyes]) LIBAGS_SYMBOLS([]) LIBAGS_THREAD_SYMBOLS([]) LIBAGS_SERVER_SYMBOLS([]) LIBAGS_AUDIO_SYMBOLS([]) LIBAGS_GUI_SYMBOLS([]) LIBAGS_MARSHALLERS([]) LIBAGS_GUI_MARSHALLERS([]) AGS_DEVELOPER_BOOK_LISTINGS([]) AGS_DOCS_API([]) AS_IF([test "x$HTMLHELP_XSL" != x], [AC_SUBST(HTMLHELP_XSL, $HTMLHELP_XSL) AC_MSG_NOTICE([HTMLHELP_XSL = $HTMLHELP_XSL])], [AC_SUBST(HTMLHELP_XSL, /usr/share/xml/docbook/stylesheet/docbook-xsl/htmlhelp/htmlhelp.xsl) AC_MSG_NOTICE([HTMLHELP_XSL = $HTMLHELP_XSL])]) AS_IF([test "x$enable_upstream_gtk_doc" != xno], [AS_IF([test "x$GOBJECT_API_DOC" != x], [AC_SUBST(GOBJECT_API_DOC, $GOBJECT_API_DOC) AC_MSG_NOTICE([GOBJECT_API_DOC = $GOBJECT_API_DOC])], [AC_SUBST(GOBJECT_API_DOC, '\/usr\/share\/doc\/libglib2.0-doc\/gobject') AC_MSG_NOTICE([GOBJECT_API_DOC = $GOBJECT_API_DOC])]) AS_IF([test "x$GTK_API_DOC" != x], [AC_SUBST(GTK_API_DOC, $GTK_API_DOC) AC_MSG_NOTICE([GTK_API_DOC = $GTK_API_DOC])], [AC_SUBST(GTK_API_DOC, '\/usr\/share\/doc\/libgtk-3-doc\/gtk3') AC_MSG_NOTICE([GTK_API_DOC = $GTK_API_DOC])]) AS_IF([test "x$LIBAGS_API_DOC" != x], [AC_SUBST(LIBAGS_API_DOC, $LIBAGS_API_DOC) AC_MSG_NOTICE([LIBAGS_API_DOC = $LIBAGS_API_DOC])], [AC_SUBST(LIBAGS_API_DOC, '\/usr\/share\/doc\/libags-doc\/api') AC_MSG_NOTICE([LIBAGS_API_DOC = $LIBAGS_API_DOC])]) AS_IF([test "x$LIBAGS_AUDIO_API_DOC" != x], [AC_SUBST(LIBAGS_AUDIO_API_DOC, $LIBAGS_AUDIO_API_DOC) AC_MSG_NOTICE([LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC])], [AC_SUBST(LIBAGS_AUDIO_API_DOC, '\/usr\/share\/doc\/libags-audio-doc\/api') AC_MSG_NOTICE([LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC])]) AS_IF([test "x$LIBAGS_GUI_API_DOC" != x], [AC_SUBST(LIBAGS_GUI_API_DOC, $LIBAGS_GUI_API_DOC) AC_MSG_NOTICE([LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC])], [AC_SUBST(LIBAGS_GUI_API_DOC, '\/usr\/share\/doc\/libags-gui-doc\/api') AC_MSG_NOTICE([LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC])]) AS_IF([test "x$LIBGSEQUENCER_API_DOC" != x], [AC_SUBST(LIBGSEQUENCER_API_DOC, $LIBGSEQUENCER_API_DOC) AC_MSG_NOTICE([LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC])], [AC_SUBST(LIBGSEQUENCER_API_DOC, '\/usr\/share\/doc\/libgsequencer-doc\/api') AC_MSG_NOTICE([LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC])]) AS_IF([test "x$LIBAGS_API_DIR" != x], [AC_SUBST(LIBAGS_API_DIR, $LIBAGS_API_DIR) AC_MSG_NOTICE([LIBAGS_API_DIR = $LIBAGS_API_DIR])], [AC_SUBST(LIBAGS_API_DIR, $datadir/doc/libags-doc/api) AC_MSG_NOTICE([LIBAGS_API_DIR = $LIBAGS_API_DIR])]) AS_IF([test "x$LIBAGS_AUDIO_API_DIR" != x], [AC_SUBST(LIBAGS_AUDIO_API_DIR, $LIBAGS_AUDIO_API_DIR) AC_MSG_NOTICE([LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR])], [AC_SUBST(LIBAGS_AUDIO_API_DIR, $datadir/doc/libags-audio-doc/api) AC_MSG_NOTICE([LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR])]) AS_IF([test "x$LIBAGS_GUI_API_DIR" != x], [AC_SUBST(LIBAGS_GUI_API_DIR, $LIBAGS_GUI_API_DIR) AC_MSG_NOTICE([LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR])], [AC_SUBST(LIBAGS_GUI_API_DIR, $datadir/doc/libags-gui-doc/api) AC_MSG_NOTICE([LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR])]) AS_IF([test "x$LIBGSEQUENCER_API_DIR" != x], [AC_SUBST(LIBGSEQUENCER_API_DIR, $LIBGSEQUENCER_API_DIR) AC_MSG_NOTICE([LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR])], [AC_SUBST(LIBGSEQUENCER_API_DIR, $datadir/doc/libgsequencer-doc/api) AC_MSG_NOTICE([LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR])]) ], [ AS_IF([test "x$GOBJECT_API_DOC" != x], [AC_SUBST(GOBJECT_API_DOC, $GOBJECT_API_DOC) AC_MSG_NOTICE([GOBJECT_API_DOC = $GOBJECT_API_DOC])], [AC_SUBST(GOBJECT_API_DOC, '\.\.\/gobject') AC_MSG_NOTICE([GOBJECT_API_DOC = $GOBJECT_API_DOC])]) AS_IF([test "x$GTK_API_DOC" != x], [AC_SUBST(GTK_API_DOC, $GTK_API_DOC) AC_MSG_NOTICE([GTK_API_DOC = $GTK_API_DOC])], [AC_SUBST(GTK_API_DOC, '\.\.\/gtk3') AC_MSG_NOTICE([GTK_API_DOC = $GTK_API_DOC])]) AS_IF([test "x$LIBAGS_API_DOC" != x], [AC_SUBST(LIBAGS_API_DOC, $LIBAGS_API_DOC) AC_MSG_NOTICE([LIBAGS_API_DOC = $LIBAGS_API_DOC])], [AC_SUBST(LIBAGS_API_DOC, '\.\.\/libags') AC_MSG_NOTICE([LIBAGS_API_DOC = $LIBAGS_API_DOC])]) AS_IF([test "x$LIBAGS_AUDIO_API_DOC" != x], [AC_SUBST(LIBAGS_AUDIO_API_DOC, $LIBAGS_AUDIO_API_DOC) AC_MSG_NOTICE([LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC])], [AC_SUBST(LIBAGS_AUDIO_API_DOC, '\.\.\/libags_audio') AC_MSG_NOTICE([LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC])]) AS_IF([test "x$LIBAGS_GUI_API_DOC" != x], [AC_SUBST(LIBAGS_GUI_API_DOC, $LIBAGS_GUI_API_DOC) AC_MSG_NOTICE([LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC])], [AC_SUBST(LIBAGS_GUI_API_DOC, '\.\.\/libags_gui') AC_MSG_NOTICE([LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC])]) AS_IF([test "x$LIBGSEQUENCER_API_DOC" != x], [AC_SUBST(LIBGSEQUENCER_API_DOC, $LIBGSEQUENCER_API_DOC) AC_MSG_NOTICE([LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC])], [AC_SUBST(LIBGSEQUENCER_API_DOC, '\.\.\/libgsequencer') AC_MSG_NOTICE([LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC])]) AS_IF([test "x$LIBAGS_API_DIR" != x], [AC_SUBST(LIBAGS_API_DIR, $LIBAGS_API_DIR) AC_MSG_NOTICE([LIBAGS_API_DIR = $LIBAGS_API_DIR])], [AC_SUBST(LIBAGS_API_DIR, $datadir/gtk-doc/html/libags) AC_MSG_NOTICE([LIBAGS_API_DIR = $LIBAGS_API_DIR])]) AS_IF([test "x$LIBAGS_AUDIO_API_DIR" != x], [AC_SUBST(LIBAGS_AUDIO_API_DIR, $LIBAGS_AUDIO_API_DIR) AC_MSG_NOTICE([LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR])], [AC_SUBST(LIBAGS_AUDIO_API_DIR, $datadir/gtk-doc/html/libags_audio) AC_MSG_NOTICE([LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR])]) AS_IF([test "x$LIBAGS_GUI_API_DIR" != x], [AC_SUBST(LIBAGS_GUI_API_DIR, $LIBAGS_GUI_API_DIR) AC_MSG_NOTICE([LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR])], [AC_SUBST(LIBAGS_GUI_API_DIR, $datadir/gtk-doc/html/libags_gui) AC_MSG_NOTICE([LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR])]) AS_IF([test "x$LIBGSEQUENCER_API_DIR" != x], [AC_SUBST(LIBGSEQUENCER_API_DIR, $LIBGSEQUENCER_API_DIR) AC_MSG_NOTICE([LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR])], [AC_SUBST(LIBGSEQUENCER_API_DIR, $datadir/gtk-doc/html/libgsequencer) AC_MSG_NOTICE([LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR])]) ]) #AS_IF([test "x$enable_w32api" != xno], # [gl_INIT]) AM_EXTRA_RECURSIVE_TARGETS([ags-docs]) AC_CONFIG_FILES([ Makefile unit-system-tests.mk functional-system-tests.mk docs/reference/libags/Makefile docs/reference/libags-audio/Makefile docs/reference/libags-gui/Makefile docs/reference/libgsequencer/Makefile m4/Makefile po/Makefile.in libags.pc libags_audio.pc libags_gui.pc libgsequencer.pc]) #AM_COND_IF([WITH_W32API], # [AC_CONFIG_FILES([lib/Makefile])]) AC_OUTPUT gsequencer-3.1.3/ags_example.xml0000644000175000017500000037245213607210263013624 00000000000000 gsequencer-3.1.3/TODO0000644000175000017500000000536313607210263011277 00000000000000Copyright (C) 2005-2020 Joël Krähemann Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". * TODO:JK: implemented support for GtkApplication * TODO:JK: refactored AgsNotationToolbar, AgsAutomationToolbar and AgsWaveToolbar * TODO:JK: migrated AgsBasePlugin to GModule * TODO:JK: removed AgsMenuBar * TODO:JK: migrated AgsTurtle and AgsFunction to GRegex * TODO:JK: migrated to gi18n.h? * TODO:JK: migrated unit-tests to GTest? * TODO:JK: implemented AgsUiOscRenewController * TODO:JK: move ags/X to ags/ui * TODO:JK: implemented ags-modify-synth-generator recall * TODO:JK: updated developer's handbook * TODO:JK: check recall id cleanup * TODO:JK: improved AgsRecallContainer detection of ags_recall_factory.c * TODO:JK: implemented AgsSoundContainer manager * TODO:JK: extended user's handbook to cover OSC server preferences * TODO:JK: added unit-tests * TODO:JK: implement ::seek() of AgsMidiParser and AgsOscParser * TODO:JK: implement ::seek() of AgsMidiBuilder and AgsOscBuilder * TODO:JK: implemented resample AgsAudioSignal on presets modified * TODO:JK: improve thread-safety to LADSPA and DSSI * TODO:JK: removed ags_id_generator.[ch] * TODO:JK: improved ags-feed recall thread-safety * TODO:JK: improved ags_audio_signal_feed() reduce over-head * TODO:JK: improved AgsApplySynth thread-safety * TODO:JK: refactored AgsAutomationEditor to be more light-weight * TODO:JK: implemented AgsCartesian properties * TODO:JK: implemented AgsConnectable:disconnect() to all implementing objects * TODO:JK: implemented AgsPlaybackDomain properties * TODO:JK: implemented AgsPlayback properties * TODO:JK: implemented AgsScaleArea properties * TODO:JK: implemented AgsApplicationContext properties * TODO:JK: implement AgsConnectable properly * TODO:JK: implemented damping/vibration of AgsAudioSignal * TODO:JK: implemented exponential curve option for ags-envelope recall * TODO:JK: implement AgsNoteCursor, AgsAccelerationCursor, AgsBufferCursor and AgsTrackCursor * TODO:JK: implement VST support * TODO:JK: implement AudioUnit support on Apple Mac OS X * TODO:JK: implement UI configuration of plugins, loading at runtime * TODO:JK: implement AgsFunction * TODO:JK: implement AgsDesk a better jukebox as mixing desk * TODO:JK: implement AgsSheetEditor * TODO:JK: implement CUPS support to print notation sheet * TODO:JK: implement Music XML support * TODO:JK: implement file bundle embedding plugins and audio data * TODO:JK: fix AgsAudio typo * TODO:JK: improve ags-simple.xsl gsequencer-3.1.3/COPYING0000644000175000017500000010451313375006203011636 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gsequencer-3.1.3/m4/0000755000175000017500000000000013622252263011203 500000000000000gsequencer-3.1.3/m4/gettext.m40000644000175000017500000003676313614025151013063 00000000000000# gettext.m4 serial 68 (gettext-0.19.8) dnl Copyright (C) 1995-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value '$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], []) gsequencer-3.1.3/m4/ltversion.m40000644000175000017500000000127313622252176013420 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) gsequencer-3.1.3/m4/lib-prefix.m40000644000175000017500000002042213614025151013421 00000000000000# lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) gsequencer-3.1.3/m4/intlmacosx.m40000644000175000017500000000474513614025151013553 00000000000000# intlmacosx.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2004-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) gsequencer-3.1.3/m4/progtest.m40000644000175000017500000000602413614025151013231 00000000000000# progtest.m4 serial 7 (gettext-0.18.2) dnl Copyright (C) 1996-2003, 2005, 2008-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) gsequencer-3.1.3/m4/ltoptions.m40000644000175000017500000003426213622252176013432 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) gsequencer-3.1.3/m4/nls.m40000644000175000017500000000230713614025151012156 00000000000000# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software dnl Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) gsequencer-3.1.3/m4/ags-marshallers.m40000644000175000017500000000231713614025007014450 00000000000000# -*- mode: autoconf -*- # # GSequencer - Advanced GTK Sequencer # Copyright (C) 2019 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . AC_DEFUN([LIBAGS_MARSHALLERS], [ AC_MSG_NOTICE([generating ags/object/ags_marshallers.list]) `mkdir -p ags/object/` `tail -n +19 $srcdir/ags/object/ags_marshallers.list.in > ags/object/ags_marshallers.list` ]) AC_DEFUN([LIBAGS_GUI_MARSHALLERS], [ AC_MSG_NOTICE([generating ags/widget/ags_widget_marshallers.list]) `mkdir -p ags/widget/` `tail -n +19 $srcdir/ags/widget/ags_widget_marshallers.list.in > ags/widget/ags_widget_marshallers.list` ]) gsequencer-3.1.3/m4/iconv.m40000644000175000017500000002207213614025151012501 00000000000000# iconv.m4 serial 19 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2007-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, dnl Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif ]], [[int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; ]])], [am_cv_func_iconv_works=yes], , [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) test "$am_cv_func_iconv_works" = no || break done LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [m4_ifdef([gl_00GNULIB], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ]], [[]])], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) dnl Also substitute ICONV_CONST in the gnulib generated . m4_ifdef([gl_ICONV_H_DEFAULTS], [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) if test -n "$am_cv_proto_iconv_arg1"; then ICONV_CONST="const" fi ]) fi ]) gsequencer-3.1.3/m4/Makefile.in0000644000175000017500000003735013622252207013176 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ags-docs-api.m4 \ $(top_srcdir)/m4/ags-listings.m4 \ $(top_srcdir)/m4/ags-marshallers.m4 \ $(top_srcdir)/m4/ags-symbols.m4 $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/ags/config.h \ $(top_builddir)/ags/ags_config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = ags-docs-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUDIO_UNIT_CFLAGS = @AUDIO_UNIT_CFLAGS@ AUDIO_UNIT_LIBS = @AUDIO_UNIT_LIBS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CORE_AUDIO_CFLAGS = @CORE_AUDIO_CFLAGS@ CORE_AUDIO_LIBS = @CORE_AUDIO_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GIO_CFLAGS = @GIO_CFLAGS@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOBJECT_API_DOC = @GOBJECT_API_DOC@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@ GOBJECT_LIBS = @GOBJECT_LIBS@ GREP = @GREP@ GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@ GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_API_DOC = @GTK_API_DOC@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GTK_MAC_INTEGRATION_CFLAGS = @GTK_MAC_INTEGRATION_CFLAGS@ GTK_MAC_INTEGRATION_LIBS = @GTK_MAC_INTEGRATION_LIBS@ HTMLHELP_XSL = @HTMLHELP_XSL@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ JACK_CFLAGS = @JACK_CFLAGS@ JACK_LIBS = @JACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAGS_API_DIR = @LIBAGS_API_DIR@ LIBAGS_API_DOC = @LIBAGS_API_DOC@ LIBAGS_AUDIO_API_DIR = @LIBAGS_AUDIO_API_DIR@ LIBAGS_AUDIO_API_DOC = @LIBAGS_AUDIO_API_DOC@ LIBAGS_GUI_API_DIR = @LIBAGS_GUI_API_DIR@ LIBAGS_GUI_API_DOC = @LIBAGS_GUI_API_DOC@ LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@ LIBASOUND2_LIBS = @LIBASOUND2_LIBS@ LIBGSEQUENCER_API_DIR = @LIBGSEQUENCER_API_DIR@ LIBGSEQUENCER_API_DOC = @LIBGSEQUENCER_API_DOC@ LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ LIBICONV = @LIBICONV@ LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@ LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIBXML2_CFLAGS = @LIBXML2_CFLAGS@ LIBXML2_LIBS = @LIBXML2_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@ MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ PULSE_CFLAGS = @PULSE_CFLAGS@ PULSE_LIBS = @PULSE_LIBS@ RANLIB = @RANLIB@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ UUID_CFLAGS = @UUID_CFLAGS@ UUID_LIBS = @UUID_LIBS@ VERSION = @VERSION@ VST3_CXXFLAGS = @VST3_CXXFLAGS@ VST3_LIBS = @VST3_LIBS@ WASAPI_CFLAGS = @WASAPI_CFLAGS@ WASAPI_LIBS = @WASAPI_LIBS@ WEBKITGTK_CFLAGS = @WEBKITGTK_CFLAGS@ WEBKITGTK_LIBS = @WEBKITGTK_LIBS@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ags-docs-local: tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." ags-docs: ags-docs-am ags-docs-am: ags-docs-local clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: ags-docs-am ags-docs-local all all-am check check-am clean \ clean-generic clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gsequencer-3.1.3/m4/ltsugar.m40000644000175000017500000001044013622252176013050 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) gsequencer-3.1.3/m4/lt~obsolete.m40000644000175000017500000001377413622252176013756 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) gsequencer-3.1.3/m4/ags-listings.m40000644000175000017500000000621113614025007013764 00000000000000# -*- mode: autoconf -*- # # GSequencer - Advanced GTK Sequencer # Copyright (C) 2019 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . AC_DEFUN([AGS_DEVELOPER_BOOK_LISTINGS], [ AC_MSG_NOTICE([generating docs/listings/*]) `mkdir -p docs/listings/` `tail -n +10 $srcdir/docs/listings/add_pattern.c.in > docs/listings/add_pattern.c` `tail -n +10 $srcdir/docs/listings/application_mutex.c.in > docs/listings/application_mutex.c` `tail -n +10 $srcdir/docs/listings/audio.c.in > docs/listings/audio.c` `tail -n +10 $srcdir/docs/listings/audio_application_context.c.in > docs/listings/audio_application_context.c` `tail -n +10 $srcdir/docs/listings/complete_example.c.in > docs/listings/complete_example.c` `tail -n +10 $srcdir/docs/listings/config.c.in > docs/listings/config.c` `tail -n +10 $srcdir/docs/listings/effects_echo_audio.c.in > docs/listings/effects_echo_audio.c` `tail -n +10 $srcdir/docs/listings/effects_echo_audio_run.c.in > docs/listings/effects_echo_audio_run.c` `tail -n +10 $srcdir/docs/listings/effects_echo_channel.c.in > docs/listings/effects_echo_channel.c` `tail -n +10 $srcdir/docs/listings/effects_echo_channel_run.c.in > docs/listings/effects_echo_channel_run.c` `tail -n +10 $srcdir/docs/listings/effects_recall_container.c.in > docs/listings/effects_recall_container.c` `tail -n +10 $srcdir/docs/listings/file_property.c.in > docs/listings/file_property.c` `tail -n +10 $srcdir/docs/listings/file_read.c.in > docs/listings/file_read.c` `tail -n +10 $srcdir/docs/listings/file_write.c.in > docs/listings/file_write.c` `tail -n +10 $srcdir/docs/listings/linking_prerequisites.c.in > docs/listings/linking_prerequisites.c` `tail -n +10 $srcdir/docs/listings/linking_safe.c.in > docs/listings/linking_safe.c` `tail -n +10 $srcdir/docs/listings/linking_unsafe.c.in > docs/listings/linking_unsafe.c` `tail -n +10 $srcdir/docs/listings/notation_clipboard.c.in > docs/listings/notation_clipboard.c` `tail -n +10 $srcdir/docs/listings/pcm_info.c.in > docs/listings/pcm_info.c` `tail -n +10 $srcdir/docs/listings/port.c.in > docs/listings/port.c` `tail -n +10 $srcdir/docs/listings/pull_thread.c.in > docs/listings/pull_thread.c` `tail -n +10 $srcdir/docs/listings/recycling.c.in > docs/listings/recycling.c` `tail -n +10 $srcdir/docs/listings/start_thread.c.in > docs/listings/start_thread.c` `tail -n +10 $srcdir/docs/listings/thread_application_context.c.in > docs/listings/thread_application_context.c` `tail -n +10 $srcdir/docs/listings/thread_obj_mutex.c.in > docs/listings/thread_obj_mutex.c` ]) gsequencer-3.1.3/m4/gtk-doc.m40000644000175000017500000001066013614025047012717 00000000000000# -*- mode: autoconf -*- # # gtk-doc.m4 - configure macro to check for gtk-doc # Copyright (C) 2003 James Henstridge # 2007-2017 Stefan Sauer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # As a special exception, the above copyright owner gives unlimited # permission to copy, distribute and modify the configure scripts that # are the output of Autoconf when processing the Macro. You need not # follow the terms of the GNU General Public License when using or # distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # serial 2 dnl Usage: dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) AC_DEFUN([GTK_DOC_CHECK], [ AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first ifelse([$1],[],[gtk_doc_requires="gtk-doc"],[gtk_doc_requires="gtk-doc >= $1"]) AC_MSG_CHECKING([for gtk-doc]) PKG_CHECK_EXISTS([$gtk_doc_requires],[have_gtk_doc=yes],[have_gtk_doc=no]) AC_MSG_RESULT($have_gtk_doc) if test "$have_gtk_doc" = "no"; then AC_MSG_WARN([ You will not be able to create source packages with 'make dist' because $gtk_doc_requires is not found.]) fi dnl check for tools we added during development dnl Use AC_CHECK_PROG to avoid the check target using an absolute path that dnl may not be writable by the user. Currently, automake requires that the dnl test name must end in '.test'. dnl https://bugzilla.gnome.org/show_bug.cgi?id=701638 AC_CHECK_PROG([GTKDOC_CHECK],[gtkdoc-check],[gtkdoc-check.test]) AC_PATH_PROG([GTKDOC_CHECK_PATH],[gtkdoc-check]) AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) dnl for overriding the documentation installation directory AC_ARG_WITH([html-dir], AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, [with_html_dir='${datadir}/gtk-doc/html']) HTML_DIR="$with_html_dir" AC_SUBST([HTML_DIR]) dnl enable/disable documentation building AC_ARG_ENABLE([gtk-doc], AS_HELP_STRING([--enable-gtk-doc], [use gtk-doc to build documentation [[default=no]]]),, [enable_gtk_doc=no]) AC_MSG_CHECKING([whether to build gtk-doc documentation]) AC_MSG_RESULT($enable_gtk_doc) if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then AC_MSG_ERROR([ You must have $gtk_doc_requires installed to build documentation for $PACKAGE_NAME. Please install gtk-doc or disable building the documentation by adding '--disable-gtk-doc' to '[$]0'.]) fi dnl don't check for glib if we build glib if test "x$PACKAGE_NAME" != "xglib"; then dnl don't fail if someone does not have glib PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,[:]) fi dnl enable/disable output formats AC_ARG_ENABLE([gtk-doc-html], AS_HELP_STRING([--enable-gtk-doc-html], [build documentation in html format [[default=yes]]]),, [enable_gtk_doc_html=yes]) AC_ARG_ENABLE([gtk-doc-pdf], AS_HELP_STRING([--enable-gtk-doc-pdf], [build documentation in pdf format [[default=no]]]),, [enable_gtk_doc_pdf=no]) if test -z "$GTKDOC_MKPDF"; then enable_gtk_doc_pdf=no fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) AM_CONDITIONAL([HAVE_GTK_DOC], [test x$have_gtk_doc = xyes]) AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) ]) gsequencer-3.1.3/m4/po.m40000644000175000017500000004503113614025057012006 00000000000000# po.m4 serial 24 (gettext-0.19) dnl Copyright (C) 1995-2014, 2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.60]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AC_PROG_SED])dnl AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.19]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" tab=`printf '\t'` if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 . AC_DEFUN([LIBAGS_SYMBOLS], [ AC_MSG_NOTICE([generating libags.sym]) `tail -n +19 $srcdir/libags.sym.in > $PWD/libags.sym` ]) AC_DEFUN([LIBAGS_THREAD_SYMBOLS], [ AC_MSG_NOTICE([generating libags_thread.sym]) `tail -n +19 $srcdir/libags_thread.sym.in > $PWD/libags_thread.sym` ]) AC_DEFUN([LIBAGS_SERVER_SYMBOLS], [ AC_MSG_NOTICE([generating libags_server.sym]) `tail -n +19 $srcdir/libags_server.sym.in > $PWD/libags_server.sym` ]) AC_DEFUN([LIBAGS_AUDIO_SYMBOLS], [ AC_MSG_NOTICE([generating libags_audio.sym]) `tail -n +19 $srcdir/libags_audio.sym.in > $PWD/libags_audio.sym` ]) AC_DEFUN([LIBAGS_GUI_SYMBOLS], [ AC_MSG_NOTICE([generating libags_gui.sym]) `tail -n +19 $srcdir/libags_gui.sym.in > $PWD/libags_gui.sym` ]) gsequencer-3.1.3/m4/libtool.m40000644000175000017500000112676613622252176013057 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS gsequencer-3.1.3/m4/introspection.m40000644000175000017500000000673613614025320014272 00000000000000dnl -*- mode: autoconf -*- dnl Copyright 2009 Johan Dahlin dnl dnl This file is free software; the author(s) gives unlimited dnl permission to copy and/or distribute it, with or without dnl modifications, as long as this notice is preserved. dnl # serial 1 m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL], [ AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([LT_INIT],[$0])dnl setup libtool first dnl enable/disable introspection m4_if([$2], [require], [dnl enable_introspection=yes ],[dnl AC_ARG_ENABLE(introspection, AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]], [Enable introspection for this build]),, [enable_introspection=auto]) ])dnl AC_MSG_CHECKING([for gobject-introspection]) dnl presence/version checking AS_CASE([$enable_introspection], [no], [dnl found_introspection="no (disabled, use --enable-introspection to enable)" ],dnl [yes],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0],, AC_MSG_ERROR([gobject-introspection-1.0 is not installed])) PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME])) ],dnl [auto],[dnl PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no) dnl Canonicalize enable_introspection enable_introspection=$found_introspection ],dnl [dnl AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@]) ])dnl AC_MSG_RESULT([$found_introspection]) INTROSPECTION_SCANNER= INTROSPECTION_COMPILER= INTROSPECTION_GENERATE= INTROSPECTION_GIRDIR= INTROSPECTION_TYPELIBDIR= if test "x$found_introspection" = "xyes"; then INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection fi AC_SUBST(INTROSPECTION_SCANNER) AC_SUBST(INTROSPECTION_COMPILER) AC_SUBST(INTROSPECTION_GENERATE) AC_SUBST(INTROSPECTION_GIRDIR) AC_SUBST(INTROSPECTION_TYPELIBDIR) AC_SUBST(INTROSPECTION_CFLAGS) AC_SUBST(INTROSPECTION_LIBS) AC_SUBST(INTROSPECTION_MAKEFILE) AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes") ]) dnl Usage: dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version]) AC_DEFUN([GOBJECT_INTROSPECTION_CHECK], [ _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1]) ]) dnl Usage: dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version]) AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE], [ _GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require]) ]) gsequencer-3.1.3/m4/lib-link.m40000644000175000017500000010044313614025151013063 00000000000000# lib-link.m4 serial 26 (gettext-0.18.2) dnl Copyright (C) 2001-2016 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.54]) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[m4_translit([$1],[./+-], [____])]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes popdef([NAME]) popdef([Name]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. The missing-message dnl defaults to 'no' and may contain additional hints for the user. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[m4_translit([$1],[./+-], [____])]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, dnl because these -l options might require -L options that are present in dnl LIBS. -l options benefit only from the -L options listed before it. dnl Otherwise, add it to the front of LIBS, because it may be a static dnl library that depends on another static library that is present in LIBS. dnl Static libraries benefit only from the static libraries listed after dnl it. case " $LIB[]NAME" in *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; *) LIBS="$LIB[]NAME $LIBS" ;; esac AC_LINK_IFELSE( [AC_LANG_PROGRAM([[$3]], [[$4]])], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) popdef([NAME]) popdef([Name]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_libname_spec, dnl acl_library_names_spec, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) gsequencer-3.1.3/m4/ags-docs-api.m40000644000175000017500000000472113614025007013633 00000000000000# -*- mode: autoconf -*- # # GSequencer - Advanced GTK Sequencer # Copyright (C) 2019 Joël Krähemann # # This file is part of GSequencer. # # GSequencer is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # GSequencer is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GSequencer. If not, see . AC_DEFUN([AGS_DOCS_API], [ AC_MSG_NOTICE([generating resources for API Reference Manual]) `mkdir -p docs/reference/libags` `tail -n +19 $srcdir/docs/reference/libags/libags-sections.txt.in > docs/reference/libags/libags-sections.txt` `tail -n +19 $srcdir/docs/reference/libags/libags.types.in > docs/reference/libags/libags.types` `tail -n +19 $srcdir/docs/reference/libags/libags.interfaces.in > docs/reference/libags/libags.interfaces` `mkdir -p docs/reference/libags-audio` `tail -n +19 $srcdir/docs/reference/libags-audio/libags_audio-sections.txt.in > docs/reference/libags-audio/libags_audio-sections.txt` `tail -n +19 $srcdir/docs/reference/libags-audio/libags_audio.types.in > docs/reference/libags-audio/libags_audio.types` `tail -n +19 $srcdir/docs/reference/libags-audio/libags_audio.interfaces.in > docs/reference/libags-audio/libags_audio.interfaces` `mkdir -p docs/reference/libags-gui` `tail -n +19 $srcdir/docs/reference/libags-gui/libags_gui-sections.txt.in > docs/reference/libags-gui/libags_gui-sections.txt` `tail -n +19 $srcdir/docs/reference/libags-gui/libags_gui.types.in > docs/reference/libags-gui/libags_gui.types` `tail -n +19 $srcdir/docs/reference/libags-gui/libags_gui.interfaces.in > docs/reference/libags-gui/libags_gui.interfaces` `mkdir -p docs/reference/libgsequencer` `tail -n +19 $srcdir/docs/reference/libgsequencer/libgsequencer-sections.txt.in > docs/reference/libgsequencer/libgsequencer-sections.txt` `tail -n +19 $srcdir/docs/reference/libgsequencer/libgsequencer.types.in > docs/reference/libgsequencer/libgsequencer.types` `tail -n +19 $srcdir/docs/reference/libgsequencer/libgsequencer.interfaces.in > docs/reference/libgsequencer/libgsequencer.interfaces` ]) gsequencer-3.1.3/missing0000755000175000017500000001533613622252204012205 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gsequencer-3.1.3/gsequencer.10000644000175000017500000000735113607210263013031 00000000000000'\" t .\" Title: gsequencer .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.79.1 .\" Date: 2020-01-08 .\" Manual: gsequencer v3.0.0 .\" Source: gsequencer v3.0.0 .\" Language: English .\" .TH "GSEQUENCER" "1" "2020\-01\-08" "gsequencer v3.0.0" "gsequencer v3.0.0" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" gsequencer \- Advanced Gtk+ Sequencer is an audio sequencer and composition editor .SH "SYNOPSIS" .HP \w'\fB/usr/bin/gsequencer\fR\ 'u \fB/usr/bin/gsequencer\fR [\-\-help] [\-\-version] [\-\-no\-builtin\-theme] [\-\-filename\ \fIfile\fR] .SH "DESCRIPTION" .PP Advanced GTK+ Sequencer is intended to use for music composition\&. It features a piano roll, as well a synth, matrix editor, drum machine, soundfont2 player, mixer and an output panel\&. It\(cqs designed to be highly configurable\&. You may add effects to its effect chain; and add or remove audio channels/pads\&. You may set up a fully functional network of engines, thus there is a link editor for linking audio lines\&. .PP As version 1\&.0\&.0 it supports LADSPA, DSSI and Lv2 plugin format\&. And provides the ability to export to WAV, FLAC and OGG audio files\&. It can run on various soundcard backends including ALSA, OSS4, JACK Audio Connection Kit, Pulseaudio Core\-Audio, Audio\-Unit and WASAPI\&. .PP \&... .SH "OPTIONS" .PP The program follows the usual GNU command line syntax, with long options starting with two dashes (`\-\*(Aq)\&. A summary of options is included below\&. For a complete description, see the \fBinfo\fR(1) files\&. .PP \fB\-\-no\-builtin\-theme\fR .RS 4 Disable built\-in theme in order to display default theme\&. .RE .PP \fB\-\-filename file\fR .RS 4 Open file from command line\&. .RE .PP \fB\-\-help\fR .RS 4 Show summary of options\&. .RE .PP \fB\-\-version\fR .RS 4 Show version of program\&. .RE .SH "ENVIRONMENT VARIABLES" .PP The program interprets following environment variables if set\&. .PP LADSPA_PATH .RS 4 LADSPA plugin search path .RE .PP DSSI_PATH .RS 4 DSSI plugin search path .RE .PP LV2_PATH .RS 4 LV2 plugin search path .RE .PP AGS_ANIMATION_FILENAME .RS 4 The splash screen\*(Aqs background picture .RE .PP AGS_ANIMATION_TEXT_BOX_X0 .RS 4 The splash screen\*(Aqs text box x\-position .RE .PP AGS_ANIMATION_TEXT_BOX_Y0 .RS 4 The splash screen\*(Aqs text box y\-position .RE .PP AGS_ANIMATION_TEXT_COLOR .RS 4 The splash screen\*(Aqs text color .RE .PP AGS_CSS_FILENAME .RS 4 The application\*(Aqs style sheet .RE .SH "BUGS" .PP None\&. So far I know\&. .SH "AUTHOR" .PP Jo\(:el Kr\(:ahemann .SH "COPYRIGHT" .br Copyright \(co 2020 Jo\(:el Kr\(:ahemann .br .PP This manual page is part of GSequencer\&. License GPLv3+: GNU GPL version 3 or (at your option) any later \&. .PP This is free software: you are free to change and redistribute it\&. There is NO WARRANTY, to the extent permitted by law\&. .sp gsequencer-3.1.3/ags_authentication_test.xml0000644000175000017500000000133013607210263016227 00000000000000 ags-test-user-uuid-0 audio gsequencer-3.1.3/configure0000755000175000017500000314252513622252202012517 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for gsequencer 3.1.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: jkraehemann@gmail.com about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gsequencer' PACKAGE_TARNAME='gsequencer' PACKAGE_VERSION='3.1.3' PACKAGE_STRING='gsequencer 3.1.3' PACKAGE_BUGREPORT='jkraehemann@gmail.com' PACKAGE_URL='' ac_unique_file="ags/config.h.in" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBGSEQUENCER_API_DOC WITH_EXPERIMENTAL_FALSE WITH_EXPERIMENTAL_TRUE WITH_VST3_FALSE WITH_VST3_TRUE WITH_SYSTEM_TESTS_FALSE WITH_SYSTEM_TESTS_TRUE GTK_DOC_USE_REBASE_FALSE GTK_DOC_USE_REBASE_TRUE GTK_DOC_USE_LIBTOOL_FALSE GTK_DOC_USE_LIBTOOL_TRUE GTK_DOC_BUILD_PDF_FALSE GTK_DOC_BUILD_PDF_TRUE GTK_DOC_BUILD_HTML_FALSE GTK_DOC_BUILD_HTML_TRUE ENABLE_GTK_DOC_FALSE ENABLE_GTK_DOC_TRUE HAVE_GTK_DOC_FALSE HAVE_GTK_DOC_TRUE GTKDOC_DEPS_LIBS GTKDOC_DEPS_CFLAGS HTML_DIR GTKDOC_MKPDF GTKDOC_REBASE GTKDOC_CHECK_PATH GTKDOC_CHECK OSX_FALSE OSX_TRUE WINDOWS_FALSE WINDOWS_TRUE FREEBSD_FALSE FREEBSD_TRUE LINUX_FALSE LINUX_TRUE GNU_FALSE GNU_TRUE LIBOBJS FAST_TEST_MODE_FALSE FAST_TEST_MODE_TRUE RUN_FUNCTIONAL_TESTS_FALSE RUN_FUNCTIONAL_TESTS_TRUE WEBKITGTK_LIBS WEBKITGTK_CFLAGS GTK_LIBS GTK_CFLAGS CAIRO_LIBS CAIRO_CFLAGS VST3_LIBS VST3_CXXFLAGS WITH_LIBINSTPATCH_FALSE WITH_LIBINSTPATCH_TRUE LIBINSTPATCH_LIBS LIBINSTPATCH_CFLAGS AGS_WITH_SINGLE_DOCDIR_FALSE AGS_WITH_SINGLE_DOCDIR_TRUE AGS_WITH_UPSTREAM_GTK_DOC_FALSE AGS_WITH_UPSTREAM_GTK_DOC_TRUE AGS_WITH_PUBLIC_LIBGSEQUENCER_FALSE AGS_WITH_PUBLIC_LIBGSEQUENCER_TRUE LIBSOUP_LIBS LIBSOUP_CFLAGS GIO_LIBS GIO_CFLAGS HAVE_INTROSPECTION_FALSE HAVE_INTROSPECTION_TRUE INTROSPECTION_MAKEFILE INTROSPECTION_LIBS INTROSPECTION_CFLAGS INTROSPECTION_TYPELIBDIR INTROSPECTION_GIRDIR INTROSPECTION_GENERATE INTROSPECTION_COMPILER INTROSPECTION_SCANNER GOBJECT_LIBS GOBJECT_CFLAGS GLIB_LIBS GLIB_CFLAGS FFTW_LIBS FFTW_CFLAGS SNDFILE_LIBS SNDFILE_CFLAGS SAMPLERATE_LIBS SAMPLERATE_CFLAGS LIBXML2_LIBS LIBXML2_CFLAGS PULSE_LIBS PULSE_CFLAGS JACK_LIBS JACK_CFLAGS WASAPI_LIBS WASAPI_CFLAGS AUDIO_UNIT_LIBS AUDIO_UNIT_CFLAGS CORE_AUDIO_LIBS CORE_AUDIO_CFLAGS LIBASOUND2_LIBS LIBASOUND2_CFLAGS UUID_LIBS UUID_CFLAGS WITH_OSXAPI_FALSE WITH_OSXAPI_TRUE WITH_W32API_FALSE WITH_W32API_TRUE ALLOCA XMKMF GTK_MAC_INTEGRATION_LIBS GTK_MAC_INTEGRATION_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG GSEQUENCER_FUNCTIONAL_TEST_LDADD LIBGSEQUENCER_TEST_LIBADD MIDI2XML_LDFLAGS MIDI2XML_CFLAGS GSEQUENCER_LDFLAGS GSEQUENCER_CFLAGS LIBTOOL_DEPS CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP LIBTOOL am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX LIBGSEQUENCER_API_DIR LIBAGS_GUI_API_DIR LIBAGS_AUDIO_API_DIR LIBAGS_API_DIR LIBAGS_GUI_API_DOC LIBAGS_AUDIO_API_DOC LIBAGS_API_DOC GTK_API_DOC GOBJECT_API_DOC HTMLHELP_XSL POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS host_os host_vendor host_cpu host build_os build_vendor build_cpu build XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS SED EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_public_libgsequencer enable_upstream_gtk_doc enable_single_docdir enable_strip_rt_events enable_rt enable_w32api enable_osxapi enable_alsa enable_oss enable_jack enable_pulse enable_core_audio enable_audio_unit enable_wasapi enable_libinstpatch enable_vst3 enable_x11 enable_quartz enable_run_functional_tests enable_fast_test_mode enable_run_system_tests enable_experimental enable_shared enable_static with_pic enable_fast_install with_aix_soname with_sysroot enable_libtool_lock with_x enable_introspection with_html_dir enable_gtk_doc enable_gtk_doc_html enable_gtk_doc_pdf ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP HTMLHELP_XSL GOBJECT_API_DOC GTK_API_DOC LIBAGS_API_DOC LIBAGS_AUDIO_API_DOC LIBAGS_GUI_API_DOC LIBAGS_API_DIR LIBAGS_AUDIO_API_DIR LIBAGS_GUI_API_DIR LIBGSEQUENCER_API_DIR CXX CXXFLAGS CCC LT_SYS_LIBRARY_PATH CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_MAC_INTEGRATION_CFLAGS GTK_MAC_INTEGRATION_LIBS XMKMF UUID_CFLAGS UUID_LIBS LIBASOUND2_CFLAGS LIBASOUND2_LIBS JACK_CFLAGS JACK_LIBS PULSE_CFLAGS PULSE_LIBS LIBXML2_CFLAGS LIBXML2_LIBS SAMPLERATE_CFLAGS SAMPLERATE_LIBS SNDFILE_CFLAGS SNDFILE_LIBS FFTW_CFLAGS FFTW_LIBS GLIB_CFLAGS GLIB_LIBS GOBJECT_CFLAGS GOBJECT_LIBS GIO_CFLAGS GIO_LIBS LIBSOUP_CFLAGS LIBSOUP_LIBS LIBINSTPATCH_CFLAGS LIBINSTPATCH_LIBS CAIRO_CFLAGS CAIRO_LIBS GTK_CFLAGS GTK_LIBS WEBKITGTK_CFLAGS WEBKITGTK_LIBS GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gsequencer 3.1.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gsequencer] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gsequencer 3.1.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-public-libgsequencer provide public libgsequencer (default is yes) --enable-upstream-gtk-doc put API reference manual in upstream dedicated directory (default is yes) --enable-single-docdir put API reference manual in upstream dedicated directory (default is no) --enable-strip-rt-events strip rt events (default is yes) --enable-rt enable rt (default is yes) --enable-w32api enable w32 API (default is no) --enable-osxapi enable OS X API (default is no) --enable-alsa enable alsa (default is yes) --enable-oss enable oss (default is no) --enable-jack enable jack (default is yes) --enable-pulse enable pulse (default is yes) --enable-core-audio enable core audio (default is no) --enable-audio-unit enable audio unit (default is no) --enable-wasapi enable WASAPI (default is no) --enable-libinstpatch enable libinstpatch (default is yes) --enable-vst3 enable vst3 (default is no) --enable-x11 enable X11 (default is yes) --enable-quartz enable quartz (default is no) --enable-run-functional-tests run functional tests (default is no) --enable-fast-test-mode fast test mode (default is no) --enable-run-system-tests run system tests (default is no) --enable-experimental experimental (default is no) --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-introspection=[no/auto/yes] Enable introspection for this build --enable-gtk-doc use gtk-doc to build documentation [[default=no]] --enable-gtk-doc-html build documentation in html format [[default=yes]] --enable-gtk-doc-pdf build documentation in pdf format [[default=no]] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-x use the X Window System --with-html-dir=PATH path to installed docs Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor HTMLHELP_XSL path to Docbook XML htmlhelp XSL file GOBJECT_API_DOC escaped path for use with sed to GObject API Reference Manual GTK_API_DOC escaped path for use with sed to Gtk-3 API Reference Manual LIBAGS_API_DOC escaped path for use with sed to Libags API Reference Manual LIBAGS_AUDIO_API_DOC escaped path for use with sed to Libags-audio API Reference Manual LIBAGS_GUI_API_DOC escaped path for use with sed to Libags-gui API Reference Manual LIBAGS_API_DIR install path of Libags API Reference Manual LIBAGS_AUDIO_API_DIR install path of Libags-audio API Reference Manual LIBAGS_GUI_API_DIR install path of Libags-gui API Reference Manual LIBGSEQUENCER_API_DIR install path of Libgsequencer API Reference Manual CXX C++ compiler command CXXFLAGS C++ compiler flags LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK_MAC_INTEGRATION_CFLAGS C compiler flags for GTK_MAC_INTEGRATION, overriding pkg-config GTK_MAC_INTEGRATION_LIBS linker flags for GTK_MAC_INTEGRATION, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System UUID_CFLAGS C compiler flags for UUID, overriding pkg-config UUID_LIBS linker flags for UUID, overriding pkg-config LIBASOUND2_CFLAGS C compiler flags for LIBASOUND2, overriding pkg-config LIBASOUND2_LIBS linker flags for LIBASOUND2, overriding pkg-config JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config PULSE_CFLAGS C compiler flags for PULSE, overriding pkg-config PULSE_LIBS linker flags for PULSE, overriding pkg-config LIBXML2_CFLAGS C compiler flags for LIBXML2, overriding pkg-config LIBXML2_LIBS linker flags for LIBXML2, overriding pkg-config SAMPLERATE_CFLAGS C compiler flags for SAMPLERATE, overriding pkg-config SAMPLERATE_LIBS linker flags for SAMPLERATE, overriding pkg-config SNDFILE_CFLAGS C compiler flags for SNDFILE, overriding pkg-config SNDFILE_LIBS linker flags for SNDFILE, overriding pkg-config FFTW_CFLAGS C compiler flags for FFTW, overriding pkg-config FFTW_LIBS linker flags for FFTW, overriding pkg-config GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config GOBJECT_CFLAGS C compiler flags for GOBJECT, overriding pkg-config GOBJECT_LIBS linker flags for GOBJECT, overriding pkg-config GIO_CFLAGS C compiler flags for GIO, overriding pkg-config GIO_LIBS linker flags for GIO, overriding pkg-config LIBSOUP_CFLAGS C compiler flags for LIBSOUP, overriding pkg-config LIBSOUP_LIBS linker flags for LIBSOUP, overriding pkg-config LIBINSTPATCH_CFLAGS C compiler flags for LIBINSTPATCH, overriding pkg-config LIBINSTPATCH_LIBS linker flags for LIBINSTPATCH, overriding pkg-config CAIRO_CFLAGS C compiler flags for CAIRO, overriding pkg-config CAIRO_LIBS linker flags for CAIRO, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config WEBKITGTK_CFLAGS C compiler flags for WEBKITGTK, overriding pkg-config WEBKITGTK_LIBS linker flags for WEBKITGTK, overriding pkg-config GTKDOC_DEPS_CFLAGS C compiler flags for GTKDOC_DEPS, overriding pkg-config GTKDOC_DEPS_LIBS linker flags for GTKDOC_DEPS, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gsequencer configure 3.1.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------ ## ## Report this to jkraehemann@gmail.com ## ## ------------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gsequencer $as_me 3.1.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gsequencer' VERSION='3.1.3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers ags/config.h" ac_config_headers="$ac_config_headers ags/ags_config.h" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.19 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi test "$am_cv_func_iconv_works" = no || break done LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" # options # Check whether --enable-public-libgsequencer was given. if test "${enable_public_libgsequencer+set}" = set; then : enableval=$enable_public_libgsequencer; else enable_public_libgsequencer=yes fi # Check whether --enable-upstream-gtk-doc was given. if test "${enable_upstream_gtk_doc+set}" = set; then : enableval=$enable_upstream_gtk_doc; else enable_upstream_gtk_doc=yes fi # Check whether --enable-single-docdir was given. if test "${enable_single_docdir+set}" = set; then : enableval=$enable_single_docdir; else enable_single_docdir=no fi # Check whether --enable-strip-rt-events was given. if test "${enable_strip_rt_events+set}" = set; then : enableval=$enable_strip_rt_events; else enable_strip_rt_events=yes fi # Check whether --enable-rt was given. if test "${enable_rt+set}" = set; then : enableval=$enable_rt; else enable_rt=yes fi # Check whether --enable-w32api was given. if test "${enable_w32api+set}" = set; then : enableval=$enable_w32api; else enable_w32api=no fi # Check whether --enable-osxapi was given. if test "${enable_osxapi+set}" = set; then : enableval=$enable_osxapi; else enable_osxapi=no fi # Check whether --enable-alsa was given. if test "${enable_alsa+set}" = set; then : enableval=$enable_alsa; else enable_alsa=yes fi # Check whether --enable-oss was given. if test "${enable_oss+set}" = set; then : enableval=$enable_oss; else enable_oss=no fi # Check whether --enable-jack was given. if test "${enable_jack+set}" = set; then : enableval=$enable_jack; else enable_jack=yes fi # Check whether --enable-pulse was given. if test "${enable_pulse+set}" = set; then : enableval=$enable_pulse; else enable_pulse=yes fi # Check whether --enable-core-audio was given. if test "${enable_core_audio+set}" = set; then : enableval=$enable_core_audio; else enable_core_audio=no fi # Check whether --enable-audio-unit was given. if test "${enable_audio_unit+set}" = set; then : enableval=$enable_audio_unit; else enable_audio_unit=no fi # Check whether --enable-wasapi was given. if test "${enable_wasapi+set}" = set; then : enableval=$enable_wasapi; else enable_wasapi=no fi # Check whether --enable-libinstpatch was given. if test "${enable_libinstpatch+set}" = set; then : enableval=$enable_libinstpatch; else enable_libinstpatch=yes fi # Check whether --enable-vst3 was given. if test "${enable_vst3+set}" = set; then : enableval=$enable_vst3; else enable_vst3=no fi # Check whether --enable-pulse was given. if test "${enable_pulse+set}" = set; then : enableval=$enable_pulse; else enable_pulse=yes fi # Check whether --enable-x11 was given. if test "${enable_x11+set}" = set; then : enableval=$enable_x11; else enable_x11=yes fi # Check whether --enable-quartz was given. if test "${enable_quartz+set}" = set; then : enableval=$enable_quartz; else enable_quartz=no fi # Check whether --enable-run-functional-tests was given. if test "${enable_run_functional_tests+set}" = set; then : enableval=$enable_run_functional_tests; else enable_run_functional_tests=no fi # Check whether --enable-fast-test-mode was given. if test "${enable_fast_test_mode+set}" = set; then : enableval=$enable_fast_test_mode; else enable_fast_test_mode=no fi # Check whether --enable-run-system-tests was given. if test "${enable_run_system_tests+set}" = set; then : enableval=$enable_run_system_tests; else enable_run_system_tests=no fi # Check whether --enable-experimental was given. if test "${enable_experimental+set}" = set; then : enableval=$enable_experimental; else enable_experimental=no fi # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi #AS_IF([test "x$enable_w32api" != xno], # [gl_EARLY]) # libtool case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi link_all_deplibs=no else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Checks for libraries. # FIXME: Replace `main' with a function in `-lX11': if test "x$enable_x11" != xno; then : $as_echo "#define AGS_WITH_X11 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 $as_echo_n "checking for main in -lX11... " >&6; } if ${ac_cv_lib_X11_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_X11_main=yes else ac_cv_lib_X11_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_main" >&5 $as_echo "$ac_cv_lib_X11_main" >&6; } if test "x$ac_cv_lib_X11_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBX11 1 _ACEOF LIBS="-lX11 $LIBS" else as_fn_error $? "\"No X11 library present\"" "$LINENO" 5 fi X11_LIBS="-lX11" else { $as_echo "$as_me:${as_lineno-$LINENO}: X11 disabled" >&5 $as_echo "$as_me: X11 disabled" >&6;} fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test "x$enable_quartz" != xno; then : $as_echo "#define AGS_WITH_QUARTZ 1" >>confdefs.h pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_MAC_INTEGRATION" >&5 $as_echo_n "checking for GTK_MAC_INTEGRATION... " >&6; } if test -n "$GTK_MAC_INTEGRATION_CFLAGS"; then pkg_cv_GTK_MAC_INTEGRATION_CFLAGS="$GTK_MAC_INTEGRATION_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-mac-integration-gtk3 >= 2.0.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-mac-integration-gtk3 >= 2.0.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_MAC_INTEGRATION_CFLAGS=`$PKG_CONFIG --cflags "gtk-mac-integration-gtk3 >= 2.0.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_MAC_INTEGRATION_LIBS"; then pkg_cv_GTK_MAC_INTEGRATION_LIBS="$GTK_MAC_INTEGRATION_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-mac-integration-gtk3 >= 2.0.7\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-mac-integration-gtk3 >= 2.0.7") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_MAC_INTEGRATION_LIBS=`$PKG_CONFIG --libs "gtk-mac-integration-gtk3 >= 2.0.7" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_MAC_INTEGRATION_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk-mac-integration-gtk3 >= 2.0.7" 2>&1` else GTK_MAC_INTEGRATION_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk-mac-integration-gtk3 >= 2.0.7" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_MAC_INTEGRATION_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk-mac-integration-gtk3 >= 2.0.7) were not met: $GTK_MAC_INTEGRATION_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_MAC_INTEGRATION_CFLAGS and GTK_MAC_INTEGRATION_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_MAC_INTEGRATION_CFLAGS and GTK_MAC_INTEGRATION_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_MAC_INTEGRATION_CFLAGS=$pkg_cv_GTK_MAC_INTEGRATION_CFLAGS GTK_MAC_INTEGRATION_LIBS=$pkg_cv_GTK_MAC_INTEGRATION_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: quartz enabled" >&5 $as_echo "$as_me: quartz enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: quartz disabled" >&5 $as_echo "$as_me: quartz disabled" >&6;} fi # FIXME: Replace `main' with a function in `-ldl': # AC_CHECK_LIB([dl], [main], , AC_MSG_ERROR("No dl library present")) # FIXME: Replace `main' with a function in `-lm': { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lm" >&5 $as_echo_n "checking for main in -lm... " >&6; } if ${ac_cv_lib_m_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_main=yes else ac_cv_lib_m_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_main" >&5 $as_echo "$ac_cv_lib_m_main" >&6; } if test "x$ac_cv_lib_m_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" else as_fn_error $? "\"No math library present\"" "$LINENO" 5 fi if test "x$enable_strip_rt_events" != xno; then : $as_echo "#define AGS_STRIP_RT_EVENTS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: striping rt-events enabled" >&5 $as_echo "$as_me: striping rt-events enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: striping rt-events disabled" >&5 $as_echo "$as_me: striping rt-events disabled" >&6;} fi # FIXME: Replace `main' with a function in `-lrt': if test "x$enable_rt" != xno; then : $as_echo "#define AGS_WITH_RT 1" >>confdefs.h RT_LIBS="-lrt" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lrt" >&5 $as_echo_n "checking for main in -lrt... " >&6; } if ${ac_cv_lib_rt_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_main=yes else ac_cv_lib_rt_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_main" >&5 $as_echo "$ac_cv_lib_rt_main" >&6; } if test "x$ac_cv_lib_rt_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRT 1 _ACEOF LIBS="-lrt $LIBS" else as_fn_error $? "\"No rt library present\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: rt enabled" >&5 $as_echo "$as_me: rt enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: rt disabled" >&5 $as_echo "$as_me: rt disabled" >&6;} fi # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in stdlib.h string.h unistd.h ladspa.h dssi.h lv2.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else as_fn_error $? "\"missing headers\"" "$LINENO" 5 fi done # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi WITH_W32API=0 if test "x$enable_w32api" != xno; then : $as_echo "#define AGS_W32API 1" >>confdefs.h W32API_CFLAGS="-nostdinc -I./lib -I/usr/lib/gcc/x86_64-w64-mingw32/7.4.0/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include -I/usr/x86_64-w64-mingw32/sys-root/mingw/include/dssi -include ags/config.h " W32API_LIBS="-L./lib -lgnu" { $as_echo "$as_me:${as_lineno-$LINENO}: w32api enabled" >&5 $as_echo "$as_me: w32api enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: w32api disabled" >&5 $as_echo "$as_me: w32api disabled" >&6;} fi if test "x$enable_w32api" == xyes; then WITH_W32API_TRUE= WITH_W32API_FALSE='#' else WITH_W32API_TRUE='#' WITH_W32API_FALSE= fi if test "x$enable_osxapi" != xno; then : $as_echo "#define AGS_OSXAPI 1" >>confdefs.h OSXAPI_CFLAGS="" OSXAPI_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: OS X api enabled" >&5 $as_echo "$as_me: OS X api enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: OS X api disabled" >&5 $as_echo "$as_me: OS X api disabled" >&6;} fi if test "x$enable_osxapi" == xyes; then WITH_OSXAPI_TRUE= WITH_OSXAPI_FALSE='#' else WITH_OSXAPI_TRUE='#' WITH_OSXAPI_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for UUID" >&5 $as_echo_n "checking for UUID... " >&6; } if test -n "$UUID_CFLAGS"; then pkg_cv_UUID_CFLAGS="$UUID_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uuid >= 1.0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "uuid >= 1.0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UUID_CFLAGS=`$PKG_CONFIG --cflags "uuid >= 1.0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$UUID_LIBS"; then pkg_cv_UUID_LIBS="$UUID_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uuid >= 1.0.1\""; } >&5 ($PKG_CONFIG --exists --print-errors "uuid >= 1.0.1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UUID_LIBS=`$PKG_CONFIG --libs "uuid >= 1.0.1" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then UUID_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "uuid >= 1.0.1" 2>&1` else UUID_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "uuid >= 1.0.1" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$UUID_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (uuid >= 1.0.1) were not met: $UUID_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables UUID_CFLAGS and UUID_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables UUID_CFLAGS and UUID_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else UUID_CFLAGS=$pkg_cv_UUID_CFLAGS UUID_LIBS=$pkg_cv_UUID_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if test "x$enable_alsa" != xno; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBASOUND2" >&5 $as_echo_n "checking for LIBASOUND2... " >&6; } if test -n "$LIBASOUND2_CFLAGS"; then pkg_cv_LIBASOUND2_CFLAGS="$LIBASOUND2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0.25\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0.25") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBASOUND2_CFLAGS=`$PKG_CONFIG --cflags "alsa >= 1.0.25" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBASOUND2_LIBS"; then pkg_cv_LIBASOUND2_LIBS="$LIBASOUND2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0.25\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0.25") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBASOUND2_LIBS=`$PKG_CONFIG --libs "alsa >= 1.0.25" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBASOUND2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "alsa >= 1.0.25" 2>&1` else LIBASOUND2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "alsa >= 1.0.25" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBASOUND2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (alsa >= 1.0.25) were not met: $LIBASOUND2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBASOUND2_CFLAGS and LIBASOUND2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBASOUND2_CFLAGS and LIBASOUND2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBASOUND2_CFLAGS=$pkg_cv_LIBASOUND2_CFLAGS LIBASOUND2_LIBS=$pkg_cv_LIBASOUND2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define AGS_WITH_ALSA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: ALSA enabled" >&5 $as_echo "$as_me: ALSA enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: ALSA disabled" >&5 $as_echo "$as_me: ALSA disabled" >&6;} for ac_header in alsa/seq_event.h do : ac_fn_c_check_header_compile "$LINENO" "alsa/seq_event.h" "ac_cv_header_alsa_seq_event_h" " #if HAVE_ALSA_SEQ_EVENT_H # include # include #endif " if test "x$ac_cv_header_alsa_seq_event_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ALSA_SEQ_EVENT_H 1 _ACEOF $as_echo "#define HAVE_ALSA_SEQ_EVENT_H 1" >>confdefs.h pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBASOUND2" >&5 $as_echo_n "checking for LIBASOUND2... " >&6; } if test -n "$LIBASOUND2_CFLAGS"; then pkg_cv_LIBASOUND2_CFLAGS="$LIBASOUND2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0.5\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0.5") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBASOUND2_CFLAGS=`$PKG_CONFIG --cflags "alsa >= 1.0.5" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBASOUND2_LIBS"; then pkg_cv_LIBASOUND2_LIBS="$LIBASOUND2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa >= 1.0.5\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa >= 1.0.5") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBASOUND2_LIBS=`$PKG_CONFIG --libs "alsa >= 1.0.5" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBASOUND2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "alsa >= 1.0.5" 2>&1` else LIBASOUND2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "alsa >= 1.0.5" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBASOUND2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (alsa >= 1.0.5) were not met: $LIBASOUND2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBASOUND2_CFLAGS and LIBASOUND2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBASOUND2_CFLAGS and LIBASOUND2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBASOUND2_CFLAGS=$pkg_cv_LIBASOUND2_CFLAGS LIBASOUND2_LIBS=$pkg_cv_LIBASOUND2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: ALSA sequencer event not available" >&5 $as_echo "$as_me: ALSA sequencer event not available" >&6;} fi done fi if test "x$enable_oss" != xno; then : $as_echo "#define AGS_WITH_OSS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: OSS enabled" >&5 $as_echo "$as_me: OSS enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: OSS disabled" >&5 $as_echo "$as_me: OSS disabled" >&6;} fi if test "x$enable_core_audio" != xno; then : $as_echo "#define AGS_WITH_CORE_AUDIO 1" >>confdefs.h CORE_AUDIO_CFLAGS= CORE_AUDIO_LIBS="-framework CoreAudio -framework AudioToolbox -framework CoreMIDI" { $as_echo "$as_me:${as_lineno-$LINENO}: core audio enabled" >&5 $as_echo "$as_me: core audio enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: core audio disabled" >&5 $as_echo "$as_me: core audio disabled" >&6;} fi if test "x$enable_audio_unit" != xno; then : $as_echo "#define AGS_WITH_AUDIO_UNIT 1" >>confdefs.h AUDIO_UNIT_CFLAGS= AUDIO_UNIT_LIBS="-framework AudioUnit -framework AudioToolbox" { $as_echo "$as_me:${as_lineno-$LINENO}: audio-unit enabled" >&5 $as_echo "$as_me: audio-unit enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: audio-unit disabled" >&5 $as_echo "$as_me: audio-unit disabled" >&6;} fi if test "x$enable_wasapi" != xno; then : $as_echo "#define AGS_WITH_WASAPI 1" >>confdefs.h WASAPI_CFLAGS="" WASAPI_LIBS="-lwinmm -ldsound -lsetupapi -lole32" { $as_echo "$as_me:${as_lineno-$LINENO}: wasapi enabled" >&5 $as_echo "$as_me: wasapi enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: wasapi disabled" >&5 $as_echo "$as_me: wasapi disabled" >&6;} fi if test "x$enable_jack" != xno; then : $as_echo "#define AGS_WITH_JACK 1" >>confdefs.h pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JACK" >&5 $as_echo_n "checking for JACK... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "jack" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "jack" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "jack" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "jack" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (jack) were not met: $JACK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables JACK_CFLAGS and JACK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables JACK_CFLAGS and JACK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ac_fn_c_check_func "$LINENO" "jack_port_uuid" "ac_cv_func_jack_port_uuid" if test "x$ac_cv_func_jack_port_uuid" = xyes; then : $as_echo "#define HAVE_JACK_PORT_UUID 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: JACK enabled" >&5 $as_echo "$as_me: JACK enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: JACK disabled" >&5 $as_echo "$as_me: JACK disabled" >&6;} fi if test "x$enable_pulse" != xno; then : $as_echo "#define AGS_WITH_PULSE 1" >>confdefs.h pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PULSE" >&5 $as_echo_n "checking for PULSE... " >&6; } if test -n "$PULSE_CFLAGS"; then pkg_cv_PULSE_CFLAGS="$PULSE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-mainloop-glib\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-mainloop-glib") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_CFLAGS=`$PKG_CONFIG --cflags "libpulse-mainloop-glib" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PULSE_LIBS"; then pkg_cv_PULSE_LIBS="$PULSE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpulse-mainloop-glib\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpulse-mainloop-glib") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PULSE_LIBS=`$PKG_CONFIG --libs "libpulse-mainloop-glib" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PULSE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpulse-mainloop-glib" 2>&1` else PULSE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpulse-mainloop-glib" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PULSE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpulse-mainloop-glib) were not met: $PULSE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PULSE_CFLAGS and PULSE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PULSE_CFLAGS and PULSE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PULSE_CFLAGS=$pkg_cv_PULSE_CFLAGS PULSE_LIBS=$pkg_cv_PULSE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: PULSE enabled" >&5 $as_echo "$as_me: PULSE enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: PULSE disabled" >&5 $as_echo "$as_me: PULSE disabled" >&6;} fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXML2" >&5 $as_echo_n "checking for LIBXML2... " >&6; } if test -n "$LIBXML2_CFLAGS"; then pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML2_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0 >= 2.8.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBXML2_LIBS"; then pkg_cv_LIBXML2_LIBS="$LIBXML2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.8.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML2_LIBS=`$PKG_CONFIG --libs "libxml-2.0 >= 2.8.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBXML2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0 >= 2.8.0" 2>&1` else LIBXML2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0 >= 2.8.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBXML2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libxml-2.0 >= 2.8.0) were not met: $LIBXML2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBXML2_CFLAGS and LIBXML2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBXML2_CFLAGS and LIBXML2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBXML2_CFLAGS=$pkg_cv_LIBXML2_CFLAGS LIBXML2_LIBS=$pkg_cv_LIBXML2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SAMPLERATE" >&5 $as_echo_n "checking for SAMPLERATE... " >&6; } if test -n "$SAMPLERATE_CFLAGS"; then pkg_cv_SAMPLERATE_CFLAGS="$SAMPLERATE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_CFLAGS=`$PKG_CONFIG --cflags "samplerate >= 0.1.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SAMPLERATE_LIBS"; then pkg_cv_SAMPLERATE_LIBS="$SAMPLERATE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"samplerate >= 0.1.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "samplerate >= 0.1.8") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SAMPLERATE_LIBS=`$PKG_CONFIG --libs "samplerate >= 0.1.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "samplerate >= 0.1.8" 2>&1` else SAMPLERATE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "samplerate >= 0.1.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SAMPLERATE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (samplerate >= 0.1.8) were not met: $SAMPLERATE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SAMPLERATE_CFLAGS and SAMPLERATE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SAMPLERATE_CFLAGS and SAMPLERATE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else SAMPLERATE_CFLAGS=$pkg_cv_SAMPLERATE_CFLAGS SAMPLERATE_LIBS=$pkg_cv_SAMPLERATE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5 $as_echo_n "checking for SNDFILE... " >&6; } if test -n "$SNDFILE_CFLAGS"; then pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.25\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.25") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.25" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$SNDFILE_LIBS"; then pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.25\""; } >&5 ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.25") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.25" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "sndfile >= 1.0.25" 2>&1` else SNDFILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "sndfile >= 1.0.25" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$SNDFILE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (sndfile >= 1.0.25) were not met: $SNDFILE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SNDFILE_CFLAGS and SNDFILE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SNDFILE_CFLAGS and SNDFILE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTW" >&5 $as_echo_n "checking for FFTW... " >&6; } if test -n "$FFTW_CFLAGS"; then pkg_cv_FFTW_CFLAGS="$FFTW_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.3.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.3.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTW_CFLAGS=`$PKG_CONFIG --cflags "fftw3 >= 3.3.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FFTW_LIBS"; then pkg_cv_FFTW_LIBS="$FFTW_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3 >= 3.3.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3 >= 3.3.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTW_LIBS=`$PKG_CONFIG --libs "fftw3 >= 3.3.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTW_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fftw3 >= 3.3.4" 2>&1` else FFTW_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fftw3 >= 3.3.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FFTW_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (fftw3 >= 3.3.4) were not met: $FFTW_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FFTW_CFLAGS and FFTW_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FFTW_CFLAGS and FFTW_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FFTW_CFLAGS=$pkg_cv_FFTW_CFLAGS FFTW_LIBS=$pkg_cv_FFTW_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.56.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.56.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.56.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.56.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.56.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.56.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.56.0" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.56.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.56.0) were not met: $GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT" >&5 $as_echo_n "checking for GOBJECT... " >&6; } if test -n "$GOBJECT_CFLAGS"; then pkg_cv_GOBJECT_CFLAGS="$GOBJECT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GOBJECT_CFLAGS=`$PKG_CONFIG --cflags "gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GOBJECT_LIBS"; then pkg_cv_GOBJECT_LIBS="$GOBJECT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GOBJECT_LIBS=`$PKG_CONFIG --libs "gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GOBJECT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>&1` else GOBJECT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GOBJECT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gobject-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0) were not met: $GOBJECT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GOBJECT_CFLAGS and GOBJECT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GOBJECT_CFLAGS and GOBJECT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GOBJECT_CFLAGS=$pkg_cv_GOBJECT_CFLAGS GOBJECT_LIBS=$pkg_cv_GOBJECT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_GLIB_2_6 1" >>confdefs.h $as_echo "#define HAVE_GLIB_2_44 1" >>confdefs.h $as_echo "#define HAVE_GLIB_2_54 1" >>confdefs.h # Check whether --enable-introspection was given. if test "${enable_introspection+set}" = set; then : enableval=$enable_introspection; else enable_introspection=auto fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5 $as_echo_n "checking for gobject-introspection... " >&6; } case $enable_introspection in #( no) : found_introspection="no (disabled, use --enable-introspection to enable)" ;; #( yes) : if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : else as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5 fi if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.30.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.30.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then found_introspection=yes else as_fn_error $? "You need to have gobject-introspection >= 1.30.0 installed to build gsequencer" "$LINENO" 5 fi ;; #( auto) : if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.30.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.30.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then found_introspection=yes else found_introspection=no fi enable_introspection=$found_introspection ;; #( *) : as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5 $as_echo "$found_introspection" >&6; } INTROSPECTION_SCANNER= INTROSPECTION_COMPILER= INTROSPECTION_GENERATE= INTROSPECTION_GIRDIR= INTROSPECTION_TYPELIBDIR= if test "x$found_introspection" = "xyes"; then INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0` INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0` INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection fi if test "x$found_introspection" = "xyes"; then HAVE_INTROSPECTION_TRUE= HAVE_INTROSPECTION_FALSE='#' else HAVE_INTROSPECTION_TRUE='#' HAVE_INTROSPECTION_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO" >&5 $as_echo_n "checking for GIO... " >&6; } if test -n "$GIO_CFLAGS"; then pkg_cv_GIO_CFLAGS="$GIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_CFLAGS=`$PKG_CONFIG --cflags "gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GIO_LIBS"; then pkg_cv_GIO_LIBS="$GIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GIO_LIBS=`$PKG_CONFIG --libs "gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>&1` else GIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GIO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gio-2.0 >= 2.56.0 glib-2.0 >= 2.56.0 gmodule-2.0 >= 2.56.0 gthread-2.0 >= 2.56.0) were not met: $GIO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GIO_CFLAGS and GIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GIO_CFLAGS and GIO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GIO_CFLAGS=$pkg_cv_GIO_CFLAGS GIO_LIBS=$pkg_cv_GIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBSOUP" >&5 $as_echo_n "checking for LIBSOUP... " >&6; } if test -n "$LIBSOUP_CFLAGS"; then pkg_cv_LIBSOUP_CFLAGS="$LIBSOUP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.52.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.52.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSOUP_CFLAGS=`$PKG_CONFIG --cflags "libsoup-2.4 >= 2.52.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBSOUP_LIBS"; then pkg_cv_LIBSOUP_LIBS="$LIBSOUP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsoup-2.4 >= 2.52.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libsoup-2.4 >= 2.52.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBSOUP_LIBS=`$PKG_CONFIG --libs "libsoup-2.4 >= 2.52.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBSOUP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsoup-2.4 >= 2.52.0" 2>&1` else LIBSOUP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsoup-2.4 >= 2.52.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBSOUP_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libsoup-2.4 >= 2.52.0) were not met: $LIBSOUP_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBSOUP_CFLAGS and LIBSOUP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBSOUP_CFLAGS and LIBSOUP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBSOUP_CFLAGS=$pkg_cv_LIBSOUP_CFLAGS LIBSOUP_LIBS=$pkg_cv_LIBSOUP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define HAVE_ATK_2_12 1" >>confdefs.h if test "x$enable_public_libgsequencer" != xno; then : $as_echo "#define AGS_WITH_PUBLIC_LIBGSEQUENCER 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: public libgsequencer enabled" >&5 $as_echo "$as_me: public libgsequencer enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: public libgsequencer disabled" >&5 $as_echo "$as_me: public libgsequencer disabled" >&6;} fi if test "x$enable_public_libgsequencer" == xyes; then AGS_WITH_PUBLIC_LIBGSEQUENCER_TRUE= AGS_WITH_PUBLIC_LIBGSEQUENCER_FALSE='#' else AGS_WITH_PUBLIC_LIBGSEQUENCER_TRUE='#' AGS_WITH_PUBLIC_LIBGSEQUENCER_FALSE= fi if test "x$enable_upstream_gtk_doc" != xno; then : $as_echo "#define AGS_WITH_UPSTREAM_GTK_DOC 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: upstream API reference directory enabled" >&5 $as_echo "$as_me: upstream API reference directory enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: upstream API reference directory disabled" >&5 $as_echo "$as_me: upstream API reference directory disabled" >&6;} fi if test "x$enable_upstream_gtk_doc" == xyes; then AGS_WITH_UPSTREAM_GTK_DOC_TRUE= AGS_WITH_UPSTREAM_GTK_DOC_FALSE='#' else AGS_WITH_UPSTREAM_GTK_DOC_TRUE='#' AGS_WITH_UPSTREAM_GTK_DOC_FALSE= fi if test "x$enable_single_docdir" != xno; then : $as_echo "#define AGS_WITH_SINGLE_DOCDIR 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: single documentation directory enabled" >&5 $as_echo "$as_me: single documentation directory enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: single documentation directory disabled" >&5 $as_echo "$as_me: single documentation directory disabled" >&6;} fi if test "x$enable_single_docdir" == xyes; then AGS_WITH_SINGLE_DOCDIR_TRUE= AGS_WITH_SINGLE_DOCDIR_FALSE='#' else AGS_WITH_SINGLE_DOCDIR_TRUE='#' AGS_WITH_SINGLE_DOCDIR_FALSE= fi if test "x$enable_libinstpatch" != xno; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBINSTPATCH" >&5 $as_echo_n "checking for LIBINSTPATCH... " >&6; } if test -n "$LIBINSTPATCH_CFLAGS"; then pkg_cv_LIBINSTPATCH_CFLAGS="$LIBINSTPATCH_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libinstpatch-1.0 >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libinstpatch-1.0 >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBINSTPATCH_CFLAGS=`$PKG_CONFIG --cflags "libinstpatch-1.0 >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBINSTPATCH_LIBS"; then pkg_cv_LIBINSTPATCH_LIBS="$LIBINSTPATCH_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libinstpatch-1.0 >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libinstpatch-1.0 >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBINSTPATCH_LIBS=`$PKG_CONFIG --libs "libinstpatch-1.0 >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBINSTPATCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libinstpatch-1.0 >= 1.0" 2>&1` else LIBINSTPATCH_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libinstpatch-1.0 >= 1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBINSTPATCH_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libinstpatch-1.0 >= 1.0) were not met: $LIBINSTPATCH_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBINSTPATCH_CFLAGS and LIBINSTPATCH_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables LIBINSTPATCH_CFLAGS and LIBINSTPATCH_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else LIBINSTPATCH_CFLAGS=$pkg_cv_LIBINSTPATCH_CFLAGS LIBINSTPATCH_LIBS=$pkg_cv_LIBINSTPATCH_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi $as_echo "#define AGS_WITH_LIBINSTPATCH 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: libinstpatch disabled" >&5 $as_echo "$as_me: libinstpatch disabled" >&6;} fi if test "x$enable_libinstpatch" == xyes; then WITH_LIBINSTPATCH_TRUE= WITH_LIBINSTPATCH_FALSE='#' else WITH_LIBINSTPATCH_TRUE='#' WITH_LIBINSTPATCH_FALSE= fi if test "x$enable_vst3" != xno; then : $as_echo "#define AGS_WITH_VST3 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: VST3 enabled" >&5 $as_echo "$as_me: VST3 enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: VST3 disabled" >&5 $as_echo "$as_me: VST3 disabled" >&6;} fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 $as_echo_n "checking for CAIRO... " >&6; } if test -n "$CAIRO_CFLAGS"; then pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.12.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo >= 1.12.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo >= 1.12.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$CAIRO_LIBS"; then pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo >= 1.12.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo >= 1.12.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo >= 1.12.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo >= 1.12.0" 2>&1` else CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo >= 1.12.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (cairo >= 1.12.0) were not met: $CAIRO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables CAIRO_CFLAGS and CAIRO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables CAIRO_CFLAGS and CAIRO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS CAIRO_LIBS=$pkg_cv_CAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.18.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.18.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.18.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.18.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.18.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.18.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-3.0 >= 3.18.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.18.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-3.0 >= 3.18.0) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi if test "x$enable_w32api" != xyes; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WEBKITGTK" >&5 $as_echo_n "checking for WEBKITGTK... " >&6; } if test -n "$WEBKITGTK_CFLAGS"; then pkg_cv_WEBKITGTK_CFLAGS="$WEBKITGTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"webkit2gtk-4.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "webkit2gtk-4.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WEBKITGTK_CFLAGS=`$PKG_CONFIG --cflags "webkit2gtk-4.0 >= 2.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$WEBKITGTK_LIBS"; then pkg_cv_WEBKITGTK_LIBS="$WEBKITGTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"webkit2gtk-4.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "webkit2gtk-4.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WEBKITGTK_LIBS=`$PKG_CONFIG --libs "webkit2gtk-4.0 >= 2.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then WEBKITGTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "webkit2gtk-4.0 >= 2.10.0" 2>&1` else WEBKITGTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "webkit2gtk-4.0 >= 2.10.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$WEBKITGTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (webkit2gtk-4.0 >= 2.10.0) were not met: $WEBKITGTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables WEBKITGTK_CFLAGS and WEBKITGTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables WEBKITGTK_CFLAGS and WEBKITGTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else WEBKITGTK_CFLAGS=$pkg_cv_WEBKITGTK_CFLAGS WEBKITGTK_LIBS=$pkg_cv_WEBKITGTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "x$enable_run_functional_tests" == xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: run functional tests enabled" >&5 $as_echo "$as_me: run functional tests enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: run functional tests disabled" >&5 $as_echo "$as_me: run functional tests disabled" >&6;} fi if test "x$enable_run_functional_tests" == xyes; then RUN_FUNCTIONAL_TESTS_TRUE= RUN_FUNCTIONAL_TESTS_FALSE='#' else RUN_FUNCTIONAL_TESTS_TRUE='#' RUN_FUNCTIONAL_TESTS_FALSE= fi if test "x$enable_fast_test_mode" == xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: fast test mode enabled" >&5 $as_echo "$as_me: fast test mode enabled" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: fast test mode disabled" >&5 $as_echo "$as_me: fast test mode disabled" >&6;} fi if test "x$enable_fast_test_mode" == xyes; then FAST_TEST_MODE_TRUE= FAST_TEST_MODE_FALSE='#' else FAST_TEST_MODE_TRUE='#' FAST_TEST_MODE_FALSE= fi # Checks for library functions. for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); free (data); free (data3); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_func in __argz_count __argz_next __argz_stringify atexit clock_gettime floor memmove memset pow putenv realpath regcomp setlocale sqrt strchr strdup strerror strrchr strstr strtoul do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done build_gnu=no build_linux=no build_windows=no build_mac=no build_freebsd=no # Detect the target system case "${host_os}" in gnu*) build_gnu=yes ;; linux*) build_linux=yes ;; freebsd*) build_freebsd=yes ;; cygwin*|mingw*) build_windows=yes ;; darwin*) build_mac=yes ;; *) as_fn_error $? "\"OS $host_os is not supported\"" "$LINENO" 5 ;; esac # Pass the conditionals to automake if test "$build_gnu" = "yes"; then GNU_TRUE= GNU_FALSE='#' else GNU_TRUE='#' GNU_FALSE= fi if test "$build_linux" = "yes"; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi if test "$build_freebsd" = "yes"; then FREEBSD_TRUE= FREEBSD_FALSE='#' else FREEBSD_TRUE='#' FREEBSD_FALSE= fi if test "$build_windows" = "yes"; then WINDOWS_TRUE= WINDOWS_FALSE='#' else WINDOWS_TRUE='#' WINDOWS_FALSE= fi if test "$build_mac" = "yes"; then OSX_TRUE= OSX_FALSE='#' else OSX_TRUE='#' OSX_FALSE= fi # check for gtk-doc gtk_doc_requires="gtk-doc >= 1.14" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gtk-doc" >&5 $as_echo_n "checking for gtk-doc... " >&6; } if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$gtk_doc_requires\""; } >&5 ($PKG_CONFIG --exists --print-errors "$gtk_doc_requires") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then have_gtk_doc=yes else have_gtk_doc=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gtk_doc" >&5 $as_echo "$have_gtk_doc" >&6; } if test "$have_gtk_doc" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You will not be able to create source packages with 'make dist' because $gtk_doc_requires is not found." >&5 $as_echo "$as_me: WARNING: You will not be able to create source packages with 'make dist' because $gtk_doc_requires is not found." >&2;} fi # Extract the first word of "gtkdoc-check", so it can be a program name with args. set dummy gtkdoc-check; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GTKDOC_CHECK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GTKDOC_CHECK"; then ac_cv_prog_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GTKDOC_CHECK="gtkdoc-check.test" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GTKDOC_CHECK=$ac_cv_prog_GTKDOC_CHECK if test -n "$GTKDOC_CHECK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5 $as_echo "$GTKDOC_CHECK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gtkdoc-check", so it can be a program name with args. set dummy gtkdoc-check; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_CHECK_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_CHECK_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_CHECK_PATH="$GTKDOC_CHECK_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_CHECK_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_CHECK_PATH=$ac_cv_path_GTKDOC_CHECK_PATH if test -n "$GTKDOC_CHECK_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK_PATH" >&5 $as_echo "$GTKDOC_CHECK_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in gtkdoc-rebase do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_REBASE+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_REBASE in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE if test -n "$GTKDOC_REBASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5 $as_echo "$GTKDOC_REBASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GTKDOC_REBASE" && break done test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true" # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args. set dummy gtkdoc-mkpdf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GTKDOC_MKPDF+:} false; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_MKPDF in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF if test -n "$GTKDOC_MKPDF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5 $as_echo "$GTKDOC_MKPDF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; else with_html_dir='${datadir}/gtk-doc/html' fi HTML_DIR="$with_html_dir" # Check whether --enable-gtk-doc was given. if test "${enable_gtk_doc+set}" = set; then : enableval=$enable_gtk_doc; else enable_gtk_doc=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5 $as_echo_n "checking whether to build gtk-doc documentation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5 $as_echo "$enable_gtk_doc" >&6; } if test "x$enable_gtk_doc" = "xyes" && test "$have_gtk_doc" = "no"; then as_fn_error $? " You must have $gtk_doc_requires installed to build documentation for $PACKAGE_NAME. Please install gtk-doc or disable building the documentation by adding '--disable-gtk-doc' to '$0'." "$LINENO" 5 fi if test "x$PACKAGE_NAME" != "xglib"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5 $as_echo_n "checking for GTKDOC_DEPS... " >&6; } if test -n "$GTKDOC_DEPS_CFLAGS"; then pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKDOC_DEPS_LIBS"; then pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` else GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 : elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : else GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi # Check whether --enable-gtk-doc-html was given. if test "${enable_gtk_doc_html+set}" = set; then : enableval=$enable_gtk_doc_html; else enable_gtk_doc_html=yes fi # Check whether --enable-gtk-doc-pdf was given. if test "${enable_gtk_doc_pdf+set}" = set; then : enableval=$enable_gtk_doc_pdf; else enable_gtk_doc_pdf=no fi if test -z "$GTKDOC_MKPDF"; then enable_gtk_doc_pdf=no fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi if test x$have_gtk_doc = xyes; then HAVE_GTK_DOC_TRUE= HAVE_GTK_DOC_FALSE='#' else HAVE_GTK_DOC_TRUE='#' HAVE_GTK_DOC_FALSE= fi if test x$enable_gtk_doc = xyes; then ENABLE_GTK_DOC_TRUE= ENABLE_GTK_DOC_FALSE='#' else ENABLE_GTK_DOC_TRUE='#' ENABLE_GTK_DOC_FALSE= fi if test x$enable_gtk_doc_html = xyes; then GTK_DOC_BUILD_HTML_TRUE= GTK_DOC_BUILD_HTML_FALSE='#' else GTK_DOC_BUILD_HTML_TRUE='#' GTK_DOC_BUILD_HTML_FALSE= fi if test x$enable_gtk_doc_pdf = xyes; then GTK_DOC_BUILD_PDF_TRUE= GTK_DOC_BUILD_PDF_FALSE='#' else GTK_DOC_BUILD_PDF_TRUE='#' GTK_DOC_BUILD_PDF_FALSE= fi if test -n "$LIBTOOL"; then GTK_DOC_USE_LIBTOOL_TRUE= GTK_DOC_USE_LIBTOOL_FALSE='#' else GTK_DOC_USE_LIBTOOL_TRUE='#' GTK_DOC_USE_LIBTOOL_FALSE= fi if test -n "$GTKDOC_REBASE"; then GTK_DOC_USE_REBASE_TRUE= GTK_DOC_USE_REBASE_FALSE='#' else GTK_DOC_USE_REBASE_TRUE='#' GTK_DOC_USE_REBASE_FALSE= fi if test "x$enable_run_system_tests" == xyes; then WITH_SYSTEM_TESTS_TRUE= WITH_SYSTEM_TESTS_FALSE='#' else WITH_SYSTEM_TESTS_TRUE='#' WITH_SYSTEM_TESTS_FALSE= fi if test "x$enable_vst3" == xyes; then WITH_VST3_TRUE= WITH_VST3_FALSE='#' else WITH_VST3_TRUE='#' WITH_VST3_FALSE= fi if test "x$enable_experimental" == xyes; then WITH_EXPERIMENTAL_TRUE= WITH_EXPERIMENTAL_FALSE='#' else WITH_EXPERIMENTAL_TRUE='#' WITH_EXPERIMENTAL_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: generating libags.sym" >&5 $as_echo "$as_me: generating libags.sym" >&6;} `tail -n +19 $srcdir/libags.sym.in > $PWD/libags.sym` { $as_echo "$as_me:${as_lineno-$LINENO}: generating libags_thread.sym" >&5 $as_echo "$as_me: generating libags_thread.sym" >&6;} `tail -n +19 $srcdir/libags_thread.sym.in > $PWD/libags_thread.sym` { $as_echo "$as_me:${as_lineno-$LINENO}: generating libags_server.sym" >&5 $as_echo "$as_me: generating libags_server.sym" >&6;} `tail -n +19 $srcdir/libags_server.sym.in > $PWD/libags_server.sym` { $as_echo "$as_me:${as_lineno-$LINENO}: generating libags_audio.sym" >&5 $as_echo "$as_me: generating libags_audio.sym" >&6;} `tail -n +19 $srcdir/libags_audio.sym.in > $PWD/libags_audio.sym` { $as_echo "$as_me:${as_lineno-$LINENO}: generating libags_gui.sym" >&5 $as_echo "$as_me: generating libags_gui.sym" >&6;} `tail -n +19 $srcdir/libags_gui.sym.in > $PWD/libags_gui.sym` { $as_echo "$as_me:${as_lineno-$LINENO}: generating ags/object/ags_marshallers.list" >&5 $as_echo "$as_me: generating ags/object/ags_marshallers.list" >&6;} `mkdir -p ags/object/` `tail -n +19 $srcdir/ags/object/ags_marshallers.list.in > ags/object/ags_marshallers.list` { $as_echo "$as_me:${as_lineno-$LINENO}: generating ags/widget/ags_widget_marshallers.list" >&5 $as_echo "$as_me: generating ags/widget/ags_widget_marshallers.list" >&6;} `mkdir -p ags/widget/` `tail -n +19 $srcdir/ags/widget/ags_widget_marshallers.list.in > ags/widget/ags_widget_marshallers.list` { $as_echo "$as_me:${as_lineno-$LINENO}: generating docs/listings/*" >&5 $as_echo "$as_me: generating docs/listings/*" >&6;} `mkdir -p docs/listings/` `tail -n +10 $srcdir/docs/listings/add_pattern.c.in > docs/listings/add_pattern.c` `tail -n +10 $srcdir/docs/listings/application_mutex.c.in > docs/listings/application_mutex.c` `tail -n +10 $srcdir/docs/listings/audio.c.in > docs/listings/audio.c` `tail -n +10 $srcdir/docs/listings/audio_application_context.c.in > docs/listings/audio_application_context.c` `tail -n +10 $srcdir/docs/listings/complete_example.c.in > docs/listings/complete_example.c` `tail -n +10 $srcdir/docs/listings/config.c.in > docs/listings/config.c` `tail -n +10 $srcdir/docs/listings/effects_echo_audio.c.in > docs/listings/effects_echo_audio.c` `tail -n +10 $srcdir/docs/listings/effects_echo_audio_run.c.in > docs/listings/effects_echo_audio_run.c` `tail -n +10 $srcdir/docs/listings/effects_echo_channel.c.in > docs/listings/effects_echo_channel.c` `tail -n +10 $srcdir/docs/listings/effects_echo_channel_run.c.in > docs/listings/effects_echo_channel_run.c` `tail -n +10 $srcdir/docs/listings/effects_recall_container.c.in > docs/listings/effects_recall_container.c` `tail -n +10 $srcdir/docs/listings/file_property.c.in > docs/listings/file_property.c` `tail -n +10 $srcdir/docs/listings/file_read.c.in > docs/listings/file_read.c` `tail -n +10 $srcdir/docs/listings/file_write.c.in > docs/listings/file_write.c` `tail -n +10 $srcdir/docs/listings/linking_prerequisites.c.in > docs/listings/linking_prerequisites.c` `tail -n +10 $srcdir/docs/listings/linking_safe.c.in > docs/listings/linking_safe.c` `tail -n +10 $srcdir/docs/listings/linking_unsafe.c.in > docs/listings/linking_unsafe.c` `tail -n +10 $srcdir/docs/listings/notation_clipboard.c.in > docs/listings/notation_clipboard.c` `tail -n +10 $srcdir/docs/listings/pcm_info.c.in > docs/listings/pcm_info.c` `tail -n +10 $srcdir/docs/listings/port.c.in > docs/listings/port.c` `tail -n +10 $srcdir/docs/listings/pull_thread.c.in > docs/listings/pull_thread.c` `tail -n +10 $srcdir/docs/listings/recycling.c.in > docs/listings/recycling.c` `tail -n +10 $srcdir/docs/listings/start_thread.c.in > docs/listings/start_thread.c` `tail -n +10 $srcdir/docs/listings/thread_application_context.c.in > docs/listings/thread_application_context.c` `tail -n +10 $srcdir/docs/listings/thread_obj_mutex.c.in > docs/listings/thread_obj_mutex.c` { $as_echo "$as_me:${as_lineno-$LINENO}: generating resources for API Reference Manual" >&5 $as_echo "$as_me: generating resources for API Reference Manual" >&6;} `mkdir -p docs/reference/libags` `tail -n +19 $srcdir/docs/reference/libags/libags-sections.txt.in > docs/reference/libags/libags-sections.txt` `tail -n +19 $srcdir/docs/reference/libags/libags.types.in > docs/reference/libags/libags.types` `tail -n +19 $srcdir/docs/reference/libags/libags.interfaces.in > docs/reference/libags/libags.interfaces` `mkdir -p docs/reference/libags-audio` `tail -n +19 $srcdir/docs/reference/libags-audio/libags_audio-sections.txt.in > docs/reference/libags-audio/libags_audio-sections.txt` `tail -n +19 $srcdir/docs/reference/libags-audio/libags_audio.types.in > docs/reference/libags-audio/libags_audio.types` `tail -n +19 $srcdir/docs/reference/libags-audio/libags_audio.interfaces.in > docs/reference/libags-audio/libags_audio.interfaces` `mkdir -p docs/reference/libags-gui` `tail -n +19 $srcdir/docs/reference/libags-gui/libags_gui-sections.txt.in > docs/reference/libags-gui/libags_gui-sections.txt` `tail -n +19 $srcdir/docs/reference/libags-gui/libags_gui.types.in > docs/reference/libags-gui/libags_gui.types` `tail -n +19 $srcdir/docs/reference/libags-gui/libags_gui.interfaces.in > docs/reference/libags-gui/libags_gui.interfaces` `mkdir -p docs/reference/libgsequencer` `tail -n +19 $srcdir/docs/reference/libgsequencer/libgsequencer-sections.txt.in > docs/reference/libgsequencer/libgsequencer-sections.txt` `tail -n +19 $srcdir/docs/reference/libgsequencer/libgsequencer.types.in > docs/reference/libgsequencer/libgsequencer.types` `tail -n +19 $srcdir/docs/reference/libgsequencer/libgsequencer.interfaces.in > docs/reference/libgsequencer/libgsequencer.interfaces` if test "x$HTMLHELP_XSL" != x; then : HTMLHELP_XSL=$HTMLHELP_XSL { $as_echo "$as_me:${as_lineno-$LINENO}: HTMLHELP_XSL = $HTMLHELP_XSL" >&5 $as_echo "$as_me: HTMLHELP_XSL = $HTMLHELP_XSL" >&6;} else HTMLHELP_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl/htmlhelp/htmlhelp.xsl { $as_echo "$as_me:${as_lineno-$LINENO}: HTMLHELP_XSL = $HTMLHELP_XSL" >&5 $as_echo "$as_me: HTMLHELP_XSL = $HTMLHELP_XSL" >&6;} fi if test "x$enable_upstream_gtk_doc" != xno; then : if test "x$GOBJECT_API_DOC" != x; then : GOBJECT_API_DOC=$GOBJECT_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&5 $as_echo "$as_me: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&6;} else GOBJECT_API_DOC='\/usr\/share\/doc\/libglib2.0-doc\/gobject' { $as_echo "$as_me:${as_lineno-$LINENO}: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&5 $as_echo "$as_me: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&6;} fi if test "x$GTK_API_DOC" != x; then : GTK_API_DOC=$GTK_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: GTK_API_DOC = $GTK_API_DOC" >&5 $as_echo "$as_me: GTK_API_DOC = $GTK_API_DOC" >&6;} else GTK_API_DOC='\/usr\/share\/doc\/libgtk-3-doc\/gtk3' { $as_echo "$as_me:${as_lineno-$LINENO}: GTK_API_DOC = $GTK_API_DOC" >&5 $as_echo "$as_me: GTK_API_DOC = $GTK_API_DOC" >&6;} fi if test "x$LIBAGS_API_DOC" != x; then : LIBAGS_API_DOC=$LIBAGS_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&5 $as_echo "$as_me: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&6;} else LIBAGS_API_DOC='\/usr\/share\/doc\/libags-doc\/api' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&5 $as_echo "$as_me: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&6;} fi if test "x$LIBAGS_AUDIO_API_DOC" != x; then : LIBAGS_AUDIO_API_DOC=$LIBAGS_AUDIO_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&6;} else LIBAGS_AUDIO_API_DOC='\/usr\/share\/doc\/libags-audio-doc\/api' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&6;} fi if test "x$LIBAGS_GUI_API_DOC" != x; then : LIBAGS_GUI_API_DOC=$LIBAGS_GUI_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&6;} else LIBAGS_GUI_API_DOC='\/usr\/share\/doc\/libags-gui-doc\/api' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&6;} fi if test "x$LIBGSEQUENCER_API_DOC" != x; then : LIBGSEQUENCER_API_DOC=$LIBGSEQUENCER_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&6;} else LIBGSEQUENCER_API_DOC='\/usr\/share\/doc\/libgsequencer-doc\/api' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&6;} fi if test "x$LIBAGS_API_DIR" != x; then : LIBAGS_API_DIR=$LIBAGS_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&5 $as_echo "$as_me: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&6;} else LIBAGS_API_DIR=$datadir/doc/libags-doc/api { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&5 $as_echo "$as_me: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&6;} fi if test "x$LIBAGS_AUDIO_API_DIR" != x; then : LIBAGS_AUDIO_API_DIR=$LIBAGS_AUDIO_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&6;} else LIBAGS_AUDIO_API_DIR=$datadir/doc/libags-audio-doc/api { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&6;} fi if test "x$LIBAGS_GUI_API_DIR" != x; then : LIBAGS_GUI_API_DIR=$LIBAGS_GUI_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&6;} else LIBAGS_GUI_API_DIR=$datadir/doc/libags-gui-doc/api { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&6;} fi if test "x$LIBGSEQUENCER_API_DIR" != x; then : LIBGSEQUENCER_API_DIR=$LIBGSEQUENCER_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&6;} else LIBGSEQUENCER_API_DIR=$datadir/doc/libgsequencer-doc/api { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&6;} fi else if test "x$GOBJECT_API_DOC" != x; then : GOBJECT_API_DOC=$GOBJECT_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&5 $as_echo "$as_me: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&6;} else GOBJECT_API_DOC='\.\.\/gobject' { $as_echo "$as_me:${as_lineno-$LINENO}: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&5 $as_echo "$as_me: GOBJECT_API_DOC = $GOBJECT_API_DOC" >&6;} fi if test "x$GTK_API_DOC" != x; then : GTK_API_DOC=$GTK_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: GTK_API_DOC = $GTK_API_DOC" >&5 $as_echo "$as_me: GTK_API_DOC = $GTK_API_DOC" >&6;} else GTK_API_DOC='\.\.\/gtk3' { $as_echo "$as_me:${as_lineno-$LINENO}: GTK_API_DOC = $GTK_API_DOC" >&5 $as_echo "$as_me: GTK_API_DOC = $GTK_API_DOC" >&6;} fi if test "x$LIBAGS_API_DOC" != x; then : LIBAGS_API_DOC=$LIBAGS_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&5 $as_echo "$as_me: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&6;} else LIBAGS_API_DOC='\.\.\/libags' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&5 $as_echo "$as_me: LIBAGS_API_DOC = $LIBAGS_API_DOC" >&6;} fi if test "x$LIBAGS_AUDIO_API_DOC" != x; then : LIBAGS_AUDIO_API_DOC=$LIBAGS_AUDIO_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&6;} else LIBAGS_AUDIO_API_DOC='\.\.\/libags_audio' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DOC = $LIBAGS_AUDIO_API_DOC" >&6;} fi if test "x$LIBAGS_GUI_API_DOC" != x; then : LIBAGS_GUI_API_DOC=$LIBAGS_GUI_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&6;} else LIBAGS_GUI_API_DOC='\.\.\/libags_gui' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DOC = $LIBAGS_GUI_API_DOC" >&6;} fi if test "x$LIBGSEQUENCER_API_DOC" != x; then : LIBGSEQUENCER_API_DOC=$LIBGSEQUENCER_API_DOC { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&6;} else LIBGSEQUENCER_API_DOC='\.\.\/libgsequencer' { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DOC = $LIBGSEQUENCER_API_DOC" >&6;} fi if test "x$LIBAGS_API_DIR" != x; then : LIBAGS_API_DIR=$LIBAGS_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&5 $as_echo "$as_me: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&6;} else LIBAGS_API_DIR=$datadir/gtk-doc/html/libags { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&5 $as_echo "$as_me: LIBAGS_API_DIR = $LIBAGS_API_DIR" >&6;} fi if test "x$LIBAGS_AUDIO_API_DIR" != x; then : LIBAGS_AUDIO_API_DIR=$LIBAGS_AUDIO_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&6;} else LIBAGS_AUDIO_API_DIR=$datadir/gtk-doc/html/libags_audio { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&5 $as_echo "$as_me: LIBAGS_AUDIO_API_DIR = $LIBAGS_AUDIO_API_DIR" >&6;} fi if test "x$LIBAGS_GUI_API_DIR" != x; then : LIBAGS_GUI_API_DIR=$LIBAGS_GUI_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&6;} else LIBAGS_GUI_API_DIR=$datadir/gtk-doc/html/libags_gui { $as_echo "$as_me:${as_lineno-$LINENO}: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&5 $as_echo "$as_me: LIBAGS_GUI_API_DIR = $LIBAGS_GUI_API_DIR" >&6;} fi if test "x$LIBGSEQUENCER_API_DIR" != x; then : LIBGSEQUENCER_API_DIR=$LIBGSEQUENCER_API_DIR { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&6;} else LIBGSEQUENCER_API_DIR=$datadir/gtk-doc/html/libgsequencer { $as_echo "$as_me:${as_lineno-$LINENO}: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&5 $as_echo "$as_me: LIBGSEQUENCER_API_DIR = $LIBGSEQUENCER_API_DIR" >&6;} fi fi #AS_IF([test "x$enable_w32api" != xno], # [gl_INIT]) ac_config_files="$ac_config_files Makefile unit-system-tests.mk functional-system-tests.mk docs/reference/libags/Makefile docs/reference/libags-audio/Makefile docs/reference/libags-gui/Makefile docs/reference/libgsequencer/Makefile m4/Makefile po/Makefile.in libags.pc libags_audio.pc libags_gui.pc libgsequencer.pc" #AM_COND_IF([WITH_W32API], # [AC_CONFIG_FILES([lib/Makefile])]) cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_W32API_TRUE}" && test -z "${WITH_W32API_FALSE}"; then as_fn_error $? "conditional \"WITH_W32API\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_OSXAPI_TRUE}" && test -z "${WITH_OSXAPI_FALSE}"; then as_fn_error $? "conditional \"WITH_OSXAPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AGS_WITH_PUBLIC_LIBGSEQUENCER_TRUE}" && test -z "${AGS_WITH_PUBLIC_LIBGSEQUENCER_FALSE}"; then as_fn_error $? "conditional \"AGS_WITH_PUBLIC_LIBGSEQUENCER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AGS_WITH_UPSTREAM_GTK_DOC_TRUE}" && test -z "${AGS_WITH_UPSTREAM_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"AGS_WITH_UPSTREAM_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AGS_WITH_SINGLE_DOCDIR_TRUE}" && test -z "${AGS_WITH_SINGLE_DOCDIR_FALSE}"; then as_fn_error $? "conditional \"AGS_WITH_SINGLE_DOCDIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_LIBINSTPATCH_TRUE}" && test -z "${WITH_LIBINSTPATCH_FALSE}"; then as_fn_error $? "conditional \"WITH_LIBINSTPATCH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RUN_FUNCTIONAL_TESTS_TRUE}" && test -z "${RUN_FUNCTIONAL_TESTS_FALSE}"; then as_fn_error $? "conditional \"RUN_FUNCTIONAL_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FAST_TEST_MODE_TRUE}" && test -z "${FAST_TEST_MODE_FALSE}"; then as_fn_error $? "conditional \"FAST_TEST_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GNU_TRUE}" && test -z "${GNU_FALSE}"; then as_fn_error $? "conditional \"GNU\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FREEBSD_TRUE}" && test -z "${FREEBSD_FALSE}"; then as_fn_error $? "conditional \"FREEBSD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WINDOWS_TRUE}" && test -z "${WINDOWS_FALSE}"; then as_fn_error $? "conditional \"WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OSX_TRUE}" && test -z "${OSX_FALSE}"; then as_fn_error $? "conditional \"OSX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GTK_DOC_TRUE}" && test -z "${HAVE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"HAVE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_SYSTEM_TESTS_TRUE}" && test -z "${WITH_SYSTEM_TESTS_FALSE}"; then as_fn_error $? "conditional \"WITH_SYSTEM_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_VST3_TRUE}" && test -z "${WITH_VST3_FALSE}"; then as_fn_error $? "conditional \"WITH_VST3\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_EXPERIMENTAL_TRUE}" && test -z "${WITH_EXPERIMENTAL_FALSE}"; then as_fn_error $? "conditional \"WITH_EXPERIMENTAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gsequencer $as_me 3.1.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gsequencer config.status 3.1.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "ags/config.h") CONFIG_HEADERS="$CONFIG_HEADERS ags/config.h" ;; "ags/ags_config.h") CONFIG_HEADERS="$CONFIG_HEADERS ags/ags_config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "unit-system-tests.mk") CONFIG_FILES="$CONFIG_FILES unit-system-tests.mk" ;; "functional-system-tests.mk") CONFIG_FILES="$CONFIG_FILES functional-system-tests.mk" ;; "docs/reference/libags/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libags/Makefile" ;; "docs/reference/libags-audio/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libags-audio/Makefile" ;; "docs/reference/libags-gui/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libags-gui/Makefile" ;; "docs/reference/libgsequencer/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libgsequencer/Makefile" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "libags.pc") CONFIG_FILES="$CONFIG_FILES libags.pc" ;; "libags_audio.pc") CONFIG_FILES="$CONFIG_FILES libags_audio.pc" ;; "libags_gui.pc") CONFIG_FILES="$CONFIG_FILES libags_gui.pc" ;; "libgsequencer.pc") CONFIG_FILES="$CONFIG_FILES libgsequencer.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi